diff --git a/.dockerignore b/.dockerignore index 400701794cf0e..f7cf8d129fc46 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,30 +1,27 @@ -.dockerignore -.editorconfig -.travis.yml -GPLv3.txt -LICENSE -README.md -TGS3.json -.github -.gitignore -.gitattributes -.git/hooks -.git/info -.git/modules -.git/objects -.git/refs -.vs* -cfg -data -SQL -tgui/node_modules -tgstation.dmb -tgstation.int -tgstation.rsc -tgstation.lk -tgstation.dyn.rsc -libmariadb.dll -rust_g.dll -BSQL.dll -appveyor.yml -Dockerfile +.dockerignore +.editorconfig +GPLv3.txt +LICENSE +README.md +TGS3.json +.github +.gitignore +.gitattributes +.git/hooks +.git/info +.git/modules +.git/objects +.git/refs +.vs* +cfg +data +SQL +tgui/node_modules +tgstation.dmb +tgstation.int +tgstation.rsc +tgstation.lk +tgstation.dyn.rsc +*.dll +Dockerfile +tools/bootstrap/.cache diff --git a/.editorconfig b/.editorconfig index 95e40c0cd3c47..be7033ee79311 100644 --- a/.editorconfig +++ b/.editorconfig @@ -15,3 +15,6 @@ indent_style = space [/tgui/**/*.{js,styl,ract,json,html}] indent_style = space indent_size = 2 + +[Dockerfile] +indent_style = space diff --git a/.gitattributes b/.gitattributes index cbfcb9e2c88dc..655894289ad9a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,15 +1,50 @@ #Normalize files * text=auto -*.sh text eol=lf + +## Enforce text mode and LF line breaks +*.bat text eol=lf +*.cjs text eol=lf +*.css text eol=lf *.dm text eol=lf *.dme text eol=lf +*.dmf text eol=lf +*.htm text eol=lf +*.html text eol=lf +*.js text eol=lf +*.json text eol=lf +*.jsx text eol=lf +*.md text eol=lf +*.ps1 text eol=lf +*.py text eol=lf +*.scss text eol=lf +*.sh text eol=lf +*.sql text eol=lf +*.svg text eol=lf +*.ts text eol=lf +*.tsx text eol=lf +*.txt text eol=lf +*.yaml text eol=lf +*.yml text eol=lf + +## Enforce binary mode +*.bmp binary +*.dll binary +*.dmb binary +*.exe binary +*.gif binary +*.jpg binary +*.png binary +*.so binary # merger hooks, run tools/hooks/install.bat or install.sh to set up *.dmm merge=dmm *.dmi merge=dmi # exlude maps from contribution count -*.dmm linguist-generated=true +*.dmm linguist-generated=true + +## Force tab indents on dm files +*.dm whitespace=indent-with-non-tab # force changelog merging to use union html/changelog.html merge=union diff --git a/.github/.github/autolabeler.yml b/.github/.github/autolabeler.yml deleted file mode 100644 index 75979e3f7af1d..0000000000000 --- a/.github/.github/autolabeler.yml +++ /dev/null @@ -1,6 +0,0 @@ -code: ["*.dm"] -mapping: ["*.dmm"] -config: ["config/*"] -tooling: ["tools/*"] -sql: ["*.sql"] -dme: ["*.dme"] diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1a82a97422d2d..b2b1baeba782e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -8,14 +8,11 @@ .dockerignore @crossedfall .github @crossedfall -.travis.yml @crossedfall -appveyor.yml @crossedfall +/code/_compile_options.dm @crossedfall /code/modules/tgs @crossedfall -/config @crossedfall dependencies.sh @crossedfall Dockerfile @crossedfall /SQL @crossedfall -TGS3.json @crossedfall /tools @crossedfall @@ -27,11 +24,6 @@ TGS3.json @crossedfall # powerfulbacon /code/game/machinery/shuttle @powerfulbacon -/code/modules/shuttle @powerfulbacon - -# zeskorion - -/code/__DEFINES/diseases.dm @zeskorion -/code/controllers/subsystem/disease.dm @zeskorion -/code/datums/diseases @zeskorion -/code/modules/antagonists/disease @zeskorion +/code/modules/shuttle/super_cruise @powerfulbacon +/code/modules/shuttle/shuttle_creation @powerfulbacon +/_maps/map_files/CorgStation @powerfulbacon diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 2d276fd2760f8..11745569b3290 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -97,7 +97,7 @@ Do not add any of the following in a Pull Request or risk getting the PR closed: - Any content that violates GitHub Terms of Service. - Racial or homophobic slurs of any kind. - National Socialist Party of Germany content, National Socialist Party of Germany related content, or National Socialist Party of Germany references -- Code adding, removing, or updating the availability of alien races/species/human mutants without prior approval. Pull requests attempting to add or remove features from said races/species/mutants require prior approval as well. +- Code adding, removing, or updating the availability of alien races/species/human mutants without prior Maintainer approval. Pull requests attempting to add or remove features from said races/species/mutants require prior approval as well. Just because something isn't on this list doesn't mean that it's acceptable. Use common sense above all else. diff --git a/.github/comment-agent.yml b/.github/comment-agent.yml new file mode 100644 index 0000000000000..e147d3bf0c496 --- /dev/null +++ b/.github/comment-agent.yml @@ -0,0 +1,15 @@ +# A mapping of keyword aliases to event type. Form of match:event type. +# Required. +aliasMappings: + "?rebuild tgui": "rebuild-tgui" + "?rebuild-tgui": "rebuild-tgui" + +# Determines if alias matching is case sensitive. +# Optional. Defaults to true. +caseSensitive: false + +# A mapping of event types to user group permissions. +# Form of event type:group name or combined names (Explained lower in the README). +# Optional, defaults to MEMBER for each. +permissionMappings: + "rebuild-tgui": [MEMBER, PRAUTHOR] diff --git a/.github/file_labeler.yml b/.github/file_labeler.yml new file mode 100644 index 0000000000000..a9afd6e3c5905 --- /dev/null +++ b/.github/file_labeler.yml @@ -0,0 +1,26 @@ +Administration: +- code/modules/admin/**/* + +Config Update: +- config/**/* + +GitHub: +- .github/**/* + +mapping: +- _maps/**/* + +sound: +- sound/**/* + +sprites: +- icons/**/*.dmi + +sql: +- SQL/**/*.sql + +tools: +- tools/**/* + +TGUI-Changes: +- tgui/**/* diff --git a/.github/workflows/compile_changelogs.yml b/.github/workflows/compile_changelogs.yml index 0e705866dd0ee..0155701ccca6b 100644 --- a/.github/workflows/compile_changelogs.yml +++ b/.github/workflows/compile_changelogs.yml @@ -2,12 +2,12 @@ name: Compile changelogs on: schedule: - - cron: "*/15 * * * *" + - cron: "0 * * * *" + workflow_dispatch: jobs: CompileCL: runs-on: ubuntu-latest - if: github.repository == 'BeeStation/BeeStation-Hornet' steps: - name: Checkout uses: actions/checkout@v1 @@ -16,11 +16,11 @@ jobs: - name: Python setup uses: actions/setup-python@v1 with: - python-version: '3.x' + python-version: "3.8" - name: Install depends run: | python -m pip install --upgrade pip - pip install pyyaml bs4 + pip install -r tools/changelog/requirements.txt - name: Compile CL run: python tools/changelog/ss13_genchangelog.py html/changelog.html html/changelogs - name: Commit diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml new file mode 100644 index 0000000000000..8c75f1d0ad475 --- /dev/null +++ b/.github/workflows/continuous_integration.yml @@ -0,0 +1,112 @@ +name: Run tests + +on: + workflow_dispatch: + push: + paths-ignore: + - 'html/changelogs/**' + - 'html/changelog.html' + branches: + - master + pull_request: + branches: + - master + +jobs: + run_linters: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup cache + id: cache-spacemandmm + uses: actions/cache@v2 + with: + path: ~/dreamchecker + key: ${{ runner.os }}-spacemandmm-cache-${{ hashFiles('dependencies.sh') }} + - name: Install SpacemanDMM + if: steps.cache-spacemandmm.outputs.cache-hit != 'true' + run: bash tools/ci/install_spaceman_dmm.sh dreamchecker + - name: Install Tools + run: | + pip3 install setuptools + bash tools/ci/install_node.sh + bash tools/ci/install_auxmos.sh + pip3 install -r tools/requirements.txt + - name: Run Linters + run: | + bash tools/ci/check_filedirs.sh beestation.dme + bash tools/ci/check_changelogs.sh + find . -name "*.php" -print0 | xargs -0 -n1 php -l + find . -name "*.json" -not -path "*/node_modules/*" -print0 | xargs -0 python3 ./tools/json_verifier.py + tgui/bin/tgui --lint + tgui/bin/tgui --test + bash tools/ci/check_grep.sh + tools/bootstrap/python -m dmi.test + tools/bootstrap/python -m mapmerge2.dmm_test + ~/dreamchecker + compile_all_maps: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup cache + id: cache-byond + uses: actions/cache@v2 + with: + path: ~/BYOND + key: ${{ runner.os }}-byond-cache-${{ hashFiles('Dockerfile') }} + - name: Install BYOND + if: steps.cache-byond.outputs.cache-hit != 'true' + run: bash tools/ci/install_byond.sh + - name: Compile All Maps + run: | + source $HOME/BYOND/byond/bin/byondsetup + python3 tools/ci/template_dm_generator.py + tools/build/build dm -DCIBUILDING -DCITESTING -DALL_MAPS + run_all_tests: + runs-on: ubuntu-latest + services: + mysql: + image: mysql:latest + env: + MYSQL_ROOT_PASSWORD: root + ports: + - 3306 + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + steps: + - uses: actions/checkout@v2 + - name: Setup cache + id: cache-byond + uses: actions/cache@v2 + with: + path: ~/BYOND + key: ${{ runner.os }}-byond-cache-${{ hashFiles('Dockerfile') }} + - name: Install BYOND + if: steps.cache-byond.outputs.cache-hit != 'true' + run: bash tools/ci/install_byond.sh + - name: Setup database + run: | + sudo systemctl start mysql + mysql -u root -proot -e 'CREATE DATABASE bee_ci;' + mysql -u root -proot bee_ci < SQL/beestation_schema.sql + - name: Install rust-g + run: | + sudo dpkg --add-architecture i386 + sudo apt update || true + sudo apt install libssl1.1:i386 + bash tools/ci/install_rust_g.sh + - name: Install auxmos + run: | + bash tools/ci/install_auxmos.sh + - name: Compile and run tests + run: | + source $HOME/BYOND/byond/bin/byondsetup + tools/build/build -DCIBUILDING + bash tools/ci/run_server.sh + test_windows: + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - name: Compile + run: pwsh tools/ci/build.ps1 + env: + DM_EXE: "C:\\byond\\bin\\dm.exe" diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 645bdf081fd3c..3fef279444ff3 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,17 +1,17 @@ name: Docker Image CI on: + workflow_dispatch: schedule: - cron: 0 0 * * * jobs: build: runs-on: ubuntu-latest - if: github.repository == 'BeeStation/BeeStation-Hornet' steps: - uses: actions/checkout@v2 - name: Publish to Registry - uses: elgohr/Publish-Docker-Github-Action@master + uses: elgohr/Publish-Docker-Github-Action@v5 with: name: beestation/beestation username: ${{ secrets.DOCKER_USERNAME }} diff --git a/.github/workflows/extra_pr_labels.yml b/.github/workflows/extra_pr_labels.yml new file mode 100644 index 0000000000000..f70ad1b27aa16 --- /dev/null +++ b/.github/workflows/extra_pr_labels.yml @@ -0,0 +1,25 @@ +name: Add Extra PR labels + +on: + push: + branches: + - master + pull_request_target: + +jobs: + Label: + runs-on: ubuntu-latest + steps: + - name: Check for conflicting PRs + uses: eps1lon/actions-label-merge-conflict@513a24fc7dca40990863be2935e059e650728400 + with: + dirtyLabel: "Merge Conflict" + repoToken: "${{ secrets.GITHUB_TOKEN }}" + commentOnDirty: "This pull request has conflicts, please resolve those before we can evaluate the pull request." + - name: Apply labels based on changed files + if: github.event_name != 'push' + uses: actions/labeler@main + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" + sync-labels: true + configuration-path: .github/file_labeler.yml diff --git a/.github/workflows/make_changelogs.yml b/.github/workflows/make_changelogs.yml index 62335b326ad51..e199e9a799874 100644 --- a/.github/workflows/make_changelogs.yml +++ b/.github/workflows/make_changelogs.yml @@ -2,12 +2,13 @@ name: Make changelogs on: push: - branches: [master] + branches: + - master jobs: MakeCL: runs-on: ubuntu-latest - if: github.repository == 'BeeStation/BeeStation-Hornet' && !contains(github.event.head_commit.message, '[ci skip]') + if: "!contains(github.event.head_commit.message, '[ci skip]')" steps: - name: Checkout uses: actions/checkout@v1 @@ -16,11 +17,11 @@ jobs: - name: Python setup uses: actions/setup-python@v1 with: - python-version: '3.x' + python-version: "3.8" - name: Install depends run: | python -m pip install --upgrade pip - pip install ruamel.yaml PyGithub + pip install -r tools/changelog/requirements.txt - name: Make CL env: #GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} Use this instead if you have unprotected branches diff --git a/.github/workflows/stale_issues.yml b/.github/workflows/stale_issues.yml index 78ee27a047b75..f4430cd337149 100644 --- a/.github/workflows/stale_issues.yml +++ b/.github/workflows/stale_issues.yml @@ -7,12 +7,11 @@ on: jobs: stale: runs-on: ubuntu-latest - if: github.repository == 'BeeStation/BeeStation-Hornet' steps: - uses: actions/stale@v1 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - stale-issue-message: "This issue has been inactive for long enough to be automatically marked as stale. If this was a bug report and hasn't been addressed yet, and is still a probelm, please don't hesitate to notify a maintainer." + stale-issue-message: "This issue has been inactive for long enough to be automatically marked as stale. If this was a bug report and hasn't been addressed yet, and is still a problem, please don't hesitate to notify a maintainer." stale-issue-label: 'Stale' exempt-issue-label: 'Triaged' days-before-stale: 30 diff --git a/.github/workflows/stale_prs.yml b/.github/workflows/stale_prs.yml index 0db9127623a77..6524f6ddcc5a9 100644 --- a/.github/workflows/stale_prs.yml +++ b/.github/workflows/stale_prs.yml @@ -7,7 +7,6 @@ on: jobs: stale: runs-on: ubuntu-latest - if: github.repository == 'BeeStation/BeeStation-Hornet' steps: - uses: actions/stale@v1 with: diff --git a/.github/workflows/tgui_recompile.yml b/.github/workflows/tgui_recompile.yml new file mode 100644 index 0000000000000..bbdcd9d325840 --- /dev/null +++ b/.github/workflows/tgui_recompile.yml @@ -0,0 +1,90 @@ +name: Rebuild TGUI + +on: + repository_dispatch: + types: [rebuild-tgui] + push: + branches: + - 'master' + paths: + - 'tgui/**.js' + - 'tgui/**.scss' + +# Config +env: + COMMIT_NAME: 'ss13-beebot' + COMMIT_EMAIL: '56381746+ss13-beebot@users.noreply.github.com' + DEFAULT_BRANCH: 'master' + TOKEN: '${{ secrets.CL_TOKEN }}' + +jobs: + ondemand_rebuild: + if: ${{ github.event_name == 'repository_dispatch' }} + name: On-Demand Rebuild + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + repository: ${{ github.event.client_payload.pr_head_full_repo_name }} + ref: ${{ github.event.client_payload.pr_head_ref }} + token: ${{ env.TOKEN }} + + - name: Setup Author + run: | + git config --local user.email "${{ env.COMMIT_EMAIL }}" + git config --local user.name "${{ env.COMMIT_NAME }}" + - name: Setup Node + uses: actions/setup-node@v1 + with: + node-version: '>=12.13' + + # This only runs if the PR has a merge conflict. Serves to attempt resolving merge conflicts rather than just rebuilding. + # Uses a smart little git hack to make a merge commit for just a limited set of files. + - name: Conflict Resolution + if: ${{ github.event.client_payload.mergeable == false }} + run: | + git remote add base https://github.com/${{ github.repository }}.git + git fetch base ${{ env.DEFAULT_BRANCH }} + git merge --squash -s ours --no-commit base/${{ env.DEFAULT_BRANCH }} + git checkout HEAD . + git clean -fxd + git checkout base/${{ env.DEFAULT_BRANCH }} tgui/public + git commit -m "TGUI Reset" -a || true + + - name: Build TGUI + run: bin/tgui + working-directory: ./tgui + + - name: Commit and Push Build + run: | + git commit -m "TGUI Rebuild" -a || true + git push + + auto_rebuild: + if: ${{ github.event_name == 'push' }} + name: Automatic Rebuild + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 25 + token: ${{ env.TOKEN }} + + - name: Setup Node + uses: actions/setup-node@v1 + with: + node-version: '>=12.13' + + - name: Build TGUI + run: bin/tgui + working-directory: ./tgui + + - name: Commit and Push Build + run: | + git config --local user.email "${{ env.COMMIT_EMAIL }}" + git config --local user.name "${{ env.COMMIT_NAME }}" + git pull origin master + git commit -m "Automatic TGUI Rebuild [ci skip]" -a || true + git push diff --git a/.github/workflows/update_tgs_dmapi.yml b/.github/workflows/update_tgs_dmapi.yml index 83c196a22fea5..af3f2951d57c4 100644 --- a/.github/workflows/update_tgs_dmapi.yml +++ b/.github/workflows/update_tgs_dmapi.yml @@ -40,7 +40,7 @@ jobs: destination_branch: "master" pr_title: "Automatic TGS DMAPI Update" pr_body: "This pull request updates the TGS DMAPI to the latest version. Please note any breaking or unimplemented changes before merging." - pr_label: "Tools" + pr_label: "tools" pr_allow_empty: false #github_token: ${{ secrets.GITHUB_TOKEN }} Use this instead if you have unprotected branches github_token: ${{ secrets.CL_TOKEN }} diff --git a/.gitignore b/.gitignore index 9b583ce0eb159..1768f9e0ba261 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,9 @@ #Ignore byond config folder. /cfg/**/* +# Ignore compiled linux libs in the root folder, e.g. librust_g.so +/*.so + #Ignore compiled files and other files generated during compilation. *.mdme *.dmb @@ -49,27 +52,6 @@ __pycache__/ *.py[cod] *$py.class -# C extensions -#*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. @@ -77,8 +59,7 @@ var/ *.spec # Installer logs -pip-log.txt -pip-delete-this-directory.txt +pip-*.txt # Unit test / coverage reports htmlcov/ @@ -88,7 +69,6 @@ htmlcov/ .cache nosetests.xml coverage.xml -*,cover .hypothesis/ # Translations @@ -97,10 +77,6 @@ coverage.xml # Django stuff: *.log -local_settings.py - -# Flask instance folder -instance/ # Scrapy stuff: .scrapy @@ -108,9 +84,6 @@ instance/ # Sphinx documentation docs/_build/ -# PyBuilder -target/ - # IPython Notebook .ipynb_checkpoints @@ -123,10 +96,6 @@ celerybeat-schedule # dotenv .env -# virtualenv -venv/ -ENV/ - # IntelliJ IDEA / PyCharm (with plugin) .idea @@ -149,12 +118,6 @@ Desktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ -# Windows Installer files -#*.cab -#*.msi -#*.msm -#*.msp - # Windows shortcuts *.lnk @@ -195,10 +158,10 @@ Temporary Items #Visual studio stuff *.vscode/* -!/.vscode/extensions.json -!/.vscode/settings.json -tools/MapAtmosFixer/MapAtmosFixer/obj/* -tools/MapAtmosFixer/MapAtmosFixer/bin/* +/tools/MapAtmosFixer/MapAtmosFixer/obj/* +/tools/MapAtmosFixer/MapAtmosFixer/bin/* +/tools/CreditsTool/bin/* +/tools/CreditsTool/obj/* #GitHub Atom .atom-build.json @@ -216,3 +179,6 @@ tools/MapAtmosFixer/MapAtmosFixer/bin/* !/config/jukebox_music/sounds/exclude /config/title_music/sounds/* !/config/title_music/sounds/exclude + +# Common build tooling, C B T +!/tools/build diff --git a/.tgs4.yml b/.tgs4.yml new file mode 100644 index 0000000000000..6c44ca4ebe796 --- /dev/null +++ b/.tgs4.yml @@ -0,0 +1,4 @@ +linux_scripts: + PreCompile.sh: tools/tgs4_scripts/PreCompile.sh +windows_scripts: + PreCompile.bat: tools/tgs4_scripts/PreCompile.bat diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index b63ac697b416c..0000000000000 --- a/.travis.yml +++ /dev/null @@ -1,88 +0,0 @@ -language: generic -os: linux -dist: bionic - -branches: - only: - - master - -matrix: - include: - - name: "Run Linters" - addons: - apt: - packages: - - python3 - - python3-pip - - python3-setuptools - install: - - tools/travis/install_build_tools.sh - - tools/travis/install_spaceman_dmm.sh dreamchecker - script: - - tools/travis/check_filedirs.sh beestation.dme - - tools/travis/check_changelogs.sh - - find . -name "*.php" -print0 | xargs -0 -n1 php -l - - find . -name "*.json" -not -path "./tgui/node_modules/*" -print0 | xargs -0 python3 ./tools/json_verifier.py - - tools/travis/build_tgui.sh - - tools/travis/check_grep.sh - - ~/dreamchecker - - - name: "Compile All Maps" - addons: - apt: - packages: - - libstdc++6:i386 - cache: - directories: - - $HOME/BYOND - install: - - tools/travis/install_byond.sh - - source $HOME/BYOND/byond/bin/byondsetup - before_script: - - tools/travis/template_dm_generator.py - script: - - tools/travis/dm.sh -DTRAVISBUILDING -DTRAVISTESTING -DALL_MAPS beestation.dme - - - name: "Compile and Run Tests" - addons: - mariadb: '10.2' - apt: - sources: - - sourceline: "ppa:ubuntu-toolchain-r/test" - packages: - - libstdc++6:i386 - - gcc-multilib - - g++-7 - - g++-7-multilib - - libssl1.1:i386 - - zlib1g:i386 - cache: - directories: - - $HOME/BYOND - install: - - tools/travis/install_byond.sh - - source $HOME/BYOND/byond/bin/byondsetup - - tools/travis/install_rust_g.sh - before_script: - - mysql -u root -e 'CREATE DATABASE bee_travis;' - - mysql -u root bee_travis < SQL/beestation_schema.sql - script: - - tools/travis/dm.sh -DTRAVISBUILDING beestation.dme || travis_terminate 1 - - tools/travis/run_server.sh - -# - name: "Generate Documentation" -# # Only run for non-PR commits to the real master branch. -# if: branch = master AND head_branch IS blank -# install: -# - tools/travis/install_spaceman_dmm.sh dmdoc -# before_script: -# # Travis checks out a hash, try to get back on a branch. -# - git checkout -qf $(git name-rev --name-only HEAD) || true -# script: -# - ~/dmdoc -# - touch dmdoc/.nojekyll -# deploy: -# provider: pages -# skip_cleanup: true -# local_dir: dmdoc -# github_token: $DMDOC_GITHUB_TOKEN diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 0abac7a5338e5..8f47c8079670c 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,8 +1,9 @@ -{ - "recommendations": [ - "gbasood.byond-dm-language-support", - "platymuus.dm-langclient", - "EditorConfig.EditorConfig", - "dbaeumer.vscode-eslint" - ] -} +{ + "recommendations": [ + "gbasood.byond-dm-language-support", + "platymuus.dm-langclient", + "EditorConfig.EditorConfig", + "arcanis.vscode-zipfs", + "dbaeumer.vscode-eslint" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000000..543058728f561 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,12 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "byond", + "request": "launch", + "name": "Launch DreamSeeker", + "preLaunchTask": "Build All", + "dmb": "${workspaceFolder}/${command:CurrentDMB}" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 4f62a16105604..052769d3cc124 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,28 @@ { "dreammaker.extoolsDLL": "byond-extools.dll", + "eslint.nodePath": "./tgui/.yarn/sdks", + "eslint.workingDirectories": [ + "./tgui" + ], + "typescript.tsdk": "./tgui/.yarn/sdks/typescript/lib", + "typescript.enablePromptUseWorkspaceTsdk": true, + "search.exclude": { + "**/.yarn": true, + "**/.pnp.*": true + }, + "workbench.editorAssociations": { + "*.dmi": "imagePreview.previewEditor" + }, + "files.eol": "\n", + "gitlens.advanced.blame.customArguments": ["-w"], + "tgstationTestExplorer.project.resultsType": "json", + "[javascript]": { + "editor.rulers": [80] + }, + "[typescript]": { + "editor.rulers": [80] + }, + "[scss]": { + "editor.rulers": [80] + } } diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000000000..56c1756ff6afb --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,55 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "process", + "command": "tools/build/build", + "windows": { + "command": ".\\tools\\build\\build.bat" + }, + "options": { + "env": { + "DM_EXE": "${config:dreammaker.byondPath}" + } + }, + "problemMatcher": [ + "$dreammaker", + "$tsc", + "$eslint-stylish" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "dependsOn": "dm: reparse", + "label": "Build All" + }, + { + "type": "dreammaker", + "dme": "beestation.dme", + "problemMatcher": [ + "$dreammaker" + ], + "group": "build", + "label": "dm: build - beestation.dme" + }, + { + "type": "shell", + "command": "tgui/bin/tgui", + "windows": { + "command": ".\\tgui\\bin\\tgui.bat" + }, + "problemMatcher": [ + "$tsc", + "$eslint-stylish" + ], + "group": "build", + "label": "tgui: build" + }, + { + "command": "${command:dreammaker.reparse}", + "group": "build", + "label": "dm: reparse" + } + ] +} diff --git a/BUILD.bat b/BUILD.bat new file mode 100644 index 0000000000000..68eaef0c2d351 --- /dev/null +++ b/BUILD.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0\tools\build\build.bat" %* +pause diff --git a/Dockerfile b/Dockerfile index b416fcaa1fda1..878ae2cc3b8de 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,72 +1,66 @@ -FROM beestation/byond:513.1536 as base -ONBUILD ENV BYOND_MAJOR=513 -ONBUILD ENV BYOND_MINOR=1536 - -FROM base as build_base - -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - git \ - dos2unix\ - ca-certificates - -FROM build_base as rust_g - -WORKDIR /rust_g - -RUN apt-get install -y --no-install-recommends \ - libssl-dev \ - pkg-config \ - curl \ - gcc-multilib \ - && curl https://sh.rustup.rs -sSf | sh -s -- -y --default-host i686-unknown-linux-gnu \ - && git init \ - && git remote add origin https://github.com/BeeStation/rust-g - -COPY dependencies.sh . - -RUN dos2unix dependencies.sh \ - && /bin/bash -c "source dependencies.sh \ - && git fetch --depth 1 origin \$RUST_G_VERSION" \ - && git checkout FETCH_HEAD \ - && ~/.cargo/bin/cargo build --release --all-features \ - && apt-get --purge remove -y dos2unix - -FROM base as dm_base - -WORKDIR /beestation - -FROM dm_base as build - -COPY . . - -RUN apt-get update \ - && apt-get install -y --no-install-recommends dos2unix \ - && rm -rf /var/lib/apt/lists/* \ - && DreamMaker -max_errors 0 beestation.dme && dos2unix tools/deploy.sh && tools/deploy.sh /deploy - -FROM dm_base - -EXPOSE 1337 - -RUN apt-get update \ - && apt-get install -y --no-install-recommends software-properties-common \ - && add-apt-repository ppa:ubuntu-toolchain-r/test \ - && apt-get update \ - && apt-get upgrade -y \ - && apt-get dist-upgrade -y \ - && apt-get install -y --no-install-recommends \ - mariadb-client \ - libssl1.0.0 \ - && rm -rf /var/lib/apt/lists/* \ - && mkdir -p /root/.byond/bin - -COPY --from=rust_g /rust_g/target/release/librust_g.so /root/.byond/bin/rust_g -COPY --from=build /deploy ./ - -#extools fexists memes -RUN ln -s /beestation/libbyond-extools.so /root/.byond/bin/libbyond-extools.so - -VOLUME [ "/beestation/config", "/beestation/data" ] - -ENTRYPOINT [ "DreamDaemon", "beestation.dmb", "-port", "1337", "-trusted", "-close", "-verbose" ] +# syntax=docker/dockerfile:1 +FROM beestation/byond:514.1568 as base + +# Install the tools needed to compile our rust dependencies +FROM base as rust-build +ENV PKG_CONFIG_ALLOW_CROSS=1 \ + CARGO_HOME=/usr/local/cargo \ + PATH=/usr/local/cargo/bin:$PATH +WORKDIR /build +COPY dependencies.sh . +RUN dpkg --add-architecture i386 \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + curl ca-certificates gcc-multilib \ + g++-multilib libc6-i386 zlib1g-dev:i386 \ + libssl-dev:i386 pkg-config:i386 git \ + && /bin/bash -c "source dependencies.sh \ + && curl https://sh.rustup.rs | sh -s -- -y -t i686-unknown-linux-gnu --no-modify-path --profile minimal --default-toolchain \$RUST_VERSION" \ + && rm -rf /var/lib/apt/lists/* + +# Build rust-g +FROM rust-build as rustg +RUN git init \ + && git remote add origin https://github.com/BeeStation/rust-g \ + && /bin/bash -c "source dependencies.sh \ + && git fetch --depth 1 origin \$RUST_G_VERSION" \ + && git checkout FETCH_HEAD \ + && cargo build --release --all-features --target i686-unknown-linux-gnu + +# Build auxmos +FROM rust-build as auxmos +RUN git init \ + && git remote add origin https://github.com/BeeStation/auxmos \ + && /bin/bash -c "source dependencies.sh \ + && git fetch --depth 1 origin \$AUXMOS_VERSION" \ + && git checkout FETCH_HEAD \ + && cargo rustc --target=i686-unknown-linux-gnu --release --features=trit_fire_hook,plasma_fire_hook,generic_fire_hook + +# Install nodejs which is required to deploy BeeStation +FROM base as node +COPY dependencies.sh . +RUN apt-get update \ + && apt-get install curl -y \ + && /bin/bash -c "source dependencies.sh \ + && curl -fsSL https://deb.nodesource.com/setup_\$NODE_VERSION.x | bash -" \ + && apt-get install -y nodejs + +# Build TGUI, tgfonts, and the dmb +FROM node as dm-build +ENV TG_BOOTSTRAP_NODE_LINUX=1 +WORKDIR /dm-build +COPY . . +# Required to satisfy our compile_options +COPY --from=auxmos /build/target/i686-unknown-linux-gnu/release/libauxmos.so /dm-build/auxtools/libauxmos.so +RUN tools/build/build \ + && tools/deploy.sh /deploy \ + && apt-get autoremove curl -y \ + && rm -rf /var/lib/apt/lists/* + +FROM base +WORKDIR /beestation +COPY --from=dm-build /deploy ./ +COPY --from=rustg /build/target/i686-unknown-linux-gnu/release/librust_g.so /root/.byond/bin/rust_g +VOLUME [ "/beestation/config", "/beestation/data" ] +ENTRYPOINT [ "DreamDaemon", "beestation.dmb", "-port", "1337", "-trusted", "-close", "-verbose" ] +EXPOSE 1337 diff --git a/MIT.txt b/MIT.txt deleted file mode 100644 index 59be2d32ebea1..0000000000000 --- a/MIT.txt +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 MCHSL - -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/README.md b/README.md index 0a542cd1efc0a..b97d685903fd1 100644 --- a/README.md +++ b/README.md @@ -1,176 +1,171 @@ -

BeeStation 13 Codebase

- - -[![forthebadge](https://forthebadge.com/images/badges/built-with-resentment.svg)](https://forthebadge.com) [![forthebadge](https://forthebadge.com/images/badges/contains-technical-debt.svg)](https://user-images.githubusercontent.com/8171642/50290880-ffef5500-043a-11e9-8270-a2e5b697c86c.png) [![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://travis-ci.com/BeeStation/BeeStation-Hornet.svg?branch=master)](https://travis-ci.com/BeeStation/BeeStation-Hornet) ![Open Issues](https://isitmaintained.com/badge/open/BeeStation/BeeStation-Hornet.svg) - -**Website:** http://beestation13.com -**Code:** https://github.com/beestation/beestation-hornet -**Wiki:** https://wiki.beestation13.com/view/Main_Page - - -## DOWNLOADING - -There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at https://wiki.beestation13.com/view/Downloading_the_source_code - -Option 1: -Follow this: https://wiki.beestation13.com/view/Setting_up_git - -Option 2: Download the source code as a zip by clicking the ZIP button in the -code tab of https://github.com/beestation/beestation-hornet -(note: this will use a lot of bandwidth if you wish to update and is a lot of -hassle if you want to make any changes at all, so it's not recommended.) - -Option 3: Use our docker image that tracks the master branch (See commits for build status. Again, same caveats as option 2) - -``` -docker run -d -p :1337 -v /path/to/your/config:/beestation/config -v /path/to/your/data:/beestation/data beestation/beestation -``` - -## INSTALLATION - -First-time installation should be fairly straightforward. First, you'll need -BYOND installed. You can get it from https://www.byond.com/download. Once you've done -that, extract the game files to wherever you want to keep them. This is a -sourcecode-only release, so the next step is to compile the server files. -Open beestation.dme by double-clicking it, open the Build menu, and click -compile. This'll take a little while, and if everything's done right you'll get -a message like this: - -``` -saving beestation.dmb (DEBUG mode) -beestation.dmb - 0 errors, 0 warnings -``` - -If you see any errors or warnings, something has gone wrong - possibly a corrupt -download or the files extracted wrong. If problems persist, ask for assistance -in https://discord.gg/Vh8TJp9 or https://discord.gg/z9ttAvA - - -Once that's done, open up the config folder. You'll want to edit config.txt to -set the probabilities for different gamemodes in Secret and to set your server -location so that all your players don't get disconnected at the end of each -round. It's recommended you don't turn on the gamemodes with probability 0, -except Extended, as they have various issues and aren't currently being tested, -so they may have unknown and bizarre bugs. Extended is essentially no mode, and -isn't in the Secret rotation by default as it's just not very fun. - -You'll also want to edit config/admins.txt to remove the default admins and add -your own. "Game Master" is the highest level of access, and probably the one -you'll want to use for now. You can set up your own ranks and find out more in -config/admin_ranks.txt - -The format is - -``` -byondkey = Rank -``` - -where the admin rank must be properly capitalised. - -This codebase also depends on a native library called rust-g. A precompiled -Windows DLL is included in this repository, but Linux users will need to build -and install it themselves. Directions can be found at the [rust-g -repo](https://github.com/tgstation/rust-g). - -Finally, to start the server, run Dream Daemon and enter the path to your -compiled beestation.dmb file. Make sure to set the port to the one you -specified in the config.txt, and set the Security box to 'Safe'. Then press GO -and the server should start up and be ready to join. It is also recommended that -you set up the SQL backend (see below). - -## UPDATING - -To update an existing installation, first back up your /config and /data folders -as these store your server configuration, player preferences and banlist. - -Then, extract the new files (preferably into a clean directory, but updating in -place should work fine), copy your /config and /data folders back into the new -install, overwriting when prompted except if we've specified otherwise, and -recompile the game. Once you start the server up again, you should be running -the new version. - -## HOSTING - -If you'd like a more robust server hosting option for tgstation and its -derivatives. Check out their server tools suite at -https://github.com/tgstation/tgstation-server - -## MAPS - -BeeStation currently comes equipped with these maps. - -* [DeltaStation (default)](https://wiki.beestation13.com/view/DeltaStation) -* [BoxStation](https://wiki.beestation13.com/view/Boxstation) -* [MetaStation](https://wiki.beestation13.com/view/MetaStation) -* [PubbyStation](https://wiki.beestation13.com/view/PubbyStation) -* [DonutStation](https://wiki.beestation13.com/view/Donutstation) - - -All maps have their own code file that is in the base of the _maps directory. Maps are loaded dynamically when the game starts. Follow this guideline when adding your own map, to your fork, for easy compatibility. - -The map that will be loaded for the upcoming round is determined by reading data/next_map.json, which is a copy of the json files found in the _maps tree. If this file does not exist, the default map from config/maps.txt will be loaded. Failing that, BoxStation will be loaded. If you want to set a specific map to load next round you can use the Change Map verb in game before restarting the server or copy a json from _maps to data/next_map.json before starting the server. Also, for debugging purposes, ticking a corresponding map's code file in Dream Maker will force that map to load every round. - -If you are hosting a server, and want randomly picked maps to be played each round, you can enable map rotation in [config.txt](config/config.txt) and then set the maps to be picked in the [maps.txt](config/maps.txt) file. - -Anytime you want to make changes to a map it's imperative you use the [Map Merging tools](https://wiki.beestation13.com/view/Map_Merger) - -## AWAY MISSIONS - -BeeStation supports loading away missions however they are disabled by default. - -Map files for away missions are located in the _maps/RandomZLevels directory. Each away mission includes it's own code definitions located in /code/modules/awaymissions/mission_code. These files must be included and compiled with the server beforehand otherwise the server will crash upon trying to load away missions that lack their code. - -To enable an away mission open `config/awaymissionconfig.txt` and uncomment one of the .dmm lines by removing the #. If more than one away mission is uncommented then the away mission loader will randomly select one the enabled ones to load. - -## SQL SETUP - -The SQL backend requires a Mariadb server running 10.2 or later. Mysql is not supported but Mariadb is a drop in replacement for mysql. SQL is required for the library, stats tracking, admin notes, and job-only bans, among other features, mostly related to server administration. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/beestation_schema.sql and /SQL/beestation_schema_prefix.sql depending on if you want table prefixes. More detailed setup instructions are located here: https://wiki.beestation13.com/view/Downloading_the_source_code#Setting_up_the_database - -If you are hosting a testing server on windows you can use a standalone version of MariaDB pre load with a blank (but initialized) tgdb database. Find them here: https://tgstation13.download/database/ Just unzip and run for a working (but insecure) database server. Includes a zipped copy of the data folder for easy resetting back to square one. - -## WEB/CDN RESOURCE DELIVERY - -Web delivery of game resources makes it quicker for players to join and reduces some of the stress on the game server. - -1. Edit compile_options.dm to set the `PRELOAD_RSC` define to `0` -1. Add a url to config/external_rsc_urls pointing to a .zip file containing the .rsc. - * If you keep up to date with BeeStation you could reuse our rsc cdn at http://rsc.beestation13.buzz/beestation.zip. Otherwise you can use cdn services like CDN77 or cloudflare (requires adding a page rule to enable caching of the zip), or roll your own cdn using route 53 and vps providers. - * Regardless even offloading the rsc to a website without a CDN will be a massive improvement over the in game system for transferring files. - -## IRC BOT SETUP - -Included in the repository is a python3 compatible IRC bot capable of relaying adminhelps to a specified -IRC channel/server, see the /tools/minibot folder for more - -## CONTRIBUTING - -Please see [CONTRIBUTING.md](.github/CONTRIBUTING.md) - -## LICENSE - -All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.html). - -All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html). -(Including tools unless their readme specifies otherwise.) - -See LICENSE and GPLv3.txt for more details. - -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](https://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](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated. - -byond-extools.dll is licensed under MIT. See MIT.txt for more details. - -# Other Codebase Credits -- /tg/, for the codebase. -- CEV Eris, for the PDA sprites -- TGMC, for the custom keybinds base -- Citadel, for their beautiful lighting +

BeeStation 13 Codebase

+ + +[![forthebadge](https://forthebadge.com/images/badges/built-with-resentment.svg)](https://forthebadge.com) [![forthebadge](https://forthebadge.com/images/badges/contains-technical-debt.svg)](https://user-images.githubusercontent.com/8171642/50290880-ffef5500-043a-11e9-8270-a2e5b697c86c.png) [![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://github.com/BeeStation/BeeStation-Hornet/workflows/Run%20tests/badge.svg)](https://github.com/BeeStation/BeeStation-Hornet/actions?query=workflow%3A%22Run+tests%22) +![Open Issues](https://isitmaintained.com/badge/open/BeeStation/BeeStation-Hornet.svg) + +**Website:** http://beestation13.com +**Code:** https://github.com/beestation/beestation-hornet +**Wiki:** https://wiki.beestation13.com/view/Main_Page + + +## DOWNLOADING + +There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at https://wiki.beestation13.com/view/Downloading_the_source_code + +Option 1: +Follow this: https://wiki.beestation13.com/view/Setting_up_git + +Option 2: Download the source code as a zip by clicking the ZIP button in the +code tab of https://github.com/beestation/beestation-hornet +(note: this will use a lot of bandwidth if you wish to update and is a lot of +hassle if you want to make any changes at all, so it's not recommended.) + +Option 3: Use our docker image that tracks the master branch (See commits for build status. Again, same caveats as option 2) + +``` +docker run -d -p :1337 -v /path/to/your/config:/beestation/config -v /path/to/your/data:/beestation/data beestation/beestation +``` + +## INSTALLATION + +You can **no** longer compile the codebase simply through **DreamMaker**. + +You will find `BUILD.bat` in the root folder of Beestation, double-clicking it will initiate the build. It consists of multiple steps and might take around 1-5 minutes to compile. Unix users can directly call ./tools/build/build. + +**Building Beestation in DreamMaker directly is now deprecated and might produce errors**, such as `'tgui.bundle.js': cannot find file`. + +**[How to compile in VSCode and other build options](tools/build/README.md).** + +If you see any errors or warnings, something has gone wrong - possibly a corrupt +download or the files extracted wrong. If problems persist, ask for assistance +in https://discord.gg/Vh8TJp9 or https://discord.gg/z9ttAvA + + +Once that's done, open up the config folder. You'll want to edit config.txt to +set the probabilities for different gamemodes in Secret and to set your server +location so that all your players don't get disconnected at the end of each +round. It's recommended you don't turn on the gamemodes with probability 0, +except Extended, as they have various issues and aren't currently being tested, +so they may have unknown and bizarre bugs. Extended is essentially no mode, and +isn't in the Secret rotation by default as it's just not very fun. + +You'll also want to edit config/admins.txt to remove the default admins and add +your own. "Game Master" is the highest level of access, and probably the one +you'll want to use for now. You can set up your own ranks and find out more in +config/admin_ranks.txt + +The format is + +``` +byondkey = Rank +``` + +where the admin rank must be properly capitalised. + +This codebase also depends on a native library called rust-g. A precompiled +Windows DLL is included in this repository, but Linux users will need to build +and install it themselves. Directions can be found at the [rust-g +repo](https://github.com/tgstation/rust-g). + +Finally, to start the server, run Dream Daemon and enter the path to your +compiled beestation.dmb file. Make sure to set the port to the one you +specified in the config.txt, and set the Security box to 'Safe'. Then press GO +and the server should start up and be ready to join. It is also recommended that +you set up the SQL backend (see below). + +## UPDATING + +To update an existing installation, first back up your /config and /data folders +as these store your server configuration, player preferences and banlist. + +Then, extract the new files (preferably into a clean directory, but updating in +place should work fine), copy your /config and /data folders back into the new +install, overwriting when prompted except if we've specified otherwise, and +recompile the game. Once you start the server up again, you should be running +the new version. + +## HOSTING + +Hosting requires the [Microsoft Visual C++ 2015 Redistributable](https://www.microsoft.com/en-us/download/details.aspx?id=52685). Specifically, +`vc_redist.x86.exe`. *Not* the 64-bit version. There is a decent chance you already have it if you've installed a game on Steam. + +If you'd like a more robust server hosting option, check out tgstation's server tools suite at +https://github.com/tgstation/tgstation-server + +## MAPS + +BeeStation currently comes equipped with these maps. + +* [DeltaStation (default)](https://wiki.beestation13.com/view/DeltaStation) +* [BoxStation](https://wiki.beestation13.com/view/Boxstation) +* [MetaStation](https://wiki.beestation13.com/view/MetaStation) +* [PubbyStation](https://wiki.beestation13.com/view/PubbyStation) + + +All maps have their own code file that is in the base of the _maps directory. Maps are loaded dynamically when the game starts. Follow this guideline when adding your own map, to your fork, for easy compatibility. + +The map that will be loaded for the upcoming round is determined by reading data/next_map.json, which is a copy of the json files found in the _maps tree. If this file does not exist, the default map from config/maps.txt will be loaded. Failing that, BoxStation will be loaded. If you want to set a specific map to load next round you can use the Change Map verb in game before restarting the server or copy a json from _maps to data/next_map.json before starting the server. Also, for debugging purposes, ticking a corresponding map's code file in Dream Maker will force that map to load every round. + +If you are hosting a server, and want randomly picked maps to be played each round, you can enable map rotation in [config.txt](config/config.txt) and then set the maps to be picked in the [maps.txt](config/maps.txt) file. + +Anytime you want to make changes to a map it's imperative you use the [Map Merging tools](https://wiki.beestation13.com/view/Map_Merger) + +## AWAY MISSIONS + +BeeStation supports loading away missions however they are disabled by default. + +Map files for away missions are located in the _maps/RandomZLevels directory. Each away mission includes it's own code definitions located in /code/modules/awaymissions/mission_code. These files must be included and compiled with the server beforehand otherwise the server will crash upon trying to load away missions that lack their code. + +To enable an away mission open `config/awaymissionconfig.txt` and uncomment one of the .dmm lines by removing the #. If more than one away mission is uncommented then the away mission loader will randomly select one the enabled ones to load. + +## SQL SETUP + +The SQL backend requires a Mariadb server running 10.2 or later. Mysql is not supported but Mariadb is a drop in replacement for mysql. SQL is required for the library, stats tracking, admin notes, and job-only bans, among other features, mostly related to server administration. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/beestation_schema.sql and /SQL/beestation_schema_prefix.sql depending on if you want table prefixes. More detailed setup instructions are located here: https://wiki.beestation13.com/view/Downloading_the_source_code#Setting_up_the_database + +If you are hosting a testing server on windows you can use a standalone version of MariaDB pre load with a blank (but initialized) tgdb database. Find them here: https://tgstation13.download/database/ Just unzip and run for a working (but insecure) database server. Includes a zipped copy of the data folder for easy resetting back to square one. + +## WEB/CDN RESOURCE DELIVERY + +Web delivery of game resources makes it quicker for players to join and reduces some of the stress on the game server. + +1. Edit compile_options.dm to set the `PRELOAD_RSC` define to `0` +1. Add a url to config/external_rsc_urls pointing to a .zip file containing the .rsc. + * If you keep up to date with BeeStation you could reuse our rsc cdn at http://rsc.beestation13.buzz/beestation.zip. Otherwise you can use cdn services like CDN77 or cloudflare (requires adding a page rule to enable caching of the zip), or roll your own cdn using route 53 and vps providers. + * Regardless even offloading the rsc to a website without a CDN will be a massive improvement over the in game system for transferring files. + +## IRC BOT SETUP + +Included in the repository is a python3 compatible IRC bot capable of relaying adminhelps to a specified +IRC channel/server, see the /tools/minibot folder for more + +## CONTRIBUTING + +Please see [CONTRIBUTING.md](.github/CONTRIBUTING.md) + +## LICENSE + +All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.html). + +All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html). +(Including tools unless their readme specifies otherwise.) + +See LICENSE and GPLv3.txt for more details. + +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](https://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](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated. + +# Other Codebase Credits +- /tg/, for the codebase. +- CEV Eris, for the PDA sprites +- TGMC, for the custom keybinds base +- Citadel, for their beautiful lighting diff --git a/SQL/beestation_schema.sql b/SQL/beestation_schema.sql index dbaae366d73e6..e5ca98cad47c0 100644 --- a/SQL/beestation_schema.sql +++ b/SQL/beestation_schema.sql @@ -214,7 +214,7 @@ DROP TABLE IF EXISTS `SS13_library`; CREATE TABLE IF NOT EXISTS `SS13_library` ( `id` int(11) NOT NULL AUTO_INCREMENT, `author` varchar(45) NOT NULL, - `title` varchar(45) NOT NULL, + `title` varchar(50) NOT NULL, `content` text NOT NULL, `category` enum('Any','Fiction','Non-Fiction','Adult','Reference','Religion') NOT NULL, `ckey` varchar(32) NOT NULL DEFAULT 'LEGACY', @@ -481,7 +481,7 @@ CREATE TABLE IF NOT EXISTS `SS13_schema_revision` ( `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`major`,`minor`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 7); +INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 8); diff --git a/SQL/database_changelog.txt b/SQL/database_changelog.txt index a8fa7f1d021d4..fb6da017f7f7e 100644 --- a/SQL/database_changelog.txt +++ b/SQL/database_changelog.txt @@ -2,14 +2,22 @@ Any time you make a change to the schema files, remember to increment the databa The latest database version is 5.7; The query to update the schema revision table is: -INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 7); +INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 8); or -INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 7); +INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 8); In any query remember to add a prefix to the table names if you use one. ----------------------------------------------------- +Version 5.8 28 September 2021, by Raven-Industries and MCterra +Updates the maximum length for book titles in the library. + +ALTER TABLE `SS13_library` + CHANGE COLUMN `title` `title` VARCHAR(50) NOT NULL AFTER `author`; + +----------------------------------------------------- + Version 5.7 20 July 2020, by ike709 Adds a new `uuid` column in the `player` table that allows for discord verification. diff --git a/SpacemanDMM.toml b/SpacemanDMM.toml index 79b8f91b80123..7f74da78240fa 100644 --- a/SpacemanDMM.toml +++ b/SpacemanDMM.toml @@ -1,2 +1,9 @@ [langserver] -dreamchecker = true \ No newline at end of file +dreamchecker = true + +[code_standards] +disallow_relative_type_definitions = true +disallow_relative_proc_definitions = true + +[debugger] +engine = "auxtools" diff --git a/TGS3.json b/TGS3.json deleted file mode 100644 index 194546917c5f3..0000000000000 --- a/TGS3.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "documentation": "/tg/station server 3 configuration file", - "changelog": { - "script": "tools/changelog/ss13_genchangelog.py", - "arguments": "html/changelog.html html/changelogs", - "pip_dependancies": [ - "PyYaml", - "beautifulsoup4" - ] - }, - "synchronize_paths": [ - "html/changelog.html", - "html/changelogs/*" - ], - "static_directories": [ - "config", - "data" - ], - "dlls": [ - "libmariadb.dll" - ] - } diff --git a/_maps/RandomRooms/10x10/sk_rdm033_deltalibrary.dmm b/_maps/RandomRooms/10x10/sk_rdm033_deltalibrary.dmm index 2272b0156d204..7589c51751e94 100644 --- a/_maps/RandomRooms/10x10/sk_rdm033_deltalibrary.dmm +++ b/_maps/RandomRooms/10x10/sk_rdm033_deltalibrary.dmm @@ -27,14 +27,14 @@ /turf/open/floor/plasteel/grimy, /area/template_noop) "f" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood{ icon_state = "wood-broken7" }, /area/template_noop) "g" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood{ icon_state = "wood-broken" }, @@ -95,7 +95,7 @@ /area/template_noop) "o" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/grimy, /area/template_noop) "p" = ( @@ -289,8 +289,8 @@ "W" = ( /obj/structure/easel, /obj/effect/decal/cleanable/dirt, -/obj/item/canvas/twentythreeXtwentythree, -/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, /obj/machinery/light/small, /turf/open/floor/plating, /area/template_noop) diff --git a/_maps/RandomRooms/10x10/sk_rdm060_snakefighter.dmm b/_maps/RandomRooms/10x10/sk_rdm060_snakefighter.dmm index 0fb00c28105be..bfffa01b03bb2 100644 --- a/_maps/RandomRooms/10x10/sk_rdm060_snakefighter.dmm +++ b/_maps/RandomRooms/10x10/sk_rdm060_snakefighter.dmm @@ -91,7 +91,7 @@ /turf/open/floor/plating, /area/template_noop) "q" = ( -/obj/item/twohanded/spear, +/obj/item/spear, /turf/open/floor/plating, /area/template_noop) "r" = ( diff --git a/_maps/RandomRooms/10x10/sk_rdm062_roosterdome.dmm b/_maps/RandomRooms/10x10/sk_rdm062_roosterdome.dmm index ab461921fb268..4e4d0a6d49c84 100644 --- a/_maps/RandomRooms/10x10/sk_rdm062_roosterdome.dmm +++ b/_maps/RandomRooms/10x10/sk_rdm062_roosterdome.dmm @@ -3,7 +3,7 @@ /turf/open/floor/plasteel/dark, /area/template_noop) "b" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel/dark, diff --git a/_maps/RandomRooms/10x10/sk_rdm070_pubbybar.dmm b/_maps/RandomRooms/10x10/sk_rdm070_pubbybar.dmm index f85eeb1b1f9ba..d089bdcc13cf1 100644 --- a/_maps/RandomRooms/10x10/sk_rdm070_pubbybar.dmm +++ b/_maps/RandomRooms/10x10/sk_rdm070_pubbybar.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/obj/structure/piano, +/obj/structure/musician/piano, /turf/open/floor/plasteel/dark, /area/template_noop) "b" = ( diff --git a/_maps/RandomRooms/10x10/sk_rdm088_bigconstruction.dmm b/_maps/RandomRooms/10x10/sk_rdm088_bigconstruction.dmm index 046c962db861f..69d360fb6df3a 100644 --- a/_maps/RandomRooms/10x10/sk_rdm088_bigconstruction.dmm +++ b/_maps/RandomRooms/10x10/sk_rdm088_bigconstruction.dmm @@ -13,7 +13,6 @@ /area/template_noop) "d" = ( /obj/structure/closet/crate/science, -/obj/item/circuitboard/computer/shuttle/docker, /obj/item/circuitboard/computer/shuttle/flight_control, /obj/item/circuitboard/machine/shuttle/heater, /obj/item/circuitboard/machine/shuttle/engine/plasma, diff --git a/_maps/RandomRooms/10x10/sk_rdm132_conveyorroom.dmm b/_maps/RandomRooms/10x10/sk_rdm132_conveyorroom.dmm index bfe4d72c1c584..95531eef65bd5 100644 --- a/_maps/RandomRooms/10x10/sk_rdm132_conveyorroom.dmm +++ b/_maps/RandomRooms/10x10/sk_rdm132_conveyorroom.dmm @@ -8,7 +8,6 @@ /area/template_noop) "c" = ( /obj/machinery/light/broken{ - icon_state = "tube-broken"; dir = 1 }, /turf/open/floor/plating{ @@ -48,30 +47,19 @@ icon_state = "panelscorched" }, /area/template_noop) -"j" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plasteel, -/area/template_noop) "k" = ( /turf/open/floor/plasteel, /area/template_noop) "l" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/arrows{ - icon_state = "arrows"; dir = 4 }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown, /turf/open/floor/plasteel, /area/template_noop) "m" = ( /obj/machinery/conveyor{ dir = 5; - icon_state = "conveyor_map"; id = "BeltLoad" }, /turf/open/floor/plating, @@ -86,7 +74,6 @@ "o" = ( /obj/machinery/conveyor{ dir = 6; - icon_state = "conveyor_map"; id = "BeltLoad" }, /turf/open/floor/plating, @@ -99,17 +86,8 @@ /area/template_noop) "q" = ( /obj/machinery/light/built{ - icon_state = "tube-empty"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/template_noop) -"r" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ dir = 8 }, -/obj/effect/turf_decal/tile/brown, /turf/open/floor/plasteel, /area/template_noop) "s" = ( @@ -131,7 +109,6 @@ /area/template_noop) "v" = ( /obj/machinery/light/built{ - icon_state = "tube-empty"; dir = 4 }, /obj/effect/spawner/lootdrop/glowstick, @@ -146,7 +123,6 @@ "x" = ( /obj/machinery/conveyor{ dir = 9; - icon_state = "conveyor_map"; id = "BeltLoad" }, /turf/open/floor/plating, @@ -161,7 +137,6 @@ "z" = ( /obj/machinery/conveyor{ dir = 10; - icon_state = "conveyor_map"; id = "BeltLoad" }, /turf/open/floor/plating, @@ -185,7 +160,6 @@ /area/template_noop) "D" = ( /obj/machinery/light/broken{ - icon_state = "tube-broken"; dir = 8 }, /turf/open/floor/plating, @@ -223,7 +197,6 @@ /area/template_noop) "K" = ( /obj/machinery/light/broken{ - icon_state = "tube-broken"; dir = 4 }, /turf/open/floor/plating, @@ -256,32 +229,16 @@ /obj/effect/decal/cleanable/oil, /turf/open/floor/plating, /area/template_noop) -"R" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/template_noop) "S" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance/six, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown, /turf/open/floor/plasteel, /area/template_noop) "T" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/arrows{ - icon_state = "arrows"; dir = 1 }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown, /turf/open/floor/plasteel, /area/template_noop) @@ -299,7 +256,7 @@ a "} (2,1,1) = {" b -j +g S T w @@ -359,7 +316,7 @@ k "} (7,1,1) = {" d -r +f n t y @@ -371,7 +328,7 @@ P "} (8,1,1) = {" b -r +f o u z @@ -383,7 +340,7 @@ Q "} (9,1,1) = {" a -R +f p a a diff --git a/_maps/RandomRooms/10x10/sk_rdm135_cluwnealtar.dmm b/_maps/RandomRooms/10x10/sk_rdm135_cluwnealtar.dmm deleted file mode 100644 index 9f624ec0996b9..0000000000000 --- a/_maps/RandomRooms/10x10/sk_rdm135_cluwnealtar.dmm +++ /dev/null @@ -1,225 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/template_noop) -"b" = ( -/obj/effect/trap/nexus/cluwnecurse, -/obj/effect/rune/cluwne, -/obj/effect/trap/nexus/darkness, -/turf/open/floor/light/colour_cycle, -/area/template_noop) -"c" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/template_noop) -"d" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/light, -/turf/open/floor/circuit/green, -/area/template_noop) -"f" = ( -/obj/structure/chair/comfy/lime{ - dir = 8 - }, -/turf/open/floor/circuit/red, -/area/template_noop) -"g" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/circuit/green, -/area/template_noop) -"l" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance/two, -/turf/open/floor/plating, -/area/template_noop) -"p" = ( -/turf/open/floor/stone, -/area/template_noop) -"r" = ( -/obj/structure/table/wood, -/obj/item/pizzabox/margherita, -/turf/open/floor/stone, -/area/template_noop) -"u" = ( -/obj/structure/window/reinforced/fulltile, -/turf/open/floor/stone, -/area/template_noop) -"y" = ( -/obj/structure/table/wood, -/obj/item/pizzabox/meat, -/turf/open/floor/stone, -/area/template_noop) -"A" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/turf/open/floor/plating, -/area/template_noop) -"F" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance/two, -/turf/open/floor/plating, -/area/template_noop) -"G" = ( -/turf/open/floor/mineral/bananium, -/area/template_noop) -"N" = ( -/obj/machinery/light, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/circuit/green, -/area/template_noop) -"P" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/circuit/green, -/area/template_noop) -"R" = ( -/turf/closed/wall, -/area/template_noop) -"S" = ( -/obj/structure/table/wood, -/obj/item/pizzabox/pineapple, -/turf/open/floor/stone, -/area/template_noop) -"U" = ( -/turf/open/floor/plating, -/area/template_noop) -"X" = ( -/obj/item/grown/bananapeel, -/obj/effect/trap/trigger/all, -/turf/open/floor/stone, -/area/template_noop) - -(1,1,1) = {" -g -G -G -G -G -G -d -R -c -a -"} -(2,1,1) = {" -G -G -p -p -p -G -G -R -R -U -"} -(3,1,1) = {" -G -p -p -X -p -p -G -R -l -U -"} -(4,1,1) = {" -G -p -X -b -X -p -G -A -U -U -"} -(5,1,1) = {" -G -p -p -X -p -p -G -R -U -U -"} -(6,1,1) = {" -G -G -p -p -p -G -G -R -U -U -"} -(7,1,1) = {" -P -G -G -G -G -G -N -R -U -R -"} -(8,1,1) = {" -R -u -u -u -u -u -R -R -U -c -"} -(9,1,1) = {" -p -p -r -S -y -p -p -A -U -U -"} -(10,1,1) = {" -p -f -f -f -f -f -p -R -c -F -"} diff --git a/_maps/RandomRooms/10x10/sk_rdm141_6sectorsdown.dmm b/_maps/RandomRooms/10x10/sk_rdm141_6sectorsdown.dmm new file mode 100644 index 0000000000000..e884dea5de799 --- /dev/null +++ b/_maps/RandomRooms/10x10/sk_rdm141_6sectorsdown.dmm @@ -0,0 +1,448 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"bM" = ( +/obj/structure/closet, +/obj/item/picket_sign, +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"bY" = ( +/obj/structure/closet, +/obj/item/reagent_containers/food/snacks/popcorn, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"ce" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel, +/area/template_noop) +"dn" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"dC" = ( +/obj/structure/rack, +/turf/open/floor/monotile/steel, +/area/template_noop) +"eF" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/random{ + pixel_y = -32 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"fb" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plasteel, +/area/template_noop) +"fy" = ( +/obj/machinery/shower, +/obj/structure/sign/poster/contraband/random{ + pixel_x = 32 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"hp" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/radio/intercom{ + pixel_y = 26 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"iC" = ( +/obj/structure/closet, +/obj/structure/window/reinforced/tinted/frosted, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/monotile/steel, +/area/template_noop) +"kn" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"lo" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/structure/sign/poster/contraband/random{ + pixel_x = 32 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"mb" = ( +/obj/item/reagent_containers/spray/cleaner, +/obj/structure/rack, +/turf/open/floor/monotile/steel, +/area/template_noop) +"mv" = ( +/obj/structure/closet, +/obj/item/clipboard, +/obj/item/storage/box, +/turf/open/floor/monotile/steel, +/area/template_noop) +"mQ" = ( +/obj/item/toy/beach_ball, +/turf/open/floor/plasteel, +/area/template_noop) +"nv" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating, +/area/template_noop) +"nI" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/template_noop) +"nT" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/template_noop) +"os" = ( +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/plasteel, +/area/template_noop) +"oZ" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"qz" = ( +/obj/effect/decal/cleanable/oil{ + icon_state = "floor5" + }, +/obj/structure/curtain, +/turf/open/floor/plasteel, +/area/template_noop) +"qP" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind{ + pixel_x = 4; + pixel_y = 7 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"re" = ( +/turf/open/floor/monotile/steel, +/area/template_noop) +"rx" = ( +/turf/open/floor/plating, +/area/template_noop) +"sw" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"sZ" = ( +/obj/structure/curtain, +/turf/open/floor/plasteel, +/area/template_noop) +"th" = ( +/obj/structure/chair/stool, +/turf/open/floor/plating, +/area/template_noop) +"xe" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel, +/area/template_noop) +"xL" = ( +/turf/closed/wall, +/area/template_noop) +"yL" = ( +/obj/structure/chair/stool, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"zY" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"AU" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb{ + pixel_x = -4; + pixel_y = 5 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"Bg" = ( +/obj/machinery/shower, +/turf/open/floor/monotile/steel, +/area/template_noop) +"Ee" = ( +/obj/item/trash/popcorn, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/template_noop) +"GN" = ( +/obj/structure/closet, +/obj/item/storage/pill_bottle/floorpill, +/obj/structure/window/reinforced/tinted/frosted, +/obj/structure/window/reinforced/tinted/frosted{ + dir = 4 + }, +/obj/item/clothing/under/costume/jabroni, +/obj/item/stack/spacecash/c20, +/turf/open/floor/monotile/steel, +/area/template_noop) +"HZ" = ( +/obj/item/chair/stool, +/turf/open/floor/plasteel, +/area/template_noop) +"Jb" = ( +/obj/structure/table, +/turf/open/floor/monotile/steel, +/area/template_noop) +"Jg" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/template_noop) +"JJ" = ( +/turf/open/floor/plasteel, +/area/template_noop) +"Mj" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel, +/area/template_noop) +"NQ" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/template_noop) +"NR" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/monotile/steel, +/area/template_noop) +"Pf" = ( +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/template_noop) +"Pg" = ( +/obj/structure/chair/stool, +/turf/open/floor/plasteel, +/area/template_noop) +"Qx" = ( +/obj/structure/closet, +/obj/structure/window/reinforced/tinted/frosted, +/obj/item/reagent_containers/food/drinks/bottle/tequila{ + pixel_x = -6; + pixel_y = 4 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"QK" = ( +/obj/effect/spawner/lootdrop/glowstick, +/turf/open/floor/plating, +/area/template_noop) +"TC" = ( +/obj/structure/closet, +/obj/structure/window/reinforced/tinted/frosted, +/obj/item/storage/box, +/turf/open/floor/monotile/steel, +/area/template_noop) +"TI" = ( +/obj/item/trash/cheesie, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"Uy" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"UJ" = ( +/obj/structure/closet, +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/monotile/steel, +/area/template_noop) +"UQ" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/emergency, +/obj/effect/spawner/lootdrop/maintenance/three, +/turf/open/floor/monotile/steel, +/area/template_noop) +"Vd" = ( +/obj/item/cigbutt/roach, +/turf/open/floor/plating, +/area/template_noop) +"VX" = ( +/obj/machinery/shower{ + dir = 1 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"Wc" = ( +/obj/structure/curtain, +/turf/open/floor/plating, +/area/template_noop) +"Xz" = ( +/obj/item/cigbutt/roach, +/turf/open/floor/plasteel, +/area/template_noop) +"Yy" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/monotile/steel, +/area/template_noop) +"YL" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plating, +/area/template_noop) +"YW" = ( +/obj/item/stack/spacecash/c20, +/turf/open/floor/plasteel, +/area/template_noop) +"Zs" = ( +/obj/structure/closet/firecloset/full, +/turf/open/floor/plating, +/area/template_noop) + +(1,1,1) = {" +NR +JJ +yL +ce +re +Uy +JJ +JJ +JJ +eF +"} +(2,1,1) = {" +bM +JJ +JJ +Xz +Qx +Bg +JJ +JJ +Mj +VX +"} +(3,1,1) = {" +bY +JJ +Pg +JJ +iC +fy +nv +JJ +mQ +dn +"} +(4,1,1) = {" +UJ +JJ +Vd +YW +TC +xL +sZ +qz +Wc +xL +"} +(5,1,1) = {" +re +rx +HZ +Ee +GN +AU +JJ +JJ +sw +oZ +"} +(6,1,1) = {" +re +rx +JJ +JJ +qP +mv +rx +rx +rx +re +"} +(7,1,1) = {" +mb +rx +TI +JJ +JJ +zY +HZ +rx +th +re +"} +(8,1,1) = {" +xL +nI +xL +kn +YL +xe +JJ +zY +JJ +UQ +"} +(9,1,1) = {" +NQ +nT +Pf +JJ +JJ +fb +rx +os +QK +dC +"} +(10,1,1) = {" +Zs +Jg +xL +hp +re +rx +lo +Yy +Jb +Jb +"} diff --git a/_maps/RandomRooms/10x10/sk_rdm142_olddiner.dmm b/_maps/RandomRooms/10x10/sk_rdm142_olddiner.dmm new file mode 100644 index 0000000000000..d6f5b5ff14c94 --- /dev/null +++ b/_maps/RandomRooms/10x10/sk_rdm142_olddiner.dmm @@ -0,0 +1,434 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"dZ" = ( +/turf/open/floor/wood, +/area/template_noop) +"eB" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"gd" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/template_noop) +"gK" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/wood, +/area/template_noop) +"hL" = ( +/obj/structure/table_frame/wood, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"ig" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/template_noop) +"iU" = ( +/obj/structure/closet/firecloset/full, +/turf/open/floor/wood, +/area/template_noop) +"ja" = ( +/obj/machinery/door/airlock/wood, +/turf/open/floor/wood, +/area/template_noop) +"lT" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/template_noop) +"nt" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/template_noop) +"oV" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/wood, +/area/template_noop) +"pb" = ( +/obj/effect/spawner/lootdrop/maintenance/eight, +/obj/structure/rack, +/turf/open/floor/plasteel/white, +/area/template_noop) +"pI" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"qm" = ( +/obj/structure/table_frame/wood, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"tO" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"ut" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"uB" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken4" + }, +/area/template_noop) +"uE" = ( +/obj/item/stack/tile/carpet/black/fifty, +/obj/structure/closet, +/obj/item/stack/tile/wood, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty, +/turf/open/floor/wood, +/area/template_noop) +"vw" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"vO" = ( +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/plasteel/white, +/area/template_noop) +"wa" = ( +/obj/structure/table/wood/fancy/black, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"wr" = ( +/obj/structure/table/wood/fancy/black, +/obj/effect/spawner/lootdrop/maintenance/three, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"xT" = ( +/obj/machinery/light/small, +/obj/machinery/processor, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"ya" = ( +/obj/machinery/chem_dispenser/drinks/beer, +/obj/structure/table/wood, +/obj/item/radio/intercom{ + pixel_y = 26 + }, +/turf/open/floor/plating, +/area/template_noop) +"yn" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/template_noop) +"yH" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"ze" = ( +/turf/open/floor/plating, +/area/template_noop) +"zm" = ( +/obj/structure/table_frame/wood, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/monotile/steel, +/area/template_noop) +"AN" = ( +/obj/machinery/door/airlock/wood, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating, +/area/template_noop) +"AR" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"Bt" = ( +/obj/structure/sign/poster/contraband/random{ + pixel_x = 32 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken" + }, +/area/template_noop) +"Bw" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/template_noop) +"Ch" = ( +/turf/closed/wall, +/area/template_noop) +"Dz" = ( +/obj/structure/table_frame/wood, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"Eg" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken" + }, +/area/template_noop) +"FF" = ( +/obj/structure/sign/warning/nosmoking/circle, +/turf/closed/wall, +/area/template_noop) +"FK" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"Hd" = ( +/obj/structure/table/wood, +/obj/item/kitchen/knife, +/turf/open/floor/monotile/steel, +/area/template_noop) +"Il" = ( +/turf/open/floor/carpet, +/area/template_noop) +"Ly" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/template_noop) +"Mm" = ( +/turf/open/floor/plasteel/white, +/area/template_noop) +"Ny" = ( +/obj/structure/bookcase/random/reference, +/turf/open/floor/carpet, +/area/template_noop) +"Ok" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"Os" = ( +/obj/item/chair/wood, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"Pi" = ( +/obj/machinery/smartfridge/drinks, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"QG" = ( +/obj/machinery/door/airlock/wood, +/turf/open/floor/plating, +/area/template_noop) +"RI" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"RQ" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/template_noop) +"Sl" = ( +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"SJ" = ( +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"SV" = ( +/obj/structure/sign/poster/contraband/random{ + pixel_x = -32 + }, +/turf/open/floor/carpet, +/area/template_noop) +"Ue" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/template_noop) +"UO" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/table/wood, +/obj/machinery/microwave, +/turf/open/floor/monotile/steel, +/area/template_noop) +"Wn" = ( +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"XA" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken7" + }, +/area/template_noop) +"XO" = ( +/obj/structure/closet/crate, +/obj/item/storage/box/ingredients/sweets, +/obj/item/storage/box/ingredients/sweets, +/obj/item/storage/box/ingredients/vegetarian, +/obj/item/storage/box/ingredients/carnivore, +/turf/open/floor/plasteel/white, +/area/template_noop) +"Yd" = ( +/obj/structure/sign/warning/nosmoking, +/turf/closed/wall, +/area/template_noop) +"Yr" = ( +/obj/structure/table/wood, +/obj/machinery/microwave, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/monotile/steel, +/area/template_noop) +"Yt" = ( +/obj/machinery/light/small, +/turf/open/floor/plasteel/white, +/area/template_noop) +"Zp" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"ZF" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/open/floor/plasteel/white, +/area/template_noop) +"ZH" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb{ + pixel_x = -2; + pixel_y = 12 + }, +/turf/open/floor/carpet/royalblack, +/area/template_noop) + +(1,1,1) = {" +lT +Eg +dZ +ig +dZ +SJ +wr +wa +Wn +uE +"} +(2,1,1) = {" +dZ +ZH +SJ +AR +gd +eB +vw +vw +SJ +iU +"} +(3,1,1) = {" +uB +Os +SJ +SJ +dZ +SJ +RI +yH +SJ +Eg +"} +(4,1,1) = {" +ze +Zp +SJ +qm +nt +Pi +Ch +Ch +QG +Ch +"} +(5,1,1) = {" +XA +Dz +Wn +tO +gK +Hd +ut +Sl +ze +ze +"} +(6,1,1) = {" +dZ +oV +Bt +dZ +gK +hL +Sl +ze +yH +Sl +"} +(7,1,1) = {" +Yd +Ch +Ch +Yr +UO +zm +RQ +Ch +Ch +Ch +"} +(8,1,1) = {" +pb +Mm +AN +Sl +Sl +ze +Sl +ja +SV +Ny +"} +(9,1,1) = {" +vO +Yt +FF +FK +yn +Sl +xT +Ch +Bw +Ue +"} +(10,1,1) = {" +XO +ZF +Ch +ya +Sl +Ok +pI +Ch +Il +Ly +"} diff --git a/_maps/RandomRooms/10x10/sk_rdm143_gamercave.dmm b/_maps/RandomRooms/10x10/sk_rdm143_gamercave.dmm new file mode 100644 index 0000000000000..420a3fbb564dc --- /dev/null +++ b/_maps/RandomRooms/10x10/sk_rdm143_gamercave.dmm @@ -0,0 +1,348 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating, +/area/template_noop) +"b" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plating, +/area/template_noop) +"e" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating, +/area/template_noop) +"f" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"g" = ( +/turf/closed/wall, +/area/template_noop) +"i" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind{ + pixel_x = -7; + pixel_y = 8 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/cola{ + pixel_x = 12; + pixel_y = 12 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ + pixel_x = 10; + pixel_y = 2 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/space_up, +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"j" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/template_noop) +"k" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/template_noop) +"l" = ( +/obj/machinery/modular_computer/console/preset/civilian, +/turf/open/floor/plating, +/area/template_noop) +"m" = ( +/obj/structure/curtain, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/template_noop) +"n" = ( +/obj/item/trash/candy, +/turf/open/floor/carpet, +/area/template_noop) +"p" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/template_noop) +"q" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"r" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/template_noop) +"t" = ( +/obj/structure/closet/firecloset/full, +/turf/open/floor/plasteel, +/area/template_noop) +"u" = ( +/obj/item/wirecutters, +/obj/structure/rack, +/obj/item/wirerod, +/turf/open/floor/carpet, +/area/template_noop) +"w" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/soda_cans/shamblers{ + pixel_x = 9; + pixel_y = 7 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/space_up, +/obj/structure/sign/poster/contraband/random{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/template_noop) +"x" = ( +/turf/open/floor/carpet, +/area/template_noop) +"z" = ( +/obj/effect/decal/cleanable/greenglow, +/turf/open/floor/plating, +/area/template_noop) +"A" = ( +/obj/item/reagent_containers/food/drinks/soda_cans/pwr_game{ + pixel_x = -7; + pixel_y = 10 + }, +/obj/item/trash/can, +/turf/open/floor/plating, +/area/template_noop) +"B" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance/two, +/obj/structure/sign/poster/contraband/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"C" = ( +/turf/open/floor/plasteel, +/area/template_noop) +"D" = ( +/obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind{ + pixel_x = 4 + }, +/turf/open/floor/plating, +/area/template_noop) +"E" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating, +/area/template_noop) +"F" = ( +/obj/item/stack/cable_coil/cut, +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel, +/area/template_noop) +"G" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/template_noop) +"M" = ( +/obj/structure/bed, +/obj/item/toy/plush/beeplushie, +/turf/open/floor/plasteel, +/area/template_noop) +"N" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/decal/cleanable/greenglow, +/turf/open/floor/carpet, +/area/template_noop) +"P" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/template_noop) +"Q" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/item/trash/can{ + pixel_x = -10; + pixel_y = 11 + }, +/turf/open/floor/plating, +/area/template_noop) +"R" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/template_noop) +"S" = ( +/obj/structure/falsewall, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/template_noop) +"T" = ( +/obj/structure/closet/crate, +/obj/item/storage/box, +/obj/effect/spawner/lootdrop/maintenance/three, +/turf/open/floor/plating, +/area/template_noop) +"U" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/template_noop) +"V" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance/eight, +/turf/open/floor/plating, +/area/template_noop) +"W" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/template_noop) +"X" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/template_noop) + +(1,1,1) = {" +a +a +e +f +R +a +a +a +a +a +"} +(2,1,1) = {" +a +g +g +g +g +g +g +g +q +W +"} +(3,1,1) = {" +a +g +l +N +D +n +u +g +a +a +"} +(4,1,1) = {" +a +g +i +A +X +x +p +g +j +q +"} +(5,1,1) = {" +z +g +g +m +g +g +S +g +a +a +"} +(6,1,1) = {" +P +g +M +C +g +b +Q +V +a +a +"} +(7,1,1) = {" +a +g +w +B +g +k +F +C +a +f +"} +(8,1,1) = {" +a +g +g +g +g +G +C +g +g +E +"} +(9,1,1) = {" +a +U +T +U +E +a +C +g +t +a +"} +(10,1,1) = {" +a +W +R +W +a +a +a +E +R +r +"} diff --git a/_maps/RandomRooms/10x10/sk_rdm144_smallmagician.dmm b/_maps/RandomRooms/10x10/sk_rdm144_smallmagician.dmm new file mode 100644 index 0000000000000..889cf949c7578 --- /dev/null +++ b/_maps/RandomRooms/10x10/sk_rdm144_smallmagician.dmm @@ -0,0 +1,395 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating, +/area/template_noop) +"b" = ( +/obj/item/trash/boritos, +/turf/open/floor/carpet/red, +/area/template_noop) +"c" = ( +/obj/item/stack/cable_coil/cut, +/turf/open/floor/plating, +/area/template_noop) +"d" = ( +/obj/machinery/vending/boozeomat, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plating, +/area/template_noop) +"e" = ( +/obj/effect/spawner/lootdrop/crate_spawner, +/turf/open/floor/plating, +/area/template_noop) +"f" = ( +/obj/structure/table_frame/wood, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"g" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = -8; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = 5; + pixel_y = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"h" = ( +/obj/item/trash/popcorn, +/turf/open/floor/plating, +/area/template_noop) +"i" = ( +/obj/structure/mirror{ + pixel_y = 26 + }, +/turf/open/floor/carpet, +/area/template_noop) +"j" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/wood, +/area/template_noop) +"k" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/template_noop) +"l" = ( +/turf/closed/wall, +/area/template_noop) +"m" = ( +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"n" = ( +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks/beer, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"o" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/template_noop) +"p" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/wood, +/area/template_noop) +"q" = ( +/obj/structure/chair/stool/bar, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/template_noop) +"r" = ( +/obj/item/trash/can/food/peaches/maint, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/carpet/red, +/area/template_noop) +"s" = ( +/obj/effect/decal/cleanable/oil{ + icon_state = "floor5" + }, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/template_noop) +"t" = ( +/obj/structure/closet/firecloset/full, +/turf/open/floor/plating, +/area/template_noop) +"u" = ( +/obj/structure/closet, +/obj/item/storage/toolbox/mechanical, +/obj/effect/spawner/lootdrop/maintenance/three, +/obj/effect/spawner/lootdrop/gloves, +/turf/open/floor/carpet, +/area/template_noop) +"v" = ( +/obj/structure/closet/crate/trashcart, +/obj/structure/window/reinforced/spawner/west, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/template_noop) +"w" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"x" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/template_noop) +"y" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"z" = ( +/obj/structure/chair/sofa{ + dir = 1 + }, +/turf/open/floor/carpet/red, +/area/template_noop) +"A" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating, +/area/template_noop) +"B" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plating, +/area/template_noop) +"C" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/template_noop) +"D" = ( +/obj/structure/chair/sofa/right{ + dir = 1 + }, +/turf/open/floor/carpet/red, +/area/template_noop) +"E" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance/eight, +/turf/open/floor/plating, +/area/template_noop) +"F" = ( +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"H" = ( +/obj/machinery/vending/autodrobe, +/turf/open/floor/wood, +/area/template_noop) +"I" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"J" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"K" = ( +/obj/machinery/door/airlock/wood, +/turf/open/floor/plating, +/area/template_noop) +"L" = ( +/turf/open/floor/wood, +/area/template_noop) +"M" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/west, +/obj/effect/spawner/lootdrop/gambling, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"N" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/template_noop) +"O" = ( +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/plating, +/area/template_noop) +"P" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/plating, +/area/template_noop) +"Q" = ( +/obj/structure/chair/sofa/left{ + dir = 1 + }, +/turf/open/floor/carpet/red, +/area/template_noop) +"R" = ( +/turf/open/floor/carpet/red, +/area/template_noop) +"S" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/template_noop) +"T" = ( +/obj/structure/window/reinforced/tinted/frosted{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/effect/spawner/lootdrop/glowstick, +/turf/open/floor/carpet, +/area/template_noop) +"U" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/template_noop) +"V" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/template_noop) +"W" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/template_noop) +"X" = ( +/obj/structure/window/reinforced/tinted/frosted{ + dir = 4 + }, +/obj/effect/landmark/start/randommaint/magician, +/obj/structure/chair/stool/bar, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/syndicate_recruitment{ + pixel_x = 4; + pixel_y = 33 + }, +/turf/open/floor/carpet, +/area/template_noop) +"Y" = ( +/turf/open/floor/monotile/steel, +/area/template_noop) +"Z" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) + +(1,1,1) = {" +S +a +C +s +a +a +a +o +a +a +"} +(2,1,1) = {" +A +a +l +l +V +V +l +l +v +I +"} +(3,1,1) = {" +a +O +l +H +L +N +D +r +D +a +"} +(4,1,1) = {" +Z +k +l +p +j +L +z +R +z +o +"} +(5,1,1) = {" +y +E +V +L +U +L +Q +b +Q +a +"} +(6,1,1) = {" +c +B +V +L +L +L +Y +Y +Y +h +"} +(7,1,1) = {" +a +W +l +K +l +l +d +M +g +P +"} +(8,1,1) = {" +a +t +l +i +u +l +F +a +J +q +"} +(9,1,1) = {" +a +e +l +X +T +l +n +m +f +P +"} +(10,1,1) = {" +a +a +Z +a +a +w +a +I +x +a +"} diff --git a/_maps/RandomRooms/10x10/sk_rdm145_ladytesla_altar.dmm b/_maps/RandomRooms/10x10/sk_rdm145_ladytesla_altar.dmm new file mode 100644 index 0000000000000..a6bac408cbece --- /dev/null +++ b/_maps/RandomRooms/10x10/sk_rdm145_ladytesla_altar.dmm @@ -0,0 +1,355 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating, +/area/template_noop) +"b" = ( +/obj/machinery/door/airlock/maintenance/external/glass, +/turf/open/floor/plasteel, +/area/template_noop) +"c" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating, +/area/template_noop) +"f" = ( +/obj/structure/chair/pew{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"g" = ( +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/template_noop) +"i" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/template_noop) +"j" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/template_noop) +"k" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/template_noop) +"l" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"m" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"n" = ( +/obj/item/stack/cable_coil/blue, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"o" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/template_noop) +"p" = ( +/turf/closed/wall, +/area/template_noop) +"q" = ( +/obj/structure/chair/pew{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"r" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/template_noop) +"s" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/structure/table_frame/wood, +/obj/item/stack/cable_coil/cyan, +/obj/machinery/light/small/built{ + dir = 4 + }, +/turf/open/floor/plating, +/area/template_noop) +"u" = ( +/obj/structure/chair/pew/left{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"v" = ( +/obj/structure/chair/pew/right{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"w" = ( +/obj/structure/chair/pew{ + dir = 8 + }, +/obj/machinery/light/small/built{ + dir = 4 + }, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"x" = ( +/obj/structure/chair/pew/right{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"y" = ( +/obj/item/candle/infinite, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"z" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance/eight, +/turf/open/floor/plating, +/area/template_noop) +"A" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/template_noop) +"B" = ( +/obj/effect/decal/cleanable/oil, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/template_noop) +"C" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"D" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken2" + }, +/area/template_noop) +"E" = ( +/obj/item/radio/intercom{ + pixel_y = 26 + }, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"F" = ( +/obj/item/stack/cable_coil/cut/red, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"I" = ( +/obj/item/stack/cable_coil/cyan, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"J" = ( +/obj/item/stack/cable_coil/cyan, +/turf/open/floor/plating, +/area/template_noop) +"K" = ( +/obj/effect/decal/cleanable/oil, +/obj/item/stack/cable_coil/blue, +/turf/open/floor/plating, +/area/template_noop) +"L" = ( +/turf/open/floor/wood, +/area/template_noop) +"N" = ( +/obj/structure/chair/pew{ + dir = 1 + }, +/obj/machinery/light/small/built, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"O" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"Q" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/template_noop) +"R" = ( +/obj/item/cardboard_cutout{ + desc = "A cardboard cutout of the tesla ball generator. You could scribble over it easily."; + icon = 'icons/obj/tesla_engine/tesla_generator.dmi'; + icon_state = "TheSingGen"; + name = "energy ball generator"; + pixel_y = 12 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"S" = ( +/obj/structure/chair/pew/left{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"T" = ( +/obj/structure/table/wood, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"U" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/wood, +/area/template_noop) +"W" = ( +/obj/structure/chair/pew/right{ + dir = 8 + }, +/obj/item/storage/box/holy/follower{ + pixel_x = -4; + pixel_y = 7 + }, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"X" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken" + }, +/area/template_noop) +"Z" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/candle_box, +/obj/machinery/light/small/built, +/turf/open/floor/carpet/royalblue, +/area/template_noop) + +(1,1,1) = {" +a +c +A +a +a +a +K +C +c +a +"} +(2,1,1) = {" +l +p +p +i +i +i +i +p +p +c +"} +(3,1,1) = {" +k +p +E +y +F +L +S +S +p +o +"} +(4,1,1) = {" +a +i +y +R +y +j +f +N +p +a +"} +(5,1,1) = {" +m +i +I +y +n +m +v +v +p +g +"} +(6,1,1) = {" +a +i +L +L +J +U +L +X +b +a +"} +(7,1,1) = {" +a +i +u +q +x +r +T +s +p +m +"} +(8,1,1) = {" +k +p +u +w +W +D +Z +p +p +o +"} +(9,1,1) = {" +c +p +p +p +p +b +p +p +z +c +"} +(10,1,1) = {" +a +c +Q +a +a +a +O +B +c +a +"} diff --git a/_maps/RandomRooms/10x10/sk_rdm146_blastdoor_interchange.dmm b/_maps/RandomRooms/10x10/sk_rdm146_blastdoor_interchange.dmm new file mode 100644 index 0000000000000..e56d686501377 --- /dev/null +++ b/_maps/RandomRooms/10x10/sk_rdm146_blastdoor_interchange.dmm @@ -0,0 +1,483 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aC" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/four, +/turf/open/floor/plasteel, +/area/template_noop) +"aT" = ( +/obj/structure/grille/broken, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/four, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"bd" = ( +/obj/machinery/door/airlock/maintenance/external/glass, +/turf/open/floor/plating, +/area/template_noop) +"bH" = ( +/obj/machinery/button/door{ + id = "maint2"; + name = "Blast Door Control B"; + pixel_y = -24 + }, +/turf/open/floor/plating, +/area/template_noop) +"cU" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/template_noop) +"di" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/six, +/turf/open/floor/plasteel, +/area/template_noop) +"dF" = ( +/obj/structure/grille/broken, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/turf/open/floor/plating, +/area/template_noop) +"eb" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel, +/area/template_noop) +"ec" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/template_noop) +"eD" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/template_noop) +"eQ" = ( +/obj/effect/turf_decal/delivery/red, +/obj/machinery/door/poddoor/preopen{ + id = "maint2" + }, +/turf/open/floor/plating, +/area/template_noop) +"fn" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/template_noop) +"go" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"hh" = ( +/obj/structure/falsewall, +/turf/open/floor/plating, +/area/template_noop) +"hk" = ( +/turf/open/floor/plasteel, +/area/template_noop) +"hM" = ( +/turf/closed/wall, +/area/template_noop) +"hZ" = ( +/turf/open/floor/plating, +/area/template_noop) +"iv" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/template_noop) +"iA" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/template_noop) +"iM" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/delivery/red, +/obj/machinery/door/poddoor/preopen{ + id = "maint2" + }, +/turf/open/floor/plating, +/area/template_noop) +"jc" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 9 + }, +/turf/open/floor/plating, +/area/template_noop) +"kf" = ( +/obj/machinery/button/door{ + id = "maint2"; + name = "Blast Door Control B"; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/template_noop) +"lm" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/gloves, +/turf/open/floor/plasteel, +/area/template_noop) +"lq" = ( +/obj/effect/spawner/lootdrop/glowstick, +/turf/open/floor/plating, +/area/template_noop) +"nf" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/eight, +/turf/open/floor/plating, +/area/template_noop) +"oB" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 5 + }, +/turf/open/floor/plating, +/area/template_noop) +"oE" = ( +/obj/effect/turf_decal/delivery/red, +/obj/machinery/door/poddoor/preopen{ + id = "maint2" + }, +/turf/open/floor/plasteel, +/area/template_noop) +"rm" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/template_noop) +"rP" = ( +/obj/item/storage/pod{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/template_noop) +"sD" = ( +/obj/effect/turf_decal/delivery/red, +/obj/machinery/door/poddoor/preopen{ + id = "maint1" + }, +/turf/open/floor/plating, +/area/template_noop) +"ve" = ( +/obj/machinery/button/door{ + id = "maint1"; + name = "Blast Door Control A"; + pixel_x = 24 + }, +/turf/open/floor/plating, +/area/template_noop) +"vl" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall, +/area/template_noop) +"vq" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plasteel, +/area/template_noop) +"wd" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/emergency, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plating, +/area/template_noop) +"wg" = ( +/obj/structure/rack, +/obj/item/clothing/suit/armor/vest/alt, +/obj/item/clothing/head/helmet/justice/escape, +/turf/open/floor/plating, +/area/template_noop) +"wy" = ( +/obj/structure/barricade/security/ctf, +/turf/open/floor/plating, +/area/template_noop) +"wS" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plating, +/area/template_noop) +"xg" = ( +/obj/item/storage/toolbox/emergency, +/obj/structure/rack, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"xu" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 6 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"xF" = ( +/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/template_noop) +"xK" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/plating, +/area/template_noop) +"yb" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"zk" = ( +/obj/structure/closet/firecloset/full, +/turf/open/floor/plasteel, +/area/template_noop) +"zD" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/obj/effect/turf_decal/stripes, +/turf/open/floor/plating, +/area/template_noop) +"Bi" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"Cq" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/template_noop) +"IK" = ( +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/template_noop) +"Le" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/template_noop) +"LZ" = ( +/obj/machinery/vending/cigarette, +/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/template_noop) +"Nt" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"Nx" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 10 + }, +/turf/open/floor/plating, +/area/template_noop) +"QE" = ( +/obj/effect/spawner/lootdrop/gambling, +/obj/structure/rack, +/obj/machinery/button/door{ + id = "maint1"; + name = "Blast Door Control A"; + pixel_x = -24 + }, +/turf/open/floor/plating, +/area/template_noop) +"Rn" = ( +/obj/structure/grille/broken, +/obj/structure/extinguisher_cabinet{ + pixel_x = 24 + }, +/turf/open/floor/plating, +/area/template_noop) +"Sc" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/plating, +/area/template_noop) +"Sg" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/template_noop) +"Sn" = ( +/obj/structure/barricade/security/ctf, +/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/template_noop) +"Va" = ( +/obj/structure/closet/toolcloset, +/turf/open/floor/plasteel, +/area/template_noop) +"WK" = ( +/obj/machinery/door/airlock/maintenance/external/glass, +/obj/structure/barricade/wooden, +/turf/open/floor/plating, +/area/template_noop) +"XK" = ( +/obj/effect/turf_decal/stripes, +/turf/open/floor/plasteel, +/area/template_noop) + +(1,1,1) = {" +vq +hk +Va +hM +fn +hZ +hM +LZ +Bi +wg +"} +(2,1,1) = {" +eb +Cq +IK +hM +iv +zD +hh +Nt +hZ +wy +"} +(3,1,1) = {" +xg +hZ +hZ +bd +go +bH +hM +xF +wd +Sn +"} +(4,1,1) = {" +hh +hM +hM +vl +sD +sD +vl +WK +hM +hM +"} +(5,1,1) = {" +xK +iv +QE +eQ +xu +oB +iM +eD +cU +iA +"} +(6,1,1) = {" +Le +Rn +hZ +eQ +Nx +jc +oE +ve +Sc +rP +"} +(7,1,1) = {" +hM +hM +bd +vl +sD +sD +vl +hM +hh +hM +"} +(8,1,1) = {" +zk +wS +hZ +hM +kf +hZ +WK +hk +xK +lm +"} +(9,1,1) = {" +zk +lq +XK +hh +dF +cU +hM +yb +rm +nf +"} +(10,1,1) = {" +iv +iv +aT +hM +ec +Sg +hM +aC +di +iv +"} diff --git a/_maps/RandomRooms/10x10/sk_rdm147_advbotany.dmm b/_maps/RandomRooms/10x10/sk_rdm147_advbotany.dmm new file mode 100644 index 0000000000000..8b0d60b3effd7 --- /dev/null +++ b/_maps/RandomRooms/10x10/sk_rdm147_advbotany.dmm @@ -0,0 +1,325 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating, +/area/template_noop) +"c" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/template_noop) +"d" = ( +/turf/open/floor/monotile/steel, +/area/template_noop) +"e" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/bot, +/turf/open/floor/monotile/steel, +/area/template_noop) +"f" = ( +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/door/airlock/maintenance/external/glass, +/turf/open/floor/plating, +/area/template_noop) +"g" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"h" = ( +/obj/machinery/vending/hydroseeds{ + slogan_delay = 700 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"i" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/noslip/dark, +/area/template_noop) +"j" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"m" = ( +/obj/effect/spawner/lootdrop/maintenance/eight, +/obj/structure/rack, +/turf/open/floor/plating, +/area/template_noop) +"n" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/plating, +/area/template_noop) +"o" = ( +/obj/item/seeds/glowshroom, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/template_noop) +"q" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/monotile/steel, +/area/template_noop) +"r" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/template_noop) +"s" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"u" = ( +/obj/machinery/door/airlock/maintenance/external/glass, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/template_noop) +"w" = ( +/turf/closed/wall, +/area/template_noop) +"x" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/template_noop) +"A" = ( +/obj/structure/table/wood, +/obj/item/storage/box/drinkingglasses, +/turf/open/floor/monotile/steel, +/area/template_noop) +"C" = ( +/obj/structure/table/wood, +/obj/item/storage/box/disks_plantgene, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"E" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/template_noop) +"G" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/monotile/steel, +/area/template_noop) +"H" = ( +/obj/structure/closet/firecloset/full, +/obj/item/storage/box/fakesyndiesuit, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/template_noop) +"I" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/landmark/event_spawn, +/turf/open/floor/monotile/steel, +/area/template_noop) +"J" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/noslip/dark, +/area/template_noop) +"K" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/noslip/dark, +/area/template_noop) +"L" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"M" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating, +/area/template_noop) +"O" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"Q" = ( +/obj/effect/spawner/lootdrop/glowstick, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/template_noop) +"T" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"U" = ( +/obj/structure/table/wood, +/obj/item/storage/toolbox/mechanical, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"V" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/monotile/steel, +/area/template_noop) +"X" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/template_noop) +"Y" = ( +/obj/machinery/vending/hydronutrients, +/turf/open/floor/monotile/steel, +/area/template_noop) +"Z" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/template_noop) + +(1,1,1) = {" +a +w +C +A +U +d +a +w +X +a +"} +(2,1,1) = {" +a +q +O +I +O +V +a +c +n +a +"} +(3,1,1) = {" +a +i +e +J +e +K +Z +w +H +a +"} +(4,1,1) = {" +T +i +e +J +e +K +T +w +w +M +"} +(5,1,1) = {" +a +L +s +G +s +j +T +E +a +a +"} +(6,1,1) = {" +Z +w +d +d +d +w +a +r +a +a +"} +(7,1,1) = {" +a +w +g +Y +h +w +f +w +w +M +"} +(8,1,1) = {" +a +w +w +w +w +w +a +c +m +a +"} +(9,1,1) = {" +a +E +x +u +Q +r +Z +w +o +a +"} +(10,1,1) = {" +a +r +a +w +T +E +a +c +a +a +"} diff --git a/_maps/RandomRooms/10x10/sk_rdm148_botany_apiary.dmm b/_maps/RandomRooms/10x10/sk_rdm148_botany_apiary.dmm new file mode 100644 index 0000000000000..7f3be44cacfe0 --- /dev/null +++ b/_maps/RandomRooms/10x10/sk_rdm148_botany_apiary.dmm @@ -0,0 +1,312 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating, +/area/template_noop) +"b" = ( +/obj/machinery/seed_extractor, +/turf/open/floor/grass, +/area/template_noop) +"e" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/template_noop) +"f" = ( +/obj/structure/flora/ausbushes/reedbush{ + pixel_y = 5 + }, +/turf/open/floor/grass, +/area/template_noop) +"g" = ( +/obj/machinery/biogenerator, +/turf/open/floor/grass, +/area/template_noop) +"h" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/liberty, +/turf/open/floor/grass, +/area/template_noop) +"j" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/spray/plantbgone{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/plant_analyzer, +/obj/item/shovel/spade, +/obj/item/cultivator{ + pixel_x = 6 + }, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/grass, +/area/template_noop) +"k" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/cannabis, +/turf/open/floor/grass, +/area/template_noop) +"l" = ( +/mob/living/simple_animal/butterfly, +/turf/open/floor/grass, +/area/template_noop) +"m" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/grass, +/area/template_noop) +"n" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"o" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"q" = ( +/obj/structure/sink/puddle, +/turf/open/floor/grass, +/area/template_noop) +"r" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/cabbage, +/turf/open/floor/grass, +/area/template_noop) +"t" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/template_noop) +"u" = ( +/turf/open/floor/monotile/steel, +/area/template_noop) +"v" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"x" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/grass, +/area/template_noop) +"D" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/bamboo, +/turf/open/floor/grass, +/area/template_noop) +"G" = ( +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/grass, +/area/template_noop) +"H" = ( +/turf/closed/wall, +/area/template_noop) +"J" = ( +/obj/structure/closet{ + name = "beekeeping wardrobe" + }, +/obj/item/clothing/suit/beekeeper_suit, +/obj/item/clothing/suit/beekeeper_suit, +/obj/item/clothing/suit/beekeeper_suit, +/obj/item/clothing/head/beekeeper_head, +/obj/item/clothing/head/beekeeper_head, +/obj/item/clothing/head/beekeeper_head, +/obj/item/melee/flyswatter, +/obj/item/melee/flyswatter, +/obj/item/melee/flyswatter, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/template_noop) +"K" = ( +/obj/item/stack/cable_coil/blue, +/turf/open/floor/plating, +/area/template_noop) +"M" = ( +/obj/structure/flora/ausbushes/ywflowers, +/turf/open/floor/grass, +/area/template_noop) +"N" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating, +/area/template_noop) +"O" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/replicapod, +/turf/open/floor/grass, +/area/template_noop) +"P" = ( +/obj/structure/flora/grass/jungle, +/turf/open/floor/grass, +/area/template_noop) +"Q" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/ambrosia, +/turf/open/floor/grass, +/area/template_noop) +"R" = ( +/obj/structure/closet{ + name = "beekeeping supplies" + }, +/obj/item/honey_frame, +/obj/item/honey_frame, +/obj/item/honey_frame, +/obj/item/honey_frame, +/obj/item/honey_frame, +/obj/item/honey_frame, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/template_noop) +"T" = ( +/obj/structure/beebox, +/turf/open/floor/grass, +/area/template_noop) +"U" = ( +/turf/open/floor/grass, +/area/template_noop) +"X" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/grass, +/area/template_noop) +"Y" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/carrot, +/turf/open/floor/grass, +/area/template_noop) +"Z" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/glowshroom, +/turf/open/floor/grass, +/area/template_noop) + +(1,1,1) = {" +a +N +a +a +a +a +a +o +a +a +"} +(2,1,1) = {" +N +H +e +e +u +u +e +e +H +a +"} +(3,1,1) = {" +a +e +Z +r +U +U +U +h +e +v +"} +(4,1,1) = {" +o +e +Q +U +U +P +U +O +e +a +"} +(5,1,1) = {" +a +n +T +M +X +q +U +R +e +a +"} +(6,1,1) = {" +t +n +T +U +x +f +l +J +e +a +"} +(7,1,1) = {" +a +e +D +G +U +U +m +b +e +a +"} +(8,1,1) = {" +o +e +k +Y +U +U +j +g +e +K +"} +(9,1,1) = {" +a +H +e +e +u +u +e +e +H +N +"} +(10,1,1) = {" +a +a +a +a +a +o +a +a +N +a +"} diff --git a/_maps/RandomRooms/10x10/sk_rdm157_chess.dmm b/_maps/RandomRooms/10x10/sk_rdm157_chess.dmm new file mode 100644 index 0000000000000..ee3a91aba6343 --- /dev/null +++ b/_maps/RandomRooms/10x10/sk_rdm157_chess.dmm @@ -0,0 +1,283 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/carpet/orange, +/area/template_noop) +"b" = ( +/turf/open/floor/monotile/light, +/area/template_noop) +"c" = ( +/turf/open/floor/monotile/dark, +/area/template_noop) +"d" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/carpet/orange, +/area/template_noop) +"e" = ( +/obj/structure/table/wood, +/obj/item/clothing/head/festive, +/turf/open/floor/carpet/orange, +/area/template_noop) +"f" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/carpet/orange, +/area/template_noop) +"g" = ( +/obj/machinery/light/small, +/turf/open/floor/carpet/orange, +/area/template_noop) +"h" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/carpet/orange, +/area/template_noop) +"i" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/rook, +/turf/open/floor/monotile/light, +/area/template_noop) +"j" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/knight, +/turf/open/floor/monotile/dark, +/area/template_noop) +"k" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/bishop, +/turf/open/floor/monotile/light, +/area/template_noop) +"l" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/queen, +/turf/open/floor/monotile/dark, +/area/template_noop) +"m" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/king, +/turf/open/floor/monotile/light, +/area/template_noop) +"n" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/bishop, +/turf/open/floor/monotile/dark, +/area/template_noop) +"o" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/knight, +/turf/open/floor/monotile/light, +/area/template_noop) +"p" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/rook, +/turf/open/floor/monotile/dark, +/area/template_noop) +"q" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/pawn, +/turf/open/floor/monotile/dark, +/area/template_noop) +"r" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/pawn, +/turf/open/floor/monotile/light, +/area/template_noop) +"s" = ( +/obj/item/cardboard_cutout/adaptive/chess/pawn, +/turf/open/floor/monotile/light, +/area/template_noop) +"t" = ( +/obj/item/cardboard_cutout/adaptive/chess/pawn, +/turf/open/floor/monotile/dark, +/area/template_noop) +"u" = ( +/obj/item/cardboard_cutout/adaptive/chess/rook, +/turf/open/floor/monotile/dark, +/area/template_noop) +"v" = ( +/obj/item/cardboard_cutout/adaptive/chess/knight, +/turf/open/floor/monotile/light, +/area/template_noop) +"w" = ( +/obj/item/cardboard_cutout/adaptive/chess/bishop, +/turf/open/floor/monotile/dark, +/area/template_noop) +"x" = ( +/obj/item/cardboard_cutout/adaptive/chess/queen, +/turf/open/floor/monotile/light, +/area/template_noop) +"y" = ( +/obj/item/cardboard_cutout/adaptive/chess/king, +/turf/open/floor/monotile/dark, +/area/template_noop) +"z" = ( +/obj/item/cardboard_cutout/adaptive/chess/bishop, +/turf/open/floor/monotile/light, +/area/template_noop) +"A" = ( +/obj/item/cardboard_cutout/adaptive/chess/knight, +/turf/open/floor/monotile/dark, +/area/template_noop) +"B" = ( +/obj/item/cardboard_cutout/adaptive/chess/rook, +/turf/open/floor/monotile/light, +/area/template_noop) +"C" = ( +/obj/structure/table/wood, +/obj/item/storage/crayons, +/turf/open/floor/carpet/orange, +/area/template_noop) +"D" = ( +/obj/structure/table/wood, +/obj/item/stack/sheet/cardboard/fifty, +/turf/open/floor/carpet/orange, +/area/template_noop) +"E" = ( +/obj/structure/table/wood, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/carpet/orange, +/area/template_noop) +"F" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/soda_cans/tonic{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/tonic{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/tonic{ + pixel_y = -3 + }, +/turf/open/floor/carpet/orange, +/area/template_noop) +"G" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/nachos{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/snacks/nachos{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/snacks/nachos{ + pixel_y = -3 + }, +/turf/open/floor/carpet/orange, +/area/template_noop) + +(1,1,1) = {" +a +a +d +a +a +a +a +d +C +D +"} +(2,1,1) = {" +a +i +q +b +c +b +c +s +u +E +"} +(3,1,1) = {" +h +j +r +c +b +c +b +t +v +g +"} +(4,1,1) = {" +a +k +q +b +c +b +c +s +w +a +"} +(5,1,1) = {" +a +l +r +c +b +c +b +t +x +a +"} +(6,1,1) = {" +a +m +q +b +c +b +c +s +y +a +"} +(7,1,1) = {" +a +n +r +c +b +c +b +t +z +a +"} +(8,1,1) = {" +h +o +q +b +c +b +c +s +A +g +"} +(9,1,1) = {" +e +p +r +c +b +c +b +t +B +a +"} +(10,1,1) = {" +F +G +f +a +a +a +a +f +a +a +"} diff --git a/_maps/RandomRooms/10x5/sk_rdm011_barbershop.dmm b/_maps/RandomRooms/10x5/sk_rdm011_barbershop.dmm index ac353a47ee58b..8a44231d76b33 100644 --- a/_maps/RandomRooms/10x5/sk_rdm011_barbershop.dmm +++ b/_maps/RandomRooms/10x5/sk_rdm011_barbershop.dmm @@ -82,7 +82,7 @@ amount = 2 }, /obj/item/stack/sheet/iron/ten, -/obj/item/twohanded/required/chainsaw, +/obj/item/chainsaw, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/item/clothing/head/wig/random, /obj/item/reagent_containers/medspray/spraytan, @@ -155,7 +155,7 @@ "v" = ( /obj/structure/window/spawner/west, /obj/structure/table/wood, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-18"; pixel_y = 10 }, diff --git a/_maps/RandomRooms/10x5/sk_rdm031_deltarobotics.dmm b/_maps/RandomRooms/10x5/sk_rdm031_deltarobotics.dmm index ef558a1728d31..25da82c1f5ae6 100644 --- a/_maps/RandomRooms/10x5/sk_rdm031_deltarobotics.dmm +++ b/_maps/RandomRooms/10x5/sk_rdm031_deltarobotics.dmm @@ -7,7 +7,7 @@ /turf/open/floor/plasteel, /area/template_noop) "b" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -49,7 +49,7 @@ dir = 1 }, /obj/effect/turf_decal/delivery, -/obj/machinery/mecha_part_fabricator/maint{ +/obj/machinery/modular_fabricator/exosuit_fab/maint{ name = "forgotten exosuit fabricator" }, /turf/open/floor/plasteel, @@ -238,7 +238,7 @@ /turf/open/floor/plating, /area/template_noop) "I" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /obj/item/stack/sheet/mineral/copper, /turf/open/floor/plating, diff --git a/_maps/RandomRooms/10x5/sk_rdm039_deltaclutter1.dmm b/_maps/RandomRooms/10x5/sk_rdm039_deltaclutter1.dmm index 0d7f207c4e857..7ef8d768149cb 100644 --- a/_maps/RandomRooms/10x5/sk_rdm039_deltaclutter1.dmm +++ b/_maps/RandomRooms/10x5/sk_rdm039_deltaclutter1.dmm @@ -14,7 +14,7 @@ /turf/open/floor/plasteel/dark, /area/template_noop) "b" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -45,7 +45,7 @@ /turf/open/floor/wood, /area/template_noop) "e" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/template_noop) "g" = ( @@ -69,7 +69,7 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/template_noop) "j" = ( @@ -147,7 +147,7 @@ }, /area/template_noop) "s" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/template_noop) "t" = ( diff --git a/_maps/RandomRooms/10x5/sk_rdm040_deltabotnis.dmm b/_maps/RandomRooms/10x5/sk_rdm040_deltabotnis.dmm index f561dfb36d54e..8c9f28753f854 100644 --- a/_maps/RandomRooms/10x5/sk_rdm040_deltabotnis.dmm +++ b/_maps/RandomRooms/10x5/sk_rdm040_deltabotnis.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "b" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light/small{ dir = 1 }, @@ -42,7 +42,7 @@ /turf/open/floor/plasteel, /area/template_noop) "g" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/status_display/evac{ pixel_y = 32 }, @@ -98,7 +98,7 @@ /turf/open/floor/plasteel, /area/template_noop) "n" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, diff --git a/_maps/RandomRooms/10x5/sk_rdm045_deltacafeteria.dmm b/_maps/RandomRooms/10x5/sk_rdm045_deltacafeteria.dmm index 60051a87c1dd5..b50f8f034e0e9 100644 --- a/_maps/RandomRooms/10x5/sk_rdm045_deltacafeteria.dmm +++ b/_maps/RandomRooms/10x5/sk_rdm045_deltacafeteria.dmm @@ -31,7 +31,7 @@ /area/template_noop) "c" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/sign/poster/contraband/random{ pixel_y = 32 }, diff --git a/_maps/RandomRooms/10x5/sk_rdm046_deltaarcade.dmm b/_maps/RandomRooms/10x5/sk_rdm046_deltaarcade.dmm index 744226c13234e..750d1edd79252 100644 --- a/_maps/RandomRooms/10x5/sk_rdm046_deltaarcade.dmm +++ b/_maps/RandomRooms/10x5/sk_rdm046_deltaarcade.dmm @@ -119,7 +119,7 @@ /turf/open/floor/plasteel, /area/template_noop) "k" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plating, /area/template_noop) "l" = ( diff --git a/_maps/RandomRooms/10x5/sk_rdm149_cratewindow.dmm b/_maps/RandomRooms/10x5/sk_rdm149_cratewindow.dmm new file mode 100644 index 0000000000000..36e454e424ec9 --- /dev/null +++ b/_maps/RandomRooms/10x5/sk_rdm149_cratewindow.dmm @@ -0,0 +1,208 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating, +/area/template_noop) +"b" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"e" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/sign/warning/vacuum{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/template_noop) +"g" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/closet/firecloset/full, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/template_noop) +"i" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/eight, +/turf/open/floor/plating, +/area/template_noop) +"k" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/template_noop) +"l" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/window/reinforced/spawner, +/turf/open/space/basic, +/area/space) +"m" = ( +/obj/structure/window/reinforced/spawner/north, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"n" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating, +/area/template_noop) +"o" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/template_noop) +"p" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"s" = ( +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plating, +/area/template_noop) +"v" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"z" = ( +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"B" = ( +/obj/structure/window/reinforced/spawner, +/turf/open/space/basic, +/area/space) +"D" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/window/reinforced/spawner/north, +/turf/open/space/basic, +/area/space) +"E" = ( +/obj/structure/window/reinforced/spawner/north, +/turf/open/space/basic, +/area/space) +"F" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/template_noop) +"G" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/five, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/template_noop) +"H" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/window/reinforced/spawner/east, +/turf/open/space/basic, +/area/space) +"K" = ( +/obj/machinery/light, +/turf/open/floor/plating, +/area/template_noop) +"L" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/three, +/turf/open/floor/plating, +/area/template_noop) +"M" = ( +/obj/structure/window/reinforced/spawner/north, +/turf/open/floor/plating, +/area/template_noop) +"U" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/template_noop) +"V" = ( +/obj/structure/window/reinforced/spawner, +/obj/item/radio/intercom{ + pixel_y = 26 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"Z" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/structure/window/reinforced/spawner, +/turf/open/space/basic, +/area/space) + +(1,1,1) = {" +a +a +o +a +a +"} +(2,1,1) = {" +n +i +G +L +K +"} +(3,1,1) = {" +s +D +v +l +M +"} +(4,1,1) = {" +V +E +p +B +M +"} +(5,1,1) = {" +e +E +p +B +M +"} +(6,1,1) = {" +s +E +p +B +m +"} +(7,1,1) = {" +z +E +p +B +M +"} +(8,1,1) = {" +s +H +b +Z +M +"} +(9,1,1) = {" +n +k +U +g +K +"} +(10,1,1) = {" +a +a +F +a +a +"} diff --git a/_maps/RandomRooms/10x5/sk_rdm150_smallmedlobby.dmm b/_maps/RandomRooms/10x5/sk_rdm150_smallmedlobby.dmm new file mode 100644 index 0000000000000..50b8d99a98be7 --- /dev/null +++ b/_maps/RandomRooms/10x5/sk_rdm150_smallmedlobby.dmm @@ -0,0 +1,272 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/plating, +/area/template_noop) +"b" = ( +/obj/machinery/door/airlock/maintenance/external/glass, +/turf/open/floor/plasteel, +/area/template_noop) +"c" = ( +/turf/open/floor/plasteel, +/area/template_noop) +"f" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/spawner/lootdrop/maintenance/three, +/obj/structure/closet/crate, +/turf/open/floor/plasteel, +/area/template_noop) +"g" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/template_noop) +"h" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"i" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"k" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"o" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/template_noop) +"p" = ( +/turf/closed/wall, +/area/template_noop) +"q" = ( +/obj/structure/chair/comfy/teal, +/turf/open/floor/plating, +/area/template_noop) +"s" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/template_noop) +"t" = ( +/obj/item/kirbyplants/random, +/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, +/area/template_noop) +"v" = ( +/obj/item/storage/pod{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/template_noop) +"x" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/three, +/turf/open/floor/plasteel, +/area/template_noop) +"z" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/sign/nanotrasen{ + pixel_y = 32 + }, +/obj/structure/chair/comfy/teal, +/turf/open/floor/plasteel, +/area/template_noop) +"A" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"B" = ( +/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/template_noop) +"D" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/plating, +/area/template_noop) +"G" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/template_noop) +"H" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/chair/comfy/teal, +/obj/item/radio/intercom{ + pixel_y = 26 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"I" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"J" = ( +/obj/structure/table, +/obj/item/folder/white, +/obj/item/wrench/medical, +/obj/structure/sign/poster/official/moth4{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/template_noop) +"K" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/chair/comfy/teal, +/turf/open/floor/plasteel, +/area/template_noop) +"M" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"O" = ( +/obj/machinery/newscaster{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/template_noop) +"S" = ( +/turf/open/floor/plating, +/area/template_noop) +"V" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/template_noop) +"X" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance/five, +/turf/open/floor/plating, +/area/template_noop) + +(1,1,1) = {" +t +I +S +J +a +"} +(2,1,1) = {" +H +S +o +c +f +"} +(3,1,1) = {" +K +i +s +G +x +"} +(4,1,1) = {" +z +c +g +S +M +"} +(5,1,1) = {" +q +i +G +c +M +"} +(6,1,1) = {" +D +c +S +c +S +"} +(7,1,1) = {" +i +c +S +c +X +"} +(8,1,1) = {" +A +V +c +v +X +"} +(9,1,1) = {" +p +p +b +p +p +"} +(10,1,1) = {" +S +O +h +k +B +"} diff --git a/_maps/RandomRooms/10x5/sk_rdm151_ratburger.dmm b/_maps/RandomRooms/10x5/sk_rdm151_ratburger.dmm new file mode 100644 index 0000000000000..8b46022af9388 --- /dev/null +++ b/_maps/RandomRooms/10x5/sk_rdm151_ratburger.dmm @@ -0,0 +1,292 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating, +/area/template_noop) +"b" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/rack, +/obj/item/storage/box/ingredients/carnivore, +/obj/item/reagent_containers/food/snacks/bun, +/obj/item/reagent_containers/food/snacks/bun, +/obj/item/reagent_containers/food/snacks/bun, +/obj/item/reagent_containers/food/snacks/bun, +/obj/item/reagent_containers/food/snacks/bun, +/obj/item/reagent_containers/food/snacks/bun, +/obj/item/reagent_containers/food/snacks/bun, +/turf/open/floor/grass, +/area/template_noop) +"c" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating, +/area/template_noop) +"d" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/deepfryer, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"g" = ( +/obj/structure/window/reinforced/spawner, +/mob/living/simple_animal/mouse/gray, +/turf/open/floor/grass, +/area/template_noop) +"h" = ( +/obj/machinery/door/window, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"i" = ( +/turf/closed/wall, +/area/template_noop) +"l" = ( +/obj/machinery/microwave, +/obj/structure/window/reinforced/spawner, +/obj/structure/table, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"n" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/snacks/burger/rat{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/snacks/burger/rat, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/monotile/steel, +/area/template_noop) +"o" = ( +/obj/structure/chair/stool/bar, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/template_noop) +"p" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall, +/area/template_noop) +"r" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced/spawner/east, +/mob/living/simple_animal/mouse/brown, +/turf/open/floor/grass, +/area/template_noop) +"v" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"w" = ( +/obj/structure/rack, +/obj/item/stack/cable_coil/blue, +/obj/item/stack/cable_coil/blue, +/obj/item/kitchen/knife/butcher, +/obj/item/clothing/suit/hooded/wintercoat/security, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"z" = ( +/mob/living/simple_animal/mouse/brown, +/turf/open/floor/grass, +/area/template_noop) +"A" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/reagent_dispensers/cooking_oil, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"B" = ( +/mob/living/simple_animal/mouse/white, +/turf/open/floor/grass, +/area/template_noop) +"C" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/window/reinforced/spawner/east, +/mob/living/simple_animal/mouse/gray, +/turf/open/floor/grass, +/area/template_noop) +"D" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/window/reinforced/spawner/east, +/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 = 6; + pixel_y = 4 + }, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_y = 6 + }, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = -1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"F" = ( +/obj/structure/table, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/item/reagent_containers/food/snacks/burger/rat{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/snacks/burger/rat{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/reagent_containers/food/snacks/burger/rat, +/turf/open/floor/monotile/steel, +/area/template_noop) +"G" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/template_noop) +"H" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/template_noop) +"I" = ( +/obj/structure/chair/stool/bar, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"J" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/template_noop) +"K" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/reagent_containers/food/snacks/bun, +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"L" = ( +/obj/machinery/door/window/eastright, +/mob/living/simple_animal/mouse/gray, +/turf/open/floor/grass, +/area/template_noop) +"M" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/template_noop) +"N" = ( +/obj/item/trash/popcorn, +/turf/open/floor/plating, +/area/template_noop) +"O" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"Q" = ( +/turf/open/floor/plasteel/cafeteria, +/area/template_noop) +"R" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating, +/area/template_noop) +"S" = ( +/obj/structure/sign/barsign{ + pixel_y = 32 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"T" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/template_noop) +"V" = ( +/obj/structure/window/reinforced/spawner/north, +/mob/living/simple_animal/mouse/white, +/turf/open/floor/grass, +/area/template_noop) +"Y" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/template_noop) + +(1,1,1) = {" +a +a +Y +H +a +"} +(2,1,1) = {" +c +i +p +i +c +"} +(3,1,1) = {" +M +b +B +g +G +"} +(4,1,1) = {" +v +V +z +g +a +"} +(5,1,1) = {" +O +C +L +r +Y +"} +(6,1,1) = {" +S +d +K +l +a +"} +(7,1,1) = {" +a +A +Q +h +a +"} +(8,1,1) = {" +R +D +F +n +G +"} +(9,1,1) = {" +a +w +o +I +N +"} +(10,1,1) = {" +a +J +v +T +a +"} diff --git a/_maps/RandomRooms/10x5/sk_rdm152_geneticsoffice.dmm b/_maps/RandomRooms/10x5/sk_rdm152_geneticsoffice.dmm new file mode 100644 index 0000000000000..b4517241566ac --- /dev/null +++ b/_maps/RandomRooms/10x5/sk_rdm152_geneticsoffice.dmm @@ -0,0 +1,270 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/machinery/dna_scannernew, +/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/template_noop) +"b" = ( +/obj/item/storage/pod{ + pixel_x = 7; + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/template_noop) +"g" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/template_noop) +"j" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating, +/area/template_noop) +"l" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/template_noop) +"q" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/template_noop) +"r" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/template_noop) +"s" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"u" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 1 + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"v" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/template_noop) +"w" = ( +/turf/open/floor/plasteel, +/area/template_noop) +"x" = ( +/obj/machinery/door/airlock/maintenance/external/glass, +/obj/structure/barricade/wooden, +/turf/open/floor/plating, +/area/template_noop) +"y" = ( +/obj/effect/landmark/blobstart, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"B" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance/five, +/turf/open/floor/plating, +/area/template_noop) +"C" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"D" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/template_noop) +"E" = ( +/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/template_noop) +"F" = ( +/obj/item/kirbyplants/random, +/obj/structure/noticeboard{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"H" = ( +/obj/structure/closet/firecloset/full, +/turf/open/floor/plating, +/area/template_noop) +"I" = ( +/obj/structure/chair/office/light, +/turf/open/floor/plasteel, +/area/template_noop) +"J" = ( +/obj/structure/table, +/obj/item/folder/white, +/obj/item/storage/box/disks, +/obj/item/clothing/gloves/color/latex, +/obj/structure/sign/poster/official/bless_this_spess{ + pixel_x = 32 + }, +/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/template_noop) +"L" = ( +/obj/machinery/door/airlock/maintenance/external/glass, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/template_noop) +"M" = ( +/turf/open/floor/plating, +/area/template_noop) +"P" = ( +/obj/item/radio/intercom{ + pixel_y = 26 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating, +/area/template_noop) +"Q" = ( +/turf/closed/wall, +/area/template_noop) +"R" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/five, +/turf/open/floor/plating, +/area/template_noop) +"T" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"V" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/template_noop) +"W" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/template_noop) +"X" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) + +(1,1,1) = {" +M +M +E +s +a +"} +(2,1,1) = {" +P +w +C +I +u +"} +(3,1,1) = {" +x +Q +F +y +J +"} +(4,1,1) = {" +b +Q +D +D +Q +"} +(5,1,1) = {" +q +W +H +B +B +"} +(6,1,1) = {" +M +M +v +X +M +"} +(7,1,1) = {" +X +q +V +g +M +"} +(8,1,1) = {" +j +j +j +Q +L +"} +(9,1,1) = {" +r +M +M +Q +R +"} +(10,1,1) = {" +l +M +T +Q +R +"} diff --git a/_maps/RandomRooms/10x5/sk_rdm153_hobowithpeter.dmm b/_maps/RandomRooms/10x5/sk_rdm153_hobowithpeter.dmm new file mode 100644 index 0000000000000..a60cede69abc7 --- /dev/null +++ b/_maps/RandomRooms/10x5/sk_rdm153_hobowithpeter.dmm @@ -0,0 +1,276 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"c" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/sink/puddle, +/turf/open/floor/grass, +/area/template_noop) +"e" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/template_noop) +"g" = ( +/obj/structure/curtain, +/turf/open/floor/plating, +/area/template_noop) +"h" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"j" = ( +/obj/item/trash/plate, +/turf/open/floor/plasteel, +/area/template_noop) +"l" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/template_noop) +"m" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plasteel, +/area/template_noop) +"n" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"q" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/plating, +/area/template_noop) +"r" = ( +/turf/open/floor/plating, +/area/template_noop) +"s" = ( +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/grass, +/area/template_noop) +"t" = ( +/turf/closed/wall, +/area/template_noop) +"v" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/space_up, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plating, +/area/template_noop) +"w" = ( +/obj/item/trash/boritos, +/turf/open/floor/plating, +/area/template_noop) +"y" = ( +/obj/machinery/shower{ + pixel_y = 16 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/template_noop) +"z" = ( +/obj/item/wirerod, +/obj/structure/table/wood, +/obj/item/storage/belt/utility, +/obj/effect/spawner/lootdrop/gloves, +/turf/open/floor/carpet, +/area/template_noop) +"A" = ( +/obj/structure/window/reinforced/spawner, +/obj/machinery/door/window/eastright, +/turf/open/floor/grass, +/area/template_noop) +"B" = ( +/obj/machinery/modular_computer/console/preset/civilian, +/turf/open/floor/plasteel, +/area/template_noop) +"C" = ( +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"D" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/template_noop) +"E" = ( +/obj/item/trash/can{ + pixel_x = -9; + pixel_y = 6 + }, +/obj/effect/landmark/start/randommaint/hobo, +/turf/open/floor/plasteel, +/area/template_noop) +"F" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/flora/ausbushes/grassybush, +/turf/open/floor/grass, +/area/template_noop) +"G" = ( +/obj/item/trash/candy, +/turf/open/floor/plating, +/area/template_noop) +"H" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/grass, +/area/template_noop) +"I" = ( +/obj/item/trash/can/food/peaches/maint, +/turf/open/floor/plating, +/area/template_noop) +"J" = ( +/mob/living/simple_animal/hostile/retaliate/frog{ + name = "Peter" + }, +/turf/open/floor/grass, +/area/template_noop) +"K" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/template_noop) +"L" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/obj/item/radio/intercom{ + pixel_y = 26 + }, +/turf/open/floor/carpet, +/area/template_noop) +"M" = ( +/obj/machinery/door/airlock/maintenance/external/glass, +/turf/open/floor/plating, +/area/template_noop) +"P" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/item/trash/can/food/beans, +/turf/open/floor/carpet, +/area/template_noop) +"Q" = ( +/obj/item/trash/can, +/turf/open/floor/plating, +/area/template_noop) +"R" = ( +/obj/item/trash/sosjerky{ + pixel_x = -10; + pixel_y = 2 + }, +/turf/open/floor/plasteel, +/area/template_noop) +"T" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/template_noop) +"U" = ( +/obj/structure/closet/firecloset/full, +/turf/open/floor/plating, +/area/template_noop) +"W" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/spawner/lootdrop/gambling, +/turf/open/floor/plasteel, +/area/template_noop) +"X" = ( +/obj/structure/toilet{ + dir = 8 + }, +/turf/open/floor/plating, +/area/template_noop) +"Y" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/template_noop) +"Z" = ( +/turf/open/floor/plasteel, +/area/template_noop) + +(1,1,1) = {" +J +F +I +r +a +"} +(2,1,1) = {" +H +c +v +Y +U +"} +(3,1,1) = {" +s +A +B +q +W +"} +(4,1,1) = {" +h +C +E +w +R +"} +(5,1,1) = {" +T +Q +l +D +m +"} +(6,1,1) = {" +K +j +e +G +T +"} +(7,1,1) = {" +t +t +Z +t +t +"} +(8,1,1) = {" +y +M +n +M +P +"} +(9,1,1) = {" +g +t +Z +t +L +"} +(10,1,1) = {" +X +t +T +t +z +"} diff --git a/_maps/RandomRooms/10x5/sk_rdm154_butchersden.dmm b/_maps/RandomRooms/10x5/sk_rdm154_butchersden.dmm new file mode 100644 index 0000000000000..5eb90b2ecf24d --- /dev/null +++ b/_maps/RandomRooms/10x5/sk_rdm154_butchersden.dmm @@ -0,0 +1,222 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/spawner/lootdrop/maintenance/five, +/obj/structure/rack, +/turf/open/floor/plating, +/area/template_noop) +"c" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/template_noop) +"d" = ( +/obj/structure/closet/toolcloset, +/obj/item/clothing/suit/straight_jacket, +/turf/open/floor/plating, +/area/template_noop) +"k" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/structure/table, +/obj/structure/window/reinforced/spawner/north, +/obj/item/gun/syringe, +/turf/open/floor/plating, +/area/template_noop) +"l" = ( +/obj/machinery/status_display/ai{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/template_noop) +"o" = ( +/obj/effect/mapping_helpers/dead_body_placer, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/closet/secure_closet/freezer/meat, +/turf/open/floor/plating, +/area/template_noop) +"u" = ( +/turf/closed/wall, +/area/template_noop) +"w" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"x" = ( +/obj/machinery/gibber, +/obj/structure/window/reinforced/spawner/north, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/template_noop) +"y" = ( +/obj/machinery/computer/crew{ + dir = 4 + }, +/turf/open/floor/plating, +/area/template_noop) +"z" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/structure/window/reinforced/spawner/north, +/turf/open/floor/plating, +/area/template_noop) +"B" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/template_noop) +"C" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/template_noop) +"E" = ( +/obj/effect/mapping_helpers/dead_body_placer, +/obj/structure/closet/secure_closet/freezer/meat, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/template_noop) +"F" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/template_noop) +"G" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/five, +/turf/open/floor/plating, +/area/template_noop) +"H" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/template_noop) +"J" = ( +/turf/open/floor/plating, +/area/template_noop) +"K" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/template_noop) +"L" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/template_noop) +"M" = ( +/obj/machinery/door/airlock/maintenance/external/glass, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/template_noop) +"N" = ( +/obj/effect/mapping_helpers/dead_body_placer, +/obj/structure/closet/secure_closet/freezer/meat, +/obj/effect/decal/cleanable/blood/old, +/obj/item/kitchen/knife/butcher, +/turf/open/floor/plating, +/area/template_noop) +"O" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/turf/open/floor/plating, +/area/template_noop) +"P" = ( +/obj/structure/bed, +/turf/open/floor/plating, +/area/template_noop) +"Q" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"R" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/template_noop) +"S" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/template_noop) +"W" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"X" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating, +/area/template_noop) +"Y" = ( +/obj/machinery/computer/med_data{ + dir = 4 + }, +/turf/open/floor/plating, +/area/template_noop) + +(1,1,1) = {" +G +L +J +M +a +"} +(2,1,1) = {" +S +S +l +u +u +"} +(3,1,1) = {" +O +x +F +Y +y +"} +(4,1,1) = {" +P +k +w +F +J +"} +(5,1,1) = {" +J +z +H +c +F +"} +(6,1,1) = {" +C +J +R +W +J +"} +(7,1,1) = {" +J +F +o +E +N +"} +(8,1,1) = {" +Q +X +u +u +u +"} +(9,1,1) = {" +J +F +M +J +K +"} +(10,1,1) = {" +w +J +u +d +B +"} diff --git a/_maps/RandomRooms/10x5/sk_rdm155_punjiconveyor.dmm b/_maps/RandomRooms/10x5/sk_rdm155_punjiconveyor.dmm new file mode 100644 index 0000000000000..931cf04b408a4 --- /dev/null +++ b/_maps/RandomRooms/10x5/sk_rdm155_punjiconveyor.dmm @@ -0,0 +1,168 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/template_noop) +"d" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"i" = ( +/obj/machinery/conveyor_switch/oneway{ + dir = 1; + id = "punji_conveyor"; + name = "punji conveyor switch" + }, +/turf/open/floor/plating, +/area/template_noop) +"m" = ( +/turf/open/floor/plating, +/area/template_noop) +"n" = ( +/obj/structure/punji_sticks, +/obj/item/restraints/handcuffs/cable, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"r" = ( +/obj/item/wirerod, +/turf/open/floor/plating, +/area/template_noop) +"s" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/template_noop) +"t" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/template_noop) +"w" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/template_noop) +"x" = ( +/obj/item/trash/can/food/beans, +/turf/open/floor/plating, +/area/template_noop) +"z" = ( +/obj/item/stack/sheet/animalhide, +/turf/open/floor/plating, +/area/template_noop) +"B" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating, +/area/template_noop) +"H" = ( +/obj/item/trash/can{ + pixel_x = -9; + pixel_y = 6 + }, +/turf/open/floor/plating, +/area/template_noop) +"I" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "punji_conveyor" + }, +/turf/open/floor/plating, +/area/template_noop) +"M" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"P" = ( +/obj/item/trash/sosjerky{ + pixel_x = -10; + pixel_y = 2 + }, +/turf/open/floor/plating, +/area/template_noop) +"Z" = ( +/obj/structure/closet{ + name = "beekeeping wardrobe" + }, +/obj/item/bedsheet/random, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/template_noop) + +(1,1,1) = {" +a +B +m +B +a +"} +(2,1,1) = {" +m +w +w +w +m +"} +(3,1,1) = {" +P +s +n +w +d +"} +(4,1,1) = {" +m +i +I +w +d +"} +(5,1,1) = {" +z +s +I +w +m +"} +(6,1,1) = {" +m +w +I +s +x +"} +(7,1,1) = {" +M +s +I +s +d +"} +(8,1,1) = {" +m +s +w +s +m +"} +(9,1,1) = {" +m +H +M +r +m +"} +(10,1,1) = {" +Z +B +m +B +t +"} diff --git a/_maps/RandomRooms/10x5/sk_rdm156_oldairlock_interchange.dmm b/_maps/RandomRooms/10x5/sk_rdm156_oldairlock_interchange.dmm new file mode 100644 index 0000000000000..cead15850548a --- /dev/null +++ b/_maps/RandomRooms/10x5/sk_rdm156_oldairlock_interchange.dmm @@ -0,0 +1,134 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating, +/area/template_noop) +"c" = ( +/turf/open/floor/plating, +/area/template_noop) +"d" = ( +/obj/effect/spawner/lootdrop/maintenance/two, +/obj/structure/rack, +/turf/open/floor/plating, +/area/template_noop) +"f" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/template_noop) +"i" = ( +/turf/closed/wall, +/area/template_noop) +"m" = ( +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plating, +/area/template_noop) +"n" = ( +/turf/open/floor/plasteel, +/area/template_noop) +"u" = ( +/obj/machinery/door/airlock/maintenance/external/glass, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/template_noop) +"w" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/template_noop) +"A" = ( +/obj/structure/closet/toolcloset, +/obj/item/storage/belt/bandolier, +/obj/effect/spawner/lootdrop/gambling, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plating, +/area/template_noop) +"B" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/template_noop) +"M" = ( +/obj/item/trash/boritos, +/turf/open/floor/plasteel, +/area/template_noop) +"T" = ( +/obj/effect/spawner/lootdrop/maintenance/two, +/obj/structure/closet/secure_closet/personal, +/obj/item/trash/can/food/peaches/maint, +/turf/open/floor/plating, +/area/template_noop) +"V" = ( +/obj/structure/closet/firecloset/full, +/turf/open/floor/plating, +/area/template_noop) + +(1,1,1) = {" +V +i +m +c +a +"} +(2,1,1) = {" +c +u +c +B +a +"} +(3,1,1) = {" +i +i +i +u +i +"} +(4,1,1) = {" +a +a +B +c +A +"} +(5,1,1) = {" +n +M +f +w +n +"} +(6,1,1) = {" +c +n +f +n +c +"} +(7,1,1) = {" +c +B +c +a +a +"} +(8,1,1) = {" +i +u +i +i +i +"} +(9,1,1) = {" +a +c +f +u +c +"} +(10,1,1) = {" +a +T +c +i +d +"} diff --git a/_maps/RandomRooms/3x3/sk_rdm069_pubbyartism.dmm b/_maps/RandomRooms/3x3/sk_rdm069_pubbyartism.dmm index 2e368c673f2fe..a9413d10ef0e0 100644 --- a/_maps/RandomRooms/3x3/sk_rdm069_pubbyartism.dmm +++ b/_maps/RandomRooms/3x3/sk_rdm069_pubbyartism.dmm @@ -12,9 +12,9 @@ /area/template_noop) "c" = ( /obj/structure/closet, -/obj/item/canvas/twentythreeXnineteen, -/obj/item/canvas/nineteenXnineteen, -/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythree_nineteen, +/obj/item/canvas/nineteen_nineteen, +/obj/item/canvas/twentythree_twentythree, /obj/item/storage/crayons, /turf/open/floor/plating, /area/template_noop) diff --git a/_maps/RandomRooms/3x5/sk_rdm063_pubbyclutter5.dmm b/_maps/RandomRooms/3x5/sk_rdm063_pubbyclutter5.dmm index 70e37e6979b38..55a012260e894 100644 --- a/_maps/RandomRooms/3x5/sk_rdm063_pubbyclutter5.dmm +++ b/_maps/RandomRooms/3x5/sk_rdm063_pubbyclutter5.dmm @@ -32,7 +32,7 @@ /area/template_noop) "h" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/ammo_box/foambox, /obj/item/ammo_box/foambox, diff --git a/_maps/RandomRooms/5x3/sk_rdm042_deltaclutter2.dmm b/_maps/RandomRooms/5x3/sk_rdm042_deltaclutter2.dmm index 04e21d9b120ce..3b05724c7a235 100644 --- a/_maps/RandomRooms/5x3/sk_rdm042_deltaclutter2.dmm +++ b/_maps/RandomRooms/5x3/sk_rdm042_deltaclutter2.dmm @@ -1,15 +1,15 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( /obj/structure/easel, -/obj/item/canvas/twentythreeXtwentythree, -/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/template_noop) "b" = ( /obj/structure/easel, -/obj/item/canvas/twentythreeXtwentythree, -/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, /turf/open/floor/wood{ icon_state = "wood-broken7" }, @@ -20,8 +20,8 @@ /area/template_noop) "d" = ( /obj/structure/table/wood, -/obj/item/canvas/twentythreeXnineteen, -/obj/item/canvas/nineteenXnineteen, +/obj/item/canvas/twentythree_nineteen, +/obj/item/canvas/nineteen_nineteen, /obj/item/storage/crayons, /obj/item/storage/crayons, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/RandomRooms/5x3/sk_rdm061_pubbyclutter4.dmm b/_maps/RandomRooms/5x3/sk_rdm061_pubbyclutter4.dmm index 35eb9374f83a3..be79f1651a9ea 100644 --- a/_maps/RandomRooms/5x3/sk_rdm061_pubbyclutter4.dmm +++ b/_maps/RandomRooms/5x3/sk_rdm061_pubbyclutter4.dmm @@ -42,7 +42,7 @@ /area/template_noop) "j" = ( /obj/structure/grille/broken, -/obj/structure/piano, +/obj/structure/musician/piano, /turf/open/floor/plating, /area/template_noop) "k" = ( diff --git a/_maps/RandomRooms/5x3/sk_rdm080_cloner.dmm b/_maps/RandomRooms/5x3/sk_rdm080_cloner.dmm index 9c52394b2f719..b5c795c798ba7 100644 --- a/_maps/RandomRooms/5x3/sk_rdm080_cloner.dmm +++ b/_maps/RandomRooms/5x3/sk_rdm080_cloner.dmm @@ -57,7 +57,7 @@ /turf/open/floor/plasteel/white, /area/template_noop) "e" = ( -/obj/machinery/computer/prototype_cloning, +/obj/machinery/computer/cloning/prototype, /obj/machinery/light{ dir = 1 }, diff --git a/_maps/RandomRooms/5x4/sk_rdm034_deltadetective.dmm b/_maps/RandomRooms/5x4/sk_rdm034_deltadetective.dmm index 39346033909c5..d471d9600e4c3 100644 --- a/_maps/RandomRooms/5x4/sk_rdm034_deltadetective.dmm +++ b/_maps/RandomRooms/5x4/sk_rdm034_deltadetective.dmm @@ -22,7 +22,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/sign/poster/official/do_not_question{ pixel_x = 32 }, diff --git a/_maps/RandomRooms/5x4/sk_rdm035_deltasurgery.dmm b/_maps/RandomRooms/5x4/sk_rdm035_deltasurgery.dmm index 38a5d247d3ebf..e3b7adfc65698 100644 --- a/_maps/RandomRooms/5x4/sk_rdm035_deltasurgery.dmm +++ b/_maps/RandomRooms/5x4/sk_rdm035_deltasurgery.dmm @@ -44,7 +44,7 @@ /turf/open/floor/plasteel, /area/template_noop) "e" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/template_noop) diff --git a/_maps/RandomRooms/5x4/sk_rdm041_deltagamble.dmm b/_maps/RandomRooms/5x4/sk_rdm041_deltagamble.dmm index aa3dd7a2e476d..4a5014cc128d0 100644 --- a/_maps/RandomRooms/5x4/sk_rdm041_deltagamble.dmm +++ b/_maps/RandomRooms/5x4/sk_rdm041_deltagamble.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light/small{ dir = 8 }, @@ -16,12 +16,12 @@ /turf/open/floor/wood, /area/template_noop) "d" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/template_noop) "e" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/template_noop) "f" = ( @@ -41,13 +41,6 @@ /obj/effect/spawner/lootdrop/trap/reusable, /turf/open/floor/carpet/green, /area/template_noop) -"i" = ( -/obj/structure/table/wood, -/obj/item/toy/cards/deck/syndicate{ - pixel_y = 6 - }, -/turf/open/floor/carpet/green, -/area/template_noop) "j" = ( /turf/open/floor/wood, /area/template_noop) @@ -91,6 +84,12 @@ icon_state = "wood-broken4" }, /area/template_noop) +"Z" = ( +/obj/structure/table/wood, +/obj/item/toy/cards/deck, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/carpet/green, +/area/template_noop) (1,1,1) = {" a @@ -101,7 +100,7 @@ l (2,1,1) = {" b g -i +Z m "} (3,1,1) = {" diff --git a/_maps/RandomRooms/5x4/sk_rdm047_metarobotics.dmm b/_maps/RandomRooms/5x4/sk_rdm047_metarobotics.dmm index a5c1bfc74f307..3119100ed1e4a 100644 --- a/_maps/RandomRooms/5x4/sk_rdm047_metarobotics.dmm +++ b/_maps/RandomRooms/5x4/sk_rdm047_metarobotics.dmm @@ -12,7 +12,7 @@ /turf/open/floor/plating, /area/template_noop) "d" = ( -/obj/machinery/mecha_part_fabricator/maint{ +/obj/machinery/modular_fabricator/exosuit_fab/maint{ name = "forgotten exosuit fabricator" }, /turf/open/floor/plating, diff --git a/_maps/RandomRooms/5x4/sk_rdm048_metatheatre.dmm b/_maps/RandomRooms/5x4/sk_rdm048_metatheatre.dmm index 8ebd3fe3f6873..6d17dc77c606b 100644 --- a/_maps/RandomRooms/5x4/sk_rdm048_metatheatre.dmm +++ b/_maps/RandomRooms/5x4/sk_rdm048_metatheatre.dmm @@ -6,7 +6,7 @@ /area/template_noop) "b" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance/three, /turf/open/floor/plating, diff --git a/_maps/RandomRooms/5x4/sk_rdm076_kilohauntedlibrary.dmm b/_maps/RandomRooms/5x4/sk_rdm076_kilohauntedlibrary.dmm index 30e5464634e19..91df780ffe772 100644 --- a/_maps/RandomRooms/5x4/sk_rdm076_kilohauntedlibrary.dmm +++ b/_maps/RandomRooms/5x4/sk_rdm076_kilohauntedlibrary.dmm @@ -158,7 +158,7 @@ /turf/open/floor/plasteel/dark, /area/template_noop) "q" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/effect/turf_decal/tile/neutral, diff --git a/_maps/RandomRooms/5x4/sk_rdm090_tinybarbershop.dmm b/_maps/RandomRooms/5x4/sk_rdm090_tinybarbershop.dmm index e9b6cc82f612f..20ac4fee0c5c1 100644 --- a/_maps/RandomRooms/5x4/sk_rdm090_tinybarbershop.dmm +++ b/_maps/RandomRooms/5x4/sk_rdm090_tinybarbershop.dmm @@ -97,7 +97,7 @@ amount = 2 }, /obj/item/stack/sheet/iron/ten, -/obj/item/twohanded/required/chainsaw, +/obj/item/chainsaw, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/item/clothing/head/wig/random, /obj/item/radio, diff --git a/_maps/RandomRooms/5x4/sk_rdm121_honkaccident.dmm b/_maps/RandomRooms/5x4/sk_rdm121_honkaccident.dmm index 7c68eaa72bc72..4b9af13d66c1a 100644 --- a/_maps/RandomRooms/5x4/sk_rdm121_honkaccident.dmm +++ b/_maps/RandomRooms/5x4/sk_rdm121_honkaccident.dmm @@ -78,12 +78,6 @@ }, /turf/open/floor/plasteel, /area/template_noop) -"k" = ( -/turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" - }, -/area/space) "l" = ( /obj/effect/spawner/lootdrop/clowntrap, /turf/open/floor/plating{ @@ -125,7 +119,7 @@ j (3,1,1) = {" e O -k +b m "} (4,1,1) = {" diff --git a/_maps/RandomRooms/5x4/sk_rdm124_oldcryoroom.dmm b/_maps/RandomRooms/5x4/sk_rdm124_oldcryoroom.dmm index d71aa87da80bb..98abcef9c7baf 100644 --- a/_maps/RandomRooms/5x4/sk_rdm124_oldcryoroom.dmm +++ b/_maps/RandomRooms/5x4/sk_rdm124_oldcryoroom.dmm @@ -3,13 +3,13 @@ /obj/structure/table/glass, /obj/item/reagent_containers/glass/beaker/cryoxadone, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, +/turf/open/floor/plasteel/freezer, /area/template_noop) "b" = ( /obj/machinery/atmospherics/components/unary/cryo_cell, /obj/effect/turf_decal/stripes/end, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, +/turf/open/floor/plasteel/freezer, /area/template_noop) "c" = ( /obj/effect/turf_decal/stripes/line{ @@ -17,7 +17,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, +/turf/open/floor/plasteel/freezer, /area/template_noop) "d" = ( /obj/structure/showcase/machinery/cloning_pod, @@ -29,11 +29,11 @@ /obj/effect/turf_decal/bot_red, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, +/turf/open/floor/plasteel/freezer, /area/template_noop) "f" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, +/turf/open/floor/plasteel/freezer, /area/template_noop) "g" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, @@ -46,7 +46,7 @@ "h" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/lootdrop/trap/reusable, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, +/turf/open/floor/plasteel/freezer, /area/template_noop) "i" = ( /obj/item/wrench/medical, @@ -59,18 +59,18 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, +/turf/open/floor/plasteel/freezer, /area/template_noop) "k" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer, /obj/effect/turf_decal/stripes/end{ - icon_state = "warn_end"; - dir = 4 + dir = 4; + icon_state = "warn_end" }, /obj/machinery/light{ dir = 8 }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, +/turf/open/floor/plasteel/freezer, /area/template_noop) "l" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ @@ -78,7 +78,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, +/turf/open/floor/plasteel/freezer, /area/template_noop) "m" = ( /obj/machinery/stasis, @@ -95,26 +95,26 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/delivery/red, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, +/turf/open/floor/plasteel/freezer, /area/template_noop) "o" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 9 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, +/turf/open/floor/plasteel/freezer, /area/template_noop) "p" = ( /obj/machinery/computer/med_data{ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, +/turf/open/floor/plasteel/freezer, /area/template_noop) "q" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, +/turf/open/floor/plasteel/freezer, /area/template_noop) "r" = ( /obj/effect/decal/cleanable/dirt, diff --git a/_maps/RandomRooms/5x4/sk_rdm136_tinycluwnealtar.dmm b/_maps/RandomRooms/5x4/sk_rdm136_tinycluwnealtar.dmm deleted file mode 100644 index 5b19b585c3796..0000000000000 --- a/_maps/RandomRooms/5x4/sk_rdm136_tinycluwnealtar.dmm +++ /dev/null @@ -1,73 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plating, -/area/space) -"f" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plating, -/area/space) -"h" = ( -/turf/open/floor/plating, -/area/space) -"i" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/sepia, -/area/space) -"l" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/sepia, -/area/space) -"E" = ( -/obj/effect/trap/nexus/cluwnecurse, -/obj/effect/trap/nexus/darkness, -/obj/effect/trap/nexus/doorbolt, -/obj/effect/trap/trigger/all, -/obj/effect/rune/cluwne, -/turf/open/floor/light, -/area/space) -"Q" = ( -/turf/open/floor/sepia, -/area/space) -"Y" = ( -/turf/open/floor/stone, -/area/space) - -(1,1,1) = {" -i -Q -h -a -"} -(2,1,1) = {" -Q -Y -Y -Y -"} -(3,1,1) = {" -h -Y -E -Y -"} -(4,1,1) = {" -Q -Y -Y -Y -"} -(5,1,1) = {" -l -Q -h -f -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index 812e2b7886ce0..a1606179832ad 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -485,7 +485,7 @@ dir = 4 }, /turf/open/floor/pod/dark{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/powered/beach) "lM" = ( @@ -608,7 +608,7 @@ dir = 8 }, /turf/open/floor/pod/dark{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/powered/beach) "VO" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm index 4616fee83efd5..48475d1bcbf90 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm @@ -823,7 +823,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bC" = ( @@ -868,7 +868,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bH" = ( @@ -877,7 +877,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bI" = ( @@ -938,7 +938,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bP" = ( @@ -966,8 +966,8 @@ /turf/open/floor/carpet, /area/ruin/powered/clownplanet) "bT" = ( -/obj/item/slime_extract/rainbow, /obj/structure/table/glass, +/obj/item/reagent_containers/spray/waterflower/superlube, /turf/open/floor/carpet, /area/ruin/powered/clownplanet) "bU" = ( @@ -985,7 +985,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bY" = ( @@ -995,7 +995,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bZ" = ( @@ -1004,7 +1004,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "ca" = ( @@ -1014,7 +1014,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "cc" = ( @@ -1198,7 +1198,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "dO" = ( @@ -1207,13 +1207,13 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "eX" = ( /obj/effect/mapping_helpers/no_lava, /turf/open/floor/noslip{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/explored) "gX" = ( @@ -1239,7 +1239,7 @@ /obj/effect/decal/cleanable/blood/old, /obj/effect/mapping_helpers/no_lava, /turf/open/floor/noslip{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/explored) "Hj" = ( @@ -1276,7 +1276,7 @@ /obj/structure/disposalpipe/trunk, /obj/effect/mapping_helpers/no_lava, /turf/open/floor/noslip{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/powered/clownplanet) "Mv" = ( @@ -1298,14 +1298,14 @@ }, /obj/effect/mapping_helpers/no_lava, /turf/open/floor/noslip{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/powered/clownplanet) "Xm" = ( /obj/item/clothing/head/cone, /obj/effect/mapping_helpers/no_lava, /turf/open/floor/noslip{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/explored) "XO" = ( @@ -1323,7 +1323,7 @@ /obj/machinery/light/small, /obj/effect/mapping_helpers/no_lava, /turf/open/floor/noslip{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/powered/clownplanet) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm index c62059dc3b8d1..849c53ab6ef38 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm @@ -8,13 +8,13 @@ /area/lavaland/surface/outdoors) "ac" = ( /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "ad" = ( /obj/structure/flora/ausbushes/brflowers, /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "ae" = ( @@ -138,7 +138,7 @@ /obj/item/bodybag, /obj/item/reagent_containers/food/drinks/bottle/vodka, /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "ay" = ( @@ -210,7 +210,7 @@ /area/ruin/powered/animal_hospital) "aJ" = ( /turf/open/floor/plasteel/grimy{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "aK" = ( @@ -361,7 +361,7 @@ /turf/open/floor/plasteel, /area/ruin/powered/animal_hospital) "bt" = ( -/obj/item/twohanded/required/kirbyplants, +/obj/item/kirbyplants, /turf/open/floor/plasteel, /area/ruin/powered/animal_hospital) "bu" = ( @@ -427,19 +427,19 @@ dir = 4 }, /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "bM" = ( /obj/structure/flora/ausbushes/sunnybush, /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "bO" = ( /obj/structure/flora/ausbushes/ppflowers, /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "bP" = ( @@ -510,7 +510,7 @@ dir = 6 }, /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "bY" = ( @@ -518,7 +518,7 @@ dir = 1 }, /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "bZ" = ( @@ -526,7 +526,7 @@ dir = 10 }, /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "ca" = ( @@ -534,13 +534,13 @@ dir = 1 }, /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "cb" = ( /obj/machinery/atmospherics/components/binary/valve, /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "ch" = ( @@ -579,7 +579,7 @@ "cn" = ( /obj/machinery/light, /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "cp" = ( @@ -594,7 +594,7 @@ dir = 4 }, /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "cy" = ( @@ -624,7 +624,7 @@ dir = 1 }, /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "cD" = ( @@ -633,7 +633,7 @@ dir = 1 }, /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "cE" = ( @@ -1450,7 +1450,7 @@ "Zg" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on, /turf/open/floor/grass{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/powered/animal_hospital) "Zx" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index 7d185c0a5adc2..1587a00788e06 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -180,7 +180,6 @@ /obj/structure/stone_tile/cracked{ dir = 8 }, -/obj/item/malf_upgrade, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "aB" = ( @@ -563,6 +562,7 @@ /obj/item/stack/sheet/mineral/wood, /obj/item/stack/sheet/mineral/wood, /obj/item/seeds/tower, +/obj/item/seeds/bamboo, /turf/open/indestructible/boss, /area/ruin/unpowered/ash_walkers) "bx" = ( @@ -685,7 +685,7 @@ /area/lavaland/surface/outdoors) "bP" = ( /obj/structure/stone_tile/block, -/obj/item/twohanded/spear, +/obj/item/spear/bonespear, /obj/effect/mapping_helpers/no_lava, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) @@ -857,7 +857,7 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "ck" = ( -/obj/item/twohanded/spear, +/obj/item/spear/bonespear, /obj/structure/stone_tile{ dir = 4 }, @@ -871,7 +871,7 @@ /obj/structure/stone_tile/cracked{ dir = 8 }, -/obj/item/twohanded/spear, +/obj/item/spear/bonespear, /obj/effect/mapping_helpers/no_lava, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) @@ -975,7 +975,7 @@ /obj/structure/stone_tile/cracked{ dir = 1 }, -/obj/item/twohanded/spear, +/obj/item/spear/bonespear, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "cA" = ( @@ -1019,8 +1019,8 @@ dir = 1 }, /obj/structure/table/wood, -/obj/item/twohanded/spear, -/obj/item/storage/belt, +/obj/item/spear/bonespear, +/obj/item/storage/belt/mining/primitive, /turf/open/indestructible/boss, /area/ruin/unpowered/ash_walkers) "cI" = ( @@ -1058,7 +1058,19 @@ dir = 8 }, /obj/structure/table/wood, -/obj/item/twohanded/spear, +/obj/item/spear/bonespear, +/obj/item/storage/belt/quiver, +/obj/item/ammo_casing/caseless/arrow/bone, +/obj/item/ammo_casing/caseless/arrow/bone, +/obj/item/ammo_casing/caseless/arrow/bone, +/obj/item/ammo_casing/caseless/arrow/bone, +/obj/item/ammo_casing/caseless/arrow/bone, +/obj/item/ammo_casing/caseless/arrow/bone, +/obj/item/ammo_casing/caseless/arrow/bone, +/obj/item/ammo_casing/caseless/arrow/bone, +/obj/item/ammo_casing/caseless/arrow/bone, +/obj/item/ammo_casing/caseless/arrow/bone, +/obj/item/gun/ballistic/bow/ashen, /turf/open/indestructible/boss, /area/ruin/unpowered/ash_walkers) "cN" = ( @@ -1073,7 +1085,7 @@ dir = 4 }, /obj/structure/table/wood, -/obj/item/twohanded/spear, +/obj/item/spear/bonespear, /obj/item/clothing/head/helmet/roman/legionnaire, /turf/open/indestructible/boss, /area/ruin/unpowered/ash_walkers) @@ -1376,7 +1388,7 @@ dir = 4 }, /obj/structure/table/wood, -/obj/item/twohanded/spear, +/obj/item/spear/bonespear, /obj/item/scythe, /obj/item/cultivator, /turf/open/indestructible/boss, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm index be870f28ce0b2..d7f02bc2c09f6 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm @@ -305,7 +305,7 @@ }, /obj/effect/mapping_helpers/no_lava, /turf/open/floor/pod/dark{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/powered/snow_biodome) "qt" = ( @@ -367,7 +367,7 @@ /turf/open/floor/pod/dark, /area/ruin/powered/snow_biodome) "KS" = ( -/obj/item/twohanded/required/chainsaw, +/obj/item/chainsaw, /obj/structure/closet, /obj/machinery/light/small{ dir = 4 diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm index ac268d97e7962..206189a8defc7 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm @@ -4,7 +4,7 @@ /area/template_noop) "b" = ( /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "c" = ( @@ -24,21 +24,21 @@ "g" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "i" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "k" = ( /obj/effect/decal/remains/human, /obj/item/melee/cultblade, /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "l" = ( @@ -46,13 +46,13 @@ /obj/item/clothing/shoes/cult, /obj/item/clothing/suit/cultrobes, /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "m" = ( /obj/effect/decal/remains/human, /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "o" = ( @@ -74,7 +74,7 @@ name = "ohfuck" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "q" = ( @@ -83,7 +83,7 @@ /obj/item/clothing/suit/cultrobes, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "s" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm index ab4ff80420509..0422b1b4b4255 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm @@ -9,13 +9,10 @@ /obj/item/clockwork/alloy_shards/small, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/unexplored) -"d" = ( -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/unexplored) "e" = ( /obj/item/stack/tile/brass, /turf/open/floor/clockwork{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/unexplored) "f" = ( @@ -27,7 +24,7 @@ /area/lavaland/surface/outdoors/unexplored) "h" = ( /turf/open/floor/clockwork{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/unexplored) "i" = ( @@ -40,7 +37,7 @@ "k" = ( /obj/item/clockwork/alloy_shards/small, /turf/open/floor/clockwork{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/unexplored) "l" = ( @@ -61,7 +58,7 @@ "p" = ( /obj/item/clockwork/alloy_shards/medium, /turf/open/floor/clockwork{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/unexplored) "q" = ( @@ -75,7 +72,7 @@ "s" = ( /obj/item/clockwork/alloy_shards/large, /turf/open/floor/clockwork{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/unexplored) "t" = ( @@ -85,7 +82,7 @@ "u" = ( /obj/structure/grille/ratvar, /turf/open/floor/clockwork{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/unexplored) "v" = ( @@ -96,42 +93,42 @@ "w" = ( /obj/structure/grille/ratvar/broken, /turf/open/floor/clockwork{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/unexplored) "x" = ( /obj/item/stack/tile/brass, /turf/open/floor/clockwork{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/unexplored) "y" = ( /obj/item/clockwork/component/geis_capacitor/fallen_armor, /turf/open/floor/clockwork{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/unexplored) "z" = ( /turf/open/floor/clockwork{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/unexplored) "A" = ( /obj/item/clockwork/alloy_shards/clockgolem_remains, /turf/open/floor/clockwork{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/unexplored) "B" = ( -/obj/item/twohanded/clockwork/brass_spear, +/obj/item/clockwork/weapon/brass_spear, /turf/open/floor/clockwork{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/unexplored) "C" = ( /obj/item/clockwork/alloy_shards/medium/gear_bit, /turf/open/floor/clockwork{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/unexplored) "D" = ( @@ -145,7 +142,7 @@ "F" = ( /obj/structure/dead_ratvar, /turf/open/floor/clockwork{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors/unexplored) "G" = ( @@ -195,7 +192,7 @@ b r c j -x +e b b g @@ -440,7 +437,7 @@ b a "} (12,1,1) = {" -d +b j j j @@ -766,7 +763,7 @@ p h m e -z +h j j l @@ -791,7 +788,7 @@ l b h r -x +e h l l diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm index 3bee2ba95ac47..e88f4c97e2263 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm @@ -406,7 +406,7 @@ /turf/open/floor/pod/dark, /area/ruin/powered/golem_ship) "bp" = ( -/obj/machinery/mineral/equipment_vendor/golem, +/obj/machinery/vendor/mining/golem, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/ruin/powered/golem_ship) @@ -523,7 +523,7 @@ /turf/open/floor/pod, /area/ruin/powered/golem_ship) "bG" = ( -/obj/machinery/computer/shuttle{ +/obj/machinery/computer/shuttle_flight{ icon_state = "computer"; dir = 4 }, @@ -589,7 +589,7 @@ /turf/open/floor/pod/dark, /area/ruin/powered/golem_ship) "bR" = ( -/obj/machinery/autolathe, +/obj/machinery/modular_fabricator/autolathe, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/ruin/powered/golem_ship) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm index b1e976ae24634..bbc1f790c8a15 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm @@ -3,7 +3,7 @@ /turf/closed/mineral/volcanic/lava_land_surface, /area/lavaland/surface/outdoors) "b" = ( -/turf/closed/mineral/volcanic/lava_land_surface, +/turf/closed/wall/mineral/sandstone, /area/ruin/powered) "c" = ( /turf/closed/wall/mineral/iron, @@ -162,10 +162,7 @@ /turf/open/floor/mineral/titanium/blue, /area/ruin/powered) "J" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" - }, +/turf/open/floor/mineral/titanium/blue, /area/ruin/powered) "M" = ( /obj/item/stack/sheet/iron/twenty, @@ -174,6 +171,13 @@ name = "dirt" }, /area/ruin/powered) +"P" = ( +/turf/closed/wall/rust, +/area/ruin/powered) +"Q" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/pod/dark, +/area/ruin/powered) "W" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plating/asteroid/basalt, @@ -257,9 +261,9 @@ a a a a -b c b +b t t t @@ -274,8 +278,8 @@ a a a a -b -b +c +c n n t @@ -292,7 +296,7 @@ a a a b -b +c m o o @@ -307,9 +311,9 @@ s "} (8,1,1) = {" a -b -b -b +c +c +c c f o @@ -318,14 +322,14 @@ o o z C -t +Q s s s "} (9,1,1) = {" -b -b +c +c f i g @@ -336,7 +340,7 @@ o o t t -t +F s s s @@ -360,16 +364,16 @@ s s "} (11,1,1) = {" -c +b e h g M -c +P p r c -c +P c b a @@ -378,15 +382,15 @@ s s "} (12,1,1) = {" -b -b +c +c f k W +c +c b -b -b -b +c a a a @@ -397,11 +401,11 @@ E "} (13,1,1) = {" a -b -b -b -b -b +c +P +P +P +c a a a @@ -411,7 +415,7 @@ a a F I -F +J "} (14,1,1) = {" a @@ -429,7 +433,7 @@ a a F I -F +J "} (15,1,1) = {" a @@ -447,7 +451,7 @@ a a G J -G +J "} (16,1,1) = {" a diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm index 1c08add60973e..82c5e17da1e1b 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm @@ -15,14 +15,14 @@ "e" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "f" = ( /obj/structure/table/wood, /obj/item/storage/box/cups, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "g" = ( @@ -32,27 +32,27 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "h" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "i" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "j" = ( /obj/item/reagent_containers/food/snacks/pizzaslice/mushroom, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "k" = ( @@ -60,7 +60,7 @@ /obj/effect/spawner/lootdrop/pizzaparty, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "l" = ( @@ -72,42 +72,42 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "m" = ( /obj/item/chair/wood/wings, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "n" = ( /obj/structure/glowshroom/single, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "o" = ( /obj/item/trash/plate, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "p" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "q" = ( /obj/item/chair/wood/wings, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "r" = ( @@ -118,25 +118,25 @@ name = "party hat" }, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "s" = ( /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "t" = ( /obj/structure/chair/wood/wings, /obj/effect/decal/remains/human, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "u" = ( /obj/structure/glowshroom/single, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "v" = ( @@ -148,21 +148,21 @@ /obj/item/kitchen/fork, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "x" = ( /obj/structure/table/wood, /obj/effect/spawner/lootdrop/pizzaparty, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "y" = ( /obj/structure/table/wood, /obj/item/trash/plate, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "z" = ( @@ -170,7 +170,7 @@ /obj/structure/glowshroom/single, /obj/item/a_gift, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "A" = ( @@ -178,7 +178,7 @@ /obj/item/trash/plate, /obj/item/kitchen/fork, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "C" = ( @@ -187,7 +187,7 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "D" = ( @@ -195,47 +195,47 @@ /obj/item/reagent_containers/food/snacks/pizzaslice/margherita, /obj/item/trash/plate, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "E" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/pizzaslice/meat, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "F" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/store/cake/birthday, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "G" = ( /obj/structure/table/wood, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "H" = ( /obj/item/chair/wood/wings, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "I" = ( /obj/item/kitchen/fork, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "J" = ( /obj/structure/glowshroom/single, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "K" = ( @@ -245,21 +245,21 @@ /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "L" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "M" = ( /obj/effect/decal/cleanable/dirt, /obj/item/a_gift, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "N" = ( @@ -271,7 +271,7 @@ /obj/item/kitchen/knife, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "P" = ( @@ -280,12 +280,12 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "Q" = ( /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm index 5cf3471a07b2c..2601e060dc428 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm @@ -1,9 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) "ab" = ( -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/turf/template_noop, /area/lavaland/surface/outdoors) "ah" = ( /turf/open/floor/plasteel/freezer, @@ -22,9 +19,9 @@ /area/ruin/powered/seedvault) "aj" = ( /obj/structure/shuttle/engine/propulsion{ - dir = 8 + dir = 4 }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/turf/template_noop/open, /area/lavaland/surface/outdoors) "ak" = ( /obj/structure/closet/crate, @@ -266,6 +263,9 @@ }, /turf/open/floor/plasteel/freezer, /area/ruin/powered/seedvault) +"iO" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "lp" = ( /obj/structure/table/wood, /obj/item/storage/box/disks_plantgene, @@ -296,7 +296,7 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/on/layer3{ dir = 4 }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/turf/template_noop/open, /area/ruin/powered/seedvault) "of" = ( /obj/structure/table/wood, @@ -322,6 +322,9 @@ }, /turf/open/floor/plasteel/freezer, /area/ruin/powered/seedvault) +"vC" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) "vY" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, @@ -405,10 +408,19 @@ }, /turf/open/floor/plasteel/freezer, /area/ruin/powered/seedvault) +"FY" = ( +/turf/template_noop/closed, +/area/lavaland/surface/outdoors) "Gr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel/freezer, /area/ruin/powered/seedvault) +"GC" = ( +/turf/template_noop/open, +/area/lavaland/surface/outdoors) +"GK" = ( +/turf/template_noop, +/area/template_noop) "Hw" = ( /obj/machinery/plantgenes/seedvault{ pixel_y = 6 @@ -465,12 +477,12 @@ /area/ruin/powered/seedvault) (1,1,1) = {" -aa -aa -aa -aa -aa -aa +GK +ab +FY +FY +FY +FY nH aQ aQ @@ -478,18 +490,18 @@ aQ aQ aQ aQ -aa -aa -aa -aa -aa +FY ab ab +GK +GK +GK +GK "} (2,1,1) = {" -aa -aa -aa +ab +ab +FY aQ aQ aQ @@ -500,18 +512,18 @@ at at at aQ -aa -aa -aa -aa -aa +FY +ab ab ab +GK +GK +GK "} (3,1,1) = {" ab -aa -aa +ab +FY aQ yk Jm @@ -523,17 +535,17 @@ Gr Ag aQ aQ -aa -aa -aa +FY ab -aa ab +ab +GK +GK "} (4,1,1) = {" ab -aa -aa +FY +FY aQ aQ aQ @@ -546,15 +558,15 @@ aQ aQ aQ aQ -aa -aa -aa -aa -aa +FY +ab +ab +ab +GK "} (5,1,1) = {" -aa -aa +ab +FY aQ aQ ak @@ -568,15 +580,15 @@ au aR au aQ -aa -aa -aa -aa -aa +FY +ab +ab +ab +GK "} (6,1,1) = {" -aa -aa +ab +FY aQ of ah @@ -590,15 +602,15 @@ Jy ah aG aQ -aa -aa -aa -aa -aa +FY +ab +ab +ab +GK "} (7,1,1) = {" -aa -aa +ab +FY aQ lp ah @@ -612,15 +624,15 @@ ap ah aX aQ -aa -aa -aa -aa -aa +vC +vC +ab +ab +GK "} (8,1,1) = {" ab -aa +FY aQ tE gE @@ -635,14 +647,14 @@ aF aF aV aL -aa -aa -aa -aa +vC +ab +ab +GK "} (9,1,1) = {" ab -aa +FY aQ Hw ah @@ -657,14 +669,14 @@ ah ak aQ aM -aa -aa -aa -aa +vC +ab +ab +GK "} (10,1,1) = {" -aa -aa +ab +FY aQ zi ah @@ -678,15 +690,15 @@ aD ah ap aQ +iO +vC +ab ab -aa -aa -aa -aa +GK "} (11,1,1) = {" -aa -aa +ab +FY aQ ah ah @@ -700,15 +712,15 @@ aE ah aH aQ -aa -aa -aa -aa -aa +vC +vC +ab +ab +GK "} (12,1,1) = {" ab -aa +FY aQ aO ah @@ -722,15 +734,15 @@ hG ah aX aQ -aa -aa -aa -aa -aa +FY +FY +ab +ab +GK "} (13,1,1) = {" -aa -aa +ab +FY aQ ai ah @@ -744,15 +756,15 @@ ah ah aI aQ -aa -aa -aa -aa -aa +FY +ab +ab +ab +GK "} (14,1,1) = {" -aa -aa +ab +FY aQ aQ ai @@ -766,16 +778,16 @@ ay aS aJ aQ -aa -aa -aa -aa -aa +FY +ab +ab +GK +GK "} (15,1,1) = {" -aa -aa ab +ab +FY aQ aQ aQ @@ -788,16 +800,16 @@ aQ aQ aQ aQ -aa -aa -aa -aa -aa +FY +ab +ab +GK +GK "} (16,1,1) = {" ab -aa ab +FY aj aQ aj @@ -810,38 +822,13 @@ aQ aj aQ aj -aa -aa -aa -aa -aa -"} -(17,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aQ -am -am -aQ -ab -ab ab -aa -aa -aa ab ab +GK +GK "} -(18,1,1) = {" -aa -aa -aa +(17,1,1) = {" ab ab ab @@ -850,57 +837,82 @@ ab ab ab ab +aQ +am +am +aQ +GC +GC +GC ab ab ab +GK +GK +"} +(18,1,1) = {" ab -aa -aa -aa ab ab -"} -(19,1,1) = {" -aa -aa -aa -aa ab ab -aa ab ab +GC +GC +GC +GC +GC +GC +GC +GC ab ab ab +GK +GK +"} +(19,1,1) = {" +GK ab ab -aa -aa -aa ab ab ab -"} -(20,1,1) = {" -aa -aa -aa ab +GC +GC +GC +GC +GC +GC +GC ab ab -aa ab +GK +GK +GK +"} +(20,1,1) = {" +GK +GK ab ab ab ab ab +GC +GC +GC +GC +GC +GC +GC ab -aa -aa -aa ab ab -aa +GK +GK +GK "} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm index f37f7abcbf9a5..e4ac74afe9f2e 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm @@ -3,26 +3,26 @@ /turf/template_noop, /area/template_noop) "b" = ( -/turf/closed/mineral/volcanic/lava_land_surface, +/turf/template_noop/closed, /area/template_noop) "c" = ( /turf/closed/wall/mineral/plastitanium, /area/ruin/unpowered) "d" = ( /turf/open/floor/mineral/plastitanium/red{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "e" = ( /obj/structure/shuttle/engine/propulsion{ dir = 4 }, -/turf/template_noop, +/turf/template_noop/open, /area/ruin/unpowered) "f" = ( /mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon, /turf/open/floor/mineral/plastitanium/red{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index b6bc8063491a9..aa0915d0ed58f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -2287,7 +2287,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/computer/shuttle{ +/obj/machinery/computer/shuttle_flight{ desc = "Occasionally used to call in a resupply shuttle if one is in range."; dir = 8; icon_keyboard = "syndie_key"; @@ -2729,9 +2729,12 @@ dir = 9 }, /obj/effect/mapping_helpers/no_lava, +/obj/structure/railing{ + dir = 8 + }, /turf/open/floor/plating{ baseturfs = /turf/open/lava/smooth/lava_land_surface; - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "ih" = ( @@ -2741,7 +2744,7 @@ /obj/effect/mapping_helpers/no_lava, /turf/open/floor/plating{ baseturfs = /turf/open/lava/smooth/lava_land_surface; - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "ii" = ( @@ -2833,6 +2836,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/malf_upgrade, +/obj/structure/closet/crate, /turf/open/floor/plasteel/dark, /area/ruin/unpowered/syndicate_lava_base/main) "is" = ( @@ -2840,10 +2845,10 @@ dir = 1 }, /obj/machinery/turretid{ - control_area = "/area/ruin/unpowered/syndicate_lava_base/main"; + ailock = 1; + control_area = null; dir = 1; icon_state = "control_kill"; - ailock = 1; lethal = 1; name = "Base turret controls"; pixel_y = 30; @@ -2876,9 +2881,12 @@ dir = 8 }, /obj/effect/mapping_helpers/no_lava, +/obj/structure/railing{ + dir = 8 + }, /turf/open/floor/plating{ baseturfs = /turf/open/lava/smooth/lava_land_surface; - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "iv" = ( @@ -2886,7 +2894,7 @@ /obj/effect/mapping_helpers/no_lava, /turf/open/floor/plating{ baseturfs = /turf/open/lava/smooth/lava_land_surface; - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "iw" = ( @@ -3050,7 +3058,7 @@ }, /turf/open/floor/plating{ baseturfs = /turf/open/lava/smooth/lava_land_surface; - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered/syndicate_lava_base/arrivals) "iN" = ( @@ -3290,9 +3298,12 @@ dir = 1 }, /obj/effect/mapping_helpers/no_lava, +/obj/structure/railing/corner{ + dir = 1 + }, /turf/open/floor/plating{ baseturfs = /turf/open/lava/smooth/lava_land_surface; - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "jf" = ( @@ -3346,7 +3357,7 @@ /obj/effect/mapping_helpers/no_lava, /turf/open/floor/plating{ baseturfs = /turf/open/lava/smooth/lava_land_surface; - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "jl" = ( @@ -3609,11 +3620,10 @@ /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/unpowered/syndicate_lava_base/engineering) "jK" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer3{ - dir = 8; - volume_rate = 200 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/unpowered/syndicate_lava_base/engineering) "jL" = ( /obj/structure/table, @@ -4333,7 +4343,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ baseturfs = /turf/open/lava/smooth/lava_land_surface; - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered/syndicate_lava_base/arrivals) "lf" = ( @@ -4501,9 +4511,12 @@ dir = 10 }, /obj/effect/mapping_helpers/no_lava, +/obj/structure/railing{ + dir = 8 + }, /turf/open/floor/plating{ baseturfs = /turf/open/lava/smooth/lava_land_surface; - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "lw" = ( @@ -4511,7 +4524,7 @@ /obj/effect/mapping_helpers/no_lava, /turf/open/floor/plating{ baseturfs = /turf/open/lava/smooth/lava_land_surface; - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/lavaland/surface/outdoors) "lx" = ( @@ -4940,7 +4953,7 @@ /turf/open/floor/plasteel/dark, /area/ruin/unpowered/syndicate_lava_base/bar) "mu" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/decal/cleanable/dirt, @@ -5621,6 +5634,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/radio/intercom{ + freerange = 1; + name = "Syndicate Radio Intercom" + }, /turf/open/floor/plasteel/dark, /area/ruin/unpowered/syndicate_lava_base/telecomms) "nK" = ( @@ -6157,6 +6174,12 @@ }, /turf/open/floor/engine, /area/ruin/unpowered/syndicate_lava_base/testlab) +"qM" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 5 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/testlab) "qP" = ( /obj/structure/rack{ dir = 8 @@ -6206,9 +6229,21 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/item/circuitboard/machine/thermomachine/freezer, +/obj/item/circuitboard/machine/thermomachine, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) +"wt" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 10 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"xw" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 6 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/cargo) "yv" = ( /obj/structure/table/reinforced, /obj/item/surgicaldrill, @@ -6217,6 +6252,18 @@ /obj/item/blood_filter, /turf/open/floor/plasteel/white/side, /area/ruin/unpowered/syndicate_lava_base/medbay) +"zv" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 10 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"zM" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 5 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) "BF" = ( /obj/structure/grille, /obj/structure/window/plastitanium, @@ -6253,6 +6300,12 @@ }, /turf/open/floor/engine, /area/ruin/unpowered/syndicate_lava_base/testlab) +"Ej" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 5 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/cargo) "EZ" = ( /obj/machinery/door/airlock/external{ req_access_txt = "150" @@ -6290,11 +6343,27 @@ }, /turf/open/floor/engine, /area/ruin/unpowered/syndicate_lava_base/testlab) +"Lj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/main) "LQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/engine, /area/ruin/unpowered/syndicate_lava_base/testlab) +"Mp" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer3{ + dir = 8; + volume_rate = 200 + }, +/turf/open/floor/plating{ + baseturfs = /turf/open/lava/smooth/lava_land_surface; + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" + }, +/area/lavaland/surface/outdoors) "RE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -6316,6 +6385,19 @@ }, /turf/open/floor/plating, /area/ruin/unpowered/syndicate_lava_base/arrivals) +"SY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/mapping_helpers/no_lava, +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/plating{ + baseturfs = /turf/open/lava/smooth/lava_land_surface; + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" + }, +/area/lavaland/surface/outdoors) "Tp" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 @@ -6575,7 +6657,7 @@ mM nh mM mn -mn +wt ab ab ab @@ -6964,7 +7046,7 @@ ab ab dG dG -ig +SY iu iu iu @@ -7013,7 +7095,7 @@ ab ab dG dG -ig +SY je iv jk @@ -7062,7 +7144,7 @@ ab ab dG dG -ig +SY je jk jx @@ -7111,7 +7193,7 @@ ab ab dG dG -ig +SY je jk jx @@ -7160,7 +7242,7 @@ hW dG dG dG -ig +SY je iv jx @@ -7491,7 +7573,7 @@ ab ab ab ab -ae +qM ae ae ae @@ -8076,7 +8158,7 @@ IJ uB ju ju -ju +zv ab ab ab @@ -8296,7 +8378,7 @@ ab ab ab ab -dy +Ej dy eE fe @@ -8307,11 +8389,11 @@ ho hD dy dy -ac -ab -ab -ab -ac +ha +ha +ha +ha +ha jK ju km @@ -8355,15 +8437,15 @@ gf dy eF eF -dy -ab -ab -ab -ab -ab -ab -ab -ju +xw +ha +ha +ha +ha +ha +ha +Lj +zM ju kC la @@ -8412,7 +8494,7 @@ ab ab ab ab -ab +Mp ab ju kD @@ -8452,7 +8534,7 @@ ab ab fx gh -fx +Ej ab ab ab @@ -8464,7 +8546,7 @@ ab ab ab ab -ju +zM kE lc ju diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm index 0c52781d45cb0..9995d0498a86c 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm @@ -16,12 +16,12 @@ team_number = 100 }, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "k" = ( /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "l" = ( @@ -29,59 +29,59 @@ team_number = 100 }, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "o" = ( /obj/item/hemostat/alien, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "p" = ( /obj/effect/mob_spawn/human/abductor, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "q" = ( /obj/structure/closet/abductor, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "s" = ( /obj/structure/table/optable/abductor, /obj/item/cautery/alien, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "t" = ( /obj/structure/table/abductor, /obj/item/storage/box/alienhandcuffs, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "v" = ( /obj/item/scalpel/alien, /obj/item/surgical_drapes, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "w" = ( /obj/item/retractor/alien, /obj/item/paper/guides/antag/abductor, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "y" = ( /obj/machinery/abductor/gland_dispenser, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "z" = ( @@ -89,13 +89,13 @@ /obj/item/surgicaldrill/alien, /obj/item/circular_saw/alien, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) "A" = ( /obj/structure/bed/abductor, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm index b60651b6158e4..a338ffbb7af58 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm @@ -157,10 +157,6 @@ /obj/item/clothing/head/helmet/space/syndicate/orange, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) -"O" = ( -/obj/structure/alien/weeds/node, -/turf/template_noop, -/area/ruin/unpowered/xenonest) "Q" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/blood, @@ -169,10 +165,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) -"R" = ( -/obj/structure/alien/weeds, -/turf/template_noop, -/area/ruin/unpowered/xenonest) (1,1,1) = {" a @@ -1065,8 +1057,8 @@ g g g b -O -R +l +g g g "} @@ -1097,8 +1089,8 @@ b g l b -O -R +l +g g g "} diff --git a/_maps/RandomRuins/SpaceRuins/Fast_Food.dmm b/_maps/RandomRuins/SpaceRuins/Fast_Food.dmm index 7a94c7514e054..af4248413c931 100644 --- a/_maps/RandomRuins/SpaceRuins/Fast_Food.dmm +++ b/_maps/RandomRuins/SpaceRuins/Fast_Food.dmm @@ -141,7 +141,6 @@ "aF" = ( /obj/item/toy/figure/chaplain, /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 4 }, /turf/open/floor/plasteel/cafeteria, @@ -158,7 +157,6 @@ "aH" = ( /obj/item/toy/figure/assistant, /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 8 }, /turf/open/floor/plasteel/cafeteria, @@ -170,7 +168,6 @@ /area/ruin/space/has_grav/powered/macspace) "aJ" = ( /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 8 }, /turf/open/floor/plasteel/cafeteria, @@ -206,7 +203,6 @@ /area/ruin/space/has_grav/powered/macspace) "aR" = ( /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 1 }, /turf/open/floor/plasteel/cafeteria, @@ -307,7 +303,6 @@ /obj/item/toy/figure/clown, /obj/effect/decal/cleanable/food/tomato_smudge, /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 4 }, /turf/open/floor/plasteel/cafeteria, @@ -328,7 +323,6 @@ /obj/item/toy/figure/mime, /obj/effect/decal/cleanable/food/salt, /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 8 }, /turf/open/floor/plasteel/cafeteria, @@ -379,7 +373,6 @@ /area/ruin/space/has_grav/powered/macspace) "bw" = ( /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 4 }, /turf/open/floor/plasteel/cafeteria, @@ -398,7 +391,6 @@ /area/ruin/space/has_grav/powered/macspace) "bz" = ( /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 8 }, /turf/open/floor/carpet, @@ -532,7 +524,6 @@ /area/ruin/space/has_grav/powered/macspace) "ca" = ( /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 4 }, /obj/item/toy/figure/geneticist, @@ -559,7 +550,6 @@ "ce" = ( /obj/item/toy/figure/janitor, /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 8 }, /obj/item/toy/plush/lizardplushie, @@ -569,7 +559,6 @@ /obj/item/toy/figure/qm, /obj/effect/decal/cleanable/dirt/dust, /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 4 }, /obj/effect/decal/cleanable/food/salt, @@ -598,7 +587,7 @@ "ck" = ( /obj/machinery/light/floor, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/water, +/turf/open/water/air, /area/ruin/space/has_grav/powered/macspace) "cl" = ( /obj/structure/table/wood/fancy/royalblue, @@ -624,7 +613,6 @@ "cp" = ( /obj/item/toy/figure/botanist, /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 8 }, /turf/open/floor/plasteel/cafeteria, @@ -648,7 +636,6 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/food/pie_smudge, /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 8 }, /turf/open/floor/carpet, @@ -820,7 +807,6 @@ "cW" = ( /obj/item/toy/figure/lawyer, /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 1 }, /turf/open/floor/plasteel/cafeteria, @@ -828,7 +814,6 @@ "cX" = ( /obj/item/toy/figure/secofficer, /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 1 }, /turf/open/floor/plasteel/cafeteria, @@ -841,7 +826,6 @@ "cZ" = ( /obj/item/toy/figure/cargotech, /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 1 }, /turf/open/floor/plasteel/cafeteria, @@ -853,7 +837,6 @@ /obj/item/toy/sword, /obj/effect/decal/cleanable/food/tomato_smudge, /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 1 }, /obj/effect/decal/cleanable/food/salt, @@ -935,6 +918,7 @@ /area/ruin/space/has_grav/powered/macspace) "dr" = ( /obj/machinery/door/airlock/silver, +/obj/structure/fans/tiny, /turf/open/floor/mineral/titanium, /area/ruin/space/has_grav/powered/macspace) "ds" = ( @@ -947,7 +931,6 @@ /area/ruin/space/has_grav/powered/macspace) "dx" = ( /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 4 }, /obj/item/toy/toy_xeno, @@ -956,7 +939,6 @@ /area/ruin/space/has_grav/powered/macspace) "dy" = ( /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 8 }, /obj/item/toy/plush/slimeplushie, @@ -965,7 +947,6 @@ /area/ruin/space/has_grav/powered/macspace) "dz" = ( /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 4 }, /obj/item/toy/figure/scientist, @@ -980,7 +961,6 @@ /area/ruin/space/has_grav/powered/macspace) "dB" = ( /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 8 }, /obj/item/toy/talking/AI, @@ -989,7 +969,6 @@ "dC" = ( /obj/item/toy/figure/botanist, /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 8 }, /obj/item/toy/plush/beeplushie, @@ -997,7 +976,6 @@ /area/ruin/space/has_grav/powered/macspace) "dD" = ( /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 4 }, /obj/item/toy/figure/roboticist, @@ -1012,7 +990,6 @@ /area/ruin/space/has_grav/powered/macspace) "dF" = ( /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 1 }, /obj/item/toy/plush/nukeplushie, @@ -1029,7 +1006,6 @@ /area/ruin/space/has_grav/powered/macspace) "ea" = ( /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 4 }, /obj/item/toy/figure/cmo, @@ -1037,7 +1013,6 @@ /area/ruin/space/has_grav/powered/macspace) "iO" = ( /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 8 }, /obj/item/toy/figure/md, @@ -1051,7 +1026,6 @@ /area/ruin/space/has_grav/powered/macspace) "rA" = ( /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 4 }, /obj/item/toy/figure/chemist, @@ -1059,7 +1033,6 @@ /area/ruin/space/has_grav/powered/macspace) "uO" = ( /obj/structure/chair/wood/wings{ - icon_state = "wooden_chair_wings"; dir = 8 }, /obj/item/toy/figure/virologist, diff --git a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm index be76d9caca092..db01229a9ea59 100644 --- a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm @@ -1666,7 +1666,7 @@ /turf/open/floor/plasteel/airless, /area/ruin/space/derelict/bridge/access) "fw" = ( -/obj/item/drone_shell/dusty, +/obj/effect/mob_spawn/drone/dusty, /turf/open/floor/plasteel/airless, /area/ruin/space/derelict/bridge/access) "fx" = ( @@ -2252,9 +2252,9 @@ "hF" = ( /obj/structure/table, /obj/machinery/computer/pod/old{ + id = "derelict_gun"; name = "ProComp IIe"; - pixel_y = 7; - id = "derelict_gun" + pixel_y = 7 }, /turf/open/floor/plasteel/chapel, /area/ruin/space/derelict/medical/chapel) @@ -2440,7 +2440,7 @@ /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "in" = ( -/obj/item/drone_shell/dusty, +/obj/effect/mob_spawn/drone/dusty, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "io" = ( @@ -4122,10 +4122,10 @@ /obj/machinery/power/terminal{ dir = 1 }, -/obj/item/drone_shell/dusty, /obj/structure/cable{ icon_state = "0-2" }, +/obj/effect/mob_spawn/drone/dusty, /turf/open/floor/plasteel/airless, /area/ruin/space/derelict/se_solar) "nV" = ( diff --git a/_maps/RandomRuins/SpaceRuins/asteroid10.dmm b/_maps/RandomRuins/SpaceRuins/asteroid10.dmm new file mode 100644 index 0000000000000..a1e78d4ec3ff9 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/asteroid10.dmm @@ -0,0 +1,1413 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/turf/closed/mineral/random/low_chance, +/area/ruin/unpowered) +"ac" = ( +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered) +"ad" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/powered) +"ae" = ( +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"af" = ( +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/powered) +"ag" = ( +/turf/open/floor/holofloor/beach, +/area/ruin/space/has_grav/powered) +"ah" = ( +/turf/open/floor/holofloor/beach/coast_t, +/area/ruin/space/has_grav/powered) +"ai" = ( +/turf/open/floor/holofloor/beach/water, +/area/ruin/space/has_grav/powered) +"aj" = ( +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered) +"ak" = ( +/obj/machinery/door/airlock/wood/glass, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"al" = ( +/obj/machinery/door/airlock/wood, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"am" = ( +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"an" = ( +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"ao" = ( +/obj/structure/bed/dogbed, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"ap" = ( +/mob/living/simple_animal/pet/dog/pug, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"aq" = ( +/mob/living/simple_animal/pet/dog/corgi/exoticcorgi, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered) +"ar" = ( +/mob/living/simple_animal/pet/dog/corgi/seccie, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered) +"as" = ( +/mob/living/simple_animal/pet/dog/corgi/puppy, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"at" = ( +/mob/living/simple_animal/pet/dog/bullterrier, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered) +"au" = ( +/obj/machinery/hydroponics, +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/powered) +"av" = ( +/obj/structure/flora/junglebush, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered) +"aw" = ( +/mob/living/simple_animal/pet/dog/corgi/seccie, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"ax" = ( +/obj/item/reagent_containers/food/snacks/nugget/dog, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered) +"ay" = ( +/mob/living/simple_animal/pet/dog/corgi/puppy, +/turf/open/floor/holofloor/beach/coast_t, +/area/ruin/space/has_grav/powered) +"az" = ( +/mob/living/simple_animal/pet/dog/corgi/chef, +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/powered) +"aA" = ( +/obj/machinery/grill, +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/powered) +"aB" = ( +/obj/item/toy/plush/snakeplushie, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"aC" = ( +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered) +"aD" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered) +"aE" = ( +/obj/structure/flora/junglebush/b, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered) +"aF" = ( +/obj/structure/flora/junglebush/c, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered) +"aG" = ( +/obj/structure/flora/grass/green, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered) +"aH" = ( +/obj/item/toy/plush/lizardplushie, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"aI" = ( +/obj/item/toy/plush/slimeplushie, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"aJ" = ( +/obj/structure/flora/grass/both, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered) +"aK" = ( +/obj/machinery/power/rtg/advanced, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"aL" = ( +/obj/structure/flora/tree/palm, +/turf/open/floor/holofloor/beach, +/area/ruin/space/has_grav/powered) +"aM" = ( +/obj/structure/closet/secure_closet/freezer, +/obj/item/reagent_containers/food/snacks/nugget/dog, +/obj/item/reagent_containers/food/snacks/nugget/dog, +/obj/item/reagent_containers/food/snacks/nugget/dog, +/obj/item/reagent_containers/food/snacks/nugget/dog, +/obj/item/reagent_containers/food/snacks/nugget/dog, +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/powered) +"aN" = ( +/obj/structure/closet/crate/wooden, +/obj/item/stack/sheet/mineral/coal/ten, +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/powered) +"aO" = ( +/obj/effect/overlay/coconut, +/turf/open/floor/holofloor/beach, +/area/ruin/space/has_grav/powered) +"aP" = ( +/obj/item/pool/rubber_ring, +/turf/open/floor/holofloor/beach/water, +/area/ruin/space/has_grav/powered) +"aQ" = ( +/obj/structure/table/wood, +/obj/item/folder, +/obj/item/pen, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"aR" = ( +/obj/item/pickaxe, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered) +"aS" = ( +/obj/item/paper/fluff/ruins/asteroid10/welcome, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered) +"aT" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"aU" = ( +/obj/machinery/light, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"aV" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/powered) +"aW" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"aX" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/holofloor/beach, +/area/ruin/space/has_grav/powered) +"aY" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/holofloor/beach/coast_t, +/area/ruin/space/has_grav/powered) +"aZ" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/powered) +"ba" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"bb" = ( +/obj/structure/sink/puddle, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered) +"bc" = ( +/obj/machinery/light/floor, +/turf/open/floor/grass, +/area/ruin/space/has_grav/powered) +"bd" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/holofloor/beach, +/area/ruin/space/has_grav/powered) +"be" = ( +/obj/structure/table/wood, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"bf" = ( +/obj/structure/table/wood, +/obj/item/flashlight/seclite, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"bg" = ( +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) +"bh" = ( +/obj/item/reagent_containers/food/snacks/nugget/dog, +/turf/open/floor/wood, +/area/ruin/space/has_grav/powered) + +(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 +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +ab +ab +ab +aa +aa +aa +aa +aa +ab +ab +ab +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +aj +ab +ab +ab +ab +aa +aa +aa +aa +ab +ab +ab +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +ab +ab +ab +ab +ab +aa +aa +aa +aa +ab +aa +aa +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aa +aa +aa +aa +aa +aa +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +"} +(8,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aj +aj +aj +ab +ab +ab +ab +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +"} +(9,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aj +aj +aj +aR +ab +ab +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aj +aj +aj +ab +ab +ab +aj +aj +ad +ad +ad +ad +ad +ab +ab +ab +ab +ab +ab +aj +aa +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aj +aj +ab +ab +ab +ab +ad +ad +aH +ao +ad +au +au +ad +ad +ab +ab +ab +ab +aj +aj +aa +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aj +ab +ab +ab +ad +ae +ao +ae +ae +ad +af +af +aM +aM +ad +ab +ab +ab +ab +aj +aj +aa +aa +"} +(13,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ad +ao +ae +ae +ae +ae +ad +aV +af +af +af +aN +ad +ab +ab +ab +ab +ab +ab +aa +"} +(14,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ad +aB +ae +ae +aw +ae +bh +ak +af +af +az +af +af +au +ad +ab +ab +ab +ab +ab +ab +"} +(15,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ad +ao +ae +ap +as +ae +aU +ad +aA +af +af +aZ +af +au +ad +ab +ab +ab +ab +ab +ab +"} +(16,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ad +ae +ae +ae +ae +ae +ae +aI +ad +ad +al +ad +ad +ad +ad +ad +ad +aj +ab +ab +ab +ab +"} +(17,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ad +ao +ae +ae +ae +aT +bh +ae +al +aW +ae +aQ +bf +an +ba +aW +al +aj +aj +ab +ab +ab +"} +(18,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ad +ad +ad +ad +ak +ad +ad +ad +ad +aK +ae +ae +bh +aw +ae +ae +al +aS +aj +ab +ab +ab +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ad +av +av +aE +ac +aG +aD +aJ +al +aT +ae +be +am +am +bg +aT +al +aj +aR +ab +ab +ab +"} +(20,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ad +av +aC +aD +ax +ac +bc +aG +ad +ad +al +ad +ad +ad +ad +ad +ad +aj +ab +ab +ab +ab +"} +(21,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ad +aD +bb +ar +aG +ac +aG +ad +bd +ag +aY +ai +ai +ai +ad +ab +ab +ab +ab +ab +ab +"} +(22,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ad +av +aF +aq +at +ax +ac +ak +ag +ag +ay +ai +aP +ai +ad +ab +ab +ab +ab +ab +ab +"} +(23,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ad +av +aD +aD +bb +aD +ad +aX +ag +ay +ai +ai +ad +ab +ab +ab +ab +ab +ab +aa +"} +(24,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aj +ab +ab +ab +ab +ad +aF +aF +aC +av +ad +aO +ag +ah +ai +ad +ab +ab +ab +ab +ab +ab +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aj +aj +ab +ab +ab +ab +ad +ad +av +av +ad +aL +ag +ad +ad +ab +ab +ab +ab +ab +ab +aa +aa +aa +"} +(26,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aj +aj +aj +ab +ab +ab +ab +ab +ad +ad +ad +ad +ad +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +"} +(27,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aj +aj +aa +"} +(28,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aj +aj +aj +aa +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aj +aj +aa +aa +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aj +aa +aa +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +aa +aj +aj +aj +ab +ab +ab +ab +ab +ab +aa +aa +aa +aj +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 +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/RandomRuins/SpaceRuins/asteroid6.dmm b/_maps/RandomRuins/SpaceRuins/asteroid6.dmm new file mode 100644 index 0000000000000..e451f86a3acf1 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/asteroid6.dmm @@ -0,0 +1,454 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/closed/mineral, +/area/ruin/unpowered) +"c" = ( +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered) +"d" = ( +/turf/closed/mineral/random/high_chance, +/area/ruin/unpowered) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +c +c +c +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +c +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +c +a +a +a +"} +(4,1,1) = {" +a +a +a +a +a +a +a +a +a +c +a +a +a +d +d +d +d +c +a +a +"} +(5,1,1) = {" +a +a +a +a +a +a +a +a +c +c +a +a +a +d +d +d +d +c +a +a +"} +(6,1,1) = {" +a +a +a +a +a +a +a +c +c +c +a +a +d +d +d +d +d +d +c +a +"} +(7,1,1) = {" +a +a +a +a +a +a +a +c +c +a +a +a +d +d +d +d +d +d +c +a +"} +(8,1,1) = {" +a +a +d +d +a +a +a +a +a +a +a +a +d +d +d +d +d +d +c +a +"} +(9,1,1) = {" +a +d +d +d +d +a +a +a +a +a +a +a +d +d +d +d +d +d +b +c +"} +(10,1,1) = {" +a +d +d +d +d +a +a +a +a +a +a +c +d +d +d +d +d +b +b +c +"} +(11,1,1) = {" +a +a +d +d +a +a +a +a +a +a +a +c +d +d +d +b +b +b +c +a +"} +(12,1,1) = {" +a +a +a +a +a +a +a +a +a +d +d +d +d +d +d +b +b +b +c +a +"} +(13,1,1) = {" +a +a +a +a +a +a +d +d +d +d +d +d +d +d +d +d +b +b +c +a +"} +(14,1,1) = {" +b +b +a +a +a +d +d +d +d +d +d +d +d +d +d +d +b +c +a +a +"} +(15,1,1) = {" +c +b +b +b +b +d +d +d +d +d +d +d +d +d +d +d +d +c +a +a +"} +(16,1,1) = {" +a +c +b +b +d +d +d +d +d +d +d +d +d +d +d +d +c +a +a +a +"} +(17,1,1) = {" +a +a +c +b +b +d +d +d +d +d +d +d +d +d +d +c +a +a +a +a +"} +(18,1,1) = {" +a +a +a +c +c +d +d +d +d +d +d +d +d +c +c +a +a +a +a +a +"} +(19,1,1) = {" +a +a +a +a +a +c +c +c +d +d +c +c +c +a +a +a +a +a +a +a +"} +(20,1,1) = {" +a +a +a +a +a +a +a +a +c +c +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/SpaceRuins/asteroid7.dmm b/_maps/RandomRuins/SpaceRuins/asteroid7.dmm new file mode 100644 index 0000000000000..abab2f243ef10 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/asteroid7.dmm @@ -0,0 +1,431 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered) +"c" = ( +/turf/closed/mineral/random/high_chance, +/area/ruin/unpowered) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +c +c +a +a +a +a +"} +(3,1,1) = {" +a +b +a +a +c +c +c +c +a +a +a +a +"} +(4,1,1) = {" +a +a +a +a +c +c +c +c +c +a +a +a +"} +(5,1,1) = {" +a +a +a +c +c +c +c +c +c +a +a +a +"} +(6,1,1) = {" +a +a +a +c +c +c +c +c +c +a +a +a +"} +(7,1,1) = {" +a +a +a +c +c +c +c +c +c +a +a +a +"} +(8,1,1) = {" +a +a +a +c +c +c +c +b +a +a +a +a +"} +(9,1,1) = {" +a +a +a +c +c +c +b +b +a +a +a +a +"} +(10,1,1) = {" +a +a +a +a +c +c +a +a +a +b +a +a +"} +(11,1,1) = {" +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 +"} +(13,1,1) = {" +a +a +a +a +a +a +a +c +c +c +a +a +"} +(14,1,1) = {" +a +a +a +b +a +a +c +c +c +c +c +a +"} +(15,1,1) = {" +a +a +a +a +a +a +b +c +c +c +c +a +"} +(16,1,1) = {" +a +a +a +a +a +a +b +c +c +c +c +a +"} +(17,1,1) = {" +a +a +a +a +a +a +b +b +c +c +c +a +"} +(18,1,1) = {" +a +a +a +a +a +a +a +b +c +c +c +a +"} +(19,1,1) = {" +a +a +a +a +b +a +a +a +c +c +a +a +"} +(20,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +"} +(21,1,1) = {" +a +a +c +c +a +a +a +a +a +a +a +a +"} +(22,1,1) = {" +a +c +c +c +c +a +a +a +b +a +a +a +"} +(23,1,1) = {" +a +c +c +c +c +a +a +a +a +a +a +a +"} +(24,1,1) = {" +a +b +c +c +c +b +a +a +a +a +a +a +"} +(25,1,1) = {" +a +a +c +c +c +c +c +a +a +a +a +a +"} +(26,1,1) = {" +a +a +c +c +c +c +c +a +a +b +a +a +"} +(27,1,1) = {" +a +a +a +c +c +c +c +a +a +a +a +a +"} +(28,1,1) = {" +a +a +a +a +c +c +a +a +a +a +a +a +"} +(29,1,1) = {" +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 +"} diff --git a/_maps/RandomRuins/SpaceRuins/asteroid8.dmm b/_maps/RandomRuins/SpaceRuins/asteroid8.dmm new file mode 100644 index 0000000000000..2e4326cb2d9f8 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/asteroid8.dmm @@ -0,0 +1,514 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered) +"c" = ( +/turf/closed/mineral/random/high_chance, +/area/ruin/unpowered) +"d" = ( +/turf/closed/mineral, +/area/ruin/unpowered) + +(1,1,1) = {" +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 +d +d +a +a +a +a +a +a +a +d +a +a +"} +(3,1,1) = {" +a +a +a +a +a +a +d +d +a +a +a +a +a +a +d +d +a +a +"} +(4,1,1) = {" +a +a +c +a +a +a +a +a +a +c +c +c +a +a +d +d +a +a +"} +(5,1,1) = {" +a +a +c +c +c +c +a +a +a +a +c +c +c +a +a +a +a +a +"} +(6,1,1) = {" +a +a +c +c +c +c +c +a +a +a +c +c +c +a +a +a +a +a +"} +(7,1,1) = {" +a +a +c +c +c +c +c +c +a +a +c +c +c +c +a +a +a +a +"} +(8,1,1) = {" +a +a +c +c +c +c +c +c +a +a +c +c +c +c +a +a +b +a +"} +(9,1,1) = {" +a +a +a +c +c +c +c +c +a +a +a +c +c +c +a +a +a +a +"} +(10,1,1) = {" +a +a +a +a +c +c +c +c +a +a +a +c +c +c +a +a +a +a +"} +(11,1,1) = {" +a +a +a +a +a +a +c +a +a +a +a +c +c +c +c +a +a +a +"} +(12,1,1) = {" +a +a +a +a +a +a +a +a +a +b +a +c +c +c +c +a +a +a +"} +(13,1,1) = {" +a +a +d +d +a +a +a +a +a +a +a +a +c +c +c +a +a +a +"} +(14,1,1) = {" +a +a +d +d +d +a +a +b +a +a +a +a +c +c +c +a +a +a +"} +(15,1,1) = {" +a +a +d +d +a +a +a +a +a +a +a +c +c +c +c +a +a +a +"} +(16,1,1) = {" +a +a +a +a +a +a +a +a +a +b +a +c +c +c +c +a +a +a +"} +(17,1,1) = {" +a +a +a +b +a +a +c +a +a +a +a +c +c +c +a +a +b +a +"} +(18,1,1) = {" +a +a +a +a +a +c +c +a +b +a +a +c +c +c +a +a +a +a +"} +(19,1,1) = {" +a +a +a +a +a +c +c +a +a +a +c +c +c +c +a +a +a +a +"} +(20,1,1) = {" +a +b +a +a +c +c +a +a +a +a +c +c +c +c +a +b +a +a +"} +(21,1,1) = {" +a +a +a +a +c +c +a +d +a +a +c +c +c +a +a +a +a +a +"} +(22,1,1) = {" +a +a +a +c +c +a +d +d +d +a +c +c +c +a +b +a +a +a +"} +(23,1,1) = {" +a +a +a +c +a +a +a +d +a +c +c +c +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 +"} +(25,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/SpaceRuins/asteroid9.dmm b/_maps/RandomRuins/SpaceRuins/asteroid9.dmm new file mode 100644 index 0000000000000..95bb691e86f9e --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/asteroid9.dmm @@ -0,0 +1,421 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/closed/mineral, +/area/ruin/unpowered) +"c" = ( +/turf/closed/mineral/random/high_chance, +/area/ruin/unpowered) +"d" = ( +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered) +"e" = ( +/obj/effect/decal/remains/xeno, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered) +"f" = ( +/obj/effect/decal/remains/robot, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered) + +(1,1,1) = {" +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 +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +b +b +b +b +b +b +a +a +"} +(4,1,1) = {" +a +a +a +a +a +a +b +b +b +b +b +b +b +b +b +b +b +c +c +"} +(5,1,1) = {" +a +a +a +b +b +b +b +b +b +b +b +d +b +d +d +d +b +c +c +"} +(6,1,1) = {" +a +a +b +b +b +b +d +b +d +d +d +d +d +d +d +d +b +c +c +"} +(7,1,1) = {" +a +b +b +c +c +d +d +d +d +d +d +d +b +d +d +d +b +c +c +"} +(8,1,1) = {" +a +b +b +c +c +f +d +d +d +d +d +c +c +c +d +b +b +c +c +"} +(9,1,1) = {" +a +b +b +c +c +d +d +c +c +c +c +c +c +c +d +d +b +c +c +"} +(10,1,1) = {" +a +b +b +c +c +d +d +c +c +c +c +c +c +c +b +b +b +c +c +"} +(11,1,1) = {" +a +b +b +c +c +d +d +c +c +c +c +c +c +c +d +d +b +c +c +"} +(12,1,1) = {" +a +b +b +c +c +d +d +b +d +d +d +c +c +c +b +d +b +c +c +"} +(13,1,1) = {" +a +b +b +c +c +d +d +b +d +d +d +d +b +d +d +d +b +c +c +"} +(14,1,1) = {" +a +a +b +b +b +b +d +b +d +d +d +d +b +d +e +d +b +c +c +"} +(15,1,1) = {" +a +a +a +b +b +b +b +b +b +b +b +d +b +d +d +d +b +c +c +"} +(16,1,1) = {" +a +a +a +a +a +a +b +b +b +b +b +b +b +b +b +b +b +c +c +"} +(17,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +b +b +b +b +b +b +a +a +"} +(18,1,1) = {" +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 +"} diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm index b4fd977fe7b8c..36d32b27206b4 100644 --- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm +++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm @@ -210,7 +210,7 @@ /area/ruin/space/has_grav/derelictoutpost/powerstorage) "aN" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -1152,7 +1152,7 @@ /area/ruin/space/has_grav/derelictoutpost/cargobay) "cH" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/structure/cable/yellow{ icon_state = "1-4" @@ -1903,7 +1903,7 @@ /area/ruin/space/has_grav/derelictoutpost/cargostorage) "dY" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/stack/sheet/plasteel/twenty, /obj/effect/turf_decal/delivery, @@ -2007,7 +2007,7 @@ /area/ruin/space/has_grav/derelictoutpost/cargostorage) "ek" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/stack/sheet/cardboard/fifty, /obj/effect/turf_decal/delivery, @@ -2053,7 +2053,7 @@ /area/ruin/space/has_grav/derelictoutpost/cargostorage) "eq" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/crowbar, /turf/open/floor/plasteel, @@ -2137,7 +2137,7 @@ /area/ruin/space/has_grav/derelictoutpost/cargostorage) "eB" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/paicard, /obj/machinery/light, diff --git a/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm b/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm index f456b0a530318..256686920d20e 100644 --- a/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm +++ b/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm @@ -69,7 +69,7 @@ /turf/open/floor/plasteel/white, /area/ruin/space/has_grav/powered/ancient_shuttle) "j" = ( -/obj/machinery/computer/prototype_cloning, +/obj/machinery/computer/cloning/prototype, /obj/machinery/light{ dir = 1 }, diff --git a/_maps/RandomRuins/SpaceRuins/crashedclownship.dmm b/_maps/RandomRuins/SpaceRuins/crashedclownship.dmm index 3adef24b4e1d8..b860576f0e01d 100644 --- a/_maps/RandomRuins/SpaceRuins/crashedclownship.dmm +++ b/_maps/RandomRuins/SpaceRuins/crashedclownship.dmm @@ -36,7 +36,7 @@ /area/ruin/unpowered) "j" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/stack/ore/bananium, /turf/open/floor/mineral/bananium/airless, diff --git a/_maps/RandomRuins/SpaceRuins/crashedship.dmm b/_maps/RandomRuins/SpaceRuins/crashedship.dmm index 08ee4fd17a2ea..c2e8c1f68dfd8 100644 --- a/_maps/RandomRuins/SpaceRuins/crashedship.dmm +++ b/_maps/RandomRuins/SpaceRuins/crashedship.dmm @@ -2,496 +2,356 @@ "aa" = ( /turf/template_noop, /area/template_noop) -"ab" = ( -/obj/item/circular_saw, -/obj/structure/lattice, -/turf/template_noop, -/area/space/nearstation) -"ac" = ( -/turf/closed/wall/mineral/titanium, -/area/awaymission/BMPship/Aft) -"ae" = ( -/turf/closed/wall/mineral/titanium/overspace, -/area/awaymission/BMPship/Aft) -"ag" = ( -/obj/machinery/porta_turret{ - dir = 8; - set_obj_flags = "EMAGGED"; - installation = /obj/item/gun/energy/lasercannon - }, -/turf/open/floor/engine, -/area/awaymission/BMPship/Aft) -"ah" = ( -/turf/open/floor/engine, -/area/awaymission/BMPship/Aft) -"ai" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"aj" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle{ - dir = 4 - }, -/turf/open/floor/engine, -/area/awaymission/BMPship/Aft) -"ak" = ( -/obj/machinery/door/airlock/titanium, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"al" = ( -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"am" = ( -/obj/structure/lattice, -/turf/template_noop, -/area/space/nearstation) -"an" = ( +"af" = ( /obj/structure/window/reinforced, /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 }, /turf/open/floor/engine, /area/awaymission/BMPship/Aft) -"ao" = ( -/obj/machinery/light/small, -/turf/open/floor/engine, -/area/awaymission/BMPship/Aft) -"ap" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/awaymission/BMPship/Midship) -"aq" = ( -/turf/closed/wall/mineral/titanium, -/area/awaymission/BMPship/Midship) -"ar" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/titanium, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/awaymission/BMPship/Aft) -"as" = ( -/obj/structure/bed/roller, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"at" = ( -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"au" = ( -/obj/item/restraints/handcuffs, -/obj/item/restraints/handcuffs, -/obj/structure/closet/crate, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"av" = ( -/obj/item/scalpel, -/obj/structure/closet/crate, -/obj/item/tank/internals/anesthetic, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"aw" = ( -/obj/item/bodybag, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"ax" = ( -/obj/item/storage/box/syringes, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"ay" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"az" = ( -/obj/structure/table/optable, +"aH" = ( /obj/structure/cable{ icon_state = "4-8" }, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"aA" = ( -/obj/machinery/computer/operating{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-8" +"ba" = ( +/obj/effect/decal/remains/human, +/obj/item/clothing/head/helmet/space/syndicate/green/dark, +/obj/effect/gibspawner/generic, +/turf/open/floor/plating/asteroid/airless, +/area/awaymission/BMPship) +"bS" = ( +/obj/item/shard{ + icon_state = "medium" }, -/turf/open/floor/plating/airless, +/turf/open/floor/carpet, +/area/awaymission/BMPship/Fore) +"cF" = ( +/turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"aB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 +"cI" = ( +/obj/structure/window/reinforced{ + dir = 8 }, +/obj/structure/window/reinforced, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"aC" = ( -/obj/structure/closet/crate/freezer, -/obj/item/organ/appendix, -/obj/item/reagent_containers/food/snacks/meat/slab, -/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/golem, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, +"dh" = ( +/obj/item/wrench, /turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"aD" = ( +/area/awaymission/BMPship/Midship) +"dx" = ( /obj/structure/closet/crate/freezer, -/obj/item/organ/brain, /obj/item/reagent_containers/food/snacks/meat/slab, -/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, +/obj/item/reagent_containers/food/snacks/meat/slab, +/turf/open/floor/plasteel/white, /area/awaymission/BMPship/Aft) -"aE" = ( -/obj/structure/table, -/obj/item/stack/packageWrap, -/obj/effect/turf_decal/stripes/line{ +"dz" = ( +/obj/machinery/light{ dir = 1 }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"aF" = ( -/obj/structure/table, -/obj/item/storage/box, -/obj/machinery/light/small{ +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"ew" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"aG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"ex" = ( +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"aI" = ( -/turf/closed/wall/mineral/titanium/overspace, -/area/awaymission/BMPship/Fore) -"aL" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-4" }, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"aM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"aN" = ( -/obj/item/storage/box, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"aO" = ( -/obj/item/hand_labeler, -/turf/open/floor/plating, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"eA" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/titanium, +/turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"aP" = ( -/obj/structure/closet/crate/large, -/obj/effect/turf_decal/stripes/line{ +"eN" = ( +/obj/structure/window/reinforced{ dir = 4 }, /turf/open/floor/plating, +/area/awaymission/BMPship/Midship) +"eR" = ( +/obj/machinery/light/small, +/turf/open/floor/engine, /area/awaymission/BMPship/Aft) -"aR" = ( -/obj/structure/table/wood, -/obj/item/stack/spacecash/c500, -/obj/item/stack/spacecash/c100, -/obj/item/reagent_containers/food/drinks/beer, -/turf/open/floor/wood, -/area/awaymission/BMPship/Fore) -"aS" = ( -/obj/structure/bed, -/obj/item/bedsheet/yellow, -/turf/open/floor/wood, -/area/awaymission/BMPship/Fore) -"aT" = ( -/turf/closed/wall/mineral/titanium, -/area/awaymission/BMPship/Fore) -"aU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 +"fb" = ( +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Fore) -"aV" = ( -/obj/structure/rack, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/cable{ + icon_state = "1-8" }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Fore) -"aW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Aft) +"fz" = ( +/obj/structure/cable{ + icon_state = "0-2" }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Fore) -"aX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/machinery/power/apc/unlocked{ + dir = 1; + environ = 0; + equipment = 3; + pixel_y = 23; + req_access = null }, /turf/open/floor/plating, -/area/awaymission/BMPship/Fore) -"aY" = ( -/obj/structure/sign/warning/vacuum, -/turf/closed/wall/mineral/titanium, -/area/awaymission/BMPship/Fore) -"bb" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/gibspawner/human, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"bc" = ( -/obj/structure/cable{ - icon_state = "1-4" +/area/awaymission/BMPship/Aft) +"fM" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/obj/item/clothing/glasses/regular/hipster, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"be" = ( -/obj/machinery/door/airlock/titanium, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/turf/open/floor/plating/airless, +/turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"bf" = ( -/obj/structure/cable{ - icon_state = "4-8" +"gZ" = ( +/obj/item/shard{ + icon_state = "medium" }, +/turf/template_noop, +/area/template_noop) +"hI" = ( +/obj/effect/decal/remains/human, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Aft) +"hU" = ( +/obj/structure/rack, +/obj/item/storage/belt/utility/full, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"bg" = ( +"ia" = ( +/obj/machinery/power/smes/magical{ + desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; + name = "power storage unit" + }, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "0-2" + }, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" }, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"bh" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/drinks/beer, -/obj/item/reagent_containers/food/drinks/beer, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"bi" = ( -/obj/machinery/computer/teleporter, -/turf/open/floor/plating, +"ic" = ( +/obj/structure/closet/crate, +/obj/item/stack/spacecash/c10, +/obj/item/stack/spacecash/c200, +/turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"bj" = ( -/obj/machinery/teleport/station, +"id" = ( +/obj/machinery/porta_turret{ + dir = 8; + set_obj_flags = "EMAGGED"; + installation = /obj/item/gun/energy/lasercannon + }, +/turf/open/floor/engine, +/area/awaymission/BMPship/Fore) +"ik" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/awaymission/BMPship/Midship) +"iy" = ( +/obj/item/hand_labeler, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"bk" = ( -/obj/machinery/teleport/hub, +"iA" = ( /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"bl" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Fore) -"bm" = ( -/turf/open/floor/wood, -/area/awaymission/BMPship/Fore) -"bn" = ( -/obj/machinery/light/small{ - dir = 4 +"iV" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/wood, -/area/awaymission/BMPship/Fore) -"bo" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plating, -/area/awaymission/BMPship/Fore) -"bp" = ( -/turf/open/floor/plating, -/area/awaymission/BMPship/Fore) -"bq" = ( -/obj/machinery/door/airlock/external, -/turf/open/floor/plating, -/area/awaymission/BMPship/Fore) -"bs" = ( -/obj/structure/closet/crate, -/obj/item/stack/spacecash/c1000, -/obj/item/stack/spacecash/c50, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"bt" = ( -/obj/structure/window/reinforced, -/obj/effect/spawner/structure/window/hollow/reinforced/middle{ +"iZ" = ( +/obj/machinery/computer/arcade, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Aft) +"jd" = ( +/obj/machinery/light{ dir = 4 }, -/turf/open/floor/plating/airless, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet, /area/awaymission/BMPship/Fore) -"bu" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken" +"jg" = ( +/obj/machinery/light/small, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"jv" = ( +/obj/machinery/vending/hydroseeds{ + slogan_delay = 700 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, -/area/awaymission/BMPship/Fore) -"bv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"jx" = ( +/obj/structure/cable, +/turf/open/floor/plating/airless{ + icon_state = "platingdmg3" }, -/turf/open/floor/plating, /area/awaymission/BMPship/Fore) -"bw" = ( -/obj/machinery/light/small, -/obj/effect/turf_decal/stripes/line{ - dir = 2 +"jD" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 }, /turf/open/floor/plating, /area/awaymission/BMPship/Fore) -"bx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating, +"jL" = ( +/obj/structure/sign/warning/vacuum, +/turf/closed/wall/mineral/titanium, /area/awaymission/BMPship/Fore) -"by" = ( -/obj/machinery/light, -/obj/effect/decal/cleanable/blood/gibs/old, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"bA" = ( -/obj/machinery/sleeper{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"bB" = ( -/obj/machinery/sleeper, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"bC" = ( -/obj/machinery/light, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"bD" = ( +"jT" = ( /obj/structure/cable{ icon_state = "1-4" }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"bE" = ( +/obj/item/clothing/glasses/regular/hipster, +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Midship) +"kg" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/item/hand_labeler, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"bG" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-4" }, -/obj/item/storage/box, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"bH" = ( -/obj/effect/turf_decal/stripes/line{ +"kp" = ( +/obj/structure/frame/computer{ + anchored = 1; dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"bK" = ( -/obj/machinery/door/poddoor/shutters{ - id = "packerMed" +/turf/open/floor/carpet, +/area/awaymission/BMPship/Fore) +"ku" = ( +/obj/item/shard{ + icon_state = "small" + }, +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"bL" = ( -/obj/structure/closet/crate/large, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/area/awaymission/BMPship/Fore) +"kB" = ( +/obj/machinery/power/terminal{ + dir = 8 }, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"bM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 +"kC" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/showroomfloor, /area/awaymission/BMPship/Aft) -"bN" = ( -/obj/machinery/light/small, -/obj/effect/turf_decal/stripes/line{ - dir = 2 +"kI" = ( +/obj/structure/window/reinforced{ + dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"bO" = ( -/obj/structure/kitchenspike, -/obj/effect/turf_decal/stripes/line{ - dir = 2 +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/BMPship/Midship) +"kJ" = ( +/obj/effect/gibspawner/human, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"bP" = ( +"kS" = ( /obj/structure/closet/crate, -/obj/item/analyzer, /obj/item/stack/spacecash/c10, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"bQ" = ( -/obj/structure/closet/crate, -/obj/item/stack/spacecash/c1000, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c500, -/obj/effect/turf_decal/stripes/line{ - dir = 2 +"kY" = ( +/obj/structure/window/reinforced{ + dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"bR" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/snacks/hugemushroomslice, -/obj/item/organ/appendix, -/obj/item/reagent_containers/food/snacks/meat/slab, -/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/golem/adamantine, -/obj/effect/turf_decal/stripes/line{ - dir = 2 +/turf/open/floor/plasteel{ + icon_state = "panelscorched" }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"bT" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/awaymission/BMPship/Midship) +"kZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 +/obj/machinery/light/small{ + dir = 1 }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"bU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"ld" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 4 }, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"bV" = ( -/turf/open/floor/carpet, +"lg" = ( +/turf/open/floor/plating/asteroid/airless, /area/awaymission/BMPship/Fore) -"bW" = ( +"lh" = ( +/obj/machinery/door/window{ + base_state = "right"; + dir = 4; + icon_state = "right" + }, +/turf/open/floor/plating, +/area/awaymission/BMPship/Midship) +"lm" = ( +/turf/open/floor/plating/airless{ + icon_state = "platingdmg3" + }, +/area/awaymission/BMPship/Midship) +"ln" = ( /obj/structure/cable{ icon_state = "0-2" }, @@ -504,114 +364,114 @@ }, /turf/open/floor/carpet, /area/awaymission/BMPship/Fore) -"bX" = ( -/obj/structure/table, -/obj/item/screwdriver, -/obj/item/screwdriver, -/obj/item/paper/fluff/ruins/crashedship/scribbled, -/obj/item/screwdriver, +"lA" = ( +/turf/open/floor/plasteel/showroomfloor, +/area/awaymission/BMPship/Aft) +"lC" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"bY" = ( -/obj/machinery/light{ +"lH" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ dir = 1 }, +/turf/open/floor/engine, +/area/awaymission/BMPship/Aft) +"lZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"bZ" = ( -/obj/machinery/hydroponics, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 +"mb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Midship) -"ca" = ( -/obj/structure/sink{ - dir = 2 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/yellow{ +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"cb" = ( -/obj/machinery/vending/hydroseeds{ - slogan_delay = 700 +"md" = ( +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Fore) +"me" = ( +/obj/machinery/door/poddoor/shutters{ + id = "packerMed" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +/obj/machinery/button/door{ + id = "packerMed"; + pixel_x = -24 }, -/turf/open/floor/plasteel, +/turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"cc" = ( -/obj/machinery/vending/hydronutrients, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, +"mo" = ( +/obj/effect/gibspawner/xeno, +/turf/open/floor/plating, /area/awaymission/BMPship/Midship) -"cd" = ( -/obj/machinery/hydroponics, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, +"mu" = ( +/turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"ce" = ( +"mw" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/beer, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"cf" = ( -/obj/structure/table, -/obj/item/kitchen/knife/butcher, -/obj/item/reagent_containers/food/drinks/beer, -/obj/item/reagent_containers/food/snacks/meat, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +"mO" = ( +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/turf/open/floor/plating/airless{ + icon_state = "platingdmg3" }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/BMPship/Midship) -"cg" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/obj/effect/turf_decal/tile/blue{ +/area/awaymission/BMPship/Fore) +"mS" = ( +/turf/open/floor/plating/airless{ + icon_state = "platingdmg3" + }, +/area/awaymission/BMPship/Fore) +"mX" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/turf/closed/wall/r_wall, +/area/awaymission/BMPship/Midship) +"nk" = ( +/obj/machinery/door/airlock/titanium, +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plasteel/cafeteria, +/turf/open/floor/plating, /area/awaymission/BMPship/Midship) -"ch" = ( -/obj/structure/table, -/obj/machinery/microwave, +"nl" = ( +/obj/machinery/processor, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -620,14 +480,11 @@ }, /turf/open/floor/plasteel/cafeteria, /area/awaymission/BMPship/Midship) -"ci" = ( -/obj/machinery/processor, -/obj/machinery/light{ - dir = 1 - }, +"nq" = ( /obj/structure/window/reinforced{ dir = 4 }, +/obj/structure/window/reinforced, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -636,28 +493,36 @@ }, /turf/open/floor/plasteel/cafeteria, /area/awaymission/BMPship/Midship) -"cj" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/beer, +"nw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"ck" = ( -/obj/structure/table, -/obj/item/kitchen/knife, +"nx" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"cl" = ( -/obj/structure/table, -/obj/machinery/light/small{ - dir = 1 +"nO" = ( +/turf/open/floor/plasteel/white, +/area/awaymission/BMPship/Aft) +"nT" = ( +/obj/item/crowbar, +/turf/open/floor/plasteel/white, +/area/awaymission/BMPship/Aft) +"nV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -665,419 +530,352 @@ }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"cm" = ( +"og" = ( /obj/structure/table, -/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/screwdriver, +/obj/item/screwdriver, +/obj/item/paper/fluff/ruins/crashedship/scribbled, +/obj/item/screwdriver, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"cn" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/titanium, +"oh" = ( +/obj/item/reagent_containers/food/drinks/beer, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"cp" = ( -/obj/item/reagent_containers/food/snacks/hugemushroomslice, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +"ol" = ( +/obj/structure/rack, +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Fore) +"oo" = ( +/obj/structure/cable{ + icon_state = "0-8" }, +/obj/item/wallframe/apc, /turf/open/floor/plasteel, -/area/awaymission/BMPship/Midship) -"cq" = ( -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Midship) -"cr" = ( -/obj/item/reagent_containers/food/drinks/beer, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Midship) -"cs" = ( -/obj/effect/turf_decal/tile/blue{ +/area/awaymission/BMPship/Aft) +"ou" = ( +/obj/effect/turf_decal/loading_area{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"ct" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +"ov" = ( +/obj/item/mop, +/turf/open/floor/plasteel/showroomfloor, +/area/awaymission/BMPship/Aft) +"oy" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "meatConvey2" }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/BMPship/Midship) -"cu" = ( -/obj/structure/chair/stool, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"cv" = ( -/obj/structure/kitchenspike, -/turf/open/floor/plasteel/showroomfloor, -/area/awaymission/BMPship/Aft) -"cw" = ( -/turf/open/floor/plasteel/showroomfloor, +"oB" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"cx" = ( -/obj/machinery/door/airlock/titanium, -/turf/open/floor/plasteel/showroomfloor, +"oK" = ( +/obj/machinery/light/small, +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"cy" = ( -/turf/open/floor/plasteel/white, +"pb" = ( +/turf/open/floor/engine, /area/awaymission/BMPship/Aft) -"cz" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel/white, +"pk" = ( +/obj/item/poster/random_contraband, +/turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"cA" = ( -/obj/effect/decal/cleanable/blood/gibs/old, +"pE" = ( +/obj/effect/decal/cleanable/blood/splatter, /turf/open/floor/plasteel/white, /area/awaymission/BMPship/Aft) -"cB" = ( -/obj/machinery/gibber, -/turf/open/floor/plasteel/white, +"pK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"cE" = ( -/turf/open/floor/plasteel, +"pM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"cG" = ( -/turf/closed/wall/mineral/titanium/interior, -/area/awaymission/BMPship/Fore) -"cH" = ( -/obj/structure/cable{ - icon_state = "1-4" +"pQ" = ( +/obj/item/clothing/suit/caution, +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Midship) +"pT" = ( +/obj/structure/chair/stool, +/turf/open/floor/plating/airless{ + icon_state = "platingdmg3" }, -/turf/open/floor/carpet, /area/awaymission/BMPship/Fore) -"cI" = ( +"qc" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/titanium, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "1-2" }, -/turf/open/floor/carpet, -/area/awaymission/BMPship/Fore) -"cJ" = ( -/obj/item/reagent_containers/food/snacks/hugemushroomslice, /turf/open/floor/plasteel, -/area/awaymission/BMPship/Midship) -"cK" = ( -/obj/machinery/door/airlock/titanium, +/area/awaymission/BMPship/Aft) +"qe" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"cL" = ( -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/BMPship/Midship) -"cM" = ( -/obj/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/BMPship/Midship) -"cN" = ( -/obj/machinery/door/window, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +"qi" = ( +/obj/structure/kitchenspike, +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/BMPship/Midship) -"cO" = ( +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"ql" = ( /obj/structure/window/reinforced{ dir = 4 }, /obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/BMPship/Midship) -"cP" = ( -/obj/item/reagent_containers/food/drinks/beer, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Midship) -"cQ" = ( +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"qq" = ( /obj/structure/cable{ - icon_state = "0-2" + icon_state = "4-8" }, /turf/open/floor/plasteel/showroomfloor, /area/awaymission/BMPship/Aft) -"cR" = ( -/obj/structure/closet/secure_closet/freezer/meat/open{ - opened = 1 +"qA" = ( +/turf/closed/mineral/random, +/area/awaymission/BMPship) +"qE" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 4 }, -/turf/open/floor/plasteel/white, -/area/awaymission/BMPship/Aft) -"cS" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/snacks/meat/slab, -/obj/item/reagent_containers/food/snacks/meat/slab, -/turf/open/floor/plasteel/white, -/area/awaymission/BMPship/Aft) -"cT" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/plasteel/white, -/area/awaymission/BMPship/Aft) -"cU" = ( -/obj/item/crowbar, -/turf/open/floor/plasteel/white, +/obj/item/shard{ + icon_state = "small" + }, +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Fore) +"qG" = ( +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/awaymission/BMPship/Fore) +"qO" = ( +/turf/closed/wall/mineral/titanium/overspace, +/area/awaymission/BMPship/Fore) +"qS" = ( +/obj/item/storage/box/matches, +/obj/item/storage/fancy/cigarettes/dromedaryco, +/turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"cV" = ( -/obj/effect/turf_decal/stripes/line{ +"qT" = ( +/obj/machinery/computer/operating{ dir = 8 }, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"cW" = ( /obj/structure/cable{ - icon_state = "0-2" + icon_state = "0-8" }, -/obj/machinery/power/apc/unlocked{ - dir = 1; - environ = 0; - equipment = 3; - pixel_y = 23; - req_access = null +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Midship) +"qW" = ( +/obj/machinery/light/small, +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, /turf/open/floor/plating, +/area/awaymission/BMPship/Fore) +"re" = ( +/obj/machinery/light, +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Midship) +"rv" = ( +/obj/structure/table, +/obj/item/pen/red, +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"cX" = ( -/obj/effect/turf_decal/stripes/line{ +"rB" = ( +/obj/structure/shuttle/engine/propulsion{ dir = 4 }, -/turf/open/floor/plasteel, +/turf/template_noop, /area/awaymission/BMPship/Aft) -"cY" = ( +"rL" = ( /obj/structure/table, /obj/item/paper/fluff/ruins/crashedship/captains_log, /turf/open/floor/carpet, /area/awaymission/BMPship/Fore) -"cZ" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/beer, -/turf/open/floor/carpet, +"sp" = ( +/turf/open/floor/plating, /area/awaymission/BMPship/Fore) -"da" = ( +"sM" = ( /obj/structure/frame/computer{ - anchored = 1 + anchored = 1; + dir = 1 }, -/turf/open/floor/carpet, -/area/awaymission/BMPship/Fore) -"db" = ( -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/plating/airless{ + icon_state = "platingdmg1" }, -/turf/open/floor/carpet, /area/awaymission/BMPship/Fore) -"dc" = ( -/obj/machinery/hydroponics, -/obj/effect/turf_decal/tile/green{ - dir = 1 +"sP" = ( +/obj/machinery/gibber, +/turf/open/floor/plasteel/white, +/area/awaymission/BMPship/Aft) +"sV" = ( +/obj/machinery/door/airlock/titanium, +/turf/open/floor/plasteel/showroomfloor, +/area/awaymission/BMPship/Aft) +"sZ" = ( +/obj/structure/window/reinforced, +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Fore) +"td" = ( +/obj/structure/rack, +/obj/item/stock_parts/cell/high, +/obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plasteel, -/area/awaymission/BMPship/Midship) -"dd" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 +/area/awaymission/BMPship/Aft) +"tf" = ( +/turf/open/floor/plating/airless{ + icon_state = "platingdmg2" }, -/turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"de" = ( -/obj/machinery/seed_extractor, -/obj/item/seeds/plump/walkingmushroom, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ +"to" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/cafeteria, /area/awaymission/BMPship/Midship) -"df" = ( -/obj/machinery/hydroponics, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ +"ts" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ dir = 8 }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/awaymission/BMPship/Midship) -"dg" = ( -/obj/structure/cable{ - icon_state = "2-4" +"tw" = ( +/obj/structure/closet/crate/large, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"tx" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"tA" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "meatConvey2" }, -/turf/open/floor/plasteel, +/obj/item/kitchen/knife, +/turf/open/floor/plating, /area/awaymission/BMPship/Midship) -"di" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, +"tB" = ( +/obj/structure/lattice, +/turf/template_noop, /area/awaymission/BMPship/Midship) -"dj" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/showroomfloor, -/area/awaymission/BMPship/Aft) -"dk" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/awaymission/BMPship/Aft) -"dl" = ( -/obj/structure/cable{ - icon_state = "1-4" +"tI" = ( +/obj/machinery/light/small{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "2-4" +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"dm" = ( -/obj/structure/cable{ - icon_state = "4-8" +"tP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"dn" = ( +"tV" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/cable{ - icon_state = "2-4" +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"uf" = ( +/obj/effect/decal/cleanable/oil, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"do" = ( +"ur" = ( /obj/structure/cable{ - icon_state = "1-8" + icon_state = "1-4" }, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"dq" = ( -/obj/item/multitool, -/turf/open/floor/engine, -/area/awaymission/BMPship/Aft) -"dr" = ( -/obj/structure/shuttle/engine/heater{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/engine/airless, -/area/awaymission/BMPship/Aft) -"ds" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 4 +"ut" = ( +/turf/closed/wall/mineral/titanium, +/area/awaymission/BMPship) +"uC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/turf/template_noop, -/area/awaymission/BMPship/Aft) -"dt" = ( -/obj/structure/table, -/obj/machinery/recharger, -/turf/open/floor/carpet, -/area/awaymission/BMPship/Fore) -"du" = ( -/obj/structure/chair/stool, -/turf/open/floor/carpet, +/turf/open/floor/plating, /area/awaymission/BMPship/Fore) -"dv" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" +"uE" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 }, -/turf/open/floor/carpet, +/turf/open/floor/plating, /area/awaymission/BMPship/Fore) -"dw" = ( +"uF" = ( /obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ dir = 1 }, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Midship) -"dx" = ( -/obj/structure/cable{ - icon_state = "2-4" +/turf/open/floor/plating/airless{ + icon_state = "platingdmg1" }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/area/awaymission/BMPship/Midship) +"uJ" = ( +/turf/open/floor/plating/airless{ + icon_state = "platingdmg1" }, -/turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"dy" = ( +"uU" = ( +/obj/structure/mopbucket, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"uY" = ( /obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 + icon_state = "2-8" }, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Midship) -"dz" = ( /obj/structure/cable{ icon_state = "1-2" }, @@ -1087,67 +885,58 @@ }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"dA" = ( -/obj/machinery/light/small{ +"vc" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Fore) +"vq" = ( +/obj/machinery/door/airlock/titanium, +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Midship) -"dB" = ( -/turf/closed/wall/r_wall, +/turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"dC" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/awaymission/BMPship/Aft) -"dD" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"vQ" = ( +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"dE" = ( /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"dG" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end{ +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"vY" = ( +/obj/machinery/teleport/station, /turf/open/floor/plating, -/area/awaymission/BMPship/Fore) -"dH" = ( -/obj/item/shard, +/area/awaymission/BMPship/Aft) +"wc" = ( +/obj/structure/chair/stool, /turf/open/floor/carpet, /area/awaymission/BMPship/Fore) -"dI" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "1-4" +"wi" = ( +/obj/machinery/power/smes/magical{ + desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; + name = "power storage unit" }, -/turf/open/floor/carpet, -/area/awaymission/BMPship/Fore) -"dJ" = ( -/obj/machinery/door/airlock/titanium, +/obj/structure/cable, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"wk" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/food/snacks/meat, +/turf/open/floor/plasteel/showroomfloor, +/area/awaymission/BMPship/Aft) +"wu" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-8" }, -/turf/open/floor/carpet, -/area/awaymission/BMPship/Fore) -"dK" = ( /obj/structure/cable{ icon_state = "1-8" }, @@ -1157,34 +946,50 @@ }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"dL" = ( -/obj/machinery/shieldwallgen, -/obj/structure/cable{ - icon_state = "0-4" - }, +"ww" = ( /turf/open/floor/plating, /area/awaymission/BMPship/Midship) -"dM" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-2" +"wN" = ( +/obj/structure/window/reinforced{ + dir = 4 }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +/obj/structure/window/reinforced{ dir = 1 }, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"wT" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel, +/area/awaymission/BMPship/Aft) +"wY" = ( +/turf/closed/wall/r_wall, /area/awaymission/BMPship/Midship) -"dN" = ( -/obj/structure/cable{ - icon_state = "0-2" +"xk" = ( +/obj/item/clothing/gloves/color/fyellow, +/turf/open/floor/plating/asteroid/airless, +/area/awaymission/BMPship) +"xl" = ( +/obj/machinery/door/window, +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/machinery/power/apc/unlocked{ - dir = 1; - pixel_y = 23; - req_access = null +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/BMPship/Midship) +"xr" = ( +/turf/open/floor/plating/airless{ + icon_state = "platingdmg1" + }, +/area/awaymission/BMPship/Fore) +"xR" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -1192,49 +997,33 @@ }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"dO" = ( -/obj/effect/turf_decal/loading_area{ - dir = 4 +"yd" = ( +/obj/item/reagent_containers/food/drinks/beer, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"dP" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "meatConvey1" - }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Midship) -"dQ" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "meatConvey1" - }, -/obj/structure/plasticflaps, -/turf/open/floor/plating, -/area/awaymission/BMPship/Midship) -"dR" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/deliveryChute{ +"yh" = ( +/obj/machinery/light/small{ dir = 8 }, /turf/open/floor/plating, -/area/awaymission/BMPship/Midship) -"dS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/awaymission/BMPship/Midship) -"dT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/area/awaymission/BMPship/Aft) +"ym" = ( +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/plasteel/white, +/area/awaymission/BMPship/Aft) +"yo" = ( +/obj/item/multitool, +/turf/open/floor/plating/airless{ + icon_state = "platingdmg2" }, +/area/awaymission/BMPship) +"yB" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-4" }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -1242,137 +1031,186 @@ }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"dU" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +"yE" = ( +/obj/machinery/hydroponics, +/obj/effect/turf_decal/tile/green{ dir = 1 }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"dV" = ( -/obj/structure/window/reinforced{ +"yI" = ( +/obj/structure/toilet{ dir = 8 }, -/obj/structure/window/reinforced{ +/obj/machinery/light/small{ dir = 1 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/cafeteria{ + dir = 2 + }, /area/awaymission/BMPship/Aft) -"dW" = ( -/obj/structure/window/reinforced{ - dir = 1 +"yJ" = ( +/obj/machinery/hydroponics, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"yX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Aft) +"zd" = ( +/obj/structure/closet/crate, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c500, +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"dX" = ( -/obj/structure/window/reinforced{ +"zp" = ( +/obj/machinery/vending/hydronutrients, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/structure/window/reinforced{ +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"zw" = ( +/obj/machinery/hydroponics, +/obj/effect/turf_decal/tile/green{ dir = 1 }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"dY" = ( -/obj/structure/rack, -/obj/item/storage/box/lights, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/green{ dir = 8 }, /turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"ea" = ( -/obj/machinery/power/smes/magical{ - desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; - name = "power storage unit" - }, +/area/awaymission/BMPship/Midship) +"zz" = ( /obj/structure/cable{ - icon_state = "0-2" + icon_state = "1-2" }, -/obj/structure/cable, +/turf/open/floor/plasteel/showroomfloor, +/area/awaymission/BMPship/Aft) +"zK" = ( +/obj/machinery/shieldwallgen, /obj/structure/cable{ - icon_state = "0-2" + icon_state = "0-4" }, /turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"eb" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, +/area/awaymission/BMPship/Midship) +"zO" = ( +/obj/structure/window/reinforced, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"ed" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle{ +"zQ" = ( +/obj/machinery/light{ dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Fore) -"ee" = ( -/obj/structure/table, +/obj/structure/closet, /turf/open/floor/carpet, /area/awaymission/BMPship/Fore) -"ef" = ( -/obj/structure/chair{ - dir = 8 +"zR" = ( +/obj/machinery/door/airlock/titanium, +/turf/open/floor/plasteel/cafeteria{ + dir = 2 }, -/turf/open/floor/carpet, +/area/awaymission/BMPship/Aft) +"zU" = ( +/turf/closed/wall/mineral/titanium, /area/awaymission/BMPship/Fore) -"eg" = ( -/obj/item/shard{ - icon_state = "medium" +"Ad" = ( +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/open/floor/carpet, -/area/awaymission/BMPship/Fore) -"eh" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/BMPship/Midship) -"ei" = ( -/obj/structure/window/reinforced{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Midship) -"ej" = ( -/turf/open/floor/plating, -/area/awaymission/BMPship/Midship) -"ek" = ( -/obj/item/reagent_containers/glass/bucket, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"el" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "meatConvey1" - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +"AA" = ( +/obj/structure/rack, +/obj/item/storage/box/lights, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/plasteel, +/area/awaymission/BMPship/Aft) +"AR" = ( +/obj/machinery/sleeper, +/turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"em" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 +"AT" = ( +/obj/structure/shuttle/engine/heater{ + dir = 4 }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/structure/window/reinforced{ + dir = 8 }, -/turf/open/floor/plasteel, +/turf/open/floor/engine/airless, +/area/awaymission/BMPship/Aft) +"Bl" = ( +/obj/item/restraints/handcuffs, +/obj/item/restraints/handcuffs, +/obj/structure/closet/crate, +/turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"en" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"Br" = ( +/obj/structure/kitchenspike, +/turf/open/floor/plasteel/showroomfloor, +/area/awaymission/BMPship/Aft) +"Bt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"Bu" = ( +/obj/machinery/door/poddoor/shutters{ + id = "packerMine" + }, +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Midship) +"BA" = ( +/obj/structure/closet, +/obj/item/clothing/under/misc/overalls, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Aft) +"BC" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/food/snacks/hugemushroomslice, +/obj/item/organ/appendix, +/obj/item/reagent_containers/food/snacks/meat/slab, +/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/golem/adamantine, +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"BI" = ( +/turf/template_noop, +/area/awaymission/BMPship) +"BL" = ( /obj/machinery/light/small{ - dir = 1 + dir = 4 }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -1380,80 +1218,79 @@ }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"eo" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"BP" = ( +/obj/structure/mecha_wreckage/ripley, +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Midship) +"BY" = ( +/obj/structure/cable{ + icon_state = "0-2" }, /turf/open/floor/plasteel/showroomfloor, /area/awaymission/BMPship/Aft) -"ep" = ( +"Cd" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/obj/item/storage/wallet/random, /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"eq" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/disposaloutlet{ +"Ci" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"er" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"es" = ( -/obj/structure/window/reinforced{ - dir = 4 +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"et" = ( +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/BMPship/Midship) +"Cn" = ( /obj/structure/rack, -/obj/item/storage/belt/utility/full, /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 1 }, +/turf/open/floor/plating, +/area/awaymission/BMPship/Fore) +"Co" = ( +/obj/structure/bed/roller, +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Midship) +"Cw" = ( +/obj/structure/table, +/obj/item/paper/fluff/ruins/crashedship/old_diary, /turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"ev" = ( -/obj/structure/cable{ - icon_state = "2-4" +"CB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, -/turf/open/floor/carpet, +/turf/open/floor/plating, /area/awaymission/BMPship/Fore) -"ew" = ( +"CH" = ( /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/carpet, -/area/awaymission/BMPship/Fore) -"ex" = ( +/obj/item/storage/box, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"CJ" = ( /obj/structure/cable{ - icon_state = "1-8" + icon_state = "2-4" }, /turf/open/floor/carpet, /area/awaymission/BMPship/Fore) -"ey" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/gibspawner/xeno, -/turf/open/floor/plating, -/area/awaymission/BMPship/Midship) -"ez" = ( +"CM" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "0-2" }, -/obj/structure/cable{ - icon_state = "2-4" +/obj/machinery/power/apc/unlocked{ + dir = 1; + pixel_y = 23; + req_access = null }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -1461,35 +1298,42 @@ }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"eA" = ( -/obj/structure/cable{ - icon_state = "4-8" +"CY" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end, +/turf/open/floor/engine, +/area/awaymission/BMPship/Aft) +"Do" = ( +/obj/structure/closet/secure_closet/freezer/meat/open{ + opened = 1 }, -/obj/structure/cable{ - icon_state = "1-4" +/turf/open/floor/plasteel/white, +/area/awaymission/BMPship/Aft) +"Dp" = ( +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 6 }, +/turf/open/floor/plating, +/area/awaymission/BMPship/Fore) +"Ds" = ( +/obj/item/reagent_containers/food/drinks/beer, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"eB" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +"Dz" = ( +/obj/structure/window/reinforced{ + dir = 4 }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"DT" = ( +/obj/machinery/door/airlock/titanium, +/turf/open/floor/plating, /area/awaymission/BMPship/Midship) -"eC" = ( +"Ed" = ( /obj/machinery/light/small{ - dir = 1 + dir = 8 }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -1497,223 +1341,163 @@ }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"eD" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"eE" = ( -/obj/effect/gibspawner/human, +"Et" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/food/drinks/beer, +/obj/item/reagent_containers/food/drinks/beer, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"eF" = ( -/obj/machinery/door/window{ - base_state = "right"; - dir = 4; - icon_state = "right" +"Ey" = ( +/obj/structure/window/reinforced{ + dir = 1 }, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"eG" = ( -/obj/structure/rack, -/obj/item/stock_parts/cell/high, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"eH" = ( -/obj/structure/window/reinforced{ - dir = 8 +"ER" = ( +/obj/structure/frame/computer{ + anchored = 1; + dir = 1 }, -/obj/effect/spawner/structure/window/hollow/reinforced/directional{ - dir = 6 +/turf/open/floor/plating/airless{ + icon_state = "panelscorched" }, -/turf/open/floor/plating, /area/awaymission/BMPship/Fore) -"eI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/BMPship/Midship) -"eJ" = ( -/obj/machinery/door/window{ - base_state = "right"; - dir = 4; - icon_state = "right" +"EV" = ( +/obj/machinery/door/airlock/titanium, +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plating, +/turf/open/floor/carpet, +/area/awaymission/BMPship/Fore) +"Fb" = ( +/obj/structure/bed, +/obj/item/bedsheet/yellow, +/turf/open/floor/wood, +/area/awaymission/BMPship/Fore) +"Fc" = ( +/turf/template_noop, +/area/space/nearstation) +"Fg" = ( +/obj/effect/gibspawner/robot, +/turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"eK" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +"Fm" = ( +/turf/open/floor/plating/asteroid/airless, +/area/awaymission/BMPship) +"Ft" = ( +/obj/structure/cable{ + icon_state = "1-8" }, /turf/open/floor/plasteel, -/area/awaymission/BMPship/Midship) -"eL" = ( -/obj/effect/gibspawner/generic, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +/area/awaymission/BMPship/Aft) +"Fu" = ( +/obj/structure/table, +/obj/machinery/light/small{ dir = 1 }, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Midship) -"eM" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"eO" = ( +"Fv" = ( +/obj/machinery/door/airlock/titanium, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"Fx" = ( +/obj/item/multitool, +/turf/open/floor/engine, +/area/awaymission/BMPship/Aft) +"Fz" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/awaymission/BMPship/Fore) +"Gh" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/showroomfloor, +/obj/machinery/door/airlock/titanium, +/turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"eP" = ( -/obj/structure/rack, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, +"Gw" = ( +/obj/structure/bed, /turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"eQ" = ( -/obj/machinery/power/smes/magical{ - desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; - name = "power storage unit" +"Gx" = ( +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/cable, -/obj/structure/cable, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"eS" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/power/port_gen/pacman/super, -/turf/open/floor/engine, -/area/awaymission/BMPship/Aft) -"eT" = ( -/obj/structure/closet, -/turf/open/floor/carpet, -/area/awaymission/BMPship/Fore) -"eU" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/closet, -/turf/open/floor/carpet, -/area/awaymission/BMPship/Fore) -"eV" = ( -/obj/item/wrench, -/turf/open/floor/plating, -/area/awaymission/BMPship/Midship) -"eW" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +"GG" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"eX" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"GH" = ( +/obj/item/stack/cable_coil{ + amount = 5 }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Fore) +"GT" = ( +/obj/machinery/door/poddoor/shutters{ + id = "packerMine" }, -/turf/open/floor/plasteel, +/obj/machinery/button/door{ + id = "packerMine"; + pixel_x = -24 + }, +/turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"eY" = ( -/obj/structure/mopbucket, -/turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"eZ" = ( -/obj/structure/window/reinforced{ - dir = 4 +"GU" = ( +/obj/structure/closet/crate/large, +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/obj/item/kitchen/knife, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"fa" = ( +"GY" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/item/stock_parts/cell/high, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"fc" = ( -/obj/machinery/door/airlock/titanium, -/turf/open/floor/carpet, -/area/awaymission/BMPship/Fore) -"fd" = ( -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/plating/airless{ + icon_state = "panelscorched" }, -/obj/machinery/door/airlock/titanium, -/turf/open/floor/carpet, /area/awaymission/BMPship/Fore) -"fe" = ( -/obj/effect/gibspawner/xeno, -/turf/open/floor/plating, -/area/awaymission/BMPship/Midship) -"ff" = ( -/obj/structure/window/reinforced{ +"Hh" = ( +/turf/closed/mineral/diamond, +/area/awaymission/BMPship) +"Hi" = ( +/obj/structure/table, +/obj/item/kitchen/knife/butcher, +/obj/item/reagent_containers/food/drinks/beer, +/obj/item/reagent_containers/food/snacks/meat, +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plasteel{ - icon_state = "panelscorched" - }, -/area/awaymission/BMPship/Midship) -"fg" = ( -/obj/structure/kitchenspike, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Midship) -"fi" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "meatConvey2" +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/obj/item/kitchen/knife, -/turf/open/floor/plating, +/turf/open/floor/plasteel/cafeteria, /area/awaymission/BMPship/Midship) -"fj" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "meatConvey2" +"Hq" = ( +/obj/structure/table/optable, +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/plasticflaps, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"fk" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "meatConvey2" - }, -/turf/open/floor/plating, +"Ht" = ( +/obj/item/bodybag, +/turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"fl" = ( +"Hv" = ( /obj/structure/disposalpipe/segment{ dir = 9 }, @@ -1723,177 +1507,302 @@ }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"fm" = ( -/turf/closed/wall/mineral/titanium/interior, -/area/awaymission/BMPship/Midship) -"fn" = ( -/obj/structure/window/reinforced{ - dir = 8 +"Hz" = ( +/obj/machinery/light/small{ + dir = 1 }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, +/turf/open/floor/engine, /area/awaymission/BMPship/Aft) -"fo" = ( -/obj/structure/window/reinforced, +"HD" = ( +/obj/item/stack/sheet/mineral/uranium{ + amount = 50 + }, +/turf/open/floor/engine, +/area/awaymission/BMPship/Aft) +"HE" = ( +/obj/structure/closet/crate/freezer, +/obj/item/organ/appendix, +/obj/item/reagent_containers/food/snacks/meat/slab, +/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/golem, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"fp" = ( +"HI" = ( /obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/window/reinforced, +/obj/item/kitchen/knife, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"fq" = ( -/obj/item/stack/cable_coil, -/turf/open/floor/plating, +"HJ" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/carpet, +/area/awaymission/BMPship/Fore) +"HL" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/airless, +/area/awaymission/BMPship/Midship) +"HT" = ( +/turf/closed/wall/mineral/titanium, /area/awaymission/BMPship/Aft) -"fr" = ( +"Ib" = ( +/obj/structure/table, +/obj/item/storage/box, /obj/machinery/light/small{ - dir = 4 + dir = 1 }, /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 1 }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"fs" = ( -/obj/item/stack/sheet/mineral/uranium{ - amount = 50 +"Ig" = ( +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/effect/gibspawner/human, +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Midship) +"Ik" = ( +/turf/closed/mineral/bananium, +/area/awaymission/BMPship) +"Iv" = ( +/obj/machinery/porta_turret{ + dir = 8; + set_obj_flags = "EMAGGED"; + installation = /obj/item/gun/energy/lasercannon }, /turf/open/floor/engine, /area/awaymission/BMPship/Aft) -"ft" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/awaymission/BMPship/Fore) -"fu" = ( -/obj/structure/lattice, -/turf/template_noop, -/area/awaymission/BMPship/Fore) -"fv" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" +"Iw" = ( +/obj/item/scalpel, +/obj/structure/closet/crate, +/obj/item/tank/internals/anesthetic, +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Midship) +"IP" = ( +/obj/machinery/light/small{ + dir = 4 }, +/turf/open/floor/wood, /area/awaymission/BMPship/Fore) -"fw" = ( +"IU" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "1-2" }, +/obj/machinery/door/airlock/titanium, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Fore) -"fx" = ( -/obj/item/shard{ - icon_state = "small" +"IZ" = ( +/turf/open/floor/plating/airless{ + icon_state = "panelscorched" }, -/obj/structure/cable{ - icon_state = "4-8" +/area/awaymission/BMPship/Midship) +"Ja" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/deliveryChute{ + dir = 8 + }, +/turf/open/floor/plating, +/area/awaymission/BMPship/Midship) +"Jc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, +/turf/open/floor/plating, +/area/awaymission/BMPship/Fore) +"Je" = ( +/obj/machinery/door/airlock/titanium, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Fore) -"fy" = ( +"Jw" = ( +/obj/item/circular_saw, +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"JO" = ( +/obj/machinery/light, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Midship) +"JX" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/area/awaymission/BMPship/Fore) -"fz" = ( -/obj/structure/cable{ - icon_state = "2-8" +/turf/open/floor/plasteel/showroomfloor, +/area/awaymission/BMPship/Aft) +"Ki" = ( +/obj/machinery/door/poddoor/shutters{ + id = "packerMed" }, +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Midship) +"Kn" = ( /turf/open/floor/plating/airless{ - icon_state = "platingdmg3" + icon_state = "platingdmg2" }, /area/awaymission/BMPship/Fore) -"fA" = ( +"Kt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/hand_labeler, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"Kz" = ( /obj/structure/cable{ icon_state = "1-8" }, -/obj/item/kitchen/knife, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"KD" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"fB" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "meatConvey2" - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +"KI" = ( +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Midship) -"fC" = ( +/turf/open/floor/plating, +/area/awaymission/BMPship/Fore) +"KQ" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "1-2" }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/carpet, +/area/awaymission/BMPship/Fore) +"Lh" = ( +/obj/structure/closet/crate, +/obj/item/analyzer, +/obj/item/stack/spacecash/c10, +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"fD" = ( -/obj/structure/cable{ - icon_state = "4-8" +"Lk" = ( +/obj/machinery/hydroponics, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 }, -/turf/open/floor/plasteel/showroomfloor, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"Ll" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"fE" = ( +"Lo" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, /obj/structure/cable{ icon_state = "2-8" }, /turf/open/floor/plasteel/showroomfloor, /area/awaymission/BMPship/Aft) -"fF" = ( -/obj/item/mop, -/turf/open/floor/plasteel/showroomfloor, -/area/awaymission/BMPship/Aft) -"fG" = ( -/obj/effect/decal/cleanable/oil, +"Lu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, /turf/open/floor/plating, -/area/awaymission/BMPship/Aft) -"fH" = ( -/obj/structure/reagent_dispensers/fueltank, +/area/awaymission/BMPship/Fore) +"LH" = ( +/obj/structure/rack, /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 8 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"fI" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +"LO" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Aft) +"LP" = ( +/obj/structure/table, +/obj/machinery/recharger, +/turf/open/floor/carpet, /area/awaymission/BMPship/Fore) -"fJ" = ( -/obj/item/shard, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +"LR" = ( +/turf/open/floor/wood, /area/awaymission/BMPship/Fore) -"fK" = ( -/obj/structure/chair/stool, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" +"Mi" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 6 }, +/turf/open/floor/plating/airless, /area/awaymission/BMPship/Fore) -"fL" = ( -/obj/item/stack/cable_coil{ - amount = 5 +"Mj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/awaymission/BMPship/Fore) -"fM" = ( +"Ml" = ( +/obj/structure/table, +/turf/open/floor/carpet, +/area/awaymission/BMPship/Fore) +"Mm" = ( +/obj/machinery/teleport/hub, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"Mv" = ( /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/door/airlock/titanium, +/turf/open/floor/carpet, +/area/awaymission/BMPship/Fore) +"MB" = ( +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Fore) -"fN" = ( +"MC" = ( +/turf/closed/wall/mineral/titanium/overspace, +/area/awaymission/BMPship/Aft) +"MD" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/BMPship/Aft) +"MX" = ( +/obj/structure/closet/crate, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c50, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"NF" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Aft) +"NP" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "meatConvey1" }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -1901,407 +1810,430 @@ }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"fO" = ( +"NX" = ( /obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/snacks/meat, -/turf/open/floor/plasteel/showroomfloor, -/area/awaymission/BMPship/Aft) -"fP" = ( -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/plasteel/showroomfloor, -/area/awaymission/BMPship/Aft) -"fQ" = ( -/obj/structure/reagent_dispensers, -/turf/open/floor/plasteel/showroomfloor, -/area/awaymission/BMPship/Aft) -"fR" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/item/organ/brain, +/obj/item/reagent_containers/food/snacks/meat/slab, +/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"fS" = ( -/turf/open/floor/plating/asteroid/airless, -/area/awaymission/BMPship) -"fT" = ( -/obj/structure/frame/computer{ - anchored = 1; - dir = 1 - }, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, -/area/awaymission/BMPship/Fore) -"fU" = ( -/obj/structure/frame/computer{ - anchored = 1; - dir = 1 - }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" +"NY" = ( +/obj/structure/cable{ + icon_state = "1-4" }, -/area/awaymission/BMPship/Fore) -"fV" = ( -/obj/machinery/light/small, +/turf/open/floor/plasteel/showroomfloor, +/area/awaymission/BMPship/Aft) +"Oa" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/power/port_gen/pacman/super, +/turf/open/floor/engine, +/area/awaymission/BMPship/Aft) +"Oc" = ( +/obj/item/reagent_containers/food/snacks/hugemushroomslice, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"fW" = ( -/turf/open/floor/plasteel{ - icon_state = "platingdmg3" +"Og" = ( +/obj/item/stack/cable_coil{ + amount = 5 }, +/turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"fX" = ( -/turf/open/floor/plasteel{ - icon_state = "platingdmg1" +"Ol" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/area/awaymission/BMPship/Midship) -"fY" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/titanium, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"fZ" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/titanium, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"ga" = ( -/obj/machinery/door/airlock/titanium, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/BMPship/Midship) +"Om" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/gibspawner/xeno, +/turf/open/floor/plating, +/area/awaymission/BMPship/Midship) +"Or" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"gb" = ( -/turf/closed/mineral/random, -/area/awaymission/BMPship) -"gc" = ( -/obj/item/multitool, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, -/area/awaymission/BMPship) -"gd" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/titanium, +"Oz" = ( +/obj/item/wallframe/apc, /turf/open/floor/plating/airless, -/area/awaymission/BMPship/Fore) -"ge" = ( -/obj/machinery/door/airlock/titanium, -/turf/open/floor/plating, /area/awaymission/BMPship/Midship) -"gf" = ( -/obj/machinery/light{ +"OA" = ( +/obj/structure/table/wood, +/obj/item/stack/spacecash/c500, +/obj/item/stack/spacecash/c100, +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/wood, +/area/awaymission/BMPship/Fore) +"OD" = ( +/obj/structure/table, +/obj/item/kitchen/knife, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, /turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"gg" = ( -/obj/structure/chair/stool, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"gh" = ( -/obj/structure/table, -/obj/item/paper/fluff/ruins/crashedship/old_diary, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"gi" = ( -/obj/structure/table, -/obj/item/pen/red, -/obj/item/reagent_containers/food/drinks/beer, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"gj" = ( -/obj/structure/closet, -/obj/item/clothing/under/misc/overalls, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"gk" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end{ - dir = 1 +/area/awaymission/BMPship/Midship) +"OE" = ( +/obj/structure/cable{ + icon_state = "2-4" }, /turf/open/floor/plating/airless, -/area/awaymission/BMPship/Fore) -"gl" = ( -/obj/machinery/porta_turret{ - dir = 8; - set_obj_flags = "EMAGGED"; - installation = /obj/item/gun/energy/lasercannon - }, -/turf/open/floor/engine, -/area/awaymission/BMPship/Fore) -"gm" = ( -/obj/machinery/light/small{ - dir = 1 +/area/awaymission/BMPship/Midship) +"OQ" = ( +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/engine, -/area/awaymission/BMPship/Fore) -"gn" = ( -/obj/structure/cable, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" +/obj/structure/cable{ + icon_state = "2-4" }, -/area/awaymission/BMPship/Fore) -"go" = ( -/obj/machinery/light/small{ - dir = 1 +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Aft) +"OY" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Fore) -"gp" = ( -/turf/open/floor/plating/asteroid/airless, -/area/awaymission/BMPship/Fore) -"gq" = ( -/obj/structure/rack, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Fore) -"gr" = ( -/obj/machinery/light/small{ - dir = 1 +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/turf/open/floor/plating/asteroid/airless, -/area/awaymission/BMPship/Fore) -"gs" = ( -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/BMPship/Midship) +"Pa" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"Pd" = ( +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plasteel/showroomfloor, +/area/awaymission/BMPship/Aft) +"Pg" = ( +/obj/machinery/seed_extractor, +/obj/item/seeds/plump/walkingmushroom, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"gt" = ( +"Pi" = ( +/obj/item/shard, /turf/open/floor/plating/airless{ icon_state = "platingdmg1" }, -/area/awaymission/BMPship/Midship) -"gv" = ( -/obj/item/wallframe/apc, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"gx" = ( -/obj/item/stack/cable_coil{ - amount = 5 +/area/awaymission/BMPship/Fore) +"Pu" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"PA" = ( +/obj/structure/cable{ + icon_state = "0-4" }, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"gy" = ( -/obj/structure/ore_box, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"gz" = ( -/obj/machinery/computer/arcade, -/turf/open/floor/plasteel, +"PZ" = ( +/turf/open/floor/engine, +/area/awaymission/BMPship/Fore) +"Qb" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/showroomfloor, /area/awaymission/BMPship/Aft) -"gA" = ( -/obj/effect/decal/remains/human, -/obj/structure/cable{ - icon_state = "1-4" +"Qh" = ( +/obj/structure/mirror{ + pixel_y = 28 }, -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/plasteel/cafeteria{ + dir = 2 }, -/turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"gC" = ( +"Qu" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "2-4" }, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "1-4" }, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"gD" = ( -/obj/structure/cable{ - icon_state = "0-8" +/turf/open/floor/carpet, +/area/awaymission/BMPship/Fore) +"Qx" = ( +/obj/structure/kitchenspike, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/obj/item/wallframe/apc, /turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"gE" = ( -/obj/effect/decal/remains/human, -/obj/item/clothing/head/helmet/space/syndicate/green/dark, -/obj/effect/gibspawner/generic, -/turf/open/floor/plating/asteroid/airless, -/area/awaymission/BMPship) -"gF" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/directional{ - dir = 4 - }, -/obj/item/shard{ - icon_state = "small" +/area/awaymission/BMPship/Midship) +"QE" = ( +/obj/machinery/door/window{ + base_state = "right"; + dir = 4; + icon_state = "right" }, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Fore) -"gG" = ( -/turf/open/floor/engine, -/area/awaymission/BMPship/Fore) -"gH" = ( -/obj/machinery/door/airlock/titanium, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Fore) -"gI" = ( -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Fore) -"gJ" = ( +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"QG" = ( /obj/effect/gibspawner/robot, /turf/open/floor/plasteel/airless{ icon_state = "floorscorched2" }, /area/awaymission/BMPship/Fore) -"gK" = ( -/turf/closed/mineral/random, -/area/awaymission/BMPship/Fore) -"gL" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" +"QO" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "meatConvey2" }, +/turf/open/floor/plating, /area/awaymission/BMPship/Midship) -"gM" = ( -/obj/structure/mecha_wreckage/ripley, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"gN" = ( -/obj/structure/bed, -/turf/open/floor/plasteel, +"Rt" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/titanium, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, /area/awaymission/BMPship/Aft) -"gO" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/item/storage/wallet/random, +"Rx" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-8" + }, +/turf/open/floor/carpet, +/area/awaymission/BMPship/Fore) +"RX" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, +/obj/machinery/light/small, /turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"gP" = ( -/obj/structure/closet, -/obj/item/clothing/under/rank/civilian/lawyer/bluesuit, -/obj/item/clothing/suit/apron, +/area/awaymission/BMPship/Midship) +"Sa" = ( +/obj/structure/chair/stool, /turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"gQ" = ( -/obj/item/clothing/suit/space/syndicate/green/dark, -/turf/open/floor/plating/asteroid/airless, -/area/awaymission/BMPship) -"gR" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/directional{ - dir = 6 +"Sl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"Sm" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/carpet, /area/awaymission/BMPship/Fore) -"gS" = ( -/turf/closed/wall/mineral/titanium, -/area/awaymission/BMPship) -"gT" = ( -/obj/effect/gibspawner/robot, +"Ss" = ( +/obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"gU" = ( -/obj/structure/cable{ - icon_state = "0-4" +"Sx" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/awaymission/BMPship/Fore) +"SB" = ( +/obj/machinery/sleeper{ + dir = 1 }, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"gV" = ( -/obj/structure/cable{ - icon_state = "4-8" +"SF" = ( +/turf/open/floor/plasteel{ + icon_state = "platingdmg3" }, -/turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"gW" = ( -/obj/machinery/door/airlock/titanium, +"SJ" = ( +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Aft) +"SM" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-8" }, -/turf/open/floor/plating, +/obj/item/kitchen/knife, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"gX" = ( -/obj/structure/cable{ - icon_state = "4-8" +"SR" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/BMPship/Fore) +"SS" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/awaymission/BMPship/Fore) +"SY" = ( +/turf/closed/mineral/random, +/area/awaymission/BMPship/Fore) +"Ta" = ( +/obj/structure/frame/computer{ + anchored = 1 + }, +/turf/open/floor/carpet, +/area/awaymission/BMPship/Fore) +"Tp" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"gY" = ( +"Tq" = ( /obj/structure/cable{ icon_state = "1-8" }, +/turf/open/floor/carpet, +/area/awaymission/BMPship/Fore) +"Tr" = ( +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"gZ" = ( -/obj/item/shard{ - icon_state = "medium" +"Ts" = ( +/obj/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" }, -/turf/template_noop, -/area/template_noop) -"ha" = ( -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, +/turf/open/floor/plasteel/cafeteria, /area/awaymission/BMPship/Midship) -"hb" = ( -/obj/effect/decal/remains/human, +"Tu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/item/stock_parts/cell/high, /turf/open/floor/plasteel, /area/awaymission/BMPship/Aft) -"hc" = ( -/obj/structure/bed, -/obj/item/bedsheet, +"Tv" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, /turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"Ty" = ( +/obj/machinery/computer/teleporter, +/turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"hd" = ( -/obj/machinery/door/airlock/titanium, -/turf/open/floor/plasteel/cafeteria{ - dir = 2 +"TC" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"TG" = ( +/obj/structure/window/reinforced{ + dir = 8 }, +/turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"he" = ( -/obj/structure/mirror{ - pixel_y = 28 +"TI" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plasteel/cafeteria{ - dir = 2 +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Fore) +"TN" = ( +/obj/structure/cable{ + icon_state = "2-8" }, +/turf/open/floor/plasteel/showroomfloor, /area/awaymission/BMPship/Aft) -"hf" = ( -/obj/structure/toilet{ - dir = 8 +"TQ" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "meatConvey1" }, +/turf/open/floor/plating, +/area/awaymission/BMPship/Midship) +"TX" = ( /obj/machinery/light/small{ dir = 1 }, -/turf/open/floor/plasteel/cafeteria{ - dir = 2 +/turf/open/floor/plating/asteroid/airless, +/area/awaymission/BMPship/Fore) +"Ub" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/area/awaymission/BMPship/Aft) -"hg" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"Uj" = ( +/obj/effect/decal/remains/human, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" }, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Aft) +"UC" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, /area/awaymission/BMPship/Midship) -"hh" = ( -/obj/item/clothing/suit/caution, -/turf/open/floor/plating/airless, +"UH" = ( +/obj/machinery/door/airlock/titanium, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"hi" = ( -/obj/machinery/portable_atmospherics/canister/air, +"UZ" = ( +/obj/item/clothing/suit/space/syndicate/green/dark, +/turf/open/floor/plating/asteroid/airless, +/area/awaymission/BMPship) +"Vu" = ( +/turf/open/floor/carpet, +/area/awaymission/BMPship/Fore) +"Vw" = ( +/obj/item/storage/box/syringes, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"hj" = ( -/obj/structure/closet/crate, -/obj/item/stack/spacecash/c10, -/obj/item/stack/spacecash/c200, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"hk" = ( -/obj/structure/closet/crate, -/obj/item/stack/spacecash/c10, -/turf/open/floor/plasteel, -/area/awaymission/BMPship/Aft) -"hl" = ( +"VB" = ( /obj/structure/sink{ dir = 2 }, @@ -2309,119 +2241,187 @@ dir = 2 }, /area/awaymission/BMPship/Aft) -"hn" = ( -/obj/item/clothing/gloves/color/fyellow, -/turf/open/floor/plating/asteroid/airless, -/area/awaymission/BMPship) -"ho" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end{ +"VD" = ( +/obj/effect/gibspawner/generic, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, -/turf/open/floor/engine, -/area/awaymission/BMPship/Aft) -"hp" = ( -/obj/machinery/light/small{ +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"VN" = ( +/obj/item/reagent_containers/glass/bucket, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, -/turf/open/floor/engine, -/area/awaymission/BMPship/Aft) -"hq" = ( -/obj/item/storage/box/matches, -/obj/item/storage/fancy/cigarettes/dromedaryco, -/turf/open/floor/plating, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"VP" = ( +/turf/open/floor/plating/asteroid/airless, +/area/awaymission/BMPship/Midship) +"VT" = ( +/turf/closed/wall/mineral/titanium, +/area/awaymission/BMPship/Midship) +"VV" = ( +/obj/structure/reagent_dispensers, +/turf/open/floor/plasteel/showroomfloor, /area/awaymission/BMPship/Aft) -"hr" = ( -/obj/item/poster/random_contraband, +"VW" = ( +/obj/structure/ore_box, +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Midship) +"VY" = ( +/obj/item/storage/box, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"hs" = ( -/obj/item/reagent_containers/food/drinks/beer, +"Wc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, /turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"ht" = ( +"Wp" = ( /turf/closed/wall/mineral/titanium/interior, /area/awaymission/BMPship/Aft) -"hu" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end, -/turf/open/floor/engine, +"Wv" = ( +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/plating, /area/awaymission/BMPship/Aft) -"hv" = ( -/turf/closed/mineral/diamond, -/area/awaymission/BMPship) -"hw" = ( -/turf/closed/mineral/bananium, -/area/awaymission/BMPship) -"hE" = ( +"Wx" = ( /turf/closed/wall/mineral/titanium/nodiagonal, +/area/awaymission/BMPship/Aft) +"WJ" = ( +/obj/structure/closet, +/turf/open/floor/carpet, /area/awaymission/BMPship/Fore) -"vh" = ( -/turf/template_noop, -/area/space/nearstation) -"wh" = ( -/turf/template_noop, -/area/awaymission/BMPship) -"ya" = ( -/obj/machinery/door/poddoor/shutters{ - id = "packerMine" - }, -/obj/machinery/button/door{ - id = "packerMine"; - pixel_x = -24 +"WL" = ( +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) -"EQ" = ( -/obj/structure/lattice, -/turf/template_noop, +"WN" = ( +/turf/closed/wall/mineral/titanium/interior, /area/awaymission/BMPship/Midship) -"Hy" = ( -/obj/machinery/door/poddoor/shutters{ - id = "packerMine" +"WO" = ( +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"Kj" = ( -/obj/machinery/light/small{ +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"WY" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/BMPship/Aft) +"Xr" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"KU" = ( -/obj/machinery/door/poddoor/shutters{ - id = "packerMed" +"Xt" = ( +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/machinery/button/door{ - id = "packerMed"; - pixel_x = -24 +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/turf/open/floor/plating/airless, -/area/awaymission/BMPship/Midship) -"Mx" = ( -/turf/closed/mineral/random, +/turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) -"QM" = ( -/obj/machinery/light/small{ +"XL" = ( +/obj/machinery/door/airlock/titanium, +/turf/open/floor/carpet, +/area/awaymission/BMPship/Fore) +"XN" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ dir = 1 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Fore) +"XZ" = ( +/turf/closed/mineral/random, +/area/awaymission/BMPship/Midship) +"Ym" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "meatConvey1" }, +/obj/structure/plasticflaps, +/turf/open/floor/plating, /area/awaymission/BMPship/Midship) -"Xc" = ( -/obj/structure/frame/computer{ - anchored = 1; - dir = 4 +"Yp" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "meatConvey2" }, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/awaymission/BMPship/Midship) +"Yz" = ( +/obj/item/shard, /turf/open/floor/carpet, /area/awaymission/BMPship/Fore) -"Zb" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +"YB" = ( +/obj/structure/sink{ + dir = 2 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/machinery/light/small, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Midship) +"YI" = ( +/obj/structure/closet, +/obj/item/clothing/under/rank/civilian/lawyer/bluesuit, +/obj/item/clothing/suit/apron, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Aft) +"YX" = ( +/turf/open/floor/plasteel{ + icon_state = "platingdmg1" + }, +/area/awaymission/BMPship/Midship) +"Zc" = ( +/obj/machinery/door/airlock/titanium, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/awaymission/BMPship/Aft) +"Zi" = ( +/turf/closed/wall/mineral/titanium/interior, +/area/awaymission/BMPship/Fore) +"Zj" = ( +/obj/item/reagent_containers/food/snacks/hugemushroomslice, /turf/open/floor/plasteel, /area/awaymission/BMPship/Midship) +"Zv" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/carpet, +/area/awaymission/BMPship/Fore) +"Zw" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken" + }, +/area/awaymission/BMPship/Fore) +"ZS" = ( +/obj/item/stack/cable_coil, +/turf/open/floor/plating, +/area/awaymission/BMPship/Aft) +"ZV" = ( +/turf/open/floor/plating/airless, +/area/awaymission/BMPship/Fore) (1,1,1) = {" aa @@ -2452,9 +2452,9 @@ aa aa aa aa -gb -gb -gb +qA +qA +qA aa aa aa @@ -2502,10 +2502,10 @@ aa aa aa aa -fS -gb -gb -gb +Fm +qA +qA +qA aa aa aa @@ -2553,11 +2553,11 @@ aa aa aa aa -fS -gb -gb -gb -gb +Fm +qA +qA +qA +qA aa aa aa @@ -2605,11 +2605,11 @@ aa aa aa aa -fS -gb -gb -fS -fS +Fm +qA +qA +Fm +Fm aa aa aa @@ -2657,9 +2657,9 @@ aa aa aa aa -fS -gE -gQ +Fm +ba +UZ aa aa aa @@ -2668,9 +2668,9 @@ aa aa aa aa -gb -gb -gb +qA +qA +qA aa aa aa @@ -2706,8 +2706,8 @@ aa aa aa aa -am -am +Pa +Pa aa aa aa @@ -2715,14 +2715,14 @@ aa aa aa aa -wh -fS -fS -gb -gb -gb -gb -gb +BI +Fm +Fm +qA +qA +qA +qA +qA aa aa aa @@ -2747,14 +2747,14 @@ aa aa aa aa -aI -aT -dG -ed -ed -eH -aT -aI +qO +zU +uE +jD +jD +Dp +zU +qO aa aa aa @@ -2765,16 +2765,16 @@ aa aa aa aa -fS -fS -fS -gb -gb -gb -gb -gb -gb -gb +Fm +Fm +Fm +qA +qA +qA +qA +qA +qA +qA aa aa aa @@ -2797,36 +2797,36 @@ aa aa aa aa -aI -hE -bV -ee -Xc -Xc -ee -bV -aT -aI +qO +Sx +Vu +Ml +kp +kp +Ml +Vu +zU +qO aa aa -gc +yo aa aa aa aa aa -hn -fS -fS -fS -gb -gb -gb -gb -gb -gb -gb -gb +xk +Fm +Fm +Fm +qA +qA +qA +qA +qA +qA +qA +qA aa aa aa @@ -2847,38 +2847,38 @@ aa aa aa aa -aI -hE -bV -bV -dH -ef -ef -bV -bV -aT -ft -fu +qO +Sx +Vu +Vu +Yz +SS +SS +Vu +Vu +zU +xr +Fz aa -am +Pa aa aa aa gZ -fS -fS -fS -fS -fS -fS -fS -gb -gb -gb -gb -gb -gb -gb +Fm +Fm +Fm +Fm +Fm +Fm +Fm +qA +qA +qA +qA +qA +qA +qA aa aa "} @@ -2897,39 +2897,39 @@ aa aa aa aa -aI -hE -bV -bV -bV -bV -bV -bV -bV -bV -aT -fu -fI -fu +qO +Sx +Vu +Vu +Vu +Vu +Vu +Vu +Vu +Vu +zU +Fz +Kn +Fz aa aa aa aa -fS -fS -fS -fS -fS -fS -fS -fS -fS -fS -fS -gb -gb -gb -gb +Fm +Fm +Fm +Fm +Fm +Fm +Fm +Fm +Fm +Fm +Fm +qA +qA +qA +qA aa aa "} @@ -2943,44 +2943,44 @@ aa aa aa aa -cG -gk -bl -bt -hE -hE -bV -bV -cY -dt -bV -eg -bV -bV -bV -fc -fv -fJ -cG -hE -gk -gF -gR -cG -fS -fS -gb -gb -gb -gb -fS -fS -fS -fS -fS -gb -gb -fS +Zi +XN +vc +sZ +Sx +Sx +Vu +Vu +rL +LP +Vu +bS +Vu +Vu +Vu +XL +mS +Pi +Zi +Sx +XN +qE +Mi +Zi +Fm +Fm +qA +qA +qA +qA +Fm +Fm +Fm +Fm +Fm +qA +qA +Fm aa aa "} @@ -2994,44 +2994,44 @@ aa aa aa aa -cG -aR -bm -bu -aT -bV -bV -bV -cZ -du -bV -bV -ev -db -db -fd -fw -fu -fT -cG -gl -gG -gl -cG -gb -gb -gb -gb -gb -gb -gb -gb -fS -fS -fS -fS -fS -fS +Zi +OA +LR +Zw +zU +Vu +Vu +Vu +HJ +wc +Vu +Vu +CJ +KQ +KQ +Mv +md +Fz +ER +Zi +id +PZ +id +Zi +qA +qA +qA +qA +qA +qA +qA +qA +Fm +Fm +Fm +Fm +Fm +Fm aa aa "} @@ -3045,45 +3045,45 @@ aa aa aa aa -cG -aS -bn -bm -fc -bV -bV -bV -da -bV -bV -bV -ew -bV -bV -aT -fx -fK -fU -cG -gm -gG -gG -cG -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -fS -fS -fS -fS -fS +Zi +Fb +IP +LR +XL +Vu +Vu +Vu +Ta +Vu +Vu +Vu +Sm +Vu +Vu +zU +ku +pT +sM +Zi +SR +PZ +PZ +Zi +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Fm +Fm +Fm +Fm +Fm aa "} (14,1,1) = {" @@ -3096,45 +3096,45 @@ aa aa aa aa -cG -aT -aT -aT -hE -bW -db -cH -bV -bV -bV -bV -ew -bV -eT -aT -fy -fL -fv -cG -cG -gH -cG -cG -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -fS -fS -fS -fS +Zi +zU +zU +zU +Sx +ln +KQ +Zv +Vu +Vu +Vu +Vu +Sm +Vu +WJ +zU +GY +GH +mS +Zi +Zi +Je +Zi +Zi +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Fm +Fm +Fm +Fm aa "} (15,1,1) = {" @@ -3147,45 +3147,45 @@ aa aa aa aa -cG -aU -bo -bp -fc -bV -bV -cI -db -dv -dI -db -ex -bV -eU -aT -fz -fM -fM -gd -gn -gI -fv -cG -gb -gb -gb -gb -gb -gb -gb -gb -hv -gb -gb -gb -fS -fS -fS +Zi +Jc +Mj +sp +XL +Vu +Vu +Rx +KQ +jd +Qu +KQ +Tq +Vu +zQ +zU +mO +TI +TI +IU +jx +ZV +mS +Zi +qA +qA +qA +qA +qA +qA +qA +qA +Hh +qA +qA +qA +Fm +Fm +Fm aa "} (16,1,1) = {" @@ -3198,45 +3198,45 @@ aa aa aa aa -cG -aV -bp -bv -aT -aT -aT -aT -aT -aT -dJ -aT -aT -fc -aT -aT -aT -aT -aT -aT -go -fI -fv -cG -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -fS -fS +Zi +Cn +sp +CB +zU +zU +zU +zU +zU +zU +EV +zU +zU +XL +zU +zU +zU +zU +zU +zU +MB +Kn +mS +Zi +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Fm +Fm aa "} (17,1,1) = {" @@ -3249,46 +3249,46 @@ aa aa aa aa -cG -aW -bp -bv -aq -bX -ce -ce -ce -dw -dy -ce -ce -ce -dw -ce -ce -ce -ce -aq -gp -gI -gp -gK -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -fS -fS +Zi +KI +sp +CB +VT +og +KD +KD +KD +Ed +tV +KD +KD +KD +Ed +KD +KD +KD +KD +VT +lg +ZV +lg +SY +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Fm +Fm "} (18,1,1) = {" aa @@ -3300,46 +3300,46 @@ aa aa aa aa -cG -aV -bp -bw -aq -bY -cp -ce -ce -dx -dK -ce -ce -ce -ce -ce -ce -ce -fV -aq -gq -gp -ft -gp -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -hw -gb -gb -fS -fS +Zi +Cn +sp +qW +VT +dz +Oc +KD +KD +yB +Xt +KD +KD +KD +KD +KD +KD +KD +jg +VT +ol +lg +xr +lg +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Ik +qA +qA +Fm +Fm "} (19,1,1) = {" aa @@ -3351,46 +3351,46 @@ aa aa aa aa -cG -aW -bp -bv -aq -bZ -bZ -bZ -dc -dy -dB -dB -dB -dB -dB -dB -dB -ce -ce -aq -ft -gJ -gp -aT -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -fS +Zi +KI +sp +CB +VT +zw +zw +zw +yE +tV +wY +wY +wY +wY +wY +wY +wY +KD +KD +VT +xr +QG +lg +zU +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Fm "} (20,1,1) = {" aa @@ -3402,46 +3402,46 @@ aa aa aa aa -cG -aV -bp -bv -aq -ca -cq -cq -dd -dy -dB -eh -eh -eI -eh -ej -dB -ce -ce -aq -gr -gI -fv -gK -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -hw -gb -gb -gb -gb -fS +Zi +Cn +sp +CB +VT +YB +cF +cF +GG +tV +wY +UC +UC +ts +UC +ww +wY +KD +KD +VT +TX +ZV +mS +SY +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Ik +qA +qA +qA +qA +Fm "} (21,1,1) = {" aa @@ -3453,46 +3453,46 @@ aa aa aa aa -cG -aX -bp -bx -aq -cb -cq -cJ -dd -dy -dB -eh -ey -eh -ej -ej -dB -ce -ce -aq -fv -gp -gp -gK -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -hw -gb -gb -gb -fS +Zi +uC +sp +Lu +VT +jv +cF +Zj +GG +tV +wY +UC +Om +UC +ww +ww +wY +KD +KD +VT +mS +lg +lg +SY +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Ik +qA +qA +qA +Fm "} (22,1,1) = {" aa @@ -3504,46 +3504,46 @@ aa aa aa aa -aI -aY -bq -aT -aq -cc -cq -cq -de -dy -dB -eh -ej -ej -ej -fe -dB -ce -ce -aq -aT -gK -aT -gK -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -fS +qO +jL +qG +zU +VT +zp +cF +cF +Pg +tV +wY +UC +ww +ww +ww +mo +wY +KD +KD +VT +zU +SY +zU +SY +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Fm "} (23,1,1) = {" aa @@ -3559,42 +3559,42 @@ aa aa aa aa -aq -ca -cr -cq -dd -dy -dB -ei -ei -eJ -ei -ff -dB -ce -fW -aq -gb -gb -gb -gb -gb -gS -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -fS +VT +YB +Ds +cF +GG +tV +wY +eN +eN +lh +eN +kY +wY +KD +SF +VT +qA +qA +qA +qA +qA +ut +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Fm "} (24,1,1) = {" aa @@ -3610,42 +3610,42 @@ aa aa aa aa -aq -cd -cd -cd -df -dy -dL -ej -ej -ej -eV -ej -dL -ce -ce -aq -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -fS +VT +yJ +yJ +yJ +Lk +tV +zK +ww +ww +ww +dh +ww +zK +KD +KD +VT +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Fm "} (25,1,1) = {" aa @@ -3661,42 +3661,42 @@ aa aa aa aa -aq -bY -ce -ce -ce -di -dM -dz -ez -dz -dz +VT dz -fA -ej -fX -ge -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -fS +KD +KD +KD +nx +uY +nw +ex +nw +nw +nw +SM +ww +YX +DT +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Fm "} (26,1,1) = {" aa @@ -3710,44 +3710,44 @@ aa aa aa aa -am -ap -aq -ce -ce -ce -ce -ce -ce -ek -dy -ce -ce -fg -ce -ce -fW -fm -Mx -gb -gS -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -fS +Pa +ik +VT +KD +KD +KD +KD +KD +KD +VN +tV +KD +KD +Qx +KD +KD +SF +WN +XZ +qA +ut +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Fm "} (27,1,1) = {" aa @@ -3761,44 +3761,44 @@ aa aa aa aa -ap -aq -aq -aq -aq -cK -aq -aq -dN -dz -eA -eK -aq -aq -cK -aq -aq -fm -aq -Mx -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -fS -fS +ik +VT +VT +VT +VT +UH +VT +VT +CM +nw +TC +Ub +VT +VT +UH +VT +VT +WN +VT +XZ +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Fm +Fm "} (28,1,1) = {" aa @@ -3809,47 +3809,47 @@ aa aa aa aa -am -aa -EQ -aq -gt -aq -cf -cs -cL -ce -ce -ce -ce -dy -ce -ce -ce -ce -ce -ce -fm -gs -aq -Mx -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -fS -fS +Pa +aa +tB +VT +uJ +VT +Hi +Ol +OY +KD +KD +KD +KD +tV +KD +KD +KD +KD +KD +KD +WN +VP +VT +XZ +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Fm +Fm "} (29,1,1) = {" aa @@ -3858,48 +3858,48 @@ aa aa aa aa -am -aa -vh -EQ -gt -at -ha -aq -cg -cs -cM -dg -dz -dz -dz -eB -dz -dz -dz -dz -fN -fV -fm -gs -gs -Mx -Mx -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -fS -fS +Pa +aa +Fc +tB +uJ +mu +IZ +VT +to +Ol +Ts +vQ +nw +nw +nw +wu +nw +nw +nw +nw +lC +jg +WN +VP +VP +XZ +XZ +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Fm +Fm aa "} (30,1,1) = {" @@ -3910,47 +3910,47 @@ aa aa aa aa -am -EQ -gL -hg -ha -at -aq -ch -cs -cN -dy -ce -dO -ce -ce -ce -ce -dO -ce -dy -ce -fm -at -gL -gs -Mx -Mx -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -gb -fS -fS +Pa +tB +tf +lm +IZ +mu +VT +Ci +Ol +xl +tV +KD +ou +KD +KD +KD +KD +ou +KD +tV +KD +WN +mu +tf +VP +XZ +XZ +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +qA +Fm +Fm aa "} (31,1,1) = {" @@ -3961,97 +3961,97 @@ aa aa aa aa -ap -aq -hg -at -hg -by -aq -ci -ct -cO -dy -dA -dP -el -ce -ce -dA -fi -fB -dy -ce -fm -gt -gM -gT -gt -aq -Mx -gb -gb -gb -gb -gb -gb -gb -gb -gb -fS -fS -fS +ik +VT +lm +mu +lm +JO +VT +nl +kI +nq +tV +BL +TQ +NP +KD +KD +BL +tA +oy +tV +KD +WN +uJ +BP +Fg +uJ +VT +XZ +qA +qA +qA +qA +qA +qA +qA +qA +qA +Fm +Fm +Fm aa aa "} (32,1,1) = {" -ab -aa -aa -aa -aa -aa -aa -aq -as -at -ha -at -at -aq -ce -ce -ce -dy -dB -dQ -dB -ce -eL -dB -fj -dB -dy -Zb -fm -Kj -at -gs -gL -gs -fm -gb -gb -gb -gb -gb -gb -gb -gb -fS -fS -fS -fS +Jw +aa +aa +aa +aa +aa +aa +VT +Co +mu +IZ +mu +mu +VT +KD +KD +KD +tV +wY +Ym +wY +KD +VD +wY +Yp +wY +tV +RX +WN +HL +mu +VP +tf +VP +WN +qA +qA +qA +qA +qA +qA +qA +qA +Fm +Fm +Fm +Fm aa aa "} @@ -4063,46 +4063,46 @@ aa aa aa aa -aq -at -at -bb -ha -at -KU -ce -ce -ce -dy -dB -dP -dB -ce -ce -dB -fk -dB -dy -ce -ya -at -gs -at -at -gL -fm -gb -gb -gb -gb -gb -gb -gb -fS -fS -fS -gb -gb +VT +mu +mu +Ig +IZ +mu +me +KD +KD +KD +tV +wY +TQ +wY +KD +KD +wY +QO +wY +tV +KD +GT +mu +VP +mu +mu +tf +WN +qA +qA +qA +qA +qA +qA +qA +Fm +Fm +Fm +qA +qA aa aa "} @@ -4114,47 +4114,47 @@ aa aa aa aa -aq -au -at -at -at -at -bK -ce -ce -ce -dy -dB -dP -dB -ce -ce -dB -fk -dB -dy -ce -Hy -at -gt -at -at -at -fm -gb -gb -gb -gb -gb -fS -fS -fS -fS -fS -gb -gb -gb +VT +Bl +mu +mu +mu +mu +Ki +KD +KD +KD +tV +wY +TQ +wY +KD +KD +wY +QO +wY +tV +KD +Bu +mu +uJ +mu +mu +mu +WN +qA +qA +qA +qA +qA +Fm +Fm +Fm +Fm +Fm +qA +qA +qA aa "} (35,1,1) = {" @@ -4165,47 +4165,47 @@ aa aa aa aa -aq -av -at -at -at -at -bK -ce -ce -ce -dy -dB -dP -dB -eC -ce -dB -fk -dB -dy -ce -Hy -gs -at -at -gs -at -fm -fS -fS -fS -fS -fS -fS -fS -fS -fS -gb -gb -gb -gb +VT +Iw +mu +mu +mu +mu +Ki +KD +KD +KD +tV +wY +TQ +wY +Tv +KD +wY +QO +wY +tV +KD +Bu +VP +mu +mu +VP +mu +WN +Fm +Fm +Fm +Fm +Fm +Fm +Fm +Fm +Fm +qA +qA +qA +qA aa "} (36,1,1) = {" @@ -4216,47 +4216,47 @@ aa aa aa aa -aq -aw -at -as -at -bA -aq -cj -cu -ce -dy -dB -dP -dB -ce -ce -dB -fk -dB -dy -Zb -fm -QM -at -at -at -hg -fm -fS -fS -fS -fS +VT +Ht +mu +Co +mu +SB +VT +mw +Xr +KD +tV +wY +TQ +wY +KD +KD +wY +QO +wY +tV +RX +WN +uF +mu +mu +mu +lm +WN +Fm +Fm +Fm +Fm aa aa aa aa aa -gb -gb -gb -gb +qA +qA +qA +qA aa "} (37,1,1) = {" @@ -4267,34 +4267,34 @@ aa aa aa aa -aq -ax -at -at -at -bB -aq -ck -cu -ce -dy -dB -dR -dB -ce -ce -dB -dR -dB -dy -ce -fm -gv -at -at -at -hh -fm +VT +Vw +mu +mu +mu +AR +VT +OD +Xr +KD +tV +wY +Ja +wY +KD +KD +wY +Ja +wY +tV +KD +WN +Oz +mu +mu +mu +pQ +WN aa aa aa @@ -4305,8 +4305,8 @@ aa aa aa aa -gb -gb +qA +qA aa aa "} @@ -4318,34 +4318,34 @@ aa aa aa aa -aq -ay -aL -bc -at -bC -aq -cl -ce -cP -dy -dB -dS -dB -ce -ce -dB -dS -dB -dy -ce -fm -gy -at -at -ha -hh -fm +VT +OE +WL +jT +mu +re +VT +Fu +KD +yd +tV +wY +mX +wY +KD +KD +wY +mX +wY +tV +KD +WN +VW +mu +mu +IZ +pQ +WN aa aa aa @@ -4369,34 +4369,34 @@ aa aa aa aa -aq -az -at -gV -at -bA -aq -cj -cu -ce -di -dz -dT -dz -dz -eM -dz -dT -dz -dK -Zb -fm -gx -at -gU -at -hh -fm +VT +Hq +mu +aH +mu +SB +VT +mw +Xr +KD +nx +nw +mb +nw +nw +Ad +nw +mb +nw +Xt +RX +WN +Og +mu +PA +mu +pQ +WN aa aa aa @@ -4420,34 +4420,34 @@ aa aa aa aa -aq -aA -at -gV -at -bB -aq -cm -ce -ce -ce -ce -dU -em -ce -dy -eW -fl -ce -ce -ce -fm -gy -at -gV -at -hi -fm +VT +qT +mu +aH +mu +AR +VT +qe +KD +KD +KD +KD +xR +fM +KD +tV +lZ +Hv +KD +KD +KD +WN +VW +mu +aH +mu +Ss +WN aa aa aa @@ -4471,34 +4471,34 @@ aa aa aa aa -aq -aq -aq -be -aq -aq -aq -aq -aq -aq -aq -aq -aq -en -ce -dy -eX -fm -fm -fm -fm -fm -fm -fm -gW -fm -fm -fm +VT +VT +VT +vq +VT +VT +VT +VT +VT +VT +VT +VT +VT +kZ +KD +tV +nV +WN +WN +WN +WN +WN +WN +WN +nk +WN +WN +WN aa aa aa @@ -4518,42 +4518,42 @@ aa aa aa aa -ac -ho -aj -an -ac -aB -aM -bf -aM -aM -bL -ac -cv -cw -cw -cw -cw -eo -cw -fD -eo -cw -cw -fO -ac -cE -gz -gg -gX -cE -hj -ht -ho -aj -hu -dk +HT +lH +WY +af +HT +Wc +Ll +iV +Ll +Ll +GU +HT +Br +lA +lA +lA +lA +kC +lA +qq +kC +lA +lA +wk +HT +SJ +iZ +Sa +NF +SJ +ic +Wp +lH +WY +CY +Wx aa aa aa @@ -4569,42 +4569,42 @@ aa aa aa aa -ht -ag -ah -ag -ac -aC -al -bg -fR -bD -bM -ac -cv -cQ -dj -dj -dj -ep -dj -eO -ep -dj -fC -cw -ac -cE -cE -cE -gX -cE -hk -ht -ag -ah -ag -ac +Wp +Iv +pb +Iv +HT +HE +iA +WO +tx +ur +pM +HT +Br +BY +zz +zz +zz +JX +zz +Lo +JX +zz +NY +lA +HT +SJ +SJ +SJ +NF +SJ +kS +Wp +Iv +pb +Iv +HT aa aa aa @@ -4620,42 +4620,42 @@ aa aa aa aa -ht -ah -ah -ao -ac -aD -al -al -al -bE -bN -ac -cw -cw -cw -cw -dV -eq -eD -eD -eq -fn -fD -cw -fY -cE -al -cE -gX -hb -cE -ht -hp -ah -ah -ac +Wp +pb +pb +eR +HT +NX +iA +iA +iA +Kt +oK +HT +lA +lA +lA +lA +Pu +ld +TG +TG +ld +cI +qq +lA +eA +SJ +iA +SJ +NF +hI +SJ +Wp +Hz +pb +pb +HT aa aa aa @@ -4671,42 +4671,42 @@ aa aa aa aa -ht -ac -ak -ac -ac -aE -aN -bh -al -dm -bO -ac -cx -ac -dk -cw -dW -er -al -er -eY -fo -fD -cw -ac -cE -cE -gN -gX -hc -al -ht -ac -ak -ac -ac +Wp +HT +Fv +HT +HT +Gx +VY +Et +iA +Or +qi +HT +sV +HT +Wx +lA +Ey +Wv +iA +Wv +uU +zO +qq +lA +HT +SJ +SJ +Gw +NF +LO +iA +Wp +HT +Fv +HT +HT aa aa aa @@ -4722,42 +4722,42 @@ aa aa aa aa -ht -ai -al -al -ac -aF -al -al -al -dm -bM -ac -cy -cR -ac -cw -dW -er -eE -al -al -fo -fD -cw -ac -gf -cE -cE -gX -cE -cE -ht -hq -al -ai -ac +Wp +yh +iA +iA +HT +Ib +iA +iA +iA +Or +pM +HT +nO +Do +HT +lA +Ey +Wv +kJ +iA +iA +zO +qq +lA +HT +Tr +SJ +SJ +NF +SJ +SJ +Wp +qS +iA +yh +HT aa aa aa @@ -4773,42 +4773,42 @@ aa aa aa aa -ae -ht -al -al -ar -aG -al -al -al -bG -bM -ac -cz -cS -ac -cw -dX -es -eF -eF -eZ -fp -fE -dj -fZ -dE -gA -gO -gY -gN -cE -fY -al -hs -ht -ae +MC +Wp +iA +iA +Rt +ew +iA +iA +iA +CH +pM +HT +MD +dx +HT +lA +wN +Dz +QE +QE +HI +ql +TN +zz +qc +oB +Uj +Cd +Ft +Gw +SJ +eA +iA +oh +Wp +MC aa aa aa @@ -4825,40 +4825,40 @@ aa aa aa aa -ae -ht -al -ac -aG -al -bi -al -dm -bP -ac -cA -cT -ac -cw -cw -cw -cw -cw -cw -cw -cw -fP -ac -gg -gX -cE -cE -cE -cE -ht -hr -ht -ae +MC +Wp +iA +HT +ew +iA +Ty +iA +Or +Lh +HT +ym +pE +HT +lA +lA +lA +lA +lA +lA +lA +lA +Pd +HT +Sa +NF +SJ +SJ +SJ +SJ +Wp +pk +Wp +MC aa aa aa @@ -4877,38 +4877,38 @@ aa aa aa aa -ae -ht -ht -aG -al -bj -al -dm -bQ -ac -cB -cU -ac -dC -cw -cw -cw -cw -dC -cw -fF -fQ -ac -gh -gX -gN -cE -gN -cE -ht -ac -ae +MC +Wp +Wp +ew +iA +vY +iA +Or +zd +HT +sP +nT +HT +Qb +lA +lA +lA +lA +Qb +lA +ov +VV +HT +Cw +NF +Gw +SJ +Gw +SJ +Wp +HT +MC aa aa aa @@ -4929,36 +4929,36 @@ aa aa aa aa -ae -ht -aG -al -bk -al -dm -bR -ht -ht -ht -ht -ht -ht -ht -ht -ht -ht -ht -ht -ht -ht -gi -gX -cE -cE -cE -cE -ht -ae +MC +Wp +ew +iA +Mm +iA +Or +BC +Wp +Wp +Wp +Wp +Wp +Wp +Wp +Wp +Wp +Wp +Wp +Wp +Wp +Wp +rv +NF +SJ +SJ +SJ +SJ +Wp +MC aa aa aa @@ -4981,34 +4981,34 @@ aa aa aa aa -ht -aG -al -al -al -dm -bN -ac -cE -cV -cV -dD -dY -et -eG -eP -dD -cV -cV -cV -ac -gf -gX -cE -ht -hd -ht -ht +Wp +ew +iA +iA +iA +Or +oK +HT +SJ +yX +yX +tI +AA +hU +td +LH +tI +yX +yX +yX +HT +Tr +NF +SJ +Wp +zR +Wp +Wp aa aa aa @@ -5032,34 +5032,34 @@ aa aa aa aa -ht -aG -aO -al -al -bg -bT -cn -dE -dE -dl -dE -dE -dE -dE -dE -fa -dE -dE -fR -ga -dE -gC -cE -ht -he -hl -ht +Wp +ew +iy +iA +iA +WO +Bt +Gh +oB +oB +OQ +oB +oB +oB +oB +oB +Tu +oB +oB +tx +Zc +oB +fb +SJ +Wp +Qh +VB +Wp aa aa aa @@ -5083,34 +5083,34 @@ aa aa aa aa -ae -ht -aP -aP -bs -bH -bU -ht -cE -cE -dm -al -al -al -al -al -al -al -cE -al -ac -gj -gD -gP -ht -hf -ht -ae +MC +Wp +tw +tw +MX +Sl +pK +Wp +SJ +SJ +Or +iA +iA +iA +iA +iA +iA +iA +SJ +iA +HT +BA +oo +YI +Wp +yI +Wp +MC aa aa aa @@ -5135,32 +5135,32 @@ aa aa aa aa -ae -ht -ht -ht -ht -ht -ht -ht -cE -dn -fR -ea -fR -fR -eQ -al -fq -cE -ht -ht -ht -ht -ht -ht -ht -ae +MC +Wp +Wp +Wp +Wp +Wp +Wp +Wp +SJ +kg +tx +ia +tx +tx +wi +iA +ZS +SJ +Wp +Wp +Wp +Wp +Wp +Wp +Wp +MC aa aa aa @@ -5192,20 +5192,20 @@ aa aa aa aa -ae -ac -cW -do -al -eb -al -al -eb -al -al -fG -ht -ae +MC +HT +fz +Kz +iA +kB +iA +iA +kB +iA +iA +uf +Wp +MC aa aa aa @@ -5244,18 +5244,18 @@ aa aa aa aa -ac -cX -fr -cX -cX -cX -cX -cX -cX -fr -fH -ht +HT +tP +Tp +tP +tP +tP +tP +tP +tP +Tp +wT +Wp aa aa aa @@ -5295,18 +5295,18 @@ aa aa aa aa -ac -ht -ht -ak -ht -ht -ac -ht -ak -ht -ht -ht +HT +Wp +Wp +Fv +Wp +Wp +HT +Wp +Fv +Wp +Wp +Wp aa aa aa @@ -5346,18 +5346,18 @@ aa aa aa aa -ae -ht -dq -ah -ah -ht -ht -eS -ah -fs -ht -ae +MC +Wp +Fx +pb +pb +Wp +Wp +Oa +pb +HD +Wp +MC aa aa aa @@ -5398,16 +5398,16 @@ aa aa aa aa -ht -dr -dr -dr -ht -ht -dr -dr -dr -ht +Wp +AT +AT +AT +Wp +Wp +AT +AT +AT +Wp aa aa aa @@ -5449,16 +5449,16 @@ aa aa aa aa -ae -ds -ds -ds -ae -ae -ds -ds -ds -ae +MC +rB +rB +rB +MC +MC +rB +rB +rB +MC aa aa aa diff --git a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm index 40695eb325f40..9c642ce9e586e 100644 --- a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm @@ -3062,7 +3062,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 5 }, -/obj/machinery/autolathe, +/obj/machinery/modular_fabricator/autolathe, /obj/structure/sign/warning/radiation{ pixel_x = -32 }, diff --git a/_maps/RandomRuins/SpaceRuins/derelict4.dmm b/_maps/RandomRuins/SpaceRuins/derelict4.dmm index 5aeb87232723d..8efdb2d990f7a 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict4.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict4.dmm @@ -2,9 +2,6 @@ "a" = ( /turf/template_noop, /area/template_noop) -"b" = ( -/turf/closed/mineral, -/area/ruin/unpowered) "c" = ( /turf/open/floor/plating/asteroid/airless, /area/ruin/unpowered) @@ -89,6 +86,9 @@ /obj/structure/girder, /turf/open/floor/plating/airless, /area/ruin/unpowered) +"P" = ( +/turf/closed/mineral, +/area/ruin/unpowered) (1,1,1) = {" a @@ -112,7 +112,7 @@ a a a a -b +P a a a @@ -152,8 +152,8 @@ a a a a -b -b +P +P a a a @@ -188,9 +188,9 @@ a a a a -b -b -b +P +P +P a a a @@ -203,7 +203,7 @@ a "} (4,1,1) = {" a -b +P c c c @@ -221,12 +221,12 @@ a a a a -b +P a a a -b -b +P +P a a a @@ -239,8 +239,8 @@ a a "} (5,1,1) = {" -b -b +P +P c c c @@ -276,11 +276,11 @@ a a "} (6,1,1) = {" -b -b -b -b -b +P +P +P +P +P a a a @@ -313,11 +313,11 @@ a a "} (7,1,1) = {" -b -b -b -b -b +P +P +P +P +P a a a @@ -352,8 +352,8 @@ a (8,1,1) = {" a a -b -b +P +P a a a @@ -368,9 +368,9 @@ c c c c -b -b -b +P +P +P a a a @@ -389,14 +389,14 @@ a (9,1,1) = {" a a -b -b +P +P a a a a a -b +P c c c @@ -406,8 +406,8 @@ c c c c -b -b +P +P a a a @@ -433,9 +433,9 @@ a a a a -b -b -b +P +P +P c c c @@ -443,9 +443,9 @@ c c c c -b -b -b +P +P +P a a a @@ -469,21 +469,21 @@ a a a a -b -b -b -b -b -b +P +P +P +P +P +P c c -b -b -b -b -b -b -b +P +P +P +P +P +P +P a a a @@ -506,20 +506,20 @@ a a a a -b -b -b -b +P +P +P +P d d -b -b -b -b -b -b -b -b +P +P +P +P +P +P +P +P d a a @@ -528,9 +528,9 @@ a a a a -b -b -b +P +P +P a a "} @@ -545,19 +545,19 @@ a a d d -b -b +P +P d d -b -b -b +P +P +P d -b -b -b -b -b +P +P +P +P +P a a a @@ -566,9 +566,9 @@ a a a a -b -b -b +P +P +P a "} (14,1,1) = {" @@ -582,31 +582,31 @@ a a d d -b -b -b -b -b -b -b -b -b -b -b -b -b -b +P +P +P +P +P +P +P +P +P +P +P +P +P +P a a a a a a -b -b -b -b -b +P +P +P +P +P "} (15,1,1) = {" a @@ -620,17 +620,17 @@ a d d d -b -b -b +P +P +P g g o -b -b +P +P c -b -b +P +P d d a @@ -639,9 +639,9 @@ a a a d -b -b -b +P +P +P c c "} @@ -656,8 +656,8 @@ a a d d -b -b +P +P c e g @@ -666,8 +666,8 @@ p g e c -b -b +P +P d d a @@ -676,8 +676,8 @@ a a d d -b -b +P +P d c c @@ -692,9 +692,9 @@ a a a d -b -b -b +P +P +P c e g @@ -703,17 +703,17 @@ q h e c -b -b +P +P d d a a a d -b -b -b +P +P +P c c c @@ -728,10 +728,10 @@ a a a a -b -b -b -b +P +P +P +P c e g @@ -741,16 +741,16 @@ h e c c -b -b -b +P +P +P a a a -b -b -b -b +P +P +P +P c c c @@ -765,9 +765,9 @@ a a a a -b -b -b +P +P +P c c e @@ -780,12 +780,12 @@ c c c c -b +P a a d -b -b +P +P c c c @@ -803,8 +803,8 @@ a a a a -b -b +P +P c c f @@ -817,12 +817,12 @@ c c c c -b +P a -b -b -b -b +P +P +P +P c c c @@ -840,9 +840,9 @@ a a a a -b -b -b +P +P +P c e i @@ -856,9 +856,9 @@ c c a a -b -b -b +P +P +P c c c @@ -874,12 +874,12 @@ a a a a -b +P a a -b -b -b +P +P +P c e j @@ -893,8 +893,8 @@ c c a a -b -b +P +P c a a @@ -913,9 +913,9 @@ a a a a -b -b -b +P +P +P d c e @@ -931,7 +931,7 @@ a a a a -b +P c a a @@ -945,14 +945,14 @@ a a a a -b -b +P +P a a a -b -b -b +P +P +P d c e @@ -981,15 +981,15 @@ a (25,1,1) = {" a a -b -b -b +P +P +P a a a -b -b -b +P +P +P d c e @@ -1019,16 +1019,16 @@ a a a a -b -b +P +P a a a -b -b -b -b -b +P +P +P +P +P c c c @@ -1062,9 +1062,9 @@ a a a a -b -b -b +P +P +P c c c @@ -1100,8 +1100,8 @@ a a a a -b -b +P +P c c c @@ -1265,8 +1265,8 @@ a a c c -b -b +P +P a a a @@ -1303,7 +1303,7 @@ a c c d -b +P a a a @@ -1335,12 +1335,12 @@ a a a a -b +P a -b +P d -b -b +P +P a a a @@ -1374,8 +1374,8 @@ a a a a -b -b +P +P a a a diff --git a/_maps/RandomRuins/SpaceRuins/derelict5.dmm b/_maps/RandomRuins/SpaceRuins/derelict5.dmm index 93486d1056f08..1c4db9f105a7a 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict5.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict5.dmm @@ -2,15 +2,9 @@ "a" = ( /turf/template_noop, /area/template_noop) -"b" = ( -/turf/closed/mineral, -/area/ruin/unpowered/no_grav) "c" = ( /turf/open/floor/plating/asteroid/airless, /area/ruin/unpowered/no_grav) -"d" = ( -/turf/closed/mineral, -/area/ruin/unpowered) "e" = ( /turf/closed/wall, /area/ruin/unpowered) @@ -72,6 +66,12 @@ /obj/machinery/door/airlock/external, /turf/open/floor/plating, /area/ruin/unpowered) +"V" = ( +/turf/closed/mineral, +/area/ruin/unpowered/no_grav) +"W" = ( +/turf/closed/mineral, +/area/ruin/unpowered) (1,1,1) = {" a @@ -105,9 +105,9 @@ a a a a -b -b -b +V +V +V a a a @@ -145,9 +145,9 @@ a a a a -b -b -b +V +V +V a a a @@ -172,7 +172,7 @@ a a a a -b +V a a a @@ -187,11 +187,11 @@ a a a a -b +V a a a -b +V "} (4,1,1) = {" a @@ -256,7 +256,7 @@ a a a a -b +V a a a @@ -270,7 +270,7 @@ a a a a -b +V a "} (6,1,1) = {" @@ -320,11 +320,11 @@ a a a a -b -b -b -b -b +V +V +V +V +V c c c @@ -338,9 +338,9 @@ a a a a -b -b -b +V +V +V a a a @@ -359,12 +359,12 @@ a a a a -b -b -b -b -b -b +V +V +V +V +V +V c c c @@ -378,9 +378,9 @@ a a a a -b -b -b +V +V +V a a a @@ -399,15 +399,15 @@ a a a a -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V c c c @@ -419,10 +419,10 @@ a a a a -b -b -b -b +V +V +V +V a a a @@ -439,18 +439,18 @@ a a a a -b -b -b -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V +V +V +V c c a @@ -459,10 +459,10 @@ a a a a -b -b -b -b +V +V +V +V a a a @@ -478,19 +478,19 @@ a a a a -b -b -b -b -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V +V +V +V +V c c c @@ -518,20 +518,20 @@ a a a a -b -b -b -b -b -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V +V +V +V +V +V c c c @@ -558,20 +558,20 @@ a a a a -b -b -b -b -b -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V +V +V +V +V +V c c c @@ -598,13 +598,13 @@ a a a a -b -b -b -b -b -d -d +V +V +V +V +V +W +W f f e @@ -612,8 +612,8 @@ f e e e -d -b +W +V c c c @@ -638,12 +638,12 @@ a a a a -b -b -b -b -b -d +V +V +V +V +V +W g i i @@ -652,8 +652,8 @@ g f g g -d -b +W +V c c c @@ -680,9 +680,9 @@ a a a a -b -b -b +V +V +V e g g @@ -693,7 +693,7 @@ f g g e -b +V c c c @@ -720,9 +720,9 @@ a a a a -b -b -b +V +V +V e g g @@ -732,8 +732,8 @@ i e g g -d -b +W +V c c c @@ -744,9 +744,9 @@ a a a a -b -b -b +V +V +V a a a @@ -760,9 +760,9 @@ a a a a -b -b -b +V +V +V f e j @@ -773,9 +773,9 @@ e p l e -b -b -b +V +V +V c c c @@ -784,11 +784,11 @@ c a a a -b -b -b -b -b +V +V +V +V +V a a a @@ -801,9 +801,9 @@ a a a a -b -b -d +V +V +W g g l @@ -813,9 +813,9 @@ e g g f -b -b -b +V +V +V c c c @@ -826,9 +826,9 @@ c c c c -b -b -b +V +V +V a a a @@ -841,9 +841,9 @@ a a a a -b -b -d +V +V +W g g g @@ -853,9 +853,9 @@ e g p f -b -b -b +V +V +V c c c @@ -866,11 +866,11 @@ c c c c -b -b -b -b -b +V +V +V +V +V a "} (21,1,1) = {" @@ -881,8 +881,8 @@ a a a a -b -b +V +V e g g @@ -893,9 +893,9 @@ j g g e -b -b -b +V +V +V c c c @@ -908,9 +908,9 @@ c c c c -b -b -b +V +V +V a "} (22,1,1) = {" @@ -922,7 +922,7 @@ a a a a -b +V e h h @@ -935,7 +935,7 @@ p e e e -b +V c c c @@ -948,10 +948,10 @@ c c c c -b -b -b -b +V +V +V +V "} (23,1,1) = {" a @@ -962,8 +962,8 @@ a a a a -b -d +V +W f f j @@ -988,10 +988,10 @@ c c c c -b -b -b -b +V +V +V +V "} (24,1,1) = {" a @@ -1003,7 +1003,7 @@ a a a a -d +W i h g @@ -1011,11 +1011,11 @@ f l e e -d +W e e e -b +V c c c @@ -1028,14 +1028,14 @@ c c c c -b -b -b -b +V +V +V +V "} (25,1,1) = {" a -b +V a a a @@ -1043,19 +1043,19 @@ a a a a -b -b +V +V e f e -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V c c c @@ -1069,9 +1069,9 @@ c c c c -b -b -b +V +V +V "} (26,1,1) = {" a @@ -1083,22 +1083,22 @@ a a a a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V c c c @@ -1110,8 +1110,8 @@ c c c c -b -b +V +V "} (27,1,1) = {" a @@ -1123,23 +1123,23 @@ a a a a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V c c c @@ -1150,8 +1150,8 @@ c c c c -b -b +V +V "} (28,1,1) = {" a @@ -1163,23 +1163,23 @@ a a a a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V c c c @@ -1190,8 +1190,8 @@ c c c c -b -b +V +V "} (29,1,1) = {" a @@ -1203,22 +1203,22 @@ a a a a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V c c c @@ -1230,13 +1230,13 @@ c c c c -b -b +V +V "} (30,1,1) = {" a -b -b +V +V a a a @@ -1244,21 +1244,21 @@ a a a a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V c c c @@ -1268,15 +1268,15 @@ c c c c -b -b -b -b +V +V +V +V "} (31,1,1) = {" -b -b -b +V +V +V a a a @@ -1284,22 +1284,22 @@ a a a a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V c c c @@ -1308,16 +1308,16 @@ c c c c -b -b -b +V +V +V a "} (32,1,1) = {" -b -b -b -b +V +V +V +V a a a @@ -1326,38 +1326,38 @@ a a a a -b -b -b -b -b -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V +V +V +V +V +V c c c c c c -b -b -b -b -b +V +V +V +V +V a "} (33,1,1) = {" a -b -b -b +V +V +V a a a @@ -1366,75 +1366,75 @@ a a a a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V c c -b -b -b -b -b +V +V +V +V +V a "} (34,1,1) = {" -b +V a a a a a a -b +V a a a a a a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V a a "} (35,1,1) = {" -b +V a a a @@ -1448,28 +1448,28 @@ a a a a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V a a "} @@ -1478,7 +1478,7 @@ a a a a -b +V a a a @@ -1493,23 +1493,23 @@ a a a a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V +V a a "} @@ -1540,13 +1540,13 @@ a a a a -b -b -b -b -b -b -b +V +V +V +V +V +V +V a a a diff --git a/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm b/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm index a89d1422d2eb7..62ea4dc1ccc58 100644 --- a/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm +++ b/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm @@ -165,7 +165,7 @@ /turf/open/floor/plasteel/grimy, /area/ruin/space/has_grav/hilbertresearchfacility) "D" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/grimy, /area/ruin/space/has_grav/hilbertresearchfacility) "E" = ( @@ -187,6 +187,7 @@ /turf/open/floor/plasteel/grimy, /area/ruin/space/has_grav/hilbertresearchfacility) "I" = ( +/obj/structure/fans/tiny, /obj/machinery/door/airlock/highsecurity{ req_access = 207 }, diff --git a/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm b/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm index 9bb394663ad0f..12afc42a2ee20 100644 --- a/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm +++ b/_maps/RandomRuins/SpaceRuins/intactemptyship.dmm @@ -87,6 +87,7 @@ /turf/open/floor/mineral/titanium/purple, /area/ruin/space/has_grav/powered/authorship) "s" = ( +/obj/structure/fans/tiny, /obj/machinery/door/poddoor{ id = "goonwizship1" }, diff --git a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm index b27067444bbca..b29f8b7c61a26 100644 --- a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm +++ b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm @@ -35,7 +35,7 @@ /turf/open/floor/mineral/titanium/blue, /area/ruin/space/has_grav/powered/mechtransport) "j" = ( -/obj/machinery/computer/shuttle{ +/obj/machinery/computer/shuttle_flight{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm index 00ba365abf6d4..34cd3ec26a848 100644 --- a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm +++ b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm @@ -2,9 +2,6 @@ "aa" = ( /turf/template_noop, /area/template_noop) -"ab" = ( -/turf/closed/mineral, -/area/ruin/unpowered/no_grav) "ac" = ( /turf/open/floor/plating/asteroid/airless, /area/ruin/unpowered/no_grav) @@ -185,7 +182,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/powered/cat_man) "aF" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -242,12 +239,6 @@ }, /turf/open/floor/carpet, /area/ruin/space/has_grav/powered/cat_man) -"aO" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/powered/cat_man) "aP" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -294,7 +285,7 @@ /area/ruin/space/has_grav/powered/cat_man) "aV" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -313,19 +304,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/powered/cat_man) -"aX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/glass/bowl, -/obj/item/reagent_containers/food/snacks/meat/slab/synthmeat{ - desc = "A slab of cat meat. Tastes like furball."; - name = "cat meat" - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/powered/cat_man) "aY" = ( /obj/structure/bed/dogbed{ name = "kitty bed" @@ -345,16 +323,6 @@ /obj/item/flashlight/lamp, /turf/open/floor/carpet, /area/ruin/space/has_grav/powered/cat_man) -"bb" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/closet/cabinet, -/obj/item/gps{ - gpstag = "kitty" - }, -/turf/open/floor/carpet, -/area/ruin/space/has_grav/powered/cat_man) "bc" = ( /obj/machinery/button/door{ id = "meow"; @@ -551,7 +519,7 @@ /area/ruin/space/has_grav/powered/cat_man) "bF" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -629,7 +597,7 @@ /turf/open/floor/plasteel, /area/ruin/space/has_grav/powered/cat_man) "bN" = ( -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ruin/space/has_grav/powered/cat_man) "bO" = ( @@ -703,18 +671,6 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/powered/cat_man) -"bX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/food/snacks/meat/slab/synthmeat{ - desc = "A slab of cat meat. Tastes like furball."; - name = "cat meat" - }, -/obj/machinery/atmospherics/pipe/simple/green/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/powered/cat_man) "bY" = ( /obj/machinery/door/airlock/maintenance_hatch{ req_access_txt = "201" @@ -873,14 +829,42 @@ /obj/item/organ/ears/cat, /turf/open/floor/plasteel/freezer, /area/ruin/space/has_grav/powered/cat_man) -"cv" = ( +"cw" = ( +/obj/machinery/light/small, +/turf/open/floor/plasteel/freezer, +/area/ruin/space/has_grav/powered/cat_man) +"cx" = ( /obj/structure/closet/crate/freezer{ - name = "cat meat" + name = "cat tails" }, +/obj/item/organ/tail/cat, +/obj/item/organ/tail/cat, +/obj/item/organ/tail/cat, +/obj/item/organ/tail/cat, +/obj/item/organ/tail/cat, +/obj/item/organ/tail/cat, +/turf/open/floor/plasteel/freezer, +/area/ruin/space/has_grav/powered/cat_man) +"hz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/glass/bowl, /obj/item/reagent_containers/food/snacks/meat/slab/synthmeat{ desc = "A slab of cat meat. Tastes like furball."; name = "cat meat" }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/powered/cat_man) +"mI" = ( +/turf/closed/mineral, +/area/ruin/unpowered/no_grav) +"nI" = ( +/obj/structure/closet/crate/freezer{ + name = "cat meat" + }, /obj/item/reagent_containers/food/snacks/meat/slab/synthmeat{ desc = "A slab of cat meat. Tastes like furball."; name = "cat meat" @@ -909,22 +893,10 @@ desc = "A slab of cat meat. Tastes like furball."; name = "cat meat" }, -/turf/open/floor/plasteel/freezer, -/area/ruin/space/has_grav/powered/cat_man) -"cw" = ( -/obj/machinery/light/small, -/turf/open/floor/plasteel/freezer, -/area/ruin/space/has_grav/powered/cat_man) -"cx" = ( -/obj/structure/closet/crate/freezer{ - name = "cat tails" +/obj/item/reagent_containers/food/snacks/meat/slab/synthmeat{ + desc = "A slab of cat meat. Tastes like furball."; + name = "cat meat" }, -/obj/item/organ/tail/cat, -/obj/item/organ/tail/cat, -/obj/item/organ/tail/cat, -/obj/item/organ/tail/cat, -/obj/item/organ/tail/cat, -/obj/item/organ/tail/cat, /turf/open/floor/plasteel/freezer, /area/ruin/space/has_grav/powered/cat_man) "Bl" = ( @@ -934,6 +906,28 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/powered/cat_man) +"Cr" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/closet/cabinet, +/obj/item/gps{ + gpstag = "kitty" + }, +/turf/open/floor/carpet, +/area/ruin/space/has_grav/powered/cat_man) +"NJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/food/snacks/meat/slab/synthmeat{ + desc = "A slab of cat meat. Tastes like furball."; + name = "cat meat" + }, +/obj/machinery/atmospherics/pipe/simple/green/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/powered/cat_man) "RT" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -964,13 +958,13 @@ aa aa aa aa -ab -ab -ab -ab -ab -ab -ab +mI +mI +mI +mI +mI +mI +mI aa aa aa @@ -987,22 +981,22 @@ aa aa aa aa -ab -ab -ab -ab +mI +mI +mI +mI ac ac ac ac ac -ab -ab -ab -ab -ab -ab -ab +mI +mI +mI +mI +mI +mI +mI aa aa aa @@ -1018,25 +1012,25 @@ aa aa aa aa -ab -ab -ab -ab +mI +mI +mI +mI ac ac ac ac ac ac -ab -ab -ab -ab -ab -ab -ab -ab -ab +mI +mI +mI +mI +mI +mI +mI +mI +mI aa aa aa @@ -1048,62 +1042,62 @@ aa aa aa aa -ab -ab -ab -ab -ab -ab -ab +mI +mI +mI +mI +mI +mI +mI ac ac ac ac ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI aa aa "} (5,1,1) = {" aa aa -ab -ab -ab -ab +mI +mI +mI +mI ac ac ac -ab -ab +mI +mI ac ac ac ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI aa aa "} @@ -1118,39 +1112,39 @@ ac ad au ad -ab -ab +mI +mI ac ac ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI ac ac -ab +mI aa aa "} (7,1,1) = {" aa aa -ab -ab -ab -ab -ab +mI +mI +mI +mI +mI ad av ad -ab +mI ad aZ aZ @@ -1174,8 +1168,8 @@ aa (8,1,1) = {" aa aa -ab -ab +mI +mI ad ad ad @@ -1205,9 +1199,9 @@ aa "} (9,1,1) = {" aa -ab -ab -ab +mI +mI +mI ad ae ah @@ -1236,10 +1230,10 @@ aa aa "} (10,1,1) = {" -ab -ab -ab -ab +mI +mI +mI +mI ad af ah @@ -1269,9 +1263,9 @@ aa "} (11,1,1) = {" aa -ab -ab -ab +mI +mI +mI ad ad ad @@ -1280,7 +1274,7 @@ ax aH ad aT -bb +Cr aS by ad @@ -1302,8 +1296,8 @@ aa (12,1,1) = {" aa aa -ab -ab +mI +mI ad ag aj @@ -1324,25 +1318,25 @@ ad ad ad ad -ab -ab +mI +mI ac -ab +mI aa aa "} (13,1,1) = {" aa aa -ab -ab +mI +mI ad ah ah ar aw aI -aO +bN aI bc bq @@ -1359,15 +1353,15 @@ ad ad ad ad -ab +mI aa aa "} (14,1,1) = {" aa -ab -ab -ab +mI +mI +mI ad ai ak @@ -1389,17 +1383,17 @@ ce ci co cs -cv +nI ad -ab -ab +mI +mI aa "} (15,1,1) = {" aa -ab -ab -ab +mI +mI +mI ad ad ad @@ -1423,16 +1417,16 @@ cp ct cw ad -ab -ab +mI +mI aa "} (16,1,1) = {" aa -ab -ab -ab -ab +mI +mI +mI +mI ad al as @@ -1455,16 +1449,16 @@ ad cu cx ad -ab -ab +mI +mI aa "} (17,1,1) = {" aa -ab -ab -ab -ab +mI +mI +mI +mI ad am ad @@ -1487,16 +1481,16 @@ ad ad ad ad -ab -ab +mI +mI aa "} (18,1,1) = {" aa -ab -ab -ab -ab +mI +mI +mI +mI ad an ad @@ -1517,18 +1511,18 @@ ad cl cm ad -ab -ab -ab +mI +mI +mI aa aa "} (19,1,1) = {" aa -ab -ab -ab -ab +mI +mI +mI +mI ad ao as @@ -1542,25 +1536,25 @@ bh bG bO ay -bX +NJ as cb ad cm cq ad -ab -ab -ab +mI +mI +mI aa aa "} (20,1,1) = {" aa -ab -ab -ab -ab +mI +mI +mI +mI ad an ad @@ -1581,18 +1575,18 @@ ad ad ad ad -ab -ab -ab +mI +mI +mI aa aa "} (21,1,1) = {" aa -ab -ab -ab -ab +mI +mI +mI +mI ad an ad @@ -1613,25 +1607,25 @@ cg cm cr ad -ab -ab -ab -ab -ab +mI +mI +mI +mI +mI "} (22,1,1) = {" aa -ab -ab -ab -ab +mI +mI +mI +mI ad am ad ad ad ad -aX +hz bk ad aL @@ -1645,9 +1639,9 @@ ad cn cr ad -ab -ab -ab +mI +mI +mI aa aa "} @@ -1655,8 +1649,8 @@ aa aa aa aa -ab -ab +mI +mI ad ap at @@ -1677,8 +1671,8 @@ ad ad ad ad -ab -ab +mI +mI aa aa aa @@ -1687,8 +1681,8 @@ aa aa aa aa -ab -ab +mI +mI ad ad ad @@ -1706,11 +1700,11 @@ ad ad ad ad -ab -ab -ab -ab -ab +mI +mI +mI +mI +mI aa aa aa @@ -1720,10 +1714,10 @@ aa aa aa aa -ab -ab -ab -ab +mI +mI +mI +mI ad ap at @@ -1735,14 +1729,14 @@ bn aE bS ad -ab -ab -ab -ab -ab -ab -ab -ab +mI +mI +mI +mI +mI +mI +mI +mI aa aa aa @@ -1752,10 +1746,10 @@ aa aa aa aa -ab -ab -ab -ab +mI +mI +mI +mI ad ad ad @@ -1767,14 +1761,14 @@ ad ad ad ad -ab -ab -ab -ab -ab -ab -ab -ab +mI +mI +mI +mI +mI +mI +mI +mI aa aa aa @@ -1784,27 +1778,27 @@ 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 +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI aa aa aa @@ -1816,27 +1810,27 @@ 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 +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI aa aa aa @@ -1848,27 +1842,27 @@ 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 +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI aa aa aa @@ -1883,20 +1877,20 @@ aa aa aa aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI +mI aa aa aa @@ -1915,14 +1909,14 @@ aa aa aa aa -ab -ab -ab -ab -ab -ab -ab -ab +mI +mI +mI +mI +mI +mI +mI +mI aa aa aa @@ -1949,9 +1943,9 @@ aa aa aa aa -ab -ab -ab +mI +mI +mI aa aa aa @@ -1981,9 +1975,9 @@ aa aa aa aa -ab -ab -ab +mI +mI +mI aa aa aa diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index c3665af96fe9d..f3b85a6f73094 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -625,7 +625,7 @@ icon_state = "2-4" }, /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-25" }, /obj/effect/decal/cleanable/dirt, @@ -667,7 +667,7 @@ /turf/open/floor/plasteel, /area/ruin/space/has_grav/ancientstation) "bW" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-25" }, /obj/effect/decal/cleanable/dirt, @@ -891,7 +891,7 @@ /turf/open/floor/plasteel, /area/ruin/space/has_grav/ancientstation/deltacorridor) "cz" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-25" }, /obj/structure/cable/yellow{ @@ -961,7 +961,7 @@ /turf/open/floor/plasteel, /area/ruin/space/has_grav/ancientstation/deltacorridor) "cH" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-25" }, /obj/effect/decal/cleanable/dirt, @@ -1197,7 +1197,7 @@ /area/ruin/space/has_grav/ancientstation) "dn" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-25" }, /obj/machinery/light/small{ @@ -1249,7 +1249,7 @@ /area/ruin/space/has_grav/ancientstation/hydroponics) "ds" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-25" }, /obj/machinery/light/small{ @@ -1747,7 +1747,7 @@ /turf/open/floor/plasteel/white, /area/ruin/space/has_grav/ancientstation/rnd) "eD" = ( -/obj/machinery/mecha_part_fabricator, +/obj/machinery/modular_fabricator/exosuit_fab, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/white, /area/ruin/space/has_grav/ancientstation/rnd) @@ -4164,7 +4164,7 @@ icon_state = "1-4" }, /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-25" }, /obj/effect/decal/cleanable/dirt, @@ -4199,7 +4199,7 @@ /turf/open/floor/plasteel, /area/ruin/space/has_grav/ancientstation) "jJ" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-25" }, /obj/structure/cable/yellow{ @@ -5184,7 +5184,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation) "PV" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-25" }, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm index 29b38035e775f..b05da91b38236 100644 --- a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm +++ b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm @@ -811,9 +811,9 @@ dir = 6 }, /obj/structure/table/wood, -/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythree_twentythree, /obj/item/canvas, -/obj/item/canvas/nineteenXnineteen, +/obj/item/canvas/nineteen_nineteen, /turf/open/indestructible/paper, /area/ruin/powered) "co" = ( diff --git a/_maps/RandomRuins/SpaceRuins/refference.dmm b/_maps/RandomRuins/SpaceRuins/refference.dmm new file mode 100644 index 0000000000000..d7bf8dfabbb83 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/refference.dmm @@ -0,0 +1,1010 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space/basic, +/area/space) +"ab" = ( +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"ad" = ( +/turf/closed/mineral/random/high_chance, +/area/ruin/unpowered/no_grav) +"al" = ( +/obj/item/toy/crayon/spraycan{ + charges = 0 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"am" = ( +/obj/item/robot_suit/prebuilt{ + name = "lost cyborg"; + created_name = "Girder" + }, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"ap" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "s"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aq" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "w"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"ar" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "n"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "e"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"as" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "m"; + pixel_x = -8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"at" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "i"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "t"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"au" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "m"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"av" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "a"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "y"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aw" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "c"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"ax" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "o"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "n"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"ay" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "c"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "e"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"az" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "r"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "n"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aB" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "i"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = ","; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aC" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "g"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "i"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aD" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "r"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "d"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aE" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "e"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "r"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aG" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "i"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "d"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aH" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "y"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aK" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "e"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "d"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aL" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "l"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "o"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aO" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "y"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "o"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aP" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "u"; + pixel_x = -8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aQ" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "d"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "o"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aR" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "p"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "o"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aS" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "k"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aT" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "n"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "o"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aU" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "o"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "u"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aV" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "b"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "u"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aW" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "i"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "n"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aX" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "e"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "l"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aY" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "a"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "t"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"aZ" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "s"; + pixel_x = -8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"ba" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "n"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "t"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"bb" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "t"; + pixel_x = -8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"bc" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "t"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "h"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"bd" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "e"; + pixel_x = -8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"be" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "n"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "g"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"bf" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "h"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"bg" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "t"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "o"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"bh" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "r"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "y"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"bj" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "h"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "o"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"bk" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "r"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "t"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"bl" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "w"; + pixel_x = -8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"bn" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "i"; + pixel_x = -8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"ji" = ( +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"kV" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "m"; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "e"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"oP" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "!"; + pixel_x = -8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"qv" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = ","; + pixel_x = -8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"GA" = ( +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = ","; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/crayon{ + paint_colour = "#ff3000"; + icon_state = "b"; + pixel_x = 8 + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) + +(1,1,1) = {" +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 +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +ad +ad +ad +ji +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(6,1,1) = {" +aa +aa +ji +ad +ji +ji +ji +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(7,1,1) = {" +aa +aa +ji +ji +ji +ji +ji +aB +ji +aV +aa +aa +aa +aa +aa +aa +"} +(8,1,1) = {" +aa +ji +ad +ji +ji +ji +bg +aC +ji +bb +aL +aa +aa +aa +aa +aa +"} +(9,1,1) = {" +aa +ad +ad +ad +ji +ji +aq +aD +aO +bc +be +aa +aa +aa +aa +aa +"} +(10,1,1) = {" +aa +ad +ad +ad +ji +ji +bj +aE +aP +aY +ap +bn +aa +aa +aa +aa +"} +(11,1,1) = {" +aa +ad +ad +ad +ji +ji +as +GA +aQ +aZ +bg +ar +aa +aa +aa +aa +"} +(12,1,1) = {" +aa +ji +ad +ji +ji +ji +at +aG +ba +aT +bh +aK +ji +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +ji +ji +ji +ji +au +aH +aS +bb +ap +bf +ji +ji +aa +aa +"} +(14,1,1) = {" +aa +aa +aa +ji +ji +ji +av +aU +aT +bc +bj +aX +ji +ji +aa +aa +"} +(15,1,1) = {" +aa +aa +ji +ji +ji +ji +aw +bf +bl +bd +bk +ji +al +aa +aa +aa +"} +(16,1,1) = {" +aa +ji +ji +ji +ji +ji +ax +aX +kV +aR +qv +ji +aa +aa +aa +aa +"} +(17,1,1) = {" +aa +ji +ji +ji +ab +ji +ay +aL +qv +aW +ji +aa +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +ji +ji +ad +ad +am +az +oP +ji +bb +aa +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +ad +ad +ad +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(20,1,1) = {" +aa +aa +aa +ad +ad +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 +"} +(22,1,1) = {" +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 +"} +(24,1,1) = {" +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 +"} diff --git a/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm b/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm index aebbdec92aa95..86404a99333f9 100644 --- a/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm +++ b/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm @@ -10,10 +10,6 @@ "c" = ( /turf/closed/indestructible/oldshuttle, /area/ruin/powered) -"d" = ( -/obj/machinery/door/airlock/public/glass, -/turf/open/floor/oldshuttle, -/area/ruin/powered) "e" = ( /turf/closed/indestructible/oldshuttle/corner, /area/ruin/powered) @@ -54,14 +50,12 @@ /area/ruin/powered) "m" = ( /obj/structure/chair/old{ - icon_state = "chairold"; dir = 1 }, /turf/open/floor/oldshuttle, /area/ruin/powered) "n" = ( /obj/structure/chair/old{ - icon_state = "chairold"; dir = 1 }, /obj/item/crowbar/large{ @@ -73,7 +67,6 @@ /area/ruin/powered) "o" = ( /obj/structure/chair/old{ - icon_state = "chairold"; dir = 1 }, /mob/living/simple_animal/hostile/retaliate/spaceman, @@ -99,6 +92,11 @@ /obj/structure/shuttle/engine/propulsion/burst, /turf/template_noop, /area/ruin/powered) +"J" = ( +/obj/machinery/door/airlock/public/glass, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/oldshuttle, +/area/ruin/powered) (1,1,1) = {" a @@ -141,7 +139,7 @@ a a a b -d +J f g g @@ -163,7 +161,7 @@ g g g b -d +J l w a @@ -254,7 +252,7 @@ g c "} (10,1,1) = {" -d +J g g g @@ -268,7 +266,7 @@ c t g g -d +J "} (11,1,1) = {" c @@ -367,7 +365,7 @@ g g g e -d +J l v a @@ -379,7 +377,7 @@ a a a e -d +J h g g diff --git a/_maps/RandomRuins/SpaceRuins/sos1.dmm b/_maps/RandomRuins/SpaceRuins/sos1.dmm new file mode 100644 index 0000000000000..3369a61a1cd34 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/sos1.dmm @@ -0,0 +1,164 @@ +//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/ruin/unpowered) +"c" = ( +/obj/structure/shuttle/engine/propulsion/burst/right, +/turf/closed/wall/mineral/titanium/overspace, +/area/ruin/unpowered) +"d" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/item/gps{ + gpstag = "SOS" + }, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/unpowered) +"e" = ( +/obj/machinery/door/airlock/titanium{ + name = "Escape Pod Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/unpowered) +"f" = ( +/obj/structure/window/shuttle, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/unpowered) +"g" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/item/storage/pill_bottle/floorpill/full, +/obj/effect/mob_spawn/human/corpse/assistant, + /obj/item/storage/secure/briefcase/syndie, + /obj/item/storage/pod{ + pixel_y = -30 + }, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/unpowered) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +a +a +a +a +a +a +a +"} +(5,1,1) = {" +a +a +a +a +a +a +a +a +"} +(6,1,1) = {" +a +a +a +b +f +b +a +a +"} +(7,1,1) = {" +a +a +a +b +d +b +a +a +"} +(8,1,1) = {" +a +a +a +b +g +b +a +a +"} +(9,1,1) = {" +a +a +a +c +e +c +a +a +"} +(10,1,1) = {" +a +a +a +a +a +a +a +a +"} +(11,1,1) = {" +a +a +a +a +a +a +a +a +"} +(12,1,1) = {" +a +a +a +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/SpaceRuins/sos2.dmm b/_maps/RandomRuins/SpaceRuins/sos2.dmm new file mode 100644 index 0000000000000..c4d9f2d67b1b7 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/sos2.dmm @@ -0,0 +1,128 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/closed/mineral/random/high_chance, +/area/ruin/unpowered) +"c" = ( +/obj/structure/girder, +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) +"d" = ( +/obj/structure/shuttle/engine/propulsion/right, +/turf/open/space/basic, +/area/ruin/unpowered) +"e" = ( +/obj/structure/grille, +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) +"f" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/item/gps{ + gpstag = "SOS" + }, +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) +"g" = ( +/obj/machinery/door/airlock/titanium{ + name = "Escape Pod Airlock" + }, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/unpowered) +"h" = ( +/turf/closed/wall/mineral/titanium/interior, +/area/ruin/unpowered) +"i" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/item/storage/pod{ + pixel_y = -30 + }, +/obj/effect/mob_spawn/human/corpse/cargo_tech, +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) + +(1,1,1) = {" +a +a +b +b +a +a +a +a +"} +(2,1,1) = {" +a +b +b +b +b +b +a +a +"} +(3,1,1) = {" +a +b +b +b +b +b +a +a +"} +(4,1,1) = {" +b +b +b +b +b +e +h +a +"} +(5,1,1) = {" +b +b +b +b +b +f +h +a +"} +(6,1,1) = {" +a +b +b +b +c +i +h +a +"} +(7,1,1) = {" +a +a +b +a +d +g +d +a +"} +(8,1,1) = {" +a +a +a +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/SpaceRuins/sos3.dmm b/_maps/RandomRuins/SpaceRuins/sos3.dmm new file mode 100644 index 0000000000000..aaf5e7d653fc3 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/sos3.dmm @@ -0,0 +1,63 @@ +//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/bananium, +/area/ruin/unpowered) +"c" = ( +/obj/structure/shuttle/engine/propulsion/right, +/turf/open/floor/mineral/bananium/airless, +/area/ruin/unpowered) +"d" = ( +/obj/structure/window/plasma/fulltile, +/turf/open/floor/mineral/bananium/airless, +/area/ruin/unpowered) +"e" = ( +/obj/item/gps{ + gpstag = "SOS" + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/item/storage/pod{ + pixel_y = -30 + }, +/turf/open/floor/mineral/bananium/airless, +/area/ruin/unpowered) +"f" = ( +/obj/machinery/door/airlock/bananium, +/turf/open/floor/mineral/bananium/airless, +/area/ruin/unpowered) +"g" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/decal/remains/human, +/turf/open/floor/mineral/bananium/airless, +/area/ruin/unpowered) + +(1,1,1) = {" +a +b +d +b +"} +(2,1,1) = {" +a +b +g +b +"} +(3,1,1) = {" +a +b +e +b +"} +(4,1,1) = {" +a +c +f +c +"} diff --git a/_maps/RandomRuins/SpaceRuins/sos4.dmm b/_maps/RandomRuins/SpaceRuins/sos4.dmm new file mode 100644 index 0000000000000..ea9ea1ec59491 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/sos4.dmm @@ -0,0 +1,169 @@ +//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/ruin/unpowered) +"c" = ( +/obj/structure/shuttle/engine/propulsion/burst/right, +/turf/closed/wall/mineral/titanium/overspace, +/area/ruin/unpowered) +"d" = ( +/obj/structure/blob/normal, +/turf/template_noop, +/area/template_noop) +"e" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/item/gps{ + gpstag = "SOS" + }, +/turf/open/floor/mineral/titanium/blue/airless, +/area/ruin/unpowered) +"f" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/item/storage/pod{ + pixel_y = -30 + }, +/mob/living/simple_animal/hostile/blob/blobspore, +/turf/open/floor/mineral/titanium/blue/airless, +/area/ruin/unpowered) +"g" = ( +/obj/machinery/door/airlock/titanium{ + name = "Escape Pod Airlock" + }, +/turf/open/floor/mineral/titanium/blue/airless, +/area/ruin/unpowered) +"h" = ( +/obj/structure/blob/shield, +/turf/template_noop, +/area/template_noop) +"i" = ( +/obj/structure/blob/normal, +/turf/open/floor/mineral/titanium/blue/airless, +/area/ruin/unpowered) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +a +d +d +d +a +a +a +"} +(5,1,1) = {" +a +d +d +h +h +h +a +a +"} +(6,1,1) = {" +a +d +d +b +i +b +d +a +"} +(7,1,1) = {" +a +a +d +b +e +b +a +a +"} +(8,1,1) = {" +a +a +a +b +f +b +a +a +"} +(9,1,1) = {" +a +a +a +c +g +c +a +a +"} +(10,1,1) = {" +a +a +a +a +a +a +a +a +"} +(11,1,1) = {" +a +a +a +a +a +a +a +a +"} +(12,1,1) = {" +a +a +a +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/SpaceRuins/sos5.dmm b/_maps/RandomRuins/SpaceRuins/sos5.dmm new file mode 100644 index 0000000000000..e9f6e8e4288df --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/sos5.dmm @@ -0,0 +1,190 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/open/floor/mineral/titanium/white, +/area/ruin/unpowered) +"c" = ( +/turf/closed/wall/mineral/titanium, +/area/ruin/unpowered) +"d" = ( +/obj/structure/window/shuttle, +/turf/open/floor/mineral/titanium/white, +/area/ruin/unpowered) +"e" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/open/space/basic, +/area/ruin/unpowered) +"f" = ( +/obj/machinery/door/airlock/shuttle, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/titanium/white, +/area/ruin/unpowered) +"g" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/white, +/area/ruin/unpowered) +"h" = ( +/obj/machinery/computer, +/turf/open/floor/mineral/titanium/white, +/area/ruin/unpowered) +"i" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/white, +/area/ruin/unpowered) +"j" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/mob_spawn/human/corpse/assistant, +/turf/open/floor/mineral/titanium/white, +/area/ruin/unpowered) +"k" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/item/storage/pod{ + pixel_x = -32 + }, +/turf/open/floor/mineral/titanium/white, +/area/ruin/unpowered) +"l" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/item/storage/pod{ + pixel_x = 32 + }, +/turf/open/floor/mineral/titanium/white, +/area/ruin/unpowered) +"m" = ( +/obj/item/gps{ + gpstag = "SOS" + }, +/turf/open/floor/mineral/titanium/white, +/area/ruin/unpowered) +"n" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/mob_spawn/human/corpse/cargo_tech, +/turf/open/floor/mineral/titanium/white, +/area/ruin/unpowered) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +c +c +c +c +c +e +a +a +"} +(3,1,1) = {" +a +a +a +a +d +i +j +j +k +c +a +a +"} +(4,1,1) = {" +a +a +a +a +d +b +b +m +b +f +a +a +"} +(5,1,1) = {" +a +a +a +a +d +h +n +g +l +c +a +a +"} +(6,1,1) = {" +a +a +a +a +c +c +c +c +c +e +a +a +"} +(7,1,1) = {" +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 +"} diff --git a/_maps/RandomRuins/SpaceRuins/sos6.dmm b/_maps/RandomRuins/SpaceRuins/sos6.dmm new file mode 100644 index 0000000000000..735e3c777da71 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/sos6.dmm @@ -0,0 +1,195 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/unpowered) +"c" = ( +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/unpowered) +"d" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/mob_spawn/human/corpse/russian, +/obj/item/reagent_containers/food/drinks/bottle/vodka, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/unpowered) +"e" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/open/space/basic, +/area/ruin/unpowered) +"f" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/unpowered) +"g" = ( +/obj/machinery/computer, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/unpowered) +"h" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/unpowered) +"i" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/mob_spawn/human/corpse/russian/ranged, +/obj/item/gun/ballistic/rifle/boltaction, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/unpowered) +"j" = ( +/obj/item/gps{ + gpstag = "SOS" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/unpowered) +"k" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/unpowered) +"l" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/item/storage/pod{ + pixel_x = -32 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/unpowered) +"m" = ( +/obj/machinery/door/airlock/vault{ + name = "secured door"; + req_access = 207 + }, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/unpowered) +"n" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/item/storage/pod{ + pixel_x = 32 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/unpowered) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +b +b +b +b +b +e +a +a +"} +(3,1,1) = {" +a +a +a +a +c +h +d +d +l +b +a +a +"} +(4,1,1) = {" +a +a +a +a +c +f +f +j +f +m +a +a +"} +(5,1,1) = {" +a +a +a +a +c +g +i +k +n +b +a +a +"} +(6,1,1) = {" +a +a +a +a +b +b +b +b +b +e +a +a +"} +(7,1,1) = {" +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 +"} diff --git a/_maps/RandomRuins/SpaceRuins/sos7.dmm b/_maps/RandomRuins/SpaceRuins/sos7.dmm new file mode 100644 index 0000000000000..9fb921aa27372 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/sos7.dmm @@ -0,0 +1,230 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) +"c" = ( +/turf/closed/wall/mineral/titanium, +/area/ruin/unpowered) +"d" = ( +/obj/structure/alien/resin/wall{ + color = "#8EC127"; + desc = "Thick material shaped into a wall. Eugh."; + icon_state = "smooth"; + name = "gelatinous wall" + }, +/turf/template_noop, +/area/ruin/unpowered) +"e" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/open/space/basic, +/area/ruin/unpowered) +"f" = ( +/obj/machinery/door/airlock/shuttle, +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) +"g" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) +"h" = ( +/obj/machinery/computer, +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) +"i" = ( +/obj/structure/alien/resin/membrane{ + color = "#4BAE56"; + desc = "A strange combination of thin, gelatinous material."; + icon_state = "smooth"; + name = "gelatinous membrane" + }, +/turf/template_noop, +/area/ruin/unpowered) +"j" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/mob_spawn/human/corpse/assistant, +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) +"k" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/item/storage/pod{ + pixel_x = -32 + }, +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) +"l" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/item/storage/pod{ + pixel_x = 32 + }, +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) +"m" = ( +/obj/item/gps{ + gpstag = "SOS" + }, +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) +"n" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/mob_spawn/human/corpse/cargo_tech, +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) +"o" = ( +/obj/structure/alien/weeds{ + color = "#4BAE56"; + desc = "A thick gelatinous surface covers the floor. Someone get the golashes."; + name = "gelatinous floor" + }, +/obj/structure/grille/broken, +/mob/living/simple_animal/hostile/netherworld{ + name = "human?"; + desc = "Something that was once human..." + }, +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) +"p" = ( +/obj/structure/alien/weeds{ + color = "#4BAE56"; + desc = "A thick gelatinous surface covers the floor. Someone get the golashes."; + name = "gelatinous floor" + }, +/obj/structure/grille, +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) +"q" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/structure/alien/weeds{ + color = "#4BAE56"; + desc = "A thick gelatinous surface covers the floor. Someone get the golashes."; + name = "gelatinous floor" + }, +/turf/open/floor/mineral/titanium/white/airless, +/area/ruin/unpowered) + +(1,1,1) = {" +a +a +a +d +d +d +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +d +c +c +c +c +c +e +a +a +"} +(3,1,1) = {" +a +a +d +d +p +q +q +j +k +c +a +a +"} +(4,1,1) = {" +a +a +i +i +o +b +b +m +b +f +a +a +"} +(5,1,1) = {" +a +a +i +i +p +h +n +g +l +c +a +a +"} +(6,1,1) = {" +a +a +i +d +c +c +c +c +c +e +a +a +"} +(7,1,1) = {" +a +a +a +d +d +a +a +a +a +a +a +a +"} +(8,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/SpaceRuins/sos8.dmm b/_maps/RandomRuins/SpaceRuins/sos8.dmm new file mode 100644 index 0000000000000..83ffe0f9cc9a8 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/sos8.dmm @@ -0,0 +1,535 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"c" = ( +/turf/closed/mineral/random/high_chance, +/area/ruin/unpowered) +"d" = ( +/turf/closed/wall/mineral/titanium, +/area/ruin/unpowered) +"e" = ( +/obj/structure/window/shuttle, +/turf/open/floor/mineral/titanium/white, +/area/ruin/unpowered) +"f" = ( +/turf/closed/mineral/random/low_chance, +/area/ruin/unpowered) +"g" = ( +/obj/item/pickaxe/drill, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"h" = ( +/obj/machinery/computer, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"i" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"j" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/decal/remains/human, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"k" = ( +/obj/structure/girder, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"l" = ( +/obj/item/gps{ + gpstag = "SOS" + }, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"m" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"n" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/item/storage/pod{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"o" = ( +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"p" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/open/space/basic, +/area/ruin/unpowered) +"q" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/item/storage/pod{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"r" = ( +/obj/structure/grille, +/turf/open/floor/mineral/titanium/white, +/area/ruin/unpowered) +"s" = ( +/obj/machinery/door/airlock/shuttle, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"t" = ( +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered) + +(1,1,1) = {" +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 +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +t +t +a +a +"} +(4,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +t +t +a +"} +(5,1,1) = {" +a +a +a +a +a +f +f +f +a +a +a +a +a +a +a +a +a +a +a +a +"} +(6,1,1) = {" +a +a +a +a +f +f +f +f +f +d +d +d +d +d +p +a +a +a +a +a +"} +(7,1,1) = {" +a +a +a +a +f +f +c +c +f +e +b +b +b +n +d +a +a +a +a +a +"} +(8,1,1) = {" +a +a +a +a +f +f +c +c +f +r +g +i +l +o +s +a +a +a +a +a +"} +(9,1,1) = {" +a +a +a +a +f +f +c +c +f +r +h +j +m +q +d +a +a +a +t +a +"} +(10,1,1) = {" +a +a +a +f +f +c +c +c +c +f +f +k +d +d +p +a +a +a +a +a +"} +(11,1,1) = {" +a +a +a +f +f +c +c +c +c +f +f +f +t +t +a +a +a +a +a +a +"} +(12,1,1) = {" +a +a +f +f +f +c +c +c +c +c +f +f +a +a +a +a +a +a +a +a +"} +(13,1,1) = {" +a +a +f +f +f +c +c +c +c +c +f +f +a +a +a +a +a +a +a +a +"} +(14,1,1) = {" +a +a +a +f +f +f +c +c +c +c +c +f +a +a +a +t +t +a +a +a +"} +(15,1,1) = {" +a +a +a +f +f +f +f +c +c +c +c +f +a +a +t +t +t +a +a +a +"} +(16,1,1) = {" +a +a +a +a +a +f +f +f +f +f +f +f +a +a +t +t +a +a +a +a +"} +(17,1,1) = {" +a +a +a +a +a +a +f +f +f +f +f +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 +"} +(19,1,1) = {" +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 +"} diff --git a/_maps/RandomRuins/SpaceRuins/spacearcade.dmm b/_maps/RandomRuins/SpaceRuins/spacearcade.dmm new file mode 100644 index 0000000000000..f43f7f1650955 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/spacearcade.dmm @@ -0,0 +1,658 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/basic, +/area/space) +"b" = ( +/turf/closed/wall/mineral/gold, +/area/ruin/space/has_grav/powered) +"c" = ( +/turf/open/floor/eighties, +/area/ruin/space/has_grav/powered) +"d" = ( +/turf/open/floor/carpet/purple, +/area/ruin/space/has_grav/powered) +"e" = ( +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/ruin/space/has_grav/powered) +"f" = ( +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/ruin/space/has_grav/powered) +"g" = ( +/obj/machinery/computer{ + name = "Disco Disco Rave"; + desc = "Unfortunately, the machine seems to be broken..." + }, +/turf/open/floor/eighties, +/area/ruin/space/has_grav/powered) +"h" = ( +/obj/structure/window/reinforced, +/turf/open/floor/eighties, +/area/ruin/space/has_grav/powered) +"i" = ( +/turf/open/floor/plasteel/stairs, +/turf/open/floor/eighties, +/area/ruin/space/has_grav/powered) +"j" = ( +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/carpet/purple, +/area/ruin/space/has_grav/powered) +"k" = ( +/obj/machinery/computer/arcade, +/turf/open/floor/carpet/purple, +/area/ruin/space/has_grav/powered) +"l" = ( +/obj/machinery/computer/slot_machine, +/turf/open/floor/carpet/purple, +/area/ruin/space/has_grav/powered) +"m" = ( +/obj/structure/table/wood/poker, +/obj/item/gobbler, +/turf/open/floor/carpet/purple, +/area/ruin/space/has_grav/powered) +"n" = ( +/obj/machinery/door/airlock/gold, +/obj/structure/fans/tiny, +/turf/open/floor/carpet/purple, +/area/ruin/space/has_grav/powered) +"o" = ( +/obj/structure/table/wood/fancy/purple, +/obj/item/storage/belt/military/snack, +/turf/open/floor/carpet/purple, +/area/ruin/space/has_grav/powered) +"p" = ( +/obj/structure/closet/crate/wooden{ + name = "prize crate" + }, +/obj/item/choice_beacon/pet/pingu, +/obj/item/coin/arcade_token, +/obj/item/coin/arcade_token, +/obj/item/coin/arcade_token, +/obj/item/coin/arcade_token, +/obj/item/coin/arcade_token, +/obj/item/coin/arcade_token, +/obj/item/coin/arcade_token, +/obj/item/coin/arcade_token, +/obj/item/coin/arcade_token, +/obj/item/coin/arcade_token, +/turf/open/floor/carpet/purple, +/area/ruin/space/has_grav/powered) +"q" = ( +/obj/structure/closet/crate/freezer{ + name = "refreshment cooler" + }, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/soda_cans/sodawater, +/obj/item/reagent_containers/food/drinks/soda_cans/shamblers, +/obj/item/reagent_containers/food/drinks/soda_cans/shamblers, +/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull, +/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull, +/obj/item/reagent_containers/food/drinks/soda_cans/air, +/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb, +/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb, +/obj/item/reagent_containers/food/drinks/soda_cans/cola, +/obj/item/reagent_containers/food/drinks/soda_cans/cola, +/obj/item/reagent_containers/food/drinks/soda_cans/pwr_game, +/obj/item/reagent_containers/food/drinks/soda_cans/pwr_game, +/obj/item/reagent_containers/food/drinks/soda_cans/space_up, +/obj/item/reagent_containers/food/drinks/soda_cans/space_up, +/obj/item/reagent_containers/food/drinks/soda_cans/starkist, +/turf/open/floor/carpet/purple, +/area/ruin/space/has_grav/powered) +"r" = ( +/obj/machinery/computer/arcade, +/turf/open/floor/eighties, +/area/ruin/space/has_grav/powered) +"s" = ( +/turf/closed/mineral, +/area/ruin/space/has_grav/powered) + +(1,1,1) = {" +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 +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +s +s +a +a +a +a +"} +(4,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +s +s +s +s +a +a +a +"} +(5,1,1) = {" +a +a +a +a +s +s +s +s +a +b +j +j +j +b +s +s +s +s +a +a +"} +(6,1,1) = {" +a +a +a +s +s +s +s +s +s +b +p +d +d +b +s +s +s +s +a +a +"} +(7,1,1) = {" +a +a +s +s +s +s +s +s +s +b +m +m +m +b +s +s +s +a +a +a +"} +(8,1,1) = {" +a +a +s +s +s +s +b +b +b +k +d +d +d +k +b +b +s +a +a +a +"} +(9,1,1) = {" +a +s +s +s +s +b +r +r +h +d +d +d +d +d +l +b +a +a +a +a +"} +(10,1,1) = {" +a +s +s +s +b +c +c +c +h +d +d +d +d +d +d +l +b +b +a +a +"} +(11,1,1) = {" +a +s +s +s +b +g +e +f +e +i +c +c +c +c +c +c +c +n +a +a +"} +(12,1,1) = {" +a +a +s +s +b +g +f +e +f +i +c +c +c +c +c +c +c +n +a +a +"} +(13,1,1) = {" +a +a +s +s +b +g +e +f +e +i +c +c +c +c +c +c +c +n +a +a +"} +(14,1,1) = {" +a +s +s +s +b +c +c +c +h +d +d +d +d +d +d +l +b +b +a +a +"} +(15,1,1) = {" +a +s +s +s +s +b +r +r +h +d +d +d +d +d +l +b +a +a +a +a +"} +(16,1,1) = {" +a +s +s +s +s +s +b +b +b +k +d +d +d +k +b +b +s +a +a +a +"} +(17,1,1) = {" +a +a +s +s +s +s +s +s +s +b +o +d +o +b +s +s +s +s +a +a +"} +(18,1,1) = {" +a +a +a +s +s +s +s +s +a +b +q +d +q +b +s +s +s +s +a +a +"} +(19,1,1) = {" +a +a +a +a +a +s +s +a +a +b +j +j +j +b +s +s +s +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 +"} +(21,1,1) = {" +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 +"} +(23,1,1) = {" +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 +"} +(25,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/SpaceRuins/spacedock13.dmm b/_maps/RandomRuins/SpaceRuins/spacedock13.dmm new file mode 100644 index 0000000000000..946d1d5ed5674 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/spacedock13.dmm @@ -0,0 +1,695 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/basic, +/area/space) +"b" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/powered) +"c" = ( +/obj/structure/rack, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered) +"d" = ( +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered) +"e" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered) +"f" = ( +/obj/structure/rack, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered) +"g" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered) +"h" = ( +/obj/structure/closet/crate/science, +/obj/item/circuitboard/computer/shuttle/flight_control, +/obj/item/circuitboard/machine/shuttle/heater, +/obj/item/circuitboard/machine/shuttle/engine/plasma, +/obj/item/shuttle_creator, +/obj/item/circuitboard/machine/shuttle/engine/plasma, +/obj/item/circuitboard/machine/shuttle/heater, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered) +"i" = ( +/obj/machinery/door/airlock/external/glass, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered) +"j" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"k" = ( +/turf/open/floor/plasteel/yellowsiding, +/area/ruin/space/has_grav/powered) +"l" = ( +/turf/open/floor/plasteel/yellowsiding{ + dir = 1 + }, +/area/ruin/space/has_grav/powered) +"m" = ( +/obj/structure/rack, +/obj/item/stack/rods, +/obj/item/stack/rods, +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered) +"n" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered) +"o" = ( +/obj/structure/table, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered) +"p" = ( +/turf/open/floor/plating, +/area/space) +"q" = ( +/obj/structure/girder/displaced, +/turf/open/floor/plating, +/area/space) +"r" = ( +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/space) +"s" = ( +/obj/structure/statue/gold/ce, +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered) + +(1,1,1) = {" +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 +"} +(3,1,1) = {" +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 +"} +(5,1,1) = {" +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 +j +a +a +a +a +a +a +a +a +j +a +a +"} +(7,1,1) = {" +a +a +a +a +a +a +j +a +a +a +a +a +a +a +a +j +a +a +"} +(8,1,1) = {" +a +a +a +a +a +d +k +a +a +a +a +a +a +a +a +l +d +a +"} +(9,1,1) = {" +a +a +a +a +b +d +k +j +j +j +j +j +j +j +j +l +d +b +"} +(10,1,1) = {" +a +a +a +a +a +d +k +a +a +a +a +a +a +a +a +l +d +a +"} +(11,1,1) = {" +b +b +b +b +b +b +k +a +q +p +p +p +p +q +a +l +d +a +"} +(12,1,1) = {" +b +c +f +m +h +b +k +a +q +p +p +p +p +q +a +l +d +a +"} +(13,1,1) = {" +b +d +d +d +d +b +k +a +r +p +p +p +p +q +a +l +d +a +"} +(14,1,1) = {" +b +s +d +d +d +i +k +a +q +p +p +p +p +q +a +l +d +a +"} +(15,1,1) = {" +b +d +d +d +d +b +k +a +q +p +p +p +p +q +a +l +d +a +"} +(16,1,1) = {" +b +e +g +n +o +b +k +a +q +q +p +p +q +q +a +l +d +a +"} +(17,1,1) = {" +b +b +b +b +b +b +k +a +a +r +p +p +q +a +a +l +d +a +"} +(18,1,1) = {" +a +a +a +a +a +d +k +a +a +q +p +p +q +a +a +l +d +a +"} +(19,1,1) = {" +a +a +a +a +a +d +k +a +a +q +q +q +q +a +a +l +d +a +"} +(20,1,1) = {" +a +a +a +a +a +d +k +a +a +a +a +a +a +a +a +l +d +a +"} +(21,1,1) = {" +a +a +a +a +b +g +k +j +j +j +j +j +j +j +j +l +d +b +"} +(22,1,1) = {" +a +a +a +a +a +d +k +a +a +a +a +a +a +a +a +l +d +a +"} +(23,1,1) = {" +a +a +a +a +a +a +j +a +a +a +a +a +a +a +a +j +a +a +"} +(24,1,1) = {" +a +a +a +a +a +a +j +a +a +a +a +a +a +a +a +j +a +a +"} +(25,1,1) = {" +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 +"} +(27,1,1) = {" +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 +"} +(29,1,1) = {" +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 +"} diff --git a/_maps/RandomRuins/SpaceRuins/spacehive.dmm b/_maps/RandomRuins/SpaceRuins/spacehive.dmm new file mode 100644 index 0000000000000..9ae187aa5e76d --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/spacehive.dmm @@ -0,0 +1,756 @@ +//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/wood/nonmetal, +/area/ruin/unpowered) +"c" = ( +/obj/structure/beebox/premade/random, +/turf/open/floor/wood/airless, +/area/ruin/unpowered) +"d" = ( +/turf/open/floor/wood/airless, +/area/ruin/unpowered) +"e" = ( +/turf/open/floor/wood/airless, +/area/ruin/unpowered) +"f" = ( +/obj/machinery/door/airlock/wood, +/obj/structure/punji_sticks, +/turf/open/floor/wood/airless, +/area/ruin/unpowered) +"g" = ( +/turf/open/floor/wax/airless, +/area/ruin/unpowered) +"h" = ( +/turf/closed/wall/mineral/sandstone, +/area/ruin/unpowered) +"i" = ( +/obj/item/stack/sheet/mineral/wax, +/turf/open/floor/wax/airless, +/area/ruin/unpowered) +"j" = ( +/mob/living/simple_animal/hostile/poison/bees/space, +/turf/open/floor/wax/airless, +/area/ruin/unpowered) +"k" = ( +/obj/machinery/hydroponics, +/turf/open/floor/wood/airless, +/area/ruin/unpowered) +"l" = ( +/obj/machinery/hydroponics, +/turf/open/floor/wood/airless, +/area/ruin/unpowered) +"m" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/turf/open/floor/wood/airless, +/area/ruin/unpowered) +"n" = ( +/obj/structure/closet/secure_closet/hydroponics, +/turf/open/floor/wood/airless, +/area/ruin/unpowered) + +(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 +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +h +h +h +h +h +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 +h +h +h +h +h +i +g +g +g +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 +h +h +h +h +h +h +g +g +j +g +h +h +h +a +a +a +a +a +"} +(5,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +h +h +h +h +g +j +g +g +g +g +g +j +h +h +h +h +h +a +a +a +"} +(6,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +h +g +g +g +g +g +h +h +j +g +g +g +h +h +h +h +h +h +a +a +"} +(7,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +g +g +g +j +g +g +h +h +h +h +h +g +g +i +h +h +h +h +h +h +a +"} +(8,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +g +g +g +g +g +g +h +h +b +b +b +h +h +g +g +h +h +h +h +g +g +g +"} +(9,1,1) = {" +a +a +a +a +a +a +a +h +h +h +h +g +g +g +h +g +g +h +b +k +k +n +b +g +g +g +g +h +g +g +g +g +g +"} +(10,1,1) = {" +a +a +a +a +a +a +a +h +i +g +g +j +g +g +h +i +g +b +c +d +e +e +f +j +g +g +g +g +g +g +j +g +g +"} +(11,1,1) = {" +a +a +a +a +a +a +a +h +h +h +h +g +g +g +h +h +g +g +b +l +l +m +b +g +g +j +g +j +g +g +g +g +h +"} +(12,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +g +j +g +h +h +h +g +g +b +b +b +g +g +g +g +g +g +g +j +g +h +h +"} +(13,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +g +g +g +g +h +g +g +g +g +i +g +h +h +h +g +g +g +g +h +h +h +"} +(14,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +h +g +g +g +g +g +h +h +h +h +h +g +g +g +g +g +h +h +a +a +"} +(15,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +h +h +h +g +g +g +h +h +g +g +g +j +g +g +g +h +h +a +a +a +"} +(16,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +h +h +j +g +g +g +g +j +g +g +g +g +g +a +a +a +a +a +"} +(17,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +h +h +g +g +g +i +h +h +h +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 +g +g +h +h +h +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 +"} +(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 +"} diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index 24944fd77e407..499aadc2a6332 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -66,7 +66,7 @@ /area/ruin/unpowered/no_grav) "ak" = ( /obj/machinery/power/solar, -/obj/structure/cable/yellow, +/obj/structure/cable, /obj/structure/cable{ icon_state = "1-2" }, @@ -147,7 +147,7 @@ /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_3) "aD" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-02" }, /turf/open/floor/wood, @@ -187,7 +187,7 @@ /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_4) "aL" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-16" }, /turf/open/floor/wood, @@ -227,7 +227,7 @@ /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_5) "aT" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-16" }, /turf/open/floor/wood, @@ -267,7 +267,7 @@ /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_6) "bb" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-18" }, /turf/open/floor/wood, @@ -278,7 +278,7 @@ /area/ruin/space/has_grav/hotel/guestroom/room_6) "bd" = ( /obj/machinery/power/solar, -/obj/structure/cable/yellow, +/obj/structure/cable, /turf/open/floor/plating/airless, /area/ruin/unpowered/no_grav) "be" = ( @@ -483,7 +483,7 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 2; name = "Guest Room APC"; - pixel_y = -23 + pixel_y = -24 }, /obj/structure/cable/yellow{ icon_state = "0-4" @@ -531,7 +531,7 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 2; name = "Guest Room APC"; - pixel_y = -23 + pixel_y = -24 }, /obj/structure/cable/yellow{ icon_state = "0-4" @@ -579,7 +579,7 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 2; name = "Guest Room APC"; - pixel_y = -23 + pixel_y = -24 }, /obj/structure/cable/yellow{ icon_state = "0-4" @@ -627,7 +627,7 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 2; name = "Guest Room APC"; - pixel_y = -23 + pixel_y = -24 }, /obj/structure/cable/yellow{ icon_state = "0-4" @@ -1070,7 +1070,7 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 1; name = "Guest Room APC"; - pixel_y = 23 + pixel_y = 24 }, /obj/structure/cable/yellow{ icon_state = "0-4" @@ -1094,7 +1094,7 @@ /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_2) "dq" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/wood, @@ -1131,7 +1131,7 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 1; name = "Guest Room APC"; - pixel_y = 23 + pixel_y = 24 }, /obj/structure/cable/yellow{ icon_state = "0-4" @@ -1155,7 +1155,7 @@ /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_1) "dy" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-14" }, /turf/open/floor/wood, @@ -1407,12 +1407,18 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, /turf/open/floor/plasteel/white, /area/ruin/space/has_grav/hotel/workroom) "er" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/white, /area/ruin/space/has_grav/hotel/workroom) "es" = ( @@ -1460,9 +1466,9 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 2; name = "Laundry APC"; - pixel_y = -23 + pixel_y = -24 }, -/obj/structure/cable, +/obj/structure/cable/yellow, /turf/open/floor/plasteel/white, /area/ruin/space/has_grav/hotel/workroom) "eB" = ( @@ -1653,9 +1659,9 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 2; name = "Kitchen APC"; - pixel_y = -23 + pixel_y = -24 }, -/obj/structure/cable, +/obj/structure/cable/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/bar) "fi" = ( @@ -1829,7 +1835,7 @@ /turf/open/floor/plasteel, /area/ruin/space/has_grav/hotel/bar) "fI" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-02" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -2009,7 +2015,7 @@ }, /area/ruin/space/has_grav/hotel/dock) "gh" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/wood, @@ -2411,7 +2417,7 @@ /turf/open/floor/carpet, /area/ruin/space/has_grav/hotel) "hq" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-18" }, /turf/open/floor/plasteel/dark, @@ -2496,7 +2502,7 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 2; name = "Staff Room APC"; - pixel_y = -23 + pixel_y = -24 }, /obj/structure/cable/yellow{ icon_state = "0-4" @@ -2540,16 +2546,16 @@ /area/ruin/space/has_grav/hotel/workroom) "hG" = ( /obj/effect/mob_spawn/human/hotel_staff{ - icon_state = "sleeper_s"; - dir = 1 + dir = 1; + icon_state = "sleeper_s" }, /obj/machinery/light, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/hotel/workroom) "hH" = ( /obj/effect/mob_spawn/human/hotel_staff{ - icon_state = "sleeper_s"; - dir = 1 + dir = 1; + icon_state = "sleeper_s" }, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/hotel/workroom) @@ -2662,7 +2668,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/structure/piano{ +/obj/structure/musician/piano{ icon_state = "piano" }, /turf/open/floor/plasteel/grimy, @@ -2868,7 +2874,7 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 1; name = "Power Storage APC"; - pixel_y = 23 + pixel_y = 24 }, /obj/structure/cable/yellow{ icon_state = "0-8" @@ -2987,7 +2993,7 @@ /turf/open/floor/plasteel, /area/ruin/space/has_grav/hotel/power) "iM" = ( -/obj/item/twohanded/required/kirbyplants, +/obj/item/kirbyplants, /turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "iN" = ( @@ -3043,7 +3049,7 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 2; name = "Security APC"; - pixel_y = -23 + pixel_y = -24 }, /obj/structure/cable/yellow{ icon_state = "4-8" @@ -3090,7 +3096,7 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 2; name = "Pool APC"; - pixel_y = -23 + pixel_y = -24 }, /obj/structure/cable/yellow{ icon_state = "4-8" @@ -3139,9 +3145,9 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 2; name = "Dock APC"; - pixel_y = -23 + pixel_y = -24 }, -/obj/structure/cable, +/obj/structure/cable/yellow, /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/dock) "jf" = ( @@ -3902,22 +3908,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/hotel/pool) -"kR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - 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/dark, -/area/ruin/space/has_grav/hotel/pool) "kS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -4065,13 +4055,6 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/hotel/pool) -"li" = ( -/obj/effect/light_emitter, -/turf/open/floor/plating/beach/water, -/area/ruin/space/has_grav/hotel/pool) -"lj" = ( -/turf/open/floor/plating/beach/water, -/area/ruin/space/has_grav/hotel/pool) "lk" = ( /obj/structure/chair{ dir = 8 @@ -4356,10 +4339,6 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/hotel/security) -"lP" = ( -/obj/item/bikehorn/rubberducky, -/turf/open/floor/plating/beach/water, -/area/ruin/space/has_grav/hotel/pool) "lQ" = ( /obj/structure/table, /turf/open/floor/plasteel/showroomfloor, @@ -4787,7 +4766,7 @@ /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/hotel/pool) "mD" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-25" }, /obj/effect/turf_decal/tile/neutral{ @@ -4877,7 +4856,7 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 2; name = "Custodial APC"; - pixel_y = -23 + pixel_y = -24 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -4892,10 +4871,6 @@ /obj/structure/cable/yellow, /turf/open/floor/plasteel, /area/ruin/space/has_grav/hotel/custodial) -"mK" = ( -/obj/structure/closet/secure_closet/personal, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/hotel/pool) "mL" = ( /obj/machinery/light, /obj/structure/table, @@ -4915,7 +4890,7 @@ /area/ruin/space/has_grav/hotel/pool) "mO" = ( /obj/machinery/power/tracker, -/obj/structure/cable/yellow, +/obj/structure/cable, /turf/open/floor/plating/airless, /area/ruin/unpowered/no_grav) "mP" = ( @@ -4974,6 +4949,65 @@ /obj/effect/baseturf_helper/space, /turf/closed/wall, /area/ruin/space/has_grav/hotel/pool) +"pg" = ( +/turf/open/indestructible/sound/pool, +/area/ruin/space/has_grav/hotel/pool) +"pR" = ( +/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/pool{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hotel/pool) +"pV" = ( +/obj/effect/light_emitter, +/turf/open/indestructible/sound/pool/end, +/area/ruin/space/has_grav/hotel/pool) +"pY" = ( +/obj/item/pool/rubber_ring, +/turf/open/indestructible/sound/pool, +/area/ruin/space/has_grav/hotel/pool) +"rc" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hotel/secondary_solars) +"sb" = ( +/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/pool{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hotel/pool) +"sc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/template_noop, +/area/ruin/unpowered/no_grav) "sN" = ( /obj/machinery/door/airlock/external/glass, /obj/structure/cable{ @@ -4984,6 +5018,257 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) +"sZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + 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 + }, +/obj/effect/turf_decal/pool, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hotel/pool) +"tr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hotel/secondary_solars) +"uL" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/ruin/unpowered/no_grav) +"wM" = ( +/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/turf_decal/pool, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hotel/pool) +"xJ" = ( +/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/pool/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hotel/pool) +"xX" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hotel/secondary_solars) +"zZ" = ( +/obj/structure/pool_ladder, +/turf/open/indestructible/sound/pool/end, +/area/ruin/space/has_grav/hotel/pool) +"Bn" = ( +/obj/machinery/power/apc/highcap/five_k{ + dir = 2; + name = "Laundry APC"; + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hotel/secondary_solars) +"BR" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/hotel/workroom) +"Ix" = ( +/obj/item/bikehorn/rubberducky, +/turf/open/indestructible/sound/pool, +/area/ruin/space/has_grav/hotel/pool) +"Ju" = ( +/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/airless, +/area/ruin/unpowered/no_grav) +"KB" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/pool/pool_noodle, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hotel/pool) +"Lm" = ( +/obj/effect/light_emitter, +/turf/open/indestructible/sound/pool, +/area/ruin/space/has_grav/hotel/pool) +"Mk" = ( +/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/pool, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hotel/pool) +"MR" = ( +/turf/open/indestructible/sound/pool/end, +/area/ruin/space/has_grav/hotel/pool) +"Nb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/hotel/workroom) +"Ov" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/template_noop, +/area/ruin/unpowered/no_grav) +"Pc" = ( +/obj/machinery/door/airlock/engineering{ + name = "Power Storage"; + req_access_txt = "200,201" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/hotel/secondary_solars) +"PD" = ( +/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/pool/corner, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hotel/pool) +"QG" = ( +/obj/machinery/pool_filter, +/turf/open/indestructible/sound/pool/end, +/area/ruin/space/has_grav/hotel/pool) +"Ra" = ( +/obj/machinery/power/solar_control{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hotel/secondary_solars) +"Ru" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/hotel/secondary_solars) +"RI" = ( +/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/pool{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hotel/pool) +"Sg" = ( +/obj/item/pool/pool_noodle, +/turf/open/indestructible/sound/pool, +/area/ruin/space/has_grav/hotel/pool) +"TW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hotel/secondary_solars) +"VD" = ( +/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/pool/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hotel/pool) +"ZE" = ( +/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/turf_decal/pool/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hotel/pool) (1,1,1) = {" aa @@ -5540,7 +5825,7 @@ aj lX aj aj -aj +Ju mO ac ab @@ -7146,7 +7431,7 @@ jR jR kT jR -mK +KB jQ ac ac @@ -7216,7 +7501,7 @@ lh kD kD jR -mK +KB mN aa aa @@ -7273,20 +7558,20 @@ jt jS ko kD -kD -kD -kD -kD -kD -kD -kD -kD -kD -kD -kD +PD +sb +sb +sb +sb +sb +sb +sb +sb +sb +xJ kD jR -mK +KB mN aa aa @@ -7343,20 +7628,20 @@ jt jR jR kE -kD -li -lj -lj -lj -lj -lj -lj -lj -li -kD +Mk +pV +pg +pg +pg +pg +pg +pg +pg +Lm +RI mC jR -mK +KB mN aa aa @@ -7413,20 +7698,20 @@ jt jT jR kE -kD -lj -lj -lj -lj -lj -lj -lj -lj -lj -kD +Mk +MR +pg +pg +pg +pg +pg +pg +pg +pg +RI mC jR -mK +KB mN aa aa @@ -7483,17 +7768,17 @@ jt jU jR kE -kD -lj -lj -lj -lj -lj -lj -lj -lj -lj -kD +Mk +zZ +pg +pY +pg +pg +pg +pg +pg +pg +RI mC jR mL @@ -7553,17 +7838,17 @@ jt jR jR kD -kD -lj -lj -lj -lj -lj -lj -lj -lj -lj -kD +Mk +MR +pg +pg +pg +pg +pg +pg +pg +pg +RI kD jR ll @@ -7623,20 +7908,20 @@ jt jV jY jY -kD -lj -lj -lj -lj -lj -lP -lj -lj -lj -kD +Mk +MR +pg +pg +pg +pg +Ix +pg +pg +pg +RI kD jR -mK +KB mN aa aa @@ -7693,20 +7978,20 @@ ju jW jW jY -kD -lj -lj -lj -lj -lj -lj -lj -lj -lj -kD +Mk +MR +pg +pg +pg +pg +pg +pg +pg +pg +RI mC jR -mK +KB mN aa aa @@ -7763,20 +8048,20 @@ jv jW jW jY -kD -lj -lj -lj -lj -li -lj -lj -lj -lj -kD +Mk +QG +pg +pg +pg +Lm +pg +pg +pg +pg +RI mC jR -mK +KB mN aa aa @@ -7833,20 +8118,20 @@ jw jX jX kF -kR -lj -lj -lj -lj -lj -lj -lj -lj -lj -kD +sZ +MR +pg +pg +pg +pg +pg +pg +pg +pg +RI mC jR -mK +KB mN aa aa @@ -7880,7 +8165,7 @@ cF di di ea -ep +Nb dV di eT @@ -7903,20 +8188,20 @@ jx jY jY jY -kS -lj -lj -lj -lj -lj -lj -lj -lj -lj -kD +wM +MR +pg +pg +pg +pg +pg +pY +pg +pg +RI kD jR -mK +KB mN aa aa @@ -7950,7 +8235,7 @@ cF di dF ea -ep +Nb dF di eU @@ -7973,17 +8258,17 @@ jt jZ jR kD -kS -lj -lj -lj -lj -lj -lj -lj -lj -lj -kD +wM +MR +pg +pg +pg +pg +pg +pg +pg +pg +RI kD jR ll @@ -8043,17 +8328,17 @@ jt jU jR kE -kS -lj -lj -lj -lj -lj -lj -lj -lj -lj -kD +wM +zZ +pg +Sg +pg +pg +pg +pg +pg +pg +RI mC jR mM @@ -8090,7 +8375,7 @@ cF di dF eb -dV +BR dF di eV @@ -8113,20 +8398,20 @@ jt jR jR kE -kS -lj -lj -lj -lj -lj -lj -lj -lj -lj -kD +wM +MR +pg +pg +pg +pg +pg +pg +pg +pg +RI mC jR -mK +KB mN aa aa @@ -8160,7 +8445,7 @@ cF di di di -dV +BR dV di eW @@ -8183,20 +8468,20 @@ jt jR jR kE -kS -li -lj -lj -lj -lj -lj -lj -lj -li -kD +wM +pV +pg +pg +pg +pg +pg +pg +pg +Lm +RI mC jR -mK +KB mN aa aa @@ -8230,7 +8515,7 @@ cR am ac di -dV +BR eB di eX @@ -8253,20 +8538,20 @@ jt jS ko kD -kS -kD -kD -kD -kD -kD -kD -kD -kD -kD -kD +ZE +pR +pR +pR +pR +pR +pR +pR +pR +pR +VD kD jR -mK +KB mN aa aa @@ -8300,7 +8585,7 @@ cF cG ac ec -dV +BR eC di eY @@ -8336,7 +8621,7 @@ lk kD kD jR -mK +KB mN aa aa @@ -8370,7 +8655,7 @@ cF cG ac ec -dV +BR eD di eZ @@ -8406,7 +8691,7 @@ jR jR jR jR -mK +KB jQ ac ac @@ -8440,7 +8725,7 @@ cF cG ac ec -dV +BR eE di eW @@ -8510,7 +8795,7 @@ cF am ac di -dV +BR eF di fa @@ -8567,7 +8852,7 @@ aa af aj aj -al +uL at at at @@ -8579,10 +8864,10 @@ cG cG am ac -di -di -di -di +Ru +Pc +Ru +Ru fb fu fu @@ -8637,22 +8922,22 @@ aa ag aa aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -ac -aa -aa -aa -aa -eG +Ov +sc +sc +sc +sc +sc +sc +sc +sc +sc +sc +sc +tr +xX +Bn +Ru fc fu fu @@ -8719,10 +9004,10 @@ aa aa ac aa -aa -aa -aa -eG +TW +rc +Ra +Ru eX fu fu @@ -8789,10 +9074,10 @@ ab ab ab ab -aa -aa -aa -eG +Ru +Ru +Ru +Ru eY fu fu diff --git a/_maps/RandomRuins/SpaceRuins/swarmerstation13.dmm b/_maps/RandomRuins/SpaceRuins/swarmerstation13.dmm new file mode 100644 index 0000000000000..a31d2f7327453 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/swarmerstation13.dmm @@ -0,0 +1,1754 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/closed/mineral/random/low_chance, +/area/ruin/unpowered) +"c" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/unpowered) +"d" = ( +/turf/closed/mineral/random/high_chance, +/area/ruin/unpowered) +"e" = ( +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"f" = ( +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"g" = ( +/obj/effect/decal/remains/robot, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"h" = ( +/mob/living/simple_animal/hostile/swarmer/ai/melee_combat, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"i" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "150" + }, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"j" = ( +/obj/structure/swarmer/trap, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"k" = ( +/obj/effect/decal/cleanable/robot_debris/gib, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"l" = ( +/mob/living/simple_animal/hostile/swarmer/ai/ranged_combat, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"m" = ( +/obj/structure/swarmer/blockade, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"n" = ( +/obj/item/deactivated_swarmer, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"o" = ( +/obj/item/pen, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"p" = ( +/obj/item/clothing/head/beret/vintage, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"q" = ( +/obj/item/clothing/under/color/random, +/obj/item/clothing/under/color/random, +/obj/item/clothing/under/color/random, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"r" = ( +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) + +(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 +"} +(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 +"} +(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 +"} +(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 +b +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 +b +b +b +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 +b +b +b +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 +b +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 +"} +(9,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +c +c +c +i +c +c +c +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 +f +e +e +j +e +e +c +b +b +b +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 +f +e +g +e +h +e +c +b +b +b +b +b +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 +f +e +e +e +e +e +c +d +b +b +b +b +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 +f +e +h +e +e +p +c +d +d +b +b +b +b +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 +f +e +e +k +e +e +c +d +d +d +b +b +b +b +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 +b +c +c +c +c +j +j +c +c +c +c +c +c +c +c +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 +b +b +b +d +d +c +e +e +l +e +e +e +e +e +e +c +b +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 +b +b +b +d +d +c +e +e +e +e +e +e +e +h +e +c +b +b +b +a +a +a +a +"} +(18,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +b +d +c +e +e +m +m +m +h +e +e +e +c +d +b +b +b +a +a +a +"} +(19,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +b +c +e +e +m +e +e +e +e +e +k +c +d +d +b +b +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 +b +b +b +c +e +e +m +n +g +e +m +e +e +c +d +d +d +b +b +a +a +"} +(21,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +c +e +e +m +e +e +n +m +e +e +c +c +c +c +c +c +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 +b +c +e +e +e +e +e +e +m +e +e +m +e +r +q +e +f +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 +c +e +e +e +h +m +m +m +e +l +j +e +e +e +e +f +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 +c +e +h +e +e +e +e +g +e +e +j +e +e +g +e +f +a +a +"} +(25,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +c +o +n +e +e +e +e +e +e +e +m +e +e +h +e +f +a +a +"} +(26,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +a +a +a +a +c +c +c +c +c +c +c +c +c +c +c +e +e +e +e +f +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 +b +b +b +b +d +d +d +d +d +c +h +e +e +e +f +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 +b +b +b +b +b +d +d +d +c +e +e +e +e +f +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 +b +b +b +b +b +b +d +c +e +j +e +e +f +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 +b +b +b +b +b +b +b +c +c +i +c +c +c +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 +b +b +b +b +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 +"} +(33,1,1) = {" +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 +"} +(34,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +b +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 +b +b +b +b +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 +b +b +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 +"} +(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 +"} +(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 +"} +(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 +"} diff --git a/_maps/RandomRuins/SpaceRuins/vaporwave.dmm b/_maps/RandomRuins/SpaceRuins/vaporwave.dmm index 04b0d7b985dd4..10e59a05cccc7 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/SpaceRuins/whiteshipruin_box.dmm b/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm index deb91645bae5c..66acc088d523a 100644 --- a/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm +++ b/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm @@ -1,46 +1,55 @@ //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/ruin/space/has_grav/whiteship/box) -"c" = ( +"aE" = ( +/obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"d" = ( -/obj/structure/shuttle/engine/propulsion/left{ - dir = 8 +"bc" = ( +/obj/structure/light_construct/small{ + dir = 1 }, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/ruin/space/has_grav/whiteship/box) -"e" = ( -/obj/structure/table, -/obj/item/radio/off, -/turf/open/floor/mineral/titanium/white, +"bg" = ( +/obj/machinery/door/poddoor{ + id = "oldship_ruin_gun"; + name = "pod bay door" + }, +/turf/open/floor/plating, /area/ruin/space/has_grav/whiteship/box) -"f" = ( -/obj/structure/table, -/obj/item/screwdriver, +"bW" = ( /obj/structure/light_construct{ - dir = 1 + dir = 4 }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"g" = ( -/obj/machinery/computer/pod{ - dir = 8; - id = "oldship_ruin_gun" +"eP" = ( +/obj/machinery/computer{ + desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; + name = "Broken Computer" }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"h" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8 +"ff" = ( +/obj/structure/chair{ + dir = 4 }, -/turf/open/floor/plating/airless, +/obj/effect/decal/remains/human, +/turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"i" = ( +"fs" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular{ + pixel_x = 6; + pixel_y = -5 + }, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"fS" = ( +/obj/machinery/door/airlock/titanium, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/ruin/space/has_grav/whiteship/box) +"gu" = ( /obj/structure/shuttle/engine/heater{ dir = 8 }, @@ -49,121 +58,66 @@ }, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/whiteship/box) -"j" = ( -/turf/closed/wall/mineral/titanium/interior, +"iw" = ( +/turf/closed/wall/mineral/titanium, /area/ruin/space/has_grav/whiteship/box) -"k" = ( +"kK" = ( +/obj/structure/table, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"mk" = ( /obj/structure/rack, /obj/item/clothing/suit/space/hardsuit/medical, /obj/item/clothing/mask/breath, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"l" = ( -/turf/open/floor/plating, -/area/ruin/space/has_grav/whiteship/box) -"m" = ( -/obj/item/stock_parts/cell{ - charge = 100; - maxcharge = 15000 +"mU" = ( +/obj/structure/chair{ + dir = 1 }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"n" = ( -/obj/structure/rack, -/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/storage/toolbox/mechanical, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"o" = ( -/obj/machinery/door/airlock/public/glass, -/turf/open/floor/plating, -/area/ruin/space/has_grav/whiteship/box) -"p" = ( -/obj/machinery/mass_driver{ - dir = 4; - id = "oldship_ruin_gun" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/whiteship/box) -"q" = ( -/obj/machinery/door/poddoor{ - id = "oldship_ruin_gun"; - name = "pod bay door" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/whiteship/box) -"r" = ( -/obj/structure/shuttle/engine/propulsion/right{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/whiteship/box) -"s" = ( -/obj/structure/light_construct/small, -/turf/open/floor/plating, -/area/ruin/space/has_grav/whiteship/box) -"t" = ( -/obj/machinery/door/airlock/titanium, -/turf/open/floor/plating, -/area/ruin/space/has_grav/whiteship/box) -"u" = ( -/obj/structure/frame/computer{ - anchored = 1 - }, -/obj/machinery/light{ - dir = 1 - }, +"ns" = ( +/obj/structure/table, +/obj/item/radio/off, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"v" = ( +"nz" = ( /obj/machinery/computer{ desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; + dir = 8; name = "Broken Computer" }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"w" = ( -/obj/machinery/door/airlock/titanium, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"x" = ( -/obj/structure/chair{ +"oG" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/obj/structure/window/reinforced{ dir = 1 }, -/turf/open/floor/mineral/titanium/white, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/purple, /area/ruin/space/has_grav/whiteship/box) -"y" = ( -/obj/item/shard{ - icon_state = "medium" +"oQ" = ( +/obj/structure/shuttle/engine/propulsion/right{ + dir = 8 }, -/turf/open/floor/mineral/titanium/white, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav/whiteship/box) -"z" = ( -/obj/structure/light_construct, +"qV" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"A" = ( +"qY" = ( /obj/structure/light_construct{ - dir = 1 + dir = 8 }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"B" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, -/area/ruin/space/has_grav/whiteship/box) -"C" = ( -/obj/structure/table, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"D" = ( -/obj/machinery/door/window, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/space/has_grav/whiteship/box) -"E" = ( +"sQ" = ( /obj/structure/bed, /obj/item/bedsheet, /obj/structure/window/reinforced, @@ -172,98 +126,122 @@ }, /turf/open/floor/mineral/titanium/purple, /area/ruin/space/has_grav/whiteship/box) -"F" = ( -/obj/structure/table, -/obj/item/gun/energy/laser/retro, -/turf/open/floor/mineral/titanium/white, -/area/ruin/space/has_grav/whiteship/box) -"G" = ( -/obj/machinery/door/airlock/public/glass, -/turf/open/floor/mineral/titanium/white, +"tY" = ( +/obj/structure/light_construct/small, +/turf/open/floor/plating, /area/ruin/space/has_grav/whiteship/box) -"H" = ( +"uY" = ( /obj/structure/light_construct{ - dir = 4 + dir = 1 }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"I" = ( +"wW" = ( +/obj/machinery/door/window, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/space/has_grav/whiteship/box) +"ys" = ( /obj/structure/light_construct/small{ - dir = 4 + dir = 8 }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"J" = ( +"yC" = ( +/turf/open/floor/plating, +/area/ruin/space/has_grav/whiteship/box) +"Bk" = ( +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"BE" = ( +/obj/structure/table, +/obj/item/screwdriver, /obj/structure/light_construct{ - dir = 8 + dir = 1 }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"K" = ( -/obj/structure/chair{ - dir = 4 +"DK" = ( +/obj/machinery/sleeper{ + dir = 8 }, /obj/effect/decal/remains/human, +/obj/structure/light_construct, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"L" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 8; - name = "Broken Computer" - }, +"EM" = ( +/obj/item/multitool, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"M" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, +"Ff" = ( +/obj/structure/light_construct, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"N" = ( -/obj/structure/light_construct/small{ - dir = 8 +"Fs" = ( +/obj/item/shard{ + icon_state = "medium" }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"O" = ( +"FI" = ( /obj/structure/table, /obj/item/tank/internals/oxygen, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"P" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/mineral/titanium/white, +"Gk" = ( +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/plating, /area/ruin/space/has_grav/whiteship/box) -"Q" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 +"Hx" = ( +/obj/machinery/computer/pod{ + dir = 8; + id = "oldship_ruin_gun" }, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/space/has_grav/whiteship/box) -"R" = ( -/obj/machinery/door/window/northright, -/obj/effect/decal/remains/human, -/turf/open/floor/mineral/titanium/purple, +/turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"S" = ( -/obj/item/multitool, +"Iv" = ( +/turf/template_noop, +/area/template_noop) +"Iy" = ( +/obj/structure/rack, +/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/storage/toolbox/mechanical, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"T" = ( +"Kq" = ( /obj/structure/light_construct/small{ - dir = 1 + dir = 4 + }, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"NH" = ( +/obj/machinery/mass_driver{ + dir = 4; + id = "oldship_ruin_gun" }, /turf/open/floor/plating, /area/ruin/space/has_grav/whiteship/box) -"U" = ( -/obj/structure/chair, +"Ob" = ( +/obj/structure/frame/computer{ + anchored = 1; + dir = 8 + }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"V" = ( +"Pd" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/ruin/space/has_grav/whiteship/box) +"Ph" = ( +/obj/item/stock_parts/cell{ + charge = 100; + maxcharge = 15000 + }, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"QS" = ( /obj/structure/frame/computer{ anchored = 1; dir = 1 @@ -271,836 +249,863 @@ /obj/structure/light_construct, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"W" = ( -/obj/item/scalpel, +"RN" = ( +/obj/structure/frame/computer{ + anchored = 1 + }, +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"X" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular{ - pixel_x = 6; - pixel_y = -5 - }, +"RU" = ( +/obj/machinery/door/airlock/public/glass, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"Y" = ( -/obj/structure/frame/computer{ - anchored = 1; +"TF" = ( +/obj/structure/shuttle/engine/propulsion/left{ dir = 8 }, +/turf/open/floor/plating/airless, +/area/ruin/space/has_grav/whiteship/box) +"Vq" = ( +/turf/closed/wall/mineral/titanium/interior, +/area/ruin/space/has_grav/whiteship/box) +"VU" = ( +/obj/structure/chair, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) -"Z" = ( -/obj/machinery/sleeper{ +"Wi" = ( +/obj/structure/shuttle/engine/propulsion{ dir = 8 }, +/turf/open/floor/plating/airless, +/area/ruin/space/has_grav/whiteship/box) +"Wt" = ( +/obj/machinery/door/airlock/titanium, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"Xh" = ( +/obj/machinery/door/airlock/titanium, +/turf/open/floor/plating, +/area/ruin/space/has_grav/whiteship/box) +"Yh" = ( +/obj/structure/table, +/obj/item/gun/energy/laser/retro, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/has_grav/whiteship/box) +"Yr" = ( +/obj/machinery/door/window/northright, /obj/effect/decal/remains/human, -/obj/structure/light_construct, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/space/has_grav/whiteship/box) +"Yz" = ( +/obj/item/scalpel, /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/whiteship/box) (1,1,1) = {" -a -a -a -a -a -a -a -a -b -b -t -b -b -a -a -a -a -a -a -a -a +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv +iw +iw +fS +iw +iw +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv "} (2,1,1) = {" -a -a -a -a -a -a -a -a -b -j -c -j -b -a -a -a -a -a -a -a -a +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv +iw +Vq +Bk +Vq +iw +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv "} (3,1,1) = {" -a -a -a -a -a -a -a -a -b -c -c -c -b -a -a -a -a -a -a -a -a +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv +iw +Bk +Bk +Bk +iw +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv "} (4,1,1) = {" -a -a -a -a -a -a -a -a -b -c -c -c -b -a -a -a -a -a -a -a -a +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv +iw +Bk +Bk +Bk +iw +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv "} (5,1,1) = {" -a -a -a -a -a -a -a -a -b -c -c -c -b -a -a -a -a -a -a -a -a +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv +iw +Bk +Bk +Bk +iw +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv "} (6,1,1) = {" -a -a -a -a -a -a -a -a -b -c -c -z -b -a -a -a -a -a -a -a -a +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv +iw +Bk +Bk +Ff +iw +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv "} (7,1,1) = {" -a -a -a -a -a -a -a -a -b -c -c -c -b -a -a -a -a -a -a -a -a +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv +iw +Bk +Bk +Bk +iw +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv "} (8,1,1) = {" -a -a -a -a -a -a -a -a -b -c -c -c -b -a -a -a -a -a -a -a -a +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv +iw +Bk +Bk +Bk +iw +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv "} (9,1,1) = {" -a -a -a -a -a -a -a -a -b -c -c -M -b -a -a -a -a -a -a -a -a +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv +iw +Bk +Bk +qV +iw +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv "} (10,1,1) = {" -a -a -a -a -a -a -a -a -b -j -c -j -b -a -a -a -a -a -a -a -a +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv +iw +Vq +Bk +Vq +iw +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv "} (11,1,1) = {" -a -a -a -a -a -a -a -a -b -b -w -b -b -a -a -a -a -a -a -a -a +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv +iw +iw +Wt +iw +iw +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv "} (12,1,1) = {" -a -a -a -a -a -a -a -a -a -b -c -b -a -a -a -a -a -a -a -a -a +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv +iw +Bk +iw +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv "} (13,1,1) = {" -a -a -a -a -a -a -a -a -b -b -w -b -b -a -a -a -a -a -a -a -a +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv +iw +iw +Wt +iw +iw +Iv +Iv +Iv +Iv +Iv +Iv +Iv +Iv "} (14,1,1) = {" -a -a -a -a -a -a -a -b -b -j -c -j -b -b -a -a -a -a -a -a -a +Iv +Iv +Iv +Iv +Iv +Iv +Iv +iw +iw +Vq +Bk +Vq +iw +iw +Iv +Iv +Iv +Iv +Iv +Iv +Iv "} (15,1,1) = {" -b -d -h -h -h -r -a -b -j -c -c -c -j -b -a -d -h -h -h -r -b +iw +TF +Wi +Wi +Wi +oQ +Iv +iw +Vq +Bk +Bk +Bk +Vq +iw +Iv +TF +Wi +Wi +Wi +oQ +iw "} (16,1,1) = {" -b -b -i -i -i -b -b -b -A -c -c -c -z -b -b -b -i -i -i -b -b +iw +iw +gu +gu +gu +iw +iw +iw +uY +Bk +Bk +Bk +Ff +iw +iw +iw +gu +gu +gu +iw +iw "} (17,1,1) = {" -a -b -j -l -l -j -b -j -c -c -c -c -c -j -b -j -l -l -j -b -a +Iv +iw +Vq +yC +yC +Vq +iw +Vq +Bk +Bk +Bk +Bk +Bk +Vq +iw +Vq +yC +yC +Vq +iw +Iv "} (18,1,1) = {" -a -a -b -j -l -s -b -c -c -c -c -c -c -P -b -T -l -j -b -a -a +Iv +Iv +iw +Vq +yC +tY +iw +Bk +Bk +Bk +Bk +Bk +Bk +aE +iw +bc +yC +Vq +iw +Iv +Iv "} (19,1,1) = {" -a -a -a -b -b -t -b -b -b -B -G -B -b -b -b -t -b -b -a -a -a +Iv +Iv +Iv +iw +iw +Xh +iw +iw +iw +Pd +RU +Pd +iw +iw +iw +Xh +iw +iw +Iv +Iv +Iv "} (20,1,1) = {" -a -a -a -b -b -c -c -c -c -c -c -c -c -c -c -c -b -b -a -a -a +Iv +Iv +Iv +iw +iw +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +iw +iw +Iv +Iv +Iv "} (21,1,1) = {" -a -a -b -b -j -m -c -c -c -c -H -c -c -c -c -c -b -b -b -a -a +Iv +Iv +iw +iw +Vq +Ph +Bk +Bk +Bk +Bk +bW +Bk +Bk +Bk +Bk +Bk +iw +iw +iw +Iv +Iv "} (22,1,1) = {" -a -b -b -j -c -c -c -c -b -b -b -b -b -b -c -c -b -b -b -b -a +Iv +iw +iw +Vq +Bk +Bk +Bk +Bk +iw +iw +iw +iw +iw +iw +Bk +Bk +iw +iw +iw +iw +Iv "} (23,1,1) = {" -b -b -b -b -b -b -j -c -b -D -c -N -c -w -c -c -w -c -j -b -a +iw +iw +iw +iw +iw +iw +Vq +Bk +iw +wW +Bk +ys +Bk +Wt +Bk +Bk +Wt +Bk +Vq +iw +Iv "} (24,1,1) = {" -t -c -c -k -k -j -b -z -b -E -c -O -Q -b -A -c -b -c -X -b -b +fS +Bk +Bk +mk +mk +Vq +iw +Ff +iw +sQ +Bk +FI +oG +iw +uY +Bk +iw +Bk +fs +iw +iw "} (25,1,1) = {" -b -c -c -c -c -n -b -c -w -c -I -c -R -b -c -c -b -c -c -j -b +iw +Bk +Bk +Bk +Bk +Iy +iw +Bk +Wt +Bk +Kq +Bk +Yr +iw +Bk +Bk +iw +Bk +Bk +Vq +iw "} (26,1,1) = {" -b -e -c -c -c -c -b -c -b -b -b -b -b -b -c -m -B -W -c -c -b +iw +ns +Bk +Bk +Bk +Bk +iw +Bk +iw +iw +iw +iw +iw +iw +Bk +Ph +Pd +Yz +Bk +Bk +iw "} (27,1,1) = {" -b -f -c -c -c -c -w -c -c -c -J -c -c -c -c -c -B -c -c -Z -b +iw +BE +Bk +Bk +Bk +Bk +Wt +Bk +Bk +Bk +qY +Bk +Bk +Bk +Bk +Bk +Pd +Bk +Bk +DK +iw "} (28,1,1) = {" -b -c -c -c -c -c -b -j -c -c -c -c -c -c -c -S -B -c -c -c -b +iw +Bk +Bk +Bk +Bk +Bk +iw +Vq +Bk +Bk +Bk +Bk +Bk +Bk +Bk +EM +Pd +Bk +Bk +Bk +iw "} (29,1,1) = {" -b -c -c -c -c -j -b -b -b -B -G -B -b -b -b -b -b -c -c -c -b +iw +Bk +Bk +Bk +Bk +Vq +iw +iw +iw +Pd +RU +Pd +iw +iw +iw +iw +iw +Bk +Bk +Bk +iw "} (30,1,1) = {" -b -c -c -c -j -b -j -c -c -c -c -c -c -C -C -C -b -c -c -j -b +iw +Bk +Bk +Bk +Vq +iw +Vq +Bk +Bk +Bk +Bk +Bk +Bk +kK +kK +kK +iw +Bk +Bk +Vq +iw "} (31,1,1) = {" -t -c -g -c -b -j -c -c -c -c -c -c -c -c -c -c -j -j -Y -b -a +fS +Bk +Hx +Bk +iw +Vq +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Vq +Vq +Ob +iw +Iv "} (32,1,1) = {" -b -b -b -o -b -u -x -c -c -c -c -c -c -c -c -U -V -b -b -b -a +iw +iw +iw +Gk +iw +RN +mU +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +VU +QS +iw +iw +iw +Iv "} (33,1,1) = {" -a -a -b -p -b -v -x -c -c -C -K -C -c -c -c -c -j -b -b -a -a +Iv +Iv +iw +NH +iw +eP +mU +Bk +Bk +kK +ff +kK +Bk +Bk +Bk +Bk +Vq +iw +iw +Iv +Iv "} (34,1,1) = {" -a -a -b -q -b -j -y -c -c -F -L -C -c -c -c -j -b -b -a -a -a +Iv +Iv +iw +bg +iw +Vq +Fs +Bk +Bk +Yh +nz +kK +Bk +Bk +Bk +Vq +iw +iw +Iv +Iv +Iv "} (35,1,1) = {" -a -a -a -a -b -b -b -B -B -B -B -B -B -B -b -b -b -a -a -a -a +Iv +Iv +Iv +Iv +iw +iw +iw +Pd +Pd +Pd +Pd +Pd +Pd +Pd +iw +iw +iw +Iv +Iv +Iv +Iv "} diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm deleted file mode 100644 index 749e7bd5ba1c8..0000000000000 --- a/_maps/RandomZLevels/Academy.dmm +++ /dev/null @@ -1,21100 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/open/space, -/area/space) -"ab" = ( -/turf/closed/wall/r_wall, -/area/awaymission/academy/headmaster) -"ac" = ( -/mob/living/simple_animal/hostile/carp/ranged{ - faction = list("wizard") - }, -/turf/open/space, -/area/space/nearstation) -"ad" = ( -/obj/structure/filingcabinet/filingcabinet, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"ae" = ( -/obj/structure/frame/computer{ - anchored = 1 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"af" = ( -/obj/structure/table/reinforced, -/obj/item/pen/red, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"ag" = ( -/obj/structure/table/reinforced, -/obj/item/folder/blue, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"ah" = ( -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"ai" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"aj" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/power/apc/unlocked{ - dir = 1; - environ = 3; - equipment = 3; - pixel_y = 23; - req_access = null - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"ak" = ( -/obj/structure/table/reinforced, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"al" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"am" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/light/small, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"an" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"ao" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"ap" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"aq" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/drinks/coffee, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"ar" = ( -/obj/structure/table/reinforced, -/obj/item/paper/fluff/awaymissions/academy/console_maint, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"as" = ( -/turf/closed/wall, -/area/awaymission/academy/headmaster) -"at" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/wood{ - name = "Headmaster Room" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"au" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"av" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"aw" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"ax" = ( -/obj/structure/chair/stool, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"ay" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/structure/mirror/magic/lesser{ - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"az" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/item/stack/sheet/animalhide/monkey, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"aA" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"aB" = ( -/obj/structure/bed, -/obj/item/bedsheet/purple, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"aC" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/drinks/mug/tea, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"aD" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"aE" = ( -/obj/structure/filingcabinet, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"aF" = ( -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"aG" = ( -/turf/closed/indestructible/rock, -/area/space/nearstation) -"aH" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"aI" = ( -/obj/structure/table/reinforced, -/obj/item/laser_pointer/upgraded, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"aJ" = ( -/obj/structure/destructible/cult/tome, -/obj/item/dice/d20/fate, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"aK" = ( -/mob/living/simple_animal/hostile/morph{ - faction = list("skeleton") - }, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"aL" = ( -/turf/closed/wall/mineral/wood, -/area/awaymission/academy/academycellar) -"aM" = ( -/obj/structure/table/reinforced, -/obj/item/storage/briefcase, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"aN" = ( -/obj/structure/table/reinforced, -/obj/item/coin/plasma, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"aO" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"aP" = ( -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"aQ" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/gold, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"aR" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/gold, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"aS" = ( -/turf/closed/mineral/random/high_chance, -/area/awaymission/academy) -"aT" = ( -/obj/structure/noticeboard, -/turf/closed/wall, -/area/awaymission/academy/headmaster) -"aU" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"aV" = ( -/obj/structure/chair/office, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"aW" = ( -/obj/structure/reagent_dispensers/water_cooler, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"aX" = ( -/obj/machinery/photocopier, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"aY" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"aZ" = ( -/obj/structure/table/wood, -/obj/item/folder/blue, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"ba" = ( -/obj/structure/table/wood, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/item/pen/red, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"bb" = ( -/obj/structure/table/wood, -/obj/item/staff, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"bc" = ( -/obj/structure/table/wood, -/obj/item/hand_labeler, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"bd" = ( -/obj/structure/table/wood, -/obj/item/pen/invisible, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"be" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"bf" = ( -/obj/structure/table/wood, -/obj/item/pen/red, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"bg" = ( -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"bh" = ( -/obj/structure/table/wood, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/item/dice/d20, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"bi" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/mug/tea, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"bj" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"bk" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"bl" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"bm" = ( -/obj/structure/table/wood, -/obj/item/folder/blue, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"bn" = ( -/obj/machinery/light, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"bo" = ( -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"bp" = ( -/obj/machinery/door/airlock/gold, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"bq" = ( -/obj/machinery/door/airlock/gold, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"br" = ( -/turf/open/floor/plasteel, -/area/awaymission/academy/headmaster) -"bs" = ( -/turf/closed/wall/r_wall, -/area/awaymission/academy/classrooms) -"bt" = ( -/obj/machinery/door/poddoor/shutters{ - id = "AcademyAuto" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"bu" = ( -/obj/machinery/door/poddoor/shutters{ - id = "AcademyAuto" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"bv" = ( -/obj/machinery/door/poddoor/shutters{ - id = "AcademyAuto" - }, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"bw" = ( -/obj/machinery/door/poddoor/shutters{ - id = "AcademyAuto" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"bx" = ( -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/awaymission/academy/headmaster) -"by" = ( -/turf/open/floor/plasteel/chapel{ - dir = 4 - }, -/area/awaymission/academy/headmaster) -"bz" = ( -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"bA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"bB" = ( -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"bC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"bD" = ( -/obj/machinery/button/door{ - id = "AcademyAuto"; - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"bE" = ( -/turf/closed/wall, -/area/awaymission/academy/classrooms) -"bF" = ( -/turf/closed/wall/mineral/titanium, -/area/awaymission/academy/classrooms) -"bI" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/headmaster) -"bJ" = ( -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/awaymission/academy/headmaster) -"bK" = ( -/turf/open/floor/plasteel/chapel, -/area/awaymission/academy/headmaster) -"bL" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/headmaster) -"bM" = ( -/obj/machinery/light{ - 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/awaymission/academy/headmaster) -"bN" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/academy/headmaster) -"bO" = ( -/obj/structure/cable{ - 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/dark, -/area/awaymission/academy/headmaster) -"bP" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/academy/headmaster) -"bQ" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/cable{ - 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/dark, -/area/awaymission/academy/headmaster) -"bR" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/headmaster) -"bS" = ( -/obj/structure/academy_wizard_spawner, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"bT" = ( -/turf/open/floor/plasteel/showroomfloor, -/area/awaymission/academy/headmaster) -"bU" = ( -/obj/machinery/autolathe, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"bV" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"bX" = ( -/obj/effect/decal/cleanable/ash, -/turf/open/floor/engine, -/area/awaymission/academy/classrooms) -"bY" = ( -/obj/structure/target_stake, -/turf/open/floor/engine, -/area/awaymission/academy/classrooms) -"bZ" = ( -/turf/open/floor/engine, -/area/awaymission/academy/classrooms) -"ca" = ( -/obj/structure/target_stake, -/obj/item/target/alien, -/turf/open/floor/engine, -/area/awaymission/academy/classrooms) -"cb" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/plasteel, -/area/awaymission/academy/headmaster) -"cc" = ( -/obj/structure/table, -/obj/item/lighter/greyscale, -/turf/open/floor/plasteel, -/area/awaymission/academy/headmaster) -"cd" = ( -/turf/open/floor/plasteel/dark, -/area/awaymission/academy/headmaster) -"ce" = ( -/obj/structure/cable{ - 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 - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/academy/headmaster) -"cf" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/headmaster) -"cg" = ( -/obj/machinery/portable_atmospherics/canister/toxins, -/turf/open/floor/plasteel/showroomfloor, -/area/awaymission/academy/headmaster) -"ch" = ( -/obj/structure/chair/stool, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/awaymission/academy/headmaster) -"ci" = ( -/obj/structure/table, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"cj" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"ck" = ( -/obj/machinery/door/airlock/plasma, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"cl" = ( -/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/awaymission/academy/headmaster) -"cm" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/academy/headmaster) -"co" = ( -/obj/machinery/portable_atmospherics/scrubber/huge, -/turf/open/floor/plating, -/area/awaymission/academy/headmaster) -"cp" = ( -/obj/structure/chair/stool, -/turf/open/floor/plasteel/showroomfloor, -/area/awaymission/academy/headmaster) -"cq" = ( -/obj/structure/table, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/item/pen/red, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"cr" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"ct" = ( -/obj/structure/chair, -/turf/open/floor/plasteel, -/area/awaymission/academy/headmaster) -"cu" = ( -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" - }, -/area/awaymission/academy/headmaster) -"cv" = ( -/obj/machinery/door/window{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/academy/headmaster) -"cw" = ( -/turf/open/floor/plating, -/area/awaymission/academy/headmaster) -"cx" = ( -/obj/machinery/door/window{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/awaymission/academy/headmaster) -"cy" = ( -/obj/structure/table, -/turf/open/floor/plasteel/showroomfloor, -/area/awaymission/academy/headmaster) -"cz" = ( -/obj/structure/table, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/item/stack/cable_coil/random, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"cA" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"cB" = ( -/obj/item/target, -/turf/open/floor/engine, -/area/awaymission/academy/classrooms) -"cC" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"cD" = ( -/obj/structure/table, -/turf/open/floor/plasteel, -/area/awaymission/academy/headmaster) -"cE" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"cF" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/plasma, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"cG" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/academy/headmaster) -"cH" = ( -/obj/structure/sign/warning/nosmoking/circle, -/turf/closed/wall, -/area/awaymission/academy/headmaster) -"cI" = ( -/obj/structure/trap/damage, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"cJ" = ( -/obj/item/stack/sheet/iron, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"cK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"cL" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/headmaster) -"cM" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"cN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"cO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"cP" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"cQ" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"cR" = ( -/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, -/area/awaymission/academy/classrooms) -"cT" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/pump, -/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/awaymission/academy/headmaster) -"cU" = ( -/obj/structure/closet/crate/internals, -/obj/item/tank/internals/oxygen, -/obj/item/tank/internals/oxygen/red, -/turf/open/floor/plasteel/dark, -/area/awaymission/academy/headmaster) -"cV" = ( -/obj/structure/closet/crate, -/obj/item/crowbar/red, -/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/awaymission/academy/headmaster) -"cW" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/headmaster) -"cX" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"cY" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"cZ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"da" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"db" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/academy/classrooms) -"dc" = ( -/turf/open/floor/wood, -/area/awaymission/academy/classrooms) -"dd" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/wood, -/area/awaymission/academy/classrooms) -"de" = ( -/turf/open/floor/circuit/green, -/area/awaymission/academy/classrooms) -"df" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/academy/classrooms) -"dg" = ( -/obj/structure/table/wood, -/obj/item/gun/magic/wand/fireball, -/turf/open/floor/wood, -/area/awaymission/academy/classrooms) -"dh" = ( -/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/awaymission/academy/classrooms) -"di" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dj" = ( -/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, -/area/awaymission/academy/classrooms) -"dk" = ( -/obj/structure/sink/kitchen{ - pixel_y = 28 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dl" = ( -/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, -/area/awaymission/academy/classrooms) -"dm" = ( -/turf/open/floor/plasteel/white, -/area/awaymission/academy/classrooms) -"dn" = ( -/obj/machinery/gibber, -/turf/open/floor/plasteel/white, -/area/awaymission/academy/classrooms) -"do" = ( -/obj/machinery/mech_bay_recharge_port, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"dp" = ( -/turf/open/floor/mech_bay_recharge_floor, -/area/awaymission/academy/classrooms) -"dq" = ( -/obj/machinery/computer/mech_bay_power_console{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/circuit/green, -/area/awaymission/academy/classrooms) -"dr" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"ds" = ( -/obj/structure/chair/wood/normal{ - dir = 1 - }, -/turf/open/floor/wood, -/area/awaymission/academy/classrooms) -"dt" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"du" = ( -/obj/structure/chair/stool, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dv" = ( -/obj/item/seeds/eggplant/eggy, -/obj/machinery/hydroponics/constructable, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dw" = ( -/obj/machinery/hydroponics/constructable, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dx" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dy" = ( -/mob/living/simple_animal/hostile/wizard, -/turf/open/floor/plasteel, -/area/awaymission/academy/headmaster) -"dz" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/circuit/green, -/area/awaymission/academy/classrooms) -"dA" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/circuit/green, -/area/awaymission/academy/classrooms) -"dB" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dC" = ( -/turf/open/floor/grass, -/area/awaymission/academy/headmaster) -"dD" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dE" = ( -/obj/structure/closet/crate/hydroponics, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dF" = ( -/obj/machinery/door/airlock/freezer, -/turf/open/floor/plasteel/white, -/area/awaymission/academy/classrooms) -"dG" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/chem_master/condimaster, -/turf/open/floor/plasteel/white, -/area/awaymission/academy/classrooms) -"dH" = ( -/obj/machinery/mech_bay_recharge_port, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"dI" = ( -/obj/machinery/computer/mech_bay_power_console, -/obj/structure/cable, -/turf/open/floor/circuit/green, -/area/awaymission/academy/classrooms) -"dJ" = ( -/obj/machinery/hydroponics/constructable, -/obj/item/seeds/replicapod, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dK" = ( -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"dL" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dM" = ( -/obj/machinery/hydroponics/constructable, -/obj/item/seeds/tomato/blue/bluespace, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dN" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dO" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dP" = ( -/obj/machinery/door/airlock/freezer, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/awaymission/academy/classrooms) -"dQ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/awaymission/academy/classrooms) -"dR" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/white, -/area/awaymission/academy/classrooms) -"dS" = ( -/obj/structure/kitchenspike, -/turf/open/floor/plasteel/white, -/area/awaymission/academy/classrooms) -"dT" = ( -/obj/structure/mineral_door/iron, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dU" = ( -/obj/structure/mineral_door/iron, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dV" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/carpet, -/area/awaymission/academy/classrooms) -"dW" = ( -/obj/machinery/seed_extractor, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dX" = ( -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"dY" = ( -/obj/structure/closet/crate/freezer, -/turf/open/floor/plasteel/white, -/area/awaymission/academy/classrooms) -"dZ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/awaymission/academy/classrooms) -"ea" = ( -/obj/machinery/igniter/on, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"eb" = ( -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"ec" = ( -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"ed" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"ee" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"ef" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"eg" = ( -/obj/structure/noticeboard{ - pixel_y = 32 - }, -/obj/item/paper/fluff/awaymissions/academy/class/automotive, -/turf/open/floor/plasteel/grimy, -/area/awaymission/academy/classrooms) -"eh" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/grimy, -/area/awaymission/academy/classrooms) -"ei" = ( -/obj/structure/noticeboard{ - pixel_y = 32 - }, -/obj/item/paper/fluff/awaymissions/academy/class/pyromancy, -/turf/open/floor/plasteel/grimy, -/area/awaymission/academy/classrooms) -"ej" = ( -/turf/open/floor/plasteel/grimy, -/area/awaymission/academy/classrooms) -"ek" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/power/apc/unlocked{ - dir = 1; - environ = 3; - equipment = 3; - pixel_y = 23; - req_access = null - }, -/turf/open/floor/plasteel/grimy, -/area/awaymission/academy/classrooms) -"el" = ( -/turf/open/floor/carpet, -/area/awaymission/academy/classrooms) -"em" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/classrooms) -"en" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"eo" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"ep" = ( -/obj/machinery/vending/hydroseeds{ - slogan_delay = 700 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"eq" = ( -/obj/machinery/vending/hydronutrients, -/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/awaymission/academy/classrooms) -"er" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/turf/open/floor/plasteel/white, -/area/awaymission/academy/classrooms) -"es" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"et" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/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/awaymission/academy/classrooms) -"eu" = ( -/obj/singularity/academy, -/turf/open/space, -/area/space/nearstation) -"ev" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"ew" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/grimy, -/area/awaymission/academy/classrooms) -"ex" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"ey" = ( -/obj/machinery/door/airlock/freezer, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/awaymission/academy/classrooms) -"ez" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating, -/area/awaymission/academy) -"eA" = ( -/obj/machinery/door/airlock/public/glass, -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"eB" = ( -/obj/machinery/door/airlock/public/glass, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"eC" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"eD" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/awaymission/academy/classrooms) -"eE" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/awaymission/academy/classrooms) -"eF" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/awaymission/academy/classrooms) -"eG" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/academy/classrooms) -"eH" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/academy/classrooms) -"eI" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/academy/classrooms) -"eJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/academy) -"eK" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"eL" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"eM" = ( -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/awaymission/academy/classrooms) -"eN" = ( -/turf/open/floor/plasteel/chapel{ - dir = 4 - }, -/area/awaymission/academy/classrooms) -"eO" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/awaymission/academy/classrooms) -"eP" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/awaymission/academy/classrooms) -"eQ" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/awaymission/academy/classrooms) -"eR" = ( -/obj/structure/table/reinforced, -/obj/item/storage/bag/tray, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/academy/classrooms) -"eS" = ( -/obj/machinery/processor, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/academy/classrooms) -"eT" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"eU" = ( -/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/awaymission/academy/classrooms) -"eV" = ( -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/awaymission/academy/classrooms) -"eW" = ( -/turf/open/floor/plasteel/chapel, -/area/awaymission/academy/classrooms) -"eX" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/awaymission/academy/classrooms) -"eY" = ( -/obj/structure/mineral_door/wood, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"eZ" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/awaymission/academy/classrooms) -"fa" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 4 - }, -/obj/item/reagent_containers/food/snacks/burger/spell, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/academy/classrooms) -"fb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating, -/area/awaymission/academy) -"fc" = ( -/obj/structure/window/reinforced, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"fd" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/classrooms) -"fe" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/classrooms) -"ff" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/classrooms) -"fg" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/grimy, -/area/awaymission/academy/classrooms) -"fh" = ( -/obj/structure/mineral_door/wood, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"fi" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/awaymission/academy/classrooms) -"fj" = ( -/obj/structure/table, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/awaymission/academy/classrooms) -"fk" = ( -/obj/structure/table/reinforced, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/academy/classrooms) -"fl" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/academy/classrooms) -"fm" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/academy/classrooms) -"fn" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/academy/classrooms) -"fo" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"fp" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/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/awaymission/academy/classrooms) -"fq" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/awaymission/academy/classrooms) -"fr" = ( -/obj/structure/table, -/obj/item/trash/semki, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/awaymission/academy/classrooms) -"fs" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/awaymission/academy/classrooms) -"ft" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/academy/classrooms) -"fu" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"fv" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"fw" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"fx" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"fy" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/noticeboard{ - pixel_y = -32 - }, -/obj/item/paper/fluff/awaymissions/academy/class/biology, -/turf/open/floor/plasteel/grimy, -/area/awaymission/academy/classrooms) -"fz" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/grimy, -/area/awaymission/academy/classrooms) -"fA" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/grimy, -/area/awaymission/academy/classrooms) -"fB" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/classrooms) -"fC" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/awaymission/academy/classrooms) -"fD" = ( -/turf/closed/wall, -/area/awaymission/academy/academyaft) -"fE" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"fF" = ( -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"fG" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"fH" = ( -/obj/machinery/shieldwallgen, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"fI" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/awaymission/academy/classrooms) -"fJ" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/awaymission/academy/classrooms) -"fK" = ( -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/awaymission/academy/classrooms) -"fL" = ( -/obj/structure/chair, -/turf/open/floor/plasteel/white, -/area/awaymission/academy/classrooms) -"fM" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/wood, -/area/awaymission/academy/classrooms) -"fN" = ( -/turf/open/floor/plasteel/grimy, -/area/awaymission/academy/academyaft) -"fO" = ( -/obj/structure/closet/crate/trashcart, -/turf/open/floor/plasteel/grimy, -/area/awaymission/academy/academyaft) -"fP" = ( -/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/awaymission/academy/classrooms) -"fQ" = ( -/obj/structure/cable{ - icon_state = "0-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 - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/academy/classrooms) -"fR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/mob/living/simple_animal/hostile/wizard, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"fS" = ( -/obj/structure/window/reinforced, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"fT" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"fU" = ( -/obj/item/target, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"fV" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"fW" = ( -/obj/structure/target_stake, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"fX" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"fY" = ( -/mob/living/simple_animal/hostile/wizard, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"fZ" = ( -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"ga" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"gb" = ( -/obj/structure/table, -/obj/item/pen/red, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"gc" = ( -/obj/structure/table, -/obj/item/lazarus_injector, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/awaymission/academy/classrooms) -"gd" = ( -/obj/structure/chair/wood/normal, -/turf/open/floor/wood, -/area/awaymission/academy/classrooms) -"ge" = ( -/obj/item/candle/infinite, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"gf" = ( -/obj/structure/holohoop, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"gg" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"gh" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/grimy, -/area/awaymission/academy/academyaft) -"gi" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"gk" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/recharger, -/obj/structure/table/reinforced, -/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/awaymission/academy/classrooms) -"gl" = ( -/obj/structure/table/reinforced, -/obj/item/pen/red, -/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/awaymission/academy/classrooms) -"gm" = ( -/obj/structure/filingcabinet/filingcabinet, -/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/awaymission/academy/classrooms) -"gn" = ( -/obj/machinery/door/window{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"go" = ( -/obj/item/storage/box/monkeycubes, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"gp" = ( -/obj/machinery/door/window{ - dir = 4 - }, -/obj/machinery/door/window{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"gq" = ( -/obj/structure/table, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"gr" = ( -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/awaymission/academy/classrooms) -"gs" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"gt" = ( -/obj/structure/cable{ - 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 - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/academy/classrooms) -"gu" = ( -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"gv" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/awaymission/academy/classrooms) -"gx" = ( -/obj/structure/closet/athletic_mixed, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"gy" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/awaymission/academy/academyaft) -"gz" = ( -/obj/machinery/light{ - 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/awaymission/academy/classrooms) -"gA" = ( -/obj/machinery/door/window{ - dir = 4 - }, -/obj/item/ammo_casing, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"gB" = ( -/obj/machinery/light/small, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"gC" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"gD" = ( -/obj/structure/table, -/obj/item/scalpel, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"gE" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"gF" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"gG" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"gH" = ( -/obj/structure/table, -/obj/item/paper/fluff/awaymissions/academy/grade/aplus, -/obj/item/gun/ballistic/shotgun/automatic/combat, -/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/awaymission/academy/classrooms) -"gI" = ( -/obj/structure/table, -/obj/item/gun/ballistic/revolver/russian, -/obj/item/paper/fluff/awaymissions/academy/grade/bminus, -/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/awaymission/academy/classrooms) -"gJ" = ( -/obj/structure/table, -/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/awaymission/academy/classrooms) -"gK" = ( -/obj/structure/window/reinforced, -/obj/item/ammo_casing, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"gL" = ( -/mob/living/simple_animal/hostile/bear, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"gM" = ( -/obj/item/toy/beach_ball/holoball, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"gN" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"gO" = ( -/obj/structure/chair/stool, -/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/awaymission/academy/classrooms) -"gP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"gQ" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/mob/living/simple_animal/hostile/bear, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"gR" = ( -/obj/structure/mineral_door/iron, -/turf/open/floor/carpet, -/area/awaymission/academy/classrooms) -"gS" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"gT" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/gold, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/classrooms) -"gU" = ( -/obj/structure/cable{ - 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/dark, -/area/awaymission/academy/classrooms) -"gV" = ( -/obj/structure/cable{ - icon_state = "1-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/awaymission/academy/classrooms) -"gW" = ( -/obj/structure/table, -/obj/item/gun/energy/floragun, -/obj/item/paper/fluff/awaymissions/academy/grade/dminus, -/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/awaymission/academy/classrooms) -"gX" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/glass, -/obj/item/target, -/obj/item/target, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"gY" = ( -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"gZ" = ( -/obj/machinery/shieldwallgen, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"ha" = ( -/turf/open/floor/plasteel/white/side{ - dir = 2 - }, -/area/awaymission/academy/classrooms) -"hb" = ( -/obj/structure/chair/stool, -/turf/open/floor/plasteel/white/side{ - dir = 2 - }, -/area/awaymission/academy/classrooms) -"hc" = ( -/turf/closed/wall/r_wall, -/area/awaymission/academy/academyaft) -"hd" = ( -/obj/structure/mineral_door/wood, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"he" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"hf" = ( -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"hg" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"hh" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"hi" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hk" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hl" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/power/apc/unlocked{ - dir = 1; - environ = 3; - equipment = 3; - pixel_y = 23; - req_access = null - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hm" = ( -/obj/structure/grille, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"hn" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"ho" = ( -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hp" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hq" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hr" = ( -/obj/item/crowbar/red, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"ht" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hv" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hx" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"hy" = ( -/obj/machinery/power/smes/magical, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"hz" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"hA" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hB" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hC" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hD" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/maintenance_hatch, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"hE" = ( -/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, -/area/awaymission/academy/academyaft) -"hF" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hH" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hI" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"hJ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"hK" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/item/clothing/suit/caution, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hL" = ( -/obj/structure/mecha_wreckage/durand, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"hM" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hN" = ( -/obj/structure/frame/machine, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"hO" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"hQ" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hR" = ( -/obj/structure/grille, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"hS" = ( -/obj/structure/closet, -/obj/item/candle, -/obj/item/candle, -/obj/item/storage/box/matches, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hT" = ( -/obj/structure/closet, -/obj/item/storage/belt/soulstone, -/obj/item/clothing/under/costume/schoolgirl, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hU" = ( -/obj/structure/closet, -/obj/item/clothing/under/dress/skirt, -/obj/item/clothing/glasses/regular, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hV" = ( -/obj/structure/closet, -/obj/item/clothing/under/color/lightpurple, -/obj/item/clothing/shoes/sandal, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hW" = ( -/obj/structure/closet, -/obj/item/lipstick/random, -/obj/item/clothing/under/costume/schoolgirl, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hX" = ( -/turf/open/floor/wood, -/area/awaymission/academy/academyaft) -"hY" = ( -/obj/structure/closet, -/obj/item/clothing/under/color/lightpurple, -/obj/item/staff, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"hZ" = ( -/obj/structure/closet, -/obj/item/storage/wallet/random, -/obj/item/clothing/glasses/regular/hipster, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"ia" = ( -/obj/structure/closet, -/obj/item/clothing/head/wizard/fake, -/obj/item/clothing/suit/wizrobe/fake, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"ib" = ( -/obj/structure/closet, -/obj/item/reagent_containers/food/drinks/beer, -/obj/item/clothing/under/color/lightpurple, -/obj/item/poster/random_contraband, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"ic" = ( -/obj/structure/closet, -/obj/item/storage/box/snappops, -/obj/item/storage/backpack, -/obj/item/paper/fluff/awaymissions/academy/grade/failure, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"id" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"ie" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"if" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"ih" = ( -/obj/structure/rack, -/obj/item/stack/sheet/mineral/plasma{ - amount = 50 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"ii" = ( -/turf/open/floor/grass, -/area/awaymission/academy/academyaft) -"ij" = ( -/obj/structure/rack, -/obj/item/circuitboard/machine/telecomms/broadcaster, -/obj/item/circuitboard/machine/telecomms/receiver, -/obj/item/circuitboard/machine/telecomms/relay, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"ik" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"il" = ( -/turf/open/floor/plasteel/cafeteria{ - dir = 2 - }, -/area/awaymission/academy/academyaft) -"im" = ( -/obj/structure/mirror{ - pixel_y = 28 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 2 - }, -/area/awaymission/academy/academyaft) -"in" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plasteel/cafeteria{ - dir = 2 - }, -/area/awaymission/academy/academyaft) -"io" = ( -/obj/structure/rack, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/subspace/crystal, -/obj/item/stock_parts/subspace/filter, -/obj/item/stock_parts/micro_laser/high, -/obj/item/stock_parts/micro_laser/high, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"ip" = ( -/obj/machinery/power/smes/magical, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"iq" = ( -/obj/structure/rack, -/obj/item/clothing/glasses/welding, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"ir" = ( -/obj/structure/mineral_door/iron, -/turf/open/floor/plasteel/cafeteria{ - dir = 2 - }, -/area/awaymission/academy/academyaft) -"is" = ( -/obj/structure/rack, -/obj/item/stock_parts/scanning_module, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/subspace/filter, -/obj/item/stock_parts/subspace/ansible, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"it" = ( -/obj/item/stock_parts/manipulator, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"iu" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"iv" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 2 - }, -/area/awaymission/academy/academyaft) -"iw" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 2 - }, -/area/awaymission/academy/academyaft) -"ix" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/academy/academyaft) -"iy" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/wood, -/area/awaymission/academy/academyaft) -"iz" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 2 - }, -/area/awaymission/academy/academyaft) -"iA" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 2 - }, -/area/awaymission/academy/academyaft) -"iB" = ( -/obj/structure/rack, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/subspace/filter, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"iC" = ( -/mob/living/simple_animal/hostile/wizard, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"iD" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 2 - }, -/area/awaymission/academy/academyaft) -"iE" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/rack, -/obj/item/stack/sheet/iron, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"iF" = ( -/obj/machinery/power/port_gen/pacman, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"iG" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 2 - }, -/area/awaymission/academy/academyaft) -"iH" = ( -/obj/item/paper, -/turf/open/floor/wood, -/area/awaymission/academy/academyaft) -"iI" = ( -/obj/item/stack/cable_coil/random, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"iJ" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"iK" = ( -/obj/item/multitool, -/turf/open/floor/engine, -/area/awaymission/academy/academyaft) -"iL" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/engine, -/area/awaymission/academy/academyaft) -"iM" = ( -/turf/open/floor/engine, -/area/awaymission/academy/academyaft) -"iN" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/effect/decal/cleanable/vomit, -/turf/open/floor/plasteel/cafeteria{ - dir = 2 - }, -/area/awaymission/academy/academyaft) -"iO" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/wood, -/area/awaymission/academy/academyaft) -"iP" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/engine, -/area/awaymission/academy/academyaft) -"iQ" = ( -/obj/structure/shuttle/engine/heater, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"iR" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/table, -/obj/item/toy/beach_ball/holoball, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"iS" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/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/awaymission/academy/academyaft) -"iT" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"iU" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"iV" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"iW" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/airless/white{ - dir = 4 - }, -/area/awaymission/academy/academyaft) -"iX" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/table, -/obj/item/soulstone, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel/airless/white, -/area/awaymission/academy/academyaft) -"iY" = ( -/obj/structure/shuttle/engine/propulsion/left, -/turf/open/space, -/area/awaymission/academy/academyaft) -"iZ" = ( -/obj/structure/shuttle/engine/propulsion, -/turf/open/space, -/area/awaymission/academy/academyaft) -"ja" = ( -/obj/structure/shuttle/engine/propulsion/right, -/turf/open/space, -/area/awaymission/academy/academyaft) -"jb" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"jc" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"jd" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"je" = ( -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"jf" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/airless/white{ - dir = 4 - }, -/area/awaymission/academy/academyaft) -"jg" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel/airless/white, -/area/awaymission/academy/academyaft) -"jh" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"ji" = ( -/obj/structure/table, -/obj/item/clothing/glasses/meson/truesight, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"jj" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"jk" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"jl" = ( -/obj/structure/noticeboard, -/turf/closed/wall, -/area/awaymission/academy/academyaft) -"jm" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"jn" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/airless/white{ - dir = 4 - }, -/area/awaymission/academy/academyaft) -"jo" = ( -/obj/structure/table, -/obj/item/organ/brain{ - name = "The preserved brain of Harry Houdini" - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel/airless/white, -/area/awaymission/academy/academyaft) -"jp" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/item/weldingtool, -/turf/open/floor/circuit/green, -/area/awaymission/academy/classrooms) -"jq" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"jr" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"js" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/airless/white{ - dir = 4 - }, -/area/awaymission/academy/academyaft) -"jt" = ( -/obj/structure/grille, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/item/shard, -/turf/open/floor/plating/airless, -/area/awaymission/academy/academyaft) -"ju" = ( -/obj/structure/window/reinforced, -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/trophy/gold_cup, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"jv" = ( -/obj/structure/window/reinforced, -/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, -/area/awaymission/academy/academyaft) -"jw" = ( -/obj/structure/destructible/cult/pylon, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"jx" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"jy" = ( -/obj/structure/destructible/cult/pylon, -/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/awaymission/academy/academyaft) -"jz" = ( -/obj/structure/window/reinforced, -/turf/open/floor/plasteel/airless/white{ - dir = 4 - }, -/area/awaymission/academy/academyaft) -"jA" = ( -/obj/structure/table, -/obj/structure/window/reinforced, -/obj/item/batterer, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel/airless/white, -/area/awaymission/academy/academyaft) -"jB" = ( -/obj/item/shard{ - icon_state = "medium" - }, -/turf/open/space, -/area/space/nearstation) -"jC" = ( -/obj/machinery/igniter/on, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"jD" = ( -/obj/structure/window/reinforced, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"jE" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"jF" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"jG" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"jH" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"jI" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"jJ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"jK" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"jL" = ( -/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/awaymission/academy/academyaft) -"jM" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"jN" = ( -/obj/machinery/light, -/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/awaymission/academy/academyaft) -"jO" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"jP" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"jQ" = ( -/obj/machinery/door/airlock/hatch, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"jR" = ( -/obj/machinery/door/airlock/hatch, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"jS" = ( -/turf/closed/wall/r_wall, -/area/awaymission/academy/academygate) -"jT" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/grass, -/area/awaymission/academy/academygate) -"jU" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academygate) -"jV" = ( -/turf/open/floor/grass, -/area/awaymission/academy/academygate) -"jW" = ( -/turf/open/floor/carpet, -/area/awaymission/academy/academygate) -"jX" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"jY" = ( -/obj/structure/window/reinforced, -/turf/open/floor/grass, -/area/awaymission/academy/academygate) -"jZ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/window, -/turf/open/floor/carpet, -/area/awaymission/academy/academygate) -"ka" = ( -/obj/machinery/door/window, -/turf/open/floor/carpet, -/area/awaymission/academy/academygate) -"kb" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academygate) -"kc" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academygate) -"kd" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academygate) -"ke" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"kf" = ( -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"kh" = ( -/obj/machinery/power/apc/unlocked{ - dir = 1; - environ = 3; - equipment = 3; - pixel_y = 23; - req_access = null - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academygate) -"ki" = ( -/obj/item/stack/cable_coil/random, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"kj" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"kk" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"kl" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/carpet, -/area/awaymission/academy/academygate) -"km" = ( -/obj/machinery/gateway{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"kn" = ( -/obj/machinery/gateway{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"ko" = ( -/obj/machinery/gateway{ - dir = 5 - }, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"kp" = ( -/obj/machinery/gateway{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"kq" = ( -/mob/living/simple_animal/hostile/wizard, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"kr" = ( -/obj/machinery/gateway{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"ks" = ( -/obj/machinery/gateway{ - dir = 10 - }, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"kt" = ( -/obj/machinery/gateway, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"ku" = ( -/obj/machinery/gateway{ - dir = 6 - }, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"kv" = ( -/obj/machinery/light, -/turf/open/floor/carpet, -/area/awaymission/academy/academygate) -"kw" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows"; - dir = 8 - }, -/area/awaymission/academy/headmaster) -"kx" = ( -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" - }, -/area/awaymission/academy/academygate) -"ky" = ( -/obj/machinery/door/poddoor/shutters{ - id = "AcademyGate" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"kz" = ( -/mob/living/simple_animal/hostile/wizard, -/turf/open/floor/carpet, -/area/awaymission/academy/classrooms) -"kA" = ( -/mob/living/simple_animal/hostile/wizard, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/awaymission/academy/classrooms) -"kB" = ( -/obj/structure/chair, -/mob/living/simple_animal/hostile/wizard, -/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/awaymission/academy/classrooms) -"kC" = ( -/mob/living/simple_animal/hostile/wizard, -/turf/open/floor/carpet, -/area/awaymission/academy/academyaft) -"kD" = ( -/mob/living/simple_animal/hostile/wizard, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"kF" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows2"; - dir = 8 - }, -/area/awaymission/academy/headmaster) -"kG" = ( -/mob/living/simple_animal/hostile/wizard, -/turf/open/floor/plasteel/cafeteria{ - dir = 2 - }, -/area/awaymission/academy/academyaft) -"kH" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"kI" = ( -/obj/structure/cable, -/obj/machinery/gateway/centeraway{ - calibrated = 1 - }, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"kJ" = ( -/obj/structure/mecha_wreckage/honker, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"kK" = ( -/obj/structure/table, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/item/book/manual/ripley_build_and_repair, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"kL" = ( -/obj/item/bikehorn, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"kM" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/trap/chill, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"kN" = ( -/obj/structure/trap/fire, -/turf/open/floor/engine, -/area/awaymission/academy/academyaft) -"kO" = ( -/mob/living/simple_animal/hostile/retaliate/clown, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"kP" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"kQ" = ( -/mob/living/simple_animal/hostile/syndicate, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"kR" = ( -/obj/effect/rune/malformed, -/mob/living/simple_animal/hostile/skeleton, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"kS" = ( -/obj/structure/table/wood, -/obj/item/candle/infinite, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"kT" = ( -/obj/structure/table/wood, -/obj/item/kitchen/knife/ritual, -/obj/item/candle/infinite, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"kU" = ( -/obj/effect/decal/remains/human, -/obj/effect/rune/malformed, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"kV" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"kW" = ( -/obj/structure/ladder/unbreakable/rune{ - id = "academy_cellar" - }, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"kX" = ( -/obj/structure/bookcase/random, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"kY" = ( -/obj/effect/decal/cleanable/xenoblood, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"kZ" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/remains/human, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"la" = ( -/obj/structure/trap/damage, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"lb" = ( -/mob/living/simple_animal/hostile/retaliate/bat, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"lc" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/mineral/uranium, -/area/awaymission/academy/academycellar) -"ld" = ( -/turf/open/floor/mineral/uranium, -/area/awaymission/academy/academycellar) -"le" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"lf" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"lg" = ( -/obj/structure/table/wood, -/obj/item/guardiancreator, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"lh" = ( -/obj/structure/falsewall/wood, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"li" = ( -/mob/living/simple_animal/hostile/retaliate/bat, -/turf/open/floor/mineral/uranium, -/area/awaymission/academy/academycellar) -"lj" = ( -/mob/living/simple_animal/hostile/poison/giant_spider/hunter, -/turf/open/floor/engine/cult, -/area/awaymission/academy/academycellar) -"lk" = ( -/obj/structure/safe/floor, -/obj/item/voodoo, -/obj/item/gun/magic/wand/fireball, -/obj/item/clothing/suit/space/hardsuit/wizard, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"ll" = ( -/turf/closed/indestructible/riveted, -/area/awaymission/academy/academyengine) -"lm" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"ln" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/vault, -/area/awaymission/academy/academyengine) -"lo" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/vault, -/area/awaymission/academy/academyengine) -"lp" = ( -/obj/machinery/power/apc{ - dir = 1; - pixel_y = 23 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/vault, -/area/awaymission/academy/academyengine) -"lq" = ( -/turf/closed/wall/rust, -/area/awaymission/academy/academyengine) -"lr" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/vault, -/area/awaymission/academy/academyengine) -"ls" = ( -/obj/machinery/power/smes/magical, -/obj/structure/cable, -/turf/open/floor/vault, -/area/awaymission/academy/academyengine) -"lt" = ( -/turf/open/floor/vault, -/area/awaymission/academy/academyengine) -"lu" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lv" = ( -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lw" = ( -/obj/item/ectoplasm, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lx" = ( -/obj/effect/rune/malformed, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"ly" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/table, -/obj/item/staff, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lz" = ( -/obj/structure/table, -/obj/item/storage/toolbox/electrical, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lA" = ( -/obj/structure/table, -/obj/item/stack/rods, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lB" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lC" = ( -/mob/living/simple_animal/hostile/wizard, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lD" = ( -/obj/structure/table, -/obj/item/weldingtool, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lE" = ( -/obj/structure/rack, -/obj/item/stack/cable_coil, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lF" = ( -/turf/closed/indestructible/fakeglass, -/area/awaymission/academy/academyengine) -"lG" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lH" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lI" = ( -/obj/structure/ladder/unbreakable/rune{ - id = "academy_engine" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lJ" = ( -/obj/structure/mineral_door/iron, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lK" = ( -/obj/effect/immovablerod{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lL" = ( -/mob/living/simple_animal/slaughter{ - name = "engine demon" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lM" = ( -/obj/machinery/light, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lN" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lO" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lP" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lQ" = ( -/obj/structure/table, -/obj/item/gun/magic/wand/polymorph, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lR" = ( -/obj/structure/table, -/obj/item/stack/sheet/animalhide/monkey, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lS" = ( -/obj/structure/table, -/obj/item/stack/sheet/runed_metal, -/obj/item/stack/sheet/mineral/wood, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lT" = ( -/obj/structure/table, -/obj/item/stack/cable_coil, -/obj/item/stack/sheet/xenochitin, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lU" = ( -/obj/structure/closet/radiation, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lV" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"lW" = ( -/obj/structure/ladder/unbreakable/rune{ - height = 1; - id = "academy_storage" - }, -/turf/open/floor/plating, -/area/awaymission/academy/classrooms) -"lX" = ( -/obj/structure/ladder/unbreakable/rune{ - height = 1; - id = "academy_coldroom" - }, -/turf/open/floor/plasteel/white, -/area/awaymission/academy/classrooms) -"lY" = ( -/obj/structure/table/wood, -/obj/item/seeds/kudzu, -/turf/open/floor/plasteel, -/area/awaymission/academy/classrooms) -"lZ" = ( -/obj/structure/bookcase/random, -/turf/open/floor/wood, -/area/awaymission/academy/classrooms) -"ma" = ( -/obj/structure/ladder/unbreakable/rune{ - height = 1; - id = "academy_cellar" - }, -/turf/open/floor/wood, -/area/awaymission/academy/classrooms) -"mb" = ( -/obj/structure/ladder/unbreakable/rune{ - height = 1; - id = "academy_engine" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyaft) -"mc" = ( -/turf/closed/wall, -/area/awaymission/academy/academyengine) -"md" = ( -/turf/closed/wall/r_wall, -/area/awaymission/academy/academyengine) -"me" = ( -/obj/structure/constructshell, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"mf" = ( -/obj/structure/constructshell, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"mg" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/vault, -/area/awaymission/academy/academyengine) -"mh" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/vault, -/area/awaymission/academy/academyengine) -"mi" = ( -/obj/machinery/door/airlock/vault, -/turf/open/floor/vault, -/area/awaymission/academy/academyengine) -"mj" = ( -/obj/structure/rack, -/obj/item/book/granter/spell/summonitem, -/obj/item/pen/fourcolor, -/turf/open/floor/vault, -/area/awaymission/academy/academyengine) -"mk" = ( -/obj/structure/rack, -/obj/item/claymore, -/obj/item/toy/figure/wizard, -/turf/open/floor/vault, -/area/awaymission/academy/academyengine) -"ml" = ( -/mob/living/simple_animal/hostile/netherworld, -/turf/open/floor/vault, -/area/awaymission/academy/academyengine) -"mm" = ( -/obj/structure/closet/crate/coffin, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"mn" = ( -/obj/structure/rack, -/obj/item/gun/magic/wand, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"mo" = ( -/obj/structure/rack, -/obj/item/staff, -/turf/open/floor/plating, -/area/awaymission/academy/academyengine) -"mp" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyengine) -"mq" = ( -/turf/open/floor/plasteel, -/area/awaymission/academy/academyengine) -"mr" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyengine) -"ms" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/light, -/area/awaymission/academy/academyengine) -"mt" = ( -/turf/open/floor/light, -/area/awaymission/academy/academyengine) -"mu" = ( -/turf/open/floor/wood, -/area/awaymission/academy/academyengine) -"mv" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/wood, -/area/awaymission/academy/academyengine) -"mw" = ( -/obj/item/target, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyengine) -"mx" = ( -/mob/living/simple_animal/hostile/wizard, -/turf/open/floor/light, -/area/awaymission/academy/academyengine) -"my" = ( -/obj/structure/chair/wood/normal, -/turf/open/floor/wood, -/area/awaymission/academy/academyengine) -"mz" = ( -/obj/structure/table/wood/poker, -/obj/item/toy/cards/deck, -/turf/open/floor/wood, -/area/awaymission/academy/academyengine) -"mA" = ( -/obj/structure/chair/wood/normal{ - dir = 4 - }, -/turf/open/floor/wood, -/area/awaymission/academy/academyengine) -"mB" = ( -/mob/living/simple_animal/hostile/wizard, -/turf/open/floor/wood, -/area/awaymission/academy/academyengine) -"mC" = ( -/obj/structure/chair/wood/normal{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/academy/academyengine) -"mD" = ( -/turf/closed/mineral/random, -/area/awaymission/academy/academycellar) -"mE" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"mF" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"mG" = ( -/mob/living/simple_animal/hostile/skeleton, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"mH" = ( -/obj/effect/decal/remains/robot, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"mI" = ( -/mob/living/simple_animal/hostile/wizard, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyengine) -"mJ" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/bottle/gin, -/turf/open/floor/wood, -/area/awaymission/academy/academyengine) -"mK" = ( -/obj/machinery/vending/magivend, -/turf/open/floor/wood, -/area/awaymission/academy/academyengine) -"mL" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/drinkingglass, -/turf/open/floor/wood, -/area/awaymission/academy/academyengine) -"mM" = ( -/obj/structure/chair/wood/normal{ - dir = 1 - }, -/turf/open/floor/wood, -/area/awaymission/academy/academyengine) -"mN" = ( -/turf/open/floor/plating/asteroid/snow, -/area/awaymission/academy/academycellar) -"mO" = ( -/obj/structure/reagent_dispensers/beerkeg, -/turf/open/floor/plating/asteroid/snow, -/area/awaymission/academy/academycellar) -"mP" = ( -/obj/effect/decal/remains/human, -/turf/open/floor/plating, -/area/awaymission/academy/academygate) -"mQ" = ( -/obj/structure/ladder/unbreakable/rune{ - id = "academy_storage" - }, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyengine) -"mR" = ( -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/awaymission/academy/academyengine) -"mS" = ( -/obj/structure/ladder/unbreakable/rune{ - id = "academy_coldroom" - }, -/turf/open/floor/plating/asteroid/snow, -/area/awaymission/academy/academycellar) -"mT" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating/asteroid/snow, -/area/awaymission/academy/academycellar) -"mU" = ( -/obj/item/reagent_containers/food/snacks/meat/slab, -/turf/open/floor/plating/asteroid/snow, -/area/awaymission/academy/academycellar) -"mV" = ( -/obj/item/clothing/gloves/combat, -/turf/open/floor/plating/asteroid/snow, -/area/awaymission/academy/academycellar) -"mW" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows"; - dir = 4 - }, -/area/awaymission/academy/headmaster) -"mX" = ( -/obj/item/clothing/under/syndicate, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating/asteroid/snow, -/area/awaymission/academy/academycellar) -"mY" = ( -/turf/closed/mineral/random, -/area/space/nearstation) -"mZ" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows"; - dir = 1 - }, -/area/awaymission/academy/headmaster) -"na" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows2"; - dir = 1 - }, -/area/awaymission/academy/headmaster) -"nb" = ( -/obj/structure/chair/wood/wings{ - dir = 8 - }, -/obj/machinery/button/door{ - id = "AcademyGate"; - name = "Skeleton Storage Control"; - pixel_y = -24 - }, -/turf/open/floor/wood, -/area/awaymission/academy/headmaster) -"nc" = ( -/turf/closed/indestructible/fakeglass, -/area/awaymission/academy/headmaster) -"nd" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows"; - dir = 1 - }, -/area/awaymission/academy/academyengine) -"ne" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows2"; - dir = 1 - }, -/area/awaymission/academy/academyengine) -"nf" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows2"; - dir = 6 - }, -/area/awaymission/academy/headmaster) -"ng" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows"; - dir = 8 - }, -/area/awaymission/academy/academyengine) -"nh" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows2"; - dir = 8 - }, -/area/awaymission/academy/academyengine) -"ni" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows"; - dir = 4 - }, -/area/awaymission/academy/academyengine) -"nj" = ( -/obj/structure/rack, -/obj/item/reagent_containers/food/drinks/bottle/wine, -/turf/open/floor/plating/asteroid/snow, -/area/awaymission/academy/academycellar) -"nk" = ( -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating/asteroid/snow, -/area/awaymission/academy/academycellar) -"nl" = ( -/obj/item/clothing/mask/gas/syndicate, -/turf/open/floor/plating/asteroid/snow, -/area/awaymission/academy/academycellar) -"nm" = ( -/mob/living/simple_animal/hostile/bear, -/turf/open/floor/plating/asteroid/snow, -/area/awaymission/academy/academycellar) -"nn" = ( -/obj/structure/frame/computer{ - anchored = 1; - dir = 4 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"no" = ( -/obj/structure/frame/computer{ - anchored = 1; - dir = 8 - }, -/turf/open/floor/carpet, -/area/awaymission/academy/headmaster) -"LW" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) -"Tk" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/academy/academyaft) - -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -aG -aG -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 -aG -aG -aG -aG -aG -aG -aG -aG -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 -aG -aG -mD -mD -mD -mD -mD -mD -mD -aG -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 -aG -mD -mD -mN -mN -nj -nj -nj -mD -mD -aG -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 -aG -mD -mN -mN -mN -mN -mN -mU -mN -mD -aG -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 -aG -mD -mN -mS -mN -mT -mN -mN -mN -mD -mD -aG -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 -aG -mD -mN -mN -mN -mU -mN -mN -mN -mN -mD -aG -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 -aG -aG -mD -mN -mN -mU -mN -mU -mT -mN -mN -mD -aG -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 -aG -mD -mD -mN -mN -mN -mU -mN -mN -mN -mN -mD -mD -aG -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 -aG -mD -mN -mN -mT -mN -mN -mN -mN -mU -mN -mN -mD -aG -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 -aG -mD -mN -mN -mN -mN -mN -mN -mN -mN -mN -mN -mD -aG -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 -aG -mD -mO -mO -mO -mN -mN -mD -mD -mN -mN -mN -mD -aG -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 -aG -mD -mO -mO -mO -mD -mD -mD -mD -mN -mN -mN -mD -aG -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 -aG -mD -mD -mD -mD -mD -mD -mD -mD -mN -mN -mD -mD -aG -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 -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -mD -mD -mD -mN -mN -mN -mN -mN -mD -mY -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 -aG -aG -mD -mD -mN -mN -mN -nm -mN -mN -mD -aG -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 -aG -aG -aG -mD -mV -nk -mN -mN -mU -mT -mD -aG -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 -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -mD -mX -nl -mN -mN -mN -mN -mD -aG -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 -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aS -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -mD -mD -mN -nm -mN -nm -mN -mD -aG -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 -aS -aS -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aS -aS -aS -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -mD -mN -mN -mN -mN -mD -mD -aG -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 -aS -aS -aS -aS -aS -aa -aa -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aS -aS -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -mD -mD -mD -mD -mD -mD -aG -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 -aS -aS -aS -aS -aS -aa -aa -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -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 -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aS -aS -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aS -aS -aa -aa -aa -aa -aa -aS -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aS -aS -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aS -aS -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aS -aS -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aS -aS -aS -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aS -aS -aS -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aS -aS -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aS -aS -aa -aa -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -aS -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aS -aS -aS -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -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 -ez -eJ -eJ -fb -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bs -bs -bs -eA -bs -bs -eA -bs -bs -bs -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bs -bs -bs -bs -bs -bs -bs -bs -bs -bs -bs -bs -bs -bs -ea -es -bB -bB -bB -bB -es -ea -bs -bs -bs -bs -bs -bs -bs -bs -bs -hc -hc -hc -hc -hc -hc -hc -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bs -bs -bU -ci -cq -cz -kK -cM -cX -de -do -jp -dH -de -bs -ea -es -bB -bB -bB -bB -es -ea -bs -bB -fX -go -gu -gC -bB -gQ -bB -hc -hf -hf -hf -hf -hf -hf -hf -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bt -bz -bz -bz -bV -bz -bz -bz -cY -de -dp -dz -dp -de -bs -bs -bs -eB -es -es -eB -bs -bs -bs -bB -bB -bB -gu -gC -gL -bB -bB -hc -hg -hy -hO -hy -hO -ip -hf -ho -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bu -bA -bB -bB -bB -kJ -kL -cN -cZ -de -dq -dA -dI -de -bE -eb -et -bz -eK -eT -bz -fo -fu -bs -bB -bB -bB -gu -gC -bB -bB -gL -hc -hh -hz -hf -hz -hf -hz -hf -ho -ho -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bv -bB -bB -cj -bB -bB -bB -bB -cZ -bV -bV -cY -bV -bz -bE -ec -eu -eC -kq -eT -fc -eu -fv -bs -fG -fZ -gp -fZ -fZ -gp -fZ -gY -hc -hh -hh -hf -hh -hf -hh -hf -iI -ho -ho -hc -hc -hc -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bv -bB -bB -hL -bB -lW -cJ -bB -cZ -bV -bz -cY -bz -bV -bE -ed -ev -bz -eK -eT -bz -fp -fw -bE -fH -ga -ga -ga -ga -ga -ga -gZ -hc -hi -hA -ik -if -ik -hM -kD -ho -mb -ho -hc -iK -kN -iQ -iY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bw -bC -bB -bB -bB -bB -bB -cO -cZ -bz -bz -cY -bz -bz -dT -ee -ee -bz -eL -eU -bz -ee -ee -dT -fI -bz -bz -bz -bz -bz -bz -ha -hc -hv -ho -ho -iI -ho -ho -ho -ho -ho -ho -hc -iL -kN -iQ -iZ -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bt -bz -bV -bz -bz -bz -bz -bz -da -cM -cM -dB -cM -cM -dU -ef -ef -ef -ef -ef -ef -ef -fx -dU -fJ -bz -gq -du -gD -du -gq -hb -hc -hk -hB -ho -ho -ho -ho -ho -ho -ho -ho -iJ -iM -kN -iQ -iZ -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bs -bD -bz -bz -cr -bz -bV -bV -bz -bz -dr -bz -bz -bz -bE -eg -ej -ej -ej -ej -ej -ej -fy -bE -fK -bz -bz -bz -bz -bz -bz -ha -hc -hl -hC -hQ -ih -ih -iq -iu -hQ -iF -ho -hc -iM -kN -iQ -ja -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bs -bE -bE -bE -bE -bE -bE -bE -bE -bE -bE -bE -bE -bE -bE -eh -ej -el -el -el -el -ej -fg -bE -fK -gb -bz -bz -gq -du -gq -hb -hc -hc -LW -hc -hc -hc -hc -hc -hc -hc -hc -hc -hc -hc -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bs -bF -bF -bF -bF -cA -cA -cP -db -dc -dc -dc -dc -dc -bE -ei -ej -el -eM -eV -el -ej -fg -bE -fL -gc -gr -gv -gr -gr -gr -dm -hc -hm -hE -hR -hc -ac -aa -aa -aa -aa -aP -aa -aP -aP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bs -bF -bX -bZ -bZ -cB -cK -cQ -dc -dc -dc -dc -dc -dc -dV -ej -ej -el -eN -eW -el -ej -fg -bE -bE -bE -bE -bE -bE -bE -bE -bE -hc -hc -Tk -hc -hc -hc -hc -hc -hc -hc -hc -hc -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aP -bs -bF -bY -bZ -bZ -bZ -cK -fY -dc -df -ds -dc -dc -dc -dV -ej -ej -el -el -kz -el -ej -fg -bE -fM -dc -dc -db -dc -dc -dc -ma -fD -hn -hF -hn -fD -il -il -iv -il -iv -il -iv -il -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aP -aP -bs -bF -bZ -bZ -bZ -bZ -cK -cQ -dc -dc -dc -dc -dc -dc -bE -ej -ej -el -eM -eV -el -ej -fz -es -dc -gd -df -ds -gd -df -ds -dc -fD -ho -hv -hS -fD -il -il -il -il -il -il -il -il -hc -hc -jb -hc -jb -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aP -aP -aa -bs -bF -bZ -bX -bZ -bZ -cK -cQ -dc -df -ds -df -ds -dc -bE -ej -ej -el -eN -eW -el -ej -ej -es -dc -dc -dc -dc -dc -dc -dc -dc -fD -ho -hv -hT -fD -il -il -il -il -il -il -kG -il -fD -iR -hv -ji -hv -ju -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aP -ab -aP -aP -bs -bF -ca -bZ -bZ -bZ -fR -cQ -dc -dc -dc -dc -dc -dc -bE -ej -ej -el -el -el -el -ej -ej -es -dc -lZ -dc -lZ -dc -lZ -dc -dc -fD -hp -hv -hU -fD -im -il -iw -il -il -il -iw -il -fD -iS -jc -jj -kH -jv -jC -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aP -aP -aP -aa -aa -bs -bF -bZ -bZ -bZ -bZ -cK -cQ -dc -dg -ds -df -ds -dc -bE -ek -ew -em -eO -eX -em -ew -fA -es -dc -lZ -dc -lZ -dc -lZ -dc -dc -fD -ho -hv -hV -fD -il -il -fD -ir -fD -ir -fD -ir -fD -iT -jd -jd -jd -jd -jd -jE -hc -hc -hc -hc -aa -aa -aa -aa -aa -aa -aa -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 -ab -mZ -na -na -na -na -na -nc -ab -aP -aP -aP -aP -aP -aP -aa -aP -aa -aa -bs -bF -bF -bF -bF -cC -cC -cR -dd -dc -dc -dc -dc -dc -bE -ej -ej -el -eN -eW -el -ej -fg -bE -dc -dc -dc -dc -dc -dc -dc -dc -fD -ho -hv -hW -fD -in -il -fD -iG -fD -iG -fD -iN -fD -gh -fN -fN -fN -fN -fN -fN -fN -fN -fN -jP -aa -aa -aa -aa -aa -jS -jS -jS -jS -jS -jS -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 -ab -ab -ak -ar -nn -aC -nn -aM -aN -ab -ab -ab -ab -nf -ab -ab -nf -ab -ab -ab -ab -as -as -as -as -as -as -as -as -as -as -as -as -as -as -eh -ej -el -el -el -el -ej -fg -bE -bE -gg -gs -gs -gE -bE -gR -bE -fD -hq -hH -fD -fD -fD -ir -fD -fD -fD -fD -fD -fD -fD -iU -fE -jk -fE -fE -fE -jF -jI -fN -jL -hc -jS -aa -aa -aa -jS -jS -jW -jW -jW -jW -jS -jS -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 -ab -ab -ah -ah -ah -ax -ah -ax -ah -ah -ah -ab -aT -aF -aF -aX -bd -aF -aF -as -br -br -bI -br -br -br -br -br -bI -br -br -aF -aF -aF -aF -as -ej -ej -el -eM -eV -el -ej -fg -fD -fN -gh -fN -fN -gh -fN -fF -fN -fD -fF -gF -hX -hX -hX -hX -ix -hX -hX -iH -hX -hX -fD -gF -fF -fD -fF -fF -jD -eu -jJ -fN -jM -hc -jS -jX -jX -jX -jS -jW -jW -kf -kf -jW -kv -jS -jS -jS -jS -jS -jS -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 -ac -aa -aa -aa -aa -aa -kw -ad -ah -ah -ah -ah -aD -ah -ah -ah -ah -ab -aF -aF -ah -ah -ah -ah -bn -as -br -bx -bJ -cb -br -ct -cD -cL -bx -bJ -br -aF -dC -dC -dC -as -ej -ej -el -eN -eW -fd -ew -fB -fE -fE -gi -fF -fF -gF -fF -fF -fF -fD -kC -gF -hX -ii -ii -ii -ii -ii -ii -ii -ii -hX -fD -gF -fF -fD -jq -jw -fF -jG -gF -fN -fN -hc -jT -jV -jV -jY -jW -jW -ki -kf -kf -kf -jW -kx -jS -mE -kf -kf -jS -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 -kF -ae -ai -ah -as -as -as -as -as -ah -ah -ab -aF -aF -ah -ah -be -ah -aF -as -br -by -bK -cc -br -ct -cD -br -by -bK -br -aF -dC -dC -dC -as -ej -ej -el -kz -el -fe -ej -el -fF -fF -fF -fF -fF -gG -fE -gS -fE -hd -fE -hI -hX -hX -hX -hX -hX -hX -hX -hX -hX -iO -hd -hI -fF -jl -kD -jx -fF -fF -gG -fE -fE -jQ -jU -jU -jU -jZ -kb -ke -kj -km -kp -ks -kf -kf -ky -kf -mG -mF -jS -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 -kF -af -ah -ah -as -ay -aE -aJ -as -ah -ah -aQ -cI -ah -ah -aY -bf -ah -aF -as -br -br -br -br -br -dy -br -br -br -br -br -aF -aF -aF -aF -as -ej -ej -el -eM -eV -fe -ej -ej -fD -fN -fN -fN -fN -fN -fN -gh -fN -fD -fF -hJ -fE -fE -fE -fE -fE -fE -fE -fE -fE -gi -fD -gF -fF -fD -ho -jx -fF -fF -fF -fF -fF -hc -jV -jV -jV -jY -kc -jW -kf -kn -kI -kt -kf -kf -ky -mF -kf -mG -jS -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 -kF -ae -ah -al -at -az -aF -nb -as -aO -ah -ab -aF -aF -aV -aZ -bg -ah -ah -bp -ah -ah -ah -ah -ah -ah -ah -ah -iC -ah -ah -ah -ah -ah -ah -ah -el -ej -el -eN -eW -fe -ej -ej -fD -fN -fN -fN -fN -fN -fN -gh -fN -fD -fF -gF -fF -fF -kC -fF -fF -fF -fF -fF -fF -fF -fD -gF -fF -fD -ho -jx -fF -fF -fF -fF -fF -hc -jV -jV -jV -jY -kc -jW -kf -ko -kr -ku -kf -kf -ky -kf -mP -kf -jS -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 -kF -ae -ah -am -as -aA -aF -bS -as -ah -ah -ab -aF -aU -ap -ba -bh -bk -ap -bq -ap -ap -ap -ap -ap -ap -cE -ap -ap -ap -ap -ap -ap -ap -ap -ap -em -ew -em -em -em -ff -ej -el -fF -fF -fF -fF -fF -fF -fF -gF -fF -he -fF -gF -hX -hX -hX -hX -hX -hX -hX -hX -hX -hX -he -gF -kC -jl -ho -jx -fF -fF -fF -fF -fF -jR -jW -jW -jW -ka -kc -kf -kf -kf -kf -kf -kf -kf -ky -mG -mF -mG -jS -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 -kF -ag -ai -an -as -aB -lk -lm -as -al -ap -aR -ap -av -ah -bb -bi -bl -aF -as -br -br -br -br -ah -cu -an -br -br -br -br -aF -aF -aF -aF -as -ej -ej -el -eM -eV -fe -ej -el -fF -fF -fF -fF -fF -fF -fF -gF -fF -fD -fF -gF -hX -ii -ii -ii -ii -ii -ii -ii -ii -hX -fD -gF -fF -fD -jr -jy -fF -jH -fF -fN -fN -hc -jT -jV -jV -jY -kd -jU -kk -kf -kf -kf -jW -kx -jS -mH -kf -kf -jS -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 -kF -ae -ah -an -as -as -as -as -as -an -ah -ab -aF -aF -ah -ah -ah -ah -aF -as -br -bx -bJ -dy -ah -ah -an -dy -bx -bJ -br -aF -dC -dC -dC -as -ej -ej -el -eN -eW -fe -ej -ej -fD -fO -fN -fN -gy -fN -fN -gF -fN -fD -fF -gF -hX -hX -hX -hX -iy -hX -hX -hX -hX -hX -fD -gF -fF -fD -fF -fF -jD -eu -jK -fN -jN -hc -jS -jX -jX -jX -jS -kh -kl -kf -kf -jW -kv -jS -jS -jS -jS -jS -jS -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 -mW -ah -ah -ao -au -ap -aH -ap -ap -av -ah -ab -aF -aF -ah -ah -ah -ah -bn -as -br -by -bK -br -ah -cu -an -br -by -bK -br -aF -dC -dC -dC -as -ej -ej -el -el -el -fe -ej -ej -bE -bE -bE -bE -bE -bE -bE -gT -bE -fD -hn -hF -fD -fD -fD -ir -fD -fD -fD -fD -fD -fD -fD -gF -fF -jm -fF -fF -fF -jG -fF -fN -jO -hc -jS -aa -aa -aa -jS -jS -jW -jW -jW -jW -jS -jS -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 -ab -ab -aj -ap -av -ax -ah -ax -ah -ah -ah -ab -as -aF -aW -bc -bj -bm -bo -as -br -br -bL -br -ah -ah -an -br -bL -br -br -aF -aF -aF -aF -as -ej -ej -ej -eP -ej -fg -ej -ej -bE -fP -fP -fP -gz -fP -fP -gU -fP -fD -ho -hv -hY -fD -il -il -fD -iD -fD -iD -fD -iD -fD -gh -fN -fN -fN -fN -fN -fN -fN -fN -fN -jP -aa -aa -aa -aa -aa -jS -jS -jS -jS -jS -jS -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 -ab -ab -aq -aw -no -aI -no -ak -af -ab -ab -ab -ab -nf -ab -ab -nf -ab -ab -ab -ab -as -ab -ck -ab -cF -ab -as -as -as -as -as -as -as -as -bE -bE -bE -bE -eY -fh -bE -bE -bE -fQ -gk -gt -gt -gt -gt -gV -fP -fD -ho -hv -hZ -fD -il -il -fD -ir -fD -ir -fD -ir -fD -iV -je -je -je -je -je -jE -hc -hc -hc -hc -aa -aa -aa -aa -aa -aa -aa -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 -ab -mZ -na -na -na -na -na -nc -ab -aP -aP -aP -aP -aP -aP -aa -aP -aa -aa -ab -bM -cd -cl -cd -bO -cd -cT -as -dh -dt -dt -dt -dt -dt -en -bE -eD -eD -eD -fi -eD -eD -bE -kB -gl -fP -fP -gH -gO -gJ -gO -fD -hp -hv -ia -fD -im -il -iz -il -il -il -iz -il -fD -iW -jf -jn -js -jz -jC -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aP -aP -aP -aa -aa -ab -bN -ce -cm -ce -cG -cl -cd -as -di -du -bz -du -bz -du -eo -bE -eD -eD -eD -fi -fq -eD -bE -fP -gm -fP -fP -gI -gO -gJ -gO -fD -ho -hv -ib -fD -il -il -il -il -il -il -il -il -fD -iX -jg -jo -jg -jA -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aP -ab -aP -aP -ab -bO -cd -cl -cd -cl -cd -cl -as -dj -dv -bz -dw -bz -dw -eo -bE -eD -eD -eD -fi -fr -eD -bE -fP -fP -fP -fP -gJ -gO -gW -gO -fD -ho -hv -ic -fD -il -il -il -il -il -il -kG -il -hc -hc -jh -hc -jt -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aP -aP -aa -ab -bP -as -as -cv -cH -cl -cU -as -dk -bz -bz -bz -bz -bz -eo -bE -eE -eQ -eZ -fi -fs -eD -bE -cA -cA -cA -cA -cA -cA -cA -cA -fD -hr -hK -hq -fD -il -il -iA -il -iA -il -iA -il -hc -aa -aa -aa -aa -jB -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aP -aP -ab -bQ -as -co -cw -as -cd -cV -as -di -du -bz -du -bz -bz -eo -bE -eF -eD -eD -fi -eD -fC -bE -fS -bz -fS -bz -gK -bz -gX -bs -hc -hc -hD -hc -hc -hc -hc -hc -hc -hc -hc -hc -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aP -ab -bR -cf -cf -cx -cf -cf -cW -as -di -dw -bz -dJ -bz -dW -eo -bE -eD -kA -eE -fj -eZ -eD -bE -fT -gn -fT -gA -fT -gP -bs -bs -hc -hm -kM -hR -hc -aa -aa -aa -aa -aa -aP -aa -aP -aP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -bT -bT -bT -bT -bT -cg -bT -as -di -bz -bz -bz -bz -bz -bz -ex -eD -eD -eD -fi -eD -eD -bE -fU -bz -bz -bz -fW -bs -bs -aP -hc -hc -hD -hc -hc -hc -hc -hc -hc -hc -hc -hc -hc -hc -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -bT -cg -bT -bT -bT -bT -bT -as -dj -bz -dD -lY -dM -bz -bz -ex -eD -eD -eD -fi -kA -eD -bE -fV -bz -bz -gB -bs -bs -aP -aa -hc -ho -hv -id -ij -io -is -iB -iE -ho -ho -hc -iM -kN -iQ -iY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ch -cp -cy -cp -ch -ab -ab -di -bz -dE -dL -dN -dX -ep -bE -eD -eD -eD -fi -eD -eD -bE -bz -bz -fW -bs -bs -aP -aa -aa -hc -ht -hM -ie -ho -ho -it -ho -ho -ho -ho -iJ -iM -kN -iQ -iZ -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -bs -dl -dx -dx -dx -dO -dx -eq -bE -eG -eR -eG -fk -eG -eG -bE -bz -bz -bs -bs -aP -aa -aa -aa -hc -hv -ho -ho -ho -kD -ho -kD -ho -ho -ho -hc -iL -kN -iQ -iZ -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bs -bE -bE -dF -bE -dP -bE -bE -bE -eH -eH -eH -fl -eH -eH -bE -fW -bs -bs -aP -aa -aa -aa -aa -hc -hv -ho -ho -ho -ho -ho -ho -ho -ho -ho -hc -iP -kN -iQ -ja -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bs -lX -dm -dm -dm -dQ -dY -dY -bE -eH -eH -eH -fl -eH -eH -bE -bs -bs -aP -aa -aa -aa -aa -aa -hc -hh -hf -hf -hf -hf -hf -hf -ho -ho -iI -hc -hc -hc -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bs -dm -dm -dm -dm -dR -dZ -dZ -ey -eI -eI -eI -fm -eH -eH -bs -bs -aP -aa -aa -aa -aa -aa -aa -hc -hx -hf -hf -hf -hf -hf -hf -ho -ho -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bs -dn -dm -dm -dm -dm -dm -dm -bE -eH -eS -fa -fn -ft -bs -bs -aP -aP -aP -aP -aP -aP -aP -aP -hc -hf -hN -hf -hN -hf -hN -hf -ho -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -aa -bs -bs -dm -dG -dm -dS -dS -er -bs -bs -bs -bs -bs -bs -bs -aP -aa -aa -aa -aa -aa -aa -aa -aa -hc -hf -hf -hf -hf -hf -hf -hf -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -bs -bs -bs -bs -bs -bs -bs -bs -bs -aP -aP -aP -aP -aP -aP -aP -aP -aP -aP -aP -aP -aP -aP -hc -hc -hc -hc -hc -hc -hc -hc -hc -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -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 -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -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 -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -mc -mc -mc -mc -mc -mc -mc -mc -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(94,1,1) = {" -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -mc -mc -mc -mc -mc -mc -mc -mc -mc -mq -mq -mq -mw -mw -mw -mc -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(95,1,1) = {" -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -mc -me -me -me -lv -mm -mm -mm -mc -mr -mq -mq -mq -mQ -mq -mc -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(96,1,1) = {" -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -mc -mf -me -me -lv -mm -mm -mm -mc -mq -mq -mq -mq -mq -mq -mc -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(97,1,1) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aL -aL -aL -aL -aL -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -mc -lv -lv -lv -lv -lv -lv -lM -mc -mw -mq -mq -mq -mq -mq -mc -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(98,1,1) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aL -la -lg -la -aL -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -mc -lv -lv -lv -lv -mn -mo -mo -mc -mw -mq -mq -mq -mq -mR -mc -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(99,1,1) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aL -aL -aL -aL -aL -aL -aL -la -la -la -aL -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -mc -lv -lv -lB -lv -mn -mo -mo -mc -mw -mq -mq -mI -mq -mq -mc -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(100,1,1) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aL -dK -dK -dK -dK -aK -aL -dK -dK -dK -aL -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -mc -lu -lv -lv -lv -mc -mc -mc -mc -mq -mq -mq -mq -mq -mq -mc -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(101,1,1) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aL -dK -kR -dK -dK -kX -aL -aL -lh -aL -aL -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -mc -lv -lv -lv -lv -mc -mp -mq -mq -mq -mq -mq -mq -mq -mq -mc -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(102,1,1) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aL -dK -kS -dK -dK -kX -aL -lc -lb -ld -aL -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -mc -lv -lv -lv -lv -mc -mq -mc -mc -mc -mc -mc -mc -mc -mc -mc -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(103,1,1) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aL -dK -dK -dK -dK -kX -aL -lb -ld -dK -aL -aG -aG -aG -aG -aG -lq -lq -lq -lq -lq -lq -lq -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -mc -lv -lv -lC -lv -mc -mq -mc -mc -mc -mc -mc -mc -mc -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(104,1,1) = {" -aG -aG -aG -aG -aL -aL -aL -aL -aG -aG -aG -aL -dK -kU -dK -dK -kX -aL -ld -dK -li -aL -aG -aG -aG -aG -aG -lq -lv -lv -lI -lv -lv -lq -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -mc -lu -lv -lv -lv -lJ -mq -mc -mt -mt -mt -mu -mK -mc -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(105,1,1) = {" -aG -aG -aG -aL -aL -gx -gx -aL -aL -aG -aG -aL -dK -kT -dK -dK -kX -aL -dK -li -dK -aL -aG -aG -aG -aG -aG -lq -lu -lv -lv -lv -lv -lq -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -md -md -mi -md -md -mc -mq -mc -ms -mt -mt -mu -mJ -mc -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(106,1,1) = {" -aG -aG -aL -aL -dK -dK -dK -dK -aL -aL -aG -aL -aL -aL -gN -aL -aL -aL -ld -lb -ld -aL -aG -aG -aG -aG -aG -lq -lv -lB -lv -lv -lM -lq -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -md -mg -lt -lt -lt -md -mq -mc -mt -mt -mx -mu -mL -mc -aG -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(107,1,1) = {" -aG -aG -aL -dK -dK -dK -dK -dK -dK -aL -aL -aG -aG -aL -dK -aL -aG -aL -lb -ld -dK -aL -aG -aG -aG -aG -aG -lq -lv -lv -lv -lv -lv -lq -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -md -lt -mj -mk -ml -md -mr -mc -mu -mu -mu -mu -mu -ng -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(108,1,1) = {" -aG -aG -aL -dK -dK -dK -dK -dK -dK -dK -aL -aL -aG -aL -dK -aL -aG -aL -aL -aL -lh -aL -aG -aG -aG -aG -aG -lq -lv -lv -lv -lB -lR -lq -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -md -mh -lt -lt -lt -md -mq -mc -mu -mu -mu -mA -mu -nh -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(109,1,1) = {" -aG -aG -aL -ge -dK -dK -ge -dK -dK -dK -ge -aL -aL -ge -dK -ge -aL -aL -le -le -le -aL -aG -aG -aG -aG -aG -lq -lw -lv -lv -lv -lQ -lq -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -md -md -md -md -md -md -mq -mc -mu -mu -my -mz -mM -nh -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(110,1,1) = {" -aG -aG -aL -gf -dK -dK -dK -gM -dK -dK -dK -gN -dK -dK -kW -dK -dK -gN -dK -dK -le -aL -aG -aG -aG -aG -aG -lq -lx -lC -lv -lv -lT -lq -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -mc -mq -lJ -mu -mu -mu -mC -mu -nh -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(111,1,1) = {" -aG -aG -aL -ge -dK -dK -ge -dK -dK -dK -ge -aL -aL -ge -dK -ge -aL -aL -dK -lj -dK -aL -aG -aG -aG -aG -aG -lq -lv -lw -lv -lv -lS -lq -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -mc -mc -mc -mu -mu -mu -mB -mu -nh -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(112,1,1) = {" -aG -aG -aL -dK -dK -dK -dK -dK -dK -dK -aL -aL -aG -aL -dK -aL -aG -aL -lf -dK -lj -aL -aG -aG -aG -aG -aG -lq -lu -lv -lv -lv -lv -lq -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -mc -mv -mu -mu -mu -mu -ni -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(113,1,1) = {" -aG -aG -aL -dK -dK -dK -dK -dK -dK -aL -aL -aG -aG -aL -dK -aL -aG -aL -aL -aL -aL -aL -aG -aG -aG -aG -aG -lq -lv -lv -lv -lB -lM -lq -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -mc -mc -mc -mc -mc -mc -mc -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(114,1,1) = {" -aG -aG -aL -aL -dK -dK -dK -dK -aL -aL -aG -aL -aL -aL -gN -aL -aL -aL -aG -aG -aG -aG -aG -aG -aG -aG -aG -lq -lz -lv -lv -lv -lv -lq -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(115,1,1) = {" -aG -aG -aG -aL -aL -dK -dK -aL -aL -aG -aG -aL -kO -kV -dK -kV -kY -aL -aG -aG -aG -aG -aG -aG -aG -aG -aG -lq -ly -lv -lv -lv -lU -lq -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(116,1,1) = {" -aG -aG -aG -aG -aL -aL -aL -aL -aG -aG -aG -aL -aL -aL -dK -aL -aL -aL -aG -aG -aG -aG -aG -aG -aG -aG -aG -lq -lA -lD -lv -lv -lV -lq -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(117,1,1) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aL -aL -aL -dK -aL -aL -aL -aG -aG -aG -aG -aG -aG -aG -aG -aG -lq -lq -lq -lJ -lq -lq -lq -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(118,1,1) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aL -kP -kV -dK -kV -dK -aL -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -lq -lE -lv -lN -lq -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(119,1,1) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aL -aL -aL -dK -aL -aL -aL -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -lq -lu -lv -lM -lq -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -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) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aL -aL -aL -dK -aL -aL -aL -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -lq -lB -lv -lv -lq -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -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) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aL -kQ -kV -dK -kV -kZ -aL -aG -aG -aG -aG -aG -aG -aG -ll -ll -ll -ll -nd -ne -lF -ll -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aL -aL -aL -ge -aL -aL -aL -aG -aG -aG -aG -aG -aG -aG -ll -lo -ls -ll -lH -lv -lP -ll -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aL -aL -aL -aL -aL -aL -aL -aG -aG -aG -aG -aG -aG -aG -ll -ln -lr -ll -lG -lK -lO -ll -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -ll -lp -lt -ll -lv -lL -lv -ll -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -ll -ll -ll -ll -ll -ll -ll -ll -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index bc92db9d4053e..c233da248d9d8 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -916,7 +916,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/structure/piano{ +/obj/structure/musician/piano{ desc = "Very theatrical."; icon_state = "piano"; name = "theatre piano" @@ -1558,7 +1558,7 @@ /area/awaymission/cabin/snowforest) "eA" = ( /obj/structure/table/wood, -/obj/item/twohanded/required/chainsaw, +/obj/item/chainsaw, /turf/open/floor/wood/cold, /area/awaymission/cabin/lumbermill) "eB" = ( @@ -2455,6 +2455,7 @@ "gt" = ( /obj/structure/sign/poster/contraband/pwr_game{ pixel_x = 32; + }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine, @@ -3137,7 +3138,7 @@ 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); + armor = list("melee" = 11, "bullet" = 2, "laser" = 1, "energy" = 1, "bomb" = 5, "bio" = 2, "rad" = 0, "fire" = 0, "acid" = 10, "stamina" = 6); desc = "A classic metal helmet. The cold has made it unreliable though."; name = "old medieval helmet"; pixel_y = 7 @@ -3275,6 +3276,7 @@ "io" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -24; + }, /turf/open/floor/wood, /area/awaymission/cabin) @@ -4560,7 +4562,7 @@ 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); + armor = list("melee" = 15, "bullet" = 5, "laser" = 5, "energy" = 2, "bomb" = 10, "bio" = 5, "rad" = 20, "fire" = 20, "acid" = 20, "stamina" = 8); desc = "It's not bloody for some reason. Dear god."; name = "human skull" }, @@ -4701,7 +4703,7 @@ /obj/effect/turf_decal/tile/blue, /obj/item/clothing/shoes/sneakers/brown, /obj/item/clothing/head/helmet/police{ - armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 2, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20); + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 2, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20, "stamina" = 5); desc = "I am the law!" }, /obj/structure/closet{ diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 530b004dc7f47..a4b7c110086e6 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -13,24 +13,24 @@ desc = "Looks hot."; luminosity = 5; name = "lava"; - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "ae" = ( /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "af" = ( /obj/item/greentext, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "ag" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "ah" = ( @@ -38,18 +38,18 @@ desc = "Looks hot."; luminosity = 5; name = "lava"; - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "ai" = ( /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aj" = ( /obj/structure/flora/rock, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "ak" = ( @@ -58,54 +58,54 @@ "al" = ( /obj/effect/forcefield/cult, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "am" = ( /obj/effect/decal/remains/human, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "an" = ( /obj/structure/destructible/cult/pylon, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "ao" = ( /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "ap" = ( /obj/structure/destructible/cult/pylon, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aq" = ( /obj/item/ectoplasm, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "ar" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "as" = ( /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "at" = ( /obj/structure/spawner/skeleton, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "au" = ( @@ -118,7 +118,7 @@ /obj/item/clothing/mask/gas/clown_hat, /obj/item/organ/heart/demon, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "av" = ( @@ -127,13 +127,13 @@ name = "shock rune" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aw" = ( /obj/effect/decal/remains/human, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "ax" = ( @@ -147,39 +147,39 @@ }, /obj/item/coin/antagtoken, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "az" = ( /obj/structure/constructshell, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aA" = ( /obj/structure/girder/cult, /obj/item/stack/sheet/runed_metal, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aB" = ( /obj/structure/spawner/skeleton, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aC" = ( /obj/structure/bed, /obj/item/bedsheet/cult, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aD" = ( /obj/item/stack/sheet/runed_metal, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aE" = ( @@ -192,7 +192,7 @@ name = "an extremely flamboyant book" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aF" = ( @@ -203,13 +203,13 @@ name = "weak forcefield" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aG" = ( /obj/item/ectoplasm, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aH" = ( @@ -218,7 +218,7 @@ "aI" = ( /obj/machinery/door/airlock/external, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aJ" = ( @@ -226,7 +226,7 @@ /area/awaymission/caves/BMP_asteroid/level_three) "aK" = ( /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aL" = ( @@ -234,7 +234,7 @@ dir = 4 }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aM" = ( @@ -244,7 +244,7 @@ id = "minedeep" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aN" = ( @@ -253,7 +253,7 @@ name = "rusted mine" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aO" = ( @@ -261,7 +261,7 @@ dir = 8 }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aP" = ( @@ -272,31 +272,31 @@ name = "rusty ladder" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aQ" = ( /obj/item/stack/rods, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aR" = ( /obj/effect/forcefield/cult, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aS" = ( /obj/structure/girder/cult, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aT" = ( /obj/structure/ore_box, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aU" = ( @@ -309,7 +309,7 @@ pixel_x = 32 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aV" = ( @@ -318,13 +318,13 @@ desc = "Looks hot."; luminosity = 5; name = "lava"; - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aW" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aX" = ( @@ -333,7 +333,7 @@ id_target = "minedeepup" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aY" = ( @@ -342,7 +342,7 @@ name = "flame rune" }, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aZ" = ( @@ -351,50 +351,50 @@ name = "flame rune" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "ba" = ( /obj/structure/destructible/cult/talisman, /obj/item/book/granter/martial/plasma_fist, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bb" = ( /mob/living/simple_animal/hostile/poison/giant_spider/hunter, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bc" = ( /obj/structure/spider/stickyweb, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "be" = ( /obj/structure/spawner/mining/goliath, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bf" = ( /obj/effect/decal/cleanable/blood, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bg" = ( /mob/living/simple_animal/hostile/poison/giant_spider/nurse, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bh" = ( /mob/living/simple_animal/hostile/skeleton, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bi" = ( @@ -402,7 +402,7 @@ dir = 9 }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bj" = ( @@ -410,7 +410,7 @@ dir = 1 }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bk" = ( @@ -418,7 +418,7 @@ dir = 5 }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bl" = ( @@ -426,7 +426,7 @@ dir = 8 }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bm" = ( @@ -434,7 +434,7 @@ calibrated = 0 }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bn" = ( @@ -442,14 +442,14 @@ dir = 4 }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bo" = ( /obj/structure/flora/rock, /obj/item/soulstone/anybody, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bp" = ( @@ -457,13 +457,13 @@ dir = 10 }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bq" = ( /obj/machinery/gateway, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "br" = ( @@ -471,7 +471,7 @@ dir = 6 }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bs" = ( @@ -480,53 +480,53 @@ name = "shock rune" }, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bt" = ( /obj/structure/spider/stickyweb, /mob/living/simple_animal/hostile/poison/giant_spider/hunter, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bu" = ( /obj/structure/spider/cocoon, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bv" = ( /obj/structure/destructible/cult/pylon, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bw" = ( /obj/effect/decal/cleanable/blood, /obj/structure/spawner/skeleton, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bx" = ( /obj/item/organ/brain/alien, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "by" = ( -/obj/item/twohanded/mjollnir, +/obj/item/mjollnir, /mob/living/simple_animal/hostile/poison/giant_spider/nurse, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bz" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/blood, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bA" = ( @@ -534,31 +534,31 @@ /obj/item/necromantic_stone, /obj/effect/decal/cleanable/blood, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bB" = ( /obj/item/clothing/head/collectable/wizard, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bC" = ( /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bD" = ( /mob/living/simple_animal/hostile/skeleton, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bE" = ( /obj/structure/destructible/cult/pylon, /obj/effect/decal/cleanable/blood, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bF" = ( @@ -569,31 +569,31 @@ name = "rusty ladder" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bG" = ( /obj/item/gun/ballistic/automatic/pistol/deagle/gold, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bH" = ( /obj/effect/decal/remains/human, /obj/item/clothing/under/misc/patriotsuit, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bI" = ( /obj/item/bedsheet/patriot, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bJ" = ( /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bK" = ( @@ -607,7 +607,7 @@ desc = "Looks hot."; luminosity = 5; name = "lava"; - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "bN" = ( @@ -618,7 +618,7 @@ desc = "Looks hot."; luminosity = 5; name = "lava"; - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bP" = ( @@ -631,7 +631,7 @@ dir = 4 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bQ" = ( @@ -643,12 +643,12 @@ "bS" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bT" = ( /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bU" = ( @@ -657,12 +657,12 @@ id_target = "minedeepup" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bV" = ( /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "bW" = ( @@ -670,20 +670,20 @@ dir = 8 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bX" = ( /obj/structure/table, /obj/item/paper/crumpled/awaymissions/caves/unsafe_area, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bY" = ( /mob/living/simple_animal/hostile/skeleton, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bZ" = ( @@ -692,13 +692,13 @@ name = "Cave Bat" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "ca" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "cb" = ( @@ -714,13 +714,13 @@ throwforce = 1 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cc" = ( /obj/structure/ore_box, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cd" = ( @@ -729,7 +729,7 @@ name = "rusted mine" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "ce" = ( @@ -739,12 +739,12 @@ id = "mineintro" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cf" = ( /turf/open/floor/plasteel/dark{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cg" = ( @@ -756,13 +756,13 @@ "ci" = ( /obj/item/shard, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "cj" = ( /obj/structure/flora/rock, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "ck" = ( @@ -770,13 +770,13 @@ pixel_y = -32 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cl" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cm" = ( @@ -784,7 +784,7 @@ /area/awaymission/caves/BMP_asteroid/level_two) "cn" = ( /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "co" = ( @@ -794,30 +794,30 @@ /obj/structure/filingcabinet, /obj/item/paper/fluff/awaymissions/caves/omega, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cp" = ( /obj/structure/table, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cq" = ( /obj/structure/flora/rock, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cr" = ( /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cs" = ( /obj/item/shard, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "ct" = ( @@ -825,48 +825,48 @@ /obj/item/stack/rods, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cu" = ( /obj/effect/decal/cleanable/blood/gibs, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cv" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cw" = ( /obj/item/stack/rods, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cx" = ( /turf/open/floor/plasteel/dark{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "cy" = ( /obj/effect/decal/remains/human, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "cz" = ( /obj/effect/landmark/awaystart, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "cA" = ( /obj/effect/decal/remains/xeno, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cB" = ( @@ -875,7 +875,7 @@ }, /obj/effect/decal/cleanable/xenoblood, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cC" = ( @@ -883,13 +883,13 @@ /obj/item/restraints/handcuffs/cable, /obj/item/restraints/handcuffs/cable, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cD" = ( /obj/effect/decal/remains/human, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cE" = ( @@ -899,13 +899,13 @@ }, /obj/item/stack/rods, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cF" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cG" = ( @@ -913,13 +913,13 @@ dir = 8 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "cH" = ( /obj/machinery/door/airlock/external, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cK" = ( @@ -932,7 +932,7 @@ "cL" = ( /obj/structure/spawner/mining/basilisk, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cM" = ( @@ -940,14 +940,14 @@ dir = 8 }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cN" = ( /obj/machinery/door/window/eastleft, /obj/effect/decal/cleanable/xenoblood/xgibs, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cO" = ( @@ -956,13 +956,13 @@ }, /obj/machinery/door/window/eastleft, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cP" = ( /obj/machinery/door/airlock/external, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cQ" = ( @@ -975,13 +975,13 @@ throwforce = 1 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cR" = ( /obj/effect/landmark/awaystart, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cS" = ( @@ -991,7 +991,7 @@ icon_state = "right" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cT" = ( @@ -1002,7 +1002,7 @@ icon_state = "right" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cU" = ( @@ -1011,13 +1011,13 @@ name = "Cave Bat" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cV" = ( /obj/effect/decal/cleanable/xenoblood/xgibs, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cW" = ( @@ -1025,20 +1025,20 @@ dir = 4 }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cX" = ( /obj/structure/table, /obj/item/melee/baton, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cY" = ( /obj/structure/glowshroom/single, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cZ" = ( @@ -1047,13 +1047,13 @@ pixel_x = 32 }, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "da" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "db" = ( @@ -1061,7 +1061,7 @@ /obj/machinery/cell_charger, /obj/item/stock_parts/cell/crap, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "dc" = ( @@ -1074,19 +1074,19 @@ pixel_x = -32 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "dd" = ( /obj/structure/closet/emcloset, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "de" = ( /obj/machinery/light, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "df" = ( @@ -1097,7 +1097,7 @@ /obj/item/grenade/syndieminibomb/concussion, /obj/item/grenade/syndieminibomb/concussion, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "dg" = ( @@ -1106,7 +1106,7 @@ id_target = "mineintroup" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "dh" = ( @@ -1314,7 +1314,7 @@ name = "Mining cart" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "dW" = ( @@ -1346,31 +1346,31 @@ dir = 8 }, /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "ec" = ( /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "ed" = ( /obj/structure/bed, /obj/effect/landmark/awaystart, /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "ee" = ( /obj/structure/girder, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "ef" = ( /obj/effect/decal/cleanable/ash, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "eg" = ( @@ -1407,24 +1407,24 @@ "em" = ( /obj/structure/closet/secure_closet/personal, /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "en" = ( /obj/effect/decal/cleanable/shreds, /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "eo" = ( /obj/item/stack/rods, /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "ep" = ( /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "eq" = ( @@ -1448,13 +1448,13 @@ "et" = ( /obj/effect/decal/cleanable/shreds, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "eu" = ( /obj/item/stack/rods, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "ev" = ( @@ -1585,7 +1585,7 @@ "eQ" = ( /obj/machinery/mineral/mint, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "eR" = ( @@ -1644,7 +1644,7 @@ "fb" = ( /obj/structure/spawner/mining/hivelord, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fc" = ( @@ -1660,19 +1660,19 @@ /obj/item/slimepotion/fireproof, /obj/item/clothing/glasses/thermal, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fd" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fe" = ( /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "ff" = ( @@ -1680,13 +1680,13 @@ dir = 4 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fg" = ( /obj/structure/ore_box, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fh" = ( @@ -1702,19 +1702,19 @@ name = "spooky skeleton remains" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fk" = ( /obj/item/grenade/syndieminibomb/concussion, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fl" = ( /obj/effect/decal/remains/human, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fm" = ( @@ -1722,20 +1722,20 @@ /area/awaymission/caves/listeningpost) "fn" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/paper/fluff/awaymissions/caves/shipment_receipt, /obj/item/organ/eyes/robotic/thermals, /obj/item/gun/energy/laser/captain/scattershot, /obj/item/slimepotion/fireproof, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fo" = ( /mob/living/simple_animal/hostile/asteroid/fugu, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fp" = ( @@ -1748,7 +1748,7 @@ dir = 8 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fq" = ( @@ -1785,13 +1785,13 @@ "fv" = ( /obj/structure/glowshroom/single, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fw" = ( /obj/item/gun/energy/laser/captain/scattershot, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fx" = ( @@ -1800,18 +1800,18 @@ id_target = "mineintrodown" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fy" = ( /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fz" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fA" = ( @@ -1837,13 +1837,13 @@ "fE" = ( /obj/machinery/light/small, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fF" = ( /obj/item/slimepotion/fireproof, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fG" = ( @@ -1862,7 +1862,7 @@ pixel_x = -32 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fJ" = ( @@ -1894,26 +1894,26 @@ dir = 4 }, /turf/open/floor/plasteel/dark{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fP" = ( /obj/structure/grille, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fQ" = ( /turf/open/floor/plasteel/elevatorshaft{ name = "elevator flooring"; - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fR" = ( /obj/structure/grille, /obj/structure/barricade/wooden, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fS" = ( @@ -1931,13 +1931,13 @@ /obj/effect/landmark/awaystart, /turf/open/floor/plasteel/elevatorshaft{ name = "elevator flooring"; - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fW" = ( /obj/structure/girder, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fX" = ( @@ -1956,7 +1956,7 @@ amount = 15 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fY" = ( @@ -1971,7 +1971,7 @@ id = "mineintro" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gb" = ( @@ -1981,7 +1981,7 @@ "gc" = ( /obj/item/stack/rods, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gd" = ( @@ -1990,7 +1990,7 @@ name = "wilson" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "ge" = ( @@ -1998,7 +1998,7 @@ dir = 1 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gf" = ( @@ -2010,20 +2010,20 @@ /obj/structure/table/reinforced, /obj/item/storage/box/donkpockets, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gh" = ( /obj/structure/table/reinforced, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gi" = ( /obj/structure/table/reinforced, /obj/item/stack/rods, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gj" = ( @@ -2035,7 +2035,7 @@ "gk" = ( /obj/effect/landmark/awaystart, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "gl" = ( @@ -2049,19 +2049,19 @@ "gn" = ( /obj/item/grown/log, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "go" = ( /obj/structure/chair/stool, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gp" = ( /obj/structure/table_frame, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gq" = ( @@ -2076,7 +2076,7 @@ "gs" = ( /obj/item/assembly/igniter, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "gt" = ( @@ -2117,13 +2117,13 @@ dir = 1 }, /turf/open/floor/plasteel/dark{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gB" = ( /obj/machinery/mech_bay_recharge_port, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gC" = ( @@ -2135,7 +2135,7 @@ "gD" = ( /obj/structure/spawner/mining/hivelord, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gE" = ( @@ -2143,7 +2143,7 @@ dir = 4 }, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gF" = ( @@ -2151,7 +2151,7 @@ /obj/item/storage/toolbox/mechanical, /obj/item/clothing/glasses/material, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gG" = ( @@ -2167,12 +2167,12 @@ "gI" = ( /obj/structure/chair/stool, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gJ" = ( /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gK" = ( @@ -2190,25 +2190,25 @@ "gN" = ( /obj/structure/holohoop, /turf/open/floor/plasteel/dark{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gO" = ( /obj/structure/closet/emcloset, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gP" = ( /obj/item/toy/beach_ball/holoball, /turf/open/floor/plasteel/dark{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gQ" = ( /obj/structure/spawner/mining/basilisk, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gR" = ( @@ -2219,13 +2219,13 @@ amount = 12 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gS" = ( /obj/structure/girder, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gT" = ( @@ -2239,7 +2239,7 @@ dir = 1 }, /turf/open/floor/plasteel/dark{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gV" = ( @@ -2248,7 +2248,7 @@ name = "rusted mine" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gX" = ( @@ -2261,7 +2261,7 @@ desc = "Looks hot."; luminosity = 5; name = "lava"; - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "gZ" = ( diff --git a/_maps/RandomZLevels/challenge.dmm b/_maps/RandomZLevels/challenge.dmm deleted file mode 100644 index 54e37eff0c9ce..0000000000000 --- a/_maps/RandomZLevels/challenge.dmm +++ /dev/null @@ -1,66689 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/open/space, -/area/space) -"ab" = ( -/turf/closed/indestructible{ - icon_state = "iron0" - }, -/area/awaymission/challenge/start) -"ac" = ( -/obj/structure/girder, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/start) -"ad" = ( -/turf/open/floor/plating, -/area/awaymission/challenge/start) -"ae" = ( -/turf/open/floor/plasteel/airless{ - icon_state = "damaged5" - }, -/area/awaymission/challenge/start) -"af" = ( -/turf/open/floor/plasteel/airless{ - icon_state = "damaged2" - }, -/area/awaymission/challenge/start) -"ag" = ( -/obj/item/clothing/suit/space/syndicate/blue, -/obj/item/clothing/head/helmet/space/syndicate/blue, -/turf/open/floor/plasteel/airless{ - icon_state = "damaged2" - }, -/area/awaymission/challenge/start) -"ah" = ( -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/start) -"ai" = ( -/obj/item/flashlight{ - icon_state = "flashlight-on" - }, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/start) -"aj" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/plasteel/airless{ - icon_state = "damaged3" - }, -/area/awaymission/challenge/start) -"ak" = ( -/obj/effect/decal/remains/human, -/turf/open/floor/plasteel/airless{ - icon_state = "damaged4" - }, -/area/awaymission/challenge/start) -"al" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/start) -"am" = ( -/obj/item/clothing/suit/space/syndicate/green, -/obj/item/clothing/head/helmet/space/syndicate/green, -/turf/open/floor/plasteel/airless{ - icon_state = "damaged2" - }, -/area/awaymission/challenge/start) -"an" = ( -/turf/open/floor/plasteel/airless{ - icon_state = "damaged3" - }, -/area/awaymission/challenge/start) -"ao" = ( -/obj/item/clothing/suit/space/syndicate/orange, -/obj/item/clothing/head/helmet/space/syndicate/orange, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/start) -"ap" = ( -/obj/item/gun/energy/laser/retro, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/start) -"aq" = ( -/obj/item/stack/rods, -/turf/open/floor/plasteel, -/area/awaymission/challenge/start) -"ar" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/start) -"as" = ( -/obj/effect/decal/remains/robot, -/turf/open/floor/plasteel/airless{ - icon_state = "damaged2" - }, -/area/awaymission/challenge/start) -"at" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/awaymission/challenge/start) -"au" = ( -/turf/closed/wall, -/area/awaymission/challenge/start) -"av" = ( -/turf/open/floor/plasteel/airless{ - icon_state = "damaged4" - }, -/area/awaymission/challenge/start) -"aw" = ( -/obj/item/stack/rods, -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/plasteel/airless{ - icon_state = "damaged2" - }, -/area/awaymission/challenge/start) -"ax" = ( -/obj/effect/decal/cleanable/oil, -/mob/living/simple_animal/hostile/syndicate, -/turf/open/floor/plating, -/area/awaymission/challenge/start) -"ay" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/start) -"az" = ( -/obj/item/clothing/suit/space/syndicate/black, -/obj/item/clothing/head/helmet/space/syndicate/black, -/turf/open/floor/plasteel/airless{ - icon_state = "damaged2" - }, -/area/awaymission/challenge/start) -"aA" = ( -/turf/closed/indestructible{ - icon_state = "iron0" - }, -/area/awaymission/challenge/main) -"aB" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"aC" = ( -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"aD" = ( -/turf/open/floor/plasteel/airless{ - icon_state = "damaged3" - }, -/area/awaymission/challenge/main) -"aE" = ( -/turf/closed/wall, -/area/awaymission/challenge/main) -"aF" = ( -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"aG" = ( -/turf/open/floor/plasteel/airless{ - icon_state = "damaged2" - }, -/area/awaymission/challenge/main) -"aH" = ( -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/main) -"aI" = ( -/obj/machinery/power/emitter/ctf{ - dir = 2 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"aJ" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/main) -"aK" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/main) -"aL" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/main) -"aM" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/main) -"aN" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"aO" = ( -/obj/structure/window/reinforced, -/obj/machinery/power/emitter/ctf{ - dir = 2 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"aP" = ( -/obj/structure/window/reinforced, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"aQ" = ( -/obj/structure/window/reinforced, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"aR" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/awaymission/challenge/main) -"aS" = ( -/obj/machinery/power/emitter/ctf{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"aT" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"aU" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/main) -"aV" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"aW" = ( -/obj/machinery/power/emitter/ctf{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"aX" = ( -/obj/machinery/porta_turret{ - dir = 8; - set_obj_flags = "EMAGGED"; - installation = /obj/item/gun/energy/lasercannon - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"aY" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"aZ" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"ba" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/challenge/main) -"bb" = ( -/obj/item/multitool, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/main) -"bc" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/main) -"bd" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"be" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"bf" = ( -/obj/machinery/power/emitter/ctf{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"bg" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"bh" = ( -/turf/open/floor/plasteel, -/area/awaymission/challenge/main) -"bi" = ( -/obj/machinery/power/emitter/ctf{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"bj" = ( -/obj/machinery/light, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"bk" = ( -/obj/machinery/power/emitter/ctf{ - dir = 1 - }, -/obj/machinery/light, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"bl" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/power/emitter/ctf{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"bm" = ( -/obj/machinery/door/window, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/main) -"bn" = ( -/turf/closed/wall/mineral/plastitanium, -/area/awaymission/challenge/main) -"bo" = ( -/obj/machinery/power/emitter/ctf{ - dir = 2 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"bp" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"bq" = ( -/obj/machinery/porta_turret{ - dir = 8; - set_obj_flags = "EMAGGED"; - installation = /obj/item/gun/energy/lasercannon - }, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"br" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"bs" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"bt" = ( -/obj/item/storage/toolbox/electrical, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/main) -"bu" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"bv" = ( -/obj/structure/window/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"bw" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/main) -"bx" = ( -/obj/machinery/power/emitter/ctf{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"by" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/awaymission/challenge/main) -"bz" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/awaymission/challenge/main) -"bA" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"bB" = ( -/obj/item/clothing/gloves/color/yellow, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/challenge/main) -"bC" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/power/emitter/ctf{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"bD" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/power/emitter/ctf{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"bE" = ( -/obj/item/storage/firstaid/fire, -/turf/open/floor/plasteel/airless, -/area/awaymission/challenge/main) -"bF" = ( -/turf/open/floor/plasteel/white/corner{ - dir = 2 - }, -/area/awaymission/challenge/main) -"bG" = ( -/turf/open/floor/plasteel/white/side{ - dir = 2 - }, -/area/awaymission/challenge/main) -"bH" = ( -/turf/open/floor/plasteel/white/corner{ - dir = 8 - }, -/area/awaymission/challenge/main) -"bI" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"bJ" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"bK" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"bL" = ( -/obj/machinery/power/emitter/ctf{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"bM" = ( -/obj/machinery/power/emitter/ctf{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"bN" = ( -/obj/machinery/power/emitter/ctf{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"bO" = ( -/obj/machinery/power/emitter/ctf{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"bP" = ( -/turf/closed/indestructible{ - icon_state = "iron0" - }, -/area/awaymission/challenge/end) -"bQ" = ( -/obj/item/gun/ballistic/revolver/russian, -/turf/open/floor/plasteel/white/side{ - dir = 2 - }, -/area/awaymission/challenge/main) -"bR" = ( -/obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/awaymission/challenge/end) -"bS" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching evil areas."; - name = "Security Monitor"; - network = ""; - pixel_y = 30 - }, -/obj/structure/table/reinforced, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"bT" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/light, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"bU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/turf/open/floor/plasteel/white, -/area/awaymission/challenge/main) -"bV" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/light, -/turf/open/floor/plating/airless, -/area/awaymission/challenge/main) -"bW" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/filingcabinet, -/turf/open/floor/carpet, -/area/awaymission/challenge/end) -"bX" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching evil areas."; - name = "Security Monitor"; - network = ""; - pixel_y = 30 - }, -/turf/open/floor/carpet, -/area/awaymission/challenge/end) -"bY" = ( -/turf/open/floor/carpet, -/area/awaymission/challenge/end) -"bZ" = ( -/obj/structure/mirror{ - pixel_y = 28 - }, -/turf/open/floor/wood, -/area/awaymission/challenge/end) -"ca" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/rack, -/obj/item/clothing/suit/armor/heavy, -/turf/open/floor/wood, -/area/awaymission/challenge/end) -"cb" = ( -/turf/open/floor/mineral/plastitanium, -/area/awaymission/challenge/end) -"cc" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_y = 28 - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"cd" = ( -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"ce" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"cf" = ( -/obj/machinery/door/airlock/centcom{ - name = "Airlock"; - opacity = 1; - req_access_txt = "109" - }, -/turf/open/floor/plating, -/area/awaymission/challenge/end) -"cg" = ( -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_x = -27 - }, -/turf/open/floor/carpet, -/area/awaymission/challenge/end) -"ch" = ( -/obj/structure/chair/comfy/black, -/mob/living/simple_animal/hostile/syndicate{ - name = "Syndicate Commander" - }, -/turf/open/floor/carpet, -/area/awaymission/challenge/end) -"ci" = ( -/obj/structure/table/wood, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/turf/open/floor/carpet, -/area/awaymission/challenge/end) -"cj" = ( -/turf/open/floor/wood, -/area/awaymission/challenge/end) -"ck" = ( -/obj/structure/rack, -/obj/item/gun/ballistic/revolver/mateba, -/turf/open/floor/wood, -/area/awaymission/challenge/end) -"cl" = ( -/mob/living/simple_animal/hostile/syndicate/melee/sword, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"cm" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"cn" = ( -/turf/open/floor/circuit, -/area/awaymission/challenge/end) -"co" = ( -/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/awaymission/challenge/end) -"cp" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/space, -/area/space/nearstation) -"cq" = ( -/obj/structure/table/wood, -/obj/item/melee/chainofcommand, -/obj/item/stamp, -/turf/open/floor/carpet, -/area/awaymission/challenge/end) -"cr" = ( -/obj/structure/table/wood, -/obj/item/paper/fluff/gateway, -/obj/item/folder/blue, -/turf/open/floor/carpet, -/area/awaymission/challenge/end) -"cs" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/turf/open/floor/carpet, -/area/awaymission/challenge/end) -"ct" = ( -/obj/structure/rack, -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced, -/turf/open/floor/wood, -/area/awaymission/challenge/end) -"cu" = ( -/mob/living/simple_animal/hostile/syndicate/melee/sword, -/turf/open/floor/mineral/plastitanium, -/area/awaymission/challenge/end) -"cv" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/wood, -/area/awaymission/challenge/end) -"cw" = ( -/obj/structure/rack, -/obj/item/gun/ballistic/automatic/l6_saw, -/turf/open/floor/wood, -/area/awaymission/challenge/end) -"cx" = ( -/obj/machinery/door/airlock/centcom{ - name = "Security"; - opacity = 1; - req_access_txt = "109" - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"cy" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"cz" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/space, -/area/space/nearstation) -"cA" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/indestructible{ - icon_state = "iron0" - }, -/area/awaymission/challenge/end) -"cB" = ( -/obj/machinery/door/airlock/centcom{ - name = "Administrator"; - opacity = 1; - req_access_txt = "109" - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"cC" = ( -/obj/item/storage/toolbox/electrical, -/turf/open/floor/circuit, -/area/awaymission/challenge/end) -"cD" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/circuit, -/area/awaymission/challenge/end) -"cE" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/circuit, -/area/awaymission/challenge/end) -"cF" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"cG" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/circuit, -/area/awaymission/challenge/end) -"cH" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/space, -/area/space/nearstation) -"cI" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"cJ" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/space, -/area/space/nearstation) -"cK" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/space, -/area/space/nearstation) -"cL" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/space, -/area/space/nearstation) -"cM" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/directional{ - dir = 9 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/end) -"cN" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle, -/turf/open/floor/plating, -/area/awaymission/challenge/end) -"cO" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/directional{ - dir = 5 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/end) -"cP" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/end) -"cR" = ( -/obj/machinery/gateway{ - dir = 9 - }, -/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/awaymission/challenge/end) -"cS" = ( -/obj/machinery/gateway{ - 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/awaymission/challenge/end) -"cT" = ( -/obj/machinery/gateway{ - 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/dark, -/area/awaymission/challenge/end) -"cV" = ( -/obj/machinery/gateway{ - 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/awaymission/challenge/end) -"cW" = ( -/obj/machinery/gateway/centeraway{ - calibrated = 0 - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"cX" = ( -/obj/machinery/gateway{ - 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/awaymission/challenge/end) -"cY" = ( -/obj/machinery/gateway{ - dir = 10 - }, -/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/awaymission/challenge/end) -"cZ" = ( -/obj/machinery/gateway, -/obj/structure/cable{ - icon_state = "0-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 - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"da" = ( -/obj/machinery/gateway{ - dir = 6 - }, -/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/awaymission/challenge/end) -"db" = ( -/obj/structure/window/reinforced, -/turf/open/floor/circuit, -/area/awaymission/challenge/end) -"dc" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"dd" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/space, -/area/space/nearstation) -"de" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end, -/turf/open/floor/plating, -/area/awaymission/challenge/end) -"df" = ( -/obj/structure/table, -/obj/item/paper/pamphlet/gateway, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"dg" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"dh" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"di" = ( -/obj/structure/table, -/obj/item/implanter/explosive, -/obj/item/implanter/explosive{ - pixel_y = 4 - }, -/obj/item/implanter/explosive{ - pixel_y = 8 - }, -/obj/item/implanter/explosive{ - pixel_y = 12 - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"dj" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/space, -/area/space/nearstation) -"dk" = ( -/obj/machinery/door/airlock/centcom{ - name = "Gateway Access"; - opacity = 1; - req_access_txt = "109" - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"dl" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/challenge/end) -"dm" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/mob/living/simple_animal/hostile/syndicate{ - name = "Syndicate Technician" - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"dn" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/challenge/end) -"do" = ( -/obj/machinery/light, -/turf/open/floor/circuit, -/area/awaymission/challenge/end) -"dp" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/circuit, -/area/awaymission/challenge/end) -"dq" = ( -/obj/structure/cable, -/obj/machinery/power/smes/magical, -/turf/open/floor/circuit, -/area/awaymission/challenge/end) -"dr" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/circuit, -/area/awaymission/challenge/end) -"ds" = ( -/obj/structure/closet/l3closet, -/turf/open/floor/circuit, -/area/awaymission/challenge/end) - -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aa -aa -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aA -aF -aF -aF -aF -aX -aS -aF -aF -aS -aF -aF -aS -aF -aF -aS -aF -aF -aF -aF -aF -aF -aF -aF -aS -aF -aF -aF -aF -aA -aa -aa -bP -bR -cb -cb -cb -bP -cn -cn -cE -cn -cH -aa -aa -aa -aa -aa -aa -aa -aa -aa -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aA -aS -aF -aF -aF -aF -aF -aF -aF -aF -aF -aS -aF -aF -aF -aF -aF -aF -aF -aF -aS -aF -aF -aF -aF -aF -aN -aF -aF -aA -aa -aa -bP -bS -cc -cl -cb -bP -cC -cd -cd -cn -cI -cm -cm -cm -cm -cm -cm -cm -cm -cm -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aA -aA -aA -aA -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -bs -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -bD -aT -aT -aA -aA -aA -bP -bS -cd -cd -cd -cx -co -cd -cd -cn -cn -cn -cn -cn -cn -cn -cn -cn -cn -cn -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aA -aF -aF -aO -aH -aH -aH -aH -aJ -aH -aH -aH -aH -bh -aJ -aH -aH -aH -aH -aJ -aH -aH -aH -by -aY -ba -aH -aH -aH -aJ -aH -aH -bI -aF -aF -bP -bS -ce -cd -cd -cx -co -cd -cd -cd -cd -cd -cd -cd -cd -cd -cd -cd -cF -do -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aA -aF -aF -aP -aH -aH -aH -aH -aH -aH -aH -aH -aH -aR -aY -ba -bt -aH -aH -aH -aH -aH -aH -aR -bA -ba -aH -aH -aH -aH -bE -aH -bI -bM -aF -bP -bS -cc -cd -cu -bP -cn -cd -cd -cd -cd -cd -cd -cd -cd -cd -cd -cd -cd -cn -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aA -aF -aI -aQ -aH -aH -aK -aH -aH -aH -aH -aH -aH -aR -aZ -ba -aH -aH -aH -aH -aH -aH -aH -aR -bA -ba -aH -aH -aH -aH -aH -aH -bI -aF -aF -bP -bR -cb -cb -cb -bP -cn -cd -cd -cn -cn -cn -cn -cn -cn -cn -cn -cd -cn -cn -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -af -an -ah -ad -an -ax -aA -aF -aF -aP -aH -aH -aH -aR -aY -ba -aH -aH -aH -bh -bm -aH -aH -aH -aH -aH -aR -aY -ba -aR -aZ -ba -aH -aH -aR -aY -ba -aH -bI -aF -bM -bP -bP -bP -bP -bP -bP -cD -cd -cd -cn -cJ -cp -cp -cp -cp -cp -dd -co -cJ -cp -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ad -aj -an -ao -af -an -av -aA -aA -aA -aA -aU -aH -aH -aR -aZ -ba -aH -aH -bd -bi -bn -bo -bu -aH -aH -aH -aR -aZ -ba -aH -aH -aH -aH -aH -aR -aZ -ba -aH -bI -aF -aF -aF -aF -bP -cm -cm -cy -cn -cd -cd -cn -cH -cM -cP -cP -cP -cP -de -dk -dl -de -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ae -ak -al -af -ad -aw -av -aB -aC -aJ -aR -aH -aH -aH -aH -aH -bb -aH -aH -be -bj -bn -bp -bv -aH -aK -aH -aH -aH -aH -aR -aY -ba -aH -aH -aH -bm -aH -bF -bJ -bN -aT -aT -bT -bP -cn -cn -cn -cn -cd -cd -cn -cH -cN -cE -cn -cn -db -df -cd -cd -dp -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -af -al -ah -af -at -af -an -aC -aG -aK -aR -aH -aH -aH -aH -aH -aH -aH -aH -bf -aC -bn -bq -bv -aH -aH -aH -aH -aH -aH -aR -bA -ba -aH -aH -aR -aY -ba -bG -bG -bG -bG -bQ -bU -cf -co -cd -cd -cd -cd -cd -cn -cH -cN -cR -cV -cY -db -dg -cd -cd -cn -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ag -ah -al -ap -au -af -ay -aD -aC -aL -aR -aH -aH -aH -aH -aH -aH -aH -aH -be -aC -bn -bq -bv -aH -aH -aH -aH -aH -aH -aR -bA -ba -aH -aH -aR -aZ -ba -bG -bG -bG -bG -bG -bU -cf -co -cd -cd -cd -cd -cd -cn -cH -cN -cS -cW -cZ -dc -dc -dc -dm -dq -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ah -al -ah -aq -at -an -az -aE -aH -aM -aR -aH -aH -aH -aH -aH -aH -aH -aH -be -bk -bn -bp -bv -aH -aH -aH -aH -aH -aH -aR -aZ -ba -aH -aH -aH -bm -aH -bH -bK -aV -bO -aV -bV -bP -cn -cn -cn -cn -cd -cd -cn -cH -cN -cT -cX -da -db -dh -cd -dn -dr -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ai -ah -al -ar -af -av -ad -aA -aA -aA -aA -aU -aH -aH -aR -aY -ba -aH -aH -bg -bl -bn -br -bw -aH -aH -aH -aR -aY -ba -aH -aH -aH -aH -aH -aR -aY -ba -aH -bI -aN -aF -aF -bM -bP -cp -cp -cz -cn -cd -cd -cn -cH -cN -cG -cn -cn -db -di -cd -cd -ds -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ah -am -ad -as -av -ae -av -aA -aF -aN -aP -aH -aH -aH -aR -aZ -ba -aH -aH -aH -bh -bm -aH -aH -aH -aH -aH -aR -aZ -ba -aR -aY -ba -aH -aH -aR -aZ -ba -aH -bI -aF -bM -bP -bP -bP -bP -bP -bP -cD -cd -cd -cn -cH -cO -cP -cP -cP -cP -de -dk -dl -de -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aA -aF -aF -aO -aH -aH -aH -aH -aH -aH -bc -aH -aH -aR -aY -ba -aH -aH -aH -aH -aH -aH -aH -aR -bA -ba -aH -aH -aH -aH -aH -aH -bI -aF -aF -bP -bW -cg -cq -cj -bP -cn -cd -cd -cn -cK -cm -cm -cm -cm -cm -dj -co -cK -cm -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aA -aF -aF -aP -aH -aH -aH -aH -aH -aH -aH -aH -aH -aR -aZ -ba -aH -aH -aH -aH -aH -aH -aH -aR -bA -bB -aH -aH -aH -aH -aH -aH -bL -aF -aF -bP -bX -ch -cr -cv -bP -cn -cd -cF -cn -cn -cn -cn -cn -cn -cn -cn -cd -cn -cn -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aA -aI -aF -aP -aH -aH -aH -aH -aM -aH -aH -aH -aH -bh -aM -aH -aH -aH -aH -aM -aH -aH -aH -bz -aZ -ba -aH -aH -aH -aM -aH -aH -bI -aF -aF -bP -bY -ci -cs -cj -cA -cd -cd -cd -cd -cd -cd -cd -cd -cd -cd -cd -cd -cd -cn -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aA -aA -aA -aA -aV -aV -aV -aV -aV -aV -aV -aV -aV -aV -aV -aV -aV -aV -aV -aV -aV -bx -aV -aV -aV -aV -aV -aV -bC -aV -aV -aV -aA -aA -aA -bP -bY -bY -bY -cj -cB -co -cd -cd -cd -cd -cd -cd -cd -cd -cd -cd -cd -cd -do -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aA -aF -aF -aF -aF -aN -aF -aF -aF -aW -aF -aF -aF -aF -aF -aF -aF -aF -aF -aF -aF -aF -aF -aF -aF -aF -aF -aF -aF -aA -aa -aa -bP -bZ -cj -cj -cj -bP -cn -cn -cn -cn -cn -cn -cn -cn -cn -cn -cn -cn -cn -cn -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aA -aF -aF -aW -aF -aX -aF -aW -aF -aF -aF -aF -aF -aW -aF -aF -aW -aF -aF -aF -aF -aF -aF -aW -aF -aF -aF -aF -aW -aA -aa -aa -bP -ca -ck -ct -cw -bP -cn -cn -cG -cn -cL -cp -cp -cp -cp -cp -cp -cp -cp -cp -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aa -aa -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index f79299d885fd1..93b740625363f 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -954,7 +954,7 @@ /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "bY" = ( @@ -981,7 +981,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "ca" = ( @@ -989,7 +989,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cb" = ( @@ -1002,7 +1002,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cc" = ( @@ -1016,7 +1016,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cd" = ( @@ -1030,7 +1030,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "ce" = ( @@ -1044,7 +1044,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cf" = ( @@ -1058,7 +1058,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cg" = ( @@ -1071,7 +1071,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "ch" = ( @@ -1086,7 +1086,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "ci" = ( @@ -1164,7 +1164,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cp" = ( @@ -1181,7 +1181,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cr" = ( @@ -1211,7 +1211,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "ct" = ( @@ -1234,7 +1234,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cv" = ( @@ -1248,7 +1248,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cw" = ( @@ -1324,7 +1324,7 @@ /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cD" = ( @@ -1341,7 +1341,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cF" = ( @@ -1353,7 +1353,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cG" = ( @@ -1378,7 +1378,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cI" = ( @@ -1390,7 +1390,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cJ" = ( @@ -1401,7 +1401,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cK" = ( @@ -1422,7 +1422,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cL" = ( @@ -1437,7 +1437,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cM" = ( @@ -1498,7 +1498,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cR" = ( @@ -1507,7 +1507,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged4"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cS" = ( @@ -1527,7 +1527,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cT" = ( @@ -1563,7 +1563,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cW" = ( @@ -1572,7 +1572,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged2"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cX" = ( @@ -1581,7 +1581,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged3"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cY" = ( @@ -1598,7 +1598,7 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; dir = 1; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cZ" = ( @@ -1664,7 +1664,7 @@ /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "df" = ( @@ -1686,7 +1686,7 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; dir = 1; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dh" = ( @@ -1738,7 +1738,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dm" = ( @@ -1749,7 +1749,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dn" = ( @@ -1759,7 +1759,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "do" = ( @@ -1768,7 +1768,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dp" = ( @@ -1782,7 +1782,7 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; icon_state = "platingdmg3"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dq" = ( @@ -1870,7 +1870,7 @@ /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dx" = ( @@ -1892,7 +1892,7 @@ /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dz" = ( @@ -1921,7 +1921,7 @@ /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dC" = ( @@ -1929,7 +1929,7 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; icon_state = "platingdmg1"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dD" = ( @@ -1941,7 +1941,7 @@ /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dE" = ( @@ -2005,7 +2005,7 @@ heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dJ" = ( @@ -2031,7 +2031,7 @@ heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dM" = ( @@ -2040,7 +2040,7 @@ heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/main) "dN" = ( @@ -4829,7 +4829,7 @@ }, /area/awaymission/moonoutpost19/research) "jq" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ desc = "A plastic potted plant."; pixel_y = 3 }, @@ -4936,7 +4936,7 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; icon_state = "platingdmg1"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "jB" = ( @@ -5188,7 +5188,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kd" = ( @@ -5200,7 +5200,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "ke" = ( @@ -5212,7 +5212,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kf" = ( @@ -5226,7 +5226,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kg" = ( @@ -5238,7 +5238,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kh" = ( @@ -5249,7 +5249,7 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; icon_state = "platingdmg1"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "ki" = ( @@ -5261,7 +5261,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged3"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kj" = ( @@ -5448,7 +5448,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged2"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kC" = ( @@ -5467,7 +5467,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged4"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kE" = ( @@ -5475,7 +5475,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kF" = ( @@ -5484,7 +5484,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged5"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kG" = ( @@ -5493,7 +5493,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kH" = ( @@ -5591,7 +5591,7 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; icon_state = "platingdmg3"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kR" = ( @@ -5779,7 +5779,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "ll" = ( @@ -5791,7 +5791,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "lm" = ( @@ -5901,7 +5901,7 @@ "lv" = ( /turf/open/floor/plasteel/showroomfloor{ heat_capacity = 1e+006; - temperature = 273.15 + initial_temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) "lw" = ( @@ -5912,7 +5912,7 @@ }, /turf/open/floor/plasteel/showroomfloor{ heat_capacity = 1e+006; - temperature = 273.15 + initial_temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) "lx" = ( @@ -5924,7 +5924,7 @@ /obj/item/clothing/under/suit/waiter, /turf/open/floor/plasteel/showroomfloor{ heat_capacity = 1e+006; - temperature = 273.15 + initial_temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) "lA" = ( @@ -5940,7 +5940,7 @@ }, /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "lE" = ( @@ -5983,7 +5983,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "lJ" = ( @@ -5993,7 +5993,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "lK" = ( @@ -6067,7 +6067,7 @@ /obj/item/gun/ballistic/shotgun/sc_pump, /turf/open/floor/plasteel/showroomfloor{ heat_capacity = 1e+006; - temperature = 273.15 + initial_temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) "lW" = ( @@ -6141,7 +6141,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "mi" = ( @@ -6192,7 +6192,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/showroomfloor{ heat_capacity = 1e+006; - temperature = 273.15 + initial_temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) "mn" = ( @@ -6207,7 +6207,7 @@ /obj/item/reagent_containers/food/snacks/meat/slab/monkey, /turf/open/floor/plasteel/showroomfloor{ heat_capacity = 1e+006; - temperature = 273.15 + initial_temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) "mo" = ( @@ -6222,7 +6222,7 @@ /obj/item/storage/fancy/egg_box, /turf/open/floor/plasteel/showroomfloor{ heat_capacity = 1e+006; - temperature = 273.15 + initial_temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) "mp" = ( @@ -6289,7 +6289,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "my" = ( @@ -6361,7 +6361,7 @@ /turf/open/floor/plasteel/dark, /area/awaymission/moonoutpost19/arrivals) "mG" = ( -/obj/machinery/computer/shuttle{ +/obj/machinery/computer/shuttle_flight{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, @@ -6457,7 +6457,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "mQ" = ( @@ -6471,7 +6471,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "mR" = ( @@ -6548,7 +6548,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "na" = ( @@ -6601,7 +6601,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nj" = ( @@ -6614,7 +6614,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged2"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nk" = ( @@ -6673,7 +6673,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nr" = ( @@ -6704,7 +6704,7 @@ heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nw" = ( @@ -6718,7 +6718,7 @@ /turf/open/floor/plasteel/cafeteria{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nx" = ( @@ -6742,7 +6742,7 @@ /turf/open/floor/plasteel/cafeteria{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "ny" = ( @@ -6757,7 +6757,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nz" = ( @@ -6810,7 +6810,7 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; icon_state = "platingdmg1"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nE" = ( @@ -6823,7 +6823,7 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; icon_state = "platingdmg3"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nF" = ( @@ -6836,7 +6836,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nG" = ( @@ -6849,7 +6849,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nH" = ( @@ -6911,7 +6911,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nN" = ( @@ -6922,7 +6922,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nO" = ( @@ -6966,7 +6966,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nT" = ( @@ -7003,7 +7003,7 @@ heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nX" = ( @@ -7015,7 +7015,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nY" = ( @@ -7029,7 +7029,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nZ" = ( @@ -7039,7 +7039,7 @@ heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/main) "oa" = ( @@ -7050,7 +7050,7 @@ }, /area/awaymission/moonoutpost19/arrivals) "ob" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ desc = "A plastic potted plant."; pixel_y = 3 }, @@ -7061,7 +7061,7 @@ /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "oc" = ( @@ -7074,7 +7074,7 @@ heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/main) "od" = ( diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm index b1104f8522d09..35b3207f04b9c 100644 --- a/_maps/RandomZLevels/research.dmm +++ b/_maps/RandomZLevels/research.dmm @@ -117,7 +117,7 @@ /turf/open/floor/plasteel/white, /area/awaymission/research/interior/engineering) "ax" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-20"; pixel_y = 3 }, @@ -1338,7 +1338,7 @@ /obj/structure/closet/crate, /obj/item/disk/data{ desc = "A data disk used to store cloning and genetic records. The name on the label appears to be scratched off."; - fields = list("label" = "Buffer1:Kr-$$@##", "UI" = "f8f603857000f930127c4", "SE" = "414401462231053131010241514651403453121613263463440351136366", "UE" = "340008485c321e542aed4df7032ac04d", "name" = "Krystal Symers", "blood_type" = "A+"); + genetic_makeup_buffer = list("label" = "Buffer1:Kr-$$@##", "UI" = "f8f603857000f930127c4", "SE" = "414401462231053131010241514651403453121613263463440351136366", "UE" = "340008485c321e542aed4df7032ac04d", "name" = "Krystal Symers", "blood_type" = "A+"); name = "dusty genetics data disk"; read_only = 1 }, @@ -1734,7 +1734,7 @@ /obj/structure/closet/crate, /obj/item/disk/data{ desc = "A data disk used to store cloning and genetic records. The name on the label appears to be scratched off with the words 'DO NOT CLONE' hastily written over it."; - fields = list("label" = "Buffer1:George Melons", "UI" = "3c300f11b5421ca7014d8", "SE" = "430431205660551642142504334461413202111310233445620533134255", "UE" = "6893e6a0b0076a41897776b10cc2b324", "name" = "George Melons", "blood_type" = "B+"); + genetic_makeup_buffer = list("label" = "Buffer1:George Melons", "UI" = "3c300f11b5421ca7014d8", "SE" = "430431205660551642142504334461413202111310233445620533134255", "UE" = "6893e6a0b0076a41897776b10cc2b324", "name" = "George Melons", "blood_type" = "B+"); name = "old genetics data disk" }, /obj/item/disk/data{ @@ -1763,7 +1763,7 @@ /turf/open/floor/plasteel/dark, /area/awaymission/research/interior/secure) "dN" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-16" }, /obj/effect/turf_decal/tile/purple{ @@ -4065,7 +4065,7 @@ /turf/open/floor/plasteel, /area/awaymission/research/interior/genetics) "hV" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /obj/effect/turf_decal/tile/purple{ @@ -4104,7 +4104,7 @@ /area/awaymission/research/interior/maint) "hY" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, @@ -4191,7 +4191,7 @@ /turf/open/floor/plasteel, /area/awaymission/research/interior/security) "ii" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ desc = "A potted plant, it doesn't look very healthy..."; name = "dead potted plant" }, @@ -4692,7 +4692,7 @@ /turf/open/floor/wood, /area/awaymission/research/interior/dorm) "jm" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-14" }, /turf/open/floor/plasteel/yellowsiding{ @@ -5338,7 +5338,7 @@ /turf/open/floor/plating, /area/awaymission/research/interior/medbay) "kC" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plasteel/yellowsiding{ @@ -5712,7 +5712,7 @@ /turf/open/floor/plasteel/white, /area/awaymission/research/interior/medbay) "ly" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-16" }, /turf/open/floor/plasteel/yellowsiding{ @@ -6195,7 +6195,7 @@ /turf/open/floor/plasteel/white, /area/awaymission/research/interior/escapepods) "mJ" = ( -/obj/item/twohanded/required/kirbyplants, +/obj/item/kirbyplants, /obj/effect/turf_decal/tile/green{ dir = 1 }, @@ -6232,7 +6232,7 @@ /turf/open/floor/grass, /area/awaymission/research/interior/escapepods) "mN" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "applebush" }, /obj/effect/turf_decal/tile/green, diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index b29b3f935c9fa..c206acfaa5dc5 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -787,7 +787,7 @@ dir = 1 }, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /turf/open/floor/plasteel, /area/awaymission/snowdin/post/kitchen) @@ -803,8 +803,7 @@ /obj/machinery/power/apc{ dir = 1; name = "Kitchen APC"; - pixel_x = 1; - pixel_y = 23 + pixel_y = 24 }, /obj/structure/cable/yellow{ icon_state = "0-2" @@ -1215,8 +1214,8 @@ "cU" = ( /obj/effect/turf_decal/weather/snow, /obj/structure/closet/crate{ - icon_state = "crateopen"; - name = "explosives ordinance" + name = "explosives ordinance"; + opened = 1 }, /obj/machinery/light/small{ dir = 4 @@ -1543,8 +1542,8 @@ "dy" = ( /obj/effect/turf_decal/weather/snow, /obj/structure/closet/crate{ - icon_state = "crateopen"; - name = "explosives ordinance" + name = "explosives ordinance"; + opened = 1 }, /turf/open/floor/plasteel/dark/snowdin, /area/awaymission/snowdin/cave) @@ -1853,7 +1852,7 @@ /obj/machinery/power/apc{ dir = 2; name = "Gateway APC"; - pixel_y = -23; + pixel_y = -24; req_access = 150 }, /obj/structure/cable/yellow{ @@ -1869,8 +1868,7 @@ /obj/machinery/power/apc{ dir = 1; name = "Research Center APC"; - pixel_x = 1; - pixel_y = 23 + pixel_y = 24 }, /obj/structure/cable/yellow{ icon_state = "4-8" @@ -2689,15 +2687,15 @@ /area/awaymission/snowdin/outside) "gc" = ( /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gd" = ( /obj/effect/spawner/lootdrop/crate_spawner, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "ge" = ( @@ -2707,8 +2705,8 @@ /obj/structure/closet/crate/wooden, /obj/effect/spawner/lootdrop/snowdin/dungeonheavy, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gg" = ( @@ -2760,7 +2758,7 @@ "gk" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/crowbar, /obj/item/crowbar, @@ -3058,7 +3056,7 @@ /obj/machinery/power/apc{ dir = 1; name = "Garage APC"; - pixel_y = 23 + pixel_y = 24 }, /obj/structure/cable/yellow{ icon_state = "0-8" @@ -3078,15 +3076,15 @@ "gU" = ( /obj/effect/decal/remains/human, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gV" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gW" = ( @@ -3194,7 +3192,7 @@ pixel_y = 5 }, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/clothing/shoes/winterboots, /obj/item/clothing/shoes/winterboots, @@ -3392,8 +3390,8 @@ "hF" = ( /obj/structure/destructible/cult/pylon, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "hG" = ( @@ -3653,8 +3651,8 @@ /obj/structure/closet/crate/wooden, /obj/effect/spawner/lootdrop/snowdin/dungeonmid, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "im" = ( @@ -3663,8 +3661,8 @@ max_mobs = 5 }, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "in" = ( @@ -3673,8 +3671,8 @@ name = "Caleb Reed" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "io" = ( @@ -4490,8 +4488,8 @@ name = "Jacob Ullman" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "jP" = ( @@ -4691,7 +4689,7 @@ pixel_x = 32 }, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/tank/internals/plasma, /obj/item/tank/internals/plasma, @@ -4839,8 +4837,7 @@ /obj/machinery/power/apc{ dir = 1; name = "Custodials APC"; - pixel_x = 1; - pixel_y = 23 + pixel_y = 24 }, /obj/structure/cable/yellow{ icon_state = "0-2" @@ -5617,8 +5614,8 @@ /obj/structure/closet/crate/wooden, /obj/effect/spawner/lootdrop/snowdin/dungeonlite, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "lU" = ( @@ -6300,7 +6297,7 @@ /obj/machinery/power/apc{ dir = 1; name = "Engineering APC"; - pixel_y = 23 + pixel_y = 24 }, /obj/structure/cable/yellow{ icon_state = "4-8" @@ -6602,8 +6599,7 @@ /obj/machinery/power/apc{ dir = 1; name = "Security Outpost APC"; - pixel_x = 1; - pixel_y = 23 + pixel_y = 24 }, /obj/structure/cable/yellow{ icon_state = "0-4" @@ -6740,9 +6736,9 @@ "oo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4; + piping_layer = 3; pixel_x = 5; - pixel_y = 5; - piping_layer = 3 + pixel_y = 5 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, @@ -6750,9 +6746,9 @@ "op" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4; + piping_layer = 3; pixel_x = 5; - pixel_y = 5; - piping_layer = 3 + pixel_y = 5 }, /turf/open/floor/plasteel, /area/awaymission/snowdin/post/engineering) @@ -7512,8 +7508,8 @@ "qg" = ( /obj/structure/flora/rock/pile/icy, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "qh" = ( @@ -8168,9 +8164,9 @@ "rI" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos{ dir = 1; + piping_layer = 3; pixel_x = 5; - pixel_y = 5; - piping_layer = 3 + pixel_y = 5 }, /obj/effect/light_emitter{ name = "cave light"; @@ -9032,7 +9028,7 @@ /obj/machinery/power/apc{ dir = 1; name = "Main Outpost APC"; - pixel_y = 23 + pixel_y = 24 }, /obj/structure/cable/yellow{ icon_state = "0-2" @@ -9752,10 +9748,10 @@ /area/awaymission/snowdin/post/broken_shuttle) "wc" = ( /obj/machinery/computer{ - name = "Shuttle Transist Console"; desc = "A console meant for calling and sending a transit ferry. It seems iced-over and non-functional."; dir = 1; - icon_screen = null + icon_screen = null; + name = "Shuttle Transist Console" }, /turf/open/floor/mineral/titanium/blue, /area/awaymission/snowdin/post/broken_shuttle) @@ -9844,9 +9840,9 @@ "wm" = ( /obj/machinery/porta_turret/centcom_shuttle/weak{ desc = "A turret built with substandard parts and run down further with age."; - icon_state = "syndie_off"; dir = 9; - faction = list("pirate") + faction = list("pirate"); + icon_state = "syndie_off" }, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/cave) @@ -9970,8 +9966,8 @@ /area/awaymission/snowdin/outside) "wC" = ( /obj/vehicle/ridden/atv{ - icon_state = "atv"; - dir = 4 + dir = 4; + icon_state = "atv" }, /obj/effect/light_emitter{ name = "outdoor light"; @@ -10158,7 +10154,7 @@ /area/awaymission/snowdin/cave) "xc" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -10420,11 +10416,12 @@ }, /area/awaymission/snowdin/post/mining_dock) "xK" = ( -/obj/docking_port/stationary{ +/obj/docking_port/stationary/turbolift{ + deck = 2; dir = 4; dwidth = 3; height = 6; - id = "snowdin_excavation_top"; + id = "snowdin_excavation"; name = "snowdin excavation top"; roundstart_template = /datum/map_template/shuttle/snowdin/excavation; width = 6 @@ -10462,11 +10459,11 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "xP" = ( -/obj/docking_port/stationary{ +/obj/docking_port/stationary/turbolift{ dir = 4; dwidth = 3; height = 6; - id = "snowdin_excavation_down"; + id = "snowdin_excavation"; name = "snowdin excavation down"; width = 6 }, @@ -10547,16 +10544,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) -"xZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/snowdin/post/mining_dock) "ya" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -10638,22 +10625,6 @@ }, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) -"ym" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/computer/shuttle/snowdin/mining{ - dir = 8; - name = "Excavation Elevator Console"; - possible_destinations = "snowdin_excavation_top;snowdin_excavation_down"; - shuttleId = "snowdin_excavation" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/snowdin/post/mining_dock) "yn" = ( /obj/machinery/atmospherics/pipe/manifold/orange/visible{ dir = 8 @@ -10680,18 +10651,6 @@ /obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) -"yr" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/computer/shuttle/snowdin/mining{ - dir = 8; - name = "Excavation Elevator Console"; - possible_destinations = "snowdin_excavation_top;snowdin_excavation_down"; - shuttleId = "snowdin_excavation" - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) "ys" = ( /obj/machinery/atmospherics/pipe/manifold4w/orange/visible, /turf/open/floor/plating/snowed, @@ -10706,10 +10665,10 @@ /area/awaymission/snowdin/cave) "yu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - name = "toxin out"; dir = 8; + frequency = 1442; id_tag = "snowdin_toxins_mine_1"; - frequency = 1442 + name = "toxin out" }, /turf/open/floor/engine/vacuum, /area/awaymission/snowdin/cave) @@ -11081,8 +11040,8 @@ /area/awaymission/snowdin/post/minipost) "zq" = ( /obj/vehicle/ridden/atv{ - icon_state = "atv"; - dir = 8 + dir = 8; + icon_state = "atv" }, /turf/open/floor/plating, /area/awaymission/snowdin/post/minipost) @@ -11829,8 +11788,7 @@ /obj/machinery/power/apc{ dir = 1; name = "Recon Post APC"; - pixel_x = 1; - pixel_y = 23 + pixel_y = 24 }, /obj/structure/cable/yellow{ icon_state = "0-2" @@ -12088,8 +12046,8 @@ "Ca" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/crate{ - icon_state = "crateopen"; - name = "explosives ordinance" + name = "explosives ordinance"; + opened = 1 }, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) @@ -12335,8 +12293,8 @@ /area/awaymission/snowdin/cave) "CP" = ( /obj/structure/shuttle/engine/heater{ - icon_state = "heater"; - dir = 4 + dir = 4; + icon_state = "heater" }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -13215,7 +13173,7 @@ /turf/open/floor/mineral/plastitanium{ initial_gas_mix = "o2=22;n2=82;TEMP=180"; planetary_atmos = 1; - temperature = 180 + initial_temperature = 180 }, /area/awaymission/snowdin/cave) "EF" = ( @@ -13227,7 +13185,7 @@ /turf/open/floor/mineral/plastitanium{ initial_gas_mix = "o2=22;n2=82;TEMP=180"; planetary_atmos = 1; - temperature = 180 + initial_temperature = 180 }, /area/awaymission/snowdin/cave) "EG" = ( @@ -13241,7 +13199,7 @@ /turf/open/floor/mineral/plastitanium{ initial_gas_mix = "o2=22;n2=82;TEMP=180"; planetary_atmos = 1; - temperature = 180 + initial_temperature = 180 }, /area/awaymission/snowdin/cave) "EH" = ( @@ -13309,8 +13267,8 @@ /area/awaymission/snowdin/cave) "EN" = ( /obj/machinery/sleeper/syndie{ - icon_state = "sleeper_s"; - dir = 1 + dir = 1; + icon_state = "sleeper_s" }, /obj/effect/turf_decal/bot_white, /turf/open/floor/plasteel/dark, @@ -13322,8 +13280,8 @@ "EP" = ( /obj/effect/turf_decal/bot_white, /obj/machinery/sleeper/syndie{ - icon_state = "sleeper_s"; - dir = 1 + dir = 1; + icon_state = "sleeper_s" }, /turf/open/floor/plasteel/dark, /area/awaymission/snowdin/cave) @@ -13939,7 +13897,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main/robotics) "GB" = ( -/obj/machinery/mecha_part_fabricator, +/obj/machinery/modular_fabricator/exosuit_fab, /obj/structure/cable/yellow{ icon_state = "1-2" }, @@ -14599,8 +14557,8 @@ /area/awaymission/snowdin/post/mining_main) "Ix" = ( /obj/vehicle/ridden/atv{ - icon_state = "atv"; - dir = 1 + dir = 1; + icon_state = "atv" }, /obj/effect/decal/cleanable/oil, /turf/open/floor/plating, @@ -14738,7 +14696,7 @@ /obj/machinery/power/apc{ dir = 1; name = "Main Outpost APC"; - pixel_y = 23 + pixel_y = 24 }, /obj/structure/cable/yellow{ icon_state = "4-8" @@ -14752,7 +14710,7 @@ /obj/machinery/power/apc{ dir = 1; name = "Mechbay APC"; - pixel_y = 23 + pixel_y = 24 }, /obj/structure/cable/yellow{ icon_state = "0-8" @@ -14815,7 +14773,7 @@ /area/awaymission/snowdin/post/mining_main) "IX" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/stack/sheet/mineral/plasma{ amount = 10 @@ -14960,7 +14918,7 @@ /area/awaymission/snowdin/post/mining_dock) "Jp" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/storage/toolbox/emergency, /obj/item/clothing/suit/hooded/wintercoat, @@ -15009,7 +14967,7 @@ /area/awaymission/snowdin/post/mining_main) "Jt" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/storage/toolbox/emergency, /turf/open/floor/plating, @@ -15117,7 +15075,7 @@ /area/awaymission/snowdin/post/mining_dock) "JE" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/storage/toolbox/emergency, /obj/item/clothing/suit/hooded/wintercoat, @@ -15200,7 +15158,7 @@ /area/awaymission/snowdin/post/mining_main) "JN" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/clothing/suit/hooded/wintercoat, /obj/item/clothing/suit/hooded/wintercoat, @@ -15387,11 +15345,12 @@ /turf/open/floor/plasteel, /area/awaymission/snowdin/post/mining_main) "Kn" = ( -/obj/docking_port/stationary{ +/obj/docking_port/stationary/turbolift{ + deck = 2; dir = 4; dwidth = 2; height = 5; - id = "snowdin_mining_top"; + id = "snowdin_mining"; name = "snowdin mining top"; roundstart_template = /datum/map_template/shuttle/snowdin/mining; width = 5 @@ -15444,11 +15403,11 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "Kt" = ( -/obj/docking_port/stationary{ +/obj/docking_port/stationary/turbolift{ dir = 4; dwidth = 2; height = 5; - id = "snowdin_mining_down"; + id = "snowdin_mining"; name = "snowdin mining bottom"; width = 5 }, @@ -15506,7 +15465,7 @@ /obj/machinery/power/apc{ dir = 1; name = "Mining Post APC"; - pixel_y = 23 + pixel_y = 24 }, /obj/structure/cable/yellow{ icon_state = "0-8" @@ -15609,32 +15568,6 @@ icon_state = "platingdmg2" }, /area/awaymission/snowdin/post/mining_main) -"KO" = ( -/obj/machinery/computer/shuttle/snowdin/mining{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/snowdin/post/mining_main) -"KQ" = ( -/obj/machinery/computer/shuttle/snowdin/mining{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/snowdin/post/mining_dock) "KR" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -15739,6 +15672,15 @@ }, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) +"LE" = ( +/obj/machinery/turbolift_button{ + floor_id = 1; + pixel_x = -32; + pixel_y = 5; + shuttle_id = "snowdin_mining" + }, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_dock) "OF" = ( /obj/machinery/door/airlock/external{ name = "Ready Room"; @@ -15759,6 +15701,21 @@ }, /turf/open/floor/plasteel/dark, /area/awaymission/snowdin/cave) +"Pk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/turbolift_button{ + floor_id = 1; + pixel_y = -26; + shuttle_id = "snowdin_excavation" + }, +/turf/open/floor/plasteel, +/area/awaymission/snowdin/post/mining_dock) "PR" = ( /obj/machinery/door/airlock/external{ name = "Ready Room"; @@ -15777,6 +15734,32 @@ }, /turf/open/floor/plasteel/dark, /area/awaymission/snowdin/cave) +"Re" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/machinery/turbolift_button{ + floor_id = 2; + pixel_x = 32; + pixel_y = 5; + shuttle_id = "snowdin_excavation" + }, +/turf/open/floor/plating/snowed, +/area/awaymission/snowdin/cave) +"Sj" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/turbolift_button{ + floor_id = 2; + pixel_y = 36; + shuttle_id = "snowdin_mining" + }, +/turf/open/floor/plasteel, +/area/awaymission/snowdin/post/mining_main) "SX" = ( /obj/machinery/door/airlock/external/glass, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -15834,6 +15817,13 @@ }, /turf/open/floor/plating/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) +"Yb" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/closed/wall, +/area/awaymission/snowdin/post/mining_dock) "Yn" = ( /obj/machinery/door/airlock/external/glass, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -29196,7 +29186,7 @@ GP GP GP Go -JL +Sj HW Gq KM @@ -29712,7 +29702,7 @@ JP JP Km JP -KO +JP KV GP ac @@ -32946,7 +32936,7 @@ xl xl xl xl -yr +Re an ii ii @@ -33203,7 +33193,7 @@ xl xl xl xl -yp +ai an an an @@ -63636,7 +63626,7 @@ JF Ki wL GZ -wL +LE Gj wD bh @@ -63893,7 +63883,7 @@ Ka xO Ks Ka -KQ +Ka KZ wE bh @@ -66868,8 +66858,8 @@ xt xB xJ xO -xZ -ym +Pk +Yb yy yQ wE diff --git a/_maps/RandomZLevels/spacebattle.dmm b/_maps/RandomZLevels/spacebattle.dmm index 627a411dc93fb..d1b1ffe550330 100644 --- a/_maps/RandomZLevels/spacebattle.dmm +++ b/_maps/RandomZLevels/spacebattle.dmm @@ -134,7 +134,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/awaymission/spacebattle/syndicate3) "aK" = ( -/obj/machinery/computer/shuttle{ +/obj/machinery/computer/shuttle_flight{ dir = 1 }, /turf/open/floor/mineral/plastitanium/red, @@ -296,7 +296,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/awaymission/spacebattle/syndicate1) "bu" = ( -/obj/machinery/computer/shuttle{ +/obj/machinery/computer/shuttle_flight{ dir = 1 }, /turf/open/floor/mineral/plastitanium/red, @@ -319,7 +319,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/awaymission/spacebattle/syndicate2) "bC" = ( -/obj/machinery/computer/shuttle{ +/obj/machinery/computer/shuttle_flight{ dir = 1 }, /turf/open/floor/mineral/plastitanium/red, @@ -1154,7 +1154,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/awaymission/spacebattle/syndicate4) "eL" = ( -/obj/machinery/computer/shuttle, +/obj/machinery/computer/shuttle_flight, /turf/open/floor/mineral/plastitanium/red, /area/awaymission/spacebattle/syndicate4) "eM" = ( @@ -1410,7 +1410,7 @@ /turf/open/floor/plasteel, /area/awaymission/spacebattle/cruiser) "fv" = ( -/obj/machinery/computer/shuttle{ +/obj/machinery/computer/shuttle_flight{ dir = 8 }, /obj/effect/turf_decal/tile/blue{ @@ -2152,7 +2152,7 @@ }, /area/awaymission/spacebattle/cruiser) "hS" = ( -/obj/machinery/computer/shuttle{ +/obj/machinery/computer/shuttle_flight{ dir = 4 }, /turf/open/floor/mineral/plastitanium/red, @@ -2347,7 +2347,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/awaymission/spacebattle/syndicate5) "iM" = ( -/obj/machinery/computer/shuttle, +/obj/machinery/computer/shuttle_flight, /turf/open/floor/mineral/plastitanium/red, /area/awaymission/spacebattle/syndicate5) "iP" = ( @@ -2394,7 +2394,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/awaymission/spacebattle/syndicate6) "jc" = ( -/obj/machinery/computer/shuttle, +/obj/machinery/computer/shuttle_flight, /turf/open/floor/mineral/plastitanium/red, /area/awaymission/spacebattle/syndicate6) "jd" = ( diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index f3f031ec6b00a..4f8e49f3a05f3 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -807,7 +807,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 351.9 + initial_temperature = 351.9 }, /area/awaymission/undergroundoutpost45/caves) "bX" = ( @@ -815,7 +815,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 351.9 + initial_temperature = 351.9 }, /area/awaymission/undergroundoutpost45/caves) "bY" = ( @@ -1427,7 +1427,7 @@ }, /area/awaymission/undergroundoutpost45/central) "do" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ layer = 5 }, /obj/effect/decal/cleanable/dirt, @@ -2112,7 +2112,7 @@ heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "ev" = ( @@ -2266,7 +2266,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "eK" = ( @@ -2644,7 +2644,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/central) "fo" = ( @@ -2880,7 +2880,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/central) "fK" = ( @@ -2950,7 +2950,7 @@ }, /area/awaymission/undergroundoutpost45/central) "fT" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ layer = 5 }, /obj/effect/decal/cleanable/dirt, @@ -3061,7 +3061,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "gg" = ( @@ -3209,7 +3209,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/crew_quarters) "gC" = ( @@ -3481,7 +3481,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/research) "he" = ( @@ -3492,7 +3492,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/crew_quarters) "hf" = ( @@ -3524,7 +3524,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/crew_quarters) "hi" = ( @@ -4923,7 +4923,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/gateway) "jM" = ( @@ -4957,7 +4957,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/research) "jR" = ( @@ -5185,7 +5185,7 @@ }, /area/awaymission/undergroundoutpost45/gateway) "kh" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ layer = 5 }, /obj/effect/decal/cleanable/dirt, @@ -6773,7 +6773,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/gateway) "mJ" = ( @@ -6839,7 +6839,7 @@ /area/awaymission/undergroundoutpost45/research) "mQ" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ layer = 5 }, /turf/open/floor/plasteel/cafeteria{ @@ -8441,7 +8441,7 @@ }, /area/awaymission/undergroundoutpost45/research) "pl" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ layer = 5 }, /obj/effect/decal/cleanable/dirt, @@ -8538,7 +8538,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "pv" = ( @@ -8549,7 +8549,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "pw" = ( @@ -8561,7 +8561,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/engineering) "px" = ( @@ -8653,7 +8653,7 @@ }, /turf/open/floor/engine{ name = "air floor"; - initial_gas_mix = "n2=10580;o2=2644" + initial_gas_mix = "n2=10580;o2=2644;TEMP=351.9" }, /area/awaymission/undergroundoutpost45/engineering) "pF" = ( @@ -8854,7 +8854,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "qb" = ( @@ -9088,7 +9088,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "qA" = ( @@ -9099,7 +9099,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "qB" = ( @@ -9110,7 +9110,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "qC" = ( @@ -9514,7 +9514,7 @@ }, /area/awaymission/undergroundoutpost45/engineering) "rk" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ layer = 5 }, /obj/effect/turf_decal/tile/yellow{ @@ -11311,7 +11311,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/crew_quarters) "uc" = ( @@ -11965,7 +11965,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "vm" = ( @@ -12191,7 +12191,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/research) "vI" = ( @@ -12450,7 +12450,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ layer = 5 }, /obj/effect/decal/cleanable/dirt, @@ -12488,7 +12488,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/mining) "wk" = ( @@ -13711,7 +13711,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/mining) "yh" = ( @@ -13720,7 +13720,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yi" = ( @@ -13729,7 +13729,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yj" = ( @@ -13740,7 +13740,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yk" = ( @@ -13750,7 +13750,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yl" = ( @@ -13761,7 +13761,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "ym" = ( @@ -13771,7 +13771,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yn" = ( @@ -13780,7 +13780,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yo" = ( @@ -13790,7 +13790,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yp" = ( @@ -13800,7 +13800,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yq" = ( @@ -13809,7 +13809,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yr" = ( @@ -13818,7 +13818,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yt" = ( @@ -13828,7 +13828,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yu" = ( @@ -13838,7 +13838,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yw" = ( @@ -13848,7 +13848,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yz" = ( @@ -13857,7 +13857,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yA" = ( @@ -13867,7 +13867,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yB" = ( @@ -13876,7 +13876,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yC" = ( @@ -13886,7 +13886,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yD" = ( @@ -13897,7 +13897,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yH" = ( @@ -13908,7 +13908,7 @@ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; heat_capacity = 1e+006; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "zi" = ( diff --git a/_maps/RandomZLevels/wildwest.dmm b/_maps/RandomZLevels/wildwest.dmm deleted file mode 100644 index 03e1473d29429..0000000000000 --- a/_maps/RandomZLevels/wildwest.dmm +++ /dev/null @@ -1,67637 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/open/space, -/area/space) -"ab" = ( -/turf/closed/indestructible, -/area/awaymission/wildwest/vault) -"ac" = ( -/turf/open/floor/engine/cult, -/area/awaymission/wildwest/vault) -"ad" = ( -/obj/structure/destructible/cult/pylon, -/turf/open/floor/engine/cult, -/area/awaymission/wildwest/vault) -"ae" = ( -/turf/open/floor/plating{ - icon_state = "cultdamage5" - }, -/area/awaymission/wildwest/vault) -"af" = ( -/mob/living/simple_animal/hostile/faithless, -/turf/open/floor/engine/cult, -/area/awaymission/wildwest/vault) -"ag" = ( -/turf/open/floor/circuit/off, -/area/awaymission/wildwest/vault) -"ah" = ( -/turf/closed/indestructible{ - desc = "The patterns engraved on the wall seem to shift as you try to focus on them. You feel sick."; - icon = 'icons/turf/walls/cult_wall.dmi'; - icon_state = "cult" - }, -/area/awaymission/wildwest/vault) -"aj" = ( -/turf/open/floor/plating{ - icon_state = "cultdamage3" - }, -/area/awaymission/wildwest/vault) -"ak" = ( -/turf/open/floor/plating{ - icon_state = "cultdamage6" - }, -/area/awaymission/wildwest/vault) -"al" = ( -/obj/effect/gateway, -/turf/open/floor/engine/cult, -/area/awaymission/wildwest/vault) -"am" = ( -/mob/living/simple_animal/hostile/faithless, -/turf/open/floor/circuit/off, -/area/awaymission/wildwest/vault) -"an" = ( -/turf/open/floor/plasteel/cult{ - name = "engraved floor" - }, -/area/awaymission/wildwest/vault) -"ao" = ( -/turf/open/floor/circuit/green/off, -/area/awaymission/wildwest/vault) -"ap" = ( -/obj/machinery/wish_granter_dark, -/turf/open/floor/circuit/green/off, -/area/awaymission/wildwest/vault) -"aq" = ( -/obj/structure/destructible/cult/pylon, -/turf/open/floor/circuit/green/off, -/area/awaymission/wildwest/vault) -"ar" = ( -/obj/machinery/gateway{ - dir = 9 - }, -/turf/open/floor/circuit/green/off, -/area/awaymission/wildwest/vault) -"as" = ( -/obj/machinery/gateway{ - dir = 1 - }, -/turf/open/floor/circuit/green/off, -/area/awaymission/wildwest/vault) -"at" = ( -/obj/machinery/gateway{ - dir = 5 - }, -/turf/open/floor/circuit/green/off, -/area/awaymission/wildwest/vault) -"au" = ( -/obj/machinery/gateway{ - dir = 8 - }, -/turf/open/floor/circuit/green/off, -/area/awaymission/wildwest/vault) -"av" = ( -/obj/machinery/gateway/centeraway{ - calibrated = 0 - }, -/turf/open/floor/circuit/green/off, -/area/awaymission/wildwest/vault) -"aw" = ( -/obj/machinery/gateway{ - dir = 4 - }, -/turf/open/floor/circuit/green/off, -/area/awaymission/wildwest/vault) -"ax" = ( -/obj/machinery/gateway{ - dir = 10 - }, -/turf/open/floor/circuit/green/off, -/area/awaymission/wildwest/vault) -"ay" = ( -/obj/machinery/gateway, -/turf/open/floor/circuit/green/off, -/area/awaymission/wildwest/vault) -"az" = ( -/obj/machinery/gateway{ - dir = 6 - }, -/turf/open/floor/circuit/green/off, -/area/awaymission/wildwest/vault) -"aA" = ( -/obj/effect/meatgrinder, -/turf/open/floor/circuit/green/off, -/area/awaymission/wildwest/vault) -"aB" = ( -/obj/structure/destructible/cult/pylon, -/turf/open/floor/circuit/off, -/area/awaymission/wildwest/vault) -"aC" = ( -/turf/open/floor/plating{ - icon_state = "cultdamage2" - }, -/area/awaymission/wildwest/vault) -"aD" = ( -/turf/open/floor/carpet, -/area/awaymission/wildwest/vault) -"aE" = ( -/mob/living/simple_animal/hostile/faithless, -/turf/open/floor/carpet, -/area/awaymission/wildwest/vault) -"aF" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/vault, -/turf/open/floor/engine/cult, -/area/awaymission/wildwest/vaultdoors) -"aG" = ( -/turf/closed/mineral, -/area/space/nearstation) -"aH" = ( -/turf/closed/mineral/diamond, -/area/awaymission/wildwest/mines) -"aI" = ( -/turf/closed/mineral/gold, -/area/awaymission/wildwest/mines) -"aJ" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/vault, -/turf/open/floor/engine/cult, -/area/awaymission/wildwest/vault) -"aK" = ( -/obj/effect/mob_spawn/human/miner/rig, -/turf/open/floor/engine/cult, -/area/awaymission/wildwest/vault) -"aL" = ( -/obj/item/paper/fluff/awaymissions/wildwest/grinder, -/turf/open/floor/plasteel/cult{ - name = "engraved floor" - }, -/area/awaymission/wildwest/vault) -"aM" = ( -/turf/closed/mineral/silver, -/area/awaymission/wildwest/mines) -"aN" = ( -/turf/closed/mineral, -/area/awaymission/wildwest/mines) -"aO" = ( -/obj/effect/mob_spawn/human/corpse/syndicatecommando, -/turf/open/floor/plasteel/cult{ - name = "engraved floor" - }, -/area/awaymission/wildwest/vault) -"aP" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/closed/mineral, -/area/awaymission/wildwest/mines) -"aQ" = ( -/obj/effect/decal/cleanable/blood, -/turf/closed/mineral, -/area/awaymission/wildwest/mines) -"aR" = ( -/obj/structure/ore_box, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"aT" = ( -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"aV" = ( -/turf/closed/mineral, -/area/awaymission/wildwest/refine) -"aW" = ( -/turf/closed/wall/mineral/sandstone, -/area/awaymission/wildwest/refine) -"aY" = ( -/obj/effect/decal/cleanable/blood/gibs/up, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"aZ" = ( -/obj/effect/mine/sound/bwoink, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"ba" = ( -/obj/effect/mine/sound/bwoink, -/obj/item/ammo_box/c10mm, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"bb" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/awaymission/wildwest/refine) -"bc" = ( -/turf/open/floor/plating, -/area/awaymission/wildwest/refine) -"bd" = ( -/obj/machinery/door/airlock/sandstone, -/turf/open/floor/plating, -/area/awaymission/wildwest/refine) -"be" = ( -/obj/item/ammo_box/c10mm, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"bf" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"bg" = ( -/turf/closed/wall/mineral/sandstone, -/area/space/nearstation) -"bh" = ( -/obj/structure/closet/crate/large, -/turf/open/floor/plating, -/area/awaymission/wildwest/refine) -"bi" = ( -/obj/effect/mob_spawn/human/miner/rig, -/obj/effect/mine/sound/bwoink, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"bj" = ( -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"bk" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"bl" = ( -/obj/effect/decal/cleanable/blood/gibs/up, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"bm" = ( -/obj/effect/mine/sound/bwoink, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"bn" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg, -/turf/open/floor/plating, -/area/awaymission/wildwest/refine) -"bo" = ( -/obj/structure/closet/crate, -/turf/open/floor/plating, -/area/awaymission/wildwest/refine) -"bp" = ( -/obj/effect/decal/cleanable/blood/gibs/body, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"bq" = ( -/obj/effect/mob_spawn/human/miner/rig, -/turf/open/floor/plating, -/area/awaymission/wildwest/refine) -"br" = ( -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"bs" = ( -/obj/effect/mine/sound/bwoink, -/obj/item/ammo_box/c10mm, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"bt" = ( -/obj/structure/closet/crate, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/awaymission/wildwest/refine) -"bu" = ( -/turf/closed/wall/mineral/sandstone, -/area/awaymission/wildwest/mines) -"bv" = ( -/obj/structure/window/reinforced/tinted/frosted, -/turf/open/space, -/area/space/nearstation) -"bw" = ( -/obj/structure/lattice, -/obj/structure/window/reinforced/tinted/frosted, -/turf/open/space, -/area/space/nearstation) -"bx" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"by" = ( -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"bz" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"bA" = ( -/obj/structure/closet/cabinet, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"bB" = ( -/obj/structure/bed, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"bC" = ( -/obj/structure/table/wood, -/obj/item/gun/ballistic, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"bD" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"bE" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"bF" = ( -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"bG" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/barman_recipes, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"bH" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"bI" = ( -/obj/machinery/vending/boozeomat, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"bJ" = ( -/obj/structure/closet/secure_closet/freezer/kitchen, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/flour, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"bK" = ( -/obj/structure/table/wood, -/obj/item/book/manual/chef_recipes, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"bL" = ( -/obj/structure/table/wood, -/obj/machinery/microwave, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"bM" = ( -/obj/structure/table/wood, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"bN" = ( -/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, -/obj/item/reagent_containers/food/snacks/meat/slab/synthmeat, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"bO" = ( -/obj/structure/lattice, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"bP" = ( -/turf/closed/wall/mineral/sandstone, -/area/awaymission/wildwest/gov) -"bQ" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/window/reinforced/tinted/frosted, -/obj/effect/spawner/structure/window/hollow/reinforced/directional{ - dir = 8 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"bR" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/window/reinforced/tinted/frosted, -/obj/structure/grille, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"bS" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/window/reinforced/tinted/frosted, -/obj/structure/grille, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"bT" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/turf/open/space, -/area/space/nearstation) -"bU" = ( -/obj/structure/chair/wood/normal{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"bV" = ( -/obj/structure/chair/wood/normal{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"bW" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"bX" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/obj/structure/grille, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"bY" = ( -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"bZ" = ( -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand2" - }, -/area/awaymission/wildwest/gov) -"ca" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/effect/spawner/structure/window/hollow/reinforced/directional{ - dir = 1 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"cb" = ( -/obj/machinery/door/window, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"cd" = ( -/obj/effect/mob_spawn/human/cook{ - mob_name = "Chef" - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"ce" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/obj/structure/grille, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"cf" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/grille, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"cg" = ( -/obj/structure/table/wood, -/obj/item/paper/fluff/awaymissions/wildwest/journal/page4, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"ch" = ( -/obj/structure/table/wood, -/obj/item/gun/ballistic, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"ci" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"cj" = ( -/obj/structure/chair/stool, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"ck" = ( -/obj/item/ammo_box/c10mm, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"cl" = ( -/obj/structure/chair/stool, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"cm" = ( -/obj/structure/bookcase/random{ - books_to_load = 5 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/gov) -"cn" = ( -/turf/open/floor/wood, -/area/awaymission/wildwest/gov) -"co" = ( -/obj/item/storage/bag/money, -/turf/open/floor/wood, -/area/awaymission/wildwest/gov) -"cp" = ( -/obj/structure/closet/secure_closet/freezer/kitchen, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"cq" = ( -/obj/structure/table/wood, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"cr" = ( -/obj/structure/table/wood, -/obj/machinery/microwave, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"cs" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"ct" = ( -/obj/structure/lattice, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/turf/open/space, -/area/space/nearstation) -"cu" = ( -/obj/structure/lattice, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"cv" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"cw" = ( -/turf/open/floor/carpet, -/area/awaymission/wildwest/gov) -"cx" = ( -/obj/item/storage/bag/money, -/turf/open/floor/carpet, -/area/awaymission/wildwest/gov) -"cy" = ( -/obj/structure/chair/wood/wings, -/turf/open/floor/wood, -/area/awaymission/wildwest/gov) -"cz" = ( -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"cA" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"cB" = ( -/obj/effect/mine/gas/plasma, -/obj/item/ammo_box/c10mm, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"cC" = ( -/obj/structure/table/wood, -/obj/item/storage/toolbox/electrical, -/turf/open/floor/wood, -/area/awaymission/wildwest/gov) -"cD" = ( -/obj/structure/table/wood, -/obj/item/clothing/gloves/color/yellow, -/obj/item/multitool, -/turf/open/floor/wood, -/area/awaymission/wildwest/gov) -"cE" = ( -/obj/structure/chair/wood/normal{ - dir = 4 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/gov) -"cF" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/wildwest/gov) -"cG" = ( -/mob/living/simple_animal/hostile/netherworld, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"cH" = ( -/obj/effect/mob_spawn/human/cook{ - mob_name = "Chef" - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"cI" = ( -/obj/structure/bookcase/random{ - books_to_load = 5 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"cJ" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/condiment/peppermill, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"cK" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/condiment/saltshaker, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"cL" = ( -/obj/structure/table/wood, -/obj/item/twohanded/dualsaber, -/turf/open/floor/wood, -/area/awaymission/wildwest/gov) -"cM" = ( -/obj/effect/mob_spawn/human/miner/rig, -/turf/open/floor/wood, -/area/awaymission/wildwest/gov) -"cN" = ( -/mob/living/simple_animal/hostile/netherworld, -/turf/open/floor/wood, -/area/awaymission/wildwest/gov) -"cO" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/wood, -/area/awaymission/wildwest/gov) -"cP" = ( -/mob/living/simple_animal/hostile/netherworld, -/turf/open/floor/carpet, -/area/awaymission/wildwest/gov) -"cQ" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/obj/structure/grille, -/obj/structure/window/reinforced/tinted/frosted, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"cR" = ( -/obj/structure/chair/wood/wings{ - dir = 4 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/gov) -"cS" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/grille, -/obj/structure/window/reinforced/tinted/frosted, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"cT" = ( -/obj/effect/decal/remains/human, -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space, -/turf/open/floor/plating, -/area/awaymission/wildwest/refine) -"cU" = ( -/obj/item/paper/fluff/awaymissions/wildwest/journal/page1, -/turf/open/floor/carpet, -/area/awaymission/wildwest/gov) -"cV" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/snacks/soup/monkeysdelight, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"cW" = ( -/obj/structure/table/wood, -/obj/item/kitchen/knife/butcher, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"cX" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/snacks/soup/stew, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"cY" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"cZ" = ( -/obj/structure/chair/comfy/teal{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"da" = ( -/obj/structure/chair/wood/normal{ - dir = 4 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"db" = ( -/obj/structure/chair/wood/normal{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"dc" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/obj/effect/spawner/structure/window/hollow/reinforced/directional{ - dir = 1 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"dd" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/snacks/store/bread/creamcheese, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"de" = ( -/obj/structure/table/wood, -/obj/item/kitchen/rollingpin, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"df" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/snacks/grown/citrus/lemon, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"dg" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/grille, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"dh" = ( -/obj/effect/mob_spawn/human/corpse/syndicatecommando{ - mob_name = "Syndicate Commando" - }, -/turf/open/floor/carpet, -/area/awaymission/wildwest/gov) -"di" = ( -/obj/machinery/mineral/mint, -/turf/open/floor/plating, -/area/awaymission/wildwest/refine) -"dj" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"dk" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"dm" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"dn" = ( -/obj/structure/mineral_door/wood, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"do" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"dp" = ( -/obj/structure/bed, -/obj/item/bedsheet/brown, -/turf/open/floor/wood, -/area/awaymission/wildwest/gov) -"dq" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/bottle/wine, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"dr" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/drinkingglass, -/obj/item/reagent_containers/food/drinks/drinkingglass, -/obj/item/reagent_containers/food/drinks/drinkingglass, -/obj/item/reagent_containers/food/drinks/drinkingglass, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"ds" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/bottle/patron, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/gov) -"dt" = ( -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"du" = ( -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"dv" = ( -/obj/effect/mine/gas/plasma, -/obj/item/ammo_box/c10mm, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"dw" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"dx" = ( -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand4" - }, -/area/awaymission/wildwest/gov) -"dy" = ( -/obj/effect/mob_spawn/human/miner/rig, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"dz" = ( -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand12" - }, -/area/awaymission/wildwest/gov) -"dA" = ( -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand14" - }, -/area/awaymission/wildwest/gov) -"dB" = ( -/obj/structure/toilet, -/mob/living/simple_animal/hostile/netherworld, -/turf/open/floor/plasteel/white, -/area/awaymission/wildwest/gov) -"dC" = ( -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand9" - }, -/area/awaymission/wildwest/gov) -"dD" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"dE" = ( -/obj/structure/closet/crate/large, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"dF" = ( -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand7" - }, -/area/awaymission/wildwest/gov) -"dG" = ( -/obj/machinery/washing_machine, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"dH" = ( -/obj/structure/bed, -/obj/item/bedsheet/blue, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"dI" = ( -/obj/effect/decal/cleanable/blood/gibs/down, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"dJ" = ( -/obj/structure/chair/comfy/brown, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"dK" = ( -/obj/structure/chair/comfy/beige, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"dL" = ( -/obj/machinery/door/airlock/sandstone, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"dM" = ( -/obj/structure/table/wood, -/obj/machinery/computer/security/telescreen/entertainment, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"dN" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"dO" = ( -/obj/structure/chair/comfy/beige{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"dP" = ( -/obj/effect/decal/cleanable/blood/gibs/down, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"dQ" = ( -/obj/machinery/computer/security/telescreen/entertainment, -/turf/closed/wall/mineral/sandstone, -/area/awaymission/wildwest/mines) -"dR" = ( -/obj/structure/window/reinforced/tinted/frosted, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/grille, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"dS" = ( -/obj/structure/window/reinforced/tinted/frosted, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/grille, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"dT" = ( -/obj/structure/window/reinforced/tinted/frosted, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/grille, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"dU" = ( -/obj/machinery/door/airlock/sandstone, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"dV" = ( -/obj/machinery/shower{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"dW" = ( -/obj/machinery/shower{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"dX" = ( -/obj/structure/chair/comfy/beige{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"dY" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"dZ" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/coffee, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"ea" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/snacks/donut/jelly, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"eb" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/snacks/donut, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"ec" = ( -/obj/structure/chair/comfy/beige{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"ed" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/turf/open/space, -/area/space/nearstation) -"ee" = ( -/obj/structure/lattice, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/turf/open/space, -/area/space/nearstation) -"ef" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"eg" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"eh" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) -"ei" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/turf/open/space, -/area/space/nearstation) -"ej" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"ek" = ( -/obj/effect/mine/gas/plasma, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"el" = ( -/obj/effect/decal/cleanable/blood, -/obj/machinery/washing_machine, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"en" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"eo" = ( -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"eq" = ( -/obj/item/gun/ballistic/shotgun, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"er" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand12" - }, -/area/awaymission/wildwest/gov) -"es" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand2" - }, -/area/awaymission/wildwest/gov) -"et" = ( -/turf/closed/wall/r_wall, -/area/awaymission/wildwest/refine) -"eu" = ( -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"ev" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/awaymission/wildwest/mines) -"ew" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"ex" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand7" - }, -/area/awaymission/wildwest/gov) -"ey" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand4" - }, -/area/awaymission/wildwest/gov) -"eA" = ( -/obj/machinery/mineral/mint, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"eC" = ( -/obj/structure/chair/comfy/brown, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"eD" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand12" - }, -/area/awaymission/wildwest/gov) -"eE" = ( -/obj/structure/bed, -/obj/item/bedsheet/blue, -/obj/item/gun/ballistic, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"eF" = ( -/obj/effect/decal/cleanable/blood, -/obj/structure/bed, -/obj/item/bedsheet/blue, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"eG" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/coffee, -/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"eH" = ( -/obj/structure/chair/comfy/beige{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood/gibs/down, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"eI" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand7" - }, -/area/awaymission/wildwest/gov) -"eJ" = ( -/obj/structure/sign/warning/vacuum, -/turf/closed/wall/r_wall, -/area/awaymission/wildwest/refine) -"eK" = ( -/obj/structure/mecha_wreckage/gygax{ - anchored = 1 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"eL" = ( -/obj/effect/decal/cleanable/blood/splatter, -/obj/effect/mob_spawn/human/miner/rig, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"eM" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/closed/wall/mineral/sandstone, -/area/awaymission/wildwest/mines) -"eN" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand14" - }, -/area/awaymission/wildwest/gov) -"eO" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/grille, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"eP" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/grille, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"eQ" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/window/reinforced/tinted/frosted, -/obj/structure/grille, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"eR" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/window/reinforced/tinted/frosted, -/obj/structure/grille, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"eS" = ( -/obj/effect/mine/gas/plasma, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"eT" = ( -/obj/structure/mecha_wreckage/gygax{ - anchored = 1 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"eV" = ( -/obj/structure/chair/comfy/brown{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"eW" = ( -/obj/effect/decal/cleanable/blood/gibs/up, -/turf/open/floor/carpet, -/area/awaymission/wildwest/mines) -"eX" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"eY" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"eZ" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"fa" = ( -/obj/machinery/vending/snack, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"fb" = ( -/obj/machinery/vending/cola, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"fc" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand9" - }, -/area/awaymission/wildwest/gov) -"fd" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"fe" = ( -/obj/structure/sink, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"ff" = ( -/obj/structure/mecha_wreckage/durand{ - anchored = 1 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"fg" = ( -/obj/effect/decal/cleanable/blood/gibs/down, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"fh" = ( -/obj/effect/mob_spawn/human/doctor{ - mob_name = "Doctor Mugabee" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"fi" = ( -/obj/item/stack/medical/bruise_pack, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"fj" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/grille, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"fk" = ( -/obj/structure/mecha_wreckage/seraph{ - anchored = 1 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"fl" = ( -/obj/structure/mecha_wreckage/ripley/deathripley{ - anchored = 1 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"fn" = ( -/obj/effect/decal/cleanable/blood/splatter, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"fo" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/obj/structure/grille, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"fp" = ( -/obj/structure/toilet{ - dir = 1 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"fr" = ( -/obj/structure/mecha_wreckage/ripley/deathripley{ - anchored = 1 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"fs" = ( -/obj/effect/decal/cleanable/blood, -/turf/closed/wall/mineral/sandstone, -/area/awaymission/wildwest/mines) -"ft" = ( -/obj/effect/decal/cleanable/blood/gibs/down, -/turf/closed/wall/mineral/sandstone, -/area/awaymission/wildwest/mines) -"fu" = ( -/obj/structure/chair/comfy/beige{ - dir = 4 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"fv" = ( -/obj/structure/chair/wood/normal{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"fw" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"fx" = ( -/obj/structure/chair/wood/normal{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"fy" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted/frosted, -/turf/open/space, -/area/space/nearstation) -"fz" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/frosted, -/turf/open/space, -/area/space/nearstation) -"fA" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/obj/effect/spawner/structure/window/hollow/reinforced/directional, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"fB" = ( -/obj/effect/mine/gas/plasma, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"fC" = ( -/obj/effect/decal/cleanable/blood/gibs/down, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"fD" = ( -/obj/structure/mecha_wreckage/mauler{ - anchored = 1 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"fE" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"fF" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"fG" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"fH" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"fI" = ( -/obj/effect/decal/cleanable/blood/gibs/up, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"fJ" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"fK" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"fL" = ( -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"fM" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"fN" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"fO" = ( -/mob/living/simple_animal/hostile/syndicate, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"fP" = ( -/obj/structure/mecha_wreckage/ripley/deathripley{ - anchored = 1 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"fQ" = ( -/obj/effect/decal/cleanable/blood/gibs/body, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"fR" = ( -/obj/effect/mine/sound/bwoink, -/obj/effect/mob_spawn/human/miner/rig, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"fS" = ( -/obj/structure/table/wood, -/obj/item/gun/ballistic/shotgun, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"fT" = ( -/obj/structure/chair/wood/normal, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"fU" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"fV" = ( -/obj/machinery/hydroponics/soil, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"fW" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"fX" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/obj/structure/grille, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"fY" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"fZ" = ( -/obj/item/paper/fluff/awaymissions/wildwest/journal/page7, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"ga" = ( -/obj/structure/window/reinforced/tinted/frosted, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"gb" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted/frosted, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"gc" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/turf/open/floor/plasteel/airless, -/area/space/nearstation) -"gd" = ( -/turf/open/floor/plasteel/airless, -/area/space/nearstation) -"ge" = ( -/obj/effect/mob_spawn/human/miner/rig, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"gf" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"gg" = ( -/obj/structure/table/wood, -/obj/item/gun/ballistic/revolver/russian, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"gh" = ( -/obj/structure/chair/wood/normal{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"gi" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"gj" = ( -/obj/effect/decal/cleanable/blood/gibs/core, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"gk" = ( -/mob/living/simple_animal/hostile/syndicate, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"gl" = ( -/obj/machinery/photocopier, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"gm" = ( -/obj/item/gun/ballistic, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"gn" = ( -/mob/living/simple_animal/hostile/netherworld, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"go" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"gs" = ( -/obj/structure/chair/comfy/beige{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/gibs/down, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"gt" = ( -/obj/machinery/washing_machine, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"gu" = ( -/obj/effect/decal/cleanable/blood/gibs/up, -/obj/structure/chair/wood/normal, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/wildwest/mines) -"gv" = ( -/obj/item/hatchet, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"gw" = ( -/obj/item/gun/ballistic/automatic/pistol, -/turf/open/floor/wood, -/area/awaymission/wildwest/mines) -"gx" = ( -/obj/item/gun/ballistic/shotgun, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"gy" = ( -/obj/effect/mob_spawn/human/corpse/syndicatecommando{ - mob_name = "Syndicate Commando" - }, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"gz" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/grille, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"gA" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/grille, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"gB" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/grille, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"gC" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/obj/structure/grille, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"gD" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"gE" = ( -/obj/structure/window/reinforced, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"gF" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"gG" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 8 - }, -/obj/structure/grille, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"gH" = ( -/obj/structure/sign/barsign, -/turf/closed/wall/mineral/sandstone, -/area/awaymission/wildwest/mines) -"gI" = ( -/turf/closed/wall/mineral/titanium/overspace, -/area/awaymission/wildwest/refine) -"gJ" = ( -/turf/closed/wall/mineral/titanium, -/area/awaymission/wildwest/refine) -"gL" = ( -/obj/machinery/door/unpowered/shuttle, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/wildwest/refine) -"gP" = ( -/obj/structure/chair, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/wildwest/refine) -"gQ" = ( -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/wildwest/refine) -"gS" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/awaymission/wildwest/refine) -"gV" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"gW" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/suit/space/syndicate/black/orange, -/obj/item/clothing/head/helmet/space/syndicate/black/orange, -/obj/item/clothing/mask/gas/syndicate, -/obj/item/tank/internals/oxygen, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/wildwest/refine) -"gX" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/end{ - dir = 1 - }, -/obj/structure/window/reinforced/tinted/frosted, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/wildwest/refine) -"gY" = ( -/obj/item/paper/fluff/awaymissions/wildwest/journal/page8, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/mines) -"pD" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"Gh" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/grass, -/area/awaymission/wildwest/gov) -"Kh" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"RN" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) -"Ua" = ( -/obj/machinery/door/airlock/sandstone, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating/ironsand{ - icon_state = "ironsand1" - }, -/area/awaymission/wildwest/gov) - -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -br -br -br -br -br -br -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -br -br -cu -br -aa -aa -aa -aa -aa -aa -br -br -aa -br -br -aa -aa -aa -aa -aa -aa -aa -aa -bW -bW -bW -bW -bW -bW -bW -bW -bW -bW -bW -bW -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -br -br -br -br -aa -aa -aa -br -aa -aa -aa -aa -aa -aa -aa -aa -br -br -br -br -br -aa -aa -aa -aa -aa -aa -bv -fJ -fU -fU -fU -fU -fU -fU -fU -fU -fU -fU -gD -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -bO -bW -bW -bW -bW -bO -bW -bW -bO -bO -bW -do -do -do -do -do -do -do -do -do -aa -aa -br -aa -aa -aa -aa -aa -aa -bv -fK -fL -fL -fL -fL -fL -fL -fL -fL -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -bv -bP -bX -ce -ce -ce -ce -ce -cQ -bP -dc -ce -ce -ce -ce -ce -ce -ce -ce -cQ -bP -ed -aa -br -br -aa -aa -aa -aa -aa -bv -fK -fV -fL -fV -fL -fV -fL -fV -fL -fV -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bw -bQ -bY -bY -bY -bY -bY -bY -bY -bY -bY -bY -bY -bY -bY -bY -bY -bY -dA -bY -dR -ed -aa -aa -br -aa -aa -aa -aa -aa -bv -fK -fV -fL -fV -gn -fV -fL -fV -fL -fV -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -bw -bR -bY -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bY -dx -bY -bY -bY -bY -dS -ed -aa -aa -br -aa -aa -aa -aa -aa -bv -fK -fV -fL -fV -fL -fV -fL -fV -fL -fV -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -bw -bR -bY -bP -cm -cn -cC -cL -cC -cn -cn -cn -cn -bP -bY -bY -bY -bY -bY -bY -dS -ed -aa -aa -br -aa -aa -aa -aa -aa -bv -fK -fV -fL -fV -fL -fV -fL -fV -fL -fV -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -bw -bR -bY -bP -cm -cn -cD -cM -cD -cn -cn -cn -dp -bP -bY -bY -bP -bP -bP -bY -dS -ed -aa -aa -br -aa -aa -aa -aa -aa -bv -fK -fV -fL -fV -fL -fV -fL -fV -fL -fV -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -bw -bR -bY -bP -cm -cn -cn -cn -cn -cn -cN -cn -co -bP -bY -bY -bP -dB -dD -bY -dS -ed -aa -aa -br -aa -aa -aa -aa -aa -bv -fK -fL -fL -fL -fL -fL -fL -fL -fL -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bw -bR -bY -bP -cm -co -cn -cn -cn -cn -cn -cn -cn -bP -bY -bY -bP -bP -bP -bY -dS -ed -aa -aa -br -aa -aa -aa -aa -aa -bv -fK -fL -fL -fL -fL -fL -fL -fL -fL -fL -gn -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bv -bR -bY -bP -cm -cn -cn -cN -cn -cn -co -cn -cn -bP -bY -bY -bY -bY -bY -bY -dS -ed -aa -br -br -aa -aa -aa -aa -aa -bv -fK -fL -fL -fL -fL -fL -fL -fL -fL -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bv -bR -bY -bP -cm -cn -cn -cn -cn -cn -cn -co -cn -bP -dx -bY -bY -bY -bY -bY -dS -ed -br -br -aa -aa -aa -aa -aa -aa -bv -fK -fL -fL -fL -fL -fL -fL -fL -fL -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bv -bR -bY -bP -bP -bP -bP -cO -bP -bP -bP -bP -bP -bP -bY -bY -bY -bY -bY -bY -dS -ed -br -aa -aa -aa -aa -aa -aa -aa -bv -fK -fL -fL -fL -fL -fL -fL -fL -fL -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bv -bR -bZ -bP -cn -cn -cn -cn -cn -cn -cn -cn -cn -bP -bY -bY -bY -dA -bY -bY -dS -ed -br -aa -aa -aa -aa -aa -aa -aa -bv -fK -fL -fL -fL -fL -fL -fL -fL -fL -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bv -bR -bY -bP -co -cw -cx -cw -cw -cw -cw -cx -cn -bP -bY -bY -bY -bY -bY -bY -dS -ee -br -aa -aa -aa -aa -aa -aa -aa -bv -fK -fL -fL -fL -fL -fL -fL -fL -gy -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -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 -br -bw -bR -bY -bP -cn -cw -cw -cw -cw -cw -cw -cw -cn -bP -bY -bY -bY -bY -bY -bY -dT -ef -do -do -do -do -do -do -do -do -fy -fK -fL -fL -fL -fL -fL -fL -fL -fL -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ac -ac -ac -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 -br -bw -bR -bY -bP -co -cw -cw -cw -cw -cU -cw -dh -cn -cO -bY -bY -bY -bY -bY -bY -dU -eg -er -ex -eg -er -eN -eg -ex -eg -Ua -fL -fL -fL -fL -fL -fL -fL -fL -fL -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ah -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 -br -bv -bR -bY -bP -co -cw -cw -cw -cw -cw -cw -cw -cn -cO -bY -dz -bZ -bY -bY -bY -dU -eh -es -ey -eD -eI -eh -fc -eh -es -Ua -fL -fL -fL -fL -fL -fL -fL -fL -fL -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -ab -ac -ah -ah -ah -ac -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 -br -br -bv -bR -bY -bP -cn -cx -cw -cP -cw -cw -cw -cw -cn -bP -bY -bY -bY -bY -bY -bY -dR -ei -bT -bT -bT -bT -bT -bT -bT -bT -fz -fK -fL -fL -fL -fL -fL -fL -fL -fL -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -ab -ac -ac -ah -ah -ac -ac -ac -ac -ac -ac -ah -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -aa -bv -bR -bY -bP -co -cw -cw -cw -cw -cw -cw -cw -cn -bP -bY -bY -bY -bY -bY -bY -dS -ed -aa -aa -aa -aa -aa -aa -aa -aa -bv -fK -fL -fL -fL -fL -fL -fL -fL -fL -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -ah -ah -ac -ac -ab -ab -aa -aa -aa -aa -aa -ab -ab -ac -ac -ah -ah -ah -ah -ah -ah -ac -ah -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -bw -bR -bY -bP -co -cx -cw -cw -cw -cw -cw -cw -cN -bP -bY -bY -bY -bY -bY -bY -dS -ed -aa -aa -aa -aa -aa -aa -aa -aa -bv -fK -fL -fL -fL -fL -fL -fL -fL -fL -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ah -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ah -ac -ah -ah -ac -ac -ac -ac -ac -ah -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -aa -bv -bR -bY -bP -cn -cn -cE -cE -cR -cR -cR -cn -cn -bP -bY -bY -bY -bY -bY -dF -dS -ed -aa -aa -aa -aa -aa -aa -aa -aa -bv -fK -fL -fL -fL -fL -fL -fL -fL -fL -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ah -ah -ac -ac -ac -ac -ah -ac -ac -ac -ac -ah -ac -ac -ah -ac -af -ah -ah -ah -ah -ah -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -bv -bR -bY -bP -cn -cy -cF -cF -cF -cF -cF -cn -cn -bP -bY -bY -bY -bY -bY -bY -dS -ed -aa -aa -aa -aa -aa -aa -aa -aa -bv -fK -fL -ga -gi -fK -fL -fL -fL -fL -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ac -af -ac -ad -ah -ac -ac -ac -ac -ah -ac -ac -ah -ac -ah -af -ac -ah -ac -ah -ah -ac -ac -ac -ah -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bv -bR -bY -bP -cn -cy -cF -cF -cF -cF -cF -cn -cn -bP -bY -bY -bY -bY -bY -bY -dS -ed -aa -aa -aa -aa -aa -aa -aa -aa -bv -fK -fL -ga -fL -fK -fL -fL -fL -fL -fL -fL -gE -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ac -ah -ac -ac -ac -ah -ah -ac -ac -af -ac -ah -ac -ac -ah -ac -ah -ac -ac -ah -ac -ac -ac -ac -ac -ac -ah -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bv -bR -bZ -bP -cn -co -cn -cn -cn -cn -cn -cn -cn -bP -bY -dx -dz -bY -bY -bY -dS -ed -aa -aa -aa -aa -aa -aa -aa -aa -bv -fM -fW -gb -Gh -go -fW -fW -fW -fW -fW -fW -gF -ed -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ac -ac -ac -ac -ac -ah -ac -ac -ah -ah -ah -ah -ac -ac -ac -ah -ac -ac -ah -ac -ac -ac -ad -ah -ac -ad -ac -ac -ac -ac -ah -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bw -bR -bY -bP -co -cn -cn -cn -cn -cn -cn -cn -cn -bP -bY -bY -bY -bY -bY -bY -dS -ee -br -aa -aa -aa -aa -aa -aa -aa -aa -fN -fN -gc -gd -gc -fN -bT -bT -bT -bT -bT -bT -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -ac -ac -ac -ac -ah -ah -ac -ah -ac -ac -ah -ac -ac -ac -ah -ah -ac -ah -ac -ac -ac -ac -ah -ac -ac -ac -ah -ac -ac -ah -ac -ac -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -bw -bR -bY -bP -bP -bP -bP -bP -cO -bP -bP -bP -bP -bP -bY -bY -dA -bY -dx -bY -dS -ed -br -aa -aa -aa -aa -aa -aa -aa -aa -br -br -gd -gd -gd -br -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ah -ac -ac -ac -ac -ac -ac -ac -ah -ac -ah -ac -af -ah -ah -ac -ac -ac -ah -ac -ah -ah -ah -ah -ah -ah -ac -ac -ac -ah -ac -ac -ah -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -bw -bR -bY -bP -cp -cz -cz -cz -cz -cz -cG -cz -dq -bP -bY -bY -bY -bY -bY -bY -dS -ed -br -aa -aa -aa -aa -aa -aa -aa -aa -br -br -gd -gd -br -br -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ah -ac -ac -ac -ah -ah -ac -ac -ah -ac -ah -ac -ac -ac -ah -ad -ac -ac -ah -ac -ac -ac -ac -ac -ac -ah -ah -ah -ah -ah -ac -ac -ah -ac -ad -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -bw -bR -bY -bP -cq -cz -cz -cz -cz -cV -dd -cz -dq -bP -bY -dA -bY -bY -bY -bY -dS -ed -br -aa -aa -aa -aa -aa -aa -aa -aa -br -br -br -br -br -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ac -ac -ah -ah -ac -ac -ac -ah -ac -ac -ah -ac -ah -ah -ac -ac -ah -ah -ac -ah -ah -ac -ah -ac -ac -ac -ac -ac -ad -ac -ah -ac -ac -ac -ah -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bw -bR -bY -bP -cr -cz -cG -cz -cz -cW -de -cz -dr -bP -bY -bY -bY -bY -dA -bY -dS -ed -br -aa -aa -aa -aa -aa -aa -aa -aa -br -br -br -br -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ac -ac -ac -ac -ac -ah -ac -ac -ac -ah -ad -ac -ah -ac -ac -ah -ac -ac -ac -ac -ac -ah -ac -ac -ah -ah -ah -af -ac -ac -ac -ac -ah -ac -ac -ac -ah -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bv -bR -bY -bP -cq -cz -cH -cz -cz -cX -df -cz -ds -bP -bY -bY -bY -dC -bY -bY -dS -ed -br -aa -aa -aa -aa -aa -aa -br -br -br -aa -br -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ac -ah -ah -ac -ac -ah -ac -ac -ah -ac -ac -ah -ah -ah -ac -ac -ac -ah -ac -ac -ac -ac -ah -ah -ah -ac -ac -ac -ah -ac -ac -ac -ah -ac -ad -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bv -bR -bY -bP -cs -cz -cz -cz -cz -cz -cz -cz -ds -bP -bY -bY -bZ -bY -bY -bY -dS -ed -br -aa -aa -aa -aa -aa -aa -br -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -ac -ah -ad -ac -ac -ac -ah -ac -ac -ah -ac -ac -ah -ac -ac -ac -ac -ah -ah -ac -ac -ah -ah -ac -ac -ac -ac -ac -ah -ah -ac -ac -ah -ac -af -ac -aJ -ac -ac -ac -ac -ac -ac -ab -an -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bv -bR -bY -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bP -bY -bY -bY -bY -bZ -bY -dS -ee -br -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ah -ac -ac -ac -ah -ah -ac -af -ac -ah -ac -ac -ah -ac -ac -ah -ad -ac -ac -ac -ac -ah -ah -ac -ac -ah -ah -ac -ac -ac -ac -ac -ah -ac -ac -ah -ac -ac -ac -aJ -ac -ac -ac -ac -ac -ac -ab -aa -aa -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bv -bS -bY -bY -bY -bZ -bY -bZ -bY -bY -bY -bY -bY -bY -dx -bY -bY -bY -bY -bY -dT -ed -br -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ah -ah -ah -ac -ac -ah -ac -ac -ac -ah -af -ac -ah -ac -ac -ah -ah -ac -ac -ah -ac -ac -ah -ac -ac -ac -ah -ah -ah -ad -ac -ac -ah -ac -ac -ah -ac -ac -ac -ah -ac -ad -ac -ac -ac -ac -ab -aa -aa -aa -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -bv -bP -ca -cf -cf -cf -cf -cf -cS -bP -dg -cf -cf -cf -cf -cf -cf -cf -cf -cS -bP -ed -br -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ah -ah -ac -ac -ah -ac -ac -ac -ah -ac -ac -ah -ac -ac -ac -ah -ac -ac -ah -ac -ac -ah -ah -ac -ac -ac -af -ah -ah -ac -ac -ah -ac -ac -ah -ah -ah -ah -ah -ac -ac -ac -ac -ac -ac -ab -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -aa -bT -bT -bT -ct -ct -ct -bT -bT -bT -bT -bT -ct -ct -ct -bT -bT -bT -bT -bT -bT -br -br -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ah -ah -ac -ac -ah -ac -ac -ac -ah -ac -ac -ah -ac -ac -ac -ah -ac -ac -ah -ac -ac -ac -ah -ah -ac -ac -ac -ac -ah -ah -ac -ah -ac -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ac -ac -ab -aa -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -aa -aa -aa -aa -aa -br -aa -aa -aa -aa -br -br -aa -br -br -br -br -br -br -br -cu -br -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ah -ac -ac -ah -ac -ac -ac -ah -ac -ac -ah -ah -ac -ac -ah -ac -ac -ah -ah -ac -ac -ac -ah -ac -ac -ac -ac -ac -ah -ac -ah -ah -ac -ac -ac -ac -ac -ah -ac -ad -aK -ac -ac -ac -ab -an -an -an -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -aa -aa -aa -aa -aa -aa -br -cu -br -br -br -br -aa -aa -aa -aa -aa -br -br -aa -aa -aa -br -br -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ah -ac -ah -ac -ac -ah -ac -ac -ac -ah -ac -ac -ac -ah -ac -ac -ah -ac -ac -ac -ah -ac -af -ac -ah -ah -ac -ac -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ac -ac -ab -aa -an -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -aa -aa -aa -aa -aa -aa -br -aa -aa -br -br -aa -aa -aa -aa -aa -aa -br -br -aa -aa -aa -br -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ah -ac -af -ac -ac -ah -ac -ac -ah -ah -ac -ac -ac -ah -ac -ac -ah -ah -ac -ac -ah -ah -ah -ah -ah -ah -ac -ac -ac -ac -ac -ac -ah -ah -ah -ah -ah -ac -ac -ah -ac -ac -af -ac -ac -ac -ab -an -an -an -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -aa -aa -aa -aa -br -br -aa -aa -aa -br -br -aa -aa -aa -aa -aa -aa -br -br -br -aa -br -aa -aa -eO -fd -eO -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ah -ah -ac -ac -ac -ah -ac -ac -ah -ad -ac -ac -ac -ah -ac -ac -ac -ah -ah -ac -ac -ac -ac -ac -ac -ah -ah -ac -ac -ac -ah -ah -ah -ac -ac -ac -ac -ac -ac -ah -ac -ad -ac -ac -ac -ac -ab -aa -aa -aa -aa -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -aa -aa -aa -br -aa -aa -aa -aa -aa -br -aa -aa -aa -aa -aa -aa -br -aG -br -aa -br -aa -aa -eP -eu -eP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ah -ad -ac -ac -ah -ac -ac -ah -ac -ac -ac -ac -ah -ah -ad -ac -ac -ah -ah -ah -ah -ac -ac -ac -ac -ah -ah -ah -ah -ah -ac -ac -ac -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -aa -br -br -aa -aa -aa -aa -aa -br -aa -aa -aa -aa -aa -aG -aG -aG -br -cu -br -aa -aa -eQ -eu -eP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ah -ah -ah -ah -ah -ah -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ac -ac -ac -ac -ac -ah -ah -ah -ac -ac -ac -ah -ac -ac -ac -ac -ac -ac -ac -ac -ad -ac -ac -ah -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -an -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -br -aa -aa -aa -aa -aa -aa -br -br -aa -aa -aa -aa -aG -aG -aG -aG -aG -et -et -eJ -eR -RN -fj -fo -fA -et -fX -fo -fA -et -fX -fo -fA -et -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ac -ac -ah -ah -ah -ah -ac -af -ac -ac -ac -ac -ad -ah -ac -af -ac -ah -ac -ac -ac -ac -ac -ac -ah -ah -ah -ac -ac -ah -ac -ad -ac -ac -ac -ac -aF -aL -aO -an -an -an -an -an -an -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -cu -br -aa -aa -aa -aa -aa -aa -aa -br -aa -aa -aG -aG -aG -aG -aG -aG -aG -et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -gz -aa -aa -aa -gI -gJ -gJ -gJ -gI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ah -ah -ah -ac -ac -ah -ah -ah -ac -ac -ac -ah -ah -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ac -ac -ah -ah -ac -ac -ac -ac -ah -ah -ah -ac -ah -ac -ac -ah -ac -ac -ac -ac -ac -ac -aF -an -an -an -an -an -an -an -an -an -an -an -aa -aa -aa -aa -aa -aa -aa -aa -br -br -aa -aa -aa -aa -aa -aa -aa -br -aG -aG -aG -aG -aG -aG -aG -aG -et -et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eP -aa -aa -aa -gJ -gP -gP -gP -gS -gJ -gJ -gJ -gI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ah -ah -ac -ac -ac -ah -ah -ah -ac -ah -ac -ac -ah -ah -ah -ah -ah -ah -ah -ac -ac -ah -ac -ac -ah -ac -ac -ac -ac -ah -ah -ad -ac -ac -ah -ac -ac -ah -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -an -an -an -an -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -fj -fo -fo -gG -gJ -gP -gP -gP -gQ -gQ -gQ -gW -gJ -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ah -ac -ac -ac -ac -ad -ah -ah -ah -ac -ac -ah -ac -af -ac -ac -ac -ah -ac -ac -ac -ac -ac -ah -ah -ac -ac -ac -ah -ac -ac -af -ac -ah -ac -ac -ah -ac -ad -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 -br -br -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -et -eA -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -pD -eu -eu -Kh -gL -gQ -gQ -gQ -gQ -gQ -gP -gW -gX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ah -ah -ac -ac -ac -ac -ac -ac -ah -ac -ac -ah -ac -ac -ac -ac -ac -ah -ah -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ac -ac -ac -ac -ah -ac -ac -ah -ac -ac -ac -ac -ac -ac -ab -aa -aa -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -aa -aa -aa -aa -aa -aG -aG -aW -aW -aW -aW -aW -aW -aW -aW -et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -gA -fo -fo -gG -gJ -gP -gP -gP -gQ -gQ -gQ -gW -gJ -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ah -ac -ac -ac -ac -ac -ac -ah -ac -ac -ah -ah -ah -ah -ac -ac -ac -ah -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ac -ac -ah -ah -ah -ac -ac -ah -ac -ac -ac -ac -ac -ac -ab -an -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -aa -aa -aG -aG -aG -aG -aW -bb -bc -bc -bc -bo -bc -bd -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -gB -aa -aa -aa -gJ -gP -gP -gP -gS -gJ -gJ -gJ -gI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ah -ac -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ad -ah -ac -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ac -ac -ac -ac -ah -ah -ac -ac -ac -ac -ah -ac -ad -ac -ac -ac -ac -ab -an -an -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -aa -aa -aG -aG -aG -aG -aW -bc -bc -bh -bc -bc -bc -bd -eu -eu -eu -eu -eu -eu -eu -eu -eu -fO -eu -ge -eu -eu -eu -eu -eu -eJ -aa -aa -aa -gI -gJ -gJ -gJ -gI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ah -ah -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ac -ah -ah -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ac -ah -ah -ah -ac -ac -ac -ac -af -ah -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -br -br -aG -aG -aG -aG -aG -aW -bo -bc -bc -bc -bc -bc -aW -et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -gz -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -ac -ac -ah -ah -ac -ac -ac -ac -ah -ah -ac -ac -ac -ac -ac -ah -ah -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ah -ac -ac -ac -ac -ac -ac -ac -ah -ac -ac -ab -ab -ab -ab -an -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aW -bc -bc -bc -bc -bc -bc -aW -et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eP -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -af -ac -ac -ac -ah -ah -ac -ac -ac -ac -ah -ac -ac -ac -ac -ac -ac -ah -ah -ah -ah -ah -ah -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -aa -an -aa -aa -aa -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aW -bc -bc -bc -bc -bh -bc -aW -et -et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -gC -aa -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ah -ah -ac -ac -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ah -ah -ah -ah -ah -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -an -aa -aa -aa -aa -an -an -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aW -bh -bc -bn -bc -bc -bc -aW -aW -et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -et -aG -aG -aG -aG -aG -aa -aa -aG -aG -aG -aG -aG -aG -aG -aa -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ah -ac -ac -ac -ad -ah -ah -ac -ac -ah -ah -ac -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -af -ah -ah -ac -ac -ac -ah -ah -ah -ah -ah -ac -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -an -an -an -aa -aa -aa -an -aa -aa -aa -aa -aa -aa -aa -aa -aG -aa -aG -aG -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aW -bc -bc -bc -bc -bc -bo -bc -aW -et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -et -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ah -ah -ac -ac -ac -ah -ah -ac -ac -ac -ah -ah -ah -ac -ac -af -ac -ah -ac -ac -ah -ah -ah -ah -ac -ac -ac -ac -ah -af -ac -ac -ah -ah -ah -ah -ah -ah -ah -ab -aa -aa -aa -aa -aa -aa -aa -aa -an -aa -aa -aa -an -aG -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aW -aW -aW -bc -bc -bc -bc -bc -bc -bo -aW -et -et -et -et -et -et -et -et -et -et -et -et -et -et -et -et -et -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -ac -ah -ah -ac -ac -ah -ah -ac -ac -ac -ac -ad -ah -ac -ac -ac -ac -ah -ac -ac -ah -ac -ac -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ac -ah -ah -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aW -aW -bb -bc -bc -bo -bc -bc -bc -bc -aW -aW -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aG -aG -aG -aG -aN -aN -aN -aG -aG -aN -aN -aN -aN -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ah -ah -ac -ac -ah -ah -ah -ac -ac -ac -ah -ah -ah -ad -ac -ah -ac -ac -ah -ac -ac -ac -ah -ah -ah -ah -ah -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -bh -bc -bc -bc -bc -bc -bh -aW -aW -aW -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aR -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aT -aT -aT -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -ac -ac -ac -ac -ah -ah -ac -ac -ac -ah -ah -ah -ac -ac -ac -ah -ah -ac -ah -ac -ac -ah -ac -ac -ac -ah -ad -ac -ac -ac -ac -ah -ah -ah -ah -ah -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aW -aW -aW -aW -aW -bt -bc -bc -bh -bc -bc -bc -bc -bh -bc -bc -bc -bc -bo -bc -bc -bc -bc -bc -bc -aW -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aT -aT -aT -aT -aT -aN -aN -aN -aN -aN -aN -aN -aN -aN -aT -aT -aT -aT -aN -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ad -ah -ac -ac -ac -ac -ac -ac -ah -ac -ac -ah -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ad -ah -ah -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -bg -bg -aW -bh -bc -bc -bc -bc -bc -bc -bc -bc -bc -bo -bc -bc -bh -bc -bc -bc -bc -bc -bc -bc -bh -bc -bc -aW -aN -aN -aN -aN -aT -aT -aN -aN -aN -aN -aN -aR -aT -aT -aT -aT -aT -aN -aN -aN -aN -aT -aN -aN -aN -aT -aT -aT -aT -aT -aN -aT -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ac -ah -ah -ah -ac -ac -ac -ac -ah -ac -ac -ah -ah -ah -ac -ac -ac -ac -ah -ah -ah -ac -ac -af -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aW -aW -aW -aW -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -aW -aW -aW -aN -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aN -aT -aT -aT -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ac -ac -ac -af -ac -ac -ah -ah -ah -ah -ah -ah -ac -ac -ac -af -ah -ah -ah -ah -ah -ah -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aW -bb -bc -bc -bh -bc -bc -bc -bq -bc -bc -bc -bh -bc -bc -bc -bo -bc -bc -cT -bc -bc -bc -bc -bc -bh -bo -aW -aW -aN -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aT -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ah -ac -ac -ac -ac -ac -ac -ac -ac -ad -ah -ah -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ah -ah -ah -ab -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aW -bc -bc -bc -bc -bc -bn -bc -bc -bh -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bh -bc -bo -bc -bc -bc -aW -aN -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -aj -ac -ac -ac -ac -ac -ac -ah -ah -ah -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ab -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aV -aW -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bh -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -aW -aW -aW -aN -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -af -ac -ac -ac -ad -ac -ac -ac -ac -ah -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ah -ah -ac -ac -ac -ac -ac -ac -ac -ah -ah -ac -ac -ac -ac -ab -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aV -aW -bc -bc -bc -bc -bc -bo -bc -bh -bc -bc -bc -bc -bc -bc -bo -bc -bc -bc -bc -bc -bc -di -bc -bh -aW -aN -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aZ -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aT -gV -gV -gV -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ah -ah -ah -ah -ac -ac -ac -ac -ac -ac -ac -ah -ah -ac -ac -ac -ah -ah -ah -ah -af -ac -ac -ac -ac -ab -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aW -aW -bc -bc -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aW -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aT -aT -aT -aT -aP -aN -aN -aT -aT -aT -gV -gV -gV -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ah -ac -ac -ac -ac -af -ac -ah -ah -ah -ah -ah -ad -ac -ac -ac -ac -ah -ac -ac -ab -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aN -aN -aN -bu -aW -bd -bd -aW -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aT -aT -aT -aT -aT -aZ -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aN -aN -aT -aT -aT -aN -aN -aN -aN -aT -aT -aT -aT -aT -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -ac -ac -ac -ac -ac -ak -ac -ac -ac -af -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ah -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ac -ac -ab -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aN -aN -aT -aT -aT -aN -aN -aN -aN -aT -aT -aT -aT -aT -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ah -ah -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ah -ac -af -ab -ab -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aN -aN -aR -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aY -aT -aT -aT -aT -aT -ba -aT -aT -aT -aT -aT -aT -aT -aY -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -bf -aT -aT -aT -aR -aN -aN -aT -gx -aN -aN -aT -aT -aT -aT -aN -aN -aN -aN -aN -aT -aT -aT -aP -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ac -ac -af -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ac -ac -ac -ac -ac -ah -ah -ah -ah -ad -ac -ac -ac -ac -ab -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aN -aN -aI -aT -aT -aT -aT -aT -aT -aT -aT -aT -aZ -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aP -aN -aT -aT -aT -aT -aT -aN -aN -aN -aP -aN -aT -aT -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aj -ac -ac -ak -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ah -ah -ah -ah -ah -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aH -aT -aI -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aN -aT -aT -aT -aN -aN -aT -aT -aT -aT -aN -aN -aN -aT -aT -aT -aT -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -al -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -al -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aM -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -bf -aT -aT -aT -aT -aT -aZ -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aT -aN -aN -aN -aT -aT -aT -aN -aN -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -gY -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -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 -ah -aF -aF -ah -ah -ah -ah -ah -ah -ab -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aI -aT -aT -aT -aT -aT -aZ -aT -aT -aT -bj -bl -bj -bj -bj -bm -bj -bj -bj -bj -bk -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bk -bs -aT -aY -aT -aT -ej -aT -aT -aT -aT -aT -aN -aN -aN -aT -aT -aT -aN -aN -aN -dw -aT -aT -aN -aN -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aT -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -af -ac -ac -ac -ac -ac -ac -ac -ak -ac -ac -ac -ac -ac -aj -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aG -aG -aG -aG -aG -aG -aG -aG -aN -aI -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bk -bj -bj -bj -bj -bj -bj -bj -bj -bj -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aN -aT -aT -aN -aN -aN -aT -aT -aT -aT -aN -aP -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -aD -aD -aD -aD -ad -ac -ac -ac -ac -ab -aa -aG -aG -aG -aG -aG -aG -aG -aG -aN -aR -aT -aT -aT -aT -aT -aT -be -aT -aT -bj -bj -bj -bj -bj -bj -bj -bj -bj -bm -bj -bj -bj -bj -bj -bj -bm -bj -bj -bk -dy -bj -bj -aT -aT -aT -aT -aT -aT -aT -aZ -aT -aT -aT -aT -aN -aN -aN -aT -aN -aN -aN -aT -aT -aT -aT -aN -aN -aN -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -af -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -ac -ac -af -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aE -aD -aD -aD -ac -ac -ac -ac -ac -ab -aa -aG -aG -aG -aG -aG -aG -aG -aG -aN -aM -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bp -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -aT -aT -aT -aT -aZ -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aN -aN -aN -aP -aT -ej -aT -aT -aN -aN -aN -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -ak -ac -af -ac -ac -ac -ac -ac -ac -aD -aD -aD -aD -ac -ac -ac -ac -ac -ab -aa -aa -aG -aG -aG -aG -aG -aG -aG -aM -aM -aT -aT -aT -aT -aY -aT -aT -aT -aT -bj -bj -bj -bj -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aN -aN -aN -aN -aT -aT -ej -aT -aN -aN -aN -aT -aT -aT -aT -aN -aN -aT -aT -aT -aP -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -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 -aD -aD -aD -aD -ac -ac -ac -ac -ac -ab -ab -aa -aG -aG -aG -aG -aG -aG -aG -aG -aH -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -aT -bj -bj -bj -bj -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aN -aT -aT -aT -aT -aN -aN -aN -aN -aT -aT -aN -aN -aT -aT -aT -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ac -ac -ak -ac -ac -af -ac -ac -ac -ac -ac -ae -ac -ac -ac -ac -aj -ac -ac -ac -ac -ac -ac -ac -ac -aD -aD -aD -aD -ac -ac -ac -ac -ac -ac -ab -ab -aa -aG -aG -aG -aG -aG -aG -aG -aN -aH -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bx -by -by -by -by -bu -cI -cI -cI -cI -cI -bu -aT -bj -bj -bj -bj -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aT -aN -aN -aN -aN -aT -aT -aP -aN -aT -aT -aT -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ak -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -al -ac -ac -ad -aD -aD -aD -aD -ad -ac -ac -ac -ac -ac -ac -ab -aa -aa -aG -aG -aG -aG -aG -aG -aN -aH -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -by -bU -by -bU -by -bu -bj -bj -bE -bj -bj -bu -aT -bj -bj -bj -bp -aT -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aT -aN -aN -aN -aT -aT -aN -aN -aN -aT -aT -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aD -aD -aD -aD -ac -ac -ac -ac -ac -ac -ac -ab -ab -aa -aG -aG -aG -aG -aG -aG -aN -aH -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -by -bM -bM -cg -by -bu -bj -bj -bj -bj -bj -bu -aT -bj -bj -bj -bj -aT -bu -by -dV -dV -dV -dV -bu -bj -bj -bj -bj -fp -bu -aT -aT -aT -aT -aT -aT -aT -aN -aN -aT -ej -aT -aT -aN -aN -aN -aT -aT -aN -aN -aT -aT -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -al -ac -ac -af -ac -ac -ac -ac -ac -ac -ac -ac -af -ac -ac -ac -ac -ac -ad -ac -ac -ac -ac -ac -ac -ac -aD -aD -aD -aE -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aG -aG -aG -aG -aG -aG -aG -aM -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bz -bM -bM -ch -by -bu -bj -bu -cI -cI -cI -bu -aT -bj -bj -bj -bj -aT -bu -by -by -bz -by -by -bu -bj -bj -bj -bj -bu -bu -aT -aT -aT -aT -aT -aT -aT -aT -aN -aP -aT -aT -aT -aT -aN -aN -aT -aT -aT -aT -aT -aT -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aD -aD -aD -aD -ac -ac -ac -ac -ac -al -ac -ac -ab -aa -aa -aG -aG -aG -aG -aG -aN -aH -aT -aT -aT -aT -aT -aT -aT -aT -bk -bk -bj -bj -aT -bu -by -bM -bM -bM -by -bu -bj -bu -bu -bu -bu -bu -aT -bj -bj -bj -bj -aT -bu -by -by -ek -by -by -by -bj -eS -bj -bj -fp -bu -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aY -aT -aT -aN -aN -aN -aT -aT -aT -aT -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aj -ac -ac -ac -ac -ac -ac -af -ac -ac -aD -aD -aD -aD -ac -aj -ac -ac -ac -ac -ac -ac -ab -ab -aa -aG -aG -aG -aG -aG -aM -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bm -bj -bj -aT -bu -by -bV -by -bV -by -bu -bj -bj -bj -bj -bj -ci -dt -du -du -bj -bj -aT -bu -by -by -by -ev -by -by -bj -bj -bj -bj -bu -bu -aT -bu -bu -bu -bu -bu -bu -bu -bu -aN -aN -aQ -ej -aT -aY -aQ -aN -aN -aN -aP -aT -aT -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -aj -ac -ac -ac -ac -ac -ac -ac -ac -ae -ac -ac -ac -ac -aj -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -aD -aD -aD -aD -ad -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aG -aG -aG -aG -aG -aM -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -by -by -by -by -by -bu -bj -bj -bj -bj -bj -ci -aT -bm -bj -bj -bj -aT -bu -by -by -by -by -by -bu -bj -bu -bj -dy -fp -bu -aT -bu -gf -bj -bj -bj -bj -bj -bu -aT -aT -aT -aT -ej -aT -aT -aT -aN -aN -aN -aN -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -af -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ak -ac -ac -ac -ac -ac -ac -ac -ac -aD -aD -aD -aD -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aG -aG -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bu -bu -bu -bu -ci -bu -bj -bu -bu -bu -bu -bu -aT -bj -bj -bj -bj -aT -bu -by -dW -dW -dW -dW -bu -bj -bu -fe -bk -bu -bu -aT -bu -bj -bj -bj -dy -bj -bj -bu -aT -aT -aY -aT -aT -aT -aT -aT -aN -aN -aG -aG -aG -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ag -ag -ac -ac -ac -ac -ac -af -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aD -aD -aD -aD -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aG -aG -aG -aG -aN -aR -aT -aT -aT -aT -aT -bf -aT -aT -bj -bj -bj -bj -aT -bu -bA -bj -bj -bu -bj -bj -bj -bu -bj -cY -cY -bu -aT -bj -bj -bj -bj -aT -bu -bu -bu -bu -bu -bu -bu -bj -bu -fe -bj -fp -bu -aT -bu -bj -bj -bj -bj -bl -bj -bu -aT -ej -aT -aT -aQ -aN -aN -aN -aN -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ag -ag -ag -ac -ac -ac -ac -ac -ac -ac -ac -af -ac -ac -ac -af -ac -ac -aj -ac -ac -ac -ac -ac -aD -aD -aD -aD -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -aa -aG -aG -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bB -bj -bj -bu -bj -bj -bj -bj -bj -bj -bj -dj -aT -bj -bj -bk -du -dt -ci -bj -bj -bj -bj -bj -ci -bj -bu -fe -bj -bu -bu -aT -bu -bj -bj -bj -bj -bj -bj -bu -aT -aT -aT -aT -aN -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ac -ac -ac -ag -ac -ac -aj -ac -ag -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aD -aD -aD -aD -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bC -bj -bj -bu -bj -bj -bj -bj -bj -bj -bj -dj -aT -bj -bj -bj -bj -aT -bu -bu -bu -bu -bu -bu -bu -bj -bu -fe -bj -bu -bu -aT -bu -bj -bl -bj -bj -bp -bj -fs -aT -aN -aP -aN -aN -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ag -ac -ac -ac -ac -ac -am -ac -ac -ac -ac -ag -ag -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -aD -aD -aD -aD -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aG -aG -aG -aN -aT -aT -aT -aT -aT -aT -aY -aT -bj -bj -bj -bj -aT -bu -bB -bj -bj -bu -bj -bj -bj -bu -bj -bj -bj -bu -aT -bj -bj -bj -bm -aT -bu -dG -dG -el -dG -dG -bu -bj -bu -bj -bj -fp -bu -aT -bu -bj -bj -gk -bj -bj -bj -en -aT -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ag -ac -ac -ac -ac -ag -ac -ac -ac -ac -ag -ac -ac -ac -ac -ac -ac -ac -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -aD -aD -aD -aD -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -aa -aa -aG -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bD -bj -bj -ci -bj -bj -bj -bu -bj -cZ -cZ -bu -aT -bj -bj -bj -bj -aT -bu -by -by -by -by -by -by -bj -bj -bj -bj -bu -fs -aT -bu -bj -gj -bl -bj -bj -bj -bu -fs -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ag -ag -al -ac -ac -ag -ac -ac -ac -ag -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -af -ac -ac -ac -aE -aD -aD -aD -ac -ac -ac -ac -ac -ac -ab -ab -ab -aa -aa -aa -aa -aa -aa -aG -aN -aT -aT -aT -aT -aZ -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -aT -bj -bj -bj -bj -aT -bu -by -by -ek -by -by -by -bj -bj -bj -bj -fp -bu -aT -bu -bj -bj -dy -bj -dy -bj -bu -bu -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ag -ac -ac -ac -ag -ac -ac -ac -ag -ac -ac -ac -ac -ac -aC -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aD -aD -aD -aD -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -by -by -by -bz -by -bu -bj -bj -bj -bj -bu -bu -aT -bu -bj -bl -bj -gv -bj -dP -bu -bu -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ag -ag -ac -ag -ac -ac -ac -af -ag -ac -ac -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aD -aD -aD -aD -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -bs -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bm -bj -bj -bj -bj -bj -bj -aT -bu -by -by -by -by -by -bu -bj -bj -bj -bj -fp -bu -aT -bu -bj -dP -dP -bj -bj -bj -bu -aT -aN -aN -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ag -ac -ag -ac -ag -ac -ac -ac -ag -ac -ac -ac -ac -ac -ac -ak -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -aD -aD -aD -aD -ad -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aT -aT -aT -aT -aY -aT -aT -aT -bi -bl -bj -bj -bj -bj -bj -bj -bj -bm -bp -bj -cA -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -aT -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -fP -bu -bj -bj -bj -bj -bj -bj -bu -aT -aN -aN -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ag -ac -ag -ac -ag -ac -ac -ac -ag -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -bj -bj -bE -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bl -bj -bj -bj -bj -bj -aT -aT -aT -aT -aT -aT -aT -aY -dt -dt -dt -dt -fr -aT -aY -fs -bu -bu -ci -eM -bu -bu -bu -aT -aN -aN -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -ac -ag -ac -ag -ac -ac -ag -ac -ag -ag -ac -ag -ag -ac -ac -ac -ac -ac -ag -ac -ac -ac -al -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bm -bj -bj -bj -bj -cA -bj -bj -aT -aT -aT -aT -aT -aT -aT -aT -aT -aY -aT -fk -aZ -aT -fQ -dt -dt -fC -aT -aT -aY -aT -aT -aT -aT -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -am -ag -ag -ac -ac -ag -ac -ag -ac -ac -ag -ac -ac -ac -ac -ag -ag -ag -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 -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -fs -fB -fs -bu -eM -bu -bu -bu -bu -bu -bu -aT -aT -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ag -ag -ag -ad -ag -ac -ag -ac -ag -ag -ac -af -ac -ac -ag -ac -ac -ac -ac -ac -ac -ac -ac -ak -ac -ac -ac -ac -al -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -aT -bj -bj -bj -bj -aT -bu -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bu -aT -bu -fY -bj -bj -bj -bj -bj -bj -bu -aT -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -ac -ag -ac -ag -ag -ag -ag -ag -al -ag -ac -ac -ac -ac -ag -ag -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aN -aN -aT -aT -aT -aT -aT -aZ -aT -aT -bj -bj -bj -bj -aT -bu -bF -bF -bF -bF -bF -bF -bD -bj -bj -da -bj -bu -aT -bj -bj -bj -bj -aT -bu -dH -bj -dH -bj -bj -eE -bj -dH -bj -bj -bu -aY -bu -bj -bj -bj -bj -bj -bj -bj -bu -aT -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ag -ac -ag -ag -ag -ag -ac -ac -ag -ac -ac -ac -ag -ag -ac -ac -af -ac -ac -ac -ac -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bm -bj -bj -aT -bu -bF -bF -bF -cj -bF -bF -bD -cl -bj -bD -bj -bu -aT -bj -bj -bj -bj -aT -bu -bj -bj -bj -bk -bj -bj -bj -bj -bj -bj -bu -aT -bu -bj -bj -dP -bj -bj -cA -bj -bu -aT -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ag -ag -aj -ac -ag -af -ag -ac -ac -ac -ac -ag -ac -ac -ac -ag -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 -aG -aG -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bF -bF -bF -bF -bF -bF -bD -cl -bj -db -bj -bu -aT -bj -bj -bm -bj -aT -bu -dH -bj -dH -bj -bj -dH -bj -eF -bj -bj -eM -aT -bu -bj -bj -bj -bj -bj -bj -bj -eM -aT -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ag -ag -ag -ac -ag -ag -ag -ag -ag -ac -ag -ag -aB -ac -ag -ag -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bF -bF -bF -bF -cv -bF -bD -cl -bj -bj -bj -dj -aT -bj -bj -bj -bj -aT -bu -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bu -aT -bu -bj -dy -bj -bj -gw -bj -bj -dj -aT -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -aj -ac -ag -ag -ag -ac -ag -ag -ag -ac -ag -ac -ag -ag -ac -ag -ag -ac -ac -ac -ac -ac -ac -ac -ac -ak -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aN -aN -aT -aT -aT -aZ -aT -aT -aT -bj -bj -bj -bj -aT -bu -bF -bF -bF -ck -bF -bF -bD -cl -bj -da -bj -dj -aT -bj -bj -bj -bj -aT -bu -dH -bj -dH -bj -bE -dH -bj -dH -bj -bj -bu -aT -eM -bj -cA -bj -bj -bj -bj -bj -dj -aT -aT -aN -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ag -ag -ag -ag -ag -ag -ag -ag -ac -ag -ag -ag -ac -ag -ag -ac -ac -ag -ag -ac -ac -ac -ac -ac -ac -ac -ac -af -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bF -bF -bF -cj -bF -bF -bD -cl -bj -bD -bj -dj -aT -bj -bj -bj -bj -aT -bu -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bu -fC -bu -bj -bj -bj -bj -dy -bk -bj -bu -aT -aT -aN -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -ac -ag -ag -ag -ag -ac -ag -ac -ag -am -ag -ac -ag -ag -ac -ac -ag -ag -ac -af -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bm -aT -bu -bF -bF -bF -bF -bF -bF -bD -cl -bj -db -bj -bu -aT -bj -bj -bj -bj -aT -bu -dH -bj -dH -bj -bj -eF -bj -dH -bj -bj -bu -fD -bu -bj -bj -bj -bj -bj -bj -bj -bu -aT -aN -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ag -ag -ag -ac -ad -ag -ac -ag -ag -ac -ag -ag -ag -ag -ag -ag -ac -ac -ac -ac -ac -ac -ac -ac -af -ac -ac -ac -ac -ad -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bD -bj -bD -bD -bD -bD -bD -bj -bj -bj -bj -bu -aT -bj -bj -bj -bj -aT -bu -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bu -aY -bu -bj -bj -bj -bj -bj -bj -bj -bu -aT -aN -aN -aN -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ag -ag -ag -ag -ac -ac -ag -ag -ag -ag -ag -ag -ag -ag -ag -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aG -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -gH -bD -bj -bD -cl -bj -bj -bj -bj -bj -da -bj -bu -aT -dv -bj -bj -bj -aT -bu -dH -bj -dH -bj -bj -dH -bj -dH -bj -bj -bu -aT -bu -bj -bj -cA -bj -dP -bj -bj -bu -aT -aT -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ag -ag -ag -ac -ac -ag -ag -ag -ag -ag -ag -ac -ag -ac -ac -ac -ag -ac -ac -ac -ac -ac -ac -ac -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aG -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -bk -bj -bj -bj -aT -bu -bD -bj -bD -cl -bj -bj -bj -bj -bj -bD -bj -bu -aT -bj -bk -bj -bj -aT -bu -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bu -aT -bu -bj -bj -bj -bj -bj -bj -bj -bu -aT -aT -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ag -ag -ag -ac -ag -ag -ag -ag -ag -ac -ag -ag -ac -ag -ag -ag -ac -ac -ac -ag -ag -ag -ac -ac -ac -ac -ac -ac -ak -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aG -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bG -bj -bD -cl -bj -bj -bj -bj -bj -db -bj -gH -aT -bj -bj -bj -bj -aT -bu -bu -bu -bu -bu -ci -bu -bu -bu -bu -bu -bu -aT -bu -bu -dm -bu -bu -eM -bu -fs -bu -fr -aN -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ac -ag -ag -ag -ag -ac -ag -ag -ag -ag -ag -ag -ag -ac -ag -am -ag -ag -ag -ag -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aG -aG -aG -aN -aN -aT -aT -aT -ba -aT -aT -bf -aT -bj -bj -bj -bj -aT -bu -bD -bj -bD -cl -bj -bj -cA -bj -bj -bj -bj -bu -aT -bj -bj -bj -bj -aT -aT -aT -aT -aT -aT -aT -aT -eK -aT -aT -aT -fr -aT -aT -aT -aT -aT -dw -aT -aT -aT -aT -aT -aT -aT -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ag -ag -aj -ab -ab -ag -ab -ab -ag -ag -ag -ag -ag -ag -ag -am -ag -ac -ac -ac -ac -ac -ag -ac -ac -ac -ac -al -ac -ac -ac -ac -ac -ac -ak -ac -ac -ac -ab -aa -aa -aa -aG -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bH -bj -bD -cl -bj -bj -bj -bj -bj -da -bj -bu -aT -bj -bj -bj -bj -bj -bl -bj -bm -bj -bj -bj -bj -bj -eT -bj -bj -bj -bj -bl -bj -bj -bj -bj -bj -aT -aZ -aT -aT -aT -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ad -ag -ag -ab -ag -ag -ag -ab -ag -ag -ag -ag -ag -ac -ac -ag -ag -ag -ag -ag -ag -ag -ag -ac -ac -ac -ac -ac -ac -ac -ak -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aG -aG -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bk -aT -bu -bI -bj -bD -cl -bj -bj -bj -bj -bj -bD -bj -dm -aZ -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -dy -bj -ff -bj -bj -bj -bj -fZ -bl -gk -bj -bj -aT -aT -aT -aT -aT -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ac -ab -ab -ag -ab -ag -ab -ab -ag -ag -ag -ag -am -ag -ag -ac -ac -ac -ac -ac -af -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aG -aG -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bD -bj -bC -cl -bj -bj -bj -bj -bj -db -bj -dn -dt -du -du -du -du -dy -bj -bj -bj -bj -bj -bp -bj -bj -bj -ff -bj -cA -bj -bj -bj -bj -bj -bj -bj -aT -aT -aT -aT -aT -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ac -ac -ac -ab -ag -ac -ag -ag -ag -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ac -ac -ac -ac -ac -ac -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aG -aG -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bD -bj -bD -cl -bj -bj -bj -bj -bj -bj -bj -bu -aT -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -fl -bj -bj -fR -bj -bj -bj -bj -bj -aT -aT -aT -aT -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ab -ag -ag -ag -ag -ag -ab -ag -ag -ag -ac -ac -ac -ac -ad -ac -ac -ag -ag -ag -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -ac -ac -ac -ac -ab -aa -aa -aG -aG -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bp -bj -bj -aT -bu -bj -bj -cb -bj -bj -bj -bj -bj -bj -da -bj -bu -aT -bj -bj -bj -bj -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -ft -bu -ci -ci -bu -bu -eM -bu -bu -bu -bu -aN -aN -aN -aN -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ac -ac -ac -ab -ac -ad -ag -aB -ac -ab -ac -ac -ag -ag -ag -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ak -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aG -aG -aG -aG -aG -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bj -bj -bD -bj -bj -bj -bj -bj -bj -bD -bj -bu -aT -bj -bj -bj -bj -bu -bj -bj -bj -bj -bj -bj -dP -bj -bj -bj -bu -fu -fu -bj -bj -fu -fu -gs -fu -bj -bj -bu -aN -aN -aN -aN -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ao -ab -ab -ab -ab -ab -ac -ad -ag -ag -ag -ag -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aG -aG -aG -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bj -bj -bD -bj -bj -bj -bj -bj -bj -db -bj -bu -aT -bm -bj -bj -bj -bu -bj -bF -bF -bF -bF -bF -bF -bF -bF -bj -bu -bj -bj -bj -bj -bl -bj -bj -bj -bj -bj -bu -aN -aN -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ar -au -ax -ao -ao -ao -ao -ao -ao -ab -ac -ac -ac -ac -ac -ag -ac -ac -ac -ac -ac -ac -ac -ac -af -ac -ac -ac -ac -ac -ac -ac -ak -ac -ac -ac -ac -ab -aa -aG -aG -aG -aG -aG -aN -aN -aT -aT -aT -aT -aY -aT -aT -aT -bj -bj -bj -bj -aT -bu -bj -bj -bD -bj -bj -bj -bj -bj -bj -bj -bj -bu -aT -bj -bj -bl -bj -bu -bj -dI -dX -dk -dX -dk -dX -dk -bF -bj -bu -bj -bj -bj -bj -bj -bj -bj -bj -cA -bj -bu -aN -aN -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -as -av -ay -ao -ao -ao -ao -ao -ao -ab -ac -ac -ac -af -ac -ac -ac -ac -ac -al -ac -ac -ac -ac -ac -ac -af -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aG -aG -aG -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bj -bj -bD -bD -bD -bD -bD -bj -bj -da -bj -bu -aT -bj -bj -bj -bj -bu -bj -bF -dY -dZ -eb -ea -dZ -eb -bF -bj -bu -bD -bD -bD -bD -bD -bD -bD -bD -bD -bj -bu -aN -aN -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -at -aw -az -ao -ao -ao -aq -ao -ao -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aG -aG -aG -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -by -by -by -by -by -by -bD -cl -bj -bD -bj -bu -aT -bj -bj -bj -bj -bu -bj -dJ -dZ -eo -eo -eo -eo -dZ -dO -bj -bu -bj -fE -bj -fE -bj -bj -fE -bj -bD -bj -bu -aN -aN -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ao -ao -ao -ao -ao -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 -ab -aa -aa -aa -aG -aG -aG -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -bm -bj -bj -bj -aT -bu -by -by -by -by -by -by -bD -cl -bj -db -bj -dj -aT -bj -bj -cA -bj -bu -bj -dK -ea -eo -eo -eo -eo -dY -eV -bj -bu -bj -bj -bj -bj -bj -bj -bj -bj -bj -cA -bu -aN -aN -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ao -ao -ao -ao -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aG -aG -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -bm -bj -bj -bj -aT -bu -bJ -by -by -by -by -by -cJ -cl -bj -bj -bj -dj -aT -bj -bj -bj -bj -bu -bj -bF -eb -dZ -eb -ea -eG -ea -eW -bj -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -ci -bu -aN -aN -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ao -ao -ao -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bK -by -by -by -by -by -cK -cl -bj -da -bj -dj -aT -bj -bj -bm -bj -bu -bk -bF -ec -dN -ec -dN -eH -dN -bF -bj -bu -bj -bj -bj -bj -bj -bj -bj -bu -bj -bj -bu -aN -aN -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ao -ab -ab -ab -ab -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 -ab -ab -aa -aa -aa -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bL -by -cd -by -by -by -bD -cl -bj -bD -bj -bu -aT -bj -bj -bj -bj -bu -bj -bF -bF -dI -ew -bF -bF -eL -bF -bj -bu -bj -fF -bj -fF -bj -fF -bj -bu -bj -bj -bu -aN -aN -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ao -aA -ao -ab -ab -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 -ab -ab -ab -ab -aa -aa -aa -aa -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bM -by -by -by -by -by -bD -cl -bj -db -bj -bu -aT -bj -bj -bj -bj -bu -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bu -bj -bD -fS -bD -bD -bD -bj -ci -bl -bj -bu -aN -aN -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ao -ao -ab -ao -aq -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aG -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bN -by -by -by -by -by -bD -bj -bj -bj -bj -bu -aT -bj -bj -bj -bj -bu -bu -dL -bu -bu -bu -bu -bu -bu -dL -bu -bu -bj -fE -bj -fE -bj -fE -bj -bu -bj -bj -bu -aN -aN -aN -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -aq -ao -ao -ao -ao -ao -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -aT -bj -bj -bj -bj -bu -dE -bj -bj -dE -dE -bu -bA -bj -bj -bj -bu -bj -bj -bE -bl -bj -bj -bj -eM -bj -dP -bu -aN -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ao -ao -ao -ao -ao -ao -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 -aG -aG -aG -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bp -bu -dE -bj -bj -eq -dE -bu -bA -bj -cA -bj -bu -bu -bu -bu -bu -bu -bu -bu -bu -cA -bj -bu -aN -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ao -ao -ao -ao -ao -ao -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 -aG -aG -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bm -bj -bj -bj -bj -cA -bj -bl -bj -bj -bj -bu -dE -bj -bj -bj -bj -bu -bA -bj -bj -bj -bu -bj -bj -bl -bj -bj -bj -bj -bu -bj -bj -bu -aN -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ao -ao -ao -ao -ao -ao -ao -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 -aa -aG -aG -aG -aN -aN -aT -aT -aT -aT -aZ -aT -aT -aT -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bu -dE -bj -bj -bj -bj -bu -bA -bj -bj -bj -bu -bj -fG -bj -fG -cA -fG -bj -bu -bj -bj -bu -aN -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ao -ao -ao -ao -ao -ao -ao -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 -aa -aG -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bm -bj -bj -bj -bj -bj -bj -bE -bj -bj -bp -bj -bj -bj -bj -bm -bj -bj -bj -bm -bj -bu -dE -bj -dP -bj -bj -bu -bA -bj -bl -bj -bu -bj -bD -bD -bD -gg -bD -bj -ci -bj -bj -bu -aN -aN -aN -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ap -ao -aq -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 -aa -aa -aG -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bj -bu -bj -bj -bj -bj -cA -bu -bA -bj -bj -bj -bu -bj -fH -bj -fH -bj -fH -bj -bu -bj -bj -bu -aN -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aG -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -bu -dE -bj -bj -bj -bj -bu -bA -bj -bj -bj -bu -bj -bj -bj -bj -bj -bj -bj -bu -bj -bj -bu -aN -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -bf -aT -aT -aT -aT -aT -aT -aZ -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -bu -bu -bu -bu -bu -dL -bu -bu -bu -dL -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bj -gk -bu -aN -aN -aN -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aY -aT -aT -aT -aT -aT -aT -aT -aT -aT -cB -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -bu -bj -dM -bD -dM -bj -bj -bj -bu -eX -eX -eX -fv -eX -dj -bj -bu -gl -gt -bu -bj -cA -bu -aN -aN -aN -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aZ -aT -aT -ba -aT -aT -aT -aT -aT -bu -bj -cA -bj -bj -bj -eC -dM -bu -eX -eX -eX -fw -eX -dj -bj -bu -gm -bj -eM -bj -bj -bu -aN -aN -aN -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -dw -aT -aT -aT -bu -bj -bj -bj -bj -bj -eC -bD -bu -eY -eX -fn -fx -eX -dj -bj -bu -bu -ci -bu -bj -bj -bu -aN -aN -aN -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -dj -bj -bj -bj -bj -dP -eC -bD -bu -eZ -fg -eX -eX -fI -bu -bj -bj -dP -bj -bj -bl -bj -bu -aN -aN -aN -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aZ -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -dj -bj -bl -bj -bj -bj -eC -dM -bu -fa -fh -eX -fv -eX -dL -bj -bj -bj -bj -bj -bj -bj -bu -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aG -aN -aN -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aZ -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aZ -aT -aT -bu -bj -bj -bj -cA -bj -bj -bj -eM -fa -fi -fi -fw -eX -bu -dj -dj -dj -dj -dj -bu -bu -bu -aN -aN -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aG -aG -aN -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aY -aT -aT -aT -aT -aT -aT -aT -aT -aT -bu -bj -bj -bj -bj -bj -bj -bj -bu -fb -eX -eX -fx -eX -eX -eX -eX -eX -eX -eX -eX -eX -bu -aN -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aG -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -bu -bj -dP -bj -bj -bj -bj -bj -bu -fb -eX -eX -eX -fI -fT -fw -gh -eX -gu -fw -gh -eX -bu -aN -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aG -aN -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -bu -bj -bj -bj -bj -bj -bj -bj -bu -eX -eX -eX -eX -eX -eX -eX -eX -eX -eX -eX -eX -eX -bu -aN -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aG -aG -aG -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -bu -bu -dQ -bu -dQ -bu -dQ -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -aN -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aG -aG -aG -aG -aG -aG -aN -aN -aT -aT -aT -aN -aN -aT -aT -aT -aT -aT -aT -aT -aN -aN -aN -aT -aT -aT -aT -aT -aT -aT -aT -aT -aT -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aG -aG -aG -aG -aG -aG -aN -aN -aN -aN -aN -aN -aN -aN -aT -aT -aN -aN -aN -aT -aT -aT -aN -aN -aT -aT -aT -aT -aN -aT -aN -aN -aT -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aG -aN -aN -aN -aN -aN -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aG -aa -aG -aG -aG -aG -aG -aG -aG -aG -aN -aN -aN -aN -aN -aG -aG -aG -aG -aG -aN -aN -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aG -aG -aG -aG -aG -aG -aa -aa -aa -aG -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aG -aG -aG -aG -aG -aa -aG -aG -aG -aG -aG -aG -aa -aa -aG -aG -aa -aa -aG -aG -aa -aa -aa -aa -aa -aG -aG -aG -aG -aa -aG -aG -aG -aG -aG -aG -aG -aG -aG -aa -aa -aG -aG -aG -aG -aG -aG -aa -aa -aa -aa -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aG -aG -aG -aa -aa -aa -aG -aa -aG -aG -aG -aa -aa -aa -aa -aG -aa -aa -aG -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aa -aG -aa -aa -aG -aa -aG -aG -aa -aa -aa -aa -aG -aG -aa -aa -aG -aa -aa -aa -aa -aa -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aG -aa -aa -aa -aa -aa -aa -aG -aG -aa -aa -aa -aa -aa -aa -aa -aG -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aa -aa -aa -aa -aa -aa -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aa -aa -aa -aa -aa -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aG -aa -aa -aa -aa -aa -aa -aa -aa -aG -aG -aa -aa -aa -aa -aa -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aG -aa -aa -aa -aa -aa -aa -aG -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aG -aG -aa -aa -aa -aa -aa -aa -aG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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/RuinGeneration/11x11_2_room_cafeteria.dmm b/_maps/RuinGeneration/11x11_2_room_cafeteria.dmm new file mode 100644 index 0000000000000..97deeed416a54 --- /dev/null +++ b/_maps/RuinGeneration/11x11_2_room_cafeteria.dmm @@ -0,0 +1,214 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"l" = ( +/obj/effect/decal/cleanable/food/salt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"m" = ( +/obj/structure/chair, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"p" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/obj/structure/table, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"z" = ( +/obj/structure/table_frame, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"F" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"G" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/lootdrop/donkpockets, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"I" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/lootdrop/pizzaparty, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"K" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/chair, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"M" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"U" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Y" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +u +u +u +u +u +p +u +u +u +u +u +"} +(2,1,1) = {" +u +Y +Y +Y +Y +Y +Y +Y +Y +Y +u +"} +(3,1,1) = {" +u +Y +K +q +F +Y +m +q +F +Y +u +"} +(4,1,1) = {" +u +Y +m +z +F +Y +m +q +F +Y +u +"} +(5,1,1) = {" +G +Y +m +z +F +Y +m +q +F +Y +u +"} +(6,1,1) = {" +b +Y +Y +Y +Y +Y +l +Y +Y +Y +u +"} +(7,1,1) = {" +I +Y +m +q +F +Y +m +z +F +Y +u +"} +(8,1,1) = {" +u +Y +m +q +F +Y +m +q +M +Y +u +"} +(9,1,1) = {" +u +Y +m +q +F +Y +m +q +F +Y +u +"} +(10,1,1) = {" +u +Y +Y +Y +Y +Y +Y +Y +Y +Y +u +"} +(11,1,1) = {" +u +u +u +u +u +U +u +u +u +u +u +"} diff --git a/_maps/RuinGeneration/13x13_ai-lab.dmm b/_maps/RuinGeneration/13x13_ai-lab.dmm new file mode 100644 index 0000000000000..ce1c3bf08638b --- /dev/null +++ b/_maps/RuinGeneration/13x13_ai-lab.dmm @@ -0,0 +1,634 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"al" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/turf/open/floor/carpet/black, +/area/ruin/unpowered) +"cw" = ( +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/obj/effect/turf_decal{ + dir = 8 + }, +/turf/open/floor/circuit/red, +/area/ruin/unpowered) +"ef" = ( +/obj/effect/decal/cleanable/oil/streak, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"er" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"ew" = ( +/obj/structure/table/glass, +/obj/item/stack/cable_coil/blue{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/effect/spawner/lootdrop/ruinloot/important, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"eH" = ( +/obj/machinery/computer/upload/ai, +/turf/open/floor/monofloor, +/area/ruin/unpowered) +"fm" = ( +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/carpet/black, +/area/ruin/unpowered) +"gf" = ( +/obj/machinery/light, +/turf/open/floor/circuit/red, +/area/ruin/unpowered) +"hB" = ( +/obj/item/kirbyplants/photosynthetic{ + pixel_y = 10 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"iT" = ( +/obj/structure/table/reinforced, +/obj/item/paicard{ + desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; + name = "Nanotrasen-brand personal AI device exhibit" + }, +/turf/open/floor/carpet/black, +/area/ruin/unpowered) +"jp" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood, +/obj/item/ammo_casing/c9mm{ + dir = 4; + pixel_x = 3; + pixel_y = 2 + }, +/turf/open/floor/carpet/black, +/area/ruin/unpowered) +"lX" = ( +/obj/effect/decal/cleanable/robot_debris/old, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Telecomms - Server Room - Aft-Port"; + dir = 6; + network = list("ss13","tcomms") + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"nN" = ( +/obj/item/kirbyplants/photosynthetic{ + pixel_y = 10 + }, +/turf/open/floor/carpet/black, +/area/ruin/unpowered) +"py" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/space) +"qg" = ( +/obj/effect/decal/cleanable/oil/slippery, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"sx" = ( +/obj/effect/decal/cleanable/glass, +/obj/structure/windoor_assembly, +/turf/open/floor/circuit/red, +/area/ruin/unpowered) +"sG" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/circuit/red, +/area/ruin/unpowered) +"tj" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/item/robot_suit/prebuilt, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"to" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"tA" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/circuit/red, +/area/ruin/unpowered) +"tD" = ( +/obj/effect/abstract/doorway_marker, +/obj/machinery/door/airlock/grunge{ + name = "Artificial Intelligence research" + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"tJ" = ( +/obj/machinery/computer{ + desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; + name = "Broken Computer" + }, +/turf/open/floor/monofloor, +/area/ruin/unpowered) +"tL" = ( +/obj/structure/showcase/cyborg/old{ + pixel_y = 20 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"tO" = ( +/turf/open/floor/circuit/red, +/area/ruin/unpowered) +"tV" = ( +/obj/effect/decal/cleanable/robot_debris/limb, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"uw" = ( +/turf/template_noop, +/area/template_noop) +"vj" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"vv" = ( +/obj/structure/AIcore{ + name = "\broken AI core" + }, +/turf/open/floor/circuit/red, +/area/ruin/unpowered) +"vA" = ( +/obj/machinery/camera{ + c_tag = "Telecomms - Server Room - Aft-Port"; + dir = 1; + network = list("ss13","tcomms") + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"vX" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/poddoor/shutters/preopen, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"za" = ( +/obj/item/kirbyplants/photosynthetic{ + pixel_y = 10 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"AP" = ( +/obj/structure/window/reinforced/survival_pod{ + dir = 4 + }, +/obj/machinery/flasher{ + id = "AI"; + pixel_y = 24 + }, +/obj/effect/spawner/lootdrop/ruinloot/important, +/turf/open/floor/circuit/red, +/area/ruin/unpowered) +"BT" = ( +/obj/machinery/door/airlock/highsecurity, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "AI Core shutters"; + name = "AI core shutters" + }, +/turf/open/floor/circuit/red, +/area/ruin/unpowered) +"CO" = ( +/obj/structure/table/reinforced, +/obj/item/lighter, +/turf/open/floor/carpet/black, +/area/ruin/unpowered) +"Dy" = ( +/obj/item/ammo_casing/c9mm, +/turf/open/floor/carpet/black, +/area/ruin/unpowered) +"Fo" = ( +/obj/machinery/camera{ + c_tag = "Telecomms - Server Room - Aft-Port"; + dir = 9; + network = list("ss13","tcomms") + }, +/turf/open/floor/circuit/red, +/area/ruin/unpowered) +"Fw" = ( +/turf/open/floor/circuit/red/anim, +/area/ruin/unpowered) +"Gh" = ( +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 + }, +/obj/effect/turf_decal{ + dir = 4 + }, +/turf/open/floor/circuit/red, +/area/ruin/unpowered) +"GZ" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/structure/sign/warning/nosmoking, +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"Ib" = ( +/obj/machinery/porta_turret/syndicate/energy{ + name = "AI Chamber Turret" + }, +/turf/open/floor/pod/dark, +/area/ruin/unpowered) +"JD" = ( +/obj/structure/table/reinforced, +/obj/item/folder/white{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/folder/red{ + pixel_x = 3 + }, +/turf/open/floor/carpet/black, +/area/ruin/unpowered) +"JG" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/bot_red, +/mob/living/simple_animal/bot/floorbot, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"JS" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"Kp" = ( +/obj/structure/table/glass, +/obj/item/mmi/posibrain, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"Kx" = ( +/obj/machinery/recharge_station, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"KU" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"Lx" = ( +/obj/effect/decal/cleanable/robot_debris/old, +/obj/machinery/camera{ + c_tag = "Telecomms - Server Room - Aft-Port"; + dir = 9; + network = list("ss13","tcomms") + }, +/obj/effect/decal/cleanable/blood/tracks, +/obj/item/ammo_casing/c9mm{ + dir = 8; + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/carpet/black, +/area/ruin/unpowered) +"MV" = ( +/obj/structure/rack, +/obj/machinery/light, +/obj/item/storage/toolbox/emergency/old{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/toolbox/mechanical/old, +/obj/effect/spawner/lootdrop/ruinloot/important, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"NP" = ( +/obj/effect/turf_decal/caution/stand_clear{ + dir = 1 + }, +/obj/effect/turf_decal, +/turf/open/floor/circuit/red, +/area/ruin/unpowered) +"Os" = ( +/obj/effect/turf_decal/bot_red, +/obj/item/bot_assembly/medbot, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"Pw" = ( +/obj/structure/table/glass, +/obj/item/robot_module/borgi, +/obj/item/aiModule/core/full/damaged{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/aicard{ + pixel_x = -10 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"Qa" = ( +/obj/effect/spawner/lootdrop/ruinloot/important, +/turf/open/floor/circuit/red, +/area/ruin/unpowered) +"Qo" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/lootdrop/ruinloot/important, +/turf/open/floor/carpet/black, +/area/ruin/unpowered) +"RT" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"SV" = ( +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"WV" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/door/window{ + base_state = "rightsecure"; + dir = 1; + icon_state = "rightsecure"; + name = "Primary AI Core Access"; + obj_integrity = 300; + req_access_txt = "16" + }, +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/mob_spawn/human/corpse/nanotrasensoldier, +/turf/open/floor/carpet/black, +/area/ruin/unpowered) +"WX" = ( +/obj/machinery/door/airlock/grunge{ + name = "AI research room" + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"Xd" = ( +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal{ + dir = 1 + }, +/turf/open/floor/circuit/red, +/area/ruin/unpowered) +"YE" = ( +/obj/machinery/camera{ + c_tag = "Telecomms - Server Room - Aft-Port"; + dir = 6; + network = list("ss13","tcomms") + }, +/obj/machinery/computer{ + desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; + name = "Broken Computer" + }, +/turf/open/floor/monofloor, +/area/ruin/unpowered) +"Zy" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4; + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/ammo_casing/c9mm{ + dir = 4; + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/ammo_casing/c9mm, +/obj/item/ammo_casing/c9mm{ + dir = 8; + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/carpet/black, +/area/ruin/unpowered) +"ZS" = ( +/obj/effect/turf_decal/bot_red, +/mob/living/simple_animal/bot/secbot{ + emagged = 1; + faction = list("silicon","turret"); + name = "Officer Buzzsky" + }, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/unpowered) +"ZY" = ( +/obj/machinery/camera{ + c_tag = "Telecomms - Server Room - Aft-Port"; + dir = 6; + network = list("ss13","tcomms") + }, +/turf/open/floor/circuit/red, +/area/ruin/unpowered) + +(1,1,1) = {" +JS +JS +JS +py +JS +JS +JS +JS +JS +JS +JS +JS +JS +"} +(2,1,1) = {" +JS +eH +tj +er +Kx +MV +JS +hB +ZS +JG +Os +hB +JS +"} +(3,1,1) = {" +JS +YE +SV +SV +SV +SV +WX +RT +SV +tV +ef +SV +tD +"} +(4,1,1) = {" +JS +tJ +SV +Pw +ew +Kp +GZ +SV +ef +SV +SV +SV +JS +"} +(5,1,1) = {" +JS +vX +vX +vX +vX +vX +JS +to +SV +vj +SV +vA +JS +"} +(6,1,1) = {" +JS +Qa +tO +tO +tO +tO +KU +lX +SV +SV +SV +SV +JS +"} +(7,1,1) = {" +JS +ZY +Fw +Gh +Fw +gf +JS +tL +ef +al +JD +CO +JS +"} +(8,1,1) = {" +JS +sG +NP +Ib +Xd +tO +BT +qg +SV +iT +jp +fm +JS +"} +(9,1,1) = {" +JS +AP +Fw +cw +Fw +gf +JS +tL +SV +Qo +Zy +Dy +JS +"} +(10,1,1) = {" +JS +vv +sx +tA +Fo +tO +KU +za +SV +WV +Lx +nN +JS +"} +(11,1,1) = {" +JS +JS +JS +JS +JS +JS +JS +JS +JS +JS +JS +JS +JS +"} +(12,1,1) = {" +uw +uw +uw +uw +uw +uw +uw +uw +uw +uw +uw +uw +uw +"} +(13,1,1) = {" +uw +uw +uw +uw +uw +uw +uw +uw +uw +uw +uw +uw +uw +"} diff --git a/_maps/RuinGeneration/13x13_corgarmoury.dmm b/_maps/RuinGeneration/13x13_corgarmoury.dmm new file mode 100644 index 0000000000000..05884dc5a6ab5 --- /dev/null +++ b/_maps/RuinGeneration/13x13_corgarmoury.dmm @@ -0,0 +1,490 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/rack, +/obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/ruinloot/armoury, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"b" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/poddoor/preopen{ + id = "armourydoors"; + name = "Blast Doors" + }, +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"d" = ( +/obj/structure/rack, +/obj/item/grenade/barrier{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/grenade/barrier{ + pixel_x = 3; + pixel_y = -1 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/spawner/lootdrop/ruinloot/security, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"e" = ( +/obj/structure/sign/warning/securearea{ + pixel_x = -32 + }, +/turf/template_noop, +/area/template_noop) +"f" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/ruin/unpowered) +"i" = ( +/obj/structure/rack, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/spawner/lootdrop/ruinloot/armoury, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"j" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"k" = ( +/obj/structure/rack, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"l" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/secure_closet, +/obj/effect/spawner/lootdrop/ruinloot/armoury, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"m" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"o" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"p" = ( +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/turf/template_noop, +/area/template_noop) +"r" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/sign/poster/official/ian{ + pixel_y = 32 + }, +/obj/machinery/camera/motion{ + c_tag = "Armory Motion Sensor" + }, +/obj/item/rack_parts, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"s" = ( +/obj/effect/turf_decal/box, +/obj/effect/turf_decal/tile/red, +/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/dark, +/area/ruin/unpowered) +"t" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"u" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"v" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"x" = ( +/turf/template_noop, +/area/template_noop) +"z" = ( +/obj/structure/closet/secure_closet{ + name = "contraband locker"; + req_access_txt = "3" + }, +/obj/effect/turf_decal/bot, +/obj/effect/spawner/lootdrop/ruinloot/armoury, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"A" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"B" = ( +/obj/structure/rack, +/obj/effect/turf_decal/delivery, +/obj/effect/spawner/lootdrop/ruinloot/armoury, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"E" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"I" = ( +/obj/structure/rack, +/obj/effect/turf_decal/delivery, +/obj/effect/spawner/lootdrop/ruinloot/security, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"K" = ( +/obj/structure/sign/warning/securearea{ + pixel_x = 32 + }, +/turf/template_noop, +/area/template_noop) +"L" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"M" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"N" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/rack_parts, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"O" = ( +/obj/vehicle/ridden/secway, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red, +/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/dark, +/area/ruin/unpowered) +"Q" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"T" = ( +/obj/structure/rack, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/red, +/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/dark, +/area/ruin/unpowered) +"U" = ( +/obj/structure/rack, +/obj/item/storage/box/teargas{ + pixel_x = 1; + pixel_y = -2 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red, +/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/dark, +/area/ruin/unpowered) +"W" = ( +/obj/machinery/door/airlock/security{ + name = "Armory"; + req_access_txt = "3"; + security_level = 6 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/poddoor/preopen{ + id = "armourydoors"; + name = "Blast Doors" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) + +(1,1,1) = {" +M +M +M +M +M +M +M +M +M +M +M +M +M +"} +(2,1,1) = {" +M +x +x +e +x +t +x +t +x +x +e +x +M +"} +(3,1,1) = {" +M +x +x +x +M +M +M +M +M +x +x +x +M +"} +(4,1,1) = {" +M +x +x +M +M +B +N +U +M +M +t +t +M +"} +(5,1,1) = {" +M +t +t +M +d +A +E +E +j +M +p +x +M +"} +(6,1,1) = {" +M +x +x +M +z +Q +V +i +m +M +f +f +M +"} +(7,1,1) = {" +M +x +x +M +r +Q +s +T +m +W +v +v +b +"} +(8,1,1) = {" +M +x +x +M +l +Q +O +T +m +M +f +f +M +"} +(9,1,1) = {" +M +t +t +M +B +o +u +u +L +M +p +x +M +"} +(10,1,1) = {" +M +x +x +M +M +k +a +I +M +M +t +t +M +"} +(11,1,1) = {" +M +x +x +x +M +M +M +M +M +x +x +x +M +"} +(12,1,1) = {" +M +x +x +K +x +t +x +t +x +x +K +x +M +"} +(13,1,1) = {" +M +M +M +M +M +M +M +M +M +M +M +M +M +"} diff --git a/_maps/RuinGeneration/13x13_corgrobotics.dmm b/_maps/RuinGeneration/13x13_corgrobotics.dmm new file mode 100644 index 0000000000000..885427c4385ee --- /dev/null +++ b/_maps/RuinGeneration/13x13_corgrobotics.dmm @@ -0,0 +1,602 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/closet/secure_closet/medical2{ + req_access = list(29) + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"b" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/rack, +/obj/item/storage/belt/utility, +/obj/item/book/manual/wiki/robotics_cyborgs{ + pixel_x = 2; + pixel_y = 5 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"c" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"d" = ( +/obj/machinery/door/window/eastleft{ + dir = 1; + name = "Robotics Deliveries"; + req_access_txt = "29" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"e" = ( +/obj/effect/spawner/lootdrop/ruinloot/science, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"f" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"g" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass{ + amount = 40; + pixel_x = 3; + pixel_y = -4 + }, +/obj/machinery/requests_console{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"h" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"i" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/vending/wardrobe/robo_wardrobe{ + pixel_x = 3 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"j" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/door/airlock/hatch, +/turf/open/floor/plating, +/area/ruin/unpowered) +"k" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/eastright{ + dir = 1; + name = "Robotics Desk"; + req_access_txt = "29" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/item/paper_bin, +/turf/open/floor/plating, +/area/ruin/unpowered) +"l" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating, +/area/ruin/unpowered) +"m" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"n" = ( +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"o" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"p" = ( +/obj/structure/table, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/glasses/welding, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"q" = ( +/obj/structure/table, +/obj/item/stack/sheet/plasteel{ + amount = 10 + }, +/obj/item/assembly/flash/handheld/weak, +/obj/item/assembly/flash/handheld/weak, +/obj/item/assembly/flash/handheld/weak, +/obj/item/assembly/flash/handheld/weak, +/obj/item/assembly/flash/handheld/weak, +/obj/item/assembly/flash/handheld/weak, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/ruinloot/science, +/obj/effect/spawner/lootdrop/ruinloot/science, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"r" = ( +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/door/airlock/hatch, +/turf/open/floor/plating, +/area/ruin/unpowered) +"s" = ( +/obj/structure/table, +/obj/item/circular_saw, +/obj/item/scalpel{ + pixel_y = 12 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"t" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/latex, +/obj/item/surgical_drapes, +/obj/item/cautery, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"u" = ( +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 + }, +/obj/machinery/cell_charger, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/effect/spawner/lootdrop/ruinloot/science, +/obj/effect/spawner/lootdrop/ruinloot/science, +/obj/effect/spawner/lootdrop/ruinloot/science, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"v" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"w" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"x" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"y" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"z" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/unpowered) +"A" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"C" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"D" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"E" = ( +/obj/machinery/aug_manipulator, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"F" = ( +/obj/structure/plasticflaps/opaque, +/turf/open/floor/plating, +/area/ruin/unpowered) +"G" = ( +/turf/template_noop, +/area/template_noop) +"H" = ( +/obj/machinery/modular_fabricator/exosuit_fab, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"I" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"J" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"K" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"L" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/rack, +/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{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/healthanalyzer{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/healthanalyzer{ + pixel_x = 4; + pixel_y = -4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"M" = ( +/obj/structure/rack, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light, +/obj/effect/spawner/lootdrop/ruinloot/science, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"N" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"O" = ( +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"P" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Q" = ( +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/beaker/large, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/ruinloot/science, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"R" = ( +/obj/effect/spawner/lootdrop/crate_spawner, +/turf/open/floor/plating, +/area/ruin/unpowered) +"S" = ( +/obj/structure/table/optable{ + name = "Robotics Operating Table" + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"T" = ( +/obj/machinery/computer/rdconsole/robotics{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"U" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"V" = ( +/obj/structure/table, +/obj/item/mmi, +/obj/item/mmi, +/obj/item/mmi, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"W" = ( +/obj/structure/table, +/obj/item/retractor, +/obj/item/hemostat, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"X" = ( +/obj/structure/curtain, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Y" = ( +/obj/structure/bodycontainer/morgue, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Z" = ( +/obj/machinery/computer/operating{ + dir = 1; + name = "Robotics Operating Computer" + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) + +(1,1,1) = {" +U +A +J +A +U +U +U +U +U +U +A +A +A +"} +(2,1,1) = {" +U +p +x +E +u +A +Y +W +s +U +x +w +x +"} +(3,1,1) = {" +N +x +I +x +x +X +h +m +Z +U +x +x +c +"} +(4,1,1) = {" +z +x +e +x +x +X +D +P +S +U +x +x +x +"} +(5,1,1) = {" +k +x +x +x +n +A +a +t +V +U +A +r +A +"} +(6,1,1) = {" +U +Q +q +K +T +A +A +U +U +U +o +R +A +"} +(7,1,1) = {" +U +g +C +h +h +h +L +U +o +o +o +o +A +"} +(8,1,1) = {" +U +H +f +y +O +y +M +U +o +A +A +A +A +"} +(9,1,1) = {" +U +b +f +O +O +O +d +F +o +A +R +A +G +"} +(10,1,1) = {" +U +v +f +y +O +y +i +U +o +o +o +A +G +"} +(11,1,1) = {" +U +j +A +z +z +z +A +U +l +o +o +A +G +"} +(12,1,1) = {" +A +o +o +o +o +o +R +o +o +o +o +A +G +"} +(13,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +G +"} diff --git a/_maps/RuinGeneration/13x13_donutroom.dmm b/_maps/RuinGeneration/13x13_donutroom.dmm new file mode 100644 index 0000000000000..b08246bfd8287 --- /dev/null +++ b/_maps/RuinGeneration/13x13_donutroom.dmm @@ -0,0 +1,253 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"k" = ( +/obj/structure/chair/comfy, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"o" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/ruin/unpowered) +"s" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/obj/structure/chair/comfy{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"v" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"C" = ( +/turf/template_noop, +/area/template_noop) +"G" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"J" = ( +/obj/structure/table/wood, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"O" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"Q" = ( +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"R" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Y" = ( +/turf/closed/wall, +/area/ruin/unpowered) + +(1,1,1) = {" +Y +Y +Y +Y +Y +s +R +s +Y +Y +Y +Y +Y +"} +(2,1,1) = {" +Y +s +s +s +s +s +s +s +s +s +s +s +Y +"} +(3,1,1) = {" +Y +s +s +s +s +s +s +s +s +s +s +s +Y +"} +(4,1,1) = {" +Y +s +s +s +s +s +s +s +s +s +s +s +Y +"} +(5,1,1) = {" +Y +s +s +a +Y +o +o +o +Y +Q +s +s +Y +"} +(6,1,1) = {" +Y +s +s +u +o +C +O +C +o +k +s +s +Y +"} +(7,1,1) = {" +Y +s +s +J +o +O +O +O +o +J +s +s +Y +"} +(8,1,1) = {" +Y +s +s +u +o +C +O +C +o +k +s +s +Y +"} +(9,1,1) = {" +Y +s +s +G +Y +o +o +o +Y +a +s +s +Y +"} +(10,1,1) = {" +Y +s +s +s +s +s +s +s +s +s +s +s +Y +"} +(11,1,1) = {" +Y +s +s +s +s +s +s +s +s +s +s +s +Y +"} +(12,1,1) = {" +Y +s +s +s +s +s +s +s +s +s +s +s +Y +"} +(13,1,1) = {" +Y +Y +Y +Y +Y +s +v +s +Y +Y +Y +Y +Y +"} diff --git a/_maps/RuinGeneration/13x13_hilberttest.dmm b/_maps/RuinGeneration/13x13_hilberttest.dmm new file mode 100644 index 0000000000000..f2dc59bc6d77d --- /dev/null +++ b/_maps/RuinGeneration/13x13_hilberttest.dmm @@ -0,0 +1,341 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/table/glass, +/obj/item/stock_parts/matter_bin/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) +"b" = ( +/obj/structure/table/glass, +/obj/item/stack/cable_coil/blue, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) +"e" = ( +/turf/open/floor/plasteel/vaporwave, +/area/ruin/unpowered) +"j" = ( +/turf/open/floor/plasteel/stairs/right, +/area/ruin/unpowered) +"k" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) +"q" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"r" = ( +/obj/machinery/porta_turret/syndicate{ + desc = "A ballistic machine gun auto-turret that fires bluespace bullets."; + lethal_projectile = /obj/item/projectile/magic/teleport; + name = "displacement turret"; + stun_projectile = /obj/item/projectile/magic/teleport + }, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) +"s" = ( +/obj/item/paper/crumpled/docslogs, +/obj/item/pen, +/turf/open/floor/plasteel/vaporwave, +/area/ruin/unpowered) +"t" = ( +/obj/structure/displaycase{ + start_showpiece_type = /obj/item/hilbertshotel + }, +/turf/open/floor/plasteel/vaporwave, +/area/ruin/unpowered) +"u" = ( +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) +"y" = ( +/obj/structure/table/glass, +/obj/item/stock_parts/subspace/amplifier, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) +"A" = ( +/turf/open/floor/plasteel/stairs/medium, +/area/ruin/unpowered) +"B" = ( +/obj/structure/table/glass, +/obj/item/assembly/signaler, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) +"D" = ( +/obj/structure/table/glass, +/obj/item/storage/backpack/holding, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) +"E" = ( +/turf/open/floor/plasteel/stairs/left, +/area/ruin/unpowered) +"I" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) +"K" = ( +/obj/structure/table/glass, +/obj/effect/spawner/lootdrop/ruinloot/important, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) +"L" = ( +/obj/structure/table/glass, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) +"O" = ( +/obj/structure/table/glass, +/obj/item/stock_parts/subspace/crystal, +/obj/item/stock_parts/subspace/transmitter, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) +"S" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) +"T" = ( +/obj/structure/table/glass, +/obj/item/analyzer, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) +"V" = ( +/obj/machinery/door/airlock/vault{ + name = "secured door"; + req_access = 207 + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) +"W" = ( +/obj/structure/table/glass, +/obj/item/slimecross/industrial/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/unpowered) + +(1,1,1) = {" +q +q +q +q +q +q +q +q +q +q +q +q +q +"} +(2,1,1) = {" +q +r +u +u +L +I +S +K +L +u +u +r +q +"} +(3,1,1) = {" +q +u +u +u +u +u +u +u +u +u +u +u +q +"} +(4,1,1) = {" +q +u +u +u +u +u +u +u +u +u +u +u +q +"} +(5,1,1) = {" +q +u +u +u +u +u +a +O +y +u +u +u +q +"} +(6,1,1) = {" +q +q +q +u +u +E +e +e +e +E +u +u +q +"} +(7,1,1) = {" +k +u +V +u +u +A +e +t +e +A +u +u +q +"} +(8,1,1) = {" +q +q +q +u +u +j +e +e +s +j +u +u +q +"} +(9,1,1) = {" +q +u +u +u +u +u +b +T +B +u +u +u +q +"} +(10,1,1) = {" +q +u +u +u +u +u +u +u +u +u +u +u +q +"} +(11,1,1) = {" +q +u +u +u +u +u +u +u +u +u +u +u +q +"} +(12,1,1) = {" +q +r +u +u +K +D +L +W +K +u +u +r +q +"} +(13,1,1) = {" +q +q +q +q +q +q +q +q +q +q +q +q +q +"} diff --git a/_maps/RuinGeneration/13x13_listening_base.dmm b/_maps/RuinGeneration/13x13_listening_base.dmm new file mode 100644 index 0000000000000..0bac47d8fc2f8 --- /dev/null +++ b/_maps/RuinGeneration/13x13_listening_base.dmm @@ -0,0 +1,1297 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"bD" = ( +/obj/structure/bookcase/random, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/listeningstation) +"bO" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 25 + }, +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/paper/fluff/ruins/listeningstation/reports/november, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"cX" = ( +/obj/machinery/vending/snack/random{ + extended_inventory = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"dr" = ( +/turf/template_noop, +/area/template_noop) +"er" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/machinery/iv_drip, +/obj/machinery/light/small, +/obj/machinery/airalarm/syndicate{ + dir = 1; + pixel_y = -24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 6 + }, +/area/ruin/space/has_grav/listeningstation) +"eN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"fG" = ( +/obj/machinery/computer/camera_advanced{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/item/radio/intercom{ + freerange = 1; + name = "Syndicate Radio Intercom"; + pixel_x = -30 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"ic" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/tank_dispenser/oxygen{ + oxygentanks = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/listeningstation) +"jx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white/corner, +/area/ruin/space/has_grav/listeningstation) +"jR" = ( +/obj/structure/table, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = -30 + }, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = -4; + pixel_y = 14 + }, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = 3; + pixel_y = 11 + }, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ + pixel_x = -3 + }, +/obj/item/lighter{ + pixel_x = 7; + pixel_y = -3 + }, +/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 + }, +/obj/effect/spawner/lootdrop/ruinloot/security, +/obj/effect/spawner/lootdrop/ruinloot/security, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"kZ" = ( +/obj/structure/chair/office{ + 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/ruin/space/has_grav/listeningstation) +"lB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/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/ruin/space/has_grav/listeningstation) +"mp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"mw" = ( +/obj/structure/rack{ + dir = 8 + }, +/obj/item/multitool, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"mM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -29 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"nQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + piping_layer = 3; + pixel_x = 5; + pixel_y = 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/dark, +/area/ruin/space/has_grav/listeningstation) +"os" = ( +/obj/machinery/washing_machine{ + pixel_x = 4 + }, +/obj/structure/window{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/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/ruin/space/has_grav/listeningstation) +"oA" = ( +/obj/effect/turf_decal/stripes/red/corner{ + dir = 8 + }, +/obj/machinery/door/airlock{ + name = "Cabin" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"oR" = ( +/obj/effect/turf_decal/stripes/red/corner, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/airalarm/syndicate{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/machinery/computer/arcade/orion_trail{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"pa" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/machinery/door/airlock{ + name = "Personal Quarters" + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"pB" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/reagent_dispensers/fueltank, +/obj/item/clothing/head/welding, +/obj/item/weldingtool/largetank, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"qm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/closet/emcloset/anchored, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"qz" = ( +/obj/structure/table, +/obj/item/storage/toolbox/syndicate, +/obj/item/flashlight{ + pixel_y = -12 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"rL" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 2; + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"sk" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/item/clothing/neck/stethoscope, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/lootdrop/ruinloot/medical, +/turf/open/floor/plasteel/white/side{ + dir = 10 + }, +/area/ruin/space/has_grav/listeningstation) +"sz" = ( +/obj/structure/table, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -26 + }, +/obj/machinery/microwave, +/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/ruin/space/has_grav/listeningstation) +"sQ" = ( +/obj/structure/rack{ + dir = 8; + layer = 2.9 + }, +/obj/item/mining_scanner, +/obj/item/pickaxe, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"tb" = ( +/obj/effect/decal/cleanable/dirt, +/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/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"tf" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/toilet{ + pixel_y = 18 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/space/has_grav/listeningstation) +"ty" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"uw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/med_data/syndie{ + dir = 4; + req_one_access = null + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"ux" = ( +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/power/apc/syndicate{ + dir = 4; + name = "Syndicate Listening Post APC"; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"ve" = ( +/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/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"vx" = ( +/obj/structure/curtain, +/obj/machinery/shower{ + pixel_y = 14 + }, +/obj/machinery/light/small, +/obj/item/soap, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/space/has_grav/listeningstation) +"xp" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"xC" = ( +/obj/machinery/vending/cola/random{ + extended_inventory = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/ruin/space/has_grav/listeningstation) +"xM" = ( +/obj/structure/table, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/storage/box/donkpockets{ + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 2 + }, +/obj/item/reagent_containers/food/snacks/chocolatebar, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random{ + 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{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"xP" = ( +/obj/structure/table/reinforced, +/obj/machinery/firealarm{ + dir = 2; + pixel_y = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/libraryconsole/bookmanagement, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"yk" = ( +/obj/structure/rack{ + dir = 8 + }, +/obj/item/clothing/mask/gas{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/effect/turf_decal/stripes/line, +/obj/item/clothing/mask/gas, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/listeningstation) +"Ai" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 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/dark, +/area/ruin/space/has_grav/listeningstation) +"Au" = ( +/obj/structure/filingcabinet, +/obj/item/paper/fluff/ruins/listeningstation/reports/april, +/obj/item/paper/fluff/ruins/listeningstation/reports/may, +/obj/item/paper/fluff/ruins/listeningstation/reports/june, +/obj/item/paper/fluff/ruins/listeningstation/reports/july, +/obj/item/paper/fluff/ruins/listeningstation/reports/august, +/obj/item/paper/fluff/ruins/listeningstation/reports/september, +/obj/item/paper/fluff/ruins/listeningstation/reports/october, +/obj/item/paper/fluff/ruins/listeningstation/receipt, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/fluff/ruins/listeningstation/odd_report, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"Bn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/stack/sheet/iron/twenty, +/obj/item/stack/sheet/glass{ + amount = 10 + }, +/obj/item/stack/rods/ten, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/lights/bulbs, +/obj/item/stack/sheet/mineral/plasma{ + amount = 30 + }, +/obj/item/stock_parts/cell/high/plus, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"Bs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10; + piping_layer = 3; + pixel_x = 5; + pixel_y = 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/dark, +/area/ruin/space/has_grav/listeningstation) +"BT" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/syndicate{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/spawner/lootdrop/ruinloot/important, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"Ce" = ( +/obj/structure/table/wood, +/obj/item/ammo_box/magazine/m10mm, +/obj/item/paper/fluff/ruins/listeningstation/briefing, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/listeningstation) +"Dg" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 2; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"DE" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/listeningstation) +"Ed" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"ES" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/listeningstation) +"ET" = ( +/obj/structure/cable, +/obj/machinery/power/port_gen/pacman{ + anchored = 1 + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/wrench, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"EY" = ( +/obj/item/bombcore/badmin{ + anchored = 1; + invisibility = 100 + }, +/turf/closed/wall, +/area/ruin/space/has_grav/listeningstation) +"Hk" = ( +/obj/machinery/airalarm/syndicate{ + pixel_y = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/baseturf_helper/asteroid/airless, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"Kg" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/blood/OMinus{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/blood/OMinus, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel/white/side{ + dir = 9 + }, +/area/ruin/space/has_grav/listeningstation) +"Lj" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"LH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/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/ruin/space/has_grav/listeningstation) +"LZ" = ( +/obj/machinery/door/airlock/external{ + id_tag = "syndie_listeningpost_external"; + req_access_txt = "150" + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"Of" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"Pg" = ( +/obj/machinery/syndicatebomb/self_destruct{ + anchored = 1 + }, +/obj/machinery/door/window/brigdoor{ + dir = 8; + req_access_txt = "150" + }, +/obj/structure/sign/warning/explosives/alt{ + pixel_x = 32 + }, +/turf/open/floor/circuit/red, +/area/ruin/space/has_grav/listeningstation) +"PW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"QE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel/white/side{ + dir = 5 + }, +/area/ruin/space/has_grav/listeningstation) +"RN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/bin, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27; + pixel_y = 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 + }, +/obj/effect/spawner/lootdrop/ruinloot/important, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"SJ" = ( +/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space{ + assignedrole = "Space Syndicate"; + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/listeningstation) +"SO" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "syndie_listeningpost_external"; + name = "External Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 24; + req_access_txt = "150"; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + piping_layer = 3; + pixel_x = 5; + pixel_y = 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/dark, +/area/ruin/space/has_grav/listeningstation) +"Tg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/medical1{ + req_access = null; + req_access_txt = "150" + }, +/obj/effect/spawner/lootdrop/ruinloot/medical, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/listeningstation) +"To" = ( +/obj/structure/closet{ + icon_door = "black"; + name = "wardrobe" + }, +/obj/item/clothing/under/color/black{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/under/color/black{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/clothing/head/soft/black{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/head/soft/black{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/clothing/gloves/fingerless, +/obj/item/clothing/shoes/sneakers/black{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/shoes/sneakers/black{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/photo_album, +/obj/machinery/light/small, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/listeningstation) +"TD" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"TQ" = ( +/obj/structure/sign/departments/medbay/alt, +/turf/closed/wall, +/area/ruin/space/has_grav/listeningstation) +"Vh" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"Vs" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/machinery/door/airlock/hatch{ + name = "Telecommunications"; + req_access_txt = "150" + }, +/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/ruin/space/has_grav/listeningstation) +"Vw" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/caution/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"Vy" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay" + }, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/listeningstation) +"Wd" = ( +/obj/machinery/telecomms/relay/preset/ruskie{ + use_power = 0 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"Xe" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/listeningstation) +"Yk" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"Yu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/listeningstation) +"YS" = ( +/obj/machinery/computer/message_monitor{ + dir = 2 + }, +/obj/machinery/airalarm/syndicate{ + pixel_y = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/monitorkey, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/listeningstation) +"Zn" = ( +/obj/machinery/door/airlock{ + name = "Toilet" + }, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/space/has_grav/listeningstation) +"Zp" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel/white/side, +/area/ruin/space/has_grav/listeningstation) +"Zx" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/machinery/door/airlock/hatch{ + name = "E.V.A. Equipment"; + req_access_txt = "150" + }, +/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/ruin/space/has_grav/listeningstation) + +(1,1,1) = {" +dr +dr +ES +ES +ES +ES +ES +ES +ES +ES +ES +ES +dr +"} +(2,1,1) = {" +dr +dr +ES +vx +DE +RN +sz +jR +xM +DE +bD +ES +ES +"} +(3,1,1) = {" +dr +dr +ES +tf +Zn +ty +eN +Lj +ve +oA +Xe +To +ES +"} +(4,1,1) = {" +dr +ES +ES +DE +DE +os +xp +oR +Vw +DE +SJ +Ce +ES +"} +(5,1,1) = {" +ES +ES +fG +uw +DE +DE +pa +DE +Pg +DE +DE +DE +ES +"} +(6,1,1) = {" +ES +YS +kZ +Ai +Au +DE +Ed +DE +DE +Of +pB +ET +ES +"} +(7,1,1) = {" +ES +xP +lB +Bs +nQ +Vs +Dg +Yu +TD +ux +Bn +Vh +ES +"} +(8,1,1) = {" +ES +ES +Wd +bO +mw +DE +Hk +qm +DE +DE +DE +ES +ES +"} +(9,1,1) = {" +dr +ES +DE +DE +DE +EY +Yk +mM +TQ +Kg +sk +ES +dr +"} +(10,1,1) = {" +ES +ES +qz +BT +sQ +DE +rL +jx +Vy +QE +er +ES +dr +"} +(11,1,1) = {" +ES +yk +LH +SO +tb +Zx +PW +Zp +DE +Tg +ES +ES +dr +"} +(12,1,1) = {" +ES +ES +LZ +ES +ic +DE +cX +xC +ES +ES +ES +dr +dr +"} +(13,1,1) = {" +dr +ES +mp +ES +ES +ES +ES +ES +ES +dr +dr +dr +dr +"} diff --git a/_maps/RuinGeneration/13x13_shotelroom.dmm b/_maps/RuinGeneration/13x13_shotelroom.dmm new file mode 100644 index 0000000000000..621ee3d4f510e --- /dev/null +++ b/_maps/RuinGeneration/13x13_shotelroom.dmm @@ -0,0 +1,475 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/wooden_tv{ + pixel_x = 1; + pixel_y = 16 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"b" = ( +/obj/machinery/computer/scan_consolenew, +/turf/open/floor/plasteel/tiled, +/area/ruin/unpowered) +"d" = ( +/obj/structure/table/wood/fancy/purple, +/obj/item/reagent_containers/food/drinks/bottle/orangejuice{ + pixel_x = 2; + pixel_y = 7 + }, +/turf/open/floor/carpet/orange, +/area/ruin/unpowered) +"e" = ( +/obj/effect/mob_spawn/human/corpse/zombie, +/turf/open/floor/plasteel/tiled, +/area/ruin/unpowered) +"f" = ( +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"g" = ( +/obj/structure/bed, +/obj/item/bedsheet/rd, +/obj/item/toy/plush/slimeplushie, +/turf/open/floor/wood, +/area/ruin/unpowered) +"h" = ( +/turf/open/floor/wood, +/area/ruin/unpowered) +"i" = ( +/obj/structure/dresser, +/turf/open/floor/wood, +/area/ruin/unpowered) +"j" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"k" = ( +/obj/structure/falsewall, +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel/tiled, +/area/ruin/unpowered) +"l" = ( +/turf/open/floor/plasteel/tiled, +/area/ruin/unpowered) +"m" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"n" = ( +/obj/structure/table/wood/fancy/purple, +/obj/item/reagent_containers/food/snacks/pizzabread, +/obj/item/reagent_containers/food/snacks/egg{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/snacks/egg{ + pixel_x = -4; + pixel_y = 3 + }, +/turf/open/floor/carpet/orange, +/area/ruin/unpowered) +"o" = ( +/obj/structure/table/wood/fancy/purple, +/obj/item/storage/fancy/egg_box{ + pixel_y = 12 + }, +/turf/open/floor/carpet/orange, +/area/ruin/unpowered) +"q" = ( +/obj/machinery/door/airlock/wood, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"r" = ( +/obj/structure/table/wood/fancy/purple, +/obj/item/reagent_containers/food/snacks/store/cake/chocolate, +/obj/item/kitchen/knife, +/turf/open/floor/carpet/orange, +/area/ruin/unpowered) +"t" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/turf/open/floor/plasteel/tiled, +/area/ruin/unpowered) +"u" = ( +/obj/structure/chair/sofa/left{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"v" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/wood, +/area/ruin/unpowered) +"x" = ( +/obj/machinery/dna_scannernew, +/turf/open/floor/plasteel/tiled, +/area/ruin/unpowered) +"z" = ( +/obj/structure/table/glass, +/obj/item/storage/box/monkeycubes, +/turf/open/floor/plasteel/tiled, +/area/ruin/unpowered) +"A" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/ruin/unpowered) +"C" = ( +/obj/item/dnainjector/mindread, +/obj/structure/table/glass, +/obj/structure/sign/departments/minsky/research/genetics{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/tiled, +/area/ruin/unpowered) +"D" = ( +/obj/structure/chair/sofa/right{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"F" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/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/ruin/unpowered) +"G" = ( +/obj/structure/table/glass, +/obj/item/dnainjector/mindread, +/turf/open/floor/wood, +/area/ruin/unpowered) +"H" = ( +/turf/open/floor/carpet/orange, +/area/ruin/unpowered) +"I" = ( +/obj/structure/table/glass, +/obj/item/storage/pill_bottle/mutadone, +/obj/item/clothing/gloves/color/latex, +/turf/open/floor/plasteel/tiled, +/area/ruin/unpowered) +"J" = ( +/obj/structure/table/wood/fancy/purple, +/obj/item/reagent_containers/food/drinks/drinkingglass/filled/soda{ + pixel_x = -5; + pixel_y = 5 + }, +/turf/open/floor/carpet/orange, +/area/ruin/unpowered) +"K" = ( +/obj/machinery/computer/med_data/laptop, +/obj/structure/table/glass, +/turf/open/floor/wood, +/area/ruin/unpowered) +"L" = ( +/obj/structure/chair/comfy/black, +/turf/open/floor/carpet/orange, +/area/ruin/unpowered) +"M" = ( +/obj/structure/table/glass, +/obj/item/chromosome/power{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/chromosome/reinforcer{ + pixel_y = 2 + }, +/turf/open/floor/plasteel/tiled, +/area/ruin/unpowered) +"N" = ( +/obj/machinery/door/airlock/wood, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/wood, +/area/ruin/unpowered) +"O" = ( +/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/escape{ + info = "lol"; + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/pen/fountain/captain{ + pixel_x = 3; + pixel_y = -1 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/food/drinks/britcup{ + pixel_x = -8; + pixel_y = -1 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"P" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/carpet/orange, +/area/ruin/unpowered) +"Q" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"R" = ( +/obj/structure/falsewall, +/turf/open/floor/plasteel/tiled, +/area/ruin/unpowered) +"S" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/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/ruin/unpowered) +"T" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"U" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/under/dress/skirt/purple, +/obj/item/clothing/under/dress/sundress, +/obj/item/clothing/under/pants/classicjeans, +/obj/item/clothing/suit/jacket/letterman_nanotrasen, +/turf/open/floor/wood, +/area/ruin/unpowered) +"V" = ( +/obj/item/flashlight/lamp/green, +/obj/structure/table/glass, +/turf/open/floor/wood, +/area/ruin/unpowered) +"W" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/food/snacks/grown/harebell, +/turf/open/floor/wood, +/area/ruin/unpowered) +"X" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Y" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Z" = ( +/obj/structure/table/wood/fancy/purple, +/obj/item/reagent_containers/food/drinks/bottle/applejack{ + pixel_y = 2 + }, +/turf/open/floor/carpet/orange, +/area/ruin/unpowered) + +(1,1,1) = {" +j +m +X +m +j +j +j +j +j +j +j +j +j +"} +(2,1,1) = {" +j +m +m +m +T +S +j +V +G +h +U +W +j +"} +(3,1,1) = {" +j +m +m +m +m +Y +j +K +Q +h +h +h +j +"} +(4,1,1) = {" +j +m +m +m +m +Y +j +O +h +h +h +h +j +"} +(5,1,1) = {" +j +m +m +m +f +F +j +v +h +h +g +i +j +"} +(6,1,1) = {" +j +j +j +q +j +j +j +j +N +j +j +j +j +"} +(7,1,1) = {" +j +v +h +h +h +h +h +h +h +j +C +M +j +"} +(8,1,1) = {" +j +h +h +h +h +h +h +h +h +j +l +l +j +"} +(9,1,1) = {" +j +h +H +H +H +H +h +h +h +R +l +e +j +"} +(10,1,1) = {" +j +h +L +Z +n +P +h +u +D +j +x +l +j +"} +(11,1,1) = {" +j +h +L +J +o +P +h +h +h +j +b +t +k +"} +(12,1,1) = {" +j +h +L +r +d +P +v +A +a +j +z +I +j +"} +(13,1,1) = {" +j +j +j +j +j +j +j +j +j +j +j +j +j +"} diff --git a/_maps/RuinGeneration/13x13_supermatter_containment.dmm b/_maps/RuinGeneration/13x13_supermatter_containment.dmm new file mode 100644 index 0000000000000..1ba5439a87902 --- /dev/null +++ b/_maps/RuinGeneration/13x13_supermatter_containment.dmm @@ -0,0 +1,251 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/machinery/field/generator, +/turf/open/floor/engine, +/area/ruin/unpowered) +"c" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"e" = ( +/obj/machinery/field/generator, +/turf/open/floor/plating, +/area/ruin/unpowered) +"f" = ( +/obj/item/scalpel, +/obj/effect/decal/remains/human, +/turf/open/floor/plating, +/area/ruin/unpowered) +"h" = ( +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/door/airlock/highsecurity, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"m" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"w" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"G" = ( +/turf/open/floor/engine, +/area/ruin/unpowered) +"K" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/ruin/unpowered) +"N" = ( +/turf/open/space/basic, +/area/space) +"P" = ( +/obj/machinery/power/supermatter_crystal/shard/hugbox, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Q" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"T" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +c +c +c +c +N +N +N +N +N +N +N +N +N +"} +(2,1,1) = {" +T +T +T +c +K +K +N +N +N +N +N +N +N +"} +(3,1,1) = {" +m +T +T +T +T +K +K +c +N +N +N +N +N +"} +(4,1,1) = {" +T +T +T +T +T +T +T +c +c +c +N +N +N +"} +(5,1,1) = {" +c +c +T +T +T +T +T +T +T +c +N +N +N +"} +(6,1,1) = {" +c +c +c +c +T +T +T +T +T +c +c +N +N +"} +(7,1,1) = {" +c +G +G +c +c +c +T +T +T +T +K +N +N +"} +(8,1,1) = {" +c +G +w +G +G +c +c +T +T +T +K +K +N +"} +(9,1,1) = {" +c +e +w +e +G +G +h +T +T +T +T +K +N +"} +(10,1,1) = {" +c +w +P +f +w +G +c +c +T +T +T +c +c +"} +(11,1,1) = {" +c +a +w +e +G +G +G +c +T +T +T +T +c +"} +(12,1,1) = {" +c +G +G +G +G +w +G +c +c +T +T +T +c +"} +(13,1,1) = {" +c +c +c +c +c +c +c +c +c +T +Q +T +c +"} diff --git a/_maps/RuinGeneration/13x17_permabrig.dmm b/_maps/RuinGeneration/13x17_permabrig.dmm new file mode 100644 index 0000000000000..b7b4a793674bb --- /dev/null +++ b/_maps/RuinGeneration/13x17_permabrig.dmm @@ -0,0 +1,776 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aW" = ( +/turf/template_noop, +/area/template_noop) +"bO" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"cK" = ( +/obj/machinery/biogenerator, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"dn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"dQ" = ( +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ee" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/ruinloot/security, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"fL" = ( +/obj/structure/window/reinforced, +/obj/machinery/hydroponics/soil, +/obj/item/seeds/grass, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"fZ" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restroom" + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"hq" = ( +/obj/structure/table, +/obj/item/pen, +/obj/effect/spawner/lootdrop/ruinloot/security, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"hU" = ( +/obj/structure/bookcase, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"jz" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"kJ" = ( +/obj/machinery/seed_extractor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"lv" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"lG" = ( +/obj/structure/toilet{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"lI" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "permabolt2"; + name = "Cell 2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"mj" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"pC" = ( +/obj/structure/table, +/obj/item/storage/pill_bottle/dice, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"pO" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Long-Term Cell 1"; + req_access_txt = "2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"pR" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"rp" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "permabolt3"; + name = "Cell 3" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"sa" = ( +/obj/structure/window/reinforced, +/obj/machinery/hydroponics/soil, +/obj/item/seeds/potato, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"sx" = ( +/obj/structure/window/reinforced, +/obj/machinery/hydroponics/soil, +/obj/item/cultivator, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ve" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/window/westleft{ + base_state = "right"; + icon_state = "right"; + name = "Unisex Showers" + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"vM" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"vY" = ( +/obj/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/unpowered) +"wg" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 1; + pixel_y = -27 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"xh" = ( +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"xS" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/item/soap/nanotrasen, +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"xV" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"zd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"zq" = ( +/obj/structure/table, +/obj/item/toy/cards/deck, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"zE" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"AG" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"AM" = ( +/obj/structure/sink{ + pixel_y = 20 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Be" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Bh" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/glowshroom, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"BT" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/ruinloot/security, +/obj/effect/spawner/lootdrop/ruinloot/security, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"CC" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "permabolt1"; + name = "Cell 1" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"CE" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ez" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"EM" = ( +/obj/machinery/washing_machine, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"EW" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"Fz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"FW" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/carrot, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ha" = ( +/obj/machinery/light, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/sustenance, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"HD" = ( +/obj/structure/window/reinforced, +/obj/machinery/hydroponics/soil, +/obj/item/cultivator, +/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/ruin/unpowered) +"Jw" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/ambrosia, +/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/ruin/unpowered) +"Le" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/arcade, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Me" = ( +/obj/structure/closet/secure_closet/brig, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"My" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/ruin/unpowered) +"MX" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Nf" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"NC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"NR" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"NZ" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Long-Term Cell 2"; + req_access_txt = "2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Oe" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"Pb" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"PN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bed, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"PW" = ( +/obj/structure/table, +/obj/item/razor{ + pixel_x = -6 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/ruinloot/security, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Qh" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"RC" = ( +/obj/structure/chair/stool, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"SO" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/dirt, +/obj/item/toy/plush/carpplushie, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"SX" = ( +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Ty" = ( +/obj/machinery/washing_machine, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"TT" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"UG" = ( +/mob/living/simple_animal/mouse/brown/Tom, +/turf/open/floor/plating, +/area/ruin/unpowered) +"VE" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Long-Term Cell 3"; + req_access_txt = "2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"VL" = ( +/obj/machinery/holopad, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"VT" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Wr" = ( +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/obj/machinery/hydroponics/soil, +/obj/item/plant_analyzer, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Xh" = ( +/obj/structure/table, +/obj/item/electropack, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ZT" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall, +/area/ruin/unpowered) + +(1,1,1) = {" +Oe +Oe +Oe +EW +EW +EW +TT +TT +TT +EW +TT +TT +lv +bO +xV +ee +lv +"} +(2,1,1) = {" +EW +EW +EW +EW +hU +dQ +NR +NR +NR +rp +NR +NR +VE +bO +bO +wg +lv +"} +(3,1,1) = {" +EW +Jw +Nf +sa +NR +RC +NR +VL +dn +lv +PN +vM +lv +bO +bO +mj +Be +"} +(4,1,1) = {" +My +FW +jz +fL +NR +NR +NR +NR +Ha +lv +lv +lv +lv +bO +bO +VT +lv +"} +(5,1,1) = {" +EW +jz +UG +vY +NR +NR +RC +NR +NR +lv +Ez +NR +lv +bO +bO +Xh +lv +"} +(6,1,1) = {" +My +Bh +jz +sx +NR +pC +zq +NR +NR +lI +NR +NR +NZ +bO +bO +PW +lv +"} +(7,1,1) = {" +EW +Wr +jz +HD +RC +hq +CE +NR +NR +lv +RC +vM +lv +bO +bO +BT +lv +"} +(8,1,1) = {" +My +NR +jz +NR +NR +RC +NR +NR +NR +lv +lv +lv +lv +bO +bO +Me +lv +"} +(9,1,1) = {" +EW +AM +SX +NR +NR +NR +NR +NR +NR +lv +SO +Fz +lv +bO +bO +Me +lv +"} +(10,1,1) = {" +My +NR +NR +NR +zE +NC +Pb +Le +NR +CC +NR +NR +pO +bO +bO +Me +lv +"} +(11,1,1) = {" +EW +cK +kJ +NR +EM +pR +Ty +zd +ve +lv +ZT +ZT +lv +bO +bO +MX +lv +"} +(12,1,1) = {" +EW +EW +EW +EW +EW +EW +EW +xS +xh +fZ +Qh +lG +lv +bO +bO +bO +lv +"} +(13,1,1) = {" +aW +aW +Oe +Oe +aW +Oe +EW +EW +EW +EW +EW +EW +EW +bO +AG +bO +lv +"} diff --git a/_maps/RuinGeneration/13x17_pizzaroom.dmm b/_maps/RuinGeneration/13x17_pizzaroom.dmm new file mode 100644 index 0000000000000..3ae9c438e6d0f --- /dev/null +++ b/_maps/RuinGeneration/13x17_pizzaroom.dmm @@ -0,0 +1,311 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"c" = ( +/obj/effect/decal/remains/human, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"d" = ( +/obj/item/reagent_containers/food/snacks/pizzaslice/margherita, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"e" = ( +/turf/closed/mineral/random/high_chance, +/area/ruin/unpowered) +"f" = ( +/turf/open/indestructible/hierophant, +/area/ruin/unpowered) +"i" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"o" = ( +/obj/structure/fans/tiny/invisible, +/turf/open/indestructible/hierophant, +/area/ruin/unpowered) +"p" = ( +/obj/item/reagent_containers/food/snacks/pizza/pineapple, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"q" = ( +/obj/item/reagent_containers/food/snacks/pizza/meat, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"t" = ( +/mob/living/simple_animal/hostile/asteroid/elite/pandora, +/turf/open/indestructible/hierophant, +/area/ruin/unpowered) +"v" = ( +/obj/effect/spawner/lootdrop/ruinloot/important, +/turf/open/indestructible/hierophant, +/area/ruin/unpowered) +"A" = ( +/obj/item/pizzabox/infinite, +/turf/open/indestructible/hierophant, +/area/ruin/unpowered) +"C" = ( +/turf/template_noop, +/area/template_noop) +"F" = ( +/obj/item/reagent_containers/food/snacks/pizza/margherita/robo, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"G" = ( +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"I" = ( +/turf/closed/indestructible/riveted/hierophant, +/area/ruin/unpowered) +"U" = ( +/obj/item/reagent_containers/food/snacks/pizzaslice/meat, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) + +(1,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(2,1,1) = {" +b +C +C +e +e +e +e +e +e +C +C +C +C +C +e +e +b +"} +(3,1,1) = {" +b +e +e +e +e +e +e +e +e +e +e +C +C +e +e +e +b +"} +(4,1,1) = {" +b +e +I +I +I +I +I +I +I +e +e +e +e +e +e +c +b +"} +(5,1,1) = {" +b +e +I +f +f +v +f +f +I +c +e +e +e +e +d +F +b +"} +(6,1,1) = {" +b +e +I +f +f +f +f +f +I +F +G +e +e +G +c +G +G +"} +(7,1,1) = {" +b +e +I +A +t +f +f +f +o +G +c +G +e +p +G +G +i +"} +(8,1,1) = {" +b +e +I +f +f +f +f +v +I +G +G +G +e +G +c +q +G +"} +(9,1,1) = {" +b +e +I +f +f +f +f +f +I +c +c +e +e +e +e +U +b +"} +(10,1,1) = {" +b +e +I +I +I +I +I +I +I +G +G +e +e +e +e +e +b +"} +(11,1,1) = {" +b +e +e +e +e +e +G +c +G +G +e +e +e +e +e +e +b +"} +(12,1,1) = {" +b +C +C +e +e +e +e +e +e +e +e +C +C +C +e +e +b +"} +(13,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} diff --git a/_maps/RuinGeneration/13x17_shuttledock.dmm b/_maps/RuinGeneration/13x17_shuttledock.dmm new file mode 100644 index 0000000000000..32534266f5f82 --- /dev/null +++ b/_maps/RuinGeneration/13x17_shuttledock.dmm @@ -0,0 +1,346 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"e" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"j" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"l" = ( +/obj/structure/sign/warning/vacuum/external, +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"o" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/unpowered) +"t" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"v" = ( +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/ruin/unpowered) +"C" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"D" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"H" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"I" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"J" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"O" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"R" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"S" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"W" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"X" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Y" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Z" = ( +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +I +I +I +I +I +I +I +I +I +I +I +I +I +e +J +e +I +"} +(2,1,1) = {" +R +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +I +"} +(3,1,1) = {" +R +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +S +"} +(4,1,1) = {" +R +R +o +o +o +o +o +o +o +o +o +R +R +D +e +e +I +"} +(5,1,1) = {" +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +o +t +D +e +I +"} +(6,1,1) = {" +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +o +o +o +X +e +I +"} +(7,1,1) = {" +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Y +v +O +u +e +I +"} +(8,1,1) = {" +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +l +R +R +X +e +I +"} +(9,1,1) = {" +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +R +H +C +e +I +"} +(10,1,1) = {" +R +R +o +o +o +o +o +o +o +o +o +R +R +C +e +e +e +"} +(11,1,1) = {" +R +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +W +"} +(12,1,1) = {" +R +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +"} +(13,1,1) = {" +I +I +I +I +I +I +I +I +I +I +I +I +I +e +j +e +I +"} diff --git a/_maps/RuinGeneration/13x9_cratestorage.dmm b/_maps/RuinGeneration/13x9_cratestorage.dmm new file mode 100644 index 0000000000000..4ed21920631c3 --- /dev/null +++ b/_maps/RuinGeneration/13x9_cratestorage.dmm @@ -0,0 +1,269 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"d" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate, +/obj/item/stack/sheet/plasteel/twenty, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"e" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/medical, +/obj/item/storage/firstaid/regular{ + empty = 1; + name = "First-Aid (empty)" + }, +/obj/item/storage/firstaid/o2, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"g" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"l" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/engineering, +/obj/item/multitool, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"m" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/effect/spawner/lootdrop/ruinloot/basic, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"o" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate, +/obj/item/pda/clear, +/obj/effect/spawner/lootdrop/ruinloot/important, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"p" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate, +/obj/item/storage/pill_bottle/stimulant, +/obj/effect/spawner/lootdrop/ruinloot/basic, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"s" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/medical, +/obj/item/storage/firstaid/regular{ + empty = 1; + name = "First-Aid (empty)" + }, +/obj/effect/spawner/lootdrop/ruinloot/medical, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate, +/obj/item/stack/sheet/cardboard/fifty, +/obj/effect/spawner/lootdrop/ruinloot/basic, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"x" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/engineering, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"D" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate, +/obj/item/paicard, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"E" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/medical, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/fire, +/obj/effect/spawner/lootdrop/ruinloot/science, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"G" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"M" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/internals, +/obj/item/storage/firstaid/toxin, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"O" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"U" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"Y" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/secure/loot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Z" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate, +/obj/item/target/alien, +/obj/item/target/alien, +/obj/item/target/clown, +/obj/item/target/syndicate, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +U +U +U +U +U +U +U +U +U +"} +(2,1,1) = {" +U +g +g +p +Y +Y +g +M +U +"} +(3,1,1) = {" +U +O +g +g +g +g +g +u +U +"} +(4,1,1) = {" +U +O +g +g +g +g +g +g +U +"} +(5,1,1) = {" +U +g +g +U +s +g +d +l +U +"} +(6,1,1) = {" +g +g +g +U +x +g +g +g +g +"} +(7,1,1) = {" +G +g +g +U +g +g +g +g +q +"} +(8,1,1) = {" +g +g +g +U +Z +E +g +g +g +"} +(9,1,1) = {" +U +g +g +U +g +g +g +g +U +"} +(10,1,1) = {" +U +g +g +g +g +g +g +g +U +"} +(11,1,1) = {" +U +g +g +g +g +g +g +g +U +"} +(12,1,1) = {" +U +Y +Y +D +g +m +e +o +U +"} +(13,1,1) = {" +U +U +U +U +U +U +U +U +U +"} diff --git a/_maps/RuinGeneration/13x9_josito.dmm b/_maps/RuinGeneration/13x9_josito.dmm new file mode 100644 index 0000000000000..6eb98abf2da64 --- /dev/null +++ b/_maps/RuinGeneration/13x9_josito.dmm @@ -0,0 +1,269 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/bookcase/random, +/turf/open/floor/wood, +/area/ruin/unpowered) +"c" = ( +/obj/structure/table/wood, +/obj/effect/spawner/lootdrop/snowdin/dungeonlite, +/turf/open/floor/wood, +/area/ruin/unpowered) +"h" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plating, +/area/ruin/unpowered) +"i" = ( +/obj/structure/bed/dogbed, +/mob/living/simple_animal/pet/cat{ + name = "Josito"; + real_name = "Josito"; + unique_name = 1 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"j" = ( +/obj/structure/chair/wood, +/turf/open/floor/wood, +/area/ruin/unpowered) +"k" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/turf/open/floor/wood, +/area/ruin/unpowered) +"m" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/wood, +/area/ruin/unpowered) +"n" = ( +/turf/open/floor/wood, +/area/ruin/unpowered) +"o" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/turf/open/floor/carpet/purple, +/area/ruin/unpowered) +"p" = ( +/obj/structure/table/wood, +/obj/effect/spawner/lootdrop/techstorage/medical, +/turf/open/floor/carpet/purple, +/area/ruin/unpowered) +"r" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance/three, +/obj/effect/spawner/lootdrop/minor/kittyears_or_rabbitears, +/turf/open/floor/carpet/purple, +/area/ruin/unpowered) +"s" = ( +/obj/structure/fans/tiny, +/obj/effect/abstract/doorway_marker, +/turf/open/floor/wood, +/area/ruin/unpowered) +"t" = ( +/turf/open/floor/carpet/purple, +/area/ruin/unpowered) +"u" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"x" = ( +/obj/structure/table/wood, +/obj/item/candle, +/turf/open/floor/wood, +/area/ruin/unpowered) +"y" = ( +/obj/structure/table/wood, +/obj/item/storage/box/matches, +/turf/open/floor/wood, +/area/ruin/unpowered) +"A" = ( +/obj/structure/chair/sofa/left{ + dir = 8 + }, +/turf/open/floor/carpet/purple, +/area/ruin/unpowered) +"B" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"D" = ( +/obj/structure/chair/sofa/left, +/turf/open/floor/wood, +/area/ruin/unpowered) +"E" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/carpet/purple, +/area/ruin/unpowered) +"I" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"J" = ( +/obj/structure/chair/sofa/right, +/turf/open/floor/wood, +/area/ruin/unpowered) +"K" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/maintenance_hatch, +/turf/open/floor/carpet/purple, +/area/ruin/unpowered) +"L" = ( +/obj/structure/chair/sofa/right{ + dir = 8 + }, +/turf/open/floor/carpet/purple, +/area/ruin/unpowered) +"O" = ( +/obj/effect/spawner/room/threexthree, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Q" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) + +(1,1,1) = {" +u +u +u +u +u +u +u +u +u +"} +(2,1,1) = {" +u +a +n +j +x +B +n +a +u +"} +(3,1,1) = {" +u +i +n +j +y +B +n +a +u +"} +(4,1,1) = {" +u +J +n +n +n +n +n +m +u +"} +(5,1,1) = {" +u +D +n +n +n +n +n +n +u +"} +(6,1,1) = {" +u +a +n +j +x +B +n +n +u +"} +(7,1,1) = {" +u +c +n +j +k +B +n +n +s +"} +(8,1,1) = {" +u +a +n +n +n +n +n +m +u +"} +(9,1,1) = {" +u +u +K +u +u +u +u +u +u +"} +(10,1,1) = {" +u +r +t +t +u +Q +Q +O +u +"} +(11,1,1) = {" +E +t +t +t +o +Q +Q +Q +h +"} +(12,1,1) = {" +u +p +L +A +u +Q +Q +Q +u +"} +(13,1,1) = {" +u +u +u +u +u +u +I +u +u +"} diff --git a/_maps/RuinGeneration/13x9_medical.dmm b/_maps/RuinGeneration/13x9_medical.dmm new file mode 100644 index 0000000000000..db22a92936aad --- /dev/null +++ b/_maps/RuinGeneration/13x9_medical.dmm @@ -0,0 +1,462 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"c" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"e" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"f" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"g" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"h" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"j" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"k" = ( +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"n" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"o" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"p" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"q" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"r" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"s" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"t" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/closet/crate/freezer/blood, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"u" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/table/glass, +/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/effect/spawner/lootdrop/ruinloot/medical, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"w" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"x" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/sleeper{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"y" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"z" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"A" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/bottle/charcoal, +/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/effect/spawner/lootdrop/ruinloot/medical, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"B" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/ruinloot/medical, +/obj/structure/table/glass, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"D" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"E" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"I" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/stripes/line, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"K" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"L" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"M" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/effect/turf_decal/delivery, +/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/white, +/area/ruin/unpowered) +"O" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Q" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"S" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"T" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"U" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"X" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/cryoxadone{ + pixel_x = 9; + pixel_y = 11 + }, +/obj/item/reagent_containers/glass/beaker/cryoxadone{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/item/wrench/medical{ + pixel_y = 2 + }, +/obj/effect/turf_decal/bot, +/obj/effect/spawner/lootdrop/ruinloot/medical, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Y" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Z" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) + +(1,1,1) = {" +S +S +S +S +S +a +O +a +S +"} +(2,1,1) = {" +S +j +B +B +p +a +a +a +S +"} +(3,1,1) = {" +S +M +n +w +I +a +a +a +S +"} +(4,1,1) = {" +S +X +Q +w +I +a +a +a +S +"} +(5,1,1) = {" +S +z +h +w +I +y +a +a +S +"} +(6,1,1) = {" +S +j +Q +w +K +o +a +a +a +"} +(7,1,1) = {" +S +Z +h +w +r +a +a +a +c +"} +(8,1,1) = {" +S +Z +h +k +E +y +a +a +a +"} +(9,1,1) = {" +S +g +L +k +D +U +U +Y +S +"} +(10,1,1) = {" +S +e +k +w +w +w +w +T +S +"} +(11,1,1) = {" +q +e +f +f +f +f +k +T +S +"} +(12,1,1) = {" +S +s +T +x +u +x +A +t +S +"} +(13,1,1) = {" +S +S +S +S +S +S +S +S +S +"} diff --git a/_maps/RuinGeneration/13x9_researchlab.dmm b/_maps/RuinGeneration/13x9_researchlab.dmm new file mode 100644 index 0000000000000..59739f4c31c61 --- /dev/null +++ b/_maps/RuinGeneration/13x9_researchlab.dmm @@ -0,0 +1,629 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/vending/wardrobe/science_wardrobe, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"b" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"c" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"d" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/ruin/unpowered) +"e" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"f" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"g" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table, +/obj/item/disk/tech_disk{ + pixel_x = -2; + pixel_y = -3 + }, +/obj/item/disk/tech_disk{ + pixel_x = -2; + pixel_y = -3 + }, +/obj/item/disk/design_disk, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/spawner/lootdrop/ruinloot/science, +/obj/effect/spawner/lootdrop/ruinloot/science, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"h" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"k" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/table, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/clothing/glasses/science, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/spawner/lootdrop/ruinloot/science, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"l" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"m" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"o" = ( +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"p" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"r" = ( +/obj/machinery/door/airlock/science, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"s" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/spawner/lootdrop/ruinloot/science, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"t" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/computer/cargo/request{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"v" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/rnd/production/protolathe/department/science, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"w" = ( +/obj/machinery/door/window/eastleft{ + name = "Research and Development Deliveries"; + req_one_access_txt = "7;29" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"x" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"y" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"z" = ( +/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/white, +/area/ruin/unpowered) +"A" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"B" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/rnd/destructive_analyzer, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"C" = ( +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/effect/turf_decal/stripes/end, +/obj/item/clothing/glasses/welding, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"D" = ( +/obj/effect/spawner/lootdrop/ruinloot/science, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"E" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/crowbar, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/spawner/lootdrop/ruinloot/science, +/obj/effect/spawner/lootdrop/ruinloot/science, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"F" = ( +/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/white, +/area/ruin/unpowered) +"G" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"H" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"I" = ( +/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/ruin/unpowered) +"J" = ( +/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/white, +/area/ruin/unpowered) +"K" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"L" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"M" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"N" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/hand_labeler, +/obj/effect/spawner/lootdrop/ruinloot/science, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"O" = ( +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"P" = ( +/obj/effect/spawner/lootdrop/ruinloot/important, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Q" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/table, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/circuitboard/computer/nanite_chamber_control, +/obj/item/circuitboard/computer/nanite_cloud_controller, +/obj/item/circuitboard/machine/nanite_chamber, +/obj/item/circuitboard/machine/nanite_program_hub, +/obj/effect/spawner/lootdrop/ruinloot/science, +/obj/effect/spawner/lootdrop/ruinloot/science, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"R" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"S" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"T" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"U" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"V" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"W" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/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/ruin/unpowered) +"X" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/machinery/light, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Y" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/computer/rdconsole/core{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Z" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) + +(1,1,1) = {" +u +u +u +u +u +u +f +u +u +"} +(2,1,1) = {" +u +R +N +Q +w +k +O +K +u +"} +(3,1,1) = {" +u +q +H +U +x +T +O +I +u +"} +(4,1,1) = {" +u +L +P +O +o +s +o +X +u +"} +(5,1,1) = {" +u +m +A +O +b +v +h +B +u +"} +(6,1,1) = {" +u +C +L +D +b +G +S +Y +u +"} +(7,1,1) = {" +u +W +F +Z +z +q +l +y +u +"} +(8,1,1) = {" +u +E +c +g +t +a +Z +J +u +"} +(9,1,1) = {" +u +u +d +d +d +u +V +r +u +"} +(10,1,1) = {" +p +p +p +p +p +p +p +p +p +"} +(11,1,1) = {" +M +p +p +p +p +p +p +p +e +"} +(12,1,1) = {" +p +p +p +p +p +p +p +p +p +"} +(13,1,1) = {" +u +u +u +u +u +u +u +u +u +"} diff --git a/_maps/RuinGeneration/17x11_2_room_corgbar.dmm b/_maps/RuinGeneration/17x11_2_room_corgbar.dmm new file mode 100644 index 0000000000000..5c124b2187eb4 --- /dev/null +++ b/_maps/RuinGeneration/17x11_2_room_corgbar.dmm @@ -0,0 +1,495 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/ruin/unpowered) +"b" = ( +/obj/structure/chair/sofa/right{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/ruin/unpowered) +"c" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -8 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -8; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"d" = ( +/turf/open/floor/wood, +/area/ruin/unpowered) +"e" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/obj/structure/chair/sofa/left{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/ruin/unpowered) +"f" = ( +/obj/structure/chair/stool/bar, +/obj/structure/chair/stool/bar, +/turf/open/floor/wood, +/area/ruin/unpowered) +"g" = ( +/obj/structure/chair/sofa/right{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/turf/open/floor/carpet/green, +/area/ruin/unpowered) +"h" = ( +/obj/item/beacon, +/obj/structure/chair/wood, +/turf/open/floor/wood, +/area/ruin/unpowered) +"i" = ( +/obj/structure/chair/sofa/right{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"j" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -8 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = -1 + }, +/obj/item/reagent_containers/food/snacks/pizzaslice/pineapple{ + pixel_x = -2; + pixel_y = 9 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"k" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"l" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"m" = ( +/obj/structure/sign/barsign{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"n" = ( +/obj/machinery/newscaster{ + pixel_y = -30 + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -8 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = -1 + }, +/turf/open/floor/carpet/green, +/area/ruin/unpowered) +"o" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"p" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = -9; + pixel_y = 4 + }, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"q" = ( +/obj/structure/chair/wood, +/turf/open/floor/wood, +/area/ruin/unpowered) +"r" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/structure/extinguisher_cabinet{ + pixel_x = -30 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"t" = ( +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/obj/structure/chair/sofa/left{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/turf/open/floor/carpet/green, +/area/ruin/unpowered) +"v" = ( +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"w" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"x" = ( +/obj/structure/table/wood, +/obj/item/modular_computer/laptop/preset/civillian, +/turf/open/floor/carpet/green, +/area/ruin/unpowered) +"y" = ( +/obj/machinery/newscaster{ + pixel_x = 30 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"z" = ( +/obj/structure/chair/sofa/left{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/ruin/unpowered) +"B" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/wood, +/area/ruin/unpowered) +"C" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -8 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = -1 + }, +/obj/machinery/newscaster{ + pixel_y = -30 + }, +/turf/open/floor/carpet/green, +/area/ruin/unpowered) +"D" = ( +/obj/structure/chair/sofa/right{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/ruin/unpowered) +"E" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"F" = ( +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/machinery/vending/cola/random, +/turf/open/floor/wood, +/area/ruin/unpowered) +"G" = ( +/obj/structure/chair/sofa/left, +/turf/open/floor/wood, +/area/ruin/unpowered) +"H" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -8 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = -1 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"I" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"J" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/wood, +/area/ruin/unpowered) +"M" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"N" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -4; + pixel_y = 2 + }, +/turf/open/floor/carpet/green, +/area/ruin/unpowered) +"O" = ( +/obj/structure/chair/sofa/left{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"S" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"T" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"U" = ( +/obj/structure/chair/sofa/right, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"V" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"W" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"Y" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/ruin/unpowered) +"Z" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/turf/open/floor/wood, +/area/ruin/unpowered) + +(1,1,1) = {" +M +M +M +M +M +M +M +M +M +M +"} +(2,1,1) = {" +Z +B +U +p +i +r +w +o +l +t +"} +(3,1,1) = {" +T +d +G +c +O +d +w +o +l +I +"} +(4,1,1) = {" +Z +d +d +d +d +d +w +o +l +l +"} +(5,1,1) = {" +M +d +d +d +d +d +M +M +M +M +"} +(6,1,1) = {" +M +v +d +d +d +d +d +z +D +M +"} +(7,1,1) = {" +M +m +d +d +d +d +d +x +n +M +"} +(8,1,1) = {" +M +W +d +d +d +d +d +b +a +M +"} +(9,1,1) = {" +Y +f +d +h +j +V +d +u +g +M +"} +(10,1,1) = {" +Y +f +d +d +d +d +d +N +C +M +"} +(11,1,1) = {" +Y +f +d +q +H +V +d +b +e +M +"} +(12,1,1) = {" +Y +f +d +d +d +d +d +d +d +M +"} +(13,1,1) = {" +M +v +d +d +d +d +d +d +d +E +"} +(14,1,1) = {" +M +k +d +d +y +d +S +J +F +M +"} +(15,1,1) = {" +M +M +M +M +M +M +M +M +M +M +"} diff --git a/_maps/RuinGeneration/17x13_cargo.dmm b/_maps/RuinGeneration/17x13_cargo.dmm new file mode 100644 index 0000000000000..06a19c5a2d23c --- /dev/null +++ b/_maps/RuinGeneration/17x13_cargo.dmm @@ -0,0 +1,452 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"b" = ( +/obj/machinery/door/poddoor/shutters/preopen, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"c" = ( +/obj/structure/shuttle/engine/heater{ + dir = 4 + }, +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"f" = ( +/obj/structure/shuttle/engine/propulsion/burst/right{ + dir = 4 + }, +/turf/closed/wall/mineral/plastitanium, +/area/ruin/unpowered) +"g" = ( +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/unpowered) +"h" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"i" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"l" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/spawner/lootdrop/crate_spawner, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"n" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"r" = ( +/obj/structure/rack, +/turf/open/floor/mineral/titanium, +/area/ruin/unpowered) +"s" = ( +/obj/effect/spawner/lootdrop/crate_spawner, +/turf/open/floor/mineral/titanium, +/area/ruin/unpowered) +"t" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/ruin/unpowered) +"u" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"v" = ( +/obj/structure/shuttle/engine/propulsion/burst/left{ + dir = 4 + }, +/turf/closed/wall/mineral/plastitanium, +/area/ruin/unpowered) +"w" = ( +/obj/effect/spawner/lootdrop/crate_spawner, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"y" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"B" = ( +/turf/closed/wall/mineral/plastitanium, +/area/ruin/unpowered) +"C" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"D" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"E" = ( +/turf/open/floor/mineral/titanium, +/area/ruin/unpowered) +"F" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"G" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/spawner/lootdrop/crate_spawner, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"H" = ( +/obj/effect/turf_decal/bot, +/obj/effect/spawner/lootdrop/crate_spawner, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"I" = ( +/obj/machinery/door/airlock/mining, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"J" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"K" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"M" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"N" = ( +/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/dark, +/area/ruin/unpowered) +"P" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/unpowered) +"Q" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"S" = ( +/turf/open/floor/engine, +/area/ruin/unpowered) +"T" = ( +/obj/structure/shuttle/engine/propulsion/burst/cargo{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"V" = ( +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"W" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"X" = ( +/obj/machinery/door/poddoor/shutters/preopen, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/titanium, +/area/ruin/unpowered) +"Y" = ( +/turf/closed/wall/mineral/titanium, +/area/ruin/unpowered) + +(1,1,1) = {" +M +h +a +h +M +M +M +M +M +M +M +M +M +"} +(2,1,1) = {" +M +h +h +h +h +h +h +h +h +h +h +h +M +"} +(3,1,1) = {" +M +h +h +h +h +h +h +h +J +J +H +h +M +"} +(4,1,1) = {" +M +h +h +h +h +h +h +h +h +h +h +h +M +"} +(5,1,1) = {" +M +h +h +h +h +h +h +h +G +y +n +h +M +"} +(6,1,1) = {" +M +h +h +h +h +h +h +h +h +h +h +h +M +"} +(7,1,1) = {" +M +Q +Q +Q +Q +Q +Q +i +J +G +n +h +M +"} +(8,1,1) = {" +M +S +S +S +S +S +S +C +h +h +h +h +M +"} +(9,1,1) = {" +M +S +Y +t +t +Y +S +C +h +h +h +h +M +"} +(10,1,1) = {" +M +Y +Y +g +g +Y +Y +M +M +I +M +M +M +"} +(11,1,1) = {" +M +Y +s +P +P +r +Y +M +u +W +W +W +M +"} +(12,1,1) = {" +M +Y +E +E +E +E +X +b +K +l +l +V +M +"} +(13,1,1) = {" +M +Y +E +s +E +E +X +b +K +V +V +V +M +"} +(14,1,1) = {" +M +Y +s +E +E +E +X +b +K +w +V +V +M +"} +(15,1,1) = {" +M +B +B +c +c +B +B +M +K +D +l +V +M +"} +(16,1,1) = {" +M +S +f +T +T +v +S +M +N +F +F +F +M +"} +(17,1,1) = {" +M +M +M +M +M +M +M +M +M +M +M +M +M +"} diff --git a/_maps/RuinGeneration/17x17_charliecrew.dmm b/_maps/RuinGeneration/17x17_charliecrew.dmm new file mode 100644 index 0000000000000..2243dbcfd2f75 --- /dev/null +++ b/_maps/RuinGeneration/17x17_charliecrew.dmm @@ -0,0 +1,769 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aW" = ( +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"aY" = ( +/obj/effect/decal/remains/human, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"bb" = ( +/obj/item/gun/energy/laser/retro/old{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"bs" = ( +/obj/machinery/door/airlock/highsecurity, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"bt" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"cF" = ( +/obj/machinery/door/airlock/highsecurity, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"de" = ( +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"dS" = ( +/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/white, +/area/ruin/unpowered) +"dV" = ( +/obj/structure/showcase/machinery/oldpod, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"eh" = ( +/obj/machinery/computer/rdconsole/core{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"ft" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"fE" = ( +/obj/effect/mob_spawn/human/oldsec, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"fF" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"gv" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"gZ" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"hp" = ( +/obj/item/gun/energy/laser/retro/old{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"hQ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/chem_heater, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"iW" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"jR" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/modular_fabricator/autolathe/hacked, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"jW" = ( +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/mineral/copper/five, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"kC" = ( +/obj/effect/mob_spawn/human/oldsci, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"lf" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"lk" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"lm" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"lZ" = ( +/obj/structure/table/reinforced, +/obj/item/paper/fluff/ruins/oldstation, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"mj" = ( +/obj/structure/table/reinforced, +/obj/item/gun/energy/e_gun/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"mW" = ( +/obj/machinery/rnd/production/circuit_imprinter, +/obj/item/reagent_containers/dropper, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"nX" = ( +/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/ruin/unpowered) +"of" = ( +/obj/structure/table/reinforced, +/obj/item/stack/sheet/mineral/uranium/twenty, +/turf/open/floor/carpet/red, +/area/ruin/unpowered) +"po" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ps" = ( +/obj/structure/chair/office/light, +/turf/open/floor/carpet/red, +/area/ruin/unpowered) +"ry" = ( +/obj/structure/table/reinforced, +/obj/item/shuttle_creator, +/turf/open/floor/carpet/red, +/area/ruin/unpowered) +"sU" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"td" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"te" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/glowstick, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"uh" = ( +/obj/structure/table/reinforced, +/obj/item/healthanalyzer{ + desc = "A prototype hand-held body scanner able to distinguish vital signs of the subject."; + name = "prototype health analyzer" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"uO" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"wp" = ( +/turf/open/floor/carpet/red, +/area/ruin/unpowered) +"ww" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"wJ" = ( +/obj/structure/table/reinforced, +/obj/item/assembly/flash/handheld, +/obj/machinery/recharger, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"wX" = ( +/obj/structure/closet/crate/secure/weapon{ + req_access_txt = "203" + }, +/obj/item/storage/box/firingpins, +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/sheet/mineral/diamond/five, +/obj/item/stack/sheet/mineral/gold/five, +/obj/item/stack/sheet/mineral/silver/five, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"yg" = ( +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"yL" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/table, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/capacitor, +/obj/item/stock_parts/micro_laser, +/obj/item/stack/cable_coil, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/scanning_module{ + pixel_x = 2; + pixel_y = 3 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"zy" = ( +/obj/structure/table/optable{ + name = "Robotics Operating Table" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Cq" = ( +/obj/structure/table/reinforced, +/obj/item/folder/red, +/turf/open/floor/carpet/red, +/area/ruin/unpowered) +"Cv" = ( +/obj/item/gun/energy/kinetic_accelerator, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Dy" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/drinks/soda_cans/cola, +/turf/open/floor/carpet/red, +/area/ruin/unpowered) +"Em" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/turf/open/floor/carpet/red, +/area/ruin/unpowered) +"Ff" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/fyellow/old, +/obj/item/clothing/gloves/color/fyellow/old, +/obj/item/stack/sheet/mineral/plasma/five, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Fq" = ( +/obj/machinery/modular_fabricator/exosuit_fab{ + auto_link = 0 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"FZ" = ( +/obj/machinery/chem_master, +/obj/item/reagent_containers/glass/beaker, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Gu" = ( +/obj/effect/spawner/structure/window/plastitanium, +/turf/open/floor/plating, +/area/ruin/unpowered) +"GX" = ( +/obj/structure/closet/crate, +/obj/item/storage/backpack/old, +/obj/item/storage/backpack/old, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Iw" = ( +/obj/machinery/the_singularitygen, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"JG" = ( +/obj/item/storage/toolbox/syndicate, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"Ks" = ( +/obj/structure/table/reinforced, +/obj/item/crowbar, +/obj/item/flashlight/glowstick, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"KM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/circular_saw, +/obj/item/retractor, +/obj/item/hemostat, +/obj/item/scalpel{ + pixel_y = 12 + }, +/obj/item/cautery{ + pixel_x = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"KT" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Ln" = ( +/obj/structure/table/reinforced, +/obj/item/paper, +/obj/item/pen, +/turf/open/floor/carpet/red, +/area/ruin/unpowered) +"OX" = ( +/obj/machinery/computer{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Pp" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/ore_silo, +/obj/item/multitool, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Pw" = ( +/obj/structure/showcase/machinery/oldpod, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"PK" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"QB" = ( +/obj/effect/mob_spawn/human/oldeng, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"Rr" = ( +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Uh" = ( +/obj/machinery/rnd/destructive_analyzer, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"UJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Vu" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/suit/armor/vest/old, +/obj/item/clothing/head/helmet/old, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Vz" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/mineral/ore_redemption{ + input_dir = 4; + output_dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"VC" = ( +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Wc" = ( +/obj/item/clothing/suit/space/hardsuit/ancient, +/obj/structure/rack, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Wt" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Yp" = ( +/obj/machinery/rnd/production/protolathe, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Zo" = ( +/obj/structure/table, +/obj/item/tank/internals/anesthetic, +/obj/item/clothing/mask/breath/medical, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) + +(1,1,1) = {" +lk +lk +lk +lk +lk +lk +lk +lk +lk +lf +lf +lf +lf +lf +lf +lf +lf +"} +(2,1,1) = {" +lk +yg +dV +kC +iW +bb +aY +lm +lk +GX +sU +sU +wp +wp +wp +wp +lf +"} +(3,1,1) = {" +lk +Pw +bt +Pw +QB +iW +yg +yg +cF +sU +uO +sU +Dy +ps +wp +Em +lf +"} +(4,1,1) = {" +lk +yg +dV +fE +iW +ww +hp +JG +lk +uO +uO +uO +of +ry +Cq +Ln +lf +"} +(5,1,1) = {" +lk +lk +Gu +Gu +Gu +Gu +lk +lk +lk +uO +uO +uO +uO +uO +sU +uO +lf +"} +(6,1,1) = {" +lf +wJ +VC +VC +Vu +OX +Ff +lf +Ks +uO +uO +uO +uO +uO +uO +sU +lf +"} +(7,1,1) = {" +lf +Rr +Rr +Wt +KT +gZ +Rr +lf +lZ +uO +sU +uO +sU +uO +uO +sU +lf +"} +(8,1,1) = {" +lf +KT +Rr +Rr +KT +Rr +Rr +lf +te +uO +sU +sU +sU +uO +sU +sU +lf +"} +(9,1,1) = {" +lf +mj +KT +wX +uh +Iw +Wc +lf +lf +fF +lf +lf +lf +lf +lf +lf +lf +"} +(10,1,1) = {" +lf +lf +bs +lf +lf +lf +lf +lf +sU +sU +sU +lf +sU +sU +sU +sU +lf +"} +(11,1,1) = {" +lf +sU +sU +uO +uO +uO +uO +uO +Cv +uO +sU +lf +sU +sU +sU +sU +lf +"} +(12,1,1) = {" +lf +sU +uO +po +UJ +uO +sU +sU +sU +uO +sU +fF +sU +sU +de +de +lf +"} +(13,1,1) = {" +lf +nX +Uh +mW +Vz +sU +sU +nX +Zo +zy +dS +lf +sU +de +de +de +lf +"} +(14,1,1) = {" +lf +aW +td +td +ft +sU +sU +aW +td +aW +td +lf +lf +de +de +de +lf +"} +(15,1,1) = {" +lf +aW +aW +td +aW +uO +sU +aW +aW +PK +aW +jW +lf +de +de +de +lf +"} +(16,1,1) = {" +lf +Pp +eh +Yp +jR +KM +uO +hQ +Fq +FZ +aW +yL +lf +de +de +de +lf +"} +(17,1,1) = {" +lf +lf +lf +lf +lf +lf +lf +lf +lf +lf +lf +lf +lf +de +gv +de +lf +"} diff --git a/_maps/RuinGeneration/21x17_shuttledock.dmm b/_maps/RuinGeneration/21x17_shuttledock.dmm new file mode 100644 index 0000000000000..1567863815a0d --- /dev/null +++ b/_maps/RuinGeneration/21x17_shuttledock.dmm @@ -0,0 +1,449 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"c" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"h" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"i" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/unpowered) +"k" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"v" = ( +/obj/machinery/door/airlock/external/glass, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"A" = ( +/turf/template_noop, +/area/template_noop) +"F" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"W" = ( +/obj/machinery/door/poddoor/shutters{ + id = "exploration" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +F +F +F +F +F +F +F +F +F +F +F +F +F +k +h +k +F +"} +(2,1,1) = {" +F +q +k +k +k +k +k +k +k +k +k +k +k +k +k +k +F +"} +(3,1,1) = {" +F +u +k +k +k +k +k +k +k +k +k +k +k +k +k +k +F +"} +(4,1,1) = {" +F +c +k +k +F +F +i +i +i +i +i +F +F +k +k +k +F +"} +(5,1,1) = {" +F +k +k +k +F +A +A +A +A +A +A +A +F +k +k +k +F +"} +(6,1,1) = {" +F +k +k +k +i +A +A +A +A +A +A +A +i +k +k +k +F +"} +(7,1,1) = {" +F +k +k +k +F +A +A +A +A +A +A +A +F +k +k +k +F +"} +(8,1,1) = {" +F +k +k +k +W +A +A +A +A +A +A +A +W +k +k +k +F +"} +(9,1,1) = {" +F +k +k +k +W +A +A +A +A +A +A +A +W +k +k +k +F +"} +(10,1,1) = {" +F +k +k +k +F +A +A +A +A +A +A +A +F +k +k +k +F +"} +(11,1,1) = {" +F +k +k +k +F +A +A +A +A +A +A +A +F +k +k +k +F +"} +(12,1,1) = {" +F +k +k +k +v +A +A +A +A +A +A +A +v +k +k +k +F +"} +(13,1,1) = {" +F +k +k +k +F +A +A +A +A +A +A +A +F +k +k +k +F +"} +(14,1,1) = {" +F +k +k +k +i +A +A +A +A +A +A +A +i +k +k +k +F +"} +(15,1,1) = {" +F +k +k +k +i +A +A +A +A +A +A +A +i +k +k +k +F +"} +(16,1,1) = {" +F +k +k +k +i +A +A +A +A +A +A +A +i +k +k +k +F +"} +(17,1,1) = {" +F +k +k +k +F +A +A +A +A +A +A +A +F +k +k +k +F +"} +(18,1,1) = {" +F +k +k +k +F +F +i +i +i +i +i +F +F +k +k +k +F +"} +(19,1,1) = {" +F +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +F +"} +(20,1,1) = {" +F +k +k +k +k +k +k +k +k +k +k +k +k +k +k +c +F +"} +(21,1,1) = {" +F +k +b +k +F +F +F +F +F +F +F +F +F +F +F +F +F +"} diff --git a/_maps/RuinGeneration/21x19_solars.dmm b/_maps/RuinGeneration/21x19_solars.dmm new file mode 100644 index 0000000000000..93111be5582c9 --- /dev/null +++ b/_maps/RuinGeneration/21x19_solars.dmm @@ -0,0 +1,903 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"c" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/template_noop, +/area/template_noop) +"f" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/ruin/unpowered) +"g" = ( +/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, +/area/template_noop) +"i" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/template_noop, +/area/template_noop) +"j" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"k" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/template_noop, +/area/template_noop) +"l" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plating, +/area/ruin/unpowered) +"m" = ( +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/template_noop) +"n" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/space/basic, +/area/template_noop) +"o" = ( +/obj/structure/lattice, +/obj/structure/grille/broken, +/turf/template_noop, +/area/template_noop) +"p" = ( +/obj/machinery/power/terminal, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"q" = ( +/turf/template_noop, +/area/template_noop) +"r" = ( +/obj/effect/spawner/room/threexthree, +/turf/open/floor/plating, +/area/ruin/unpowered) +"s" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"t" = ( +/obj/item/stack/rods, +/turf/template_noop, +/area/template_noop) +"u" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"v" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/space/basic, +/area/template_noop) +"w" = ( +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/solar{ + id = "auxsolareast"; + name = "Port Auxiliary Solar Array" + }, +/turf/open/floor/plasteel/airless/solarpanel, +/area/template_noop) +"x" = ( +/obj/structure/cable, +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/template_noop) +"z" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"B" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"E" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"F" = ( +/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/ruin/unpowered) +"G" = ( +/obj/structure/lattice, +/obj/item/stack/cable_coil/random, +/turf/template_noop, +/area/template_noop) +"I" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"J" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space, +/area/template_noop) +"K" = ( +/obj/machinery/power/solar_control{ + id = "auxsolareast"; + name = "Starboard Bow Solar Control" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"L" = ( +/obj/structure/cable, +/obj/machinery/power/solar{ + id = "auxsolareast"; + name = "Port Auxiliary Solar Array" + }, +/turf/open/floor/plasteel/airless/solarpanel, +/area/template_noop) +"N" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/template_noop, +/area/template_noop) +"O" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"P" = ( +/obj/machinery/power/tracker, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/airless/solarpanel, +/area/template_noop) +"S" = ( +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/power/smes, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"U" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"W" = ( +/obj/structure/grille, +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"Z" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) + +(1,1,1) = {" +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +z +z +q +q +q +q +"} +(2,1,1) = {" +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +z +z +q +q +q +q +q +"} +(3,1,1) = {" +q +q +q +q +q +W +o +W +W +W +W +W +W +W +W +W +W +W +W +W +q +z +z +q +q +q +q +q +q +"} +(4,1,1) = {" +q +q +q +q +q +W +q +z +q +z +q +z +q +z +q +z +q +z +q +W +z +z +q +q +q +q +q +q +q +"} +(5,1,1) = {" +q +q +q +q +q +W +q +w +n +L +q +w +n +L +q +w +n +L +q +W +z +q +q +q +q +q +q +q +q +"} +(6,1,1) = {" +q +q +q +q +q +W +z +w +v +L +q +w +v +L +q +w +v +L +z +z +q +q +q +q +q +q +q +q +q +"} +(7,1,1) = {" +q +q +q +q +q +W +q +w +v +L +z +w +v +L +z +w +v +L +q +z +q +q +q +q +q +q +q +q +q +"} +(8,1,1) = {" +q +q +q +q +q +z +z +w +v +L +q +w +v +L +q +w +v +L +z +z +z +z +z +z +z +z +z +q +q +"} +(9,1,1) = {" +q +q +W +W +W +z +q +w +v +L +q +w +v +L +q +w +v +L +q +z +q +q +q +q +f +b +b +b +b +"} +(10,1,1) = {" +q +q +W +q +z +q +q +q +i +q +q +q +i +q +q +q +i +q +q +z +q +q +f +f +f +K +Z +j +b +"} +(11,1,1) = {" +q +q +W +z +P +N +N +x +m +m +m +m +m +m +m +m +m +m +m +m +k +N +B +s +I +U +E +j +l +"} +(12,1,1) = {" +q +q +W +q +z +q +q +q +c +q +q +q +c +q +q +q +c +q +q +z +q +q +f +b +b +F +p +S +O +"} +(13,1,1) = {" +q +q +W +o +W +G +q +w +g +L +q +w +g +L +q +w +g +L +q +z +q +q +q +q +b +b +b +b +b +"} +(14,1,1) = {" +q +q +q +q +q +z +z +w +g +L +q +w +g +L +q +w +g +L +z +z +z +z +z +z +z +z +z +b +q +"} +(15,1,1) = {" +q +q +q +q +q +W +q +w +g +L +z +w +g +L +z +w +g +L +q +z +q +q +q +z +q +q +q +b +q +"} +(16,1,1) = {" +q +q +q +q +q +W +z +w +g +L +q +w +g +L +q +w +g +L +z +z +q +q +q +z +q +q +q +b +q +"} +(17,1,1) = {" +q +q +q +q +q +W +q +w +J +L +q +w +J +L +q +w +J +L +q +W +z +z +z +z +u +u +u +u +u +"} +(18,1,1) = {" +q +q +q +q +q +W +q +z +q +z +q +z +q +z +q +z +q +t +q +W +q +q +q +q +f +j +j +r +u +"} +(19,1,1) = {" +q +q +q +q +q +W +W +W +W +W +W +W +W +W +W +W +W +o +W +W +z +q +q +z +f +j +j +j +l +"} +(20,1,1) = {" +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +z +z +q +q +q +f +j +j +j +u +"} +(21,1,1) = {" +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +q +z +z +q +q +u +u +u +u +u +"} diff --git a/_maps/RuinGeneration/21x21_singularity.dmm b/_maps/RuinGeneration/21x21_singularity.dmm new file mode 100644 index 0000000000000..7a0273d15885d --- /dev/null +++ b/_maps/RuinGeneration/21x21_singularity.dmm @@ -0,0 +1,576 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"c" = ( +/turf/open/floor/plasteel, +/area/ruin) +"d" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin) +"g" = ( +/turf/closed/wall, +/area/ruin) +"j" = ( +/obj/structure/sign/warning/radiation{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/ruin) +"l" = ( +/obj/machinery/the_singularitygen, +/turf/open/floor/plating, +/area/template_noop) +"o" = ( +/obj/machinery/field/generator, +/turf/open/floor/plating, +/area/template_noop) +"p" = ( +/obj/machinery/power/rad_collector, +/turf/open/floor/plasteel, +/area/ruin) +"q" = ( +/obj/structure/sign/warning/radiation{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/ruin) +"x" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel, +/area/ruin) +"z" = ( +/obj/structure/closet/radiation, +/turf/open/floor/plasteel, +/area/ruin) +"A" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin) +"C" = ( +/turf/closed/wall/r_wall, +/area/ruin) +"E" = ( +/obj/machinery/computer, +/turf/open/floor/plasteel, +/area/ruin) +"F" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin) +"G" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin) +"N" = ( +/obj/effect/decal/fakelattice, +/turf/template_noop, +/area/template_noop) +"R" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/ruin) +"S" = ( +/turf/open/floor/plating, +/area/template_noop) +"W" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin) +"X" = ( +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +X +X +X +X +X +g +g +g +g +c +G +c +g +g +g +g +X +X +X +X +X +"} +(2,1,1) = {" +X +X +g +g +g +g +z +c +c +c +c +c +c +c +z +g +g +g +g +X +X +"} +(3,1,1) = {" +X +g +g +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +g +g +X +"} +(4,1,1) = {" +X +g +j +c +c +c +c +c +p +c +c +c +c +c +c +c +c +c +q +g +X +"} +(5,1,1) = {" +X +g +c +c +c +c +c +c +c +c +c +p +c +p +c +c +c +c +c +g +X +"} +(6,1,1) = {" +g +g +c +c +c +C +C +R +R +R +C +R +R +R +C +C +c +c +c +g +g +"} +(7,1,1) = {" +g +c +c +c +c +C +X +N +X +N +X +N +X +N +X +C +x +c +c +c +g +"} +(8,1,1) = {" +g +c +c +c +c +R +N +o +X +S +S +S +X +o +N +R +E +c +c +c +g +"} +(9,1,1) = {" +g +c +c +c +c +R +X +X +X +a +X +a +X +X +X +R +E +W +c +c +g +"} +(10,1,1) = {" +c +c +c +c +c +R +N +S +a +S +S +S +a +S +N +R +E +c +c +c +c +"} +(11,1,1) = {" +d +c +c +c +c +C +X +S +X +S +l +S +X +S +X +C +x +c +c +c +A +"} +(12,1,1) = {" +c +c +c +c +c +R +N +S +a +S +S +S +a +S +N +R +E +c +c +c +c +"} +(13,1,1) = {" +g +c +c +c +c +R +X +X +X +a +X +a +X +X +X +R +E +W +c +c +g +"} +(14,1,1) = {" +g +c +c +c +c +R +N +o +X +S +S +S +X +o +N +R +E +c +c +c +g +"} +(15,1,1) = {" +g +c +c +c +c +C +X +N +X +N +X +N +X +N +X +C +x +c +c +c +g +"} +(16,1,1) = {" +g +g +c +c +c +C +C +R +R +R +C +R +R +R +C +C +c +c +c +g +g +"} +(17,1,1) = {" +X +g +c +c +c +c +c +c +p +p +c +c +c +c +c +c +c +c +c +g +X +"} +(18,1,1) = {" +X +g +j +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +q +g +X +"} +(19,1,1) = {" +X +g +g +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +g +g +X +"} +(20,1,1) = {" +X +X +g +g +g +g +z +c +c +c +c +c +c +c +z +g +g +g +g +X +X +"} +(21,1,1) = {" +X +X +X +X +X +g +g +g +g +c +F +c +g +g +g +g +X +X +X +X +X +"} diff --git a/_maps/RuinGeneration/41x41_corgasteroid.dmm b/_maps/RuinGeneration/41x41_corgasteroid.dmm new file mode 100644 index 0000000000000..62a12d2acfb4e --- /dev/null +++ b/_maps/RuinGeneration/41x41_corgasteroid.dmm @@ -0,0 +1,2862 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aH" = ( +/obj/structure/transit_tube/diagonal, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"bw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"cl" = ( +/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" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/ruin/unpowered) +"cA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/trinary/mixer/airmix{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"cH" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/space/basic, +/area/space) +"cP" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"cT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/closed/wall, +/area/ruin/unpowered) +"cX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/ruin/unpowered) +"dk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/ruin/unpowered) +"eq" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/ruin/unpowered) +"eZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"fl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/ruin/unpowered) +"fB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/ruin/unpowered) +"fN" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/transit_tube/curved{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"ge" = ( +/obj/structure/sign/warning/vacuum{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/components/unary/tank/air, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/ruin/unpowered) +"gp" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"he" = ( +/obj/structure/transit_tube/curved{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"hn" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/bot, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"hp" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/space/basic, +/area/space) +"ie" = ( +/obj/machinery/power/terminal, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"iy" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plating, +/area/ruin/unpowered) +"jk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"jv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"jC" = ( +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"jG" = ( +/obj/item/pickaxe, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"jZ" = ( +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"kE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"kN" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Escape Pod Charlie" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plating, +/area/ruin/unpowered) +"kS" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"lc" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/ruin/unpowered) +"lO" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"mf" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/ruin/unpowered) +"mi" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"mj" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"mE" = ( +/obj/structure/window/reinforced/spawner, +/turf/open/space/basic, +/area/space) +"nz" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/ruinloot/basic, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"oI" = ( +/obj/structure/window/reinforced/spawner, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 10 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"oR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"oT" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/transit_tube/station/reverse{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"po" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"pz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"qf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"qp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"qq" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"qs" = ( +/obj/machinery/power/port_gen/pacman, +/obj/item/wrench, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"qG" = ( +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 10 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"rp" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Airlock" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"sq" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"sw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"te" = ( +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 5 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"tC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"tH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"uX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"vc" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/transit_tube/curved, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space) +"vh" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"vl" = ( +/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" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/ruin/unpowered) +"vt" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"vN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/firecloset/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"vQ" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"vU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"vY" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/ruin/unpowered) +"vZ" = ( +/turf/open/space/basic, +/area/space) +"wg" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Airlock" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"wl" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"wr" = ( +/obj/machinery/advanced_airlock_controller/directional/east, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"wO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"wS" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/ruin/unpowered) +"xC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"xE" = ( +/obj/structure/sign/warning/vacuum{ + pixel_x = 32 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"xY" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"ym" = ( +/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" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"yQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/ruin/unpowered) +"zc" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"zL" = ( +/turf/closed/mineral/random, +/area/ruin/unpowered) +"Ai" = ( +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Ak" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/space/basic, +/area/space) +"As" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Av" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"AC" = ( +/turf/closed/wall/mineral/plastitanium, +/area/ruin/unpowered) +"AQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"By" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"BA" = ( +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Cb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Cc" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"Cj" = ( +/obj/effect/spawner/room/threexfive, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Co" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/turf/open/space/basic, +/area/space) +"Cr" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Cy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"CK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/ruin/unpowered) +"CX" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Dq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Du" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Dx" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/transit_tube/diagonal, +/turf/open/space/basic, +/area/space) +"DU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"Ef" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"EC" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"EF" = ( +/obj/structure/transit_tube/diagonal/crossing, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"EI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Fv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Fw" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"FX" = ( +/obj/item/crowbar/red, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"FY" = ( +/obj/structure/transit_tube/diagonal, +/turf/open/space/basic, +/area/space) +"GM" = ( +/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/plating, +/area/ruin/unpowered) +"Hc" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Hf" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space) +"If" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Iw" = ( +/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" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/ruin/unpowered) +"IF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"IL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"IX" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Jn" = ( +/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" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/ruin/unpowered) +"JI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"JK" = ( +/obj/structure/bonfire, +/obj/effect/spawner/lootdrop/ruinloot/important, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"JL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/ruinloot/basic, +/turf/open/floor/plating, +/area/ruin/unpowered) +"JP" = ( +/obj/effect/spawner/room/fivexfour, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Ln" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Lr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"LM" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Nr" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/space/basic, +/area/space) +"Ns" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"Nz" = ( +/obj/structure/chair/comfy/black, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"Ok" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Ov" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Oz" = ( +/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/plating, +/area/ruin/unpowered) +"OX" = ( +/obj/effect/spawner/room/tenxfive, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Pk" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"Pv" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/ruin/unpowered) +"PF" = ( +/obj/effect/spawner/room/tenxten, +/turf/open/floor/plating, +/area/ruin/unpowered) +"PY" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/transit_tube/curved/flipped{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Qr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Qv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"QD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/stack/sheet/mineral/plasma, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"QV" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"Rf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ri" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space) +"Rq" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"RG" = ( +/obj/structure/transit_tube/diagonal, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/space/basic, +/area/space) +"RP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"RT" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"RY" = ( +/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" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Si" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating, +/area/ruin/unpowered) +"SC" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Tt" = ( +/obj/effect/spawner/lootdrop/ruinloot/basic, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"Ty" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"TZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"Ue" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Uo" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"UB" = ( +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/ruinloot/basic, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"UN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Vd" = ( +/obj/structure/transit_tube, +/turf/open/space/basic, +/area/space) +"Vn" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/transit_tube/station/reverse/flipped{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/transit_tube_pod{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Vo" = ( +/obj/structure/table/wood, +/obj/item/candle, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"VQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/firecloset/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"VT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/closed/wall, +/area/ruin/unpowered) +"Wc" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/obj/machinery/advanced_airlock_controller/directional/east, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Wn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Xc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Xy" = ( +/obj/structure/transit_tube, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"XL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"YM" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/dark/hidden, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"YT" = ( +/obj/structure/chair/stool, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) + +(1,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(2,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +Pk +mE +IX +RT +Fw +"} +(3,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +Ri +Pk +Pk +mE +Vn +If +Ov +"} +(4,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +Ri +vZ +vZ +vZ +vZ +vZ +Pk +xY +PY +If +Fw +"} +(5,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +Pk +vZ +vZ +vZ +vZ +vZ +Pk +Dx +Ue +CX +Fw +"} +(6,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +Ri +Pk +Pk +Pk +Pk +Pk +Pk +Pk +Pk +aH +Pk +Co +Fw +Fw +"} +(7,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +SC +SC +SC +SC +SC +JI +fB +vh +Fw +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +Pk +vZ +vZ +vZ +vZ +FY +Pk +vZ +vZ +vZ +vZ +"} +(8,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +SC +Ai +Ai +jk +AQ +IL +rp +Cr +rp +Ri +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +Pk +vZ +vZ +vZ +EF +Pk +Pk +Pk +Pk +Pk +vZ +"} +(9,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +Ri +Pk +SC +Ai +Ai +Fv +po +Dq +Fw +wr +Pv +hp +hp +hp +hp +hp +hp +hp +hp +hp +hp +hp +hp +hp +hp +hp +RG +vZ +vZ +Pk +vZ +vZ +vZ +vZ +"} +(10,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +Fw +SC +Fw +Fw +Fw +GM +Fw +Fw +Fw +Hf +Hf +Hf +Hf +vc +Vd +Xy +Vd +Xy +Vd +Xy +Vd +Xy +Xy +he +cH +Pk +Pk +Pk +Pk +Ri +vZ +vZ +"} +(11,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +Pk +vZ +Fw +Rq +Rq +Cb +Rq +OX +Fw +qq +cP +oT +fN +qq +Fw +Fw +eq +eq +Fw +Fw +vZ +Pk +vZ +vZ +cH +vZ +vZ +Pk +vZ +vZ +vZ +vZ +"} +(12,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +Ri +Pk +Pk +zL +Fw +Rq +Rq +Cb +Rq +Rq +Fw +po +UB +RP +BA +po +Fw +Rq +Rq +Rq +JP +Fw +VT +fB +vh +Fw +cH +Pk +vZ +Ri +vZ +vZ +vZ +vZ +"} +(13,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +Pk +zL +Fw +Rq +Rq +Cb +Rq +Rq +Fw +VQ +Rf +LM +po +vN +Fw +Rq +Rq +Rq +Rq +Fw +Cb +wg +Wc +wg +cH +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(14,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +Fw +Rq +Rq +Cb +Rq +Rq +Fw +hn +Av +po +po +qf +Fw +Xc +fl +fl +fl +Iw +Ef +cX +cT +Fw +cH +Pk +vZ +vZ +vZ +vZ +vZ +vZ +"} +(15,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +zL +Fw +Rq +Rq +Cb +Rq +Rq +Fw +Fw +ym +Fw +Fw +Fw +Fw +Cb +Rq +Rq +Rq +Fw +xC +eq +vZ +vZ +cH +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(16,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +QV +zL +zL +jZ +Fw +Rq +Rq +vt +fl +fl +Iw +wS +By +mf +fl +fl +dk +Qr +Rq +Rq +Rq +Fw +xC +eq +Pk +Ak +Nr +Pk +vZ +vZ +vZ +vZ +vZ +vZ +"} +(17,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +oI +YM +te +jZ +Fw +Rq +Rq +Cb +Rq +Rq +Fw +Fw +Fw +Fw +Fw +Jn +Fw +Fw +Fw +Fw +Fw +Fw +xC +Fw +vZ +cH +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(18,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +kS +jC +Tt +Fw +Rq +Rq +Cb +Rq +Rq +Fw +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +PF +Fw +xC +eq +vZ +cH +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(19,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +jZ +jC +jZ +Fw +Rq +Rq +Cb +Rq +Rq +Fw +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Fw +FX +CK +hp +Nr +Pk +Pk +Ri +vZ +vZ +vZ +vZ +vZ +"} +(20,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +jZ +Ty +jZ +Fw +Rq +Rq +Cb +Rq +Rq +Fw +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Fw +xC +eq +vZ +Ri +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(21,1,1) = {" +vZ +Ri +Pk +Pk +Pk +Pk +zL +vY +jZ +Ok +qs +Fw +Fw +Fw +ym +Fw +Fw +Fw +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Fw +xC +Fw +vZ +Ri +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(22,1,1) = {" +vZ +vZ +vZ +Pk +vZ +zL +Fw +ge +XL +Uo +EC +Fw +Rq +Rq +Cb +Rq +Cj +Fw +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Oz +xC +eq +vZ +Ri +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(23,1,1) = {" +vZ +AC +Fw +Fw +Fw +zL +zL +tH +Cy +QD +lc +Fw +Rq +Rq +vt +fl +fl +Iw +Qv +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +UN +RY +iy +eq +Ri +Ri +Pk +Pk +Ri +vZ +vZ +vZ +vZ +vZ +"} +(24,1,1) = {" +vZ +vZ +vZ +vZ +vZ +zL +Hc +jZ +Cy +ie +gp +Fw +Rq +Rq +Cb +Rq +Rq +Fw +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Fw +xC +eq +vZ +Ri +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(25,1,1) = {" +vZ +vZ +vZ +vZ +vZ +kN +Hc +jZ +Cy +qG +te +Fw +Fw +Fw +vl +Fw +Fw +Fw +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Fw +xC +Fw +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(26,1,1) = {" +vZ +vZ +vZ +vZ +vZ +zL +Hc +Cc +JL +cA +wO +bw +Fw +Rq +Cb +Rq +JP +Fw +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Fw +xC +eq +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(27,1,1) = {" +vZ +AC +Fw +Fw +Fw +zL +zL +jZ +EI +vU +Du +fl +Wn +fl +Si +Rq +Rq +Fw +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Rq +Fw +zc +eq +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(28,1,1) = {" +vZ +vZ +vZ +Pk +vZ +zL +zL +jZ +uX +pz +Lr +As +Fw +Rq +Cb +Rq +Rq +Fw +Fw +Fw +Fw +Fw +Fw +Fw +Fw +Fw +Fw +Fw +Fw +xC +eq +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(29,1,1) = {" +vZ +Ri +Pk +Pk +Pk +zL +zL +jZ +jZ +jZ +DU +jZ +Fw +Rq +sw +fl +fl +cl +qp +XL +IF +As +bC +jZ +Ns +Ln +yQ +yQ +RY +oR +Fw +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(30,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +zL +jZ +jZ +Cc +DU +jZ +Fw +Rq +Rq +Rq +Rq +Fw +Fw +TZ +eZ +Cc +DU +jZ +DU +zL +zL +zL +Fw +Fw +Fw +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(31,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +jZ +jZ +DU +jZ +Fw +Fw +Fw +Fw +Fw +Fw +jZ +jZ +jZ +jZ +DU +jZ +DU +jZ +zL +zL +vZ +Pk +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(32,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +jZ +jZ +DU +jZ +jZ +jZ +jZ +jZ +jZ +jZ +jZ +jZ +YT +YT +mi +jZ +DU +zL +zL +vZ +vZ +Pk +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(33,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +zL +xE +tC +kE +kE +kE +kE +kE +kE +kE +kE +kE +kE +kE +vQ +kE +jv +zL +zL +vZ +vZ +Pk +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(34,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +Fw +zL +jZ +jZ +Cc +jZ +jZ +jZ +jZ +Cc +jZ +jZ +JK +jZ +Cc +jZ +sq +zL +zL +Pk +Pk +Pk +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(35,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +zL +zL +jZ +jZ +jZ +nz +jZ +jZ +jZ +jZ +jZ +jZ +jZ +jZ +jZ +nz +zL +zL +vZ +Pk +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(36,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +zL +zL +zL +zL +sq +jZ +jZ +jZ +YT +YT +YT +jZ +jZ +jZ +wl +eq +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(37,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +zL +zL +zL +zL +zL +xE +jG +jZ +jZ +jZ +jZ +jZ +jZ +jZ +Vo +eq +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(38,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +zL +Fw +zL +jZ +Cc +jZ +jZ +jZ +jZ +jZ +mj +eq +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(39,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +zL +nz +nz +Nz +Vo +lO +zL +zL +zL +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(40,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +zL +zL +eq +eq +eq +zL +zL +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} +(41,1,1) = {" +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +zL +zL +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +vZ +"} diff --git a/_maps/RuinGeneration/5x5_0_hallwaycross.dmm b/_maps/RuinGeneration/5x5_0_hallwaycross.dmm new file mode 100644 index 0000000000000..50326dcafabc6 --- /dev/null +++ b/_maps/RuinGeneration/5x5_0_hallwaycross.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"c" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"m" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"n" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"x" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"J" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Q" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +m +Q +J +Q +m +"} +(2,1,1) = {" +Q +Q +Q +Q +Q +"} +(3,1,1) = {" +n +Q +Q +Q +c +"} +(4,1,1) = {" +Q +Q +Q +Q +Q +"} +(5,1,1) = {" +m +Q +x +Q +m +"} diff --git a/_maps/RuinGeneration/5x5_14_hallway-end-east.dmm b/_maps/RuinGeneration/5x5_14_hallway-end-east.dmm new file mode 100644 index 0000000000000..c3a85bac220c7 --- /dev/null +++ b/_maps/RuinGeneration/5x5_14_hallway-end-east.dmm @@ -0,0 +1,67 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"n" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"o" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"F" = ( +/turf/template_noop, +/area/template_noop) +"M" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/firedoor/window, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Q" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/ruin/unpowered) +"R" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +a +R +o +R +a +"} +(2,1,1) = {" +a +R +R +R +a +"} +(3,1,1) = {" +a +Q +Q +M +a +"} +(4,1,1) = {" +F +n +F +n +F +"} +(5,1,1) = {" +F +F +F +F +F +"} diff --git a/_maps/RuinGeneration/5x5_14_hallway-end-north.dmm b/_maps/RuinGeneration/5x5_14_hallway-end-north.dmm new file mode 100644 index 0000000000000..2532496cf531c --- /dev/null +++ b/_maps/RuinGeneration/5x5_14_hallway-end-north.dmm @@ -0,0 +1,59 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"f" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"N" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"O" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"R" = ( +/turf/template_noop, +/area/template_noop) +"T" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/ruin/unpowered) +"X" = ( +/turf/closed/wall, +/area/ruin/unpowered) + +(1,1,1) = {" +R +R +X +X +X +"} +(2,1,1) = {" +R +O +T +f +f +"} +(3,1,1) = {" +R +R +T +f +N +"} +(4,1,1) = {" +R +O +T +f +f +"} +(5,1,1) = {" +R +R +X +X +X +"} diff --git a/_maps/RuinGeneration/5x5_14_hallway-end-south.dmm b/_maps/RuinGeneration/5x5_14_hallway-end-south.dmm new file mode 100644 index 0000000000000..a902ea8557aac --- /dev/null +++ b/_maps/RuinGeneration/5x5_14_hallway-end-south.dmm @@ -0,0 +1,61 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"c" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"g" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"j" = ( +/turf/template_noop, +/area/template_noop) +"C" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/ruin/unpowered) +"P" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Q" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +g +g +g +j +j +"} +(2,1,1) = {" +P +P +C +c +j +"} +(3,1,1) = {" +Q +P +C +j +j +"} +(4,1,1) = {" +P +P +C +c +j +"} +(5,1,1) = {" +g +g +g +j +j +"} diff --git a/_maps/RuinGeneration/5x5_14_hallway-end-west.dmm b/_maps/RuinGeneration/5x5_14_hallway-end-west.dmm new file mode 100644 index 0000000000000..b6fd202e70195 --- /dev/null +++ b/_maps/RuinGeneration/5x5_14_hallway-end-west.dmm @@ -0,0 +1,61 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"g" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"y" = ( +/turf/template_noop, +/area/template_noop) +"z" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"O" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"P" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/ruin/unpowered) + +(1,1,1) = {" +y +y +y +y +y +"} +(2,1,1) = {" +y +z +y +z +y +"} +(3,1,1) = {" +g +V +V +V +g +"} +(4,1,1) = {" +g +P +P +P +g +"} +(5,1,1) = {" +g +P +O +P +g +"} diff --git a/_maps/RuinGeneration/5x5_1_hallwayvertical_eastwest_room.dmm b/_maps/RuinGeneration/5x5_1_hallwayvertical_eastwest_room.dmm new file mode 100644 index 0000000000000..03e1af388009c --- /dev/null +++ b/_maps/RuinGeneration/5x5_1_hallwayvertical_eastwest_room.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"h" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"m" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"M" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Q" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"S" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +h +h +S +h +h +"} +(2,1,1) = {" +Q +Q +Q +Q +Q +"} +(3,1,1) = {" +M +Q +Q +Q +V +"} +(4,1,1) = {" +Q +Q +Q +Q +Q +"} +(5,1,1) = {" +h +h +m +h +h +"} diff --git a/_maps/RuinGeneration/5x5_20_hallwayhorizontal.dmm b/_maps/RuinGeneration/5x5_20_hallwayhorizontal.dmm new file mode 100644 index 0000000000000..46f7f1791511b --- /dev/null +++ b/_maps/RuinGeneration/5x5_20_hallwayhorizontal.dmm @@ -0,0 +1,55 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"g" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"q" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"B" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"P" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +g +P +B +P +g +"} +(2,1,1) = {" +g +P +P +P +g +"} +(3,1,1) = {" +g +P +P +P +g +"} +(4,1,1) = {" +g +P +P +P +g +"} +(5,1,1) = {" +g +P +q +P +g +"} diff --git a/_maps/RuinGeneration/5x5_20_hallwayvertical.dmm b/_maps/RuinGeneration/5x5_20_hallwayvertical.dmm new file mode 100644 index 0000000000000..020d1aaa6b71b --- /dev/null +++ b/_maps/RuinGeneration/5x5_20_hallwayvertical.dmm @@ -0,0 +1,53 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"h" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"M" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Q" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +h +h +h +h +h +"} +(2,1,1) = {" +Q +Q +Q +Q +Q +"} +(3,1,1) = {" +M +Q +Q +Q +V +"} +(4,1,1) = {" +Q +Q +Q +Q +Q +"} +(5,1,1) = {" +h +h +h +h +h +"} diff --git a/_maps/RuinGeneration/5x5_4_room-dorm.dmm b/_maps/RuinGeneration/5x5_4_room-dorm.dmm new file mode 100644 index 0000000000000..692f34867b5a7 --- /dev/null +++ b/_maps/RuinGeneration/5x5_4_room-dorm.dmm @@ -0,0 +1,80 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"b" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/floor/wood, +/area/ruin/unpowered) +"l" = ( +/obj/structure/dresser, +/turf/open/floor/wood, +/area/ruin/unpowered) +"p" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/obj/item/toy/plush/carpplushie, +/turf/open/floor/wood, +/area/ruin/unpowered) +"B" = ( +/obj/item/chair/wood, +/turf/open/floor/wood, +/area/ruin/unpowered) +"H" = ( +/obj/item/toy/plush/lizardplushie, +/turf/open/floor/wood, +/area/ruin/unpowered) +"J" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"U" = ( +/turf/open/floor/wood, +/area/ruin/unpowered) +"W" = ( +/obj/structure/sign/poster/official/no_erp{ + pixel_y = 32 + }, +/obj/structure/table_frame/wood, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/wood, +/area/ruin/unpowered) + +(1,1,1) = {" +a +a +a +a +a +"} +(2,1,1) = {" +a +l +B +l +a +"} +(3,1,1) = {" +a +W +U +H +a +"} +(4,1,1) = {" +a +p +U +b +a +"} +(5,1,1) = {" +a +a +J +a +a +"} diff --git a/_maps/RuinGeneration/5x5_4_room-janitor_closet.dmm b/_maps/RuinGeneration/5x5_4_room-janitor_closet.dmm new file mode 100644 index 0000000000000..4b646e0f6687c --- /dev/null +++ b/_maps/RuinGeneration/5x5_4_room-janitor_closet.dmm @@ -0,0 +1,119 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"l" = ( +/obj/structure/mopbucket, +/obj/item/mop/cyborg, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"n" = ( +/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/ruin/unpowered) +"x" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/reagent_dispensers/watertank, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"y" = ( +/obj/structure/rack, +/obj/effect/turf_decal/delivery, +/obj/item/soap/nanotrasen, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"E" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"M" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"P" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 12 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/lusty_xenomorph{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"W" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +M +M +M +M +M +"} +(2,1,1) = {" +M +y +E +x +M +"} +(3,1,1) = {" +M +V +W +W +b +"} +(4,1,1) = {" +M +l +P +n +M +"} +(5,1,1) = {" +M +M +M +M +M +"} diff --git a/_maps/RuinGeneration/5x5_4_room-storage.dmm b/_maps/RuinGeneration/5x5_4_room-storage.dmm new file mode 100644 index 0000000000000..76e5f92cadaa7 --- /dev/null +++ b/_maps/RuinGeneration/5x5_4_room-storage.dmm @@ -0,0 +1,78 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"e" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"f" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"i" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"j" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"k" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"z" = ( +/obj/effect/decal/cleanable/oil/streak, +/turf/open/floor/plating, +/area/ruin/unpowered) +"G" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"W" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"X" = ( +/obj/vehicle/ridden/atv, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Y" = ( +/obj/structure/closet/crate/secure/loot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +e +e +e +e +e +"} +(2,1,1) = {" +e +X +G +Y +e +"} +(3,1,1) = {" +j +k +i +W +e +"} +(4,1,1) = {" +e +f +i +z +e +"} +(5,1,1) = {" +e +e +e +e +e +"} diff --git a/_maps/RuinGeneration/5x5_4_room-toilet.dmm b/_maps/RuinGeneration/5x5_4_room-toilet.dmm new file mode 100644 index 0000000000000..00d7e5d419fff --- /dev/null +++ b/_maps/RuinGeneration/5x5_4_room-toilet.dmm @@ -0,0 +1,82 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"c" = ( +/obj/structure/urinal{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"g" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -14 + }, +/obj/structure/mirror{ + pixel_x = -28 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"l" = ( +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"p" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"K" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"M" = ( +/obj/machinery/door/window/eastright, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"X" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/north, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +q +q +K +q +q +"} +(2,1,1) = {" +q +c +p +g +q +"} +(3,1,1) = {" +q +l +p +M +q +"} +(4,1,1) = {" +q +c +p +X +q +"} +(5,1,1) = {" +q +q +q +q +q +"} diff --git a/_maps/RuinGeneration/5x5_5_hallwayroom_east.dmm b/_maps/RuinGeneration/5x5_5_hallwayroom_east.dmm new file mode 100644 index 0000000000000..6f3f76b5f0bdd --- /dev/null +++ b/_maps/RuinGeneration/5x5_5_hallwayroom_east.dmm @@ -0,0 +1,55 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"d" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"h" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"A" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Q" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +h +Q +d +Q +h +"} +(2,1,1) = {" +h +Q +Q +Q +h +"} +(3,1,1) = {" +h +Q +Q +Q +h +"} +(4,1,1) = {" +h +Q +Q +Q +h +"} +(5,1,1) = {" +h +h +A +h +h +"} diff --git a/_maps/RuinGeneration/5x5_5_hallwayroom_west.dmm b/_maps/RuinGeneration/5x5_5_hallwayroom_west.dmm new file mode 100644 index 0000000000000..89f4de7de4434 --- /dev/null +++ b/_maps/RuinGeneration/5x5_5_hallwayroom_west.dmm @@ -0,0 +1,55 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"h" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"i" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"m" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Q" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +h +h +m +h +h +"} +(2,1,1) = {" +h +Q +Q +Q +h +"} +(3,1,1) = {" +h +Q +Q +Q +h +"} +(4,1,1) = {" +h +Q +Q +Q +h +"} +(5,1,1) = {" +h +Q +i +Q +h +"} diff --git a/_maps/RuinGeneration/5x5_6_hallwayvertical_east_room.dmm b/_maps/RuinGeneration/5x5_6_hallwayvertical_east_room.dmm new file mode 100644 index 0000000000000..60765f2154011 --- /dev/null +++ b/_maps/RuinGeneration/5x5_6_hallwayvertical_east_room.dmm @@ -0,0 +1,59 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"h" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"E" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"M" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Q" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +h +h +h +h +h +"} +(2,1,1) = {" +Q +Q +Q +Q +Q +"} +(3,1,1) = {" +M +Q +Q +Q +V +"} +(4,1,1) = {" +Q +Q +Q +Q +Q +"} +(5,1,1) = {" +h +h +E +h +h +"} diff --git a/_maps/RuinGeneration/5x5_6_hallwayvertical_west_room.dmm b/_maps/RuinGeneration/5x5_6_hallwayvertical_west_room.dmm new file mode 100644 index 0000000000000..4736de19fb775 --- /dev/null +++ b/_maps/RuinGeneration/5x5_6_hallwayvertical_west_room.dmm @@ -0,0 +1,59 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"h" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"x" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"M" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Q" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +h +h +x +h +h +"} +(2,1,1) = {" +Q +Q +Q +Q +Q +"} +(3,1,1) = {" +M +Q +Q +Q +V +"} +(4,1,1) = {" +Q +Q +Q +Q +Q +"} +(5,1,1) = {" +h +h +h +h +h +"} diff --git a/_maps/RuinGeneration/5x5_8_hallwayt-east.dmm b/_maps/RuinGeneration/5x5_8_hallwayt-east.dmm new file mode 100644 index 0000000000000..562fd1ef89395 --- /dev/null +++ b/_maps/RuinGeneration/5x5_8_hallwayt-east.dmm @@ -0,0 +1,59 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"d" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"s" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"v" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"L" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Y" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +v +v +v +v +v +"} +(2,1,1) = {" +Y +Y +Y +Y +Y +"} +(3,1,1) = {" +s +Y +Y +Y +L +"} +(4,1,1) = {" +Y +Y +Y +Y +Y +"} +(5,1,1) = {" +v +Y +d +Y +v +"} diff --git a/_maps/RuinGeneration/5x5_8_hallwayt-north.dmm b/_maps/RuinGeneration/5x5_8_hallwayt-north.dmm new file mode 100644 index 0000000000000..e0a8bdfb0d047 --- /dev/null +++ b/_maps/RuinGeneration/5x5_8_hallwayt-north.dmm @@ -0,0 +1,61 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"d" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"l" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"n" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"v" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"E" = ( +/turf/closed/wall, +/area/ruin/unpowered) + +(1,1,1) = {" +E +n +d +n +E +"} +(2,1,1) = {" +n +n +n +n +E +"} +(3,1,1) = {" +l +n +n +n +E +"} +(4,1,1) = {" +n +n +n +n +E +"} +(5,1,1) = {" +E +n +v +n +E +"} diff --git a/_maps/RuinGeneration/5x5_8_hallwayt-south.dmm b/_maps/RuinGeneration/5x5_8_hallwayt-south.dmm new file mode 100644 index 0000000000000..d9f3268a67192 --- /dev/null +++ b/_maps/RuinGeneration/5x5_8_hallwayt-south.dmm @@ -0,0 +1,59 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"j" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"p" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"s" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"v" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"U" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +s +j +U +j +s +"} +(2,1,1) = {" +s +j +j +j +j +"} +(3,1,1) = {" +s +j +j +j +p +"} +(4,1,1) = {" +s +j +j +j +j +"} +(5,1,1) = {" +s +j +v +j +s +"} diff --git a/_maps/RuinGeneration/5x5_8_hallwayt-west.dmm b/_maps/RuinGeneration/5x5_8_hallwayt-west.dmm new file mode 100644 index 0000000000000..b9d28788de05a --- /dev/null +++ b/_maps/RuinGeneration/5x5_8_hallwayt-west.dmm @@ -0,0 +1,59 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"d" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"h" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"z" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"N" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"X" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +h +X +N +X +h +"} +(2,1,1) = {" +X +X +X +X +X +"} +(3,1,1) = {" +z +X +X +X +d +"} +(4,1,1) = {" +X +X +X +X +X +"} +(5,1,1) = {" +h +h +h +h +h +"} diff --git a/_maps/RuinGeneration/5x5_cryo.dmm b/_maps/RuinGeneration/5x5_cryo.dmm new file mode 100644 index 0000000000000..49e0945d9080b --- /dev/null +++ b/_maps/RuinGeneration/5x5_cryo.dmm @@ -0,0 +1,104 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"f" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"j" = ( +/obj/machinery/cryopod, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"t" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"u" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/unpowered) +"x" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"C" = ( +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"E" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"L" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"P" = ( +/obj/machinery/computer/cryopod{ + pixel_y = 25 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"R" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) +"T" = ( +/obj/machinery/cryopod, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/unpowered) + +(1,1,1) = {" +L +L +L +L +L +"} +(2,1,1) = {" +L +t +f +E +u +"} +(3,1,1) = {" +L +P +C +C +x +"} +(4,1,1) = {" +L +j +R +T +u +"} +(5,1,1) = {" +L +L +L +L +L +"} diff --git a/_maps/RuinGeneration/5x5_hern.dmm b/_maps/RuinGeneration/5x5_hern.dmm new file mode 100644 index 0000000000000..2cfdf9dfb5a0f --- /dev/null +++ b/_maps/RuinGeneration/5x5_hern.dmm @@ -0,0 +1,67 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"n" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"w" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"D" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"H" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"J" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"R" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"W" = ( +/turf/closed/wall, +/area/ruin/unpowered) + +(1,1,1) = {" +W +W +W +W +W +"} +(2,1,1) = {" +W +D +J +R +W +"} +(3,1,1) = {" +n +H +H +H +W +"} +(4,1,1) = {" +W +H +H +H +W +"} +(5,1,1) = {" +W +H +w +H +W +"} diff --git a/_maps/RuinGeneration/5x5_hern_damaged.dmm b/_maps/RuinGeneration/5x5_hern_damaged.dmm new file mode 100644 index 0000000000000..0442ec166e27d --- /dev/null +++ b/_maps/RuinGeneration/5x5_hern_damaged.dmm @@ -0,0 +1,77 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"d" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"k" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"s" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"y" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"A" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"D" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"S" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"V" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plating, +/area/ruin/unpowered) +"W" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +S +S +S +S +S +"} +(2,1,1) = {" +S +k +V +D +S +"} +(3,1,1) = {" +W +A +y +A +S +"} +(4,1,1) = {" +S +u +A +u +S +"} +(5,1,1) = {" +S +s +d +s +S +"} diff --git a/_maps/RuinGeneration/5x5_hernsw.dmm b/_maps/RuinGeneration/5x5_hernsw.dmm new file mode 100644 index 0000000000000..06f656a2d76c8 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hernsw.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"k" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"G" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"L" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"M" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"T" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Y" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +k +k +L +k +k +"} +(2,1,1) = {" +k +M +M +M +k +"} +(3,1,1) = {" +T +M +M +M +Y +"} +(4,1,1) = {" +k +M +M +M +k +"} +(5,1,1) = {" +k +M +G +M +k +"} diff --git a/_maps/RuinGeneration/5x5_hernsw_damaged.dmm b/_maps/RuinGeneration/5x5_hernsw_damaged.dmm new file mode 100644 index 0000000000000..e77e7095c0503 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hernsw_damaged.dmm @@ -0,0 +1,75 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"f" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"x" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"z" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"C" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"D" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"E" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"L" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"Q" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +E +E +D +E +E +"} +(2,1,1) = {" +E +z +L +z +E +"} +(3,1,1) = {" +f +L +u +L +x +"} +(4,1,1) = {" +E +z +z +C +E +"} +(5,1,1) = {" +E +C +Q +C +E +"} diff --git a/_maps/RuinGeneration/5x5_hernw.dmm b/_maps/RuinGeneration/5x5_hernw.dmm new file mode 100644 index 0000000000000..f7a8da12cc22d --- /dev/null +++ b/_maps/RuinGeneration/5x5_hernw.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"o" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"G" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"M" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"U" = ( +/turf/closed/wall, +/area/ruin/unpowered) + +(1,1,1) = {" +U +U +G +U +U +"} +(2,1,1) = {" +U +o +o +q +U +"} +(3,1,1) = {" +M +o +o +o +U +"} +(4,1,1) = {" +U +o +o +o +U +"} +(5,1,1) = {" +U +o +u +o +U +"} diff --git a/_maps/RuinGeneration/5x5_hernw_damaged.dmm b/_maps/RuinGeneration/5x5_hernw_damaged.dmm new file mode 100644 index 0000000000000..ef91feed8b24e --- /dev/null +++ b/_maps/RuinGeneration/5x5_hernw_damaged.dmm @@ -0,0 +1,71 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"e" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"g" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"h" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"l" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"o" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"y" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"J" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +y +y +J +y +y +"} +(2,1,1) = {" +y +a +h +e +y +"} +(3,1,1) = {" +g +h +o +h +y +"} +(4,1,1) = {" +y +a +h +a +y +"} +(5,1,1) = {" +y +e +l +e +y +"} diff --git a/_maps/RuinGeneration/5x5_hers.dmm b/_maps/RuinGeneration/5x5_hers.dmm new file mode 100644 index 0000000000000..b951da3bc063f --- /dev/null +++ b/_maps/RuinGeneration/5x5_hers.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"k" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"o" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"r" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"v" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"w" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"A" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"W" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +r +r +r +r +r +"} +(2,1,1) = {" +r +w +A +v +r +"} +(3,1,1) = {" +r +o +o +o +W +"} +(4,1,1) = {" +r +o +o +o +r +"} +(5,1,1) = {" +r +o +k +o +r +"} diff --git a/_maps/RuinGeneration/5x5_hers_damaged.dmm b/_maps/RuinGeneration/5x5_hers_damaged.dmm new file mode 100644 index 0000000000000..7c602776d0c3f --- /dev/null +++ b/_maps/RuinGeneration/5x5_hers_damaged.dmm @@ -0,0 +1,67 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"i" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"n" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/ruin/unpowered) +"o" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"s" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"E" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"F" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"J" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"M" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +E +E +E +F +F +"} +(2,1,1) = {" +E +n +F +o +E +"} +(3,1,1) = {" +E +o +F +s +J +"} +(4,1,1) = {" +F +F +s +i +E +"} +(5,1,1) = {" +E +i +M +i +E +"} diff --git a/_maps/RuinGeneration/5x5_hersw.dmm b/_maps/RuinGeneration/5x5_hersw.dmm new file mode 100644 index 0000000000000..2e6ffef975f16 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hersw.dmm @@ -0,0 +1,63 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"s" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"w" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"C" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"K" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"M" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Z" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +C +C +Z +C +C +"} +(2,1,1) = {" +C +s +K +K +C +"} +(3,1,1) = {" +C +K +K +K +M +"} +(4,1,1) = {" +C +K +K +K +C +"} +(5,1,1) = {" +C +K +w +K +C +"} diff --git a/_maps/RuinGeneration/5x5_hersw_damaged.dmm b/_maps/RuinGeneration/5x5_hersw_damaged.dmm new file mode 100644 index 0000000000000..d1cd7b66d42eb --- /dev/null +++ b/_maps/RuinGeneration/5x5_hersw_damaged.dmm @@ -0,0 +1,69 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"g" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"j" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"m" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"A" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"B" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"H" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"I" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Z" = ( +/turf/open/space/basic, +/area/ruin/unpowered) + +(1,1,1) = {" +B +B +j +B +B +"} +(2,1,1) = {" +Z +A +I +I +B +"} +(3,1,1) = {" +Z +g +A +I +m +"} +(4,1,1) = {" +Z +A +I +I +B +"} +(5,1,1) = {" +B +I +H +I +B +"} diff --git a/_maps/RuinGeneration/5x5_hesrnw.dmm b/_maps/RuinGeneration/5x5_hesrnw.dmm new file mode 100644 index 0000000000000..687d69b4f285e --- /dev/null +++ b/_maps/RuinGeneration/5x5_hesrnw.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"e" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"t" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"z" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"H" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"U" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +t +t +q +t +t +"} +(2,1,1) = {" +t +e +e +e +e +"} +(3,1,1) = {" +U +e +e +e +H +"} +(4,1,1) = {" +t +e +e +e +e +"} +(5,1,1) = {" +t +e +z +e +t +"} diff --git a/_maps/RuinGeneration/5x5_hesrnw_damaged.dmm b/_maps/RuinGeneration/5x5_hesrnw_damaged.dmm new file mode 100644 index 0000000000000..6dede296d823e --- /dev/null +++ b/_maps/RuinGeneration/5x5_hesrnw_damaged.dmm @@ -0,0 +1,75 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"d" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"f" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"h" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"l" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"n" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"G" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"S" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"W" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +G +G +h +G +G +"} +(2,1,1) = {" +G +f +l +f +d +"} +(3,1,1) = {" +n +l +b +l +W +"} +(4,1,1) = {" +G +f +l +f +d +"} +(5,1,1) = {" +G +d +S +d +G +"} diff --git a/_maps/RuinGeneration/5x5_heswrn.dmm b/_maps/RuinGeneration/5x5_heswrn.dmm new file mode 100644 index 0000000000000..907a3e3a124f3 --- /dev/null +++ b/_maps/RuinGeneration/5x5_heswrn.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"f" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"w" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"x" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"F" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"H" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"N" = ( +/turf/closed/wall, +/area/ruin/unpowered) + +(1,1,1) = {" +N +F +x +F +N +"} +(2,1,1) = {" +N +F +F +F +F +"} +(3,1,1) = {" +f +F +F +F +H +"} +(4,1,1) = {" +N +F +F +F +F +"} +(5,1,1) = {" +N +F +w +F +N +"} diff --git a/_maps/RuinGeneration/5x5_heswrn_damaged.dmm b/_maps/RuinGeneration/5x5_heswrn_damaged.dmm new file mode 100644 index 0000000000000..9117d52a4c8f1 --- /dev/null +++ b/_maps/RuinGeneration/5x5_heswrn_damaged.dmm @@ -0,0 +1,75 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"k" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"m" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"A" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"F" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"G" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Q" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +u +q +G +q +u +"} +(2,1,1) = {" +u +a +A +a +q +"} +(3,1,1) = {" +m +a +F +A +Q +"} +(4,1,1) = {" +u +q +A +a +q +"} +(5,1,1) = {" +u +q +k +q +u +"} diff --git a/_maps/RuinGeneration/5x5_hew_damaged.dmm b/_maps/RuinGeneration/5x5_hew_damaged.dmm new file mode 100644 index 0000000000000..96d27e447ce8f --- /dev/null +++ b/_maps/RuinGeneration/5x5_hew_damaged.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"e" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"f" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"s" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"D" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"F" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"M" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"T" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) + +(1,1,1) = {" +F +e +s +e +F +"} +(2,1,1) = {" +f +D +T +T +F +"} +(3,1,1) = {" +f +f +D +f +f +"} +(4,1,1) = {" +f +T +D +D +f +"} +(5,1,1) = {" +F +e +M +e +F +"} diff --git a/_maps/RuinGeneration/5x5_hewrn.dmm b/_maps/RuinGeneration/5x5_hewrn.dmm new file mode 100644 index 0000000000000..badc610f66869 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hewrn.dmm @@ -0,0 +1,61 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"b" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"C" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"K" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"T" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +C +K +b +K +C +"} +(2,1,1) = {" +C +K +K +K +C +"} +(3,1,1) = {" +T +K +K +K +C +"} +(4,1,1) = {" +C +K +K +K +C +"} +(5,1,1) = {" +C +K +a +K +C +"} diff --git a/_maps/RuinGeneration/5x5_hewrn_damaged.dmm b/_maps/RuinGeneration/5x5_hewrn_damaged.dmm new file mode 100644 index 0000000000000..12466ede3cc98 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hewrn_damaged.dmm @@ -0,0 +1,71 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"g" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"j" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"v" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"A" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"G" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Q" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"W" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"Z" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) + +(1,1,1) = {" +Q +G +g +Z +Q +"} +(2,1,1) = {" +Q +G +Z +W +A +"} +(3,1,1) = {" +v +G +Z +W +A +"} +(4,1,1) = {" +Q +G +G +Z +A +"} +(5,1,1) = {" +Q +G +j +G +Q +"} diff --git a/_maps/RuinGeneration/5x5_hewrns.dmm b/_maps/RuinGeneration/5x5_hewrns.dmm new file mode 100644 index 0000000000000..1947c501e39a4 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hewrns.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"e" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"n" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"p" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"E" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"J" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"V" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +J +E +n +E +J +"} +(2,1,1) = {" +J +E +E +E +J +"} +(3,1,1) = {" +V +E +E +E +e +"} +(4,1,1) = {" +J +E +E +E +J +"} +(5,1,1) = {" +J +E +p +E +J +"} diff --git a/_maps/RuinGeneration/5x5_hewrns_damaged.dmm b/_maps/RuinGeneration/5x5_hewrns_damaged.dmm new file mode 100644 index 0000000000000..7f55caea0eb40 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hewrns_damaged.dmm @@ -0,0 +1,72 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"d" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"h" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"i" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"G" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"J" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"L" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"U" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +h +L +G +L +h +"} +(2,1,1) = {" +h +L +J +L +h +"} +(3,1,1) = {" +i +J +d +J +b +"} +(4,1,1) = {" +h +J +J +L +h +"} +(5,1,1) = {" +h +L +U +L +h +"} diff --git a/_maps/RuinGeneration/5x5_hewrs.dmm b/_maps/RuinGeneration/5x5_hewrs.dmm new file mode 100644 index 0000000000000..c1f751aa86505 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hewrs.dmm @@ -0,0 +1,59 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"l" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"t" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"v" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"S" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +v +l +t +l +v +"} +(2,1,1) = {" +v +l +l +l +v +"} +(3,1,1) = {" +v +l +l +l +V +"} +(4,1,1) = {" +v +l +l +l +v +"} +(5,1,1) = {" +v +l +S +l +v +"} diff --git a/_maps/RuinGeneration/5x5_hewrs_damaged.dmm b/_maps/RuinGeneration/5x5_hewrs_damaged.dmm new file mode 100644 index 0000000000000..d52736be05569 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hewrs_damaged.dmm @@ -0,0 +1,69 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"f" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"h" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"n" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"r" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"v" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"w" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"F" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"L" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +h +v +f +v +h +"} +(2,1,1) = {" +F +r +r +v +h +"} +(3,1,1) = {" +F +F +w +r +n +"} +(4,1,1) = {" +F +w +r +v +h +"} +(5,1,1) = {" +h +v +L +v +h +"} diff --git a/_maps/RuinGeneration/5x5_hnersw.dmm b/_maps/RuinGeneration/5x5_hnersw.dmm new file mode 100644 index 0000000000000..4025715cdcf27 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hnersw.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"f" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"l" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"o" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"v" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"x" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"Y" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +x +x +o +x +x +"} +(2,1,1) = {" +f +f +f +f +x +"} +(3,1,1) = {" +l +f +f +f +v +"} +(4,1,1) = {" +f +f +f +f +x +"} +(5,1,1) = {" +x +f +Y +f +x +"} diff --git a/_maps/RuinGeneration/5x5_hnersw_damaged.dmm b/_maps/RuinGeneration/5x5_hnersw_damaged.dmm new file mode 100644 index 0000000000000..68fe14ba3e8fb --- /dev/null +++ b/_maps/RuinGeneration/5x5_hnersw_damaged.dmm @@ -0,0 +1,72 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"i" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"o" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"p" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"A" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"E" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"F" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"R" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +i +i +R +i +i +"} +(2,1,1) = {" +E +E +F +F +i +"} +(3,1,1) = {" +V +F +o +F +p +"} +(4,1,1) = {" +E +E +F +E +i +"} +(5,1,1) = {" +i +E +A +E +i +"} diff --git a/_maps/RuinGeneration/5x5_hnesrw.dmm b/_maps/RuinGeneration/5x5_hnesrw.dmm new file mode 100644 index 0000000000000..bfa7decba2277 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hnesrw.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"i" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"j" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"D" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"E" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"T" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +i +i +q +i +i +"} +(2,1,1) = {" +j +j +j +j +j +"} +(3,1,1) = {" +T +j +j +j +D +"} +(4,1,1) = {" +j +j +j +j +j +"} +(5,1,1) = {" +i +j +E +j +i +"} diff --git a/_maps/RuinGeneration/5x5_hnesrw_damaged.dmm b/_maps/RuinGeneration/5x5_hnesrw_damaged.dmm new file mode 100644 index 0000000000000..0a44ec53be926 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hnesrw_damaged.dmm @@ -0,0 +1,75 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"d" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"g" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"i" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"p" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"C" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"G" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"Q" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"U" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"X" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +p +p +Q +p +p +"} +(2,1,1) = {" +d +G +G +G +d +"} +(3,1,1) = {" +g +C +i +C +U +"} +(4,1,1) = {" +d +G +C +G +d +"} +(5,1,1) = {" +p +d +X +d +p +"} diff --git a/_maps/RuinGeneration/5x5_hnewrs.dmm b/_maps/RuinGeneration/5x5_hnewrs.dmm new file mode 100644 index 0000000000000..6cd947f57838b --- /dev/null +++ b/_maps/RuinGeneration/5x5_hnewrs.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"e" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"f" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"H" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"I" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Y" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +H +Y +I +Y +H +"} +(2,1,1) = {" +Y +Y +Y +Y +H +"} +(3,1,1) = {" +e +Y +Y +Y +f +"} +(4,1,1) = {" +Y +Y +Y +Y +H +"} +(5,1,1) = {" +H +Y +V +Y +H +"} diff --git a/_maps/RuinGeneration/5x5_hnewrs_damaged.dmm b/_maps/RuinGeneration/5x5_hnewrs_damaged.dmm new file mode 100644 index 0000000000000..b379b4aa22210 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hnewrs_damaged.dmm @@ -0,0 +1,72 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"i" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"J" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"K" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"M" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"P" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"X" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"Z" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +M +J +Z +J +M +"} +(2,1,1) = {" +J +J +u +J +M +"} +(3,1,1) = {" +P +u +X +u +K +"} +(4,1,1) = {" +J +u +u +J +M +"} +(5,1,1) = {" +M +J +i +J +M +"} diff --git a/_maps/RuinGeneration/5x5_hnresw.dmm b/_maps/RuinGeneration/5x5_hnresw.dmm new file mode 100644 index 0000000000000..7f658dfe9d21b --- /dev/null +++ b/_maps/RuinGeneration/5x5_hnresw.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"g" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"i" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"j" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"n" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"p" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"M" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +i +i +p +i +i +"} +(2,1,1) = {" +j +j +j +j +i +"} +(3,1,1) = {" +n +j +j +j +g +"} +(4,1,1) = {" +j +j +j +j +i +"} +(5,1,1) = {" +i +i +M +i +i +"} diff --git a/_maps/RuinGeneration/5x5_hnresw_damaged.dmm b/_maps/RuinGeneration/5x5_hnresw_damaged.dmm new file mode 100644 index 0000000000000..276f8c0cf6e07 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hnresw_damaged.dmm @@ -0,0 +1,72 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"i" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"m" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"v" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"G" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"I" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"O" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"P" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"X" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) + +(1,1,1) = {" +m +m +v +m +m +"} +(2,1,1) = {" +O +i +i +O +m +"} +(3,1,1) = {" +G +i +X +i +I +"} +(4,1,1) = {" +O +O +i +i +m +"} +(5,1,1) = {" +m +m +P +m +m +"} diff --git a/_maps/RuinGeneration/5x5_hns_damaged.dmm b/_maps/RuinGeneration/5x5_hns_damaged.dmm new file mode 100644 index 0000000000000..f3ff795b14e57 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hns_damaged.dmm @@ -0,0 +1,63 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"d" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"n" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"r" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"z" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"D" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"F" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"J" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +r +z +z +r +r +"} +(2,1,1) = {" +n +z +z +F +n +"} +(3,1,1) = {" +J +F +z +d +D +"} +(4,1,1) = {" +n +d +z +z +n +"} +(5,1,1) = {" +r +d +z +z +r +"} diff --git a/_maps/RuinGeneration/5x5_hnswre.dmm b/_maps/RuinGeneration/5x5_hnswre.dmm new file mode 100644 index 0000000000000..cd18b74b903a9 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hnswre.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"f" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"m" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"p" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"J" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"P" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +J +f +p +f +J +"} +(2,1,1) = {" +f +f +f +f +f +"} +(3,1,1) = {" +P +f +f +f +m +"} +(4,1,1) = {" +f +f +f +f +f +"} +(5,1,1) = {" +J +J +a +J +J +"} diff --git a/_maps/RuinGeneration/5x5_hnswre_damaged.dmm b/_maps/RuinGeneration/5x5_hnswre_damaged.dmm new file mode 100644 index 0000000000000..b49ce929f3c0b --- /dev/null +++ b/_maps/RuinGeneration/5x5_hnswre_damaged.dmm @@ -0,0 +1,75 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"k" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"n" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"q" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"s" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"x" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"D" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"G" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"S" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Z" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) + +(1,1,1) = {" +G +x +s +x +G +"} +(2,1,1) = {" +x +Z +n +Z +x +"} +(3,1,1) = {" +k +n +D +n +S +"} +(4,1,1) = {" +x +Z +n +Z +x +"} +(5,1,1) = {" +G +G +q +G +G +"} diff --git a/_maps/RuinGeneration/5x5_hnwres.dmm b/_maps/RuinGeneration/5x5_hnwres.dmm new file mode 100644 index 0000000000000..e1c2ef7386882 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hnwres.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"m" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"n" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"F" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"O" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"R" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"Z" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +R +O +m +O +R +"} +(2,1,1) = {" +O +O +O +O +R +"} +(3,1,1) = {" +n +O +O +O +F +"} +(4,1,1) = {" +O +O +O +O +R +"} +(5,1,1) = {" +R +R +Z +R +R +"} diff --git a/_maps/RuinGeneration/5x5_hnwres_damaged.dmm b/_maps/RuinGeneration/5x5_hnwres_damaged.dmm new file mode 100644 index 0000000000000..6318dc36d0461 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hnwres_damaged.dmm @@ -0,0 +1,72 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"c" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"k" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"m" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"r" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"D" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"G" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"H" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"O" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +D +H +r +H +D +"} +(2,1,1) = {" +H +H +k +H +D +"} +(3,1,1) = {" +G +k +c +k +m +"} +(4,1,1) = {" +H +H +k +k +D +"} +(5,1,1) = {" +D +D +O +D +D +"} diff --git a/_maps/RuinGeneration/5x5_hsrnew.dmm b/_maps/RuinGeneration/5x5_hsrnew.dmm new file mode 100644 index 0000000000000..02f4b4526077d --- /dev/null +++ b/_maps/RuinGeneration/5x5_hsrnew.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"k" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"E" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"J" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"P" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"U" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"W" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +k +k +J +k +k +"} +(2,1,1) = {" +k +U +U +U +U +"} +(3,1,1) = {" +P +U +U +U +W +"} +(4,1,1) = {" +k +U +U +U +U +"} +(5,1,1) = {" +k +k +E +k +k +"} diff --git a/_maps/RuinGeneration/5x5_hsrnew_damaged.dmm b/_maps/RuinGeneration/5x5_hsrnew_damaged.dmm new file mode 100644 index 0000000000000..63947669ffa57 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hsrnew_damaged.dmm @@ -0,0 +1,75 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"c" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"h" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"k" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"t" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"v" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"E" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"F" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"J" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"X" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) + +(1,1,1) = {" +E +E +J +E +E +"} +(2,1,1) = {" +E +t +X +t +F +"} +(3,1,1) = {" +k +X +v +X +h +"} +(4,1,1) = {" +E +X +X +t +F +"} +(5,1,1) = {" +E +E +c +E +E +"} diff --git a/_maps/RuinGeneration/5x5_hswrne.dmm b/_maps/RuinGeneration/5x5_hswrne.dmm new file mode 100644 index 0000000000000..e51132bd274d9 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hswrne.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"k" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"x" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"J" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"P" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Q" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"W" = ( +/turf/closed/wall, +/area/ruin/unpowered) + +(1,1,1) = {" +W +P +J +P +W +"} +(2,1,1) = {" +W +P +P +P +P +"} +(3,1,1) = {" +k +P +P +P +x +"} +(4,1,1) = {" +W +P +P +P +P +"} +(5,1,1) = {" +W +W +Q +W +W +"} diff --git a/_maps/RuinGeneration/5x5_hswrne_damaged.dmm b/_maps/RuinGeneration/5x5_hswrne_damaged.dmm new file mode 100644 index 0000000000000..bc50fa4ae1d1f --- /dev/null +++ b/_maps/RuinGeneration/5x5_hswrne_damaged.dmm @@ -0,0 +1,75 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"e" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"o" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"q" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"x" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"H" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"N" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"O" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +e +x +q +x +e +"} +(2,1,1) = {" +e +N +o +N +x +"} +(3,1,1) = {" +O +o +H +N +a +"} +(4,1,1) = {" +e +N +o +x +x +"} +(5,1,1) = {" +e +e +V +e +e +"} diff --git a/_maps/RuinGeneration/5x5_hwres.dmm b/_maps/RuinGeneration/5x5_hwres.dmm new file mode 100644 index 0000000000000..4eb7b3b9767a4 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hwres.dmm @@ -0,0 +1,63 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"f" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"w" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"F" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"P" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +w +f +F +f +w +"} +(2,1,1) = {" +w +f +f +f +w +"} +(3,1,1) = {" +w +f +f +f +q +"} +(4,1,1) = {" +w +a +f +f +w +"} +(5,1,1) = {" +w +w +P +w +w +"} diff --git a/_maps/RuinGeneration/5x5_hwres_damaged.dmm b/_maps/RuinGeneration/5x5_hwres_damaged.dmm new file mode 100644 index 0000000000000..6cc1d664af2a7 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hwres_damaged.dmm @@ -0,0 +1,74 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"d" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"m" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"p" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"t" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"C" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"D" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"F" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"V" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +F +C +a +C +F +"} +(2,1,1) = {" +m +D +d +C +F +"} +(3,1,1) = {" +m +m +D +d +p +"} +(4,1,1) = {" +m +t +d +C +F +"} +(5,1,1) = {" +F +F +V +F +F +"} diff --git a/_maps/RuinGeneration/5x5_hwrn.dmm b/_maps/RuinGeneration/5x5_hwrn.dmm new file mode 100644 index 0000000000000..fc70fbb0b9ad7 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hwrn.dmm @@ -0,0 +1,67 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"h" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"j" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"o" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"x" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"N" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"W" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +N +h +W +h +N +"} +(2,1,1) = {" +N +h +h +h +N +"} +(3,1,1) = {" +q +h +h +h +N +"} +(4,1,1) = {" +N +x +o +j +N +"} +(5,1,1) = {" +N +N +N +N +N +"} diff --git a/_maps/RuinGeneration/5x5_hwrn_damaged.dmm b/_maps/RuinGeneration/5x5_hwrn_damaged.dmm new file mode 100644 index 0000000000000..02b581cd3cbca --- /dev/null +++ b/_maps/RuinGeneration/5x5_hwrn_damaged.dmm @@ -0,0 +1,69 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"i" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/ruin/unpowered) +"t" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"u" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"v" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"A" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"G" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"I" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"X" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) + +(1,1,1) = {" +G +I +u +I +G +"} +(2,1,1) = {" +G +I +X +t +v +"} +(3,1,1) = {" +A +X +v +v +G +"} +(4,1,1) = {" +G +t +t +i +G +"} +(5,1,1) = {" +v +v +G +G +G +"} diff --git a/_maps/RuinGeneration/5x5_hwrne.dmm b/_maps/RuinGeneration/5x5_hwrne.dmm new file mode 100644 index 0000000000000..41759950024c9 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hwrne.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"o" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"r" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"s" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"G" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"W" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +s +G +W +G +s +"} +(2,1,1) = {" +s +G +G +G +s +"} +(3,1,1) = {" +b +G +G +G +s +"} +(4,1,1) = {" +s +G +G +o +s +"} +(5,1,1) = {" +s +s +r +s +s +"} diff --git a/_maps/RuinGeneration/5x5_hwrne_damaged.dmm b/_maps/RuinGeneration/5x5_hwrne_damaged.dmm new file mode 100644 index 0000000000000..78f6d7a88e8f8 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hwrne_damaged.dmm @@ -0,0 +1,76 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"e" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"h" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"v" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"x" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"z" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"D" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"N" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"X" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +N +X +z +x +N +"} +(2,1,1) = {" +N +X +x +v +x +"} +(3,1,1) = {" +D +x +v +e +v +"} +(4,1,1) = {" +N +X +x +b +x +"} +(5,1,1) = {" +N +N +h +N +N +"} diff --git a/_maps/RuinGeneration/5x5_hwrnes.dmm b/_maps/RuinGeneration/5x5_hwrnes.dmm new file mode 100644 index 0000000000000..0b60b4b1b9afa --- /dev/null +++ b/_maps/RuinGeneration/5x5_hwrnes.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"h" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"j" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"o" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"A" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"O" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Q" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +A +j +O +j +A +"} +(2,1,1) = {" +A +j +j +j +A +"} +(3,1,1) = {" +Q +j +j +j +o +"} +(4,1,1) = {" +A +j +j +j +A +"} +(5,1,1) = {" +A +A +h +A +A +"} diff --git a/_maps/RuinGeneration/5x5_hwrnes_damaged.dmm b/_maps/RuinGeneration/5x5_hwrnes_damaged.dmm new file mode 100644 index 0000000000000..af1e61a7726ba --- /dev/null +++ b/_maps/RuinGeneration/5x5_hwrnes_damaged.dmm @@ -0,0 +1,72 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"n" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"A" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"D" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"G" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"K" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"W" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +G +q +A +q +G +"} +(2,1,1) = {" +G +q +K +q +G +"} +(3,1,1) = {" +u +K +D +K +W +"} +(4,1,1) = {" +G +q +K +q +G +"} +(5,1,1) = {" +G +G +n +G +G +"} diff --git a/_maps/RuinGeneration/5x5_hwrns.dmm b/_maps/RuinGeneration/5x5_hwrns.dmm new file mode 100644 index 0000000000000..7d7a8cc236f27 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hwrns.dmm @@ -0,0 +1,71 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"e" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"f" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"g" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"v" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"F" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"R" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"U" = ( +/turf/closed/wall, +/area/ruin/unpowered) + +(1,1,1) = {" +U +U +U +U +U +"} +(2,1,1) = {" +U +R +e +q +U +"} +(3,1,1) = {" +F +f +f +f +g +"} +(4,1,1) = {" +U +f +f +f +U +"} +(5,1,1) = {" +U +f +v +f +U +"} diff --git a/_maps/RuinGeneration/5x5_hwrns_damaged.dmm b/_maps/RuinGeneration/5x5_hwrns_damaged.dmm new file mode 100644 index 0000000000000..bf5a71c97a766 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hwrns_damaged.dmm @@ -0,0 +1,69 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"g" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"v" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"w" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"I" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"J" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) +"O" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +I +I +I +I +I +"} +(2,1,1) = {" +w +J +I +J +w +"} +(3,1,1) = {" +V +q +J +q +O +"} +(4,1,1) = {" +w +v +q +v +w +"} +(5,1,1) = {" +w +v +g +v +w +"} diff --git a/_maps/RuinGeneration/5x5_hwrs.dmm b/_maps/RuinGeneration/5x5_hwrs.dmm new file mode 100644 index 0000000000000..c6cd1894dba1f --- /dev/null +++ b/_maps/RuinGeneration/5x5_hwrs.dmm @@ -0,0 +1,65 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"h" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"F" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"G" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"I" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"U" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Z" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +F +U +Z +U +F +"} +(2,1,1) = {" +F +U +U +U +F +"} +(3,1,1) = {" +F +U +U +U +I +"} +(4,1,1) = {" +F +h +G +u +F +"} +(5,1,1) = {" +F +F +F +F +F +"} diff --git a/_maps/RuinGeneration/5x5_hwrs_damaged.dmm b/_maps/RuinGeneration/5x5_hwrs_damaged.dmm new file mode 100644 index 0000000000000..47e5db2901d05 --- /dev/null +++ b/_maps/RuinGeneration/5x5_hwrs_damaged.dmm @@ -0,0 +1,67 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"g" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"C" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"K" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"L" = ( +/turf/open/space/basic, +/area/ruin/unpowered) +"N" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"U" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"V" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"Y" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ruin/unpowered) + +(1,1,1) = {" +U +K +C +K +U +"} +(2,1,1) = {" +U +K +K +K +U +"} +(3,1,1) = {" +L +V +K +K +N +"} +(4,1,1) = {" +L +Y +V +g +U +"} +(5,1,1) = {" +L +L +L +U +U +"} diff --git a/_maps/RuinGeneration/5x5_roomcross.dmm b/_maps/RuinGeneration/5x5_roomcross.dmm new file mode 100644 index 0000000000000..e6e1a5c39c282 --- /dev/null +++ b/_maps/RuinGeneration/5x5_roomcross.dmm @@ -0,0 +1,94 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"e" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"o" = ( +/obj/structure/lattice/catwalk, +/turf/open/floor/plating, +/area/ruin/unpowered) +"t" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"v" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"w" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"y" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"B" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"M" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"N" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"S" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +y +y +M +y +y +"} +(2,1,1) = {" +y +N +o +e +y +"} +(3,1,1) = {" +v +o +o +o +S +"} +(4,1,1) = {" +y +B +o +w +y +"} +(5,1,1) = {" +y +y +t +y +y +"} diff --git a/_maps/RuinGeneration/5x5_shower.dmm b/_maps/RuinGeneration/5x5_shower.dmm new file mode 100644 index 0000000000000..f3129bf939b77 --- /dev/null +++ b/_maps/RuinGeneration/5x5_shower.dmm @@ -0,0 +1,68 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"h" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/item/soap/nanotrasen, +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"o" = ( +/obj/machinery/shower{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"A" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"G" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"U" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"V" = ( +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) + +(1,1,1) = {" +G +G +G +G +G +"} +(2,1,1) = {" +G +o +o +h +G +"} +(3,1,1) = {" +G +V +V +V +G +"} +(4,1,1) = {" +G +U +V +U +G +"} +(5,1,1) = {" +G +G +A +G +G +"} diff --git a/_maps/RuinGeneration/5x9_gateway.dmm b/_maps/RuinGeneration/5x9_gateway.dmm new file mode 100644 index 0000000000000..b1ef5f701f596 --- /dev/null +++ b/_maps/RuinGeneration/5x9_gateway.dmm @@ -0,0 +1,237 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/machinery/gateway{ + dir = 4 + }, +/obj/effect/turf_decal/bot_white, +/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/ruin/unpowered) +"b" = ( +/obj/machinery/gateway{ + dir = 5 + }, +/obj/effect/turf_decal/bot_white/left, +/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/ruin/unpowered) +"d" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"f" = ( +/obj/machinery/gateway, +/obj/effect/turf_decal/bot_white, +/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/ruin/unpowered) +"h" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"p" = ( +/obj/machinery/gateway{ + dir = 9 + }, +/obj/effect/turf_decal/bot_white/right, +/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/ruin/unpowered) +"s" = ( +/obj/machinery/gateway{ + dir = 6 + }, +/obj/effect/turf_decal/bot_white/right, +/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/ruin/unpowered) +"x" = ( +/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/ruin/unpowered) +"C" = ( +/obj/machinery/door/poddoor/shutters{ + id = "gateshutter"; + name = "Gateway Access Shutter" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"H" = ( +/obj/machinery/gateway{ + dir = 1 + }, +/obj/machinery/status_display/evac{ + pixel_y = 32 + }, +/obj/effect/turf_decal/bot_white, +/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/ruin/unpowered) +"K" = ( +/obj/machinery/gateway{ + dir = 8 + }, +/obj/effect/turf_decal/bot_white, +/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/ruin/unpowered) +"M" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"S" = ( +/obj/machinery/gateway/centeraway, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"T" = ( +/obj/machinery/gateway{ + dir = 10 + }, +/obj/effect/turf_decal/bot_white/left, +/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/ruin/unpowered) +"V" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +h +h +h +h +h +h +h +h +h +"} +(2,1,1) = {" +h +p +K +T +x +M +C +V +V +"} +(3,1,1) = {" +h +H +S +f +x +M +C +V +d +"} +(4,1,1) = {" +h +b +a +s +x +M +C +V +V +"} +(5,1,1) = {" +h +h +h +h +h +h +h +h +h +"} diff --git a/_maps/RuinGeneration/5x9_lounge.dmm b/_maps/RuinGeneration/5x9_lounge.dmm new file mode 100644 index 0000000000000..3f1896a1b4894 --- /dev/null +++ b/_maps/RuinGeneration/5x9_lounge.dmm @@ -0,0 +1,93 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"c" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"d" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"h" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/obj/structure/chair/comfy{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"t" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"G" = ( +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"J" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Z" = ( +/turf/closed/wall, +/area/ruin/unpowered) + +(1,1,1) = {" +Z +Z +Z +Z +Z +Z +d +Z +Z +"} +(2,1,1) = {" +Z +c +q +q +q +h +h +t +Z +"} +(3,1,1) = {" +Z +h +h +h +h +h +h +h +Z +"} +(4,1,1) = {" +Z +h +h +h +h +h +h +G +Z +"} +(5,1,1) = {" +Z +h +J +h +Z +Z +Z +Z +Z +"} diff --git a/_maps/RuinGeneration/5x9_northernairlock.dmm b/_maps/RuinGeneration/5x9_northernairlock.dmm new file mode 100644 index 0000000000000..fabc330999265 --- /dev/null +++ b/_maps/RuinGeneration/5x9_northernairlock.dmm @@ -0,0 +1,89 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"q" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/unpowered) +"s" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"E" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"M" = ( +/turf/template_noop, +/area/template_noop) +"O" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"S" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"T" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/ruin/unpowered) +"V" = ( +/turf/closed/wall, +/area/ruin/unpowered) + +(1,1,1) = {" +M +M +M +M +M +V +V +V +V +"} +(2,1,1) = {" +M +M +M +q +q +q +O +O +O +"} +(3,1,1) = {" +M +M +M +T +E +s +O +O +S +"} +(4,1,1) = {" +M +M +M +q +q +q +O +O +O +"} +(5,1,1) = {" +M +M +M +M +M +V +V +V +V +"} diff --git a/_maps/RuinGeneration/5x9_southernairlock.dmm b/_maps/RuinGeneration/5x9_southernairlock.dmm new file mode 100644 index 0000000000000..dfa04ae9722bb --- /dev/null +++ b/_maps/RuinGeneration/5x9_southernairlock.dmm @@ -0,0 +1,91 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"h" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"n" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/ruin/unpowered) +"t" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/unpowered) +"y" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"T" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"U" = ( +/turf/template_noop, +/area/template_noop) +"V" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"Y" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +V +V +V +V +U +U +U +U +U +"} +(2,1,1) = {" +T +T +T +t +t +t +U +U +U +"} +(3,1,1) = {" +Y +T +T +n +h +y +U +U +U +"} +(4,1,1) = {" +T +T +T +t +t +t +U +U +U +"} +(5,1,1) = {" +V +V +V +V +U +U +U +U +U +"} diff --git a/_maps/RuinGeneration/5x9_windowroom.dmm b/_maps/RuinGeneration/5x9_windowroom.dmm new file mode 100644 index 0000000000000..676dea5c8fcc0 --- /dev/null +++ b/_maps/RuinGeneration/5x9_windowroom.dmm @@ -0,0 +1,96 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"f" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/unpowered) +"k" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/gloves, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"m" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"B" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"E" = ( +/obj/structure/table, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"G" = ( +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"R" = ( +/obj/structure/filingcabinet/security, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"X" = ( +/turf/closed/wall, +/area/ruin/unpowered) + +(1,1,1) = {" +X +X +B +X +X +X +B +X +X +"} +(2,1,1) = {" +X +m +m +m +m +m +m +G +X +"} +(3,1,1) = {" +X +m +m +m +m +m +u +E +X +"} +(4,1,1) = {" +X +R +m +m +m +k +E +E +X +"} +(5,1,1) = {" +X +X +f +f +X +f +f +X +X +"} diff --git a/_maps/RuinGeneration/69x45_charliestation.dmm b/_maps/RuinGeneration/69x45_charliestation.dmm new file mode 100644 index 0000000000000..0e9ddd0c58e4a --- /dev/null +++ b/_maps/RuinGeneration/69x45_charliestation.dmm @@ -0,0 +1,7799 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ak" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ar" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/template_noop, +/area/ruin/unpowered) +"ay" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/particle_accelerator/fuel_chamber, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"az" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/food/flour, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"aG" = ( +/obj/effect/decal/cleanable/oil, +/mob/living/simple_animal/hostile/hivebot/range, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"aZ" = ( +/mob/living/simple_animal/hostile/carp, +/turf/template_noop, +/area/template_noop) +"ba" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/scanning_module{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"bl" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bm" = ( +/obj/structure/transit_tube{ + dir = 4 + }, +/turf/template_noop, +/area/template_noop) +"bu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/particle_accelerator/particle_emitter/center, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bv" = ( +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/all_access{ + dir = 8; + pixel_x = 24 + }, +/obj/item/clothing/suit/space/nasavoid/old, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"bz" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/mercury{ + pixel_x = 6; + pixel_y = 8 + }, +/obj/item/reagent_containers/glass/bottle/nitrogen{ + pixel_x = -6; + pixel_y = 8 + }, +/obj/item/reagent_containers/glass/bottle/oxygen{ + pixel_x = 6 + }, +/obj/item/reagent_containers/glass/bottle/phosphorus{ + pixel_x = -6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"bC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"bH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"bN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer{ + desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; + dir = 1; + name = "Broken Computer" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"bP" = ( +/obj/machinery/rnd/production/protolathe, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"bS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/soap/nanotrasen, +/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/ruin/unpowered) +"bV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"bY" = ( +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"cc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/maintenance_hatch, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"cg" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/toy/nuke, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"cj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"cq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ct" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/electronics/airlock, +/obj/item/electronics/airlock, +/obj/item/electronics/apc, +/obj/item/electronics/apc, +/obj/structure/closet/crate/engineering/electrical, +/turf/open/floor/plating, +/area/ruin/unpowered) +"cw" = ( +/turf/closed/mineral/uranium, +/area/ruin/unpowered) +"cA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer{ + desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; + name = "Broken Computer" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"cH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"cI" = ( +/obj/structure/table, +/obj/item/tank/internals/oxygen, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/item/clothing/mask/breath, +/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/ruin/unpowered) +"cJ" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/unpowered) +"cK" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"cT" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/template_noop, +/area/ruin/unpowered) +"cV" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/transit_tube{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"da" = ( +/obj/structure/closet/crate/radiation, +/obj/item/stack/sheet/mineral/uranium{ + amount = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"dd" = ( +/obj/structure/transit_tube/station/reverse/flipped, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"dk" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"dw" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/turf/open/floor/plating, +/area/ruin/unpowered) +"dA" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"dB" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/iron/fifty, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"dC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"dD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer{ + desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; + name = "Broken Computer" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"dG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"dH" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ei" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/research{ + name = "Research and Development" + }, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"en" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"eB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/watertank/high{ + desc = "A highly-pressurized water tank, this one seems almost empty.."; + tank_volume = 1000 + }, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"eG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"eL" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"fe" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical/old, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ff" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/broken_bottle, +/obj/item/soap/nanotrasen, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"fj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"fq" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical/old, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/lootdrop/ruinloot/important, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"fs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"fE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"fF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/oldsec, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"fH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"fQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/dinnerware, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"fY" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/item/folder/white, +/obj/item/reagent_containers/glass/beaker, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"gx" = ( +/obj/machinery/power/solar, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"gE" = ( +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"gM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"gO" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"gQ" = ( +/obj/machinery/door/airlock/highsecurity, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ha" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"hd" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-25" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"hk" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/obj/machinery/door/poddoor{ + id = "ancient" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"hn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/seed_extractor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"hq" = ( +/obj/effect/spawner/structure/window/hollow/reinforced, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"hs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/emitter, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ht" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/kitchen/rollingpin, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"hz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer{ + desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; + dir = 8; + name = "Broken Computer" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"hM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/storage/box/firingpins, +/obj/structure/closet/crate/secure/weapon{ + req_access_txt = "203" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"hT" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/template_noop, +/area/ruin/unpowered) +"hW" = ( +/obj/structure/sign/poster/official/here_for_your_safety, +/turf/closed/wall/rust, +/area/ruin/unpowered) +"ia" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/machinery/power/apc{ + dir = 4; + name = "Charlie Main Corridor APC"; + pixel_x = 24; + start_charge = 0 + }, +/obj/item/storage/backpack/old, +/obj/item/storage/backpack/old, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ib" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ic" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"id" = ( +/obj/machinery/computer/rdconsole/core, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"im" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ir" = ( +/obj/structure/particle_accelerator/power_box, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"iK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc{ + dir = 1; + name = "Delta Prototype Lab APC"; + pixel_y = 24; + start_charge = 0 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"iN" = ( +/mob/living/simple_animal/hostile/hivebot/range, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"iP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc{ + dir = 4; + name = "Delta RnD APC"; + pixel_x = 24; + start_charge = 0 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"iS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/tank/internals/emergency_oxygen, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"iW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/freezer/fridge/open, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"jd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot/range, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ji" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"jl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"jt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/solar_control{ + name = "Station Solar Control Computer" + }, +/obj/item/paper/guides/jobs/engi/solars, +/obj/structure/cable/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ju" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"jw" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/robot_debris, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"jz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/window/westright, +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"jG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer{ + desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; + dir = 1; + name = "Broken Computer" + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"jJ" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"jX" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"jZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/airalarm/all_access{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"kd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"ki" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"kj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/all_access{ + pixel_y = 23 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"kk" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"kl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/window/westleft, +/obj/machinery/shower{ + dir = 8 + }, +/obj/item/soap/nanotrasen, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"ky" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, +/obj/machinery/door/poddoor{ + id = "ancient" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"kB" = ( +/obj/effect/decal/cleanable/dirt, +/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/white, +/area/ruin/unpowered) +"kL" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"kU" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"kW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot/strong, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"kY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance_hatch, +/turf/open/floor/plating, +/area/ruin/unpowered) +"kZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc{ + dir = 2; + name = "Charlie Kitchen APC"; + pixel_y = -24; + start_charge = 0 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"lb" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"li" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ln" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"lv" = ( +/obj/machinery/power/smes/engineering{ + charge = 0; + name = "backup power storage unit" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"lz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small, +/obj/structure/table, +/obj/item/trash/plate, +/turf/open/floor/plating, +/area/ruin/unpowered) +"lF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/ash, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"lK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/solar_assembly, +/obj/item/stack/sheet/glass{ + amount = 30 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"lL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot/strong, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"lM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -2; + pixel_y = 2 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"lO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"mh" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"mj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/command{ + name = "Charlie Station Access"; + req_access_txt = "200" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"my" = ( +/obj/effect/decal/cleanable/oil, +/mob/living/simple_animal/hostile/hivebot/strong, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"mE" = ( +/obj/machinery/door/airlock/research{ + name = "Research and Development" + }, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"mK" = ( +/obj/effect/decal/cleanable/oil, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"mO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/transit_tube_pod{ + dir = 4 + }, +/obj/structure/transit_tube/station/reverse{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"mT" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"mZ" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"nc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ng" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"nj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"nq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc{ + dir = 4; + name = "Charlie Command APC"; + pixel_x = 24; + start_charge = 0 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"nr" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/maintenance_hatch, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"nC" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"nF" = ( +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "200" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"nJ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"nL" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-25" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"nM" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/door/poddoor{ + id = "proto" + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"nP" = ( +/obj/effect/decal/cleanable/dirt, +/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, +/area/ruin/unpowered) +"nU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"nV" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/airalarm/all_access{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"nX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/wrench, +/obj/item/wirecutters, +/turf/open/floor/plating, +/area/ruin/unpowered) +"od" = ( +/obj/machinery/door/airlock/security, +/obj/machinery/door/firedoor/closed, +/obj/machinery/door/poddoor{ + id = "ancient" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"oj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"om" = ( +/turf/closed/wall/rust, +/area/ruin/unpowered) +"op" = ( +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"oq" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = -23 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ow" = ( +/obj/machinery/door/airlock/highsecurity, +/turf/open/floor/plating, +/area/ruin/unpowered) +"oz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + name = "Cryogenics Room" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"oI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"oN" = ( +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/ruin/unpowered) +"oQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"oS" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"oW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"oX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"pd" = ( +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/turf/template_noop, +/area/template_noop) +"pm" = ( +/obj/machinery/door/airlock/engineering{ + name = "Backup Generator Room" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"pn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/ruin/unpowered) +"po" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/rad_collector, +/turf/open/floor/plating, +/area/ruin/unpowered) +"pr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"pu" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"pz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"pD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"pJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/maintenance_hatch, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"pQ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"qc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"qx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"qJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/structure/closet/crate/engineering/electrical, +/turf/open/floor/plating, +/area/ruin/unpowered) +"qN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"qW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"rb" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"rm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/particle_accelerator/particle_emitter/right, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ru" = ( +/obj/structure/sign/warning/radiation, +/turf/closed/wall/rust, +/area/ruin/unpowered) +"rP" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/recharger, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"rX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"rY" = ( +/obj/effect/spawner/structure/window/hollow/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"sd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/particle_accelerator/control_box, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ss" = ( +/obj/machinery/door/airlock/command{ + name = "Beta Station Access" + }, +/obj/machinery/door/poddoor{ + id = "ancient" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"sD" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/copper{ + pixel_x = 6 + }, +/obj/item/reagent_containers/glass/bottle/ethanol{ + pixel_x = -6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"sJ" = ( +/obj/effect/decal/cleanable/dirt, +/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/white, +/area/ruin/unpowered) +"sR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/barricade/wooden, +/obj/machinery/door/airlock/command{ + name = "Charlie Station Access"; + req_access_txt = "200" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"sS" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ti" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"tn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/highsecurity{ + name = "Prototype Laboratory"; + req_access_txt = "200" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white/side, +/area/ruin/unpowered) +"tw" = ( +/obj/machinery/door/poddoor{ + id = "proto" + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"tC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"tD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/insectguts, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"tF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/enzyme{ + layer = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"tK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/all_access{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"tU" = ( +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"tZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ud" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/processor, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"uf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/mirror{ + name = "dusty mirror"; + pixel_x = -26 + }, +/obj/machinery/light/small{ + dir = 8; + pixel_y = -10 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"uj" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"up" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"us" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ut" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"uw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/transit_tube/station/reverse/flipped{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"uz" = ( +/obj/structure/sign/poster/contraband/pwr_game, +/turf/closed/wall/rust, +/area/ruin/unpowered) +"uH" = ( +/obj/machinery/modular_fabricator/exosuit_fab, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"uK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/coin, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"vu" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"vz" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"vI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/field/generator, +/turf/open/floor/plating, +/area/ruin/unpowered) +"vK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"vM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/maintenance_hatch, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/ruin/unpowered) +"vR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"vU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"vY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + dir = 8; + name = "Charlie Security APC"; + pixel_x = -24; + start_charge = 0 + }, +/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/ruin/unpowered) +"vZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/stack/sheet/glass{ + amount = 30 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"wg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"wj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"wl" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"wu" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"wv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-25" + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/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/ruin/unpowered) +"wQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/highsecurity{ + name = "Prototype Laboratory"; + req_access_txt = "200" + }, +/turf/open/floor/plasteel/white/side, +/area/ruin/unpowered) +"xb" = ( +/obj/structure/sign/departments/medbay/alt, +/turf/closed/wall/rust, +/area/ruin/unpowered) +"xf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4 + }, +/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/white, +/area/ruin/unpowered) +"xm" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"xw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + dir = 1; + name = "Delta Main Corridor APC"; + pixel_y = 24; + start_charge = 0 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"xx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/optable{ + name = "Robotics Operating Table" + }, +/obj/item/surgical_drapes, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"xB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"xY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/folder/red, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ye" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, +/obj/machinery/door/poddoor{ + id = "ancient" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"yp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/effect/decal/cleanable/oil, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"yy" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"yz" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + name = "Hydroponics" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"yB" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"yD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Dining Area" + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"yK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/mob/living/simple_animal/hostile/hivebot/strong, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"yM" = ( +/obj/machinery/rnd/production/circuit_imprinter, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/dropper, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"yS" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/iodine{ + pixel_y = 8 + }, +/obj/item/reagent_containers/glass/bottle/iron{ + pixel_x = 6 + }, +/obj/item/reagent_containers/glass/bottle/lithium{ + pixel_x = -6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"yU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/showcase/machinery/oldpod, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"yY" = ( +/obj/effect/decal/cleanable/dirt, +/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, +/area/ruin/unpowered) +"ze" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot/range, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"zf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"zi" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/carbon{ + pixel_x = 6 + }, +/obj/item/reagent_containers/glass/bottle/chlorine{ + pixel_x = -6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"zm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer{ + desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; + name = "Broken Computer" + }, +/obj/item/paper/fluff/ruins/oldstation/report, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"zn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/cable_coil{ + amount = 2 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"zs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot/range, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"zB" = ( +/obj/structure/table, +/obj/item/crowbar, +/obj/item/flashlight/glowstick, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"zI" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/fluorine{ + pixel_x = 6 + }, +/obj/item/reagent_containers/glass/bottle/hydrogen{ + pixel_x = -6 + }, +/obj/item/reagent_containers/glass/bottle/water{ + pixel_y = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"zO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/soda_cans/cola, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"zP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/lighter, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"zW" = ( +/obj/machinery/door/airlock/research{ + name = "Research and Development" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"zX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Al" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"An" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engineering" + }, +/obj/machinery/door/poddoor{ + id = "ancient" + }, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ao" = ( +/obj/structure/table/reinforced, +/obj/item/healthanalyzer{ + desc = "A prototype hand-held body scanner able to distinguish vital signs of the subject."; + name = "prototype health analyzer" + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Ax" = ( +/obj/machinery/chem_heater, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Az" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/paper, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"AK" = ( +/obj/structure/sign/departments/science, +/turf/closed/wall/rust, +/area/ruin/unpowered) +"AN" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/sugar{ + pixel_x = 6 + }, +/obj/item/reagent_containers/glass/bottle/sulfur{ + pixel_x = -6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"AP" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 5 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"AV" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"AW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Bc" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Bi" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Bl" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Bq" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/silver{ + amount = 25 + }, +/obj/item/stack/sheet/mineral/gold{ + amount = 25 + }, +/obj/item/stack/ore/bluespace_crystal, +/obj/item/stack/ore/bluespace_crystal, +/obj/item/stack/ore/bluespace_crystal, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Br" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/ruin/unpowered) +"Bt" = ( +/obj/effect/decal/cleanable/dirt, +/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/white, +/area/ruin/unpowered) +"Bw" = ( +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/head/helmet/space/nasavoid/old, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Bx" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/paper/fluff/ruins/oldstation/protosuit, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"BA" = ( +/obj/machinery/power/smes/engineering{ + charge = 0 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"BB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"BC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"BG" = ( +/obj/structure/table/reinforced, +/obj/machinery/the_singularitygen, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"BR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"BW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"BX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/button/door{ + id = "ancient"; + name = "Charlie Station Lockdown Button" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"BZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/mob_spawn/human/oldeng, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ca" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Cj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/toy/cards/deck, +/obj/item/folder/blue, +/obj/item/pen, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Cm" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Co" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"CA" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/paper/fluff/ruins/oldstation/protohealth, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"CG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"CS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/book/manual/wiki/security_space_law, +/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/ruin/unpowered) +"Dv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/stock_parts/cell{ + charge = 100; + maxcharge = 15000 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Dw" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"DD" = ( +/obj/item/stack/cable_coil, +/turf/template_noop, +/area/template_noop) +"DF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"DQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/assembly/flash/handheld, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"DU" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/power/solar, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"Eb" = ( +/obj/structure/sign/poster/official/science, +/turf/closed/wall/rust, +/area/ruin/unpowered) +"Ef" = ( +/obj/structure/lattice/catwalk, +/obj/item/stack/cable_coil{ + amount = 2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/template_noop, +/area/ruin/unpowered) +"Ep" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Es" = ( +/obj/structure/sign/poster/official/nanotrasen_logo, +/turf/closed/wall/rust, +/area/ruin/unpowered) +"Ew" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/airalarm/all_access{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"EF" = ( +/obj/structure/transit_tube, +/turf/template_noop, +/area/template_noop) +"ES" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 4 + }, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plating, +/area/ruin/unpowered) +"EW" = ( +/obj/structure/particle_accelerator/particle_emitter/left, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"EZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = -23 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Fd" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Fg" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Fk" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/iron{ + amount = 20 + }, +/obj/item/stack/sheet/iron{ + amount = 20 + }, +/obj/item/stack/sheet/mineral/copper{ + amount = 20 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Fy" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Fz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/transit_tube/station/reverse/flipped, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"FC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"FG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"FH" = ( +/obj/structure/transit_tube{ + dir = 4 + }, +/turf/template_noop, +/area/ruin/unpowered) +"FN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/oldsci, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"FQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"FS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/ruin/unpowered) +"FW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Ga" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Gd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Gn" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-25" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Gx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"GE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc{ + dir = 1; + name = "Charlie Hydroponics APC"; + pixel_y = 24; + start_charge = 0 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"GH" = ( +/obj/structure/shuttle/engine/large{ + dir = 4; + icon_state = "large_engine" + }, +/turf/closed/wall, +/area/ruin/unpowered) +"GK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"GN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-25" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/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, +/area/ruin/unpowered) +"GY" = ( +/obj/structure/transit_tube/crossing/horizontal, +/turf/template_noop, +/area/ruin/unpowered) +"Hh" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/silver{ + pixel_x = 6 + }, +/obj/item/reagent_containers/glass/bottle/sodium{ + pixel_x = -6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Hl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/circular_saw, +/obj/item/retractor, +/obj/item/hemostat, +/obj/item/scalpel{ + pixel_y = 12 + }, +/obj/item/cautery{ + pixel_x = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Hm" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/gloves/color/fyellow/old, +/obj/item/clothing/gloves/color/fyellow/old, +/obj/item/multitool, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Hn" = ( +/mob/living/simple_animal/hostile/hivebot/strong, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Ho" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Hr" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot/range, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Hz" = ( +/obj/effect/spawner/structure/window/hollow/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/poddoor{ + id = "ancient" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"HB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/reagentgrinder, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"HE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/command{ + name = "Delta Station Access" + }, +/obj/machinery/door/poddoor{ + id = "ancient" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"HL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance_hatch, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/ruin/unpowered) +"HR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"HW" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"HX" = ( +/obj/machinery/power/port_gen/pacman/super{ + name = "\improper emergency power generator" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"HZ" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ia" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ih" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"In" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Is" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Iv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/seeds/harebell, +/obj/item/seeds/carrot, +/obj/item/seeds/potato, +/obj/item/seeds/ambrosia, +/obj/item/seeds/poppy, +/obj/item/seeds/grape, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Iy" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/rust, +/area/ruin/unpowered) +"IG" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/aluminium{ + pixel_x = 6 + }, +/obj/item/reagent_containers/glass/bottle/bromine{ + pixel_x = -6 + }, +/obj/effect/decal/cleanable/dirt, +/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/ruin/unpowered) +"IY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + 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/ruin/unpowered) +"Jg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/trash/plate, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"Js" = ( +/obj/structure/sign/poster/official/work_for_a_future, +/turf/closed/wall/rust, +/area/ruin/unpowered) +"Jz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"JG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"JJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/shreds, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"JL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer{ + desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; + name = "Broken Computer" + }, +/obj/item/paper/fluff/ruins/oldstation/damagereport, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"JN" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"JO" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Kd" = ( +/obj/machinery/door/airlock/highsecurity, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Ki" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/particle_accelerator/end_cap, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Kn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/clothing/suit/armor/vest/old, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ky" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"KC" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"KE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer{ + desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; + name = "Broken Computer" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"KF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer{ + desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; + name = "Broken Computer" + }, +/obj/item/card/id/away/old/apc, +/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/ruin/unpowered) +"KJ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"KK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = -23 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"KL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"KN" = ( +/obj/structure/table/reinforced, +/obj/item/gun/energy/e_gun/old, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"KZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/restraints/handcuffs, +/obj/item/clothing/mask/gas, +/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, +/area/ruin/unpowered) +"Li" = ( +/obj/structure/rack, +/obj/item/stack/cable_coil, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc{ + dir = 4; + name = "Charlie Engineering APC"; + pixel_x = 24; + start_charge = 0 + }, +/obj/structure/cable, +/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/ruin/unpowered) +"Lp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/research{ + name = "Research and Development" + }, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"LD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/reagent_containers/spray/weedspray, +/obj/item/reagent_containers/spray/pestspray, +/obj/item/reagent_containers/spray/cleaner, +/turf/open/floor/plating, +/area/ruin/unpowered) +"LE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"LP" = ( +/obj/machinery/airalarm/all_access{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"LV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"LZ" = ( +/obj/structure/table, +/obj/item/crowbar, +/obj/item/flashlight/glowstick, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Mh" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Mj" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Mo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Mq" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"Mu" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Mw" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end, +/turf/open/floor/plating, +/area/ruin/unpowered) +"MC" = ( +/obj/structure/sign/poster/official/build, +/turf/closed/wall/rust, +/area/ruin/unpowered) +"MG" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/plasma{ + amount = 25 + }, +/obj/item/stack/sheet/mineral/uranium{ + amount = 25 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"MQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/megaphone, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"MR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"MS" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/corner, +/area/ruin/unpowered) +"MW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Nl" = ( +/turf/template_noop, +/area/template_noop) +"Nm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Nn" = ( +/obj/machinery/power/smes/engineering{ + charge = 0 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Np" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ns" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ny" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"NB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/structure/closet/crate/engineering/electrical, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"NH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/lootdrop/ruinloot/important, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"NJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"NN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"NO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"NS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/cultivator{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/cultivator, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/item/shovel/spade, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Od" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/ruin/unpowered) +"Oj" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ok" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plating, +/area/ruin/unpowered) +"On" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-25" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Oq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/item/storage/backpack/old, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ot" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ov" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Ox" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/template_noop, +/area/ruin/unpowered) +"Oz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/mirror{ + name = "dusty mirror"; + pixel_x = -26 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"OB" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"OD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/clothing/head/helmet/old, +/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, +/area/ruin/unpowered) +"OP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/all_access{ + pixel_y = 23 + }, +/obj/effect/decal/cleanable/food/egg_smudge, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"Pc" = ( +/obj/structure/transit_tube_pod{ + dir = 4 + }, +/turf/template_noop, +/area/template_noop) +"Ph" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/urinal{ + pixel_y = 32 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Pk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Pp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Pq" = ( +/turf/closed/mineral/plasma, +/area/ruin/unpowered) +"Pu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Pv" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Px" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/maintenance_hatch, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"PF" = ( +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "200" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"PH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"PJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"PK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"PR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/toilet, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"PT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/recharger, +/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/ruin/unpowered) +"PW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"PX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"PY" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Qi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Qw" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/template_noop, +/area/ruin/unpowered) +"Qx" = ( +/obj/machinery/door/airlock, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Qy" = ( +/obj/machinery/chem_master, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/glass/beaker, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Qz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"QL" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"QO" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/potassium{ + pixel_x = 6 + }, +/obj/item/reagent_containers/glass/bottle/radium{ + pixel_x = -6 + }, +/obj/item/reagent_containers/glass/bottle/welding_fuel{ + pixel_y = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"QR" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/sacid{ + pixel_x = 6 + }, +/obj/item/reagent_containers/glass/bottle/silicon{ + pixel_x = -6 + }, +/obj/effect/decal/cleanable/dirt, +/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/ruin/unpowered) +"QU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"QV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"QZ" = ( +/obj/machinery/hydroponics/soil, +/turf/open/floor/grass, +/area/ruin/unpowered) +"Rc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/mirror{ + name = "dusty mirror"; + pixel_y = 28 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Rg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Rn" = ( +/obj/effect/decal/cleanable/robot_debris, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Rx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"RE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/pickaxe, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"RI" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/paper/fluff/ruins/oldstation/protogun, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"RQ" = ( +/obj/effect/decal/cleanable/dirt, +/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, +/area/ruin/unpowered) +"RR" = ( +/obj/structure/sign/poster/contraband/donut_corp, +/turf/closed/wall/rust, +/area/ruin/unpowered) +"RX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Sc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/button/door{ + id = "proto"; + name = "Prototype Lab Lockdown" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/item/paper/fluff/ruins/oldstation/protoinv, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Sh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Sk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"So" = ( +/turf/closed/mineral, +/area/ruin/unpowered) +"SE" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/door/poddoor{ + id = "proto" + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"SP" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/item/paper/fluff/ruins/oldstation, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ST" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"SV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"SW" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/template_noop, +/area/ruin/unpowered) +"SY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/electronics/apc, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Ta" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Th" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot/strong, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Ti" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 6 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"TB" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"TF" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"Uc" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/plasteel{ + amount = 30 + }, +/obj/item/stack/sheet/mineral/titanium{ + amount = 30 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"Ug" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ul" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Chemical Storage"; + req_access_txt = "200" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Up" = ( +/obj/structure/chair, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Uw" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-25" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/departments/restroom{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"UI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/showcase/machinery/oldpod, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"UO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"UR" = ( +/obj/effect/decal/cleanable/robot_debris, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"US" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Vd" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Vi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Vj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/structure/closet/crate/engineering/electrical, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Vm" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/suit/space/hardsuit/ancient, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Vn" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Vp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Vw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Vy" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Vz" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Engineering Storage" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered) +"VY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Wc" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/ruin/unpowered) +"Wg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/item/storage/box/lights/mixed, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Wz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"WK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"WL" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/paper/fluff/ruins/oldstation/protosing, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"WO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/tank/internals/plasma/full, +/obj/item/tank/internals/plasma/full, +/obj/item/tank/internals/plasma/full, +/obj/item/tank/internals/plasma/full, +/obj/structure/closet/crate/secure/engineering{ + name = "plasma tank crate"; + req_access_txt = "204" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Xe" = ( +/obj/structure/transit_tube/crossing/horizontal, +/turf/template_noop, +/area/template_noop) +"Xj" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Xk" = ( +/obj/machinery/rnd/destructive_analyzer, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Xl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"Xo" = ( +/obj/effect/spawner/structure/window/hollow/reinforced, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Xs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/medical/bruise_pack, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"XA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"XF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/science{ + name = "Artificial Program Core Room" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/ruin/unpowered) +"XL" = ( +/obj/structure/table, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/capacitor, +/obj/item/stock_parts/micro_laser, +/obj/item/stack/cable_coil, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"XQ" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-25" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot/strong, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"XR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"XS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + name = "dusty mirror"; + pixel_x = 26 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"XU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"XV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/pen, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ye" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Yg" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/ruin/unpowered) +"Yo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Yq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Ys" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer{ + desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; + name = "Broken Computer" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Yx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/kitchen/fork, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"YB" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"YG" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/template_noop, +/area/ruin/unpowered) +"YR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/gun/energy/laser/retro/old{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/gun/energy/laser/retro/old{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/machinery/airalarm/unlocked{ + dir = 4; + pixel_x = -23 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"YS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/tank/internals/anesthetic, +/obj/item/clothing/mask/breath/medical, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"YU" = ( +/obj/structure/table, +/obj/item/stack/cable_coil{ + amount = 15 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/fluff/ruins/oldstation/generator_manual, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Zk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/dice/d6, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Zl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Zr" = ( +/turf/closed/mineral/iron, +/area/ruin/unpowered) +"ZC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"ZV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) + +(1,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(2,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +"} +(3,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +bY +bY +bY +Nl +Nl +Ef +Nl +Nl +Mq +bY +bY +Br +bY +bY +DU +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(4,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +DD +Nl +Nl +Nl +Nl +Nl +Nl +Br +oN +oN +YG +oN +oN +Ox +YG +YG +hT +oN +SW +oN +YG +oN +hT +Br +Nl +Nl +Nl +Br +Nl +pd +So +So +Nl +Nl +Nl +Nl +"} +(5,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +bY +bY +DU +Nl +Nl +Qw +Nl +Nl +bY +Mq +bY +Br +bY +bY +bY +Nl +Nl +Nl +Nl +DD +So +So +cw +cw +So +Nl +Nl +Nl +"} +(6,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +oN +oN +cT +YG +YG +ar +YG +oN +oN +hT +oN +YG +oN +oN +oN +gE +Nl +Nl +Nl +Br +So +Pq +Pq +Zr +So +Nl +Nl +Nl +"} +(7,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +bY +bY +jJ +Nl +Nl +Qw +Nl +Nl +bY +bY +bY +Br +bY +bY +bY +Nl +Nl +Nl +Br +Nl +Nl +So +So +So +Nl +Nl +Nl +Nl +"} +(8,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +cT +YG +oN +oN +oN +Ox +YG +YG +YG +SW +YG +oN +YG +YG +SW +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(9,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +gx +bY +bY +Nl +Nl +Qw +Nl +Nl +bY +jJ +bY +Br +bY +jJ +jJ +Nl +Nl +Nl +Nl +Br +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +"} +(10,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +bm +Nl +Nl +Br +Nl +Nl +Nl +yy +nF +yy +Nl +Nl +Nl +Br +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +aZ +Nl +Nl +"} +(11,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +bm +Nl +Nl +Br +Nl +Nl +Nl +Xj +NJ +Xj +Nl +Nl +Nl +Br +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(12,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Xe +Nl +Nl +om +om +om +nC +Ti +PF +AP +Mw +om +om +om +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(13,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +bm +Nl +Nl +om +KF +eG +GK +Yo +BW +oj +oW +yp +jt +om +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(14,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +bm +Nl +om +om +Dv +Yo +gO +Rg +Ho +Rg +Bi +Yo +vZ +om +om +om +om +om +om +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(15,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +om +Xo +cV +Xo +om +cI +qN +KL +Nn +RX +kU +RX +BA +Yo +NN +Hm +om +li +tZ +da +om +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(16,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +om +NB +dd +Yo +om +Bw +Yo +NH +Yo +lF +zn +Yo +Yo +Qi +Yo +fe +om +lv +Pk +HX +om +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(17,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +om +Yo +Yo +Wg +om +bv +bC +ti +Pp +qN +JN +jX +xm +rb +sS +Li +om +nX +PY +YU +om +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(18,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +om +om +om +om +om +xb +ss +xb +om +om +om +om +om +An +Hz +An +MC +om +om +om +om +ru +pm +ru +om +om +om +om +om +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(19,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +om +om +uz +Vj +ct +PY +om +hd +jX +nJ +oq +jX +QL +Pv +mT +jX +JO +jX +lb +Pv +Ny +QL +oq +nJ +KJ +On +om +cq +Sk +PH +om +om +om +Nl +Nl +Nl +Nl +Nl +Nl +"} +(20,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +om +nq +qx +qx +qx +qx +kY +qW +im +FG +qN +qN +qN +Ep +mZ +QV +Vy +QV +mZ +qN +qN +qN +qN +FG +PJ +Cm +HL +PW +qx +qx +lK +ia +om +Nl +Nl +Nl +Nl +Nl +Nl +"} +(21,1,1) = {" +Nl +Nl +Nl +Nl +Nl +om +om +om +om +om +om +om +om +Yo +lO +om +om +Xo +yz +Xo +om +om +nr +om +om +Xo +yD +Xo +om +om +lO +Ug +om +om +om +om +Js +om +om +om +Nl +Nl +Nl +Nl +Nl +"} +(22,1,1) = {" +Nl +Nl +Nl +Nl +om +om +RQ +cA +fE +cA +LV +om +om +Ga +eL +om +wv +Yo +Yo +UO +nP +om +KC +om +fQ +mh +mh +mh +ic +om +eL +Ga +om +om +AW +LZ +zB +LZ +Yo +om +om +Nl +Nl +Nl +Nl +"} +(23,1,1) = {" +Nl +Nl +Nl +Nl +Es +RQ +Ia +Ca +Yo +zP +MR +Ns +Es +PK +lO +yy +fs +Yo +Yo +Yo +QZ +om +KC +om +iW +mh +mh +mh +Yx +yy +lO +HR +om +Pu +Yo +Yo +Yo +Yo +Yo +HR +om +Nl +Nl +Nl +Nl +"} +(24,1,1) = {" +Nl +Nl +Nl +Nl +ye +Ia +Yo +Yo +Yo +Yo +Yo +Zk +yy +Yo +lO +Xj +QZ +Yo +Yo +Yo +QZ +om +GE +om +mh +az +mh +Ky +SV +Xj +lO +Yo +yy +Yo +yU +Yo +FN +Yo +yU +Yo +Xo +Nl +Nl +Nl +Nl +"} +(25,1,1) = {" +Nl +Nl +Nl +Nl +hk +KE +BX +Yo +Yo +Yo +Yo +MR +Fd +Yo +lO +Xj +QZ +Yo +NS +KL +PX +om +KC +om +rX +ht +mh +mh +Xl +Xj +lO +Yo +Fd +Yo +Yo +Yo +Yo +Yo +Yo +Yo +om +Nl +Nl +Nl +Nl +"} +(26,1,1) = {" +Nl +Nl +Nl +Nl +hk +JL +ib +Yo +MQ +uK +qN +qN +ln +qN +Nm +Xj +eB +Yo +hn +XR +Ih +vM +vz +pJ +zf +tF +mh +mh +lM +Xj +LE +Sh +oz +qN +UI +qN +BZ +qN +UI +pr +Xo +Nl +Nl +Nl +Nl +"} +(27,1,1) = {" +Nl +Nl +Nl +Nl +hk +zm +Cj +Yo +Yo +Yo +Yo +Gd +yy +Yo +Yo +Xj +QZ +Yo +Iv +Yo +oI +om +Vd +om +OP +HB +az +mh +SV +Xj +lO +Yo +yy +Yo +Yo +tD +Yo +Yo +Yo +Yo +om +Nl +Nl +Nl +Nl +"} +(28,1,1) = {" +Nl +Nl +Nl +Nl +ky +Rx +Yo +Yo +Yo +Yo +Yo +iS +Fd +Yo +Yo +Xj +QZ +Yo +Yo +Yo +QZ +om +kZ +om +mh +mh +mh +mh +Xl +Xj +lO +Yo +Fd +Yo +fF +Yo +yU +Yo +yU +Yo +Xo +Nl +Nl +Nl +Nl +"} +(29,1,1) = {" +Nl +Nl +Nl +Nl +Es +yY +Rx +Ca +Yo +Ca +Gd +bS +Es +PK +JJ +Fd +us +Yo +Yo +Yo +QZ +om +Vd +om +ud +mh +mh +mh +Jg +Fd +lO +HR +om +Rc +Yo +Yo +Yo +Yo +Yo +HR +om +Nl +Nl +Nl +Nl +"} +(30,1,1) = {" +Nl +Nl +Nl +Nl +om +om +yY +dD +Ew +dD +IY +om +om +Ga +Ga +om +GN +AV +Yo +US +jl +om +Vn +om +cH +mh +mh +mh +qc +om +wg +yB +om +om +Vp +hz +SP +hz +Yo +om +om +Nl +Nl +Nl +Nl +"} +(31,1,1) = {" +Nl +Nl +Nl +Nl +Nl +om +om +om +om +om +om +om +om +Yo +Yo +om +om +Xo +yz +Xo +om +om +Px +om +om +Xo +yD +Xo +om +om +Yq +Yo +om +om +om +om +om +om +om +om +Nl +Nl +Nl +Nl +Nl +"} +(32,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +om +Ph +ha +up +uf +Oz +Qx +Yo +Yo +gM +Vi +Vi +Vi +Vi +kk +Bc +uj +Bc +kk +Vi +Vi +Vi +Vi +Fy +Wz +Yo +dw +PY +PY +LD +Vj +PY +om +Nl +Nl +Nl +Nl +Nl +Nl +"} +(33,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +om +PR +XS +Iy +jz +kl +om +Uw +Yo +QU +nV +Yo +vK +Yo +Ga +Yo +dH +Yo +Ga +vK +Yo +Yo +LP +QU +Yo +Gn +om +FS +PY +qJ +om +om +om +Nl +Nl +Nl +Nl +Nl +Nl +"} +(34,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +om +om +om +om +om +om +om +AK +HE +AK +om +om +om +om +hW +od +Hz +od +om +om +om +om +om +AK +HE +AK +om +om +om +om +om +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(35,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +om +Yo +Yo +fj +om +vY +Mj +Np +Mj +OB +pz +Jz +vR +In +vR +YR +om +fj +Yo +Yo +om +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(36,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +om +Yo +uw +Yo +om +Ys +Yo +Yo +Az +XV +Is +zO +xY +Yo +Yo +Kn +om +Yo +mO +Yo +om +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(37,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +om +Xo +cV +Xo +om +PT +Gx +Yo +BB +bN +Is +KE +BB +Yo +FC +OD +om +Xo +cV +Xo +om +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(38,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +bm +Nl +om +RR +WK +Yo +Yo +Yo +Is +Yo +Yo +Yo +xB +om +om +Nl +FH +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(39,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +So +Zr +Nl +Nl +Nl +Nl +Nl +bm +Nl +Nl +Nl +om +CS +DQ +NO +bH +dC +tC +VY +Oq +KZ +om +Nl +Nl +FH +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +aZ +Nl +"} +(40,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Zr +Zr +Zr +Zr +Nl +Nl +Nl +Nl +Nl +Pc +bm +Nl +om +om +om +om +om +rY +om +om +om +om +om +Nl +Nl +FH +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(41,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Zr +Zr +Zr +Zr +bm +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +pu +Br +Nl +Nl +Nl +Nl +Nl +Nl +GY +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(42,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Zr +Zr +Zr +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +EF +Nl +Nl +Br +pu +Br +Nl +Nl +Nl +Nl +Nl +Nl +FH +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(43,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +EF +Nl +Nl +So +So +Nl +Nl +Br +pu +Br +Nl +Nl +Nl +Nl +Nl +Nl +FH +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(44,1,1) = {" +aZ +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +bm +Nl +Nl +So +So +So +Nl +Br +pu +Br +Nl +Nl +Nl +Nl +Nl +Nl +FH +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(45,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +om +Xo +cV +Xo +om +Nl +So +So +om +om +hq +om +om +Nl +Nl +Nl +om +Xo +cV +Xo +om +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(46,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +om +ju +Fz +RE +om +Nl +Nl +Nl +om +SY +Qz +lz +om +Nl +Nl +Nl +om +Yo +dd +Yo +om +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(47,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +om +Yo +Xs +Zl +om +Nl +Nl +Nl +om +xw +vU +Ye +om +Nl +Nl +Nl +om +Zl +Yo +Yo +om +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(48,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Br +Br +Nl +Nl +Nl +Nl +Nl +om +Eb +sR +Eb +om +om +om +om +om +om +cc +om +om +om +om +om +om +Eb +mj +Eb +om +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(49,1,1) = {" +Nl +Nl +Nl +Nl +So +So +So +So +So +So +So +Nl +Nl +om +XQ +pQ +ji +EZ +QL +ut +Co +kL +JO +jX +ng +jX +QL +KK +ji +jX +jX +nL +om +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(50,1,1) = {" +Nl +Nl +So +So +So +So +So +So +So +So +So +So +Nl +om +vu +Al +FG +qN +qN +wl +qN +oQ +iP +qN +mZ +qN +qN +oQ +FG +qN +KL +dA +om +Nl +Nl +Nl +Br +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(51,1,1) = {" +Nl +So +So +TF +TF +TF +TF +TF +TF +TF +TF +So +So +om +Oj +Bl +om +om +om +om +om +om +om +om +om +om +om +om +om +om +Bl +Oj +cJ +cJ +cJ +cJ +cJ +cJ +cJ +Nl +Nl +Nl +Nl +Nl +Nl +"} +(52,1,1) = {" +Nl +So +TF +Uc +tU +tU +HW +Rn +mK +tU +Fk +TF +So +om +Hr +jd +om +sJ +BC +kd +ha +MW +Yo +Dw +Yo +Up +ff +cg +TB +om +zX +Mu +cJ +Vm +Bx +cJ +CA +Ao +cJ +Nl +Nl +Nl +Nl +Nl +Nl +"} +(53,1,1) = {" +Nl +So +TF +tU +mK +tU +op +op +tU +tU +tU +TF +HW +om +dA +lO +om +ha +id +ha +bP +ha +dB +cK +Yo +Up +fY +rP +TB +om +eL +YB +cJ +tw +nM +cJ +nM +tw +cJ +Nl +Nl +Nl +Nl +Nl +Nl +"} +(54,1,1) = {" +So +So +TF +TF +TF +TF +Kd +Kd +TF +TF +TF +TF +PY +om +Hr +zs +om +ha +Xk +ha +yM +ha +fq +cK +ZC +MS +lO +Yo +Wc +om +ak +dA +cJ +DF +ZV +CG +ZV +ZV +cJ +Nl +Nl +Nl +Nl +Nl +Nl +"} +(55,1,1) = {" +So +So +TF +tU +jw +tU +oS +op +HW +aG +UR +ow +PY +XF +Ta +lO +om +Bt +Th +ha +ha +kB +lO +Fg +Yo +Yo +Qy +Ax +Yo +om +jd +Hr +cJ +iK +ha +ha +ha +bV +cJ +Nl +Nl +Nl +Nl +Nl +Nl +"} +(56,1,1) = {" +So +So +TF +tU +tU +UR +op +Rn +op +iN +tU +ow +PY +XF +ze +jd +zW +Yo +Yo +Yo +kW +Yo +lO +Yo +Yo +Yg +jd +Yo +Od +mE +lO +HZ +tn +cj +ha +ha +wj +jG +yy +Nl +Nl +Nl +Nl +Nl +Nl +"} +(57,1,1) = {" +So +So +TF +TF +TF +TF +gQ +gQ +TF +TF +TF +TF +PY +om +Yo +lO +Lp +Yo +Yo +Yo +Yo +Yo +XR +qN +qN +jZ +Mo +Pp +qN +ei +oX +oQ +wQ +XU +XU +XU +Sc +jG +Fd +Nl +Nl +Nl +Nl +Nl +Nl +"} +(58,1,1) = {" +So +So +TF +HW +tU +tU +tU +tU +tU +tU +op +TF +HW +om +ze +jd +om +yK +ha +ha +Th +Ov +Yo +om +om +om +Ul +om +om +om +lO +Yo +cJ +kj +ha +ha +ha +bV +cJ +Nl +Nl +Nl +Nl +Nl +Nl +"} +(59,1,1) = {" +So +So +TF +op +tU +tU +UR +tU +HW +tU +op +TF +So +om +Yo +ST +om +ha +uH +ha +YS +ha +ba +om +IG +fH +nc +pD +AN +om +FQ +nU +cJ +dG +FW +nj +FW +FW +cJ +Nl +Nl +Nl +Nl +Nl +Nl +"} +(60,1,1) = {" +So +So +TF +Rn +tU +op +HW +iN +op +tU +oS +TF +So +om +Yo +lO +om +ha +dk +ha +xx +ha +XL +om +zi +Yo +bz +Yo +Hh +om +lO +Yo +cJ +tw +SE +cJ +SE +tw +cJ +Nl +Nl +Nl +Nl +Nl +Nl +"} +(61,1,1) = {" +So +So +TF +op +HW +iN +iN +iN +iN +HW +op +TF +So +om +ze +jd +om +Bt +XA +ha +ha +xf +Yo +om +sD +zI +yS +QO +QR +om +zX +ZC +cJ +BG +WL +cJ +RI +KN +cJ +Nl +Nl +Nl +Nl +Nl +Nl +"} +(62,1,1) = {" +So +So +TF +op +Rn +op +Hn +Hn +op +Rn +op +TF +So +om +wu +Bl +om +om +om +om +om +om +om +om +om +om +om +om +om +om +Bl +wu +cJ +cJ +cJ +cJ +cJ +cJ +cJ +Nl +Nl +Nl +Nl +Nl +Nl +"} +(63,1,1) = {" +So +So +TF +HW +oS +Hn +op +op +Hn +oS +op +TF +So +om +Yo +lL +KL +ZC +Yo +ki +Yo +ZC +Yo +ZC +Ga +ZC +Yo +ZC +Yo +Vw +Nm +Yo +om +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(64,1,1) = {" +So +So +TF +TF +TF +TF +ow +ow +TF +TF +TF +TF +So +om +Gn +kW +JG +tK +vK +ki +Zl +ZC +Yo +ZC +en +ZC +Yo +tK +Ot +BR +Yo +Gn +om +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(65,1,1) = {" +Nl +So +TF +Bq +Rn +my +Hn +Hn +Hn +op +MG +TF +om +om +Mh +om +om +om +om +om +om +om +Vz +om +om +om +om +om +om +om +Mh +om +om +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(66,1,1) = {" +Nl +So +So +TF +HW +Hn +Hn +Hn +Hn +oS +TF +So +om +Ok +Ok +PY +om +Nl +om +hs +hs +hs +PY +PY +PY +PY +bu +Ki +om +Ok +Ok +Ok +om +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +aZ +Nl +Nl +"} +(67,1,1) = {" +Nl +So +So +So +HW +GH +HW +GH +HW +GH +So +So +om +Hl +ES +WO +om +Nl +om +hs +vI +vI +PY +po +po +sd +rm +ay +om +pn +hM +PY +om +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(68,1,1) = {" +Nl +Nl +So +So +bY +bY +bY +bY +bY +bY +So +Nl +om +om +om +om +om +Nl +om +om +vI +vI +vI +po +po +EW +ir +om +om +om +om +om +om +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} +(69,1,1) = {" +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +om +om +om +om +om +om +bl +om +om +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +Nl +"} diff --git a/_maps/RuinGeneration/9x13_kitchen.dmm b/_maps/RuinGeneration/9x13_kitchen.dmm new file mode 100644 index 0000000000000..d506e72de5478 --- /dev/null +++ b/_maps/RuinGeneration/9x13_kitchen.dmm @@ -0,0 +1,272 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/enzyme{ + layer = 5 + }, +/obj/item/stack/packageWrap, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"c" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 5 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"e" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"f" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"j" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"k" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/snacks/mint, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"m" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 3 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"o" = ( +/obj/structure/table, +/obj/item/kitchen/rollingpin, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"q" = ( +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/ruin/unpowered) +"s" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"z" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"A" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"D" = ( +/obj/structure/sink/kitchen{ + pixel_y = 28 + }, +/obj/machinery/food_cart, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"F" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"G" = ( +/obj/machinery/processor, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"I" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"J" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"K" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"L" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"O" = ( +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"Q" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"T" = ( +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) +"Z" = ( +/obj/machinery/deepfryer, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/unpowered) + +(1,1,1) = {" +L +L +j +L +L +L +j +L +L +z +J +z +L +"} +(2,1,1) = {" +L +s +O +O +O +O +O +L +q +z +z +z +L +"} +(3,1,1) = {" +L +D +O +O +O +O +O +L +q +z +z +z +L +"} +(4,1,1) = {" +L +e +O +k +b +O +O +T +q +z +z +z +L +"} +(5,1,1) = {" +L +I +O +m +c +O +O +F +q +z +z +z +L +"} +(6,1,1) = {" +L +Q +O +o +Z +O +O +F +q +z +z +z +L +"} +(7,1,1) = {" +L +Q +O +O +O +O +O +F +q +z +z +z +L +"} +(8,1,1) = {" +L +A +O +O +G +f +O +L +q +z +z +z +L +"} +(9,1,1) = {" +L +L +L +L +L +L +L +L +q +z +K +z +L +"} diff --git a/_maps/RuinGeneration/9x13_medstorage.dmm b/_maps/RuinGeneration/9x13_medstorage.dmm new file mode 100644 index 0000000000000..f5cd251e875b3 --- /dev/null +++ b/_maps/RuinGeneration/9x13_medstorage.dmm @@ -0,0 +1,343 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/machinery/door/airlock/medical/glass, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"c" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"f" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"i" = ( +/obj/structure/window/reinforced, +/obj/structure/frame/computer{ + dir = 4 + }, +/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, +/area/ruin/unpowered) +"k" = ( +/obj/structure/closet/secure_closet/medical3, +/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, +/area/ruin/unpowered) +"p" = ( +/obj/structure/table/glass, +/obj/machinery/door/window{ + dir = 8 + }, +/obj/item/storage/firstaid, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"t" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"v" = ( +/obj/structure/table/glass, +/obj/machinery/door/window{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/ruinloot/medical, +/obj/effect/spawner/lootdrop/ruinloot/medical, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"x" = ( +/obj/machinery/vending/wardrobe/medi_wardrobe, +/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, +/area/ruin/unpowered) +"A" = ( +/obj/structure/frame/machine, +/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, +/area/ruin/unpowered) +"B" = ( +/obj/machinery/vending/medical, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/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, +/area/ruin/unpowered) +"E" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"J" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"K" = ( +/obj/structure/window/reinforced, +/obj/structure/closet/secure_closet/medical3, +/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, +/area/ruin/unpowered) +"L" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"M" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/ruin/unpowered) +"O" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"P" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/closed/wall, +/area/ruin/unpowered) +"R" = ( +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"S" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"T" = ( +/obj/structure/table/glass, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/spawner/lootdrop/ruinloot/medical, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"W" = ( +/obj/structure/table/glass, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/ruinloot/medical, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"X" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Y" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) + +(1,1,1) = {" +c +R +S +R +c +c +c +c +c +c +c +P +c +"} +(2,1,1) = {" +c +R +R +J +c +x +B +i +W +v +W +L +c +"} +(3,1,1) = {" +c +R +R +E +M +t +t +t +t +t +t +X +Y +"} +(4,1,1) = {" +c +R +R +E +a +t +R +R +R +R +R +J +c +"} +(5,1,1) = {" +c +R +R +E +M +t +R +M +c +M +R +J +c +"} +(6,1,1) = {" +c +R +R +E +a +t +R +R +R +R +R +J +c +"} +(7,1,1) = {" +c +R +R +E +M +X +J +J +J +J +J +J +c +"} +(8,1,1) = {" +c +R +R +f +c +A +k +K +T +p +T +L +c +"} +(9,1,1) = {" +c +R +O +R +c +c +c +c +c +c +c +c +c +"} diff --git a/_maps/RuinGeneration/9x13_sleeproom.dmm b/_maps/RuinGeneration/9x13_sleeproom.dmm new file mode 100644 index 0000000000000..d9a75405ceaaf --- /dev/null +++ b/_maps/RuinGeneration/9x13_sleeproom.dmm @@ -0,0 +1,281 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/carpet/blue, +/area/ruin/unpowered) +"d" = ( +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/carpet/orange, +/area/ruin/unpowered) +"e" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"f" = ( +/obj/structure/table, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/carpet/orange, +/area/ruin/unpowered) +"h" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/turf/open/floor/carpet/blue, +/area/ruin/unpowered) +"j" = ( +/turf/open/floor/carpet/orange, +/area/ruin/unpowered) +"l" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/turf/open/floor/carpet/cyan, +/area/ruin/unpowered) +"m" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/turf/open/floor/carpet/orange, +/area/ruin/unpowered) +"n" = ( +/obj/structure/table, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/carpet/purple, +/area/ruin/unpowered) +"p" = ( +/obj/structure/table, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/carpet/blue, +/area/ruin/unpowered) +"s" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/turf/open/floor/carpet/orange, +/area/ruin/unpowered) +"v" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm4"; + name = "Dorm 4" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"w" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm1"; + name = "Dorm 1" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"z" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm3"; + name = "Dorm 3" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"A" = ( +/obj/structure/table, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/carpet/cyan, +/area/ruin/unpowered) +"B" = ( +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/carpet/purple, +/area/ruin/unpowered) +"D" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/turf/open/floor/carpet/purple, +/area/ruin/unpowered) +"E" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/turf/open/floor/carpet/purple, +/area/ruin/unpowered) +"I" = ( +/turf/open/floor/carpet/blue, +/area/ruin/unpowered) +"L" = ( +/turf/open/floor/carpet/cyan, +/area/ruin/unpowered) +"O" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/turf/open/floor/carpet/blue, +/area/ruin/unpowered) +"P" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm2"; + name = "Dorm 2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Q" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"R" = ( +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/carpet/cyan, +/area/ruin/unpowered) +"U" = ( +/turf/open/floor/carpet/purple, +/area/ruin/unpowered) +"V" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/turf/open/floor/carpet/cyan, +/area/ruin/unpowered) +"Y" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +"} +(2,1,1) = {" +Q +A +V +Q +f +u +Q +n +E +Q +p +O +Q +"} +(3,1,1) = {" +Q +R +L +Q +d +j +Q +B +U +Q +b +I +Q +"} +(4,1,1) = {" +Q +l +L +Q +m +j +Q +D +U +Q +h +I +Q +"} +(5,1,1) = {" +Q +Q +v +Q +Q +z +Q +Q +P +Q +Q +w +Q +"} +(6,1,1) = {" +s +s +s +s +s +s +s +s +s +s +s +s +s +"} +(7,1,1) = {" +Y +s +s +s +s +s +s +s +s +s +s +s +e +"} +(8,1,1) = {" +s +s +s +s +s +s +s +s +s +s +s +s +s +"} +(9,1,1) = {" +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +"} diff --git a/_maps/RuinGeneration/9x13_teleporter.dmm b/_maps/RuinGeneration/9x13_teleporter.dmm new file mode 100644 index 0000000000000..4efa45b949258 --- /dev/null +++ b/_maps/RuinGeneration/9x13_teleporter.dmm @@ -0,0 +1,196 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/turf/open/floor/plasteel/airless{ + icon_state = "damaged3" + }, +/area/ruin/unpowered) +"c" = ( +/obj/structure/table, +/obj/item/stock_parts/cell{ + charge = 100; + maxcharge = 15000 + }, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"e" = ( +/obj/machinery/computer/teleporter{ + dir = 4 + }, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"g" = ( +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"q" = ( +/turf/template_noop, +/area/template_noop) +"y" = ( +/obj/machinery/teleport/station, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"z" = ( +/obj/machinery/door/airlock/vault, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"I" = ( +/obj/machinery/teleport/hub, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"L" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel/airless, +/area/ruin/unpowered) +"P" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"Q" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"T" = ( +/turf/open/floor/plasteel/airless{ + icon_state = "damaged2" + }, +/area/ruin/unpowered) +"X" = ( +/turf/open/floor/plating/airless, +/area/ruin/unpowered) + +(1,1,1) = {" +q +q +q +q +q +P +L +P +q +q +q +q +q +"} +(2,1,1) = {" +q +q +q +Q +q +P +g +P +q +Q +q +q +q +"} +(3,1,1) = {" +q +q +q +P +P +P +z +P +P +P +q +q +q +"} +(4,1,1) = {" +q +q +P +P +c +b +X +g +g +X +X +q +q +"} +(5,1,1) = {" +q +Q +P +g +g +g +g +g +g +g +X +Q +q +"} +(6,1,1) = {" +q +q +P +g +g +e +y +I +g +X +P +q +q +"} +(7,1,1) = {" +q +Q +X +T +X +g +g +g +g +X +P +Q +q +"} +(8,1,1) = {" +q +q +X +X +T +X +g +g +g +P +P +q +q +"} +(9,1,1) = {" +q +q +q +X +X +P +P +P +P +P +q +q +q +"} diff --git a/_maps/RuinGeneration/9x5_3_seperation.dmm b/_maps/RuinGeneration/9x5_3_seperation.dmm new file mode 100644 index 0000000000000..c78cb3101057b --- /dev/null +++ b/_maps/RuinGeneration/9x5_3_seperation.dmm @@ -0,0 +1,97 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"f" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/ruin/unpowered) +"j" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"s" = ( +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/template_noop) +"t" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"E" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"L" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Y" = ( +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +t +b +L +b +t +"} +(2,1,1) = {" +t +b +b +b +t +"} +(3,1,1) = {" +t +f +f +f +t +"} +(4,1,1) = {" +Y +s +Y +s +Y +"} +(5,1,1) = {" +Y +s +Y +s +Y +"} +(6,1,1) = {" +Y +s +Y +s +Y +"} +(7,1,1) = {" +t +f +f +f +t +"} +(8,1,1) = {" +t +E +E +E +t +"} +(9,1,1) = {" +t +t +j +t +t +"} diff --git a/_maps/RuinGeneration/9x5_hallwaymaints.dmm b/_maps/RuinGeneration/9x5_hallwaymaints.dmm new file mode 100644 index 0000000000000..7d8318500c2f6 --- /dev/null +++ b/_maps/RuinGeneration/9x5_hallwaymaints.dmm @@ -0,0 +1,139 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"c" = ( +/obj/structure/closet/firecloset/full, +/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/ruin/unpowered) +"d" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"e" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/ruin/unpowered) +"v" = ( +/obj/structure/reagent_dispensers/plumbed, +/turf/open/floor/plating, +/area/ruin/unpowered) +"y" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"B" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"I" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"K" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"P" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"R" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plating, +/area/ruin/unpowered) +"S" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"W" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/ruin/unpowered) + +(1,1,1) = {" +B +B +B +B +B +"} +(2,1,1) = {" +B +W +e +v +B +"} +(3,1,1) = {" +I +a +a +a +R +"} +(4,1,1) = {" +B +B +B +B +B +"} +(5,1,1) = {" +B +y +K +c +B +"} +(6,1,1) = {" +P +P +P +P +P +"} +(7,1,1) = {" +d +P +P +P +S +"} +(8,1,1) = {" +P +P +P +P +P +"} +(9,1,1) = {" +B +B +B +B +B +"} diff --git a/_maps/RuinGeneration/9x5_maintroom.dmm b/_maps/RuinGeneration/9x5_maintroom.dmm new file mode 100644 index 0000000000000..f62070709aac2 --- /dev/null +++ b/_maps/RuinGeneration/9x5_maintroom.dmm @@ -0,0 +1,94 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"w" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/turf/open/floor/plating, +/area/ruin/unpowered) +"y" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"L" = ( +/obj/effect/spawner/room/fivexthree, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Q" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"S" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Z" = ( +/turf/closed/wall, +/area/ruin/unpowered) + +(1,1,1) = {" +Z +a +Q +a +Z +"} +(2,1,1) = {" +Z +Z +w +Z +Z +"} +(3,1,1) = {" +Z +y +y +L +Z +"} +(4,1,1) = {" +Z +y +y +y +Z +"} +(5,1,1) = {" +Z +y +y +y +Z +"} +(6,1,1) = {" +Z +y +y +y +Z +"} +(7,1,1) = {" +Z +y +y +y +Z +"} +(8,1,1) = {" +Z +Z +w +Z +Z +"} +(9,1,1) = {" +Z +a +S +a +Z +"} diff --git a/_maps/RuinGeneration/9x5_morgue.dmm b/_maps/RuinGeneration/9x5_morgue.dmm new file mode 100644 index 0000000000000..fc34a93e26a3c --- /dev/null +++ b/_maps/RuinGeneration/9x5_morgue.dmm @@ -0,0 +1,152 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"k" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"m" = ( +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"o" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"q" = ( +/obj/effect/spawner/lootdrop/ruinloot/basic, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"r" = ( +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"s" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"B" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"H" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"I" = ( +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"J" = ( +/obj/effect/spawner/lootdrop/ruinloot/medical, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"O" = ( +/obj/effect/mapping_helpers/dead_body_placer{ + bodycount = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) + +(1,1,1) = {" +o +o +b +o +o +"} +(2,1,1) = {" +o +s +s +s +o +"} +(3,1,1) = {" +o +m +O +B +o +"} +(4,1,1) = {" +o +r +s +V +o +"} +(5,1,1) = {" +o +I +q +H +o +"} +(6,1,1) = {" +o +s +s +J +o +"} +(7,1,1) = {" +o +s +O +s +o +"} +(8,1,1) = {" +o +k +k +k +o +"} +(9,1,1) = {" +o +o +o +o +o +"} diff --git a/_maps/RuinGeneration/9x9_checkpoint.dmm b/_maps/RuinGeneration/9x9_checkpoint.dmm new file mode 100644 index 0000000000000..d6cc7716d301a --- /dev/null +++ b/_maps/RuinGeneration/9x9_checkpoint.dmm @@ -0,0 +1,261 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/trimline/red/filled/warning, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"b" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/sign/departments/minsky/security/security{ + pixel_y = 32 + }, +/obj/machinery/recharger, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"c" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/spawner/lootdrop/techstorage/security, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"e" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"i" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"n" = ( +/obj/structure/sign/warning/radiation{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"s" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"t" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/spawner/lootdrop/snowdin/dungeonlite, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"u" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/unpowered) +"w" = ( +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"x" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"z" = ( +/obj/machinery/computer{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/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/ruin/unpowered) +"B" = ( +/obj/effect/turf_decal/trimline/red/filled/warning, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"C" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"D" = ( +/obj/structure/closet/radiation, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"K" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"N" = ( +/obj/machinery/computer{ + 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/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"S" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"T" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"U" = ( +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered) +"X" = ( +/obj/effect/turf_decal/trimline/red/filled/corner, +/turf/open/floor/plasteel, +/area/ruin/unpowered) + +(1,1,1) = {" +C +C +C +C +s +s +T +s +s +"} +(2,1,1) = {" +C +b +N +N +s +D +w +w +s +"} +(3,1,1) = {" +C +K +x +K +s +n +w +w +s +"} +(4,1,1) = {" +C +i +S +i +u +w +w +w +s +"} +(5,1,1) = {" +U +i +X +e +u +w +w +w +s +"} +(6,1,1) = {" +C +i +B +z +u +w +w +w +s +"} +(7,1,1) = {" +C +i +a +c +s +n +w +w +s +"} +(8,1,1) = {" +C +i +B +t +s +D +w +w +s +"} +(9,1,1) = {" +C +C +C +C +s +s +V +s +s +"} diff --git a/_maps/RuinGeneration/9x9_chemlab.dmm b/_maps/RuinGeneration/9x9_chemlab.dmm new file mode 100644 index 0000000000000..05dad6e0b719e --- /dev/null +++ b/_maps/RuinGeneration/9x9_chemlab.dmm @@ -0,0 +1,495 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/ruin) +"b" = ( +/turf/open/floor/plasteel, +/area/ruin) +"c" = ( +/obj/structure/table/glass, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel/white, +/area/ruin) +"d" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/chem_heater, +/turf/open/floor/plasteel/white, +/area/ruin) +"e" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/storage/box/beakers, +/obj/item/storage/box/medsprays, +/obj/item/reagent_containers/medspray, +/obj/item/reagent_containers/medspray, +/turf/open/floor/plasteel/white, +/area/ruin) +"f" = ( +/obj/effect/landmark/start/medical_doctor, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"g" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/landmark/start/chemist, +/turf/open/floor/plasteel/white, +/area/ruin) +"i" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"j" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_x = -1; + pixel_y = 7 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"k" = ( +/turf/open/floor/plasteel/white, +/area/ruin) +"m" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"n" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin) +"p" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"q" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/chem_dispenser{ + layer = 2.7 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"s" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin) +"t" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/syringe{ + pixel_x = 1; + pixel_y = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"u" = ( +/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/ruin) +"v" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin) +"w" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/closet/secure_closet/chemical, +/turf/open/floor/plasteel/white, +/area/ruin) +"x" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/bottle/charcoal{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bottle/epinephrine{ + pixel_x = -2; + pixel_y = 1 + }, +/obj/item/storage/pill_bottle, +/obj/item/storage/pill_bottle, +/obj/item/storage/pill_bottle, +/obj/item/reagent_containers/syringe, +/turf/open/floor/plasteel/white, +/area/ruin) +"y" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"z" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Chemistry Desk"; + req_access_txt = "5; 33" + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"A" = ( +/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/ruin) +"C" = ( +/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/ruin) +"D" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/chem_master, +/turf/open/floor/plasteel/white, +/area/ruin) +"E" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"F" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"G" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"I" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"J" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/storage/box/beakers, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/syringe, +/turf/open/floor/plasteel/white, +/area/ruin) +"K" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry Lab"; + req_access_txt = "5; 33" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"L" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/ruin) +"M" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/vending/wardrobe/chem_wardrobe, +/turf/open/floor/plasteel/white, +/area/ruin) +"N" = ( +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/white, +/area/ruin) +"O" = ( +/turf/closed/wall, +/area/ruin) +"T" = ( +/obj/machinery/smartfridge/chemistry/preloaded, +/turf/closed/wall, +/area/ruin) +"U" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"V" = ( +/obj/effect/abstract/doorway_marker{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"X" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/rack, +/obj/item/construction/plumbing, +/turf/open/floor/plasteel/white, +/area/ruin) +"Y" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/book/manual/wiki/grenades{ + pixel_y = 3 + }, +/turf/open/floor/plasteel/white, +/area/ruin) +"Z" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/table/glass, +/obj/effect/spawner/lootdrop/snowdin/dungeonlite, +/turf/open/floor/plasteel/white, +/area/ruin) + +(1,1,1) = {" +O +O +O +O +O +b +v +b +O +"} +(2,1,1) = {" +O +Y +c +Z +O +u +f +C +b +"} +(3,1,1) = {" +O +U +k +p +O +y +N +F +n +"} +(4,1,1) = {" +O +U +k +a +K +i +m +A +b +"} +(5,1,1) = {" +O +j +k +I +O +s +z +T +O +"} +(6,1,1) = {" +O +t +k +G +x +q +g +J +O +"} +(7,1,1) = {" +O +M +k +k +k +k +k +D +O +"} +(8,1,1) = {" +O +w +L +e +X +E +L +d +O +"} +(9,1,1) = {" +O +O +V +O +O +O +O +O +O +"} diff --git a/_maps/RuinGeneration/9x9_elevator.dmm b/_maps/RuinGeneration/9x9_elevator.dmm new file mode 100644 index 0000000000000..7841166ec06e8 --- /dev/null +++ b/_maps/RuinGeneration/9x9_elevator.dmm @@ -0,0 +1,253 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/obj/machinery/computer/turbolift, +/turf/open/floor/carpet/red, +/area/ruin/unpowered) +"f" = ( +/obj/effect/mob_spawn/human/corpse/assistant, +/turf/open/floor/carpet/red, +/area/ruin/unpowered) +"g" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"l" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"o" = ( +/obj/machinery/door/airlock/turbolift, +/turf/open/floor/plating, +/area/ruin/unpowered) +"q" = ( +/obj/effect/abstract/open_area_marker{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"s" = ( +/turf/open/floor/carpet/red, +/area/ruin/unpowered) +"t" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"C" = ( +/obj/effect/abstract/open_area_marker, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"G" = ( +/obj/machinery/turbolift_button{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/obj/effect/abstract/open_area_marker{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"W" = ( +/obj/effect/abstract/open_area_marker{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Z" = ( +/obj/machinery/food_cart, +/turf/open/floor/carpet/red, +/area/ruin/unpowered) + +(1,1,1) = {" +g +g +g +g +g +t +V +t +g +g +g +g +g +"} +(2,1,1) = {" +g +t +t +t +t +t +t +t +t +t +t +t +g +"} +(3,1,1) = {" +g +t +t +t +t +t +t +t +t +t +t +t +g +"} +(4,1,1) = {" +g +t +t +t +t +t +t +t +t +t +t +t +g +"} +(5,1,1) = {" +g +t +t +t +l +l +l +l +l +G +t +t +g +"} +(6,1,1) = {" +t +t +t +t +l +Z +f +s +o +t +t +t +t +"} +(7,1,1) = {" +W +t +t +t +l +b +s +s +o +t +t +t +C +"} +(8,1,1) = {" +t +t +t +t +l +s +s +s +o +t +t +t +t +"} +(9,1,1) = {" +g +t +t +t +l +l +l +l +l +t +t +t +g +"} +(10,1,1) = {" +g +t +t +t +t +t +t +t +t +t +t +t +g +"} +(11,1,1) = {" +g +t +t +t +t +t +t +t +t +t +t +t +g +"} +(12,1,1) = {" +g +t +t +t +t +t +t +t +t +t +t +t +g +"} +(13,1,1) = {" +g +g +g +g +g +t +q +t +g +g +g +g +g +"} diff --git a/_maps/RuinGeneration/9x9_genetics.dmm b/_maps/RuinGeneration/9x9_genetics.dmm new file mode 100644 index 0000000000000..eca187fc76df0 --- /dev/null +++ b/_maps/RuinGeneration/9x9_genetics.dmm @@ -0,0 +1,420 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/sink{ + dir = 4; + pixel_x = 12 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"c" = ( +/obj/machinery/door/window/westright{ + dir = 1; + name = "Monkey Pen"; + pixel_y = 2 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"d" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"f" = ( +/obj/machinery/vending/medical, +/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, +/area/ruin/unpowered) +"h" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"i" = ( +/obj/structure/table/glass, +/obj/item/storage/pill_bottle/mutadone{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/item/flashlight/pen{ + pixel_x = 1; + pixel_y = 1 + }, +/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/ruin/unpowered) +"l" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/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/ruin/unpowered) +"p" = ( +/obj/structure/rack, +/obj/item/storage/box/rxglasses{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/monkeycubes, +/obj/effect/spawner/lootdrop/ruinloot/medical, +/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, +/area/ruin/unpowered) +"q" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"s" = ( +/obj/machinery/door/window/westleft{ + dir = 1; + name = "Monkey Pen"; + pixel_y = 2 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"t" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"u" = ( +/obj/structure/chair/office/light, +/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/white, +/area/ruin/unpowered) +"v" = ( +/obj/machinery/dna_scannernew, +/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/ruin/unpowered) +"w" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"x" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/item/weldingtool, +/turf/open/floor/plating, +/area/ruin/unpowered) +"B" = ( +/obj/structure/table/glass, +/obj/item/storage/box/disks{ + pixel_y = 5 + }, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/gloves/color/latex, +/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/ruin/unpowered) +"C" = ( +/obj/structure/bed/roller, +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"D" = ( +/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/white, +/area/ruin/unpowered) +"E" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"F" = ( +/obj/effect/abstract/doorway_marker, +/turf/open/floor/plating, +/area/ruin/unpowered) +"H" = ( +/obj/structure/table/glass, +/obj/effect/spawner/lootdrop/ruinloot/medical, +/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/ruin/unpowered) +"I" = ( +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"J" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/structure/bed/roller, +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"K" = ( +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"L" = ( +/obj/effect/abstract/doorway_marker{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"M" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 1 + }, +/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/ruin/unpowered) +"N" = ( +/obj/effect/spawner/lootdrop/ruinloot/security, +/turf/open/floor/plasteel/freezer, +/area/ruin/unpowered) +"O" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"P" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"Q" = ( +/obj/effect/abstract/doorway_marker{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"T" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"V" = ( +/obj/machinery/computer/scan_consolenew, +/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/ruin/unpowered) +"W" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered) +"X" = ( +/obj/machinery/vending/wardrobe/gene_wardrobe, +/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, +/area/ruin/unpowered) + +(1,1,1) = {" +q +q +q +q +q +q +Q +q +q +"} +(2,1,1) = {" +q +H +i +B +H +q +O +O +q +"} +(3,1,1) = {" +q +V +l +u +M +q +x +O +F +"} +(4,1,1) = {" +q +v +E +T +v +q +q +q +q +"} +(5,1,1) = {" +q +D +w +t +W +W +J +C +q +"} +(6,1,1) = {" +q +E +d +d +d +d +s +N +q +"} +(7,1,1) = {" +L +I +t +t +t +I +c +K +q +"} +(8,1,1) = {" +q +f +X +p +a +P +h +K +q +"} +(9,1,1) = {" +q +q +q +q +q +q +q +q +q +"} diff --git a/_maps/RuinGeneration/9x9_toxinstorage.dmm b/_maps/RuinGeneration/9x9_toxinstorage.dmm new file mode 100644 index 0000000000000..fae21f8e09b05 --- /dev/null +++ b/_maps/RuinGeneration/9x9_toxinstorage.dmm @@ -0,0 +1,229 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"d" = ( +/obj/machinery/portable_atmospherics/scrubber/huge, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"e" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"i" = ( +/obj/machinery/door/airlock/highsecurity{ + req_access_txt = "200" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"k" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"l" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"p" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"q" = ( +/obj/machinery/portable_atmospherics/scrubber/huge, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"r" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"t" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"v" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"z" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"C" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"D" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"F" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"I" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"K" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/bot, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"N" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/pump{ + name = "Lil Pump" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"O" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"Q" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"R" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"T" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"U" = ( +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/ruin/unpowered) +"V" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) + +(1,1,1) = {" +V +V +V +V +V +V +V +V +V +"} +(2,1,1) = {" +V +k +I +N +U +z +z +e +V +"} +(3,1,1) = {" +i +k +t +v +U +z +z +p +V +"} +(4,1,1) = {" +V +a +O +O +O +O +O +O +V +"} +(5,1,1) = {" +V +Q +Q +Q +Q +Q +Q +Q +V +"} +(6,1,1) = {" +V +D +R +r +r +r +R +R +V +"} +(7,1,1) = {" +V +k +t +d +F +C +T +T +V +"} +(8,1,1) = {" +V +k +I +q +l +C +C +K +V +"} +(9,1,1) = {" +V +V +V +V +V +V +V +V +V +"} diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index aa7e3beaee7f3..61a4a6979021f 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -6,14 +6,14 @@ #ifdef ALL_MAPS #include "map_files\Mining\Lavaland.dmm" #include "map_files\debug\runtimestation.dmm" + #include "map_files\CorgStation\CorgStation.dmm" #include "map_files\Deltastation\DeltaStation2.dmm" #include "map_files\MetaStation\MetaStation.dmm" #include "map_files\PubbyStation\PubbyStation.dmm" #include "map_files\BoxStation\BoxStation.dmm" - #include "map_files\Donutstation\Donutstation.dmm" #include "map_files\KiloStation\KiloStation.dmm" - #ifdef TRAVISBUILDING + #ifdef CIBUILDING #include "templates.dm" #endif #endif diff --git a/_maps/boxstation.json b/_maps/boxstation.json index 143fcae5bc6f9..3c71c654faa72 100644 --- a/_maps/boxstation.json +++ b/_maps/boxstation.json @@ -1,11 +1,11 @@ -{ - "map_name": "Box Station", - "map_path": "map_files/BoxStation", - "map_file": "BoxStation.dmm", - "shuttles": { - "cargo": "cargo_box", - "ferry": "ferry_fancy", - "whiteship": "whiteship_box", - "emergency": "emergency_box" - } -} +{ + "map_name": "Box Station", + "map_path": "map_files/BoxStation", + "map_file": "BoxStation.dmm", + "shuttles": { + "cargo": "cargo_box", + "ferry": "ferry_fancy", + "whiteship": "whiteship_box", + "emergency": "emergency_box" + } +} diff --git a/_maps/corgstation.json b/_maps/corgstation.json new file mode 100644 index 0000000000000..2dc7e5d371eb0 --- /dev/null +++ b/_maps/corgstation.json @@ -0,0 +1,13 @@ +{ + "map_name": "Corg Station", + "map_path": "map_files/CorgStation", + "map_file": "CorgStation.dmm", + "shuttles": { + "cargo": "cargo_corg", + "ferry": "ferry_fancy", + "whiteship": "whiteship_box", + "emergency": "emergency_corg" + }, + "allow_night_lighting": 0, + "traits": [{"Up" : 1, "Linkage": "Self"}, {"Down": -1, "Baseturf" : "/turf/open/openspace", "Linkage": "Self"}] +} diff --git a/_maps/donutstation.json b/_maps/donutstation.json deleted file mode 100644 index 1f275b14e3ade..0000000000000 --- a/_maps/donutstation.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "map_name": "Donutstation", - "map_path": "map_files/Donutstation", - "map_file": "Donutstation.dmm", - "shuttles": { - "cargo": "cargo_box", - "ferry": "ferry_fancy", - "whiteship": "whiteship_box", - "emergency": "emergency_donut" - } -} diff --git a/_maps/holodeck/animeschool.dmm b/_maps/holodeck/animeschool.dmm new file mode 100644 index 0000000000000..05c9b1ad3d54a --- /dev/null +++ b/_maps/holodeck/animeschool.dmm @@ -0,0 +1,177 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor, +/area/template_noop) +"j" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"n" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/obj/item/clothing/under/costume/schoolgirl, +/obj/item/toy/katana, +/turf/open/floor/holofloor, +/area/template_noop) +"s" = ( +/obj/structure/table/wood, +/obj/item/toy/crayon/white, +/turf/open/floor/holofloor, +/area/template_noop) +"x" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/obj/item/clothing/under/costume/schoolgirl/orange, +/turf/open/floor/holofloor, +/area/template_noop) +"E" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/apple, +/turf/open/floor/holofloor, +/area/template_noop) +"H" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/obj/item/clothing/under/costume/schoolgirl, +/turf/open/floor/holofloor, +/area/template_noop) +"R" = ( +/obj/structure/chair{ + pixel_y = -2 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"S" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/obj/item/clothing/under/costume/schoolgirl/green, +/turf/open/floor/holofloor, +/area/template_noop) +"T" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/obj/item/clothing/under/costume/schoolgirl/red, +/turf/open/floor/holofloor, +/area/template_noop) +"Y" = ( +/obj/structure/table/wood, +/obj/item/folder, +/obj/item/melee/classic_baton/telescopic, +/turf/open/floor/holofloor, +/area/template_noop) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +S +j +n +j +H +j +a +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +Y +a +H +j +x +j +T +j +a +"} +(5,1,1) = {" +R +s +a +a +a +a +a +a +a +a +"} +(6,1,1) = {" +a +E +a +S +j +T +j +H +j +a +"} +(7,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(8,1,1) = {" +a +a +a +S +j +S +j +x +j +a +"} +(9,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/holodeck/anthophillia.dmm b/_maps/holodeck/anthophillia.dmm new file mode 100644 index 0000000000000..c50ff32ebced3 --- /dev/null +++ b/_maps/holodeck/anthophillia.dmm @@ -0,0 +1,130 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/holodeck_effect/mobspawner/bee, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"v" = ( +/obj/effect/holodeck_effect/mobspawner/bee, +/obj/effect/decal/remains/human, +/obj/item/clothing/suit/beekeeper_suit, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"U" = ( +/obj/effect/holodeck_effect/mobspawner/bee, +/obj/item/clothing/head/beekeeper_head, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"W" = ( +/obj/effect/holodeck_effect/mobspawner/bee, +/obj/item/melee/flyswatter, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(5,1,1) = {" +a +a +a +a +U +v +a +a +a +a +"} +(6,1,1) = {" +a +a +a +a +a +W +a +a +a +a +"} +(7,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(8,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(9,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/holodeck/basketball.dmm b/_maps/holodeck/basketball.dmm new file mode 100644 index 0000000000000..73e97ab3f2098 --- /dev/null +++ b/_maps/holodeck/basketball.dmm @@ -0,0 +1,389 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/table, +/turf/open/floor/holofloor, +/area/template_noop) +"b" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/holohoop{ + dir = 1; + layer = 4.1 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"c" = ( +/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/holofloor, +/area/template_noop) +"e" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"f" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/holofloor, +/area/template_noop) +"h" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"i" = ( +/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/holofloor, +/area/template_noop) +"j" = ( +/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/holofloor, +/area/template_noop) +"k" = ( +/obj/structure/holohoop{ + layer = 3.9 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"l" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"m" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/holofloor, +/area/template_noop) +"n" = ( +/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/holofloor, +/area/template_noop) +"q" = ( +/obj/structure/table, +/obj/item/storage/box/cups, +/turf/open/floor/holofloor, +/area/template_noop) +"r" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"s" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"u" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"w" = ( +/turf/open/floor/holofloor, +/area/template_noop) +"x" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"y" = ( +/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/holofloor, +/area/template_noop) +"B" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"E" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/holofloor, +/area/template_noop) +"F" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/holofloor, +/area/template_noop) +"J" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/item/toy/beach_ball/holoball, +/turf/open/floor/holofloor, +/area/template_noop) +"L" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"M" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/holofloor, +/area/template_noop) +"R" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"T" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"U" = ( +/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/holofloor, +/area/template_noop) +"V" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/holofloor, +/area/template_noop) +"W" = ( +/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/holofloor, +/area/template_noop) +"Y" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"Z" = ( +/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/holofloor, +/area/template_noop) + +(1,1,1) = {" +a +s +s +w +s +s +w +s +s +a +"} +(2,1,1) = {" +q +s +s +w +s +s +w +s +s +q +"} +(3,1,1) = {" +y +r +r +r +j +h +e +e +e +F +"} +(4,1,1) = {" +n +L +l +w +x +R +w +Y +B +Z +"} +(5,1,1) = {" +k +w +l +w +x +J +w +f +w +b +"} +(6,1,1) = {" +M +m +l +w +x +R +w +f +V +c +"} +(7,1,1) = {" +i +u +u +u +U +W +V +V +V +E +"} +(8,1,1) = {" +q +T +T +w +T +T +w +T +T +q +"} +(9,1,1) = {" +a +T +T +w +T +T +w +T +T +a +"} diff --git a/_maps/holodeck/beach.dmm b/_maps/holodeck/beach.dmm new file mode 100644 index 0000000000000..75a7272ee144d --- /dev/null +++ b/_maps/holodeck/beach.dmm @@ -0,0 +1,165 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor/beach/water, +/area/template_noop) +"f" = ( +/obj/item/shovel/spade, +/turf/open/floor/holofloor/beach/coast_t, +/area/template_noop) +"g" = ( +/obj/item/toy/beach_ball, +/turf/open/floor/holofloor/beach, +/area/template_noop) +"h" = ( +/obj/item/clothing/under/color/rainbow, +/obj/item/clothing/glasses/sunglasses, +/turf/open/floor/holofloor/beach, +/area/template_noop) +"k" = ( +/turf/open/floor/holofloor/beach/coast_b, +/area/template_noop) +"q" = ( +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/holofloor/beach/coast_t, +/area/template_noop) +"t" = ( +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"H" = ( +/obj/effect/holodeck_effect/mobspawner/monkey, +/turf/open/floor/holofloor/beach, +/area/template_noop) +"J" = ( +/turf/open/floor/holofloor/beach/coast_t, +/area/template_noop) +"Q" = ( +/mob/living/simple_animal/crab{ + name = "Jon" + }, +/turf/open/floor/holofloor/beach/coast_t, +/area/template_noop) +"R" = ( +/turf/open/floor/holofloor/beach, +/area/template_noop) +"T" = ( +/obj/effect/overlay/palmtree_l, +/obj/effect/overlay/coconut, +/turf/open/floor/holofloor/beach, +/area/template_noop) +"W" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/holofloor/beach, +/area/template_noop) +"X" = ( +/obj/effect/overlay/palmtree_r, +/turf/open/floor/holofloor/beach, +/area/template_noop) + +(1,1,1) = {" +R +R +R +R +R +R +R +J +k +a +"} +(2,1,1) = {" +R +R +R +X +R +R +R +Q +k +a +"} +(3,1,1) = {" +X +H +R +R +R +t +t +J +k +a +"} +(4,1,1) = {" +R +R +R +R +h +R +R +J +k +a +"} +(5,1,1) = {" +R +R +W +R +R +t +t +J +k +a +"} +(6,1,1) = {" +R +R +R +R +X +g +R +q +k +a +"} +(7,1,1) = {" +R +T +H +R +R +R +R +f +k +a +"} +(8,1,1) = {" +W +R +R +R +H +R +R +J +k +a +"} +(9,1,1) = {" +R +R +R +R +R +R +R +J +k +a +"} diff --git a/_maps/holodeck/burntest.dmm b/_maps/holodeck/burntest.dmm new file mode 100644 index 0000000000000..4c7affa23f624 --- /dev/null +++ b/_maps/holodeck/burntest.dmm @@ -0,0 +1,117 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor/plating/burnmix, +/area/template_noop) +"l" = ( +/obj/effect/holodeck_effect/sparks, +/turf/open/floor/holofloor/plating/burnmix, +/area/template_noop) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +l +l +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +l +a +a +a +a +a +a +l +a +"} +(5,1,1) = {" +a +a +a +l +a +a +l +a +a +a +"} +(6,1,1) = {" +a +l +a +a +a +a +a +a +l +a +"} +(7,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(8,1,1) = {" +a +a +a +a +l +l +a +a +a +a +"} +(9,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/holodeck/chapelcourt.dmm b/_maps/holodeck/chapelcourt.dmm new file mode 100644 index 0000000000000..249f9b7f1daa4 --- /dev/null +++ b/_maps/holodeck/chapelcourt.dmm @@ -0,0 +1,465 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/closet/secure_closet/courtroom, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"b" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/harebell, +/obj/item/reagent_containers/food/snacks/grown/harebell, +/obj/item/reagent_containers/food/snacks/grown/harebell, +/obj/item/reagent_containers/food/snacks/grown/harebell, +/obj/item/reagent_containers/food/snacks/grown/harebell, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"c" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/holofloor/chapel/bottom_left, +/area/template_noop) +"d" = ( +/obj/structure/table/wood/fancy, +/obj/item/clothing/suit/chaplainsuit/nun, +/obj/item/clothing/head/nun_hood, +/obj/item/clothing/suit/chaplainsuit/holidaypriest, +/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/holofloor/dark, +/area/template_noop) +"f" = ( +/turf/open/floor/holofloor/dark, +/area/template_noop) +"g" = ( +/turf/open/floor/holofloor/chapel/top_left, +/area/template_noop) +"h" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"i" = ( +/turf/open/floor/holofloor/chapel/bottom_right, +/area/template_noop) +"k" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/holofloor/chapel/top_right, +/area/template_noop) +"l" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/folder/blue, +/obj/item/pen/red, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"m" = ( +/obj/item/clothing/head/chaplain/witchunter_hat, +/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/structure/table/wood/fancy, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"o" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/storage/fancy/candle_box, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"p" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"q" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/folder/red, +/obj/item/pen/red, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"r" = ( +/obj/item/gavelblock, +/obj/item/gavelhammer, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"s" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"u" = ( +/obj/structure/table/wood/fancy, +/obj/item/storage/book/bible, +/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/holofloor/dark, +/area/template_noop) +"w" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"x" = ( +/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/holofloor/dark, +/area/template_noop) +"y" = ( +/obj/item/toy/figure/chaplain, +/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/structure/table/wood/fancy, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"A" = ( +/turf/open/floor/holofloor/chapel/bottom_left, +/area/template_noop) +"C" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/holofloor/chapel, +/area/template_noop) +"E" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/holofloor/chapel/bottom_right, +/area/template_noop) +"F" = ( +/obj/item/clothing/suit/judgerobe, +/obj/item/clothing/head/powdered_wig, +/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/structure/table/wood/fancy, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"H" = ( +/obj/structure/table/wood/fancy, +/obj/item/book/manual/wiki/security_space_law, +/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/holofloor/dark, +/area/template_noop) +"I" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"K" = ( +/turf/open/floor/holofloor/chapel/top_right, +/area/template_noop) +"L" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"N" = ( +/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/holofloor/dark, +/area/template_noop) +"O" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/paper_bin, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"Q" = ( +/obj/structure/chair, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"S" = ( +/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/holofloor/dark, +/area/template_noop) +"T" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/holofloor/chapel/top_left, +/area/template_noop) +"U" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/hand_labeler, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"W" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"X" = ( +/obj/item/clothing/suit/chaplainsuit/bishoprobe, +/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/structure/table/wood/fancy, +/turf/open/floor/holofloor/dark, +/area/template_noop) + +(1,1,1) = {" +x +g +A +g +c +T +A +L +L +a +"} +(2,1,1) = {" +y +K +i +K +C +k +i +L +L +O +"} +(3,1,1) = {" +F +I +N +g +c +T +A +L +L +q +"} +(4,1,1) = {" +d +f +p +K +C +k +i +L +L +l +"} +(5,1,1) = {" +u +Q +r +S +S +S +S +s +s +h +"} +(6,1,1) = {" +H +f +p +g +c +T +A +L +L +b +"} +(7,1,1) = {" +m +w +W +K +E +k +i +L +L +o +"} +(8,1,1) = {" +X +g +A +g +c +T +A +L +L +U +"} +(9,1,1) = {" +x +K +i +K +E +k +i +L +L +a +"} diff --git a/_maps/holodeck/dodgeball.dmm b/_maps/holodeck/dodgeball.dmm new file mode 100644 index 0000000000000..3730d3ccae42b --- /dev/null +++ b/_maps/holodeck/dodgeball.dmm @@ -0,0 +1,297 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/holofloor, +/area/template_noop) +"b" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/item/toy/beach_ball/holoball/dodgeball, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"c" = ( +/obj/structure/window, +/obj/item/toy/beach_ball/holoball/dodgeball, +/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/holofloor, +/area/template_noop) +"f" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"h" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/holofloor, +/area/template_noop) +"n" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/holofloor, +/area/template_noop) +"o" = ( +/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/holofloor, +/area/template_noop) +"p" = ( +/obj/structure/window, +/obj/item/toy/beach_ball/holoball/dodgeball, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"q" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/item/toy/beach_ball/holoball/dodgeball, +/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/holofloor, +/area/template_noop) +"t" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/holofloor, +/area/template_noop) +"y" = ( +/obj/structure/window, +/obj/item/toy/beach_ball/holoball/dodgeball, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"C" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"F" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"G" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"J" = ( +/obj/machinery/readybutton, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/holofloor, +/area/template_noop) +"K" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"V" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/item/toy/beach_ball/holoball/dodgeball, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"W" = ( +/obj/machinery/readybutton, +/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/holofloor, +/area/template_noop) +"X" = ( +/turf/open/floor/holofloor, +/area/template_noop) + +(1,1,1) = {" +W +G +G +G +b +p +F +F +F +a +"} +(2,1,1) = {" +f +X +t +X +V +y +X +C +X +n +"} +(3,1,1) = {" +f +X +t +X +V +y +X +C +X +n +"} +(4,1,1) = {" +f +X +t +X +V +y +X +C +X +n +"} +(5,1,1) = {" +f +X +t +X +V +y +X +C +X +n +"} +(6,1,1) = {" +f +X +t +X +V +y +X +C +X +n +"} +(7,1,1) = {" +f +X +t +X +V +y +X +C +X +n +"} +(8,1,1) = {" +f +X +t +X +V +y +X +C +X +n +"} +(9,1,1) = {" +o +K +K +K +q +c +h +h +h +J +"} diff --git a/_maps/holodeck/emptycourt.dmm b/_maps/holodeck/emptycourt.dmm new file mode 100644 index 0000000000000..9b7d54365e416 --- /dev/null +++ b/_maps/holodeck/emptycourt.dmm @@ -0,0 +1,203 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"e" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"h" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"j" = ( +/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/holofloor, +/area/template_noop) +"s" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"y" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"D" = ( +/turf/open/floor/holofloor, +/area/template_noop) +"E" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"F" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"L" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"X" = ( +/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/holofloor, +/area/template_noop) + +(1,1,1) = {" +X +L +L +L +L +y +y +y +y +a +"} +(2,1,1) = {" +e +D +D +D +D +D +D +D +D +h +"} +(3,1,1) = {" +e +D +D +D +D +D +D +D +D +h +"} +(4,1,1) = {" +e +D +D +D +D +D +D +D +D +h +"} +(5,1,1) = {" +e +D +D +D +D +D +D +D +D +h +"} +(6,1,1) = {" +e +D +D +D +D +D +D +D +D +h +"} +(7,1,1) = {" +e +D +D +D +D +D +D +D +D +h +"} +(8,1,1) = {" +e +D +D +D +D +D +D +D +D +h +"} +(9,1,1) = {" +j +F +F +F +F +E +E +E +E +s +"} diff --git a/_maps/holodeck/firingrange.dmm b/_maps/holodeck/firingrange.dmm new file mode 100644 index 0000000000000..9c0a07f313e5b --- /dev/null +++ b/_maps/holodeck/firingrange.dmm @@ -0,0 +1,346 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/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/holofloor, +/area/template_noop) +"b" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/holofloor, +/area/template_noop) +"c" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"j" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/holofloor, +/area/template_noop) +"k" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"n" = ( +/obj/item/target, +/obj/item/target/clown, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/holofloor, +/area/template_noop) +"o" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/holofloor, +/area/template_noop) +"s" = ( +/obj/item/target, +/obj/item/target/syndicate, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/holofloor, +/area/template_noop) +"t" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"y" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/holofloor{ + dir = 8; + icon_state = "white" + }, +/area/template_noop) +"z" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"E" = ( +/obj/structure/table/reinforced, +/obj/machinery/magnetic_controller{ + autolink = 1 + }, +/obj/item/paper/guides/jobs/security/range, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/holofloor, +/area/template_noop) +"F" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/holofloor{ + dir = 10; + icon_state = "white" + }, +/area/template_noop) +"G" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"H" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/holofloor, +/area/template_noop) +"J" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"K" = ( +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"L" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"N" = ( +/obj/structure/rack, +/obj/item/gun/energy/laser/practice, +/obj/item/clothing/ears/earmuffs, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/holofloor, +/area/template_noop) +"P" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"Q" = ( +/turf/open/floor/holofloor, +/area/template_noop) +"T" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"U" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Y" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"D" = ( +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/obj/structure/target_stake, +/obj/machinery/magnetic_module, +/area/template_noop) +"Z" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/holofloor, +/area/template_noop) + +(1,1,1) = {" +J +J +J +J +J +J +J +J +J +a +"} +(2,1,1) = {" +Q +Q +Q +Q +Q +Q +Q +Q +Q +o +"} +(3,1,1) = {" +b +b +b +b +b +b +b +b +T +n +"} +(4,1,1) = {" +k +y +F +L +L +L +L +G +Z +N +"} +(5,1,1) = {" +Y +D +K +Q +Q +Q +Q +Q +Z +N +"} +(6,1,1) = {" +t +U +U +c +c +c +c +E +Z +N +"} +(7,1,1) = {" +P +P +P +P +P +P +P +P +z +s +"} +(8,1,1) = {" +Q +Q +Q +Q +Q +Q +Q +Q +Q +o +"} +(9,1,1) = {" +H +H +H +H +H +H +H +H +H +j +"} diff --git a/_maps/holodeck/gamer.dmm b/_maps/holodeck/gamer.dmm new file mode 100644 index 0000000000000..570992d243790 --- /dev/null +++ b/_maps/holodeck/gamer.dmm @@ -0,0 +1,129 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"d" = ( +/obj/machinery/computer/arcade/battle, +/turf/open/floor/holofloor/basalt, +/area/template_noop) +"x" = ( +/obj/machinery/computer/arcade, +/turf/open/floor/holofloor/basalt, +/area/template_noop) +"C" = ( +/obj/machinery/computer/arcade/orion_trail, +/turf/open/floor/holofloor/basalt, +/area/template_noop) +"D" = ( +/obj/machinery/computer/arcade/amputation, +/turf/open/floor/holofloor/basalt, +/area/template_noop) +"I" = ( +/turf/open/floor/holofloor/basalt, +/area/template_noop) + +(1,1,1) = {" +I +I +I +I +I +I +I +I +I +I +"} +(2,1,1) = {" +I +I +I +x +I +I +x +I +I +I +"} +(3,1,1) = {" +I +I +I +D +I +I +D +I +I +I +"} +(4,1,1) = {" +I +I +I +I +I +I +I +I +I +I +"} +(5,1,1) = {" +I +I +I +I +I +I +I +I +I +I +"} +(6,1,1) = {" +I +I +I +I +I +I +I +I +I +I +"} +(7,1,1) = {" +I +I +I +d +I +I +d +I +I +I +"} +(8,1,1) = {" +I +I +I +C +I +I +C +I +I +I +"} +(9,1,1) = {" +I +I +I +I +I +I +I +I +I +I +"} diff --git a/_maps/holodeck/holdoutbunker.dmm b/_maps/holodeck/holdoutbunker.dmm new file mode 100644 index 0000000000000..39e68f17ee525 --- /dev/null +++ b/_maps/holodeck/holdoutbunker.dmm @@ -0,0 +1,164 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/foamedmetal, +/obj/structure/window{ + dir = 8 + }, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"b" = ( +/obj/structure/foamedmetal, +/obj/structure/window{ + dir = 4 + }, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"l" = ( +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"t" = ( +/obj/structure/foamedmetal, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"u" = ( +/obj/structure/table, +/obj/machinery/recharger, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"v" = ( +/obj/structure/table, +/obj/item/stack/medical/ointment{ + heal_burn = 10 + }, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"x" = ( +/obj/structure/foamedmetal, +/obj/structure/window{ + dir = 4 + }, +/obj/structure/bookcase/random/fiction, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"I" = ( +/obj/structure/table, +/obj/item/gun/energy/laser, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"J" = ( +/obj/structure/table, +/obj/item/stack/medical/bruise_pack{ + heal_brute = 10 + }, +/obj/item/soap, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +b +x +b +b +b +b +b +b +b +b +"} +(3,1,1) = {" +t +t +t +t +t +t +t +t +t +t +"} +(4,1,1) = {" +l +l +l +l +l +l +l +l +l +l +"} +(5,1,1) = {" +l +l +l +l +l +l +l +l +l +l +"} +(6,1,1) = {" +l +l +l +l +l +l +l +l +l +l +"} +(7,1,1) = {" +l +l +l +l +l +l +l +l +l +l +"} +(8,1,1) = {" +l +l +l +l +l +l +l +l +l +l +"} +(9,1,1) = {" +v +u +I +l +I +I +l +I +u +J +"} diff --git a/_maps/holodeck/kobayashi.dmm b/_maps/holodeck/kobayashi.dmm new file mode 100644 index 0000000000000..68405bb572179 --- /dev/null +++ b/_maps/holodeck/kobayashi.dmm @@ -0,0 +1,367 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor/plating, +/area/template_noop) +"c" = ( +/obj/machinery/button/massdriver/indestructible{ + id = "trektorpedo1"; + layer = 3.9; + name = "photon torpedo button"; + pixel_x = -16; + pixel_y = -5 + }, +/obj/machinery/button/massdriver/indestructible{ + id = "trektorpedo2"; + layer = 3.9; + name = "photon torpedo button"; + pixel_x = 16; + pixel_y = -5 + }, +/obj/machinery/computer/arcade/orion_trail/kobayashi, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"d" = ( +/obj/machinery/computer/station_alert{ + dir = 8 + }, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"f" = ( +/obj/machinery/door/window/westleft{ + dir = 2 + }, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"j" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"k" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"l" = ( +/obj/structure/window/reinforced, +/obj/machinery/computer/station_alert{ + dir = 4 + }, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"m" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"o" = ( +/obj/structure/chair/comfy/beige{ + dir = 1 + }, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"p" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/computer/arcade/orion_trail/kobayashi, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"r" = ( +/obj/structure/table, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"s" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"t" = ( +/obj/structure/table/glass, +/obj/item/gun/energy/e_gun/mini/practice_phaser, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/recharger, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"w" = ( +/obj/structure/table, +/obj/item/folder, +/obj/item/pen/blue, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"x" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/computer/arcade/orion_trail/kobayashi, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"y" = ( +/turf/open/floor/holofloor/hyperspace, +/area/template_noop) +"z" = ( +/obj/machinery/computer/atmos_alert{ + dir = 8 + }, +/obj/structure/window/reinforced, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"A" = ( +/obj/structure/window/reinforced, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"B" = ( +/obj/structure/window/reinforced, +/turf/open/floor/holofloor/hyperspace, +/area/template_noop) +"C" = ( +/obj/machinery/computer/station_alert{ + dir = 4 + }, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"E" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"F" = ( +/obj/structure/rack, +/obj/item/clothing/under/trek/engsec, +/obj/item/clothing/under/trek/engsec, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4; + layer = 2.9 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"H" = ( +/obj/machinery/door/window/westleft{ + dir = 2; + icon_state = "right" + }, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"J" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4; + layer = 2.9 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"L" = ( +/obj/structure/table/glass, +/obj/item/gun/energy/e_gun/mini/practice_phaser, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"Q" = ( +/obj/structure/table, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/item/folder, +/obj/item/pen/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"T" = ( +/obj/structure/rack, +/obj/item/clothing/under/trek/medsci, +/obj/item/clothing/under/trek/medsci, +/obj/item/clothing/under/trek/command, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"V" = ( +/obj/structure/window/reinforced, +/obj/machinery/mass_driver{ + dir = 1; + id = "trektorpedo2"; + name = "photon torpedo tube" + }, +/obj/item/toy/minimeteor{ + desc = "A primitive long-range weapon, inferior to Nanotrasen's perfected bluespace artillery."; + icon = 'icons/effects/effects.dmi'; + icon_state = "impact_laser"; + name = "photon torpedo" + }, +/turf/open/floor/holofloor/hyperspace, +/area/template_noop) +"X" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"Z" = ( +/obj/structure/table, +/obj/item/folder, +/obj/item/pen, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) + +(1,1,1) = {" +y +y +B +a +C +l +a +a +a +a +"} +(2,1,1) = {" +y +y +B +a +k +k +a +a +a +a +"} +(3,1,1) = {" +y +V +t +a +a +a +a +H +m +T +"} +(4,1,1) = {" +B +p +a +a +a +a +A +w +E +s +"} +(5,1,1) = {" +B +c +j +a +a +o +A +Z +E +s +"} +(6,1,1) = {" +B +x +a +a +a +r +A +Q +E +s +"} +(7,1,1) = {" +y +V +L +a +a +a +a +f +J +F +"} +(8,1,1) = {" +y +y +B +a +X +X +a +a +a +a +"} +(9,1,1) = {" +y +y +B +a +d +z +a +a +a +a +"} diff --git a/_maps/holodeck/lounge.dmm b/_maps/holodeck/lounge.dmm new file mode 100644 index 0000000000000..2097c5c42af35 --- /dev/null +++ b/_maps/holodeck/lounge.dmm @@ -0,0 +1,419 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/table/wood/bar, +/obj/item/reagent_containers/glass/rag{ + pixel_x = 10; + pixel_y = 1 + }, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"b" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"c" = ( +/obj/machinery/door/window{ + base_state = "right"; + dir = 4; + icon_state = "right"; + layer = 3 + }, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"d" = ( +/obj/structure/table/wood/bar, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"f" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + layer = 3.3 + }, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"h" = ( +/obj/structure/table/wood, +/obj/item/clothing/mask/cigarette/pipe, +/obj/effect/holodeck_effect/random_book, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"i" = ( +/obj/structure/table/wood/bar, +/obj/item/reagent_containers/food/drinks/shaker, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"j" = ( +/obj/structure/window/reinforced{ + dir = 4; + layer = 2.9 + }, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"k" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/box/matches, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"l" = ( +/obj/structure/chair/stool/bar, +/obj/structure/window/reinforced{ + dir = 4; + layer = 2.9 + }, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"m" = ( +/obj/structure/chair/wood, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"o" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"p" = ( +/obj/structure/table/wood, +/obj/item/instrument/guitar, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"q" = ( +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"t" = ( +/obj/structure/table/wood/bar, +/obj/item/book/manual/wiki/barman_recipes, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"u" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"w" = ( +/obj/structure/table/wood, +/obj/item/instrument/saxophone, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"x" = ( +/obj/structure/table/wood, +/obj/item/instrument/violin, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"z" = ( +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"A" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"C" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"D" = ( +/obj/structure/table/wood, +/obj/item/kirbyplants{ + icon_state = "plant-05"; + pixel_y = 10 + }, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"E" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"F" = ( +/turf/open/floor/holofloor{ + icon_state = "stairs-r" + }, +/area/template_noop) +"G" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/table/wood/bar, +/obj/item/storage/box/cups, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"H" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -12 + }, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"I" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"J" = ( +/obj/structure/table/wood, +/obj/effect/holodeck_effect/random_book, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"K" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes/cigars/cohiba, +/obj/item/lighter, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"L" = ( +/turf/open/floor/holofloor{ + icon_state = "stairs-l" + }, +/area/template_noop) +"M" = ( +/obj/structure/chair/comfy/brown{ + buildstackamount = 0; + dir = 1 + }, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"N" = ( +/obj/structure/table/wood, +/obj/item/instrument/piano_synth, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"O" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_y = 4 + }, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"P" = ( +/obj/structure/table/wood/poker, +/obj/structure/table/wood/poker, +/obj/effect/holodeck_effect/cards, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"R" = ( +/obj/structure/window/reinforced, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"S" = ( +/obj/structure/table/wood/poker, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"T" = ( +/obj/structure/table/wood/poker, +/obj/item/clothing/mask/cigarette/pipe, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"U" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/pill_bottle/dice, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"V" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"Y" = ( +/obj/structure/table/wood/bar, +/obj/structure/window/reinforced{ + dir = 4; + layer = 2.9 + }, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"Z" = ( +/obj/structure/musician/piano{ + icon_state = "piano" + }, +/turf/open/floor/holofloor/carpet, +/area/template_noop) + +(1,1,1) = {" +K +z +z +z +z +z +V +t +H +a +"} +(2,1,1) = {" +f +z +z +z +z +z +V +d +z +i +"} +(3,1,1) = {" +z +u +u +z +z +j +l +Y +c +G +"} +(4,1,1) = {" +m +S +U +o +R +w +N +Z +q +x +"} +(5,1,1) = {" +m +k +S +o +z +L +q +C +q +p +"} +(6,1,1) = {" +m +P +T +o +z +F +q +q +q +M +"} +(7,1,1) = {" +z +I +I +z +R +J +q +q +q +M +"} +(8,1,1) = {" +b +z +z +z +R +D +q +q +q +M +"} +(9,1,1) = {" +A +z +z +z +R +O +q +E +E +h +"} diff --git a/_maps/holodeck/medicalsim.dmm b/_maps/holodeck/medicalsim.dmm new file mode 100644 index 0000000000000..ce775d3ec2ce6 --- /dev/null +++ b/_maps/holodeck/medicalsim.dmm @@ -0,0 +1,977 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ap" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/table, +/obj/item/reagent_containers/dropper, +/obj/item/assembly/igniter, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"aL" = ( +/obj/structure/table/glass, +/obj/item/clothing/gloves/color/latex/nitrile, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/structure/window{ + dir = 4 + }, +/obj/item/surgicaldrill, +/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/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"ba" = ( +/obj/machinery/iv_drip, +/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, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"bw" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/reagentgrinder, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"cI" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/structure/window{ + dir = 4 + }, +/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/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"cO" = ( +/obj/machinery/stasis, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/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/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"cR" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"cT" = ( +/obj/structure/table, +/obj/item/folder/white, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"dx" = ( +/obj/structure/table, +/obj/item/flashlight/lamp, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/window{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"dX" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/storage/box/masks, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"gp" = ( +/obj/structure/window, +/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/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"gr" = ( +/obj/structure/table/glass, +/obj/item/retractor, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"hK" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/storage/box/gloves{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"hQ" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/healthanalyzer, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"jr" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"kJ" = ( +/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/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"lU" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/table, +/obj/item/storage/box/syringes, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"nj" = ( +/obj/structure/window{ + dir = 1 + }, +/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/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"pe" = ( +/obj/structure/window, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"pY" = ( +/obj/machinery/computer/operating{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"qw" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"qV" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"qX" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/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/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"tI" = ( +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"uj" = ( +/obj/machinery/chem_master, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"wu" = ( +/obj/structure/filingcabinet, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"wV" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/bed/roller, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"xf" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"xz" = ( +/obj/structure/closet/wardrobe/white, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"yk" = ( +/obj/structure/window{ + dir = 8 + }, +/obj/machinery/computer/crew{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"zd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Ac" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"An" = ( +/obj/machinery/computer/operating{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"BI" = ( +/obj/structure/window{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"BS" = ( +/obj/machinery/computer/pandemic, +/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/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"BT" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Ck" = ( +/obj/machinery/shower{ + 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/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Ct" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"CQ" = ( +/obj/structure/table, +/obj/item/clothing/neck/stethoscope, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"DT" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"DW" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Ea" = ( +/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/table, +/obj/item/reagent_containers/glass/beaker, +/obj/item/reagent_containers/glass/beaker, +/obj/item/reagent_containers/glass/beaker, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Ga" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"GN" = ( +/obj/machinery/door/window/westleft{ + dir = 2 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Ig" = ( +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Ke" = ( +/obj/structure/window, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"KD" = ( +/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/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Lt" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"LW" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/kirbyplants{ + icon_state = "plant-21" + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"NV" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"PJ" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/kirbyplants{ + icon_state = "plant-08" + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Qu" = ( +/obj/structure/table/glass, +/obj/item/stack/medical/gauze, +/obj/item/cautery, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"RA" = ( +/obj/structure/window{ + dir = 8 + }, +/obj/machinery/computer/med_data{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"RJ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/table, +/obj/item/reagent_containers/glass/beaker/large, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Sb" = ( +/obj/structure/table/glass, +/obj/item/scalpel{ + pixel_y = 10 + }, +/obj/item/circular_saw, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Sj" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Tt" = ( +/obj/machinery/stasis, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"TI" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"WK" = ( +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/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/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Xm" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"XM" = ( +/obj/structure/window, +/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/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Zq" = ( +/obj/structure/table/glass, +/obj/item/surgical_drapes, +/obj/item/razor, +/obj/item/hemostat, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) + +(1,1,1) = {" +WK +Xm +DT +kJ +Ck +qV +gp +qX +qw +ba +"} +(2,1,1) = {" +Zq +tI +xf +LW +jr +NV +Ke +BT +tI +Tt +"} +(3,1,1) = {" +Sb +tI +pY +dX +jr +NV +Ke +BT +tI +Ig +"} +(4,1,1) = {" +gr +tI +An +hQ +jr +NV +GN +TI +cR +cO +"} +(5,1,1) = {" +Qu +tI +xf +hK +jr +NV +pe +yk +RA +dx +"} +(6,1,1) = {" +cI +BI +aL +wV +jr +NV +Ke +Ga +Ct +cT +"} +(7,1,1) = {" +Ea +RJ +lU +PJ +jr +NV +GN +Ga +Ga +zd +"} +(8,1,1) = {" +uj +tI +Sj +DW +jr +NV +Ke +xz +Ga +CQ +"} +(9,1,1) = {" +ap +bw +BS +nj +Lt +KD +XM +Ac +Ga +wu +"} diff --git a/_maps/holodeck/offline.dmm b/_maps/holodeck/offline.dmm new file mode 100644 index 0000000000000..962ba7b16d40f --- /dev/null +++ b/_maps/holodeck/offline.dmm @@ -0,0 +1,113 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor/plating, +/area/template_noop) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(5,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(6,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(7,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(8,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(9,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/holodeck/petpark.dmm b/_maps/holodeck/petpark.dmm new file mode 100644 index 0000000000000..598001722fc45 --- /dev/null +++ b/_maps/holodeck/petpark.dmm @@ -0,0 +1,256 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"b" = ( +/obj/structure/flora/ausbushes/fernybush, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"c" = ( +/obj/machinery/hydroponics/soil, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"f" = ( +/obj/structure/flora/ausbushes/genericbush, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"g" = ( +/obj/effect/holodeck_effect/mobspawner/pet, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"k" = ( +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"l" = ( +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"p" = ( +/obj/structure/flora/ausbushes/ywflowers, +/obj/effect/holodeck_effect/mobspawner/pet, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"q" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/holodeck_effect/mobspawner/pet, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"v" = ( +/obj/structure/flora/ausbushes/palebush, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"w" = ( +/obj/effect/holodeck_effect/mobspawner/pet, +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"y" = ( +/obj/structure/flora/ausbushes/pointybush, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"C" = ( +/obj/structure/flora/ausbushes/ywflowers, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"D" = ( +/obj/structure/flora/ausbushes/reedbush, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"G" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"H" = ( +/obj/effect/holodeck_effect/mobspawner/pet, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"I" = ( +/turf/open/floor/holofloor/grass, +/area/template_noop) +"M" = ( +/obj/structure/flora/ausbushes/sunnybush, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"N" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"R" = ( +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"S" = ( +/obj/item/trash/plate, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"U" = ( +/obj/machinery/hydroponics/soil, +/obj/item/cultivator, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"V" = ( +/obj/item/shovel/spade{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"X" = ( +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"Z" = ( +/obj/effect/holodeck_effect/mobspawner/pet, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) + +(1,1,1) = {" +g +I +I +I +f +I +I +f +I +a +"} +(2,1,1) = {" +I +f +I +v +g +I +v +H +M +I +"} +(3,1,1) = {" +M +g +R +I +k +l +I +c +c +I +"} +(4,1,1) = {" +I +l +M +I +I +G +R +U +q +I +"} +(5,1,1) = {" +y +w +N +Z +D +M +X +q +c +f +"} +(6,1,1) = {" +I +I +S +V +I +p +I +c +c +I +"} +(7,1,1) = {" +I +M +g +v +I +f +C +I +I +v +"} +(8,1,1) = {" +f +C +f +I +I +I +g +I +b +I +"} +(9,1,1) = {" +I +I +I +I +I +R +I +I +I +I +"} diff --git a/_maps/holodeck/photobooth.dmm b/_maps/holodeck/photobooth.dmm new file mode 100644 index 0000000000000..a3bf3f7c95a87 --- /dev/null +++ b/_maps/holodeck/photobooth.dmm @@ -0,0 +1,184 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor/white, +/area/template_noop) +"c" = ( +/obj/structure/dresser, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"g" = ( +/obj/structure/easel, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"r" = ( +/obj/structure/table/wood, +/obj/item/paint/anycolor{ + pixel_x = 7 + }, +/obj/item/paint/anycolor{ + pixel_x = -5 + }, +/obj/item/paint/anycolor{ + pixel_x = 7 + }, +/obj/item/paint/anycolor{ + pixel_x = 7 + }, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"t" = ( +/obj/structure/table/wood, +/obj/item/toy/crayon/spraycan{ + charges = 99999999999999999; + desc = "A metallic container containing near unlimited tasty holographic paint."; + name = "holographic spray can"; + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/toy/crayon/spraycan{ + charges = 99999999999999999; + desc = "A metallic container containing near unlimited tasty holographic paint."; + name = "holographic spray can"; + pixel_x = -5; + pixel_y = 5 + }, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"u" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"w" = ( +/obj/structure/table/wood, +/obj/item/camera{ + desc = "A holographic camera with near infinite pictures."; + name = "holographic camera"; + pictures_left = 999; + pictures_max = 999 + }, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"H" = ( +/obj/structure/table/wood, +/obj/item/storage/crayons, +/obj/item/razor, +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"L" = ( +/obj/structure/falsewall/wood, +/obj/structure/mirror, +/turf/open/floor/holofloor/carpet, +/area/template_noop) + +(1,1,1) = {" +H +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +L +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +u +a +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +r +a +a +a +a +a +a +a +a +a +"} +(5,1,1) = {" +w +a +a +a +a +a +a +a +a +a +"} +(6,1,1) = {" +t +a +a +a +a +a +a +a +a +a +"} +(7,1,1) = {" +t +a +a +a +a +a +a +a +a +a +"} +(8,1,1) = {" +g +a +a +a +a +a +a +a +a +a +"} +(9,1,1) = {" +c +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/holodeck/refuelingstation.dmm b/_maps/holodeck/refuelingstation.dmm new file mode 100644 index 0000000000000..e066ff9962299 --- /dev/null +++ b/_maps/holodeck/refuelingstation.dmm @@ -0,0 +1,121 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor/plating, +/area/template_noop) +"j" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"F" = ( +/obj/item/weldingtool, +/turf/open/floor/holofloor/plating, +/area/template_noop) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +j +j +a +j +j +a +j +j +a +"} +(5,1,1) = {" +a +j +j +F +j +j +F +j +j +a +"} +(6,1,1) = {" +a +j +j +a +j +j +a +j +j +a +"} +(7,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(8,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(9,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/holodeck/skatepark.dmm b/_maps/holodeck/skatepark.dmm new file mode 100644 index 0000000000000..5fa1491fd888c --- /dev/null +++ b/_maps/holodeck/skatepark.dmm @@ -0,0 +1,129 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor/plating, +/area/template_noop) +"l" = ( +/obj/vehicle/ridden/scooter/skateboard/pro/holodeck{ + dir = 8; + icon_state = "skateboard2" + }, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"t" = ( +/obj/structure/table, +/obj/structure/table, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"H" = ( +/obj/structure/table, +/turf/open/floor/holofloor/plating, +/area/template_noop) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +H +H +a +a +a +a +a +a +l +"} +(3,1,1) = {" +a +H +H +H +H +a +H +H +a +l +"} +(4,1,1) = {" +a +a +H +H +H +H +H +a +a +l +"} +(5,1,1) = {" +a +a +H +t +a +H +H +a +a +l +"} +(6,1,1) = {" +a +a +H +H +H +H +a +a +a +l +"} +(7,1,1) = {" +a +H +H +H +H +a +H +H +a +l +"} +(8,1,1) = {" +a +H +a +a +a +a +H +H +a +a +"} +(9,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/holodeck/spacecheckers.dmm b/_maps/holodeck/spacecheckers.dmm new file mode 100644 index 0000000000000..c59da010a2aa2 --- /dev/null +++ b/_maps/holodeck/spacecheckers.dmm @@ -0,0 +1,187 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor/plating, +/area/template_noop) +"c" = ( +/obj/item/cardboard_cutout/adaptive{ + icon_state = "cutout_greytide"; + name = "White Pawn" + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"d" = ( +/turf/open/floor/holofloor/dark, +/area/template_noop) +"g" = ( +/obj/item/cardboard_cutout/adaptive{ + icon_state = "cutout_clown"; + name = "White King" + }, +/obj/item/cardboard_cutout/adaptive{ + icon_state = "cutout_clown"; + name = "White King" + }, +/obj/item/cardboard_cutout/adaptive{ + icon_state = "cutout_clown"; + name = "White King" + }, +/obj/item/cardboard_cutout/adaptive{ + icon_state = "cutout_clown"; + name = "White King" + }, +/obj/item/cardboard_cutout/adaptive{ + icon_state = "cutout_clown"; + name = "White King" + }, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"z" = ( +/obj/item/cardboard_cutout/adaptive{ + color = "#9999BB"; + icon_state = "cutout_clown"; + name = "Black King" + }, +/obj/item/cardboard_cutout/adaptive{ + color = "#9999BB"; + icon_state = "cutout_clown"; + name = "Black King" + }, +/obj/item/cardboard_cutout/adaptive{ + color = "#9999BB"; + icon_state = "cutout_clown"; + name = "Black King" + }, +/obj/item/cardboard_cutout/adaptive{ + color = "#9999BB"; + icon_state = "cutout_clown"; + name = "Black King" + }, +/obj/item/cardboard_cutout/adaptive{ + color = "#9999BB"; + icon_state = "cutout_clown"; + name = "Black King" + }, +/turf/open/floor/holofloor/plating, +/area/template_noop) +"J" = ( +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"M" = ( +/obj/item/cardboard_cutout/adaptive{ + color = "#9999BB"; + icon_state = "cutout_greytide"; + name = "Black Pawn" + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +J +M +J +d +J +c +J +c +a +"} +(3,1,1) = {" +a +M +J +M +J +d +J +c +J +a +"} +(4,1,1) = {" +a +J +M +J +d +J +c +J +c +a +"} +(5,1,1) = {" +a +M +J +M +J +d +J +c +J +a +"} +(6,1,1) = {" +a +J +M +J +d +J +c +J +c +a +"} +(7,1,1) = {" +a +M +J +M +J +d +J +c +J +a +"} +(8,1,1) = {" +a +J +M +J +d +J +c +J +c +a +"} +(9,1,1) = {" +z +M +J +M +J +d +J +c +J +g +"} diff --git a/_maps/holodeck/spacechess.dmm b/_maps/holodeck/spacechess.dmm new file mode 100644 index 0000000000000..b143b6eac7252 --- /dev/null +++ b/_maps/holodeck/spacechess.dmm @@ -0,0 +1,221 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"b" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/bishop, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"g" = ( +/obj/item/cardboard_cutout/adaptive/chess/pawn, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"o" = ( +/obj/item/cardboard_cutout/adaptive/chess/bishop, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"q" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/rook, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"r" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/pawn, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"s" = ( +/obj/item/cardboard_cutout/adaptive/chess/rook, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"u" = ( +/obj/item/cardboard_cutout/adaptive/chess/knight, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"y" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/bishop, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"z" = ( +/obj/item/cardboard_cutout/adaptive/chess/rook, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"A" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/pawn, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"G" = ( +/obj/item/cardboard_cutout/adaptive/chess/knight, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"H" = ( +/obj/item/cardboard_cutout/adaptive/chess/king, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"L" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/knight, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"M" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/king, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"N" = ( +/obj/item/cardboard_cutout/adaptive/chess/pawn, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"O" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/knight, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Q" = ( +/turf/open/floor/holofloor/dark, +/area/template_noop) +"U" = ( +/obj/item/cardboard_cutout/adaptive/chess/bishop, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"V" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/rook, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"X" = ( +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) +"Y" = ( +/obj/item/cardboard_cutout/adaptive/chess/black/queen, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"Z" = ( +/obj/item/cardboard_cutout/adaptive/chess/queen, +/turf/open/floor/holofloor{ + icon_state = "white" + }, +/area/template_noop) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +z +N +X +Q +X +Q +A +V +a +"} +(3,1,1) = {" +a +G +g +Q +X +Q +X +r +O +a +"} +(4,1,1) = {" +a +U +N +X +Q +X +Q +A +b +a +"} +(5,1,1) = {" +a +H +g +Q +X +Q +X +r +M +a +"} +(6,1,1) = {" +a +Z +N +X +Q +X +Q +A +Y +a +"} +(7,1,1) = {" +a +o +g +Q +X +Q +X +r +y +a +"} +(8,1,1) = {" +a +u +N +X +Q +X +Q +A +L +a +"} +(9,1,1) = {" +a +s +g +Q +X +Q +X +r +q +a +"} diff --git a/_maps/holodeck/thunderdome.dmm b/_maps/holodeck/thunderdome.dmm new file mode 100644 index 0000000000000..e9b1eb5167aae --- /dev/null +++ b/_maps/holodeck/thunderdome.dmm @@ -0,0 +1,148 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/table, +/turf/open/floor/holofloor/basalt, +/area/template_noop) +"c" = ( +/obj/structure/window{ + dir = 1 + }, +/turf/open/floor/holofloor/basalt, +/area/template_noop) +"h" = ( +/obj/structure/table, +/obj/item/clothing/head/helmet/thunderdome/holosuit, +/obj/item/clothing/suit/armor/tdome/holosuit/green, +/obj/item/clothing/under/color/green, +/obj/item/holo/esword/green, +/turf/open/floor/holofloor/basalt, +/area/template_noop) +"q" = ( +/obj/structure/table, +/obj/item/clothing/head/helmet/thunderdome/holosuit, +/obj/item/clothing/suit/armor/tdome/holosuit/red, +/obj/item/clothing/under/color/red, +/obj/item/holo/esword/red, +/turf/open/floor/holofloor/basalt, +/area/template_noop) +"x" = ( +/obj/structure/window, +/turf/open/floor/holofloor/basalt, +/area/template_noop) +"B" = ( +/turf/open/floor/holofloor/basalt, +/area/template_noop) +"Q" = ( +/obj/structure/table, +/obj/machinery/readybutton, +/turf/open/floor/holofloor/basalt, +/area/template_noop) + +(1,1,1) = {" +Q +B +B +B +x +c +B +B +B +a +"} +(2,1,1) = {" +q +B +B +B +x +c +B +B +B +h +"} +(3,1,1) = {" +q +B +B +B +x +c +B +B +B +h +"} +(4,1,1) = {" +q +B +B +B +x +c +B +B +B +h +"} +(5,1,1) = {" +q +B +B +B +x +c +B +B +B +h +"} +(6,1,1) = {" +q +B +B +B +x +c +B +B +B +h +"} +(7,1,1) = {" +q +B +B +B +x +c +B +B +B +h +"} +(8,1,1) = {" +q +B +B +B +x +c +B +B +B +h +"} +(9,1,1) = {" +a +B +B +B +x +c +B +B +B +Q +"} diff --git a/_maps/holodeck/thunderdome1218.dmm b/_maps/holodeck/thunderdome1218.dmm new file mode 100644 index 0000000000000..da6c753cd0333 --- /dev/null +++ b/_maps/holodeck/thunderdome1218.dmm @@ -0,0 +1,222 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"f" = ( +/obj/structure/window/reinforced, +/obj/item/banner/red, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"g" = ( +/obj/structure/window/reinforced, +/obj/item/banner/blue, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"k" = ( +/obj/structure/table/wood/fancy, +/obj/item/clothing/suit/armor/riot/knight/blue, +/obj/item/clothing/head/helmet/knight/blue, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"n" = ( +/obj/machinery/door/window/westleft{ + dir = 2 + }, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"p" = ( +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"r" = ( +/obj/structure/table/wood, +/obj/item/scythe, +/obj/item/spear, +/obj/item/melee/chainofcommand{ + name = "chain whip" + }, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"s" = ( +/obj/machinery/door/window/westleft{ + dir = 2; + icon_state = "right" + }, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"x" = ( +/turf/open/floor/holofloor/grass, +/area/template_noop) +"y" = ( +/obj/structure/table/wood, +/obj/item/melee/chainofcommand{ + name = "chain whip" + }, +/obj/item/spear, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"B" = ( +/turf/open/floor/holofloor{ + icon_state = "stairs-old" + }, +/area/template_noop) +"C" = ( +/obj/structure/table/wood/fancy, +/obj/item/clothing/head/crown/fancy{ + pixel_y = 6 + }, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"E" = ( +/obj/structure/window/reinforced, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"H" = ( +/obj/structure/statue/diamond/captain, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"J" = ( +/obj/structure/window/reinforced, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"N" = ( +/obj/structure/table/wood, +/obj/item/spear, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"Q" = ( +/obj/structure/table/wood/fancy, +/obj/item/clothing/suit/armor/riot/knight/blue, +/obj/item/clothing/head/helmet/knight/blue, +/obj/item/claymore/weak, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"R" = ( +/obj/machinery/door/window/westleft{ + dir = 2 + }, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"T" = ( +/obj/structure/table/wood, +/obj/item/club/tailclub, +/obj/item/spear, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) +"X" = ( +/obj/structure/table/wood, +/obj/item/scythe, +/obj/item/spear, +/turf/open/floor/holofloor/asteroid, +/area/template_noop) + +(1,1,1) = {" +H +J +N +p +p +p +p +g +x +a +"} +(2,1,1) = {" +x +J +r +p +p +p +p +E +x +a +"} +(3,1,1) = {" +k +s +B +p +p +p +p +E +x +a +"} +(4,1,1) = {" +Q +J +y +p +p +p +p +R +x +a +"} +(5,1,1) = {" +C +J +X +p +p +p +p +E +x +a +"} +(6,1,1) = {" +Q +J +T +p +p +p +p +R +x +a +"} +(7,1,1) = {" +k +n +B +p +p +p +p +E +x +a +"} +(8,1,1) = {" +x +J +y +p +p +p +p +E +x +a +"} +(9,1,1) = {" +H +J +T +p +p +p +p +f +x +a +"} diff --git a/_maps/holodeck/wildlifesim.dmm b/_maps/holodeck/wildlifesim.dmm new file mode 100644 index 0000000000000..cc01ef83518e2 --- /dev/null +++ b/_maps/holodeck/wildlifesim.dmm @@ -0,0 +1,117 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor/plating, +/area/template_noop) +"H" = ( +/obj/effect/holodeck_effect/mobspawner, +/turf/open/floor/holofloor/plating, +/area/template_noop) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +H +a +a +a +a +a +H +a +"} +(3,1,1) = {" +a +a +a +a +H +a +a +a +a +a +"} +(4,1,1) = {" +a +a +H +a +a +a +a +a +H +a +"} +(5,1,1) = {" +a +a +a +a +a +H +H +a +a +a +"} +(6,1,1) = {" +a +a +H +a +a +a +a +a +H +a +"} +(7,1,1) = {" +a +a +a +a +H +a +a +a +a +a +"} +(8,1,1) = {" +a +a +H +a +a +a +a +a +H +a +"} +(9,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/holodeck/winterwonderland.dmm b/_maps/holodeck/winterwonderland.dmm new file mode 100644 index 0000000000000..039186a6f3cdf --- /dev/null +++ b/_maps/holodeck/winterwonderland.dmm @@ -0,0 +1,247 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/flora/grass/both, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"c" = ( +/obj/structure/flora/bush{ + pixel_x = -2; + pixel_y = 3 + }, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"d" = ( +/obj/structure/flora/tree/pine, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"h" = ( +/obj/structure/flora/tree/pine{ + pixel_y = -6 + }, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"l" = ( +/obj/structure/flora/tree/pine{ + pixel_x = -21 + }, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"m" = ( +/obj/effect/holodeck_effect/mobspawner/penguin, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"n" = ( +/obj/item/stack/sheet/mineral/coal{ + pixel_x = -8; + pixel_y = -4 + }, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"q" = ( +/obj/structure/flora/grass/brown, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"s" = ( +/obj/structure/flora/tree/pine/xmas, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"u" = ( +/obj/item/clothing/gloves/color/green{ + pixel_x = -7; + pixel_y = -7 + }, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"w" = ( +/obj/item/clothing/suit/hooded/wintercoat, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"A" = ( +/obj/structure/flora/bush, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"D" = ( +/obj/structure/statue/snow/snowman{ + anchored = 1 + }, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"E" = ( +/obj/effect/holodeck_effect/mobspawner/penguin_baby, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"G" = ( +/obj/item/clothing/head/ushanka{ + pixel_x = -5; + pixel_y = 6 + }, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"H" = ( +/obj/item/clothing/neck/stripedredscarf{ + pixel_x = -3; + pixel_y = -5 + }, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"L" = ( +/obj/structure/flora/grass/green, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"O" = ( +/obj/structure/flora/bush{ + pixel_x = 5; + pixel_y = 7 + }, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"P" = ( +/obj/item/clothing/head/collectable/tophat{ + pixel_x = 9; + pixel_y = 7 + }, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"Q" = ( +/obj/item/clothing/shoes/winterboots{ + pixel_y = 12 + }, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"R" = ( +/obj/structure/flora/tree/pine{ + pixel_x = -10 + }, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"S" = ( +/obj/item/hatchet{ + pixel_x = 7; + pixel_y = -8 + }, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"U" = ( +/obj/item/toy/snowball{ + pixel_y = 6 + }, +/obj/item/toy/snowball{ + pixel_x = 5 + }, +/obj/item/toy/snowball{ + pixel_x = -4 + }, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"Z" = ( +/turf/open/floor/holofloor/snow, +/area/template_noop) + +(1,1,1) = {" +L +S +Z +Z +A +Z +Z +Z +Z +a +"} +(2,1,1) = {" +Z +h +Z +Z +Z +Z +Z +Z +l +Z +"} +(3,1,1) = {" +Z +P +U +Z +Z +Z +Z +Z +Z +c +"} +(4,1,1) = {" +H +D +Z +Z +Z +Z +Z +Z +m +Z +"} +(5,1,1) = {" +A +n +Z +Z +Z +s +E +Z +w +Q +"} +(6,1,1) = {" +Z +Z +m +Z +Z +Z +Z +U +u +G +"} +(7,1,1) = {" +Z +Z +d +O +Z +Z +Z +Z +Z +Z +"} +(8,1,1) = {" +Z +Z +Z +Z +Z +Z +Z +Z +Z +R +"} +(9,1,1) = {" +Z +a +Z +Z +Z +L +Z +Z +Z +q +"} diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 5d60aabdfc2a2..9539d97d80cd3 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -469,7 +469,7 @@ /obj/item/gun/energy/e_gun/dragnet, /obj/item/gun/energy/e_gun/dragnet, /obj/item/beacon/nettingportal, -/obj/item/gun/grenadelauncher, +/obj/item/gun/grenadelauncher/security, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -1112,10 +1112,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel/dark, /area/security/execution/transfer) "acK" = ( @@ -1246,7 +1242,6 @@ name = "blast door" }, /obj/machinery/door/firedoor, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/execution/transfer) "ada" = ( @@ -1696,7 +1691,7 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/carpet/red, /area/crew_quarters/heads/hos) "adO" = ( @@ -2060,6 +2055,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/carpet/red, /area/crew_quarters/heads/hos) "aez" = ( @@ -2307,10 +2303,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "aeZ" = ( @@ -2465,7 +2458,6 @@ /area/security/execution/transfer) "afu" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/execution/transfer) "afv" = ( @@ -2697,6 +2689,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/showroomfloor, /area/security/main) "afT" = ( @@ -2811,12 +2804,13 @@ "agl" = ( /obj/machinery/door/airlock/security{ name = "Interrogation"; - req_access_txt = "63" + req_access_txt = "2" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/prison) "agm" = ( @@ -2860,10 +2854,7 @@ icon_state = "2-4" }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "agr" = ( @@ -3255,17 +3246,17 @@ /turf/closed/wall, /area/maintenance/fore/secondary) "aho" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 5 +/obj/structure/cable/yellow{ + icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/security/prison) +/turf/open/floor/plating, +/area/maintenance/port/fore) "ahp" = ( /obj/structure/chair{ dir = 8 @@ -3344,7 +3335,7 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "ahw" = ( -/obj/machinery/computer/shuttle/mining{ +/obj/machinery/computer/shuttle_flight/mining{ dir = 4 }, /obj/effect/turf_decal/tile/brown{ @@ -3458,6 +3449,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "ahG" = ( @@ -3680,7 +3672,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/security/main) "aia" = ( @@ -3969,7 +3961,6 @@ /area/security/brig) "aiA" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/fore/secondary) "aiC" = ( @@ -4086,6 +4077,7 @@ req_access_txt = "3"; security_level = 6 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "aiN" = ( @@ -4151,6 +4143,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/prison) "aiX" = ( @@ -4649,6 +4642,7 @@ name = "Auxiliary Tool Storage"; req_access_txt = "12" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/tools) "ajX" = ( @@ -4867,10 +4861,18 @@ /area/security/brig) "aku" = ( /obj/structure/cable/yellow{ - icon_state = "1-4" + icon_state = "0-8" + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" }, /turf/open/floor/plating, -/area/maintenance/aft) +/area/bridge) "akv" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -5107,6 +5109,7 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "akV" = ( @@ -5136,6 +5139,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "akX" = ( @@ -5157,6 +5161,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "akY" = ( @@ -5276,30 +5281,7 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"all" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/turf/open/floor/plating, -/area/maintenance/aft) "alo" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 4 }, @@ -5413,6 +5395,7 @@ pixel_y = 7 }, /obj/item/pen, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "alB" = ( @@ -5444,15 +5427,15 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "alE" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, /obj/structure/cable/yellow{ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, /turf/open/floor/plating, /area/maintenance/aft) "alF" = ( @@ -5508,22 +5491,22 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 6 }, /turf/open/floor/plating, /area/maintenance/fore/secondary) "alL" = ( -/obj/structure/disposalpipe/segment, /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, /turf/open/floor/plating, -/area/maintenance/fore/secondary) +/area/bridge) "alM" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -5719,6 +5702,7 @@ }, /obj/item/restraints/handcuffs, /obj/item/radio/off, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "amn" = ( @@ -5779,6 +5763,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/courtroom) "amx" = ( @@ -5870,6 +5855,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/processing) "amN" = ( @@ -5925,6 +5911,7 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "amU" = ( @@ -5953,6 +5940,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "amY" = ( @@ -5991,6 +5979,9 @@ }, /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/fore/secondary) "anf" = ( @@ -6113,18 +6104,13 @@ /turf/closed/wall/r_wall, /area/maintenance/solars/port/fore) "anJ" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plating, /area/maintenance/port/fore) "anK" = ( /obj/effect/decal/cleanable/food/egg_smudge, /turf/open/floor/plating, /area/maintenance/port/fore) -"anL" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/science/mixing) "anO" = ( /obj/docking_port/stationary{ dir = 8; @@ -6226,18 +6212,17 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/machinery/camera/autoname, /turf/open/floor/plating, /area/maintenance/port/fore) "aok" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 6 +/obj/machinery/atmospherics/components/binary/valve/layer1{ + dir = 4 }, /turf/open/floor/plating, /area/maintenance/port/fore) "aom" = ( -/obj/machinery/atmospherics/components/binary/valve{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden/layer1{ + dir = 8 }, /turf/open/floor/plating, /area/maintenance/port/fore) @@ -6402,7 +6387,6 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/structure/cable/yellow, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 9 }, @@ -6509,6 +6493,18 @@ "aph" = ( /turf/closed/wall, /area/lawoffice) +"apn" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/quartermaster/exploration_prep) "app" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -6790,9 +6786,6 @@ /obj/structure/cable/yellow{ icon_state = "1-4" }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, @@ -6802,9 +6795,6 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "aqk" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, @@ -6893,22 +6883,14 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"aqv" = ( -/obj/machinery/door/airlock/external{ - name = "External Access"; - req_access_txt = "13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "aqx" = ( /obj/structure/sign/warning/electricshock, /turf/closed/wall/r_wall, /area/maintenance/solars/starboard/fore) "aqy" = ( -/obj/structure/closet/emcloset, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aqA" = ( @@ -6948,7 +6930,6 @@ /area/maintenance/port/fore) "aqQ" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/fore) "aqR" = ( @@ -7094,6 +7075,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/item/pool/pool_noodle, +/obj/item/pool/pool_noodle, +/obj/item/pool/rubber_ring, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "aro" = ( @@ -7119,19 +7103,16 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/turf/closed/wall/r_wall, +/turf/closed/wall, /area/security/main) "arK" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 9 - }, /turf/open/floor/plating{ icon_state = "platingdmg3" }, /area/maintenance/port/fore) "arM" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance/two, /turf/open/floor/plating, @@ -7165,6 +7146,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 6 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/wood, /area/lawoffice) "arV" = ( @@ -7183,6 +7165,10 @@ /obj/item/folder/blue, /obj/item/folder/blue, /obj/item/stamp/law, +/obj/item/clothing/glasses/sunglasses/advanced{ + pixel_x = 5; + pixel_y = 10 + }, /turf/open/floor/wood, /area/lawoffice) "arZ" = ( @@ -7235,7 +7221,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "asg" = ( @@ -7308,6 +7294,9 @@ dir = 4 }, /obj/machinery/camera/autoname, +/obj/item/pool/pool_noodle, +/obj/item/pool/pool_noodle, +/obj/item/pool/rubber_ring, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "asr" = ( @@ -7322,6 +7311,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/item/pool/pool_noodle, +/obj/item/pool/pool_noodle, +/obj/item/pool/rubber_ring, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "ass" = ( @@ -7476,13 +7468,14 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 8 }, +/obj/effect/turf_decal/pool/corner, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "asY" = ( /obj/structure/cable/yellow{ icon_state = "4-8" }, -/turf/closed/wall, +/turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai) "ata" = ( /obj/machinery/computer/warrant{ @@ -7589,16 +7582,17 @@ /area/crew_quarters/heads/hos) "atp" = ( /obj/machinery/door/airlock/external{ - name = "Construction Zone" + name = "Construction Zone"; + req_one_access_txt = "72" }, /turf/open/floor/plating, /area/construction/mining/aux_base) "att" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 10 - }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 + dir = 8 + }, +/obj/effect/turf_decal/pool{ + dir = 8 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) @@ -7641,6 +7635,7 @@ /obj/machinery/camera/autoname{ dir = 1 }, +/obj/item/clothing/glasses/sunglasses/advanced, /turf/open/floor/wood, /area/lawoffice) "atN" = ( @@ -7689,12 +7684,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "atW" = ( @@ -7726,24 +7717,17 @@ /turf/open/floor/plasteel, /area/construction/mining/aux_base) "auf" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Detective Maintenance"; - req_access_txt = "4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 + dir = 4 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/fore) +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) "aug" = ( /obj/machinery/firealarm{ dir = 1; @@ -7834,53 +7818,11 @@ /turf/open/floor/wood, /area/crew_quarters/dorms) "aur" = ( -/obj/machinery/door/window/eastright{ - base_state = "left"; - dir = 8; - icon_state = "left"; - name = "Fitness Ring" - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"aus" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"aut" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/obj/machinery/pool_filter, +/turf/open/indestructible/sound/pool/end, /area/crew_quarters/fitness) "auv" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel/dark, +/turf/open/indestructible/sound/pool/end, /area/crew_quarters/fitness) "auw" = ( /obj/structure/bed, @@ -7907,26 +7849,33 @@ /turf/open/floor/plasteel, /area/crew_quarters/dorms) "auz" = ( -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/obj/machinery/camera/autoname{ +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "auA" = ( -/obj/machinery/light/small{ - dir = 1 +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "auB" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/crew_quarters/fitness) "auC" = ( -/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 1 + }, +/obj/structure/closet/emcloset, /turf/open/floor/plating, /area/maintenance/starboard/fore) "auD" = ( @@ -7939,6 +7888,19 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"auN" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/landmark/start/exploration, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/quartermaster/exploration_prep) "auO" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -8038,13 +8000,17 @@ /turf/open/floor/plasteel, /area/crew_quarters/dorms) "avh" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/machinery/door/airlock/maintenance{ + name = "Detective Maintenance"; + req_access_txt = "4" + }, +/obj/structure/disposalpipe/segment{ + dir = 2 }, -/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" }, /turf/open/floor/plating, /area/maintenance/fore) @@ -8164,37 +8130,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/crew_quarters/fitness) -"avy" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"avz" = ( -/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/crew_quarters/fitness) -"avA" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) "avB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow{ @@ -8203,23 +8138,23 @@ /turf/open/floor/plating, /area/ai_monitored/security/armory) "avC" = ( -/obj/structure/chair{ - dir = 8 +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 10 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 1 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "avD" = ( -/obj/machinery/computer/holodeck{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - dir = 4 +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume, +/obj/machinery/advanced_airlock_controller{ + dir = 8; + pixel_x = 24 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "avE" = ( /obj/machinery/door/poddoor/preopen{ id = "maint3" @@ -8481,6 +8416,9 @@ icon_state = "1-2" }, /obj/machinery/holopad, +/obj/effect/turf_decal/pool{ + dir = 4 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "awB" = ( @@ -8492,19 +8430,17 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness) "awC" = ( -/obj/structure/table, -/obj/item/paper/fluff/holodeck/disclaimer, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 1 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "awD" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/starboard/fore) "awE" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, @@ -8545,12 +8481,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engineering) "awY" = ( @@ -8812,16 +8743,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"axS" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) "axT" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -8829,13 +8750,11 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, +/obj/effect/turf_decal/pool{ + dir = 4 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"axU" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) "axV" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -8849,21 +8768,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"axW" = ( -/obj/machinery/door/window/eastright{ - base_state = "left"; - icon_state = "left"; - name = "Fitness Ring" - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) "axY" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ @@ -8872,38 +8776,29 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness) "axZ" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 6 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "aya" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 + dir = 6 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 9 + dir = 1 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "ayb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 +/obj/machinery/light/small{ + dir = 1 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) @@ -9028,7 +8923,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/fore) "ayB" = ( @@ -9036,7 +8930,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/fore) "ayE" = ( @@ -9048,7 +8941,6 @@ }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/fore) "ayG" = ( @@ -9236,20 +9128,17 @@ /turf/open/floor/plasteel, /area/crew_quarters/dorms) "azf" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/effect/turf_decal/pool/corner{ + dir = 8 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "azh" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 +/obj/machinery/airalarm{ + pixel_y = 24 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 +/obj/machinery/camera/autoname{ + dir = 6 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) @@ -9287,6 +9176,9 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/effect/turf_decal/pool{ + dir = 1 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "azl" = ( @@ -9299,35 +9191,43 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/turf_decal/pool/corner{ + dir = 1 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "azm" = ( -/obj/structure/chair/stool{ - pixel_y = 8 +/obj/structure/chair/stool, +/obj/effect/turf_decal/pool{ + dir = 1 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "azn" = ( /obj/structure/table, /obj/item/storage/firstaid/regular, +/obj/effect/turf_decal/pool{ + dir = 1 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "azo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 6 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 6 }, +/obj/effect/turf_decal/pool{ + dir = 1 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "azp" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 +/obj/machinery/computer/holodeck{ + dir = 4 }, -/turf/open/floor/plating, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, /area/crew_quarters/fitness) "azr" = ( /obj/structure/grille/broken, @@ -9464,9 +9364,6 @@ /obj/structure/cable/yellow{ icon_state = "1-4" }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 8 }, @@ -9485,12 +9382,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/door/airlock/command/glass{ name = "EVA Storage Maintenance"; req_access_txt = "18"; @@ -9551,6 +9442,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet) "azY" = ( @@ -9611,7 +9503,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "aAh" = ( @@ -9630,17 +9522,21 @@ /area/crew_quarters/dorms) "aAj" = ( /obj/structure/cable/yellow{ - icon_state = "1-4" + icon_state = "0-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 +/obj/structure/cable/yellow{ + icon_state = "0-4" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 5 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" }, -/obj/structure/cable/yellow, /turf/open/floor/plating, -/area/maintenance/port/fore) +/area/bridge) "aAk" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -9724,17 +9620,20 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "aAq" = ( -/obj/machinery/atmospherics/components/unary/tank/air{ +/obj/structure/chair{ dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "aAr" = ( /obj/structure/closet, /obj/effect/decal/cleanable/cobweb, @@ -9773,9 +9672,6 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aAw" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 10 }, @@ -9824,7 +9720,7 @@ /area/hallway/secondary/entry) "aAH" = ( /obj/effect/turf_decal/stripes/line, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/camera/autoname{ dir = 1 }, @@ -9832,23 +9728,22 @@ /area/hallway/secondary/entry) "aAL" = ( /obj/structure/cable/yellow{ - icon_state = "0-8" + icon_state = "0-4" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "2-4" }, /turf/open/floor/plating, -/area/maintenance/port/fore) +/area/bridge) "aAN" = ( /obj/structure/cable/yellow{ icon_state = "2-8" }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 1 }, @@ -9999,9 +9894,6 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, @@ -10013,10 +9905,10 @@ /area/maintenance/fore) "aBi" = ( /obj/structure/cable/yellow{ - icon_state = "0-4" + icon_state = "1-2" }, -/turf/open/floor/plating, -/area/maintenance/fore) +/turf/open/floor/plasteel, +/area/bridge) "aBj" = ( /obj/structure/rack, /obj/machinery/light{ @@ -10141,15 +10033,14 @@ }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aBD" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/general{ - dir = 8 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 }, /turf/open/floor/plating, /area/maintenance/starboard/fore) @@ -10184,9 +10075,6 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 @@ -10485,14 +10373,14 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"aCx" = ( -/obj/machinery/atmospherics/components/binary/valve, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "aCy" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/structure/table, +/obj/item/paper/fluff/holodeck/disclaimer, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "aCz" = ( /obj/structure/window/reinforced{ dir = 8 @@ -10552,7 +10440,7 @@ /turf/open/floor/plasteel, /area/security/checkpoint/auxiliary) "aCP" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/chapel/main) "aCQ" = ( @@ -11019,10 +10907,14 @@ /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet) "aDX" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "aDY" = ( /obj/structure/chair/stool, /obj/effect/landmark/start/mime, @@ -11106,9 +10998,6 @@ }, /area/crew_quarters/theatre) "aEg" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, @@ -11207,12 +11096,12 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ - dir = 4 - }, /obj/structure/cable/yellow{ icon_state = "2-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aEC" = ( @@ -11233,24 +11122,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"aED" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "aEE" = ( /turf/open/floor/plasteel, /area/security/checkpoint/auxiliary) @@ -11310,6 +11181,7 @@ /obj/machinery/door/airlock{ name = "Garden" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics/garden) "aEM" = ( @@ -11486,6 +11358,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet) "aFi" = ( @@ -11594,10 +11467,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"aFy" = ( -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "aFz" = ( /turf/open/floor/plasteel/dark, /area/chapel/main) @@ -11647,7 +11516,6 @@ /turf/open/floor/plasteel, /area/security/checkpoint/auxiliary) "aFJ" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/maintenance/port/fore) @@ -11858,7 +11726,7 @@ dir = 8; pixel_x = 24 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/gateway) "aGg" = ( @@ -11997,9 +11865,6 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 5 }, @@ -12106,24 +11971,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"aGH" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "aGI" = ( /obj/structure/disposalpipe/junction{ dir = 4 @@ -12185,9 +12032,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 10 }, @@ -12282,6 +12126,7 @@ name = "Security Checkpoint"; req_access_txt = "1" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/auxiliary) "aHa" = ( @@ -12293,10 +12138,6 @@ req_access_txt = "1" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "aHb" = ( @@ -12306,6 +12147,9 @@ pixel_y = 9 }, /obj/item/stack/packageWrap, +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, /turf/open/floor/wood, /area/library) "aHc" = ( @@ -12385,10 +12229,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aHo" = ( @@ -12531,6 +12371,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) "aHI" = ( @@ -12671,10 +12512,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/theatre) -"aIb" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "aId" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -12713,7 +12550,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 5 }, -/obj/structure/cable/yellow, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aIj" = ( @@ -12748,9 +12584,6 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aIl" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/structure/cable/yellow{ icon_state = "1-8" }, @@ -12777,9 +12610,6 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aIn" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, @@ -12848,6 +12678,9 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, +/obj/structure/sign/painting/library{ + pixel_x = 32 + }, /turf/open/floor/wood, /area/library) "aIy" = ( @@ -12916,7 +12749,7 @@ id = "aux_base_shutters"; name = "Public Shutters Control"; pixel_x = 24; - req_one_access_txt = "32;47;48" + req_one_access_txt = "72" }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -12945,7 +12778,6 @@ id = "hosspace"; name = "space shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "aIM" = ( @@ -13093,7 +12925,6 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/port) "aJe" = ( @@ -13117,7 +12948,7 @@ /turf/open/floor/plasteel/dark, /area/hallway/primary/port) "aJf" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/camera/autoname{ dir = 1 }, @@ -13184,6 +13015,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/theatre) "aJl" = ( @@ -13213,7 +13045,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/camera/autoname, /turf/open/floor/plasteel, /area/hallway/primary/central) @@ -13513,10 +13345,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/gateway) "aKd" = ( @@ -13528,10 +13357,6 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/gateway) "aKe" = ( @@ -13541,9 +13366,6 @@ }, /area/chapel/main) "aKf" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, /obj/structure/cable/yellow{ icon_state = "2-4" }, @@ -13612,7 +13434,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/port) "aKu" = ( @@ -13620,7 +13441,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/port) "aKv" = ( @@ -13632,7 +13452,6 @@ }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/port) "aKw" = ( @@ -13659,10 +13478,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/hallway/primary/port) "aKx" = ( @@ -13670,7 +13486,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/port) "aKy" = ( @@ -13698,10 +13513,6 @@ id = "stationawaygate"; name = "Gateway Access Shutters" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/gateway) "aKB" = ( @@ -13714,7 +13525,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aKD" = ( /obj/structure/disposalpipe/segment, @@ -13843,7 +13654,7 @@ /obj/machinery/power/apc/auto_name/north{ pixel_y = 24 }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aKV" = ( /obj/machinery/door/window/southleft{ @@ -13916,6 +13727,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/office) "aLc" = ( @@ -14038,7 +13850,7 @@ "aLu" = ( /obj/machinery/door/airlock/engineering{ name = "Auxillary Base Construction"; - req_one_access_txt = "32;47;48" + req_one_access_txt = "72" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 @@ -14047,6 +13859,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/construction/mining/aux_base) "aLv" = ( @@ -14297,7 +14110,7 @@ /obj/machinery/chem_master/condimaster{ name = "CondiMaster Neo" }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aMm" = ( /obj/machinery/firealarm{ @@ -14324,7 +14137,7 @@ /turf/open/floor/wood, /area/crew_quarters/theatre) "aMq" = ( -/obj/structure/piano{ +/obj/structure/musician/piano{ icon_state = "piano" }, /turf/open/floor/wood, @@ -14336,7 +14149,7 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 5 }, @@ -14408,7 +14221,7 @@ /turf/open/floor/plasteel, /area/hydroponics) "aMB" = ( -/obj/machinery/vending/coffee, +/obj/machinery/food_cart/coffee, /turf/open/floor/wood, /area/crew_quarters/bar) "aMC" = ( @@ -14417,7 +14230,7 @@ /area/crew_quarters/bar) "aMD" = ( /obj/machinery/icecream_vat, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aME" = ( /obj/structure/disposalpipe/segment{ @@ -14432,7 +14245,7 @@ /turf/open/floor/plasteel, /area/hydroponics) "aMF" = ( -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aMG" = ( /obj/structure/closet/crate/hydroponics, @@ -14645,20 +14458,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"aNp" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port) "aNq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 5 @@ -14800,14 +14599,14 @@ /mob/living/simple_animal/hostile/retaliate/goat{ name = "Pete" }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aNM" = ( /obj/structure/kitchenspike, /obj/machinery/light/small{ dir = 8 }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aNN" = ( /obj/machinery/door/airlock/public/glass{ @@ -14819,10 +14618,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics) "aNO" = ( @@ -14834,7 +14630,7 @@ pixel_x = 24 }, /obj/machinery/vending/wardrobe/chef_wardrobe, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aNP" = ( /obj/structure/disposalpipe/segment, @@ -14887,14 +14683,12 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/office) "aNX" = ( -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1481; - name = "Confessional Intercom"; - pixel_x = 25 +/obj/item/radio/intercom/chapel{ + pixel_x = 26 }, /obj/structure/chair, /turf/open/floor/plasteel/dark, @@ -14917,7 +14711,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/camera/autoname, /turf/open/floor/plasteel, /area/hallway/secondary/entry) @@ -15107,7 +14901,7 @@ /area/crew_quarters/theatre) "aOI" = ( /obj/structure/kitchenspike, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aOJ" = ( /obj/structure/window/reinforced, @@ -15135,7 +14929,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 8 }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aON" = ( /obj/structure/disposalpipe/segment, @@ -15143,7 +14937,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aOO" = ( /obj/machinery/door/airlock{ @@ -15182,7 +14976,7 @@ /area/library) "aOT" = ( /obj/machinery/gibber, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aOU" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ @@ -15263,6 +15057,9 @@ pixel_y = 7 }, /obj/item/pen/invisible, +/obj/structure/sign/painting/library_private{ + pixel_y = 32 + }, /turf/open/floor/engine/cult, /area/library) "aPi" = ( @@ -15390,10 +15187,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/art) "aPI" = ( @@ -15452,7 +15246,6 @@ id = "bridge blast"; name = "bridge blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "aPT" = ( @@ -15464,58 +15257,11 @@ name = "bridge blast door" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/bridge) -"aPU" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/status_display/evac, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/bridge) -"aPV" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "aPW" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/cable/yellow{ - 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" - }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, +/turf/closed/wall/r_wall, /area/bridge) "aPX" = ( /obj/structure/cable/yellow{ @@ -15526,7 +15272,6 @@ id = "bridge blast"; name = "bridge blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "aPY" = ( @@ -15634,7 +15379,8 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/turf/open/floor/plasteel/showroomfloor, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aQm" = ( /obj/effect/turf_decal/tile/green{ @@ -15663,7 +15409,7 @@ /turf/open/floor/engine/cult, /area/library) "aQs" = ( -/obj/structure/destructible/cult/tome, +/obj/structure/destructible/cult/tome/library, /obj/item/clothing/under/suit/red, /obj/item/book/codex_gigas, /turf/open/floor/engine/cult, @@ -15684,15 +15430,12 @@ }, /area/chapel/main) "aQw" = ( -/obj/structure/table/wood, +/obj/structure/altar_of_gods, /turf/open/floor/plasteel/dark, /area/chapel/main) "aQz" = ( -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1481; - name = "Confessional Intercom"; - pixel_x = 25 +/obj/item/radio/intercom/chapel{ + pixel_x = 26 }, /obj/structure/chair{ dir = 1 @@ -15789,7 +15532,7 @@ /obj/machinery/firealarm{ pixel_y = 24 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aQY" = ( @@ -15843,6 +15586,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/bridge) "aRj" = ( @@ -15859,9 +15605,6 @@ /obj/machinery/computer/monitor{ name = "bridge power monitoring console" }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -15885,10 +15628,13 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/bridge) "aRn" = ( -/obj/machinery/computer/shuttle/labor, +/obj/machinery/computer/shuttle_flight/labor, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -15910,10 +15656,7 @@ /turf/open/floor/plasteel, /area/bridge) "aRp" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/computer/shuttle/mining, +/obj/machinery/computer/shuttle_flight/mining, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -15932,6 +15675,9 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/bridge) "aRr" = ( @@ -16121,6 +15867,9 @@ /obj/machinery/camera/autoname{ dir = 8 }, +/obj/structure/sign/painting/library{ + pixel_x = 32 + }, /turf/open/floor/wood, /area/library) "aRQ" = ( @@ -16175,6 +15924,7 @@ /obj/item/restraints/legcuffs/beartrap, /obj/item/storage/box/mousetraps, /obj/item/storage/box/mousetraps, +/obj/vehicle/ridden/janicart, /turf/open/floor/plasteel, /area/janitor) "aSb" = ( @@ -16185,11 +15935,12 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "aSc" = ( -/obj/vehicle/ridden/janicart, /obj/structure/disposalpipe/segment, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/janitor) "aSd" = ( @@ -16274,12 +16025,18 @@ "aSt" = ( /obj/structure/chair/stool, /obj/effect/landmark/start/janitor, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, /turf/open/floor/plasteel, /area/janitor) "aSu" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/bridge) "aSv" = ( @@ -16289,9 +16046,6 @@ /turf/open/floor/plasteel, /area/bridge) "aSw" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, @@ -16320,6 +16074,9 @@ pixel_x = 29; pixel_y = 8 }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/bridge) "aSz" = ( @@ -16342,9 +16099,6 @@ /area/bridge) "aSB" = ( /obj/structure/table/reinforced, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -16355,6 +16109,9 @@ /obj/effect/turf_decal/tile/green{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/bridge) "aSD" = ( @@ -16395,6 +16152,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "aSJ" = ( @@ -16573,6 +16331,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "aTk" = ( +/obj/machinery/computer/arcade, /turf/open/floor/plasteel/white/corner{ dir = 1 }, @@ -16781,6 +16540,10 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/item/storage/secure/safe/caps_spare{ + pixel_x = 6; + pixel_y = 28 + }, /turf/open/floor/plasteel, /area/bridge) "aTT" = ( @@ -16793,6 +16556,9 @@ /area/bridge) "aTU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/bridge) "aTV" = ( @@ -16800,12 +16566,6 @@ /obj/machinery/recharger, /turf/open/floor/plasteel, /area/bridge) -"aTW" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/bridge) "aTX" = ( /turf/open/floor/plasteel, /area/bridge) @@ -16816,9 +16576,6 @@ /turf/open/floor/plasteel, /area/bridge) "aTZ" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -16826,6 +16583,9 @@ /area/bridge) "aUa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/bridge) "aUb" = ( @@ -16892,12 +16652,7 @@ req_access_txt = "35" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "aUi" = ( @@ -17038,10 +16793,12 @@ }, /area/chapel/main) "aUL" = ( -/obj/machinery/computer/arcade, /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/item/radio/intercom{ + pixel_x = -25 + }, /turf/open/floor/plasteel/white/corner{ dir = 1 }, @@ -17081,15 +16838,6 @@ }, /turf/open/floor/plasteel, /area/storage/tools) -"aUT" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port) "aUU" = ( /obj/structure/closet/wardrobe/grey, /obj/machinery/requests_console{ @@ -17205,15 +16953,15 @@ /turf/open/floor/plasteel, /area/bridge) "aVj" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/bridge) "aVk" = ( @@ -17230,24 +16978,12 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 1 }, -/turf/open/floor/plasteel, -/area/bridge) -"aVl" = ( /obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 + icon_state = "1-4" }, /turf/open/floor/plasteel, /area/bridge) -"aVn" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, +"aVl" = ( /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -17270,6 +17006,9 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/bridge) "aVp" = ( @@ -17367,12 +17106,6 @@ "aVA" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/food/snacks/pie/cream, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "aVB" = ( @@ -17507,9 +17240,6 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "aVW" = ( -/obj/item/radio/intercom{ - pixel_x = -25 - }, /obj/effect/turf_decal/tile/red{ dir = 8 }, @@ -17679,24 +17409,6 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"aWw" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port) "aWx" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -18018,18 +17730,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /turf/open/floor/plasteel, /area/hallway/primary/central) "aXh" = ( /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /turf/open/floor/plasteel, /area/hallway/primary/central) "aXi" = ( @@ -18047,11 +17753,11 @@ /area/crew_quarters/bar) "aXj" = ( /obj/structure/table/reinforced, -/obj/item/lighter, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/structure/displaycase/forsale/kitchen, /turf/open/floor/plasteel, /area/crew_quarters/bar) "aXk" = ( @@ -18110,6 +17816,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) "aXq" = ( @@ -18174,21 +17881,8 @@ }, /area/hallway/secondary/exit) "aXF" = ( -/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/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, +/obj/item/pool/rubber_ring, +/turf/open/indestructible/sound/pool, /area/crew_quarters/fitness) "aXG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -18276,20 +17970,6 @@ }, /turf/open/floor/carpet, /area/vacant_room/office) -"aYa" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port) "aYb" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -18396,7 +18076,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/bridge) "aYu" = ( @@ -18494,12 +18174,18 @@ /obj/machinery/light_switch{ pixel_y = -25 }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"aYL" = ( /obj/machinery/light, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) +"aYL" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/item/lighter, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "aYM" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -18804,6 +18490,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/bridge/meeting_room) "aZR" = ( @@ -18850,6 +18537,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/crew_quarters/heads/captain) "aZZ" = ( @@ -18888,7 +18576,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/crew_quarters/bar) "bad" = ( @@ -18973,10 +18661,6 @@ name = "Hydroponics Desk"; req_access_txt = "35" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/hydroponics) "bao" = ( @@ -18998,10 +18682,6 @@ name = "Hydroponics Desk"; req_access_txt = "35" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/hydroponics) "baq" = ( @@ -19055,6 +18735,9 @@ /obj/structure/chair/comfy/black{ dir = 4 }, +/obj/structure/sign/painting/library{ + pixel_y = -32 + }, /turf/open/floor/wood, /area/library) "bay" = ( @@ -19127,7 +18810,7 @@ /obj/item/radio/intercom{ pixel_y = -29 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/vacant_room/office) "baK" = ( @@ -19212,12 +18895,7 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/vacant_room/commissary) "baX" = ( @@ -19455,30 +19133,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/hallway/secondary/exit) -"bbI" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bbJ" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port) "bbK" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/components/binary/valve, /turf/open/floor/plating, /area/maintenance/port) @@ -19830,7 +19485,7 @@ /turf/open/floor/plating, /area/maintenance/port) "bcM" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 9 }, @@ -20044,6 +19699,7 @@ /obj/effect/mapping_helpers/airlock/unres{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bdr" = ( @@ -20074,6 +19730,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/open/floor/plating, /area/maintenance/port) "bdu" = ( @@ -20436,24 +20095,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"bew" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 6 - }, -/turf/open/floor/plating, -/area/maintenance/port) "bex" = ( /obj/machinery/button/door{ id = "qm_warehouse"; @@ -20671,12 +20312,6 @@ }, /turf/open/floor/plating, /area/chapel/main) -"bfc" = ( -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/maintenance/port) "bfe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 @@ -20716,9 +20351,6 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, /obj/structure/cable/yellow{ icon_state = "1-8" }, @@ -20869,7 +20501,7 @@ pixel_y = -24 }, /obj/structure/cable/yellow, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bfR" = ( @@ -20905,7 +20537,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bfX" = ( @@ -20954,7 +20586,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bgc" = ( @@ -20968,7 +20600,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/exit) "bge" = ( @@ -21056,7 +20688,7 @@ dir = 1; pixel_y = -22 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) "bgu" = ( @@ -21333,6 +20965,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bhh" = ( @@ -21465,10 +21098,6 @@ name = "mech bay" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/science/robotics/mechbay) "bhv" = ( @@ -21539,6 +21168,7 @@ id = "robotics"; name = "robotics lab shutters" }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/science/robotics/lab) "bhA" = ( @@ -21562,6 +21192,7 @@ id = "rnd"; name = "research lab shutters" }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/science/lab) "bhE" = ( @@ -21669,8 +21300,10 @@ /turf/open/floor/plasteel/white, /area/science/research) "bhV" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/science/lab) "bhW" = ( /obj/machinery/door/poddoor/shutters{ @@ -21863,13 +21496,8 @@ id = "chemistry_shutters"; name = "Chemistry shutters" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /obj/machinery/cell_charger, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/medical/apothecary) "biy" = ( @@ -22123,11 +21751,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"bja" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/maintenance/port/fore) "bjb" = ( /obj/machinery/conveyor{ id = "garbage" @@ -22252,7 +21875,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/quartermaster/storage) "bjr" = ( @@ -22633,7 +22256,6 @@ /area/maintenance/disposal) "bkD" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/port) "bkE" = ( @@ -22769,6 +22391,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/carpet/royalblue, /area/crew_quarters/heads/captain) "bld" = ( @@ -22870,6 +22493,7 @@ name = "Plumbing Factory"; req_access_txt = "5; 33" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/apothecary) "blo" = ( @@ -22896,12 +22520,7 @@ id = "chemistry_shutters"; name = "Chemistry shutters" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/medical/apothecary) "blq" = ( @@ -22992,7 +22611,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/obj/machinery/mecha_part_fabricator, +/obj/machinery/modular_fabricator/exosuit_fab, /turf/open/floor/plasteel, /area/science/robotics/lab) "blC" = ( @@ -23052,19 +22671,14 @@ /area/science/research) "blI" = ( /obj/machinery/rnd/destructive_analyzer, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/science/lab) "blJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /obj/machinery/rnd/production/protolathe/department/science, /turf/open/floor/plasteel, /area/science/lab) "blK" = ( +/obj/machinery/modular_fabricator/component_printer, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -23192,6 +22806,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/storage) "bmh" = ( @@ -23235,6 +22850,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "bmt" = ( @@ -23336,6 +22952,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/storage) "bmI" = ( @@ -23591,7 +23208,7 @@ /obj/machinery/firealarm{ pixel_y = 27 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/quartermaster/office) "bnK" = ( @@ -23708,6 +23325,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) "bnV" = ( @@ -23908,10 +23526,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "box" = ( @@ -23926,36 +23541,9 @@ /obj/structure/noticeboard{ pixel_y = 32 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/plasteel, -/area/science/research) -"boz" = ( -/obj/machinery/door/poddoor/preopen{ - id = "Biohazard"; - name = "biohazard containment door" - }, -/obj/effect/turf_decal/bot, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) -"boA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/science/lab) "boB" = ( /turf/closed/wall, /area/science/lab) @@ -24041,12 +23629,7 @@ name = "Cargo Desk"; req_access_txt = "31" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "boU" = ( @@ -24124,6 +23707,7 @@ id = "hop"; name = "Privacy Shutters" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) "bpa" = ( @@ -24429,9 +24013,6 @@ }, /turf/open/floor/plasteel, /area/science/robotics/lab) -"bqe" = ( -/turf/closed/wall/r_wall, -/area/science/explab) "bqf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -24481,7 +24062,7 @@ /obj/machinery/light_switch{ pixel_x = -27 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/quartermaster/office) "bqp" = ( @@ -24635,6 +24216,7 @@ name = "Medbay Reception"; req_access_txt = "5" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bqR" = ( @@ -24786,11 +24368,6 @@ }, /turf/open/floor/plasteel, /area/science/robotics/lab) -"brr" = ( -/obj/machinery/door/firedoor/heavy, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/science/explab) "brs" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/eastright{ @@ -24806,6 +24383,7 @@ }, /obj/item/folder/white, /obj/item/pen, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/science/robotics/lab) "brt" = ( @@ -24820,77 +24398,15 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"brv" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"bry" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, +"brG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/door/airlock/research{ - name = "Experimentation Lab"; - req_access_txt = "47" - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"brz" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/table, -/obj/item/paper_bin{ - pixel_y = 6 - }, -/obj/item/pen, -/obj/item/hand_labeler, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"brH" = ( -/obj/machinery/light{ dir = 4 }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/shuttledock) -"brI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "brM" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=8"; @@ -24922,41 +24438,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/office) -"brP" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"brQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) "brS" = ( /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) @@ -25094,11 +24575,8 @@ name = "Medbay Reception"; req_access_txt = "5" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bst" = ( @@ -25119,6 +24597,7 @@ name = "Robotics Lab"; req_access_txt = "29" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/robotics/lab) "bsx" = ( @@ -25293,15 +24772,6 @@ "btp" = ( /turf/open/floor/plating, /area/maintenance/starboard) -"btq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/structure/closet/crate/science, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) "bts" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=8"; @@ -25596,10 +25066,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) -"buu" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/explab) "bux" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -26035,37 +25501,6 @@ /obj/structure/table, /turf/open/floor/plasteel, /area/security/checkpoint/supply) -"bvO" = ( -/turf/open/floor/plasteel/white, -/area/science/explab) -"bvQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/shuttledock) -"bvR" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) "bvS" = ( /obj/machinery/conveyor{ dir = 8; @@ -26217,7 +25652,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) "bwj" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 4 }, @@ -26377,7 +25812,7 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bwE" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/firealarm{ dir = 8; pixel_x = 24 @@ -26418,12 +25853,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bwI" = ( @@ -26533,6 +25963,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/qm) "bwU" = ( @@ -26620,10 +26051,11 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/supply) "bxa" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/blue{ dir = 8 }, @@ -26729,9 +26161,6 @@ }, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) -"bxt" = ( -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "bxu" = ( /turf/closed/wall, /area/quartermaster/qm) @@ -26750,6 +26179,7 @@ name = "Quartermaster"; req_access_txt = "41" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/qm) "bxx" = ( @@ -26787,6 +26217,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) "bxI" = ( @@ -26870,6 +26301,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) "bxY" = ( @@ -26901,7 +26333,7 @@ dir = 8; pixel_x = 24 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) "byc" = ( @@ -26960,10 +26392,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/server) "byi" = ( @@ -26981,6 +26410,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/security/checkpoint/science) "byk" = ( @@ -27074,12 +26504,6 @@ }, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) -"byx" = ( -/obj/structure/closet/crate, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) "byz" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -27124,7 +26548,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/quartermaster/qm) "byD" = ( @@ -27647,15 +27071,12 @@ /obj/machinery/door/airlock/medical/glass{ name = "Recovery Room" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bzJ" = ( @@ -27697,9 +27118,6 @@ }, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) -"bzO" = ( -/turf/open/floor/engine, -/area/science/explab) "bzP" = ( /obj/machinery/computer/cargo{ dir = 4 @@ -27766,9 +27184,6 @@ /obj/machinery/shower{ dir = 8 }, -/obj/machinery/light{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -27795,16 +27210,13 @@ /turf/open/floor/plating, /area/security/checkpoint/medical) "bzX" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/structure/disposalpipe/segment{ dir = 9 }, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/cryo) "bAb" = ( @@ -27940,24 +27352,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"bAo" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "bAp" = ( /obj/structure/chair, /turf/open/floor/plasteel/dark, @@ -27974,16 +27368,13 @@ name = "Chemistry Lab"; req_access_txt = "5; 33" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/structure/disposalpipe/segment, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/apothecary) "bAs" = ( @@ -28054,12 +27445,7 @@ name = "Server Room"; req_access_txt = "30" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/server) "bAC" = ( @@ -28190,10 +27576,6 @@ }, /turf/open/floor/plating, /area/storage/tech) -"bAR" = ( -/obj/machinery/rnd/experimentor, -/turf/open/floor/engine, -/area/science/explab) "bAS" = ( /obj/item/radio/intercom{ pixel_y = -35 @@ -28245,10 +27627,7 @@ name = "Chemistry Desk"; req_access_txt = "33" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/medical/apothecary) "bBe" = ( @@ -28360,7 +27739,7 @@ /obj/machinery/status_display/evac{ pixel_y = -32 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ dir = 8 }, @@ -28376,9 +27755,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bBt" = ( -/obj/machinery/camera/autoname{ - dir = 1 - }, /obj/structure/disposalpipe/junction/flip{ dir = 8 }, @@ -28630,7 +28006,7 @@ /obj/machinery/light_switch{ pixel_y = -23 }, -/obj/item/twohanded/required/kirbyplants/dead, +/obj/item/kirbyplants/dead, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) "bCg" = ( @@ -28677,34 +28053,6 @@ /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) -"bCl" = ( -/obj/machinery/light, -/obj/structure/sign/warning/nosmoking{ - pixel_y = -32 - }, -/obj/machinery/camera/autoname{ - dir = 1 - }, -/turf/open/floor/engine, -/area/science/explab) -"bCm" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) "bCn" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -28842,14 +28190,11 @@ /turf/open/floor/plasteel, /area/security/checkpoint/medical) "bCN" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/structure/disposalpipe/segment{ dir = 6 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/cryo) "bCO" = ( @@ -28857,14 +28202,11 @@ /turf/open/floor/plating, /area/medical/cryo) "bCQ" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/cryo) "bCR" = ( @@ -28885,11 +28227,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/storage) -"bCS" = ( -/obj/structure/table, -/obj/item/surgicaldrill, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "bCT" = ( /obj/machinery/newscaster{ pixel_x = -30 @@ -28954,21 +28291,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/science/storage) -"bDh" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "bDi" = ( /obj/structure/sign/warning/docking{ pixel_y = 32 @@ -29235,16 +28557,13 @@ name = "Main Hall"; req_access_txt = "5" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/structure/cable/yellow{ icon_state = "1-2" }, /obj/effect/mapping_helpers/airlock/unres, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bEf" = ( @@ -29276,6 +28595,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/storage) "bEh" = ( @@ -29496,7 +28816,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/storage/tech) "bEV" = ( @@ -29510,7 +28829,6 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/storage/tech) "bEW" = ( @@ -29521,7 +28839,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/storage/tech) "bEX" = ( @@ -29535,7 +28852,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/storage/tech) "bEZ" = ( @@ -29578,6 +28894,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/storage/tech) "bFf" = ( @@ -29619,6 +28936,9 @@ /area/medical/morgue) "bFo" = ( /obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "bFp" = ( @@ -29626,6 +28946,10 @@ dir = 8 }, /obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "bFw" = ( @@ -29706,6 +29030,7 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/genetics) "bFF" = ( @@ -29873,12 +29198,6 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/exit) "bGk" = ( @@ -29915,7 +29234,6 @@ }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/storage/tech) "bGs" = ( @@ -30274,6 +29592,9 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "bHC" = ( @@ -30375,6 +29696,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/storage) "bHW" = ( @@ -30388,6 +29710,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "bIa" = ( @@ -30399,7 +29727,7 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, -/obj/structure/disposalpipe/junction, +/obj/structure/disposalpipe/sorting/wrap, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bIc" = ( @@ -30488,15 +29816,10 @@ name = "Operating Theatre"; req_access_txt = "45" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bIm" = ( @@ -30552,12 +29875,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bIr" = ( @@ -30686,16 +30004,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/storage) -"bIK" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "bIL" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, @@ -30703,10 +30011,7 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bIM" = ( @@ -30750,6 +30055,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/mixing) "bIT" = ( @@ -31108,6 +30414,9 @@ /area/quartermaster/miningdock) "bKm" = ( /obj/structure/sign/warning/vacuum/external, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, /turf/closed/wall, /area/quartermaster/miningdock) "bKn" = ( @@ -31133,7 +30442,7 @@ /turf/open/floor/plasteel, /area/quartermaster/miningdock) "bKq" = ( -/obj/machinery/mineral/equipment_vendor, +/obj/machinery/vendor/mining, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "bKr" = ( @@ -31142,7 +30451,6 @@ }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/storage/tech) "bKs" = ( @@ -31154,7 +30462,6 @@ }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/storage/tech) "bKt" = ( @@ -31307,24 +30614,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"bKM" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/medicine, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/item/reagent_containers/spray/cleaner, -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/medical/storage) "bKN" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -31342,12 +30631,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/sorting) "bKQ" = ( @@ -31571,28 +30855,10 @@ dir = 8 }, /turf/open/floor/plating{ - initial_gas_mix = "o2=0.01;n2=0.01"; + initial_gas_mix = "o2=0.01;n2=0.01;TEMP=293.15"; luminosity = 2 }, /area/science/test_area) -"bLs" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) "bLu" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance, @@ -31600,7 +30866,6 @@ /area/maintenance/port/aft) "bLv" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/port/aft) "bLw" = ( @@ -31749,10 +31014,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plating, /area/maintenance/aft) "bLQ" = ( @@ -31896,7 +31157,6 @@ /area/science/xenobiology) "bMs" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/science/research) "bMt" = ( @@ -31931,7 +31191,7 @@ /obj/machinery/atmospherics/components/binary/pump/on{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/layer3, +/obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/engine, /area/science/mixing/chamber) "bMy" = ( @@ -32060,7 +31320,7 @@ /obj/machinery/firealarm{ pixel_y = 24 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/engine/atmos) "bMQ" = ( @@ -32133,9 +31393,6 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/structure/cable/yellow{ icon_state = "1-8" }, @@ -32222,6 +31479,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 5 }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix{ + dir = 1 + }, /turf/open/floor/engine, /area/science/mixing/chamber) "bNx" = ( @@ -32477,16 +31737,6 @@ }, /turf/open/floor/plasteel, /area/tcommsat/computer) -"bOp" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "bOq" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 8 @@ -32555,17 +31805,17 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "bOy" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 + dir = 6 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 + dir = 10 }, -/turf/open/floor/plasteel, -/area/science/misc_lab) +/turf/open/floor/plasteel/white, +/area/science/lab) "bOz" = ( /obj/structure/chair/stool, /turf/open/floor/plasteel/white, @@ -32604,9 +31854,7 @@ /obj/machinery/atmospherics/components/binary/pump/on{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_pump/layer1{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/engine, /area/science/mixing/chamber) "bOG" = ( @@ -32857,7 +32105,6 @@ /area/engine/atmos) "bPn" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/aft) "bPo" = ( @@ -33343,8 +32590,11 @@ /turf/open/floor/plasteel/white, /area/medical/storage) "bQG" = ( -/obj/machinery/atmospherics/pipe/simple{ - dir = 6 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 1 }, /turf/open/floor/plating, /area/maintenance/starboard/fore) @@ -33369,6 +32619,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/tcommsat/computer) "bQO" = ( @@ -33443,6 +32694,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/engineering) "bRo" = ( @@ -33487,12 +32739,7 @@ name = "Atmospherics Blast Door" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bRr" = ( @@ -33509,10 +32756,6 @@ name = "Security Office"; req_access_txt = "63" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel/white, @@ -33586,12 +32829,7 @@ name = "Distribution Loop"; req_access_txt = "24" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bRD" = ( @@ -34053,10 +33291,7 @@ /obj/structure/cable/yellow{ icon_state = "1-4" }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 1; - sortType = 10 - }, +/obj/structure/disposalpipe/sorting/wrap/flip, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bSX" = ( @@ -34083,12 +33318,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/cmo) "bTa" = ( @@ -34187,12 +33417,6 @@ "bTl" = ( /turf/open/floor/engine, /area/science/misc_lab) -"bTo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/misc_lab) "bTr" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -34292,10 +33516,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "bTO" = ( @@ -34372,6 +33592,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/patients_rooms) "bUc" = ( @@ -34522,12 +33743,6 @@ }, /turf/open/floor/plasteel, /area/tcommsat/computer) -"bUB" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "bUE" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -34658,7 +33873,7 @@ /turf/open/floor/plasteel/white/corner, /area/engine/atmos) "bUU" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/machinery/atmospherics/miner/station/n2o, /turf/open/floor/engine/n2o, /area/engine/atmos) "bUV" = ( @@ -34701,7 +33916,7 @@ /obj/machinery/light_switch{ pixel_x = 27 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ dir = 8 }, @@ -34985,6 +34200,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/patients_rooms) "bWj" = ( @@ -35064,6 +34280,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/tcommsat/computer) "bWv" = ( @@ -35646,15 +34863,10 @@ /turf/open/floor/engine/plasma, /area/engine/atmos) "bXZ" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bYa" = ( @@ -35688,13 +34900,10 @@ req_access_txt = "39" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/virology) "bYe" = ( @@ -35783,16 +34992,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"bYo" = ( -/obj/structure/table, -/obj/machinery/computer/security/telescreen{ - dir = 8; - name = "Test Chamber Monitor"; - network = list("test") - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/science/misc_lab) "bYp" = ( /obj/structure/sign/warning/securearea{ pixel_x = -32 @@ -35804,7 +35003,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bYq" = ( @@ -35938,7 +35137,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/engine/break_room) "bYP" = ( @@ -35973,7 +35172,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bYU" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/atmospherics/miner/station/toxins, /turf/open/floor/engine/plasma, /area/engine/atmos) "bYV" = ( @@ -36238,7 +35437,7 @@ /turf/open/floor/engine/plasma, /area/engine/atmos) "bZM" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -36460,7 +35659,6 @@ /area/engine/atmos) "caI" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 4 }, @@ -36602,7 +35800,7 @@ /area/science/misc_lab) "cbe" = ( /obj/effect/turf_decal/bot, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/science/nanite) "cbf" = ( @@ -37120,10 +36318,10 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 9 }, /turf/open/floor/plating, @@ -37175,7 +36373,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "ccB" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/machinery/atmospherics/miner/station/carbon_dioxide, /turf/open/floor/engine/co2, /area/engine/atmos) "ccC" = ( @@ -37203,12 +36401,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/virology) "ccH" = ( @@ -37413,9 +36606,6 @@ /obj/structure/sign/departments/minsky/engineering/engineering{ pixel_y = -32 }, -/obj/machinery/camera/autoname{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "cdt" = ( @@ -37822,6 +37012,12 @@ /obj/structure/sign/warning/vacuum/external{ pixel_y = -32 }, +/obj/machinery/advanced_airlock_controller{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "ceW" = ( @@ -37954,6 +37150,12 @@ req_access_txt = "12" }, /obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "cfw" = ( @@ -38114,10 +37316,7 @@ /area/engine/atmos) "cfU" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/chemistry) "cfW" = ( @@ -38127,10 +37326,7 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/chemistry) "cfX" = ( @@ -38152,10 +37348,7 @@ /turf/open/floor/plating, /area/maintenance/aft) "cfY" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/chemistry) "cfZ" = ( @@ -38282,9 +37475,6 @@ dir = 8 }, /obj/structure/closet/emcloset, -/obj/machinery/camera/autoname{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/port/aft) "cgE" = ( @@ -38515,12 +37705,7 @@ /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/science/xenobiology) "chs" = ( @@ -38873,18 +38058,13 @@ /turf/closed/wall/r_wall, /area/engine/atmos) "ciz" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "ciC" = ( @@ -39153,6 +38333,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engineering) "cjo" = ( @@ -39160,12 +38341,6 @@ /turf/open/floor/plasteel, /area/construction) "cjr" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 6 }, @@ -39516,6 +38691,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) "ckQ" = ( @@ -39652,6 +38828,9 @@ req_access_txt = "10; 13" }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/aft) "clt" = ( @@ -39834,14 +39013,14 @@ /turf/open/floor/plasteel, /area/engine/engineering) "clT" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/machinery/atmospherics/miner/station/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/station/oxygen, /turf/open/floor/engine/o2, /area/engine/atmos) "clW" = ( @@ -40139,11 +39318,11 @@ /area/construction) "cmY" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 9 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) @@ -40326,9 +39505,6 @@ /obj/machinery/camera/autoname{ dir = 4 }, -/obj/machinery/keycard_auth{ - pixel_y = 24 - }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "cnx" = ( @@ -40364,8 +39540,8 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/item/twohanded/rcl/pre_loaded, -/obj/item/twohanded/rcl/pre_loaded, +/obj/item/rcl/pre_loaded, +/obj/item/rcl/pre_loaded, /turf/open/floor/plasteel, /area/engine/engineering) "cnC" = ( @@ -40387,12 +39563,6 @@ /turf/open/floor/plating, /area/maintenance/aft) "cnE" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, @@ -40402,6 +39572,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cnG" = ( @@ -40533,6 +39704,10 @@ "cop" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "coq" = ( @@ -40726,6 +39901,26 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/closed/wall/r_wall, /area/medical/virology) +"coX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/bot, +/obj/machinery/suit_storage_unit/exploration, +/obj/item/radio/intercom{ + pixel_y = 22 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "coZ" = ( /obj/structure/closet/secure_closet/engineering_electrical, /turf/open/floor/plasteel, @@ -40835,7 +40030,7 @@ /obj/structure/sign/warning/electricshock{ pixel_x = -32 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/engine/engineering) "cps" = ( @@ -40851,6 +40046,9 @@ /obj/item/storage/toolbox/electrical{ pixel_y = 5 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, /turf/open/floor/plasteel, /area/engine/engineering) "cpv" = ( @@ -40898,6 +40096,9 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/bridge) "cpG" = ( @@ -40930,6 +40131,12 @@ /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 5 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "cpO" = ( @@ -40967,7 +40174,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/engine/engine_smes) "cpT" = ( @@ -41167,6 +40374,8 @@ pixel_x = 38; pixel_y = 6 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "cqu" = ( @@ -41174,6 +40383,9 @@ name = "External Access"; req_access_txt = "13" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "cqw" = ( @@ -41362,7 +40574,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plating, /area/engine/engineering) "crk" = ( @@ -41622,12 +40834,7 @@ name = "Genetics Research"; req_access_txt = "5; 9; 68" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/genetics) "csr" = ( @@ -41697,7 +40904,6 @@ /area/engine/engineering) "csM" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) "csN" = ( @@ -41778,6 +40984,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/genetics) "csY" = ( @@ -41822,7 +41029,6 @@ /obj/structure/sign/warning/securearea{ pixel_y = -32 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) "cto" = ( @@ -41923,10 +41129,6 @@ /turf/open/floor/plasteel/white, /area/maintenance/aft) "ctG" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/medical{ name = "Morgue"; @@ -42171,6 +41373,8 @@ name = "Autopsy Room B"; req_access_txt = "6;5" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cuv" = ( @@ -42178,6 +41382,8 @@ name = "Autopsy Room A"; req_access_txt = "6;5" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cuw" = ( @@ -42325,18 +41531,13 @@ name = "MiniSat Service Bay"; req_one_access_txt = "65" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "cuO" = ( @@ -42380,8 +41581,6 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/structure/disposalpipe/sorting/mail/flip{ dir = 8; sortType = 6 @@ -42389,6 +41588,12 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cuV" = ( @@ -42401,6 +41606,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cuW" = ( @@ -42411,6 +41622,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cuX" = ( @@ -42536,10 +41753,6 @@ name = "Surgery Maintenance"; req_access_txt = "45" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/structure/disposalpipe/segment, @@ -42729,10 +41942,13 @@ /area/maintenance/aft) "cvE" = ( /obj/machinery/door/window/eastleft{ + dir = 2; name = "Medical Delivery"; req_access_txt = "5" }, -/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, @@ -42761,6 +41977,7 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, +/obj/machinery/vending/wardrobe/medi_wardrobe, /turf/open/floor/plasteel/white, /area/medical/storage) "cvI" = ( @@ -42793,15 +42010,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/genetics) "cvK" = ( @@ -42967,9 +42179,6 @@ }, /obj/item/storage/box/bodybags, /obj/item/pen, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - dir = 4 - }, /turf/open/floor/plasteel/white, /area/medical/genetics) "cwh" = ( @@ -43069,7 +42278,7 @@ "cwu" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, -/area/crew_quarters/heads/cmo) +/area/maintenance/aft) "cwv" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 6 @@ -43107,20 +42316,16 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/cmo) -"cwB" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/crew_quarters/heads/cmo) "cwD" = ( /obj/structure/chair/office{ dir = 4 }, /obj/effect/landmark/start/atmospheric_technician, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 10 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 + dir = 8 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -43225,12 +42430,13 @@ /obj/effect/landmark/start/lawyer, /turf/open/floor/wood, /area/lawoffice) -"cxn" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/shuttledock) +"cxr" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate, +/obj/item/pickaxe, +/obj/item/mining_scanner, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "cxA" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -43374,7 +42580,6 @@ "czJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) "czK" = ( @@ -43400,7 +42605,6 @@ "czQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/starboard/aft) "czT" = ( @@ -43410,15 +42614,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, /obj/structure/disposalpipe/segment{ dir = 9 }, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "czU" = ( @@ -43453,10 +42657,6 @@ /area/maintenance/starboard/aft) "cAe" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -43653,7 +42853,7 @@ dir = 8 }, /turf/open/floor/plating, -/area/crew_quarters/heads/cmo) +/area/maintenance/aft) "cAS" = ( /obj/structure/table, /obj/item/folder/white, @@ -43687,9 +42887,6 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/cmo) -"cAU" = ( -/turf/closed/wall, -/area/ai_monitored/turret_protected/ai) "cAV" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -43726,9 +42923,6 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/cmo) -"cAX" = ( -/turf/open/floor/plating, -/area/crew_quarters/heads/cmo) "cAY" = ( /obj/structure/bed, /obj/item/bedsheet/medical, @@ -43774,7 +42968,7 @@ "cBd" = ( /obj/structure/closet/firecloset, /turf/open/floor/plating, -/area/crew_quarters/heads/cmo) +/area/maintenance/aft) "cBe" = ( /obj/machinery/power/apc/auto_name/west{ pixel_x = -24 @@ -43986,7 +43180,7 @@ /obj/structure/table/reinforced, /obj/machinery/cell_charger, /obj/item/stock_parts/cell/high/plus, -/obj/item/twohanded/rcl/pre_loaded, +/obj/item/rcl/pre_loaded, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) "cBN" = ( @@ -44106,18 +43300,13 @@ name = "Operating Theatre"; req_access_txt = "45" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cCq" = ( @@ -44238,13 +43427,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"cCZ" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/turf/open/space/basic, -/area/space/nearstation) "cDe" = ( /obj/structure/closet/radiation, /turf/open/floor/plasteel, @@ -44472,7 +43654,6 @@ "cDQ" = ( /obj/structure/sign/warning/vacuum/external, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -44825,10 +44006,7 @@ /obj/machinery/camera/autoname{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side{ dir = 9 }, @@ -45468,7 +44646,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/mecha_part_fabricator, +/obj/machinery/modular_fabricator/exosuit_fab, /turf/open/floor/plasteel, /area/science/robotics/lab) "cHX" = ( @@ -45520,7 +44698,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/science/robotics/lab) "cIf" = ( @@ -45596,14 +44774,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"cLx" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume, -/obj/machinery/advanced_airlock_controller{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "cMm" = ( /obj/effect/spawner/structure/window/plasma/reinforced, /turf/open/floor/plating, @@ -45656,6 +44826,11 @@ }, /turf/open/floor/plasteel/airless/solarpanel, /area/solar/starboard/aft) +"cNi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "cNG" = ( /turf/open/floor/plasteel, /area/quartermaster/sorting) @@ -45690,28 +44865,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/sorting) -"cNS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) -"cNT" = ( -/turf/closed/wall, -/area/science/shuttledock) -"cNU" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "cNW" = ( /turf/closed/wall, /area/maintenance/starboard/aft) @@ -45762,7 +44915,6 @@ /area/maintenance/starboard/aft) "cOT" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/starboard/aft) "cPl" = ( @@ -45775,10 +44927,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "cPA" = ( @@ -45794,6 +44942,9 @@ /obj/machinery/door/airlock/external{ req_access_txt = "13" }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "cPI" = ( @@ -45803,6 +44954,9 @@ /obj/machinery/door/airlock/external{ req_access_txt = "13" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "cQz" = ( @@ -45825,6 +44979,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"cRa" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/plasma/five, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "cRP" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -46150,7 +45310,7 @@ /turf/open/floor/plating, /area/maintenance/central/secondary) "cTE" = ( -/obj/machinery/computer/shuttle/mining{ +/obj/machinery/computer/shuttle_flight/mining{ dir = 8 }, /obj/effect/turf_decal/tile/yellow, @@ -46171,6 +45331,8 @@ req_access_txt = "12" }, /obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plating, /area/maintenance/starboard/aft) "cTJ" = ( @@ -46232,6 +45394,17 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"cUo" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/quartermaster/exploration_prep) "cUS" = ( /obj/machinery/atmospherics/pipe/layer_manifold, /turf/closed/wall, @@ -46248,36 +45421,41 @@ }, /turf/open/floor/plating, /area/storage/emergency/port) -"cWR" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 +"cWG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/door/firedoor/border_only, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"cWR" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plating, /area/maintenance/aft) -"cYY" = ( -/obj/effect/landmark/blobstart, -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/engine, -/area/science/explab) -"cZa" = ( +"cYu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 + dir = 5 }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) +"cZI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 + dir = 1 }, -/turf/closed/wall, -/area/maintenance/starboard/aft) +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "cZK" = ( /turf/closed/wall, /area/medical/sleeper) @@ -46334,7 +45512,6 @@ /area/ai_monitored/turret_protected/ai) "dgB" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/central) "dgK" = ( @@ -46346,15 +45523,6 @@ dir = 10 }, /area/science/research) -"dgS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light_switch{ - pixel_x = -20 - }, -/turf/open/floor/plasteel/white, -/area/science/lab) "dhq" = ( /obj/machinery/computer/cryopod{ pixel_y = 25 @@ -46376,6 +45544,11 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/cmo) +"dil" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/turf/open/floor/plasteel/white, +/area/quartermaster/exploration_prep) "diw" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 4; @@ -46491,6 +45664,14 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"dnB" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, +/area/maintenance/starboard) "doR" = ( /obj/machinery/door/airlock/research{ name = "Xenobiology Lab"; @@ -46499,43 +45680,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"dpK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/shuttledock) -"dpT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "dqp" = ( /obj/machinery/door/airlock/security/glass{ name = "Holding Area"; @@ -46547,11 +45694,11 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/exit) "dqr" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -46560,9 +45707,12 @@ "drr" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/aft) +"drM" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/white, +/area/quartermaster/exploration_prep) "dsL" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -46599,7 +45749,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/cmo) "dud" = ( @@ -46608,6 +45758,12 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit) +"duJ" = ( +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "dvq" = ( /obj/machinery/airalarm{ pixel_y = 23 @@ -46646,10 +45802,7 @@ /turf/open/floor/plating, /area/hallway/secondary/entry) "dyt" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/mixing) "dyE" = ( @@ -46681,7 +45834,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/engineering) "dCN" = ( @@ -46749,6 +45901,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/janitor) "dIi" = ( @@ -46787,8 +45942,22 @@ icon_state = "1-2" }, /mob/living/simple_animal/kalo, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, /turf/open/floor/plasteel, /area/janitor) +"dLB" = ( +/obj/machinery/telecomms/processor/preset_exploration, +/obj/machinery/airalarm/server{ + dir = 4; + pixel_x = -28 + }, +/turf/open/floor/circuit/telecomms/server, +/area/quartermaster/exploration_dock) "dMZ" = ( /obj/item/transfer_valve{ pixel_x = -5 @@ -46820,6 +45989,24 @@ }, /turf/closed/wall, /area/maintenance/port/aft) +"dOJ" = ( +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/closed/wall, +/area/quartermaster/miningdock) +"dOP" = ( +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"dOV" = ( +/obj/machinery/computer/shuttle_flight/custom_shuttle/exploration{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "dPH" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -46843,7 +46030,7 @@ /turf/open/floor/plasteel, /area/engine/engineering) "dRK" = ( -/obj/machinery/computer/shuttle/labor{ +/obj/machinery/computer/shuttle_flight/labor{ dir = 4 }, /obj/effect/turf_decal/stripes/line{ @@ -46880,12 +46067,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "dUI" = ( @@ -46922,10 +46104,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "dWK" = ( @@ -46939,6 +46117,25 @@ /obj/effect/landmark/start/botanist, /turf/open/floor/plasteel, /area/hydroponics) +"dXb" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/medicine, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/reagent_containers/spray/cleaner, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/item/glove_box, +/turf/open/floor/plasteel/white, +/area/medical/storage) "dYq" = ( /turf/closed/wall, /area/science/nanite) @@ -46953,11 +46150,14 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "dYO" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 1 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 + dir = 4 }, /turf/open/floor/plating, /area/maintenance/starboard/fore) @@ -46966,7 +46166,7 @@ pixel_y = -29 }, /obj/machinery/light/small, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "dZJ" = ( @@ -46985,19 +46185,8 @@ }, /turf/open/floor/plating, /area/construction) -"ebe" = ( -/obj/machinery/door/firedoor/window, -/turf/closed/wall, -/area/hallway/secondary/exit) -"ecb" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "ecA" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -47035,6 +46224,12 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"edM" = ( +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/starboard/aft) "edX" = ( /obj/structure/showcase/cyborg/old{ dir = 8; @@ -47062,12 +46257,7 @@ name = "biohazard containment door" }, /obj/effect/turf_decal/bot, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "efx" = ( @@ -47080,12 +46270,7 @@ /area/engine/atmos) "egv" = ( /obj/effect/landmark/event_spawn, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "ehf" = ( @@ -47159,19 +46344,11 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "elq" = ( /obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 @@ -47233,27 +46410,14 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"eoE" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "epm" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/aft) "epI" = ( @@ -47262,13 +46426,19 @@ }, /turf/open/floor/plasteel, /area/science/nanite) -"erv" = ( -/obj/structure/window/reinforced{ - dir = 4 +"equ" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) +/obj/machinery/telecomms/server/presets/exploration, +/obj/machinery/camera/autoname{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/circuit/telecomms/server, +/area/quartermaster/exploration_dock) "esj" = ( /obj/structure/table, /obj/item/cartridge/medical{ @@ -47301,20 +46471,8 @@ }, /turf/closed/wall, /area/hallway/secondary/entry) -"ete" = ( -/obj/machinery/light/small, -/obj/structure/frame/computer{ - desc = "Looks like the board never made it to this one."; - dir = 8; - name = "shuttle console frame" - }, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) "euk" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 }, @@ -47344,13 +46502,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/gravity_generator) "ewy" = ( @@ -47364,12 +46519,7 @@ /obj/machinery/camera/autoname{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engine_smes) "exU" = ( @@ -47388,10 +46538,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "eyF" = ( @@ -47406,24 +46553,34 @@ input_dir = 2; output_dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/quartermaster/miningdock) -"eyO" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/crew_quarters/heads/cmo) "ezj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) +"ezu" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) +"eAe" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) "eAi" = ( /obj/machinery/button/door{ id = "commissaryshutter"; @@ -47442,23 +46599,16 @@ }, /turf/open/floor/plasteel, /area/vacant_room/commissary) +"eAu" = ( +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "eAL" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"eCB" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/security/main) "eCO" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/east{ @@ -47467,10 +46617,7 @@ /turf/open/floor/circuit, /area/ai_monitored/turret_protected/aisat/hallway) "eEb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 9 - }, +/obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plasteel, /area/engine/engineering) "eEq" = ( @@ -47527,10 +46674,18 @@ }, /turf/open/floor/plasteel/white, /area/medical/patients_rooms) -"eIx" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/shuttledock) +"eKo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "eKL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -47550,10 +46705,7 @@ /turf/open/floor/plasteel, /area/engine/gravity_generator) "eLl" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "eMs" = ( @@ -47582,12 +46734,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "eMY" = ( @@ -47607,6 +46754,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/aft) +"eQc" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/quartermaster/exploration_dock) "eQq" = ( /obj/structure/table, /obj/item/surgical_drapes, @@ -47627,16 +46784,12 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/item/kirbyplants/random, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engineering) "eRg" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -47664,7 +46817,6 @@ /area/maintenance/fore/secondary) "eRN" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/layer_manifold{ dir = 1 }, @@ -47677,7 +46829,7 @@ /turf/open/floor/carpet/orange, /area/crew_quarters/dorms) "eSn" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "eTT" = ( @@ -47700,9 +46852,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, @@ -47718,12 +46867,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"eVE" = ( -/obj/machinery/vending/cola/random, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) "eVL" = ( /obj/machinery/light_switch{ pixel_y = 28 @@ -47744,12 +46887,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel, /area/security/brig) "eXi" = ( @@ -47765,12 +46902,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "eZK" = ( @@ -47781,6 +46913,13 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/quartermaster/storage) +"fau" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/quartermaster/exploration_dock) "faP" = ( /obj/machinery/computer/security/telescreen/turbine{ dir = 1; @@ -47789,6 +46928,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) +"fbf" = ( +/obj/machinery/light_switch{ + pixel_x = -22 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "fcj" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 1 @@ -47818,10 +46963,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "feJ" = ( @@ -47880,10 +47022,7 @@ /turf/open/floor/plating, /area/maintenance/aft) "fgI" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/locker) "fhv" = ( @@ -47895,14 +47034,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 5 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/port) "fia" = ( @@ -47914,7 +47045,6 @@ "fjl" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/aft) "fkS" = ( @@ -48051,10 +47181,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/mixing) "ftp" = ( @@ -48080,6 +47207,18 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"fwx" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/quartermaster/exploration_prep) "fwB" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -48100,12 +47239,12 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "fyi" = ( @@ -48122,7 +47261,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/security/prison) "fBs" = ( @@ -48165,7 +47304,6 @@ /area/medical/patients_rooms) "fBU" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, @@ -48243,6 +47381,10 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"fGK" = ( +/obj/machinery/anesthetic_machine, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "fGN" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -48264,6 +47406,15 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat/atmos) +"fJe" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "fJH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 @@ -48283,6 +47434,12 @@ }, /turf/open/floor/plating, /area/medical/medbay/central) +"fJJ" = ( +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/fore/secondary) "fKx" = ( /obj/structure/cable{ icon_state = "1-2" @@ -48323,6 +47480,12 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/aft) "fMx" = ( @@ -48332,12 +47495,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "fNg" = ( @@ -48370,12 +47528,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "fNU" = ( @@ -48399,6 +47552,15 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"fPT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "fSj" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 9 @@ -48411,6 +47573,12 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"fSE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "fTc" = ( /obj/machinery/porta_turret/ai{ dir = 4 @@ -48479,7 +47647,7 @@ /turf/open/floor/plasteel/white, /area/medical/cryo) "fWm" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/engine/atmos) "fWV" = ( @@ -48500,27 +47668,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/security/main) -"fXp" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "fXJ" = ( /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ @@ -48549,10 +47696,7 @@ name = "Cryogenic Lounge" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "fXU" = ( @@ -48572,6 +47716,19 @@ }, /turf/closed/wall, /area/engine/engineering) +"gad" = ( +/obj/machinery/door/window{ + base_state = "rightsecure"; + dir = 4; + icon_state = "rightsecure"; + layer = 4.1; + name = "Secondary AI Core Access"; + obj_integrity = 300; + pixel_x = 4; + req_access_txt = "16" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "gay" = ( /obj/structure/closet/secure_closet/personal/patient, /obj/machinery/button/door{ @@ -48597,10 +47754,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) "gby" = ( @@ -48635,7 +47789,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light{ dir = 1 }, @@ -48654,6 +47808,9 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 4 }, +/obj/structure/sign/painting/library{ + pixel_x = -32 + }, /turf/open/floor/wood, /area/library) "gfL" = ( @@ -48713,16 +47870,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) -"gko" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance/three, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) "gky" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -48745,30 +47892,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/carpet/green, /area/chapel/main) -"gmo" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ +"gmf" = ( +/obj/structure/chair/office/light{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/obj/effect/landmark/start/exploration, +/turf/open/floor/plasteel/white, +/area/quartermaster/exploration_prep) "gmC" = ( /obj/machinery/button/door{ id = "QMLoaddoor"; @@ -48796,13 +47929,14 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plasteel, /area/quartermaster/storage) -"gmW" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 +"gmT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/plasteel, -/area/hallway/primary/central) +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "gmY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 @@ -48833,6 +47967,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plating, /area/maintenance/port/aft) +"gpn" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on, +/turf/open/floor/plating, +/area/maintenance/starboard) "gpE" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/security_space_law, @@ -48848,7 +47986,7 @@ /turf/open/floor/wood, /area/lawoffice) "gpT" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "gqm" = ( @@ -48856,7 +47994,7 @@ /turf/closed/wall, /area/maintenance/aft) "gqE" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "gqL" = ( @@ -48914,7 +48052,7 @@ /obj/effect/turf_decal/tile/green{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/camera/autoname{ dir = 1 }, @@ -48933,21 +48071,12 @@ }, /turf/open/floor/plasteel, /area/science/nanite) -"gwf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +"gwp" = ( +/obj/structure/sign/painting/library{ + pixel_x = -32 }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/turf/open/floor/wood, +/area/library) "gxa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 10 @@ -48971,7 +48100,6 @@ dir = 4 }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "gyH" = ( @@ -48980,30 +48108,6 @@ }, /turf/open/floor/plating, /area/storage/tech) -"gzp" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) "gzS" = ( /obj/structure/sign/warning/securearea{ pixel_x = -32 @@ -49024,8 +48128,11 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "gAD" = ( -/obj/machinery/atmospherics/pipe/simple{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 }, /turf/open/floor/plating, /area/maintenance/starboard/fore) @@ -49045,8 +48152,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) @@ -49056,7 +48163,7 @@ name = "Engineering External Access"; req_access_txt = "10;13" }, -/obj/machinery/atmospherics/pipe/layer_manifold, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) "gDk" = ( @@ -49088,16 +48195,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"gEe" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "gES" = ( /obj/item/radio/intercom{ pixel_x = 28; @@ -49124,16 +48221,9 @@ }, /turf/closed/wall, /area/ai_monitored/turret_protected/aisat_interior) -"gHj" = ( -/obj/structure/closet/radiation, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/science/explab) "gHw" = ( /obj/structure/sign/warning/vacuum/external, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, @@ -49163,33 +48253,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) -"gJN" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/fore) "gKu" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -49267,7 +48330,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "gMz" = ( @@ -49342,12 +48405,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engineering) "gOp" = ( @@ -49373,15 +48431,15 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "gQd" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/turf/closed/wall, +/area/quartermaster/exploration_dock) +"gQK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 4 }, -/obj/machinery/conveyor{ - dir = 8; - id = "SciLoad" - }, -/turf/open/floor/plating, -/area/science/shuttledock) +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "gQQ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -49391,7 +48449,7 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "gRK" = ( /obj/machinery/door/airlock/command/glass{ @@ -49402,10 +48460,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "gSw" = ( @@ -49429,16 +48484,13 @@ name = "AI Core"; req_access_txt = "65" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) "gVE" = ( @@ -49458,6 +48510,12 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"gXl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/fore/secondary) "gXs" = ( /obj/structure/lattice, /turf/open/space/basic, @@ -49521,10 +48579,7 @@ name = "Supermatter Engine Room"; req_access_txt = "10" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/engine, /area/engine/engineering) "gZW" = ( @@ -49551,10 +48606,7 @@ /area/science/misc_lab) "hap" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "hbz" = ( @@ -49563,7 +48615,6 @@ /area/crew_quarters/dorms) "hch" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 }, @@ -49571,7 +48622,6 @@ /area/security/processing) "hco" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -49600,7 +48650,6 @@ /area/maintenance/port/fore) "heE" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -49631,7 +48680,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 5 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/secondary/exit) "hhs" = ( @@ -49642,6 +48690,12 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"hhQ" = ( +/obj/machinery/modular_computer/console/preset/curator{ + dir = 1 + }, +/turf/open/floor/wood, +/area/library) "hiA" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/stripes/line{ @@ -49650,25 +48704,26 @@ /obj/machinery/camera/autoname, /turf/open/floor/plasteel/white, /area/medical/virology) -"hjb" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" +"hjM" = ( +/obj/machinery/light{ + dir = 8 }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) +"hjZ" = ( +/obj/structure/disposalpipe/segment, /obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1; - sortType = 24 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) +/turf/open/floor/plating, +/area/maintenance/fore/secondary) +"hmb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "hmr" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -49685,10 +48740,7 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "hox" = ( -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side{ dir = 5 }, @@ -49704,7 +48756,6 @@ pixel_y = 32 }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plating, /area/hallway/secondary/entry) @@ -49737,6 +48788,21 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"hrL" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -26 + }, +/turf/open/floor/plasteel/white/corner, +/area/quartermaster/exploration_prep) "hsJ" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 @@ -49764,7 +48830,6 @@ /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "hwv" = ( @@ -49780,6 +48845,15 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"hyd" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/quartermaster/exploration_prep) "hzE" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ dir = 1 @@ -49870,7 +48944,6 @@ /area/maintenance/solars/port/fore) "hHp" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/layer_manifold{ dir = 8 }, @@ -49883,9 +48956,7 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, /turf/open/floor/plasteel, /area/engine/engineering) "hIA" = ( @@ -49896,10 +48967,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "hJF" = ( @@ -49914,6 +48982,12 @@ }, /turf/open/floor/plasteel/dark, /area/security/courtroom) +"hJM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "hKl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /turf/open/floor/plasteel, @@ -50008,23 +49082,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) -"hUH" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/hallway/secondary/exit) -"hUJ" = ( -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "hVa" = ( /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/cmo) @@ -50045,34 +49105,34 @@ "hZk" = ( /turf/open/floor/plasteel, /area/science/nanite) -"hZO" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/shuttledock) "hZW" = ( /obj/machinery/atmospherics/pipe/simple/green/visible, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/engine/atmos) +"ibu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/port/aft) "ibG" = ( /obj/machinery/nanite_programmer, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark, /area/science/nanite) +"ibT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/starboard/aft) "icS" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/nanite) -"idi" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 8 - }, -/obj/machinery/door/airlock/external, -/turf/open/floor/plating, -/area/science/shuttledock) "idY" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -50128,29 +49188,6 @@ /obj/item/clipboard, /turf/open/floor/plating, /area/maintenance/aft) -"ifv" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/book/manual/wiki/experimentor, -/turf/open/floor/plasteel/white/corner{ - dir = 4 - }, -/area/science/explab) -"ifA" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Diner" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "igW" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -50165,7 +49202,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/power/apc/auto_name/east{ pixel_x = 24 }, @@ -50185,25 +49222,23 @@ name = "MiniSat Antechamber"; req_one_access_txt = "65" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "iiH" = ( -/obj/machinery/autolathe, +/obj/machinery/modular_fabricator/autolathe, /obj/machinery/door/window/westleft{ name = "Cargo Desk"; req_access_txt = "31" }, /obj/effect/turf_decal/stripes/box, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "ijc" = ( @@ -50215,17 +49250,11 @@ /obj/machinery/door/airlock/public/glass{ name = "Chapel" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/carpet/green, /area/chapel/main) "ijO" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) "ilg" = ( @@ -50248,40 +49277,11 @@ /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) "ilA" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/layer_manifold, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"ilH" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 + icon_state = "1-2" }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plating, /area/maintenance/starboard/fore) "ilV" = ( @@ -50305,6 +49305,15 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"imO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/effect/turf_decal/pool/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "ins" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/yellow/visible{ @@ -50334,8 +49343,9 @@ /area/maintenance/aft) "ioM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 + dir = 5 }, +/obj/effect/turf_decal/pool, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "iqg" = ( @@ -50364,6 +49374,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) +"iqY" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white/side, +/area/quartermaster/exploration_prep) "irc" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -50375,10 +49397,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engineering) "irt" = ( @@ -50388,6 +49407,21 @@ /obj/machinery/light, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"irP" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard) "isc" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel/dark, @@ -50420,28 +49454,13 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) -"itG" = ( -/obj/item/beacon, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 5 - }, -/turf/open/floor/engine, -/area/science/misc_lab) "itZ" = ( /obj/structure/sign/poster/official/help_others, /turf/closed/wall, /area/crew_quarters/cryopods) "ivk" = ( /obj/effect/turf_decal/tile/neutral, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "iwb" = ( @@ -50490,6 +49509,12 @@ }, /obj/machinery/atmospherics/pipe/simple/general/visible, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "ixu" = ( @@ -50501,6 +49526,12 @@ }, /turf/open/floor/plating, /area/engine/engineering) +"ixD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/closed/wall, +/area/maintenance/fore/secondary) "iyj" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -50516,23 +49547,33 @@ /area/crew_quarters/bar) "iyI" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) +"iyL" = ( +/obj/machinery/vendor/exploration, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "iyW" = ( /obj/machinery/door/airlock/public/glass{ name = "Primary Tool Storage" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/primary) +"izs" = ( +/obj/structure/table/reinforced, +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plasteel/white, +/area/quartermaster/exploration_prep) "izv" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 @@ -50551,19 +49592,6 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/medical) -"izG" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) "iAb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 @@ -50575,7 +49603,6 @@ /area/crew_quarters/dorms) "iCy" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plating, /area/hallway/secondary/entry) @@ -50604,21 +49631,8 @@ "iDR" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) -"iDY" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Central Access" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "iEJ" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod One" @@ -50633,12 +49647,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "iFW" = ( @@ -50676,13 +49685,6 @@ }, /turf/open/floor/grass, /area/hydroponics/garden) -"iHV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/door/airlock/external, -/turf/open/floor/plating, -/area/science/shuttledock) "iIi" = ( /obj/structure/cable{ icon_state = "1-2" @@ -50719,8 +49721,15 @@ "iNn" = ( /obj/structure/reagent_dispensers/cooking_oil, /obj/machinery/camera/autoname, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) +"iQj" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "iRx" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -50734,11 +49743,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"iSL" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/quartermaster/qm) "iTt" = ( /obj/item/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; @@ -50767,7 +49771,7 @@ /turf/open/floor/plasteel/white, /area/medical/storage) "iXl" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/crew_quarters/heads/captain) "iXm" = ( @@ -50787,39 +49791,11 @@ }, /turf/open/floor/plasteel, /area/security/processing) -"iYh" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port) "iYm" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/securearea{ pixel_y = -32 }, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 }, @@ -50839,10 +49815,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Garden" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics/garden) "jac" = ( @@ -50869,12 +49842,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Library" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/carpet, /area/library) "jfI" = ( @@ -50906,10 +49874,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side{ dir = 5 }, @@ -50932,28 +49897,8 @@ "jik" = ( /obj/structure/window/reinforced/fulltile, /obj/structure/transit_tube/horizontal, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) -"jjq" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "jjB" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -50974,6 +49919,9 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "jkG" = ( @@ -51038,6 +49986,9 @@ pixel_x = 8; pixel_y = 24 }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "jrc" = ( @@ -51060,17 +50011,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit) -"jrx" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "jsn" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 @@ -51101,10 +50041,7 @@ /area/hallway/secondary/exit) "jtC" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "jtK" = ( @@ -51126,7 +50063,6 @@ dir = 4 }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "jvq" = ( @@ -51138,25 +50074,8 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ dir = 4 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/port) -"jvC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "jvL" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -51177,6 +50096,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"jwd" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) "jyC" = ( /obj/machinery/light{ dir = 8 @@ -51203,7 +50132,6 @@ pixel_y = -32 }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/processing) "jAD" = ( @@ -51270,25 +50198,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) -"jHW" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/mineral/plasma, -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/misc_lab) "jHY" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -51364,14 +50273,6 @@ /obj/item/stack/cable_coil, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"jNR" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/hallway/secondary/exit) "jOu" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -51505,12 +50406,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/engine, /area/engine/engineering) "jXf" = ( @@ -51535,19 +50431,45 @@ /area/security/detectives_office) "jZP" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/miningdock) -"kaB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/plasteel/white/side{ - dir = 6 +"kbn" = ( +/obj/machinery/door/window{ + base_state = "leftsecure"; + dir = 8; + icon_state = "leftsecure"; + layer = 4.1; + name = "Tertiary AI Core Access"; + obj_integrity = 300; + pixel_x = -3; + req_access_txt = "16" }, -/area/science/shuttledock) +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"kch" = ( +/turf/closed/wall/r_wall, +/area/quartermaster/exploration_prep) "kcM" = ( /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) +"kdl" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/newscaster{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/maintenance/starboard) "kds" = ( /obj/structure/closet/lasertag/blue, /obj/machinery/light{ @@ -51564,6 +50486,15 @@ }, /turf/open/floor/plasteel, /area/security/courtroom) +"ken" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/structure/sign/painting/library{ + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/library) "keG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /turf/open/floor/plasteel/grimy, @@ -51577,15 +50508,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) -"kfJ" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) "kgJ" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -51601,10 +50523,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/research) "kgY" = ( @@ -51619,12 +50538,6 @@ /obj/item/kitchen/rollingpin, /turf/open/floor/plasteel, /area/hallway/secondary/service) -"khm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/shuttledock) "khP" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -51643,18 +50556,11 @@ /area/medical/medbay/central) "kiV" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) -"kjb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "kjY" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -51677,18 +50583,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit) -"kkp" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"kkD" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "klg" = ( /obj/machinery/airalarm{ dir = 1; @@ -51800,7 +50694,7 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "kso" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/library) "ksr" = ( @@ -51829,6 +50723,22 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat/hallway) +"ksB" = ( +/obj/machinery/light_switch{ + pixel_x = -22 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) +"ksZ" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "ktb" = ( /obj/structure/cable/yellow{ icon_state = "1-8" @@ -51874,19 +50784,9 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) -"kva" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "kwh" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -51931,22 +50831,6 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) -"kwP" = ( -/obj/effect/spawner/lootdrop/maintenance, -/obj/item/stack/sheet/mineral/copper, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"kxC" = ( -/obj/machinery/computer/rdconsole/experiment{ - dir = 1 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/science/explab) "kyh" = ( /obj/effect/turf_decal/stripes/corner, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -51957,14 +50841,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"kyZ" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) "kzh" = ( /obj/machinery/camera/autoname{ dir = 8 @@ -51983,12 +50859,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "kAG" = ( @@ -52008,10 +50879,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "kDx" = ( @@ -52038,6 +50906,9 @@ }, /obj/effect/mapping_helpers/airlock/locked, /obj/structure/barricade/wooden/crude, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, /turf/open/floor/plating, /area/maintenance/fore/secondary) "kEo" = ( @@ -52054,12 +50925,31 @@ /area/ai_monitored/turret_protected/ai) "kER" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 9 }, /turf/open/floor/plating, /area/quartermaster/storage) +"kEW" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science{ + name = "exploration preperation room"; + req_access_txt = "49" + }, +/turf/open/floor/plasteel/white, +/area/quartermaster/exploration_prep) "kGA" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, @@ -52081,22 +50971,10 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/item/kirbyplants/random, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engineering) -"kGS" = ( -/obj/machinery/door/poddoor/preopen{ - id = "telelab"; - name = "test chamber blast door" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/engine, -/area/science/explab) "kHt" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume{ dir = 1 @@ -52217,7 +51095,6 @@ }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/engineering) "kPd" = ( @@ -52263,10 +51140,7 @@ name = "Hydroponics"; req_access_txt = "35" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics) "kRC" = ( @@ -52322,20 +51196,15 @@ pixel_x = 3 }, /obj/item/lighter, -/obj/item/clothing/glasses/hud/security/sunglasses, /turf/open/floor/carpet/red, /area/security/detectives_office) -"kSp" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 9 +"kSz" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/crew_quarters/fitness) +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "kTx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 @@ -52393,10 +51262,7 @@ id = "kitchen"; name = "kitchen shutters" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "kWa" = ( @@ -52446,13 +51312,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"kXE" = ( -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "kXU" = ( /obj/structure/closet, /obj/structure/disposalpipe/segment{ @@ -52462,13 +51321,33 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"kZg" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple{ - dir = 5 +"kYc" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/north, +/turf/open/floor/plasteel/white/side, +/area/quartermaster/exploration_prep) +"kZs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 }, /turf/open/floor/plating, -/area/maintenance/starboard/fore) +/area/maintenance/starboard/aft) +"lan" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "laC" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -52490,6 +51369,18 @@ }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) +"lce" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard) "lcf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -52510,6 +51401,21 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plating, /area/storage/tech) +"les" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 2; + external_pressure_bound = 120; + name = "server vent" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/quartermaster/exploration_dock) "let" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -52605,27 +51511,12 @@ /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, /turf/open/floor/plasteel/grimy, /area/ai_monitored/turret_protected/aisat_interior) -"lkz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "llD" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "lmX" = ( @@ -52642,33 +51533,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/sorting) -"loO" = ( -/obj/machinery/atmospherics/pipe/simple, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "lpu" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "lpK" = ( @@ -52686,7 +51559,7 @@ /turf/open/floor/plating, /area/maintenance/starboard) "lpU" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plating, /area/storage/tech) "lpZ" = ( @@ -52702,12 +51575,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) "lqg" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "lqJ" = ( @@ -52715,6 +51583,18 @@ /obj/item/flashlight/lantern, /turf/open/floor/plasteel/dark, /area/chapel/main) +"lrp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/camera/autoname{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "lrU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 4 @@ -52761,14 +51641,6 @@ }, /turf/open/floor/plating, /area/engine/atmos) -"ltd" = ( -/obj/structure/sign/warning/securearea{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) "lty" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 9 @@ -52791,18 +51663,11 @@ /area/science/misc_lab) "ltH" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 }, /turf/open/floor/plating/airless, /area/maintenance/solars/port/aft) -"ltQ" = ( -/obj/structure/reagent_dispensers/water_cooler, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/shuttledock) "luc" = ( /obj/effect/decal/cleanable/dirt, /turf/closed/wall, @@ -52829,7 +51694,7 @@ /turf/open/floor/plasteel/dark, /area/science/nanite) "lxj" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/crew_quarters/locker) "lxt" = ( @@ -52862,10 +51727,6 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "lzk" = ( @@ -52902,7 +51763,7 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "lAC" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/science/xenobiology) "lCh" = ( @@ -52946,6 +51807,20 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/science/mixing) +"lFj" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/quartermaster/exploration_prep) "lHj" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -52962,12 +51837,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "lHu" = ( @@ -52983,25 +51853,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"lHF" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 4 - }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/hallway/secondary/exit) -"lIm" = ( -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/maintenance/port/aft) "lIv" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Laser Room"; @@ -53014,10 +51865,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/engine, /area/engine/engineering) "lJA" = ( @@ -53042,7 +51890,6 @@ id = "hosspace"; name = "space shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "lJS" = ( @@ -53067,6 +51914,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/effect/turf_decal/pool{ + dir = 4 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "lLp" = ( @@ -53172,7 +52022,6 @@ /area/engine/engineering) "lQt" = ( /obj/effect/spawner/structure/window, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/science/mixing) "lQB" = ( @@ -53183,16 +52032,13 @@ name = "MiniSat Chamber Observation"; req_one_access_txt = "65" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) "lQG" = ( @@ -53234,18 +52080,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) -"lQZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/conveyor{ - dir = 8; - id = "SciLoad" - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/shuttledock) "lRl" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -53260,6 +52094,13 @@ }, /turf/open/floor/plating, /area/security/processing) +"lRv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/rdconsole/experiment{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/misc_lab) "lSc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -53286,12 +52127,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"lUu" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/science/shuttledock) "lVX" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -53325,6 +52160,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"lXn" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "lXL" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -53332,6 +52174,18 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"lXT" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/starboard) "lZU" = ( /obj/structure/cable/yellow{ icon_state = "1-8" @@ -53339,10 +52193,6 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 4 - }, -/obj/machinery/meter, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, @@ -53490,6 +52340,15 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_atmos{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "mgt" = ( @@ -53535,11 +52394,56 @@ }, /turf/open/floor/plasteel, /area/quartermaster/sorting) +"miz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard) +"miD" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/quartermaster/exploration_dock) "miR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/engine/atmos) +"mjb" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/mineral/plasma, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/item/book/manual/wiki/experimentor, +/turf/open/floor/plasteel, +/area/science/misc_lab) "mjr" = ( /obj/machinery/vending/wardrobe/bar_wardrobe, /turf/open/floor/wood, @@ -53563,42 +52467,20 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) -"mjT" = ( -/obj/machinery/vending/snack/random, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) "mkg" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "mkj" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat/hallway) -"mko" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/layer_manifold, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "mlA" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -53612,17 +52494,27 @@ /obj/machinery/camera/autoname{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"mnE" = ( +/obj/machinery/door/airlock/hatch{ + name = "Exploration Telecommunications"; + req_access_txt = "61" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/exploration_dock) "mnP" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/port/aft) "moo" = ( @@ -53632,6 +52524,11 @@ }, /turf/closed/wall, /area/maintenance/aft) +"mov" = ( +/obj/machinery/door/firedoor/heavy, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/quartermaster/exploration_prep) "moM" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -53644,10 +52541,6 @@ name = "Supermatter Engine Room"; req_access_txt = "10" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel/dark, /area/engine/engineering) "mqa" = ( @@ -53672,7 +52565,6 @@ /area/engine/atmos) "mrT" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, @@ -53685,6 +52577,10 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /turf/open/floor/plating, /area/engine/engineering) +"mso" = ( +/obj/machinery/vending/wardrobe/det_wardrobe, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) "msQ" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -53693,7 +52589,7 @@ name = "Cargo Escape Airlock" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 8 + dir = 10 }, /turf/open/floor/plating, /area/hallway/secondary/exit) @@ -53729,10 +52625,6 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -53747,60 +52639,16 @@ /area/ai_monitored/turret_protected/aisat_interior) "muV" = ( /obj/effect/turf_decal/tile/blue, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) -"mvx" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"mvE" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"mvX" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"mwY" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Central Access" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 +"mxx" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "mxY" = ( /obj/structure/cable{ icon_state = "1-2" @@ -53836,12 +52684,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "mAe" = ( @@ -53850,14 +52693,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"mAf" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 1 - }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "mAO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 6 @@ -53882,6 +52717,19 @@ }, /turf/open/floor/plasteel, /area/science/nanite) +"mBr" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/quartermaster/exploration_prep) "mBv" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -53930,12 +52778,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -53950,12 +52792,7 @@ name = "Labor Shuttle"; req_access_txt = "63" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/processing) "mCE" = ( @@ -53978,12 +52815,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/engine, /area/engine/engineering) "mDX" = ( @@ -54007,13 +52839,18 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat/hallway) +"mFI" = ( +/obj/structure/lattice, +/turf/closed/wall, +/area/quartermaster/exploration_dock) "mFT" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, /obj/structure/closet/radiation, /obj/effect/turf_decal/bot, /obj/machinery/camera{ - c_tag = "Cargo Security Post" + c_tag = "Incinerator"; + network = list("ss13", "turbine") }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) @@ -54058,43 +52895,14 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"mIZ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 9 - }, -/turf/closed/wall, -/area/maintenance/starboard/aft) "mJd" = ( /obj/structure/disposalpipe/segment{ dir = 5 }, /turf/open/floor/plasteel/white, /area/science/mixing) -"mJM" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/closet/l3closet/scientist, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/camera/autoname{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "mKh" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, @@ -54111,12 +52919,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "mLv" = ( @@ -54124,7 +52927,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/prison) "mLS" = ( @@ -54148,7 +52950,6 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ dir = 8 }, @@ -54184,10 +52985,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "mNN" = ( @@ -54205,13 +53003,19 @@ /turf/open/floor/plasteel/white, /area/science/mixing) "mPA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/structure/disposalpipe/segment{ dir = 9 }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"mPG" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/structure/closet/radiation, +/turf/open/floor/plasteel, +/area/science/misc_lab) "mRa" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -54221,10 +53025,7 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "mRG" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side{ dir = 9 }, @@ -54243,12 +53044,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/research) "mSf" = ( @@ -54278,11 +53074,6 @@ }, /turf/open/floor/wood, /area/library) -"mUS" = ( -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/shuttledock) "mWI" = ( /obj/machinery/power/terminal{ dir = 1 @@ -54321,6 +53112,17 @@ }, /turf/open/floor/plasteel/dark, /area/security/courtroom) +"mZC" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/maintenance/starboard) "naq" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 @@ -54349,9 +53151,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"nbv" = ( -/turf/closed/wall, -/area/science/explab) "nfj" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -54375,6 +53174,19 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) +"niv" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "njR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 4 @@ -54400,12 +53212,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "nkd" = ( @@ -54418,7 +53224,7 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ dir = 8 }, -/obj/structure/disposalpipe/junction/flip, +/obj/structure/disposalpipe/sorting/wrap/flip, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "nkW" = ( @@ -54433,7 +53239,6 @@ /area/ai_monitored/turret_protected/aisat/hallway) "nmc" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, @@ -54458,18 +53263,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/fore) "nnC" = ( @@ -54490,7 +53283,7 @@ req_access_txt = "13" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 + dir = 8 }, /turf/open/floor/plating, /area/maintenance/starboard/aft) @@ -54519,16 +53312,6 @@ /obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plating, /area/maintenance/port/aft) -"nqZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "nrq" = ( /obj/machinery/light/small{ dir = 8 @@ -54562,6 +53345,13 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"nsO" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/landmark/start/exploration, +/turf/open/floor/plasteel/white, +/area/quartermaster/exploration_prep) "ntg" = ( /obj/machinery/telecomms/hub/preset, /obj/effect/turf_decal/tile/neutral{ @@ -54579,6 +53369,13 @@ }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) +"nuz" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Pure to Mix" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "nuH" = ( /obj/machinery/door/airlock/external{ name = "Security External Airlock"; @@ -54590,6 +53387,18 @@ }, /turf/open/floor/plating, /area/security/main) +"nuW" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/quartermaster/exploration_prep) "nvb" = ( /obj/effect/turf_decal/bot, /obj/machinery/vending/cigarette, @@ -54602,11 +53411,11 @@ /obj/machinery/atmospherics/pipe/layer_manifold, /turf/closed/wall, /area/maintenance/port/fore) -"nvp" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +"nwC" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/turf/open/floor/plasteel/white, +/area/quartermaster/exploration_prep) "nxv" = ( /obj/machinery/power/apc/auto_name/south{ pixel_y = -24 @@ -54625,21 +53434,9 @@ name = "Central Access" }, /obj/effect/turf_decal/tile/yellow, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) -"nBe" = ( -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "nBC" = ( /obj/machinery/power/turbine{ luminosity = 2 @@ -54649,15 +53446,9 @@ /area/maintenance/disposal/incinerator) "nDb" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plating, /area/maintenance/solars/port/fore) -"nDO" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/engine/atmos) "nEt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 10 @@ -54680,6 +53471,39 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"nFs" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 24 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard) +"nFZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/quartermaster/exploration_dock) +"nGn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "nGv" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -54702,22 +53526,18 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"nHI" = ( -/obj/machinery/conveyor_switch{ - id = "SciLoad" - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/shuttledock) +"nHY" = ( +/obj/structure/easel, +/obj/item/canvas/nineteen_nineteen, +/obj/item/canvas/twentythree_nineteen, +/obj/item/canvas/twentythree_twentythree, +/turf/open/floor/wood, +/area/library) "nIK" = ( /obj/machinery/door/airlock/public/glass{ name = "Central Access" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "nKp" = ( @@ -54743,22 +53563,16 @@ /obj/machinery/light_switch{ pixel_x = 27 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/storage/art) "nKZ" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, /turf/open/floor/plating/airless, /area/maintenance/solars/port/aft) -"nMn" = ( -/obj/machinery/door/firedoor/window, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/shuttledock) "nMH" = ( /obj/machinery/airalarm{ pixel_y = 23 @@ -54881,14 +53695,24 @@ dir = 4 }, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/vacant_room/commissary) +"nXo" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/vacant_room/commissary) +/area/quartermaster/exploration_prep) "nXB" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -54901,10 +53725,6 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) -"nXP" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/engine, -/area/science/explab) "nYd" = ( /obj/item/radio/intercom{ pixel_x = -27 @@ -54973,22 +53793,6 @@ /obj/structure/closet/firecloset, /turf/open/floor/plasteel, /area/hallway/primary/port) -"ocB" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "odd" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -55021,9 +53825,6 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/components/binary/valve{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, @@ -55032,32 +53833,10 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"oeU" = ( -/obj/structure/plasticflaps/opaque, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/conveyor{ - dir = 8; - id = "SciLoad" - }, -/turf/open/floor/plating, -/area/science/shuttledock) "ofT" = ( /obj/machinery/computer/bounty, /turf/open/floor/plasteel, /area/quartermaster/storage) -"ogk" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/crew_quarters/fitness) "ogo" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -55095,17 +53874,9 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/main) "ois" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/grimy, /area/chapel/office) -"ojP" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/shuttledock) "ojR" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -55150,7 +53921,9 @@ /obj/item/stack/sheet/iron/fifty, /obj/item/stack/sheet/iron/fifty, /obj/item/storage/box/lights/mixed, -/obj/machinery/camera/autoname, +/obj/machinery/camera/autoname{ + dir = 8 + }, /turf/open/floor/plasteel, /area/storage/tools) "oof" = ( @@ -55161,31 +53934,12 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) -"ooY" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) "ope" = ( /obj/machinery/vending/wallmed{ pixel_x = -28 @@ -55227,10 +53981,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "oqh" = ( @@ -55238,22 +53989,21 @@ name = "Detective's Office"; req_access_txt = "4" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) -"orP" = ( -/obj/machinery/button/door{ - id = "telelab"; - name = "Test Chamber Blast Doors"; - pixel_x = 25; - req_access_txt = "47" +"oqG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/white, -/area/science/explab) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "osb" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/food/drinks/britcup{ @@ -55261,63 +54011,31 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"osd" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 6; - height = 6; - id = "science_station"; - name = "science shuttle dock"; - width = 9 - }, -/turf/open/space/basic, -/area/space) "ota" = ( /obj/machinery/door/airlock/medical/glass{ name = "Main Hall"; req_access_txt = "5" }, /obj/effect/mapping_helpers/airlock/unres, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/sleeper) -"owq" = ( -/obj/machinery/computer/teleporter{ +"ouL" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ dir = 8 }, /turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat_interior) -"owx" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ +/area/maintenance/fore/secondary) +"owq" = ( +/obj/machinery/computer/teleporter{ dir = 8 }, /turf/open/floor/plating, -/area/maintenance/port/fore) +/area/ai_monitored/turret_protected/aisat_interior) "owD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, +/obj/effect/turf_decal/pool, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "oxm" = ( @@ -55345,6 +54063,13 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"oyU" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "oyY" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -55407,20 +54132,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"oEu" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "oEw" = ( /obj/effect/turf_decal/tile/blue, /obj/structure/bed/roller, @@ -55437,30 +54148,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) -"oFm" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/aft) "oGY" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -55500,10 +54187,6 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) -"oJz" = ( -/obj/structure/lattice, -/turf/closed/wall, -/area/science/shuttledock) "oKe" = ( /obj/machinery/light/small{ dir = 1 @@ -55537,7 +54220,6 @@ /area/quartermaster/storage) "oKT" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, @@ -55574,6 +54256,10 @@ }, /turf/closed/wall/r_wall, /area/engine/atmos) +"oOI" = ( +/obj/item/pool/pool_noodle, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "oOO" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -55638,7 +54324,7 @@ pixel_y = 5 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 6 + dir = 1 }, /turf/open/floor/plasteel, /area/engine/engineering) @@ -55680,15 +54366,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/virology) "oVC" = ( /obj/item/storage/box/lights/mixed, /obj/item/storage/box/lights/mixed, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, /turf/open/floor/plasteel, /area/janitor) "oXE" = ( @@ -55715,10 +54401,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/research) "oYz" = ( @@ -55732,6 +54415,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "oYB" = ( @@ -55757,12 +54441,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "pcB" = ( @@ -55770,10 +54449,7 @@ dir = 4; pixel_x = -22 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side{ dir = 5 }, @@ -55783,23 +54459,15 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) -"pel" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +"pfd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 }, /turf/open/floor/plating, -/area/maintenance/port/fore) +/area/maintenance/starboard/aft) "pgP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55810,16 +54478,8 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 9 }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) -"pgS" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/construction/mining/aux_base) "pic" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -55878,6 +54538,15 @@ dir = 1 }, /area/chapel/main) +"plq" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen"; + name = "kitchen shutters" + }, +/obj/structure/displaycase/forsale/kitchen, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) "pnq" = ( /obj/machinery/atmospherics/pipe/simple/general/hidden{ dir = 9 @@ -55914,6 +54583,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/cryopods) +"ppc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = -20 + }, +/mob/living/simple_animal/crab/Coffee, +/turf/open/floor/plasteel/white, +/area/science/lab) "pph" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume{ dir = 1 @@ -55931,6 +54610,9 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"pqr" = ( +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "pqP" = ( /obj/machinery/light{ dir = 4 @@ -55948,12 +54630,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"psy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ +"prg" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ dir = 1 }, -/turf/open/floor/plasteel/white, -/area/science/explab) +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/quartermaster/exploration_prep) "ptw" = ( /obj/structure/chair/stool, /turf/open/floor/plasteel/white, @@ -55965,14 +54653,6 @@ }, /turf/open/space, /area/solar/starboard/aft) -"ptZ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "pvj" = ( /obj/structure/chair/office, /turf/open/floor/plasteel/grimy, @@ -55986,6 +54666,9 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /obj/structure/barricade/wooden/crude, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/fore/secondary) "pwt" = ( @@ -56045,12 +54728,33 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) +"pAV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/bot, +/obj/machinery/suit_storage_unit/exploration, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "pBe" = ( /obj/item/cigbutt, /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 10 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "pBJ" = ( @@ -56066,6 +54770,18 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/cmo) +"pBW" = ( +/obj/docking_port/stationary{ + dir = 4; + dwidth = 5; + height = 7; + id = "exploration_home"; + name = "Exploration Dock"; + roundstart_template = /datum/map_template/shuttle/exploration; + width = 13 + }, +/turf/open/space/basic, +/area/space) "pDm" = ( /obj/structure/sign/warning/electricshock{ pixel_y = -32 @@ -56076,18 +54792,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/fore) "pDu" = ( @@ -56106,7 +54810,10 @@ /obj/machinery/computer/cargo/request{ dir = 4 }, -/turf/open/floor/plasteel/white, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/science/lab) "pDL" = ( /obj/effect/spawner/lootdrop/two_percent_xeno_egg_spawner, @@ -56138,18 +54845,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/cryo) -"pHo" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) "pHt" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/yellow{ @@ -56161,7 +54856,9 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "pIP" = ( -/obj/machinery/power/apc/auto_name/north, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, /obj/structure/cable/yellow{ icon_state = "0-2" }, @@ -56270,25 +54967,6 @@ /obj/item/toy/plush/carpplushie, /turf/open/floor/plasteel, /area/security/prison) -"pOJ" = ( -/obj/machinery/light_switch{ - pixel_x = 8; - pixel_y = 28 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "pPb" = ( /obj/machinery/firealarm{ dir = 1; @@ -56315,12 +54993,13 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer3, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ + dir = 6 + }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "pPF" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/engineering) "pPH" = ( @@ -56341,7 +55020,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/engineering) "pQE" = ( @@ -56412,6 +55090,14 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) +"pUl" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/effect/landmark/xeno_spawn, +/obj/effect/landmark/blobstart, +/turf/open/floor/engine, +/area/science/misc_lab) "pUr" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 8 @@ -56420,7 +55106,6 @@ /area/lawoffice) "pUS" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, @@ -56433,27 +55118,12 @@ /turf/closed/wall, /area/quartermaster/sorting) "pVd" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "pWN" = ( /turf/open/floor/plasteel, /area/science/misc_lab) -"pWV" = ( -/obj/machinery/advanced_airlock_controller{ - dir = 1; - pixel_y = -24 - }, -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume{ - dir = 8 - }, -/turf/open/floor/plating, -/area/science/shuttledock) "pXg" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 @@ -56471,7 +55141,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/prison) "pXx" = ( @@ -56482,7 +55151,6 @@ /area/medical/medbay/central) "pXU" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, @@ -56545,18 +55213,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) -"qbT" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "qde" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -56572,9 +55228,6 @@ /turf/open/floor/carpet, /area/hallway/secondary/entry) "qea" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -56584,6 +55237,12 @@ }, /turf/open/floor/plasteel, /area/science/nanite) +"qec" = ( +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "qeo" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -56592,18 +55251,13 @@ name = "MiniSat Atmospherics"; req_one_access_txt = "65" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "qev" = ( @@ -56635,10 +55289,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/prison) "qeQ" = ( @@ -56651,10 +55302,7 @@ /turf/open/floor/plasteel, /area/science/nanite) "qfK" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side{ dir = 1 }, @@ -56683,7 +55331,6 @@ /area/maintenance/port/aft) "qjV" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/storage) "qkF" = ( @@ -56707,12 +55354,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "qlT" = ( @@ -56722,13 +55364,22 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/aft) "qmd" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) +"qmf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/exploration_dock) "qmh" = ( /obj/machinery/light/small{ brightness = 3; @@ -56773,7 +55424,6 @@ /area/crew_quarters/bar) "qnV" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, @@ -56821,15 +55471,11 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "qpr" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) "qpP" = ( @@ -56869,31 +55515,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"qrU" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 4 - }, -/area/science/explab) -"qsT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/research{ - name = "Shuttle dock"; - req_access_txt = "47" - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "qto" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 4 @@ -56959,6 +55580,25 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/maintenance/aft) +"qxG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + name = "Exploration Dock Maintenance"; + req_access_txt = "49" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/quartermaster/exploration_prep) "qyN" = ( /obj/effect/turf_decal/delivery, /obj/structure/noticeboard{ @@ -56990,21 +55630,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit) -"qAU" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) "qBf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 9 @@ -57019,12 +55644,7 @@ name = "Brig"; req_access_txt = "63; 42" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/courtroom) "qBJ" = ( @@ -57049,6 +55669,11 @@ }, /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) +"qCe" = ( +/obj/effect/turf_decal/tile/blue, +/mob/living/simple_animal/bot/cleanbot/medbay, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "qDU" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -57057,6 +55682,12 @@ /obj/machinery/rnd/production/techfab/department/security, /turf/open/floor/plasteel, /area/security/main) +"qEq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) "qGt" = ( /obj/machinery/atmospherics/pipe/layer_manifold{ dir = 8 @@ -57072,17 +55703,9 @@ "qGZ" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green, +/obj/item/clothing/glasses/hud/security/sunglasses, /turf/open/floor/carpet/red, /area/security/detectives_office) -"qIW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 6 - }, -/turf/closed/wall, -/area/maintenance/starboard/aft) "qJa" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -57105,17 +55728,6 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) -"qJz" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/door/firedoor/window, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "qJW" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -57134,14 +55746,17 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) +"qKG" = ( +/obj/machinery/door/airlock/science{ + name = "exploration preperation room"; + req_access_txt = "49" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "qKZ" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Power Storage"; @@ -57151,10 +55766,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engineering) "qLr" = ( @@ -57182,10 +55794,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/engine, /area/engine/engineering) "qMj" = ( @@ -57200,9 +55809,6 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 5 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 6 }, @@ -57211,18 +55817,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"qML" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) "qNU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/microwave, @@ -57230,20 +55824,7 @@ /turf/open/floor/plasteel, /area/quartermaster/warehouse) "qOk" = ( -/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/layer3{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, +/turf/open/indestructible/sound/pool, /area/crew_quarters/fitness) "qPr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -57291,7 +55872,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/port/aft) "qSg" = ( @@ -57304,6 +55884,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /turf/open/floor/plating, /area/security/main) "qSE" = ( @@ -57314,15 +55897,10 @@ /turf/open/floor/plating, /area/medical/storage) "qSR" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "qUb" = ( @@ -57332,35 +55910,6 @@ /obj/item/beacon, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"qUc" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"qVo" = ( -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) "qVw" = ( /obj/machinery/porta_turret/ai{ dir = 4 @@ -57378,12 +55927,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "qVS" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "qWm" = ( @@ -57395,17 +55939,17 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"qWx" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, +"qWr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, /turf/open/floor/plating, -/area/ai_monitored/storage/eva) +/area/maintenance/starboard/aft) "qXP" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 10 }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "qYS" = ( @@ -57414,13 +55958,6 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab) -"qZn" = ( -/obj/structure/closet/crate/science, -/obj/effect/turf_decal/box, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) "qZB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 6 @@ -57454,9 +55991,6 @@ /turf/open/floor/plasteel/white, /area/medical/virology) "rex" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -57501,17 +56035,13 @@ pixel_y = 32 }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/processing) "rmG" = ( /obj/machinery/status_display/evac{ pixel_x = 32 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "rmR" = ( @@ -57543,16 +56073,13 @@ name = "MiniSat Chamber Hallway"; req_one_access_txt = "65" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/hallway) "rrj" = ( @@ -57624,7 +56151,7 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 8 }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "ryW" = ( /obj/structure/cable/yellow{ @@ -57687,18 +56214,6 @@ }, /turf/open/floor/plasteel, /area/security/brig) -"rAL" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/light/broken{ - dir = 8 - }, -/obj/structure/closet/crate/radiation, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) "rBf" = ( /obj/machinery/conveyor_switch/oneway{ id = "QMLoad2" @@ -57762,6 +56277,15 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"rEQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "rFv" = ( /obj/structure/sign/warning/electricshock{ pixel_y = -32 @@ -57770,12 +56294,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "rGP" = ( @@ -57819,10 +56338,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/research) "rKc" = ( @@ -57834,12 +56350,6 @@ req_access_txt = "47" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /turf/open/floor/plasteel, /area/science/lab) "rKg" = ( @@ -57877,6 +56387,10 @@ /obj/structure/fans/tiny, /turf/open/floor/plating, /area/security/main) +"rKw" = ( +/obj/machinery/telecomms/hub/preset/exploration, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/quartermaster/exploration_dock) "rKP" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 1 @@ -57903,18 +56417,12 @@ name = "Atmospherics"; req_access_txt = "24" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "rOX" = ( /obj/effect/turf_decal/tile/yellow, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "rOY" = ( @@ -57940,7 +56448,6 @@ /area/quartermaster/storage) "rQX" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/secondary/entry) "rVB" = ( @@ -57958,6 +56465,23 @@ }, /turf/open/floor/wood, /area/crew_quarters/heads/captain) +"rWR" = ( +/turf/closed/wall, +/area/quartermaster/exploration_prep) +"rXd" = ( +/obj/machinery/door/airlock/science{ + name = "exploration shuttle dock"; + req_access_txt = "49" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "rXg" = ( /obj/machinery/door/airlock/engineering{ name = "Starboard Quarter Solar Access"; @@ -57980,6 +56504,11 @@ }, /turf/open/floor/carpet/orange, /area/crew_quarters/dorms) +"rYj" = ( +/obj/structure/table/reinforced, +/obj/item/gps/mining/exploration, +/turf/open/floor/plasteel/white, +/area/quartermaster/exploration_prep) "rYy" = ( /obj/structure/sign/departments/minsky/research/research, /turf/closed/wall/r_wall, @@ -57989,6 +56518,12 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/mixing) +"rYR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/closed/wall, +/area/maintenance/starboard/aft) "rZp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /turf/open/floor/plasteel/grimy, @@ -58000,6 +56535,12 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"rZB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "rZY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 10 @@ -58016,25 +56557,6 @@ /obj/structure/window/reinforced, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"sce" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/shuttledock) -"scz" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 5 - }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/crew_quarters/fitness) "sdz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, @@ -58077,10 +56599,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/prison) "sha" = ( @@ -58105,12 +56624,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/execution/transfer) "shq" = ( @@ -58176,22 +56690,25 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/virology) -"skk" = ( -/obj/effect/spawner/structure/window/reinforced, +"sjP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 10 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "skQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -58235,9 +56752,6 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 1 }, @@ -58246,13 +56760,19 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"smw" = ( +/obj/machinery/advanced_airlock_controller{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume{ + dir = 8 + }, +/turf/open/floor/plating, +/area/quartermaster/exploration_dock) "smH" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/machinery/door/firedoor/window, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -58266,38 +56786,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) -"snh" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "snk" = ( /obj/machinery/door/airlock/engineering{ name = "Port Bow Solar Access"; @@ -58323,18 +56814,6 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/medical) -"soA" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"soQ" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/maintenance/port) "sqB" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -58348,14 +56827,11 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"ssh" = ( -/obj/machinery/power/apc/auto_name/south, -/obj/structure/cable/yellow, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "ssw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "ssF" = ( @@ -58378,6 +56854,24 @@ }, /turf/open/floor/plasteel, /area/science/nanite) +"suZ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"svv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "svU" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -58399,12 +56893,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/teleporter) "sxs" = ( @@ -58451,25 +56940,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) -"syU" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "szj" = ( /obj/structure/window/reinforced{ dir = 1 @@ -58497,6 +56967,10 @@ }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) +"szx" = ( +/obj/machinery/telecomms/bus/preset_exploration, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/quartermaster/exploration_dock) "szT" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -58528,30 +57002,15 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/port/aft) "sBO" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/maintenance/starboard) -"sCF" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "sCT" = ( /obj/machinery/atmospherics/pipe/simple/green/visible, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "sDi" = ( @@ -58565,6 +57024,26 @@ }, /turf/open/floor/wood, /area/bridge/meeting_room) +"sDn" = ( +/obj/machinery/door/window/brigdoor{ + dir = 4; + name = "Telecommunications"; + req_access_txt = "61" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/caution{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/quartermaster/exploration_dock) "sEo" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -58581,10 +57060,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "sGB" = ( @@ -58640,10 +57116,12 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer3, /obj/machinery/advanced_airlock_controller{ pixel_y = 24 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1{ + dir = 1 + }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "sJm" = ( @@ -58696,13 +57174,8 @@ /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) "sNT" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, +/obj/structure/pool_ladder, +/turf/open/indestructible/sound/pool/end, /area/crew_quarters/fitness) "sOs" = ( /obj/machinery/door/airlock/maintenance, @@ -58716,12 +57189,7 @@ /obj/machinery/camera/autoname{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "sPP" = ( @@ -58794,6 +57262,10 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"sWW" = ( +/obj/machinery/telecomms/broadcaster/preset_exploration, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/quartermaster/exploration_dock) "sYn" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -58832,6 +57304,17 @@ "tav" = ( /turf/closed/wall, /area/vacant_room/commissary) +"taT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, +/area/maintenance/starboard) "tbd" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -58867,35 +57350,40 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit) -"tcY" = ( +"tdz" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"tdQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 }, -/obj/machinery/airalarm{ - pixel_y = 23 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 }, -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 2; - pixel_y = 3 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 +/obj/machinery/camera/autoname, +/obj/structure/cable/yellow{ + icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"tep" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"tdz" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/turf/open/floor/plating, +/area/maintenance/starboard) "tgb" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -58925,25 +57413,13 @@ }, /turf/open/floor/carpet/red, /area/crew_quarters/heads/hos) -"tiR" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"tjq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plating, -/area/maintenance/port) +/area/maintenance/starboard/aft) "tjy" = ( /obj/machinery/holopad, /obj/structure/disposalpipe/segment{ @@ -58962,13 +57438,6 @@ dir = 1 }, /area/engine/break_room) -"tmc" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/external, -/turf/open/floor/plating, -/area/science/shuttledock) "tmE" = ( /obj/machinery/cryopod{ dir = 4 @@ -58982,14 +57451,8 @@ /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/cryopods) "tol" = ( -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden/layer1{ + dir = 9 }, /turf/open/floor/plating, /area/maintenance/port/fore) @@ -59031,7 +57494,6 @@ /obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/port/aft) "tsR" = ( @@ -59081,6 +57543,15 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"tuF" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "twe" = ( /obj/machinery/door/airlock/atmos/glass{ name = "Atmospherics Monitoring"; @@ -59090,10 +57561,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "twj" = ( @@ -59122,8 +57590,8 @@ name = "External Access"; req_access_txt = "13" }, -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 }, /turf/open/floor/plating, /area/maintenance/port/aft) @@ -59200,6 +57668,12 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab) +"tEj" = ( +/obj/machinery/computer/objective{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "tEs" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -59217,12 +57691,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness) "tFe" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "tFl" = ( @@ -59239,7 +57708,6 @@ /area/hallway/secondary/exit) "tGp" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/science/xenobiology) "tHa" = ( @@ -59267,45 +57735,13 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit) -"tHH" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +"tIa" = ( +/obj/machinery/light_switch{ + pixel_x = 22 }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit) -"tIu" = ( -/obj/structure/table, -/obj/structure/sign/poster/official/fruit_bowl{ - pixel_x = -32 - }, -/obj/item/reagent_containers/food/drinks/beer/light{ - pixel_y = 5 - }, -/obj/item/reagent_containers/food/drinks/beer{ - pixel_x = -8; - pixel_y = 3 - }, -/obj/item/reagent_containers/food/drinks/beer{ - pixel_x = 10; - pixel_y = 4 - }, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) +/area/quartermaster/exploration_prep) "tIx" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel/white/corner{ dir = 1 }, @@ -59350,10 +57786,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/research) "tKG" = ( @@ -59364,7 +57797,6 @@ /area/science/misc_lab) "tLw" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/disposal) "tLD" = ( @@ -59378,7 +57810,7 @@ /area/tcommsat/computer) "tMl" = ( /obj/effect/turf_decal/loading_area, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "tMn" = ( /obj/structure/cable/yellow{ @@ -59417,18 +57849,13 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "tSQ" = ( @@ -59485,6 +57912,9 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, /turf/open/floor/plating, /area/maintenance/aft) "tVE" = ( @@ -59524,7 +57954,6 @@ /area/space/nearstation) "uaR" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, @@ -59548,7 +57977,7 @@ dir = 1; pixel_y = -24 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/science/nanite) "ucy" = ( @@ -59569,7 +57998,6 @@ /area/medical/medbay/central) "udc" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/structure/disposalpipe/segment{ dir = 9 }, @@ -59584,7 +58012,6 @@ "ufv" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "ufN" = ( @@ -59593,13 +58020,6 @@ }, /turf/open/floor/plasteel, /area/security/courtroom) -"uhf" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance/two, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/shuttledock) "uhH" = ( /obj/item/wrench, /obj/item/weldingtool, @@ -59648,15 +58068,6 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab) -"ulW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "ulX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 9 @@ -59674,7 +58085,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/prison) "unw" = ( @@ -59693,21 +58103,8 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) -"upi" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_y = 6 - }, -/obj/item/stack/sheet/mineral/copper{ - amount = 5 - }, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/shuttledock) "upw" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, @@ -59749,10 +58146,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "urZ" = ( @@ -59770,10 +58164,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/xenobiology) "usz" = ( @@ -59787,12 +58178,7 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engine_smes) "utM" = ( @@ -59824,7 +58210,6 @@ /area/security/main) "uuF" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -59842,6 +58227,13 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/misc_lab) +"uvv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/quartermaster/exploration_dock) "uvC" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -59849,9 +58241,6 @@ /obj/structure/cable/yellow{ icon_state = "1-4" }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 5 }, @@ -59863,12 +58252,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"uww" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "uwI" = ( /obj/machinery/power/smes{ charge = 5e+006 @@ -59885,10 +58268,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/virology) "uwN" = ( @@ -59925,6 +58305,12 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/atmos) +"uyV" = ( +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "uzi" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance"; @@ -59945,6 +58331,25 @@ }, /turf/open/floor/plasteel, /area/science/nanite) +"uAc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/quartermaster/exploration_dock) +"uAR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/pool{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "uCq" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -59973,13 +58378,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) -"uCG" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) "uCO" = ( /obj/machinery/light, /obj/machinery/nanite_program_hub, @@ -59995,10 +58393,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/lawoffice) "uFk" = ( @@ -60010,48 +58405,38 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/virology) -"uHA" = ( -/obj/machinery/firealarm{ - pixel_y = 24 +"uHG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 }, -/obj/structure/disposalpipe/segment{ +/turf/closed/wall/r_wall, +/area/maintenance/solars/port/aft) +"uIv" = ( +/obj/machinery/atmospherics/components/binary/pump{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"uHG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/machinery/computer/security/telescreen{ + name = "Test Chamber Monitor"; + network = list("test"); + pixel_y = 32 }, -/turf/closed/wall/r_wall, -/area/maintenance/solars/port/aft) +/turf/open/floor/plasteel, +/area/science/misc_lab) "uJU" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "uJZ" = ( @@ -60062,7 +58447,6 @@ /area/maintenance/solars/port/aft) "uKe" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plating, /area/hallway/secondary/entry) @@ -60073,35 +58457,6 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) -"uLI" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/plating, -/area/maintenance/starboard) -"uLY" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "External Access"; - req_access_txt = "13" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "uMd" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 @@ -60109,6 +58464,12 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"uNf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "uNq" = ( /obj/effect/spawner/xmastree, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -60137,14 +58498,17 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"uNU" = ( +/obj/effect/turf_decal/tile/brown{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel/white/side{ dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/area/quartermaster/exploration_prep) "uOO" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -60174,10 +58538,6 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ dir = 4 }, @@ -60188,14 +58548,10 @@ /area/quartermaster/miningdock) "uRq" = ( /obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 6 - }, /turf/open/space/basic, /area/space/nearstation) "uRR" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating/airless, /area/maintenance/solars/port/aft) "uSb" = ( @@ -60203,10 +58559,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/locker) "uTj" = ( @@ -60215,7 +58568,7 @@ name = "Engineering External Access"; req_access_txt = "10;13" }, -/obj/machinery/atmospherics/pipe/layer_manifold, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/engine/engineering) "uTz" = ( @@ -60249,13 +58602,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/gravity_generator) "uUy" = ( @@ -60268,9 +58618,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "uWA" = ( @@ -60281,24 +58628,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"uWU" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) "uYl" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/closed/wall, @@ -60330,7 +58659,6 @@ /area/quartermaster/warehouse) "vbZ" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, @@ -60354,27 +58682,12 @@ }, /area/science/research) "vhl" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/port/aft) "vhM" = ( @@ -60395,12 +58708,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side{ dir = 9 }, @@ -60432,7 +58740,6 @@ /area/medical/apothecary) "vke" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/chapel/main) "vkw" = ( @@ -60446,16 +58753,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "vkC" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/science/xenobiology) "vkT" = ( @@ -60465,18 +58768,9 @@ id = "kitchen"; name = "kitchen shutters" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) -"vmv" = ( -/obj/machinery/atmospherics/pipe/simple{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "vnK" = ( /obj/structure/table/glass, /obj/item/clothing/gloves/color/latex, @@ -60522,14 +58816,6 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) -"vpA" = ( -/obj/structure/sign/poster/official/anniversary_vintage_reprint{ - pixel_x = 32 - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/shuttledock) "vpT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 4 @@ -60579,10 +58865,7 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 + dir = 4 }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) @@ -60610,32 +58893,23 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat/hallway) "vsa" = ( -/obj/structure/disposalpipe/segment{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 6 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 6 }, /obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"vsn" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 + icon_state = "0-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 6 }, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) "vsr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 9 @@ -60645,6 +58919,11 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) +"vsJ" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "vsN" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -60658,11 +58937,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/cryopods) -"vtx" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/security/processing) "vtH" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 10 @@ -60677,7 +58951,6 @@ /area/maintenance/fore/secondary) "vus" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) @@ -60742,12 +59015,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/break_room) "vyv" = ( @@ -60777,8 +59045,6 @@ /area/maintenance/starboard/aft) "vzg" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) @@ -60810,20 +59076,10 @@ id = "rnd"; name = "research lab shutters" }, -/obj/machinery/autolathe, +/obj/machinery/modular_fabricator/autolathe, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/lab) -"vBU" = ( -/obj/structure/plasticflaps/opaque, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/conveyor{ - dir = 8; - id = "SciLoad" - }, -/turf/open/floor/plating, -/area/science/shuttledock) "vCb" = ( /obj/machinery/rnd/production/techfab/department/service, /turf/open/floor/plasteel, @@ -60846,7 +59102,6 @@ /area/ai_monitored/turret_protected/aisat_interior) "vCP" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/space) "vDl" = ( @@ -60902,6 +59157,15 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) +"vEM" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/aft) "vFb" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -60929,25 +59193,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/cryo) -"vGb" = ( -/obj/machinery/door/airlock/research{ - name = "Experimentation Lab"; - req_access_txt = "47" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "vGz" = ( /obj/machinery/conveyor{ dir = 4; @@ -60958,20 +59203,20 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plating, /area/quartermaster/storage) +"vGZ" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "vHo" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "rnd2"; name = "research lab shutters" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side{ dir = 10 }, @@ -60994,20 +59239,18 @@ }, /turf/open/floor/plasteel, /area/security/brig) -"vHt" = ( -/obj/structure/closet/l3closet/scientist{ - pixel_x = -2 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, -/turf/open/floor/plasteel, -/area/science/misc_lab) "vHY" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 }, /obj/structure/barricade/wooden, +/obj/machinery/advanced_airlock_controller{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/fore/secondary) "vIm" = ( @@ -61015,6 +59258,12 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, /turf/open/floor/wood, /area/lawoffice) +"vIA" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "vIS" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -61024,6 +59273,18 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"vIT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "vIU" = ( /obj/machinery/hydroponics/soil, /obj/machinery/light{ @@ -61077,6 +59338,12 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) +"vKq" = ( +/obj/structure/table, +/obj/item/surgicaldrill, +/obj/item/glove_box, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "vKs" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -61174,18 +59441,36 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"vPQ" = ( +/obj/item/beacon, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/rnd/experimentor, +/turf/open/floor/engine, +/area/science/misc_lab) "vQH" = ( /obj/machinery/door/airlock/public/glass{ name = "Holodeck Door" }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"vRB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "vRM" = ( /obj/structure/closet/crate/freezer/blood, /obj/machinery/firealarm{ @@ -61208,10 +59493,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/research) "vSE" = ( @@ -61227,7 +59509,6 @@ /area/engine/engineering) "vSJ" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, @@ -61285,20 +59566,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/closed/wall, /area/engine/engineering) -"vYw" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/engine/engineering) "vYD" = ( /obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 5 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 5 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ dir = 8 }, @@ -61315,10 +59587,7 @@ /obj/machinery/camera/autoname{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/xenobiology) "vZp" = ( @@ -61336,6 +59605,18 @@ }, /turf/open/floor/circuit, /area/science/robotics/mechbay) +"waH" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/quartermaster/exploration_prep) "wbj" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -61358,6 +59639,12 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"wbJ" = ( +/obj/structure/table/wood, +/obj/structure/disposalpipe/segment, +/obj/item/storage/crayons, +/turf/open/floor/wood, +/area/library) "wci" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -61388,12 +59675,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Library" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/carpet, /area/library) "wdC" = ( @@ -61446,14 +59728,6 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/fore) "whU" = ( @@ -61488,12 +59762,6 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/fore) "wiC" = ( @@ -61513,6 +59781,15 @@ }, /turf/open/floor/plating, /area/science/nanite) +"wld" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "wlh" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -61532,10 +59809,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/xenobiology) "wlM" = ( @@ -61543,10 +59817,7 @@ pixel_x = -24 }, /obj/structure/cable, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/mixing/chamber) "wnd" = ( @@ -61596,6 +59867,10 @@ }, /turf/open/floor/plating, /area/construction/mining/aux_base) +"wpy" = ( +/obj/effect/landmark/start/exploration, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "wpO" = ( /obj/structure/closet/secure_closet/personal, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -61637,12 +59912,6 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -61691,17 +59960,14 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "wvY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/engine/atmos) "wwp" = ( @@ -61737,9 +60003,8 @@ "wxN" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 + dir = 6 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/starboard/aft) "wyd" = ( @@ -61751,6 +60016,13 @@ }, /turf/closed/wall, /area/maintenance/port/aft) +"wzO" = ( +/obj/effect/spawner/room/threexthree, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "wAt" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -61779,23 +60051,12 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plating, /area/maintenance/aft) -"wCn" = ( -/obj/machinery/door/airlock/research{ - name = "Shuttle dock"; - req_access_txt = "47" - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "wDF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 @@ -61830,7 +60091,6 @@ id = "hosspace"; name = "space shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "wED" = ( @@ -61843,9 +60103,6 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 9 }, @@ -61907,20 +60164,12 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/plating, /area/maintenance/starboard) -"wJU" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white, -/area/science/explab) "wKw" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "wLa" = ( @@ -61944,6 +60193,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "wLh" = ( @@ -61969,13 +60219,8 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit) "wLB" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "wLJ" = ( @@ -61989,10 +60234,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/aft) "wMi" = ( @@ -62006,12 +60247,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/mixing) "wMk" = ( @@ -62033,11 +60269,18 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/structure/disposalpipe/junction{ +/obj/structure/disposalpipe/sorting/wrap{ dir = 4 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"wOv" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_dock) "wOB" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/yellow/visible, @@ -62073,24 +60316,14 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/robotics/lab) "wQo" = ( /obj/machinery/door/airlock/public/glass{ name = "Courtroom" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/courtroom) "wQy" = ( @@ -62123,12 +60356,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "wRc" = ( @@ -62138,6 +60366,9 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "wSf" = ( @@ -62178,10 +60409,7 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "wTR" = ( @@ -62258,6 +60486,14 @@ }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) +"wWK" = ( +/obj/machinery/telecomms/receiver/preset_exploration, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/quartermaster/exploration_dock) "wXs" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -62320,22 +60556,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/mixing) "xaG" = ( /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/layer1{ dir = 1 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "xaZ" = ( @@ -62376,46 +60606,11 @@ }, /turf/open/floor/plasteel, /area/security/main) -"xeP" = ( -/obj/structure/chair/office/light, -/obj/effect/landmark/start/scientist, -/turf/open/floor/plasteel/white, -/area/science/explab) -"xfq" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"xfD" = ( -/obj/machinery/power/apc/auto_name/east{ - pixel_x = 24 - }, -/obj/structure/cable/yellow, -/turf/open/floor/plasteel/white, -/area/science/explab) "xgO" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -62486,7 +60681,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit) "xjs" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/vacant_room/office) "xjH" = ( @@ -62502,6 +60697,10 @@ /obj/machinery/atmospherics/components/unary/cryo_cell, /turf/open/floor/plasteel/white, /area/medical/cryo) +"xkR" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/exploration_dock) "xmh" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -27 @@ -62518,12 +60717,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "xnk" = ( @@ -62531,10 +60725,7 @@ name = "Delivery Office"; req_access_txt = "50" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/sorting) "xnm" = ( @@ -62579,10 +60770,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "xos" = ( @@ -62597,10 +60785,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/main) "xpn" = ( @@ -62635,10 +60820,7 @@ name = "Mech Bay"; req_access_txt = "29" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/mechbay) "xpE" = ( @@ -62648,12 +60830,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Fitness" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "xrh" = ( @@ -62670,10 +60847,7 @@ dir = 4; pixel_x = -24 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/mixing/chamber) "xrw" = ( @@ -62707,6 +60881,15 @@ }, /turf/open/floor/plasteel, /area/quartermaster/warehouse) +"xtg" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side, +/area/quartermaster/exploration_prep) "xuI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 @@ -62722,7 +60905,6 @@ /area/tcommsat/computer) "xvU" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/solars/port/fore) "xvV" = ( @@ -62753,7 +60935,7 @@ /turf/open/floor/plating, /area/hallway/secondary/entry) "xwM" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 4 }, @@ -62769,7 +60951,6 @@ /area/hallway/secondary/entry) "xxx" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -62779,10 +60960,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Diner" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar) "xxQ" = ( @@ -62818,20 +60996,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) -"xzo" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/science/shuttledock) -"xAe" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "xBJ" = ( /obj/machinery/disposal/bin, /obj/structure/sign/warning/deathsposal{ @@ -62878,7 +61042,9 @@ /turf/open/floor/plasteel, /area/security/brig) "xEb" = ( -/obj/machinery/atmospherics/pipe/layer_manifold, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, /turf/open/floor/plating, /area/maintenance/aft) "xEM" = ( @@ -62893,15 +61059,8 @@ /obj/item/nanite_scanner, /turf/open/floor/plasteel/dark, /area/science/nanite) -"xET" = ( -/obj/structure/closet/crate, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/shuttledock) "xGf" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 }, @@ -62922,9 +61081,6 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, @@ -62934,12 +61090,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "xHt" = ( @@ -62956,12 +61109,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -62975,31 +61122,12 @@ /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 9 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "xIc" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/lawoffice) -"xIi" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "xIO" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -63013,10 +61141,7 @@ shuttledocked = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 + dir = 6 }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) @@ -63047,7 +61172,6 @@ "xLF" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/layer_manifold, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/aft) "xLQ" = ( @@ -63087,19 +61211,14 @@ }, /turf/open/floor/wood, /area/lawoffice) -"xMM" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/crew_quarters/fitness) +"xNp" = ( +/obj/structure/chair/comfy/black, +/obj/effect/landmark/start/exploration, +/turf/open/floor/plasteel/white, +/area/quartermaster/exploration_prep) "xNI" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "xPe" = ( @@ -63166,12 +61285,6 @@ }, /turf/open/floor/plasteel/grimy, /area/ai_monitored/turret_protected/aisat_interior) -"xUO" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/crew_quarters/fitness) "xVp" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 9 @@ -63215,17 +61328,6 @@ }, /turf/open/floor/plasteel, /area/security/prison) -"xXe" = ( -/obj/machinery/door/poddoor/preopen{ - id = "telelab"; - name = "test chamber blast door" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/engine, -/area/science/explab) "xXU" = ( /obj/machinery/light/small{ dir = 4 @@ -63259,7 +61361,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/vacant_room/commissary) "xZy" = ( @@ -63267,7 +61369,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 10 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/engineering) "xZU" = ( @@ -63304,10 +61405,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/primary) "ycg" = ( @@ -63376,7 +61474,6 @@ /area/medical/chemistry) "yfn" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, @@ -63393,15 +61490,7 @@ /area/ai_monitored/nuke_storage) "yis" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/west{ - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "yiW" = ( @@ -63414,6 +61503,15 @@ }, /turf/open/floor/plasteel/dark, /area/science/nanite) +"yjb" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard) "yjl" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -63423,14 +61521,6 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/port) "yjm" = ( @@ -63444,20 +61534,31 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"yjs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/turf/open/floor/plasteel, -/area/engine/engine_smes) +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/quartermaster/exploration_dock) "yka" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light{ dir = 1 }, @@ -63477,12 +61578,11 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "ylD" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 }, @@ -63490,15 +61590,11 @@ /area/quartermaster/storage) "ylW" = ( /obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer1, /turf/open/floor/plasteel, /area/hallway/primary/central) @@ -75418,7 +73514,7 @@ aaa aaa aaa aaa -pgS +asF asI auQ auQ @@ -75944,7 +74040,7 @@ apJ axG ayl aQH -nqZ +azz aBH azz azz @@ -75958,7 +74054,7 @@ azz aym mtL ayl -kkD +lqg ieK rZt wSZ @@ -76201,7 +74297,7 @@ bEJ axb ayr azD -izG +azD azD aCp aEz @@ -76711,11 +74807,11 @@ heD lTD avq aum -uWU avq avq avq -aAj +avq +ayi aBI aCL aEG @@ -76965,7 +75061,7 @@ alU alU alU alU -owx +asc alU alU alU @@ -78281,7 +76377,7 @@ czK bbg yjl bdu -bbI +aSg beO wrc beO @@ -78538,7 +76634,7 @@ czK bcI aPz bdt -aUT +odd odd kJy bkD @@ -78761,14 +76857,14 @@ aaa aaa aaf aaa -bja +ali aoX qMr xpo avq avq avq -uWU +avq ayi azF aAU @@ -79018,7 +77114,7 @@ aaa aaa aaf aaa -bja +ali amC oeC alU @@ -79048,7 +77144,7 @@ aWj aXP aZr baL -bbI +aSg bcK aPz bdB @@ -79534,7 +77630,7 @@ aoj amC apP amC -mvE +oeC alU amC amC @@ -79562,7 +77658,7 @@ ams aqF aWk baM -bbJ +aWk bcL jvq bdC @@ -79787,9 +77883,9 @@ lLr jhG lDD snk -xLQ +aho +atN atN -bLs xLQ wFT alU @@ -79825,7 +77921,7 @@ aXQ aXQ aXQ aXQ -iYh +bdB bkF aaa aaa @@ -80045,8 +78141,8 @@ amz anh anH aok -anJ -tol +amC +amC aFJ arK alU @@ -80306,11 +78402,11 @@ amC apP amC arN -pel amC amC amC -pel +amC +amC asc azF azF @@ -80558,7 +78654,7 @@ alU alF anj anJ -anl +tol aoU alU arM @@ -81084,7 +79180,7 @@ amC amC abC alU -aAL +aAY aBQ aDb rrr @@ -81329,9 +79425,9 @@ alU amC amC abe -bja +ali aoV -bja +ali amC amC amC @@ -81586,9 +79682,9 @@ alU amC amC amC -bja +ali aaf -bja +ali amC amC amC @@ -81845,7 +79941,7 @@ amC amC alU aoV -bja +ali amC amC amC @@ -82392,8 +80488,8 @@ aZB aZB aZB aPA -bfc -bew +aSg +aWu aQM bjl bkG @@ -82869,9 +80965,9 @@ aaa aaa aaa aaa -bja +ali anK -bja +ali aaH atR alU @@ -83134,8 +81230,8 @@ aaf aaf aaH alU -bja -bja +ali +ali alU pDm ayz @@ -83195,10 +81291,10 @@ bHE bHE bHE bHE -wyd -gpk -tBy -tJj +bCq +bHE +qec +fSE bLv bCq bCq @@ -83383,9 +81479,9 @@ aaa aaa aaa aaa -bja +ali aKY -bja +ali asC aaf aaH @@ -83435,7 +81531,7 @@ buB bvV bxu bxu -iSL +bxx bxu bxu bDi @@ -83452,10 +81548,10 @@ bHE bHE bHE bHE -iGS -bHE -bHE -bHE +wyd +ibu +tBy +tJj agO bCq bCq @@ -83640,9 +81736,9 @@ aaa aae aaa aaf -bja +ali amC -bja +ali asC aaH aaf @@ -83671,12 +81767,12 @@ aSk aTE aPG aWu -aYa +aQM +aWk +aWk aWk aWk -aNp aWk -tiR aWk bfk aZE @@ -83895,8 +81991,8 @@ aaa aaa aaa aaa -bja -bja +ali +ali alU ank alU @@ -83927,7 +82023,7 @@ igW igW aTG aPG -aWw +aSX gjl gjl gjl @@ -83951,7 +82047,7 @@ bxu byA bzR byd -iSL +bxx aaa aaa aaa @@ -84152,7 +82248,7 @@ aaa aaa aaa aaa -bja +ali amC amC amC @@ -84208,7 +82304,7 @@ bxw byz bzQ byc -iSL +bxx aaa aaa jZP @@ -84409,7 +82505,7 @@ aaa aaa aaa aaa -bja +ali amC amC amC @@ -84421,7 +82517,7 @@ aqR aGh aqR aqR -mvx +aqR axo ayA aaa @@ -84465,12 +82561,12 @@ bxx byC bzT byl -iSL +bxx aaf aaf jZP pPw -pHo +xaG gCp jZP aoV @@ -84499,7 +82595,7 @@ bHE bHE bHE bHE -lIm +bHE bHE bHE bHE @@ -84666,7 +82762,7 @@ aaa aaa aaa aaa -bja +ali amC amC amC @@ -84722,7 +82818,7 @@ bxx byB bwS byg -iSL +bxx aaa aaa bxy @@ -84923,10 +83019,10 @@ aaa aaa aaa aaa -bja -bja +ali +ali alU -bja +ali alU alU alU @@ -84983,7 +83079,7 @@ bxu aaa bxy bxy -bxy +dOJ xIO bKm bxy @@ -85212,7 +83308,7 @@ aPK aSl aTH aPK -aWw +aSX gjl gjl gjl @@ -85728,7 +83824,7 @@ aTI aPK aWB cCj -soQ +aSg aYf bbU dfx @@ -86720,13 +84816,13 @@ aaa aaa aaa aaa -vtx +aiU lRl heE aaa vSJ let -vtx +aiU aaa aaa aaa @@ -87050,7 +85146,7 @@ bHE bLv aaf bLv -vsn +jEY bCq bHE bHE @@ -87293,7 +85389,7 @@ bxC byL byO bwe -bAo +bAx bHC bGo afR @@ -87307,7 +85403,7 @@ bLv bCq aaa bLv -qbT +jEY bCq bHE bHE @@ -87577,7 +85673,7 @@ bCq bCq bCq bCq -qUc +qiF bCq bCq bCq @@ -87745,7 +85841,7 @@ abc aaf aaa aaa -vtx +aiU ajr aka akH @@ -87774,9 +85870,9 @@ ayG ayG ayG ayG -iDY -iDY -iDY +nIK +nIK +nIK aSs aSs aSs @@ -87822,7 +85918,6 @@ bLv bLv bCq smu -syU rGV rGV rGV @@ -87833,7 +85928,8 @@ rGV rGV rGV rGV -syU +rGV +rGV mbW ccu ciT @@ -88002,7 +86098,7 @@ afA aaf aaa aaa -vtx +aiU aju akd akK @@ -88021,9 +86117,9 @@ arP arP arP adG -mvx aqR -aBi +aqR +aqR qWm oHu oHu @@ -88041,7 +86137,7 @@ aJq aJq aJq aJq -gmW +qVS aJq aJq aJq @@ -88077,7 +86173,7 @@ bGq bLw bGq bGq -xfq +bLw jrc bVI bVI @@ -88298,7 +86394,7 @@ aJq aJq aJq aJq -gmW +qVS aJq aJq bHt @@ -88565,7 +86661,7 @@ bgG bid aYl bBi -kXE +qVS bnN boY bqw @@ -89029,7 +87125,7 @@ acd agI ahq ahV -aho +agH acd ajy akh @@ -89047,7 +87143,7 @@ vIm aph aph aph -gJN +awg ayL ayN azE @@ -89620,7 +87716,7 @@ bNI cce bNI bNI -bUs +bHE bVI bWG bXD @@ -89877,7 +87973,7 @@ apV bLC cCf bNI -bUs +bHE bVI bWB bWB @@ -90134,7 +88230,7 @@ wOO bNJ bNJ bNI -bUs +bHE bVJ bWI bXF @@ -90329,7 +88425,7 @@ apd fBs dyN wUs -apd +mso vsa avh awh @@ -90391,7 +88487,7 @@ bKx bNJ bNJ bNI -bUs +bHE bVJ bWH bXE @@ -90421,10 +88517,10 @@ ccw ccw crK ccw -vYw +cMm crK -vYw -vYw +cMm +cMm ccw aaa aaa @@ -90586,7 +88682,7 @@ apd yay mSf bLE -apd +bLE auf apd awg @@ -90648,7 +88744,7 @@ qPr eaO nxv bNI -bUs +bHE bVJ bOo bOD @@ -90855,7 +88951,7 @@ azW afO azW agm -qWx +aBt aaa dgB qVS @@ -90905,7 +89001,7 @@ bKA rKP bSv bNI -bUB +bHE bVJ bOl jJK @@ -91112,7 +89208,7 @@ azW aBt azW aio -qWx +aBt aaa dgB aJq @@ -91375,7 +89471,7 @@ dgB aJq aJq aOE -aPS +aku aRi aSu aTU @@ -91632,11 +89728,11 @@ aKE aMa aNw aOE -aPU +aPW aRl aSx aTX -aVi +aVj aWR bfv aZS @@ -91889,10 +89985,10 @@ aJq aLZ aNv aOE -aPS +alL aRk aSw -aTW +aTX aVj aWQ bfv @@ -92403,10 +90499,10 @@ aJq aMb aNx aOE -aPS +aAj aRm aSy -aTX +aBi aVk aWS gaT @@ -92660,11 +90756,11 @@ aJq aMe aNA aOE -aPV +aPS aRp aSB aTZ -aVn +aVl aWV bfv twp @@ -92917,7 +91013,7 @@ aJq aMd aNz aOE -aPS +aPX aRo aSA aTX @@ -93431,7 +91527,7 @@ dgB aJq aJq aOE -aPS +aAL aRq aSC aUa @@ -93716,9 +91812,9 @@ aaa dgB aJq chm -wbr +lrp cBD -bFi +dOP bFi bGE cuU @@ -93900,7 +91996,7 @@ aaf aaf oYB adR -eCB +abo aaZ aaZ aaZ @@ -93987,7 +92083,7 @@ cwp bOd bPc cwD -qwr +bOd bRx hsJ bVP @@ -94243,8 +92339,8 @@ bLN bNQ bOd bOd -bOd -bOd +fPT +miR twe kls bRA @@ -94413,7 +92509,7 @@ aaa aaa aaf aaa -eCB +abo abO abO oig @@ -94492,7 +92588,7 @@ cBD cAL cAL cAL -bHW +vIT cBD bZN bLK @@ -94927,7 +93023,7 @@ aaf aaf aaf aaf -eCB +abo abO abO acP @@ -95006,7 +93102,7 @@ cBD bAV ctX cBD -bHW +eKo cBD bZN bLK @@ -95263,7 +93359,7 @@ cBD bDP bFp cus -bHW +gmT cBD bZN bLK @@ -95305,9 +93401,9 @@ ccw ccw ccw ccw -vYw -vYw -vYw +cMm +cMm +cMm ccw aaf aaf @@ -95520,7 +93616,7 @@ cBD bDO bFo cBD -bHW +vRB cBD bZN bLK @@ -95557,8 +93653,8 @@ cDm dQs cgR cDz -cgR dQP +eEb gCN ixu uNt @@ -95814,7 +93910,7 @@ coZ cgU cco cDK -cco +cZI vYD gPv vSE @@ -95980,7 +94076,7 @@ amY anV ajo ajo -gzp +aqe arf ari asu @@ -96006,7 +94102,7 @@ dgB dgB dgB aJs -wbr +aXf aYk aZV aZV @@ -96034,7 +94130,7 @@ cBD ctN bFm cBD -bHW +oqG cBD bKD bLO @@ -96059,7 +94155,7 @@ edz cfi bRH cgV -nDO +bMQ aaf bQA ckU @@ -96291,7 +94387,7 @@ cBD ctP bFp cuv -bHW +cWG cBD bKG bLK @@ -96300,7 +94396,7 @@ bIH bJF bQr alk -cbE +vIA bTP bOd bVX @@ -96519,10 +94615,10 @@ aJq aJq aJq aJq -soA -bBl aJq -gmW +aJq +aJq +qVS aJq bco aJq @@ -96776,10 +94872,10 @@ aJq aRt aJq aJq -bBi aJq aJq -gmW +aJq +qVS aJq bcp aJq @@ -96792,7 +94888,7 @@ aJq aJq aJq aNs -gmW +qVS aJq bQi aJq @@ -97033,14 +95129,14 @@ aJC bYP aQg aJC -ifA +xxP aJC aQg aJC aJC -mwY -mwY -mwY +nIK +nIK +nIK cZK cZK cZK @@ -97064,7 +95160,7 @@ bCB vIS cvb bof -oFm +bZN bLK bMS bOa @@ -97087,7 +95183,7 @@ jtK bOd cfP cgZ -nDO +bMQ aaf bQA ckX @@ -97245,7 +95341,7 @@ aaa aaa aaa aaf -eCB +abo aeB dGC uqd @@ -97290,7 +95386,7 @@ aPZ aRu aQc aUf -gEe +aQc aXi aQc baa @@ -97502,7 +95598,7 @@ aaa aaf aaf aaf -eCB +abo aeA eUT aga @@ -97547,7 +95643,7 @@ aPY aQc aRx aQc -sCF +aQc aPY aQc aZZ @@ -97584,7 +95680,7 @@ bMU bOc bPe bQu -alk +nuz bSJ bPe bOd @@ -97601,7 +95697,7 @@ qVH bUL cfP bOd -nDO +bMQ aaf bOh bOh @@ -97770,11 +95866,11 @@ aic ahT ahT ahT +ouL +eAe ahT -ahT -ooY dGq -alL +vug vug anb vug @@ -97783,7 +95879,7 @@ apu arj asb asV -aus +lKa lKa awA axT @@ -98027,9 +96123,9 @@ aib aif aif aif +hjZ +jwd aif -aif -qAU vhM alK fNZ @@ -98039,11 +96135,11 @@ anc aoI arj arn -whX +owD aur -avy -kfJ -axS +qOk +qOk +qOk azk aAk arj @@ -98115,7 +96211,7 @@ vWx hZW fSj chc -nDO +bMQ aaf bQA cla @@ -98285,7 +96381,7 @@ aiA ahn ahn and -anF +qEq ahn ppk apx @@ -98296,11 +96392,11 @@ itZ weE arj asr -whX -aut -avz +owD +auv +qOk aXF -axU +qOk azn aAn arj @@ -98339,7 +96435,7 @@ bqV bEe bBL bwA -xQL +qCe cfZ clh ctp @@ -98541,7 +96637,7 @@ aaa aaf aaf ahn -ahn +gXl pwf ahn aoK @@ -98556,8 +96652,8 @@ asq owD sNT qOk -avz -uCG +qOk +qOk azm aAm arj @@ -98588,7 +96684,7 @@ aNl blh bjQ blh -blh +suZ bzU blh blh @@ -98798,7 +96894,7 @@ aaa aaf aaa aaf -ahn +fJJ vHY ahn aoL @@ -98812,17 +96908,17 @@ fXQ pQd ioM auv -avA -erv -axW +qOk +qOk +qOk azo aAp aBC -aCt +ilA aEA aCt aGz -aIb +anf aCr aKN aKN @@ -98859,7 +96955,7 @@ bAp ctr bfG bDW -bhh +fGK bDD bFJ bof @@ -99055,7 +97151,7 @@ aaa aaa aaa aaa -ahn +ixD kEc ahn ahn @@ -99067,10 +97163,10 @@ vsN eEq auB ass -whX -whX -whX -whX +imO +uAR +uAR +uAR att azf aAo @@ -99116,7 +97212,7 @@ clk bAp bfG eQq -bhh +mxx cuy bFF cvl @@ -99193,7 +97289,7 @@ cwq jyC qVw cwq -pwt +kbn qVw jyC cwq @@ -99326,10 +97422,10 @@ arj kds whX whX -whX +oOI whX tEU -ayb +whX hwE arj aaf @@ -99373,7 +97469,7 @@ clm cts bfG bBe -bCS +vKq bDE bFK bof @@ -99586,14 +97682,14 @@ clO clO awB axY -azh +axY gsz arj aaa aaf alP -aGH -aIb +aGJ +anf aJC aKO aMw @@ -99630,7 +97726,7 @@ amB bAp bfG bDW -bhh +lan cuF cve bof @@ -99706,8 +97802,8 @@ qqN pwt cmE gMz -cAU -cAU +cva +cva asY nTh pPb @@ -99835,18 +97931,18 @@ aaa aaa aaa aaa -xUO -xUO -kkp +auB +auB +auB auB vQH auB auB vQH -skk -xMM -xMM -scz +auB +auB +auB +auB aaa alP aGJ @@ -99858,7 +97954,7 @@ aJC aJC aJC aXj -aVy +aYL aSY aVy aVy @@ -99887,7 +97983,7 @@ bAp bAp bfG eQq -bhh +fGK bGR bIj bof @@ -99964,7 +98060,7 @@ fKL xLY mXi wWr -cAU +cva pLb mWI kUK @@ -100092,7 +98188,7 @@ aaa aaa aaa aaa -kkp +auB aro aro aro @@ -100103,7 +98199,7 @@ aro aro aro aro -ogk +auB aaf alP aGJ @@ -100220,9 +98316,9 @@ qqN pwt mZn szj -cAU -cAU -cAU +cva +cva +cva cwq pwt cva @@ -100349,7 +98445,7 @@ aaa aaa aaa aaa -kkp +auB aro aro aro @@ -100360,7 +98456,7 @@ aro aro aro aro -ogk +auB aaa alP aGA @@ -100606,7 +98702,7 @@ aaa aaa aaa aaa -kkp +auB aro aro aro @@ -100617,7 +98713,7 @@ aro aro aro aro -ogk +auB aaf alP tMn @@ -100735,7 +98831,7 @@ cwq ilv qVw cwq -pwt +gad qVw ilv cwq @@ -100863,7 +98959,7 @@ aaa aaa aaa aaa -kkp +auB aro aro aro @@ -100874,7 +98970,7 @@ aro aro aro aro -ogk +auB aaa alP tMn @@ -100939,8 +99035,8 @@ alj alj alj uvC -uYp -aku +bAw +bAw bAw bzs bAw @@ -101120,7 +99216,7 @@ aaa aaa aaa aaa -kkp +auB aro aro aro @@ -101131,7 +99227,7 @@ aro aro aro aro -ogk +auB aaf alP tMn @@ -101377,18 +99473,18 @@ aaa aaa aaf aaf -kkp -kkp -kkp -auB -vQH auB +aro +aro +aro +aro +aro +aro +aro +aro +aro +aro auB -axZ -azp -xMM -xMM -kSp aaa alP tMn @@ -101404,8 +99500,8 @@ aVz aVz aVz aVz -aYL -aJI +aVz +plq bbz aYV aYV @@ -101634,18 +99730,18 @@ aaa aaf aaf aaf -aaf -arj -arj -arj -auA -avD -awC -ayb -arj -alP -alP -aaa +auB +aro +aro +aro +aro +aro +aro +aro +aro +aro +aro +auB aaa alP aGN @@ -101891,19 +99987,19 @@ aaf aaf aaa aaa +auB +aro +aro +aro +aro +aro +aro +aro +aro +aro +aro +auB aaa -aaa -aaf -arj -auz -avC -qML -aya -arj -arA -alP -alP -alP alP aGB aIf @@ -101947,7 +100043,7 @@ cug bGV sha bRO -bKM +dXb cvT cwc bOn @@ -101970,7 +100066,7 @@ ceG alj alj alj -all +alj alM clj cfj @@ -102148,22 +100244,22 @@ aaf aaa aaa aaa +auB +aro +aro +aro +aro +aro +aro +aro +aro +aro +aro +auB aaa -aaa -aaf -arj -kkp -kkp -arj -arj -arj -bQG -aBD -aCx -kZg alP -fXp -dpT +aGL +aHY aJI iNn aMk @@ -102405,20 +100501,20 @@ aaa aaa aaa aaa -aaa -aaa -aaf -aaa -aaa -aaf -aaa +auB +auB +auB +arj +vQH +auB +auB +vQH +arj +arj +arj +arj aaa alP -aAq -aAq -aCy -gAD -alP aGL aHY aJK @@ -102662,22 +100758,22 @@ aaa aaa aaa aaa -aaf -aaf -nvp -nvp -nvp -alP -alP -alP -alP -alP -alP +aaa +aaa +aaa +arj +ayb +azp +aCy +whX +arj +anf +anf alP -vmv -loO -ilA -lkz +aaa +alO +aGP +aHY aJI aJI aJI @@ -102721,7 +100817,7 @@ bGX jIS cvU jIS -bIK +bXZ jIS jIS cga @@ -102918,20 +101014,20 @@ aaa aaa aaa aaa -aag -qJz -kva -ptZ -kwP -anf -anf -awD +aaa +aaa +aaa +aaa +arj +azh +aAq +aDX +whX +arj anf -aoP -alP aBE alP -aDX +aaa alP aGP aHY @@ -103175,15 +101271,15 @@ aaa aaa aaa aaa -aag -uLY -cLx -aqv -ulW -xAe +aaa +aaf +aaf +alO +arj +arj dYO -mvX -jvC +arj +arj cVb cVb cVb @@ -103235,7 +101331,7 @@ ucP cvI ucP ucP -bOp +qSR bPr ucP ucP @@ -103433,14 +101529,14 @@ aaa aaa aaa aag -alP -alP -nvp -anf +auz +avC +awC +aya auC -alP -anf -aHY +aBD +bQG +gAD cVb jbf wrp @@ -103689,13 +101785,13 @@ aaa aaa aaa aaa -aaH -aaH -aaH -nvp +aag +auA +avD +axZ aqy -aqA -alP +anf +anf awE aHY cVb @@ -103946,7 +102042,7 @@ aaf aaf aaf aaf -aaH +aag apC apC apC @@ -104217,7 +102313,7 @@ arA anf aCz asw -oEu +asw aGT aIn aIp @@ -104800,7 +102896,7 @@ bcM ciH tUL cWR -uYp +vEM ktb bAw vwb @@ -105036,11 +103132,11 @@ bon bon bOt cwu -cwB +cki cAR -cAX +bAw cBd -eyO +clf bWj fLK bNd @@ -105496,7 +103592,7 @@ alP alP apC alP -snh +sWq alP alP alP @@ -106276,7 +104372,7 @@ anf tMn aFu aIr -aIt +gwp aLf gey aNS @@ -106770,7 +104866,7 @@ aaf aaa aaa aaf -nvp +alO anf anf abz @@ -107027,7 +105123,7 @@ aaf aaa aaa aaa -nvp +alO anf anf anf @@ -107048,7 +105144,7 @@ aFu aHc aIw aJS -aJS +wbJ aMJ aNP aOS @@ -107284,7 +105380,7 @@ aaf aaf aaa aaa -nvp +alO anf anf anf @@ -107563,7 +105659,7 @@ aHd aIx aJF aLh -aIt +nHY aNV aPd aIt @@ -107573,7 +105669,7 @@ aIt aVQ aXu aXV -aVQ +ken aFu aYV aXq @@ -107799,7 +105895,7 @@ aaa aaf aaf aaa -nvp +alO anf apD alP @@ -107814,7 +105910,7 @@ alP alP alP awG -ilH +aDZ aFw aFw aFw @@ -108071,8 +106167,8 @@ aeg apE aBF aBF -aED -aFy +aDZ +anf aFw aIB aJJ @@ -108147,9 +106243,9 @@ aaa aaa aaa uRq -mAf -wxN cOT +wxN +nGn aag aaa aaa @@ -108313,7 +106409,7 @@ aaa aaa aaa aaf -nvp +alO aoQ anf alP @@ -108403,7 +106499,7 @@ aaa aaa aaa aaa -cCZ +uRq cNW dKr cqu @@ -108598,10 +106694,10 @@ aQt aRQ aIt aUF -aLg +hhQ aYW aYW -aVQ +ken aFu aYV aXq @@ -108660,10 +106756,10 @@ aaf aaf aaf aaf -cZa -mko -nnV +cNW cOT +nnV +oyU cOT aaa aaa @@ -108916,11 +107012,11 @@ aaa aaa aaa cNW -qIW -mIZ -cOe +cNW +cNW cOe -ahO +duJ +wzO cOT aaa aaa @@ -109166,18 +107262,18 @@ cNW cNW cNW cNW -gmo -xIi +cgm +cvO cNW cNW cNW cNW cNW -xrh +kZs cTI -cOe -cOe -cOe +cNi +tjq +qWr cOT aaa aaa @@ -109337,7 +107433,7 @@ aaa aaa aaa aaa -nvp +alO amx anf anf @@ -109383,7 +107479,7 @@ biR bkq bjZ bvx -boz +eek boM bzE bsX @@ -109413,7 +107509,7 @@ bzE qfK bPK bQO -vHt +mPG bOu rHZ bQZ @@ -110411,7 +108507,7 @@ biU pDJ blI bnn -dgS +ppc bpZ brt bta @@ -110665,8 +108761,8 @@ sYn bfX bhD biV -biW -blK +bhV +bnp bnp bng bpZ @@ -110922,10 +109018,10 @@ sYn bgb bhC biU -biW +blK blJ bno -boA +bOy dgK bqf brn @@ -110953,7 +109049,7 @@ mCs bSh vDl bEC -jHW +mjb caZ pWN bZZ @@ -111179,7 +109275,7 @@ sYn rYy bgc biX -bhV +bka bka bka bnk @@ -111467,7 +109563,7 @@ mCs bSh kwA bEC -bOy +uIv caZ bYl uvi @@ -111688,7 +109784,7 @@ ijs aCR aCR tIx -tHH +bdy bGi bgc bhF @@ -111726,7 +109822,7 @@ bNq bEC bOB bPs -bYo +lRv bSc bTl bTl @@ -111954,16 +110050,16 @@ bgc bgc bgc rKc -bqe -vGb -brr -nbv -bqe -bqe -bqe -bqe -bqe -bqe +kch +kEW +mov +rWR +kch +kch +kch +kch +kch +kch byt bvK bvK @@ -112211,16 +110307,16 @@ biY bmd bgc bnr -bqe -pOJ -buu -buu -qrU -kGS -bzO -bzO -bzO -bqe +kch +nXo +eAu +fbf +eAu +hrL +lFj +cUo +fwx +kch rYJ rYJ bFW @@ -112468,16 +110564,16 @@ bky blO bgc bnq -bqe -uHA -bvO -bvO -gHj -kGS -bzO -bzO -bzO -bqe +kch +tdQ +lXn +tuF +wld +iqY +gmf +gmf +mBr +kch fGF bEA bEA @@ -112498,7 +110594,7 @@ bQZ tbd bQZ bTl -bTo +pUl bTl bTl bQZ @@ -112507,7 +110603,7 @@ cbv cNW cNW ccp -gwf +cbf cbf cbf clu @@ -112703,7 +110799,7 @@ aaa aaa aaa aaf -hUH +aNa aOd aOU aPq @@ -112719,22 +110815,22 @@ maR cBl aPq bgg -hUH +aNa aaa bky oKe biY bnx -bqe -mJM -psy -ecb -nbv -bqe -bzO -bAR -bzO -bqe +kch +pAV +wpy +eAu +rWR +kYc +dil +rYj +hyd +kch uUy uUy bFX @@ -112755,7 +110851,7 @@ bQZ bXt caX lAi -itG +vPQ bTl cbV bQZ @@ -112960,7 +111056,7 @@ aaa aaa aaa aaf -hUH +aNa wfv aPq aPq @@ -112976,22 +111072,22 @@ maR aPq aPq bgg -hUH +aNa aaf fia ulX btp boF -bqe -brz -bvO -bvO -ifv -kGS -bzO -cYY -bCl -bqe +kch +pAV +wpy +eAu +iyL +kYc +xNp +drM +auN +kch bEC bEC bEC @@ -113217,7 +111313,7 @@ aaf aaf aaf aaf -hUH +aNa aOd aPq aPq @@ -113231,24 +111327,24 @@ aPq aPq maR aPq -hUH -hUH -hUH +aNa +aNa +aNa aaa iwb gky bky boF -bqe -tcY -bvO -xeP -kxC -kGS -bzO -bzO -bzO -bqe +kch +coX +wpy +eAu +vsJ +kYc +xNp +drM +auN +kch wIR bEF bky @@ -113474,7 +111570,7 @@ aaa aaa aaa aaf -hUH +aNa jsS aPq aPq @@ -113488,7 +111584,7 @@ aPq aPq maR aPq -hUH +aNa aaf aaf aaf @@ -113496,16 +111592,16 @@ cni lpK bky boF -bqe -brv -wJU -kjb -nbv -bqe -nXP -bzO -bzO -bqe +kch +pAV +wpy +eAu +rWR +kYc +nwC +izs +waH +kch pIP bEE bFY @@ -113731,7 +111827,7 @@ aaa aaa aaa aaf -hUH +aNa uxz mfh kkh @@ -113753,16 +111849,16 @@ knD kQX bky blO -bqe -brP -xfD -bvO -orP -xXe -bzO -bzO -bzO -bqe +kch +sjP +hmb +hJM +vGZ +xtg +nsO +nsO +nuW +kch btp vqI bky @@ -113785,12 +111881,12 @@ bTr bTr bTr cbg +cNZ bTr bTr -bTr -bTr +niv cbg -jjq +bTr cct cdu cjG @@ -113988,38 +112084,38 @@ aaa aaa aaa aaa -hUH -hUH +aNa +aNa vbZ gKL aMZ gKL -lHF -hUH -hUH -hUH -lHF +vbZ +aNa +aNa +aNa +vbZ gKL aMZ gKL -lHF +vbZ aaa aaa aaa aaf aaa bky -bCm -bqe -bry -bqe -bqe -bqe -bqe -bqe -bqe -bqe -bqe +boF +kch +nXo +tIa +eAu +eAu +prg +uNU +uNU +apn +kch btp vqI bEs @@ -114251,32 +112347,32 @@ xGf gZW aMZ fVg -jNR +xGf aaf aaf aaf -jNR +xGf pNg aMZ woM -jNR +xGf aaa aaa aaa aaf aaf bky -brQ -ltd -brQ -kyZ -upi -tIu -qZn -eVE -mjT -cNT -btp +miz +kch +qxG +kch +qKG +rWR +kch +kch +kch +kch +kch jLJ bEI bEs @@ -114302,7 +112398,7 @@ ahO cNW cOe cOe -cOe +brG cOe ahY cNW @@ -114506,7 +112602,7 @@ aaa aaa pXU fEx -ebe +aMZ tFl xxx aaa @@ -114523,16 +112619,16 @@ aaf aaf aaf bky -bDh -cNU -hjb -jrx -jrx -jrx -jrx -ocB -jrx -uLI +irP +lce +nFs +lXT +mZC +kdl +lXT +yjb +yjb +kRQ kRQ bEI bEs @@ -114559,7 +112655,7 @@ cOe cNW cOe cOe -cOe +brG cOe cOe cNW @@ -114779,17 +112875,17 @@ aaa aaa aaa aaa -cNT -cxn -hZO -mUS -vpA -mUS -mUS -brH -bvQ -ltQ -cNT +bky +gpn +tep +btp +bky +dnB +taT +bky +btp +btp +bky bED sBO bEs @@ -114815,8 +112911,8 @@ cOe cOe cNW cOe -cOe -cOe +pfd +svv cOe cOe cNW @@ -115036,23 +113132,23 @@ aaa aaa aaa aaa -cNT -cNT -cNT -wCn -cNT -cNT -cNT -cNT -qsT -cNT -cNT -cNT -cNT +bky +bky +mnE +gQd +gQd +gQd +rXd +gQd +gQd +gQd +gQd +gQd +gQd bEs -anL -anL -anL +bGc +bGc +bGc bEs bLl bEs @@ -115072,7 +113168,7 @@ cOT cOT cNW cNW -cNW +ibT cPH cNW cNW @@ -115294,18 +113390,18 @@ aaa aaa aaa aaa -aaa -xzo -qVo -kaB -rAL -btq -brI -bvR -cNS -byx -gko -cNT +xkR +sDn +equ +dLB +gQd +fJe +ksB +hjM +uyV +rZB +cRa +gQd atS aaf aaf @@ -115329,7 +113425,7 @@ aaf aaf aaf aaf -cNW +edM ceU cNW aaa @@ -115551,18 +113647,18 @@ aaa aaa aaa aaa -aaa -xzo -qVo -bxt -hUJ -bxt -bxt -nBe -eoE -uww -ssh -cNT +xkR +les +yjs +uAc +xkR +rEQ +gQK +iQj +cYu +uNf +ezu +gQd aaf aaa aaa @@ -115586,7 +113682,7 @@ aaf aaa aaa aaf -cNW +rYR cPI cNW aaf @@ -115808,18 +113904,18 @@ aaa aaa aaa aaa -aaa -xzo -qVo -nHI -lQZ -sce -khm -ojP -dpK -uhf -xET -oJz +xkR +szx +miD +sWW +xkR +pqr +pqr +ksZ +kSz +ezu +cxr +mFI aaa aaa aaa @@ -116065,18 +114161,18 @@ aaa aaa aaa aaa -aaa -nMn -ete -cNT -vBU -idi -nMn -xzo -idi -xzo -cNT -cNT +xkR +rKw +eQc +wWK +gQd +wOv +pqr +qmf +nFZ +xkR +gQd +gQd aaa aaa aaa @@ -116322,17 +114418,17 @@ aaa aaa aaa gXs -gXs -xzo -xzo -cNT +xkR +xkR +xkR +gQd +gQd +tEj +dOV +qmf +smw +gQd gQd -pWV -cNT -eIx -pWV -cNT -cNT gXs aaa aaa @@ -116582,14 +114678,14 @@ aaa aaa aaa aaa -cNT -oeU -tmc -lUu -lUu -iHV -xzo -cNT +aaa +gQd +xkR +xkR +fau +uvv +xkR +gQd gXs aaa aaa @@ -116844,10 +114940,10 @@ aaa aaa aaa aaa -osd +pBW +aaa aaa aaa -gXs aaa aaa aaa @@ -117104,7 +115200,7 @@ aaa aaa aaa aaa -gXs +aaa aaa aaa aaa @@ -117361,7 +115457,7 @@ aaa aaa aaa aaa -gXs +aaa aaa aaa aaa @@ -117618,7 +115714,7 @@ aaa aaa aaa aaa -gXs +aaa aaa aaa aaa @@ -117875,7 +115971,7 @@ aaa aaa aaa aaa -gXs +aaa aaa aaa aaa @@ -118132,7 +116228,7 @@ aaa aaa aaa aaa -gXs +aaa aaa aaa aaa diff --git a/_maps/map_files/CorgStation/CorgStation.dmm b/_maps/map_files/CorgStation/CorgStation.dmm new file mode 100644 index 0000000000000..1107caf08119d --- /dev/null +++ b/_maps/map_files/CorgStation/CorgStation.dmm @@ -0,0 +1,233673 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aak" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"aaC" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aaI" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"aaS" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"aaW" = ( +/obj/machinery/door/airlock{ + name = "Toilet Unit" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/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/security/prison) +"aaY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"aaZ" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"abd" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/engine/engine_room) +"abe" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"abj" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/camera/motion{ + c_tag = "Vault"; + dir = 4; + network = list("vault") + }, +/turf/open/openspace, +/area/security/nuke_storage) +"abl" = ( +/obj/machinery/telecomms/server/presets/supply, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/server) +"abp" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"aby" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"abS" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/storage/eva) +"acn" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"acv" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"acU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"adb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"adm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"adz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet/blue, +/area/security/brig) +"adB" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"adL" = ( +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"adU" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aez" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics/cloning) +"aeJ" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"aeK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"aeN" = ( +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/grass, +/area/crew_quarters/park) +"aeR" = ( +/obj/structure/window/reinforced{ + pixel_y = 2 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"afa" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"afg" = ( +/obj/structure/chair, +/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/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"afk" = ( +/obj/machinery/photocopier, +/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/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"afl" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"afm" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Shared Engineering Storage"; + req_one_access_txt = "32;19" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/storage_shared) +"afn" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"afq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"afE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/security/brig) +"afK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"afO" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"afP" = ( +/obj/structure/table/reinforced, +/obj/item/folder/yellow, +/obj/item/stamp/qm, +/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/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"agc" = ( +/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/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"agf" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"ago" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/chair/sofa/left{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"agq" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Gravity Generator Area"; + req_access_txt = "19; 61" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/engine/gravity_generator) +"agx" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"agW" = ( +/obj/structure/chair, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"ahb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/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/primary/fore) +"ahe" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"ahj" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hydroponics) +"ahq" = ( +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/simple/purple/visible, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"ahs" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"ahz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload) +"ahB" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/machinery/computer/cargo/request{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ahM" = ( +/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/medical/chemistry/upper) +"ahO" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/newscaster{ + pixel_y = -30 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/structure/table/glass, +/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/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"ahT" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"ahW" = ( +/turf/closed/wall, +/area/medical/medbay/balcony) +"ahZ" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aic" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ain" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"aio" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/effect/landmark/event_spawn, +/mob/living/simple_animal/kalo, +/turf/open/floor/plasteel, +/area/janitor) +"aiq" = ( +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/library) +"air" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, +/area/science/research) +"ais" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"aix" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"aiK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"aiX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/ai_monitored/security/armory) +"ajb" = ( +/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/tile/yellow, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"aje" = ( +/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/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"ajC" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/obj/item/radio/intercom{ + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"ajK" = ( +/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/structure/closet/secure_closet/personal, +/obj/item/clothing/under/suit/black/female, +/obj/item/clothing/under/misc/assistantformal, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"ajX" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"akc" = ( +/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/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"aki" = ( +/obj/machinery/computer/atmos_control/tank/carbon_tank, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"akj" = ( +/obj/machinery/bluespace_beacon, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/foyer) +"akm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"ako" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"akp" = ( +/obj/structure/plasticflaps/opaque, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/atmos) +"akt" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/main) +"akH" = ( +/obj/machinery/computer/scan_consolenew, +/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/genetics) +"akR" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/grass, +/area/crew_quarters/park) +"alg" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine"; + 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/door/firedoor, +/turf/open/floor/engine, +/area/engine/engine_room) +"alm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/warden) +"alB" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/machinery/button/door{ + id = "virology"; + name = "virology lockdown"; + pixel_x = -28; + pixel_y = 6; + req_access_txt = "5" + }, +/turf/open/floor/noslip/white, +/area/medical/virology) +"alC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "comms" + }, +/turf/open/floor/plating, +/area/tcommsat/computer) +"alF" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/transit_tube/station/reverse/flipped{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/transit_tube_pod{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"alM" = ( +/obj/machinery/air_sensor/atmos/toxins_mixing_tank, +/turf/open/floor/engine/vacuum, +/area/science/mixing/chamber) +"alP" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"alQ" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"ama" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"ame" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"amf" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel/white, +/area/science/research) +"amj" = ( +/turf/open/floor/plasteel, +/area/engine/engineering) +"amp" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"amr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"amv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"amx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"amK" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/medical/sleeper) +"amL" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"anf" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/mob/living/simple_animal/chicken, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"anh" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/hos) +"anL" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"aoa" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"aoj" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"aoJ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"aoM" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"aoP" = ( +/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/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"aoR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/door/airlock/public/glass{ + name = "Departures Lounge" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"aoY" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L11" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"apa" = ( +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"apm" = ( +/obj/structure/rack, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/item/circuitboard/computer/communications, +/obj/item/circuitboard/computer/aifixer{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"apo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/turf/open/floor/wood, +/area/vacant_room/office) +"apM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"apO" = ( +/obj/machinery/camera/autoname, +/obj/machinery/button/ignition/incinerator/atmos{ + pixel_x = 5; + pixel_y = 39 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"apU" = ( +/obj/structure/chair, +/obj/machinery/camera/autoname, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"apW" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"aqa" = ( +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"aqc" = ( +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/theatre) +"aqD" = ( +/obj/structure/table/glass, +/obj/item/paper_bin{ + pixel_y = 3 + }, +/obj/item/pen{ + pixel_y = 2 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"aqE" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"aqK" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aqT" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/turf/open/floor/plasteel/dark, +/area/bridge) +"ara" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"arq" = ( +/obj/machinery/computer/secure_data{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"arI" = ( +/obj/effect/spawner/room/fivexthree, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"arT" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/engine, +/area/engine/engine_room) +"arU" = ( +/obj/machinery/light_switch{ + pixel_x = -25; + pixel_y = -4 + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"arZ" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"asl" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"ast" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal) +"asv" = ( +/turf/closed/wall/r_wall, +/area/science/robotics) +"asz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"asJ" = ( +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"asO" = ( +/obj/structure/rack, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/item/circuitboard/computer/card, +/obj/item/circuitboard/computer/borgupload{ + pixel_x = -1; + pixel_y = -2 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"asQ" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/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/effect/turf_decal/tile/green, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/cryopods) +"asR" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/engine_smes) +"atl" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"ato" = ( +/obj/structure/closet/firecloset/full, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/noslip/dark, +/area/engine/engineering) +"att" = ( +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"atK" = ( +/obj/machinery/vending/assist, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"atT" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/brig) +"atZ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"aug" = ( +/turf/open/floor/plasteel, +/area/medical/morgue) +"aut" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"auu" = ( +/obj/machinery/door/poddoor{ + id = "smeject"; + name = "Supermatter Ejection Door" + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"auO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/plasteel, +/area/security/brig) +"auP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"auR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"avb" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"avd" = ( +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"ave" = ( +/turf/open/floor/engine, +/area/science/xenobiology) +"avw" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/item/storage/lockbox/medal, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"avT" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/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/manifold/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"awu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"awM" = ( +/obj/effect/turf_decal/tile/brown, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"awN" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"awP" = ( +/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/dark, +/area/crew_quarters/dorms) +"awW" = ( +/turf/closed/wall/r_wall, +/area/tcommsat/server) +"axg" = ( +/obj/machinery/door/airlock/medical{ + name = "Patient Room C"; + req_access_txt = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_c) +"axu" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"axD" = ( +/obj/machinery/holopad, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"axE" = ( +/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/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/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"axG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"axI" = ( +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plasteel/dark, +/area/medical/surgery/aux) +"axN" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"axQ" = ( +/turf/closed/wall/r_wall, +/area/science/lab) +"ayi" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"aym" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/blackbox_recorder, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"ayp" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"ayL" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"ayT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"azn" = ( +/obj/machinery/light, +/obj/effect/turf_decal/delivery, +/obj/structure/closet/radiation, +/turf/open/floor/plasteel, +/area/engine/atmos) +"azt" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -8; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -8; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/maintenance/port) +"azw" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/flashlight/lantern, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"azy" = ( +/obj/structure/mirror{ + pixel_y = 30 + }, +/obj/structure/table/wood, +/obj/item/storage/photo_album/Captain, +/obj/item/camera, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"azB" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"azE" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"azG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"azQ" = ( +/obj/machinery/door/airlock/external{ + name = "Supply Dock Airlock"; + req_access_txt = "31" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"azZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) +"aAn" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"aAo" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/security/brig) +"aAt" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"aAz" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"aAN" = ( +/obj/machinery/power/deck_relay{ + pixel_y = 32 + }, +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/multiz/layer1, +/obj/machinery/atmospherics/pipe/simple/multiz/layer3, +/turf/open/openspace, +/area/maintenance/starboard/fore) +"aAO" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"aAU" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"aBc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/law) +"aBe" = ( +/obj/structure/table/reinforced, +/obj/item/toy/crayon/spraycan, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"aBr" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"aBx" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Bar Maintenance"; + req_access_txt = "25" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"aBD" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"aBG" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/openspace, +/area/quartermaster/exploration_prep) +"aBP" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"aBS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"aBY" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/misc_lab/range) +"aCb" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"aCh" = ( +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aCi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"aCl" = ( +/obj/item/bedsheet/brown, +/obj/structure/bed, +/obj/item/toy/plush/moth, +/obj/structure/sign/poster/official/no_erp{ + pixel_y = 32 + }, +/obj/effect/landmark/start/bartender, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"aCm" = ( +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/crew_quarters/heads/hor) +"aCx" = ( +/turf/open/openspace/airless, +/area/hallway/upper/secondary/service) +"aCF" = ( +/obj/machinery/camera/autoname, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"aDb" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"aDs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/grass, +/area/crew_quarters/park) +"aDA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"aDH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"aDJ" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"aDL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/mob/living/simple_animal/hostile/retaliate/goat{ + name = "Pete" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/coldroom) +"aDQ" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/openspace, +/area/engine/engine_room) +"aDT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aEg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"aEp" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"aEw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"aEy" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"aEA" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_y = 3 + }, +/obj/item/pen{ + pixel_y = 2 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"aED" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"aEE" = ( +/obj/machinery/teleport/hub, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat/foyer) +"aEH" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"aEI" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"aEL" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/landmark/xeno_spawn, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"aEM" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"aEW" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/north{ + dir = 2 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/door/window/brigdoor/northright{ + dir = 8; + name = "Security Boards"; + req_access_txt = "16" + }, +/obj/effect/spawner/lootdrop/aimodule_harmful, +/obj/effect/spawner/lootdrop/aimodule_harmful, +/obj/effect/spawner/lootdrop/aimodule_harmful, +/turf/open/floor/circuit/green, +/area/ai_monitored/turret_protected/ai_upload) +"aFd" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science{ + req_access_txt = "49" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/quartermaster/exploration_prep) +"aFi" = ( +/obj/item/beacon, +/obj/structure/chair/wood, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aFj" = ( +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"aFk" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"aFo" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"aFw" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/security/main) +"aFJ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/command{ + name = "Head of Personnel's Office"; + req_access_txt = "57" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hop) +"aFO" = ( +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"aFS" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Research Division Maintenance Hatch"; + req_access_txt = "47" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aFW" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/plating/asteroid, +/area/maintenance/port) +"aGa" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"aGe" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"aGf" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"aGo" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"aGv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"aGB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/science/research) +"aGC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"aGR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/advanced_airlock_controller{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"aGU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"aGZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"aHh" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/light, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"aHm" = ( +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"aHr" = ( +/turf/closed/wall, +/area/crew_quarters/heads/hop) +"aHz" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"aHD" = ( +/obj/machinery/rnd/production/techfab/department/service, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/poster/random{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"aHK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/explab) +"aHL" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -32 + }, +/obj/machinery/vending/clothing, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"aHN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"aHT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/modular_fabricator/autolathe, +/obj/machinery/camera/autoname, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage_shared) +"aHW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"aIa" = ( +/obj/structure/transit_tube/diagonal, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) +"aIi" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/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/dark, +/area/engine/engine_room) +"aIl" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/poppy/lily, +/obj/item/reagent_containers/food/snacks/grown/poppy/lily, +/obj/item/reagent_containers/food/snacks/grown/poppy/lily, +/obj/item/reagent_containers/food/snacks/grown/harebell, +/obj/item/reagent_containers/food/snacks/grown/harebell, +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"aIo" = ( +/obj/machinery/vending/boozeomat/all_access, +/turf/open/floor/wood, +/area/security/detectives_office) +"aIp" = ( +/turf/closed/wall/r_wall, +/area/science/robotics/lab) +"aIz" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"aIA" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "Waste to Filter" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"aIK" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"aIR" = ( +/turf/closed/wall, +/area/crew_quarters/toilet/auxiliary) +"aIY" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Captain's Desk"; + departmentType = 5; + name = "Captain RC"; + pixel_x = 32 + }, +/obj/machinery/camera/autoname{ + dir = 9 + }, +/obj/effect/landmark/start/captain, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain) +"aJq" = ( +/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/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/caution{ + dir = 8; + pixel_x = -3 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/noslip/dark, +/area/hallway/secondary/service) +"aJt" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"aJG" = ( +/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/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"aJU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"aKa" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"aKb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"aKn" = ( +/obj/effect/turf_decal/tile/neutral{ + 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/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"aKt" = ( +/obj/machinery/door/airlock/security/glass{ + id_tag = "outerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aKA" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"aKI" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace/airless, +/area/space/nearstation) +"aKZ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 15 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aLh" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"aLi" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aLu" = ( +/obj/effect/spawner/lootdrop/crate_spawner, +/turf/open/floor/plating, +/area/maintenance/fore) +"aLv" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"aLB" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"aLE" = ( +/turf/open/openspace, +/area/maintenance/upper/aft) +"aLJ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"aLQ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"aLV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/aisat/foyer) +"aMa" = ( +/obj/machinery/suit_storage_unit/rd, +/turf/open/floor/plasteel, +/area/science/misc_lab/range) +"aMg" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"aMj" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/science/research) +"aMq" = ( +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/AIsatextAP) +"aMy" = ( +/obj/effect/turf_decal/delivery, +/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/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"aME" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) +"aMU" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/obj/machinery/advanced_airlock_controller/directional/west, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"aMY" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"aMZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"aNa" = ( +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Teleporter"; + req_access_txt = "17;65" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/foyer) +"aNf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"aNk" = ( +/obj/structure/closet/secure_closet/medical3, +/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/effect/turf_decal/tile/yellow, +/obj/machinery/requests_console{ + department = "Medbay Storage"; + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/medical/storage) +"aNr" = ( +/obj/structure/railing, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"aNs" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"aNv" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/hallway/secondary/law) +"aND" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"aNX" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/landmark/blobstart, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"aNZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters{ + id = "aicoremain" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"aOa" = ( +/obj/effect/turf_decal/tile/green, +/obj/structure/closet/crate/hydroponics, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"aOc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"aOf" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"aOh" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/dark, +/area/storage/art) +"aOq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"aOu" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"aOz" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aOO" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/three, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"aOQ" = ( +/obj/structure/transit_tube/station{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat/foyer) +"aOW" = ( +/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/maintenance/starboard/aft) +"aPi" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"aPn" = ( +/obj/machinery/holopad{ + pixel_y = 16 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/gateway) +"aPq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/ladder, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"aPr" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"aPy" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"aPA" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/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/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"aPK" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/airlock/command/glass{ + name = "Command Hall Access"; + req_one_access_txt = "19;53"; + security_level = 0 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"aQj" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) +"aQk" = ( +/obj/structure/window/reinforced{ + pixel_y = 2 + }, +/obj/structure/transit_tube/curved{ + dir = 1 + }, +/turf/open/space/basic, +/area/space) +"aQx" = ( +/obj/effect/landmark/start/ai, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = 4 + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -10 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = 4 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -10 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"aQz" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"aQC" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"aQE" = ( +/obj/machinery/power/port_gen/pacman, +/obj/item/wrench, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"aQF" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/dark, +/area/security/main) +"aQK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aQO" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"aQS" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/conveyor_switch/oneway{ + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"aRi" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"aRk" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"aRy" = ( +/obj/structure/closet/secure_closet/atmospherics, +/obj/effect/turf_decal/delivery, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel, +/area/engine/atmos) +"aRz" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"aRE" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aRJ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"aRM" = ( +/obj/structure/flora/ausbushes/fernybush, +/turf/open/floor/grass, +/area/crew_quarters/park) +"aRX" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"aSc" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aSf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"aSh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"aSl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/item/reagent_containers/syringe, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"aSO" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"aSP" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"aTw" = ( +/obj/item/ammo_casing/shotgun/buckshot{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/ammo_casing/shotgun/buckshot{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"aTQ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/fore) +"aTS" = ( +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"aUc" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aUk" = ( +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"aUx" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"aUy" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/holodeck/rec_center) +"aUG" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aUH" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"aUJ" = ( +/obj/item/cigbutt, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"aUK" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -8 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -8; + pixel_y = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aUY" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"aVa" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"aVe" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/holopad{ + pixel_y = 16 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"aVl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/closed/wall, +/area/maintenance/upper/aft) +"aVp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"aVs" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"aVu" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"aVw" = ( +/turf/open/floor/plating, +/area/maintenance/port) +"aVy" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "5" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/turf/open/floor/plating, +/area/medical/surgery/aux) +"aVF" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"aVR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"aVT" = ( +/obj/effect/turf_decal/bot, +/obj/effect/landmark/start/roboticist, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"aWe" = ( +/obj/machinery/nanite_chamber, +/turf/open/floor/circuit, +/area/science/nanite) +"aWh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/main) +"aWj" = ( +/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/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"aWm" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"aWo" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/stairs, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aWp" = ( +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"aWF" = ( +/obj/structure/chair/sofa/right{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"aWO" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/rack, +/obj/item/storage/belt/utility, +/obj/item/book/manual/wiki/robotics_cyborgs{ + pixel_x = 2; + pixel_y = 5 + }, +/obj/machinery/airalarm/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"aWY" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"aXc" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"aXg" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"aXl" = ( +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics"; + req_access_txt = "24" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"aXs" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/main) +"aXt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/science/shuttledock) +"aXG" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"aXQ" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"aXU" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel, +/area/engine/atmos) +"aXZ" = ( +/obj/structure/table/reinforced, +/obj/item/circuitboard/machine/shuttle/engine/plasma{ + pixel_x = -4; + pixel_y = 7 + }, +/obj/item/circuitboard/machine/shuttle/engine/plasma{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/circuitboard/machine/shuttle/heater{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/circuitboard/machine/shuttle/heater{ + pixel_x = -6; + pixel_y = 1 + }, +/obj/item/circuitboard/computer/shuttle/flight_control{ + pixel_x = -8; + pixel_y = -2 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"aYa" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"aYf" = ( +/obj/structure/stairs{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"aYp" = ( +/obj/structure/table/reinforced, +/obj/item/storage/firstaid/regular, +/obj/item/folder/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"aYq" = ( +/obj/structure/bodycontainer/crematorium{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"aYs" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/brig) +"aYx" = ( +/obj/structure/cable/yellow{ + 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/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"aYA" = ( +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"aYN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"aYQ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, +/area/science/research) +"aYS" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"aYV" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/atmos) +"aYW" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"aZg" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"aZu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"aZx" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Fuel to Supermatter" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"aZD" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"aZI" = ( +/obj/machinery/door/window/brigdoor{ + dir = 8; + name = "Telecommunications"; + req_access_txt = "61" + }, +/obj/machinery/door/window/brigdoor{ + dir = 4; + name = "Telecommunications"; + req_access_txt = "61" + }, +/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 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/computer) +"aZL" = ( +/obj/structure/closet/crate/wooden/toy, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/theatre) +"aZM" = ( +/obj/effect/spawner/room/threexfive, +/turf/open/floor/plating, +/area/maintenance/port) +"aZQ" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"bah" = ( +/obj/structure/bookcase/random/fiction, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"ban" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"bat" = ( +/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/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"baJ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"baO" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/carpet/blue, +/area/security/brig) +"baW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"baZ" = ( +/obj/structure/table/reinforced, +/obj/effect/landmark/event_spawn, +/obj/item/book/manual/wiki/tcomms, +/obj/item/book/manual/wiki/engineering_construction, +/obj/item/rcl/pre_loaded, +/turf/open/floor/plasteel, +/area/engine/engineering) +"bbb" = ( +/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/closet/firecloset/full, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"bbc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/machinery/power/terminal, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"bbd" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Gas Control"; + req_access_txt = "10" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/engine_smes) +"bbe" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 4; + name = "Thermoelectric generator loop" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"bbm" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/medical/cryo) +"bbw" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/telecomms/receiver/preset_right, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) +"bbC" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/stairs{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"bbF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"bcd" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/circuit/green, +/area/security/nuke_storage) +"bch" = ( +/obj/machinery/computer/pandemic, +/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/tile/neutral, +/obj/structure/reagent_dispensers/virusfood{ + pixel_x = 32; + pixel_y = -32 + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"bck" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/reagent_dispensers/peppertank{ + pixel_y = 32 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"bct" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 5 + }, +/turf/open/openspace, +/area/engine/engine_room) +"bcw" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/sign/departments/minsky/supply/mining{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"bcF" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/camera/autoname{ + dir = 8; + network = list("aicore") + }, +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"bcM" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"bcT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/checkpoint/medical) +"bcW" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"bcZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/medical/sleeper) +"bdg" = ( +/obj/structure/chair/comfy, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"bdh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"bdl" = ( +/turf/open/floor/grass, +/area/crew_quarters/park) +"bdm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bdu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"bdx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"bdz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"bdA" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"bdD" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"bdG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/stack/sheet/mineral/plasma, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"bdU" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"bed" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"bei" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "comms" + }, +/turf/open/floor/plating, +/area/tcommsat/computer) +"bek" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"bem" = ( +/obj/structure/railing, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"ben" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"bev" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/redbeet, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"beL" = ( +/obj/machinery/door/window/eastleft, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"beM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bfc" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/sorting/mail/flip, +/turf/open/floor/plasteel, +/area/security/brig) +"bfd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/engine, +/area/engine/engine_room) +"bfe" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"bfi" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"bfj" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"bfk" = ( +/turf/closed/wall, +/area/science/robotics/lab) +"bfn" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/openspace, +/area/engine/engine_room) +"bfq" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/trinary/filter/flipped{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"bfs" = ( +/obj/structure/stairs, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bfD" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/turf/open/space/basic, +/area/solar/port/fore) +"bfF" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"bfM" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"bfN" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"bgn" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"bgy" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"bgB" = ( +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"bgJ" = ( +/obj/machinery/door/airlock{ + id_tag = "toilet3"; + name = "Toilet Unit" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"bgK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/crew_quarters/heads/hor) +"bgM" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"bgT" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"bhd" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/effect/landmark/start/scientist, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bhk" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"bhr" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "CO2 to Pure" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bhA" = ( +/obj/machinery/vending/medical, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bhK" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"bhY" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"bib" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"bic" = ( +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"bif" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"bil" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Arcade" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"bit" = ( +/obj/structure/rack, +/obj/item/pet_carrier, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"biE" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "shower2a" + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/toilet) +"biS" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bjh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"bjm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bjq" = ( +/obj/effect/turf_decal/tile{ + dir = 8 + }, +/obj/effect/turf_decal/tile{ + dir = 4 + }, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/effect/turf_decal/tile, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"bjz" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"bjE" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"bkg" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/porta_turret/ai{ + dir = 4; + installation = /obj/item/gun/energy/e_gun + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"bkv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/security/brig) +"bkE" = ( +/obj/structure/cable/yellow{ + 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 = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"bkH" = ( +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/upper/fore) +"bkL" = ( +/turf/closed/wall, +/area/security/detectives_office) +"ble" = ( +/obj/machinery/requests_console{ + pixel_y = -32 + }, +/turf/closed/wall/r_wall, +/area/hallway/primary/fore) +"bli" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/research) +"blq" = ( +/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/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"blt" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"blC" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"blF" = ( +/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/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/research) +"blG" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/science/shuttle) +"blH" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"blN" = ( +/obj/effect/spawner/room/threexfive, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"blU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/lab) +"blY" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"blZ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, +/area/science/research) +"bmb" = ( +/obj/structure/sink/puddle, +/obj/effect/landmark/event_spawn, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"bmB" = ( +/obj/structure/chair/sofa/right{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Abandoned Bar"; + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/maintenance/port) +"bmC" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/turf/open/floor/wood, +/area/quartermaster/storage) +"bmN" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"bmT" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"bni" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"bnm" = ( +/obj/structure/closet/crate, +/obj/item/reagent_containers/food/condiment/sugar, +/obj/item/storage/fancy/egg_box, +/obj/item/storage/fancy/egg_box, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bnw" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"bnE" = ( +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hydroponics) +"bnI" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"bnZ" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"bod" = ( +/obj/structure/rack, +/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/tank/jetpack/carbondioxide{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"bog" = ( +/turf/closed/wall/r_wall, +/area/security/execution/education) +"bor" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/carpet/orange, +/area/quartermaster/qm) +"bou" = ( +/obj/machinery/disposal/bin, +/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/item/radio/intercom{ + pixel_y = -28 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"boJ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"boP" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bpf" = ( +/obj/machinery/computer/scan_consolenew{ + 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 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bpn" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/aisat_interior) +"bpw" = ( +/obj/structure/chair/comfy/black, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"bpA" = ( +/obj/machinery/computer/operating{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"bpD" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"bpF" = ( +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/fore) +"bpJ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/structure/table/reinforced, +/obj/machinery/reagentgrinder{ + pixel_x = -1; + pixel_y = 7 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"bpN" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bqh" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stamp/hop{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 7; + pixel_y = -25 + }, +/obj/item/cartridge/hop{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 1 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/hop) +"bqm" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "HOS's Desk"; + departmentType = 5; + name = "Captain RC"; + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/bed/pod, +/obj/item/bedsheet/hos, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/item/storage/secure/safe/HoS{ + pixel_x = 37; + pixel_y = 30 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"bqq" = ( +/obj/structure/flora/ausbushes/fernybush, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/grass, +/area/crew_quarters/park) +"bqy" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 25 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"bqG" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"bqR" = ( +/obj/structure/closet/crate/hydroponics, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bqW" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/exploration_prep) +"brv" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"brJ" = ( +/obj/structure/railing, +/turf/open/openspace/airless, +/area/space/nearstation) +"brQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"brT" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"brY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"bse" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"bsf" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bsm" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"bsp" = ( +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"bsu" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"bte" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/fore) +"btm" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating, +/area/engine/engine_room) +"btv" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"btx" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"btB" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"btK" = ( +/obj/structure/table/reinforced, +/obj/item/stock_parts/subspace/analyzer{ + pixel_x = -3 + }, +/obj/item/stock_parts/subspace/analyzer{ + pixel_x = -5; + pixel_y = -1 + }, +/obj/item/stock_parts/subspace/analyzer{ + pixel_x = -7; + pixel_y = -2 + }, +/obj/item/stock_parts/subspace/ansible{ + pixel_x = 1; + pixel_y = 6 + }, +/obj/item/stock_parts/subspace/ansible{ + pixel_y = 7 + }, +/obj/item/stock_parts/subspace/ansible{ + pixel_y = 8 + }, +/obj/item/stock_parts/subspace/crystal{ + pixel_y = -1 + }, +/obj/item/stock_parts/subspace/crystal{ + pixel_x = 2; + pixel_y = -3 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"btQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"btW" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/purple/visible, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"btY" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/turf/open/floor/plating, +/area/medical/medbay/lobby) +"buq" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"buv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"buD" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/book/manual/wiki/grenades{ + pixel_y = 3 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"buH" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"buI" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"buM" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"buO" = ( +/obj/effect/spawner/room/threexthree, +/turf/open/floor/plating, +/area/maintenance/port) +"buU" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"buX" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/air, +/obj/item/wrench, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"buY" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hydroponics/garden/abandoned) +"bvh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bvm" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"bvq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"bvu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bvx" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/monofloor{ + dir = 8 + }, +/area/quartermaster/exploration_prep) +"bvI" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 4; + name = "Gas to Filter" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"bvL" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace/airless, +/area/space/nearstation) +"bvQ" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bvZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio3"; + name = "containment blast door" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"bwc" = ( +/turf/open/openspace, +/area/medical/chemistry/upper) +"bwg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/marker_beacon, +/turf/open/floor/plating, +/area/science/misc_lab/range) +"bwk" = ( +/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/dark, +/area/crew_quarters/dorms) +"bwn" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"bww" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"bwx" = ( +/obj/machinery/deepfryer, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"bwB" = ( +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"bxi" = ( +/obj/structure/closet/crate/rcd, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "RCD Storage"; + pixel_x = 1; + req_access_txt = "19" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"bxI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/railing{ + dir = 5 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"bxQ" = ( +/obj/machinery/vending/wardrobe/medi_wardrobe, +/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/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/medical/storage) +"bxR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_y = -25 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"byb" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Departures Lounge" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"byv" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation B"; + req_access_txt = "39" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"byx" = ( +/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/plating, +/area/maintenance/starboard/secondary) +"byD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"byE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/vending/tool, +/turf/open/floor/plasteel/dark, +/area/engine/storage_shared) +"byS" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bzf" = ( +/turf/open/floor/carpet/blue, +/area/security/brig) +"bzi" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"bzx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"bzF" = ( +/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/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/window/brigdoor{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"bAa" = ( +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"bAd" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/chair, +/turf/open/floor/plasteel/dark, +/area/medical/surgery/aux) +"bAr" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"bAw" = ( +/obj/machinery/computer/atmos_alert, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/bridge) +"bAZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"bBe" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/table/reinforced, +/obj/item/aiModule/core/full/asimov, +/obj/item/aiModule/reset/purge, +/obj/item/aiModule/reset, +/turf/open/floor/circuit/green, +/area/ai_monitored/turret_protected/ai_upload) +"bBg" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"bBi" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bBs" = ( +/obj/structure/table/wood, +/obj/item/storage/box/evidence, +/obj/item/melee/classic_baton/police, +/obj/item/reagent_containers/food/drinks/flask/det, +/obj/item/clothing/glasses/hud/security/sunglasses, +/obj/item/clothing/glasses/hud/security/sunglasses, +/turf/open/floor/carpet/red, +/area/security/detectives_office) +"bBt" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"bBv" = ( +/obj/machinery/door/window/northleft{ + dir = 4; + name = "medical supplies"; + req_access_txt = "5" + }, +/obj/structure/table/reinforced, +/obj/item/storage/firstaid/regular, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/item/stack/medical/gauze, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bBA" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"bCd" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/security/nuke_storage) +"bCi" = ( +/obj/item/radio/intercom{ + pixel_x = 30 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"bCH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bCM" = ( +/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/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"bCP" = ( +/obj/machinery/air_sensor/atmos/sm_core, +/turf/open/floor/engine, +/area/engine/supermatter) +"bCU" = ( +/obj/machinery/door/airlock/external{ + name = "Labour Shuttle"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"bCX" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"bCZ" = ( +/turf/open/floor/plasteel/white, +/area/science/lab) +"bDd" = ( +/obj/machinery/advanced_airlock_controller{ + pixel_y = 24 + }, +/obj/machinery/suit_storage_unit, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"bDj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/requests_console{ + department = "Toxins"; + departmentType = 2; + pixel_y = 32 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bDl" = ( +/obj/machinery/atmospherics/components/unary/tank/air, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"bDn" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/item/kirbyplants/random, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"bDo" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Robotics Lab"; + req_access_txt = "29" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/science/research) +"bDq" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/research{ + id_tag = "ResearchExt"; + name = "Research Division"; + req_one_access_txt = "47" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/research) +"bDC" = ( +/obj/structure/flora/ausbushes/sunnybush, +/obj/structure/flora/ausbushes/brflowers, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"bDD" = ( +/obj/item/stack/cable_coil/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"bDF" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"bDI" = ( +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = 32 + }, +/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/dark, +/area/crew_quarters/heads/hos) +"bDO" = ( +/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/plating, +/area/maintenance/starboard/secondary) +"bDU" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/engine/atmos) +"bEk" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"bEn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"bEq" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"bEw" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bEy" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bEA" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/closet/secure_closet/security/sec, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bEF" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"bEN" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"bEQ" = ( +/obj/machinery/door/airlock/mining{ + name = "Cargo Bay"; + req_access_txt = "31" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bFf" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/table, +/obj/item/construction/rcd/loaded{ + pixel_y = 4 + }, +/obj/item/construction/rcd/loaded{ + pixel_x = 1; + pixel_y = 6 + }, +/obj/item/construction/rcd/loaded{ + pixel_x = 2; + pixel_y = 8 + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"bFi" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/sign/departments/security{ + pixel_x = 32 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"bFl" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"bFu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/machinery/vending/cola/random, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"bFv" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/requests_console{ + department = "Warden's Office"; + departmentType = 5; + pixel_y = 32 + }, +/obj/structure/bed/dogbed/walter, +/mob/living/simple_animal/pet/dog/bullterrier/walter, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"bFC" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/dropper, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"bFE" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/chair/office/light, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_a) +"bFH" = ( +/obj/structure/table, +/obj/item/stack/sheet/plasteel{ + amount = 10 + }, +/obj/item/assembly/flash/handheld/weak, +/obj/item/assembly/flash/handheld/weak, +/obj/item/assembly/flash/handheld/weak, +/obj/item/assembly/flash/handheld/weak, +/obj/item/assembly/flash/handheld/weak, +/obj/item/assembly/flash/handheld/weak, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"bFP" = ( +/turf/closed/wall, +/area/security/checkpoint/medical) +"bGb" = ( +/obj/machinery/button/door{ + id = "Skynet_launch"; + name = "Mech Bay Door Control"; + pixel_x = -26; + pixel_y = 6; + req_access_txt = "29" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"bGc" = ( +/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/effect/turf_decal/tile/green, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters{ + id = "custodialshutters"; + name = "Custodial Closet Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/janitor) +"bGj" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/engineering{ + name = "Port Quarter Solar Maintenance"; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"bGx" = ( +/obj/machinery/newscaster{ + pixel_x = 28 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"bGA" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics/cloning) +"bGT" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"bHe" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"bHl" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/openspace, +/area/maintenance/upper/central) +"bHs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"bHx" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"bHD" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bHJ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"bHN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/machinery/anesthetic_machine, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"bHV" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bId" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/electrical, +/obj/item/clothing/gloves/color/fyellow, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/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 = 1 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"bIj" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/camera/autoname{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"bIl" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"bIn" = ( +/obj/machinery/computer/bank_machine, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"bIE" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/closet/secure_closet/engineering_personal, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bIJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/miningdock) +"bIK" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/science/storage) +"bIX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"bIY" = ( +/turf/open/floor/plasteel, +/area/maintenance/starboard/secondary) +"bIZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/chief) +"bJb" = ( +/obj/machinery/computer/crew{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"bJi" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"bJj" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bJl" = ( +/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/plating, +/area/crew_quarters/dorms) +"bJp" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"bJs" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/bridge) +"bJB" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/landmark/start/warden, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"bJC" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"bJD" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/lobby) +"bJF" = ( +/obj/structure/chair/comfy/black, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bJQ" = ( +/turf/open/floor/plasteel/white, +/area/quartermaster/storage) +"bJU" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"bJV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"bKa" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bKq" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/machinery/telecomms/bus/preset_four, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) +"bKY" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"bLc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"bLd" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"bLu" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"bLy" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"bLB" = ( +/obj/structure/chair/pew/left{ + dir = 8 + }, +/turf/open/floor/plasteel/chapel{ + dir = 4 + }, +/area/chapel/main/monastery) +"bLF" = ( +/obj/machinery/camera/autoname, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"bLL" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"bLP" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input, +/turf/open/floor/engine/vacuum, +/area/science/mixing/chamber) +"bLS" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"bLT" = ( +/obj/structure/table/glass, +/obj/item/wrench, +/obj/item/screwdriver, +/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/effect/turf_decal/tile/purple, +/obj/item/storage/box/monkeycubes, +/obj/item/storage/box/monkeycubes, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bLX" = ( +/obj/structure/filingcabinet/chestdrawer{ + pixel_y = 2 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"bMc" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"bMk" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/tile/red{ + 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/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/landmark/start/depsec/science, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/science) +"bMl" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bMt" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 3 + }, +/obj/item/pen, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/library) +"bMv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/airalarm/directional/south, +/obj/machinery/stasis, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"bMw" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/vendor/exploration, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"bME" = ( +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"bMF" = ( +/obj/machinery/photocopier{ + pixel_x = -2; + pixel_y = -3 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"bMQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"bMU" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bNb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/structure/cable/yellow{ + 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 = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"bNl" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/purple/visible, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bNB" = ( +/turf/open/floor/circuit/green, +/area/engine/gravity_generator) +"bNG" = ( +/obj/machinery/button/door{ + id = "isola"; + name = "Privacy Shutters"; + pixel_x = -28; + pixel_y = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_a) +"bNL" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4; + sortType = 13 + }, +/turf/open/floor/plasteel, +/area/science/research) +"bNZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"bOg" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"bOj" = ( +/obj/machinery/power/solar, +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/port/aft) +"bOl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"bOp" = ( +/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, +/area/hallway/upper/secondary/entry) +"bOw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"bOy" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = 6; + pixel_y = 2 + }, +/obj/item/pen{ + pixel_x = 5; + pixel_y = 1 + }, +/obj/item/flashlight/lamp/green{ + pixel_x = -6; + pixel_y = 13 + }, +/obj/item/stamp/captain, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"bOB" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/reagent_containers/food/drinks/britcup, +/turf/open/floor/plasteel/white, +/area/security/prison) +"bOE" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"bOH" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/dorms) +"bOJ" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"bOM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bOU" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"bPe" = ( +/obj/effect/decal/cleanable/glass, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"bPk" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Equipment Storage"; + req_one_access_txt = "1;4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/main) +"bPl" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bPn" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"bPH" = ( +/obj/structure/table, +/obj/item/storage/lockbox/loyalty, +/obj/item/radio, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bPM" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/holopad{ + pixel_y = 16 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/filingcabinet/security, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"bPN" = ( +/turf/closed/wall/r_wall, +/area/science/server) +"bQo" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/dorms) +"bQp" = ( +/turf/closed/wall, +/area/janitor) +"bQr" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"bQs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"bQt" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"bQu" = ( +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/secondary) +"bQv" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"bQx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/fore) +"bQB" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"bQM" = ( +/turf/open/floor/noslip/standard, +/area/hallway/secondary/service) +"bQQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/sign/departments/science{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"bQW" = ( +/obj/machinery/door/window/northleft{ + name = "Containment Pen #4"; + req_access_txt = "55" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bRh" = ( +/obj/effect/landmark/carpspawn, +/turf/open/space/basic, +/area/space) +"bRi" = ( +/obj/machinery/computer/cargo, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "QMLoaddoor2"; + name = "Cargo Offload"; + normaldoorcontrol = 0; + pixel_x = 6; + pixel_y = 28 + }, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "QMLoaddoor"; + name = "Cargo Loading"; + normaldoorcontrol = 0; + pixel_x = -5; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bRu" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"bRx" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bSa" = ( +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"bSb" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"bSt" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"bSD" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"bSE" = ( +/obj/machinery/atmospherics/components/trinary/filter/critical, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"bSL" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + 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/layer3, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bSM" = ( +/obj/structure/chair/wood, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"bSQ" = ( +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"bSV" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Access" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"bSX" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"bTd" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"bTg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"bTl" = ( +/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/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bTt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bTC" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"bTE" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/flora/ausbushes/ywflowers, +/obj/structure/flora/ausbushes/fullgrass, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/grass, +/area/hallway/secondary/command) +"bTH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/airlock/medical{ + name = "Morgue"; + req_access_txt = "6" + }, +/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, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/medical/morgue) +"bTK" = ( +/obj/machinery/computer/shuttle_flight/mining{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) +"bTR" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/dorms) +"bTY" = ( +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bUg" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/engineering) +"bUh" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bUj" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"bUp" = ( +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"bUA" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bUI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"bUM" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"bUY" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"bVb" = ( +/turf/closed/wall, +/area/medical/cryo) +"bVd" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 8; + name = "Thermoelectric Generator Output" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/engine, +/area/engine/engine_room) +"bVr" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"bVD" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"bVR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/exploration_prep) +"bVS" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"bVU" = ( +/obj/machinery/light/small/built{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/item/restraints/handcuffs/cable/zipties/used, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"bVX" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/airalarm/directional/west, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/dorms) +"bVY" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "hopqueue"; + name = "HoP Queue Shutters" + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/hop) +"bWd" = ( +/obj/structure/chair, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"bWs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/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/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bWz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/maintenance/starboard/secondary) +"bWQ" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"bWT" = ( +/obj/item/kirbyplants/random, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"bWX" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"bXe" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 12 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"bXl" = ( +/obj/machinery/door/poddoor/shutters{ + id = "aux_base_shutters"; + name = "Auxillary Base Shutters" + }, +/turf/open/floor/plating, +/area/construction/mining/aux_base) +"bXv" = ( +/obj/structure/table, +/obj/item/flashlight, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"bXE" = ( +/turf/closed/wall, +/area/vacant_room/commissary) +"bXS" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bXT" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"bXY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"bYc" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"bYk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Pet Storage" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"bYm" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"bYo" = ( +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"bYt" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Warehouse Maintenance"; + req_access_txt = "31" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bYB" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm4"; + name = "Cabin 4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"bYH" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"bYO" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"bZi" = ( +/obj/effect/turf_decal/tile/purple, +/obj/structure/sign/departments/minsky/research/xenobiology{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"bZm" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light_switch{ + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"bZo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"bZK" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"bZM" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cad" = ( +/obj/structure/flora/ausbushes/pointybush, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/extinguisher_cabinet{ + pixel_x = -30 + }, +/turf/open/floor/grass, +/area/hallway/secondary/command) +"cae" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"cag" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"caX" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"caZ" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"cba" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/ladder, +/turf/open/floor/plating, +/area/science/misc_lab/range) +"cbn" = ( +/obj/effect/spawner/structure/window, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating, +/area/hydroponics/garden/abandoned) +"cbp" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"cbq" = ( +/turf/open/openspace/airless, +/area/crew_quarters/bar) +"cbD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/wood, +/area/library) +"cbH" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1 + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/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/dark, +/area/engine/engine_room) +"cbN" = ( +/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/structure/table, +/obj/effect/spawner/lootdrop/donkpockets, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"cbQ" = ( +/obj/machinery/stasis, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"cbY" = ( +/obj/machinery/computer/atmos_control/tank/nitrogen_tank, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"ccb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/door/airlock/public/glass{ + name = "Departures Lounge" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"ccd" = ( +/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/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"ccq" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/turf/open/floor/wood, +/area/vacant_room/office) +"ccx" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"ccB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ccC" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"ccS" = ( +/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/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"ccT" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"ccU" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"ccW" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 6 + }, +/turf/open/openspace, +/area/engine/engine_room) +"ccY" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"cdd" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/cryopods) +"cde" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/white, +/area/security/brig) +"cdk" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/railing, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"cdq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"cds" = ( +/obj/machinery/portable_atmospherics/scrubber/huge, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/science/storage) +"cdv" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/maintenance/upper/central) +"cdz" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/kirbyplants/random, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cdK" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"cdO" = ( +/turf/closed/wall, +/area/chapel/main/monastery) +"cec" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"cei" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cel" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"ceo" = ( +/turf/closed/wall/r_wall, +/area/security/checkpoint/engineering) +"ceE" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile{ + dir = 8 + }, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/stamp/cmo, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"ceP" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"ceT" = ( +/obj/machinery/door/airlock/hatch{ + name = "Telecommunications Relay"; + req_access_txt = "61" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/relay) +"cfs" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"cfv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cfG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"cfI" = ( +/obj/machinery/atmospherics/pipe/simple/purple/visible, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cfU" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"cgc" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/crew_quarters/cryopods) +"cgf" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/turf/open/floor/plasteel/dark, +/area/gateway) +"cgg" = ( +/obj/machinery/computer/secure_data, +/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/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/bridge) +"cgm" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"cgp" = ( +/obj/structure/flora/ausbushes/ywflowers, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"cgr" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"cgu" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/structure/cable/yellow, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/hallway/secondary/command) +"cgv" = ( +/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/structure/closet/secure_closet/personal, +/obj/item/clothing/under/suit/red, +/obj/item/clothing/under/dress/blacktango, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"cgG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"cgO" = ( +/obj/machinery/camera/autoname{ + network = list("aicore") + }, +/turf/open/openspace/airless, +/area/ai_monitored/turret_protected/aisat_interior) +"chb" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/checkpoint/science) +"chf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"chl" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"chx" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"chQ" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"chT" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/science) +"chZ" = ( +/obj/structure/flora/junglebush/large, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/grass, +/area/crew_quarters/park) +"cin" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/hallway/secondary/exit) +"ciM" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Hydroponics"; + req_access_txt = "35" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hydroponics) +"ciN" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"ciX" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/landmark/start/lawyer, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"cjd" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"cjf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "comms" + }, +/turf/open/floor/plating, +/area/tcommsat/computer) +"cjg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"cjh" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"cjm" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/port/central) +"cjQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"cjT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"cjZ" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/openspace, +/area/maintenance/upper/central) +"cka" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"ckh" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"ckl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"ckr" = ( +/obj/machinery/door/airlock/command{ + name = "Gateway Access"; + req_access_txt = "62" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"ckz" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Research Lab Maintenance"; + req_one_access_txt = "7;29" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/lab) +"ckD" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/eastleft{ + dir = 8; + req_access_txt = "1" + }, +/obj/machinery/door/window/westright{ + dir = 4 + }, +/obj/item/camera, +/obj/item/camera_film, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"ckH" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/reagentgrinder{ + pixel_x = -1; + pixel_y = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"clc" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/item/reagent_containers/food/drinks/shaker, +/obj/item/stack/spacecash/c10, +/obj/item/stack/spacecash/c100{ + pixel_x = -1; + pixel_y = 2 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"cld" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/space/nearstation) +"clv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"clx" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"clA" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"clH" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"clQ" = ( +/obj/structure/closet/secure_closet/warden, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"clT" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"cme" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"cmh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"cmp" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Air Inlet Pump"; + target_pressure = 500 + }, +/obj/item/analyzer, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/turf/open/floor/plating, +/area/security/brig) +"cmx" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cmz" = ( +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/closet/secure_closet/hop, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"cmC" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/reagent_containers/food/drinks/britcup{ + pixel_x = 2; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/drinks/britcup{ + pixel_x = -5; + pixel_y = 1 + }, +/obj/item/reagent_containers/food/drinks/britcup{ + pixel_x = 5; + pixel_y = 1 + }, +/turf/open/floor/plasteel, +/area/bridge) +"cmD" = ( +/turf/open/floor/engine/vacuum, +/area/engine/atmos) +"cmQ" = ( +/obj/structure/sign/departments/minsky/medical/virology/virology2{ + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cmR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"cmV" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -8; + pixel_y = 10 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -8; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/maintenance/port) +"cmY" = ( +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal) +"cnh" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/nuke_storage) +"cnj" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/item/clothing/under/dress/skirt/purple, +/obj/item/clothing/under/suit/black, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"cnA" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot_white, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cnI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"cnR" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/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 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cnS" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Port to Filter" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"coa" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"col" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/sign/departments/minsky/supply/cargo{ + pixel_x = 32 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"cor" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"cou" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/table, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/lab) +"coE" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"coT" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"coU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/poddoor/preopen{ + id = "ceprivacy"; + name = "privacy shutter" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"coV" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"cpb" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cpe" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cpg" = ( +/obj/structure/sign/departments/minsky/engineering/engineering{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"cpi" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/vending/wallmed{ + pixel_x = 32 + }, +/obj/structure/stairs{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cpq" = ( +/obj/machinery/biogenerator, +/obj/machinery/door/window/eastleft{ + dir = 1; + name = "Hydroponics Desk"; + req_access_txt = "35" + }, +/obj/machinery/door/window/eastleft{ + dir = 2; + name = "Kitchen Desk"; + req_access_txt = "28" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"cpt" = ( +/obj/structure/table, +/obj/item/crowbar, +/obj/item/wirecutters, +/obj/effect/turf_decal/stripes/line{ + 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 = 1 + }, +/obj/item/modular_computer/tablet/preset/cheap, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"cpA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"cpB" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"cpH" = ( +/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/atmos) +"cpI" = ( +/obj/structure/bookcase/random/fiction, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"cpJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"cqc" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/newscaster{ + pixel_x = 28 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"cqD" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/item/pickaxe/drill, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/advanced_airlock_controller/directional/north, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"cqF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"cqM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"crb" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating/airless, +/area/engine/engine_room) +"cri" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"crl" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"crp" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"crA" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/circuitboard/machine/paystand, +/obj/item/stack/sheet/iron/five, +/obj/item/stack/cable_coil/random/five, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/vacant_room/commissary) +"crG" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"crO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"crY" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"csh" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"csk" = ( +/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/tile/neutral, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"csp" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/landmark/start/atmospheric_technician, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"csR" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/two, +/obj/item/flashlight/glowstick/cyan, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/science) +"csW" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"csX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"csY" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/machinery/conveyor{ + dir = 5; + id = "recycling" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cta" = ( +/obj/machinery/ore_silo, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"ctc" = ( +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"ctk" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"ctv" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"ctV" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/structure/closet/secure_closet/miner, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"cuc" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/engine, +/area/engine/engine_room) +"cuh" = ( +/turf/closed/wall/r_wall, +/area/engine/storage) +"cun" = ( +/obj/effect/turf_decal/caution, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/noslip/standard, +/area/hallway/secondary/service) +"cur" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"cuy" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/engine/engine_room) +"cuD" = ( +/obj/structure/closet/secure_closet/medical3, +/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/effect/turf_decal/tile/yellow, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/storage) +"cuP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"cvi" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"cvj" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cvn" = ( +/obj/machinery/door/poddoor/incinerator_atmos_main, +/turf/open/floor/engine/vacuum, +/area/engine/atmospherics_engine) +"cvq" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"cvu" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"cvM" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"cvP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"cvU" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"cvY" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cwn" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cww" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/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, +/area/maintenance/department/science) +"cwC" = ( +/obj/effect/spawner/room/threexfive, +/turf/open/floor/plating, +/area/maintenance/fore) +"cwG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cwJ" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cwO" = ( +/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/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"cxg" = ( +/obj/structure/table/wood, +/obj/item/candle, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"cxr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"cxx" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"cxA" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"cxH" = ( +/turf/closed/wall, +/area/science/research) +"cxI" = ( +/obj/machinery/door/airlock{ + name = "Toilet Unit" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"cxM" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/chair/office, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/landmark/start/depsec/medical, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/medical) +"cxN" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/engineering_construction{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/engineering_singulo_tesla, +/obj/item/book/manual/wiki/engineering_guide{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/machinery/button/massdriver{ + id = "smeject"; + name = "supermatter ejection sequence"; + pixel_x = -27; + pixel_y = 7; + req_access_txt = "56" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/button/door{ + id = "engsm"; + name = "Radiation Shutters"; + pixel_x = -27; + pixel_y = -3 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) +"cyg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"cyj" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/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/delivery, +/obj/machinery/door/window/eastleft{ + dir = 8; + name = "Medical Deliveries"; + req_one_access_txt = "5" + }, +/turf/open/floor/plasteel, +/area/medical/sleeper) +"cym" = ( +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/quartermaster/storage) +"cyv" = ( +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/obj/machinery/power/solar, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/port/fore) +"cyI" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"cyL" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/storage/toolbox/emergency{ + pixel_x = 2; + pixel_y = -3 + }, +/obj/item/wirecutters{ + pixel_y = 2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"cyU" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"cyZ" = ( +/obj/machinery/power/smes, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"czh" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/warning/docking{ + pixel_x = -32 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"czm" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/engineering{ + name = "Shuttle Lab"; + req_one_access_txt = "32;19;47" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/engine/engineering) +"czn" = ( +/turf/open/openspace/airless, +/area/space) +"czv" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"czA" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"czC" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"czG" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"czH" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"czL" = ( +/obj/structure/rack, +/obj/item/storage/fancy/donut_box, +/obj/item/key/security, +/obj/item/key/security, +/obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"czN" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"czZ" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"cAb" = ( +/obj/machinery/button/door{ + id = "robotics_shutters"; + name = "robotics shutters control"; + pixel_x = 26; + pixel_y = 26; + req_access_txt = "29" + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"cAc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"cAd" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Kill Chamber"; + req_access_txt = "3" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"cAg" = ( +/obj/structure/table_frame, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"cAw" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/white, +/area/science/research) +"cAE" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/landmark/secequipment, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/security/main) +"cAM" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/sign/departments/minsky/research/research{ + pixel_y = -32 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"cAN" = ( +/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/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"cAT" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"cBf" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = -28; + prison_radio = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"cBr" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"cBB" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"cBN" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cBO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"cBV" = ( +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"cCa" = ( +/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" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cCm" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"cCn" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"cCz" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/landmark/start/lawyer, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"cCA" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/lootdrop/glowstick, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cDw" = ( +/obj/item/flashlight/glowstick/cyan, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"cDB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/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/chair/stool/bar{ + pixel_y = 12 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cDI" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/law) +"cDQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"cDV" = ( +/turf/open/floor/plating, +/area/maintenance/fore) +"cEm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio2"; + name = "containment blast door" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"cEn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"cEq" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"cEy" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"cEB" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"cEC" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/camera/autoname{ + dir = 4; + network = list("aicore") + }, +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"cEJ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"cEM" = ( +/obj/structure/flora/junglebush/large, +/turf/open/floor/grass, +/area/crew_quarters/park) +"cES" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/table, +/obj/item/paper_bin/construction, +/obj/item/pen/blue{ + pixel_x = 1; + pixel_y = 1 + }, +/obj/item/pen/red{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"cFe" = ( +/obj/machinery/door/airlock{ + name = "Kitchen Coldroom"; + req_access_txt = "28" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"cFg" = ( +/turf/closed/wall, +/area/maintenance/department/bridge) +"cFC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"cFE" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"cFL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"cGp" = ( +/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/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"cGI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/checkpoint/supply) +"cGK" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"cGS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/rnd/production/protolathe/department/science, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/lab) +"cGX" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) +"cHb" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/railing/corner, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"cHj" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/grille, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"cHH" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"cHJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "virology"; + name = "Virology Lockdown Shutters" + }, +/turf/open/floor/plating, +/area/medical/virology) +"cHU" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/holopad, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cIk" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"cIp" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"cIt" = ( +/obj/structure/flora/ausbushes/leafybush, +/obj/structure/flora/rock/pile/largejungle, +/turf/open/floor/grass, +/area/crew_quarters/park) +"cIv" = ( +/obj/machinery/modular_computer/console/preset/curator, +/turf/open/floor/carpet/green, +/area/library) +"cIz" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"cIK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio6"; + name = "containment blast door" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"cIM" = ( +/obj/machinery/computer/cryopod{ + pixel_y = 26 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/cryopods) +"cIO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/engine_room) +"cIU" = ( +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"cIV" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"cIX" = ( +/obj/structure/sign/warning/securearea{ + pixel_x = 32 + }, +/turf/open/space/basic, +/area/space) +"cJd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/stairs/left{ + dir = 8 + }, +/area/hallway/secondary/service) +"cJr" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/fore) +"cJB" = ( +/obj/effect/turf_decal/tile/blue{ + 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/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"cJK" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"cJO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"cJQ" = ( +/obj/machinery/modular_computer/console/preset/engineering{ + dir = 4 + }, +/turf/open/floor/circuit/green, +/area/engine/gravity_generator) +"cJR" = ( +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"cJU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"cKd" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science{ + req_access_txt = "49" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"cKf" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/airalarm/server{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 1; + initialize_directions = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"cKl" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = -25; + pixel_y = 28 + }, +/mob/living/carbon/monkey/punpun, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"cKq" = ( +/obj/machinery/light/small/broken{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"cKt" = ( +/obj/structure/rack, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/flashlight/seclite, +/obj/item/restraints/handcuffs, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"cKu" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"cKy" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/cryopods) +"cKF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"cKH" = ( +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"cKP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"cKS" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cLp" = ( +/obj/machinery/atmospherics/pipe/manifold/dark/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cLu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"cLx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/public/glass, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"cLN" = ( +/obj/machinery/computer/security{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"cLV" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"cLW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"cLX" = ( +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"cMa" = ( +/obj/structure/closet/crate, +/obj/item/stack/ore/copper, +/obj/item/stack/ore/copper, +/obj/item/stack/ore/copper, +/obj/item/stack/ore/copper, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"cMm" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/landmark/start/security_officer, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"cMr" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"cMB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"cMN" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/stairs/right{ + dir = 8 + }, +/area/hallway/secondary/service) +"cMQ" = ( +/obj/structure/table/wood, +/obj/item/stack/spacecash/c50{ + pixel_x = 2; + pixel_y = 7 + }, +/obj/item/stack/spacecash/c10{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/door/window/northright{ + base_state = "left"; + icon_state = "left"; + name = "Library Desk Door"; + pixel_x = 3; + req_access_txt = "37" + }, +/turf/open/floor/wood, +/area/library) +"cMS" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/upper/secondary/service) +"cMV" = ( +/obj/machinery/vending/boozeomat, +/turf/closed/wall, +/area/maintenance/port) +"cMW" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/gulag_teleporter, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"cMY" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"cNd" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"cNr" = ( +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/item/beacon, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cNC" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"cNE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"cNR" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"cNS" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"cNY" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/holopad, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"cOD" = ( +/obj/structure/transit_tube{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/medical/medbay/balcony) +"cOQ" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"cOX" = ( +/obj/effect/turf_decal/caution, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"cPf" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"cPj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cPm" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"cPp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"cPt" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"cPC" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cPD" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/turf/open/floor/plating, +/area/engine/atmos) +"cPI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"cPP" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"cQa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/closet/l3closet/scientist, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cQc" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/shower{ + dir = 1 + }, +/turf/open/floor/noslip/standard, +/area/engine/atmos) +"cQf" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"cQg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cQl" = ( +/obj/structure/plasticflaps/opaque, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + freq = 1400; + location = "Research and Development" + }, +/turf/open/floor/plasteel, +/area/science/lab) +"cQm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"cQr" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/security/brig) +"cQt" = ( +/obj/machinery/computer/cargo{ + dir = 8 + }, +/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/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"cQw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"cQG" = ( +/obj/structure/transit_tube{ + dir = 1 + }, +/turf/open/space/basic, +/area/space) +"cQY" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"cRm" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"cRw" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"cRJ" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/item/reagent_containers/food/drinks/flask/gold{ + pixel_x = -1; + pixel_y = 9 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"cRK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"cRQ" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall6"; + location = "hall5" + }, +/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/primary/fore) +"cRT" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"cSb" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"cSf" = ( +/obj/machinery/deepfryer, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"cSr" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cSs" = ( +/obj/machinery/telecomms/relay/preset/telecomms, +/obj/machinery/light/small, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/relay) +"cSw" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"cSL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"cSN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"cTA" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"cTE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"cTL" = ( +/obj/effect/turf_decal/tile/red, +/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/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"cTP" = ( +/obj/structure/table_frame, +/obj/item/stack/sheet/iron, +/obj/effect/decal/cleanable/dirt, +/obj/item/hand_labeler, +/turf/open/floor/plasteel/dark, +/area/vacant_room/commissary) +"cTS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"cUd" = ( +/turf/closed/wall, +/area/crew_quarters/theatre) +"cUn" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"cUo" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"cUq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall10"; + location = "hall9" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"cUG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"cUH" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"cUL" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/aisat_interior) +"cUZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/closed/wall, +/area/science/shuttle) +"cVb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/secondary) +"cVd" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"cVe" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/start/depsec/engineering, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/engineering) +"cVk" = ( +/turf/closed/wall, +/area/science/shuttledock) +"cVm" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"cVo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"cVr" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"cVs" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"cVU" = ( +/turf/open/openspace, +/area/hallway/upper/secondary/exit/departure_lounge) +"cVW" = ( +/obj/structure/cable/yellow{ + 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/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"cVY" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"cWb" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cWd" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"cWk" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"cWw" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"cWF" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 9 + }, +/obj/machinery/meter, +/turf/open/openspace, +/area/engine/engine_room) +"cWL" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"cWW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/brig) +"cWZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"cXc" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"cXj" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"cXt" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"cXw" = ( +/obj/structure/lattice, +/turf/closed/wall, +/area/chapel/office) +"cXH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"cXS" = ( +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/dorms) +"cYe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Mining Dock Airlock"; + req_access_txt = "48" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"cYr" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"cYz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"cYE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"cYF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/maintenance/solars/starboard/aft) +"cYH" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 1; + pixel_y = 4 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/requests_console{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) +"cYJ" = ( +/obj/machinery/camera/autoname{ + dir = 8; + network = list("aisat") + }, +/turf/open/openspace/airless, +/area/space/nearstation) +"cYO" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/light, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cYQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cYY" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"cZk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"cZo" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"cZs" = ( +/obj/effect/turf_decal/arrows, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cZz" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"cZL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"cZM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"cZO" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/science/shuttledock) +"cZR" = ( +/obj/machinery/atmospherics/pipe/manifold4w/general/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cZV" = ( +/obj/structure/plasticflaps/opaque, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + freq = 1400; + location = "Research Division" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/central) +"dah" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"dal" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"dan" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"daC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"daM" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line, +/obj/item/tank/internals/anesthetic, +/obj/item/clothing/mask/breath/medical, +/obj/item/reagent_containers/glass/bottle/morphine, +/turf/open/floor/plasteel, +/area/security/brig) +"daQ" = ( +/obj/structure/closet/secure_closet/engineering_welding, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/noslip/dark, +/area/engine/engineering) +"daT" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"daX" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/science/research) +"dbh" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/caution, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"dbm" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"dby" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/fore) +"dbH" = ( +/obj/machinery/computer/secure_data{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/hop) +"dbI" = ( +/turf/closed/wall, +/area/quartermaster/sorting) +"dbV" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"dca" = ( +/obj/structure/table/optable, +/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/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/medical/surgery/aux) +"dcG" = ( +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"dcP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/closed/wall, +/area/security/brig) +"ddd" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"ddj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"ddm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/vending/coffee, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"ddn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"ddr" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"ddw" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/closet/crate, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"ddy" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ddB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"ddN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"ddU" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/openspace, +/area/maintenance/upper/fore) +"dei" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/box/corners, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"del" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"deo" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"dex" = ( +/obj/structure/table/wood, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "HOP's Desk"; + departmentType = 5; + pixel_y = -32 + }, +/obj/machinery/recharger, +/obj/machinery/keycard_auth{ + pixel_x = 26 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/hop) +"deB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/storage_shared) +"deG" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/landmark/start/station_engineer, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"deH" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"deJ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"deM" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/table/reinforced, +/obj/effect/spawner/lootdrop/aimodule_harmless, +/obj/effect/spawner/lootdrop/aimodule_harmless, +/obj/effect/spawner/lootdrop/aimodule_harmless, +/obj/item/aiModule/supplied/freeform, +/turf/open/floor/circuit/green, +/area/ai_monitored/turret_protected/ai_upload) +"deR" = ( +/turf/closed/wall, +/area/maintenance/starboard/secondary) +"deW" = ( +/obj/item/bedsheet/dorms, +/obj/structure/bed, +/obj/item/toy/plush/narplush, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"dfd" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Long-Term Cell 1"; + req_access_txt = "2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"dfh" = ( +/obj/machinery/power/compressor{ + comp_id = "incineratorturbine"; + dir = 8; + luminosity = 2 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/engine/vacuum, +/area/engine/atmospherics_engine) +"dfl" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"dfn" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 12 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"dfz" = ( +/obj/structure/lattice, +/turf/closed/wall/r_wall, +/area/security/execution/education) +"dfK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat/foyer) +"dfL" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"dfR" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/suit_storage_unit/security, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/security/brig) +"dfS" = ( +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"dgd" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/chair/stool, +/obj/effect/landmark/start/scientist, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"dgg" = ( +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"dgj" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"dgm" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"dgv" = ( +/obj/structure/marker_beacon, +/obj/machinery/camera/autoname, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/hallway/secondary/entry) +"dgA" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"dgF" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"dgM" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"dgT" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"dgV" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/engine, +/area/engine/engine_room) +"dgZ" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/crew_quarters/toilet) +"dhd" = ( +/obj/machinery/vending/cola, +/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/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dhi" = ( +/turf/open/floor/plating, +/area/security/brig) +"dhj" = ( +/turf/open/floor/wood, +/area/security/detectives_office) +"dht" = ( +/obj/structure/lattice, +/turf/closed/wall, +/area/chapel/main/monastery) +"dhG" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/sink{ + dir = 4; + pixel_x = 12 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"dhL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"dhR" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"dhS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/secondary) +"dhW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"dhZ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"dib" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"dic" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "gateway"; + name = "Gateway Shutters Control"; + normaldoorcontrol = 0; + pixel_x = -28; + pixel_y = 28 + }, +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/plasteel/dark, +/area/gateway) +"diq" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"diw" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/law) +"diD" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"diK" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "permacell2"; + name = "Cell 1 Lockdown"; + pixel_x = -4; + pixel_y = 25; + req_access_txt = "2" + }, +/obj/machinery/button/flasher{ + id = "PCell 2"; + pixel_x = 6; + pixel_y = 25 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"diM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"diQ" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 1; + name = "manual inlet valve" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"djd" = ( +/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" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"djm" = ( +/obj/item/toy/plush/nukeplushie, +/obj/structure/rack, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"djn" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat AI Access"; + req_access_txt = "65" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"djo" = ( +/obj/effect/spawner/structure/window, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/medical/medbay/central) +"djs" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/camera/autoname{ + dir = 10 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"djt" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/closet{ + name = "Evidence Closet 1" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"djx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"djy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light, +/obj/structure/tank_dispenser, +/turf/open/floor/plasteel, +/area/science/mixing) +"djz" = ( +/obj/machinery/atmospherics/pipe/simple/multiz/layer1, +/obj/structure/lattice/catwalk, +/turf/open/openspace/airless, +/area/space/nearstation) +"djF" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"djO" = ( +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/obj/machinery/computer/med_data{ + dir = 8 + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"djT" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"djX" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"dkf" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/quartermaster/office) +"dkn" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"dku" = ( +/obj/machinery/vending/wallmed{ + pixel_x = -32 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_b) +"dkw" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dkC" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"dkQ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"dkR" = ( +/obj/structure/railing/corner, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"dlq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/item/wrench, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"dlt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"dlu" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"dly" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"dlz" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"dlH" = ( +/obj/docking_port/stationary{ + dir = 4; + dwidth = 3; + height = 10; + id = "mining_home"; + name = "mining shuttle bay"; + roundstart_template = /datum/map_template/shuttle/mining/kilo; + width = 7 + }, +/turf/open/openspace/airless, +/area/space) +"dlN" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"dmg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"dmq" = ( +/turf/open/floor/carpet/red, +/area/security/detectives_office) +"dmv" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"dmC" = ( +/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/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"dmG" = ( +/turf/closed/wall/r_wall, +/area/maintenance/fore) +"dmM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/chapel{ + dir = 6 + }, +/area/chapel/main/monastery) +"dmO" = ( +/obj/structure/closet/secure_closet/CMO, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/carpet/cyan, +/area/crew_quarters/heads/cmo) +"dmR" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"dmW" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"dnb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"dnq" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"dnx" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/library) +"dnH" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"dnJ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"dnU" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall31"; + location = "hall30" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"dnX" = ( +/obj/structure/dresser, +/obj/item/flashlight/lamp/green{ + pixel_x = -5; + pixel_y = 14 + }, +/turf/open/floor/carpet/blue, +/area/security/brig) +"doh" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/bz, +/turf/open/floor/plating, +/area/science/xenobiology) +"dol" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) +"don" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"doo" = ( +/obj/effect/landmark/start/cargo_technician, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"dop" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"dos" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"dow" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/vending/engivend, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/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/dark, +/area/engine/atmos) +"doF" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"doI" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"doS" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "ceprivacy"; + name = "privacy shutter" + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/chief) +"doT" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"dpb" = ( +/obj/structure/cable/white, +/obj/machinery/power/solar, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/starboard/aft) +"dpd" = ( +/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/cyclelink_helper{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"dpg" = ( +/obj/machinery/computer/rdconsole, +/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/tile/blue, +/turf/open/floor/plasteel, +/area/bridge) +"dpl" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/medical/genetics/cloning) +"dpm" = ( +/obj/machinery/door/airlock/public/glass, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"dpA" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"dpG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"dpL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"dpR" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"dpS" = ( +/obj/machinery/smartfridge/chemistry/virology/preloaded, +/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/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/sign/warning/deathsposal{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"dpW" = ( +/obj/machinery/libraryscanner, +/obj/machinery/requests_console{ + department = "Library"; + departmentType = 1; + pixel_x = -32 + }, +/turf/open/floor/carpet/green, +/area/library) +"dpZ" = ( +/turf/open/floor/plating, +/area/space/nearstation) +"dqe" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall27"; + location = "hall26" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"dqg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"dqo" = ( +/turf/open/openspace, +/area/maintenance/upper/fore) +"dqs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/camera/autoname{ + dir = 9 + }, +/obj/machinery/requests_console{ + department = "Morgue"; + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"dqx" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Hydroponics"; + req_access_txt = "35" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"dqy" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"dqB" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"dqP" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"dqT" = ( +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"dqY" = ( +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"dra" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/turf/open/openspace/airless, +/area/space/nearstation) +"drg" = ( +/turf/closed/wall, +/area/maintenance/upper/starboard/central) +"dri" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"drj" = ( +/obj/structure/bookcase, +/turf/open/floor/carpet, +/area/hallway/primary/fore) +"drm" = ( +/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 = "35" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"drq" = ( +/obj/structure/table, +/obj/machinery/computer/security/telescreen/interrogation{ + dir = 1; + pixel_y = -30 + }, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"dry" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/carbon_input, +/turf/open/floor/engine/co2, +/area/engine/atmos) +"drD" = ( +/turf/closed/wall, +/area/engine/storage_shared) +"drG" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"drJ" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/flasher{ + id = "court"; + pixel_x = 32 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"drL" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"drS" = ( +/turf/closed/wall/rust, +/area/hydroponics/garden/abandoned) +"dsm" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) +"dsq" = ( +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"dsr" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/sink{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"dsw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall28"; + location = "hall27" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"dsA" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"dsF" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"dsL" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"dsT" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"dsX" = ( +/obj/structure/rack, +/obj/item/gun/energy/ionrifle, +/obj/item/clothing/suit/armor/laserproof, +/obj/effect/turf_decal/delivery, +/obj/structure/sign/poster/official/ian{ + pixel_y = 32 + }, +/obj/machinery/camera/motion{ + c_tag = "Armory Motion Sensor" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"dtj" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"dtx" = ( +/obj/machinery/camera/autoname{ + dir = 9 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"dtW" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"duh" = ( +/obj/machinery/light/small, +/turf/open/floor/grass, +/area/crew_quarters/park) +"dui" = ( +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/item/reagent_containers/blood/random, +/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/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/security/brig) +"dul" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"duq" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"duA" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) +"duO" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/storage/book/bible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"duY" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"dvk" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"dvo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"dvq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"dvr" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile{ + dir = 4 + }, +/obj/effect/turf_decal/tile, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/storage/firstaid/medical{ + pixel_y = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"dvv" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 1 + }, +/obj/machinery/meter, +/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_toxmix{ + pixel_y = 27 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"dvw" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"dvJ" = ( +/obj/structure/reagent_dispensers, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/storage/tools) +"dvN" = ( +/obj/structure/table/reinforced, +/obj/structure/bedsheetbin{ + pixel_x = -1; + pixel_y = -2 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"dwm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -8 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = -1 + }, +/obj/item/reagent_containers/food/snacks/pizzaslice/pineapple{ + pixel_x = -2; + pixel_y = 9 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"dws" = ( +/obj/item/soap/nanotrasen, +/obj/item/lightreplacer, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/table, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel, +/area/janitor) +"dwI" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"dwO" = ( +/obj/structure/chair/comfy/black, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"dxd" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"dxe" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"dxf" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/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/computer/card/minor/hos{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"dxj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"dxn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"dxJ" = ( +/obj/machinery/vending/snack/random, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"dxM" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) +"dxQ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"dxY" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"dyd" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/warden) +"dyf" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"dyh" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"dyB" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"dyG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"dyJ" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"dyO" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/sign/departments/minsky/research/xenobiology{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"dyP" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"dyV" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/brute{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/storage/firstaid/brute{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/machinery/door/window/eastleft{ + name = "First-Aid Supplies"; + red_alert_access = 1; + req_access_txt = "5" + }, +/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 + }, +/turf/open/floor/plasteel, +/area/medical/storage) +"dyY" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"dza" = ( +/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/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"dzi" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"dzm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"dzr" = ( +/obj/structure/dresser, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"dzy" = ( +/obj/machinery/door/airlock{ + name = "Courtroom Access"; + req_access_txt = "38" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"dzB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/stool, +/obj/machinery/button/door{ + id = "commissaryshutter"; + name = "Commissary Shutter Control"; + pixel_x = -27; + pixel_y = -26 + }, +/turf/open/floor/plasteel/dark, +/area/vacant_room/commissary) +"dzC" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/openspace, +/area/crew_quarters/bar) +"dzH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"dzY" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/disposal) +"dAi" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"dAk" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"dAr" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"dAx" = ( +/turf/closed/wall, +/area/maintenance/solars/port/fore) +"dAz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"dAE" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/button/door{ + id = "armourydoors"; + name = "Xenobiology Containment Cell Lockdown"; + pixel_x = -28; + pixel_y = 28; + req_access_txt = "19" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"dAF" = ( +/obj/structure/closet/radiation, +/turf/open/floor/noslip/dark, +/area/engine/engineering) +"dAG" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"dAI" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"dAK" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"dAQ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"dBa" = ( +/obj/structure/table/reinforced, +/obj/item/circuitboard/machine/ore_silo, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"dBf" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"dBj" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/research) +"dBs" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"dBv" = ( +/obj/machinery/telecomms/server/presets/security, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/server) +"dBA" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"dBW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"dCa" = ( +/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/tile/neutral, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall17"; + location = "hall16" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"dCj" = ( +/obj/structure/dresser, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/wood, +/area/quartermaster/storage) +"dCq" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/plating, +/area/engine/atmos) +"dCE" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"dCJ" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"dDe" = ( +/obj/structure/transit_tube, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"dDp" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"dDs" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics_shutters"; + name = "robotics shutters" + }, +/turf/open/floor/plating, +/area/science/robotics/lab) +"dDu" = ( +/turf/open/floor/plating, +/area/maintenance/port/fore) +"dDy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"dDC" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"dDF" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"dDG" = ( +/obj/structure/bed/roller, +/mob/living/carbon/monkey, +/turf/open/floor/plasteel/freezer, +/area/medical/genetics) +"dDM" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/bottle/charcoal{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bottle/epinephrine{ + pixel_x = -2; + pixel_y = 1 + }, +/obj/item/storage/pill_bottle, +/obj/item/storage/pill_bottle, +/obj/item/storage/pill_bottle, +/obj/item/reagent_containers/syringe, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"dDQ" = ( +/obj/structure/cable/yellow{ + 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/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"dDX" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"dDZ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"dEb" = ( +/turf/open/floor/engine/n2, +/area/engine/atmos) +"dEd" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/nanite) +"dEi" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Shared Engineering Storage"; + req_one_access_txt = "32;19" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/storage_shared) +"dEs" = ( +/obj/machinery/hydroponics/constructable, +/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/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel, +/area/hydroponics) +"dEt" = ( +/obj/structure/flora/junglebush, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/grass, +/area/crew_quarters/park) +"dFd" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"dFi" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/science/research) +"dFl" = ( +/obj/structure/table/wood, +/obj/item/camera, +/obj/item/taperecorder, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/engine/cult, +/area/library) +"dFr" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"dFE" = ( +/obj/machinery/door/airlock/command{ + name = "Captain's Quarters"; + req_access_txt = "20" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/bridge) +"dFK" = ( +/obj/structure/sign/poster/random{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"dFR" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"dGl" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/suit_storage_unit/mining/eva, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"dGm" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dGr" = ( +/obj/machinery/airalarm/directional/north, +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"dGu" = ( +/obj/structure/table/reinforced, +/obj/item/book/granter/crafting_recipe/cooking_sweets_101, +/obj/item/reagent_containers/food/condiment/enzyme{ + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"dGw" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"dGJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"dHh" = ( +/turf/open/floor/engine, +/area/engine/engine_room) +"dHj" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"dHo" = ( +/obj/structure/railing/corner, +/turf/open/openspace, +/area/hallway/upper/secondary/exit/departure_lounge) +"dHt" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"dHC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"dHH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"dHM" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/space/nearstation) +"dHR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"dHW" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"dHY" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"dIh" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"dIq" = ( +/turf/closed/wall, +/area/science/nanite) +"dIr" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"dIx" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"dIE" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"dIG" = ( +/obj/machinery/telecomms/server/presets/medical, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/server) +"dIJ" = ( +/turf/open/floor/plating, +/area/vacant_room/commissary) +"dIW" = ( +/obj/machinery/computer/atmos_control/tank/air_tank{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"dJd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/computer/shuttle_flight/science, +/turf/open/floor/plasteel/dark, +/area/science/shuttledock) +"dJo" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"dJF" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"dJH" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/turf/open/space/basic, +/area/space) +"dJP" = ( +/obj/item/paper_bin{ + pixel_y = 3 + }, +/obj/item/pen{ + pixel_y = 4 + }, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"dJV" = ( +/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/white, +/area/science/research) +"dJX" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"dKb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Botany Hallway" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"dKh" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm1"; + name = "Cabin 1" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"dKw" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"dKx" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"dKA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"dKD" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/radio/intercom{ + pixel_x = 30; + pixel_y = 25 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"dKG" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"dKL" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"dKM" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/ywflowers, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/grass, +/area/hallway/secondary/command) +"dLh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"dLu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"dLw" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/research) +"dLB" = ( +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/theatre) +"dLP" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"dMo" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"dMu" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"dMv" = ( +/obj/structure/table/wood, +/obj/item/cartridge/lawyer, +/obj/item/clothing/glasses/sunglasses/advanced/big, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"dMK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"dMN" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/railing, +/turf/open/floor/plasteel, +/area/science/shuttle) +"dNb" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"dNe" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"dNx" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"dNz" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port) +"dNA" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable/yellow, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"dNC" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"dND" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"dNH" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"dNS" = ( +/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/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"dNX" = ( +/obj/machinery/door/airlock/engineering{ + name = "Port Bow Solar Maintenance"; + req_access_txt = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"dNY" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"dOl" = ( +/obj/structure/chair, +/obj/machinery/camera/autoname, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/dark, +/area/medical/surgery/aux) +"dOp" = ( +/obj/machinery/telecomms/broadcaster/preset_exploration, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/relay) +"dOu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock{ + name = "Unisex Washroom" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"dPe" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/security/brig) +"dPA" = ( +/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/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"dPX" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"dQe" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"dQi" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/lime, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"dQq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"dQB" = ( +/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/atmospherics/pipe/layer_manifold{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"dQC" = ( +/obj/structure/table/reinforced, +/obj/item/soap/nanotrasen, +/turf/open/floor/wood, +/area/maintenance/port) +"dQK" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"dRg" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"dRm" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"dRs" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"dRz" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"dRO" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"dRT" = ( +/obj/effect/turf_decal/arrows, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"dSb" = ( +/obj/structure/table/glass, +/obj/item/storage/box/beakers{ + pixel_x = 1; + pixel_y = 4 + }, +/obj/item/storage/box/beakers{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"dSf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"dSj" = ( +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"dSt" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Recreation Park" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/park) +"dSA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"dSE" = ( +/obj/machinery/modular_computer/console/preset/research, +/turf/open/floor/carpet/purple, +/area/crew_quarters/heads/hor) +"dST" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"dSU" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/beer/light{ + pixel_x = -5; + pixel_y = 7 + }, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = 5; + pixel_y = 10 + }, +/turf/open/floor/wood, +/area/maintenance/port) +"dTj" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"dTm" = ( +/obj/machinery/mass_driver{ + dir = 8; + id = "chapelgun" + }, +/turf/open/floor/plating, +/area/chapel/office) +"dTq" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"dTr" = ( +/obj/machinery/camera/motion{ + c_tag = "Vault"; + dir = 8; + network = list("vault") + }, +/turf/open/space/basic, +/area/space) +"dTB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"dTN" = ( +/obj/structure/table/reinforced, +/obj/item/kitchen/knife, +/obj/item/reagent_containers/food/snacks/chocolatebar, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"dTZ" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"dUh" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"dUn" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"dUp" = ( +/obj/machinery/conveyor{ + id = "recycling" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/disposal) +"dUL" = ( +/obj/machinery/door/airlock/medical{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/surgery/aux) +"dUT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"dUV" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"dVc" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"dVk" = ( +/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/stripes/line{ + dir = 6 + }, +/obj/effect/landmark/secequipment, +/obj/machinery/newscaster/security_unit{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/security/main) +"dVr" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/security/brig) +"dVN" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"dVZ" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"dWf" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"dWg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"dWl" = ( +/obj/machinery/holopad{ + pixel_y = 16 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"dWq" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/transit_tube/curved/flipped{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/medical/medbay/balcony) +"dWG" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/wood, +/area/library) +"dWR" = ( +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"dWY" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"dXa" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"dXb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/rack, +/obj/item/mop, +/obj/item/mop, +/obj/item/mop, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"dXm" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"dXo" = ( +/obj/machinery/camera/autoname, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/telecomms/relay/preset/exploration, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"dXt" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"dXL" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "warehouse"; + name = "Warehouse Shutters Control"; + normaldoorcontrol = 0; + pixel_x = -28; + pixel_y = 6 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"dYa" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"dYg" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/law) +"dYi" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) +"dYn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hor) +"dYp" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Arrivals Airlock"; + req_access_txt = "101" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"dYu" = ( +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"dYy" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) +"dYA" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/engine/atmos) +"dYC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"dYZ" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Airlock" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"dZb" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"dZh" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"dZi" = ( +/obj/machinery/washing_machine, +/turf/open/floor/carpet, +/area/security/prison) +"dZj" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"dZv" = ( +/obj/machinery/telecomms/bus/preset_three, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) +"dZz" = ( +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/law) +"dZA" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"dZM" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"dZT" = ( +/obj/structure/closet/secure_closet/RD, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/hor) +"eap" = ( +/obj/machinery/light/small/broken{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"eaM" = ( +/obj/machinery/modular_fabricator/autolathe, +/obj/machinery/door/window/westleft{ + base_state = "right"; + dir = 1; + icon_state = "right"; + name = "Cargo Window"; + pixel_y = 1; + req_access_txt = "31" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/quartermaster/office) +"eaV" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"ebb" = ( +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ebt" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"ebz" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/grass, +/area/hallway/secondary/command) +"ebC" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ebE" = ( +/obj/machinery/door/airlock/security/glass{ + id_tag = "innerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"ebI" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"ebR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"ebW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery/aux) +"ecp" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = 29 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"ecu" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plating, +/area/engine/atmos) +"ecA" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/chem_master, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"ecE" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance/three, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"ecY" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"eda" = ( +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"ede" = ( +/obj/structure/railing, +/turf/open/openspace, +/area/maintenance/upper/aft) +"edg" = ( +/obj/effect/landmark/start/roboticist, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"edp" = ( +/obj/structure/table/wood, +/obj/item/instrument/violin, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"edq" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"edw" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"edx" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/fore) +"edD" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"edE" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"edR" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"edY" = ( +/obj/machinery/atmospherics/components/binary/volume_pump/on{ + icon_state = "volpump_on_map-1"; + name = "Cold to Atmos" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"eeb" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/computer/cargo/request, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"eet" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"eex" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/closet/crate/engineering{ + name = "emergency breach crate" + }, +/obj/item/holosign_creator/atmos, +/obj/item/tank/internals/emergency_oxygen/engi, +/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/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"eeZ" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"efe" = ( +/obj/machinery/modular_computer/console/preset/engineering{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) +"efn" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"efw" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"efH" = ( +/obj/structure/lattice/catwalk, +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/openspace, +/area/maintenance/upper/central) +"efI" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"efN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/science/shuttle) +"efR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"efV" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/landmark/start/botanist, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"efY" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"efZ" = ( +/obj/structure/marker_beacon, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"egf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"egh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/requests_console{ + department = "Chapel"; + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"egq" = ( +/obj/effect/landmark/start/bartender, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"egs" = ( +/obj/machinery/button/door{ + id = "Dorm4"; + name = "Dormitory Door Lock"; + normaldoorcontrol = 1; + pixel_y = -28; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"egw" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/maintenance/department/crew_quarters/dorms) +"egx" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"egB" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"ehi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/airlock/command/glass{ + name = "E.V.A. Storage"; + req_access_txt = "18" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"ehm" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"ehz" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ehA" = ( +/obj/machinery/computer/atmos_control/tank/nitrogen_tank{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"ehC" = ( +/obj/effect/turf_decal/tile/neutral{ + 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/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"ehH" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"ehL" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/openspace, +/area/maintenance/upper/aft) +"ehM" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/gloves, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"ehU" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/solar/port/fore) +"ehY" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"eig" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Prison Main South"; + dir = 1; + network = list("ss13","prison") + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"eik" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/shower{ + dir = 8 + }, +/obj/structure/railing, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/noslip/white, +/area/medical/medbay/central) +"eim" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"eio" = ( +/obj/machinery/door/airlock/security{ + name = "Security Post - Cargo"; + req_access_txt = "63" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/science) +"eip" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"eir" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"eit" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"eiv" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/newscaster{ + pixel_y = -29 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"eiD" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"eiH" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/security/nuke_storage) +"eiS" = ( +/obj/structure/grille, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"eiU" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/dark, +/area/maintenance/department/chapel/monastery) +"eiW" = ( +/obj/machinery/camera/autoname{ + dir = 4; + network = list("aisat") + }, +/turf/open/space/basic, +/area/space) +"eiX" = ( +/obj/machinery/door/airlock/external{ + name = "Supply Dock Airlock"; + req_access_txt = "31" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ejw" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ejM" = ( +/obj/machinery/shower{ + pixel_y = 16 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Prison Shower"; + dir = 9; + network = list("ss13","prison") + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"ejN" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"ejW" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/power/deck_relay, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"ekf" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"eki" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ekl" = ( +/obj/machinery/light, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"eko" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"ekp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/landmark/start/cargo_technician, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/conveyor_switch/oneway{ + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ekq" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/ladder, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"eks" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stack/cable_coil/red, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"ekv" = ( +/obj/machinery/flasher{ + id = "aicore"; + pixel_x = -26; + range = 2 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"ekF" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/flasher{ + id = "aicore"; + pixel_x = 26; + range = 2 + }, +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"ekH" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"ekX" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"ekY" = ( +/obj/item/statuebust/hippocratic, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/grass, +/area/library) +"eld" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"elh" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Escape Pod Charlie" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"eli" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio7"; + name = "containment blast door" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"elo" = ( +/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) +"elz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/structure/mirror{ + pixel_y = 29 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/theatre) +"elA" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"elC" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/exit/departure_lounge) +"elM" = ( +/obj/structure/table/glass, +/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/structure/sign/poster/random{ + pixel_y = 32 + }, +/obj/item/storage/box/beakers, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/syringe, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"elX" = ( +/obj/machinery/atmospherics/miner/oxygen, +/turf/open/floor/engine/o2, +/area/engine/atmos) +"emq" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"emO" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"emQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"ena" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"enb" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Hydroponics"; + req_access_txt = "35" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hydroponics) +"eng" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"enz" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"enF" = ( +/obj/structure/table, +/obj/structure/table, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/gloves/color/latex, +/obj/item/surgicaldrill, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white/side, +/area/medical/surgery/aux) +"enH" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/machinery/camera/autoname{ + dir = 8; + network = list("aisat") + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"enI" = ( +/obj/structure/sign/directions/command{ + dir = 1 + }, +/obj/structure/sign/directions/engineering{ + dir = 8; + pixel_y = 8 + }, +/obj/structure/sign/directions/science{ + pixel_y = -8 + }, +/turf/closed/wall/r_wall, +/area/maintenance/fore) +"enJ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"enR" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) +"eob" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"eoc" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/turretid{ + control_area = "/area/ai_monitored/turret_protected/aisat_interior"; + name = "Antechamber Turret Control"; + pixel_x = -33; + pixel_y = 33; + req_access = null; + req_access_txt = "65" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"eoi" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"eor" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/genetics) +"eot" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"eoG" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor{ + dir = 1; + name = "Brig Control Desk"; + req_access_txt = "3" + }, +/obj/machinery/door/window/westleft{ + base_state = "right"; + dir = 2; + icon_state = "right"; + name = "Outer Window" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/security/warden) +"eoT" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"eoU" = ( +/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) +"eoY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel/chapel{ + dir = 1 + }, +/area/chapel/main/monastery) +"epg" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"epo" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/bot, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/secondary) +"epp" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"epu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/openspace, +/area/quartermaster/exploration_dock) +"epF" = ( +/turf/closed/wall, +/area/medical/patients_rooms/room_c) +"epG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/science/research) +"epY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"epZ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"equ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"eqv" = ( +/obj/machinery/shower{ + pixel_y = 16 + }, +/obj/machinery/button/door{ + id = "shower2"; + name = "Shower Bolts"; + normaldoorcontrol = 1; + pixel_x = -6; + pixel_y = -27; + specialfunctions = 4 + }, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "shower2a"; + name = "Privacy Shutters"; + normaldoorcontrol = 0; + pixel_x = 7; + pixel_y = -27 + }, +/obj/machinery/light/small, +/obj/effect/landmark/start/assistant, +/obj/item/soap/nanotrasen, +/turf/open/floor/noslip/white, +/area/crew_quarters/toilet) +"eqx" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"eqy" = ( +/turf/closed/wall, +/area/hallway/upper/secondary/service) +"eqE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"eqF" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/research) +"eqK" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"eqS" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"eqZ" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen/red, +/obj/item/stamp/rd, +/obj/item/aicard, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/hor) +"erh" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/fire{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/storage/firstaid/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/firstaid/fire, +/obj/item/storage/firstaid/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/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 + }, +/turf/open/floor/plasteel, +/area/medical/storage) +"eri" = ( +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/camera/autoname{ + dir = 5 + }, +/obj/structure/table, +/obj/item/destTagger, +/obj/item/destTagger, +/obj/item/stack/wrapping_paper, +/obj/item/stack/wrapping_paper, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"erk" = ( +/obj/machinery/door/airlock/research{ + autoclose = 0; + frequency = 1449; + id_tag = "xeno_airlock_interior"; + name = "Xenobiology Lab Internal Airlock"; + req_access_txt = "55" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"erE" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"erF" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/space/nearstation) +"erJ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"erN" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"erP" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/entry) +"esk" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"esl" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"esm" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/supply) +"esB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"esM" = ( +/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/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/science/shuttle) +"esR" = ( +/obj/effect/turf_decal/tile/brown, +/obj/machinery/light, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"esT" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/multiz/layer3, +/turf/open/space/basic, +/area/space/nearstation) +"esU" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/closet/emcloset, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"esX" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"esY" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"etn" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"eto" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"etw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"etC" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"etG" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 1; + network = list("aisat") + }, +/turf/open/space/basic, +/area/space) +"etP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/prison) +"etY" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/item/radio/intercom, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"eub" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/security/brig) +"eui" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/tank_dispenser, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"euk" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/hop) +"euu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/engine, +/area/engine/supermatter) +"euy" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"euB" = ( +/obj/machinery/atmospherics/pipe/manifold/purple/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"euD" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"euK" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/closet/crate, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/pickaxe, +/obj/item/pickaxe, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"euM" = ( +/obj/machinery/telecomms/server/presets/engineering, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/server) +"euT" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"evg" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/mix_input, +/turf/open/floor/engine/vacuum, +/area/engine/atmos) +"evm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"evt" = ( +/obj/machinery/computer/holodeck, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"evy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"evB" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"evG" = ( +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/turf/open/floor/grass, +/area/hydroponics/garden) +"evH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/maintenance{ + id_tag = "commissarydoor"; + req_one_access_txt = "12;63;48;50" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/vacant_room/commissary) +"evW" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"ewa" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/hallway/primary/fore) +"ewe" = ( +/obj/machinery/door/airlock{ + id_tag = "shower2"; + name = "Shower Unit" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"ewj" = ( +/obj/structure/kitchenspike, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"ewm" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/machinery/requests_console{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"ewr" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = -9; + pixel_y = 4 + }, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"ewu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"ewJ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"ewO" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"ewR" = ( +/obj/effect/spawner/lootdrop/two_percent_xeno_egg_spawner, +/turf/open/floor/engine, +/area/science/xenobiology) +"ewT" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"ewZ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"exd" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"ext" = ( +/obj/effect/spawner/room/tenxten, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"exA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom"; + req_access_txt = "38" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"exO" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light, +/obj/structure/sign/departments/minsky/engineering/atmospherics{ + pixel_y = -32 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"exP" = ( +/obj/machinery/vending/hydroseeds, +/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/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hydroponics) +"exQ" = ( +/obj/machinery/disposal/bin, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"eyI" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/structure/chair/comfy/brown, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"eyJ" = ( +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"eyR" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/space/basic, +/area/space) +"ezd" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"eze" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "QMLoad2" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"ezk" = ( +/obj/machinery/door/airlock{ + name = "Unisex Washroom" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"ezm" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/table, +/obj/item/circuitboard/computer/cargo{ + pixel_x = 1; + pixel_y = 6 + }, +/obj/item/encryptionkey/headset_cargo{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ezn" = ( +/obj/effect/decal/cleanable/shreds, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"ezr" = ( +/obj/effect/turf_decal/bot, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"ezB" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ezH" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/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/science/shuttle) +"ezJ" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"ezO" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"ezR" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/decal/cleanable/glass, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/fore) +"ezW" = ( +/obj/machinery/flasher{ + id = "Cell 1"; + pixel_x = -28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/carpet/blue, +/area/security/brig) +"eAe" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"eAv" = ( +/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/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"eAB" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"eAE" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"eAN" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters{ + id = "exploration"; + name = "Launch Bay Shutters" + }, +/turf/open/floor/engine, +/area/quartermaster/exploration_dock) +"eAP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/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) +"eAT" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/obj/machinery/advanced_airlock_controller/directional/north, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"eAV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"eAW" = ( +/obj/machinery/telecomms/server/presets/common, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/server) +"eAZ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/carbon_output, +/turf/open/floor/engine/co2, +/area/engine/atmos) +"eBc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"eBe" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"eBf" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/cryoxadone{ + pixel_x = 9; + pixel_y = 11 + }, +/obj/item/reagent_containers/glass/beaker/cryoxadone{ + pixel_x = -2; + pixel_y = 11 + }, +/obj/item/reagent_containers/glass/beaker/cryoxadone{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/item/reagent_containers/glass/beaker/cryoxadone{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/wrench/medical{ + pixel_y = 2 + }, +/obj/effect/turf_decal/delivery, +/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, +/area/medical/cryo) +"eBi" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/newscaster/security_unit{ + pixel_x = 32 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"eBl" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"eBo" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"eBq" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"eBt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"eBy" = ( +/obj/effect/turf_decal/tile/red{ + 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/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/closet/secure_closet/security/cargo, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/supply) +"eBz" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"eBD" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"eBN" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"eBR" = ( +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"eCd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"eCh" = ( +/obj/structure/cable/white, +/obj/machinery/power/solar, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/port/fore) +"eCi" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/quartermaster/storage) +"eCm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/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 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"eCp" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"eCy" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/chapel{ + dir = 5 + }, +/area/chapel/main/monastery) +"eCA" = ( +/obj/structure/lattice, +/turf/open/openspace/airless, +/area/space) +"eCB" = ( +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"eCR" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/door/window/brigdoor/security/cell/southleft, +/turf/open/floor/plasteel, +/area/security/courtroom) +"eCT" = ( +/turf/open/floor/plating, +/area/maintenance/port/central) +"eCV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "secmain"; + name = "Blast Doors" + }, +/turf/open/floor/plating, +/area/security/brig) +"eCW" = ( +/turf/closed/wall/r_wall, +/area/science/mixing) +"eDf" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"eDj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"eDA" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"eDS" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/sorting/mail{ + sortType = 24 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"eDX" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/requests_console{ + department = "Surgery"; + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"eEa" = ( +/obj/machinery/vending/cola/random, +/obj/machinery/light, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"eEb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"eEq" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"eEt" = ( +/obj/machinery/door/airlock/medical/glass{ + id_tag = "CloningDoor"; + name = "Cloning Lab"; + req_access_txt = "5; 68" + }, +/obj/effect/mapping_helpers/airlock/unres, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/genetics/cloning) +"eEA" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"eEB" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/openspace, +/area/engine/engine_room) +"eED" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"eEH" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/spawner/lootdrop/crate_spawner, +/obj/item/flashlight/glowstick/blue, +/turf/open/floor/plating, +/area/maintenance/fore) +"eEV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"eFm" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"eFp" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet/blue, +/area/security/brig) +"eFy" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"eFC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"eFG" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"eFH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"eFL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"eFQ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"eFX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hor) +"eGb" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/maintenance/department/science) +"eGc" = ( +/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/white, +/area/medical/chemistry/upper) +"eGe" = ( +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"eGk" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"eGl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/chair/sofa/left{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"eGs" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"eGH" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/suit_storage_unit/open, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, +/area/gateway) +"eGT" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"eGU" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/newscaster{ + pixel_y = -29 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"eHk" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/noslip/standard, +/area/hallway/secondary/service) +"eHn" = ( +/obj/machinery/processor, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"eHt" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"eHF" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"eHI" = ( +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/theatre) +"eHL" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"eHM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"eHT" = ( +/obj/machinery/conveyor/inverted{ + dir = 9; + id = "recycling" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"eIa" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/turf/open/space/basic, +/area/solar/port/aft) +"eIf" = ( +/turf/closed/wall/r_wall, +/area/engine/engine_smes) +"eIh" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"eIs" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/obj/machinery/vending/dinnerware, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"eIy" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"eIA" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"eII" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"eIL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light_switch{ + pixel_y = -25 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"eIN" = ( +/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/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"eIT" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"eIU" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"eIW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"eIX" = ( +/obj/effect/turf_decal/caution{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/crew_quarters/cryopods) +"eJd" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"eJh" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral, +/obj/item/melee/baton/loaded, +/obj/item/restraints/handcuffs, +/obj/item/storage/secure/briefcase, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"eJm" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/poddoor/shutters{ + id = "commissaryshutter"; + name = "Vacant Commissary Shutter" + }, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/vacant_room/commissary) +"eJs" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"eJt" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"eJu" = ( +/obj/effect/spawner/structure/window, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/library) +"eJx" = ( +/obj/structure/sign/poster/random{ + pixel_x = -32 + }, +/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/effect/turf_decal/caution, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"eJA" = ( +/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/service) +"eJT" = ( +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/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/science/lab) +"eJX" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/maintenance/fore) +"eKa" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"eKv" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/storage/art) +"eKz" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/circuit/green, +/area/engine/gravity_generator) +"eKI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/shutters{ + id = "aicore" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"eKP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"eKS" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"eKT" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"eKV" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/closed/wall/r_wall, +/area/space/nearstation) +"eKW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"eKY" = ( +/obj/structure/lattice/catwalk, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"eKZ" = ( +/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/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"eLa" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"eLg" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/door/window/northleft{ + name = "Kitchen Delivery"; + req_access_txt = "28" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen/coldroom) +"eLl" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"eLs" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"eLu" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"eLz" = ( +/obj/structure/railing, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eLC" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/wood, +/area/library) +"eLD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"eLW" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"eMe" = ( +/obj/machinery/door/airlock/command{ + name = "Research Director's Office"; + req_access_txt = "30" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/crew_quarters/heads/hor) +"eMh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/vacant_room/commissary) +"eMm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat/foyer) +"eMu" = ( +/obj/machinery/door/window, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal) +"eMw" = ( +/obj/structure/table/reinforced, +/obj/item/nanite_scanner, +/obj/item/nanite_scanner, +/obj/item/nanite_scanner, +/obj/item/storage/box/disks_nanite, +/turf/open/floor/circuit/green, +/area/science/nanite) +"eMB" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/openspace, +/area/crew_quarters/bar) +"eME" = ( +/obj/machinery/light_switch{ + pixel_x = 26; + pixel_y = 7 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"eMI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"eMO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/fore) +"eMQ" = ( +/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) +"eNb" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"eNe" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"eNl" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"eNo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plasteel/dark, +/area/bridge) +"eNq" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"eNw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"eNM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "detective_shutters"; + name = "detective's office shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/detectives_office) +"eNQ" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"eNR" = ( +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"eNX" = ( +/obj/machinery/computer/security/mining, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"eOe" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"eOw" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/atmospherics/components/unary/tank/air, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"eOF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/engine/vacuum, +/area/science/mixing/chamber) +"eOJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/chapel{ + dir = 10 + }, +/area/chapel/main/monastery) +"eOU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/structure/marker_beacon, +/turf/open/floor/plating, +/area/science/misc_lab/range) +"ePw" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"ePx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"ePH" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"ePM" = ( +/obj/structure/transit_tube/diagonal/crossing, +/turf/open/space/basic, +/area/space) +"eQn" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"eQw" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"eQy" = ( +/obj/machinery/door/poddoor/shutters{ + id = "teledoor"; + name = "MiniSat Teleport Access" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/foyer) +"eQL" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/airlock/public/glass{ + name = "Fore Primary Hallway" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"eQN" = ( +/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/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"eQX" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/beacon, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"eRd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"eRk" = ( +/turf/open/floor/engine, +/area/engine/supermatter) +"eRn" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"eRo" = ( +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"eRv" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"eRC" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/maintenance/port) +"eRD" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 22 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"eRN" = ( +/turf/open/openspace, +/area/maintenance/starboard/fore) +"eRQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"eSc" = ( +/obj/machinery/computer/operating{ + 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/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery/aux) +"eSf" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 3 + }, +/obj/item/folder/red{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/pen, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"eSj" = ( +/obj/structure/table/wood, +/obj/item/storage/secure/briefcase, +/obj/item/clothing/accessory/lawyers_badge, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"eSl" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"eSp" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"eSs" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"eSy" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/research) +"eSN" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/hor) +"eSV" = ( +/obj/machinery/computer/apc_control, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/bridge) +"eTr" = ( +/turf/closed/wall/r_wall, +/area/tcommsat/relay) +"eTu" = ( +/obj/machinery/advanced_airlock_controller/directional/north, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/science/shuttledock) +"eTw" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"eTz" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Desk"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"eTC" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"eTF" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/camera/autoname{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"eTK" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"eTM" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 27 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"eTV" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"eTW" = ( +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/plating/asteroid, +/area/maintenance/port) +"eUs" = ( +/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, +/area/hallway/upper/secondary/entry) +"eUw" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Library" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/library) +"eUE" = ( +/turf/open/floor/circuit/green, +/area/hallway/secondary/entry) +"eVq" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"eVD" = ( +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"eVE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"eVI" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/law) +"eVU" = ( +/obj/structure/railing{ + dir = 8; + name = "towel rack" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"eVW" = ( +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/deck_relay, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"eWh" = ( +/obj/machinery/vending/boozeomat/pubby_captain, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"eWj" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"eWl" = ( +/obj/machinery/atmospherics/pipe/layer_manifold, +/obj/item/storage/toolbox/electrical, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"eWm" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"eWo" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/fitness/recreation/upper) +"eWG" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 + }, +/obj/effect/turf_decal/caution, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/noslip/standard, +/area/hallway/secondary/service) +"eWH" = ( +/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, +/area/hallway/upper/secondary/entry) +"eWN" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/janitor) +"eWO" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"eXb" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"eXd" = ( +/turf/closed/wall, +/area/maintenance/department/crew_quarters/dorms) +"eXf" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"eXt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"eXB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"eXD" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"eXF" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"eXN" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"eXY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plasteel, +/area/science/misc_lab/range) +"eYb" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "N2 to Pure" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"eYq" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/computer/rdconsole/experiment, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"eYw" = ( +/obj/machinery/door/airlock/research{ + autoclose = 0; + frequency = 1449; + id_tag = "xeno_airlock_exterior"; + name = "Xenobiology Lab External Airlock"; + req_access_txt = "55" + }, +/obj/machinery/doorButtons/access_button{ + idDoor = "xeno_airlock_exterior"; + idSelf = "xeno_airlock_control"; + name = "Access Button"; + pixel_x = -25; + req_access_txt = "55" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"eYy" = ( +/obj/machinery/conveyor{ + id = "recycling" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"eYO" = ( +/obj/machinery/computer/card{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/hop) +"eYV" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"eZa" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"eZi" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"eZF" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"eZJ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"eZL" = ( +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"eZX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/law) +"fab" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"fad" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"fai" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"fak" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"fat" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"faE" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/table, +/obj/item/clothing/under/rank/cargo/tech{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/gloves/fingerless{ + pixel_x = 1 + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"faS" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"faV" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel/dark, +/area/security/main) +"faX" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"fbf" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"fbp" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fbr" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Arcade" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"fbF" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "63" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/security/checkpoint/science) +"fbL" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/closet/secure_closet/security/sec, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/main) +"fbR" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer3{ + dir = 4 + }, +/turf/open/space/basic, +/area/medical/virology) +"fbU" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"fck" = ( +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"fcl" = ( +/obj/machinery/computer/secure_data{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"fco" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"fcv" = ( +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Escape Airlock"; + req_access_txt = "63" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"fcA" = ( +/obj/machinery/shower{ + pixel_y = 16 + }, +/turf/open/floor/noslip/white, +/area/quartermaster/storage) +"fcJ" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L3" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"fcN" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/upper/secondary/entry) +"fdb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/clothing/mask/gas, +/obj/item/crowbar, +/obj/item/wrench, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plasteel, +/area/science/lab) +"fdn" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"fds" = ( +/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/hallway/primary/fore) +"fdJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"feb" = ( +/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/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"fej" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"fen" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/storage/book/bible, +/obj/item/storage/book/bible{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/storage/book/bible{ + pixel_x = 2; + pixel_y = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"feo" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"feA" = ( +/obj/structure/table/wood, +/obj/item/folder/blue, +/obj/item/pen, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"feC" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"feG" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"feN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/external{ + name = "MiniSat External Access"; + req_one_access_txt = "65;61" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"feP" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"feR" = ( +/obj/machinery/airlock_sensor/incinerator_atmos{ + pixel_y = 22 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"feV" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/quartermaster/exploration_prep) +"ffa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/security/brig) +"ffg" = ( +/obj/structure/table, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"ffn" = ( +/obj/structure/closet/secure_closet/brig_phys, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"ffB" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"ffC" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/closed/wall, +/area/security/checkpoint/medical) +"ffH" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ffS" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"ffT" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"fgb" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fgf" = ( +/obj/structure/closet/firecloset/full, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"fgg" = ( +/obj/structure/table/glass, +/obj/item/book/manual/wiki/medicine, +/obj/item/stack/medical/gauze, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"fgz" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/bridge) +"fgA" = ( +/obj/machinery/door/airlock/mining{ + name = "Mining Docks"; + req_access_txt = "48" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"fgD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"fgG" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"fgQ" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"fgT" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal) +"fgU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/ladder, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"fgX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fgZ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"fhe" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"fhr" = ( +/obj/machinery/advanced_airlock_controller/directional/east, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/secondary) +"fhz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"fhK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/science/robotics) +"fhL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"fhQ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/sign/poster/random{ + pixel_x = -32 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"fhU" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1; + name = "Connector Port (Air Supply)" + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/delivery, +/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, +/area/medical/cryo) +"fhV" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/barman_recipes, +/obj/machinery/light, +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/obj/item/storage/box/beakers, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"fie" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"fij" = ( +/obj/structure/sign/warning/vacuum{ + pixel_x = 32 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"fim" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"fio" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"fiq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/storage) +"fiv" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"fiT" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"fiW" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/command{ + name = "Research Director's Office"; + req_access_txt = "30" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/science/server) +"fiX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"fja" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/sugarcane, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"fjc" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"fjl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"fjm" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"fjp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/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/hallway/primary/central) +"fjx" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"fjz" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"fjF" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"fjL" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"fjN" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/chapel/office) +"fjP" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"fka" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"fkb" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/multiz/layer1, +/turf/open/space/basic, +/area/space/nearstation) +"fkh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"fkl" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light, +/obj/machinery/requests_console{ + pixel_y = -32 + }, +/obj/machinery/vending/security, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"fkv" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"fkH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"fkM" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"fkS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/storage) +"fli" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"flo" = ( +/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, +/area/security/warden) +"flr" = ( +/obj/structure/table, +/obj/item/weldingtool, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/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 = 1 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"flt" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/exploration_prep) +"flz" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"flL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/maintenance/starboard/secondary) +"flM" = ( +/obj/structure/table, +/obj/item/stock_parts/cell/high/plus, +/turf/open/floor/circuit/green, +/area/engine/gravity_generator) +"flT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"flZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plating, +/area/quartermaster/miningdock) +"fmc" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"fmj" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"fmN" = ( +/obj/machinery/gateway{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/circuit, +/area/gateway) +"fmQ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/vacant_room/commissary) +"fnr" = ( +/obj/structure/table, +/obj/item/analyzer, +/obj/item/stack/cable_coil/orange, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/sign/departments/minsky/engineering/engineering{ + pixel_y = 32 + }, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) +"fns" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/medical/cryo) +"fnv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"fnw" = ( +/obj/structure/chair/stool, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"fnC" = ( +/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/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/item/radio/intercom{ + pixel_x = -29; + pixel_y = -29 + }, +/obj/machinery/requests_console{ + department = "Security Outpost - Medical"; + pixel_x = -32 + }, +/obj/machinery/computer/med_data{ + dir = 4 + }, +/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/checkpoint/medical) +"fnF" = ( +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"fnR" = ( +/obj/machinery/door/airlock/research{ + name = "Break Room"; + req_one_access_txt = "7" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"fnW" = ( +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Bridge"; + departmentType = 5; + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"fof" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"fol" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"fop" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"foq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"fos" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"foH" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"foI" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"foN" = ( +/obj/structure/reflector/single/anchored{ + dir = 9 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"foX" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"fpc" = ( +/obj/machinery/doorButtons/access_button{ + idDoor = "xeno_airlock_interior"; + idSelf = "xeno_airlock_control"; + name = "Access Button"; + pixel_x = -5; + pixel_y = -26; + req_access_txt = "55" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 12 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"fpf" = ( +/obj/structure/dresser, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"fph" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/sign/departments/minsky/research/genetics{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"fpo" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/quartermaster/storage) +"fpI" = ( +/turf/open/openspace, +/area/engine/gravity_generator) +"fpJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/modular_computer/laptop/preset/civillian, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"fpP" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fpS" = ( +/obj/machinery/camera/motion{ + c_tag = "Vault"; + dir = 8; + network = list("vault") + }, +/turf/open/openspace/airless, +/area/space) +"fpY" = ( +/obj/effect/turf_decal/tile/red{ + 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/caution/stand_clear, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"fqo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"fqB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"fqS" = ( +/obj/effect/landmark/start/medical_doctor, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"frc" = ( +/obj/machinery/camera/autoname, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/machinery/requests_console{ + department = "Theatre"; + pixel_y = 32 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/theatre) +"frd" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"frn" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"frv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/closed/wall, +/area/maintenance/starboard/aft) +"frF" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"frG" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"frL" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/engine, +/area/engine/engine_room) +"frT" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"frU" = ( +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/turf/open/space/basic, +/area/space) +"fsb" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"fsd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/wood, +/area/library) +"fss" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"fst" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/drone, +/obj/item/clothing/gloves/color/yellow, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/circuit/green, +/area/security/nuke_storage) +"fsx" = ( +/obj/machinery/light, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/button/crematorium{ + pixel_x = 27; + pixel_y = -25 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"fsz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/atmospherics_engine) +"fsT" = ( +/obj/effect/turf_decal/tile/brown, +/obj/structure/railing, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"ftB" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/computer/card/minor/hos{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"ftO" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"fuq" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/hallway/secondary/command) +"fuB" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"fuJ" = ( +/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/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"fuN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"fuX" = ( +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"fve" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"fvg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plating, +/area/security/execution/education) +"fvi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"fvl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"fvE" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/bridge) +"fvG" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay"; + req_access_txt = "5" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"fvJ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/storage/tools) +"fvM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"fwf" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery/aux) +"fwg" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/turf/open/space/basic, +/area/solar/port/aft) +"fwx" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"fwN" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "Mix to Filter" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fwR" = ( +/obj/machinery/door/window/brigdoor/northleft{ + dir = 8; + name = "Captain's Desk"; + req_access_txt = "20" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain) +"fwW" = ( +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"fwZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + 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 = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"fxa" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"fxe" = ( +/obj/machinery/suit_storage_unit, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"fxm" = ( +/obj/structure/chair/comfy{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"fxs" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"fxu" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"fxv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 22 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/law) +"fxw" = ( +/turf/closed/wall, +/area/hallway/upper/secondary/entry) +"fxA" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"fxU" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/engine/engineering) +"fya" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-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/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"fyg" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"fyl" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"fym" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fyo" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"fyp" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"fyq" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) +"fyA" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"fyC" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"fyI" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/door/airlock/virology{ + name = "Virology Airlock"; + req_access_txt = "39" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"fyO" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fzb" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/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/primary/fore) +"fzl" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/mob/living/simple_animal/bot/mulebot, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fzr" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"fzD" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/engine/atmospherics_engine) +"fzF" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/medbay/aft) +"fzN" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/chair/office{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"fzQ" = ( +/turf/open/floor/carpet/purple, +/area/vacant_room/office) +"fzX" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"fAa" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/security/nuke_storage) +"fAd" = ( +/obj/machinery/conveyor{ + dir = 8 + }, +/obj/item/stack/rods, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"fAl" = ( +/obj/structure/marker_beacon, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/hallway/secondary/entry) +"fAr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"fAv" = ( +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"fAw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"fAC" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"fAD" = ( +/obj/structure/sign/directions/evac{ + pixel_y = -8 + }, +/obj/structure/sign/directions/supply{ + dir = 4 + }, +/obj/structure/sign/directions/medical{ + dir = 4; + pixel_y = 8 + }, +/turf/closed/wall, +/area/hallway/primary/fore) +"fAJ" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrous_input, +/turf/open/floor/engine/n2o, +/area/engine/atmos) +"fAO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"fAR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"fAU" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/item/radio/intercom{ + name = "defense intercom" + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"fBd" = ( +/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) +"fBh" = ( +/obj/effect/spawner/room/threexfive, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"fBk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fBJ" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/turretid{ + control_area = "/area/ai_monitored/turret_protected/ai"; + name = "Antechamber Turret Control"; + pixel_x = 32; + pixel_y = 32; + req_access = null; + req_access_txt = "65" + }, +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"fBR" = ( +/obj/machinery/light/small, +/obj/structure/extinguisher_cabinet{ + pixel_y = -29 + }, +/obj/machinery/camera{ + c_tag = "Medbay Break Room"; + dir = 1; + network = list("ss13","medbay") + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/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/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"fBY" = ( +/turf/closed/wall, +/area/quartermaster/qm) +"fCa" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"fCd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"fCg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"fCk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"fCn" = ( +/obj/machinery/button/door{ + desc = "A remote control switch for the medbay foyer."; + id = "MedbayFoyer"; + name = "Medbay Doors Control"; + normaldoorcontrol = 1; + pixel_x = 24; + pixel_y = 24; + req_access_txt = "5" + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "medical_shutters"; + name = "medical shutters control"; + pixel_x = 24; + pixel_y = 38; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"fCq" = ( +/obj/machinery/door/airlock/public/glass, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"fCt" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"fCw" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"fCx" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"fCC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"fCS" = ( +/obj/machinery/stasis, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"fCV" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"fDA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/secondary) +"fDO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/structure/cable/yellow{ + 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 = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"fDT" = ( +/obj/machinery/vending/coffee, +/obj/structure/sign/map/left{ + desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; + icon_state = "map-left-MS"; + pixel_y = 32 + }, +/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 = 10 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"fDU" = ( +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"fEa" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Service Foyer"; + req_one_access_txt = "22;25;26;28;35;37;38;46" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"fEc" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fEh" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"fEk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fEl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/falsewall, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"fEN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"fES" = ( +/obj/structure/lattice/catwalk, +/obj/structure/ladder, +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"fEZ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/turf/open/space/basic, +/area/solar/port/aft) +"fFo" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + 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 = 6 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"fFp" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/bot_white, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"fFq" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"fFr" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"fFu" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"fFz" = ( +/obj/structure/transit_tube/curved/flipped, +/turf/open/space/basic, +/area/space) +"fFF" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/box, +/obj/effect/landmark/start/cyborg, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"fFV" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"fFW" = ( +/obj/effect/turf_decal/tile/blue, +/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/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"fGa" = ( +/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/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"fGr" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"fGv" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/computer/bounty{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"fGQ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"fGX" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fHa" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"fHg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"fHo" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"fHp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/science/shuttle) +"fHr" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/dorms) +"fHs" = ( +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"fHt" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"fHE" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/toxin{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/storage/firstaid/toxin{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/firstaid/toxin, +/obj/item/storage/firstaid/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + 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/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/storage) +"fHF" = ( +/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/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"fHO" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"fHS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/ai_monitored/security/armory) +"fHT" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/rnd/production/circuit_imprinter, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage_shared) +"fHZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/closed/wall, +/area/engine/engineering) +"fIb" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"fIf" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"fIp" = ( +/obj/machinery/vending/engivend, +/obj/machinery/camera/autoname, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"fIt" = ( +/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/turf_decal/tile, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"fIE" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/item/radio, +/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/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/item/radio/intercom{ + pixel_x = -29; + pixel_y = -29 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/supply) +"fIM" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fIP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"fIT" = ( +/obj/vehicle/ridden/secway, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"fIZ" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/scientist, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"fJa" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"fJe" = ( +/obj/machinery/computer/atmos_control/tank/oxygen_tank{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fJn" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"fJz" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"fJA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"fJE" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/security/glass{ + id_tag = "innerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"fKa" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"fKe" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"fKw" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"fKH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/closet/secure_closet/chemical, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"fKQ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"fKR" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/closet/secure_closet/evidence, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"fKW" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Command Maintenance Hatch"; + req_access_txt = "19"; + security_level = 0 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/hallway/secondary/command) +"fLe" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/item/clothing/head/collectable/kitty, +/obj/item/clothing/under/dress/skirt/plaid/green, +/obj/item/clothing/under/misc/assistantformal, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"fLj" = ( +/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 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"fLk" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/library) +"fLm" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"fLn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/reagent_dispensers/watertank/high, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fLo" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"fLr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall32"; + location = "hall31" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"fLt" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/electrical, +/obj/item/stack/cable_coil/red, +/obj/item/t_scanner, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/light{ + 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 = 1 + }, +/obj/machinery/requests_console{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"fLu" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"fLH" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"fLR" = ( +/obj/effect/spawner/room/fivexthree, +/turf/open/floor/plating, +/area/maintenance/port) +"fLT" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/upper/fore) +"fLW" = ( +/obj/machinery/computer/communications{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain) +"fMf" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/openspace, +/area/quartermaster/exploration_dock) +"fMj" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"fMq" = ( +/turf/closed/wall/r_wall, +/area/vacant_room/office) +"fMC" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"fMN" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"fMV" = ( +/obj/machinery/portable_atmospherics/canister/proto, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"fNa" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"fNk" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/keycard_auth{ + pixel_y = 24 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain) +"fNl" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/landmark/start/chemist, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"fNm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/upper/primary/port) +"fNA" = ( +/obj/structure/dresser, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"fNG" = ( +/obj/effect/landmark/start/medical_doctor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"fNJ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/turretid{ + control_area = "/area/ai_monitored/turret_protected/aisat_interior"; + name = "Antechamber Turret Control"; + pixel_x = -33; + pixel_y = 33; + req_access = null; + req_access_txt = "65" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"fNN" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/start/emt, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"fNP" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/landmark/start/cargo_technician, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fNQ" = ( +/obj/machinery/disposal/deliveryChute, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/machinery/door/window, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"fOg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/genetics) +"fOt" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/research) +"fOu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"fOI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"fOK" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fOO" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"fOT" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/science/storage) +"fOU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/engine, +/area/engine/engine_room) +"fPg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"fPj" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"fPl" = ( +/turf/closed/wall/r_wall, +/area/medical/genetics) +"fPm" = ( +/obj/structure/closet/secure_closet/medical2{ + req_access = list(29) + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"fPr" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/closet/secure_closet/security/sec, +/obj/structure/reagent_dispensers/peppertank{ + pixel_y = 32 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"fPB" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"fPG" = ( +/obj/machinery/door/airlock/security/glass{ + id_tag = "outerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/door/poddoor/preopen{ + id = "secmain"; + name = "Blast Doors" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"fPK" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/telecomms/broadcaster/preset_right, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) +"fPW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"fQa" = ( +/obj/structure/rack, +/obj/item/tank/internals/oxygen, +/obj/item/tank/internals/oxygen, +/obj/item/radio, +/obj/item/radio, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"fQe" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"fQo" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"fQs" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engine_room) +"fQv" = ( +/obj/machinery/door/airlock/external{ + name = "Shuttle Construction Yard"; + req_access_txt = "32" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/shuttle) +"fQA" = ( +/turf/open/floor/plasteel, +/area/science/shuttledock) +"fQB" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"fQK" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"fQM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"fQP" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/chem_dispenser/drinks{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"fQZ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"fRb" = ( +/obj/structure/grille, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port/central) +"fRd" = ( +/obj/effect/spawner/room/tenxten, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"fRe" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"fRm" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"fRz" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/relay) +"fRH" = ( +/obj/machinery/door/airlock/command{ + name = "Captain's Quarters"; + req_access_txt = "20" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/wood, +/area/hallway/secondary/command) +"fRO" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/junction, +/turf/open/floor/plating, +/area/maintenance/port/central) +"fRV" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"fSb" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"fSg" = ( +/turf/closed/wall, +/area/gateway) +"fSj" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"fSp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/closet/crate/science, +/obj/item/construction/rcd, +/obj/item/storage/box/lights/mixed, +/turf/open/floor/plasteel/dark, +/area/science/shuttledock) +"fSx" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"fSB" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/noslip/standard, +/area/hallway/secondary/service) +"fSL" = ( +/obj/effect/landmark/start/cargo_technician, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"fSM" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/obj/machinery/requests_console{ + department = "Aux Base"; + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) +"fTi" = ( +/obj/machinery/camera/autoname{ + dir = 4; + network = list("aisat") + }, +/turf/open/openspace/airless, +/area/space) +"fTj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"fTn" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"fTq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/solar/port/fore) +"fTt" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"fTz" = ( +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"fTH" = ( +/obj/machinery/computer/shuttle_flight{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/storage/art) +"fTI" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/obj/machinery/telecomms/processor/preset_one, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/server) +"fTM" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Thermoelectric Generator"; + req_access_txt = "10" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"fTW" = ( +/obj/machinery/holopad{ + pixel_y = 16 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"fTY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"fUc" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"fUo" = ( +/obj/structure/barricade/sandbags, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"fUy" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medical_shutters"; + name = "medical shutters" + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/pen, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"fUA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/dark, +/area/storage/art) +"fUD" = ( +/obj/structure/transit_tube/junction, +/turf/open/space/basic, +/area/space) +"fUG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"fUH" = ( +/obj/effect/turf_decal/box, +/obj/machinery/flasher{ + pixel_x = 28; + pixel_y = -27 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/hop) +"fUJ" = ( +/obj/structure/table, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"fUU" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/hor) +"fVe" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/grass, +/area/crew_quarters/park) +"fVj" = ( +/obj/machinery/flasher{ + id = "Cell 3"; + pixel_x = -28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/carpet/blue, +/area/security/brig) +"fVr" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hydroponics) +"fVu" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"fVv" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/cryopods) +"fVx" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"fVz" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/light/small, +/obj/machinery/light_switch{ + pixel_x = 26; + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"fVJ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"fVV" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"fWi" = ( +/obj/machinery/door/poddoor/shutters{ + id = "aux_base_shutters"; + name = "Auxillary Base Shutters" + }, +/obj/machinery/button/door{ + id = "aux_base_shutters"; + name = "Public Shutters Control"; + pixel_x = 1; + pixel_y = 25; + req_one_access_txt = "32;47;48" + }, +/turf/open/floor/plating, +/area/construction/mining/aux_base) +"fWm" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"fWs" = ( +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"fWC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "virology"; + name = "Virology Lockdown Shutters" + }, +/turf/open/floor/plating, +/area/medical/virology) +"fWF" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"fWH" = ( +/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 = 8 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"fWW" = ( +/obj/machinery/door/airlock/external, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/external{ + name = "Solar Panel Airlock"; + req_access_txt = "10" + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"fXh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/carpet/blue, +/area/security/brig) +"fXr" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"fXv" = ( +/obj/structure/chair/office, +/turf/open/floor/carpet/purple, +/area/vacant_room/office) +"fXU" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"fXV" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"fXX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"fYa" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/medical/medbay/lobby) +"fYb" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"fYf" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/storage) +"fYg" = ( +/obj/item/storage/toolbox/electrical, +/obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/pipe/layer_manifold, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"fYm" = ( +/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/courtroom) +"fYs" = ( +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"fYt" = ( +/obj/effect/landmark/start/librarian, +/turf/open/floor/wood, +/area/library) +"fYx" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fYO" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/telecomms/processor/preset_four, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/server) +"fYP" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"fYT" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/button/door{ + id = "armourydoors"; + name = "Armory Blast Doors"; + pixel_x = -28; + pixel_y = 28; + req_access_txt = "3" + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"fZe" = ( +/obj/structure/closet/toolcloset, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"fZf" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"fZh" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon, +/turf/open/space/basic, +/area/engine/engine_room) +"fZi" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"fZp" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"fZw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"fZC" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/suit_storage_unit/mining/eva, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"fZL" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"fZP" = ( +/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 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/red, +/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/dark, +/area/ai_monitored/security/armory) +"fZZ" = ( +/turf/closed/wall, +/area/crew_quarters/toilet) +"gaa" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"gah" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"gas" = ( +/obj/structure/table, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/glasses/welding, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light_switch{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"gaF" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/closet/secure_closet/atmospherics, +/turf/open/floor/plasteel, +/area/engine/atmos) +"gaM" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/railing, +/turf/open/floor/plasteel, +/area/science/shuttle) +"gaO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/research) +"gaT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"gaZ" = ( +/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/effect/turf_decal/tile/green, +/obj/structure/closet/l3closet/janitor, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/janitor) +"gbb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"gbk" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"gbs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"gbA" = ( +/obj/machinery/door/airlock/grunge{ + name = "Vacant Office"; + req_access_txt = "32" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"gbE" = ( +/obj/structure/railing, +/turf/open/openspace, +/area/medical/medbay/balcony) +"gbF" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"gbS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"gbU" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/medbay/lobby) +"gcp" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"gcq" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"gcx" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/light/small, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"gcE" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"gcN" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/atmos) +"gcQ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hydroponics) +"gcS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/reagent_dispensers/peppertank{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"gcT" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/grass, +/area/hydroponics/garden) +"gcY" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"gdc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"gdd" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"gdf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"gdi" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"gdw" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/landmark/start/janitor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/janitor) +"gdA" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"gdC" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/security/main) +"gdG" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"gdX" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"gep" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 8 + }, +/obj/machinery/meter, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"geq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"geu" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"geC" = ( +/obj/machinery/suit_storage_unit, +/obj/effect/turf_decal/stripes/box, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/maintenance/fore) +"geN" = ( +/turf/closed/wall/r_wall, +/area/science/research) +"geR" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/under/shorts/red, +/obj/item/clothing/under/shorts/grey, +/obj/item/stack/medical/gauze, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"geX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"gfg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"gfq" = ( +/obj/structure/railing, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"gft" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/airlock/mining{ + name = "Cargo Bay"; + req_one_access_txt = "31" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"gfx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"gfy" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 18 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"gfD" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/table/glass, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty{ + pixel_x = 1; + pixel_y = 4 + }, +/obj/item/stack/packageWrap, +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"gfK" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"gfP" = ( +/obj/structure/table/wood, +/obj/item/pen/fountain, +/turf/open/floor/wood, +/area/vacant_room/office) +"ggk" = ( +/turf/open/floor/plasteel, +/area/security/prison) +"ggo" = ( +/obj/machinery/teleport/hub, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"ggX" = ( +/obj/structure/cable/yellow{ + 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/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"ghl" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"gho" = ( +/obj/structure/closet/secure_closet/detective, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"ghq" = ( +/obj/machinery/door/poddoor{ + id = "QMLoaddoor"; + name = "Supply Dock Loading Door" + }, +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad" + }, +/obj/structure/plasticflaps, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ghv" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"ghy" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"ghM" = ( +/obj/machinery/space_heater, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"ghO" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall5"; + location = "hall4" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"ghS" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"ghW" = ( +/obj/effect/spawner/room/threexthree, +/turf/open/floor/plating, +/area/maintenance/fore) +"gig" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"gih" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"gim" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"gio" = ( +/turf/open/floor/plasteel, +/area/engine/atmos) +"giq" = ( +/obj/effect/decal/cleanable/glass, +/turf/closed/wall, +/area/maintenance/fore) +"giy" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/white, +/area/security/brig) +"giB" = ( +/obj/machinery/atmospherics/pipe/simple/multiz/layer3, +/obj/structure/lattice/catwalk, +/turf/open/openspace/airless, +/area/space/nearstation) +"giK" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"gje" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/newscaster{ + pixel_x = 30 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"gji" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"gjj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/purple/visible, +/turf/open/floor/plating, +/area/engine/atmos) +"gjm" = ( +/obj/machinery/newscaster{ + pixel_y = -30 + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -8 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = -1 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"gjo" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/suit/straight_jacket, +/obj/item/clothing/mask/muzzle, +/obj/item/clothing/glasses/blindfold, +/obj/item/storage/belt/medical{ + pixel_y = 2 + }, +/obj/item/clothing/glasses/eyepatch, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"gjr" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"gjI" = ( +/obj/item/beacon, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"gka" = ( +/obj/docking_port/stationary{ + dwidth = 16; + height = 15; + id = "exploration_home"; + name = "Exploration Dock"; + roundstart_template = /datum/map_template/shuttle/exploration/corg; + width = 23 + }, +/turf/open/floor/engine, +/area/quartermaster/exploration_dock) +"gkh" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"gkj" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"gko" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"gkr" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"gkx" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"gla" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/engine/engine_room) +"glg" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"glm" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"glo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"glw" = ( +/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/upper/secondary/service) +"glH" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/chef_recipes, +/obj/item/kitchen/rollingpin, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"glU" = ( +/obj/item/modular_computer/laptop/preset/civillian, +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/storage/art) +"gmc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"gmd" = ( +/obj/machinery/disposal/bin, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery/red, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"gmi" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"gmn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"gmr" = ( +/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/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"gmv" = ( +/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/white, +/area/medical/medbay/lobby) +"gmE" = ( +/obj/effect/landmark/start/geneticist, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"gmH" = ( +/obj/structure/chair, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"gmK" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"gmL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"gmO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"gnb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"gnd" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/obj/structure/closet/secure_closet/security/sec, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"gnt" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"gnx" = ( +/obj/structure/window/plasma/reinforced, +/obj/machinery/power/rad_collector/anchored, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/circuit/green, +/area/engine/supermatter) +"gnI" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/spawner/lootdrop/glowstick, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"gnN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/research{ + name = "Experimentation Lab"; + req_access_txt = "8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/explab) +"gnV" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"goa" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/computer/security, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/medical) +"gob" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"goc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/mixing) +"gog" = ( +/obj/machinery/door/airlock/research{ + id_tag = "ResearchExt"; + name = "Research Division"; + req_one_access_txt = "47" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/science/research) +"got" = ( +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/shuttledock) +"gov" = ( +/obj/structure/table/reinforced, +/obj/item/assembly/signaler{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/item/assembly/signaler{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/gps{ + gpstag = "AUX0"; + pixel_x = -5; + pixel_y = 2 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel, +/area/storage/tools) +"goC" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"goE" = ( +/obj/machinery/door/poddoor/preopen{ + id = "telelab"; + name = "test chamber blast door" + }, +/obj/machinery/button/door{ + id = "telelab"; + name = "Test Chamber Blast Doors"; + pixel_x = -24 + }, +/turf/open/floor/engine, +/area/science/explab) +"goK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"goL" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"goP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"goZ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"gpf" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"gpi" = ( +/obj/machinery/vending/tool, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/camera/autoname, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"gpA" = ( +/obj/machinery/atmospherics/pipe/simple/purple/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"gpL" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"gpR" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"gpU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/holopad{ + pixel_y = 16 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/security/main) +"gpZ" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/fore) +"gqc" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"gqk" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/airalarm/engine{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"gqn" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"gqs" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"gqD" = ( +/turf/open/floor/plasteel/recharge_floor, +/area/science/robotics) +"gqH" = ( +/obj/structure/window/plasma/reinforced{ + dir = 1 + }, +/obj/machinery/power/rad_collector/anchored, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/circuit/green, +/area/engine/supermatter) +"gqL" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio6"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"gqY" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"grd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"grh" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/maintenance/department/science) +"gri" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L14" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"grt" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"grw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"grI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/secondary) +"grL" = ( +/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 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"grR" = ( +/obj/structure/closet/secure_closet/medical2, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/white/corner, +/area/medical/surgery) +"gsa" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"gsj" = ( +/obj/machinery/camera/autoname, +/turf/open/openspace, +/area/medical/medbay/balcony) +"gsk" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/hallway/upper/secondary/entry) +"gsz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"gsA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/closed/wall, +/area/maintenance/solars/port/aft) +"gsJ" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/brown, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"gsV" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"gtc" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"gtp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"gts" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"gtJ" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"gtT" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/item/flashlight/glowstick/yellow, +/turf/open/floor/plating, +/area/maintenance/fore) +"guc" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2; + sortType = 22 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"gug" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"gul" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 1; + sortType = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"gur" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"guv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"gux" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"guE" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"guL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"guV" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/surgery, +/obj/item/cautery{ + pixel_x = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/item/glove_box{ + pixel_x = 1; + pixel_y = 3 + }, +/turf/open/floor/plasteel/white/side{ + dir = 6 + }, +/area/medical/surgery) +"guZ" = ( +/obj/machinery/light/small, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"gvf" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/science/xenobiology) +"gvi" = ( +/obj/structure/table, +/obj/item/circular_saw, +/obj/item/scalpel{ + pixel_y = 12 + }, +/obj/machinery/button/door{ + id = "telelab"; + name = "Test Chamber Blast Doors"; + pixel_x = -24 + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"gvm" = ( +/obj/structure/table/wood, +/obj/item/storage/pill_bottle/dice{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"gvr" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"gvx" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"gvJ" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/crew_quarters/bar) +"gvR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/landmark/start/roboticist, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"gvT" = ( +/obj/machinery/conveyor{ + id = "QMLoad" + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"gvX" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"gwl" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"gwt" = ( +/obj/machinery/porta_turret/ai, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) +"gwu" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining{ + name = "Cargo Bay"; + req_one_access_txt = "31" + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"gwJ" = ( +/obj/structure/cable/yellow{ + 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/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"gwU" = ( +/obj/structure/table/reinforced, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/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/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"gxa" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"gxx" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"gxF" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/under/shorts/green, +/obj/item/clothing/under/shorts/purple, +/obj/item/stack/medical/gauze, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"gxI" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"gxJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"gxN" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"gyj" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"gyl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/carpet/orange, +/area/quartermaster/qm) +"gyn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 22 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"gyp" = ( +/obj/machinery/vending/wardrobe/curator_wardrobe, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/engine/cult, +/area/library) +"gyB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/science) +"gyP" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"gyZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/engineering) +"gzg" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"gzl" = ( +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"gzm" = ( +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"gzq" = ( +/obj/machinery/atmospherics/components/trinary/mixer{ + dir = 8; + name = "plasma mixer" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"gzv" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/science/shuttle) +"gzJ" = ( +/obj/machinery/computer/crew{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/gateway) +"gzS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/sign/departments/holy{ + pixel_y = 32 + }, +/obj/machinery/camera/autoname, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/upper/primary/port) +"gzW" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/secondary) +"gAl" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/starboard/central) +"gAm" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"gAo" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"gAy" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"gAB" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/openspace, +/area/maintenance/starboard/fore) +"gAF" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/openspace, +/area/ai_monitored/security/armory) +"gAH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + 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 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"gAP" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"gAZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/machinery/requests_console{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage_shared) +"gBa" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"gBc" = ( +/obj/item/bedsheet/brown, +/obj/structure/bed, +/obj/item/toy/plush/carpplushie, +/obj/structure/sign/poster/official/twelve_gauge{ + pixel_y = 32 + }, +/obj/effect/landmark/start/bartender, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"gBw" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/sign/departments/minsky/supply/mining{ + pixel_x = 32 + }, +/obj/machinery/camera/autoname{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"gBH" = ( +/obj/machinery/door/airlock{ + name = "Garden" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/barricade/wooden/crude, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/hydroponics/garden/abandoned) +"gBN" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"gBT" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"gCb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"gCl" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/landmark/start/station_engineer, +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"gCo" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/keycard_auth{ + pixel_y = -24 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"gCz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"gCB" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"gCG" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + id = "Cell 3"; + name = "Cell 3" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/security/brig) +"gCP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"gCR" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 12 + }, +/turf/open/floor/plasteel, +/area/janitor) +"gCV" = ( +/turf/closed/wall, +/area/medical/patients_rooms/room_a) +"gCW" = ( +/obj/effect/landmark/start/cargo_technician, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"gCY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"gDb" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"gDq" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"gDv" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"gDy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/trinary/mixer/airmix{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"gDA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"gDN" = ( +/obj/machinery/door/poddoor{ + id = "deathdoor" + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"gDO" = ( +/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/item/stack/conveyor/thirty, +/obj/item/stack/conveyor/thirty, +/obj/item/conveyor_switch_construct, +/obj/item/conveyor_switch_construct, +/obj/item/conveyor_switch_construct, +/obj/item/conveyor_switch_construct, +/obj/item/screwdriver, +/obj/item/crowbar, +/obj/item/wrench, +/obj/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"gDR" = ( +/obj/structure/transit_tube/curved, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat/foyer) +"gDU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"gEb" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"gEd" = ( +/turf/open/openspace, +/area/medical/medbay/balcony) +"gEf" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/medical/storage) +"gED" = ( +/turf/closed/wall, +/area/science/storage) +"gEE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"gEF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"gEH" = ( +/obj/structure/chair/comfy/black{ + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"gFm" = ( +/obj/machinery/vending/snack/random, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"gFE" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"gFJ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"gFK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"gFY" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"gGa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/chair{ + dir = 8 + }, +/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 = -32 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"gGe" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"gGi" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"gGn" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/construction/mining/aux_base) +"gGo" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"gGp" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"gGw" = ( +/obj/machinery/conveyor/inverted{ + dir = 10; + id = "QMLoad" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"gGJ" = ( +/obj/machinery/door/airlock{ + id_tag = "shower3"; + name = "Shower Unit" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"gGL" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"gGM" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/vacant_room/commissary) +"gGO" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"gGW" = ( +/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/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"gGZ" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L10" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"gHb" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/light, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"gHe" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/pipe_dispenser, +/obj/item/holosign_creator/atmos{ + pixel_x = 3; + pixel_y = 1 + }, +/obj/item/holosign_creator/atmos{ + pixel_x = 3; + pixel_y = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"gHi" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/hallway/upper/secondary/exit/departure_lounge) +"gHA" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/suit_storage_unit/engine, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"gHP" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"gHY" = ( +/obj/structure/light_construct{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/pen/fountain, +/turf/open/floor/carpet/purple, +/area/vacant_room/office) +"gIb" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"gId" = ( +/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/white, +/area/medical/sleeper) +"gIn" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"gIq" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/openspace, +/area/quartermaster/exploration_prep) +"gIw" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"gIy" = ( +/obj/machinery/door/airlock/research{ + name = "Toxins Launch Room"; + req_access_txt = "8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"gIA" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"gIF" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + dir = 4; + freq = 1400; + location = "Kitchen" + }, +/obj/structure/plasticflaps/opaque, +/turf/open/floor/plating, +/area/crew_quarters/kitchen/coldroom) +"gIH" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/solar/port/aft) +"gJa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"gJk" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"gJn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/engine, +/area/engine/engine_room) +"gJp" = ( +/obj/effect/turf_decal/bot, +/obj/effect/landmark/start/roboticist, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"gJt" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"gJG" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"gJJ" = ( +/obj/machinery/camera/autoname{ + dir = 8; + network = list("aisat") + }, +/turf/open/space/basic, +/area/space) +"gJS" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/matches{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/maintenance/port) +"gJX" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/fore) +"gKh" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering) +"gKk" = ( +/obj/machinery/conveyor{ + id = "QMLoad" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"gKs" = ( +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/science/shuttledock) +"gKM" = ( +/obj/structure/table/reinforced, +/obj/item/storage/bag/tray, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"gKS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"gKT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/landmark/start/scientist, +/turf/open/floor/plasteel, +/area/science/lab) +"gLf" = ( +/turf/open/floor/plasteel/white, +/area/security/brig) +"gLh" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"gLi" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/landmark/start/botanist, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"gLu" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"gLC" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"gLG" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"gLX" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"gMk" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"gMl" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"gMq" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"gMU" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"gNa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/security/glass{ + name = "Prisoner Processing"; + req_one_access_txt = "2" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"gNm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"gNu" = ( +/obj/machinery/door/airlock/command{ + name = "E.V.A. Secure Storage"; + req_access_txt = "18" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"gNy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/hand_labeler, +/obj/item/laser_pointer, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/lab) +"gNB" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"gNL" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/maintenance/upper/fore) +"gNQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"gNV" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"gOf" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"gOj" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"gOs" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"gOB" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"gOD" = ( +/obj/structure/sign/directions/engineering{ + dir = 8 + }, +/obj/structure/sign/directions/science{ + dir = 8; + pixel_y = 8 + }, +/obj/structure/sign/directions/medical{ + pixel_y = -8 + }, +/turf/closed/wall, +/area/hallway/primary/central) +"gOH" = ( +/obj/machinery/computer/card/minor/rd{ + dir = 1 + }, +/obj/structure/window/reinforced, +/turf/open/floor/carpet/purple, +/area/crew_quarters/heads/hor) +"gOS" = ( +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"gPa" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"gPe" = ( +/obj/effect/turf_decal/delivery, +/turf/closed/wall/r_wall, +/area/security/brig) +"gPf" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"gPg" = ( +/obj/machinery/door/airlock/research/glass/incinerator/toxmix_exterior, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/engine, +/area/science/mixing/chamber) +"gPm" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"gPv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/table, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/circuitboard/computer/nanite_chamber_control, +/obj/item/circuitboard/computer/nanite_cloud_controller, +/obj/item/circuitboard/machine/nanite_chamber, +/obj/item/circuitboard/machine/nanite_program_hub, +/obj/item/circuitboard/machine/nanite_programmer, +/obj/item/circuitboard/machine/public_nanite_chamber, +/obj/item/nanite_remote, +/obj/item/nanite_scanner, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/lab) +"gPz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"gPD" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"gPO" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/eastleft{ + dir = 1; + req_access_txt = "1" + }, +/obj/machinery/door/window/westright{ + dir = 2 + }, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/medical) +"gPP" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"gQa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"gQd" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/door/window/eastleft{ + dir = 8; + name = "Engineering Deliveries"; + req_one_access_txt = "32;19" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"gQF" = ( +/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/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"gQG" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"gQO" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Primary Tool Storage" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/storage/tools) +"gQQ" = ( +/obj/structure/table/glass, +/obj/item/storage/backpack/duffelbag/med/surgery{ + pixel_y = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"gQS" = ( +/obj/machinery/door/airlock/command{ + name = "Teleport Access"; + req_access_txt = "17" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/teleporter) +"gQY" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"gRm" = ( +/obj/structure/sign/directions/supply{ + dir = 4 + }, +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = -8 + }, +/obj/structure/sign/directions/evac{ + pixel_y = 8 + }, +/turf/closed/wall, +/area/medical/medbay/lobby) +"gRz" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/item/pen{ + pixel_x = 1; + pixel_y = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"gRK" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/supermatter) +"gRL" = ( +/obj/structure/closet/crate/silvercrate, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"gSb" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/door/airlock/external/glass{ + name = "Escape Pod Delta" + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"gSp" = ( +/obj/effect/spawner/structure/window, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit) +"gSD" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"gSE" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"gSN" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"gSS" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"gSX" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"gTg" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Monestary Access" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"gTl" = ( +/obj/effect/spawner/xmastree, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"gTp" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"gTr" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"gTF" = ( +/obj/machinery/doorButtons/airlock_controller{ + idExterior = "virology_airlock_exterior"; + idInterior = "virology_airlock_interior"; + idSelf = "virology_airlock_control"; + name = "Virology Access Console"; + pixel_x = -27; + pixel_y = 28; + req_access_txt = "39" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"gTJ" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"gTS" = ( +/obj/structure/table/wood, +/obj/effect/spawner/lootdrop/three_course_meal, +/obj/machinery/newscaster{ + pixel_y = -29 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/carpet/orange, +/area/quartermaster/qm) +"gTT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"gUm" = ( +/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 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"gUo" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/aisat_interior) +"gUr" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/chair/office/light, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_b) +"gUt" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"gUx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"gUG" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"gUL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"gVn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"gVs" = ( +/obj/machinery/vending/wardrobe/bar_wardrobe, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"gVu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"gVw" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"gVz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"gVV" = ( +/turf/closed/wall, +/area/crew_quarters/park) +"gWg" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"gWi" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/sign/departments/minsky/medical/medical2{ + pixel_x = 32 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"gWu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"gWD" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"gWS" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"gXs" = ( +/obj/machinery/door/airlock{ + id_tag = "shower1"; + name = "Shower Unit" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"gXw" = ( +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"gXy" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/closet/secure_closet/brig, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"gXG" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"gXL" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"gXU" = ( +/obj/structure/table/wood, +/obj/machinery/computer/secure_data/laptop{ + pixel_y = 2 + }, +/obj/machinery/camera/autoname, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"gYA" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/engine_room) +"gYB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"gYE" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/wood, +/area/library) +"gYI" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"gYO" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"gYQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"gYT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"gZd" = ( +/obj/machinery/door/poddoor{ + id = "smeject"; + name = "Supermatter Ejection Door" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"gZf" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"gZg" = ( +/obj/structure/closet/toolcloset, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/computer/security/telescreen{ + desc = "Used for the Auxillary Mining Base."; + name = "Auxillary Base Monitor"; + network = list("auxbase"); + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) +"gZt" = ( +/obj/structure/table_frame/wood, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/wood, +/area/vacant_room/office) +"gZv" = ( +/obj/machinery/camera/autoname, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"gZH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"gZJ" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/lobby) +"gZV" = ( +/obj/machinery/status_display/evac{ + pixel_x = 32 + }, +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"gZW" = ( +/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/hallway/upper/primary/fore) +"gZZ" = ( +/obj/machinery/flasher{ + id = "PCell 2"; + pixel_x = -28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Cell 1"; + dir = 4; + network = list("ss13","prison") + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"hac" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/heads/hor) +"haj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"hat" = ( +/obj/structure/table, +/obj/item/melee/baton/loaded, +/obj/item/restraints/handcuffs, +/obj/item/folder/red, +/obj/item/folder/red, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/storage/box/firingpins, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"hau" = ( +/obj/effect/turf_decal/bot, +/obj/structure/reagent_dispensers/watertank, +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"haz" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal) +"haB" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"haD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/power/deck_relay{ + pixel_y = 32 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"haF" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/donkpockets, +/obj/machinery/light/small, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/requests_console{ + pixel_x = 32 + }, +/obj/item/reagent_containers/food/drinks/britcup{ + pixel_x = 4; + pixel_y = -1 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"haV" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"hba" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/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/noslip/white, +/area/science/research) +"hbf" = ( +/obj/machinery/door/airlock/public/glass, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"hbl" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"hbp" = ( +/obj/machinery/door/window/brigdoor{ + dir = 8; + name = "Telecommunications"; + req_access_txt = "61" + }, +/obj/machinery/door/window/brigdoor{ + dir = 4; + name = "Telecommunications"; + req_access_txt = "61" + }, +/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 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/computer) +"hbt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"hbu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"hbx" = ( +/obj/machinery/camera/autoname, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"hby" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"hbE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plating, +/area/quartermaster/miningdock) +"hbF" = ( +/obj/effect/turf_decal/tile/blue{ + 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/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"hca" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "telelab"; + name = "test chamber blast door" + }, +/turf/open/floor/plating, +/area/science/explab) +"hco" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"hcG" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"hcJ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hydroponics) +"hcY" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"hcZ" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"hda" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"hdc" = ( +/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/item/kirbyplants/random, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"hdd" = ( +/obj/effect/turf_decal/stripes/line, +/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 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"hdk" = ( +/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, +/obj/machinery/door/window/southleft{ + name = "Cloning Shower" + }, +/obj/structure/mirror{ + pixel_y = 30 + }, +/turf/open/floor/plasteel/techmaint, +/area/medical/genetics/cloning) +"hdt" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"hdQ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"hdX" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"heb" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"heh" = ( +/turf/closed/wall, +/area/quartermaster/storage) +"heB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"heF" = ( +/obj/machinery/computer/teleporter, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"heH" = ( +/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/aft) +"heR" = ( +/obj/machinery/computer/atmos_control/tank/toxin_tank, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"heY" = ( +/obj/machinery/vending/hydronutrients, +/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/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hydroponics) +"hfg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"hfh" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"hfm" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/structure/sign/departments/minsky/engineering/engineering{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"hfp" = ( +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"hfA" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/assistant, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"hfG" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"hfK" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medical_shutters"; + name = "medical shutters" + }, +/obj/item/reagent_containers/food/drinks/britcup, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"hfY" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/item/storage/box/beakers, +/obj/item/storage/box/medsprays, +/obj/item/reagent_containers/medspray, +/obj/item/reagent_containers/medspray, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"hgd" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"hgh" = ( +/obj/structure/lattice/catwalk, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"hgr" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced, +/obj/item/analyzer{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/cartridge/rd{ + pixel_x = 5; + pixel_y = 2 + }, +/obj/item/laser_pointer{ + pixel_x = 3; + pixel_y = 2 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/heads/hor) +"hgD" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/landmark/start/medical_doctor, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/medical/cryo) +"hgJ" = ( +/turf/open/openspace, +/area/science/research) +"hgK" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/medical/medbay/aft) +"hgL" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/highsecurity{ + name = "AI Upload"; + req_access_txt = "16" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"hhx" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"hhz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"hhM" = ( +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/advanced_airlock_controller/directional/west, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"hhV" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"hih" = ( +/obj/machinery/button/door{ + id = "Dorm1"; + name = "Dormitory Door Lock"; + normaldoorcontrol = 1; + pixel_x = 28; + pixel_y = 6; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"hii" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"his" = ( +/obj/machinery/disposal/bin, +/obj/machinery/status_display/evac{ + pixel_y = 32 + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/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/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"hiM" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"hiP" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"hjc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"hjg" = ( +/obj/structure/chair/sofa/left, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"hjj" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/science/shuttle) +"hju" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"hjB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/wrench, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"hjG" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/grass, +/area/crew_quarters/park) +"hjJ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/airlock/research{ + name = "Science Shuttle Dock"; + req_access_txt = "8" + }, +/turf/open/floor/plating, +/area/science/shuttledock) +"hkh" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/test_area) +"hkj" = ( +/turf/closed/wall, +/area/science/mixing) +"hkn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"hkr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/security/nuke_storage) +"hkE" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/trinary/mixer{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"hkH" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/openspace, +/area/maintenance/upper/central) +"hkI" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"hkJ" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/vacant_room/commissary) +"hkK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"hkP" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"hla" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel, +/area/medical/cryo) +"hlf" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"hlj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"hlm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/storage) +"hlu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"hlw" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/airalarm/directional/west, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"hlx" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"hlC" = ( +/obj/effect/spawner/structure/window, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"hlM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/research) +"hlU" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible, +/obj/item/pipe_dispenser, +/turf/open/floor/engine, +/area/engine/engine_room) +"hlW" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"hml" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/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/structure/closet/crate, +/obj/item/extrapolator, +/obj/item/extrapolator, +/obj/item/extrapolator, +/obj/item/extrapolator, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"hmu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"hmx" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"hmA" = ( +/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/effect/turf_decal/tile/yellow, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/structure/closet/secure_closet/medical3, +/turf/open/floor/plasteel, +/area/medical/storage) +"hmG" = ( +/obj/structure/table/wood, +/obj/item/modular_computer/laptop/preset/civillian, +/turf/open/floor/carpet/purple, +/area/vacant_room/office) +"hmH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"hmV" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Break Area" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"hmW" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"hmZ" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"hnp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"hns" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plating, +/area/maintenance/port/central) +"hny" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"hnH" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet/blue, +/area/security/brig) +"hnT" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/closet{ + name = "Evidence Closet 2" + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"hoj" = ( +/obj/structure/sign/directions/command{ + dir = 1 + }, +/obj/structure/sign/directions/science{ + dir = 1; + pixel_y = 8 + }, +/obj/structure/sign/directions/medical{ + dir = 1; + pixel_y = -8 + }, +/turf/closed/wall, +/area/maintenance/port/central) +"hok" = ( +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"hol" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/modular_computer/console/preset/command, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"hop" = ( +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"hox" = ( +/obj/machinery/door/airlock/external{ + name = "Labour Shuttle"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"hoz" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"hoA" = ( +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"hoK" = ( +/obj/structure/grille/broken, +/turf/closed/wall/r_wall, +/area/space/nearstation) +"hoM" = ( +/obj/effect/landmark/start/station_engineer, +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"hoT" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"hoX" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/plantgenes{ + pixel_x = 1; + pixel_y = 7 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plasteel, +/area/hydroponics) +"hpg" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/computer/security/labor{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"hpq" = ( +/turf/closed/wall/r_wall, +/area/security/warden) +"hpw" = ( +/obj/machinery/light_switch{ + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + 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/medbay/central) +"hpF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/port) +"hpL" = ( +/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/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"hpS" = ( +/obj/effect/landmark/start/chemist, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"hpX" = ( +/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/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"hqd" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"hqn" = ( +/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/stripes/line, +/obj/effect/turf_decal/caution{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"hqs" = ( +/obj/structure/table/optable, +/turf/open/floor/plasteel/white, +/area/security/brig) +"hqw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"hqG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"hqL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"hqO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/computer/cargo/request, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"hqQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/structure/disposaloutlet{ + dir = 4; + name = "Botany Deliveries" + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) +"hqS" = ( +/obj/machinery/door/window/northleft{ + name = "Containment Pen #5"; + req_access_txt = "55" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"hqT" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/science) +"hqV" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/chair/comfy{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"hrf" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/sign/departments/minsky/research/robotics{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"hrj" = ( +/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/vending/wardrobe/viro_wardrobe, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"hrk" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"hrn" = ( +/obj/machinery/camera/autoname{ + dir = 4; + network = list("aisat") + }, +/turf/open/openspace/airless, +/area/space/nearstation) +"hru" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"hrw" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"hrA" = ( +/obj/docking_port/stationary{ + dir = 4; + dwidth = 2; + height = 5; + id = "laborcamp_home"; + name = "fore bay 1"; + roundstart_template = /datum/map_template/shuttle/labour/corg; + width = 8 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"hrQ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/purple, +/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/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"hsg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"hsk" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"hsp" = ( +/obj/structure/chair/sofa/right{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"hsy" = ( +/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/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/caution{ + dir = 8; + pixel_x = -3 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/noslip/dark, +/area/hallway/secondary/service) +"hsB" = ( +/turf/closed/wall, +/area/quartermaster/office) +"hsN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"hsP" = ( +/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/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"hsV" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/holopad, +/obj/machinery/keycard_auth{ + pixel_x = -26 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/crew_quarters/heads/hor) +"hsY" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/engine/engineering) +"hsZ" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/space/nearstation) +"hte" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/bridge) +"htk" = ( +/turf/closed/wall, +/area/science/misc_lab/range) +"htl" = ( +/obj/item/stack/cable_coil/yellow, +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating, +/area/maintenance/port) +"htn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 28 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"htu" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"htH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/computer/atmos_control{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"hub" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/janitor) +"huf" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/openspace, +/area/maintenance/starboard/fore) +"hup" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"huB" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"huM" = ( +/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/tile/blue, +/obj/structure/window/reinforced{ + dir = 4; + pixel_y = 1 + }, +/obj/machinery/door/window/southleft{ + base_state = "right"; + icon_state = "right"; + name = "Cloning Shower" + }, +/obj/machinery/shower{ + pixel_y = 16 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel/techmaint, +/area/medical/genetics/cloning) +"huN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible/layer3{ + dir = 1 + }, +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/grass, +/area/crew_quarters/park) +"huZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"hve" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"hvf" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"hvn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"hvu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/fore) +"hvE" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space/basic, +/area/space/nearstation) +"hvT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"hwf" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"hwI" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"hwY" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"hxg" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/openspace, +/area/maintenance/starboard/fore) +"hxl" = ( +/turf/open/floor/plating/asteroid, +/area/maintenance/port) +"hxo" = ( +/obj/structure/flora/ausbushes/genericbush, +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"hxA" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"hxM" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/sign/poster/random{ + pixel_y = -32 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"hxX" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/upper/primary/port) +"hyd" = ( +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"hyf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/structure/flora/junglebush/b, +/obj/structure/flora/tree/jungle, +/turf/open/floor/grass, +/area/crew_quarters/park) +"hyo" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"hyH" = ( +/turf/open/floor/carpet/green, +/area/library) +"hyQ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"hyW" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"hzd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"hze" = ( +/obj/structure/chair/comfy, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"hzi" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"hzj" = ( +/obj/effect/turf_decal/tile/red{ + 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/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/supply) +"hzu" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Teleporter Maintenance"; + req_access_txt = "17"; + security_level = 6 + }, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"hzA" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"hzE" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio1"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"hzR" = ( +/turf/closed/wall/r_wall, +/area/science/shuttle) +"hAd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/camera/autoname, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/fore) +"hAh" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"hAC" = ( +/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/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"hAE" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"hAF" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"hBj" = ( +/obj/effect/turf_decal/caution, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"hBm" = ( +/obj/structure/table/reinforced, +/obj/item/coin/arcade_token, +/obj/item/flashlight/glowstick/pink, +/obj/item/flashlight/glowstick/yellow, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 24; + prison_radio = 1 + }, +/turf/open/floor/carpet, +/area/security/prison) +"hBq" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"hBr" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/obj/structure/table/reinforced, +/obj/item/restraints/handcuffs, +/obj/item/assembly/flash, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"hBA" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/item/toy/figure/qm{ + pixel_x = -1; + pixel_y = 11 + }, +/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/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/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"hBO" = ( +/obj/structure/flora/junglebush/b, +/turf/open/floor/grass, +/area/crew_quarters/park) +"hBP" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"hBZ" = ( +/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/security/brig) +"hCc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"hCe" = ( +/obj/effect/landmark/start/virologist, +/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) +"hCi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"hCD" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 17 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"hCG" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"hCY" = ( +/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/layer1, +/turf/open/floor/plasteel, +/area/science/shuttle) +"hDc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"hDw" = ( +/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/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"hDA" = ( +/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/bridge) +"hDC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/warden) +"hDE" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"hDQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"hEa" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4; + sortType = 5 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"hEq" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/space/basic, +/area/space/nearstation) +"hEs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"hEz" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"hEC" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"hEG" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"hEH" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"hEV" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"hEW" = ( +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/plating, +/area/security/brig) +"hFi" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/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" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/research) +"hFl" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"hFm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"hFq" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"hFs" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"hFv" = ( +/obj/machinery/disposal/bin, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"hFT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"hFX" = ( +/obj/effect/landmark/start/shaft_miner, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"hGc" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/closet{ + name = "Evidence Closet 5" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"hGo" = ( +/mob/living/simple_animal/slime, +/turf/open/floor/engine, +/area/science/xenobiology) +"hGx" = ( +/obj/item/radio/intercom{ + pixel_y = 22 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"hGy" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/science/robotics) +"hHv" = ( +/turf/open/openspace, +/area/quartermaster/exploration_prep) +"hHz" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"hHB" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"hHC" = ( +/turf/open/openspace/airless, +/area/ai_monitored/turret_protected/AIsatextAP) +"hHD" = ( +/obj/structure/closet/secure_closet/brig{ + id = "Cell 1"; + name = "Cell 1 Locker" + }, +/turf/open/floor/carpet/blue, +/area/security/brig) +"hHG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"hHI" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/upper/secondary/exit/departure_lounge) +"hHQ" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/space/nearstation) +"hHY" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating, +/area/maintenance/fore) +"hIf" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"hIg" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"hIl" = ( +/turf/closed/wall/r_wall, +/area/engine/engine_room) +"hIv" = ( +/obj/machinery/gateway{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/circuit, +/area/gateway) +"hIF" = ( +/obj/structure/transit_tube{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"hIR" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/obj/machinery/advanced_airlock_controller/directional/east, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"hIS" = ( +/obj/structure/table/wood, +/obj/item/storage/box/drinkingglasses, +/obj/item/reagent_containers/food/drinks/beer, +/obj/item/reagent_containers/food/drinks/beer, +/obj/item/reagent_containers/food/drinks/beer, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"hIZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"hJa" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"hJe" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"hJi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"hJl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"hJo" = ( +/obj/structure/transit_tube/curved{ + dir = 8 + }, +/turf/open/space/basic, +/area/space) +"hJx" = ( +/obj/machinery/telecomms/bus/preset_one, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) +"hJz" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"hJS" = ( +/obj/machinery/atmospherics/components/unary/tank/air, +/turf/open/floor/plating, +/area/security/brig) +"hKc" = ( +/obj/machinery/computer/cargo{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/requests_console{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"hKf" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"hKF" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"hKH" = ( +/obj/structure/mirror{ + pixel_x = 28 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"hLb" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"hLf" = ( +/obj/structure/cable/yellow{ + 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 = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"hLg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine, +/area/engine/engine_room) +"hLi" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"hLo" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"hLq" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/disposal) +"hLt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"hLS" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/vacant_room/commissary) +"hMe" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"hMm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"hMq" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"hMt" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"hMu" = ( +/obj/structure/railing, +/turf/open/openspace, +/area/maintenance/upper/fore) +"hMw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"hMy" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/openspace, +/area/security/brig) +"hMz" = ( +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"hMA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"hMJ" = ( +/obj/machinery/door/airlock/mining{ + name = "Quartermaster's Quarters"; + req_access_txt = "41" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/carpet/orange, +/area/quartermaster/qm) +"hNb" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel/white, +/area/science/explab) +"hNe" = ( +/obj/machinery/rnd/production/techfab/department/medical, +/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/effect/turf_decal/tile/yellow, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/medical/storage) +"hNh" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/space/nearstation) +"hNq" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/requests_console{ + pixel_y = -32 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"hND" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"hNJ" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Shared Engineering Storage"; + req_one_access_txt = "32;19" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/engine/storage_shared) +"hNL" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/grass, +/area/crew_quarters/park) +"hNR" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"hOf" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"hOn" = ( +/obj/machinery/microwave{ + desc = "Cooks and boils stuff, somehow."; + pixel_x = -3; + pixel_y = 5 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"hOu" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"hOJ" = ( +/obj/machinery/atmospherics/pipe/manifold/general/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"hOU" = ( +/obj/effect/spawner/room/threexfive, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"hPh" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/kirbyplants/random, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"hPw" = ( +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"hPL" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"hPT" = ( +/obj/machinery/computer/monitor, +/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/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"hPX" = ( +/obj/machinery/requests_console{ + department = "Detective's Office"; + departmentType = 4; + pixel_y = -32 + }, +/obj/machinery/camera/autoname{ + dir = 1; + network = list("aisat") + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"hPZ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"hQa" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Office"; + req_one_access_txt = "31;48" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"hQb" = ( +/obj/structure/flora/ausbushes/palebush, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/grass, +/area/hallway/secondary/command) +"hQl" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/chair/comfy{ + dir = 4 + }, +/obj/effect/landmark/start/chaplain, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"hQy" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/effect/landmark/start/security_officer, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"hQF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"hQL" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"hQM" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"hQQ" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor{ + id = "trash"; + name = "Waste Ejection" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"hQS" = ( +/obj/structure/rack, +/obj/item/storage/box/teargas{ + pixel_x = 1; + pixel_y = -2 + }, +/obj/item/storage/box/flashbangs, +/obj/effect/turf_decal/delivery, +/obj/item/storage/box/firingpins, +/obj/item/gun/grenadelauncher, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"hQZ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"hRb" = ( +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/bodypart/r_arm/robot, +/obj/item/bodypart/r_arm/robot, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/assembly/prox_sensor, +/obj/item/assembly/prox_sensor, +/obj/item/assembly/prox_sensor, +/obj/item/assembly/prox_sensor, +/obj/item/assembly/prox_sensor, +/obj/item/assembly/prox_sensor, +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 + }, +/obj/machinery/cell_charger, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"hRk" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"hRr" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/razor{ + pixel_x = -9; + pixel_y = 4 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"hRs" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/folder/red, +/obj/item/pen, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"hRt" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"hRy" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Bar"; + pixel_x = 32 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"hRA" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"hRW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"hSi" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"hSt" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"hSx" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/manifold/supply/visible/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/turf/open/openspace/airless, +/area/space/nearstation) +"hSG" = ( +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"hTe" = ( +/obj/structure/railing, +/turf/open/openspace, +/area/crew_quarters/bar) +"hTi" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/stasis, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"hTm" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"hTn" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"hTr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"hTB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"hTM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"hTO" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + dir = 4; + freq = 1400; + location = "Security" + }, +/obj/structure/plasticflaps/opaque, +/turf/open/floor/plating, +/area/security/main) +"hTV" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/maintenance/fore) +"hTX" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/closet{ + name = "Evidence Closet 3" + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"hUa" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"hUb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"hUh" = ( +/obj/structure/closet/l3closet, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"hUi" = ( +/turf/closed/wall, +/area/maintenance/starboard/fore) +"hUu" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"hUy" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"hUF" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"hUV" = ( +/obj/machinery/door/airlock/engineering{ + name = "Shuttle Lab"; + req_one_access_txt = "32;19;47" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"hVe" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"hVf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"hVj" = ( +/obj/machinery/door/window/westleft{ + name = "Research Division Deliveries"; + req_access_txt = "47" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) +"hVv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -14; + pixel_y = 1 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"hVW" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"hVX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall9"; + location = "hall8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"hWf" = ( +/obj/machinery/door/poddoor/incinerator_atmos_aux, +/turf/open/floor/engine/vacuum, +/area/engine/atmospherics_engine) +"hWA" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/openspace, +/area/medical/medbay/balcony) +"hWK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"hWZ" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4; + external_pressure_bound = 140; + name = "RD Server Vent"; + pressure_checks = 0 + }, +/turf/open/floor/circuit, +/area/science/server) +"hXd" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"hXe" = ( +/obj/structure/table/wood, +/obj/item/paicard, +/obj/item/storage/crayons, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"hXg" = ( +/obj/effect/turf_decal/tile/red{ + 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/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"hXH" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"hXO" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/science/shuttle) +"hXT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/science/misc_lab/range) +"hYe" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"hYp" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"hYq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"hYr" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"hYs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"hYu" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"hYB" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"hYJ" = ( +/turf/closed/mineral/random, +/area/maintenance/starboard/secondary) +"hYK" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"hYP" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"hYQ" = ( +/obj/machinery/food_cart, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"hYW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"hZc" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"hZe" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"hZl" = ( +/turf/open/floor/carpet, +/area/hallway/primary/fore) +"hZA" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/bridge) +"hZJ" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "O2 to Pure" + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"hZK" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"hZN" = ( +/obj/machinery/requests_console{ + pixel_y = -32 + }, +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"hZP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"hZT" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"hZY" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"iap" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"iar" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics/cloning) +"iaw" = ( +/turf/closed/wall, +/area/chapel/office) +"ibd" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/crew_quarters/heads/cmo) +"ibh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"ibl" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/vending/wardrobe/chem_wardrobe, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"ibm" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"ibo" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"ibq" = ( +/obj/structure/sign/directions/security{ + dir = 4 + }, +/obj/structure/sign/directions/evac{ + pixel_y = -8 + }, +/obj/structure/sign/directions/supply{ + pixel_y = 8 + }, +/turf/closed/wall, +/area/crew_quarters/heads/hop) +"ibA" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"ibE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/security/prison) +"ibK" = ( +/obj/structure/chair, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"ibN" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"ibO" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/maintenance/port) +"ibP" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/carpet/purple, +/area/vacant_room/office) +"ibT" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"ibU" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"ibW" = ( +/obj/machinery/door/airlock/public/glass, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"icb" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"icd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"ice" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/fore) +"icx" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"icC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"icD" = ( +/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/effect/turf_decal/tile/green, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"icG" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"icP" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"icW" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/caution, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"icY" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/external{ + name = "Solar Panel Airlock"; + req_access_txt = "10" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"icZ" = ( +/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/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"idd" = ( +/obj/machinery/smartfridge, +/turf/closed/wall, +/area/crew_quarters/bar) +"idt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/medical/sleeper) +"idA" = ( +/obj/structure/table/glass, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"idC" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"idF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"idH" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"idJ" = ( +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"iel" = ( +/turf/open/floor/plasteel/chapel{ + dir = 1 + }, +/area/chapel/main/monastery) +"ieL" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Virology"; + departmentType = 2; + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"ieT" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"ieW" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"ifb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"ifg" = ( +/turf/open/floor/plasteel, +/area/science/mixing) +"ifi" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"ift" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"ifu" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"ifw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"ifz" = ( +/obj/machinery/door/airlock/command{ + name = "Chief Medical Officer's Office"; + req_access_txt = "40" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet/cyan, +/area/crew_quarters/heads/cmo) +"ifF" = ( +/obj/structure/bookcase/random/adult, +/turf/open/floor/carpet/green, +/area/library) +"ifI" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/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/white, +/area/medical/virology) +"ifT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"igf" = ( +/obj/machinery/clonepod/prefilled, +/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/window/reinforced{ + pixel_y = 1 + }, +/obj/structure/sign/departments/minsky/medical/clone/cloning2{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/techmaint, +/area/medical/genetics/cloning) +"igo" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/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/warden) +"igs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/camera/autoname{ + dir = 9 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/sign/departments/minsky/research/robotics{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"igt" = ( +/obj/effect/spawner/room/tenxten, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"igu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"igx" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"igy" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes, +/turf/open/floor/plating/asteroid, +/area/maintenance/port) +"igE" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/computer/atmos_alert{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"igG" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"igR" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"igU" = ( +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"igX" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"ihe" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/science/xenobiology) +"ihf" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ihi" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"ihk" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"iht" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/research) +"ihG" = ( +/obj/machinery/atmospherics/pipe/layer_manifold, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"ihQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"ihV" = ( +/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/machinery/light_switch{ + pixel_x = -25 + }, +/obj/effect/turf_decal/delivery/white{ + pixel_y = 5 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"ihZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/security/brig) +"iie" = ( +/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 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"iin" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"iis" = ( +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"iiy" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Panel Airlock"; + req_access_txt = "10" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"iiF" = ( +/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/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics/cloning) +"iiO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"iiR" = ( +/obj/machinery/computer/atmos_control/tank/sm{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"iiT" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"iiU" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/engine/storage) +"ijc" = ( +/obj/structure/table/glass, +/obj/item/storage/box/bodybags, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"ijf" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ijn" = ( +/obj/machinery/door/poddoor/shutters{ + id = "evashutters"; + name = "E.V.A. Storage Shutters" + }, +/obj/machinery/button/door{ + id = "evashutters"; + name = "E.V.A. Shutters"; + pixel_x = 26; + req_access_txt = "19" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"ijq" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"ijC" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/airlock/command{ + name = "Head of Security"; + req_access_txt = "58" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/hos) +"ijD" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ijH" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/advanced_airlock_controller/directional/north, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ikg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"ikl" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port) +"ikz" = ( +/obj/machinery/telecomms/broadcaster/preset_left, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) +"ikA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"ikB" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"ikF" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"ikM" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"ikP" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/computer/camera_advanced/base_construction{ + dir = 4 + }, +/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/construction/mining/aux_base) +"ikU" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"ikV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"ikZ" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/medical/surgery/aux) +"ile" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"ilg" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/watermelon, +/turf/open/floor/grass, +/area/hydroponics/garden) +"ils" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/medical/surgery) +"ilB" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"ilJ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"ilL" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"imh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"imm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/secondary) +"imL" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/bottle/epinephrine, +/obj/item/reagent_containers/syringe/epinephrine, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"imV" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"imW" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"imZ" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ind" = ( +/obj/structure/closet/crate/secure{ + desc = "A secure crate containing various materials for building a customised test-site."; + name = "Test Site Materials Crate"; + req_access_txt = "8" + }, +/obj/item/target/alien, +/obj/item/target/alien, +/obj/item/target/clown, +/obj/item/target/syndicate, +/obj/item/stack/rods/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/machinery/button/massdriver{ + id = "toxinsdriver"; + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/science/misc_lab/range) +"inn" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/chapel{ + dir = 5 + }, +/area/chapel/main/monastery) +"inA" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/snacks/dough, +/obj/item/kitchen/rollingpin, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"inB" = ( +/obj/machinery/light_switch{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"inF" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/maintenance/upper/aft) +"inQ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/computer/objective, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/shuttledock) +"inT" = ( +/obj/machinery/chem_master/condimaster, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"inV" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/fore) +"ion" = ( +/obj/structure/dresser, +/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/dark, +/area/maintenance/department/chapel/monastery) +"iot" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "atmos"; + name = "Atmospherics Lockdown" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ioC" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"ioD" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"ioO" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ioZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/closed/wall, +/area/maintenance/solars/starboard/aft) +"ipg" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"ipi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/coldroom) +"ipk" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/closet/secure_closet/security/sec, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"ipl" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/research) +"ipo" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"ipq" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/dorms) +"ipu" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"ipx" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"ipD" = ( +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/secondary) +"ipI" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ipW" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"iqd" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/obj/structure/displaycase, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"iqh" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel, +/area/storage/tools) +"iqn" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/vending/medical, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/lobby) +"iqo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + network = list("aisat") + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"iqq" = ( +/obj/machinery/door/poddoor{ + id = "toxinsdriver"; + name = "Toxins Launcher Bay Door" + }, +/obj/structure/fans/tiny, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/science/misc_lab/range) +"iqA" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"iqE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"iqF" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"iqH" = ( +/obj/machinery/door/airlock/security{ + name = "Armory"; + req_access_txt = "3"; + security_level = 6 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/poddoor/preopen{ + id = "armourydoors"; + name = "Blast Doors" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"iqU" = ( +/obj/item/wrench, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/security/brig) +"iqW" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"irc" = ( +/obj/effect/spawner/room/tenxfive, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ire" = ( +/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 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"irA" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Panel Airlock"; + req_access_txt = "10" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"irL" = ( +/turf/closed/wall, +/area/science/lab) +"irQ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"irX" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/landmark/start/emt, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"isa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/fore) +"isi" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"isn" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/delivery, +/obj/machinery/requests_console{ + department = "Dorms"; + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"isy" = ( +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"isE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"isU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"isZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/hallway/secondary/command) +"ite" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/rnd/production/protolathe/department/engineering, +/turf/open/floor/plasteel/dark, +/area/engine/storage_shared) +"ity" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/station_engineer, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"itA" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"itJ" = ( +/obj/structure/sign/departments/minsky/medical/chemistry/chemical2{ + pixel_y = 32 + }, +/turf/open/openspace, +/area/medical/medbay/balcony) +"itO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"itY" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/junction, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"iuq" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"iuC" = ( +/obj/structure/grille/broken, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"iuF" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/openspace, +/area/quartermaster/exploration_dock) +"iuK" = ( +/obj/machinery/dna_scannernew, +/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/requests_console{ + department = "Genetics"; + pixel_y = -32 + }, +/turf/open/floor/plasteel/techmaint, +/area/medical/genetics/cloning) +"iuS" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"iuU" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/science/test_area) +"ivn" = ( +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"ivv" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ivw" = ( +/obj/machinery/door/window{ + dir = 4; + name = "AI Core Door"; + req_access_txt = "16" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"ivy" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"ivz" = ( +/turf/closed/wall, +/area/hallway/secondary/service) +"ivF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/closet/crate, +/obj/item/electronics/apc, +/obj/item/stock_parts/cell/high, +/obj/item/circuitboard/machine/shuttle/heater, +/obj/item/circuitboard/machine/shuttle/engine/plasma, +/turf/open/floor/plasteel/dark, +/area/science/shuttledock) +"ivG" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ivR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ivX" = ( +/obj/machinery/computer/robotics, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/heads/hor) +"iwk" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/law) +"iwm" = ( +/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/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"iwq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"iwB" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"iwN" = ( +/obj/effect/turf_decal/tile/red{ + 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/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/science) +"ixg" = ( +/turf/closed/wall, +/area/maintenance/solars/starboard/aft) +"ixm" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ixG" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"ixI" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/kitchen) +"ixN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"iyg" = ( +/obj/machinery/power/deck_relay{ + pixel_y = 32 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/multiz/layer1, +/obj/machinery/atmospherics/pipe/simple/multiz/layer3, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"iyi" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"iyy" = ( +/obj/machinery/conveyor{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"iyH" = ( +/turf/open/floor/grass, +/area/hydroponics/garden) +"iyP" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/camera/autoname, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/maintenance/starboard/aft) +"iyZ" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/engineering) +"ize" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"izg" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "permabolt1"; + name = "Cell 2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"izh" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/sugar, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"izi" = ( +/obj/machinery/nuclearbomb/selfdestruct{ + layer = 2 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"izv" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"izF" = ( +/obj/structure/chair/wood, +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/dorms) +"izK" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/landmark/start/emt, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"izQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"iAp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"iAr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/quartermaster/exploration_prep) +"iAI" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"iAJ" = ( +/obj/structure/bodycontainer/morgue, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"iAM" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"iAP" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"iBp" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"iBt" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"iBE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/quartermaster/office) +"iBF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/grass, +/area/crew_quarters/park) +"iBG" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"iBQ" = ( +/obj/effect/turf_decal/tile/green, +/obj/item/toy/crayon/spraycan, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"iBX" = ( +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/carpet/orange, +/area/quartermaster/qm) +"iCo" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engine_room) +"iCs" = ( +/obj/structure/table, +/obj/item/wallframe/camera, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"iCB" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/crew_quarters/heads/hos) +"iCG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/rack, +/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{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/healthanalyzer{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/healthanalyzer{ + pixel_x = 4; + pixel_y = -4 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"iCH" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"iCK" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"iCL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"iCU" = ( +/obj/machinery/computer/security{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"iDa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"iDh" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"iDi" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"iDj" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"iDK" = ( +/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/medical/chemistry/upper) +"iDN" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/maintenance/upper/central) +"iDX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/plasteel, +/area/science/mixing) +"iEk" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"iEr" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/secondary) +"iEs" = ( +/obj/machinery/computer/nanite_cloud_controller, +/turf/open/floor/circuit/green, +/area/science/nanite) +"iEA" = ( +/obj/machinery/door/window/northleft{ + name = "Containment Pen #1"; + req_access_txt = "55" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio1"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"iEH" = ( +/obj/machinery/camera/autoname, +/turf/open/openspace, +/area/engine/engine_room) +"iEM" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 19 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"iEV" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/structure/rack, +/obj/item/construction/plumbing, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"iEY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"iFn" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/mob/living/simple_animal/parrot/Poly, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"iFo" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel/white, +/area/science/lab) +"iFJ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"iFS" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"iFW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"iGa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"iGc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/weightmachine/stacklifter, +/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/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"iGu" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"iGA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"iGF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/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, +/area/engine/engineering) +"iGZ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"iHc" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) +"iHi" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"iHo" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"iHx" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"iHB" = ( +/obj/structure/lattice, +/obj/structure/lattice, +/turf/open/openspace/airless, +/area/space) +"iHR" = ( +/obj/structure/table/wood, +/obj/item/candle, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"iIb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"iIg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"iIo" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"iIs" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"iIG" = ( +/obj/structure/table, +/obj/item/assembly/igniter{ + pixel_y = -1 + }, +/obj/item/assembly/igniter{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/item/screwdriver{ + pixel_y = 16 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/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 = 1 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"iIL" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"iIQ" = ( +/obj/machinery/computer/message_monitor, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"iIS" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"iIX" = ( +/turf/closed/wall, +/area/quartermaster/miningdock) +"iJc" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"iJd" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"iJe" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/hallway/upper/primary/fore) +"iJf" = ( +/turf/open/openspace/airless, +/area/ai_monitored/turret_protected/aisat_interior) +"iJh" = ( +/obj/structure/table/wood, +/obj/item/book/manual/random{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/flashlight/lamp{ + pixel_y = 10 + }, +/obj/structure/sign/poster/random{ + pixel_x = -32 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"iJv" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"iJA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"iJB" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/landmark/start/security_officer, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"iJF" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"iJK" = ( +/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/requests_console{ + department = "Xenobiology"; + departmentType = 2; + pixel_x = -32 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"iJM" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"iJT" = ( +/obj/machinery/camera/autoname{ + dir = 5 + }, +/obj/structure/closet/radiation, +/turf/open/floor/noslip/dark, +/area/engine/engineering) +"iJU" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"iJW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"iJY" = ( +/obj/item/circuitboard/machine/shuttle/engine/plasma, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"iKj" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/wood, +/area/maintenance/port) +"iKo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/poddoor/preopen{ + id = "ceprivacy"; + name = "privacy shutter" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution/stand_clear, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"iKA" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"iKE" = ( +/obj/machinery/door/airlock/engineering{ + name = "Atmospherics Entry"; + req_one_access_txt = "32;19" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"iKG" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"iKU" = ( +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = -8 + }, +/obj/structure/sign/directions/command{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/security/checkpoint/customs) +"iKW" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/chair/comfy/beige{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/hallway/primary/fore) +"iLa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/bridge) +"iLj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/shower{ + pixel_y = 16 + }, +/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/effect/turf_decal/tile/purple, +/turf/open/floor/noslip/white, +/area/science/research) +"iLn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"iLp" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/exit/departure_lounge) +"iLz" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science{ + req_access_txt = "49" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/exploration_prep) +"iLA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"iLC" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/openspace, +/area/maintenance/starboard/fore) +"iLG" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"iLY" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"iMb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"iMd" = ( +/obj/machinery/door/airlock{ + name = "Bar Bedroom"; + req_access_txt = "25" + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"iMe" = ( +/obj/machinery/vending/cola/random, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"iMo" = ( +/obj/machinery/door/airlock/external{ + name = "Supply Dock Airlock"; + req_access_txt = "31" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"iMr" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"iMW" = ( +/obj/item/bedsheet/mime, +/obj/structure/bed, +/obj/effect/landmark/start/mime, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/light, +/turf/open/floor/carpet/purple, +/area/crew_quarters/theatre) +"iNl" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/hallway/upper/primary/fore) +"iNn" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"iNO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"iOe" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"iOo" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"iOv" = ( +/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/light_switch{ + pixel_x = -25 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"iOA" = ( +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4; + network = list("aisat") + }, +/obj/structure/chair/comfy{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"iOF" = ( +/obj/structure/rack, +/obj/item/stack/packageWrap, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/vacant_room/commissary) +"iON" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"iOX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/gateway) +"iOY" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/dorms) +"iPo" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"iPx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/storage) +"iPB" = ( +/turf/open/floor/plasteel/dark, +/area/quartermaster/exploration_prep) +"iPL" = ( +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"iQt" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"iQu" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"iQR" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/air, +/obj/item/wrench, +/turf/open/floor/plating, +/area/science/xenobiology) +"iRd" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"iRe" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"iRf" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/sign/poster/random{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"iRi" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Fore Primary Hallway" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"iRw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"iSa" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"iSh" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"iSo" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"iSr" = ( +/turf/closed/wall, +/area/engine/engineering) +"iSC" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"iSN" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"iSP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/item/beacon, +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"iSQ" = ( +/obj/item/kirbyplants/random, +/obj/structure/flora/ausbushes/brflowers, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"iSS" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace, +/area/maintenance/upper/aft) +"iST" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"iTf" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"iTh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/closet/crate, +/obj/item/reagent_containers/glass/bottle/chloralhydrate, +/obj/item/reagent_containers/glass/bottle/chloralhydrate, +/obj/item/reagent_containers/glass/rag, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"iTi" = ( +/turf/open/floor/circuit/red, +/area/hallway/secondary/entry) +"iTu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"iTC" = ( +/obj/machinery/computer/security/wooden_tv, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"iTE" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/unres, +/obj/structure/barricade/wooden/crude, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/hallway/primary/central) +"iTH" = ( +/obj/machinery/telecomms/receiver/preset_left, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) +"iTJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"iTO" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/vomit, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"iTR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"iTT" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table, +/turf/open/floor/plasteel/white/side, +/area/medical/surgery) +"iUb" = ( +/obj/machinery/holopad, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/AIsatextAP) +"iUg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"iUh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"iUu" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Chapel Dock Access" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"iUE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"iUJ" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/mob/living/simple_animal/butterfly, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"iUQ" = ( +/obj/machinery/door/window/northleft{ + name = "Containment Pen #2"; + req_access_txt = "55" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio2"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"iUT" = ( +/obj/structure/transit_tube/curved/flipped{ + dir = 1 + }, +/turf/open/space/basic, +/area/space) +"iUY" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard{ + pixel_x = 9; + pixel_y = 2 + }, +/obj/item/paper/monitorkey{ + pixel_x = 9; + pixel_y = 3 + }, +/obj/item/cartridge/engineering{ + pixel_x = -12; + pixel_y = -1 + }, +/obj/item/cartridge/engineering{ + pixel_x = -10; + pixel_y = 7 + }, +/obj/item/cartridge/engineering{ + pixel_x = -4 + }, +/obj/item/cartridge/engineering{ + pixel_x = -7; + pixel_y = 2 + }, +/obj/item/stamp/ce{ + pixel_x = 5; + pixel_y = 8 + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"iVa" = ( +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"iVf" = ( +/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/hallway/primary/central) +"iVr" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"iVt" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/closet/secure_closet/brig, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"iVx" = ( +/obj/machinery/computer/shuttle_flight/labor, +/obj/machinery/advanced_airlock_controller/directional/north, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"iVC" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 20 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"iVX" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"iWe" = ( +/obj/machinery/power/smes/engineering{ + charge = 2e+006 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"iWp" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"iWw" = ( +/obj/machinery/gibber, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/requests_console{ + department = "Kitchen"; + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"iWx" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"iWD" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/science/shuttle) +"iWG" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"iWK" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Chemistry Desk"; + req_access_txt = "5; 33" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"iWP" = ( +/obj/machinery/vending/cola/random, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"iWX" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/security/main) +"iXb" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"iXj" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"iXn" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"iXq" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/medical/medbay/aft) +"iXC" = ( +/obj/machinery/teleport/station, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"iXI" = ( +/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/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"iXQ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/requests_console{ + department = "Botany"; + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"iYh" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"iYn" = ( +/obj/effect/spawner/room/tenxfive, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"iYA" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"iYF" = ( +/obj/machinery/disposal/bin, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"iYM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/closed/wall, +/area/hallway/secondary/entry) +"iYQ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"iYX" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"iYZ" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"iZg" = ( +/obj/structure/table/wood, +/obj/item/coin/arcade_token, +/obj/machinery/newscaster{ + pixel_x = 28 + }, +/obj/item/storage/crayons, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"iZh" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"iZm" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"iZv" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"iZy" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"iZQ" = ( +/obj/machinery/chem_heater, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"iZT" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/gravity_generator) +"jad" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"jax" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/openspace, +/area/science/research) +"jaA" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/turf/open/space/basic, +/area/space) +"jaL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"jaR" = ( +/turf/closed/wall, +/area/hydroponics/garden/abandoned) +"jaZ" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) +"jbf" = ( +/obj/structure/table/glass, +/obj/item/storage/bag/plants/portaseeder, +/obj/item/storage/bag/plants/portaseeder, +/obj/item/reagent_containers/glass/bottle/nutrient/ez, +/obj/item/reagent_containers/glass/bottle/nutrient/ez, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/grass, +/area/hydroponics/garden) +"jbg" = ( +/obj/machinery/camera/autoname{ + dir = 8; + network = list("aisat") + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"jbz" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"jbB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/secondary) +"jbE" = ( +/obj/machinery/door/window{ + name = "Pet cage"; + req_one_access_txt = "12" + }, +/obj/machinery/door/window{ + dir = 1; + name = "Pet cage"; + req_one_access_txt = "12" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"jbM" = ( +/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/table/wood, +/obj/item/flashlight/lantern, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"jbO" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/chapel{ + dir = 6 + }, +/area/chapel/main/monastery) +"jcc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"jci" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port) +"jcz" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"jcK" = ( +/obj/machinery/nanite_programmer, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/circuit, +/area/science/nanite) +"jcV" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/carpet, +/area/security/prison) +"jdm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/quartermaster/exploration_prep) +"jdw" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/marker_beacon, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"jdx" = ( +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"jdy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) +"jdA" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"jdD" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Delivery Office"; + req_access_txt = "50" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"jdF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + 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/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"jdS" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"jdV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"jec" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/turf/open/space/basic, +/area/solar/port/fore) +"jer" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"jey" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"jeH" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Experimentation Chamber"; + req_access_txt = "8"; + security_level = 6 + }, +/turf/open/floor/plating, +/area/science/explab) +"jeN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"jfa" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white, +/turf/open/space/basic, +/area/solar/port/fore) +"jfe" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"jfh" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"jfo" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"jfq" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"jfN" = ( +/obj/machinery/vending/cigarette, +/obj/structure/noticeboard{ + pixel_y = 32 + }, +/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/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"jfW" = ( +/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/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/noslip/dark, +/area/hallway/secondary/service) +"jgk" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"jgx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"jgO" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"jgV" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/book/manual/wiki/plumbing, +/obj/item/construction/plumbing, +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"jgW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"jhc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/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/hallway/upper/primary/fore) +"jhq" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/relay) +"jhu" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"jhG" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "5; 33" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/medical/chemistry) +"jhK" = ( +/obj/machinery/computer/secure_data{ + dir = 8 + }, +/turf/open/floor/carpet/red, +/area/security/detectives_office) +"jhR" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/landmark/start/station_engineer, +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"jhY" = ( +/turf/closed/wall, +/area/medical/sleeper) +"jif" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"jik" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"jim" = ( +/obj/machinery/telecomms/processor/preset_exploration, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/relay) +"jiD" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) +"jiE" = ( +/obj/structure/chair/stool/bar, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"jiF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Medbay Break Room"; + req_access_txt = "5" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"jiI" = ( +/obj/structure/lattice, +/obj/item/stack/sheet/mineral/titanium{ + amount = 24 + }, +/turf/open/space/basic, +/area/space/nearstation) +"jiK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/warden) +"jiL" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"jiW" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"jja" = ( +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/turf/open/floor/engine/cult, +/area/library) +"jjf" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/science/misc_lab/range) +"jjo" = ( +/obj/machinery/disposal/deliveryChute{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"jjp" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"jjy" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/closet/secure_closet/chemical, +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"jjE" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"jjP" = ( +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = -30 + }, +/obj/item/reagent_containers/spray/cleaner, +/obj/structure/table/glass, +/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/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"jjQ" = ( +/obj/structure/rack{ + pixel_x = -2 + }, +/obj/effect/spawner/lootdrop/maintenance/three, +/turf/open/floor/wood, +/area/library) +"jjT" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/table/reinforced, +/obj/item/clothing/suit/straight_jacket, +/obj/item/clothing/mask/muzzle, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"jjY" = ( +/obj/machinery/computer/arcade, +/turf/open/floor/carpet, +/area/security/prison) +"jkc" = ( +/obj/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable, +/turf/open/floor/circuit/green, +/area/engine/supermatter) +"jkl" = ( +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"jkr" = ( +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery/aux) +"jkN" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/closed/wall/r_wall, +/area/science/mixing/chamber) +"jkP" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"jkR" = ( +/turf/open/floor/engine, +/area/science/explab) +"jkT" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"jkW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/landmark/event_spawn, +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"jkY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"jkZ" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, +/area/security/brig) +"jla" = ( +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"jlc" = ( +/obj/machinery/computer/prisoner/management, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"jle" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/park) +"jlh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxin_output, +/turf/open/floor/engine/plasma, +/area/engine/atmos) +"jlK" = ( +/obj/effect/landmark/start/research_director, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/hor) +"jlS" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"jlU" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"jlV" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"jmh" = ( +/obj/structure/bed/dogbed, +/obj/effect/spawner/lootdrop/ten_percent_girlfriend_spawner, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"jms" = ( +/obj/machinery/computer/libraryconsole/bookmanagement{ + pixel_y = 7 + }, +/obj/structure/table/wood, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/carpet/green, +/area/library) +"jmA" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/turf/open/space/basic, +/area/space) +"jmM" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"jmN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"jni" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_y = 3 + }, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"jnF" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"jnG" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"jnH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/door/airlock/public/glass{ + name = "Departures Lounge" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"jnI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/shower{ + dir = 1 + }, +/turf/open/floor/noslip/standard, +/area/engine/atmos) +"jnP" = ( +/turf/closed/wall, +/area/maintenance/starboard/central) +"jnU" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/machinery/anesthetic_machine, +/turf/open/floor/plasteel/white, +/area/medical/surgery/aux) +"joa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"joi" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"joB" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/air_input{ + dir = 1 + }, +/turf/open/floor/engine/air, +/area/engine/atmos) +"joD" = ( +/obj/effect/turf_decal/stripes/line, +/turf/closed/wall, +/area/engine/atmos) +"joE" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"joI" = ( +/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/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"joK" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = -1; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/maintenance/department/crew_quarters/dorms) +"joV" = ( +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 5 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"jps" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/grass, +/area/crew_quarters/park) +"jpH" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"jpK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/cmo) +"jpT" = ( +/obj/structure/rack{ + pixel_y = -3 + }, +/obj/effect/spawner/lootdrop/gloves, +/obj/effect/spawner/lootdrop/glowstick, +/obj/effect/spawner/lootdrop/gambling{ + pixel_y = 2 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/wood, +/area/library) +"jpX" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/security/prison) +"jqa" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"jqb" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"jqh" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/engine/engineering) +"jqs" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"jqH" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"jqJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"jqY" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 1; + name = "Mix to Gas" + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"jra" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"jrd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"jre" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"jrn" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"jru" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"jrw" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"jrE" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/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/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"jrL" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace, +/area/quartermaster/exploration_prep) +"jrN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"jrO" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"jrV" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Medbay Maintenance"; + req_access_txt = "5" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/turf/open/floor/plating, +/area/medical/storage) +"jsa" = ( +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = 32 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"jsj" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/turf/open/space/basic, +/area/space) +"jst" = ( +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/machinery/vending/autodrobe, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"jsv" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"jsD" = ( +/obj/machinery/advanced_airlock_controller/directional/south, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"jsE" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"jsM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = 27 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"jtf" = ( +/obj/machinery/camera/autoname{ + dir = 4; + network = list("aicore") + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"jtg" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"jtC" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/requests_console{ + pixel_x = -32 + }, +/turf/open/floor/grass, +/area/hallway/secondary/command) +"jtS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"jux" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"juz" = ( +/obj/structure/stairs{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"juE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"juI" = ( +/obj/structure/cable/yellow{ + 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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"juJ" = ( +/obj/structure/railing/corner, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"juS" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/turf/open/floor/carpet/blue, +/area/security/brig) +"juT" = ( +/obj/effect/decal/cleanable/blood/footprints, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"juX" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"juZ" = ( +/obj/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"jve" = ( +/turf/closed/wall/r_wall, +/area/maintenance/department/bridge) +"jvm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"jvJ" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"jvM" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"jvP" = ( +/obj/structure/dresser, +/obj/item/flashlight/lamp/green{ + pixel_x = -5; + pixel_y = 14 + }, +/obj/item/clothing/neck/petcollar{ + pixel_x = 4; + pixel_y = 8 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"jvT" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/solar/port/fore) +"jvU" = ( +/obj/machinery/vending/wallmed{ + pixel_x = -32 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_c) +"jvW" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"jvY" = ( +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"jwc" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/fyellow, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/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 = 1 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"jwm" = ( +/obj/machinery/conveyor{ + id = "recycling" + }, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"jwr" = ( +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/storage_shared) +"jwu" = ( +/obj/machinery/door/airlock/external{ + name = "Shuttle Construction Yard"; + req_access_txt = "32" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/science/shuttle) +"jwv" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/light, +/obj/machinery/vendor/mining, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"jwC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"jwJ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"jxc" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -8; + pixel_y = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/item/storage/box/beakers{ + pixel_x = 3; + pixel_y = 7 + }, +/obj/item/storage/box/syringes, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"jxN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"jxQ" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"jxS" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"jxV" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/airlock/research{ + name = "Science Shuttle Dock"; + req_access_txt = "8" + }, +/turf/open/floor/plating, +/area/science/shuttledock) +"jya" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"jyj" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/secondary) +"jyp" = ( +/obj/structure/chair, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"jyy" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"jyD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"jyQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"jyV" = ( +/obj/structure/cable/yellow{ + icon_state = "4-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 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"jzb" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engineering Foyer"; + req_one_access_txt = "32;19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable/yellow{ + 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/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"jzf" = ( +/obj/structure/table, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "RD's Desk"; + departmentType = 7; + pixel_x = -32 + }, +/obj/item/nanite_remote, +/obj/item/nanite_scanner, +/obj/item/paicard, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/crew_quarters/heads/hor) +"jzn" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"jzq" = ( +/turf/closed/wall, +/area/hallway/upper/primary/port) +"jzD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/effect/mapping_helpers/dead_body_placer{ + bodycount = 1 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"jzE" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/openspace, +/area/crew_quarters/bar) +"jzP" = ( +/obj/effect/spawner/room/threexthree, +/turf/open/floor/plating, +/area/maintenance/port/central) +"jzU" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"jzZ" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"jAf" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"jAi" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"jAr" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port) +"jAy" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/obj/machinery/telecomms/processor/preset_three, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/server) +"jAA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"jAI" = ( +/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{ + dir = 2 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/medical) +"jAV" = ( +/obj/machinery/recharger{ + pixel_y = 3 + }, +/obj/structure/table/wood, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"jBb" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/stripes/end, +/obj/machinery/requests_console{ + department = "Tech Storage"; + pixel_y = -32 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"jBl" = ( +/turf/open/floor/plating, +/area/maintenance/disposal) +"jBs" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"jBt" = ( +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"jBw" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 4 + }, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/plasteel, +/area/engine/atmos) +"jBE" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"jBO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"jBS" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor{ + id = "chapelgun"; + name = "Chapel Launcher Door" + }, +/turf/open/floor/plating, +/area/chapel/office) +"jBV" = ( +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"jBX" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"jCb" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"jCn" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"jCp" = ( +/obj/structure/window/reinforced/spawner{ + 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/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/transit_tube/station/reverse/flipped{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"jCr" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/disposal/bin, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"jCX" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"jCY" = ( +/obj/structure/frame/machine, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"jDb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/engine/atmos) +"jDe" = ( +/obj/structure/dresser, +/obj/item/flashlight/lamp/green{ + pixel_x = -5; + pixel_y = 14 + }, +/turf/open/floor/carpet/orange, +/area/quartermaster/qm) +"jDr" = ( +/obj/structure/window/reinforced/spawner, +/turf/open/space/basic, +/area/space) +"jDB" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/cmo) +"jDD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"jDK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"jDP" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/gloves, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/quartermaster/storage) +"jDV" = ( +/obj/structure/table/wood, +/obj/item/radio/intercom{ + name = "prosecution intercom" + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"jEa" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"jEh" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"jEm" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"jEs" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/obj/structure/transit_tube/curved/flipped{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/bridge) +"jEu" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/chem_heater, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"jEx" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"jEE" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"jEO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"jET" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"jEW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"jFm" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/carpet/cyan, +/area/crew_quarters/heads/cmo) +"jFw" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"jFD" = ( +/obj/machinery/gateway{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"jFG" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/mineral/copper{ + amount = 5 + }, +/obj/machinery/door/window/westleft{ + dir = 1; + name = "Cargo Window"; + pixel_y = 1; + req_access_txt = "31" + }, +/obj/structure/window/reinforced{ + dir = 8; + pixel_y = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"jFP" = ( +/obj/machinery/status_display/evac{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"jGq" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/engineering_construction, +/obj/item/construction/rcd, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/requests_console{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"jGF" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"jGG" = ( +/obj/structure/table/wood, +/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/courtroom) +"jGI" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"jGL" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/landmark/start/security_officer, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/main) +"jGR" = ( +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/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/hallway/upper/secondary/entry) +"jGX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 22 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"jHh" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"jHk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/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/primary/fore) +"jHu" = ( +/obj/structure/stairs{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"jHy" = ( +/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/stripes/line, +/obj/effect/turf_decal/caution{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"jHQ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"jHU" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"jHW" = ( +/obj/structure/railing/corner, +/turf/open/openspace, +/area/medical/medbay/balcony) +"jIf" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"jIo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"jIr" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/security/brig) +"jIW" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"jIX" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"jJr" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"jJt" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"jJJ" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"jJQ" = ( +/obj/structure/showcase/cyborg/old{ + dir = 4; + pixel_x = -11; + pixel_y = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"jJW" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/science) +"jJY" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"jKf" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/requests_console{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"jKr" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/space/basic, +/area/space/nearstation) +"jKs" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"jKt" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"jKw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"jKB" = ( +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/wood, +/area/maintenance/port) +"jKC" = ( +/obj/structure/chair, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"jKF" = ( +/turf/closed/wall, +/area/science/test_area) +"jKR" = ( +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"jKY" = ( +/obj/structure/closet/emcloset/anchored, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/hallway/primary/fore) +"jLi" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"jLm" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"jLz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"jLW" = ( +/obj/structure/barricade/sandbags, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"jMm" = ( +/turf/open/floor/plasteel/white, +/area/science/research) +"jMn" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"jMt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"jMv" = ( +/obj/structure/rack, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/item/circuitboard/computer/aiupload, +/obj/item/circuitboard/computer/apc_control{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"jMw" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"jMx" = ( +/obj/structure/chair/stool/bar, +/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/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"jMK" = ( +/obj/structure/table/glass, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/clothing/neck/stethoscope, +/obj/item/clothing/neck/stethoscope, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + 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/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/storage) +"jML" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"jMW" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"jNd" = ( +/obj/effect/turf_decal/tile/purple, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"jNm" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"jNn" = ( +/obj/machinery/newscaster/security_unit{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/computer/security/hos{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = -5; + pixel_y = -25 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"jNq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/landmark/secequipment, +/obj/effect/turf_decal/delivery, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/security/main) +"jNu" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/delivery, +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/science/storage) +"jNv" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/flasher{ + id = "aicore"; + pixel_y = 36; + range = 2 + }, +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"jNy" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/fyellow, +/obj/item/wirecutters, +/obj/item/stack/cable_coil/red, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"jNB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/deck_relay, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"jOj" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"jOp" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"jOr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/open/floor/plating, +/area/hallway/primary/fore) +"jOx" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"jOC" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/stairs{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"jOG" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"jOH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"jOI" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/main) +"jOJ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"jOO" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/paicard, +/obj/item/aicard, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"jPc" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"jPl" = ( +/obj/machinery/door/window/westleft{ + dir = 1; + name = "Monkey Pen"; + pixel_y = 2; + req_access_txt = "9" + }, +/turf/open/floor/plasteel/freezer, +/area/medical/genetics) +"jPo" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"jPz" = ( +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"jPA" = ( +/obj/machinery/requests_console{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"jPP" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"jPT" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"jQa" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"jQe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"jQj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"jQp" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"jQE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"jQF" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"jQI" = ( +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"jQN" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/table/glass, +/obj/item/storage/box/bodybags, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/medical/cryo) +"jQR" = ( +/obj/machinery/power/solar_control{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"jQW" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"jRl" = ( +/obj/machinery/suit_storage_unit, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/plating, +/area/maintenance/fore) +"jRJ" = ( +/turf/closed/wall/r_wall, +/area/medical/surgery) +"jRN" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"jSf" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"jSk" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"jSn" = ( +/obj/effect/turf_decal/tile/red, +/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/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"jSq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"jSu" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"jSv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/closet/firecloset/full, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"jSF" = ( +/turf/closed/wall, +/area/crew_quarters/cryopods) +"jSL" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"jSP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/upper/fore) +"jSU" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"jSW" = ( +/obj/structure/sign/poster/official/obey{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"jTm" = ( +/obj/structure/chair/comfy/beige{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet, +/area/hallway/primary/fore) +"jTq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/bridge) +"jTs" = ( +/turf/open/floor/plasteel, +/area/security/courtroom) +"jTB" = ( +/turf/closed/wall, +/area/hydroponics/garden) +"jTT" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"jTX" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/solar/port/aft) +"jTY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"jUd" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/maintenance/port/central) +"jUl" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/tcommsat/server) +"jUn" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"jUp" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/beacon, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"jUw" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/holopad{ + pixel_y = 16 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/genetics/cloning) +"jUz" = ( +/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_atmos{ + pixel_x = -23; + pixel_y = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"jUD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"jUG" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/upper/primary/fore) +"jUL" = ( +/turf/closed/wall, +/area/quartermaster/exploration_prep) +"jUR" = ( +/obj/structure/table/reinforced, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/hand_labeler, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"jUY" = ( +/obj/machinery/vending/hydroseeds, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/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/light{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"jVi" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/newscaster{ + pixel_x = 32 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"jVl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/tank_dispenser/oxygen, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"jVn" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"jVD" = ( +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"jVF" = ( +/obj/structure/cable/yellow{ + 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 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"jVI" = ( +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"jVK" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/bridge) +"jVR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"jWe" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"jWf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/engine/engine_smes) +"jWm" = ( +/turf/closed/wall, +/area/medical/genetics/cloning) +"jWo" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/turf/open/floor/plating, +/area/hallway/upper/secondary/entry) +"jWB" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"jWK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"jWM" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"jWZ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"jXK" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Head of Security"; + req_access_txt = "58" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hos) +"jYd" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/security/checkpoint/supply) +"jYn" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/vending/wardrobe/robo_wardrobe{ + pixel_x = 3 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"jYo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "virology"; + name = "Virology Lockdown Shutters" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/virology) +"jYr" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"jYs" = ( +/turf/open/floor/wood, +/area/quartermaster/storage) +"jYu" = ( +/turf/closed/wall, +/area/maintenance/department/science/central) +"jYC" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/landmark/start/exploration, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"jYN" = ( +/obj/structure/cable/yellow, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/table/reinforced, +/obj/item/circuitboard/computer/crew{ + pixel_x = -12; + pixel_y = 7 + }, +/obj/item/circuitboard/computer/med_data{ + pixel_x = -13; + pixel_y = 5 + }, +/obj/item/circuitboard/computer/operating{ + pixel_x = -14; + pixel_y = 3 + }, +/obj/item/circuitboard/computer/pandemic{ + pixel_x = -15; + pixel_y = 1 + }, +/obj/item/circuitboard/computer/scan_consolenew{ + pixel_x = -16; + pixel_y = -1 + }, +/obj/item/circuitboard/machine/chem_dispenser{ + pixel_x = 8; + pixel_y = 7 + }, +/obj/item/circuitboard/machine/chem_dispenser/botany{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/item/circuitboard/machine/chem_heater{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/circuitboard/machine/chem_master{ + pixel_x = 5 + }, +/obj/item/circuitboard/machine/cryo_tube{ + pixel_x = 4; + pixel_y = -2 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"jYP" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/holopad, +/obj/effect/landmark/event_spawn, +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"jYQ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"jYR" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/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/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"jYV" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"jYW" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"jZb" = ( +/obj/structure/table/optable, +/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/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"jZg" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"jZh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"jZl" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"jZo" = ( +/obj/machinery/advanced_airlock_controller/directional/south, +/obj/machinery/atmospherics/components/binary/dp_vent_pump, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"jZs" = ( +/turf/open/floor/plasteel/dark, +/area/security/brig) +"jZt" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"jZS" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"jZY" = ( +/obj/structure/transit_tube/station/reverse{ + dir = 8 + }, +/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/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/transit_tube_pod{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/medbay/balcony) +"kaa" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/dorms) +"kag" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"kai" = ( +/obj/structure/rack, +/obj/effect/turf_decal/delivery, +/obj/item/gun/ballistic/automatic/wt550/rubber_loaded{ + pixel_y = 3 + }, +/obj/item/gun/ballistic/automatic/wt550/rubber_loaded, +/obj/item/gun/ballistic/automatic/wt550/rubber_loaded{ + pixel_y = -4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"kaq" = ( +/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/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"kau" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"kaH" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"kaK" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"kaP" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/hop) +"kaQ" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"kaS" = ( +/obj/machinery/vending/custom{ + pixel_y = -1 + }, +/turf/open/floor/wood, +/area/library) +"kaW" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"kaZ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/radio/intercom{ + dir = 4; + pixel_y = 29 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"kba" = ( +/obj/machinery/door/window/southleft{ + dir = 1; + name = "Mass Driver Door"; + req_access_txt = "7" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"kbj" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/machinery/door/window/brigdoor{ + dir = 1; + name = "Brig Control Desk"; + req_one_access_txt = "1;4" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/security/main) +"kbq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"kbL" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"kbO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/airlock/public/glass, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"kbP" = ( +/obj/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"kbS" = ( +/obj/structure/railing, +/turf/open/openspace, +/area/maintenance/upper/central) +"kbT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/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/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"kbZ" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"kce" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/button/door{ + id = "armourydoors"; + name = "Armory Blast Doors"; + pixel_x = 26; + pixel_y = -26; + req_access_txt = "3" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"kcg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"kci" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"kco" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"kcz" = ( +/turf/closed/wall, +/area/hallway/secondary/exit) +"kcE" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"kcQ" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/carpet/blue, +/area/security/brig) +"kcV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload) +"kdf" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/vacant_room/office) +"kdg" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"kds" = ( +/turf/open/floor/engine/plasma, +/area/engine/atmos) +"kdM" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/closet/secure_closet/miner, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"kea" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"kec" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/science/research) +"keR" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/grass, +/area/crew_quarters/park) +"keS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"keZ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"kfa" = ( +/turf/closed/wall, +/area/crew_quarters/kitchen) +"kff" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"kfs" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/maintenance/department/crew_quarters/dorms) +"kfy" = ( +/obj/structure/railing/corner, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"kfA" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"kfF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"kfH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/cryo) +"kgf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"kgj" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/gun/syringe{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/item/reagent_containers/glass/bottle/morphine, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"kgm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"kgu" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"kgx" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"kgz" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/junction, +/turf/open/floor/plating, +/area/maintenance/port/central) +"kgF" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/openspace, +/area/quartermaster/exploration_dock) +"kgG" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"kgZ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"kha" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/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/primary/fore) +"khc" = ( +/obj/machinery/door/poddoor/shutters{ + id = "Skynet_launch"; + name = "Mech Bay" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/science/robotics) +"khi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"khm" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/circuit/green, +/area/security/nuke_storage) +"khs" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"khw" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"khU" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"khY" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/caution{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"kil" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"kio" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"kiI" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"kiL" = ( +/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/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"kiM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"kiP" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"kjc" = ( +/obj/structure/window/reinforced, +/obj/structure/table/glass, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"kjl" = ( +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 5 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"kjx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"kjD" = ( +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"kjL" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/fore) +"kjO" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"kjQ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kjU" = ( +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/AIsatextAP) +"kjV" = ( +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"kjX" = ( +/obj/structure/railing, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"kjY" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/fore) +"kki" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/research{ + id_tag = "ResearchExt"; + name = "Research Division"; + req_one_access_txt = "47" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"kkk" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/obj/structure/transit_tube/station/reverse/flipped{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/transit_tube_pod{ + dir = 4 + }, +/turf/open/floor/plating, +/area/bridge) +"kkq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/medical/medbay/aft) +"kks" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"kkI" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm4"; + name = "Chapel Cabin"; + req_access_txt = "22" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"kkK" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/landmark/start/station_engineer, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"kkP" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/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 = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"kkR" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable/yellow{ + 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 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"kla" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/openspace, +/area/engine/engine_room) +"klc" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Exploration Dock"; + departmentType = 2; + pixel_y = -32 + }, +/turf/open/floor/plasteel/dark, +/area/science/shuttledock) +"klm" = ( +/obj/structure/sign/warning/vacuum{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/components/unary/tank/air, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"klq" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 16 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"klr" = ( +/obj/machinery/vending/cart{ + req_access_txt = "57" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/hop) +"klz" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 5 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"klD" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel/dark, +/area/security/main) +"klH" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 2 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"klK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"klZ" = ( +/obj/machinery/light/small, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"kmi" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor/window, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/shuttledock) +"kmk" = ( +/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/brown, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"kmU" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"knc" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/turretid{ + control_area = "/area/ai_monitored/turret_protected/ai_upload"; + name = "Antechamber Turret Control"; + pixel_x = 32; + pixel_y = 32; + req_access = null; + req_access_txt = "65" + }, +/obj/effect/turf_decal/caution{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"knd" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"kne" = ( +/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_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"kng" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"knp" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Checkpoint"; + req_access_txt = "1" + }, +/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/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/customs) +"kns" = ( +/obj/effect/spawner/room/tenxfive, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"knR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/engine, +/area/engine/engine_room) +"knT" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/regular, +/obj/effect/turf_decal/tile/blue, +/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/machinery/newscaster{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"knU" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"knV" = ( +/obj/structure/flora/rock/jungle, +/turf/open/floor/grass, +/area/crew_quarters/park) +"kow" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"koC" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"koI" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"koN" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"koW" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "63" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/checkpoint/medical) +"kpb" = ( +/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/structure/table, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/machinery/microwave{ + pixel_x = -1; + pixel_y = 6 + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"kpl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -8 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = -1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"kpq" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/sign/departments/minsky/medical/medical2{ + pixel_x = 32 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"kpA" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/hallway/upper/secondary/service) +"kpG" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/obj/structure/lattice/catwalk, +/turf/open/openspace/airless, +/area/space/nearstation) +"kpJ" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/structure/flora/ausbushes/lavendergrass, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/port) +"kpP" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"kpR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/department/science) +"kpU" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"kpZ" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/landmark/start/quartermaster, +/obj/machinery/light, +/turf/open/floor/carpet/orange, +/area/quartermaster/qm) +"kqa" = ( +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"kqf" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"kqm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"kqs" = ( +/obj/machinery/flasher{ + id = "aicore"; + pixel_x = 26; + range = 2 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"kqE" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"kqF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"kqH" = ( +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"kqQ" = ( +/obj/machinery/computer/arcade{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"kqS" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/fore) +"kqW" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"krb" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"krj" = ( +/obj/machinery/modular_fabricator/exosuit_fab, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"krr" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, +/area/gateway) +"krx" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space/basic, +/area/space) +"krF" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + sortType = 30 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"krJ" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "10" + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"krS" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"krV" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"kse" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/science/shuttledock) +"ksk" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/turf/open/floor/carpet, +/area/hallway/primary/fore) +"ksm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"ksr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"ksN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"ksT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"kta" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/science/research) +"ktc" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/flasher/portable, +/obj/item/wrench, +/turf/open/floor/plasteel, +/area/security/warden) +"kti" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"ktj" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/dark, +/area/bridge) +"ktn" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ktq" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/landmark/start/janitor, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow, +/obj/machinery/disposal/bin{ + pixel_x = -6 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/janitor) +"kud" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"kuh" = ( +/obj/machinery/door/airlock/command{ + name = "Gateway Mission Control"; + req_access_txt = "62" + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"kul" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/upper/primary/port) +"kum" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law, +/turf/open/floor/wood, +/area/vacant_room/office) +"kut" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"kuv" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port) +"kuE" = ( +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"kuG" = ( +/obj/docking_port/stationary/public_mining_dock, +/turf/open/floor/plating, +/area/construction/mining/aux_base) +"kuH" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"kuR" = ( +/obj/machinery/hydroponics/constructable, +/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/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/seeds/tea, +/turf/open/floor/plasteel, +/area/security/prison) +"kuU" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"kvl" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"kvu" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"kvx" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"kvE" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/clothing/under/rank/prisoner, +/obj/item/clothing/under/rank/prisoner, +/obj/item/flashlight, +/obj/item/flashlight, +/obj/item/flashlight, +/obj/item/restraints/handcuffs/cable/zipties, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"kvG" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"kvJ" = ( +/obj/machinery/telecomms/server/presets/service, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/server) +"kvK" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"kvN" = ( +/obj/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"kwh" = ( +/obj/machinery/atmospherics/pipe/manifold4w/general/visible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"kwm" = ( +/obj/machinery/vending/games{ + pixel_y = -1 + }, +/turf/open/floor/wood, +/area/library) +"kwo" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/holopad{ + pixel_y = 16 + }, +/obj/effect/turf_decal/box{ + pixel_y = 16 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"kwG" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"kwJ" = ( +/obj/machinery/disposal/bin{ + pixel_y = 3 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/carpet/cyan, +/area/crew_quarters/heads/cmo) +"kwU" = ( +/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" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"kxa" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/suit_storage_unit/engine, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"kxf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat/foyer) +"kxt" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"kxw" = ( +/obj/structure/chair/comfy/black, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"kxz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"kxH" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/bridge) +"kxR" = ( +/obj/structure/transit_tube/diagonal, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"kxX" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"kyb" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"kyd" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/closed/wall, +/area/engine/engineering) +"kyt" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/landmark/start/botanist, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"kyu" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/science/shuttle) +"kyv" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"kyw" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"kyx" = ( +/obj/docking_port/stationary{ + dwidth = 5; + height = 7; + id = "supply_home"; + name = "Cargo Bay"; + width = 12 + }, +/turf/open/space/basic, +/area/space) +"kyN" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/carpet/purple, +/area/vacant_room/office) +"kyT" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"kyZ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"kzc" = ( +/obj/machinery/suit_storage_unit/atmos, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/atmos) +"kze" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"kzk" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "permabolt2"; + name = "Cell 1" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"kzm" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"kzI" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/landmark/start/scientist, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plasteel/white, +/area/science/explab) +"kzJ" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"kzL" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/barricade/wooden, +/obj/structure/barricade/wooden/crude, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"kzO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"kAe" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/science/research) +"kAm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/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/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"kAt" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"kAz" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"kAN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"kAO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery/aux) +"kAR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"kBi" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/engine/atmos) +"kBu" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"kBw" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/techstorage/engineering, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"kBH" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"kBV" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"kBX" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"kBZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"kCb" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"kCg" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"kCi" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"kCy" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"kCE" = ( +/obj/machinery/door/poddoor/shutters{ + id = "evashutters"; + name = "E.V.A. Storage Shutters" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"kCT" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"kCV" = ( +/obj/structure/closet/secure_closet/engineering_chief, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"kDd" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/fore) +"kDe" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"kDl" = ( +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"kDz" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"kDD" = ( +/turf/open/space/basic, +/area/space) +"kDI" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/security/brig) +"kDM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"kDN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"kDQ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/storage/firstaid, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"kDT" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"kDW" = ( +/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/effect/turf_decal/tile, +/obj/structure/bed/dogbed/runtime, +/mob/living/simple_animal/pet/cat/Runtime, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"kDX" = ( +/obj/machinery/requests_console{ + department = "Arrivals Dock"; + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"kEq" = ( +/obj/machinery/power/tracker, +/obj/structure/cable/white, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/starboard/aft) +"kEC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"kEI" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"kEQ" = ( +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/holodeck/rec_center) +"kFf" = ( +/obj/structure/closet/secure_closet/miner, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"kFm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"kFt" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"kFu" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "virology"; + name = "Virology Lockdown Shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/virology) +"kFy" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating/asteroid, +/area/maintenance/port) +"kFD" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/obj/machinery/advanced_airlock_controller/directional/west, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"kFF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"kFV" = ( +/turf/open/floor/engine/co2, +/area/engine/atmos) +"kFY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"kGd" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/bar) +"kGg" = ( +/obj/machinery/biogenerator, +/turf/open/floor/grass, +/area/hydroponics/garden) +"kGi" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"kGk" = ( +/obj/structure/table/reinforced, +/obj/item/nanite_remote, +/obj/item/nanite_scanner, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"kGr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics_shutters"; + name = "robotics shutters" + }, +/turf/open/floor/plating, +/area/science/robotics) +"kGt" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"kGu" = ( +/obj/structure/chair, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"kGw" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/reagent_containers/syringe/used, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"kGy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"kGA" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"kGC" = ( +/turf/closed/wall, +/area/bridge) +"kGJ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kGP" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"kGR" = ( +/obj/structure/showcase/cyborg/old{ + dir = 8; + pixel_x = 10; + pixel_y = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"kGV" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/warden) +"kHh" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"kHk" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"kHp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Cargo Maintenance"; + req_access_txt = "31" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"kHx" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"kHA" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/item/kirbyplants/random, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"kHI" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"kHK" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"kHV" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/storage) +"kIj" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"kIo" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"kIA" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"kIB" = ( +/turf/open/floor/engine/vacuum, +/area/science/mixing/chamber) +"kII" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/preopen{ + id = "isola"; + name = "privacy shutters" + }, +/turf/open/floor/plating, +/area/medical/patients_rooms/room_a) +"kIU" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"kIY" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"kJl" = ( +/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/vehicle/ridden/wheelchair{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"kJr" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"kJV" = ( +/obj/machinery/power/tracker, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/port/fore) +"kKb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"kKd" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/upper/primary/port) +"kKi" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"kKz" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/smartfridge/disks, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/obj/item/storage/box/disks_plantgene, +/turf/open/floor/plasteel, +/area/hydroponics) +"kKC" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"kKT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/medical/medbay/aft) +"kKU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"kLo" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"kLr" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"kLt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"kLu" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"kLM" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"kLU" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"kMt" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"kMz" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"kMA" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/sign/departments/minsky/engineering/telecommmunications{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"kMN" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/structure/bed/roller, +/mob/living/carbon/monkey, +/turf/open/floor/plasteel/freezer, +/area/medical/genetics) +"kMS" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"kMT" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/port) +"kNm" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/maintenance/starboard/central) +"kNr" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"kNz" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Storage"; + req_access_txt = "5" + }, +/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/mapping_helpers/airlock/unres, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/medical/storage) +"kNS" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/noslip/white, +/area/science/research) +"kNY" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/sign/poster/random{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"kOc" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"kOh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"kOE" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"kOQ" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/obj/structure/closet/secure_closet/security, +/obj/item/flashlight/glowstick/red, +/obj/item/flashlight/glowstick/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/customs) +"kPv" = ( +/obj/machinery/door/airlock/glass{ + name = "Bar"; + req_access_txt = "25" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"kPx" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/sink{ + dir = 4; + pixel_x = 12 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"kPy" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"kPz" = ( +/obj/structure/table/wood, +/obj/item/storage/firstaid, +/obj/item/storage/belt/medical, +/obj/machinery/light, +/turf/open/floor/carpet/cyan, +/area/crew_quarters/heads/cmo) +"kQb" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/turf/open/floor/plating, +/area/maintenance/upper/fore) +"kQo" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"kQw" = ( +/obj/structure/flora/ausbushes/sunnybush, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"kRc" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"kRy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"kRI" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"kRJ" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/space/basic, +/area/space/nearstation) +"kSf" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"kSj" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"kSu" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"kSL" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"kSN" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"kTc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/aisat/foyer) +"kTd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/chair/sofa/right{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"kTi" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/engine/atmos) +"kTs" = ( +/turf/closed/wall/r_wall, +/area/maintenance/department/science) +"kTw" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"kTR" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"kUi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"kUj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/security/main) +"kUr" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"kUA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"kUI" = ( +/obj/item/radio/intercom{ + pixel_x = 27 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"kUO" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/structure/table/glass, +/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/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"kUX" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/research) +"kVc" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/maintenance/fore) +"kVk" = ( +/obj/structure/disposalpipe/trunk/multiz{ + dir = 2 + }, +/turf/closed/wall, +/area/crew_quarters/kitchen/coldroom) +"kVq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"kVw" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/plating, +/area/engine/atmos) +"kVy" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/storage/secure/briefcase, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/vacant_room/commissary) +"kVD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"kVM" = ( +/turf/open/openspace/airless, +/area/ai_monitored/turret_protected/ai_upload) +"kVU" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/pickaxe/mini, +/obj/item/pickaxe/mini, +/obj/item/storage/bag/ore, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"kWa" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"kWf" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"kWj" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/turf/open/space/basic, +/area/solar/port/fore) +"kWs" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = -3 + }, +/obj/structure/rack, +/obj/item/screwdriver, +/obj/item/stack/cable_coil/red, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"kWt" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/pen/red{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"kWz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"kWD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/item/stack/sheet/cardboard{ + amount = 10 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"kXe" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/electronics/airlock, +/obj/item/electronics/airlock, +/obj/item/electronics/airlock, +/obj/item/electronics/airlock, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/assault_pod/mining, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) +"kXg" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"kXs" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Recreation Park" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/park) +"kXz" = ( +/obj/machinery/computer/bounty{ + dir = 8 + }, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "qmoffice"; + name = "Quartermaster's Office Control"; + normaldoorcontrol = 0; + pixel_x = 29; + pixel_y = 28 + }, +/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/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"kXM" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"kXO" = ( +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"kXR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/computer/card, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"kXT" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, +/obj/machinery/light, +/turf/open/floor/engine, +/area/engine/engine_room) +"kXX" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"kXY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/security/main) +"kYb" = ( +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/water/air, +/area/crew_quarters/park) +"kYi" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) +"kYr" = ( +/turf/closed/wall/r_wall, +/area/tcommsat/computer) +"kYJ" = ( +/obj/effect/spawner/structure/window, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hydroponics) +"kYN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/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/primary/fore) +"kYP" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"kYQ" = ( +/obj/machinery/door/poddoor{ + id = "QMLoaddoor"; + name = "Supply Dock Loading Door" + }, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/quartermaster/storage) +"kYU" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Xenobiology Chamber Maintenance"; + req_one_access_txt = "55" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plating, +/area/science/xenobiology) +"kZk" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"kZn" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"kZK" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"kZZ" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/chief) +"lak" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/door/airlock/public/glass{ + name = "Departures Lounge" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"lal" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"laz" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"laA" = ( +/obj/item/crowbar/red, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"laC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"laD" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"laQ" = ( +/turf/closed/wall, +/area/security/checkpoint/science) +"laT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"laU" = ( +/obj/machinery/camera/autoname, +/obj/machinery/airalarm/directional/north, +/obj/machinery/suit_storage_unit, +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"lbj" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"lbl" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/item/extinguisher, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"lbJ" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"lbS" = ( +/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/dark, +/area/maintenance/starboard/secondary) +"lbZ" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"lcn" = ( +/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/dark, +/area/security/courtroom) +"lcD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"lcH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/button/door{ + id = "aicore"; + name = "AI Core Shutters"; + pixel_x = 26; + pixel_y = -26; + req_access_txt = "65" + }, +/obj/machinery/button/door{ + id = "aicoremain"; + name = "AI Core Lockdown"; + pixel_x = 40; + pixel_y = -26; + req_access_txt = "65" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"lcI" = ( +/obj/structure/chair/comfy/black, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"lcP" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ldb" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/mixing) +"ldl" = ( +/obj/machinery/airalarm/directional/east, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"ldq" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"ldA" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ldB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/closet/l3closet/scientist, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"ldI" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/robotics) +"ldQ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"lef" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal) +"leL" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"leU" = ( +/obj/machinery/conveyor/inverted{ + dir = 9; + id = "QMLoad" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"lfc" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/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, +/area/hallway/primary/fore) +"lfv" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"lfw" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation A"; + req_access_txt = "39" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"lfx" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"lfB" = ( +/turf/open/floor/plasteel, +/area/security/brig) +"lfH" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel/dark, +/area/gateway) +"lfL" = ( +/obj/machinery/holopad{ + pixel_y = 16 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hydroponics) +"lfT" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"lfW" = ( +/obj/structure/chair/comfy/black, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"lga" = ( +/obj/effect/decal/cleanable/glass, +/obj/structure/sign/poster/contraband/missing_gloves{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"lgk" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/bananalamp{ + pixel_y = 6 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/theatre) +"lgm" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"lgp" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/science/research) +"lgs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/main) +"lgz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"lgD" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"lgJ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"lgN" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/hor) +"lgZ" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"lhd" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"lhh" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "hop"; + name = "privacy shutters" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/research) +"lhi" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"lhx" = ( +/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/light{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"lhC" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"lhD" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"lhE" = ( +/obj/structure/table/wood, +/obj/item/book/random, +/obj/item/book/random, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"lhF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"lhH" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"lhP" = ( +/obj/structure/chair/office, +/obj/effect/landmark/start/head_of_personnel, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "hop"; + name = "Privacy Shutters"; + normaldoorcontrol = 0; + pixel_x = 27; + pixel_y = -26 + }, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "hopqueue"; + name = "Queue Shutters"; + normaldoorcontrol = 0; + pixel_x = 27; + pixel_y = -37 + }, +/obj/machinery/button/flasher{ + id = "hopflash"; + pixel_x = 39; + pixel_y = -37 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/hop) +"lhW" = ( +/obj/structure/rack, +/obj/item/gun/energy/disabler{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/energy/disabler, +/obj/item/gun/energy/disabler{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/red, +/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/dark, +/area/ai_monitored/security/armory) +"lhX" = ( +/obj/machinery/biogenerator, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hydroponics) +"lhZ" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Arrivals Hallway"; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"lia" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"lij" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/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/hallway/primary/central) +"lio" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/item/book/manual/wiki/cooking_to_serve_man, +/obj/item/reagent_containers/food/condiment/enzyme{ + pixel_y = 5 + }, +/obj/item/reagent_containers/food/condiment/saltshaker, +/obj/item/reagent_containers/food/condiment/sugar, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"liy" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"liB" = ( +/turf/closed/wall, +/area/library) +"liL" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"liO" = ( +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"liQ" = ( +/obj/machinery/computer/atmos_control/tank/air_tank{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"liS" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"ljc" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ljd" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"ljg" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ljk" = ( +/obj/structure/bed, +/obj/item/bedsheet/ce, +/obj/effect/landmark/start/chief_engineer, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"ljr" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"ljB" = ( +/obj/structure/sign/barsign{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"ljE" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"ljZ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"lkd" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"lkp" = ( +/obj/machinery/computer/shuttle_flight/custom_shuttle{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"lkr" = ( +/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/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"lkz" = ( +/obj/machinery/holopad, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"lkH" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/item/gun/energy/laser, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"lkR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/closet/crate/science, +/obj/item/shuttle_creator, +/turf/open/floor/plasteel/dark, +/area/science/shuttledock) +"lkT" = ( +/obj/effect/turf_decal/tile/neutral{ + 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/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"llg" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/landmark/start/scientist, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"llm" = ( +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"lln" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"llB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"llC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/computer/card/minor/cmo{ + dir = 4 + }, +/obj/effect/turf_decal/tile, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"llN" = ( +/obj/effect/spawner/room/fivexthree, +/turf/template_noop, +/area/maintenance/department/crew_quarters/dorms) +"llQ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"llZ" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel/dark, +/area/gateway) +"lma" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"lmb" = ( +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"lme" = ( +/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/white, +/area/medical/virology) +"lmf" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/security{ + name = "Security Post - Engineering"; + req_access_txt = "63" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/engineering) +"lmh" = ( +/turf/closed/wall/r_wall, +/area/maintenance/upper/fore) +"lmn" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"lmr" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"lmP" = ( +/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/stripes/line, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"lmS" = ( +/obj/effect/spawner/structure/window, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/storage/tools) +"lmX" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/telecomms/hub/preset, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/server) +"lnj" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal) +"lno" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/requests_console{ + pixel_x = 32 + }, +/obj/machinery/modular_fabricator/component_printer, +/turf/open/floor/plasteel, +/area/science/lab) +"lnx" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lny" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"lnE" = ( +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"lnF" = ( +/obj/structure/marker_beacon, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"lnU" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"lod" = ( +/obj/machinery/light/small, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/secondary) +"log" = ( +/obj/machinery/smartfridge/chemistry/preloaded, +/turf/closed/wall, +/area/medical/chemistry) +"lov" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"lox" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + dir = 4; + freq = 1400; + location = "Cargo Bay" + }, +/obj/structure/plasticflaps/opaque, +/turf/open/floor/plasteel, +/area/maintenance/starboard/fore) +"loD" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/closet/crate/freezer/blood, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"loE" = ( +/obj/machinery/telecomms/receiver/preset_exploration, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/relay) +"loR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"loU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"loZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/stairs/medium{ + dir = 1 + }, +/area/hallway/secondary/service) +"lpb" = ( +/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 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"lpr" = ( +/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/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"lps" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"lpC" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Expansion Director's Office"; + req_access_txt = "12" + }, +/obj/structure/barricade/wooden/crude, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"lpM" = ( +/obj/structure/mirror{ + pixel_y = -32 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 12 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"lpN" = ( +/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/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"lpO" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"lpV" = ( +/obj/structure/sign/warning/vacuum/external, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/science/shuttle) +"lqa" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/solar/port/aft) +"lqv" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"lqw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"lqA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/holopad{ + pixel_y = 16 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"lqQ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"lqV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Mining Dock Airlock"; + req_access_txt = "48" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"lqY" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"lra" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"lrs" = ( +/obj/structure/rack, +/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/effect/turf_decal/delivery, +/obj/item/storage/lockbox/loyalty, +/obj/item/implantcase/tracking, +/obj/item/implantcase/chem, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"lrE" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + 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/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"lrG" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"lrL" = ( +/obj/structure/table/reinforced, +/obj/item/stock_parts/cell/high{ + pixel_x = 1 + }, +/obj/item/stock_parts/cell/high{ + pixel_x = 3; + pixel_y = -6 + }, +/obj/item/stock_parts/cell/high{ + pixel_x = -3; + pixel_y = -4 + }, +/obj/item/stock_parts/micro_laser/high, +/obj/item/stock_parts/micro_laser/high, +/obj/item/stock_parts/micro_laser/high{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/stock_parts/micro_laser/high{ + pixel_x = 4 + }, +/obj/item/stock_parts/scanning_module, +/obj/item/stock_parts/scanning_module, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"lrR" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"lrW" = ( +/obj/machinery/teleport/station, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 8; + network = list("aisat") + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat/foyer) +"lsf" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/exit/departure_lounge) +"lsi" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plasteel, +/area/gateway) +"lsp" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"lsq" = ( +/obj/machinery/smartfridge, +/turf/closed/wall, +/area/crew_quarters/kitchen) +"lsv" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space/basic, +/area/space/nearstation) +"lsz" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"lsG" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/ntnet_relay, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) +"lsT" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port to Filter" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ltf" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "packageSort2" + }, +/obj/machinery/requests_console{ + department = "Cargo Deliveries"; + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"ltn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + 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/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"ltt" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ltu" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/requests_console{ + department = "Medical"; + pixel_x = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"ltK" = ( +/obj/structure/table/reinforced, +/obj/item/circuitboard/machine/rdserver{ + pixel_y = 3 + }, +/obj/item/circuitboard/machine/rdserver{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"ltR" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"lud" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"lue" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/effect/landmark/start/station_engineer, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lul" = ( +/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 + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"luq" = ( +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"lus" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"luY" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_y = -25 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"lvc" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"lvp" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"lvr" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/vending/wardrobe/hydro_wardrobe, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"lvu" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/main) +"lvv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"lvA" = ( +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"lvC" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"lvN" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/openspace, +/area/engine/engine_room) +"lvZ" = ( +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/science/shuttle) +"lwc" = ( +/obj/machinery/camera/autoname, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"lwg" = ( +/obj/structure/chair, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"lwk" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"lwr" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/engineering_guide, +/obj/item/camera_film, +/obj/item/pen, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel, +/area/science/shuttle) +"lwG" = ( +/turf/open/floor/plating/asteroid/airless, +/area/space/nearstation) +"lwH" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"lwO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"lwT" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/gateway) +"lxj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"lxk" = ( +/obj/item/shuttle_creator, +/turf/open/space/basic, +/area/space/nearstation) +"lxl" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/chair/comfy{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"lxm" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 22 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"lxw" = ( +/obj/machinery/button/door{ + id = "isolc"; + name = "Privacy Shutters"; + pixel_x = -28; + pixel_y = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_c) +"lxy" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"lxz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"lxA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"lxF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"lxN" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/chair, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"lxV" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Airlock" + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/secondary) +"lyi" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"lyn" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"lys" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"lyy" = ( +/obj/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"lyL" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/greenglow, +/obj/effect/decal/cleanable/glass, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"lyM" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lyN" = ( +/obj/effect/decal/cleanable/cobweb, +/turf/closed/wall, +/area/crew_quarters/kitchen/coldroom) +"lyU" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"lyX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/science/research) +"lzg" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"lzo" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/space/basic, +/area/space) +"lzp" = ( +/obj/structure/barricade/sandbags, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"lzA" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"lzF" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"lzI" = ( +/obj/effect/turf_decal/delivery, +/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/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"lzN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"lAm" = ( +/obj/structure/table/glass, +/obj/item/folder/white{ + pixel_y = 4 + }, +/obj/item/pen/red, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"lAp" = ( +/obj/machinery/computer/secure_data, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/requests_console{ + pixel_x = -32 + }, +/obj/machinery/light_switch{ + pixel_x = -25; + pixel_y = 28 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/newscaster/security_unit{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/engineering) +"lAx" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/recharger, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/shuttledock) +"lAI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_x = -1; + pixel_y = 7 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"lAO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"lAP" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"lAW" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/bot, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"lBd" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"lBs" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/chapel{ + dir = 9 + }, +/area/chapel/main/monastery) +"lBx" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"lBL" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/maintenance/fore) +"lBO" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/storage/backpack/duffelbag/mining_conscript, +/obj/item/pickaxe, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"lCc" = ( +/obj/structure/stairs, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"lCn" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/law) +"lCt" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"lCu" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"lCC" = ( +/obj/machinery/vending/boozeomat, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"lCL" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"lCO" = ( +/obj/machinery/shower{ + pixel_y = 16 + }, +/obj/machinery/button/door{ + id = "shower1"; + name = "Shower Bolts"; + normaldoorcontrol = 1; + pixel_x = -6; + pixel_y = -27; + specialfunctions = 4 + }, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "shower1a"; + name = "Privacy Shutters"; + normaldoorcontrol = 0; + pixel_x = 7; + pixel_y = -27 + }, +/obj/machinery/light/small, +/obj/effect/landmark/start/assistant, +/obj/item/soap/nanotrasen, +/turf/open/floor/noslip/white, +/area/crew_quarters/toilet) +"lCP" = ( +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"lCS" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/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/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Quartermaster's Office"; + departmentType = 6; + pixel_x = -32 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"lDa" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/security/brig) +"lDj" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"lDm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"lDp" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"lDs" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"lDv" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + 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/science/shuttle) +"lDw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"lDB" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel, +/area/security/brig) +"lDD" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/table/reinforced, +/obj/item/storage/backpack/satchel/explorer, +/obj/structure/cable/yellow, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"lEb" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "0"; + req_one_access_txt = "12,47" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"lEf" = ( +/obj/structure/table/wood, +/obj/item/folder/red, +/obj/item/pen, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "dorm2"; + name = "Privacy Shutters"; + normaldoorcontrol = 0; + pixel_x = -4; + pixel_y = -26 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"lEz" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"lER" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Chemistry Desk"; + req_access_txt = "5; 33" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"lES" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"lEV" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"lFk" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"lFl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"lFu" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"lFv" = ( +/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" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"lFx" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"lFy" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/wood, +/area/maintenance/port) +"lFz" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio"; + name = "Blast Doors" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"lFD" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"lFJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"lFO" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/visible, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"lGb" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"lGc" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"lGw" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"lGN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"lGV" = ( +/turf/closed/wall, +/area/medical/surgery/aux) +"lGY" = ( +/obj/machinery/nanite_programmer, +/turf/open/floor/circuit, +/area/science/nanite) +"lHi" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/machinery/newscaster/security_unit{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/supply) +"lHn" = ( +/obj/structure/bed, +/obj/item/bedsheet/cmo, +/obj/effect/landmark/start/chief_medical_officer, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Chief Medical Officer's Office"; + pixel_x = 32 + }, +/turf/open/floor/carpet/cyan, +/area/crew_quarters/heads/cmo) +"lHs" = ( +/obj/machinery/computer/nanite_chamber_control{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/science/nanite) +"lHu" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/science/research) +"lHz" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/security/brig) +"lHB" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"lHH" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"lHM" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/item/soulstone/anybody/chaplain, +/obj/item/organ/heart, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"lHY" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/railing, +/turf/open/floor/plasteel, +/area/science/shuttle) +"lIa" = ( +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"lIj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"lIt" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"lIC" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"lIF" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"lJa" = ( +/turf/closed/wall/r_wall, +/area/maintenance/starboard/aft) +"lJd" = ( +/obj/machinery/suit_storage_unit/security, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"lJe" = ( +/obj/structure/table/wood, +/obj/machinery/computer/med_data/laptop{ + dir = 1; + pixel_y = 5 + }, +/turf/open/floor/carpet/cyan, +/area/crew_quarters/heads/cmo) +"lJn" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/engine/atmos) +"lJp" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"lJu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output{ + dir = 1 + }, +/turf/open/floor/engine/air, +/area/engine/atmos) +"lJv" = ( +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"lJx" = ( +/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/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"lJA" = ( +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"lJK" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/chair/comfy/black, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"lJL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/keycard_auth{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"lJN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"lJO" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"lKa" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lKb" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"lKd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"lKq" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"lKr" = ( +/obj/machinery/light, +/obj/effect/turf_decal/stripes/end, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lKs" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Service Maints"; + req_one_access_txt = "22;25;26;28;35;37;38;46" + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"lKv" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"lKw" = ( +/obj/machinery/shower{ + pixel_y = 16 + }, +/obj/item/soap/nanotrasen, +/turf/open/floor/noslip/white, +/area/crew_quarters/toilet/auxiliary) +"lKy" = ( +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"lKL" = ( +/obj/machinery/door/airlock/grunge{ + name = "Vacant Office"; + req_access_txt = "32" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"lKS" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"lLa" = ( +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/deck_relay, +/turf/open/floor/circuit/green, +/area/engine/gravity_generator) +"lLb" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"lLf" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"lLi" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"lLt" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/ai_monitored/security/armory) +"lLv" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"lLL" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"lLO" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"lLQ" = ( +/obj/machinery/computer/secure_data{ + dir = 1 + }, +/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{ + dir = 2 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/science) +"lLY" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"lMg" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/vending/wardrobe/chap_wardrobe, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"lMl" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"lMm" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"lMD" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/vending/wardrobe/science_wardrobe, +/turf/open/floor/plasteel/white, +/area/science/research) +"lNj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/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/effect/turf_decal/tile/purple, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"lNr" = ( +/obj/structure/bonfire, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"lNx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"lNF" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/openspace/airless, +/area/space/nearstation) +"lNM" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"lNZ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"lOa" = ( +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"lOs" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"lOy" = ( +/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/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"lOJ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"lOL" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"lOU" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"lOV" = ( +/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/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"lOW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"lPb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"lPe" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/upper/secondary/exit/departure_lounge) +"lPl" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/courtroom) +"lPm" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/chair/sofa/right{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"lPs" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"lPA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"lPN" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"lPU" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"lPW" = ( +/obj/machinery/atmospherics/components/binary/volume_pump, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"lQm" = ( +/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/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) +"lQn" = ( +/obj/machinery/light_switch{ + pixel_x = -25; + pixel_y = -4 + }, +/obj/machinery/button/door{ + id = "detective_shutters"; + name = "detective's office shutters control"; + pixel_x = -26; + pixel_y = 6; + req_access_txt = "4" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/security/detectives_office) +"lQo" = ( +/obj/machinery/camera/autoname{ + dir = 8; + network = list("aicore") + }, +/turf/open/space/basic, +/area/space) +"lQx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"lQJ" = ( +/obj/structure/chair/comfy{ + dir = 4 + }, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"lQW" = ( +/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/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"lRr" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"lRG" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "Air Outlet"; + target_pressure = 500 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"lRQ" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"lRS" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"lSc" = ( +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"lSd" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/latex, +/obj/item/surgical_drapes, +/obj/item/cautery, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"lSj" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"lSA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"lSH" = ( +/obj/machinery/smartfridge, +/turf/closed/wall, +/area/hydroponics) +"lSU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"lSV" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"lSY" = ( +/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/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"lTh" = ( +/obj/machinery/button/door{ + id = "Skynet_launch"; + name = "Mech Bay Door Control"; + pixel_x = 26; + pixel_y = -26; + req_one_access_txt = "29" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/robotics) +"lTq" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"lTu" = ( +/obj/item/reagent_containers/glass/bucket, +/obj/item/assembly/prox_sensor, +/obj/item/mop, +/obj/item/bodypart/r_arm/robot, +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/robot_debris, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"lTz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/maintenance/upper/aft) +"lTB" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"lTL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"lTR" = ( +/obj/machinery/computer/atmos_alert{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) +"lTW" = ( +/obj/machinery/computer/security/qm{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/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/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"lUa" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"lUp" = ( +/obj/structure/fireaxecabinet{ + pixel_y = -28 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/bridge) +"lUw" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"lUA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -14; + pixel_y = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"lUT" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"lUU" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/surgery/aux) +"lVj" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"lVA" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/flasher/portable, +/turf/open/floor/plasteel, +/area/security/warden) +"lVQ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"lVW" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/sign/departments/minsky/supply/hydroponics{ + pixel_x = 32 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"lWg" = ( +/obj/machinery/mech_bay_recharge_port{ + dir = 2 + }, +/turf/open/floor/circuit, +/area/science/robotics) +"lWp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"lWv" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"lWy" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel/dark, +/area/gateway) +"lWD" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/carpet, +/area/security/prison) +"lWF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"lWJ" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/bridge) +"lWL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"lWX" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"lXg" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/tower, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/requests_console{ + pixel_x = 32 + }, +/turf/open/floor/grass, +/area/hydroponics/garden) +"lXs" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"lXx" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"lXB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"lXJ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"lXM" = ( +/obj/machinery/gateway{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/sign/warning/docking{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"lXP" = ( +/turf/closed/wall, +/area/maintenance/upper/aft) +"lXT" = ( +/obj/machinery/nanite_program_hub, +/turf/open/floor/circuit, +/area/science/nanite) +"lXV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"lXW" = ( +/obj/structure/table/glass, +/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/item/reagent_containers/food/drinks/bottle/synthflesh{ + pixel_x = 2; + pixel_y = 8 + }, +/obj/item/reagent_containers/food/drinks/bottle/synthflesh{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"lYa" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/shuttledock) +"lYh" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"lYp" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L1" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"lYy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/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/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"lYA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"lYG" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Chapel"; + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"lYI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"lYQ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"lYT" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/fore) +"lZl" = ( +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lZn" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"lZp" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"lZE" = ( +/turf/open/floor/plasteel/chapel{ + dir = 8 + }, +/area/chapel/main/monastery) +"lZH" = ( +/obj/structure/table/wood, +/obj/structure/displaycase/forsale/kitchen, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"lZV" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"maa" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Monestary Access" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"mab" = ( +/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/tile/neutral, +/obj/structure/rack, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"maA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"maB" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/structure/flora/ausbushes/ppflowers, +/mob/living/simple_animal/chicken, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"maQ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"maR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light/small/broken{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"maV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"mbn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"mbq" = ( +/obj/machinery/holopad, +/obj/item/beacon, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/security/courtroom) +"mbr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/requests_console{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/science/misc_lab/range) +"mbB" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"mbC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"mbJ" = ( +/obj/structure/cable/yellow{ + icon_state = "2-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/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mbV" = ( +/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/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"mbW" = ( +/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/science/lab) +"mch" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"mcj" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/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/dark, +/area/security/main) +"mcl" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/medical/sleeper) +"mcr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"mcA" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"mcD" = ( +/obj/effect/decal/cleanable/blood, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"mcG" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"mcL" = ( +/obj/machinery/door/window/northleft{ + name = "Containment Pen #6"; + req_access_txt = "55" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"mcM" = ( +/obj/item/kirbyplants/random, +/obj/structure/extinguisher_cabinet{ + pixel_x = -30 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"mcV" = ( +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/customs) +"mdf" = ( +/obj/machinery/telecomms/hub/preset/exploration, +/obj/machinery/airalarm/server{ + dir = 4; + pixel_x = -28 + }, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/relay) +"mdi" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"mdj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"mdk" = ( +/obj/structure/bed, +/obj/effect/landmark/start/cargo_technician, +/obj/item/bedsheet/dorms, +/turf/open/floor/wood, +/area/quartermaster/storage) +"mdD" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/telecomms/processor/preset_two, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/server) +"mdE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"mdQ" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/grass, +/area/crew_quarters/park) +"mea" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"meb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"meh" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"mej" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"mem" = ( +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral, +/mob/living/simple_animal/hostile/carp/cayenne{ + desc = "A failed experiment of Nanotrasen to create weaponised carp technology. This less than intimidating carp now serves as an authority figure's pet."; + health = 200; + icon_dead = "magicarp_dead"; + icon_gib = "magicarp_gib"; + icon_living = "magicarp"; + icon_state = "magicarp"; + maxHealth = 200; + melee_damage = 20; + name = "Lia" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"mes" = ( +/obj/machinery/recharge_station, +/obj/machinery/light/small, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"mex" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"meA" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"meB" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"meQ" = ( +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"meW" = ( +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"mfb" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/exit/departure_lounge) +"mfl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"mfu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/monofloor{ + dir = 4 + }, +/area/quartermaster/exploration_prep) +"mfw" = ( +/obj/structure/marker_beacon, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/hallway/secondary/entry) +"mfO" = ( +/obj/machinery/power/port_gen/pacman, +/obj/structure/cable/yellow, +/obj/machinery/requests_console{ + department = "Gravity Generator"; + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/engine/gravity_generator) +"mfW" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"mga" = ( +/obj/structure/lattice/catwalk, +/obj/structure/ladder, +/turf/open/openspace, +/area/maintenance/upper/central) +"mge" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/science/research) +"mgf" = ( +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/hyper, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mgk" = ( +/obj/structure/table, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/obj/item/camera, +/obj/item/camera_film, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/crew_quarters/heads/hor) +"mgv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"mgz" = ( +/obj/machinery/advanced_airlock_controller/directional/north, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/hallway/primary/fore) +"mgO" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"mgS" = ( +/obj/structure/table/reinforced, +/obj/item/gps/mining/exploration, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"mgU" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/maintenance/department/science) +"mhi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"mho" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"mht" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"mhv" = ( +/turf/open/floor/plating, +/area/science/misc_lab/range) +"mhx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"mhy" = ( +/obj/machinery/door/airlock/research{ + name = "Research and Development Lab"; + req_one_access_txt = "7;29" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/science/lab) +"mhz" = ( +/obj/effect/turf_decal/delivery, +/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/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"mhD" = ( +/obj/structure/bed/dogbed, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"mhF" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/sign/departments/minsky/security/security{ + pixel_x = -32 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"mhK" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/space/basic, +/area/space) +"mhS" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"mhT" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"mhX" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"mij" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"mim" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"miy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/requests_console{ + department = "Engineering"; + departmentType = 3; + pixel_x = 32 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"miA" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/server) +"miO" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"miQ" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"mjd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"mji" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/port) +"mjj" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mjl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall4"; + location = "hall3" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mjB" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"mjC" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/closet/firecloset/full, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"mjE" = ( +/obj/structure/table/wood, +/obj/item/modular_computer/laptop/preset/civillian, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/storage/art) +"mjF" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"mjR" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"mkl" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"mko" = ( +/turf/closed/wall/r_wall, +/area/maintenance/starboard/fore) +"mku" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"mkw" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"mkB" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"mkD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"mkK" = ( +/obj/machinery/door/window/northleft{ + dir = 2; + name = "Containment Pen #6"; + req_access_txt = "55" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio8"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"mlh" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"mlw" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/storage_shared) +"mlz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/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/effect/turf_decal/tile/purple, +/obj/item/radio/intercom{ + pixel_y = 22 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"mlK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/teleporter) +"mmb" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"mmg" = ( +/turf/open/openspace, +/area/engine/supermatter) +"mmn" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/airalarm/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"mmu" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"mmF" = ( +/obj/machinery/processor/slime, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"mmT" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/door/window/eastleft{ + dir = 2; + name = "Atmospherics"; + req_one_access_txt = "24" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/atmos) +"mnr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hor) +"mns" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/transit_tube/curved, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"mnv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"mnw" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/white, +/area/science/lab) +"mnD" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/newscaster/security_unit{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"mnH" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"mnJ" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"mnO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 12 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"mnU" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Chapel Dock Access" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/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/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"mnV" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"mon" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall12"; + location = "hall11" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"mop" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/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/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"mox" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"moB" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"moN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"moX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"mpd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery/aux) +"mpg" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/suit_storage_unit/exploration, +/turf/open/floor/plasteel, +/area/gateway) +"mpi" = ( +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/carpet/green, +/area/library) +"mpp" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"mpu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"mpB" = ( +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"mqf" = ( +/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/window/reinforced/spawner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/medbay/balcony) +"mqg" = ( +/obj/structure/flora/ausbushes/reedbush, +/turf/open/water/air, +/area/crew_quarters/park) +"mqm" = ( +/turf/closed/wall, +/area/hallway/primary/central) +"mqn" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "49" + }, +/turf/open/floor/plating, +/area/quartermaster/exploration_dock) +"mqo" = ( +/obj/machinery/camera/autoname, +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"mqu" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/requests_console{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"mqw" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"mqx" = ( +/turf/closed/wall/r_wall, +/area/hallway/upper/primary/fore) +"mqL" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/chair/wood{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"mqY" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/aimodule_harmless, +/obj/effect/spawner/lootdrop/gloves, +/obj/effect/spawner/lootdrop/techstorage/command, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/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, +/area/ai_monitored/turret_protected/aisat/foyer) +"mrl" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"mro" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"mrv" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/requests_console{ + pixel_x = -32 + }, +/obj/structure/chair/office, +/obj/effect/landmark/start/cargo_technician, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"mrI" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/light, +/turf/open/floor/engine, +/area/engine/engine_room) +"mrK" = ( +/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/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mrR" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"mrY" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engineering"; + req_access_txt = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mrZ" = ( +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"msa" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/grass, +/area/hallway/secondary/command) +"mst" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/grass, +/area/crew_quarters/park) +"msH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"msJ" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"msM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/shutters{ + id = "aicoremain" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"msN" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"msS" = ( +/turf/open/floor/plasteel, +/area/hydroponics) +"msX" = ( +/obj/machinery/atmospherics/miner/n2o, +/turf/open/floor/engine/n2o, +/area/engine/atmos) +"mtc" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"mth" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mtp" = ( +/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/tile/neutral, +/obj/machinery/vending/clothing, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"mtA" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"mtC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/structure/flora/junglebush, +/turf/open/floor/grass, +/area/crew_quarters/park) +"mtE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"mtK" = ( +/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/tile/neutral, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall15"; + location = "hall14" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"mtL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000 + }, +/obj/item/multitool{ + pixel_x = 2 + }, +/obj/machinery/newscaster{ + pixel_x = 28 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/science/lab) +"mtV" = ( +/turf/open/openspace, +/area/maintenance/upper/central) +"mtY" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/fore) +"muj" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/landmark/start/medical_doctor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"muC" = ( +/obj/machinery/atmospherics/miner/toxins, +/turf/open/floor/engine/plasma, +/area/engine/atmos) +"muG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/circuit/green, +/area/security/nuke_storage) +"muO" = ( +/obj/machinery/doorButtons/access_button{ + idDoor = "virology_airlock_interior"; + idSelf = "virology_airlock_control"; + name = "Virology Access Button"; + pixel_x = 25; + pixel_y = 26; + req_access_txt = "39" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"muP" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/science/robotics) +"muT" = ( +/obj/machinery/newscaster{ + pixel_y = -30 + }, +/obj/effect/turf_decal/delivery, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"muV" = ( +/turf/closed/wall/mineral/plastitanium, +/area/maintenance/starboard/secondary) +"mvl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"mvs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless{ + luminosity = 2 + }, +/area/science/test_area) +"mvt" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/security/main) +"mwc" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"mwe" = ( +/obj/machinery/nuclearbomb/beer, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"mwx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"mwy" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"mwA" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mwB" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/camera/autoname, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"mwE" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mwJ" = ( +/turf/closed/wall, +/area/medical/patients_rooms/room_b) +"mwR" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/science/research) +"mwS" = ( +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap{ + pixel_x = 1; + pixel_y = 3 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"mwX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"mwZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"mxb" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/landmark/start/exploration, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"mxx" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/stairs, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"mxA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/science/storage) +"mxR" = ( +/obj/machinery/suit_storage_unit/captain, +/obj/machinery/door/window/brigdoor/northright, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain/private) +"mxU" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"mxV" = ( +/obj/structure/table/reinforced, +/obj/item/storage/backpack/duffelbag/sec/surgery, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/blood_filter, +/turf/open/floor/plasteel, +/area/security/brig) +"mxW" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"mxY" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"mxZ" = ( +/obj/structure/window/reinforced/spawner, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 10 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"myu" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"myF" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"myG" = ( +/obj/structure/table/wood, +/obj/item/folder/red, +/obj/item/pen, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "dorm1"; + name = "Privacy Shutters"; + normaldoorcontrol = 0; + pixel_x = -4; + pixel_y = -26 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"myJ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/ladder, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"mza" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/security/glass{ + name = "Security Medical"; + req_access_txt = "63" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/security/brig) +"mzc" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/obj/structure/transit_tube/horizontal, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/bridge) +"mzC" = ( +/obj/structure/lattice, +/turf/open/openspace/airless, +/area/space/nearstation) +"mzG" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"mzJ" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"mzK" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/radio, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/engineering) +"mzN" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/radio/intercom{ + pixel_y = 22 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"mzO" = ( +/obj/machinery/seed_extractor, +/turf/open/floor/grass, +/area/hydroponics/garden) +"mzZ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"mAy" = ( +/obj/structure/table/reinforced, +/obj/item/circuitboard/machine/clonepod{ + pixel_x = -4; + pixel_y = 7 + }, +/obj/item/circuitboard/machine/clonescanner{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/circuitboard/machine/sleeper{ + pixel_x = -6; + pixel_y = 3 + }, +/obj/item/circuitboard/machine/sleeper{ + pixel_x = -7; + pixel_y = 1 + }, +/obj/item/circuitboard/machine/stasis{ + pixel_x = -8; + pixel_y = -2 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"mAL" = ( +/obj/effect/landmark/start/medical_doctor, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"mBu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"mBC" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"mBE" = ( +/turf/closed/wall/r_wall, +/area/quartermaster/exploration_dock) +"mBF" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 6; + height = 6; + id = "science_station"; + name = "science shuttle dock"; + width = 9 + }, +/turf/open/space/basic, +/area/space) +"mBG" = ( +/obj/machinery/telecomms/bus/preset_exploration, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/relay) +"mBO" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"mCa" = ( +/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/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"mCm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"mCv" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"mCA" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/quartermaster/storage) +"mCF" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mCG" = ( +/obj/effect/turf_decal/stripes/box, +/obj/machinery/suit_storage_unit/open, +/turf/open/floor/plating, +/area/maintenance/fore) +"mCU" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"mDo" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"mDv" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "ceprivacy"; + name = "privacy shutter" + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/chief) +"mDD" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "secmain"; + name = "Blast Doors" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/security/brig) +"mDG" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"mDJ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"mDR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"mDT" = ( +/obj/structure/table/wood, +/obj/item/pneumatic_cannon/pie, +/obj/item/reagent_containers/food/snacks/pie/cream, +/obj/item/reagent_containers/food/snacks/pie/cream, +/turf/open/floor/carpet/purple, +/area/crew_quarters/theatre) +"mEb" = ( +/turf/open/floor/wood, +/area/vacant_room/office) +"mEd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"mEq" = ( +/obj/machinery/status_display/evac{ + pixel_x = -32 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4; + network = list("aicore") + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"mEA" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"mEC" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"mEF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"mEG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"mEN" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"mFv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"mFx" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"mFy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"mFB" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mFE" = ( +/obj/structure/falsewall, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"mFT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"mFU" = ( +/obj/machinery/atmospherics/components/binary/circulator/cold{ + dir = 8; + icon_state = "circ-off-0" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"mGn" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"mGt" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"mGw" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/visible, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/engine, +/area/engine/engine_room) +"mGx" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/item/pen{ + pixel_x = 1; + pixel_y = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"mGB" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"mGE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"mGM" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"mGT" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/library) +"mGX" = ( +/obj/machinery/requests_console{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) +"mHh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science{ + req_access_txt = "49" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/exploration_prep) +"mHj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"mHn" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"mHx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/reagent_containers/food/drinks/bottle/synthflesh{ + pixel_x = -1; + pixel_y = 14 + }, +/obj/item/reagent_containers/food/drinks/bottle/synthflesh{ + pixel_x = -7; + pixel_y = 11 + }, +/obj/item/reagent_containers/food/drinks/coffee{ + pixel_x = 6; + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"mHA" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"mHB" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"mHF" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"mHI" = ( +/turf/closed/wall, +/area/hallway/upper/primary/fore) +"mHN" = ( +/obj/effect/spawner/structure/window, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/hydroponics) +"mHU" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"mId" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"mIj" = ( +/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/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"mIu" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/openspace, +/area/quartermaster/exploration_prep) +"mIw" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/sign/map/left{ + pixel_x = 16; + pixel_y = -32 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"mIG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/camera/preset/toxins{ + dir = 4 + }, +/obj/item/target/alien/anchored, +/turf/open/floor/plating/airless, +/area/science/test_area) +"mIS" = ( +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"mIT" = ( +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"mJj" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"mJo" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Air to Mix" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"mJp" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/caution/red{ + dir = 8; + pixel_x = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"mJC" = ( +/obj/structure/flora/junglebush/c, +/obj/structure/flora/rock/jungle, +/turf/open/floor/grass, +/area/crew_quarters/park) +"mJE" = ( +/obj/machinery/holopad, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "gateway"; + name = "Gateway Shutters Control"; + normaldoorcontrol = 0; + pixel_x = -28; + pixel_y = -26 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/gateway) +"mJH" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/chaplain, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/item/radio/intercom/chapel{ + pixel_x = -26 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"mJJ" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"mKi" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/conveyor_switch/oneway{ + id = "kitchen" + }, +/obj/machinery/light_switch{ + pixel_x = -25; + pixel_y = -25 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"mKq" = ( +/obj/machinery/door/airlock{ + name = "Unisex Washroom" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"mKQ" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/storage/toolbox/mechanical, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"mLc" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mLg" = ( +/turf/closed/wall, +/area/science/robotics) +"mLk" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"mLo" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"mLp" = ( +/turf/open/openspace, +/area/engine/atmos) +"mLy" = ( +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"mLz" = ( +/obj/effect/spawner/room/fivexfour, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"mLB" = ( +/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/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"mLH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"mLJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"mLK" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"mLM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"mMb" = ( +/obj/machinery/button/door{ + id = "Dorm2"; + name = "Dormitory Door Lock"; + normaldoorcontrol = 1; + pixel_x = 28; + pixel_y = -5; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"mMj" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/item/beacon, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"mMk" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/table, +/obj/item/clothing/under/rank/cargo/exploration, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"mMp" = ( +/obj/machinery/computer/med_data, +/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/tile/blue, +/turf/open/floor/plasteel, +/area/bridge) +"mMB" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"mMD" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/obj/machinery/advanced_airlock_controller{ + pixel_y = 24 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plating, +/area/quartermaster/storage) +"mMT" = ( +/obj/machinery/shower{ + pixel_y = 16 + }, +/turf/open/floor/noslip/white, +/area/quartermaster/qm) +"mMY" = ( +/obj/structure/flora/ausbushes/palebush, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/grass, +/area/hallway/secondary/command) +"mNn" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"mNp" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"mNt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mNA" = ( +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"mNE" = ( +/obj/structure/bed, +/obj/machinery/requests_console{ + pixel_x = 32 + }, +/turf/open/floor/carpet/blue, +/area/security/brig) +"mNF" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"mNR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "comms" + }, +/turf/open/floor/plating, +/area/tcommsat/computer) +"mOs" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"mOt" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"mOy" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"mOD" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mON" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/port) +"mOO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"mOT" = ( +/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/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"mOV" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"mOW" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"mOY" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"mPi" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"mPr" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"mPA" = ( +/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/maintenance/department/science) +"mPE" = ( +/obj/structure/chair/comfy/beige, +/turf/open/floor/wood, +/area/hallway/primary/fore) +"mPF" = ( +/obj/structure/chair, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery/aux) +"mPG" = ( +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"mPY" = ( +/obj/structure/chair/pew/right{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/chapel, +/area/chapel/main/monastery) +"mQn" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"mQo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"mQt" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"mQv" = ( +/turf/closed/wall, +/area/security/brig) +"mQw" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"mQy" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"mQB" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"mQF" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall11"; + location = "hall10" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"mRb" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"mRe" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"mRj" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white, +/turf/open/space/basic, +/area/solar/starboard/aft) +"mRl" = ( +/obj/structure/table/wood, +/obj/item/folder/yellow, +/turf/open/floor/wood, +/area/vacant_room/office) +"mRn" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"mRy" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"mSn" = ( +/obj/machinery/modular_computer/console/preset/civilian{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/carpet/blue, +/area/security/brig) +"mSv" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/camera/autoname, +/obj/structure/closet/secure_closet/security/sec, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"mSP" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"mTb" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"mTd" = ( +/obj/structure/rack, +/obj/item/gun/energy/e_gun/dragnet, +/obj/item/gun/energy/temperature/security, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"mTk" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/barricade/wooden, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"mTN" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"mTP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"mTT" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"mUc" = ( +/obj/structure/table, +/obj/structure/table, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/gloves/color/latex, +/obj/item/surgicaldrill, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white/side, +/area/medical/surgery) +"mUe" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/fore) +"mUm" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"mUn" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/box, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"mUt" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"mUw" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/airalarm/directional/south, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_c) +"mUy" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"mUA" = ( +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/library) +"mUC" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"mUH" = ( +/turf/open/floor/plasteel/checker, +/area/storage/art) +"mUP" = ( +/obj/structure/closet/cabinet, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"mUV" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"mVl" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"mVm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"mVn" = ( +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"mVq" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"mVy" = ( +/obj/machinery/computer/security/qm, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"mVO" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall13"; + location = "hall12" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"mVU" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/security/prison) +"mWa" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"mWe" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"mWi" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/coin/gold, +/obj/item/coin/gold{ + pixel_x = 1; + pixel_y = 2 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"mWl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"mWw" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"mWY" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 1; + name = "manual outlet valve" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"mXc" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"mXg" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/door/window/brigdoor/eastright{ + dir = 1; + req_access_txt = "2" + }, +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"mXs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/hor) +"mXv" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"mXw" = ( +/obj/effect/spawner/structure/window, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"mXx" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"mXF" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/table, +/obj/item/phone{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/wrench, +/obj/item/clothing/mask/gas, +/turf/open/floor/plasteel, +/area/engine/atmos) +"mXQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"mXV" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"mYa" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + 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/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mYh" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"mYi" = ( +/obj/machinery/door_timer{ + id = "Cell 1"; + name = "Cell 1"; + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel, +/area/security/brig) +"mYl" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/vacant_room/office) +"mYn" = ( +/obj/machinery/rnd/server, +/obj/machinery/atmospherics/pipe/manifold/general/hidden{ + dir = 1 + }, +/turf/open/floor/circuit, +/area/science/server) +"mYq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/chapel{ + dir = 6 + }, +/area/chapel/main/monastery) +"mYA" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/engine, +/area/engine/engine_room) +"mYG" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"mYJ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mYU" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mZf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"mZu" = ( +/obj/vehicle/ridden/janicart, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/item/key/janitor, +/obj/machinery/requests_console{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/janitor) +"mZD" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"mZR" = ( +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "AI Chamber"; + departmentType = 7 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai) +"mZS" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) +"nap" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/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{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"nas" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/reagent_containers/food/snacks/mint, +/obj/item/kitchen/rollingpin, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"naw" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/ladder, +/turf/open/floor/plasteel, +/area/engine/engineering) +"nay" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/security/brig) +"naC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"naI" = ( +/mob/living/simple_animal/bot/floorbot{ + locked = 0; + on = 0 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"naP" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"naV" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"naZ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/turf/open/space/basic, +/area/solar/port/aft) +"nbb" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"nbd" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"nbe" = ( +/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/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"nbp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/secondary) +"nbv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/airlock/research{ + name = "Science Shuttle Dock"; + req_access_txt = "8" + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) +"nbD" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"nbN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"nce" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/rack, +/obj/item/circuitboard/machine/fat_sucker, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"ncr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"ncu" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"ncx" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 4; + network = list("aisat") + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"ncz" = ( +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"ncA" = ( +/obj/structure/chair, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"ncE" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"ncH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"ncN" = ( +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"ncT" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/table/reinforced, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/item/lightreplacer, +/turf/open/floor/plasteel/dark, +/area/engine/storage_shared) +"ncU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"ncX" = ( +/turf/open/openspace, +/area/ai_monitored/security/armory) +"ndb" = ( +/turf/open/floor/wood, +/area/library) +"ndd" = ( +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/effect/turf_decal/stripes/end, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/glasses/welding, +/obj/item/stack/sheet/mineral/copper{ + amount = 5 + }, +/turf/open/floor/plasteel, +/area/science/lab) +"ndf" = ( +/obj/effect/spawner/room/tenxfive, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"ndh" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"ndv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"ndK" = ( +/obj/machinery/door/airlock/security{ + name = "Armory"; + req_access_txt = "3"; + security_level = 6 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/poddoor/preopen{ + id = "armourydoors"; + name = "Blast Doors" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"neh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"nei" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"neu" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"new" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"neG" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Gravity Generator Room"; + req_access_txt = "19;23" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"neI" = ( +/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" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"neJ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"neR" = ( +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"neW" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/turf/open/floor/engine, +/area/engine/engine_room) +"nfc" = ( +/obj/machinery/camera/autoname, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"nfe" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"nfo" = ( +/turf/closed/wall/r_wall, +/area/science/explab) +"nfx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 2; + external_pressure_bound = 140; + name = "killroom vent"; + pressure_checks = 0 + }, +/turf/open/floor/circuit/telecomms, +/area/science/xenobiology) +"nfP" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/storage/fancy/candle_box, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"ngd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"ngf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/engine/storage) +"ngk" = ( +/obj/machinery/holopad, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 8; + name = "Atmospherics Burn Mix" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"ngn" = ( +/obj/machinery/newscaster{ + pixel_x = 30 + }, +/obj/structure/table/wood, +/obj/item/pda, +/obj/item/pda{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/pda{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/hop) +"ngB" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"ngT" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"nhb" = ( +/obj/structure/alien/egg/burst, +/obj/structure/alien/weeds, +/obj/effect/spawner/lootdrop/glowstick, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"nhu" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Security Maintenance"; + req_access_txt = "1" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/security/brig) +"nhJ" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/openspace, +/area/maintenance/upper/central) +"nhM" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"nhQ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/storage/tools) +"nin" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Hydroponics Storage"; + req_access_txt = "35" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"nip" = ( +/obj/structure/bookcase/random/nonfiction, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/wood, +/area/library) +"nir" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"niH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"niN" = ( +/obj/machinery/door/airlock/external{ + name = "Transport Airlock" + }, +/turf/open/floor/plating, +/area/science/shuttle) +"niO" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"niT" = ( +/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/effect/decal/cleanable/dirt/dust, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/gateway) +"niU" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/requests_console{ + department = "Medical Bay"; + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"njc" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"nje" = ( +/obj/machinery/air_sensor/atmos/air_tank, +/turf/open/floor/engine/air, +/area/engine/atmos) +"njg" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port to Fuel Pipe" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"njA" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/deliveryChute{ + dir = 8; + name = "Kitchen Delivery Chute" + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/hydroponics) +"njR" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"njX" = ( +/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/navbeacon{ + codes_txt = "patrol;next_patrol=hall25"; + location = "hall24" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"nkf" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"nkx" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"nkD" = ( +/obj/structure/table/wood, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"nkH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"nkI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"nkL" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/hos, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"nkQ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, +/area/science/research) +"nlc" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) +"nll" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/openspace, +/area/quartermaster/exploration_dock) +"nlo" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/secondary) +"nlt" = ( +/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_switch{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"nlu" = ( +/obj/machinery/newscaster{ + pixel_x = 28 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"nly" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"nlz" = ( +/obj/machinery/door/airlock/research{ + name = "Toxins Storage"; + req_access_txt = "8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/storage) +"nlD" = ( +/obj/structure/table/glass, +/obj/item/storage/backpack/duffelbag/med/surgery{ + pixel_y = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"nma" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hydroponics) +"nmj" = ( +/obj/machinery/light/small/broken, +/obj/structure/alien/weeds, +/obj/structure/disposalpipe/trunk/multiz{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"nml" = ( +/obj/machinery/camera/autoname{ + dir = 4; + network = list("aicore") + }, +/turf/open/space/basic, +/area/space) +"nmm" = ( +/obj/structure/bookcase/random/nonfiction, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"nmo" = ( +/turf/closed/wall/r_wall, +/area/medical/virology) +"nmJ" = ( +/obj/machinery/power/generator, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"nmY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"nni" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"nnn" = ( +/turf/open/floor/plating, +/area/science/xenobiology) +"nnu" = ( +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"nnx" = ( +/obj/structure/table, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/clothing/neck/stethoscope, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_c) +"nnM" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"nnP" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"nnV" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"nnY" = ( +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"noq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"now" = ( +/turf/closed/wall, +/area/quartermaster/warehouse) +"nox" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"noz" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"noH" = ( +/obj/machinery/atmospherics/miner/nitrogen, +/turf/open/floor/engine/n2, +/area/engine/atmos) +"noQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"noY" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "secmain"; + name = "Blast Doors" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/security/brig) +"npd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"npn" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"npp" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"npq" = ( +/obj/effect/landmark/start/scientist, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"npv" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"npw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/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 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"npz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/security/nuke_storage) +"npT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/crew_quarters/heads/cmo) +"npU" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/exit) +"nqb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"nqj" = ( +/turf/closed/wall, +/area/maintenance/department/chapel/monastery) +"nqB" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"nqE" = ( +/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/camera/autoname{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"nrf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"nri" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"nrp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"nrt" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"nru" = ( +/obj/structure/table/reinforced, +/obj/item/storage/bag/tray, +/obj/item/kitchen/fork, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"nrv" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"nry" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/landmark/start/medical_doctor, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"nrC" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"nrI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"nrQ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"nrU" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/upper/primary/port) +"nsd" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/landmark/start/chemist, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"nsg" = ( +/obj/structure/closet/secure_closet/bar, +/obj/machinery/requests_console{ + department = "Bar"; + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"nst" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"nsC" = ( +/turf/open/floor/plating, +/area/quartermaster/storage) +"nsE" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"nsG" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/dorms) +"nsY" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Robotics Lab"; + req_access_txt = "29" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics_shutters"; + name = "robotics shutters" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"nta" = ( +/turf/open/floor/plasteel/white, +/area/science/mixing) +"nti" = ( +/turf/open/floor/engine/air, +/area/engine/atmos) +"nto" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"nts" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/upper/primary/fore) +"ntK" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"ntP" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"nus" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"nuu" = ( +/obj/structure/chair/stool, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1485; + listening = 0; + name = "Station Intercom (Medbay)"; + pixel_x = -30 + }, +/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/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"nuv" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"nuB" = ( +/obj/item/kirbyplants/random, +/obj/machinery/light, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"nuO" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"nuP" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"nuR" = ( +/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/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, +/area/crew_quarters/dorms) +"nva" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/airlock/command/glass{ + name = "Command Hall Access"; + req_one_access_txt = "19;53"; + security_level = 0 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"nvq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/carpet/purple, +/area/crew_quarters/theatre) +"nvr" = ( +/obj/structure/sign/painting/library{ + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/library) +"nvu" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"nvB" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"nvI" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"nvN" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"nwo" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/landmark/start/security_officer, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"nwT" = ( +/obj/effect/landmark/blobstart, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"nwV" = ( +/obj/machinery/requests_console{ + department = "Toilets"; + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"nxf" = ( +/obj/effect/spawner/room/fivexfour, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"nxh" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/secondary) +"nxl" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"nxn" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/light_switch{ + pixel_x = 7; + pixel_y = -25 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"nxo" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Gas Control"; + 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 + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"nxq" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/library) +"nxs" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/prison) +"nxz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"nxC" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"nxI" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/obj/machinery/advanced_airlock_controller{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"nxK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"nxS" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/science/research) +"nxX" = ( +/obj/machinery/atmospherics/pipe/simple/multiz/layer1, +/obj/machinery/atmospherics/pipe/simple/multiz/layer3, +/obj/structure/disposalpipe/trunk/multiz/down, +/turf/open/openspace, +/area/maintenance/upper/fore) +"nyc" = ( +/obj/structure/chair/comfy/black, +/obj/effect/landmark/start/exploration, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"nyk" = ( +/obj/structure/chair{ + dir = 8 + }, +/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 = -32 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"nyl" = ( +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space) +"nyr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"nys" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/plasteel, +/area/science/mixing) +"nyz" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"nyJ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"nyP" = ( +/obj/machinery/shower{ + pixel_y = 16 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"nzd" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"nzi" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel/dark, +/area/security/main) +"nzB" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"nzJ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"nzO" = ( +/obj/structure/table/glass, +/obj/item/storage/box/donkpockets, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"nzY" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/sign/poster/official/space_cops{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"nzZ" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/requests_console{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"nAd" = ( +/obj/structure/dresser, +/obj/item/flashlight/lamp{ + pixel_x = -1; + pixel_y = 14 + }, +/turf/open/floor/carpet/cyan, +/area/crew_quarters/heads/cmo) +"nAh" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"nAj" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/openspace/airless, +/area/space/nearstation) +"nAn" = ( +/obj/structure/chair/comfy/black, +/obj/effect/landmark/start/librarian, +/turf/open/floor/carpet/green, +/area/library) +"nAs" = ( +/obj/machinery/holopad, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"nAv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"nAC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"nAL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"nBc" = ( +/obj/machinery/door/airlock/command{ + name = "Gateway Access"; + req_access_txt = "62" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/gateway) +"nBh" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"nBp" = ( +/obj/structure/chair/office, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"nBG" = ( +/obj/machinery/door/window/northleft{ + dir = 2; + name = "Containment Pen #1"; + req_access_txt = "55" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"nBM" = ( +/obj/structure/cable/yellow{ + 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/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"nCg" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/computer/security, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/engineering) +"nCj" = ( +/obj/structure/frame/computer{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"nCt" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"nCJ" = ( +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/closed/wall, +/area/science/shuttle) +"nCU" = ( +/obj/machinery/camera/autoname, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"nCY" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"nDe" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/landmark/start/botanist, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"nDm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"nDo" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/landmark/start/scientist, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/research) +"nDC" = ( +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"nDJ" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"nDS" = ( +/turf/open/floor/plasteel/stairs/medium{ + dir = 8 + }, +/area/hallway/secondary/service) +"nDX" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"nDY" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"nEc" = ( +/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, +/area/hallway/primary/fore) +"nEk" = ( +/obj/machinery/door/window/eastleft{ + dir = 1; + name = "Robotics Deliveries"; + req_access_txt = "29" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"nEm" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/security{ + name = "Detective's Office"; + req_access_txt = "4" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"nEr" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"nEy" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"nEF" = ( +/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/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"nEL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/science/misc_lab/range) +"nEN" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"nEY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/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) +"nFk" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"nFw" = ( +/obj/structure/closet/secure_closet/engineering_electrical, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/airalarm/directional/east, +/obj/machinery/light_switch{ + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"nFx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"nFR" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"nGc" = ( +/obj/machinery/telecomms/server/presets/command, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/server) +"nGe" = ( +/obj/machinery/microwave{ + desc = "Cooks and boils stuff, somehow."; + pixel_y = 5 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"nGg" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"nGi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"nGm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/reflector/single/anchored{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"nGF" = ( +/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/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"nGJ" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"nGR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"nGY" = ( +/obj/effect/turf_decal/tile/neutral{ + 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/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"nGZ" = ( +/obj/machinery/computer/slot_machine, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"nHi" = ( +/obj/effect/spawner/room/threexfive, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"nHj" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"nHt" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"nHy" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"nHD" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"nHI" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"nIh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Public Office" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/storage/art) +"nIo" = ( +/obj/machinery/door/airlock/command/glass{ + name = "E.V.A. Storage"; + req_access_txt = "18" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"nIw" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/medical/virology) +"nIy" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"nIB" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/o2{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/storage/firstaid/o2{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/firstaid/o2, +/obj/item/storage/firstaid/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/machinery/door/window/eastleft{ + dir = 8; + name = "First-Aid Supplies"; + red_alert_access = 1; + req_access_txt = "5" + }, +/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 + }, +/turf/open/floor/plasteel, +/area/medical/storage) +"nIF" = ( +/obj/machinery/door/airlock/external{ + name = "Bridge External Access"; + req_access_txt = "10;13" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"nIG" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/secondary) +"nII" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"nJk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"nJp" = ( +/obj/machinery/requests_console{ + department = "Medical Bay"; + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"nJs" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"nJx" = ( +/obj/machinery/power/emitter/anchored{ + dir = 8; + state = 2 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"nJE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"nJL" = ( +/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/dark, +/area/quartermaster/warehouse) +"nKc" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/camera/autoname, +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"nKg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/computer/cargo/request{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/science/lab) +"nKA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"nKC" = ( +/turf/closed/wall, +/area/maintenance/port) +"nKP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"nKS" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"nLe" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/railing, +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"nLf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"nLF" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/maintenance/port) +"nLZ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"nMd" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white, +/turf/open/space/basic, +/area/solar/port/aft) +"nMl" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"nMm" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"nMo" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/chair/sofa/left{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"nMq" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"nMs" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"nMt" = ( +/obj/structure/table/wood, +/obj/item/candle{ + pixel_x = -8; + pixel_y = 7 + }, +/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 + }, +/turf/open/floor/wood, +/area/maintenance/port) +"nMA" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"nMJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"nMU" = ( +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"nMZ" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel/dark, +/area/quartermaster/exploration_prep) +"nNc" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"nNe" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/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/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/item/storage/secure/briefcase, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"nNn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"nNp" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"nNr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/noslip/standard, +/area/hallway/secondary/service) +"nNx" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/openspace, +/area/science/research) +"nNC" = ( +/obj/machinery/holopad, +/turf/open/floor/carpet/cyan, +/area/crew_quarters/heads/cmo) +"nNE" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/o2{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/storage/firstaid/toxin, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"nNQ" = ( +/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/navbeacon{ + codes_txt = "patrol;next_patrol=hall23"; + location = "hall22" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"nOd" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/captain) +"nOm" = ( +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = -31 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/library) +"nOr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 4; + name = "Thermoelectric Generator Input" + }, +/obj/machinery/atmospherics/components/binary/volume_pump{ + name = "Atmos to Loop" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"nOu" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"nOv" = ( +/obj/structure/stairs{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"nOz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock{ + name = "Crematorium"; + req_access_txt = "22" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"nOS" = ( +/obj/structure/transit_tube/curved{ + dir = 1 + }, +/turf/open/space/basic, +/area/space) +"nOZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/caution, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"nPi" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/computer/upload/ai{ + dir = 1 + }, +/obj/machinery/door/window/brigdoor/northright{ + name = "Upload Access"; + req_access_txt = "16" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"nPx" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"nPB" = ( +/obj/machinery/vending/wardrobe/law_wardrobe{ + pixel_x = -4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"nPP" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/heads/hop) +"nPV" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "recycling" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"nPW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"nPX" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"nQe" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"nQk" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/landmark/start/brig_phys, +/turf/open/floor/plasteel/white, +/area/security/brig) +"nQm" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"nQw" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"nQx" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "comms" + }, +/turf/open/floor/plating, +/area/tcommsat/computer) +"nQA" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"nQC" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"nQO" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"nQR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 22 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"nQY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"nRa" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"nRi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"nRx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"nRB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"nRE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"nRU" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"nSb" = ( +/obj/structure/sign/poster/random{ + pixel_x = -32 + }, +/obj/machinery/camera{ + c_tag = "Prison Arcade"; + dir = 4; + network = list("ss13","prison") + }, +/turf/open/floor/carpet, +/area/security/prison) +"nSf" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"nSn" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hydroponics) +"nSo" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"nSp" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/vending/cola/random, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"nSq" = ( +/obj/item/toy/plush/beeplushie, +/obj/structure/rack, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"nSv" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Bar Maintenance"; + req_access_txt = "25" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/bar) +"nSC" = ( +/obj/machinery/light, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"nSD" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"nSE" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) +"nSF" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/obj/item/stamp/law, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"nSM" = ( +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"nSO" = ( +/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/effect/landmark/start/janitor, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel, +/area/janitor) +"nST" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"nSY" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"nTt" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenside"; + name = "Kitchen Hall Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "kitchenside"; + name = "Kitchen Side Shutters"; + pixel_y = 28; + req_access_txt = "28" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"nTw" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"nTA" = ( +/obj/structure/chair/sofa/left{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"nTC" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) +"nTN" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/storage) +"nTR" = ( +/obj/machinery/camera/autoname{ + dir = 5; + network = list("aisat") + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"nTU" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"nTY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"nUd" = ( +/obj/structure/flora/tree/jungle, +/turf/open/floor/grass, +/area/crew_quarters/park) +"nUe" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"nUh" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating, +/area/maintenance/port) +"nUq" = ( +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"nUu" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"nUB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/computer/communications, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"nVb" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"nVd" = ( +/obj/item/stack/cable_coil/red, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"nVg" = ( +/turf/closed/wall/r_wall, +/area/engine/storage_shared) +"nVh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"nVn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"nVy" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"nVQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/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/security/brig) +"nVS" = ( +/obj/structure/chair/sofa/left{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"nWb" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"nWd" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/security/courtroom) +"nWe" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"nWf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall8"; + location = "hall7" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"nWG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"nWN" = ( +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/hor) +"nWP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "qmoffice"; + name = "Quartermaster's Office Shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/quartermaster/qm) +"nXf" = ( +/obj/effect/landmark/start/ai/secondary, +/obj/machinery/door/window{ + dir = 4; + name = "AI Core Door"; + req_access_txt = "16" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"nXg" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"nXm" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"nXv" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/explab) +"nXw" = ( +/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/bridge) +"nXy" = ( +/obj/structure/table/glass, +/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/item/clothing/gloves/color/latex, +/obj/item/clothing/gloves/color/latex, +/obj/item/storage/box/disks{ + pixel_y = 5 + }, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"nXz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"nXH" = ( +/obj/structure/closet/crate/science, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) +"nXK" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace, +/area/quartermaster/exploration_dock) +"nXO" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"nXT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/closed/wall, +/area/quartermaster/miningdock) +"nXY" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"nYh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"nYr" = ( +/obj/structure/flora/ausbushes/palebush, +/turf/open/floor/grass, +/area/crew_quarters/park) +"nYE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/bridge) +"nYG" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/engine_room) +"nYJ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"nYZ" = ( +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"nZi" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/solar/port/fore) +"nZs" = ( +/turf/closed/wall/r_wall, +/area/maintenance/upper/central) +"nZy" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"nZG" = ( +/obj/item/ammo_casing/c9mm{ + pixel_x = 7; + pixel_y = -6 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plating, +/area/maintenance/fore) +"oab" = ( +/obj/structure/reflector/box/anchored{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"oaj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"oal" = ( +/turf/closed/wall, +/area/vacant_room/office) +"oar" = ( +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/secondary) +"oaD" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/sink{ + pixel_y = 28 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"oaN" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/department/science) +"oaS" = ( +/obj/structure/reagent_dispensers/cooking_oil, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"oaY" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/port) +"oba" = ( +/obj/structure/chair/sofa/left{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"obi" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"obn" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/exit/departure_lounge) +"obA" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"obC" = ( +/mob/living/simple_animal/pet/dog/pug, +/turf/open/floor/engine, +/area/science/explab) +"obF" = ( +/obj/item/circuitboard/machine/shuttle/engine/plasma, +/turf/open/space/basic, +/area/space/nearstation) +"obI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"obK" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"obX" = ( +/obj/structure/table/wood, +/obj/item/clothing/glasses/sunglasses/advanced, +/obj/item/clothing/glasses/sunglasses/advanced{ + pixel_x = 1; + pixel_y = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"ocm" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"oct" = ( +/obj/structure/table, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/relay) +"ocC" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"ocQ" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"ocR" = ( +/turf/closed/wall/r_wall, +/area/maintenance/department/science/central) +"ocS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, +/area/science/research) +"ocT" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"ocX" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor{ + base_state = "rightsecure"; + dir = 1; + icon_state = "rightsecure"; + name = "Head of Personnel's Desk"; + req_access_txt = "57" + }, +/obj/machinery/door/window/northleft{ + dir = 2; + name = "Reception Window" + }, +/obj/machinery/door/poddoor/preopen{ + id = "hop"; + name = "privacy shutters" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/hop) +"ocY" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"odc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"odr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/vacant_room/commissary) +"odt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"odG" = ( +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/obj/machinery/power/solar, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/starboard/aft) +"odM" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"odN" = ( +/obj/effect/spawner/room/threexthree, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"odO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/closet/secure_closet/injection, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"odQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"odR" = ( +/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/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"odU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"oef" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"oel" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"oeo" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"oer" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"oeG" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/openspace, +/area/medical/medbay/balcony) +"ofn" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"ofu" = ( +/obj/effect/turf_decal/tile/blue, +/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) +"ofz" = ( +/obj/machinery/atmospherics/components/binary/volume_pump/on{ + dir = 1; + icon_state = "volpump_on_map-1"; + name = "Cold to Atmos" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"ofB" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"ofI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"ofQ" = ( +/obj/structure/chair/office/light, +/obj/effect/landmark/start/virologist, +/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/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"ofU" = ( +/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, +/area/hallway/primary/fore) +"ogb" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + dir = 4; + freq = 1400; + location = "Medical" + }, +/obj/structure/plasticflaps/opaque, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/turf/open/floor/plasteel, +/area/medical/sleeper) +"ogk" = ( +/turf/open/water/air, +/area/crew_quarters/park) +"ogw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"ogx" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Aux Medical Storage"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ogF" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"ogO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"ohm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/holopad, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"ohq" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/closet/secure_closet/security/engine, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/item/radio/intercom{ + pixel_x = -29; + pixel_y = -29 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/engineering) +"oht" = ( +/obj/machinery/computer/mech_bay_power_console{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/robotics) +"ohv" = ( +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/rods/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/machinery/light, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"ohz" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"ohA" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"ohQ" = ( +/obj/machinery/door/airlock/external{ + name = "Exploration Shuttle Bay" + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"ohW" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/security_space_law, +/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{ + dir = 2 + }, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/medical) +"oie" = ( +/turf/open/floor/carpet/purple, +/area/crew_quarters/heads/hor) +"oim" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"oiz" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"oiE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/chapel{ + dir = 8 + }, +/area/chapel/main/monastery) +"oiF" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Pure to Ports" + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"oiN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"oiR" = ( +/turf/closed/wall/r_wall, +/area/security/checkpoint/customs) +"ojq" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"ojA" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"ojS" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/chemistry) +"ojV" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + 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/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"ojY" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/command/glass{ + name = "Teleporter and Minisat Access"; + req_one_access_txt = "19; 61" + }, +/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, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/bridge) +"okf" = ( +/obj/machinery/telecomms/server/presets/exploration, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/relay) +"okk" = ( +/obj/machinery/chem_master, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"oks" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/storage) +"okt" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"okv" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"oky" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/xenobiology) +"okJ" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"okT" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"olb" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ole" = ( +/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, +/area/gateway) +"oln" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"olp" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"olB" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"olH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"olP" = ( +/obj/machinery/disposal/bin, +/obj/machinery/light, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"olQ" = ( +/obj/machinery/gravity_generator/main/station, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"oma" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"omm" = ( +/obj/structure/bookcase{ + name = "Forbidden Knowledge" + }, +/turf/open/floor/engine/cult, +/area/library) +"omp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/obj/machinery/light_switch{ + pixel_x = -25; + pixel_y = -25 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/cryo) +"omC" = ( +/obj/machinery/hydroponics/constructable, +/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/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hydroponics) +"omG" = ( +/turf/open/space/basic, +/area/space/nearstation) +"omO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"omP" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"omU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/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/effect/turf_decal/tile/purple, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"omX" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"ont" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/airlock/engineering{ + name = "Port Quarter Solar Maintenance"; + req_access_txt = "10" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"onD" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"onN" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"onR" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/bookbinder, +/turf/open/floor/wood, +/area/library) +"onY" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/effect/turf_decal/caution{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"ooa" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"ooG" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"opb" = ( +/obj/structure/table/reinforced, +/obj/item/storage/bag/tray, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"oph" = ( +/obj/machinery/atmospherics/components/binary/volume_pump/on{ + dir = 1; + icon_state = "volpump_on_map-2"; + name = "Gas to Filter" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"opu" = ( +/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/vending/cola/random, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"opx" = ( +/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, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"opD" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, +/area/science/research) +"opQ" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/landmark/start/botanist, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"opR" = ( +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"opX" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "5; 33" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/chemistry/upper) +"oqe" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/bridge) +"oqh" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/stairs{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"oqm" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"oqn" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"oqr" = ( +/turf/open/floor/circuit/green, +/area/security/nuke_storage) +"oqu" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"oqA" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"oqG" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"oqH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"org" = ( +/obj/machinery/dna_scannernew, +/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/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"oru" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/landmark/start/atmospheric_technician, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"orw" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"orK" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Plasma to Pure" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"orM" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"orX" = ( +/obj/machinery/power/solar_control{ + dir = 4 + }, +/obj/structure/cable/white, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"osb" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"ose" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"ost" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"osB" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Storage"; + req_access_txt = "5" + }, +/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/mapping_helpers/airlock/unres, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/medical/storage) +"osK" = ( +/turf/closed/wall/r_wall, +/area/space/nearstation) +"osN" = ( +/obj/structure/closet/crate/goldcrate, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"osQ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"osY" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"osZ" = ( +/obj/machinery/door/poddoor{ + id = "QMLoaddoor2"; + name = "Supply Dock Loading Door" + }, +/obj/machinery/conveyor{ + dir = 8; + id = "QMLoad2" + }, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/quartermaster/storage) +"ota" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"otf" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/circuit/green, +/area/security/nuke_storage) +"otg" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"otV" = ( +/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/white, +/area/medical/surgery/aux) +"oua" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"oub" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"oug" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace/airless, +/area/hallway/upper/secondary/service) +"ouv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery/aux) +"oux" = ( +/obj/structure/table, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/clothing/neck/stethoscope, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_a) +"ouB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/upper/secondary/entry) +"ouD" = ( +/obj/structure/window/reinforced, +/obj/structure/table/wood, +/obj/item/storage/box/bodybags{ + pixel_y = 6 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"ouT" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/landmark/start/station_engineer, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ouU" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/solar/port/fore) +"ovc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"ovi" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/tank_dispenser, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ovk" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"ovB" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + id = "Cell 1"; + name = "Cell 1" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"ovM" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel/dark, +/area/gateway) +"owk" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/openspace, +/area/security/brig) +"owm" = ( +/obj/structure/table/reinforced, +/obj/item/circuitboard/computer/bounty{ + pixel_y = 7 + }, +/obj/item/circuitboard/computer/cargo{ + pixel_x = -1; + pixel_y = 5 + }, +/obj/item/circuitboard/computer/cargo/request{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/circuitboard/computer/mining{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/circuitboard/computer/mining_shuttle{ + pixel_x = -4; + pixel_y = -1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"owE" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"owM" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"oxh" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"oxn" = ( +/obj/machinery/computer/security, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/bridge) +"oxr" = ( +/obj/structure/table/wood, +/obj/machinery/computer/libraryconsole{ + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/library) +"oxt" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"oxB" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/requests_console{ + department = "Court"; + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"oxF" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oyd" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/structure/stairs{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"oym" = ( +/obj/machinery/photocopier, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"oyr" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"oyH" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"oyS" = ( +/obj/structure/rack, +/obj/item/clothing/suit/hooded/wintercoat/cargo, +/obj/item/radio/headset/headset_cargo, +/turf/open/floor/plasteel/white, +/area/quartermaster/storage) +"oyW" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"oze" = ( +/obj/machinery/door/airlock/external{ + name = "MiniSat External Access"; + req_one_access_txt = "65;61" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"ozf" = ( +/obj/machinery/power/smes/engineering{ + charge = 2e+006 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"ozk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/vacant_room/commissary) +"ozl" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"ozn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"ozq" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"ozs" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"ozu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"ozV" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Fuel to Turbine" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"oAb" = ( +/obj/structure/rack, +/obj/item/extinguisher, +/obj/item/extinguisher, +/obj/item/extinguisher, +/obj/item/clothing/head/hardhat/red, +/obj/item/clothing/head/hardhat/red, +/obj/item/clothing/head/hardhat/red, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"oAg" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Medbay Maintenance"; + req_access_txt = "5" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/medical/medbay/balcony) +"oAr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/landmark/start/scientist, +/turf/open/floor/plasteel, +/area/science/lab) +"oAu" = ( +/obj/structure/table/wood, +/obj/item/candle, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"oAO" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/upper/fore) +"oAS" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"oAV" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine, +/area/engine/engine_room) +"oAZ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"oBc" = ( +/obj/item/flashlight/glowstick/red, +/turf/open/floor/plating, +/area/maintenance/port) +"oBj" = ( +/obj/machinery/door/window/eastleft{ + name = "Research and Development Deliveries"; + req_one_access_txt = "7;29" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/lab) +"oBt" = ( +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/maintenance/port) +"oBB" = ( +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/coldroom) +"oBE" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"oBH" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"oBJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"oBO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/main) +"oBQ" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"oBZ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"oCb" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"oCt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oCv" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 8; + name = "Gas to Chamber" + }, +/obj/machinery/light/small, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"oCB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Supply Dock Airlock"; + req_access_txt = "31" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"oCD" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/science/research) +"oCI" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"oCO" = ( +/obj/structure/transit_tube/crossing{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"oCR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/aisat/foyer) +"oCU" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "warehouse" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"oCW" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"oDc" = ( +/obj/machinery/vending/wallmed{ + pixel_x = -32 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_a) +"oDl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research) +"oDp" = ( +/obj/machinery/telecomms/server/presets/science, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/server) +"oDq" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1 + }, +/obj/machinery/airalarm/mixingchamber{ + dir = 4; + pixel_x = -24 + }, +/obj/machinery/camera/autoname{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/mixing/chamber) +"oDw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"oDE" = ( +/turf/open/openspace, +/area/security/nuke_storage) +"oDH" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"oDX" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/northleft{ + dir = 8; + name = "RCD Storage"; + pixel_x = 1; + req_access_txt = "19" + }, +/obj/structure/window/reinforced{ + pixel_y = 1 + }, +/obj/structure/window/reinforced{ + dir = 4; + pixel_y = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"oDZ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/closet/secure_closet/personal/patient, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics/cloning) +"oEk" = ( +/turf/open/openspace, +/area/crew_quarters/bar) +"oEu" = ( +/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/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"oEz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall33"; + location = "hall32" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oEA" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/openspace, +/area/maintenance/upper/central) +"oEG" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 4; + external_pressure_bound = 120; + name = "server vent" + }, +/turf/open/floor/circuit, +/area/science/server) +"oEY" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) +"oFe" = ( +/obj/structure/janitorialcart, +/obj/item/mop, +/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/effect/turf_decal/tile/green, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/janitor) +"oFf" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/sign/departments/minsky/engineering/atmospherics{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"oFo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"oFt" = ( +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/open/floor/plating, +/area/security/brig) +"oFG" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"oFO" = ( +/turf/closed/wall, +/area/medical/morgue) +"oGa" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"oGb" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oGc" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/grass, +/area/hydroponics/garden) +"oGf" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"oGn" = ( +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"oGA" = ( +/obj/structure/lattice, +/obj/item/stack/rods, +/turf/open/space/basic, +/area/space/nearstation) +"oGC" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"oGF" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"oGG" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "49" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/quartermaster/exploration_dock) +"oGK" = ( +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/space/nearstation) +"oGP" = ( +/obj/machinery/flasher{ + id = "leftcheckpointflash"; + pixel_x = -25; + pixel_y = 26 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"oHa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"oHh" = ( +/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/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"oHl" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"oHv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"oHN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"oHO" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_y = -25 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"oHR" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"oHY" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"oId" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"oIg" = ( +/obj/item/pickaxe, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"oIm" = ( +/turf/closed/wall, +/area/medical/medbay/central) +"oIs" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/obj/item/reagent_containers/food/snacks/grown/harebell, +/obj/item/reagent_containers/food/snacks/grown/harebell, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"oIF" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/sign/departments/xenobio{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oII" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"oIJ" = ( +/obj/effect/turf_decal/tile/neutral{ + 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/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"oIO" = ( +/obj/structure/table/reinforced, +/obj/item/assembly/signaler{ + pixel_x = -1; + pixel_y = 5 + }, +/obj/item/assembly/signaler{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/item/assembly/signaler{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/assembly/signaler{ + pixel_x = -7; + pixel_y = 2 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 8; + pixel_y = -1 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 7; + pixel_y = -2 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 6; + pixel_y = -3 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 5; + pixel_y = -4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"oIV" = ( +/obj/machinery/door/airlock/external{ + name = "Auxiliary Escape Airlock" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/science) +"oJl" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"oJv" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/computer/cargo/request{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"oJz" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"oJA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/storage/art) +"oJK" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/medical) +"oJO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"oJS" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"oKv" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "research_shutters"; + name = "research shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/science/lab) +"oKL" = ( +/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/dark, +/area/hallway/primary/central) +"oKN" = ( +/obj/machinery/airalarm/server{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"oKO" = ( +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/grass, +/area/crew_quarters/park) +"oLa" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"oLd" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/security/armory) +"oLi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"oLp" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"oLq" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/poddoor/shutters{ + id = "commissaryshutter"; + name = "Vacant Commissary Shutter" + }, +/turf/open/floor/plasteel, +/area/vacant_room/commissary) +"oLy" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_c) +"oLE" = ( +/obj/structure/alien/egg/burst, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"oLK" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"oLS" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/light/small, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"oMd" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"oMg" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"oMm" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"oMB" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oME" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/gateway) +"oMK" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/aisat_interior) +"oMZ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/vending/cigarette, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"oNf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 9 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"oNh" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"oNC" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"oND" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"oNJ" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"oNL" = ( +/obj/structure/railing, +/turf/open/openspace, +/area/hallway/upper/secondary/exit/departure_lounge) +"oNY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oNZ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"oOb" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"oOi" = ( +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"oOr" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/vending/coffee, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"oOw" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"oOy" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/security/checkpoint/supply) +"oOz" = ( +/obj/structure/table, +/obj/item/circular_saw{ + pixel_y = 3 + }, +/obj/item/scalpel{ + pixel_y = 14 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/item/surgical_drapes{ + pixel_y = 4 + }, +/turf/open/floor/plasteel/white/side, +/area/medical/surgery/aux) +"oOA" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L5" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oOM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 1 + }, +/turf/open/floor/plating, +/area/security/brig) +"oOR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"oPf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"oPl" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"oPy" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"oPR" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"oPS" = ( +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/closed/wall/r_wall, +/area/engine/atmospherics_engine) +"oPT" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"oPU" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"oQi" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "0"; + req_one_access_txt = "12,47" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"oQp" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/seeds/sugarcane, +/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/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/security/prison) +"oQq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"oQr" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"oQx" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai) +"oQy" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"oRb" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"oRi" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/sign/departments/minsky/supply/mining{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"oRo" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Service Hallway"; + pixel_x = -32 + }, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"oRs" = ( +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/science/research) +"oRx" = ( +/obj/structure/chair, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery/aux) +"oRM" = ( +/turf/open/floor/plating, +/area/construction/mining/aux_base) +"oRO" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"oRR" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"oSc" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"oSf" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/two, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"oSl" = ( +/obj/machinery/gateway/centerstation, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/gateway) +"oSt" = ( +/obj/effect/landmark/start/geneticist, +/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/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics/cloning) +"oSF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"oSK" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Garden" + }, +/turf/open/floor/plating, +/area/hydroponics/garden) +"oSR" = ( +/obj/structure/table/reinforced, +/obj/item/coin/antagtoken, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/security/prison) +"oSZ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"oTb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oTH" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"oTO" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 8 + }, +/obj/machinery/advanced_airlock_controller{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"oTS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"oTW" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oUc" = ( +/obj/structure/transit_tube/curved/flipped{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat/foyer) +"oUk" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/turf/open/space/basic, +/area/space) +"oUm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light_switch{ + pixel_x = 24; + pixel_y = -25 + }, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "comms"; + name = "Communications Shutters"; + normaldoorcontrol = 0; + pixel_x = 26; + pixel_y = -38 + }, +/obj/machinery/announcement_system, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"oUw" = ( +/obj/machinery/light/small/broken{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"oUz" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/turf/open/floor/wood, +/area/vacant_room/office) +"oUE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/security/brig) +"oUF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"oUN" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"oVb" = ( +/obj/machinery/vending/snack/random, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/white, +/area/security/brig) +"oVq" = ( +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/white, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"oVB" = ( +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"oVD" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oVE" = ( +/obj/machinery/vending/snack/random, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/lobby) +"oVK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/igniter/incinerator_atmos, +/obj/machinery/air_sensor/atmos/incinerator_tank{ + pixel_x = 32; + pixel_y = -32 + }, +/turf/open/floor/engine/vacuum, +/area/engine/atmospherics_engine) +"oVQ" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/medical/chemistry/upper) +"oVY" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oWc" = ( +/obj/structure/table/glass, +/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/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/reagent_containers/food/drinks/bottle/virusfood, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"oWg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"oWn" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"oWu" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Break Area" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"oWE" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L4" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oWT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"oWX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery/aux) +"oXe" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"oXi" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"oXt" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"oXG" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white/corner, +/area/science/research) +"oXK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"oXV" = ( +/obj/machinery/gateway{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/dark, +/area/gateway) +"oYi" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"oYB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"oYD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"oYL" = ( +/obj/machinery/door/airlock/research{ + name = "Toxins Storage"; + req_access_txt = "8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/storage) +"oYP" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oYS" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"oZs" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/assistant, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"oZx" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/sink{ + dir = 8; + pixel_x = -14; + pixel_y = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"oZG" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"oZK" = ( +/obj/structure/rack{ + pixel_x = -2 + }, +/obj/effect/spawner/lootdrop/maintenance/two, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/wood, +/area/library) +"oZN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall14"; + location = "hall13" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"oZO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"oZR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/shuttle) +"pao" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"pas" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"paF" = ( +/obj/machinery/power/supermatter_crystal/shard/engine{ + anchored = 1; + moveable = 1 + }, +/obj/machinery/mass_driver{ + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70); + critical_machine = 1; + dir = 8; + id = "smeject"; + name = "emergency supermatter ejection pad" + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"paO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"paP" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"pbb" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"pbc" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table/reinforced, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/mineral/copper{ + amount = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage_shared) +"pbe" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/chapel{ + dir = 5 + }, +/area/chapel/main/monastery) +"pbm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"pbB" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"pbD" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Security Maintenance"; + req_access_txt = "63" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"pbN" = ( +/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"pbO" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/structure/chair/comfy/brown, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"pbQ" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 2 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"pbW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"pbY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"pbZ" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/carpet/purple, +/area/vacant_room/office) +"pcf" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/openspace, +/area/maintenance/upper/central) +"pcm" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/sign/departments/minsky/medical/chemistry/chemical2{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"pcv" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"pcD" = ( +/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/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"pcF" = ( +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"pcU" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/obj/effect/landmark/start/bartender, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"pda" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/drinks/beer, +/turf/open/floor/wood, +/area/maintenance/port) +"pde" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Arrivals Airlock"; + req_access_txt = "101" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"pdj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"pdk" = ( +/obj/structure/chair/comfy, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"pdo" = ( +/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, +/area/hallway/primary/fore) +"pdt" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "ceprivacy"; + name = "privacy shutter" + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/checkpoint/engineering) +"pdI" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + 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/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"pdJ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"pdR" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"pdV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"pdX" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/power/deck_relay{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"pdZ" = ( +/obj/machinery/door/airlock/research{ + name = "Mech Bay"; + req_access_txt = "29" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/science/robotics) +"peh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/secondary) +"pez" = ( +/obj/structure/closet/secure_closet/captains, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"peO" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/eastright{ + dir = 1; + name = "Robotics Desk"; + req_access_txt = "29" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics_shutters"; + name = "robotics shutters" + }, +/obj/item/paper_bin, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/science/robotics/lab) +"pfl" = ( +/obj/structure/stairs{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"pfm" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"pfv" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"pfK" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/start/medical_doctor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"pfN" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"pfS" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"pgc" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"pgl" = ( +/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, +/area/medical/chemistry/upper) +"pgo" = ( +/obj/structure/window/reinforced, +/obj/item/target, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/science/test_area) +"pgp" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"pgu" = ( +/obj/machinery/door/airlock/external{ + name = "Labour Shuttle" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"pgx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"pgB" = ( +/obj/effect/spawner/structure/window, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"pgE" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/stairs{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"pgF" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L7" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"pgV" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"pha" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"phb" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"phc" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/button/ignition{ + pixel_x = 4; + pixel_y = 27 + }, +/obj/machinery/button/door{ + desc = "Welcome to your new life, employee."; + id = "deathdoor"; + name = "Transfer Switch"; + normaldoorcontrol = 0; + pixel_x = -6; + pixel_y = 27 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"phd" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"phj" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal) +"php" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"phr" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"phC" = ( +/obj/machinery/light/small/broken{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"phE" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"phI" = ( +/obj/machinery/computer/station_alert{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) +"phM" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"phV" = ( +/obj/machinery/shower{ + pixel_y = 16 + }, +/turf/open/floor/noslip/dark, +/area/engine/engineering) +"pif" = ( +/turf/open/floor/engine, +/area/quartermaster/exploration_dock) +"pij" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/obj/structure/closet/secure_closet/exile, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/gateway) +"pil" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/item/clothing/glasses/blindfold, +/obj/item/clothing/mask/balaclava, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/decal/cleanable/blood/old, +/obj/item/electropack, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"pim" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Interrogation Room"; + req_one_access_txt = "1;4" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"piz" = ( +/obj/structure/chair/office/light{ + dir = 8; + pixel_y = 3 + }, +/obj/effect/landmark/start/chief_engineer, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"piK" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/closet/secure_closet/hydroponics, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"piL" = ( +/obj/structure/sign/warning/securearea{ + pixel_x = 32 + }, +/obj/effect/landmark/carpspawn, +/turf/open/space/basic, +/area/space) +"piO" = ( +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"piW" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/dresser, +/obj/machinery/camera/autoname{ + dir = 9 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics/cloning) +"pje" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/engineering) +"pjf" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"pjh" = ( +/turf/closed/wall/r_wall, +/area/maintenance/port/fore) +"pji" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"pju" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medical_shutters"; + name = "medical shutters" + }, +/obj/item/reagent_containers/glass/bottle/epinephrine, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "medbay interior"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"pjU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"pjZ" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/turf/open/openspace/airless, +/area/space/nearstation) +"pkg" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"pkn" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"pko" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"pkt" = ( +/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/dark, +/area/hallway/primary/central) +"pkH" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"pkR" = ( +/obj/structure/ladder, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"pkT" = ( +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"pkW" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/storage/fancy/candle_box, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"plh" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxin_input, +/turf/open/floor/engine/plasma, +/area/engine/atmos) +"pln" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"plx" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"plB" = ( +/obj/machinery/pdapainter{ + pixel_x = 1; + pixel_y = 8 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/noticeboard/hop{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"plF" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "qmoffice"; + name = "Quartermaster's Office Shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/quartermaster/qm) +"plH" = ( +/obj/machinery/computer/atmos_control/tank/mix_tank{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"plN" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"pma" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"pmf" = ( +/turf/open/floor/engine/o2, +/area/engine/atmos) +"pmo" = ( +/obj/structure/chair/sofa/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/maintenance/port) +"pmv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"pmw" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"pmM" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"pmN" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"pmS" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"pmV" = ( +/obj/structure/chair/office, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"pni" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Interrogation Room"; + req_one_access_txt = "1;4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"pnr" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"pny" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"pob" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/drinks, +/turf/open/floor/wood, +/area/maintenance/port) +"pok" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"pos" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/table/reinforced, +/obj/item/clothing/mask/balaclava, +/obj/item/reagent_containers/syringe, +/obj/machinery/requests_console{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"poy" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"poC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/minor/kittyears_or_rabbitears, +/obj/effect/spawner/lootdrop/minor/pirate_or_bandana, +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plating, +/area/maintenance/fore) +"poE" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"poG" = ( +/obj/effect/spawner/room/fivexthree, +/turf/open/floor/plating, +/area/maintenance/fore) +"poN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/flashlight/glowstick/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"ppa" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"pph" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/closet/secure_closet/engineering_personal, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ppk" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"ppl" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/atmospherics_engine) +"ppq" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/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/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ppu" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"ppw" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"ppP" = ( +/obj/structure/closet/crate, +/obj/item/stack/ore/iron, +/obj/item/stack/ore/iron, +/obj/item/stack/ore/iron, +/obj/item/stack/ore/iron, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"ppR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/engine/engineering) +"pqg" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"pqn" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"pqr" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 1 + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"pqt" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio2"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"pqu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"pqv" = ( +/turf/closed/wall, +/area/science/shuttle) +"pqy" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"pqA" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/wood, +/area/library) +"pqF" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"pqM" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/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/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"pqN" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"pqP" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/chapel{ + dir = 9 + }, +/area/chapel/main/monastery) +"pre" = ( +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"prf" = ( +/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/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"prg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload) +"prq" = ( +/turf/closed/wall, +/area/hydroponics) +"prB" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "recycling" + }, +/obj/machinery/recycler, +/turf/open/floor/plating, +/area/maintenance/disposal) +"prP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"prQ" = ( +/obj/machinery/rnd/experimentor, +/turf/open/floor/engine, +/area/science/explab) +"prS" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"prT" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"prW" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"psc" = ( +/obj/structure/table/wood, +/obj/item/pinpointer/nuke, +/obj/item/disk/nuclear, +/obj/machinery/recharger, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Captain's Desk"; + departmentType = 5; + name = "Captain RC"; + pixel_x = 32 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"psv" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"psx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light_switch{ + pixel_x = 26; + pixel_y = 28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"psA" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/razor{ + pixel_x = -9; + pixel_y = 4 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"psZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/maintenance/upper/aft) +"ptf" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"pty" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ptT" = ( +/obj/structure/bed/dogbed/ian, +/obj/machinery/camera/autoname, +/mob/living/simple_animal/pet/dog/corgi/Ian, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/hop) +"puh" = ( +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics Control Room"; + req_access_txt = "24" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"puq" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"puR" = ( +/obj/structure/chair, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"puU" = ( +/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/shuttle) +"puX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/library) +"pvk" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"pvl" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"pvw" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"pvE" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/storage/tools) +"pvQ" = ( +/obj/structure/transit_tube/crossing{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"pvR" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"pwb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"pwg" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"pwi" = ( +/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/effect/turf_decal/tile/green, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters{ + id = "custodialshutters"; + name = "Custodial Closet Shutters" + }, +/obj/machinery/button/door{ + id = "custodialshutters"; + name = "Custodial Shutters"; + pixel_x = 1; + pixel_y = 28; + req_access_txt = "26" + }, +/turf/open/floor/plasteel, +/area/janitor) +"pwl" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"pwr" = ( +/obj/machinery/newscaster{ + pixel_x = 30 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/monofloor{ + dir = 4 + }, +/area/quartermaster/exploration_prep) +"pwK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/medical/medbay/aft) +"pwS" = ( +/obj/machinery/requests_console{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/recharge_floor, +/area/science/robotics) +"pwX" = ( +/obj/item/screwdriver, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"pxq" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"pxx" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"pxQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 2; + external_pressure_bound = 120; + name = "server vent" + }, +/turf/open/floor/circuit/telecomms, +/area/science/xenobiology) +"pyf" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson{ + pixel_y = 2 + }, +/obj/item/clothing/glasses/meson{ + pixel_y = 4 + }, +/obj/item/stack/cable_coil/green, +/obj/item/stack/cable_coil/green, +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 + }, +/obj/item/rcl/pre_loaded, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"pyl" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"pyo" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"pyp" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/hallway/secondary/command) +"pys" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/railing{ + dir = 1 + }, +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"pyL" = ( +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/structure/table/glass, +/obj/structure/sign/poster/random{ + pixel_y = -32 + }, +/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/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"pyO" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/sign/departments/minsky/supply/janitorial{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"pyS" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/seeds/wheat, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"pyT" = ( +/obj/machinery/power/deck_relay{ + pixel_y = 32 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/security/brig) +"pzl" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"pzG" = ( +/obj/item/hand_tele{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/machinery/door/window/brigdoor/northleft{ + name = "Captain's Storage"; + req_access_txt = "20" + }, +/obj/structure/table/wood, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain/private) +"pzK" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"pAb" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"pAh" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science{ + req_access_txt = "49" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"pAi" = ( +/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/primary/central) +"pAo" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"pAt" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/item/radio, +/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/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/item/radio/intercom{ + pixel_x = -29; + pixel_y = -29 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/science) +"pAz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"pAA" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/heat_exchanger{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"pAD" = ( +/obj/structure/chair/comfy/black, +/turf/open/floor/wood, +/area/maintenance/port) +"pAE" = ( +/obj/machinery/door/airlock/research{ + id_tag = "ResearchExt"; + name = "Research Division"; + req_one_access_txt = "47" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/science/research) +"pAL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"pBA" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_x = 28 + }, +/turf/open/floor/grass, +/area/crew_quarters/park) +"pBP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"pBQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/engine/gravity_generator) +"pBV" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"pCe" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/openspace, +/area/medical/medbay/balcony) +"pCg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"pCn" = ( +/obj/structure/closet/secure_closet/brig{ + id = "Cell 3"; + name = "Cell 3 Locker" + }, +/turf/open/floor/carpet/blue, +/area/security/brig) +"pCq" = ( +/obj/effect/landmark/start/bartender, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"pCu" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"pCL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"pDg" = ( +/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/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"pDo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"pDt" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"pDx" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"pDD" = ( +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"pDH" = ( +/obj/structure/transit_tube/curved{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"pDI" = ( +/obj/machinery/biogenerator, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"pDL" = ( +/obj/structure/railing, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"pDN" = ( +/obj/effect/landmark/start/station_engineer, +/obj/machinery/holopad, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/engine/storage_shared) +"pDS" = ( +/obj/structure/window/reinforced/spawner, +/obj/machinery/light/small, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/AIsatextAP) +"pEj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"pEk" = ( +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"pEl" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"pEm" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/computer/security/hos{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"pEs" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/stairs/left{ + dir = 1 + }, +/area/hallway/secondary/service) +"pEB" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"pEU" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"pFt" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"pFC" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"pFE" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"pFN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + 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/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"pGd" = ( +/obj/structure/filingcabinet, +/obj/item/folder/documents, +/obj/structure/sign/warning/explosives{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"pGr" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"pGy" = ( +/obj/structure/cable/yellow{ + 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/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"pGC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"pGH" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/space/nearstation) +"pGL" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"pHd" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "virology"; + name = "Virology Lockdown Shutters" + }, +/turf/open/floor/plating, +/area/medical/virology) +"pHe" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/obj/item/nullrod, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"pHh" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"pHi" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/hallway/secondary/entry) +"pHn" = ( +/obj/structure/table/wood, +/obj/item/folder/blue, +/turf/open/floor/carpet/purple, +/area/vacant_room/office) +"pHu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/medical/sleeper) +"pHv" = ( +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = -8 + }, +/obj/structure/sign/directions/supply{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/security/brig) +"pHw" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/newscaster{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"pHB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/structure/ore_box, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"pHF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"pHM" = ( +/obj/effect/landmark/start/cyborg, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/obj/machinery/recharge_station, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/circuit/green, +/area/science/robotics) +"pHW" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"pHY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"pIf" = ( +/obj/machinery/flasher{ + id = "aicore"; + pixel_y = 26; + range = 2 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"pIh" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"pIk" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"pIp" = ( +/obj/structure/closet/secure_closet/hydroponics, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"pIw" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"pIy" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"pIA" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"pIH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/closed/wall, +/area/maintenance/starboard/fore) +"pIO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + 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/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"pIU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/sign/poster/random{ + pixel_y = -32 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"pJf" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/openspace, +/area/medical/medbay/balcony) +"pJl" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"pJs" = ( +/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/maintenance/department/science) +"pJE" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"pJM" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/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, +/area/hallway/primary/fore) +"pJQ" = ( +/obj/structure/displaycase/labcage, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/hor) +"pJW" = ( +/obj/machinery/status_display/ai{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"pKd" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + pixel_y = 1 + }, +/obj/structure/flora/ausbushes/lavendergrass, +/obj/structure/flora/ausbushes/grassybush, +/turf/open/floor/grass, +/area/library) +"pKl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/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/engine/engineering) +"pKo" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"pKp" = ( +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_x = 3; + pixel_y = 8 + }, +/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/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"pKz" = ( +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/science/research) +"pKB" = ( +/obj/machinery/camera/autoname{ + dir = 1; + network = list("aicore") + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"pKG" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"pKT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/paicard, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"pKY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"pKZ" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"pLh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"pLi" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"pLq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"pLE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"pLG" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"pLI" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) +"pLL" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/dorms) +"pLN" = ( +/turf/open/floor/plating/airless, +/area/science/test_area) +"pLW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"pMx" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L12" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"pMy" = ( +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"pMC" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"pMM" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/theatre) +"pNb" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"pNr" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/flasher{ + id = "aicore"; + pixel_x = -26; + range = 2 + }, +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"pNt" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"pNB" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"pNC" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"pNK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"pNZ" = ( +/turf/closed/wall/r_wall, +/area/maintenance/port/central) +"pOf" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"pOi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"pOr" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000 + }, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000; + pixel_x = 5; + pixel_y = 8 + }, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000; + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/screwdriver{ + pixel_y = 16 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"pOx" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge Access"; + req_access_txt = "19" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/bridge) +"pOE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/relay) +"pOF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/frame/computer{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"pOL" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "shower1a" + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/toilet) +"pON" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"pOS" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"pOT" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"pPg" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"pPh" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"pPk" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engine_room) +"pPr" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/stairs, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"pPu" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/landmark/start/lawyer, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light_switch{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"pPv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"pPw" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/relay) +"pPA" = ( +/obj/structure/sign/poster/random{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"pPJ" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"pPU" = ( +/obj/machinery/door_timer{ + id = "Cell 3"; + name = "Cell 3"; + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"pPZ" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"pQe" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio1"; + name = "containment blast door" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"pQk" = ( +/obj/machinery/doorButtons/airlock_controller{ + idExterior = "xeno_airlock_exterior"; + idInterior = "xeno_airlock_interior"; + idSelf = "xeno_airlock_control"; + name = "Access Console"; + pixel_x = -32; + pixel_y = 32; + req_access_txt = "55" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"pQo" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/openspace, +/area/engine/engine_room) +"pQs" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/hallway/primary/fore) +"pQt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"pQI" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 26 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"pQS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/stool, +/turf/open/floor/plasteel/dark, +/area/vacant_room/commissary) +"pQW" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/plating, +/area/security/brig) +"pQZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"pRc" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"pRh" = ( +/obj/effect/turf_decal/delivery, +/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/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"pRz" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"pRR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"pRX" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat AI Access"; + req_access_txt = "65" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"pSc" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/obj/machinery/door/airlock/research/glass{ + name = "Xenobiology Kill Room"; + req_access_txt = "47" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/science/xenobiology) +"pSq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"pSv" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"pSA" = ( +/obj/structure/closet/secure_closet/quartermaster, +/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/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"pSF" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"pSN" = ( +/obj/structure/chair/office, +/turf/open/floor/wood, +/area/vacant_room/office) +"pSO" = ( +/obj/machinery/door/airlock/public/glass, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"pTc" = ( +/obj/machinery/computer/cloning{ + dir = 4 + }, +/obj/machinery/light{ + 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/airalarm/directional/west, +/turf/open/floor/plasteel/techmaint, +/area/medical/genetics/cloning) +"pTm" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ai_monitored/turret_protected/aisat_interior) +"pTA" = ( +/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, +/area/hallway/upper/secondary/entry) +"pUa" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile{ + dir = 8 + }, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/computer/cargo/request{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"pUg" = ( +/obj/structure/table/reinforced, +/obj/item/circuitboard/computer/comm_monitor{ + pixel_x = -12; + pixel_y = 7 + }, +/obj/item/circuitboard/computer/comm_server{ + pixel_x = -13; + pixel_y = 5 + }, +/obj/item/circuitboard/computer/message_monitor{ + pixel_x = -14; + pixel_y = 3 + }, +/obj/item/circuitboard/machine/announcement_system{ + pixel_x = -15; + pixel_y = 1 + }, +/obj/item/circuitboard/machine/ntnet_relay{ + pixel_x = -16; + pixel_y = -1 + }, +/obj/item/circuitboard/machine/grounding_rod{ + pixel_x = 8; + pixel_y = 7 + }, +/obj/item/circuitboard/machine/rad_collector{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/item/circuitboard/machine/smes{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/circuitboard/machine/rad_collector{ + pixel_x = 5; + pixel_y = 1 + }, +/obj/item/circuitboard/machine/rad_collector{ + pixel_x = 4; + pixel_y = -1 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"pUh" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + 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/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"pUk" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"pUq" = ( +/obj/machinery/door/airlock/public, +/turf/open/floor/wood, +/area/library) +"pUr" = ( +/obj/machinery/computer/apc_control{ + dir = 1 + }, +/obj/machinery/keycard_auth{ + pixel_x = -27; + pixel_y = -25 + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"pUs" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"pUy" = ( +/obj/structure/rack{ + pixel_y = -3 + }, +/obj/effect/spawner/lootdrop/gambling, +/obj/structure/sign/plaques/kiddie/library{ + pixel_y = -32 + }, +/obj/machinery/light, +/turf/open/floor/wood, +/area/library) +"pUJ" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Recreation Park" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/park) +"pUT" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"pUX" = ( +/obj/machinery/light/small, +/turf/open/openspace, +/area/maintenance/upper/central) +"pUY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/shutters{ + id = "aicoremain" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"pVa" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"pVh" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"pVF" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"pVR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"pVW" = ( +/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/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/bridge) +"pVZ" = ( +/obj/structure/table, +/obj/item/paper/guides/jobs/engi/gravity_gen, +/obj/item/pen/blue, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"pWe" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"pWi" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"pWn" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"pWp" = ( +/obj/effect/landmark/carpspawn, +/turf/open/openspace/airless, +/area/space) +"pWv" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/delivery, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"pWx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/glass, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/gateway) +"pWI" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"pWK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"pWN" = ( +/obj/structure/closet/toolcloset, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"pWQ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"pWR" = ( +/obj/structure/toilet{ + dir = 8 + }, +/turf/open/floor/noslip/white, +/area/quartermaster/qm) +"pXt" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -4; + pixel_y = 2 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"pXv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"pXK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/chapel{ + dir = 10 + }, +/area/chapel/main/monastery) +"pXS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/carpet/orange, +/area/quartermaster/qm) +"pYb" = ( +/obj/effect/landmark/blobstart, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"pYM" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"pYP" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"pYS" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Funeral Parlour" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"pYT" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"pZe" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry Lab"; + req_access_txt = "5; 33" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"pZg" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"pZi" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"pZj" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"pZs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"pZu" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"pZD" = ( +/obj/machinery/power/solar_control{ + dir = 8 + }, +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"pZT" = ( +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/obj/effect/mapping_helpers/airlock/unres, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"qag" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"qai" = ( +/obj/structure/rack, +/obj/item/shield/riot, +/obj/item/shield/riot{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"qar" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L8" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qat" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"qaD" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"qaH" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"qaK" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"qaM" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"qaQ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"qaS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) +"qaU" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"qaW" = ( +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/beaker/large, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"qaZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"qbd" = ( +/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/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"qbh" = ( +/obj/structure/transit_tube{ + dir = 8 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"qbq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"qbP" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"qca" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"qcc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/engine/vacuum, +/area/engine/atmospherics_engine) +"qcd" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"qcf" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"qcs" = ( +/obj/machinery/button/door{ + id = "Dorm3"; + name = "Dormitory Door Lock"; + normaldoorcontrol = 1; + pixel_y = -28; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"qcu" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"qcS" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/transit_tube/station/reverse{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/secondary) +"qdd" = ( +/obj/machinery/mass_driver{ + dir = 4; + id = "trash" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"qdk" = ( +/obj/machinery/button/door{ + id = "isolb"; + name = "Privacy Shutters"; + pixel_x = -28; + pixel_y = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_b) +"qdt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qdu" = ( +/turf/closed/wall, +/area/maintenance/upper/fore) +"qdw" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"qdD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"qdN" = ( +/turf/closed/wall, +/area/crew_quarters/heads/captain) +"qdU" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = -4; + pixel_y = 10 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/theatre) +"qed" = ( +/obj/structure/table/glass, +/obj/item/candle, +/obj/item/reagent_containers/food/drinks/soda_cans/cola{ + pixel_x = -7; + pixel_y = 10 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/newscaster{ + pixel_y = -30 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qef" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"qen" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Robotics Lab"; + req_access_txt = "29" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/science/robotics) +"qep" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"qeB" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/obj/item/radio/intercom{ + pixel_y = 28 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"qeO" = ( +/obj/structure/table, +/obj/item/mmi, +/obj/item/mmi, +/obj/item/mmi, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"qeS" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"qeU" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qfv" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qfw" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Airlock"; + req_access_txt = "63" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"qfy" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/fore) +"qfz" = ( +/obj/machinery/vending/cola/random, +/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/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/medical/medbay/lobby) +"qfD" = ( +/obj/machinery/door/poddoor/shutters{ + id = "gateway" + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"qfE" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Security Maintenance"; + req_access_txt = "63" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/security/brig) +"qfM" = ( +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"qfP" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/button/door{ + id = "atmos"; + name = "Atmospherics Lockdown"; + pixel_x = 28; + pixel_y = 27 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"qfQ" = ( +/obj/structure/sign/directions/supply{ + dir = 1 + }, +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = -8 + }, +/obj/structure/sign/directions/engineering{ + dir = 1; + pixel_y = 8 + }, +/obj/structure/sign/directions/evac{ + dir = 1; + pixel_y = 16 + }, +/turf/closed/wall, +/area/hallway/secondary/service) +"qga" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"qgh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"qgk" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/transit_tube/diagonal, +/turf/open/space/basic, +/area/space) +"qgw" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace/airless, +/area/space/nearstation) +"qgO" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"qhi" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"qhp" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"qhr" = ( +/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/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"qhu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"qhv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"qhM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/engine/storage) +"qhS" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"qij" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/spawner/lootdrop/glowstick, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"qik" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"qim" = ( +/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/effect/turf_decal/tile/green, +/obj/item/toy/figure/janitor, +/obj/item/storage/box/mousetraps, +/obj/item/restraints/legcuffs/beartrap, +/obj/structure/table, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/janitor) +"qis" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/storage/photo_album{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/pen/invisible{ + pixel_x = 2; + pixel_y = 3 + }, +/turf/open/floor/engine/cult, +/area/library) +"qiN" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"qiW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/solars/port/aft) +"qjn" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"qjr" = ( +/obj/structure/chair/comfy, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"qjC" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/three, +/turf/open/floor/plating, +/area/maintenance/department/science) +"qjI" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall22"; + location = "hall21" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"qjV" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engine Room"; + req_access_txt = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"qka" = ( +/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/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"qkh" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/table, +/obj/item/stack/sheet/plasteel{ + amount = 10 + }, +/obj/item/stack/rods/fifty, +/obj/item/storage/box/lights/mixed, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) +"qkk" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/brig) +"qkm" = ( +/obj/structure/chair/office, +/obj/effect/landmark/start/warden, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "secmain"; + name = "Security Exterior Blast Doors"; + pixel_x = -28; + pixel_y = -26; + req_access_txt = "2" + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"qks" = ( +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Bar Panel" + }, +/turf/open/floor/wood, +/area/maintenance/port) +"qky" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"qlg" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"qln" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/security/brig) +"qlp" = ( +/obj/machinery/power/emitter/anchored{ + dir = 4; + state = 2 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"qls" = ( +/obj/structure/sign/departments/minsky/research/research{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/science/research) +"qlw" = ( +/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) +"qly" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"qlz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"qlF" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qlR" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/cmo, +/obj/effect/turf_decal/tile{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/keycard_auth{ + pixel_x = -26; + pixel_y = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"qmc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/turf/open/floor/noslip/standard, +/area/hallway/secondary/service) +"qmi" = ( +/obj/structure/chair/pew/right{ + dir = 8 + }, +/turf/open/floor/plasteel/chapel, +/area/chapel/main/monastery) +"qmn" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Break Area" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"qmp" = ( +/turf/open/floor/wood, +/area/hallway/primary/fore) +"qmq" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"qmr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 1; + name = "Thermoelectric generator bypass" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"qmu" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal) +"qmB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 + }, +/turf/open/floor/plating, +/area/science/misc_lab/range) +"qmH" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/hallway/primary/fore) +"qmK" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/mob/living/carbon/monkey, +/turf/open/floor/plasteel/freezer, +/area/medical/genetics) +"qmV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"qne" = ( +/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, +/area/medical/chemistry/upper) +"qnh" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"qnl" = ( +/obj/effect/turf_decal/delivery, +/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/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"qno" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/stairs{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/flasher{ + id = "aicore"; + pixel_y = 36; + range = 2 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"qnw" = ( +/obj/structure/table/glass, +/obj/machinery/reagentgrinder, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/item/stack/sheet/mineral/plasma{ + amount = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"qnx" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"qnU" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/sign/poster/random{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"qof" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/sorting/mail{ + dir = 1; + sortType = 29 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"qos" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"qox" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"qoI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"qoV" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"qoW" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"qpn" = ( +/obj/machinery/door/window/brigdoor{ + name = "Telecommunications"; + req_access_txt = "61" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/relay) +"qpo" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/medical/surgery/aux) +"qpp" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/monkey_recycler, +/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/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"qpv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + id_tag = "innerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"qpz" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"qpI" = ( +/obj/structure/lattice/catwalk, +/obj/structure/ladder, +/turf/open/openspace, +/area/ai_monitored/security/armory) +"qpK" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/rnd/production/techfab/department/security, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"qpN" = ( +/turf/closed/wall, +/area/medical/storage) +"qpZ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/teleporter) +"qqf" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/door/window/northleft{ + dir = 2; + name = "Kitchen Delivery"; + req_access_txt = "28" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) +"qqj" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"qqr" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"qqJ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/landmark/start/cargo_technician, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"qqM" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/item/wrench, +/turf/open/floor/engine, +/area/engine/engine_room) +"qqQ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"qrn" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio8"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"qrr" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"qru" = ( +/obj/machinery/power/terminal, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"qrv" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/telecomms/message_server/preset, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) +"qrz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/main) +"qrA" = ( +/obj/machinery/door/airlock/medical{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"qrJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"qrR" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"qrX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/machinery/light, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/science/misc_lab/range) +"qrZ" = ( +/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/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"qse" = ( +/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/turf_decal/tile, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"qsn" = ( +/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/turf_decal/tile, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"qso" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 9; + height = 25; + id = "emergency_home"; + name = "MetaStation emergency evac bay"; + width = 29 + }, +/turf/open/space/basic, +/area/space) +"qsP" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hydroponics) +"qsU" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"qsZ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/vehicle/ridden/wheelchair{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"qtb" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/chair/office/light, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_c) +"qte" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/security/courtroom) +"qtg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"qtk" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace/airless, +/area/space/nearstation) +"qtt" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"qtE" = ( +/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/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"qtG" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Botany Hallway" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"qtU" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"qtX" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"quc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"qug" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engineering Foyer"; + req_one_access_txt = "32;19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable/yellow{ + 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/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qui" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"qun" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"quv" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/security/prison) +"quD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/fore) +"quO" = ( +/obj/structure/table/glass, +/obj/item/storage/box/beakers{ + pixel_x = 3; + pixel_y = 7 + }, +/obj/item/storage/box/beakers{ + pixel_y = 4 + }, +/obj/item/storage/box/syringes{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/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 + }, +/turf/open/floor/plasteel, +/area/medical/storage) +"quU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/falsewall, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"quV" = ( +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"qvc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"qvL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/computer/crew, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"qvO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"qvT" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"qvZ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/turf/open/space/basic, +/area/solar/port/fore) +"qwa" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_b) +"qwk" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"qwo" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Airlock" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"qwv" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"qwA" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery/aux) +"qwI" = ( +/obj/structure/railing{ + dir = 9 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"qwJ" = ( +/obj/effect/landmark/start/cyborg, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/recharge_station, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/circuit/green, +/area/science/robotics) +"qwT" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"qxf" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"qxk" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"qxv" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"qxA" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"qxR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"qxS" = ( +/obj/structure/chair, +/turf/open/floor/plasteel/dark, +/area/medical/surgery/aux) +"qxT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"qxU" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/shuttledock) +"qye" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"qyg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"qym" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"qyT" = ( +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"qzi" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"qzl" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"qzo" = ( +/obj/machinery/camera/autoname, +/turf/open/space/basic, +/area/space) +"qzu" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"qzE" = ( +/obj/structure/disposalpipe/trunk/multiz/down, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"qzI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"qzM" = ( +/obj/machinery/cryopod{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/cryopods) +"qzN" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"qzP" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"qzZ" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"qAb" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable/yellow, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"qAg" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qAm" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"qAp" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"qAq" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Surgery Observation"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"qAu" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"qAB" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/hallway/secondary/entry) +"qAD" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"qAF" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"qAG" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"qAN" = ( +/obj/structure/window/reinforced/spawner, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal) +"qAT" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"qBa" = ( +/obj/structure/bed/dogbed/vector, +/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/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/mob/living/simple_animal/pet/hamster/vector, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"qBd" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/plasteel, +/area/security/brig) +"qBj" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"qBn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Briefing Room"; + req_one_access_txt = "1;4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/main) +"qBu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"qBy" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/start/warden, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"qBJ" = ( +/turf/closed/wall, +/area/hallway/upper/secondary/exit/departure_lounge) +"qBV" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"qBW" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"qBZ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"qCd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"qCe" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qCn" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/door/airlock{ + name = "Kitchen"; + req_access_txt = "28" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) +"qCx" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"qCz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qCB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"qCD" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"qDa" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/machinery/gulag_item_reclaimer{ + pixel_x = 32 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/security/brig) +"qDj" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"qDk" = ( +/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/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall26"; + location = "hall25" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qDn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/wood, +/area/vacant_room/office) +"qDp" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qDq" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/chair/comfy{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"qDs" = ( +/obj/structure/light_construct{ + dir = 8 + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"qDA" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/multiz, +/turf/open/floor/engine, +/area/engine/engine_room) +"qDC" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"qDF" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"qDI" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"qDX" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"qEh" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"qEo" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"qEz" = ( +/obj/structure/sign/warning/vacuum{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"qEA" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"qFa" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"qFb" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"qFk" = ( +/obj/machinery/door/airlock/external{ + name = "Construction Zone" + }, +/turf/open/floor/plating, +/area/construction/mining/aux_base) +"qFl" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/computer/rdservercontrol, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"qFo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/bridge) +"qFw" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge Access"; + req_access_txt = "19" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/bridge) +"qFA" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"qFD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"qFI" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"qFL" = ( +/obj/machinery/door/airlock/external{ + name = "Ferry Shuttle Dock" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qFN" = ( +/obj/structure/sign/warning/securearea{ + pixel_x = -32 + }, +/turf/open/space/basic, +/area/space) +"qFS" = ( +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"qFX" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"qFZ" = ( +/obj/structure/flora/ausbushes/stalkybush, +/turf/open/water/air, +/area/crew_quarters/park) +"qGf" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"qGg" = ( +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"qGr" = ( +/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/white, +/area/medical/surgery) +"qGy" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"qGz" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/landmark/start/atmospheric_technician, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/engine/atmos) +"qGB" = ( +/turf/open/openspace/airless, +/area/maintenance/upper/starboard/central) +"qGE" = ( +/obj/machinery/computer/arcade{ + dir = 4 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"qGR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/security/brig) +"qGU" = ( +/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/tile/neutral, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qHn" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/sink{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"qHG" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"qHT" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"qHV" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"qHX" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"qId" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"qII" = ( +/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/navbeacon{ + codes_txt = "patrol;next_patrol=hall16"; + location = "hall15" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qIQ" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 2; + pixel_y = 8 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 2 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -1; + pixel_y = -1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light{ + dir = 8 + }, +/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 = 1 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"qIW" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/maintenance/upper/fore) +"qJo" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/relay) +"qJs" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/effect/landmark/start/security_officer, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"qJw" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"qJx" = ( +/obj/machinery/computer/crew{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"qJM" = ( +/obj/effect/turf_decal/tile/purple, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"qJO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/table/glass, +/obj/item/folder, +/obj/item/pen/fountain, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage_shared) +"qJQ" = ( +/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/turf_decal/tile/neutral, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"qJY" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qKb" = ( +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"qKf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qKg" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"qKj" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/fore) +"qKk" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating, +/area/maintenance/port) +"qKu" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"qKJ" = ( +/obj/structure/cable/yellow{ + 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/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"qKU" = ( +/obj/machinery/vending/wardrobe/jani_wardrobe, +/obj/effect/turf_decal/tile/green, +/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/janitor) +"qLd" = ( +/obj/structure/table/wood/fancy/cyan, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/door/window{ + dir = 8; + name = "Secure Art Exhibition"; + req_access_txt = "37" + }, +/obj/structure/sign/painting/library_secure{ + pixel_x = 32 + }, +/turf/open/floor/wood, +/area/library) +"qLm" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"qLt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/sink{ + pixel_y = 28 + }, +/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/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/science/research) +"qLD" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/landmark/secequipment, +/obj/effect/turf_decal/delivery, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/main) +"qLP" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"qMn" = ( +/obj/structure/transit_tube, +/turf/open/space/basic, +/area/space) +"qMp" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"qMC" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"qMF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"qMI" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/oxygen_input{ + dir = 1 + }, +/turf/open/floor/engine/o2, +/area/engine/atmos) +"qMN" = ( +/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, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qMQ" = ( +/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/manifold4w/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"qNu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat/foyer) +"qNv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/requests_console{ + department = "Surgery"; + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery/aux) +"qNx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"qNG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/closet/crate/science, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) +"qNQ" = ( +/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/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qNS" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "dorm1" + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/dorms) +"qNY" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"qNZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/closet/toolcloset, +/turf/open/floor/plasteel/dark, +/area/engine/storage_shared) +"qOk" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"qOm" = ( +/obj/structure/table/reinforced, +/obj/structure/bedsheetbin, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/carpet, +/area/security/prison) +"qOu" = ( +/obj/machinery/door/poddoor/shutters{ + id = "teleportershutters"; + name = "Teleporter Shutters" + }, +/obj/machinery/button/door{ + id = "teleportershutters"; + name = "Teleporter Shutters"; + pixel_y = 26; + req_access_txt = "19" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/teleporter) +"qOy" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Library" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/library) +"qOD" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/vending/coffee, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"qOH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"qOR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"qOX" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/quartermaster/exploration_prep) +"qPl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"qPG" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"qPI" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qPL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"qPM" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"qPN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"qPR" = ( +/obj/machinery/vending/cola/random, +/obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"qQt" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hos) +"qQw" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qQC" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"qQE" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"qQF" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/AIsatextAP) +"qQI" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"qQJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"qQU" = ( +/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/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qRa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/ai_monitored/security/armory) +"qRo" = ( +/obj/item/statuebust, +/obj/structure/window/reinforced{ + pixel_y = 1 + }, +/obj/structure/window/reinforced{ + dir = 8; + pixel_y = 1 + }, +/turf/open/floor/grass, +/area/library) +"qRx" = ( +/turf/closed/wall/r_wall, +/area/security/prison) +"qRB" = ( +/obj/machinery/vending/boozeomat, +/turf/closed/wall, +/area/crew_quarters/bar) +"qRE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"qRN" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_a) +"qRX" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"qSl" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"qSn" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"qSq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"qSu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/closed/wall, +/area/crew_quarters/bar) +"qSw" = ( +/obj/effect/landmark/start/scientist, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"qSy" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/sign/poster/official/walk{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"qSD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"qSG" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"qSR" = ( +/obj/effect/landmark/start/ai/secondary, +/obj/machinery/door/window{ + dir = 8; + name = "AI Core Door"; + req_access_txt = "16" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"qST" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"qSV" = ( +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/science/mixing/chamber) +"qSW" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"qSY" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor{ + base_state = "rightsecure"; + dir = 1; + icon_state = "rightsecure"; + name = "Head of Personnel's Paperwork Door"; + req_access_txt = "57" + }, +/obj/machinery/door/window/northleft{ + dir = 2; + name = "Paperwork Window" + }, +/obj/machinery/door/poddoor/preopen{ + id = "hop"; + name = "privacy shutters" + }, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 1 + }, +/obj/item/pen{ + pixel_x = 10; + pixel_y = 1 + }, +/obj/item/pen{ + pixel_x = 8; + pixel_y = -3 + }, +/obj/item/paper{ + pixel_x = -6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/hop) +"qSZ" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 1 + }, +/turf/open/space/basic, +/area/space) +"qTb" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/item/radio/intercom/chapel{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"qTd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/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 = 1 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/vending/modularpc, +/turf/open/floor/plasteel, +/area/storage/tools) +"qTf" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "atmos"; + name = "Atmospherics Lockdown" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"qTz" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/medical/cryo) +"qTN" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qTV" = ( +/obj/machinery/camera/autoname{ + dir = 5 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"qTY" = ( +/obj/machinery/computer/secure_data{ + dir = 1 + }, +/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{ + dir = 2 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/supply) +"qUm" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"qUp" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qUq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"qUD" = ( +/obj/effect/turf_decal/tile/neutral{ + 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/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"qUE" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"qUI" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"qVw" = ( +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"qVB" = ( +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"qVR" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/landmark/start/virologist, +/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/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"qWa" = ( +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"qWm" = ( +/obj/structure/table/glass, +/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/item/reagent_containers/glass/beaker{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/reagent_containers/dropper{ + pixel_y = 2 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"qWr" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qWA" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"qWC" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"qWE" = ( +/obj/structure/chair/pew/right{ + dir = 8; + name = "park bench" + }, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"qWR" = ( +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/grass, +/area/crew_quarters/park) +"qWU" = ( +/obj/structure/table, +/obj/item/retractor, +/obj/item/hemostat, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"qXf" = ( +/obj/structure/rack, +/obj/item/storage/firstaid/advanced{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/storage/firstaid/advanced{ + pixel_y = -1 + }, +/obj/effect/turf_decal/delivery, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1485; + listening = 0; + name = "Station Intercom (Medbay)"; + pixel_x = -30 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"qXk" = ( +/obj/effect/turf_decal/tile/brown, +/obj/machinery/light, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"qXn" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/turf/open/floor/engine/vacuum, +/area/science/mixing/chamber) +"qXo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"qXw" = ( +/obj/structure/table, +/obj/machinery/airalarm/directional/west, +/obj/item/flashlight/lamp{ + pixel_x = -1; + pixel_y = 10 + }, +/obj/item/encryptionkey/headset_sci{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/radio{ + pixel_y = 2 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/crew_quarters/heads/hor) +"qXD" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/bridge) +"qXO" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/drone, +/turf/open/floor/plasteel, +/area/science/mixing) +"qXP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qXX" = ( +/obj/machinery/computer/med_data{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"qYd" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"qYw" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"qYy" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/wood, +/area/maintenance/port) +"qYJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"qYK" = ( +/obj/structure/chair/office, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"qYZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"qZd" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/upper/secondary/entry) +"qZl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"qZm" = ( +/obj/item/radio/intercom{ + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"qZP" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"qZU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/security{ + aiControlDisabled = 1; + name = "Education Center"; + req_access_txt = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"rag" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L9" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rap" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"raq" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/start/emt, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"raA" = ( +/obj/structure/sign/departments/minsky/engineering/telecommmunications{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"raG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/grass, +/area/crew_quarters/park) +"raH" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"raI" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"raQ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/solar/port/fore) +"raW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet, +/area/hallway/primary/fore) +"raZ" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"rbj" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"rbp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"rbq" = ( +/obj/machinery/gateway{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"rbu" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"rbA" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"rbC" = ( +/obj/structure/chair/sofa/right{ + dir = 8 + }, +/turf/open/floor/wood, +/area/maintenance/port) +"rbT" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"rca" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"rcb" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"rce" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"rcg" = ( +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/camera/autoname{ + dir = 4; + network = list("aisat") + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"rcj" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/coffee{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/library) +"rcm" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"rcC" = ( +/obj/machinery/modular_fabricator/autolathe, +/obj/effect/turf_decal/stripes/box, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "research_shutters"; + name = "research shutters" + }, +/obj/machinery/door/window/eastright{ + dir = 2; + name = "Research and Development Desk"; + req_one_access_txt = "7;29" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/science/lab) +"rcL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"rcO" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/departments/minsky/supply/cargo{ + pixel_x = 32 + }, +/obj/structure/closet/firecloset/full, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"rde" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"rdo" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/science) +"rdr" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"rdy" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"rdz" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/computer/shuttle_flight{ + dir = 8; + possible_destinations = "corg_north;corg_south"; + shuttleId = "tram_corg" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rdJ" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/vending/wardrobe/sec_wardrobe, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"rej" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"reF" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/fore) +"reQ" = ( +/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/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"reU" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"rfc" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/incinerator_input{ + dir = 8 + }, +/turf/open/floor/engine/vacuum, +/area/engine/atmospherics_engine) +"rfd" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"rff" = ( +/obj/structure/closet/secure_closet/atmospherics, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"rfg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"rfr" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/main) +"rft" = ( +/obj/effect/spawner/room/threexthree, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"rfA" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"rfG" = ( +/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" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"rfV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/security/courtroom) +"rgm" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"rgq" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/pipe_dispenser, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) +"rgs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/turf/open/floor/grass, +/area/crew_quarters/park) +"rgt" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"rgB" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/obj/machinery/vending/wardrobe/chem_wardrobe, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"rgC" = ( +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"rgN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/meter, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/engine, +/area/engine/engine_room) +"rgR" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"rgV" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"rhh" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/vending/cigarette, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"rho" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"rht" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/obj/structure/lattice/catwalk, +/turf/open/openspace/airless, +/area/space/nearstation) +"rhx" = ( +/obj/structure/ladder, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"rhF" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"rhX" = ( +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"rig" = ( +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"rih" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"riD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + id_tag = "innerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"riN" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"riP" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"riS" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/wood, +/area/library) +"riZ" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/item/paicard, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"rjb" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"rje" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/security/glass{ + id_tag = "innerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"rjf" = ( +/obj/machinery/holopad{ + pixel_y = 16 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"rjh" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/lobby) +"rjp" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"rjt" = ( +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"rjG" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"rjP" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"rjR" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Airlock" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"rjU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/vacant_room/commissary) +"rjZ" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"rka" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"rkg" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"rkn" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"rkJ" = ( +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/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/vending/wardrobe/cargo_wardrobe, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"rkW" = ( +/obj/effect/landmark/start/shaft_miner, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"rle" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/delivery, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"rlh" = ( +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"rlj" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"rlk" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"rls" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"rlA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"rlE" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/command/glass{ + name = "Command Hall Access"; + req_one_access_txt = "19;53"; + security_level = 0 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"rlF" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"rlL" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"rlN" = ( +/obj/structure/chair/sofa/right, +/obj/effect/landmark/start/assistant, +/obj/machinery/camera/autoname{ + dir = 5 + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"rlY" = ( +/obj/machinery/vending/wardrobe/viro_wardrobe, +/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/tile/neutral, +/obj/machinery/button/door{ + id = "virology"; + name = "virology lockdown"; + pixel_x = -28; + pixel_y = 6; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"rmc" = ( +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"rmD" = ( +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"rmM" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"rmN" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"rmQ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/holopad, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/medical/cryo) +"rnp" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot_white, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"rnx" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/openspace, +/area/maintenance/starboard/fore) +"rnz" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"rnA" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"rnN" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"roi" = ( +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/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, +/area/hallway/upper/secondary/entry) +"rou" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/junction, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"rov" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"row" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"roF" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"roT" = ( +/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/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"roY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/carpet/blue, +/area/security/brig) +"rpi" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Chapel"; + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"rpq" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"rpL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/caution, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"rpM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"rpS" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"rpV" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"rpX" = ( +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/engine, +/area/science/explab) +"rqe" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "Security Air Pump"; + target_pressure = 500 + }, +/turf/open/floor/plating, +/area/security/brig) +"rqt" = ( +/obj/machinery/computer/atmos_alert{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"rqu" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/table, +/obj/item/toy/crayon/spraycan{ + pixel_x = -2; + pixel_y = 7 + }, +/obj/item/toy/crayon/spraycan{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/toy/crayon/spraycan{ + pixel_x = 8; + pixel_y = 7 + }, +/obj/item/toy/crayon/spraycan{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"rqI" = ( +/obj/structure/reflector/single/anchored{ + dir = 10 + }, +/obj/item/wrench, +/turf/open/floor/engine, +/area/engine/engine_room) +"rqR" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rqT" = ( +/obj/structure/curtain, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"rqU" = ( +/obj/machinery/vending/cola/random, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"rqV" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/hallway/upper/primary/fore) +"rre" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot_white, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"rrf" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/warden) +"rrg" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hydroponics) +"rri" = ( +/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{ + dir = 2 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/medical) +"rrm" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"rrq" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "bridgewindows"; + name = "Bridge View Blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"rrx" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"rrK" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"rrX" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"rse" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/security/brig) +"rsB" = ( +/obj/machinery/door/airlock{ + name = "Bar Bedroom"; + req_access_txt = "25" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"rsI" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/medical/medbay/lobby) +"rsY" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine"; + req_access_txt = "10" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/engine, +/area/engine/engine_room) +"rtb" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"rtm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"rtp" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Departures Lounge" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"rtr" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"rtz" = ( +/obj/structure/grille, +/turf/closed/wall/r_wall, +/area/space/nearstation) +"rtK" = ( +/obj/structure/closet/emcloset/anchored, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel/dark, +/area/science/shuttle) +"rtT" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"ruf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"rui" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"ruj" = ( +/obj/machinery/camera/autoname{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"ruo" = ( +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/table/glass, +/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/ointment, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"ruz" = ( +/obj/machinery/requests_console{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"ruE" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"ruJ" = ( +/obj/machinery/vending/cola/random, +/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 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ruQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"ruS" = ( +/obj/machinery/computer/atmos_control{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"rvi" = ( +/obj/machinery/atmospherics/pipe/simple/purple/visible{ + dir = 5 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"rvo" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science{ + req_access_txt = "49" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/quartermaster/exploration_prep) +"rvr" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"rvz" = ( +/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/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/transit_tube/curved, +/turf/open/floor/plasteel/dark, +/area/medical/medbay/balcony) +"rvB" = ( +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "0" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"rvN" = ( +/obj/structure/table, +/obj/item/circular_saw{ + pixel_y = 3 + }, +/obj/item/scalpel{ + pixel_y = 14 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/item/surgical_drapes{ + pixel_y = 4 + }, +/turf/open/floor/plasteel/white/side, +/area/medical/surgery) +"rwf" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"rwg" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/airlock/command/glass{ + name = "Command Hall Access"; + req_one_access_txt = "19;53"; + security_level = 0 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"rwu" = ( +/obj/machinery/door/airlock/security{ + name = "Security Post - Cargo"; + 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/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"rwB" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"rwC" = ( +/obj/structure/rack, +/obj/item/storage/box/monkeycubes, +/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/white, +/area/medical/virology) +"rwE" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"rwG" = ( +/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" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"rxH" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8; + pixel_y = 1 + }, +/obj/structure/flora/bush, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/grass, +/area/library) +"rxM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"rxS" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port/central) +"rxX" = ( +/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 = 4 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"ryd" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/closet{ + name = "Evidence Closet 4" + }, +/obj/machinery/newscaster/security_unit{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"ryk" = ( +/obj/item/bedsheet/captain, +/obj/structure/bed, +/obj/effect/landmark/start/captain, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/machinery/camera{ + c_tag = "Captain's Quarters"; + dir = 8 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"rys" = ( +/turf/closed/wall, +/area/medical/medbay/aft) +"ryE" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/science/research) +"ryT" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ryW" = ( +/obj/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"rze" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"rzf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"rzl" = ( +/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/door/airlock{ + name = "Recreational Area" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"rzm" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"rzs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace/airless, +/area/space/nearstation) +"rzD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/science/misc_lab/range) +"rzH" = ( +/obj/effect/landmark/start/ai/secondary, +/obj/machinery/door/window{ + dir = 8; + name = "AI Core Door"; + req_access_txt = "16" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"rzT" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/medical/medbay/central) +"rAg" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"rAj" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"rAk" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"rAo" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"rAw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 8 + }, +/obj/machinery/firealarm{ + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"rAD" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L6" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rAE" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2; + sortType = 3 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"rAN" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/chair, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/AIsatextAP) +"rAW" = ( +/obj/structure/railing, +/turf/open/openspace/airless, +/area/hallway/upper/secondary/service) +"rBb" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "hosoffice"; + name = "Head of Security's Office Shutters" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hos) +"rBc" = ( +/turf/open/openspace/airless, +/area/ai_monitored/turret_protected/aisat/foyer) +"rBg" = ( +/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/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 9 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"rBi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"rBj" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/landmark/secequipment, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/security/main) +"rBz" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"rBO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"rBW" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"rCi" = ( +/obj/structure/chair, +/obj/machinery/requests_console{ + department = "Surgery"; + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"rCq" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) +"rCu" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/item/kirbyplants/random, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"rCy" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"rCD" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"rCO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"rDf" = ( +/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/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/janitor) +"rDm" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"rDq" = ( +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/deck_relay, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"rDr" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Pure to Mix" + }, +/obj/machinery/atmospherics/pipe/simple/purple/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"rDL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"rDT" = ( +/obj/structure/railing{ + dir = 8; + name = "towel rack" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"rDY" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"rEk" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "qmoffice"; + name = "Quartermaster's Office Shutters" + }, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/quartermaster/qm) +"rEp" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"rEy" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"rEG" = ( +/obj/machinery/door/airlock/engineering{ + name = "Port Quarter Solar Maintenance"; + req_access_txt = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"rEO" = ( +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/effect/turf_decal/bot, +/obj/structure/cable/yellow, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/cryopods) +"rEQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/theatre) +"rEX" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"rFf" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/stairs{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"rFi" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"rFj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"rFl" = ( +/obj/effect/spawner/room/fivexfour, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"rFo" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/computer/prisoner/gulag_teleporter_computer{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"rFt" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/structure/flora/ausbushes/ywflowers, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"rFv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"rFx" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"rFy" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/closet/secure_closet/hydroponics, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"rFE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "hop"; + name = "privacy shutters" + }, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/crew_quarters/heads/hop) +"rFM" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"rFR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"rGd" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/light/small, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"rGs" = ( +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/vending/wardrobe/det_wardrobe, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"rGu" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/hallway/upper/secondary/service) +"rGO" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/medical/medbay/aft) +"rGS" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/maintenance/upper/central) +"rGV" = ( +/obj/machinery/door/window{ + dir = 8; + name = "AI Core Door"; + req_access_txt = "16" + }, +/obj/machinery/flasher{ + id = "aicore"; + pixel_x = 5; + pixel_y = 26; + range = 2 + }, +/obj/machinery/button/flasher{ + id = "aicore"; + pixel_x = -5; + pixel_y = 26 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"rGZ" = ( +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"rHg" = ( +/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/vending/snack/random, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"rHn" = ( +/obj/machinery/door/airlock/engineering{ + name = "Shuttle Lab"; + req_one_access_txt = "32;19;23" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rHz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/doppler_array/research/science{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/science/misc_lab/range) +"rHV" = ( +/obj/structure/table/glass, +/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/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/item/reagent_containers/food/drinks/bottle/virusfood, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"rIa" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = 30 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"rIC" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"rIH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"rIQ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) +"rJf" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"rJQ" = ( +/obj/machinery/vending/clothing{ + pixel_x = -4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"rJX" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"rKh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"rKk" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"rKo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"rKu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"rKC" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"rKU" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/lawoffice) +"rLh" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"rLm" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"rLo" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"rLr" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/research) +"rLu" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/noslip/white, +/area/medical/virology) +"rLw" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/explab) +"rLA" = ( +/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 = "18"; + security_level = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"rLB" = ( +/obj/machinery/door/airlock/research{ + name = "Toxins Launch Room Access"; + req_access_txt = "7" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"rLS" = ( +/obj/structure/beebox, +/obj/item/queen_bee/bought, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"rLU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"rLX" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating, +/area/maintenance/fore) +"rMd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"rMn" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"rMy" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L13" + }, +/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/manifold/supply/hidden/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rMH" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/closed/wall, +/area/medical/morgue) +"rMS" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/experimentor, +/obj/machinery/requests_console{ + pixel_x = -32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"rNl" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"rNo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/main) +"rNs" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"rNz" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/computer/cargo{ + dir = 1 + }, +/obj/structure/window/reinforced{ + pixel_y = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"rNH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"rNJ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"rNQ" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/chair, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/AIsatextAP) +"rNS" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"rNX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_y = -25 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) +"rOf" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/sugarcane, +/obj/machinery/light_switch{ + pixel_x = -5; + pixel_y = 28 + }, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"rOk" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"rOn" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"rOw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/crew_quarters/heads/hor) +"rOS" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"rOY" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/structure/sign/map/right{ + pixel_x = 16; + pixel_y = -32 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"rPo" = ( +/turf/closed/wall/r_wall, +/area/security/main) +"rPp" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"rPq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"rPu" = ( +/turf/closed/wall, +/area/crew_quarters/fitness/recreation/upper) +"rPM" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"rQh" = ( +/obj/machinery/light/small, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/firecloset/full, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/secondary) +"rQk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rQm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"rQx" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"rQD" = ( +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"rQI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"rRe" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/obj/machinery/camera/autoname, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/heat_exchanger{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"rRf" = ( +/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) +"rRi" = ( +/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/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"rRo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"rRw" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/openspace, +/area/maintenance/upper/fore) +"rRx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"rRA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"rRE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"rRL" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"rRP" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"rRY" = ( +/turf/open/floor/plating, +/area/chapel/office) +"rSv" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/sign/poster/random{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"rSy" = ( +/obj/machinery/light{ + dir = 1 + }, +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"rSB" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "bridgewindows"; + name = "Bridge View Blast door" + }, +/turf/open/floor/plating, +/area/maintenance/upper/central) +"rTc" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"rTr" = ( +/obj/machinery/light, +/turf/open/openspace, +/area/engine/engine_room) +"rTJ" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/power/deck_relay{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"rTO" = ( +/obj/structure/sign/poster/official/no_erp{ + pixel_x = -33 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/port) +"rTS" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"rTV" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"rTW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"rTX" = ( +/obj/structure/sign/map/right{ + desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; + icon_state = "map-right-MS"; + pixel_y = 32 + }, +/obj/machinery/vending/cola/random, +/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/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"rTY" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"rUj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/plasteel, +/area/science/mixing) +"rUk" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Chemical Manufactoring"; + req_access_txt = "5; 33" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"rUn" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"rUs" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/delivery, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"rUt" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"rUA" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/closed/wall, +/area/hallway/secondary/exit/departure_lounge) +"rUF" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"rUJ" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"rUM" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"rVf" = ( +/turf/closed/wall/r_wall, +/area/security/detectives_office) +"rVk" = ( +/obj/machinery/light/small/broken{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"rVA" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"rVO" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "packageSort2" + }, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"rVS" = ( +/obj/machinery/smartfridge/organ, +/turf/closed/wall, +/area/medical/surgery) +"rWb" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/button/door{ + id = "cp_west_inner"; + name = "Checkpoint Door Lock"; + normaldoorcontrol = 1; + pixel_x = 28; + pixel_y = 6; + specialfunctions = 4 + }, +/obj/machinery/button/door{ + id = "cp_west_outer"; + name = "Checkpoint Door Lock"; + normaldoorcontrol = 1; + pixel_x = 28; + pixel_y = -5; + specialfunctions = 4 + }, +/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/customs) +"rWj" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"rWl" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/storage) +"rWt" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"rWv" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rWI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"rWN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"rWO" = ( +/turf/open/floor/plasteel, +/area/engine/storage_shared) +"rWQ" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/bottle/holywater, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/item/storage/box/matches, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"rWV" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/landmark/blobstart, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"rXd" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/space/basic, +/area/space/nearstation) +"rXg" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"rXo" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"rXr" = ( +/obj/effect/turf_decal/plaque, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall2"; + location = "hall1" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rXw" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"rXT" = ( +/turf/open/floor/circuit, +/area/hallway/secondary/entry) +"rYc" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"rYe" = ( +/turf/open/openspace, +/area/engine/engine_room) +"rYm" = ( +/obj/machinery/advanced_airlock_controller/directional/north, +/obj/machinery/atmospherics/components/binary/dp_vent_pump, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"rYo" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"rYC" = ( +/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/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"rYG" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"rYO" = ( +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/carpet/orange, +/area/quartermaster/qm) +"rYV" = ( +/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/brig, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"rYZ" = ( +/obj/machinery/door/morgue{ + name = "Private Study"; + req_access_txt = "37" + }, +/turf/open/floor/engine/cult, +/area/library) +"rZg" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/table/glass, +/obj/machinery/reagentgrinder, +/obj/item/stack/sheet/mineral/plasma, +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"rZh" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/landmark/start/medical_doctor, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"rZj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"rZo" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"rZv" = ( +/obj/effect/landmark/event_spawn, +/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/navbeacon{ + codes_txt = "patrol;next_patrol=hall1"; + location = "hall33" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rZz" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"rZG" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"rZJ" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass{ + amount = 40; + pixel_x = 3; + pixel_y = -4 + }, +/obj/machinery/requests_console{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"rZV" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/research) +"saa" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"sad" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"sai" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/chair/sofa/right{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"sar" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"saz" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"saD" = ( +/obj/machinery/computer/station_alert{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"saR" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrogen_input{ + dir = 1 + }, +/turf/open/floor/engine/n2, +/area/engine/atmos) +"sbl" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"sbs" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"sbu" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"sbv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"sbI" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"sbM" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/space/nearstation) +"sch" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/obj/structure/lattice/catwalk, +/turf/open/openspace/airless, +/area/space/nearstation) +"scm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"scw" = ( +/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/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"scz" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/tile/red{ + 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/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/effect/landmark/start/depsec/supply, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/supply) +"scA" = ( +/turf/closed/wall/mineral/plastitanium, +/area/security/brig) +"scB" = ( +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/spawner/lootdrop/glowstick, +/obj/effect/spawner/lootdrop/glowstick, +/obj/effect/spawner/lootdrop/glowstick, +/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 = 1 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"scG" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"scR" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/machinery/conveyor{ + dir = 1; + id = "recycling" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"sdi" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"sdv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/landmark/start/emt, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"sdw" = ( +/obj/structure/curtain, +/turf/open/floor/plasteel/white, +/area/quartermaster/storage) +"sdx" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"sdE" = ( +/obj/structure/filingcabinet/employment, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"sdN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"sdP" = ( +/obj/structure/closet/crate, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/sugar, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"sdQ" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Break Area" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"sdU" = ( +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"sdZ" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"sej" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"seq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"sex" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"sez" = ( +/obj/machinery/door/poddoor/shutters{ + id = "teledoor"; + name = "MiniSat Teleport Access" + }, +/obj/machinery/button/door{ + id = "teledoor"; + name = "MiniSat Teleport Shutters Control"; + pixel_y = 25; + req_access_txt = "17;65" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/foyer) +"seF" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/medical/surgery) +"seK" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating, +/area/maintenance/port) +"seW" = ( +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"seX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"sff" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"sfj" = ( +/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/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"sfo" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"sft" = ( +/obj/structure/railing, +/turf/open/openspace, +/area/quartermaster/exploration_prep) +"sfx" = ( +/obj/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"sfA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"sfB" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"sfC" = ( +/obj/structure/chair/pew/right{ + dir = 4; + name = "park bench" + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"sfD" = ( +/obj/structure/table/wood, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/obj/item/gps, +/obj/item/gps, +/obj/item/radio, +/obj/item/radio, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"sfK" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"sfL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"sgb" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/science/misc_lab/range) +"sgi" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"sgu" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"sgC" = ( +/turf/closed/wall/mineral/plastitanium, +/area/science/shuttle) +"sgD" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/closet/firecloset/full, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/science/research) +"sgL" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/space/basic, +/area/space) +"sha" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"shj" = ( +/obj/machinery/door/airlock/medical{ + name = "Observation" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/medical/surgery/aux) +"shk" = ( +/obj/structure/table/reinforced, +/obj/item/stock_parts/capacitor{ + pixel_x = -4; + pixel_y = -2 + }, +/obj/item/stock_parts/capacitor{ + pixel_x = -1; + pixel_y = -4 + }, +/obj/item/stock_parts/capacitor{ + pixel_x = -4; + pixel_y = -1 + }, +/obj/item/stock_parts/capacitor{ + pixel_x = -7; + pixel_y = -7 + }, +/obj/item/stock_parts/matter_bin/adv{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/stock_parts/matter_bin/adv{ + pixel_x = 1; + pixel_y = -2 + }, +/obj/item/stock_parts/matter_bin/adv{ + pixel_x = -2; + pixel_y = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"shl" = ( +/obj/effect/landmark/start/detective, +/obj/structure/chair/comfy{ + dir = 4 + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"shr" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"shs" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/maintenance/solars/starboard/aft) +"sht" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal) +"shx" = ( +/obj/machinery/power/solar, +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/port/aft) +"shU" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"shX" = ( +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"sie" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/turf/open/openspace/airless, +/area/space/nearstation) +"siv" = ( +/obj/structure/grille/broken, +/obj/item/shard, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"siY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"sjd" = ( +/obj/structure/railing, +/turf/open/openspace, +/area/quartermaster/exploration_dock) +"sjh" = ( +/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/primary/fore) +"sjs" = ( +/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/item/kirbyplants/random, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"sju" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"sjU" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"sjX" = ( +/obj/effect/spawner/room/fivexfour, +/turf/open/floor/plating, +/area/maintenance/port) +"ske" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/security/brig) +"skq" = ( +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"sks" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"skv" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/machinery/atmospherics/pipe/simple/multiz/layer1, +/obj/machinery/atmospherics/pipe/simple/multiz/layer3, +/obj/structure/disposalpipe/trunk/multiz, +/turf/open/floor/plating, +/area/maintenance/fore) +"skz" = ( +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"skD" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"skF" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/table, +/obj/item/shuttle_creator, +/obj/item/circuitboard/machine/shuttle/heater, +/obj/item/circuitboard/machine/shuttle/engine/plasma, +/obj/item/circuitboard/computer/shuttle/flight_control, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"skI" = ( +/obj/machinery/light/small/broken{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"skK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"skQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"skT" = ( +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/tcommsat/server"; + dir = 1; + name = "Telecomms Server APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"skY" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/preopen{ + id = "isolb"; + name = "privacy shutters" + }, +/turf/open/floor/plating, +/area/medical/patients_rooms/room_b) +"sln" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"slB" = ( +/obj/machinery/camera/autoname, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"slH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"slM" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/aisat/foyer) +"slQ" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/airalarm/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal) +"slS" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"smb" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Primary Tool Storage" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/storage/tools) +"smc" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"smf" = ( +/obj/machinery/door/airlock/external{ + name = "Labour Shuttle" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"smR" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"smU" = ( +/obj/machinery/computer/security{ + dir = 8 + }, +/obj/machinery/newscaster/security_unit{ + pixel_x = 32 + }, +/turf/open/floor/carpet/red, +/area/security/detectives_office) +"smX" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/chem_master, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"snc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"snv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"sny" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"snB" = ( +/obj/structure/chair/comfy/black, +/obj/effect/landmark/start/head_of_security, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"soa" = ( +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/noslip/standard, +/area/hallway/secondary/service) +"sob" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Gas Control"; + req_access_txt = "10" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/engine/atmos) +"sos" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/railing{ + dir = 9 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"sox" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"soR" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/dark, +/area/security/main) +"soV" = ( +/turf/closed/wall, +/area/storage/tools) +"soX" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"spd" = ( +/turf/closed/wall, +/area/space/nearstation) +"spe" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"spA" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"spD" = ( +/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/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"spE" = ( +/turf/closed/wall/r_wall, +/area/quartermaster/qm) +"spH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"spI" = ( +/obj/machinery/door/window/northleft{ + name = "Containment Pen #3"; + req_access_txt = "55" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio3"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"sqd" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"sqe" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"sqo" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"sqr" = ( +/obj/structure/table/reinforced, +/obj/item/circuitboard/computer/atmos_alert{ + pixel_y = 7 + }, +/obj/item/circuitboard/computer/base_construction{ + pixel_x = -1; + pixel_y = 5 + }, +/obj/item/circuitboard/machine/smes{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/circuitboard/machine/pacman{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/circuitboard/machine/emitter{ + pixel_x = -4; + pixel_y = -1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"sqy" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"sqG" = ( +/turf/open/floor/plasteel/white, +/area/science/explab) +"srj" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/security/main) +"srm" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"srx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/obj/structure/cable/yellow{ + 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/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"srA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/crew_quarters/heads/hor) +"srK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"srL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"srX" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"ssz" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ssA" = ( +/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/storage) +"ssG" = ( +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"ssU" = ( +/obj/machinery/door/window{ + name = "Mass Driver"; + req_access_txt = "22" + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"stg" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"stA" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/storage/box/matches, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"stD" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"stQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"suf" = ( +/obj/item/kirbyplants/random, +/obj/machinery/newscaster{ + pixel_y = -30 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"sus" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "virology"; + name = "Virology Lockdown Shutters" + }, +/turf/open/floor/plating, +/area/medical/virology) +"suH" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"suJ" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace, +/area/maintenance/upper/central) +"svu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"svx" = ( +/obj/structure/table/wood/fancy/cyan, +/obj/structure/window/reinforced{ + pixel_y = 1 + }, +/obj/machinery/door/window{ + dir = 8; + name = "Secure Art Exhibition"; + req_access_txt = "37" + }, +/obj/structure/sign/painting/library_secure{ + pixel_x = 32 + }, +/turf/open/floor/wood, +/area/library) +"svy" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"svB" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"svI" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"svO" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"svV" = ( +/obj/item/stack/cable_coil/yellow, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"swl" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"swL" = ( +/obj/structure/stairs{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"swS" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"swT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"swU" = ( +/obj/machinery/computer/mech_bay_power_console{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/science/robotics) +"swY" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"sxg" = ( +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/fore) +"sxn" = ( +/obj/structure/dresser, +/obj/item/flashlight/lamp/green{ + pixel_x = -5; + pixel_y = 14 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"sxp" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"sxy" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"sxQ" = ( +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"sxZ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"sye" = ( +/turf/closed/wall, +/area/maintenance/fore) +"syk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/pipe_dispenser, +/obj/item/wrench, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"syn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/airlock/security/glass{ + name = "Security Medical"; + req_access_txt = "63" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/security/brig) +"syt" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"syK" = ( +/obj/machinery/door/airlock/external{ + name = "Bridge External Access"; + req_access_txt = "10;13" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/bridge) +"syR" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/structure/window/reinforced/spawner, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal) +"syS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/research) +"syW" = ( +/obj/machinery/chem_dispenser/mutagensaltpetersmall, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hydroponics) +"szh" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"szn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/upper/primary/fore) +"szp" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Air to Distro"; + target_pressure = 500 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"szq" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"szr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"szx" = ( +/obj/structure/closet/secure_closet/brig{ + id = "Cell 2"; + name = "Cell 2 Locker" + }, +/turf/open/floor/carpet/blue, +/area/security/brig) +"szS" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"szV" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plasteel, +/area/science/mixing) +"szW" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"szX" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"szZ" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"sAa" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"sAq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/hos) +"sAR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"sAT" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Air Inlet"; + target_pressure = 500 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"sAV" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"sAY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"sBd" = ( +/obj/structure/window/plasma/reinforced{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/turf/open/floor/circuit/green, +/area/engine/supermatter) +"sBe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"sBh" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"sBl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"sBx" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"sBC" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"sBE" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"sBF" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/turf/open/space/basic, +/area/space/nearstation) +"sBP" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"sBQ" = ( +/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/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"sBU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/closed/wall, +/area/engine/engineering) +"sBV" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hydroponics) +"sBX" = ( +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"sCa" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"sCc" = ( +/obj/structure/cable/yellow{ + 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 = 5 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"sCf" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/wood, +/area/library) +"sCk" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"sCl" = ( +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics Access"; + req_access_txt = "24" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"sCn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"sCo" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"sCK" = ( +/obj/effect/spawner/room/fivexthree, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"sCO" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"sCY" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"sDw" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -30 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"sDG" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"sDH" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/item/storage/fancy/candle_box, +/obj/item/storage/box/matches, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"sDI" = ( +/obj/structure/transit_tube/curved{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat/foyer) +"sDM" = ( +/obj/machinery/smartfridge/extract/preloaded, +/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 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"sEa" = ( +/obj/structure/rack, +/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/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"sEj" = ( +/obj/machinery/gateway{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/warning/radiation{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"sEt" = ( +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"sEy" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Funeral Parlour" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"sEF" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Medbay Maintenance"; + req_access_txt = "5" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/turf/open/floor/plating, +/area/medical/cryo) +"sEL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"sEM" = ( +/obj/machinery/button/massdriver{ + id = "chapelgun"; + name = "Chapel Mass Driver"; + pixel_x = 28; + pixel_y = -25 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"sFc" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"sFd" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"sFj" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"sFm" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"sFE" = ( +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"sFK" = ( +/obj/structure/table/glass, +/obj/item/paper_bin{ + pixel_y = 3 + }, +/obj/item/pen{ + pixel_y = 2 + }, +/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_switch{ + pixel_x = 26 + }, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/dropper{ + pixel_x = 1; + pixel_y = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"sFS" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"sFW" = ( +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"sGe" = ( +/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 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port) +"sGh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"sGQ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/requests_console{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"sGT" = ( +/obj/structure/flora/junglebush, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/grass, +/area/crew_quarters/park) +"sGY" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"sHh" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"sHi" = ( +/obj/structure/chair/pew/left{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/chapel{ + dir = 4 + }, +/area/chapel/main/monastery) +"sHk" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"sHr" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/sign/departments/minsky/engineering/engineering{ + pixel_x = -32 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/engineering) +"sHt" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"sHD" = ( +/obj/item/kirbyplants/random, +/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 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"sHH" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Mix to Air" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"sHO" = ( +/obj/effect/spawner/structure/window, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/hallway/upper/primary/fore) +"sHR" = ( +/obj/machinery/door/airlock/external{ + name = "Ferry Shuttle Dock" + }, +/turf/open/floor/plating, +/area/hallway/primary/fore) +"sHU" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"sHY" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"sIa" = ( +/obj/structure/table/optable{ + name = "Robotics Operating Table" + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"sIi" = ( +/obj/structure/chair/office/light, +/obj/effect/landmark/start/chief_medical_officer, +/turf/open/floor/carpet/cyan, +/area/crew_quarters/heads/cmo) +"sIu" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/science/storage) +"sIF" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"sII" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"sIJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"sIT" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/layer_manifold, +/obj/machinery/recharge_station, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"sIY" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"sJk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -8 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = -1 + }, +/obj/machinery/newscaster{ + pixel_y = -30 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"sJr" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"sJE" = ( +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/obj/machinery/rnd/production/techfab/department/cargo, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"sJG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"sJP" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"sJT" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"sKd" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"sKh" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/landmark/start/scientist, +/turf/open/floor/plasteel/white, +/area/science/explab) +"sKl" = ( +/obj/machinery/light_switch{ + pixel_y = -25 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/crew_quarters/heads/hor) +"sKn" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"sKr" = ( +/obj/machinery/vending/tool, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"sKs" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"sKC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"sKH" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/science/research) +"sKK" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/law) +"sKX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hydroponics) +"sLf" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"sLA" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"sLC" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"sLE" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel, +/area/gateway) +"sLF" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"sLH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"sMh" = ( +/obj/machinery/computer/atmos_control/tank/nitrogen_tank{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"sMl" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/landmark/start/cook, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"sMm" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"sMp" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/upper/secondary/entry) +"sMx" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/grape, +/turf/open/floor/grass, +/area/hydroponics/garden) +"sMA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"sME" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"sMJ" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"sNd" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"sNf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "virology"; + name = "Virology Lockdown Shutters" + }, +/turf/open/floor/plating, +/area/medical/virology) +"sNj" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"sNo" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"sNx" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"sNK" = ( +/obj/effect/spawner/room/fivexfour, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"sNV" = ( +/obj/machinery/chem_dispenser{ + layer = 2.7 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"sOc" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"sOe" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"sOi" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/science/shuttle) +"sOs" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/security/brig) +"sOH" = ( +/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/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"sOU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"sOZ" = ( +/obj/structure/barricade/wooden, +/obj/structure/barricade/wooden/crude, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"sPa" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"sPs" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/hallway/secondary/entry) +"sPv" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/suit_storage_unit/open, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/gateway) +"sPF" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"sQl" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"sQv" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/security/nuke_storage) +"sQH" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"sQK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"sQM" = ( +/obj/structure/flora/ausbushes/palebush, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/grass, +/area/hallway/secondary/command) +"sRc" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"sRr" = ( +/obj/machinery/door/airlock/hatch{ + name = "Telecommunications"; + req_access_txt = "61" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"sRu" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"sRy" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/recharger{ + pixel_y = 3 + }, +/obj/machinery/newscaster/security_unit{ + pixel_x = 32 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"sRB" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"sRK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"sRX" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/newscaster{ + pixel_x = 30 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"sSh" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"sSl" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "packageSort2"; + pixel_y = -4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"sSm" = ( +/obj/structure/marker_beacon, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"sSn" = ( +/obj/structure/rack, +/obj/item/clothing/shoes/magboots{ + pixel_x = -4; + pixel_y = -1 + }, +/obj/item/clothing/shoes/magboots{ + pixel_x = 3; + pixel_y = -4 + }, +/obj/item/clothing/shoes/magboots{ + pixel_x = 2; + pixel_y = 3 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"sSr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"sSs" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/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/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/crew_quarters/cryopods) +"sSw" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"sSM" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/upper/primary/port) +"sSS" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/quartermaster/exploration_dock) +"sTe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Pet Storage" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"sTi" = ( +/obj/structure/rack, +/obj/item/storage/book/bible, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"sTl" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"sTm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"sTq" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/advanced_airlock_controller/directional/west{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"sTt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"sTB" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"sTH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"sTL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"sTT" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"sUo" = ( +/obj/machinery/space_heater, +/obj/machinery/requests_console{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/science) +"sUp" = ( +/turf/open/openspace, +/area/quartermaster/storage) +"sUt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"sUK" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/cable_coil/yellow, +/obj/item/camera, +/turf/open/floor/plasteel/dark, +/area/storage/art) +"sUM" = ( +/obj/machinery/computer/teleporter{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat/foyer) +"sUT" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"sUZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"sVk" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"sVo" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"sVq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"sVD" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"sVO" = ( +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"sVR" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"sWm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"sWC" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"sWM" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"sWR" = ( +/obj/machinery/door/poddoor/incinerator_toxmix, +/turf/open/floor/engine/vacuum, +/area/science/mixing/chamber) +"sXg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"sXi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"sXj" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"sXw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/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/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"sXL" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/northright{ + dir = 4; + name = "medical supplies"; + req_access_txt = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/reagent_containers/glass/bottle/epinephrine, +/obj/item/reagent_containers/syringe/epinephrine{ + pixel_x = -1; + pixel_y = -1 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"sXQ" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"sXT" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"sXW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/stairs/right{ + dir = 1 + }, +/area/hallway/secondary/service) +"sYd" = ( +/obj/structure/plasticflaps/opaque, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + dir = 1; + freq = 1400; + location = "Robotics" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"sYn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/hallway/primary/fore) +"sYw" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/poppy, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"sYE" = ( +/obj/structure/chair/office, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"sYF" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"sYH" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"sYT" = ( +/obj/structure/closet/secure_closet{ + name = "contraband locker"; + req_access_txt = "3" + }, +/obj/effect/spawner/lootdrop/armory_contraband, +/obj/effect/spawner/lootdrop/maintenance/three, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"sZc" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/window/eastleft{ + dir = 8; + name = "Engineering Deliveries"; + req_one_access_txt = "32;19" + }, +/obj/structure/plasticflaps/opaque, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"sZe" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"sZf" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"sZl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/crew_quarters/heads/hor) +"sZm" = ( +/obj/structure/flora/ausbushes/pointybush, +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/grass, +/area/hallway/secondary/command) +"sZr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/firecloset/full, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/secondary) +"sZB" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"sZJ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"sZM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/manifold4w/general/visible, +/turf/open/floor/plasteel, +/area/medical/cryo) +"sZP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"sZT" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"tag" = ( +/obj/machinery/atmospherics/components/unary/passive_vent, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"tai" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/door/window/brigdoor/eastright{ + dir = 8; + req_access_txt = "1" + }, +/obj/machinery/door/window{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"tan" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"taA" = ( +/obj/structure/curtain, +/turf/open/floor/noslip/white, +/area/quartermaster/qm) +"taK" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"taO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"taR" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/science/research) +"taU" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"taV" = ( +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"tbp" = ( +/obj/structure/chair, +/obj/machinery/requests_console{ + department = "Surgery"; + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery/aux) +"tbu" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/park) +"tbv" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Gravity Generator Area"; + req_access_txt = "19; 61" + }, +/turf/open/floor/plating, +/area/engine/gravity_generator) +"tbx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"tby" = ( +/obj/effect/turf_decal/delivery, +/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/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"tcd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"tch" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + icon_state = "volpump_map-2"; + name = "Gas to Mix" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"tcn" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"tcw" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/science/mixing) +"tcB" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"tcF" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/disposaloutlet, +/turf/open/floor/plating, +/area/maintenance/disposal) +"tcU" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"tdh" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"tdn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"tdC" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hydroponics) +"tdF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"tdN" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"tdO" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/mob/living/simple_animal/bot/secbot/pingsky, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"tea" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"tej" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/landmark/start/head_of_personnel, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"tex" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"tez" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/reagent_containers/food/snacks/mint, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/item/reagent_containers/food/condiment/flour, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"teC" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"teG" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port/central) +"teI" = ( +/obj/structure/table/wood, +/obj/item/folder/white{ + pixel_x = -2 + }, +/obj/item/folder/blue{ + pixel_y = 1 + }, +/obj/item/folder/red{ + pixel_x = 2; + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"teM" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/hallway/primary/starboard) +"teO" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/openspace, +/area/security/brig) +"teP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"teZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-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/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"tfh" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"tfo" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"tfp" = ( +/obj/machinery/vending/medical, +/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/effect/turf_decal/tile/yellow, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel, +/area/medical/storage) +"tft" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"tfw" = ( +/obj/structure/chair{ + 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 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"tfz" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/closet/secure_closet/brig, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"tfF" = ( +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"tfJ" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"tfL" = ( +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/hor) +"tfN" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"tgc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"tgg" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/openspace, +/area/ai_monitored/security/armory) +"tgh" = ( +/obj/structure/mirror{ + pixel_x = 28 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 12 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"tgo" = ( +/obj/structure/chair/comfy, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Medical Lobby"; + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"tgu" = ( +/obj/machinery/computer/operating{ + 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/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"tgv" = ( +/obj/structure/closet/secure_closet/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/obj/item/gun/ballistic/shotgun/doublebarrel, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"tgz" = ( +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"tgG" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"tgI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "hosoffice"; + name = "Head of Security's Office Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hos) +"tgO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/airalarm/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/storage) +"tgP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "ceprivacy"; + name = "privacy shutter" + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/checkpoint/engineering) +"the" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat AI Access"; + req_access_txt = "65" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/poddoor/shutters{ + id = "aicoremain" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"tht" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"thz" = ( +/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/science/shuttle) +"thT" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"tih" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"tiw" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"tiB" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"tiE" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"tiI" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"tiT" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "QMLoad2" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/quartermaster/storage) +"tiU" = ( +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"tiV" = ( +/turf/closed/wall, +/area/hallway/primary/fore) +"tiX" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Library Maintenance"; + req_access_txt = "12" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/library) +"tiZ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"tjd" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/pen/fountain{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/door/window/northright{ + name = "Library Desk Door"; + pixel_x = 3; + req_access_txt = "37" + }, +/turf/open/floor/wood, +/area/library) +"tjf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"tjo" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"tju" = ( +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/grass, +/area/crew_quarters/park) +"tjE" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"tjQ" = ( +/obj/structure/railing, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"tjT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/upper/fore) +"tjU" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) +"tkg" = ( +/turf/open/floor/wood, +/area/maintenance/port) +"tkj" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"tkv" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"tkD" = ( +/obj/machinery/computer/atmos_control/tank/mix_tank, +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"tkE" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port) +"tkO" = ( +/obj/structure/lattice, +/turf/open/openspace/airless, +/area/ai_monitored/turret_protected/aisat_interior) +"tkP" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/mineral/ore_redemption{ + input_dir = 4; + output_dir = 8 + }, +/obj/machinery/door/window/westleft{ + name = "Ore Redemption Windoor"; + pixel_y = 1; + req_access_txt = "31" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"tle" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"tlm" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"tln" = ( +/obj/machinery/light/small/broken{ + dir = 4 + }, +/obj/machinery/button/massdriver{ + id = "trash"; + name = "trash eject"; + pixel_x = 27; + pixel_y = -5 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal) +"tlo" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"tlN" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"tlT" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"tlZ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"tmb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"tmq" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/openspace, +/area/engine/engine_room) +"tmB" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engine Room"; + req_access_txt = "10" + }, +/obj/structure/cable/yellow{ + 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/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"tmD" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"tmS" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"tmV" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/reagent_dispensers/peppertank{ + pixel_x = 32 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"tmW" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"tnc" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"tnf" = ( +/obj/structure/lattice, +/obj/effect/landmark/carpspawn, +/turf/open/space/basic, +/area/space/nearstation) +"tnk" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"tno" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/chief) +"tns" = ( +/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/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"tnz" = ( +/obj/machinery/disposal/bin, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"tnP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"tnR" = ( +/obj/structure/sign/poster/official/safety_eye_protection{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/science/research) +"tnU" = ( +/obj/structure/sign/departments/minsky/engineering/telecommmunications{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"tnW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"tob" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 28 + }, +/obj/structure/displaycase, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"tog" = ( +/obj/machinery/door/window/northleft{ + dir = 2; + name = "Containment Pen #3"; + req_access_txt = "55" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"too" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"tor" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"tou" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"toz" = ( +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"toK" = ( +/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/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"tpk" = ( +/obj/machinery/light, +/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/medical/virology) +"tpK" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"tpM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 8; + network = list("aicore") + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"tpP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"tpR" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"tpU" = ( +/turf/closed/wall, +/area/maintenance/upper/central) +"tpX" = ( +/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/structure/closet/l3closet/virology, +/obj/machinery/button/door{ + id = "virology"; + name = "virology lockdown"; + pixel_x = -27; + pixel_y = 6; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"tqc" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"tql" = ( +/obj/structure/chair/comfy/black, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"tqo" = ( +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"tqs" = ( +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"tqv" = ( +/obj/structure/table/reinforced, +/obj/item/wallframe/defib_mount, +/obj/item/wrench/medical, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/security/brig) +"tqz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel/white, +/area/security/brig) +"tqX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"try" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "recycling" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"trB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"trD" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"trE" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/research) +"trF" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"trM" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"tsb" = ( +/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/tile/blue, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"tsh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"tso" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"tsq" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"tsH" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"ttd" = ( +/obj/effect/landmark/start/station_engineer, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/storage_shared) +"tti" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"ttt" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/storage/toolbox/artistic{ + pixel_x = 1; + pixel_y = 3 + }, +/obj/item/storage/toolbox/artistic{ + pixel_x = -1 + }, +/turf/open/floor/plasteel/dark, +/area/storage/art) +"ttx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/vending/wallmed{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"ttF" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"ttI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/obj/item/radio/intercom{ + pixel_y = 22 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"ttK" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"ttN" = ( +/obj/structure/rack, +/obj/item/clothing/gloves/color/yellow, +/obj/item/stack/cable_coil/yellow, +/obj/item/stack/cable_coil/yellow, +/obj/item/clothing/glasses/meson, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"ttP" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"ttV" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"tui" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenside"; + name = "Kitchen Hall Shutters" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"tum" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"tur" = ( +/obj/machinery/computer/security{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"tuz" = ( +/obj/machinery/door/airlock/mining{ + name = "Mining Access"; + req_one_access_txt = "31;48" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"tuL" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"tvj" = ( +/obj/machinery/atmospherics/pipe/simple/purple/visible, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"tvq" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"tvt" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/dorms) +"tvG" = ( +/obj/structure/table/reinforced, +/obj/item/circuitboard/machine/public_nanite_chamber, +/obj/item/nanite_remote, +/obj/item/nanite_remote, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"tvR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/medical/virology) +"tvZ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"twu" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/engine/engineering) +"tww" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/white, +/area/science/research) +"twA" = ( +/turf/closed/wall, +/area/medical/chemistry/upper) +"twB" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"twN" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"twO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics/cloning) +"twQ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"twR" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"txh" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/item/book/manual/wiki/cooking_to_serve_man, +/obj/item/reagent_containers/food/condiment/enzyme{ + pixel_y = 5 + }, +/obj/item/reagent_containers/food/condiment/peppermill, +/obj/machinery/requests_console{ + department = "Kitchen"; + departmentType = 2; + pixel_y = -32 + }, +/obj/item/reagent_containers/food/condiment/sugar, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"txr" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green, +/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/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/item/seeds/tea, +/turf/open/floor/plasteel, +/area/security/prison) +"txs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"txz" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"txG" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/bot, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/science/storage) +"txH" = ( +/obj/effect/turf_decal/tile/red{ + 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/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/closet/secure_closet/security/science, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/science) +"txO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"txS" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/research) +"txX" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/security_space_law, +/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{ + dir = 2 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/science) +"txY" = ( +/turf/closed/wall, +/area/storage/art) +"tyb" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"tyc" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/button/door{ + id = "engsm"; + name = "Radiation Shutters"; + pixel_x = -24 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"tyk" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"tyr" = ( +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/effect/landmark/start/cyborg, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"tys" = ( +/obj/machinery/button/door{ + id = "shower4"; + name = "Shower Bolts"; + normaldoorcontrol = 1; + pixel_x = 28; + pixel_y = -26; + specialfunctions = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"tyB" = ( +/obj/structure/table, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/clothing/neck/stethoscope, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_b) +"tyD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/bridge) +"tyG" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/bridge) +"tyK" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/openspace, +/area/maintenance/starboard/fore) +"tyS" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"tyT" = ( +/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/door/airlock{ + name = "Recreational Area" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"tyY" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/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/components/unary/vent_pump/on/layer1, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"tyZ" = ( +/obj/structure/chair/wood, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"tzh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"tzk" = ( +/obj/machinery/button/door/incinerator_vent_atmos_main{ + pixel_x = 24; + pixel_y = 6 + }, +/obj/machinery/button/door/incinerator_vent_atmos_aux{ + pixel_x = 24; + pixel_y = -6 + }, +/obj/machinery/computer/turbine_computer{ + dir = 8; + id = "incineratorturbine" + }, +/obj/machinery/airalarm/unlocked{ + pixel_y = 24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"tzm" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"tzq" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/turf/open/floor/plating, +/area/security/brig) +"tzv" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm2"; + name = "Cabin 2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"tzA" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"tzD" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"tzW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"tAm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"tAB" = ( +/obj/machinery/door/window/northleft{ + dir = 2; + name = "Containment Pen #4"; + req_access_txt = "55" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio6"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"tBc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"tBd" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"tBv" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"tBy" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/captain/private) +"tBC" = ( +/obj/machinery/camera/motion{ + c_tag = "Armory Motion Sensor" + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/ai_monitored/security/armory) +"tBE" = ( +/obj/structure/flora/junglebush/large, +/obj/structure/flora/rock/pile/largejungle, +/turf/open/floor/grass, +/area/crew_quarters/park) +"tBF" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"tBJ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"tBL" = ( +/obj/machinery/paystand, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/wood, +/area/library) +"tBP" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/solar/starboard/aft) +"tBS" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"tBX" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/AIsatextAP) +"tBZ" = ( +/obj/effect/landmark/start/exploration, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"tCg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"tCo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"tCu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/oxygen_output{ + dir = 1 + }, +/turf/open/floor/engine/o2, +/area/engine/atmos) +"tCz" = ( +/obj/machinery/atmospherics/miner/carbon_dioxide, +/turf/open/floor/engine/co2, +/area/engine/atmos) +"tCJ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"tCR" = ( +/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, +/area/hallway/primary/fore) +"tCW" = ( +/obj/structure/table, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/machinery/door/window/eastleft{ + dir = 1; + name = "Atmospherics"; + req_one_access_txt = "24" + }, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/item/paper_bin{ + pixel_y = 1 + }, +/obj/item/pen{ + pixel_y = 2 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/engine/atmos) +"tDp" = ( +/obj/structure/transit_tube/crossing{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"tDq" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"tDF" = ( +/obj/structure/bed/dogbed/renault, +/obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/mob/living/simple_animal/pet/fox/Renault, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"tDG" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/chair, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/AIsatextAP) +"tDN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"tDO" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/maintenance/starboard/aft) +"tDP" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"tDT" = ( +/obj/structure/table, +/obj/item/clothing/under/color/random, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/item/storage/crayons, +/obj/item/stack/packageWrap, +/obj/item/stack/wrapping_paper, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"tEa" = ( +/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/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"tEn" = ( +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel, +/area/medical/cryo) +"tEs" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/landmark/start/botanist, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/hydroponics) +"tEx" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"tEy" = ( +/obj/effect/landmark/observer_start, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"tEP" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"tET" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/sink{ + pixel_y = 28 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"tEV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"tEX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio8"; + name = "containment blast door" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"tFl" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"tFt" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/storage/book/bible, +/obj/item/storage/book/bible{ + pixel_x = 2; + pixel_y = 2 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"tFD" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 1; + sortType = 11 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"tFF" = ( +/obj/machinery/door/window/northleft{ + dir = 2; + name = "Containment Pen #5"; + req_access_txt = "55" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio7"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"tFH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"tFN" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Public Office" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/art) +"tFP" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"tFR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/secondary) +"tGb" = ( +/obj/structure/table/wood, +/obj/item/toy/cards/deck, +/turf/open/floor/wood, +/area/vacant_room/office) +"tGg" = ( +/obj/structure/sign/departments/minsky/research/xenobiology{ + pixel_y = 32 + }, +/turf/open/openspace, +/area/science/research) +"tGk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"tGp" = ( +/obj/machinery/door/airlock{ + id_tag = "shower4"; + name = "Shower Unit" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"tGr" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload) +"tGt" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"tGG" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/structure/closet/secure_closet/security/med, +/obj/machinery/newscaster/security_unit{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/medical) +"tGN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"tHt" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/grass, +/area/hallway/secondary/command) +"tHz" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"tHG" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"tHS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"tIl" = ( +/obj/docking_port/stationary{ + dwidth = 1; + height = 4; + name = "escape pod"; + roundstart_template = /datum/map_template/shuttle/escape_pod/default; + width = 3 + }, +/turf/open/space/basic, +/area/space) +"tIv" = ( +/obj/machinery/door/airlock/command{ + name = "Head of Personnel's Office"; + req_access_txt = "57" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"tID" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"tIF" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/computer/shuttle_flight/mining{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"tII" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/brig) +"tIN" = ( +/obj/structure/cable/yellow{ + 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 = 10 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"tIP" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"tIW" = ( +/turf/closed/wall, +/area/medical/surgery) +"tIX" = ( +/obj/machinery/door/airlock/external{ + name = "Supply Dock Airlock"; + req_access_txt = "31" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"tIZ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"tJe" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"tJp" = ( +/obj/structure/bed/dogbed, +/mob/living/simple_animal/crab, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"tJC" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"tJG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"tJO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/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/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/supply) +"tJX" = ( +/obj/machinery/computer/warrant, +/obj/structure/sign/departments/minsky/security/security{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"tKg" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"tKl" = ( +/obj/structure/transit_tube/diagonal, +/turf/open/space/basic, +/area/space) +"tKm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload) +"tKC" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/obj/machinery/advanced_airlock_controller{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"tKE" = ( +/obj/structure/flora/junglebush/c, +/turf/open/floor/grass, +/area/crew_quarters/park) +"tKK" = ( +/obj/machinery/hydroponics/soil, +/obj/item/plant_analyzer, +/obj/item/seeds/wheat, +/obj/structure/cable/yellow, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/grass, +/area/hydroponics/garden) +"tKO" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "N2O to Pure" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"tLd" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"tLh" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"tLi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/medical/surgery) +"tLo" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"tLu" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/crate_spawner, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"tLz" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/delivery, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"tLU" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"tLV" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow, +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"tMi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/airlock/public/glass, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"tMk" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"tMv" = ( +/obj/structure/chair/sofa{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/wood, +/area/maintenance/port) +"tMF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/science/robotics) +"tMH" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"tMK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 10 + }, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"tMO" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/engine/atmospherics_engine) +"tMS" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/storage/box/beakers, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/syringe, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"tNh" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"tNi" = ( +/obj/machinery/power/apc{ + areastring = "/area/engine/gravity_generator"; + dir = 2; + name = "Gravity Generator APC"; + pixel_y = -24 + }, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"tNl" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/conveyor_switch/oneway{ + id = "QMLoad2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"tNp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Surgery Observation" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"tNq" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall21"; + location = "hall20" + }, +/obj/machinery/camera/autoname, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"tNt" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, +/area/medical/medbay/central) +"tNz" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"tNW" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"tOb" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"tOc" = ( +/obj/structure/railing/corner, +/turf/open/openspace, +/area/maintenance/upper/aft) +"tOf" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"tOq" = ( +/obj/effect/turf_decal/stripes/end, +/obj/machinery/suit_storage_unit, +/turf/open/floor/plasteel/dark, +/area/bridge) +"tOt" = ( +/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/item/radio/intercom{ + pixel_x = -28; + pixel_y = -2 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"tOv" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/relay) +"tOw" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"tOy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/science/shuttle) +"tOG" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"tOK" = ( +/obj/effect/turf_decal/tile/yellow{ + 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/dark, +/area/maintenance/department/chapel/monastery) +"tOV" = ( +/obj/machinery/computer/secure_data{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"tOZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"tPl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 6 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 6 + }, +/turf/open/openspace/airless, +/area/space/nearstation) +"tPu" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/structure/fireaxecabinet{ + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"tPD" = ( +/obj/structure/table/reinforced, +/obj/item/stock_parts/subspace/filter, +/obj/item/stock_parts/subspace/filter{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/stock_parts/subspace/transmitter, +/obj/item/stock_parts/subspace/transmitter{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/stock_parts/subspace/transmitter{ + pixel_x = -2; + pixel_y = -3 + }, +/obj/item/stock_parts/subspace/treatment, +/obj/item/stock_parts/subspace/treatment, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"tPV" = ( +/obj/structure/flora/ausbushes/ppflowers, +/mob/living/simple_animal/cow, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"tQp" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"tQt" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"tQw" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"tQI" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"tQY" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/research{ + name = "Nanite Lab"; + req_access_txt = "8" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark/telecomms, +/area/science/nanite) +"tRl" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"tRm" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/openspace, +/area/engine/engine_room) +"tRu" = ( +/obj/machinery/door/morgue{ + name = "Confession Booth" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"tRw" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 1; + name = "Freezer Bypass" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"tRx" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"tRP" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/bridge) +"tRR" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"tRU" = ( +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/effect/turf_decal/caution, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"tSd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/research) +"tSe" = ( +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"tSl" = ( +/obj/structure/table, +/obj/item/phone{ + desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"tSv" = ( +/obj/machinery/door/airlock{ + name = "Lawyer's Office"; + req_access_txt = "38" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"tSx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"tSH" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"tSI" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"tSX" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + 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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"tTf" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/bridge) +"tTn" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"tTo" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"tTD" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"tTG" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"tTX" = ( +/turf/closed/wall, +/area/crew_quarters/kitchen/coldroom) +"tUb" = ( +/obj/structure/chair/comfy, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"tUc" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/hydroponics/garden) +"tUu" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"tUJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/library) +"tUO" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"tUP" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Medical"; + req_access_txt = "63" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/security/brig) +"tUZ" = ( +/obj/structure/rack, +/obj/item/clothing/suit/armor/bulletproof, +/obj/item/clothing/suit/armor/bulletproof, +/obj/item/clothing/suit/armor/bulletproof, +/obj/item/clothing/head/helmet/alt, +/obj/item/clothing/head/helmet/alt, +/obj/item/clothing/head/helmet/alt, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"tVd" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"tVn" = ( +/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/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"tVr" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/book/manual/wiki/medical_cloning{ + pixel_y = 6 + }, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/gauze, +/turf/open/floor/plasteel/white, +/area/medical/genetics/cloning) +"tVv" = ( +/obj/effect/spawner/lootdrop/crate_spawner, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"tVz" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/science/storage) +"tVC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"tVH" = ( +/obj/item/crowbar/red, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"tVO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"tVT" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/openspace, +/area/maintenance/upper/central) +"tWg" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"tWh" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/camera/autoname{ + network = list("aicore") + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"tWi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"tWj" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/obj/effect/landmark/start/captain, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"tWA" = ( +/obj/structure/closet/secure_closet/medical2, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white/side{ + dir = 10 + }, +/area/medical/surgery/aux) +"tWD" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"tWG" = ( +/obj/structure/table/wood, +/obj/item/grown/bananapeel, +/obj/item/bikehorn{ + pixel_x = -7; + pixel_y = 7 + }, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/obj/item/stamp/clown, +/turf/open/floor/carpet/purple, +/area/crew_quarters/theatre) +"tWV" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/atmos) +"tWX" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/sign/departments/science{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"tWY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"tXj" = ( +/obj/item/beacon, +/turf/open/floor/engine, +/area/science/explab) +"tXx" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/mob/living/simple_animal/hostile/retaliate/goose/vomit, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"tXM" = ( +/turf/closed/wall, +/area/hallway/secondary/entry) +"tXS" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"tXX" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall, +/area/science/shuttle) +"tYe" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating, +/area/maintenance/port/central) +"tYl" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"tYt" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/landmark/start/janitor, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/janitor) +"tYP" = ( +/obj/structure/table/glass, +/obj/item/razor, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"tYR" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "recycling" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/disposal) +"tZg" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"tZi" = ( +/obj/effect/turf_decal/loading_area, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"tZk" = ( +/obj/machinery/light/small/broken, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"tZw" = ( +/obj/structure/table_frame/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/wood, +/area/vacant_room/office) +"tZy" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload) +"tZA" = ( +/obj/machinery/computer/security{ + dir = 1 + }, +/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{ + dir = 2 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/supply) +"tZC" = ( +/obj/machinery/status_display/evac{ + pixel_x = 32 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 8; + network = list("aicore") + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"tZF" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/machinery/requests_console{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"tZG" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 8 + }, +/obj/machinery/advanced_airlock_controller{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"tZH" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/engineering) +"tZV" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/mixing/chamber) +"tZX" = ( +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"tZY" = ( +/turf/closed/wall, +/area/maintenance/disposal) +"uag" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"uak" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"uap" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"uar" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"uaG" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/chief) +"uaL" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"uaN" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/security/brig) +"ubb" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/security/main) +"ubc" = ( +/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/aft) +"ubd" = ( +/obj/structure/flora/ausbushes/fernybush, +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/grass, +/area/crew_quarters/park) +"ubi" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Command Maintenance Hatch"; + req_access_txt = "19"; + security_level = 0 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/command) +"ubq" = ( +/obj/structure/chair/pew/left{ + dir = 8; + name = "park bench" + }, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"ubC" = ( +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"ubY" = ( +/obj/structure/transit_tube/curved/flipped, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat/foyer) +"ucc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/obj/effect/turf_decal/caution{ + pixel_y = -17 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"ucd" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"uce" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/relay) +"uck" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"ucq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/landmark/start/cook, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"ucz" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"ucB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"ucC" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"ucF" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 4; + pixel_y = 10 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"ucJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/upper/secondary/entry) +"ucO" = ( +/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/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"ucR" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "hopqueue"; + name = "HoP Queue Shutters" + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/hop) +"ucS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/research{ + id_tag = "ResearchExt"; + name = "Research Division"; + req_one_access_txt = "47" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"ucU" = ( +/turf/open/floor/carpet/orange, +/area/quartermaster/qm) +"ucV" = ( +/obj/structure/ladder, +/turf/open/floor/plating, +/area/space/nearstation) +"uda" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"udp" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/holopad{ + pixel_y = 16 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"uds" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/checkpoint/medical) +"udF" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"udM" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"udN" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"udO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"udS" = ( +/obj/structure/flora/rock/pile/largejungle, +/turf/open/floor/grass, +/area/crew_quarters/park) +"udX" = ( +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"udY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/disposal/bin, +/obj/structure/sign/warning/nosmoking{ + pixel_x = 32 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/misc_lab/range) +"ued" = ( +/obj/machinery/camera/autoname{ + dir = 8; + network = list("aisat") + }, +/turf/open/openspace/airless, +/area/space) +"uee" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Filters to Temp" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ueq" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/light/small, +/obj/machinery/door/window/brigdoor/northright{ + dir = 8; + name = "Security Boards"; + req_access_txt = "16" + }, +/obj/effect/spawner/lootdrop/aimodule_neutral, +/obj/effect/spawner/lootdrop/aimodule_neutral, +/obj/effect/spawner/lootdrop/aimodule_neutral, +/turf/open/floor/circuit/green, +/area/ai_monitored/turret_protected/ai_upload) +"uew" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"uex" = ( +/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/inverse{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"uey" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/vending/snack/random, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"ueH" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ueV" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"ueW" = ( +/obj/machinery/computer/shuttle_flight{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/storage/art) +"ueX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"ufk" = ( +/obj/machinery/computer/security/telescreen/interrogation{ + dir = 1; + pixel_y = -30 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/filingcabinet/security, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"ufn" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/security/brig) +"ufs" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"ufu" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/storage/tools) +"ufB" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/carpet/blue, +/area/security/brig) +"ufF" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/supply) +"ugh" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "research_shutters"; + name = "research shutters" + }, +/turf/open/floor/plating, +/area/science/lab) +"ugj" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/marker_beacon, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"ugo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"ugs" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Evidence"; + req_one_access_txt = "1;4" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"ugw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/requests_console{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"ugE" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"ugF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat/foyer) +"ugI" = ( +/obj/machinery/atmospherics/components/binary/pump/on, +/obj/machinery/airlock_sensor/incinerator_toxmix{ + pixel_x = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/mixing/chamber) +"ugL" = ( +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"ugY" = ( +/obj/structure/table/wood, +/obj/machinery/computer/libraryconsole{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/library) +"uhb" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"uhc" = ( +/obj/machinery/door/airlock/command{ + name = "Chief Engineer's Office"; + req_access_txt = "56" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"uhf" = ( +/obj/structure/flora/ausbushes/grassybush, +/turf/open/floor/grass, +/area/crew_quarters/park) +"uhI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"uhM" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"uhW" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine"; + req_access_txt = "10" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"uie" = ( +/obj/structure/lattice, +/turf/open/openspace, +/area/engine/engine_room) +"uii" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uin" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/machinery/computer/cargo{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/science) +"uir" = ( +/turf/closed/wall/r_wall, +/area/science/storage) +"uix" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"uiE" = ( +/obj/structure/window/reinforced{ + pixel_y = 2 + }, +/turf/open/space/basic, +/area/space) +"uiP" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"uiQ" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"uiW" = ( +/turf/closed/wall, +/area/engine/atmos) +"uiY" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/closet/secure_closet/security/sec, +/turf/open/floor/plasteel/dark, +/area/security/main) +"ujd" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/landmark/start/security_officer, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/main) +"ujm" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"ujt" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/research) +"ujB" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"ujJ" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"ukk" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"ukn" = ( +/obj/machinery/computer/nanite_chamber_control{ + dir = 8 + }, +/turf/open/floor/circuit, +/area/science/nanite) +"ukA" = ( +/obj/effect/turf_decal/tile/blue{ + 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/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"ukB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"ukG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ukK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/closed/wall, +/area/science/test_area) +"ukO" = ( +/obj/machinery/holopad, +/obj/effect/landmark/start/brig_phys, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/security/brig) +"ulB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ulD" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"ulJ" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"ulZ" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/storage/tools) +"umf" = ( +/obj/effect/landmark/start/station_engineer, +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uml" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/sign/warning/docking{ + pixel_x = 32 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"umn" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"umz" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"umF" = ( +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/machinery/vending/wallmed{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"umP" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"uni" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"unj" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/obj/machinery/computer/cryopod{ + pixel_y = 26 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/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/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/security/prison) +"unk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"unp" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"unt" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"unE" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/science/shuttle) +"unP" = ( +/obj/machinery/door/airlock/external{ + name = "Exploration Shuttle Bay" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"unT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"unX" = ( +/obj/structure/chair/comfy, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"uoh" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"uov" = ( +/obj/machinery/door/airlock/public/glass, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"uoC" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"uoN" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/structure/grille, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"upa" = ( +/obj/structure/grille, +/turf/closed/wall, +/area/space/nearstation) +"upl" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"upm" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/machinery/iv_drip, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"upP" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"upS" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "dorm2" + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/dorms) +"uqc" = ( +/turf/closed/wall/r_wall, +/area/security/brig) +"uqe" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"uqv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"uqw" = ( +/obj/machinery/status_display/evac{ + pixel_x = -32 + }, +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"ure" = ( +/obj/structure/rack, +/obj/item/hand_tele{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/beacon, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/machinery/requests_console{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"uri" = ( +/turf/closed/wall, +/area/lawoffice) +"urj" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"urk" = ( +/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/layer1, +/turf/open/floor/plasteel, +/area/science/shuttle) +"uro" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/telecomms/bus/preset_two, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) +"urq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"urs" = ( +/obj/structure/rack, +/obj/item/clothing/neck/petcollar, +/obj/item/clothing/neck/petcollar, +/obj/item/clothing/neck/petcollar, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"urv" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"urx" = ( +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"urF" = ( +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"urG" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Service Foyer"; + req_one_access_txt = "22;25;26;28;35;37;38;46" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"urX" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm3"; + name = "Cabin 3" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"ush" = ( +/obj/structure/table, +/obj/item/retractor, +/obj/item/hemostat, +/obj/effect/turf_decal/stripes/line, +/obj/item/blood_filter, +/turf/open/floor/plasteel/white/side, +/area/medical/surgery) +"uss" = ( +/turf/closed/wall/r_wall, +/area/engine/atmospherics_engine) +"usv" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"usy" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrous_output, +/turf/open/floor/engine/n2o, +/area/engine/atmos) +"usJ" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"usL" = ( +/obj/machinery/door/poddoor/shutters{ + id = "evashutters2"; + name = "E.V.A. Storage Shutters" + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/button/door{ + id = "evashutters2"; + name = "E.V.A. Shutters"; + pixel_y = 24; + req_access_txt = "19" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"usN" = ( +/obj/machinery/photocopier, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"usO" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"usS" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"utk" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"uto" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/upper/primary/port) +"uty" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"utA" = ( +/obj/effect/turf_decal/tile/purple, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"utC" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/shower{ + pixel_y = 16 + }, +/turf/open/floor/noslip/dark, +/area/engine/engineering) +"utD" = ( +/obj/structure/chair/office/light{ + dir = 1; + pixel_y = 3 + }, +/obj/effect/landmark/start/scientist, +/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/white, +/area/science/lab) +"utO" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"utW" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/science/lab) +"uua" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/crowbar, +/obj/item/screwdriver, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/spawner/lootdrop/three_course_meal, +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance/two, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/maintenance/fore) +"uuy" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/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/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"uuC" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"uuG" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"uuK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"uuQ" = ( +/obj/structure/dresser, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/theatre) +"uuU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"uuW" = ( +/obj/machinery/computer/cargo{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/requests_console{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/supply) +"uuX" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/structure/flora/ausbushes, +/obj/structure/flora/ausbushes/ywflowers, +/turf/open/floor/plating/asteroid, +/area/maintenance/port) +"uvg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/vacant_room/commissary) +"uvl" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"uvm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"uvC" = ( +/obj/structure/table/reinforced, +/obj/item/multitool, +/obj/item/multitool{ + pixel_x = 3 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 + }, +/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 = 1 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"uvE" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"uvF" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Prison Main North"; + network = list("ss13","prison") + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel, +/area/security/prison) +"uvI" = ( +/obj/machinery/power/emitter{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"uvK" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/flashlight/glowstick/orange, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"uvR" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"uvX" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Long-Term Cell 2"; + req_access_txt = "2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"uwb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/caution{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/foyer) +"uwp" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"uwy" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"uwF" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/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/checkpoint/medical) +"uwH" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"uwI" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/railing/corner, +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"uwL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"uwP" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/button/flasher{ + id = "court"; + pixel_x = 28; + pixel_y = 27 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"uwS" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"uxh" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"uxu" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"uxv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + sortType = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"uxy" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"uxN" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"uxS" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"uxT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"uyl" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"uyA" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/beacon, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"uyC" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"uyG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Botany Hallway" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"uyK" = ( +/obj/effect/landmark/start/assistant, +/obj/structure/chair/stool/bar, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"uyO" = ( +/turf/closed/wall, +/area/maintenance/solars/port/aft) +"uyR" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/obj/effect/landmark/start/librarian, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/engine/cult, +/area/library) +"uyY" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"uza" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/departments/engineering{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uzd" = ( +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"uzh" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"uzi" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ai_monitored/storage/eva) +"uzm" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"uzr" = ( +/obj/machinery/door/airlock/public/glass, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"uzy" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/ladder, +/turf/open/floor/plasteel, +/area/hydroponics) +"uzO" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"uAl" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"uAm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"uAs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"uAt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"uAw" = ( +/obj/machinery/computer/mecha, +/turf/open/floor/carpet/purple, +/area/crew_quarters/heads/hor) +"uAy" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"uAz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"uAB" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"uAE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/plating, +/area/maintenance/fore) +"uAR" = ( +/obj/machinery/computer/security{ + dir = 1 + }, +/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{ + dir = 2 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/science) +"uAV" = ( +/obj/machinery/flasher{ + id = "PCell 1"; + pixel_x = -28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Cell 2"; + dir = 4; + network = list("ss13","prison") + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"uBe" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uBm" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"uBo" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/computer/crew{ + dir = 4 + }, +/obj/effect/turf_decal/tile{ + dir = 4 + }, +/obj/effect/turf_decal/tile, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"uBq" = ( +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/atmospherics_engine) +"uBD" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"uBE" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"uBF" = ( +/obj/machinery/door/airlock/mining{ + name = "Mining Docks"; + req_access_txt = "48" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"uBI" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"uBN" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"uBQ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"uCe" = ( +/turf/closed/wall/r_wall, +/area/medical/storage) +"uCj" = ( +/obj/machinery/gateway, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/gateway) +"uCm" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/suit_storage_unit/exploration, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, +/area/gateway) +"uCy" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"uCG" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"uCW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/turf/open/openspace/airless, +/area/space/nearstation) +"uDp" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"uDt" = ( +/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/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"uDF" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"uDO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"uDQ" = ( +/obj/structure/cable/yellow{ + 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/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/airlock/highsecurity{ + name = "Secure Tech Storage"; + req_access_txt = "19;23" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"uDV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat AI Access"; + req_access_txt = "65" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"uDX" = ( +/obj/structure/chair/comfy{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"uEa" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/science/lab) +"uEn" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/closet/secure_closet/hos, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = 32 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "hosoffice"; + name = "Head of Security's Office Shutters"; + normaldoorcontrol = 0; + pixel_x = -26 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"uEq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"uEs" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"uEI" = ( +/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/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"uFc" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"uFj" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/port) +"uFu" = ( +/obj/machinery/dna_scannernew, +/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/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"uFK" = ( +/obj/machinery/door/airlock/research{ + name = "Toxins Lab"; + req_access_txt = "8" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"uFM" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"uFQ" = ( +/turf/closed/wall/r_wall, +/area/science/nanite) +"uFU" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/law) +"uGa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/airlock/security/glass{ + name = "Security Medical"; + req_access_txt = "63" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/security/brig) +"uGd" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"uGp" = ( +/obj/effect/turf_decal/tile/red{ + 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/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/science) +"uGs" = ( +/obj/item/beacon, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"uGR" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"uGV" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/spawner/lootdrop/glowstick, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"uGZ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"uHa" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"uHe" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"uHh" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/engine/atmos) +"uHl" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"uHs" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"uHR" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/light/small, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"uHT" = ( +/obj/effect/spawner/room/tenxfive, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"uHV" = ( +/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/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"uIl" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/structure/flora/ausbushes/palebush, +/turf/open/floor/grass, +/area/crew_quarters/park) +"uIm" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"uIq" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"uIu" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "virology"; + name = "Virology Lockdown Shutters" + }, +/turf/open/floor/plating, +/area/medical/virology) +"uIE" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"uIT" = ( +/obj/machinery/light/small/broken, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"uIV" = ( +/obj/item/flashlight/glowstick/yellow, +/turf/open/floor/plating, +/area/maintenance/port) +"uIY" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"uJl" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"uJm" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + 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 = 6 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"uJv" = ( +/obj/structure/transit_tube{ + dir = 8 + }, +/turf/open/space/basic, +/area/space) +"uJB" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"uJE" = ( +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"uJH" = ( +/obj/machinery/button/door{ + id = "shower3"; + name = "Shower Bolts"; + normaldoorcontrol = 1; + pixel_x = 28; + pixel_y = -4; + specialfunctions = 4 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 12 + }, +/obj/structure/mirror{ + pixel_y = 30 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"uJZ" = ( +/obj/machinery/flasher{ + id = "Cell 2"; + pixel_x = -28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/carpet/blue, +/area/security/brig) +"uKx" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"uKQ" = ( +/obj/effect/landmark/start/medical_doctor, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"uKV" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 8; + initialize_directions = 8 + }, +/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/white, +/area/science/xenobiology) +"uLa" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2; + sortType = 12 + }, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"uLp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"uLs" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + 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/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"uLt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + req_access_txt = "10" + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"uLC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"uLL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"uLV" = ( +/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/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"uMg" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port) +"uMu" = ( +/turf/closed/wall, +/area/quartermaster/exploration_dock) +"uMz" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"uMC" = ( +/obj/effect/turf_decal/tile/purple, +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"uMO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"uNa" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/landmark/secequipment, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/security/main) +"uNj" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"uNJ" = ( +/obj/machinery/atmospherics/components/binary/circulator{ + dir = 4; + icon_state = "circ-off-0" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"uNL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"uNQ" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/engine/atmos) +"uNR" = ( +/obj/structure/flora/junglebush, +/turf/open/floor/grass, +/area/crew_quarters/park) +"uNX" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"uOk" = ( +/obj/structure/flora/junglebush, +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/grass, +/area/crew_quarters/park) +"uOo" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"uOy" = ( +/obj/machinery/computer/atmos_control/tank/toxin_tank, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"uOH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/computer/station_alert{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"uOQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/closed/wall, +/area/maintenance/starboard/secondary) +"uOR" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"uPh" = ( +/obj/machinery/atmospherics/components/unary/passive_vent, +/obj/item/radio/intercom{ + pixel_x = -28; + pixel_y = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"uPi" = ( +/obj/effect/turf_decal/tile/brown, +/obj/machinery/light, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_y = 3 + }, +/obj/item/stamp/denied{ + pixel_x = 1; + pixel_y = 6 + }, +/obj/item/stamp{ + pixel_x = -1; + pixel_y = 2 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"uPm" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"uPA" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/openspace, +/area/medical/medbay/balcony) +"uPC" = ( +/obj/machinery/door/airlock/engineering{ + name = "Auxillary Base Construction"; + req_one_access_txt = "32;47;48" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/construction/mining/aux_base) +"uPG" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/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/autoname{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/structure/chair/stool/bar{ + pixel_y = 12 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"uPH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"uPI" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"uPK" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/machinery/computer/secure_data, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/medical) +"uPL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "virology"; + name = "Virology Lockdown Shutters" + }, +/turf/open/floor/plating, +/area/medical/virology) +"uPM" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uPO" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"uQx" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"uQy" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"uQF" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"uQM" = ( +/obj/machinery/door_timer{ + id = "Cell 2"; + name = "Cell 2"; + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"uQO" = ( +/obj/machinery/newscaster{ + pixel_x = 30 + }, +/turf/open/floor/carpet/green, +/area/library) +"uRa" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 1 + }, +/obj/machinery/meter, +/obj/machinery/button/ignition/incinerator/toxmix{ + pixel_x = -5; + pixel_y = 26 + }, +/obj/machinery/button/door/incinerator_vent_toxmix{ + pixel_x = 6; + pixel_y = 26 + }, +/obj/machinery/power/apc{ + areastring = "/area/science/mixing/chamber"; + dir = 8; + name = "Toxins Chamber APC"; + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"uRy" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"uRK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/science/storage) +"uRS" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"uRX" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"uSa" = ( +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/science/misc_lab/range) +"uSf" = ( +/obj/structure/closet/l3closet/virology, +/obj/item/extrapolator, +/obj/item/extrapolator, +/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/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"uSz" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"uSB" = ( +/obj/machinery/door/window/northleft{ + dir = 8; + name = "Heavy Containment Access"; + reinf = 0; + req_access_txt = "55" + }, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Heavy Containment Access"; + reinf = 0; + req_access_txt = "55" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio"; + name = "Blast Doors" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"uSE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"uSI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"uSK" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/secondary) +"uSM" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + 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/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"uSS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"uST" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uSU" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"uSW" = ( +/obj/effect/turf_decal/caution, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"uTc" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"uTk" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/closet/secure_closet/courtroom, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"uTz" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"uTG" = ( +/obj/machinery/vending/custom{ + pixel_x = -3 + }, +/turf/open/floor/wood, +/area/library) +"uTI" = ( +/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/brown{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"uTJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"uTR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters{ + id = "aicoremain" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"uTX" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/machinery/button/door{ + id = "kitchenconveyor"; + name = "Kitchen Belt Shutters"; + pixel_x = -27; + pixel_y = -5; + req_access_txt = "28" + }, +/obj/machinery/icecream_vat, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"uUh" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"uUl" = ( +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uUo" = ( +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"uUt" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_y = 3 + }, +/obj/item/pen{ + pixel_y = 2 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/circuit/telecomms/server, +/area/tcommsat/relay) +"uUD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"uUK" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"uUL" = ( +/obj/machinery/chem_master/condimaster, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"uUP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"uUT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"uUW" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"uVf" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port) +"uVq" = ( +/turf/closed/wall, +/area/maintenance/starboard/aft) +"uVs" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + id = "Cell 2"; + name = "Cell 2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/security/brig) +"uVB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"uVJ" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/primary/fore) +"uVP" = ( +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet, +/area/hallway/primary/fore) +"uWc" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"uWd" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"uWi" = ( +/turf/closed/wall/r_wall, +/area/bridge) +"uWj" = ( +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/port) +"uWr" = ( +/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/white, +/area/medical/surgery/aux) +"uWs" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"uWu" = ( +/obj/structure/curtain, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"uWv" = ( +/turf/closed/wall, +/area/medical/chemistry) +"uWB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"uWY" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/requests_console{ + department = "Aft Primary Hallway"; + pixel_x = 32 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"uXd" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/openspace, +/area/quartermaster/exploration_prep) +"uXk" = ( +/obj/structure/girder/displaced, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"uXr" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"uXu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/carpet/cyan, +/area/crew_quarters/heads/cmo) +"uXv" = ( +/obj/machinery/computer/crew, +/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/tile/blue, +/turf/open/floor/plasteel, +/area/bridge) +"uXz" = ( +/obj/machinery/door/poddoor/preopen{ + id = "bridgedoors"; + name = "Bridge Access Blast door" + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/bridge) +"uXA" = ( +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"uXM" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"uXX" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/altar_of_gods, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"uYb" = ( +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"uYe" = ( +/obj/effect/landmark/carpspawn, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"uYt" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"uYC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"uYG" = ( +/obj/structure/table/wood, +/obj/item/modular_computer/tablet/preset/cargo, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/carpet/orange, +/area/quartermaster/qm) +"uYK" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"uYO" = ( +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"uYY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"uZf" = ( +/turf/closed/wall, +/area/security/courtroom) +"uZj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/public/glass, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"uZk" = ( +/turf/closed/wall, +/area/maintenance/port/central) +"uZn" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"uZy" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/item/paper/fluff{ + info = "Priority Command Notice:\nAfter several incident reports, all crew are advised to NOT put felinids in the pet containment cells. Unlike the animals some of them might have some form of cognitive ability, however this is just a hypothesis at this time."; + name = "Pet store notice" + }, +/obj/item/clothing/neck/petcollar, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"uZO" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/department/science) +"vac" = ( +/turf/closed/wall/r_wall, +/area/security/nuke_storage) +"var" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"vaA" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"vaD" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"vaT" = ( +/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/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"vaV" = ( +/obj/structure/table, +/obj/item/retractor, +/obj/item/hemostat, +/obj/effect/turf_decal/stripes/line, +/obj/item/blood_filter, +/turf/open/floor/plasteel/white/side, +/area/medical/surgery/aux) +"vaW" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/closed/wall, +/area/maintenance/starboard/fore) +"vbp" = ( +/obj/machinery/door/airlock/command{ + name = "Gateway Mission Control"; + req_access_txt = "62" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/gateway) +"vbs" = ( +/obj/machinery/light/small, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"vbt" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/tank/internals/plasma/full, +/obj/item/analyzer, +/turf/open/floor/plasteel, +/area/science/mixing) +"vbD" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"vbH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"vbI" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"vbK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"vbP" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel/dark, +/area/gateway) +"vbQ" = ( +/obj/structure/chair/comfy{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"vbT" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/security_space_law, +/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{ + dir = 2 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/supply) +"vbV" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"vce" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"vcg" = ( +/obj/machinery/door/airlock/hatch{ + name = "MiniSat AI Access"; + req_access_txt = "65" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"vcp" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"vct" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/vending/wardrobe/science_wardrobe, +/turf/open/floor/plasteel/white, +/area/science/lab) +"vcE" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/grass, +/area/crew_quarters/park) +"vcF" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/airalarm/directional/south, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_a) +"vcN" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) +"vcW" = ( +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"vda" = ( +/obj/structure/stairs, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/sign/poster/random{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"vdd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"vde" = ( +/obj/structure/chair/pew/right{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/chapel, +/area/chapel/main/monastery) +"vdv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"vdG" = ( +/obj/structure/flora/ausbushes/grassybush, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/grass, +/area/hallway/secondary/command) +"vdI" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"vdO" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"vdP" = ( +/obj/docking_port/stationary{ + dheight = 4; + dwidth = 4; + height = 9; + id = "aux_base_zone"; + name = "aux base zone"; + roundstart_template = /datum/map_template/shuttle/aux_base/default; + width = 9 + }, +/turf/open/floor/plating, +/area/construction/mining/aux_base) +"vdW" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/engine/engineering) +"veB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"veK" = ( +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"veM" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/table, +/obj/machinery/recharger, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"veR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Public Office" + }, +/turf/open/floor/plasteel, +/area/storage/art) +"veX" = ( +/turf/closed/wall, +/area/crew_quarters/dorms) +"vfh" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"vfi" = ( +/obj/machinery/advanced_airlock_controller/directional/south, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/shuttle) +"vfk" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Library" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/library) +"vfn" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"vfo" = ( +/obj/structure/table/glass, +/obj/item/radio/off{ + pixel_y = 4 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"vfq" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"vfv" = ( +/obj/machinery/door/airlock/mining{ + name = "Mining Docks"; + req_access_txt = "48" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"vfI" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/landmark/start/quartermaster, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"vfK" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/newscaster/security_unit{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/science) +"vfQ" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"vgf" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"vgi" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"vgn" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/monofloor{ + dir = 8 + }, +/area/quartermaster/exploration_prep) +"vgq" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"vgr" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/fore) +"vgw" = ( +/obj/structure/chair/comfy/black, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"vgx" = ( +/obj/structure/bookcase/random/reference, +/turf/open/floor/wood, +/area/library) +"vgC" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/crew_quarters/toilet) +"vgD" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/brflowers, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/grass, +/area/hallway/secondary/command) +"vgF" = ( +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/science/storage) +"vgH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"vgQ" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"vgV" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/extinguisher_cabinet{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"vha" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"vhc" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"vhf" = ( +/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/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"vhh" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/dorms) +"vhi" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = -5; + pixel_y = -25 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/rack, +/obj/item/paper/pamphlet/gateway, +/obj/item/paper/pamphlet/gateway{ + pixel_x = -1; + pixel_y = -2 + }, +/obj/item/paper/pamphlet/gateway{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"vhk" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"vhs" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/openspace, +/area/maintenance/upper/starboard/central) +"vhI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"vhK" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"vhQ" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating, +/area/maintenance/port/central) +"vhT" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/structure/flora/ausbushes/ywflowers, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"vic" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/airlock/security/glass{ + name = "Prisoner Processing"; + req_one_access_txt = "2" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"vih" = ( +/obj/structure/table/wood, +/obj/machinery/door/window/brigdoor/northleft{ + dir = 2; + name = "Captain's Desk"; + req_access_txt = "20" + }, +/obj/item/folder/blue, +/obj/item/pen/fourcolor, +/obj/item/stamp/captain, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain) +"viG" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/transit_tube/curved/flipped{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"viH" = ( +/obj/structure/lattice/catwalk, +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"vjc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"vjf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"vjn" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/structure/flora/ausbushes/brflowers, +/turf/open/water/air, +/area/crew_quarters/park) +"vjo" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"vju" = ( +/obj/item/modular_computer/laptop/preset/civillian, +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel/dark, +/area/storage/art) +"vjv" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"vjI" = ( +/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/sink{ + dir = 8; + pixel_x = -14; + pixel_y = 1 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"vjK" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1; + initialize_directions = 1 + }, +/obj/machinery/light, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/requests_console{ + department = "Medical Cryo"; + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/cryo) +"vjL" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/airlock/highsecurity{ + name = "AI Core"; + req_access_txt = "65" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"vjX" = ( +/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/navbeacon{ + codes_txt = "patrol;next_patrol=hall3"; + location = "hall2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"vkc" = ( +/obj/structure/bed, +/obj/item/bedsheet/hop, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"vkh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/upper/secondary/entry) +"vkC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"vkM" = ( +/obj/machinery/computer/card{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain) +"vkT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/engine/engineering) +"vkY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"vle" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"vlf" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"vlj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"vlz" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"vlB" = ( +/obj/machinery/computer/operating{ + dir = 1; + name = "Robotics Operating Computer" + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"vlO" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/AIsatextAP) +"vlQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"vlX" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"vmm" = ( +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/turf/open/floor/wood, +/area/hallway/primary/fore) +"vmo" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet/blue, +/area/security/brig) +"vms" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"vmv" = ( +/turf/closed/wall, +/area/maintenance/department/science) +"vmG" = ( +/obj/machinery/door/airlock{ + name = "Unisex Showers" + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"vnh" = ( +/obj/machinery/power/smes/engineering{ + charge = 2e+006 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"vno" = ( +/obj/machinery/advanced_airlock_controller/directional/north, +/obj/machinery/atmospherics/components/binary/dp_vent_pump, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"vns" = ( +/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/white, +/area/medical/sleeper) +"vnu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/airlock/public/glass{ + name = "Fore Primary Hallway" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"vnK" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"vnY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"vnZ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"vof" = ( +/obj/structure/window/reinforced/spawner{ + 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/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/transit_tube/curved/flipped, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"vok" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"voT" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"voV" = ( +/obj/machinery/requests_console{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"vpa" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"vpj" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"vpl" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"vpm" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"vpt" = ( +/turf/open/openspace/airless, +/area/maintenance/upper/aft) +"vpU" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"vpY" = ( +/turf/open/floor/plasteel/white, +/area/science/shuttledock) +"vqC" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/brflowers, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/dorms"; + dir = 8; + name = "Dorms APC"; + pixel_x = -24 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/port) +"vqD" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"vqI" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"vqV" = ( +/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/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"vrb" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/techstorage/engineering, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"vrB" = ( +/obj/machinery/power/tracker, +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/port/aft) +"vrD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"vrK" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"vrV" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Bar Panel" + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"vrW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"vss" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/open/floor/plating, +/area/engine/atmos) +"vsy" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"vsD" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"vsX" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"vsY" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/science/lab) +"vsZ" = ( +/obj/machinery/advanced_airlock_controller{ + pixel_y = 24 + }, +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/binary/dp_vent_pump, +/turf/open/floor/plating, +/area/science/shuttle) +"vtd" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"vto" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"vtp" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/carpet/orange, +/area/quartermaster/qm) +"vtq" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"vtz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"vtN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/fore) +"vtS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"vtT" = ( +/obj/machinery/advanced_airlock_controller/directional/north, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"vtX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/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) +"vue" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plating, +/area/maintenance/fore) +"vup" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/vending/wardrobe/engi_wardrobe, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/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/dark, +/area/engine/atmos) +"vur" = ( +/obj/machinery/suit_storage_unit/ce, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/chief) +"vuw" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"vuH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"vuM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"vuU" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/sign/departments/restroom{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"vuX" = ( +/turf/closed/wall, +/area/crew_quarters/heads/hor) +"vva" = ( +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_x = 3; + pixel_y = 8 + }, +/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/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"vve" = ( +/obj/machinery/light, +/obj/machinery/portable_atmospherics/canister/proto, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"vvp" = ( +/obj/effect/spawner/lootdrop/glowstick, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"vvz" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/solar/port/fore) +"vvE" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"vvG" = ( +/obj/structure/table/wood, +/obj/item/gavelblock, +/obj/item/gavelhammer, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"vvN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"vvP" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Chemistry"; + departmentType = 2; + pixel_y = 32 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/syringe{ + pixel_x = 1; + pixel_y = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"vvQ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/computer/security/mining{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"vvV" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"vwj" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/electrical{ + pixel_y = 4 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = -2 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"vwo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + 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/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall18"; + location = "hall17" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"vwp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel/chapel{ + dir = 8 + }, +/area/chapel/main/monastery) +"vwE" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"vwF" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"vwG" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port/central) +"vwS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"vxd" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/explab) +"vxh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/bridge) +"vxp" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/disposal) +"vxx" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/obj/item/poster/random_official, +/obj/item/poster/random_official, +/obj/item/poster/random_official, +/turf/open/floor/carpet/red, +/area/security/detectives_office) +"vxB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"vxL" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/landmark/start/medical_doctor, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"vxN" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"vxU" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"vyp" = ( +/obj/machinery/camera/autoname{ + dir = 1; + network = list("aisat") + }, +/turf/open/openspace/airless, +/area/space/nearstation) +"vyw" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L2" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"vyC" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/turf/open/space/basic, +/area/solar/port/aft) +"vyG" = ( +/obj/machinery/power/turbine{ + dir = 4; + luminosity = 2 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/engine/vacuum, +/area/engine/atmospherics_engine) +"vyQ" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"vzd" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"vzq" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"vzE" = ( +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"vzH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"vAr" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"vAA" = ( +/obj/machinery/mass_driver{ + dir = 8; + id = "toxinsdriver" + }, +/obj/structure/sign/warning/explosives{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/science/misc_lab/range) +"vAI" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"vAJ" = ( +/turf/closed/wall, +/area/construction/mining/aux_base) +"vAQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"vAV" = ( +/obj/machinery/door/airlock/medical{ + name = "Patient Room B"; + req_access_txt = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_b) +"vBb" = ( +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"vBd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/maintenance/upper/aft) +"vBf" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/crew_quarters/bar) +"vBi" = ( +/obj/machinery/porta_turret/ai{ + dir = 4; + installation = /obj/item/gun/energy/e_gun + }, +/obj/effect/turf_decal/stripes/red/box, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) +"vBj" = ( +/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/maintenance/starboard/aft) +"vBs" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "research_shutters"; + name = "research shutters" + }, +/obj/machinery/door/window/eastright{ + dir = 2; + name = "Research and Development Desk"; + req_one_access_txt = "7;29" + }, +/obj/item/paper_bin, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/science/lab) +"vCe" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"vCs" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"vCv" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"vCO" = ( +/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/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"vCT" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/science/xenobiology) +"vDj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"vDm" = ( +/obj/effect/landmark/xeno_spawn, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"vDr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"vDt" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"vDz" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"vDI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/storage/tools) +"vDV" = ( +/turf/open/floor/plasteel/dark, +/area/gateway) +"vDW" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"vDZ" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"vEd" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"vEn" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"vEq" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/gateway) +"vEK" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"vEL" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/science/shuttle) +"vEV" = ( +/obj/structure/table/reinforced, +/obj/item/cartridge/quartermaster{ + pixel_x = -6 + }, +/obj/item/cartridge/quartermaster{ + pixel_x = 6 + }, +/obj/item/cartridge/quartermaster{ + pixel_y = 6 + }, +/obj/item/gps/mining, +/obj/machinery/newscaster{ + pixel_y = -29 + }, +/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/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"vFd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"vFg" = ( +/obj/structure/reflector/single/mapping{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"vFp" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"vGa" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"vGd" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/hop) +"vGE" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio3"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"vGK" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"vGP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"vHr" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"vHu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"vHy" = ( +/turf/closed/wall, +/area/hallway/primary/starboard) +"vHF" = ( +/obj/machinery/computer/monitor, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"vHR" = ( +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"vHS" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"vIb" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) +"vIc" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"vIh" = ( +/obj/structure/table/glass, +/obj/item/hatchet, +/obj/item/cultivator, +/obj/item/plant_analyzer, +/obj/item/reagent_containers/spray/pestspray{ + pixel_x = 3; + pixel_y = 4 + }, +/turf/open/floor/grass, +/area/hydroponics/garden) +"vIi" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/white, +/area/science/research) +"vIk" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/circuit, +/area/science/robotics) +"vIn" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/item/reagent_containers/glass/bucket, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"vIt" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/storage/box/rxglasses{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/radio/headset/headset_medsci, +/obj/item/storage/box/monkeycubes, +/obj/item/storage/box/monkeycubes, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"vIA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/coldroom) +"vIK" = ( +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"vIU" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/airalarm/directional/south, +/obj/structure/ladder, +/turf/open/openspace, +/area/maintenance/upper/central) +"vIX" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"vJn" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/turf/open/space/basic, +/area/space) +"vJx" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"vJB" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"vJL" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"vJZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"vKd" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"vKp" = ( +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "CE's Desk"; + departmentType = 5; + pixel_x = 32 + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"vKt" = ( +/obj/item/bedsheet/clown, +/obj/structure/bed, +/obj/effect/landmark/start/clown, +/obj/structure/sign/poster/official/no_erp{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/theatre) +"vKu" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"vKD" = ( +/turf/template_noop, +/area/maintenance/department/crew_quarters/dorms) +"vKO" = ( +/obj/effect/turf_decal/tile/neutral{ + 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/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"vKS" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"vKV" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"vKY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/misc_lab/range) +"vLb" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"vLg" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"vLi" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"vLs" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/plasteel, +/area/engine/atmos) +"vLA" = ( +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"vLN" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"vLO" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"vLU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/hallway/upper/secondary/exit/departure_lounge) +"vLW" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"vMa" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"vMc" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "packageSort2" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"vMf" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine"; + req_access_txt = "10" + }, +/obj/structure/cable/yellow{ + 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/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/engine, +/area/engine/engine_room) +"vMs" = ( +/obj/machinery/requests_console{ + department = "Lawyer's Office"; + departmentType = 4; + pixel_y = 32 + }, +/obj/structure/table/wood, +/obj/item/storage/secure/briefcase, +/obj/item/laser_pointer, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"vMt" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/landmark/start/exploration, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"vMu" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/engine/gravity_generator) +"vMJ" = ( +/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/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"vMY" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/white/side{ + dir = 9 + }, +/area/medical/medbay/aft) +"vNm" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = 32 + }, +/obj/machinery/igniter{ + id = "deathroom" + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"vNn" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"vNt" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/landmark/start/detective, +/turf/open/floor/carpet/red, +/area/security/detectives_office) +"vNN" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 23 + }, +/turf/open/floor/plasteel/white, +/area/maintenance/starboard/aft) +"vNO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/reflector/single/anchored{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"vNQ" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"vNR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"vNX" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/science/storage) +"vOa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"vOo" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 21 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"vOU" = ( +/obj/structure/bed/dogbed, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"vOV" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"vOZ" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"vPk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/hallway/upper/primary/fore) +"vPu" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"vPD" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"vPJ" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"vPS" = ( +/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/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"vPT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/closed/wall, +/area/maintenance/starboard/secondary) +"vPX" = ( +/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/hallway/upper/secondary/entry) +"vPY" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"vPZ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"vQj" = ( +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/obj/effect/mapping_helpers/airlock/unres, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"vQm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"vQw" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 1; + height = 4; + name = "escape pod"; + roundstart_template = /datum/map_template/shuttle/escape_pod/default; + width = 3 + }, +/turf/open/space/basic, +/area/space) +"vQA" = ( +/obj/machinery/camera/autoname, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/circuit/telecomms, +/area/science/xenobiology) +"vQB" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"vQC" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/department/science) +"vQE" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/computer/rdconsole/production, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/dark, +/area/engine/storage_shared) +"vQJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"vQK" = ( +/obj/structure/dresser, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"vQQ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"vQR" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"vQT" = ( +/obj/machinery/iv_drip/saline, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"vQV" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/science/xenobiology) +"vRc" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"vRm" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"vRD" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/newscaster{ + pixel_x = 30 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"vRE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/wood, +/area/library) +"vRI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/engine/atmos) +"vRJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/floor/plating, +/area/engine/atmos) +"vRN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"vRV" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"vRW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall, +/area/science/shuttledock) +"vSc" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"vSg" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"vSm" = ( +/obj/item/kirbyplants/random, +/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/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"vSu" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery/aux) +"vSJ" = ( +/obj/machinery/vending/snack/random, +/obj/machinery/light, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"vSU" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"vSV" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plasteel, +/area/teleporter) +"vSY" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"vTb" = ( +/obj/structure/transit_tube/diagonal{ + dir = 4 + }, +/turf/open/space/basic, +/area/space) +"vTq" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Botany Maintenance"; + req_access_txt = "35" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/hydroponics) +"vTs" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"vTt" = ( +/obj/machinery/door/airlock/research/glass/incinerator/toxmix_interior, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/engine, +/area/science/mixing) +"vTx" = ( +/obj/machinery/computer/security/wooden_tv{ + pixel_x = 1; + pixel_y = 7 + }, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/maintenance/port) +"vTB" = ( +/obj/machinery/requests_console{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"vTC" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/toy/cards/deck, +/turf/open/floor/plasteel/white, +/area/security/prison) +"vTD" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"vTF" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"vTJ" = ( +/obj/structure/chair/sofa/right{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"vTV" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"vTX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/storage) +"vUd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/aisat/foyer) +"vUn" = ( +/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/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"vUo" = ( +/obj/machinery/advanced_airlock_controller/directional/north, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"vUt" = ( +/obj/machinery/shieldwallgen/xenobiologyaccess, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/science/xenobiology) +"vUv" = ( +/obj/structure/cable/yellow{ + 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 = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"vUz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"vVa" = ( +/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/white, +/area/medical/virology) +"vVh" = ( +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"vVz" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"vVN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"vWa" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"vWi" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/chair/wood{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"vWn" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"vWr" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/wood, +/area/vacant_room/office) +"vWu" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/item/kirbyplants/photosynthetic, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/AIsatextAP) +"vWv" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"vWA" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"vWB" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/supermatter) +"vWC" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/item/target, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/science/test_area) +"vWI" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"vWN" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"vWR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/flashlight/seclite, +/obj/item/flashlight/seclite, +/obj/item/restraints/legcuffs/bola/energy, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/storage/box/prisoner, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"vXe" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"vXi" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/reagent_containers/food/snacks/grown/harebell, +/obj/item/reagent_containers/food/snacks/grown/harebell, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"vXk" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"vXq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"vXv" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"vXE" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"vXH" = ( +/obj/structure/chair/comfy/black{ + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"vXQ" = ( +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"vYc" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"vYd" = ( +/obj/effect/turf_decal/stripes/line{ + 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 = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"vYg" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/structure/weightmachine/weightlifter, +/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/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"vYu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"vYA" = ( +/obj/machinery/disposal/bin, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) +"vYC" = ( +/obj/structure/flora/junglebush/b, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/grass, +/area/crew_quarters/park) +"vYO" = ( +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"vYQ" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"vZd" = ( +/obj/structure/table/reinforced, +/obj/item/defibrillator/loaded, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/security/brig) +"vZh" = ( +/obj/machinery/computer/card/minor/ce{ + dir = 1 + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"vZi" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"vZl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/suit_storage_unit/rd, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/hor) +"vZs" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/central) +"vZw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"vZx" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"vZD" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"vZE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/cmo) +"vZQ" = ( +/obj/machinery/door/airlock/glass{ + name = "Bar"; + req_access_txt = "25" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"vZR" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"wae" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"waI" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"waK" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 9 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"waN" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"waW" = ( +/obj/effect/turf_decal/tile/purple, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"wbe" = ( +/obj/machinery/suit_storage_unit/exploration, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"wbi" = ( +/obj/effect/spawner/structure/window, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/hydroponics/garden) +"wbl" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"wbp" = ( +/turf/open/floor/plating, +/area/maintenance/department/science) +"wbq" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"wbv" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"wbw" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/hallway/upper/primary/fore) +"wbB" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"wbC" = ( +/obj/machinery/newscaster{ + pixel_x = 30 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"wbG" = ( +/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/effect/turf_decal/delivery, +/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, +/area/medical/cryo) +"wbH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/paper, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"wbM" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/closet/secure_closet/miner, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"wbT" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"wcm" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"wcs" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_room) +"wct" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"wda" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"wdc" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"wdj" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"wdl" = ( +/obj/structure/cable/yellow{ + 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/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"wdu" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"wdK" = ( +/obj/effect/turf_decal/bot, +/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/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"wdV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/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/radio/intercom{ + pixel_y = 22 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"wdX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"wec" = ( +/obj/structure/table/glass, +/obj/item/folder/white{ + pixel_x = 2; + pixel_y = -1 + }, +/obj/item/folder/white{ + pixel_x = 1; + pixel_y = 1 + }, +/obj/item/flashlight/pen{ + pixel_x = 1; + pixel_y = 1 + }, +/obj/item/storage/pill_bottle/mutadone{ + pixel_x = -8; + pixel_y = 5 + }, +/obj/item/storage/pill_bottle/mannitol{ + pixel_x = -9 + }, +/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/machinery/light{ + dir = 8 + }, +/obj/machinery/requests_console{ + department = "Genetics"; + departmentType = 3; + pixel_x = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"wef" = ( +/obj/structure/chair/brass, +/obj/item/toy/plush/plushvar, +/obj/item/paper/fluff{ + info = "We built this so you didn't have to. Made with love."; + name = "overseer's note" + }, +/turf/open/floor/bronze, +/area/maintenance/starboard/aft) +"weg" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"weh" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"wek" = ( +/obj/machinery/conveyor{ + dir = 10; + id = "QMLoad2" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"wen" = ( +/obj/machinery/door/airlock{ + name = "Kitchen Coldroom"; + req_access_txt = "28" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"weF" = ( +/obj/machinery/door/airlock/command{ + name = "Chief Medical Officer's Office"; + req_access_txt = "40" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"weH" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"weV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"weZ" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/openspace/airless, +/area/space/nearstation) +"wfe" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"wfg" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"wfr" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"wfu" = ( +/turf/closed/wall/r_wall, +/area/engine/atmos) +"wfA" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/storage/secure/safe/caps_spare{ + pixel_x = 6; + pixel_y = -26 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"wfK" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/caution, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"wfT" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/requests_console{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/science) +"wgj" = ( +/obj/structure/sign/painting/library{ + pixel_x = -32 + }, +/turf/open/floor/wood, +/area/library) +"wgs" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/landmark/start/scientist, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"wgt" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"wgw" = ( +/obj/effect/landmark/start/cargo_technician, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"wgN" = ( +/obj/machinery/rnd/server, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/science/server) +"wgQ" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"whD" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"whG" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance/two, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"whK" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"whM" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"whN" = ( +/obj/machinery/cryopod{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/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 = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/cryopods) +"wid" = ( +/obj/machinery/light_switch{ + pixel_y = -25 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/mob/living/simple_animal/bot/cleanbot, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"wih" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/grass, +/area/crew_quarters/park) +"wii" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/item/radio, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/medical) +"wiq" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/requests_console{ + department = "Medical"; + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"wiJ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/engine_room) +"wiL" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery/aux) +"wiM" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/landmark/start/medical_doctor, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"wiV" = ( +/obj/item/storage/toolbox/mechanical/old, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"wiX" = ( +/obj/effect/landmark/start/research_director, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/heads/hor) +"wiY" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"wjf" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"wjC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"wjF" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/security{ + name = "Security Post - Medbay"; + req_access_txt = "63" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/medical) +"wjR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"wjW" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/space/basic, +/area/space/nearstation) +"wkc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"wkq" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"wkr" = ( +/obj/machinery/computer/rdconsole/robotics{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"wkz" = ( +/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/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"wkI" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Genetics Lab"; + req_access_txt = "5; 9; 68" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"wkL" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/coffee, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/hop) +"wkS" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"wkT" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_atmos{ + dir = 2 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"wla" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"wlb" = ( +/obj/machinery/door/airlock{ + id_tag = "toilet4"; + name = "Toilet Unit" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"wlf" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/turf/open/floor/monofloor{ + dir = 8 + }, +/area/quartermaster/exploration_prep) +"wlm" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/openspace, +/area/maintenance/upper/central) +"wls" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"wlu" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"wlv" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"wlU" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) +"wmb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"wmp" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer1, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"wmG" = ( +/obj/machinery/door/airlock/security/glass{ + id_tag = "outerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"wmH" = ( +/obj/structure/window/plasma/reinforced, +/obj/machinery/power/rad_collector/anchored, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/obj/structure/cable, +/turf/open/floor/circuit/green, +/area/engine/supermatter) +"wmM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"wnh" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/structure/flora/rock/pile/largejungle, +/turf/open/floor/grass, +/area/crew_quarters/park) +"wni" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"wnk" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"wno" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"wnp" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"wnE" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/reagent_containers/glass/bottle/charcoal{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bottle/epinephrine{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/storage/pill_bottle, +/obj/item/storage/pill_bottle, +/obj/item/storage/pill_bottle, +/obj/item/reagent_containers/syringe, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"wnL" = ( +/obj/effect/turf_decal/bot, +/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/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"wnM" = ( +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/displaycase/captain{ + req_access = null; + req_access_txt = "20" + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"wnO" = ( +/obj/machinery/airalarm/directional/south, +/obj/structure/table/reinforced, +/obj/item/transfer_valve, +/obj/item/transfer_valve, +/obj/item/transfer_valve, +/obj/item/transfer_valve, +/turf/open/floor/plasteel, +/area/science/mixing) +"wnR" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/britcup{ + pixel_x = -4; + pixel_y = 6 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"wnS" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"wnV" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"wob" = ( +/obj/structure/transit_tube/diagonal/crossing, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"wod" = ( +/obj/machinery/airalarm/directional/south, +/obj/structure/closet/crate/science, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) +"wor" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/engine, +/area/science/xenobiology) +"wox" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/fore) +"woz" = ( +/obj/structure/lattice, +/obj/machinery/vending/medical, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/security/brig) +"woB" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"woK" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/closet/firecloset/full, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"woO" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/closed/wall/r_wall, +/area/medical/virology) +"woS" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"woT" = ( +/obj/machinery/atmospherics/pipe/simple/multiz, +/turf/open/openspace, +/area/engine/engine_room) +"woW" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"wpo" = ( +/obj/machinery/door/window/northright{ + base_state = "left"; + dir = 2; + icon_state = "left"; + name = "Library Desk Door"; + req_access_txt = "37" + }, +/turf/open/floor/carpet/green, +/area/library) +"wps" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"wpt" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + dir = 4; + freq = 1400; + location = "Engineering" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"wpv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"wpz" = ( +/obj/machinery/door/window/northleft{ + dir = 2; + name = "Containment Pen #2"; + req_access_txt = "55" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"wpH" = ( +/turf/closed/wall, +/area/security/main) +"wpJ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"wpK" = ( +/obj/machinery/conveyor/inverted{ + dir = 10; + id = "recycling" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"wpO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"wpU" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"wpX" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/engine/engine_room) +"wqj" = ( +/obj/effect/turf_decal/caution{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/fore) +"wqI" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"wqQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"wqS" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"wqU" = ( +/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/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"wre" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"wrr" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/atmospherics_engine) +"wrI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"wrN" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"wrT" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"wrU" = ( +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/deck_relay, +/turf/open/floor/plating, +/area/maintenance/upper/fore) +"wso" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/obj/machinery/suit_storage_unit, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"wsr" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"wsv" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/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 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"wsy" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/turf/open/space/basic, +/area/solar/port/aft) +"wsK" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"wsQ" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/item/beacon, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/landmark/event_spawn, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"wsS" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"wsW" = ( +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"wta" = ( +/turf/closed/wall, +/area/crew_quarters/heads/captain/private) +"wtj" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"wts" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"wtC" = ( +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"wtG" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"wtO" = ( +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/plasteel, +/area/engine/atmos) +"wtS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"wtW" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"wud" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/hop) +"wun" = ( +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "gateway_viewing"; + name = "Gateway Shutters Control"; + normaldoorcontrol = 0; + pixel_x = 28; + pixel_y = 6 + }, +/obj/machinery/computer/security{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/gateway) +"wuA" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"wuI" = ( +/obj/structure/stairs, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"wvo" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/lobby) +"wvr" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"wvA" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "gateway_viewing" + }, +/turf/open/floor/plating, +/area/gateway) +"wvD" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/grass, +/area/crew_quarters/park) +"wwi" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/techstorage/engineering, +/obj/item/pen, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/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/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"wwq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"wwr" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"wwz" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/camera/autoname, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/analyzer, +/obj/item/extinguisher, +/obj/item/extinguisher, +/turf/open/floor/plasteel, +/area/teleporter) +"wwB" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = -28 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"wwF" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space/basic, +/area/space/nearstation) +"wwJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) +"wwT" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/wood, +/area/library) +"wxd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"wxl" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/sign/departments/minsky/supply/mining{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"wxM" = ( +/turf/open/floor/engine/n2o, +/area/engine/atmos) +"wyg" = ( +/obj/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"wyh" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/science/research) +"wyn" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "QMLoad2" + }, +/obj/machinery/light, +/turf/open/floor/plating, +/area/quartermaster/storage) +"wyA" = ( +/obj/structure/window/reinforced/spawner, +/obj/machinery/porta_turret/ai{ + dir = 4; + installation = /obj/item/gun/energy/e_gun + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"wyE" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/security/brig) +"wyR" = ( +/obj/machinery/atmospherics/components/trinary/filter/critical, +/turf/open/floor/engine, +/area/engine/engine_room) +"wyT" = ( +/obj/structure/window/reinforced/spawner{ + 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/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"wza" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/machinery/light/small, +/obj/structure/closet/emcloset/anchored, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"wzc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"wzu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"wzy" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"wzN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hor) +"wzX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"wAh" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"wAk" = ( +/obj/machinery/door/poddoor/shutters{ + id = "Skynet_launch"; + name = "Mech Bay" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/science/robotics) +"wAn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"wAp" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/library) +"wAy" = ( +/obj/machinery/sleeper{ + dir = 4; + icon_state = "sleeper" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"wAH" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"wAR" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery/aux) +"wBf" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"wBg" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/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) +"wBl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/security/brig) +"wBn" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"wBv" = ( +/obj/structure/flora/junglebush, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/grass, +/area/crew_quarters/park) +"wBz" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/secondary) +"wBG" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"wBH" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"wBI" = ( +/obj/structure/rack{ + icon = 'icons/obj/stationobjs.dmi'; + icon_state = "minibar"; + name = "skeletal minibar" + }, +/obj/item/storage/fancy/candle_box, +/obj/structure/sign/painting/library_private{ + pixel_y = 32 + }, +/turf/open/floor/engine/cult, +/area/library) +"wBM" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"wBP" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"wCh" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"wCi" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Escape Lounge"; + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"wCj" = ( +/obj/item/beacon, +/obj/structure/table/wood, +/obj/item/candle, +/obj/item/clothing/head/collectable/kitty, +/turf/open/floor/plating/airless, +/area/science/test_area) +"wCl" = ( +/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/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"wCr" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/security/checkpoint/customs) +"wCs" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"wCv" = ( +/obj/machinery/computer/atmos_control/tank/incinerator{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"wCw" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"wCy" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"wCA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"wCB" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"wCQ" = ( +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/maintenance/port) +"wCR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"wDa" = ( +/obj/structure/cable/yellow{ + icon_state = "1-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/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"wDs" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/tank/air, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"wDD" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"wDE" = ( +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/circuit, +/area/science/robotics) +"wDF" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"wDG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/crew_quarters/heads/hor) +"wDJ" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/preopen{ + id = "isolc"; + name = "privacy shutters" + }, +/turf/open/floor/plating, +/area/medical/patients_rooms/room_c) +"wDT" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/science/lab) +"wDX" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/clothing/under/dress/skirt/blue, +/obj/item/clothing/under/suit/navy, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"wEg" = ( +/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 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"wEC" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/janitor) +"wEE" = ( +/obj/machinery/modular_fabricator/exosuit_fab, +/obj/effect/turf_decal/bot, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"wEL" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"wEV" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/airlock{ + name = "Chapel Office"; + req_access_txt = "22" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"wFe" = ( +/obj/machinery/door/poddoor/preopen{ + id = "bridgedoors"; + name = "Bridge Access Blast door" + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"wFf" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/engineering_hacking, +/obj/item/clothing/neck/stethoscope, +/obj/machinery/camera/motion{ + c_tag = "Vault"; + dir = 4; + network = list("vault") + }, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Vault"; + pixel_x = -32 + }, +/turf/open/floor/circuit/green, +/area/security/nuke_storage) +"wFm" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"wFr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"wFs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/wrench, +/obj/item/screwdriver, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/vacant_room/commissary) +"wFw" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"wFA" = ( +/obj/machinery/door/poddoor{ + id = "QMLoaddoor2"; + name = "Supply Dock Loading Door" + }, +/obj/machinery/conveyor{ + id = "QMLoad2" + }, +/obj/structure/plasticflaps, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"wFG" = ( +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/wood, +/area/vacant_room/office) +"wFJ" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "35" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"wFL" = ( +/obj/machinery/camera{ + c_tag = "Prison Toilet"; + network = list("ss13","prison") + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"wFN" = ( +/obj/machinery/shower{ + dir = 1 + }, +/turf/open/floor/noslip/white, +/area/quartermaster/storage) +"wFS" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 9 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"wGd" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"wGu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/caution, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"wGz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"wGT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"wHb" = ( +/turf/closed/wall/r_wall, +/area/medical/medbay/balcony) +"wHf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"wHv" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"wHx" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"wHF" = ( +/obj/item/soap, +/turf/open/floor/plasteel/white, +/area/security/prison) +"wHR" = ( +/obj/effect/landmark/carpspawn, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"wHV" = ( +/turf/closed/wall, +/area/medical/medbay/lobby) +"wIl" = ( +/obj/machinery/door/airlock{ + name = "Custodial Closet"; + req_access_txt = "26" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/janitor) +"wIr" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Break Area" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"wIv" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/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/structure/closet/wardrobe/virology_white, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"wIx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrogen_output{ + dir = 1 + }, +/turf/open/floor/engine/n2, +/area/engine/atmos) +"wIz" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"wIA" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"wIG" = ( +/obj/effect/spawner/lootdrop/techstorage/engineering, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"wIJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"wJe" = ( +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"wJh" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"wJn" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"wJr" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plasteel, +/area/science/storage) +"wJt" = ( +/obj/machinery/light/small, +/mob/living/carbon/monkey, +/turf/open/floor/plasteel/freezer, +/area/medical/genetics) +"wJI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/security/prison) +"wKg" = ( +/obj/effect/spawner/lootdrop/crate_spawner, +/turf/open/floor/plating, +/area/maintenance/department/science/central) +"wKp" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/computer/warrant{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"wKt" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"wKv" = ( +/obj/effect/turf_decal/tile/neutral{ + 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/effect/landmark/start/chaplain, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"wKw" = ( +/obj/machinery/light/small, +/turf/open/floor/grass, +/area/hydroponics/garden) +"wKx" = ( +/obj/machinery/disposal/bin, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"wKz" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/department/science) +"wKM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 1 + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"wKS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/rnd/destructive_analyzer, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/lab) +"wKT" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"wLk" = ( +/obj/machinery/computer/atmos_control/tank/oxygen_tank{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"wLH" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"wLO" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/landmark/start/station_engineer, +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wLQ" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/bridge) +"wMi" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"wMy" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/camera/autoname, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"wME" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"wNi" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"wNt" = ( +/obj/structure/closet/secure_closet/freezer/meat, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"wNA" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/chief) +"wNC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/engineering{ + name = "Tech Storage"; + req_access_txt = "23" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"wNG" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "bridgewindows"; + name = "Bridge View Blast doors"; + pixel_x = 26; + pixel_y = 7; + req_access_txt = "19" + }, +/obj/machinery/button/door{ + id = "bridgedoors"; + name = "Bridge Access Blast doors"; + pixel_x = 38; + pixel_y = 7; + req_access_txt = "19" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"wNQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/computer/rdconsole/core{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/lab) +"wNW" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"wOc" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"wOe" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"wOg" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/eastleft{ + name = "Hydroponics Desk"; + req_access_txt = "35" + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hydroponics) +"wOq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"wOr" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"wOv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"wOC" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"wOG" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"wOR" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/research) +"wPj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/starboard) +"wPs" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 4; + height = 17; + id = "arrivals_stationary"; + name = "corg arrivals"; + roundstart_template = /datum/map_template/shuttle/arrival/corg; + width = 9 + }, +/turf/open/floor/circuit/red, +/area/hallway/secondary/entry) +"wPL" = ( +/mob/living/simple_animal/pet/cat, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"wPO" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"wPZ" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Cargo Maintenance"; + req_access_txt = "31" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"wQd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"wQg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/techmaint{ + initial_gas_mix = "TEMP=2.7" + }, +/area/space/nearstation) +"wQi" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/department/science) +"wQj" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/maintenance/port) +"wQx" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"wQD" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry/upper) +"wQE" = ( +/obj/structure/frame/machine, +/obj/item/circuitboard/machine/emitter, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"wQK" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Brig Control"; + req_access_txt = "3"; + security_level = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/security/warden) +"wQX" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/sign/poster/random{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"wRa" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"wRo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"wRJ" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/storage/firstaid{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/storage/firstaid/fire{ + pixel_x = 1 + }, +/obj/item/storage/firstaid/brute{ + pixel_y = -2 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/security/brig) +"wRL" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"wSd" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"wSf" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/button/door{ + id = "medbay_lockdown"; + name = "emergency lockdown"; + pixel_x = -28; + pixel_y = 6; + req_access_txt = "5" + }, +/obj/machinery/button/door{ + id = "virology"; + name = "virology lockdown"; + pixel_x = -28; + pixel_y = -4; + req_access_txt = "5" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"wSl" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"wSG" = ( +/obj/effect/turf_decal/tile{ + dir = 8 + }, +/obj/effect/turf_decal/tile{ + dir = 4 + }, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/effect/turf_decal/tile, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"wSH" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"wSQ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"wSZ" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/medical/surgery) +"wTh" = ( +/obj/structure/transit_tube/curved{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"wTi" = ( +/obj/vehicle/ridden/secway, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"wTn" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Fore Primary Hallway" + }, +/turf/open/floor/wood, +/area/hallway/primary/fore) +"wTt" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 14 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/science/research) +"wUc" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/security/main) +"wUs" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"wUz" = ( +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/monofloor{ + dir = 4 + }, +/area/quartermaster/exploration_prep) +"wUB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/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, +/area/hallway/primary/central) +"wUT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"wUU" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"wVo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"wVy" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/turf/open/space/basic, +/area/solar/port/fore) +"wVD" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"wVH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"wVJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/monotile/dark, +/area/quartermaster/exploration_dock) +"wWb" = ( +/obj/structure/table/wood, +/obj/item/folder/white, +/obj/machinery/camera/autoname, +/turf/open/floor/wood, +/area/vacant_room/office) +"wWm" = ( +/obj/effect/decal/cleanable/blood, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"wWn" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 5 + }, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"wWw" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"wWV" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/tinted/fulltile, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"wXa" = ( +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 10 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"wXf" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"wXm" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"wXr" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/recreation/upper) +"wXx" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"wXz" = ( +/obj/effect/turf_decal/tile/brown, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "QMLoaddoor2"; + name = "Cargo Offload"; + normaldoorcontrol = 0; + pixel_x = 6; + pixel_y = -26 + }, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "QMLoaddoor"; + name = "Cargo Loading"; + normaldoorcontrol = 0; + pixel_x = -5; + pixel_y = -26 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"wXQ" = ( +/obj/machinery/vending/coffee, +/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/security/prison) +"wYa" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/port) +"wYf" = ( +/turf/open/floor/wood, +/area/maintenance/department/crew_quarters/dorms) +"wYh" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/securearea{ + pixel_y = -32 + }, +/turf/open/space/basic, +/area/space/nearstation) +"wYH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"wYL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"wYZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/AIsatextAP) +"wZg" = ( +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"wZp" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/security/main) +"wZq" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"wZv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/door/airlock/external/glass{ + name = "Escape Pod Alpha" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"wZF" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/landmark/start/exploration, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"wZI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"wZM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat AI Access"; + req_access_txt = "65" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"wZP" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"wZR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"wZT" = ( +/obj/structure/chair/comfy{ + dir = 8 + }, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"wZU" = ( +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"wZV" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/maintenance/port/central) +"xaj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"xap" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"xaz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"xaO" = ( +/obj/structure/destructible/cult/tome, +/obj/item/book/codex_gigas, +/turf/open/floor/engine/cult, +/area/library) +"xbj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/warden) +"xbo" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"xbr" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/landmark/start/medical_doctor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xby" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet/auxiliary) +"xbG" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"xbI" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"xbK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/newscaster{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/white, +/area/medical/cryo) +"xbW" = ( +/obj/machinery/door/poddoor/shutters{ + id = "teleportershutters"; + name = "Teleporter Shutters" + }, +/turf/open/floor/plasteel, +/area/teleporter) +"xca" = ( +/obj/machinery/door/airlock{ + name = "Unisex Washroom" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"xcb" = ( +/obj/machinery/door/airlock{ + name = "Unisex Showers" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/white, +/area/crew_quarters/toilet) +"xcl" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"xcr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/closet/emcloset, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"xct" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"xcx" = ( +/obj/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/computer/cargo/request{ + dir = 1 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/heads/hor) +"xcQ" = ( +/obj/effect/decal/cleanable/blood, +/obj/item/reagent_containers/syringe/used, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"xcS" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"xdc" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"xdq" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"xdF" = ( +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"xdL" = ( +/obj/machinery/computer/atmos_control/tank/carbon_tank, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xdP" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/port) +"xdV" = ( +/obj/structure/sign/directions/engineering{ + dir = 1; + pixel_y = 8 + }, +/obj/structure/sign/directions/science{ + dir = 1 + }, +/obj/structure/sign/directions/security{ + dir = 4; + pixel_y = -8 + }, +/turf/closed/wall/r_wall, +/area/security/checkpoint/customs) +"xem" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/medical/medbay/aft) +"xep" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"xes" = ( +/obj/structure/sink{ + pixel_y = 28 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/noslip/white, +/area/medical/virology) +"xex" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"xeF" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/grass, +/area/hallway/secondary/command) +"xeI" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"xeN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"xeP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"xeR" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "QMLoad2" + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"xeS" = ( +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/maintenance/fore) +"xfe" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"xfo" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/storage) +"xfw" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"xfF" = ( +/obj/effect/turf_decal/tile/brown, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"xfJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"xfK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"xfP" = ( +/obj/structure/chair/office/light, +/obj/effect/landmark/start/geneticist, +/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/white, +/area/medical/genetics) +"xgb" = ( +/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/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/janitor) +"xgc" = ( +/obj/machinery/computer/prisoner/management, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/bridge) +"xgk" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"xgl" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"xgm" = ( +/obj/structure/table/wood, +/obj/item/folder, +/obj/item/folder, +/obj/item/storage/crayons, +/turf/open/floor/wood, +/area/library) +"xgE" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/medical/cryo) +"xgL" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"xgN" = ( +/obj/machinery/door/airlock/virology{ + autoclose = 0; + frequency = 1449; + id_tag = "virology_airlock_exterior"; + name = "Virology Exterior Airlock"; + req_access_txt = "39" + }, +/obj/machinery/doorButtons/access_button{ + idDoor = "virology_airlock_exterior"; + idSelf = "virology_airlock_control"; + name = "Virology Access Button"; + pixel_y = 24; + req_access_txt = "39" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "virology"; + name = "Virology Lockdown Shutters" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"xgU" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/turf/open/space/basic, +/area/space) +"xgV" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xgW" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/eastleft{ + dir = 2; + name = "Kitchen Desk"; + req_access_txt = "28" + }, +/obj/machinery/door/window/eastleft{ + dir = 1; + name = "Hydroponics Desk"; + req_access_txt = "35" + }, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) +"xgZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/airlock/security/glass{ + name = "Security Medical"; + req_access_txt = "63" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/security/brig) +"xhq" = ( +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/structure/transit_tube/curved{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/secondary) +"xhu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"xhB" = ( +/obj/machinery/newscaster/security_unit{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"xhG" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/photocopier, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"xhK" = ( +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"xhU" = ( +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/wood, +/area/quartermaster/storage) +"xhY" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/chapel{ + dir = 6 + }, +/area/chapel/main/monastery) +"xhZ" = ( +/obj/effect/turf_decal/bot, +/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/structure/closet/crate{ + name = "conveyor belt crate" + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"xid" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"xif" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/obj/item/storage/lockbox/loyalty, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"xiq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"xis" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"xiz" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/landmark/start/emt, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"xiA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/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/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/gateway) +"xiG" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Panel Airlock"; + req_access_txt = "10" + }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"xiN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"xiV" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/landmark/start/security_officer, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/security/main) +"xiX" = ( +/obj/effect/decal/cleanable/xenoblood, +/obj/effect/gibspawner/xeno/bodypartless, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"xjh" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/red, +/obj/structure/table, +/obj/item/storage/toolbox/artistic{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/toolbox/artistic{ + pixel_y = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"xjn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/upper/aft) +"xjq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/solar/port/aft) +"xjr" = ( +/obj/structure/stairs, +/turf/open/floor/plasteel, +/area/security/brig) +"xjy" = ( +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"xjA" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1; + name = "Connector Port (Air Supply)" + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/delivery, +/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, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/white, +/area/medical/cryo) +"xjC" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_y = -29 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/ladder, +/turf/open/floor/plasteel, +/area/bridge) +"xjH" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"xjQ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/maintenance/fore) +"xkd" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"xke" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"xki" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/white/side{ + dir = 9 + }, +/area/medical/surgery/aux) +"xkm" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/gateway) +"xkp" = ( +/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/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"xkC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"xkM" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"xkO" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/science/shuttle) +"xlj" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"xls" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"xlz" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"xlI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"xlX" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/airalarm/directional/south, +/obj/machinery/light_switch{ + pixel_x = -25 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_b) +"xmc" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/landmark/start/botanist, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hydroponics) +"xmu" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"xmG" = ( +/obj/structure/chair, +/obj/item/radio/intercom{ + frequency = 1423; + name = "Interrogation Intercom"; + pixel_x = -28 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"xmK" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"xmM" = ( +/obj/item/kirbyplants/random, +/obj/structure/flora/ausbushes/brflowers, +/obj/machinery/newscaster{ + pixel_y = -29 + }, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"xmQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"xng" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"xnv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) +"xnD" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"xnJ" = ( +/obj/structure/bed, +/obj/item/bedsheet/qm, +/obj/effect/landmark/start/quartermaster, +/turf/open/floor/carpet/orange, +/area/quartermaster/qm) +"xnV" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"xnX" = ( +/obj/machinery/smartfridge/organ, +/turf/closed/wall, +/area/medical/surgery/aux) +"xob" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/command) +"xoc" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"xod" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/gateway) +"xoj" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"xom" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/sparker/toxmix{ + pixel_y = -24 + }, +/turf/open/floor/engine/vacuum, +/area/science/mixing/chamber) +"xos" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/drip, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"xot" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"xoy" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/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/maintenance/department/chapel/monastery) +"xoQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"xpb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/suit_storage_unit/engine, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xpd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"xpe" = ( +/turf/open/openspace, +/area/security/brig) +"xpi" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"xpv" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"xpx" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"xpB" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"xpC" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"xpG" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/openspace/airless, +/area/space/nearstation) +"xpJ" = ( +/obj/machinery/camera/autoname{ + network = list("aisat") + }, +/turf/open/openspace/airless, +/area/space) +"xpK" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/customs) +"xpQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"xqp" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"xqr" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/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{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/bridge) +"xqs" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/airlock{ + name = "Theatre"; + req_one_access_txt = "46" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/carpet/purple, +/area/crew_quarters/theatre) +"xqx" = ( +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"xqI" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"xqT" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"xqX" = ( +/obj/machinery/power/terminal, +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"xrn" = ( +/obj/machinery/door/airlock/engineering{ + name = "Shuttle Lab"; + req_one_access_txt = "32;19;47" + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"xrp" = ( +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"xrx" = ( +/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/plasteel, +/area/medical/chemistry/upper) +"xrE" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Medical Treatment"; + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/cautery{ + pixel_x = 4 + }, +/obj/item/scalpel, +/obj/item/hemostat, +/obj/item/surgical_drapes, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"xrN" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"xrU" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"xrV" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Interrogation room"; + dir = 4; + network = list("interrogation") + }, +/obj/effect/turf_decal/tile/red{ + 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/dark, +/area/security/brig) +"xse" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"xsg" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"xsh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"xsI" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio7"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"xsL" = ( +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/obj/item/taperecorder, +/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/dark, +/area/security/brig) +"xsR" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"xtj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"xtk" = ( +/obj/machinery/atmospherics/pipe/manifold/general/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/science/xenobiology) +"xtn" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"xtr" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"xtw" = ( +/obj/effect/decal/cleanable/xenoblood, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"xtz" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/sign/poster/random{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"xtI" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/sign/departments/minsky/supply/cargo{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/office) +"xtX" = ( +/obj/effect/turf_decal/tile/purple, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel/white, +/area/science/research) +"xtY" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/camera/autoname{ + dir = 1; + network = list("aicore") + }, +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"xtZ" = ( +/obj/machinery/holopad, +/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/structure/disposalpipe/junction/yjunction{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"xue" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"xui" = ( +/obj/effect/spawner/room/tenxten, +/turf/open/floor/plating, +/area/maintenance/port) +"xul" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/carpet/purple, +/area/vacant_room/office) +"xup" = ( +/obj/structure/sign/warning/securearea{ + desc = "A warning sign which reads 'BOMB RANGE"; + name = "BOMB RANGE" + }, +/turf/closed/wall, +/area/science/test_area) +"xur" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/upper/starboard/central) +"xux" = ( +/obj/structure/kitchenspike, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen/coldroom) +"xuA" = ( +/obj/structure/flora/ausbushes/ywflowers, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"xuH" = ( +/obj/structure/window/plasma/reinforced{ + dir = 1 + }, +/obj/machinery/power/rad_collector/anchored, +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/circuit/green, +/area/engine/supermatter) +"xvi" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"xvj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/maintenance/starboard/fore) +"xvp" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/service) +"xvt" = ( +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"xvC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/gateway) +"xvL" = ( +/turf/closed/wall, +/area/crew_quarters/bar) +"xvP" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"xwb" = ( +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"xwh" = ( +/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/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"xwl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 22 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"xwr" = ( +/obj/machinery/aug_manipulator, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"xwA" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"xwC" = ( +/obj/machinery/door/airlock/vault{ + name = "Vault Door"; + req_access_txt = "53" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"xwF" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat AI Access"; + req_access_txt = "65" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"xwL" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/landmark/start/station_engineer, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"xwO" = ( +/turf/closed/wall, +/area/science/xenobiology) +"xwQ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"xwZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"xxc" = ( +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical, +/turf/open/floor/engine, +/area/engine/engine_room) +"xxg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/dead_body_placer{ + bodycount = 1 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"xxN" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"xxX" = ( +/obj/machinery/light/small/broken{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"xxY" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"xyk" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"xyB" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"xyH" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/turf/open/floor/carpet/purple, +/area/vacant_room/office) +"xyR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"xyS" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"xzf" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1, +/obj/structure/lattice/catwalk, +/turf/open/openspace/airless, +/area/space/nearstation) +"xzo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"xzp" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"xzu" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/grass, +/area/hallway/primary/fore) +"xzz" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"xzF" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"xzH" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/science/research) +"xzU" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_room) +"xAi" = ( +/turf/closed/wall, +/area/engine/engine_room) +"xAn" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"xAz" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/item/beacon, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"xAO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"xBd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"xBf" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/bridge) +"xBg" = ( +/obj/machinery/computer/pandemic, +/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/tile/neutral, +/obj/structure/reagent_dispensers/virusfood{ + pixel_x = 32; + pixel_y = 32 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"xBh" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/closet/secure_closet/engineering_electrical, +/turf/open/floor/noslip/dark, +/area/engine/engineering) +"xBn" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "26" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/janitor) +"xBz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/coldroom) +"xBA" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/plating/asteroid, +/area/maintenance/port) +"xBP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"xBQ" = ( +/obj/machinery/door/airlock/mining{ + name = "Warehouse"; + req_access_txt = "31" + }, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"xBW" = ( +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xCk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/wood, +/area/library) +"xCu" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/storage/firstaid/fire, +/obj/item/storage/secure/briefcase, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"xCJ" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"xCK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/aisat/foyer) +"xCO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"xCZ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/virology{ + name = "Virology Airlock"; + req_access_txt = "39" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"xDd" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/science/server) +"xDk" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"xDl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/airlock/public/glass, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"xDp" = ( +/obj/item/wrench, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"xDq" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"xDt" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"xDu" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"xDx" = ( +/obj/machinery/door/airlock/command{ + name = "Captain's Quarters"; + req_access_txt = "20" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/heads/captain/private) +"xDG" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"xDK" = ( +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"xDV" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xEg" = ( +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"xEN" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/landmark/start/geneticist, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"xFa" = ( +/obj/machinery/door/morgue{ + name = "Confession Booth (Chaplain)"; + req_access_txt = "22" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"xFm" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xFA" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xFM" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table, +/obj/item/book/manual/wiki/medical_cloning{ + pixel_x = 2; + pixel_y = 6 + }, +/obj/item/book/random{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/book/random{ + pixel_x = -1; + pixel_y = 3 + }, +/obj/item/flashlight/pen{ + pixel_x = -1; + pixel_y = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"xFV" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"xGc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"xGe" = ( +/turf/open/floor/plasteel/freezer, +/area/medical/genetics) +"xGh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/storage) +"xGl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"xGn" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"xGz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "comms" + }, +/turf/open/floor/plating, +/area/tcommsat/computer) +"xGA" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/medical) +"xGE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"xGI" = ( +/obj/structure/sign/departments/minsky/supply/hydroponics{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"xGM" = ( +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/grass, +/area/crew_quarters/park) +"xGS" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/maintenance/disposal) +"xHi" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/security/checkpoint/customs) +"xHn" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"xHq" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/security/brig) +"xHv" = ( +/obj/structure/grille/broken, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"xHy" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medical_shutters"; + name = "medical shutters" + }, +/obj/item/folder/white, +/obj/item/flashlight/pen, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/window/northright{ + dir = 4; + name = "medbay interior"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"xHC" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"xHE" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer1, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"xHK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"xIr" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"xIu" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xIw" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1423; + listening = 0; + name = "Interrogation Intercom"; + pixel_x = 29 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"xIx" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"xIJ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"xIQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/mix_output, +/turf/open/floor/engine/vacuum, +/area/engine/atmos) +"xIV" = ( +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"xIY" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"xJf" = ( +/obj/machinery/vending/wardrobe/gene_wardrobe, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/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/white, +/area/medical/genetics) +"xJm" = ( +/obj/structure/grille, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"xJw" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"xJC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/hallway/upper/primary/fore) +"xJG" = ( +/obj/structure/lattice/catwalk, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"xJW" = ( +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"xKf" = ( +/obj/structure/cable/yellow{ + 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/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"xKg" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_y = -29 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"xKq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/warden) +"xKy" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"xKE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"xKY" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"xKZ" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space/basic, +/area/space/nearstation) +"xLm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/carpet/orange, +/area/quartermaster/qm) +"xMe" = ( +/obj/structure/chair/pew/left{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/chapel{ + dir = 4 + }, +/area/chapel/main/monastery) +"xMg" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/requests_console{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/science/storage) +"xMk" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"xMl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"xMr" = ( +/obj/structure/chair/pew/left{ + dir = 4; + name = "park bench" + }, +/turf/open/floor/plating/asteroid, +/area/crew_quarters/park) +"xMD" = ( +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"xMF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/shuttle) +"xMI" = ( +/obj/structure/flora/ausbushes/ywflowers, +/turf/open/floor/grass, +/area/hydroponics/garden/abandoned) +"xMX" = ( +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/structure/filingcabinet/medical, +/turf/open/floor/carpet/cyan, +/area/crew_quarters/heads/cmo) +"xNa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"xNd" = ( +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/suit_storage_unit, +/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/medical/virology) +"xNg" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"xNr" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/balcony) +"xNz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/junction, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation/upper) +"xNI" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"xNJ" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/surgery, +/obj/item/cautery{ + pixel_x = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/item/glove_box{ + pixel_x = 1; + pixel_y = 3 + }, +/turf/open/floor/plasteel/white/side{ + dir = 6 + }, +/area/medical/surgery/aux) +"xNR" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/computer/upload/borg, +/obj/machinery/door/window/brigdoor/northright{ + dir = 2; + name = "Upload Access"; + req_access_txt = "16" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"xNU" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"xNY" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"xOz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"xOA" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/tank_dispenser, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"xOD" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hydroponics) +"xOF" = ( +/obj/structure/table/glass, +/obj/item/paper_bin{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/pen/blue{ + pixel_y = 2 + }, +/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/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/medical/virology) +"xOG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"xOI" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/storage_shared) +"xOS" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"xOX" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "packageSort2" + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"xPi" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/camera/motion{ + c_tag = "E.V.A. Storage"; + dir = 9 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"xPm" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xPC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"xPJ" = ( +/obj/structure/chair/comfy/black, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"xPL" = ( +/obj/machinery/computer/atmos_control/tank/nitrous_tank, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xPQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"xPS" = ( +/obj/structure/flora/ausbushes/sunnybush, +/turf/open/floor/grass, +/area/crew_quarters/park) +"xPT" = ( +/obj/machinery/conveyor{ + id = "QMLoad2" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"xQd" = ( +/obj/effect/turf_decal/tile{ + dir = 4 + }, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"xQA" = ( +/obj/structure/transit_tube/curved{ + dir = 8 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/medical/medbay/balcony) +"xQK" = ( +/obj/structure/railing, +/turf/open/openspace, +/area/engine/atmos) +"xQN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"xQR" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/upper/aft) +"xQV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/brig) +"xQX" = ( +/obj/machinery/shieldwallgen/xenobiologyaccess, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"xRi" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"xRn" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/machinery/requests_console{ + department = "Gateway"; + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/gateway) +"xRt" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"xRF" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"xRO" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/plasteel/dark, +/area/quartermaster/miningdock) +"xRP" = ( +/obj/machinery/status_display/evac{ + pixel_y = 32 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"xRQ" = ( +/obj/structure/closet/crate, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"xRV" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile{ + dir = 8 + }, +/obj/effect/landmark/start/chief_medical_officer, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/cmo) +"xSa" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"xSc" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"xSe" = ( +/obj/machinery/vending/snack/random, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"xSj" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"xSs" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xSz" = ( +/obj/structure/chair, +/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/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"xSC" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall30"; + location = "hall29" + }, +/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/primary/fore) +"xSM" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light_switch{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/white/side{ + dir = 9 + }, +/area/medical/surgery) +"xTh" = ( +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"xTk" = ( +/turf/closed/wall/r_wall, +/area/teleporter) +"xTo" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"xTq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"xTs" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/machinery/button/flasher{ + id = "leftcheckpointflash"; + pixel_x = 27; + pixel_y = -25 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"xTt" = ( +/obj/structure/table/reinforced, +/obj/machinery/reagentgrinder, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) +"xTR" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery/aux) +"xTT" = ( +/obj/structure/chair, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"xTW" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Medbay Maintenance"; + req_access_txt = "5" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay_lockdown"; + name = "lockdown shutters" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/medical/medbay/balcony) +"xTZ" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port/central) +"xUf" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/effect/landmark/start/station_engineer, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"xUo" = ( +/turf/open/floor/plasteel/white, +/area/medical/storage) +"xUy" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"xUG" = ( +/turf/closed/wall/r_wall, +/area/science/mixing/chamber) +"xVa" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/exit/departure_lounge) +"xVf" = ( +/obj/effect/landmark/start/quartermaster, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"xVn" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/turf/open/openspace, +/area/ai_monitored/turret_protected/ai) +"xVo" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/turf/open/openspace, +/area/maintenance/starboard/fore) +"xVp" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/customs) +"xVt" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness/recreation/upper) +"xVB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"xVN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"xVX" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"xWd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"xWl" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"xWu" = ( +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/hop) +"xWy" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"xWK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"xWQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"xWZ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"xXu" = ( +/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 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/crew_quarters/dorms) +"xXv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"xXM" = ( +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"xYl" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"xYq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall29"; + location = "hall28" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"xYr" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/chapel/monastery) +"xYB" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"xYD" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/surgery/aux) +"xYR" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/closed/wall, +/area/crew_quarters/kitchen/coldroom) +"xYS" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"xZa" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"xZc" = ( +/obj/effect/turf_decal/tile/yellow, +/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) +"xZg" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/bridge) +"xZt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"xZH" = ( +/obj/structure/chair/office, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/checker, +/area/storage/art) +"xZR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"xZW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"yaa" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"yad" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"yag" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"yai" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"yao" = ( +/obj/structure/rack, +/obj/item/clothing/under/rank/cargo/tech, +/turf/open/floor/plasteel/white, +/area/quartermaster/storage) +"yas" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"yau" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/nanite) +"yaC" = ( +/obj/machinery/computer/crew{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/requests_console{ + pixel_x = -32 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"yaI" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/relay) +"yaM" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/hallway/upper/secondary/entry) +"yaW" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/law) +"yaZ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) +"ybg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"ybu" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/circuit/green, +/area/engine/gravity_generator) +"ybD" = ( +/obj/structure/chair/wood, +/obj/effect/landmark/start/captain, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"ybK" = ( +/obj/structure/mirror{ + pixel_y = -32 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/carpet/cyan, +/area/crew_quarters/heads/cmo) +"ycf" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"yda" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor{ + dir = 8; + name = "Brig Control Desk"; + req_access_txt = "3" + }, +/obj/machinery/door/window/westleft{ + base_state = "right"; + dir = 4; + icon_state = "right"; + name = "Outer Window" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/security/warden) +"ydb" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"ydf" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = -25 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"ydg" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"ydA" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/landmark/start/head_of_security, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"ydB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) +"ydY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"yed" = ( +/obj/machinery/button/door{ + id = "ceprivacy"; + name = "Privacy Shutters Control"; + pixel_x = -26; + pixel_y = -25 + }, +/obj/machinery/button/door{ + id = "atmos"; + name = "Atmospherics Lockdown"; + pixel_x = -26; + pixel_y = -35 + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"yef" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"yei" = ( +/obj/structure/sign/warning/nosmoking{ + pixel_x = -32 + }, +/obj/structure/safe, +/obj/item/clothing/neck/stethoscope, +/obj/item/book{ + desc = "An undeniably handy book."; + icon_state = "bookknock"; + name = "A Simpleton's Guide to Safe-cracking with Stethoscopes" + }, +/obj/item/stack/sheet/mineral/diamond, +/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/item/stack/spacecash/c500, +/obj/item/stack/spacecash/c500, +/obj/item/stack/spacecash/c500, +/obj/item/stack/spacecash/c500, +/obj/item/stack/spacecash/c500, +/obj/item/gun/ballistic/automatic/pistol/deagle, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) +"yew" = ( +/obj/effect/landmark/start/ai/secondary, +/obj/machinery/door/window{ + dir = 4; + name = "AI Core Door"; + req_access_txt = "16" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"yeC" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"yeG" = ( +/obj/structure/cable/yellow{ + 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 = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/upper/primary/fore) +"yeO" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/dorms) +"yeW" = ( +/obj/machinery/door/airlock/vault{ + name = "Vault Door"; + req_access_txt = "53" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) +"yeX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"yeZ" = ( +/obj/machinery/door/airlock/command{ + name = "E.V.A. Secure Storage"; + req_access_txt = "18" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/eva) +"yff" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/openspace, +/area/quartermaster/exploration_dock) +"yfl" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"yfB" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"yfP" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"yfV" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"ygf" = ( +/obj/machinery/camera/autoname, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"ygq" = ( +/obj/docking_port/stationary{ + dwidth = 2; + height = 7; + id = "corg_north"; + name = "northern corgstation"; + roundstart_template = /datum/map_template/shuttle/tram/corg; + width = 5 + }, +/turf/open/space/basic, +/area/space) +"ygv" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Recreation Park" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/crew_quarters/park) +"ygw" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"ygx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/hallway/upper/secondary/exit/departure_lounge) +"ygz" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"ygQ" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"ygU" = ( +/obj/effect/spawner/room/tenxten, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ygZ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/chem_dispenser{ + layer = 2.7 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"yhg" = ( +/obj/machinery/door/airlock/medical{ + name = "Patient Room A"; + req_access_txt = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/turf/open/floor/carpet/cyan, +/area/medical/patients_rooms/room_a) +"yhi" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"yhz" = ( +/turf/closed/wall, +/area/hallway/secondary/law) +"yhH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"yhP" = ( +/obj/machinery/door/airlock/mining{ + name = "Quartermaster's Office"; + req_access_txt = "41" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/quartermaster/qm) +"yhT" = ( +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/effect/spawner/lootdrop/glowstick/lit, +/turf/open/floor/plasteel, +/area/maintenance/starboard/central) +"yid" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engine_room) +"yil" = ( +/obj/machinery/requests_console{ + department = "Gravity Generator"; + pixel_y = -32 + }, +/turf/open/floor/circuit/green, +/area/engine/gravity_generator) +"yiu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"yiw" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/dead_body_placer{ + bodycount = 1 + }, +/turf/open/floor/plasteel, +/area/medical/morgue) +"yiH" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"yiK" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"yiW" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/general/hidden{ + dir = 8 + }, +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"yjl" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation/upper) +"yjv" = ( +/obj/effect/turf_decal/bot, +/obj/item/ammo_box/magazine/wt550m9, +/obj/item/ammo_box/magazine/wt550m9, +/obj/item/ammo_box/magazine/wt550m9, +/obj/structure/closet/secure_closet, +/obj/item/ammo_box/magazine/wt550m9/rubber, +/obj/item/ammo_box/magazine/wt550m9/rubber, +/obj/item/ammo_box/magazine/wt550m9/rubber, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"yjK" = ( +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/fore) +"yjL" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"yjN" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"yjS" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/execution/education) +"yka" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/airlock{ + name = "Kitchen"; + req_access_txt = "28" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) +"ykc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/closed/wall, +/area/maintenance/upper/starboard/central) +"ykh" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=hall7"; + location = "hall6" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"ykr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"yku" = ( +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/dark/hidden, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/secondary) +"ykv" = ( +/obj/machinery/door/airlock/external{ + name = "Auxiliary Escape Airlock" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/department/science) +"ykz" = ( +/obj/structure/table/reinforced, +/obj/item/folder/red, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"ykA" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/shuttle) +"ykC" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plasteel/dark, +/area/quartermaster/warehouse) +"ykK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/engineering{ + name = "Tech Storage"; + req_access_txt = "23" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/storage) +"ykV" = ( +/obj/machinery/power/apc/auto_name/east{ + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/carpet/orange, +/area/crew_quarters/heads/chief) +"yle" = ( +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"yll" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry/upper) +"ylv" = ( +/obj/item/kirbyplants/random, +/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/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"ylL" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/explab) +"ylM" = ( +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) +"ylW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/gateway) +"ylY" = ( +/obj/effect/turf_decal/stripes/line, +/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/upper/secondary/entry) +"ylZ" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/upper/secondary/entry) +"ymi" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/camera/autoname, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/kitchen) + +(1,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(2,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(3,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(4,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(5,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(6,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(7,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(8,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(9,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(10,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(11,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(12,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(13,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(14,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(15,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(16,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(17,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(18,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(19,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(20,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(21,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(22,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(23,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(24,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(25,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +osK +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(26,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(27,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +osK +osK +osK +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(28,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +qVw +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(29,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +osK +uBI +uBI +kDD +uBI +uBI +osK +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(30,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +uBI +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(31,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uBI +uBI +uBI +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(32,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +osK +uBI +uBI +uBI +kDD +uBI +uBI +uBI +osK +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(33,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(34,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(35,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +osK +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +osK +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(36,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(37,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(38,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(39,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(40,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(41,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(42,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(43,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +uBI +oqn +uBI +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(44,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(45,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +hIl +hIl +uBI +uBI +uBI +omG +uBI +uBI +uBI +hIl +hIl +ucV +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(46,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +hIl +fZh +kDD +kDD +uBI +kDD +uBI +kDD +kDD +fZh +hIl +dpZ +dpZ +dpZ +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(47,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +hIl +fZh +kDD +kDD +uBI +uBI +uBI +kDD +kDD +fZh +hIl +hIl +krJ +hIl +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(48,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +hIl +hIl +hIl +uBI +uBI +kDD +uBI +uBI +hIl +hIl +hIl +aGR +aJU +gYA +uBI +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(49,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +hIl +fZh +abd +abd +uBI +kDD +uBI +abd +abd +fZh +hIl +jVl +kBH +hIl +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(50,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hIl +hIl +hIl +hIl +hIl +hIl +hIl +pPk +pPk +hIl +gZd +hIl +pPk +pPk +hIl +hIl +cIO +uLt +hIl +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dDp +kDD +dDp +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(51,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +dAk +tlT +dAk +tlT +bOU +crb +btm +bfd +bfd +bfd +rgN +bfd +bfd +bfd +bfd +bfd +bfd +bfd +fOU +dHh +tSI +kXO +hIl +hIl +hIl +hIl +hIl +hIl +hIl +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dDp +dDp +dDp +dDp +dDp +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(52,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +vXk +woB +bdU +woB +bdU +cIp +bOU +hIl +aUx +dHh +dHh +mYA +wCy +oAV +kau +oAV +kau +oAV +kau +knR +oAV +mCv +uWc +hIl +wpX +vlf +aXG +qlp +qlp +hIl +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dDp +dDp +hkh +ukK +hkh +dDp +dDp +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(53,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dAk +cNd +gAm +kYi +rCq +hyQ +ycf +uBI +hIl +fHt +lOs +iCo +dgV +bSE +bfd +wyR +bfd +wyR +csX +bSE +gJn +aDH +wSQ +cJU +aFo +rmN +rmN +rmN +rmN +rmN +hIl +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dDp +dDp +xup +hkh +nEY +hkh +xup +dDp +dDp +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(54,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +wls +bdU +wOe +hvE +lsv +wHR +cIp +dAk +cuy +edY +mGw +xap +dgg +dgg +dgg +gRK +auu +gRK +dgg +dgg +dgg +vHr +rUF +dHh +xzU +pqn +pqn +pqn +pqn +lgz +hIl +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dDp +dDp +hkh +hkh +kIA +mIG +xpx +hkh +hkh +dDp +dDp +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +rtz +rtz +rtz +rtz +kDD +kDD +kDD +rtz +rtz +rtz +rtz +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(55,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +vXk +bdU +woB +bdU +woB +bdU +ycf +ikB +pPk +dHh +eYV +rNl +kLu +mch +wmH +dhW +eRk +euu +gqH +mch +onY +qca +khY +dHh +csh +lFJ +nGm +lFJ +vNO +lFJ +hIl +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dDp +jKF +jKF +jKC +pLN +iKG +pLN +wbq +jKF +jKF +dDp +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(56,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +wls +bdU +wOe +hvE +lsv +feG +cIp +evW +pPk +rqI +eYV +mrR +kLu +cyI +jkc +dhW +paF +euu +sBd +eRk +vWB +rLU +fQs +kqm +qaQ +cPm +oab +cPm +cPm +foN +hIl +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dDp +dDp +dDp +hkh +pgo +mgv +pLN +wCj +pLN +iuU +vWC +hkh +dDp +dDp +dDp +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(57,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dAk +bdU +wOe +hvE +lsv +feG +ycf +evW +pPk +dHh +aXg +mrR +kLu +tgc +gnx +dhW +bCP +euu +xuH +cyI +bEN +qBj +flz +fSj +csh +cRK +cRK +cRK +cRK +lKd +hIl +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dDp +jKF +jKF +puR +pLN +pPh +pLN +cVs +jKF +jKF +dDp +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +uBI +uBI +vrB +uBI +uBI +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(58,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +ikB +fyo +ycf +fyo +ycf +fyo +bTd +uag +cuy +ofz +hlU +lJN +dgg +dgg +fVx +hbl +rxX +fYb +pIk +dgg +dgg +yid +nMA +fSj +eGs +nvI +nvI +nvI +nvI +dJo +hIl +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dDp +dDp +hkh +hkh +bFl +mvs +rvr +hkh +hkh +dDp +dDp +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +jTX +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(59,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +cpb +bTd +nnM +nnM +nnM +nnM +bTd +rIQ +hIl +gOS +cec +lJN +cuc +cuc +dgg +bvI +eRk +oCv +dgg +frL +frL +yid +nMA +fSj +aFo +rmN +rmN +rmN +rmN +rmN +hIl +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dDp +dDp +xup +hkh +pLN +hkh +xup +dDp +dDp +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +kDD +bOj +bOj +bOj +bOj +bOj +kDD +fEZ +kDD +bOj +bOj +bOj +bOj +bOj +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(60,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +hIl +aUx +arT +enJ +tVO +kXT +dgg +tuL +fWH +xSa +dgg +jqH +oiz +hTB +tvq +mrI +hIl +eNR +nJx +eZL +eNR +eNR +hIl +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dDp +dDp +hkh +pLN +hkh +dDp +dDp +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +uBI +uBI +naZ +lqa +lqa +lqa +lqa +nMd +gIH +fwg +eIa +eIa +eIa +eIa +xjq +kDD +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(61,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +uBI +uBI +pPk +dHh +aEy +qmr +iFS +xxc +gqk +uAy +oph +dul +tyc +dul +neW +vWI +qqM +fSj +hIl +hIl +hIl +hIl +hIl +hIl +hIl +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dDp +dDp +dDp +dDp +dDp +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +rtz +kDD +kDD +shx +shx +shx +shx +shx +kDD +gIH +kDD +shx +shx +shx +shx +shx +uBI +rtz +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(62,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +pPk +dHh +rgt +kkP +chQ +hru +hru +hru +kks +hru +hru +hru +ezO +tRw +dul +tch +uhW +iPo +ocQ +aIi +hIl +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +dDp +kDD +dDp +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +uBI +rtz +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +gIH +kDD +kDD +uBI +kDD +uBI +kDD +kDD +rtz +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(63,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +pPk +qDA +bVd +nOr +waK +dHh +paP +dHh +iRw +dHh +paP +tan +nMA +phE +wsS +vfh +hIl +obK +mJJ +cbH +hIl +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +rtz +kDD +kDD +bOj +bOj +bOj +bOj +bOj +kDD +gIH +kDD +bOj +bOj +bOj +bOj +bOj +kDD +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(64,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hIl +hIl +hIl +wiJ +gYA +hIl +hIl +hIl +iYZ +rsY +pPk +hIl +hIl +pPk +alg +pPk +hIl +hIl +tlN +vMf +pPk +hIl +hIl +dKL +raI +oGC +hIl +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +uBI +uBI +naZ +lqa +lqa +lqa +lqa +nMd +gIH +fwg +eIa +eIa +eIa +eIa +wsy +uBI +rtz +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(65,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hIl +wdc +uIE +xfK +tor +sCY +nQY +lHB +nxC +pgc +kLU +skF +bFf +pbm +lDw +cvu +jEm +pyf +eui +nII +uBQ +ewZ +pPk +uRy +raI +oII +hIl +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +kDD +shx +shx +shx +shx +shx +kDD +gIH +kDD +shx +shx +shx +shx +shx +kDD +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(66,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hIl +cMr +uNJ +edD +pzl +bbe +hYs +rIH +tLo +gIw +liL +uWs +uWs +uWs +mRn +lzA +goC +nvu +gcE +jHU +liS +gqs +hIl +ucz +mJJ +vDZ +hIl +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +gIH +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(67,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +gYA +clv +nmJ +ucc +ngk +cyU +dop +cpg +fXr +fjz +nPX +pUs +gTJ +cWL +vaA +vGa +gTJ +nzZ +tQw +hfm +wcs +jqY +uhW +cVr +czN +wVH +hIl +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOj +bOj +bOj +bOj +bOj +kDD +gIH +kDD +bOj +bOj +bOj +bOj +bOj +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(68,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hIl +cme +mFU +hQF +rcb +wsr +hIl +hIl +hIl +hIl +nxo +eIf +eIf +jWf +jWf +jWf +eIf +eIf +gKh +gKh +tmB +gKh +gKh +hIl +hIl +hIl +hIl +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +naZ +lqa +lqa +lqa +lqa +nMd +gIH +fwg +eIa +eIa +eIa +eIa +wsy +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(69,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hIl +wdX +hLg +sTH +fgG +uRX +dND +pjh +uvI +dDu +tHS +eIf +fnr +lTR +phI +efe +cxN +cYH +gKh +iJT +niO +dAF +gKh +ltK +pHF +xGh +cuh +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +shx +shx +shx +shx +shx +kDD +gIH +kDD +shx +shx +shx +shx +shx +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(70,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hIl +hIl +hIl +iQt +fgG +uRX +dND +pjh +bDF +dDu +tHS +asR +jdy +fgQ +kkK +nly +wwJ +rNX +gKh +ato +ouT +dAF +gKh +gZv +mmu +jMv +qhM +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +gIH +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(71,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jaZ +dsm +wlU +bTd +bTd +nYG +lPW +rtr +fgG +uRX +ihi +pjh +edR +rNs +jjE +bbd +crp +wnS +lkz +mWw +pGC +nDJ +qjV +fxU +jxN +lKr +gKh +dMu +dmv +apm +qhM +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +gIH +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(72,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +tlm +dol +bUA +kDD +kDD +hIl +oOi +gUG +fgG +neu +aFO +pjh +dDu +xJW +dDu +eIf +nFw +iWe +ozf +vnh +dPX +xOA +gKh +phV +xwL +daQ +gKh +dAz +qYw +asO +qhM +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +hpF +hpF +hpF +hpF +hpF +hpF +hpF +hpF +hpF +hpF +kDD +uBI +kDD +uBI +kDD +kDD +vyC +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(73,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +haV +uvR +tlm +jaZ +wwF +nYG +sHh +vdO +xqI +gAy +hIl +pjh +pjh +pjh +iJA +eIf +eIf +eIf +eIf +eIf +eIf +eIf +gKh +utC +vha +xBh +gKh +dBa +wCB +cSN +cuh +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +hpF +jKB +pAD +cmV +iKj +pAD +azt +iKj +tkg +hpF +uBI +uBI +uBI +uBI +uBI +uBI +jTX +uBI +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(74,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +tlm +kgu +tlm +kgu +kDD +hIl +hIl +hIl +vhK +fTM +hIl +dDu +fFr +dDu +dDu +awW +jQI +uro +eKT +fQe +hJx +wHv +gKh +nrI +tmB +nrI +gKh +cuh +uDQ +cuh +cuh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +hpF +tkg +pAD +ibO +iKj +pAD +ibO +iKj +tkg +hpF +kDD +uBI +kDD +kDD +kDD +kDD +jTX +kDD +kDD +kDD +uBI +kDD +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(75,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +haV +uvR +tlm +fyq +dsm +dYi +hIl +wcm +lFO +aFO +hIl +dDu +pjh +crG +uJl +awW +oCW +mdD +npn +sBP +fTI +mBO +awW +ltt +wBg +lnx +gKh +shk +iRd +owm +cuh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +nKC +nKC +qks +tkg +tkg +lFy +tkg +tkg +tkg +tkg +nKC +kDD +uBI +kDD +kDD +kDD +kDD +jTX +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(76,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +tlm +kgu +tlm +dol +xKZ +nlc +hIl +wcm +lFO +aFO +hIl +dDu +awW +awW +awW +awW +buI +coV +gEE +gEE +gug +bMQ +awW +lZl +mCF +prS +gKh +lrL +ftO +jYN +cuh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +hpF +pob +tkg +dQC +tkg +tkg +tkg +vTx +dSU +bmB +nKC +uBI +uBI +uBI +uBI +uBI +uBI +jTX +uBI +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(77,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +haV +uvR +tlm +fyq +dsm +dYi +gYA +wcm +gnt +aFO +gYA +dDu +awW +euM +dIG +oDp +buI +lsG +mNR +cjf +hbp +kYr +kYr +raA +xUf +hFT +iiU +unk +fiT +mAy +cuh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +hpF +pda +tkg +gJS +wYa +tkg +tkg +rbC +tMv +pmo +nKC +kDD +uBI +kDD +kDD +kDD +kDD +jTX +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(78,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +pLI +nlc +pLI +xKZ +xKZ +nlc +gYA +gYA +gYA +hIl +hIl +dDu +awW +skT +ozl +ozl +hsk +vJx +bei +mZf +xfJ +rGd +kYr +feC +oTW +tZH +ykK +fYf +rQx +jBb +cuh +kDD +kDD +kDD +sgC +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +hpF +hpF +nKC +nKC +cMV +nKC +nKC +nKC +vYQ +nKC +nKC +nKC +nKC +hpF +hpF +hpF +nKC +kDD +kDD +jTX +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(79,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +hIl +dDu +awW +awW +eAW +ikz +ooG +fPK +bei +vHF +slH +lBd +xGz +skK +deG +vRV +ngf +psx +fvM +sqr +cuh +kDD +kDD +kDD +pqv +qzo +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +hpF +aVw +aVw +aVw +sjX +nKC +aVw +aVw +aVw +uda +aVw +aVw +aVw +qYy +nMt +qYy +nKC +kDD +uyO +irA +gsA +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(80,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +uBI +hIl +qEo +jUl +awW +dXo +upl +ooG +lmX +bei +nAC +ohm +sSh +sRr +mYU +xAn +vRV +gKh +btK +aEg +pUg +cuh +kDD +kDD +kDD +pqv +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +hpF +aVw +aVw +aVw +aVw +nKC +aVw +nKC +aVw +aVw +oBc +aVw +nKC +aVw +hCG +tkg +nKC +kDD +uyO +eAT +jEh +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(81,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +hIl +dDu +awW +awW +nGc +iTH +ooG +bbw +bei +iIQ +jtS +oUm +xGz +hFq +mCF +vRV +gKh +tPD +aaS +aXZ +cuh +kDD +vQw +kDD +pqv +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +hpF +aVw +aVw +lLL +jOJ +vzd +dXt +nKC +nKC +nKC +nKC +nKC +nKC +nKC +nKC +nKC +uyO +uyO +uyO +iiy +qiW +uyO +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(82,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +uBI +kDD +kDD +kDD +hIl +dDu +awW +oKN +jQI +jQI +jcz +vJx +bei +aym +cmh +haF +kYr +feC +deG +uPM +gKh +cuh +wNC +cuh +cuh +pqv +gSb +pqv +pqv +pqv +pqv +kDD +kDD +kDD +eMQ +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +uBI +uBI +uBI +uBI +nKC +aVw +aVw +hQM +aVw +nKC +nUq +aVw +htl +uda +eCB +oaY +uFj +uFj +uFj +uFj +bGj +kvl +fYg +yle +orX +vPu +uBI +uBI +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(83,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +gYA +dDu +awW +dBv +kvJ +abl +ooG +qrv +nQx +alC +aZI +kYr +kYr +tnU +mCF +vRV +gKh +fZe +xwQ +hjj +vrb +lwr +iyi +sKr +lkp +kBw +pqv +uBI +uBI +xMF +niN +xMF +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +nKC +aVw +aVw +hQM +aVw +nKC +nKC +nKC +nKC +nKC +xDq +cUn +nKC +nKC +nKC +nKC +uyO +nHI +qye +sOc +oVq +vPu +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(84,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +hIl +dDu +awW +awW +awW +awW +fPj +sCo +txs +txs +xaz +srK +awW +bUI +mCF +uUl +gKh +fIp +sOi +sfj +vnK +pZu +pZu +iVr +pIh +ohv +pqv +kDD +kDD +efN +vsZ +lpV +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hpF +hpF +nKC +nKC +nKC +nKC +cUn +nKC +nKC +aVw +aVw +aVw +aVw +kut +hQM +aVw +aVw +aVw +xui +uyO +uyO +uyO +rEG +uyO +uyO +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(85,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +uBI +uBI +hIl +dDu +dDu +dDu +dDu +awW +eRn +fYO +npn +dqB +jAy +mBO +awW +nWG +lue +hsY +gKh +pWN +fHp +kbT +kbT +uLs +urk +gzv +wwi +jGq +pqv +tXX +xMF +oZR +niN +oZR +xMF +tXX +pqv +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hpF +uWj +aVw +aVw +nKC +aVw +hQM +fLR +nKC +aVw +aVw +aVw +aVw +kut +hQM +aVw +aVw +aVw +aVw +nKC +aVw +aVw +hQM +sjX +nKC +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(86,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +xAi +wfu +wfu +wfu +dDu +awW +jPA +bKq +kCT +qxT +dZv +wHv +awW +feC +mCF +vRV +gKh +eaV +raZ +rej +szX +aKb +kyu +iDh +wXx +blG +blG +blG +pZu +pMC +ezH +qhr +blG +unE +pqv +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hpF +aVw +aVw +wQj +nKC +aVw +hQM +aVw +nKC +aVw +aVw +aVw +aVw +kut +hQM +aVw +aVw +aVw +aVw +nKC +aVw +aVw +hQM +aVw +nKC +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(87,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +uiW +pph +bIE +wfu +sob +wfu +nVg +nVg +nVg +nVg +nVg +gKh +gKh +vdW +lKa +fZi +gKh +eaV +oAZ +pqv +pqv +fQv +pqv +gqn +mIj +hCY +hCY +hCY +hCY +ucO +hCY +odR +uHV +unE +pqv +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hpF +aVw +aVw +aVw +vYQ +aVw +hQM +aVw +nKC +aVw +aVw +aVw +aVw +kut +aeJ +jOJ +wCQ +aVw +aVw +vYQ +xjy +dXt +hQM +aVw +hpF +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(88,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +joD +cpH +bjm +qTV +bjm +uHh +drD +ncT +gAZ +qNZ +drD +dhd +gKh +gKh +mrY +gKh +gKh +eaV +gNm +pqv +rtK +vfi +pqv +sJT +vbH +vbH +vbH +kLo +rej +qky +szX +dnb +thz +unE +pqv +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hpF +aVw +aVw +aVw +nKC +aVw +hQM +aVw +nKC +aVw +aVw +aVw +aVw +kut +aVw +aVw +aVw +aVw +aVw +nKC +aVw +eXD +aBD +aVw +nKC +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(89,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +uBI +uBI +uiW +aXU +bZM +fym +aYV +xpb +drD +vQE +rWO +rWO +hNJ +urj +pCg +sHr +kGJ +vRV +gKh +sIY +lFu +cUZ +nCJ +jwu +pqv +xMF +xMF +xMF +xMF +pqv +pqv +pqv +pqv +hzi +thz +unE +pqv +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +nKC +aVw +aVw +aVw +nKC +aVw +hQM +aVw +nKC +aVw +aVw +aVw +aVw +kut +aVw +aVw +aVw +aVw +aVw +nKC +aVw +hQM +aVw +aVw +nKC +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(90,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uiW +uiW +fLn +fOK +fYx +kxa +mlw +fHT +ttd +byE +drD +gSS +gsa +fAw +uii +oMB +gKh +dSA +oAZ +pqv +omG +omG +uBI +omG +omG +omG +omG +uBI +nHD +omG +pqv +fka +thz +unE +pqv +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +mBF +kDD +kDD +kDD +kDD +kDD +nKC +aVw +nKC +nKC +nKC +nKC +eRC +nKC +nKC +aVw +aVw +aVw +aVw +kut +aVw +aVw +aVw +aVw +aVw +nKC +nKC +cUn +nKC +nKC +nKC +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(91,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uiW +uiW +eFH +fYx +gHA +mlw +pbc +pDN +ite +mlw +kjQ +umf +cNr +wLO +mwA +gKh +dSA +oAZ +pqv +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +pqv +trM +thz +xkO +pqv +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +cVk +gKs +vRW +kDD +kDD +kDD +kDD +nKC +aVw +nKC +aVw +aVw +aVw +hQM +aZM +nKC +aVw +aVw +aVw +aVw +kut +aVw +aVw +aVw +aVw +aVw +nKC +aVw +hQM +aVw +sjX +nKC +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(92,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +uiW +vup +lys +aWY +cdz +drD +aHT +xOI +qJO +drD +bPn +ity +baZ +jhR +vRV +gKh +xpi +oAZ +xMF +omG +omG +jiI +omG +omG +omG +obF +uBI +omG +omG +xMF +hzi +thz +unE +pqv +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +cVk +eTu +kmi +kDD +kDD +kDD +kDD +nKC +aVw +nKC +aVw +aVw +aVw +hQM +aVw +nKC +aVw +aVw +aVw +aVw +kut +aVw +aVw +aVw +aVw +aVw +nKC +aVw +hQM +aVw +aVw +nKC +uBI +upa +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(93,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uiW +dow +wts +fEc +bHD +afm +jwr +deB +deB +dEi +pje +hoM +mgf +gCl +uST +twu +tle +oAZ +xMF +omG +omG +uBI +omG +omG +omG +omG +uBI +omG +omG +xMF +hzi +esM +rlj +pqv +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +cVk +got +kse +cZO +cZO +cVk +cVk +nKC +aVw +nKC +aVw +aVw +lLL +aBD +aVw +nKC +aVw +aVw +aVw +xQN +haj +aVw +aVw +aVw +aVw +aVw +nKC +aVw +aeJ +jOJ +jOJ +nKC +kDD +upa +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(94,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +ceo +ceo +tgP +tgP +tgP +ceo +drD +mlw +mlw +drD +naw +bgT +ktn +ffH +ppR +czm +tOy +hXO +xMF +omG +omG +uBI +omG +lxk +omG +omG +iJY +omG +omG +xMF +hzi +thz +unE +pqv +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +uBI +uBI +cVk +rAw +sju +qNG +vpY +nXH +cVk +uIV +aVw +nKC +nKC +nKC +cUn +nKC +nKC +nKC +nKC +nKC +nKC +mji +nKC +nKC +nKC +nKC +nKC +nKC +nKC +aVw +aVw +aVw +aVw +nKC +kDD +upa +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(95,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +wNA +wNA +wNA +ceo +lAp +mzK +gyZ +ohq +ceo +coU +soX +yai +ngT +vjv +amj +lus +bRu +jZS +vkT +iYQ +oAZ +pqv +uBI +uBI +uBI +uBI +uBI +wIG +uBI +uBI +uBI +uBI +pqv +hzi +thz +unE +pqv +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +cZO +pHY +tCo +qaS +vpY +wod +cVk +lLL +jOJ +jOJ +qKk +jOJ +cQf +jOJ +jOJ +dXt +nKC +aVw +aVw +kut +aVw +aZM +nKC +aVw +aVw +buO +nKC +aVw +aVw +aVw +aVw +nKC +uBI +upa +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(96,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +bOU +kDD +wNA +vur +lJv +pdt +nCg +cVe +bUg +iyZ +lmf +iKo +mnV +wGz +pGL +jqh +dGm +dkw +ahB +miy +gKh +eLa +fhe +pqv +omG +gIn +uBI +omG +omG +omG +omG +uBI +omG +omG +pqv +lVQ +thz +unE +pqv +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +cZO +dJd +vHu +iGA +mbn +lkR +cVk +hQM +nKC +nKC +nKC +nKC +nKC +nKC +nKC +hQM +nKC +aVw +aVw +kut +aVw +aVw +vYQ +aVw +aVw +aVw +nKC +nKC +nKC +nKC +nKC +nKC +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(97,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +bOU +kDD +wNA +kZZ +ahs +wNA +doS +mDv +doS +wNA +wNA +wNA +gKh +sZc +gKh +gKh +gKh +qug +gKh +gKh +gKh +eGk +oAZ +pqv +pqv +pqv +pqv +xMF +xMF +xMF +xMF +pqv +pqv +pqv +pqv +hzi +thz +unE +pqv +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +cZO +inQ +uUK +fQA +ivF +qxU +hjJ +aBD +nKC +aVw +aVw +aVw +aVw +aZM +nKC +hQM +nKC +aVw +aVw +kut +aVw +aVw +nKC +aVw +aVw +aVw +nKC +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(98,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +inV +inV +inV +inV +wNA +xCu +byD +avd +iFn +ttN +ocT +yed +pUr +bIZ +mFB +wpt +lAW +sBU +pKl +bCX +iGF +iSr +nvB +lDv +qQC +ixG +ixG +ixG +ixG +uzO +uzO +uzO +uzO +ixG +tqc +sVo +ixG +frT +thz +unE +pqv +pqv +pqv +pqv +pqv +pqv +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +kDD +kDD +kDD +kDD +uBI +uBI +cVk +lAx +kxz +bgy +aXt +klc +cVk +aVw +vYQ +aVw +aVw +aVw +aVw +aVw +vYQ +hQM +nKC +nKC +nKC +esB +nKC +nKC +nKC +nKC +nKC +nKC +nKC +kDD +upa +upa +upa +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(99,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +inV +inV +aRi +rFt +bSb +ble +wNA +byD +nPW +mxW +pvR +iUY +piz +vZh +uaG +sDG +bME +dAK +kyd +uza +lyM +onD +iSr +pKZ +tyY +vEL +iWD +iWD +iWD +iWD +iWD +iWD +iWD +iWD +iWD +iWD +iWD +nxz +bNZ +teZ +ykA +xrn +eVq +kKC +kKC +tht +pqv +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +bwg +vKY +eOU +kDD +kDD +kDD +kDD +kDD +kDD +cVk +kUA +jdV +qzi +fSp +lYa +cVk +aVw +nKC +aVw +aVw +aVw +aVw +aVw +nKC +aeJ +jOJ +jOJ +tzD +jSq +taO +xOz +aVw +nKC +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(100,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +rtz +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +inV +gko +keZ +fCw +fds +vSJ +wNA +kCV +ljk +cgG +ykV +rEy +vKp +saD +tno +eBo +sFW +eex +fHZ +sUt +uBe +cwG +iSr +rOk +xeP +ipg +rWt +pHh +pHh +pHh +pHh +pHh +orM +pHh +pHh +pHh +eFG +myu +euD +sCk +puU +xMF +nvB +lvZ +pHh +adB +pqv +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +rzD +mhv +htk +sgb +sgb +sgb +htk +htk +grh +cVk +nbv +cVk +cVk +cVk +jxV +cVk +nKC +nKC +nKC +fZZ +fZZ +fZZ +fZZ +fZZ +fZZ +veX +veX +veX +veX +aVw +epY +aVw +nKC +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(101,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +esT +jKr +jKr +jKr +sYn +cxg +rWv +hYB +tFl +xmM +wNA +wNA +wNA +uhc +wNA +wNA +wNA +wNA +wNA +dQB +hmW +pUT +iSr +nrI +jzb +nrI +iSr +tiV +rHn +tiV +tiV +abS +usL +abS +ehi +abS +abS +abS +uzi +uzi +abS +gQS +xTk +qOu +xbW +hzR +nvB +gaM +juz +jOC +pqv +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +cba +hXT +jjf +qmB +sgb +aMa +gGa +nyk +rHz +htk +pJs +wwB +npv +vmv +aVw +aVw +hQM +aVw +aVw +seK +aVw +fZZ +uHR +fZZ +uHR +fZZ +mes +veX +fNA +oNJ +veX +aVw +epY +aVw +nKC +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(102,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +rtz +rtz +rtz +rtz +kDD +kDD +rtz +rtz +rtz +rtz +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +inV +bfj +ofn +twR +mYJ +aRJ +xDl +brY +tQI +ewO +wHf +eir +rQk +rQk +oTb +jvm +rQk +mth +qUp +gfg +dJF +dXa +wrI +okt +vgi +sfL +mNt +kCE +jBX +ohz +hkn +swY +abS +bxi +bod +sSn +abS +icP +qHG +qpZ +oHO +hzR +nvB +lHY +juz +jOC +geN +geN +geN +geN +bPN +bPN +bPN +bPN +bPN +vmv +ykv +vmv +iqq +htk +ind +kVD +qCd +qrX +htk +pNC +qvT +wkq +vmv +hCG +aVw +eXD +jOJ +jOJ +jOJ +dXt +fZZ +eda +fZZ +eda +fZZ +nwV +veX +doI +qcs +veX +veX +yeO +veX +veX +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(103,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +inV +hxo +eQX +axD +rXr +emq +tMi +qDp +cJO +aPy +qXP +cMY +cMY +cMY +cMY +kag +cMY +msH +bIl +qDp +aPA +sXw +iXI +pdo +rZv +vjX +hnp +ijn +jBX +cVm +ozu +cVm +abS +bic +fUG +nSC +abS +wwz +mex +cfs +jfe +hzR +trF +dMN +bbC +juz +geN +xYS +faX +lHu +bPN +qFl +xvP +hRs +bPN +bDd +wQi +vmv +uSa +aBY +aMa +lXV +fTW +eXY +htk +aUH +iJU +lbJ +vmv +nKC +nKC +cUn +nKC +nKC +nKC +hQM +fZZ +cxI +fZZ +cxI +fZZ +cxI +veX +ajC +rhX +urX +iTR +cNC +fLe +veX +uBI +upa +upa +upa +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(104,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +kDD +cyv +jec +eCh +kDD +cyv +jec +eCh +kDD +cyv +jec +eCh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +inV +gko +ofn +aaY +wFr +gLG +kbO +jMt +vQQ +qlF +pZi +oNY +gVu +oNY +oNY +oNY +pLW +xOS +pmN +bLu +oGb +oVD +eHM +ire +nGF +xkp +hnp +abS +iNn +hVf +eTK +eXB +yeZ +lKS +dGw +mKQ +abS +heF +mLJ +jdx +ure +uFQ +uFQ +uFQ +uFQ +uFQ +uFQ +dyO +rtb +daX +fiW +xDd +nSf +cKf +bPN +fxe +wKz +vmv +mhv +aBY +nEL +aGU +bJV +mbr +htk +aUH +dFd +lrR +vmv +aVw +aVw +hQM +aVw +aZM +nKC +hQM +fZZ +bAa +hTm +rlh +rlh +rlh +veX +veX +veX +veX +jIf +iin +cnj +veX +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(105,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +uBI +uBI +cyv +nZi +eCh +kDD +cyv +nZi +eCh +kDD +cyv +nZi +eCh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +fkb +kRJ +kRJ +kRJ +qmH +oAu +kCi +wgt +iEk +iSQ +tiV +dvo +tOZ +dvo +sye +vZi +sye +sye +sye +sye +sye +sye +sye +ppk +sye +hfp +jMt +qCz +kAm +nRi +mOD +nIo +xPi +nMJ +txz +grd +gNu +lga +oDX +vwj +abS +iXC +mlK +vlX +fQa +uFQ +aWe +lHs +lGY +lXT +dIq +nOv +gOf +oRs +bPN +hWZ +bzF +oEG +bPN +kpR +oIV +vmv +vAA +kba +xhK +piO +pji +udY +htk +aUH +iJU +vLN +vmv +aVw +aVw +hQM +aVw +aVw +nKC +aeJ +dgZ +cRT +ibA +rlh +rlh +rlh +mKq +vuU +dlN +rFj +eVE +unt +wDX +veX +kDD +kDD +kDD +upa +upa +upa +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(106,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +kDD +cyv +nZi +eCh +kDD +cyv +nZi +eCh +kDD +cyv +nZi +eCh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +inV +bfj +nEc +eWO +pbb +olP +tiV +kyb +pko +wPO +sye +iiO +xNa +uAz +sye +cDV +cDV +poG +sye +lBx +sye +sye +sye +adb +sBC +xkp +oCt +abS +abS +cVm +hCi +cVm +abS +abS +abS +abS +abS +ggo +fjc +ujJ +vSV +uFQ +lKy +tIP +eLD +yau +dIq +nOv +gOf +tnR +bPN +mYn +rBg +wgN +bPN +csR +chT +vmv +htk +htk +htk +htk +gIy +htk +htk +aUH +iJU +pHw +vmv +aVw +aVw +hQM +aVw +aVw +nKC +fZZ +fZZ +fZZ +fZZ +fZZ +ogw +hJe +xca +mwy +ehH +sAV +vRN +jIW +daC +veX +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(107,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +uBI +uBI +cyv +nZi +eCh +kDD +cyv +nZi +eCh +kDD +cyv +nZi +eCh +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +uBI +kDD +kDD +inV +inV +vhT +xzu +jMW +tcB +tiV +qfv +lfc +lYI +dHH +ezn +sye +mVm +sye +cDV +cDV +cDV +sye +bPe +tiV +tiV +tiV +tiV +chf +gVz +aYa +jSv +uzi +aQz +sTm +hZN +abS +tLu +wKg +lEz +ocR +ocR +ocR +hzu +ocR +uFQ +uzh +npq +nBp +tvG +dEd +nOv +llg +oRs +bPN +miA +bPN +miA +bPN +sUo +gyB +wbp +mgU +qjC +vmv +eRo +mjd +nLZ +ebt +euT +iJU +vLN +vmv +nKC +nKC +cUn +nKC +nKC +nKC +fZZ +gxF +geR +bfF +fZZ +qZm +pDD +veX +veX +veX +veX +nEy +vPZ +pIy +veX +kDD +bRh +kcz +kcz +kcz +kcz +kcz +kcz +kcz +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(108,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +rtz +kDD +kDD +cyv +nZi +eCh +kDD +cyv +nZi +eCh +kDD +cyv +nZi +eCh +kDD +kDD +kDD +uBI +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +tiV +tiV +tiV +tiV +tiV +tiV +qfv +lrE +wPO +sye +sye +sye +jNB +reF +rRP +bpD +kjL +cJr +mOW +tiV +jHu +jHu +jHu +vtX +equ +cqM +esU +abS +abS +rLA +abS +abS +jYu +qcd +qcd +jYu +uxy +tVv +fai +ocR +iEs +mEN +lmr +gCb +aqE +dIq +cxH +gOf +oCD +fOt +sgL +qSZ +krx +kTs +rdo +uZO +vQC +vQC +vQC +oaN +fwx +vHS +fkh +fkh +fkh +sbu +sFd +hqT +uoh +jOJ +aBD +aVw +aVw +aVw +fZZ +pQZ +qFS +dzm +xcb +kgf +vbs +veX +pFC +llm +bYB +vGP +xfw +aOf +kaa +kDD +kDD +kcz +ddm +uey +sTB +rhh +wUs +kcz +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(109,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +wVy +kDD +kDD +kDD +wVy +kDD +kDD +kDD +wVy +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uBI +dAx +dAx +dAx +dAx +dAx +xqX +hqd +dAx +kyb +wPO +bME +pJM +aPr +sye +oSf +sye +dQq +sye +hEa +mwZ +cDV +sye +gpZ +tiV +jHu +jHu +jHu +cBB +myF +oEz +itY +fLj +nxK +oYi +oim +sGQ +nxK +uLa +nxK +cUo +nuv +fai +cBV +ocR +eMw +wOC +nXO +sCO +dVc +tQY +jad +wtj +oRs +geN +sWR +sWR +sWR +xUG +qSV +eCW +eCW +eCW +eCW +eCW +bLF +ibT +ofI +sxZ +cvq +aGf +mPA +vmv +xZa +nKC +nKC +nKC +nKC +nKC +fZZ +ewe +fZZ +gXs +fZZ +eda +waN +veX +doI +egs +veX +nEy +xfw +pIy +veX +uBI +uBI +kcz +wCi +rQm +gpL +gpL +blC +kcz +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(110,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +kJV +fTq +jfa +ouU +ouU +ouU +ouU +ouU +ouU +ouU +ouU +ouU +ouU +ouU +ouU +ouU +ouU +qvZ +fTq +bfD +uBI +jiW +qXo +sks +jQR +vQR +qsU +fGQ +dAx +qfv +kne +ofU +pJM +erJ +sye +skv +quD +sAa +sye +lBx +cDV +cDV +sye +gJX +tiV +tiV +tiV +tiV +tiV +eto +cfG +jVR +axQ +axQ +axQ +axQ +cQl +axQ +ckz +axQ +bBA +nfo +nfo +nfo +nfo +uFQ +aWe +ukn +jcK +lXT +dIq +ppu +jlS +czA +geN +kIB +bLP +xom +jkN +oDq +tcw +uRa +diQ +hUb +eCW +rmc +fkM +vLN +vmv +vmv +vmv +vmv +vmv +cDw +nKC +aVw +aVw +aVw +sjX +fZZ +eqv +fZZ +lCO +fZZ +rlh +rlh +veX +qeB +dzr +veX +vMa +xfw +aOf +kaa +kDD +kDD +npU +dsA +nYZ +hrw +fbU +mJj +kcz +xgk +xgk +xgk +xgk +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(111,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kWj +kDD +kDD +kDD +kWj +kDD +kDD +kDD +kWj +kDD +kDD +kDD +kDD +kDD +uBI +uBI +dHM +cld +xiG +hDE +xiG +oma +aSO +mgO +kMt +dNX +qJY +mYa +aoM +jJr +kyb +sye +lBL +sye +uEq +sye +uPI +sye +sye +sye +sye +sye +xjQ +aTQ +ezR +sye +cWZ +qeU +fiv +axQ +iYX +gNy +gPv +oBj +cou +hrQ +axQ +bBA +nfo +jkR +ylL +jkR +nfo +nfo +nfo +nfo +nfo +nfo +ppu +jlS +oRs +geN +qXn +kIB +alM +gPg +tZV +vTt +nta +vdI +egf +eCW +cww +wfe +yfV +eGb +nLF +nLF +nLF +fFo +eDS +uVf +tkE +sCc +dri +aVw +fZZ +biE +fZZ +pOL +fZZ +vgC +fZZ +veX +veX +veX +veX +wzc +xfw +nGR +veX +kDD +kDD +kcz +xse +usJ +cin +gEH +blC +kcz +edE +rNS +hTn +aED +dGJ +iGa +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(112,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +osK +uBI +uBI +cyv +ehU +eCh +kDD +cyv +jvT +eCh +kDD +cyv +jvT +eCh +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +dAx +vUo +sks +ncz +afl +kyT +iXj +dAx +gyj +mrK +wPO +sye +sye +sye +sye +sye +jjp +sye +qij +cDV +cDV +ghW +sye +hTV +phb +lYT +qfy +qKj +wAH +xSc +oxF +axQ +pIw +iCK +dgd +iMb +iBt +eJT +axQ +bBA +nfo +jkR +jkR +jkR +hca +gQG +aXc +lJA +rMS +nfo +mea +jlS +nxS +geN +kIB +eOF +xom +jkN +ugI +tcw +dvv +mWY +aMZ +eCW +rLB +eCW +eCW +vmv +vYQ +nKC +nKC +rZo +nKC +nKC +aVw +nLf +qjn +aVw +nKC +igy +rTO +aFW +eTW +nUh +igy +kFy +uuX +vqC +veX +rDm +xkM +aOf +kaa +uBI +uBI +npU +dsA +cYO +kcz +ipx +blC +aoR +unp +ieT +gah +sEt +oTO +pre +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(113,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +cyv +jvT +eCh +kDD +cyv +jvT +eCh +kDD +cyv +jvT +eCh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dAx +dAx +dAx +dAx +dAx +dAx +dAx +dAx +qfv +hsP +wPO +sye +jRl +poC +bQx +mCG +uEq +sye +lyL +vgr +vgr +vgr +reF +vgr +pHW +dsq +eJX +sye +aMg +ahb +cxr +axQ +gHP +bCZ +iFo +wDT +wDT +nuB +axQ +bBA +jeH +jkR +prQ +jkR +hca +eYq +jqa +tcn +kGk +rLw +ppu +jlS +oRs +eSN +eSN +eSN +eSN +eSN +tfL +eSN +hzA +oXt +nta +nta +clx +nys +eCW +aVw +aVw +buO +nKC +qnh +oBt +nKC +aVw +vlz +uMg +tkE +sGe +ikl +jAr +ikl +ikl +dNz +ikl +ikl +kuv +jci +xXu +esY +yeC +pIy +veX +bRh +kDD +kcz +uar +usJ +cin +gEH +blC +aoR +unp +gPD +rbT +joa +rUA +lOW +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(114,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +cyv +jvT +eCh +kDD +cyv +jvT +eCh +kDD +cyv +jvT +eCh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +tiV +mgz +jOr +kpP +ooa +fhQ +iGZ +uov +qfv +gQF +xtz +sye +nZG +edx +isa +isa +bSD +sye +maR +cDV +cDV +cDV +soV +soV +soV +soV +soV +soV +icG +sjh +mjj +axQ +ygf +vsY +oyr +cGS +oAr +wKS +oKv +nSD +nfo +jkR +tXj +jkR +nfo +mGx +rTW +sqG +ykz +nfo +ppu +jlS +kIj +vuX +aCm +mgk +hsV +qXw +jzf +eSN +umP +dxd +hbu +hbu +hMm +djy +eCW +aVw +aVw +aVw +vYQ +ygQ +eiS +nKC +aVw +aVw +aVw +aVw +nKC +hxl +kMT +xBA +hxl +mON +hxl +hxl +kpJ +hxl +veX +rDm +ghv +aOf +kaa +kDD +kDD +npU +jYr +mVl +vpl +ccC +jLm +lak +eFm +fEk +mnH +sEt +nxI +pre +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(115,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +cyv +jvT +eCh +kDD +cyv +jvT +eCh +kDD +cyv +jvT +eCh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +ygq +sHR +uVJ +qFL +ozq +feb +iwm +jYV +fCq +lhi +aJG +wPO +sye +cDV +cDV +cDV +vue +vTB +sye +aSc +sye +sye +soV +soV +jwc +uvC +qIQ +rUs +soV +lUw +sjh +xUy +ugh +ndd +bpN +aVe +blU +gKT +wNQ +oKv +nSD +nfo +vxd +obC +jkR +goE +fxs +gvx +sqG +hNb +nfo +tIZ +ffS +jJt +eMe +sZl +srA +rOw +rOw +sKl +eSN +eSN +ubC +rZj +tBv +syk +vbt +eCW +aVw +aVw +aVw +nKC +vlz +aLv +veX +veX +veX +veX +veX +veX +veX +upS +upS +upS +veX +qNS +qNS +qNS +veX +veX +spA +ghv +pIy +kcz +kcz +kcz +kcz +pVR +rQm +pyl +gpL +blC +kcz +cvU +cZo +mnH +frd +mdj +rhF +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(116,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +cyv +vvz +eCh +kDD +cyv +raQ +eCh +kDD +cyv +raQ +eCh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +inV +jKY +jOr +rdz +nbD +mLc +jOp +uov +qfv +bQt +kyb +sye +mCG +uua +uAE +geC +cDV +sye +gtT +gSX +ioD +soV +soV +qOH +iqh +vDI +vDI +gQO +eIA +sjh +xUy +vBs +utD +idC +mnw +uEa +uEa +vfq +axQ +bBA +nfo +jkR +rpX +jkR +nfo +jPT +nXv +aHK +aHK +gnN +aNs +sHk +vzE +mnr +dSE +hac +hgr +vZl +mXs +lgN +eSN +fnv +qSw +pXv +gji +oIO +uir +uir +uir +uir +uir +uir +xZa +veX +mPr +pWv +fFp +isn +mPr +veX +sxn +qYK +lEf +veX +sxn +qYK +myG +veX +xaj +tAm +ghv +vle +kcz +ibN +cBN +owE +kzm +nYZ +hrw +fbU +xlj +gSp +xPJ +cZo +mnH +emQ +kDD +dDp +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(117,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +tiV +tiV +tiV +tiV +inV +inV +tiV +tiV +mtY +mtY +mtY +dmG +kjY +kjY +kjY +dmG +dmG +dmG +dmG +sye +aSc +soV +gov +aoJ +wtC +aoJ +jgO +soV +dzH +sjh +xUy +rcC +mbW +jOx +jOx +jOx +mGt +hxA +axQ +bBA +nfo +nfo +nfo +nfo +nfo +xsh +jML +sKh +kzI +nfo +dan +bqG +qJM +eFX +ivX +wiX +xcx +dZT +jlK +pJQ +eSN +pAA +nta +nUe +klK +wnO +gED +vNX +kHV +jNu +tVz +uir +xZa +bJl +iIS +wBf +obA +xdq +lyU +veX +tEx +sSr +hRr +veX +lDj +vTs +psA +veX +mXx +dWf +ghv +pIy +kcz +woK +wSH +gmc +aBS +usJ +cin +gEH +cvY +cin +vgw +poE +xAz +emQ +kDD +dDp +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(118,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +rtz +kDD +rtz +rtz +rtz +kDD +kDD +rtz +rtz +rtz +rtz +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uWi +kDD +kDD +kDD +uBI +dTr +uBI +kDD +kDD +kDD +dmG +kVc +gaa +soV +gpi +aoJ +pvE +scB +iIG +ulZ +wkS +sjh +cAM +axQ +fdb +mtL +lno +nKg +vct +sRc +axQ +kvx +lCL +nHt +cBV +cBV +nfo +hFv +jUR +pKT +gRz +nfo +ppu +jlS +vzE +dYn +uAw +oie +gOH +eqZ +nWN +fUU +eSN +rRe +nta +nUe +klK +qXO +gED +fOT +oks +vgF +vgF +uir +tSe +veX +jdA +ljE +sKd +czv +xfe +veX +bWT +qKb +efw +veX +qqj +nqb +suf +veX +thT +guL +szW +aOf +cin +dsA +wSH +bTt +aBS +cYO +kcz +ipx +cvY +cin +vgw +cZo +mnH +emQ +kDD +dDp +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(119,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +kDD +kDD +kDD +uBI +uBI +uBI +kDD +kDD +hoK +uBI +rtz +kDD +uBI +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +kDD +kDD +kDD +uBI +kDD +kDD +uWi +kDD +kDD +vac +vac +vac +vac +vac +kDD +kDD +dmG +ghM +rLX +soV +atK +aoJ +lps +flr +cpt +lmS +cQm +lOy +nrC +axQ +irL +irL +irL +axQ +utW +mhy +irL +geN +geN +hFi +geN +geN +nfo +nfo +nfo +nfo +nfo +nfo +ppu +jlS +vzE +wzN +wDG +wDG +bgK +vuX +vuX +vuX +eSN +bDj +aAU +tDN +goc +ldb +oYL +iPx +uRK +fiq +mxA +uir +bDD +veX +riZ +pSF +iiT +pSF +tDT +veX +qzP +mMb +xvt +veX +bYo +hih +qzP +veX +fCx +oFG +pQI +qgO +rtp +tkv +lLO +mBu +lKq +gtJ +gSp +vXH +tMH +kcz +cWw +udX +nFR +rKo +dGJ +iGa +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(120,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dJH +dJH +pWI +dJH +dJH +dJH +dJH +pWI +dJH +kDD +kDD +kDD +kDD +rtz +rtz +rtz +rtz +kDD +rtz +rtz +rtz +rtz +kDD +kDD +oGA +kDD +rtz +kDD +rtz +kDD +kDD +kDD +rtz +rtz +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +uBI +uBI +kDD +uWi +kDD +vac +vac +bcd +wFf +fst +vac +vac +kDD +dmG +eEH +gaa +soV +pOr +aoJ +uyA +rYG +vsD +soV +dZM +kha +tWX +geN +kNS +fof +hba +geN +sKH +ocS +qls +aQj +aMj +opD +dFi +geN +amf +eCp +hdX +gJG +imV +ujt +gnV +pdj +aVp +faX +jmM +faX +faX +tBJ +faX +xzH +hkj +nta +nta +nUe +egf +ifg +gED +tgO +vTX +hlm +fkS +nlz +bqy +veX +bOH +wZR +cPp +wZR +bOH +veX +veX +veX +tzv +veX +dKh +veX +veX +veX +fQM +pCL +gYI +agf +byb +tfN +sAY +uck +wjR +diD +oQr +pFt +nHj +jnH +pKo +lWF +jKs +dWR +tZG +uYO +qso +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(121,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dJH +dJH +dJH +dJH +dJH +dJH +dJH +dJH +dJH +jsj +fad +bYm +bYm +ghS +ghS +ghS +bYm +ghS +cfU +xgU +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +uBI +kDD +kDD +uBI +kDD +kDD +rtz +uBI +rtz +uBI +rtz +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uWi +sBF +vac +yei +vXQ +rFx +vXQ +pGd +vac +wYh +dmG +sye +aSc +soV +soV +kAz +fvJ +nhQ +ufu +smb +bTg +jHk +oVY +gog +epG +xsg +mge +pAE +syS +trE +rLr +kAe +kAe +bNL +txS +bDq +dLw +kUX +tSd +gaO +oTS +eSy +rZV +nDo +tCg +lyX +pok +lyX +lyX +lyX +lyX +mwR +uFK +vgH +vgH +rzf +hkE +vve +gED +xMg +sIu +wJr +txG +uir +xZa +veX +ajK +awP +toK +tEa +tEa +iOv +dza +tEa +hpL +roT +qMQ +ccS +tOt +tyT +lMm +uSI +leL +pIy +cin +ojA +xrN +atZ +dkn +cQg +dkn +qhp +blC +aoR +unp +jwC +afO +tOw +rUA +emQ +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(122,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jsj +fad +bYm +bYm +bYm +bYm +bYm +bYm +bYm +mim +bYm +jAf +jmA +jaA +jaA +hNR +jaA +jaA +oUk +iVX +nRa +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +rtz +kDD +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +uBI +uBI +bOU +bOU +uWi +uWi +uWi +uWi +uWi +kDD +vac +gRL +oqr +oqr +oqr +osN +vac +kDD +dmG +aLu +gaa +cDV +soV +bId +qTd +fLt +dvJ +soV +wkS +jSf +oIF +geN +igs +rbp +dJV +geN +blF +mGX +lgp +ipl +oXG +wTt +kta +geN +lMD +fCV +uMC +wvr +vzE +kec +fCV +oRs +oRs +utA +eJd +waW +arZ +szZ +oRs +xtX +hkj +rUj +iDX +fMV +mkw +szV +gED +sIu +cds +cds +bIK +uir +xZa +veX +mtp +nEF +nEF +nEF +nEF +nEF +nEF +nEF +vqV +qJQ +cAN +cGp +bwk +nuR +fQM +sXj +leL +aOf +kcz +kcz +cin +ccb +cin +kcz +kcz +eIh +blC +aoR +unp +cpJ +afO +sEt +tKC +uYO +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(123,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jsj +fad +bjz +jmA +jaA +jaA +hNR +jaA +jaA +jaA +jaA +hNR +jaA +kDD +kDD +kDD +uBI +kDD +kDD +jDr +iVX +xgU +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +rXd +pGH +pGH +pGH +pGH +hNh +hHQ +nIF +sTq +wso +tOq +uWi +kDD +vac +fnF +khm +izi +muG +jlU +vac +kDD +dmG +cDV +gaa +cDV +soV +soV +soV +soV +soV +soV +hZP +uVB +tRx +geN +cxH +bDo +cxH +geN +geN +geN +lhh +geN +geN +hFi +geN +geN +cxH +fnR +cxH +cxH +hVj +cxH +eio +laQ +chb +geN +geN +geN +geN +geN +geN +geN +eCW +eCW +eCW +eCW +eCW +eCW +uir +uir +uir +uir +uir +uir +xZa +veX +cgv +lJx +aje +lhx +aje +lQW +nqE +awP +vaT +nNQ +cwO +kqa +awP +rzl +fCx +sXj +leL +pIy +kcz +lcI +eFQ +xgL +tdh +dgT +kcz +eIh +blC +kcz +gWg +qzZ +aZg +xgk +rKo +rhF +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(124,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jsj +fad +bjz +jmA +kDD +kDD +kDD +uBI +kDD +kDD +gJJ +kDD +uBI +kDD +kDD +kDD +dJH +pWI +dJH +dJH +jsj +iVX +vJn +dJH +dJH +dJH +dJH +pWI +dJH +dJH +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +erF +uBI +uBI +uBI +uBI +vIb +jKr +tRP +qPM +tqX +hsN +jTq +kDD +vac +vXQ +oqr +otf +oqr +vXQ +vac +kDD +dmG +cDV +rKk +hHY +aLu +giq +cDV +cDV +ghW +sye +bLc +aDb +lJO +aIp +gas +seq +xwr +hRb +bfk +iAJ +qWU +gvi +pNZ +vgf +pNZ +idA +cLX +gUL +jSL +cxH +cZV +uZk +wfT +jJW +pAt +pNZ +brv +vwG +teG +fRb +teG +teG +mUm +uZk +eCT +hns +hns +uZk +vhQ +uZk +eCT +eCT +jzP +uZk +vgf +jSF +cKy +eIX +cKy +jSF +veX +iOY +veX +gmr +bCM +qka +eQN +hdc +veX +veX +fQM +sXj +leL +egx +kcz +kxw +tGk +rbu +raH +mQt +kcz +eIh +blC +kcz +xgk +xgk +xgk +xgk +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(125,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jDr +fad +bjz +jmA +kDD +kDD +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +cWk +oPl +enH +nQm +rUJ +wYZ +cWk +kGA +cWk +qSn +cWk +pSv +tZF +cKu +xgU +kDD +kDD +uBI +kDD +slM +slM +slM +slM +slM +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +erF +uBI +kDD +uBI +uBI +rrq +rrq +tyD +kGC +syK +kGC +nYE +sBF +vac +bIn +qVB +dvw +vXQ +cta +vac +wYh +dmG +cDV +sye +eBz +gSX +cLV +xeS +cDV +cDV +sye +xZt +mbJ +hmZ +nsY +tex +edg +nrQ +eDj +rqT +svu +gvR +vlB +pNZ +vgf +pNZ +iWP +luq +fIZ +tYP +cxH +kjx +uZk +vfK +bMk +uAR +pNZ +vgf +uZk +eCT +qyT +eCT +cjm +xHC +xTZ +teG +teG +guc +xTZ +teG +xTZ +teG +teG +teG +xTZ +vEn +jSF +asQ +cdd +sSs +jSF +eCT +hup +uZk +ivz +hsy +jfW +aJq +ivz +ivz +veX +kaZ +fim +uix +pIy +kcz +bJF +ahe +hZc +aUY +byS +kcz +ncH +eAB +kcz +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(126,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jDr +jik +jmA +kDD +kDD +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +vlO +vlO +vlO +vlO +vlO +pRX +vlO +vlO +vlO +vlO +vlO +vlO +vlO +vlO +vlO +slM +slM +slM +slM +slM +mqY +wBH +sIT +aLV +vUd +slM +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +uBI +erF +uBI +kDD +uBI +rrq +rrq +pVW +dNS +bJs +tyG +fgz +vxh +kDD +vac +vac +vac +xwC +vac +vac +vac +kDD +dmG +gdi +sye +whG +uIq +sye +cDV +cDV +sHt +sye +qdt +fzb +srX +dDs +kuE +whK +dNC +eRQ +uWu +tJG +qvO +sIa +pNZ +vgf +pNZ +vfo +luq +dyJ +aqD +cxH +fJn +fbF +iwN +uGp +lLQ +pNZ +vgf +uZk +uZk +uZk +uZk +uZk +uZk +bQp +bQp +bQp +xBn +bQp +bQp +bQp +eCT +eCT +eCT +uZk +hup +jSF +cIM +cgc +rEO +jSF +eCT +hup +eCT +ivz +cMN +nDS +cJd +cNR +kDD +kaa +drG +wps +sha +nAh +kcz +iHx +mxx +mxx +hEz +dwI +kcz +fFq +qOD +kcz +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(127,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jDr +jnF +xgU +kDD +oQx +oQx +oQx +oQx +oQx +yew +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +cEB +cEB +vlO +mrZ +oer +mrZ +vlO +uHa +uHa +uHa +uHa +uHa +uHa +uHa +slM +iOA +hYK +lxl +slM +voV +uUT +sfB +feN +hhM +oze +oGK +pGH +wjW +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +erF +uBI +uBI +uBI +rrq +cgg +eNq +vEd +pkH +jVK +xjC +uWi +kDD +kDD +cnh +tTo +uLL +hop +cnh +kDD +kDD +dmG +cDV +cDV +gaa +cDV +cwC +sye +sye +aSc +sye +cvP +fzb +srX +peO +cAb +iYF +eXF +ivn +bfk +fPm +lSd +qeO +pNZ +vgf +pNZ +nzO +iBp +pkT +wyh +cxH +vgf +uZk +txH +uin +txX +pNZ +vgf +uZk +iVf +dRT +vda +bfs +bfs +bQp +oFe +tYt +wEC +ktq +mZu +bQp +bQp +uZk +uZk +uZk +hup +jSF +whN +fVv +qzM +jSF +uZk +wZV +hIg +iie +eHk +bQM +nNr +cNR +kDD +veX +eXd +eXd +eXd +eXd +eXd +eXd +eXd +eXd +fHr +eXd +kcz +kcz +kcz +kcz +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(128,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jDr +jnF +nRa +uBI +oQx +oQx +oQx +oQx +ydg +jWK +mEq +mpB +mpB +ekv +uqw +jtf +oQx +oQx +oQx +oQx +cUL +cUL +djn +cUL +cUL +cUL +vlO +vlO +vlO +vlO +vlO +vlO +slM +lOa +nnu +nnu +slM +iqo +egB +vpm +kTc +oCR +slM +kDD +kDD +erF +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +uBI +erF +uBI +kDD +uBI +rrq +oxn +oqe +eAe +qlz +mhi +eNo +uWi +kDD +kDD +npz +hkr +oMg +sQv +eiH +kDD +kDD +dmG +cDV +cDV +kfA +xeS +cDV +vCv +dTZ +bwn +wEg +uiP +kYN +cXj +aIp +qaW +bFH +fdJ +wkr +bfk +bfk +aIp +aIp +pNZ +vgf +pNZ +pNZ +aFS +pNZ +pNZ +pNZ +lEb +pNZ +pNZ +pNZ +pNZ +pNZ +vgf +uZk +glg +cZs +lCc +lCc +lCc +bQp +dws +nSO +aio +gdw +xgb +qim +bQp +eCT +eCT +bLy +hup +jSF +jSF +jSF +jSF +jSF +bhk +pNB +uZk +ivz +vkC +vQJ +gaT +ivz +ivz +ivz +vKD +vKD +llN +vhh +tvt +bVX +ipq +ipq +nsG +eXd +kjD +kjD +arI +uVq +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(129,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jsj +jnF +vJn +kDD +oQx +oQx +oQx +xRP +jEW +uGR +fjl +gZH +hdt +fjl +jQe +pAz +mpB +oQx +oQx +oQx +cUL +gUo +uqe +lov +jJQ +cUL +kDD +vBi +nml +kDD +vBi +kDD +slM +nnu +nnu +nnu +slM +mVn +uGs +nnu +kxf +dfK +kDD +kDD +kDD +erF +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +uBI +erF +uBI +kDD +uBI +rrq +xgc +tTf +eAe +auP +kFY +lUp +uWi +kDD +kDD +kDD +bCd +qrJ +bCd +kDD +kDD +kDD +dmG +cDV +cDV +gaa +cDV +cDV +sye +cDV +dmG +enI +lYp +vyw +cXj +aIp +rZJ +lxz +buv +lIj +bse +iCG +aIp +bhk +tYe +dhR +teG +teG +fRO +teG +teG +teG +kgz +teG +teG +rxS +teG +teG +jvW +uZk +nGg +lij +jVn +jVn +twQ +bQp +qKU +hub +eWN +gCR +rDf +gaZ +bQp +eCT +eCT +uZk +tKg +hIg +hIg +tYe +hIg +hIg +pNB +uZk +uZk +bbb +mBC +pln +wSl +xpv +ivz +ivz +vKD +vKD +vKD +eXd +bTR +eXd +vhh +eXd +eXd +eXd +kjD +kjD +kjD +uVq +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(130,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jDr +tDG +kjU +tBX +xgU +oQx +oQx +oQx +pIf +lSU +lcH +meb +vZw +vZw +mGE +gbS +ojq +fLo +pUY +gwU +jOO +cUL +tWh +nPx +uPm +nSM +cUL +kDD +pTm +kDD +kDD +pTm +kDD +slM +isi +ajX +mDJ +slM +iqF +usO +nnu +qNu +gDR +iUT +kDD +kDD +erF +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +erF +uBI +uBI +uBI +rrq +wLQ +qXD +eHt +auP +dyP +fDU +uWi +uWi +uWi +fuq +isZ +yeW +isZ +fuq +xob +xob +xob +xob +xob +fKW +xob +xob +xob +xob +xob +wCl +fcJ +oWE +hrf +aIp +krj +oBJ +gJp +xwb +ezr +oAb +aIp +hup +uZk +uZk +uZk +uZk +uZk +uZk +uZk +uZk +uZk +oQi +uZk +uZk +uZk +uZk +uZk +uZk +nGg +xZc +lOV +sUT +tQp +bQp +bQp +pwi +bGc +bQp +wIl +bQp +bQp +eCT +eCT +uZk +uZk +uZk +uZk +uZk +uZk +bLy +uZk +uZk +oMZ +rgm +aoP +eJA +gGW +baJ +rqU +ivz +vKD +vKD +vKD +pLL +bQo +eXd +wYf +cXS +wYf +eXd +kjD +kjD +kjD +uVq +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(131,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jDr +rAN +kjU +aMq +xgU +oQx +oQx +oQx +mpB +lWp +aPq +oQx +qSR +oQx +oQx +qno +foX +mpB +aNZ +iLG +bfi +bpn +gBT +rjb +eLs +tdO +bpn +azZ +azZ +azZ +azZ +azZ +azZ +bpn +bEF +hhz +mQw +iYA +aEI +nKP +nnu +oUc +dfK +kDD +vTb +kDD +hsZ +pGH +pGH +pGH +pGH +pGH +pGH +pGH +pGH +pGH +sbM +uBI +kDD +uBI +rrq +mMp +hDA +qvL +aqT +dyP +gCo +uWi +wFe +qFo +tHt +vPS +qwT +nrt +ebz +hQb +vgD +cad +vdG +jtC +avT +dHY +rlE +vUz +xFV +nva +cFC +oOA +rAD +ugE +aIp +aWO +tnW +hRt +cHU +dKw +nEk +sYd +hHz +eCT +uZk +eCT +eCT +jzP +uZk +uZk +hyo +adU +adU +adU +adU +uTc +kNY +xrU +rPM +wAn +fjp +fjp +mnv +xNU +qAg +lsp +dzi +kMz +pyO +dzi +reQ +bQp +uZk +eCT +eCT +eCT +eCT +bLy +eCT +eCT +eCT +eCT +uZk +ujB +fZL +mCa +xtZ +mOT +hLo +ghy +ivz +vKD +vKD +vKD +pLL +bTR +eXd +izF +joK +egw +eXd +kjD +kjD +kjD +uVq +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(132,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jDr +vWu +iUb +pDS +etG +oQx +oQx +oQx +mqo +bbc +eeZ +oQx +oQx +oQx +oQx +oyd +efI +qbq +vjL +kWz +eqS +the +eoc +rFM +tyr +apW +xwF +wpU +wpU +skq +mOY +wpU +wpU +wZM +fNJ +rdy +xCK +iZh +pdI +fFF +opR +aOQ +dfK +kDD +kDD +fUD +cQG +hIF +tDp +cQG +cQG +tDp +cQG +cQG +tDp +cQG +iUT +uBI +kDD +uBI +rrq +uXv +xqr +nUB +wNG +wsQ +fkH +qFw +uXz +pOx +wGu +ovk +uQx +oxt +goK +aHN +mMj +avb +sUZ +avb +vXE +avb +cgu +phM +huB +pyp +afn +pgF +qar +clA +aIp +wEE +fCg +aVT +xwb +gdA +jYn +aIp +ift +hIg +lRQ +hIg +hIg +hIg +lRQ +qCe +dqe +mDo +mDo +mDo +mDo +wZP +mDo +mDo +mDo +mDo +mDo +mDo +mDo +mDo +mDo +wZP +mDo +vqD +fGa +qDk +vok +qTN +uZk +eCT +xvL +xvL +xvL +xvL +xvL +xvL +xvL +eCT +uZk +oOr +qym +aoP +oHh +gGW +pMy +dxJ +ivz +vKD +vKD +vKD +eXd +bTR +eXd +wYf +wYf +kfs +eXd +kjD +kjD +kjD +uVq +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(133,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jDr +rAN +kjU +aMq +xgU +oQx +oQx +oQx +mpB +wZI +yfP +oQx +nXf +oQx +oQx +mOO +mWa +mpB +uTR +mpu +fTY +cUL +bUY +pRR +otg +wid +cUL +jiD +jiD +jiD +jiD +jiD +jiD +cUL +aLB +eKP +dbV +pYP +oWn +wFm +nnu +sDI +dfK +kDD +tKl +kDD +kDD +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +pDH +uBI +uBI +rrq +dpg +nXw +hol +pWn +dyP +kDz +uWi +wFe +iLa +bTE +sQM +cWd +msa +sZm +xeF +lES +mMY +dKM +mMY +iuq +oCb +aPK +wbH +lqY +rwg +qQU +rag +gGZ +bXT +aIp +azB +mnO +pDo +pDo +pDo +dXb +aIp +hup +jUd +uZk +eCT +eCT +eCT +uZk +oyH +prf +yad +czG +iWG +lYh +uml +jeN +jeN +jeN +jeN +jeN +jeN +jeN +jeN +jeN +uml +lYh +xIJ +jeN +eAV +grL +mjC +uZk +uZk +xvL +efn +rlN +ewr +hsp +mcM +xvL +uZk +hoj +qfQ +dgM +aoP +uJE +gGW +pNb +ivz +ivz +ivz +ivz +ivz +eXd +fHr +eXd +eXd +eXd +eXd +eXd +uVq +uhb +uVq +uVq +uVq +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(134,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jDr +rNQ +kjU +qQF +xgU +oQx +oQx +oQx +pIf +pLE +sZP +sCn +qQJ +nRE +rVA +dxn +rtT +mpB +msM +gsV +tpM +cUL +qfM +afq +oRb +ruz +cUL +kDD +pTm +kDD +kDD +pTm +kDD +slM +oJO +oJO +svy +slM +xCJ +usO +nnu +eMm +ubY +nOS +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +qbh +kDD +uBI +rrq +cmC +kEC +lvc +fAO +dyP +fuX +uWi +uWi +uWi +xob +xob +fRH +xob +xob +xob +ubi +xob +euk +euk +tIv +euk +euk +euk +euk +xob +sFj +aoY +pMx +srX +asv +qen +mLg +kGr +kGr +kGr +mLg +asv +xHi +oiR +oiR +oiR +oiR +oiR +oiR +fTj +pIO +vlQ +erP +erP +erP +erP +rOn +rOn +dYp +rOn +rOn +rOn +dYp +rOn +rOn +tXM +tXM +tXM +iYM +fAC +wkz +pDt +dZA +jOj +aUG +qGy +hjg +aUK +oba +gVn +aUG +cpB +ijq +xYB +gUx +odt +scw +pUh +ifu +igx +qmc +pEs +eWG +kTR +gGp +iVC +uVq +kjD +kjD +uVq +kjD +kjD +kjD +kjD +irc +uVq +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(135,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +oUk +jnF +jmA +kDD +oQx +oQx +oQx +xRP +uTJ +gcq +dlt +qhv +vpa +dlt +wtS +llB +mpB +oQx +oQx +oQx +cUL +oMK +mOV +bww +kGR +cUL +kDD +vBi +lQo +kDD +vBi +kDD +slM +sez +eQy +aNa +slM +wZT +knc +uDX +ugF +dfK +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +qbh +kDD +uBI +rrq +bAw +hPZ +iTf +fAO +ktj +fnW +uWi +aqa +tDF +jAV +exQ +ePw +fyl +nOd +tfo +ttF +jWB +qGg +euk +rtm +cmz +iJh +dJP +euk +aHr +ibq +rMy +gri +rqR +pdZ +ldI +qwJ +pHM +lWg +gqD +swU +asv +xVp +kOQ +yaC +tur +arq +oiR +oiR +mqu +vbI +ccY +erP +sPs +fAl +sPs +efZ +glo +guv +eNw +eNw +eNw +guv +tWY +efZ +neR +efZ +neR +rOn +etC +njX +vwo +grL +hdd +hlW +tvZ +aCh +aCh +cnI +pEl +dqy +sOH +gUm +uuy +bat +pcD +uJE +eJA +wqU +yaa +fSB +loZ +fSB +dmC +lkr +gMU +uIm +bOM +nyr +uVq +kjD +kjD +kjD +kjD +kjD +uVq +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(136,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jDr +jnF +nRa +uBI +oQx +oQx +oQx +oQx +tTn +aVR +tZC +mpB +mpB +kqs +gZV +mpB +oQx +oQx +oQx +oQx +cUL +cUL +uDV +cUL +cUL +cUL +vlO +vlO +vlO +vlO +vlO +vlO +slM +uwb +akj +uwb +slM +slM +hgL +slM +slM +slM +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +uBI +pvQ +uBI +uBI +rrq +eSV +fNa +iTf +xGl +hte +mFy +dFE +bJU +nni +aEM +uPO +wIz +iTC +nOd +lUT +dfl +bBt +cbp +aFJ +heB +ydB +pas +tej +qSY +wud +ucR +oYP +vjc +bXT +asv +muP +fhK +hGy +vIk +vIk +wDE +asv +mcV +wCr +vrW +iUE +fWs +oiR +vsX +kGy +fAv +iRf +erP +mfw +qAB +neR +neR +neR +eUE +neR +neR +neR +eUE +neR +neR +neR +neR +sSm +rcL +fXU +jeN +xZR +usS +qWr +tea +keS +rWI +kLt +hmu +vGK +tea +anL +uWY +uuC +joi +guE +gLu +aAn +aAn +xng +soa +sXW +cun +mHB +scG +kTw +uVq +rDq +oYD +uVq +kjD +kjD +kjD +kjD +kjD +uVq +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(137,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jDr +jnF +xgU +kDD +oQx +oQx +oQx +oQx +oQx +rzH +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +cEB +cEB +vlO +mrZ +mrZ +mrZ +vlO +uHa +uHa +uHa +uHa +uHa +uHa +uHa +slM +aEE +lrW +sUM +slM +acv +lvp +rcg +acv +tGr +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +qbh +kDD +uBI +rrq +hPT +kxH +kEC +aOz +hZA +wfA +uWi +fwR +fLW +vkM +oFo +cNY +mIT +nOd +lUT +dfl +idJ +qGg +euk +xqx +tGN +nZy +xhG +euk +wud +nPP +oYP +bLS +cXj +asv +asv +tMF +lTh +lWg +pwS +oht +asv +xpK +rWb +kXR +xTs +ydf +iKU +aSP +pkt +oKL +fQo +erP +qAB +pHi +neR +neR +neR +neR +neR +neR +neR +neR +neR +neR +neR +neR +djs +tXM +tXM +tXM +lkd +uFc +mqm +xvL +tnz +aCh +aCh +cnI +lyi +xvL +xvL +xvL +xvL +xvL +xvL +xvL +xvL +urG +fEa +kfa +qCn +kfa +nTt +tui +tui +kfa +kfa +fvi +uVq +kjD +kjD +kjD +kjD +kjD +uVq +kDD +kDD +uBI +kDD +uBI +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(138,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jDr +jnF +vJn +kDD +kDD +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +vlO +vlO +vlO +vlO +vlO +vcg +vlO +vlO +vlO +vlO +vlO +vlO +vlO +vlO +vlO +slM +slM +slM +slM +slM +apa +xzF +eEA +ljd +tGr +tGr +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +qbh +kDD +uBI +rrq +rrq +xZg +xKY +sZJ +xBf +kXM +uWi +fNk +aIY +vih +ybD +cRJ +vgq +nOd +uvK +cFg +cFg +euk +euk +plB +tGN +dbH +eYO +rFE +wud +nPP +xRt +mjl +hkI +mwE +asv +wAk +khc +asv +asv +asv +asv +knp +oiR +tai +ckD +oiR +xdV +efR +tMk +jaL +iRf +erP +fAl +iTi +sPs +neR +neR +neR +neR +neR +neR +neR +neR +neR +neR +iTi +vYO +sFE +bDl +rOn +pEk +tjf +tfw +xvL +ljB +aCh +gTl +cnI +lyi +aCh +vZQ +dBs +cKl +lCC +xvL +xvL +xvL +qtE +ota +kfa +lCt +lUA +lgm +jey +mKi +uTX +kfa +fvi +uhb +kjD +kjD +kjD +kjD +kjD +uVq +kDD +kDD +uBI +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +omG +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(139,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jDr +fVu +cKu +vJn +kDD +kDD +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +vSg +lmn +ncx +dKG +vSg +mrZ +vSg +nnP +vSg +dKG +vSg +ncx +vSg +bjz +xgU +kDD +kDD +kDD +kcV +wyA +hEs +rjp +urx +vIX +bkg +kcV +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +bOU +uBI +pvQ +uBI +uBI +uBI +rrq +rrq +kGC +ojY +kGC +uWi +uWi +xDx +wta +wta +bSM +avw +hiP +nOd +tiE +oXK +qGg +euk +ptT +fWF +sox +vGd +lhP +ocX +fUH +bVY +wpv +fLr +tCR +ebR +orw +kAN +sTL +bGb +sMA +sVq +xYq +kzO +kDN +oGP +uhI +vnu +ljZ +cOX +nAv +dsw +mIw +erP +sPs +sPs +qAB +sPs +neR +rXT +rXT +neR +rXT +rXT +neR +neR +neR +neR +jdw +xPQ +nMq +rOn +afg +hqw +qed +xvL +vNQ +aCh +aCh +cnI +pLi +ekl +qSu +ncu +iSN +weg +xvL +pfl +xvL +wMy +gxI +kfa +ymi +nFk +xcS +jAi +mRb +eHn +kfa +fvi +uhb +kjD +kjD +kjD +kjD +kjD +uVq +kDD +kDD +uBI +kDD +uBI +kDD +kDD +uBI +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(140,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +oUk +ebI +cKu +vJn +kDD +kDD +kDD +uBI +kDD +kDD +eiW +kDD +uBI +kDD +kDD +kDD +jaA +hNR +jaA +jaA +oUk +iVX +jmA +jaA +jaA +jaA +jaA +jaA +jaA +jaA +kDD +kDD +kDD +kDD +ahz +xNR +nOZ +pmS +kwo +lwH +nPi +prg +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uJv +kDD +kDD +uBI +kDD +uiE +kkk +tZi +wwr +tBy +pez +ohA +wnM +wta +eWh +qdN +nMm +nOd +dfl +lUT +qGg +euk +klr +nQA +cXH +xWu +bqh +euk +wkL +aHr +tiV +iUh +dnU +ghO +sVD +kaQ +ltn +sjh +sjh +xSC +cRQ +hAC +tBc +gjI +oId +iRi +fpY +kow +tEy +jaL +rOY +erP +dgv +wPs +sPs +neR +neR +neR +neR +neR +neR +neR +neR +neR +neR +iTi +aGv +neR +eqE +rOn +xSz +hDc +lhZ +xvL +uyK +aCh +aFi +dwm +vWi +qzI +rrx +pCq +mGM +fQP +xvL +pfl +xvL +xDt +jRN +ixI +hqQ +xnv +inA +opb +sMl +hOn +kfa +fvi +uVq +kjD +kjD +kjD +kjD +kjD +uVq +uVq +uVq +uVq +uVq +uVq +uVq +kDD +uBI +uBI +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(141,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +oUk +ebI +cKu +vJn +dJH +dJH +pWI +dJH +dJH +dJH +dJH +pWI +dJH +kDD +kDD +kDD +uBI +kDD +kDD +jDr +iVX +xgU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +tKm +wyA +mFT +kMS +dBW +qBu +bkg +tZy +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uJv +kDD +kDD +uBI +uBI +aeR +mzc +qZl +fvE +tBy +bOy +iKA +pfS +tBy +tBy +nOd +nOd +nOd +vfQ +lUT +idJ +euk +kaP +dmW +vkc +ngn +dex +euk +aHr +aHr +tJX +jSn +cTL +cTL +bFi +uSU +wmp +cSL +qKf +jLz +cSL +ykh +sej +qUq +hJi +eQL +mDG +hBj +lJp +nWf +vzq +erP +sPs +qAB +sPs +neR +neR +rXT +rXT +neR +rXT +rXT +neR +neR +neR +neR +ugj +xPQ +oNf +rOn +afg +hDc +ruJ +xvL +uyK +aCh +vZx +oHv +wbl +aCh +lhH +dBs +bgM +dBs +fVV +fVV +kPv +xRi +mox +kfa +qqf +oOR +tez +cSf +sMl +lio +kfa +fvi +uVq +kjD +kjD +kjD +kjD +kjD +uVq +kjD +kjD +kjD +kjD +fBh +uVq +kDD +uBI +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(142,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +oUk +ebI +bYm +bYm +bYm +bYm +bYm +bYm +bYm +hAE +bYm +cKu +vJn +dJH +dJH +pWI +dJH +dJH +jsj +iVX +xgU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +tGr +tGr +aEW +bBe +deM +ueq +tGr +tGr +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hJo +kDD +kDD +uBI +kDD +uiE +jEs +xWd +oRR +tBy +azy +tWj +tcd +pzG +tBy +mwe +hYu +cFg +cFg +lUT +cFg +euk +euk +euk +euk +euk +euk +euk +qGg +cFg +jve +wmG +xQV +aKt +uqc +mQv +ban +mQv +mQv +mQv +mtY +wTn +tiV +ewa +ewa +tiV +fAD +dHW +gJa +jaL +qnU +erP +fAl +iTi +neR +neR +neR +neR +neR +neR +neR +neR +neR +neR +neR +iTi +xXM +hUF +kDX +rOn +pEk +weV +sHD +xvL +uyK +aCh +tyZ +kpl +mqL +aCh +ucF +dBs +dBs +dBs +fVV +fVV +idd +qag +oBZ +kfa +eIs +oOR +lZV +udp +wLH +laD +kfa +fvi +uVq +kjD +kjD +kjD +kjD +kjD +uVq +kjD +kjD +kjD +kjD +kjD +uVq +uVq +uVq +uVq +uVq +uVq +kDD +uBI +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(143,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jaA +jaA +jaA +jaA +jaA +jaA +jaA +jaA +jaA +oUk +ebI +bYm +bYm +bYm +bYm +bYm +bYm +bYm +bjz +xgU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +tGr +tGr +tZy +tZy +tGr +tGr +kDD +kDD +kDD +kDD +kDD +bOU +kDD +kDD +kDD +bOU +kDD +kDD +kDD +kDD +kDD +fFz +cQG +oCO +cQG +aQk +lWJ +fmc +gwl +tBy +oym +fkv +qmV +mxR +tBy +pkR +xVX +wZg +cbp +nKS +jLi +jLi +jLi +jLi +jLi +jLi +jLi +jLi +poN +oXK +jve +iSo +ucB +jZs +uqc +hEW +afE +cmp +aAo +pQW +mtY +pQs +qmp +qmp +mPE +vmm +tiV +hhV +lFl +roF +xWl +erP +pHi +sPs +sPs +neR +neR +neR +neR +neR +neR +neR +neR +neR +neR +neR +nyz +tXM +tXM +tXM +lkd +uFc +mqm +xvL +uyK +phr +phr +dtx +lUa +gVn +umn +egq +wzy +hIS +uVq +aBx +uVq +qag +mox +cpq +jey +ucq +dTN +gKM +sMl +nGe +kfa +fvi +uVq +kjD +kjD +kjD +kjD +kjD +uVq +kjD +kjD +kjD +kjD +kjD +uVq +kvK +lIt +ebb +kjD +uVq +kDD +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(144,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jaA +jaA +jaA +jaA +jaA +jaA +jaA +jaA +jaA +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +aeR +mLy +mLy +neG +tBy +vQK +ryk +psc +tBy +tBy +jve +jve +jve +bOg +jve +jve +jve +jve +jve +jve +cFg +cFg +cFg +cFg +lUT +jve +eRd +oiN +vZD +nhu +qln +oFt +rqe +tzq +cQr +mtY +hZl +hZl +raW +hZl +uVP +tiV +eKS +mdE +fAv +qnU +erP +fAl +pHi +sPs +neR +neR +eUE +neR +neR +neR +eUE +neR +neR +neR +neR +efZ +rOn +xwh +tpP +jQE +qQw +mqm +nnY +wbC +aWo +pPr +xvL +aUc +aaC +lZH +fFV +dBs +ckH +uVq +kjD +ivz +qag +mox +lsq +jey +ucq +nas +bwx +sMl +txh +kfa +fvi +uVq +uVq +uVq +uhb +uVq +uVq +uVq +uVq +uVq +uhb +uVq +uVq +uVq +dqT +vPD +uVq +uVq +uVq +kDD +uBI +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(145,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +bOU +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +scA +kDD +kDD +kDD +scA +kDD +kDD +kDD +mLy +rle +fVz +tBy +tBy +tBy +tBy +tBy +kDD +qFN +kDD +uBI +kDD +uBI +kDD +bRh +qFN +kDD +jve +qGg +qGg +odN +cFg +lUT +jve +agc +ske +nbe +uqc +iqU +dhi +atT +nVQ +hJS +mtY +drj +jTm +ksk +iKW +drj +tiV +mqm +hJa +wDD +dWg +erP +pHi +fAl +sPs +efZ +mLH +wCR +bbF +bbF +bbF +wCR +ogO +efZ +neR +efZ +neR +rOn +btB +uDt +dCa +sOe +mqm +xvL +xvL +xvL +xvL +xvL +xvL +kGd +xvL +hRy +dBs +clc +uVq +kjD +ivz +bdA +gOB +yka +jey +sEL +qos +whD +jey +eHn +kfa +fJA +hTM +lIt +lIt +lIt +lIt +lIt +lIt +lIt +lIt +lIt +ebb +kjD +kjD +kjD +kjD +kjD +uVq +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(146,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +rtz +rtz +rtz +rtz +rtz +kDD +kDD +kDD +bOU +rtz +eKV +rtz +rtz +rtz +eKV +rtz +bOU +mQv +kDD +kDD +kDD +mQv +kDD +kDD +kDD +mLy +mLy +neG +mLy +gIb +pVZ +djF +mLy +kDD +kDD +oLd +oLd +oLd +oLd +oLd +kDD +kDD +kDD +jve +qGg +qGg +qGg +kPy +lUT +jve +bck +gmL +plN +uqc +uqc +uqc +uqc +uqc +uqc +mtY +ewa +tiV +tiV +tiV +ewa +tiV +mqm +uUD +bWs +xpd +erP +erP +erP +erP +rOn +rOn +pde +rOn +rOn +rOn +pde +rOn +rOn +tXM +tXM +tXM +tXM +kGt +qGU +lxF +xiN +iTE +oQy +oQy +oLp +ize +kYP +uVq +oYB +uVq +uVq +uVq +uVq +uVq +kjD +ivz +jYQ +uxu +xgW +hYQ +tlo +sRX +cmR +uDF +bpJ +kfa +uVq +vEK +uVq +uVq +uVq +uVq +uVq +uVq +uVq +uVq +vAJ +vAJ +vAJ +vAJ +vAJ +vAJ +svV +uVq +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(147,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +kDD +kDD +bOU +kDD +uBI +kDD +uBI +kDD +lzo +rtz +bOU +mQv +kDD +kDD +kDD +mQv +kDD +kDD +kDD +mLy +mLy +ejW +pYT +dNA +pLh +qAb +mLy +kDD +oLd +oLd +kai +czL +hQS +oLd +oLd +uBI +uBI +jve +qGg +qGg +qGg +cFg +tiE +pbD +wqQ +hWK +icx +wBl +dnX +ezW +mSn +ufB +eCV +vSY +gpf +hmH +rKC +nzJ +gpf +eRv +mqm +lvv +tns +bPl +tpP +dFr +wQX +czh +tpP +tpP +tpP +tpP +wOr +tpP +tpP +tpP +tpP +czh +wQX +tpP +tpP +xTq +spD +bXS +uVq +uVq +jBt +jBt +axu +naI +kYP +uVq +oYB +kjD +kjD +uVq +kjD +uVq +kjD +ivz +qag +nMl +kfa +kfa +kfa +kfa +wen +kfa +kfa +kfa +uVq +vEK +uVq +ikP +bTK +gGn +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +vAJ +qGf +uVq +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(148,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +qRx +qRx +qRx +qRx +qRx +kDD +rtz +bOU +mQv +kDD +vQw +kDD +uqc +uqc +uqc +uqc +mLy +kWt +sBx +jla +tmS +pON +tNi +mLy +uBI +oLd +lrs +fgU +kng +cpA +hHG +oLd +frU +kDD +hpq +hpq +hpq +hpq +hpq +hpq +hpq +hQy +aKZ +tHG +ovB +adz +eFp +vmo +hnH +mDD +oJS +dib +hZe +dsL +dsL +cVY +lFD +mqm +oLa +hVX +qMN +mtK +qNQ +eIN +ppq +pAi +pAi +pAi +pAi +rYC +pAi +pAi +pAi +pAi +ppq +pAi +pAi +pAi +qII +xGE +bCH +uVq +shX +shX +shX +axu +qCB +kYP +uVq +oYB +kjD +kjD +uVq +bqR +uVq +kjD +ivz +djX +jgk +aHD +oRo +tTX +nvN +mmb +wWn +aYW +tTX +kjD +vEK +uVq +fSM +dxM +gGn +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +vAJ +kjD +mQB +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(149,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +qRx +jjY +nSb +dZi +qRx +omG +ffa +qfw +uqc +uqc +wZv +uqc +uqc +kvE +vWR +rFo +mLy +tLz +pvl +fak +fak +ivy +mfO +mLy +kDD +oLd +sYT +mEG +fIT +lhW +mSP +oLd +qRa +qRa +hpq +clQ +jNm +hat +fcl +cLN +hpq +wBM +uYC +lKb +wBl +hHD +roY +kcQ +mNE +eCV +dgF +hNq +vHy +teM +teM +mEA +stg +mqm +mqm +aRE +lLv +wUB +rkn +dAQ +gWi +rXw +wni +tFD +wni +gul +sxy +wni +kpq +pYM +sTT +qPI +wni +bUh +wni +hPh +jhY +jhY +jhY +jhY +jhY +uhM +qCB +kYP +uVq +ebC +pwl +pwl +drm +rCD +kjD +kjD +ivz +hFs +aLJ +aLJ +nMl +tTX +iWw +aDL +oBB +inT +tTX +tTX +jqb +uVq +qkh +nTC +gGn +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +vAJ +kjD +mQB +kDD +kDD +uBI +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(150,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +kDD +bOU +bOU +bOU +qRx +hBm +jcV +qOm +ibE +kDD +oUE +vtT +fcv +pUk +duY +xhB +uqc +uLC +sTl +cMW +mLy +mLy +iZT +iZT +agq +iZT +iZT +mLy +kDD +oLd +dsX +eAP +mUn +lpb +kce +iqH +fHS +fHS +ndK +fYT +igo +aVa +flo +qkm +eoG +gNV +aLi +mYi +mQv +mQv +mQv +mQv +mQv +uqc +nbb +mon +koN +vxU +ttP +tiI +hND +eRv +mqm +gOD +nFx +cUq +wPj +gRm +wHV +wHV +btY +bJD +fYa +rjh +wvo +btY +wHV +wHV +wHV +wHV +mqm +mqm +jhY +jhY +jhY +loD +xrE +knT +jhY +uhM +pYb +kYP +uVq +uVq +uVq +uVq +uVq +oYB +uVq +uVq +ivz +qag +wnp +vCs +maQ +kVk +wNt +xBz +oBB +qPG +oaS +lyN +fjF +uVq +rgq +iHc +gGn +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +vAJ +pzK +uVq +uBI +uBI +uBI +uBI +kDD +kDD +kDD +rtz +rtz +rtz +rtz +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(151,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +rtz +uBI +uBI +bOU +uBI +uBI +qRx +jjY +lWD +dZi +qRx +kDD +tII +nQe +oOM +dfR +oQq +eoT +taU +cEJ +lTB +qlw +tfz +mLy +bNB +bNB +bNB +bNB +bNB +mLy +kDD +oLd +yjv +mEG +wTi +fZP +nxn +oLd +aiX +aiX +hpq +xif +xis +ktc +rrf +bJb +dyd +iAI +mTb +pJE +wBl +dnX +uJZ +mSn +ufB +eCV +dgF +xsR +vce +cae +gvX +gvX +nei +ayL +umz +aYS +wOc +mtc +qOR +iQu +btY +hze +fmj +var +jUp +kOE +rLh +mYG +wHV +qXX +qJx +wHV +lSY +ofu +amK +fgg +wAy +dPA +awN +bMv +jhY +eSs +bnI +fTn +wFJ +lIt +lIt +iuC +lIt +goL +mNp +rjP +lKs +qag +aLJ +bem +aYf +tTX +ewj +ipi +vIA +qPG +weH +xYR +jqb +uVq +kXe +iHc +qFk +oRM +oRM +oRM +oRM +vdP +oRM +oRM +oRM +kuG +vAJ +doT +mQB +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(152,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +kDD +bOU +uBI +qRx +qRx +nxs +ajb +nxs +qRx +qRx +qRx +qRx +uqc +lJd +ahZ +iWp +lSV +uLC +nXY +fIb +iVt +mLy +bNB +jla +jla +jla +bNB +mLy +uBI +oLd +mTd +iNO +bOw +bAZ +ugw +oLd +frU +kDD +hpq +jlc +qBy +pWi +xKq +cyL +hpq +uCG +bUp +eoi +uVs +fXh +baO +juS +bzf +eCV +dgF +rJX +jTB +oSK +tUc +tUc +jbz +liO +liO +mQF +mTP +liO +pDL +pgE +wHV +tUb +rQD +mOy +xcl +ilL +xeN +rrm +rsI +wiM +dLh +gbU +rRf +mWe +idt +gId +szq +gbF +jfo +ruo +jhY +kzL +qCB +mTk +uVq +uVq +nin +uVq +pIp +kjD +uVq +wRo +ivz +kaW +dtj +eLz +aYf +tTX +xux +uBE +qKu +kGP +eLg +tTX +vEK +uVq +gZg +iHc +gGn +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +vAJ +doT +mQB +kDD +kDD +uBI +kDD +rtz +rtz +rtz +rtz +rtz +kDD +rtz +rtz +rtz +rtz +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(153,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +kDD +bOU +kDD +qRx +unj +uvm +qFa +xTt +hVv +izh +igR +qRx +qRx +qRx +qRx +qRx +uqc +hXg +fjx +lqA +kVU +mLy +bNB +jla +bNB +olQ +ybu +mLy +kDD +oLd +oLd +qai +tUZ +sEa +oLd +oLd +uBI +uBI +hpq +bLX +cIz +lVA +xbj +cKt +hDC +lTL +mTb +uGd +wBl +szx +roY +kcQ +mNE +eCV +dgF +xsR +tUc +iyH +kGg +tUc +tUc +jbz +waI +oua +qaK +vxB +fsT +oqh +btY +unX +rQD +vbQ +wHV +qjr +xeN +rrm +hfK +cWb +lQx +eTz +xbr +tcU +pHu +axG +xMl +aBP +fPg +hTi +jhY +uhM +sOZ +mTk +uVq +rhx +kjD +uVq +uVq +uVq +uVq +wRo +ivz +ivz +ivz +ivz +ivz +tTX +tTX +tTX +cFe +tTX +gIF +tTX +vEK +uVq +cGX +iHc +gGn +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +vAJ +doT +uVq +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +uBI +kDD +uBI +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(154,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +rtz +uBI +uBI +bOU +uBI +etP +sBe +jpX +dsF +bKY +bKY +bKY +bKY +qRx +oJl +gZZ +pPA +cKH +uqc +diK +xpQ +koI +gXy +mLy +bNB +jla +jla +jla +bNB +mLy +kDD +kDD +oLd +oLd +oLd +oLd +oLd +kDD +kDD +kDD +hpq +bFv +wDF +jiK +kGV +bMF +hDC +nAL +sLf +uQM +mQv +mQv +mQv +mQv +mQv +uqc +jgW +uSS +tUc +iyH +oGc +mzO +tUc +oSK +oSK +tUc +lKv +liO +bfe +wHV +wHV +tgo +rQD +fxm +gbU +pdk +xeN +rrm +fUy +fCn +xKg +wHV +mku +mWe +idt +vns +aDA +mAL +kzJ +upm +jhY +kyZ +juT +kYP +uVq +kjD +bqR +uVq +kjD +kjD +kjD +vpU +lIt +qoW +kjD +kjD +uVq +kjD +kjD +kjD +kjD +fBh +uVq +kjD +vCe +uPC +aME +dYy +gGn +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +vAJ +dQK +mQB +uBI +uBI +uBI +uBI +odG +lLb +dpb +kDD +odG +lLb +dpb +kDD +odG +lLb +dpb +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(155,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +kDD +kDD +kDD +bOU +uBI +etP +iGc +ggk +jiE +glH +hmx +dDZ +sXT +kzk +dMK +qNx +dBA +nrf +dfd +qxk +tCJ +fzr +rYV +mLy +bNB +bNB +bNB +bNB +bNB +mLy +kDD +cIX +kDD +uBI +kDD +uBI +kDD +kDD +piL +kDD +hpq +lkH +hpg +bJB +sFc +fss +hpq +ewm +vTV +pJE +wBl +dnX +fVj +mSn +ufB +eCV +dgF +xsR +tUc +iyH +iyH +iyH +iyH +iyH +evG +jTB +lKv +liO +lsz +wHV +qfz +txO +rXg +fxm +wHV +bdg +xeN +vdd +wHV +pju +xHy +wHV +mTN +mWe +amK +imL +aQO +fKQ +qaM +cyj +ogb +kyZ +qCB +iZv +uVq +kxt +kxt +uVq +kjD +kjD +kjD +oYB +kjD +kjD +iZv +bnm +uVq +kjD +kjD +kjD +kjD +kjD +lul +kjD +vEK +uVq +tjU +lQm +gGn +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +oRM +vAJ +doT +mQB +kDD +kDD +uBI +kDD +odG +dvq +dpb +kDD +odG +dvq +dpb +kDD +odG +dvq +dpb +kDD +kDD +kDD +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(156,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hoK +kDD +kDD +kDD +kDD +bOU +kDD +qRx +vYg +ggk +jiE +vTC +kSu +jQa +dGu +qRx +djm +fLu +fpf +mUP +uqc +aYs +vic +gNa +uqc +mLy +mLy +mLy +mLy +mLy +mLy +mLy +uqc +uqc +uqc +uqc +uqc +uqc +uqc +uqc +uqc +uqc +hpq +hpq +alm +yda +hpq +wQK +hpq +qSq +kqf +eoi +gCG +fXh +baO +juS +bzf +eCV +dgF +xsR +tUc +iyH +iyH +gcT +iyH +iyH +wKw +jTB +nOu +psv +esR +wHV +gZJ +rQD +rQD +cfv +svB +mbC +aiK +nEr +vQj +rRi +wjf +amx +xIu +mWe +jhY +amK +bcZ +mcl +bcZ +jhY +jhY +kyZ +lzp +kaK +uVq +kjD +bqR +uVq +kjD +kjD +kjD +oYB +skI +kjD +kjD +sdP +uVq +kjD +kjD +kjD +kjD +kjD +uVq +kjD +vEK +uVq +fWi +bXl +vAJ +vAJ +vAJ +vAJ +vAJ +vAJ +vAJ +vAJ +vAJ +vAJ +vAJ +doT +uVq +kDD +kDD +uBI +kDD +odG +dvq +dpb +kDD +odG +dvq +dpb +kDD +odG +dvq +dpb +uBI +uBI +uBI +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(157,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +rtz +uBI +uBI +uBI +uBI +bOU +eyR +qRx +uvF +wJI +jMx +nru +bOB +jQa +eig +qRx +qRx +qRx +qRx +qRx +uqc +iRe +cAc +ugL +edw +uqc +djt +hnT +hTX +uqc +rFv +mXQ +euy +cdK +jEO +qAG +feP +aoj +jya +hlw +rCy +onN +ruQ +bvq +btQ +aoj +iJB +pqg +jya +tFP +lDp +lDB +wBl +pCn +roY +kcQ +mNE +eCV +dgF +xsR +jTB +lXg +vIh +sMx +ilg +jbf +tKK +jTB +lKv +liO +tVd +wHV +oVE +dIE +icd +qMF +rre +asz +rCO +kco +pZT +nVy +ixN +lgZ +lgZ +eoU +bVb +wbG +hla +bbm +omp +fhU +bVb +vPJ +wtW +uIT +uVq +nin +uVq +uVq +uVq +uVq +uVq +oYB +uVq +ddy +siv +ddy +uVq +uVq +uVq +iJF +uVq +uVq +uVq +kjD +vEK +uVq +kjD +kjD +kjD +uVq +bHV +tyb +tyb +tyb +tyb +tyb +tyb +kIo +lIt +qoW +uVq +kDD +kDD +uBI +kDD +odG +dvq +dpb +kDD +odG +dvq +dpb +kDD +odG +dvq +dpb +kDD +uBI +kDD +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(158,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +kDD +kDD +kDD +bOU +kDD +qRx +jUY +hRA +xpC +oQp +kuR +jfh +oSR +qRx +oJl +uAV +pPA +cKH +uqc +jxS +tUO +pgp +gxx +ugs +pQt +lfB +kDI +uqc +mht +auO +rzm +cZL +ipu +rAj +poy +rzm +emO +rzm +bfc +qJs +uxv +udM +tmV +mQy +eBi +nKA +emO +bdh +mXc +pPU +mQv +mQv +mQv +mQv +uqc +pHv +dDX +szh +jTB +jTB +tUc +tUc +tUc +wbi +jTB +jTB +lKv +liO +rkg +wHV +wHV +iqn +gmv +bAr +dIE +hiM +fMj +sNj +oIm +hpw +dRg +dRg +kjX +rFf +fns +eBf +kfH +rmQ +sZM +vjK +bVb +doT +idH +kjD +kjD +kGw +kYP +eap +suH +vIK +ivv +oYB +kjD +kjD +kjD +kjD +kjD +lTu +kjD +kjD +kjD +iZv +kjD +kjD +vEK +eap +kjD +vvp +kjD +uVq +qAu +uVq +uVq +uVq +uVq +uVq +uVq +ont +uVq +uVq +uVq +uBI +uBI +uBI +uBI +odG +dvq +dpb +kDD +odG +dvq +dpb +kDD +odG +dvq +dpb +kDD +uBI +uBI +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(159,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +kDD +kDD +kDD +bOU +uBI +etP +tdF +saa +ruf +qYJ +sIJ +mVU +quv +izg +bed +rQI +osQ +bed +uvX +cLu +mzJ +tWD +mTT +uqc +ryd +hGc +fKR +uqc +dVN +fxu +uqc +riD +qpv +uqc +uqc +uqc +wpH +wpH +rNo +qBn +qrz +wpH +wpH +rPo +uqc +uqc +uqc +hqO +qiN +krF +qBd +ebE +dCE +mhF +fPG +puq +lTq +hBq +lfT +amp +rrX +rrX +rrX +cxA +ioC +rho +lEV +liO +rpS +mQn +uWv +uWv +ojS +lER +log +bBv +sXL +uWv +oIm +eki +ijf +ijf +eik +cpi +bVb +wbG +tEn +hgD +qTz +xjA +bVb +doT +wWm +jLW +mNp +mNp +tRR +mxY +biS +nDX +mcD +iEM +dLP +mNp +mNp +mNp +mNp +mNp +mNp +mNp +mNp +kaH +mNp +mNp +npp +nwT +tyb +tyb +tyb +eTC +ezB +uVq +kDD +kDD +kDD +uBI +ixg +lNM +ckl +eWl +cYF +ioZ +ixg +uBI +kDD +kDD +jrO +kDD +kDD +kDD +jrO +kDD +kDD +kDD +jrO +kDD +kDD +uBI +kDD +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(160,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +rtz +uBI +uBI +bOU +uBI +etP +vwS +ggk +bIX +iUg +oND +ggk +gFm +qRx +nSq +fLu +fpf +mUP +uqc +ugL +qdD +uqc +uqc +uqc +uqc +uqc +uqc +uqc +gcS +bZK +uqc +aLi +tbx +xjr +xjr +uqc +fPr +ujd +gmO +sZT +nRU +klD +uiY +rPo +mPi +hEV +qfE +blt +xMk +ctv +hSi +sOs +jZs +jZs +noY +rAE +okJ +mVO +sjU +iSC +liO +liO +liO +liO +liO +sjU +rTS +oZN +liO +wJn +uWv +elM +wnE +nsd +sNV +fuJ +hIf +bou +oIm +uBN +fJa +jyD +qpN +qpN +qpN +gEf +qpN +jQN +xgE +xbK +sEF +hlu +aTw +fUo +wOG +lIt +lIt +ryW +sfx +kbP +kvN +qCD +iBQ +juZ +kvN +wZq +utk +aMY +xxX +wZq +wZq +wZq +mkl +tyb +ezB +kjD +kjD +kjD +kjD +uVq +kjD +uVq +kDD +kDD +kDD +uBI +ixg +iqW +rmD +fco +icY +aMU +icY +smR +smR +mRj +tBP +tBP +tBP +tBP +tBP +tBP +tBP +tBP +tBP +qxv +smR +kEq +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(161,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +kDD +bOU +kDD +qRx +lmb +pDI +pdR +pyS +txr +pdR +wXQ +qRx +qRx +qRx +qRx +qRx +uqc +hGx +dxj +uqc +xmG +drq +jkZ +xrV +uuG +uqc +sAR +vJB +uqc +haD +wbT +xjr +xjr +uqc +mSv +faV +hLi +gob +qPL +nzi +gnd +rPo +bSa +kSN +rVf +eNM +nEm +bkL +bkL +mko +mko +mko +mko +uIY +hUi +wKp +wmM +nnV +vxN +awM +qaD +msJ +vxN +ocY +vgQ +vxN +lVj +rcO +uWv +iZQ +lhF +oln +okk +omO +nWe +ylv +oIm +pcm +fio +ain +qpN +hNe +tfp +bxQ +qpN +gEf +qpN +qpN +uVq +uVq +uVq +uVq +cCa +uVq +uVq +uVq +uVq +moX +uVq +uVq +uVq +uVq +uVq +uVq +uVq +uVq +uVq +kjD +ivv +kjD +qAu +sVk +uVq +uVq +uVq +uVq +uVq +uVq +uUh +uVq +uVq +uVq +uVq +uVq +ixg +ekX +bQv +ihG +shs +iJc +ixg +kDD +kDD +kDD +oXi +kDD +kDD +kDD +oXi +kDD +kDD +kDD +oXi +kDD +kDD +uBI +kDD +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(162,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +kDD +bOU +uBI +qRx +qRx +qRx +vmG +qRx +qRx +aaW +qRx +qRx +kDD +mQv +qPR +oVb +uqc +ugL +pqu +uqc +agW +tSl +jkZ +xsL +lzF +pim +dgm +vJB +rPo +rPo +rPo +rPo +rPo +rPo +rdJ +faV +oOb +udF +lXs +uyC +kbj +hTO +bSa +kSN +rVf +kqH +mjR +lQn +gho +mko +bSa +tTG +hUi +jQj +hUi +jYd +jYd +jYd +hsB +hsB +tkP +hsB +hsB +hsB +cqF +gDU +geq +vHy +uWv +buD +tzh +tmD +kjc +eip +rZh +lFk +rzT +neJ +xBW +mWe +qpN +raq +fNN +xiz +erh +dyV +quO +qpN +kjD +uVq +kjD +kjD +doT +kjD +fBh +uVq +iZv +kjD +uVq +tiU +jBt +jBt +kFf +dpG +kIU +aOW +kjD +kjD +xcQ +gnI +gDq +dah +kjD +uVq +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +ygU +ixg +dXm +fSx +pZD +ixg +kDD +uBI +kDD +kDD +odG +kbq +dpb +kDD +odG +bjE +dpb +kDD +odG +bjE +dpb +kDD +uBI +uBI +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(163,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +rtz +uBI +uBI +bOU +uBI +uBI +qRx +nyP +joE +vRm +qRx +wFL +qRx +uBI +uBI +tII +aCF +qYZ +uGa +ara +aDT +uqc +wMi +ufk +jkZ +xIw +jux +uqc +pOf +oZO +wpH +jNq +qLD +cAE +rBj +wpH +ipk +xiV +ipo +iWX +mcj +nwo +fkl +mko +hUi +kSN +rVf +lQJ +shl +dhj +rGs +mko +twB +hUi +hUi +jQj +hUi +uuW +esm +fIE +iBE +kDQ +uCy +khw +mrv +rNz +akc +ltR +pWQ +oJv +uWv +aFk +iDa +xIr +uWv +gDb +cnA +boP +rvB +lGb +aNf +bBi +osB +fdn +cdq +mEd +dhZ +pfK +yjL +qpN +kvK +ljc +lIt +lIt +qoW +kjD +kjD +uhb +kjD +kjD +uVq +oMm +jBt +xEg +oLE +dpG +jBt +ucd +kjD +rTc +rTc +rTc +tfh +doT +tZk +uVq +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +ixg +ixg +iST +iST +ixg +uBI +uBI +uBI +uBI +odG +bjE +dpb +kDD +odG +bjE +dpb +kDD +odG +bjE +dpb +kDD +uBI +kDD +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(164,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +kDD +kDD +bOU +bOU +bOU +qRx +nyP +wHF +vRm +qRx +cBf +qRx +kDD +kDD +tII +eEb +hAh +tUP +abe +vAI +uqc +pni +uqc +uqc +uqc +uqc +uqc +iTJ +cvi +kUj +oBO +lvu +lvu +rfr +wZp +fbL +jGL +aWh +aXs +sKC +cMm +bEA +mko +aEH +kSN +rVf +vxx +bBs +dhj +wKx +mko +bSa +fhL +hfg +gnb +hUi +lHi +scz +tZA +iBE +jNy +aak +vFp +hfh +jFG +dqP +pVF +olB +ecY +uWv +kHh +lzg +erE +pZe +twN +sWM +tjo +djo +qEh +qrR +dYa +gEf +eeb +xUo +rnp +xUo +xUo +jkP +qpN +doT +uVq +kjD +kjD +kjD +kjD +kjD +uVq +oqm +kjD +uVq +oMm +kjD +vDm +nmj +uVq +cKq +uGV +kjD +pnr +pnr +pnr +aBe +doT +xiX +uVq +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +mQB +kDD +uBI +kDD +kDD +kDD +uBI +bRh +kDD +odG +bjE +dpb +kDD +odG +bjE +dpb +kDD +odG +bjE +dpb +uBI +uBI +uBI +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(165,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +qRx +ejM +hKH +vRm +qRx +uqc +uqc +mQv +mQv +mQv +syn +mza +uqc +caZ +rou +eFC +lwO +wCA +dHC +kiP +bcM +pxx +gfx +lYQ +wUc +jOI +kXY +gpU +ubb +bPk +naP +fLH +aEw +lgs +bvh +srj +mvt +mko +iyg +cHj +rVf +vNt +dmq +dhj +hPX +mko +hUi +jQj +hUi +hUi +hUi +tJO +hzj +qTY +iBE +mjF +hfG +dmg +gSE +eaM +dqP +pZj +vLO +rlF +uWv +lAI +fOu +gvr +uWv +ojS +iWK +log +oIm +gAP +qgh +svI +kNz +tnc +mij +goZ +vxL +qBZ +nUu +jrV +gTr +lGV +lGV +lGV +lGV +lGV +lGV +lGV +lGV +lGV +lGV +mVy +eiD +kjD +aic +lpC +rOS +riN +kjD +cCA +pnr +pnr +asJ +doT +kjD +uVq +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +mQB +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +odG +bjE +dpb +kDD +odG +bjE +dpb +kDD +odG +bjE +dpb +kDD +kDD +kDD +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(166,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +qRx +qRx +uqc +uqc +uqc +ilB +iYh +mQv +wRJ +nNE +hBZ +pbB +uqc +ame +iwB +fEN +mnD +mQo +tnP +tnP +gxJ +dUT +hTr +cri +wpH +dVk +eSf +qpK +uNa +wpH +nkx +soR +dxf +pEm +nNe +wQx +tih +mko +bSa +dbm +rVf +smU +jhK +djO +aIo +mko +aOO +jQj +gGe +hAF +hUi +eBy +ufF +vbT +hsB +sJE +hfG +iSP +uPi +hsB +jhu +ddd +hVe +oBQ +uWv +vvP +fOu +prW +dDM +ygZ +fNl +tMS +oIm +xDV +xPm +lgJ +qpN +irX +izK +sdv +fHE +nIB +jMK +qpN +bMl +aVy +wAR +axI +qxS +lGV +tWA +qwA +otV +wiL +lGV +eNX +nhb +xEg +kjD +uVq +gTp +qDF +mNp +tfJ +tfJ +aEL +ivG +doT +kjD +lul +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +mQB +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +odG +dLu +dpb +kDD +odG +sbI +dpb +kDD +odG +sbI +dpb +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(167,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +viH +uBI +uqc +woz +noz +xkC +xkC +mQv +ffn +hBZ +cde +uwS +uqc +qAm +sGh +gPe +uqc +anh +anh +tgI +jXK +rBb +anh +anh +rPo +rPo +aFw +aFw +rPo +rPo +hlf +aQF +bSL +ydA +gdC +eIy +hlf +mko +hUi +dbm +rVf +rVf +rVf +rVf +rVf +mko +hUi +uIY +hUi +hUi +hUi +oOy +rwu +cGI +hsB +xtI +tBF +qun +bhY +hQa +mLB +wae +col +pbQ +uWv +rgB +oel +eGe +eGe +hZY +eGe +ecA +oIm +kvG +xBW +wiq +qpN +hmA +cuD +aNk +uCe +rWl +uCe +uCe +fPl +fPl +mPF +ebW +qxS +ikZ +enF +ouv +eSc +qNv +lGV +uVq +uVq +uVq +uVq +uVq +ibo +vBj +xtw +skI +kjD +kjD +rxM +pIA +kjD +uVq +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +mQB +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +uBI +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(168,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +kDD +kDD +uqc +daM +nQk +giy +dPe +wyE +dui +ufn +ukO +dnJ +uqc +dnH +bsu +mrl +dVr +sAq +uEn +jyQ +bGT +cUH +jCr +anh +kDD +uBI +kDD +kDD +kDD +akt +tOV +sRy +lnU +rUt +kHA +bPH +iCU +mko +dIx +dAr +tLV +heb +heb +heb +ejw +fPB +cEy +pjU +heh +swL +swL +dly +dZh +qRX +tuz +eDA +sex +tmW +qeS +hsB +dbI +jdD +dbI +mXw +dbI +fKH +ufs +hfY +iEV +hsg +sJr +jEu +oIm +gEb +ijf +ijD +qpN +qpN +qpN +qpN +fPl +lXW +wec +qWm +nXy +fPl +bAd +oWX +vSu +qpo +oOz +lUU +dca +xTR +lGV +kvK +lIt +lIt +tXx +uVq +uVq +uVq +uVq +uVq +uVq +uVq +uVq +aGC +uVq +uVq +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +mQB +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +rtz +rtz +rtz +rtz +rtz +kDD +rtz +rtz +rtz +rtz +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(169,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uqc +mxV +wrN +hqs +xkC +xgZ +bkv +gLf +tqz +msN +uqc +fKa +tEP +qkk +vtS +ijC +gGi +lal +azE +jCn +mem +anh +kDD +uBI +kDD +kDD +kDD +rPo +rPo +rPo +aFw +aFw +aFw +rPo +rPo +mko +dbm +spE +spE +spE +spE +spE +spE +kSN +dKA +cvM +heh +swL +swL +xfF +ssz +ssA +hsB +hsB +hsB +gft +dkf +hsB +eri +qui +iCH +ddn +dbI +uWv +rUk +uWv +uWv +uWv +uWv +uWv +oIm +kFm +jyD +hYq +jWm +igf +pTc +iuK +fPl +akH +xEN +xfP +bpf +fPl +dOl +fwf +oRx +ikZ +vaV +ouv +jnU +kAO +lGV +vKd +mNp +mNp +cvj +rCD +uVq +kjD +kjD +kjD +kjD +oUw +lIt +qAp +kjD +uVq +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +mQB +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(170,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uqc +tqv +wrN +bpA +dFR +lHz +uaN +gLX +gLX +qbP +uqc +wfg +vtz +cPP +sfA +anh +nkL +snB +eJh +rEp +bPM +anh +kDD +uBI +kDD +kDD +kDD +kDD +tnf +kDD +kDD +kDD +kDD +uBI +kDD +hUi +uAl +spE +hBA +lTW +lCS +pSA +spE +vaW +kHp +hUi +heh +heh +heh +pgB +heh +heh +heh +fGv +jni +uBD +fyg +iON +mwS +fSL +iCH +ltf +dbI +rTJ +eGe +kWs +uWv +uWv +vQT +qXf +tNt +icZ +nry +iXn +jWm +hdk +oSt +twO +fPl +uFu +esX +blH +org +fPl +tbp +jkr +mpd +lGV +xNJ +uWr +xYD +xki +lGV +oYB +lJa +lJa +lJa +oYB +uVq +kjD +kjD +kjD +kjD +doT +kjD +ipI +kjD +uVq +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +uVq +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +rtz +rtz +rtz +rtz +rtz +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(171,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uqc +vZd +odM +dxY +nRx +mQv +cbQ +gQQ +fCS +nlD +bog +bog +bog +qZU +bog +anh +bDI +jEa +ftB +aRk +fzN +iCB +uBI +hUi +hUi +hUi +hUi +hUi +hUi +ekf +ekf +hUi +hUi +hUi +hUi +hUi +dbm +spE +afk +xVf +jkW +owM +yhP +nTU +tiB +eCi +sar +qWA +qWA +tkj +vgV +hYr +vDz +pJl +lhC +xNg +kdg +gwu +yiu +iEY +sSl +xOX +dbI +slS +eGe +wuI +wuI +uWv +dsr +elo +ogx +nNc +xBW +fph +jWm +huM +iar +jUw +wkI +kaq +oSc +xGn +cXc +fPl +fPl +fPl +shj +lGV +lGV +xnX +dUL +lGV +lGV +oYB +lJa +wef +lJa +ebC +blY +pwl +pwl +pwl +rKu +rWV +vXq +dTB +tZk +uVq +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +kjD +uVq +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(172,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uqc +uqc +uqc +uqc +uqc +uqc +uqc +sOs +sOs +bog +bog +odO +hBr +lOU +pos +anh +bqm +ewJ +vcN +lJL +jNn +anh +kDD +hUi +mPi +bSa +ljg +bSa +twB +prT +evB +vXe +heb +heb +heb +qMC +jHQ +spE +vSm +lnE +vfI +vEV +spE +vfn +bKa +ioO +kRc +jPP +gqc +gMk +imW +bJj +ghl +kLr +qqJ +lXJ +kdg +dbI +iON +khU +dbI +rVO +dbI +jhG +jnP +rys +rys +rys +rys +rys +rys +kgZ +kAR +xFm +eEt +iiF +aez +bGA +eor +jSU +rig +rjf +gCB +kMN +dDG +fPl +szr +dvN +gjo +rKh +dcG +ylM +rys +oYB +lJa +lJa +lJa +uVq +uVq +phC +kjD +vvp +uPH +kjD +hYe +bTY +kjD +uVq +uVq +uVq +uVq +uVq +uVq +uVq +uVq +uVq +uVq +uVq +uVq +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(173,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +dfz +bzi +cYr +wpO +rUn +jjT +anh +anh +qQt +anh +anh +anh +anh +kDD +hUi +mPi +gbb +hjc +nDY +hjc +qxf +geX +hUi +hUi +hUi +hUi +heh +lox +spE +pqM +kXz +cQt +afP +rEk +fpP +bMU +eCi +rdr +uZn +bSX +bSX +bSX +gWD +lhD +nXg +igG +tiw +kdg +dbI +swT +ozn +pNK +vMc +dbI +nrv +qFI +rys +kUO +vjI +nuu +ahO +rys +oaD +xBW +mWe +dpl +piW +tVr +oDZ +fPl +gmE +xAO +xAO +aVF +jPl +wJt +fPl +hbx +lvC +fNG +bYc +dcG +umF +rys +oYB +uVq +kDD +kDD +kDD +uVq +kjD +kjD +kjD +uPH +kjD +hYe +kjD +kjD +uVq +kDD +uBI +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(174,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +bog +bog +bog +cAd +bog +phc +tsh +eIL +bog +kDD +kDD +kDD +kDD +uBI +kDD +kDD +hUi +bSa +row +bSa +bSa +bSa +kSN +bSa +hUi +bmC +dCj +bmC +heh +beL +spE +spE +plF +plF +nWP +rEk +bdm +qSD +heh +heh +pgB +heh +heh +bdm +vDj +heh +heh +rdr +vbV +vvV +dbI +kWD +jTY +jEE +jjo +dbI +yiH +epg +rys +his +wjC +xem +jjP +rys +sqe +xBW +mGB +jWm +jWm +dpl +jWm +fPl +bhA +xJf +vIt +dhG +qmK +xGe +fPl +tSH +uYt +dcG +mLM +dcG +vMY +rys +oYB +uVq +kDD +kDD +kDD +uVq +uVq +mQB +mQB +xmQ +unP +xmQ +mQB +uVq +uVq +uBI +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(175,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +uBI +kDD +kDD +bog +icb +eit +ccU +yjS +acn +fat +xkd +bog +bog +bog +kDD +kDD +uBI +kDD +hUi +hUi +hUi +kHK +hUi +hUi +hUi +meQ +bSa +hUi +cym +jYs +jYs +bEQ +hwI +kCb +fBd +wVD +fzl +wVD +fzl +kCb +mfW +heh +rkJ +ezm +faE +heh +hwI +deo +vKV +heh +heh +wPZ +heh +dbI +dbI +jvM +dbI +dbI +dbI +kXX +epg +rys +fDT +cYE +aUJ +lYy +jiF +mzZ +xBW +mWe +rys +kJl +kgj +qsZ +fPl +fPl +eor +fOg +fPl +fPl +fPl +fPl +rys +fzF +kkq +pwK +iXq +rys +rys +rca +uVq +kDD +kDD +kDD +kDD +kDD +kDD +kDD +frv +rYm +hkK +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(176,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +uBI +uBI +uBI +uBI +bog +tSx +pil +wQd +fvg +yiW +xue +lLi +iTh +lLf +bog +kDD +kDD +uBI +kDD +hUi +bSa +bSa +row +bSa +kns +hUi +bSa +bSa +hUi +xhU +jYs +jYs +heh +gDO +cIU +pLG +cIU +pLG +cIU +pLG +cIU +iOo +kyv +ryT +wgw +jSu +kyv +ryT +sny +qXk +heh +eBR +nrv +bvu +bvu +awu +dTq +xwZ +feo +jnP +uOo +xHv +rys +rTX +pPv +kFF +fBR +rys +kpU +qWa +mWe +kKT +nST +toz +dsT +wfr +ttx +nuP +ubc +nuP +nuP +ltu +nuP +qoV +tVC +nuP +rwB +nuP +srm +rys +tDO +ddy +kDD +kDD +kDD +kDD +kDD +kDD +kDD +mQB +unP +mQB +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(177,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +bog +vNm +qHV +lOJ +yjS +dlq +gje +vdv +mXg +oUN +bog +uBI +uBI +uBI +uBI +hUi +bSa +bSa +row +bSa +bSa +hUi +bSa +bSa +hUi +mdk +jYs +mdk +heh +lcP +yeX +gcp +wOq +rnA +cjT +mop +cjT +ihf +hCc +hCc +hCc +hCc +dUV +npd +wVo +xzp +heh +now +now +now +now +bYt +now +now +fRe +jnP +lud +jBE +rys +jfN +vMJ +sjs +pyL +rys +joI +ueH +jzU +rGO +itA +mtA +mxU +sgi +mxU +fxA +mEC +lMl +gWu +rze +muj +gWu +mwc +oXe +ikM +jZl +qFb +fvG +vNN +ddy +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(178,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +bog +gDN +gDN +gDN +bog +bog +bog +bog +bog +bog +bog +kDD +kDD +uBI +kDD +hUi +bSa +bSa +row +bSa +bSa +hUi +bSa +gim +hUi +heh +sdw +heh +heh +eLl +cIU +cYY +doo +xRF +cIU +xRF +cIU +cIU +new +cIU +cIU +cIU +ydY +amv +wVo +eEq +xBQ +dXL +dZj +qBW +dZj +gGL +dZj +now +fRe +jnP +epg +jnP +rys +ffC +bcT +bcT +bFP +bFP +xSs +eBl +tcU +hgK +dkQ +qFD +gEF +uUW +kPx +rTV +ifi +cjh +cPt +epp +gbk +dIr +crY +nVb +fej +gGO +heH +rys +iyP +ddy +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(179,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +uBI +kDD +bRh +uBI +kDD +hUi +bSa +bSa +row +bSa +bSa +hUi +bSa +bSa +hUi +fcA +bJQ +wFN +heh +iJd +cIU +gts +wVo +sNd +cIU +vNn +jkl +fNP +qtg +qtg +qtg +ekp +vYd +aQS +dqY +tNl +oCU +kBV +xhZ +alQ +aMy +iTu +mhz +now +fRe +jnP +epg +wiV +tdN +uds +wii +uwF +fnC +bFP +tNz +ccB +xgV +rys +clT +rMn +rMn +rka +jDB +jDB +jDB +jDB +jDB +oFO +oFO +bTH +rMH +oFO +oFO +jnP +jnP +jnP +rca +uVq +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(180,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +uBI +uBI +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +hUi +bSa +bSa +row +bSa +bSa +hUi +ljg +bSa +hUi +fcA +bJQ +wFN +heh +gXG +cIU +ydY +dqY +ssz +pLG +pLG +kcE +hKc +nsC +nsC +gKk +gvT +leU +hJl +wRL +eze +heh +uxN +wdK +iVa +pRh +xyS +tby +now +fRe +jnP +epg +qcu +uOo +uds +goa +cxM +rri +gPO +jzn +uKQ +wiY +npT +vZE +vZE +vZE +jDB +jDB +xMX +sIi +lJe +jDB +qzN +oLi +rRE +jzD +fjL +oFO +ndh +xwZ +xwZ +gkx +jnP +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(181,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +mko +mko +mko +mko +mko +mko +mko +hUi +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +hUi +bSa +bSa +row +bSa +bSa +hUi +bSa +bSa +hUi +oyS +jDP +yao +heh +oRi +kZk +ydY +kuH +heh +nTN +nTN +nTN +heh +nTN +nTN +nTN +heh +kYQ +iMo +tIX +osZ +heh +fGr +wnL +rGZ +qnl +iVa +lzI +now +dkC +jnP +nrv +bvu +qFI +bFP +uPK +xGA +jAI +wjF +vJL +foI +aRX +ibd +llC +uBo +dvr +qlR +jDB +kwJ +nNC +kPz +jDB +xTh +xxg +aug +pKG +fjL +oFO +fRe +jnP +jnP +jnP +jnP +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(182,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +hUi +cVd +jKR +bSa +mPi +bSa +ljg +hUi +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +hUi +bSa +bSa +row +bSa +bSa +hUi +hUi +fBY +fBY +fBY +fBY +fBY +fBY +oPR +cIU +ydY +kuH +nTN +kDD +kDD +kDD +kDD +kDD +kDD +kDD +nTN +aAO +hvT +mcr +eze +heh +nJL +jKf +ocC +ykC +hlx +ocC +now +fRe +jnP +wyg +lyy +epg +bFP +tGG +oJK +ohW +bFP +fMN +jra +lAP +jDB +xRV +wSG +bjq +xQd +ifz +jFm +uXu +ybK +jDB +xTh +kea +aug +yiw +fjL +oFO +fRe +jnP +osY +osY +jnP +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(183,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +iDi +bSa +bSa +jHh +giK +sdN +iIg +hUi +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +hUi +bSa +bSa +row +bSa +bSa +hUi +kDD +fBY +mMT +taA +xLm +pXS +hMJ +mbV +cjT +vDW +eZi +nTN +kDD +kDD +kDD +kDD +kDD +kDD +kDD +nTN +aAO +quc +tZg +tiT +heh +now +now +now +now +now +now +now +fRe +jnP +jnP +jnP +epg +bFP +bFP +koW +bFP +jDB +vZE +weF +vZE +jDB +mHx +ceE +pUa +erN +jDB +nAd +lHn +dmO +jDB +xTh +dqs +gCY +sXg +ijc +oFO +fRe +tyk +eBR +gur +jnP +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(184,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +uBI +uBI +uBI +iDi +bSa +uYK +cjQ +hUi +hUi +uSz +hUi +hUi +hUi +hUi +ekf +hUi +hUi +hUi +hUi +hUi +bSa +bSa +row +bSa +bSa +hUi +kDD +fBY +pWR +fBY +rYO +gTS +fBY +fpP +sFm +pKY +xDu +nTN +kDD +kDD +kDD +kDD +kDD +kDD +kDD +nTN +mCA +qyg +cCn +wyn +heh +kDD +jnP +kWa +cFE +qqr +qqr +wlu +aix +bvu +bvu +bvu +xyB +jnP +eBR +fRe +sCK +jDB +eyI +gLC +wAh +wSf +izv +rNH +pBV +vKS +jDB +jDB +jDB +jDB +jDB +oFO +oFO +oFO +oFO +oFO +jnP +fRe +jnP +eBR +eBR +jnP +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(185,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +hUi +mPi +bSa +fIf +hUi +bSa +cjQ +bSa +sNK +hUi +bSa +bSa +rft +hUi +mPi +bSa +hUi +bSa +bSa +row +bSa +bSa +hUi +kDD +fBY +fBY +fBY +gyl +kpZ +fBY +nTN +eiX +oCB +cPI +heh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +heh +mMD +qyg +vuH +eze +heh +kDD +jnP +eBR +eNe +jnP +jnP +jnP +gAl +jnP +jnP +jnP +epg +jnP +eBR +fRe +eBR +jDB +xFM +dNH +nJs +ljr +fWm +tNh +hda +laC +jDB +kDD +jnP +ndh +xwZ +kBZ +xwZ +xwZ +xwZ +xwZ +xwZ +gkx +jnP +kWa +eBR +jnP +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(186,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hUi +hUi +hUi +cjQ +hUi +bSa +ukG +hjc +hjc +php +hjc +hjc +hjc +ldA +hjc +rTY +hUi +hUi +hUi +kHK +hUi +hUi +hUi +kDD +fBY +jDe +ucU +bor +vtp +fBY +krV +eEV +qQI +sdZ +ghq +kDD +kDD +kDD +kDD +kDD +kDD +kDD +ghq +gGw +pWK +uty +xeR +heh +kDD +jnP +eBR +eNe +jnP +eBR +eBR +eNe +eBR +iYn +jnP +sRu +hhx +xwZ +gkx +eBR +jDB +pbO +qsn +hVW +qse +fIt +qsn +sPF +kDW +jDB +kDD +jnP +fRe +jnP +jnP +jnP +wUU +jnP +jnP +jnP +jnP +jnP +bEy +tql +qmq +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(187,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hUi +oVB +hUi +bSa +cyg +bSa +bSa +hUi +bSa +bSa +bSa +hUi +mPi +prP +hjc +hjc +hjc +kgm +bSa +mPi +hUi +kDD +fBY +xnJ +iBX +ucU +uYG +fBY +woW +gCW +odQ +bsf +azQ +kDD +kDD +kDD +kDD +kDD +kDD +kyx +azQ +nJk +gNB +buq +eze +heh +kDD +jnP +eBR +eNe +jnP +eBR +eBR +eNe +eBR +eBR +jnP +fRe +jnP +eBR +eBR +eBR +jDB +jDB +jpK +jpK +jDB +jDB +jpK +jpK +jDB +jDB +kDD +jnP +dkC +jnP +eBR +eBR +eBR +eBR +iYn +jnP +cAg +eBR +osY +qmq +qmq +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(188,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +pIH +qwo +hUi +bSa +cyg +bSa +bSa +hUi +hUi +hUi +hUi +hUi +ekf +hUi +hUi +hUi +hAd +hvu +hvu +hvu +hUi +kDD +fBY +fBY +fBY +fBY +fBY +fBY +szS +mwx +qLP +wXz +heh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +heh +bRi +olH +buq +tiT +heh +uBI +qmq +eBR +eNe +jnP +eBR +eBR +eNe +eBR +eBR +jnP +fRe +jnP +eBR +eBR +eBR +cjd +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +uBI +kDD +jnP +fRe +jnP +eBR +eBR +eBR +eBR +eBR +jnP +dJX +eBR +qmq +qmq +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(189,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jZh +jZo +xvj +lSc +ulB +bSa +bSa +hUi +kDD +uBI +kDD +kDD +uBI +kDD +kDD +hUi +kDd +wqj +bpF +yjK +hUi +kDD +kDD +kDD +kDD +kDD +kDD +heh +ijH +cIU +wJe +eEq +azQ +kDD +kDD +kDD +kDD +kDD +kDD +kDD +azQ +fBk +icC +nir +eze +heh +kDD +qmq +eBR +eNe +jnP +eBR +eBR +eNe +eBR +eBR +jnP +fRe +jnP +jnP +cjd +cjd +cjd +kDD +bRh +uBI +kDD +kDD +uBI +kDD +kDD +uBI +kDD +jnP +fRe +jnP +eBR +eBR +eBR +eBR +eBR +jnP +cAg +qmq +qmq +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(190,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hUi +rjR +hUi +hUi +iDi +iDi +hUi +hUi +uBI +uBI +uBI +uBI +uBI +uBI +kDD +oUk +kqS +dby +bpF +yjK +xgU +kDD +kDD +kDD +kDD +kDD +kDD +heh +uNX +meh +pLG +ssA +wFA +kDD +kDD +kDD +kDD +kDD +kDD +kDD +wFA +xPT +xPT +xPT +wek +heh +uBI +qmq +eBR +eNe +tyk +eBR +eBR +eZa +qqr +jUn +wUU +fRe +jnP +kDD +kDD +kDD +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +jnP +fRe +jnP +eBR +eBR +eBR +eBR +eBR +jnP +qmq +qmq +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(191,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +bOU +bOU +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +mhK +deR +lbS +deR +nRa +kDD +kDD +kDD +kDD +kDD +kDD +heh +nTN +nTN +nTN +nTN +heh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +heh +nTN +nTN +nTN +nTN +heh +kDD +jnP +eBR +eNe +tyk +eBR +eBR +eBR +eBR +eNe +jnP +qBV +jnP +uBI +uBI +uBI +uBI +kDD +kDD +uBI +kDD +kDD +uBI +bRh +kDD +uBI +kDD +jnP +fRe +tyk +eBR +eBR +eBR +eBR +eBR +jnP +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(192,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +upa +upa +upa +upa +uBI +uBI +uBI +deH +uSK +deH +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jnP +uUo +eNe +jnP +eBR +eBR +eBR +eBR +eNe +jnP +fRe +jnP +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +uBI +kDD +jnP +fRe +tyk +eBR +eBR +eBR +eBR +eBR +jnP +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(193,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +uBI +kDD +kDD +deH +uSK +deH +uBI +uBI +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jnP +jnP +dVZ +jnP +eBR +eBR +eBR +eBR +eNe +jnP +fRe +jnP +jnP +jnP +jnP +jnP +cjd +cjd +jnP +cjd +cjd +jnP +cjd +cjd +jnP +jnP +jnP +fRe +jnP +eBR +eBR +eBR +eBR +eBR +jnP +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(194,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +bOU +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uYe +uBI +uBI +deH +uSK +deH +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +kDD +kDD +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jnP +eNe +jnP +eBR +eBR +eBR +eBR +eNe +jnP +xTo +qqr +qqr +qqr +cXt +isy +eBR +eBR +lud +bvu +bvu +bvu +bvu +bvu +myJ +bvu +bvu +olp +jnP +eBR +eBR +eBR +eBR +eBR +jnP +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(195,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +deR +gzW +deR +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +qmq +eNe +jnP +eBR +eBR +eBR +eBR +eZa +kNm +xIY +aNX +xwZ +xwZ +lZn +hcY +xwZ +xwZ +cBr +qqr +ldl +qqr +qqr +cXt +qqr +qqr +qqr +lgD +jnP +eBR +eBR +eBR +eBR +eBR +jnP +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(196,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +deH +uSK +deH +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +qmq +eNe +jnP +jnP +jnP +jnP +jnP +jnP +jnP +jnP +jnP +jnP +jnP +bvQ +jnP +jnP +jnP +jnP +jnP +jnP +jnP +jnP +jnP +jnP +tyk +jnP +jnP +jnP +eBR +eBR +eBR +eBR +eBR +jnP +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(197,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +uBI +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +uBI +kDD +deH +uSK +deH +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +dJH +jnP +hYW +oPy +oGn +oGn +jnP +eBR +eBR +eBR +rFl +jnP +eBR +eBR +fRe +eBR +blN +jnP +eBR +eBR +eBR +eBR +blN +jnP +eBR +eBR +eBR +rFl +jnP +jnP +jnP +jnP +jnP +jnP +jnP +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(198,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +deH +uSK +deH +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +kDD +jDr +tLd +eTF +jnP +bVr +oGn +oGn +jnP +eBR +eBR +eBR +eBR +jnP +eBR +eBR +xTo +qqr +qqr +gXL +qqr +qqr +jUn +eBR +eBR +jnP +eBR +eBR +eBR +eBR +jnP +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(199,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +deR +wBz +deR +tnf +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +uBI +kDD +jDr +alF +uAm +tzA +jru +sfo +sBE +gXL +qqr +jUn +eBR +eBR +jnP +eBR +eBR +epg +eBR +eBR +jnP +eBR +eBR +eNe +eBR +eBR +jnP +eBR +eBR +eBR +eBR +jnP +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(200,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +kDD +kDD +uBI +kDD +deH +uSK +deH +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +uBI +uBI +uBI +kqW +viG +klZ +jnP +mfl +mfl +vZs +jnP +eBR +eNe +eBR +eBR +jnP +jnP +jnP +iSh +jnP +jnP +tZY +tZY +tZY +iHi +tZY +tZY +tZY +eBR +eBR +eBR +eBR +jnP +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(201,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +kDD +kDD +kDD +bOU +kDD +kDD +kDD +uBI +kDD +deH +uSK +deH +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +kDD +kDD +kDD +kDD +kDD +uBI +kDD +qgk +sZf +yhT +jnP +mnJ +ehM +lFx +jnP +eBR +eNe +eBR +eBR +jnP +skz +xeI +sBh +uAm +qUI +tZY +xHn +cmY +qmu +lnj +fgf +tZY +eBR +eBR +eBR +eBR +jnP +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(202,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +deH +uSK +deH +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +uBI +ePM +kDD +jaA +jnP +jnP +jnP +jnP +jnP +jnP +jnP +dVZ +jnP +jnP +jnP +rVk +xeI +sBh +hjB +xRQ +tZY +slQ +sht +lef +ast +wza +tZY +tZY +tZY +jnP +jnP +jnP +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(203,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +uBI +uBI +uBI +deR +lod +deR +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +kxR +uBI +bOU +kDD +kDD +uBI +kDD +kDD +jnP +eBR +eBR +eNe +eBR +blN +jnP +iIb +isE +sBh +xHK +nri +tZY +haz +tcF +jwm +eYy +dUp +eYy +eHT +tZY +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(204,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +deH +ipD +deH +deH +deH +pAL +flL +jkY +deR +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +kDD +tKl +uBI +kDD +kDD +kDD +kDD +uBI +kDD +kDD +jnP +eBR +eBR +eZa +qqr +qqr +wlu +rov +rwE +iap +nuO +uXM +hLq +fgT +eMu +gCP +vxp +jBl +try +prB +tZY +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(205,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +deH +ipD +uSK +cVb +tFR +nbp +lxV +jyj +lxV +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +kDD +kDD +wob +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +uBI +jnP +eBR +eBR +eBR +eBR +eBR +jnP +iBG +laA +bwB +uNj +cgr +tZY +phj +qAN +csY +nPV +scR +nPV +wpK +xGS +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(206,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +uBI +deH +ipD +uSK +peh +bIY +dhS +deR +fhr +qPl +hEq +hEq +hEq +hEq +hEq +hEq +hEq +hEq +hEq +hEq +hEq +hEq +hEq +hEq +hEq +aIa +kDD +kDD +uBI +kDD +kDD +kDD +kDD +uBI +kDD +kDD +jnP +jnP +qmq +qmq +qmq +jnP +jnP +nce +bmT +iJM +ako +eks +tZY +tln +syR +qdd +dzY +fNQ +tYR +nPV +xGS +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(207,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +deR +deH +deR +deR +deR +byx +deR +deR +deR +rUM +rUM +rUM +rUM +mns +qMn +dDe +qMn +dDe +qMn +dDe +qMn +dDe +dDe +wTh +vwE +uBI +uBI +uBI +uBI +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +jnP +jnP +jnP +qmq +jnP +jnP +tZY +tZY +tZY +hQQ +tZY +xGS +xGS +xGS +xGS +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(208,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +deR +sVO +sVO +uuU +sVO +uHT +deR +nIG +nlo +qcS +xhq +nIG +deR +deR +kGi +kGi +deR +deR +kDD +uBI +kDD +kDD +vwE +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +lnF +eBR +lnF +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(209,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +uBI +uBI +hYJ +deR +sVO +sVO +uuU +sVO +sVO +deR +bQu +oar +jbB +oar +bIY +deR +sVO +sVO +sVO +mLz +deR +uOQ +flL +jkY +deR +vwE +uBI +kDD +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(210,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +hYJ +deR +sVO +sVO +uuU +sVO +sVO +deR +sZr +grI +nxh +bIY +rQh +deR +sVO +sVO +sVO +sVO +deR +uuU +dYZ +hIR +dYZ +vwE +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(211,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +deR +sVO +sVO +uuU +sVO +sVO +deR +epo +fDA +iEr +bIY +imm +deR +nRB +vNR +vNR +vNR +lFv +vjf +bWz +vPT +deR +vwE +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(212,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +hYJ +deR +sVO +sVO +uuU +sVO +sVO +deR +deR +neI +deR +deR +deR +deR +uuU +sVO +sVO +sVO +deR +ePx +kGi +kDD +kDD +vwE +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(213,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +shr +hYJ +hYJ +mPG +deR +sVO +sVO +jZg +vNR +vNR +lFv +lfx +cEq +lCu +vNR +vNR +kKb +xlI +sVO +sVO +sVO +deR +esl +kGi +uBI +enR +mZS +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(214,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +mxZ +yku +joV +mPG +deR +sVO +sVO +uuU +sVO +sVO +deR +deR +deR +deR +deR +kwU +deR +deR +deR +deR +deR +deR +ePx +deR +kDD +vwE +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(215,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +oMd +taV +mPG +deR +sVO +sVO +uuU +sVO +sVO +deR +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +igt +deR +ePx +kGi +kDD +vwE +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(216,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +mPG +taV +mPG +deR +sVO +sVO +uuU +sVO +sVO +deR +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +deR +tVH +ugo +hEq +mZS +uBI +uBI +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(217,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +mPG +pCu +mPG +deR +sVO +sVO +uuU +sVO +sVO +deR +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +deR +rui +kGi +kDD +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +uBI +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(218,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +uBI +uBI +uBI +uBI +hYJ +caX +mPG +ygw +aQE +deR +deR +deR +neI +deR +deR +deR +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +deR +ePx +deR +kDD +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(219,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +hYJ +deR +klm +rRx +dyG +sdU +deR +sVO +sVO +uuU +sVO +hOU +deR +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +bDO +ePx +kGi +kDD +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(220,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +muV +deR +deR +deR +hYJ +hYJ +dSf +lYA +bdG +lqQ +deR +sVO +sVO +jZg +vNR +vNR +lFv +diM +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +coa +djd +qYd +kGi +bOU +bOU +uBI +uBI +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(221,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +jyy +mPG +lYA +qru +uBm +deR +sVO +sVO +uuU +sVO +sVO +deR +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +deR +ePx +kGi +kDD +bOU +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(222,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +tIl +elh +jyy +mPG +lYA +wXa +kjl +deR +deR +deR +rfG +deR +deR +deR +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +deR +ePx +deR +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(223,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +jyy +kHx +cuP +gDy +ile +uxT +deR +sVO +uuU +sVO +mLz +deR +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +deR +ePx +kGi +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(224,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +muV +deR +deR +deR +hYJ +hYJ +mPG +apM +bQs +moN +vNR +sJG +vNR +qwk +sVO +sVO +deR +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +sVO +deR +ejN +kGi +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(225,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +uBI +kDD +hYJ +hYJ +mPG +imh +fAR +hvn +vlj +deR +sVO +uuU +sVO +sVO +deR +deR +deR +deR +deR +deR +deR +deR +deR +deR +deR +deR +ePx +kGi +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(226,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bOU +uBI +uBI +uBI +hYJ +hYJ +mPG +mPG +mPG +gYT +mPG +deR +sVO +oDw +vNR +vNR +rwG +niH +rRx +odU +vlj +ddN +xrp +tWi +tzW +khi +khi +djd +jUD +deR +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(227,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +mPG +mPG +kHx +gYT +mPG +deR +sVO +sVO +sVO +sVO +deR +deR +xoQ +fop +kHx +gYT +mPG +gYT +hYJ +hYJ +hYJ +deR +deR +deR +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(228,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +mPG +mPG +gYT +mPG +deR +deR +deR +deR +deR +deR +mPG +mPG +mPG +mPG +gYT +mPG +gYT +mPG +hYJ +hYJ +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(229,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +mPG +mPG +gYT +mPG +mPG +mPG +mPG +gWS +mPG +mPG +mPG +mPG +fnw +fnw +dNY +mPG +gYT +hYJ +hYJ +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(230,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +hYJ +fij +itO +aCi +aCi +aCi +aCi +aCi +aCi +aCi +aCi +aCi +aCi +aCi +ncE +aCi +ykr +hYJ +hYJ +kDD +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(231,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +deR +hYJ +mPG +mPG +kHx +mPG +mPG +mPG +mPG +kHx +mPG +mPG +lNr +mPG +kHx +mPG +bWQ +hYJ +hYJ +uBI +uBI +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(232,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +hYJ +hYJ +mPG +mPG +mPG +bWQ +mPG +mPG +mPG +mPG +mPG +mPG +mPG +mPG +mPG +bWQ +hYJ +hYJ +kDD +uBI +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(233,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +hYJ +hYJ +hYJ +hYJ +bWQ +mPG +mPG +mPG +fnw +fnw +fnw +mPG +mPG +mPG +xIx +kGi +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(234,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +hYJ +hYJ +hYJ +hYJ +hYJ +fij +oIg +mPG +mPG +mPG +mPG +mPG +mPG +mPG +iHR +kGi +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(235,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +hYJ +deR +hYJ +mPG +kHx +mPG +mPG +mPG +mPG +mPG +eNl +kGi +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(236,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +hYJ +bWQ +bWQ +dwO +iHR +qSW +hYJ +hYJ +hYJ +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(237,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +hYJ +hYJ +kGi +kGi +kGi +hYJ +hYJ +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(238,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +hYJ +hYJ +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(239,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(240,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(241,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(242,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +bRh +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(243,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(244,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(245,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(246,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(247,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(248,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(249,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(250,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(251,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(252,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(253,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(254,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} +(255,1,1) = {" +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +kDD +"} + +(1,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(2,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(3,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(4,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(5,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(6,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(7,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(8,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(9,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(10,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(11,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(12,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(13,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(14,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(15,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(16,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(17,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(18,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(19,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(20,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(21,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(22,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(23,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(24,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(25,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(26,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(27,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(28,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(29,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +czn +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(30,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +czn +mzC +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(31,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +mzC +mzC +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(32,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +czn +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(33,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(34,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(35,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(36,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(37,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(38,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(39,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(40,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(41,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +mzC +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(42,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +pWp +czn +mzC +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(43,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +czn +czn +mzC +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(44,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +mzC +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(45,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hIl +hIl +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hIl +hIl +xlz +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(46,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +hIl +mzC +czn +czn +mzC +czn +mzC +czn +czn +mzC +hIl +gPf +iAp +wUT +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(47,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hIl +mzC +czn +czn +mzC +mzC +mzC +czn +czn +mzC +hIl +hIl +gYA +hIl +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(48,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hIl +hIl +hIl +mzC +mzC +czn +mzC +mzC +hIl +hIl +hIl +rYe +rYe +gYA +mzC +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(49,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hIl +mzC +mzC +mzC +mzC +czn +mzC +mzC +mzC +mzC +hIl +rYe +rYe +hIl +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(50,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hIl +hIl +hIl +hIl +hIl +hIl +hIl +hIl +hIl +hIl +hIl +hIl +hIl +hIl +hIl +hIl +hIl +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(51,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hIl +rYe +gla +rYe +rYe +rYe +uie +tmq +rYe +rYe +uie +rYe +rYe +rYe +gla +rYe +hIl +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(52,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +qgw +qgw +qgw +qgw +qgw +qgw +qgw +qgw +hIl +gla +ccW +kla +kla +kla +kla +kla +kla +kla +kla +kla +kla +kla +bct +gla +hIl +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(53,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hIl +rYe +eEB +rYe +rYe +rYe +uie +rYe +gla +rYe +uie +rYe +rYe +rYe +eEB +rYe +hIl +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(54,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hIl +rYe +eEB +rYe +rYe +rYe +dgg +gRK +gRK +gRK +dgg +rYe +rYe +rYe +eEB +rYe +hIl +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(55,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hIl +uie +eEB +uie +uie +uie +gRK +mmg +mmg +mmg +gRK +uie +uie +uie +eEB +uie +hIl +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(56,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hIl +aDQ +eEB +rYe +rYe +rYe +gRK +mmg +mmg +mmg +gRK +rYe +rYe +rYe +eEB +rTr +hIl +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(57,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hIl +rYe +eEB +rYe +rYe +rYe +gRK +mmg +mmg +mmg +gRK +rYe +rYe +rYe +eEB +rYe +hIl +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(58,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +qgw +qgw +qgw +qgw +qgw +qgw +qgw +qgw +hIl +rYe +eEB +rYe +rYe +rYe +dgg +gRK +gRK +gRK +dgg +rYe +rYe +rYe +eEB +rYe +hIl +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(59,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hIl +rYe +eEB +rYe +rYe +rYe +uie +gla +gla +gla +uie +rYe +rYe +rYe +eEB +rYe +hIl +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(60,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +hIl +uie +eEB +uie +uie +uie +uie +uie +uie +uie +uie +uie +uie +uie +eEB +uie +hIl +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(61,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +hIl +rYe +eEB +rYe +rYe +rYe +uie +rYe +rYe +rYe +uie +rYe +rYe +rYe +eEB +rYe +hIl +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(62,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +hIl +iEH +eEB +rYe +rYe +rYe +uie +rYe +rYe +rYe +uie +rYe +rYe +rYe +eEB +pQo +hIl +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(63,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +hIl +woT +cWF +rYe +nSE +nSE +nSE +nSE +nSE +nSE +nSE +nSE +nSE +rYe +eEB +rYe +hIl +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(64,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +pWp +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hIl +rYe +gla +nSE +nSE +jMw +plH +rqt +iiR +ruS +wCv +wnR +nSE +nSE +tRm +rYe +hIl +hoA +hoA +hoA +hoA +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(65,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hIl +rYe +gla +nSE +aki +fIP +iLY +fvl +csp +fvl +qik +urq +dIW +bDU +bfn +rYe +hIl +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(66,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hIl +rYe +gla +nSE +cbY +kyw +fqB +ncN +nAs +ncN +oUF +aaI +ehA +nSE +lvN +rYe +hIl +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(67,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hIl +rYe +gla +wfu +heR +hLt +knU +fve +iSa +iSa +knU +vLb +wLk +wfu +lvN +rYe +hIl +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(68,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hIl +hIl +hIl +wfu +wfu +wfu +wfu +wfu +puh +wfu +wfu +wfu +wfu +wfu +rFi +hIl +hIl +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(69,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +xJm +xJm +xJm +xJm +xJm +hoA +hoA +nyl +hoA +wfu +tPu +jDK +vWA +wfu +hoA +hoA +hoA +maV +hoA +hoA +hoA +hoA +hoA +hoA +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(70,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +xJm +cmD +cmD +evg +xdF +klz +wfu +wfu +wfu +wfu +rAo +sXi +dei +wfu +wfu +wfu +wfu +maV +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +qgw +czn +qgw +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(71,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +qgw +qgw +mzC +qgw +qgw +hoA +hoA +xJm +cmD +cmD +cmD +oEY +osb +ecu +tkD +eZF +gep +mJo +uGZ +usv +pOT +klH +nqB +vss +ehY +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(72,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +czn +hoA +hoA +xJm +cmD +cmD +xIQ +ahq +tvj +gjj +btW +euB +rDr +sHH +jBw +qAF +ezd +duA +szp +vss +kxX +hoA +hoA +hoA +hoA +hoA +hoA +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(73,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +qgw +qgw +mzC +qgw +qgw +hoA +hoA +xJm +xJm +xJm +xJm +xJm +hoA +wfu +dDF +gpA +bNl +cfI +cfI +cfI +rvi +oBH +aIA +wfu +idF +xJm +xJm +xJm +xJm +xJm +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(74,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +czn +hoA +hoA +xJm +kFV +kFV +dry +xdF +aQC +ecu +dyB +mro +gjr +kzc +hau +kzc +fwN +vhc +lRG +kVw +eet +vHR +lJu +nti +nti +xJm +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +pWp +mzC +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(75,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +qgw +qgw +mzC +qgw +qgw +qgw +hoA +xJm +kFV +tCz +kFV +oEY +hoA +nSE +xdL +gSD +oiF +uiW +uiW +uiW +jKw +mOs +liQ +nSE +idF +oEY +nje +nti +nti +xJm +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(76,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +hoA +xJm +kFV +kFV +eAZ +uoN +mUt +vRJ +bhr +wCs +jsv +bEw +uiW +aRy +tum +qAF +sAT +kVw +aOc +vHR +joB +nti +nti +xJm +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +hoA +hoA +hoA +hoA +hoA +iaw +iaw +fjN +fjN +iaw +iaw +dpZ +dpZ +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(77,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +qgw +qgw +mzC +qgw +qgw +qgw +hoA +xJm +xJm +xJm +xJm +xJm +hoA +wfu +dDF +gSD +jsv +pty +nSE +oPU +eYb +imZ +qEz +wfu +idF +xJm +xJm +xJm +xJm +xJm +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +iaw +iaw +fjN +fjN +fjN +iaw +iaw +edp +hPw +hPw +dYu +iaw +dpZ +spd +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(78,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +hoA +xJm +kds +kds +plh +xdF +aQC +ecu +vLi +gSD +jsv +eiv +uiW +rff +uex +vvE +uxh +dCq +uAs +fYs +wIx +dEb +dEb +xJm +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hoA +iaw +tob +mcG +mcG +mcG +iqd +iaw +hPw +pgV +pgV +bJi +iaw +jBS +iaw +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(79,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +pWp +czn +czn +mzC +xJm +kds +muC +kds +oEY +hoA +nSE +uOy +gSD +phd +lsT +uNQ +gIA +rde +mOs +sMh +nSE +idF +oEY +dEb +noH +dEb +xJm +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +eCA +hoA +iaw +pJW +xtr +hQl +xtr +xtr +iaw +pfN +oIs +aIl +hPw +ouD +rRY +iaw +hoA +hoA +czn +hoA +hoA +hoA +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(80,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +xJm +kds +kds +jlh +uoN +mUt +vRJ +orK +gzq +uee +wtO +fgX +rpq +cwJ +gio +wre +ecu +iCL +xdF +saR +dEb +dEb +xJm +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hoA +fjN +xtr +lHM +pHe +rWQ +rYo +iaw +faS +hPw +hPw +sEM +ssU +dTm +iaw +hoA +hoA +czn +hoA +hoA +hoA +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(81,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +xJm +xJm +xJm +xJm +xJm +hoA +wfu +olb +dyf +frF +yiK +fgb +jJJ +hZJ +imZ +aAz +wfu +idF +xJm +xJm +xJm +xJm +xJm +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hoA +iaw +jFP +hqV +gxa +qDq +cZz +iaw +inB +hPw +aEA +iaw +iaw +iaw +iaw +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(82,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +xJm +wxM +wxM +fAJ +xdF +aQC +ecu +rih +gSD +cwJ +rlL +cnS +yjN +cwn +vvE +mjB +dCq +uAs +fYs +tCu +pmf +pmf +xJm +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +cXw +iaw +iaw +cur +xoc +uak +vAr +uJm +wEV +xWK +fAr +iaw +iaw +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mzC +mzC +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(83,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +xJm +wxM +msX +wxM +oEY +hoA +nSE +xPL +gSD +cwn +cZR +cZR +kwh +njg +ehz +fJe +nSE +idF +oEY +pmf +elX +pmf +xJm +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mzC +mzC +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +iaw +mJH +xFa +xtr +frG +hEG +lYG +rpV +iaw +lXx +ddj +iaw +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(84,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +xJm +wxM +wxM +usy +uoN +mUt +vRJ +tKO +wKt +gio +fGX +fGX +rjG +tWV +gcN +fyO +dYA +fCd +xdF +qMI +pmf +pmf +xJm +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +pWp +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +iaw +wWV +iaw +iaw +iaw +iaw +iaw +iaw +iaw +sEy +pYS +iaw +nqj +nqj +nqj +nqj +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(85,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +xJm +xJm +xJm +xJm +xJm +hoA +wfu +sQl +jvJ +jvJ +jvJ +jvJ +jvJ +jvJ +xFA +wFS +wfu +eng +xJm +xJm +xJm +xJm +xJm +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +hoA +hoA +cdO +qTb +tRu +ehC +qUD +aKn +wKv +oIJ +vKO +lkT +nGY +hYp +mnU +xoy +tOK +nqj +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(86,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +tPl +uCW +sie +dra +dra +kpG +xzf +dDC +tMO +dDC +cPD +ixm +uHs +cei +cei +cpe +cei +ozV +cLp +aZx +cPD +kBu +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hoA +hoA +cdO +cdO +cdO +don +don +azw +duO +uXX +jbM +don +eKa +xxY +nqj +fli +xYr +nqj +nqj +wBG +wBG +hoA +hoA +hoA +hoA +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(87,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +pjZ +uss +ppl +uss +uss +uBq +uss +uss +sII +uss +uss +sbs +fZp +wfu +wfu +wfu +wfu +sCl +wfu +wfu +wfu +juE +snc +snc +snc +fgD +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hoA +hoA +hoA +cdO +stA +yaZ +xNI +duq +oNC +wdj +kio +rXo +rbj +dgA +cdO +xMD +hwf +nqj +sTi +lMg +wBG +hoA +hoA +hoA +hoA +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(88,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hSx +oPS +bib +wkT +cVo +fsz +cyZ +gKS +bLL +jvY +jvY +jvY +ePH +wfu +mLp +xQK +oFf +smc +jnI +wfu +hoA +cIk +khs +khs +khs +gbs +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +hoA +hoA +hoA +cdO +nfP +gDA +eoY +oiE +lBs +pXK +iel +vwp +qFX +vXi +cdO +oLK +hwf +nqj +rlk +sVR +wBG +hoA +hoA +hoA +hoA +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(89,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +rzs +uss +feR +rrK +wkc +jUz +wtG +bfq +bSt +kti +jvY +jvY +ePH +wfu +mLp +xQK +yhH +cag +azn +wfu +eTr +eTr +eTr +eTr +hoA +tEV +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hoA +hoA +hoA +cdO +mWi +gDA +bLB +qmi +pbe +mYq +bLB +qmi +fCt +tFt +cdO +qrr +nkI +nOz +eiU +fsx +nqj +hoA +hoA +hoA +hoA +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(90,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +rzs +uss +wrr +pbN +fzD +uss +apO +bdz +bUj +bUj +hcG +hoz +rWN +wfu +mLp +xQK +yhH +cag +cQc +wfu +mBG +mdf +uUt +eTr +eTr +tEV +hoA +weZ +aKI +aKI +aKI +aKI +aKI +aKI +aKI +aKI +nAj +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hoA +hoA +hoA +cdO +fen +gDA +iel +lZE +pqP +pXK +iel +lZE +fCt +pkW +cdO +rpi +uyY +nqj +sBX +aYq +nqj +hoA +hoA +hoA +hoA +mzC +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(91,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +rzs +hWf +rfc +oVK +qcc +dCJ +oru +jvY +wfu +wfu +wfu +wfu +wfu +wfu +wfu +wfu +jDb +cag +buM +wfu +tOv +yaI +pOE +dOp +eTr +tEV +hoA +qtk +czn +czn +czn +czn +czn +czn +czn +czn +brJ +hoA +hoA +hoA +hoA +hoA +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +pWp +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +hoA +hoA +hoA +cdO +cdO +egh +bLB +qmi +pbe +jbO +bLB +qmi +fCt +cdO +cdO +iHo +uyY +nqj +nqj +nqj +nqj +hoA +hoA +hoA +hoA +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(92,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +rzs +uss +uss +dfh +uss +uss +tzk +yfB +wfu +uOH +htH +xtn +tWg +mLo +qCx +wfu +uEs +fIM +tUu +ceT +qpn +fRz +pPw +cSs +eTr +tEV +hoA +qtk +czn +czn +czn +czn +czn +czn +czn +czn +brJ +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hoA +hoA +hoA +hoA +cdO +jPo +iel +lZE +pqP +pXK +iel +lZE +bmN +cdO +sRB +qrZ +pma +nqj +fHO +ion +wBG +hoA +hoA +hoA +hoA +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(93,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +rzs +eCA +uss +vyG +uss +uss +uss +aGe +wfu +eTV +rFR +aKA +dAI +qId +fyC +wfu +yhH +cag +kMA +wfu +jhq +uce +qJo +loE +eTr +tEV +hoA +qtk +czn +czn +czn +czn +czn +czn +czn +czn +brJ +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +cdO +noQ +bLB +qmi +eCy +dmM +xMe +vde +hUu +iUu +eXf +bEq +tOf +kkI +ewT +rgR +wBG +hoA +hoA +hoA +hoA +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(94,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +rzs +iHB +uss +cvn +uss +kDD +uss +dnq +wfu +eRD +vWN +usv +usv +usv +cKS +aXl +yhH +cag +ekq +wfu +okf +jim +oct +eTr +eTr +tEV +hoA +qtk +czn +czn +czn +czn +czn +czn +czn +czn +brJ +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +gzm +gzm +gzm +gzm +gzm +gzm +gzm +gzm +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +cdO +jBO +iel +lZE +pqP +eOJ +iel +lZE +ttV +cdO +tBS +sDH +naV +nqj +deW +pDx +wBG +hoA +hoA +hoA +hoA +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(95,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +rzs +czn +czn +czn +czn +hoA +hoA +hoA +wfu +eTV +cYQ +qGz +kBi +kBi +vRI +tCW +ivR +qfP +eGU +wfu +eTr +eTr +eTr +eTr +hoA +tEV +hoA +qtk +czn +czn +czn +czn +czn +czn +czn +czn +brJ +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +gzm +ave +ave +cTA +njR +ave +ave +gzm +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +cdO +gDA +bLB +qmi +inn +xhY +sHi +mPY +tNW +cdO +nqj +nqj +nqj +nqj +nqj +nqj +nqj +hoA +hoA +hoA +hoA +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(96,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +rzs +czn +mzC +mzC +czn +hoA +hoA +hoA +wfu +eTV +naC +kTi +sxQ +ikU +ikU +wfu +wfu +iKE +wfu +wfu +hoA +hoA +hoA +hoA +hoA +tEV +hoA +xpG +bvL +bvL +bvL +bvL +bvL +bvL +bvL +bvL +lNF +hoA +hoA +hoA +hoA +hoA +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +gzm +ave +ewR +ave +ave +ave +ave +gzm +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +cdO +lxA +dBf +dBf +gzg +loR +coT +dBf +fgZ +cdO +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(97,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +pWp +czn +rzs +czn +mzC +mzC +czn +hoA +hoA +hoA +wfu +vLs +naC +mXF +jBV +gOs +oPT +wfu +iot +qTf +iot +wfu +hoA +hoA +hoA +hoA +hoA +tEV +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +mzC +gzm +ave +ave +hkP +ave +ave +ave +gzm +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +dht +cdO +cdO +cdO +maa +gTg +cdO +cdO +cdO +cdO +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(98,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +rzs +hoA +hoA +hoA +hoA +hoA +hoA +hoA +wfu +eTV +pmV +igE +wfu +wfu +wfu +wfu +nSE +iKE +nSE +wfu +hoA +hoA +hoA +hoA +hoA +tEV +hoA +hoA +hoA +hoA +gVV +gVV +tbu +tbu +tbu +gVV +gVV +tbu +tbu +tbu +gVV +gVV +nyl +nyl +nyl +nyl +nyl +czn +pWp +czn +mzC +czn +czn +czn +czn +mzC +czn +mzC +gzm +ave +ave +nus +ave +ave +ave +gzm +hoA +hoA +hoA +hoA +hoA +rPu +rPu +rPu +rPu +hoA +hoA +hoA +hoA +vSU +jzq +kKd +uto +jzq +dDy +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(99,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +adm +hoA +hoA +hoA +hoA +hoA +hoA +hoA +wfu +vFd +naC +ovi +wfu +sLH +wFw +ntP +wuA +stD +eHF +iJe +khs +khs +khs +khs +khs +ksT +hoA +hoA +hoA +hoA +gVV +uhf +hBO +tKE +bdl +wqI +sfC +xMr +uNR +bdl +tKE +gVV +nyl +mHI +jUG +jUG +mHI +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +hRW +gzm +gzm +gzm +uSB +lFz +gzm +gzm +gzm +gzm +gzm +gzm +hoA +hoA +rPu +bit +urs +rPu +hoA +hoA +hoA +hoA +vSU +hxX +sSM +kul +hxX +dDy +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(100,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +adm +hoA +hoA +hoA +hoA +hoA +hoA +hoA +wfu +gHe +fbp +mmT +akp +sad +gcY +gcY +gcY +uzm +exO +mHI +hoA +hoA +hoA +gVV +gVV +jle +tbu +tbu +tbu +gVV +gVV +tKE +cEM +uNR +qWR +nDC +bgB +nDC +tKE +uNR +bqq +gVV +gVV +mHI +lvA +lvA +mHI +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +mzC +mzC +fqo +dpZ +gzm +xQX +dAE +aby +vUt +gzm +doh +iQR +nnn +eWo +rPu +rPu +rPu +gXw +gXw +rPu +rPu +rPu +rPu +hoA +vSU +hxX +sSM +kul +hxX +dDy +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(101,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +giB +rht +rht +rht +loU +hoA +hoA +hoA +hoA +hoA +hoA +hoA +wfu +gaF +jVi +lJn +wfu +pRc +rls +rls +rls +cka +mmn +mHI +gVV +tbu +gVV +gVV +uIl +aDs +hBO +knV +bdl +eFy +rce +bgB +bdl +xGM +nDC +nDC +kDl +bgB +nDC +nDC +knV +tKE +bdl +mHI +lvA +nbd +mHI +czn +czn +czn +mzC +czn +czn +czn +czn +oxh +iAp +qly +dpZ +oky +bTl +tpR +vTD +grt +kYU +hOJ +jsE +nnn +eWo +jmh +tqo +vaD +gXw +gXw +vaD +tqo +bSQ +rPu +hoA +vSU +hxX +sSM +kul +hxX +dDy +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(102,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +czn +czn +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +kze +hoA +hoA +hoA +hoA +hoA +hoA +hoA +wfu +wfu +wfu +wfu +wfu +ffT +ffT +hXH +uvl +fXV +okT +mHI +wih +uNR +chZ +vcE +hBO +huN +jps +bdl +adL +nDC +nDC +syt +nDC +nDC +bgB +nDC +bdl +akR +adL +nDC +bgB +uNR +bdl +mHI +lvA +lvA +geN +geN +geN +geN +geN +hoA +hoA +hoA +hoA +gzm +gzm +gzm +gzm +gzm +nap +lpr +kiL +eCm +gzm +gzm +gzm +gzm +eWo +nCU +bSQ +jbE +meW +gXw +jbE +wPL +vOU +rPu +hoA +vSU +jzq +gzS +nrU +jzq +dDy +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(103,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +kze +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mHI +bOE +lvA +aNr +uvl +fXV +jQF +mHI +sGT +knV +hBO +uNR +iBF +mtC +nDC +nDC +bgB +nDC +tju +kDl +adL +akR +fVe +dEt +knV +uNR +uhf +nDC +nDC +nDC +hBO +mHI +lvA +lvA +geN +hgJ +hgJ +hgJ +geN +hoA +hoA +hoA +hoA +gzm +ave +ave +ave +bvZ +vGE +gzl +ilJ +hHB +tEX +ave +ave +ave +eWo +bSQ +tag +vnY +aIK +iqE +vnY +yjl +bSQ +rPu +jzq +jzq +jzq +fNm +uto +jzq +jzq +jzq +jzq +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(104,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +kze +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mHI +lvA +kfy +dNe +uvl +gFE +koC +pUJ +kjO +nDC +kDl +bgB +tMK +meA +nDC +bgB +nDC +uNR +oKO +tKE +nUd +tBE +uNR +vjn +kYb +uNR +knV +xPS +bgB +nDC +duh +mHI +sfK +aYA +geN +tGg +hgJ +hgJ +geN +hoA +hoA +hoA +hoA +gzm +slB +ave +ave +spI +tog +hMe +ilJ +mcL +mkK +ave +hGo +wor +eWo +rPu +rPu +rPu +gyP +gXw +rPu +rPu +rPu +rPu +att +att +att +uuK +hzd +bHs +bHs +eMI +jzq +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(105,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +djz +sch +sch +sch +vDr +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +qdu +qdu +qdu +qdu +qdu +gZW +asl +jtg +rLo +ygv +nDC +bgB +nDC +adL +bgB +lzN +kDl +nDC +tKE +bdl +hBO +tju +uNR +uNR +mqg +ogk +qFZ +knV +nYr +qWR +adL +bgB +uNR +mHI +ais +ais +geN +nNx +hgJ +hgJ +geN +hoA +hoA +hoA +hoA +gzm +ave +ave +ave +bvZ +mXV +hMe +ilJ +qrn +tEX +ave +ave +ave +eWo +bSQ +uPh +vnY +rfd +aIK +vnY +etn +tJp +rPu +tgG +vuw +ctc +lcD +ihQ +ihQ +gPz +tso +jzq +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(106,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +qdu +dqo +hMu +qIW +qdu +aFj +ayp +aAt +fyp +mHI +aeN +vYC +pBA +tju +uOk +bFu +ubq +qWE +nYr +uNR +xGM +tju +ubd +tKE +qFZ +mqg +ogk +uhf +hBO +bdl +nDC +kDl +knV +mHI +hUV +hUV +geN +hgJ +hgJ +hgJ +geN +geN +geN +hoA +hoA +gzm +xwO +xwO +xwO +xwO +xwO +ieW +nGJ +xwO +xwO +xwO +xwO +xwO +eWo +nCU +bSQ +jbE +gXw +aZu +jbE +bSQ +dlz +rPu +aIR +aIR +aIR +aIR +aIR +aIR +uuK +cKF +jzq +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(107,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +qdu +dqo +hMu +qIW +qdu +mHI +sLA +xNY +dRz +mHI +mHI +mHI +mHI +mHI +knV +raG +cEM +nYr +uNR +hBO +nYr +uNR +udS +mJC +kYb +uNR +knV +hBO +knV +adL +nDC +nDC +hNL +mHI +gux +xzo +geN +hgJ +qwI +iMr +utO +vIi +geN +hoA +hoA +gzm +ave +ave +ave +cEm +pqt +hMe +ilJ +hHB +eli +ave +ave +ave +eWo +mhD +wPL +vaD +gXw +aZu +vaD +bSQ +bSQ +rPu +lKw +eVU +aIR +lKw +rDT +aIR +uuK +cKF +jzq +hoA +hoA +hoA +czn +czn +qBJ +qBJ +hHI +hHI +hHI +qBJ +qBJ +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(108,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +czn +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +qdu +qdu +qdu +wrU +fLT +mHI +gOj +xWZ +eIT +sLC +hqn +lvA +lvA +mHI +bdl +hyf +uNR +tKE +tju +wnh +uNR +nYr +hBO +qWR +cEM +cIt +nYr +tKE +aRM +nDC +bgB +bdl +uNR +iNl +xoj +kcg +geN +faX +utO +jMm +jMm +vzE +geN +irQ +hoA +gzm +slB +hGo +ave +iUQ +wpz +hMe +ilJ +hqS +tFF +ave +hGo +wor +eWo +rPu +rPu +rPu +gXw +aZu +rPu +rPu +rPu +rPu +uJH +guZ +aIR +tys +lpM +aIR +uuK +cKF +jzq +hoA +hoA +hoA +czn +czn +qBJ +cVU +cVU +cVU +cVU +cVU +qBJ +czn +czn +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(109,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +qdu +ddU +qdu +qdu +kQb +mHI +pqy +rfg +uYb +aUk +jHy +pGr +lvA +mHI +hBO +rgs +keR +mdQ +tju +hBO +bdl +tKE +uhf +mst +hBO +knV +hBO +hjG +wBv +mvl +wIJ +wvD +tju +mHI +nQR +nCt +geN +pKz +oRs +cAw +sOU +wgQ +fOt +wzu +hoA +gzm +ave +ave +ave +cEm +uxS +hMe +ilJ +xsI +eli +ave +ave +ave +eWo +hXe +veK +jVI +gXw +gkr +qaH +buX +rPu +aIR +aIR +gGJ +aIR +tGp +aIR +aIR +uuK +aHW +jzq +hoA +hoA +hoA +czn +czn +qBJ +cVU +cVU +cVU +cVU +cVU +qBJ +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(110,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +qdu +nxX +mUe +vtN +tjT +mHI +rBW +rbA +uYb +mHI +mHI +mHI +mHI +mHI +mHI +xJC +sHO +mHI +iNl +iNl +mHI +iNl +iNl +mHI +iNl +iNl +mHI +mHI +mHI +dSt +kXs +mHI +mHI +mHI +pgx +gQa +geN +geN +geN +air +taR +eXN +fOt +wzu +hoA +gzm +xwO +xwO +xwO +xwO +xwO +qHn +elA +xwO +xwO +xwO +xwO +xwO +eWo +sfD +pny +kLM +feA +uaL +uZy +eWj +dOu +ikg +ikg +eDf +vWv +gTT +ikg +ezk +jDD +xdP +jzq +hoA +hoA +hoA +czn +czn +qBJ +cVU +cVU +cVU +cVU +cVU +qBJ +hHI +hHI +hHI +hHI +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(111,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +qdu +dqo +qdu +gNL +bte +mHI +xwl +sGY +bZo +dmR +oaj +lxj +lxj +aKa +lxj +fyA +noq +lxj +lxj +lxj +mlh +lxj +cjg +qef +xVB +pha +pha +acU +pha +sME +edq +pha +pha +pha +bnZ +vkY +eZJ +ckh +geN +blZ +taR +gHb +geN +kiI +hoA +gzm +ave +ave +ave +pQe +hzE +hMe +ilJ +fEh +cIK +ave +ave +ave +eWo +qWC +gXw +gXw +wXr +sHY +gXw +oqu +rPu +bgJ +aIR +wlb +aIR +pxq +vXv +aIR +uuK +pIU +jzq +hoA +hoA +hoA +czn +czn +hHI +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +hHI +hHI +hHI +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(112,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +czn +czn +czn +mzC +czn +mzC +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +qdu +qdu +qdu +qdu +qdu +sxg +wox +mHI +sBl +bHJ +bdD +jGI +qhu +nts +szn +fya +nts +uSM +pvk +dNx +oZG +oZG +uUP +jfq +wWw +fzX +jCb +oZG +oZG +vVN +oZG +qSl +oZG +oZG +jfq +oZG +lln +nXm +wDa +czH +geN +aYQ +taR +eXN +geN +irQ +hoA +gzm +slB +ave +ave +iEA +nBG +hMe +ilJ +bQW +tAB +ave +ave +wor +eWo +lhE +gXw +gXw +iLA +uHe +wBn +iqA +rPu +iTO +aIR +xby +aIR +tgh +tgh +aIR +uuK +cKF +jzq +hoA +hoA +hoA +czn +czn +hHI +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +hHI +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(113,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +qdu +qIW +rRw +qIW +qIW +qIW +eMO +mHI +xZW +lia +kDM +aZQ +wYL +fCk +xWy +jqJ +pEj +lHH +seX +xiq +ayT +ayT +ayT +cZk +qaZ +nmY +lra +ayT +eIW +lDs +ayT +qZP +cKP +ayT +nbN +ayT +ncr +gdf +hMw +skQ +geN +air +taR +eXN +fOt +wzu +hoA +gzm +ave +ave +ave +pQe +uxS +hMe +qHT +gqL +cIK +ave +ave +ave +eWo +rPu +rPu +cRm +sTe +bYk +hlC +rPu +rPu +aIR +aIR +aIR +aIR +aIR +aIR +aIR +uuK +cKF +jzq +hoA +hoA +hoA +czn +czn +hHI +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +hHI +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(114,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +qdu +dqo +dqo +dqo +hMu +qIW +ice +mHI +bHx +dxe +uYb +jUL +jUL +jUL +jUL +jUL +iAr +jdm +iAr +jUL +jUL +jUL +jUL +iAr +iAr +bVR +jUL +jUL +jUL +jUL +jUL +jUL +jUL +jUL +iAr +jUL +jUL +hbt +gtc +eBc +geN +nkQ +taR +eXN +fOt +wzu +hoA +gzm +xwO +xwO +xwO +xwO +xwO +omU +lNj +xwO +xwO +xwO +xwO +xwO +gzm +qEA +bdu +gNQ +sgu +kUi +kkR +uAB +kwG +pqF +kuU +jET +eLW +bQr +lWv +fOI +jWe +jqs +jzq +hoA +hoA +hoA +czn +czn +qBJ +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +hHI +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(115,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +qdu +dqo +dqo +dqo +hMu +qIW +jSP +vPk +eSl +etw +uYb +jUL +bnw +tJC +qFA +jTT +jTT +mYh +ldQ +xgl +uni +gYO +gmi +gmi +gmi +kFt +wXf +brT +rYc +dxQ +jQp +mLk +mHh +wlf +bvx +vgn +iLz +lAO +aWm +jhc +geN +air +taR +eXN +geN +kiI +hoA +gzm +vCT +vCT +vCT +xwO +mmF +fHo +ikF +bLT +qpp +iJK +jJY +jxc +gzm +iuS +ccd +rMd +rMd +xVt +vwF +mhX +fxa +aEp +lPU +fxa +aEp +mhX +mhX +cJB +okv +evy +qBJ +qBJ +qBJ +qBJ +qBJ +qBJ +qBJ +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +hHI +hHI +hHI +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(116,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +qdu +qIW +qIW +qIW +hMu +qIW +bkH +mHI +eNb +htn +lCP +jUL +fsb +aBG +qOX +uXd +nVh +jYC +vMt +vMt +vMt +oqG +mxb +mxb +jBs +mxb +mxb +gkj +eWm +qoI +ezJ +sdi +aFd +pwr +mfu +wUz +rvo +kbL +yeG +iZy +geN +air +taR +eXN +geN +irQ +hoA +gzm +pxQ +vQV +gvf +oky +lbl +uWB +xbG +ddr +ddr +trD +gxN +qnw +gzm +wpJ +pyo +vaD +vaD +vaD +vaD +cxx +vaD +vaD +gMq +gmn +gmn +gmn +nJE +rZz +tID +rwf +ibW +aOq +iJW +buU +mfb +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +hHI +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(117,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +osK +osK +osK +lmh +oAO +oAO +oAO +lmh +lmh +lmh +mqx +oyW +stQ +gdX +jUL +lxm +feV +hHv +sft +izQ +mgS +bif +bif +bif +eko +wbe +wbe +ngB +wbe +wbe +qDX +ucC +dWl +jZt +bXE +bXE +bXE +hLS +bXE +bXE +oWg +vUv +eBt +geN +air +taR +eXN +fOt +wzu +hoA +gzm +vQA +vCT +xtk +pSc +nTw +ncU +oPf +cPC +gzl +cPj +udN +oBE +gzm +lqw +jgx +vaD +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +spe +ukA +aIz +xNz +pSO +kci +rPq +qep +mfb +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +hHI +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(118,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +czn +mzC +mzC +mzC +czn +czn +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +osK +czn +czn +czn +mzC +fpS +mzC +czn +czn +czn +mqx +mRy +jOH +sPa +jUL +fsb +feV +hHv +sft +nyc +sNo +oqA +wdu +fwW +fRm +jUL +jUL +bqW +jUL +jUL +fUc +ucC +eED +jZt +bXE +crA +hkJ +rjU +rjU +evH +rBi +bkE +teP +geN +swS +pZs +hBP +fOt +wzu +hoA +gzm +nfx +vQV +ihe +oky +qcf +bhd +hSt +wgs +qzu +qNY +gQY +smX +gzm +hEH +xyR +vaD +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +spe +rZz +wME +pOi +uzr +ovc +ppa +xVa +mfb +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +cVU +hHI +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(119,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +pWp +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +mzC +mzC +czn +czn +czn +mzC +mzC +mzC +czn +czn +mzC +mzC +mzC +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +czn +czn +mzC +czn +czn +osK +czn +czn +vac +vac +vac +vac +vac +czn +czn +jUG +mRy +jOH +aUk +jUL +fsb +feV +hHv +sft +akm +igU +bif +pao +bif +fRm +jUL +flt +iPB +nMZ +jUL +fsb +bgn +too +wXm +bXE +cTP +eMh +ozk +fmQ +bXE +srL +bNb +bUM +geN +xzH +oRs +vzE +geN +kiI +hoA +gzm +vCT +vCT +vCT +xwO +uKV +cnR +sDM +wsv +sFK +hZT +mdi +oOw +gzm +tNq +gqY +vaD +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +spe +vaD +bSV +rPu +qBJ +mZD +vbK +xVa +mfb +cVU +cVU +dHo +lsf +lsf +iLp +cVU +cVU +cVU +cVU +liB +tUJ +tUJ +liB +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(120,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +czn +mzC +mzC +mzC +mzC +czn +czn +mzC +czn +mzC +czn +mzC +czn +czn +czn +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +mzC +mzC +czn +osK +czn +vac +vac +oDE +abj +oDE +vac +vac +czn +jUG +mRy +jOH +aUk +jUL +uDp +gIq +jrL +mIu +qLm +wZF +wZF +wZF +wZF +fRm +pAh +ena +lGN +iPB +bqW +qDC +nNn +tBZ +lGc +bXE +odr +gGM +dIJ +dzB +eJm +oWg +jyV +teP +geN +aGB +aGB +oDl +geN +geN +geN +gzm +gzm +gzm +gzm +gzm +gzm +gzm +gzm +gzm +gzm +hZT +mdi +cmx +gzm +hEH +kXg +vaD +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +spe +aYp +oRO +muT +qBJ +dRO +vbK +xVa +mfb +cVU +cVU +oNL +vWn +sdx +liB +liB +wAp +liB +wAp +liB +ndb +wwT +liB +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(121,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +mzC +czn +czn +mzC +czn +mzC +czn +czn +mzC +czn +czn +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +pWp +czn +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +osK +mzC +vac +fAa +oDE +oDE +oDE +fAa +vac +mzC +mqx +mRy +jOH +aUk +jUL +jUL +cqc +bfN +rJf +vtq +mNn +rJf +rJf +rJf +oub +jUL +eKW +yfl +iPB +jUL +bMw +veM +mMk +pZg +bXE +kVy +iOF +wFs +pQS +oLq +oWg +vUv +teP +geN +faX +faX +dgj +wOR +wOR +lOL +nYJ +llQ +sDw +faX +xzH +gzm +cQa +ldB +xcr +gzm +hZT +mdi +rgV +gzm +knd +kXg +vaD +kEQ +kEQ +kEQ +kEQ +aUy +kEQ +kEQ +kEQ +kEQ +kEQ +spe +evt +shU +xzz +qBJ +mZD +vbK +xVa +mfb +cVU +cVU +oNL +mZD +qox +liB +oZK +jjQ +uTG +oxr +ugY +ndb +hIZ +liB +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(122,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +mzC +czn +czn +czn +hoA +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hoA +hoA +hoA +hoA +osK +czn +vac +fAa +oDE +oDE +oDE +fAa +vac +czn +jUG +wrT +tti +aUk +jUL +jUL +jUL +jUL +jUL +jUL +jUL +bqW +bqW +bqW +jUL +jUL +jUL +cKd +jUL +jUL +jUL +jUL +jUL +jUL +bXE +uvg +uvg +uvg +bXE +bXE +oWg +vUv +teP +geN +foH +mCm +dBj +jax +jax +ryE +jax +jax +bli +hlM +eqF +eYw +pbW +nGi +kZK +erk +pQk +xVN +oBE +gzm +hEH +kXg +vaD +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +spe +jWM +oRO +kHk +qBJ +nfc +vbK +xVa +mfb +cVU +cVU +oNL +mZD +qox +wAp +dnx +fYt +fos +pqA +pqA +ndb +cpI +liB +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(123,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +czn +hoA +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hoA +hoA +hoA +hoA +osK +czn +vac +fAa +oDE +oDE +oDE +fAa +vac +czn +jUG +nQO +gpR +diq +mHI +uMu +cQw +vzH +bOl +ksm +ksm +ksm +ksm +ksm +ksm +bOl +vzH +ksm +qvc +ksm +ksm +ksm +bOl +vzH +ksm +ksm +ksm +ksm +ikV +uMu +xtj +vUv +cTE +geN +tww +lWX +voT +ffB +aut +jYW +jNd +aut +qUE +bZi +oRs +gzm +hFm +brQ +fpc +gzm +sXQ +vBb +dAi +gzm +cJR +kXg +vaD +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +spe +vaD +bSV +rPu +qBJ +mZD +vbK +xVa +mfb +cVU +cVU +oNL +vAQ +fuN +qOy +gYE +dWG +sCf +ndb +ndb +ndb +bah +tUJ +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(124,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +czn +czn +czn +czn +mzC +czn +czn +cYJ +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +czn +hoA +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +mzC +czn +czn +ued +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hoA +hoA +hoA +hoA +osK +czn +vac +fAa +oDE +oDE +oDE +fAa +vac +czn +jUG +jrw +jlV +uvl +ben +uMu +eXt +pAo +mDR +mDR +mDR +mDR +mDR +mDR +mDR +mDR +mDR +mDR +mDR +mDR +mDR +mDR +mDR +mDR +mDR +mDR +mDR +pwg +bJC +uMu +oWg +vUv +teP +geN +geN +kki +geN +geN +geN +iht +geN +fOt +geN +geN +geN +gzm +gzm +gzm +gzm +gzm +gzm +gzm +gzm +gzm +hEH +kXg +vaD +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +spe +rZz +oRO +bvm +qBJ +uoC +qRE +xVa +mfb +cVU +cVU +oNL +aGZ +qox +vfk +dnx +gvm +xgm +ndb +aiq +ndb +nmm +tUJ +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(125,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +czn +czn +czn +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +hoA +hoA +hoA +hoA +jbg +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +mzC +czn +slM +slM +slM +slM +slM +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +mzC +mzC +rSB +rSB +nZs +nZs +nZs +nZs +nZs +mzC +vac +fAa +fAa +fAa +fAa +fAa +vac +mzC +mqx +hgh +jlV +uvl +uvl +mqn +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +npw +vUv +teP +cxH +qLt +nto +xKE +cxH +hEC +lPA +cIV +pLq +rcm +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +gih +rPu +qjI +kXg +vaD +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +kEQ +spe +rZz +oRO +bvm +qBJ +mZD +vbK +xVa +elC +iLp +cVU +obn +nYh +gsz +eUw +cbD +rcj +bMt +nxq +nxq +nxq +nip +tUJ +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(126,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +czn +czn +czn +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +vlO +vlO +vlO +vlO +vlO +vlO +vlO +vlO +vlO +vlO +vlO +vlO +vlO +slM +slM +slM +slM +slM +rBc +rBc +rBc +slM +slM +slM +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +czn +czn +mzC +mzC +mzC +czn +mzC +rSB +rSB +iDN +iDN +iDN +iDN +iDN +nZs +czn +vac +vac +vac +vac +vac +vac +vac +czn +jUG +jrw +jlV +uvl +uwy +uMu +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +jWZ +uMu +vQm +vUv +teP +cxH +iLj +eXb +cNS +cxH +fxw +qZd +fxw +fcN +fxw +fxw +fxw +fxw +fxw +irQ +hoA +hoA +hoA +hoA +eGT +vaD +hEH +kXg +vaD +vaD +vaD +vaD +gDv +vaD +vaD +lma +gmn +gmn +gmn +rfA +rZz +oRO +chl +qBJ +xxN +vbK +gJt +aGa +elC +lsf +rpL +uAt +hRk +eJu +kRI +mGT +eLC +ndb +kwm +liB +liB +liB +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(127,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +czn +czn +oQx +oQx +oQx +oQx +oQx +aHm +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +hHC +hHC +hHC +hHC +vlO +uHa +uHa +uHa +uHa +uHa +uHa +uHa +slM +rBc +rBc +rBc +slM +rBc +rBc +rBc +slM +slM +slM +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +rSB +mtV +cdv +cdv +cdv +cjZ +vIU +nZs +czn +czn +hoA +hoA +hoA +hoA +hoA +czn +czn +jUG +jrw +jlV +uvl +wbw +sjd +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +oWg +vUv +teP +cxH +iLj +eXb +sgD +cxH +dGr +iLn +rAk +gLh +gLh +eJx +gZf +roi +fcN +wzu +hoA +hoA +hoA +hoA +eGT +vaD +hEH +hbF +pmM +kCy +btv +lpO +kCy +btv +lpO +djT +vLW +qKg +ndv +ndv +xnV +oRO +juX +qBJ +hUy +pbY +kfF +vhI +sMJ +dqg +jsM +sJP +csW +liB +jsa +xCk +nEN +ndb +pUy +liB +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(128,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +mzC +mzC +oQx +oQx +oQx +oQx +xVn +iOe +iOe +cEC +pkn +pNr +iOe +iOe +oQx +oQx +oQx +oQx +cUL +cUL +cUL +cUL +cUL +cUL +vlO +vlO +vlO +vlO +vlO +vlO +slM +rBc +rBc +rBc +slM +rBc +rBc +rBc +slM +slM +slM +czn +czn +mzC +czn +czn +mzC +czn +czn +mzC +czn +czn +mzC +mzC +mzC +czn +mzC +rSB +mtV +mtV +mtV +mtV +kbS +iDN +nZs +czn +czn +hoA +hoA +hoA +hoA +hoA +czn +czn +mqx +qAD +jlV +uvl +wbw +sjd +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +sSw +fDO +teP +cxH +mlz +uwp +ybg +cxH +tqs +iLn +lPs +btx +btx +dbh +iJv +uQy +fcN +wzu +hoA +gih +oHa +oHa +fZf +rPu +ehm +dHj +vJZ +azG +eNQ +hJz +oTH +fck +fck +fck +fck +fck +hwY +whM +ost +rZG +sCa +qBJ +qBJ +qBJ +qBJ +qBJ +lPe +liB +liB +liB +liB +liB +usN +cTS +hIZ +ndb +kaS +liB +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(129,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +czn +czn +oQx +oQx +oQx +iOe +aHm +aHm +aHm +aHm +iOe +aHm +aHm +aHm +xVn +oQx +oQx +oQx +iJf +iJf +tkO +iJf +iJf +cUL +czn +czn +czn +czn +czn +czn +slM +rBc +rBc +rBc +slM +rBc +rBc +rBc +rBc +slM +czn +czn +czn +mzC +czn +czn +mzC +czn +czn +mzC +czn +czn +mzC +mzC +mzC +czn +mzC +rSB +mtV +mtV +mtV +mtV +kbS +efH +nZs +czn +czn +czn +hoA +hoA +hoA +czn +czn +czn +mqx +jrw +jlV +uvl +wbw +sjd +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +wGT +hLf +oqH +cxH +cxH +ucS +cxH +cxH +ylZ +agx +fxw +fxw +fxw +fxw +gBN +fLm +fxw +fxw +fxw +fxw +cMS +fcN +fxw +xvL +pPZ +mUC +vjo +xvL +xvL +xvL +fck +tgz +kUI +eNQ +fck +fck +qhS +del +jCX +jer +kDe +gHi +vLU +vLU +vLU +vLU +ygx +liB +ifF +nOm +dpW +cMQ +mVq +uSE +riS +fYt +jpT +liB +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(130,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +czn +oQx +oQx +oQx +jNv +aHm +iOe +iOe +iOe +iOe +iOe +fBJ +iOe +iOe +oQx +oQx +oQx +cgO +iJf +tkO +iJf +iJf +cUL +czn +czn +czn +czn +czn +czn +slM +rBc +rBc +rBc +slM +rBc +rBc +rBc +rBc +slM +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mqx +mqx +mqx +mqx +mqx +mqx +mqx +mqx +mqx +mqx +mqx +jUG +jUG +jUG +mqx +mqx +mqx +mqx +nQO +gpR +diq +mqx +mBE +gyn +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +bJC +uMu +jGX +fwZ +plx +dpL +bQQ +xHE +ibm +mUV +mUV +cHH +mUV +mUV +hok +dFK +mUV +mUV +mUV +mUV +vRc +hKf +fSb +nHy +nHy +bYH +ntK +cUG +iWx +nTA +aWF +xvL +rPu +rPu +rPu +rPu +rPu +fck +cBO +aSf +cUd +cUd +cUd +cUd +cUd +cUd +cUd +cUd +liB +liB +cIv +hyH +nAn +tjd +mVq +vYu +fsd +ndb +kaS +liB +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(131,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +czn +oQx +oQx +oQx +iOe +aHm +fES +oQx +rGV +oQx +oQx +eSp +oQx +iOe +oQx +oQx +oQx +iJf +iJf +tkO +iJf +iJf +cUL +cUL +cUL +cUL +cUL +cUL +cUL +cUL +rBc +rBc +rBc +slM +rBc +rBc +rBc +rBc +slM +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +czn +mzC +mHI +bTC +kIY +eAE +kIY +kIY +kgx +kIY +kIY +xqp +kIY +kIY +kIY +kIY +kIY +kIY +hPL +kIY +qQE +dHR +buH +opu +mBE +ifw +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +wct +jrN +xKf +xKf +xKf +srx +gwJ +qKJ +qKJ +pGy +dDQ +dDQ +pFN +dDQ +dDQ +jdF +wdl +cVW +hLb +ujm +wSd +aYx +aYx +iXb +uNL +dHt +fXX +fpJ +gjm +xvL +aLE +lXP +aLE +aLE +rPu +fck +cBO +aSf +cUd +vYA +kqQ +qGE +cUd +tWG +mDT +cUd +omm +liB +liB +jms +hyH +tBL +mVq +cTS +vRE +ndb +vgx +liB +czn +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(132,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +vyp +oQx +oQx +oQx +hco +iOe +iOe +eKI +cel +aQx +oQx +aHm +oQx +jNv +oQx +oQx +oQx +tkO +tkO +gwt +tkO +tkO +cUL +iJf +iJf +iJf +iJf +iJf +iJf +cUL +rBc +rBc +rBc +slM +rBc +rBc +rBc +rBc +slM +xpJ +czn +czn +czn +mzC +mzC +mzC +czn +mzC +czn +czn +mzC +czn +czn +mzC +czn +mzC +jUG +mHF +sBQ +hDw +oEu +oEu +oEu +oEu +oEu +oEu +eAv +oEu +uLV +oEu +oEu +oEu +eKZ +oEu +lpN +tVn +oHN +blq +mBE +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +gGo +uMu +sbv +amr +jIo +jIo +jIo +xXv +jIo +jIo +jIo +jIo +jIo +jIo +jIo +jIo +jIo +xXv +pSq +hMA +vOa +hKf +bOp +nzB +ydb +frn +jVD +jVD +sQK +sai +ago +xvL +aLE +lXP +aLE +aLE +rPu +kDT +cBO +aSf +cUd +qAT +oZs +hfA +cUd +elz +vKt +cUd +qis +jja +rYZ +mpi +uQO +wpo +kHI +hdQ +onR +ndb +vgx +liB +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(133,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +czn +oQx +oQx +oQx +iOe +aHm +xtY +mZR +ivw +oQx +oQx +jNv +oQx +pKB +oQx +oQx +oQx +iJf +iJf +tkO +iJf +iJf +cUL +cUL +cUL +cUL +cUL +cUL +cUL +cUL +rBc +rBc +rBc +slM +rBc +rBc +rBc +rBc +slM +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +jUG +mHF +qbd +aUk +pFE +sln +mHj +pFE +pFE +pFE +xnD +pFE +qxR +pFE +sln +pFE +qMp +pFE +xGc +pFE +mzG +rHg +mBE +eXt +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +pqN +cFL +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +xJG +fxw +fxw +fxw +fxw +xvL +vBf +jzE +oSF +nVS +vTJ +xvL +lXP +lXP +aLE +aLE +rPu +dfS +ifT +cYz +fbr +hYP +mNA +tJe +xqs +nvq +uuQ +cUd +xaO +uyR +liB +liB +liB +liB +puX +tiX +liB +pUq +liB +liB +liB +liB +tUJ +liB +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(134,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +czn +oQx +oQx +oQx +jNv +aHm +iOe +iOe +iOe +iOe +iOe +iOe +iOe +iOe +oQx +oQx +oQx +iJf +iJf +tkO +iJf +iJf +cUL +czn +czn +czn +czn +czn +czn +slM +rBc +rBc +rBc +slM +rBc +rBc +rBc +rBc +slM +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +jUG +mHF +qbd +iIs +mHI +mHI +mHI +mHI +mHI +mHI +gbA +mHI +mHI +mHI +mHI +mHI +rqV +mHI +mHI +mqx +mqx +mqx +mBE +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +liy +uwI +ngd +vkh +ngd +ngd +ngd +vkh +ngd +ngd +ngd +vkh +ngd +ngd +ngd +vkh +ngd +rnN +aHh +fxw +vVh +vVh +vVh +xvL +oEk +hTe +oSF +fpJ +gjm +xvL +aLE +aLE +aLE +aLE +rPu +lwc +evy +hEH +bil +fiX +bcW +mIS +cUd +eHI +iMW +cUd +wBI +dFl +gyp +liB +ssG +ssG +uvE +fVJ +liB +ndb +fLk +wgj +wgj +wgj +ndb +tUJ +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(135,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +czn +czn +oQx +oQx +oQx +iOe +aHm +aHm +aHm +aHm +iOe +aHm +aHm +aHm +xVn +oQx +oQx +oQx +iJf +iJf +tkO +iJf +iJf +cUL +czn +czn +czn +czn +czn +czn +slM +slM +slM +slM +slM +rBc +rBc +rBc +rBc +slM +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +mHI +mHF +qbd +sWC +mHI +vWr +kum +mEb +qDs +arU +bHe +mEb +mEb +kdf +oal +pcf +wlm +rGS +mtV +nZs +mtV +mtV +mBE +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +mwB +nLe +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +mWl +yaM +fxw +fxw +fxw +vVh +xvL +oEk +hTe +evm +sai +eGl +xvL +aLE +aLE +aLE +aLE +rPu +fck +rpM +aLQ +cUd +iZg +nGZ +jst +cUd +aqc +qdU +cUd +liB +liB +liB +liB +ssG +ssG +uvE +fVJ +liB +mUA +hyH +hyH +hyH +hyH +nvr +liB +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(136,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +mzC +mzC +oQx +oQx +oQx +oQx +xVn +iOe +iOe +bcF +cOQ +ekF +iOe +iOe +oQx +oQx +oQx +oQx +cUL +cUL +cUL +cUL +cUL +cUL +vlO +vlO +vlO +vlO +vlO +vlO +slM +rBc +rBc +rBc +slM +slM +slM +slM +slM +slM +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +jUG +mHF +qbd +haB +mHI +ccq +gmK +mEb +mEb +qDn +apo +mEb +mEb +mRl +oal +oEA +bHl +hkH +mtV +nZs +mtV +mtV +mBE +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +liy +nLe +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +mWl +yaM +yaM +yaM +fxw +vVh +xvL +oEk +hTe +hlj +nVS +kTd +xvL +aLE +aLE +tOc +iSS +xvL +xvL +rsB +xvL +cUd +cUd +cUd +cUd +cUd +frc +aZL +cUd +eVW +tLU +lXP +ssG +ssG +oAS +mhS +fVJ +liB +mUA +hyH +rxH +qRo +hyH +nvr +liB +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(137,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +czn +czn +oQx +oQx +oQx +oQx +oQx +aHm +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +hHC +hHC +hHC +hHC +vlO +uHa +uHa +uHa +uHa +uHa +uHa +uHa +slM +rBc +rBc +rBc +slM +kVM +kVM +kVM +kVM +tGr +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +jUG +mHF +qbd +iIs +mHI +wWb +mEb +mEb +tGb +mYl +bHe +mEb +pSN +cgm +oal +tVT +rGS +mtV +mtV +nZs +mtV +mtV +mBE +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +liy +nLe +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +bxI +ngd +rnN +jGF +fxw +vVh +xvL +oEk +hTe +hlj +pXt +sJk +xvL +xvL +xvL +xvL +ssG +xvL +oCI +uTz +qtt +czZ +dTj +eHL +uUL +cUd +dLB +lgk +cUd +ssG +kSf +vbD +fbf +fbf +klq +wKT +krb +liB +mUA +hyH +ekY +pKd +hyH +nvr +liB +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(138,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +czn +czn +czn +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +vlO +vlO +vlO +vlO +vlO +vlO +vlO +vlO +vlO +vlO +vlO +vlO +slM +slM +slM +slM +slM +kVM +kVM +kVM +kVM +tGr +tGr +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +jUG +mHF +qbd +mHn +mHI +kdf +mEb +mEb +mYl +gZt +bHe +mEb +gfP +mYl +oal +iDN +tpU +tpU +nZs +nZs +mtV +mtV +mBE +ifw +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +sFS +uMu +liy +nLe +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +mWl +yaM +fxw +vVh +xvL +oEk +hTe +obI +lPm +nMo +xvL +aCh +aCh +xvL +ssG +xvL +mHA +bXe +eot +mHA +mHA +nNp +gVs +cUd +rEQ +pMM +cUd +lXP +fVJ +lXP +ssG +ssG +ssG +uvE +ssG +liB +mUA +hyH +hyH +hyH +hyH +nvr +liB +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(139,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +czn +czn +czn +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +oQx +hoA +hoA +hoA +hoA +hoA +nTR +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +tGr +kVM +kVM +kVM +kVM +kVM +kVM +tGr +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mHI +mHF +qbd +iIs +mHI +wFG +eOe +foq +tZw +tZw +kVq +mEb +pSN +teI +oal +iDN +rGS +mtV +nZs +mtV +mtV +mtV +mBE +ttI +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +gGo +uMu +mzN +nLe +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +mWl +yaM +fxw +vVh +xvL +oEk +hTe +ciN +mRe +uwH +cZM +cZM +unT +gvJ +cNE +xvL +cbq +xvL +xvL +xvL +qRB +xyk +aHL +xvL +lTz +aLE +aLE +lXP +fVJ +lXP +kbZ +ssG +ssG +uvE +ssG +liB +ndb +ndb +qLd +svx +fuB +ndb +tUJ +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(140,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +czn +czn +czn +czn +mzC +czn +czn +hrn +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +czn +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +tGr +kVM +kVM +kVM +kVM +kVM +kVM +tGr +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +jUG +mHF +qbd +iIs +mHI +mEb +mEb +nDm +mEb +mEb +mEb +kum +oUz +ccq +oal +iDN +rGS +pUX +nZs +mtV +mtV +mtV +mBE +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +gig +nLe +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +mWl +aHh +fxw +vVh +xvL +oEk +hTe +qlg +aCh +grw +aCh +aCh +aCh +xvL +maA +xvL +cbq +xvL +aCl +jVD +xvL +bVD +tgv +xvL +lTz +aLE +aLE +lXP +xQR +lXP +ssG +ssG +ssG +uvE +ssG +liB +liB +liB +liB +liB +liB +liB +liB +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(141,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +czn +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +tGr +kVM +kVM +kVM +kVM +kVM +kVM +tGr +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +jUG +mHF +qbd +iIs +mHI +xul +ibP +nDm +mEb +ibP +ibP +oal +oal +oal +oal +iDN +rGS +mtV +nZs +mtV +mtV +mtV +mBE +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +liy +nLe +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +mWl +xJG +fxw +vVh +xvL +oEk +dzC +jzE +aCh +grw +aCh +aCh +vLA +xvL +maA +xvL +xvL +xvL +jvP +jVD +xvL +pcU +fhV +xvL +lTz +aLE +aLE +lXP +fVJ +lXP +vYc +ssG +ssG +uvE +ssG +lXP +aLE +aLE +aLE +aLE +aLE +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(142,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +mzC +czn +czn +czn +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +tGr +tGr +kVM +kVM +kVM +kVM +tGr +tGr +czn +czn +czn +czn +czn +czn +czn +czn +czn +pWp +czn +czn +czn +czn +czn +czn +jUG +mHF +qbd +iIs +mHI +gHY +pHn +uOR +cor +hmG +kyN +oal +suJ +suJ +tpU +iDN +nhJ +suJ +nZs +nZs +nZs +nZs +mBE +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +liy +nLe +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +mWl +yaM +fxw +vVh +xvL +oEk +oEk +hTe +aCh +grw +aCh +aCh +eEa +xvL +uYY +uLp +cNE +xvL +gBc +nlu +iMd +xyk +nsg +xvL +lTz +aLE +aLE +lXP +fVJ +lXP +ssG +ssG +ssG +uvE +ssG +lXP +aLE +aLE +aLE +aLE +aLE +lXP +lXP +lXP +lXP +lXP +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(143,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +tGr +tGr +tGr +tGr +tGr +tGr +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +mHI +tyS +aWj +rSv +mHI +fXv +xyH +nDm +mEb +fzQ +pbZ +oal +mga +iDN +iDN +efH +iDN +iDN +iDN +iDN +iDN +iDN +mqn +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +gka +pif +pif +laT +eII +uMu +liy +nLe +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +sos +cMB +hOu +gVw +fxw +vVh +xvL +oEk +oEk +hTe +aCh +grw +aCh +aCh +rLm +xvL +ssG +lXP +maA +xvL +xvL +xvL +xvL +nSv +xvL +xvL +sqd +lXP +lXP +lXP +fVJ +lXP +ssG +ssG +ssG +uvE +ssG +lXP +aLE +aLE +aLE +aLE +aLE +lXP +vpt +vpt +vpt +vpt +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(144,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +fTi +mzC +czn +czn +mzC +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +jUG +mHF +vUn +lZp +lKL +eME +lNx +cEn +mEb +kdf +fMq +fMq +nZs +nZs +nZs +nZs +nZs +nZs +nZs +nZs +nZs +nZs +mBE +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +aXQ +nLe +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +mWl +yaM +yaM +yaM +fxw +vVh +xvL +oEk +oEk +eMB +tRU +grw +aCh +aCh +bGx +xvL +ssG +lXP +pwb +uLp +uLp +uLp +uLp +bEn +gYB +gYB +jmN +wwq +wwq +wwq +gfy +lXP +lXP +lXP +lXP +vOZ +lXP +lXP +lXP +lXP +lXP +lXP +lXP +lXP +lXP +lXP +lXP +lXP +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(145,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hoA +hoA +hoA +hoA +hoA +jUG +mHF +qbd +iIs +mqx +fMq +fMq +fMq +fMq +fMq +fMq +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +mBE +ifw +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +bJC +uMu +liy +nLe +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +vVh +mWl +aHh +fxw +fxw +fxw +fxw +xvL +xvL +xvL +xvL +xvL +qtX +rPp +rPp +xvL +xvL +eqy +eqy +rGu +eqy +inF +inF +lXP +lXP +lXP +lXP +lXP +lXP +lXP +lXP +fVJ +ssG +ssG +ssG +ssG +mXv +svO +svO +svO +svO +svO +svO +svO +svO +svO +svO +lLY +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(146,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hoA +hoA +hoA +hoA +hoA +jUG +mHF +qbd +haB +mqx +bNB +flM +cJQ +eKz +bNB +mLy +czn +czn +oLd +oLd +oLd +oLd +oLd +czn +czn +czn +czn +mBE +eXt +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +gGo +uMu +liy +xqT +mFv +ucJ +kOh +cMB +cMB +ouB +cMB +cMB +cMB +ouB +cMB +cMB +cMB +ouB +cMB +hOu +yaM +uyG +sQH +gFJ +kUr +jnG +hQZ +wqS +sQH +sQH +kmU +xvi +xvi +fTt +woS +aCb +ibU +iIL +eqy +aLE +aLE +lXP +aLE +aLE +aLE +aLE +aLE +aLE +lXP +fVJ +ssG +lXP +lXP +lXP +lXP +lXP +lXP +lXP +fab +fab +fab +lXP +lXP +lXP +lXP +uvE +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(147,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +mzC +czn +mzC +czn +czn +mzC +mzC +hoA +hoA +hoA +hoA +hoA +mHI +vKu +qbd +mHn +mqx +lLa +rAg +ewu +xwA +bNB +mLy +czn +oLd +oLd +lLt +gAF +lLt +oLd +oLd +mzC +mzC +mzC +mBE +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +jWZ +uMu +liy +yaM +yaM +yaM +cFL +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +yaM +dKb +pDg +pDg +xvp +sxp +pfv +pDg +pDg +hpX +uEI +pDg +pDg +fHF +glw +glw +kjV +wRa +eqy +eqy +eqy +eqy +eqy +eqy +eqy +eqy +lXP +lXP +lXP +fVJ +ssG +lXP +aLE +aLE +lXP +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +lXP +uvE +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(148,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +hoA +hoA +hoA +hoA +hoA +czn +mzC +mzC +hoA +hoA +hoA +hoA +hoA +jUG +mHF +qbd +iIs +mqx +bNB +ygz +tmS +ygz +bNB +mLy +mzC +oLd +lLt +qpI +ncX +ncX +ncX +oLd +czn +czn +czn +mBE +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +wdV +auR +auR +auR +ibh +pBP +pBP +pBP +pBP +pBP +pBP +pBP +pBP +pBP +cLW +mwX +bdx +ipW +xGI +qtG +pcF +jzZ +hMt +xke +hMq +gdd +jzZ +miQ +lVW +jzZ +jzZ +enz +jzZ +jzZ +pEB +vVz +eqy +aCx +aCx +aCx +rAW +jrE +lhd +eqy +ssG +ssG +lXP +wla +vOV +lXP +aLE +aLE +lXP +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +fab +uvE +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(149,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +hoA +hoA +hoA +hoA +hoA +mzC +hoA +hoA +hoA +hoA +hoA +hoA +hoA +jUG +mHF +qbd +wbB +mqx +bNB +ygz +jla +ygz +yil +mLy +czn +oLd +lLt +ncX +ncX +ncX +ncX +oLd +hoA +hoA +hoA +mBE +gyn +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +laT +eII +uMu +dQe +gAH +gAH +gAH +tSX +ggX +jVF +jVF +jVF +jVF +jVF +jVF +jVF +jVF +nBM +dST +tpK +fxw +eqy +eqy +eqy +eqy +eqy +eqy +eqy +eqy +eqy +eqy +prq +wOg +wOg +nma +lSH +prq +dqx +ahj +prq +prq +aCx +aCx +rAW +aRz +pVh +kpA +rlA +gBa +lXP +lXP +fVJ +lXP +aLE +aLE +lXP +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +fab +uvE +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(150,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +mzC +mzC +hoA +hoA +hoA +hoA +hoA +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +jUG +pVa +kiM +qdw +mqx +mLy +pBQ +tbv +pBQ +mLy +mLy +czn +oLd +tBC +ncX +ncX +ncX +ncX +oLd +hoA +hoA +hoA +mBE +laT +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +rRo +axN +uMu +lyn +gfK +dkR +eim +wYH +uXr +nWb +cPf +nWb +nWb +nWb +cPf +hKF +glm +pTA +iGu +tIW +tIW +pmw +nMU +tIW +grR +tLi +ils +tLi +tIW +rjt +rjt +prq +bEk +hii +vQB +hii +tOG +uJB +hii +vtd +prq +aCx +aCx +rAW +mUy +mOt +eqy +eld +eob +ssG +lXP +fVJ +lXP +aLE +aLE +lXP +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +fab +uvE +lXP +czn +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(151,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hoA +hoA +hoA +hoA +hoA +czn +hoA +hoA +hoA +yhz +yhz +dYg +dYg +mHI +wIr +hmV +wIr +mqx +vMu +vMu +vMu +vMu +vMu +mLy +czn +oLd +lLt +ncX +ncX +ncX +ncX +oLd +hoA +hoA +hoA +mBE +djx +eII +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +pif +spH +eII +uMu +fxw +fxw +fxw +vVh +pys +snv +fxw +fxw +jWo +jWo +jWo +fxw +fxw +oGf +qhi +yas +qAq +xbo +pEU +kGu +tIW +iTT +ayi +eBq +xls +tIW +rjt +rjt +prq +opQ +omC +rmM +nSn +nSn +lGw +kil +nDe +prq +aCx +aCx +rAW +sIF +mOt +eqy +xot +mkD +gtp +fQB +vOo +lXP +aLE +aLE +lXP +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +lXP +kgG +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(152,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +mzC +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +yhz +bpw +jSk +jMn +vpj +fQK +hDQ +yag +mLy +vMu +fpI +fpI +fpI +vMu +mLy +mzC +oLd +lLt +lLt +ncX +ncX +ncX +oLd +czn +czn +czn +mBE +ifw +kSj +ksm +ksm +ksm +ksm +ksm +ksm +ksm +ksm +ksm +ksm +ksm +ksm +ksm +ksm +ksm +ksm +ksm +ksm +ksm +aOu +bJC +uMu +nXK +yff +fxw +vVh +nVn +snv +fxw +gEd +gEd +gEd +gEd +gEd +fxw +ama +iDj +iDj +jRJ +gmH +xBP +lwg +wSZ +mUc +sqo +tgu +eDX +tIW +rjt +rjt +prq +tEs +dEs +laz +tdC +xOD +oHl +lbZ +efV +prq +oug +oug +rAW +dRm +hxM +eqy +ssG +ssG +ssG +lXP +fVJ +lXP +aLE +aLE +lXP +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +fab +uvE +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(153,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +czn +hoA +hoA +hoA +hoA +hoA +yhz +yhz +dYg +dYg +yhz +yhz +lJK +nkD +miO +tou +oYS +dKx +mFx +mLy +vMu +fpI +fpI +fpI +vMu +mLy +czn +oLd +oLd +lLt +tgg +lLt +oLd +oLd +mzC +mzC +mzC +mBE +wVJ +mDR +fHg +mDR +mDR +mDR +mDR +mDR +fHg +mDR +mDR +mDR +mDR +mDR +fHg +mDR +mDR +mDR +mDR +mDR +fHg +kKU +trB +oGG +iuF +sSS +fxw +vVh +hqG +snv +fxw +gsj +gEd +gEd +gEd +gEd +fxw +jWo +jWo +fxw +jRJ +lxN +kqF +ofB +seF +rvN +ukk +jZb +wno +tIW +rjt +rjt +prq +uzy +omC +msS +heY +exP +xhu +kil +kyt +ciM +vhf +afa +sNx +fKw +sZB +eqy +lXP +lXP +lXP +lXP +xos +lXP +aLE +aLE +lXP +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +fab +uvE +lXP +czn +czn +czn +czn +czn +czn +czn +czn +kDD +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(154,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hoA +hoA +hoA +yhz +yhz +yhz +xWQ +eTw +eTw +xDK +eTw +eTw +aeK +aeK +dUn +gdc +ekH +xYl +mLy +vMu +fpI +fpI +fpI +vMu +mLy +czn +czn +oLd +oLd +oLd +oLd +oLd +czn +czn +czn +czn +mBE +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +eAN +uMu +epu +nll +fxw +nQC +kud +snv +jWo +gEd +gEd +gEd +gEd +gEd +gEd +gEd +gEd +gEd +jRJ +apU +ifb +xTT +wSZ +ush +mhx +bHN +dWY +tIW +rjt +rjt +prq +gLi +omC +vZR +rrg +lfL +sKX +qsP +xmc +mHN +eqx +swl +dfL +lqv +sLF +eqy +aLE +ede +ssG +ssG +oLS +lXP +aLE +aLE +lXP +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +fab +uvE +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(155,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +mzC +hoA +hoA +hoA +yhz +qUm +fQK +dNb +kSL +kff +kff +kff +lIa +rRL +qaU +ulD +aaZ +iis +iMe +mLy +vMu +vMu +vMu +vMu +vMu +mLy +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +mBE +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +uMu +fMf +kgF +gsk +krS +eCd +snv +jWo +gEd +gEd +gEd +gEd +gEd +gEd +gEd +gEd +gEd +jRJ +rCi +fTz +odc +tIW +guV +qGr +rnz +xSM +tIW +rjt +rjt +prq +tET +sBV +vrV +sBV +sBV +gPa +hcJ +iIo +prq +eqy +eqy +eqy +eqy +eqy +eqy +aLE +ede +ssG +ssG +fVJ +lXP +aLE +aLE +lXP +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +lXP +uvE +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(156,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +hoA +hoA +hoA +dYg +lfW +oYS +ikA +bOJ +yhz +yhz +aNv +yhz +yhz +oWu +qmn +sdQ +yhz +yhz +mLy +mLy +mLy +mLy +mLy +mLy +mLy +cDI +cDI +cDI +cDI +cDI +cDI +cDI +cDI +cDI +cDI +cDI +cDI +yhz +yhz +yhz +txY +txY +txY +txY +txY +txY +fSg +fSg +fSg +fSg +fSg +fSg +fSg +fSg +fSg +fSg +fSg +fSg +fxw +fxw +fxw +fxw +fxw +fxw +oGf +rDL +snv +jWo +gEd +gEd +gEd +gEd +gEd +gEd +gEd +gEd +gEd +jRJ +jRJ +jRJ +tNp +tIW +tIW +rVS +qrA +tIW +tIW +rjt +rjt +prq +icD +syW +njA +lhX +bnE +vIn +prq +enb +prq +aLE +aLE +lXP +aLE +aLE +aLE +aLE +ede +ssG +pPJ +fVJ +lXP +lXP +lXP +lXP +lXP +lXP +lXP +fab +fab +fab +lXP +lXP +lXP +lXP +bek +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(157,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +czn +hoA +hoA +hoA +dYg +lfW +oYS +ikA +cES +aNv +fQK +fQK +lSj +fQK +atl +dos +eQn +mpp +fjP +aTS +mpp +eLu +fQK +fQK +bfM +lSj +vIc +fQK +fQK +aTS +fQK +fQK +bfM +fQK +fQK +fQK +pqr +dpm +aYN +ruj +oYS +txY +ueW +glU +pfm +vju +fTH +fSg +lWy +xRn +nox +lfH +vEq +vbp +lwT +niT +ole +lsi +fSg +vPX +ylY +hbf +jGR +bzx +vrK +fJz +jrd +dIh +fxw +gEd +gEd +gEd +gEd +gEd +gEd +gEd +gEd +gEd +uPA +gEd +ahW +wbv +aHz +lRS +lRS +lRS +vto +xTW +rjt +rjt +prq +prq +prq +prq +prq +prq +kYJ +prq +bsm +prq +lXP +lXP +lXP +lXP +lXP +lXP +lXP +lXP +lXP +urF +pdJ +lXP +jCY +bVU +wJh +lXP +nrp +fPW +fPW +fPW +fPW +fPW +fPW +fPW +wzX +mhS +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(158,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +hoA +hoA +hoA +dYg +vpj +oYS +ikA +rqu +aNv +mpp +hyd +rjZ +efY +lRr +tRl +oNh +urv +weh +kAt +qof +ksr +nXz +hqL +hqL +hqL +fCC +tft +hqL +hqL +hqL +hqL +xDk +eFL +hqL +tdn +wKM +cLx +wxd +fMC +fMC +nIh +iFW +mGn +gFK +mUH +ulJ +kuh +bIj +llZ +cgf +wun +gzJ +fSg +uCm +sLE +krr +mpg +fSg +lyn +jiL +uZj +quV +nxl +xBd +kWf +huZ +xSj +fxw +gEd +gEd +gEd +gEd +gEd +gEd +gEd +gEd +gEd +gEd +gEd +ahW +niU +vSc +xNr +hSG +mcA +bYO +ahW +rjt +rjt +rjt +rjt +rjt +rjt +rjt +prq +aOa +oZx +iXQ +prq +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +ede +jpH +pcv +fEl +tmb +wmb +aSl +quU +pdV +lXP +lXP +lXP +lXP +lXP +lXP +lXP +kBX +lXP +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(159,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +mzC +hoA +hoA +hoA +dYg +lfW +qPN +ueX +xjh +uZf +hrk +hrk +tTD +uZf +uZf +uZf +uZf +uZf +uZf +lCn +eZX +uri +uri +rKU +rKU +uri +mQv +xHq +mQv +mQv +mQv +mQv +fJE +rje +yhz +yhz +yhz +yhz +yhz +yaW +oYS +veR +mUH +flT +pjf +aSh +kOc +fSg +fSg +wvA +wvA +fSg +fSg +fSg +eGH +oME +krr +sPv +fSg +jIX +jrn +fxw +fxw +fxw +fxw +ojV +iZm +eWH +fxw +gEd +gEd +gEd +gEd +pCe +gEd +gEd +gEd +gEd +hWA +gEd +ahW +oSZ +oHR +ahW +ahW +ahW +ahW +ahW +rjt +rjt +rjt +rjt +rjt +rjt +rjt +prq +rFy +cCm +hoX +prq +aLE +aLE +aLE +aLE +aLE +aLE +aLE +aLE +ede +pkg +fVJ +mFE +pwX +ssG +ssG +uXk +uvE +lXP +vpt +vpt +vpt +vpt +lXP +ssG +fZw +bsp +psZ +aVl +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(160,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hoA +hoA +hoA +yhz +nKc +jPz +vRD +eQw +uZf +jre +jre +bDn +nWd +hgd +hju +nzY +lcn +uZf +eVI +aBc +uri +oef +nPB +rJQ +eSj +mQv +teO +owk +xpe +xpe +wfK +udO +jIr +rse +qGR +bQB +uRS +mQv +oYS +oYS +txY +fUA +uFM +pPg +sYE +aOh +fSg +jFD +oXV +hIv +xod +vhi +fSg +xiA +ylW +pWx +iOX +fSg +lyn +nst +drg +rjt +rjt +fxw +sMp +twA +twA +twA +twA +oVQ +oVQ +oVQ +twA +twA +gEd +gEd +jHW +ahW +ueV +ahW +dtW +gJk +ahW +rjt +rjt +drg +rjt +rjt +rjt +rjt +rjt +rjt +rjt +rjt +prq +piK +gPm +kKz +prq +iSS +iSS +iSS +aLE +iSS +iSS +iSS +iSS +ehL +pkg +fVJ +lXP +pPJ +nCj +jCY +lXP +pWe +lXP +vpt +vpt +vpt +vpt +lXP +ssG +jAA +ssG +fWW +kFD +fWW +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(161,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +czn +hoA +hoA +hoA +yhz +yhz +uZf +uZf +uZf +uZf +kNr +ncA +bWd +nWd +jDV +qte +vrD +vLg +dzy +sKK +uFU +tSv +wOv +uDO +bjh +neh +mQv +pyT +hMy +xpe +xpe +icW +eJs +xDG +lDa +qDa +eJs +eub +mQv +jEx +oYS +txY +mjE +qHX +jPc +mUH +sUK +fSg +sEj +oSl +uCj +ovM +mJE +qfD +dic +xPC +qDj +xvC +nBc +fFu +ccT +drg +rjt +rjt +gfq +lWL +twA +qne +vTF +fol +xrx +xrx +xrx +dvk +twA +pJf +gEd +gbE +hZK +mNF +wsK +eqK +coE +ahW +drg +drg +drg +drg +drg +drg +drg +drg +drg +drg +drg +prq +lvr +gcQ +fVr +vTq +chx +chx +chx +fAd +chx +chx +vFg +chx +chx +riP +hCD +lXP +lXP +lXP +lXP +lXP +vOZ +lXP +lXP +lXP +lXP +lXP +lXP +ssG +aoa +bsp +vBd +xKy +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(162,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +mzC +hoA +hoA +hoA +hoA +hoA +uZf +bZm +tfF +jre +lDm +ncA +bWd +nWd +fYm +isU +paO +kEI +uZf +eVI +dZz +uri +pPu +wCw +ciX +tQt +mQv +mQv +mQv +mQv +mQv +mQv +hox +dcP +sOs +dcP +pgu +mQv +mQv +oYS +bCi +txY +eKv +moB +jPc +xZH +ttt +fSg +rbq +lXM +fmN +dKD +pij +fSg +xkm +vEq +aPn +mho +fSg +lyn +sKn +drg +rjt +rjt +gfq +lWL +twA +wGd +vcW +vcW +vcW +vcW +vcW +sYH +twA +itJ +gEd +gbE +crl +jxQ +tBd +mkB +bYO +ahW +rjt +drg +rjt +drg +rjt +rjt +rjt +rjt +rjt +drg +rjt +prq +prq +prq +prq +prq +ptf +lXP +ssG +iyy +xIV +ssG +ssG +ssG +dpR +ccx +fVJ +lXP +ssG +ssG +ssG +ssG +uvE +ssG +ssG +ssG +ssG +ext +lXP +ssG +ssG +ssG +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(163,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hoA +hoA +hoA +hoA +uZf +jSW +vDt +rgC +uqv +ibK +jyp +rfV +lny +ukB +jGG +uew +uZf +diw +iwk +uri +vMs +nSF +obX +xCO +uri +hoA +hoA +hoA +mQv +iVx +pNt +cWW +hoA +cWW +jsD +mQv +hoA +hUi +hUi +hUi +hUi +mUH +jPc +moB +oJA +fSg +fSg +fSg +fSg +ckr +fSg +fSg +vbP +vDV +vEq +ddw +fSg +lyn +hMz +drg +rjt +rjt +gfq +gcx +twA +dRs +lSA +pAb +uyl +vnZ +pmv +kvu +twA +gEd +gEd +gbE +fqS +fie +gCV +gCV +gCV +gCV +gCV +drg +rjt +drg +rjt +rjt +rjt +rjt +rjt +drg +rjt +rjt +drg +rjt +rjt +rjt +rjt +lXP +ssG +iyy +ssG +xDp +svO +svO +svO +lLY +fVJ +lXP +ssG +ssG +ssG +ssG +uvE +ssG +ssG +ssG +ssG +ssG +lXP +lXP +lXP +lXP +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(164,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +mzC +mzC +hoA +hoA +hoA +hoA +uZf +rgC +ppw +iAP +wZU +ksN +esk +exA +vPY +mbq +vvG +qat +uZf +fxv +dZz +uri +gXU +cCz +sff +iwq +uri +hoA +hoA +hoA +mQv +mQv +bCU +nay +hoA +ihZ +smf +mQv +hoA +hUi +eRN +eRN +hUi +txY +tFN +veR +txY +txY +uHl +cJK +iFJ +gMl +hve +fSg +fSg +qfD +qfD +fSg +fSg +lyn +sKn +drg +rjt +rjt +gfq +lWL +twA +scm +wsW +nsE +fFW +dyY +rap +fRV +oVQ +gEd +gEd +gbE +crl +ctk +yhg +bNG +oDc +vcF +gCV +rjt +rjt +drg +rjt +rjt +rjt +rjt +rjt +drg +rjt +rjt +drg +rjt +rjt +rjt +qzE +svO +lPb +jcc +xjn +sTt +wQE +pOF +baW +kRy +pvw +lXP +ssG +ssG +ssG +ssG +uvE +ssG +ssG +ssG +ssG +ssG +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(165,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +hoA +hoA +hoA +hoA +uZf +xSe +vsy +daT +tsH +ncA +bWd +nWd +tDP +aQK +etY +bxR +uZf +eVI +dZz +uri +dMv +kKi +qST +sdE +uri +hoA +hoA +hoA +hoA +hoA +hrA +hoA +hoA +hoA +hoA +hoA +hoA +hUi +aAN +rnx +hUi +wCh +sKs +aPi +sYF +crO +tiZ +doF +doF +sMm +qpz +njc +jKt +rBO +xid +xpB +wNW +jFw +kQo +drg +rjt +rjt +gfq +lWL +twA +jOG +nCY +uMO +jYP +tsb +obi +fRV +oVQ +gEd +gEd +gbE +crl +fie +kII +qRN +bFE +oux +gCV +rjt +rjt +drg +drg +drg +drg +drg +drg +drg +drg +drg +drg +rjt +rjt +rjt +rjt +lXP +iCs +uzd +uzd +nVd +vqI +uzd +uzd +gYQ +tsq +lXP +ssG +ssG +ssG +ssG +uvE +ssG +ssG +ssG +ssG +ssG +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(166,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +hoA +hoA +hoA +hoA +uZf +uZf +uZf +uZf +kNr +ncA +bWd +nWd +uwL +goP +jTs +alP +uZf +dYg +dYg +uri +uri +uri +uri +uri +uri +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hUi +tyK +iLC +hUi +gSN +bcw +rIa +bhK +taK +tlZ +wxl +tlZ +dYC +tlZ +tlZ +tlZ +dpA +aLh +eJt +aND +eUs +cRw +drg +rjt +rjt +gfq +lWL +twA +aVu +yll +pgl +opx +iDK +hyW +dhL +oVQ +gEd +gEd +gbE +crl +veB +mwJ +mwJ +mwJ +mwJ +mwJ +rjt +rjt +drg +rjt +rjt +rjt +drg +rjt +rjt +rjt +rjt +drg +rjt +rjt +rjt +rjt +lXP +ecE +qJw +uzd +uzd +tjE +hFl +lbj +hQL +wHx +xct +ssG +ssG +ssG +ssG +uvE +ssG +ssG +ssG +ssG +ssG +lXP +czn +czn +czn +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(167,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +hoA +hoA +hoA +hoA +hoA +lPl +rgC +ncA +bWd +nWd +fAU +aqK +jTs +qSy +uZf +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hUi +hxg +gAB +hUi +heh +heh +heh +fgA +vfv +heh +heh +heh +heh +heh +jaR +cbn +gBH +cbn +jaR +jaR +cbn +cbn +jaR +rjt +rjt +gfq +lWL +twA +xmu +jwJ +tDq +yef +sWm +cDQ +qnx +twA +gEd +gEd +gbE +crl +ctk +vAV +qdk +dku +xlX +mwJ +rjt +rjt +drg +rjt +rjt +rjt +drg +rjt +rjt +rjt +drg +drg +drg +drg +drg +drg +lXP +bXv +saz +sqy +uzd +uzd +tsq +ffg +wda +uKx +czC +svO +svO +svO +svO +mhS +ssG +ssG +ssG +ssG +ssG +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(168,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +hoA +hoA +hoA +hoA +hoA +lPl +gdG +oxB +rCu +nWd +drJ +eCR +uwP +uTk +uZf +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hUi +eRN +gAB +eRN +heh +vCO +uMz +bLd +eBe +dal +tYl +oJz +sUp +sUp +jaR +rOf +xuA +uXA +bDC +sHU +dQi +fja +jaR +jaR +drg +drg +qtU +twA +wGd +vcW +vcW +sZe +vcW +vcW +nCY +twA +itJ +gEd +gbE +crl +fie +skY +qwa +gUr +tyB +mwJ +drg +drg +drg +drg +drg +drg +drg +drg +drg +drg +drg +eyJ +eyJ +eyJ +eyJ +eyJ +lXP +lXP +lXP +lXP +lXP +qga +fKe +lXP +lXP +lXP +lXP +ssG +ssG +ssG +ssG +ssG +ssG +ssG +ssG +ssG +ssG +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(169,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +uZf +uZf +uZf +uZf +uZf +uZf +uZf +uZf +uZf +uZf +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hUi +eRN +xVo +huf +fpo +nyJ +reU +bMc +dlu +xfo +dlu +bJp +sUp +sUp +jaR +kJr +gFY +iUJ +aWp +anf +xex +fHs +rLS +jaR +rjt +gfq +lWL +twA +ahM +vcW +vcW +hpS +vcW +vcW +gPP +twA +gEd +gEd +gbE +crl +uQF +epF +epF +epF +epF +epF +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +fRd +drg +eyJ +cGK +qqQ +xur +qqQ +rEX +drg +eyJ +eyJ +eyJ +eyJ +cQY +eyJ +eyJ +eyJ +drg +ssG +ssG +ssG +ssG +ssG +ssG +ssG +ssG +ssG +ssG +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(170,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hUi +eRN +hUi +hUi +heh +tHz +lrG +heh +heh +xjH +nTN +heh +heh +heh +jaR +xMI +uXA +bmb +uXA +xMI +aWp +kQw +mHU +jaR +rjt +gfq +lWL +twA +pdX +cHb +oGF +aDJ +qSG +aVs +lmP +oVQ +gEd +gEd +gbE +crl +ceP +axg +lxw +jvU +mUw +epF +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +drg +eyJ +cQY +drg +drg +drg +cQY +drg +eyJ +eyJ +eyJ +eyJ +cQY +eyJ +eyJ +eyJ +drg +ssG +ssG +ssG +ssG +ssG +ssG +ssG +ssG +ssG +ssG +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(171,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +pWp +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hUi +eRN +hUi +hoA +heh +nQw +uiQ +iIX +ctV +hFX +siY +wbM +iIX +hoA +jaR +uXA +fHs +xex +xex +fHs +maB +xex +rLS +jaR +rjt +gfq +lWL +twA +nlt +tjQ +bwc +bwc +eGc +bWX +nfe +oVQ +gEd +gEd +gbE +crl +epZ +wDJ +oLy +qtb +nnx +epF +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +drg +drg +cQY +drg +rjt +drg +eBN +qqQ +qqQ +qqQ +qqQ +cAT +ose +rRA +eyJ +eyJ +drg +ssG +ssG +ssG +ssG +ssG +ssG +ssG +ssG +ssG +ssG +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(172,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hUi +ekf +hUi +hoA +heh +iIX +uBF +iIX +kdM +rkW +gsJ +luY +iIX +hoA +drS +sYw +fja +tPV +cgp +aWp +fja +bev +jaR +jaR +ahT +ahT +uSW +twA +jgV +tnk +nSo +nSo +jkT +tZX +aBr +oVQ +gEd +gEd +gbE +crl +epZ +epF +epF +epF +epF +epF +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +drg +eyJ +cQY +drg +drg +drg +drg +drg +eyJ +eyJ +eyJ +tFH +eyJ +mej +eyJ +eyJ +drg +lXP +lXP +lXP +lXP +lXP +lXP +lXP +lXP +lXP +lXP +lXP +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(173,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +iIX +nSY +bBg +mqw +fjm +lwk +jwv +iIX +hoA +drS +jaR +buY +buY +jaR +buY +buY +drS +jaR +juJ +gAo +eIU +lWL +twA +gfD +wQD +cSb +rZg +jjy +jjy +ibl +twA +gEd +gEd +gbE +crl +xmK +crl +crl +nJp +oeo +ahW +abp +hny +hny +hny +hny +hny +hny +hny +hny +hny +vcp +hny +ddB +drg +czn +czn +czn +drg +eyJ +eyJ +eyJ +tFH +eyJ +mej +eyJ +eyJ +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(174,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +iIX +pHB +tLh +kmk +upP +jif +lBO +bIJ +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +drg +gfq +qOk +boJ +eKY +twA +twA +twA +opX +twA +twA +twA +twA +twA +itJ +gEd +gbE +dAG +fQZ +iAM +iAM +ecp +iAM +oAg +bVS +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +drg +eyJ +cQY +drg +czn +czn +czn +drg +drg +drg +drg +bXY +ohQ +bXY +drg +drg +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(175,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +iIX +euK +mLK +wlv +uTI +nkf +lDD +iIX +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +drg +drg +qtU +drg +drg +drg +vhs +gfq +oDH +dSj +pOS +eyJ +meB +ahW +gEd +gEd +oeG +ahW +rvz +jZY +mqf +ahW +ahW +ahW +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +drg +drg +cQY +drg +czn +czn +czn +czn +czn +czn +czn +ykc +vno +uap +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(176,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +iIX +iIX +dGl +mLK +cSw +rNJ +xRO +bIJ +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +drg +gfq +fCa +boJ +boJ +tGt +tXS +gfq +oDH +eyJ +xbI +eyJ +fUJ +ahW +gEd +gEd +gEd +dWq +gEd +gEd +gEd +gEd +gEd +ahW +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +drg +jdS +cQY +drg +czn +czn +czn +czn +czn +czn +czn +mEF +ohQ +mEF +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(177,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +bIJ +fZC +gBw +qDI +vvQ +tIF +iIX +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +drg +drg +drg +drg +kCg +lWL +tXS +gfq +oDH +eyJ +eyJ +eyJ +xdc +ahW +gEd +gEd +gEd +cOD +gEd +gEd +gEd +gEd +gEd +ahW +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +drg +iPL +nIy +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(178,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +iIX +iIX +nXT +cYe +iIX +iIX +iIX +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +drg +cdk +lWL +tXS +gfq +oDH +eyJ +lfv +drg +drg +ahW +gEd +gEd +gEd +cOD +gEd +gEd +gEd +gEd +gEd +ahW +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +eyJ +drg +eyJ +cQY +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(179,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +mzC +mzC +mzC +mzC +mzC +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +iIX +cqD +tOb +uWd +bIJ +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +drg +gfq +hby +tXS +gfq +oDH +drg +drg +drg +rjt +ahW +gEd +gEd +gEd +xQA +gEd +gEd +gEd +gEd +wHb +wHb +drg +drg +drg +drg +drg +drg +drg +drg +drg +drg +drg +drg +cQY +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(180,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +czn +czn +czn +mzC +czn +mzC +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +bIJ +ppP +vuM +cMa +bIJ +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +drg +gfq +lNZ +tXS +gfq +geu +drg +qGB +qGB +qGB +drg +qGB +qGB +qGB +ifI +vof +jCp +wyT +hXd +nmo +kDD +kDD +kDD +drg +rjt +rjt +rjt +rjt +rjt +drg +vyQ +qqQ +qqQ +vhk +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(181,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +gih +oHa +bIJ +flZ +lqV +hbE +bIJ +oHa +irQ +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +drg +gfq +lNZ +tXS +gfq +geu +drg +qGB +qGB +qGB +drg +qGB +qGB +qGB +wEL +oHY +htu +amL +afK +nmo +kDD +kDD +kDD +drg +rjt +rjt +rjt +rjt +rjt +drg +cQY +drg +drg +drg +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(182,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +eGT +czn +czn +czn +dlH +czn +czn +czn +wzu +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +drg +gfq +lNZ +tXS +gfq +geu +drg +qGB +qGB +qGB +drg +qGB +qGB +qGB +nmo +cmQ +mId +beM +nmo +nmo +kDD +bRh +kDD +drg +drg +drg +rjt +rjt +rjt +drg +cQY +drg +rjt +rjt +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(183,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +eGT +czn +czn +czn +czn +czn +czn +czn +wzu +hoA +hoA +hoA +hoA +hoA +hoA +drg +drg +drg +drg +drg +drg +eIU +lNZ +oGa +eIU +geu +drg +drg +nmo +nmo +nmo +pHd +pHd +nmo +nmo +nmo +xgN +nmo +nmo +kDD +kDD +kDD +kDD +kDD +kDD +drg +rjt +rjt +rjt +drg +cQY +drg +rjt +rjt +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(184,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +eGT +czn +czn +czn +czn +czn +czn +czn +wzu +hoA +hoA +hoA +hoA +hoA +czn +drg +eyJ +vyQ +qqQ +qqQ +qqQ +boJ +ttK +hcZ +hcZ +igX +drg +qGB +nmo +qBa +jYR +hml +wIv +tpX +nmo +alB +nkH +hUh +nmo +kDD +kDD +fbR +kDD +kDD +kDD +drg +drg +drg +drg +drg +cQY +drg +rjt +rjt +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(185,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +eGT +czn +czn +czn +czn +czn +czn +czn +wzu +hoA +hoA +hoA +hoA +hoA +czn +drg +eyJ +cQY +drg +drg +drg +drg +drg +drg +drg +ptf +drg +qGB +nmo +cbN +cDB +seW +hCe +skD +nmo +xes +vvN +wnk +nmo +nmo +woO +cHJ +uPL +kDD +kDD +drg +eyJ +vyQ +qqQ +qqQ +vhk +drg +rjt +rjt +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(186,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +eGT +czn +czn +czn +czn +czn +czn +czn +wzu +hoA +hoA +hoA +hoA +hoA +czn +drg +eyJ +cQY +drg +eyJ +eyJ +eyJ +eyJ +ndf +drg +rjt +drg +qGB +nmo +kpb +uPG +dZb +eBD +hrj +nmo +rLu +muO +hUh +nmo +nSp +lXB +ogF +sus +kDD +kDD +drg +drg +nBh +drg +drg +drg +drg +rjt +rjt +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(187,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +eGT +czn +czn +czn +czn +czn +czn +czn +wzu +hoA +hoA +hoA +hoA +hoA +czn +drg +eyJ +cQY +drg +eyJ +eyJ +eyJ +eyJ +eyJ +drg +rjt +drg +qGB +nmo +nmo +nmo +xCZ +nmo +nmo +nmo +nmo +dpd +nmo +nmo +gkh +pRz +dyh +sus +kDD +kDD +drg +eyJ +cQY +eyJ +drg +rjt +rjt +rjt +drg +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(188,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +eGT +czn +czn +czn +czn +czn +czn +czn +wzu +hoA +hoA +hoA +hoA +hoA +czn +drg +eyJ +cQY +drg +eyJ +eyJ +eyJ +eyJ +eyJ +drg +rjt +drg +qGB +uIu +wDs +xep +wBP +qzl +ocm +ocm +nzd +gTF +ocm +ldq +wNi +rWj +lPN +sus +kDD +kDD +drg +eyJ +cQY +eyJ +drg +rjt +rjt +drg +drg +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(189,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +mzC +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +eGT +czn +czn +czn +czn +czn +czn +czn +wzu +hoA +hoA +hoA +hoA +hoA +czn +drg +eyJ +cQY +drg +eyJ +eyJ +eyJ +eyJ +eyJ +drg +rjt +drg +qGB +uIu +eOw +teC +bRx +omP +dfn +lxy +ozs +kZn +lxy +mMB +deJ +gUt +oNZ +sus +kDD +kDD +drg +eyJ +cQY +eyJ +drg +rjt +drg +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(190,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mzC +mzC +mzC +mzC +mzC +mzC +czn +czn +hoA +hoA +hoA +hoA +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +eGT +czn +czn +czn +czn +czn +czn +czn +wzu +hoA +hoA +hoA +hoA +hoA +czn +drg +eyJ +cQY +mbB +eyJ +eyJ +eyJ +eyJ +eyJ +drg +rjt +nmo +nmo +nmo +nmo +nmo +rDY +vWa +nmo +nmo +nmo +fyI +nmo +nmo +nmo +drL +rwC +sus +kDD +kDD +drg +eyJ +cQY +eyJ +drg +drg +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(191,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +mzC +czn +czn +czn +czn +hoA +hoA +hoA +mzC +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +gih +wQg +czn +czn +czn +czn +czn +czn +czn +oWT +irQ +hoA +hoA +hoA +hoA +czn +drg +eyJ +cQY +mbB +eyJ +eyJ +eyJ +eyJ +eyJ +drg +rjt +nmo +lAm +yhi +mtE +tvR +vms +dMo +nmo +csk +ihV +xJw +rlY +axE +nmo +nmo +uIu +sNf +kDD +bRh +drg +jQW +cQY +xbI +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(192,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hoA +hoA +hoA +mzC +czn +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +drg +eyJ +cQY +drg +eyJ +eyJ +eyJ +eyJ +eyJ +drg +rjt +uIu +cSr +sRK +ihk +lfw +fYP +aJt +nIw +mab +gQd +wnV +htu +vVa +nmo +kDD +kDD +kDD +kDD +kDD +drg +eyJ +cQY +eyJ +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(193,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +mzC +czn +czn +hoA +hoA +hoA +mzC +mzC +hoA +hoA +hoA +hoA +hoA +mzC +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +drg +drg +cQY +drg +eyJ +eyJ +eyJ +eyJ +eyJ +drg +rjt +nmo +bni +tzm +bFC +tvR +mCU +lIC +nmo +uSf +dUh +mJp +clH +ieL +nmo +kDD +kDD +kDD +kDD +kDD +drg +eyJ +cQY +eyJ +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(194,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hoA +hoA +hoA +mzC +czn +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +drg +cQY +drg +eyJ +eyJ +eyJ +eyJ +eyJ +drg +rjt +nmo +nmo +nmo +nmo +nmo +hUa +kqE +nmo +laU +hOf +gmd +nhM +xNd +nmo +drg +drg +drg +drg +drg +drg +eyJ +cQY +eyJ +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(195,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +hoA +hoA +hoA +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +drg +fHa +drg +eyJ +eyJ +eyJ +eyJ +eyJ +drg +rjt +nmo +lAm +yhi +mtE +tvR +mCU +ruE +nmo +rSy +lme +dSb +mhT +tpk +nmo +eyJ +vyQ +qqQ +qqQ +qqQ +qqQ +qqQ +vhk +eyJ +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(196,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +hoA +hoA +hoA +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +drg +cQY +drg +drg +drg +drg +drg +drg +drg +drg +nmo +rBz +xOG +gCz +byv +nMs +qwv +nIw +xBg +qVR +xOF +ofQ +bch +nmo +drg +nBh +drg +drg +eyJ +eyJ +eyJ +eyJ +eyJ +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(197,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +mzC +czn +hoA +hoA +hoA +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +drg +eBN +qqQ +omX +aGo +drg +eyJ +eyJ +eyJ +nxf +nmo +bni +tzm +bFC +tvR +exd +hoT +nmo +vva +oWc +dpS +rHV +pKp +nmo +eyJ +cQY +eyJ +drg +drg +drg +drg +drg +drg +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(198,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +hoA +hoA +hoA +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +hoA +drg +drg +eyJ +wIA +nTY +drg +eyJ +eyJ +eyJ +eyJ +nmo +nmo +nmo +nmo +nmo +nmo +nmo +nmo +kFu +jYo +nmo +fWC +nmo +nmo +eyJ +cQY +eyJ +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(199,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +hoA +hoA +hoA +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +hoA +hoA +drg +eyJ +qxA +tIN +aZD +qqQ +qqQ +qqQ +qqQ +qqQ +qqQ +fOO +qqQ +qqQ +qqQ +igu +qqQ +eTM +juI +qqQ +qqQ +aZD +qqQ +qqQ +vhk +eyJ +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(200,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +hoA +hoA +hoA +mzC +czn +czn +czn +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +hoA +hoA +drg +eyJ +eyJ +eyJ +drg +eyJ +eyJ +eyJ +eyJ +drg +drg +drg +drg +drg +drg +drg +drg +mEF +fhz +drg +drg +drg +eyJ +eyJ +eyJ +eyJ +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(201,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +czn +czn +mzC +czn +hoA +hoA +hoA +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +mzC +czn +czn +hoA +hoA +drg +eyJ +eyJ +eyJ +drg +eyJ +eyJ +eyJ +eyJ +drg +rjt +rjt +rjt +rjt +rjt +drg +rjt +sbl +hvf +rjt +rjt +drg +eyJ +eyJ +eyJ +eyJ +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(202,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hoA +hoA +hoA +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +mzC +czn +czn +czn +hoA +drg +drg +drg +drg +drg +drg +mbB +drg +drg +drg +rjt +rjt +rjt +rjt +rjt +drg +rjt +lIF +rjt +rjt +rjt +drg +drg +drg +drg +drg +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(203,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +hoA +hoA +hoA +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +drg +eyJ +eyJ +eyJ +eyJ +nHi +drg +rjt +rjt +rjt +rjt +rjt +drg +rjt +lIF +rjt +rjt +rjt +rjt +rjt +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(204,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +drg +eyJ +eyJ +eyJ +eyJ +eyJ +drg +rjt +rjt +rjt +rjt +rjt +drg +rjt +lIF +rjt +rjt +rjt +rjt +rjt +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(205,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +drg +eyJ +eyJ +eyJ +eyJ +eyJ +drg +rjt +rjt +rjt +rjt +rjt +drg +rjt +lIF +rjt +rjt +rjt +rjt +rjt +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(206,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +drg +drg +drg +drg +drg +drg +drg +rjt +rjt +rjt +rjt +rjt +drg +rjt +lIF +rjt +rjt +rjt +rjt +rjt +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(207,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mzC +mzC +mzC +mzC +mzC +czn +mzC +czn +mzC +czn +mzC +czn +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +mzC +czn +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +drg +drg +drg +drg +drg +drg +drg +drg +fhz +drg +drg +drg +drg +drg +drg +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(208,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +mzC +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +rIC +eVD +dpZ +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(209,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mzC +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +pWp +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(210,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(211,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(212,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +pWp +czn +czn +czn +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(213,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(214,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(215,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(216,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(217,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(218,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +mzC +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(219,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +lwG +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(220,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +lwG +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +mzC +mzC +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(221,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +lwG +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(222,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +lwG +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(223,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +lwG +lwG +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(224,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +hoA +hoA +hoA +hoA +lwG +lwG +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(225,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +czn +lwG +lwG +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(226,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +mzC +mzC +mzC +mzC +lwG +lwG +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(227,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(228,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +lwG +lwG +hoA +hoA +hoA +hoA +hoA +hoA +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(229,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(230,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +czn +czn +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(231,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +mzC +mzC +mzC +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(232,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +czn +mzC +czn +czn +pWp +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(233,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(234,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(235,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(236,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(237,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +lwG +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(238,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +lwG +lwG +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(239,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(240,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(241,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(242,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(243,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(244,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(245,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(246,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(247,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(248,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(249,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(250,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(251,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(252,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(253,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(254,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} +(255,1,2) = {" +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +czn +"} diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index adf69a15403bc..751f9001f97ec 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -336,10 +336,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/maintenance/department/medical/morgue) "aaN" = ( @@ -448,10 +445,10 @@ /area/maintenance/starboard) "aaY" = ( /obj/structure/table, -/obj/item/clothing/under/rank/security, /obj/item/restraints/handcuffs, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small, +/obj/item/clothing/under/rank/security/officer, /turf/open/floor/plating, /area/maintenance/starboard) "aaZ" = ( @@ -500,7 +497,7 @@ /area/crew_quarters/cryopods) "abe" = ( /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "abf" = ( @@ -810,12 +807,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Cryogenic Lounge" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/cryopods) "abM" = ( @@ -859,7 +851,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/crew_quarters/cryopods) "abP" = ( @@ -995,10 +987,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "aca" = ( @@ -1020,7 +1009,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel, @@ -1052,7 +1041,6 @@ /area/maintenance/solars/starboard/fore) "acf" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) "acg" = ( @@ -1131,12 +1119,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/morgue) "aco" = ( @@ -1153,7 +1136,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "acp" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, @@ -1902,7 +1885,6 @@ icon_state = "doors"; name = "WARNING: EXTERNAL AIRLOCK" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/secondary/entry) "adr" = ( @@ -1915,7 +1897,6 @@ "ads" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/secondary/entry) "adt" = ( @@ -2538,7 +2519,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/engineering{ name = "Auxiliary Construction Storage"; - req_one_access_txt = "10;32;47;48" + req_one_access_txt = "10;72" }, /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -2546,6 +2527,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/construction/mining/aux_base) "ael" = ( @@ -2619,7 +2601,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/medical/virology) "aer" = ( @@ -2633,7 +2615,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/medical/virology) "aes" = ( @@ -2761,18 +2743,13 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/virology) "aeA" = ( @@ -2805,7 +2782,7 @@ name = "Construction RC"; pixel_y = 32 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, @@ -3000,12 +2977,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/virology) "aeO" = ( @@ -3038,7 +3010,7 @@ dir = 1 }, /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plasteel, @@ -3048,7 +3020,7 @@ dir = 1 }, /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -3068,7 +3040,7 @@ dir = 1 }, /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -3276,6 +3248,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/construction/mining/aux_base) +"afR" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) "afT" = ( /obj/structure/chair{ dir = 4 @@ -3294,7 +3276,7 @@ id = "construction"; name = "Auxiliary Construction Shutters"; pixel_x = -26; - req_access_txt = "32;47;48" + req_access_txt = "72" }, /obj/machinery/light_switch{ pixel_x = -38 @@ -3331,7 +3313,7 @@ /turf/open/floor/plasteel, /area/construction/mining/aux_base) "afY" = ( -/obj/machinery/computer/shuttle/mining{ +/obj/machinery/computer/shuttle_flight/mining{ dir = 8 }, /obj/effect/turf_decal/tile/yellow, @@ -3349,14 +3331,14 @@ /area/hallway/secondary/entry) "agk" = ( /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "agl" = ( /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plasteel, @@ -3414,7 +3396,8 @@ /area/construction/mining/aux_base) "agp" = ( /obj/machinery/door/airlock/external{ - name = "Auxiliary Base Airlock" + name = "Auxiliary Base Airlock"; + req_one_access_txt = "72" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -3545,7 +3528,7 @@ "agZ" = ( /obj/machinery/door/airlock/engineering{ name = "Auxiliary Construction Zone"; - req_one_access_txt = "32;47;48" + req_one_access_txt = "72" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -3556,12 +3539,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/construction/mining/aux_base) "aha" = ( @@ -3613,7 +3591,7 @@ "aht" = ( /obj/machinery/door/airlock/engineering{ name = "Auxiliary Construction Zone"; - req_one_access_txt = "32;47;48" + req_one_access_txt = "72" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -3621,15 +3599,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/construction/mining/aux_base) "ahu" = ( @@ -3682,7 +3655,7 @@ dir = 4; pixel_x = -24 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -3830,7 +3803,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; - req_one_access_txt = "32;47;48" + req_one_access_txt = "72" }, /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -4030,26 +4003,18 @@ /area/maintenance/starboard/fore) "aiJ" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aiM" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ dir = 8 }, -/obj/item/radio/intercom{ - pixel_x = -30 - }, -/obj/item/flashlight/seclite{ - pixel_y = 11 - }, -/obj/item/flashlight/seclite{ - pixel_y = 11 +/obj/effect/turf_decal/tile/red{ + dir = 1 }, /turf/open/floor/plasteel, /area/security/warden) @@ -4129,18 +4094,6 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/port/fore) "aja" = ( @@ -4187,10 +4140,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "aje" = ( @@ -4201,10 +4151,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "ajf" = ( @@ -4231,10 +4178,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "ajh" = ( @@ -4250,10 +4194,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "ajj" = ( @@ -4296,14 +4237,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/maintenance/port/fore) "ajq" = ( @@ -4341,17 +4274,6 @@ dir = 1 }, /area/hallway/secondary/entry) -"ajv" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/entry) "ajw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -4420,31 +4342,6 @@ dir = 1 }, /area/hallway/secondary/entry) -"ajB" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - areastring = "/area/hallway/secondary/entry"; - dir = 1; - name = "Arrivals Hallway APC"; - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Arrivals - Center Port"; - dir = 2; - name = "arrivals camera" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/entry) "ajC" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -4541,7 +4438,7 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel, @@ -4598,7 +4495,7 @@ "ajR" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel, @@ -4927,50 +4824,9 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) -"akx" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock{ - name = "Auxiliary Storage Closet" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) "aky" = ( /turf/closed/wall, /area/vacant_room/office) -"akz" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall, -/area/vacant_room/office) -"akA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/vacant_room/office) -"akB" = ( -/obj/machinery/door/airlock{ - name = "Auxiliary Office"; - req_access_txt = "32" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/vacant_room/office) -"akC" = ( -/obj/machinery/status_display/evac, -/turf/closed/wall, -/area/vacant_room/office) "akD" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -5027,7 +4883,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "akJ" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral, @@ -5051,7 +4907,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "akN" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral{ @@ -5230,7 +5086,7 @@ /turf/open/floor/plasteel/grimy, /area/vacant_room/office) "alo" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/firealarm{ pixel_y = 24 }, @@ -5311,7 +5167,7 @@ pixel_x = 26; pixel_y = 26 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -5465,17 +5321,18 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "alL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/science/xenobiology) "alM" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -5551,14 +5408,6 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/maintenance/port/fore) -"alV" = ( -/obj/structure/girder, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/structure/barricade/wooden, -/turf/open/floor/plating, -/area/maintenance/port) "alW" = ( /obj/machinery/light/small{ dir = 8 @@ -5726,12 +5575,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/customs) "amn" = ( @@ -5758,7 +5602,7 @@ /turf/open/floor/plasteel/grimy, /area/hallway/secondary/entry) "amq" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/grimy, /area/hallway/secondary/entry) "amr" = ( @@ -5793,12 +5637,7 @@ dir = 4 }, /obj/effect/landmark/event_spawn, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint) "amv" = ( @@ -6009,15 +5848,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/misc_lab/range) "amR" = ( @@ -6026,6 +5860,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/maintenance/starboard/aft) "amS" = ( @@ -6535,14 +6370,6 @@ heat_capacity = 1e+006 }, /area/maintenance/port/aft) -"anW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/maintenance/port/fore) "anX" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -6732,12 +6559,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/customs) "aol" = ( @@ -6772,12 +6594,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint) "aor" = ( @@ -6888,7 +6705,6 @@ /area/maintenance/starboard/fore) "aoE" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/disposal) "aoF" = ( @@ -6964,18 +6780,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/atmospherics_engine) -"aoS" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"aoT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) "aoW" = ( /obj/machinery/light/small{ dir = 8 @@ -7378,12 +7182,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/atmospherics_engine) -"apY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/maintenance/port/fore) "apZ" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -7445,7 +7243,7 @@ /turf/open/floor/plasteel/grimy, /area/vacant_room/office) "aqf" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/vacant_room/office) "aqg" = ( @@ -7539,7 +7337,7 @@ /obj/machinery/newscaster{ pixel_y = -32 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel/grimy, @@ -7775,7 +7573,6 @@ /area/engine/atmospherics_engine) "aqV" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/port/fore) "aqW" = ( @@ -7946,10 +7743,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) "arn" = ( @@ -7971,10 +7765,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) "arp" = ( @@ -8006,28 +7797,6 @@ }, /turf/open/floor/circuit/green, /area/engine/atmospherics_engine) -"aru" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance Hatch"; - req_access_txt = "12" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/barricade/wooden, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) -"arv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/maintenance/port/fore) "ary" = ( /obj/structure/girder, /obj/effect/decal/cleanable/dirt, @@ -8156,7 +7925,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "arM" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral{ @@ -8191,7 +7960,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "arQ" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral{ @@ -8348,7 +8117,6 @@ /area/solar/port/fore) "asl" = ( /obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmospherics_engine) "asm" = ( @@ -8563,44 +8331,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/port/fore) -"asG" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"asH" = ( -/obj/structure/cable/yellow{ - 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/fore) -"asI" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"asJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) "asK" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -8719,7 +8449,7 @@ /area/maintenance/port/fore) "asU" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance/two, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -9194,7 +8924,6 @@ dir = 4; id = "garbage" }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/splatter, /obj/effect/turf_decal/stripes/line, @@ -9604,7 +9333,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/neutral{ @@ -9662,7 +9391,7 @@ /area/hallway/secondary/entry) "auq" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/neutral, @@ -10227,7 +9956,6 @@ dir = 4 }, /obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmospherics_engine) "avl" = ( @@ -10265,7 +9993,7 @@ /area/maintenance/port/fore) "avq" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/crowbar/red, /obj/effect/spawner/lootdrop/maintenance, @@ -10513,10 +10241,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "avN" = ( @@ -10529,10 +10254,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "avO" = ( @@ -10546,10 +10268,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "avP" = ( @@ -10592,13 +10311,20 @@ /turf/closed/wall, /area/quartermaster/warehouse) "avT" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/hallway/secondary/entry) +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/science/xenobiology) "avU" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/space) "avV" = ( @@ -10955,7 +10681,7 @@ /turf/open/floor/plating, /area/crew_quarters/toilet/auxiliary) "awM" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/camera{ c_tag = "Auxiliary Restroom"; dir = 2; @@ -11215,7 +10941,7 @@ "axl" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -11251,7 +10977,7 @@ "axr" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/bot, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) "axs" = ( @@ -11403,7 +11129,7 @@ /turf/open/floor/plasteel, /area/engine/atmospherics_engine) "axG" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/sign/warning/nosmoking{ pixel_x = 32 }, @@ -11683,12 +11409,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel, /area/quartermaster/warehouse) "ayl" = ( @@ -11802,12 +11522,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/warehouse) "ayt" = ( @@ -11921,7 +11636,6 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/storage) "ayG" = ( @@ -12365,12 +12079,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/warehouse) "azv" = ( @@ -12431,7 +12140,7 @@ /area/quartermaster/storage) "azA" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance, /obj/effect/turf_decal/bot, @@ -12719,6 +12428,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/janitor) "aAj" = ( @@ -13039,7 +12749,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/storage) "aAJ" = ( @@ -13051,7 +12760,6 @@ }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/storage) "aAK" = ( @@ -13062,7 +12770,6 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/storage) "aAP" = ( @@ -13541,7 +13248,7 @@ /area/quartermaster/warehouse) "aBN" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance/two, /turf/open/floor/plating, @@ -14024,12 +13731,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel, /area/quartermaster/warehouse) "aCQ" = ( @@ -14664,7 +14365,6 @@ /area/quartermaster/storage) "aEh" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -14676,7 +14376,6 @@ }, /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/space/basic, /area/quartermaster/storage) "aEl" = ( @@ -14961,7 +14660,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "aEP" = ( -/obj/structure/closet/secure_closet/bar, +/obj/machinery/food_cart/coffee, /obj/machinery/power/apc{ areastring = "/area/crew_quarters/bar"; dir = 1; @@ -15126,20 +14825,6 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) -"aFa" = ( -/obj/machinery/disposal/bin, -/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/crew_quarters/bar) "aFb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/yellow{ @@ -15210,10 +14895,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/sorting) "aFh" = ( @@ -15256,7 +14938,6 @@ /area/space/nearstation) "aFp" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/solars/port/fore) "aFq" = ( @@ -15267,7 +14948,6 @@ /area/maintenance/disposal/incinerator) "aFs" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) "aFt" = ( @@ -15287,7 +14967,7 @@ /turf/open/floor/plasteel, /area/engine/atmospherics_engine) "aFu" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -15477,7 +15157,7 @@ /turf/open/floor/plasteel, /area/engine/atmospherics_engine) "aFH" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -15500,6 +15180,10 @@ /obj/structure/cable/white, /turf/open/floor/plating, /area/maintenance/port/fore) +"aFN" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/exploration_prep) "aFO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, @@ -15651,12 +15335,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "aGi" = ( @@ -15785,7 +15464,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/quartermaster/sorting) "aGt" = ( @@ -16327,7 +16006,7 @@ /turf/open/floor/plasteel/dark, /area/maintenance/disposal/incinerator) "aGX" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -16480,7 +16159,7 @@ /area/engine/atmospherics_engine) "aHj" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -16525,7 +16204,7 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "aHq" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/newscaster{ pixel_x = -32 }, @@ -16576,12 +16255,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar) "aHt" = ( @@ -16620,7 +16294,7 @@ /turf/open/floor/plasteel/grimy, /area/crew_quarters/bar) "aHx" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -16808,12 +16482,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/supply) "aHQ" = ( @@ -16918,7 +16587,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/storage) "aHX" = ( @@ -16927,7 +16595,6 @@ }, /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/storage) "aIc" = ( @@ -16935,7 +16602,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/prison) "aId" = ( @@ -17015,7 +16681,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/prison) "aIj" = ( @@ -17138,15 +16803,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/maintenance/solars/port/fore) "aIq" = ( @@ -17272,10 +16932,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) "aIA" = ( @@ -17299,10 +16956,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) "aIC" = ( @@ -17342,10 +16996,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) "aIF" = ( @@ -17789,7 +17440,7 @@ "aJv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance/two, /obj/effect/turf_decal/bot, @@ -18056,12 +17707,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "aJT" = ( @@ -18367,12 +18013,7 @@ req_access_txt = "50" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/sorting) "aKE" = ( @@ -18511,12 +18152,6 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel, /area/security/checkpoint/supply) "aKO" = ( @@ -18932,7 +18567,7 @@ "aLA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/flashlight, /turf/open/floor/plasteel, @@ -18970,10 +18605,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "aLK" = ( @@ -19137,7 +18769,7 @@ /turf/open/floor/plasteel, /area/security/checkpoint/supply) "aLV" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/airalarm{ dir = 8; pixel_x = 24 @@ -19224,8 +18856,8 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/item/canvas/twentythreeXtwentythree, -/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -19331,7 +18963,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, @@ -19505,6 +19137,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "aME" = ( @@ -19534,10 +19167,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "aMI" = ( @@ -19562,10 +19192,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "aMK" = ( @@ -19725,8 +19352,8 @@ pixel_y = 32 }, /obj/structure/easel, -/obj/item/canvas/twentythreeXtwentythree, -/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, /turf/open/floor/plasteel/grimy, /area/crew_quarters/bar/atrium) "aNf" = ( @@ -20219,13 +19846,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" = ( @@ -20490,7 +20119,7 @@ /turf/open/floor/plasteel/dark, /area/engine/atmos) "aOo" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -20679,7 +20308,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/grimy, /area/crew_quarters/bar/atrium) "aOH" = ( @@ -20996,7 +20625,6 @@ /obj/structure/cable/yellow{ icon_state = "0-8" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/storage) "aPh" = ( @@ -21443,7 +21071,7 @@ /turf/open/floor/plasteel/checker, /area/engine/atmos) "aPO" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, @@ -21468,7 +21096,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "aPQ" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -21827,12 +21455,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar/atrium) "aQy" = ( @@ -21923,7 +21546,7 @@ /area/quartermaster/sorting) "aQE" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/airalarm{ dir = 8; pixel_x = 24 @@ -22070,7 +21693,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/qm) "aQT" = ( @@ -22078,7 +21700,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/qm) "aQU" = ( @@ -22092,7 +21713,6 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/qm) "aQV" = ( @@ -22103,7 +21723,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/qm) "aQW" = ( @@ -22166,7 +21785,7 @@ /area/security/prison) "aRb" = ( /obj/machinery/light/small, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/red{ dir = 8 @@ -22211,7 +21830,7 @@ /turf/open/floor/plasteel, /area/security/prison) "aRg" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small, /turf/open/floor/plating{ @@ -22236,7 +21855,6 @@ name = "Justice Chamber Blast door" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/execution/education) "aRk" = ( @@ -22285,7 +21903,6 @@ pixel_x = 32 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/execution/education) "aRm" = ( @@ -22652,12 +22269,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/theatre) "aRU" = ( @@ -22702,12 +22314,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar/atrium) "aRX" = ( @@ -22768,12 +22375,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar/atrium) "aSd" = ( @@ -22798,10 +22400,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/sorting) "aSf" = ( @@ -22855,10 +22454,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/supply) "aSk" = ( @@ -23114,7 +22710,6 @@ "aSB" = ( /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/qm) "aSC" = ( @@ -23940,12 +23535,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar/atrium) "aTN" = ( @@ -24101,7 +23691,7 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "aTY" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light{ dir = 4 }, @@ -24694,7 +24284,7 @@ /area/security/execution/education) "aUJ" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 4 @@ -25010,7 +24600,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Service Hallway - Aft"; @@ -25359,12 +24949,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "aVH" = ( @@ -25565,12 +25150,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/qm) "aVR" = ( @@ -25695,12 +25275,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/qm) "aVZ" = ( @@ -25727,7 +25302,7 @@ /turf/open/floor/plasteel, /area/quartermaster/qm) "aWa" = ( -/obj/machinery/computer/shuttle/mining{ +/obj/machinery/computer/shuttle_flight/mining{ dir = 8 }, /obj/machinery/light{ @@ -25984,7 +25559,7 @@ /area/security/execution/education) "aWs" = ( /obj/structure/sign/warning/securearea{ - pixel_x = 32 + pixel_x = -32 }, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small{ @@ -26035,7 +25610,6 @@ /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "aWz" = ( @@ -26168,10 +25742,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "aWJ" = ( @@ -26354,7 +25925,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{ @@ -26633,12 +26204,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "aXr" = ( @@ -26894,7 +26460,6 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/qm) "aXJ" = ( @@ -26908,8 +26473,9 @@ "aXK" = ( /obj/machinery/door/airlock/medical/glass{ name = "Sanitarium"; - req_access_txt = "63" + req_one_access_txt = "1;34" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side{ dir = 1 }, @@ -26990,10 +26556,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/execution/education) "aXS" = ( @@ -27033,7 +26596,7 @@ /turf/open/floor/engine/co2, /area/engine/atmos) "aXW" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/machinery/atmospherics/miner/station/carbon_dioxide, /turf/open/floor/engine/co2, /area/engine/atmos) "aXX" = ( @@ -27660,7 +27223,7 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "aYR" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/firealarm{ dir = 4; pixel_x = -24; @@ -27707,7 +27270,7 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "aYU" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -27812,7 +27375,7 @@ /turf/open/floor/plasteel, /area/quartermaster/qm) "aZd" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light, /obj/machinery/newscaster{ pixel_y = -32 @@ -27882,7 +27445,6 @@ }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/white, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/qm) "aZj" = ( @@ -27891,11 +27453,10 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/qm) "aZk" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/cable/yellow{ icon_state = "2-8" }, @@ -28200,7 +27761,7 @@ }, /obj/machinery/door/airlock/security/glass{ name = "Prison Wing"; - req_access_txt = "1" + req_one_access_txt = "1;34" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -28211,15 +27772,10 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/prison) "aZG" = ( @@ -28299,7 +27855,6 @@ /area/security/prison) "aZL" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/prison) "aZM" = ( @@ -28308,9 +27863,9 @@ dir = 4 }, /turf/open/floor/plating{ - initial_gas_mix = "o2=0.01;n2=0.01"; - luminosity = 2; - temperature = 2.7 + initial_gas_mix = "o2=0.01;n2=0.01;TEMP=2.7"; + initial_temperature = 2.7; + luminosity = 2 }, /area/security/prison) "aZP" = ( @@ -28339,7 +27894,6 @@ /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "aZT" = ( @@ -28662,10 +28216,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/service) "bax" = ( @@ -28676,10 +28227,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/service) "bay" = ( @@ -28730,7 +28278,7 @@ /obj/machinery/newscaster{ pixel_x = -32 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -28835,7 +28383,7 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "baK" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -28924,10 +28472,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "baU" = ( @@ -28964,7 +28509,6 @@ icon_state = "0-4" }, /obj/structure/cable/white, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/qm) "baZ" = ( @@ -29123,7 +28667,7 @@ /turf/open/floor/plasteel, /area/security/prison) "bbn" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/sign/warning/pods{ dir = 8; pixel_y = -32 @@ -29428,7 +28972,7 @@ /turf/open/floor/engine/o2, /area/engine/atmos) "bbO" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/atmospherics/miner/station/oxygen, /turf/open/floor/engine/o2, /area/engine/atmos) "bbP" = ( @@ -29566,27 +29110,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) -"bci" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchencounter"; - name = "Kitchen Counter Shutters" - }, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -8; - pixel_y = 5 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = -8 - }, -/obj/item/reagent_containers/food/drinks/britcup, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/kitchen) "bcj" = ( /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -29594,10 +29117,7 @@ name = "Kitchen Counter Shutters" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "bck" = ( @@ -29609,10 +29129,7 @@ /obj/item/storage/fancy/donut_box, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "bcl" = ( @@ -29630,10 +29147,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "bcp" = ( @@ -29654,10 +29168,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "bcr" = ( @@ -29673,10 +29184,7 @@ req_access_txt = "31" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "bct" = ( @@ -29794,7 +29302,7 @@ /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bcD" = ( -/obj/machinery/mineral/equipment_vendor, +/obj/machinery/vendor/mining, /obj/effect/decal/cleanable/dirt, /obj/machinery/light{ dir = 1 @@ -29834,7 +29342,6 @@ }, /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/miningoffice) "bcJ" = ( @@ -29871,7 +29378,7 @@ "bcL" = ( /obj/machinery/door/airlock/security/glass{ name = "Prison Wing"; - req_access_txt = "1" + req_one_access_txt = "1;34" }, /obj/structure/cable/yellow{ icon_state = "1-2" @@ -29884,10 +29391,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/prison) "bcM" = ( @@ -29898,7 +29402,7 @@ "bcN" = ( /obj/machinery/door/airlock/security/glass{ name = "Prison Wing"; - req_access_txt = "1" + req_one_access_txt = "1;34" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ @@ -29908,10 +29412,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/prison) "bcO" = ( @@ -30072,9 +29573,9 @@ dir = 4 }, /turf/open/floor/plating{ - initial_gas_mix = "o2=0.01;n2=0.01"; - luminosity = 2; - temperature = 2.7 + initial_gas_mix = "o2=0.01;n2=0.01;TEMP=2.7"; + initial_temperature = 2.7; + luminosity = 2 }, /area/security/prison) "bcX" = ( @@ -30416,12 +29917,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/service) "bdz" = ( @@ -30466,12 +29962,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "bdC" = ( @@ -30547,23 +30039,20 @@ /turf/open/floor/plasteel/white, /area/crew_quarters/kitchen) "bdK" = ( -/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/effect/turf_decal/tile/red{ +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/crew_quarters/kitchen) +/obj/structure/displaycase/forsale/kitchen, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) "bdL" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red{ @@ -30629,7 +30118,7 @@ "bdP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/brown{ @@ -30757,7 +30246,7 @@ /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "beb" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -30843,7 +30332,6 @@ }, /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/miningoffice) "bej" = ( @@ -30873,7 +30361,6 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/miningoffice) "bep" = ( @@ -30945,7 +30432,7 @@ /turf/open/floor/engine/plasma, /area/engine/atmos) "bev" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/atmospherics/miner/station/toxins, /turf/open/floor/engine/plasma, /area/engine/atmos) "bew" = ( @@ -31010,7 +30497,7 @@ /area/engine/atmos) "beB" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/firealarm{ dir = 4; pixel_x = -24 @@ -31359,12 +30846,7 @@ name = "Kitchen Hall Shutters" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "bfj" = ( @@ -31457,12 +30939,7 @@ req_access_txt = "48" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bfr" = ( @@ -31539,12 +31016,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bfx" = ( @@ -31701,7 +31173,6 @@ "bfJ" = ( /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/miningoffice) "bfN" = ( @@ -31778,12 +31249,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/prison) "bfR" = ( @@ -31926,10 +31392,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bgb" = ( @@ -32030,7 +31493,6 @@ /turf/closed/wall, /area/hydroponics) "bgm" = ( -/obj/machinery/door/firedoor, /obj/machinery/door/airlock{ name = "Hydroponics Backroom"; req_access_txt = "35" @@ -32043,6 +31505,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics) "bgn" = ( @@ -32060,10 +31523,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/service) "bgo" = ( @@ -32086,10 +31546,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "bgr" = ( @@ -32112,12 +31569,6 @@ /obj/item/reagent_containers/food/condiment/flour, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) -"bgt" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/glass/bowl, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/crew_quarters/kitchen) "bgu" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/bot, @@ -32168,12 +31619,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "bgy" = ( @@ -32278,7 +31724,7 @@ /turf/open/floor/plating, /area/quartermaster/miningoffice) "bgH" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -32389,12 +31835,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bgR" = ( @@ -32437,12 +31878,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bgU" = ( @@ -32463,7 +31899,7 @@ "bha" = ( /obj/machinery/door/airlock/security/glass{ name = "Prison Wing"; - req_access_txt = "1" + req_one_access_txt = "1;34" }, /obj/structure/cable/yellow{ icon_state = "1-2" @@ -32478,10 +31914,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "bhb" = ( @@ -32499,7 +31932,7 @@ "bhc" = ( /obj/machinery/door/airlock/security/glass{ name = "Prison Wing"; - req_access_txt = "1" + req_one_access_txt = "1;34" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ @@ -32511,10 +31944,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "bhd" = ( @@ -32765,7 +32195,7 @@ /turf/open/floor/engine/n2, /area/engine/atmos) "bhw" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/machinery/atmospherics/miner/station/nitrogen, /turf/open/floor/engine/n2, /area/engine/atmos) "bhx" = ( @@ -32913,6 +32343,9 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/item/radio/intercom{ + pixel_y = 26 + }, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "bhM" = ( @@ -32948,8 +32381,10 @@ /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "bhO" = ( -/obj/item/radio/intercom{ - pixel_y = 26 +/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/white, /area/crew_quarters/kitchen) @@ -33048,12 +32483,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "bhX" = ( @@ -33142,12 +32572,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bif" = ( @@ -33209,6 +32634,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bij" = ( @@ -33222,6 +32650,9 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bik" = ( @@ -33241,12 +32672,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bil" = ( @@ -33262,6 +32691,9 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bim" = ( @@ -33279,6 +32711,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bin" = ( @@ -33302,6 +32737,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bio" = ( @@ -33319,6 +32757,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bip" = ( @@ -33335,6 +32776,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "biq" = ( @@ -33349,6 +32793,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bir" = ( @@ -33386,7 +32833,6 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/miningoffice) "biy" = ( @@ -33486,7 +32932,7 @@ /turf/open/floor/plasteel, /area/security/brig) "biE" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/cable/yellow{ icon_state = "1-2" }, @@ -33515,7 +32961,7 @@ /turf/open/floor/plasteel, /area/security/brig) "biG" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -33641,7 +33087,6 @@ id = "hosspace"; name = "HoS Space Blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "biR" = ( @@ -33659,7 +33104,6 @@ id = "hosspace"; name = "HoS Space Blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "biS" = ( @@ -33671,7 +33115,6 @@ id = "hosspace"; name = "HoS Space Blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "biT" = ( @@ -33999,7 +33442,7 @@ "bjo" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/flashlight, /obj/effect/spawner/lootdrop/maintenance, @@ -34104,12 +33547,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics) "bjx" = ( @@ -34162,12 +33600,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "bjB" = ( @@ -34305,12 +33738,7 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "bjM" = ( @@ -34388,7 +33816,7 @@ /area/hallway/primary/fore) "bjR" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/brown, @@ -34442,6 +33870,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bjV" = ( @@ -34450,12 +33879,12 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bjW" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -34568,7 +33997,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/miningoffice) "bkf" = ( @@ -34577,7 +34005,6 @@ }, /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/miningoffice) "bkk" = ( @@ -34635,6 +34062,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/security/brig) "bko" = ( @@ -34879,9 +34307,7 @@ /turf/open/floor/engine/n2o, /area/engine/atmos) "bkH" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide{ - valve_open = 1 - }, +/obj/machinery/atmospherics/miner/station/n2o, /turf/open/floor/engine/n2o, /area/engine/atmos) "bkI" = ( @@ -35178,12 +34604,6 @@ /obj/item/storage/bag/plants/portaseeder, /obj/machinery/door/window/eastright, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel, /area/hydroponics) "blm" = ( @@ -35234,12 +34654,7 @@ /obj/item/storage/bag/tray, /obj/machinery/door/window/westleft, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "blq" = ( @@ -35281,23 +34696,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) -"blu" = ( -/obj/structure/rack, -/obj/machinery/button/door{ - id = "kitchenwindows"; - name = "Kitchen Privacy Control"; - pixel_y = -26; - req_access_txt = "28" - }, -/obj/item/storage/box/donkpockets, -/obj/item/clothing/head/chefhat, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/effect/spawner/lootdrop/donkpockets, -/turf/open/floor/plasteel, -/area/crew_quarters/kitchen) "blv" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/food/snacks/mint, @@ -35448,7 +34846,7 @@ /area/hallway/primary/fore) "blJ" = ( /obj/machinery/light, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/brown, @@ -35537,6 +34935,7 @@ /obj/structure/cable/yellow{ icon_state = "1-4" }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "blS" = ( @@ -35611,6 +35010,9 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light, /obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "blY" = ( @@ -35633,7 +35035,7 @@ /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bma" = ( -/obj/machinery/computer/shuttle/mining{ +/obj/machinery/computer/shuttle_flight/mining{ dir = 1 }, /obj/effect/turf_decal/bot, @@ -35712,6 +35114,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/brig) "bmj" = ( @@ -35812,7 +35217,7 @@ /turf/open/floor/plasteel, /area/security/main) "bmr" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -35959,7 +35364,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -35997,7 +35402,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -36193,7 +35598,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 9 }, @@ -36230,7 +35635,6 @@ /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bnd" = ( @@ -36367,10 +35771,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/service) "bnp" = ( @@ -36411,10 +35812,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "bnt" = ( @@ -36431,10 +35829,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "bnu" = ( @@ -36457,10 +35852,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "bnw" = ( @@ -36471,10 +35863,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "bnx" = ( @@ -36489,10 +35878,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "bnz" = ( @@ -36505,10 +35891,7 @@ }, /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bnB" = ( @@ -36534,7 +35917,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/miningoffice) "bnD" = ( @@ -36545,7 +35927,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/execution/transfer) "bnE" = ( @@ -36556,7 +35937,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/execution/transfer) "bnF" = ( @@ -36567,7 +35947,6 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/execution/transfer) "bnG" = ( @@ -36774,6 +36153,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/landmark/secequipment, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark, /area/security/main) "bnU" = ( @@ -36872,7 +36253,6 @@ id = "hosroom"; name = "HoS Room Blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "boe" = ( @@ -36994,10 +36374,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "boo" = ( @@ -37155,7 +36532,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral{ @@ -37227,12 +36604,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "boL" = ( @@ -37445,7 +36817,7 @@ /turf/open/floor/plating, /area/security/execution/transfer) "bpd" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -37468,7 +36840,7 @@ /turf/open/floor/plasteel, /area/security/execution/transfer) "bpf" = ( -/obj/machinery/computer/shuttle/labor, +/obj/machinery/computer/shuttle_flight/labor, /obj/machinery/status_display/evac{ pixel_y = 32 }, @@ -37678,6 +37050,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "bpu" = ( @@ -37786,6 +37159,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "bpB" = ( @@ -37824,7 +37198,6 @@ id = "hosroom"; name = "HoS Room Blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "bpF" = ( @@ -38235,7 +37608,7 @@ /turf/closed/wall/r_wall, /area/engine/atmos) "bqm" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/yellow{ @@ -38443,12 +37816,7 @@ }, /obj/item/reagent_containers/food/snacks/grown/apple, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics) "bqE" = ( @@ -38563,12 +37931,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bqK" = ( @@ -38750,12 +38113,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bqX" = ( @@ -38811,6 +38169,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/central) "bra" = ( @@ -38854,12 +38213,7 @@ name = "Shared Engineering Storage"; req_one_access_txt = "32;19" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -38938,6 +38292,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/security/brig) "brm" = ( @@ -38979,7 +38334,7 @@ }, /obj/machinery/door/airlock/security/glass{ name = "Security Office"; - req_access_txt = "63" + req_one_access_txt = "1;4" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -38993,12 +38348,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/main) "brp" = ( @@ -39269,7 +38619,6 @@ id = "hosroom"; name = "HoS Room Blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "brK" = ( @@ -39695,12 +39044,7 @@ /obj/item/reagent_containers/food/snacks/grown/watermelon, /obj/item/reagent_containers/food/snacks/grown/banana, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics) "bsA" = ( @@ -39955,12 +39299,12 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "bsU" = ( @@ -40000,7 +39344,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/execution/transfer) "btb" = ( @@ -40021,7 +39364,6 @@ icon_state = "4-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/execution/transfer) "btd" = ( @@ -40052,8 +39394,8 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, /turf/open/floor/plasteel, /area/security/execution/transfer) @@ -40150,7 +39492,7 @@ }, /obj/machinery/door/airlock/security/glass{ name = "Security Transferring Control"; - req_access_txt = "63" + req_one_access_txt = "1;4" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -40165,12 +39507,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/execution/transfer) "btk" = ( @@ -40246,7 +39583,7 @@ }, /obj/machinery/door/airlock/security/glass{ name = "Security Office"; - req_access_txt = "63" + req_one_access_txt = "1;4" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -40257,12 +39594,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/main) "bto" = ( @@ -40761,12 +40093,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bua" = ( @@ -40906,10 +40233,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "buo" = ( @@ -40923,10 +40247,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bup" = ( @@ -40938,10 +40259,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "buq" = ( @@ -40962,10 +40280,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "but" = ( @@ -41048,6 +40363,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/execution/transfer) "buE" = ( @@ -41081,9 +40397,6 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -41152,16 +40465,19 @@ /turf/open/floor/plating, /area/security/main) "buM" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24; - pixel_y = -32 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/red{ + dir = 1 }, /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/light/small, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, /turf/open/floor/plasteel, -/area/security/main) +/area/security/brig) "buN" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -41169,9 +40485,6 @@ /turf/open/floor/plasteel, /area/security/main) "buO" = ( -/obj/structure/chair/office{ - dir = 1 - }, /obj/effect/landmark/start/security_officer, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -41233,7 +40546,7 @@ /turf/open/floor/plasteel/dark, /area/security/main) "buT" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/power/apc{ areastring = "/area/crew_quarters/heads/hos"; dir = 2; @@ -41480,7 +40793,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bvk" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light/small, /obj/machinery/light_switch{ pixel_x = 26; @@ -41740,12 +41053,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bvJ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/space/nearstation) "bvK" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, @@ -41787,7 +41094,6 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/central) "bvP" = ( @@ -41900,6 +41206,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/execution/transfer) "bvZ" = ( @@ -41907,8 +41214,8 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 }, /turf/open/floor/plasteel, /area/security/execution/transfer) @@ -41930,31 +41237,16 @@ /turf/open/floor/plasteel, /area/security/execution/transfer) "bwb" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 }, /turf/open/floor/plasteel, /area/security/execution/transfer) "bwc" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/structure/reagent_dispensers/peppertank{ - pixel_y = -32 - }, /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, /area/security/execution/transfer) "bwd" = ( @@ -41975,74 +41267,114 @@ /turf/open/floor/plasteel, /area/security/brig) "bwe" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Security - Brig Fore"; dir = 8 }, -/turf/open/floor/plasteel, -/area/security/main) -"bwf" = ( -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_y = -32 +/obj/item/radio/intercom{ + pixel_y = -26 }, /obj/effect/turf_decal/tile/red{ dir = 8 }, /turf/open/floor/plasteel, +/area/security/brig) +"bwf" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, /area/security/main) "bwg" = ( -/turf/open/floor/plasteel, +/obj/machinery/door/airlock/security{ + name = "Interrogation"; + req_access_txt = "63" + }, +/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/door/firedoor, +/turf/open/floor/plasteel/dark, /area/security/main) "bwh" = ( -/obj/structure/sign/plaques/golden{ - pixel_y = -32 +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/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/door/airlock/security{ + name = "Brig"; + req_access_txt = "63" + }, +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_x = -32 }, -/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, -/area/security/main) +/area/security/brig) "bwi" = ( -/obj/machinery/light, -/obj/machinery/status_display/ai{ - pixel_y = -32 - }, -/obj/machinery/camera{ - c_tag = "Security - Office Aft"; - dir = 1 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ - dir = 8 + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 }, /turf/open/floor/plasteel, -/area/security/main) +/area/security/brig) "bwj" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/holopad, +/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, +/turf/open/floor/plasteel/dark, /area/security/main) "bwk" = ( /obj/structure/cable/yellow{ - icon_state = "1-2" + icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/turf/open/floor/plasteel, -/area/security/main) -"bwl" = ( -/obj/item/storage/pod{ - pixel_x = 32 +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/obj/effect/landmark/secequipment, -/obj/effect/turf_decal/bot, +/obj/machinery/door/airlock/security{ + name = "Interrogation Monitoring"; + req_access_txt = "63" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -42053,8 +41385,16 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/main) +"bwl" = ( +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, +/area/security/main) "bwm" = ( /obj/structure/cable/white, /obj/structure/cable/yellow{ @@ -42068,7 +41408,6 @@ id = "hosspace"; name = "HoS Space Blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "bwn" = ( @@ -42079,7 +41418,7 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) @@ -42108,7 +41447,7 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/sign/warning/nosmoking{ pixel_y = 32 }, @@ -42223,10 +41562,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bwB" = ( @@ -42488,7 +41824,6 @@ id = "bridgewindows"; name = "Bridge View Blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "bwS" = ( @@ -42503,7 +41838,6 @@ id = "bridgewindows"; name = "Bridge View Blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "bwT" = ( @@ -42518,7 +41852,6 @@ id = "bridgewindows"; name = "Bridge View Blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "bwU" = ( @@ -42533,7 +41866,6 @@ id = "bridgewindows"; name = "Bridge View Blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "bwW" = ( @@ -42551,7 +41883,6 @@ id = "bridgewindows"; name = "Bridge View Blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "bwX" = ( @@ -42563,7 +41894,6 @@ id = "bridgewindows"; name = "Bridge View Blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "bwY" = ( @@ -42617,7 +41947,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/central) "bxc" = ( @@ -42628,7 +41957,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/nuke_storage) "bxd" = ( @@ -42682,7 +42010,7 @@ }, /obj/machinery/door/airlock/security/glass{ name = "Security Transferring Control"; - req_access_txt = "63" + req_one_access_txt = "1;4" }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red{ @@ -42695,10 +42023,8 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/execution/transfer) "bxn" = ( @@ -42706,39 +42032,48 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/security/execution/transfer) "bxo" = ( -/obj/item/twohanded/required/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, +/turf/closed/wall/r_wall, /area/security/brig) "bxp" = ( -/obj/machinery/newscaster/security_unit{ - pixel_x = 32 +/obj/structure/cable/yellow{ + icon_state = "0-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/camera{ - c_tag = "Security - Brig Fore"; +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, +/area/security/main) +"bxq" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/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/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/plasteel, /area/security/brig) -"bxq" = ( -/obj/machinery/door/airlock/security{ - name = "Interrogation"; - req_access_txt = "63" +"bxr" = ( +/obj/structure/chair/office{ + dir = 8 }, +/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -42749,34 +42084,15 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel/dark, /area/security/main) -"bxr" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/effect/spawner/structure/window/reinforced/tinted, -/turf/open/floor/plating, -/area/security/main) "bxs" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/airlock/security{ - name = "Interrogation Monitoring"; - req_access_txt = "63" +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -42790,11 +42106,20 @@ /turf/open/floor/plasteel/dark, /area/security/main) "bxt" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/effect/spawner/structure/window/reinforced/tinted, -/turf/open/floor/plating, +/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/main) "bxu" = ( /obj/structure/window/reinforced{ @@ -42953,10 +42278,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bxE" = ( @@ -43102,7 +42423,7 @@ /area/engine/atmos) "bxT" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, @@ -43242,7 +42563,6 @@ id = "bridgewindows"; name = "Bridge View Blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "byg" = ( @@ -43418,6 +42738,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) "byu" = ( @@ -43470,6 +42791,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/nuke_storage) "byw" = ( @@ -43535,18 +42857,27 @@ /obj/machinery/gulag_item_reclaimer{ pixel_y = 28 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, +/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/effect/turf_decal/stripes/line{ + dir = 9 + }, /turf/open/floor/plasteel, -/area/security/execution/transfer) +/area/hallway/primary/starboard) "byE" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -43561,110 +42892,125 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel, -/area/security/execution/transfer) +/area/hallway/primary/starboard) "byF" = ( -/obj/structure/table/reinforced, -/obj/item/storage/briefcase{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/secure/briefcase, /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/tile/red{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, /turf/open/floor/plasteel, -/area/security/execution/transfer) +/area/hallway/primary/starboard) "byG" = ( -/obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 1 +/obj/structure/chair/office{ + dir = 4 }, -/obj/item/folder/red, -/obj/item/book/manual/wiki/security_space_law, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/security/execution/transfer) +/turf/open/floor/plasteel/dark, +/area/security/main) "byH" = ( /obj/structure/table/reinforced, -/obj/item/paper_bin, +/obj/item/folder/red, /obj/item/pen, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/security/execution/transfer) +/turf/open/floor/plasteel/dark, +/area/security/main) "byI" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 +/obj/structure/table/wood, +/obj/machinery/light/small{ + dir = 4 }, -/obj/effect/turf_decal/tile/red{ +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/camera{ + c_tag = "Security - Interrogation Monitoring"; + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/security/execution/transfer) +/turf/open/floor/plasteel/dark, +/area/security/main) "byJ" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/security/brig) "byK" = ( -/obj/machinery/light{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, /turf/open/floor/plasteel, /area/security/brig) "byL" = ( -/turf/closed/wall, +/turf/open/floor/plasteel, /area/security/main) "byM" = ( /obj/effect/turf_decal/tile/neutral{ @@ -43680,7 +43026,10 @@ /turf/open/floor/plasteel/dark, /area/security/main) "byN" = ( -/obj/machinery/holopad, +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -43694,9 +43043,13 @@ /turf/open/floor/plasteel/dark, /area/security/main) "byO" = ( +/obj/structure/cable/white, /obj/structure/cable/yellow{ icon_state = "0-2" }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/security/main) @@ -43704,7 +43057,9 @@ /obj/structure/chair/office{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -43719,10 +43074,12 @@ /area/security/main) "byQ" = ( /obj/structure/cable/yellow{ - icon_state = "1-2" + icon_state = "1-8" }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/item/radio/intercom{ + frequency = 1423; + name = "Interrogation Intercom"; + pixel_y = -58 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -43867,7 +43224,7 @@ /turf/open/floor/circuit/green, /area/ai_monitored/turret_protected/ai) "bzb" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -44044,10 +43401,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/break_room) "bzs" = ( @@ -44153,12 +43507,7 @@ }, /obj/machinery/door/window/eastright, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bzz" = ( @@ -44224,10 +43573,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/tech) "bzD" = ( @@ -44516,7 +43862,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/central) "bzX" = ( @@ -44524,7 +43869,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/nuke_storage) "bzY" = ( @@ -44560,7 +43904,7 @@ dir = 6 }, /turf/open/floor/plasteel, -/area/security/execution/transfer) +/area/hallway/primary/starboard) "bAf" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -44578,7 +43922,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/security/execution/transfer) +/area/hallway/primary/starboard) "bAg" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -44587,55 +43931,45 @@ dir = 4 }, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/security/execution/transfer) +/area/hallway/primary/starboard) "bAh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/closet/secure_closet/brig{ + id = "brig3"; + name = "Cell 3 Locker" }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/light/small{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red{ dir = 8 }, /turf/open/floor/plasteel, -/area/security/execution/transfer) +/area/security/brig) "bAi" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/security/execution/transfer) -"bAj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/effect/landmark/start/security_officer, +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light, /turf/open/floor/plasteel, -/area/security/execution/transfer) -"bAk" = ( -/obj/machinery/door/airlock/security{ - name = "Security Transferring Center"; - req_access_txt = "63" +/area/security/main) +"bAj" = ( +/obj/machinery/flasher{ + id = "brig3"; + pixel_y = 26 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, /obj/effect/turf_decal/tile/red{ @@ -44645,35 +43979,34 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/turf/open/floor/plasteel, +/area/security/brig) +"bAk" = ( /obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 + dir = 1 }, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, /turf/open/floor/plasteel, /area/security/execution/transfer) "bAl" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /turf/open/floor/plasteel, /area/security/brig) "bAm" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -44684,51 +44017,46 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/security/brig) +/turf/open/floor/plasteel/dark, +/area/security/main) "bAn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/security/brig) "bAo" = ( -/obj/machinery/door/airlock/security{ - name = "Interrogation"; - req_access_txt = "63" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/effect/turf_decal/tile/neutral{ - dir = 1 + dir = 8 }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ - dir = 4 + dir = 1 }, /obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/machinery/door/airlock/security{ + name = "Interrogation"; + req_access_txt = "63" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/main) "bAp" = ( /obj/structure/chair/office{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -44744,8 +44072,21 @@ /area/security/main) "bAq" = ( /obj/structure/table/reinforced, -/obj/item/folder/red, -/obj/item/pen, +/obj/item/flashlight/lamp, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1423; + listening = 0; + name = "Interrogation Intercom"; + pixel_y = -24 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Security - Interrogation"; + dir = 1 + }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -44762,7 +44103,10 @@ /obj/structure/chair/office{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/sign/poster/official/do_not_question{ + pixel_y = -32 + }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -44777,21 +44121,18 @@ /area/security/main) "bAs" = ( /obj/structure/cable/white, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, /obj/effect/spawner/structure/window/reinforced/tinted, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/security/main) "bAt" = ( /obj/structure/chair/office{ dir = 8 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -44806,13 +44147,9 @@ /turf/open/floor/plasteel/dark, /area/security/main) "bAu" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/item/radio/intercom{ - frequency = 1423; - name = "Interrogation Intercom"; - pixel_y = -58 +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -44828,15 +44165,8 @@ /area/security/main) "bAv" = ( /obj/structure/table/wood, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/item/paper_bin, +/obj/item/folder/red, /obj/item/pen, -/obj/machinery/camera{ - c_tag = "Security - Interrogation Monitoring"; - dir = 8 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -44890,7 +44220,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) "bAz" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, @@ -45106,10 +44436,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bAR" = ( @@ -45390,7 +44716,7 @@ /turf/open/floor/plasteel, /area/storage/tech) "bBl" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/storage/tech) @@ -45525,7 +44851,7 @@ name = "WARNING: BLAST DOORS"; pixel_y = 32 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/blue{ @@ -45554,7 +44880,7 @@ /turf/open/floor/plasteel/dark, /area/bridge) "bBz" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -45613,22 +44939,9 @@ /obj/structure/table/reinforced, /obj/item/clipboard, /obj/item/mining_voucher, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bBG" = ( -/obj/item/radio/intercom{ - pixel_x = -26; - pixel_y = 26 - }, -/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/item/storage/secure/safe/caps_spare{ + pixel_x = 6; + pixel_y = 28 }, /turf/open/floor/plasteel/dark, /area/bridge) @@ -45777,7 +45090,6 @@ "bBS" = ( /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/central) "bBU" = ( @@ -45852,24 +45164,16 @@ /turf/open/floor/plasteel/dark, /area/security/nuke_storage) "bBY" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/security/execution/transfer) +/area/hallway/primary/starboard) "bBZ" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral{ @@ -45885,60 +45189,59 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, -/turf/open/floor/plasteel, -/area/security/execution/transfer) -"bCa" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/execution/transfer) -"bCb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"bCa" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red{ dir = 8 }, /turf/open/floor/plasteel, /area/security/execution/transfer) +"bCb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/security/brig) "bCc" = ( -/obj/item/radio/intercom{ - pixel_x = 26 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel, -/area/security/execution/transfer) +/area/security/brig) "bCd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/turf/closed/wall/r_wall, -/area/security/execution/transfer) -"bCe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/window/brigdoor/security/cell/westright{ + id = "brig3"; + name = "Cell 3" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/light/small, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -45947,58 +45250,59 @@ }, /turf/open/floor/plasteel, /area/security/brig) -"bCf" = ( +"bCe" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 + icon_state = "4-8" }, -/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/security/brig) -"bCg" = ( -/obj/item/radio/intercom{ - pixel_y = -26 +"bCf" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/starboard) +"bCg" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 26 }, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/brig) "bCh" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/turf/closed/wall, -/area/security/main) -"bCi" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/light{ dir = 4 }, -/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, +/area/security/brig) +"bCi" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/turf/open/floor/plasteel/dark, -/area/security/main) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/starboard) "bCj" = ( -/obj/structure/chair/office{ - dir = 4 +/obj/structure/closet{ + name = "Evidence Closet" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/machinery/light{ + dir = 1 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -46011,24 +45315,9 @@ dir = 8 }, /turf/open/floor/plasteel/dark, -/area/security/main) +/area/security/warden) "bCk" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight/lamp, -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1423; - listening = 0; - name = "Interrogation Intercom"; - pixel_y = -24 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Security - Interrogation"; - dir = 1 - }, +/obj/structure/closet/secure_closet/evidence, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -46040,15 +45329,18 @@ dir = 8 }, /turf/open/floor/plasteel/dark, -/area/security/main) +/area/security/warden) "bCl" = ( -/obj/structure/chair/office{ - dir = 8 +/obj/item/radio/intercom{ + pixel_y = 26 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/structure/sign/poster/official/do_not_question{ - pixel_y = -32 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, +/turf/open/floor/plasteel, +/area/security/warden) +"bCm" = ( +/obj/machinery/suit_storage_unit/security, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -46060,67 +45352,56 @@ dir = 8 }, /turf/open/floor/plasteel/dark, -/area/security/main) -"bCm" = ( -/obj/structure/cable/white, -/obj/effect/spawner/structure/window/reinforced/tinted, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/main) +/area/security/warden) "bCn" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/machinery/advanced_airlock_controller{ + pixel_y = 26 }, -/turf/open/floor/plasteel/dark, -/area/security/main) +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "bCo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/security/main) +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "bCp" = ( -/obj/structure/table/wood, -/obj/item/folder/red, -/obj/item/pen, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/door/airlock/security{ + name = "Evidence Storage"; + req_one_access_txt = "1;4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/security/main) +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/security/warden) "bCq" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -46292,10 +45573,7 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/storage_shared) "bCH" = ( @@ -46326,10 +45604,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/storage_shared) "bCJ" = ( @@ -46471,7 +45746,7 @@ /turf/open/floor/plasteel, /area/engine/break_room) "bCU" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light{ dir = 1 }, @@ -46968,12 +46243,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "bDy" = ( @@ -47055,12 +46325,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "bDB" = ( @@ -47102,7 +46367,7 @@ /turf/open/floor/plasteel/dark, /area/bridge) "bDD" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -47353,12 +46618,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "bDP" = ( @@ -47415,12 +46675,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "bDR" = ( @@ -47471,7 +46726,6 @@ /turf/closed/wall, /area/security/execution/transfer) "bDW" = ( -/obj/structure/closet/emcloset, /obj/machinery/firealarm{ dir = 1; pixel_x = -32; @@ -47488,81 +46742,65 @@ pixel_x = -24; pixel_y = -8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/effect/turf_decal/tile/red{ + dir = 1 }, /turf/open/floor/plasteel, -/area/security/execution/transfer) +/area/hallway/primary/starboard) "bDX" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/structure/disposalpipe/sorting/mail{ dir = 8; name = "HoS Junction"; sortType = 8 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/security/execution/transfer) +/area/hallway/primary/starboard) "bDY" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ - dir = 8 + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, /turf/open/floor/plasteel, -/area/security/execution/transfer) +/area/hallway/primary/starboard) "bDZ" = ( -/obj/structure/chair{ - dir = 1 +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/obj/machinery/camera{ - c_tag = "Security - Transfer Centre Aft"; +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/sign/poster/official/work_for_a_future{ - pixel_y = -32 +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/security/execution/transfer) -"bEa" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, /turf/open/floor/plasteel, -/area/security/execution/transfer) -"bEb" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/structure/extinguisher_cabinet{ - pixel_x = 26 +/area/security/brig) +"bEa" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" }, -/obj/machinery/light_switch{ - pixel_y = -24 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 }, +/turf/open/floor/plating, +/area/hallway/primary/starboard) +"bEb" = ( +/obj/structure/bed, +/obj/item/bedsheet, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 @@ -47570,26 +46808,46 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, /turf/open/floor/plasteel, -/area/security/execution/transfer) -"bEc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, /area/security/brig) +"bEc" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/primary/starboard) "bEd" = ( /obj/structure/cable/yellow{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/machinery/door/airlock/security{ - name = "Brig"; - req_access_txt = "63" +/obj/structure/cable/yellow{ + icon_state = "2-4" }, -/obj/structure/disposalpipe/segment, -/obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_x = -32 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/floor/plasteel, -/area/security/brig) +/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/warden) "bEe" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, @@ -47811,12 +47069,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bEq" = ( @@ -47875,12 +47128,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bEv" = ( @@ -47949,12 +47197,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/storage_shared) "bEA" = ( @@ -48034,12 +47277,10 @@ name = "Shared Engineering Storage"; req_one_access_txt = "32;19" }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/storage_shared) "bEF" = ( @@ -48227,7 +47468,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "bES" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/status_display/evac{ pixel_x = -32 }, @@ -48256,7 +47497,7 @@ /turf/open/floor/plasteel, /area/storage/tech) "bEV" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/status_display/ai{ pixel_x = 32 }, @@ -48425,12 +47666,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "bFi" = ( @@ -48502,12 +47738,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "bFl" = ( @@ -48625,7 +47856,7 @@ /turf/open/floor/plasteel/dark, /area/bridge) "bFr" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -48684,7 +47915,7 @@ /turf/open/floor/plasteel/grimy, /area/bridge) "bFx" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -48787,12 +48018,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "bFD" = ( @@ -48835,44 +48061,35 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bFG" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, /obj/structure/sign/warning/electricshock{ pixel_x = -32 }, -/turf/open/floor/plating, -/area/security/execution/transfer) -"bFH" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/door/airlock/security/glass{ - id_tag = "gulagdoor"; - name = "Security Transferring Center"; - req_access_txt = "63" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"bFH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"bFI" = ( +/obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red{ dir = 4 }, -/turf/open/floor/plasteel, -/area/security/execution/transfer) -"bFI" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/security/execution/transfer) +/obj/structure/sign/warning/electricshock{ + pixel_x = 32 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "bFJ" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -48881,21 +48098,25 @@ /turf/open/floor/plasteel, /area/security/brig) "bFK" = ( -/obj/machinery/disposal/bin, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light/small{ - dir = 1 +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/structure/disposalpipe/trunk, -/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/security/brig) "bFL" = ( /turf/closed/wall/r_wall, /area/security/warden) "bFM" = ( -/obj/structure/closet{ - name = "Evidence Closet" +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -48910,11 +48131,12 @@ /turf/open/floor/plasteel/dark, /area/security/warden) "bFN" = ( -/obj/structure/closet{ - name = "Evidence Closet" +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/light{ - dir = 1 +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -48929,7 +48151,9 @@ /turf/open/floor/plasteel/dark, /area/security/warden) "bFO" = ( -/obj/structure/closet/secure_closet/evidence, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -48944,14 +48168,33 @@ /area/security/warden) "bFP" = ( /obj/structure/cable/yellow{ - icon_state = "0-2" + icon_state = "4-8" }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/door/airlock/security/glass{ + name = "Security E.V.A. Storage"; + req_access_txt = "3" + }, +/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 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, /area/security/warden) "bFQ" = ( -/obj/item/radio/intercom{ - pixel_y = 26 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -48959,7 +48202,10 @@ /turf/open/floor/plasteel, /area/security/warden) "bFR" = ( -/obj/machinery/suit_storage_unit/security, +/obj/structure/tank_dispenser/oxygen, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -49336,7 +48582,7 @@ /turf/open/floor/plasteel, /area/engine/break_room) "bGt" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/firealarm{ dir = 8; pixel_x = 24 @@ -49562,7 +48808,7 @@ /turf/open/floor/plasteel, /area/storage/primary) "bGM" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/storage/primary) @@ -49612,7 +48858,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/blue, @@ -49891,7 +49137,7 @@ pixel_y = -32 }, /obj/machinery/light/small, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/blue, @@ -49915,14 +49161,10 @@ id = "detectivewindows"; name = "Detective Privacy Blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/detectives_office) "bHt" = ( /obj/structure/disposalpipe/segment, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-22" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -49942,17 +49184,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bHv" = ( -/obj/structure/disposalpipe/segment, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, +/turf/closed/wall, /area/hallway/primary/starboard) "bHw" = ( /obj/structure/cable/yellow{ @@ -49999,6 +49231,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/brig) "bHz" = ( @@ -50012,35 +49245,21 @@ /turf/open/floor/plating, /area/security/brig) "bHA" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/brig) "bHB" = ( /obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/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 + icon_state = "0-2" }, -/turf/open/floor/plasteel, -/area/security/brig) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/warden) "bHC" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -50053,38 +49272,25 @@ /turf/open/floor/plasteel, /area/security/brig) "bHD" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/security{ - name = "Evidence Storage"; - req_access_txt = "63" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, -/area/security/warden) +/area/science/xenobiology) "bHE" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -50099,13 +49305,7 @@ /area/security/warden) "bHF" = ( /obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 + icon_state = "1-2" }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -50120,12 +49320,8 @@ /turf/open/floor/plasteel/dark, /area/security/warden) "bHG" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/landmark/blobstart, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/structure/closet{ + name = "Evidence Closet" }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -50140,8 +49336,10 @@ /turf/open/floor/plasteel/dark, /area/security/warden) "bHH" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/structure/closet/secure_closet/evidence, +/obj/machinery/camera{ + c_tag = "Security - Evidence Storage"; + dir = 1 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -50156,44 +49354,19 @@ /turf/open/floor/plasteel/dark, /area/security/warden) "bHI" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/door/airlock/security/glass{ - name = "Security E.V.A. Storage"; - req_access_txt = "3" - }, -/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, +/obj/structure/cable/white, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/security/warden) "bHJ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plasteel, /area/security/warden) "bHK" = ( -/obj/structure/tank_dispenser/oxygen, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, +/obj/machinery/suit_storage_unit/security, +/obj/machinery/light/small, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -50207,11 +49380,16 @@ /turf/open/floor/plasteel/dark, /area/security/warden) "bHL" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/mob/living/simple_animal/pet/dog/bullterrier/walter, +/obj/structure/bed/dogbed/walter, +/turf/open/floor/plasteel, /area/security/warden) "bHM" = ( /obj/structure/table/reinforced, @@ -50357,7 +49535,7 @@ /turf/closed/wall, /area/engine/break_room) "bHY" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light{ dir = 8 }, @@ -50491,12 +49669,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/break_room) "bIi" = ( @@ -50538,12 +49711,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/break_room) "bIm" = ( @@ -50807,12 +49975,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/primary) "bIF" = ( @@ -50850,10 +50013,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/bridge/meeting_room/council) "bIK" = ( @@ -51014,10 +50174,7 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/crew_quarters/heads/captain) "bIY" = ( @@ -51103,9 +50260,6 @@ /turf/open/floor/plasteel, /area/maintenance/starboard) "bJg" = ( -/obj/structure/table/wood, -/obj/item/clipboard, -/obj/item/toy/figure/detective, /obj/structure/sign/poster/official/report_crimes{ pixel_y = 32 }, @@ -51119,6 +50273,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/vending/wardrobe/det_wardrobe, /turf/open/floor/plasteel/dark, /area/security/detectives_office) "bJh" = ( @@ -51285,9 +50440,6 @@ /area/security/detectives_office) "bJp" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, /obj/structure/disposalpipe/segment, /obj/machinery/camera{ c_tag = "Security Hallway - Fore"; @@ -51300,21 +50452,23 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bJq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, +/obj/item/kirbyplants/random, +/obj/machinery/door_timer{ + id = "brig3"; + name = "Cell 3"; + pixel_x = -32 + }, /turf/open/floor/plasteel, -/area/hallway/primary/starboard) +/area/security/brig) "bJr" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red{ @@ -51364,6 +50518,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/brig) "bJv" = ( @@ -51422,27 +50577,56 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red, +/obj/machinery/camera{ + c_tag = "Security - Brig Center"; + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/brig) -"bJz" = ( -/obj/structure/table, -/obj/item/stack/packageWrap, -/obj/item/hand_labeler, -/obj/effect/turf_decal/tile/neutral{ +"bJA" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/security/glass{ + name = "Warden's Office"; + req_access_txt = "3" + }, +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/turf/open/floor/plasteel/dark, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, /area/security/warden) -"bJA" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" +"bJB" = ( +/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/item/radio/intercom{ + pixel_y = 26 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -51455,12 +50639,18 @@ dir = 8 }, /turf/open/floor/plasteel/dark, -/area/security/warden) -"bJB" = ( -/obj/structure/closet/secure_closet/evidence, -/obj/machinery/camera{ - c_tag = "Security - Evidence Storage"; - dir = 1 +/area/ai_monitored/security/armory) +"bJC" = ( +/obj/item/storage/box/chemimp{ + pixel_x = 6 + }, +/obj/item/storage/box/trackimp{ + pixel_x = -3 + }, +/obj/item/storage/lockbox/loyalty, +/obj/structure/table/reinforced, +/obj/machinery/airalarm{ + pixel_y = 22 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -51473,21 +50663,35 @@ dir = 8 }, /turf/open/floor/plasteel/dark, -/area/security/warden) -"bJC" = ( -/obj/structure/cable/white, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/warden) +/area/ai_monitored/security/armory) "bJD" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/item/storage/box/firingpins, +/obj/item/storage/box/firingpins, +/obj/item/key/security, +/obj/structure/table/reinforced, +/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, -/area/security/warden) +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) "bJE" = ( -/obj/machinery/suit_storage_unit/security, -/obj/machinery/light/small, +/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 + }, +/obj/structure/table/reinforced, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -51499,7 +50703,7 @@ dir = 8 }, /turf/open/floor/plasteel/dark, -/area/security/warden) +/area/ai_monitored/security/armory) "bJF" = ( /obj/structure/chair/office{ dir = 8 @@ -51664,6 +50868,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bJP" = ( @@ -51671,7 +50876,7 @@ /turf/closed/wall/r_wall, /area/engine/transit_tube) "bJQ" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -51714,7 +50919,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/item/twohanded/rcl/pre_loaded, +/obj/item/rcl/pre_loaded, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -51777,7 +50982,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) "bJV" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/firealarm{ pixel_y = 24 }, @@ -52112,12 +51317,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/primary) "bKx" = ( @@ -52144,7 +51344,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/bridge/meeting_room/council) "bKB" = ( @@ -52223,10 +51423,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "bKK" = ( @@ -52315,7 +51512,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) "bKT" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/crew_quarters/heads/captain) "bKU" = ( @@ -52562,9 +51759,6 @@ /turf/open/floor/plasteel, /area/security/brig) "bLm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, /obj/structure/bed, /obj/item/bedsheet, /obj/effect/turf_decal/tile/red, @@ -52574,6 +51768,9 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/brig) "bLn" = ( @@ -52615,37 +51812,40 @@ /turf/open/floor/plasteel, /area/security/brig) "bLq" = ( +/obj/machinery/computer/crew, +/obj/machinery/requests_console{ + department = "Security"; + name = "Security RC"; + pixel_x = -32; + pixel_y = 32 + }, /obj/structure/cable/yellow{ - icon_state = "0-4" + icon_state = "4-8" }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/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/warden) "bLr" = ( /obj/structure/cable/yellow{ - icon_state = "1-4" + icon_state = "1-8" }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/airlock/security/glass{ - name = "Warden's Office"; - req_access_txt = "3" - }, /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/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/security/warden) "bLs" = ( @@ -52886,7 +52086,7 @@ /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bLK" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/firealarm{ dir = 8; pixel_x = 24 @@ -52911,7 +52111,7 @@ /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bLL" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light{ dir = 8 }, @@ -53005,12 +52205,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) "bLR" = ( @@ -53221,6 +52416,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/engineering) "bMd" = ( @@ -53250,7 +52446,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "bMg" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/status_display/ai{ pixel_x = -32 }, @@ -53284,7 +52480,7 @@ /turf/open/floor/plasteel, /area/storage/tech) "bMj" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/status_display/evac{ pixel_x = 32 }, @@ -53464,7 +52660,7 @@ name = "Telecomms Monitoring APC"; pixel_y = 24 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/cable/yellow{ icon_state = "0-2" }, @@ -53505,7 +52701,7 @@ /obj/machinery/airalarm{ pixel_y = 22 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -53818,7 +53014,6 @@ /turf/open/floor/plasteel/dark, /area/security/detectives_office) "bNh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, /obj/machinery/airalarm{ dir = 4; @@ -53843,13 +53038,14 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bNj" = ( /turf/closed/wall, /area/security/brig) "bNk" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/door_timer{ id = "brig1"; name = "Cell 1"; @@ -53859,10 +53055,6 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/camera{ - c_tag = "Security - Brig Center"; - dir = 4 - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -53881,22 +53073,13 @@ /turf/open/floor/plasteel, /area/security/brig) "bNm" = ( -/obj/machinery/computer/crew, -/obj/machinery/requests_console{ - department = "Security"; - name = "Security RC"; - pixel_x = -32; - pixel_y = 32 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/structure/chair/office{ + dir = 8 }, +/obj/effect/landmark/start/warden, /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, /obj/effect/turf_decal/tile/red{ dir = 8 }, @@ -53904,17 +53087,22 @@ /area/security/warden) "bNn" = ( /obj/structure/cable/yellow{ - icon_state = "1-8" + icon_state = "1-4" }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/red{ +/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/security/warden) "bNp" = ( @@ -53932,87 +53120,31 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) "bNq" = ( -/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/item/radio/intercom{ - pixel_y = 26 - }, -/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/stripes/line{ + dir = 9 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/ai_monitored/security/armory) "bNr" = ( -/obj/item/storage/box/chemimp{ - pixel_x = 6 - }, -/obj/item/storage/box/trackimp{ - pixel_x = -3 - }, -/obj/item/storage/lockbox/loyalty, -/obj/structure/table/reinforced, -/obj/machinery/airalarm{ - pixel_y = 22 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/stripes/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 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/ai_monitored/security/armory) "bNs" = ( -/obj/item/storage/box/firingpins, -/obj/item/storage/box/firingpins, -/obj/item/key/security, -/obj/structure/table/reinforced, -/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/stripes/line{ + dir = 5 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/ai_monitored/security/armory) "bNt" = ( -/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 +/obj/structure/closet/secure_closet/contraband/armory, +/obj/effect/spawner/lootdrop/maintenance/three, +/obj/effect/spawner/lootdrop/armory_contraband, +/obj/machinery/light{ + dir = 4 }, -/obj/structure/table/reinforced, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -54154,27 +53286,43 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Space Access Airlock"; + req_one_access_txt = "32;19" + }, /turf/open/floor/plasteel/dark, /area/aisat) "bNE" = ( /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Exterior Access"; - req_one_access_txt = "32;19" +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, /obj/effect/turf_decal/tile/neutral{ - dir = 1 + dir = 8 + }, +/obj/machinery/advanced_airlock_controller{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/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, +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume{ dir = 8 }, /turf/open/floor/plasteel/dark, @@ -54194,9 +53342,6 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, /turf/open/space, /area/space/nearstation) "bNH" = ( @@ -54533,7 +53678,7 @@ /turf/open/floor/plasteel, /area/engine/break_room) "bOe" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -55272,32 +54417,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/security/brig) -"bPs" = ( +"bPt" = ( /obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/northright{ - dir = 4; - name = "Warden's Desk"; - req_access_txt = "3" - }, -/obj/machinery/door/window/westleft{ - name = "Warden's Desk" - }, -/obj/item/folder/red, +/obj/item/paper_bin, /obj/item/pen, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/warden) -"bPt" = ( -/obj/structure/chair/office{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/effect/landmark/start/warden, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -55310,10 +54436,13 @@ /obj/structure/cable/yellow{ icon_state = "1-4" }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -55327,12 +54456,15 @@ /turf/open/floor/plasteel, /area/security/warden) "bPv" = ( -/obj/machinery/computer/secure_data{ +/obj/machinery/computer/security{ dir = 8 }, /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 @@ -55350,30 +54482,101 @@ /turf/open/floor/plating, /area/ai_monitored/security/armory) "bPx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/northright{ + dir = 4; + name = "Warden's Desk"; + req_access_txt = "3" + }, +/obj/machinery/door/window/westleft{ + name = "Warden's Desk" }, +/obj/item/folder/red, +/obj/item/pen, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/ai_monitored/security/armory) +/area/security/warden) "bPy" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/rack, +/obj/item/gun/ballistic/shotgun/riot{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/ballistic/shotgun/riot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/bot, +/obj/item/gun/ballistic/shotgun/riot, +/obj/item/gun/ballistic/shotgun/riot, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ dir = 1 }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "bPz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/structure/rack, +/obj/item/storage/box/rubbershot{ + pixel_x = -3; + pixel_y = 3 }, -/turf/open/floor/plasteel, +/obj/item/storage/box/rubbershot{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/storage/box/rubbershot, +/obj/item/storage/box/rubbershot, +/obj/item/storage/box/rubbershot{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/box/rubbershot{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/box/breacherslug, +/obj/item/storage/box/breacherslug, +/obj/item/storage/box/breacherslug, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/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/ai_monitored/security/armory) "bPA" = ( -/obj/structure/closet/secure_closet/contraband/armory, -/obj/effect/spawner/lootdrop/maintenance/three, -/obj/effect/spawner/lootdrop/armory_contraband, -/obj/machinery/light{ - dir = 4 +/obj/structure/rack, +/obj/item/clothing/suit/armor/vest{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/suit/armor/vest, +/obj/item/clothing/suit/armor/vest{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/clothing/head/helmet{ + layer = 3.00001; + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/head/helmet{ + layer = 3.00001 + }, +/obj/item/clothing/head/helmet{ + layer = 3.00001; + pixel_x = 3; + pixel_y = -3 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -55426,7 +54629,6 @@ /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/aisat_interior) "bPF" = ( -/obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door/airlock/highsecurity{ name = "MiniSat Chamber"; @@ -55457,6 +54659,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "bPG" = ( @@ -55472,9 +54675,6 @@ /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/aisat_interior) "bPJ" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, /obj/structure/window/reinforced{ dir = 8 }, @@ -55537,7 +54737,7 @@ /turf/closed/wall, /area/engine/transit_tube) "bPN" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/airalarm{ dir = 4; pixel_x = -23 @@ -55579,7 +54779,7 @@ /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bPP" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light_switch{ pixel_x = 22; pixel_y = -10 @@ -55744,10 +54944,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/break_room) "bQa" = ( @@ -55756,7 +54953,7 @@ /turf/closed/wall, /area/engine/break_room) "bQb" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/break_room) @@ -55870,7 +55067,7 @@ /turf/open/floor/plasteel, /area/storage/tech) "bQm" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/firealarm{ dir = 1; pixel_y = -24 @@ -56037,7 +55234,7 @@ /turf/open/floor/wood, /area/bridge/meeting_room/council) "bQG" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -56288,7 +55485,7 @@ dir = 1; pixel_y = -26 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -56354,6 +55551,7 @@ /obj/item/paper_bin, /obj/item/pen, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/toy/figure/detective, /turf/open/floor/carpet/red, /area/security/detectives_office) "bRk" = ( @@ -56399,7 +55597,7 @@ /turf/open/floor/plasteel/dark, /area/security/detectives_office) "bRn" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, @@ -56451,10 +55649,14 @@ /area/security/brig) "bRq" = ( /obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/obj/item/clipboard, +/obj/item/toy/figure/warden, +/obj/machinery/light{ + dir = 8 }, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -56462,17 +55664,16 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/item/clothing/mask/gas/sechailer, +/obj/item/clothing/mask/gas/sechailer, /turf/open/floor/plasteel, /area/security/warden) "bRr" = ( /obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" + icon_state = "1-2" }, /obj/structure/cable/yellow{ - icon_state = "1-2" + icon_state = "2-4" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -56488,11 +55689,21 @@ /turf/open/floor/plasteel, /area/security/warden) "bRs" = ( -/obj/machinery/computer/security{ +/obj/machinery/computer/prisoner/management{ dir = 8 }, /obj/structure/cable/yellow{ - icon_state = "4-8" + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/security/warden"; + dir = 4; + name = "Warden's Office APC"; + pixel_x = 24 + }, +/obj/machinery/camera{ + c_tag = "Security - Warden's Office"; + dir = 8 }, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -56501,9 +55712,6 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, /turf/open/floor/plasteel, /area/security/warden) "bRt" = ( @@ -56514,21 +55722,20 @@ /area/ai_monitored/security/armory) "bRu" = ( /obj/structure/rack, -/obj/item/gun/ballistic/shotgun/riot{ +/obj/item/gun/energy/laser{ pixel_x = -3; pixel_y = 3 }, -/obj/item/gun/ballistic/shotgun/riot, +/obj/item/gun/energy/laser, +/obj/item/gun/energy/laser{ + pixel_x = 3; + pixel_y = -3 + }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/bot, -/obj/item/gun/ballistic/shotgun/riot, -/obj/item/gun/ballistic/shotgun/riot, /obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/window/reinforced{ - dir = 1 - }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "bRv" = ( @@ -56539,28 +55746,31 @@ /area/ai_monitored/security/armory) "bRw" = ( /obj/structure/rack, -/obj/item/clothing/suit/armor/vest{ +/obj/item/clothing/suit/armor/bulletproof{ pixel_x = -3; pixel_y = 3 }, -/obj/item/clothing/suit/armor/vest, -/obj/item/clothing/suit/armor/vest{ +/obj/item/clothing/suit/armor/bulletproof, +/obj/item/clothing/suit/armor/bulletproof{ pixel_x = 3; pixel_y = -3 }, -/obj/item/clothing/head/helmet{ +/obj/item/clothing/head/helmet/alt{ layer = 3.00001; pixel_x = -3; pixel_y = 3 }, -/obj/item/clothing/head/helmet{ +/obj/item/clothing/head/helmet/alt{ layer = 3.00001 }, -/obj/item/clothing/head/helmet{ +/obj/item/clothing/head/helmet/alt{ layer = 3.00001; pixel_x = 3; pixel_y = -3 }, +/obj/item/storage/secure/safe{ + pixel_x = 32 + }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -56662,7 +55872,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "bRF" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -56766,7 +55976,7 @@ /area/space/nearstation) "bRP" = ( /obj/structure/sign/warning/vacuum, -/turf/closed/wall, +/turf/closed/wall/r_wall, /area/space/nearstation) "bRQ" = ( /obj/structure/lattice, @@ -56793,7 +56003,7 @@ icon_state = "1-4" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 + dir = 6 }, /turf/open/space, /area/space/nearstation) @@ -56826,6 +56036,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bRX" = ( @@ -56913,7 +56124,7 @@ /turf/open/floor/plating, /area/crew_quarters/heads/chief) "bSd" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/newscaster{ pixel_y = 32 }, @@ -57085,10 +56296,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/tech) "bSt" = ( @@ -57102,10 +56310,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/primary) "bSu" = ( @@ -57118,10 +56323,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/primary) "bSv" = ( @@ -57146,10 +56348,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bSx" = ( @@ -57179,7 +56378,7 @@ /area/bridge/meeting_room/council) "bSz" = ( /obj/machinery/light, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/bridge/meeting_room/council) "bSA" = ( @@ -57238,12 +56437,12 @@ /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) "bSG" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) "bSH" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) "bSI" = ( @@ -57381,10 +56580,7 @@ name = "Auxiliary Tool Storage"; req_access_txt = "12" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/tools) "bSV" = ( @@ -57416,10 +56612,6 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/security/detectives_office) "bSY" = ( @@ -57500,32 +56692,28 @@ /area/security/brig) "bTf" = ( /obj/structure/table/reinforced, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/item/clipboard, -/obj/item/toy/figure/warden, -/obj/machinery/light{ - dir = 8 - }, +/obj/machinery/recharger, /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/item/clothing/mask/gas/sechailer, -/obj/item/clothing/mask/gas/sechailer, +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/obj/item/flashlight/seclite{ + pixel_y = 11 + }, +/obj/item/flashlight/seclite{ + pixel_y = 11 + }, /turf/open/floor/plasteel, /area/security/warden) "bTg" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -57540,25 +56728,16 @@ /turf/open/floor/plasteel, /area/security/warden) "bTh" = ( -/obj/machinery/computer/prisoner/management{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/security/warden"; - dir = 4; - name = "Warden's Office APC"; - pixel_x = 24 - }, -/obj/machinery/camera{ - c_tag = "Security - Warden's Office"; - dir = 8 +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -3; + pixel_y = 3 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/item/storage/toolbox/electrical, +/obj/item/screwdriver{ + pixel_y = 5 }, +/obj/item/multitool, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 @@ -57566,32 +56745,7 @@ /turf/open/floor/plasteel, /area/security/warden) "bTi" = ( -/obj/structure/rack, -/obj/item/storage/box/rubbershot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/box/rubbershot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/storage/box/rubbershot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/storage/box/breacherslug, -/obj/item/storage/box/breacherslug, -/obj/item/storage/box/breacherslug, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, +/obj/vehicle/ridden/secway, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -57606,12 +56760,12 @@ /area/ai_monitored/security/armory) "bTj" = ( /obj/structure/rack, -/obj/item/gun/energy/laser{ +/obj/item/gun/energy/disabler{ pixel_x = -3; pixel_y = 3 }, -/obj/item/gun/energy/laser, -/obj/item/gun/energy/laser{ +/obj/item/gun/energy/disabler, +/obj/item/gun/energy/disabler{ pixel_x = 3; pixel_y = -3 }, @@ -57624,29 +56778,34 @@ /area/ai_monitored/security/armory) "bTk" = ( /obj/structure/rack, -/obj/item/clothing/suit/armor/bulletproof{ +/obj/item/clothing/suit/armor/riot{ pixel_x = -3; pixel_y = 3 }, -/obj/item/clothing/suit/armor/bulletproof, -/obj/item/clothing/suit/armor/bulletproof{ +/obj/item/clothing/suit/armor/riot, +/obj/item/clothing/suit/armor/riot{ pixel_x = 3; pixel_y = -3 }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001; +/obj/item/clothing/head/helmet/riot{ pixel_x = -3; pixel_y = 3 }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001 +/obj/item/clothing/head/helmet/riot, +/obj/item/clothing/head/helmet/riot{ + pixel_x = 3; + pixel_y = -3 }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001; +/obj/item/shield/riot{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/shield/riot, +/obj/item/shield/riot{ pixel_x = 3; pixel_y = -3 }, -/obj/item/storage/secure/safe{ +/obj/structure/sign/nanotrasen{ pixel_x = 32 }, /obj/effect/turf_decal/tile/neutral{ @@ -57842,7 +57001,7 @@ /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/aisat_interior) "bTB" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/turretid{ control_area = "/area/ai_monitored/turret_protected/aisat_interior"; enabled = 1; @@ -58074,7 +57233,7 @@ /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bTO" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -58219,12 +57378,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) "bTV" = ( @@ -58344,7 +57498,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -58480,12 +57634,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bUm" = ( @@ -58621,12 +57770,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bUw" = ( @@ -58667,12 +57811,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bUz" = ( @@ -58717,10 +57856,7 @@ security_level = 6 }, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "bUD" = ( @@ -58780,10 +57916,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/tcommsat/server) "bUL" = ( @@ -58868,12 +58001,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bUT" = ( @@ -59043,12 +58171,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bVh" = ( @@ -59104,23 +58227,28 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bVk" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/door_timer{ id = "brig2"; name = "Cell 2"; pixel_x = -32 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, /turf/open/floor/plasteel, /area/security/brig) "bVm" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -59134,16 +58262,12 @@ /turf/open/floor/plasteel, /area/security/warden) "bVn" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -3; - pixel_y = 3 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/item/storage/toolbox/electrical, -/obj/item/screwdriver{ - pixel_y = 5 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/item/multitool, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 @@ -59152,75 +58276,72 @@ /area/security/warden) "bVo" = ( /obj/structure/cable/yellow{ - icon_state = "0-2" + icon_state = "1-8" }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/security{ + name = "Armoury"; + req_access_txt = "3"; + security_level = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, /area/ai_monitored/security/armory) "bVp" = ( -/obj/vehicle/ridden/secway, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/ai_monitored/security/armory) "bVq" = ( /obj/structure/rack, -/obj/item/gun/energy/disabler{ +/obj/item/gun/energy/e_gun{ pixel_x = -3; pixel_y = 3 }, -/obj/item/gun/energy/disabler, -/obj/item/gun/energy/disabler{ +/obj/item/gun/energy/e_gun, +/obj/item/gun/energy/e_gun{ pixel_x = 3; pixel_y = -3 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, /obj/effect/turf_decal/bot, /obj/structure/window/reinforced{ dir = 4 }, +/obj/structure/window/reinforced, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "bVr" = ( /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 - }, -/obj/item/shield/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/shield/riot, -/obj/item/shield/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, +/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 }, @@ -59264,7 +58385,6 @@ /turf/open/floor/plasteel/dark, /area/aisat) "bVu" = ( -/obj/machinery/door/firedoor, /obj/machinery/door/airlock/maintenance_hatch{ name = "MiniSat Maintenance"; req_access_txt = "16" @@ -59282,6 +58402,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "bVv" = ( @@ -59388,7 +58509,6 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor, /obj/machinery/door/airlock/maintenance_hatch{ name = "MiniSat Antechamber"; req_access_txt = "16" @@ -59412,6 +58532,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "bVB" = ( @@ -59496,7 +58617,6 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor, /obj/machinery/door/airlock/hatch{ name = "MiniSat Antechamber"; req_one_access_txt = "32;19" @@ -59514,6 +58634,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "bVJ" = ( @@ -59575,7 +58696,6 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor, /obj/machinery/door/airlock/hatch{ name = "MiniSat Access"; req_one_access_txt = "32;19" @@ -59593,6 +58713,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "bVN" = ( @@ -59832,7 +58953,7 @@ /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bWe" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light/small{ dir = 4 }, @@ -59933,7 +59054,7 @@ /turf/open/floor/plating, /area/crew_quarters/heads/chief) "bWm" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/firealarm{ dir = 1; pixel_x = -24; @@ -60160,12 +59281,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bWD" = ( @@ -60263,12 +59379,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bWL" = ( @@ -60394,7 +59505,7 @@ /turf/open/floor/wood, /area/crew_quarters/heads/hop) "bWS" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/disposalpipe/segment{ dir = 6 }, @@ -60410,7 +59521,7 @@ /turf/open/floor/wood, /area/crew_quarters/heads/hop) "bWU" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, /area/crew_quarters/heads/hop) @@ -60618,12 +59729,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bXn" = ( @@ -60797,12 +59903,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bXz" = ( @@ -60868,12 +59969,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "bXC" = ( @@ -60937,12 +60033,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "bXF" = ( @@ -60981,52 +60072,79 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, /turf/open/floor/plasteel, /area/security/brig) "bXH" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, -/obj/structure/disposalpipe/junction/flip{ - dir = 2 - }, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/security/brig) "bXI" = ( /obj/structure/cable/yellow{ - icon_state = "0-2" + icon_state = "1-8" }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "2-8" }, -/turf/open/floor/plating, +/obj/machinery/door/airlock/security/glass{ + name = "Warden's Office"; + req_access_txt = "3" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, /area/security/warden) "bXJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, /turf/open/floor/plasteel, /area/security/warden) "bXK" = ( /obj/structure/cable/yellow{ - icon_state = "1-2" + icon_state = "1-8" }, /obj/structure/cable/yellow{ - icon_state = "2-4" + icon_state = "1-2" + }, +/obj/machinery/button/door{ + id = "brigwindows"; + name = "Cell Window Control"; + pixel_x = -32; + pixel_y = -26; + req_access_txt = "63" + }, +/obj/machinery/button/door{ + id = "brigfront"; + name = "Brig Access Control"; + pixel_x = -26; + pixel_y = -36; + req_access_txt = "63" + }, +/obj/machinery/button/door{ + id = "brigprison"; + name = "Prison Lockdown"; + pixel_x = -38; + pixel_y = -36; + req_access_txt = "63" + }, +/obj/effect/landmark/start/warden, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -61040,12 +60158,7 @@ /turf/open/floor/plasteel, /area/security/warden) "bXL" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, +/obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 @@ -61054,87 +60167,30 @@ /area/security/warden) "bXM" = ( /obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" + icon_state = "1-2" }, /obj/machinery/door/airlock/security{ name = "Armoury"; req_access_txt = "3"; security_level = 6 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"bXN" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"bXO" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "bXP" = ( -/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 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/bot, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "bXQ" = ( /obj/structure/cable/yellow{ - icon_state = "2-8" + icon_state = "1-2" }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -61142,10 +60198,10 @@ /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/structure/closet/secure_closet/lethalshots, +/obj/machinery/light{ + dir = 4 + }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -61260,7 +60316,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "bXY" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/firealarm{ dir = 8; pixel_x = 24 @@ -61362,7 +60418,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "bYh" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/firealarm{ dir = 4; pixel_x = -24 @@ -61407,9 +60463,6 @@ /turf/open/floor/plasteel/dark, /area/aisat) "bYj" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, /obj/machinery/door/window/southleft, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -61421,6 +60474,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold4w/supply, /turf/open/floor/plasteel/dark, /area/aisat) "bYk" = ( @@ -61442,6 +60496,9 @@ dir = 8 }, /obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/aisat) "bYl" = ( @@ -61462,11 +60519,17 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/aisat) "bYm" = ( -/obj/structure/lattice, /obj/structure/transit_tube/diagonal, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/space, /area/space/nearstation) "bYn" = ( @@ -61633,7 +60696,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) "bYw" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light_switch{ pixel_x = 26; pixel_y = -26 @@ -61845,12 +60908,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bYM" = ( @@ -61913,12 +60971,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bYS" = ( @@ -61948,12 +61001,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bYU" = ( @@ -62005,12 +61053,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) "bYZ" = ( @@ -62106,6 +61149,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "bZj" = ( @@ -62147,10 +61191,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/crew_quarters/heads/captain/private) "bZn" = ( @@ -62194,12 +61235,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bZs" = ( @@ -62363,12 +61399,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bZH" = ( @@ -62440,9 +61471,6 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -62454,144 +61482,142 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/brig) "bZP" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/security/brig) "bZQ" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/door/airlock/security/glass{ - name = "Warden's Office"; - req_access_txt = "3" - }, -/obj/machinery/door/firedoor/border_only{ +/obj/structure/cable/white, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/security/warden) "bZR" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/structure/table/reinforced, +/obj/machinery/light_switch{ + pixel_x = -38; + pixel_y = -26 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +/obj/machinery/firealarm{ + dir = 1; + pixel_x = -26; + pixel_y = -26 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, /turf/open/floor/plasteel, /area/security/warden) "bZS" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/button/door{ - id = "brigwindows"; - name = "Cell Window Control"; - pixel_x = -32; - pixel_y = -26; - req_access_txt = "63" - }, -/obj/machinery/button/door{ - id = "brigfront"; - name = "Brig Access Control"; - pixel_x = -26; - pixel_y = -36; - req_access_txt = "63" - }, -/obj/machinery/button/door{ - id = "brigprison"; - name = "Prison Lockdown"; - pixel_x = -38; - pixel_y = -36; - req_access_txt = "63" - }, -/obj/effect/landmark/start/warden, -/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{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 8 }, /turf/open/floor/plasteel, /area/security/warden) "bZT" = ( -/obj/effect/landmark/event_spawn, +/obj/structure/closet/secure_closet/warden, +/obj/item/clothing/shoes/sneakers/white, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /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, /area/security/warden) "bZU" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/security{ - name = "Armoury"; - req_access_txt = "3"; - security_level = 6 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/cable/white, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ +/turf/open/floor/plating, +/area/ai_monitored/security/armory) +"bZV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) -"bZV" = ( -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) "bZW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/landmark/event_spawn, +/obj/structure/chair/office, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "bZX" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/structure/cable/white, +/obj/machinery/power/apc{ + areastring = "/area/ai_monitored/security/armory"; + dir = 2; + name = "Armoury APC"; + pixel_y = -24 + }, +/obj/machinery/camera{ + c_tag = "Armory - Interior"; + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/table/reinforced, +/obj/item/gun/energy/e_gun/dragnet, +/obj/item/gun/energy/e_gun/dragnet, +/obj/item/beacon/nettingportal, +/obj/item/gun/grenadelauncher/security, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "bZY" = ( -/obj/structure/closet/secure_closet/lethalshots, -/obj/machinery/light{ - dir = 4 +/obj/structure/reagent_dispensers/peppertank{ + pixel_x = 32 }, +/obj/structure/table/reinforced, +/obj/item/clothing/mask/gas/sechailer{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/mask/gas/sechailer, +/obj/item/clothing/mask/gas/sechailer{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/flashlight/seclite, +/obj/item/flashlight/seclite, +/obj/item/flashlight/seclite, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -62677,7 +61703,7 @@ /area/ai_monitored/turret_protected/aisat_interior) "cae" = ( /obj/structure/cable/white, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -62742,7 +61768,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "cai" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light, /obj/machinery/airalarm{ dir = 1; @@ -62779,7 +61805,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "cak" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light_switch{ pixel_x = -26 }, @@ -62862,7 +61888,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "cao" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/extinguisher_cabinet{ pixel_x = 26 }, @@ -62944,10 +61970,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engineering) "cay" = ( @@ -62970,10 +61993,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/engineering) "caA" = ( @@ -62982,7 +62002,7 @@ /turf/open/floor/plating, /area/security/checkpoint/engineering) "caB" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/yellow{ @@ -63042,6 +62062,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) "caJ" = ( @@ -63059,6 +62080,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) "caK" = ( @@ -63324,10 +62346,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/courtroom) "cbn" = ( @@ -63344,10 +62363,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/bot, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/courtroom) "cbp" = ( @@ -63370,10 +62386,7 @@ req_access_txt = "38" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/lawoffice) "cbs" = ( @@ -63445,12 +62458,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "cbx" = ( @@ -63494,183 +62502,158 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "cbA" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/brig) "cbB" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, /turf/open/floor/plasteel, /area/security/brig) "cbC" = ( -/obj/structure/cable/white, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "0-2" }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/security/warden) +/area/ai_monitored/security/armory) "cbD" = ( -/obj/structure/table/reinforced, -/obj/machinery/light_switch{ - pixel_x = -38; - pixel_y = -26 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_x = -26; - pixel_y = -26 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "0-4" }, -/turf/open/floor/plasteel, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/security/warden) "cbE" = ( +/obj/structure/table/reinforced, /obj/structure/cable/yellow{ - icon_state = "1-2" + icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/machinery/door/window/brigdoor/northright{ + name = "Warden's Desk"; + req_access_txt = "3" }, +/obj/machinery/door/window/southright{ + name = "Warden's Desk" + }, +/obj/item/folder/red, +/obj/item/pen, +/obj/item/poster/random_official{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/poster/random_official, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/warden) "cbF" = ( -/obj/structure/closet/secure_closet/warden, -/obj/item/clothing/shoes/sneakers/white, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - 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/structure/cable/yellow{ + icon_state = "0-8" }, -/turf/open/floor/plasteel, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/security/warden) "cbG" = ( -/obj/structure/cable/white, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, /obj/effect/spawner/structure/window/reinforced, -/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/plating, -/area/ai_monitored/security/armory) +/area/security/warden) "cbH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "cbI" = ( -/obj/machinery/button/door{ +/obj/machinery/door/poddoor{ id = "armouryaccess"; - name = "Armoury Access"; - pixel_x = -26; - pixel_y = -26; - req_access_txt = "3" + name = "Armoury Access" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "cbJ" = ( -/obj/structure/chair/office, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/northright{ + name = "Armoury Desk"; + req_access_txt = "3" }, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/item/folder/red, +/obj/item/pen, +/obj/machinery/door/window/southright{ + name = "Armoury Desk" }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "cbK" = ( -/obj/structure/cable/white, -/obj/machinery/power/apc{ - areastring = "/area/ai_monitored/security/armory"; - dir = 2; - name = "Armoury APC"; - pixel_y = -24 - }, -/obj/machinery/camera{ - c_tag = "Armory - Interior"; - dir = 1 +/obj/structure/cable/yellow{ + icon_state = "2-8" }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/table/reinforced, -/obj/item/gun/energy/e_gun/dragnet, -/obj/item/gun/energy/e_gun/dragnet, -/obj/item/beacon/nettingportal, -/obj/item/gun/grenadelauncher, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "cbL" = ( -/obj/structure/reagent_dispensers/peppertank{ - pixel_x = 32 - }, -/obj/structure/table/reinforced, -/obj/item/clothing/mask/gas/sechailer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/mask/gas/sechailer, -/obj/item/clothing/mask/gas/sechailer{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/flashlight/seclite, -/obj/item/flashlight/seclite, -/obj/item/flashlight/seclite, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/machinery/button/door{ + id = "armouryaccess"; + name = "Armoury Access"; + pixel_x = -26; + pixel_y = -26; + req_access_txt = "3" }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/ai_monitored/security/armory) "cbM" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor, /obj/machinery/door/airlock/highsecurity{ name = "MiniSat Upload"; req_access_txt = "16" @@ -63689,6 +62672,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "cbN" = ( @@ -63773,7 +62757,7 @@ /turf/closed/wall, /area/engine/engineering) "cbW" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -63820,7 +62804,7 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cca" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /obj/machinery/light_switch{ pixel_y = 26 @@ -64092,6 +63076,14 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"ccy" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/landmark/start/exploration, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "ccz" = ( /obj/machinery/status_display/evac, /turf/closed/wall/r_wall, @@ -64308,7 +63300,7 @@ /turf/open/floor/carpet/royalblue, /area/crew_quarters/heads/captain/private) "ccS" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -64374,7 +63366,7 @@ /turf/open/floor/plasteel/dark, /area/security/courtroom) "ccX" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -64415,7 +63407,7 @@ /turf/open/floor/plating, /area/security/courtroom) "cda" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -64566,10 +63558,6 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/security/brig) "cdn" = ( @@ -64580,21 +63568,13 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/security/brig) "cdo" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -64605,8 +63585,11 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, /turf/open/floor/plasteel, -/area/security/brig) +/area/hallway/primary/starboard) "cdp" = ( /obj/item/radio/intercom{ pixel_x = 26; @@ -64624,63 +63607,21 @@ /turf/open/floor/plasteel, /area/security/brig) "cdq" = ( -/obj/structure/table/reinforced, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/door/window/brigdoor/northright{ - name = "Warden's Desk"; - req_access_txt = "3" - }, -/obj/machinery/door/window/southright{ - name = "Warden's Desk" - }, -/obj/item/folder/red, -/obj/item/pen, -/obj/item/poster/random_official{ - pixel_x = 3; - pixel_y = 3 +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/obj/item/poster/random_official, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/turf/open/floor/plasteel, -/area/security/warden) -"cdr" = ( -/obj/machinery/door/poddoor{ - id = "armouryaccess"; - name = "Armoury Access" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/effect/turf_decal/tile/red{ + dir = 8 }, +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/flashlight/seclite, /turf/open/floor/plasteel, -/area/ai_monitored/security/armory) +/area/security/brig) "cds" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/northright{ - name = "Armoury Desk"; - req_access_txt = "3" - }, -/obj/item/folder/red, -/obj/item/pen, -/obj/machinery/door/window/southright{ - name = "Armoury Desk" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "cdt" = ( @@ -64705,7 +63646,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) "cdw" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light{ dir = 1 }, @@ -64830,7 +63771,7 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, -/area/engine/engineering) +/area/space/nearstation) "cdH" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -65079,12 +64020,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engineering) "cdV" = ( @@ -65281,7 +64217,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -65729,12 +64665,7 @@ dir = 4 }, /obj/effect/turf_decal/bot, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/lawoffice) "ceW" = ( @@ -65929,12 +64860,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "cfj" = ( @@ -65947,9 +64873,6 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, /obj/effect/turf_decal/tile/red{ dir = 8 }, @@ -65962,12 +64885,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, /turf/open/floor/plasteel, /area/security/brig) "cfl" = ( @@ -65980,45 +64897,30 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, /turf/open/floor/plasteel, /area/security/brig) "cfm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /obj/structure/cable/yellow{ - icon_state = "0-8" + icon_state = "1-8" }, +/turf/open/floor/plasteel, +/area/security/brig) +"cfn" = ( /obj/machinery/power/apc/highcap/ten_k{ areastring = "/area/security/brig"; dir = 1; name = "Brig APC"; pixel_y = 24 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/machinery/camera{ c_tag = "Security - Gear Room"; dir = 2 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"cfn" = ( -/obj/item/radio/intercom{ - pixel_y = 26 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "0-2" }, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -66026,42 +64928,22 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/security/brig) "cfo" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, /turf/open/floor/plasteel, /area/security/brig) "cfp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, /turf/open/floor/plasteel, /area/security/brig) "cfq" = ( -/obj/structure/closet/secure_closet/security/sec, -/obj/effect/turf_decal/bot, -/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/brig) "cfr" = ( @@ -66388,7 +65270,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/sign/plaques/kiddie/library{ pixel_x = -32 }, @@ -66407,7 +65289,7 @@ /turf/open/floor/plasteel/grimy, /area/library) "cfY" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light/small{ dir = 4 }, @@ -66578,7 +65460,7 @@ /turf/open/floor/carpet/royalblue, /area/crew_quarters/heads/captain/private) "cgt" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/airalarm{ dir = 1; pixel_y = -22 @@ -66598,7 +65480,7 @@ /turf/open/floor/wood, /area/crew_quarters/heads/captain/private) "cgv" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/firealarm{ dir = 1; pixel_y = -26 @@ -66975,17 +65857,18 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/brig) "cgX" = ( /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/brig) "cgY" = ( @@ -67162,7 +66045,6 @@ id = "aiuploadwindow"; name = "AI Upload Lockdown Door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai_upload) "chj" = ( @@ -67340,7 +66222,6 @@ id = "aiuploadwindow"; name = "AI Upload Lockdown Door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai_upload) "chs" = ( @@ -67556,7 +66437,7 @@ /turf/open/floor/plasteel/grimy, /area/library) "chP" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/library) "chQ" = ( @@ -67662,12 +66543,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/wood, /area/crew_quarters/heads/hop) -"cic" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/tcommsat/server) "cid" = ( /obj/machinery/telecomms/bus/preset_four, /obj/effect/turf_decal/tile/brown{ @@ -67762,10 +66637,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/crew_quarters/heads/captain/private) "cik" = ( @@ -68035,12 +66906,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "ciD" = ( @@ -68238,16 +67104,6 @@ }, /turf/open/floor/plasteel, /area/security/brig) -"ciQ" = ( -/obj/structure/cable/white, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "aiuploadwindow"; - name = "AI Upload Lockdown Door" - }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/ai_upload) "ciR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -68546,6 +67402,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) "cjw" = ( @@ -68680,6 +67537,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "cjH" = ( @@ -68836,12 +67694,7 @@ }, /obj/effect/turf_decal/bot, /obj/effect/landmark/event_spawn, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/courtroom) "cjY" = ( @@ -68943,7 +67796,7 @@ /turf/open/floor/wood, /area/lawoffice) "ckg" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/sign/poster/official/report_crimes{ pixel_y = -32 @@ -69000,10 +67853,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "ckl" = ( @@ -69368,6 +68218,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) "ckV" = ( @@ -69476,12 +68327,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/courtroom) "clh" = ( @@ -70183,14 +69029,13 @@ /obj/machinery/status_display/ai{ pixel_x = 32 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "cmD" = ( /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/tcommsat/server) "cmE" = ( @@ -70220,10 +69065,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/tcommsat/server) "cmG" = ( @@ -70332,12 +69174,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel, /area/teleporter) "cmP" = ( @@ -70680,7 +69516,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/range) "cnt" = ( @@ -70711,7 +69546,7 @@ /area/aisat) "cnu" = ( /obj/structure/cable/white, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/power/apc{ @@ -70754,7 +69589,7 @@ icon_state = "1-2" }, /obj/structure/table/reinforced, -/obj/item/twohanded/required/kirbyplants/photosynthetic{ +/obj/item/kirbyplants/photosynthetic{ pixel_y = 10 }, /obj/effect/turf_decal/tile/neutral{ @@ -70787,7 +69622,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) "cny" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light, /obj/machinery/airalarm{ dir = 1; @@ -70984,7 +69819,7 @@ /turf/open/floor/plasteel/grimy, /area/library) "cnU" = ( -/obj/structure/table/wood, +/obj/machinery/modular_computer/console/preset/curator, /turf/open/floor/plasteel/grimy, /area/library) "cnV" = ( @@ -71811,7 +70646,7 @@ /turf/closed/wall, /area/crew_quarters/heads/hop) "cpD" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "cpE" = ( @@ -71829,7 +70664,7 @@ dir = 1; pixel_y = -26 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "cpG" = ( @@ -71844,7 +70679,7 @@ /turf/open/floor/wood, /area/crew_quarters/heads/hop) "cpH" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/wood, /area/crew_quarters/heads/hop) @@ -72008,7 +70843,7 @@ /turf/open/floor/plasteel/dark, /area/security/courtroom) "cpW" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -72023,7 +70858,7 @@ /turf/open/floor/plasteel/dark, /area/security/courtroom) "cpX" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -72108,7 +70943,6 @@ "cqi" = ( /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/range) "cqj" = ( @@ -72426,10 +71260,7 @@ security_level = 6 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "cqY" = ( @@ -72440,7 +71271,6 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/secondary/command) "cra" = ( @@ -72464,10 +71294,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/command) "crc" = ( @@ -72483,10 +71310,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/teleporter) "crd" = ( @@ -72506,6 +71330,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/teleporter) "cre" = ( @@ -72520,6 +71345,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/teleporter) "crf" = ( @@ -72866,7 +71692,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/engineering) "crN" = ( @@ -72895,7 +71720,7 @@ /turf/open/floor/plating, /area/engine/engineering) "crQ" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/camera{ c_tag = "Engineering - Central"; dir = 4; @@ -73183,12 +72008,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/command) "csp" = ( @@ -73879,7 +72699,7 @@ /turf/open/floor/plasteel, /area/maintenance/port) "ctH" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -73903,7 +72723,7 @@ /area/library) "ctK" = ( /obj/machinery/light, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/camera{ c_tag = "Library - Aft"; dir = 1; @@ -73924,7 +72744,7 @@ /area/library) "ctM" = ( /obj/machinery/light, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light_switch{ pixel_y = -26 }, @@ -73932,7 +72752,7 @@ /turf/open/floor/plasteel/grimy, /area/library) "ctN" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/grimy, /area/library) "ctO" = ( @@ -74003,12 +72823,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/command) "ctS" = ( @@ -74183,7 +72998,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/blue{ @@ -74525,7 +73340,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -74543,7 +73358,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -74751,6 +73566,7 @@ name = "Library Game Room" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/grimy, /area/library) "cvj" = ( @@ -74758,6 +73574,7 @@ name = "Library Game Room" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/grimy, /area/library) "cvk" = ( @@ -74811,10 +73628,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "cvq" = ( @@ -74830,16 +73644,12 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "cvr" = ( /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/secondary/command) "cvs" = ( @@ -74950,10 +73760,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/gateway) "cvC" = ( @@ -75005,12 +73812,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "cvI" = ( @@ -75107,12 +73909,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "cvP" = ( @@ -75146,12 +73943,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/locker) "cvR" = ( @@ -75374,18 +74166,6 @@ heat_capacity = 1e+006 }, /area/crew_quarters/fitness/recreation) -"cwk" = ( -/obj/structure/closet/masks, -/obj/structure/sign/nanotrasen{ - pixel_x = 32; - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "cwl" = ( /obj/structure/table/reinforced, /obj/item/clothing/gloves/color/yellow, @@ -75435,14 +74215,14 @@ /turf/open/floor/plating, /area/maintenance/port) "cwq" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/library) "cwr" = ( /obj/structure/easel, -/obj/item/canvas/twentythreeXnineteen, -/obj/item/canvas/twentythreeXtwentythree, -/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythree_nineteen, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -75457,9 +74237,9 @@ /area/library) "cws" = ( /obj/structure/easel, -/obj/item/canvas/nineteenXnineteen, -/obj/item/canvas/twentythreeXtwentythree, -/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/nineteen_nineteen, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, /obj/machinery/light_switch{ pixel_y = 26 }, @@ -75516,7 +74296,7 @@ /turf/open/floor/plasteel/dark, /area/library) "cwy" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -75569,7 +74349,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -75586,7 +74366,7 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "cwE" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -75618,7 +74398,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/stripes/line{ dir = 5 }, @@ -75656,7 +74436,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/secondary/command) "cwK" = ( @@ -75717,7 +74496,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/blue, @@ -75739,7 +74518,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/secondary/command) "cwS" = ( @@ -75776,7 +74554,7 @@ /turf/open/floor/plasteel, /area/gateway) "cwV" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -75834,12 +74612,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "cxa" = ( @@ -75904,12 +74677,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "cxg" = ( @@ -75929,7 +74697,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "cxh" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral{ @@ -76127,17 +74895,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cxz" = ( -/obj/structure/closet/athletic_mixed, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "cxA" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -76207,7 +74964,7 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cxI" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/electricshock{ pixel_y = 32 @@ -76336,7 +75093,7 @@ /obj/structure/table/wood, /obj/item/clipboard, /obj/item/folder, -/obj/machinery/status_display/ai{ +/obj/structure/sign/painting/library{ pixel_x = -32 }, /turf/open/floor/plasteel/dark, @@ -76411,7 +75168,7 @@ /turf/open/floor/plasteel/dark, /area/library) "cyc" = ( -/obj/structure/destructible/cult/tome, +/obj/structure/destructible/cult/tome/library, /obj/item/book/codex_gigas, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -76641,7 +75398,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/gateway) "cyy" = ( @@ -76788,12 +75544,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "cyJ" = ( @@ -76826,12 +75577,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "cyM" = ( @@ -76879,12 +75625,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/locker) "cyP" = ( @@ -76992,12 +75733,19 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/locker) +"czd" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/space, +/area/space/nearstation) "czg" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -77096,14 +75844,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"czn" = ( -/obj/structure/closet/boxinggloves, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "czo" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -77221,8 +75961,8 @@ pixel_x = 26 }, /obj/effect/turf_decal/bot, -/obj/item/twohanded/rcl/pre_loaded, -/obj/item/twohanded/rcl/pre_loaded, +/obj/item/rcl/pre_loaded, +/obj/item/rcl/pre_loaded, /turf/open/floor/plasteel, /area/engine/storage) "czz" = ( @@ -77389,9 +76129,6 @@ /obj/structure/table/wood, /obj/item/taperecorder, /obj/item/camera, -/obj/machinery/status_display/ai{ - pixel_y = -32 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -77402,6 +76139,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/sign/painting/library_private{ + pixel_y = -32 + }, /turf/open/floor/plasteel/dark, /area/library) "czO" = ( @@ -77538,10 +76278,7 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/bridge/showroom/corporate) "cAb" = ( @@ -77552,10 +76289,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/bridge/showroom/corporate) "cAc" = ( @@ -77697,10 +76431,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/toilet/restrooms) "cAo" = ( @@ -77843,7 +76574,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{ dir = 2 @@ -78122,7 +76852,7 @@ /turf/open/floor/plating, /area/maintenance/port) "cBa" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/extinguisher_cabinet{ pixel_x = -26 }, @@ -78169,7 +76899,7 @@ /turf/open/floor/plasteel/dark, /area/library) "cBh" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/newscaster{ pixel_x = 32 }, @@ -78545,7 +77275,7 @@ dir = 4; pixel_x = -24 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -78623,7 +77353,7 @@ /turf/open/floor/plating, /area/crew_quarters/toilet/restrooms) "cBR" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -79012,6 +77742,13 @@ }, /turf/open/floor/plating, /area/engine/engineering) +"cCs" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "cCt" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -79063,12 +77800,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/storage) "cCx" = ( @@ -79152,11 +77884,6 @@ /area/maintenance/port) "cCH" = ( /obj/structure/table/wood, -/obj/item/newspaper{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/newspaper, /obj/machinery/status_display/evac{ pixel_x = -32 }, @@ -79617,12 +78344,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/toilet/restrooms) "cDr" = ( @@ -79878,7 +78600,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "cDQ" = ( @@ -79886,7 +78607,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "cDR" = ( @@ -79897,11 +78617,10 @@ /turf/closed/wall, /area/crew_quarters/fitness/recreation) "cDS" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 + dir = 4 }, -/obj/machinery/door/firedoor/window, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "cDT" = ( @@ -80126,12 +78845,13 @@ /area/maintenance/port) "cEp" = ( /obj/structure/table/wood, -/obj/item/flashlight/lamp, +/obj/structure/sign/painting/library{ + pixel_y = -32 + }, /turf/open/floor/plasteel/dark, /area/library) "cEq" = ( /obj/structure/table/wood, -/obj/item/storage/fancy/donut_box, /obj/machinery/airalarm{ dir = 1; pixel_y = -22 @@ -80146,10 +78866,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/flashlight/lamp, /turf/open/floor/plasteel/dark, /area/library) "cEr" = ( -/obj/item/twohanded/required/kirbyplants/random, /obj/item/radio/intercom{ pixel_y = -26 }, @@ -80170,7 +78890,6 @@ /area/library) "cEs" = ( /obj/machinery/light, -/obj/structure/dresser, /obj/machinery/status_display/evac{ pixel_y = -32 }, @@ -80271,12 +78990,7 @@ id = "commissaryshutters"; name = "Vacant Commissary Shutters" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/vacant_room/commissary) "cEB" = ( @@ -80521,6 +79235,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/gateway) "cEY" = ( @@ -80724,12 +79439,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/toilet/restrooms) "cFo" = ( @@ -80841,7 +79551,7 @@ /turf/open/floor/wood, /area/crew_quarters/dorms) "cFy" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/crew_quarters/dorms) "cFz" = ( @@ -80889,7 +79599,6 @@ "cFE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "cFF" = ( @@ -80949,7 +79658,7 @@ icon_state = "2-4" }, /turf/open/floor/plating/airless, -/area/engine/engineering) +/area/space/nearstation) "cFM" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -81090,7 +79799,7 @@ /area/engine/engineering) "cFT" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/cable/yellow{ icon_state = "1-8" }, @@ -81221,7 +79930,7 @@ /obj/item/radio/intercom{ pixel_y = -26 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -81242,7 +79951,7 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "cGl" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) @@ -81284,7 +79993,7 @@ name = "Replica CentCom officer's jumpsuit" }, /obj/item/clothing/head/centhat{ - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0); + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "stamina" = 0); desc = "A replica hat of a Central Commander's attire. It has a small tag on it saying, 'It's good to be emperor.'"; name = "Replica CentCom hat" }, @@ -81303,7 +80012,7 @@ dir = 1; pixel_y = -26 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light, /turf/open/floor/plasteel/grimy, /area/bridge/showroom/corporate) @@ -81343,7 +80052,7 @@ pixel_x = 7; pixel_y = -26 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light, /turf/open/floor/plasteel/grimy, /area/bridge/showroom/corporate) @@ -81360,7 +80069,7 @@ /obj/item/folder/red, /obj/item/toy/gun, /obj/item/clothing/head/beret/sec{ - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0); + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "stamina" = 0); desc = "A replica beret resembling that of a special operations officer under Nanotrasen."; name = "replica officer's beret" }, @@ -81405,7 +80114,7 @@ dir = 1; pixel_y = -22 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -81500,7 +80209,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/locker) "cGM" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -81616,6 +80325,7 @@ specialfunctions = 4 }, /obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/wood, /area/crew_quarters/dorms) "cGU" = ( @@ -81636,6 +80346,7 @@ pixel_x = 5; pixel_y = 5 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/wood{ icon_state = "wood-broken4" }, @@ -81672,7 +80383,7 @@ /turf/open/floor/carpet/purple, /area/crew_quarters/dorms) "cGY" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/carpet/purple, /area/crew_quarters/dorms) @@ -81683,14 +80394,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cHa" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "cHb" = ( /obj/structure/grille, /obj/effect/turf_decal/stripes/line{ @@ -81765,7 +80468,7 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cHi" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -81841,7 +80544,7 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cHp" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -81852,7 +80555,7 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cHq" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/electricshock{ pixel_y = -32 @@ -82011,6 +80714,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "cHK" = ( @@ -82024,6 +80728,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "cHL" = ( @@ -82044,6 +80749,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "cHM" = ( @@ -82072,10 +80778,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/bridge/showroom/corporate) "cHP" = ( @@ -82091,10 +80794,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/gateway) "cHQ" = ( @@ -82115,6 +80815,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/gateway) "cHR" = ( @@ -82129,6 +80830,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/gateway) "cHS" = ( @@ -82142,6 +80844,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/gateway) "cHT" = ( @@ -82188,14 +80891,11 @@ /area/crew_quarters/toilet/restrooms) "cIa" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/vomit/old, -/obj/structure/toilet{ - dir = 8 - }, /obj/machinery/newscaster{ pixel_x = -32 }, /obj/machinery/light/small, +/obj/machinery/recharge_station, /turf/open/floor/plating, /area/crew_quarters/toilet/restrooms) "cIb" = ( @@ -82237,10 +80937,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/locker) "cIe" = ( @@ -82255,10 +80952,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/locker) "cIf" = ( @@ -82267,10 +80961,7 @@ name = "Cabin 1" }, /obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood{ icon_state = "wood-broken7" }, @@ -82284,10 +80975,6 @@ id_tag = "Dorm2"; name = "Cabin 2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/wood, /area/crew_quarters/dorms) "cIi" = ( @@ -82299,10 +80986,6 @@ id_tag = "Dorm3"; name = "Cabin 3" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/carpet/purple, /area/crew_quarters/dorms) "cIk" = ( @@ -82316,36 +80999,11 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cIl" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) -"cIm" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) -"cIn" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/machinery/door/window{ - dir = 4; - name = "Fitness Ring" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) "cIo" = ( -/obj/machinery/status_display/evac, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/status_display/ai, /turf/closed/wall, /area/crew_quarters/fitness/recreation) "cIp" = ( @@ -82765,12 +81423,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "cJj" = ( @@ -82787,12 +81440,10 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "cJl" = ( @@ -82911,12 +81562,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "cJt" = ( @@ -82931,72 +81577,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cJu" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/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/crew_quarters/fitness/recreation) -"cJv" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) -"cJw" = ( -/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/crew_quarters/fitness/recreation) -"cJx" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) -"cJy" = ( -/obj/machinery/atmospherics/pipe/manifold4w/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/crew_quarters/fitness/recreation) "cJz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -83023,12 +81603,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "cJB" = ( @@ -83058,20 +81633,26 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "cJD" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation) +"cJE" = ( +/obj/machinery/status_display/evac, +/turf/closed/wall, +/area/crew_quarters/fitness/recreation) +"cJF" = ( /obj/machinery/door/airlock/public/glass{ name = "Holodeck Access" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -83080,65 +81661,36 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cJE" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"cJG" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Access" }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"cJF" = ( /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 + dir = 5 }, -/area/crew_quarters/fitness/recreation) -"cJG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/camera{ - c_tag = "Holodeck Control"; - dir = 2; - name = "holodeck camera" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plasteel{ - heat_capacity = 1e+006 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "cJH" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "cJI" = ( @@ -83195,7 +81747,7 @@ "cJM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/flashlight, /obj/effect/spawner/lootdrop/maintenance, @@ -83259,12 +81811,14 @@ }, /area/maintenance/port) "cJR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "cJS" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/yellow{ @@ -84039,7 +82593,7 @@ /turf/open/floor/plating, /area/crew_quarters/dorms) "cKY" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -84172,7 +82726,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/dorms) "cLi" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -84209,20 +82763,18 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "cLk" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/structure/closet/athletic_mixed, +/obj/machinery/light/small{ + dir = 4 }, -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"cLl" = ( -/obj/structure/window/reinforced{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/obj/item/pool/pool_noodle, +/obj/item/pool/pool_noodle, +/obj/item/pool/rubber_ring, +/turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "cLm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -84237,40 +82789,42 @@ /turf/closed/wall, /area/crew_quarters/fitness/recreation) "cLo" = ( -/obj/machinery/computer/holodeck{ +/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 + dir = 4 }, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, /area/crew_quarters/fitness/recreation) "cLp" = ( -/obj/structure/chair/office/light{ +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/obj/effect/landmark/start/assistant, +/obj/machinery/camera{ + c_tag = "Holodeck Control"; + dir = 2; + name = "holodeck camera" + }, /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{ + heat_capacity = 1e+006 }, -/turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "cLq" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -84351,20 +82905,14 @@ /turf/open/floor/plasteel, /area/maintenance/port) "cLA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, /turf/open/floor/plasteel, -/area/maintenance/port) +/area/hallway/secondary/entry) "cLB" = ( /obj/structure/girder, /obj/effect/decal/cleanable/dirt, @@ -84375,6 +82923,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/port) "cLC" = ( @@ -84819,7 +83368,7 @@ }, /area/crew_quarters/dorms) "cMs" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -84859,12 +83408,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "cMv" = ( @@ -85011,12 +83555,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "cMF" = ( @@ -85036,39 +83575,25 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cMG" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, -/obj/structure/disposalpipe/junction/flip{ - dir = 1 +"cMJ" = ( +/obj/machinery/computer/holodeck{ + 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/crew_quarters/fitness/recreation) -"cMH" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/turf/open/floor/plasteel{ + heat_capacity = 1e+006 }, -/turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) -"cMI" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +"cMK" = ( +/obj/structure/chair/office/light{ dir = 8 }, +/obj/effect/landmark/start/assistant, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -85079,32 +83604,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) -"cMJ" = ( -/obj/structure/table/reinforced, -/obj/item/folder/blue, -/obj/item/storage/firstaid/regular, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel{ - heat_capacity = 1e+006 - }, -/area/crew_quarters/fitness/recreation) -"cMK" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "cML" = ( /obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/item/folder, -/obj/item/paper/fluff/holodeck/disclaimer, +/obj/item/paper_bin, +/obj/item/pen, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -85308,7 +83813,7 @@ /area/science/xenobiology) "cNj" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/flashlight, /obj/effect/spawner/lootdrop/maintenance, @@ -85366,10 +83871,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/science/research) "cNs" = ( @@ -85383,10 +83884,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/science/research) "cNu" = ( @@ -85414,10 +83911,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "cNw" = ( @@ -85430,10 +83924,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "cNx" = ( @@ -85448,10 +83939,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "cNy" = ( @@ -85478,10 +83966,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "cNB" = ( @@ -85496,10 +83981,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "cND" = ( @@ -85646,10 +84128,6 @@ id_tag = "Dorm4"; name = "Cabin 4" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/wood, /area/crew_quarters/dorms) "cNU" = ( @@ -85657,10 +84135,6 @@ id_tag = "Dorm5"; name = "Cabin 5" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/carpet/blue, /area/crew_quarters/dorms) "cNV" = ( @@ -85668,10 +84142,6 @@ id_tag = "Dorm6"; name = "Cabin 6" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel/grimy, /area/crew_quarters/dorms) "cNW" = ( @@ -85681,25 +84151,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cNX" = ( -/obj/structure/window/reinforced, -/obj/machinery/door/window{ - dir = 8; - name = "Fitness Ring" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) -"cNY" = ( -/obj/structure/window/reinforced, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) -"cNZ" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) "cOa" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -85723,12 +84174,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "cOc" = ( @@ -85757,15 +84203,40 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"cOe" = ( +/obj/structure/table/reinforced, +/obj/item/folder/blue, +/obj/item/storage/firstaid/regular, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/turf/open/floor/plasteel{ + heat_capacity = 1e+006 + }, +/area/crew_quarters/fitness/recreation) +"cOf" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cOe" = ( +"cOg" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/item/folder, +/obj/item/paper/fluff/holodeck/disclaimer, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"cOh" = ( /obj/machinery/door/airlock/public/glass{ name = "Holodeck Access" }, @@ -85781,15 +84252,10 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cOf" = ( +"cOi" = ( /obj/machinery/light{ dir = 1 }, @@ -85802,39 +84268,8 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cOg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"cOh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"cOi" = ( -/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/crew_quarters/fitness/recreation) "cOj" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/port) "cOl" = ( @@ -86238,7 +84673,7 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cPr" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light{ dir = 1 }, @@ -86356,7 +84791,7 @@ name = "medbay camera"; network = list("ss13","medbay") }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -86587,7 +85022,7 @@ /turf/open/floor/carpet/blue, /area/crew_quarters/dorms) "cPT" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/item/radio/intercom{ pixel_x = 26; pixel_y = 26 @@ -86635,27 +85070,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cPY" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"cPZ" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "cQa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral, @@ -86664,7 +85078,6 @@ "cQb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "cQo" = ( @@ -86701,10 +85114,7 @@ dir = 1 }, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/xenobiology) "cQv" = ( @@ -86803,7 +85213,7 @@ /turf/open/floor/plasteel/white, /area/science/research) "cQC" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -87018,7 +85428,7 @@ /turf/open/floor/plasteel, /area/science/research) "cQR" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/purple{ @@ -87027,7 +85437,7 @@ /turf/open/floor/plasteel/white, /area/science/research) "cQS" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/blue{ @@ -87104,7 +85514,7 @@ /turf/open/floor/plasteel, /area/medical/medbay/central) "cQY" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/blue{ @@ -87113,7 +85523,7 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cQZ" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -87314,7 +85724,7 @@ /turf/open/floor/plasteel/grimy, /area/crew_quarters/dorms) "cRv" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/sign/nanotrasen{ pixel_x = 32; pixel_y = -32 @@ -87362,14 +85772,20 @@ /turf/open/floor/plating, /area/maintenance/port) "cRK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "cRL" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 + dir = 1 }, /turf/open/floor/plating, /area/maintenance/port) @@ -87651,6 +86067,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/xenobiology) "cSh" = ( @@ -87738,7 +86155,7 @@ /turf/open/floor/plasteel, /area/security/checkpoint/science/research) "cSp" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/purple{ @@ -87822,12 +86239,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel, /area/science/research) "cSz" = ( @@ -87873,12 +86284,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "cSD" = ( @@ -87971,12 +86377,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "cSK" = ( @@ -88408,7 +86809,7 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "cTF" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, @@ -88629,12 +87030,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/science/research) "cUa" = ( @@ -88811,12 +87207,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel, /area/science/research) "cUo" = ( @@ -88869,12 +87259,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "cUs" = ( @@ -89025,12 +87410,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "cUD" = ( @@ -89474,7 +87854,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "cVi" = ( @@ -89482,22 +87861,20 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "cVj" = ( -/obj/machinery/status_display/evac, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/status_display/ai, /turf/closed/wall, /area/crew_quarters/fitness/recreation) "cVk" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 + dir = 4 }, -/obj/machinery/door/firedoor/window, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "cVm" = ( @@ -89598,12 +87975,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel, /area/science/xenobiology) "cVI" = ( @@ -89653,7 +88024,7 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "cVM" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light{ dir = 1 }, @@ -89847,7 +88218,7 @@ /turf/open/floor/plating, /area/security/checkpoint/science/research) "cWb" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/purple{ @@ -89900,7 +88271,7 @@ /turf/open/floor/plasteel, /area/science/research) "cWf" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/purple, @@ -89925,7 +88296,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/blue{ @@ -89966,7 +88337,7 @@ /turf/open/floor/plasteel, /area/medical/medbay/central) "cWl" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/blue, @@ -90065,12 +88436,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/medical) "cWt" = ( @@ -90107,17 +88473,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/storage) -"cWw" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/mob/living/simple_animal/bot/cleanbot{ - name = "C.L.E.A.N."; - trash = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/storage) "cWx" = ( /obj/machinery/light_switch{ pixel_x = 26; @@ -90174,10 +88529,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "cWA" = ( @@ -90428,12 +88780,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel, /area/science/xenobiology) "cXc" = ( @@ -90651,7 +88997,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/camera{ c_tag = "Security Post - Science"; dir = 8; @@ -90698,7 +89044,7 @@ /turf/open/floor/plasteel/white, /area/science/research) "cXu" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/purple{ @@ -90744,7 +89090,7 @@ /turf/open/floor/plasteel/white, /area/science/research) "cXy" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/purple, @@ -90817,7 +89163,7 @@ /area/medical/medbay/central) "cXJ" = ( /obj/structure/disposalpipe/segment, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/blue{ @@ -90860,7 +89206,7 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cXN" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/blue, @@ -90983,10 +89329,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/storage) "cXZ" = ( @@ -91000,10 +89343,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/storage) "cYa" = ( @@ -91389,12 +89729,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel, /area/science/xenobiology) "cYQ" = ( @@ -91434,7 +89768,7 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "cYT" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -91639,10 +89973,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "cZi" = ( @@ -91663,10 +89994,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "cZk" = ( @@ -91710,10 +90038,7 @@ name = "Research and Development Shutter" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/lab) "cZq" = ( @@ -91770,10 +90095,7 @@ name = "Chemistry Desk"; req_access_txt = "5; 33" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "cZw" = ( @@ -91786,10 +90108,7 @@ /obj/item/folder/white, /obj/item/reagent_containers/hypospray/medipen, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "cZy" = ( @@ -91800,20 +90119,14 @@ /obj/item/reagent_containers/glass/bottle/epinephrine, /obj/item/reagent_containers/syringe, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "cZz" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/food/drinks/britcup, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "cZA" = ( @@ -91892,7 +90205,7 @@ /turf/open/floor/plasteel, /area/security/checkpoint/medical) "cZE" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/airalarm{ dir = 8; pixel_x = 24 @@ -91935,26 +90248,6 @@ }, /turf/open/floor/plasteel, /area/medical/medbay/central) -"cZH" = ( -/obj/structure/table/glass, -/obj/machinery/camera{ - c_tag = "Medbay - Sleepers"; - dir = 2; - name = "medbay camera"; - network = list("ss13","medbay") - }, -/obj/item/book/manual/wiki/medicine, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/ointment, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/computer/cryopod{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "cZI" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -92684,9 +90977,9 @@ /turf/open/floor/plasteel/white, /area/science/lab) "daW" = ( +/obj/item/stack/sheet/glass/fifty, /obj/structure/table, /obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, /obj/item/wrench, /obj/item/clothing/glasses/welding, /obj/machinery/newscaster{ @@ -92927,12 +91220,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "dbs" = ( @@ -93161,9 +91449,9 @@ /area/crew_quarters/fitness/recreation) "dbL" = ( /obj/structure/easel, -/obj/item/canvas/twentythreeXtwentythree, -/obj/item/canvas/twentythreeXtwentythree, -/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, /obj/machinery/light/small{ dir = 4 }, @@ -93657,12 +91945,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/science/research) "dcz" = ( @@ -93709,13 +91992,6 @@ /turf/open/floor/plasteel, /area/science/research) "dcE" = ( -/obj/structure/table/reinforced, -/obj/item/stock_parts/matter_bin{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/micro_laser, /obj/machinery/airalarm{ dir = 4; pixel_x = -23 @@ -93723,6 +91999,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/modular_fabricator/component_printer, /turf/open/floor/plasteel, /area/science/lab) "dcF" = ( @@ -93952,12 +92229,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "dcZ" = ( @@ -94173,7 +92445,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ddy" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) @@ -94284,7 +92556,7 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "ddT" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/xenobiology) @@ -94570,7 +92842,7 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dev" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light/small, /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, @@ -94826,10 +93098,7 @@ icon_state = "1-4" }, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/xenobiology) "dff" = ( @@ -94851,10 +93120,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "dfh" = ( @@ -94865,10 +93131,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "dfi" = ( @@ -94895,7 +93158,7 @@ /turf/open/floor/plasteel, /area/science/research) "dfl" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/item/storage/pod{ pixel_x = 32 }, @@ -94921,10 +93184,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "dfo" = ( @@ -94943,10 +93203,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "dfp" = ( @@ -94955,11 +93212,6 @@ /area/science/research) "dfq" = ( /obj/structure/table/reinforced, -/obj/item/folder/white, -/obj/item/stock_parts/cell/high, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, /obj/structure/cable/yellow{ icon_state = "0-4" }, @@ -94972,6 +93224,12 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/matter_bin{ + pixel_x = 3; + pixel_y = 3 + }, /turf/open/floor/plasteel, /area/science/lab) "dfr" = ( @@ -95120,10 +93378,7 @@ pixel_y = 2 }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "dfC" = ( @@ -95165,10 +93420,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/medical) "dfF" = ( @@ -95179,10 +93431,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "dfG" = ( @@ -95193,10 +93442,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "dfH" = ( @@ -95220,10 +93466,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "dfL" = ( @@ -95282,7 +93525,6 @@ /area/maintenance/starboard/aft) "dfX" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/starboard/aft) "dfY" = ( @@ -95290,7 +93532,7 @@ /turf/open/floor/plating, /area/maintenance/port) "dfZ" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -95411,7 +93653,7 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "dgu" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/purple{ dir = 1 }, @@ -95514,12 +93756,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "dgE" = ( @@ -95601,12 +93838,7 @@ }, /obj/machinery/door/window/westleft, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/lab) "dgK" = ( @@ -95685,7 +93917,7 @@ /turf/open/floor/plasteel, /area/science/lab) "dgP" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/lab) @@ -95832,12 +94064,7 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/chemistry) "dhc" = ( @@ -95912,12 +94139,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "dhj" = ( @@ -95949,6 +94171,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dhm" = ( @@ -96184,12 +94409,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "dic" = ( @@ -96301,12 +94521,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/lab) "dij" = ( @@ -96354,12 +94569,7 @@ name = "Secondary Research and Development Shutter" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/lab) "din" = ( @@ -96402,12 +94612,7 @@ /obj/item/folder/white, /obj/item/pen, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/chemistry) "diq" = ( @@ -96611,12 +94816,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "diF" = ( @@ -96871,9 +95071,6 @@ /area/maintenance/port) "djn" = ( /obj/structure/girder, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /obj/structure/barricade/wooden, /turf/open/floor/plating, /area/maintenance/port) @@ -97173,12 +95370,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "djT" = ( @@ -97214,7 +95406,7 @@ /turf/open/floor/plasteel/white, /area/science/research) "djW" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -97333,7 +95525,7 @@ /turf/open/floor/plasteel, /area/science/lab) "dke" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/purple{ @@ -97349,7 +95541,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "dkf" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/yellow{ @@ -97452,12 +95644,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/chemistry) "dkn" = ( @@ -97550,12 +95737,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "dkv" = ( @@ -97739,9 +95921,6 @@ name = "Maintenance Hatch"; req_one_access_txt = "12;47" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /obj/structure/barricade/wooden, /turf/open/floor/plating, /area/maintenance/port) @@ -97924,10 +96103,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "dly" = ( @@ -98041,10 +96217,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/mechbay) "dlQ" = ( @@ -98056,10 +96229,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "dlR" = ( @@ -98069,10 +96239,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "dlS" = ( @@ -98088,10 +96255,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "dlT" = ( @@ -98109,10 +96273,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/maintenance/department/medical/central) "dlV" = ( @@ -98137,10 +96298,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "dlZ" = ( @@ -98153,10 +96311,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "dma" = ( @@ -98177,10 +96332,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/surgery) "dmd" = ( @@ -98198,10 +96350,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/surgery) "dmf" = ( @@ -98277,7 +96426,7 @@ /turf/open/floor/plasteel/dark, /area/science/explab) "dmE" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/machinery/firealarm{ dir = 8; @@ -98348,7 +96497,7 @@ /turf/open/floor/plasteel/dark, /area/science/nanite) "dmJ" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -98638,7 +96787,7 @@ /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) "dno" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/purple{ dir = 1 }, @@ -98717,7 +96866,7 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dnv" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -98794,7 +96943,7 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dnC" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -99022,12 +97171,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/maintenance/department/science) "dot" = ( @@ -99148,12 +97292,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/nanite) "doy" = ( @@ -99259,12 +97398,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/nanite) "doD" = ( @@ -99510,12 +97644,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/maintenance/department/medical/central) "dph" = ( @@ -99682,12 +97811,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/genetics/cloning) "dpt" = ( @@ -99812,12 +97936,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/surgery) "dpD" = ( @@ -100298,12 +98417,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/heads/hor) "dqI" = ( @@ -100603,12 +98717,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/genetics/cloning) "drh" = ( @@ -100674,10 +98783,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/surgery) "dro" = ( @@ -100750,10 +98856,6 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/engine, /area/science/explab) "drK" = ( @@ -100874,10 +98976,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/mixing) "drT" = ( @@ -100894,7 +98993,7 @@ /obj/structure/cable/white, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/bot, -/obj/item/twohanded/required/kirbyplants/dead, +/obj/item/kirbyplants/dead, /turf/open/floor/plasteel, /area/crew_quarters/heads/hor) "drY" = ( @@ -100988,12 +99087,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/mechbay) "dsg" = ( @@ -101168,7 +99262,7 @@ /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) "dsy" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, @@ -101344,20 +99438,6 @@ }, /turf/closed/wall, /area/medical/surgery) -"dsN" = ( -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/suit/apron/surgical, -/obj/item/clothing/mask/surgical, -/obj/item/surgical_drapes, -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) "dsO" = ( /obj/item/retractor, /obj/item/hemostat, @@ -101395,6 +99475,16 @@ }, /turf/open/floor/plasteel/white, /area/medical/surgery) +"dsQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "dsR" = ( /obj/machinery/computer/med_data/laptop, /obj/structure/table/reinforced, @@ -101628,10 +99718,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/maintenance/department/medical/central) "dtB" = ( @@ -101666,10 +99753,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/genetics) "dtF" = ( @@ -101791,19 +99875,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/surgery) -"dtQ" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) "dtR" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -101891,6 +99962,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/maintenance/starboard/aft) "due" = ( @@ -102220,7 +100292,7 @@ /turf/closed/wall, /area/medical/genetics) "dvd" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/firealarm{ dir = 4; pixel_x = -24 @@ -102315,7 +100387,7 @@ /turf/open/floor/plasteel, /area/medical/genetics) "dvm" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/firealarm{ pixel_x = -26; pixel_y = 26 @@ -102515,12 +100587,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/surgery) "dvA" = ( @@ -102591,12 +100658,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/surgery) "dvE" = ( @@ -102992,12 +101054,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/genetics) "dwH" = ( @@ -103290,6 +101347,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/heads/cmo) "dwZ" = ( @@ -103394,6 +101452,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/heads/cmo) "dxf" = ( @@ -103604,10 +101663,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/heads/hor) "dxZ" = ( @@ -103629,10 +101685,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "dyb" = ( @@ -103648,10 +101701,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "dyc" = ( @@ -103683,10 +101733,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/lab) "dyg" = ( @@ -103701,10 +101748,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "dyi" = ( @@ -103816,12 +101860,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/genetics) "dyn" = ( @@ -104018,7 +102057,7 @@ /turf/open/floor/plating, /area/crew_quarters/heads/cmo) "dyy" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -104064,7 +102103,7 @@ /turf/open/floor/plasteel/white, /area/crew_quarters/heads/cmo) "dyC" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -104265,7 +102304,6 @@ /area/maintenance/solars/starboard/aft) "dyV" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) "dyW" = ( @@ -104281,12 +102319,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; req_access_txt = "12" @@ -104501,7 +102533,7 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "dzH" = ( -/obj/machinery/mecha_part_fabricator, +/obj/machinery/modular_fabricator/exosuit_fab, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/science/robotics/lab) @@ -104578,12 +102610,7 @@ /obj/item/folder/white, /obj/item/pen, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/genetics) "dzO" = ( @@ -104634,7 +102661,7 @@ /turf/open/floor/plasteel, /area/medical/genetics) "dzR" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/medical/genetics) @@ -104796,7 +102823,7 @@ /turf/open/floor/plasteel/white, /area/crew_quarters/heads/cmo) "dAf" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/cable/yellow{ icon_state = "0-8" }, @@ -105108,12 +103135,7 @@ req_access_txt = "29" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/lab) "dAQ" = ( @@ -105225,7 +103247,7 @@ /turf/open/floor/plasteel, /area/medical/genetics) "dAZ" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/airalarm{ dir = 1; pixel_y = -22 @@ -105287,7 +103309,7 @@ /obj/structure/sign/poster/official/do_not_question{ pixel_y = -32 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/purple{ dir = 8 }, @@ -105830,10 +103852,8 @@ /obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/structure/frame/computer{ - desc = "Looks like the board never made it to this one."; - dir = 1; - name = "shuttle console frame" +/obj/machinery/computer/shuttle_flight/science{ + dir = 1 }, /turf/open/floor/plasteel/white, /area/science/shuttledock) @@ -106060,10 +104080,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/morgue) "dCA" = ( @@ -106173,12 +104190,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "dCN" = ( @@ -106250,7 +104262,7 @@ "dCR" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/flashlight, /obj/effect/spawner/lootdrop/maintenance, @@ -106515,10 +104527,7 @@ name = "Toxins Secure Storage"; req_access_txt = "8" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/mixing) "dDv" = ( @@ -106574,12 +104583,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/lab) "dDz" = ( @@ -106875,7 +104879,7 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dEe" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/item/radio/intercom{ pixel_y = -26 }, @@ -106929,11 +104933,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/aft) -"dEn" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/science/misc_lab) "dEo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -107202,7 +105201,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/science/robotics/lab) "dEP" = ( @@ -107354,6 +105353,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/cmo) "dFh" = ( @@ -107797,6 +105797,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/server) "dFV" = ( @@ -107915,12 +105916,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/morgue) "dGh" = ( @@ -108496,10 +106492,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/server) "dHs" = ( @@ -108989,12 +106982,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/misc_lab) "dIq" = ( @@ -109079,12 +107067,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/mixing) "dIu" = ( @@ -109175,12 +107158,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/mixing) "dIA" = ( @@ -109586,7 +107564,7 @@ /turf/open/floor/plasteel/white, /area/crew_quarters/heads/cmo) "dJm" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/green{ dir = 8 @@ -109940,7 +107918,7 @@ /turf/open/floor/circuit/green/telecomms/mainframe, /area/science/server) "dKh" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -110024,10 +108002,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/maintenance/department/medical) "dKt" = ( @@ -110156,10 +108131,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "dKJ" = ( @@ -110261,7 +108233,7 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel, @@ -110442,7 +108414,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance/two, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -110554,7 +108526,7 @@ /turf/open/floor/plasteel, /area/maintenance/aft) "dLj" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -110580,7 +108552,7 @@ /turf/open/floor/plasteel/white, /area/maintenance/department/medical) "dLl" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /obj/effect/turf_decal/tile/green{ dir = 4 @@ -110803,7 +108775,7 @@ "dLT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/crowbar/red, /obj/effect/spawner/lootdrop/maintenance/two, @@ -110935,7 +108907,7 @@ /turf/open/floor/plasteel, /area/science/research) "dMg" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -111696,12 +109668,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "dNE" = ( @@ -111825,10 +109792,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/security/checkpoint/customs/auxiliary) "dNN" = ( @@ -111850,10 +109813,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "dNQ" = ( @@ -111866,10 +109826,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "dNR" = ( @@ -111884,10 +109841,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "dNS" = ( @@ -112259,7 +110213,7 @@ /turf/open/floor/plasteel, /area/maintenance/port/aft) "dOz" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/airalarm{ dir = 4; pixel_x = -23 @@ -112338,7 +110292,7 @@ name = "hallway camera" }, /obj/effect/turf_decal/bot, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel, @@ -112389,7 +110343,7 @@ /area/hallway/primary/aft) "dOI" = ( /obj/machinery/light/small, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/green{ dir = 8 @@ -112676,7 +110630,6 @@ /area/hallway/primary/aft) "dPl" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/aft) "dPm" = ( @@ -112717,10 +110670,7 @@ dir = 1 }, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/virology) "dPp" = ( @@ -112743,7 +110693,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "dPt" = ( @@ -112754,7 +110703,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "dPy" = ( @@ -113087,12 +111035,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/customs/auxiliary) "dQa" = ( @@ -113172,14 +111115,13 @@ }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "dQj" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/green{ dir = 1 }, @@ -113498,12 +111440,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/virology) "dQY" = ( @@ -113593,12 +111530,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/virology) "dRc" = ( @@ -114226,10 +112158,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "dSR" = ( @@ -114242,10 +112171,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "dSS" = ( @@ -114266,7 +112192,6 @@ /area/hallway/secondary/exit/departure_lounge) "dSU" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) "dSY" = ( @@ -114389,7 +112314,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/office) "dTz" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -114413,7 +112338,7 @@ "dTC" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel, @@ -114478,7 +112403,7 @@ /area/hallway/secondary/exit/departure_lounge) "dTJ" = ( /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel, @@ -114625,7 +112550,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/office) "dUk" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light{ dir = 4 }, @@ -114692,7 +112617,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "dUo" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -114713,7 +112638,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "dUq" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/item/radio/intercom{ pixel_y = 26 }, @@ -114778,7 +112703,7 @@ "dUv" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plasteel, @@ -114844,7 +112769,7 @@ /area/hallway/secondary/exit/departure_lounge) "dUB" = ( /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plasteel, @@ -114857,7 +112782,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "dUL" = ( @@ -114868,7 +112792,6 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "dUM" = ( @@ -114879,7 +112802,6 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "dUN" = ( @@ -114941,7 +112863,7 @@ "dUX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/flashlight, /obj/effect/spawner/lootdrop/maintenance, @@ -115010,6 +112932,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main) "dVc" = ( @@ -115051,12 +112974,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/chapel/main) "dVi" = ( @@ -115072,6 +112990,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "dVk" = ( @@ -115141,7 +113062,7 @@ /obj/machinery/status_display/evac{ pixel_y = 32 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/medical/virology) @@ -115168,13 +113089,16 @@ /area/medical/virology) "dVA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/green{ dir = 1 }, /obj/effect/turf_decal/tile/green{ dir = 8 }, +/obj/structure/disposalpipe/sorting/mail/flip{ + name = "Viro Mail"; + sortType = 27 + }, /turf/open/floor/plasteel/white, /area/medical/virology) "dVC" = ( @@ -115192,6 +113116,10 @@ /obj/effect/turf_decal/tile/green{ dir = 4 }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, /turf/open/floor/plasteel/white, /area/medical/virology) "dVD" = ( @@ -115379,12 +113307,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/chapel/main) "dVX" = ( @@ -115402,9 +113325,6 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -115424,9 +113344,6 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -115443,9 +113360,6 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -115462,9 +113376,6 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -115494,10 +113405,6 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "dWd" = ( -/obj/structure/disposalpipe/sorting/mail{ - name = "Chapel Junction"; - sortType = 17 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -115508,6 +113415,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "dWe" = ( @@ -115725,7 +113633,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/office) "dWM" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/camera{ c_tag = "Chapel - Port"; dir = 4; @@ -115764,7 +113672,7 @@ }, /area/chapel/main) "dWR" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel{ dir = 4; icon_state = "chapel" @@ -115774,32 +113682,24 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "dWT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) +/area/quartermaster/miningoffice) "dWU" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -116024,10 +113924,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/virology) "dXo" = ( @@ -116164,7 +114061,7 @@ icon_state = "1-2" }, /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plasteel, @@ -116474,7 +114371,7 @@ icon_state = "1-2" }, /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel, @@ -116579,7 +114476,7 @@ /turf/open/floor/plasteel, /area/medical/virology) "dYS" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/medical/virology) @@ -116588,7 +114485,7 @@ /obj/machinery/status_display/evac{ pixel_y = -32 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/medical/virology) @@ -116681,12 +114578,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/virology) "dZa" = ( @@ -116803,6 +114695,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/office) "dZj" = ( @@ -116845,7 +114738,7 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plasteel, @@ -116876,7 +114769,6 @@ "dZr" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -116889,7 +114781,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "dZx" = ( @@ -116898,7 +114789,6 @@ }, /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "dZy" = ( @@ -116907,7 +114797,6 @@ }, /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "dZz" = ( @@ -117297,15 +115186,11 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/virology) "eak" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/solars/port/aft) "eal" = ( @@ -117542,7 +115427,6 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "eaL" = ( @@ -117755,9 +115639,8 @@ /turf/open/floor/plasteel/grimy, /area/chapel/main) "ebi" = ( -/obj/structure/table/wood/fancy, -/obj/item/storage/book/bible, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/altar_of_gods, /turf/open/floor/plasteel/grimy, /area/chapel/main) "ebj" = ( @@ -118122,7 +116005,7 @@ }, /area/chapel/main) "ebZ" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light{ dir = 4 }, @@ -118151,7 +116034,6 @@ icon_state = "doors"; name = "WARNING: EXTERNAL AIRLOCK" }, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) @@ -118352,7 +116234,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "ecE" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/light_switch{ pixel_x = 24; pixel_y = -24 @@ -118377,7 +116259,7 @@ name = "departures camera" }, /obj/effect/turf_decal/delivery, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel, @@ -118399,7 +116281,6 @@ "ecI" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/white, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "ecQ" = ( @@ -118467,6 +116348,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main) "ecV" = ( @@ -118584,7 +116466,6 @@ /area/maintenance/port/aft) "edl" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/port/aft) "edm" = ( @@ -118609,10 +116490,7 @@ /obj/machinery/newscaster{ pixel_y = -32 }, -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1481; - name = "Confessional Intercom"; +/obj/item/radio/intercom/chapel{ pixel_x = -26 }, /obj/effect/turf_decal/tile/neutral{ @@ -118635,10 +116513,7 @@ /obj/machinery/newscaster{ pixel_y = 32 }, -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1481; - name = "Confessional Intercom"; +/obj/item/radio/intercom/chapel{ pixel_y = -26 }, /obj/effect/turf_decal/tile/neutral{ @@ -118747,6 +116622,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/chapel/office) "edx" = ( @@ -118855,7 +116731,7 @@ /turf/open/floor/plasteel/grimy, /area/chapel/office) "edW" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/sign/warning/nosmoking{ pixel_x = 32 }, @@ -118896,10 +116772,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/escape) "eeb" = ( @@ -118922,10 +116795,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/escape) "eed" = ( @@ -118968,10 +116838,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/escape) "eeh" = ( @@ -118999,20 +116866,19 @@ dir = 4 }, /turf/open/floor/plating, -/area/security/checkpoint/escape) +/area/hallway/secondary/exit/departure_lounge) "eej" = ( /obj/structure/cable/yellow{ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plating, -/area/security/checkpoint/escape) +/area/hallway/secondary/exit/departure_lounge) "eek" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -119071,7 +116937,7 @@ /turf/open/floor/plasteel/grimy, /area/chapel/office) "eey" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/camera{ c_tag = "Chapel Quarters"; dir = 2; @@ -119342,7 +117208,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/security/checkpoint/escape) +/area/hallway/secondary/exit/departure_lounge) "eeS" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -119361,23 +117227,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/security/checkpoint/escape) -"eeT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/caution/stand_clear, -/obj/machinery/atmospherics/components/binary/dp_vent_pump{ - dir = 8 - }, -/obj/machinery/advanced_airlock_controller{ - pixel_y = 26 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/escape) +/area/hallway/secondary/exit/departure_lounge) "eeU" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -119396,7 +117246,7 @@ dir = 9 }, /turf/open/floor/plasteel, -/area/security/checkpoint/escape) +/area/hallway/secondary/exit/departure_lounge) "efe" = ( /obj/structure/cable{ icon_state = "0-2" @@ -119413,7 +117263,6 @@ id = "chapelprivacy"; name = "Chapel Privacy Shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/chapel/office) "efh" = ( @@ -119485,6 +117334,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/office) "efn" = ( @@ -119565,10 +117415,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "efu" = ( @@ -119695,12 +117541,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/escape) "efB" = ( @@ -119797,12 +117638,11 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, /turf/open/floor/plating, -/area/security/checkpoint/escape) +/area/hallway/secondary/exit/departure_lounge) "efQ" = ( /obj/structure/cable{ icon_state = "2-4" @@ -119994,7 +117834,7 @@ desc = "A sign that shows there are doors here. There are doors everywhere!"; icon_state = "doors"; name = "WARNING: EXTERNAL AIRLOCK"; - pixel_x = 32 + pixel_x = -32 }, /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/components/binary/dp_vent_pump{ @@ -120025,7 +117865,7 @@ /turf/open/floor/plasteel, /area/security/checkpoint/escape) "egi" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 @@ -120188,7 +118028,6 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/checkpoint/escape) "egx" = ( @@ -120204,7 +118043,6 @@ /area/solar/port/aft) "egC" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/chapel/office) "egD" = ( @@ -120235,7 +118073,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/checkpoint/escape) "egG" = ( @@ -120243,13 +118080,11 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/checkpoint/escape) "egH" = ( /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/checkpoint/escape) "egQ" = ( @@ -120374,33 +118209,46 @@ /turf/open/floor/plasteel/dark, /area/library) "ejx" = ( -/obj/structure/cable/yellow{ - icon_state = "0-2" +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/security/prison) +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/science/research) "emu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/engine/gravity_generator) "emE" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/engine/atmos) +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"ens" = ( +/obj/machinery/computer/shuttle_flight/custom_shuttle/exploration, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "enE" = ( /obj/structure/cable/yellow{ - icon_state = "0-2" + icon_state = "1-2" }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/security/main) +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/central) "eqM" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -120415,13 +118263,20 @@ /turf/open/floor/plasteel, /area/maintenance/port/fore) "eqS" = ( -/obj/machinery/autolathe, +/obj/machinery/modular_fabricator/autolathe, /obj/machinery/door/window/southleft{ dir = 1; req_access_txt = "48" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) +"evS" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "exx" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -120450,6 +118305,12 @@ }, /turf/open/floor/plating, /area/science/shuttledock) +"eCD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "eCM" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -120469,6 +118330,14 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"eHC" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/space, +/area/space/nearstation) +"eHD" = ( +/turf/closed/wall, +/area/quartermaster/exploration_prep) "eHR" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -120487,6 +118356,10 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"eIL" = ( +/obj/structure/window/reinforced, +/turf/open/space/basic, +/area/space/nearstation) "eJc" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, /turf/closed/wall/r_wall, @@ -120522,26 +118395,15 @@ /turf/open/floor/plasteel, /area/engine/gravity_generator) "ePW" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 2 }, /obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 + dir = 1 }, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/turf/open/floor/plasteel, +/area/medical/medbay/central) "eQt" = ( /obj/structure/cable/yellow{ icon_state = "0-4" @@ -120551,7 +118413,6 @@ }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/miningoffice) "eQJ" = ( @@ -120563,16 +118424,15 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/port/aft) +"eSz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/telecomms/server/presets/exploration, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) "eTv" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -120589,11 +118449,6 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) -"eTF" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/engine/engineering) "eUL" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -120604,11 +118459,18 @@ /obj/structure/closet/secure_closet/brig_phys, /turf/open/floor/plasteel/white, /area/security/brig) +"eVo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "faI" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/camera{ c_tag = "MiniSat Service Bay"; dir = 8; @@ -120686,12 +118548,7 @@ }, /obj/machinery/mineral/ore_redemption, /obj/effect/turf_decal/stripes/box, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "fjK" = ( @@ -120738,6 +118595,19 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/engine, /area/science/mixing/chamber) +"frp" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/pool{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "fsL" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -120747,6 +118617,20 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"ftr" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "fuY" = ( /obj/machinery/conveyor{ dir = 1; @@ -120770,22 +118654,15 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, /area/maintenance/port/aft) +"fxU" = ( +/obj/machinery/vendor/exploration, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "fyB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -120794,28 +118671,18 @@ /area/quartermaster/storage) "fAa" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) -"fBw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, +"fAx" = ( +/turf/open/indestructible/sound/pool, +/area/crew_quarters/fitness/recreation) +"fAL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port) +/turf/closed/wall, +/area/quartermaster/exploration_prep) "fGq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, @@ -120859,7 +118726,6 @@ "fWT" = ( /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/space/nearstation) "gbV" = ( @@ -120875,13 +118741,19 @@ /turf/open/floor/engine, /area/science/mixing/chamber) "geT" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" +/obj/item/radio/intercom{ + pixel_y = 26 }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/security/warden) +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel, +/area/security/brig) "ggr" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -120904,6 +118776,16 @@ }, /turf/closed/wall/r_wall, /area/security/execution/education) +"glX" = ( +/turf/open/indestructible/sound/pool/end, +/area/crew_quarters/fitness/recreation) +"gnx" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/space/basic, +/area/space) "goa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -120918,14 +118800,17 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/shuttledock) -"gqK" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" +"gpi" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/quartermaster/qm) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) "gsZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -120946,6 +118831,10 @@ }, /turf/open/floor/plasteel/white, /area/science/shuttledock) +"gtZ" = ( +/mob/living/simple_animal/hostile/retaliate/goose/vomit, +/turf/open/floor/plating, +/area/maintenance/port/fore) "gvS" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -120965,6 +118854,9 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) +"gyB" = ( +/turf/closed/wall/r_wall, +/area/aisat) "gAb" = ( /obj/structure/sign/departments/minsky/medical/medical2, /turf/closed/wall, @@ -120982,6 +118874,18 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/cryopods) +"gFA" = ( +/obj/machinery/door/airlock/science{ + name = "exploration preperation room"; + req_access_txt = "49" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "gFZ" = ( /obj/machinery/nanite_program_hub, /obj/effect/turf_decal/bot, @@ -121000,6 +118904,14 @@ }, /turf/open/floor/plasteel/dark, /area/science/nanite) +"gIR" = ( +/obj/machinery/suit_storage_unit/exploration, +/obj/effect/turf_decal/bot, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "gKr" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/tile/purple, @@ -121019,17 +118931,11 @@ /obj/effect/mapping_helpers/airlock/unres{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/sorting) "gLV" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) @@ -121051,7 +118957,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "gNS" = ( @@ -121092,12 +118998,6 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/research) -"gRW" = ( -/obj/structure/cable/white, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/security/execution/transfer) "gRX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -121115,14 +119015,18 @@ "gSi" = ( /turf/closed/wall/r_wall, /area/science/misc_lab) -"gTL" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +"gSB" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/turf/open/floor/plating, -/area/security/checkpoint/escape) +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red, +/obj/structure/closet/secure_closet/security/sec, +/turf/open/floor/plasteel, +/area/security/brig) "gUH" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -121139,21 +119043,6 @@ /obj/structure/table/reinforced, /turf/open/floor/plasteel, /area/engine/engineering) -"gVM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port) "gWD" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -121196,7 +119085,6 @@ /area/hallway/primary/starboard) "hbn" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -121225,6 +119113,15 @@ }, /turf/open/floor/plating, /area/quartermaster/storage) +"hga" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "hiT" = ( /obj/machinery/door/airlock/external, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -121247,6 +119144,37 @@ }, /turf/open/floor/plasteel, /area/science/robotics/lab) +"hjT" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"hpj" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/landmark/start/exploration, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"hpt" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "hpC" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 @@ -121254,6 +119182,27 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/shuttledock) +"hrO" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/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/pool/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "hrP" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -121275,11 +119224,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/port/aft) -"hsA" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/hallway/primary/central) "hsX" = ( /obj/machinery/ore_silo, /obj/effect/turf_decal/tile/neutral{ @@ -121294,6 +119238,16 @@ }, /turf/open/floor/plasteel/dark, /area/security/nuke_storage) +"htd" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/landmark/start/exploration, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "huX" = ( /obj/structure/cable/yellow{ icon_state = "0-4" @@ -121308,57 +119262,12 @@ }, /turf/open/floor/plating, /area/engine/storage_shared) -"hwt" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port) "hzc" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/port) -"hAo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port) "hEv" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -121378,7 +119287,6 @@ /area/space/nearstation) "hFO" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, @@ -121399,7 +119307,7 @@ }, /obj/machinery/door/airlock/security/glass{ name = "Prison Wing"; - req_access_txt = "1" + req_one_access_txt = "1;34" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -121410,17 +119318,16 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/prison) +"hGW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/vacant_room/office) "hLm" = ( /obj/machinery/power/terminal{ dir = 4 @@ -121436,6 +119343,55 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"hLx" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"hMS" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/landmark/start/exploration, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"hNI" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall, +/area/vacant_room/office) +"hNS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"hOt" = ( +/obj/structure/table/wood/fancy, +/obj/item/storage/book/bible, +/turf/open/floor/plasteel/grimy, +/area/chapel/main) +"hQy" = ( +/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/telecomms/broadcaster/preset_exploration, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) "hVp" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -121459,28 +119415,16 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"hZQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) "iaF" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/research) +"iaS" = ( +/obj/structure/sign/painting/library{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/library) "igE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm{ @@ -121511,21 +119455,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"iln" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) "imL" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -121553,12 +119482,18 @@ /area/science/shuttledock) "isT" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"itc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "itz" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -121568,6 +119503,22 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"iwZ" = ( +/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/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "ixI" = ( /obj/machinery/conveyor{ dir = 1; @@ -121634,19 +119585,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"iHy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) "iJE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -121685,6 +119623,23 @@ }, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"iSM" = ( +/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{ + name = "Chapel Junction"; + sortType = 17 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "iTa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/blue{ @@ -121719,32 +119674,6 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) -"iZU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/starboard/fore) "jdO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -121775,6 +119704,15 @@ }, /turf/open/floor/plasteel/white, /area/science/shuttledock) +"jfu" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) "jiA" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -121786,12 +119724,64 @@ /area/hallway/secondary/entry) "jkx" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plating, /area/maintenance/solars/port/fore) +"jlf" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 6; + height = 8; + id = "exploration_home"; + name = "Exploration Dock"; + roundstart_template = /datum/map_template/shuttle/exploration/delta; + width = 16 + }, +/turf/open/space/basic, +/area/space) +"jmY" = ( +/obj/machinery/disposal/bin, +/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/trunk, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"jna" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/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/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/aisat) +"joQ" = ( +/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/crew_quarters/fitness/recreation) "jpa" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -121909,41 +119899,33 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/plasteel, -/area/security/execution/transfer) +/area/hallway/primary/starboard) "jAD" = ( /mob/living/simple_animal/pet/dog/pug{ name = "Swanson" }, /turf/open/floor/engine, /area/science/explab) -"jDr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ +"jDb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/port) +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "jIk" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -121963,45 +119945,18 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"jJa" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ +"jKG" = ( +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"jKc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +/obj/structure/disposalpipe/junction/flip{ + dir = 2 }, -/turf/open/floor/plating, -/area/maintenance/port) +/turf/open/floor/plasteel, +/area/security/brig) "jNl" = ( /obj/structure/table, /obj/item/storage/box/masks, @@ -122023,11 +119978,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"jQQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/crew_quarters/cryopods) "jRy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -122048,6 +119998,20 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/mixing) +"jZx" = ( +/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/pool, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "kam" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/conveyor{ @@ -122068,14 +120032,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/maintenance/port/fore) "kcF" = ( @@ -122088,11 +120044,16 @@ }, /turf/open/floor/plasteel/white, /area/science/shuttledock) -"kgb" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/engine/atmos) +"khR" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) "kje" = ( /obj/structure/cable/yellow{ icon_state = "0-4" @@ -122101,7 +120062,6 @@ icon_state = "4-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -122123,11 +120083,16 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"kmN" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/security/checkpoint/escape) +"knY" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "krX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -122147,8 +120112,28 @@ }, /turf/open/floor/plasteel/dark, /area/aisat) +"ksw" = ( +/obj/structure/table/glass, +/obj/machinery/camera{ + c_tag = "Medbay - Sleepers"; + dir = 2; + name = "medbay camera"; + network = list("ss13","medbay") + }, +/obj/item/book/manual/wiki/medicine, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/ointment, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/computer/cryopod{ + pixel_y = 25 + }, +/obj/item/glove_box, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "ksH" = ( -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 8 }, @@ -122234,6 +120219,19 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"kNe" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "kOw" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -122254,14 +120252,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/maintenance/port/fore) "kSy" = ( @@ -122272,11 +120262,25 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) -"kSC" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/maintenance/aft) +"kWj" = ( +/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/pool{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "kXs" = ( /obj/structure/chair/office{ dir = 8 @@ -122356,12 +120360,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/storage_shared) "lgc" = ( @@ -122400,22 +120399,20 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, /area/maintenance/port/fore) +"ljq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/red, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/security/brig) "ljP" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -122459,10 +120456,24 @@ /area/quartermaster/storage) "lrr" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/hallway/secondary/entry) +"lrv" = ( +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/item/surgical_drapes, +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/glove_box, +/turf/open/floor/plasteel/white, +/area/medical/surgery) "lrC" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -122472,12 +120483,24 @@ /area/hallway/secondary/entry) "lrY" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"lsS" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/landmark/start/exploration, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "lti" = ( /obj/machinery/atmospherics/components/trinary/mixer/flipped, /obj/effect/turf_decal/tile/neutral{ @@ -122492,6 +120515,26 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"lvN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "External Docking Port"; + req_access_txt = "49" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "lwE" = ( /obj/structure/disposalpipe/sorting/mail{ dir = 8; @@ -122582,28 +120625,18 @@ }, /turf/open/floor/plasteel/white, /area/science/shuttledock) -"lOp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - 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 = 8 +"lMO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ +/turf/open/floor/plasteel/white/corner{ dir = 1 }, -/turf/open/floor/plasteel, -/area/maintenance/port) +/area/hallway/secondary/entry) "lOY" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -122616,7 +120649,6 @@ /area/science/misc_lab/range) "lRd" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -122663,6 +120695,10 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"lVF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "lXl" = ( /obj/structure/cable/yellow{ icon_state = "0-2" @@ -122691,7 +120727,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/miningoffice) "lXM" = ( @@ -122705,21 +120740,28 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab/range) -"lZF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"lZq" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/aisat) +"mdu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/status_display/evac, +/turf/closed/wall, +/area/crew_quarters/fitness/recreation) "mei" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, @@ -122768,7 +120810,6 @@ /area/science/mixing) "mkw" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -122780,6 +120821,34 @@ }, /turf/open/floor/carpet, /area/chapel/office) +"mpQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"mrS" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"mwg" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "myL" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "rndlab1"; @@ -122789,7 +120858,8 @@ name = "Research Lab Desk"; req_one_access_txt = "7;29" }, -/obj/machinery/autolathe, +/obj/machinery/modular_fabricator/autolathe, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/lab) "mAj" = ( @@ -122841,24 +120911,6 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) -"mBr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "mBP" = ( /obj/structure/closet/crate/science, /obj/machinery/light, @@ -122905,9 +120957,19 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"mIK" = ( +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Space Access Airlock"; + req_one_access_txt = "32;19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) "mJc" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -122915,6 +120977,15 @@ /obj/effect/landmark/start/brig_phys, /turf/open/floor/plasteel/white, /area/security/brig) +"mJB" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) "mMY" = ( /obj/effect/turf_decal/bot, /obj/machinery/vending/snack/random, @@ -122975,6 +121046,35 @@ }, /turf/closed/wall, /area/hallway/secondary/entry) +"mSc" = ( +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"mSx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"mTx" = ( +/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/pool{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "mTY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -122985,7 +121085,6 @@ /area/quartermaster/storage) "mWW" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, @@ -123003,7 +121102,6 @@ /area/science/mixing/chamber) "mYV" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, @@ -123025,27 +121123,24 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"ncL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/port) "ncP" = ( /obj/effect/landmark/xeno_spawn, /turf/open/floor/engine, /area/science/explab) +"ndt" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/anesthetic_machine, +/turf/open/floor/plasteel/white, +/area/medical/surgery) "nfK" = ( /obj/machinery/status_display/supply, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -123053,25 +121148,15 @@ }, /turf/closed/wall, /area/quartermaster/storage) -"nfO" = ( -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/medical/virology) -"nmi" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ +"njx" = ( +/obj/effect/turf_decal/tile/green{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +/obj/effect/turf_decal/tile/brown{ + dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/port/fore) +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "nmx" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -123088,20 +121173,35 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"nof" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"npf" = ( +/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/door/firedoor/border_only{ +/obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/plasteel, -/area/maintenance/starboard/aft) +/area/hallway/secondary/exit/departure_lounge) "npR" = ( /obj/structure/table, /obj/item/storage/secure/safe{ @@ -123142,25 +121242,26 @@ /obj/machinery/holopad, /turf/open/floor/plasteel, /area/vacant_room/commissary) +"nyf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "49" + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "nyB" = ( /obj/structure/lattice, /turf/closed/wall/r_wall, /area/engine/gravity_generator) -"nAL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port) "nBr" = ( /turf/closed/wall/r_wall, /area/engine/storage_shared) +"nBE" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "nDk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -123192,6 +121293,24 @@ /obj/structure/lattice, /turf/open/space, /area/space) +"nRq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/closet/secure_closet/security/sec, +/obj/structure/sign/poster/official/help_others{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/security/brig) "nSh" = ( /obj/machinery/atmospherics/pipe/simple/general/hidden, /turf/closed/wall/r_wall, @@ -123206,14 +121325,28 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/engine/storage_shared) -"nTM" = ( +"nTD" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"nUN" = ( /obj/structure/cable/yellow{ - icon_state = "0-8" + icon_state = "1-2" }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/security/brig) +/obj/machinery/telecomms/hub/preset/exploration, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) +"nXI" = ( +/obj/item/pool/pool_noodle, +/turf/open/indestructible/sound/pool, +/area/crew_quarters/fitness/recreation) +"oap" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "oaD" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -123233,12 +121366,14 @@ "ogg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, -/area/science/misc_lab) +/area/maintenance/port/aft) "ohd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/power/apc/auto_name/north, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, /obj/structure/cable/yellow{ icon_state = "0-4" }, @@ -123247,6 +121382,37 @@ }, /turf/open/floor/plasteel/white, /area/science/shuttledock) +"ojB" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/landmark/start/exploration, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"okR" = ( +/obj/structure/window/reinforced, +/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/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) "olS" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/decal/cleanable/dirt, @@ -123254,6 +121420,10 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/science/storage) +"omk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/aisat) "ooN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -123261,14 +121431,13 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/shuttledock) -"opx" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, +"opF" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, /turf/open/floor/plating, -/area/medical/virology) +/area/crew_quarters/fitness/recreation) "osm" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -123276,19 +121445,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"osH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "otV" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -123303,18 +121459,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/port/fore) "otX" = ( @@ -123346,7 +121490,6 @@ /turf/open/floor/plasteel, /area/engine/gravity_generator) "ovQ" = ( -/obj/machinery/door/firedoor/window, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/science/misc_lab) @@ -123448,6 +121591,9 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"oKk" = ( +/turf/closed/wall/r_wall, +/area/space/nearstation) "oLX" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /obj/structure/disposalpipe/segment, @@ -123486,6 +121632,13 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plasteel/dark, /area/science/mixing) +"oPP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/space, +/area/space/nearstation) "oQn" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -123526,7 +121679,6 @@ /area/science/mixing) "oSQ" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/misc_lab) @@ -123567,10 +121719,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/bridge/showroom/corporate) "pfl" = ( @@ -123582,9 +121731,19 @@ /area/quartermaster/storage) "pfG" = ( /obj/effect/turf_decal/bot, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/central) +"phd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "phI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -123599,19 +121758,16 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) -"piD" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/science/shuttledock) -"pjx" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" +"pjd" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 8 }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/security/checkpoint/escape) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "pmQ" = ( /obj/structure/target_stake, /obj/item/target/syndicate, @@ -123633,6 +121789,34 @@ }, /turf/open/floor/plasteel/dark, /area/engine/atmospherics_engine) +"poD" = ( +/obj/structure/closet/boxinggloves, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/pool/pool_noodle, +/obj/item/pool/pool_noodle, +/obj/item/pool/rubber_ring, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"ppf" = ( +/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/turf_decal/pool/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "pqq" = ( /obj/structure/closet/secure_closet/engineering_welding, /obj/effect/turf_decal/bot, @@ -123640,7 +121824,6 @@ /area/engine/engineering) "pqG" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/hallway/secondary/entry) @@ -123675,11 +121858,17 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 + dir = 4 }, /turf/open/floor/plasteel, -/area/security/execution/transfer) +/area/hallway/primary/starboard) "pyw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/yellow{ @@ -123717,24 +121906,26 @@ }, /turf/open/floor/plasteel, /area/engine/storage_shared) -"pDB" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"pDa" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 +/obj/machinery/telecomms/receiver/preset_exploration, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) +"pDB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /turf/open/floor/plating, /area/maintenance/port) @@ -123766,12 +121957,31 @@ /area/security/detectives_office) "pGt" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"pJZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/telecomms/processor/preset_exploration, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) +"pMT" = ( +/obj/effect/turf_decal/delivery, +/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 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "pNu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, @@ -123800,41 +122010,41 @@ }, /turf/open/floor/plasteel, /area/maintenance/port/aft) -"pVc" = ( -/obj/structure/cable/white, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/security/prison) -"pYE" = ( +"pYd" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/gps/mining/exploration, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"qaR" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/aug_manipulator, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"qba" = ( /obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 + icon_state = "2-8" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/pool{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/port) -"qaR" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/aug_manipulator, /turf/open/floor/plasteel, -/area/science/robotics/lab) +/area/crew_quarters/fitness/recreation) "qcx" = ( /obj/machinery/firealarm{ dir = 4; @@ -123864,6 +122074,13 @@ }, /turf/open/floor/plasteel/dark, /area/science/nanite) +"qer" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/bot, +/obj/effect/spawner/lootdrop/donkpockets, +/obj/item/storage/box/donkpockets, +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) "qeD" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -123875,12 +122092,32 @@ /area/hallway/secondary/command) "qeF" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"qeN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"qhO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock{ + name = "Auxiliary Storage Closet" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) "qjp" = ( /obj/machinery/door/airlock/maintenance_hatch{ id_tag = "commissarydoor"; @@ -123897,27 +122134,21 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input, /turf/open/floor/engine/vacuum, /area/science/mixing/chamber) -"qoY" = ( -/obj/structure/cable/white, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/medical/virology) "qpb" = ( /turf/closed/wall/r_wall, /area/space) -"qtP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ +"quQ" = ( +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) "qvG" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -123929,21 +122160,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, /area/maintenance/port/aft) "qvW" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 8 }, @@ -123986,6 +122208,19 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"qAb" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/landmark/start/exploration, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "qBe" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -123995,20 +122230,13 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/port/aft) +"qGi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/exploration_prep) "qKq" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -124055,37 +122283,10 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) -"qNW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/security/checkpoint/escape) -"qSt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/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/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +"qSu" = ( +/obj/item/pool/rubber_ring, +/turf/open/indestructible/sound/pool, +/area/crew_quarters/fitness/recreation) "qUc" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -124108,6 +122309,16 @@ }, /turf/open/floor/engine, /area/science/explab) +"qVn" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "qWg" = ( /obj/structure/table/reinforced, /obj/machinery/light/small{ @@ -124127,6 +122338,32 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/storage_shared) +"qWH" = ( +/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/tile/neutral, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"qXv" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/landmark/start/exploration, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "qYo" = ( /obj/structure/lattice, /turf/open/space/basic, @@ -124152,12 +122389,27 @@ }, /turf/open/floor/carpet/blue, /area/crew_quarters/dorms) +"rbQ" = ( +/obj/structure/cable/white, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "aiuploadwindow"; + name = "AI Upload Lockdown Door" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload) +"reo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/quartermaster/exploration_prep) "rfe" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/port) "rjQ" = ( @@ -124169,9 +122421,75 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/space) +"rlG" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"rqe" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"rqq" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/virology) +"rqL" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"rsy" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/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/pool{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "ruD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -124198,6 +122516,13 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab/range) +"rDt" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "rEm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -124208,6 +122533,16 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"rFo" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/item/kirbyplants{ + icon_state = "plant-22" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "rFt" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -124221,8 +122556,32 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) +"rHz" = ( +/obj/machinery/computer/objective, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"rNd" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"rNn" = ( +/obj/machinery/suit_storage_unit/exploration, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"rNr" = ( +/obj/structure/sign/poster/contraband/random, +/turf/closed/wall, +/area/quartermaster/exploration_prep) "rOf" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/delivery, /obj/machinery/light_switch{ pixel_x = 22 @@ -124254,16 +122613,18 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/maintenance/starboard/aft) +"rTO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"rUy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/quartermaster/exploration_prep) "rUD" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/manifold/general/visible{ @@ -124301,20 +122662,20 @@ name = "Mining Office"; req_one_access_txt = "31;48" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "rYV" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"sav" = ( +/turf/open/space/basic, +/area/space/nearstation) "saw" = ( /turf/closed/wall/r_wall, /area/science/misc_lab/range) @@ -124361,6 +122722,38 @@ "sif" = ( /turf/open/floor/plasteel/white, /area/science/shuttledock) +"sjz" = ( +/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/turf_decal/pool/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"smR" = ( +/obj/structure/closet/masks, +/obj/structure/sign/nanotrasen{ + pixel_x = 32; + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/pool/pool_noodle, +/obj/item/pool/pool_noodle, +/obj/item/pool/rubber_ring, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "smY" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -124368,9 +122761,36 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"spn" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"sqj" = ( +/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/turf_decal/pool{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "srd" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -124421,22 +122841,25 @@ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/space) +"sBW" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/exit/departure_lounge) "sEu" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/machinery/computer/secure_data{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/machinery/keycard_auth{ - pixel_x = 24 +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/mob/living/simple_animal/pet/dog/bullterrier/walter, -/obj/structure/bed/dogbed/walter, /turf/open/floor/plasteel, /area/security/warden) "sEA" = ( @@ -124448,7 +122871,6 @@ /area/science/shuttledock) "sII" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -124537,21 +122959,25 @@ }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plating, -/area/security/execution/transfer) -"sTI" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/area/hallway/primary/starboard) +"sTA" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance Hatch"; - req_one_access_txt = "12;47" +/mob/living/simple_animal/bot/cleanbot/medbay, +/turf/open/floor/plasteel/white, +/area/medical/storage) +"sTI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/maintenance/port) "sUX" = ( /obj/effect/turf_decal/tile/red{ @@ -124567,9 +122993,13 @@ /obj/machinery/computer/cargo/request, /turf/open/floor/plasteel, /area/engine/break_room) +"sVa" = ( +/obj/structure/table/reinforced, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "sVr" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, @@ -124577,7 +123007,6 @@ /area/hallway/secondary/exit/departure_lounge) "sYD" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/space/nearstation) "tbR" = ( @@ -124637,14 +123066,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/maintenance/port/fore) "tkj" = ( @@ -124657,18 +123078,35 @@ }, /turf/open/floor/plating, /area/engine/storage_shared) -"tlu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"tku" = ( +/obj/structure/chair/office/light{ + dir = 4 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/tile/green{ dir = 1 }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/effect/landmark/start/exploration, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"ttZ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchencounter"; + name = "Kitchen Counter Shutters" + }, +/obj/effect/turf_decal/delivery, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -8 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -8; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/drinks/britcup, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) "tub" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -124680,6 +123118,19 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/vacant_room/commissary) +"tuv" = ( +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Space Access Airlock"; + req_one_access_txt = "32;19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) "twt" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -124701,12 +123152,7 @@ id = "commissaryshutters"; name = "Vacant Commissary Shutters" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/vacant_room/commissary) "tzZ" = ( @@ -124718,6 +123164,31 @@ }, /turf/open/floor/plasteel/white, /area/maintenance/department/science) +"tAs" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/junction/flip{ + 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 + }, +/obj/effect/turf_decal/pool{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "tCh" = ( /turf/closed/wall, /area/science/misc_lab) @@ -124740,11 +123211,17 @@ }, /turf/open/floor/plasteel, /area/science/robotics/lab) -"tGq" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/crew_quarters/fitness/recreation) +"tFv" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"tFQ" = ( +/obj/effect/landmark/carpspawn, +/turf/open/space/basic, +/area/space) "tGU" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/bodycontainer/morgue{ @@ -124795,6 +123272,27 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) +"tMf" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"tMj" = ( +/obj/structure/lattice, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/turf/open/space, +/area/space/nearstation) "tMk" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -124832,14 +123330,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/maintenance/starboard/fore) "ujz" = ( @@ -124893,7 +123383,7 @@ icon_state = "4-8" }, /turf/closed/wall, -/area/security/execution/transfer) +/area/hallway/primary/starboard) "upk" = ( /obj/machinery/door/airlock/public/glass{ name = "Holodeck Access" @@ -124910,12 +123400,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "upw" = ( @@ -124937,14 +123422,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/maintenance/starboard/fore) "uth" = ( @@ -124981,20 +123458,10 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"uwZ" = ( -/obj/structure/cable/white, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/quartermaster/storage) "uyn" = ( /obj/machinery/light{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, /obj/machinery/status_display/evac{ pixel_y = 32 }, @@ -125040,6 +123507,10 @@ }, /turf/closed/wall/r_wall, /area/maintenance/solars/port/fore) +"uKo" = ( +/obj/machinery/status_display/evac, +/turf/closed/wall, +/area/vacant_room/office) "uMN" = ( /obj/structure/table, /obj/item/stack/packageWrap, @@ -125094,7 +123565,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -125102,12 +123572,20 @@ /area/security/execution/transfer) "uTw" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"uXL" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/transit_tube/crossing/horizontal, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/space, +/area/space/nearstation) "uYS" = ( /obj/machinery/door/airlock/atmos/glass/critical{ heat_proof = 1; @@ -125119,6 +123597,12 @@ }, /turf/open/floor/engine, /area/engine/supermatter) +"uZK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "vgM" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -125133,18 +123617,13 @@ /obj/machinery/chem_dispenser/mutagensaltpetersmall, /turf/open/floor/plasteel, /area/hydroponics) -"vhb" = ( +"vgZ" = ( /obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "corporatelounge"; - name = "Corporate Lounge Shutters" + icon_state = "1-2" }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/bridge/showroom/corporate) +/obj/machinery/telecomms/bus/preset_exploration, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/tcommsat/server) "vmK" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner{ @@ -125162,6 +123641,22 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"vql" = ( +/obj/machinery/door/airlock{ + name = "Auxiliary Office"; + req_access_txt = "32" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/vacant_room/office) "vqo" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/yellow{ @@ -125195,6 +123690,26 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) +"vuF" = ( +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/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/aisat) "vwU" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -125215,7 +123730,7 @@ dir = 1 }, /obj/item/stack/sheet/plasteel/fifty, -/obj/item/crowbar/power, +/obj/item/powertool/jaws_of_life, /obj/structure/sign/nanotrasen{ pixel_x = 32 }, @@ -125256,6 +123771,14 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"vDm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "vDU" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -125305,6 +123828,15 @@ }, /turf/open/floor/plasteel/white, /area/maintenance/department/medical) +"vIE" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchencounter"; + name = "Kitchen Counter Shutters" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) "vJu" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Nanite Lab Maintenance"; @@ -125322,6 +123854,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/port/fore) +"vJW" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/landmark/start/exploration, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "vPa" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -125333,6 +123879,39 @@ }, /turf/open/floor/plasteel, /area/maintenance/port/aft) +"vTw" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"vUG" = ( +/obj/structure/cable/yellow{ + 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/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"vZE" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "wbe" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -125389,6 +123968,19 @@ }, /turf/open/floor/plasteel/dark, /area/science/nanite) +"wjW" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Space Access Airlock"; + req_one_access_txt = "32;19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) "wkG" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -125398,6 +123990,10 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"wna" = ( +/obj/machinery/pool_filter, +/turf/open/indestructible/sound/pool/end, +/area/crew_quarters/fitness/recreation) "wpB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -125428,7 +124024,7 @@ "wEB" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/electrical, -/obj/item/wrench/power, +/obj/item/powertool/hand_drill, /obj/machinery/status_display/evac{ pixel_y = 32 }, @@ -125439,24 +124035,12 @@ /obj/structure/sign/departments/minsky/supply/mining, /turf/closed/wall, /area/quartermaster/miningoffice) -"wMZ" = ( +"wGX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 + dir = 9 }, -/turf/open/floor/plating, -/area/maintenance/port) +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "wNF" = ( /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, @@ -125472,14 +124056,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel, /area/maintenance/starboard/aft) "wQo" = ( @@ -125512,74 +124088,68 @@ /area/science/nanite) "wTx" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 8 }, /turf/open/floor/plating, /area/science/shuttledock) -"wTT" = ( +"wXG" = ( /obj/structure/cable/yellow{ - icon_state = "1-2" + icon_state = "0-4" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/power/apc{ + areastring = "/area/hallway/secondary/entry"; + dir = 1; + name = "Arrivals Hallway APC"; + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/camera{ + c_tag = "Arrivals - Center Port"; + dir = 2; + name = "arrivals camera" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ dir = 1 }, -/turf/open/floor/plating, -/area/maintenance/port) +/area/hallway/secondary/entry) "wZk" = ( /obj/structure/closet/crate/critter, /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/shuttledock) "xaf" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Access" - }, -/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 = 8 - }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"xcP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"xaF" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "xdD" = ( /turf/closed/wall/r_wall, /area/science/mixing/chamber) @@ -125588,16 +124158,17 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"xiS" = ( +/obj/effect/turf_decal/tile/green{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +/obj/effect/turf_decal/tile/brown{ + dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "xlf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ @@ -125617,6 +124188,16 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"xni" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "xns" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -125624,45 +124205,37 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"xov" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ +"xqT" = ( +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"xua" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/construction/mining/aux_base) +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "xxg" = ( /obj/structure/sign/warning/biohazard, /turf/closed/wall/r_wall, /area/medical/virology) -"xAY" = ( +"xyE" = ( +/obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 8 }, /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 4 }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) +"xAY" = ( +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, /obj/machinery/door/airlock/maintenance_hatch{ @@ -125689,12 +124262,39 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"xEt" = ( +/obj/structure/rack, +/obj/machinery/button/door{ + id = "kitchenwindows"; + name = "Kitchen Privacy Control"; + pixel_y = -26; + req_access_txt = "28" + }, +/obj/item/clothing/head/chefhat, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/item/reagent_containers/glass/bowl, +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) +"xGd" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) +"xHw" = ( +/obj/structure/pool_ladder, +/turf/open/indestructible/sound/pool/end, +/area/crew_quarters/fitness/recreation) "xHS" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/closed/wall, -/area/security/checkpoint/escape) +/area/hallway/secondary/exit/departure_lounge) "xJa" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -125717,7 +124317,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/maintenance/department/science) "xOo" = ( @@ -125765,22 +124365,103 @@ }, /turf/closed/wall/r_wall, /area/science/mixing/chamber) +"xSF" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) +"xTl" = ( +/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/scrubbers/hidden, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"xTN" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel, +/area/quartermaster/exploration_prep) "xUp" = ( /turf/closed/wall, /area/maintenance/solars/port/fore) -"xVe" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/science/research) +"xWA" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) "xXn" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/engine/vacuum, /area/science/mixing/chamber) +"xZq" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "External Docking Port"; + req_access_txt = "49" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "xZM" = ( /obj/structure/fans/tiny/invisible, /turf/open/space/basic, /area/space) +"yci" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/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/pool/corner, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "ycH" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -125801,16 +124482,6 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plating, /area/maintenance/port/fore) "ydM" = ( @@ -125823,12 +124494,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/door/airlock/research{ name = "Shuttle dock"; req_access_txt = "47" @@ -125836,6 +124501,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/science/shuttledock) "yfv" = ( @@ -125847,11 +124513,13 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"yhB" = ( -/obj/machinery/door/firedoor/window, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/shuttledock) +"ygL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/space, +/area/space/nearstation) "yiv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -125866,32 +124534,16 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) -"yjw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +"ylb" = ( +/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel{ - heat_capacity = 1e+006 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 }, -/area/maintenance/port) +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) (1,1,1) = {" aaa @@ -132965,7 +131617,7 @@ bPC cdt cdt chi -ciQ +rbQ cdt cdt aad @@ -134254,7 +132906,7 @@ cdy ckq clO cnw -ciQ +rbQ cql bmF boh @@ -135535,7 +134187,7 @@ bPC cdt cdt chr -ciQ +rbQ cdt cdt aad @@ -136295,7 +134947,7 @@ bmD bmD btJ bmD -aaa +sav bPC bRM bTD @@ -137322,10 +135974,10 @@ aaa aad ajr bkE -bLE +vuF bNC bPJ -bAw +bVs bTG bVO bYj @@ -137578,14 +136230,14 @@ aad aaa aad aad -aaa -boj +sav +gyB bND -bNu -bRx -bTH +tuv +omk +xTl bVP -bpJ +okR brL bmH bpN @@ -137835,14 +136487,14 @@ aad aaa aad ajr -ajr -bkF +qYo +gyB bNE -brM -bRO +qWH +tMj bTH bVQ -bpJ +okR brO ajr ajr @@ -138093,13 +136745,13 @@ aaa aad aaa aad -aaa -bNF -aaa -bRO +eIL +jna +lZq +tMj bTH bVR -bpJ +okR brO aaa aad @@ -138350,13 +137002,13 @@ aad ajr aaa aad -aaa -bNF -aaa -bRO +eIL +wjW +mIK +tMj bTH bVN -bpJ +okR brO aaa aad @@ -138608,13 +137260,13 @@ ajr aad aad aad -bNF -aad +oPP +abj bRP krX bVT bYk -aJD +oKk aad aad aad @@ -138865,7 +137517,7 @@ ajr aaa aad aaa -bNF +oPP aaa bkF bTI @@ -139122,12 +137774,12 @@ ajr aaa aad aaa -bNF +oPP aaa bRQ bmH bVV -bmH +khR cap aaa aad @@ -139379,12 +138031,12 @@ ajr aad aad aad -bNF +oPP aad bRR aad bVW -aad +xWA bRR aad aad @@ -139636,12 +138288,12 @@ aad aaa aad aaa -bNF +oPP aaa bRS aaa bVW -aaa +gnx caq aaa aad @@ -139893,7 +138545,7 @@ ajr aaa aad aaa -bNF +oPP aaa aad bTJ @@ -140150,12 +138802,12 @@ ajr aaa aad aaa -bNF +oPP aaa aad aaa bVX -aaa +tFv aad aaa aad @@ -140408,11 +139060,11 @@ aad aad aad bNG -bPK +ygL bRT -aad -bVY -aad +eHC +uXL +czd aad aad aad @@ -145575,7 +144227,7 @@ aaa aad car car -car +cnI cJJ caE caE @@ -146347,8 +144999,8 @@ cDT cFH cHc car -xov -jDr +cLL +gWD caE caE caE @@ -147769,7 +146421,7 @@ aaa aaa aaa aaa -aaa +agS aaa aaa aaa @@ -148092,19 +146744,19 @@ aMG aMG aMG aWy -kgb +aMB aZS aMG aWy -kgb +aMB aZS aMG aWy -kgb +aMB aZS aMG aZS -kgb +aMB aWy aMG aMG @@ -148902,13 +147554,13 @@ aaa aad aaa aad -eTF -eTF -eTF +cjd +cjd +cjd crM -eTF -eTF -eTF +cjd +cjd +cjd aad aaa aad @@ -149156,19 +147808,19 @@ car cdH car car -eTF -eTF -eTF -eTF +cjd +cjd +cjd +cjd coZ cqq crN cqq cuP cjd -eTF -eTF -eTF +cjd +cjd +cjd car car cFM @@ -149416,7 +148068,7 @@ chu cje cje cje -eTF +cjd cpa cqr cqr @@ -149431,12 +148083,12 @@ cfC cFN cHh car -cJR -cLA -czA -ccl -ccl -cRK +cLL +phI +caE +cea +cea +cea cea caE cWQ @@ -149688,11 +148340,11 @@ car cFO cbV car -cLL +sTI cLB -caE -cea -cea +czA +ccl +ccl cRL cea cWO @@ -150459,8 +149111,8 @@ cDY cFQ ljP car -yjw -jDr +cJP +gWD caE caE caE @@ -150470,14 +149122,14 @@ caE caE caE caE -hAo -gVM +cmk +cea caE caE caE caE -alV -alV +djn +djn saw saw saw @@ -150720,13 +149372,13 @@ cJW cLE cwp cqL -lOp +cQt cRO cTy cQt cWU cRO -wTT +cqL alM cqL cQt @@ -150744,7 +149396,7 @@ lJW kcF hVM dBT -yhB +sMH aaa aaa aaa @@ -150977,13 +149629,13 @@ cJX cLF fdc cOC -nAL +ccl cRP ccl cVB cVB cVB -ncL +cRP cRP cRP deW @@ -151000,9 +149652,9 @@ saw lJW sif wNF -piD +sMH eaf -yhB +sMH aaa aaa aaa @@ -151243,7 +149895,7 @@ cMY cMY cMY cMY -wMZ +cCM pDB caE cea @@ -151514,7 +150166,7 @@ saw jeu lFh gKr -piD +sMH sMH wTx aaa @@ -151761,7 +150413,7 @@ deX dgn caE caE -sTI +alR caE saw lOY @@ -151771,7 +150423,7 @@ saw lMw sif hpC -piD +sMH eaf ksH aaa @@ -152772,7 +151424,7 @@ cEg cFX cHs cwo -hwt +cJZ cLI cMY cOI @@ -153486,16 +152138,16 @@ aML aMG aMG aMG -emE -kgb -emE +aTg +aMB +aTg aMG aWy -kgb +aMB aZS aMG aWy -kgb +aMB aZS aMG bnc @@ -153688,33 +152340,33 @@ aaa aaa aaa aaa +aad +aad +aad +aad +aad +aad +aad +aad +aaO +aea +mWW +aad aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -ajr +aad +aaO +aea +mWW +aad +aad +aad +aad +aad +aaO +aaO +aaO +aaO aad aad aaa @@ -153799,7 +152451,7 @@ cCC czz cFZ czz -jKc +cAV cKe cLI cNc @@ -153944,34 +152596,34 @@ aaa aaa aaa aaa +aad +aad aaa aaa +aad aaa aaa +aad aaa +abf +ehy +isT +aaO +aaO +aaO +aaO +abf +ehy +isT aaa +aad aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aaO +ajs +ajR +aaO aad aad aad @@ -154056,7 +152708,7 @@ alJ ceb alJ ceb -alL +ceb cJZ cLI cNd @@ -154089,9 +152741,9 @@ nNu aad gSi ovQ -dEn +ovQ gSi -dEn +ovQ gSi dLI ogg @@ -154200,35 +152852,35 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aaO +aaO +abf +aaO +aaO +abf +aaO +aaO +abf +adq +aaO +aec +isT +aeR +aft +aeb +agj +aaO +aej +isT +ads +abf +aaO +aaO +abf +abf +ajt +ajS +abf aaa aad aaa @@ -154344,14 +152996,14 @@ jpa cLx caE aaa -dEn +ovQ dFz dGY dIj dJJ -dEn +ovQ dLJ -gSi +dLY vPa dOM dOM @@ -154452,48 +153104,48 @@ aaa aaa aaa aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aqV -aqV -aqV -aqV -aqV -alf -alf +aaO +abe +abp +abC +abC +abZ +abC +abC +acV +abC +abC +itz +kJG +osm +osm +osm +osm +agB +xlf +eDx +agT +ahO +agT +agT +aiQ +ajd +aju +ajT +eHD +eHD +aFN +aFN +aFN +aFN +aFN +eHD +eHD alf alf aqV @@ -154601,14 +153253,14 @@ cJS cLu cOj aad -dEn +ovQ dFA dGZ dIk dJK dKA dLK -gSi +dLY dOc dOM dOM @@ -154714,43 +153366,43 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aqV -alg -alg -alg -alg -aFJ -alf +aaO +abe +abq +abD +abD +abZ +abD +abD +acW +adr +adr +hEv +adr +adr +adr +adr +adr +agC +hEv +adr +adr +ahP +adr +aiz +aiR +aje +gpi +ajV +eHD +mrS +mrS +mrS +mrS +tMf +xiS +rNd +eHD alg alg avm @@ -154763,7 +153415,7 @@ arB arB aug alg -nmi +alg aAd aKg alf @@ -154971,43 +153623,43 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aqV -alg -alg -awv -alg -alg -alf +aaO +aaO +abf +aaO +aaO +abf +aaO +aaO +abf +aaO +aaO +aaO +aaO +aeS +afu +afx +agk +aaO +aaO +aaO +aaO +abf +aaO +aaO +abf +abf +ajw +ajV +eHD +xTN +tMf +xni +ojB +tku +hMS +vTw +eHD alg aub avn @@ -155115,7 +153767,7 @@ dzp cLy caE aad -dEn +ovQ dFC dHb dIm @@ -155229,6 +153881,8 @@ aaa aaa aaa aaa +aad +aad aaa aaa aaa @@ -155238,6 +153892,12 @@ aaa aaa aaa aaa +aaO +aaO +aaO +aaO +aaO +aaO aaa aaa aaa @@ -155245,26 +153905,18 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aqV -alg -alg -awx -alg -alg -alf +abf +ajx +xGd +eHD +ens +njx +mSc +nTD +sVa +vZE +mwg +eHD arA ary avo @@ -155279,7 +153931,7 @@ alg aFJ alf aIH -alg +gtZ alf aMP aDw @@ -155333,7 +153985,7 @@ ccl csf ctI cvh -nAL +ccl cxS czA czA @@ -155372,12 +154024,12 @@ dzq cLt cOj aaa -dEn +ovQ dFD dHc dIn dJN -dEn +ovQ dLN gSi dOk @@ -155395,7 +154047,7 @@ dYu dYu dOM fvH -ePW +dRA dOM dOM dOM @@ -155487,6 +154139,9 @@ aaa aaa aaa aaa +aad +aad +aad aaa aaa aaa @@ -155507,21 +154162,18 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aqV -alg -alg -awx -alg -alg -alf +aaO +ajw +ajX +eHD +rHz +vJW +cCs +ccy +ccy +htd +pjd +eHD asE auc avp @@ -155590,13 +154242,13 @@ cqL csg cpq cqL -fBw +cwp cxT czB cwp cCG cEo -fBw +cwp cHz cqL cKi @@ -155744,7 +154396,9 @@ aaa aaa aaa aaa +abj aaa +aad aaa aaa aaa @@ -155765,20 +154419,18 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aqV -alg -alg -awx -alg -alg -aAb +abf +ajy +ajV +eHD +nBE +pYd +ftr +rDt +rDt +qVn +kNe +eHD asF alg avq @@ -155993,6 +154645,7 @@ aaa aaa aaa aaa +tFQ aaa aaa aaa @@ -156000,7 +154653,9 @@ aaa aaa aaa aaa +abj aaa +aad aaa aaa aaa @@ -156021,22 +154676,19 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aqV -alg -alg -awx -arC -auc -aru -asG +abf +ajw +ajY +eHD +eHD +eHD +eHD +eHD +eHD +xyE +pMT +nyf +arD alf alf alf @@ -156258,7 +154910,9 @@ aaa aaa aaa aaa +abj aaa +aad aaa aaa aaa @@ -156279,21 +154933,19 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aqV -alg -alg -awx -arD -alg -aub -asH +aaO +rlG +ajV +eHD +fxU +rNn +gIR +rNn +rNn +uZK +oap +rNr +nof alf alg alg @@ -156515,6 +155167,9 @@ aaa aaa aaa aaa +abj +aad +aad aaa aaa aaa @@ -156535,22 +155190,19 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aqV -alg -alg -aoS -aED -aFO -arv -asI +aaO +ajz +phd +fAL +hpt +hpj +lsS +qAb +qXv +uZK +oap +eHD +arD alf alg alg @@ -156772,7 +155424,9 @@ aaa aaa aaa aaa +abj aaa +aad aaa aaa aaa @@ -156793,21 +155447,19 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aqV -alg -alg -aoT -arD -alg -aub -asJ +aaO +ajw +dsQ +gFA +mSc +mSc +rTO +evS +lVF +eVo +eCD +rNr +mSx aud aFO awq @@ -156891,9 +155543,9 @@ cNc cNc cNc cTP -cVH -cXb -cYP +alL +avT +bHD cTP cNc cNc @@ -157029,7 +155681,9 @@ aaa aaa aaa aaa +abj aaa +aad aaa aaa aaa @@ -157050,20 +155704,18 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aqV -alg -aOs -alg -aEE -aFL -alf +aaO +rlG +xSF +rUy +hLx +hLx +hLx +hjT +knY +wGX +mSc +eHD asK alf alg @@ -157286,7 +155938,9 @@ aaa aaa aaa aaa +abj aaa +aad aaa aaa aaa @@ -157300,27 +155954,25 @@ aaa aaa aaa aaa -aaa -aaa -agS -aaa -aaa -aaa -aaa -aaa +jlf aaa aaa aaa aaa aaa aaa -aqV -aqV -anW -apY -apY -aue -aue +abf +ajA +ajV +eHD +eHD +aFN +aFN +aFN +reo +qGi +rUy +rUy aiZ aue aVg @@ -157551,25 +156203,25 @@ aad aad aad aad -avT -aea -mWW -aad +aaa aaa aaa aad -avT -aea -mWW aad aad aad +aaO +xZq +rYV +aad aad aad -avT -avT -avT -avT +aad +aad +aaO +ajw +ajV +abf aaa aad aad @@ -157808,25 +156460,25 @@ aaa aaa aad aaa +aaa +aaa +avU +aaO +aaO +aaO +aaO abf -ehy -isT -avT -avT -avT -avT -abf -ehy -isT +vFI +lRd aaa aad aaa aaa aaa -avT -ajs -ajR -avT +abf +ajz +aka +abf aad aad aad @@ -157849,7 +156501,7 @@ alf alf alf aIL -hZQ +aug alg aug aug @@ -157907,7 +156559,7 @@ cwu cyb czJ cBh -ccr +iaS cEv qwX cHB @@ -158055,34 +156707,34 @@ aaa aaa aaa aaa -avT -avT abf -avT -avT abf -avT -avT abf -adq -avT -aec -isT -aeR -aft -aeb -agj -avT -aej -isT +abf +abf +abf +aaO +aaO +abf ads +avU +avU +avU +rFo +afw +afT +agk +aaO +lvN +lRd +adq abf -avT -avT +aaO +aaO abf abf -ajt -ajS +rlG +xqT abf alf alf @@ -158169,7 +156821,7 @@ caG caG cCP kEN -pYE +cJZ cLI cNh cNh @@ -158312,7 +156964,7 @@ aaa aaa aaa aaa -avT +aaO abe abp abC @@ -158323,23 +156975,23 @@ abC acV abC abC -itz -kJG -osm -osm -osm -osm -agB -xlf -eDx +abC +abC +abC +abC +abC +abC +ylb +rqL +mpQ agT ahO agT agT aiQ ajd -aju -ajT +lMO +xGd abf alg alW @@ -158569,7 +157221,7 @@ aaa aaa aaa aaa -avT +aaO abe abq abD @@ -158579,25 +157231,25 @@ abD abD acW adr -adr -hEv -adr +vDm +itc +vDm adr adr adr adr agC -hEv -adr +itc +hga adr ahP adr aiz aiR aje -ajv +jfu ajU -akx +qhO alh alX amX @@ -158826,35 +157478,35 @@ aaa aaa aaa aaa -avT -avT +aaO +aaO abf -avT -avT +aaO +aaO abf -avT -avT +aaO +aaO abf -avT -avT -avT -avT +aaO +aaO +aaO +aaO aeS afu afx agk -avT -avT -avT -avT +aaO +aaO +aaO +aaO abf -avT -avT +aaO +aaO abf abf ajw ajV -abf +alf ali alY amY @@ -158957,7 +157609,7 @@ dfg dgA cQM djN -xVe +cNp qYo svv oYI @@ -159095,12 +157747,12 @@ aad aaa aaa aad -avT -avT -avT -avT -avT -avT +aaO +aaO +aaO +aaO +aaO +aaO aad aaa aaa @@ -159210,7 +157862,7 @@ cZd cQQ cQP cQQ -cNt +ejx dgB dhZ mQE @@ -159365,7 +158017,7 @@ aad aad aad aad -avT +aaO ajw ajX aky @@ -159378,7 +158030,7 @@ alj aky alg asQ -hZQ +aug aug awz arB @@ -159621,7 +158273,7 @@ aaa aaa aaa aad -avT +aaO abf ajy ajV @@ -159635,7 +158287,7 @@ aqb aky arC asR -iln +ami avy awA axT @@ -159882,7 +158534,7 @@ adq agk ajw ajY -akz +hNI all amb anb @@ -159898,7 +158550,7 @@ auh auh auh auh -jJa +aBv aCB alf alf @@ -160134,7 +158786,7 @@ aaa aaa aaa aaa -avT +aaO hFO lrr weF @@ -160536,7 +159188,7 @@ dYz dZk dZR eaz -ebh +hOt dVc ecA dTA @@ -160648,12 +159300,12 @@ aaa aaa aaa aaa -avT +aaO mRN pqG ntQ ajZ -akA +hGW alo amd anc @@ -160910,7 +159562,7 @@ ads agj ajz ajU -akB +vql alp ame and @@ -160956,7 +159608,7 @@ boH bqH bsD bsW -bvJ +sYD sYD sYD bwU @@ -161163,7 +159815,7 @@ aaa aaa aaa aad -avT +aaO abf ajA ajV @@ -161212,7 +159864,7 @@ aYC boH bqH bsE -hsA +buq aaa aad aaa @@ -161406,14 +160058,14 @@ aad aad aad aad -avT +aaO uwl rYV aad aad aad aad -avT +aaO aee rYV aad @@ -161421,10 +160073,10 @@ aad aad aad aad -avT +aaO ajw ajV -akC +uKo alr amg anf @@ -161469,7 +160121,7 @@ aYC boH bqH bsE -hsA +buq aaa aad aaa @@ -161666,10 +160318,10 @@ aaa abf vFI lRd -avT -avT -avT -avT +aaO +aaO +aaO +aaO abf vFI lRd @@ -161690,7 +160342,7 @@ apc aqi aky ycJ -xcP +awx auh auh auh @@ -161726,7 +160378,7 @@ aYC boH bqH bsE -hsA +buq aaa aad aaa @@ -161916,27 +160568,27 @@ abf abf abf abf -avT -avT +aaO +aaO abf ads -avT +aaO mAG qeF aeV afw afT agk -avT +aaO iBx lRd adq abf -avT -avT +aaO +aaO abf abf -ajB +wXG ajV aky aky @@ -161948,7 +160600,7 @@ aky aky arD asZ -iHy +aui avF awH aya @@ -161978,7 +160630,7 @@ bfc aYC bhN bjF -blu +xEt aYC boI bqH @@ -162085,9 +160737,9 @@ dTA edw dTw dTw -dTw -dSz -dTw +dST +oyN +dST aad aad aaa @@ -162171,7 +160823,7 @@ aaa aaa xZM abE -avU +aaO aca abC abC @@ -162240,7 +160892,7 @@ bnq boH bqH bsE -hsA +buq aaa aad aaa @@ -162327,7 +160979,7 @@ dRN dSK dTC dUv -dVi +qeN dVi dWS dVi @@ -162497,7 +161149,7 @@ bnq boJ bqI bsE -hsA +buq aaa aad aaa @@ -162586,7 +161238,7 @@ dTD dUw dVj dVX -dWT +ecW dXJ dXJ dXJ @@ -162599,9 +161251,9 @@ ecW edx edY edY -edY +dST xHS -egE +sBW aad aad aaa @@ -162685,7 +161337,7 @@ aaa aaa xZM abG -avT +aaO acc abD abD @@ -162743,7 +161395,7 @@ aVq aLL aNi aKz -bci +bcj bdI bdJ bdI @@ -162754,7 +161406,7 @@ bnq boH bqH bsE -hsA +buq aaa aad aaa @@ -162841,7 +161493,7 @@ dNL dNL dTE dUx -dUx +npf dVY dWU dUx @@ -162944,24 +161596,24 @@ abf abf abf abf -avT -avT +aaO +aaO abf adq -avT +aaO ihM hFO aeX afx afx agl -avT +aaO ihM qvW ads abf -avT -avT +aaO +aaO abf ajh ajw @@ -163000,7 +161652,7 @@ aVr aNh aLL aKz -bcj +ttZ bdJ bfe bgs @@ -163098,7 +161750,7 @@ dRP dNL dTE dUx -dUx +npf dVZ dUy dXK @@ -163115,7 +161767,7 @@ eea eeI efv egi -pjx +eeb aad aad aaa @@ -163208,10 +161860,10 @@ aaa abf ehy lRd -avT -avT -avT -avT +aaO +aaO +aaO +aaO abf ehy qvW @@ -163257,10 +161909,10 @@ aVs aNh aLL aLL -aYC -bdK +vIE +bdI bff -bgt +qer bhR bjI blz @@ -163268,7 +161920,7 @@ bnq boH bqK bsE -hsA +buq aaa bwR byf @@ -163283,7 +161935,7 @@ bMw bOF bQG bIH -bUF +hQy bWW bUF bUF @@ -163355,7 +162007,7 @@ dRQ dSM dTF dUx -dUx +npf dWa dUx dXL @@ -163462,14 +162114,14 @@ aad aad aad aad -avT +aaO uHG lrY aad aaa aaa aad -avT +aaO otX lrY aad @@ -163477,7 +162129,7 @@ aad aad aad aad -avT +aaO ajw ajV akE @@ -163525,12 +162177,12 @@ bnq boH bqH bsE -hsA +buq aaa bwS byg bzM -bBG +bzP bDB bFi bGU @@ -163547,8 +162199,8 @@ bUF ccE ceu caX -cic -cic +pJZ +eSz caX cmD aad @@ -163559,7 +162211,7 @@ cua cvr aad aad -vhb +czY cBo cCU cEK @@ -163612,7 +162264,7 @@ dRR dSN dTF dUx -dUx +npf dWa dUx dXM @@ -163782,7 +162434,7 @@ bnq boH bqL bsE -hsA +buq aaa bwS byh @@ -163869,7 +162521,7 @@ dRS dSO dTF dUx -dVk +xaF dWa dUx dXL @@ -163991,7 +162643,7 @@ aaa aaa aaa aaa -avT +aaO ajz ake akI @@ -164013,10 +162665,10 @@ aAp aBF asO aDL -aFa +jmY aGl aHE -aJa +bdK aKB aLM aLL @@ -164039,7 +162691,7 @@ bcl boH bqM bsH -hsA +buq aaa bwT byi @@ -164126,7 +162778,7 @@ dNL dNL dTG dUy -dUy +vUG dWb dUx dXN @@ -164248,7 +162900,7 @@ aaa aaa aaa aaa -avT +aaO ajE akf akJ @@ -164383,8 +163035,8 @@ dRT dSP dTF dUx +npf dUx -dWc dUx dXL dYE @@ -164505,7 +163157,7 @@ aaa aaa aaa aaa -avT +aaO ajw akg akK @@ -164553,7 +163205,7 @@ bns boL bqO bsJ -hsA +buq aaa bwV byk @@ -164640,7 +163292,7 @@ dRU dSQ dTH dUz -dUz +iSM dWd dWV dXM @@ -164762,7 +163414,7 @@ aaa aaa aaa aaa -avT +aaO ajw akg akL @@ -164810,7 +163462,7 @@ bnt boM bqP bsK -hsA +buq aaa bwW byl @@ -164914,7 +163566,7 @@ eef eeO efC ego -pjx +eeb aad aad aaa @@ -165019,7 +163671,7 @@ aaa aaa aaa aaa -avT +aaO ajw akg akM @@ -165067,7 +163719,7 @@ avO boN bqQ bsL -hsA +buq aaa bwX bym @@ -165276,7 +163928,7 @@ aaa aaa aaa aaa -avT +aaO ajw akg akN @@ -165533,7 +164185,7 @@ aaa aaa aaa aaa -avT +aaO ajz ake akI @@ -165581,7 +164233,7 @@ bfk boO bqS bsN -hsA +buq aaa bwR byo @@ -165838,7 +164490,7 @@ bfk boO bqT bsO -hsA +buq aaa bwS byp @@ -166032,14 +164684,14 @@ aad aad aad aad -avT +aaO jqH mWW aad aaa aaa aad -avT +aaO jqH mWW aad @@ -166047,7 +164699,7 @@ aad aad aad aad -avT +aaO ajw ajV akP @@ -166095,7 +164747,7 @@ bnv boO bqU bsO -hsA +buq aaa bwS byq @@ -166117,8 +164769,8 @@ bUF ccE ceC caX -cic -cic +vgZ +nUN caX cmD aad @@ -166129,7 +164781,7 @@ cuk cvr aad aad -vhb +czY cBw cDe cER @@ -166195,9 +164847,9 @@ aad aad dST ehM -qNW -eeT -kmN +oyN +ehM +dSU aad aaa aaa @@ -166292,10 +164944,10 @@ aaa abf ehy isT -avT -avT -avT -avT +aaO +aaO +aaO +aaO abf ehy isT @@ -166352,7 +165004,7 @@ bnw boP bqV bsP -hsA +buq aaa bwT byf @@ -166367,7 +165019,7 @@ bMG bOP bQP bIV -bUF +pDa bXb bUF bUF @@ -166452,9 +165104,9 @@ aaa aaa dSU dYJ -gTL +sVr eeU -kmN +dSU aaa aaa aaa @@ -166542,24 +165194,24 @@ abf abf abf abf -avT -avT +aaO +aaO abf ads -avT +aaO qyP pGt afb afz afV agk -avT +aaO eHR isT adq abf -avT -avT +aaO +aaO abf ajh ajw @@ -166797,15 +165449,15 @@ aaa aaa xZM abE -avT +aaO aca abC abC adb abC abC -abC -aew +cJR +cLA sxx afA aeW @@ -166866,7 +165518,7 @@ bny boN bqU bsO -hsA +buq aaa aad aaa @@ -166944,7 +165596,7 @@ dIX dCy dLa dMz -kSC +dNT aaa aaa aaa @@ -167123,7 +165775,7 @@ bnv boQ bqX bsO -hsA +buq aaa aad aaa @@ -167311,7 +165963,7 @@ aaa aaa xZM abG -avT +aaO acc abD abD @@ -167342,7 +165994,7 @@ any aou aou ajL -tlu +ajL ajL ats auw @@ -167380,7 +166032,7 @@ bfk boO bqU bsO -hsA +buq aaa aad aaa @@ -167715,7 +166367,7 @@ dIZ dCy dKZ dMC -kSC +dNT aad aaa aaa @@ -167859,7 +166511,7 @@ aqz aig aig aig -iZU +auy avQ awZ ayr @@ -167894,7 +166546,7 @@ bdN boR bqU bsO -hsA +buq aaa aad aaa @@ -168151,7 +166803,7 @@ baQ boS bqU bsO -hsA +buq aaa aad aaa @@ -168361,7 +167013,7 @@ aij aiE aiW ajj -tlu +ajL ako akS alG @@ -168408,7 +167060,7 @@ baQ boT bqU bsO -hsA +buq aaa aad aaa @@ -168486,7 +167138,7 @@ dCy dCy dLc dME -kSC +dNT aad aaa aaa @@ -168602,7 +167254,7 @@ acs acJ adg ace -xua +adR abi adR adR @@ -169176,7 +167828,7 @@ bii bjU blR rUL -boO +hNS bqZ bsT bun @@ -169257,7 +167909,7 @@ adu aaL dLf dMH -kSC +dNT aad aaa aaa @@ -170799,7 +169451,7 @@ dJj dtK dLa dML -kSC +dNT aaa aaa aaa @@ -171229,7 +169881,7 @@ bee bfC bgP biq -bjZ +dWT blX aig bpa @@ -171579,11 +170231,11 @@ dPq dPq aaa dUK -qoY +dSc dPq dPs dPq -nfO +dPr dZw aaa aaa @@ -171718,7 +170370,7 @@ auK aoF axn ayE -uwZ +azG aAI aCb aDf @@ -171726,10 +170378,10 @@ aEh aFk aGD aHW -uwZ azG -uwZ -uwZ +azG +azG +azG aPg aQQ aSv @@ -171807,7 +170459,7 @@ dfG dhh diH dky -dfG +emE dnz det det @@ -171988,7 +170640,7 @@ aad aad aad aad -gqK +aQR aSw aUm aVV @@ -172047,7 +170699,7 @@ cFi cGJ cIa cAm -qSt +cKN cMm cNK cNK @@ -172064,7 +170716,7 @@ dfH gNI diI dkz -dlZ +enE dnA dpz dbs @@ -172313,7 +170965,7 @@ cST cUM cWu cRe -cZH +ksw cPo cXI aaI @@ -172321,7 +170973,7 @@ cNz dhp diJ dkA -dfF +ePW dnB dpA dnB @@ -172606,13 +171258,13 @@ dQX xxg dPq aaa -opx +dUN dVw dWp dXd dXX dYS -opx +dUN aaa aad aad @@ -172825,7 +171477,7 @@ cPF cRh cSU cRh -cWw +sTA cSS smY dbt @@ -173016,12 +171668,12 @@ aaa aaa aaa aad -gqK +aQR aSs aUq aVR aXF -gqK +aQR aad aaa bel @@ -173117,16 +171769,16 @@ aad aad dQh dQZ -qoY +dSc aad aad -nfO +dPr dVy dWr dXf dXZ dYU -qoY +dSc aaa ajr aad @@ -173372,9 +172024,9 @@ dMV cHU aaa aaa -nfO +dPr dRa -qoY +dSc aaa aaa dPq @@ -173867,8 +172519,8 @@ dma dnG dnG dro -dsN -dtQ +lrv +ndt dvE dxl dyG @@ -174142,14 +172794,14 @@ cMg dMX dfX aaa -nfO +dPr dQj dRd aev dSZ dTS dUP -dTS +rqq dWv dXj dYc @@ -174322,9 +172974,9 @@ bta buz uSv aaa -bta +bCf bAd -uSv +bEa aaa aaa bHr @@ -174580,7 +173232,7 @@ buA kje aad ulV -buA +bCn sTs aad aad @@ -174830,17 +173482,17 @@ aaa aaa aad bnD -gRW +bpc bnG btc buB kje bnG -btc +bCi bAf -kje -bDV -bDV +bEc +bHv +bHv bHr bHr bHr @@ -175094,15 +173746,15 @@ buC bvX bnG byD -buC +bCo jAr bDW bFG bHt bJp -bLj +bHt bNh -bLj +spn hat bLj bVh @@ -175355,11 +174007,11 @@ bAg bBY bDX bFH -bHu -bJq +cdo bHu bHu bHu +iwZ bHu bHu bVi @@ -175612,7 +174264,7 @@ pxm bBZ bDY bFI -bHv +bJr bJr bJr bNi @@ -175671,7 +174323,7 @@ dtW dvL dfW dyM -lZF +dbE dBy dCU cHU @@ -175864,10 +174516,6 @@ btg buF bwa bnG -byG -bAi -bCa -bDZ bnG bHw bJs @@ -175877,6 +174525,10 @@ bHw bJs bLk bgZ +bHw +bJs +bLk +bgZ bXB bZK cbw @@ -175910,7 +174562,7 @@ cAw cAw cAw cAw -mBr +cYg nmx cHU cHU @@ -176120,12 +174772,12 @@ bri bth buG bwb -bpc -byH +bAk +bDV bAh -bCb -bEa -bnG +bRo +bLl +bNj bHx bJt bLl @@ -176158,7 +174810,7 @@ cAw cAw cAw cAw -cJj +cRK cKY cMv cIg @@ -176209,7 +174861,7 @@ dPq dPq dPq dPq -opx +dUN dPq dPq dPq @@ -176377,12 +175029,12 @@ brj bti buH bwc -bnG -byI +bCa +bDV bAj bCc bEb -bnG +bEe bHy bJu bLm @@ -176456,12 +175108,12 @@ cHU cHU aad aad -nfO +dPr aed aeg dTi aeq -qoY +dSc aaa aad aad @@ -176635,11 +175287,11 @@ btj buI bpc bnG -bnG -bAk +bDV +bHz bCd -bnG -bnG +bmc +bNj bHz bJv bmc @@ -176671,7 +175323,7 @@ cCd cDD cFx cGU -cAw +cIi cJl cLa cMx @@ -176890,13 +175542,13 @@ bmh brl btk buJ -bmh +buM bxo byJ bAl bCe -bEc -bmh +bLn +bJq bHA bJw bLn @@ -176906,7 +175558,7 @@ bJw bTd bVk bXF -bmh +quQ cbA cdn cfg @@ -177148,24 +175800,24 @@ brm btl buK bwd -bwd -bwd -bAm -bCf -bEd +bwh +bxq +bDZ +afR bFJ -bHB +cbB +bwd bJx bLo bwd bPr bJx bTe -bwd +bDZ bXG bZO -bnI -cdo +bpk +bpk cfh cgW ciG @@ -177398,30 +176050,30 @@ bfP bhc biF bkq -bmj +bwi bnJ bkq brn btm bkq -bkq -bxp +bwe +bCb byK bAn bCg -bEe +bCh bFK -bHC +ljq bJy bLp bNl bNl bNl bLp -bNl +jKG bXH bZP -cbB +bNl cdp bHC cgX @@ -177663,23 +176315,23 @@ btn buL bhd bhd -byL +bnK bAo -bCh bhd bFL -bHD +bCp bFL bFL -bLq -bPs -bLq +cbD +bPx +cbD bFL bFL +cbG bXI bZQ -cbC bFL +bgZ cfi cgY bgZ @@ -177917,16 +176569,16 @@ bnL bpl brp bto -buM -bwe +byL bhd bmr -bnT -bCi +bxt +bAm bhd +bHG bFM bHE -bJz +cbD bLq bNm bPt @@ -177936,7 +176588,7 @@ aiM bXJ bZR cbD -bLq +cdq cfj cgZ ciI @@ -178175,13 +176827,13 @@ bpm brq btp buN -bwf bhd byM +byG bAp -bCj bhd -bFM +bHG +bEd bHF bJA bLr @@ -178193,7 +176845,7 @@ bVm bXK bZS cbE -cdq +mJB cfk cha ciJ @@ -178227,7 +176879,7 @@ cYn cZX dbD ddt -qtP +ddt dfV dbD diW @@ -178433,14 +177085,14 @@ brr btq buO bwg -bxq byM +byH bAq -bCk bhd +bCj bFN bHG -bFM +cbF bHL sEu bPv @@ -178450,7 +177102,7 @@ bVn bXL bZT cbF -bHL +mJB cfl chb ciK @@ -178484,7 +177136,7 @@ cYo cZY dbE cRr -osH +cRr dfW dhB cRr @@ -178688,26 +177340,26 @@ bnO bmp brs btr -buO -bwh +bAi bhd +bwj byN bAr -bCl bhd +bCk bFO bHH -bJB bLs bLs bPw bPw bLs +cbC bVo bXM bZU -cbG bLs +cfn cfm chc ciL @@ -178919,7 +177571,7 @@ aaa aaa aaa aaa -ejx +aFn aGI aIe aJz @@ -178935,7 +177587,7 @@ aXM aZu bbd bcP -pVc +bcM aad bhd uth @@ -178946,26 +177598,26 @@ bpo brt bts buP -bwi bhd byM byM -bCi +bAm bhd +bHB bFP bHI -bJC bLs bNp bNp bNp +bPz bTi bVp -bXN +cds bZV -cbH bLs -cfn +geT +cfo chd ciM bmc @@ -178974,7 +177626,7 @@ cnq coU clA aaZ -jQQ +abn aaZ abn abL @@ -179194,7 +177846,7 @@ bbf bcQ aFm aaa -enE +bhe biL bkv bmq @@ -179203,25 +177855,25 @@ bpp bru btt buQ -bwj bhd +bxp byO bAs -bCm bhd +bCl bFQ bHJ -bJD bLs +bJB bNq -bPx bRt bRt bRt -bXO -bZV +cbH +cds +cbL cbI -cdr +mJB cfo chc ciN @@ -179433,7 +178085,7 @@ aaa aaa aaa aaa -ejx +aFn aGK aIg aJB @@ -179460,16 +178112,16 @@ bpq brv btu bkw -bku +bwf bxr byP bAt -bCn bhd +bCm bFR bHK -bJE bLs +bJC bNr bPy bRu @@ -179478,7 +178130,7 @@ bVq bXP bZW cbJ -cds +mJB cfp che ciO @@ -179489,22 +178141,22 @@ coW clA aad aad -tGq +cuM cwd cxx czh cAz cCl cCl -cCl -cCl -cCl -cJu -cLk -cMG -cCl -cCl -cCl +yci +rsy +rsy +qba +frp +tAs +rsy +rsy +hrO cCl cCl cWD @@ -179512,7 +178164,7 @@ cAz dac cxy ddw -tGq +cuM aad cHU cIW @@ -179721,21 +178373,21 @@ bwk bxs byQ bAu -bCo bhd bFL -geT +cbF bFL bLs +bJD bNs -bPz bRv bRv bRv +cbK bXQ bZX -cbK bLs +gSB cfq chf ciP @@ -179746,22 +178398,22 @@ clA clA aaa aaa -tGq +cuM cwd cxy czi cAA cCm cDK -cxy -cDL -cIl -cJv -cJv -cMH -cNX -cPY -cxy +jZx +wna +fAx +fAx +fAx +fAx +fAx +fAx +mTx cTe cTe cWE @@ -179769,7 +178421,7 @@ cYs dad cTe ddw -tGq +cuM aaa cHU cIW @@ -179963,7 +178615,7 @@ aXM aZy bbd bcS -pVc +bcM aad bhd biO @@ -179975,15 +178627,15 @@ brx btw buS bwl -bxt bmr +byI bAv -bCp bhd -aad aaa aad +aaa bLs +bJE bNt bPA bRw @@ -179991,9 +178643,9 @@ bTk bVr bXR bZY -cbL bLs -cfr +nRq +rqe chg cfr bgZ @@ -180003,22 +178655,22 @@ aaa aaa crD aaa -tGq +cuM cwf cxy czj cAB cCn cDL -cxy -cHa -cIm -cCn -cCn -cMI -cNY -cPZ -cxy +jZx +glX +nXI +fAx +fAx +fAx +fAx +fAx +mTx cTf cVd cTe @@ -180026,7 +178678,7 @@ cYt dae dbG ddw -tGq +cuM aad cHU cIW @@ -180236,10 +178888,9 @@ bhd bhd bhd bhd -bhd -aad aaa aad +aaa bLs bLs bLs @@ -180251,7 +178902,8 @@ bLs bLs bLs bgZ -nTM +bgZ +bZN bgZ bgZ aaa @@ -180260,22 +178912,22 @@ aad ajr aad aad -tGq +cuM cwg cxy czj cAC cCn cDL -cxy -cHa -cIm -cCn -cCn -cCn -cNY -cPZ -cxy +jZx +xHw +fAx +fAx +fAx +fAx +fAx +fAx +mTx cTg cVe cxy @@ -180283,7 +178935,7 @@ cYt daf dbH ddx -tGq +cuM aad cHU cHU @@ -180465,7 +179117,7 @@ aaa aad aad aad -ejx +aFn aMn aNI aPr @@ -180517,22 +179169,22 @@ aaa aaa aaa aaa -tGq +cuM cwh cxy czj cAB cCn cDM -cxy -cHa -cIm -cJw -cCn -cCn -cNY -cPZ -cxy +jZx +glX +fAx +fAx +fAx +qSu +fAx +fAx +mTx cTh cVf cWF @@ -180540,7 +179192,7 @@ cYu dag dbI cDL -tGq +cuM aad aaa aaa @@ -180722,7 +179374,7 @@ ajr aad aaa aad -ejx +aFn aMo aNJ aPs @@ -180733,7 +179385,7 @@ aKZ aFm aZB bbd -pVc +bcM aaa aad aaa @@ -180774,22 +179426,22 @@ ajr ajr aad aad -tGq +cuM twt cxy czk cAD cCo cDN -cxy -cDL -cIn -cJx -cLl -cLl -cNZ -cPY -cxy +jZx +glX +fAx +fAx +fAx +fAx +fAx +fAx +mTx cTe cTe cWG @@ -180797,7 +179449,7 @@ cYv dah cTe dbJ -tGq +cuM aad ajr aaa @@ -180990,7 +179642,7 @@ aWl aFm aZC bbm -pVc +bcM aad aad aad @@ -181031,22 +179683,22 @@ aaa aaa aaa aaa -tGq +cuM twt cxy czl cAE cCp cCp -cCp -cCp -cCp -cJy -cCp -cCp -cCp -cCp -cCp +ppf +sqj +sqj +kWj +sqj +sqj +sqj +sqj +sjz cCp cCp cCp @@ -181054,7 +179706,7 @@ cYw czl cxy dbJ -tGq +cuM aad ajr aaa @@ -181247,7 +179899,7 @@ aWm aXR aZD bbm -pVc +bcM aaa aad aaa @@ -181288,7 +179940,7 @@ aad aad ajr aad -tGq +cuM twt twt czm @@ -181311,7 +179963,7 @@ cQa dai dbJ ddy -tGq +cuM aad aaa aaa @@ -181545,30 +180197,30 @@ aaa aaa aaa aaa -tGq +cuM cwj cwj cwj -tGq -tGq -tGq -tGq -tGq -tGq +cuM +cuM +cuM +cuM +cuM +cuM cJA cuM cuM cOb -tGq -tGq -tGq -tGq -tGq -tGq +cuM +cuM +cuM +cuM +cuM +cuM daj dbK ddz -tGq +cuM aad ajr aaa @@ -181802,30 +180454,30 @@ aaa aaa aaa aaa -tGq -cwk -cxz -czn -tGq +cuM +smR +cLk +poD +cuM aaa aaa aad aaa -tGq +cuM cJB cuL cLn cOc -tGq +cuM aaa aad aaa aaa -tGq +cuM dak dbL ddA -tGq +cuM aad ajr aaa @@ -182060,9 +180712,9 @@ aaa aaa aad cuL -tGq -tGq -tGq +cuM +cuM +cuM cuL aad cDP @@ -182079,9 +180731,9 @@ cQb cVh aad cuL -tGq -tGq -tGq +cuM +cuM +cuM cuL aad aaa @@ -182320,7 +180972,7 @@ aad aad aad aad -tGq +cuM aaa cDQ cFF @@ -182335,7 +180987,7 @@ cFF cFF cVi aaa -tGq +cuM aad aad aad @@ -182577,7 +181229,7 @@ aaa aaa aaa aad -tGq +cuM aaa cDQ cFF @@ -182592,7 +181244,7 @@ cFF cFF cVi aaa -tGq +cuM aad aaa aaa @@ -182834,7 +181486,7 @@ ajr aad aad aad -tGq +cuM aad cDR cFG @@ -182849,7 +181501,7 @@ cFF cTi cVj aad -tGq +cuM aad ajr aaa @@ -183047,7 +181699,7 @@ aXT aZJ bbs bcV -pVc +bcM aaa aad aaa @@ -183091,7 +181743,7 @@ aaa aaa aaa aad -tGq +cuM aaa cDQ cFF @@ -183106,7 +181758,7 @@ cFF cFF cVi aaa -tGq +cuM aad ajr aaa @@ -183348,7 +182000,7 @@ aaa aaa ajr aad -tGq +cuM aaa cDQ cFF @@ -183363,7 +182015,7 @@ cFF cFF cVi aaa -tGq +cuM aad ajr aaa @@ -183603,26 +182255,26 @@ aaa aaa aaa aaa -ajr -aad -cuL -aad -cDS -cFE -cFE -cFE -cJD -cuM +aaa +qYo cuM -cOe -cQb -cQb -cQb +aaa +cDS +cFF +cFF +cFF +cFF +cFF +cFF +cFF +cFF +cFF +cFF cVk -aad -cuL -aad -ajr +aaa +cuM +qYo +aaa aaa aaa aaa @@ -183861,24 +182513,24 @@ aaa aaa aaa aaa -aad -tGq -aaa -aaa -aad -aaa -tGq -cJE -cLn -cuL -cOf -tGq -aaa -aad -aaa -aaa -tGq -aad +qYo +cuM +qYo +cIo +cFG +cFF +cFF +cFF +cFF +cFF +cFF +cFF +cFF +cTi +mdu +qYo +cuM +qYo aaa aaa aaa @@ -184069,74 +182721,74 @@ aaa aaa aaa aaa -ajr -aad -aKV -xZM -bbv -xZM -aKV -aad -aad -ajr -ajr -ajr -ajr -ajr -aad -ajr -ajr -aad -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ajr +aad +aKV +xZM +bbv +xZM +aKV +aad +aad +ajr +ajr +ajr +ajr +ajr +aad +ajr +ajr +aad +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa aaa aaa aaa +qYo +cuM aaa +cDS +cFF +cFF +cFF +cFF +cFF +cFF +cFF +cFF +cFF +cFF +cVk aaa -aad -tGq -tGq -tGq -tGq -tGq -tGq -xaf -cuM cuM -upk -tGq -tGq -tGq -tGq -tGq -tGq -aad -ajr +qYo +aaa aaa aaa aaa @@ -184375,24 +183027,24 @@ aaa aaa aaa aaa -aad -aad -aad -aad -aad -aad -tGq -cJF -cLo -cMJ -cOg -tGq -aad -aad -aad -aad -aad -aad +qYo +cuM +aaa +cDS +cFF +cFF +cFF +cFF +cFF +cFF +cFF +cFF +cFF +cFF +cVk +aaa +cuM +qYo aaa aaa aaa @@ -184631,22 +183283,25 @@ aaa aaa aaa aaa -aaa -aaa -ajr -ajr -aaa ajr aad -cIo +cuL +aad +cJD +cFE +cFE +cFE cJG -cLp -cMK +cuM +cuM cOh -cIo +cQb +cQb +cQb +opF +aad +cuL aad -aaa -ajr ajr aaa aaa @@ -184669,9 +183324,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa ajr ajr aad @@ -184889,24 +183541,24 @@ aaa aaa aaa aaa +aad +cuM aaa aaa +aad aaa -aaa -aaa -aaa -tGq +cuM cJH -cLq -cML +cLn +cuL cOi -tGq -aaa -aaa -aaa +cuM aaa +aad aaa aaa +cuM +aad aaa aaa aaa @@ -185146,25 +183798,25 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -tGq -tGq -tGq -tGq -tGq -tGq -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aad +cuM +cuM +cuM +cuM +cuM +cuM +cJF +cuM +cuM +upk +cuM +cuM +cuM +cuM +cuM +cuM +aad +ajr aaa aaa aaa @@ -185403,24 +184055,24 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aad +aad +aad +aad +aad +aad +cuM +cLo +cMJ +cOe +xaf +cuM +aad +aad +aad +aad +aad +aad aaa aaa aaa @@ -185661,21 +184313,21 @@ aaa aaa aaa aaa +ajr +ajr aaa +ajr +aad +cJE +cLp +cMK +cOf +jDb +cJE +aad aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ajr +ajr aaa aaa aaa @@ -185923,12 +184575,12 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa +cuM +cLq +cML +cOg +joQ +cuM aaa aaa aaa @@ -186180,12 +184832,12 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa +cuM +cuM +cuM +cuM +cuM +cuM aaa aaa aaa @@ -186696,7 +185348,7 @@ aaa aaa aaa aaa -aab +aaa aaa aaa aaa @@ -189523,7 +188175,7 @@ aaa aaa aaa aaa -aaa +aab aaa aaa aaa diff --git a/_maps/map_files/Donutstation/Donutstation.dmm b/_maps/map_files/Donutstation/Donutstation.dmm deleted file mode 100644 index d459b5633ea93..0000000000000 --- a/_maps/map_files/Donutstation/Donutstation.dmm +++ /dev/null @@ -1,122860 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aaa" = ( -/turf/open/space/basic, -/area/space) -"aab" = ( -/turf/closed/wall, -/area/space/nearstation) -"aac" = ( -/obj/machinery/camera{ - c_tag = "Medical - Sleeper Bay"; - dir = 1; - network = list("ss13","Medical") - }, -/obj/machinery/sleeper{ - dir = 1; - icon_state = "sleeper" - }, -/turf/open/floor/plasteel, -/area/medical/sleeper) -"aad" = ( -/turf/closed/wall/r_wall, -/area/engine/engineering) -"aae" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aaf" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Gas to Cooling Loop" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"aag" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/fore) -"aah" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"aai" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Escape Left Wing 3"; - dir = 4; - network = list("ss13") - }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/exit/departure_lounge) -"aaj" = ( -/obj/effect/mapping_helpers/dead_body_placer, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"aak" = ( -/turf/closed/wall, -/area/medical/morgue) -"aal" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"aam" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Escape Right Wing 3"; - dir = 8; - network = list("ss13") - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/hallway/secondary/exit/departure_lounge) -"aan" = ( -/obj/machinery/sleeper{ - dir = 1; - icon_state = "sleeper" - }, -/turf/open/floor/plasteel, -/area/medical/sleeper) -"aao" = ( -/obj/structure/displaycase/captain{ - req_access = null; - req_access_txt = "20" - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain/private) -"aap" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"aaq" = ( -/turf/open/floor/engine{ - name = "Holodeck Projector Floor" - }, -/area/holodeck/rec_center) -"aar" = ( -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"aas" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/space/basic, -/area/space/nearstation) -"aat" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"aav" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"aax" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"aaz" = ( -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"aaA" = ( -/obj/structure/falsewall{ - name = "suspicious wall" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness/recreation) -"aaB" = ( -/obj/structure/window/reinforced, -/obj/item/target, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"aaC" = ( -/obj/structure/sign/warning/securearea{ - desc = "A warning sign which reads 'BOMB RANGE"; - name = "BOMB RANGE" - }, -/turf/closed/wall, -/area/space/nearstation) -"aaD" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) -"aaF" = ( -/obj/structure/chair, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"aaG" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"aaH" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"aaI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"aaJ" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted, -/obj/machinery/door/window/eastleft, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/fitness/recreation) -"aaK" = ( -/obj/structure/bodycontainer/morgue, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"aaL" = ( -/obj/machinery/power/tracker, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/airless/solarpanel, -/area/solar/starboard) -"aaM" = ( -/obj/structure/table, -/turf/open/floor/plating, -/area/construction) -"aaN" = ( -/turf/closed/wall/r_wall, -/area/tcommsat/computer) -"aaO" = ( -/obj/structure/bodycontainer/morgue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"aaP" = ( -/turf/closed/wall/r_wall, -/area/teleporter) -"aaQ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/medical/morgue) -"aaR" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/medical/morgue) -"aaS" = ( -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/solar/starboard) -"aaT" = ( -/turf/closed/wall, -/area/maintenance/fore) -"aaU" = ( -/obj/structure/table/wood/fancy, -/obj/item/soulstone/anybody/chaplain{ - pixel_y = 5 - }, -/obj/machinery/camera{ - c_tag = "Civilian - Chapel Cremator"; - dir = 2; - network = list("ss13") - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"aaV" = ( -/obj/structure/table/wood, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"aaW" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"aaX" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/tcommsat/computer) -"aaY" = ( -/turf/closed/wall/r_wall, -/area/storage/tech) -"aaZ" = ( -/turf/closed/wall, -/area/storage/tech) -"aba" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/cell_charger, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"abb" = ( -/obj/docking_port/stationary{ - dir = 1; - dwidth = 3; - height = 5; - id = "mining_home"; - name = "mining shuttle bay"; - roundstart_template = /datum/map_template/shuttle/mining/box; - width = 7 - }, -/turf/open/space/basic, -/area/space) -"abc" = ( -/obj/docking_port/stationary{ - dir = 2; - dwidth = 3; - height = 13; - id = "arrivals_stationary"; - name = "donut arrivals"; - roundstart_template = /datum/map_template/shuttle/arrival/donut; - width = 7 - }, -/turf/open/space/basic, -/area/space) -"abd" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"abe" = ( -/obj/docking_port/stationary{ - dir = 1; - dwidth = 5; - height = 7; - id = "supply_home"; - name = "Cargo Bay"; - width = 12 - }, -/turf/open/space/basic, -/area/space) -"abf" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/camera{ - c_tag = "Hallway - Escape Right Wing 2"; - dir = 8; - network = list("ss13") - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/hallway/secondary/exit/departure_lounge) -"abg" = ( -/obj/machinery/door/poddoor{ - id = "cargounload"; - name = "supply dock unloading door" - }, -/obj/machinery/conveyor{ - id = "cargoleft" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"abh" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/requests_console{ - department = "Mining"; - departmentType = 0; - pixel_y = 30 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"abi" = ( -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock"; - req_access_txt = "31" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"abj" = ( -/obj/machinery/door/poddoor{ - id = "cargoload"; - name = "supply dock loading door" - }, -/obj/machinery/conveyor{ - dir = 1; - id = "cargoright" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"abk" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/quartermaster/miningdock) -"abl" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/quartermaster/miningdock) -"abm" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"abn" = ( -/obj/machinery/door/airlock/external{ - name = "Mining Dock Airlock"; - req_access_txt = "48"; - shuttledocked = 1 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"abo" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"abp" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/chapel/office) -"abq" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"abr" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"abs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"abu" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating, -/area/construction) -"abv" = ( -/turf/closed/wall, -/area/security/detectives_office) -"abw" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plating, -/area/construction) -"abx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bed, -/obj/machinery/camera{ - c_tag = "Security - Cell 1"; - dir = 2; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aby" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"abz" = ( -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"abA" = ( -/turf/open/floor/carpet, -/area/security/detectives_office) -"abB" = ( -/obj/structure/table, -/obj/item/toy/eightball, -/turf/open/floor/plating, -/area/maintenance/starboard) -"abC" = ( -/obj/item/storage/secure/safe{ - pixel_x = 4; - pixel_y = 24 - }, -/turf/open/floor/carpet, -/area/security/detectives_office) -"abD" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"abE" = ( -/obj/effect/landmark/carpspawn, -/turf/open/space/basic, -/area/space) -"abF" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"abG" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -28 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"abH" = ( -/obj/machinery/door/airlock/engineering{ - name = "Construction Access"; - req_access_txt = "10" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"abI" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/quartermaster/miningdock) -"abJ" = ( -/obj/machinery/computer/med_data{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/security/detectives_office) -"abK" = ( -/obj/structure/table, -/obj/item/folder/yellow, -/obj/item/stamp, -/obj/item/stamp/denied{ - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"abL" = ( -/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/structure/table, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"abM" = ( -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/obj/machinery/status_display/supply{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"abN" = ( -/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/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"abO" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"abP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"abQ" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/techstorage/rnd, -/turf/open/floor/plating, -/area/storage/tech) -"abR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"abS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"abT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"abU" = ( -/obj/effect/landmark/start/shaft_miner, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"abV" = ( -/obj/structure/closet/wardrobe/miner, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"abW" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/techstorage/service, -/turf/open/floor/plating, -/area/storage/tech) -"abX" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Mining Maintenance"; - req_access_txt = "48" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"abY" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"abZ" = ( -/obj/machinery/computer/secure_data{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/security/detectives_office) -"aca" = ( -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"acb" = ( -/turf/closed/wall/r_wall, -/area/science/storage) -"acc" = ( -/turf/closed/wall, -/area/security/checkpoint) -"acd" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/science/storage) -"ace" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Cargo Bay Maintenance"; - req_access_txt = "31" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"acf" = ( -/turf/closed/wall, -/area/crew_quarters/fitness/recreation) -"acg" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/science/storage) -"ach" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/portable_atmospherics/canister/toxins, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/science/storage) -"aci" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/security/checkpoint) -"acj" = ( -/turf/closed/wall/r_wall, -/area/engine/atmos) -"ack" = ( -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/fitness/recreation) -"acm" = ( -/obj/machinery/door/poddoor/incinerator_toxmix, -/turf/open/floor/engine/vacuum, -/area/science/mixing) -"aco" = ( -/turf/closed/wall/r_wall, -/area/science/mixing) -"acp" = ( -/turf/closed/wall/r_wall, -/area/science/explab) -"acq" = ( -/turf/closed/wall, -/area/science/explab) -"acr" = ( -/turf/open/floor/engine/vacuum, -/area/science/mixing) -"acs" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/techstorage/tcomms, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plating, -/area/storage/tech) -"act" = ( -/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/central) -"acu" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/techstorage/security, -/turf/open/floor/plating, -/area/storage/tech) -"acv" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrous_output{ - dir = 8 - }, -/turf/open/floor/engine/n2o{ - initial_gas_mix = "n2o=1000;TEMP=293.15" - }, -/area/engine/atmos) -"acw" = ( -/turf/open/floor/engine, -/area/science/explab) -"acx" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"acy" = ( -/turf/closed/wall/r_wall, -/area/science/lab) -"acz" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/checkpoint) -"acA" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/science/storage) -"acB" = ( -/turf/closed/wall, -/area/maintenance/port) -"acC" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/machinery/sparker/toxmix{ - pixel_y = -20 - }, -/turf/open/floor/engine/vacuum, -/area/science/mixing) -"acE" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input, -/obj/machinery/sparker/toxmix{ - pixel_y = -20 - }, -/turf/open/floor/engine/vacuum, -/area/science/mixing) -"acF" = ( -/turf/open/floor/engine/airless, -/area/engine/atmos) -"acG" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/chair/stool, -/turf/open/floor/plasteel/chapel{ - dir = 4 - }, -/area/chapel/main) -"acH" = ( -/obj/machinery/nanite_program_hub, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/lab) -"acI" = ( -/obj/machinery/computer/nanite_cloud_controller, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, -/area/science/lab) -"acJ" = ( -/obj/machinery/nanite_programmer, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, -/area/science/lab) -"acK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/lab) -"acL" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"acN" = ( -/obj/structure/table, -/obj/item/hand_labeler, -/obj/item/gun/syringe, -/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/machinery/camera{ - c_tag = "Medical - Storage"; - dir = 2; - network = list("ss13","Medical") - }, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"acO" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"acP" = ( -/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/primary/central) -"acQ" = ( -/turf/closed/wall/r_wall, -/area/crew_quarters/heads/hos) -"acS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/storage) -"acT" = ( -/turf/open/floor/engine/n2o{ - initial_gas_mix = "n2o=1000;TEMP=293.15" - }, -/area/engine/atmos) -"acU" = ( -/obj/structure/bookcase, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/security/prison) -"acV" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/rnd/production/techfab/department/cargo, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"acW" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plasteel/dark, -/area/science/lab) -"acX" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/science/storage) -"acY" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/closed/wall/r_wall, -/area/science/mixing) -"acZ" = ( -/turf/closed/wall, -/area/lawoffice) -"ada" = ( -/obj/machinery/door/airlock/research/glass/incinerator/toxmix_exterior, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/engine, -/area/science/mixing) -"adb" = ( -/turf/open/floor/plasteel/white, -/area/science/lab) -"adc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/science/lab) -"add" = ( -/obj/machinery/computer/nanite_cloud_controller, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/dark, -/area/science/lab) -"ade" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/brig{ - id = "Cell 2"; - name = "Cell 2 Locker" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"adf" = ( -/obj/machinery/computer/nanite_chamber_control{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/dark, -/area/science/lab) -"adg" = ( -/obj/machinery/portable_atmospherics/scrubber/huge, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/science/storage) -"adh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/storage) -"adi" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/portable_atmospherics/canister/toxins, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/storage) -"adj" = ( -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/science/storage) -"adk" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/science/explab) -"adl" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/science/explab) -"adm" = ( -/obj/machinery/light_switch{ - pixel_x = 8; - pixel_y = -24 - }, -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/effect/landmark/start/scientist, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/science/lab) -"adn" = ( -/obj/structure/chair/stool, -/turf/open/floor/carpet, -/area/chapel/main) -"ado" = ( -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/dark, -/area/science/lab) -"adp" = ( -/obj/machinery/nanite_program_hub, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/lab) -"adq" = ( -/obj/structure/closet/firecloset, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/turf/open/floor/plating, -/area/construction) -"adr" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"adu" = ( -/obj/structure/table/wood, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main) -"adv" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Arrival Wing 1"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"adw" = ( -/obj/structure/table/glass, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/micro_laser, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stack/cable_coil, -/turf/open/floor/plasteel/white, -/area/science/lab) -"adx" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/computer/camera_advanced/base_construction{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"ady" = ( -/obj/structure/sign/poster/official/science{ - pixel_y = 32 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"adz" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"adA" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/holopad, -/turf/open/floor/carpet, -/area/chapel/main) -"adB" = ( -/obj/structure/chair, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"adC" = ( -/obj/structure/table/wood, -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/chapel/main) -"adD" = ( -/obj/machinery/door/airlock/research/glass/incinerator/toxmix_interior, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/engine, -/area/science/mixing) -"adE" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters{ - id = "cargowarehouse" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"adF" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/space/basic, -/area/space/nearstation) -"adG" = ( -/obj/structure/closet/radiation, -/turf/open/floor/plasteel/white/corner{ - dir = 8 - }, -/area/science/explab) -"adH" = ( -/obj/machinery/computer/rdconsole/experiment, -/turf/open/floor/plasteel/white/corner, -/area/science/explab) -"adI" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/prison) -"adJ" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/experimentor, -/turf/open/floor/plasteel/white/corner{ - dir = 8 - }, -/area/science/explab) -"adK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/science/storage) -"adL" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"adN" = ( -/turf/open/floor/plasteel/white, -/area/science/mixing) -"adO" = ( -/turf/closed/wall, -/area/crew_quarters/fitness) -"adQ" = ( -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"adR" = ( -/obj/machinery/button/massdriver{ - id = "chapelgun"; - pixel_x = 8; - pixel_y = 24 - }, -/obj/structure/table/wood, -/obj/structure/sign/plaques/kiddie/badger{ - pixel_x = -32 - }, -/obj/item/reagent_containers/food/snacks/grown/poppy, -/obj/item/reagent_containers/food/snacks/grown/poppy{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/reagent_containers/food/snacks/grown/poppy{ - pixel_x = -1; - pixel_y = 3 - }, -/obj/machinery/camera{ - c_tag = "Civilian - Chapel Mass Driver"; - dir = 2; - network = list("ss13") - }, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"adS" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Civilian - Chapel Airlock"; - dir = 2; - network = list("ss13") - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"adT" = ( -/obj/machinery/atmospherics/components/binary/pump/on, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/mixing) -"adU" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix{ - dir = 8 - }, -/turf/open/floor/engine, -/area/science/mixing) -"adV" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1 - }, -/obj/machinery/airlock_sensor/incinerator_toxmix{ - pixel_x = 28 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/mixing) -"adW" = ( -/turf/open/floor/plasteel/white, -/area/science/explab) -"adX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/button/door{ - id = "miningwarehouse"; - name = "warehouse shutter controls"; - pixel_x = -8; - pixel_y = 24; - req_access_txt = "50" - }, -/obj/machinery/light_switch{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"adY" = ( -/turf/closed/wall/r_wall, -/area/security/main) -"adZ" = ( -/obj/machinery/disposal/bin, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"aea" = ( -/turf/closed/wall/r_wall, -/area/crew_quarters/heads/captain/private) -"aeb" = ( -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"aec" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"aed" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"aee" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"aef" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"aeg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"aeh" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/space/basic, -/area/space/nearstation) -"aei" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"aej" = ( -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"aek" = ( -/turf/closed/wall, -/area/science/lab) -"ael" = ( -/obj/machinery/holopad, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"aem" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/security/main) -"aen" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white, -/area/science/explab) -"aeo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aep" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) -"aeq" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "researchprivate"; - name = "research privacy shutters" - }, -/turf/open/floor/plating, -/area/science/lab) -"aer" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/bridge) -"aes" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"aet" = ( -/obj/structure/chair, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"aeu" = ( -/turf/closed/wall, -/area/vacant_room/commissary) -"aev" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/science/mixing) -"aew" = ( -/turf/closed/wall/r_wall, -/area/science/server) -"aey" = ( -/obj/structure/chair/stool, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main) -"aez" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel, -/area/science/storage) -"aeA" = ( -/turf/closed/wall, -/area/science/research) -"aeB" = ( -/turf/open/floor/plasteel/white/side{ - dir = 10 - }, -/area/science/research) -"aeC" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"aeD" = ( -/obj/machinery/rnd/production/protolathe/department/science, -/turf/open/floor/plasteel, -/area/science/lab) -"aeE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"aeF" = ( -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain/private) -"aeG" = ( -/obj/structure/filingcabinet/employment, -/turf/open/floor/wood, -/area/lawoffice) -"aeH" = ( -/turf/open/floor/plating/airless, -/area/space/nearstation) -"aeI" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1; - name = "Connector Port (Air Supply)" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/science/mixing) -"aeJ" = ( -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/aisat/service) -"aeK" = ( -/obj/machinery/camera{ - c_tag = "Civilian - Chapel Main 2"; - dir = 2; - network = list("ss13") - }, -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/chapel/main) -"aeL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aeM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"aeN" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aeO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"aeP" = ( -/obj/machinery/rnd/server, -/turf/open/floor/circuit/telecomms/server, -/area/science/server) -"aeQ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/security/checkpoint) -"aeR" = ( -/obj/machinery/vending/wardrobe/law_wardrobe, -/turf/open/floor/wood, -/area/lawoffice) -"aeS" = ( -/turf/closed/wall, -/area/maintenance/port/fore) -"aeT" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"aeU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aeV" = ( -/obj/machinery/air_sensor/atmos/nitrous_tank, -/turf/open/floor/engine/n2o{ - initial_gas_mix = "n2o=1000;TEMP=293.15" - }, -/area/engine/atmos) -"aeW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/wallframe/camera, -/obj/item/assembly/prox_sensor{ - pixel_x = -8; - pixel_y = 4 - }, -/obj/item/wallframe/camera, -/turf/open/floor/plasteel, -/area/construction) -"aeX" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 12; - height = 18; - id = "emergency_home"; - name = "Donutstation emergency evac bay"; - width = 32 - }, -/turf/open/space/basic, -/area/space) -"aeY" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/techstorage/engineering, -/turf/open/floor/plating, -/area/storage/tech) -"afa" = ( -/turf/closed/wall, -/area/hydroponics) -"afb" = ( -/obj/machinery/vending/assist, -/turf/open/floor/plating, -/area/storage/tech) -"afc" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/aft) -"afd" = ( -/obj/machinery/teleport/hub, -/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/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"afe" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"aff" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"afg" = ( -/obj/machinery/shieldwallgen, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"afh" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/bluespace_beacon, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"afi" = ( -/obj/machinery/shieldwallgen, -/obj/structure/window/reinforced, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"afj" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/exit/departure_lounge) -"afk" = ( -/obj/structure/table, -/obj/item/aicard, -/turf/open/floor/plating, -/area/storage/tech) -"afl" = ( -/obj/structure/rack, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"afm" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 28 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"afn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/punching_bag, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"afo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/research) -"afp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/closet/firecloset, -/obj/machinery/light/small, -/obj/machinery/camera{ - c_tag = "Research - Entrance Airlock"; - dir = 1; - network = list("ss13","Research") - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"afq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"afr" = ( -/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/tile/neutral, -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/machinery/door/window/eastleft, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"afs" = ( -/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/tile/neutral, -/obj/structure/closet/secure_closet/personal, -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"aft" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"afu" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"afv" = ( -/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/tile/neutral, -/obj/structure/closet/secure_closet/personal, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"afw" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate/hydroponics, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"afy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"afz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"afA" = ( -/obj/machinery/camera/motion{ - c_tag = "Secure - AI Upload External"; - dir = 4; - network = list("AISat") - }, -/turf/open/space/basic, -/area/space/nearstation) -"afB" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"afC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"afD" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"afE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"afF" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"afG" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/landmark/start/assistant, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"afH" = ( -/obj/machinery/vending/wardrobe/sec_wardrobe, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"afI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8; - external_pressure_bound = 140; - name = "server vent"; - pressure_checks = 0 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/circuit/telecomms/server, -/area/science/server) -"afJ" = ( -/turf/closed/wall, -/area/crew_quarters/heads/hor) -"afK" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/explab) -"afL" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"afM" = ( -/turf/open/floor/plating, -/area/science/research) -"afN" = ( -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/research) -"afO" = ( -/turf/open/floor/plasteel/white, -/area/science/research) -"afP" = ( -/obj/machinery/door/poddoor{ - id = "chapelgun"; - name = "Chapel Launcher Door" - }, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/chapel/office) -"afQ" = ( -/turf/closed/wall/r_wall, -/area/solar/starboard) -"afR" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/chapel/office) -"afS" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/shutters{ - id = "miningwarehouse" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"afU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"afV" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/shutters{ - id = "cargowarehouse" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"afW" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate/internals, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"afX" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"afY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/chapel/office) -"afZ" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/hallway/secondary/exit/departure_lounge) -"aga" = ( -/obj/structure/closet/secure_closet/miner, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"agb" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/starboard) -"agc" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"agd" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/maintenance/starboard) -"age" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"agf" = ( -/obj/machinery/computer/security, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/noticeboard{ - pixel_y = 28 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"agg" = ( -/obj/structure/closet, -/turf/open/floor/plating, -/area/maintenance/starboard) -"agh" = ( -/turf/closed/wall, -/area/chapel/office) -"agi" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/structure/sign/warning/biohazard{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"agj" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"agk" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"agl" = ( -/turf/closed/wall/r_wall, -/area/security/detectives_office) -"agm" = ( -/obj/machinery/computer/security, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"agn" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Public Garden" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hydroponics/garden) -"ago" = ( -/obj/machinery/computer/card, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"agp" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"agq" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/chapel/office) -"agr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"ags" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/chapel/office) -"agt" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"agu" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/hallway/secondary/exit/departure_lounge) -"agv" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"agw" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/quartermaster/miningdock) -"agx" = ( -/obj/machinery/mass_driver{ - dir = 1; - id = "chapelgun"; - name = "Holy Driver" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/window/southleft{ - name = "Mass Driver"; - req_access_txt = "22" - }, -/turf/open/floor/plating, -/area/chapel/office) -"agy" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/chapel/office) -"agz" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/exit/departure_lounge) -"agA" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"agB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"agC" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Server Room"; - req_access_txt = "30" - }, -/obj/machinery/atmospherics/pipe/simple, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, -/area/science/server) -"agD" = ( -/obj/structure/rack, -/obj/item/circuitboard/aicore{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/heads/hor) -"agE" = ( -/obj/machinery/status_display/ai{ - pixel_y = 32 - }, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/heads/hor) -"agF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/noticeboard{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/heads/hor) -"agG" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "miningwarehouse"; - name = "warehouse shutter controls"; - pixel_x = -8; - pixel_y = -24; - req_access_txt = "50" - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"agH" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "rnd2"; - name = "research lab shutters" - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"agI" = ( -/obj/structure/filingcabinet/chestdrawer, -/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 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"agJ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/crew_quarters/heads/hor) -"agK" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"agL" = ( -/turf/closed/indestructible{ - desc = "A wall impregnated with Fixium, able to withstand massive explosions with ease"; - icon_state = "riveted"; - name = "hyper-reinforced wall" - }, -/area/space/nearstation) -"agM" = ( -/obj/item/target/alien/anchored, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/camera/preset/toxins{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"agN" = ( -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/science/research) -"agO" = ( -/obj/item/toy/figure/scientist, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"agP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"agQ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/chapel/office) -"agR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"agS" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"agT" = ( -/obj/machinery/computer/secure_data, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"agU" = ( -/turf/closed/wall/r_wall, -/area/science/research) -"agV" = ( -/obj/structure/sink{ - pixel_y = 28 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"agW" = ( -/obj/machinery/shower{ - pixel_y = 28 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"agX" = ( -/obj/structure/sink{ - pixel_y = 28 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"agY" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/item/storage/toolbox/mechanical, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/bridge) -"agZ" = ( -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"aha" = ( -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"ahc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"ahd" = ( -/obj/machinery/power/smes, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/camera{ - c_tag = "Engineering - Starboard Aux Solars Access"; - dir = 2; - network = list("ss13","Engineering") - }, -/turf/open/floor/plating, -/area/solar/starboard) -"ahe" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"ahf" = ( -/obj/machinery/door/airlock/command{ - name = "Captain's Quarters"; - req_access_txt = "20"; - security_level = 6 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/captain/private) -"ahg" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"ahh" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"ahi" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/brig) -"ahj" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - name = "output gas connector port" - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"ahk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"ahl" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/turf/open/floor/plasteel/dark, -/area/science/server) -"ahn" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/effect/landmark/blobstart, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/fitness/recreation) -"aho" = ( -/obj/machinery/holopad, -/turf/open/floor/plasteel/white, -/area/crew_quarters/heads/hor) -"ahp" = ( -/obj/structure/displaycase/labcage, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/heads/hor) -"ahq" = ( -/obj/machinery/button/crematorium{ - id = "crematoriumChapel"; - pixel_y = 25 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"ahr" = ( -/obj/machinery/computer/robotics{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"ahs" = ( -/obj/structure/plasticflaps, -/obj/machinery/conveyor{ - id = "cargoleft" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"aht" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/crew_quarters/heads/hor) -"ahu" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"ahv" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel, -/area/storage/tools) -"ahw" = ( -/obj/machinery/computer/prisoner/management, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"ahx" = ( -/obj/machinery/holopad, -/turf/open/floor/carpet, -/area/bridge) -"ahy" = ( -/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/dark, -/area/bridge) -"ahz" = ( -/turf/open/floor/plasteel/dark, -/area/bridge) -"ahA" = ( -/obj/structure/bodycontainer/crematorium{ - id = "crematoriumChapel" - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"ahB" = ( -/obj/structure/table/wood, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/obj/item/storage/lockbox/medal, -/obj/item/hand_tele, -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain/private) -"ahC" = ( -/obj/machinery/computer/security/mining, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"ahE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel, -/area/bridge) -"ahF" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/science/mixing) -"ahG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/caution/stand_clear, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"ahH" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/hallway/secondary/exit/departure_lounge) -"ahI" = ( -/obj/structure/rack, -/obj/item/taperecorder{ - pixel_x = -3 - }, -/obj/item/paicard{ - pixel_x = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/heads/hor) -"ahJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/heads/hor) -"ahK" = ( -/obj/machinery/modular_computer/console/preset/research{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/heads/hor) -"ahL" = ( -/obj/machinery/computer/mecha{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"ahM" = ( -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"ahN" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/crew_quarters/heads/hor) -"ahO" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"ahP" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/space/basic, -/area/space/nearstation) -"ahQ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/security/brig) -"ahR" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ahS" = ( -/obj/item/target, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"ahT" = ( -/turf/closed/wall, -/area/crew_quarters/bar) -"ahU" = ( -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/research) -"ahV" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ahW" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/girder, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/fore) -"ahX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"ahY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/storage/tools) -"aia" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/quartermaster/storage) -"aib" = ( -/obj/structure/plasticflaps, -/obj/machinery/conveyor{ - dir = 1; - id = "cargoright" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"aic" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/computer/atmos_alert{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"aid" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain/private) -"aie" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/quartermaster/miningdock) -"aif" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"aig" = ( -/obj/machinery/computer/rdservercontrol{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/server) -"aih" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aii" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "Biohazard"; - name = "biohazard containment door" - }, -/turf/open/floor/plasteel, -/area/science/research) -"aij" = ( -/turf/closed/wall/r_wall, -/area/security/prison) -"aik" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"ail" = ( -/turf/closed/wall, -/area/security/checkpoint/science) -"aim" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"ain" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/stack/ore/silver, -/obj/item/stack/ore/silver, -/obj/item/stack/ore/iron, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"aio" = ( -/obj/machinery/vending/security, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aip" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/research) -"aiq" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "sciencecheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/science) -"air" = ( -/obj/machinery/door/airlock/security{ - name = "Security Checkpoint"; - req_access_txt = "1" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/science) -"ais" = ( -/obj/machinery/vending/sustenance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/security/prison) -"ait" = ( -/turf/closed/wall, -/area/science/robotics/lab) -"aiv" = ( -/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/tile/neutral, -/obj/structure/sign/poster/official/no_erp{ - pixel_y = 32 - }, -/obj/machinery/door/window/westright, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"aiw" = ( -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"aix" = ( -/turf/closed/wall/r_wall, -/area/science/robotics/lab) -"aiy" = ( -/obj/machinery/computer/arcade, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/security/prison) -"aiz" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/turf/open/floor/plating, -/area/security/prison) -"aiA" = ( -/obj/structure/table, -/obj/item/restraints/handcuffs, -/obj/item/restraints/handcuffs{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aiB" = ( -/turf/open/floor/plasteel, -/area/security/prison) -"aiC" = ( -/obj/structure/closet/crate, -/obj/item/toy/figure/miner, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"aiD" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/quartermaster/miningdock) -"aiE" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"aiF" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/quartermaster/storage) -"aiG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/quartermaster/storage) -"aiH" = ( -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock"; - req_access_txt = "31" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aiI" = ( -/turf/closed/wall, -/area/quartermaster/storage) -"aiJ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/quartermaster/storage) -"aiK" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"aiL" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/quartermaster/miningdock) -"aiM" = ( -/obj/machinery/light/small, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"aiN" = ( -/turf/closed/wall, -/area/security/prison) -"aiO" = ( -/turf/closed/wall/r_wall, -/area/crew_quarters/heads/hop) -"aiP" = ( -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"aiQ" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"aiR" = ( -/obj/structure/table, -/obj/item/hand_tele, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"aiS" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "cargoleft" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"aiT" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/bridge) -"aiU" = ( -/obj/machinery/conveyor{ - dir = 10; - id = "cargoleft" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"aiV" = ( -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai_upload) -"aiW" = ( -/turf/open/floor/carpet, -/area/bridge) -"aiX" = ( -/obj/machinery/computer/station_alert{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel/dark, -/area/bridge) -"aiY" = ( -/obj/machinery/rnd/production/circuit_imprinter/department/science, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/lab) -"aiZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall/r_wall, -/area/science/mixing) -"aja" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -28 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"ajb" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"ajc" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"ajd" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/science/server) -"aje" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/obj/item/folder/white, -/obj/item/stamp/rd{ - pixel_x = 3; - pixel_y = -2 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"ajf" = ( -/obj/structure/table, -/obj/item/cartridge/signal/toxins, -/obj/item/cartridge/signal/toxins{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/cartridge/signal/toxins{ - pixel_x = 4; - pixel_y = 6 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"ajg" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"ajh" = ( -/obj/machinery/computer/card/minor/rd{ - dir = 1 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"aji" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"ajj" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"ajk" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "sciencecheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/science) -"ajl" = ( -/obj/machinery/rnd/destructive_analyzer, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/science/lab) -"ajm" = ( -/obj/machinery/requests_console{ - department = "Science"; - departmentType = 2; - name = "Science Requests Console"; - pixel_y = 30; - receive_ore_updates = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"ajo" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/science/research) -"ajp" = ( -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"ajq" = ( -/obj/machinery/mecha_part_fabricator, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"ajr" = ( -/obj/structure/table, -/obj/item/storage/belt/utility, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass{ - amount = 20; - pixel_x = -3; - pixel_y = 6 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"ajs" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/item/clothing/glasses/welding, -/obj/item/multitool{ - pixel_x = 3 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"ajt" = ( -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"aju" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel/white, -/area/science/research) -"ajv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/closet/emcloset, -/obj/machinery/light/small, -/turf/open/floor/plasteel/white, -/area/science/research) -"ajx" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/hop) -"ajy" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/crew_quarters/heads/hop) -"ajA" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/security/prison) -"ajB" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/security/prison) -"ajC" = ( -/obj/docking_port/stationary{ - dir = 2; - dwidth = 2; - height = 5; - id = "laborcamp_home"; - name = "fore bay 1"; - roundstart_template = /datum/map_template/shuttle/labour/box; - width = 9 - }, -/turf/open/space/basic, -/area/space) -"ajD" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/security/prison) -"ajE" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/main) -"ajF" = ( -/obj/structure/table, -/obj/machinery/computer/libraryconsole/bookmanagement, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/security/prison) -"ajG" = ( -/turf/open/floor/plating, -/area/security/prison) -"ajH" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/tcommsat/computer) -"ajI" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/bridge) -"ajJ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/bridge) -"ajK" = ( -/obj/structure/table, -/turf/open/floor/carpet, -/area/bridge) -"ajL" = ( -/obj/machinery/computer/monitor{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel/dark, -/area/bridge) -"ajM" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/science/research) -"ajN" = ( -/obj/machinery/mass_driver{ - dir = 8; - id = "toxinsdriver" - }, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/science/research) -"ajO" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/research) -"ajP" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"ajQ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/security/brig) -"ajR" = ( -/obj/structure/chair/stool, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/security/prison) -"ajS" = ( -/obj/machinery/hydroponics/soil, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/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/security/prison) -"ajT" = ( -/turf/closed/wall, -/area/crew_quarters/heads/hos) -"ajV" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/mixing) -"ajW" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"ajX" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/dirt, -/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 - }, -/obj/machinery/camera{ - c_tag = "Security Perma - Cell 3"; - dir = 4; - network = list("ss13","Security","Prison") - }, -/turf/open/floor/plasteel, -/area/security/prison) -"ajY" = ( -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/security/prison) -"ajZ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"aka" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "AI Upload Access"; - req_access_txt = "16"; - security_level = 6 - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/ai_upload) -"akb" = ( -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"akc" = ( -/obj/structure/table, -/obj/item/clothing/suit/straight_jacket, -/obj/item/clothing/suit/straight_jacket, -/obj/item/clothing/suit/straight_jacket, -/obj/item/clothing/mask/muzzle, -/obj/item/clothing/mask/muzzle, -/obj/item/clothing/mask/muzzle, -/turf/open/floor/plasteel, -/area/security/prison) -"akd" = ( -/obj/structure/table, -/obj/item/aiModule/reset, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai_upload) -"ake" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"akg" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/security/prison) -"akh" = ( -/obj/machinery/hydroponics/soil, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/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, -/area/security/prison) -"aki" = ( -/obj/structure/table, -/obj/item/electropack, -/obj/item/assembly/signaler, -/turf/open/floor/plasteel, -/area/security/prison) -"akj" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/preopen{ - id = "brigexternalblast"; - name = "External Security Blast Door" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/brig) -"akk" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/poddoor/preopen{ - id = "brigexternalblastentry"; - name = "External Security Entry Blast Door" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"akl" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"akm" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ako" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/closet/athletic_mixed, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"akp" = ( -/turf/open/floor/plasteel, -/area/hydroponics) -"akr" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aks" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"akt" = ( -/turf/open/floor/plasteel, -/area/security/brig) -"aku" = ( -/obj/structure/closet/secure_closet/hydroponics, -/turf/open/floor/plasteel, -/area/hydroponics) -"akv" = ( -/obj/machinery/vending/wardrobe/hydro_wardrobe, -/turf/open/floor/plasteel, -/area/hydroponics) -"akw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"akx" = ( -/obj/machinery/vending/hydroseeds{ - slogan_delay = 700 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"aky" = ( -/obj/machinery/power/tracker, -/obj/structure/cable, -/turf/open/floor/plasteel/airless/solarpanel, -/area/solar/aft) -"akA" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/door/poddoor/preopen{ - id = "Biohazard"; - name = "biohazard containment door" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/research) -"akC" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"akD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 4; - name = "sorting disposal pipe (Bar)"; - sortType = 19 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"akE" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/turf/closed/wall, -/area/crew_quarters/bar) -"akF" = ( -/turf/closed/wall/r_wall, -/area/security/warden) -"akG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/crew_quarters/bar) -"akH" = ( -/obj/structure/closet/secure_closet/bar{ - req_access_txt = "25" - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"akI" = ( -/obj/item/twohanded/required/kirbyplants/dead, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"akJ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "sciencecheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/science) -"akK" = ( -/obj/structure/closet/crate{ - name = "Practice Rifles" - }, -/obj/item/gun/energy/laser/practice, -/obj/item/gun/energy/laser/practice, -/obj/item/gun/energy/laser/practice, -/obj/item/gun/energy/laser/practice, -/turf/open/floor/plating, -/area/maintenance/department/security) -"akL" = ( -/obj/machinery/reagentgrinder, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"akM" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/rack, -/obj/item/clothing/gloves/boxing, -/obj/item/clothing/mask/luchador/rudos, -/obj/item/clothing/gloves/boxing/yellow, -/obj/item/clothing/mask/luchador/tecnicos, -/obj/item/clothing/gloves/boxing/green, -/obj/item/clothing/mask/luchador, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"akN" = ( -/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 - }, -/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) -"akO" = ( -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"akP" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"akQ" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas/sechailer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/mask/gas/sechailer, -/obj/item/clothing/mask/gas/sechailer{ - pixel_x = 3; - pixel_y = -3 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"akR" = ( -/turf/open/floor/wood, -/area/crew_quarters/bar) -"akS" = ( -/obj/machinery/door/airlock{ - name = "Bar Storage"; - req_access_txt = "25" - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"akT" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/sign/plaques/deempisi{ - pixel_y = 24 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"akU" = ( -/obj/machinery/biogenerator, -/turf/open/floor/plasteel, -/area/hydroponics) -"akV" = ( -/obj/machinery/computer/rdconsole/core{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/lab) -"akW" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/chair/stool/bar, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"akX" = ( -/obj/machinery/computer/prisoner/management{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"akY" = ( -/obj/structure/sign/departments/holy{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"akZ" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/prison) -"ala" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Bar Maintenance"; - req_access_txt = "25" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"alb" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/table/reinforced, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"alc" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"ale" = ( -/obj/machinery/seed_extractor, -/turf/open/floor/plasteel, -/area/hydroponics) -"alg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"alj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"alk" = ( -/turf/closed/wall, -/area/storage/tools) -"all" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/chair, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"aln" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/security/brig) -"alo" = ( -/obj/machinery/vending/boozeomat, -/turf/closed/wall, -/area/crew_quarters/bar) -"alp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"alq" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/table, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 3 - }, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"als" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"alu" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/computer/arcade, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"alv" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"alw" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Civilian - Dorm Fitness 2"; - dir = 2; - network = list("ss13") - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"alx" = ( -/mob/living/simple_animal/pet/dog/bullterrier/walter, -/obj/structure/bed/dogbed/walter, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"alA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"alC" = ( -/obj/machinery/teleport/station, -/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/light{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Secure - Teleporter"; - network = list("ss13","Secure") - }, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"alD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"alE" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "robo1" - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"alF" = ( -/turf/closed/wall, -/area/crew_quarters/kitchen) -"alG" = ( -/obj/structure/table, -/obj/item/storage/box/chemimp{ - pixel_x = 6 - }, -/obj/item/storage/box/trackimp{ - pixel_x = -3 - }, -/obj/item/storage/lockbox/loyalty, -/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/light{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) -"alH" = ( -/obj/machinery/door/airlock/security/glass{ - name = "N2O Storage"; - req_access_txt = "2" - }, -/turf/open/floor/plating, -/area/security/prison) -"alI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"alJ" = ( -/obj/structure/table/wood, -/obj/effect/landmark/event_spawn, -/obj/item/toy/figure/detective, -/turf/open/floor/carpet, -/area/security/detectives_office) -"alN" = ( -/obj/structure/lattice, -/obj/machinery/camera/autoname{ - dir = 1 - }, -/turf/open/space/basic, -/area/space/nearstation) -"alO" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/computer/cargo, -/obj/machinery/button/door{ - dir = 2; - id = "cargoload"; - layer = 4; - name = "Loading Doors"; - pixel_x = 8; - pixel_y = 24 - }, -/obj/machinery/button/door{ - id = "cargounload"; - layer = 4; - name = "Loading Doors"; - pixel_x = -8; - pixel_y = 24 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"alP" = ( -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai_upload) -"alV" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/crew_quarters/kitchen) -"alW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 4; - name = "sorting disposal pipe (Kitchen)"; - sortType = 20 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"alX" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - dir = 4; - freq = 1400; - location = "Bar"; - name = "navigation beacon (Bar Delivery)" - }, -/obj/structure/plasticflaps/opaque, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/medical/medbay/central) -"alY" = ( -/obj/structure/plasticflaps/opaque, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - dir = 4; - freq = 1400; - location = "Bar"; - name = "navigation beacon (Bar Delivery)" - }, -/turf/open/floor/plating, -/area/crew_quarters/bar) -"alZ" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"ama" = ( -/obj/machinery/vending/wardrobe/bar_wardrobe, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"amb" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"amc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/conveyor{ - dir = 4; - id = "robo1" - }, -/turf/open/floor/plating, -/area/science/robotics/lab) -"amd" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/obj/effect/landmark/start/detective, -/turf/open/floor/carpet, -/area/security/detectives_office) -"ame" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "roboticsprivacy"; - name = "robotics privacy shutters" - }, -/turf/open/floor/plating, -/area/science/robotics/lab) -"amf" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/crew_quarters/heads/hop) -"amg" = ( -/obj/machinery/pdapainter, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"amh" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"ami" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"amk" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/science/research) -"aml" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/science/research) -"amm" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/research) -"amn" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "sciencecheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/science) -"amo" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"amp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"amq" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-22" - }, -/turf/open/floor/wood, -/area/library) -"amr" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/table/reinforced, -/obj/item/lighter, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"amu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"amv" = ( -/obj/machinery/vending/hydronutrients, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"amx" = ( -/turf/open/floor/plating, -/area/engine/engineering) -"amA" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"amB" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"amD" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"amE" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"amF" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Service Door"; - req_one_access_txt = "35;28" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"amG" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"amH" = ( -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"amK" = ( -/obj/machinery/door/airlock{ - name = "Mass Driver"; - req_access_txt = "27" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"amL" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"amM" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"amO" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/space/basic, -/area/space/nearstation) -"amP" = ( -/turf/closed/wall/r_wall, -/area/crew_quarters/kitchen) -"amS" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"amT" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/camera{ - c_tag = "Service - Bar Main 1"; - dir = 4; - network = list("ss13","Bar Area") - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"amU" = ( -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"amV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/item/radio/intercom{ - dir = 2; - pixel_y = -28 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"amW" = ( -/obj/machinery/door/poddoor/preopen{ - id = "telelab"; - name = "test chamber blast door" - }, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/engine, -/area/science/explab) -"amX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"amY" = ( -/obj/machinery/holopad, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"amZ" = ( -/obj/structure/table/glass, -/obj/item/multitool{ - pixel_x = 3 - }, -/obj/item/multitool{ - pixel_x = 1; - pixel_y = -2 - }, -/obj/item/screwdriver, -/obj/item/screwdriver{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/machinery/requests_console{ - department = "Science"; - departmentType = 2; - name = "Science Requests Console"; - pixel_y = 30; - receive_ore_updates = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"ana" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/crew_quarters/heads/hop) -"anb" = ( -/obj/structure/closet/crate, -/turf/open/floor/plating, -/area/maintenance/starboard) -"anc" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/storage/tools) -"and" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"ane" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/bridge) -"anf" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"ang" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/camera{ - c_tag = "Bridge - Captain's Private Quarters"; - dir = 2 - }, -/obj/structure/sign/plaques/golden/captain{ - pixel_y = 32 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain/private) -"anh" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/research) -"ani" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"anj" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"ank" = ( -/obj/structure/table, -/obj/item/paicard, -/obj/item/coin/silver, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"anl" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/landmark/start/head_of_personnel, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"anm" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Primary Tool Storage" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/storage/tools) -"ann" = ( -/obj/machinery/computer/communications{ - dir = 8 - }, -/obj/item/storage/secure/safe{ - pixel_x = 35; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"ano" = ( -/turf/closed/wall/r_wall, -/area/science/xenobiology) -"anp" = ( -/turf/open/floor/plasteel/white/side{ - dir = 5 - }, -/area/science/research) -"anq" = ( -/obj/machinery/camera{ - c_tag = "Research - Experimentor Bay"; - dir = 2; - network = list("ss13","Research") - }, -/turf/open/floor/engine, -/area/science/explab) -"anr" = ( -/obj/structure/table, -/obj/item/hemostat, -/obj/item/cautery{ - pixel_x = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"ans" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ant" = ( -/obj/structure/table, -/obj/item/retractor, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"anu" = ( -/obj/structure/table, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/item/mmi, -/obj/item/mmi, -/obj/item/mmi, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"anv" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"anx" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/fore) -"anz" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/space/basic, -/area/space/nearstation) -"anB" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/space/basic, -/area/space/nearstation) -"anC" = ( -/obj/machinery/power/apc{ - areastring = "/area/medical/genetics"; - dir = 4; - name = "Genetics APC"; - pixel_x = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"anD" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/space/nearstation) -"anG" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Engineering Maintenance Access"; - req_access_txt = "10" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) -"anH" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"anJ" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchenshutter"; - name = "privacy shutters" - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"anK" = ( -/obj/machinery/door/airlock{ - name = "Chaplain's Office"; - req_access_txt = "27" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"anL" = ( -/obj/machinery/deepfryer, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"anM" = ( -/obj/machinery/atmospherics/miner/n2o{ - max_ext_kpa = 2500 - }, -/turf/open/floor/engine/n2o{ - initial_gas_mix = "n2o=1000;TEMP=293.15" - }, -/area/engine/atmos) -"anQ" = ( -/obj/structure/sign/warning/docking{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"anR" = ( -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai_upload) -"anS" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai_upload) -"anT" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/techstorage/medical, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Secure - Tech Storage"; - network = list("ss13","Secure") - }, -/turf/open/floor/plating, -/area/storage/tech) -"anU" = ( -/obj/structure/table, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai_upload) -"anV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"anX" = ( -/turf/closed/wall/r_wall, -/area/ai_monitored/nuke_storage) -"anY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/prison) -"anZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aoa" = ( -/obj/structure/table, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"aob" = ( -/obj/machinery/computer/security{ - dir = 8 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"aod" = ( -/obj/structure/table, -/turf/open/floor/plating, -/area/storage/tech) -"aoe" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/computer/slot_machine{ - pixel_y = 2 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"aof" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aog" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"aoh" = ( -/turf/closed/wall, -/area/crew_quarters/theatre) -"aoi" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"aoj" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 3 - }, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchenshutter"; - name = "privacy shutters" - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"aok" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/poddoor/preopen{ - id = "brigexternalblastentry"; - name = "External Security Entry Blast Door" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aol" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/obj/item/storage/box/donkpockets{ - pixel_x = 2; - pixel_y = 3 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"aom" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"aon" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/camera{ - c_tag = "Medical - Research/Genetics Airlock"; - dir = 4; - network = list("ss13","Medical") - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aoo" = ( -/obj/structure/reagent_dispensers/beerkeg, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Service - Bar Backroom"; - dir = 4; - network = list("ss13","Bar Area") - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"aop" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/crate_spawner, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aoq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aor" = ( -/turf/open/floor/plasteel, -/area/engine/engineering) -"aot" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"aov" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"aow" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"aox" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"aoz" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"aoA" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/hydroponics) -"aoB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"aoC" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/machinery/reagentgrinder, -/turf/open/floor/plasteel, -/area/hydroponics) -"aoD" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/plasteel, -/area/hydroponics) -"aoE" = ( -/obj/structure/window/reinforced, -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/hydroponics) -"aoF" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/hydroponics) -"aoH" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/fore) -"aoJ" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"aoK" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aoM" = ( -/obj/machinery/camera{ - c_tag = "Research - Main 4"; - dir = 2; - network = list("ss13","Research") - }, -/turf/open/floor/plasteel/white/side{ - dir = 10 - }, -/area/science/research) -"aoN" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"aoO" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aoP" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "sciencecheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/science) -"aoR" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/table/glass, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"aoT" = ( -/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/tile/neutral, -/obj/structure/closet/secure_closet/personal, -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/obj/structure/window/reinforced/tinted, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"aoU" = ( -/obj/machinery/suit_storage_unit/ce, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/white, -/area/crew_quarters/heads/chief) -"aoV" = ( -/obj/structure/dresser, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aoW" = ( -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aoX" = ( -/obj/machinery/vending/autodrobe, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aoY" = ( -/obj/structure/piano{ - icon_state = "piano" - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aoZ" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/chair/wood/wings{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"apb" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/table/glass, -/obj/item/folder/white, -/obj/item/stamp/cmo, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"apc" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"apd" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"ape" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"apf" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"apg" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"aph" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engine_room/external) -"api" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"apj" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "sciencecheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/science) -"apk" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "sciencecheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/science) -"apl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"apn" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor{ - id = "Secure Storage"; - name = "Engineering Secure Storage" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"app" = ( -/obj/structure/closet/crate/solarpanel_small, -/turf/open/floor/plating, -/area/engine/engineering) -"apq" = ( -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/plasteel, -/area/engine/engineering) -"apr" = ( -/obj/machinery/hydroponics/soil, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/prison) -"apt" = ( -/obj/structure/table, -/obj/item/kitchen/rollingpin, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"apu" = ( -/obj/structure/closet/secure_closet/engineering_electrical, -/turf/open/floor/plasteel, -/area/engine/engineering) -"apw" = ( -/obj/structure/closet/secure_closet/freezer/fridge, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"apx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"apz" = ( -/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/structure/closet/secure_closet/engineering_chief, -/obj/machinery/light_switch{ - pixel_x = 28; - pixel_y = -8 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/chief) -"apC" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/camera{ - c_tag = "Engineering - Job Equipment"; - dir = 2; - network = list("ss13","Engineering","Engine") - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"apD" = ( -/obj/structure/table/wood, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/obj/item/toy/dummy, -/obj/item/reagent_containers/food/snacks/baguette, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"apE" = ( -/mob/living/simple_animal/slime, -/turf/open/floor/engine, -/area/science/xenobiology) -"apF" = ( -/obj/machinery/field/generator, -/turf/open/floor/plating, -/area/engine/engineering) -"apG" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/suit_storage_unit/engine, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room/external) -"apJ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/security/prison) -"apL" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) -"apM" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel, -/area/engine/engineering) -"apN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"apO" = ( -/turf/closed/wall/r_wall, -/area/crew_quarters/heads/chief) -"apQ" = ( -/obj/structure/table, -/obj/item/stack/rods/fifty, -/turf/open/floor/plasteel, -/area/engine/engineering) -"apR" = ( -/obj/effect/landmark/start/mime, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"apS" = ( -/obj/machinery/portable_atmospherics/canister/toxins, -/turf/open/floor/plating, -/area/engine/engineering) -"apT" = ( -/obj/machinery/power/emitter, -/turf/open/floor/plating, -/area/engine/engineering) -"apU" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"apV" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"apW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"apX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"apY" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/yellow, -/obj/item/stock_parts/cell/high/plus, -/obj/item/stock_parts/cell/high/plus{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/structure/sign/poster/official/random{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"apZ" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aqa" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"aqb" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/snacks/mint, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"aqc" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"aqd" = ( -/obj/structure/chair/wood/wings{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aqe" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 4; - name = "sorting disposal pipe (Theatre)"; - sortType = 18 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aqf" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/storage/fancy/donut_box, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchenshutter"; - name = "privacy shutters" - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"aqg" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "briginteralshutter"; - name = "Warden Lockdown Shutter" - }, -/turf/open/floor/plating, -/area/security/warden) -"aqh" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"aqi" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks{ - dir = 4; - icon_state = "soda_dispenser" - }, -/obj/machinery/camera{ - c_tag = "Service - Bar Counter"; - dir = 4; - network = list("ss13","Bar Area") - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"aqj" = ( -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"aqk" = ( -/obj/machinery/holopad, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aql" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"aqm" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/solar/starboard) -"aqn" = ( -/obj/machinery/status_display, -/turf/closed/wall, -/area/crew_quarters/fitness/recreation) -"aqo" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aqp" = ( -/obj/structure/table/wood, -/obj/item/lipstick{ - pixel_y = 5 - }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"aqq" = ( -/obj/machinery/power/solar_control{ - dir = 8; - id = "aftstarboard"; - name = "Starboard Quarter Solar Control"; - track = 0 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/solar/starboard) -"aqr" = ( -/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/tile/neutral, -/obj/structure/window/reinforced/tinted, -/obj/structure/window/reinforced/tinted{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"aqs" = ( -/obj/structure/table, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/stack/cable_coil, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aqv" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "medicalcheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/medical) -"aqw" = ( -/obj/machinery/conveyor{ - dir = 9; - id = "cargoright" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"aqx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"aqy" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"aqz" = ( -/turf/closed/wall/r_wall, -/area/security/brig) -"aqA" = ( -/turf/closed/wall, -/area/security/brig) -"aqB" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aqC" = ( -/obj/machinery/computer/crew{ - dir = 1 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"aqD" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/security/prison) -"aqE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aqF" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aqG" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"aqH" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Brig Control"; - req_access_txt = "3"; - security_level = 6 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"aqI" = ( -/obj/structure/closet/secure_closet/brig, -/turf/open/floor/plasteel, -/area/security/prison) -"aqJ" = ( -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"aqK" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/security/prison) -"aqL" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/security/prison) -"aqM" = ( -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/obj/machinery/requests_console{ - department = "Security"; - departmentType = 5; - pixel_x = -30 - }, -/obj/structure/closet/secure_closet/warden, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"aqO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Security Perma - Main 1"; - dir = 4; - network = list("ss13","Security","Prison") - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aqP" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aqQ" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aqR" = ( -/obj/structure/closet/secure_closet/lethalshots, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) -"aqS" = ( -/obj/structure/table, -/obj/machinery/recharger, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"aqT" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/machinery/camera{ - c_tag = "Service - Kitchen Main 1"; - dir = 4; - network = list("ss13","Bar Area") - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"aqU" = ( -/obj/machinery/computer/station_alert, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/service) -"aqV" = ( -/obj/structure/table, -/obj/machinery/computer/security/telescreen/rd{ - network = list("Science","aicore","AIUpload","MiniSat") - }, -/obj/machinery/keycard_auth{ - pixel_x = -4; - pixel_y = 24 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"aqW" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk, -/obj/machinery/camera{ - c_tag = "Civilian - Dorm Main 1"; - dir = 2; - network = list("ss13") - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = 28 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aqX" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aqY" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Civilian - Dorm Holodeck"; - dir = 4; - network = list("ss13") - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"aqZ" = ( -/obj/machinery/status_display, -/turf/closed/wall/r_wall, -/area/teleporter) -"arb" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"arc" = ( -/obj/structure/closet/crate{ - name = "Target Practice Cutouts" - }, -/obj/item/target, -/obj/item/target, -/obj/item/target/alien, -/obj/item/target/alien, -/obj/item/target/clown, -/obj/item/target/clown, -/obj/item/target/syndicate, -/obj/item/target/syndicate, -/turf/open/floor/plating, -/area/maintenance/department/security) -"ard" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"are" = ( -/obj/structure/closet/secure_closet/captains, -/obj/item/pinpointer/nuke, -/obj/item/disk/nuclear, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"arf" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/bridge) -"arg" = ( -/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/vending/tool, -/turf/open/floor/plasteel, -/area/storage/tools) -"arh" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/light_switch{ - pixel_y = 28 - }, -/turf/open/floor/plasteel, -/area/storage/tools) -"ari" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/storage/tools) -"arj" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/storage/tools) -"ark" = ( -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"arl" = ( -/obj/structure/table/wood, -/obj/item/storage/photo_album/Captain, -/obj/item/camera, -/obj/item/radio/intercom{ - dir = 8; - freerange = 1; - name = "Station Intercom (Command)"; - pixel_y = -28 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"arm" = ( -/turf/open/floor/plasteel, -/area/bridge) -"arn" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "vacantshop"; - name = "privacy shutters" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/vacant_room/commissary) -"aro" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"arp" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plasteel/freezer, -/area/security/prison) -"arq" = ( -/turf/open/floor/plasteel/freezer, -/area/security/prison) -"arr" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/washing_machine, -/turf/open/floor/plasteel/cafeteria, -/area/security/prison) -"ars" = ( -/obj/structure/table/wood, -/mob/living/simple_animal/mouse/brown{ - name = "Jerry" - }, -/turf/open/floor/carpet, -/area/library/lounge) -"art" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/washing_machine, -/turf/open/floor/plasteel/cafeteria, -/area/security/prison) -"aru" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "vacantshop"; - name = "privacy shutters" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/vacant_room/commissary) -"arv" = ( -/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, -/area/hallway/primary/central) -"arw" = ( -/obj/machinery/power/apc{ - areastring = "/area/vacant_room/commissary"; - dir = 4; - name = "Vacant Commissary APC"; - pixel_x = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"arx" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ary" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/vending/assist, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/turf/open/floor/plasteel, -/area/storage/tools) -"arz" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "vacantshop"; - name = "Shop Shutter Control"; - pixel_x = 8; - pixel_y = 24 - }, -/obj/item/stack/sheet/cardboard{ - amount = 3 - }, -/obj/machinery/light_switch{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/vacant_room/commissary) -"arA" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"arB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"arD" = ( -/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/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"arE" = ( -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/closet/secure_closet/engineering_personal, -/turf/open/floor/plasteel, -/area/engine/engineering) -"arF" = ( -/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/storage/tools) -"arG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/storage/tools) -"arJ" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plasteel, -/area/storage/tools) -"arK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"arL" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/storage/tools) -"arM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/storage/tools) -"arO" = ( -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai_upload) -"arP" = ( -/obj/effect/turf_decal/bot_white, -/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/ai_monitored/turret_protected/ai_upload) -"arQ" = ( -/obj/structure/table/glass, -/obj/item/storage/box/donkpockets, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"arR" = ( -/obj/machinery/computer/upload/ai{ - dir = 1 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai_upload) -"arS" = ( -/obj/machinery/computer/upload/borg{ - dir = 1 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai_upload) -"arT" = ( -/turf/closed/wall/r_wall, -/area/ai_monitored/security/armory) -"arU" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"arV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"arW" = ( -/obj/machinery/computer/rdconsole/production{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"arX" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/landmark/start/assistant, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"arY" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/storage/tools) -"arZ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "medicalcheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/medical) -"asa" = ( -/obj/effect/turf_decal/tile/neutral{ - 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/flasher/portable, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) -"asb" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"asc" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"asd" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"ase" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"asf" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/button/door{ - id = "brigexternalblast"; - name = "Brig Cell Blast Door Toggle"; - pixel_x = -6; - pixel_y = 30 - }, -/obj/machinery/button/door{ - id = "briginteralshutter"; - name = "Warden Office Shutter Toggle"; - pixel_x = 4; - pixel_y = 30 - }, -/obj/effect/landmark/start/warden, -/obj/machinery/button/door{ - id = "brigexternalblastentry"; - name = "External Blast Door Toggle"; - pixel_y = 38 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"asg" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"ash" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"asi" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/item/stamp/captain, -/obj/machinery/requests_console{ - announcementConsole = 1; - department = "Captain's Desk"; - departmentType = 5; - name = "Captain RC"; - pixel_y = -30 - }, -/obj/item/pen/fountain/captain, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"asj" = ( -/turf/closed/wall, -/area/maintenance/starboard) -"ask" = ( -/obj/item/stack/sheet/glass, -/obj/structure/table/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/scanning_module{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/stock_parts/scanning_module, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/mineral/copper{ - amount = 5 - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"asl" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/storage/tools) -"asm" = ( -/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/tile/neutral, -/obj/structure/window/reinforced/tinted, -/obj/structure/window/reinforced/tinted{ - dir = 4 - }, -/obj/structure/dresser, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"asn" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"asp" = ( -/obj/item/grenade/barrier{ - pixel_x = 4 - }, -/obj/item/grenade/barrier, -/obj/item/grenade/barrier{ - pixel_x = -4 - }, -/obj/structure/table, -/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/ai_monitored/security/armory) -"asq" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "cargoright" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"asr" = ( -/turf/open/floor/plasteel, -/area/engine/atmos) -"ass" = ( -/obj/structure/chair/stool, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ast" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/table, -/obj/machinery/requests_console{ - department = "Tool Storage"; - departmentType = 0; - pixel_x = -30 - }, -/obj/item/t_scanner, -/obj/item/multitool{ - pixel_x = 4 - }, -/obj/item/multitool, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plasteel, -/area/storage/tools) -"asu" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/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{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000; - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/plasteel, -/area/storage/tools) -"asv" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"asw" = ( -/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/storage/tools) -"asx" = ( -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"asy" = ( -/turf/closed/wall/r_wall, -/area/gateway) -"asz" = ( -/obj/structure/table, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"asA" = ( -/obj/structure/rack, -/obj/item/clothing/head/welding, -/obj/item/crowbar/red, -/obj/item/wrench, -/obj/structure/extinguisher_cabinet{ - pixel_x = 5; - pixel_y = 30 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/service) -"asB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"asC" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat/foyer) -"asD" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/solar/starboard) -"asE" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/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 = 4 - }, -/turf/open/floor/plasteel, -/area/storage/tools) -"asF" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"asG" = ( -/turf/closed/wall, -/area/crew_quarters/dorms) -"asH" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/plasteel, -/area/engine/atmos) -"asJ" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/plasteel, -/area/engine/atmos) -"asK" = ( -/obj/item/clothing/suit/ianshirt, -/turf/open/floor/plating, -/area/engine/atmos) -"asL" = ( -/obj/machinery/door/airlock/medical{ - name = "Morgue"; - req_access_txt = "0"; - req_one_access_txt = "6;22" - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"asM" = ( -/obj/structure/table, -/obj/item/storage/pill_bottle/dice, -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"asN" = ( -/obj/machinery/power/apc{ - areastring = "/area/solar/starboard"; - dir = 8; - name = "Starboard Aux Solar APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/solar/starboard) -"asO" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/preopen{ - id = "brigexternalblast"; - name = "External Security Blast Door" - }, -/turf/open/floor/plating, -/area/security/brig) -"asP" = ( -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"asQ" = ( -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"asR" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plating, -/area/solar/starboard) -"asS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"asT" = ( -/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/tile/neutral, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"asU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"asV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"asW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small, -/turf/open/floor/plasteel, -/area/security/brig) -"asX" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/tcommsat/computer) -"asY" = ( -/obj/structure/filingcabinet{ - pixel_x = 3 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/tcommsat/computer) -"asZ" = ( -/obj/structure/filingcabinet{ - pixel_x = 3 - }, -/turf/open/floor/plasteel/dark, -/area/tcommsat/computer) -"ata" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"atb" = ( -/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/machinery/camera{ - c_tag = "Hallway - Central Northeast 1"; - dir = 4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"atc" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/solar/starboard) -"atd" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Civilian - Dorm Laundry Room"; - dir = 2; - network = list("ss13") - }, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/fitness/recreation) -"ate" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/security/brig) -"atf" = ( -/obj/machinery/space_heater, -/obj/machinery/firealarm{ - dir = 2; - pixel_y = 24 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"atg" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"ath" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"ati" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Distro to Waste" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 - }, -/area/engine/atmos) -"atj" = ( -/obj/machinery/meter/atmos/distro_loop, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/visible{ - dir = 1 - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 - }, -/area/engine/atmos) -"atk" = ( -/obj/machinery/meter/atmos/atmos_waste_loop, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 - }, -/area/engine/atmos) -"atl" = ( -/obj/structure/table/wood, -/obj/machinery/computer/security/wooden_tv, -/obj/machinery/camera{ - c_tag = "Security - Detective's Office"; - dir = 8; - network = list("ss13","Security") - }, -/turf/open/floor/carpet, -/area/security/detectives_office) -"atm" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/turf/open/floor/plasteel/dark, -/area/tcommsat/computer) -"atn" = ( -/obj/structure/table/wood, -/turf/open/floor/plasteel/dark, -/area/tcommsat/computer) -"ato" = ( -/obj/structure/table/wood, -/obj/item/storage/box/donkpockets, -/obj/item/storage/box/donkpockets{ - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/plasteel/dark, -/area/tcommsat/computer) -"atp" = ( -/obj/structure/punching_bag, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"atq" = ( -/obj/structure/table/wood, -/obj/machinery/microwave{ - pixel_y = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/tcommsat/computer) -"atr" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/fitness/recreation) -"ats" = ( -/turf/open/floor/wood, -/area/lawoffice) -"att" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 10 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 - }, -/area/engine/atmos) -"atu" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater/on, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 - }, -/area/engine/atmos) -"atv" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/entry) -"atw" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/hallway/secondary/exit/departure_lounge) -"atx" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"aty" = ( -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"atz" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"atA" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"atB" = ( -/obj/machinery/space_heater, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"atC" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"atD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) -"atE" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer, -/turf/open/floor/plasteel, -/area/engine/atmos) -"atF" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"atG" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Mix to Distro" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"atH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating, -/area/storage/tech) -"atI" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/landmark/start/lawyer, -/turf/open/floor/wood, -/area/lawoffice) -"atJ" = ( -/obj/machinery/button/door{ - id = "lawyerprivate"; - pixel_x = 24; - pixel_y = -8 - }, -/turf/open/floor/wood, -/area/lawoffice) -"atK" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) -"atL" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"atM" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "lawyerprivate"; - name = "privacy shutters" - }, -/turf/open/floor/plating, -/area/lawoffice) -"atO" = ( -/obj/machinery/door/airlock/hatch{ - name = "TeleSat Space Access Airlock"; - req_one_access_txt = "32;19" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/tcommsat/computer) -"atP" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/tcommsat/computer) -"atQ" = ( -/turf/open/floor/plating, -/area/tcommsat/computer) -"atR" = ( -/obj/machinery/door/airlock/hatch{ - name = "TeleSat Space Access Airlock"; - req_one_access_txt = "32;19" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/tcommsat/computer) -"atS" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/space/basic, -/area/space/nearstation) -"atT" = ( -/turf/open/floor/plasteel/dark, -/area/tcommsat/computer) -"atU" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"atV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"atW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"atX" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/ai_monitored/security/armory) -"atY" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"atZ" = ( -/obj/machinery/space_heater, -/obj/structure/window/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aua" = ( -/obj/effect/turf_decal/tile/neutral{ - 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/structure/rack, -/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/dark, -/area/ai_monitored/security/armory) -"aub" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Waste to Filter" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix to Engine" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aud" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/purple/visible{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aue" = ( -/obj/machinery/atmospherics/pipe/manifold/purple/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) -"auf" = ( -/obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aug" = ( -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"aui" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Air to Mix" - }, -/obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"auj" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"auk" = ( -/obj/machinery/door/window/eastright{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Fitness Ring" - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"aul" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aum" = ( -/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/tile/neutral, -/obj/structure/closet/secure_closet/personal, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"aun" = ( -/obj/machinery/computer/holodeck{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"auo" = ( -/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/tile/neutral, -/obj/structure/window/reinforced/tinted{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"aup" = ( -/turf/open/floor/plating, -/area/maintenance/starboard) -"auq" = ( -/obj/structure/table, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aur" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/solar/starboard) -"aus" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/closet/crate/bin{ - desc = "A laundry bin, place your laundry here for your mom to collect."; - name = "laundry bin" - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/fitness/recreation) -"aut" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/fitness/recreation) -"auu" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/washing_machine, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/fitness/recreation) -"auv" = ( -/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 - }, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/turf/open/floor/plasteel{ - dir = 2 - }, -/area/ai_monitored/security/armory) -"auw" = ( -/obj/structure/table, -/obj/item/storage/firstaid/brute, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"aux" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "5;12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"auy" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"auz" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/fitness/recreation) -"auB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"auC" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/security/checkpoint) -"auD" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 4 - }, -/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, -/area/engine/atmos) -"auE" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"auF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/mix_output{ - dir = 8 - }, -/turf/open/floor/engine/vacuum, -/area/engine/atmos) -"auG" = ( -/turf/closed/wall, -/area/hallway/secondary/entry) -"auH" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/item/clothing/mask/gas{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas{ - pixel_x = -2; - pixel_y = -2 - }, -/turf/open/floor/plasteel, -/area/bridge) -"auI" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"auJ" = ( -/turf/closed/wall, -/area/ai_monitored/storage/eva) -"auK" = ( -/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/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"auL" = ( -/turf/open/floor/engine/vacuum, -/area/engine/atmos) -"auM" = ( -/obj/structure/closet/crate, -/turf/open/floor/plasteel, -/area/engine/atmos) -"auN" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/engine/atmos) -"auO" = ( -/obj/machinery/door/airlock/command/glass{ - name = "EVA Storage"; - req_access_txt = "18"; - security_level = 6 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/storage/eva) -"auP" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"auQ" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"auR" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Mix to Filter" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"auS" = ( -/obj/machinery/atmospherics/pipe/manifold/purple/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"auT" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 6 - }, -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/plasteel, -/area/engine/atmos) -"auU" = ( -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 1 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) -"auV" = ( -/turf/closed/wall, -/area/quartermaster/miningdock) -"auW" = ( -/obj/structure/table, -/obj/item/paper/fluff/holodeck/disclaimer, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"auX" = ( -/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/tile/neutral, -/obj/structure/window/reinforced/tinted{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"auY" = ( -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"auZ" = ( -/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/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"ava" = ( -/obj/machinery/computer/atmos_control/tank/mix_tank{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"avb" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/atmos) -"avc" = ( -/obj/machinery/air_sensor/atmos/mix_tank, -/turf/open/floor/engine/vacuum, -/area/engine/atmos) -"avd" = ( -/turf/open/floor/plasteel/dark, -/area/ai_monitored/storage/eva) -"ave" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"avf" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Atmospherics - Mix Tank"; - dir = 8; - network = list("ss13","Atmospherics") - }, -/turf/open/floor/engine/vacuum, -/area/engine/atmos) -"avg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"avh" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"avi" = ( -/turf/closed/wall, -/area/hallway/secondary/exit/departure_lounge) -"avj" = ( -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"avk" = ( -/obj/structure/tank_dispenser/oxygen, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"avl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/door/airlock/atmos/glass{ - name = "Distribution Loop"; - req_access_txt = "24" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"avm" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high/plus, -/obj/item/stock_parts/cell/high/plus{ - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"avn" = ( -/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/tile/neutral, -/obj/structure/window/reinforced/tinted{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"avo" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty{ - pixel_x = 2; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"avp" = ( -/obj/docking_port/stationary/random{ - dir = 1; - id = "pod_lavaland2"; - name = "lavaland" - }, -/turf/open/space, -/area/space/nearstation) -"avq" = ( -/obj/docking_port/stationary{ - dir = 1; - 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) -"avr" = ( -/obj/structure/table, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"avs" = ( -/obj/structure/table, -/obj/item/stack/sheet/rglass{ - amount = 50; - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/stack/sheet/rglass{ - amount = 50; - pixel_x = 5; - pixel_y = 1 - }, -/obj/item/stack/rods/fifty, -/obj/item/stack/rods/fifty{ - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"avt" = ( -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"avu" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"avv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"avw" = ( -/obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"avx" = ( -/obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"avy" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/multitool, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"avz" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Pure to Mix" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"avA" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"avB" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"avC" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"avD" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Unfiltered & Air to Mix" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"avE" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/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) -"avF" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"avG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"avH" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/mix_input{ - dir = 8 - }, -/turf/open/floor/engine/vacuum, -/area/engine/atmos) -"avI" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/grille/broken, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"avJ" = ( -/obj/structure/tank_dispenser, -/obj/machinery/camera{ - c_tag = "Bridge - Emergency Storage"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/bridge) -"avK" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/engine/atmos) -"avL" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"avM" = ( -/turf/closed/wall, -/area/construction/mining/aux_base) -"avN" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/purple/visible, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"avO" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"avP" = ( -/obj/structure/grille, -/turf/open/space/basic, -/area/space/nearstation) -"avR" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"avS" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/turf/open/floor/plating, -/area/engine/atmos) -"avT" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/plating, -/area/engine/atmos) -"avU" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = 28 - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/hallway/secondary/exit/departure_lounge) -"avV" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Dock"; - req_access_txt = "48" - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"avW" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"avX" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 8 - }, -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"avY" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/hallway/secondary/exit/departure_lounge) -"avZ" = ( -/turf/open/floor/plating, -/area/construction/mining/aux_base) -"awb" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"awc" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/plating, -/area/solar/starboard) -"awd" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/exit/departure_lounge) -"awe" = ( -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"awf" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"awg" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) -"awh" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/hallway/secondary/exit/departure_lounge) -"awi" = ( -/obj/machinery/atmospherics/pipe/simple/purple/visible, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) -"awj" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 6 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) -"awk" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/obj/structure/rack, -/obj/item/stack/sheet/glass{ - amount = 25 - }, -/obj/item/stack/sheet/iron/twenty, -/turf/open/floor/plating, -/area/construction) -"awl" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"awm" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 4 - }, -/area/hallway/secondary/exit/departure_lounge) -"awn" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"awo" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) -"awp" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"awq" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/plating, -/area/solar/starboard) -"awr" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "N2O to Pure" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aws" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"awt" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"awu" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"awv" = ( -/obj/structure/sign/departments/evac{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"aww" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"awx" = ( -/obj/effect/turf_decal/loading_area, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"awy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"awz" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"awA" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"awB" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/solar/starboard) -"awC" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas, -/obj/item/multitool, -/obj/item/stack/cable_coil/random/five, -/turf/open/floor/plating, -/area/solar/starboard) -"awD" = ( -/obj/structure/sign/departments/medbay/alt, -/turf/closed/wall, -/area/medical/medbay/lobby) -"awE" = ( -/obj/structure/chair, -/turf/open/floor/plating, -/area/maintenance/port) -"awF" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/sign/directions/command{ - dir = 4; - pixel_x = 30; - pixel_y = 24 - }, -/obj/structure/sign/directions/engineering{ - pixel_x = 30; - pixel_y = 40 - }, -/obj/structure/sign/directions/security{ - dir = 4; - pixel_x = 30; - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"awG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"awH" = ( -/obj/structure/table, -/obj/item/key/janitor, -/obj/machinery/camera{ - c_tag = "Civilian - Custodials"; - dir = 1 - }, -/obj/item/toy/figure/janitor, -/obj/machinery/requests_console{ - department = "Janitorial"; - departmentType = 1; - pixel_y = -29 - }, -/turf/open/floor/plasteel, -/area/janitor) -"awI" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"awJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"awK" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"awL" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"awM" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/solar/starboard) -"awN" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"awO" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"awP" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/solar/starboard) -"awQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/engine/atmos) -"awR" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) -"awS" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/computer/atmos_control/tank/nitrous_tank{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) -"awT" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"awU" = ( -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"awV" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"awW" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"awX" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"awY" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"awZ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axa" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"axb" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axc" = ( -/turf/closed/wall, -/area/hallway/primary/central) -"axd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/vacant_room/commissary) -"axe" = ( -/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, -/area/hallway/primary/central) -"axf" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axg" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/fitness/recreation) -"axh" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axi" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"axj" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrous_input{ - dir = 8 - }, -/turf/open/floor/engine/n2o{ - initial_gas_mix = "n2o=1000;TEMP=293.15" - }, -/area/engine/atmos) -"axk" = ( -/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/neutral, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axl" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axm" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axn" = ( -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/engine/airless, -/area/engine/atmos) -"axo" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/pump, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/engine/atmos) -"axp" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axq" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"axr" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/engine/atmos) -"axs" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"axt" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axu" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axv" = ( -/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, -/turf/open/floor/plasteel, -/area/engine/atmos) -"axw" = ( -/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/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axx" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axy" = ( -/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/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axz" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"axA" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) -"axB" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"axC" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"axD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxin_output{ - dir = 8 - }, -/turf/open/floor/engine/plasma{ - initial_gas_mix = "plasma=1000;TEMP=293.15" - }, -/area/engine/atmos) -"axE" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axF" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axG" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axH" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"axI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white/side{ - dir = 10 - }, -/area/science/research) -"axJ" = ( -/turf/open/floor/engine/plasma{ - initial_gas_mix = "plasma=1000;TEMP=293.15" - }, -/area/engine/atmos) -"axK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"axL" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axM" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"axN" = ( -/obj/structure/table, -/obj/item/storage/belt/utility, -/obj/item/clothing/head/welding, -/obj/item/clothing/head/welding{ - pixel_x = 2; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"axO" = ( -/turf/closed/wall, -/area/engine/atmos) -"axP" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/book/manual/wiki/atmospherics, -/turf/open/floor/plasteel, -/area/engine/atmos) -"axQ" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port Mix to East Ports" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"axR" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"axS" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/engine/atmos) -"axT" = ( -/obj/structure/closet/secure_closet/atmospherics, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/pipe_dispenser, -/turf/open/floor/plasteel, -/area/engine/atmos) -"axU" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/plasteel{ - dir = 1 - }, -/area/engine/atmos) -"axV" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) -"axX" = ( -/obj/machinery/atmospherics/components/trinary/mixer{ - dir = 1; - name = "plasma mixer" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"axY" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Plasma to Pure" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"axZ" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"aya" = ( -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/engine/plasma{ - initial_gas_mix = "plasma=1000;TEMP=293.15" - }, -/area/engine/atmos) -"ayb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"ayc" = ( -/obj/machinery/air_sensor/atmos/toxin_tank, -/turf/open/floor/engine/plasma{ - initial_gas_mix = "plasma=1000;TEMP=293.15" - }, -/area/engine/atmos) -"ayd" = ( -/obj/machinery/suit_storage_unit/atmos, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aye" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayf" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/computer/atmos_control/tank/toxin_tank{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayg" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"ayh" = ( -/obj/machinery/atmospherics/miner/toxins{ - max_ext_kpa = 2500 - }, -/turf/open/floor/engine/plasma{ - initial_gas_mix = "plasma=1000;TEMP=293.15" - }, -/area/engine/atmos) -"ayi" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Atmospherics - Plasma Tank"; - dir = 8; - network = list("ss13","Atmospherics") - }, -/turf/open/floor/engine/plasma{ - initial_gas_mix = "plasma=1000;TEMP=293.15" - }, -/area/engine/atmos) -"ayj" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxin_input{ - dir = 8 - }, -/turf/open/floor/engine/plasma{ - initial_gas_mix = "plasma=1000;TEMP=293.15" - }, -/area/engine/atmos) -"ayk" = ( -/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 - }, -/area/engine/atmos) -"ayl" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aym" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10; 13" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/solar/starboard) -"ayn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/carbon_output{ - dir = 8 - }, -/turf/open/floor/engine/co2{ - initial_gas_mix = "co2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"ayo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/item/radio/intercom{ - dir = 2; - pixel_y = -28 - }, -/obj/machinery/camera{ - c_tag = "Research - Research and Circuitry"; - dir = 1; - network = list("ss13","Research") - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"ayp" = ( -/obj/machinery/vending/wardrobe/atmos_wardrobe, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"ayq" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayr" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"ays" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayt" = ( -/obj/machinery/door/airlock/atmos{ - name = "Atmospherics Foyer"; - req_access_txt = "0"; - req_one_access_txt = "24;10" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Lockdown" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/closet/radiation, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayv" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/turf_decal/tile/purple, -/obj/machinery/camera{ - c_tag = "Atmospherics - Main 2"; - dir = 8; - network = list("ss13","Atmospherics") - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"ayw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel, -/area/security/prison) -"ayx" = ( -/obj/item/radio/intercom{ - pixel_y = 28 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/closet/radiation, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayy" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port to Fuel Pipe" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayA" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Port to Filter" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayB" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "CO2 to Pure" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayC" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"ayD" = ( -/turf/open/floor/engine/co2{ - initial_gas_mix = "co2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"ayF" = ( -/obj/machinery/air_sensor/atmos/carbon_tank, -/turf/open/floor/engine/co2{ - initial_gas_mix = "co2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"ayG" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/medical/cryo) -"ayH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/aft) -"ayI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayJ" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayL" = ( -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"ayM" = ( -/obj/machinery/atmospherics/pipe/manifold/dark/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayN" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Pure to Fuel Pipe" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayO" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"ayQ" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/computer/atmos_control/tank/carbon_tank{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayR" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"ayS" = ( -/obj/machinery/atmospherics/miner/carbon_dioxide{ - max_ext_kpa = 2500 - }, -/turf/open/floor/engine/co2{ - initial_gas_mix = "co2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"ayT" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Atmospherics - Carbon Dioxide Tank"; - dir = 8; - network = list("ss13","Atmospherics") - }, -/turf/open/floor/engine/co2{ - initial_gas_mix = "co2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"ayU" = ( -/obj/structure/closet/l3closet/scientist, -/obj/machinery/camera{ - c_tag = "Research - Experimentor"; - dir = 1; - network = list("ss13","Research") - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"ayV" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayW" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "N2 to Airmix" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayX" = ( -/obj/machinery/door/airlock/research{ - name = "Toxins Storage"; - req_access_txt = "8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/science/mixing) -"ayY" = ( -/obj/machinery/atmospherics/components/trinary/mixer/airmix{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ayZ" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aza" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"azb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"azc" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plasteel, -/area/engine/atmos) -"azd" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aze" = ( -/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, -/area/hallway/primary/central) -"azf" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"azg" = ( -/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/neutral, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"azh" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"azi" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/carbon_input{ - dir = 8 - }, -/turf/open/floor/engine/co2{ - initial_gas_mix = "co2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"azj" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrogen_input{ - dir = 1 - }, -/turf/open/floor/engine/n2{ - initial_gas_mix = "n2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"azk" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "N2 to Pure" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"azl" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"azm" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"azn" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) -"azo" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) -"azp" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"azq" = ( -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"azr" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"azs" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plasteel, -/area/engine/atmos) -"azt" = ( -/obj/machinery/computer/atmos_control/tank/nitrogen_tank{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"azu" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "Nitrogen Outlet" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"azv" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"azw" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"azx" = ( -/obj/machinery/computer/atmos_control/tank/oxygen_tank{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"azy" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "O2 to Airmix" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"azz" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "O2 to Pure" - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"azA" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/engine/atmos) -"azB" = ( -/obj/machinery/computer/atmos_control/tank/air_tank{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/engine/atmos) -"azC" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"azD" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Air to Pure" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/engine/atmos) -"azE" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"azF" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 9 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/engine/atmos) -"azG" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/medical/cryo) -"azH" = ( -/turf/closed/wall, -/area/maintenance/port/aft) -"azI" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/solar/starboard) -"azJ" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"azK" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"azL" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"azM" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"azN" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"azO" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"azP" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"azQ" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"azR" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"azS" = ( -/obj/machinery/modular_computer/console/preset/engineering, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Bridge - Main 3"; - dir = 2 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"azU" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/medical/cryo) -"azZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"aAa" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/research) -"aAc" = ( -/turf/closed/wall, -/area/maintenance/aft) -"aAd" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aAf" = ( -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "cargoleft" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aAg" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aAh" = ( -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aAj" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "cargoright" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aAk" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp{ - pixel_y = 10 - }, -/obj/item/camera/spooky, -/obj/item/camera_film, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"aAl" = ( -/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, -/obj/item/folder/yellow, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"aAm" = ( -/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/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/computer/station_alert{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"aAn" = ( -/turf/closed/wall, -/area/quartermaster/office) -"aAo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"aAp" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/computer/security/mining, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"aAq" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/computer/shuttle/mining, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"aAr" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aAs" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"aAt" = ( -/obj/machinery/mineral/equipment_vendor, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"aAu" = ( -/obj/effect/turf_decal/tile/red, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Security - Entrance"; - dir = 1; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aAv" = ( -/obj/effect/turf_decal/tile/bar, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aAw" = ( -/obj/structure/closet, -/obj/item/coin/antagtoken, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aAx" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"aAy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"aAz" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/effect/landmark/start/assistant, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/junction/flip{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aAA" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/sorting/mail{ - dir = 1; - name = "sorting disposal pipe (Head of Personnel)"; - sortType = 15 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aAB" = ( -/obj/effect/turf_decal/loading_area{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "hopqueue"; - name = "HoP Queue Shutters" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/hop) -"aAC" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aAD" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "hop"; - name = "Privacy Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/heads/hop) -"aAE" = ( -/obj/machinery/modular_computer/console/preset/command{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"aAF" = ( -/turf/open/floor/engine, -/area/science/xenobiology) -"aAG" = ( -/obj/structure/disposaloutlet{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/engine, -/area/science/xenobiology) -"aAH" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/xenobiology) -"aAI" = ( -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"aAJ" = ( -/turf/closed/wall, -/area/science/xenobiology) -"aAK" = ( -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/science/research) -"aAL" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags, -/obj/item/pen, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"aAM" = ( -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"aAN" = ( -/obj/machinery/door/window/eastright{ - name = "Robotics Surgery"; - req_access_txt = "29" - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"aAO" = ( -/obj/structure/bed, -/obj/effect/landmark/start/captain, -/obj/item/bedsheet/captain, -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain/private) -"aAP" = ( -/obj/machinery/computer/crew{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"aAQ" = ( -/obj/structure/closet/l3closet/scientist, -/obj/item/extinguisher, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"aAR" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/turf/open/floor/plasteel, -/area/science/research) -"aAS" = ( -/obj/machinery/portable_atmospherics/pump, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/turf/open/floor/plasteel, -/area/science/research) -"aAT" = ( -/obj/structure/bodycontainer/morgue, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"aAU" = ( -/obj/structure/table/optable{ - name = "Robotics Operating Table" - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"aAV" = ( -/obj/machinery/computer/operating{ - dir = 1; - name = "Robotics Operating Computer" - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"aAW" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"aAX" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/crew_quarters/heads/hor) -"aAY" = ( -/obj/machinery/vending/wardrobe/robo_wardrobe, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"aAZ" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/melee/chainofcommand, -/obj/item/storage/fancy/cigarettes/cigpack_syndicate, -/obj/machinery/keycard_auth{ - pixel_y = -24 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"aBa" = ( -/obj/machinery/status_display/supply{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aBb" = ( -/obj/machinery/door/airlock/command{ - name = "Captain's Quarters"; - req_access_txt = "20"; - security_level = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/captain/private) -"aBc" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Bridge Emergency Storage"; - req_access_txt = "19"; - security_level = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/bridge) -"aBd" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/computer/med_data{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"aBe" = ( -/turf/closed/wall, -/area/medical/genetics) -"aBf" = ( -/obj/machinery/door/airlock/research{ - name = "Genetics Research Access"; - req_access_txt = "9" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aBg" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/research) -"aBh" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Departures Wing 2"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"aBi" = ( -/turf/closed/wall, -/area/science/robotics/mechbay) -"aBj" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/robotics/mechbay) -"aBk" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/eastleft{ - name = "Robotics Desk"; - req_access_txt = "29" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "roboticsprivacy"; - name = "robotics privacy shutters" - }, -/turf/open/floor/plating, -/area/science/robotics/lab) -"aBl" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/science/robotics/mechbay) -"aBm" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/robotics/mechbay) -"aBn" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/science/robotics/mechbay) -"aBo" = ( -/turf/closed/wall/r_wall, -/area/science/robotics/mechbay) -"aBp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aBq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"aBr" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/bridge) -"aBs" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/sign/departments/science{ - pixel_x = -32 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aBt" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio3"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"aBu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"aBv" = ( -/obj/machinery/door/airlock/research{ - name = "Xenobiology Lab"; - req_access_txt = "55" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"aBw" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/port) -"aBx" = ( -/turf/open/floor/plating, -/area/maintenance/port/aft) -"aBy" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"aBz" = ( -/obj/effect/turf_decal/tile/red, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aBA" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aBB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/vacant_room/commissary) -"aBC" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/fore) -"aBD" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aBE" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aBF" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aBG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/fore) -"aBH" = ( -/obj/machinery/rnd/production/techfab/department/service, -/obj/item/stack/sheet/mineral/copper{ - amount = 5 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aBJ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"aBL" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "AI Upload Access"; - req_access_txt = "16"; - security_level = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/ai_upload) -"aBM" = ( -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai_upload) -"aBN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"aBO" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aBP" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aBQ" = ( -/obj/machinery/camera{ - c_tag = "Research - Xenobiology Cell 3"; - dir = 2; - network = list("ss13","Research","Xenobiology") - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"aBR" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/sign/departments/security{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aBS" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 8 - }, -/area/medical/genetics) -"aBT" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aBU" = ( -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aBV" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aBW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/tcommsat/computer) -"aBX" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/item/stack/sheet/iron{ - amount = 6 - }, -/obj/item/stack/rods{ - amount = 6 - }, -/obj/item/circuitboard/machine/paystand, -/obj/item/circuitboard/machine/paystand, -/turf/open/floor/plasteel, -/area/vacant_room/commissary) -"aBY" = ( -/turf/closed/wall/r_wall, -/area/tcommsat/server) -"aBZ" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Prison Wing"; - req_access_txt = "2" - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aCa" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/space/basic, -/area/space/nearstation) -"aCb" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/tcommsat/server) -"aCc" = ( -/obj/machinery/recharge_station, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) -"aCd" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"aCe" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/table, -/obj/structure/bedsheetbin, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/fitness/recreation) -"aCf" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Toxins Maintenance Access"; - req_one_access_txt = "7" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"aCg" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"aCh" = ( -/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/tile/neutral, -/obj/machinery/door/window/eastleft, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"aCi" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_x = -26 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aCj" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/tinted, -/obj/structure/window/reinforced/tinted{ - dir = 1 - }, -/obj/structure/window/reinforced/tinted{ - dir = 8 - }, -/turf/open/floor/plating, -/area/crew_quarters/dorms) -"aCk" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/tcommsat/server) -"aCl" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/tcommsat/server) -"aCm" = ( -/obj/machinery/telecomms/processor/preset_three, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/tcommsat/server) -"aCn" = ( -/obj/machinery/vending/clothing, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aCo" = ( -/turf/open/floor/plating, -/area/crew_quarters/fitness/recreation) -"aCp" = ( -/turf/open/floor/plasteel/dark/telecomms, -/area/tcommsat/server) -"aCq" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/space/nearstation) -"aCr" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/tcommsat/server) -"aCs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aCt" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/fore) -"aCu" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/space/basic, -/area/space/nearstation) -"aCv" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/tcommsat/server) -"aCw" = ( -/obj/machinery/telecomms/receiver/preset_right, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/tcommsat/server) -"aCx" = ( -/obj/machinery/telecomms/processor/preset_one, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/tcommsat/server) -"aCy" = ( -/obj/machinery/telecomms/bus/preset_three, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/tcommsat/server) -"aCz" = ( -/turf/closed/wall/r_wall, -/area/ai_monitored/storage/eva) -"aCA" = ( -/obj/machinery/shower{ - dir = 1 - }, -/obj/item/soap/nanotrasen, -/turf/open/floor/plasteel/freezer, -/area/security/prison) -"aCB" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/ai_monitored/storage/eva) -"aCC" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"aCD" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/maintenance/fore) -"aCE" = ( -/obj/structure/rack, -/obj/item/tank/jetpack/carbondioxide, -/obj/item/tank/jetpack/carbondioxide{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"aCF" = ( -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/tcommsat/server) -"aCG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/tcommsat/server) -"aCH" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/tcommsat/server) -"aCI" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/brig) -"aCJ" = ( -/obj/machinery/telecomms/bus/preset_one, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/tcommsat/server) -"aCK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"aCL" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/space/basic, -/area/space/nearstation) -"aCM" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate{ - name = "Reinforced Materials Crate" - }, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/obj/item/stack/sheet/rglass{ - amount = 50 - }, -/obj/item/stack/sheet/iron/fifty, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/storage/eva) -"aCN" = ( -/obj/structure/closet/crate/rcd, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/storage/eva) -"aCO" = ( -/obj/machinery/camera{ - c_tag = "Research - Server Room"; - dir = 2; - network = list("ss13","Research") - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/science/server) -"aCP" = ( -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel/dark, -/area/bridge) -"aCQ" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"aCR" = ( -/obj/structure/table, -/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/firstaid/regular, -/obj/item/storage/firstaid/toxin{ - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/plasteel, -/area/bridge) -"aCS" = ( -/turf/closed/wall/r_wall, -/area/crew_quarters/heads/captain) -"aCT" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/circuit/telecomms, -/area/science/xenobiology) -"aCU" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aCV" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"aCW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"aCX" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/effect/landmark/start/scientist, -/turf/open/floor/plasteel/white, -/area/science/explab) -"aCY" = ( -/obj/machinery/door/airlock/research{ - name = "Genetics Research Access"; - req_access_txt = "47" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/research) -"aCZ" = ( -/obj/machinery/power/apc{ - areastring = "/area/science/server"; - dir = 4; - name = "Research Servers APC"; - pixel_x = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel/dark, -/area/science/server) -"aDa" = ( -/obj/item/assembly/timer{ - pixel_x = 5; - pixel_y = 4 - }, -/obj/item/assembly/timer{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/assembly/timer{ - pixel_x = 6; - pixel_y = -4 - }, -/obj/item/assembly/timer, -/obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"aDb" = ( -/obj/effect/spawner/lootdrop/crate_spawner, -/turf/open/floor/plating, -/area/maintenance/fore) -"aDc" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10; 13" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/solar/starboard) -"aDd" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall, -/area/solar/starboard) -"aDe" = ( -/obj/machinery/door/airlock/engineering{ - name = "Starboard Aux Solar Access"; - req_access_txt = "10" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/solar/starboard) -"aDg" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aDh" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aDj" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aDk" = ( -/obj/structure/sign/poster/official/bless_this_spess{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/chapel, -/area/chapel/main) -"aDl" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aDm" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aDn" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aDo" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/hallway/primary/central) -"aDp" = ( -/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 = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aDq" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/pump, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/hallway/primary/central) -"aDs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - 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/structure/chair{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"aDv" = ( -/obj/structure/closet/crate, -/obj/item/kitchen/fork, -/obj/item/kitchen/fork, -/obj/item/trash/plate, -/obj/item/clothing/head/bowler, -/turf/open/floor/plating, -/area/maintenance/port) -"aDw" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"aDx" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"aDy" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"aDz" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"aDA" = ( -/obj/machinery/atmospherics/pipe/simple, -/obj/machinery/meter, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"aDB" = ( -/obj/machinery/atmospherics/pipe/simple, -/obj/machinery/meter{ - name = "Mixed Air Tank In" - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"aDC" = ( -/obj/machinery/atmospherics/pipe/simple, -/obj/machinery/meter{ - name = "Mixed Air Tank Out" - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"aDD" = ( -/obj/machinery/air_sensor/atmos/nitrogen_tank, -/turf/open/floor/engine/n2{ - initial_gas_mix = "n2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"aDE" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/air_input{ - dir = 1 - }, -/turf/open/floor/engine/airless, -/area/engine/atmos) -"aDF" = ( -/obj/machinery/air_sensor/atmos/air_tank, -/turf/open/floor/engine/airless, -/area/engine/atmos) -"aDG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output{ - dir = 1 - }, -/turf/open/floor/engine/airless, -/area/engine/atmos) -"aDH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrogen_output{ - dir = 1 - }, -/turf/open/floor/engine/n2{ - initial_gas_mix = "n2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"aDI" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/oxygen_input{ - dir = 1 - }, -/turf/open/floor/engine/o2{ - initial_gas_mix = "o2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"aDJ" = ( -/obj/machinery/air_sensor/atmos/oxygen_tank, -/turf/open/floor/engine/o2{ - initial_gas_mix = "o2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"aDK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/oxygen_output{ - dir = 1 - }, -/turf/open/floor/engine/o2{ - initial_gas_mix = "o2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"aDL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aDM" = ( -/obj/machinery/light/small, -/obj/machinery/camera{ - c_tag = "Atmospherics - Air Mix Tank"; - dir = 1; - network = list("ss13","Atmospherics") - }, -/turf/open/floor/engine/airless, -/area/engine/atmos) -"aDO" = ( -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; - req_access_txt = "47" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"aDP" = ( -/turf/open/floor/plasteel, -/area/security/processing) -"aDQ" = ( -/turf/closed/wall/r_wall, -/area/security/processing) -"aDR" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restroom" - }, -/turf/open/floor/plasteel/freezer, -/area/security/prison) -"aDS" = ( -/obj/structure/toilet, -/turf/open/floor/plasteel/freezer, -/area/security/prison) -"aDT" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/security/prison) -"aDU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aDV" = ( -/turf/closed/wall, -/area/security/main) -"aDW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"aDX" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "briginteralshutter"; - name = "Warden Lockdown Shutter" - }, -/turf/open/floor/plating, -/area/security/warden) -"aDY" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/item/reagent_containers/blood, -/turf/open/floor/plasteel/white, -/area/security/brig) -"aDZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/security/brig) -"aEa" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/computer/operating{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/security/brig) -"aEb" = ( -/turf/closed/wall, -/area/security/processing) -"aEc" = ( -/obj/machinery/computer/security/labor{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"aEd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aEe" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/turf/open/floor/plasteel/freezer, -/area/security/prison) -"aEf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/door/window/brigdoor/westleft{ - id = "Cell 1"; - name = "Cell 1"; - req_access_txt = "1" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aEg" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/dirt, -/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 - }, -/obj/machinery/camera{ - c_tag = "Security Perma - Cell 2"; - dir = 4; - network = list("ss13","Security","Prison") - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aEh" = ( -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aEi" = ( -/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 = -2; - pixel_y = -2 - }, -/obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/camera{ - c_tag = "Research - Toxins Main 1"; - dir = 8; - network = list("ss13","Research") - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"aEj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/light/small, -/turf/open/floor/plasteel, -/area/security/brig) -"aEk" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aEl" = ( -/obj/structure/rack, -/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 - }, -/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/item/storage/box/flashbangs{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) -"aEm" = ( -/obj/structure/closet/bombcloset/security, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aEn" = ( -/obj/structure/closet/secure_closet/security/sec, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aEo" = ( -/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 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plasteel{ - dir = 2 - }, -/area/ai_monitored/security/armory) -"aEp" = ( -/obj/structure/table/glass, -/obj/machinery/computer/med_data/laptop, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/security/brig) -"aEq" = ( -/turf/open/floor/plasteel/white, -/area/security/brig) -"aEr" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/table/optable, -/turf/open/floor/plasteel/white, -/area/security/brig) -"aEs" = ( -/obj/machinery/computer/prisoner/gulag_teleporter_computer{ - dir = 4 - }, -/obj/machinery/gulag_item_reclaimer{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"aEt" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"aEv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aEw" = ( -/turf/closed/wall, -/area/medical/storage) -"aEx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"aEy" = ( -/obj/machinery/mech_bay_recharge_port, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) -"aEz" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "robo2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"aEA" = ( -/turf/open/floor/circuit, -/area/science/robotics/mechbay) -"aEB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"aEC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"aED" = ( -/turf/closed/wall/r_wall, -/area/bridge) -"aEE" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/shaker, -/obj/structure/sign/poster/official/twelve_gauge{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"aEF" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aEG" = ( -/obj/structure/table/wood, -/obj/item/folder/red, -/obj/item/stamp/hos, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"aEH" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"aEI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aEJ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/hallway/secondary/exit/departure_lounge) -"aEK" = ( -/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 - }, -/obj/item/shield/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/shield/riot, -/obj/item/shield/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/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/camera/motion{ - c_tag = "Security - Armory"; - dir = 8; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) -"aEL" = ( -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"aEM" = ( -/obj/structure/rack, -/obj/item/gun/energy/disabler{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/gun/energy/disabler, -/obj/item/gun/energy/disabler{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plasteel{ - dir = 2 - }, -/area/ai_monitored/security/armory) -"aEN" = ( -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"aEO" = ( -/obj/machinery/suit_storage_unit/captain, -/obj/structure/window/reinforced, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"aEP" = ( -/obj/machinery/shieldwallgen/xenobiologyaccess, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/science/xenobiology) -"aEQ" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/science/server) -"aER" = ( -/mob/living/carbon/monkey, -/turf/open/floor/plasteel/white/corner{ - dir = 8 - }, -/area/medical/genetics) -"aES" = ( -/obj/structure/table, -/obj/item/gun/energy/laser/practice, -/obj/machinery/syndicatebomb/training, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aET" = ( -/obj/structure/table/wood, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/carpet, -/area/library/lounge) -"aEU" = ( -/obj/machinery/dna_scannernew, -/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 = 24 - }, -/obj/machinery/camera{ - c_tag = "Medical - Genetics"; - dir = 2; - network = list("ss13","Medical") - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aEV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aEW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/research) -"aEX" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/obj/machinery/newscaster{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/science) -"aEY" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/rxglasses, -/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/storage) -"aEZ" = ( -/obj/machinery/holopad, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"aFa" = ( -/obj/structure/chair/comfy/black{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"aFb" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"aFc" = ( -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "hopqueue"; - name = "HoP Queue Shutters" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/hop) -"aFd" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/requests_console{ - announcementConsole = 1; - department = "Bridge"; - departmentType = 5; - name = "Bridge RC"; - pixel_x = -30 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"aFe" = ( -/obj/machinery/atmospherics/pipe/simple{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/science/server) -"aFf" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/noticeboard{ - pixel_y = 28 - }, -/turf/open/floor/plasteel, -/area/security/main) -"aFg" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aFh" = ( -/obj/machinery/requests_console{ - announcementConsole = 0; - department = "Medbay"; - departmentType = 1; - name = "Medbay RC"; - pixel_y = 30 - }, -/obj/machinery/camera{ - c_tag = "Medical - Front Lobby"; - dir = 2; - network = list("ss13","Medical") - }, -/mob/living/simple_animal/bot/cleanbot{ - name = "C.L.E.A.N." - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aFi" = ( -/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/vending/cola/random, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aFj" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/white/side{ - dir = 5 - }, -/area/science/research) -"aFk" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aFl" = ( -/obj/structure/table, -/obj/item/storage/firstaid/toxin{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/firstaid/toxin, -/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{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aFm" = ( -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aFn" = ( -/obj/structure/table, -/obj/item/storage/firstaid/brute{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/firstaid/brute, -/obj/item/storage/firstaid/regular{ - 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/storage) -"aFo" = ( -/obj/machinery/computer/mech_bay_power_console, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) -"aFp" = ( -/obj/machinery/computer/arcade, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"aFq" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"aFr" = ( -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel/white, -/area/security/brig) -"aFs" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/security/brig) -"aFu" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/obj/effect/landmark/start/captain, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"aFv" = ( -/obj/machinery/computer/card{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"aFw" = ( -/obj/machinery/door/airlock/command{ - name = "Server Room"; - req_access_txt = "30" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/science/server) -"aFx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/brig{ - id = "Cell 1"; - name = "Cell 1 Locker" - }, -/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 = -2; - pixel_y = 25; - prison_radio = 1 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aFy" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = 28 - }, -/turf/open/floor/plasteel/white/side{ - dir = 10 - }, -/area/science/research) -"aFz" = ( -/turf/closed/wall, -/area/solar/starboard) -"aFA" = ( -/obj/structure/table, -/obj/item/storage/firstaid/o2{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/firstaid/o2, -/obj/item/storage/firstaid/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aFB" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"aFC" = ( -/obj/structure/table, -/obj/item/storage/firstaid/fire{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/firstaid/fire, -/obj/item/storage/firstaid/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/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/storage) -"aFD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"aFE" = ( -/obj/vehicle/ridden/secway, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, -/area/bridge) -"aFF" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/flasher{ - id = "hopflash"; - pixel_y = -28 - }, -/obj/machinery/light, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/hop) -"aFG" = ( -/obj/structure/table/wood, -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/mirror{ - pixel_x = -28 - }, -/obj/item/lipstick/random{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/item/lipstick/random, -/obj/machinery/camera{ - c_tag = "Service - Theatre Backroom"; - dir = 4; - network = list("ss13","Bar Area") - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aFH" = ( -/obj/structure/closet/l3closet/scientist, -/obj/item/extinguisher, -/obj/machinery/light_switch{ - pixel_x = 24 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"aFI" = ( -/obj/machinery/door/airlock{ - name = "Biohazard Cleanup" - }, -/turf/open/floor/plating, -/area/science/research) -"aFK" = ( -/obj/machinery/vending/wardrobe/gene_wardrobe, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aFL" = ( -/obj/structure/table, -/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/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aFM" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/medicine, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/item/reagent_containers/spray/cleaner, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aFN" = ( -/turf/closed/wall, -/area/medical/genetics/cloning) -"aFO" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/medical/genetics/cloning) -"aFP" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/medical/genetics/cloning) -"aFQ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/medical/genetics/cloning) -"aFR" = ( -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"aFS" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/medical/genetics/cloning) -"aFT" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/medical/genetics) -"aFU" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/medical/genetics) -"aFV" = ( -/obj/machinery/rnd/production/techfab/department/medical, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aFW" = ( -/obj/machinery/gulag_teleporter, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"aFX" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/security/processing) -"aFY" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/security/brig) -"aFZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"aGa" = ( -/obj/effect/landmark/secequipment, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aGb" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/item/storage/firstaid/regular{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/firstaid/regular, -/obj/item/reagent_containers/glass/bottle/charcoal, -/obj/item/reagent_containers/glass/bottle/epinephrine, -/obj/item/reagent_containers/syringe, -/turf/open/floor/plasteel/white, -/area/security/brig) -"aGc" = ( -/obj/structure/table, -/obj/item/storage/box/hug, -/obj/item/razor{ - pixel_x = -6 - }, -/obj/machinery/camera{ - c_tag = "Security - Prison Hall"; - dir = 4; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aGd" = ( -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"aGe" = ( -/obj/machinery/vending/wardrobe/medi_wardrobe, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aGf" = ( -/obj/machinery/dna_scannernew, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"aGg" = ( -/obj/machinery/computer/cloning, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"aGh" = ( -/obj/machinery/clonepod/prefilled, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"aGi" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/medical/genetics/cloning) -"aGj" = ( -/obj/structure/bed/roller, -/obj/effect/turf_decal/bot, -/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) -"aGk" = ( -/obj/structure/bed/roller, -/obj/effect/turf_decal/bot, -/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) -"aGl" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/medical/storage) -"aGm" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/medical/storage) -"aGn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aGo" = ( -/turf/closed/wall, -/area/medical/medbay/lobby) -"aGp" = ( -/obj/machinery/door/airlock/research{ - name = "Experimentation Lab"; - req_access_txt = "47" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"aGq" = ( -/obj/structure/chair/stool, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/landmark/start/scientist, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"aGr" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/medical/genetics/cloning) -"aGs" = ( -/obj/structure/bed/roller, -/obj/effect/turf_decal/bot, -/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) -"aGt" = ( -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aGu" = ( -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aGv" = ( -/obj/machinery/computer/med_data, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aGw" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Genetics Research"; - req_access_txt = "5; 9; 68" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"aGx" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aGz" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/medical/medbay/lobby) -"aGA" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"aGB" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aGC" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/effect/landmark/start/research_director, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"aGD" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"aGE" = ( -/turf/closed/wall/r_wall, -/area/medical/virology) -"aGF" = ( -/obj/structure/closet/secure_closet/medical3, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/requests_console{ - announcementConsole = 0; - department = "Medbay"; - departmentType = 1; - name = "Medbay RC"; - pixel_y = 30 - }, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aGH" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aGI" = ( -/obj/structure/closet/wardrobe/white, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"aGK" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/medical/genetics/cloning) -"aGL" = ( -/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) -"aGM" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/medical_cloning{ - pixel_y = 6 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/machinery/requests_console{ - department = "Genetics"; - departmentType = 0; - name = "Genetics Requests Console"; - pixel_y = -30 - }, -/obj/machinery/camera{ - c_tag = "Medical - Cloning Bay"; - dir = 1; - network = list("ss13","Medical") - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"aGN" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets{ - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aGO" = ( -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aGP" = ( -/obj/structure/bed, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aGQ" = ( -/turf/closed/wall, -/area/medical/sleeper) -"aGR" = ( -/turf/closed/wall, -/area/medical/cryo) -"aGS" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemistryshutter"; - name = "Chemistry Privacy Shutters" - }, -/turf/open/floor/plating, -/area/medical/chemistry) -"aGT" = ( -/turf/closed/wall, -/area/security/checkpoint/medical) -"aGU" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemistryshutter"; - name = "Chemistry Privacy Shutters" - }, -/turf/open/floor/plating, -/area/medical/chemistry) -"aGV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aGW" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"aGX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/sorting/mail{ - name = "sorting disposal pipe (Research)"; - sortTypes = list(12,24,25) - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aGY" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aGZ" = ( -/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/lobby) -"aHa" = ( -/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) -"aHb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/research) -"aHc" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/medical/medbay/lobby) -"aHd" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/medical/medbay/lobby) -"aHe" = ( -/obj/structure/table, -/obj/machinery/button/door{ - id = "Biohazard"; - name = "Biohazard Shutter Control"; - pixel_x = -5; - pixel_y = 5; - req_access_txt = "47" - }, -/obj/machinery/button/door{ - id = "rnd2"; - name = "Research Lab Shutter Control"; - pixel_x = 5; - pixel_y = 5; - req_access_txt = "47" - }, -/obj/item/toy/figure/rd, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"aHf" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/medical/virology) -"aHg" = ( -/obj/effect/landmark/start/roboticist, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"aHh" = ( -/obj/machinery/iv_drip, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aHi" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aHj" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aHk" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/medical/sleeper) -"aHm" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell, -/turf/open/floor/plasteel, -/area/medical/cryo) -"aHn" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemistryshutter"; - name = "Chemistry Privacy Shutters" - }, -/turf/open/floor/plating, -/area/medical/chemistry) -"aHo" = ( -/obj/structure/table, -/obj/item/circular_saw, -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"aHp" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/medical/cryo) -"aHq" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"aHs" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "medicalcheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/medical) -"aHt" = ( -/obj/structure/filingcabinet/chestdrawer, -/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/checkpoint/medical) -"aHu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"aHv" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/carpet, -/area/library/lounge) -"aHw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/sorting/mail{ - name = "sorting disposal pipe (Research Director)"; - sortType = 13 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aHx" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/medical/virology) -"aHy" = ( -/obj/structure/closet/l3closet, -/obj/effect/turf_decal/delivery, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aHA" = ( -/obj/machinery/disposal/bin, -/obj/machinery/newscaster/security_unit{ - pixel_y = -32 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"aHB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) -"aHC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aHD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 10 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Gas to Mix" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"aHE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aHF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aHG" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aHH" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aHI" = ( -/obj/machinery/computer/secure_data{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"aHJ" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"aHK" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/machinery/camera{ - c_tag = "Medical - Virology Backroom"; - dir = 2; - network = list("ss13","Medical") - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aHL" = ( -/obj/effect/spawner/lootdrop/crate_spawner, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aHM" = ( -/obj/effect/turf_decal/tile/red, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aHN" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/medical/medbay/lobby) -"aHO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aHP" = ( -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/medical/sleeper) -"aHQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/effect/landmark/start/medical_doctor, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aHT" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"aHV" = ( -/obj/machinery/vending/medical{ - pixel_x = -2 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aHW" = ( -/turf/closed/wall, -/area/medical/chemistry) -"aHY" = ( -/obj/machinery/smartfridge/chemistry/preloaded, -/turf/closed/wall, -/area/medical/chemistry) -"aHZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aIa" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"aIb" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/medical/virology) -"aIc" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aId" = ( -/obj/machinery/vending/medical, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aIe" = ( -/obj/machinery/vending/wardrobe/viro_wardrobe, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aIg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/medical/cryo) -"aIh" = ( -/obj/structure/table, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) -"aIi" = ( -/obj/structure/table/reinforced, -/obj/item/wrench/medical, -/turf/open/floor/plasteel, -/area/medical/cryo) -"aIj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/computer/security/telescreen{ - name = "Isolation Viewing Monitor"; - network = list("Virology"); - pixel_y = 32 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aIk" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1; - name = "Connector Port (Air Supply)" - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plasteel, -/area/medical/cryo) -"aIl" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/medical/cryo) -"aIn" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aIo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aIp" = ( -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aIr" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/landmark/start/depsec/science, -/turf/open/floor/plasteel, -/area/security/checkpoint/science) -"aIt" = ( -/obj/machinery/chem_master, -/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/button/door{ - id = "chemistryshutter"; - name = "Chemistry Privacy Toggle"; - pixel_x = 8; - pixel_y = 28 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aIu" = ( -/turf/closed/wall/r_wall, -/area/medical/sleeper) -"aIv" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/medical/cryo) -"aIw" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/medical/cryo) -"aIx" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aIy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aIz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/external{ - name = "AISat External Access"; - req_one_access_txt = "32;19" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"aIA" = ( -/obj/machinery/chem_master, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/button/door{ - id = "chemistryshutter"; - name = "Chemistry Privacy Toggle"; - pixel_x = -8; - pixel_y = 28 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aIB" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aIC" = ( -/obj/machinery/chem_dispenser, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aID" = ( -/obj/machinery/chem_dispenser, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aIE" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"aIF" = ( -/obj/structure/table, -/obj/machinery/camera{ - c_tag = "Medical - Virology Isolation B"; - dir = 2; - network = list("ss13","Medical","Virology") - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aII" = ( -/obj/machinery/smartfridge/chemistry, -/turf/closed/wall, -/area/medical/chemistry) -"aIJ" = ( -/obj/machinery/chem_heater, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aIK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aIL" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay Storage"; - req_access_txt = "5" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aIM" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aIN" = ( -/obj/structure/chair/stool, -/obj/effect/landmark/start/roboticist, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"aIQ" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/medical/cryo) -"aIR" = ( -/obj/machinery/vending/wardrobe/chem_wardrobe, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aIS" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor{ - id = "Secure Storage"; - name = "Engineering Secure Storage" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"aIT" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aIU" = ( -/obj/machinery/computer/pandemic, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/light, -/obj/item/radio/intercom{ - pixel_y = -28 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aIV" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aIW" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aIX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aIY" = ( -/turf/closed/wall, -/area/medical/surgery) -"aIZ" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Surgery Observation" - }, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"aJa" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aJb" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white/side, -/area/medical/sleeper) -"aJc" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/construction/mining/aux_base) -"aJd" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Morgue Maintenance"; - req_access_txt = "0"; - req_one_access_txt = "6;20" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard) -"aJe" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aJf" = ( -/obj/structure/closet/secure_closet/chemical, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aJg" = ( -/obj/structure/cable/yellow{ - 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/research) -"aJh" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/newscaster{ - pixel_x = -30 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aJi" = ( -/obj/structure/chair, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"aJj" = ( -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"aJk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/sorting/mail{ - name = "sorting disposal pipe (Xenobiology)"; - sortType = 28 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aJl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/sorting/mail{ - name = "sorting disposal pipe (Medical)"; - sortType = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aJm" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/disposalpipe/sorting/mail{ - name = "sorting disposal pipe (Genetics)"; - sortType = 23 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aJn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/medical/sleeper) -"aJo" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aJp" = ( -/turf/closed/wall, -/area/crew_quarters/heads/cmo) -"aJq" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/medical/sleeper) -"aJr" = ( -/obj/structure/sign/warning/deathsposal, -/obj/structure/disposalpipe/segment, -/turf/closed/wall/r_wall, -/area/medical/virology) -"aJs" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall/r_wall, -/area/medical/virology) -"aJt" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"aJu" = ( -/obj/machinery/camera{ - c_tag = "Research - Xenobiology Cell 2"; - dir = 2; - network = list("ss13","Research","Xenobiology") - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"aJv" = ( -/turf/closed/wall, -/area/medical/patients_rooms/room_a) -"aJw" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/vending/wallmed{ - pixel_y = 28 - }, -/turf/open/floor/plasteel/white, -/area/medical/patients_rooms/room_a) -"aJx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aJy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aJz" = ( -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay"; - req_access_txt = "5" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aJA" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/computer/crew{ - dir = 4 - }, -/obj/machinery/keycard_auth{ - pixel_x = -24 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"aJB" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"aJC" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/table/glass, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/neck/stethoscope, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"aJD" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/computer/card/minor/cmo{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"aJE" = ( -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/medical/genetics) -"aJF" = ( -/turf/closed/wall, -/area/medical/medbay/central) -"aJG" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/machinery/light, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aJH" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/eastleft{ - name = "Chemistry Desk"; - req_access_txt = "33" - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aJI" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/medical/surgery) -"aJJ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/medical/surgery) -"aJK" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/medical/surgery) -"aJL" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/computer/med_data{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"aJM" = ( -/obj/structure/closet/crate, -/obj/item/storage/toolbox/artistic, -/turf/open/floor/plating, -/area/maintenance/fore) -"aJN" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plating, -/area/medical/cryo) -"aJO" = ( -/obj/structure/table, -/obj/item/toy/figure/captain, -/turf/open/floor/carpet, -/area/bridge) -"aJP" = ( -/obj/structure/table/glass, -/turf/open/floor/plasteel, -/area/medical/surgery) -"aJQ" = ( -/obj/structure/table/glass, -/turf/open/floor/plasteel/white/side{ - dir = 2 - }, -/area/medical/surgery) -"aJR" = ( -/obj/structure/table/glass, -/obj/item/storage/backpack/duffelbag/med/surgery, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"aJS" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/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_x = -32 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"aJT" = ( -/turf/closed/wall, -/area/medical/patients_rooms/room_b) -"aJU" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/vending/wallmed{ - pixel_y = 28 - }, -/turf/open/floor/plasteel/white, -/area/medical/patients_rooms/room_b) -"aJV" = ( -/obj/structure/closet/l3closet, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aJW" = ( -/turf/open/floor/plasteel/white/corner{ - dir = 4 - }, -/area/medical/genetics) -"aJX" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aJY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aJZ" = ( -/obj/structure/table/glass, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/medical/surgery) -"aKa" = ( -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"aKb" = ( -/obj/structure/table/glass, -/obj/item/book/manual/wiki/surgery, -/obj/item/razor, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/medical/surgery) -"aKc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aKd" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/closet/secure_closet/CMO, -/obj/machinery/light, -/obj/item/statuebust/hippocratic, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"aKe" = ( -/obj/machinery/processor/slime, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"aKf" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/machinery/light_switch{ - pixel_y = -24 - }, -/turf/open/floor/plasteel/white, -/area/medical/patients_rooms/room_a) -"aKg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aKh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aKi" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/dark, -/area/bridge) -"aKj" = ( -/obj/machinery/smartfridge/organ, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/medical/surgery) -"aKk" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"aKl" = ( -/obj/structure/closet/crate/freezer/surplus_limbs, -/obj/item/reagent_containers/glass/beaker/synthflesh, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/medical/surgery) -"aKm" = ( -/obj/structure/bed, -/obj/machinery/camera{ - c_tag = "Medical - Virology Isolation A"; - dir = 2; - network = list("ss13","Medical","Virology") - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aKn" = ( -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/medical/surgery) -"aKo" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/blood, -/obj/item/reagent_containers/blood, -/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/APlus, -/obj/item/reagent_containers/blood/random, -/turf/open/floor/plasteel, -/area/medical/surgery) -"aKp" = ( -/obj/machinery/door/window/southleft{ - name = "Genetics Pen"; - req_access_txt = "9" - }, -/mob/living/carbon/monkey, -/turf/open/floor/plasteel, -/area/medical/genetics) -"aKq" = ( -/obj/structure/table/wood, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/obj/item/toy/figure/hop, -/obj/item/toy/figure/ian{ - pixel_x = 5 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hop) -"aKr" = ( -/obj/structure/table/wood, -/obj/item/instrument/violin, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"aKs" = ( -/obj/structure/table/wood, -/obj/item/instrument/guitar, -/obj/item/instrument/eguitar{ - pixel_x = 5 - }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"aKt" = ( -/obj/machinery/door/airlock{ - name = "Theatre Backstage"; - req_access_txt = "46" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aKu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aKv" = ( -/obj/structure/table/wood, -/obj/machinery/recharger, -/obj/structure/sign/poster/official/ian{ - pixel_y = 32 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hop) -"aKw" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/patients_rooms/room_a) -"aKx" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/obj/machinery/keycard_auth{ - pixel_x = -24 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hop) -"aKy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hop) -"aKz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"aKA" = ( -/obj/structure/table/wood, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hop) -"aKB" = ( -/obj/structure/bed, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/effect/landmark/start/head_of_personnel, -/obj/item/bedsheet/hop, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hop) -"aKC" = ( -/obj/structure/table/wood, -/obj/item/toy/figure/curator, -/turf/open/floor/engine/cult, -/area/library) -"aKD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hop) -"aKE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hop) -"aKF" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = -5; - pixel_y = 30 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"aKG" = ( -/obj/structure/closet/wardrobe/white, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aKH" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/crew_quarters/fitness/recreation) -"aKI" = ( -/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/tile/neutral, -/obj/machinery/door/window/westright, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"aKJ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aKK" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"aKL" = ( -/obj/structure/closet/wardrobe/mixed, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aKM" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aKN" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aKO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aKP" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/tinted, -/obj/structure/window/reinforced/tinted{ - dir = 1 - }, -/obj/structure/window/reinforced/tinted{ - dir = 4 - }, -/turf/open/floor/plating, -/area/crew_quarters/dorms) -"aKQ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"aKR" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aKS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aKT" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aKU" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"aKV" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aKW" = ( -/obj/machinery/computer/arcade, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aKX" = ( -/obj/machinery/computer/arcade, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/obj/structure/sign/poster/official/soft_cap_pop_art{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aKY" = ( -/obj/structure/closet/wardrobe/grey, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aLb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aLc" = ( -/obj/structure/closet/wardrobe/black, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aLd" = ( -/obj/structure/closet/emcloset, -/obj/machinery/button/door{ - id = "podescape"; - name = "Pod Bay Control"; - normaldoorcontrol = 0; - pixel_x = 8; - pixel_y = 24 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"aLe" = ( -/obj/structure/closet/lasertag/red, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aLf" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aLg" = ( -/obj/structure/closet/secure_closet/contraband/armory, -/obj/effect/spawner/lootdrop/armory_contraband, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) -"aLh" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/hallway/secondary/exit/departure_lounge) -"aLi" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aLj" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aLk" = ( -/obj/machinery/vending/cola/random, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aLl" = ( -/obj/structure/rack, -/obj/item/clothing/shoes/magboots, -/obj/item/clothing/shoes/magboots{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"aLm" = ( -/turf/closed/wall, -/area/library/lounge) -"aLn" = ( -/turf/closed/wall, -/area/library) -"aLo" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"aLp" = ( -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/library/lounge) -"aLq" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Dorms" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aLr" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/library/lounge) -"aLs" = ( -/turf/open/floor/wood, -/area/library) -"aLt" = ( -/turf/open/floor/wood, -/area/library/lounge) -"aLu" = ( -/obj/structure/bookcase/random/fiction, -/turf/open/floor/wood, -/area/library) -"aLv" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod One" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"aLw" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/library) -"aLx" = ( -/obj/structure/bookcase/random/religion, -/turf/open/floor/wood, -/area/library) -"aLy" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/library) -"aLz" = ( -/obj/machinery/vending/games, -/turf/open/floor/wood, -/area/library/lounge) -"aLA" = ( -/obj/structure/filingcabinet, -/turf/open/floor/wood, -/area/library/lounge) -"aLB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/wood, -/area/library) -"aLC" = ( -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/library) -"aLD" = ( -/obj/structure/table/wood, -/obj/machinery/computer/libraryconsole/bookmanagement, -/turf/open/floor/carpet, -/area/library) -"aLE" = ( -/turf/open/floor/carpet, -/area/library) -"aLF" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/library) -"aLG" = ( -/obj/structure/displaycase/trophy, -/turf/open/floor/carpet, -/area/library) -"aLH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/chair/stool, -/obj/effect/landmark/start/roboticist, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"aLI" = ( -/obj/machinery/vending/wardrobe/curator_wardrobe, -/turf/open/floor/engine/cult, -/area/library) -"aLJ" = ( -/obj/structure/bookcase{ - name = "Forbidden Knowledge" - }, -/turf/open/floor/engine/cult, -/area/library) -"aLK" = ( -/obj/machinery/door/airlock/command/glass{ - name = "EVA Storage"; - req_access_txt = "18"; - security_level = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/storage/eva) -"aLL" = ( -/obj/machinery/door/morgue{ - name = "Private Study"; - req_access_txt = "37" - }, -/turf/open/floor/engine/cult, -/area/library) -"aLM" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/landmark/start/librarian, -/turf/open/floor/carpet, -/area/library) -"aLO" = ( -/obj/machinery/libraryscanner, -/turf/open/floor/carpet, -/area/library) -"aLP" = ( -/obj/structure/destructible/cult/tome, -/obj/item/book/codex_gigas, -/turf/open/floor/engine/cult, -/area/library) -"aLQ" = ( -/obj/structure/bookcase/random/reference, -/turf/open/floor/wood, -/area/library) -"aLR" = ( -/obj/structure/bookcase/random/adult, -/turf/open/floor/wood, -/area/library) -"aLS" = ( -/obj/machinery/bookbinder, -/turf/open/floor/wood, -/area/library) -"aLU" = ( -/obj/structure/table/wood, -/obj/item/camera, -/obj/item/camera_film, -/obj/item/camera_film, -/turf/open/floor/engine/cult, -/area/library) -"aLV" = ( -/obj/machinery/vending/cola/random, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/white/side{ - dir = 5 - }, -/area/hallway/secondary/exit/departure_lounge) -"aLW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"aLX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/storage/toolbox/electrical{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/multitool, -/turf/open/floor/plasteel, -/area/construction) -"aLY" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"aLZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"aMa" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/hallway/secondary/exit/departure_lounge) -"aMb" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/entry) -"aMc" = ( -/obj/machinery/vending/cola/random, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/security/prison) -"aMd" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"aMe" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Departures Wing 1"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"aMf" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/exit/departure_lounge) -"aMg" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L2" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"aMh" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"aMi" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L6" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"aMj" = ( -/obj/effect/landmark/observer_start, -/obj/effect/turf_decal/plaque{ - icon_state = "L8" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"aMk" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/hallway/secondary/exit/departure_lounge) -"aMl" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L12" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"aMm" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L14" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"aMn" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"aMo" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"aMp" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"aMq" = ( -/turf/closed/wall, -/area/hydroponics/garden) -"aMr" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/hydroponics/garden) -"aMt" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/hydroponics/garden) -"aMu" = ( -/turf/open/floor/grass, -/area/hydroponics/garden) -"aMv" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/hydroponics/garden) -"aMw" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/hydroponics/garden) -"aMx" = ( -/obj/structure/sink{ - pixel_y = 28 - }, -/turf/open/floor/grass, -/area/hydroponics/garden) -"aMy" = ( -/obj/machinery/hydroponics/constructable, -/turf/open/floor/grass, -/area/hydroponics/garden) -"aMz" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/hydroponics/garden) -"aMA" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/hydroponics/garden) -"aMB" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/hydroponics/garden) -"aMC" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/hydroponics/garden) -"aMD" = ( -/obj/machinery/biogenerator, -/turf/open/floor/grass, -/area/hydroponics/garden) -"aME" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/hydroponics/garden) -"aMF" = ( -/obj/machinery/computer/scan_consolenew, -/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/extinguisher_cabinet{ - pixel_y = 28 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aMG" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/grass, -/area/hydroponics/garden) -"aMH" = ( -/obj/machinery/seed_extractor, -/turf/open/floor/grass, -/area/hydroponics/garden) -"aMI" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/hydroponics/garden) -"aMJ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/hydroponics/garden) -"aML" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/eastright{ - name = "Armory Desk"; - req_access_txt = "3" - }, -/obj/machinery/door/window/westright{ - name = "Armory Desk"; - req_access_txt = "63" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "briginteralshutter"; - name = "Warden Lockdown Shutter" - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"aMM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"aMN" = ( -/obj/structure/closet/l3closet/security, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aMO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/door/window{ - dir = 4; - name = "Theatre Stage" - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aMP" = ( -/turf/closed/wall/r_wall, -/area/janitor) -"aMQ" = ( -/turf/closed/wall, -/area/janitor) -"aMS" = ( -/obj/effect/landmark/start/librarian, -/turf/open/floor/engine/cult, -/area/library) -"aMT" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/sign/poster/official/pda_ad{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aMU" = ( -/turf/open/floor/plasteel, -/area/janitor) -"aMW" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aMX" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"aMZ" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/bot, -/obj/structure/extinguisher_cabinet{ - pixel_x = 28 - }, -/turf/open/floor/plasteel, -/area/janitor) -"aNa" = ( -/obj/effect/landmark/start/botanist, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"aNd" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aNe" = ( -/obj/structure/janitorialcart, -/obj/item/reagent_containers/glass/bucket, -/obj/item/mop, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/janitor) -"aNf" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Space Access Airlock"; - req_one_access_txt = "32;19" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"aNg" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "aishuttersexternal"; - name = "AI privacy shutters" - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"aNh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"aNi" = ( -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/aisat/foyer) -"aNj" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "aishuttersexternal"; - name = "AI privacy shutters" - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"aNk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/obj/machinery/button/door{ - id = "permabolt3"; - name = "Cell Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 25; - specialfunctions = 4 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aNl" = ( -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"aNn" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "aishuttersexternal"; - name = "AI privacy shutters" - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"aNo" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Space Access Airlock"; - req_one_access_txt = "32;19" - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"aNp" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "aishuttersexternal"; - name = "AI privacy shutters" - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"aNq" = ( -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"aNs" = ( -/obj/machinery/computer/teleporter{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"aNt" = ( -/obj/machinery/power/emitter, -/obj/machinery/camera{ - c_tag = "Engineering - Secure Storage"; - dir = 4; - network = list("ss13","Engineering","Engine") - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"aNu" = ( -/obj/machinery/teleport/hub, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"aNv" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"aNw" = ( -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai) -"aNy" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/space/basic, -/area/space/nearstation) -"aNz" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/space/nearstation) -"aNA" = ( -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) -"aNB" = ( -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) -"aNC" = ( -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"aND" = ( -/obj/machinery/recharge_station, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/service) -"aNE" = ( -/obj/machinery/door/airlock/hatch{ - name = "TeleSat Space Access Airlock"; - req_one_access_txt = "32;19" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/tcommsat/computer) -"aNF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/tcommsat/computer) -"aNG" = ( -/obj/machinery/power/port_gen/pacman, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/service) -"aNH" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai) -"aNI" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai) -"aNJ" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/power/solar_control{ - name = "Western AI Solar Control" - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/space/basic, -/area/space/nearstation) -"aNL" = ( -/obj/structure/closet/secure_closet/security, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"aNM" = ( -/obj/structure/chair/stool, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aNN" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/medical/cryo) -"aNO" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemistryshutter"; - name = "Chemistry Privacy Shutters" - }, -/turf/open/floor/plating, -/area/medical/chemistry) -"aNQ" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/landmark/start/geneticist, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"aNS" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/medical/cryo) -"aNT" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/obj/machinery/door/poddoor/preopen{ - id = "supermatter_external"; - name = "Supermatter External Blast Door" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room/external) -"aNU" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/security/processing) -"aNV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aNW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aNX" = ( -/obj/structure/table, -/obj/machinery/recharger, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aNY" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/processing) -"aNZ" = ( -/turf/open/floor/plating, -/area/security/processing) -"aOa" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/security/brig) -"aOb" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/processing) -"aOc" = ( -/obj/machinery/door/airlock/security{ - name = "Security Office"; - req_access_txt = "1" - }, -/turf/open/floor/plasteel, -/area/security/main) -"aOd" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aOe" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/main) -"aOf" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"aOg" = ( -/obj/machinery/vending/wardrobe/sec_wardrobe, -/obj/machinery/light, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aOh" = ( -/obj/machinery/computer/security, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/main) -"aOi" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aOj" = ( -/obj/structure/table/optable, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating, -/area/maintenance/department/security) -"aOk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "47;12" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) -"aOl" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aOm" = ( -/turf/open/floor/plasteel, -/area/security/main) -"aOn" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aOo" = ( -/obj/structure/table/wood, -/obj/machinery/light, -/obj/item/flashlight/lamp/green, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"aOp" = ( -/turf/closed/wall, -/area/security/courtroom) -"aOq" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/courtroom) -"aOr" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Courtroom" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aOt" = ( -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aOu" = ( -/obj/effect/landmark/start/security_officer, -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/main) -"aOv" = ( -/obj/structure/table, -/obj/item/restraints/handcuffs, -/obj/item/assembly/timer, -/turf/open/floor/plasteel, -/area/security/main) -"aOw" = ( -/obj/structure/table, -/obj/item/radio/off, -/obj/item/screwdriver{ - pixel_y = 10 - }, -/turf/open/floor/plasteel, -/area/security/main) -"aOx" = ( -/obj/effect/landmark/start/security_officer, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/main) -"aOy" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aOz" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aOA" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door_timer{ - id = "Cell 1"; - name = "Cell 1"; - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aOB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aOC" = ( -/obj/structure/table, -/obj/item/assembly/flash/handheld, -/turf/open/floor/plasteel, -/area/security/main) -"aOD" = ( -/obj/structure/table, -/obj/item/folder/red, -/obj/item/pen, -/turf/open/floor/plasteel, -/area/security/main) -"aOE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aOF" = ( -/obj/effect/turf_decal/tile/red, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/security/main) -"aOG" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel, -/area/security/brig) -"aOH" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/security/courtroom) -"aOI" = ( -/turf/open/floor/plasteel, -/area/security/courtroom) -"aOJ" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aOK" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/book/manual/wiki/security_space_law, -/turf/open/floor/plasteel, -/area/security/main) -"aOL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aOM" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/turf/open/floor/plasteel, -/area/security/main) -"aON" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aOO" = ( -/obj/machinery/computer/warrant{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aOP" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aOQ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/courtroom) -"aOR" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/dirt, -/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 - }, -/obj/machinery/camera{ - c_tag = "Security Perma - Cell 1"; - dir = 4; - network = list("ss13","Security","Prison") - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aOS" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aOT" = ( -/obj/machinery/door/window/southleft{ - name = "Court Cell"; - req_access_txt = "2" - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aOU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/obj/machinery/button/door{ - id = "permabolt2"; - name = "Cell Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 25; - specialfunctions = 4 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aOV" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/plasteel, -/area/security/main) -"aOW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aOX" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -3; - pixel_y = 5 - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aOY" = ( -/obj/structure/table/wood, -/turf/open/floor/plasteel, -/area/security/courtroom) -"aOZ" = ( -/obj/machinery/computer/card/minor/hos{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"aPb" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/courtroom) -"aPc" = ( -/obj/machinery/door/airlock/security{ - name = "Brig"; - req_access_txt = "63; 42" - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aPd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aPe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aPf" = ( -/obj/machinery/light/small, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"aPg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/security/courtroom) -"aPh" = ( -/turf/open/floor/plasteel/dark, -/area/security/brig) -"aPi" = ( -/obj/structure/table, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"aPj" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"aPk" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"aPl" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Brig Control"; - req_access_txt = "3"; - security_level = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"aPm" = ( -/obj/machinery/computer/secure_data{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"aPn" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aPo" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aPp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"aPq" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Lockdown" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aPr" = ( -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/door/window/southleft{ - name = "Atmospherics Desk"; - req_access_txt = "24" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Lockdown" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aPs" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aPt" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Lockdown" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aPu" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"aPv" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"aPw" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"aPx" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"aPy" = ( -/obj/structure/table, -/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/tank/internals/emergency_oxygen{ - pixel_x = -8 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = -6; - pixel_y = -2 - }, -/obj/item/clothing/mask/breath{ - pixel_x = 4 - }, -/obj/item/clothing/mask/breath{ - pixel_x = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aPz" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/door_timer{ - id = "Cell 2"; - name = "Cell 2"; - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aPA" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aPB" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/quartermaster/storage) -"aPC" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aPD" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/electrical{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/clothing/gloves/color/yellow, -/obj/item/t_scanner, -/obj/item/multitool, -/turf/open/floor/plating, -/area/storage/tech) -"aPE" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/electrical{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/multitool, -/obj/item/clothing/glasses/meson{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/storage/tech) -"aPF" = ( -/obj/machinery/computer/secure_data{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"aPG" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"aPH" = ( -/obj/effect/landmark/start/shaft_miner, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"aPI" = ( -/obj/structure/closet/secure_closet/miner, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"aPJ" = ( -/obj/structure/table, -/obj/item/folder/blue, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai_upload) -"aPK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"aPL" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aPM" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"aPN" = ( -/obj/machinery/door/airlock{ - name = "Crematorium"; - req_access_txt = "27" - }, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"aPO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aPP" = ( -/obj/machinery/door/airlock/mining{ - req_access_txt = "48" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"aPQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai_upload) -"aPR" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate/freezer, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aPS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - 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/structure/closet/firecloset, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"aPT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai_upload) -"aPU" = ( -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aPV" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate, -/obj/item/toy/figure/cargotech, -/obj/item/toy/figure/cargotech, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aPW" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aPX" = ( -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aPY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai_upload) -"aPZ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aQa" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/turf/open/floor/circuit/telecomms, -/area/science/xenobiology) -"aQb" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/closet/cardboard, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aQc" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aQd" = ( -/obj/effect/landmark/start/cargo_technician, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aQe" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aQf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"aQi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - 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/structure/closet/firecloset, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"aQj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"aQk" = ( -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"aQl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aQm" = ( -/turf/closed/wall, -/area/quartermaster/warehouse) -"aQn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aQo" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"aQp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aQq" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/glowstick, -/obj/effect/spawner/lootdrop/glowstick, -/obj/item/crowbar, -/obj/item/flashlight, -/obj/item/coin/silver, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aQr" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate/medical, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aQs" = ( -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/power/apc{ - areastring = "/area/hallway/secondary/entry"; - dir = 4; - name = "Arrivals APC"; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"aQt" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aQu" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "lawyerprivate"; - name = "privacy shutters" - }, -/turf/open/floor/plating, -/area/lawoffice) -"aQv" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "lawyerprivate"; - name = "privacy shutters" - }, -/turf/open/floor/plating, -/area/lawoffice) -"aQw" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/wood, -/area/lawoffice) -"aQx" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "lawyerprivate"; - name = "privacy shutters" - }, -/turf/open/floor/plating, -/area/lawoffice) -"aQy" = ( -/obj/structure/rack, -/obj/item/storage/briefcase, -/obj/item/storage/briefcase{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/machinery/camera{ - c_tag = "Security - Law Office"; - dir = 4; - network = list("ss13","Security") - }, -/turf/open/floor/wood, -/area/lawoffice) -"aQz" = ( -/obj/structure/window/reinforced, -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/hydroponics) -"aQA" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Hydroponics"; - req_access_txt = "0"; - req_one_access_txt = "35;28" - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"aQB" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aQC" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/hydroponics) -"aQD" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/landmark/start/geneticist, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"aQE" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/fore) -"aQF" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/item/storage/box, -/obj/item/storage/box{ - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aQG" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/landmark/start/atmospheric_technician, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aQH" = ( -/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/atmos) -"aQI" = ( -/turf/open/floor/plating, -/area/maintenance/department/security) -"aQJ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/aft) -"aQK" = ( -/turf/closed/wall, -/area/maintenance/department/security) -"aQL" = ( -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/solar/aft) -"aQM" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aQN" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aQO" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"aQP" = ( -/obj/structure/lattice/catwalk, -/obj/item/stack/cable_coil/random/five, -/turf/open/space/basic, -/area/solar/starboard) -"aQQ" = ( -/obj/structure/grille, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"aQR" = ( -/obj/machinery/computer/station_alert{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/machinery/requests_console{ - department = "Atmospherics"; - departmentType = 3; - name = "Atmos RC"; - pixel_x = -30 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aQS" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"aQT" = ( -/obj/machinery/computer/atmos_control{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aQU" = ( -/obj/structure/lattice, -/obj/structure/grille/broken, -/turf/open/space, -/area/space/nearstation) -"aQV" = ( -/obj/structure/lattice/catwalk, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/solar/aft) -"aQX" = ( -/obj/structure/girder, -/obj/structure/grille, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"aQY" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/medical/cryo) -"aQZ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "medicalcheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/medical) -"aRa" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/medical/cryo) -"aRb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aRc" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"aRd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/aft) -"aRe" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aRg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"aRh" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plating, -/area/engine/atmos) -"aRi" = ( -/obj/machinery/power/smes{ - capacity = 9e+006; - charge = 10000 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aRj" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Air to External Air Ports" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aRk" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aRl" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aRn" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aRo" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aRp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aRq" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aRr" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/plating, -/area/maintenance/department/crew_quarters/bar) -"aRs" = ( -/obj/effect/landmark/start/station_engineer, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aRt" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/machinery/light, -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aRu" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aRv" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aRw" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;35" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aRx" = ( -/obj/structure/reflector/box/anchored, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"aRz" = ( -/obj/structure/bed, -/obj/effect/landmark/start/virologist, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aRA" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aRD" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) -"aRH" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"aRI" = ( -/obj/machinery/computer/atmos_alert{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aRJ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aRK" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"aRL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aRM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aRO" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aRP" = ( -/obj/structure/sign/warning/pods{ - pixel_x = 32 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aRQ" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aRR" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Three" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aRS" = ( -/obj/machinery/suit_storage_unit/open, -/obj/structure/sign/warning/nosmoking{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room/external) -"aRT" = ( -/obj/docking_port/stationary{ - dir = 4; - 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) -"aRU" = ( -/obj/docking_port/stationary/random{ - dir = 4; - id = "pod_lavaland2"; - name = "lavaland" - }, -/turf/open/space/basic, -/area/space/nearstation) -"aRV" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aRW" = ( -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aRX" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"aRY" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"aRZ" = ( -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"aSa" = ( -/turf/closed/wall, -/area/maintenance/starboard/fore) -"aSb" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"aSc" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"aSd" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aSe" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "External Waste Ports to Filter" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aSf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"aSg" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"aSh" = ( -/turf/closed/wall, -/area/maintenance/disposal/incinerator) -"aSi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/obj/machinery/button/door{ - id = "permabolt1"; - name = "Cell Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 25; - specialfunctions = 4 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aSj" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"aSk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"aSl" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aSm" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door_timer{ - id = "Cell 3"; - name = "Cell 3"; - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aSn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aSo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aSq" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aSr" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aSs" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/closet, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"aSt" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/rack, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"aSu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aSv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 2; - name = "atmospherics mix pump" - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSw" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSy" = ( -/obj/structure/disposaloutlet{ - desc = "An outlet for the pneumatic disposal system. This one seems designed for rapid corpse disposal."; - dir = 4; - name = "rapid corpse mover 9000" - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"aSz" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aSA" = ( -/obj/machinery/atmospherics/components/unary/tank/toxins{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSD" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSE" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - name = "output gas connector port" - }, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSF" = ( -/obj/structure/chair/stool, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSG" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Incinerator to Output" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSH" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/security/telescreen/turbine{ - dir = 1; - pixel_y = -30 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, -/obj/machinery/meter, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/blobstart, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/incinerator_vent_atmos_aux{ - pixel_x = 6; - pixel_y = -24 - }, -/obj/machinery/button/door/incinerator_vent_atmos_main{ - pixel_x = -6; - pixel_y = -24 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSN" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/ignition/incinerator/atmos{ - pixel_x = -6; - pixel_y = -24 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSO" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plating, -/area/maintenance/disposal/incinerator) -"aSP" = ( -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) -"aSQ" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) -"aSR" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_atmos{ - pixel_x = -37; - pixel_y = -6 - }, -/turf/open/floor/engine, -/area/maintenance/disposal/incinerator) -"aSS" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/meter, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) -"aST" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 2; - name = "Incinerator Output Pump" - }, -/turf/open/space/basic, -/area/maintenance/disposal/incinerator) -"aSU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSV" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSW" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"aSX" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/maintenance/disposal/incinerator) -"aSY" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 2 - }, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) -"aSZ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/engine, -/area/maintenance/disposal/incinerator) -"aTa" = ( -/obj/machinery/door/poddoor/incinerator_atmos_aux, -/turf/open/floor/engine/vacuum, -/area/maintenance/disposal/incinerator) -"aTb" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/incinerator_input{ - dir = 1 - }, -/turf/open/floor/engine/vacuum, -/area/maintenance/disposal/incinerator) -"aTc" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/igniter/incinerator_atmos, -/obj/machinery/air_sensor{ - pixel_x = -32; - pixel_y = -32 - }, -/turf/open/floor/engine/vacuum, -/area/maintenance/disposal/incinerator) -"aTd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/engine/vacuum, -/area/maintenance/disposal/incinerator) -"aTe" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 2 - }, -/obj/machinery/airlock_sensor/incinerator_atmos{ - pixel_x = 8; - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/sign/warning/fire{ - pixel_x = -32 - }, -/turf/open/floor/engine, -/area/maintenance/disposal/incinerator) -"aTf" = ( -/obj/machinery/power/turbine{ - luminosity = 2 - }, -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/maintenance/disposal/incinerator) -"aTg" = ( -/obj/machinery/door/poddoor/incinerator_atmos_main, -/turf/open/floor/engine/vacuum, -/area/maintenance/disposal/incinerator) -"aTh" = ( -/obj/machinery/door/airlock/public/glass, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"aTi" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"aTj" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"aTk" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aTl" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"aTn" = ( -/obj/machinery/atmospherics/pipe/layer_manifold, -/obj/structure/plasticflaps/opaque, -/turf/open/floor/plating, -/area/maintenance/disposal/incinerator) -"aTo" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Service Door"; - req_one_access_txt = "22;25;26;28;35;37;38;46" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aTp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 8; - external_pressure_bound = 120; - name = "killroom vent" - }, -/turf/open/floor/circuit/telecomms, -/area/science/xenobiology) -"aTq" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aTr" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/fore) -"aTs" = ( -/obj/machinery/power/apc{ - areastring = "/area/hydroponics/garden"; - dir = 4; - name = "Public Garden APC"; - pixel_x = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aTu" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/rack, -/obj/item/wrench, -/obj/item/wrench{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/screwdriver, -/obj/item/screwdriver{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/t_scanner, -/obj/item/t_scanner, -/obj/item/storage/box/lights/mixed, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"aTv" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/table, -/obj/item/assembly/igniter, -/obj/item/assembly/igniter{ - pixel_x = -4; - pixel_y = -4 - }, -/obj/item/screwdriver{ - pixel_y = 16 - }, -/obj/item/wirecutters, -/obj/item/assembly/signaler{ - pixel_x = 4; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/storage/tools) -"aTy" = ( -/obj/effect/turf_decal/bot_white/left, -/obj/structure/closet/crate/silvercrate, -/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/ai_monitored/nuke_storage) -"aTA" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aTB" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"aTC" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aTE" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"aTF" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/department/security) -"aTG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"aTI" = ( -/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/holopad, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/chief) -"aTJ" = ( -/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/tile/neutral, -/obj/machinery/door/window/northright{ - name = "Engineering Delivery Access"; - req_access_txt = "10" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aTK" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aTL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aTO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aTS" = ( -/obj/machinery/vending/wardrobe/engi_wardrobe, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aTT" = ( -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; - req_access_txt = "47" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"aTU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/window/northleft{ - name = "Engineering Storage"; - req_access_txt = "10" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aTV" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aTW" = ( -/obj/machinery/power/port_gen/pacman, -/turf/open/floor/plating, -/area/engine/engineering) -"aTX" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/item/storage/box/beakers, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aTY" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aTZ" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aUa" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/item/grenade/chem_grenade, -/obj/item/grenade/chem_grenade{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/grenade/chem_grenade{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/stack/cable_coil/random, -/obj/item/stack/cable_coil/random{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/screwdriver{ - pixel_x = 2; - pixel_y = 18 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aUb" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/item/storage/box/syringes, -/obj/machinery/light, -/obj/item/storage/box/beakers, -/obj/item/clothing/glasses/science{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/clothing/glasses/science, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aUc" = ( -/obj/structure/table, -/obj/item/aiModule/supplied/quarantine, -/obj/machinery/camera/motion{ - c_tag = "Secure - AI Upload Main 1"; - dir = 4; - network = list("ss13","Secure") - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai_upload) -"aUd" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/plasteel, -/area/medical/cryo) -"aUe" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/public/glass, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"aUg" = ( -/obj/structure/table, -/obj/item/book/manual/hydroponics_pod_people, -/obj/item/paper/guides/jobs/hydroponics, -/turf/open/floor/plasteel, -/area/hydroponics) -"aUh" = ( -/obj/machinery/turretid{ - control_area = "/area/ai_monitored/turret_protected/ai_upload"; - name = "AI Upload turret control"; - pixel_y = -25 - }, -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aUi" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"aUj" = ( -/obj/machinery/seed_extractor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/security/prison) -"aUk" = ( -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) -"aUl" = ( -/obj/structure/sign/departments/medbay/alt, -/turf/closed/wall, -/area/medical/chemistry) -"aUm" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"aUn" = ( -/obj/structure/closet/radiation, -/obj/structure/sign/warning/radiation/rad_area{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"aUo" = ( -/obj/structure/closet/radiation, -/obj/structure/sign/warning/radiation/rad_area{ - pixel_x = 32 - }, -/obj/machinery/camera{ - c_tag = "Engineering - Gravity Generator Airlock"; - network = list("ss13","Engineering") - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"aUp" = ( -/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/neutral, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aUr" = ( -/obj/machinery/biogenerator, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera{ - c_tag = "Security Perma - Main 2"; - dir = 8; - network = list("ss13","Security","Prison") - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aUs" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/machinery/light_switch{ - pixel_y = -24 - }, -/turf/open/floor/plasteel/white, -/area/medical/patients_rooms/room_b) -"aUt" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular, -/obj/structure/sign/departments/chemistry{ - pixel_y = -32 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aUv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/disposalpipe/junction/yjunction{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aUw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"aUx" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/grenades, -/obj/item/book/manual/wiki/chemistry{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/folder/white, -/obj/item/pen, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aUy" = ( -/obj/machinery/door/airlock/medical{ - name = "Medbay Reception"; - req_access_txt = "5" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aUz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/table, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"aUA" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/item/assembly/timer{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/assembly/timer{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/assembly/timer{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/assembly/timer{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/assembly/igniter{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/assembly/igniter{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/assembly/igniter{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/assembly/igniter{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/structure/sign/poster/official/safety_eye_protection{ - pixel_y = -32 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aUB" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/item/stack/sheet/mineral/plasma, -/obj/item/stack/sheet/mineral/plasma, -/obj/machinery/requests_console{ - department = "Chemistry"; - departmentType = 2; - name = "Chemistry Request Console"; - pixel_y = -28 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aUC" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/engine/gravity_generator) -"aUD" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/engine/gravity_generator) -"aUE" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aUF" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/item/radio/intercom{ - dir = 2; - pixel_y = -28 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"aUG" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Gravity Generator"; - req_access_txt = "11" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"aUH" = ( -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"aUI" = ( -/obj/effect/turf_decal/bot_white/right, -/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/gravity_generator) -"aUJ" = ( -/obj/machinery/door/airlock/command{ - name = "Teleport Access"; - req_access_txt = "17"; - security_level = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"aUK" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/gateway) -"aUL" = ( -/obj/machinery/gateway{ - dir = 9 - }, -/obj/effect/turf_decal/bot_white/right, -/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/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/gateway) -"aUM" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aUO" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/vending/engivend, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aUP" = ( -/obj/machinery/shower{ - dir = 1 - }, -/turf/open/floor/plasteel/freezer, -/area/security/prison) -"aUQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aUR" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aUT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aUU" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aUV" = ( -/obj/machinery/computer/card/minor/ce{ - dir = 1 - }, -/obj/machinery/requests_console{ - announcementConsole = 1; - department = "Chief Engineer's Desk"; - departmentType = 4; - name = "Chief Engineer RC"; - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/chief) -"aUZ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aVa" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plating, -/area/storage/tech) -"aVb" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/landmark/start/medical_doctor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aVc" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"aVd" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"aVe" = ( -/obj/structure/closet/toolcloset, -/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/construction/mining/aux_base) -"aVf" = ( -/obj/structure/closet/toolcloset, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"aVg" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"aVh" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/construction/mining/aux_base) -"aVi" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"aVj" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/entry) -"aVk" = ( -/obj/machinery/computer/shuttle/mining{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"aVl" = ( -/obj/docking_port/stationary{ - dheight = 4; - dir = 8; - dwidth = 4; - height = 9; - id = "aux_base_zone"; - name = "aux base zone"; - roundstart_template = /datum/map_template/shuttle/aux_base/default; - width = 9 - }, -/turf/open/floor/plating, -/area/construction/mining/aux_base) -"aVm" = ( -/obj/docking_port/stationary/public_mining_dock{ - dir = 8 - }, -/turf/open/floor/plating, -/area/construction/mining/aux_base) -"aVn" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/exit/departure_lounge) -"aVo" = ( -/obj/machinery/door/airlock/external{ - name = "Construction Zone" - }, -/turf/open/floor/plating, -/area/construction/mining/aux_base) -"aVp" = ( -/obj/machinery/door/airlock/engineering{ - name = "Auxillary Base Construction"; - req_one_access_txt = "32;47;48" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"aVr" = ( -/obj/structure/rack, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/wallframe/camera, -/obj/item/assault_pod/mining, -/obj/machinery/computer/security/telescreen/auxbase{ - dir = 8; - pixel_x = 30 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"aVs" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/construction/mining/aux_base) -"aVt" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"aVv" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"aVw" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/sign/warning/docking{ - pixel_x = -32 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/entry) -"aVx" = ( -/turf/closed/wall, -/area/construction) -"aVy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/storage/tech) -"aVz" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aVA" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "rnd2"; - name = "research lab shutters" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"aVD" = ( -/turf/open/floor/plasteel, -/area/crew_quarters/heads/chief) -"aVE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/science/storage) -"aVF" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"aVG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "medicalcheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/medical) -"aVH" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/storage/tech) -"aVI" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"aVJ" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/lab) -"aVK" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aVL" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aVM" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aVN" = ( -/obj/structure/chair/stool, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aVO" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aVP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/security/brig) -"aVQ" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aVS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/flasher{ - id = "Cell 1"; - pixel_x = -28; - pixel_y = 28 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aVT" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "briginteralshutter"; - name = "Warden Lockdown Shutter" - }, -/turf/open/floor/plating, -/area/security/warden) -"aVU" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/security/brig) -"aVV" = ( -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay"; - req_access_txt = "5" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aVW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aVX" = ( -/obj/structure/chair, -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aVY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/security/prison) -"aVZ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "hop"; - name = "Privacy Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/heads/hop) -"aWa" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "brigexternalblast"; - name = "External Security Blast Door" - }, -/turf/open/floor/plating, -/area/security/brig) -"aWb" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "brigexternalblast"; - name = "External Security Blast Door" - }, -/turf/open/floor/plating, -/area/security/brig) -"aWc" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/door_timer{ - id = "Cell 4"; - name = "Cell 4"; - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aWd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/security/brig) -"aWe" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aWf" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/security/prison) -"aWg" = ( -/obj/structure/chair/stool, -/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/neutral, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aWh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 4; - name = "sorting disposal pipe (Security)"; - sortTypes = list(7,8) - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aWi" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aWj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/security/brig) -"aWk" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aWl" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"aWm" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aWn" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/security/main) -"aWp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aWq" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Equipment Room"; - req_access_txt = "1" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aWs" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Equipment Room"; - req_access_txt = "1" - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aWt" = ( -/obj/structure/chair/stool, -/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/neutral, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aWu" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "brigexternalblast"; - name = "External Security Blast Door" - }, -/turf/open/floor/plating, -/area/security/brig) -"aWv" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "brigexternalblast"; - name = "External Security Blast Door" - }, -/turf/open/floor/plating, -/area/security/brig) -"aWw" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "brigexternalblast"; - name = "External Security Blast Door" - }, -/turf/open/floor/plating, -/area/security/brig) -"aWx" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/security/main) -"aWy" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/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/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/security/main) -"aWA" = ( -/obj/machinery/computer/secure_data, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/security/main) -"aWB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aWC" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aWD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aWE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aWF" = ( -/obj/structure/reagent_dispensers/peppertank{ - pixel_x = 30 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aWH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"aWI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aWJ" = ( -/obj/machinery/door/airlock/security{ - name = "Security Office"; - req_access_txt = "1" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/main) -"aWK" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aWL" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/security/brig) -"aWM" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aWN" = ( -/obj/machinery/disposal/bin, -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"aWO" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/landmark/start/security_officer, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/main) -"aWP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"aWQ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/landmark/start/security_officer, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/security/main) -"aWR" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Courtroom" - }, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aWS" = ( -/obj/structure/closet/cardboard, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aWT" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "briginteralshutter"; - name = "Warden Lockdown Shutter" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/security/warden) -"aWU" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/crew_quarters/heads/hos) -"aWV" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aWW" = ( -/obj/structure/closet/secure_closet/brig, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aWX" = ( -/obj/structure/chair, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"aWY" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"aXa" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aXb" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/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) -"aXc" = ( -/obj/machinery/computer/card{ - dir = 1 - }, -/obj/machinery/button/flasher{ - id = "hopflash"; - pixel_x = 6; - pixel_y = -36 - }, -/obj/machinery/button/door{ - id = "hop"; - name = "Privacy Shutters Control"; - pixel_x = 6; - pixel_y = -25; - req_access_txt = "57" - }, -/obj/machinery/button/door{ - id = "hopqueue"; - name = "Queue Shutters Control"; - pixel_x = -4; - pixel_y = -25; - req_access_txt = "57" - }, -/obj/machinery/light_switch{ - pixel_x = -4; - pixel_y = -36 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"aXd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/obj/effect/landmark/start/botanist, -/obj/machinery/camera{ - c_tag = "Service - Hydroponics Backroom"; - dir = 1; - network = list("ss13","Hydroponics") - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"aXe" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aXf" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"aXg" = ( -/obj/effect/turf_decal/bot_white, -/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/gravity_generator) -"aXh" = ( -/obj/effect/turf_decal/bot_white/left, -/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/gravity_generator) -"aXi" = ( -/obj/machinery/gravity_generator/main/station, -/obj/effect/turf_decal/bot_white, -/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/gravity_generator) -"aXj" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/bot, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aXk" = ( -/obj/machinery/door/airlock/security{ - name = "Security Checkpoint"; - req_access_txt = "1" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"aXl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"aXm" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "medicalcheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/medical) -"aXn" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/medical/medbay/lobby) -"aXo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aXp" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plating, -/area/medical/patients_rooms/room_a) -"aXq" = ( -/obj/structure/table/reinforced, -/obj/item/folder/white, -/obj/item/pen, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aXr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/patients_rooms/room_a) -"aXs" = ( -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aXt" = ( -/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; - pixel_x = -4; - req_access_txt = "5" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aXu" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aXv" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay Storage"; - req_access_txt = "5" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"aXw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aXx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aXy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"aXz" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/disposaloutlet{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"aXA" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aXC" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aXD" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/door/window/northleft{ - name = "Medical Delivery"; - req_access_txt = "5" - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aXE" = ( -/obj/structure/rack, -/obj/item/stack/rods/ten, -/turf/open/floor/plating, -/area/maintenance/fore) -"aXF" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aXG" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/maintenance/fore) -"aXH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/door/airlock/medical{ - name = "Patient Room"; - req_access_txt = "5" - }, -/turf/open/floor/plasteel/white, -/area/medical/patients_rooms/room_a) -"aXI" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"aXJ" = ( -/obj/machinery/power/apc{ - areastring = "/area/medical/patients_rooms/room_b"; - dir = 4; - name = "Patient Room B APC"; - pixel_x = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"aXL" = ( -/obj/machinery/holopad, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"aXM" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/landmark/start/assistant, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"aXN" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/medical/medbay/lobby) -"aXP" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aXR" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aXS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/sorting/mail{ - name = "sorting disposal pipe (Virology)"; - sortType = 27 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aXT" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/small, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aXU" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemistryshutter"; - name = "Chemistry Privacy Shutters" - }, -/obj/machinery/door/window/southleft{ - name = "Chemistry Desk"; - req_access_txt = "33" - }, -/turf/open/floor/plating, -/area/medical/chemistry) -"aXV" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemistryshutter"; - name = "Chemistry Privacy Shutters" - }, -/obj/machinery/door/window/southright{ - name = "Chemistry Desk"; - req_access_txt = "33" - }, -/turf/open/floor/plating, -/area/medical/chemistry) -"aXW" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"aXX" = ( -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/science/research) -"aXY" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/patients_rooms/room_b) -"aXZ" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Surgery Maintenance Access"; - req_access_txt = "45" - }, -/turf/open/floor/plating, -/area/medical/surgery) -"aYa" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = 28 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aYb" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plating, -/area/medical/patients_rooms/room_b) -"aYc" = ( -/obj/machinery/door/window/southright{ - name = "Genetics Pen"; - req_access_txt = "9" - }, -/mob/living/carbon/monkey, -/turf/open/floor/plasteel, -/area/medical/genetics) -"aYd" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1; - name = "Connector Port (Air Supply)" - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/machinery/light, -/obj/machinery/camera{ - c_tag = "Medical - Cryogenics"; - dir = 1; - network = list("ss13","Medical") - }, -/turf/open/floor/plasteel, -/area/medical/cryo) -"aYe" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel/white/corner, -/area/medical/genetics) -"aYf" = ( -/obj/structure/window/reinforced, -/turf/open/floor/plasteel/white/corner{ - dir = 8 - }, -/area/medical/genetics) -"aYg" = ( -/mob/living/carbon/monkey, -/turf/open/floor/plasteel, -/area/medical/genetics) -"aYh" = ( -/mob/living/carbon/monkey, -/turf/open/floor/plasteel/white/corner, -/area/medical/genetics) -"aYi" = ( -/obj/structure/window/reinforced, -/turf/open/floor/plasteel/white/corner, -/area/medical/genetics) -"aYj" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/medical/sleeper) -"aYk" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/medical/cryo) -"aYl" = ( -/obj/structure/table, -/obj/item/folder/red{ - pixel_x = 1; - pixel_y = 3 - }, -/obj/item/pen, -/obj/item/paper, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/turf/open/floor/plasteel/white, -/area/medical/patients_rooms/room_a) -"aYm" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"aYn" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"aYo" = ( -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/machinery/stasis, -/turf/open/floor/plasteel, -/area/medical/sleeper) -"aYp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"aYq" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"aYr" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "medicalcheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/medical) -"aYs" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Medical - Main 1"; - dir = 8; - network = list("ss13","Medical") - }, -/obj/machinery/shower{ - dir = 8; - name = "Chemical Emergency Shower" - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"aYt" = ( -/obj/machinery/vending/wardrobe/sec_wardrobe, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"aYu" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"aYv" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "medicalcheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/medical) -"aYw" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aYx" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/bed/dogbed/runtime, -/obj/structure/noticeboard{ - dir = 8; - pixel_x = 27 - }, -/obj/item/paper/fluff/jobs/medical/hippocratic, -/mob/living/simple_animal/pet/cat/Runtime, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"aYy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 5 - }, -/obj/structure/sign/warning/pods{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aYz" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aYA" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/airlock/atmos{ - name = "Atmospherics Desk"; - req_access_txt = "24" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aYB" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aYC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/department/security) -"aYD" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"aYE" = ( -/obj/machinery/door/airlock/security{ - name = "Courtroom Prisoner Access"; - req_access_txt = "63; 42" - }, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"aYF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"aYG" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/grille, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aYI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"aYJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"aYK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"aYL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/janitor) -"aYM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"aYN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/aft) -"aYO" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"aYP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"aYQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aYR" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/main) -"aYS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aYT" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/main) -"aYU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/security/main) -"aYV" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/security/brig) -"aYW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/security/main) -"aYX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/security/main) -"aYY" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/department/security) -"aYZ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 2; - external_pressure_bound = 140; - name = "killroom vent"; - pressure_checks = 0 - }, -/obj/machinery/camera{ - c_tag = "Research - Xenobiology Northen Kill Chamber"; - dir = 2; - network = list("ss13","Research","Xenobiology") - }, -/turf/open/floor/circuit/telecomms, -/area/science/xenobiology) -"aZa" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/main) -"aZb" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;35" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"aZc" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/department/security) -"aZd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"aZe" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aZf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aZg" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Courtroom"; - req_access_txt = "42" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aZh" = ( -/obj/structure/chair, -/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/security/courtroom) -"aZi" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/courtroom) -"aZj" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/grass, -/area/hydroponics/garden) -"aZk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aZl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/security/courtroom) -"aZm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aZn" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aZo" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aZp" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/maintenance/fore) -"aZq" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aZr" = ( -/obj/structure/table, -/obj/item/storage/box/prisoner, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"aZs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/security/processing) -"aZt" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/sign/warning/pods{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"aZu" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/white, -/area/science/lab) -"aZv" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aZw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aZx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aZy" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/security/prison) -"aZz" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aZA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aZB" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aZC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aZD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aZE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aZF" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Prison Wing"; - req_access_txt = "2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/security/prison) -"aZG" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"aZH" = ( -/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/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aZI" = ( -/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/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aZJ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aZK" = ( -/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/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aZL" = ( -/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/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aZM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aZN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aZO" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"aZP" = ( -/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/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aZQ" = ( -/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/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/light, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aZR" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/security/processing) -"aZS" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"aZT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"aZU" = ( -/obj/machinery/door/airlock/security{ - name = "Interrogation"; - req_access_txt = "63" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"aZV" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aZW" = ( -/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/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aZX" = ( -/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/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aZY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"aZZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"baa" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"bab" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"bac" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/light, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"bad" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"bae" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"baf" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain/private) -"bag" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"bah" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"bai" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"baj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"bak" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/window/eastright{ - name = "Armory"; - req_access_txt = "2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"bal" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"bam" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "briginteralshutter"; - name = "Warden Lockdown Shutter" - }, -/turf/open/floor/plating, -/area/security/warden) -"ban" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"bao" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"bap" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"baq" = ( -/obj/machinery/camera{ - c_tag = "Atmospherics - Front Desk"; - dir = 1; - network = list("ss13","Atmospherics") - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = -25 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bar" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"bas" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"bat" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"bau" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/security/processing) -"bav" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"baw" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel, -/area/security/brig) -"bax" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"bay" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/white, -/area/science/research) -"baz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"baA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"baB" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Four" - }, -/turf/open/floor/plating, -/area/security/processing) -"baC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"baD" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/main) -"baE" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/main) -"baF" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/main) -"baG" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/security/main) -"baH" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/security/main) -"baI" = ( -/obj/structure/table, -/obj/machinery/recharger, -/obj/machinery/light_switch{ - pixel_y = -23 - }, -/obj/machinery/camera{ - c_tag = "Security - Warden's Office"; - dir = 8; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"baJ" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"baK" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/holopad, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"baL" = ( -/obj/effect/landmark/start/head_of_security, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/security/main) -"baM" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12;1"; - req_one_access_txt = "0" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"baN" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/security/main) -"baO" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel, -/area/security/courtroom) -"baP" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Head of Security"; - req_access_txt = "58" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"baQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"baR" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"baS" = ( -/obj/structure/closet/secure_closet/hos, -/obj/item/radio/intercom{ - dir = 4; - pixel_x = -31 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"baT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"baU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"baV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"baW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"baX" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/courtroom) -"baY" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plasteel, -/area/engine/atmos) -"baZ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bba" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bbb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bbc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/maintenance/aft) -"bbd" = ( -/obj/effect/landmark/start/cook, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"bbe" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bbf" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bbg" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bbh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - areastring = "/area/maintenance/disposal/incinerator"; - dir = 8; - name = "Incinerator APC"; - pixel_x = -24 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"bbi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"bbj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/closed/wall, -/area/maintenance/disposal/incinerator) -"bbk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"bbl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/maintenance/disposal/incinerator) -"bbm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bbn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"bbo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bbp" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bbs" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bbt" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"bbu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"bbv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"bbw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"bbx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"bby" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"bbz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"bbA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"bbB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"bbD" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"bbE" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"bbF" = ( -/obj/structure/filingcabinet, -/obj/item/folder/documents, -/obj/effect/turf_decal/bot_white, -/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/light, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"bbG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/wood, -/area/lawoffice) -"bbH" = ( -/turf/open/floor/plating, -/area/construction) -"bbJ" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bbK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bbL" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"bbM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"bbN" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/maintenance{ - name = "Medical Maintenance Access"; - req_access_txt = "5" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/white, -/area/maintenance/port/aft) -"bbO" = ( -/obj/effect/landmark/start/cook, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"bbP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"bbQ" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bbR" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bbS" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bbT" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall, -/area/maintenance/port/fore) -"bbU" = ( -/obj/structure/sign/warning/pods{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bbV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"bbW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"bbX" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bbY" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/chair, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bbZ" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"bca" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bcb" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/chair/stool/bar, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bcc" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"bcd" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/exit/departure_lounge) -"bce" = ( -/obj/structure/rack, -/obj/item/stack/packageWrap, -/obj/item/hand_labeler, -/obj/machinery/button/door{ - id = "kitchenshutter"; - name = "Privacy Shutter Controls"; - pixel_x = -24; - pixel_y = 8; - req_one_access_txt = "35;28" - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"bcf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/circuit, -/area/ai_monitored/nuke_storage) -"bcg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/maintenance/aft) -"bcj" = ( -/obj/effect/turf_decal/bot_white/right, -/obj/structure/closet/crate/goldcrate, -/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/ai_monitored/nuke_storage) -"bck" = ( -/obj/machinery/porta_turret/ai, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"bcl" = ( -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"bcm" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/engine, -/area/science/explab) -"bcn" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/circuit, -/area/ai_monitored/nuke_storage) -"bcp" = ( -/obj/effect/turf_decal/bot_white/right, -/obj/machinery/ore_silo, -/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/ai_monitored/nuke_storage) -"bcq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bct" = ( -/turf/open/floor/circuit, -/area/ai_monitored/nuke_storage) -"bcu" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/vault{ - req_access_txt = "53" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ai_monitored/nuke_storage) -"bcw" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/newscaster{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bcx" = ( -/obj/structure/safe, -/obj/item/clothing/head/bearpelt, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, -/obj/item/gun/ballistic/revolver/russian, -/obj/item/ammo_box/a357, -/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka, -/obj/effect/turf_decal/bot_white/left, -/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/ai_monitored/nuke_storage) -"bcy" = ( -/obj/structure/rack, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/spawner/lootdrop/techstorage/command, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/camera/motion{ - c_tag = "Secure - Vault"; - dir = 4; - network = list("ss13","Secure") - }, -/obj/machinery/door/window/eastright{ - name = "Secure Board Storage"; - req_access_txt = "53" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"bcz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"bcA" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/aft) -"bcB" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"bcC" = ( -/turf/closed/wall, -/area/maintenance/disposal) -"bcD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"bcE" = ( -/obj/structure/table, -/obj/item/aiModule/supplied/oxygen, -/obj/item/aiModule/zeroth/oneHuman, -/obj/item/aiModule/reset/purge, -/obj/effect/spawner/lootdrop/aimodule_harmful, -/obj/item/aiModule/supplied/protectStation, -/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/tile/neutral{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/bot_white/left, -/obj/machinery/door/window/northleft{ - name = "Secure Board Storage"; - req_access_txt = "53" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"bcF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"bcG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bcH" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/landmark/start/assistant, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"bcI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"bcJ" = ( -/obj/machinery/door/airlock/external, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"bcK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"bcL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"bcM" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"bcN" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"bcO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bcP" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/engine/atmos) -"bcQ" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medical Maintenance Access"; - req_access_txt = "5" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/white, -/area/maintenance/port) -"bcR" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bcS" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Disposal Access"; - req_access_txt = "12" - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/aft) -"bcT" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/obj/machinery/camera{ - c_tag = "Civilian - Disposals Waste Management"; - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bcV" = ( -/obj/structure/chair, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"bcW" = ( -/obj/machinery/door/airlock/atmos{ - name = "Atmospherics Main"; - req_access_txt = "24" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bcX" = ( -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"bcY" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bcZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"bda" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"bdb" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"bdc" = ( -/obj/effect/landmark/start/bartender, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"bdd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"bde" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"bdf" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bdg" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/table, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bdh" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bdi" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"bdj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/patients_rooms/room_b) -"bdk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/door/airlock/medical{ - name = "Patient Room 2"; - req_access_txt = "5" - }, -/turf/open/floor/plasteel/white, -/area/medical/patients_rooms/room_b) -"bdl" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bdm" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bdn" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Operating Theatre"; - req_access_txt = "45" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/medical/surgery) -"bdo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"bdp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"bdq" = ( -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/engine, -/area/science/explab) -"bdr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"bds" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"bdt" = ( -/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 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bdu" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bdv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/port) -"bdw" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bdx" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/port) -"bdy" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bdz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"bdA" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bdB" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bdC" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/closet/secure_closet/medical1, -/turf/open/floor/plating, -/area/maintenance/port) -"bdD" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/turf/open/floor/plating, -/area/storage/tools) -"bdE" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bdF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bdG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bdH" = ( -/obj/vehicle/ridden/secway, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"bdI" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white/side, -/area/medical/sleeper) -"bdJ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel, -/area/medical/cryo) -"bdK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/weightmachine/weightlifter, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bdL" = ( -/obj/structure/closet/secure_closet/personal/patient, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bdM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bdN" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bdO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bdP" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/medical/sleeper) -"bdQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/cryo) -"bdR" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plating, -/area/medical/virology) -"bdS" = ( -/obj/machinery/door/airlock/virology/glass{ - name = "Isolation A"; - req_access_txt = "39" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bdT" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bdU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bdV" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plating, -/area/medical/virology) -"bdW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bdX" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bdY" = ( -/obj/machinery/door/airlock/virology/glass{ - name = "Monkey Pen"; - req_access_txt = "39" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bdZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"bea" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/light_switch{ - pixel_x = -23 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"beb" = ( -/obj/machinery/door/airlock/virology/glass{ - name = "Monkey Pen"; - req_access_txt = "39" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bec" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bed" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bee" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bef" = ( -/obj/machinery/rnd/experimentor, -/obj/effect/landmark/blobstart, -/turf/open/floor/engine, -/area/science/explab) -"beg" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"beh" = ( -/obj/structure/chair/stool, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bei" = ( -/obj/machinery/door/airlock/virology{ - name = "Break Room"; - req_access_txt = "39" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bej" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bek" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/medical/virology) -"bel" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"bem" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"ben" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"beo" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"bep" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"beq" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/sign/poster/official/get_your_legs{ - pixel_x = 32 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"ber" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bes" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"bet" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"beu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bev" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bew" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"bey" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/light_switch{ - pixel_x = 24 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bez" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hydroponics) -"beA" = ( -/obj/machinery/door/airlock/medical/glass{ - id_tag = "GeneticsDoor"; - name = "Genetics"; - req_access_txt = "5; 68" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"beB" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"beC" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"beD" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"beE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"beF" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"beG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"beH" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"beI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"beJ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"beK" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"beL" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"beM" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"beN" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/crew_quarters/heads/cmo) -"beO" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"beP" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"beQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/sorting/mail{ - name = "sorting disposal pipe (Chemistry)"; - sortType = 11 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"beR" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"beS" = ( -/obj/machinery/door/airlock/virology{ - autoclose = 0; - frequency = 1449; - id_tag = "virology_airlock_interior"; - name = "Virology Interior Airlock"; - req_access_txt = "39" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"beT" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Chemistry Lab"; - req_access_txt = "5; 33" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"beU" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"beV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"beW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"beX" = ( -/obj/machinery/chem_heater, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"beY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"beZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"bfa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"bfb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"bfc" = ( -/obj/effect/landmark/start/clown, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"bfd" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"bfe" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bff" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"bfh" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/door/window/eastleft{ - name = "Bar Access"; - req_access_txt = "25" - }, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bfi" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bfj" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"bfk" = ( -/obj/structure/table, -/obj/item/storage/box/firingpins, -/obj/item/storage/box/firingpins, -/obj/item/key/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/item/toy/figure/warden, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) -"bfl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bfm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bfn" = ( -/obj/structure/window/reinforced, -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemistryshutter"; - name = "Chemistry Privacy Shutters" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/medical/chemistry) -"bfo" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"bfp" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"bfq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bfs" = ( -/obj/structure/closet/secure_closet/personal/patient, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/patients_rooms/room_a) -"bft" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bfu" = ( -/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) -"bfv" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bfw" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bfx" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bfy" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"bfA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - 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/structure/chair{ - dir = 4 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bfB" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/fore) -"bfC" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bfD" = ( -/obj/structure/showcase/cyborg/old{ - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai_upload) -"bfE" = ( -/obj/structure/closet/secure_closet/personal/patient, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/patients_rooms/room_b) -"bfF" = ( -/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/cafeteria, -/area/crew_quarters/heads/cmo) -"bfG" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bfH" = ( -/obj/structure/table/wood, -/obj/item/stack/packageWrap, -/obj/item/stack/packageWrap, -/obj/item/gun/ballistic/shotgun/doublebarrel, -/obj/structure/sink/kitchen{ - pixel_y = 28 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"bfI" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemistryshutter"; - name = "Chemistry Privacy Shutters" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/medical/chemistry) -"bfJ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bfK" = ( -/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) -"bfM" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/exit/departure_lounge) -"bfN" = ( -/obj/machinery/vending/snack/random, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/exit/departure_lounge) -"bfO" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/exit/departure_lounge) -"bfQ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"bfR" = ( -/obj/machinery/food_cart, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"bfS" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bfT" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "35" - }, -/turf/open/floor/plating, -/area/hydroponics) -"bfV" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bfW" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/chief) -"bfX" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12;63"; - req_one_access_txt = "0" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/department/security) -"bfY" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/sign/poster/official/space_cops{ - pixel_x = 32 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/security/main) -"bfZ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "5;12" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bga" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Custodial Maintenance"; - req_one_access_txt = "12;26" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bgb" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bgc" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 12 - }, -/obj/structure/mirror{ - pixel_x = 28 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/fitness/recreation) -"bgd" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/fitness/recreation) -"bge" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"bgf" = ( -/obj/machinery/door/airlock{ - name = "Liquid Tank Storage" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness/recreation) -"bgg" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bgh" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bgi" = ( -/obj/structure/table/wood, -/obj/item/staff/stick, -/obj/machinery/camera{ - c_tag = "Service - Theatre Stage"; - dir = 4; - network = list("ss13","Bar Area") - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"bgj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bgk" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/courtroom) -"bgl" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Central East 2"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bgm" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/landmark/start/security_officer, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/security/main) -"bgp" = ( -/obj/machinery/vending/wardrobe/chef_wardrobe, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"bgq" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bgr" = ( -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/security/courtroom) -"bgs" = ( -/obj/machinery/vending/medical{ - pixel_x = -2 - }, -/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) -"bgt" = ( -/obj/machinery/door/airlock{ - name = "Kitchen Cold Room"; - req_access_txt = "28" - }, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen/coldroom) -"bgu" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"bgv" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/requests_console{ - department = "Bar"; - departmentType = 2; - pixel_x = -30; - receive_ore_updates = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bgw" = ( -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bgx" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"bgy" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"bgz" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"bgA" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bgB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"bgC" = ( -/obj/structure/closet/crate{ - name = "Excess Custodial Supplies" - }, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/clusterbuster/cleaner, -/turf/open/floor/plating, -/area/maintenance/aft) -"bgD" = ( -/obj/machinery/power/solar{ - id = "starboardsolar"; - name = "Starboard Solar Array" - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/airless/solarpanel, -/area/solar/starboard) -"bgE" = ( -/obj/machinery/power/solar{ - id = "starboardsolar"; - name = "Starboard Solar Array" - }, -/obj/structure/cable, -/turf/open/floor/plasteel/airless/solarpanel, -/area/solar/starboard) -"bgF" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/flashlight/lamp/green{ - on = 0; - pixel_x = 6; - pixel_y = 6 - }, -/obj/machinery/keycard_auth{ - pixel_x = 24; - pixel_y = 10 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"bgG" = ( -/obj/structure/table/reinforced, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/item/toy/figure/md, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"bgH" = ( -/obj/structure/table/wood, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/structure/reagent_dispensers/peppertank{ - pixel_x = 30 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"bgI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bed, -/obj/machinery/flasher{ - id = "Cell 2"; - pixel_y = 28 - }, -/obj/machinery/camera{ - c_tag = "Security - Cell 2"; - dir = 2; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel, -/area/security/brig) -"bgJ" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/airalarm/kitchen_cold_room{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"bgK" = ( -/obj/structure/table/wood, -/obj/item/candle, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"bgL" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"bgM" = ( -/obj/structure/bodycontainer/morgue, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bgN" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/research) -"bgO" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/effect/spawner/xmastree/rdrod, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"bgP" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/white/side{ - dir = 5 - }, -/area/science/research) -"bgQ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bgR" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"bgS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bgT" = ( -/obj/structure/table/wood, -/obj/item/storage/box/seccarts{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/storage/box/deputy, -/obj/item/storage/secure/safe/HoS{ - pixel_x = 35 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"bgU" = ( -/obj/machinery/power/solar{ - id = "starboardsolar"; - name = "Starboard Solar Array" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel/airless/solarpanel, -/area/solar/starboard) -"bgV" = ( -/obj/machinery/power/solar{ - id = "starboardsolar"; - name = "Starboard Solar Array" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel/airless/solarpanel, -/area/solar/starboard) -"bgY" = ( -/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/structure/table/reinforced, -/obj/item/radio/intercom{ - pixel_x = 29 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bgZ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/solar/starboard) -"bha" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/space/basic, -/area/solar/starboard) -"bhb" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/space/basic, -/area/solar/starboard) -"bhc" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/space/basic, -/area/solar/starboard) -"bhd" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/space/basic, -/area/solar/starboard) -"bhe" = ( -/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 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"bhf" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/obj/machinery/icecream_vat, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"bhg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bhi" = ( -/obj/machinery/gibber, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"bhj" = ( -/obj/machinery/power/apc{ - areastring = "/area/quartermaster/storage"; - dir = 8; - name = "Cargo Bay APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"bhk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bhl" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/aft) -"bhm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"bhn" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bho" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bhp" = ( -/obj/machinery/light/small, -/turf/open/floor/plasteel/freezer, -/area/security/prison) -"bhq" = ( -/obj/structure/table, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/reagent_dispensers/peppertank{ - pixel_x = 30 - }, -/turf/open/floor/plasteel, -/area/security/main) -"bhr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 28 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"bhs" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"bht" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/item/storage/box/bodybags, -/obj/item/storage/backpack/duffelbag/sec/surgery, -/turf/open/floor/plasteel/white, -/area/security/brig) -"bhu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/grille, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bhv" = ( -/obj/machinery/rnd/production/techfab/department/security, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/security/main) -"bhw" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom{ - dir = 4 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"bhy" = ( -/obj/structure/chair/stool, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bhz" = ( -/obj/structure/table/reinforced, -/obj/item/assembly/igniter{ - pixel_x = 2; - pixel_y = -9 - }, -/obj/item/assembly/igniter{ - pixel_x = -9; - pixel_y = -2 - }, -/obj/item/assembly/igniter{ - pixel_x = -2; - pixel_y = 9 - }, -/obj/item/assembly/igniter{ - pixel_x = 9; - pixel_y = 2 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bhA" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/research) -"bhB" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/toxins, -/obj/item/storage/firstaid/toxin, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bhC" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/mob/living/carbon/monkey, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bhD" = ( -/mob/living/carbon/monkey, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bhE" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall, -/area/maintenance/port) -"bhF" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Medical - Virology Monkey Pin"; - dir = 4; - network = list("ss13","Medical","Virology") - }, -/mob/living/carbon/monkey, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bhH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Chapel Maintenance"; - req_access_txt = "0"; - req_one_access_txt = "12;22" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard) -"bhI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bhJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bhK" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bhL" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bhM" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/table, -/obj/item/book/manual/wiki/infections{ - pixel_y = 7 - }, -/obj/item/reagent_containers/spray/cleaner, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bhN" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Medical - Main 2"; - dir = 1; - network = list("ss13","Medical") - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bhO" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bhP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/requests_console{ - announcementConsole = 0; - department = "Medbay"; - departmentType = 1; - name = "Medbay RC"; - pixel_y = 30 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bhQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"bhR" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/item/stack/sheet/mineral/plasma, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/machinery/requests_console{ - department = "Virology"; - name = "Virology Requests Console"; - pixel_x = -32 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bhS" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/reagent_dispensers/virusfood{ - pixel_y = -32 - }, -/obj/item/clothing/gloves/color/latex, -/obj/item/healthanalyzer, -/obj/item/clothing/glasses/hud/health, -/obj/item/reagent_containers/dropper, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bhT" = ( -/obj/structure/table/glass, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"bhU" = ( -/obj/structure/table/glass, -/obj/item/storage/pill_bottle/mutadone, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"bhV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/obj/machinery/doorButtons/access_button{ - idDoor = "virology_airlock_interior"; - idSelf = "virology_airlock_control"; - name = "Virology Access Button"; - pixel_x = -28; - pixel_y = 8; - req_access_txt = "39" - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bhW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"bhX" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/crew_quarters/heads/cmo) -"bhY" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/crew_quarters/heads/cmo) -"bhZ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/crew_quarters/heads/cmo) -"bia" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"bib" = ( -/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, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bie" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/camera{ - c_tag = "Atmospherics - Main 1"; - dir = 4; - network = list("ss13","Atmospherics") - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bif" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/engine/atmos) -"big" = ( -/turf/closed/wall/r_wall, -/area/solar/aft) -"bih" = ( -/obj/machinery/door/airlock/engineering{ - name = "Aft Solar Access"; - req_access_txt = "10" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bii" = ( -/turf/closed/wall, -/area/solar/aft) -"bij" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"bik" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/aft) -"bil" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bim" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"bio" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/solar/aft) -"bip" = ( -/obj/machinery/power/solar{ - id = "starboardsolar"; - name = "Starboard Solar Array" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel/airless/solarpanel, -/area/solar/aft) -"biq" = ( -/obj/machinery/power/solar{ - id = "starboardsolar"; - name = "Starboard Solar Array" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel/airless/solarpanel, -/area/solar/aft) -"bir" = ( -/obj/structure/sign/poster/contraband/eat{ - pixel_y = -32 - }, -/obj/structure/kitchenspike, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"bis" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"biu" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"biv" = ( -/obj/structure/lattice/catwalk, -/obj/item/stack/cable_coil/random/five, -/turf/open/space/basic, -/area/solar/aft) -"biw" = ( -/obj/machinery/power/solar{ - id = "starboardsolar"; - name = "Starboard Solar Array" - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/airless/solarpanel, -/area/solar/aft) -"bix" = ( -/obj/machinery/power/solar{ - id = "starboardsolar"; - name = "Starboard Solar Array" - }, -/obj/structure/cable, -/turf/open/floor/plasteel/airless/solarpanel, -/area/solar/aft) -"biy" = ( -/obj/structure/table, -/obj/item/folder/red, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"biA" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/solar/aft) -"biB" = ( -/obj/machinery/vending/wallmed{ - pixel_y = -28 - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/medical/surgery) -"biC" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/solar/aft) -"biD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bed, -/obj/machinery/camera{ - c_tag = "Security - Cell 3"; - dir = 2; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel, -/area/security/brig) -"biE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/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 = -2; - pixel_y = 25; - prison_radio = 1 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"biF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"biG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/security/brig) -"biH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/flasher{ - id = "Cell 3"; - pixel_y = 28 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"biI" = ( -/obj/structure/closet/emcloset, -/obj/machinery/camera{ - c_tag = "Engineering - Engine Airlock"; - dir = 8; - network = list("ss13","Engineering","Engine") - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"biJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/camera{ - c_tag = "Security - Main Hall 1"; - dir = 8; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel, -/area/security/brig) -"biK" = ( -/obj/machinery/door/window/eastleft{ - name = "Armory"; - req_access_txt = "2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"biL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"biM" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/northleft{ - name = "Armory Desk"; - req_access_txt = "2" - }, -/turf/open/floor/plating, -/area/ai_monitored/security/armory) -"biN" = ( -/obj/machinery/door/poddoor/shutters{ - id = "armory"; - name = "Armoury Shutter" - }, -/obj/machinery/button/door{ - id = "armory"; - name = "Armory Shutters"; - pixel_x = 26; - req_access_txt = "3" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plating, -/area/ai_monitored/security/armory) -"biO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/dark, -/area/maintenance/aft) -"biP" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/security/brig) -"biQ" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"biR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/flasher{ - id = "Cell 4"; - pixel_y = 28 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"biS" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"biT" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"biU" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/ai_monitored/security/armory) -"biV" = ( -/obj/machinery/suit_storage_unit/security, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"biW" = ( -/obj/structure/rack, -/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/item/gun/grenadelauncher{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/gun/grenadelauncher, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) -"biX" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/ai_monitored/security/armory) -"biY" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow, -/obj/machinery/door/poddoor/preopen{ - id = "brigexternalblast"; - name = "External Security Blast Door" - }, -/turf/open/floor/plating, -/area/security/brig) -"biZ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "brigexternalblast"; - name = "External Security Blast Door" - }, -/turf/open/floor/plating, -/area/security/brig) -"bja" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - 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/solar/aft) -"bjb" = ( -/obj/structure/table, -/obj/item/tape/random, -/obj/item/tape/random{ - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"bjc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/storage/eva) -"bjd" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/storage/eva) -"bje" = ( -/obj/structure/sign/plaques/atmos{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bjf" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/landmark/start/security_officer, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/sign/plaques/golden{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/security/main) -"bjg" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bji" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"bjj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/sign/departments/examroom{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bjk" = ( -/obj/machinery/button/door{ - id = "permacell3"; - name = "Cell 3 Lockdown"; - pixel_x = 25; - pixel_y = -4; - req_access_txt = "2" - }, -/obj/machinery/button/flasher{ - id = "PCell 3"; - pixel_x = 24; - pixel_y = 6 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"bjl" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Security - Main Hall 3"; - dir = 2; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel, -/area/security/brig) -"bjm" = ( -/obj/machinery/holopad, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bjn" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/structure/sign/departments/cargo{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bjo" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/sign/departments/holy{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bjp" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/sign/departments/engineering{ - pixel_y = 32 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bjq" = ( -/obj/structure/table/glass, -/obj/machinery/microwave{ - pixel_y = 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 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bjr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/security/glass{ - name = "Long-Term Cell 3"; - req_access_txt = "2" - }, -/turf/open/floor/plasteel, -/area/security/prison) -"bjs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass{ - id_tag = "permabolt3"; - name = "Cell 3" - }, -/turf/open/floor/plasteel, -/area/security/prison) -"bjt" = ( -/obj/machinery/hydroponics/soil, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/item/seeds/random, -/turf/open/floor/plasteel, -/area/security/prison) -"bjv" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/item/seeds/ambrosia, -/turf/open/floor/plasteel, -/area/security/prison) -"bjw" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white/side{ - dir = 10 - }, -/area/science/research) -"bjx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"bjy" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"bjz" = ( -/obj/structure/table/wood, -/obj/item/folder/red, -/turf/open/floor/plasteel, -/area/security/courtroom) -"bjA" = ( -/obj/structure/table/wood, -/obj/item/radio/intercom{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/courtroom) -"bjB" = ( -/obj/structure/chair{ - dir = 8 - }, -/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/security/courtroom) -"bjC" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/item/paper, -/obj/item/pen, -/turf/open/floor/plasteel, -/area/security/prison) -"bjD" = ( -/obj/machinery/hydroponics/soil, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/item/seeds/potato, -/turf/open/floor/plasteel, -/area/security/prison) -"bjE" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/item/seeds/carrot, -/turf/open/floor/plasteel, -/area/security/prison) -"bjF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/item/beacon, -/turf/open/floor/plasteel, -/area/security/courtroom) -"bjG" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/security/courtroom) -"bjH" = ( -/obj/structure/table/wood, -/obj/item/gavelblock, -/turf/open/floor/plasteel, -/area/security/courtroom) -"bjI" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/grenade/flashbang, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/obj/item/key/security, -/obj/machinery/camera{ - c_tag = "Security - Equipment Room 1"; - dir = 4; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"bjJ" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/courtroom) -"bjK" = ( -/obj/structure/table/wood, -/obj/item/folder/blue, -/turf/open/floor/plasteel, -/area/security/courtroom) -"bjL" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/item/toy/dummy, -/turf/open/floor/plasteel/cafeteria, -/area/security/prison) -"bjM" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/plasteel, -/area/security/courtroom) -"bjN" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/courtroom) -"bjO" = ( -/obj/structure/closet/secure_closet/courtroom, -/obj/item/gavelhammer, -/turf/open/floor/plasteel, -/area/security/courtroom) -"bjP" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 4; - name = "sorting disposal pipe (Recycling)"; - sortType = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bjQ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "permacell2"; - name = "Cell 2 Lockdown"; - pixel_x = 25; - pixel_y = -4; - req_access_txt = "2" - }, -/obj/machinery/button/flasher{ - id = "PCell 2"; - pixel_x = 24; - pixel_y = 6 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"bjR" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/bot, -/turf/open/floor/plating, -/area/maintenance/fore) -"bjS" = ( -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/plating, -/area/security/prison) -"bjT" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/item/seeds/glowshroom, -/turf/open/floor/plasteel, -/area/security/prison) -"bjU" = ( -/obj/machinery/light_switch{ - pixel_y = 28 - }, -/turf/open/floor/plasteel, -/area/security/courtroom) -"bjW" = ( -/obj/structure/table, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"bjX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/button/door{ - id = "telelab"; - name = "Test Chamber Blast Doors"; - pixel_x = 25; - req_access_txt = "47" - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"bjY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"bjZ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bka" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"bkb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"bkc" = ( -/obj/machinery/door/airlock/research{ - name = "Toxins Lab"; - req_access_txt = "7" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bkd" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/security/glass{ - name = "Long-Term Cell 2"; - req_access_txt = "2" - }, -/turf/open/floor/plasteel, -/area/security/prison) -"bke" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/public/glass{ - id_tag = "permabolt2"; - name = "Cell 2" - }, -/turf/open/floor/plasteel, -/area/security/prison) -"bkf" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/crew_quarters/heads/hor) -"bkg" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"bkh" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/crew_quarters/heads/hor) -"bki" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/science) -"bkj" = ( -/obj/machinery/door/airlock/research{ - name = "Robotics Lab"; - req_access_txt = "29" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"bkk" = ( -/obj/structure/table/glass, -/obj/item/stack/sheet/mineral/plasma{ - amount = 4 - }, -/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/item/radio/intercom{ - pixel_x = 29 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bkl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bkm" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/science) -"bkn" = ( -/obj/machinery/vending/wardrobe/sec_wardrobe, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/button/door{ - id = "sciencecheckpoint"; - name = "Privacy Shutters Control"; - pixel_y = -24; - req_access_txt = "1" - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/science) -"bko" = ( -/obj/structure/closet/secure_closet/RD, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/heads/hor"; - dir = 8; - name = "RD Office APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"bkp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/science/research) -"bkq" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/crew_quarters/heads/hor) -"bkr" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/science) -"bks" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/science) -"bkt" = ( -/obj/machinery/suit_storage_unit/rd, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"bku" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/research) -"bkv" = ( -/obj/machinery/door/airlock/research{ - name = "Toxins Launch Room Access"; - req_access_txt = "7" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"bkw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"bkx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"bky" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/hallway/secondary/exit/departure_lounge) -"bkz" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"bkA" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/button/door{ - id = "permacell1"; - name = "Cell 1 Lockdown"; - pixel_x = 25; - pixel_y = -4; - req_access_txt = "2" - }, -/obj/machinery/button/flasher{ - id = "PCell 1"; - pixel_x = 24; - pixel_y = 6 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"bkB" = ( -/obj/structure/girder, -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/fore) -"bkC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"bkD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"bkE" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"bkF" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medical/Science Maintenance Access"; - req_access_txt = "0"; - req_one_access_txt = "5;47" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/medical) -"bkG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white/side{ - dir = 5 - }, -/area/science/research) -"bkH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/security/glass{ - name = "Long-Term Cell 1"; - req_access_txt = "2" - }, -/turf/open/floor/plasteel, -/area/security/prison) -"bkI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass{ - id_tag = "permabolt1"; - name = "Cell 1" - }, -/turf/open/floor/plasteel, -/area/security/prison) -"bkJ" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/item/plant_analyzer, -/obj/item/cultivator, -/obj/item/cultivator{ - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"bkK" = ( -/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 = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"bkL" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"bkM" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/medical) -"bkN" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Robotics Lab"; - req_access_txt = "29" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) -"bkO" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) -"bkP" = ( -/obj/structure/table, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/obj/item/stack/cable_coil, -/obj/item/assembly/flash/handheld/weak, -/obj/item/assembly/flash/handheld/weak, -/obj/item/assembly/flash/handheld/weak, -/obj/item/assembly/flash/handheld/weak, -/obj/item/assembly/flash/handheld/weak, -/obj/item/assembly/flash/handheld/weak, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/requests_console{ - department = "Robotics"; - departmentType = 2; - name = "Robotics RC"; - pixel_x = 30; - receive_ore_updates = 1 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"bkQ" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/table, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/exit/departure_lounge) -"bkR" = ( -/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{ - pixel_x = 5 - }, -/obj/item/transfer_valve{ - pixel_x = 5 - }, -/obj/structure/table/reinforced, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bkS" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/item/radio/intercom{ - pixel_x = 30 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bkU" = ( -/obj/machinery/door/window/eastright{ - base_state = "left"; - dir = 8; - icon_state = "left"; - name = "Fitness Ring" - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"bkV" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bkW" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"bkX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Civilian - Dorm Fitness 3"; - dir = 1; - network = list("ss13") - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bkY" = ( -/obj/structure/rack, -/obj/item/clothing/under/color/red, -/obj/item/clothing/neck/tie/red, -/obj/item/clothing/head/soft/red, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"bkZ" = ( -/obj/structure/closet/lasertag/blue, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"blb" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 5 - }, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/firealarm{ - pixel_z = 24 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"blc" = ( -/obj/structure/table, -/obj/machinery/light, -/obj/item/paper_bin{ - pixel_y = 6 - }, -/obj/item/pen, -/turf/open/floor/plasteel/white, -/area/science/explab) -"bld" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bed, -/obj/machinery/camera{ - c_tag = "Security - Cell 4"; - dir = 2; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel, -/area/security/brig) -"ble" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel, -/area/engine/atmos) -"blf" = ( -/obj/vehicle/ridden/janicart, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/janitor) -"blg" = ( -/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) -"blh" = ( -/obj/machinery/atmospherics/pipe/manifold{ - dir = 1 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/science/server) -"bli" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Dorms" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"blj" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/sign/warning/securearea{ - desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM"; - pixel_x = -32 - }, -/turf/open/floor/plating, -/area/science/server) -"blk" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"bll" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/sign/warning/securearea{ - desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM"; - pixel_x = 32 - }, -/turf/open/floor/plating, -/area/science/server) -"blm" = ( -/obj/machinery/processor, -/obj/machinery/requests_console{ - department = "Kitchen"; - departmentType = 2; - pixel_x = 30 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"bln" = ( -/obj/machinery/mecha_part_fabricator, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/button/door{ - dir = 2; - id = "robotics2"; - name = "Shutters Control Button"; - pixel_y = 24; - req_access_txt = "29" - }, -/obj/machinery/light_switch{ - pixel_x = -8; - pixel_y = 24 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"blo" = ( -/obj/machinery/light_switch{ - pixel_x = -4; - pixel_y = -24 - }, -/obj/machinery/vending/wardrobe/science_wardrobe, -/turf/open/floor/plasteel/white, -/area/science/explab) -"blp" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/item/pen{ - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"blq" = ( -/obj/machinery/atmospherics/pipe/simple, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/dark, -/area/science/server) -"blr" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/pill_bottle/dice, -/turf/open/floor/plasteel, -/area/security/prison) -"bls" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/toy/cards/deck/cas, -/obj/item/toy/cards/deck/cas/black{ - pixel_x = -2; - pixel_y = 2 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"blt" = ( -/obj/structure/table, -/obj/item/storage/belt/utility, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass{ - amount = 20; - pixel_x = -3; - pixel_y = 6 - }, -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"blu" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/pet/cat{ - name = "Tom" - }, -/turf/open/floor/plasteel, -/area/security/prison) -"blv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/newscaster{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"blw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"blx" = ( -/obj/structure/chair/stool, -/obj/effect/landmark/start/scientist, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bly" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/item/clothing/glasses/welding, -/obj/item/multitool{ - pixel_x = 3 - }, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"blz" = ( -/obj/structure/table, -/obj/item/folder/white, -/turf/open/floor/plasteel/dark, -/area/science/server) -"blA" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"blB" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/department/medical) -"blC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/research) -"blD" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"blE" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/research) -"blF" = ( -/obj/machinery/power/apc{ - areastring = "/area/security/checkpoint/medical"; - dir = 4; - name = "Medical Security Checkpoint APC"; - pixel_x = 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/yellow, -/obj/machinery/button/door{ - id = "medicalcheckpoint"; - name = "Privacy Shutters Control"; - pixel_x = 24; - pixel_y = 8; - req_access_txt = "1" - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"blG" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/research) -"blH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel/white, -/area/science/research) -"blI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"blJ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"blK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"blL" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"blM" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/department/medical) -"blN" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"blO" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"blP" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/item/book/manual/wiki/security_space_law, -/turf/open/floor/plasteel, -/area/security/checkpoint/science) -"blQ" = ( -/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/machinery/recharger{ - pixel_y = 4 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/science) -"blR" = ( -/obj/structure/closet/secure_closet/security, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/requests_console{ - department = "Security"; - departmentType = 5; - pixel_y = -30 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/science) -"blS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/science) -"blV" = ( -/obj/structure/rack, -/obj/item/aicard, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/heads/hor) -"blW" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "medicalcheckpoint"; - name = "checkpoint privacy shutters" - }, -/turf/open/floor/plating, -/area/security/checkpoint/medical) -"blX" = ( -/obj/structure/closet/secure_closet/security, -/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/reagent_dispensers/peppertank{ - pixel_x = -30 - }, -/obj/machinery/camera{ - c_tag = "Security - Arrival Checkpoint"; - dir = 4; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"blY" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/machinery/newscaster{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"blZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"bmb" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "robotics2"; - name = "robotics lab shutters" - }, -/turf/open/floor/plating, -/area/science/robotics/lab) -"bmc" = ( -/obj/structure/filingcabinet/chestdrawer, -/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, -/area/security/checkpoint/science) -"bme" = ( -/obj/machinery/door/airlock/research{ - name = "Kill Chamber"; - req_access_txt = "55" - }, -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plating, -/area/science/xenobiology) -"bmf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) -"bmg" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/structure/sign/poster/official/obey{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bmh" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/medical/genetics/cloning) -"bmj" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bmk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bml" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bmm" = ( -/obj/structure/grille/broken, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bmn" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high/plus, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"bmo" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/fore) -"bmp" = ( -/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/stock_parts/cell/high/plus, -/obj/item/stock_parts/cell/high/plus, -/obj/item/crowbar, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/obj/item/radio/headset/headset_sci{ - pixel_x = -3 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"bmq" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"bmr" = ( -/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, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"bms" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/landmark/start/depsec/medical, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"bmt" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"bmu" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/robotics_cyborgs{ - pixel_x = 2; - pixel_y = 5 - }, -/obj/item/reagent_containers/glass/beaker/large, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"bmv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bmw" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/medical/virology) -"bmx" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bmy" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/medical/virology) -"bmz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bmA" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bmB" = ( -/obj/structure/rack, -/obj/item/stack/sheet/iron/ten, -/obj/item/stack/sheet/glass{ - amount = 10; - pixel_y = 3 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bmC" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bmD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bmE" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bmF" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bmG" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bmH" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bmI" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "47" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bmJ" = ( -/turf/open/floor/plasteel, -/area/science/research) -"bmK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"bmL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white/side{ - dir = 10 - }, -/area/science/research) -"bmM" = ( -/obj/machinery/light, -/obj/machinery/camera{ - c_tag = "Research - Main 1"; - dir = 1; - network = list("ss13","Research") - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/research) -"bmN" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/obj/machinery/button/door{ - dir = 2; - id = "Skynet_launch"; - name = "Mech Bay Door Control"; - pixel_x = 24; - pixel_y = -6 - }, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) -"bmO" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bmP" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/mech_bay_recharge_floor, -/area/science/robotics/mechbay) -"bmQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) -"bmR" = ( -/obj/machinery/camera{ - c_tag = "Security - Interrogation Room"; - dir = 8; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"bmS" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/shutters{ - id = "Skynet_launch"; - name = "mech bay" - }, -/turf/open/floor/plating, -/area/science/robotics/mechbay) -"bmU" = ( -/obj/structure/grille, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bmV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bmX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bmY" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"bna" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bnb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bnc" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bnd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bne" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bnf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/holopad, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bng" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bnh" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bni" = ( -/obj/structure/table/reinforced, -/obj/item/wrench, -/obj/item/screwdriver{ - pixel_y = 10 - }, -/obj/item/analyzer, -/obj/item/pipe_dispenser, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bnj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bnk" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/science/xenobiology"; - dir = 4; - name = "Xenobiology APC"; - pixel_x = 24 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bnl" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Air to Distro" - }, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 - }, -/area/engine/atmos) -"bnm" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"bnn" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/light/small, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"bno" = ( -/obj/effect/landmark/start/roboticist, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"bnp" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/research) -"bnq" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/camera{ - c_tag = "Hallway - Central North 1"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bnr" = ( -/obj/machinery/computer/rdconsole/robotics{ - dir = 4 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"bns" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white/side{ - dir = 5 - }, -/area/science/research) -"bnt" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bnu" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/bananalamp{ - pixel_y = 3 - }, -/obj/structure/sign/poster/contraband/clown{ - pixel_x = -32 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"bnw" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bnx" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bny" = ( -/obj/machinery/light, -/obj/structure/chair/office/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/lab) -"bnz" = ( -/obj/machinery/computer/security/hos{ - dir = 1 - }, -/obj/machinery/light, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"bnA" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bnB" = ( -/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/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bnC" = ( -/obj/machinery/computer/mech_bay_power_console{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) -"bnD" = ( -/obj/machinery/monkey_recycler, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/requests_console{ - department = "Science"; - departmentType = 2; - name = "Science Requests Console"; - pixel_x = 30; - receive_ore_updates = 1 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bnE" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/circuit, -/area/science/robotics/mechbay) -"bnF" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bnG" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/mech_bay_recharge_floor, -/area/science/robotics/mechbay) -"bnH" = ( -/obj/machinery/door/window/northleft{ - 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) -"bnI" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/table, -/obj/machinery/computer/security/telescreen/toxins{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/research) -"bnJ" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/door/window/northleft{ - req_access_txt = "7" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/research) -"bnK" = ( -/obj/structure/table, -/obj/machinery/button/massdriver{ - dir = 2; - id = "toxinsdriver"; - pixel_x = 5 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/research) -"bnL" = ( -/obj/machinery/computer/security{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/computer/security/telescreen{ - name = "Science Security Cameras"; - network = list("Research"); - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/science) -"bnM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/science/research) -"bnN" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) -"bnO" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenocontainment"; - name = "containment chamber blastdoor" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bnP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) -"bnQ" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) -"bnS" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Service - Hydroponics Main 2"; - dir = 4; - network = list("ss13","Hydroponics") - }, -/obj/item/storage/box, -/obj/item/storage/box{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/stack/packageWrap{ - amount = 50; - desc = "You can use this to wrap items in. This one apparently came in an X-TRA LARGE bundle."; - max_amount = 50; - name = "SUPER package wrapper" - }, -/obj/item/destTagger{ - currTag = 20; - desc = "Used to set the destination of properly wrapped packages. This one seemed locked to the Kitchen as a destination."; - locked_destination = 1; - name = "kitchen destination tagger"; - pixel_x = 1 - }, -/obj/item/destTagger{ - currTag = 20; - desc = "Used to set the destination of properly wrapped packages. This one seemed locked to the Kitchen as a destination."; - locked_destination = 1; - name = "kitchen destination tagger"; - pixel_x = 4; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"bnT" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio3"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bnU" = ( -/obj/effect/spawner/lootdrop/two_percent_xeno_egg_spawner, -/turf/open/floor/engine, -/area/science/xenobiology) -"bnV" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/engine, -/area/science/xenobiology) -"bnW" = ( -/obj/machinery/aug_manipulator, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"bnX" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"bnZ" = ( -/obj/machinery/computer/apc_control{ - dir = 1 - }, -/obj/machinery/computer/security/telescreen/ce{ - dir = 1; - network = list("Engine","Telecom"); - pixel_y = -30 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/chief) -"boa" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bob" = ( -/obj/machinery/computer/station_alert{ - dir = 1 - }, -/obj/machinery/newscaster{ - pixel_y = -28 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/chief) -"bod" = ( -/obj/structure/table, -/obj/item/toy/figure/virologist, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"boe" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/fore) -"bof" = ( -/obj/machinery/door/poddoor{ - id = "toxinsdriver"; - name = "toxins launcher bay door" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bog" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/window/southleft{ - name = "Containment Pen"; - req_access_txt = "55" - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"boh" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/solar/aft) -"boi" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"boj" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=TOPMID"; - location = "TOPLEFT"; - name = "navigation beacon (TOPLEFT)" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bok" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/vacant_room/commissary) -"bol" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"bom" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bon" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"boo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/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) -"boq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"bor" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bos" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bot" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bou" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bov" = ( -/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/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bow" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"boA" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/supermatter) -"boC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/vacant_room/commissary) -"boD" = ( -/obj/structure/sign/warning/docking{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"boE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"boF" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/sign/warning/docking{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/entry) -"boG" = ( -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/flashlight/lamp, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/chief) -"boH" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"boJ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio2"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"boK" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"boL" = ( -/obj/machinery/door/window/northleft{ - 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) -"boM" = ( -/obj/machinery/chem_master, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"boN" = ( -/obj/structure/table/glass, -/obj/machinery/reagentgrinder{ - desc = "Used to grind things up into raw materials and liquids."; - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"boO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"boQ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai_upload) -"boS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/chief) -"boT" = ( -/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/computer/atmos_alert{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"boV" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/science/explab) -"boW" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"boX" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio2"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"boY" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"boZ" = ( -/obj/structure/table/glass, -/obj/item/storage/box/syringes{ - pixel_y = 5 - }, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 7 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bpa" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bpb" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bpc" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bpd" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bpe" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/sign/departments/custodian{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bpf" = ( -/obj/machinery/door/airlock{ - name = "Custodial Closet"; - req_access_txt = "26" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/janitor) -"bpg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bph" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bpi" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/janitor) -"bpj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/janitor) -"bpk" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/landmark/start/chemist, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"bpl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/janitor) -"bpm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/janitor) -"bpo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, -/area/library/lounge) -"bpp" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bpq" = ( -/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, -/obj/machinery/requests_console{ - department = "Atmospherics"; - departmentType = 3; - name = "Atmos RC"; - pixel_x = -30 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bpr" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/aft) -"bps" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bpt" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port Mix to West Ports" - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bpu" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bpv" = ( -/obj/structure/table, -/obj/item/hand_labeler, -/obj/item/stack/packageWrap, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/item/toy/figure/chemist, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"bpw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bpy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bpz" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bpA" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bpB" = ( -/obj/structure/lattice, -/obj/machinery/camera/motion{ - c_tag = "Secure - External Telecomm Sat West 1"; - dir = 8; - network = list("Telecom") - }, -/turf/open/space/basic, -/area/space/nearstation) -"bpC" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bpD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bpE" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bpF" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) -"bpG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bpH" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bpI" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bpJ" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bpK" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/light/small, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bpL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bpM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bpN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bpO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"bpP" = ( -/obj/machinery/door/airlock/engineering{ - name = "Gravity Generator"; - req_access_txt = "11" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bpR" = ( -/obj/machinery/camera{ - c_tag = "Engineering - Gravity Generator Main 1"; - network = list("ss13","Engineering") - }, -/obj/machinery/power/smes/engineering, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bpS" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bpT" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bpU" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bpV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bpX" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bpY" = ( -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bpZ" = ( -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bqa" = ( -/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/fitness/recreation) -"bqb" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/bottle/whiskey{ - pixel_x = 3 - }, -/obj/item/lighter, -/turf/open/floor/carpet, -/area/security/detectives_office) -"bqc" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bqd" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Research - Xenobiology Southern Kill Chamber"; - dir = 1; - network = list("ss13","Research","Xenobiology") - }, -/turf/open/floor/circuit/telecomms, -/area/science/xenobiology) -"bqe" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel/white/side, -/area/science/xenobiology) -"bqf" = ( -/obj/structure/sink{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bqg" = ( -/obj/machinery/computer/camera_advanced/xenobio, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bqh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/vacant_room/commissary) -"bqi" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bqk" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bql" = ( -/obj/structure/chair, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bqm" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bqn" = ( -/obj/structure/table/glass, -/obj/item/slime_scanner, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/glasses/science, -/obj/item/wrench, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bqo" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bqp" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bqq" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/camera{ - c_tag = "Hallway - Arrival Wing 2"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bqr" = ( -/obj/machinery/disposal/bin, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bqs" = ( -/obj/machinery/disposal/bin, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bqt" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio1"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bqu" = ( -/obj/structure/disposaloutlet{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bqv" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/window/northleft{ - name = "Containment Pen"; - req_access_txt = "55" - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bqw" = ( -/obj/machinery/door/window/northleft{ - name = "Containment Pen"; - req_access_txt = "55" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio1"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bqx" = ( -/obj/structure/table/glass, -/obj/item/storage/box/monkeycubes, -/obj/item/storage/box/monkeycubes, -/obj/machinery/light, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bqy" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio1"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bqz" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/button/door{ - id = "xenobio3"; - name = "Containment Blast Doors"; - pixel_y = 4; - req_access_txt = "55" - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bqA" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/button/door{ - id = "xenobio2"; - name = "Containment Blast Doors"; - pixel_y = 4; - req_access_txt = "55" - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bqB" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/button/door{ - id = "xenobio1"; - name = "Containment Blast Doors"; - pixel_y = 4; - req_access_txt = "55" - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bqC" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bqD" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/button/door{ - id = "xenobio6"; - name = "Containment Blast Doors"; - pixel_y = -2; - req_access_txt = "55" - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bqE" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/button/door{ - id = "xenobio5"; - name = "Containment Blast Doors"; - pixel_y = -2; - req_access_txt = "55" - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bqF" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/button/door{ - id = "xenobio4"; - name = "Containment Blast Doors"; - pixel_y = -2; - req_access_txt = "55" - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bqG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio6"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bqH" = ( -/obj/machinery/door/window/southleft{ - 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) -"bqI" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio6"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bqJ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio5"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bqK" = ( -/obj/machinery/door/window/southleft{ - name = "Containment Pen"; - req_access_txt = "55" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio5"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bqL" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio5"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bqM" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio4"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bqN" = ( -/obj/machinery/door/window/southleft{ - name = "Containment Pen"; - req_access_txt = "55" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio4"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bqO" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio4"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bqP" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"bqQ" = ( -/obj/structure/bed, -/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/tile/neutral, -/obj/machinery/light_switch{ - pixel_x = -24 - }, -/obj/item/bedsheet/dorms, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"bqR" = ( -/obj/structure/bed, -/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/tile/neutral, -/obj/machinery/light_switch{ - pixel_x = 24 - }, -/obj/item/bedsheet/dorms, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"bqS" = ( -/obj/structure/table/wood, -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/turf/open/floor/carpet, -/area/security/detectives_office) -"bqT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/tcommsat/computer) -"bqU" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bqV" = ( -/obj/structure/table, -/obj/item/storage/crayons, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"bqX" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bqY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bqZ" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bra" = ( -/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/tile/neutral, -/obj/structure/window/reinforced/tinted{ - dir = 8 - }, -/obj/structure/dresser, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"brb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"brc" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"brd" = ( -/obj/structure/table/wood, -/obj/item/taperecorder, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"bre" = ( -/obj/structure/rack, -/obj/item/storage/briefcase, -/obj/item/camera/detective, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"brf" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/fitness/recreation) -"brg" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"brh" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/landmark/start/assistant, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bri" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"brj" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"brk" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"brl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"brm" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"brn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"bro" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"brp" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"brq" = ( -/obj/structure/chair/stool, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"brr" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"brs" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"brt" = ( -/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/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"bru" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/science/research) -"brv" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"brw" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel, -/area/engine/atmos) -"brx" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - 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/solar/aft) -"bry" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Kitchen Maintenance"; - req_access_txt = "28" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/showroomfloor, -/area/maintenance/port/aft) -"brz" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"brA" = ( -/obj/machinery/door/airlock/atmos{ - name = "Turbine Access"; - req_access_txt = "32" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"brB" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - dir = 1; - freq = 1400; - location = "Kitchen"; - name = "navigation beacon (Kitchen Delivery)" - }, -/obj/structure/plasticflaps/opaque, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/obj/machinery/door/window/northleft{ - name = "Kitchen Delivery Access"; - req_access_txt = "28" - }, -/turf/open/floor/plasteel{ - dir = 2 - }, -/area/crew_quarters/kitchen/coldroom) -"brC" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/table, -/obj/item/storage/toolbox/electrical, -/obj/item/stack/cable_coil/random, -/turf/open/floor/plating, -/area/solar/aft) -"brD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"brE" = ( -/turf/open/floor/plating, -/area/solar/aft) -"brF" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/solar/aft) -"brG" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"brH" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/plating, -/area/solar/aft) -"brI" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/plating, -/area/solar/aft) -"brJ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/plating, -/area/solar/aft) -"brK" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Air to Ports" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"brL" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Mix to Ports" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"brM" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Pure to Ports" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"brN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"brO" = ( -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/engine/atmos) -"brP" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/engine/atmos) -"brQ" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/engine/atmos) -"brR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"brT" = ( -/obj/machinery/power/smes, -/obj/structure/cable/yellow, -/obj/machinery/camera{ - c_tag = "Engineering - Port Quarter Aux Solars Access"; - dir = 1; - network = list("ss13","Engineering") - }, -/turf/open/floor/plating, -/area/solar/aft) -"brU" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/light_switch{ - pixel_y = 28 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/camera{ - c_tag = "Atmospherics - Main 3"; - dir = 2; - network = list("ss13","Atmospherics") - }, -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel, -/area/engine/atmos) -"brV" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/solar/aft) -"brW" = ( -/obj/machinery/power/solar_control{ - dir = 8; - id = "aftstarboard"; - name = "Starboard Quarter Solar Control"; - track = 0 - }, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/solar/aft) -"brX" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"brY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/requests_console{ - department = "Cargo Bay"; - departmentType = 2; - pixel_y = -30 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"brZ" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"bsa" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsb" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/storage/tech) -"bsc" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/exit/departure_lounge) -"bsd" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bse" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bsf" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bsg" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/closet/crate{ - name = "Spare Toner Cartridges" - }, -/obj/item/toner, -/obj/item/toner, -/obj/item/toner, -/obj/item/toner, -/turf/open/floor/plating, -/area/maintenance/fore) -"bsh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bsi" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bsk" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsl" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsm" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsn" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/camera{ - c_tag = "Cargo - Docking Bay"; - dir = 1; - network = list("ss13") - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"bso" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsp" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bsq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsr" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kanyewest"; - name = "privacy shutters" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/security/detectives_office) -"bss" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/starboard/fore) -"bst" = ( -/obj/machinery/door/airlock/engineering{ - name = "Tech Storage"; - req_access_txt = "23" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/storage/tech) -"bsu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/grass, -/area/hydroponics/garden) -"bsv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plating, -/area/storage/tech) -"bsw" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bsy" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bsz" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bsA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bsB" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/solar/aft) -"bsC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/closet/crate{ - name = "Excess Courtroom Supplies" - }, -/obj/item/clothing/suit/judgerobe, -/obj/item/gavelblock, -/obj/item/gavelhammer, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/item/stack/sheet/mineral/copper{ - amount = 5 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bsD" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/storage/tech) -"bsF" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Civilian - Dorm Fitness 1"; - dir = 8; - network = list("ss13") - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bsG" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsH" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsI" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsJ" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/storage/tech) -"bsK" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"bsL" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/vacant_room/commissary) -"bsN" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsO" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsQ" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "0"; - req_one_access_txt = "6;12;50" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/starboard) -"bsR" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsS" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bsT" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsV" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/vacant_room/commissary) -"bsX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsY" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bsZ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bta" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"btb" = ( -/obj/structure/chair/stool, -/obj/effect/landmark/start/scientist, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/lab) -"btc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"btd" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kanyewest"; - name = "privacy shutters" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/security/detectives_office) -"bte" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"btf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"btg" = ( -/obj/effect/turf_decal/tile/blue, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bth" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bti" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/vacant_room/commissary) -"btj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"btk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"btl" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"btm" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"btn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/circuit, -/area/ai_monitored/nuke_storage) -"bto" = ( -/obj/structure/chair/office/light, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"btp" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"btq" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"btr" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/newscaster{ - pixel_x = -32 - }, -/obj/machinery/camera{ - c_tag = "Civilian - Commissary"; - dir = 1; - network = list("ss13") - }, -/turf/open/floor/plasteel, -/area/vacant_room/commissary) -"bts" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"btt" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"btu" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/grass, -/area/hydroponics/garden) -"btv" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"btw" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/grass, -/area/hydroponics/garden) -"btx" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/grass, -/area/hydroponics/garden) -"bty" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/grass, -/area/hydroponics/garden) -"btz" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"btA" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"btB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/grass, -/area/hydroponics/garden) -"btC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"btD" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/grass, -/area/hydroponics/garden) -"btE" = ( -/obj/machinery/light_switch{ - pixel_x = -24; - pixel_y = -8 - }, -/obj/machinery/button/door{ - id = "kanyewest"; - name = "Privacy Shutters"; - pixel_x = -24 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"btF" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/grass, -/area/hydroponics/garden) -"btG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"btH" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"btI" = ( -/obj/machinery/door/airlock/security{ - name = "Detective's Office"; - req_access_txt = "4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"btJ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"btK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"btL" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"btM" = ( -/obj/structure/table/wood, -/obj/item/taperecorder, -/obj/item/cartridge/lawyer, -/obj/machinery/requests_console{ - department = "Law office"; - pixel_x = -32 - }, -/turf/open/floor/wood, -/area/lawoffice) -"btN" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/lawoffice) -"btP" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/landmark/start/lawyer, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/lawoffice) -"btQ" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/lawoffice) -"btR" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/security_space_law, -/turf/open/floor/wood, -/area/lawoffice) -"btS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/wood, -/area/lawoffice) -"btT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/wood, -/area/lawoffice) -"btU" = ( -/obj/machinery/door/airlock/hatch{ - name = "TeleSat Space Access Airlock"; - req_one_access_txt = "32;19" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/tcommsat/computer) -"btV" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"btW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/light_switch{ - pixel_x = 24 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/wood, -/area/lawoffice) -"btX" = ( -/obj/machinery/door/airlock{ - name = "Law Office"; - req_access_txt = "38" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/lawoffice) -"btY" = ( -/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/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"btZ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bua" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bub" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "lawyerprivate"; - name = "privacy shutters" - }, -/turf/open/floor/plating, -/area/lawoffice) -"buc" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bud" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bue" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"buf" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bug" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/storage/tools) -"buh" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"buj" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"buk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bul" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"bum" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"bun" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"buo" = ( -/obj/machinery/door/airlock{ - name = "Hydroponics Backroom"; - req_access_txt = "35" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/hydroponics) -"bup" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/hydroponics) -"buq" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/hydroponics) -"bur" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"bus" = ( -/obj/machinery/disposal/bin{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"but" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"buu" = ( -/obj/structure/closet/crate, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"buv" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hydroponics) -"buw" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"bux" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"buy" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"buz" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hydroponics) -"buA" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/closet/cardboard, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"buB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"buC" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"buE" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"buG" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"buH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"buI" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"buK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"buL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"buM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"buN" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"buO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/storage/eva) -"buP" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"buQ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"buR" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/hop) -"buS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"buT" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"buU" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"buV" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"buW" = ( -/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/tile/neutral, -/obj/machinery/holopad, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"buX" = ( -/obj/structure/fireaxecabinet{ - pixel_x = -32 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"buZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"bva" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/storage/eva) -"bvb" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bvc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/storage/eva) -"bvd" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"bve" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/storage/eva) -"bvf" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"bvg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/storage/eva) -"bvh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/storage/eva) -"bvi" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"bvj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/carpet, -/area/library/lounge) -"bvk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/carpet, -/area/library/lounge) -"bvl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/library/lounge) -"bvm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/library/lounge) -"bvn" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"bvo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/library) -"bvp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bvq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/library/lounge) -"bvr" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/wood, -/area/library/lounge) -"bvs" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/wood, -/area/library/lounge) -"bvt" = ( -/obj/structure/closet/wardrobe/green, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/camera{ - c_tag = "Civilian - Dorm Main 2"; - dir = 8; - network = list("ss13") - }, -/obj/structure/sign/poster/official/help_others{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"bvu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/library) -"bvv" = ( -/obj/structure/sign/plaques/kiddie/library{ - pixel_x = 32 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/wood, -/area/library) -"bvw" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/wood, -/area/library) -"bvx" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/wood, -/area/library/lounge) -"bvy" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bvz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/library) -"bvA" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/wood, -/area/library) -"bvB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/wood, -/area/library) -"bvC" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/wood, -/area/library) -"bvD" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/hallway/secondary/exit/departure_lounge) -"bvE" = ( -/obj/item/toy/beach_ball/holoball, -/turf/open/floor/plating, -/area/crew_quarters/bar) -"bvF" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/hallway/secondary/exit/departure_lounge) -"bvG" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/construction) -"bvH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bvI" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port to Filter" - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bvJ" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bvK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bvL" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high/plus, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plating, -/area/construction) -"bvM" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"bvN" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bvO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bvP" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/status_display/evac{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/hallway/secondary/exit/departure_lounge) -"bvQ" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bvR" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bvS" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/entry) -"bvT" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/hallway/secondary/exit/departure_lounge) -"bvU" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"bvV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"bvW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"bvX" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"bvY" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/camera{ - c_tag = "Hallway - Departures Wing 3"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bvZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/hallway/secondary/exit/departure_lounge) -"bwa" = ( -/obj/structure/chair/office/light, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"bwb" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bwc" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white/corner{ - dir = 4 - }, -/area/hallway/secondary/exit/departure_lounge) -"bwd" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/security/checkpoint) -"bwe" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/hallway/secondary/exit/departure_lounge) -"bwf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bwg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bwh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "cargowarehouse"; - name = "warehouse shutter controls"; - pixel_x = 8; - pixel_y = -24; - req_access_txt = "50" - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"bwi" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bwj" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bwk" = ( -/obj/machinery/door/airlock/security{ - name = "Security Checkpoint"; - req_access_txt = "1" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"bwl" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L1" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bwm" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L3" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bwn" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L5" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bwo" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L7" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bwp" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L9" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/disposalpipe/junction/yjunction, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bwq" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L11" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bwr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bws" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L13" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bwv" = ( -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"bwy" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bwz" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bwA" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"bwB" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bwC" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=RIGHTTOP"; - location = "TOPRIGHT"; - name = "navigation beacon (TOPRIGHT)" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bwD" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/spawner/lootdrop/crate_spawner, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bwF" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bwG" = ( -/obj/structure/disposaloutlet{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bwH" = ( -/obj/machinery/recycler, -/obj/machinery/conveyor{ - dir = 4; - id = "garbage" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bwI" = ( -/obj/machinery/conveyor{ - dir = 6; - id = "garbage" - }, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bwJ" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bwK" = ( -/obj/machinery/conveyor/inverted{ - dir = 5; - id = "garbage" - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bwL" = ( -/obj/machinery/light/small, -/turf/open/floor/plasteel/white/side{ - dir = 5 - }, -/area/science/research) -"bwM" = ( -/obj/machinery/light/small, -/obj/structure/sign/departments/medbay/alt{ - pixel_y = -32 - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/research) -"bwN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bwO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bwP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bwQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/requests_console{ - department = "Atmospherics"; - departmentType = 3; - name = "Atmos RC"; - pixel_x = 30 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bwR" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"bwS" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bwT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bwV" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel, -/area/engine/engineering) -"bwY" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bwZ" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall, -/area/maintenance/aft) -"bxa" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bxb" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "garbage" - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bxc" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bxd" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/maintenance/aft) -"bxe" = ( -/obj/machinery/conveyor{ - dir = 10; - id = "garbage" - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bxf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bxg" = ( -/obj/machinery/disposal/bin, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"bxh" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"bxi" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/light_switch{ - pixel_x = 8; - pixel_y = 24 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"bxj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"bxk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bxl" = ( -/obj/machinery/telecomms/server/presets/security, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bxm" = ( -/obj/machinery/telecomms/server/presets/supply, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bxn" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"bxo" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister/bz, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bxp" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"bxq" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bxr" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bxs" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bxt" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"bxv" = ( -/obj/machinery/door/airlock/virology{ - autoclose = 0; - frequency = 1449; - id_tag = "virology_airlock_exterior"; - name = "Virology Exterior Airlock"; - req_access_txt = "39" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/doorButtons/access_button{ - idDoor = "virology_airlock_exterior"; - idSelf = "virology_airlock_control"; - name = "Virology Access Button"; - pixel_y = -24; - req_access_txt = "39" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bxw" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bxx" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Library" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/library) -"bxy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/wood, -/area/library) -"bxz" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/ai_monitored/storage/eva) -"bxA" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/ai_monitored/storage/eva) -"bxB" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/ai_monitored/storage/eva) -"bxC" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/ai_monitored/storage/eva) -"bxD" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/ai_monitored/storage/eva) -"bxF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bxG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bxH" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bxI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bxM" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bxN" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bxO" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bxP" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L10" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bxQ" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bxR" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bxS" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bxT" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bxU" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bxV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bxW" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bxX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/sign/directions/medical{ - dir = 8; - pixel_x = -30; - pixel_y = 32 - }, -/obj/structure/sign/directions/science{ - dir = 8; - pixel_x = -30; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bxY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bxZ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bya" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"byb" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"byc" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/hallway/secondary/exit/departure_lounge) -"byd" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/chair, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bye" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"byf" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/entry) -"byg" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"byh" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"byi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"byj" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1447; - listening = 0; - name = "Station Intercom (AI Private)"; - pixel_y = -29 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/camera/motion{ - c_tag = "Secure - AI Foyer"; - dir = 1; - network = list("AISat") - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"byk" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"byl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"bym" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"byn" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"byo" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"byp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"byq" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bys" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai_upload) -"byt" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"byu" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/machinery/button/door{ - id = "roboticsprivacy"; - name = "Desk Privacy Shutters Control"; - pixel_x = 4; - pixel_y = 24 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"byv" = ( -/obj/structure/table/wood, -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, -/area/library) -"byw" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/vending/snack/random, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"byx" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/turf/open/floor/carpet, -/area/library/lounge) -"byy" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/crew_quarters/fitness/recreation) -"byz" = ( -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/turf/open/floor/wood, -/area/library) -"byA" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/item/radio/intercom{ - pixel_x = 30 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"byB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/pickaxe{ - pixel_x = 5 - }, -/obj/item/shovel{ - pixel_x = -5 - }, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"byC" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/landmark/start/assistant, -/obj/item/radio/intercom{ - pixel_x = 30 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"byD" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"byE" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/cigarettes, -/obj/item/clothing/glasses/sunglasses/advanced, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/carpet, -/area/security/detectives_office) -"byF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"byG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kanyewest"; - name = "privacy shutters" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/security/detectives_office) -"byH" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kanyewest"; - name = "privacy shutters" - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/security/detectives_office) -"byJ" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/camera/motion{ - c_tag = "Secure - AI Storage"; - dir = 1; - network = list("AISat") - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/service) -"byK" = ( -/obj/structure/bodycontainer/morgue, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"byL" = ( -/obj/structure/table, -/obj/item/aiModule/supplied/freeform, -/obj/structure/sign/plaques/kiddie{ - pixel_x = 32 - }, -/obj/machinery/camera/motion{ - c_tag = "Secure - AI Upload Main 2"; - dir = 8; - network = list("ss13","Secure") - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai_upload) -"byM" = ( -/obj/structure/table, -/obj/machinery/light, -/obj/item/reagent_containers/food/snacks/grown/poppy, -/obj/item/reagent_containers/food/snacks/grown/poppy{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/reagent_containers/food/snacks/grown/poppy{ - pixel_x = -1 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"byN" = ( -/obj/structure/filingcabinet, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/security/detectives_office) -"byO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"byP" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Quartermaster"; - req_access_txt = "41" - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"byQ" = ( -/obj/structure/table, -/obj/machinery/plantgenes{ - pixel_y = 6 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"byR" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/quartermaster/qm) -"byS" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/quartermaster/qm) -"byT" = ( -/turf/closed/wall, -/area/quartermaster/qm) -"byU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"byV" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Cargo Bay"; - req_access_txt = "0"; - req_one_access_txt = "31;48" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"byW" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"byX" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"byZ" = ( -/obj/effect/turf_decal/tile/neutral{ - 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/structure/closet/crate/coffin, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bza" = ( -/obj/machinery/computer/bounty{ - dir = 4 - }, -/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/item/radio/intercom{ - pixel_x = -30 - }, -/obj/machinery/camera{ - c_tag = "Cargo - Quartermaster's Office"; - dir = 4; - network = list("ss13") - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"bzb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"bzc" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"bzd" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bze" = ( -/obj/structure/closet/secure_closet/quartermaster, -/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/quartermaster/qm) -"bzf" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/quartermaster/qm) -"bzg" = ( -/obj/structure/closet/emcloset, -/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/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bzh" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bzi" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/candle_box, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"bzj" = ( -/obj/structure/chair, -/obj/effect/landmark/start/chaplain, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"bzk" = ( -/obj/structure/table/wood, -/obj/item/toy/figure/chaplain, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"bzl" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bzm" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp{ - pixel_y = 10 - }, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"bzn" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/item/storage/crayons, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"bzo" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/bottle/holywater, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"bzp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"bzq" = ( -/turf/closed/wall, -/area/chapel/main) -"bzr" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bzs" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bzt" = ( -/obj/structure/table, -/obj/item/clothing/head/soft, -/obj/item/clothing/head/soft{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/machinery/camera{ - c_tag = "Cargo - Main 2"; - dir = 8; - network = list("ss13") - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 28 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bzu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/obj/machinery/button/door{ - id = "cargowarehouse"; - name = "warehouse shutter controls"; - pixel_x = -24; - pixel_y = 8; - req_access_txt = "50" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"bzv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"bzw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"bzx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"bzy" = ( -/obj/machinery/computer/security/qm{ - dir = 4 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/requests_console{ - department = "Cargo Bay"; - departmentType = 2; - pixel_x = -30 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"bzA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"bzB" = ( -/obj/machinery/vending/wardrobe/chap_wardrobe, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bzC" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/holopad, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"bzD" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags, -/obj/item/storage/box/bodybags{ - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"bzE" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/storage/tech"; - dir = 4; - name = "Tech Storage APC"; - pixel_x = 24 - }, -/turf/open/floor/plating, -/area/storage/tech) -"bzF" = ( -/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/tile/neutral{ - dir = 8 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Sleeping Quarters" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"bzG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"bzH" = ( -/obj/structure/table, -/obj/item/radio/intercom{ - pixel_y = -25 - }, -/turf/open/floor/plating, -/area/storage/tech) -"bzI" = ( -/obj/structure/showcase/cyborg/old{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai_upload) -"bzJ" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/techstorage/AI, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"bzK" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel, -/area/engine/engineering) -"bzL" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/circuit, -/area/ai_monitored/nuke_storage) -"bzM" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/techstorage/RnD_secure, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"bzN" = ( -/obj/structure/chair/stool, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main) -"bzO" = ( -/obj/structure/chair/stool, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/landmark/start/assistant, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/chapel{ - dir = 4 - }, -/area/chapel/main) -"bzP" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall, -/area/chapel/office) -"bzQ" = ( -/obj/structure/chair/stool, -/obj/effect/landmark/start/virologist, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bzR" = ( -/obj/structure/closet/l3closet, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/camera{ - c_tag = "Medical - Virology Airlock"; - dir = 2; - network = list("ss13","Medical") - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bzS" = ( -/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/tile/neutral, -/obj/structure/window/reinforced, -/obj/machinery/door/window/eastleft, -/turf/open/floor/plasteel/dark, -/area/janitor) -"bzU" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/landmark/start/chief_medical_officer, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"bzV" = ( -/obj/structure/chair/office, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/landmark/start/botanist, -/turf/open/floor/plasteel, -/area/hydroponics) -"bzW" = ( -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"bzX" = ( -/obj/structure/bed, -/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/tile/neutral, -/obj/item/bedsheet/purple, -/obj/effect/landmark/start/janitor, -/turf/open/floor/plasteel/dark, -/area/janitor) -"bzY" = ( -/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/tile/neutral, -/obj/structure/window/reinforced, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/janitor) -"bzZ" = ( -/obj/structure/chair/stool, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/landmark/start/janitor, -/turf/open/floor/plasteel, -/area/janitor) -"bAa" = ( -/obj/machinery/portable_atmospherics/canister/water_vapor, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/janitor) -"bAb" = ( -/obj/effect/landmark/start/atmospheric_technician, -/obj/structure/chair/stool, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bAc" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/closed/wall, -/area/chapel/office) -"bAd" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Chapel Office"; - req_access_txt = "22" - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bAe" = ( -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"bAf" = ( -/obj/structure/chair/office, -/obj/effect/landmark/start/quartermaster, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"bAg" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/quartermaster/qm) -"bAh" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bAi" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bAj" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/chapel/office) -"bAk" = ( -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main) -"bAl" = ( -/turf/open/floor/plasteel/chapel{ - dir = 4 - }, -/area/chapel/main) -"bAm" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/chapel/main) -"bAn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai_upload) -"bAo" = ( -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bAp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai_upload) -"bAr" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"bAs" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/chapel, -/area/chapel/main) -"bAt" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/chapel/main) -"bAu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai_upload) -"bAv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai_upload) -"bAw" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel/chapel, -/area/chapel/main) -"bAx" = ( -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/chapel/main) -"bAy" = ( -/turf/open/floor/plasteel/chapel, -/area/chapel/main) -"bAz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/chapel, -/area/chapel/main) -"bAA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/transit_tube/station/reverse/flipped, -/obj/structure/transit_tube_pod{ - dir = 4; - icon_state = "pod" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bAC" = ( -/obj/structure/lattice/catwalk, -/obj/structure/sign/warning/fire{ - pixel_y = -32 - }, -/turf/open/space/basic, -/area/space/nearstation) -"bAD" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bAE" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/machinery/camera/autoname{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"bAF" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bAG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bAH" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Chapel Maintenance"; - req_access_txt = "0"; - req_one_access_txt = "12;20" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bAI" = ( -/obj/structure/lattice, -/obj/structure/transit_tube/crossing, -/turf/open/space/basic, -/area/space/nearstation) -"bAJ" = ( -/obj/effect/landmark/start/cargo_technician, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bAK" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bAL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bAM" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;25;46" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/maintenance/port/aft) -"bAN" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bAP" = ( -/obj/structure/table, -/obj/item/hand_labeler, -/obj/item/stack/packageWrap, -/obj/item/destTagger, -/obj/item/destTagger{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/radio/intercom{ - pixel_x = 30 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bAQ" = ( -/obj/machinery/computer/cargo{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - areastring = "/area/quartermaster/qm"; - dir = 8; - name = "Quartermaster's Office APC"; - pixel_x = -24 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"bAR" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main) -"bAS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"bAT" = ( -/turf/open/floor/carpet, -/area/chapel/main) -"bAU" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, -/area/chapel/main) -"bAV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"bAW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"bAX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/carpet, -/area/chapel/main) -"bAY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main) -"bAZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=RIGHTBOTTOM"; - location = "RIGHTMID"; - name = "navigation beacon (RIGHTMID)" - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bBa" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"bBb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bBc" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel/chapel, -/area/chapel/main) -"bBd" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/chapel/main) -"bBe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/chapel/main) -"bBf" = ( -/obj/machinery/camera{ - c_tag = "Civilian - Chapel Main 3"; - dir = 8; - network = list("ss13") - }, -/turf/open/floor/plasteel/chapel, -/area/chapel/main) -"bBg" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Research Director"; - req_access_txt = "30"; - security_level = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"bBh" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/stamp/qm, -/obj/item/toy/figure/qm{ - pixel_x = 5; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"bBi" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/cartridge/quartermaster{ - pixel_x = 6; - pixel_y = 5 - }, -/obj/item/cartridge/quartermaster{ - pixel_x = -4; - pixel_y = 7 - }, -/obj/item/cartridge/quartermaster, -/obj/item/coin/silver, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"bBj" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bBk" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"bBl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bBn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bBo" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/rack, -/obj/item/storage/toolbox/electrical, -/obj/item/storage/toolbox/electrical{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/assembly/signaler{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/assembly/signaler{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/assembly/signaler, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"bBp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main) -"bBq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/research) -"bBr" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"bBs" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "roboticsprivacy"; - name = "robotics privacy shutters" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/science/robotics/lab) -"bBt" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"bBv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/chapel{ - dir = 4 - }, -/area/chapel/main) -"bBw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main) -"bBx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/chapel{ - dir = 4 - }, -/area/chapel/main) -"bBy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main) -"bBz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/chapel{ - dir = 4 - }, -/area/chapel/main) -"bBA" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main) -"bBB" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate/trashcart, -/obj/item/storage/bag/trash, -/obj/item/trash/candy, -/obj/item/trash/candy, -/obj/item/trash/popcorn, -/obj/item/trash/plate, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bBD" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - areastring = "/area/medical/morgue"; - dir = 8; - name = "Morgue APC"; - pixel_x = -24 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bBE" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/structure/grille, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bBF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"bBG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"bBH" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 - }, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main) -"bBI" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main) -"bBJ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/sorting/mail{ - name = "sorting disposal pipe (Robotics)"; - sortType = 14 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bBK" = ( -/obj/item/beacon, -/turf/open/floor/engine, -/area/science/xenobiology) -"bBL" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/department/medical) -"bBN" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/medical) -"bBO" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "5;12;47" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/medical) -"bBP" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bBQ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bBR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bBS" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"bBT" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plasteel/white/corner, -/area/science/explab) -"bBU" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"bBV" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/science/explab) -"bBW" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"bBX" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bBY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bBZ" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bCa" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bCb" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Chief Medical Officer"; - req_access_txt = "40"; - security_level = 6 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"bCc" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bCd" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"bCe" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Atmospherics Maintenance"; - req_access_txt = "24" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) -"bCg" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bCh" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/fore) -"bCi" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "5;12" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bCj" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "hop"; - name = "Privacy Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/heads/hop) -"bCk" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/stamp/hop, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"bCl" = ( -/obj/machinery/vending/cart, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/camera{ - c_tag = "Bridge - Head of Personnel's Office"; - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"bCm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/airlock/command{ - name = "Head of Personnel's Private Quarters"; - req_access_txt = "57"; - security_level = 6 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"bCn" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/bridge) -"bCo" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/bot, -/obj/machinery/door/firedoor, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "hop"; - name = "Privacy Shutters" - }, -/obj/machinery/door/window/eastleft{ - name = "Desk Access"; - req_access_txt = "57" - }, -/obj/machinery/door/window/westright{ - name = "Desk Access" - }, -/turf/open/floor/plating, -/area/crew_quarters/heads/hop) -"bCp" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bCq" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bCr" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bCs" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/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/wood, -/area/crew_quarters/heads/hop) -"bCt" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/bridge) -"bCu" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/security/checkpoint) -"bCv" = ( -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/window/northleft{ - name = "Checkpoint Desk"; - req_access_txt = "1" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"bCw" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/security/checkpoint) -"bCx" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/vacant_room/commissary) -"bCy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = -5; - pixel_y = -31 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"bCz" = ( -/obj/machinery/chem_master/condimaster, -/turf/open/floor/plasteel, -/area/hydroponics) -"bCA" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/northleft{ - name = "Hydroponics Desk"; - req_access_txt = "35" - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"bCB" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/northright{ - name = "Hydroponics Desk"; - req_access_txt = "35" - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"bCC" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Public Garden" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hydroponics/garden) -"bCD" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/maintenance/starboard/fore"; - dir = 4; - name = "Starboard Aux Maintenance APC"; - pixel_x = 24 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"bCE" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/plasteel, -/area/hydroponics) -"bCG" = ( -/obj/structure/table, -/obj/machinery/smartfridge/disks{ - pixel_y = 2 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"bCI" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/grass, -/area/hydroponics/garden) -"bCJ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bCK" = ( -/obj/structure/table, -/obj/item/plant_analyzer, -/obj/item/hatchet, -/obj/item/crowbar, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/grass, -/area/hydroponics/garden) -"bCL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bCM" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/circuit, -/area/science/robotics/mechbay) -"bCN" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bCO" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"bCP" = ( -/obj/machinery/firealarm{ - pixel_y = 29 - }, -/obj/structure/closet/crate/hydroponics, -/obj/item/shovel/spade, -/obj/item/wrench, -/obj/item/reagent_containers/glass/bucket, -/obj/item/cultivator, -/obj/item/wirecutters, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"bCQ" = ( -/obj/effect/landmark/start/botanist, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"bCR" = ( -/obj/structure/table, -/obj/item/reagent_containers/spray/pestspray{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/reagent_containers/glass/bottle/nutrient/rh{ - pixel_x = 2; - pixel_y = 1 - }, -/obj/item/reagent_containers/spray/plantbgone, -/turf/open/floor/grass, -/area/hydroponics/garden) -"bCS" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 12 - }, -/obj/item/radio/intercom{ - pixel_x = 29 - }, -/turf/open/floor/grass, -/area/hydroponics/garden) -"bCT" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bCU" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/requests_console{ - department = "Hydroponics"; - departmentType = 2; - pixel_y = 30 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"bCV" = ( -/obj/machinery/conveyor{ - id = "garbage" - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bCW" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bCY" = ( -/obj/machinery/mineral/stacking_machine{ - input_dir = 1; - output_dir = 2; - stack_amt = 10 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bCZ" = ( -/obj/machinery/mineral/stacking_unit_console{ - dir = 2; - machinedir = 8 - }, -/turf/closed/wall, -/area/maintenance/disposal) -"bDa" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bDb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bDc" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - dir = 4; - freq = 1400; - location = "Hydroponics"; - name = "navigation beacon (Hydroponics Delivery)" - }, -/obj/structure/plasticflaps/opaque, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/obj/machinery/door/window/eastright{ - name = "Hydroponics Delivery Access"; - req_access_txt = "35" - }, -/turf/open/floor/plasteel{ - dir = 2 - }, -/area/hydroponics) -"bDd" = ( -/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) -"bDe" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/bot, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/janitor) -"bDf" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/main) -"bDg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bDh" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/eastleft{ - name = "Bar Access"; - req_access_txt = "25" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bDi" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/science/research) -"bDj" = ( -/obj/structure/table/reinforced, -/obj/item/electropack, -/obj/item/assembly/signaler, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bDk" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDl" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"bDm" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/loading_area, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bDn" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - dir = 1; - freq = 1400; - location = "Janitor" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bDp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=RIGHTMID"; - location = "RIGHTTOP"; - name = "navigation beacon (RIGHTTOP)" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bDr" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "garbage" - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bDs" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=TOPLEFT"; - location = "LEFTTOP"; - name = "navigation beacon (LEFTTOP)" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDt" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/structure/disposalpipe/sorting/mail/flip{ - name = "sorting disposal pipe (Library)"; - sortType = 16 - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=LEFTTOP"; - location = "LEFTMID"; - name = "navigation beacon (LEFTMID)" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/event_spawn, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDv" = ( -/obj/machinery/conveyor{ - dir = 10; - id = "garbage" - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/door/window/southleft, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bDw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/mob/living/simple_animal/bot/secbot/beepsky, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDx" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=BOTTOMRIGHT"; - location = "RIGHTBOTTOM"; - name = "navigation beacon (RIGHTBOTTOM)" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDy" = ( -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "garbage"; - name = "disposal conveyor" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bDz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bDA" = ( -/obj/structure/closet/crate/trashcart, -/obj/item/storage/bag/trash, -/obj/item/trash/cheesie, -/obj/item/trash/raisins, -/obj/item/trash/candy, -/obj/item/stack/sheet/mineral/coal, -/obj/item/trash/can, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bDB" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall, -/area/maintenance/starboard) -"bDC" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=BOTTOMMID"; - location = "BOTTOMRIGHT"; - name = "navigation beacon (BOTTOMRIGHT)" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDF" = ( -/obj/structure/table/wood, -/obj/machinery/recharger, -/obj/effect/landmark/event_spawn, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"bDG" = ( -/obj/structure/chair, -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/chapel/main) -"bDH" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/chapel, -/area/chapel/main) -"bDI" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating, -/area/security/processing) -"bDJ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/status_display/evac{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/entry) -"bDK" = ( -/obj/item/reagent_containers/food/drinks/bottle/whiskey, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ - pixel_x = -2 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain/private) -"bDL" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDM" = ( -/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/firealarm{ - dir = 4; - pixel_x = -24 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDO" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 4; - name = "sorting disposal pipe (Custodial)"; - sortType = 22 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDP" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDQ" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/white/side{ - dir = 10 - }, -/area/science/research) -"bDS" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Central West 1"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDT" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDU" = ( -/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/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bDV" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kanyewest"; - name = "privacy shutters" - }, -/obj/structure/cable/yellow, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/detectives_office) -"bDW" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"bDY" = ( -/obj/structure/rack, -/obj/item/clothing/under/color/blue, -/obj/item/clothing/neck/tie/blue, -/obj/item/clothing/head/soft/blue, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"bEa" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bEb" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/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/qm) -"bEc" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/quartermaster/qm) -"bEd" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - dir = 8; - freq = 1400; - location = "QM #1" - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/mob/living/simple_animal/bot/mulebot{ - beacon_freq = 1400; - home_destination = "QM #1"; - suffix = "#1" - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEe" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bEf" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bEg" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEh" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/chapel/main) -"bEi" = ( -/obj/structure/chair/stool, -/turf/open/floor/plasteel/chapel, -/area/chapel/main) -"bEj" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Quartermaster"; - req_access_txt = "41" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"bEk" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/quartermaster/qm) -"bEl" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - dir = 8; - freq = 1400; - location = "QM #2" - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #2"; - suffix = "#2" - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEm" = ( -/obj/structure/window/reinforced, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEn" = ( -/obj/machinery/vending/wardrobe/cargo_wardrobe, -/obj/structure/window/reinforced, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEo" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/item/multitool, -/obj/item/screwdriver, -/obj/machinery/camera{ - c_tag = "Cargo - Main 1"; - dir = 4; - network = list("ss13") - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEp" = ( -/obj/structure/chair/stool, -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/chapel/main) -"bEq" = ( -/obj/structure/chair/stool, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/chapel, -/area/chapel/main) -"bEr" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel, -/area/engine/engineering) -"bEs" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bEt" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEu" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/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/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEv" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEw" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEx" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEA" = ( -/obj/structure/chair/stool, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/chapel/main) -"bEB" = ( -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bEC" = ( -/obj/machinery/door/morgue{ - name = "Confession Booth" - }, -/turf/open/floor/plasteel/dark, -/area/chapel/main) -"bED" = ( -/obj/machinery/door/morgue{ - name = "Confession Booth (Chaplain)"; - req_access_txt = "22" - }, -/turf/open/floor/plasteel/dark, -/area/chapel/main) -"bEE" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bEG" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bEH" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEI" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/window/westleft{ - name = "Cargo Packages"; - req_access_txt = "55" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEJ" = ( -/obj/structure/disposaloutlet{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEL" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/storage/firstaid/regular, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEO" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/status_display/supply{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEP" = ( -/obj/machinery/autolathe, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bEQ" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bER" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bES" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bET" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=TOPRIGHT"; - location = "TOPMID"; - name = "navigation beacon (TOPMID)" - }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 8; - name = "sorting disposal pipe (Quartermaster)"; - sortType = 3 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bEU" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 8; - name = "sorting disposal pipe (Cargo)"; - sortType = 2 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bEV" = ( -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/item/folder/yellow, -/obj/item/stamp/ce, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/chief) -"bEW" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai_upload) -"bEX" = ( -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bEY" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bEZ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bFb" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bFc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bFd" = ( -/obj/structure/chair/office, -/obj/effect/landmark/start/cargo_technician, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bFe" = ( -/obj/machinery/computer/cargo{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bFf" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/quartermaster/office) -"bFg" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bFh" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Cargo Office"; - req_access_txt = "50" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bFi" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/quartermaster/office) -"bFj" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/northleft{ - name = "Cargo Desk"; - req_access_txt = "55" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bFk" = ( -/obj/structure/table, -/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/light{ - dir = 1 - }, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/item/storage/box{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/storage/box{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/storage/box{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/machinery/camera{ - c_tag = "Cargo - Front Lobby"; - dir = 4; - network = list("ss13") - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bFl" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bFm" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bFn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai_upload) -"bFo" = ( -/obj/structure/table, -/obj/item/cartridge/medical{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/item/cartridge/medical{ - pixel_x = 6; - pixel_y = 3 - }, -/obj/item/cartridge/medical, -/obj/item/cartridge/chemistry{ - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/radio/intercom{ - pixel_x = 25 - }, -/obj/item/toy/figure/cmo, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"bFp" = ( -/obj/machinery/computer/cargo/request{ - 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) -"bFq" = ( -/obj/machinery/camera{ - c_tag = "Atmospherics - Nitrous Oxide Tank"; - dir = 2; - network = list("ss13","Atmospherics") - }, -/turf/open/floor/engine/n2o{ - initial_gas_mix = "n2o=1000;TEMP=293.15" - }, -/area/engine/atmos) -"bFr" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/status_display, -/turf/closed/wall, -/area/hydroponics/garden) -"bFs" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/camera{ - c_tag = "Hallway - Central North 2"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bFt" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bFu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/junction/flip{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bFv" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/storage/tools) -"bFw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bFx" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bFy" = ( -/obj/structure/bed/dogbed/ian, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/mob/living/simple_animal/pet/dog/corgi/Ian{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"bFz" = ( -/obj/effect/turf_decal/tile/blue, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bFA" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bFC" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall/r_wall, -/area/crew_quarters/heads/captain) -"bFD" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"bFE" = ( -/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 = 1 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bFF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/junction/flip{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"bFG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/main) -"bFH" = ( -/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/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/security/main) -"bFI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Security Maintenance"; - req_access_txt = "12;1"; - req_one_access_txt = "0" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bFJ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/security/brig) -"bFK" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/security/main) -"bFL" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/security/brig) -"bFM" = ( -/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/security/main) -"bFP" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"bFR" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/security/main) -"bFS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bFT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bFU" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/main) -"bFV" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/security/main) -"bFX" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/security/main) -"bFY" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/landmark/start/security_officer, -/obj/machinery/light, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/main) -"bFZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/landmark/start/security_officer, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/security/main) -"bGa" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/crew_quarters/heads/hos) -"bGb" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"bGc" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bGd" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall, -/area/science/xenobiology) -"bGe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bGf" = ( -/obj/machinery/door/window/westright{ - name = "Security Packages"; - req_access_txt = "63" - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/delivery, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/main) -"bGg" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bGi" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bGj" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bGl" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bGm" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/security/courtroom) -"bGn" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"bGo" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"bGp" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bGq" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bGr" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bGs" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bGt" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bGv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bGw" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/janitor) -"bGx" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bGy" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bGz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bGA" = ( -/obj/structure/closet/l3closet, -/obj/effect/turf_decal/delivery, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"bGB" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bGC" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bGD" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "5;12" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bGE" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bGF" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"bGG" = ( -/obj/structure/table/glass, -/obj/machinery/reagentgrinder, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Medical - Chemistry"; - dir = 1; - network = list("ss13","Medical") - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"bGH" = ( -/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/cafeteria, -/area/crew_quarters/heads/cmo) -"bGI" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/light_switch{ - pixel_y = -24 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"bGJ" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/machinery/status_display/supply{ - pixel_x = -32 - }, -/obj/item/paper_bin, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bGK" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bGL" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bGM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bGO" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bGP" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bGQ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bGS" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bGT" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/sorting/mail{ - name = "sorting disposal pipe (Chief Medical Director)"; - sortType = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bGU" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bGW" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bGX" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bGY" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/table/reinforced, -/obj/structure/sign/barsign{ - pixel_y = 32 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bGZ" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/chair/stool/bar, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bHa" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"bHb" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHc" = ( -/obj/machinery/suit_storage_unit/engine, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"bHd" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"bHe" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/vending/coffee, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bHf" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/vending/cigarette, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bHg" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/junction/flip{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHi" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHj" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/newscaster{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHk" = ( -/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, -/area/hallway/primary/central) -"bHl" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHm" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/window/brigdoor/westleft{ - id = "Cell 2"; - name = "Cell 2"; - req_access_txt = "1" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"bHo" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHp" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHq" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Central East 1"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHr" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHs" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 4; - name = "sorting disposal pipe (Hydroponics)"; - sortType = 21 - }, -/obj/machinery/door/firedoor, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHt" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHu" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHw" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHx" = ( -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/machinery/rnd/production/circuit_imprinter, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bHy" = ( -/obj/structure/table, -/obj/machinery/newscaster{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"bHz" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/camera{ - c_tag = "Bridge - Main 2"; - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bHA" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "robo1" - }, -/turf/open/floor/plating, -/area/science/robotics/lab) -"bHC" = ( -/obj/machinery/door/airlock{ - name = "Lounge" - }, -/turf/open/floor/wood, -/area/library/lounge) -"bHD" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHE" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = 28 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHF" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/window/brigdoor/westleft{ - id = "Cell 3"; - name = "Cell 3"; - req_access_txt = "1" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"bHH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Lounge" - }, -/turf/open/floor/wood, -/area/library/lounge) -"bHI" = ( -/obj/machinery/vending/coffee, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/library/lounge) -"bHJ" = ( -/obj/machinery/door/window/northleft{ - req_access_txt = "37" - }, -/turf/open/floor/carpet, -/area/library) -"bHK" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/library) -"bHL" = ( -/obj/machinery/door/window/southright{ - req_access_txt = "37" - }, -/turf/open/floor/carpet, -/area/library) -"bHM" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/bridge) -"bHO" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/structure/table/wood, -/obj/item/storage/box/matches, -/obj/item/clothing/mask/cigarette/cigar, -/obj/item/reagent_containers/food/drinks/flask/gold{ - pixel_x = 3 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain/private) -"bHP" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/security/processing) -"bHQ" = ( -/obj/machinery/photocopier, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bHR" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/light, -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bHS" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bHT" = ( -/obj/machinery/doppler_array/research/science{ - dir = 4 - }, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/camera{ - c_tag = "Research - Toxins Testing Bay"; - dir = 1; - network = list("ss13","Research") - }, -/turf/open/floor/plasteel, -/area/science/research) -"bHU" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain/private) -"bHV" = ( -/obj/machinery/computer/secure_data{ - 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/structure/reagent_dispensers/peppertank{ - pixel_x = 30 - }, -/obj/machinery/light, -/obj/item/radio/intercom{ - dir = 2; - pixel_y = -28 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/science) -"bHW" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Central West 2"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bHX" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bHY" = ( -/obj/docking_port/stationary/random{ - dir = 2; - id = "pod_lavaland2"; - name = "lavaland" - }, -/turf/open/space, -/area/space/nearstation) -"bHZ" = ( -/obj/structure/chair, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"bIa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/window/brigdoor/westleft{ - id = "Cell 4"; - name = "Cell 4"; - req_access_txt = "1" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"bIc" = ( -/obj/machinery/telecomms/server/presets/engineering, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bId" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/tcommsat/computer) -"bIe" = ( -/obj/machinery/blackbox_recorder, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bIf" = ( -/obj/machinery/telecomms/bus/preset_four, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bIg" = ( -/obj/structure/closet/emcloset, -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/tcommsat/computer) -"bIh" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"bIi" = ( -/obj/machinery/telecomms/processor/preset_two, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bIj" = ( -/obj/machinery/telecomms/bus/preset_two, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bIk" = ( -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bIl" = ( -/obj/machinery/telecomms/broadcaster/preset_left, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bIm" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/fireaxecabinet{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bIn" = ( -/obj/structure/table/reinforced, -/obj/item/aicard, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/item/multitool, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bIo" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Bridge"; - req_access_txt = "19"; - security_level = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bIp" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Bridge"; - req_access_txt = "19"; - security_level = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bIq" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Bridge"; - req_access_txt = "19"; - security_level = 6 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bIr" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Bridge"; - req_access_txt = "19"; - security_level = 6 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bIs" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bIt" = ( -/obj/machinery/computer/communications{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/camera{ - c_tag = "Bridge - Main 4"; - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bIv" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bIw" = ( -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"bIx" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"bIy" = ( -/obj/machinery/telecomms/server/presets/service, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bIz" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/engine, -/area/science/xenobiology) -"bIA" = ( -/obj/machinery/telecomms/broadcaster/preset_right, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bIB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"bIC" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/tcommsat/computer) -"bID" = ( -/obj/structure/transit_tube/station/reverse{ - dir = 1 - }, -/turf/open/floor/plating, -/area/tcommsat/computer) -"bIE" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/space/basic, -/area/space/nearstation) -"bIF" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/transit_tube/horizontal, -/turf/open/floor/plating, -/area/tcommsat/computer) -"bIG" = ( -/obj/machinery/newscaster{ - pixel_x = -30 - }, -/obj/machinery/camera{ - c_tag = "Telecomms Foyer"; - dir = 4; - network = list("ss13","Telecom") - }, -/turf/open/floor/plasteel/dark, -/area/tcommsat/computer) -"bIH" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"bII" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"bIJ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"bIK" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/dark, -/area/tcommsat/computer) -"bIL" = ( -/obj/item/crowbar, -/turf/open/floor/plating, -/area/tcommsat/computer) -"bIN" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"bIO" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"bIP" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/tcommsat/server) -"bIQ" = ( -/obj/machinery/computer/cargo/request, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bIR" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"bIS" = ( -/obj/machinery/telecomms/receiver/preset_left, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/tcommsat/server) -"bIT" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/tcommsat/server) -"bIU" = ( -/obj/machinery/telecomms/server/presets/science, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bIV" = ( -/obj/machinery/telecomms/processor/preset_four, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bIW" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/tcommsat/server) -"bIX" = ( -/obj/machinery/telecomms/server/presets/command, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bIY" = ( -/obj/structure/table/glass, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/tcommsat/server) -"bJa" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/light, -/turf/open/floor/plasteel/dark/telecomms, -/area/tcommsat/server) -"bJb" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bJc" = ( -/obj/machinery/telecomms/hub/preset, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/tcommsat/server) -"bJd" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"bJe" = ( -/obj/machinery/power/terminal, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/tcommsat/server) -"bJf" = ( -/obj/structure/filingcabinet, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/camera{ - c_tag = "Bridge - Main 1"; - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bJg" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/tcommsat/server) -"bJh" = ( -/obj/machinery/power/terminal, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/tcommsat/server) -"bJi" = ( -/obj/machinery/computer/telecomms/server{ - dir = 8 - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"bJj" = ( -/obj/structure/lattice, -/obj/machinery/camera/motion{ - c_tag = "Secure - External Telecomm Sat East 1"; - dir = 4; - network = list("Telecom") - }, -/turf/open/space/basic, -/area/space/nearstation) -"bJk" = ( -/obj/structure/table, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/flash/handheld{ - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/carpet, -/area/bridge) -"bJm" = ( -/obj/machinery/computer/shuttle/labor{ - dir = 8 - }, -/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/bridge) -"bJn" = ( -/obj/machinery/telecomms/server/presets/medical, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Telecomms Core 1"; - dir = 4; - network = list("ss13","Telecom") - }, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bJo" = ( -/obj/effect/decal/remains/human, -/obj/item/clothing/under/rank/engineering/engineer, -/turf/open/floor/plating, -/area/tcommsat/computer) -"bJp" = ( -/obj/machinery/computer/message_monitor{ - dir = 4 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"bJq" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bJr" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"bJs" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/light, -/turf/open/floor/plasteel/dark/telecomms, -/area/tcommsat/server) -"bJt" = ( -/obj/structure/table, -/obj/item/radio/intercom{ - dir = 8; - freerange = 1; - name = "Station Intercom (Command)" - }, -/turf/open/floor/carpet, -/area/bridge) -"bJu" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/storage/tools) -"bJv" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/status_display/evac{ - pixel_x = -32 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) -"bJw" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/door/window/northright{ - name = "AI Access"; - req_access_txt = "16" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bJx" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bJy" = ( -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bJz" = ( -/obj/machinery/camera/motion{ - c_tag = "Secure - AI Core North"; - dir = 2; - network = list("AISat") - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) -"bJA" = ( -/obj/structure/closet/crate/wooden/toy, -/obj/item/grenade/chem_grenade/teargas/moustache, -/obj/item/grenade/chem_grenade/glitter/blue, -/obj/item/grenade/chem_grenade/glitter/pink, -/obj/item/clothing/head/wig/random, -/obj/item/clothing/head/wig/random, -/obj/item/clothing/head/wig/random, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"bJB" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bJC" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/keycard_auth, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bJD" = ( -/obj/machinery/computer/shuttle/mining{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bJE" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bJF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"bJH" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/turf/open/floor/carpet, -/area/bridge) -"bJJ" = ( -/obj/machinery/telecomms/server/presets/common, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Telecomms Core 2"; - dir = 8; - network = list("ss13","Telecom") - }, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) -"bJK" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Space Access Airlock"; - req_one_access_txt = "32;19" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"bJL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/conveyor{ - dir = 4; - id = "robo2" - }, -/turf/open/floor/plating, -/area/science/robotics/lab) -"bJN" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bJO" = ( -/obj/structure/table, -/obj/item/folder/blue, -/turf/open/floor/carpet, -/area/bridge) -"bJP" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/visible, -/obj/machinery/camera{ - c_tag = "Atmospherics - Distro Loop"; - dir = 2; - network = list("ss13","Atmospherics") - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 - }, -/area/engine/atmos) -"bJQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bJR" = ( -/obj/machinery/nuclearbomb/selfdestruct, -/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/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"bJS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bJT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bJU" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"bJV" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Service - Hydroponics Main 1"; - dir = 8; - network = list("ss13","Hydroponics") - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"bJW" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/machinery/camera{ - c_tag = "Security - Courtroom Jury"; - dir = 4; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"bJX" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/camera{ - c_tag = "Security - Courtroom Main"; - dir = 8; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel, -/area/security/courtroom) -"bJY" = ( -/obj/structure/table/wood, -/obj/machinery/requests_console{ - announcementConsole = 1; - department = "Head of Security's Desk"; - departmentType = 5; - name = "Head of Security RC"; - pixel_x = -30 - }, -/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/machinery/camera{ - c_tag = "Security - Head of Security's Office"; - dir = 1; - network = list("ss13","Security") - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"bJZ" = ( -/obj/item/trash/can, -/turf/open/floor/plating, -/area/maintenance/fore) -"bKa" = ( -/obj/structure/rack, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bKb" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/storage/box/PDAs{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/box/ids, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKc" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/recharger, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKd" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/maintenance/fore) -"bKe" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKf" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/table, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKg" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/bridge) -"bKh" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/reagent_dispensers/water_cooler, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKi" = ( -/obj/vehicle/ridden/secway, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) -"bKj" = ( -/obj/machinery/computer/shuttle/labor{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/camera{ - c_tag = "Security - Labor Dock"; - dir = 1; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel, -/area/security/processing) -"bKk" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/effect/landmark/start/geneticist, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"bKl" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bKm" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"bKo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKp" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKq" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKr" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKs" = ( -/obj/structure/table, -/obj/item/key/security, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKt" = ( -/obj/structure/closet/crate, -/turf/open/floor/plating, -/area/maintenance/aft) -"bKu" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKv" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKw" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKx" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKy" = ( -/obj/structure/filingcabinet, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKz" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/bot, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bKA" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/bridge) -"bKB" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/bridge) -"bKC" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/carpet, -/area/bridge) -"bKE" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/conveyor{ - dir = 4; - id = "robo2" - }, -/turf/open/floor/plating, -/area/science/robotics/lab) -"bKF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/carpet, -/area/bridge) -"bKG" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/carpet, -/area/bridge) -"bKH" = ( -/obj/structure/table, -/obj/item/hand_labeler, -/obj/item/assembly/timer, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/turf/open/floor/carpet, -/area/bridge) -"bKI" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/carpet, -/area/bridge) -"bKJ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKL" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, -/turf/open/floor/carpet, -/area/bridge) -"bKM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/bridge) -"bKN" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/bridge) -"bKO" = ( -/obj/machinery/door/airlock/command{ - name = "Head of Personnel"; - req_access_txt = "57"; - security_level = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/hop) -"bKP" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKR" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKS" = ( -/obj/machinery/door/airlock/command{ - name = "Captain's Office"; - req_access_txt = "20"; - security_level = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/captain) -"bKT" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"bKU" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"bKV" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"bKW" = ( -/obj/structure/girder, -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bKX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bKZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"bLa" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"bLb" = ( -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat/foyer) -"bLc" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bLd" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat/foyer) -"bLe" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/holopad, -/obj/effect/landmark/start/cyborg, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat/foyer) -"bLf" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat/foyer) -"bLg" = ( -/obj/machinery/turretid{ - control_area = "/area/ai_monitored/turret_protected/aisat/foyer"; - enabled = 1; - name = "AI Chamber Foyer Control"; - pixel_y = -24; - req_access = null; - req_access_txt = "65" - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"bLh" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bLi" = ( -/obj/structure/closet/toolcloset, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bLj" = ( -/obj/structure/closet/crate, -/obj/item/trash/syndi_cakes, -/turf/open/floor/plating, -/area/maintenance/fore) -"bLk" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bLl" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/item/clothing/gloves/color/latex, -/obj/item/reagent_containers/spray/cleaner, -/obj/machinery/camera{ - c_tag = "Security - Medical Room"; - dir = 1; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel/white, -/area/security/brig) -"bLn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"bLo" = ( -/obj/structure/closet/secure_closet/security/sec, -/obj/effect/turf_decal/bot, -/obj/machinery/camera{ - c_tag = "Security - Equipment Room 2"; - dir = 8; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"bLp" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Security - Main Office 1"; - dir = 4; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel, -/area/security/main) -"bLq" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/machinery/computer/security/telescreen{ - name = "Prison Monitor"; - network = list("Prison"); - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"bLr" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/item/stack/packageWrap, -/obj/item/pen, -/obj/machinery/camera{ - c_tag = "Security - Main Office 2"; - dir = 8; - network = list("ss13","Security") - }, -/turf/open/floor/plasteel, -/area/security/main) -"bLs" = ( -/obj/machinery/camera{ - c_tag = "Engineering - Gravity Generator Main 2"; - dir = 1; - network = list("ss13","Engineering") - }, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"bLu" = ( -/obj/machinery/teleport/station, -/obj/machinery/camera/motion{ - c_tag = "Secure - AI Teleporter"; - dir = 1; - network = list("AISat") - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"bLv" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/mob/living/simple_animal/bot/secbot/pingsky, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat/foyer) -"bLw" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai) -"bLx" = ( -/obj/machinery/camera/motion{ - c_tag = "Secure - External Telecomm Sat West 2"; - dir = 8; - network = list("Telecom") - }, -/turf/open/space/basic, -/area/space/nearstation) -"bLy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bLz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external{ - name = "TeleSat External Airlock"; - req_one_access_txt = "32;19" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bLA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bLB" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/girder, -/turf/open/floor/plating, -/area/maintenance/fore) -"bLC" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/item/paicard, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"bLD" = ( -/obj/machinery/gateway{ - dir = 1 - }, -/obj/effect/turf_decal/bot_white, -/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/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/gateway) -"bLE" = ( -/obj/machinery/gateway{ - dir = 5 - }, -/obj/effect/turf_decal/bot_white/left, -/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/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/gateway) -"bLF" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 8; - name = "8maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bLG" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/gateway) -"bLH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat/foyer) -"bLI" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/service) -"bLJ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/service) -"bLK" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "MiniSat Maintenance"; - req_access_txt = "32" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/service) -"bLL" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/turretid{ - control_area = "/area/ai_monitored/turret_protected/ai"; - enabled = 1; - name = "AI Chamber Turret Control"; - pixel_x = 32; - pixel_y = -24; - req_access = null; - req_access_txt = "65" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"bLM" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bLN" = ( -/obj/structure/table/reinforced, -/obj/item/hatchet, -/obj/item/wirecutters, -/obj/item/screwdriver, -/obj/structure/sign/poster/official/do_not_question{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bLP" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 8; - name = "8maintenance loot spawner" - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bLQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/closet/crate, -/turf/open/floor/plating, -/area/maintenance/port) -"bLR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, -/area/library/lounge) -"bLS" = ( -/obj/structure/table, -/obj/item/storage/fancy/donut_box, -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, -/area/bridge) -"bLU" = ( -/obj/effect/landmark/event_spawn, -/mob/living/carbon/monkey, -/turf/open/floor/plasteel, -/area/medical/genetics) -"bLV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bLX" = ( -/obj/machinery/camera/motion{ - c_tag = "Secure - External Telecomm Sat East 2"; - dir = 4; - network = list("Telecom") - }, -/turf/open/space/basic, -/area/space/nearstation) -"bLY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/holopad, -/obj/effect/landmark/event_spawn, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/circuit, -/area/ai_monitored/nuke_storage) -"bLZ" = ( -/obj/structure/table/wood, -/obj/effect/landmark/event_spawn, -/obj/item/clothing/glasses/sunglasses/advanced/big, -/obj/item/clothing/glasses/sunglasses/advanced/big{ - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/wood, -/area/lawoffice) -"bMa" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/junction/yjunction{ - dir = 1 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/security/brig) -"bMb" = ( -/obj/effect/landmark/xeno_spawn, -/mob/living/carbon/monkey, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bMc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bMd" = ( -/obj/machinery/camera/motion{ - c_tag = "Secure - AI Core West"; - dir = 4; - network = list("AISat") - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/door/window/southright{ - name = "AI Access"; - req_access_txt = "16" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bMe" = ( -/obj/structure/table, -/obj/item/folder/white, -/obj/item/pen{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/paper, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/effect/landmark/blobstart, -/turf/open/floor/plasteel/white, -/area/medical/patients_rooms/room_b) -"bMf" = ( -/obj/structure/table/optable, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"bMg" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/item/taperecorder, -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"bMh" = ( -/obj/structure/sign/warning/nosmoking, -/obj/effect/landmark/event_spawn, -/turf/closed/wall, -/area/engine/atmos) -"bMi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"bMj" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"bMk" = ( -/obj/structure/lattice, -/obj/effect/landmark/carpspawn, -/turf/open/space/basic, -/area/space/nearstation) -"bMl" = ( -/obj/machinery/ai_slipper{ - uses = 10 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bMm" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bMn" = ( -/obj/structure/chair/stool, -/obj/structure/extinguisher_cabinet{ - pixel_y = 28 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bMo" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bMp" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bMq" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bMr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bMs" = ( -/turf/open/floor/plating, -/area/maintenance/port) -"bMt" = ( -/obj/structure/table, -/obj/item/candle, -/turf/open/floor/plating, -/area/maintenance/port) -"bMu" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/maintenance/aft) -"bMv" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/bot, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bMw" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bMx" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall, -/area/crew_quarters/fitness/locker_room) -"bMy" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/cable/yellow, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenocontainment"; - name = "containment chamber blastdoor" - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bMz" = ( -/obj/structure/showcase/cyborg/old{ - dir = 8; - pixel_x = 9; - pixel_y = 2 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bMA" = ( -/obj/machinery/camera/motion{ - c_tag = "Secure - AI Core East"; - dir = 8; - network = list("AISat") - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/door/window/southleft{ - name = "AI Access"; - req_access_txt = "16" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bMB" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bMC" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) -"bMD" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/status_display/evac{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) -"bME" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/status_display/ai{ - pixel_x = 32 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) -"bMF" = ( -/obj/structure/lattice, -/obj/machinery/camera/motion{ - c_tag = "Secure - External Telecomm Sat South"; - dir = 2; - network = list("Telecom") - }, -/turf/open/space/basic, -/area/space/nearstation) -"bMG" = ( -/obj/machinery/camera/motion{ - c_tag = "Secure - AI External Northwest"; - dir = 1; - network = list("AISat") - }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"bMH" = ( -/obj/machinery/camera/motion{ - c_tag = "Secure - AI Core South"; - dir = 1; - network = list("AISat") - }, -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) -"bMI" = ( -/obj/machinery/camera/motion{ - c_tag = "Secure - AI External Northeast"; - dir = 1; - network = list("AISat") - }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"bMJ" = ( -/obj/structure/grille, -/obj/structure/grille, -/turf/open/space/basic, -/area/space/nearstation) -"bMK" = ( -/obj/structure/window/reinforced, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"bML" = ( -/obj/machinery/power/solar{ - id = "starboardsolar"; - name = "Starboard Solar Array" - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/airless/solarpanel, -/area/space/nearstation) -"bMM" = ( -/obj/effect/landmark/start/ai/secondary, -/obj/item/radio/intercom{ - freerange = 1; - listening = 0; - name = "Custom Channel"; - pixel_y = 28 - }, -/obj/item/radio/intercom{ - freerange = 1; - name = "Common Channel"; - pixel_x = -27; - pixel_y = 5 - }, -/obj/item/radio/intercom{ - freerange = 1; - frequency = 1447; - name = "Private Channel"; - pixel_y = -25 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bMN" = ( -/obj/effect/landmark/start/ai/secondary, -/obj/item/radio/intercom{ - freerange = 1; - listening = 0; - name = "Custom Channel"; - pixel_y = 28 - }, -/obj/item/radio/intercom{ - freerange = 1; - name = "Common Channel"; - pixel_x = 27; - pixel_y = 5 - }, -/obj/item/radio/intercom{ - freerange = 1; - frequency = 1447; - name = "Private Channel"; - pixel_y = -25 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bMO" = ( -/obj/machinery/power/solar{ - id = "starboardsolar"; - name = "Starboard Solar Array" - }, -/obj/structure/cable, -/turf/open/floor/plasteel/airless/solarpanel, -/area/space/nearstation) -"bMP" = ( -/obj/machinery/turretid{ - name = "AI Chamber turret control"; - pixel_x = 5; - pixel_y = -24 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/window/westright{ - name = "AI Access"; - req_access_txt = "16" - }, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bMQ" = ( -/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) -"bMR" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) -"bMS" = ( -/obj/effect/landmark/start/ai, -/obj/item/radio/intercom{ - freerange = 1; - name = "Common Channel"; - pixel_x = -27; - pixel_y = -9 - }, -/obj/item/radio/intercom{ - freerange = 1; - listening = 0; - name = "Custom Channel"; - pixel_y = -31 - }, -/obj/item/radio/intercom{ - freerange = 1; - frequency = 1447; - name = "Private Channel"; - pixel_x = 27; - pixel_y = -9 - }, -/obj/machinery/newscaster/security_unit{ - pixel_x = -28; - pixel_y = -28 - }, -/obj/machinery/requests_console{ - department = "AI"; - departmentType = 5; - pixel_x = 28; - pixel_y = -28 - }, -/obj/machinery/button/door{ - id = "aishuttersexternal"; - name = "External Privacy Shutter Control"; - pixel_y = -40 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bMT" = ( -/obj/machinery/power/terminal, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) -"bMU" = ( -/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) -"bMV" = ( -/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) -"bMW" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/space/basic, -/area/solar/starboard) -"bMX" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/space/basic, -/area/solar/starboard) -"bMY" = ( -/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/open/space/basic, -/area/solar/starboard) -"bMZ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/solar/starboard) -"bNa" = ( -/obj/structure/lattice/catwalk, -/obj/item/stack/cable_coil/random/five, -/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) -"bNb" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai) -"bNc" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-22" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"bNd" = ( -/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/space/nearstation) -"bNe" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/space/basic, -/area/space/nearstation) -"bNf" = ( -/obj/machinery/power/tracker, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel/airless/solarpanel, -/area/space/nearstation) -"bNg" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/space/basic, -/area/space/nearstation) -"bNh" = ( -/obj/machinery/camera/motion{ - c_tag = "Secure - AI External West"; - dir = 8; - network = list("AISat") - }, -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/space, -/area/space/nearstation) -"bNi" = ( -/obj/machinery/camera/motion{ - c_tag = "Secure - AI External East"; - dir = 4; - network = list("AISat") - }, -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/space, -/area/space/nearstation) -"bNj" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/space/basic, -/area/space/nearstation) -"bNk" = ( -/obj/machinery/camera/motion{ - c_tag = "Secure - AI External South"; - dir = 2; - network = list("AISat") - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"bNl" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/space/basic, -/area/space/nearstation) -"bNm" = ( -/obj/machinery/power/tracker, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel/airless/solarpanel, -/area/space/nearstation) -"bNn" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) -"bNo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bNp" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"bNq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bNr" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/power/solar_control{ - name = "Eastern AI Solar Control" - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/space/basic, -/area/space/nearstation) -"bNs" = ( -/obj/item/stack/cable_coil/cut/red, -/turf/open/space/basic, -/area/space) -"bNt" = ( -/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" - }, -/obj/item/stack/cable_coil/cut/red, -/turf/open/space/basic, -/area/space/nearstation) -"bNu" = ( -/obj/structure/lattice, -/obj/item/multitool, -/turf/open/space/basic, -/area/space/nearstation) -"bNv" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/item/stack/cable_coil/cut/red, -/turf/open/space/basic, -/area/space/nearstation) -"bNw" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/item/wirecutters, -/turf/open/space/basic, -/area/space/nearstation) -"bNx" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/space/basic, -/area/solar/starboard) -"bNy" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/space/basic, -/area/solar/aft) -"bNz" = ( -/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/open/space/basic, -/area/solar/aft) -"bNA" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/solar/aft) -"bNB" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/space/basic, -/area/solar/aft) -"bNC" = ( -/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/aft) -"bND" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/space/basic, -/area/solar/aft) -"bNE" = ( -/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/aft) -"bNF" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/space/basic, -/area/solar/aft) -"bNG" = ( -/obj/structure/chair, -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/obj/effect/landmark/start/medical_doctor, -/obj/machinery/camera{ - c_tag = "Medical - Surgery Observatory"; - dir = 2; - network = list("ss13","Medical") - }, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"bNH" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/machinery/light, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Medical - Chief Medical Officer's Office"; - dir = 1; - network = list("ss13","Medical") - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"bNI" = ( -/obj/structure/closet/secure_closet/medical2, -/obj/machinery/camera{ - c_tag = "Medical - Surgery"; - dir = 1; - network = list("ss13","Medical") - }, -/turf/open/floor/plasteel, -/area/medical/surgery) -"bNJ" = ( -/obj/structure/table/glass, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/storage/box/syringes, -/obj/item/hand_labeler, -/obj/machinery/camera{ - c_tag = "Medical - Virology Main"; - dir = 1; - network = list("ss13","Medical") - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"bNK" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Medical - Main 3"; - dir = 8; - network = list("ss13","Medical") - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bNL" = ( -/obj/structure/bed/roller, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Medical - Main 4"; - dir = 8; - network = list("ss13","Medical") - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bNM" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/power/apc{ - areastring = "/area/science/robotics/lab"; - dir = 8; - name = "Robotics APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Research - Robotics"; - dir = 4; - network = list("ss13","Research") - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"bNN" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/latex, -/obj/item/surgical_drapes, -/obj/item/razor, -/obj/machinery/camera{ - c_tag = "Research - Surgery"; - dir = 4; - network = list("ss13","Research") - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"bNO" = ( -/obj/machinery/power/apc{ - areastring = "/area/science/robotics/mechbay"; - dir = 8; - name = "Mechbay APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/camera{ - c_tag = "Research - Mech Bay"; - dir = 4; - network = list("ss13","Research") - }, -/turf/open/floor/circuit, -/area/science/robotics/mechbay) -"bNP" = ( -/obj/machinery/camera{ - c_tag = "Research - Xenobiology Cell 1"; - dir = 2; - network = list("ss13","Research","Xenobiology") - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bNR" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"bNS" = ( -/obj/machinery/smartfridge/extract/preloaded, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Research - Xenobiology Main 1"; - dir = 8; - network = list("ss13","Research") - }, -/obj/item/slime_extract/grey, -/obj/item/slime_extract/grey, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bNT" = ( -/obj/machinery/light, -/obj/machinery/camera{ - c_tag = "Research - Xenobiology Main 2"; - dir = 1; - network = list("ss13","Research") - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bNU" = ( -/obj/machinery/camera{ - c_tag = "Research - Xenobiology Cell 6"; - dir = 1; - network = list("ss13","Research","Xenobiology") - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bNV" = ( -/obj/machinery/camera{ - c_tag = "Research - Xenobiology Cell 5"; - dir = 1; - network = list("ss13","Research","Xenobiology") - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bNW" = ( -/obj/machinery/camera{ - c_tag = "Research - Xenobiology Cell 4"; - dir = 1; - network = list("ss13","Research","Xenobiology") - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bNX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/research) -"bNY" = ( -/obj/machinery/camera{ - c_tag = "Research - Main 2"; - dir = 8; - network = list("ss13","Research") - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/research) -"bNZ" = ( -/obj/machinery/camera{ - c_tag = "Research - Main 3"; - dir = 1; - network = list("ss13","Research") - }, -/turf/open/floor/plasteel/white/side{ - dir = 5 - }, -/area/science/research) -"bOa" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Antechamber"; - req_one_access_txt = "32;19" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"bOb" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"bOd" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "AI Chamber"; - req_access_txt = "16" - }, -/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/dark, -/area/ai_monitored/turret_protected/ai) -"bOe" = ( -/obj/structure/table, -/obj/item/aiModule/core/full/asimov, -/obj/item/aiModule/core/freeformcore, -/obj/effect/spawner/lootdrop/aimodule_harmless, -/obj/effect/spawner/lootdrop/aimodule_neutral, -/obj/item/aiModule/core/full/custom, -/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/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/bot_white/right, -/obj/machinery/door/window/northleft{ - name = "Secure Board Storage"; - req_access_txt = "53" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"bOf" = ( -/obj/machinery/power/terminal, -/obj/structure/cable/yellow, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/service) -"bOg" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/mob/living/simple_animal/bot/floorbot, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/service) -"bOh" = ( -/obj/machinery/ai_slipper{ - uses = 10 - }, -/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/circuit, -/area/ai_monitored/turret_protected/ai) -"bOi" = ( -/obj/machinery/bluespace_beacon, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"bOj" = ( -/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/circuit, -/area/ai_monitored/turret_protected/ai) -"bOk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/holopad, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bOl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bOm" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/camera{ - c_tag = "Civilian - Dorm Main 3"; - dir = 1; - network = list("ss13") - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"bOn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bOo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bOp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bOq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bOr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bOs" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Civilian - Garden Main 1"; - dir = 4; - network = list("ss13") - }, -/turf/open/floor/grass, -/area/hydroponics/garden) -"bOt" = ( -/obj/machinery/light, -/obj/machinery/camera{ - c_tag = "Civilian - Garden Main 2"; - dir = 1; - network = list("ss13") - }, -/turf/open/floor/grass, -/area/hydroponics/garden) -"bOv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/machinery/camera{ - c_tag = "Civilian - Library Main 2"; - dir = 8; - network = list("ss13") - }, -/turf/open/floor/wood, -/area/library) -"bOw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bOx" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/camera{ - c_tag = "Civilian - Library Lounge"; - dir = 8; - network = list("ss13") - }, -/turf/open/floor/wood, -/area/library/lounge) -"bOy" = ( -/obj/machinery/camera{ - c_tag = "Civilian - Library Main 1"; - dir = 8; - network = list("ss13") - }, -/turf/open/floor/wood, -/area/library) -"bOz" = ( -/obj/structure/showcase/cyborg/old{ - dir = 4; - pixel_x = -9; - pixel_y = 2 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"bOA" = ( -/obj/structure/closet/secure_closet/freezer/kitchen, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/soysauce, -/obj/item/reagent_containers/food/condiment/sugar, -/obj/machinery/light_switch{ - pixel_x = 24 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"bOB" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/gateway) -"bOC" = ( -/obj/machinery/gateway{ - dir = 8 - }, -/obj/effect/turf_decal/bot_white, -/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/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/gateway) -"bOD" = ( -/obj/machinery/gateway/centerstation, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/gateway) -"bOE" = ( -/obj/machinery/gateway{ - dir = 4 - }, -/obj/effect/turf_decal/bot_white, -/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/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/gateway) -"bOF" = ( -/obj/machinery/gateway{ - dir = 10 - }, -/obj/effect/turf_decal/bot_white/left, -/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/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/gateway) -"bOG" = ( -/turf/closed/wall/r_wall, -/area/maintenance/port/fore) -"bOH" = ( -/obj/machinery/gateway{ - dir = 6 - }, -/obj/effect/turf_decal/bot_white/right, -/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/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/gateway) -"bOI" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/sign/warning/biohazard{ - pixel_x = -32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/gateway) -"bOJ" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/gateway) -"bOK" = ( -/obj/machinery/gateway, -/obj/effect/turf_decal/bot_white, -/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/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/dark, -/area/gateway) -"bOL" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/gateway) -"bOM" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/obj/structure/sign/warning/biohazard{ - pixel_x = 32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/gateway) -"bON" = ( -/obj/machinery/door/window{ - name = "Gateway Chamber"; - req_access_txt = "62" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/gateway) -"bOO" = ( -/obj/structure/table, -/obj/machinery/recharger, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera{ - c_tag = "Secure - Gateway"; - dir = 4; - network = list("ss13") - }, -/turf/open/floor/plasteel, -/area/gateway) -"bOP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/gateway) -"bOQ" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/security/prison) -"bOR" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/item/clothing/head/cone, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bOT" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/gateway) -"bOU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/gateway) -"bOV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/gateway) -"bOW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "stationawaygate"; - name = "Gateway Access Shutter Control"; - pixel_x = -1; - pixel_y = -24; - req_access_txt = "31" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/gateway) -"bOX" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Gateway Access"; - req_access_txt = "62" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/barricade/wooden/crude, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/gateway) -"bOY" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bOZ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - id = "stationawaygate"; - name = "Gateway Access Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/gateway) -"bPa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bPb" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"bPc" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bPd" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bPe" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bPf" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall, -/area/gateway) -"bPg" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bPh" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bPi" = ( -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/maintenance/aft) -"bPj" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bPk" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/gateway) -"bPl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/gateway) -"bPm" = ( -/obj/structure/bodycontainer/morgue, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/machinery/camera{ - c_tag = "Civilian - Chapel Morgue"; - dir = 4; - network = list("ss13") - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"bPn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bPo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/gateway) -"bPp" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - id = "stationawaygate"; - name = "Gateway Access Shutters" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/gateway) -"bPq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/closet/l3closet/scientist, -/obj/item/radio/intercom{ - pixel_x = -30 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/gateway) -"bPr" = ( -/obj/structure/table, -/obj/item/paper/pamphlet/gateway{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/item/paper/pamphlet/gateway, -/obj/item/paper/pamphlet/gateway{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/gateway) -"bPs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/closet/secure_closet/exile, -/obj/machinery/light_switch{ - pixel_x = -20 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/gateway) -"bPt" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Central Northwest 1"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bPu" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/camera{ - c_tag = "Hallway - Central Northeast 1"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bPv" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/camera{ - c_tag = "Hallway - Central Northwest 2"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bPw" = ( -/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/extinguisher_cabinet{ - pixel_y = 28 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bPx" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/camera{ - c_tag = "Hallway - Central Southwest 2"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bPy" = ( -/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/firealarm{ - pixel_y = 24 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Central Southeast 2"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bPz" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Central Southeast 1"; - dir = 2 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bPA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/sorting/mail{ - dir = 1; - name = "sorting disposal pipe (Detective)"; - sortType = 30 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bPB" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Central West 1"; - dir = 2 - }, -/obj/structure/sign/directions/medical{ - dir = 8; - pixel_y = 26 - }, -/obj/structure/sign/directions/science{ - dir = 8; - pixel_y = 34 - }, -/obj/structure/sign/directions/evac{ - dir = 8; - pixel_y = 42 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bPC" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Central West 2"; - dir = 2 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bPD" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/storage/box/donkpockets{ - pixel_y = 5 - }, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/obj/machinery/camera{ - c_tag = "Bridge - Breakroom"; - dir = 2 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bPE" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/obj/machinery/door/window{ - base_state = "right"; - dir = 4; - icon_state = "right"; - name = "Captain's Desk Door"; - req_access_txt = "20" - }, -/obj/machinery/camera{ - c_tag = "Bridge - Captain's Office"; - dir = 2 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"bPF" = ( -/obj/machinery/suit_storage_unit/engine, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"bPH" = ( -/obj/structure/tank_dispenser, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"bPM" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/fore) -"bPO" = ( -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"bPT" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"bPV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"bPW" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"bPY" = ( -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"bQb" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bQd" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"bQe" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bQf" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bQg" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/maintenance/fore) -"bQh" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating, -/area/maintenance/fore) -"bQi" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bQj" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/maintenance/fore) -"bQk" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bQl" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bQm" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, -/turf/open/floor/plating, -/area/maintenance/fore) -"bQn" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted, -/obj/machinery/door/window/westright, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/fitness/recreation) -"bQo" = ( -/obj/structure/falsewall{ - name = "suspicious wall" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bQp" = ( -/obj/structure/chair, -/obj/structure/sign/poster/contraband/lizard{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bQq" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/structure/sign/poster/contraband/lusty_xenomorph{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bQr" = ( -/turf/open/floor/plating, -/area/maintenance/fore) -"bQs" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bQt" = ( -/obj/structure/grille, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bQu" = ( -/obj/item/clothing/head/cone{ - pixel_x = -3; - pixel_y = 1 - }, -/obj/item/clothing/head/cone{ - pixel_x = -3; - pixel_y = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bQv" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bQw" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/disposaloutlet{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/main) -"bQx" = ( -/obj/item/clothing/head/cone, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bQz" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bQA" = ( -/obj/item/clothing/head/cone{ - pixel_x = -3 - }, -/obj/item/clothing/head/cone{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/head/cone{ - pixel_x = -3; - pixel_y = 6 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bQB" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/bot, -/turf/open/floor/plating, -/area/maintenance/fore) -"bQC" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bQD" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bQE" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bQF" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bQG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bQH" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bQI" = ( -/obj/structure/rack, -/obj/item/wrench, -/obj/item/screwdriver, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bQJ" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = 28 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bQK" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bQL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, -/area/maintenance/department/crew_quarters/bar) -"bQM" = ( -/obj/machinery/door/airlock{ - name = "Theatre Backstage"; - req_access_txt = "46" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/maintenance/port/aft) -"bQN" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bQO" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/bot, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bQP" = ( -/obj/structure/closet, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/head/hardhat/orange, -/obj/item/clothing/head/hardhat/orange, -/obj/item/storage/belt/utility, -/turf/open/floor/plating, -/area/maintenance/port) -"bQQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/closet/crate, -/turf/open/floor/plating, -/area/maintenance/port) -"bQR" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/item/clothing/head/cone, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bQS" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bQT" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/light/small, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bQU" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bQV" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bQW" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bQX" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bQY" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bQZ" = ( -/obj/structure/table, -/obj/item/pen, -/obj/item/trash/candle, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bRa" = ( -/obj/structure/closet/crate{ - name = "Surplus Robotics Supplies" - }, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/item/storage/belt/utility, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/item/assembly/flash/handheld/weak, -/obj/item/stock_parts/cell/high/plus, -/obj/item/reagent_containers/glass/bottle/welding_fuel, -/obj/item/weldingtool, -/obj/item/weldingtool, -/turf/open/floor/plating, -/area/science/research) -"bRb" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bRc" = ( -/obj/structure/rack, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/item/book/manual/wiki/security_space_law{ - pixel_y = 2 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bRd" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bRf" = ( -/obj/structure/closet/crate{ - name = "Surplus Genetics Supplies" - }, -/obj/item/storage/pill_bottle/mutadone, -/obj/item/clothing/under/misc/pj/blue, -/obj/item/clothing/under/misc/pj/blue, -/obj/item/clothing/under/misc/pj, -/obj/item/clothing/under/misc/pj, -/obj/item/clothing/shoes/sneakers/white, -/obj/item/clothing/shoes/sneakers/white, -/obj/item/clothing/shoes/sneakers/white, -/obj/item/clothing/shoes/sneakers/white, -/turf/open/floor/plating, -/area/maintenance/port) -"bRg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/port) -"bRh" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/port) -"bRi" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/port) -"bRj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/maintenance/port) -"bRk" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/port) -"bRl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/maintenance/port) -"bRm" = ( -/obj/effect/spawner/lootdrop/crate_spawner, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bRn" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/holopad, -/turf/open/floor/plasteel/white, -/area/science/research) -"bRo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/holopad, -/turf/open/floor/plasteel, -/area/security/prison) -"bRp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/holopad, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bRs" = ( -/obj/machinery/holopad, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bRt" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/table, -/obj/item/clothing/head/that{ - throwforce = 1 - }, -/obj/item/toy/figure/bartender, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bRu" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bRv" = ( -/obj/item/toy/figure/clown, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bRw" = ( -/obj/machinery/rnd/production/protolathe/department/engineering, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/item/stack/sheet/mineral/copper{ - amount = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bRx" = ( -/obj/structure/table, -/obj/item/storage/box/lights/mixed{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plasteel, -/area/janitor) -"bRy" = ( -/obj/structure/table, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 5 - }, -/obj/item/reagent_containers/food/condiment/enzyme{ - layer = 5 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = -25 - }, -/obj/machinery/camera{ - c_tag = "Service - Kitchen Main 2"; - dir = 8; - network = list("ss13","Bar Area") - }, -/obj/item/toy/figure/chef, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"bRz" = ( -/obj/structure/table/wood, -/obj/item/toy/figure/lawyer, -/turf/open/floor/plasteel, -/area/security/courtroom) -"bRA" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster/security_unit{ - pixel_x = -30 - }, -/obj/item/toy/figure/hos{ - pixel_y = 11 - }, -/obj/item/toy/figure/secofficer{ - pixel_x = -7 - }, -/obj/item/toy/figure/secofficer{ - pixel_x = 7 - }, -/obj/item/toy/figure/secofficer{ - pixel_y = 3 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"bRB" = ( -/obj/structure/closet/crate{ - name = "Surplus Research Supplies" - }, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, -/obj/item/multitool{ - pixel_x = 1; - pixel_y = -2 - }, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/scanning_module, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/micro_laser, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/stock_parts/capacitor, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/circuitboard/computer/arcade/battle, -/obj/item/circuitboard/computer/arcade/battle, -/obj/item/circuitboard/machine/microwave, -/turf/open/floor/plating, -/area/science/research) -"bRC" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bRD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bRE" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/fore) -"bRG" = ( -/obj/structure/bed, -/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/tile/neutral, -/obj/machinery/light_switch{ - pixel_x = 24 - }, -/obj/item/bedsheet/dorms, -/obj/item/toy/figure/assistant, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"bRH" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bRI" = ( -/obj/structure/chair{ - 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/office) -"bRJ" = ( -/obj/structure/bed, -/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/tile/neutral, -/obj/machinery/light_switch{ - pixel_x = -24 - }, -/obj/item/bedsheet/dorms, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"bRK" = ( -/obj/structure/bed, -/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/tile/neutral, -/obj/machinery/light_switch{ - pixel_x = 24 - }, -/obj/item/bedsheet/dorms, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"bRL" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"bRM" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/chair/stool/bar, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bRO" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "5;12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/maintenance/port) -"bRP" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/port/aft) -"bRQ" = ( -/obj/structure/rack, -/obj/item/toy/ammo/gun, -/obj/item/toy/ammo/gun{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/port/aft) -"bRR" = ( -/obj/structure/rack, -/obj/item/toy/gun, -/obj/item/toy/gun{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/structure/sign/poster/contraband/revolver{ - pixel_y = -32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/port/aft) -"bRS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/port/aft) -"bRT" = ( -/obj/structure/closet/crate, -/obj/item/book/manual/chef_recipes, -/obj/item/book/manual/hydroponics_pod_people, -/obj/item/paper, -/obj/item/paper, -/turf/open/floor/plating, -/area/maintenance/fore) -"bRU" = ( -/obj/structure/closet/crate{ - name = "Excess Manuals" - }, -/obj/item/book/random, -/turf/open/floor/plating, -/area/maintenance/fore) -"bRX" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/table, -/obj/structure/bedsheetbin{ - desc = "It looks rather cosy. The words 'towel bin' have been slapped on it with a handheld labeler."; - name = "linen bin (towel bin)" - }, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"bRY" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/fore) -"bRZ" = ( -/obj/structure/rack, -/obj/item/poster/random_official, -/obj/item/poster/random_official{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/poster/random_official{ - pixel_x = 4; - pixel_y = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bSa" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bSb" = ( -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/maintenance/fore) -"bSc" = ( -/obj/machinery/door/poddoor{ - id = "toxinsdriver"; - name = "toxins launcher bay door" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plating, -/area/science/research) -"bSd" = ( -/obj/structure/closet/crate{ - name = "Excess Hydroponics Equipment" - }, -/obj/item/cultivator, -/obj/item/shovel/spade, -/obj/item/seeds/random, -/obj/item/seeds/random, -/obj/item/reagent_containers/glass/bucket, -/obj/item/scythe, -/obj/item/stack/sheet/mineral/copper{ - amount = 5 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bSe" = ( -/obj/structure/chair/comfy/black{ - dir = 1 - }, -/turf/open/floor/plasteel/white/side, -/area/science/xenobiology) -"bSf" = ( -/obj/machinery/light/small, -/turf/open/floor/engine/n2o{ - initial_gas_mix = "n2o=1000;TEMP=293.15" - }, -/area/engine/atmos) -"bSh" = ( -/obj/machinery/atmospherics/components/binary/pump, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bSj" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/maintenance/fore) -"bSk" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bSl" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/item/clothing/suit/hooded/chaplain_hoodie, -/obj/item/clothing/suit/hooded/chaplain_hoodie{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/structure/rack, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bSm" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/rack, -/obj/item/storage/fancy/candle_box{ - pixel_x = 3; - pixel_y = -4 - }, -/obj/item/clothing/suit/hooded/chaplain_hoodie/leader{ - pixel_x = 2; - pixel_y = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bSn" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bSo" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"bSp" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/maintenance/fore) -"bSq" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"bSr" = ( -/obj/structure/grille/broken, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bSs" = ( -/obj/structure/grille/broken, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bSt" = ( -/obj/structure/closet, -/turf/open/floor/plating, -/area/maintenance/fore) -"bSv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bSw" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/sign/warning/fire{ - pixel_x = 32 - }, -/turf/open/floor/engine, -/area/maintenance/disposal/incinerator) -"bSx" = ( -/obj/effect/decal/cleanable/crayon{ - icon_state = "body"; - name = "body" - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bSy" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bSz" = ( -/obj/structure/closet/crate{ - name = "Excess Security Equipment" - }, -/obj/item/clothing/suit/armor/vest/old{ - armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 5, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50); - desc = "Older generation Type 1 armored vest. It looks like some of the local moths have gotten ahold of this will all the holes in it." - }, -/obj/item/clothing/suit/armor/vest/old{ - armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 5, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50); - desc = "Older generation Type 1 armored vest. It looks like some of the local moths have gotten ahold of this will all the holes in it." - }, -/obj/item/reagent_containers/spray/pepper/empty, -/obj/item/reagent_containers/spray/pepper/empty, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bSA" = ( -/obj/item/clothing/head/helmet/old{ - armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 5, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50); - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/head/helmet/old{ - armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 5, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50); - pixel_x = 1; - pixel_y = -2 - }, -/obj/structure/rack, -/obj/structure/sign/poster/contraband/fun_police{ - pixel_y = -32 - }, -/obj/item/stack/sheet/mineral/copper{ - amount = 5 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bSB" = ( -/obj/structure/girder, -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bSC" = ( -/obj/structure/reagent_dispensers/peppertank{ - pixel_x = 30 - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bSD" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bSE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bSF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "47" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/white, -/area/maintenance/port) -"bSG" = ( -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"bSH" = ( -/obj/structure/sign/poster/official/state_laws{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"bSI" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/sign/poster/official/safety_internals{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bSJ" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bSK" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"bSM" = ( -/obj/machinery/power/compressor{ - comp_id = "incineratorturbine"; - dir = 1; - luminosity = 2 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable, -/obj/machinery/camera{ - c_tag = "Turbine Chamber"; - dir = 4; - network = list("turbine") - }, -/turf/open/floor/engine/vacuum, -/area/maintenance/disposal/incinerator) -"bSN" = ( -/obj/structure/rack, -/obj/item/tank/internals/oxygen/empty, -/obj/item/tank/internals/oxygen{ - pixel_y = 2 - }, -/obj/item/clothing/mask/gas, -/turf/open/floor/plating, -/area/maintenance/aft) -"bSO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel/chapel{ - dir = 4 - }, -/area/chapel/main) -"bSP" = ( -/obj/machinery/rnd/production/circuit_imprinter/department/science, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"bSQ" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/stack/sheet/mineral/copper{ - amount = 5 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bSR" = ( -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/maintenance/aft) -"bSS" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bST" = ( -/obj/effect/turf_decal/bot, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/maintenance/aft) -"bSU" = ( -/obj/structure/closet/crate{ - name = "Excess Bar Supplies" - }, -/obj/item/reagent_containers/food/drinks/shaker, -/obj/item/reagent_containers/food/drinks/bottle/cognac, -/obj/item/reagent_containers/food/drinks/bottle/tequila, -/obj/item/reagent_containers/food/drinks/bottle/gin, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bSV" = ( -/obj/structure/table, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/storage/box/syringes, -/obj/item/reagent_containers/glass/bottle/epinephrine{ - pixel_x = 7; - pixel_y = -3 - }, -/obj/item/reagent_containers/glass/bottle/morphine{ - pixel_x = 8; - pixel_y = -3 - }, -/obj/item/reagent_containers/syringe{ - pixel_x = 6; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"bSW" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/aft) -"bSX" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) -"bSY" = ( -/obj/structure/closet/crate{ - name = "Excess Culinary Supplies" - }, -/obj/item/clothing/suit/apron/chef, -/obj/item/clothing/suit/apron/chef, -/obj/item/clothing/head/chefhat, -/obj/item/clothing/suit/toggle/chef, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bSZ" = ( -/obj/structure/closet/crate{ - name = "Excess Culinary Supplies" - }, -/obj/item/kitchen/knife{ - desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come, or so the salesman said.."; - force = 7; - name = "dull kitchen knife" - }, -/obj/item/reagent_containers/food/condiment/enzyme{ - layer = 5 - }, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 5 - }, -/obj/item/kitchen/rollingpin, -/obj/item/reagent_containers/food/condiment/flour, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bTa" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/bot, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bTb" = ( -/obj/structure/closet/crate{ - name = "Excess Bar Supplies" - }, -/obj/item/clothing/suit/apron/purple_bartender, -/obj/item/clothing/suit/apron/purple_bartender, -/obj/item/clothing/head/that{ - throwforce = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bTc" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"bTd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/aft) -"bTe" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/maintenance/aft) -"bTf" = ( -/obj/machinery/door/airlock/external{ - name = "Labor Camp Shuttle Airlock"; - req_access_txt = "2"; - shuttledocked = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/security/processing) -"bTg" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bTh" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Xenobiology Test Chamber"; - dir = 4; - network = list("xeno","rd") - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bTi" = ( -/obj/structure/disposaloutlet{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bTj" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bTk" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenocontainment"; - name = "containment chamber blastdoor" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bTl" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/door/window/westleft{ - name = "Test Chamber"; - req_access_txt = "55" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenocontainment"; - name = "containment chamber blastdoor" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bTm" = ( -/obj/item/clothing/head/cone{ - pixel_x = -3; - pixel_y = 1 - }, -/obj/item/clothing/head/cone{ - pixel_x = -3; - pixel_y = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bTn" = ( -/obj/item/clothing/head/cone{ - pixel_x = -3 - }, -/obj/item/clothing/head/cone{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/head/cone{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bTo" = ( -/obj/structure/closet/crate{ - name = "Excess Medical Supplies" - }, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/neck/stethoscope, -/obj/item/clothing/neck/stethoscope, -/obj/item/clothing/under/rank/medical/doctor, -/obj/item/clothing/head/nursehat, -/obj/item/clothing/glasses/science{ - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bTp" = ( -/obj/machinery/status_display, -/turf/closed/wall/r_wall, -/area/science/lab) -"bTq" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 28 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bTr" = ( -/obj/structure/table, -/obj/item/trash/candle, -/turf/open/floor/plating, -/area/maintenance/port) -"bTs" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bTt" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bTu" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bTv" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bTw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bTx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bTy" = ( -/obj/machinery/light/small, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bTz" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/costume, -/obj/effect/spawner/lootdrop/costume, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bTA" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/window/eastright{ - name = "Test Chamber"; - req_access_txt = "55" - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bTB" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/button/door{ - id = "xenocontainment"; - name = "Xenobiology Containment Control" - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bTC" = ( -/obj/machinery/space_heater, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bTD" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medical Maintenance Access"; - req_access_txt = "5; 9; 68" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bTE" = ( -/obj/structure/closet/crate{ - name = "Surplus Genetics Supplies" - }, -/obj/item/book/manual/wiki/medical_cloning{ - pixel_y = 6 - }, -/obj/item/book/manual/wiki/medical_cloning{ - pixel_y = 6 - }, -/obj/item/storage/box/rxglasses, -/obj/item/storage/box/rxglasses, -/turf/open/floor/plating, -/area/maintenance/port) -"bTF" = ( -/obj/structure/closet/crate{ - name = "Surplus Toxins Supplies" - }, -/obj/item/assembly/igniter, -/obj/item/assembly/igniter, -/obj/item/assembly/prox_sensor, -/obj/item/assembly/prox_sensor, -/obj/item/assembly/timer, -/obj/item/assembly/timer, -/obj/item/assembly/signaler{ - pixel_y = 8 - }, -/obj/item/assembly/signaler{ - pixel_y = 8 - }, -/obj/item/pipe_dispenser, -/obj/item/book/manual/wiki/toxins, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bTG" = ( -/obj/machinery/status_display, -/turf/closed/wall/r_wall, -/area/science/robotics/mechbay) -"bTH" = ( -/obj/effect/spawner/lootdrop/crate_spawner, -/turf/open/floor/plating, -/area/science/research) -"bTI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/maintenance/port) -"bTJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/maintenance/port) -"bTK" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/maintenance/port) -"bTL" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bTM" = ( -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bTN" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/grille, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bTO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bTP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/maintenance/aft) -"bTQ" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bTR" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/white/side{ - dir = 5 - }, -/area/science/research) -"bTS" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/maintenance/port) -"bTT" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bTU" = ( -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bTV" = ( -/obj/machinery/door/airlock/external{ - name = "Labor Camp Shuttle Airlock"; - shuttledocked = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/security/processing) -"bTW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bTX" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bTY" = ( -/obj/machinery/power/apc{ - areastring = "/area/medical/patients_rooms/room_a"; - dir = 4; - name = "Patient Room A APC"; - pixel_x = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/maintenance/port) -"bTZ" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bUa" = ( -/obj/machinery/vending/wallmed{ - pixel_y = 28 - }, -/obj/structure/table, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/maintenance/port) -"bUb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/disposalpipe/sorting/mail{ - dir = 8; - name = "sorting disposal pipe (Chapel)"; - sortType = 17 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bUc" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/minor/kittyears_or_rabbitears, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bUd" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bUe" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bUf" = ( -/obj/machinery/airalarm/all_access{ - pixel_y = 26 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bUg" = ( -/obj/machinery/atmospherics/components/binary/valve{ - dir = 1; - name = "mix to port" - }, -/obj/machinery/button/door/incinerator_vent_toxmix{ - pixel_y = 28 - }, -/obj/machinery/button/ignition/incinerator/toxmix{ - pixel_x = 8; - pixel_y = 28 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bUh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bUi" = ( -/obj/machinery/atmospherics/components/binary/valve{ - dir = 1; - name = "port to mix" - }, -/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_toxmix{ - pixel_y = 28 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bUk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/science/mixing) -"bUl" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bUm" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bUn" = ( -/obj/machinery/door/firedoor/heavy, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bUo" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/plasteel, -/area/hydroponics) -"bUp" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Dock Convergance 2"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bUq" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/landmark/start/assistant, -/obj/machinery/camera{ - c_tag = "Hallway - Dock Convergance 1"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"bUr" = ( -/obj/machinery/light, -/obj/structure/tank_dispenser, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"bUs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"bUt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/computer/turbine_computer{ - dir = 1; - id = "incineratorturbine" - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"bUu" = ( -/obj/machinery/atmospherics/pipe/layer_manifold, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) -"bUv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) -"bUw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) -"bUx" = ( -/obj/structure/sign/warning/fire{ - pixel_y = 32 - }, -/turf/open/space/basic, -/area/space/nearstation) -"bUy" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_atmos{ - dir = 8 - }, -/turf/open/floor/engine, -/area/maintenance/disposal/incinerator) -"bUz" = ( -/obj/structure/lattice/catwalk, -/obj/structure/sign/warning/fire{ - pixel_y = 32 - }, -/turf/open/space/basic, -/area/space/nearstation) -"bUA" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) -"bUB" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bUC" = ( -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bUD" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bUE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"bUF" = ( -/obj/machinery/power/apc{ - areastring = "/area/engine/gravity_generator"; - dir = 8; - name = "Gravity Generator APC"; - pixel_x = -24 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/cable/yellow, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bUG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/quartermaster/office) -"bUH" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bUI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bUJ" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bUK" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/quartermaster/office) -"bUL" = ( -/obj/structure/table/wood, -/obj/machinery/camera{ - c_tag = "Civilian - Chapel Main 1"; - dir = 4; - network = list("ss13") - }, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main) -"bUM" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/chapel{ - dir = 4 - }, -/area/chapel/main) -"bUN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main) -"bUO" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/carpet, -/area/chapel/main) -"bUP" = ( -/turf/closed/wall/r_wall, -/area/chapel/main) -"bUQ" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/main) -"bUR" = ( -/turf/open/floor/plasteel/dark, -/area/chapel/main) -"bUS" = ( -/obj/effect/spawner/structure/window/reinforced/tinted, -/turf/open/floor/plasteel/dark, -/area/chapel/main) -"bUT" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/main) -"bUU" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/chapel/main) -"bUV" = ( -/obj/structure/table/wood, -/turf/open/floor/plasteel/dark, -/area/chapel/main) -"bUW" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1481; - name = "Confessional Intercom"; - pixel_x = -25 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/main) -"bUX" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1481; - name = "Confessional Intercom"; - pixel_x = 25 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/main) -"bUY" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/chapel{ - dir = 4 - }, -/area/chapel/main) -"bUZ" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/turf/open/floor/carpet, -/area/chapel/main) -"bVa" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Chapel" - }, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/turf/open/floor/carpet, -/area/chapel/main) -"bVb" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Chapel" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/carpet, -/area/chapel/main) -"bVc" = ( -/obj/machinery/door/airlock/external{ - name = "Labor Camp Shuttle Airlock"; - req_access_txt = "2"; - shuttledocked = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/security/processing) -"bVd" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bVe" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bVf" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bVg" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bVh" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bVi" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bVj" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bVk" = ( -/obj/machinery/light/small, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bVl" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bVn" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bVo" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bVp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bVq" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/maintenance/fore) -"bVr" = ( -/obj/machinery/camera{ - c_tag = "Civilian - Chapel Office"; - dir = 2; - network = list("ss13") - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/sign/departments/holy{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bVs" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"bVt" = ( -/obj/effect/landmark/start/cargo_technician, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"bVu" = ( -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"bVv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"bVw" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/quartermaster/storage) -"bVx" = ( -/obj/structure/disposalpipe/junction, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bVy" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown, -/obj/structure/disposalpipe/junction/flip, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"bVz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bVA" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"bVB" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"bVC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bVD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bVE" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bVF" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main) -"bVG" = ( -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/chapel, -/area/chapel/main) -"bVH" = ( -/obj/machinery/door/airlock/public/glass, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bVJ" = ( -/obj/item/storage/firstaid/regular, -/obj/structure/rack, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bVK" = ( -/obj/item/grown/bananapeel, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "5;12" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bVL" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/port) -"bVM" = ( -/turf/closed/wall, -/area/maintenance/department/crew_quarters/bar) -"bVN" = ( -/obj/machinery/computer/nanite_chamber_control{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/lab) -"bVO" = ( -/turf/open/floor/plasteel/dark, -/area/science/lab) -"bVP" = ( -/obj/structure/reagent_dispensers/beerkeg, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bVQ" = ( -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/maintenance/port) -"bVR" = ( -/obj/machinery/nanite_chamber, -/turf/open/floor/plasteel/dark, -/area/science/lab) -"bVS" = ( -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = 24 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bVT" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/storage/box/disks_nanite, -/obj/item/nanite_scanner, -/obj/item/nanite_remote{ - pixel_x = 2; - pixel_y = -4 - }, -/turf/open/floor/plasteel/dark, -/area/science/lab) -"bVU" = ( -/obj/structure/table/wood/poker, -/obj/item/toy/cards/deck, -/obj/effect/spawner/lootdrop/gambling, -/turf/open/floor/wood, -/area/maintenance/department/crew_quarters/bar) -"bVV" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/effect/landmark/start/scientist, -/turf/open/floor/plasteel/dark, -/area/science/lab) -"bVW" = ( -/obj/structure/chair/stool, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bVX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "5;12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/maintenance/port) -"bVY" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/department/crew_quarters/bar) -"bVZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bWa" = ( -/obj/structure/rack, -/obj/item/reagent_containers/food/drinks/bottle/vodka{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/reagent_containers/food/drinks/bottle/vermouth{ - pixel_x = -4; - pixel_y = 3 - }, -/obj/item/reagent_containers/food/drinks/bottle/whiskey, -/obj/structure/sign/poster/contraband/random{ - pixel_y = 32 - }, -/obj/structure/light_construct/small{ - dir = 1 - }, -/turf/open/floor/wood, -/area/maintenance/department/crew_quarters/bar) -"bWb" = ( -/obj/structure/chair/stool/bar, -/obj/structure/sign/barsign{ - pixel_y = 32 - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bWc" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bWd" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/light_switch{ - pixel_x = -24; - pixel_y = 8 - }, -/turf/open/floor/wood, -/area/maintenance/department/crew_quarters/bar) -"bWe" = ( -/obj/structure/closet/crate, -/obj/item/paicard, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bWf" = ( -/obj/structure/chair/stool, -/obj/structure/light_construct/small{ - dir = 1 - }, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/maintenance/department/crew_quarters/bar) -"bWg" = ( -/obj/structure/light_construct/small{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bWh" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/item/toy/cards/deck, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/security/prison) -"bWi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bWj" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/beer, -/obj/item/reagent_containers/food/drinks/beer{ - pixel_x = 6; - pixel_y = 4 - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bWk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bWl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/table_frame/wood, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bWm" = ( -/obj/item/reagent_containers/glass/rag, -/obj/structure/table_frame/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bWn" = ( -/obj/structure/sign/poster/contraband/random{ - pixel_x = 32 - }, -/obj/structure/light_construct/small{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bWo" = ( -/obj/structure/chair/stool/bar, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bWp" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/light{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_x = 28 - }, -/obj/machinery/camera{ - c_tag = "Service - Bar Main 2"; - dir = 8; - network = list("ss13","Bar Area") - }, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bWq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/wood, -/area/maintenance/department/crew_quarters/bar) -"bWr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"bWs" = ( -/obj/structure/table/wood, -/obj/item/nullrod, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"bWt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bWu" = ( -/obj/machinery/requests_console{ - department = "Chapel"; - departmentType = 2; - pixel_y = -30 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bWv" = ( -/obj/structure/light_construct/small, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bWw" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/maintenance/department/crew_quarters/bar) -"bWx" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, -/area/maintenance/department/crew_quarters/bar) -"bWy" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bWz" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/maintenance/port/aft) -"bWA" = ( -/obj/machinery/door/airlock/engineering{ - name = "Gravity Generator"; - req_access_txt = "11" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bWB" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall, -/area/maintenance/department/crew_quarters/bar) -"bWC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/frame/machine, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bWD" = ( -/obj/structure/sign/poster/contraband/random{ - pixel_y = -32 - }, -/obj/machinery/vending/cigarette, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bWE" = ( -/obj/machinery/vending/assist, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bWF" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, -/area/maintenance/department/crew_quarters/bar) -"bWG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bWH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bWI" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron/twenty, -/obj/item/stack/sheet/glass{ - amount = 20; - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bWJ" = ( -/obj/structure/table, -/obj/item/stack/rods/twentyfive, -/turf/open/floor/plating, -/area/maintenance/port) -"bWK" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bWL" = ( -/obj/structure/closet/crate, -/obj/item/book/manual/wiki/grenades, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bWM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bWN" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bWO" = ( -/obj/machinery/light_switch{ - pixel_x = -8; - pixel_y = -24 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bWP" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Chapel Office"; - req_access_txt = "22" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"bWQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/chapel, -/area/chapel/main) -"bWR" = ( -/obj/structure/chair/stool, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/carpet, -/area/chapel/main) -"bWS" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel/chapel{ - dir = 4 - }, -/area/chapel/main) -"bWU" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"bWV" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bWW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bWX" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bWY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/closet, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bWZ" = ( -/obj/structure/table, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bXa" = ( -/obj/structure/chair/stool, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bXb" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bXc" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/rack, -/turf/open/floor/plating, -/area/maintenance/port) -"bXd" = ( -/obj/structure/reagent_dispensers/foamtank, -/turf/open/floor/plating, -/area/maintenance/fore) -"bXe" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/maintenance/port) -"bXf" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/maintenance/port) -"bXg" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bXh" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/girder, -/turf/open/floor/plating, -/area/maintenance/port) -"bXi" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/external{ - name = "TeleSat External Airlock"; - req_one_access_txt = "32;19" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bXj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/structure/girder, -/turf/open/floor/plating, -/area/maintenance/aft) -"bXk" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bXl" = ( -/obj/structure/closet/firecloset, -/obj/structure/extinguisher_cabinet{ - pixel_x = -28 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bXm" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bXn" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bXo" = ( -/obj/machinery/door/airlock/public/glass, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bXp" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bXq" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bXr" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/maintenance/port) -"bXs" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bXt" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/maintenance/aft) -"bXu" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bXv" = ( -/turf/open/floor/plating, -/area/maintenance/aft) -"bXw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/maintenance/aft) -"bXx" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/maintenance/aft) -"bXy" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bXz" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/effect/spawner/lootdrop/crate_spawner, -/turf/open/floor/plating, -/area/maintenance/port) -"bXA" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/crate_spawner, -/turf/open/floor/plating, -/area/maintenance/port) -"bXB" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bXC" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bXD" = ( -/obj/structure/sign/warning/pods{ - pixel_y = -32 - }, -/obj/effect/spawner/lootdrop/crate_spawner, -/turf/open/floor/plating, -/area/maintenance/aft) -"bXE" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bXF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/starboard) -"bXG" = ( -/obj/structure/table, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/item/gun/energy/e_gun/dragnet, -/obj/item/gun/energy/e_gun/dragnet, -/obj/item/beacon/nettingportal, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"bXH" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bXI" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bXJ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bXK" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bXL" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bXN" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bXO" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bXP" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bXQ" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bXR" = ( -/obj/structure/closet/cardboard, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bXS" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bXT" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bXU" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/table, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bXV" = ( -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bXW" = ( -/obj/structure/closet, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bXX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bXY" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/girder, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bXZ" = ( -/obj/structure/lattice, -/obj/structure/sign/warning/docking{ - desc = "A warning sign to remind people not to breathe invisible sleepy gas."; - name = "REMINDER: DON'T BREATHE THIS"; - pixel_x = -32 - }, -/turf/open/space/basic, -/area/space/nearstation) -"bYa" = ( -/obj/structure/table, -/obj/item/flashlight/lamp, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bYb" = ( -/obj/structure/table, -/obj/item/paper_bin, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bYc" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bYd" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bYf" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bYg" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bYh" = ( -/obj/structure/rack, -/obj/item/stack/cable_coil/random, -/obj/item/stack/cable_coil/random, -/turf/open/floor/plating, -/area/maintenance/aft) -"bYi" = ( -/obj/item/storage/toolbox/electrical, -/obj/structure/table, -/turf/open/floor/plating, -/area/maintenance/aft) -"bYj" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bYk" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bYl" = ( -/obj/effect/turf_decal/bot, -/obj/effect/spawner/lootdrop/crate_spawner, -/turf/open/floor/plating, -/area/maintenance/fore) -"bYm" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port) -"bYn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port) -"bYr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port) -"bYs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port) -"bYt" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bYu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port) -"bYv" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bYw" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port) -"bYx" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bYy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port) -"bYz" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port) -"bYA" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bYB" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bYC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bYD" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port) -"bYE" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port) -"bYG" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bYH" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port) -"bYI" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/aft) -"bYJ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port) -"bYK" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bYL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/aft) -"bYO" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/aft) -"bYP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bYQ" = ( -/obj/machinery/door/airlock/external{ - name = "Labor Camp Shuttle Airlock"; - shuttledocked = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/security/processing) -"bYR" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/space/basic, -/area/solar/aft) -"bYS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bYU" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bYV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bYW" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bYX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bYY" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/aft) -"bYZ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/aft) -"bZa" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/aft) -"bZb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/aft) -"bZc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/aft) -"bZf" = ( -/obj/structure/closet/cardboard, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bZg" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/port) -"bZh" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 8; - name = "8maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bZi" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bZj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bZk" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/port) -"bZl" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bZm" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 8; - name = "8maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bZn" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bZo" = ( -/obj/structure/closet/cardboard, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 8; - name = "8maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bZp" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bZq" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bZr" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"bZs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/closet/crate, -/obj/item/clothing/head/wig/random, -/obj/item/clothing/head/wig/random, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/aft) -"bZt" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bZu" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bZv" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bZw" = ( -/obj/structure/closet/crate, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/coin/silver, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/aft) -"bZx" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/maintenance/port) -"bZy" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"bZz" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance, -/obj/item/stack/sheet/mineral/copper{ - amount = 5 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bZA" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/closet/secure_closet/personal, -/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/tile/neutral, -/obj/structure/sign/poster/official/cleanliness{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/dark, -/area/janitor) -"bZC" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/computer/arcade, -/obj/structure/sign/poster/official/foam_force_ad{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bZD" = ( -/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/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/sign/departments/science{ - pixel_x = -32 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bZE" = ( -/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/tile/neutral{ - dir = 4 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bZF" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10" - }, -/turf/open/floor/carpet, -/area/bridge) -"bZG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10" - }, -/turf/open/floor/carpet, -/area/bridge) -"bZH" = ( -/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/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/sign/departments/security{ - pixel_x = 32 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bZI" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-22" - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"bZJ" = ( -/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/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bZK" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bZL" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/item/twohanded/required/kirbyplants/photosynthetic, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat/foyer) -"bZM" = ( -/obj/item/twohanded/required/kirbyplants/photosynthetic, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) -"bZN" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) -"bZO" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/vending/coffee, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bZP" = ( -/obj/structure/chair/stool, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/maintenance/department/crew_quarters/bar) -"bZQ" = ( -/obj/structure/chair/stool/bar, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"bZS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"bZT" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/xmastree, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bZV" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"bZW" = ( -/obj/machinery/status_display, -/turf/closed/wall/r_wall, -/area/security/brig) -"bZX" = ( -/obj/structure/closet/crate{ - name = "Excess Medical Supplies" - }, -/obj/item/storage/firstaid/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/storage/firstaid/regular{ - empty = 1; - name = "First-Aid (empty)" - }, -/obj/item/circuitboard/machine/stasis, -/turf/open/floor/plating, -/area/maintenance/port) -"bZY" = ( -/obj/machinery/status_display, -/turf/closed/wall, -/area/hallway/primary/central) -"bZZ" = ( -/obj/machinery/status_display, -/turf/closed/wall, -/area/maintenance/aft) -"caa" = ( -/obj/structure/closet/crate{ - name = "Excess Custodial Supplies" - }, -/obj/item/mop, -/obj/item/mop, -/obj/item/reagent_containers/glass/bucket, -/obj/item/reagent_containers/glass/bucket, -/obj/item/soap/deluxe, -/obj/item/caution, -/obj/item/caution, -/obj/item/caution, -/turf/open/floor/plating, -/area/maintenance/aft) -"cab" = ( -/obj/structure/table/wood, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/toy/figure/mime, -/obj/item/gun/magic/wand, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"cad" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/landmark/blobstart, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"cae" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"caf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/landmark/blobstart, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"cag" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"cah" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"caj" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"cak" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"cal" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"cam" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/maintenance/fore) -"can" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/closet, -/turf/open/floor/plating, -/area/maintenance/fore) -"cao" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"cap" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 8; - name = "8maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"caq" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"car" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/maintenance/port) -"cat" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/structure/extinguisher_cabinet{ - pixel_y = 28 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/maintenance/department/security) -"cau" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/maintenance/aft) -"cav" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/maintenance/aft) -"caw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/table, -/turf/open/floor/plating, -/area/maintenance/disposal) -"cax" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-22" - }, -/turf/open/floor/wood, -/area/library) -"cay" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 4; - icon_state = "booze_dispenser" - }, -/obj/structure/sign/poster/official/high_class_martini{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"caz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"caA" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"caB" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/hydroponics) -"caC" = ( -/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 - }, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel{ - dir = 2 - }, -/area/ai_monitored/security/armory) -"caD" = ( -/obj/structure/table, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/recharger, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"caF" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/hydroponics) -"caH" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/white, -/area/security/brig) -"caI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/security/processing) -"caJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"caK" = ( -/obj/effect/landmark/secequipment, -/obj/effect/turf_decal/bot, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) -"caL" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/cmo) -"caM" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/effect/landmark/start/chief_engineer, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/chief) -"caN" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/item/flashlight/lamp, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"caO" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=BOTTOMLEFT"; - location = "BOTTOMMID"; - name = "navigation beacon (BOTTOMMID)" - }, -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"caP" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/holopad, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/security/main) -"caQ" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"caR" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"caS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/security/courtroom) -"caT" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/security_space_law, -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"caU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"caV" = ( -/obj/structure/chair/stool/bar, -/obj/effect/decal/cleanable/glass, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"caW" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/gateway) -"caX" = ( -/obj/machinery/computer/telecomms/monitor{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"caY" = ( -/obj/machinery/computer/scan_consolenew, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/structure/sign/departments/science{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"caZ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"cba" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cbb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/dark, -/area/bridge) -"cbc" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plating, -/area/storage/tech) -"cbd" = ( -/obj/structure/weightmachine/stacklifter, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"cbg" = ( -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/structure/sink{ - pixel_y = 24 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"cbh" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"cbi" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "47;12" - }, -/turf/open/floor/plasteel/showroomfloor, -/area/maintenance/port/fore) -"cbk" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"cbl" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"cbm" = ( -/obj/structure/closet/secure_closet/personal, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"cbn" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Excess Storage"; - req_one_access_txt = "47" - }, -/turf/open/floor/plating, -/area/science/research) -"cbo" = ( -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/plating, -/area/science/research) -"cbp" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/science/research) -"cbq" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating, -/area/science/research) -"cbr" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating, -/area/science/research) -"cbs" = ( -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"cbt" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Two" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/maintenance/aft) -"cbu" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Two" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"cbv" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/mineral/ore_redemption, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"cby" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"cbz" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"cbA" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"cbB" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"cbC" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/maintenance/fore) -"cbD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"cbF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"cbG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"cbH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"cbI" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/medical/genetics/cloning) -"cbJ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"cbK" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"cbL" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"cbM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"cbN" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"cbO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"cbP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"cbR" = ( -/obj/machinery/light, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/deliveryChute{ - desc = "A chute for big and small corpses alike!"; - dir = 1; - name = "corpse chute" - }, -/obj/machinery/door/window/northleft{ - name = "Corpse Chute"; - req_one_access_txt = "5; 68" - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"cbS" = ( -/obj/structure/closet/wardrobe/white, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"cbT" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;22;25;26;28;35;37;38;46" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"cbU" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"cbV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/brig{ - id = "Cell 3"; - name = "Cell 3 Locker" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"cbW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/brig{ - id = "Cell 4"; - name = "Cell 4 Locker" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"cbX" = ( -/obj/machinery/status_display, -/turf/closed/wall, -/area/maintenance/fore) -"cbY" = ( -/obj/machinery/status_display, -/turf/closed/wall, -/area/lawoffice) -"cbZ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/obj/machinery/door/poddoor/preopen{ - id = "xenocontainment"; - name = "containment chamber blastdoor" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"cca" = ( -/obj/item/toy/figure/scientist, -/obj/machinery/light/small, -/turf/open/floor/circuit/telecomms, -/area/science/xenobiology) -"ccb" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"ccc" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"ccd" = ( -/obj/structure/chair/stool, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, -/area/maintenance/department/crew_quarters/bar) -"cce" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"ccg" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/computer/security/telescreen{ - dir = 4; - name = "Test Chamber Monitor"; - network = list("xeno"); - pixel_y = 2 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"cch" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/wrench, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"cci" = ( -/obj/machinery/computer/slot_machine, -/obj/structure/light_construct/small, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/maintenance/department/crew_quarters/bar) -"ccj" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/department/security) -"cck" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/construction) -"ccl" = ( -/obj/structure/door_assembly, -/turf/open/floor/plating, -/area/construction) -"ccm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/frame/computer{ - dir = 4; - icon_state = "0" - }, -/obj/item/circuitboard/computer/powermonitor, -/turf/open/floor/plasteel, -/area/construction) -"ccn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/construction) -"cco" = ( -/obj/machinery/door/poddoor/shutters{ - id = "constructionshutter"; - name = "Construction Access Shutters" - }, -/turf/open/floor/plating, -/area/hallway/secondary/exit/departure_lounge) -"ccp" = ( -/obj/structure/door_assembly/door_assembly_eng, -/turf/open/floor/plating, -/area/construction) -"ccq" = ( -/obj/structure/closet/toolcloset, -/turf/open/floor/plating, -/area/construction) -"ccr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"ccs" = ( -/obj/structure/table, -/obj/item/storage/box/lights/mixed, -/obj/item/pipe_dispenser, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"cct" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/button/door{ - id = "aux_base_shutters"; - name = "Public Shutters Control"; - pixel_x = 24; - req_one_access_txt = "32;47;48" - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"ccu" = ( -/obj/machinery/door/poddoor/shutters{ - id = "aux_base_shutters"; - name = "Auxillary Base Shutters" - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"ccv" = ( -/obj/machinery/power/smes, -/turf/open/floor/plating, -/area/construction) -"ccw" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/construction) -"ccx" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/construction) -"ccy" = ( -/obj/structure/frame/machine, -/turf/open/floor/plating, -/area/construction) -"ccz" = ( -/obj/machinery/button/door{ - id = "constructionshutter"; - name = "Construction Access Control"; - pixel_x = 24; - pixel_y = 8 - }, -/turf/open/floor/plating, -/area/construction) -"ccA" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/construction) -"ccB" = ( -/obj/structure/transit_tube_pod{ - dir = 4; - icon_state = "pod" - }, -/obj/structure/transit_tube/station/reverse{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"ccC" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/hallway/secondary/exit/departure_lounge) -"ccD" = ( -/obj/machinery/button/door{ - id = "researchprivate"; - name = "Desk Privacy Shutters Control"; - pixel_x = 24; - pixel_y = -4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/lab) -"ccE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"ccF" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"ccG" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/closet/crate/trashcart, -/obj/item/storage/bag/trash, -/obj/item/stack/sheet/mineral/coal, -/obj/item/trash/can, -/obj/item/trash/can, -/obj/item/trash/can, -/obj/item/trash/popcorn, -/obj/item/trash/popcorn, -/obj/item/trash/sosjerky, -/turf/open/floor/plating, -/area/maintenance/disposal) -"ccH" = ( -/obj/machinery/conveyor{ - id = "garbage" - }, -/obj/machinery/door/poddoor/preopen{ - id = "Disposal Exit"; - name = "disposal exit vent" - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"ccI" = ( -/obj/machinery/button/door{ - id = "Disposal Exit"; - name = "Disposal Vent Control"; - pixel_x = -25; - pixel_y = 4; - req_access_txt = "12" - }, -/obj/machinery/button/massdriver{ - id = "trash"; - pixel_x = -26; - pixel_y = -6 - }, -/obj/structure/chair/stool, -/turf/open/floor/plating, -/area/maintenance/disposal) -"ccJ" = ( -/turf/open/floor/plating, -/area/maintenance/disposal) -"ccK" = ( -/obj/machinery/mass_driver{ - id = "trash" - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"ccL" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"ccM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"ccN" = ( -/obj/structure/closet, -/obj/item/storage/box/lights/mixed, -/obj/item/storage/box/lights/mixed, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"ccO" = ( -/obj/machinery/door/poddoor{ - id = "trash"; - name = "disposal bay door" - }, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/maintenance/disposal) -"ccP" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/disposal) -"ccQ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/disposal) -"ccR" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/disposal) -"ccS" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/transit_tube/curved/flipped{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"ccT" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/closet, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"ccU" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"ccV" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/grille, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"ccW" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/transit_tube/curved{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"ccX" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/construction) -"ccY" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/item/circuitboard/machine/smes{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/circuitboard/machine/smes, -/turf/open/floor/plasteel, -/area/construction) -"ccZ" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/item/circuitboard/computer/apc_control{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/circuitboard/machine/holopad, -/turf/open/floor/plasteel, -/area/construction) -"cda" = ( -/obj/structure/lattice, -/obj/structure/transit_tube/curved{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) -"cdb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel, -/area/construction) -"cdc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/turf/open/floor/plating, -/area/construction) -"cdd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/construction) -"cde" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/construction) -"cdf" = ( -/obj/structure/lattice, -/obj/structure/transit_tube/curved, -/turf/open/space/basic, -/area/space/nearstation) -"cdg" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/exit/departure_lounge) -"cdh" = ( -/obj/structure/lattice, -/obj/structure/transit_tube/curved{ - dir = 8 - }, -/turf/open/space/basic, -/area/space/nearstation) -"cdi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/construction) -"cdj" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/status_display/evac{ - pixel_x = -32 - }, -/obj/machinery/camera{ - c_tag = "Hallway - Escape Left Wing 2"; - dir = 4; - network = list("ss13") - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/exit/departure_lounge) -"cdl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/crowbar, -/turf/open/floor/plasteel, -/area/construction) -"cdm" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/hallway/secondary/exit/departure_lounge) -"cdn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/construction) -"cdo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/stack/rods/fifty, -/obj/item/stack/cable_coil{ - amount = 5 - }, -/obj/item/stack/cable_coil{ - amount = 5; - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/stack/sheet/mineral/plasma{ - amount = 10 - }, -/turf/open/floor/plasteel, -/area/construction) -"cdp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/port_gen/pacman, -/obj/item/wrench, -/turf/open/floor/plasteel, -/area/construction) -"cdq" = ( -/obj/structure/lattice, -/obj/structure/transit_tube, -/turf/open/space/basic, -/area/space/nearstation) -"cdr" = ( -/obj/structure/lattice/catwalk, -/obj/structure/transit_tube/curved/flipped, -/turf/open/space/basic, -/area/space/nearstation) -"cds" = ( -/obj/structure/lattice/catwalk, -/obj/structure/transit_tube, -/turf/open/space/basic, -/area/space/nearstation) -"cdt" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"cdu" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"cdv" = ( -/obj/structure/lattice/catwalk, -/obj/structure/transit_tube/curved{ - dir = 1 - }, -/turf/open/space/basic, -/area/space/nearstation) -"cdw" = ( -/obj/structure/transit_tube/station/reverse{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"cdx" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "aishuttersexternal"; - name = "AI privacy shutters" - }, -/obj/structure/transit_tube/curved/flipped{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"cdy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/turretid{ - control_area = "/area/ai_monitored/turret_protected/aisat/foyer"; - enabled = 1; - name = "AI Chamber Foyer Control"; - pixel_y = -24; - req_access = null; - req_access_txt = "65" - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"cdz" = ( -/obj/item/storage/belt/utility, -/obj/item/weldingtool, -/turf/open/floor/plating, -/area/tcommsat/computer) -"cdA" = ( -/obj/structure/lattice, -/obj/structure/transit_tube/curved/flipped{ - dir = 1 - }, -/turf/open/space/basic, -/area/space/nearstation) -"cdB" = ( -/obj/structure/lattice, -/obj/structure/transit_tube/diagonal/topleft, -/turf/open/space/basic, -/area/space/nearstation) -"cdC" = ( -/obj/structure/lattice, -/obj/structure/transit_tube/curved/flipped, -/turf/open/space/basic, -/area/space/nearstation) -"cdD" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"cdE" = ( -/obj/structure/lattice, -/obj/structure/transit_tube/curved{ - dir = 1 - }, -/turf/open/space/basic, -/area/space/nearstation) -"cdF" = ( -/obj/structure/table/wood, -/obj/item/folder/red, -/obj/item/folder/white{ - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"cdG" = ( -/obj/structure/table/wood, -/obj/item/phone, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"cdH" = ( -/obj/structure/table/wood, -/obj/item/toy/talking/AI, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"cdI" = ( -/obj/structure/lattice/catwalk, -/obj/structure/transit_tube/curved/flipped{ - dir = 8 - }, -/turf/open/space/basic, -/area/space/nearstation) -"cdJ" = ( -/obj/machinery/door/airlock/hatch{ - name = "Telecomms Control Room"; - req_one_access_txt = "19; 61" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plasteel/dark, -/area/tcommsat/server) -"cdK" = ( -/obj/machinery/door/airlock/hatch{ - name = "Telecomms Control Room"; - req_one_access_txt = "19; 61" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/tcommsat/server) -"cdL" = ( -/turf/open/floor/engine/n2{ - initial_gas_mix = "n2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"cdM" = ( -/obj/machinery/atmospherics/miner/nitrogen{ - max_ext_kpa = 2500 - }, -/turf/open/floor/engine/n2{ - initial_gas_mix = "n2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"cdN" = ( -/turf/open/floor/engine/o2{ - initial_gas_mix = "o2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"cdP" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/loading_area, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"cdQ" = ( -/obj/structure/plasticflaps/opaque, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - dir = 2; - freq = 1400; - location = "Atmospherics"; - name = "navigation beacon (Atmospherics Delivery)" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/southleft{ - name = "Atmospherics Delivery Access"; - req_access_txt = "0"; - req_one_access_txt = "24;10" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cdR" = ( -/obj/structure/plasticflaps/opaque, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - dir = 1; - freq = 1400; - location = "Security"; - name = "navigation beacon (Security Delivery)" - }, -/obj/machinery/door/window/northright{ - name = "Security Delivery Access"; - req_access_txt = "1" - }, -/turf/open/floor/plating, -/area/security/main) -"cdT" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"cdU" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"cdV" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"cdX" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"cdY" = ( -/obj/structure/grille, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"cdZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"cea" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/crate_spawner, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"ceb" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"cec" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 8; - name = "8maintenance loot spawner" - }, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"ced" = ( -/obj/structure/rack, -/obj/item/mop{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/mop, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/plating, -/area/science/research) -"cee" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/port) -"cef" = ( -/obj/structure/closet/toolcloset, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"ceg" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"ceh" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 12 - }, -/turf/open/floor/plating, -/area/science/research) -"cei" = ( -/obj/structure/mopbucket, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating, -/area/science/research) -"cej" = ( -/obj/structure/closet/crate/trashcart, -/obj/item/storage/bag/trash, -/obj/item/trash/plate, -/obj/item/trash/plate, -/obj/item/trash/candle, -/obj/item/trash/can, -/obj/item/trash/can, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"cek" = ( -/obj/item/trash/can, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"cel" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/turretid{ - control_area = "/area/ai_monitored/nuke_storage"; - name = "Vault turret control"; - pixel_y = 25 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"cem" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"cen" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"ceo" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"cep" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "5;12" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"ceq" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"cer" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/turf/open/floor/plasteel, -/area/maintenance/port/aft) -"ces" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/maintenance/aft) -"cet" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ceu" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"cev" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"cew" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"cex" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"cey" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ceA" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ceB" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ceC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=LEFTMID"; - location = "LEFTBOTTOM"; - name = "navigation beacon (LEFTBOTTOM)" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ceD" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ceE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=LEFTBOTTOM"; - location = "BOTTOMLEFT"; - name = "navigation beacon (BOTTOMMID)" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ceF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 4; - name = "sorting disposal pipe (Law Office)"; - sortType = 29 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ceG" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/camera{ - c_tag = "Hallway - Central Southwest 1"; - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ceH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ceI" = ( -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 4; - name = "sorting disposal pipe (Engineering)"; - sortTypes = list(4,5) - }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ceJ" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ceK" = ( -/obj/machinery/atmospherics/miner/oxygen{ - max_ext_kpa = 2500 - }, -/turf/open/floor/engine/o2{ - initial_gas_mix = "o2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"ceL" = ( -/obj/machinery/light/small, -/obj/machinery/camera{ - c_tag = "Atmospherics - Nitrogren Tank"; - dir = 1; - network = list("ss13","Atmospherics") - }, -/turf/open/floor/engine/n2{ - initial_gas_mix = "n2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"ceM" = ( -/obj/machinery/light/small, -/obj/machinery/camera{ - c_tag = "Atmospherics - Oxygen Tank"; - dir = 1; - network = list("ss13","Atmospherics") - }, -/turf/open/floor/engine/o2{ - initial_gas_mix = "o2=1000;TEMP=293.15" - }, -/area/engine/atmos) -"ceN" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) -"ceS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - 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/structure/chair{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"ceV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - 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/structure/chair{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"ceW" = ( -/obj/effect/landmark/start/station_engineer, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cfc" = ( -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/science/xenobiology) -"cfd" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/science/xenobiology) -"cgH" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Cooling Loop Bypass" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"cla" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"clO" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/glass/beaker/cryoxadone, -/obj/item/reagent_containers/glass/beaker/cryoxadone, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/medical/cryo) -"csr" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/tcommsat/server) -"csH" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"cvc" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/mob/living/simple_animal/bot/cleanbot, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/service) -"cvq" = ( -/obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"cxa" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"cxK" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"czY" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/power/apc{ - areastring = "/area/teleporter"; - dir = 1; - name = "Teleporter APC"; - pixel_y = 24 - }, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"cAa" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"cDf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Engineering - Suit Storage"; - dir = 8; - network = list("ss13","Engineering","Engine") - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cIZ" = ( -/turf/closed/wall, -/area/crew_quarters/fitness/locker_room) -"cLX" = ( -/obj/effect/decal/cleanable/dirt, -/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) -"cNG" = ( -/obj/structure/table/wood, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/item/radio/intercom{ - pixel_x = -30 - }, -/turf/open/floor/wood, -/area/lawoffice) -"cOZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cPq" = ( -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/heads/captain"; - dir = 1; - name = "Captain's Office APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/newscaster/security_unit{ - pixel_x = -32 - }, -/obj/machinery/door/window/southleft{ - name = "Suit Access"; - req_access_txt = "20" - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"cPK" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/power/apc{ - areastring = "/area/maintenance/department/security"; - dir = 1; - name = "Security Maintenance APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"cRz" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/fitness/recreation"; - dir = 8; - name = "Dormatories APC"; - pixel_x = -24 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"cUe" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Laser Room"; - req_access_txt = "10" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/engine, -/area/engine/engine_room) -"cXx" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"cYx" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/camera/autoname{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"cZN" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "External Gas to Loop" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"dfK" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 4 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/sign/poster/official/random{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"dfN" = ( -/obj/structure/reflector/single/anchored{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"dgr" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/closet/crate, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"diw" = ( -/obj/item/radio/intercom{ - pixel_y = -29 - }, -/turf/open/floor/plasteel/white/side{ - dir = 5 - }, -/area/science/research) -"dlq" = ( -/obj/machinery/door/airlock/hatch{ - name = "Supermatter External Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room/external) -"dmV" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"dns" = ( -/obj/structure/closet/secure_closet/personal, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"dnN" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"dpg" = ( -/obj/machinery/suit_storage_unit/open, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room/external) -"dpT" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/engine_room) -"dtX" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 4 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"dwg" = ( -/obj/structure/reagent_dispensers/cooking_oil, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"dxJ" = ( -/obj/structure/closet/wardrobe/science_white, -/turf/open/floor/plasteel/white, -/area/science/explab) -"dzi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/camera/autoname{ - dir = 8 - }, -/obj/machinery/power/apc/highcap/ten_k{ - areastring = "/area/engine/engine_room"; - dir = 2; - name = "Engine Room APC"; - pixel_y = -24 - }, -/obj/structure/cable/yellow, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"dCc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"dEx" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"dFi" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"dIr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"dNx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"dUa" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plasteel, -/area/engine/engineering) -"dUt" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"dUT" = ( -/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/item/radio/intercom{ - pixel_y = 29 - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"dXK" = ( -/obj/structure/cable/yellow{ - 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) -"dYW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"dZa" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"dZW" = ( -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"edu" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/power/apc{ - areastring = "/area/security/main"; - dir = 1; - name = "Security Office APC"; - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/security/main) -"eiC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"elZ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"emg" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"enD" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/obj/structure/closet/radiation, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/camera/autoname{ - dir = 4 - }, -/obj/structure/sign/poster/official/random{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room/external) -"eoH" = ( -/obj/machinery/light/small, -/obj/machinery/camera{ - c_tag = "Atmospherics - Breakroom"; - dir = 1; - network = list("ss13","Atmospherics") - }, -/obj/effect/turf_decal/tile/yellow, -/obj/item/radio/intercom{ - pixel_y = -25 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"eqa" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/turf/open/space/basic, -/area/space/nearstation) -"eqn" = ( -/obj/machinery/suit_storage_unit/hos, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"esb" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/door/window/northleft{ - name = "AI Access"; - req_access_txt = "16" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"esp" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"esN" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/radio/intercom{ - pixel_x = -30 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"esU" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/closet/secure_closet/freezer/fridge, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"etl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"etL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room/external) -"euD" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"euN" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/item/clothing/glasses/meson, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"exX" = ( -/obj/machinery/power/apc{ - areastring = "/area/medical/storage"; - dir = 8; - name = "Medical Storage APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/department/medical) -"eyM" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/machinery/camera/autoname{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"ezo" = ( -/obj/item/radio/intercom{ - pixel_x = -30 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"eCj" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/item/soap, -/obj/item/bikehorn/rubberducky, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"eCr" = ( -/obj/machinery/camera/autoname{ - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"eFB" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"eKx" = ( -/obj/machinery/smartfridge/drinks, -/turf/closed/wall, -/area/crew_quarters/bar) -"eLr" = ( -/obj/machinery/button/door{ - id = "podescape"; - name = "Pod Bay Control"; - normaldoorcontrol = 0; - pixel_x = -8; - pixel_y = 24 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"eMz" = ( -/obj/machinery/chem_master/condimaster{ - desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; - name = "HoochMaster Deluxe"; - pixel_x = -4 - }, -/obj/item/radio/intercom{ - pixel_x = -30 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"eNp" = ( -/obj/machinery/power/apc{ - areastring = "/area/chapel/main"; - dir = 8; - name = "Chapel Main APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"eNw" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"eQp" = ( -/obj/machinery/smartfridge/food, -/turf/closed/wall, -/area/crew_quarters/kitchen) -"eQq" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/radio/intercom{ - pixel_y = 29 - }, -/obj/machinery/computer/aifixer{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Research - Research Director's Office"; - dir = 2; - network = list("ss13","Research") - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) -"eRe" = ( -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plasteel, -/area/engine/engineering) -"eRs" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 8; - name = "scrubbers pipe" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"eSa" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - areastring = "/area/quartermaster/office"; - dir = 8; - name = "Cargo Main APC"; - pixel_x = -24 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"eVJ" = ( -/obj/structure/closet/radiation, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/camera/autoname{ - dir = 8 - }, -/obj/structure/sign/poster/official/random{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room/external) -"eXR" = ( -/obj/structure/closet/secure_closet/hop, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Bridge - Head of Personnel's Private Quarters"; - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hop) -"eZi" = ( -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/power/apc{ - areastring = "/area/security/warden"; - dir = 1; - name = "Warden's Office APC"; - pixel_y = 24 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"fdn" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/engine/engineering) -"fdM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"feg" = ( -/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/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/command/glass{ - name = "Chief Engineer"; - req_access_txt = "56"; - security_level = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/crew_quarters/heads/chief) -"feu" = ( -/obj/machinery/door/airlock/hatch{ - name = "Supermatter External Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/turf_decal/delivery, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"fid" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"fis" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"fiC" = ( -/obj/machinery/computer/teleporter, -/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{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/dark, -/area/teleporter) -"fkV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"fpA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 9 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"fqe" = ( -/obj/structure/closet/secure_closet/medical3, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/white, -/area/medical/storage) -"fvY" = ( -/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 = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"fxC" = ( -/obj/machinery/airalarm{ - pixel_y = 28 - }, -/turf/open/floor/plasteel/white/side{ - dir = 10 - }, -/area/science/research) -"fzs" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/obj/structure/closet/secure_closet/freezer/meat, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"fzV" = ( -/obj/machinery/button/door{ - desc = "A remote control-switch for the engineering security doors."; - id = "Engineering"; - name = "Engineering Lockdown"; - pixel_x = 24; - pixel_y = -5; - req_access_txt = "10" - }, -/obj/machinery/button/door{ - dir = 2; - id = "supermatter_external"; - name = "Supermatter External Lockdown"; - pixel_x = 36; - pixel_y = 5; - req_access_txt = "24" - }, -/obj/machinery/light{ - 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/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/button/door{ - dir = 2; - id = "atmos"; - name = "Atmospherics Lockdown"; - pixel_x = 24; - pixel_y = 5; - req_access_txt = "24" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/chief) -"fAP" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/camera/autoname, -/turf/open/floor/engine, -/area/engine/supermatter) -"fBk" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "researchprivate"; - name = "research privacy shutters" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/southleft{ - dir = 8; - name = "Research Lab Desk"; - req_one_access_txt = "7;29" - }, -/obj/machinery/autolathe, -/turf/open/floor/plasteel, -/area/science/lab) -"fED" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"fKt" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"fMr" = ( -/obj/item/radio/intercom{ - pixel_y = -25 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"fNR" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/power/apc{ - areastring = "/area/library/lounge"; - dir = 2; - name = "Lounge APC"; - pixel_y = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"fOk" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"fSj" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/item/radio/intercom{ - pixel_x = -30 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"fVo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/engine/atmos) -"fVB" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"fWk" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engine_room/external) -"gbC" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Cooling Loop to Gas" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"gdD" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"gqB" = ( -/obj/structure/table/glass, -/obj/item/storage/box/rxglasses, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/storage/box/disks{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/machinery/requests_console{ - department = "Genetics"; - departmentType = 0; - name = "Genetics Requests Console"; - pixel_x = -30 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"grn" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/requests_console{ - department = "Security"; - departmentType = 5; - pixel_x = -30 - }, -/turf/open/floor/plasteel, -/area/security/main) -"gst" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall, -/area/crew_quarters/fitness/locker_room) -"gsu" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/quartermaster/warehouse"; - dir = 1; - name = "Cargo Warehouse APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/starboard) -"gwx" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"gxl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"gBb" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/power/apc{ - areastring = "/area/security/checkpoint/science"; - dir = 2; - name = "Science Checkpoint APC"; - pixel_y = -24 - }, -/obj/structure/cable/yellow, -/turf/open/floor/plasteel, -/area/security/checkpoint/science) -"gDW" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/space/basic, -/area/space/nearstation) -"gEO" = ( -/obj/item/radio/intercom{ - pixel_x = 29 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"gFA" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engine_room) -"gGG" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"gJo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/janitor) -"gNl" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Output Toggle" - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/sign/warning/fire{ - pixel_y = 32 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"gPD" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"gVB" = ( -/obj/machinery/computer/med_data, -/obj/machinery/power/apc{ - areastring = "/area/medical/sleeper"; - dir = 1; - name = "Sleepers APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) -"gVW" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/item/radio/intercom, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"gWa" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"hdH" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"hez" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"hfx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"hhd" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/power/apc{ - areastring = "/area/bridge"; - dir = 8; - name = "Bridge APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"hjz" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/dorms"; - dir = 2; - name = "Sleeping Quarters APC"; - pixel_y = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"hjJ" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/hallway/secondary/exit/departure_lounge"; - dir = 1; - name = "Departures APC"; - pixel_y = 24 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"hlK" = ( -/obj/structure/closet/secure_closet/detective, -/obj/item/camera_film, -/obj/item/camera_film, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/carpet, -/area/security/detectives_office) -"hmG" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/camera/autoname{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"hmV" = ( -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/camera/autoname, -/turf/open/floor/circuit/green, -/area/engine/supermatter) -"hnd" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Unisex Showers" - }, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"hpm" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/item/radio/intercom{ - pixel_x = -29 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"hpU" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"hrD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/holopad, -/turf/open/floor/plasteel, -/area/engine/engineering) -"htS" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = 28 - }, -/turf/open/floor/plasteel/dark, -/area/science/lab) -"hvP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"hAk" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Input Toggle" - }, -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/obj/structure/sign/warning/fire{ - pixel_y = 32 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"hAI" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"hDU" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/security/main) -"hGn" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/door/firedoor, -/obj/structure/sign/directions/evac{ - dir = 8; - pixel_x = 32; - pixel_y = 8 - }, -/obj/structure/sign/directions/engineering{ - pixel_x = 32 - }, -/obj/structure/sign/directions/medical{ - pixel_x = 32; - pixel_y = -8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"hKj" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"hLz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/item/stack/sheet/mineral/copper{ - amount = 5 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"hLL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room/external) -"hNP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 4; - name = "sorting disposal pipe (Atmospherics)"; - sortType = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"hOQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"hRG" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) -"hSe" = ( -/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/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/chief) -"hTm" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"hTF" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"hTU" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"hVt" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"hXd" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "External Airlock"; - req_access_txt = "13" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) -"hYj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/kitchen/coldroom"; - dir = 1; - name = "Kitchen APC"; - pixel_y = 24 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"hYI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"hYL" = ( -/obj/machinery/power/apc{ - areastring = "/area/ai_monitored/turret_protected/ai_upload"; - dir = 2; - name = "AI Upload APC"; - pixel_y = -24 - }, -/obj/structure/cable/yellow, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai_upload) -"hZC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room/external) -"ibF" = ( -/obj/machinery/power/apc{ - areastring = "/area/lawoffice"; - dir = 2; - name = "Lawyer's Office APC"; - pixel_y = -24 - }, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"icc" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"ice" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"ifH" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ifP" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"iif" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/clothing/head/welding, -/obj/item/stack/sheet/mineral/plasma{ - amount = 35 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/service) -"iiw" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"ijH" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_x = 30 - }, -/turf/open/floor/plasteel/white, -/area/science/robotics/lab) -"ili" = ( -/obj/machinery/light, -/obj/item/radio/intercom{ - dir = 2; - pixel_y = -28 - }, -/turf/open/floor/plasteel/white/side{ - dir = 5 - }, -/area/science/research) -"ipB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"itU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/obj/item/radio/intercom{ - pixel_y = -25 - }, -/turf/open/floor/plasteel, -/area/janitor) -"ixd" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space/basic, -/area/space/nearstation) -"iCB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/chair/stool, -/obj/machinery/light/small, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"iGD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/closed/wall/r_wall, -/area/engine/engine_room) -"iGJ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"iHp" = ( -/obj/structure/grille/broken, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"iHE" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/glass/beaker/cryoxadone{ - pixel_x = 7; - pixel_y = 1 - }, -/obj/item/reagent_containers/glass/beaker/cryoxadone{ - pixel_x = 7; - pixel_y = 1 - }, -/obj/item/radio/intercom{ - pixel_y = 29 - }, -/turf/open/floor/plasteel, -/area/medical/cryo) -"iIq" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"iJC" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"iMs" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"iNo" = ( -/obj/machinery/power/apc{ - areastring = "/area/security/detectives_office"; - dir = 1; - name = "Detective's Office APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/carpet, -/area/security/detectives_office) -"iRE" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"iUF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"iUZ" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/space/basic, -/area/space/nearstation) -"iXv" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sign/poster/official/random{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"jdu" = ( -/obj/structure/closet/radiation, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room/external) -"jip" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"jlL" = ( -/obj/item/reagent_containers/spray/plantbgone{ - pixel_y = 3 - }, -/obj/item/reagent_containers/spray/plantbgone{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/reagent_containers/spray/plantbgone{ - pixel_x = 13; - pixel_y = 5 - }, -/obj/item/watertank, -/obj/item/grenade/chem_grenade/antiweed, -/obj/structure/table/glass, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"jpL" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/item/storage/toolbox/emergency, -/obj/item/storage/toolbox/emergency{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/bridge) -"jqp" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"jro" = ( -/obj/structure/closet/secure_closet/personal, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"jsm" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) -"jsv" = ( -/obj/machinery/light, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"jvP" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"jws" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"jxP" = ( -/obj/machinery/power/supermatter_crystal/engine, -/turf/open/floor/engine, -/area/engine/supermatter) -"jzE" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/sign/directions/command{ - dir = 4; - pixel_y = 34 - }, -/obj/structure/sign/directions/security{ - dir = 4; - pixel_y = 26 - }, -/obj/structure/sign/directions/supply{ - dir = 1; - pixel_y = 42 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"jAc" = ( -/obj/machinery/announcement_system, -/obj/machinery/power/apc{ - areastring = "/area/tcommsat/computer"; - dir = 8; - name = "Telecomms Lounge APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) -"jGy" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"jHY" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"jJz" = ( -/obj/machinery/photocopier, -/obj/item/radio/intercom{ - pixel_y = -24 - }, -/turf/open/floor/wood, -/area/library) -"jLo" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"jQo" = ( -/obj/structure/table/reinforced, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_x = 5 - }, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/glasses/meson/engine, -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/sign/warning/electricshock{ - pixel_y = -32 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"jSs" = ( -/obj/structure/reflector/double, -/turf/open/floor/plating, -/area/engine/engine_room) -"jVA" = ( -/obj/structure/closet/secure_closet/engineering_welding, -/turf/open/floor/plasteel, -/area/engine/engineering) -"jVL" = ( -/obj/machinery/camera{ - c_tag = "Engine -External Midleft"; - dir = 8; - network = list("ss13","Engineering","Engine") - }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"jZv" = ( -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel, -/area/engine/engineering) -"kaB" = ( -/obj/machinery/power/apc{ - areastring = "/area/ai_monitored/storage/eva"; - dir = 1; - name = "EVA APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"kcd" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"kcl" = ( -/obj/machinery/power/apc{ - areastring = "/area/medical/chemistry"; - dir = 8; - name = "Chemistry APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"kfj" = ( -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/chapel{ - dir = 4 - }, -/area/chapel/main) -"klG" = ( -/obj/machinery/power/apc{ - areastring = "/area/hydroponics"; - dir = 1; - name = "Hydroponics APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"kmI" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"knv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"kuZ" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, -/obj/machinery/camera/autoname{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/button/door{ - id = "engsm"; - name = "Radiation Shutters Control"; - pixel_y = 24; - req_access_txt = "10" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"kvC" = ( -/obj/machinery/computer/bank_machine, -/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/turf_decal/tile/neutral, -/obj/effect/turf_decal/bot_white, -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/power/apc{ - areastring = "/area/ai_monitored/nuke_storage"; - dir = 1; - name = "Vault APC"; - pixel_y = 24 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"kyS" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/power/apc{ - areastring = "/area/medical/medbay/lobby"; - dir = 2; - name = "Medical Lobby APC"; - pixel_y = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/maintenance/department/medical) -"kAG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/crew_quarters/heads/chief) -"kAU" = ( -/obj/machinery/power/emitter/anchored{ - dir = 8; - state = 2 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/camera{ - c_tag = "Engine -Emitters Right"; - dir = 8; - network = list("ss13","Engineering","Engine") - }, -/turf/open/floor/plating, -/area/engine/engine_room) -"kBb" = ( -/obj/machinery/power/apc{ - areastring = "/area/maintenance/port/fore"; - dir = 1; - name = "Port Fore Maintenance APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"kDh" = ( -/obj/machinery/suit_storage_unit/security, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/power/apc{ - areastring = "/area/ai_monitored/security/armory"; - dir = 8; - name = "Armory APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"kLE" = ( -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/fitness/locker_room"; - dir = 4; - name = "Unisex Locker Room APC"; - pixel_x = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"kMb" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engine_room/external) -"kTN" = ( -/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/structure/noticeboard{ - dir = 8; - pixel_x = 27 - }, -/obj/item/paper/monitorkey, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/heads/chief"; - dir = 2; - name = "CE Office APC"; - pixel_y = -24 - }, -/obj/structure/cable/yellow, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/chief) -"kVx" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"kXJ" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_x = 30 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"lbD" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "researchprivate"; - name = "research privacy shutters" - }, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/southleft{ - dir = 8; - name = "Research Lab Desk"; - req_one_access_txt = "7;29" - }, -/turf/open/floor/plasteel, -/area/science/lab) -"leE" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"leR" = ( -/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/structure/filingcabinet/chestdrawer, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/chief) -"lhs" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, -/obj/machinery/camera/autoname{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"liH" = ( -/obj/machinery/ntnet_relay, -/obj/machinery/power/apc{ - areastring = "/area/tcommsat/server"; - dir = 2; - name = "Telecomms Servers APC"; - pixel_y = -24 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/tcommsat/server) -"ljF" = ( -/obj/machinery/shower{ - dir = 1 - }, -/obj/structure/curtain, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"ltw" = ( -/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, -/obj/item/radio/intercom{ - dir = 2; - pixel_y = -28 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"lwp" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"lxq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"lyr" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/fore) -"lzi" = ( -/obj/structure/rack, -/obj/item/storage/bag/plants/portaseeder, -/obj/item/plant_analyzer, -/obj/item/plant_analyzer{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/turf/open/floor/grass, -/area/hydroponics/garden) -"lzq" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/machinery/light/small, -/turf/open/floor/engine, -/area/engine/engine_room/external) -"lEt" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"lEx" = ( -/obj/machinery/chem_master/condimaster, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"lEO" = ( -/obj/structure/cable/yellow{ - 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) -"lFs" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) -"lFx" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/heads/hos"; - dir = 4; - name = "Head of Security's Office APC"; - pixel_x = 24 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hos) -"lKe" = ( -/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/disposal/bin, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/chief) -"lKk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"lLE" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"lND" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/camera/autoname{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) -"lOW" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/turf/open/space/basic, -/area/space/nearstation) -"maC" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"mbB" = ( -/obj/structure/table, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"mgs" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"mhi" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/space/basic, -/area/space/nearstation) -"miv" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"mjA" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/turf/open/floor/engine, -/area/engine/engine_room/external) -"mjC" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/shower{ - pixel_y = 24 - }, -/obj/structure/curtain, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"mlN" = ( -/obj/structure/closet/secure_closet/freezer/cream_pie, -/obj/item/radio/intercom{ - pixel_x = -30 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"mnC" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/theatre"; - dir = 2; - name = "Theatre APC"; - pixel_y = -24 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"moJ" = ( -/obj/structure/rack, -/obj/item/storage/belt/utility, -/obj/item/wrench, -/obj/item/weldingtool, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 - }, -/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/structure/sign/poster/official/random{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"moO" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access_txt = "10" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "Engineering"; - name = "Engineering Lockdown" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel, -/area/engine/engineering) -"mpx" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"mpC" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"mtv" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/maintenance/starboard"; - dir = 1; - name = "Starboard Maintenance APC"; - pixel_y = 24 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"mwg" = ( -/obj/structure/table, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/obj/item/stack/rods/fifty, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_x = 29 - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"myk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - areastring = "/area/gateway"; - dir = 2; - name = "Gateway APC"; - pixel_y = -24 - }, -/turf/open/floor/plasteel, -/area/gateway) -"mBI" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/turf/open/space/basic, -/area/space/nearstation) -"mFO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"mFQ" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"mGm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/engine/engineering) -"mHo" = ( -/obj/machinery/power/emitter/anchored{ - dir = 8; - state = 2 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/engine/engine_room) -"mHD" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"mHS" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/camera{ - c_tag = "Security - Main Hall 2"; - dir = 8; - network = list("ss13","Security") - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"mJV" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"mKc" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom{ - pixel_x = 30 - }, -/turf/open/floor/plasteel, -/area/vacant_room/commissary) -"mLl" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"mNo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"mNC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"mSf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/radio/intercom{ - pixel_x = 30 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"mUn" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plasteel, -/area/engine/engineering) -"mUy" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"mVy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/item/clothing/head/cone, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"mXC" = ( -/obj/structure/rack, -/obj/item/storage/box/lights/mixed, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/item/twohanded/rcl/pre_loaded, -/obj/item/twohanded/rcl/pre_loaded, -/obj/item/crowbar/large, -/turf/open/floor/plasteel, -/area/engine/engineering) -"mXO" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"mXY" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"naE" = ( -/obj/machinery/power/apc{ - areastring = "/area/security/brig"; - dir = 2; - name = "Brig APC"; - pixel_y = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"naO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/engine/engineering) -"nbA" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"njx" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 28 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"nkG" = ( -/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/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/item/radio/intercom{ - dir = 2; - pixel_y = -28 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"nlD" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"nnE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"nrD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"nsr" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"ntE" = ( -/obj/item/radio/intercom{ - pixel_x = 29 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"nuq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"nvs" = ( -/obj/structure/reagent_dispensers/beerkeg, -/obj/structure/light_construct/small{ - dir = 1 - }, -/obj/machinery/power/apc{ - areastring = "/area/maintenance/department/crew_quarters/bar"; - cell_type = null; - dir = 1; - name = "Abandoned Bar APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/crew_quarters/bar) -"nwZ" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/machinery/power/apc{ - areastring = "/area/medical/cryo"; - dir = 1; - name = "Cryogenics APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel, -/area/medical/cryo) -"nyj" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) -"nyl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_x = -29 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) -"nyx" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"nyL" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/fore) -"nBZ" = ( -/obj/machinery/power/rad_collector/anchored, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/circuit/green, -/area/engine/supermatter) -"nCF" = ( -/obj/machinery/light, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - 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/camera{ - c_tag = "Hallway - Escape Right Wing 1"; - dir = 1; - network = list("ss13") - }, -/obj/item/radio/intercom{ - dir = 2; - pixel_y = -28 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"nDW" = ( -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/chapel{ - dir = 8 - }, -/area/chapel/main) -"nEo" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"nEL" = ( -/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/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/chief) -"nIf" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"nLJ" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"nNJ" = ( -/turf/open/floor/engine, -/area/engine/supermatter) -"nOy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"nPi" = ( -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/fitness"; - dir = 8; - name = "Fitness APC"; - pixel_x = -24 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"nPz" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/analyzer, -/obj/item/analyzer, -/obj/item/analyzer, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"nRb" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 1 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"nUo" = ( -/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/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel, -/area/engine/engineering) -"nVf" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance/two, -/obj/machinery/power/apc{ - areastring = "/area/maintenance/department/engine"; - dir = 4; - name = "Engineering Maintenance APC"; - pixel_x = 24 - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) -"nZS" = ( -/obj/structure/table/wood, -/obj/item/radio/intercom{ - pixel_x = -30 - }, -/turf/open/floor/carpet, -/area/library/lounge) -"oak" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/engine/engineering) -"odJ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"oee" = ( -/obj/item/radio/intercom{ - pixel_x = -29 - }, -/turf/open/floor/plating, -/area/storage/tech) -"ofx" = ( -/obj/structure/plasticflaps/opaque, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - dir = 1; - freq = 1400; - location = "Engineering"; - name = "navigation beacon (Engineering Delivery)" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engineering) -"ohU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"oij" = ( -/obj/effect/turf_decal/stripes/line, -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"okf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"oms" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"omI" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"ooZ" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Laser Room"; - req_access_txt = "10" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/engine, -/area/engine/engine_room) -"opl" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) -"oqE" = ( -/obj/structure/girder, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"oqF" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"osG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/machinery/camera/autoname{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"oAn" = ( -/obj/item/reagent_containers/food/snacks/salad/validsalad, -/turf/open/floor/plating, -/area/engine/engine_room) -"oAP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Mix to Gas" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"oBN" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/holopad, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"oBZ" = ( -/obj/machinery/computer/bounty, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/heads/hop"; - dir = 1; - name = "Head of Personnel's Office APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"oCw" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engine_room/external) -"oDl" = ( -/obj/machinery/door/window/westright, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engine_room/external) -"oDI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"oGu" = ( -/obj/machinery/power/apc{ - areastring = "/area/ai_monitored/turret_protected/aisat/service"; - dir = 8; - name = "MiniSat Service APC"; - pixel_x = -24 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/service) -"oHN" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"oIG" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"oKN" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/security/processing"; - dir = 1; - name = "Labor Processing APC"; - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"oMf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Atmos to Loop" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"oMw" = ( -/obj/machinery/camera{ - c_tag = "Research - Toxins Main 2"; - dir = 2; - network = list("ss13","Research") - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/item/radio/intercom{ - pixel_y = 29 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"oNF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"oPe" = ( -/turf/closed/wall/r_wall, -/area/lawoffice) -"oRe" = ( -/obj/machinery/airalarm{ - pixel_y = 28 - }, -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/research) -"oVd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room/external) -"oVG" = ( -/obj/machinery/power/apc/highcap/five_k{ - areastring = "/area/ai_monitored/turret_protected/ai"; - dir = 2; - name = "AI Chamber APC"; - pixel_y = -24 - }, -/obj/machinery/flasher{ - id = "AI"; - pixel_x = -11; - pixel_y = -24 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/door/window/eastleft{ - name = "AI Access"; - req_access_txt = "16" - }, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"oVP" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/sign/poster/official/random{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"oWa" = ( -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/closet/secure_closet/engineering_personal, -/turf/open/floor/plasteel, -/area/engine/engineering) -"oWU" = ( -/obj/machinery/power/apc{ - areastring = "/area/medical/surgery"; - dir = 1; - name = "Surgery APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"pgT" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "External Gas to Loop" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"piG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"pkz" = ( -/obj/machinery/power/apc{ - areastring = "/area/library"; - dir = 8; - name = "Library APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/turf/open/floor/plating, -/area/maintenance/fore) -"plI" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"pmp" = ( -/obj/machinery/computer/security{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/newscaster{ - pixel_x = -30 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"pmD" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"poI" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"ppV" = ( -/turf/closed/wall/r_wall, -/area/hydroponics) -"psF" = ( -/obj/structure/closet/radiation, -/obj/machinery/power/apc{ - areastring = "/area/engine/engine_room/external"; - dir = 8; - name = "Supermatter External Access"; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room/external) -"ptm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"pwb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"pwu" = ( -/obj/machinery/power/apc{ - areastring = "/area/science/explab"; - dir = 1; - name = "Experimentation APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"pxQ" = ( -/obj/item/clothing/head/cone, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"pyl" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"pBI" = ( -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"pGQ" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"pGU" = ( -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"pHi" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"pLI" = ( -/obj/machinery/power/emitter/anchored{ - dir = 4; - state = 2 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/engine/engine_room) -"pMU" = ( -/obj/machinery/power/apc{ - areastring = "/area/storage/tools"; - dir = 1; - name = "Aux Tool Storage APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"pNR" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - areastring = "/area/security/courtroom"; - dir = 8; - name = "Courtroom APC"; - pixel_x = -24 - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/maintenance/department/security) -"pSa" = ( -/obj/machinery/camera{ - c_tag = "Secure - EVA"; - dir = 8; - network = list("ss13","Secure") - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"pSm" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"pTq" = ( -/obj/machinery/power/apc{ - areastring = "/area/medical/medbay/central"; - dir = 1; - name = "Medical Main APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"pWc" = ( -/obj/machinery/camera/motion{ - c_tag = "Secure - Captain's Office External"; - dir = 4; - network = list("AISat") - }, -/turf/open/space/basic, -/area/space/nearstation) -"pYp" = ( -/obj/structure/table, -/obj/machinery/power/apc{ - areastring = "/area/medical/genetics/cloning"; - dir = 2; - name = "Cloning Bay APC"; - pixel_y = -24 - }, -/obj/structure/cable/yellow, -/obj/item/toy/figure/geneticist, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"qag" = ( -/obj/machinery/power/rad_collector/anchored, -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/circuit/green, -/area/engine/supermatter) -"qkE" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical, -/obj/item/flashlight, -/obj/item/pipe_dispenser, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Engine - SMES"; - dir = 8; - network = list("ss13","Engineering","Engine") - }, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"qlL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"qoF" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"qpi" = ( -/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/neutral, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/item/radio/intercom{ - dir = 2; - pixel_y = -28 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"qpo" = ( -/obj/structure/table/glass, -/obj/machinery/power/apc{ - areastring = "/area/medical/virology"; - dir = 2; - name = "Virology APC"; - pixel_y = -24 - }, -/obj/structure/cable/yellow, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/item/pen/red, -/obj/machinery/doorButtons/airlock_controller{ - idExterior = "virology_airlock_exterior"; - idInterior = "virology_airlock_interior"; - idSelf = "virology_airlock_control"; - name = "Virology Access Console"; - pixel_x = 22; - pixel_y = 8; - req_access_txt = "39" - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"qqo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) -"qrk" = ( -/obj/machinery/smartfridge/chemistry/virology/preloaded, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"qxz" = ( -/obj/effect/turf_decal/stripes/line, -/obj/item/twohanded/required/kirbyplants/random, -/obj/machinery/button/door{ - dir = 2; - id = "supermatter_external"; - name = "Supermatter External Lockdown"; - pixel_x = 5; - pixel_y = -24; - req_access_txt = "24" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"qxF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"qxZ" = ( -/obj/structure/sign/warning/pods{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/white/side{ - dir = 10 - }, -/area/science/research) -"qyl" = ( -/obj/machinery/atmospherics/pipe/manifold4w/dark/visible, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"qBm" = ( -/obj/structure/table, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/stack/cable_coil, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"qBt" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = -28 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"qCl" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/power/apc{ - areastring = "/area/maintenance/department/medical"; - dir = 2; - name = "Medical Maintenance APC"; - pixel_y = -24 - }, -/turf/open/floor/plating, -/area/maintenance/department/medical) -"qDQ" = ( -/obj/machinery/camera/autoname, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"qHu" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/radio/intercom{ - dir = 2; - pixel_y = -28 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"qIb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/airlock{ - name = "Unisex Showers" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"qKO" = ( -/obj/structure/grille, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"qLM" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"qMo" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/power/apc{ - areastring = "/area/engine/engineering"; - dir = 1; - name = "Engineering APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"qOX" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 10 - }, -/obj/machinery/holopad, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"qWm" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat/foyer) -"qXl" = ( -/turf/closed/wall/r_wall, -/area/maintenance/department/engine) -"qYj" = ( -/obj/machinery/power/apc{ - areastring = "/area/chapel/office"; - dir = 8; - name = "Chapel Office APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/maintenance/starboard) -"qYJ" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"qZu" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"rck" = ( -/obj/machinery/power/apc{ - areastring = "/area/maintenance/port/aft"; - dir = 1; - name = "Port Aft Maintenance APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"rcn" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) -"rfC" = ( -/obj/structure/lattice, -/obj/machinery/camera/motion{ - c_tag = "Secure - Captain's Private Quarters External"; - dir = 4; - network = list("AISat") - }, -/turf/open/space/basic, -/area/space/nearstation) -"ria" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"rmC" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"rta" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ruT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel, -/area/engine/engineering) -"rwy" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"rBV" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"rDp" = ( -/obj/machinery/power/apc/highcap/ten_k{ - areastring = "/area/engine/atmos"; - dir = 8; - name = "Atmospherics APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"rDY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"rFm" = ( -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/circuit/green, -/area/engine/supermatter) -"rFt" = ( -/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/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/chief) -"rJs" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Gas to Filter" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"rLt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"rPx" = ( -/obj/structure/lattice, -/obj/machinery/camera/autoname{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) -"rQg" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"rQo" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/light/small, -/turf/open/floor/engine, -/area/engine/engine_room/external) -"rSs" = ( -/obj/machinery/computer/monitor, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/service) -"rUR" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"rVP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/item/radio/intercom{ - pixel_x = 29 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) -"rYP" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) -"seG" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"seX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"sfa" = ( -/obj/machinery/button/door{ - desc = "A remote control-switch for secure storage."; - id = "Secure Storage"; - name = "Engineering Secure Storage"; - pixel_x = 24; - pixel_y = 5; - req_access_txt = "11" - }, -/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/yellow{ - icon_state = "1-2" - }, -/obj/machinery/camera/autoname{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/chief) -"sfL" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/dark, -/area/science/server) -"sjB" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"skk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"skl" = ( -/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/supermatter) -"skG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"slb" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/camera/autoname{ - dir = 10 - }, -/turf/open/space/basic, -/area/space/nearstation) -"smc" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"snW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/chair/stool, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"son" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"sos" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) -"soJ" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"spN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engine_room) -"sqt" = ( -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/power/apc{ - areastring = "/area/hallway/primary/central"; - dir = 1; - name = "Central Hallway Maintenance APC"; - pixel_y = 24 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"srD" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"stN" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"sxr" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/rods/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/item/stock_parts/cell/high/plus, -/obj/item/stack/sheet/mineral/plasma{ - amount = 30 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"sxJ" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/turf/open/space/basic, -/area/space/nearstation) -"szx" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"szT" = ( -/obj/machinery/door/airlock/hatch{ - name = "Supermatter External Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/poddoor/preopen{ - id = "supermatter_external"; - name = "Supermatter External Blast Door" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"sCI" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/closet/athletic_mixed, -/obj/item/radio/intercom{ - pixel_y = 29 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"sEf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"sEr" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/external{ - name = "External Airlock"; - req_access_txt = "13" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) -"sEU" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/visible, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engine_room) -"sHj" = ( -/obj/item/radio/intercom{ - pixel_x = 29 - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/research) -"sKR" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"sLW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/holopad, -/turf/open/floor/plasteel, -/area/engine/engineering) -"sMe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"sPB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_x = -29 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"sTB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/maintenance/aft"; - dir = 1; - name = "Aft Maintenance APC"; - pixel_y = 24 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"sXg" = ( -/obj/structure/chair, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) -"sYx" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"sZm" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/sign/poster/official/random{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"tcB" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/crew_quarters/heads/chief) -"tdw" = ( -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/heads/cmo"; - dir = 8; - name = "CMO's Office APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"tfI" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"tlY" = ( -/obj/machinery/status_display/evac, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"tnz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sign/poster/official/random{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"tok" = ( -/obj/machinery/vending/wardrobe/jani_wardrobe, -/obj/machinery/light_switch{ - pixel_x = -8; - pixel_y = 28 - }, -/turf/open/floor/plasteel, -/area/janitor) -"tpd" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/engine/engineering) -"tqi" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{ - dir = 4 - }, -/turf/open/space/basic, -/area/engine/engine_room) -"tsa" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Engine - Freezer Ports"; - dir = 4; - network = list("ss13","Engineering","Engine") - }, -/obj/structure/sign/warning/nosmoking{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"tus" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/reflector/double, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"tuR" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"tzv" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/radio/intercom{ - pixel_x = 29 - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"tzD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/item/radio/intercom{ - dir = 2; - pixel_y = -28 - }, -/turf/open/floor/wood, -/area/library) -"tBY" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"tFw" = ( -/obj/effect/turf_decal/tile/red, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"tHJ" = ( -/turf/closed/wall/r_wall, -/area/engine/engine_room/external) -"tKA" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"tOh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/freezer, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"tQN" = ( -/obj/machinery/shower{ - dir = 1 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/curtain, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"tTb" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"tVl" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"uaG" = ( -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/wood, -/area/library) -"ubS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"udR" = ( -/obj/structure/sign/warning/enginesafety{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"ueA" = ( -/obj/machinery/light, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - 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/camera{ - c_tag = "Hallway - Escape Left Wing 1"; - dir = 1; - network = list("ss13") - }, -/obj/item/radio/intercom{ - dir = 2; - pixel_y = -28 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"ueN" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"ufN" = ( -/obj/machinery/photocopier, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/turf/open/floor/wood, -/area/lawoffice) -"ugj" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/camera{ - c_tag = "Engine -External Topleft"; - dir = 8; - network = list("ss13","Engineering","Engine") - }, -/turf/open/space/basic, -/area/space/nearstation) -"ugT" = ( -/obj/structure/closet/radiation, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"uiU" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/camera{ - c_tag = "Engine -External Bottomleft"; - dir = 8; - network = list("ss13","Engineering","Engine") - }, -/turf/open/space/basic, -/area/space/nearstation) -"unF" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/lootdrop/crate_spawner, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"uoF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"upM" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"uqn" = ( -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"utg" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"utL" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/construction/mining/aux_base"; - dir = 4; - name = "Aux Base APC"; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/construction/mining/aux_base) -"uva" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/obj/machinery/airalarm{ - pixel_y = 28 - }, -/turf/open/floor/plasteel, -/area/science/storage) -"uwG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/item/radio/intercom{ - pixel_x = 30 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"uwV" = ( -/turf/closed/wall/r_wall, -/area/engine/engine_room) -"uzp" = ( -/obj/machinery/power/apc{ - areastring = "/area/ai_monitored/turret_protected/aisat/foyer"; - dir = 4; - name = "MiniSat Main APC"; - pixel_x = 24 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"uzG" = ( -/obj/machinery/power/apc{ - areastring = "/area/science/research"; - dir = 2; - name = "Science Main APC"; - pixel_y = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"uzT" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"uIo" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/shower{ - pixel_y = 24 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/curtain, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"uIu" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"uQL" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"uRy" = ( -/obj/machinery/power/apc{ - areastring = "/area/quartermaster/miningdock"; - dir = 1; - name = "Mining Dock APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"uTy" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/engine/atmos) -"uUp" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engine_room/external) -"uXm" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sign/warning/nosmoking{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"uYg" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_y = 32 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/machinery/suit_storage_unit/engine, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room/external) -"vbr" = ( -/obj/machinery/power/emitter/anchored{ - dir = 4; - state = 2 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/camera{ - c_tag = "Engine - Emitters Left"; - dir = 4; - network = list("ss13","Engineering","Engine") - }, -/turf/open/floor/plating, -/area/engine/engine_room) -"vch" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/machinery/light_switch{ - pixel_x = -24; - pixel_y = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"vcT" = ( -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/bar"; - dir = 1; - name = "Bar APC"; - pixel_y = 24 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"vdQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"vgy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"viK" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"vjd" = ( -/obj/structure/rack, -/obj/item/gun/energy/ionrifle, -/obj/item/gun/energy/temperature/security, -/obj/item/clothing/suit/armor/laserproof, -/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/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) -"vjt" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"vjX" = ( -/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/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass/fifty, -/turf/open/floor/plasteel, -/area/engine/engineering) -"vmc" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"vmg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"voh" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"vpa" = ( -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/meter, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"vqS" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain/private) -"vtD" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"vvH" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engine_room/external) -"vxP" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"vyZ" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/space/basic, -/area/space/nearstation) -"vzQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel, -/area/engine/engineering) -"vAj" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"vAo" = ( -/obj/machinery/power/emitter{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engine_room) -"vBp" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"vBQ" = ( -/obj/machinery/power/apc/highcap/ten_k{ - areastring = "/area/janitor"; - dir = 8; - name = "Custodial Closet APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plating, -/area/maintenance/aft) -"vFq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm" - }, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating, -/area/engine/supermatter) -"vHF" = ( -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai_upload) -"vIe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 10 - }, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"vLi" = ( -/obj/machinery/power/apc{ - areastring = "/area/maintenance/port"; - dir = 8; - name = "Port Maintenance APC"; - pixel_x = -24 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"vLE" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"vMB" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/sign/directions/evac{ - dir = 8; - pixel_x = -32; - pixel_y = 8 - }, -/obj/structure/sign/directions/supply{ - dir = 1; - pixel_x = -32 - }, -/obj/structure/sign/directions/security{ - pixel_x = -32; - pixel_y = -8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"vPT" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"vQd" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"vRP" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"vSP" = ( -/obj/structure/sign/warning/nosmoking/circle{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"vUd" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 2; - name = "Mix Bypass" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"vVH" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"vXg" = ( -/obj/machinery/dna_scannernew, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/light{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"waf" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"wia" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/closet/crate, -/obj/item/paicard, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"wkM" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/rack, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/item/storage/toolbox/mechanical, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/machinery/camera{ - c_tag = "Civilian - Tool Storage"; - dir = 4; - network = list("ss13") - }, -/obj/item/radio/intercom{ - pixel_x = -29 - }, -/turf/open/floor/plasteel, -/area/storage/tools) -"wlc" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"wll" = ( -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/machinery/light, -/obj/machinery/camera{ - c_tag = "Engineering - Tank Storage"; - dir = 1; - network = list("ss13","Engineering","Engine") - }, -/obj/structure/closet/secure_closet/engineering_personal, -/turf/open/floor/plasteel, -/area/engine/engineering) -"wmg" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 - }, -/turf/open/space/basic, -/area/space/nearstation) -"wod" = ( -/obj/structure/table, -/obj/item/toy/figure/borg, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"wok" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"wpG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable/yellow, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/crew_quarters/heads/chief) -"wrV" = ( -/obj/structure/kitchenspike, -/obj/item/radio/intercom{ - dir = 2; - pixel_y = -28 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"wtu" = ( -/obj/structure/bed, -/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/tile/neutral, -/obj/machinery/light_switch{ - pixel_x = -24 - }, -/obj/item/bedsheet/dorms, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"wvW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/table, -/obj/effect/holodeck_effect/cards, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"wwX" = ( -/obj/machinery/computer/cargo, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) -"wxZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - areastring = "/area/security/checkpoint"; - dir = 8; - name = "Docks Checkpoint APC"; - pixel_x = -24 - }, -/turf/open/floor/plasteel, -/area/security/checkpoint) -"wzU" = ( -/obj/machinery/atmospherics/pipe/manifold/green/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/airalarm/engine{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/engine/supermatter) -"wBW" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"wCc" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - areastring = "/area/security/prison"; - dir = 8; - name = "Prison APC"; - pixel_x = -24 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"wFi" = ( -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/heads/captain/private"; - dir = 1; - name = "Captain's Private Quarters APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain/private) -"wIl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/obj/structure/window/reinforced, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"wIF" = ( -/obj/machinery/recharge_station, -/obj/item/radio/intercom{ - pixel_x = -30 - }, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) -"wJv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera{ - c_tag = "Research - Toxins Storage"; - dir = 2; - network = list("ss13","Research") - }, -/obj/machinery/power/apc{ - areastring = "/area/science/storage"; - dir = 1; - name = "Toxins Storage APC"; - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/science/storage) -"wLO" = ( -/obj/machinery/power/apc{ - areastring = "/area/science/lab"; - dir = 1; - name = "Research Lab APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"wMf" = ( -/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/modular_computer/console/preset/engineering{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"wMM" = ( -/obj/machinery/stasis, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/medical/sleeper) -"wPr" = ( -/obj/machinery/power/apc{ - areastring = "/area/construction"; - cell_type = null; - dir = 8; - name = "Construction APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/construction) -"wQC" = ( -/obj/machinery/portable_atmospherics/pump, -/obj/structure/sign/poster/official/random{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"wTx" = ( -/obj/machinery/door/window/eastleft, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engine_room/external) -"wUt" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"wVQ" = ( -/obj/item/radio/intercom{ - pixel_x = 29 - }, -/turf/open/floor/plasteel/dark, -/area/tcommsat/computer) -"xaB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/valve/digital/on{ - dir = 4; - name = "Output Release" - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"xbA" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 - }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"xdQ" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"xec" = ( -/obj/structure/noticeboard{ - pixel_y = -32 - }, -/turf/open/floor/plasteel/white, -/area/science/lab) -"xhv" = ( -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"xhI" = ( -/turf/closed/wall, -/area/crew_quarters/kitchen/coldroom) -"xiu" = ( -/obj/machinery/shieldgen, -/turf/open/floor/plating, -/area/engine/engineering) -"xoZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/department/security) -"xrC" = ( -/obj/machinery/power/apc{ - areastring = "/area/solar/aft"; - dir = 8; - name = "Aft Solar APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/solar/aft) -"xtN" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"xve" = ( -/obj/machinery/power/apc{ - areastring = "/area/science/mixing"; - dir = 1; - name = "Toxins Mixing APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"xyz" = ( -/obj/machinery/atmospherics/pipe/manifold/dark/visible{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"xyU" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) -"xBI" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"xCE" = ( -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"xDp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/radio/intercom{ - pixel_x = -30 - }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) -"xGM" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/camera{ - c_tag = "Engineering - Main Airlock"; - dir = 2; - network = list("ss13","Engineering","Engine") - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"xKE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"xLk" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"xLt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/purple/hidden/layer1, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engine_room/external) -"xOq" = ( -/obj/structure/closet/secure_closet/personal, -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/fitness/locker_room) -"xRV" = ( -/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, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/chief) -"xUj" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"xWi" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"xWs" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"xXZ" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) -"ybh" = ( -/obj/structure/closet/radiation, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"ycZ" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/turf/open/space/basic, -/area/space/nearstation) -"ydf" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"yeA" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"yfz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) -"ygs" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/airalarm{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"yhe" = ( -/obj/structure/reflector/single/anchored{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_room) -"yjo" = ( -/obj/effect/spawner/lootdrop/grille_or_trash, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"ykr" = ( -/obj/structure/window/reinforced, -/turf/open/space/basic, -/area/space/nearstation) -"ykD" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/engine/engine_room) -"yma" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) - -(1,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(2,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(3,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(4,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(5,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(6,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(7,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(8,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(9,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(10,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(11,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(12,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(13,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(14,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(15,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aal -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(16,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aeh -aab -aeh -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(17,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aaC -aep -agL -aep -aaC -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(18,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aas -aaD -aeC -agM -agS -aas -aaD -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(19,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aab -aab -aaF -aeH -aeH -aeH -ahe -aab -aab -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(20,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aap -aaB -aaI -aeH -agO -aeH -ahg -ahS -aap -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(21,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aab -aab -adB -aeH -aeH -aeH -ahh -aab -aab -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(22,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aas -aaD -agB -agP -ahc -aas -aaD -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(23,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aaC -aeh -agR -aeh -aaC -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(24,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aep -agP -aep -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(25,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(26,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(27,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(28,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(29,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(30,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(31,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(32,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(33,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(34,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(35,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(36,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(37,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(38,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(39,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(40,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(41,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(42,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(43,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(44,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(45,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(46,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aaa -aal -aal -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(47,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(48,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(49,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(50,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(51,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(52,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(53,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(54,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(55,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aal -aaa -aaa -aaa -aaa -aal -aaa -aaa -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(56,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aaa -aal -aaa -aaa -aaa -aaa -aal -aal -aal -aaa -aaa -aal -aal -aaa -aaa -aal -aal -aal -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(57,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aeS -aeS -aeS -aRH -aRK -aRK -aRK -aRK -aRK -aRK -aRK -aRX -aeS -aeS -aeS -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(58,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aal -aeS -bYc -bTU -bXg -bTU -bTU -bTU -bTM -bTU -bTU -bLF -bXg -bTU -bYc -aeS -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(59,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aaa -aal -aal -aal -aal -aeS -bTU -bXC -ceg -bYj -bYj -cdX -ceb -cem -bYj -bYj -ceg -cbA -bTU -aeS -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(60,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aal -aeS -bTU -bXN -ano -ano -ano -ano -ano -ano -ano -ano -ano -bXN -bTU -aeS -aaa -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(61,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aaa -aal -aaa -aaa -aaa -aeS -bTU -bXN -ano -bnU -aAF -aAF -bTh -aAF -aAF -aAF -ano -bXN -bTU -aeS -aeS -aeS -aeS -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(62,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aal -aaa -aal -aaa -aaa -aaa -aeS -bTU -cdZ -ano -aAF -aAF -aAF -bIz -bJN -aAF -aAF -ano -bXN -bYc -aeS -bWZ -cec -aeS -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(63,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aaa -aal -aal -aal -aaa -aeS -bTU -cea -ano -aAF -bBK -aAF -aAF -bKl -aAF -aAF -ano -bXN -bTU -aeS -cej -bTU -aeS -aeS -aeS -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQX -aQX -aQX -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(64,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aaa -aal -aeS -aeS -aeS -aeS -bTU -bXN -ano -ano -bGd -bTi -aAF -bKl -bGd -ano -ano -bXN -bTU -aeS -bTU -cek -bXg -cef -aeS -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aaa -aaa -aaa -aal -aaa -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(65,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aeS -bWX -cdT -cdY -bTU -bXN -ano -aEP -bnO -bTk -bTl -bMy -cbZ -aEP -ano -bXN -bTU -bTU -bTU -bYc -aeS -aeS -aeS -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aug -aug -aug -aug -aaa -aaa -bpB -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -aal -aaa -aQX -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(66,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aeS -bTU -bXC -bYj -bYj -bYk -ano -bwz -bxo -bTu -bTA -bTB -ccg -cch -ano -cbB -bYj -ceg -bYj -cbA -bQW -bPc -aeS -aal -aaa -abE -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aug -aug -aaN -atO -bId -aaN -aaN -aaN -aaN -aaN -aal -aaa -aaa -aal -bLx -aaa -aal -aaa -aaa -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(67,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aeS -aeS -aeS -aeS -bof -aeS -aeS -bYc -bXN -ano -ano -ano -ano -boK -bGt -bSh -bXk -ccb -aAI -bqo -ano -ano -ano -ano -bTU -bXN -bQW -bPc -aeS -aal -aaa -aal -aal -aal -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aug -aug -aaa -aaN -atP -atQ -aaN -bIL -bJo -cdz -aaN -aBY -aBY -aBY -aBY -aBY -aBY -aBY -aBY -aal -aal -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(68,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aeS -bTU -blO -aTh -bQG -aUe -bSv -bSv -bYd -ano -aYZ -aQa -bme -bqe -bJq -bJq -bXn -bJq -bJq -cfd -bme -aQa -bqd -ano -bTU -bXN -aeS -acB -acB -adz -ahO -ahO -ahO -ahO -ahO -ahO -aBw -acB -acB -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aug -aug -aug -aal -aaa -aaN -atQ -bIg -aaN -aaN -aaN -aaN -aaN -aBY -aBY -aBY -aBY -aBY -aBY -aBY -aBY -aBY -aaa -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(69,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -aal -aaa -aaa -aaa -aaa -aal -aeS -bTU -bTg -bVH -bWW -bXo -aMX -aMX -bYg -ano -aCT -aTp -aAH -bqg -bSe -aAI -bXK -aAI -cfc -cbz -aAH -aTp -cca -ano -bTU -bXN -bXH -acB -aDv -awE -bMt -aGW -bMs -bMs -awE -bTr -aGW -bMs -acB -aaa -aaa -aal -aal -aaa -aaa -aal -aal -aal -aal -abE -aug -aug -aal -aaa -aaa -aaN -aaN -atR -aaN -aaN -jAc -bJp -cdD -aBY -aCm -aCy -csr -aBY -bIe -aCp -bIl -aBY -aBY -aaa -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(70,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aal -aal -aaa -aaa -aaa -aal -aal -aal -aaa -aaa -aal -aal -aeS -bTU -bTy -agU -bSc -ajM -amk -amk -anh -ano -ano -ano -ano -ano -ano -aAI -bXL -fMr -ano -ano -ano -ano -ano -ano -bTU -bXN -bXg -acB -bMs -bMs -bMs -bMs -bYm -bMs -bMs -bMs -bMs -bMs -acB -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aug -aaa -aaa -aaa -aaa -aaN -asY -atT -atT -bIG -bIN -bJr -cdF -aBY -aCp -aCp -aCp -bJn -bIf -aCp -bxl -aBY -aBY -aal -aal -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(71,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aeS -aeS -aeS -aeS -aeS -aeS -aRH -aRK -aRK -aRK -aRK -aRX -aeS -aeS -aeS -aeS -aeS -bYc -bQt -agU -bnM -bnI -bnK -bHT -bmJ -ano -aAF -bnt -aAF -aBt -bqz -blL -ccc -blL -bqD -bqG -aAF -bnt -aAF -ano -bTU -bXN -bXq -acB -bMs -bYr -bmv -bmv -bZi -bZj -bmv -bYs -bmz -bfl -acB -aXz -aug -aug -aug -aug -aug -aug -aug -aug -aug -aug -aug -aal -aal -aal -aal -aaX -asZ -atU -bIh -bIH -bIO -bIw -bIw -bIP -bIS -aCF -aCp -bIU -bIV -aCp -bIX -aBY -aBY -aBY -aaa -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(72,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aeS -aeS -aeS -aeS -bXb -bTU -bYc -bTU -bTU -bTU -bTU -bTU -bYc -bbS -bbS -bQW -bTU -bTU -bTU -bTU -bTU -bTC -agU -ajN -bnJ -ajO -blG -bmJ -ano -aBQ -aAF -aAF -bnH -bog -aAI -bmG -aAI -bqv -bqH -aAF -aAF -bNU -ano -acB -bGD -acB -acB -bMs -bmk -aGE -aGE -bmw -bmy -aGE -aGE -bmA -aHu -acB -bel -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aaa -aaa -aaa -ajH -atm -atV -bIw -bIw -bIO -bIw -bIw -aCb -aCr -aCG -aCp -aCp -aCp -aCp -bJe -bJa -aBY -aBY -aaa -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(73,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aeS -bXl -bXm -aeS -bTU -bmj -bmU -aMX -aMX -bFb -aMX -aMX -aMX -aMX -aMX -bSs -aMX -aMX -bFb -aMX -aMX -bTT -agU -aml -aEW -bkp -bku -bmJ -ano -aAG -bnV -bnV -bnT -bqr -blL -bnc -blL -bqs -bqI -bnV -bnV -bqu -ano -bYm -cbN -bMs -bYm -bMs -bmk -aGE -bhF -bMb -bhD -bhC -aGE -bmA -bYu -acB -bhE -acB -aaa -aaa -aal -aaa -aaa -aaa -aal -aaa -aaa -aaa -aal -aaa -aaa -aaa -ajH -atn -atW -bIx -bII -bIR -bIx -bIx -cdJ -bIT -cdK -bIW -bIY -bJc -bIW -bJg -liH -aBY -aBY -bMF -aal -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(74,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aeS -bZV -bTU -aux -bTU -bml -aeS -acb -acb -acb -acb -acb -acb -aco -aCf -aco -aco -aco -aco -aco -aco -aco -aco -aco -aco -amm -bkv -amm -ano -ano -ano -ano -ano -ano -bqf -bnd -bNT -ano -ano -ano -ano -ano -ano -bMs -cbO -bmv -bRg -bTI -bTJ -aGE -bdU -aGO -aGO -bej -aGE -bmA -bfm -bdv -bYy -acB -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aaa -aaa -aaa -ajH -atn -aBq -bIw -bIw -bIw -bIw -bIw -aCk -aCv -aCH -aCp -aCp -aCp -aCp -bJh -bJs -aBY -aBY -aaa -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(75,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aeS -aeS -bTU -bTU -aeS -bYc -bml -bWV -acb -acd -acd -acA -acX -adg -aco -xve -adL -aec -aec -aeI -agj -ahj -ahF -aif -bgR -aco -aoM -bkw -aFj -ano -aAF -bnt -aAF -boJ -bqA -blL -bne -blL -bqE -bqJ -aAF -bnt -aAF -ano -cee -cbG -aGE -aGE -aGE -aGE -aGE -bdV -bdY -beb -bek -aGE -bXc -aXI -bmC -bhI -acB -atS -aCq -aCq -aCq -aCq -aCq -aCq -aCq -aCq -aCu -aal -aal -aal -aal -asX -ato -aBN -bIB -bIJ -bIw -bIw -bIw -aCl -aCw -aCF -aCp -bIc -bIi -aCp -bIy -aBY -aBY -aBY -aaa -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(76,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aeS -buu -bTU -bmF -aeS -bXH -bml -bLF -acb -acd -acd -acA -acX -adg -aco -ajm -bUk -aed -aed -aeM -agk -ahk -aed -ahk -ajb -aco -axI -blH -anp -ano -aJu -aAF -apE -boL -bog -aAI -bnf -aAI -bqv -bqK -aAF -aAF -bNV -ano -bZg -cbF -aGE -aIF -aeU -bdL -bdR -aXo -aXo -bec -aIT -aJr -aJs -aJs -bYw -bhJ -acB -aCa -aal -cdf -cdq -cdq -bAI -cdq -cdA -aal -aCa -aaa -aaa -aaa -aaa -aaN -atq -aBW -wVQ -bIK -bJd -bJd -cdG -aBY -aCp -aCp -aCp -bJJ -bIj -aCp -bxm -aBY -aBY -aal -aal -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(77,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -arU -bYa -bTU -bTU -aeS -bXg -bmm -aeS -acb -uva -adK -aVE -aez -acS -ayX -ayb -bjZ -bjZ -bkl -adN -bvb -adN -adN -blw -adN -ajV -aeB -bkw -anp -ano -aAG -bnV -bnV -boX -bqr -blL -bLV -blL -bqs -bqL -bnV -bnV -bqu -ano -bXr -cbF -aGE -aGP -aGO -bdM -bdS -bdW -bdW -bed -bdW -bhM -bhR -aGE -bmA -aHu -acB -bLz -ccS -acB -aal -aaa -aaa -aaa -aaa -cdB -aCL -aCu -aal -aaa -aaa -aaN -aaN -aNE -aaN -aaN -bJi -caX -cdH -aBY -aCx -aCJ -aCp -aBY -bIk -aCp -bIA -aBY -aBY -aaa -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(78,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -bnF -bWZ -bXa -bTU -aeS -bPc -bml -bLM -acb -wJv -acg -acg -acg -adh -aco -bUe -bUl -amo -bkR -blx -blA -aGq -bni -bnA -bnb -bkc -bmL -bkz -diw -ano -ano -ano -ano -ano -ano -bqf -bng -bqo -ano -ano -ano -ano -ano -ano -bYm -cbF -aGE -aHf -aHx -aHx -aIb -aGO -aGO -bee -aGO -aGO -bhS -aGE -bRi -bRj -acB -aCK -bAA -ash -aaa -aaa -aaa -aaa -aaa -aal -cdB -aCL -aCq -aCu -aaa -aaa -aaN -aNF -bIC -aaN -aaN -aaN -aaN -aaN -aBY -aBY -aBY -aBY -aBY -aBY -aBY -aBY -aBY -aaa -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(79,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aeS -bYb -bTU -bTU -aeS -bTU -bml -bQN -acb -ach -ach -ach -ach -adi -aco -bUf -adN -adN -aDa -bgY -aEi -bhz -bhB -adN -adN -ajV -aeB -bkC -anp -ano -aAF -bnt -aAF -bqt -bqB -blL -bne -blL -bqF -bqM -aAF -bnt -aAF -ano -bMs -cbF -aGE -aKm -aGO -bdM -bdS -bdW -bdW -bMc -aGO -bzQ -aIU -aGE -bmA -bYu -acB -bLA -ccU -asv -aaa -aaa -aaa -aaa -aaa -aaa -aal -cdB -aal -aCL -aCu -aaa -aaN -bqT -bID -aaN -atQ -atQ -atQ -aaN -aBY -aBY -aBY -aBY -aBY -aBY -aBY -aBY -aal -aal -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(80,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aeS -aeS -aeS -aeS -aeS -bTU -bml -aeS -acb -acb -acb -acb -acb -adj -aco -bUn -adQ -adQ -aew -aew -aew -aew -aew -aew -aew -aew -aFy -bkC -anp -ano -bNP -aAF -aAF -bqw -bog -aAI -bng -aAI -bqv -bqN -apE -aAF -bNW -ano -cbD -cbP -aGE -bod -arV -bdL -bdR -aXo -aXo -beg -aXo -bem -qrk -aGE -bmA -aHu -acB -bXi -acB -acB -acB -acB -acB -acB -acB -aaa -aaa -aal -cdB -aal -aCa -aaa -aaN -btU -bIF -aaN -aaN -aaN -aaN -aaN -aal -aaa -aaa -aal -bLX -aaa -aal -aaa -aaa -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(81,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -arU -bTU -bml -arU -aal -acm -acr -acC -acY -adT -acY -bUg -bUm -aee -aew -aeP -blg -blj -ahl -aig -blz -aew -aeB -bkC -anp -ano -aAG -bnV -bnV -bqy -bqr -blL -bne -blL -bqs -bqO -bnV -bnV -bqu -ano -cbF -aGE -aGE -aGE -aGE -aGE -aGE -aGO -aGO -beh -bNJ -aGE -aGE -aGE -bmA -bfm -bdv -aCd -bdv -bfl -acB -bWI -bWJ -bQP -acB -aaa -aaa -aaa -aaa -cdB -aCL -aCq -aCq -bIE -cdI -aaa -aaa -bJj -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(82,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -bgg -bYc -bml -bgg -aal -acm -acr -acr -ada -adU -adD -bUh -adN -aef -aew -aCO -blh -agC -blq -aEQ -aFe -aFw -bjw -bmK -aFj -ano -ano -ano -ano -ano -ano -bor -bnh -bor -ano -ano -ano -ano -ano -ano -cbF -aGE -aHK -aJh -aYp -bea -bei -rVP -bey -beR -qpo -aGE -bTY -bXh -bmE -aXJ -bYz -bmE -aXI -bfq -acB -bMn -bMs -bMs -acB -aaa -aaa -aaa -aaa -aal -cdC -cdq -bAI -cdE -aal -aaa -aaa -aal -aaa -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(83,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -bnF -bTU -bml -bnF -aal -acm -acr -acE -acY -adV -acY -bUi -bUm -aeg -aew -aeP -afI -bll -aCZ -sfL -ajd -aew -aeB -bkC -anp -anp -anp -aAH -aAI -aAI -aAI -blK -bnj -aAI -boM -bqk -boZ -aAJ -bXz -bMs -cbF -aGE -aGN -aNM -bdN -bdO -aGE -aGE -aGE -beS -aGE -aGE -aJv -aJv -aJv -aJT -aJT -aJT -bMs -bdB -acB -acB -bMs -acB -acB -acB -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQX -aQX -aQX -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(84,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aeS -bXg -cdV -aeS -aeS -aco -aco -aco -aco -aev -aiZ -oMw -njx -bUr -aew -aew -aew -aew -aew -aew -aew -aew -aeB -aom -bNX -bNX -bTR -aBv -aBJ -aBJ -aSf -blI -bos -boE -boY -bhy -bqx -aAJ -bRh -bMs -cbG -aGE -aIj -aVW -bdN -aGO -aId -aGE -bzR -bgQ -bhV -aGE -aJw -aYl -aJv -aJU -bMe -aJT -bMs -bdB -acB -bTS -bMs -car -bMs -acB -azH -azH -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(85,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aeS -aeS -aeS -kBb -ria -yma -voh -bXq -aeS -aal -aal -aaa -aco -aco -aco -bOG -bOG -bOG -bWL -bQW -bTF -bbS -uzG -aeA -qxZ -blD -afO -afO -bns -aAH -aFH -aAQ -bnk -aKe -bNS -bnD -boN -bkk -bqn -aAJ -bZf -bMs -cbF -aGE -aRz -aHh -bdT -gEO -aIe -aGE -aJV -bhK -aXT -aGE -aKw -aKf -aJv -aXY -aUs -aJT -bXP -bYD -acB -acB -bYm -bMs -bMs -acB -bXR -azH -azH -azH -azH -azH -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(86,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -avP -avP -avP -avP -avP -avP -avP -avP -avP -avP -avP -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aeS -cdT -bTU -bTU -bTU -bTU -rBV -bXq -aeS -aaa -aaa -aaa -aaa -aaa -aaa -aeS -aLd -aeS -bTU -bTj -bpb -bpb -bpc -bmI -bjw -bDQ -aeB -afO -bns -aAJ -aAJ -aAJ -aAJ -aAJ -aAJ -aAJ -aAJ -aAJ -aAJ -aAJ -bMs -bMs -cbF -aGE -aGE -aGE -aGE -aGE -aGE -aGE -aWM -bvy -aKg -aGE -bfs -aXr -aJv -bfE -bdj -aJT -bZk -bYE -bdA -acB -acB -acB -bRh -acB -aBx -aBx -bWy -cce -aBx -aBx -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(87,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -avP -aaa -aal -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aeS -cdU -bTU -bYc -bTU -bTU -iHp -bQW -aeS -aaa -avp -aaa -aaa -aaa -avq -aLv -bTU -aLv -bTU -boW -afJ -afJ -afJ -afJ -afJ -afJ -afJ -oRe -aoB -bNZ -aeA -bXy -bYm -bXe -bXf -bXO -bRh -bXQ -bMs -bMs -bMs -bYm -cbG -bRf -aGQ -wMM -bdI -bdP -aac -aIu -aGE -bxv -aGE -aGE -aXp -aXH -aJv -aYb -bdk -aJT -acB -bMs -bdB -acB -bZx -vLi -bMs -bRO -bYK -aBx -bWy -bWy -aBx -aBx -azH -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(88,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -avM -avM -avM -avM -avM -avM -avM -avM -avM -avM -avM -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aeS -bZh -bTU -bTU -bTU -bXg -rBV -bTU -aeS -aal -aaa -aaa -aaa -aaa -aaa -aeS -bHX -aeS -bbU -bYf -afJ -agD -blV -ahI -bgO -bko -bkf -blE -aoN -bkG -bSF -bdv -bdv -bdv -bYn -bdv -bRl -bdv -bdv -bdv -bYn -bdv -cbH -bTE -aGQ -gVB -apL -aHB -aIh -aJn -agi -bxZ -aKh -aKh -aKh -aXP -bjj -bbK -bdl -aKh -bcQ -bdv -bdx -acB -acB -bMs -bYm -acB -bXS -bWe -bWz -bWz -aBy -bYK -aBx -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(89,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aal -avM -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avM -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -adO -adO -adO -adO -adO -adO -rBV -bYc -aeS -aeS -aRH -aRK -aRK -aRX -aeS -aeS -bbT -aeS -bTU -boW -afJ -agE -aho -ahJ -bjY -bkt -bkh -afN -aoB -ili -aeA -aeA -aBe -aBe -aBe -aBe -aBe -bTD -aBe -aFN -aFN -bmh -cbI -aFN -aGQ -aYo -aJb -aHP -aan -aGQ -aTY -bAF -aGt -ntE -bhL -bNK -xtN -bhO -bdm -bgs -aJF -pTq -bYH -bdA -acB -bVQ -bRh -bVM -bVM -bVM -bWB -bWB -bRd -aBx -aBx -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(90,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -avM -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avM -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -adO -aqY -auj -auj -brc -adO -eLr -bTU -brm -bQW -bTL -bTU -bYc -bTU -bTM -bTU -bYc -bTU -bTU -boW -afJ -agF -ahp -ahK -bka -ajf -bkh -afN -aoB -afO -aAK -aAR -aBe -aBS -aER -aYf -aFk -aEv -gqB -aFO -aGf -aFR -cbJ -aGM -aGQ -aHk -aJq -aYj -aHk -aGQ -bhP -bBQ -aIY -aIY -aIY -aIY -aIY -aIY -bdn -aIY -aIY -aIY -bMs -bdB -ash -bMs -bVZ -cep -bWd -bWg -bWD -bWB -bQe -aBx -bRm -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(91,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -avP -avP -avP -avP -avP -avP -avP -avP -aaa -avM -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avM -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -adO -asc -aun -auW -aAo -aOk -vgy -mNo -etl -cXx -eNw -rQg -yma -yma -bTN -yma -yma -bpa -bmH -bLh -afJ -eQq -ahr -ahL -bAV -bBt -bkh -afN -aoB -afO -aAK -aAR -aBe -aJE -bLU -aKp -aBU -aGn -bhT -aFP -aGg -aQD -cbK -pYp -aGR -iHE -bdJ -aIg -aIQ -aJN -aXw -bBQ -aIY -bNG -aJi -aJI -aJP -aJZ -bdo -aKj -bNI -aIY -bYm -bZp -bVL -bMs -bWk -bVY -bQL -bWq -bWE -bWB -bVM -bYK -bXT -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(92,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -aal -avM -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avM -aal -aaa -aaa -aaa -aaa -aaa -aaa -adO -adO -adO -adO -aCg -abr -afD -aCg -adO -adO -adO -adO -bQb -bBR -boW -acp -acp -acp -acp -acp -bBV -boV -acp -acp -agI -aGC -ahM -bAW -ajh -bkh -afN -aoB -afO -aAK -aAS -aBe -aJW -aYg -aYc -aBU -aGn -bhU -aFQ -aGh -aFR -cbL -cbR -aGR -aHm -aNN -bdQ -aIi -aIw -aGt -bBQ -aIY -aJi -aJi -aJJ -aJQ -aKa -bdp -bds -biB -aIY -bMs -bZq -bVL -bMs -bWk -bVM -bWf -bWx -bZP -bWC -bVM -aBx -bXW -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(93,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -avP -avP -avP -aaa -aVx -aVx -aVx -aVx -aVx -aVx -aVx -aVx -avM -avZ -avZ -avZ -avZ -aVl -avZ -avZ -avZ -avZ -avM -aal -aaa -aaa -aaa -aaa -aaa -aal -adO -aaq -aaq -aaq -aaq -aaq -aaq -aaq -aaq -aaq -aaq -adO -bQl -bBR -kLE -acp -anq -acw -adk -bBT -bBW -bkW -ayU -acp -aqV -aHe -aje -bBa -akI -bkq -afN -aoB -afO -aAK -aAS -aBe -aYe -aYh -aYi -ayr -aHj -aFg -aGw -aGA -aGA -aGD -cbS -aGR -nwZ -aUd -ayG -aYd -aGR -aGt -bBQ -aIZ -aJj -aJj -aJJ -aJR -bzW -bMf -aKk -aKa -aXZ -bMs -bRk -bVL -bYm -bXA -bVM -bVU -bSy -bSy -bWC -aRr -aBx -bXU -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(94,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -aaa -aal -aal -aVx -ccX -aeW -aLX -bvL -bbH -ccv -ccy -avM -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avM -aaa -aaa -aaa -aaa -aaa -aaa -aal -adO -aaq -aaq -aaq -aaq -aaq -aaq -aaq -aaq -aaq -aaq -adO -gst -cbi -cIZ -acp -acw -acw -adl -adG -adW -aik -qHu -acp -agJ -aht -ahN -bBg -aAX -afJ -bgN -ape -bgP -aeA -aeA -aBe -aBe -aBe -aBe -aEU -aNd -aIo -aFO -aIa -aXy -bew -aGI -aGR -aHm -aNS -azG -aIk -aIv -aGt -bhN -aIY -bHZ -aJi -aJJ -aJQ -bdi -bdr -aKa -aKn -aIY -oWU -bdC -asv -bMs -bLQ -bVM -bVW -bSy -ccd -cci -bVM -bYK -aBx -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(95,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aal -aVx -aVx -aVx -aVx -ccX -ccX -ccX -ccX -ccX -ccw -ccX -avM -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avM -aaa -aaa -aaa -bfK -aaa -aaa -aaa -adO -aaq -aaq -aaq -aaq -aaq -aaq -aaq -aaq -aaq -aaq -adO -uIo -tVl -ljF -acp -bdq -acw -acp -acq -bSG -aik -blc -acp -afN -afN -afN -bBq -afN -afN -afN -aoB -anp -bwL -aeA -abN -aon -bnn -aBe -caY -aNQ -aIo -aFS -aGi -aGr -beA -aGK -aGR -clO -aQY -azU -aIl -aIw -aGt -bBQ -aIY -bcV -aJi -aJK -aJP -aKb -aYn -aKl -aKo -aIY -bYm -bdB -acB -bVZ -bQQ -bVM -bWb -caV -bSy -bSy -aRr -aBx -aBx -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(96,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -aVx -aaM -aaM -aVx -bbH -bbH -bbH -ccX -ccX -ccx -ccq -avM -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avZ -avM -aaa -aaa -avi -aaW -avi -aaa -aaa -adO -aaq -aaq -aaq -aaq -aaq -aaq -aaq -aaq -aaq -aaq -adO -mjC -eCj -ljF -acp -bef -bcm -adk -adH -aCX -aik -adW -afK -afN -ahX -bhA -bBr -aXl -bkx -aXl -apX -aBg -aBg -aCY -aGY -caf -aoO -aBf -aBT -bhW -aIo -aFT -aGj -aGs -beB -aGL -aGR -aHp -aRa -aYk -aHp -aGR -bdh -bBX -aIY -aIY -aIY -aIY -aIY -aIY -aIY -aIY -aIY -aIY -bMs -bYJ -bVX -bWi -bVM -bVM -bSy -bWj -bZQ -bWw -bVM -rck -pHi -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(97,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -aVx -ccA -abw -aVx -aVx -aVx -aVx -cck -aVx -ccp -cck -avM -avZ -avZ -avZ -avZ -aVm -avZ -avZ -avZ -avZ -avM -aaa -aaa -awl -avt -awl -aaa -aaa -adO -aaq -aaq -aaq -aaq -aaq -aaq -aaq -aaq -aaq -aaq -adO -mjC -tVl -ljF -acp -acw -acw -adl -adJ -aen -amp -aAy -aGp -aHb -aim -ahU -bnp -ahU -blC -ahU -bNY -sHj -bwM -aeA -bnm -bfQ -apd -aBe -aMF -bKk -aHZ -aFT -aGk -aGt -beC -aHF -aKh -beI -aIx -aGt -aGt -aGt -aGt -bGy -aXj -beN -aJA -aJL -aJS -bNH -aJp -bTo -bMs -acB -bMs -bdB -bVM -bVM -bVM -bWa -bWc -bWl -bSy -bSy -aRr -aBx -nbA -azH -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(98,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aVx -abu -bbH -cck -bbH -awk -cck -ccm -wPr -bbH -bbH -avM -avM -aJc -aVs -aVh -aVo -aJc -aVs -aVs -aVh -avM -bcc -avu -avi -aQS -avi -bcc -avu -adO -adO -abr -afD -aCg -abr -afD -aCg -abr -afD -adO -adO -mjC -tVl -tQN -acp -acw -acw -acp -acq -pwu -anj -adW -afK -afN -ajc -aAa -ail -aoP -apj -apk -aeA -aeA -aFI -aeA -aeA -bkF -aBe -aBe -vXg -anC -aFK -aFU -bNL -aGt -beD -aHM -beH -beJ -beK -beL -beL -beL -beL -bGK -aXj -bhX -aJB -bzU -aJB -bGH -aJp -bZX -bMs -bRO -bMs -bdB -bVM -bdt -bSy -bSy -bSy -bWm -bWo -bWv -bVM -bZt -nbA -bTs -azH -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(99,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aVx -bbH -bbH -ccl -ccX -cdb -cdc -ccX -cdl -bbH -ccX -cdo -avM -aVe -aVi -aVi -aVi -aVi -aVi -aVi -aVv -avM -ccC -aVn -awd -awd -awd -bkQ -bkQ -avi -adO -ako -aei -aei -aei -aei -aei -aei -aei -bkX -cIZ -gst -hnd -cIZ -acp -acw -acw -amW -bjX -bnX -dxJ -blo -acp -afN -ajc -ahU -aiq -bmc -bkr -bkn -aeA -ced -ceh -cei -aeA -bkM -aEw -aEw -aEw -aEw -aEw -aEw -aEw -xCE -beE -aRt -aGT -aGT -aQZ -aXm -aYv -aGT -aGT -ygs -beM -bhY -aoR -apb -aJC -bGI -aJp -bUa -bTq -acB -bTK -bYD -bVM -nvs -bVP -bVS -bSy -bWn -bWw -bWF -bVM -bZu -nbA -aBx -bWK -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(100,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aVx -bbH -bbH -aVx -ccY -ccX -cdd -cdi -cdi -cdi -cdn -cdp -avM -aVf -aLW -aMd -aDW -aVt -bcK -ccr -bfy -aVp -afZ -btp -bxF -bxG -bvY -bwb -byC -avi -adO -sCI -asc -asS -afn -bdK -afn -asS -bqY -bxV -bMx -bRX -tVl -xOq -acp -acp -acp -acp -acp -acp -acp -acp -acp -afN -ajg -aip -air -bki -bks -blR -ait -ait -ait -ait -ait -bkM -aEw -acN -aFl -aFA -aFL -aFV -aGl -aGt -beE -aIM -aqv -pmp -aHI -gVW -aNL -aYt -aqv -bGO -bBY -bCb -bCd -caL -bGF -bfF -aJp -azH -azH -azH -azH -bfZ -asy -asy -asy -asy -asy -asy -asy -asy -asy -asy -hTU -aBx -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(101,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aal -aal -aal -aal -aVx -bvG -adq -aVx -ccZ -ccX -cde -ccn -bbH -bbH -bbH -ccz -avM -aVg -aVk -adx -aVr -utL -mwg -ccs -cct -ccu -bky -bvp -avi -bxH -avi -avi -avi -avi -aei -aei -aej -auk -auy -auy -auy -bkU -brg -aVI -cIZ -cbg -cbk -cbm -aeA -bTH -aXX -afM -cbo -cbp -bRa -bRB -aeA -afN -ajc -ahU -ajk -bkm -blS -gBb -ait -bNN -aAL -aAT -ait -bkM -aEw -apU -aEV -aHC -aIy -aFm -aGm -aGt -beE -aIM -arZ -azZ -bms -caD -aRc -aYu -blW -bGP -bBZ -bhZ -ben -bfo -bfp -beo -aJp -tdw -aBx -aBx -aBx -bdE -asy -aUK -bOB -bOB -bOI -bOO -bPk -bPq -bPs -asy -qKO -bXV -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(102,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avi -avi -avi -avi -avi -avi -avi -avi -avi -avi -abH -avi -cco -cco -cco -avi -avi -avi -avi -avi -avi -avi -avi -avi -avi -avi -bky -bvH -avi -aRA -bQr -bkB -aCD -adO -aei -aej -aet -asd -asT -asT -asT -blk -brh -bqU -cIZ -cbs -cbl -dns -aeA -bTH -bru -bDi -afM -cbr -afM -afM -cbn -afN -ajc -ahU -akJ -blP -aIr -aEX -ait -anr -aAM -aAM -ait -bkM -aEw -aGF -aGB -aHy -aHQ -aIK -aIL -aKc -bRp -aIM -aHs -aHt -aHT -aYq -aVF -blF -aHs -bGQ -aRe -aJp -aJD -bFo -aYx -aKd -aJp -aHJ -bdu -bYG -bdw -bdF -asy -aUL -bOC -bOF -bOJ -bOT -bPl -bOT -myk -asy -nbA -aBx -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(103,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -atz -aai -bcd -bcd -bcd -afj -agz -agz -agz -agz -cdg -cdj -aMf -aMf -aMf -aMf -cdm -aMf -aMf -aMf -aMf -aMf -aMf -aMf -aMf -bsc -beY -bvJ -avi -aRA -bCh -bkB -bYl -adO -alw -aej -aet -asd -asT -buW -asT -blk -bri -bBS -qIb -cbh -gGG -jro -acy -acy -acy -acy -acy -acy -acy -cbq -aeA -afN -ajc -ahU -amn -blQ -bnL -bHV -ait -aHo -aAM -aAU -ait -bkM -aEw -fqe -aFm -bGA -aQt -aHE -aXv -beu -aRb -aJG -aGT -aQZ -aVG -aYr -aXk -aGT -aGT -aYa -aRe -aJp -aJp -aJp -aJp -aJp -aJp -bYA -bTx -azH -azH -bVK -asy -bLD -bOD -bOK -bON -bOP -caW -bOP -bOU -asy -nbA -aBx -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(104,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avA -awe -anQ -awe -amE -agr -kXJ -awe -aks -awe -plI -awe -asn -awe -anQ -awe -aLY -awe -awe -awe -awe -awe -awe -awe -awe -bvQ -awe -bvK -avi -aRA -bQr -bkB -bjR -adO -aei -aej -bql -asd -asT -asT -asT -blk -bri -vxP -cIZ -cIZ -cIZ -cIZ -acy -bVN -bVR -bVT -bVR -adf -aek -aeA -aeA -afN -ajc -bmM -ait -ait -ait -ait -ait -ant -aAM -aAV -ait -bkM -aEw -bSV -aHO -aHE -aSu -aFm -aGl -aGt -aRe -aUR -aHi -aJo -bdX -bdX -bev -bdX -beP -bGS -bCa -bCc -bbN -bGB -aXW -bTv -aLo -aTj -bba -azH -bLP -bRv -asy -bLE -bOE -bOH -bOL -bOT -bPo -bOT -bOV -asy -nbA -aBx -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(105,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avi -awl -avi -aaW -avi -aaW -avi -abs -azb -abs -avi -aaW -avi -aaW -avi -aPS -azb -ceS -ceS -ceS -aDs -ceS -ceS -ceS -ueA -avi -avY -bvK -avi -aRA -bQr -bkB -bQB -adO -aei -aes -auw -ase -ata -ata -ata -bmY -bsh -brb -bgh -qBt -aih -aLe -acy -bVV -bVO -bVO -acW -adm -aek -fxC -afN -afN -bay -ahU -bmb -bji -bSP -bnr -ait -anu -aAN -aAW -ait -bkM -aEw -aEY -aFn -aFC -aFM -aGe -aGm -aGt -aRe -aRe -aGt -aJx -bbK -bbK -aYs -beO -beO -bfi -aXA -aXD -alX -bCg -bbe -bTw -aRg -aRg -aKz -azH -bZn -aBx -asy -bLG -bOB -bOB -bOM -bOT -bOT -bPr -bOW -asy -hTU -aBx -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(106,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avi -bcN -avi -bcN -avi -bcc -avO -avu -avi -bcX -avi -bcX -avi -bcc -avO -avO -avu -avi -avi -bcc -avO -avO -avu -avi -avY -bvK -avi -aQb -bQr -aaT -aaT -adO -adO -byn -aej -aej -atp -cbd -atp -bqX -bsj -brj -brk -aLb -brn -bDY -acy -ado -acI -acJ -add -aeE -aVA -bmL -aXl -aXl -bRn -aip -bkj -bkb -bkD -aLH -bNM -bkK -bmq -bmt -ait -bkM -aEw -aEw -aEw -aEw -aEw -aEw -aEw -aGt -aRe -aRe -aGt -aJy -aGt -aHV -aHW -aJH -aII -beT -aHW -aHW -azH -bYv -bba -azH -bMq -azH -azH -azH -azH -azH -asy -asy -asy -asy -asy -bOZ -bPp -bPf -bOX -asy -nbA -aBx -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(107,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avi -aQS -avi -aQS -avi -aaa -aaa -aaa -avi -aQS -avi -aQS -avi -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aVc -avY -bvK -avi -bGl -bCh -aaT -bVq -aQq -adO -akM -aIE -beq -ber -bgq -ber -ber -bsF -aes -bkV -aKT -bro -bkY -acy -htS -bVO -acW -adc -ajZ -agH -aeB -afO -afO -ajj -afo -bmb -bkg -alE -ajp -aEx -aEz -aEB -ajp -ait -blB -blM -blM -exX -bBL -bBL -kyS -aGo -aGo -aUy -aXn -aVV -aJz -aGo -aHW -aHW -aIB -aIp -beU -kcl -aHW -aSs -bGC -bba -azH -bTZ -bTs -bTt -azH -aqa -bWY -stN -sMe -hLz -sMe -sMe -xWi -sMe -bOR -bOY -azH -nbA -aBx -bXJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(108,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aeX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avB -avY -bvK -avi -aRA -bQr -asF -bQr -bQr -adO -adO -aIW -asG -asG -asG -asG -asG -asG -asG -asG -bNc -bro -bkZ -acy -acH -adp -adc -adb -alA -aek -aeB -aeB -agN -ajo -agN -ait -bln -amc -amX -ajq -bJL -aFD -bmu -aBi -aBi -aBi -aBi -aBi -aBi -aBi -bBN -aGo -aFh -aUQ -aXs -aGZ -aJX -esN -aHW -bTc -aIp -aIp -beV -aUF -aHW -aSt -aBx -bba -azH -azH -azH -bMq -azH -bba -aBx -aUi -aBx -bYK -aBx -aBx -aBy -aBx -aBx -bPa -mVy -nLJ -bMq -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(109,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avB -avY -aBh -avi -aRA -bQr -aaT -bXd -bQh -aaT -nPi -aKR -asG -wtu -aoT -bRJ -aoT -bqQ -afs -aCj -aKV -bro -bOm -acy -acy -acy -wLO -ael -ayo -aek -aeA -aeA -aii -akA -aii -ait -blt -bHA -ajt -ajr -bKE -aFD -ajp -aBj -aCc -aEy -bNO -aEy -wIF -aBi -bBN -aGo -aGv -aVb -aXt -aHa -aJY -bya -aHW -aIt -aIC -aIJ -beV -aUa -aHW -aUm -aBx -bbb -aRg -aoi -bTw -bYC -aRg -aKz -aBx -aUi -bRm -aoh -aoh -aoh -aoh -aoh -aBx -aBx -aUi -aBx -bZm -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(110,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avB -avY -bvK -avi -aRA -bQr -aaT -bQf -bQi -aaT -bCh -hjz -asG -afr -asm -aCh -auo -aCh -avn -aKP -aKV -bro -asP -aih -aLf -acy -amZ -adb -aeO -aiY -aeD -acy -agU -aDO -agU -aix -bly -bHA -btz -ajs -bKE -bkE -bkL -bkN -bkO -bmP -bnE -bnG -bnN -aBi -bBN -aGo -aPC -aXq -bgG -aHa -aJY -aGu -aXU -bpk -aIp -bdZ -beW -aUA -aHW -bYt -aLo -bYx -aLo -bpT -bTv -aLo -bYx -aLo -aLo -bpU -aoh -aoh -apD -aFG -bnu -aoh -aoh -aBx -aUi -azH -azH -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(111,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aVd -bvD -bvN -avi -aRA -bJZ -aaT -bQg -bQj -aaT -bQr -bfS -asF -auK -auZ -auZ -auZ -auZ -brt -bzF -bxp -brp -asP -asP -asg -acy -dUT -aZu -aeO -acK -bny -acy -agV -aHq -afp -aix -bno -ajt -amY -aHg -aAx -blJ -ajp -aBl -bmf -aFo -bCM -bnC -bSX -aBi -bBN -aGo -aIc -aXu -caA -bzC -aXx -bZI -aHY -aTX -aIp -beF -bes -bGG -aHW -bCg -aBx -ahT -ahT -ala -ahT -ahT -alY -ahT -bYK -aUi -aoh -aoV -bbV -aqd -aoW -mlN -aoh -aBx -bPa -bXX -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(112,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avi -avi -bvP -bvK -avi -bmo -bQr -aaT -aaT -aaT -aaT -bQr -blN -asG -aiv -aqr -aKI -auX -aKI -bra -aCj -aKW -brq -asP -asP -bLC -acy -adw -adb -ajP -ajl -akV -acy -agW -aJg -aju -aix -bnW -ajt -ajt -ajt -bmr -ajp -ajp -aBm -bmf -aEA -aEA -aEA -bnP -aBi -qCl -aGo -aVX -aUQ -aUQ -aGu -aUQ -aGu -aXV -bpk -aIp -beG -bet -aUB -aHW -bCg -bSU -ahT -akH -bcZ -aoo -eMz -bDh -ahT -aBx -bpV -bQM -bbP -bbW -bcF -bcM -bJA -aoh -aBx -aBx -aUi -azH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(113,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aVc -bfM -avY -bvK -avi -aRA -bQr -aBC -aJM -aTA -bQr -bQr -bfS -asG -bRG -aum -bqR -aum -bRK -afv -aKP -aKX -brq -asP -asP -bRL -acy -ask -adb -adb -adb -xec -acy -agX -aJt -ajv -aix -byu -aIN -bmn -bmp -bkP -ijH -aAY -aBn -bmN -bmQ -bmQ -bmQ -bnQ -aBi -bBN -aGo -sXg -aUQ -aUQ -aGu -aUQ -aTV -aHW -aIA -aID -beX -aIp -aUb -aHW -bCg -bTb -ahT -akL -bda -bdc -bdd -bde -ahT -aBx -mnC -aoh -aoX -apR -aqo -bfc -bff -aoh -bUd -aBx -aUi -azH -aaa -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -avP -avP -avP -avP -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(114,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avB -bfN -avY -bvK -avi -hjJ -bRE -aCt -bRE -bRE -bRE -bRE -bep -asG -asG -asG -asG -asG -asG -asG -asG -acf -brr -asP -asP -aLi -acy -ady -ccD -aVJ -btb -bxt -acy -agU -aTT -agU -aix -bBs -aBk -ame -aix -aix -aix -aix -aBo -aBo -bmS -bmS -bmS -aBo -bTG -bBO -awD -aGz -aXC -aXC -aHc -aXM -aUt -aHW -aIp -aIp -bfj -aIp -aUE -aHW -bCg -bKa -ahT -bfH -bdb -akR -akR -ama -ahT -bUc -bTz -aoh -aoh -aoh -aKt -aoh -aoh -aoh -aoh -aBx -aUi -azH -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -aal -aaa -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -avP -aaa -aaa -aal -aaa -avP -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(115,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avB -bfO -avY -bvK -avi -bfS -aaT -aaT -acf -acf -acf -acf -acf -acf -aih -bge -aih -aCi -aih -aih -aih -aih -brs -asP -asP -aLj -acy -adZ -acy -aeq -lbD -fBk -bTp -bZD -aVK -aBs -bEs -bTQ -axE -axE -axE -axE -ceu -axE -aHG -lLE -cex -bnw -bnw -bmO -bEs -bBP -axM -afu -aXR -bts -aHd -aXN -aHN -aUl -aGS -aUx -bpv -aIp -aIp -aHW -bCg -ahT -ahT -ahT -akS -ahT -alo -ahT -ahT -ahT -ahT -aoh -ezo -aoW -aKu -cab -aqp -bgi -aoh -aBy -bYU -azH -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -avP -aaa -aaa -aal -aal -aal -aaa -avP -avP -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(116,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aVd -bfO -aEJ -agp -avi -bfS -aaT -bQp -aaA -aaJ -aaJ -ack -brf -aih -aih -bqP -aqE -aKO -aLb -aLb -aLb -aLb -bsK -asQ -asQ -aLk -acy -acy -acy -axw -axE -bTQ -axE -ahV -aHw -aDL -hvP -bBJ -rta -rta -rta -rta -ueN -rta -bDt -rta -sEf -rta -bDu -rta -hvP -aJk -rta -ueN -aJl -aJm -bGL -aXR -axM -bfG -aGU -aHn -bfn -aIR -aJf -aHW -bCg -ahT -bRt -aEE -akl -bgv -akl -cay -aqi -ahT -bvE -aoh -aoW -aoW -aKu -aqj -beZ -aKr -aoh -aBx -aUi -azH -aaa -aaa -aUk -aUk -aUk -aUk -aUk -aUk -aUk -aUk -aUk -aUk -aaa -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -aal -aal -aal -bNf -aal -aal -aal -aaa -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(117,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avi -avi -atw -bvK -avi -bfS -aaT -bQr -acf -ack -ahn -bgc -acf -aih -auq -bqV -axH -aCn -aKG -aKL -bvt -aKY -aLc -acf -acf -acf -acf -axw -axE -axG -bso -aGX -rta -aRp -bgS -axm -hGn -bft -axm -bDS -axm -axm -axm -axm -bxw -axm -axm -axm -axm -bHW -bHb -bft -bHp -axm -awn -bRD -bGM -aXS -btj -aIn -axM -aTK -bfI -aHn -aNO -aHW -bCg -ahT -akT -bGU -bGX -akl -akl -akl -akl -ahT -ahT -aoh -aoY -aoW -caU -aqk -bfa -aKs -aoh -aBx -bYU -aUk -aUk -aUk -aUk -bpR -bUF -aUC -bbt -bby -bbA -aUH -bLs -aUk -aaa -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -avP -aaa -aal -adF -anD -bNj -anD -anB -aal -aaa -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(118,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aVc -avY -bvK -avi -blN -aaT -bQq -acf -acf -acf -acf -acf -aqW -asM -ank -aAz -acf -acf -acf -acf -acf -acf -acf -bDM -arA -bfu -bGs -bso -bDs -bth -axm -axm -aRq -aVz -aLn -aLn -aLn -aLn -aLn -aLw -aLy -aLy -aLF -bxx -aLw -aLy -aLy -aLF -aLn -aLn -aLn -aLn -aLn -axL -aHH -axm -axm -buB -btc -btc -bxN -bfV -ceB -aUZ -azH -bCi -ahT -bho -akE -bGY -alb -alb -amr -bfh -ahT -aoe -aoe -aoZ -aoW -aKu -aoW -bfb -aoW -aoh -aBx -bPd -aUk -aUn -bbm -aUk -bpS -bVg -aUD -bbu -aUI -aXg -aXh -aUH -aUk -aal -aal -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aal -bML -bNd -bMO -aal -bML -bNd -bMO -aal -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(119,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avB -avY -bvK -avi -bfS -bQo -bQr -acf -ack -atr -bqa -acf -aih -bqP -asP -axH -bgf -aCo -byy -acf -acf -acP -arA -awO -bso -rta -ueN -bth -axm -axF -aaT -aaT -aRw -aaT -aLn -aLs -bvC -aLs -aLs -amq -aLs -aLs -aLs -bvu -aLs -aLs -aLs -amq -aLs -aLs -bvC -aLs -aLn -aaT -cbT -aaT -cbX -axL -bPx -awn -btt -beQ -ceC -bxN -aUM -bGx -ahT -akE -ahT -bGZ -akW -bRM -akW -akl -eKx -akW -akW -api -apZ -bbZ -bfd -bHa -aMO -aoh -aBx -bPe -bWA -aUw -bbp -bpP -bxk -bVn -aUG -bbv -aXg -bMj -aXi -bvM -aUk -aaa -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -bML -bNd -bMO -aal -bML -bNd -bMO -aaa -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(120,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -bcB -avY -bvK -avi -bfS -aaT -bQs -aaA -bQn -bQn -ack -brf -asb -asQ -asP -aAC -acf -aKH -acf -acf -acP -awO -bso -rta -btg -axm -bPv -axF -aaT -aaT -aaT -aRk -aSz -bQr -aZb -aLs -aLs -aLu -aLs -aLx -aLB -bvo -bvo -bxy -bvz -bvz -bvA -aLQ -aLs -aLR -aLs -aLs -aZb -bQr -aRA -aaT -aaT -aaT -aaT -bHE -bHk -axm -awn -btt -btc -bGT -bfw -akG -amT -bGW -akl -akl -akl -akl -akl -akl -akl -akl -akl -akl -aql -aql -bsz -ahT -aBx -bPg -aUk -aUo -bbo -aUk -bpY -bbs -aUC -bbw -aXh -aXg -aUI -aUH -aUk -aaa -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -bML -bNd -bMO -aal -bML -bNd -bMO -aaa -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(121,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avB -bvF -bvO -avi -avI -aaT -aaT -acf -acf -acf -acf -acf -acf -acf -aKM -axH -acf -acf -acf -acP -awO -bso -bsq -axp -axt -aaT -aaT -aaT -aaT -bRT -bRU -aRl -bQr -bQr -aLn -aLs -aLs -aLu -aLs -aLx -bvu -aLC -aLG -byv -aLG -aLC -bvB -aLQ -aLs -aLR -aLs -aLS -aLn -can -aRA -aaT -bKd -caq -afa -afa -afa -afa -azE -azP -azR -bGz -akD -bGE -bGW -akl -byd -alq -amD -akl -all -alq -amD -bbQ -byd -alq -amD -aql -boa -ahT -vcT -bsA -aUk -aUk -aUk -aUk -bto -aUz -aUD -bbx -bbz -bbB -aUH -aUH -aUk -aal -aal -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aal -bML -bNt -bMO -aal -bML -bNd -bMO -aal -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(122,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avi -aaW -avi -aaW -avi -aaa -aaa -aaa -avi -aaW -avi -aaW -avi -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aVd -avY -bvK -avi -bfS -bQr -bQr -bQr -bQr -bQr -cRz -bgA -acf -aus -auz -aBp -asb -acf -acf -awO -bso -bsV -axk -bxA -bxD -auJ -auJ -bSp -aXG -bTm -bQr -aRl -bQr -bmx -aLn -uaG -aLs -aLB -bOv -cax -bvw -aLD -aLM -aLE -aLO -aLC -bvB -amq -bOy -byz -aLs -jJz -aLn -bQj -aRA -aTo -bQr -bSb -afa -akx -amv -afa -aoA -aoE -azE -azR -rDY -aUv -bGr -bGU -bGU -bGU -aXf -caQ -bZT -baK -caQ -bbg -bbJ -bgb -bgb -bib -biQ -bAM -bGe -bGg -bMr -bPh -bQF -aUk -aUk -aUk -aUk -aUk -aUk -aUk -aUk -aUk -aUk -aaa -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -aal -amO -anD -bNg -anD -anz -aal -aaa -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(123,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avi -bcN -avi -bcN -avi -bcc -avO -avu -avi -bcX -avi -bcX -avi -bcc -avO -avO -avu -avi -avi -bcc -avO -avO -avu -avi -avU -aMe -avi -azL -bRE -aCt -bRE -bRE -aCt -aGx -bmx -acf -aut -axg -aCs -asP -bli -bfC -bso -hYI -axh -bxA -bxC -avo -avs -auJ -kaB -bLB -bTn -aRu -aRl -aaT -aLm -aLm -aLm -bHC -bHH -aLm -aLm -bvv -bHJ -bHK -aLE -bHK -bHL -tzD -aLn -aLn -aLn -aLn -aLn -aLn -bQg -bmo -aaT -bQr -aBH -afa -bUo -akp -bnS -aoC -aoF -aoE -azE -azR -rDY -iMs -aAv -all -alq -amD -akl -byd -alq -amD -akl -bbY -alq -amD -aql -bHe -ahT -aBx -aBx -bYK -bba -bQR -azH -bRS -bRQ -azH -aaa -aaa -aaa -aaa -aaa -aal -aaa -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -aal -aal -bML -bNd -bMO -aal -aal -aaa -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(124,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avi -awl -avi -aQS -avi -aQS -avi -aza -aPK -aza -avi -aQS -avi -aQS -avi -aQi -aPK -ceV -ceV -ceV -bfA -ceV -ceV -ceV -nCF -avi -avY -bvR -avi -avi -avi -avi -avi -avi -avi -bfS -bQm -acf -bgd -aut -aKJ -aKS -aLq -btc -boj -bxq -axk -bxB -avk -avj -avy -aCz -aCz -aCz -aCz -bsg -aRo -fNR -aLm -ars -nZS -aLt -bvl -aLt -aLm -aLm -aLn -aLn -aLL -aLn -aLn -aLn -aLn -pkz -bQr -bRZ -bRZ -bRY -bWU -aRA -afa -afa -afa -afa -byQ -amA -akp -akp -bCE -aoF -aoE -azE -azR -aqe -bGr -bGU -bGU -bGU -bGU -bGU -bGU -bGU -bGU -aqh -bGU -bfe -bfe -bHf -xhI -xhI -xhI -xhI -bba -bCg -cer -bRP -bRR -azH -aaa -aaa -aaa -aaa -aaa -aal -aaa -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -bML -bNd -bMO -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(125,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -atz -awe -boD -awe -awe -agt -fSj -awe -aks -awe -abG -awe -aKK -awe -boD -awe -aLZ -awe -awe -awe -awe -awe -awe -awe -awe -bvQ -awe -bvK -bvQ -awe -awe -awe -awe -bUp -avi -bfS -bLj -acf -atd -aut -aCe -acf -acf -bAh -bDD -bxr -bxz -bxC -avj -avj -axN -aCz -aCC -aCC -aCz -aCz -bQr -aRl -aLm -bvj -bvk -bLR -bvm -aLt -aLt -aLz -aLn -aLI -aMS -aLP -aLn -cam -bLB -cby -vtD -cbC -vtD -anx -vtD -cbU -afa -jlL -akv -afa -akU -amA -bul -akp -akp -bCE -aoF -aQz -aAd -vmg -ark -akl -akW -bRM -bue -akW -akl -bRM -akl -bcb -bWp -xhI -xhI -xhI -xhI -bhw -dwg -xhI -bba -bQR -azH -bRP -bRQ -azH -aaa -aaa -aaa -aaa -aaa -aQX -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -bML -bNd -bMO -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(126,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avA -aam -awh -awh -awh -agu -ahH -ahH -ahH -ahH -ahH -abf -ahH -ahH -ahH -ahH -aMa -aMk -aMk -aMk -aMk -aMk -aMk -aMk -aMk -bwe -aMk -bvT -bvZ -bwc -bwf -bwg -bwf -bEE -avi -bfS -aDb -acf -aut -aut -aCe -acf -acP -awO -bsH -bxs -aLK -bjd -bva -bjc -bvd -aCB -bvf -avj -aCE -aCz -bQr -aYw -aLm -aHv -aHv -aLr -bpo -bvq -bvr -aLA -aLn -aLJ -aLU -aKC -aLn -aRA -aaT -aaT -acL -aoH -aaT -aaT -bSd -amM -bfT -aTB -bCy -afa -ale -aot -bur -aox -aox -aox -aoJ -aQA -aAd -ceE -ceG -akG -bZC -alu -alF -anJ -anJ -aoj -anJ -aqf -alF -xhI -bgp -bgu -nRb -qyl -bij -bry -bwy -bQS -aSh -aSh -aSh -aSh -aSh -aSh -aSh -aSh -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aug -aug -aug -aug -aug -aug -aug -aug -aal -bML -bNd -bMO -aaa -aQX -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(127,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avi -avi -bcc -avO -avO -avO -avO -avO -avO -avO -avO -avi -avO -avO -avO -avO -avO -avO -avO -avO -avO -avO -avO -avO -avO -avi -avO -avO -avi -byc -awe -aLY -awe -bwi -avi -bfS -bQr -acf -auu -auu -acf -aqn -ami -bdG -bsI -bPt -auO -buO -avd -bvc -bve -aLK -bvg -avd -aCM -aCz -bCh -aYG -aLm -aLp -byx -aET -bHI -bvs -bOx -bvx -aLn -aLn -aLn -aLn -aLn -aRA -aaT -aaa -aaa -aaa -aaa -afa -afa -bDc -afa -bCP -bum -buo -bup -buq -aoz -buv -buv -buv -buz -bez -bHr -bHs -bHw -bZY -alF -alF -alF -xhv -amU -amU -amU -bcz -bce -xhI -xhI -bgx -nuq -xyz -bim -xhI -hYj -bYW -aSh -bxg -bbh -aSA -aSw -aSF -aSH -aSh -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aal -aug -aeJ -aeJ -aeJ -aeJ -aeJ -aeJ -aug -bNu -aal -ahP -aal -aaa -aal -aaa -aQX -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(128,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avB -aLh -awe -awe -awe -bwj -avi -blN -bQr -acf -acf -acf -acf -acP -boo -bmV -bxO -auJ -auJ -ubS -avj -avd -avd -auO -bvh -avd -aCN -aCz -bQr -aRl -aLm -aLm -aLm -aLm -aLm -aLm -aLm -aLm -aaT -cxa -vtD -anx -vtD -aRv -aaT -aaa -aaa -aaa -aaa -afa -klG -caB -bCO -bCQ -aXd -afa -bCU -alZ -aNa -alZ -alZ -alZ -buw -aQA -aAd -rDY -bAL -aDj -eQp -aqT -bdz -bbM -bbM -bbO -bbM -bcD -bcI -bfR -xhI -bgJ -bhi -dtX -wrV -xhI -bYV -bCg -aSh -bxh -bbi -aSw -aSw -aSw -aSI -aSh -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aal -aal -bMG -aeJ -iif -oGu -cvc -aND -aeJ -aNJ -anD -anD -bNh -aal -aal -aal -aal -aaa -aaa -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(129,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avG -aLV -awh -awm -awe -bvK -avi -bfS -bQr -bCh -bQr -bQj -aaT -bfv -bna -axl -qpi -auJ -auQ -buZ -avm -avr -pSa -aCB -bvi -avj -aLl -aCz -bQr -rmC -ahW -boe -boe -lyr -boe -boe -nyL -boe -vtD -aRv -aaT -aaT -aaT -aaT -aaT -aaa -aaa -aaa -aaa -afa -bCG -aku -aku -aUg -bCz -afa -aow -amb -buj -caF -aoD -aoD -bux -aQC -azE -azR -alW -bCN -amF -amG -bbL -anL -anL -aol -apt -aqb -bcL -amU -bgt -bgx -lEx -bgx -bir -xhI -bba -bQT -aSh -bxi -aSB -aSC -aSC -bMi -aSJ -aSO -aST -aSX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aug -aug -aug -aug -aeJ -aqU -bLI -bOf -byJ -aNw -bLw -aNw -aNw -aNw -aNw -aNw -aNw -aal -aal -aal -aal -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(130,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -acc -acc -acc -acc -acc -awv -bvK -avi -aGH -bRE -bRE -bRE -bRE -aTr -bmX -bxI -bEY -aaT -auJ -auJ -auJ -auJ -auJ -auJ -aCz -aCC -aCC -aCz -aCz -bQr -aRA -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaa -aal -aaa -aaa -aaa -aaa -aaa -aal -afa -afa -afa -afa -afa -afa -afa -kVx -alZ -aNa -alZ -alZ -alZ -bux -aoF -aQz -aAr -vmg -axf -alV -bwA -amU -amU -amU -bbd -amU -amU -amU -bOA -xhI -bhe -pBI -bgx -pBI -brB -bbe -bQU -brA -bxj -bpO -aSK -bbk -bUs -bUt -bUu -bUw -aSP -aTa -aSP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aug -aNi -aNi -aNp -aeJ -rSs -bLJ -bOg -aNG -aNH -bLw -aNw -aNw -aNw -aNw -aNw -aNw -aNw -aNw -aal -aaa -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(131,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aci -blX -wxZ -blY -auC -awe -amV -avi -aaT -aaT -aaT -aaT -aaT -aaT -bxW -boi -bEZ -aaT -aQE -bQr -aBC -aaT -aXE -bmB -aCz -aCz -aCz -aCz -bQr -yjo -aRv -aBG -aal -aaa -aaa -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -aaa -aaa -aaa -aal -aaa -aal -aaa -aaa -aaa -aaa -afa -buI -amb -buj -aoD -aoD -aoD -buy -bzV -bCA -aAr -vmg -axf -alF -alF -aKF -anv -aog -blm -apw -aqc -bRy -alF -xhI -bhf -esU -fzs -bhi -xhI -bYV -bQV -aTn -aSv -aSx -aSU -aSx -aSx -aSL -aSQ -aTe -aSY -aTb -aSP -aSP -aSP -bUx -aal -aal -aaa -aaa -aaa -aal -aal -aaa -aaa -aaa -aaa -aal -aal -aal -aaa -aaa -aaa -aal -aal -aug -aNi -cdt -qWm -aeJ -asA -bLJ -aNw -aNw -aNI -bNb -aNw -aNw -bMM -aNw -aNw -aNw -aNw -aNw -aal -aal -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(132,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -acz -aeT -aMh -agA -bwd -aty -bwl -aMg -aMo -afG -bUq -auG -aFi -arA -bxX -afC -aae -aTr -acx -vtD -vtD -bSr -vtD -vtD -aRu -bSt -aBC -bQr -cxa -aRv -aBE -aBF -aaa -aaa -aaa -aaa -aal -aal -aal -aal -aal -aal -aal -aal -aal -aaa -aaa -aaa -aal -aal -aal -aal -aaa -aaa -aaa -aaa -afa -alZ -alZ -bus -bJV -bxn -alZ -aqG -aoD -bCB -aAr -vmg -awZ -bZJ -amP -acj -acj -acj -acj -acj -acj -acj -acj -acj -xhI -xhI -xhI -xhI -xhI -bba -bQX -aSh -aSh -aSw -aSV -aSD -aSD -aSM -aSR -bUy -aSZ -aTc -bSM -aTf -aTg -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aug -aug -aNo -aNq -bLg -aeJ -aeJ -bLK -aNw -aNw -aNw -bZN -bJv -bJw -bJx -bMd -bMD -aNA -aNw -aNw -aNw -aal -aaa -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(133,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -acz -afH -bjx -bvU -bwk -byh -bwm -bxQ -bxM -bxM -bxR -ard -byw -ark -abP -bot -axb -aaT -bfS -bQr -bCh -aaT -bSa -bQr -amM -vtD -mHD -vtD -aRv -aBE -aBF -aaa -aaa -aaa -aaa -aal -aug -aug -aug -aug -aug -aug -jVL -aug -aug -aal -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -aaa -aaa -afa -afa -ppV -aad -aad -aad -aad -aad -aad -aad -ydf -bCJ -iMs -aDl -aDo -aPp -aPy -aQR -aRI -vSP -baY -bcY -baY -acj -bMv -aBy -bRm -azH -bSY -bbb -bQY -baZ -aSh -aRi -aSW -aSE -aSG -aSN -aSS -bSw -aSQ -aTd -aSP -aSP -aSP -bUz -aug -aug -aug -aug -aug -aug -aug -aug -aug -aug -aug -aug -aug -aug -aug -aug -aug -aug -aug -aal -aNi -aNi -aNo -aNi -asx -hez -aNw -aNw -bZM -bNn -aNC -aNC -bJy -aNC -aNC -aNB -bZM -aNw -aNw -aal -aal -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(134,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -acz -agm -bvV -blZ -bCu -bxS -bwn -aMi -aty -aty -bxS -aMp -bZO -aeL -aff -apV -aaT -aaT -bfS -bQr -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aBD -aBF -aaa -aaa -aaa -aaa -aal -aal -bAC -uwV -uwV -gFA -gFA -gFA -uwV -uwV -aug -aal -aal -aal -aal -aaa -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aad -apT -apT -aNt -apF -xiu -aad -aad -buC -ptm -afF -aDo -aPq -aQF -asr -awL -asr -bbf -bbf -bbf -acj -bMv -aBy -bRm -azH -bSZ -aBx -bQX -bba -aSh -aSh -bbj -bbl -bbl -bbl -bUv -bUA -aSP -aSP -aSP -aSh -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aNg -aNl -aNh -aNl -atY -aNw -bJz -aNB -bJB -bOl -bOq -bLy -bMz -bMB -bMB -bMC -aNw -aNw -aNw -aal -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(135,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -acz -ago -bvW -bwa -bCv -byi -bwo -aMj -bjm -bwr -bxT -byo -bxU -bxU -arK -awV -aaT -sqt -wBW -bQr -aaT -aal -aal -aal -aal -aaa -aaa -aaa -aaa -aal -aaa -aaa -aaa -aal -aug -aug -tqi -uwV -tsa -gWa -gWa -hTm -dfK -uwV -aug -aug -aug -aug -aug -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aad -apT -apF -apF -apF -xiu -xiu -aad -anH -hNP -awb -fvY -aPr -aQG -ifH -fVo -gwx -bbR -bbR -bbR -acj -bTa -aBy -aBx -ceq -aBx -aBx -bQX -bYX -bbc -aYN -aYN -aYN -bTd -bYZ -aYN -aYN -aYN -aYN -aYP -aAc -aAc -aAc -aAc -aAc -aAc -bcG -bCW -aAc -aaa -aaa -aaa -aaa -aal -aaa -aaa -aaa -aaa -aal -aaa -aaa -aaa -aaa -aaa -aNj -bLb -bLd -bLb -byj -aNw -aNC -aNC -bNo -bOo -aNB -bMP -aNw -aNw -aNC -bMR -aNH -aNw -aNw -aal -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(136,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -ard -bcJ -atA -aaa -aaa -atA -bcJ -atA -aaa -aaa -aaa -aeQ -agT -bvX -byA -bCw -bxS -bwp -bxP -and -bym -bxY -byp -btc -btc -bAK -awV -aaT -aBC -blN -aWS -aaT -aaa -aaa -aal -aaa -aaa -aaa -aaa -aaa -aal -aaa -aaa -aal -aug -uwV -gFA -spN -uwV -lwp -dFi -vBp -dFi -tuR -uwV -gFA -gFA -gFA -uwV -aug -aug -aal -aal -aal -aal -aaa -aaa -aaa -aaa -aaa -aad -apF -app -amx -apS -amx -xiu -aad -bPB -vmg -aDl -aDp -aPt -aQH -asr -aRJ -ohU -bbX -bbX -bbX -acj -bTa -aBy -bZv -azH -bYK -aBx -bRb -bpu -bpz -bpA -bpA -bYY -bTe -bpA -bpE -bpJ -bZa -bpJ -bpN -bXv -bXv -bXv -asB -axK -aIz -bpg -bxd -aAc -aaa -aaa -aaa -aaa -aal -aaa -aaa -aaa -aaa -aal -aaa -aaa -aaa -aaa -aal -aNj -bZL -bLe -bLv -bLL -bOd -bOh -bOj -bOk -aNB -aNA -bJE -bMS -aNw -bMl -bMT -bMH -aNw -aNw -bNk -aal -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(137,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abm -aro -aty -auG -ave -auI -auG -aty -auG -ave -atx -auI -acc -acc -acc -acc -acc -bxS -bwq -aMl -aty -aty -aty -byq -ark -ark -vmg -bnq -aaT -bQr -bfS -aaT -aaT -aal -aal -aal -aaa -aaa -aaa -aaa -aal -aal -aal -aal -aal -aug -uwV -dCc -xaB -cvq -sEU -bPT -apg -rUR -lKk -qxF -snW -wvW -iCB -uwV -uwV -aug -uiU -aug -aug -aug -aaa -aaa -aaa -aaa -aaa -aad -aTW -fKt -bJF -uIu -hOQ -sxr -aad -anH -vmg -aDl -aDq -aPv -aQM -awQ -aRL -baq -acj -acj -acj -acj -azH -azH -azH -azH -azH -bQe -bRd -bXu -aAc -bXv -bXv -bXv -acj -acj -bCe -acj -acj -bXx -bph -axK -axK -bZb -aNv -bSR -aAc -buk -axK -aIz -aCu -aaa -aaa -aaa -aal -aaa -aaa -aaa -aaa -aal -aaa -aaa -aaa -aaa -aal -aNj -asC -bLf -bLH -bNp -aNw -aNC -aNC -bNq -bOp -aNB -oVG -aNw -aNw -aNC -aNB -aNw -aNw -aNw -aal -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(138,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abq -atv -atv -boF -aMb -aVj -aVw -aVj -aVj -aVj -aVj -aVj -bDJ -bvS -bvS -bvS -byf -byi -bws -aMm -aty -aty -aty -ard -anH -ark -dNx -awV -aaT -bQr -bfS -aaT -aaT -aaT -aaa -aal -aaa -aaa -aaa -aal -aug -aug -aug -aug -ugj -aug -uwV -tnz -fdM -oMf -szx -aHD -iJC -oAP -vdQ -bPV -bPV -bPV -xKE -qoF -uwV -tHJ -tHJ -tHJ -ykr -oDl -tKA -aal -aad -aad -aad -aad -aad -apn -aIS -apn -apn -aad -aad -anH -vmg -aDl -aDq -aPw -aQN -aQT -aRM -xLk -bcP -bgy -bgy -bgy -bgy -bgy -bgy -bHd -awG -acj -acj -acj -acj -acj -acj -acj -acj -aSn -bpG -aYy -acj -acj -acj -acj -acj -acj -bpL -bYO -aAc -bXv -ccB -aAc -aNy -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aNn -atY -bLn -aNl -skk -aNw -aNB -aNB -bJB -bOn -bOr -bOw -bOz -aNC -aNC -aNB -aNw -aNw -aNw -aal -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(139,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abq -aty -aty -aty -adv -bfx -aKU -aQs -bkS -bxM -afm -bxM -byb -bqq -bxM -bxM -byg -byk -oms -bqc -bqc -arX -aMn -aMp -arv -awF -vmg -arx -aaT -arw -ahu -bLB -aRu -aaT -aaT -aaT -aal -aal -aal -aug -uwV -uwV -uwV -uwV -uwV -uwV -uwV -iRE -oDI -vVH -iGJ -lEt -vUd -rwy -hmG -mFQ -miv -dZa -mFO -qxz -uwV -enD -psF -tHJ -mhi -wTx -gDW -aaa -aad -bHc -aUT -eRe -dUt -aTL -aTO -boO -boO -apY -aad -anH -vmg -aWV -acj -aPx -aQO -aRh -aYA -uTy -acj -acj -acj -acj -acj -acj -acj -avX -ayL -axo -axo -axS -axS -acj -ayp -bwR -aSk -aSo -bpH -azs -aDy -aDA -azj -cdL -cdL -acj -bpL -bXv -aAc -bcG -ccW -aAc -aCL -aNz -aNz -aNz -aNz -aNz -aNz -aNz -aNz -aNz -aNz -aNz -aCu -aal -aNi -aNi -aNf -aNi -asx -yfz -aNw -aNw -bZM -bNn -aNC -aNC -bMl -aNC -aNC -aNB -bZM -aNw -aNw -aal -aal -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(140,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -acO -abo -atx -auI -auG -auG -auG -auG -auG -auG -auG -auG -auG -auG -auG -auG -auG -auG -auG -auG -auG -auG -auG -auG -aAn -ans -vmg -awV -aeu -aeu -bok -aeu -amM -anx -aRu -aaT -aaa -aaa -aal -aug -uwV -vAo -vbr -pLI -amH -uwV -uwV -aav -fED -aaH -tlY -alj -vFq -alD -tlY -jvP -cZN -vjt -aaz -hfx -feu -etL -hLL -dlq -oCw -kMb -yeA -aal -aad -bPF -gxl -naO -aTU -fdn -oak -sLW -ceW -aqs -aad -anH -vmg -aWV -acj -bjq -bps -bps -aYB -brG -acj -asr -axP -bnB -bpq -rDp -bie -aRj -aSe -aSq -bpp -bpy -bpy -buX -bpC -bwS -bpD -bpC -bpI -azt -azJ -avb -aDD -cdM -ceL -acj -bpL -bXv -aAc -aal -aal -cdC -cdq -cdq -bAI -cdq -cdq -cdq -cdq -cdq -cdq -cdq -bAI -cdA -aCL -aNz -bJK -bJU -cdy -aNi -aNi -bOa -aNw -aNw -aNw -ceN -bME -esb -xyU -bMA -bME -aNA -aNw -aNw -aNw -aal -aaa -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(141,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aiE -aiS -awx -aBa -abD -aba -abK -aAh -bhj -byT -bza -bzy -bAQ -vch -byT -bEo -bEL -bEP -aAn -bFk -bGJ -bPj -bRI -bFf -aww -dNx -awW -aeu -arz -boC -aeu -aeu -aeu -aRA -aaT -aaa -aaa -aal -aug -uwV -amH -utg -jip -aSc -biF -cUe -cAa -csH -lhs -dZW -mXY -hVt -hVt -dZW -dEx -pgT -xBI -seX -ykD -uwV -aRS -apG -tHJ -mBI -uUp -gDW -aaa -aad -bPH -cDf -aor -dUt -aQn -aGV -aor -aor -bAE -aad -aDg -ceH -ceJ -acj -arQ -asr -asr -aRM -bgw -acj -bje -asr -bAb -awL -avg -atD -bsx -bsS -bwN -bwO -bsS -bsS -bwP -bwQ -bwT -ayJ -ayV -axz -azu -azK -aDA -aDH -cdL -cdL -acj -bZc -bXv -aAc -aaa -aaa -bMk -aal -aaa -aaa -aaa -aaa -aal -aal -aal -aaa -aaa -aaa -aal -cda -aug -aNi -cdu -cdw -aNi -bSH -bNR -aNw -aNw -aNw -bLw -aNw -aNw -bMN -aNw -aNw -aNw -aNw -aNw -aal -aal -aaa -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(142,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aiF -aiS -awy -aBO -aAh -aBO -aAh -age -bis -byP -bzb -bzA -bAS -bBF -bEj -bEt -bAo -bAo -bFi -bzh -bIv -bAo -bSk -bUG -aJa -byF -awX -arn -axd -boC -bsM -btr -aeu -aRA -aaT -aal -aal -aal -aug -uwV -qDQ -amH -amH -tus -aah -uwV -nIf -fED -dmV -dZW -hmV -rFm -rFm -jqp -dZW -dZW -uXm -seX -eyM -uwV -tHJ -tHJ -tHJ -bMK -rQo -yeA -aal -aad -aad -aad -aad -aad -wok -aor -aAm -wMf -boT -aad -aDh -vmg -aDl -acj -bSI -asr -asr -aZn -bpw -bcW -bpw -bgj -iUF -bhg -bhk -bif -bsy -ays -axq -axO -axT -ayd -axT -axO -ayu -ayI -ayW -azk -azv -bwv -acj -acj -acj -acj -acj -bXw -bXv -afc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -cdh -aug -aNi -aNi -cdx -aNi -mbB -bNR -aNh -aNs -aNw -bLw -aNw -aNw -aNw -aNw -aNw -aNw -aNw -aNw -aal -aaa -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(143,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abd -agK -aiG -aiS -aAf -aAh -aAh -aAh -aQc -aQp -bol -byR -bzc -bAe -bBh -bBG -bEk -bEu -bEM -bFg -cbv -bFl -bJQ -bEg -bUB -bUH -bEQ -bET -bsm -aru -aBB -bqh -bsW -bCx -aeu -aRA -aaT -aaa -aaa -aal -slb -uwV -amH -dfN -amH -maC -amH -gFA -nEo -nlD -aaG -alc -als -als -als -mpC -hAk -vPT -kuZ -seX -amB -gFA -aaa -aal -aaa -ykr -uUp -rcn -hRG -dUt -aZd -udR -dUt -nUo -wok -jZv -aad -aad -aad -aad -aDh -caO -awK -ayt -ble -bpw -brw -brD -asr -acj -atf -atB -atZ -auM -avh -asr -awf -ayz -axr -axO -axO -bMh -axO -axO -brU -ayI -awf -azl -azw -azM -aDA -aDI -cdN -cdN -acj -bXw -bXv -aQJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -cdr -cds -cdv -aug -aNi -asz -bOb -bOi -bLu -aNw -bLw -aNw -aNw -aNw -aNw -aNw -aNw -aal -aal -aal -aal -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(144,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abg -ahs -abg -aiU -awy -aBO -aAh -aBO -aAh -agc -boq -byS -bze -bAf -bBi -bEb -byS -bEv -bEN -bFc -bFh -bFm -aFB -bPn -bPn -bUI -bER -bEU -awX -arn -axd -boC -bti -mKc -aeu -aRA -aaT -aal -aal -aal -aug -uwV -nyx -oqE -aRx -maC -aRx -gFA -mJV -eiC -son -boA -nNJ -jxP -nNJ -cLX -nNJ -skl -rJs -qOX -nsr -iGD -pwb -pwb -pwb -wIl -aph -xLt -xLt -aNT -viK -piG -apx -bzK -tpd -jHY -aad -ugT -ybh -aad -bjp -qlL -bDk -cdQ -bDm -asr -brz -asH -asJ -acj -atg -atC -srD -auN -avl -avK -awf -ayz -axv -axO -axU -axU -ayk -axO -ayx -ayI -awf -azl -azx -azN -avb -aDJ -ceK -ceM -acj -bTO -bYO -aQJ -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aal -aal -bMI -aNi -wod -uzp -odJ -aNu -aNi -bNr -anD -anD -bNi -aal -aal -aal -aal -aaa -aaa -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(145,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abe -abi -ahG -aiH -aji -omI -afw -aAh -aPR -aQd -aQr -brY -byT -bzf -bAg -bAg -bEc -byT -bEw -bAo -bAo -bFi -bzh -bJS -bAo -bUC -bUJ -bwY -aff -awY -aeu -aBX -boC -aeu -aeu -aeu -aRA -aaT -aaa -aaa -aal -aug -uwV -amH -yhe -amH -maC -amH -gFA -fis -waf -gPD -mgs -sYx -sYx -sYx -pyl -gNl -tBY -wzU -tTb -amB -gFA -aaa -aal -aaa -ykr -mjA -vyZ -iUZ -dUt -biI -emg -dUt -apf -aRs -apM -bwV -aoq -bEr -moO -mUy -ceI -afF -acj -ayq -ass -eoH -acj -acj -ath -atk -atD -aub -auP -avv -avL -awg -brK -axz -bpt -axV -aye -axV -bvI -auP -ayK -ayY -azm -azy -azO -aDA -aDK -cdN -cdN -acj -bTP -bXv -aQJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aug -aNi -aNi -aNi -aNi -aNi -aNi -aug -aal -aal -ahP -aal -aaa -aal -aaa -aQX -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(146,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abd -aia -aiI -alO -aAh -aAh -aAh -aXL -aAh -aAh -bsn -aiI -bzg -bAi -bBj -bEd -bEl -bEx -bAo -bFd -bFj -bFl -bJT -bEg -bVy -bUK -bES -bVz -awV -aeu -aeu -bok -aeu -aZp -vtD -aag -aaT -aaa -aaa -aal -aug -uwV -amH -amH -amH -maC -jsv -uwV -nIf -fED -dmV -dZW -nBZ -qag -qag -pGQ -dZW -wUt -cxK -tTb -vLE -uwV -tHJ -tHJ -tHJ -bMK -lzq -yeA -alN -aad -aad -aad -aad -qMo -okf -sZm -aad -xGM -bDl -aad -bjp -aeo -aDl -acj -bHx -arW -bRw -acj -asK -ayL -ati -atE -aue -auR -avw -avN -awi -brL -axA -bpZ -asr -bRs -asr -bpZ -ayA -azq -awf -awp -azz -azQ -acj -acj -acj -acj -acj -bpL -bXv -awu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aug -aug -aug -aug -aug -aug -aug -aug -aal -bML -bNe -bMO -aaa -aQX -aQX -aQX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(147,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abi -ahG -aiH -ani -aAg -aBO -apc -aPU -bVt -bVu -bVv -bVw -bFl -bEg -bVx -bEg -bEg -bEy -bEg -bFe -bFi -bFp -bMm -bRH -bUD -bUG -awA -bom -bcw -aaT -bKd -bqi -bLB -aRv -aaT -aaT -aaT -aal -aal -aal -aug -uwV -eCr -soJ -poI -xUj -cla -ooZ -ice -esp -jLo -dZW -fAP -hVt -hVt -dZW -sKR -eRs -smc -tTb -ykD -uwV -uYg -dpg -tHJ -eqa -mjA -gDW -aaa -aad -moJ -vjX -vAj -aUU -boH -oIG -aad -aad -aad -aad -aDh -aeo -aDn -aMP -aMP -aMP -aMP -aMP -aMQ -aYI -atj -atF -aud -auS -avx -avR -awj -brM -atL -axQ -axz -axz -axz -ayy -atL -ayM -ayZ -azm -azA -aCV -aDB -aDE -axn -acF -acj -bpL -bYO -bwZ -aAc -aAc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -bML -bNe -bMO -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(148,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abj -aib -abj -aqw -awy -afW -aAh -aPV -aAh -afX -btL -byV -bzr -bAG -bBl -bAG -bAG -bEz -bEO -aAn -aAn -aAn -aAn -aAn -aAn -aAn -bjn -aeo -awV -aaT -bQr -bfS -aaT -aaT -aaT -aaa -aaa -aaa -aaa -aal -aug -uwV -jSs -kAU -mHo -qBm -uwV -uwV -aax -abY -amB -tlY -skG -cOZ -rLt -tlY -hTF -fpA -amS -aKQ -nnE -szT -oVd -hZC -dlq -vvH -fWk -yeA -aal -aad -blb -aor -aor -aor -hrD -aor -aor -aor -aTJ -ofx -cdP -aeo -axf -aMQ -bzX -bzY -blf -bpj -awH -aYJ -bJP -atG -aue -auT -avz -avS -awo -brN -awQ -awQ -brO -brO -brP -brQ -brR -ayN -asr -azl -azB -aDw -avb -aDF -acF -aDM -acj -sTB -bPi -aAc -bxc -aAc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -bML -bNe -bMO -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(149,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abd -agK -aiJ -asq -aAj -aAh -aAh -aPW -aQe -bgz -bun -byX -bzh -bAo -bBn -bAo -bAo -bEH -aAn -aAn -bAk -bDG -bUL -bUU -bAk -bzq -awI -aeo -bFs -aaT -bCh -bfS -aaT -aaT -aal -aaa -aaa -aaa -aaa -aal -aug -uwV -uwV -uwV -uwV -uwV -uwV -uwV -iXv -vpa -amL -cYx -bPW -cgH -fVB -fVB -hKj -uqn -sjB -tTb -oij -uwV -eVJ -jdu -tHJ -mXO -iUZ -aaa -aaa -iIq -dUa -aor -vzQ -mGm -ruT -arB -aor -aor -arE -aad -uQL -aeo -axf -aMQ -bZA -bzS -aMU -bzZ -bRx -aYK -bnl -asr -auf -auU -avC -avR -awp -awR -awR -awR -axX -awR -awR -ayO -aYz -ayO -awR -azn -azD -aDx -aDC -aDG -acF -acF -acj -bpL -bXv -cbt -bXv -cbu -bDd -aaa -aaa -aaa -bHY -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -aal -aal -bML -bNe -bMO -aal -aal -aaa -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(150,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aiF -asq -awy -aBO -aAh -aPX -aAh -agv -aAh -aiK -bzs -bAJ -bAJ -bAo -bEm -bEI -aAn -bAy -bAl -bAy -bUM -bAy -bUY -bzq -awI -bom -awV -aaT -bQr -bqm -aXF -aaT -aal -aal -aal -aaa -aaa -aaa -aal -aug -aug -uwV -uwV -oAn -uwV -uwV -osG -gbC -amu -vQd -amu -jws -ifP -kcd -xdQ -aaf -seG -aat -dzi -uwV -tHJ -tHJ -tHJ -aal -aaa -aaa -aaa -elZ -mUn -aor -aor -apq -upM -apQ -mXC -aor -wll -aad -bPC -aeo -bpe -aMQ -bGw -aMU -aMU -bpl -bAa -aYK -att -atK -aui -auY -avD -avT -awr -awS -axB -axR -axY -ayf -ayl -axR -ayB -ayQ -azc -azo -azF -brX -acj -acj -acj -acj -acj -bZc -bXD -aAc -bxd -aAc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -aal -adF -anD -bNj -anD -anB -aal -aaa -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(151,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aiK -asq -abM -aAh -aPO -aPZ -aQl -bgB -bwh -aiI -bzt -bAP -acV -bAo -bEn -bEJ -aAn -nDW -bBp -bBe -bUN -bAT -bAT -bzq -bjo -aeo -awV -aaT -dXK -bqp -aRA -aaT -aaa -aaa -aaa -aaa -aaa -aaa -aal -aal -aug -aug -uwV -uwV -uwV -uwV -uwV -pSm -oVP -qZu -knv -alv -eFB -lxq -mNC -mpx -nPz -euN -uwV -uwV -aaa -aal -aal -aal -aal -aal -aal -pmD -hAI -vRP -vRP -vRP -vmc -aor -aor -apq -oWa -aad -jzE -bDO -bpd -bpf -gJo -bpi -bpi -bpm -itU -aYK -atu -atL -auD -ava -avE -avW -aws -awT -axC -brZ -axZ -ayg -ayv -awT -ayC -ayR -azh -awT -awT -aDz -acj -asB -axK -axK -axK -bpM -bKt -bcC -bcC -bcC -bcC -bcC -bcC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aal -bML -bNe -bMO -aal -bML -bNv -bMO -aal -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(152,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aiI -aiI -aiI -aPB -aPP -bAr -aQm -adE -afV -aQm -aQm -aQm -aAn -ace -aAn -aAn -aAn -bBc -bBv -bDH -bUO -bUO -bUO -bVa -aeN -bUb -apV -aaT -aaT -bqC -aRA -aaT -aal -aal -aaa -aaa -aaa -aaa -aal -aaa -aal -aug -aug -lND -aug -uwV -uwV -dpT -uwV -uwV -amH -fOk -maC -uwV -uwV -dpT -gFA -gFA -uwV -aal -aaa -aal -aaa -aaa -aaa -aal -aaa -aad -apC -aUO -aTS -aor -hpU -apu -jVA -wQC -aad -aad -bHF -afE -afL -aMQ -tok -aMU -bDe -aMZ -aNe -aYK -acj -acj -auE -avb -avF -acj -awt -avb -avF -acj -awt -avb -avF -acj -awt -avb -avF -acj -acj -acj -acj -bpL -bXv -bYO -bXv -bXv -bZz -bcC -bwK -bCV -ccH -ccK -ccO -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -bML -bNe -bMO -aal -bML -bNw -bMO -aaa -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(153,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -auV -aAl -abR -abS -bBk -afS -afU -aQf -bzu -bUE -aQm -eSa -aup -bzq -bAm -bAR -bBd -bBw -bAx -bAT -bAT -bAT -bVb -awI -bom -awZ -axe -aaT -bqC -aRA -aaT -aal -aaa -aaa -aaa -aaa -aaa -aal -aaa -aaa -aal -aal -aal -aug -aug -aug -jsm -uwV -amH -bPY -bPO -pGU -bSK -uwV -jsm -aal -aal -rPx -aal -aaa -aal -aaa -aaa -aaa -aal -aaa -qXl -anG -apO -apO -kAG -feg -wpG -tcB -apO -apO -aze -awO -aeo -axf -aMQ -aMQ -bga -aMQ -aMQ -aMQ -aYL -aAc -acj -auF -avc -avH -acj -acv -aeV -axj -acj -axD -ayc -ayj -acj -ayn -ayF -azi -acj -bcg -axK -bZb -bpM -bXv -bcC -bcC -bcC -bcC -bcC -bDr -caw -bcC -ccL -ccP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -bML -bNe -bMO -aal -bML -bNe -bMO -aaa -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(154,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -auV -abh -aPG -abT -bBk -afS -apl -anV -byt -bzv -aQm -bdy -agg -bzq -bAs -bAl -bAy -bBx -bAy -bAl -bAT -bUZ -bzq -bLc -bon -bou -aRn -aTr -bqZ -bfB -aaT -aaT -aaa -aaa -aaa -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -aal -aal -aal -jsm -uwV -qkE -jGy -uzT -uzT -jQo -uwV -jsm -aal -aaa -aaa -aal -aal -aal -aal -aaa -aaa -qXl -qXl -qXl -nyj -apO -apz -xRV -nEL -boG -boS -bob -apO -bHt -bCL -bDP -bZK -aAc -vBQ -bDn -aAc -bgC -bSD -bSE -bMu -acj -auL -auL -auL -acj -bFq -anM -bSf -acj -axJ -ayh -axJ -acj -ayD -ayS -ayD -acj -bcq -bXv -bSS -bST -bST -bcC -bwG -bwK -bCV -bCV -bDv -ccE -ccI -ccJ -ccQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aal -bML -bNe -bMO -aal -bML -bNe -bMO -aal -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(155,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abk -aie -aiL -auV -aAp -aiw -abT -agG -aQm -adX -aEC -byt -bzw -aQm -bse -bzq -bzq -bAt -bAk -bAx -bBy -bAx -aaP -aaP -aaP -aaP -aaP -abF -aqF -aRO -aaT -bSj -aRA -bsp -aMq -aal -aMz -aMC -aMC -aMv -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aal -jsm -uwV -uwV -gFA -gFA -gFA -uwV -uwV -jsm -aal -aaa -aaa -aal -aaa -aaa -aal -aal -aal -hXd -qqo -sEr -nyj -apO -leR -xRV -aTI -bEV -caM -aUV -apO -bHu -aeo -axf -bZZ -aAc -bYI -bXv -aAc -caa -aYF -aYM -bxd -acj -auL -avf -auL -acj -acT -acT -acT -acj -aya -ayi -axJ -acj -ayD -ayT -ayD -acj -bpL -bYO -bcC -bcC -bcC -bcC -bwH -bxb -bCY -bDb -bDy -ccF -ccJ -ccM -ccR -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -aal -amO -anD -bNl -anD -anz -aal -aaa -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(156,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abl -ain -aiM -auV -aAq -aiw -abT -bVs -aQm -tOh -byB -aQj -bzx -aQm -bse -bzq -acG -bAw -bAl -bAy -bBz -bAy -aaP -fiC -afe -axa -aaP -act -bsi -bsL -aaT -aaT -aTs -bPM -aMq -aMt -aMA -aMG -aMD -aME -aMv -aal -aaa -aaa -aaa -aaa -aaa -aaa -aal -jsm -aug -aug -aug -aug -aug -lND -xbA -lOW -aal -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -qXl -qXl -qXl -opl -apO -lKe -xRV -rFt -bfW -aVD -bnZ -apO -awI -bjP -bov -bpF -bGv -bhn -bXv -aAc -aAc -cbM -aAc -aAc -acj -acj -acj -acj -acj -acj -acj -acj -acj -acj -acj -acj -acj -acj -acj -acj -acj -bpL -bPi -bcC -bcT -bdg -lEO -bwI -bxe -bCZ -bDg -bDz -bDz -bDz -ccN -bcC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -aaa -aal -aal -aal -bNm -aal -aal -aal -aaa -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(157,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abb -abn -aiw -aiw -avV -aAs -amh -abT -abV -aQm -aQm -aQm -aQm -aQm -aQm -gsu -bzq -bzN -bAx -bAk -bAx -bBA -bEh -aaP -alC -afh -axs -aUJ -akm -bsk -bsw -ltw -aaT -aMq -aMq -aMq -aMx -aMu -btw -aMu -bCK -aME -aMv -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lFs -xbA -wmg -xbA -wmg -xbA -wmg -iiw -aaa -aaa -aaa -aaa -anX -anX -anX -anX -anX -aaa -aaa -aaa -qXl -nyj -apO -aoU -hSe -fzV -sfa -kTN -apO -aze -bAN -bDE -axf -aAc -awJ -ayH -aRd -brl -aRd -bhl -aRd -aRd -aRd -aRd -axi -bil -acj -aal -bXZ -aal -acj -bWG -bYL -aRd -aRd -bXj -aRd -aRd -aRd -bca -bcA -bcS -bdf -tzv -bwF -bwJ -bxf -bxf -bDq -bDA -ccG -bcC -bcC -bcC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -avP -bNs -aaa -aal -aal -aal -aaa -aaa -avP -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(158,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abI -aiC -aiQ -auV -bVA -aiw -abT -aiw -abX -bAD -bcR -bcR -akP -akP -bEf -bzq -bzO -bAy -bAl -bAy -bBz -bEi -aaP -afd -caZ -azp -aaP -aoK -aqX -bwB -bDL -aaT -aMq -lzi -bOs -aMu -aMu -btx -aMu -aMu -bCR -aME -aMv -aaa -aaa -aaa -aaa -aaa -aaa -ycZ -qYJ -dnN -qYJ -dnN -qYJ -dnN -qYJ -wmg -aaa -aaa -anX -anX -bzJ -bcy -bzM -anX -anX -aaa -aaa -qXl -nyj -apO -apO -apO -apO -apO -apO -apO -aIX -bHv -awU -bEa -aAc -bZl -bSQ -bSW -aAc -bXt -bXv -bXv -bYO -bXv -bXv -bXv -biu -acj -bPb -atC -auN -acj -biu -bXv -bXv -bYO -bSR -bXv -bXv -bYO -bXv -bXv -bcC -bcC -bcC -bcC -bcC -bCT -bDa -bDa -bZy -bcC -bcC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -avP -bNs -aaa -aaa -aaa -aaa -avP -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(159,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -agw -aiD -aiL -auV -bVB -aPH -abU -aPH -auV -uRy -aup -aTk -bXp -aCU -aPL -bzq -aey -bAx -bAT -bAT -bBA -bEp -aaP -czY -aPu -azr -aaP -aqZ -awN -bwC -bsN -bPu -aMr -aMu -aMu -aMu -aMu -bty -aMu -aMu -aMu -aMH -aMI -aaa -aaa -aaa -aaa -aaa -aaa -xWs -qYJ -ixd -qYJ -ixd -qYJ -ixd -qYJ -oHN -aal -anX -anX -bck -bct -bct -bct -bck -anX -anX -aaa -qXl -rYP -sos -sos -sos -sos -xXZ -aRD -aze -awO -bHv -bHw -aOp -aOp -aOp -aOp -aOp -aOp -aOp -aOp -aOp -aOp -aOp -bRc -bXv -bow -brl -aRd -aRd -aRd -aRd -bWH -bXv -aAc -aAc -aAc -aAc -aAc -aAc -aAc -aAc -aAc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -avP -avP -avP -avP -avP -avP -avP -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(160,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -auV -aAt -aPI -aga -aPI -auV -bse -aup -agh -agh -agh -agh -agh -bzP -bAy -bAT -bAT -bBz -bEq -aaP -afg -afi -afl -aiR -aaP -aoK -bDC -bDT -bsR -agn -bsu -bsu -btu -bsu -aZj -btB -btD -btF -aMG -aMI -aaa -aaa -aaa -aaa -aaa -aal -euD -qYJ -dnN -qYJ -dnN -qYJ -dnN -qYJ -wmg -aaa -anX -aTy -aOf -bcf -bJR -btn -but -bcE -anX -oPe -oPe -oPe -oPe -oPe -oPe -oPe -nVf -qXl -kmI -ark -aZm -bCN -bGm -bGn -bGo -aOp -bHy -aOX -bJW -xDp -bjW -aOO -aOp -aOp -aAc -bZS -aAc -bZw -bSN -bYO -bXv -bXv -bXv -aAc -cav -bXv -bYh -aAc -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aQQ -aQQ -aQU -aQQ -aQQ -aQQ -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(161,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -auV -agh -agh -agh -agh -agh -bse -aHL -agh -byW -bzd -bzd -bzB -bAc -bAx -bAT -bAT -bBA -bEA -aaP -afg -aaY -aaY -aaY -aaY -aaZ -act -azC -bsT -aMt -aMv -aMu -aMu -aMu -aMu -aMu -aMu -aMu -aMz -aMJ -aaa -aaa -aaa -aaa -aal -aal -aaa -qLM -ixd -qYJ -ixd -qYJ -ixd -qYJ -sxJ -aaa -anX -kvC -bbD -bzL -bLY -bct -bcl -bbF -anX -acZ -aQy -btM -cNG -ufN -aQw -oPe -qXl -qXl -bPz -ceD -ceF -axf -aOr -aOt -aOt -aPd -aPe -aPe -aPe -aZe -aZk -aZk -bhQ -biO -bik -bpr -big -big -big -big -big -cau -bXv -ces -bXv -bXB -bYi -aAc -aaa -aaa -aaa -aaa -aaa -aal -aaa -aaa -aal -aal -aal -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(162,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -agh -adR -agZ -bgK -agh -bse -aRQ -agh -bVe -bVD -bVD -bWt -agh -bVG -bAT -bAT -bBz -bzq -bUP -bUP -aaY -abQ -oee -afb -aaZ -act -azC -bsN -axe -aMw -aMv -aMu -aMu -aMy -aMu -aMu -bCS -aMB -aal -aaa -aaa -aaa -aaa -aal -aaa -aaa -aal -euD -icc -ycZ -icc -ycZ -icc -aal -aal -anX -bcj -bcl -bct -bcn -bct -bcl -bOe -anX -aeG -bbG -btN -btP -btS -btW -btX -btY -btZ -bGq -aVM -aWh -bCN -aWR -bGn -bGn -aZO -caR -baJ -baJ -bbn -bcH -baJ -bia -aOp -bXv -bpK -big -xrC -brC -brT -big -aAc -aAc -aAc -aAc -aAc -aAc -aAc -aaa -aal -aal -aaa -biw -bNB -bix -aaa -biw -bNB -bix -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(163,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -agq -aaV -aPM -agh -agh -bAH -agh -agh -bEB -bzi -bzm -bWu -agh -aeK -bAU -bAT -bBA -bzq -bUQ -bUV -aaZ -abW -aVa -afk -aaZ -aSl -aSd -bsO -bsX -axe -aMw -aMv -aMu -aMu -aMu -bOt -alk -alk -alk -alk -alk -alk -alk -alk -aRY -aSb -aSa -aaa -aaa -aaa -aal -aaa -aal -aaa -aal -anX -anX -bcp -hdH -bcn -bcl -bcx -anX -anX -aeR -ats -bLZ -btQ -btT -acZ -cbY -awI -fkV -rta -aVO -aWi -ark -aOq -aOt -aOt -aOt -bye -aOP -aOP -aZf -aOP -aOP -bye -aOp -bXv -bpX -bih -biA -brE -brV -big -aaa -aaa -aal -aal -aaa -aaa -aaa -biw -bNB -bix -aal -biw -bNC -bix -aal -biw -bNC -bix -aal -aQQ -aQQ -aQQ -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(164,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abp -afR -ags -agZ -byl -agh -adS -bVi -bVk -agh -akY -agZ -bzn -bWM -bAd -bAz -bAX -adA -bSO -bEC -bUR -bUW -aaZ -acs -aVy -bzH -aaZ -aaZ -aoK -aSd -bsY -awZ -axe -aMw -aMv -aMu -aMu -bCI -alk -arg -ary -arJ -wkM -ast -asu -alk -pMU -aTu -aSa -aal -aaa -aaa -aal -aaa -aal -aal -aal -aal -anX -anX -anX -bcu -anX -anX -anX -acZ -acZ -atJ -atI -btR -aQv -bub -aze -awO -vmg -ark -axf -aqz -aqz -aqz -aqz -aqz -aOH -aOQ -aOQ -aPb -aZg -aOH -aOQ -aPb -aOp -bXv -biu -big -biC -brF -brW -big -aaa -aaa -biw -bNB -bix -aaa -aaa -biw -bNC -bix -aal -biw -bNC -bix -aaa -biw -bNC -bix -aal -aaa -aaa -aal -aQU -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(165,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -afP -afY -agx -agZ -byU -amK -bTW -awz -bTW -anK -bVp -bzj -bzo -bWM -bAj -bAx -adn -adn -bBH -bzq -bUS -bUS -aaZ -anT -atH -cbc -bsv -aaZ -aaZ -act -bsZ -btc -bte -axe -aMB -bCC -aMr -bFr -alk -arh -ahv -ahY -arM -bug -aTv -alk -aRZ -bBo -aSa -aSa -aSa -aSa -aSa -aSa -aSa -bQd -aSb -aSa -aSa -cel -cak -ceo -btV -btV -bBU -ibF -acZ -acZ -atM -aQu -aQx -aze -awO -fkV -hYI -awU -bfJ -aqz -biy -bjb -aPi -aqz -bjU -aZh -bjz -aOI -bjF -aOI -bRz -bjM -aOp -bXv -biu -big -bja -brH -bsB -big -aaa -aal -biw -bNC -bix -aal -aal -biw -bNC -bix -aal -biw -bNC -bix -aal -biw -bNC -bix -aal -aal -aal -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(166,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abp -afR -agy -agZ -bzp -agh -bVh -bVj -bVl -agh -bVr -bWr -bWs -bWN -bWP -bWQ -bWR -bWR -bWS -bED -bUR -bUX -aaZ -acu -aVH -bsb -bsD -bsJ -bst -bsa -bsl -ark -bna -awZ -arA -arA -arA -atb -alk -ari -arF -anc -bJu -arL -asw -bdD -aRZ -aSg -aSj -cad -aSj -aSj -aSj -aSj -cah -caj -cak -ccT -ccV -cen -aRZ -bbE -cao -aRZ -buE -cap -aSa -axc -bPw -arA -arA -buH -btc -oNF -azf -azg -aqz -aqz -aPh -aPh -aPh -aqz -aOI -aZi -aOY -aOI -bjG -aOI -bjK -bjN -aOp -bsC -biu -bii -boh -brI -aal -aaa -aaa -aaa -biw -bNC -bix -aal -aal -biw -bNC -bix -biv -aQL -aQL -aQL -aQL -aQL -aQV -aQL -bio -bio -aky -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(167,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -agQ -agZ -bgL -agh -agh -bAH -agh -agh -bEX -bzk -aAk -bWO -agh -bAx -adn -adn -bBA -bzq -bUT -bUV -aaZ -aeY -bzE -aod -aPD -aPE -aaZ -aaZ -bsG -abO -btf -rta -rta -bPA -iMs -bFt -axe -arj -arG -anm -arY -asl -asE -alk -bSq -aRZ -aRZ -cae -aRZ -bvn -aRZ -cag -cae -aRZ -aRZ -bCD -cao -aRZ -cal -aSa -aSa -aSa -bss -aSa -aSa -bPy -buH -bDx -afq -bsP -aVQ -aWm -aWt -biY -aqz -aPh -aPj -aPj -aPh -aqz -bgk -aOI -baO -aPg -caS -aZl -baX -bgr -aOp -bZs -biu -bii -brx -brJ -aal -aaa -aal -aal -biw -bNC -bix -aQL -biv -aQL -aQL -aQL -aQL -biw -bNE -bix -aal -biw -bNE -bix -aal -aal -aal -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(168,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -agh -aeb -agZ -bgK -agh -aKN -qYj -agh -bVf -bzl -bzl -bVE -agh -aDk -bAl -bAy -bBz -aak -aak -aak -aak -aak -aak -aak -aak -aak -aak -aak -bsQ -asj -ahR -arb -brv -cet -bDp -bFu -wlc -arA -arA -arD -axe -arj -bFv -alk -aSa -aSa -aSa -aSa -aSa -aSa -aSa -aSa -aSa -aSa -aSa -aSa -aSa -aSa -aSa -aSa -acP -arA -buG -arA -arA -buH -bsP -aVQ -ceA -aVL -aWg -aqz -aWw -biZ -aqA -baC -caN -bMg -baU -aqz -aOJ -aOS -aOI -bjA -bjH -aOY -aOI -aOI -aOp -aQK -bFI -aQK -bYR -bio -bio -bio -bio -bio -bio -aQL -aQL -aQL -aal -biw -bNE -bix -aal -biw -bNE -bix -aal -biw -bNE -bix -aal -aQQ -aQQ -aQQ -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(169,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -agh -agh -aPN -agh -agh -bse -aqQ -agh -byZ -byZ -byZ -byZ -agh -bAx -adu -adC -bBA -aak -aaK -aaK -byK -bPm -aaK -aaK -sPB -aSy -abL -aak -bta -asj -abv -abv -bsr -bDU -axu -axx -btl -rta -rta -btm -wlc -arA -bHg -vMB -bHj -arA -bHq -bHD -cev -arA -bHl -arA -cey -arA -bgl -bHm -arA -bfu -arA -arA -awO -btG -buc -btc -btc -bua -aVL -aWg -aqz -aWa -aWb -aqz -bld -cbW -aqA -aPh -aZS -aPk -aPh -aqz -aOt -aOT -aOI -bjB -bJX -bjJ -aOI -bjO -aOp -aQI -bFS -aQK -aaa -aal -aal -aal -aal -aQL -aal -aal -aal -aal -aal -biw -bNE -bix -aal -biw -bNE -bix -aal -biw -bNE -bix -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(170,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -agh -aaU -aQk -bgM -agh -bdy -aRV -agh -agh -agh -agh -agh -agh -bAy -bAl -bAy -bBz -asL -aar -aar -cba -aar -aYm -aaj -aov -aTi -byM -aak -bta -anb -abv -aby -btd -bDV -byG -axy -btH -axu -axu -axx -btk -nrD -bHh -rta -rta -rta -rta -aAA -cew -btq -bAZ -btc -afy -btc -btc -bFw -btc -btc -bDw -afz -btc -bua -aOn -aVL -aVN -aUp -aWu -aWb -aqz -biD -cbV -aqA -biR -aEj -aqA -aPh -aZT -bmR -aPh -aqz -aPc -aOp -aOp -aOp -aOp -aOp -aOp -aOp -aOp -aQI -bYS -aQK -aaa -aaa -aaa -aaa -aal -aQL -aal -aal -aal -aaa -aaa -biw -bNE -bix -aal -biw -bNF -bix -aaa -biw -bNF -bix -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(171,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -agh -ahq -aQo -aQk -agh -bse -aup -aup -aup -aup -aup -bzq -bVF -bBe -bAY -bBe -bBI -aak -bzG -akw -akw -akw -akw -akw -aBu -aTl -bzD -aak -bta -bTX -abv -aca -btv -bDW -byH -abv -btI -abv -abv -bZE -axp -aft -bjg -axp -axp -axp -axp -aEF -aMT -bud -aJe -aXa -bHi -aXa -aXa -bHo -aBR -aXe -aXe -afB -adr -bZH -bZW -aWa -aWb -aqz -aWv -ade -aqA -biH -aEj -aqA -biE -aZN -aqA -aqA -aZU -aqA -aqA -aqz -aPf -aqA -pNR -aQI -aQI -aQI -bYB -aQI -aQI -aQI -bFS -aQK -aaa -bip -bip -bip -bip -aQL -bip -bip -bip -bip -aaa -biw -bNF -bix -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(172,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -agh -ahA -bVd -aQk -agh -agd -akP -bcR -akP -bEe -aup -bzq -kfj -bAy -bAl -bBf -bBz -aak -aaO -aaO -aaO -aaO -aaO -aaO -aCW -aak -aak -aak -bxa -bXp -abv -aha -byD -btA -btC -btE -btJ -abz -agl -aiO -aiO -aiO -aiO -aAB -ajy -amf -ana -aFc -aiO -bIo -bCn -bIq -aED -aED -aED -aED -aED -akk -asO -akj -aok -aqz -aqz -aYS -ahQ -aqA -bgI -aEj -aqA -biE -aZN -aqA -ahi -bIa -aqA -akr -aWI -akt -akt -aYE -aPh -aqA -aYD -aYO -ipB -bcO -bhu -bcO -bYP -bcO -bFT -aQK -aaa -bNy -bNz -bNz -bNz -aQL -bNA -bNA -bNA -bND -aaa -aaa -aaa -aaa -aaa -aQQ -aQQ -aQQ -aQQ -aQQ -aQQ -aQQ -aQU -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(173,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -agh -agh -agh -agh -agh -asj -aup -asj -asj -agb -bXE -bzq -bzq -bzq -bzq -bzq -bhH -aak -aak -aak -aaQ -aaR -aak -aak -aJd -asj -bQI -asj -bta -aup -abv -iNo -byE -alJ -bqb -bqS -btK -brd -agl -eXR -aKx -aKB -aiO -buR -ajx -ajx -ajx -aFF -aiO -buU -bCp -aCP -aED -bKq -nyl -aFE -aED -akr -akt -aqB -aAu -aqA -abx -aVS -asW -aqA -biE -aZN -aqA -ahi -bHG -aqA -aPn -aPA -aWc -aWk -aZV -akt -biT -aqA -aqA -aqA -bXY -aQK -nOy -aQK -aQK -bRu -aQK -aQK -aQK -aQK -aaa -biq -biq -biq -biq -aQL -biq -biq -biq -biq -aal -aQQ -aQQ -aQQ -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(174,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -asj -bQD -aup -aup -aAw -asj -bse -aup -bXE -aup -aup -aup -eNp -bVC -bmD -bBb -bBb -bBb -bBb -bBb -bBD -aMW -asj -bQJ -aup -bta -aup -abv -abC -abA -abA -amd -atl -byO -bre -agl -aKq -aKy -aKD -aiO -aAD -aVZ -bCj -bCo -aXb -aiO -buf -bCq -aCP -aED -bKr -bKX -bKs -aED -akr -akt -aqB -aBz -aqA -aFx -aZM -bat -aqA -ahi -bHn -aqA -aPn -aPA -aSm -aPo -bhm -biP -bjy -aZJ -akt -naE -aqA -bZo -aQI -bMp -aQI -uoF -aQK -bMw -aQI -bSJ -bSB -bSz -aQK -aaa -aaa -aal -aal -aal -aQL -aal -aal -aaa -aal -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(175,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -asj -abB -aup -aup -aop -asj -aBV -akP -akP -akP -akP -bcR -bVo -akP -akP -akP -bwD -bSl -bSm -bcR -bsd -aNV -asj -bKW -asj -bta -aup -abv -hlK -byN -abJ -abZ -agl -agl -agl -agl -aKv -aKA -aKE -bCm -buK -buL -bCk -anl -aXc -aiO -buV -bCr -aCP -aED -bPD -bKX -aCQ -aED -aWK -akt -aqB -aBz -aqA -ahi -aEf -ahi -aqA -aPn -aPs -aPz -aPo -bhm -aWL -biG -mHS -bhr -bFF -bFJ -bFL -bFP -bfX -aYY -aYY -aZc -aYC -dYW -aQK -cat -bSC -aQI -bSB -bSA -aQK -aaa -bip -bip -bip -bip -aQL -bip -bip -bip -bip -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(176,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -asj -asj -ajW -bQE -asj -asj -asj -asj -ajW -aIV -aIV -aIV -bQE -asj -asj -afQ -afQ -afQ -afQ -afQ -bdy -aNV -asj -bLi -asj -bxa -aup -aiV -aiV -aiV -aiV -aiV -aiV -aCR -auH -aED -aED -aED -aED -aiO -wwX -buM -buP -aiP -aHA -aiO -bIp -bCn -bIr -aED -bKe -cbb -bHS -aED -aqP -ajQ -aCI -aBA -aqA -aOz -aOl -aOy -aOA -aPo -aZo -aWL -aWL -bhs -ate -uwG -aDV -aDV -bFG -aWJ -aWn -aDV -aDV -aDV -bMo -aQI -aQI -fid -aQK -aQK -aQK -bRu -aQK -aQK -aQK -aaa -bNy -bNz -bNz -bNz -aQL -bNA -bNA -bNA -bND -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(177,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aal -aQQ -aQQ -aQQ -aQQ -aQQ -aQU -aQQ -aQQ -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -afQ -ahd -asN -awC -aDd -bse -aNV -asj -asj -asj -bta -bXE -aiV -akd -aUc -aPQ -arO -aiV -jpL -ahE -aiT -ane -aBc -aFb -aiO -oBZ -buN -buS -buT -bCs -aiO -buh -bKp -ahz -ahz -ahz -bKX -aCQ -aED -aul -aOz -aEk -aBP -aDm -aOd -aWp -aWL -aWL -aWL -bMa -aOB -ate -aOG -aDV -aDV -aDV -aDV -bFH -bFK -bFM -bLp -bFU -aDV -aDV -aDV -bQu -mLl -tfI -oqF -oqF -oqF -oqF -xoZ -aQK -aaa -biq -biq -biq -biq -aQL -biq -biq -biq -biq -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(178,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aaa -aaa -aal -aal -aaa -aal -aal -aaa -aaa -aQQ -aQQ -aQQ -aQQ -aQU -aQQ -aQQ -aQQ -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -afQ -aqm -asR -awM -aDe -bsf -aNV -asj -bQk -aRV -bta -aup -aiV -vHF -alP -aPT -anR -aiV -agY -arm -arm -aer -aED -buQ -aiO -aiO -amg -bCl -bFy -bKm -bKO -bSn -bSo -bKQ -bKQ -bKQ -bKY -aCQ -aED -vIe -alp -aEI -aVP -aWd -aWj -aWy -ate -biJ -ate -aZq -aOE -aDV -aWq -aDV -aNX -aNX -aDV -aFf -baD -aYW -bFR -bFV -grn -bFX -aDV -bQA -aQI -aQI -aQI -bYB -aQI -aQI -fid -aQK -aaa -aaa -aal -aal -aal -aQL -aal -aal -aaa -aaa -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(179,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQU -aaa -bgD -bMQ -bgE -aal -bgD -bMQ -bgE -aaa -aal -aal -aaa -aaa -aaa -aal -aaa -aaa -aQQ -aQQ -aQQ -aaa -aaa -aaa -aaa -afQ -aqq -atc -awP -afQ -aSr -aNW -asj -bBB -aRV -bta -aup -aiV -aBM -bEW -bFn -hYL -aiV -arf -bHM -avJ -aED -aED -bJb -hpm -aiO -aiO -aiO -aiO -aiO -aiO -buh -bKu -bFz -aKi -bKf -bKh -bFE -aED -akC -anZ -anZ -anZ -anZ -aln -anZ -oBN -aqA -aFY -aZH -aDV -aDV -aWD -bdH -aEh -aEh -aWx -aWz -baE -aOm -aOu -aOu -aOu -bFY -acQ -acQ -acQ -acQ -acQ -acQ -acQ -bYB -fid -aQK -aaa -bip -bip -bip -bip -aQL -bip -bip -bip -bip -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(180,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aal -bgD -bMU -bgE -aaa -bgD -bMU -bgE -aaa -bgD -bMQ -bgE -aaa -bgD -bMQ -bgE -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -afQ -asD -aur -aym -afQ -bse -aNV -asj -bQO -aRV -bta -aRW -aiV -bfD -alP -aPY -arO -aiV -aea -aea -aea -aea -ahw -bKo -bFx -bFA -bIm -bHz -aFd -hhd -bFA -bKJ -bKv -bIs -aCS -aCS -aCS -aCS -aCS -akF -aqg -aDX -aML -aVT -aqH -aVT -akF -akF -akC -aZI -aDV -bjI -aWD -aEh -aEh -aEh -aOc -aOe -baF -aOm -aOv -aOC -aOK -bFZ -bGa -bGb -baS -eqn -bRA -bJY -acQ -aQI -fid -aTE -aaa -bNy -bNz -bNz -bNz -aQL -bNA -bNA -bNA -bND -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(181,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aQQ -aQQ -aaa -bgD -bMU -bgE -aaa -bgD -bMU -bgE -aal -bgD -bMU -bgE -aaa -bgD -bMU -bgE -aaa -bgD -bMQ -bgE -aaa -aaa -aaa -aaa -aaa -aaa -awc -azI -aFz -mtv -aNV -asj -bKz -aRV -bta -aup -aka -boQ -anU -aPY -arP -arR -aea -wFi -aAO -aea -agf -bKx -ahz -aiW -aiW -ahx -aiW -aiW -aiW -bKK -bKw -bHR -bFC -bFD -aFp -aEN -aCS -aqM -alx -aoa -asf -aqC -akO -aqJ -aWN -aWT -aYV -aZK -aWn -aES -aWE -aWH -baA -aEh -aWx -aWA -baE -aOm -aOm -aOm -aOm -bjf -ajT -baQ -baV -baW -aEZ -aOZ -acQ -akK -fid -aTF -aaa -biq -biq -biq -biq -aQL -biq -biq -biq -biq -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(182,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aal -aal -aal -bgD -bMU -bgE -aal -bgD -bMU -bgE -aal -bgD -bMU -bgE -aaa -bgD -bMU -bgE -aaa -bgD -bMU -bgE -aal -aaa -aaa -aaa -aaa -aaa -awq -aDc -aFz -bse -aNV -asj -asj -asj -bBE -bXF -aBL -bAv -aPJ -bys -arP -arS -aea -vqS -bHU -aea -ahy -bKx -bKD -bKG -bKI -bKI -bKI -bKF -bKF -bKL -bKP -bKR -bKS -bKT -bKZ -bLa -aCS -akO -aZY -baa -caz -baa -bai -ban -bap -aPl -aVU -aZL -aWs -aEh -aWB -aEh -aEh -aOg -aDV -bhv -baG -baH -caP -baH -baL -baN -baP -baR -aWX -caT -akb -bnz -acQ -bQv -leE -aTF -aaa -aal -aaa -aaa -aal -aQL -aal -aaa -aaa -aaa -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(183,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aal -aaL -awB -awB -aaS -aaS -aug -aaS -aaS -aaS -aaS -bgD -bMU -bgE -aal -bgD -bMU -bgE -aaa -bgD -bMU -bgE -aaa -aaa -aal -aal -aal -aal -aal -bha -asj -buA -aQB -aTq -aTC -aTC -bEG -aUh -aiV -bzI -alP -bAn -arO -aiV -aea -ang -baf -aBb -aBr -bKC -bKF -bKH -ajK -bJt -ajK -bJH -ajK -bZG -aEH -bKb -aCS -gdD -aFq -are -aCS -eZi -aqx -aqy -biS -akO -baj -bar -aqS -bam -aWe -aZP -aWn -aEh -caJ -caK -aEh -aEn -aDV -aOh -aYR -aOm -aOm -aOm -aOm -aWO -ajT -apW -aWY -aEG -aFa -aPm -acQ -arc -fid -aTF -aaa -bip -bip -bip -bip -aQL -bip -bip -bip -bip -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(184,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQU -aal -aal -aal -bgD -bMV -bgE -aal -bgD -bMV -bgE -aQP -aaS -aaS -aaS -aaS -aaS -aaS -aaS -aaa -bgD -bNa -bgE -aal -aal -aal -bhc -awB -awB -awB -bhd -asj -asj -aup -aup -aup -aup -aup -aup -aiV -anR -anR -bAp -anR -aiV -ahB -aid -aeF -ahf -ahz -ahz -bZF -ajK -bJk -bLS -aJO -ajK -bJO -bKM -aEH -bKc -aCS -bPE -bDF -aOo -aCS -akQ -akX -aob -aPF -aqy -aMM -bXG -baI -akF -akC -aZQ -aDV -aio -aWB -aGa -aEh -aEn -aDV -ajE -aYR -aOm -aOw -aOD -aOM -aWQ -aWU -baT -lFx -bgF -bgH -bgT -acQ -aQI -fid -aTG -aaa -bNy -bNz -bNz -bNz -biv -bNA -bNA -bNA -bND -aaa -aQU -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(185,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQU -avP -aQQ -aaa -bgD -bMV -bgE -aaa -bgD -bMV -bgE -aal -bgD -bMV -bgE -aal -aal -aal -aaS -aQP -bgZ -bhb -awB -awB -awB -awB -bhd -aal -aal -aal -aal -asj -bLk -aup -aup -aup -aup -aup -bQD -aiV -vHF -alP -bAp -anR -aiV -bDK -bHO -aao -aea -azS -ahz -aiW -aiW -aiW -bKg -bKg -bKg -aiW -bKN -bJf -aCS -aCS -bKU -aEN -arl -arT -arT -arT -atX -biU -biK -bak -biX -arT -arT -bjl -aZI -aDV -aMN -aWC -aGa -aEh -aEn -aDV -edu -aYT -aOm -aOx -aOx -aOx -bgm -acQ -acQ -acQ -acQ -acQ -acQ -acQ -aQI -fid -aQK -aaa -biq -biq -biq -biq -aQL -biq -biq -biq -biq -aal -aQQ -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(186,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aal -bgD -bMV -bgE -aaa -bgD -bMV -bgE -aaa -bgD -bMV -bgE -aaa -aaa -aal -aal -aal -bha -aal -aal -aal -aal -aal -aal -aal -aaa -aaa -aaa -asj -bQK -aRP -aup -aTZ -bXE -bQZ -bQH -aiV -anS -byL -bAu -arO -aiV -aea -aea -aea -aea -bIQ -ahz -ahz -aiW -aiW -aiW -aiW -aiW -aiW -ahz -bKy -aCS -cPq -bKV -aFu -asi -arT -asa -asa -aua -aEl -asU -biL -biV -kDh -arT -akC -nkG -aDV -aEm -aEh -aGa -aEh -aEn -aDV -hDU -aYU -aYX -aYX -aOF -bfY -bDf -cdR -bSx -bQz -bQx -aQI -bYB -aQI -aQI -fid -aQK -aaa -aaa -aal -aal -aal -aQL -aal -aal -aaa -aaa -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(187,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aal -bgD -bMW -bgE -aal -bgD -bMW -bgE -aal -bgD -bMV -bgE -aaa -bgU -bgU -bgU -bgU -bha -bgU -bgU -bgU -bgU -aaa -aaa -aaa -aaa -aaa -aaa -asj -asj -asj -aRR -asj -bDB -bQC -bQE -aiV -aiV -aiV -aiV -aiV -aiV -aaa -rfC -aaa -aED -ahC -ahz -ahz -ahz -bIn -anf -bJC -ahz -ahz -ahz -bHQ -aCS -aEO -ann -aFv -aAZ -arT -asa -aZZ -bab -bab -bag -bal -bao -aEL -biM -akC -aZW -aDV -aEn -aEh -aWF -aEh -bLo -aDV -aem -aOV -bhq -bLr -aZa -aDV -bGf -aDV -pxQ -oqF -oqF -oqF -oqF -unF -dgr -wia -aQK -aaa -aQQ -aQQ -aQQ -aal -aQL -aal -aQQ -aQQ -aQQ -aQQ -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(188,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aaa -aaa -aal -aal -aaa -aal -aal -aaa -aaa -bgD -bMW -bgE -aal -bMX -bMY -bMY -bMY -aaS -bMZ -bMZ -bMZ -bNx -aal -aQQ -aaa -aaa -aaa -aaa -aaa -asj -aRQ -aup -aRW -asj -aaa -aaa -aaa -aal -aaa -afA -aal -aaa -aaa -aal -aaa -aED -ajI -aic -aiX -ajL -bJm -bIt -bJD -aAE -aAP -aBd -bKA -aCS -aCS -aCS -aCS -aCS -arT -aLg -aWP -auv -aEo -caC -aEM -bas -aEL -biN -akC -aZI -aDV -aDV -aDV -aDV -adY -adY -adY -aDV -aDV -aDV -aDV -baM -aDV -bQw -aDV -cPK -bYB -aQK -aQK -aQK -aQK -aQK -aQK -aQK -aaa -aaa -aaa -aQQ -aal -aal -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(189,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aaa -aQQ -aQQ -aQQ -aQU -aQQ -aQQ -aQQ -aaa -aaa -aal -aal -aaa -bgV -bgV -bgV -bgV -aaS -bgV -bgV -bgV -bgV -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -asj -asj -aRR -asj -asj -aaa -aaa -aaa -aal -aaa -aaa -aal -aaa -avP -avP -aal -bMK -ajJ -bCt -bCt -bCt -bCt -bCt -bCt -bCt -bCt -bCt -bKB -aaa -pWc -aij -adI -aiz -arT -asp -asV -auB -auB -auB -auB -auB -auB -arT -akC -aZI -aDY -aEp -aGb -bLl -aqA -bmg -aQI -bGp -aQK -bQv -aQI -bGi -aDV -aDV -aDV -bGi -aQI -aQK -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aQQ -aQQ -aQQ -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(190,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aQQ -aQQ -aQQ -aQQ -aaa -aal -aaa -aaa -aal -aaS -aal -aaa -aal -aaa -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aRT -aaa -aaa -aaa -aaa -avP -avP -avP -avP -avP -avP -avP -avP -avP -aaa -aaa -aal -aaa -aal -aaa -aaa -aal -aaa -aaa -aal -aaa -aaa -aaa -aij -aiz -ajG -arT -bfk -alG -biW -akN -aEK -vjd -aqR -bKi -arT -baw -aZX -aDZ -caH -aFr -bht -aqA -aOj -bnx -aQI -bRu -bYB -aQI -bGj -bGc -bGc -ccj -bRC -aQI -aQK -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(191,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aaa -bgU -bgU -bgU -bgU -aaS -bgU -bgU -bgU -bgU -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -bMJ -avP -avP -avP -avP -avP -avP -avP -avP -avP -avP -avP -avP -aaa -aaa -aij -aij -alH -aij -aij -aij -aij -aij -aij -aij -aij -aij -aij -aOi -aZI -aDZ -aEq -aFs -aGd -aqA -bLN -bDj -bVJ -aQK -aQI -aQI -bYB -aQI -bXs -bQv -bZr -bZr -aQK -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(192,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aal -bMX -bMY -bMY -bMY -aaS -bMZ -bMZ -bMZ -bNx -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aij -aiA -aOL -aiB -aja -wCc -aGc -akc -aki -aqI -aqI -aWW -aiN -akC -aZI -aEa -aEr -aOa -aGd -aqA -aQK -aQK -aQK -aQK -aQK -aQK -aQK -aQK -aQK -aQK -aQK -aQK -aQK -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(193,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aQQ -aal -bgV -bgV -bgV -bgV -aaS -bgV -bgV -bgV -bgV -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aij -aiB -ake -aVY -aVY -aWf -bOQ -aZy -aZy -aZz -aZB -aZy -aZF -aWl -bac -aEb -aEb -aEb -aEb -aEb -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(194,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aaa -aaa -aaa -aal -aaa -aal -aaS -aal -aaa -aal -aaa -aaa -aQU -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aRU -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aij -bjk -alg -ajY -bLq -bjQ -aZv -tFw -bLq -bkA -alg -aiB -aBZ -aZG -bad -aEc -aEs -aFW -aNU -aNY -aOb -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(195,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aal -bgU -bgU -bgU -bgU -aaS -aaS -aal -aal -aaa -aaa -aQQ -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aij -aiN -bjr -aiN -aiN -aiN -bkd -aiN -aiN -aiN -bkH -aiN -aiN -aZG -bad -aDP -aEt -aFX -bTf -aNZ -bVc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(196,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aal -bMX -bMY -bMY -bMY -aaS -bgU -bgU -bgU -bgU -aal -aQQ -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aij -ajX -alI -ajR -aiN -aEg -aZw -ajR -aiN -aOR -alI -ajR -aiN -aZG -bae -aZs -bax -aFX -aNU -aNY -aOb -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(197,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aaa -bgV -bgV -bgV -bgV -aaS -bMZ -bMZ -bMZ -bNx -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aij -aNk -ayP -bjC -aiN -aOU -aZx -bjC -aiN -aSi -aZC -bjC -aiN -aZR -bah -bau -bav -bKj -aEb -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(198,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aaa -aaa -aal -aaa -aal -aaS -bgV -bgV -bgV -bgV -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aij -aij -aiN -bjs -aiN -aiN -aiN -bke -aiN -aiN -aiN -bkI -aiN -aiN -aDQ -oKN -aDP -caI -aFX -aNU -aNY -aOb -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(199,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aal -bgU -bgU -bgU -bgU -aaS -aal -aal -aaa -aaa -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aij -ais -ajB -aDU -aqO -blv -ajB -anY -dIr -blv -apN -aZD -arp -aCA -aDQ -aZr -mSf -baz -aFX -bTV -aNZ -bYQ -ajC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(200,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aal -bMX -bMY -bMY -bMY -aaS -bgU -bgU -bgU -bgU -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aij -aMc -ajB -aDU -ajB -ajB -ajB -bRo -ajR -ajB -ajB -aZD -arq -aUP -aDQ -aDQ -aDQ -aZt -aFZ -aNU -aNY -aOb -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(201,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQU -aal -bgV -bgV -bgV -bgV -aQP -bMZ -bMZ -bMZ -bNx -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aij -aiy -ajB -aDU -ajB -ajR -akg -aof -blr -ajB -aZA -aZE -arp -arq -aDR -arq -aDQ -aDQ -baB -aEb -aEb -aEb -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(202,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aaa -aaa -aaa -aaa -aal -aaS -bgV -bgV -bgV -bgV -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aij -aij -ayw -aEd -ajB -blu -blp -bWh -bls -ajR -aYQ -aqK -arr -aiN -aiN -arq -arq -aij -bDI -aNZ -bHP -aEb -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(203,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aal -bgU -bgU -bgU -bgU -aaS -aal -aaa -aaa -aal -aaa -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aij -acU -ajB -ajB -ajB -ajR -anY -ajB -ajB -ajB -aqL -bjL -aiN -aDS -arq -bhp -aij -aEb -baB -aEb -aEb -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(204,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aaa -bMX -bMY -bMY -bMY -aaS -bgU -bgU -bgU -bgU -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aij -ajF -ajR -ajB -ajB -ajB -anY -ajB -ajB -ajB -aqL -art -aiN -aDS -arq -aEe -aij -aaa -aRT -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(205,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aaa -bgV -bgV -bgV -bgV -aaS -bMZ -bMZ -bMZ -bNx -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aij -aij -bjt -bjD -akZ -ajS -apr -akh -aqD -ajB -bkJ -aij -aij -aij -aij -aij -aij -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(206,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aaa -aaa -aal -aaa -aal -aaS -bgV -bgV -bgV -bgV -aal -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aij -ajG -ajG -ajG -bjS -apJ -ajG -ajG -ajB -aUj -aij -aal -aaa -aal -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(207,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaS -aal -aaa -aal -aal -aaa -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aij -bjv -bjE -ajD -bjT -aON -azd -aDT -aOW -aUr -aij -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(208,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aQQ -aQQ -aQQ -aQQ -aal -aal -aal -aQQ -aQQ -aQQ -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aij -aij -ajA -aij -ajA -aij -ajA -aij -ajA -aij -aij -aaa -aaa -aaa -aaa -aaa -aaa -aRU -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(209,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aQQ -aQU -aQQ -aQQ -aQQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aal -aaa -aaa -aal -aal -aal -aaa -aal -aal -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(210,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(211,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(212,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(213,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(214,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(215,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(216,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(217,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(218,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(219,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(220,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(221,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(222,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(223,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(224,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(225,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(226,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(227,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(228,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(229,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(230,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(231,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(232,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(233,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(234,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(235,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(236,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(237,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(238,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(239,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(240,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(241,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(242,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(243,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(244,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(245,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(246,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(247,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(248,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(249,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(250,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(251,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(252,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(253,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(254,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(255,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 812a9c9a46e84..d757ad25b0749 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -293,7 +293,7 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "aaD" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral{ @@ -724,7 +724,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-16" }, /obj/effect/turf_decal/box/corners{ @@ -852,7 +852,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/costume, /obj/effect/spawner/lootdrop/costume, @@ -1263,6 +1263,7 @@ pixel_y = 5 }, /obj/item/restraints/handcuffs/cable/zipties, +/obj/item/flashlight/seclite, /turf/open/floor/plasteel/dark, /area/security/detectives_office) "acj" = ( @@ -2274,7 +2275,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/stripes/corner{ @@ -3538,19 +3539,6 @@ }, /turf/open/floor/plating, /area/science/xenobiology) -"afH" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = -26 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) "afI" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -3797,7 +3785,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/flashlight/lantern, /obj/structure/sign/poster/official/bless_this_spess{ @@ -4003,31 +3991,17 @@ /turf/closed/wall, /area/hallway/primary/fore) "agp" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/emergency{ - pixel_y = 5 - }, -/obj/item/stack/cable_coil, -/obj/item/wirecutters, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = 28 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/machinery/camera{ - c_tag = "Recreation VR Sleepers"; - name = "recreation camera" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ + dir = 8 }, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/light{ - dir = 1 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) +/turf/open/floor/plating, +/area/maintenance/port) "agq" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -4120,7 +4094,7 @@ /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance/two, /turf/open/floor/plating, @@ -4618,7 +4592,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /obj/structure/cable/yellow{ @@ -5024,13 +4998,13 @@ }, /area/maintenance/port/fore) "ahV" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate{ + opened = 1 }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) +/obj/item/stock_parts/capacitor, +/turf/open/floor/plating, +/area/maintenance/port) "ahW" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/airlock/security/glass{ @@ -6384,7 +6358,7 @@ /obj/item/radio/intercom{ pixel_x = -28 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-02"; pixel_y = 3 }, @@ -7057,18 +7031,12 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral, -/obj/structure/table, -/obj/item/book/manual/wiki/detective{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/taperecorder, -/obj/item/flashlight/seclite, /obj/effect/decal/cleanable/cobweb, /obj/machinery/airalarm{ dir = 4; pixel_x = -22 }, +/obj/machinery/vending/wardrobe/det_wardrobe, /turf/open/floor/plasteel/dark, /area/security/detectives_office) "ale" = ( @@ -9645,7 +9613,7 @@ }, /area/maintenance/port/fore) "aoR" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ @@ -9898,7 +9866,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants, +/obj/item/kirbyplants, /turf/open/floor/plasteel/dark, /area/security/courtroom) "apj" = ( @@ -10063,7 +10031,7 @@ /turf/open/floor/plasteel/dark, /area/teleporter) "apw" = ( -/obj/item/twohanded/required/kirbyplants, +/obj/item/kirbyplants, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, @@ -10910,7 +10878,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants, +/obj/item/kirbyplants, /obj/machinery/power/apc/highcap/ten_k{ areastring = "/area/bridge"; dir = 8; @@ -11273,7 +11241,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-14" }, /obj/structure/cable/yellow{ @@ -11382,7 +11350,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel/dark, @@ -11738,7 +11706,7 @@ /turf/open/floor/plasteel, /area/bridge) "arQ" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/stripes/corner{ @@ -12509,7 +12477,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel/dark, @@ -13140,7 +13108,7 @@ }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/neutral, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /turf/open/floor/plasteel, @@ -13402,7 +13370,7 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/stripes/corner, @@ -13574,29 +13542,6 @@ /obj/structure/sign/warning/securearea, /turf/closed/wall, /area/bridge) -"aux" = ( -/obj/structure/table/glass, -/obj/item/storage/box/rxglasses{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/box/beakers, -/obj/item/gun/syringe{ - pixel_y = 5 - }, -/obj/item/reagent_containers/spray/cleaner, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light_switch{ - pixel_y = 24 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/medical/storage) "auy" = ( /obj/structure/sign/warning/electricshock, /turf/closed/wall/r_wall, @@ -13808,7 +13753,7 @@ dir = 4; icon_state = "box_corners" }, -/obj/item/twohanded/required/kirbyplants, +/obj/item/kirbyplants, /obj/structure/extinguisher_cabinet{ pixel_x = 24 }, @@ -15056,7 +15001,6 @@ /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) "awA" = ( -/obj/structure/table/wood/fancy, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -15067,16 +15011,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/storage/book/bible{ - pixel_x = 4; - pixel_y = 6 - }, -/obj/item/storage/book/bible{ - pixel_y = 2 - }, /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/structure/altar_of_gods, /turf/open/floor/plasteel/dark, /area/chapel/main) "awB" = ( @@ -16757,27 +16695,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/electrical) -"ayW" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/table, -/obj/item/clipboard{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/book/manual/wiki/surgery, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/suit/apron/surgical, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 28 - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) "ayX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -17335,7 +17252,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "azN" = ( -/obj/machinery/mecha_part_fabricator, +/obj/machinery/modular_fabricator/exosuit_fab, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -18457,7 +18374,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants, +/obj/item/kirbyplants, /turf/open/floor/plasteel/dark, /area/bridge) "aBl" = ( @@ -18901,7 +18818,7 @@ /area/engine/break_room) "aBU" = ( /obj/effect/turf_decal/tile/neutral, -/obj/item/twohanded/required/kirbyplants, +/obj/item/kirbyplants, /turf/open/floor/plasteel/dark, /area/bridge) "aBV" = ( @@ -20015,7 +19932,7 @@ }, /area/engine/atmos) "aDA" = ( -/obj/machinery/atmospherics/miner/nitrogen{ +/obj/machinery/atmospherics/miner/station/nitrogen{ max_ext_kpa = 2500 }, /turf/open/floor/engine/n2{ @@ -20031,7 +19948,7 @@ }, /area/engine/atmos) "aDD" = ( -/obj/machinery/atmospherics/miner/oxygen{ +/obj/machinery/atmospherics/miner/station/oxygen{ max_ext_kpa = 2500 }, /turf/open/floor/engine/o2{ @@ -20958,7 +20875,7 @@ /turf/open/floor/plasteel/dark, /area/medical/cryo) "aFm" = ( -/obj/machinery/atmospherics/miner/carbon_dioxide{ +/obj/machinery/atmospherics/miner/station/carbon_dioxide{ max_ext_kpa = 2500 }, /turf/open/floor/engine/co2{ @@ -20966,7 +20883,7 @@ }, /area/engine/atmos) "aFn" = ( -/obj/machinery/atmospherics/miner/toxins{ +/obj/machinery/atmospherics/miner/station/toxins{ max_ext_kpa = 2500 }, /turf/open/floor/engine/plasma{ @@ -20974,7 +20891,7 @@ }, /area/engine/atmos) "aFo" = ( -/obj/machinery/atmospherics/miner/n2o{ +/obj/machinery/atmospherics/miner/station/n2o{ max_ext_kpa = 2500 }, /turf/open/floor/engine/n2o{ @@ -21090,7 +21007,7 @@ /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ name = "Infirmary"; - req_access_txt = "63" + req_one_access_txt = "1;34" }, /turf/open/floor/plasteel/dark, /area/security/main) @@ -23354,7 +23271,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/machinery/light{ @@ -24361,7 +24278,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-03" }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer1{ @@ -24633,7 +24550,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "applebush" }, /obj/structure/cable/yellow{ @@ -24927,13 +24844,10 @@ /area/security/main) "aLf" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/poster/random_official{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/item/poster/random_official, -/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/bot, +/obj/structure/rack, +/obj/item/stack/packageWrap, +/obj/item/storage/box, /turf/open/floor/plating, /area/maintenance/port) "aLg" = ( @@ -25235,7 +25149,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/machinery/airalarm{ @@ -25979,7 +25893,7 @@ /obj/structure/noticeboard{ pixel_y = 28 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/effect/turf_decal/stripes/line{ @@ -26153,7 +26067,7 @@ /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-03" }, /obj/effect/turf_decal/stripes/line{ @@ -26270,13 +26184,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"aNe" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/maintenance/disposal/incinerator) "aNf" = ( /obj/structure/reflector/single/anchored{ dir = 5; @@ -26850,7 +26757,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/blue, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ @@ -28237,7 +28144,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/effect/turf_decal/stripes/line{ @@ -28355,7 +28262,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/blue, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /obj/effect/turf_decal/stripes/corner{ @@ -28463,7 +28370,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/structure/cable/yellow{ @@ -28780,7 +28687,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/red, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/structure/noticeboard{ @@ -29074,7 +28981,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /obj/effect/turf_decal/stripes/corner{ @@ -30496,7 +30403,7 @@ /turf/open/floor/plasteel/dark, /area/maintenance/central) "aSR" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-18" }, /obj/effect/turf_decal/tile/blue, @@ -31392,7 +31299,7 @@ /obj/machinery/firealarm{ pixel_y = 26 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /obj/structure/disposalpipe/segment{ @@ -31455,7 +31362,7 @@ /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "aUd" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/neutral{ @@ -33890,7 +33797,7 @@ /turf/open/floor/engine/vacuum, /area/science/mixing/chamber) "aXt" = ( -/obj/machinery/mecha_part_fabricator, +/obj/machinery/modular_fabricator/exosuit_fab, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -34450,7 +34357,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/yellow, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-18" }, /obj/effect/turf_decal/stripes/corner{ @@ -35594,7 +35501,7 @@ dir = 4; pixel_x = -26 }, -/obj/item/crowbar/power, +/obj/item/powertool/jaws_of_life, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -35606,7 +35513,7 @@ /turf/open/floor/mech_bay_recharge_floor, /area/science/robotics/mechbay) "aZK" = ( -/obj/item/twohanded/required/kirbyplants/photosynthetic, +/obj/item/kirbyplants/photosynthetic, /obj/structure/cable/yellow{ icon_state = "1-4" }, @@ -37934,7 +37841,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/purple, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /obj/machinery/button/door{ @@ -39337,23 +39244,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/kitchen) -"beQ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/mob/living/simple_animal/bot/cleanbot{ - name = "Scrubs, MD"; - on = 0 - }, -/turf/open/floor/plasteel/dark, -/area/medical/storage) "beR" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -40062,13 +39952,6 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) -"bfL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port) "bfM" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -41341,7 +41224,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/structure/cable/yellow{ @@ -41973,7 +41856,7 @@ /turf/open/floor/plasteel/dark, /area/quartermaster/qm) "bis" = ( -/obj/machinery/computer/shuttle/mining{ +/obj/machinery/computer/shuttle_flight/mining{ dir = 8; icon_state = "computer"; req_access = null; @@ -42806,7 +42689,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/autolathe, +/obj/machinery/modular_fabricator/autolathe, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -43383,7 +43266,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/effect/turf_decal/stripes/line{ @@ -43460,7 +43343,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/screwdriver/power, +/obj/item/powertool/hand_drill, /turf/open/floor/plasteel/dark, /area/security/nuke_storage) "bku" = ( @@ -43981,7 +43864,7 @@ /turf/open/floor/plating, /area/security/checkpoint/supply) "blh" = ( -/obj/machinery/mineral/equipment_vendor, +/obj/machinery/vendor/mining, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -44765,7 +44648,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-18" }, /obj/machinery/light_switch{ @@ -44859,7 +44742,7 @@ /turf/closed/wall/rust, /area/quartermaster/storage) "bmo" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/machinery/firealarm{ @@ -45022,7 +44905,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel/dark, @@ -45433,7 +45316,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/blue, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-18" }, /obj/effect/turf_decal/stripes/corner{ @@ -45456,7 +45339,7 @@ "bnh" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plasteel, @@ -46083,7 +45966,7 @@ /turf/open/floor/plasteel/dark, /area/bridge) "bnZ" = ( -/obj/item/twohanded/required/kirbyplants, +/obj/item/kirbyplants, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, @@ -47164,7 +47047,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/destructible/cult/tome, +/obj/structure/destructible/cult/tome/library, /obj/effect/decal/cleanable/cobweb, /obj/item/book/codex_gigas{ pixel_x = -4; @@ -47300,6 +47183,9 @@ pixel_x = 28 }, /obj/effect/decal/cleanable/dirt, +/obj/structure/sign/painting/library_private{ + pixel_y = 32 + }, /turf/open/floor/plasteel/dark, /area/library) "bpI" = ( @@ -48549,7 +48435,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/bar/atrium) "bru" = ( -/obj/machinery/computer/shuttle/mining, +/obj/machinery/computer/shuttle_flight/mining, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -49851,7 +49737,7 @@ pixel_y = 22; prison_radio = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-17"; pixel_x = -8; pixel_y = 3 @@ -50378,7 +50264,7 @@ /turf/open/floor/wood, /area/crew_quarters/bar) "btU" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/wood, @@ -50489,7 +50375,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-02"; pixel_y = 3 }, @@ -50732,7 +50618,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/stripes/corner, @@ -51046,17 +50932,10 @@ /turf/open/floor/plasteel/dark, /area/library) "buX" = ( -/obj/structure/table/wood, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/clipboard, -/obj/item/camera_film{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/camera_film, /obj/machinery/newscaster{ pixel_x = 30 }, @@ -51065,6 +50944,7 @@ dir = 8; name = "bar camera" }, +/obj/machinery/modular_computer/console/preset/curator, /turf/open/floor/plasteel/dark, /area/library) "buY" = ( @@ -51603,7 +51483,7 @@ /turf/closed/wall/rust, /area/library) "bvL" = ( -/obj/machinery/computer/shuttle/labor, +/obj/machinery/computer/shuttle_flight/labor, /obj/effect/turf_decal/tile/red{ dir = 4 }, @@ -51803,7 +51683,7 @@ /obj/structure/noticeboard{ pixel_y = 30 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-17"; pixel_x = -8; pixel_y = 3 @@ -51813,30 +51693,16 @@ "bwe" = ( /turf/closed/wall/r_wall/rust, /area/science/xenobiology) -"bwf" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/stock_parts/capacitor, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port) -"bwg" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet, -/obj/item/stack/rods/ten, -/obj/item/stock_parts/matter_bin, -/turf/open/floor/plating, -/area/maintenance/port) "bwh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ + dir = 5 + }, /obj/structure/cable/yellow{ - icon_state = "1-2" + icon_state = "1-4" }, /turf/open/floor/plating, /area/maintenance/port) @@ -52032,6 +51898,10 @@ dir = 4 }, /obj/item/flashlight/lantern, +/obj/item/storage/book/bible{ + pixel_x = 9; + pixel_y = 7 + }, /turf/open/floor/plasteel/dark, /area/chapel/main) "bwD" = ( @@ -52417,7 +52287,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /turf/open/floor/plasteel, @@ -52630,7 +52500,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "bxF" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral{ @@ -52774,19 +52644,6 @@ dir = 4 }, /area/chapel/main) -"bxQ" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/chair/stool/bar{ - pixel_x = -8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "bxR" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral, @@ -52940,7 +52797,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/machinery/light, @@ -53080,15 +52937,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"bym" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/port) "byn" = ( /obj/structure/table/glass, /obj/effect/turf_decal/stripes/line{ @@ -53373,18 +53221,18 @@ /turf/open/floor/plasteel, /area/security/warden) "byB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ - dir = 6 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ + dir = 8 + }, /obj/structure/cable/yellow{ - icon_state = "2-4" + icon_state = "4-8" }, /turf/open/floor/plating{ icon_state = "panelscorched" @@ -53553,15 +53401,6 @@ luminosity = 2 }, /area/ai_monitored/turret_protected/ai_upload) -"byO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/port) "byP" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -53668,7 +53507,7 @@ dir = 1 }, /obj/effect/decal/cleanable/cobweb, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -54082,7 +53921,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-02"; pixel_y = 3 }, @@ -54472,7 +54311,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/corner, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel/showroomfloor, @@ -54651,14 +54490,6 @@ /obj/effect/decal/cleanable/insectguts, /turf/open/floor/plasteel/dark, /area/maintenance/central) -"bAq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/item/stack/packageWrap, -/obj/item/storage/box, -/turf/open/floor/plating, -/area/maintenance/port) "bAr" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -54666,7 +54497,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 9 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-02"; pixel_y = 3 }, @@ -54718,7 +54549,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/blue, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/structure/disposalpipe/segment, @@ -54930,31 +54761,18 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "bAM" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12"; - req_one_access_txt = "0" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/poster/random_official{ + pixel_x = 6; + pixel_y = 6 }, -/turf/open/floor/plasteel/dark, +/obj/item/poster/random_official, +/turf/open/floor/plating, /area/maintenance/port) "bAN" = ( /turf/closed/wall, /area/medical/virology) -"bAO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/port) "bAP" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -55016,7 +54834,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -55556,21 +55374,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/maintenance/port) -"bBI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/port) "bBJ" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -55748,7 +55551,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 6 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plasteel, @@ -55880,7 +55683,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-16" }, /obj/structure/extinguisher_cabinet{ @@ -56238,7 +56041,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-16" }, /turf/open/floor/plasteel/dark, @@ -56743,9 +56546,6 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -57477,7 +57277,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "applebush" }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -58195,7 +57995,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-03" }, /obj/machinery/light{ @@ -58500,7 +58300,7 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/machinery/airalarm{ @@ -58654,7 +58454,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-16" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -58715,7 +58515,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel/dark/corner{ @@ -58806,7 +58606,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/structure/spider/stickyweb, @@ -58909,7 +58709,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "bGv" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-02"; pixel_y = 3 }, @@ -59172,12 +58972,10 @@ /turf/open/floor/plasteel, /area/engine/break_room) "bGN" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, +/obj/effect/turf_decal/bot, +/obj/structure/rack, +/obj/item/storage/backpack/satchel/eng, +/obj/item/wirecutters, /turf/open/floor/plating, /area/maintenance/port/aft) "bGO" = ( @@ -59427,14 +59225,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"bHg" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/computer/arcade, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) "bHh" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -59848,7 +59638,7 @@ /turf/open/floor/plasteel, /area/bridge) "bHO" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/structure/cable/yellow{ @@ -60225,7 +60015,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel, @@ -60532,20 +60322,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/quartermaster/storage) -"bIR" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/chair/stool/bar{ - pixel_x = -8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "bIS" = ( /obj/item/grenade/barrier{ pixel_x = 4 @@ -60734,10 +60510,6 @@ /turf/open/floor/plasteel, /area/bridge) "bJg" = ( -/obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/item/storage/backpack/satchel/eng, -/obj/item/wirecutters, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, @@ -60965,7 +60737,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-03" }, /obj/structure/disposalpipe/segment, @@ -61152,7 +60924,7 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/structure/extinguisher_cabinet{ @@ -61245,16 +61017,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/crew_quarters/locker) -"bJM" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/port) "bJN" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -61378,15 +61140,6 @@ icon_state = "platingdmg3" }, /area/maintenance/port/aft) -"bJW" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/space_heater, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/port/aft) "bJX" = ( /obj/effect/turf_decal/delivery, /obj/machinery/space_heater, @@ -61763,7 +61516,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-16" }, /obj/structure/cable/yellow{ @@ -62039,7 +61792,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bLc" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral, @@ -62101,30 +61854,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/security/courtroom) -"bLh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bLi" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/structure/chair/stool/bar{ - pixel_x = -8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "bLj" = ( /obj/machinery/status_display/ai, /turf/closed/wall, @@ -62209,32 +61938,6 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) -"bLq" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/chair/stool/bar{ - pixel_x = -8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"bLr" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness/recreation) "bLs" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -62292,16 +61995,6 @@ "bLu" = ( /turf/closed/wall/rust, /area/crew_quarters/locker) -"bLv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "bLw" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -62615,16 +62308,6 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"bLP" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "bLQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -62663,16 +62346,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bLT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "bLU" = ( /obj/structure/sign/warning/fire, /turf/closed/wall/rust, @@ -62840,14 +62513,6 @@ /obj/item/seeds/ambrosia, /turf/open/floor/grass, /area/security/prison) -"bMf" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/port/aft) "bMg" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -62861,16 +62526,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"bMh" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/port/aft) "bMi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ @@ -62972,27 +62627,6 @@ }, /turf/open/floor/plasteel, /area/teleporter) -"bMq" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/screwdriver{ - pixel_y = 18 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = -28 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -26 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) "bMr" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -63031,18 +62665,6 @@ dir = 1 }, /area/hallway/primary/central) -"bMt" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) "bMu" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12"; @@ -63070,7 +62692,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-02"; pixel_y = 3 }, @@ -65094,7 +64716,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/stripes/corner{ @@ -65229,7 +64851,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 10 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-16" }, /turf/open/floor/plasteel, @@ -65508,7 +65130,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 6 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-16" }, /turf/open/floor/plasteel/dark/corner{ @@ -65527,7 +65149,7 @@ /obj/machinery/status_display/ai{ pixel_x = 32 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel, @@ -65727,7 +65349,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/red, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -66213,7 +65835,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/stripes/corner{ @@ -66449,7 +66071,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/decal/cleanable/dirt, @@ -66946,7 +66568,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/machinery/firealarm{ @@ -67595,7 +67217,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/stripes/corner, @@ -68131,7 +67753,7 @@ dir = 4; pixel_x = -22 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel/dark, @@ -68406,7 +68028,7 @@ dir = 4 }, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit/departure_lounge) @@ -69408,7 +69030,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-02"; pixel_y = 3 }, @@ -71231,7 +70853,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/yellow, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/machinery/light, @@ -71410,7 +71032,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/general/visible, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/tank/internals/oxygen/red{ pixel_x = 4 @@ -71701,7 +71323,7 @@ /turf/open/floor/plasteel, /area/security/warden) "bYE" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "applebush" }, /obj/effect/turf_decal/tile/blue{ @@ -72279,7 +71901,7 @@ "bZr" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/red, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-02"; pixel_y = 3 }, @@ -72341,7 +71963,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/yellow, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/stripes/corner{ @@ -72687,7 +72309,7 @@ /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/stripes/corner, /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-11" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -73159,7 +72781,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -73180,7 +72802,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-16" }, /obj/effect/turf_decal/stripes/corner{ @@ -73385,7 +73007,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/structure/extinguisher_cabinet{ @@ -73545,7 +73167,7 @@ /turf/open/floor/plasteel/dark, /area/hallway/secondary/entry) "caV" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/blue{ @@ -73973,7 +73595,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-03" }, /obj/effect/turf_decal/stripes/corner{ @@ -75269,7 +74891,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel/dark, @@ -76512,7 +76134,7 @@ dir = 1 }, /obj/machinery/light, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/structure/sign/warning/electricshock{ @@ -77017,7 +76639,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/effect/turf_decal/tile/red{ @@ -78859,7 +78481,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /obj/machinery/button/door{ @@ -78957,7 +78579,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-03" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -80876,7 +80498,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-02"; pixel_y = 3 }, @@ -81060,7 +80682,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /obj/structure/cable/yellow{ @@ -81738,13 +81360,6 @@ }, /turf/open/floor/plasteel, /area/security/main) -"cnJ" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12"; - req_one_access_txt = "0" - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/port) "cnK" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -83155,7 +82770,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ desc = "After his promotion, he was transferred to Kilo Station to serve as the gateway's protector."; icon_state = "plant-21"; name = "rodger" @@ -84466,7 +84081,7 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/stripes/corner, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel/showroomfloor, @@ -84688,21 +84303,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"crV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/port) "crW" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, @@ -85359,6 +84959,7 @@ "csT" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/maintenance/port) "csU" = ( @@ -85571,16 +85172,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/maintenance/port/fore) -"ctj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port) "ctk" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -85602,14 +85193,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/engine/atmos) -"ctl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating, -/area/maintenance/port) "ctm" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -86369,24 +85952,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/atmos) -"cuu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/port) "cuv" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -86426,7 +85991,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/turf_decal/stripes/corner, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -86441,17 +86005,12 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -86547,13 +86106,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"cuD" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/port) "cuE" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -86622,11 +86174,6 @@ }, /turf/open/floor/plasteel/dark, /area/medical/virology) -"cuI" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/port) "cuJ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -87499,7 +87046,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/corner, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-16" }, /turf/open/floor/plasteel, @@ -88709,7 +88256,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/machinery/light_switch{ @@ -90275,7 +89822,6 @@ }, /area/maintenance/starboard/aft) "czV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, @@ -90447,7 +89993,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-17"; pixel_x = 8; pixel_y = 3 @@ -90767,9 +90313,6 @@ /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, /obj/machinery/embedded_controller/radio/airlock_controller/incinerator_atmos{ pixel_x = 38; pixel_y = 6 @@ -91167,7 +90710,7 @@ "cBr" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/structure/grille/broken, /obj/effect/spawner/lootdrop/maintenance, @@ -91763,7 +91306,7 @@ "cCx" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /turf/open/floor/plating, /area/quartermaster/warehouse) @@ -92649,7 +92192,7 @@ /area/maintenance/fore) "cEi" = ( /obj/effect/turf_decal/bot, -/obj/machinery/computer/shuttle/mining{ +/obj/machinery/computer/shuttle_flight/mining{ dir = 4; req_access = null; req_one_access = null @@ -93315,7 +92858,7 @@ /turf/open/floor/plasteel/dark, /area/maintenance/starboard/fore) "cFh" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/effect/turf_decal/tile/neutral, @@ -93984,7 +93527,7 @@ /turf/open/floor/plasteel/dark, /area/maintenance/starboard/fore) "cGD" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/effect/turf_decal/tile/neutral, @@ -94545,7 +94088,7 @@ /area/space/nearstation) "cHE" = ( /obj/effect/decal/cleanable/cobweb, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-03" }, /obj/effect/turf_decal/stripes/corner{ @@ -94555,7 +94098,7 @@ /turf/open/floor/carpet/green, /area/maintenance/port) "cHF" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/effect/turf_decal/stripes/corner{ @@ -94893,7 +94436,7 @@ /turf/open/floor/carpet/green, /area/library) "cIn" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/machinery/light_switch{ @@ -95053,17 +94596,6 @@ }, /turf/open/floor/carpet/royalblue, /area/crew_quarters/heads/captain) -"cIy" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/computer/arcade, -/obj/machinery/newscaster{ - pixel_x = -30 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) "cIz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 10 @@ -95397,7 +94929,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-02"; pixel_y = 3 }, @@ -95629,6 +95161,7 @@ /obj/structure/table/wood, /obj/item/paper_bin, /obj/item/hand_labeler, +/obj/item/taperecorder, /turf/open/floor/carpet/green, /area/security/detectives_office) "cJn" = ( @@ -95748,6 +95281,10 @@ /obj/item/radio/intercom{ pixel_x = 28 }, +/obj/item/book/manual/wiki/detective{ + pixel_x = 7; + pixel_y = -5 + }, /turf/open/floor/carpet/green, /area/security/detectives_office) "cJv" = ( @@ -95903,7 +95440,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-02"; pixel_y = 3 }, @@ -96497,7 +96034,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/effect/turf_decal/tile/neutral{ @@ -96974,12 +96511,15 @@ pixel_y = -3 }, /obj/structure/table, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/structure/extinguisher_cabinet{ pixel_x = 24 }, +/obj/item/gun/grenadelauncher/security{ + pixel_y = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) "cLb" = ( @@ -97093,7 +96633,7 @@ /turf/open/floor/plasteel/dark, /area/security/processing) "cLk" = ( -/obj/machinery/computer/shuttle/labor{ +/obj/machinery/computer/shuttle_flight/labor{ dir = 1; icon_state = "computer" }, @@ -97532,20 +97072,6 @@ luminosity = 2 }, /area/engine/supermatter) -"cLO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/port) "cLP" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -97602,10 +97128,7 @@ dir = 10 }, /obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" + icon_state = "2-8" }, /turf/open/floor/plating, /area/maintenance/port/aft) @@ -97623,9 +97146,6 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, /obj/structure/cable/yellow{ icon_state = "2-4" }, @@ -98271,7 +97791,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/machinery/power/apc/highcap/five_k{ @@ -99291,7 +98811,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 9 }, -/obj/item/twohanded/required/kirbyplants, +/obj/item/kirbyplants, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, @@ -100559,9 +100079,23 @@ name = "Research Lab Desk"; req_one_access_txt = "7;29" }, -/obj/machinery/autolathe, +/obj/machinery/modular_fabricator/autolathe, /turf/open/floor/plasteel/dark, /area/science/lab) +"eRI" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -26 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/anesthetic_machine, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) "oOk" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral, @@ -100570,6 +100104,52 @@ }, /turf/open/floor/plasteel/dark, /area/science/lab) +"pTS" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table, +/obj/item/clipboard{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/book/manual/wiki/surgery, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/suit/apron/surgical, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/item/glove_box, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"qDr" = ( +/obj/structure/table/glass, +/obj/item/storage/box/rxglasses{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/box/beakers, +/obj/item/gun/syringe{ + pixel_y = 5 + }, +/obj/item/reagent_containers/spray/cleaner, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/item/glove_box, +/turf/open/floor/plasteel/dark, +/area/medical/storage) "sAg" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/landmark/start/brig_phys, @@ -100598,6 +100178,20 @@ /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/plasteel/showroomfloor, /area/science/lab) +"uJN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/mob/living/simple_animal/bot/cleanbot/medbay, +/turf/open/floor/plasteel/dark, +/area/medical/storage) "wLw" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow{ @@ -113598,7 +113192,7 @@ bAI cuw cux cuy -cLO +cLI cLI bDo ajd @@ -113857,7 +113451,7 @@ amA bAM amR cpX -bfL +crP ajd aer ajd @@ -114109,13 +113703,13 @@ blo amA amA cpX -amA -bwf -bAO -amA -amA -bfL -bAq +ahV +crP +cIc +crP +crP +crP +crP aLf aer bGN @@ -114365,18 +113959,18 @@ azg blq boM bpc -crQ -amR -bwg -ctj -ctl -amR -bym -byO -bJM -bJJ -bLh -bMf +awD +awD +awD +awD +awD +awD +awD +awD +awD +awD +awD +awD cLR bOW bQv @@ -114622,19 +114216,19 @@ biP blw bsW bwh -bBI -amA -awD -aSL -awD -awD -aSL -awD -awD -awD -bLv -cou -bzO +aQU +bJv +bJv +bJv +bJv +bJv +bJv +bJv +bJv +bJv +bJv +aQU +bMR bOX bQv bSF @@ -114878,19 +114472,19 @@ cpX amA blF aEw -bxq -crV -cuD -awD agp -bHg -bHg -cIy -bHg -bMq -aSL -bLP -bJW +aQU +bJv +bJv +bJv +bJv +bJv +bJv +bJv +bJv +bJv +bJv +aQU bJX bMS bQv @@ -115136,18 +114730,18 @@ biS cnL bqy byB -cuu -cuI -cnJ -ahV -bIR -bxQ -bLi -bLq -bMt -atk -bLT -bMh +aQU +bJv +bJv +bJv +bJv +bJv +bJv +bJv +bJv +bJv +bJv +aQU cLS bOY aer @@ -115394,16 +114988,16 @@ cnL amA bqz awD -aSL -awD -aQU -bLr -aQU -aQU -bLr -aQU -awD -aSL +bJv +bJv +bJv +bJv +bJv +bJv +bJv +bJv +bJv +bJv awD bMu aer @@ -117947,7 +117541,7 @@ aPA aPa aON aQm -beQ +uJN aOV aQn aUL @@ -118202,7 +117796,7 @@ aVI aPB aBF aOZ -aux +qDr aOO aQv aIh @@ -118726,7 +118320,7 @@ aPC aPI aSA aOZ -afH +eRI bdp aUs aQN @@ -119754,7 +119348,7 @@ aQQ aWM aVV aQL -ayW +pTS aUu bdP bgS @@ -128040,7 +127634,7 @@ cLd bPG byz aFU -aNe +aFO cyP bKO coj diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 78bc9f771103b..c12eee646523f 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -156,7 +156,6 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/prison) "aaz" = ( @@ -176,7 +175,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-03" }, /obj/effect/decal/cleanable/dirt, @@ -196,7 +195,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/item/twohanded/required/kirbyplants, +/obj/item/kirbyplants, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/security/prison) @@ -217,7 +216,6 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/prison) "aaG" = ( @@ -276,7 +274,6 @@ /obj/structure/cable/yellow{ icon_state = "0-8" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/prison) "aaM" = ( @@ -473,16 +470,6 @@ }, /turf/open/floor/plasteel/freezer, /area/security/prison) -"abj" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/easel, -/obj/item/canvas/twentythreeXtwentythree, -/obj/item/canvas/twentythreeXtwentythree, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/security/prison) "abk" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/yellow{ @@ -938,7 +925,7 @@ /turf/open/floor/plating, /area/security/prison) "acj" = ( -/obj/machinery/atmospherics/miner/n2o, +/obj/machinery/atmospherics/miner/station/n2o, /turf/open/floor/engine/n2o, /area/engine/atmos) "ack" = ( @@ -1095,7 +1082,6 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plasteel/dark, /area/security/execution/education) "acB" = ( @@ -1118,7 +1104,6 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plasteel/dark, /area/security/execution/education) "acC" = ( @@ -1155,10 +1140,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/execution/education) "acD" = ( @@ -1187,7 +1169,7 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-13" }, /obj/effect/decal/cleanable/dirt, @@ -2001,7 +1983,6 @@ id = "hosspace"; name = "space shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "aeb" = ( @@ -2016,7 +1997,6 @@ id = "hosspace"; name = "space shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "aec" = ( @@ -2031,7 +2011,6 @@ id = "hosspace"; name = "space shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "aed" = ( @@ -2040,7 +2019,6 @@ /area/crew_quarters/fitness/recreation) "aee" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/solars/port/fore) "aef" = ( @@ -2109,10 +2087,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/execution/education) "aek" = ( @@ -2175,7 +2150,7 @@ "aep" = ( /obj/machinery/door/airlock/security/glass{ name = "Prison Sanitarium"; - req_access_txt = "2" + req_one_access_txt = "1;34" }, /obj/structure/cable/yellow{ icon_state = "1-2" @@ -2190,10 +2165,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/prison) "aeq" = ( @@ -2249,7 +2221,7 @@ pixel_x = -26; pixel_y = 34 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "aeu" = ( @@ -2286,7 +2258,6 @@ /area/security/range) "aez" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/range) "aeA" = ( @@ -2301,14 +2272,6 @@ }, /turf/closed/wall, /area/crew_quarters/fitness/recreation) -"aeC" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/crew_quarters/fitness/recreation) "aeD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -2322,9 +2285,8 @@ "aeE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 + dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "aeF" = ( @@ -2333,7 +2295,7 @@ /turf/open/space, /area/solar/starboard/fore) "aeG" = ( -/obj/machinery/atmospherics/miner/toxins, +/obj/machinery/atmospherics/miner/station/toxins, /turf/open/floor/engine/plasma, /area/engine/atmos) "aeH" = ( @@ -2369,7 +2331,7 @@ /obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/machinery/atmospherics/pipe/manifold/general/visible, /obj/item/wrench, @@ -2675,7 +2637,6 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/prison) "afd" = ( @@ -2690,7 +2651,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/security/prison) "afe" = ( @@ -2901,6 +2862,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/pool/rubber_ring, +/obj/item/pool/pool_noodle, +/obj/item/pool/pool_noodle, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) "afx" = ( @@ -2915,6 +2879,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/pool/rubber_ring, +/obj/item/pool/pool_noodle, +/obj/item/pool/pool_noodle, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) "afy" = ( @@ -2929,6 +2896,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/pool/rubber_ring, +/obj/item/pool/pool_noodle, +/obj/item/pool/pool_noodle, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) "afz" = ( @@ -3000,7 +2970,7 @@ /area/maintenance/solars/port/fore) "afF" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/security/prison) "afG" = ( @@ -3170,7 +3140,6 @@ "afW" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/prison) "afX" = ( @@ -3304,7 +3273,6 @@ id = "hosprivacy"; name = "privacy shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "agf" = ( @@ -3382,7 +3350,6 @@ id = "hosprivacy"; name = "privacy shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "agn" = ( @@ -3405,25 +3372,6 @@ "agq" = ( /turf/closed/wall, /area/maintenance/fore) -"agr" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 - }, -/obj/machinery/button/door{ - id = "FitnessShower"; - name = "Lock Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 - }, -/obj/structure/mirror{ - pixel_x = -28 - }, -/obj/machinery/light/small, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/fitness/recreation) "ags" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -3550,11 +3498,13 @@ }, /area/maintenance/solars/port/fore) "agE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/firealarm{ dir = 4; pixel_x = -24 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "agF" = ( @@ -3633,17 +3583,14 @@ }, /obj/machinery/door/airlock/security/glass{ name = "Prison Wing"; - req_access_txt = "1" + req_one_access_txt = "1;34" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/prison) "agL" = ( @@ -3654,17 +3601,14 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/security/glass{ name = "Prison Wing"; - req_access_txt = "1" + req_one_access_txt = "1;34" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/prison) "agN" = ( @@ -3829,7 +3773,6 @@ id = "hosprivacy"; name = "privacy shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "agW" = ( @@ -3933,24 +3876,26 @@ /turf/open/floor/plasteel/dark, /area/medical/sleeper) "ahh" = ( -/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/pool/corner, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ahi" = ( /obj/structure/chair, /obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/pool, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ahj" = ( -/obj/structure/chair, /obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/pool, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ahk" = ( -/obj/structure/chair, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/chair, +/obj/effect/turf_decal/pool, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ahl" = ( @@ -3987,8 +3932,11 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "aho" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "ahp" = ( /turf/closed/wall, @@ -4154,7 +4102,7 @@ pixel_x = 1; pixel_y = -2 }, -/obj/item/gun/grenadelauncher, +/obj/item/gun/grenadelauncher/security, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -4372,10 +4320,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) "ahQ" = ( @@ -4420,9 +4365,6 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, /obj/machinery/door/airlock{ id_tag = "FitnessShower"; name = "Fitness Room Shower" @@ -4430,29 +4372,11 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ahW" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/door/window/eastright{ - dir = 8; - name = "Fitness Ring" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) -"ahX" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, +/obj/machinery/pool_filter, +/turf/open/indestructible/sound/pool/end, /area/crew_quarters/fitness/recreation) "ahY" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, +/turf/open/indestructible/sound/pool/end, /area/crew_quarters/fitness/recreation) "ahZ" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -4479,53 +4403,17 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aic" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "aid" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/firealarm{ - pixel_y = 27 - }, -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, /area/crew_quarters/fitness/recreation) "aie" = ( -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) "aif" = ( /obj/machinery/door/poddoor{ id = "trash"; @@ -4652,12 +4540,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "aiu" = ( @@ -4782,7 +4665,6 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/main) "aiE" = ( @@ -4828,10 +4710,7 @@ icon_state = "1-4" }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/carpet/red, /area/crew_quarters/heads/hos) "aiH" = ( @@ -4909,18 +4788,12 @@ /area/maintenance/port/fore) "aiR" = ( /obj/structure/table, -/obj/item/clothing/under/suit/sl{ - desc = "Whoever wears this makes the rules."; - name = "referee suit" - }, /obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aiS" = ( -/obj/structure/window/reinforced{ - dir = 8 +/obj/effect/turf_decal/pool{ + dir = 4 }, -/turf/open/floor/plasteel/dark, +/obj/item/pool/pool_noodle, +/turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "aiT" = ( /obj/effect/decal/cleanable/dirt, @@ -4930,26 +4803,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"aiU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/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/crew_quarters/fitness/recreation) -"aiV" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) "aiW" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/simple/general/visible, @@ -4967,16 +4820,16 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "aiZ" = ( -/obj/machinery/computer/holodeck{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aja" = ( -/obj/structure/chair{ +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/effect/landmark/start/assistant, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ajb" = ( @@ -5051,7 +4904,7 @@ /turf/open/floor/plating, /area/janitor) "ajl" = ( -/obj/machinery/atmospherics/miner/carbon_dioxide, +/obj/machinery/atmospherics/miner/station/carbon_dioxide, /turf/open/floor/engine/co2, /area/engine/atmos) "ajm" = ( @@ -5060,7 +4913,7 @@ "ajn" = ( /obj/machinery/door/airlock/security/glass{ name = "Prison Wing"; - req_access_txt = "1" + req_one_access_txt = "1;34" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/yellow{ @@ -5077,10 +4930,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "ajo" = ( @@ -5091,7 +4941,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/security/glass{ name = "Prison Wing"; - req_access_txt = "1" + req_one_access_txt = "1;34" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -5104,10 +4954,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "ajq" = ( @@ -5437,7 +5284,7 @@ /turf/open/floor/plasteel, /area/security/range) "ajO" = ( -/obj/machinery/atmospherics/miner/nitrogen, +/obj/machinery/atmospherics/miner/station/nitrogen, /turf/open/floor/engine/n2, /area/engine/atmos) "ajP" = ( @@ -5461,60 +5308,20 @@ /obj/structure/chair/stool{ pixel_y = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ajS" = ( /obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/item/storage/firstaid/brute, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"ajT" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) -"ajU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/effect/turf_decal/pool{ 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, +/turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ajV" = ( -/obj/machinery/atmospherics/pipe/manifold/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/dark, +/obj/item/pool/rubber_ring, +/turf/open/indestructible/sound/pool, /area/crew_quarters/fitness/recreation) "ajW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -5522,16 +5329,10 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ajX" = ( -/obj/structure/table, -/obj/item/paper/fluff/holodeck/disclaimer, -/obj/item/storage/firstaid/regular{ - pixel_x = 3; - pixel_y = -3 +/obj/machinery/airalarm{ + pixel_y = 24 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"ajY" = ( -/obj/structure/chair{ +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, /turf/open/floor/plasteel, @@ -5584,16 +5385,13 @@ }, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) -"akd" = ( -/turf/open/space, -/area/maintenance/solars/starboard/fore) "ake" = ( /obj/structure/cable{ icon_state = "0-2" }, /obj/structure/lattice/catwalk, /turf/open/space, -/area/maintenance/solars/starboard/fore) +/area/solar/starboard/fore) "akf" = ( /obj/machinery/conveyor{ dir = 1; @@ -5666,12 +5464,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/disposal) "akm" = ( @@ -6257,10 +6049,12 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "alh" = ( @@ -6273,40 +6067,18 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"ali" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/pool{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"alj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +"alk" = ( /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/effect/turf_decal/pool{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) -"alk" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "all" = ( @@ -6326,58 +6098,34 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "aln" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/computer/holodeck{ dir = 4 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "alo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Holodeck"; - dir = 1 - }, -/obj/item/radio/intercom{ - pixel_y = -28 +/obj/structure/chair{ + dir = 8 }, -/obj/machinery/light/small, +/obj/effect/landmark/start/assistant, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "alp" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +/obj/machinery/door/airlock/external{ + req_access_txt = "13" }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "alq" = ( /turf/closed/wall, /area/maintenance/starboard) "alr" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/starboard) "als" = ( @@ -6408,7 +6156,6 @@ /area/engine/gravity_generator) "alv" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) "alw" = ( @@ -6505,9 +6252,7 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/port/fore) "alE" = ( @@ -6538,7 +6283,7 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "alJ" = ( -/obj/effect/landmark/blobstart, +/obj/structure/rack, /turf/open/floor/plating, /area/maintenance/starboard/fore) "alK" = ( @@ -6630,12 +6375,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/warden) "alS" = ( @@ -6697,12 +6437,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/warden) "alW" = ( @@ -6744,12 +6479,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/warden) "alY" = ( @@ -6807,12 +6537,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/warden) "amb" = ( @@ -7006,12 +6731,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/range) "amq" = ( @@ -7082,12 +6802,16 @@ /turf/open/floor/plasteel, /area/security/range) "amt" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/structure/table, +/obj/item/paper/fluff/holodeck/disclaimer, +/obj/item/storage/firstaid/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "amu" = ( -/obj/machinery/atmospherics/miner/oxygen, +/obj/machinery/atmospherics/miner/station/oxygen, /turf/open/floor/engine/o2, /area/engine/atmos) "amv" = ( @@ -7104,41 +6828,8 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) -"amw" = ( -/obj/structure/window/reinforced, -/obj/machinery/door/window/eastright{ - base_state = "left"; - dir = 8; - icon_state = "left"; - name = "Fitness Ring" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) -"amx" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) -"amy" = ( -/obj/structure/window/reinforced, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) -"amz" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness/recreation) "amA" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plasteel/dark, +/turf/open/indestructible/sound/pool, /area/crew_quarters/fitness/recreation) "amB" = ( /obj/effect/decal/cleanable/dirt, @@ -7162,10 +6853,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) -"amE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/crew_quarters/fitness/recreation) "amF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -7176,11 +6863,9 @@ /turf/open/floor/plating, /area/maintenance/fore) "amH" = ( -/obj/machinery/door/airlock/external{ - req_one_access_txt = "13,8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/crew_quarters/fitness/recreation) "amI" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -7411,7 +7096,6 @@ /turf/open/floor/plasteel, /area/security/brig) "anj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/light{ dir = 4 }, @@ -7666,16 +7350,14 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"anG" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "anH" = ( /obj/structure/chair{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/pool{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel, @@ -7685,18 +7367,27 @@ dir = 1 }, /obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/pool{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "anJ" = ( /obj/structure/chair{ dir = 1 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/effect/turf_decal/pool{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "anK" = ( @@ -7706,6 +7397,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/effect/turf_decal/pool{ + dir = 1 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "anL" = ( @@ -7719,10 +7413,10 @@ /turf/open/floor/plating, /area/maintenance/starboard) "anN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 }, -/turf/open/floor/plating, +/turf/closed/wall, /area/maintenance/starboard/fore) "anO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -7896,6 +7590,7 @@ dir = 9 }, /obj/structure/closet/radiation, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) "aok" = ( @@ -8067,10 +7762,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/warden) "aov" = ( @@ -8105,10 +7797,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/warden) "aox" = ( @@ -8208,9 +7897,6 @@ /turf/open/floor/plasteel, /area/security/main) "aoG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -8386,26 +8072,16 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"aoV" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "aoW" = ( /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "aoX" = ( @@ -8450,14 +8126,6 @@ "apc" = ( /turf/open/floor/plating, /area/maintenance/starboard) -"apd" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "ape" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ @@ -8503,6 +8171,7 @@ req_access_txt = "19; 61"; security_level = 6 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) "apk" = ( @@ -8585,10 +8254,6 @@ req_access_txt = "12" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plating, /area/maintenance/disposal) "apt" = ( @@ -9061,11 +8726,18 @@ /turf/closed/wall, /area/crew_quarters/fitness/recreation) "aqp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +/obj/machinery/advanced_airlock_controller/directional/west, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 8 }, -/turf/closed/wall, -/area/crew_quarters/fitness/recreation) +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "aqq" = ( /obj/item/cigbutt, /turf/open/floor/plating, @@ -9342,7 +9014,7 @@ /turf/open/floor/plasteel/dark, /area/security/brig) "aqZ" = ( -/obj/machinery/computer/shuttle/labor, +/obj/machinery/computer/shuttle_flight/labor, /turf/open/floor/plasteel/dark, /area/security/brig) "ara" = ( @@ -9572,12 +9244,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/grimy, /area/security/main) "arv" = ( @@ -9639,10 +9306,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "arD" = ( @@ -9665,10 +9329,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "arF" = ( @@ -9964,9 +9625,6 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "asn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, /obj/machinery/camera{ c_tag = "Labor Shuttle Control Desk"; dir = 4 @@ -10467,7 +10125,6 @@ /area/maintenance/starboard/secondary) "ate" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/port) "atf" = ( @@ -10486,6 +10143,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/gravity_generator) "ath" = ( @@ -10837,10 +10495,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/warden) "atS" = ( @@ -10853,10 +10508,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/warden) "atT" = ( @@ -10876,10 +10528,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/main) "atV" = ( @@ -10896,10 +10545,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/main) "atW" = ( @@ -10947,12 +10593,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/dorms) -"aue" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/dorms) "auf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -11020,9 +10660,6 @@ }, /turf/open/floor/carpet/orange, /area/crew_quarters/dorms) -"aun" = ( -/turf/open/floor/carpet/orange, -/area/crew_quarters/dorms) "aup" = ( /obj/effect/spawner/room/tenxten, /turf/open/floor/plating, @@ -11146,12 +10783,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"auD" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "auE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ @@ -11222,7 +10853,6 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/port/fore) "auO" = ( @@ -11233,7 +10863,6 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/port/fore) "auP" = ( @@ -11242,26 +10871,12 @@ /obj/structure/cable/yellow{ icon_state = "0-8" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/port/fore) "auR" = ( /obj/effect/spawner/room/threexthree, /turf/open/floor/plating, /area/maintenance/aft) -"auS" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_one_access_txt = "12;47" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "auT" = ( /turf/open/floor/plating, /area/maintenance/starboard/aft) @@ -11357,10 +10972,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "avb" = ( @@ -11512,15 +11124,6 @@ }, /turf/closed/wall, /area/crew_quarters/dorms) -"avq" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "avr" = ( /turf/open/floor/plating, /area/maintenance/aft) @@ -11535,11 +11138,8 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, /turf/open/floor/plating, /area/maintenance/starboard/fore) @@ -11562,12 +11162,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"avw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "avx" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, @@ -11664,34 +11258,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"avH" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"avI" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"avJ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "avK" = ( /obj/effect/spawner/room/threexthree, /turf/open/floor/plating, @@ -12069,12 +11635,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel/dark, /area/security/brig) "awv" = ( @@ -12218,6 +11778,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/gravity_generator) "awL" = ( @@ -12607,12 +12168,6 @@ "axC" = ( /turf/closed/wall, /area/crew_quarters/toilet/restrooms) -"axD" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/carpet/purple, -/area/crew_quarters/dorms) "axE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -12831,9 +12386,19 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) +"ayh" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 3 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "ayi" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/miningoffice) "ayj" = ( @@ -13030,10 +12595,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "ayC" = ( @@ -13058,10 +12620,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "ayD" = ( @@ -13124,10 +12683,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/detectives_office) "ayI" = ( @@ -13182,18 +12738,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"ayO" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) "ayP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -13259,12 +12803,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/engineering) "ayX" = ( @@ -13299,7 +12838,7 @@ /area/space/nearstation) "aze" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/library) "azj" = ( @@ -13566,7 +13105,6 @@ /area/security/nuke_storage) "azC" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/fore) "azD" = ( @@ -13721,20 +13259,28 @@ dir = 4; pixel_x = -24 }, -/obj/structure/filingcabinet, /obj/machinery/light/small{ dir = 1 }, /obj/machinery/light_switch{ pixel_y = 25 }, +/obj/structure/rack, +/obj/item/storage/secure/briefcase{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/storage/briefcase{ + pixel_x = -3; + pixel_y = 2 + }, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "azR" = ( /obj/structure/cable/yellow{ icon_state = "1-4" }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "azS" = ( @@ -13825,30 +13371,11 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"aAa" = ( -/obj/structure/mirror{ - pixel_x = -28 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/shower{ - dir = 4 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/restrooms) "aAb" = ( /obj/effect/landmark/xeno_spawn, /obj/item/bikehorn/rubberducky, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) -"aAc" = ( -/obj/structure/mirror{ - pixel_x = 28 - }, -/obj/machinery/shower{ - dir = 8 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/restrooms) "aAd" = ( /obj/machinery/washing_machine, /obj/effect/turf_decal/tile/blue{ @@ -14555,19 +14082,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"aBz" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) "aBA" = ( /obj/structure/cable/yellow{ icon_state = "1-8" @@ -14587,7 +14101,7 @@ /area/crew_quarters/dorms) "aBD" = ( /obj/effect/decal/cleanable/cobweb, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-20"; pixel_y = 3 }, @@ -14767,7 +14281,7 @@ c_tag = "Mining Office"; dir = 8 }, -/obj/machinery/mineral/equipment_vendor, +/obj/machinery/vendor/mining, /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -14969,10 +14483,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "aCo" = ( @@ -15016,10 +14527,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "aCq" = ( @@ -15038,10 +14546,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "aCr" = ( @@ -15053,13 +14558,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "aCs" = ( -/obj/structure/table/wood, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, /obj/machinery/power/apc{ areastring = "/area/security/detectives_office"; dir = 8; @@ -15069,11 +14571,6 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/item/taperecorder{ - pixel_x = 3 - }, -/obj/item/storage/box/evidence, -/obj/item/flashlight/seclite, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aCt" = ( @@ -15158,12 +14655,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"aCD" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) "aCE" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -15339,10 +14830,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/engineering) "aCZ" = ( @@ -15369,7 +14857,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/computer/shuttle/mining{ +/obj/machinery/computer/shuttle_flight/mining{ dir = 4; req_access = null }, @@ -15482,6 +14970,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/nuke_storage) "aDs" = ( @@ -15567,13 +15056,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"aDB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aDC" = ( /turf/open/floor/plasteel, /area/hallway/primary/fore) @@ -15741,15 +15223,7 @@ /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aDN" = ( -/obj/structure/rack, -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/storage/secure/briefcase{ - pixel_x = 2; - pixel_y = -2 - }, +/obj/machinery/vending/wardrobe/det_wardrobe, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aDO" = ( @@ -15762,26 +15236,6 @@ icon_state = "platingdmg1" }, /area/maintenance/fore) -"aDP" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/newscaster{ - pixel_y = -32 - }, -/obj/machinery/button/door{ - id = "Toilet3"; - name = "Lock Control"; - normaldoorcontrol = 1; - pixel_x = -25; - specialfunctions = 4 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/restrooms) "aDQ" = ( /obj/machinery/door/airlock{ id_tag = "Toilet3"; @@ -15907,12 +15361,6 @@ }, /turf/open/floor/carpet/blue, /area/crew_quarters/dorms) -"aEf" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/carpet/blue, -/area/crew_quarters/dorms) "aEg" = ( /obj/machinery/light/small, /turf/open/floor/carpet/blue, @@ -15985,12 +15433,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel{ dir = 1 }, @@ -16176,7 +15619,6 @@ icon_state = "0-2" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/construction/storage_wing) "aEG" = ( @@ -16201,7 +15643,6 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/construction/storage_wing) "aEI" = ( @@ -16277,15 +15718,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"aEQ" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aER" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -16346,6 +15778,7 @@ id = "briglockdown"; name = "brig shutters" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "aEW" = ( @@ -16380,20 +15813,16 @@ /turf/open/floor/plasteel/dark, /area/security/brig) "aEZ" = ( -/obj/structure/window/reinforced{ +/obj/machinery/door/window{ dir = 1 }, -/obj/structure/table, -/obj/item/bodybag, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aFa" = ( -/obj/machinery/door/window{ +/obj/structure/window/reinforced{ dir = 1 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aFb" = ( /obj/machinery/door/airlock/maintenance{ @@ -16443,16 +15872,6 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) -"aFg" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/restrooms) "aFh" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -16478,12 +15897,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) "aFj" = ( @@ -16515,11 +15929,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"aFn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) "aFo" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/firealarm{ @@ -16636,7 +16045,7 @@ }, /obj/structure/lattice, /turf/open/space, -/area/maintenance/solars/starboard/fore) +/area/space/nearstation) "aFz" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Supermatter Engine"; @@ -16648,12 +16057,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/engine/engineering) "aFA" = ( @@ -16811,7 +16215,6 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/construction/storage_wing) "aFP" = ( @@ -16822,7 +16225,6 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/construction/storage_wing) "aFQ" = ( @@ -16832,7 +16234,6 @@ }, /obj/structure/cable/yellow, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/construction/storage_wing) "aFR" = ( @@ -16860,10 +16261,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/construction/storage_wing) "aFS" = ( @@ -16872,7 +16270,6 @@ icon_state = "0-4" }, /obj/structure/cable/yellow, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/construction/storage_wing) "aFT" = ( @@ -16886,7 +16283,6 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/construction/storage_wing) "aFU" = ( @@ -16894,7 +16290,6 @@ /obj/structure/cable/yellow{ icon_state = "0-8" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/construction/storage_wing) "aFV" = ( @@ -16946,12 +16341,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/hallway/primary/fore) "aFZ" = ( @@ -16994,18 +16384,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"aGc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aGd" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -17191,12 +16569,13 @@ /turf/open/floor/plasteel/dark, /area/security/brig) "aGu" = ( -/obj/structure/bodycontainer/morgue, -/turf/open/floor/plasteel/dark, +/obj/machinery/light/small, +/obj/structure/filingcabinet/security, +/turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aGv" = ( -/obj/machinery/light/small, -/turf/open/floor/plasteel/dark, +/obj/structure/closet/secure_closet/detective, +/turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aGw" = ( /obj/structure/cable/yellow{ @@ -17244,26 +16623,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"aGz" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/newscaster{ - pixel_y = -32 - }, -/obj/effect/landmark/blobstart, -/obj/machinery/button/door{ - id = "Toilet2"; - name = "Lock Control"; - normaldoorcontrol = 1; - pixel_x = -25; - specialfunctions = 4 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/restrooms) "aGA" = ( /obj/machinery/door/airlock{ id_tag = "Toilet2"; @@ -17320,13 +16679,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"aGH" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) "aGI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -17354,11 +16706,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"aGL" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) "aGM" = ( /obj/machinery/door/airlock{ id_tag = "Cabin7"; @@ -17442,8 +16789,8 @@ /obj/effect/turf_decal/bot{ dir = 1 }, -/obj/item/twohanded/rcl/pre_loaded, -/obj/item/twohanded/rcl/pre_loaded, +/obj/item/rcl/pre_loaded, +/obj/item/rcl/pre_loaded, /turf/open/floor/plasteel{ dir = 1 }, @@ -17522,10 +16869,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "aHe" = ( @@ -17590,12 +16934,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/construction/storage_wing) "aHk" = ( @@ -17638,12 +16977,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/construction/storage_wing) "aHn" = ( @@ -17655,15 +16989,6 @@ }, /turf/open/floor/plasteel, /area/construction/storage_wing) -"aHo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/construction/storage_wing) "aHp" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/effect/turf_decal/tile/brown{ @@ -17738,7 +17063,6 @@ "aHy" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/fore) "aHz" = ( @@ -17766,20 +17090,14 @@ /turf/closed/wall/r_wall, /area/security/courtroom) "aHF" = ( -/obj/machinery/door/airlock/security{ - name = "Court Cell"; - req_access_txt = "63" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +/obj/structure/table/wood, +/obj/item/storage/box/evidence, +/obj/item/taperecorder{ + pixel_x = 3 }, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) +/obj/item/flashlight/seclite, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) "aHG" = ( /turf/closed/wall, /area/lawoffice) @@ -17793,15 +17111,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"aHI" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/machinery/light_switch{ - pixel_x = -26 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/restrooms) "aHJ" = ( /obj/structure/sink{ dir = 4; @@ -17842,13 +17151,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"aHN" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) "aHO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -17901,12 +17203,6 @@ /obj/item/bedsheet/dorms, /turf/open/floor/wood, /area/crew_quarters/dorms) -"aHT" = ( -/obj/structure/chair/wood/normal{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/dorms) "aHU" = ( /obj/structure/table/wood, /obj/machinery/newscaster{ @@ -17966,7 +17262,6 @@ }, /obj/effect/spawner/structure/window/plasma/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/engineering) "aIe" = ( @@ -17982,7 +17277,7 @@ id = "aux_base_shutters"; name = "Public Shutters Control"; pixel_y = -24; - req_one_access_txt = "32;47;48" + req_one_access_txt = "72" }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -17992,7 +17287,6 @@ /area/construction/mining/aux_base) "aIg" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/storage) "aIh" = ( @@ -18138,12 +17432,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/construction/storage_wing) "aIs" = ( @@ -18294,12 +17583,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/hallway/primary/fore) "aID" = ( @@ -18347,7 +17631,6 @@ /obj/structure/cable/yellow{ icon_state = "0-8" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/fore) "aIH" = ( @@ -18355,7 +17638,6 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/fore) "aII" = ( @@ -18520,7 +17802,7 @@ name = "Law Office APC"; pixel_y = 24 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/lawoffice) "aIY" = ( @@ -18538,26 +17820,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/fore) -"aJa" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/newscaster{ - pixel_y = -32 - }, -/obj/effect/landmark/blobstart, -/obj/machinery/button/door{ - id = "Toilet1"; - name = "Lock Control"; - normaldoorcontrol = 1; - pixel_x = -25; - specialfunctions = 4 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/restrooms) "aJb" = ( /obj/machinery/door/airlock{ id_tag = "Toilet1"; @@ -18565,26 +17827,6 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) -"aJc" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/obj/machinery/button/door{ - id = "Toilet4"; - name = "Lock Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/restrooms) "aJd" = ( /obj/machinery/light/small, /obj/machinery/recharge_station, @@ -18678,7 +17920,6 @@ "aJB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/storage) "aJC" = ( @@ -18815,10 +18056,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/primary) "aJQ" = ( @@ -18834,10 +18072,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/primary) "aJR" = ( @@ -18864,14 +18099,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"aJV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aJW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -18886,12 +18113,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/courtroom) "aJX" = ( @@ -19052,10 +18274,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) "aKm" = ( @@ -19073,10 +18292,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "aKn" = ( @@ -19096,10 +18312,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "aKp" = ( @@ -19179,7 +18392,7 @@ "aKw" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/wirecutters, /obj/item/weldingtool, @@ -19561,7 +18774,7 @@ c_tag = "AI Upload Chamber - Fore"; network = list("aiupload") }, -/obj/item/twohanded/required/kirbyplants/photosynthetic{ +/obj/item/kirbyplants/photosynthetic{ pixel_y = 10 }, /turf/open/floor/plasteel/dark, @@ -19751,16 +18964,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"aLR" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) "aLS" = ( /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, @@ -19886,12 +19089,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/engine/engineering) "aMh" = ( @@ -19910,9 +19108,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/components/binary/volume_pump/on{ - icon_state = "volpump_on_map-2"; - name = "Gas to Filter" +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Waste to Filter" }, /turf/open/floor/engine, /area/engine/engineering) @@ -20035,12 +19232,6 @@ "aMB" = ( /turf/open/floor/plasteel, /area/storage/primary) -"aMC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/storage/primary) "aMD" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -20194,12 +19385,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/security/courtroom) "aMR" = ( @@ -20346,13 +19532,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"aNe" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) "aNf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/navbeacon{ @@ -20760,7 +19939,6 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai_upload) "aOa" = ( @@ -21089,12 +20267,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics/garden) "aOH" = ( @@ -21364,12 +20537,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/qm) "aPh" = ( @@ -21507,7 +20675,6 @@ icon_state = "0-4" }, /obj/structure/cable/yellow, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai_upload) "aPt" = ( @@ -21556,7 +20723,6 @@ icon_state = "0-8" }, /obj/structure/cable/yellow, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai_upload) "aPz" = ( @@ -21595,10 +20761,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/courtroom) "aPD" = ( @@ -21626,10 +20789,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/lawoffice) "aPG" = ( @@ -21663,13 +20823,6 @@ /obj/item/storage/pill_bottle/dice, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"aPJ" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) "aPK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -21852,6 +21005,13 @@ /obj/item/storage/belt/utility, /turf/open/floor/plasteel, /area/engine/engineering) +"aQc" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aQd" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -21901,7 +21061,7 @@ /area/quartermaster/storage) "aQk" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/spawner/lootdrop/maintenance/two, @@ -21986,7 +21146,7 @@ /area/quartermaster/qm) "aQu" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/machinery/light{ dir = 8 @@ -22152,7 +21312,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aQL" = ( @@ -22236,30 +21396,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"aQQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aQR" = ( @@ -22271,18 +21408,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"aQS" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) "aQT" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -22557,6 +21682,15 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engineering) +"aRw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) "aRy" = ( /turf/closed/wall/r_wall, /area/aisat) @@ -22671,7 +21805,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/quartermaster/qm) "aRM" = ( @@ -22789,12 +21923,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/courtroom) "aRY" = ( @@ -22815,15 +21944,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/security/courtroom) -"aSb" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) "aSc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -22977,12 +22097,7 @@ /obj/effect/turf_decal/bot{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel{ dir = 1 }, @@ -23113,7 +22228,7 @@ /turf/open/floor/plating, /area/hallway/secondary/entry) "aSJ" = ( -/obj/machinery/computer/shuttle/mining{ +/obj/machinery/computer/shuttle_flight/mining{ dir = 4 }, /obj/effect/turf_decal/tile/yellow{ @@ -23184,7 +22299,7 @@ /area/maintenance/port) "aSP" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /turf/open/floor/plating, /area/maintenance/port/fore) @@ -23344,25 +22459,11 @@ }, /turf/open/floor/plasteel, /area/storage/primary) -"aTg" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/storage/primary) "aTh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow{ icon_state = "0-8" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/storage/primary) "aTi" = ( @@ -23374,21 +22475,9 @@ icon_state = "1-2" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) -"aTj" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aTk" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -23397,7 +22486,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/security/courtroom) "aTm" = ( @@ -23477,12 +22566,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aTv" = ( @@ -23512,14 +22596,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"aTx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/light, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) "aTy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -24020,7 +23096,6 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/central) "aUx" = ( @@ -24141,10 +23216,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aUD" = ( @@ -24158,10 +23230,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aUE" = ( @@ -24174,10 +23243,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aUF" = ( @@ -24263,48 +23329,6 @@ "aUM" = ( /turf/closed/wall, /area/crew_quarters/locker) -"aUN" = ( -/obj/structure/closet/wardrobe/black, -/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/crew_quarters/locker) -"aUO" = ( -/obj/structure/closet/wardrobe/grey, -/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/crew_quarters/locker) -"aUP" = ( -/obj/structure/closet/wardrobe/white, -/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/crew_quarters/locker) "aUQ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -24318,20 +23342,6 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/locker) -"aUR" = ( -/obj/structure/closet/wardrobe/green, -/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/crew_quarters/locker) "aUS" = ( /obj/machinery/vending/clothing, /obj/effect/turf_decal/tile/neutral{ @@ -24346,20 +23356,6 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/locker) -"aUT" = ( -/obj/structure/closet/wardrobe/mixed, -/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/crew_quarters/locker) "aUU" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -24414,7 +23410,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/dorms) "aUY" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/engine/engineering) "aUZ" = ( @@ -24470,10 +23466,7 @@ name = "Supermatter Engine"; req_access_txt = "10" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/maintenance/starboard) "aVh" = ( @@ -24481,7 +23474,6 @@ dir = 4 }, /obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/engineering) "aVk" = ( @@ -24545,7 +23537,7 @@ /turf/open/floor/plating, /area/hallway/secondary/entry) "aVt" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-13" }, /obj/effect/turf_decal/stripes/line{ @@ -24559,16 +23551,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"aVv" = ( -/obj/item/radio/intercom{ - pixel_y = 21 - }, -/obj/structure/chair, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "aVw" = ( /obj/structure/chair, /obj/effect/turf_decal/stripes/line{ @@ -24740,12 +23722,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/supply) "aVN" = ( @@ -24809,10 +23786,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/primary) "aVT" = ( @@ -24830,57 +23804,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/primary) -"aVU" = ( -/obj/structure/closet/firecloset, -/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/hallway/primary/central) -"aVV" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/closet/emcloset, -/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/hallway/primary/central) -"aVW" = ( -/obj/structure/closet/emcloset, -/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/hallway/primary/central) "aVX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, @@ -24906,10 +23832,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload_foyer) "aVZ" = ( @@ -24929,7 +23852,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/central) "aWb" = ( @@ -24981,13 +23904,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aWg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aWh" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -25039,7 +23955,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/central) "aWl" = ( @@ -25055,10 +23971,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/courtroom) "aWm" = ( @@ -25073,10 +23986,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aWn" = ( @@ -25088,10 +23998,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aWo" = ( @@ -25272,10 +24179,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel{ dir = 1 }, @@ -25302,10 +24206,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel{ dir = 1 }, @@ -25388,15 +24289,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"aWW" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "aWX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -25417,15 +24309,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"aXa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "aXb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -25439,22 +24322,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"aXd" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/obj/machinery/camera{ - c_tag = "Arrivals - Fore Arm"; - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) "aXe" = ( /obj/machinery/conveyor{ dir = 4; @@ -25746,12 +24613,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aXC" = ( @@ -25763,18 +24625,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aXD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aXE" = ( /obj/machinery/light/small{ dir = 1 @@ -25863,15 +24713,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aXL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/plaque{ - icon_state = "L3" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aXM" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -25966,25 +24807,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"aXW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aXX" = ( @@ -26335,7 +25158,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "aYF" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /obj/effect/turf_decal/stripes/line{ @@ -26466,13 +25289,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"aYU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aYV" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -26533,12 +25349,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aZb" = ( @@ -26550,13 +25361,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aZc" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aZd" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -26567,16 +25371,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aZe" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/holopad, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aZf" = ( /obj/structure/cable/yellow{ icon_state = "1-8" @@ -26586,15 +25380,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aZg" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/plaque{ - icon_state = "L2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aZh" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -26618,15 +25403,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aZk" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/plaque{ - icon_state = "L10" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aZl" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -26877,7 +25653,7 @@ charge = 100; maxcharge = 15000 }, -/obj/item/twohanded/rcl/pre_loaded, +/obj/item/rcl/pre_loaded, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -27002,12 +25778,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/library) "aZQ" = ( @@ -27398,10 +26169,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "bav" = ( @@ -27418,10 +26186,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "baw" = ( @@ -27495,7 +26260,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/port) "baC" = ( @@ -27582,12 +26347,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "baL" = ( @@ -27628,15 +26388,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/central) -"baP" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "baQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -27691,16 +26442,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"baW" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/machinery/light, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "baX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -27718,12 +26459,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "baY" = ( @@ -27802,7 +26538,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/storage/tools) "bbe" = ( @@ -28336,7 +27072,6 @@ /area/quartermaster/office) "bbV" = ( /obj/structure/table/reinforced, -/obj/machinery/door/firedoor, /obj/machinery/door/window/westleft{ name = "Cargo Desk"; req_access_txt = "50" @@ -28346,6 +27081,7 @@ pixel_y = 7 }, /obj/item/pen, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "bbW" = ( @@ -28381,16 +27117,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"bcb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/status_display/evac{ - pixel_x = -32 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bcd" = ( /turf/closed/wall, /area/janitor) @@ -28413,7 +27139,6 @@ /area/maintenance/central) "bci" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/central) "bcj" = ( @@ -28497,7 +27222,6 @@ /area/maintenance/starboard/fore) "bcu" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/storage/tech) "bcv" = ( @@ -29267,25 +27991,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bdP" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bdQ" = ( @@ -29297,10 +28003,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bdR" = ( @@ -29595,10 +28298,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel{ dir = 1 }, @@ -29633,7 +28333,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/security/checkpoint/engineering) "ben" = ( @@ -29690,9 +28390,6 @@ /turf/closed/wall/r_wall, /area/space/nearstation) "bes" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, @@ -29989,12 +28686,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bfh" = ( @@ -30025,12 +28717,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/vacant_room/commissary) "bfk" = ( @@ -30121,7 +28808,6 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "bfs" = ( @@ -30139,7 +28825,6 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "bft" = ( @@ -30154,7 +28839,6 @@ id = "bridge blast"; name = "bridge blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "bfu" = ( @@ -30166,7 +28850,6 @@ id = "bridge blast"; name = "bridge blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "bfv" = ( @@ -30181,7 +28864,6 @@ id = "bridge blast"; name = "bridge blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "bfx" = ( @@ -30196,7 +28878,6 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "bfy" = ( @@ -30282,10 +28963,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/tools) "bfJ" = ( @@ -30370,10 +29048,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/storage/tech) "bfQ" = ( @@ -30444,10 +29119,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/engineering) "bfX" = ( @@ -30465,7 +29137,7 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plating, /area/engine/break_room) "bgc" = ( @@ -30473,6 +29145,9 @@ name = "MiniSat Space Access Airlock"; req_one_access_txt = "32;19" }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, /turf/open/floor/plating, /area/aisat) "bgd" = ( @@ -30531,6 +29206,9 @@ name = "MiniSat Space Access Airlock"; req_one_access_txt = "32;19" }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/aisat) "bgg" = ( @@ -30855,12 +29533,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/sorting) "bgO" = ( @@ -30946,12 +29619,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "bgU" = ( @@ -31024,12 +29692,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bha" = ( @@ -31045,12 +29708,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/vacant_room/commissary) "bhb" = ( @@ -31113,7 +29771,6 @@ name = "bridge blast door" }, /obj/structure/cable/yellow, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "bhh" = ( @@ -31267,7 +29924,6 @@ name = "bridge blast door" }, /obj/structure/cable/yellow, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "bht" = ( @@ -31306,7 +29962,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/carpet/royalblue, /area/crew_quarters/heads/captain/private) "bhw" = ( @@ -31346,19 +30002,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bhB" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=14.2-Central-CrewQuarters"; - location = "14-Starboard-Central" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bhC" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -31384,12 +30027,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bhE" = ( @@ -31465,12 +30103,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bhL" = ( @@ -31739,7 +30372,6 @@ /area/engine/break_room) "bie" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/break_room) "bif" = ( @@ -31771,7 +30403,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 + dir = 8 }, /turf/open/floor/plasteel/dark, /area/aisat) @@ -31856,10 +30488,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "biv" = ( @@ -31874,10 +30502,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "biw" = ( @@ -31903,10 +30527,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/customs) "biz" = ( @@ -31922,10 +30543,7 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "biB" = ( @@ -32111,7 +30729,7 @@ pixel_x = 6; pixel_y = -30 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plating, /area/vacant_room/commissary) "biV" = ( @@ -32156,7 +30774,6 @@ id = "bridge blast"; name = "bridge blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "biZ" = ( @@ -32323,12 +30940,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bjp" = ( @@ -32437,12 +31049,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bjA" = ( @@ -32455,19 +31062,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"bjB" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "bjC" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -32480,15 +31074,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"bjD" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "bjE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/yellow{ @@ -32558,11 +31143,11 @@ /turf/open/floor/plasteel, /area/engine/break_room) "bjM" = ( -/obj/machinery/door/firedoor, /obj/machinery/door/airlock/external{ name = "Escape Pod Four"; req_access_txt = "32" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/break_room) "bjO" = ( @@ -32640,27 +31225,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"bjZ" = ( -/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 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bka" = ( @@ -32715,21 +31280,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"bke" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/sign/map/left{ - desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; - icon_state = "map-left-MS"; - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) "bkf" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 30 @@ -32952,7 +31502,7 @@ /area/quartermaster/office) "bks" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance, /obj/effect/turf_decal/tile/brown{ @@ -33042,10 +31592,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bky" = ( @@ -33055,10 +31602,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bkz" = ( @@ -33094,9 +31638,6 @@ /turf/open/floor/plasteel/dark, /area/bridge) "bkD" = ( -/obj/item/radio/intercom{ - pixel_y = 29 - }, /obj/machinery/modular_computer/console/preset/engineering, /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -33104,6 +31645,10 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/item/storage/secure/safe/caps_spare{ + pixel_x = 6; + pixel_y = 28 + }, /turf/open/floor/plasteel/dark, /area/bridge) "bkE" = ( @@ -33293,12 +31838,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bkU" = ( @@ -33367,12 +31907,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bla" = ( @@ -33400,15 +31935,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"blc" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "bld" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -33446,19 +31972,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"blg" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=13.2-Tcommstore"; - location = "13.1-Engineering-Enter" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "blh" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -33508,12 +32021,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/break_room) "blk" = ( @@ -33603,7 +32111,6 @@ /area/aisat) "blB" = ( /obj/machinery/computer/teleporter, -/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/machinery/firealarm{ dir = 4; pixel_x = -26 @@ -33705,6 +32212,7 @@ pixel_x = 28 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "blJ" = ( @@ -33815,12 +32323,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "blW" = ( @@ -33952,10 +32455,7 @@ }, /obj/effect/spawner/lootdrop/maintenance, /obj/effect/turf_decal/bot, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/sorting) "bmg" = ( @@ -33968,24 +32468,18 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/sorting) "bmh" = ( -/obj/machinery/autolathe, +/obj/machinery/modular_fabricator/autolathe, /obj/machinery/door/window/eastright{ dir = 1; name = "Cargo Office"; req_access_txt = "31;48" }, /obj/effect/turf_decal/stripes/box, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/quartermaster/office) "bmi" = ( @@ -34012,10 +32506,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bml" = ( @@ -34032,10 +32523,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bmm" = ( @@ -34287,19 +32775,9 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/crew_quarters/heads/captain/private) -"bmJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/status_display/evac{ - pixel_x = -32 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bmK" = ( /obj/machinery/light{ dir = 4 @@ -34335,10 +32813,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/art) "bmO" = ( @@ -34567,34 +33042,27 @@ /turf/open/floor/plasteel/dark, /area/aisat) "bnq" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, /obj/machinery/light/small{ dir = 1 }, -/obj/machinery/airalarm{ - pixel_y = 28 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) -"bnr" = ( /obj/structure/window/reinforced{ dir = 1; pixel_y = 1 }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"bnr" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/machinery/airalarm{ + pixel_y = 28 + }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 8 + dir = 5 }, /turf/open/floor/plasteel/dark, /area/aisat) @@ -34984,12 +33452,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bob" = ( @@ -35087,12 +33550,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "boj" = ( @@ -35382,18 +33840,6 @@ }, /turf/open/floor/plasteel, /area/storage/art) -"boO" = ( -/obj/machinery/light_switch{ - pixel_x = 27 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/easel, -/obj/item/canvas/twentythreeXtwentythree, -/obj/item/canvas/twentythreeXtwentythree, -/turf/open/floor/plasteel, -/area/storage/art) "boP" = ( /obj/structure/closet/secure_closet/bar{ req_access_txt = "25" @@ -35779,12 +34225,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/foyer) "bpJ" = ( @@ -35825,12 +34266,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "bpN" = ( @@ -35895,12 +34331,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "bpT" = ( @@ -35948,12 +34379,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/satellite) "bpY" = ( @@ -35999,14 +34425,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"bqc" = ( -/obj/machinery/holopad, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "bqd" = ( /obj/machinery/power/apc{ areastring = "/area/hallway/secondary/entry"; @@ -36145,19 +34563,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hallway/primary/port) -"bqp" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) "bqq" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -36171,12 +34576,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bqr" = ( @@ -36203,17 +34603,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"bqt" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/sorting/mail{ - dir = 8; - sortType = 3 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) "bqu" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -36224,19 +34613,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"bqv" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) "bqw" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -36256,12 +34632,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bqy" = ( @@ -36292,13 +34663,10 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bqB" = ( -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/pen, /obj/structure/window/reinforced, -/obj/structure/table/wood, +/obj/machinery/computer/secure_data{ + dir = 4 + }, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "bqC" = ( @@ -36334,7 +34702,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 }, @@ -36348,7 +34716,7 @@ /obj/machinery/computer/security/telescreen/entertainment{ pixel_y = 32 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "bqH" = ( @@ -36886,12 +35254,7 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/break_room) "brL" = ( @@ -36959,7 +35322,6 @@ /turf/open/floor/plasteel/dark, /area/aisat) "brQ" = ( -/obj/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -37046,7 +35408,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/foyer) "brX" = ( @@ -37248,14 +35610,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"bsn" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "bso" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -37420,12 +35774,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bsE" = ( @@ -37489,12 +35838,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bsK" = ( @@ -37580,10 +35924,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "bsT" = ( @@ -37604,10 +35945,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "bsU" = ( @@ -37692,10 +36030,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "btb" = ( @@ -37716,10 +36051,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "btc" = ( @@ -38067,6 +36399,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "btO" = ( @@ -38090,7 +36423,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "btR" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-18" }, /obj/effect/turf_decal/stripes/line{ @@ -38115,7 +36448,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "btU" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-08" }, /turf/open/floor/plasteel/grimy, @@ -38127,7 +36460,7 @@ /turf/open/floor/plasteel/grimy, /area/hallway/primary/port) "btW" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-03" }, /turf/open/floor/plasteel/grimy, @@ -38162,16 +36495,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"btZ" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) "bua" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/neutral{ @@ -38228,10 +36551,6 @@ "bue" = ( /turf/closed/wall, /area/library) -"buf" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) "bug" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/airlock/public/glass{ @@ -38240,10 +36559,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/library) "buh" = ( @@ -38254,10 +36570,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/library) "bui" = ( @@ -38321,12 +36634,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "bun" = ( @@ -38414,12 +36722,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hop) "buv" = ( @@ -38572,10 +36875,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/crew_quarters/bar) "buP" = ( @@ -38636,6 +36936,19 @@ icon_state = "platingdmg2" }, /area/maintenance/starboard) +"buW" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/research/glass{ + name = "science shuttle dock"; + req_one_access_txt = "49" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "buX" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -38678,12 +36991,10 @@ /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, /turf/open/floor/plasteel/dark/corner, /area/hallway/primary/starboard) "bvd" = ( @@ -38862,13 +37173,13 @@ /area/engine/break_room) "bvs" = ( /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, /obj/machinery/door/airlock/external{ name = "MiniSat Space Access Airlock"; req_access_txt = "32" }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/engine/break_room) "bvt" = ( @@ -38950,7 +37261,7 @@ /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) "bvB" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-20" }, /obj/effect/turf_decal/stripes/line{ @@ -39055,27 +37366,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"bvO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/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/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bvP" = ( @@ -39266,9 +37557,6 @@ /turf/open/floor/wood, /area/crew_quarters/heads/hop) "bwl" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, /obj/machinery/door/airlock/external{ name = "MiniSat Space Access Airlock"; req_access_txt = "32" @@ -39276,12 +37564,13 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/engine/break_room) "bwm" = ( -/obj/machinery/computer/secure_data{ - dir = 1 - }, +/obj/structure/filingcabinet/chestdrawer/wheeled, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "bwn" = ( @@ -39327,12 +37616,15 @@ "bwp" = ( /obj/structure/table/wood, /obj/item/paper_bin{ - pixel_x = -2; + pixel_x = 5; pixel_y = 4 }, /obj/item/stamp/hop{ - pixel_x = -4; - pixel_y = 4 + pixel_x = -6 + }, +/obj/item/pen{ + pixel_x = 5; + pixel_y = 6 }, /turf/open/floor/wood, /area/crew_quarters/heads/hop) @@ -39536,21 +37828,6 @@ }, /turf/open/floor/plating, /area/maintenance/central) -"bwI" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bwJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, @@ -39561,10 +37838,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bwK" = ( @@ -39648,7 +37922,7 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -27 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/crew_quarters/bar) "bwS" = ( @@ -39766,10 +38040,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bxf" = ( @@ -39789,19 +38060,19 @@ dir = 1 }, /turf/closed/wall/r_wall, -/area/engine/atmos) +/area/engine/break_room) "bxi" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, /turf/closed/wall/r_wall, -/area/engine/atmos) +/area/engine/break_room) "bxj" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, /turf/closed/wall/r_wall, -/area/engine/atmos) +/area/engine/break_room) "bxk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -39824,12 +38095,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/advanced_airlock_controller{ - pixel_y = 24 - }, /obj/machinery/atmospherics/components/binary/dp_vent_pump{ dir = 4 }, +/obj/machinery/advanced_airlock_controller/directional/north, /turf/open/floor/plasteel/dark, /area/engine/break_room) "bxn" = ( @@ -39938,15 +38207,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"bxA" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "bxB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -40046,21 +38306,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"bxK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) "bxL" = ( /obj/structure/sign/map/left{ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; @@ -40121,12 +38366,6 @@ icon_state = "4-8" }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) "bxP" = ( @@ -40211,10 +38450,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bxZ" = ( @@ -40246,10 +38482,7 @@ id = "hop"; name = "privacy shutters" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) "byc" = ( @@ -40282,12 +38515,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "byf" = ( @@ -40336,12 +38564,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "bym" = ( @@ -40375,12 +38598,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain/private) "byp" = ( @@ -40504,12 +38722,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar) "byC" = ( @@ -40711,7 +38924,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -40773,7 +38986,7 @@ /obj/machinery/camera{ c_tag = "Atmospherics - Entrance" }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/engine/atmos) "byY" = ( @@ -41056,10 +39269,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/wood, /area/vacant_room/office) "bzA" = ( @@ -41139,26 +39348,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/hallway/secondary/command) -"bzM" = ( -/obj/item/radio/intercom{ - pixel_y = 21 - }, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/command) -"bzN" = ( -/obj/machinery/status_display/evac{ - pixel_y = 32 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/hallway/secondary/command) "bzO" = ( /obj/item/radio/intercom{ pixel_y = 21 @@ -41225,9 +39414,6 @@ /turf/open/floor/plasteel/dark, /area/bridge) "bzU" = ( -/obj/structure/chair/comfy/teal{ - dir = 4 - }, /obj/structure/chair/comfy/black{ dir = 4 }, @@ -41294,7 +39480,7 @@ dir = 4; pixel_x = -24 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/crew_quarters/heads/captain/private) "bAd" = ( @@ -41337,7 +39523,6 @@ /area/maintenance/central) "bAi" = ( /obj/structure/table/reinforced, -/obj/item/lighter, /obj/machinery/computer/security/telescreen/entertainment{ pixel_x = -31 }, @@ -41345,6 +39530,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/structure/displaycase/forsale/kitchen, /turf/open/floor/plasteel, /area/crew_quarters/bar) "bAj" = ( @@ -41353,6 +39539,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/item/lighter, /turf/open/floor/plasteel, /area/crew_quarters/bar) "bAk" = ( @@ -41438,18 +39625,6 @@ }, /turf/open/floor/carpet, /area/crew_quarters/theatre) -"bAt" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"bAu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) "bAv" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -41597,7 +39772,9 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bAL" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 8 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bAM" = ( @@ -41732,11 +39909,6 @@ /obj/structure/lattice, /turf/open/space, /area/space/nearstation) -"bBc" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "bBd" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -41813,25 +39985,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) -"bBp" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "AuxToilet1"; - name = "Lock Control"; - normaldoorcontrol = 1; - pixel_x = 25; - specialfunctions = 4 - }, -/obj/machinery/newscaster{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/toilet/auxiliary) "bBq" = ( /obj/structure/rack, /obj/item/flashlight, @@ -41874,7 +40027,7 @@ /turf/open/floor/wood, /area/library) "bBx" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/library) "bBy" = ( @@ -41970,10 +40123,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "bBF" = ( @@ -42004,10 +40154,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "bBG" = ( @@ -42118,10 +40265,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "bBN" = ( @@ -42294,12 +40438,7 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bCh" = ( @@ -42449,7 +40588,6 @@ /obj/machinery/atmospherics/pipe/simple/purple/visible{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bCz" = ( @@ -42493,12 +40631,12 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/tcommsat/server) "bCG" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/secondary/entry) "bCH" = ( @@ -42593,19 +40731,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bCY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bCZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -42625,12 +40750,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/command) "bDa" = ( @@ -42678,18 +40798,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/command) -"bDe" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/command) "bDf" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -42753,21 +40861,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/command) -"bDl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/command) "bDm" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -42780,15 +40873,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/command) -"bDn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/command) "bDo" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -42920,27 +41004,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/command) -"bDz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bDA" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -42975,12 +41041,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar) "bDD" = ( @@ -43013,12 +41074,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar) "bDH" = ( @@ -43064,16 +41120,6 @@ dir = 1 }, /area/hallway/primary/starboard) -"bDN" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "bDO" = ( /obj/structure/tank_dispenser{ pixel_x = -1 @@ -43113,12 +41159,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bDS" = ( @@ -43282,7 +41323,7 @@ /obj/structure/light_construct{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/vacant_room/office) "bEs" = ( @@ -43309,25 +41350,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) -"bEv" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "AuxToilet2"; - name = "Lock Control"; - normaldoorcontrol = 1; - pixel_x = 25; - specialfunctions = 4 - }, -/obj/machinery/newscaster{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/toilet/auxiliary) "bEw" = ( /obj/machinery/computer/security/telescreen/entertainment{ pixel_x = -32 @@ -43406,12 +41428,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/command) "bEE" = ( @@ -43426,19 +41443,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/command) -"bEF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/command) "bEG" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -43673,20 +41677,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/secondary/command) -"bEX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/hallway/secondary/command) "bEY" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -43725,16 +41715,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/secondary/command) -"bFb" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/hallway/secondary/command) "bFc" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/structure/cable/yellow{ @@ -43785,12 +41765,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/command) "bFg" = ( @@ -43821,16 +41796,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bFi" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bFj" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -43847,12 +41812,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar) "bFk" = ( @@ -43868,33 +41828,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/bar) -"bFl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bFm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "bFn" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -43939,12 +41872,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar) "bFq" = ( @@ -43999,15 +41927,6 @@ /obj/structure/table/wood/poker, /turf/open/floor/wood, /area/crew_quarters/bar) -"bFv" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) "bFw" = ( /obj/structure/chair/wood/wings{ dir = 1 @@ -44028,33 +41947,6 @@ }, /turf/open/floor/carpet, /area/crew_quarters/theatre) -"bFy" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"bFz" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) "bFA" = ( /obj/machinery/door/airlock{ name = "Theatre Stage"; @@ -44255,6 +42147,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bFQ" = ( @@ -44315,7 +42208,6 @@ /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bFY" = ( @@ -44353,9 +42245,6 @@ "bGd" = ( /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) -"bGe" = ( -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/tcommsat/server) "bGf" = ( /obj/machinery/telecomms/bus/preset_three, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -44406,14 +42295,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) -"bGm" = ( -/obj/machinery/shower{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/crew_quarters/toilet/auxiliary) "bGp" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -44491,10 +42372,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "bGA" = ( @@ -44515,10 +42393,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "bGC" = ( @@ -44536,10 +42411,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/teleporter) "bGE" = ( @@ -44627,10 +42499,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/gateway) "bGP" = ( @@ -45017,11 +42886,6 @@ }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) -"bHH" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "bHI" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -45280,21 +43144,6 @@ }, /turf/open/floor/plasteel/dark, /area/teleporter) -"bIi" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/command) "bIj" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -45361,7 +43210,7 @@ /area/gateway) "bIp" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/stack/sheet/rglass{ amount = 50 @@ -45395,15 +43244,6 @@ }, /turf/open/floor/plating, /area/maintenance/central) -"bIr" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bIs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral, @@ -45433,7 +43273,11 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, +/obj/machinery/camera{ + c_tag = "Kitchen Hatch"; + dir = 1 + }, /turf/open/floor/plasteel, /area/crew_quarters/bar) "bIv" = ( @@ -45442,18 +43286,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"bIw" = ( -/obj/machinery/light, -/obj/machinery/camera{ - c_tag = "Kitchen Hatch"; - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "bIx" = ( /obj/structure/rack, /obj/item/clothing/shoes/winterboots, @@ -45468,16 +43300,6 @@ /obj/machinery/light, /turf/open/floor/wood, /area/crew_quarters/bar) -"bIA" = ( -/obj/machinery/light_switch{ - pixel_y = -28 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/obj/machinery/light, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) "bIB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -45516,19 +43338,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"bIG" = ( -/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 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "bIH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -45540,7 +43349,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/firealarm{ dir = 8; pixel_x = 24 @@ -45734,7 +43543,7 @@ /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) "bJh" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) "bJi" = ( @@ -46052,7 +43861,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/secondary/command) "bJO" = ( @@ -46087,7 +43896,7 @@ icon_state = "1-4" }, /obj/effect/turf_decal/tile/neutral, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/secondary/command) "bJS" = ( @@ -46238,10 +44047,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bKd" = ( @@ -46251,10 +44057,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bKe" = ( @@ -46266,10 +44069,7 @@ name = "Serving Hatch" }, /obj/structure/table/reinforced, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -46282,17 +44082,20 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/item/reagent_containers/food/snacks/pie/cream, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, /area/crew_quarters/kitchen) "bKh" = ( -/obj/machinery/computer/security/telescreen/entertainment, -/turf/closed/wall, +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen"; + name = "Serving Hatch" + }, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, /area/crew_quarters/kitchen) "bKi" = ( /obj/structure/table/reinforced, @@ -46306,10 +44109,7 @@ /obj/item/reagent_containers/food/condiment/peppermill{ pixel_x = 3 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -46321,10 +44121,7 @@ name = "Serving Hatch" }, /obj/item/storage/fancy/donut_box, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -46341,10 +44138,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "bKl" = ( @@ -46407,10 +44201,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/tcom) "bKu" = ( @@ -46577,7 +44368,7 @@ /turf/open/floor/plasteel/dark, /area/aisat) "bKS" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-06" }, /obj/effect/turf_decal/stripes/line{ @@ -46603,15 +44394,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"bKV" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "bKW" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -46673,15 +44455,6 @@ /obj/structure/bookcase/random/reference, /turf/open/floor/wood, /area/library) -"bLl" = ( -/obj/structure/table/wood, -/obj/item/pen/red, -/obj/item/pen/blue{ - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/library) "bLm" = ( /obj/item/stack/sheet/rglass{ amount = 50 @@ -46857,10 +44630,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/bridge/showroom/corporate) "bLy" = ( @@ -47012,33 +44782,7 @@ dir = 5 }, /area/crew_quarters/kitchen) -"bLM" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) -"bLN" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria{ - dir = 5 - }, -/area/crew_quarters/kitchen) "bLO" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, /obj/structure/sink/kitchen{ pixel_y = 28 }, @@ -47324,11 +45068,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"bMv" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "bMw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -47393,7 +45132,7 @@ icon_state = "map-right-MS"; pixel_y = -32 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-03" }, /obj/effect/turf_decal/tile/blue{ @@ -47481,25 +45220,6 @@ }, /turf/open/floor/wood, /area/library) -"bMP" = ( -/obj/structure/chair/stool/bar, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"bMR" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bMS" = ( /obj/structure/closet/crate/rcd{ pixel_y = 4 @@ -47826,17 +45546,6 @@ }, /turf/open/floor/plating, /area/maintenance/central) -"bNt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/item/radio/intercom{ - dir = 8; - pixel_x = -28 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bNu" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -47890,7 +45599,6 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -47908,30 +45616,16 @@ pixel_x = -27 }, /obj/structure/closet/secure_closet/freezer/meat, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) -"bNE" = ( -/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 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) "bNF" = ( /obj/machinery/gibber, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) "bNG" = ( /obj/structure/kitchenspike, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) "bNI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -48153,10 +45847,6 @@ name = "Quiet Room" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/wood, /area/library) "bOl" = ( @@ -48167,10 +45857,6 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/wood, /area/library) "bOm" = ( @@ -48189,10 +45875,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bOo" = ( @@ -48317,7 +46000,7 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/bridge/showroom/corporate) "bOy" = ( @@ -48387,7 +46070,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/bridge/showroom/corporate) "bOG" = ( @@ -48513,6 +46196,13 @@ /area/crew_quarters/kitchen) "bOS" = ( /obj/structure/table, +/obj/item/kitchen/rollingpin, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 3 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3 + }, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -48552,8 +46242,8 @@ /area/crew_quarters/kitchen) "bOX" = ( /obj/structure/closet/secure_closet/freezer/kitchen, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) "bOY" = ( /obj/structure/sign/warning/vacuum/external{ pixel_x = 32 @@ -48571,15 +46261,14 @@ name = "CondiMaster Neo"; pixel_x = -4 }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) "bPa" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, /mob/living/simple_animal/hostile/retaliate/goat{ name = "Pete" }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) "bPb" = ( /obj/structure/table/wood, /obj/structure/mirror{ @@ -48875,22 +46564,6 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating, /area/maintenance/port) -"bPO" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/pen, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/wood, -/area/library) -"bPP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/open/floor/wood, -/area/library) "bPQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -48906,15 +46579,6 @@ }, /turf/open/floor/wood, /area/library) -"bPS" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/wood, -/area/library) "bPT" = ( /obj/structure/table/wood, /obj/item/paicard, @@ -48926,7 +46590,7 @@ /turf/open/floor/wood, /area/library) "bPV" = ( -/obj/structure/destructible/cult/tome, +/obj/structure/destructible/cult/tome/library, /obj/machinery/newscaster{ pixel_x = -30 }, @@ -49172,12 +46836,7 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/gateway) "bQu" = ( @@ -49306,7 +46965,6 @@ }, /area/crew_quarters/kitchen) "bQG" = ( -/obj/structure/disposalpipe/segment, /obj/structure/cable/yellow{ icon_state = "1-8" }, @@ -49328,12 +46986,12 @@ /area/crew_quarters/kitchen) "bQI" = ( /obj/machinery/vending/wardrobe/chef_wardrobe, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) "bQJ" = ( /obj/effect/landmark/xeno_spawn, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) "bQN" = ( /obj/machinery/airalarm{ dir = 8; @@ -49470,32 +47128,12 @@ }, /turf/open/floor/wood, /area/library) -"bRl" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen/invisible, -/turf/open/floor/engine/cult, -/area/library) "bRn" = ( /obj/structure/bookcase{ name = "Forbidden Knowledge" }, /turf/open/floor/engine/cult, /area/library) -"bRo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/item/radio/intercom{ - dir = 4; - pixel_x = 27 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bRp" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -49827,39 +47465,38 @@ /area/crew_quarters/kitchen) "bRS" = ( /obj/structure/table, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 3 - }, -/obj/item/kitchen/rollingpin, /obj/machinery/camera{ c_tag = "Kitchen"; dir = 1 }, +/obj/machinery/reagentgrinder, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "bRT" = ( /obj/structure/extinguisher_cabinet{ pixel_y = -30 }, -/obj/structure/table, -/obj/machinery/reagentgrinder, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot{ + dir = 1 + }, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, /area/crew_quarters/kitchen) "bRU" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, /obj/structure/cable/yellow{ icon_state = "1-4" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -49892,6 +47529,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -49909,8 +47547,8 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) "bRY" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -49922,15 +47560,12 @@ c_tag = "Kitchen - Coldroom"; dir = 1 }, -/obj/machinery/airalarm/kitchen_cold_room{ +/obj/machinery/airalarm{ dir = 1; - pixel_y = -24 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 + pixel_y = -22 }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) "bRZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -49942,11 +47577,8 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 8 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) "bSa" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -49954,9 +47586,8 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold4w/dark/visible, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) "bSd" = ( /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plating, @@ -50192,27 +47823,13 @@ }, /turf/open/floor/wood, /area/library) -"bSD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bSE" = ( /obj/machinery/door/poddoor/shutters{ id = "evashutter"; name = "E.V.A. Storage Shutter" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "bSF" = ( @@ -50227,10 +47844,7 @@ req_access_txt = "19" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "bSG" = ( @@ -50239,6 +47853,7 @@ name = "Teleporter Access Shutter" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/teleporter) "bSH" = ( @@ -50254,6 +47869,7 @@ req_access_txt = "19" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/teleporter) "bSI" = ( @@ -50276,10 +47892,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/bridge/showroom/corporate) "bSM" = ( @@ -50293,10 +47906,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/bridge/showroom/corporate) "bSO" = ( @@ -50305,10 +47915,7 @@ name = "Gateway Access Shutter" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/gateway) "bSP" = ( @@ -50352,6 +47959,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -50371,10 +47979,7 @@ req_one_access_txt = "30;35" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics) "bSW" = ( @@ -50385,11 +47990,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/pipe/manifold/dark/visible{ - dir = 8 - }, -/turf/open/floor/plasteel/kitchen_coldroom, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) "bSY" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable/yellow{ @@ -50398,11 +48000,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 }, -/turf/open/floor/plasteel/kitchen_coldroom, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) "bSZ" = ( /obj/machinery/door/airlock/maintenance{ name = "Kitchen Maintenance"; @@ -50586,7 +48188,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/wood, /area/library) "bTx" = ( @@ -50646,15 +48248,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bTF" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bTG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -50707,12 +48300,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bTL" = ( @@ -50902,31 +48490,13 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bTZ" = ( /obj/structure/bookcase, /turf/open/floor/wood, /area/bridge/showroom/corporate) -"bUa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bUb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -51048,11 +48618,8 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom{ - dir = 1 - }, -/turf/open/floor/plasteel/kitchen_coldroom, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) "bUq" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -51063,8 +48630,8 @@ req_access_txt = "28" }, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/kitchen_coldroom, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) "bUr" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=8"; @@ -51082,7 +48649,7 @@ /turf/open/floor/plasteel{ dir = 1 }, -/area/crew_quarters/kitchen/coldroom) +/area/crew_quarters/kitchen) "bUs" = ( /obj/structure/disposalpipe/sorting/mail{ dir = 2; @@ -51536,12 +49103,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics) "bVs" = ( @@ -51629,7 +49191,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"; @@ -51965,18 +49526,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bWm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -30 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bWn" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -51990,12 +49539,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bWo" = ( @@ -52025,15 +49569,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bWs" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/plaque{ - icon_state = "L4" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bWt" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -52135,12 +49670,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bWD" = ( @@ -52253,12 +49783,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics) "bWL" = ( @@ -52678,7 +50203,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/central) "bXN" = ( @@ -52733,11 +50258,6 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bXU" = ( -/obj/machinery/light/small, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bXV" = ( /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, @@ -52750,11 +50270,6 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bXX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bXY" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -52770,7 +50285,7 @@ pixel_x = 24 }, /obj/effect/turf_decal/tile/purple, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/central) "bYa" = ( @@ -52796,14 +50311,6 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) -"bYb" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;35;47" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/starboard/secondary) "bYc" = ( /obj/structure/flora/ausbushes/leafybush, /obj/structure/flora/ausbushes/stalkybush, @@ -52826,10 +50333,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "bYe" = ( @@ -53302,10 +50806,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side, /area/medical/medbay/central) "bZd" = ( @@ -53314,10 +50815,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side, /area/medical/medbay/central) "bZe" = ( @@ -53346,10 +50844,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bZg" = ( @@ -53363,10 +50858,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bZh" = ( @@ -53379,10 +50871,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bZi" = ( @@ -53411,10 +50900,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side, /area/science/research) "bZm" = ( @@ -53427,10 +50913,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side, /area/science/research) "bZn" = ( @@ -53505,8 +50988,8 @@ "bZx" = ( /obj/machinery/icecream_vat, /obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) "bZy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/airlock{ @@ -53713,12 +51196,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/medical) "cae" = ( @@ -53804,16 +51282,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"cak" = ( -/obj/structure/chair, -/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) "cal" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -53910,14 +51378,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/science/research) -"cax" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/research) "cay" = ( /obj/structure/chair, /obj/effect/turf_decal/tile/purple{ @@ -54107,12 +51567,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics) "caK" = ( @@ -54223,12 +51678,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics) "caR" = ( @@ -54802,12 +52252,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side{ dir = 8 }, @@ -54819,12 +52264,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side{ dir = 4 }, @@ -55155,24 +52595,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"ccK" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/dark/visible{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera{ - c_tag = "Brig Interrogation"; - dir = 8; - network = list("interrogation") - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "ccL" = ( /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 4 @@ -55237,6 +52659,7 @@ /area/engine/atmos) "ccW" = ( /obj/machinery/door/airlock/external{ + name = "Atmospherics Internal Airlock"; req_access_txt = "24" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -55265,9 +52688,6 @@ }, /turf/open/floor/plating, /area/engine/atmos) -"ccY" = ( -/turf/open/floor/plating, -/area/engine/atmos) "ccZ" = ( /obj/machinery/door/window/northleft{ dir = 8; @@ -55280,7 +52700,7 @@ req_access_txt = "24" }, /turf/open/floor/plating, -/area/engine/atmos) +/area/maintenance/starboard) "cda" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -55303,6 +52723,29 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/port/aft) +"cdk" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 11; + pixel_y = 23 + }, +/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/item/glove_box, +/turf/open/floor/plasteel/dark, +/area/medical/sleeper) "cdl" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -55478,12 +52921,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side{ dir = 8 }, @@ -55523,16 +52961,6 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"cdK" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/research) "cdL" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -55708,19 +53136,16 @@ "ceg" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "ceh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "cei" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "cej" = ( @@ -55912,20 +53337,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"ceH" = ( -/obj/structure/bed/roller, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "ceI" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "ceJ" = ( @@ -56017,7 +53434,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/science/research) "ceT" = ( @@ -56028,25 +53445,6 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"ceU" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "ceV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -56187,9 +53585,6 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -56202,9 +53597,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /obj/structure/disposalpipe/segment{ dir = 10 }, @@ -56252,7 +53644,6 @@ "cft" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) "cfu" = ( @@ -56416,28 +53807,6 @@ }, /turf/open/floor/plasteel/dark, /area/medical/sleeper) -"cfK" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/machinery/light_switch{ - pixel_x = 11; - pixel_y = 23 - }, -/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/medical/sleeper) "cfL" = ( /obj/item/storage/firstaid/regular{ pixel_x = 3; @@ -56480,23 +53849,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/storage) -"cfN" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/mob/living/simple_animal/bot/cleanbot{ - name = "Scrubs, MD"; - trash = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/storage) "cfO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/blue, @@ -56575,12 +53927,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cfT" = ( @@ -56669,10 +54016,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/chemistry) "cga" = ( @@ -56729,10 +54073,7 @@ id = "research_shutters"; name = "research shutters" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/science/lab) "cgg" = ( @@ -56883,7 +54224,7 @@ dir = 8 }, /turf/open/floor/plating, -/area/engine/atmos) +/area/maintenance/starboard) "cgE" = ( /obj/structure/window/reinforced{ dir = 1 @@ -56892,7 +54233,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/engine/atmos) +/area/maintenance/starboard) "cgF" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -56905,11 +54246,9 @@ pixel_x = 28 }, /obj/structure/reagent_dispensers/cooking_oil, -/obj/machinery/atmospherics/pipe/simple/dark/visible{ - dir = 9 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) "cgG" = ( /obj/structure/closet/emcloset/anchored, /obj/effect/turf_decal/stripes/line{ @@ -57113,10 +54452,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/storage) "cgV" = ( @@ -57147,10 +54483,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/storage) "cgX" = ( @@ -57173,10 +54506,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cgY" = ( @@ -57209,10 +54539,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cha" = ( @@ -57237,10 +54564,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "chb" = ( @@ -57408,7 +54732,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/science/lab) "chn" = ( @@ -57441,10 +54765,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/science/research) "chr" = ( @@ -57491,7 +54812,7 @@ /obj/machinery/status_display/ai{ pixel_y = 32 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -57555,7 +54876,7 @@ /area/maintenance/starboard) "chD" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/cane, /obj/effect/spawner/lootdrop/maintenance, @@ -57639,14 +54960,14 @@ }, /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/plating, -/area/engine/atmos) +/area/maintenance/starboard) "chX" = ( /obj/structure/window/reinforced{ dir = 4 }, /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/plating, -/area/engine/atmos) +/area/maintenance/starboard) "chY" = ( /obj/structure/cable, /obj/structure/lattice/catwalk, @@ -57752,12 +55073,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/sleeper) "cik" = ( @@ -57935,12 +55251,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/chemistry) "ciw" = ( @@ -58227,7 +55538,6 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/general/visible, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) "cja" = ( @@ -58285,7 +55595,7 @@ "cjl" = ( /obj/machinery/atmospherics/components/binary/pump, /turf/closed/wall/r_wall, -/area/engine/atmos) +/area/maintenance/starboard) "cjm" = ( /obj/machinery/door/airlock/atmos/glass{ heat_proof = 1; @@ -58299,11 +55609,11 @@ dir = 1 }, /turf/closed/wall/r_wall, -/area/engine/atmos) +/area/maintenance/starboard) "cjo" = ( /obj/structure/girder/reinforced, /turf/open/floor/plating/airless, -/area/engine/atmos) +/area/maintenance/starboard) "cjr" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -58452,12 +55762,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/sleeper) "cjK" = ( @@ -58880,17 +56185,17 @@ dir = 1 }, /turf/open/floor/engine/vacuum, -/area/engine/atmos) +/area/maintenance/starboard) "ckL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, /turf/open/floor/engine/vacuum, -/area/engine/atmos) +/area/maintenance/starboard) "ckM" = ( /obj/structure/girder, /turf/open/floor/plating/airless, -/area/engine/atmos) +/area/maintenance/starboard) "ckT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -58935,12 +56240,7 @@ /obj/machinery/door/airlock/medical{ name = "Observation" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/medical/surgery) "cla" = ( @@ -59112,12 +56412,7 @@ pixel_x = -5 }, /obj/item/reagent_containers/syringe/epinephrine, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/chemistry) "clt" = ( @@ -59207,19 +56502,10 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "clz" = ( -/obj/item/stack/sheet/glass/fifty{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stack/sheet/iron/fifty, -/obj/item/clothing/glasses/welding, -/obj/structure/table, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/item/stack/sheet/mineral/copper{ - amount = 5 - }, +/obj/machinery/modular_fabricator/component_printer, /turf/open/floor/plasteel, /area/science/lab) "clA" = ( @@ -59455,10 +56741,10 @@ amount = 25 }, /turf/open/floor/engine/vacuum, -/area/engine/atmos) +/area/maintenance/starboard) "cmf" = ( /turf/open/floor/plating/airless, -/area/engine/atmos) +/area/maintenance/starboard) "cmk" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -59478,10 +56764,7 @@ name = "Observation" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/surgery) "cmo" = ( @@ -59496,10 +56779,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/sleeper) "cmr" = ( @@ -59510,10 +56790,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cms" = ( @@ -59525,10 +56802,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cmt" = ( @@ -59537,10 +56811,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cmu" = ( @@ -59685,14 +56956,15 @@ "cmH" = ( /obj/structure/table, /obj/structure/disposalpipe/segment, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 +/obj/item/stack/sheet/mineral/copper{ + amount = 5 + }, +/obj/item/clothing/glasses/welding, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 }, -/obj/item/disk/tech_disk, -/obj/item/disk/tech_disk, -/obj/item/disk/design_disk, -/obj/item/disk/design_disk, /turf/open/floor/plasteel/white, /area/science/lab) "cmI" = ( @@ -59741,10 +57013,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -59883,12 +57152,6 @@ doorOpen = 'sound/effects/doorcreaky.ogg'; name = "The Gobetting Barmaid" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/wood, /area/maintenance/port/aft) "cnm" = ( @@ -60301,7 +57564,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cnR" = ( @@ -60472,7 +57735,7 @@ /area/science/research) "coj" = ( /obj/effect/turf_decal/tile/purple, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/science/research) "cok" = ( @@ -60556,6 +57819,26 @@ }, /turf/open/floor/plasteel, /area/science/explab) +"cot" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/newscaster{ + pixel_y = -32 + }, +/obj/machinery/button/door{ + id = "Toilet3"; + name = "Lock Control"; + normaldoorcontrol = 1; + pixel_x = -25; + specialfunctions = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) "cow" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -60587,22 +57870,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/medical/surgery) -"coC" = ( -/obj/machinery/power/apc{ - areastring = "/area/medical/surgery"; - dir = 4; - name = "Surgery APC"; - pixel_x = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/table, -/obj/item/surgical_drapes, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/medical/surgery) "coD" = ( /obj/structure/bed/roller, /obj/machinery/light/small{ @@ -60688,12 +57955,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/cryo) "coN" = ( @@ -60854,12 +58116,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/chemistry) "coY" = ( @@ -61103,44 +58360,6 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"cpx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/research{ - name = "Experimentation Lab"; - req_access_txt = "8" - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/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/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "cpy" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -61216,19 +58435,6 @@ }, /turf/open/floor/plasteel, /area/science/explab) -"cpF" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Experimentation Lab Maintenance"; - req_access_txt = "8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/secondary) "cpG" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -61336,12 +58542,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/surgery) "cpY" = ( @@ -61387,12 +58588,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/surgery) "cqc" = ( @@ -61444,7 +58640,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold4w/general, +/obj/machinery/atmospherics/pipe/manifold4w/general/visible, /turf/open/floor/plasteel, /area/medical/cryo) "cqg" = ( @@ -61470,12 +58666,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/cryo) "cqi" = ( @@ -61944,7 +59135,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/science/explab) "cqR" = ( @@ -62342,28 +59533,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side{ dir = 5 }, /area/science/research) -"crL" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "crM" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -62371,10 +59545,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/research) "crN" = ( @@ -62448,10 +59619,7 @@ name = "biohazard containment shutters" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/storage) "crU" = ( @@ -62682,12 +59850,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/cmo) "csx" = ( @@ -63104,7 +60267,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) "ctd" = ( @@ -63127,7 +60290,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) "ctf" = ( @@ -63262,6 +60425,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/patients_rooms/room_a) "ctv" = ( @@ -63357,10 +60521,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "ctF" = ( @@ -63371,23 +60532,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) -"ctG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "ctJ" = ( @@ -64152,6 +61297,16 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/port/aft) +"cvj" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "cvl" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -64189,10 +61344,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cvr" = ( @@ -64203,10 +61355,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cvs" = ( @@ -64216,10 +61365,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cvt" = ( @@ -64425,12 +61571,7 @@ id = "genetics_shutters"; name = "genetics shutters" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/medical/genetics) "cvF" = ( @@ -64551,12 +61692,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -65088,7 +62224,7 @@ /obj/machinery/light_switch{ pixel_x = -23 }, -/obj/item/twohanded/required/kirbyplants/dead, +/obj/item/kirbyplants/dead, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -65293,6 +62429,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/patients_rooms/room_b) "cxi" = ( @@ -65492,15 +62629,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"cxA" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "cxB" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -65552,7 +62680,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/science/nanite) "cxI" = ( @@ -65579,10 +62707,7 @@ req_access_txt = "8" }, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/storage) "cxL" = ( @@ -65677,12 +62802,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) "cxZ" = ( @@ -65750,12 +62870,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/genetics) "cyd" = ( @@ -65820,12 +62935,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/genetics) "cyj" = ( @@ -65871,12 +62981,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/genetics) "cyn" = ( @@ -66309,20 +63414,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"czh" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/button/door{ - 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, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "czi" = ( /obj/machinery/button/door{ id = "Skynet_launch"; @@ -66462,16 +63553,6 @@ }, /turf/open/floor/plasteel, /area/science/mixing) -"czC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;47" - }, -/turf/open/floor/plating, -/area/maintenance/department/science) "czD" = ( /turf/closed/wall, /area/science/mixing) @@ -66498,19 +63579,14 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "czF" = ( /obj/effect/turf_decal/bot{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel{ dir = 1 }, @@ -66635,12 +63711,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -66853,23 +63924,6 @@ }, /turf/open/floor/plasteel/dark, /area/medical/genetics) -"cAh" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/obj/machinery/camera{ - c_tag = "Aft Primary Hallway - Middle"; - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "cAi" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -66901,12 +63955,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/mechbay) "cAl" = ( @@ -67020,12 +64069,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/mixing) "cAx" = ( @@ -67137,16 +64181,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/department/science) -"cAJ" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/department/science) "cAK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/light{ @@ -67154,12 +64188,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/department/science) -"cAL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/science/mixing) "cAM" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -67173,10 +64201,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "cAN" = ( @@ -67204,7 +64229,6 @@ /area/science/mixing) "cAP" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/science/mixing) "cAQ" = ( @@ -67306,10 +64330,7 @@ name = "Genetics"; req_access_txt = "9" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/medical/genetics) "cBd" = ( @@ -67325,10 +64346,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cBg" = ( @@ -67485,6 +64503,7 @@ name = "biohazard containment shutters" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/maintenance/department/science) "cBD" = ( @@ -67515,23 +64534,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/department/science) -"cBG" = ( -/obj/machinery/door/airlock/research{ - name = "Toxins Launch Room"; - req_access_txt = "8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/mixing) "cBH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -67621,7 +64623,6 @@ /area/medical/virology) "cBS" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "cBT" = ( @@ -67687,10 +64688,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cBZ" = ( @@ -67702,10 +64700,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cCa" = ( @@ -67715,10 +64710,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/side{ dir = 9 }, @@ -67815,10 +64807,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/mechbay) "cCq" = ( @@ -67831,10 +64820,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/research) "cCs" = ( @@ -67843,10 +64829,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/research) "cCt" = ( @@ -68033,14 +65016,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/department/science) -"cCF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/maintenance/department/science) "cCG" = ( /obj/machinery/door/window/southleft{ name = "Mass Driver Door"; @@ -68138,12 +65113,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/aft) "cCR" = ( @@ -68248,7 +65218,7 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "cDd" = ( -/obj/machinery/mecha_part_fabricator, +/obj/machinery/modular_fabricator/exosuit_fab, /obj/item/radio/intercom{ pixel_y = 20 }, @@ -68273,7 +65243,7 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "cDf" = ( -/obj/machinery/mecha_part_fabricator, +/obj/machinery/modular_fabricator/exosuit_fab, /obj/machinery/camera{ c_tag = "Robotics - Fore"; network = list("ss13","rd") @@ -68323,10 +65293,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "cDi" = ( @@ -68703,12 +65670,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/aft) "cDU" = ( @@ -68754,12 +65716,7 @@ name = "Morgue"; req_access_txt = "5" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cDY" = ( @@ -68906,12 +65863,7 @@ id = "robotics_shutters"; name = "robotics shutters" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/science/robotics/lab) "cEk" = ( @@ -69075,10 +66027,6 @@ }, /turf/open/floor/plasteel, /area/science/mixing) -"cEz" = ( -/obj/structure/closet/wardrobe/grey, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "cEA" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -69133,10 +66081,7 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/medical/virology) "cEH" = ( @@ -69327,12 +66272,7 @@ name = "Morgue"; req_access_txt = "6" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cEZ" = ( @@ -69688,7 +66628,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "cFL" = ( @@ -69768,7 +66707,7 @@ /obj/structure/sign/departments/minsky/medical/virology/virology2{ pixel_x = -32 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cFR" = ( @@ -69832,14 +66771,6 @@ /obj/structure/closet, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) -"cFZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "cGa" = ( /obj/machinery/computer/rdconsole/robotics{ dir = 4 @@ -70075,12 +67006,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/virology) "cGw" = ( @@ -70191,12 +67117,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/virology) "cGC" = ( @@ -70294,12 +67215,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/virology) "cGG" = ( @@ -70381,12 +67297,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/virology) "cGJ" = ( @@ -70452,12 +67363,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cGM" = ( @@ -70505,12 +67411,6 @@ dir = 4 }, /obj/effect/spawner/lootdrop/maintenance, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "cGT" = ( @@ -71114,12 +68014,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/lab) "cHW" = ( @@ -71175,12 +68070,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/server) "cIa" = ( @@ -71268,22 +68158,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/starboard/secondary) -"cIl" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/landmark/event_spawn, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "cIm" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -71308,12 +68182,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/lab) "cIp" = ( @@ -71336,10 +68205,7 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/medical/virology) "cIr" = ( @@ -71354,10 +68220,7 @@ /obj/structure/cable/yellow{ icon_state = "1-4" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/medical/virology) "cIs" = ( @@ -71511,15 +68374,6 @@ }, /turf/open/floor/plasteel/white/corner, /area/hallway/primary/aft) -"cIF" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/primary/aft) "cIG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ @@ -71683,12 +68537,7 @@ /obj/machinery/atmospherics/pipe/simple{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/server) "cIY" = ( @@ -71788,10 +68637,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/virology) "cJl" = ( @@ -71886,12 +68732,10 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/aft) "cJy" = ( @@ -72007,10 +68851,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "cJF" = ( @@ -72024,10 +68865,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "cJG" = ( @@ -72040,10 +68878,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "cJH" = ( @@ -72153,7 +68988,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/science/research) "cJR" = ( @@ -72415,24 +69250,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"cKy" = ( -/obj/machinery/power/apc/highcap/five_k{ - areastring = "/area/hallway/secondary/exit/departure_lounge"; - dir = 1; - name = "Departure Lounge APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) "cKz" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -72545,29 +69362,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/medical/central) -"cKK" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"cKL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_one_access_txt = "12;47" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "cKP" = ( /turf/closed/wall/r_wall, /area/maintenance/solars/starboard/aft) @@ -73264,7 +70058,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "cMk" = ( @@ -73367,7 +70161,6 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "cMx" = ( @@ -73458,7 +70251,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/smartfridge/chemistry/virology/preloaded, /turf/open/floor/plasteel/dark, /area/medical/virology) @@ -73770,12 +70563,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "cNa" = ( @@ -73828,7 +70615,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "cNd" = ( @@ -73995,16 +70782,6 @@ "cNy" = ( /turf/open/floor/plasteel/grimy, /area/chapel/office) -"cNz" = ( -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1481; - name = "Confessional Intercom"; - pixel_x = -25 - }, -/obj/structure/chair, -/turf/open/floor/plasteel/dark, -/area/chapel/office) "cNA" = ( /obj/machinery/door/morgue{ name = "Confession Booth" @@ -74072,12 +70849,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main) "cNI" = ( @@ -74221,6 +70993,7 @@ name = "Crematorium"; req_access_txt = "22;27" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/office) "cOd" = ( @@ -74323,12 +71096,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main) "cOo" = ( @@ -74407,12 +71175,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "cOw" = ( @@ -74538,19 +71301,6 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/office) -"cOL" = ( -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1481; - name = "Confessional Intercom"; - pixel_x = 25 - }, -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/landmark/start/chaplain, -/turf/open/floor/plasteel/dark, -/area/chapel/office) "cOM" = ( /turf/open/floor/plasteel/chapel{ dir = 4 @@ -74635,13 +71385,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"cOY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) "cOZ" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /turf/open/floor/plasteel, @@ -74670,7 +71413,6 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 }, @@ -74681,7 +71423,6 @@ /obj/structure/cable/yellow{ icon_state = "0-8" }, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 }, @@ -74711,6 +71452,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/office) "cPm" = ( @@ -74778,7 +71520,6 @@ /area/hallway/secondary/exit/departure_lounge) "cPv" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) "cPA" = ( @@ -74787,7 +71528,6 @@ id = "chapel_shutters_parlour"; name = "chapel shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/chapel/main) "cPB" = ( @@ -74880,7 +71620,7 @@ /area/chapel/main) "cPJ" = ( /obj/effect/decal/cleanable/cobweb, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/chapel{ dir = 1 }, @@ -74914,7 +71654,7 @@ /area/chapel/main) "cPN" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/chapel{ dir = 4 }, @@ -74933,7 +71673,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) @@ -74988,7 +71728,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "cPW" = ( @@ -75025,10 +71765,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/research) "cPY" = ( @@ -75092,12 +71829,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main) "cQg" = ( @@ -75325,8 +72057,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "cQG" = ( -/obj/item/storage/book/bible, -/obj/structure/table/wood, +/obj/structure/altar_of_gods, /turf/open/floor/plasteel/dark, /area/chapel/main) "cQH" = ( @@ -75494,10 +72225,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/xenobiology) "cRe" = ( @@ -75577,12 +72305,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel/dark, /area/chapel/main) "cRm" = ( @@ -75703,10 +72425,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/xenobiology) "cRw" = ( @@ -75890,7 +72609,6 @@ id = "chapel_shutters_space"; name = "chapel shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/chapel/main) "cRM" = ( @@ -75926,10 +72644,7 @@ "cRR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/xenobiology) "cRS" = ( @@ -76049,10 +72764,7 @@ "cSe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/xenobiology) "cSf" = ( @@ -76061,10 +72773,7 @@ icon_state = "1-2" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/xenobiology) "cSg" = ( @@ -76751,6 +73460,25 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall/r_wall, /area/science/xenobiology) +"cUA" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "AuxToilet1"; + name = "Lock Control"; + normaldoorcontrol = 1; + pixel_x = 25; + specialfunctions = 4 + }, +/obj/machinery/newscaster{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/toilet/auxiliary) "cUH" = ( /obj/structure/table/optable, /turf/open/floor/plasteel/white, @@ -76875,10 +73603,6 @@ }, /turf/open/floor/wood, /area/library) -"cVh" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) "cVi" = ( /obj/machinery/firealarm{ dir = 8; @@ -76900,7 +73624,6 @@ "cVy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "cVz" = ( @@ -76945,7 +73668,8 @@ /area/construction/mining/aux_base) "cWM" = ( /obj/machinery/door/airlock/external{ - name = "Construction Zone" + name = "Construction Zone"; + req_one_access_txt = "72" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, @@ -77032,17 +73756,14 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "cYj" = ( /obj/structure/closet/firecloset, /obj/effect/spawner/lootdrop/maintenance, @@ -77112,7 +73833,7 @@ }, /obj/machinery/door/airlock/engineering{ name = "Auxillary Base Construction"; - req_one_access_txt = "32;47;48" + req_one_access_txt = "72" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/yellow{ @@ -77122,6 +73843,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/construction/mining/aux_base) "cYQ" = ( @@ -77155,16 +73877,6 @@ dir = 4 }, /area/chapel/main) -"cZf" = ( -/obj/structure/chair, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "cZh" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -77454,10 +74166,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) -"dbn" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) "dbo" = ( /obj/machinery/light/small{ dir = 8 @@ -77559,10 +74267,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "dbI" = ( @@ -77583,10 +74288,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/research) "dbJ" = ( @@ -77634,7 +74336,6 @@ /area/solar/starboard/aft) "dbN" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) "dbO" = ( @@ -77965,12 +74666,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/xenobiology) "dck" = ( @@ -78125,7 +74821,7 @@ icon_state = "1-2" }, /obj/effect/turf_decal/stripes/line, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/science/xenobiology) "dcx" = ( @@ -78684,10 +75380,6 @@ opacity = 0; req_access_txt = "55" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plasteel/white, /area/science/xenobiology) "ddB" = ( @@ -78865,8 +75557,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/components/binary/volume_pump{ - name = "Mix to Gas" +/obj/machinery/atmospherics/components/binary/pump{ + name = "Thermo to Gas" }, /turf/open/floor/engine, /area/engine/engineering) @@ -78889,10 +75581,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/components/binary/volume_pump{ +/obj/machinery/atmospherics/components/binary/pump{ dir = 1; - icon_state = "volpump_map-2"; - name = "Gas to Mix" + name = "Gas to Thermo" }, /turf/open/floor/engine, /area/engine/engineering) @@ -78977,12 +75668,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/engine/engineering) "dex" = ( @@ -79403,9 +76089,8 @@ icon_state = "4-8" }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/volume_pump/on{ - icon_state = "volpump_on_map-1"; - name = "Cold to Atmos" +/obj/machinery/atmospherics/components/binary/pump{ + name = "Gas to Cooling Loop" }, /turf/open/floor/engine, /area/engine/engineering) @@ -79544,7 +76229,6 @@ /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/starboard) "dgr" = ( @@ -79693,7 +76377,6 @@ /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "dhl" = ( @@ -79741,11 +76424,10 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) "dht" = ( -/obj/item/cigbutt, -/obj/structure/sign/poster/contraband/random{ - pixel_x = -32 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 }, -/turf/open/floor/plating, +/turf/closed/wall/r_wall, /area/maintenance/starboard/fore) "dhu" = ( /obj/structure/reagent_dispensers/fueltank, @@ -79773,6 +76455,7 @@ /obj/item/folder/red, /obj/item/folder/red, /obj/item/poster/random_official, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "dhx" = ( @@ -80011,12 +76694,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "dhQ" = ( @@ -80050,16 +76728,6 @@ /obj/structure/sign/poster/random, /turf/closed/wall, /area/crew_quarters/bar) -"dhU" = ( -/obj/structure/piano, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/sign/poster/random{ - pixel_y = 32 - }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) "dhV" = ( /obj/machinery/light/small{ dir = 1 @@ -80093,15 +76761,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/theatre) -"dhZ" = ( -/obj/structure/urinal{ - pixel_y = 29 - }, -/obj/structure/sign/poster/official/random{ - pixel_x = -32 - }, -/turf/open/floor/plating, -/area/crew_quarters/toilet/auxiliary) "dib" = ( /obj/structure/table/wood, /obj/item/lipstick{ @@ -80120,21 +76779,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/theatre) -"dic" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/sign/poster/official/random{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) "did" = ( /obj/structure/table/wood, /obj/item/folder, @@ -80461,7 +77105,7 @@ /obj/structure/sign/poster/official/random{ pixel_y = -32 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -80538,7 +77182,7 @@ /obj/structure/sign/poster/official/random{ pixel_x = -32 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "djg" = ( @@ -80686,7 +77330,6 @@ /area/engine/supermatter) "dlN" = ( /obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/supermatter) "dlV" = ( @@ -80751,7 +77394,6 @@ /area/maintenance/starboard/fore) "dni" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/starboard/fore) "dnk" = ( @@ -80833,6 +77475,15 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"dpa" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "dps" = ( /obj/machinery/space_heater, /turf/open/floor/plating{ @@ -80872,13 +77523,18 @@ "dqT" = ( /turf/closed/wall/r_wall, /area/maintenance/starboard/fore) -"dqU" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +"drM" = ( +/obj/docking_port/stationary{ + dir = 4; + dwidth = 5; + height = 7; + id = "exploration_home"; + name = "Exploration Dock"; + roundstart_template = /datum/map_template/shuttle/exploration; + width = 13 }, -/obj/machinery/vending/coffee, -/turf/open/floor/plasteel, -/area/maintenance/department/science) +/turf/open/space/basic, +/area/space) "drQ" = ( /turf/open/floor/plating{ icon_state = "platingdmg2" @@ -80908,27 +77564,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/maintenance/port/fore) -"dsT" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/secondary) "dtl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ @@ -80945,7 +77580,7 @@ /area/maintenance/starboard/fore) "dtM" = ( /obj/effect/turf_decal/bot, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/vacant_room/commissary) "dtP" = ( @@ -81077,10 +77712,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"dww" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "dwL" = ( /turf/closed/wall/r_wall, /area/maintenance/starboard/secondary) @@ -81091,9 +77722,22 @@ /area/maintenance/starboard/secondary) "dxk" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"dxB" = ( +/obj/structure/closet/firecloset, +/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/hallway/primary/central) "dxQ" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -81146,16 +77790,6 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"dzI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "dzK" = ( /turf/closed/wall/r_wall, /area/maintenance/port/aft) @@ -81163,37 +77797,10 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/maintenance/starboard/secondary) -"dAd" = ( -/obj/machinery/power/apc/highcap/five_k{ - areastring = "/area/maintenance/starboard/aft"; - name = "Starboard Quarter Maintenance APC"; - pixel_y = -24 - }, -/obj/structure/cable/yellow, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "dAh" = ( /obj/item/storage/box, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"dAn" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/external{ - req_access_txt = "13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "dAp" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -81365,7 +77972,6 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "dBO" = ( @@ -81398,13 +78004,11 @@ /obj/structure/cable/yellow{ icon_state = "0-8" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "dBV" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/medical/virology) "dBX" = ( @@ -81416,6 +78020,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/turf_decal/pool/corner{ + dir = 4 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "dBZ" = ( @@ -81462,6 +78069,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/effect/turf_decal/pool{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "dCf" = ( @@ -81700,7 +78313,7 @@ /obj/machinery/camera{ c_tag = "Bar" }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/newscaster{ pixel_y = 32 }, @@ -82043,6 +78656,28 @@ }, /turf/open/floor/plasteel/white, /area/science/misc_lab/range) +"dHC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"dHG" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/pool{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "dIs" = ( /obj/machinery/door/airlock/external{ name = "Supply Dock Airlock"; @@ -82056,24 +78691,22 @@ }, /turf/open/floor/plating, /area/quartermaster/storage) -"dJo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +"dIM" = ( +/obj/structure/closet/wardrobe/black, /obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/plasteel, -/area/hallway/primary/central) +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/locker) "dKe" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -82107,14 +78740,8 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"dNC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/closed/wall, -/area/maintenance/starboard/aft) "dNO" = ( -/obj/machinery/atmospherics/components/binary/volume_pump{ +/obj/machinery/atmospherics/components/binary/pump{ dir = 4; name = "Gas to Chamber" }, @@ -82138,16 +78765,24 @@ "dQI" = ( /turf/open/floor/plasteel/white, /area/science/shuttledock) -"dQV" = ( -/obj/machinery/door/firedoor/window, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/starboard/secondary) +"dUj" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "dUZ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "dWz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -82167,6 +78802,15 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"dZx" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/pool{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "ecs" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -82177,26 +78821,26 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) -"efp" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/binary/dp_vent_pump{ - dir = 8 - }, -/obj/machinery/advanced_airlock_controller{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) +"efV" = ( +/obj/structure/table, +/obj/item/paper_bin, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "egj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel, /area/quartermaster/storage) +"egL" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "ehL" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -82207,25 +78851,38 @@ /obj/structure/sign/warning/biohazard{ pixel_y = 32 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ekr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"ekG" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"emC" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Experimentation Lab Maintenance"; + req_one_access_txt = "8;49" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, /turf/open/floor/plating, -/area/maintenance/starboard/aft) -"ems" = ( -/obj/machinery/door/firedoor/window, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/shuttledock) +/area/maintenance/starboard/secondary) "enV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -82257,38 +78914,84 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plating, /area/maintenance/fore) +"epW" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) "eqG" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, /area/science/misc_lab/range) +"esP" = ( +/obj/machinery/telecomms/hub/preset/exploration, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) "etr" = ( +/obj/effect/turf_decal/pool{ + dir = 8 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"ets" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "evh" = ( -/obj/machinery/atmospherics/components/binary/volume_pump{ +/obj/machinery/atmospherics/components/binary/pump{ dir = 8; name = "Gas to Filter" }, /turf/open/floor/engine, /area/engine/supermatter) +"ewK" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance/three, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ext" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "exJ" = ( /obj/structure/table/glass, /obj/item/folder, /obj/item/toy/figure/engineer, /turf/open/floor/plasteel, /area/engine/storage_shared) +"ezY" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "eCs" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 @@ -82319,6 +79022,14 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/crew_quarters/bar) +"eId" = ( +/obj/machinery/telecomms/broadcaster/preset_exploration, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) "eLn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -82331,6 +79042,11 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) +"eMY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "eOg" = ( /obj/structure/grille, /obj/structure/lattice, @@ -82363,12 +79079,42 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/space, /area/space/nearstation) -"eZe" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" +"eWJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/maintenance/starboard/fore) +"eXl" = ( +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 }, +/obj/structure/cable/yellow, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"eXp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"fbK" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" }, /turf/open/floor/plating, /area/maintenance/starboard/aft) @@ -82414,55 +79160,23 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/starboard/secondary) -"fiN" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, +"fki" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"fmR" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_one_access_txt = "12;47" +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/starboard/secondary) -"fpF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) +/turf/open/floor/plasteel, +/area/hallway/primary/port) "frA" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -82499,34 +79213,36 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/secondary) +"ftx" = ( +/obj/structure/sign/poster/contraband/random{ + pixel_x = -32 + }, +/obj/structure/rack, +/obj/machinery/light/small/broken, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "fwb" = ( /obj/structure/lattice, /obj/structure/grille, /turf/open/space/basic, /area/space/nearstation) -"fwf" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "fwt" = ( /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 }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"fBq" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel/white/corner, +/area/hallway/primary/aft) "fBA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -82541,18 +79257,10 @@ /obj/item/bedsheet/syndie, /turf/open/floor/plating, /area/maintenance/fore) -"fDD" = ( -/obj/machinery/light_switch{ - pixel_y = -25 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/science/misc_lab/range) +"fEL" = ( +/obj/machinery/telecomms/relay/preset/exploration, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) "fEQ" = ( /turf/closed/wall, /area/science/nanite) @@ -82607,10 +79315,6 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -82619,10 +79323,21 @@ /area/maintenance/fore) "fIU" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) +"fJz" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) "fLl" = ( /obj/machinery/computer/cryopod{ pixel_y = 25 @@ -82634,22 +79349,38 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/turf_decal/pool{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"fOf" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 6; - height = 6; - id = "science_station"; - name = "science shuttle dock"; - width = 9 +"fNl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/space/basic, -/area/space) +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/construction/storage_wing) +"fOX" = ( +/obj/structure/table, +/obj/item/flashlight/lamp, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"fPf" = ( +/obj/machinery/light_switch{ + pixel_y = -28 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/machinery/light, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) "fTa" = ( /obj/structure/table, /obj/item/stack/sheet/glass, @@ -82663,48 +79394,59 @@ /obj/item/clothing/glasses/science, /turf/open/floor/plasteel, /area/science/lab) +"fTN" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) "fUt" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 }, /turf/open/floor/plasteel, /area/engine/engineering) -"fUC" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/science/misc_lab/range) -"fXN" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" +"fXe" = ( +/obj/structure/mirror{ + pixel_x = 28 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/shower{ + dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) +"fZP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"fZG" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/science/shuttledock) +/turf/open/floor/plasteel/showroomfloor, +/area/crew_quarters/cryopods) "gbU" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 }, /turf/closed/wall, /area/janitor) +"gdD" = ( +/obj/structure/closet/wardrobe/mixed, +/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/crew_quarters/locker) "ggI" = ( /obj/structure/grille, /obj/structure/lattice, @@ -82753,35 +79495,38 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) -"gjM" = ( -/obj/machinery/power/apc/auto_name/north, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "gkP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, /turf/closed/wall/r_wall, /area/engine/atmos) +"gme" = ( +/obj/item/radio/intercom{ + pixel_y = 21 + }, +/obj/structure/chair, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "gnd" = ( /turf/closed/wall, /area/maintenance/department/science/central) -"gnZ" = ( +"gnR" = ( /obj/item/radio/intercom{ - pixel_y = -30 + pixel_y = 21 }, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 }, -/turf/open/floor/plasteel/white, -/area/science/misc_lab/range) +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) "goB" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -82792,12 +79537,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "gqd" = ( @@ -82807,12 +79547,6 @@ }, /turf/open/space/basic, /area/space) -"gqP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/engine/engineering) "gra" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -82829,6 +79563,9 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -82853,12 +79590,27 @@ /area/hallway/secondary/exit/departure_lounge) "gzP" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, /turf/open/floor/plating, /area/science/xenobiology) +"gzS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/aisat) +"gAP" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "gCV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/maintenance{ @@ -82869,27 +79621,8 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/port/fore) -"gEk" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"gHh" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/maintenance, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/department/science) "gHQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -82917,7 +79650,6 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "gKd" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/public/glass{ name = "Cryogenic Lounge" }, @@ -82933,12 +79665,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/cryopods) "gLC" = ( @@ -82954,12 +79681,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/port/fore) "gNe" = ( @@ -82969,19 +79690,29 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/aft/secondary) -"gUT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 +"gQZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/airlock/research{ - name = "Shuttle dock"; - req_access_txt = "47" - }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/white, +/area/science/research) +"gRW" = ( +/obj/machinery/computer/objective{ + dir = 8 + }, +/turf/open/floor/plasteel, /area/science/shuttledock) +"gXp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "gXY" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -83010,24 +79741,72 @@ }, /turf/closed/wall, /area/engine/break_room) +"hfX" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/newscaster{ + pixel_y = -32 + }, +/obj/effect/landmark/blobstart, +/obj/machinery/button/door{ + id = "Toilet1"; + name = "Lock Control"; + normaldoorcontrol = 1; + pixel_x = -25; + specialfunctions = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) "hkq" = ( /turf/open/floor/plasteel, /area/engine/storage_shared) -"hmq" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/binary/dp_vent_pump{ - dir = 4 +"hld" = ( +/obj/item/radio/intercom/chapel{ + pixel_x = 26 }, -/obj/machinery/advanced_airlock_controller{ - dir = 4; - pixel_x = -24 +/obj/structure/chair{ + dir = 1 }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) +/obj/effect/landmark/start/chaplain, +/turf/open/floor/plasteel/dark, +/area/chapel/office) "hmA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/engine/break_room) +"hmT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L3" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"hoF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/sign/departments/minsky/engineering/engineering{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"hoI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "hqu" = ( /obj/machinery/door/airlock/external{ name = "Supply Dock Airlock"; @@ -83041,10 +79820,31 @@ }, /turf/open/floor/plating, /area/quartermaster/storage) +"hrp" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) "hry" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/security/brig) +"htz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/science/shuttledock) +"huT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "hvP" = ( /obj/structure/cable{ icon_state = "1-2" @@ -83067,11 +79867,49 @@ }, /turf/open/floor/plating, /area/security/prison) +"hyY" = ( +/obj/structure/sign/poster/official/random{ + pixel_y = -32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/exploration, +/turf/open/floor/plasteel, +/area/science/misc_lab/range) +"hzK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"hAQ" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/obj/machinery/advanced_airlock_controller{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "hCF" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating/airless, -/area/science/shuttledock) +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms) "hFV" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -83086,12 +79924,35 @@ /area/science/misc_lab/range) "hGe" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) +"hIy" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) +"hJU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) "hKs" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -83101,6 +79962,18 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) +"hPc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "hPj" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -83114,6 +79987,16 @@ /obj/structure/sign/departments/minsky/medical/medical2, /turf/closed/wall, /area/medical/medbay/central) +"hRv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "hSZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -83138,21 +80021,25 @@ }, /turf/open/space, /area/space/nearstation) -"hWr" = ( +"hWV" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"hZi" = ( +/obj/structure/lattice, +/turf/closed/wall, +/area/science/shuttledock) +"iaj" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +/obj/structure/cable/yellow{ + icon_state = "2-8" }, -/turf/open/floor/plating, -/area/maintenance/starboard/secondary) +/turf/open/floor/plasteel, +/area/hallway/primary/fore) "iaM" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -83180,44 +80067,13 @@ /area/engine/engineering) "iia" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) -"ijC" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance/two, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) -"imU" = ( -/obj/machinery/door/firedoor/window, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/misc_lab/range) "iof" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel, /area/engine/break_room) -"ioI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/research/glass{ - name = "Research Testing Range"; - req_access_txt = "47" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/misc_lab/range) "ioR" = ( /obj/structure/closet/emcloset, /obj/structure/sign/warning/vacuum/external{ @@ -83259,29 +80115,42 @@ id = "research_shutters_2"; name = "research shutters" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/science/lab) -"isK" = ( -/obj/effect/turf_decal/stripes/line{ +"iqU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel, +/area/maintenance/department/science) +"irf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/light, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"iuC" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;35;47;49" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) +"iuF" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "49;47" }, /turf/open/floor/plating, -/area/maintenance/aft) +/area/maintenance/starboard/secondary) "ixU" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 @@ -83295,6 +80164,19 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"iyD" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=14.2-Central-CrewQuarters"; + location = "14-Starboard-Central" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "iyU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -83336,7 +80218,6 @@ /area/security/main) "iBo" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) @@ -83346,9 +80227,18 @@ }, /turf/closed/wall, /area/maintenance/starboard/fore) +"iCU" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "iGZ" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -83368,12 +80258,16 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"iHM" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, -/area/hallway/primary/aft) +/area/science/shuttledock) "iKA" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -83382,6 +80276,14 @@ icon_state = "platingdmg2" }, /area/maintenance/starboard) +"iKO" = ( +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "iLz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -83397,36 +80299,57 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/cryopods) -"iPk" = ( -/obj/effect/turf_decal/stripes/line{ +"iNr" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/turf/open/floor/plating/airless, -/area/space) -"iQh" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"iNs" = ( +/obj/machinery/door/airlock/security{ + name = "Court Cell"; + req_access_txt = "63" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/science/misc_lab/range) -"iRA" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"iPi" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/firedoor/window, /turf/open/floor/plating, -/area/engine/atmos) -"iSa" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ +/area/science/shuttledock) +"iPk" = ( +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 9 +/turf/open/floor/plating/airless, +/area/space) +"iPU" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 +/obj/machinery/camera{ + c_tag = "Aft Primary Hallway - Middle"; + dir = 4 }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "iSW" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -83435,17 +80358,39 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/bridge) -"iWI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/purple, +"iUx" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/shuttledock) +"iWm" = ( +/obj/structure/closet/wardrobe/white, +/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/crew_quarters/locker) +"iZQ" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "jah" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/starboard/secondary) "jaD" = ( @@ -83459,18 +80404,22 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"jbz" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/science/shuttledock) "jdU" = ( /obj/effect/landmark/carpspawn, /turf/open/space/basic, /area/space) +"jeD" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "jeN" = ( /obj/machinery/light/small{ dir = 1 @@ -83497,31 +80446,54 @@ }, /turf/open/floor/plating, /area/quartermaster/storage) +"jgt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"jgD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/closed/wall, +/area/maintenance/starboard/fore) "jmO" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) -"jol" = ( -/obj/effect/turf_decal/stripes/line{ +"jnK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"joN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/area/maintenance/port) +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/sign/poster/official/random{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "joQ" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -83549,13 +80521,38 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"jtw" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ +"jtg" = ( +/obj/structure/closet/emcloset, +/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/hallway/primary/central) +"juU" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) +"jwU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, /turf/open/floor/plasteel, -/area/hallway/secondary/entry) +/area/hallway/secondary/command) "jwV" = ( /obj/structure/rack, /obj/item/storage/box, @@ -83583,6 +80580,15 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"jza" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"jAV" = ( +/obj/item/rack_parts, +/mob/living/simple_animal/hostile/retaliate/goose/vomit, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "jCb" = ( /obj/machinery/camera{ c_tag = "Research and Development"; @@ -83605,10 +80611,24 @@ /obj/item/stock_parts/capacitor, /turf/open/floor/plasteel, /area/science/lab) +"jEj" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) "jFN" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/quartermaster/storage) @@ -83618,6 +80638,10 @@ }, /turf/closed/wall/r_wall, /area/engine/break_room) +"jGE" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/plasteel, +/area/maintenance/department/science) "jKK" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -83645,6 +80669,31 @@ }, /turf/closed/wall, /area/maintenance/solars/port/aft) +"jMW" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"jPO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"jQw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "jSj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 @@ -83659,7 +80708,6 @@ /area/chapel/main) "jUn" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, @@ -83667,10 +80715,36 @@ /area/hallway/secondary/exit/departure_lounge) "jWT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 8 + dir = 4 }, -/turf/closed/wall, +/obj/machinery/camera{ + c_tag = "Holodeck"; + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"jWZ" = ( +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/hallway/secondary/exit/departure_lounge"; + dir = 1; + name = "Departure Lounge APC"; + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "jXK" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -83687,6 +80761,21 @@ }, /turf/open/floor/plasteel/dark, /area/aisat) +"jZN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"kca" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "kcI" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/janitor, @@ -83700,10 +80789,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "kfu" = ( @@ -83726,7 +80812,6 @@ /area/crew_quarters/dorms) "kjd" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 }, @@ -83755,7 +80840,6 @@ /area/hallway/primary/fore) "kkr" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/hallway/secondary/entry) @@ -83776,12 +80860,14 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) +"klP" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/maintenance/department/science) "koT" = ( /obj/machinery/light_switch{ pixel_x = -25 @@ -83798,7 +80884,7 @@ icon_state = "2-8" }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/volume_pump{ +/obj/machinery/atmospherics/components/binary/pump{ dir = 8 }, /turf/open/floor/engine, @@ -83812,6 +80898,10 @@ }, /turf/closed/wall/r_wall, /area/maintenance/starboard/fore) +"kss" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) "ksx" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -83826,6 +80916,15 @@ /obj/machinery/dish_drive, /turf/open/floor/plasteel, /area/crew_quarters/bar) +"kuN" = ( +/obj/machinery/computer/shuttle_flight/custom_shuttle/exploration{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) "kwI" = ( /obj/item/reagent_containers/spray/plantbgone{ pixel_y = 3 @@ -83860,6 +80959,9 @@ /obj/structure/window/reinforced, /turf/open/floor/plasteel/white, /area/science/misc_lab/range) +"kxo" = ( +/turf/open/floor/carpet/orange, +/area/crew_quarters/dorms) "kym" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -83880,7 +80982,7 @@ dir = 8; pixel_x = 24 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/secondary/service) "kzn" = ( @@ -83896,14 +80998,24 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"kAX" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ +"kzX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/library) +"kAn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/engine/atmos) +/obj/effect/turf_decal/plaque{ + icon_state = "L4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "kCw" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -83923,22 +81035,31 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/break_room) "kCF" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/binary/volume_pump{ +/obj/machinery/atmospherics/components/binary/pump{ dir = 8 }, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"kDM" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +"kCJ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/pool/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"kDM" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" }, /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -83959,21 +81080,24 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"kKE" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "kKW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) +"kMb" = ( +/obj/machinery/camera{ + c_tag = "Research Division Testing Range"; + dir = 1; + network = list("ss13","rd") + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/exploration, +/turf/open/floor/plasteel, +/area/science/misc_lab/range) "kMV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, @@ -83992,12 +81116,29 @@ }, /turf/open/floor/plasteel/white, /area/medical/storage) +"kNS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) "kOt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, /turf/open/floor/plasteel/white, /area/science/misc_lab/range) +"kOW" = ( +/obj/machinery/door/airlock/research/glass{ + name = "science shuttle dock"; + req_one_access_txt = "49" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "kSB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/trunk, @@ -84014,11 +81155,12 @@ }, /turf/open/floor/plasteel, /area/janitor) -"kSY" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/crew_quarters/fitness/recreation) +"kUw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms) "kVo" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -84037,10 +81179,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "lal" = ( @@ -84049,31 +81188,25 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab/range) -"ldl" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) "lhb" = ( /obj/item/clothing/head/festive, /turf/open/floor/plating, /area/maintenance/fore) -"ljp" = ( -/obj/machinery/conveyor_switch{ - id = "SciLoad" +"lhh" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"llB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "lnO" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -84111,7 +81244,6 @@ /area/maintenance/solars/starboard/fore) "lvY" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, @@ -84119,18 +81251,29 @@ /area/maintenance/solars/starboard/fore) "lwl" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/hallway/secondary/entry) "lwx" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) +"lwJ" = ( +/obj/effect/landmark/start/exploration, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"lxh" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) "lxw" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -84148,24 +81291,20 @@ /area/science/misc_lab/range) "lCX" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) -"lGj" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance/three, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 +"lDp" = ( +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/maintenance/starboard/aft"; + name = "Starboard Quarter Maintenance APC"; + pixel_y = -24 }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "lGS" = ( /obj/docking_port/stationary/public_mining_dock, /turf/open/floor/plating, @@ -84184,6 +81323,15 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"lKn" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) "lLy" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -84193,12 +81341,17 @@ /obj/machinery/door/airlock/maintenance{ req_one_access_txt = "12;5;39;25;28" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/port/aft) +"lLE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "lMJ" = ( /obj/structure/lattice, /turf/open/space/basic, @@ -84212,30 +81365,49 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"lRd" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"lSC" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/item/pen, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/sign/painting/library{ + pixel_x = -32 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/turf/open/floor/wood, +/area/library) +"lSU" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "49;47" }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/science) +"lTL" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 +/obj/machinery/button/door{ + id = "FitnessShower"; + name = "Lock Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/structure/mirror{ + pixel_x = -28 }, -/turf/open/floor/plating, -/area/maintenance/aft) +/obj/machinery/light/small, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/fitness/recreation) "lUr" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -84252,6 +81424,20 @@ }, /turf/open/floor/plasteel, /area/janitor) +"lVd" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/crew_quarters/toilet/auxiliary) +"lWA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "lWY" = ( /obj/machinery/door/airlock/hatch{ name = "Telecomms Server Room" @@ -84263,6 +81449,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/tcommsat/server) "lYP" = ( @@ -84279,12 +81466,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/science/nanite) "lZW" = ( @@ -84300,25 +81482,38 @@ }, /turf/closed/wall, /area/maintenance/solars/port/fore) -"mdV" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/tile/purple, +"mdo" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"mgO" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/shuttledock) -"mfo" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/maintenance/disposal) "mgY" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, /turf/open/floor/plating, /area/quartermaster/storage) +"mjz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "mjJ" = ( /turf/closed/wall, /area/science/shuttledock) @@ -84355,12 +81550,6 @@ doorOpen = 'sound/effects/doorcreaky.ogg'; name = "The Gobetting Barmaid" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/wood{ icon_state = "wood-broken6" }, @@ -84374,20 +81563,43 @@ }, /turf/closed/wall, /area/hallway/secondary/service) -"mzh" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 +"mxW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/radio/intercom{ + dir = 8; + pixel_x = -28 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/science/misc_lab/range) +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "mzU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, /turf/open/floor/plasteel, /area/engine/storage_shared) +"mDw" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"mEV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/radio/intercom{ + dir = 4; + pixel_x = 27 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "mGI" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -84397,9 +81609,6 @@ /obj/item/pen{ pixel_x = -3 }, -/obj/machinery/keycard_auth{ - pixel_y = -24 - }, /obj/item/folder/red{ pixel_x = 8 }, @@ -84417,6 +81626,20 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) +"mGY" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/camera{ + c_tag = "Science Shuttle Dock"; + dir = 4; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "mHF" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -84426,9 +81649,15 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/secondary) +"mIf" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/vendor/exploration, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "mKD" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/solars/port/aft) @@ -84456,9 +81685,15 @@ /obj/effect/turf_decal/tile/bar, /turf/open/floor/plasteel, /area/crew_quarters/bar) +"mNy" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "mOk" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) @@ -84488,6 +81723,19 @@ /obj/item/blood_filter, /turf/open/floor/plasteel/white/side, /area/medical/surgery) +"mWS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;47" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "mYd" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -84496,12 +81744,65 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/bridge) +"mYj" = ( +/obj/structure/urinal{ + pixel_y = 29 + }, +/obj/structure/sign/poster/official/random{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/crew_quarters/toilet/auxiliary) +"mYo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/pool/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"mZu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) "nbv" = ( /turf/open/floor/plating, /area/maintenance/starboard/secondary) +"ncA" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/closet/emcloset, +/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/hallway/primary/central) "ncT" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -84511,14 +81812,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/port/aft) "nde" = ( @@ -84533,10 +81826,13 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/medical/virology) +"ney" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) "nhp" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/components/binary/dp_vent_pump{ @@ -84548,6 +81844,12 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"nli" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) "npK" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -84557,11 +81859,33 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) -"nqY" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/science/xenobiology) +"nqJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"ntl" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/suit_storage_unit/exploration, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/misc_lab/range) +"nwf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/status_display/evac{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "nwx" = ( /obj/machinery/light/small{ dir = 4 @@ -84587,6 +81911,29 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/fore) +"nwW" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/button/door{ + 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, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"nxf" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = -26 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) "nyo" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -84608,6 +81955,10 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) +"nAO" = ( +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "nBD" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -84617,12 +81968,38 @@ /area/space/nearstation) "nCn" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, /turf/open/floor/plating, /area/maintenance/solars/port/fore) +"nCH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"nEP" = ( +/obj/structure/closet/wardrobe/green, +/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/crew_quarters/locker) "nHj" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -84642,14 +82019,34 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/construction/storage_wing) +"nIA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"nKr" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, -/turf/open/floor/plasteel, -/area/construction/storage_wing) +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "nKN" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -84680,24 +82077,44 @@ }, /turf/open/floor/plasteel/white, /area/science/research) +"nLK" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"nRS" = ( +/obj/structure/musician/piano, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) +"nSr" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/library) "nTf" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, /turf/open/floor/plating, /area/hallway/secondary/entry) -"nTS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/structure/closet/crate/science, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "nXA" = ( /obj/structure/rack{ icon = 'icons/obj/stationobjs.dmi'; @@ -84707,44 +82124,6 @@ /obj/item/storage/fancy/candle_box, /turf/open/floor/engine/cult, /area/library) -"nYJ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/science/shuttledock) -"nZx" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"nZy" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/frame/computer{ - desc = "Looks like the board never made it to this one."; - dir = 8; - name = "shuttle console frame" - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "obb" = ( /obj/structure/target_stake, /turf/open/floor/plasteel/white, @@ -84761,23 +82140,12 @@ }, /turf/open/floor/plating, /area/construction/mining/aux_base) -"ocT" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/science/misc_lab/range) "oeD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, /turf/closed/wall, /area/hallway/secondary/entry) -"ofm" = ( -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/misc_lab/range) "ofy" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -84809,9 +82177,27 @@ }, /turf/closed/wall, /area/security/prison) +"ojf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/break_room) "ojg" = ( /turf/closed/wall, /area/science/misc_lab/range) +"ojw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/obj/structure/rack, +/obj/item/hand_labeler, +/obj/item/wrench, +/obj/item/crowbar, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/science/shuttledock) "ojC" = ( /obj/structure/cable{ icon_state = "1-2" @@ -84828,14 +82214,46 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/fore) +"okx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) +"ooM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"ooN" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "opl" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"oqs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) "osb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -84847,14 +82265,19 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space) -"otr" = ( -/obj/effect/spawner/structure/window/reinforced, +"otD" = ( /obj/structure/cable/yellow{ - icon_state = "0-4" + icon_state = "4-8" }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/medical/virology) +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "oub" = ( /obj/structure/sign/poster/official/random, /turf/closed/wall, @@ -84862,6 +82285,29 @@ "ovj" = ( /turf/closed/wall, /area/maintenance/starboard/secondary) +"ovD" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/sign/map/left{ + desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; + icon_state = "map-left-MS"; + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"ovP" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/maintenance/department/science) "ovZ" = ( /obj/structure/lattice, /turf/closed/wall, @@ -84881,7 +82327,6 @@ /area/engine/storage_shared) "oxJ" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 }, @@ -84908,19 +82353,25 @@ /obj/item/clothing/glasses/hud/security/sunglasses, /turf/open/floor/carpet/red, /area/security/detectives_office) -"ozV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"oCT" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/closed/wall, -/area/maintenance/starboard/aft) -"oBS" = ( -/obj/structure/closet/crate, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ - dir = 1 + dir = 8 }, /turf/open/floor/plasteel/white, -/area/science/shuttledock) +/area/science/research) "oGF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -84937,7 +82388,6 @@ /area/security/main) "oHw" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, @@ -84974,27 +82424,38 @@ }, /turf/open/space/basic, /area/space) +"oSI" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "oUz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, /turf/closed/wall/r_wall, /area/maintenance/starboard/fore) -"oYC" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +"oUI" = ( +/obj/item/radio/intercom/chapel{ + pixel_x = -26 }, -/obj/effect/turf_decal/stripes/line, +/obj/structure/chair, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"oZK" = ( /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 9 }, -/turf/open/floor/plating, -/area/maintenance/starboard) +/turf/open/floor/plasteel, +/area/science/shuttledock) "pcc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -85010,20 +82471,65 @@ }, /turf/closed/wall/r_wall, /area/engine/atmos) -"peG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 +"pdS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/research{ + name = "Experimentation Lab"; + req_one_access_txt = "8;49" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/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/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/science/explab) "pfL" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"pgu" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "AuxToilet2"; + name = "Lock Control"; + normaldoorcontrol = 1; + pixel_x = 25; + specialfunctions = 4 + }, +/obj/machinery/newscaster{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/toilet/auxiliary) "pgA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -85037,12 +82543,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "pjy" = ( @@ -85058,7 +82559,6 @@ /area/hallway/secondary/entry) "pok" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -85091,6 +82591,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/crew_quarters/cryopods) +"pBk" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "pCp" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -85098,22 +82605,17 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/secondary) -"pCO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/conveyor{ - dir = 8; - id = "SciLoad" - }, -/turf/open/floor/plating, -/area/science/shuttledock) "pCV" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, /turf/open/floor/plating, /area/maintenance/starboard) +"pEJ" = ( +/obj/item/cigbutt, +/obj/item/rack_parts, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "pER" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -85122,34 +82624,15 @@ /turf/open/floor/plasteel/dark, /area/science/nanite) "pHj" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, -/turf/closed/wall, +/turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"pJj" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/port) +"pLb" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "pMX" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -85179,6 +82662,20 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"pPc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_one_access_txt = "12;47" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "pPs" = ( /obj/structure/sign/warning/vacuum{ pixel_x = 32 @@ -85191,13 +82688,26 @@ /obj/machinery/atmospherics/components/binary/dp_vent_pump, /turf/open/floor/plating, /area/maintenance/aft/secondary) -"pSf" = ( +"pRi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 + dir = 8 }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) +/turf/closed/wall, +/area/maintenance/aft/secondary) +"pSe" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "pSX" = ( /obj/machinery/door/airlock/external{ name = "Auxiliary Escape Airlock" @@ -85232,6 +82742,20 @@ dir = 5 }, /area/crew_quarters/kitchen) +"pVE" = ( +/obj/structure/closet/wardrobe/grey, +/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/crew_quarters/locker) "pYC" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -85244,17 +82768,11 @@ }, /turf/open/floor/plating, /area/maintenance/aft/secondary) -"pZm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Research Division Testing Range"; - dir = 1; - network = list("ss13","rd") - }, -/turf/open/floor/plasteel/white, -/area/science/misc_lab/range) +"qak" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "qcD" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -85282,21 +82800,11 @@ /turf/open/floor/carpet/purple, /area/crew_quarters/dorms) "qdQ" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/advanced_airlock_controller{ - dir = 4; - pixel_x = -24 - }, -/obj/machinery/atmospherics/components/binary/dp_vent_pump{ +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/turf/closed/wall, +/area/crew_quarters/fitness/recreation) "qdT" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -85330,7 +82838,6 @@ /area/maintenance/port) "qhg" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, @@ -85359,6 +82866,10 @@ }, /turf/closed/wall, /area/hallway/secondary/entry) +"qnp" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "qom" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -85378,12 +82889,30 @@ }, /turf/open/floor/plasteel, /area/maintenance/department/science) -"qqo" = ( -/obj/machinery/atmospherics/pipe/layer_manifold{ +"qrV" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"qsO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/mob/living/simple_animal/bot/cleanbot/medbay, /turf/open/floor/plasteel/white, -/area/science/shuttledock) +/area/medical/storage) "qze" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -85400,20 +82929,12 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/atmospherics/components/binary/volume_pump{ - dir = 4 +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Cooling Loop bypass" }, /turf/open/floor/engine, /area/engine/engineering) -"qAg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "qBh" = ( /obj/structure/table, /obj/item/paicard, @@ -85445,15 +82966,14 @@ name = "MiniSat Space Access Airlock"; req_one_access_txt = "32;19" }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, /turf/open/floor/plasteel/dark, /area/aisat) -"qEn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "qFh" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_pump/high_volume{ @@ -85461,14 +82981,9 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) -"qFx" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/security/brig) "qHy" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 + dir = 5 }, /turf/closed/wall/r_wall, /area/engine/gravity_generator) @@ -85477,6 +82992,27 @@ /obj/item/storage/photo_album, /turf/open/floor/engine/cult, /area/library) +"qNF" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qOT" = ( +/turf/open/space/basic, +/area/science/shuttledock) +"qPZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/research) "qVR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -85486,12 +83022,24 @@ }, /turf/open/floor/wood, /area/library) +"raU" = ( +/obj/machinery/light/small, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "rbK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/closed/wall, /area/maintenance/starboard/fore) +"rca" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "rcJ" = ( /obj/machinery/door/airlock/public/glass{ name = "space-bridge access" @@ -85507,12 +83055,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/maintenance/port/fore) "rhR" = ( @@ -85543,20 +83086,31 @@ /area/crew_quarters/cryopods) "roe" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) -"roG" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/hallway/secondary/entry) "rrB" = ( /turf/closed/wall, /area/vacant_room/commissary) +"rvY" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"rwk" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/pool, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "rxn" = ( /obj/machinery/power/apc/auto_name/south{ pixel_y = -24 @@ -85583,6 +83137,19 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) +"rBO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) "rBU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -85606,14 +83173,10 @@ /turf/open/floor/plating, /area/science/shuttledock) "rFZ" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 1 - }, -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, -/area/crew_quarters/kitchen/coldroom) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) "rHt" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/security/brig) @@ -85628,6 +83191,34 @@ }, /turf/open/floor/plating, /area/quartermaster/storage) +"rIr" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_x = 32 + }, +/obj/machinery/button/door{ + id = "Toilet4"; + name = "Lock Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) +"rIW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/recharger, +/turf/open/floor/plasteel, +/area/science/shuttledock) "rPH" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -85654,24 +83245,40 @@ }, /turf/open/floor/plasteel, /area/security/main) -"rQT" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) "rSL" = ( /obj/machinery/vending/snack/random, /turf/open/floor/plasteel, /area/maintenance/department/science) -"rUK" = ( -/turf/closed/wall, -/area/crew_quarters/kitchen/coldroom) "sao" = ( /obj/structure/closet/toolcloset, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/storage_shared) +"sbP" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L10" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"sbU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"scW" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "sdi" = ( /obj/structure/window/reinforced{ dir = 1; @@ -85690,14 +83297,6 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating{ icon_state = "platingdmg1" }, @@ -85709,10 +83308,6 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/port/fore) "sgq" = ( @@ -85722,34 +83317,56 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"sgM" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) "siF" = ( /obj/structure/grille, /turf/open/floor/plating/airless, /area/space/nearstation) "siK" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, /turf/open/floor/plating, /area/maintenance/solars/port/fore) +"siR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/research/glass{ + name = "Research Testing Range"; + req_one_access_txt = "47;49" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/science/misc_lab/range) "siX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, /turf/closed/wall/r_wall, /area/maintenance/starboard/fore) -"skh" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 +"sjV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor/window, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 }, -/turf/open/floor/plasteel/white, -/area/science/misc_lab/range) +/turf/open/floor/plating, +/area/science/shuttledock) +"slE" = ( +/obj/machinery/telecomms/receiver/preset_exploration, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) "sql" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -85759,29 +83376,27 @@ }, /turf/open/floor/plasteel/white, /area/science/misc_lab/range) -"ssS" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"suu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/science/misc_lab/range) "svg" = ( /obj/structure/lattice, /obj/structure/girder/reinforced, /turf/open/space/basic, /area/space/nearstation) -"sxX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 5 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 +"syh" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" }, /turf/open/floor/plasteel/white, /area/science/shuttledock) +"szz" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "szA" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -85796,7 +83411,7 @@ icon_state = "4-8" }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/volume_pump{ +/obj/machinery/atmospherics/components/binary/pump{ dir = 1; name = "Atmos to Loop" }, @@ -85807,21 +83422,12 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating{ icon_state = "platingdmg3" }, /area/maintenance/starboard/fore) "sCS" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 }, @@ -85854,19 +83460,6 @@ /obj/machinery/light, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/cryopods) -"sFv" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "47" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/maintenance/starboard/secondary) "sGh" = ( /obj/structure/cable{ icon_state = "1-2" @@ -85880,6 +83473,18 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) +"sGG" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen/invisible, +/obj/structure/sign/painting/library_private{ + pixel_y = -32 + }, +/turf/open/floor/engine/cult, +/area/library) "sGK" = ( /obj/machinery/cryopod{ dir = 4 @@ -85892,6 +83497,24 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/cryopods) +"sHi" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Incinerator"; + dir = 8; + network = list("ss13", "turbine") + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) "sIA" = ( /obj/machinery/door/airlock/external{ name = "Transport Airlock" @@ -85934,56 +83557,15 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/port/aft) -"sLL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/cryopods) "sNj" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) -"sTw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/structure/sign/departments/minsky/engineering/engineering{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"sUs" = ( -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) -"sWm" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_access_txt = "12" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "sYk" = ( /obj/machinery/door/airlock/public/glass{ name = "space-bridge access" @@ -85999,34 +83581,15 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/maintenance/port/fore) "sYr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/maintenance/port/aft) -"tch" = ( -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/misc_lab/range) -"tcM" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "tjt" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/science/mixing/chamber) "tjW" = ( @@ -86034,6 +83597,39 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space) +"tnu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"tqy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) +"tqR" = ( +/obj/item/radio/intercom{ + pixel_y = -30 + }, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) +"tqW" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_one_access_txt = "12;47" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "tsx" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -86047,12 +83643,74 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/security/prison) +"ttx" = ( +/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 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"tuO" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=13.2-Tcommstore"; + location = "13.1-Engineering-Enter" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"twg" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/machinery/camera{ + c_tag = "Arrivals - Fore Arm"; + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "txx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"tzs" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 8 + }, +/obj/machinery/advanced_airlock_controller{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"tzt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) "tDM" = ( /obj/machinery/door/airlock/engineering/glass/critical{ heat_proof = 1; @@ -86093,19 +83751,47 @@ }, /turf/open/space, /area/space/nearstation) +"tJT" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/suit_storage_unit/exploration, +/turf/open/floor/plasteel, +/area/science/misc_lab/range) "tLf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/maintenance/port) -"tOc" = ( -/obj/machinery/atmospherics/components/binary/volume_pump/on{ - dir = 1; - icon_state = "volpump_on_map-1"; - name = "Cold loop to Gas" +"tMI" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"tNy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"tOc" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Cooling to Unfiltered" + }, /turf/open/floor/engine, /area/engine/engineering) "tPk" = ( @@ -86115,15 +83801,43 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/crew_quarters/locker) +"tRl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall, +/area/maintenance/starboard/aft) +"tRF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"tUe" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "tUm" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow{ icon_state = "0-8" }, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/security/prison) +"tUH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "tVY" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -86138,9 +83852,8 @@ /area/science/misc_lab/range) "tWv" = ( /obj/structure/sign/warning/vacuum/external, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, -/area/space/nearstation) +/area/aisat) "tWZ" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -86173,27 +83886,52 @@ /area/science/xenobiology) "uej" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 }, /turf/open/floor/plating, /area/quartermaster/storage) +"ueO" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) +"ufZ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "uhY" = ( /obj/machinery/computer/warrant{ dir = 1 }, /turf/open/floor/plasteel/dark, /area/security/courtroom) +"ujB" = ( +/obj/structure/table/wood, +/obj/item/storage/book/bible, +/turf/open/floor/plasteel/dark, +/area/chapel/main) "ujJ" = ( -/obj/machinery/door/airlock/external{ - req_one_access_txt = "13,8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/turf/closed/wall, +/area/crew_quarters/fitness/recreation) "uky" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -86205,7 +83943,31 @@ dir = 8 }, /turf/closed/wall, -/area/chapel/main) +/area/hallway/secondary/exit/departure_lounge) +"uls" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/structure/sign/painting/library{ + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/library) +"ulC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light_switch{ + pixel_x = -25; + pixel_y = -4 + }, +/obj/structure/rack, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/science/shuttledock) "uoA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ @@ -86215,12 +83977,26 @@ name = "Incinerator Access"; req_access_txt = "24" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/maintenance/starboard) +"uoS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/hallway/secondary/exit/departure_lounge) +"upM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "urv" = ( /turf/closed/wall/mineral/plastitanium, /area/security/prison) @@ -86231,6 +84007,10 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/engine/storage_shared) +"utH" = ( +/obj/machinery/telecomms/processor/preset_exploration, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) "uun" = ( /obj/machinery/vending/assist, /turf/open/floor/plasteel, @@ -86263,6 +84043,17 @@ }, /turf/closed/wall, /area/hallway/secondary/entry) +"uAJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/status_display/evac{ + pixel_x = -32 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "uDE" = ( /obj/structure/bed/roller, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -86280,12 +84071,19 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/storage_shared) +"uEU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/landmark/start/exploration, +/turf/open/floor/plasteel, +/area/science/shuttledock) "uGa" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -86297,15 +84095,22 @@ /obj/structure/transit_tube/crossing/horizontal, /turf/open/space, /area/space/nearstation) -"uGW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"uGM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"uKy" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, /turf/open/floor/plasteel, -/area/maintenance/department/science) +/area/crew_quarters/fitness/recreation) "uPU" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "research_shutters"; @@ -86316,20 +84121,15 @@ name = "Research and Development Desk"; req_one_access_txt = "7;29" }, -/obj/machinery/autolathe, +/obj/machinery/modular_fabricator/autolathe, /obj/effect/turf_decal/stripes/box, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/lab) -"uQK" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) +"uQU" = ( +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "uRM" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -86340,16 +84140,13 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"uYk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 +"uSL" = ( +/obj/machinery/status_display/evac{ + pixel_y = 32 }, -/turf/open/floor/plasteel/white, -/area/science/misc_lab/range) +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) "uYt" = ( /obj/structure/grille, /obj/structure/lattice, @@ -86358,6 +84155,16 @@ }, /turf/closed/wall/r_wall, /area/space/nearstation) +"vag" = ( +/obj/structure/chair, +/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) "vcK" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -86371,12 +84178,6 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/port/fore) "vgd" = ( @@ -86388,6 +84189,12 @@ }, /turf/open/floor/engine/cult, /area/library) +"vgU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/closed/wall, +/area/crew_quarters/fitness/recreation) "vhG" = ( /obj/structure/table/glass, /obj/machinery/camera/autoname{ @@ -86408,6 +84215,19 @@ }, /turf/closed/wall, /area/maintenance/starboard/fore) +"vjb" = ( +/obj/structure/easel, +/obj/item/canvas/nineteen_nineteen, +/obj/item/canvas/twentythree_nineteen, +/obj/item/canvas/twentythree_twentythree, +/turf/open/floor/wood, +/area/library) +"vjL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "vjS" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/closed/wall, @@ -86416,8 +84236,18 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/turf_decal/pool, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"vlO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) "vnp" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -86427,6 +84257,9 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"vox" = ( +/turf/open/floor/engine/vacuum, +/area/maintenance/starboard) "vpJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -86436,19 +84269,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"vtf" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ - dir = 8 - }, -/obj/machinery/light/broken{ - dir = 8 - }, -/obj/structure/closet/crate/radiation, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "vvZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, @@ -86463,45 +84283,40 @@ dir = 8 }, /area/engine/storage_shared) -"vCq" = ( -/obj/machinery/light/small{ +"vBF" = ( +/obj/structure/chair/wood/normal{ dir = 4 }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/binary/dp_vent_pump{ - dir = 4 +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"vCj" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/obj/machinery/advanced_airlock_controller{ - dir = 4; - pixel_x = -24 +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) +"vDo" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) +/area/crew_quarters/locker) "vEv" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plating, /area/hallway/secondary/entry) -"vHO" = ( -/obj/machinery/door/airlock/research{ - name = "Shuttle dock"; - req_access_txt = "47" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) -"vJd" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "vKx" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -86509,7 +84324,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/engine/engineering) "vKB" = ( @@ -86527,22 +84342,23 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/secondary) -"vKH" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/machinery/door/firedoor/border_only{ +"vLj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "vLD" = ( /obj/structure/lattice, /turf/open/space/basic, /area/space) +"vMK" = ( +/obj/machinery/modular_computer/console/preset/curator{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) "vNr" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -86556,21 +84372,23 @@ /obj/machinery/door/airlock/maintenance{ req_one_access_txt = "12;50" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/port/fore) +"vRq" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/three, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) "vRM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/maintenance/starboard/secondary) "vUC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, +/obj/structure/window/reinforced, +/turf/open/space/basic, /area/space/nearstation) "vVq" = ( /obj/effect/turf_decal/stripes/line, @@ -86586,7 +84404,6 @@ /area/maintenance/starboard/secondary) "vXa" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/solars/port/fore) @@ -86614,56 +84431,56 @@ }, /turf/closed/wall/r_wall, /area/engine/gravity_generator) +"vZt" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/landmark/event_spawn, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "vZU" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, /turf/closed/wall, /area/maintenance/solars/port/aft) +"wak" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) "wba" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, /turf/closed/wall/r_wall, /area/engine/engineering) -"wcC" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +"wfA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/airlock/external, -/turf/open/floor/plating, -/area/science/shuttledock) -"wdq" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"wgp" = ( /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "2-4" }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"wgj" = ( +/obj/structure/table, +/obj/item/pen/blue, /turf/open/floor/plating, -/area/maintenance/port/aft) +/area/maintenance/starboard/fore) "wgP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral, @@ -86675,10 +84492,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "wiZ" = ( @@ -86698,13 +84512,22 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/security/brig) +"wmn" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 4 + }, +/obj/machinery/advanced_airlock_controller{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "wnQ" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/door/airlock/external{ + req_access_txt = "13" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, /turf/open/floor/plating, @@ -86715,9 +84538,17 @@ }, /turf/closed/wall/r_wall, /area/security/execution/education) +"wqg" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "wqS" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plating, /area/hallway/secondary/entry) @@ -86731,7 +84562,6 @@ /area/hallway/secondary/command) "wwo" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, @@ -86750,12 +84580,46 @@ }, /turf/open/floor/plating, /area/engine/atmos) +"wxT" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"wyv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/science/mixing) "wzD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 }, /turf/closed/wall, /area/maintenance/port/aft) +"wAr" = ( +/obj/structure/mirror{ + pixel_x = -28 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/shower{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) +"wCO" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) "wFH" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -86784,16 +84648,45 @@ }, /turf/open/floor/plasteel/dark, /area/science/nanite) -"wKo" = ( -/obj/effect/turf_decal/stripes/line, -/turf/closed/wall, -/area/science/misc_lab/range) +"wJg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/break_room) "wLz" = ( /turf/closed/wall, /area/crew_quarters/cryopods) +"wLQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"wNq" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "wOE" = ( /turf/open/floor/plating, /area/maintenance/aft/secondary) +"wOT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "wOY" = ( /obj/structure/fans/tiny/invisible, /turf/open/space/basic, @@ -86835,6 +84728,29 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/maintenance/department/science) +"wUx" = ( +/obj/machinery/power/apc{ + areastring = "/area/medical/surgery"; + dir = 4; + name = "Surgery APC"; + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/structure/table, +/obj/item/surgical_drapes, +/obj/item/glove_box, +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, +/area/medical/surgery) +"wVi" = ( +/obj/machinery/light_switch{ + pixel_y = -25 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab/range) "wVw" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -86843,44 +84759,36 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/research) -"wVQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "wYz" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) +"wYG" = ( +/obj/structure/bed/roller, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xad" = ( +/obj/machinery/light_switch{ + pixel_x = 27 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/easel, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, +/turf/open/floor/plasteel, +/area/storage/art) "xdW" = ( /obj/machinery/vending/wardrobe/jani_wardrobe, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -86888,7 +84796,6 @@ /area/janitor) "xgg" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, @@ -86901,7 +84808,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -86933,14 +84840,22 @@ icon_state = "4-8" }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/maintenance/starboard) +"xkU" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 }, -/obj/machinery/door/firedoor/border_only{ +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ dir = 4 }, /turf/open/floor/plasteel, -/area/maintenance/starboard) +/area/storage/primary) "xlF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -86953,24 +84868,15 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"xlJ" = ( -/obj/structure/plasticflaps/opaque, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"xmR" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/machinery/conveyor{ - dir = 8; - id = "SciLoad" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 }, /turf/open/floor/plating, -/area/science/shuttledock) -"xmR" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) +/area/maintenance/starboard/fore) "xop" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ dir = 4 @@ -86987,6 +84893,16 @@ }, /turf/open/floor/plasteel, /area/janitor) +"xoW" = ( +/obj/structure/chair, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "xpy" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -87000,6 +84916,18 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"xpV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 27 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "xqf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /mob/living/carbon/monkey, @@ -87021,6 +84949,11 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) +"xsr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/anesthetic_machine, +/turf/open/floor/plasteel/white, +/area/medical/surgery) "xvg" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -87036,32 +84969,35 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"xxm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"xwI" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/obj/machinery/conveyor{ - dir = 8; - id = "SciLoad" +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 }, -/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/shuttledock) -"xxI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" +"xwS" = ( +/obj/structure/toilet{ + pixel_y = 8 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/light/small{ + dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +/obj/machinery/newscaster{ + pixel_y = -32 }, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/obj/effect/landmark/blobstart, +/obj/machinery/button/door{ + id = "Toilet2"; + name = "Lock Control"; + normaldoorcontrol = 1; + pixel_x = -25; + specialfunctions = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) "xyf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/yellow{ @@ -87096,6 +85032,16 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"xyG" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "xzJ" = ( /obj/machinery/door/airlock/command{ name = "Captain's Quarters"; @@ -87103,10 +85049,7 @@ security_level = 6 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain/private) "xAp" = ( @@ -87119,15 +85062,37 @@ }, /turf/open/floor/plasteel, /area/maintenance/department/science) +"xAF" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/easel, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) "xCu" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/maintenance/starboard/fore) +"xDD" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"xFP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 8 +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Toxins Launch Room"; + req_access_txt = "8" }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/turf/open/floor/plasteel, +/area/science/mixing) "xHp" = ( /obj/machinery/advanced_airlock_controller{ dir = 1; @@ -87138,8 +85103,23 @@ }, /turf/open/floor/plating, /area/science/shuttledock) +"xIt" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/external{ + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "xJp" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/carpet/blue, /area/bridge) "xKV" = ( @@ -87147,48 +85127,37 @@ dir = 5 }, /turf/closed/wall, -/area/chapel/main) +/area/hallway/secondary/exit/departure_lounge) "xQk" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) +"xQQ" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) +"xTv" = ( +/obj/structure/pool_ladder, +/turf/open/indestructible/sound/pool/end, +/area/crew_quarters/fitness/recreation) +"xTC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/wardrobe/grey, +/turf/open/floor/plasteel, +/area/maintenance/department/science) "xVl" = ( /turf/closed/wall, /area/hallway/secondary/service) -"xVP" = ( -/obj/structure/sign/poster/official/random{ - pixel_y = -32 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/misc_lab/range) -"xVS" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/shuttledock) -"xYa" = ( +"xYO" = ( /obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 + icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 }, -/turf/open/floor/plating, -/area/maintenance/port) +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "xZk" = ( /obj/machinery/requests_console{ department = "Bar"; @@ -87209,17 +85178,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/engine/cult, /area/library) -"ybQ" = ( -/obj/structure/plasticflaps/opaque, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/conveyor{ - dir = 8; - id = "SciLoad" - }, -/turf/open/floor/plating, -/area/science/shuttledock) "yfM" = ( /obj/machinery/vending/engivend, /obj/effect/turf_decal/delivery, @@ -87246,6 +85204,10 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"yih" = ( +/obj/machinery/telecomms/bus/preset_exploration, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) "yjF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -87254,10 +85216,16 @@ /area/maintenance/port) "ykS" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/xenobiology) +"ylE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) "ylG" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/closed/wall, @@ -95057,14 +93025,14 @@ aaa aaa aaa aaa -ssS -ssS +aip +aip dne dne dne dne dne -ssS +aip dne dne aaa @@ -95314,7 +93282,7 @@ aaa aaa aaa aaa -ssS +aip aRG aRG aRG @@ -95325,9 +93293,9 @@ aRG alG dne dne -ssS -ssS -ssS +aip +aip +aip aaa aaa aaa @@ -95571,7 +93539,7 @@ aaa aaa aaa aaa -ssS +aip aRG aRG aRG @@ -95584,7 +93552,7 @@ dne aRG aRG alH -ssS +aip aaf aaf aaf @@ -95828,7 +93796,7 @@ aaa aaa aaa aaa -ssS +aip aRG aRG aRG @@ -95841,7 +93809,7 @@ afL aRG aRG aRG -ssS +aip aaa aaa aaf @@ -96085,7 +94053,7 @@ aaa aaa aaa aaa -ssS +aip aRG aRG aRG @@ -96098,7 +94066,7 @@ dne aRG aRG aRG -ssS +aip aaf aaa aaa @@ -96342,7 +94310,7 @@ aaa aaa aaa aaa -ssS +aip aRG aRG aRG @@ -96353,9 +94321,9 @@ aRG aRG dne dne -ssS -ssS -ssS +aip +aip +aip aaa aaa aaa @@ -96368,10 +94336,10 @@ aRA aRA aRA aRA -roG -roG -roG -roG +aVs +aVs +aVs +aVs aaf aaa aaa @@ -96381,20 +94349,20 @@ aaa aaa aaa aaf -roG -roG -roG -roG -roG +aVs +aVs +aVs +aVs +aVs aaa aaa aaa aaa aaa -roG -roG -roG -roG +aVs +aVs +aVs +aVs aaa aaf aaa @@ -96599,14 +94567,14 @@ aaa aaa aaa aaa -ssS -ssS +aip +aip dne dne dne dne dne -ldl +ahS dne dne anS @@ -96627,7 +94595,7 @@ aSH aUb aVt aWT -roG +aVs aaf aaf aaa @@ -96639,19 +94607,19 @@ aaa aaa aaf aaf -roG +aVs bvB aWT -roG +aVs aaa aaa aaa aaa aaa -roG +aVs bKS aWT -roG +aVs oeD nTf aaa @@ -96861,11 +94829,11 @@ aaf aaf aaf anS -ssS +aip aRG aRG alH -ssS +aip anS aaf aaf @@ -97118,11 +95086,11 @@ aaf aqB anS anS -ssS +aip aRG aRG aRG -ssS +aip anS aaf aaf @@ -97139,9 +95107,9 @@ aaa wOY aSI aRA -aVv +gme aWU -roG +aVs aaf aaf aaa @@ -97153,16 +95121,16 @@ aaa aaa aaf aaf -roG +aVs aVw aWU -roG +aVs aaa aaa aaa aaa aaa -roG +aVs aVw aWU bOd @@ -97375,11 +95343,11 @@ anS aaf anS aaf -ssS +aip aRG aRG aRG -ssS +aip anS aaf aaf @@ -97396,7 +95364,7 @@ aRA aRA aRA aRA -cZf +xoW aWV aRA aaa @@ -97657,7 +95625,7 @@ aVx aWU wwo pfL -roG +aVs aaa aaa aaa @@ -97665,21 +95633,21 @@ aaa aaa aaa aaa -roG +aVs wwo lwl bvD aWU -roG +aVs aaa aaa aaa aaa aaa -roG +aVs aVw sgq -roG +aVs aaa aLo aaa @@ -97936,7 +95904,7 @@ aaa aRA aVu sgq -roG +aVs aaf aLo aaa @@ -98171,7 +96139,7 @@ aVy aWU vEv uyu -roG +aVs aaa aaa aaa @@ -98179,18 +96147,18 @@ aaa aaa aaa aaa -roG +aVs uyu -roG +aVs dDV bxv -roG +aVs aaa aaa aaa aaa aaa -roG +aVs aVu bMu aRA @@ -98425,10 +96393,10 @@ aRE aSK cYL vpJ -wdq +mNy hPj baa -roG +aVs aaa aaa aaa @@ -98436,21 +96404,21 @@ aaa aaa aaa aaa -roG +aVs bsl btO -aWW +ufZ sEv -roG +aVs aaa aaa aaa aaa aaa -roG +aVs bKU -bMv -roG +qak +aVs aaa aLo aaa @@ -98685,7 +96653,7 @@ aVz bvF aWU baa -roG +aVs aaa aaa aaa @@ -98693,18 +96661,18 @@ aaa aaa aaa aaa -roG +aVs bsm aVu bvF bxw -roG +aVs aaa aaa aaa aaa aaa -roG +aVs aVu bMw aRA @@ -98950,7 +96918,7 @@ aaa aaa aaa aaa -roG +aVs baa btP aWX @@ -98964,7 +96932,7 @@ aaa aRA btS bxw -roG +aVs aaf aLo aaa @@ -99199,7 +97167,7 @@ aVA aWY aYE bac -roG +aVs aaa aaa aaa @@ -99207,18 +97175,18 @@ aaa aaa aaa aaa -roG -bsn +aVs +ezY btQ bvI bxw -roG +aVs aaa aaa cVx aaa aaa -roG +aVs aVu bxw aRA @@ -99453,10 +97421,10 @@ cYE cYK cYQ aVB -jtw +ooM kkr wqS -roG +aVs aaa aaa aaa @@ -99464,19 +97432,19 @@ aaa aaa aaa aaa -roG +aVs oxJ -roG +aVs bvH bxy aRA aaf bCG bEl -roG +aVs aaf aRA -bKV +tUe bMx aRA aaa @@ -99731,7 +97699,7 @@ kkr fcC bEm pfL -roG +aVs aRA btS bMy @@ -99968,9 +97936,9 @@ aSM aDb cZq aWZ -roG +aVs qmH -roG +aVs aaa aaa aaa @@ -99978,17 +97946,17 @@ aaa aaa aaa aaa -roG +aVs qmH -roG +aVs bvH bxz aRA -bBc -roG +ekG +aVs sIA vEv -bHH +iZQ aRA aVu bMz @@ -100238,8 +98206,8 @@ aaa aaa vEv btR -aXa -bxA +tNy +egL biu bbI bbI @@ -100486,11 +98454,11 @@ aYG qmH aRA aRA -roG -roG -roG -roG -roG +aVs +aVs +aVs +aVs +aVs aRA aRA qmH @@ -100501,7 +98469,7 @@ biv bBd bCH bEn -dic +joN bHI bJo bKW @@ -100723,7 +98691,7 @@ avT avT avT aJi -fXN +avT dss avM avT @@ -100969,7 +98937,7 @@ aaa aaa aaa aaa -ssS +aip aqD arX dne @@ -100979,7 +98947,7 @@ aRG aoc drQ dne -ssS +aip dne dst aDc @@ -100995,7 +98963,7 @@ aRG aSP dne dhM -aXd +twg aYI bae bbJ @@ -101006,7 +98974,7 @@ biv bjW blT bnL -bqc +iKO bso bnL bvL @@ -101233,7 +99201,7 @@ dne aaf dne dne -ssS +aip dne dne aaa @@ -101241,14 +99209,14 @@ dne dne dne dne -ssS +aip dne dne dne dne dne dne -ssS +aip dne dne dne @@ -101774,13 +99742,13 @@ bcY beM bgx biy -bjZ +jnK blW bnN bqe bsq btU -bvO +fki bxF bzx bzx @@ -102281,7 +100249,7 @@ aaa aaa aaa aaf -ssS +aip doJ bbK bda @@ -102538,7 +100506,7 @@ aaa aaa aaa aaa -ssS +aip asi bbK bdb @@ -102564,8 +100532,8 @@ bBg bBg bOg bzx -jol -xYa +aoa +bSr alK alK alK @@ -102795,7 +100763,7 @@ aaa aaa aaa aaa -ssS +aip doJ bbK bdc @@ -103066,7 +101034,7 @@ baE baE baE bvN -bxK +huT bzx djW bCN @@ -103085,7 +101053,7 @@ sLG bVV bXz bYE -xxI +bYE cbp dux ixU @@ -103322,7 +101290,7 @@ bnR bqi bst btX -bvO +fki bxL bzx bBk @@ -103371,7 +101339,7 @@ cBR cBR cBR cBR -otr +cDE cBR cBR cBR @@ -103539,7 +101507,7 @@ aaa aaa aaf aaa -ssS +aip dnO asd dne @@ -103573,7 +101541,7 @@ bde beT bgD biC -bke +ovD bmc bnS bqj @@ -103792,7 +101760,7 @@ aaf ahp aif ahp -mfo +ahq ahp ahp ahp @@ -103835,11 +101803,11 @@ bmd bnT bqk bsv -btZ +szz bvV bxN bvW -dhZ +mYj bCP bvW bGl @@ -103858,7 +101826,7 @@ bXE bXE dux dux -sWm +apy dux dux cbq @@ -104099,7 +102067,7 @@ bvW bBl bCQ bEt -bGm +lVd bHO bvW aob @@ -104303,7 +102271,7 @@ aaf aaf aaf aaa -mfo +ahq ahq ahp blt @@ -104560,7 +102528,7 @@ aaf aaa aaf aaa -mfo +ahq aih ajd akh @@ -104817,7 +102785,7 @@ aaa aaa aaf aaa -mfo +ahq aii ajg aki @@ -104878,10 +102846,10 @@ aob aob aob alK -pJj +bSu dux dux -sWm +apy dux dux dux @@ -105074,7 +103042,7 @@ aaf aaf aaf aaa -mfo +ahq aij ajf akj @@ -105124,9 +103092,9 @@ baE bvW bvW bvW -bBp +cUA bvW -bEv +pgu bvW bvW bvW @@ -105331,7 +103299,7 @@ aaa aaf aaf aaf -mfo +ahq aik anZ akk @@ -105402,7 +103370,7 @@ bXE bXE bXE bXE -fwf +arz dwb eCs cia @@ -105632,7 +103600,7 @@ biI bkl dmF bnW -bqp +otD bsC bud bvY @@ -105671,7 +103639,7 @@ cpU crj csj cia -wgp +dyg dux dux dux @@ -105924,7 +103892,7 @@ ckV cml mTW coz -coz +xsr crk csk cia @@ -106418,13 +104386,13 @@ bJy bLh bMH bue -bPO +lSC bRg dDi bTw bue bSr -fwf +arz bXE bXE bXE @@ -106675,7 +104643,7 @@ bJz bLi bMI bue -bPP +kzX bRh bSy bTx @@ -106694,7 +104662,7 @@ cjA ckY cmk cnq -coC +wUx cpW crn csn @@ -106873,7 +104841,7 @@ aaa aaf viG aaf -ssS +aip aRG aRG aRG @@ -106918,7 +104886,7 @@ bkp bmh bnV bql -avH +tMI bug bCV bCV @@ -107130,7 +105098,7 @@ aaa aaa viG aaa -ssS +aip aRG aRG aRG @@ -107174,7 +105142,7 @@ bfb bkq bmi boc -bqt +ayh bsy buh bwd @@ -107387,7 +105355,7 @@ aaZ aaZ wps aaa -ssS +aip aRG aRG aRG @@ -107446,10 +105414,10 @@ bzE bLk bzE bue -bPS +nSr bPR bBs -bBs +uls bue bWd bXH @@ -107644,7 +105612,7 @@ aeg aeH wps aaa -ssS +aip aRG aRG aRG @@ -107703,7 +105671,7 @@ bzE bLk bML bue -bzE +vjb bRj bSB qVR @@ -107901,7 +105869,7 @@ aeh aeI wps aaf -ssS +aip aRG aRG aRG @@ -107957,7 +105925,7 @@ bEA bGu bHT bJA -bLl +vMK bMM bue bPU @@ -107994,7 +105962,7 @@ csr cxU cxU cxU -wVQ +cDL dzK cFM cGs @@ -108179,7 +106147,7 @@ aCd aDp aaa aFP -aHo +fNl dhG dne aLc @@ -108459,7 +106427,7 @@ biP bku bml bog -bqv +oSI bsI bue bue @@ -108476,7 +106444,7 @@ bMO bue bPV qLf -bRl +sGG bue alC bWd @@ -108950,7 +106918,7 @@ aCg aDs aEH aFS -aHo +fNl aIy aJO aLf @@ -109241,9 +107209,9 @@ aZO aZO cUU bue -buf -cVh -aVW +kca +qnp +jtg bue bue bue @@ -109257,7 +107225,7 @@ bZY cbJ cdp cev -cfK +cdk cgT cii cjI @@ -109468,7 +107436,7 @@ aHs aIA aJQ aLh -aMC +nqJ aNU dCt aMB @@ -109479,13 +107447,13 @@ aJO aXv enV baF -bcb +nwf bdx bfh bdx bfh bkx -aYU +gXp boj bqy bsK @@ -109501,10 +107469,10 @@ cVd buj buj buj -dJo +bxY buj bwh -bSD +jZN buj buj bWh @@ -109547,9 +107515,9 @@ cKs cLa cMa cLa -cNz +oUI cOh -cOL +hld cLa cMI cQf @@ -109741,14 +107709,14 @@ baG baG baG baG -bdP +klp baG bok bqz bsL buk dCH -bdP +klp baG baG bCX @@ -110008,18 +107976,18 @@ bfi bky bGw bfi -bCY +eXp bEC bHX bHX bJC bHX -bMR +hRv bOn bPY -bRo +mEV bHX -bTF +mdo bVa bWj bXK @@ -110285,7 +108253,7 @@ cab cbN cdt cex -cfN +qsO cgV cim cjM @@ -110571,8 +108539,8 @@ bTs cGP bTs bTs -isK -lRd +avr +cLf cLa cML cND @@ -110581,7 +108549,7 @@ cOO cPo cPM cQi -cQF +ujB cOP cRp cRL @@ -110758,7 +108726,7 @@ aNY aPr aQy aRS -aTg +xkU aUu aVT aXA @@ -110780,7 +108748,7 @@ bxZ bzL bBA bDb -bEF +rBO bGz bHZ bJE @@ -110792,7 +108760,7 @@ bRp bSE bTI aYX -bWm +dHC bXL bXL cad @@ -111034,7 +109002,7 @@ bsO bup bwk bkz -bzM +gnR bBB ghU bEE @@ -111255,7 +109223,7 @@ hry rHt rHt avY -qFx +ajo aaa azC aAW @@ -111274,7 +109242,7 @@ aaa aaf aaa aUv -aVU +dxB aXC aYX baL @@ -111291,7 +109259,7 @@ btH buq bAZ bkz -bzN +uSL bBB bDa bEG @@ -111489,7 +109457,7 @@ aax aax abr abJ -abj +xAF abE abE ade @@ -111510,7 +109478,7 @@ ahx aqY asn atK -qFx +ajo ipm ahx aaa @@ -111531,8 +109499,8 @@ aJS aJS aaa aUw -aVV -aXD +ncA +hPc aZb baM rrB @@ -111772,8 +109740,8 @@ avZ wjt wjt fBA -ajm -ajm +aHx +aHx aDu aEJ aGa @@ -111788,9 +109756,9 @@ aQz aJS aaa aUv -aVW +jtg aXC -aZc +pBk baN bcg bdE @@ -112124,7 +110092,7 @@ cMI cMI cMI jTe -cPG +uoS ulj xKV aaa @@ -112290,7 +110258,7 @@ azE aCl aDx aEK -aGc +ekr aHx aaa aJS @@ -112305,7 +110273,7 @@ aUy aVX aXF aYZ -baP +wqg bcg bdG bfq @@ -112382,7 +110350,7 @@ cPO cQm cQJ cQY -efp +tzs eES aaa aaa @@ -112561,7 +110529,7 @@ aTi aUz aVY aXG -aZe +qNF baQ bci aaf @@ -112578,7 +110546,7 @@ bqH bkz bzR bBD -bDe +fJz bEK bGD bIg @@ -112594,7 +110562,7 @@ bVc aXR bXN bZa -cak +vag cbV cdA ceF @@ -112635,7 +110603,7 @@ cNK cOq cLm cLm -rQT +llB ksx jsu mOk @@ -112896,7 +110864,7 @@ cPP cQo cQL cQY -hmq +wmn eES aaa aaa @@ -113111,7 +111079,7 @@ bZd cam cbX cdC -ceH +wYG cfX chc cix @@ -113141,7 +111109,7 @@ cCe cHK bTs cPb -cKy +jWZ cLo cLm cLm @@ -113846,7 +111814,7 @@ aaa aUv aWc aXK -aZg +jeD baQ bci aaf @@ -113866,7 +111834,7 @@ bLT bDj bEN bGG -bIi +jEj bJN bLv bNc @@ -114102,7 +112070,7 @@ aHx aIH aUB aWd -aXL +hmT aZh baQ bci @@ -114133,7 +112101,7 @@ bRz bLw cMQ bVf -bWs +kAn bXR bZe hQG @@ -114345,7 +112313,7 @@ azE azE aCl aDx -aEQ +lxh aGj aHz aII @@ -114415,13 +112383,13 @@ cwF cxz cyn czf -cAh +iPU cBe chg chg cEg cFa -cFZ +wLQ cGU cHN cIE @@ -114432,7 +112400,7 @@ cMh cMW cMh cMh -cOY +vLj cPs cPU cQp @@ -114613,7 +112581,7 @@ aHA aPz aJU aRW -aTj +iaj aUD aWf aXN @@ -114634,7 +112602,7 @@ dCK byg bzW bBJ -bDl +mZu bEQ bGJ bIj @@ -114669,7 +112637,7 @@ ctF car car car -cxA +dpa car czg cAi @@ -114681,7 +112649,7 @@ cFb car car cHO -cIF +fBq cJF cKE cLt @@ -114863,18 +112831,18 @@ aER aGl aHB aIK -aJV +tRF aIK aHB aHB aPA -aJV +tRF aHB aHB aUE -aWg +rca aXO -aZk +sbP baT bci aaf @@ -114922,13 +112890,13 @@ cpa cpa crH csL -ctG +nIA cgc cvG chh cxB cyo -czh +nwW cAj kZW cCm @@ -114952,7 +112920,7 @@ cPV cQq cQP cQY -vCq +hAQ kzn aaa aaa @@ -115115,7 +113083,7 @@ ayB azI aBc aCn -aDB +sbU aES aGm aHD @@ -115162,7 +113130,7 @@ bLw bTP bVj bWw -bXU +raU bZi bZk ccc @@ -115405,7 +113373,7 @@ bww byj xJp bLT -bDn +jwU bES bGL bIk @@ -116190,7 +114158,7 @@ bGM bTT aYX bWy -bXX +eMY bZl caw ccg @@ -116449,9 +114417,9 @@ bVl bWz bXY bZm -cax +qPZ cch -cdK +gQZ uRM cgf rzX @@ -116486,9 +114454,9 @@ cKG cLy cPb cPb -cPb -cPb -dLh +wtq +wtq +pRi aaa aaa aaa @@ -116691,7 +114659,7 @@ byo bcj bBN bDs -bEX +wfA bGO bIn bJU @@ -117173,8 +115141,8 @@ aBj aCr avk avk -avk -aHD +aGt +iNs aIS aKd aIR @@ -117430,8 +115398,8 @@ ayF ayF ayJ ayJ -aGt -aHF +ayJ +aHD aIT aKe aIR @@ -117445,7 +115413,7 @@ aUJ aHD aXS aYX -baW +iCU bck bdI bfz @@ -117480,7 +115448,7 @@ bZn caB ccj cdO -ceU +oCT cgi cDh ciI @@ -117686,8 +115654,8 @@ azQ aBk aCs aDI -ayJ -ayJ +aFa +aHF aHD aHD aHD @@ -117719,7 +115687,7 @@ byr bAe bcj bDj -bFb +qrV bGQ bGM bJY @@ -117732,7 +115700,7 @@ bSO bTI aYX bWB -aVU +dxB bZo bZo cck @@ -117772,12 +115740,12 @@ cQr cQR cSd cSd -nqY -nqY -nqY -nqY -nqY -nqY +cRe +cRe +cRe +cRe +cRe +cRe aaa aaa aaa @@ -117989,7 +115957,7 @@ bSO bTI aYX bWB -aVW +jtg bZo caC ccl @@ -118004,7 +115972,7 @@ bZn cob cpm cqF -crL +wVw csW ctO cuJ @@ -118034,7 +116002,7 @@ cRg cYT cYT djg -nqY +cRe aaa aaa aaa @@ -118210,11 +116178,11 @@ aMS aOo aPE aQL -aSb +lKn aTq aUK aWm -aXW +upM aZq baY bcj @@ -118246,7 +116214,7 @@ bSO bTI aYX bWB -aVW +jtg bZo caD ccm @@ -118285,13 +116253,13 @@ cgo cQs cQS cRb -nqY -nqY -nqY -nqY -nqY +cRe +cRe +cRe +cRe +cRe uaC -nqY +cRe aaa aaa aaa @@ -118546,9 +116514,9 @@ aaa aaf aaa aaa -nqY +cRe uaC -nqY +cRe aaa aaa aaa @@ -118757,7 +116725,7 @@ bON bQy bRN bSP -bUa +nCH bVn bWE bSS @@ -118803,9 +116771,9 @@ aaa aaf aaa aaa -nqY +cRe uaC -nqY +cRe aaf aaa aaa @@ -119017,7 +116985,7 @@ bcg bTS aYX bWF -bYb +iuC vWK diA crJ @@ -119062,7 +117030,7 @@ aaf aaa cRe uaC -nqY +cRe cRu cRi cRi @@ -119251,7 +117219,7 @@ bfE bhA bjl bkQ -bmJ +uAJ boJ bra btj @@ -119260,13 +117228,13 @@ bdO byv bcl bBQ -bDz +hzK bFg bGV bGV bKc bLH -bNt +mxW bOO bQz bRO @@ -119317,9 +117285,9 @@ aaa aaa aaf aaf -nqY +cRe uaC -nqY +cRe cRi dbX dcg @@ -119503,9 +117471,9 @@ aXY aZr bba dCH -bdP +klp baG -bhB +iyD bjm bkR aWf @@ -119513,14 +117481,14 @@ aWf brb btk aWf -bwI +kdW aWf dCT bBR bDA bFh bGW -bIr +tnu kdW aWf aWf @@ -119574,7 +117542,7 @@ dvY dvY dvY dvY -nqY +cRe djh cYT cRv @@ -119751,7 +117719,7 @@ aZU aMX tPk tPk -aQQ +hJU aOt aTv aUM @@ -119775,7 +117743,7 @@ byw byw byw bDB -bFi +xyG bGX bIs bKd @@ -119831,15 +117799,15 @@ auT auT awI dvY -nqY -nqY -nqY +cRe +cRe +cRe cRi dbZ dci dcu cRi -nqY +cRe cRi cSg cSn @@ -119998,11 +117966,11 @@ ahx dhz aoP axC -aDP +cot axC -aGz +xwS axC -aJa +hfX axC bbG aMY @@ -120267,7 +118235,7 @@ aOv aOw aQR aOu -aTx +irf aUM aWt aYa @@ -120515,14 +118483,14 @@ aCz aDR aFc aGB -aHI +nxf aFd aKl aLK aMY aOw aPI -aQS +vDo aSf aTy aUM @@ -120546,7 +118514,7 @@ byy bAj bBT bDD -bFl +pSe bHa bIu bKe @@ -120778,11 +118746,11 @@ aKl aLL aMZ aOx -aPJ +sgM aQT aOu aTt -aUN +dIM aUM aYc aTC @@ -120794,7 +118762,7 @@ bhE bjp bkU bmM -boO +xad brf bmO xZk @@ -120803,7 +118771,7 @@ bwO bAk bBT bwO -bFm +wOT bGZ bBT bKf @@ -120851,7 +118819,7 @@ cHh cIi cJa dAp -cKK +nKr cxM dvY auT @@ -120862,7 +118830,7 @@ dvY aaa aaa aaf -nqY +cRe cRS dcm dcv @@ -120894,7 +118862,7 @@ ddx ddz daR cZv -nqY +cRe aaa aaa aaa @@ -121039,7 +119007,7 @@ aOt aQU aSg aTt -aUO +pVE aUM boW aZt @@ -121062,7 +119030,7 @@ bBU bwO dDb bHb -bMP +mDw bKg bLL bLL @@ -121086,7 +119054,7 @@ cgq cgq cmP cmP -cpx +pdS cqP crR cth @@ -121108,7 +119076,7 @@ cHi ehL dvY dvY -cKL +pPc dvY dvY dvY @@ -121119,7 +119087,7 @@ dvY aaa aaa aaf -nqY +cRe cRS dcn dcw @@ -121280,14 +119248,14 @@ aje awN axC ayK -aAa +wAr aBt aCA aDT aFf aGD aHK -aJc +rIr axC aLN aNa @@ -121296,7 +119264,7 @@ aOu aQV aOv aTt -aUP +iWm aUM dCD aZt @@ -121319,9 +119287,9 @@ bBT bwO bFn bHc -bIw +bwO bKh -bLM +bLK bLK bOU bQD @@ -121365,7 +119333,7 @@ cyK cPe dvY auT -dAZ +lLE avK dvY auT @@ -121376,7 +119344,7 @@ aaa aaa aaa aaf -nqY +cRe cRS dco dcx @@ -121408,7 +119376,7 @@ bIv ddz ddB cZv -nqY +cRe aaa aaf aaa @@ -121520,7 +119488,7 @@ aaf aaa wLz fLl -sLL +fZP sEA acP ahd @@ -121541,7 +119509,7 @@ aAb aBu aCB aDU -aFg +epW dhD axC axC @@ -121578,7 +119546,7 @@ bFo bwO bBT bKi -bLN +bLK dDe bOV bQE @@ -121616,13 +119584,13 @@ cBC cyK cyK cyK +cyK dvY -dyc cub diP dvY auT -avw +scW avx avV avW @@ -121794,7 +119762,7 @@ aje aje axC ayM -aAc +fXe aBv axC aDV @@ -121810,7 +119778,7 @@ aOw aQX aOu aTt -aUR +nEP aUM aYe dnh @@ -121835,7 +119803,7 @@ bFk bwO bBT bKj -bLN +bLK bLK ddE bQF @@ -121873,13 +119841,13 @@ cBD cCD uun rSL +jGE dvY -cEz dxQ dyc dvY auT -auT +lLE auT dvY auT @@ -122038,7 +120006,7 @@ gKd rkx acP afs -agr +lTL acP amv acP @@ -122122,21 +120090,21 @@ ftu kVo kVo kVo -gHh +lSU sLd nHj wRy cBE -cAJ cCE cCE -czC -dzI -cIl -dAd -dvY +ovP +wCO +mWS +vZt +lDp dvY dvY +tqW dvY cKP cKP @@ -122289,7 +120257,7 @@ aaa aaa aaf aaa -kSY +acQ aft agt ahf @@ -122317,7 +120285,7 @@ aGG aHM aJe aKm -aLR +iNr aNd aOD aPK @@ -122384,16 +120352,16 @@ gLC qqg cAK cBF -cCF -uGW -dqU -dvY -dww -auD -dAZ +xTC +iqU +klP +oqs +tRl +auT +nAO dvY -avb -avx +auT +scW avL cKR cLK @@ -122546,7 +120514,7 @@ aaa aaa aaf aaa -kSY +acQ afu agu loQ @@ -122554,37 +120522,37 @@ agE ahQ ajR aiO -peG -anG +hoI +uGM aoU aqd arB asU -aue +jPO arB awD -axD +kUw arB aAe aBx -aCD +wNq aDY aFk -aGH -aHN +ooN +aQc aJf aKn aLS -aNe +ylE aOE aPL aQZ aSh aTA -aUT +gdD aUM aYh -cYe +aCM bbj aCM bdW @@ -122638,19 +120606,19 @@ cuZ cuZ cuZ cuZ -ioI +siR +ojg +ojg ojg czD -cAL -cBG cyy +xFP +wyv czD czD -gEk -eZe -auS -avq -avI +dvY +auT +fbK avU cKQ cLL @@ -122803,17 +120771,17 @@ aaa aaa aaf aaa -kSY +acQ afv agu ahh -ahh +dHG aiR ajS alh fMv -agz -aoV +kCJ +aoW dhs arB asV @@ -122838,7 +120806,7 @@ aPM aRa aSi aTB -aUT +gdD aUM dhN dnh @@ -122863,7 +120831,7 @@ bFs bHd byC bKl -rUK +bKe bND bOX bQI @@ -122895,19 +120863,19 @@ cwb lal ygk sdi -fDD -wKo +aRw +krD +krD +wVi +czD czD cQC cBH cCG cDq -czD dvY -dvY -ozV auT -avJ +gAP auT cKP cLM @@ -123063,14 +121031,14 @@ aaf acP acP agv -ahh +rwk ahW -aiS -ajT -aiS -amw +amA +amA +amA +amA dCc -aoV +uKy aqf arB asW @@ -123120,10 +121088,10 @@ bwX bHe dCU bKm -rUK -bNE -dbn -dbn +bKe +fwt +rFZ +rFZ bRY bST bUo @@ -123142,29 +121110,29 @@ cgq cgq cgq cgq -cpF +emC cgq cgq dwL -dsT +mHF cuZ eqG cwZ vVq cyM -uYk -ojg +nli +krD +lwJ +tJT +czD cQv cAN cBI cAP cDr -czD -aaf -aaf -dNC -uuw -dAn +dvY +dvY +xIt uuw vvZ iia @@ -123317,15 +121285,15 @@ aaa aaa aaf aaa -kSY +acQ afw agu ahi -ahX -afA -ajU -ali -amx +ahY +amA +amA +amA +amA anH aoW aqg @@ -123337,7 +121305,7 @@ asX axG ayN aAf -aBz +ets aCG aEb aFm @@ -123377,14 +121345,14 @@ bFt bHf byC bKn -rUK +bKe bNF bOZ bQJ bRZ -rUK -rUK -rUK +bKe +bKe +bKe bST bST bST @@ -123392,7 +121360,7 @@ caQ bST bST cfg -hWr +pCp pCp ciX pCp @@ -123409,17 +121377,17 @@ dyp pcn vVq cyM -xVP -ojg +nli +krD +lwJ +hyY +czD czF cAN cBJ cAP cDs -czD -aaf -aaa -aaf +dvY dvY cJe dvY @@ -123574,15 +121542,15 @@ aaa aaa aaf aaa -kSY +acQ afx agw ahj -ahX -afA -ajU -afA -amy +xTv +amA +amA +amA +amA anI aoX aqh @@ -123592,12 +121560,12 @@ aui avm asY aui -ayO +cYe aAg aBA aCH aEc -aFn +jgt aGK aUX aJh @@ -123634,14 +121602,14 @@ bwX bHe byC bKo -rUK +bKe fwt bPa rFZ bSa bSX bUp -rUK +bKe bWV bYm bZw @@ -123659,24 +121627,24 @@ ovj ovj ovj cuZ -sFv +iuF cuZ cuZ eqG pcn vVq cyM -pZm -ojg +nli +krD +lwJ +kMb +czD czG cAN cBK czD cDt -czD -aaf -aaa -aaf +dvY dvY kDM dnJ @@ -123831,15 +121799,15 @@ aaf aaf aaf aaa -kSY +acQ afy agx ahk -ahX -aiU +ahY +amA ajV -alj -amz +amA +amA anJ aoY aqi @@ -123855,7 +121823,7 @@ aBB aCI auj aFo -aGL +xDD aHR aJh aKr @@ -123891,14 +121859,14 @@ bFu bFr byC bKp -rUK +bKe bNG bNG bZx cgF bSY bUq -rUK +bKe diw bYn diz @@ -123923,17 +121891,17 @@ szA hFV qjB dGH -mzh -ojg +ney +krD +lwJ +ntl +czD cQB cAO cBL -cAP +cEA cDu cEA -aaf -aaa -aaa ack cJf ack @@ -124093,9 +122061,9 @@ acP agy vlx ahY -aiV -aiV -aiV +amA +amA +amA amA anK aoZ @@ -124140,22 +122108,22 @@ brr bmP bmP byN -dhU +nRS bAs bBZ bBZ -bFv +okx bHg dii byN -rUK -rUK -rUK -rUK -rUK +bKe +bKe +bKe +bKe +bKe bSZ bUr -rUK +bKe bST bST bST @@ -124180,18 +122148,18 @@ cwd kfu cxP krD -gnZ -ojg +nli +krD +krD +tqR +czD czI cAP cAP -czD +blx anS blx aaa -aaa -aaa -aaa aaf aaa aaa @@ -124343,18 +122311,18 @@ aaf aaa acP acP -kSY +acQ acP acP afz agz dBY -vlx -vlx +dZx +dZx etr alk alk -anK +mYo aoZ aqk arB @@ -124390,7 +122358,7 @@ bdZ aWv dCJ bjp -blc +lhh bmR boZ brs @@ -124398,12 +122366,12 @@ btt avs byN bGg -bAt +wak bCa bDK bFw bHh -bIA +fPf byN byN dil @@ -124428,7 +122396,7 @@ nbv nbv ovj ovj -fmR +atd cuZ cuZ obb @@ -124437,22 +122405,22 @@ kOt krD krD krD -ofm -ocT +nli +krD +krD +krD +cEA aaf aaf aaf anS anS anS -aaa -aaf -aqB +lMJ anT anT anT aaf -aaf dbR aqB anT @@ -124598,7 +122566,7 @@ aaa aaa aaf aaf -kSY +acQ adj adE aed @@ -124624,10 +122592,10 @@ arB aAk arB aCK -aEf +hCF arB aGO -aHT +vBF aJh aKu aLX @@ -124655,7 +122623,7 @@ btu buU byN dhV -bAu +tzt bCb byJ bFx @@ -124689,21 +122657,21 @@ nbv auc cuZ tVY -fUC -iQh -suu -suu -tch -skh -imU -aaf -aaa -aaf +nLK +hrp +krD +krD +krD +nli +krD +krD +kss +cEA aaf aaf +lMJ aaf aaf -aaa aaf aaf aaa @@ -124873,7 +122841,7 @@ apa aqm arB atc -aun +kxo arB awH aud @@ -124915,7 +122883,7 @@ byL bAv bCc bCc -bFy +ueO bHj bIC byN @@ -124946,21 +122914,21 @@ nbv nbv cuZ mjJ -vHO +buW mjJ mjJ mjJ mjJ -gUT +kOW +mjJ +mjJ +mjJ mjJ -hCF -hCF -hCF aaa -aaf aaa -aaf aaa +aaa +aaf dbJ dbJ dbJ @@ -125159,7 +123127,7 @@ bbp bcB bec bfO -sTw +hoF bjA bkW alq @@ -125172,7 +123140,7 @@ dhW dhX bCd dib -bFz +fTN dif dij byN @@ -125187,7 +123155,7 @@ xVl xVl mvj xVl -fiN +dLK bcd cdX adH @@ -125203,21 +123171,21 @@ nbv nbv ovj mjJ -gjM -qEn -vtf -nTS -qAg -iSa -sxX -oBS -lGj -ems +juU +ulC +ojw +rvY +mGY +lWA +hIy +dQI +vRq +mjJ aaa -aaf aaa -anT aaa +aaa +aaf dbK dbM dbM @@ -125373,7 +123341,7 @@ jwW aaa aaa aaa -aeC +aeE afD afD afD @@ -125408,7 +123376,7 @@ aPS cXc aSo dnh -nZx +avB aWv aYm aZA @@ -125460,20 +123428,20 @@ nbv nbv ovj mjJ -tcM -dQI -qqo -dQI -dQI -qqo -uQK -dQI -sUs -nYJ -aaf -aaf +syh +iUx +dUj +dUj +xwI +cvj +vCj +dUj +eXl +mjJ +aaa +aaa aaa -anT +aaf aaf dbL dbL @@ -125630,7 +123598,7 @@ aaa aaa aaa aaa -aeC +aeE afD afD afD @@ -125674,14 +123642,14 @@ bcD bee aWv bhP -bjB +jMW ble bmT bpc dhQ btw buX -oYC +bwY bGp btw dCV @@ -125717,20 +123685,20 @@ nbv nbv ovj mjJ -kKE -ljp -xxm -pSf -iWI -vJd -fpF -ijC -mdV -nYJ +dQI +vjL +tqy +tqy +ext +mgO +jQw +dQI +iHM +hZi +aaa +aaa aaa -aaf aaa -anT aaf aaf aaf @@ -125887,7 +123855,7 @@ aaa aaa bii aaa -aeC +aeE afD afD afD @@ -125971,24 +123939,24 @@ nbv ovj jah jah -dQV +jah ovj mjJ -nZy +xQQ +mIf +oZK +uEU +vlO mjJ -xlJ -rDf -xVS -xVS rDf -xVS +mjJ mjJ mjJ aaa -aaf aaa -aqB aaa +aaa +aaf dbJ dbJ dbJ @@ -126144,7 +124112,7 @@ aaf aaf aai aaf -aeC +aeE afD afD afD @@ -126189,7 +124157,7 @@ bef aWw bhO bjC -blg +tuO bmV bpd bmV @@ -126230,22 +124198,22 @@ osW osW osW ctl -nYJ -fZG -nYJ -pCO -xHp mjJ -xVS -xHp +htz mjJ +kuN +gRW +rIW +htz +xHp mjJ -vLD -aaf +qOT +lMJ +aaa +aaa +aaa aaf aaf -anT -aaa dbK dbM dbM @@ -126401,7 +124369,7 @@ aaa aaa aag aaa -aeC +aeE afD afD afD @@ -126445,7 +124413,7 @@ bcF beg aWw bhR -bjD +wxT blh bmW bpe @@ -126456,10 +124424,10 @@ bxa bry bAy bAy -bDN +xYO bFD sJB -bIG +ttx bKt bLV bNM @@ -126489,20 +124457,20 @@ aaf lrF aaa aaa -nYJ -ybQ -wcC -jbz -jbz -lZW -xVS mjJ +htz +htz +sjV +iPi +lZW +htz +qOT +lMJ +lMJ +lMJ lMJ aaf aaa -aaf -anT -aaf dbL dbL dbL @@ -126659,17 +124627,17 @@ aaa aai aaa aeE -dUZ -dUZ -aho -aic -acQ -acQ -aln -pHj -amE -amE -aqp +afD +afD +afD +afD +afD +afD +afD +afD +afD +afD +aqo dnh dnh dnh @@ -126751,15 +124719,15 @@ aaa aaa aaa aaa -fOf +drM +aaa +aaa +aaa +aaa aaa aaa -lMJ -aaf aaf aaf -anT -aaa aaa aaf aaf @@ -126915,18 +124883,18 @@ aaa aaa aaf aaa -aaa -aaf -aaa -acP -aid -aiZ -ajX -alo -jWT -dnz -dnR -dht +aeE +afD +afD +afD +afD +afD +afD +afD +afD +afD +afD +aqo aLJ dnh dhB @@ -126965,7 +124933,7 @@ bmY bhT uvc bhT -bvm +bhT bxc bxc bAA @@ -127011,12 +124979,12 @@ aaa aaa aaa aaa +aaa +aaa +aaa fwb fwb aaf -aaa -aqB -aaf dbJ dbJ dbJ @@ -127172,20 +125140,20 @@ aaa aaa aaf aaf -aaf -aaf -aaa -acP -aie -aja -ajY -alp -xCu -anN +aeE +afD +afD +afD +afD +afD +afD +afD +afD +afD +afD +aqo dnS -doh dnS -wnQ dCi dnS dnS @@ -127270,9 +125238,9 @@ aaa aaa aaa aaa -aaf aaa -anT +aaa +aaa aaf dbK dbM @@ -127429,20 +125397,20 @@ aaa aaa aaa aaa -aaa -aaf -aaa -acP -kSY -kSY -kSY -acP -jWT -dnh -dnh -dnh -dnh -dnh +aeE +afD +afD +afD +afD +afD +afD +afD +afD +afD +afD +aqo +ewK +jAV dnh dnh dnh @@ -127501,7 +125469,7 @@ bXd apf bZE cba -ccK +sHi cef aiW czH @@ -127527,9 +125495,9 @@ aaa aaa aaa aaa -aaf aaa -anT +aaa +aaa aaf dbL dbL @@ -127686,20 +125654,20 @@ aaa aaa aaa aaa -aaa -aaf -aaa -aaa -aaa -aaa -aaf -dni +aho +afC +afC +aid +aiZ +acQ +acQ +dUZ qdQ amH -dnS -dnS -dnS -amU +amH +vgU +dnh +dnh dnh dqu doh @@ -127784,12 +125752,12 @@ aaa aaa aaa aaa -aaf aaa -anT aaa aaa aaf +aaa +aaf aaf aaa aaa @@ -127944,19 +125912,19 @@ aaa aaa aaa aaa -aaf -aaf -aaf -aaf -aaf -aaf -dnh +aav +aaa +acP +xpV +aln +amt +jWT ujJ -dnh -dnS -dnS +pLb +jza +pEJ alJ -dnS +ftx dnh dnh dnh @@ -128041,10 +126009,10 @@ aaa aaa aaa aaa -aaf aaa -anT -anT +aaa +aaa +aaf anT anT anT @@ -128200,21 +126168,21 @@ aaa aaa aaa aaa +aav +aav aaa -aaa -aaa -aaa -aaf -aaa -aaf -aaa +acP +ajX +alo +hWV +pHj xmR -dnh +tUH +dnS +doh +dnS dnS dnS -amt -amW -apd avt awJ axS @@ -128297,13 +126265,13 @@ aaa aaa aaa aaa -aaf -aaf aaa -anT aaa aaa aaf +aaf +aaa +aaf aaa aaa anT @@ -128458,19 +126426,19 @@ aaa aaa aaa aaa +aav aaa -aaa -aaa -aaf -aaf -aaf -aaf -xmR -dni +acP +acQ +dnh +anN +eWJ +jgD dnS dnS dnS dnS +wgj dnh axO axY @@ -128555,12 +126523,12 @@ aaa aaa aaa aaa -aaf aaa -anT aaa aaa aaf +aaa +aaf aaf aaa aqB @@ -128717,17 +126685,17 @@ aaa aaa aaa aaa -aaa -aaf -aaa -aaf -aaa -aLw -dnh -dnS -dnS +aie +aie +alp +aqp +wnQ +mjz dnS dnS +uQU +efV +fOX dBu avu axY @@ -128787,7 +126755,7 @@ bYw bYw cbe ccO -iRA +bza aaf gJs chO @@ -128811,11 +126779,11 @@ aaf aaf lMJ lMJ +lMJ +lMJ +lMJ aaf aaf -aaa -aaa -aaa jdU aaa aaa @@ -128974,11 +126942,11 @@ aaa aaa aaa aaa -aaa -aaf -ajb -ajb -ajb +aie +aie +dqT +dht +xCu qHy ajb ajb @@ -129067,17 +127035,17 @@ aaf aaf aaa aaa -aaa -aaa +fwb +fwb +fwb +fwb +fwb aaf aaa aaa aaa aaa aaa -aaa -aaa -aaa aaf aaa aaf @@ -129301,7 +127269,7 @@ bYy bZH cbg ccQ -iRA +bza aaf bAR bAR @@ -129326,10 +127294,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -129583,11 +127551,11 @@ aaa aaa aaa aaa -aaf -aaf aaa aaa aaa +aaf +aaf aaa aaa aaa @@ -129793,7 +127761,7 @@ bpm bhT bhT bvm -bxg +ojf bza bza bza @@ -129815,7 +127783,7 @@ bIS bZI cbi ccS -iRA +bza aaf gJs chR @@ -129840,10 +127808,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -130097,10 +128065,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -130354,10 +128322,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -130611,10 +128579,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -130821,7 +128789,7 @@ brN btG bvq bxm -bxk +bvm bze bAN bCu @@ -130843,7 +128811,7 @@ bMj bZI cVJ ccQ -iRA +bza aaf gJs chU @@ -130868,10 +128836,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -131078,7 +129046,7 @@ brM kkA hmA bwl -bxl +wJg bzf bAO bCv @@ -131124,11 +129092,11 @@ aaa aaa aaa aaa -aaf -aaf aaa aaa aaa +aaf +aaf aaa aaa aaa @@ -131290,7 +129258,7 @@ aaf aaa aaa aaf -akd +aav alv xjf alv @@ -131304,7 +129272,7 @@ wba aAx iaM aAx -gqP +aBO aIe aOS deu @@ -131382,10 +129350,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -131638,6 +129606,9 @@ aaf aaf lMJ lMJ +lMJ +lMJ +lMJ aaf aaf aaa @@ -131720,9 +129691,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (174,1,1) = {" aaa @@ -131804,7 +129772,7 @@ aaf aaa aaa aaf -akd +aav alv lvY fIU @@ -131853,19 +129821,19 @@ bxc bxc bxc bCy -iRA +bza bFX -iRA -kAX -iRA +bza +bJa +bza bFX dhk bJa -iRA +bza bFX bza -kAX -iRA +bJa +bza bFX bxc bxc @@ -131896,10 +129864,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -132063,14 +130031,14 @@ aaa aaf aaa aaa -akd +aav alv apm apm apm kym dnh -vKH +dtE uky krL aaf @@ -132153,10 +130121,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -132410,11 +130378,11 @@ aaa aaa aaa aaa -aaf -aaf aaa aaa aaa +aaf +aaf aaa aaa aaa @@ -132641,12 +130609,12 @@ bXr bAR aaf aMr -ccY +apc bBb aaf aaa aaf -bxc +atm cjo ckM cmf @@ -132667,10 +130635,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -132898,15 +130866,15 @@ bUJ bAR aaf aMq -ccY +apc bgo aTQ cgD chW cjl ckK -bCC -bCC +vox +vox ckM aaf bKK @@ -132924,10 +130892,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -133155,15 +131123,15 @@ bXs bAR aaf aMr -ccY -ccY -ccY -ccY -ccY +apc +apc +apc +apc +apc cjm -bCC +vox cme -bCC +vox cjo aaa bKK @@ -133181,10 +131149,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -133412,16 +131380,16 @@ bAR bAR aaf aMq -ccY +apc aVk aNC cgE chX cjn ckL -bCC -bCC -bxc +vox +vox +atm aaf aai aaa @@ -133438,10 +131406,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -133695,10 +131663,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -133951,11 +131919,11 @@ aaa aaa aaa aaa -aaf -aaf aaa aaa aaa +aaf +aaf aaa aaa aaa @@ -134209,10 +132177,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -134466,10 +132434,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -134723,10 +132691,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -134980,10 +132948,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -135237,11 +133205,11 @@ aaa aaa aaa aaa -aaf -aaf aaa aaa aaa +aaf +aaf aaa aaa aaa @@ -135494,10 +133462,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -135751,10 +133719,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -136008,10 +133976,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -136265,10 +134233,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -136521,11 +134489,11 @@ aaa aaa aaa aaa -aaf -aaf aaa aaa aaa +aaf +aaf aaa aaa aaa @@ -136779,10 +134747,10 @@ aaa aaa aaa aaa -aaf aaa aaa aaa +aaf aaa aaa aaa @@ -137035,12 +135003,12 @@ aaa aaa aaa aaa -aaf -aaf -aaf aaa aaa aaa +aaf +aaf +aaf aaa aaa aaa @@ -137291,6 +135259,9 @@ aaa aaa aaa aaa +aaa +aaa +aaa aaf aaf aaf @@ -137374,9 +135345,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (196,1,1) = {" aaa @@ -137547,6 +135515,9 @@ aaa aaa aaa aaa +aaa +aaa +aaa aaf aaf czK @@ -137631,9 +135602,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (197,1,1) = {" aaa @@ -137803,6 +135771,9 @@ aaa aaa aaa aaa +aaa +aaa +aaa aaf aaf cBM @@ -137888,9 +135859,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (198,1,1) = {" aaa @@ -138059,6 +136027,9 @@ aaa aaa aaa aaa +aaa +aaa +aaa aaf aaf czK @@ -138145,9 +136116,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (199,1,1) = {" aaa @@ -138316,6 +136284,9 @@ aaa aaa aaa aaa +aaa +aaa +aaa aaf czJ czJ @@ -138402,9 +136373,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (200,1,1) = {" aaa @@ -138571,6 +136539,9 @@ aaa aaa aaa aaa +aaa +aaa +aaa aaf aaf aaf @@ -138659,9 +136630,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (201,1,1) = {" aaa @@ -138830,6 +136798,9 @@ aaa aaa aaa aaa +aaa +aaa +aaa aaf czJ czJ @@ -138916,9 +136887,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (202,1,1) = {" aaa @@ -139035,7 +137003,7 @@ anT aaa anT anT -beq +aRy bge bik tWv @@ -139043,7 +137011,7 @@ vUC bnq bpD brQ -blx +beq anT anT anT @@ -139087,6 +137055,9 @@ aaa aaa aaa aaa +aaa +aaa +aaa aaf aaf czK @@ -139173,9 +137144,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (203,1,1) = {" aaa @@ -139292,11 +137260,11 @@ anT anT anT aaa -aSD +aRy bgf qCU -aOX -bly +gzS +gzS bnr bpE brR @@ -139345,6 +137313,9 @@ aaa aaa aaa aaa +aaa +aaa +aaa aaf aaf cBM @@ -139430,9 +137401,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (204,1,1) = {" aaa @@ -139552,8 +137520,8 @@ aSD bes bgg bil -bjO -bjO +bil +bil bns bpF brS @@ -139577,6 +137545,9 @@ anT anT anT anT +anT +anT +aaa aaa aaa aaa @@ -139687,9 +137658,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (205,1,1) = {" aaa @@ -139827,6 +137795,8 @@ aNw aNw aNw aNw +aNw +aNw bJl aNw aNw @@ -139861,6 +137831,7 @@ aaa aaa aaa aaa +aaa aaf aaf aaf @@ -139944,9 +137915,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (206,1,1) = {" aaa @@ -140086,6 +138054,8 @@ bMt bMt bMt bMt +bMt +bMt aOT aOT bUK @@ -140119,6 +138089,7 @@ aaa aaa aaa aaa +aaa aaf aaf aaf @@ -140201,9 +138172,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (207,1,1) = {" aaa @@ -140344,6 +138312,8 @@ aOY aOY aOY aOY +aOY +aOY bcQ aNy bgn @@ -140377,10 +138347,8 @@ aaa aaa aaa aaa -aaf -aaa -aaa aaa +aaf aaa aaa aaa @@ -140601,6 +138569,8 @@ aaa aaa aaa aaa +aaa +aaa aMq aNy bgn @@ -140634,10 +138604,8 @@ aaa aaa aaa aaa -aaf -aaa -aaa aaa +aaf aaa aaa aaa @@ -140855,6 +138823,8 @@ aRy aRy bvt bvt +bvt +bvt aaa aaa aaa @@ -140973,8 +138943,6 @@ aaa aaa aaa aaa -aaa -aaa "} (210,1,1) = {" aaa @@ -141113,6 +139081,8 @@ aRy aRy aRy aRy +aRy +aRy aaa aaa aMq @@ -141230,8 +139200,6 @@ aaa aaa aaa aaa -aaa -aaa "} (211,1,1) = {" aaa @@ -141367,6 +139335,8 @@ bGd bGd bJm bNX +bGd +yih bMo bOc aRy @@ -141487,8 +139457,6 @@ aaa aaa aaa aaa -aaa -aaa "} (212,1,1) = {" aaa @@ -141620,11 +139588,13 @@ bzo bAV bCD bEh -bGe +bGd bGd bKL bNY bGd +esP +bGd ceC aRy bvt @@ -141744,8 +139714,6 @@ aaa aaa aaa aaa -aaa -aaa "} (213,1,1) = {" aaa @@ -141882,6 +139850,8 @@ bHD bGd bGd bGd +slE +bGd bUL aRy bvt @@ -142001,8 +139971,6 @@ aaa aaa aaa aaa -aaa -aaa "} (214,1,1) = {" aaa @@ -142138,6 +140106,8 @@ lWY bHE bKM bKO +bGd +bGd bMp bNZ aRz @@ -142258,8 +140228,6 @@ aaa aaa aaa aaa -aaa -aaa "} (215,1,1) = {" aaa @@ -142395,6 +140363,8 @@ bCE bHF bJk bJk +kNS +eId bMq cgy aRy @@ -142515,8 +140485,6 @@ aaa aaa aaa aaa -aaa -aaa "} (216,1,1) = {" aaa @@ -142648,10 +140616,12 @@ bzs bJi bCD bEj -bGe +bGd bGd bKP bOb +bGd +fEL bMr cho aRy @@ -142772,8 +140742,6 @@ aaa aaa aaa aaa -aaa -aaa "} (217,1,1) = {" aaa @@ -142909,6 +140877,8 @@ bGd bGd bKN bOa +bGd +utH bMs chn aRy @@ -143029,8 +140999,6 @@ aaa aaa aaa aaa -aaa -aaa "} (218,1,1) = {" aaa @@ -143169,6 +141137,8 @@ aRy aRy aRy aRy +aRy +aRy aaa aaa aMq @@ -143286,8 +141256,6 @@ aaa aaa aaa aaa -aaa -aaa "} (219,1,1) = {" aaa @@ -143425,6 +141393,8 @@ aRy aRy bvt bvt +bvt +bvt aaa aaa aaa @@ -143543,8 +141513,6 @@ aaa aaa aaa aaa -aaa -aaa "} (220,1,1) = {" aaa @@ -143685,6 +141653,8 @@ aaa aaa aaa aaa +aaa +aaa aMq bez bgn @@ -143800,8 +141770,6 @@ aaa aaa aaa aaa -aaa -aaa "} (221,1,1) = {" aaa @@ -143942,6 +141910,8 @@ aNw aNw aNw aNw +aNw +aNw bly bez bgn @@ -144057,8 +142027,6 @@ aaa aaa aaa aaa -aaa -aaa "} (222,1,1) = {" aaa @@ -144200,6 +142168,8 @@ bMt bMt bMt bMt +bMt +bMt bUM bBb anT @@ -144314,8 +142284,6 @@ aaa aaa aaa aaa -aaa -aaa "} (223,1,1) = {" aaa @@ -144457,6 +142425,8 @@ aOY aOY aOY aOY +aOY +aOY aNC aaa anT @@ -144571,8 +142541,6 @@ aaa aaa aaa aaa -aaa -aaa "} (224,1,1) = {" aaa @@ -144717,8 +142685,8 @@ anT anT anT anT -aaa -aaa +anT +anT aaa aaa aaa diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 6bd62910b28d3..0de8faeb87419 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -65,20 +65,12 @@ "ak" = ( /turf/closed/mineral/random/volcanic, /area/lavaland/surface/outdoors/unexplored/danger) -"al" = ( -/turf/closed/mineral/random/high_chance/volcanic, -/area/lavaland/surface/outdoors/unexplored/danger) "am" = ( /turf/closed/mineral/random/volcanic, /area/lavaland/surface/outdoors/unexplored) "an" = ( /turf/closed/mineral/random/labormineral/volcanic, /area/lavaland/surface/outdoors) -"ao" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/lavaland/surface/outdoors) "ap" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -122,24 +114,6 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) -"at" = ( -/obj/machinery/power/apc{ - dir = 4; - name = "Labor Camp Security APC"; - pixel_x = 24 - }, -/obj/machinery/camera{ - c_tag = "Labor Camp Monitoring"; - network = list("labor") - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/mine/laborcamp/security) "au" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -210,11 +184,6 @@ "aH" = ( /turf/closed/wall, /area/lavaland/surface/outdoors) -"aK" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/mine/laborcamp) "aM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/tile/brown{ @@ -237,14 +206,6 @@ /obj/structure/table, /turf/open/floor/plasteel/white, /area/mine/laborcamp) -"aQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/mine/living_quarters) "aU" = ( /obj/machinery/vending/snack/random, /turf/open/floor/plasteel, @@ -261,6 +222,13 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"aX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plating, +/area/mine/science) "aY" = ( /obj/structure/table, /obj/item/storage/firstaid/regular, @@ -629,6 +597,13 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp) +"cF" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "cG" = ( /obj/machinery/flasher{ id = "labor" @@ -839,7 +814,7 @@ roundstart_template = /datum/map_template/shuttle/science; width = 9 }, -/turf/open/floor/plating, +/turf/open/floor/plating/lavaland, /area/lavaland/surface/outdoors) "dv" = ( /obj/machinery/atmospherics/pipe/layer_manifold{ @@ -879,13 +854,8 @@ "dz" = ( /turf/closed/wall, /area/mine/eva) -"dA" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/mine/eva) "dB" = ( -/obj/machinery/computer/shuttle/labor/one_way{ +/obj/machinery/computer/shuttle_flight/labor/one_way{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -901,11 +871,6 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp) -"dE" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/mine/living_quarters) "dF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -1003,7 +968,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/computer/shuttle/science, +/obj/machinery/computer/shuttle_flight/science, /turf/open/floor/plasteel, /area/mine/science) "ea" = ( @@ -1163,13 +1128,14 @@ /turf/open/floor/plasteel, /area/mine/laborcamp) "ex" = ( -/obj/machinery/computer{ - dir = 8 - }, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light{ dir = 4 }, +/obj/structure/frame/computer{ + anchored = 1; + dir = 8 + }, /turf/open/floor/plasteel, /area/mine/science) "ez" = ( @@ -1259,7 +1225,7 @@ /obj/machinery/airalarm{ pixel_y = 23 }, -/obj/machinery/computer/shuttle/mining{ +/obj/machinery/computer/shuttle_flight/mining{ req_access = null }, /obj/effect/turf_decal/tile/purple{ @@ -1270,11 +1236,6 @@ }, /turf/open/floor/plasteel, /area/mine/production) -"eP" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/mine/production) "eQ" = ( /obj/structure/closet/crate, /obj/item/dice/d4, @@ -1306,16 +1267,10 @@ /turf/open/floor/plasteel, /area/mine/science) "eV" = ( -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel, -/area/mine/science) -"eW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/computer, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/mine/science) "eX" = ( -/obj/machinery/computer, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/small{ dir = 1 @@ -1371,6 +1326,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, +/mob/living/simple_animal/bot/atmosbot{ + name = "Officer Fastmosky" + }, /turf/open/floor/plasteel, /area/mine/eva) "fi" = ( @@ -1463,11 +1421,6 @@ "fy" = ( /turf/closed/wall/r_wall, /area/mine/laborcamp/security) -"fA" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/mine/laborcamp/security) "fB" = ( /obj/structure/frame/machine, /obj/effect/decal/cleanable/dirt/dust, @@ -1540,9 +1493,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine, /area/mine/science) -"fQ" = ( -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/unexplored/danger) "fR" = ( /turf/closed/mineral/random/high_chance/volcanic, /area/lavaland/surface/outdoors/unexplored) @@ -1558,12 +1508,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"fU" = ( -/obj/structure/sign/warning/docking, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/mine/production) "fV" = ( /turf/closed/indestructible/riveted/boss/see_through, /area/lavaland/surface/outdoors) @@ -1578,14 +1522,6 @@ }, /turf/closed/wall, /area/mine/production) -"fY" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/mine/production) "fZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -1879,6 +1815,28 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) +"hK" = ( +/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 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/mine/production) +"hU" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "ib" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -1999,7 +1957,7 @@ /area/lavaland/surface/outdoors) "iL" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/machinery/light, /obj/effect/turf_decal/tile/brown, @@ -2111,11 +2069,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"jo" = ( -/obj/machinery/door/firedoor/window, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/mine/living_quarters) "jq" = ( /obj/structure/stone_tile, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, @@ -2207,28 +2160,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"jV" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/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 = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/mine/eva) "jX" = ( /obj/structure/closet/crate/science, /obj/machinery/camera{ @@ -2253,15 +2184,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) -"kf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "kg" = ( /obj/structure/fluff/drake_statue, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, @@ -2564,7 +2486,8 @@ /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) "lA" = ( -/obj/machinery/computer{ +/obj/structure/frame/computer{ + anchored = 1; dir = 1 }, /turf/open/floor/plasteel, @@ -2633,6 +2556,19 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"lJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "lP" = ( /obj/structure/stone_tile/block/cracked{ dir = 4 @@ -3151,6 +3087,13 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"nw" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/mine/production) "nH" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -3161,6 +3104,24 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"nI" = ( +/obj/machinery/camera{ + c_tag = "Labor Camp Monitoring"; + network = list("labor") + }, +/obj/machinery/power/apc{ + dir = 1; + name = "Labor Camp Security APC"; + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "nZ" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -3182,7 +3143,7 @@ /obj/structure/barricade/wooden/crude, /obj/machinery/door/airlock/research{ name = "Robotics Lab"; - req_access_txt = "29" + req_access_txt = "47,54,29" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 8 @@ -3203,29 +3164,20 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/production) -"or" = ( +"ou" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Processing Area"; + req_access_txt = "48" + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, -/area/mine/living_quarters) -"ot" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/mine/science) +/area/mine/production) "ov" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 8 @@ -3315,13 +3267,16 @@ dir = 8 }, /obj/structure/barricade/wooden/crude, -/obj/machinery/door/airlock/research{ - name = "Testing Lab"; - req_access_txt = "47" - }, /obj/effect/decal/cleanable/oil/slippery, +/obj/machinery/door/airlock/research/glass{ + name = "Research Division Atrium"; + req_one_access_txt = "47,54" + }, /turf/open/floor/plasteel, /area/mine/science) +"ph" = ( +/turf/open/genturf, +/area/lavaland/surface/outdoors/unexplored/danger) "pi" = ( /obj/structure/fans/tiny, /obj/machinery/door/airlock/mining/glass{ @@ -3400,6 +3355,13 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"qf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plating, +/area/mine/living_quarters) "qj" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -3651,6 +3613,23 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/mine/living_quarters) +"sL" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/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 = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/mine/eva) "sW" = ( /obj/machinery/light, /obj/effect/turf_decal/tile/purple, @@ -3666,6 +3645,13 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"td" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/mine/production) "tf" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -3747,16 +3733,6 @@ }, /turf/open/floor/plasteel, /area/mine/production) -"tY" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "up" = ( /obj/item/radio/intercom{ dir = 8; @@ -3809,6 +3785,19 @@ }, /turf/open/floor/plasteel, /area/mine/science) +"uW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "va" = ( /obj/structure/table, /obj/item/wormhole_jaunter{ @@ -3912,26 +3901,17 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/mine/production) +"vU" = ( +/obj/structure/sign/warning/docking, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/mine/production) "vY" = ( /obj/effect/turf_decal/loading_area{ dir = 4 }, /turf/open/floor/plasteel, /area/mine/production) -"vZ" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 30 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/mine/production) "wz" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -4040,6 +4020,20 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/carpet/black, /area/mine/science) +"yW" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/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/door/firedoor, +/turf/open/floor/plasteel, +/area/mine/eva) "yX" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/structure/cable/yellow{ @@ -4056,12 +4050,16 @@ /turf/open/floor/plasteel, /area/mine/laborcamp/security) "zl" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/purple{ dir = 1 }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"zr" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/lavaland/surface/outdoors) "zu" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -4074,10 +4072,11 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/computer{ +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/frame/computer{ + anchored = 1; dir = 8 }, -/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/mine/science) "zD" = ( @@ -4156,7 +4155,7 @@ "AC" = ( /obj/structure/table/reinforced, /obj/item/bodypart/head/robot, -/obj/item/flashbulb/strong{ +/obj/item/flashbulb/recharging/revolution{ pixel_x = -5; pixel_y = 8 }, @@ -4187,15 +4186,10 @@ }, /turf/open/floor/plasteel, /area/mine/science) -"AL" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) +"AP" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/mine/eva) "AS" = ( /obj/machinery/rnd/experimentor, /obj/effect/decal/cleanable/dirt/dust, @@ -4219,6 +4213,15 @@ "Be" = ( /turf/open/floor/carpet/black, /area/mine/science) +"Bf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/mine/production) "Bl" = ( /obj/machinery/mech_bay_recharge_port, /obj/structure/cable, @@ -4287,28 +4290,6 @@ }, /turf/open/floor/plasteel, /area/mine/science) -"Cb" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Station Bridge"; - req_access_txt = "48" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "Cd" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -4385,25 +4366,27 @@ }, /turf/open/floor/plating, /area/mine/production) -"CL" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 +"CO" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Station Bridge"; + req_access_txt = "48" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, -/area/mine/living_quarters) +/area/mine/production) "CY" = ( /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 1 }, @@ -4415,6 +4398,14 @@ "CZ" = ( /turf/closed/wall/r_wall, /area/lavaland/surface/outdoors/unexplored) +"Dc" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Processing Area"; + req_access_txt = "48" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/mine/production) "Dd" = ( /obj/structure/bed, /obj/item/bedsheet/brown, @@ -4429,19 +4420,6 @@ }, /turf/open/floor/plasteel, /area/mine/production) -"Dv" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "Dy" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/item/storage/toolbox/electrical{ @@ -4451,11 +4429,12 @@ /turf/open/floor/plasteel, /area/mine/science) "DI" = ( -/obj/machinery/computer{ - dir = 1 - }, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light, +/obj/structure/frame/computer{ + anchored = 1; + dir = 1 + }, /turf/open/floor/carpet/royalblue, /area/mine/science) "DK" = ( @@ -4495,6 +4474,10 @@ }, /turf/open/floor/plasteel, /area/mine/eva) +"DP" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "Ee" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 @@ -4508,7 +4491,7 @@ "Ef" = ( /obj/machinery/door/airlock/research/glass{ name = "Research Division Atrium"; - req_access_txt = "47" + req_one_access_txt = "47,54" }, /obj/structure/barricade/wooden/crude, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -4553,6 +4536,7 @@ name = "Break Room" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/mine/living_quarters) "Ex" = ( @@ -4586,21 +4570,13 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) -"EG" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/turf/open/floor/plating, -/area/mine/eva) "EH" = ( /obj/machinery/airalarm{ dir = 1; pixel_y = -22 }, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ @@ -4608,6 +4584,13 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"EP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/open/floor/plating, +/area/mine/eva) "EZ" = ( /obj/structure/toilet{ dir = 8 @@ -4625,11 +4608,8 @@ /area/mine/living_quarters) "Fe" = ( /obj/structure/table/wood/bar, -/obj/item/storage/box/donkpockets{ - pixel_x = -2; - pixel_y = 5 - }, /obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/lootdrop/donkpockets, /turf/open/floor/carpet/black, /area/mine/science) "Fi" = ( @@ -4696,14 +4676,6 @@ }, /turf/open/floor/plasteel, /area/mine/eva) -"Gh" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/turf/open/floor/plating, -/area/mine/science) "Gs" = ( /obj/machinery/atmospherics/components/unary/tank/air{ dir = 8 @@ -4748,29 +4720,25 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) -"GP" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Station Bridge"; - req_access_txt = "48" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +"GN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/mine/production) "GS" = ( /obj/structure/chair/sofa/right, /turf/open/floor/plasteel, /area/mine/science) +"GU" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "GX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 1 @@ -4815,7 +4783,7 @@ /turf/open/floor/plasteel, /area/mine/eva) "HA" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -4875,14 +4843,6 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"Im" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, -/turf/open/floor/plating, -/area/mine/science) "In" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -4941,6 +4901,17 @@ /obj/machinery/light, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/mine/science) +"IT" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/mine/production) "IU" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -5008,14 +4979,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/carpet/black, /area/mine/science) -"Jx" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/mine/production) "JA" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/greenglow/filled, @@ -5036,27 +4999,6 @@ }, /turf/open/floor/plasteel/white, /area/mine/living_quarters) -"JI" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Processing Area"; - req_access_txt = "48" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/mine/production) -"JJ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/plating, -/area/mine/production) "JM" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -5084,24 +5026,6 @@ }, /turf/open/floor/plating, /area/mine/science) -"Kn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "Kv" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -5156,11 +5080,6 @@ /area/mine/science) "KZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/airlock/security/glass{ - name = "Labor Camp Monitoring"; - req_access_txt = "2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ icon_state = "1-2" @@ -5168,6 +5087,10 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/door/airlock/vault{ + name = "Labor Camp Monitoring"; + req_access_txt = "2" + }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "La" = ( @@ -5276,7 +5199,7 @@ /area/mine/production) "LY" = ( /obj/structure/window/reinforced, -/obj/item/twohanded/required/kirbyplants/random{ +/obj/item/kirbyplants/random{ pixel_y = 4 }, /turf/open/floor/plasteel, @@ -5304,7 +5227,7 @@ /obj/structure/barricade/wooden/crude, /obj/machinery/door/airlock/medical/glass{ name = "Chemistry Lab"; - req_access_txt = "5; 33" + req_access_txt = "47,54,29" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 8 @@ -5339,7 +5262,7 @@ /turf/open/floor/engine, /area/mine/science) "MX" = ( -/obj/machinery/mineral/equipment_vendor, +/obj/machinery/vendor/mining, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -5400,11 +5323,16 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"NZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/mine/laborcamp) "Ov" = ( -/obj/machinery/computer{ +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/frame/computer{ + anchored = 1; dir = 1 }, -/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/carpet/royalblue, /area/mine/science) "Ox" = ( @@ -5432,8 +5360,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/structure/reagent_dispensers/watertank, /obj/machinery/light/small{ - brightness = 3; - dir = 8 + dir = 4 }, /turf/open/floor/engine, /area/mine/science) @@ -5446,11 +5373,11 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/airlock/research{ - name = "Outpost Transport Dock"; - req_access_txt = "47" - }, /obj/effect/decal/cleanable/oil/slippery, +/obj/machinery/door/airlock/research/glass{ + name = "Research Division Atrium"; + req_one_access_txt = "47,54" + }, /turf/open/floor/plasteel, /area/mine/science) "Pd" = ( @@ -5484,11 +5411,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine, /area/mine/science) -"Pu" = ( -/obj/machinery/computer, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plasteel, -/area/mine/science) "Pv" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 1 @@ -5558,7 +5480,7 @@ /turf/open/floor/plasteel, /area/mine/production) "PV" = ( -/obj/machinery/mineral/equipment_vendor, +/obj/machinery/vendor/mining, /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -5798,6 +5720,23 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"SU" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Station Bridge"; + req_access_txt = "48" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "Te" = ( /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plasteel, @@ -5822,39 +5761,18 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 }, -/turf/open/floor/plasteel, -/area/mine/science) -"TA" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Processing Area"; - req_access_txt = "48" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 +/obj/item/bot_assembly/atmosbot{ + created_name = "Fastmosky Senior"; + name = "old atmosbot assembly" }, /turf/open/floor/plasteel, -/area/mine/production) -"TU" = ( +/area/mine/science) +"TN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, -/area/mine/production) +/area/mine/living_quarters) "TW" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -5887,6 +5805,10 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/mine/science) +"Ub" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/mine/living_quarters) "Ud" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -5906,7 +5828,7 @@ /turf/open/floor/plasteel, /area/mine/science) "Uh" = ( -/turf/open/floor/plating, +/turf/open/floor/plating/lavaland, /area/lavaland/surface/outdoors) "Un" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -5963,6 +5885,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/mine/production) +"UG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plating, +/area/mine/science) "UJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, @@ -5991,6 +5920,13 @@ }, /turf/open/floor/carpet/black, /area/mine/science) +"Vi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/mine/laborcamp) "Vq" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -6201,7 +6137,7 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "WI" = ( -/obj/machinery/mineral/equipment_vendor, +/obj/machinery/vendor/mining, /turf/open/floor/plasteel, /area/mine/living_quarters) "WK" = ( @@ -6214,9 +6150,7 @@ /turf/open/floor/plasteel, /area/mine/science) "WM" = ( -/obj/machinery/computer{ - dir = 8 - }, +/obj/machinery/vending/wardrobe/science_wardrobe, /turf/open/floor/carpet/black, /area/mine/science) "WN" = ( @@ -6342,7 +6276,7 @@ /area/mine/science) "Yz" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -6371,24 +6305,6 @@ }, /turf/open/floor/plasteel/dark, /area/mine/maintenance) -"YN" = ( -/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 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/mine/production) "YT" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -6401,7 +6317,7 @@ /area/mine/laborcamp/security) "YW" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -6424,11 +6340,6 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) -"Zf" = ( -/obj/machinery/door/firedoor/window, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/mine/science) "Zh" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ dir = 1 @@ -7820,16 +7731,16 @@ aj aj aj aj -al -al -al -aj -aj -aj -aj -aj -aj -aj +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -8076,22 +7987,22 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -8127,14 +8038,14 @@ aj aj aj aj -ak -ak -ak -ak -ak -ak -ak -al +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -8334,37 +8245,37 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -8383,21 +8294,21 @@ aj aj aj aj -ab -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ad +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj ab ab @@ -8591,37 +8502,37 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -8639,22 +8550,22 @@ aj aj aj aj -ab -ab -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj ab @@ -8848,71 +8759,71 @@ aj aj ab ab -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj ab ab @@ -9104,72 +9015,72 @@ aj aj aj ab -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -9361,72 +9272,72 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -9616,74 +9527,74 @@ aj aj aj aj -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -9875,73 +9786,73 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -10128,78 +10039,78 @@ aj aj aj aj -ak ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -ai +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -10386,77 +10297,77 @@ aj aj aj ab -al -al ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ai +ab +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -10644,76 +10555,76 @@ aj aj ab aj -al ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ai +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -10904,74 +10815,74 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -11161,75 +11072,75 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -11418,77 +11329,77 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -ai -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -11675,77 +11586,77 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -11832,9 +11743,9 @@ an an an an -ao -aK -aK +zr +NZ +NZ ba ba ba @@ -11850,11 +11761,11 @@ ap fy fy fy -fA +tf fy -dE -dE -dE +Ub +Ub +Ub cM ab ab @@ -11932,77 +11843,77 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -12089,7 +12000,7 @@ an an an an -ao +zr aP aP ba @@ -12189,78 +12100,78 @@ ab aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -12446,79 +12357,79 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -12618,7 +12529,7 @@ dH bw bw ee -at +nI ay OT aE @@ -12627,8 +12538,8 @@ dh bb ME cM -aQ -dE +qf +Ub cM ab ab @@ -12703,80 +12614,80 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -12960,80 +12871,80 @@ aj aj ab ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -13125,7 +13036,7 @@ ba bW cg ba -cl +Vi dp ba dI @@ -13217,81 +13128,81 @@ ab aj ab ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -13474,87 +13385,87 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj -ai -ab -ab +ph +ph +ph aj aj aj @@ -13654,9 +13565,9 @@ WA WA WA WA -CL -Kn -Dv +cF +uW +GU cM cM cM @@ -13731,88 +13642,88 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -ai -ai -am -ai -ab -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -13901,8 +13812,8 @@ de aG aG aG -aG -fA +aj +tf rU HP QV @@ -13988,88 +13899,88 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -am -ai -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -14158,11 +14069,11 @@ aG aG aG aG -aG -fA -fA -fA -fA +aj +tf +tf +tf +tf fy WA Cw @@ -14245,91 +14156,91 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj -ai +ph aj aj aj @@ -14502,93 +14413,93 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -ai -ai -ai -ab -ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -14759,93 +14670,93 @@ ab aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -am -ai -ab -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -15016,92 +14927,92 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -ad +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -15273,92 +15184,92 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -15530,93 +15441,93 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -15706,7 +15617,7 @@ aj aj aj ab -dE +Ub qj JG Pz @@ -15729,7 +15640,7 @@ aj aj aj aj -ot +YF Tn Tn Tn @@ -15787,95 +15698,95 @@ ab ab ab ab -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -ai -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -15963,7 +15874,7 @@ aj aj aj ab -dE +Ub ps lb zN @@ -15986,7 +15897,7 @@ aj aj aj aj -ot +YF Iq fH sw @@ -16044,97 +15955,97 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -ai -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -16227,7 +16138,7 @@ Pz dn Yt bb -tY +hU GK Qw Jc @@ -16236,14 +16147,14 @@ dn Jc GK dn -dE +Ub aj aj aj aj aj aj -ot +YF xt gh ec @@ -16301,99 +16212,99 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -ai -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -16484,7 +16395,7 @@ cM Eq Ur GH -kf +TN Un GH GH @@ -16493,14 +16404,14 @@ Cs HX ho Kv -dE +Ub aj aj aj aj aj aj -ot +YF Mn fi fN @@ -16558,104 +16469,104 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj -ai -ai -ai +ph +ph +ph aj aj aj @@ -16757,7 +16668,7 @@ ab ab aj aj -ot +YF Py Lm jy @@ -16815,105 +16726,105 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -ai -ai -am -am -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -17014,7 +16925,7 @@ ai ab ab ab -ot +YF Pt fI OX @@ -17071,105 +16982,105 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -am -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -17268,9 +17179,9 @@ ab aj Tn Tn -ot -ot -ot +YF +YF +YF Tn Tn Mz @@ -17328,106 +17239,106 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -17523,7 +17434,7 @@ cV cM aj aj -Zf +YF fZ VU fa @@ -17533,7 +17444,7 @@ fD fJ BT uH -Zf +YF aj aj aj @@ -17585,106 +17496,106 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -17780,7 +17691,7 @@ cW cM aj aj -Zf +YF er gg gi @@ -17790,7 +17701,7 @@ fr fK gi fF -Zf +YF aj aj aj @@ -17843,106 +17754,106 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -ai -ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -18023,9 +17934,9 @@ cM cM cM cM -AL -or -AL +DP +lJ +DP cM qV Zi @@ -18037,7 +17948,7 @@ qv cM aj aj -Zf +YF od gi IZ @@ -18047,7 +17958,7 @@ fs BT BT BT -Zf +YF aj aj aj @@ -18100,109 +18011,109 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -ai -ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj -ai +ph aj aj aj @@ -18279,7 +18190,7 @@ ab ab aj aj -dE +Ub bb Ll bb @@ -18294,7 +18205,7 @@ cM cM aj aj -Zf +YF ev Ua XZ @@ -18304,7 +18215,7 @@ fG fL eD Qt -Zf +YF aj aj aj @@ -18357,114 +18268,114 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ai -ab -ab -ab -ai -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj -ai -ai +ph +ph aj aj aj @@ -18536,15 +18447,15 @@ ab ab ab aj -dE +Ub bm TW qx cM -dE -dE -dE -dE +Ub +Ub +Ub +Ub cM ai ai @@ -18614,115 +18525,115 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -ai -ai -ai -am -am -am -ai -ai -am -am -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph ai aj aj @@ -18730,8 +18641,8 @@ aj aj aj aj -ai -ai +ph +ph aj aj aj @@ -18793,11 +18704,11 @@ ab ab ab aj -dE -dE -Cb -dE -dE +Ub +Ub +SU +Ub +Ub ab ab ab @@ -18818,8 +18729,8 @@ RM tG oI oZ -ot -ot +YF +YF aj aj aj @@ -18871,135 +18782,135 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -am -am -am -am -am -am -am -am -ai -ai -ai -ai -ai -ai -am -am -ai -ai +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj aj -ad -ab -ab -ab -ai +ph +ph +ph +ph +ph aj aj aj @@ -19007,28 +18918,28 @@ aj aj aj aj -ai -ai -ai -ai -ai -ai -ai +ph +ph +ph +ph +ph +ph +ph aj aj aj aj aj -ai -ai -ai -ai -ai -ai -ai -ab -ab -ai +ph +ph +ph +ph +ph +ph +ph +ph +am +am aj aj ai @@ -19051,9 +18962,9 @@ ab ab aj ab -dE +Ub EA -dE +Ub ab ab aj @@ -19063,8 +18974,8 @@ aj aj aj aj -Zf -Zf +YF +YF Tn Tn Tn @@ -19076,8 +18987,8 @@ Fe Yu qC vs -ot -ot +YF +YF aj aj aj @@ -19128,189 +19039,189 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -ai -ai -ai -am -ai -ai -ai -am -ai -ai -ai -ai -ai -ai -ai -am -am -am -am -am -am -am -ai -ai -ab -ab -ai -am -am -am -am -am -am -am -ai -ai -am -ai -ai -am -ai -ab -aj -aj -aj -aj -aj -ab -ab -ab -ab -ab -ab -ab -ab -ab -aj -aj -aj -dE +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am +am +ai +ai +ai +ai +ai +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +Ub Wd -dE +Ub ab aj aj @@ -19320,7 +19231,7 @@ aj aj aj aj -Zf +YF KN HF BT @@ -19334,7 +19245,7 @@ jY Io Wn Hn -ot +YF aj aj ab @@ -19385,199 +19296,199 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -ai -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -ab -aj -aj -aj -aj -aj -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aj -aj -aj -dE +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am +am +am +am +ai +ab +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +Ub Wd -dE +Ub aj aj -Zf -Zf -Zf -Zf -Zf +YF +YF +YF +YF +YF aj aj -Zf +YF Gb zw JO @@ -19591,8 +19502,8 @@ jY Fy Sw jr -ot -ot +YF +YF aj aj ab @@ -19642,199 +19553,199 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -ab -aj -aj -ab -ab -aj -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aj -aj -dE +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am +am +am +ai +ab +aj +aj +ab +ab +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +Ub Wd -jo -Zf -Zf -Zf +Ub +YF +YF +YF xy Wy Lw -Zf -Zf -Zf -Zf +YF +YF +YF +YF gi BT gi @@ -19849,7 +19760,7 @@ Ud si jr Ov -ot +YF aj aj aj @@ -19899,163 +19810,163 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -ak -ak -ak -ak -ak -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -20079,7 +19990,7 @@ ab ab aj aj -eP +vO IX FX GX @@ -20106,7 +20017,7 @@ Jh mT Mm DI -ot +YF aj aj aj @@ -20156,163 +20067,163 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -20336,19 +20247,19 @@ ab aj aj aj -eP +vO YX -eP -Zf -Zf -Zf +vO +YF +YF +YF Wp AI qL -Zf -Zf -Zf -Zf +YF +YF +YF +YF gi gi BT @@ -20363,7 +20274,7 @@ wz qa KI Ov -ot +YF aj aj aj @@ -20413,199 +20324,199 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -ai -aj -ab -aj -aj -aj -aj -aj -ab -ab -fU +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am +am +am +am +ai +aj +ab +aj +aj +aj +aj +aj +ab +ab +vU vM -eP +vO ab ab aj aj aj ab -eP +vO YX -eP +vO aj aj -Zf -Zf -Zf -Zf -Zf +YF +YF +YF +YF +YF aj aj -Zf +YF KR lH KY @@ -20619,8 +20530,8 @@ jY zR Sw KI -ot -ot +YF +YF aj aj aj @@ -20670,164 +20581,164 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am am am am @@ -20843,16 +20754,16 @@ aj ab fX xm -Jx +GN ab aj aj aj aj ab -eP +vO tp -eP +vO ab aj aj @@ -20862,7 +20773,7 @@ aj aj aj ab -Zf +YF vN Te gi @@ -20876,7 +20787,7 @@ Be xY Wn QB -ot +YF aj aj aj @@ -20927,164 +20838,164 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am am am am @@ -21097,20 +21008,20 @@ aj aj aj aj -eP -fY +vO +nw yu -JJ -eP +td +vO ab aj aj ab -eP -eP -GP -eP -eP +vO +vO +CO +vO +vO ab Il WE @@ -21132,8 +21043,8 @@ AC JA Be Qx -ot -ot +YF +YF aj aj aj @@ -21183,165 +21094,165 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am am am am @@ -21354,20 +21265,20 @@ aj aj aj OZ -eP +vO gc yL JM -eP +vO OZ OZ OZ OZ -eP +vO RO BM bo -eP +vO OZ jd Uh @@ -21388,8 +21299,8 @@ RM yU ZX WM -ot -ot +YF +YF aj aj aj @@ -21441,164 +21352,164 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am am am am @@ -21616,7 +21527,7 @@ gJ bt LO RO -YN +hK vd yL TZ @@ -21633,7 +21544,7 @@ Uh Uh Uh Uh -ot +YF BT BT BT @@ -21698,164 +21609,164 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am am am am @@ -21867,13 +21778,13 @@ aj aj aj ab -eP +vO eQ gY zu LX zu -TU +Bf ok Cj Cj @@ -21900,7 +21811,7 @@ WX BT gi va -ot +YF aj aj aj @@ -21955,164 +21866,164 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am am am am @@ -22124,13 +22035,13 @@ aj aj ab ab -eP +vO eZ ie zV Ms VD -vZ +IT zV bt bt @@ -22139,7 +22050,7 @@ BB NU De PT -eP +vO jd Uh Uh @@ -22157,7 +22068,7 @@ gu vF Nu CH -ot +YF aj aj aj @@ -22211,165 +22122,165 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am am am am @@ -22383,7 +22294,7 @@ dz dz dz fb -jV +sL fb dz Wj @@ -22396,7 +22307,7 @@ Ms bf zV Yz -eP +vO jd Uh Uh @@ -22414,7 +22325,7 @@ SM vG vJ wF -ot +YF aj aj aj @@ -22468,165 +22379,165 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am am am am @@ -22649,8 +22560,8 @@ OZ vO OZ bn -JI -TA +Dc +ou bn OZ OZ @@ -22661,7 +22572,7 @@ Uh Uh Uh Uh -Zf +YF gi el eF @@ -22725,175 +22636,175 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -am -am -ai -ab -ab -dA +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am +am +am +am +am +am +am +ai +ab +ab +AP dR eh fd @@ -22910,7 +22821,7 @@ yL bg bo bt -eP +vO jd Uh Uh @@ -22923,12 +22834,12 @@ Aj BZ eG Tn -Pu +BT Ee BT Lc Pg -ot +YF aj aj aj @@ -22982,175 +22893,175 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -am -am -am -am -am -ai -aj -aj -ab -dA +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am +am +am +am +am +am +ai +aj +aj +ab +AP dR eh fe @@ -23175,17 +23086,17 @@ Uh Uh Uh Uh -ot +YF BT fJ eH Tn -eW +IZ tN BT sz Pg -ot +YF aj aj aj @@ -23240,164 +23151,164 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am am am am @@ -23442,7 +23353,7 @@ At tx qR lA -ot +YF aj aj aj @@ -23497,164 +23408,164 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +am am am am @@ -23667,9 +23578,9 @@ ab dz dz dz -dA -jV -EG +AP +yW +EP dz ai OZ @@ -23689,11 +23600,11 @@ WY WY WY II -ot -ot +YF +YF em -ot -ot +YF +YF Tn Tn Tn @@ -23754,164 +23665,164 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -23947,9 +23858,9 @@ ab ab ab aj -ot +YF fJ -Zf +YF aj aj Tn @@ -24011,164 +23922,164 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -24204,16 +24115,16 @@ aj aj aj aj -ot +YF fJ -ot +YF aj aj -ot +YF Wk rP Rd -ot +YF aj aj aj @@ -24268,164 +24179,164 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -24438,9 +24349,9 @@ aj aj ab dz -dA +AP pi -dA +AP dz ai OZ @@ -24461,16 +24372,16 @@ aj aj aj aj -Im +aX lx -ot +YF aj aj -ot -ot -ot -ot -ot +YF +YF +YF +YF +YF aj aj aj @@ -24525,164 +24436,164 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -24717,11 +24628,11 @@ aj aj ab aj -ot -Gh +YF +UG ov -ot -ot +YF +YF ab aj aj @@ -24782,165 +24693,165 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -25039,164 +24950,164 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -25296,164 +25207,164 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -25488,11 +25399,11 @@ aj ab ab aj -ot -ot +YF +YF JX -ot -ot +YF +YF ab ab ab @@ -25553,164 +25464,164 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -25810,164 +25721,164 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -26067,164 +25978,164 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -26324,164 +26235,164 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -26581,164 +26492,164 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -26838,164 +26749,164 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -27095,164 +27006,164 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -27352,164 +27263,164 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -27609,165 +27520,165 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -27866,165 +27777,165 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -28123,166 +28034,166 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -28380,167 +28291,167 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -28637,167 +28548,167 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -28894,168 +28805,168 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -29151,168 +29062,168 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -29408,168 +29319,168 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -29665,169 +29576,169 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -29922,169 +29833,169 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -30179,169 +30090,169 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -30436,169 +30347,169 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -30693,169 +30604,169 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -30950,170 +30861,170 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -31207,170 +31118,170 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -31464,170 +31375,170 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -31721,170 +31632,170 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -31978,170 +31889,170 @@ ab aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -32235,170 +32146,170 @@ ab ab aj ab -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -32492,170 +32403,170 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -32749,170 +32660,170 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -33006,170 +32917,170 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -33263,170 +33174,170 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -33520,170 +33431,170 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -33777,170 +33688,170 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -34034,171 +33945,171 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -34291,171 +34202,171 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -34548,171 +34459,171 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -34805,171 +34716,171 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -35062,172 +34973,172 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -35318,173 +35229,173 @@ aj aj aj ab -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -35575,174 +35486,174 @@ aj aj aj ab -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -35833,174 +35744,174 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -36090,175 +36001,175 @@ aj aj ab ab -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -36347,176 +36258,176 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -36531,10 +36442,10 @@ am am am am -ak -ak -ak -ak +ph +ph +ph +ph am am am @@ -36604,178 +36515,178 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -36785,15 +36696,15 @@ am am am am -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -36861,197 +36772,197 @@ aj ab ab ab -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -37118,198 +37029,198 @@ aj aj mD ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -37375,199 +37286,199 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -37632,199 +37543,199 @@ aj aj ab jQ -ak -ak -ak -ak -al +ph +ph +ph +ph +ph iy ab ab mK -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -37889,199 +37800,199 @@ aj aj ab ab -ak -ak -ak -ak +ph +ph +ph +ph ab ab jx ab ab mM -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -38147,9 +38058,9 @@ aj jx jS iy -al -ak -al +ph +ph +ph jq ab kN @@ -38159,186 +38070,186 @@ jx ab ab mN -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -38417,185 +38328,185 @@ ab ab ab mO -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -38674,185 +38585,185 @@ ab jS ab ab -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -38933,183 +38844,183 @@ jq jR ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -39183,190 +39094,190 @@ ab ab ab mL -al +ph iY ab ab jQ ab jx -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -39440,190 +39351,190 @@ ab mI ab ab -al -al -ab -ab -ab -ab -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ab +ab +ab +ab +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -39698,189 +39609,189 @@ ab ab ab jR -ak +ph jS kN ab ab jR -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -39945,199 +39856,199 @@ aj aj ab ab -ak -al +ph +ph ja ab mH ab ab mJ -al -ak -ak -al +ph +ph +ph +ph ab ab mP -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -40202,199 +40113,199 @@ aj aj ab ja -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -40459,199 +40370,199 @@ aj aj kN ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -40716,199 +40627,199 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -40973,199 +40884,199 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -41183,7 +41094,7 @@ fS am am am -fS +am aj aj aj @@ -41230,199 +41141,199 @@ mC ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -41440,7 +41351,7 @@ am am am am -fS +am aj aj aj @@ -41487,199 +41398,199 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -41697,7 +41608,7 @@ am am am am -fS +am aj aj aj @@ -41744,199 +41655,199 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -42001,199 +41912,199 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -42258,199 +42169,199 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -42515,199 +42426,199 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -42772,199 +42683,199 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -43029,199 +42940,199 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -43286,199 +43197,199 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -43543,199 +43454,199 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -43799,200 +43710,200 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -44055,201 +43966,201 @@ aj aj aj ab -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -44312,201 +44223,201 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -44569,201 +44480,201 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -44828,199 +44739,199 @@ aj ab ab ab -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -45085,199 +44996,199 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -45342,199 +45253,199 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -45599,199 +45510,199 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -45856,199 +45767,199 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -46113,199 +46024,199 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -46370,200 +46281,200 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -46627,200 +46538,200 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -46884,201 +46795,201 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -47141,202 +47052,202 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -47398,203 +47309,203 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -47655,204 +47566,204 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -47912,206 +47823,206 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -48170,207 +48081,207 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -48426,209 +48337,209 @@ aj aj ab ab -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -48683,211 +48594,211 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph am am am @@ -48940,217 +48851,217 @@ ab aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -49197,217 +49108,217 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj ab @@ -49454,217 +49365,217 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -fQ -fQ +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph ab aj aj @@ -49711,217 +49622,217 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -fQ -fQ +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -49968,217 +49879,217 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -50225,217 +50136,217 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -50482,217 +50393,217 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -50739,217 +50650,217 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -50996,217 +50907,217 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -51253,217 +51164,217 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -51510,217 +51421,217 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -51767,217 +51678,217 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -52024,217 +51935,217 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -52280,218 +52191,218 @@ aj aj aj ab -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -52537,218 +52448,218 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -52794,218 +52705,218 @@ ab aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -53051,218 +52962,218 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -53308,218 +53219,218 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -53565,218 +53476,218 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -53823,217 +53734,217 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -54080,218 +53991,218 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -fQ +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -54337,219 +54248,219 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -fQ -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -54594,219 +54505,219 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -54851,219 +54762,219 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -55108,219 +55019,219 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -55365,219 +55276,219 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -55622,218 +55533,218 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -55879,218 +55790,218 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -56136,218 +56047,218 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -56393,218 +56304,218 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -56650,218 +56561,218 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -56907,218 +56818,218 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -57164,219 +57075,219 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -57421,219 +57332,219 @@ aj aj ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -57677,220 +57588,220 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -57934,220 +57845,220 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -58191,220 +58102,220 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -58448,220 +58359,220 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -58705,220 +58616,220 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -58962,220 +58873,220 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -59219,220 +59130,220 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -fQ +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -59476,218 +59387,218 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -59733,218 +59644,218 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -59990,218 +59901,218 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -60248,217 +60159,217 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -60505,217 +60416,217 @@ ab ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -60762,217 +60673,217 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -61019,217 +60930,217 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -61276,219 +61187,219 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -fQ +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -61533,219 +61444,219 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -61790,219 +61701,219 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -62047,219 +61958,219 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -62304,219 +62215,219 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -62561,219 +62472,219 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -62818,220 +62729,220 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -fQ +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -63075,220 +62986,220 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -fQ +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -63332,220 +63243,220 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -fQ +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -63589,219 +63500,219 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -63846,219 +63757,219 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -fQ +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -64103,219 +64014,219 @@ aj ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -fQ +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -64358,220 +64269,220 @@ aj aj ab ab -al -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -64613,222 +64524,222 @@ aj ab ab ab -al -al -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -64870,222 +64781,479 @@ aj aj aj ab -al -al +ph +ph +ab +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(229,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -fQ +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -65097,7 +65265,7 @@ aj aj aj "} -(229,1,1) = {" +(230,1,1) = {" aa aa aa @@ -65126,223 +65294,480 @@ aj aj aj aj +aj +aj ab ab ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(231,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -fQ -fQ +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -65354,7 +65779,7 @@ aj aj aj "} -(230,1,1) = {" +(232,1,1) = {" aa aa aa @@ -65366,6 +65791,7 @@ aa aa aa aa +it ab ab ab @@ -65376,7 +65802,230 @@ ab ab ab ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj aj aj aj @@ -65385,225 +66034,258 @@ aj aj aj aj +aj +"} +(233,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad ab ab ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -fQ -fQ -fQ -fQ +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj aj aj aj aj +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj +aj +aj aj aj aj @@ -65611,7 +66293,7 @@ aj aj aj "} -(231,1,1) = {" +(234,1,1) = {" aa aa aa @@ -65623,6 +66305,8 @@ aa aa aa aa +ad +ad ab ab ab @@ -65632,6 +66316,261 @@ ab ab ab ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(235,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +ad +ab +ab +ab +ab +ab ab ab aj @@ -65643,223 +66582,480 @@ aj aj aj aj +aj ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(236,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +ad ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -fQ -fQ +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +aj aj aj aj +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj +aj aj aj aj @@ -65868,7 +67064,7 @@ aj aj aj "} -(232,1,1) = {" +(237,1,1) = {" aa aa aa @@ -65880,240 +67076,754 @@ aa aa aa aa -it +gP +js +ab +ad +ad +ab ab ab ab ab ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(238,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab ab ab ab ab +aj +aj +aj +aj +aj +ab +aj +aj +aj +aj ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj +aj +aj +aj +aj +aj aj aj aj aj +"} +(239,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +aj aj aj aj +ab +ab aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -66125,7 +67835,12 @@ aj aj aj "} -(233,1,1) = {" +(240,1,1) = {" +aa +aa +aa +aa +aa aa aa aa @@ -66144,3574 +67859,228 @@ ab ab ab ab +aj +ab +aj +ab +ab ab ab ab ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(234,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ab -ab -ab -ab -ab -ab -ab -ab -ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(235,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(236,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aj -aj -aj -aj -aj -ab -aj -aj -aj -aj -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(237,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -gP -js -ab -ad -ad -ab -ab -ab -ab -ab -ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(238,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aj -aj -aj -aj -aj -ab -aj -aj -aj -aj -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(239,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ab -ab -ab -ab -ab -aj -aj -aj -aj -ab -ab -aj -aj -aj -ab -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(240,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ab -ab -ab -ab -ab -ab -aj -ab -aj -ab -ab -ab -ab -ab -ab -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(241,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ab -ab -ab -ab -ab -aj -aj -aj -aj -aj -ab -ab -ab -ab -ab -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(242,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aj -aj -aj -aj -aj -aj -aj -aj -ab -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(243,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aj -aj -aj -aj -aj -aj -aj -aj -ab -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(244,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aj -aj -aj -aj -aj -aj -aj -aj -ab -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(245,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aj -aj -aj -aj -aj -aj -aj -aj -ab -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(246,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aj -aj -aj -aj -aj -aj -aj -aj -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -69723,252 +68092,252 @@ aj aj aj "} -(247,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ab -ab -ab -ab -ab -ab -aj -aj -aj -aj -aj -aj -aj -aj -ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +(241,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -69980,7 +68349,7 @@ aj aj aj "} -(248,1,1) = {" +(242,1,1) = {" aa aa aa @@ -69997,8 +68366,8 @@ aa aa aa aa -ad -ad +ab +ab ab ab ab @@ -70013,219 +68382,219 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -70237,7 +68606,7 @@ aj aj aj "} -(249,1,1) = {" +(243,1,1) = {" aa aa aa @@ -70249,12 +68618,12 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +ab ab ab ab @@ -70270,219 +68639,476 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(244,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -70494,7 +69120,12 @@ aj aj aj "} -(250,1,1) = {" +(245,1,1) = {" +aa +aa +aa +aa +aa aa aa aa @@ -70506,11 +69137,6 @@ aa aa aa aa -ad -ad -ab -ab -ad ab ab ab @@ -70527,220 +69153,220 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj aj aj aj @@ -70751,7 +69377,10 @@ aj aj aj "} -(251,1,1) = {" +(246,1,1) = {" +aa +aa +aa aa aa aa @@ -70763,12 +69392,266 @@ aa aa aa aa +aa +aa +ab +ab ab ab ab ab ab +aj +aj +aj +aj +aj +aj +aj +aj ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(247,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad ab ab ab @@ -70784,221 +69667,478 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -al +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(248,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj aj aj aj +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj +aj aj aj aj @@ -71008,7 +70148,7 @@ aj aj aj "} -(252,1,1) = {" +(249,1,1) = {" aa aa aa @@ -71020,11 +70160,12 @@ aa aa aa aa -ab -ab -ab -ab -ab +ad +ad +ad +ad +ad +ad ab ab ab @@ -71039,221 +70180,220 @@ aj aj aj aj -aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aj -aj +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -71265,7 +70405,7 @@ aj aj aj "} -(253,1,1) = {" +(250,1,1) = {" aa aa aa @@ -71279,15 +70419,239 @@ aa aa ad ad +ab +ab ad -ad -js ab ab ab ab ab ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -71297,218 +70661,765 @@ aj aj aj aj +"} +(251,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(252,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +"} +(253,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +ad +js +ab +ab +ab +ab +ab +ab +aj +aj +aj +aj +aj +aj +aj +aj +aj +ab +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -71555,216 +71466,216 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj @@ -71812,215 +71723,215 @@ aj aj aj ab -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph +ph aj aj aj diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 4541e48490414..b3e5b9b293463 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -143,9 +143,6 @@ /turf/open/floor/plasteel/white, /area/medical/virology) "aal" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/green{ dir = 1 }, @@ -169,18 +166,20 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/virology) "aao" = ( /obj/structure/sign/warning/deathsposal, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, /turf/closed/wall/r_wall, /area/medical/virology) "aap" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, /obj/machinery/door/airlock/virology/glass{ id_tag = "Viro2"; name = "Virology Lab 2"; @@ -190,10 +189,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/virology) "aaq" = ( @@ -206,10 +202,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/medical/virology) "aar" = ( @@ -251,6 +244,7 @@ name = "isolation shutters" }, /obj/item/extrapolator, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel/white, /area/medical/virology) "aaw" = ( @@ -298,7 +292,7 @@ }, /obj/effect/landmark/start/virologist, /obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 8 + dir = 1 }, /turf/open/floor/plasteel/white, /area/medical/virology) @@ -427,17 +421,16 @@ dir = 4 }, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel/white, /area/medical/virology) "aaK" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, /turf/open/floor/plasteel/white, /area/medical/virology) "aaL" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, @@ -479,6 +472,9 @@ id = "viroshutters2"; name = "isolation shutters" }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, /turf/open/floor/plasteel/white, /area/medical/virology) "aaX" = ( @@ -675,12 +671,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/ai_monitored/turret_protected/ai) "acq" = ( @@ -719,12 +710,7 @@ name = "AI Core"; req_access_txt = "65" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/ai_monitored/turret_protected/ai) "acu" = ( @@ -807,12 +793,7 @@ /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) "acB" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) "acC" = ( @@ -868,12 +849,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/ai_monitored/turret_protected/ai) "acK" = ( @@ -892,12 +868,7 @@ /turf/open/floor/plasteel/white, /area/ai_monitored/turret_protected/ai) "acM" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/ai_monitored/turret_protected/ai) "acN" = ( @@ -981,10 +952,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) "adc" = ( @@ -1026,7 +994,7 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAS) "adg" = ( -/obj/machinery/mecha_part_fabricator, +/obj/machinery/modular_fabricator/exosuit_fab, /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAS) "adh" = ( @@ -1279,10 +1247,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "adN" = ( @@ -1443,7 +1408,6 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/prison) "aeo" = ( @@ -1490,7 +1454,7 @@ /area/security/prison) "aes" = ( /obj/structure/easel, -/obj/item/canvas/nineteenXnineteen, +/obj/item/canvas/nineteen_nineteen, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -1662,10 +1626,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "aeP" = ( @@ -1798,7 +1759,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "afe" = ( -/obj/item/twohanded/required/kirbyplants/photosynthetic{ +/obj/item/kirbyplants/photosynthetic{ pixel_y = 10 }, /obj/effect/turf_decal/tile/blue{ @@ -1828,7 +1789,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "afg" = ( -/obj/item/twohanded/required/kirbyplants/photosynthetic{ +/obj/item/kirbyplants/photosynthetic{ pixel_y = 10 }, /obj/machinery/camera/motion{ @@ -2163,7 +2124,6 @@ /area/security/execution/transfer) "afX" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plasteel/dark, /area/security/execution/transfer) "afZ" = ( @@ -2249,6 +2209,11 @@ }, /turf/open/floor/plasteel/dark, /area/security/execution/transfer) +"agn" = ( +/obj/machinery/power/generator, +/obj/structure/cable, +/turf/open/floor/engine, +/area/engine/engineering) "ago" = ( /obj/machinery/door/window/westleft{ base_state = "right"; @@ -2307,12 +2272,7 @@ name = "Solutions Room"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/execution/transfer) "agx" = ( @@ -2389,9 +2349,6 @@ /turf/open/floor/plasteel/freezer, /area/security/prison) "agD" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, /obj/structure/sign/warning/vacuum/external{ pixel_x = -32 }, @@ -2561,7 +2518,6 @@ name = "blast door" }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/execution/transfer) "agV" = ( @@ -2575,10 +2531,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/execution/transfer) "agW" = ( @@ -3085,12 +3038,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/execution/transfer) "ahZ" = ( @@ -3423,10 +3371,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/main) "aiQ" = ( @@ -3440,10 +3385,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/main) "aiR" = ( @@ -3531,10 +3473,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/prison) "aje" = ( @@ -3565,10 +3504,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/prison) "ajg" = ( @@ -3890,7 +3826,6 @@ pixel_x = 3; pixel_y = -3 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/machinery/firealarm{ dir = 4; pixel_x = -27 @@ -4100,15 +4035,10 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) "akm" = ( @@ -4155,15 +4085,10 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) "akq" = ( @@ -4518,7 +4443,6 @@ id = "hos_spess_shutters"; name = "Space shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "ala" = ( @@ -4831,7 +4755,6 @@ id = "hos_spess_shutters"; name = "Space shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "alO" = ( @@ -5008,10 +4931,7 @@ dir = 8 }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/warden) "amj" = ( @@ -5049,10 +4969,7 @@ dir = 8 }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/warden) "aml" = ( @@ -5173,12 +5090,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "amu" = ( @@ -5765,7 +5677,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plasteel/dark, @@ -5872,7 +5784,6 @@ id = "hos_spess_shutters"; name = "Space shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "anX" = ( @@ -5941,7 +5852,7 @@ /turf/open/floor/plasteel/dark, /area/security/brig) "aol" = ( -/obj/machinery/computer/shuttle/labor, +/obj/machinery/computer/shuttle_flight/labor, /turf/open/floor/plasteel/dark, /area/security/brig) "aom" = ( @@ -6006,12 +5917,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "aot" = ( @@ -6088,7 +5994,6 @@ /area/security/main) "aoz" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/fore) "aoA" = ( @@ -6582,6 +6487,7 @@ pixel_x = 4; pixel_y = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "apL" = ( @@ -6609,10 +6515,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "apN" = ( @@ -6638,10 +6541,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/main) "apQ" = ( @@ -6659,7 +6559,6 @@ /area/maintenance/fore) "apR" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -6992,7 +6891,6 @@ id = "bridgespace"; name = "bridge external shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "aqJ" = ( @@ -7200,12 +7098,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel/dark, /area/security/brig) "ark" = ( @@ -7288,6 +7180,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "arv" = ( @@ -7737,7 +7630,6 @@ /area/crew_quarters/dorms) "ash" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/dorms) "asi" = ( @@ -7750,7 +7642,6 @@ "asj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/dorms) "asl" = ( @@ -7915,7 +7806,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/security/brig) "asG" = ( @@ -8364,10 +8255,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "atF" = ( @@ -8396,10 +8284,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "atH" = ( @@ -8412,10 +8297,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "atI" = ( @@ -8485,6 +8367,10 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/item/storage/secure/safe/caps_spare{ + pixel_x = 6; + pixel_y = 28 + }, /turf/open/floor/plasteel/dark, /area/bridge) "atQ" = ( @@ -8555,7 +8441,7 @@ /turf/open/floor/plasteel/dark, /area/bridge) "atX" = ( -/obj/machinery/computer/shuttle/labor{ +/obj/machinery/computer/shuttle_flight/labor{ dir = 8 }, /obj/effect/turf_decal/tile/yellow{ @@ -8714,10 +8600,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/dorms) "aul" = ( -/obj/machinery/computer/shuttle/monastery_shuttle, +/obj/machinery/computer/shuttle_flight/monastery_shuttle, /obj/structure/sign/warning/pods{ pixel_y = 32 }, @@ -9041,6 +8928,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) "auZ" = ( @@ -9061,10 +8949,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/gateway) "avb" = ( @@ -9073,10 +8958,7 @@ name = "Gateway Access Shutters" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/gateway) "avc" = ( @@ -9089,7 +8971,6 @@ id = "Dorm3Shutters"; name = "Dorm Shutters" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/dorms) "ave" = ( @@ -9188,7 +9069,7 @@ dir = 8; pixel_x = 28 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "avm" = ( @@ -9196,13 +9077,15 @@ /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "avn" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) "avp" = ( @@ -9524,12 +9407,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "avR" = ( @@ -9638,14 +9516,9 @@ }, /turf/open/floor/plating, /area/bridge) -"awd" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/hallway/primary/central) "awe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/central) "awf" = ( @@ -9726,7 +9599,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, @@ -9874,34 +9747,23 @@ }, /area/crew_quarters/fitness/recreation) "awC" = ( -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/fitness/recreation"; - dir = 1; - name = "Fitness Room APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"awD" = ( -/obj/machinery/light{ - dir = 4 - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/extinguisher_cabinet{ - pixel_x = 26 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/dorms) +"awD" = ( +/obj/structure/closet/crate{ + opened = 1 + }, +/obj/effect/spawner/lootdrop/maintenance/two, +/obj/item/clothing/mask/balaclava, +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/dorms) "awE" = ( /obj/item/storage/briefcase, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -9917,10 +9779,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/security/brig) @@ -9987,10 +9845,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "awM" = ( @@ -10023,10 +9878,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "awO" = ( @@ -10043,10 +9895,7 @@ name = "brig shutters" }, /obj/item/radio, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "awP" = ( @@ -10068,10 +9917,7 @@ /obj/item/folder/red{ layer = 2.9 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "awQ" = ( @@ -10090,10 +9936,7 @@ name = "Brig Desk"; req_access_txt = "1" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) "awR" = ( @@ -10225,7 +10068,6 @@ /area/bridge) "axh" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/bridge) "axi" = ( @@ -10236,7 +10078,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/central) "axk" = ( @@ -10244,7 +10085,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/central) "axl" = ( @@ -10265,7 +10105,6 @@ "axn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/central) "axo" = ( @@ -10334,28 +10173,36 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "axz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/fitness/recreation"; + dir = 1; + name = "Fitness Room APC"; + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" }, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "axA" = ( +/obj/machinery/light{ + dir = 4 + }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/extinguisher_cabinet{ + pixel_x = 26 }, -/obj/effect/landmark/xeno_spawn, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "axB" = ( @@ -10383,7 +10230,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -10607,12 +10454,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "ayf" = ( @@ -10654,8 +10496,6 @@ id = "Dorm2Shutters"; name = "Dorm Shutters" }, -/obj/machinery/door/firedoor/window, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/dorms) "ayj" = ( @@ -10748,12 +10588,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ayu" = ( @@ -10768,19 +10603,25 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ayw" = ( -/obj/machinery/computer/holodeck{ +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ayx" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 }, -/obj/effect/landmark/start/assistant, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ayy" = ( @@ -10977,12 +10818,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) "ayX" = ( @@ -11226,10 +11062,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "azr" = ( @@ -11316,12 +11149,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "azC" = ( @@ -11338,22 +11166,19 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "azE" = ( -/obj/structure/table, -/obj/item/paper/fluff/holodeck/disclaimer, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"azF" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/camera{ - c_tag = "Holodeck"; - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"azF" = ( +/obj/machinery/computer/holodeck{ + dir = 4 }, -/obj/effect/landmark/start/assistant, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "azG" = ( @@ -11748,10 +11573,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) "aAD" = ( @@ -11859,18 +11681,18 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "aAT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +/obj/structure/chair{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aAU" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"aAU" = ( +/obj/structure/table, +/obj/item/paper/fluff/holodeck/disclaimer, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "aAV" = ( @@ -11936,10 +11758,7 @@ id = "datboidetective"; name = "privacy shutters" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/detectives_office) "aBg" = ( @@ -11950,7 +11769,6 @@ /turf/open/floor/plasteel/dark, /area/hallway/primary/fore) "aBh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/red, /obj/structure/extinguisher_cabinet{ pixel_x = 26 @@ -11971,7 +11789,7 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -24 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-20"; pixel_y = 3 }, @@ -12023,10 +11841,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "aBr" = ( @@ -12041,10 +11856,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "aBs" = ( @@ -12146,10 +11958,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "aBz" = ( @@ -12268,8 +12077,6 @@ id = "Dorm1Shutters"; name = "Dorm Shutters" }, -/obj/machinery/door/firedoor/window, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/crew_quarters/dorms) "aBM" = ( @@ -12373,19 +12180,22 @@ /turf/open/floor/plasteel/white/corner, /area/crew_quarters/fitness/recreation) "aBY" = ( -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) -"aBZ" = ( -/obj/machinery/light{ - dir = 4 +/obj/structure/chair{ + dir = 8 }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/item/radio/intercom{ - pixel_x = 28 +/obj/machinery/camera{ + c_tag = "Holodeck"; + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"aBZ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) @@ -12439,7 +12249,7 @@ /area/maintenance/department/security/brig) "aCi" = ( /obj/structure/table/wood, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-18"; pixel_y = 12 }, @@ -12530,7 +12340,7 @@ /obj/structure/extinguisher_cabinet{ pixel_y = 30 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -12882,12 +12692,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "aCW" = ( @@ -13022,7 +12827,7 @@ /turf/open/floor/plasteel/white/side, /area/crew_quarters/dorms) "aDk" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white/corner{ dir = 8 }, @@ -13087,7 +12892,6 @@ /turf/open/floor/grass, /area/hallway/primary/fore) "aDv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/light{ dir = 4 }, @@ -13211,12 +13015,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) "aDI" = ( @@ -13327,12 +13126,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hop) "aDR" = ( @@ -13420,17 +13214,6 @@ }, /turf/open/floor/carpet, /area/crew_quarters/heads/hop) -"aDY" = ( -/obj/machinery/power/apc{ - dir = 4; - name = "Head of Personnel APC"; - pixel_x = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/hop) "aDZ" = ( /turf/open/floor/plasteel, /area/hallway/primary/central) @@ -13458,10 +13241,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "aEd" = ( @@ -13477,6 +13257,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) "aEf" = ( @@ -13519,7 +13300,6 @@ /area/maintenance/department/cargo) "aEl" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/department/cargo) "aEm" = ( @@ -13803,15 +13583,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/wood, /area/crew_quarters/heads/hop) -"aEM" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-24" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/hop) "aEN" = ( /obj/structure/table/wood, /obj/item/storage/box/PDAs{ @@ -13959,40 +13730,50 @@ /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) "aFg" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/maintenance/department/cargo) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "aFh" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/obj/machinery/light{ dir = 4 }, -/obj/machinery/door/airlock/external{ - req_access_txt = "13" +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "aFi" = ( /turf/open/floor/plating, /area/maintenance/department/cargo) "aFj" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - req_access_txt = "13" - }, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/department/cargo) "aFk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/lootdrop/minor/bowler_or_that, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/sorting/mail{ + dir = 1; + name = "Security Junction"; + sortType = 30 + }, /turf/open/floor/plating{ icon_state = "platingdmg3" }, @@ -14140,10 +13921,7 @@ id = "hop"; name = "privacy shutters" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) "aFC" = ( @@ -14251,30 +14029,13 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) -"aFR" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "aFU" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 1; - name = "Security Junction"; - sortType = 30 - }, +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/lootdrop/minor/bowler_or_that, /turf/open/floor/plating{ icon_state = "platingdmg3" }, @@ -14294,17 +14055,12 @@ dir = 4 }, /turf/open/floor/plating, -/area/maintenance/department/security/brig) +/area/security/detectives_office) "aFW" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/item/storage/secure/safe{ + pixel_x = -22 }, +/obj/machinery/vending/wardrobe/det_wardrobe, /turf/open/floor/carpet, /area/security/detectives_office) "aFX" = ( @@ -14339,10 +14095,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aGc" = ( @@ -14353,10 +14106,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aGd" = ( @@ -14368,10 +14118,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aGe" = ( @@ -14487,7 +14234,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) "aGn" = ( -/obj/item/twohanded/required/kirbyplants/photosynthetic{ +/obj/item/kirbyplants/photosynthetic{ layer = 3.1 }, /obj/structure/window/reinforced/fulltile, @@ -14656,15 +14403,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aGV" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -14695,10 +14438,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/primary) "aGZ" = ( @@ -14770,10 +14510,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "aHe" = ( @@ -14801,10 +14538,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "aHf" = ( @@ -14812,7 +14546,6 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/central) "aHg" = ( @@ -14841,10 +14574,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "aHh" = ( @@ -14900,10 +14630,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aHn" = ( @@ -14952,7 +14679,6 @@ /area/hallway/secondary/exit/departure_lounge) "aHA" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) "aHC" = ( @@ -15117,12 +14843,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aHS" = ( @@ -15271,12 +14992,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aId" = ( @@ -15326,12 +15042,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aIh" = ( @@ -15481,12 +15192,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aIS" = ( @@ -15627,12 +15333,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aJh" = ( @@ -15712,6 +15413,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) "aJo" = ( @@ -15933,12 +15635,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aJQ" = ( @@ -16068,12 +15765,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aKe" = ( @@ -16091,7 +15783,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aKg" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white/corner{ dir = 4 }, @@ -16266,10 +15958,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/art) "aKM" = ( @@ -16293,10 +15982,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/cafeteria) "aKP" = ( @@ -16318,10 +16004,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/auxiliary) "aKS" = ( @@ -16362,10 +16045,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/eva) "aLb" = ( @@ -16379,10 +16059,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/eva) "aLc" = ( @@ -16403,10 +16080,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/teleporter) "aLe" = ( @@ -16462,7 +16136,6 @@ /area/maintenance/disposal) "aLo" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/disposal) "aLu" = ( @@ -16498,7 +16171,7 @@ dir = 4 }, /obj/structure/easel, -/obj/item/canvas/twentythreeXnineteen, +/obj/item/canvas/twentythree_nineteen, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -16696,7 +16369,7 @@ /obj/machinery/airalarm{ pixel_y = 22 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/teleporter) "aLX" = ( @@ -17118,10 +16791,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aMS" = ( @@ -17132,10 +16802,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aMT" = ( @@ -17148,10 +16815,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aMU" = ( @@ -17426,12 +17090,7 @@ name = "Teleporter Shutters" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/teleporter) "aNA" = ( @@ -17766,8 +17425,8 @@ amount = 20; layer = 3.3 }, -/obj/item/canvas/twentythreeXtwentythree, -/obj/item/canvas/nineteenXnineteen, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/nineteen_nineteen, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -17938,12 +17597,7 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/teleporter) "aOK" = ( @@ -18034,6 +17688,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/sorting) "aOS" = ( @@ -18220,25 +17875,20 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "aPx" = ( /obj/machinery/light/small{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/bar) "aPy" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plating{ @@ -18498,7 +18148,7 @@ /area/quartermaster/warehouse) "aQf" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance, /obj/effect/decal/cleanable/dirt, @@ -18584,7 +18234,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "aQw" = ( -/obj/machinery/computer/shuttle/mining, +/obj/machinery/computer/shuttle_flight/mining, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -18600,8 +18250,11 @@ /turf/open/floor/plasteel, /area/construction/mining/aux_base) "aQy" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-8" }, /turf/open/floor/engine, /area/engine/engineering) @@ -18618,12 +18271,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "aQB" = ( @@ -18839,7 +18487,7 @@ }, /area/crew_quarters/bar) "aQU" = ( -/obj/machinery/vending/coffee, +/obj/machinery/food_cart/coffee, /obj/machinery/camera{ c_tag = "Bar Backroom"; dir = 2 @@ -18966,10 +18614,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/supply) "aRh" = ( @@ -19361,15 +19006,11 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/bar) "aRY" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, @@ -19413,10 +19054,7 @@ req_access_txt = "50" }, /obj/effect/turf_decal/bot, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/sorting) "aSf" = ( @@ -19427,10 +19065,7 @@ req_access_txt = "50" }, /obj/effect/turf_decal/bot, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/sorting) "aSg" = ( @@ -19443,10 +19078,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/sorting) "aSh" = ( @@ -19629,14 +19261,14 @@ name = "CondiMaster Neo"; pixel_x = -4 }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aSJ" = ( /obj/machinery/gibber, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aSK" = ( -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aSL" = ( /obj/machinery/navbeacon{ @@ -19651,30 +19283,10 @@ name = "Kitchen Delivery"; req_access_txt = "28" }, -/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, +/turf/open/floor/plasteel, /area/crew_quarters/kitchen) "aSM" = ( -/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, +/turf/open/floor/plasteel, /area/maintenance/department/crew_quarters/bar) "aSN" = ( /obj/structure/reagent_dispensers/beerkeg, @@ -19770,12 +19382,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "aSZ" = ( @@ -20064,7 +19671,7 @@ dir = 9 }, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /turf/open/floor/plating, /area/maintenance/disposal) @@ -20221,7 +19828,7 @@ /obj/structure/kitchenspike, /obj/item/assembly/mousetrap, /obj/item/reagent_containers/food/snacks/deadmouse, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aTY" = ( /obj/structure/cable/yellow{ @@ -20230,7 +19837,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aTZ" = ( /obj/machinery/camera{ @@ -20245,7 +19852,7 @@ departmentType = 2; pixel_y = 30 }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aUa" = ( /obj/structure/extinguisher_cabinet{ @@ -20253,7 +19860,7 @@ }, /obj/item/crowbar, /obj/item/wrench, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aUb" = ( /obj/structure/plasticflaps/opaque, @@ -20346,12 +19953,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "aUm" = ( @@ -20387,12 +19989,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "aUp" = ( @@ -20428,12 +20025,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "aUt" = ( @@ -20555,12 +20147,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/corner{ dir = 1 }, @@ -20707,23 +20294,23 @@ /obj/machinery/light{ dir = 8 }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aUY" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aUZ" = ( /mob/living/simple_animal/hostile/retaliate/goat{ name = "Pete" }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aVa" = ( /obj/machinery/holopad, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aVb" = ( /obj/machinery/light{ @@ -20734,7 +20321,7 @@ pixel_x = 23 }, /obj/structure/reagent_dispensers/cooking_oil, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aVc" = ( /obj/machinery/door/window/southleft{ @@ -20761,6 +20348,7 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "aVf" = ( @@ -20944,12 +20532,6 @@ id = "cargodeliver" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel, /area/quartermaster/office) "aVt" = ( @@ -21178,15 +20760,12 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics) "aVW" = ( /obj/machinery/vending/wardrobe/chef_wardrobe, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aVX" = ( /obj/machinery/power/apc{ @@ -21195,13 +20774,13 @@ pixel_y = -24 }, /obj/structure/cable, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aVY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aVZ" = ( /obj/structure/closet/secure_closet/freezer/kitchen, @@ -21210,7 +20789,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aWa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -21440,12 +21019,7 @@ output_dir = 8 }, /obj/effect/turf_decal/stripes/box, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/quartermaster/office) "aWw" = ( @@ -21480,7 +21054,7 @@ /area/quartermaster/storage) "aWz" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance/two, /obj/effect/turf_decal/bot, @@ -21648,17 +21222,17 @@ /area/hydroponics) "aWU" = ( /obj/structure/closet/secure_closet/freezer/meat, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aWV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aWW" = ( /obj/structure/closet/secure_closet/freezer/fridge, -/turf/open/floor/plasteel/showroomfloor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aWX" = ( /obj/structure/disposalpipe/segment{ @@ -21859,10 +21433,7 @@ req_access_txt = "50" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "aXt" = ( @@ -21872,10 +21443,7 @@ name = "Cargo Desk"; req_access_txt = "50" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "aXv" = ( @@ -22011,10 +21579,7 @@ /obj/item/folder/red, /obj/item/pen, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/customs) "aXK" = ( @@ -22032,10 +21597,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "aXM" = ( @@ -22158,7 +21720,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plasteel/showroomfloor, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) "aYb" = ( /obj/machinery/door/airlock{ @@ -22171,6 +21734,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/kitchen) "aYd" = ( @@ -22185,20 +21749,18 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "aYe" = ( /obj/structure/table/reinforced, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-18"; - pixel_y = 10 - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/structure/displaycase/forsale/kitchen, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "aYf" = ( @@ -22238,7 +21800,7 @@ "aYi" = ( /obj/structure/table/reinforced, /obj/structure/disposalpipe/segment, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-18"; pixel_y = 10 }, @@ -22270,6 +21832,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/theatre) "aYk" = ( @@ -22559,10 +22122,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/janitor) "aYO" = ( @@ -22654,16 +22214,11 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/kitchen) "aYY" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "aYZ" = ( @@ -22780,7 +22335,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "aZg" = ( @@ -22851,12 +22406,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "aZm" = ( @@ -23096,6 +22646,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/customs) "aZL" = ( @@ -23226,12 +22777,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/kitchen) "bae" = ( @@ -23376,7 +22922,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/obj/machinery/autolathe, +/obj/machinery/modular_fabricator/autolathe, /turf/open/floor/plasteel, /area/quartermaster/office) "baz" = ( @@ -23386,12 +22932,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "baA" = ( @@ -23720,12 +23261,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/kitchen) "bbm" = ( @@ -23886,10 +23422,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/qm) "bbH" = ( @@ -23913,10 +23446,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "bbK" = ( @@ -23929,10 +23459,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "bbL" = ( @@ -24025,10 +23552,7 @@ }, /obj/item/crowbar, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/customs) "bbW" = ( @@ -24037,12 +23561,7 @@ name = "Custodial Closet Shutters" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/janitor) "bbX" = ( @@ -24087,18 +23606,11 @@ req_access_txt = "35" }, /obj/item/reagent_containers/glass/bucket, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/hydroponics) "bcc" = ( /obj/machinery/biogenerator, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel/dark, /area/hydroponics) "bcd" = ( @@ -24109,10 +23621,7 @@ req_access_txt = "35" }, /obj/item/reagent_containers/food/snacks/monkeycube, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/hydroponics) "bce" = ( @@ -24252,12 +23761,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar) "bcx" = ( @@ -24559,12 +24063,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/corner{ dir = 1 }, @@ -24593,12 +24092,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bdg" = ( @@ -24744,12 +24238,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar) "bdz" = ( @@ -24927,12 +24416,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bdY" = ( @@ -25046,12 +24530,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hydroponics) "bel" = ( @@ -25116,12 +24595,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "bep" = ( @@ -25339,7 +24813,7 @@ /turf/open/floor/plasteel, /area/quartermaster/qm) "beM" = ( -/obj/machinery/mineral/equipment_vendor, +/obj/machinery/vendor/mining, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -25359,7 +24833,7 @@ /turf/open/floor/plasteel, /area/quartermaster/miningdock) "beP" = ( -/obj/machinery/computer/shuttle/mining{ +/obj/machinery/computer/shuttle_flight/mining{ dir = 8 }, /obj/effect/turf_decal/tile/brown, @@ -25426,12 +24900,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bfb" = ( @@ -25476,12 +24945,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bff" = ( @@ -25527,10 +24991,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/janitor) "bfm" = ( @@ -25555,7 +25016,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bfp" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/machinery/button/door{ @@ -25825,10 +25286,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/lounge) "bgc" = ( @@ -25995,10 +25453,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar) "bgu" = ( @@ -26010,17 +25465,14 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar) "bgv" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -26119,12 +25571,7 @@ name = "mech bay" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/mechbay) "bgE" = ( @@ -26374,12 +25821,7 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/mechbay) "bhk" = ( @@ -26877,12 +26319,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/mechbay) "biu" = ( @@ -27040,7 +26477,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, @@ -27108,10 +26545,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/medical/morgue) "bja" = ( @@ -27142,10 +26576,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "bjg" = ( @@ -27157,10 +26588,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "bjh" = ( @@ -27173,10 +26601,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "bji" = ( @@ -27184,7 +26609,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/central) "bjj" = ( @@ -27235,7 +26660,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/central) "bjp" = ( @@ -27247,10 +26672,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bjr" = ( @@ -27260,10 +26682,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bju" = ( @@ -27614,6 +27033,7 @@ id = "robotics"; name = "robotics lab shutters" }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/science/robotics/lab) "bkw" = ( @@ -27631,10 +27051,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/lab) "bkx" = ( @@ -27679,10 +27096,7 @@ opacity = 0; req_access_txt = "55" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/science/xenobiology) "bkP" = ( @@ -27926,10 +27340,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "blu" = ( @@ -28430,7 +27841,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bmx" = ( @@ -28466,12 +27877,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/medical/medbay/central) "bmB" = ( @@ -28485,7 +27891,7 @@ dir = 1 }, /obj/machinery/light/small, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/central) "bmC" = ( @@ -28551,7 +27957,7 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "bmO" = ( -/obj/machinery/mecha_part_fabricator, +/obj/machinery/modular_fabricator/exosuit_fab, /turf/open/floor/plasteel, /area/science/robotics/lab) "bmP" = ( @@ -28745,10 +28151,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/storage/emergency/port) "bnx" = ( @@ -28784,7 +28187,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/storage/emergency/port) "bnz" = ( @@ -28820,10 +28223,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/medical) "bnC" = ( @@ -28835,6 +28235,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bnD" = ( @@ -28845,6 +28246,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bnE" = ( @@ -28988,10 +28390,7 @@ }, /obj/machinery/atmospherics/pipe/simple/general/visible, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/server) "bnV" = ( @@ -29018,10 +28417,7 @@ name = "test chamber blast door" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/engine, /area/science/explab) "bnY" = ( @@ -29238,7 +28634,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "boF" = ( @@ -29314,6 +28710,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "boK" = ( @@ -29429,7 +28826,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "boX" = ( @@ -29747,12 +29144,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/medical/morgue) "bpH" = ( @@ -29821,12 +29213,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/medical/morgue) "bpN" = ( @@ -29875,12 +29262,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bpR" = ( @@ -29901,6 +29283,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bpT" = ( @@ -29947,10 +29330,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bpX" = ( @@ -29983,10 +29363,7 @@ name = "research shutters" }, /obj/item/folder/white, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/science/lab) "bqd" = ( @@ -30005,10 +29382,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bqe" = ( @@ -30021,10 +29395,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bqf" = ( @@ -30041,10 +29412,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bqh" = ( @@ -30467,12 +29835,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/genetics) "brb" = ( @@ -31274,10 +30637,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bsI" = ( @@ -31294,10 +30654,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bsJ" = ( @@ -31483,10 +30840,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/server) "btg" = ( @@ -31571,12 +30925,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "btu" = ( @@ -31858,12 +31207,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bub" = ( @@ -31920,12 +31264,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "buh" = ( @@ -32060,15 +31399,12 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/lab) "buw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/twohanded/required/kirbyplants/photosynthetic{ +/obj/item/kirbyplants/photosynthetic{ pixel_y = 10 }, /obj/effect/turf_decal/tile/purple{ @@ -32087,7 +31423,7 @@ /turf/open/floor/plasteel/dark, /area/science/explab) "buy" = ( -/obj/item/twohanded/required/kirbyplants/photosynthetic{ +/obj/item/kirbyplants/photosynthetic{ pixel_y = 10 }, /obj/effect/turf_decal/tile/purple, @@ -32098,7 +31434,6 @@ /area/science/explab) "buz" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/science/explab) "buA" = ( @@ -32127,7 +31462,7 @@ /turf/open/floor/plasteel, /area/science/explab) "buD" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-11" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -32319,6 +31654,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/genetics) "bve" = ( @@ -32375,12 +31711,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bvj" = ( @@ -32436,12 +31767,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bvp" = ( @@ -32468,12 +31794,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bvr" = ( @@ -32612,12 +31933,7 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "bvH" = ( @@ -32725,12 +32041,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/explab) "bvQ" = ( @@ -32908,10 +32219,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bwr" = ( @@ -32924,10 +32232,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bws" = ( @@ -33133,12 +32438,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bwO" = ( @@ -33312,12 +32612,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/lab) "bxi" = ( @@ -33405,12 +32700,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "bxq" = ( @@ -33542,12 +32832,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/explab) "bxz" = ( @@ -33918,10 +33203,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/sleeper) "byr" = ( @@ -34180,12 +33462,7 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "byP" = ( @@ -34229,7 +33506,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/photosynthetic{ +/obj/item/kirbyplants/photosynthetic{ pixel_y = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -34293,12 +33570,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/explab) "byY" = ( @@ -34637,7 +33909,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/medical/medbay/zone2) "bzN" = ( @@ -34945,14 +34217,12 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/machinery/door/airlock/command{ name = "Research Director's Office"; + req_access_txt = "30"; security_level = 6 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) "bAq" = ( @@ -35003,10 +34273,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bAw" = ( @@ -35018,10 +34285,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bAx" = ( @@ -35040,10 +34304,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bAy" = ( @@ -35067,10 +34328,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/explab) "bAD" = ( @@ -35083,10 +34341,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/explab) "bAE" = ( @@ -35099,10 +34354,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/explab) "bAF" = ( @@ -35259,23 +34511,13 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/virology) "bAY" = ( /obj/structure/sign/warning/biohazard, /turf/closed/wall, /area/medical/virology) -"bBb" = ( -/obj/effect/turf_decal/stripes/line, -/mob/living/simple_animal/bot/cleanbot{ - name = "McSweepsky" - }, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) "bBc" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -35289,7 +34531,6 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "bBd" = ( -/obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -35491,7 +34732,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) "bBu" = ( -/obj/item/twohanded/required/kirbyplants/dead, +/obj/item/kirbyplants/dead, /obj/structure/disposalpipe/segment{ dir = 10 }, @@ -35598,7 +34839,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "bBC" = ( @@ -35804,13 +35045,9 @@ /turf/open/floor/engine, /area/science/xenobiology) "bBV" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/effect/spawner/lootdrop/maintenance/two, -/obj/item/clothing/mask/balaclava, -/turf/open/floor/plating, -/area/maintenance/department/crew_quarters/dorms) +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "bBW" = ( /turf/open/space, /area/space) @@ -36006,7 +35243,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ name = "Chief Medical Office"; req_access_txt = "40"; @@ -36024,6 +35260,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/cmo) "bCr" = ( @@ -36485,11 +35722,6 @@ "bDi" = ( /turf/open/floor/plating, /area/maintenance/department/engine) -"bDk" = ( -/obj/item/chair, -/obj/item/cigbutt/roach, -/turf/open/floor/plating, -/area/maintenance/department/engine) "bDl" = ( /obj/structure/closet/secure_closet/medical1, /obj/effect/turf_decal/tile/purple{ @@ -36809,12 +36041,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/storage) "bDR" = ( @@ -36894,12 +36121,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/mixing) "bDV" = ( @@ -37231,10 +36453,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bEB" = ( @@ -37242,10 +36461,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bEC" = ( @@ -37257,10 +36473,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bED" = ( @@ -37327,7 +36540,7 @@ /turf/open/floor/plasteel/white, /area/crew_quarters/heads/cmo) "bEH" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-16" }, /obj/machinery/light_switch{ @@ -37430,7 +36643,7 @@ /area/hallway/primary/aft) "bEQ" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/stock_parts/matter_bin, /obj/item/stock_parts/matter_bin, @@ -37893,10 +37106,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/virology) "bFN" = ( @@ -37941,6 +37151,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bFS" = ( @@ -38037,6 +37248,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/science) "bGc" = ( @@ -38354,12 +37566,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/mixing) "bGx" = ( @@ -38372,7 +37579,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/mixing) "bGA" = ( @@ -38389,15 +37596,8 @@ /obj/machinery/light/small, /turf/open/floor/plating, /area/maintenance/department/science) -"bGD" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) "bGE" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/chapel/dock) "bGF" = ( @@ -38411,21 +37611,8 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 2 }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 - }, /turf/open/floor/plating/airless, /area/chapel/dock) -"bGH" = ( -/obj/structure/window/reinforced, -/turf/open/space, -/area/space/nearstation) -"bGI" = ( -/obj/structure/window/reinforced, -/turf/open/space/basic, -/area/space/nearstation) "bGL" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -38513,6 +37700,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bGZ" = ( @@ -38733,12 +37921,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bHq" = ( @@ -38888,7 +38071,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/mixing) "bHE" = ( @@ -38924,7 +38107,6 @@ /area/chapel/dock) "bHK" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, @@ -38935,20 +38117,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/chapel/dock) "bHM" = ( /turf/closed/wall/r_wall, /area/chapel/dock) -"bHN" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 - }, -/turf/open/space/basic, -/area/space/nearstation) "bHT" = ( /turf/open/space/basic, /area/maintenance/department/cargo) @@ -39050,35 +38223,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"bIg" = ( -/obj/structure/table, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/storage/box/syringes, -/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/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/item/reagent_containers/spray/cleaner, -/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/white, -/area/medical/medbay/central) "bIh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -39188,22 +38332,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/surgery) -"bIr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/vending/wallmed{ - pixel_y = 28 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) "bIs" = ( /obj/structure/closet/secure_closet/medical2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -39428,16 +38556,8 @@ icon_state = "platingdmg3" }, /area/maintenance/department/science) -"bIT" = ( -/obj/structure/window/reinforced{ - dir = 4; - layer = 2.9 - }, -/turf/open/space/basic, -/area/space/nearstation) "bIU" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -39447,11 +38567,10 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/chapel/dock) "bIW" = ( -/obj/machinery/computer/shuttle/monastery_shuttle, +/obj/machinery/computer/shuttle_flight/monastery_shuttle, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -39480,14 +38599,6 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/dock) -"bIY" = ( -/obj/structure/lattice, -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 - }, -/turf/open/space/basic, -/area/space/nearstation) "bIZ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -39557,12 +38668,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/medical/surgery) "bJr" = ( @@ -39594,12 +38700,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/medical/surgery) "bJu" = ( @@ -39768,12 +38869,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bJK" = ( @@ -39836,10 +38932,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/storage) "bJP" = ( @@ -39905,14 +38998,6 @@ }, /turf/open/floor/plating, /area/science/mixing) -"bJZ" = ( -/obj/structure/window/reinforced{ - dir = 4; - layer = 2.9 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) "bKa" = ( /obj/machinery/airalarm{ dir = 4; @@ -40037,6 +39122,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/medical/medbay/central) "bKz" = ( @@ -40122,10 +39208,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bKJ" = ( @@ -40136,10 +39219,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bKK" = ( @@ -40152,10 +39232,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bKM" = ( @@ -40168,10 +39245,7 @@ id = "atmos"; name = "atmospherics security door" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bKP" = ( @@ -40182,10 +39256,7 @@ }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bKQ" = ( @@ -40321,7 +39392,6 @@ dir = 4 }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bLa" = ( @@ -40431,14 +39501,6 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/dock) -"bLs" = ( -/obj/structure/lattice, -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 - }, -/turf/open/space, -/area/space/nearstation) "bLz" = ( /obj/item/bedsheet/medical, /obj/structure/bed, @@ -40452,9 +39514,7 @@ /area/medical/virology) "bLF" = ( /obj/structure/table, -/obj/item/clipboard{ - toppaper = null - }, +/obj/item/clipboard, /obj/item/pen{ layer = 3.1 }, @@ -40520,23 +39580,6 @@ }, /turf/open/floor/plasteel/freezer, /area/medical/surgery) -"bLM" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/suit/apron/surgical, -/obj/machinery/light_switch{ - pixel_x = -22 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/surgical_drapes, -/turf/open/floor/plasteel/white, -/area/medical/surgery) "bLN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -40801,14 +39844,6 @@ /obj/structure/fans/tiny, /turf/open/floor/plating, /area/science/mixing) -"bMr" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4; - layer = 2.9 - }, -/turf/open/space/basic, -/area/space/nearstation) "bMs" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -40874,14 +39909,6 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/dock) -"bMy" = ( -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "bMF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/freezer, @@ -41060,12 +40087,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bNc" = ( @@ -41146,7 +40168,6 @@ /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bNn" = ( @@ -41172,17 +40193,8 @@ }, /turf/open/space, /area/space/nearstation) -"bNr" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "bNs" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/chapel/asteroid/monastery) "bNt" = ( @@ -41268,10 +40280,6 @@ /area/chapel/dock) "bNB" = ( /obj/structure/transit_tube/horizontal, -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 - }, /obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) @@ -41456,12 +40464,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bOk" = ( @@ -41525,7 +40528,6 @@ /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 10 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bOs" = ( @@ -41542,13 +40544,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"bOv" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "bOw" = ( /turf/open/floor/plating/asteroid, /area/chapel/asteroid/monastery) @@ -41831,7 +40826,6 @@ dir = 4 }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bPg" = ( @@ -41872,6 +40866,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/dock) "bPo" = ( @@ -41893,6 +40888,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/dock) "bPs" = ( @@ -42094,7 +41090,6 @@ "bPY" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bPZ" = ( @@ -42102,7 +41097,7 @@ /turf/open/floor/engine/n2o, /area/engine/atmos) "bQa" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/machinery/atmospherics/miner/station/n2o, /turf/open/floor/engine/n2o, /area/engine/atmos) "bQb" = ( @@ -42149,13 +41144,6 @@ }, /turf/open/floor/plating/asteroid, /area/chapel/asteroid/monastery) -"bQi" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "bQj" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -42432,12 +41420,7 @@ name = "atmospherics security door" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bQF" = ( @@ -42520,7 +41503,6 @@ /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bQP" = ( @@ -42529,20 +41511,6 @@ }, /turf/open/floor/engine/n2o, /area/engine/atmos) -"bQQ" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/space, -/area/space/nearstation) -"bQR" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/space, -/area/space/nearstation) "bQU" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -42789,12 +41757,7 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bRs" = ( @@ -42893,10 +41856,6 @@ /area/engine/atmos) "bRC" = ( /obj/structure/lattice, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, /obj/structure/lattice, /turf/open/space, /area/space/nearstation) @@ -42923,12 +41882,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bRI" = ( @@ -42965,12 +41919,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/tech) "bRL" = ( @@ -43076,12 +42025,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/storage/tech) "bRV" = ( @@ -43137,12 +42081,6 @@ id = "atmos"; name = "atmospherics security door" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bSb" = ( @@ -43229,7 +42167,6 @@ /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bSj" = ( @@ -43249,12 +42186,6 @@ /obj/structure/flora/ausbushes, /turf/open/floor/plating/asteroid, /area/chapel/asteroid/monastery) -"bSn" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/space, -/area/space/nearstation) "bSo" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -43475,7 +42406,7 @@ pixel_y = -32 }, /obj/effect/turf_decal/tile/yellow, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bSQ" = ( @@ -43488,10 +42419,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bSR" = ( @@ -43538,7 +42466,7 @@ /turf/open/floor/engine/plasma, /area/engine/atmos) "bSX" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/atmospherics/miner/station/toxins, /turf/open/floor/engine/plasma, /area/engine/atmos) "bSY" = ( @@ -43547,13 +42475,6 @@ }, /turf/open/floor/engine/plasma, /area/engine/atmos) -"bSZ" = ( -/obj/structure/lattice, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/space, -/area/space/nearstation) "bTa" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -43572,7 +42493,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating/airless, /area/maintenance/department/engine) "bTd" = ( @@ -44071,10 +42991,7 @@ req_access_txt = "19;23" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/storage/tech) "bUh" = ( @@ -44182,12 +43099,7 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bUp" = ( @@ -44280,7 +43192,6 @@ /obj/machinery/atmospherics/pipe/simple/purple/visible{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bUA" = ( @@ -44556,6 +43467,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/checkpoint/engineering) "bUZ" = ( @@ -44611,12 +43523,7 @@ dir = 8 }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/atmos) "bVd" = ( @@ -44701,7 +43608,6 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bVm" = ( @@ -44721,12 +43627,6 @@ "bVo" = ( /turf/open/floor/engine/co2, /area/engine/atmos) -"bVp" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) "bVr" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating/airless, @@ -45041,7 +43941,6 @@ "bWc" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bWd" = ( @@ -45054,7 +43953,7 @@ /turf/open/floor/engine/co2, /area/engine/atmos) "bWf" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/machinery/atmospherics/miner/station/carbon_dioxide, /turf/open/floor/engine/co2, /area/engine/atmos) "bWg" = ( @@ -45333,10 +44232,7 @@ dir = 1; pixel_y = -22 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engineering) "bWF" = ( @@ -45350,10 +44246,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engineering) "bWG" = ( @@ -45365,10 +44258,7 @@ dir = 6 }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engineering) "bWH" = ( @@ -45438,7 +44328,6 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bWS" = ( @@ -45470,6 +44359,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "bWX" = ( @@ -45481,6 +44371,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "bWZ" = ( @@ -45897,10 +44788,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) "bYb" = ( @@ -45946,10 +44834,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "bYi" = ( @@ -46002,7 +44887,6 @@ "bYp" = ( /obj/machinery/atmospherics/pipe/simple/green/visible, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bYq" = ( @@ -46010,7 +44894,6 @@ /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 5 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/atmos) "bYs" = ( @@ -46074,7 +44957,7 @@ /turf/open/floor/plasteel, /area/engine/engineering) "bYI" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_y = 3 }, @@ -46800,21 +45683,6 @@ "bZY" = ( /turf/closed/wall, /area/chapel/office) -"bZZ" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/security/brig) "caa" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating{ @@ -46949,7 +45817,7 @@ /area/engine/engineering) "caw" = ( /obj/structure/table, -/obj/item/twohanded/rcl/pre_loaded, +/obj/item/rcl/pre_loaded, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) @@ -47213,10 +46081,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/engineering) "cbl" = ( @@ -47268,14 +46133,14 @@ /turf/open/floor/engine/n2, /area/engine/atmos) "cbt" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/machinery/atmospherics/miner/station/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/station/oxygen, /turf/open/floor/engine/o2, /area/engine/atmos) "cbw" = ( @@ -47334,31 +46199,27 @@ /area/chapel/main/monastery) "cbN" = ( /obj/structure/table/wood, -/obj/item/storage/book/bible, +/obj/item/storage/book/bible{ + pixel_x = -4 + }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/turf/open/floor/carpet, -/area/chapel/main/monastery) -"cbO" = ( -/obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/trophy{ + pixel_x = 9; pixel_y = 8 }, /turf/open/floor/carpet, /area/chapel/main/monastery) +"cbO" = ( +/obj/structure/altar_of_gods, +/turf/open/floor/carpet, +/area/chapel/main/monastery) "cbP" = ( /turf/open/floor/plasteel/chapel{ dir = 1 }, /area/chapel/main/monastery) -"cbR" = ( -/obj/machinery/door/airlock/grunge{ - name = "Chapel Access"; - opacity = 1 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/main/monastery) "cbV" = ( /obj/machinery/shieldgen, /turf/open/floor/plating, @@ -47639,12 +46500,7 @@ /obj/effect/turf_decal/bot{ dir = 2 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/engineering) "ccY" = ( @@ -47672,18 +46528,6 @@ /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/department/security/brig) "cdk" = ( @@ -47710,6 +46554,9 @@ /obj/machinery/atmospherics/components/binary/dp_vent_pump{ dir = 4 }, +/obj/machinery/advanced_airlock_controller{ + pixel_y = -26 + }, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) "cdm" = ( @@ -47965,7 +46812,6 @@ "cec" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating/airless, /area/maintenance/disposal/incinerator) "cee" = ( @@ -48000,6 +46846,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "ceh" = ( @@ -48017,6 +46864,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "cej" = ( @@ -48029,6 +46877,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "cek" = ( @@ -48041,6 +46890,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "cel" = ( @@ -48053,6 +46903,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "cen" = ( @@ -48093,10 +46944,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/engineering) "cet" = ( @@ -48190,7 +47038,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "ceK" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-08" }, /turf/open/floor/plasteel/dark, @@ -48334,6 +47182,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "cfm" = ( @@ -48603,6 +47452,13 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) +"cgq" = ( +/obj/effect/turf_decal/arrows/white{ + pixel_x = 5 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine, +/area/engine/engineering) "cgr" = ( /obj/structure/window/reinforced/fulltile, /obj/structure/transit_tube, @@ -48620,9 +47476,6 @@ /turf/open/floor/plating, /area/engine/engineering) "cgx" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 10 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, @@ -48696,9 +47549,6 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, /obj/structure/cable/cyan{ icon_state = "1-2" }, @@ -48712,8 +47562,8 @@ /turf/open/floor/plating, /area/engine/engineering) "cgZ" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 }, /turf/open/floor/engine, /area/engine/engineering) @@ -48795,6 +47645,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/grimy, /area/chapel/main/monastery) "chq" = ( @@ -48926,18 +47777,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plating{ icon_state = "platingdmg1" }, @@ -49022,7 +47861,7 @@ dir = 4 }, /obj/structure/easel, -/obj/item/canvas/twentythreeXnineteen, +/obj/item/canvas/twentythree_nineteen, /turf/open/floor/plasteel/grimy, /area/chapel/main/monastery) "ciq" = ( @@ -49081,11 +47920,15 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/grimy, /area/chapel/main/monastery) "ciI" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 }, /turf/open/floor/engine, /area/engine/engineering) @@ -49220,6 +48063,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "cjm" = ( @@ -49294,6 +48138,7 @@ name = "Chapel Garden"; opacity = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "cjO" = ( @@ -49308,7 +48153,7 @@ /turf/open/floor/plating, /area/maintenance/department/chapel/monastery) "cjP" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/item/radio/intercom{ @@ -49625,10 +48470,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library/lounge) "ckU" = ( @@ -49995,6 +48837,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/tcommsat/computer) "cmj" = ( @@ -50189,6 +49032,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "cmx" = ( @@ -50396,14 +49240,6 @@ /obj/item/stock_parts/subspace/transmitter, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) -"cnu" = ( -/obj/machinery/camera/motion{ - c_tag = "Telecomms Server Room"; - dir = 1; - network = list("tcomms") - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/tcommsat/server) "cnv" = ( /obj/structure/table, /obj/item/stock_parts/subspace/treatment, @@ -50621,10 +49457,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "cor" = ( @@ -50805,6 +49638,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "cpg" = ( @@ -51179,12 +50013,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cqi" = ( @@ -51288,17 +50117,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cqy" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating/airless, /area/maintenance/department/engine) "cqz" = ( @@ -51321,7 +50144,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cqE" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-18"; layer = 3 }, @@ -51367,16 +50190,8 @@ /area/chapel/dock) "cqS" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/space/nearstation) -"cqU" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/space/basic, -/area/space/nearstation) "cqV" = ( /obj/structure/chair/office/light{ dir = 1 @@ -51398,16 +50213,8 @@ /area/space/nearstation) "crb" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating/airless, /area/chapel/office) -"cre" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/space/basic, -/area/space/nearstation) "crg" = ( /obj/structure/chair/wood/normal, /turf/open/floor/plasteel/dark, @@ -51443,10 +50250,6 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) -"crl" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/open/floor/plating/asteroid, -/area/chapel/asteroid/monastery) "crm" = ( /obj/structure/lattice, /obj/structure/disposalpipe/segment, @@ -51491,9 +50294,6 @@ /turf/open/floor/plating, /area/maintenance/department/engine) "crA" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -51588,12 +50388,6 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) -"crO" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/space/basic, -/area/space/nearstation) "crT" = ( /obj/machinery/light/small{ dir = 1 @@ -51886,7 +50680,6 @@ /area/chapel/main/monastery) "csU" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating/airless, /area/chapel/main/monastery) "csV" = ( @@ -52009,7 +50802,7 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /turf/open/floor/plasteel/dark, @@ -52102,7 +50895,7 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel/dark, @@ -52392,6 +51185,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "cuU" = ( @@ -52401,6 +51195,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "cuV" = ( @@ -52439,6 +51234,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "cuY" = ( @@ -52455,6 +51251,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "cuZ" = ( @@ -52669,7 +51466,7 @@ icon_state = "1-4" }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel/dark, @@ -52782,7 +51579,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "cvM" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -52865,10 +51662,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library/lounge) "cwj" = ( @@ -52942,7 +51736,7 @@ /turf/open/floor/plating, /area/maintenance/department/chapel/monastery) "cwr" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/structure/cable/yellow{ @@ -53030,24 +51824,10 @@ }, /turf/open/floor/carpet, /area/library/lounge) -"cwM" = ( -/obj/structure/window/reinforced{ - dir = 4; - layer = 2.9 - }, -/turf/open/space, -/area/space/nearstation) "cwO" = ( /obj/item/flashlight/lantern, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) -"cwR" = ( -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 - }, -/turf/open/space/basic, -/area/space/nearstation) "cwS" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -53074,35 +51854,6 @@ }, /turf/open/floor/carpet, /area/library/lounge) -"cxg" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/turf/open/space/basic, -/area/space/nearstation) -"cxh" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/window/reinforced{ - dir = 4; - layer = 2.9 - }, -/turf/open/space/basic, -/area/space/nearstation) -"cxk" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 - }, -/turf/open/space/basic, -/area/space/nearstation) "cxn" = ( /obj/machinery/newscaster{ pixel_x = -32; @@ -53140,10 +51891,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library/lounge) "cxB" = ( @@ -53169,6 +51917,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/sign/painting/library{ + pixel_x = -32 + }, /turf/open/floor/plasteel/dark, /area/library/lounge) "cxD" = ( @@ -53189,6 +51940,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/sign/painting/library{ + pixel_x = 32 + }, /turf/open/floor/plasteel/dark, /area/library/lounge) "cxE" = ( @@ -53200,7 +51954,6 @@ "cxJ" = ( /obj/structure/window/reinforced/fulltile, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/library/lounge) "cxK" = ( @@ -53244,7 +51997,6 @@ "cxM" = ( /obj/structure/window/reinforced/fulltile, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/library/lounge) "cxX" = ( @@ -53349,6 +52101,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/sign/painting/library{ + pixel_x = -32 + }, /turf/open/floor/plasteel/dark, /area/library/lounge) "cyA" = ( @@ -53371,6 +52126,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/sign/painting/library{ + pixel_x = 32 + }, /turf/open/floor/plasteel/dark, /area/library/lounge) "cyB" = ( @@ -53396,7 +52154,7 @@ /turf/open/floor/plasteel/dark, /area/library) "cyQ" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/machinery/camera{ @@ -53411,7 +52169,7 @@ /turf/open/floor/plasteel/dark, /area/library) "cyR" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plasteel/dark, @@ -53435,7 +52193,6 @@ /area/library) "cyU" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/library) "cyY" = ( @@ -53664,7 +52421,7 @@ /area/library) "cAs" = ( /obj/structure/table/wood, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05"; pixel_y = 10 }, @@ -53801,7 +52558,7 @@ /turf/open/floor/plasteel/dark, /area/library) "cAT" = ( -/obj/structure/destructible/cult/tome, +/obj/structure/destructible/cult/tome/library, /turf/open/floor/plasteel/dark, /area/library) "cAU" = ( @@ -53889,7 +52646,6 @@ /area/maintenance/department/engine) "cBM" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/chapel/office) "cBT" = ( @@ -53923,9 +52679,8 @@ /turf/open/floor/plasteel/white, /area/engine/gravity_generator) "cCI" = ( -/obj/machinery/atmospherics/components/binary/circulator{ - dir = 4; - icon_state = "circ-off-0" +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 8 }, /turf/open/floor/engine, /area/engine/engineering) @@ -54005,19 +52760,26 @@ icon_state = "platingdmg3" }, /area/maintenance/department/science) +"cFy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/suit_storage_unit/exploration, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel, +/area/science/shuttledock) "cFB" = ( /obj/effect/landmark/carpspawn, /turf/open/space/basic, /area/space) "cFQ" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 4 - }, /obj/machinery/door/poddoor/shutters/preopen{ id = "engsm"; name = "Radiation Chamber Shutters" }, +/obj/machinery/atmospherics/pipe/manifold4w/orange/visible, +/obj/effect/spawner/structure/window/plasma/reinforced, /turf/open/floor/plating, /area/engine/supermatter) "cHS" = ( @@ -54054,18 +52816,24 @@ }, /turf/open/floor/plasteel, /area/science/explab) -"cMn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "cNb" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/science/robotics/lab) +"cNk" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/suit_storage_unit/exploration, +/turf/open/floor/plasteel, +/area/science/shuttledock) "cNN" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/ausbushes/ppflowers, @@ -54184,6 +52952,20 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"cVs" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/three, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) +"cXz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/science/shuttledock) "cXW" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -54199,6 +52981,13 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel/dark, /area/maintenance/disposal/incinerator) +"dak" = ( +/obj/machinery/door/poddoor{ + id = "burn_vent"; + name = "Burn Chamber Emergency Vent" + }, +/turf/open/floor/engine, +/area/engine/supermatter) "dar" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -54249,24 +53038,17 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) -"ddl" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/hallway/secondary/entry) "deQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/engine, /area/engine/engineering) "dfr" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 9 }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/floor/plating, +/area/engine/supermatter) "dgg" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -54309,13 +53091,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/department/engine) -"dhA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "dir" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 5 @@ -54346,6 +53121,16 @@ }, /turf/open/floor/plating, /area/science/xenobiology) +"dnX" = ( +/obj/machinery/advanced_airlock_controller{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume{ + dir = 8 + }, +/turf/open/floor/plating, +/area/science/shuttledock) "doo" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -54384,7 +53169,7 @@ }, /area/hallway/secondary/exit/departure_lounge) "dpb" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_y = 3 }, @@ -54471,18 +53256,7 @@ dir = 1; pixel_y = 2 }, -/obj/structure/table/glass, -/obj/item/reagent_containers/glass/beaker/large{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = -2 - }, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 2; - pixel_y = -6 - }, +/obj/machinery/modular_fabricator/component_printer, /turf/open/floor/plasteel/dark, /area/science/lab) "duQ" = ( @@ -54508,14 +53282,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/zone2) -"dwv" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) "dxc" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -54528,26 +53294,13 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) -"dxg" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "dyg" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) -"dys" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "dAl" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -54566,7 +53319,6 @@ "dAF" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/science/mixing) @@ -54576,6 +53328,13 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"dBW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/cargo) "dHh" = ( /obj/structure/sign/poster/official/random{ pixel_y = -32 @@ -54612,6 +53371,13 @@ "dMB" = ( /turf/open/floor/plasteel, /area/quartermaster/sorting) +"dOi" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/supermatter) "dOU" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -54652,11 +53418,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/security/execution/transfer) -"dVJ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/science/shuttledock) "dWk" = ( /obj/machinery/door/airlock{ id_tag = "PottySci"; @@ -54677,7 +53438,6 @@ "dYQ" = ( /obj/effect/spawner/structure/window/plasma/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/supermatter) "dZj" = ( @@ -54698,6 +53458,36 @@ }, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) +"ebk" = ( +/obj/structure/table, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/storage/box/syringes, +/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/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/reagent_containers/spray/cleaner, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/glove_box, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "ebD" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -54706,6 +53496,13 @@ }, /turf/open/floor/plating, /area/lawoffice) +"edh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/science/shuttledock) "edl" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -54722,11 +53519,6 @@ /obj/structure/chair/office/light, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"een" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/science/shuttledock) "eex" = ( /obj/effect/landmark/start/botanist, /obj/effect/turf_decal/stripes/line{ @@ -54777,10 +53569,6 @@ /obj/structure/reagent_dispensers/peppertank{ pixel_y = 30 }, -/obj/machinery/keycard_auth{ - pixel_x = -26; - pixel_y = 26 - }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "eeQ" = ( @@ -54796,12 +53584,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "efu" = ( @@ -54809,18 +53592,6 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/plasteel/dark, /area/science/explab) -"efU" = ( -/obj/machinery/light/small, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/frame/computer{ - desc = "Looks like the board never made it to this one."; - dir = 8; - name = "shuttle console frame" - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "ekU" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, @@ -54832,6 +53603,13 @@ "emV" = ( /turf/open/space, /area/space/nearstation) +"enW" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/photocopier, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) "esC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54855,39 +53633,16 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/engineering) "etH" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/mixing) -"euQ" = ( -/obj/machinery/door/airlock/research{ - name = "Shuttle dock"; - req_access_txt = "47" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "evB" = ( /obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/engineering) "ewl" = ( @@ -54907,12 +53662,7 @@ /turf/open/floor/plasteel/dark, /area/security/prison) "eyv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/maintenance, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/department/science) @@ -54982,6 +53732,15 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating, /area/maintenance/department/science) +"eCS" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "eDz" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -55004,6 +53763,33 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/engine, /area/engine/engineering) +"eDT" = ( +/obj/docking_port/stationary{ + dir = 4; + dwidth = 5; + height = 7; + id = "exploration_home"; + name = "Exploration Dock"; + roundstart_template = /datum/map_template/shuttle/exploration; + width = 13 + }, +/turf/open/space/basic, +/area/space) +"eEo" = ( +/obj/structure/fans/tiny, +/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 = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/engine, +/area/engine/supermatter) "eEp" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -55016,6 +53802,20 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"eFC" = ( +/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/modular_computer/console/preset/curator, +/turf/open/floor/plasteel/dark, +/area/library) "eGh" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /obj/structure/lattice/catwalk, @@ -55042,11 +53842,6 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) -"eKK" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/engine/atmos) "eLt" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/neutral{ @@ -55153,19 +53948,6 @@ /obj/structure/flora/ausbushes/ywflowers, /turf/open/floor/grass, /area/hallway/primary/fore) -"eUk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "eVy" = ( /obj/effect/turf_decal/arrows{ dir = 8 @@ -55192,12 +53974,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "eYr" = ( @@ -55217,7 +53994,6 @@ /area/science/explab) "eZr" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -55228,36 +54004,8 @@ name = "Surgical Room" }, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/department/science) -"fbk" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "fbC" = ( /obj/machinery/atmospherics/components/trinary/filter, /turf/open/floor/plasteel/dark, @@ -55304,16 +54052,15 @@ /turf/open/floor/plasteel, /area/construction/mining/aux_base) "fhM" = ( -/obj/item/storage/secure/safe{ - pixel_x = -22 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /obj/structure/cable/yellow{ - icon_state = "2-4" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +/obj/structure/disposalpipe/segment{ + dir = 9 }, -/obj/structure/disposalpipe/segment, /turf/open/floor/carpet, /area/security/detectives_office) "fjs" = ( @@ -55365,13 +54112,6 @@ dir = 1 }, /area/hallway/secondary/exit/departure_lounge) -"fnC" = ( -/obj/machinery/door/airlock/external, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/science/shuttledock) "fon" = ( /obj/structure/lattice, /obj/structure/grille, @@ -55406,7 +54146,7 @@ "frN" = ( /obj/machinery/air_sensor/atmos/sm_core, /obj/machinery/power/supermatter_crystal/engine, -/turf/open/floor/engine/airless, +/turf/open/floor/engine, /area/engine/supermatter) "fsA" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ @@ -55415,10 +54155,8 @@ /turf/open/floor/engine, /area/engine/engineering) "ftb" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1 - }, /obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/components/trinary/mixer, /turf/open/floor/engine, /area/engine/engineering) "ftW" = ( @@ -55431,7 +54169,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/quartermaster/office) "fuO" = ( @@ -55468,7 +54206,6 @@ "fvj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -55504,13 +54241,6 @@ }, /turf/closed/wall, /area/science/mixing) -"fwB" = ( -/obj/machinery/door/airlock/external, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/science/shuttledock) "fwI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ @@ -55519,7 +54249,9 @@ /turf/open/floor/plating, /area/maintenance/department/cargo) "fyF" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, /turf/open/floor/engine, /area/engine/engineering) "fAx" = ( @@ -55534,6 +54266,13 @@ }, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"fAM" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engineering) "fBp" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/orange/visible/layer3, @@ -55555,12 +54294,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/exit/departure_lounge) "fBz" = ( @@ -55577,13 +54311,20 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/science/mixing) "fBJ" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/open/space/basic, /area/space) +"fCu" = ( +/obj/structure/closet/emcloset, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/cargo) "fDm" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8 @@ -55592,16 +54333,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) -"fDs" = ( -/obj/machinery/advanced_airlock_controller{ - dir = 1; - pixel_y = -24 - }, -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume{ - dir = 4 - }, -/turf/open/floor/plating, -/area/science/shuttledock) "fFo" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55615,12 +54346,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "fFv" = ( @@ -55654,7 +54380,6 @@ /area/crew_quarters/dorms) "fIT" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/chapel/main/monastery) "fNd" = ( @@ -55674,18 +54399,6 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/department/cargo) "fPM" = ( @@ -55715,9 +54428,19 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"fTg" = ( +/obj/machinery/power/apc/auto_name/south{ + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) "fTY" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -55790,6 +54513,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "gaH" = ( @@ -55814,6 +54538,13 @@ }, /turf/open/floor/grass, /area/hydroponics) +"gcW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/department/cargo) "gdJ" = ( /obj/structure/table/glass, /obj/item/folder/blue, @@ -55880,11 +54611,8 @@ name = "Research and Development Desk"; req_one_access_txt = "7;29" }, -/obj/machinery/autolathe, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/modular_fabricator/autolathe, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/lab) "giI" = ( @@ -55921,7 +54649,7 @@ /turf/open/floor/plasteel/dark, /area/maintenance/disposal/incinerator) "gkR" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/structure/extinguisher_cabinet{ pixel_y = 30 }, @@ -56052,6 +54780,10 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"gtN" = ( +/obj/machinery/telecomms/broadcaster/preset_exploration, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) "gue" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -56086,7 +54818,6 @@ /area/maintenance/department/security/brig) "gwL" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/quartermaster/storage) "gxe" = ( @@ -56234,7 +54965,7 @@ /area/engine/engineering) "gKz" = ( /obj/structure/table/wood, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22"; pixel_y = 8 }, @@ -56299,10 +55030,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"gPS" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "gPV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -56316,17 +55043,14 @@ "gQM" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/hidden, /turf/open/floor/plasteel, -/area/space) +/area/hallway/secondary/entry) "gRv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "gSH" = ( @@ -56343,17 +55067,10 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) -"gVn" = ( -/obj/structure/closet/crate/science, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "gXg" = ( /obj/item/extinguisher, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /turf/open/floor/plating, /area/maintenance/department/science) @@ -56373,6 +55090,13 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"hbK" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/vendor/exploration, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "heC" = ( /obj/machinery/power/apc/highcap/five_k{ dir = 8; @@ -56423,6 +55147,11 @@ }, /turf/open/floor/engine, /area/engine/supermatter) +"hhc" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating/airless, +/area/science/shuttledock) "hhi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/engine, @@ -56437,12 +55166,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "hhS" = ( @@ -56455,12 +55179,6 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) "hiY" = ( @@ -56480,6 +55198,11 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"hjz" = ( +/obj/effect/turf_decal/stripes/line, +/mob/living/simple_animal/bot/cleanbot/medbay, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "hjR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/brown{ @@ -56549,18 +55272,13 @@ /obj/machinery/camera/emp_proof{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer3, +/obj/machinery/atmospherics/components/unary/portables_connector/layer1, +/obj/machinery/portable_atmospherics/canister/toxins, /turf/open/floor/engine, /area/engine/engineering) "hrU" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/toxins, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/camera/emp_proof{ - c_tag = "Engineering Port Aft"; - dir = 1 - }, +/obj/machinery/igniter/on, /turf/open/floor/engine, /area/engine/engineering) "hsK" = ( @@ -56626,6 +55344,9 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "hwj" = ( @@ -56726,33 +55447,17 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/hallway/secondary/entry) -"hDk" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "hDG" = ( /obj/machinery/door/airlock/engineering{ name = "Auxillary Base Construction"; - req_access_txt = "0"; - req_one_access_txt = "32;47;48" + req_one_access_txt = "72" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/construction/mining/aux_base) "hEU" = ( @@ -56773,30 +55478,6 @@ /obj/structure/grille/broken, /turf/open/space, /area/space) -"hFv" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "hFy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -56809,6 +55490,13 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"hGA" = ( +/obj/effect/landmark/start/exploration, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "hGE" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -56821,6 +55509,24 @@ }, /turf/open/floor/engine, /area/engine/engineering) +"hGN" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/suit/apron/surgical, +/obj/machinery/light_switch{ + pixel_x = -22 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/surgical_drapes, +/obj/item/glove_box, +/turf/open/floor/plasteel/white, +/area/medical/surgery) "hHr" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -56828,6 +55534,17 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"hIo" = ( +/obj/machinery/suit_storage_unit/exploration, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light_switch{ + pixel_x = -25; + pixel_y = -4 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) "hKm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/brown{ @@ -56855,12 +55572,6 @@ /area/security/brig) "hKx" = ( /obj/machinery/door/airlock/maintenance, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/department/engine) "hKQ" = ( @@ -56878,13 +55589,20 @@ /area/hallway/secondary/entry) "hMa" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating/airless, /area/maintenance/disposal/incinerator) "hMS" = ( /obj/structure/flora/junglebush/b, /turf/open/floor/grass, /area/hallway/primary/central) +"hNF" = ( +/obj/machinery/door/airlock/grunge{ + name = "Chapel Access"; + opacity = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) "hOx" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -56903,7 +55621,6 @@ /area/maintenance/department/cargo) "hOM" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -56946,21 +55663,8 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/department/cargo) -"hSM" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "hTr" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -57012,6 +55716,12 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"hVL" = ( +/obj/machinery/computer/objective{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) "hXt" = ( /obj/effect/spawner/room/tenxten, /turf/open/floor/plating, @@ -57169,11 +55879,8 @@ /area/maintenance/department/engine) "ika" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/machinery/meter, -/obj/effect/turf_decal/arrows/red{ - dir = 1; - icon_state = "arrows_red"; - pixel_x = -5 +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 }, /turf/open/floor/engine, /area/engine/engineering) @@ -57182,11 +55889,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/maintenance/department/engine) -"ilw" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/maintenance/department/engine) "ilD" = ( /obj/machinery/processor/slime, /turf/open/floor/plasteel/white, @@ -57247,7 +55949,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/yellow, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/aft) "iuM" = ( @@ -57278,6 +55980,14 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, /area/bridge) +"iye" = ( +/obj/machinery/camera/motion{ + c_tag = "Telecomms Server Room"; + dir = 1; + network = list("tcomms") + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) "iyg" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -57288,16 +55998,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) -"iyD" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/toxins, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) "iyJ" = ( /obj/effect/spawner/structure/window/plasma/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -57309,6 +56009,17 @@ }, /turf/open/floor/plating, /area/engine/engineering) +"iyX" = ( +/obj/machinery/suit_storage_unit/exploration, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) "izB" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod" @@ -57333,21 +56044,6 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/engine/engineering) -"iBo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) "iBq" = ( /obj/machinery/atmospherics/pipe/layer_manifold, /obj/structure/lattice, @@ -57365,6 +56061,16 @@ }, /turf/open/floor/plating/airless, /area/tcommsat/computer) +"iBP" = ( +/obj/machinery/door/airlock/external, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/cargo) "iCV" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -57436,14 +56142,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/open/floor/engine, /area/engine/engineering) -"iMp" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/hallway/secondary/entry) "iPj" = ( /obj/machinery/igniter{ id = "xenoigniter"; @@ -57510,7 +56211,7 @@ /obj/machinery/atmospherics/pipe/simple/purple/visible{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/meter, /turf/open/floor/engine, /area/engine/engineering) "iSz" = ( @@ -57525,21 +56226,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/security/brig) -"iTf" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/crew_quarters/dorms) "iUE" = ( /obj/machinery/atmospherics/pipe/simple/purple/visible{ dir = 9 @@ -57556,7 +56242,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating/airless, /area/maintenance/department/engine) "iWI" = ( @@ -57580,7 +56265,6 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ dir = 4 }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/engineering) "jab" = ( @@ -57633,6 +56317,16 @@ }, /turf/open/floor/engine, /area/engine/engineering) +"jeo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/engine, +/area/engine/engineering) "jeq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -57659,10 +56353,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) "jhe" = ( @@ -57741,15 +56432,11 @@ /obj/machinery/door/airlock/public/glass{ name = "Cryogenic Lounge" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/cryopods) "jlQ" = ( @@ -57758,10 +56445,6 @@ name = "Hideout" }, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/department/security/brig) "jlT" = ( @@ -57785,12 +56468,53 @@ }, /turf/open/floor/engine, /area/engine/engineering) +"jmI" = ( +/obj/effect/turf_decal/arrows/red{ + dir = 1; + icon_state = "arrows_red"; + pixel_x = -5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engineering) +"jmN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/engine, +/area/engine/engineering) "jmY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/closed/wall, /area/hallway/secondary/exit/departure_lounge) +"joO" = ( +/obj/effect/turf_decal/arrows/white{ + pixel_x = 5 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"jpg" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5 + }, +/obj/effect/turf_decal/arrows/red{ + dir = 1; + icon_state = "arrows_red"; + pixel_x = -5 + }, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engineering) "jrG" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -57823,7 +56547,7 @@ /obj/structure/sign/plaques/deempisi{ pixel_y = 28 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_y = 3 }, @@ -57880,20 +56604,9 @@ id = "xenobiomain"; name = "containment blast door" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/xenobiology) -"jwC" = ( -/obj/structure/sign/warning/vacuum/external, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/hallway/secondary/entry) "jxl" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -57908,7 +56621,6 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "jyb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/red, /obj/machinery/firealarm{ dir = 4; @@ -57917,12 +56629,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"jyR" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/purple{ +"jyK" = ( +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/plasteel/white, +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/landmark/start/exploration, +/turf/open/floor/plasteel, /area/science/shuttledock) "jza" = ( /obj/effect/turf_decal/tile/yellow, @@ -57950,7 +56665,6 @@ /area/construction/mining/aux_base) "jAN" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -57972,7 +56686,7 @@ /obj/structure/sign/poster/random{ pixel_y = 32 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-17" }, /obj/structure/sign/poster/official/random{ @@ -57984,7 +56698,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "jCL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, /turf/closed/wall, @@ -57993,7 +56707,7 @@ /obj/machinery/atmospherics/pipe/simple/purple/visible{ dir = 8 }, -/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/engine, /area/engine/engineering) "jEx" = ( @@ -58006,21 +56720,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"jEX" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "jFw" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -58067,14 +56766,19 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard) +"jMx" = ( +/obj/structure/sign/warning/radiation/rad_area, +/turf/closed/wall/r_wall, +/area/engine/supermatter) "jMS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/spawner/xmastree, /turf/open/floor/carpet, /area/library) -"jOe" = ( -/turf/open/floor/engine/airless, -/area/engine/supermatter) +"jOb" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "jOB" = ( /turf/open/floor/plating, /area/storage/emergency/starboard) @@ -58117,12 +56821,6 @@ dir = 1 }, /area/hallway/secondary/exit/departure_lounge) -"jSc" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "jSA" = ( /obj/structure/sign/departments/science, /turf/closed/wall, @@ -58176,11 +56874,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) -"jYb" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/security/main) "jYe" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -58197,6 +56890,9 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"jYA" = ( +/turf/open/space/basic, +/area/science/shuttledock) "jZG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/red, @@ -58232,7 +56928,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -58245,6 +56941,20 @@ }, /turf/closed/wall/r_wall, /area/science/mixing/chamber) +"kfp" = ( +/obj/machinery/power/apc{ + dir = 4; + name = "Head of Personnel APC"; + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/item/kirbyplants{ + icon_state = "plant-24" + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) "kfM" = ( /obj/structure/closet, /obj/machinery/light/small{ @@ -58292,6 +57002,15 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"klG" = ( +/obj/machinery/advanced_airlock_controller{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/cargo) "kmn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, @@ -58318,12 +57037,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "kpK" = ( @@ -58400,6 +57114,7 @@ dir = 4 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/engine/engineering) "kvj" = ( @@ -58449,26 +57164,8 @@ }, /turf/open/floor/carpet, /area/lawoffice) -"kxm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/security/brig) "kxs" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plating, @@ -58498,7 +57195,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, -/turf/open/floor/engine/airless, +/turf/open/floor/engine, /area/engine/supermatter) "kAa" = ( /obj/structure/chair{ @@ -58581,7 +57278,7 @@ /area/tcommsat/computer) "kFu" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -58629,10 +57326,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/engine, /area/engine/engineering) -"kHw" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/floor/engine, -/area/engine/engineering) "kIm" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ @@ -58655,10 +57348,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "kJo" = ( @@ -58706,10 +57396,11 @@ }, /area/maintenance/department/science) "kPj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/cable/yellow{ + icon_state = "1-8" }, -/turf/closed/wall, +/turf/open/floor/plating, /area/maintenance/department/cargo) "kPx" = ( /obj/effect/spawner/structure/window/reinforced, @@ -58759,12 +57450,17 @@ /area/science/xenobiology) "kRY" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 8 }, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) +"kSr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "kSw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -58775,11 +57471,9 @@ /turf/open/floor/plasteel, /area/engine/engineering) "kSx" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump{ - dir = 1 - }, -/obj/machinery/advanced_airlock_controller{ - pixel_y = -26 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable/yellow{ + icon_state = "1-2" }, /turf/open/floor/plating, /area/maintenance/department/cargo) @@ -58806,19 +57500,6 @@ }, /turf/open/floor/plating, /area/storage/emergency/port) -"kUc" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) "kUs" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -58871,7 +57552,6 @@ /area/space/nearstation) "lcZ" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/gateway) "ldQ" = ( @@ -58927,33 +57607,16 @@ }, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) -"llf" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) "llI" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 6 }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/floor/plating, +/area/engine/supermatter) "lms" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -58989,10 +57652,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library/lounge) "lsI" = ( @@ -59017,13 +57677,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"lwG" = ( -/obj/machinery/conveyor_switch{ - id = "SciLoad" +"ltK" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/power/apc/auto_name/east, -/obj/structure/cable/yellow, -/obj/effect/turf_decal/tile/purple{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/white, @@ -59159,6 +57817,15 @@ }, /turf/open/floor/plating, /area/storage/emergency/starboard) +"lLK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) "lME" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/machinery/vending/cola, @@ -59241,15 +57908,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) -"lUp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "lWy" = ( /turf/open/floor/plating, /area/maintenance/department/science) @@ -59347,6 +58005,14 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"mbG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/layer3, +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/engine, +/area/engine/engineering) "mcf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -59360,6 +58026,12 @@ /obj/machinery/power/port_gen/pacman, /turf/open/floor/plating, /area/engine/engineering) +"mcx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "mdL" = ( /obj/structure/table, /obj/item/paper_bin, @@ -59373,14 +58045,14 @@ /turf/open/floor/plasteel/white, /area/science/lab) "meF" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ +/obj/machinery/atmospherics/pipe/layer_manifold/visible{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/open/floor/engine, /area/engine/engineering) "meY" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/solars/starboard) "mgX" = ( @@ -59396,6 +58068,18 @@ }, /turf/open/space/basic, /area/space/nearstation) +"mlx" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/sign/painting/library_private{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/library) "mmv" = ( /obj/machinery/door/airlock/engineering{ name = "Engineering Supplies"; @@ -59405,12 +58089,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/engine/engineering) "mpm" = ( @@ -59475,7 +58154,6 @@ name = "blast door" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/execution/transfer) "mtI" = ( @@ -59547,10 +58225,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "mzl" = ( @@ -59576,7 +58251,6 @@ /turf/open/floor/plating, /area/security/checkpoint/engineering) "mCZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/red, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, @@ -59614,17 +58288,11 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) "mIr" = ( /obj/effect/decal/remains/human, -/turf/open/floor/engine/airless, +/turf/open/floor/engine, /area/engine/supermatter) "mKc" = ( /obj/structure/bookcase/random/nonfiction, @@ -59711,7 +58379,6 @@ /area/science/xenobiology) "mRy" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -59810,6 +58477,8 @@ dir = 4; light_color = "#e8eaff" }, +/obj/machinery/atmospherics/components/binary/pump/layer3, +/obj/machinery/atmospherics/components/binary/pump/layer1, /turf/open/floor/engine, /area/engine/engineering) "nfz" = ( @@ -59863,8 +58532,15 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/office) +"nlM" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "nlO" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -59945,6 +58621,9 @@ c_tag = "Engineering Port Aft"; dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, /turf/open/floor/engine, /area/engine/engineering) "nuv" = ( @@ -59957,23 +58636,13 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) -"nuG" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +"nwg" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/atmospherics/components/unary/heat_exchanger{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) -"nwg" = ( -/obj/machinery/atmospherics/components/binary/circulator/cold{ - dir = 8; - icon_state = "circ-off-0" - }, /turf/open/floor/engine, /area/engine/engineering) "nxB" = ( @@ -60008,7 +58677,7 @@ /turf/open/floor/plasteel/white/corner, /area/hallway/primary/central) "nyO" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/machinery/light/small{ @@ -60090,6 +58759,19 @@ /obj/machinery/atmospherics/components/unary/vent_pump/siphon, /turf/open/floor/plating, /area/chapel/main/monastery) +"nGE" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/research/glass{ + name = "science shuttle dock"; + req_one_access_txt = "49" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "nHc" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -60126,7 +58808,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel/white, /area/science/lab) "nIX" = ( @@ -60264,9 +58946,9 @@ /area/engine/atmos) "nVg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 + dir = 4 }, -/turf/closed/wall, +/turf/open/floor/plating, /area/maintenance/department/cargo) "nVz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -60276,19 +58958,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"nWG" = ( -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/department/crew_quarters/dorms) "nWP" = ( /obj/effect/turf_decal/loading_area{ dir = 4 @@ -60304,7 +58973,6 @@ "nYn" = ( /obj/structure/sign/warning/docking, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -60450,12 +59118,6 @@ name = "Firing Range Target" }, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plating{ icon_state = "platingdmg3" }, @@ -60487,10 +59149,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/primary) "ooh" = ( @@ -60529,6 +59188,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "opE" = ( @@ -60537,11 +59197,6 @@ /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plating, /area/hallway/secondary/entry) -"oqW" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/maintenance/department/crew_quarters/dorms) "ory" = ( /obj/machinery/light{ dir = 4 @@ -60593,24 +59248,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/engine, /area/engine/engineering) -"oul" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) "ous" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/loading_area{ @@ -60635,20 +59272,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"ouP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) "ovF" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/ausbushes/fullgrass, @@ -60671,7 +59294,6 @@ /area/storage/primary) "ozv" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -60690,7 +59312,6 @@ "oAW" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/engineering) "oBb" = ( @@ -60743,7 +59364,6 @@ /area/engine/engineering) "oDG" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/solars/port) "oDP" = ( @@ -60775,8 +59395,8 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "oFa" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 9 +/obj/machinery/atmospherics/components/trinary/filter{ + dir = 1 }, /turf/open/floor/engine, /area/engine/engineering) @@ -60807,14 +59427,14 @@ /turf/closed/wall/r_wall, /area/engine/engineering) "oIC" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/plating, -/area/engine/supermatter) +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) "oIZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -60849,6 +59469,13 @@ icon_state = "platingdmg3" }, /area/maintenance/department/science) +"oKO" = ( +/obj/machinery/atmospherics/components/binary/circulator/cold{ + dir = 8; + icon_state = "circ-off-0" + }, +/turf/open/floor/engine, +/area/engine/engineering) "oLR" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -60927,6 +59554,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 9 }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/open/floor/engine, /area/engine/engineering) "oSc" = ( @@ -61024,7 +59652,8 @@ /turf/open/space, /area/space/nearstation) "oXU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/meter, /turf/open/floor/engine, /area/engine/engineering) "oYj" = ( @@ -61061,7 +59690,7 @@ /turf/open/floor/plating, /area/maintenance/department/engine) "paI" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/visible, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) "pbm" = ( @@ -61099,14 +59728,14 @@ /turf/open/floor/plating, /area/science/explab) "pes" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 1 - }, /obj/machinery/door/poddoor/shutters/preopen{ id = "engsm"; name = "Radiation Chamber Shutters" }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, /turf/open/floor/plating, /area/engine/supermatter) "pfz" = ( @@ -61117,7 +59746,6 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/execution/transfer) "pfP" = ( @@ -61130,22 +59758,6 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"pgP" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/security/brig) "phJ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -61157,6 +59769,22 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"pjZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/science/shuttledock) +"pkd" = ( +/obj/machinery/computer/shuttle_flight/custom_shuttle/exploration{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) "pkM" = ( /obj/machinery/door/airlock/external{ req_access_txt = "22" @@ -61190,6 +59818,13 @@ }, /turf/open/floor/circuit/telecomms, /area/science/xenobiology) +"poT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/engine, +/area/engine/engineering) "pps" = ( /turf/closed/wall, /area/engine/break_room) @@ -61205,9 +59840,8 @@ "prr" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/airalarm/directional/south, -/obj/machinery/modular_computer/console/preset/engineering{ - dir = 1; - icon_state = "console" +/obj/machinery/computer/atmos_control/tank/sm{ + dir = 1 }, /turf/open/floor/engine, /area/engine/engineering) @@ -61249,17 +59883,8 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/department/engine) -"pyY" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/science/xenobiology) "pAb" = ( /obj/machinery/power/emitter, /obj/machinery/light{ @@ -61277,6 +59902,12 @@ }, /turf/open/floor/engine, /area/engine/engineering) +"pEt" = ( +/obj/item/chair, +/obj/item/cigbutt/roach, +/mob/living/simple_animal/hostile/retaliate/goose/vomit, +/turf/open/floor/plating, +/area/maintenance/department/engine) "pEL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -61321,20 +59952,14 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "pGo" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "2-4" }, /turf/open/floor/plating, /area/maintenance/department/cargo) -"pHk" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "pHm" = ( /obj/machinery/door/airlock/public/glass{ name = "Departure Lounge" @@ -61343,10 +59968,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "pHo" = ( @@ -61465,7 +60087,6 @@ /area/engine/engineering) "pRg" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, @@ -61485,22 +60106,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) -"pSX" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/science/mixing) -"pTv" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance/three, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "pWb" = ( /obj/structure/lattice, /obj/structure/lattice, @@ -61582,7 +60187,7 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "pXT" = ( -/obj/item/twohanded/required/kirbyplants, +/obj/item/kirbyplants, /obj/machinery/power/apc{ areastring = "/area/lawoffice"; dir = 8; @@ -61624,24 +60229,17 @@ /mob/living/simple_animal/butterfly, /turf/open/floor/grass, /area/hallway/primary/central) -"qaY" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) +"qbB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/engine, +/area/engine/engineering) "qbF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/on{ dir = 8; icon_state = "vent_map_on-2" }, -/turf/open/floor/engine/airless, +/turf/open/floor/engine, /area/engine/supermatter) "qbZ" = ( /obj/structure/rack, @@ -61703,12 +60301,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/xenobiology) "qdy" = ( @@ -61732,13 +60325,13 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"qgw" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/turf_decal/arrows/white{ - pixel_x = 5 +"qfZ" = ( +/obj/machinery/door/poddoor{ + id = "sm_vent"; + name = "supermatter core blast door" }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/floor/engine/airless, +/area/engine/supermatter) "qgB" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "SupermatterExternal"; @@ -61753,6 +60346,10 @@ }, /turf/open/floor/plating, /area/engine/engineering) +"qgF" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/closed/wall/r_wall, +/area/engine/supermatter) "qjx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line, @@ -61768,6 +60365,12 @@ }, /turf/open/floor/engine, /area/engine/engineering) +"qll" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "qmc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 8 @@ -61786,21 +60389,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"qqG" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "qqN" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -61811,38 +60399,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"qrj" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "SciLoad" - }, -/obj/structure/plasticflaps/opaque, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/science/shuttledock) -"qrp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "qrw" = ( /obj/machinery/disposal/deliveryChute{ dir = 8 @@ -61862,8 +60418,9 @@ /turf/open/floor/engine, /area/engine/engineering) "qsx" = ( -/obj/machinery/power/generator, -/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/heat_exchanger{ + dir = 8 + }, /turf/open/floor/engine, /area/engine/engineering) "qsL" = ( @@ -61893,12 +60450,7 @@ id = "xenobiomain"; name = "containment blast door" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "qtO" = ( @@ -61915,44 +60467,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"qtS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) -"qul" = ( -/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/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating{ - luminosity = 2 - }, -/area/maintenance/department/science) "qux" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, @@ -61971,6 +60485,10 @@ /obj/item/cigbutt, /turf/open/floor/plating, /area/maintenance/department/cargo) +"qAS" = ( +/obj/machinery/telecomms/receiver/preset_exploration, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) "qDJ" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/engine, @@ -62083,7 +60601,6 @@ id = "executionfireblast"; name = "blast door" }, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/security/execution/transfer) "qOE" = ( @@ -62125,16 +60642,6 @@ /obj/machinery/atmospherics/pipe/manifold/cyan/hidden, /turf/open/floor/plating, /area/hallway/secondary/entry) -"qRt" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "qSa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 6 @@ -62144,13 +60651,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"qSi" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "qUw" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -62186,12 +60686,7 @@ id = "xenobiomain"; name = "containment blast door" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "qWG" = ( @@ -62215,11 +60710,6 @@ }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) -"qXj" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/crew_quarters/fitness/recreation) "qXq" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, @@ -62252,6 +60742,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) "qYi" = ( @@ -62288,6 +60779,12 @@ }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) +"qZJ" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) "rar" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -62301,12 +60798,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/sleeper) "rax" = ( @@ -62316,12 +60808,6 @@ }, /turf/open/floor/plating, /area/maintenance/disposal) -"rbC" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/science/shuttledock) "rbX" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -62334,6 +60820,11 @@ "rdI" = ( /turf/open/floor/light/colour_cycle, /area/crew_quarters/bar) +"ree" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engineering) "reV" = ( /obj/structure/grille/broken, /obj/structure/lattice, @@ -62430,10 +60921,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/crew_quarters/bar) "rlV" = ( @@ -62443,16 +60931,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"rnh" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "SciLoad" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/science/shuttledock) "rnr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -62534,21 +61012,33 @@ /obj/machinery/atmospherics/components/binary/pump/on{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer3{ + dir = 9 + }, /turf/open/floor/engine, /area/engine/engineering) "rtO" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/engine, /area/engine/engineering) "rui" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/shuttledock) +"ruT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) "rvH" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=2"; @@ -62615,10 +61105,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/sleeper) "rBh" = ( @@ -62633,21 +61120,6 @@ /obj/effect/spawner/room/fivexfour, /turf/open/floor/plating, /area/maintenance/department/science) -"rFd" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) "rFq" = ( /obj/structure/chair, /obj/item/reagent_containers/food/snacks/donkpocket, @@ -62673,14 +61145,13 @@ /obj/machinery/photocopier, /turf/open/floor/plasteel, /area/security/main) -"rIj" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance/two, -/obj/effect/turf_decal/tile/purple{ +"rIS" = ( +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) +/obj/machinery/atmospherics/pipe/layer_manifold/visible, +/turf/open/floor/engine, +/area/engine/engineering) "rJg" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -62725,7 +61196,6 @@ dir = 4 }, /obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/engine/engineering) "rMd" = ( @@ -62743,7 +61213,6 @@ /area/library/lounge) "rNB" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/maintenance/department/science) "rPW" = ( @@ -62769,11 +61238,9 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "rQG" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/on{ dir = 1 }, -/obj/machinery/portable_atmospherics/canister/toxins, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, /area/engine/engineering) "rSD" = ( @@ -62787,17 +61254,10 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"rWu" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) +"rVB" = ( +/obj/machinery/telecomms/processor/preset_exploration, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) "rWE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -62828,8 +61288,11 @@ /turf/open/floor/plating, /area/storage/emergency/starboard) "rYH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/closed/wall/r_wall, +/obj/effect/turf_decal/delivery/red, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, /area/engine/supermatter) "rYY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -62838,6 +61301,7 @@ req_access_txt = "10" }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/engine/engineering) "rZZ" = ( @@ -62859,12 +61323,6 @@ }, /turf/open/floor/wood, /area/lawoffice) -"scb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "sci" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -62873,7 +61331,7 @@ /obj/machinery/door/airlock/maintenance{ name = "Auxillary Base Maintenance"; req_access_txt = "12"; - req_one_access_txt = "32;47;48" + req_one_access_txt = "72" }, /obj/structure/cable/yellow{ icon_state = "4-8" @@ -62899,12 +61357,6 @@ }, /turf/open/space, /area/space/nearstation) -"sew" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum/external, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/hallway/secondary/entry) "sgc" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/tile/neutral{ @@ -62934,13 +61386,10 @@ /turf/closed/wall, /area/maintenance/department/security/brig) "slE" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ +/obj/machinery/atmospherics/components/binary/pump{ dir = 8 }, /turf/open/floor/engine, @@ -62962,6 +61411,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/department/science) +"spZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/engine, +/area/engine/engineering) "sqh" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -62979,7 +61438,7 @@ /area/hallway/secondary/exit/departure_lounge) "srZ" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /turf/open/floor/plating, /area/maintenance/disposal) @@ -63001,6 +61460,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "sut" = ( @@ -63057,16 +61519,23 @@ /area/security/execution/transfer) "szO" = ( /obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, +/obj/machinery/button/door{ + id = "sm_vent"; + name = "Supermatter Core Vent"; + pixel_x = 6; + pixel_y = -24; + req_access_txt = "10" + }, /obj/machinery/button/door{ id = "engsm"; name = "Radiation Shutters Control"; + pixel_x = -6; pixel_y = -24; req_access_txt = "10" }, @@ -63091,7 +61560,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/central) "sBA" = ( @@ -63110,12 +61579,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/brig) -"sEB" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/science/shuttledock) "sEN" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -63147,6 +61610,9 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 8 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/engine, /area/engine/engineering) "sJp" = ( @@ -63176,21 +61642,18 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) "sMY" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/effect/turf_decal/arrows/red{ - dir = 1; - icon_state = "arrows_red"; - pixel_x = -5 - }, /turf/open/floor/engine, /area/engine/engineering) +"sNj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor/window, +/turf/open/floor/plating, +/area/science/shuttledock) "sNz" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -63222,12 +61685,19 @@ /turf/open/floor/plating, /area/quartermaster/storage) "sRi" = ( -/obj/structure/closet/emcloset, +/obj/structure/table, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 + dir = 4 }, /turf/open/floor/plating, /area/maintenance/department/cargo) +"sTS" = ( +/obj/machinery/atmospherics/components/binary/circulator{ + dir = 4; + icon_state = "circ-off-0" + }, +/turf/open/floor/engine, +/area/engine/engineering) "sUP" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -63245,8 +61715,9 @@ /turf/open/floor/plasteel/white, /area/ai_monitored/turret_protected/ai) "sWU" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 5 +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 }, /turf/open/floor/engine, /area/engine/engineering) @@ -63280,6 +61751,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/chapel/office) "taA" = ( @@ -63352,17 +61824,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"teO" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 6; - height = 6; - id = "science_station"; - name = "science shuttle dock"; - width = 9 - }, -/turf/open/space/basic, -/area/space) "tfw" = ( /obj/structure/cable/yellow{ icon_state = "0-2" @@ -63389,7 +61850,6 @@ /turf/closed/wall, /area/maintenance/department/security/brig) "thf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/red, /obj/machinery/camera{ c_tag = "Medbay Recovery Room"; @@ -63428,7 +61888,6 @@ "tjE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 8 }, @@ -63446,13 +61905,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"tlb" = ( -/obj/machinery/door/airlock/external, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/science/shuttledock) "tlw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, @@ -63475,8 +61927,7 @@ id = "aux_base_shutters"; name = "Public Shutters Control"; pixel_x = -26; - req_access_txt = "0"; - req_one_access_txt = "32;47;48" + req_one_access_txt = "72" }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/tile/yellow, @@ -63485,28 +61936,12 @@ }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) -"tow" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/maintenance/department/security/brig) "tpb" = ( /obj/item/reagent_containers/food/snacks/donut, /turf/open/floor/plating{ icon_state = "panelscorched" }, /area/maintenance/department/security/brig) -"tqD" = ( -/obj/structure/plasticflaps/opaque, -/obj/machinery/conveyor{ - dir = 8; - id = "SciLoad" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/science/shuttledock) "tqX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow{ @@ -63551,9 +61986,15 @@ /area/engine/engineering) "tvj" = ( /obj/structure/window/reinforced/fulltile, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/library/lounge) +"tvE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "tvP" = ( /obj/effect/spawner/room/fivexfour, /turf/open/floor/plating, @@ -63568,17 +62009,18 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/hallway/primary/fore) "txf" = ( -/obj/machinery/autolathe, +/obj/machinery/modular_fabricator/autolathe, /obj/machinery/door/window/westleft{ dir = 2; name = "Cargo Desk"; req_access_txt = "50" }, /obj/effect/turf_decal/stripes/box, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "typ" = ( @@ -63592,8 +62034,15 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"tzu" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor/window, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/science/shuttledock) "tzZ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/structure/fans/tiny, /obj/machinery/door/airlock/engineering/glass/critical{ heat_proof = 1; @@ -63625,9 +62074,16 @@ /obj/docking_port/stationary/public_mining_dock, /turf/open/floor/plating, /area/construction/mining/aux_base) -"tGA" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +"tDl" = ( +/turf/open/floor/plasteel/white, +/area/science/shuttledock) +"tGE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/recharger, +/turf/open/floor/plasteel, /area/science/shuttledock) "tHk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -63637,6 +62093,19 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"tHO" = ( +/obj/machinery/telecomms/hub/preset/exploration, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"tIB" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "tJe" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 @@ -63651,7 +62120,7 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/green{ dir = 1 }, @@ -63679,12 +62148,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/department/engine) -"tTG" = ( -/obj/machinery/door/airlock/research{ - name = "Shuttle dock"; - req_access_txt = "47" +"tTQ" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/white, @@ -63716,6 +62184,18 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"tWe" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"tXm" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "tXn" = ( /obj/structure/sink{ dir = 4; @@ -63740,19 +62220,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"tYr" = ( -/obj/machinery/light/broken{ - dir = 8 - }, -/obj/structure/closet/crate/radiation, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "uah" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 5 @@ -63829,6 +62296,10 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark, /area/bridge) +"ujt" = ( +/obj/structure/lattice, +/turf/closed/wall, +/area/science/shuttledock) "ujI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ @@ -63860,7 +62331,7 @@ /obj/item/gun/energy/e_gun/dragnet, /obj/item/gun/energy/e_gun/dragnet, /obj/item/beacon/nettingportal, -/obj/item/gun/grenadelauncher, +/obj/item/gun/grenadelauncher/security, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) "ulY" = ( @@ -63886,12 +62357,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "uos" = ( @@ -64000,18 +62466,6 @@ icon_state = "4-8" }, /obj/effect/spawner/lootdrop/maintenance, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/department/security/brig) "uzn" = ( @@ -64066,11 +62520,6 @@ }, /turf/closed/wall/r_wall, /area/science/server) -"uGf" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating/airless, -/area/science/shuttledock) "uHG" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -64133,6 +62582,13 @@ }, /turf/open/floor/plating, /area/engine/engineering) +"uNt" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/shuttledock) "uNW" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -64185,12 +62641,6 @@ dir = 4 }, /obj/machinery/door/airlock/maintenance, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/department/science) "uUQ" = ( @@ -64223,6 +62673,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/open/floor/plating, /area/maintenance/department/cargo) "uXG" = ( @@ -64301,12 +62754,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/xenobiology) "vgy" = ( @@ -64340,6 +62788,16 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"vjv" = ( +/obj/effect/landmark/start/exploration, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "vjH" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/tile/yellow, @@ -64353,16 +62811,20 @@ /obj/structure/sign/warning, /turf/closed/wall/r_wall, /area/science/explab) -"vlG" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/maintenance/department/engine) "vmG" = ( /obj/machinery/atmospherics/components/trinary/filter, /turf/open/floor/engine, /area/science/explab) +"vmY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer3, +/obj/machinery/atmospherics/components/unary/portables_connector, +/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer1, +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/engine, +/area/engine/engineering) "vov" = ( /obj/machinery/atmospherics/pipe/manifold/purple/visible{ dir = 4 @@ -64403,24 +62865,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"vtl" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "vtT" = ( /obj/effect/spawner/room/threexthree, /turf/open/floor/plating, @@ -64477,26 +62921,15 @@ /turf/open/floor/plating, /area/maintenance/department/cargo) "vzz" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/door/airlock/external, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) +/turf/open/floor/plating, +/area/maintenance/department/cargo) "vzP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, @@ -64548,7 +62981,6 @@ /area/maintenance/department/security/brig) "vEe" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/bridge) @@ -64556,10 +62988,7 @@ /obj/structure/chair/wood/normal{ dir = 1 }, -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1481; - name = "Confessional Intercom"; +/obj/item/radio/intercom/chapel{ pixel_x = 26 }, /turf/open/floor/plasteel/dark, @@ -64629,12 +63058,13 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) +"vOW" = ( +/obj/machinery/telecomms/bus/preset_exploration, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) "vRi" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -64714,10 +63144,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/science/mixing) "vVP" = ( @@ -64772,30 +63199,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"waI" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) "wcs" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -64817,14 +63220,6 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/department/engine) "wdp" = ( @@ -64867,24 +63262,9 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"wgd" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "whH" = ( /obj/structure/chair/wood/normal, -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1481; - name = "Confessional Intercom"; +/obj/item/radio/intercom/chapel{ pixel_x = -26 }, /turf/open/floor/plasteel/dark, @@ -64905,10 +63285,6 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) "wjl" = ( @@ -64924,6 +63300,12 @@ /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer3{ + dir = 4 + }, /turf/open/floor/engine, /area/engine/engineering) "wkZ" = ( @@ -64946,7 +63328,6 @@ "wlu" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 5 }, @@ -64967,14 +63348,12 @@ /turf/closed/wall, /area/science/mixing) "wpI" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/engine, /area/engine/engineering) "wqu" = ( @@ -65028,10 +63407,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "wxb" = ( @@ -65055,6 +63434,23 @@ }, /turf/open/floor/plasteel/dark, /area/security/brig) +"wxQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/vending/wallmed{ + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/anesthetic_machine, +/turf/open/floor/plasteel/white, +/area/medical/surgery) "wzd" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, @@ -65128,11 +63524,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) -"wEc" = ( -/obj/machinery/door/firedoor/window, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/shuttledock) "wEn" = ( /obj/machinery/door/airlock/public/glass{ name = "Departure Lounge" @@ -65146,12 +63537,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white/corner{ dir = 1 }, @@ -65162,17 +63548,10 @@ }, /turf/open/floor/plating, /area/maintenance/department/science) -"wGv" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/department/science) +"wJG" = ( +/obj/machinery/telecomms/relay/preset/exploration, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) "wKa" = ( /obj/machinery/light/small, /obj/machinery/advanced_airlock_controller{ @@ -65249,10 +63628,13 @@ /turf/open/floor/plating, /area/maintenance/department/engine) "wNL" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/engine, /area/engine/engineering) "wOa" = ( @@ -65339,6 +63721,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/machinery/modular_computer/console/preset/engineering{ + dir = 1; + icon_state = "console" + }, /turf/open/floor/engine, /area/engine/engineering) "wUf" = ( @@ -65347,7 +63733,6 @@ /area/storage/emergency/port) "wUg" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -65425,33 +63810,28 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit/departure_lounge) -"xbI" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/turf/open/floor/plating, -/area/quartermaster/miningdock) "xdI" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/primary/central) "xdO" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/engine, /area/engine/engineering) "xee" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) "xef" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, +/obj/structure/table, +/obj/item/flashlight/lamp, /turf/open/floor/plating, /area/maintenance/department/cargo) "xeB" = ( @@ -65511,7 +63891,6 @@ /turf/open/floor/plating, /area/maintenance/department/engine) "xjo" = ( -/obj/machinery/meter, /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, @@ -65594,6 +63973,16 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"xrF" = ( +/obj/effect/landmark/start/exploration, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "xtg" = ( /obj/structure/flora/ausbushes/brflowers, /mob/living/simple_animal/chick, @@ -65688,21 +64077,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, /area/engine/engineering) -"xze" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) "xzn" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1 @@ -65723,6 +64097,12 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"xBd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "xDj" = ( /obj/structure/sign/poster/official/random{ pixel_x = -32 @@ -65832,18 +64212,6 @@ icon_state = "4-8" }, /obj/effect/spawner/lootdrop/maintenance, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/department/engine) "xLi" = ( @@ -65866,38 +64234,20 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/lawoffice) "xNa" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, /turf/open/floor/plating, /area/maintenance/department/engine) -"xOu" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "SciLoad" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "xOC" = ( /obj/machinery/door/airlock/external{ name = "Construction Zone"; - req_access_txt = "0"; - req_one_access_txt = "0" + req_one_access_txt = "72" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plating, @@ -65929,10 +64279,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/storage/emergency/port) "xSX" = ( @@ -65956,6 +64303,16 @@ }, /turf/open/floor/plating, /area/engine/engineering) +"xUr" = ( +/obj/machinery/door/airlock/research/glass{ + name = "science shuttle dock"; + req_one_access_txt = "49" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/shuttledock) "xVc" = ( /obj/effect/turf_decal/tile/green{ dir = 4 @@ -65963,15 +64320,13 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "xVD" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/meter, /turf/open/floor/engine, /area/engine/engineering) "xVV" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -65994,21 +64349,6 @@ }, /turf/open/floor/plasteel, /area/storage/primary) -"xXd" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) -"xXo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/shuttledock) "xXN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 9 @@ -66052,10 +64392,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/department/security/brig) "yfO" = ( @@ -66091,9 +64427,18 @@ /area/maintenance/department/cargo) "yjg" = ( /obj/effect/turf_decal/stripes/line, -/obj/machinery/computer/atmos_control/tank/sm{ +/obj/machinery/camera/emp_proof{ + c_tag = "Engineering Port Aft"; dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/button/door{ + id = "burn_vent"; + name = "Burn Chamber Vent"; + pixel_x = 6; + pixel_y = -24; + req_access_txt = "10" + }, /turf/open/floor/engine, /area/engine/engineering) "yjI" = ( @@ -78649,8 +76994,8 @@ bWV bWV bWV bWV -cwM -bIT +emV +mZE aaa aaa aaa @@ -78908,7 +77253,7 @@ cww bWV fIT fIT -cxg +mZE aaa aaa aaa @@ -79165,7 +77510,7 @@ bXJ crj cwO fIT -cxh +mZE aaa aaa aaa @@ -79389,7 +77734,7 @@ aaa aaa aaa aaa -bVp +mZE cfN cfN bZY @@ -79423,7 +77768,7 @@ bXJ bXJ fIT fIT -cxg +mZE aaa aaa aaa @@ -79645,7 +77990,7 @@ aaa aaa aaa aaa -bGI +mZE bNs cfN cqW @@ -79902,7 +78247,7 @@ aaa aaa aaa aaa -bGI +mZE bNs cfN cfN @@ -80159,7 +78504,7 @@ aaa aaa aaa aaa -bGI +mZE bNs cqW bOw @@ -80194,7 +78539,7 @@ bXJ bXJ fIT fIT -cxg +mZE aaa aaa aaa @@ -80416,7 +78761,7 @@ aby aby aby aby -cqU +mZE bNs bUC bOw @@ -80450,7 +78795,7 @@ bXJ cwG cwO fIT -cxk +mZE aaa aaa aaa @@ -80591,14 +78936,14 @@ aaa aaa aaa aiu -tow -tow -tow +ait +ait +ait aiu aiu -tow -tow -tow +ait +ait +ait aiu aiu aht @@ -80672,7 +79017,7 @@ aaa aby aaa aaa -bOv +abI bNs bNs bWh @@ -80707,7 +79052,7 @@ cwz bWV fIT fIT -cxg +mZE aaa aaa aaa @@ -80927,8 +79272,8 @@ aaa aaa aaa abI -bGD -bQQ +emV +emV bNs bNs bQe @@ -80962,8 +79307,8 @@ bWV bWV bWV bWV -cwR -cwR +mZE +mZE aaa aaa aaa @@ -81183,7 +79528,7 @@ aby aby aby aaa -bNr +abI bNs bNs bNs @@ -81436,10 +79781,10 @@ aaa aby aaa aaa -bOv -bGD -bOv -bQQ +abI +emV +abI +emV bNs bNs bOw @@ -81692,7 +80037,7 @@ aaa aaa aed abI -bNr +abI bNs bNs bNs @@ -81868,10 +80213,10 @@ aaa aaa aaa aaa -tow -tow -tow -tow +ait +ait +ait +ait aiu aiu aaa @@ -81948,7 +80293,7 @@ bHI aby aby aby -bGH +emV bNs bNs bOw @@ -82125,7 +80470,7 @@ aaa aaa aaa aaa -tow +ait ajD ajD ajD @@ -82200,12 +80545,12 @@ aaa aaa aaa aaa -bGD -bGD -bIT -bJZ -bIT -bMr +emV +emV +mZE +aht +mZE +mZE bNs bOw bOw @@ -82382,14 +80727,14 @@ aaa aaa aaa aaa -tow +ait ajD ajD ajD ajD aiu -tow -tow +ait +ait aiu lMU aiu @@ -82896,17 +81241,17 @@ aaa aaa aaa aaa -tow +ait ajD ajD ajD ajD aiu -tow -tow +ait +ait aiu hOx -bZZ +aDm aDm aDm ujI @@ -83153,7 +81498,7 @@ aaa adR adR adR -tow +ait ajD ajD ajD @@ -83179,8 +81524,8 @@ axC aiu aiu aiu -tow -tow +ait +ait aiu aaa aaa @@ -83438,7 +81783,7 @@ ajD ajD ajD oTC -tow +ait aaa abN aaa @@ -83485,7 +81830,7 @@ aaa aaa aaa aaa -bGH +emV bGE bIX bKd @@ -83695,7 +82040,7 @@ aDm aDm mLB ajD -tow +ait aht aht aht @@ -83742,7 +82087,7 @@ aaa aaa aaa aaa -bGI +mZE bHM bHM bHM @@ -83952,7 +82297,7 @@ sih fNd aCg ajD -tow +ait aaa aaa aaa @@ -84000,7 +82345,7 @@ aaa aaa aaa aaa -bHN +mZE bGE bKe bLr @@ -84240,10 +82585,10 @@ aaa aaa aaa aaa -ddl -ddl -ddl -ddl +aZx +aZx +aZx +aZx aaa aaa aaa @@ -84257,7 +82602,7 @@ aaa aaa aaa aaa -bGI +mZE bGE bKf bLn @@ -84283,7 +82628,7 @@ bWV crY csk bWV -cbR +hNF bWV cfm ceP @@ -84324,7 +82669,7 @@ ckH ckH cAa cAg -cAt +eFC ckH cAa cAV @@ -84477,7 +82822,7 @@ vZa stU wwr hwd -kUc +wwr xZX vVP jGo @@ -84497,10 +82842,10 @@ aaa aaa aaa aaa -ddl +aZx baJ bon -ddl +aZx aaa aaa aaa @@ -84514,7 +82859,7 @@ aaa aaa aaa aaa -bGI +mZE bGE bKg bLn @@ -84752,12 +83097,12 @@ aaa aaa aaa aaa -sew -dwv +jzz +kIm wlu baK bon -ddl +aZx aaa aaa aaa @@ -84771,7 +83116,7 @@ aaa aaa aaa aaa -bGI +mZE bHM bGE bGE @@ -84779,8 +83124,8 @@ bHM bNA bHM abI -bQi -bQR +abI +emV bNs bNs bOw @@ -84796,7 +83141,7 @@ bOw bUC bOw bQg -cbR +hNF bXJ cdA ctx @@ -84839,7 +83184,7 @@ czO cli ckH cAy -cAB +mlx cyU cjp aht @@ -85014,7 +83359,7 @@ rkw gZo baK bon -ddl +aZx aaa aaa aaa @@ -85029,12 +83374,12 @@ aaa aaa aaa aaa -bIY -bIY -bLs -bMy +aht +aht +abI +abI bNB -bMy +abI abI aby abI @@ -85053,7 +83398,7 @@ bOw bOw bOw bQg -cbR +hNF bXJ cdB cfm @@ -85266,12 +83611,12 @@ aaa aaa aaa aaa -ddl +aZx hLe gMj bbT rZZ -ddl +aZx aaa aaa aaa @@ -85296,8 +83641,8 @@ aht aby aby abI -bSn -bSZ +emV +abI cqS bNs bQe @@ -85523,12 +83868,12 @@ aaa aaa aaa aaa -ddl +aZx bkQ nyy baK oJC -ddl +aZx aaa aaa aaa @@ -85561,7 +83906,7 @@ bNs bNs bUC bOw -crl +bOw bOw bOw bOw @@ -85780,12 +84125,12 @@ aaa aaa aaa aaa -ddl +aZx bkR bnp baL oJC -ddl +aZx aaa aaa aaa @@ -85814,7 +84159,7 @@ aaa abI aaa aaa -bQR +emV bNs bNs bNs @@ -86037,12 +84382,12 @@ aaa aaa aaa aaa -ddl +aZx bkS qfG baK boo -ddl +aZx aaa aaa aaa @@ -86072,9 +84417,9 @@ abI abI aht abI -bSZ -bSZ -cre +abI +abI +mZE bNs bNs bNs @@ -86294,12 +84639,12 @@ aaa aaa aaa aaa -ddl +aZx kIm qQR bno oJC -ddl +aZx aaa aaa aaa @@ -86332,7 +84677,7 @@ aaa aaa abI aaa -bSZ +abI ahi bNs bOw @@ -86556,7 +84901,7 @@ rkw krm gQM oJC -ddl +aZx aaa aaa btK @@ -86571,14 +84916,14 @@ mZE mZE bva bva -ilw -ilw +bIZ +bIZ bva -ilw -ilw +bIZ +bIZ bva -ilw -ilw +bIZ +bIZ bva bva aht @@ -86808,16 +85153,16 @@ aaa aaa aaa aaa -sew +jzz jOX jzz bnp oJC -ddl -ddl -jwC +aZx +aZx +bsl btL -ddl +aZx aaa aaa aaa @@ -86848,18 +85193,18 @@ abI aaa abI ahi -bSZ -crO -crO -crO -crO -crO -crO -crO -crO -crO -crO -crO +abI +mZE +mZE +mZE +mZE +mZE +mZE +mZE +mZE +mZE +mZE +mZE cfN cfN cfN @@ -87038,7 +85383,7 @@ aiu aiu aiu aHC -pgP +aIH ofX aiu aiu @@ -87076,7 +85421,7 @@ hAT bcX cTs aYG -iMp +aZx aYG bAJ bBX @@ -87109,9 +85454,9 @@ abI aaa bva bva -ilw -ilw -ilw +bIZ +bIZ +bIZ aaa aaa aaa @@ -87290,10 +85635,10 @@ aAe aBc aCh eQZ -eQZ -aFk aFU -kxm +aFk +eQZ +eQZ gjq aiu iSz @@ -87317,10 +85662,10 @@ baK baN aYG aYG -ddl -ddl -ddl -ddl +aZx +aZx +aZx +aZx aYG aYG baN @@ -87364,11 +85709,11 @@ aht cdm abI aaa -ilw +bIZ bDi bDi cif -ilw +bIZ aaa aaa aaa @@ -87548,8 +85893,8 @@ aBd aBd aBd aBd -aBd aFV +aiu oEA oEA oEA @@ -87621,11 +85966,11 @@ crm cry abI aaa -ilw +bIZ bDi bDi bDi -ilw +bIZ aaa aaa aaa @@ -87878,11 +86223,11 @@ bva crz bva aaa -ilw +bIZ bDi bDi bDi -ilw +bIZ aaa aaa aaa @@ -88137,7 +86482,7 @@ xNa aaa bva bva -rWu +bZt bva bva aaa @@ -88393,9 +86738,9 @@ crB bvu aaa aaa -ilw +bIZ csy -vlG +bQl cqX cqX ctS @@ -88621,7 +86966,7 @@ bwt byc bzD bAM -xze +bvb bvb bEo bDi @@ -88902,7 +87247,7 @@ npE npE fHG npE -ouP +vGg bZr pYJ caa @@ -88910,7 +87255,7 @@ bXa bRD bWl cdE -ilw +bIZ mZE aaa aaa @@ -89168,8 +87513,8 @@ bva bva bva bva -ilw -ilw +bIZ +bIZ bva bva bva @@ -89393,7 +87738,7 @@ btS bwu bAO bnv -bDk +pEt bmf bDi bva @@ -89664,7 +88009,7 @@ bGN bPs bva bWk -qaY +bRD nfz npE oZW @@ -89831,8 +88176,8 @@ aaa aby abI agP -jYb -jYb +agQ +agQ agP ahL ahL @@ -89928,7 +88273,7 @@ lGv bva bva bva -iBo +bDi bva bDi nzD @@ -90344,7 +88689,7 @@ aaa aaa aby aaa -jYb +agQ ahd ahq ahq @@ -90601,7 +88946,7 @@ aaa aaa aby aaa -jYb +agQ ahd ahq cnT @@ -90858,7 +89203,7 @@ aaa afJ aby aaa -jYb +agQ ahd ahq ahq @@ -91372,7 +89717,7 @@ aaa aaa aby aaa -jYb +agQ ahd ahq ahq @@ -91629,7 +89974,7 @@ aaa aaa aby aaa -jYb +agQ cnP ahq ahq @@ -91886,7 +90231,7 @@ aaa aaa aby aaa -jYb +agQ cnQ ahq cnV @@ -91988,7 +90333,7 @@ bZt bva bva bva -oul +nzD bva bva bva @@ -92401,9 +90746,9 @@ aaa aby abI agP -jYb -jYb -jYb +agQ +agQ +agQ agP agP agP @@ -92490,7 +90835,7 @@ aaI bEr bva bva -llf +pwj bva bva bva @@ -92752,7 +91097,7 @@ bKH bKH bKH bKH -rFd +bKH bKH iyg lIr @@ -93073,7 +91418,7 @@ aaa aaa abI aaa -aaa +abI aaa aaa aaa @@ -93247,7 +91592,7 @@ bwH rAZ bzR bzR -bBb +hjz bDr bEx bkh @@ -93331,10 +91676,10 @@ adR adR adR adR -aaa +adR adR aaa -aaa +adR aaa aaa aaa @@ -93587,11 +91932,11 @@ aaa aaa abI aaa +abI aaa aaa -adR -aaa aaa +adR aaa aaa aaa @@ -93699,7 +92044,7 @@ alM amz ank anT -ajs +aqF apl apR aqF @@ -93766,7 +92111,7 @@ bDr bEz bnF buh -bIg +ebk bjc bKx bLH @@ -93845,6 +92190,8 @@ cmB cmB cmB cmB +cmB +cmB cny adR abI @@ -93875,8 +92222,6 @@ aaa aaa aaa aaa -aaa -aaa "} (109,1,1) = {" aaa @@ -93956,7 +92301,7 @@ alN alN alN anW -ajs +aqF apm apR aqG @@ -94100,6 +92445,8 @@ cna cmR cnj cmK +vOW +cmR cnr cmB aaa @@ -94132,8 +92479,6 @@ aaa aaa aaa aaa -aaa -aaa "} (110,1,1) = {" aaa @@ -94357,6 +92702,8 @@ cnb cmK cnk cmK +tHO +cmK cns cmB aaa @@ -94389,8 +92736,6 @@ aaa aaa aaa aaa -aaa -aaa "} (111,1,1) = {" aaa @@ -94614,6 +92959,8 @@ cmK cmK cnl cmK +qAS +cmK cnt cmB aaa @@ -94646,8 +92993,6 @@ aaa aaa aaa aaa -aaa -aaa "} (112,1,1) = {" aaa @@ -94800,7 +93145,7 @@ bKA bLK bMM bjc -waI +bCz bPB bPB bRc @@ -94871,7 +93216,9 @@ cnc cmK cmK cmK -cnu +cmK +cmK +iye cmB abI adR @@ -94903,8 +93250,6 @@ aaa aaa aaa aaa -aaa -aaa "} (113,1,1) = {" aaa @@ -95128,6 +93473,8 @@ cmK cmK cnm cmK +gtN +cmK cnv cmB aaa @@ -95160,8 +93507,6 @@ aaa aaa aaa aaa -aaa -aaa "} (114,1,1) = {" aaa @@ -95385,6 +93730,8 @@ cnd cmK cnn cmK +wJG +cmK cnw cmB aaa @@ -95417,8 +93764,6 @@ aaa aaa aaa aaa -aaa -aaa "} (115,1,1) = {" aaa @@ -95642,6 +93987,8 @@ cne cmU cno cmK +rVB +cmU cnx cmB aaa @@ -95674,8 +94021,6 @@ aaa aaa aaa aaa -aaa -aaa "} (116,1,1) = {" aaa @@ -95901,6 +94246,8 @@ cmB cmB cmB cmB +cmB +cmB cnz adR abI @@ -95931,8 +94278,6 @@ aaa aaa aaa aaa -aaa -aaa "} (117,1,1) = {" aaa @@ -96110,15 +94455,15 @@ ljX ulY pAS hlT -iLr -ulY -ulY +upf +fyF +fAM jEe jEe -nxB -ulY +jeo +hhi xdO -wqF +poT nsL cbj cdm @@ -96157,11 +94502,11 @@ aaa aaa abI aaa +abI aaa aaa -adR -aaa aaa +adR aaa aaa aaa @@ -96339,7 +94684,7 @@ bFU bIo bJu bKE -bLM +hGN bMN bFU bCz @@ -96367,16 +94712,16 @@ taF ulY nxB ulY -upf cgZ cgZ -dhA +cgZ +iRh iRh szO -rYH -tzZ -oIC +mZR tzZ +lYf +eEo dYQ vSC ahi @@ -96415,10 +94760,10 @@ adR adR adR adR -aaa +adR adR aaa -aaa +adR aaa aaa aaa @@ -96625,7 +94970,7 @@ gzb nxB fsA sWj -sWj +iLr sWj sWj sWj @@ -96671,7 +95016,7 @@ aaa aaa abI aaa -aaa +abI aaa aaa aaa @@ -96882,7 +95227,7 @@ cfu jlT mFV ulY -ulY +cgZ ulY ulY gJq @@ -97107,7 +95452,7 @@ bDy bEJ bFW bHe -bIr +wxQ bJx bJx bLP @@ -97139,7 +95484,7 @@ cfx hGE xvV cfY -cfY +oIC cfY cfY cfY @@ -97396,7 +95741,7 @@ xEh lGo qGg oDp -oDp +rYH oDp oDp oDp @@ -97404,8 +95749,8 @@ uAt wdK mIr frN -jOe -mZR +cnW +qfZ abI aht aht @@ -97653,11 +95998,11 @@ wAS xEx pQT wqF +slE wqF wqF -wqF -wqF -xEx +jmN +spZ lYf kzB kzB @@ -97912,7 +96257,7 @@ nQt cCI ika sMY -sMY +ree qkM uRk mZR @@ -98164,19 +96509,19 @@ bXk rSD jEx rtO -slE -aQy -qsx -ulY -ulY +nxB ulY +qsx +jmI +sTS +jpg hsO mXs -kHw +oFa oFa llI rQG -cbj +jMx aaa aaa aaa @@ -98420,20 +96765,20 @@ cdc cdX rSD cet -tno +aQy sIS xVD nwg -qgw -qgw -qgw -fyF -wpI -sWU +xVD +agn +qZJ ulY -ciI +wpI +tno +tno +dOi hrU -bXk +dak abI aht aht @@ -98681,16 +97026,16 @@ tno nWT cgx sWU -ulY -ulY -ulY +cgq +oKO +joO oXU wNL ciI ftb dfr -iyD -bXk +kzB +mZR abI aaa aaa @@ -98940,14 +97285,14 @@ ulY jmB ulY ulY -ulY -gJq +hsO +qbB oQL meF yjg -bXk -bXk -bXk +qgF +tWe +mZR abI aht abI @@ -99369,7 +97714,7 @@ aAH aBB aCR aDT -aEM +enW aFA aGv aHi @@ -99452,10 +97797,10 @@ qrw htk cfY kbV -cfY +mbG hqF -cfY -cfY +vmY +rIS nfj rtG wTX @@ -100132,7 +98477,7 @@ arS asV aua auW -awd +xdI axi aaa aaa @@ -100653,7 +98998,7 @@ abI aAH aBG aCU -aDY +kfp aER aAH aGy @@ -101163,7 +99508,7 @@ apT awh axk abI -awd +xdI aAI aBH aCW @@ -101419,8 +99764,8 @@ apT apT awi axk -awd -awd +xdI +xdI aAJ aBI aCX @@ -101494,7 +99839,7 @@ bVg bVW bWL bXu -eKK +bLW abI bMi caA @@ -102008,7 +100353,7 @@ bMf bOk bWL bXw -eKK +bLW abI bJP bJP @@ -102168,13 +100513,13 @@ aaa aaa aiS aiS -oqW -oqW -oqW +aiT +aiT +aiT aiS aiS aiS -oqW +aiT aiS aiS aaa @@ -102191,7 +100536,7 @@ avb awl xdI abI -awd +xdI aAM aBK aDa @@ -102423,7 +100768,7 @@ aaa aaa aaa aaa -oqW +aiT sbk sbk sbk @@ -102433,7 +100778,7 @@ aiS sbk sbk aiU -oqW +aiT aaa aaa cBU @@ -102450,12 +100795,12 @@ xdI abI axi aAN -awd -awd +xdI +xdI aAN aAN -awd -awd +xdI +xdI aAN aIg aJf @@ -102522,7 +100867,7 @@ bMf bOk bWL bXx -eKK +bLW abI bMi caD @@ -102702,7 +101047,7 @@ cBU cBU cBU cBU -awd +xdI axi aaa aaa @@ -102713,7 +101058,7 @@ aaa aaa aaa aaa -awd +xdI jYe aIO aJI @@ -102947,7 +101292,7 @@ aiS sbk sbk sbk -oqW +aiT aaa aaa aaa @@ -102970,7 +101315,7 @@ aaa aaa aaa aaa -awd +xdI jYe aIO aJH @@ -103194,7 +101539,7 @@ aaa aaa aaa aaa -oqW +aiT sbk sbk sbk @@ -103202,12 +101547,12 @@ sbk sbk aiS aiS -nWG +wiT aiS aiS aiS aiS -oqW +aiT aiS aiS aiS @@ -103451,7 +101796,7 @@ aaa aaa aaa aaa -oqW +aiT sbk sbk sbk @@ -103708,7 +102053,7 @@ aaa aaa aaa aaa -oqW +aiT sbk sbk sbk @@ -103965,7 +102310,7 @@ aaa aaa aaa aaa -oqW +aiT sbk sbk sbk @@ -104736,7 +103081,7 @@ aaa aaa aaa aaa -oqW +aiT sbk sbk sbk @@ -104748,9 +103093,9 @@ cBx aiS aiS aiS -oqW -oqW -oqW +aiT +aiT +aiT aiS apX cod @@ -104995,14 +103340,14 @@ aaa aaa aiS aiS -oqW -oqW -oqW +aiT +aiT +aiT aiS aiS -oqW +aiT akl -oqW +aiT aaa aaa aaa @@ -105077,7 +103422,7 @@ bHv bIJ bHw bKZ -eKK +bLW bNm bOr bPf @@ -106542,9 +104887,9 @@ aaa aaa aaa aaa -oqW +aiT akp -oqW +aiT aaa aaa aaa @@ -106803,9 +105148,9 @@ aiS cBy aiS aiS -oqW -oqW -oqW +aiT +aiT +aiT aiS aiS aiS @@ -107058,13 +105403,13 @@ aaa aaa aiT akq -iTf +ale ale ale anp ale ale -iTf +ale auo kzk eeD @@ -107317,9 +105662,9 @@ aiS aiS aiS aiS -oqW -oqW -oqW +aiT +aiT +aiT aiS aiS akn @@ -108132,7 +106477,7 @@ aaa aaa aaa aaa -xbI +bdI oPy ozv aaa @@ -108349,7 +106694,7 @@ aaa aaa aaa aaa -oqW +aiT sbk akn bdQ @@ -108606,7 +106951,7 @@ aaa aaa aaa aaa -oqW +aiT sbk akn sbk @@ -109120,7 +107465,7 @@ aaa aaa aaa aaa -oqW +aiT sbk akn sbk @@ -109377,7 +107722,7 @@ aaa aaa aaa aaa -oqW +aiT sbk akn sbk @@ -109423,7 +107768,7 @@ aaa aaa aaa aEj -hFv +bjx aEj bjw bjw @@ -109446,7 +107791,7 @@ noM bIN dAF wUg -pSX +bCV bNq bOu aht @@ -109636,19 +107981,19 @@ aaa aaa aiS aiS -mFX +avn aiS atn -atn -atn -avm -vzz -avm -avm -vzz -avm -avm -atn +aur +aur +aur +aur +aur +aur +aur +aur +aur +aur atn aFi aFi @@ -109682,7 +108027,7 @@ aEj aEj oTl vzP -eUk +vzP iWV aFi bpq @@ -109894,23 +108239,23 @@ aaa aiS sbk akn -aiU -aiS -bBV +sbk atn -awC -axz -ayw -azE -aAT -aBY +aur +aur +aur +aur +aur +aur +aur +aur +aur +aur atn aEj aEj aEj aEj -aEj -aEj aJs aFi aFi @@ -109960,7 +108305,7 @@ bHD fBz etH jCL -pSX +bCV ahi aht aht @@ -110150,24 +108495,24 @@ aaa aaa aiS sbk -fcx -ale -avn -ale -avn -awD -axA -ayx -azF -aAU -aBZ -aDl -aEk -aEk +akn +sbk +atn +aur +aur +aur +aur +aur +aur +aur +aur +aur +aur +atn pGo aEk aEk -qqG +aEk aJv aKn aKn @@ -110191,7 +108536,7 @@ aEj bQj aEj aEj -qrp +gfi aEj bkF bkF @@ -110407,25 +108752,25 @@ aaa aaa aiS sbk +akn sbk -sbk -aiS -aiS -atn -atn -qXj -qXj -qXj -qXj atn +aur +aur +aur +aur +aur +aur +aur +aur +aur +aur atn -aEj -aEj uWK +aFi aEj aEj -aEj -nuG +bfu aEj aEj aJs @@ -110465,7 +108810,7 @@ gdL iLl bkF bwm -wGv +xlA bwm bAF bAF @@ -110664,28 +109009,28 @@ aaa aaa aiS aiS +mFX aiS -oqW -aiS -aaa -aaa -abI -aaa -aaa -aaa -abI -abI -abI -nVg -aFg -aFR -aGO +atn +atn +atn +avm +ayw +avm +avm +ayw +avm +avm +atn +atn +uWK +aEj aEj aFi aFi fNv aEj -fbk +aJs aEj aEj aEl @@ -110919,23 +109264,23 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abI -aaa -kPj -aFh -aEj +aiS +sbk +akn +aiU +aiS +awD +atn +axz +ayx +azF +aAU +aBZ +axw +bBV +atn +aGO +uWK xef qcX ubb @@ -111176,23 +109521,23 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aiS +sbk +fcx +ale +awC +ale +awC +axA +azE +aAT +aBY +aFg +aFh dyg +aDl kSx -qcX +kPj sRi aEj aFi @@ -111433,24 +109778,24 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aEj +aiS +sbk +sbk +sbk +aiS +aiS +atn +atn +avm +avm +avm +avm +atn +atn +atn aFj -aEj -aEj +nVg +fCu aEj aEl aEj @@ -111467,7 +109812,7 @@ aUC aVE aUC aUC -hDk +aUC aZw aFi bjD @@ -111690,25 +110035,25 @@ aaa aaa aaa aaa +aiS +aiS +aiS +aiT +aiS aaa aaa +bBW aaa aaa aaa +bBW aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -ahi -ahi -ahi -aaa -aaa +aEj +aEj +vzz +dBW +aEj aaa aaa aLn @@ -111722,7 +110067,7 @@ aLm aTx aEj aEj -wgd +bfu aEj aEj baG @@ -111955,17 +110300,17 @@ aaa aaa aaa aaa -abN -aaa -aaa -aaa -aaa aaa aaa aaa aaa aaa aaa +cdm +aEj +klG +dBW +cdm aaa aaa aLm @@ -111992,7 +110337,7 @@ aEj aEj aEj aEj -qtS +bVw aEj bkF blX @@ -112218,11 +110563,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +cdm +aEl +iBP +gcW +cdm aaa aaa aLm @@ -112475,11 +110820,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +cdm +cdm +cdm +cdm +cdm aaa aaa aLo @@ -112527,7 +110872,7 @@ lWy lWy lWy bwm -qul +ros bwm izF bwm @@ -112732,7 +111077,7 @@ aaa aaa aaa aaa -aaa +bBW aaa aaa aaa @@ -114562,7 +112907,7 @@ abN aaa aEj aEj -qtS +bVw aEj bkF blX @@ -115606,16 +113951,16 @@ bkF bwm bwm vuQ -euQ +nGE vuQ vuQ vuQ vuQ -tTG +xUr vuQ -uGf -uGf -uGf +hhc +hhc +hhc aaa aaa aaa @@ -115862,17 +114207,17 @@ iPz sXR sXR pwS -dVJ -vtl -jyR -tYr -gVn -pHk -xXo -pHk -qSi -pTv -wEc +vuQ +ltK +hIo +cFy +iyX +cNk +kSr +nlM +tDl +cVs +vuQ aaa aaa aaa @@ -116109,7 +114454,7 @@ aaa aaa aaa aaa -pyY +bnd kRK cPy dir @@ -116117,19 +114462,19 @@ mTS ufa oNE oep -pyY +bnd mlr -sEB -jEX -rui -gPS -scb -cMn -jSc -dxg -xXd -pHk -dVJ +vuQ +tTQ +xrF +hGA +hGA +vjv +eCS +tIB +tXm +fTg +vuQ aaa aaa aaa @@ -116366,7 +114711,7 @@ aaa aaa aaa aaa -pyY +bnd qcD xxw lhA @@ -116374,19 +114719,19 @@ lFh ufa taA qcH -pyY +bnd nNN -dVJ -hSM -lwG -xOu -lUp -dys -dys -lUp -rIj -qRt -dVJ +vuQ +xBd +qll +rui +rui +tvE +rui +mcx +tDl +uNt +ujt aaa aaa aaa @@ -116623,7 +114968,7 @@ aTC aaa aby aaa -pyY +bnd qYq sNz nqV @@ -116631,17 +114976,17 @@ oSL hUJ riW jtf -pyY +bnd aht -dVJ -efU vuQ -qrj -fnC -wEc -tGA -fnC -tGA +jOb +hbK +ruT +jyK +lLK +vuQ +pjZ +vuQ vuQ vuQ aaa @@ -116880,7 +115225,7 @@ bkP abI aby aaa -pyY +bnd lGS nIm oEW @@ -116888,19 +115233,19 @@ iuM wXu cOp lGS -pyY +bnd aaa vuQ +sNj vuQ +pkd +hVL +tGE +sNj +dnX vuQ -rnh -fDs -vuQ -tGA -fDs -vuQ -vuQ -oex +jYA +aht aaa aaa aaa @@ -117150,14 +115495,14 @@ aaa aaa aaa vuQ -tqD -fwB -rbC -een -tlb -tGA -vuQ -oex +sNj +sNj +tzu +cXz +edh +sNj +jYA +aht aaa aaa aaa @@ -117411,10 +115756,10 @@ aaa aaa aaa aaa -teO +eDT +aaa aaa aaa -oex aaa aaa aaa diff --git a/_maps/map_files/PubbyStation/job_changes.dm b/_maps/map_files/PubbyStation/job_changes.dm index 726601725be75..8924a08de09b9 100644 --- a/_maps/map_files/PubbyStation/job_changes.dm +++ b/_maps/map_files/PubbyStation/job_changes.dm @@ -18,3 +18,8 @@ access += ACCESS_CREMATORIUM minimal_access += ACCESS_CREMATORIUM +/datum/job/exploration/New() + . = ..() + MAP_JOB_CHECK + access += ACCESS_MAINT_TUNNELS + minimal_access += ACCESS_MAINT_TUNNELS diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm index c7a32fe00f3fc..7bc833819395a 100644 --- a/_maps/map_files/debug/multiz.dmm +++ b/_maps/map_files/debug/multiz.dmm @@ -433,8 +433,8 @@ "bo" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/table, -/obj/item/screwdriver/power, -/obj/item/wirecutters/power, +/obj/item/powertool/hand_drill, +/obj/item/powertool/jaws_of_life, /turf/open/floor/plating, /area/engine/engineering) "bp" = ( @@ -1205,7 +1205,7 @@ "dO" = ( /obj/structure/table, /obj/machinery/light, -/obj/item/twohanded/fireaxe, +/obj/item/fireaxe, /obj/item/extinguisher, /turf/open/floor/plasteel, /area/storage/primary) diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 265e3c92be85f..9c8fa8ab1a014 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -448,8 +448,8 @@ /area/engine/atmos) "bo" = ( /obj/structure/table, -/obj/item/screwdriver/power, -/obj/item/wirecutters/power, +/obj/item/powertool/hand_drill, +/obj/item/powertool/jaws_of_life, /turf/open/floor/plasteel, /area/engine/engineering) "bp" = ( @@ -517,7 +517,7 @@ /turf/closed/wall/r_wall, /area/science) "bB" = ( -/obj/machinery/mecha_part_fabricator, +/obj/machinery/modular_fabricator/exosuit_fab, /turf/open/floor/plasteel, /area/science) "bC" = ( @@ -708,7 +708,7 @@ /turf/open/floor/plating, /area/hallway/primary/central) "ca" = ( -/obj/machinery/autolathe/hacked, +/obj/machinery/modular_fabricator/autolathe/hacked, /turf/open/floor/plasteel, /area/science) "cb" = ( @@ -1396,8 +1396,8 @@ height = 5; id = "laborcamp_home"; name = "fore bay 1"; - width = 9; - roundstart_template = /datum/map_template/shuttle/labour/box + roundstart_template = /datum/map_template/shuttle/labour/box; + width = 9 }, /turf/open/space/basic, /area/space) @@ -1408,8 +1408,8 @@ height = 15; id = "arrivals_stationary"; name = "arrivals"; - width = 7; - roundstart_template = /datum/map_template/shuttle/arrival/box + roundstart_template = /datum/map_template/shuttle/arrival/box; + width = 7 }, /turf/open/space/basic, /area/space) @@ -2265,7 +2265,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/computer/shuttle/mining{ +/obj/machinery/computer/shuttle_flight/mining{ dir = 2 }, /turf/open/floor/plasteel, @@ -2290,8 +2290,8 @@ height = 5; id = "mining_home"; name = "mining shuttle bay"; - width = 7; - roundstart_template = /datum/map_template/shuttle/mining/box + roundstart_template = /datum/map_template/shuttle/mining/box; + width = 7 }, /turf/open/space/basic, /area/space) @@ -2735,6 +2735,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/medical/chemistry) +"Dd" = ( +/obj/machinery/modular_fabricator/component_printer, +/turf/open/floor/plasteel, +/area/medical/chemistry) "EG" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -7589,7 +7593,7 @@ aj hD cj ct -Ce +Dd cF bE bE diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index b6385c886660e..11ca48cd0c482 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -6,2105 +6,11 @@ /turf/closed/indestructible/riveted, /area/space) "ac" = ( -/obj/structure/window/reinforced, -/turf/closed/indestructible/riveted, -/area/space) +/turf/open/indestructible/binary, +/area/tear_in_reality) "ad" = ( /turf/open/space, /area/space) -"ae" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/closed/indestructible/riveted, -/area/space) -"af" = ( -/turf/open/floor/holofloor/snow, -/area/holodeck/rec_center/winterwonderland) -"ag" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/closed/indestructible/riveted, -/area/space) -"ah" = ( -/obj/structure/foamedmetal, -/obj/structure/window{ - dir = 8 - }, -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/bunker) -"ai" = ( -/obj/structure/foamedmetal, -/obj/structure/window{ - dir = 4 - }, -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/bunker) -"aj" = ( -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/bunker) -"ak" = ( -/obj/structure/table, -/obj/item/stack/medical/ointment{ - heal_burn = 10 - }, -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/bunker) -"al" = ( -/obj/structure/table/wood{ - layer = 3.3 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-05"; - pixel_y = 4 - }, -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "wood" - }, -/area/holodeck/rec_center/lounge) -"am" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "wood" - }, -/area/holodeck/rec_center/lounge) -"an" = ( -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "wood" - }, -/area/holodeck/rec_center/lounge) -"ao" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - layer = 3.3 - }, -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "wood" - }, -/area/holodeck/rec_center/lounge) -"ap" = ( -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/wildlife) -"aq" = ( -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/offline) -"ar" = ( -/turf/open/floor/holofloor/plating/burnmix, -/area/holodeck/rec_center/burn) -"as" = ( -/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/holofloor, -/area/holodeck/rec_center/court) -"at" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/court) -"au" = ( -/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/holofloor, -/area/holodeck/rec_center/court) -"av" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/closed/indestructible/riveted, -/area/space) -"aw" = ( -/obj/structure/flora/bush, -/turf/open/floor/holofloor/snow, -/area/holodeck/rec_center/winterwonderland) -"ax" = ( -/obj/effect/holodeck_effect/mobspawner/penguin, -/obj/effect/holodeck_effect/mobspawner/penguin, -/obj/item/toy/snowball{ - pixel_y = 6 - }, -/obj/item/toy/snowball{ - pixel_x = 5 - }, -/obj/item/toy/snowball{ - pixel_x = -4 - }, -/turf/open/floor/holofloor/snow, -/area/holodeck/rec_center/winterwonderland) -"ay" = ( -/obj/structure/table, -/obj/machinery/recharger, -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/bunker) -"az" = ( -/obj/structure/table/wood, -/obj/item/storage/box/matches{ - pixel_x = -4; - pixel_y = 8 - }, -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "wood" - }, -/area/holodeck/rec_center/lounge) -"aA" = ( -/obj/structure/chair/wood/normal, -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "wood" - }, -/area/holodeck/rec_center/lounge) -"aB" = ( -/obj/effect/holodeck_effect/mobspawner, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/wildlife) -"aC" = ( -/obj/effect/holodeck_effect/sparks, -/turf/open/floor/holofloor/plating/burnmix, -/area/holodeck/rec_center/burn) -"aD" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/court) -"aE" = ( -/turf/open/floor/holofloor, -/area/holodeck/rec_center/court) -"aF" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/court) -"aG" = ( -/obj/structure/flora/grass/brown, -/turf/open/floor/holofloor/snow, -/area/holodeck/rec_center/winterwonderland) -"aH" = ( -/obj/structure/table, -/obj/item/gun/energy/laser, -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/bunker) -"aI" = ( -/obj/structure/chair/wood/normal{ - dir = 4 - }, -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "wood" - }, -/area/holodeck/rec_center/lounge) -"aJ" = ( -/obj/structure/table/wood/poker, -/obj/item/clothing/mask/cigarette/pipe, -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "wood" - }, -/area/holodeck/rec_center/lounge) -"aK" = ( -/obj/structure/table/wood/poker, -/obj/structure/table/wood/poker, -/obj/effect/holodeck_effect/cards, -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "wood" - }, -/area/holodeck/rec_center/lounge) -"aL" = ( -/obj/structure/chair/wood/normal{ - dir = 8 - }, -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "wood" - }, -/area/holodeck/rec_center/lounge) -"aM" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1 - }, -/turf/open/floor/holofloor/snow, -/area/holodeck/rec_center/winterwonderland) -"aN" = ( -/obj/structure/chair/wood/normal{ - dir = 1 - }, -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "wood" - }, -/area/holodeck/rec_center/lounge) -"aO" = ( -/obj/structure/chair/wood/wings, -/turf/open/floor/holofloor/snow, -/area/holodeck/rec_center/winterwonderland) -"aP" = ( -/obj/structure/window/reinforced/tinted{ - dir = 4 - }, -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "wood" - }, -/area/holodeck/rec_center/lounge) -"aQ" = ( -/obj/structure/window/reinforced, -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "wood" - }, -/area/holodeck/rec_center/lounge) -"aR" = ( -/obj/effect/holodeck_effect/mobspawner/penguin_baby, -/obj/structure/flora/tree/pine, -/turf/open/floor/holofloor/snow, -/area/holodeck/rec_center/winterwonderland) -"aS" = ( -/obj/structure/chair/wood, -/turf/open/floor/holofloor/snow, -/area/holodeck/rec_center/winterwonderland) -"aT" = ( -/obj/structure/table/wood, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-05"; - pixel_y = 10 - }, -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "wood" - }, -/area/holodeck/rec_center/lounge) -"aU" = ( -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "stairs-l" - }, -/area/holodeck/rec_center/lounge) -"aV" = ( -/turf/open/floor/holofloor{ - dir = 9; - icon_state = "stairs-r" - }, -/area/holodeck/rec_center/lounge) -"aW" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/court) -"aX" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/court) -"aY" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_y = 4 - }, -/turf/open/floor/holofloor/carpet, -/area/holodeck/rec_center/lounge) -"aZ" = ( -/turf/open/floor/holofloor/carpet, -/area/holodeck/rec_center/lounge) -"ba" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/turf/open/floor/holofloor/carpet, -/area/holodeck/rec_center/lounge) -"bb" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/turf/open/floor/holofloor/carpet, -/area/holodeck/rec_center/lounge) -"bc" = ( -/obj/structure/table, -/obj/item/stack/medical/bruise_pack{ - heal_brute = 10 - }, -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/bunker) -"bd" = ( -/obj/structure/table/wood, -/obj/item/instrument/violin, -/turf/open/floor/holofloor/carpet, -/area/holodeck/rec_center/lounge) -"be" = ( -/obj/structure/chair/comfy/brown{ - buildstackamount = 0; - dir = 1 - }, -/turf/open/floor/holofloor/carpet, -/area/holodeck/rec_center/lounge) -"bf" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/barman_recipes, -/obj/item/clothing/mask/cigarette/pipe, -/turf/open/floor/holofloor/carpet, -/area/holodeck/rec_center/lounge) -"bg" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/court) -"bh" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/court) -"bi" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/court) -"bj" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/closed/indestructible/riveted, -/area/space) -"bk" = ( -/obj/effect/holodeck_effect/mobspawner/bee, -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/anthophila) -"bl" = ( -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/pet_lounge) -"bm" = ( -/obj/structure/flora/ausbushes/sunnybush, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/pet_lounge) -"bn" = ( -/obj/structure/flora/ausbushes/genericbush, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/pet_lounge) -"bo" = ( -/obj/structure/table/glass, -/obj/item/surgicaldrill, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"bp" = ( -/obj/structure/table/glass, -/obj/item/hemostat, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"bq" = ( -/obj/structure/table/glass, -/obj/item/scalpel{ - pixel_y = 10 - }, -/obj/item/circular_saw, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"br" = ( -/obj/structure/table/glass, -/obj/item/retractor, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"bs" = ( -/obj/structure/table/glass, -/obj/item/stack/medical/gauze, -/obj/item/cautery, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"bt" = ( -/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/holofloor, -/area/holodeck/rec_center/basketball) -"bu" = ( -/obj/structure/holohoop{ - layer = 3.9 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"bv" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"bw" = ( -/turf/open/floor/holofloor/beach, -/area/holodeck/rec_center/beach) -"bx" = ( -/obj/structure/table, -/obj/machinery/readybutton, -/turf/open/floor/holofloor/basalt, -/area/holodeck/rec_center/thunderdome) -"by" = ( -/obj/structure/table, -/obj/item/clothing/head/helmet/thunderdome, -/obj/item/clothing/suit/armor/tdome/red, -/obj/item/clothing/under/color/red, -/obj/item/holo/esword/red, -/turf/open/floor/holofloor/basalt, -/area/holodeck/rec_center/thunderdome) -"bz" = ( -/obj/structure/table, -/turf/open/floor/holofloor/basalt, -/area/holodeck/rec_center/thunderdome) -"bA" = ( -/obj/machinery/readybutton, -/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/holofloor, -/area/holodeck/rec_center/dodgeball) -"bB" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/dodgeball) -"bC" = ( -/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/holofloor, -/area/holodeck/rec_center/dodgeball) -"bD" = ( -/obj/effect/holodeck_effect/mobspawner/pet, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/pet_lounge) -"bE" = ( -/obj/structure/flora/ausbushes/ppflowers, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/pet_lounge) -"bF" = ( -/obj/effect/holodeck_effect/mobspawner/pet, -/obj/structure/flora/ausbushes/brflowers, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/pet_lounge) -"bG" = ( -/obj/structure/table/glass, -/obj/item/surgical_drapes, -/obj/item/razor, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"bH" = ( -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"bI" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"bJ" = ( -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"bK" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"bL" = ( -/obj/effect/overlay/palmtree_r, -/turf/open/floor/holofloor/beach, -/area/holodeck/rec_center/beach) -"bM" = ( -/obj/effect/overlay/palmtree_l, -/obj/effect/overlay/coconut, -/turf/open/floor/holofloor/beach, -/area/holodeck/rec_center/beach) -"bN" = ( -/turf/open/floor/holofloor/basalt, -/area/holodeck/rec_center/thunderdome) -"bO" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/dodgeball) -"bP" = ( -/turf/open/floor/holofloor, -/area/holodeck/rec_center/dodgeball) -"bQ" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/dodgeball) -"bR" = ( -/obj/structure/flora/ausbushes/brflowers, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/pet_lounge) -"bS" = ( -/obj/item/storage/bag/easterbasket{ - name = "picnic basket"; - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/pet_lounge) -"bT" = ( -/obj/item/trash/plate, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/pet_lounge) -"bU" = ( -/obj/structure/table/optable, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"bV" = ( -/obj/machinery/computer/operating{ - dir = 8 - }, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"bW" = ( -/obj/structure/table/glass, -/obj/item/clothing/gloves/color/latex/nitrile, -/obj/item/clothing/suit/apron/surgical, -/obj/item/clothing/mask/surgical, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"bX" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"bY" = ( -/obj/effect/holodeck_effect/mobspawner/monkey, -/turf/open/floor/holofloor/beach, -/area/holodeck/rec_center/beach) -"bZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/dodgeball) -"ca" = ( -/obj/structure/flora/ausbushes/palebush, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/pet_lounge) -"cb" = ( -/obj/effect/holodeck_effect/mobspawner/pet, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/pet_lounge) -"cc" = ( -/obj/item/shovel/spade{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/pet_lounge) -"cd" = ( -/obj/structure/window{ - dir = 1 - }, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"ce" = ( -/obj/effect/holodeck_effect/mobspawner/bee, -/obj/item/clothing/head/beekeeper_head, -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/anthophila) -"cf" = ( -/obj/structure/table/glass, -/obj/machinery/reagentgrinder, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"cg" = ( -/obj/structure/table/glass, -/obj/item/storage/box/syringes{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/box/beakers, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"ch" = ( -/obj/machinery/washing_machine, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"ci" = ( -/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/holofloor, -/area/holodeck/rec_center/basketball) -"cj" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"ck" = ( -/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/holofloor, -/area/holodeck/rec_center/basketball) -"cl" = ( -/obj/item/clothing/under/color/rainbow, -/obj/item/clothing/glasses/sunglasses/advanced, -/turf/open/floor/holofloor/beach, -/area/holodeck/rec_center/beach) -"cm" = ( -/obj/structure/window, -/turf/open/floor/holofloor/basalt, -/area/holodeck/rec_center/thunderdome) -"cn" = ( -/obj/structure/window{ - dir = 1 - }, -/obj/item/toy/beach_ball/holoball/dodgeball, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/dodgeball) -"co" = ( -/obj/structure/window{ - dir = 1 - }, -/obj/item/toy/beach_ball/holoball/dodgeball, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/dodgeball) -"cp" = ( -/obj/structure/window{ - dir = 1 - }, -/obj/item/toy/beach_ball/holoball/dodgeball, -/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/holofloor, -/area/holodeck/rec_center/dodgeball) -"cq" = ( -/obj/effect/holodeck_effect/mobspawner/bee, -/obj/effect/decal/remains/human, -/obj/item/clothing/suit/beekeeper_suit, -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/anthophila) -"cr" = ( -/obj/effect/holodeck_effect/mobspawner/bee, -/obj/item/melee/flyswatter, -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/anthophila) -"cs" = ( -/obj/machinery/chem_master, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"ct" = ( -/obj/structure/table/glass, -/obj/item/healthanalyzer, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"cu" = ( -/obj/structure/closet/wardrobe/white, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"cv" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"cw" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"cx" = ( -/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/holofloor, -/area/holodeck/rec_center/basketball) -"cy" = ( -/obj/item/toy/beach_ball, -/turf/open/floor/holofloor/beach, -/area/holodeck/rec_center/beach) -"cz" = ( -/obj/structure/window{ - dir = 1 - }, -/turf/open/floor/holofloor/basalt, -/area/holodeck/rec_center/thunderdome) -"cA" = ( -/obj/structure/window, -/obj/item/toy/beach_ball/holoball/dodgeball, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/dodgeball) -"cB" = ( -/obj/structure/window, -/obj/item/toy/beach_ball/holoball/dodgeball, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/dodgeball) -"cC" = ( -/obj/structure/window, -/obj/item/toy/beach_ball/holoball/dodgeball, -/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/holofloor, -/area/holodeck/rec_center/dodgeball) -"cD" = ( -/obj/structure/sink/puddle, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/pet_lounge) -"cE" = ( -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/pet_lounge) -"cF" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"cG" = ( -/obj/item/toy/beach_ball/holoball, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"cH" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"cI" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/dodgeball) -"cJ" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/dodgeball) -"cK" = ( -/obj/machinery/hydroponics/soil, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/pet_lounge) -"cL" = ( -/obj/machinery/hydroponics/soil, -/obj/item/cultivator, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/pet_lounge) -"cM" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/holodeck_effect/mobspawner/pet, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/pet_lounge) -"cN" = ( -/obj/structure/flora/ausbushes/grassybush, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/pet_lounge) -"cO" = ( -/obj/structure/bed, -/obj/item/bedsheet/medical, -/obj/structure/window{ - dir = 1 - }, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"cP" = ( -/obj/structure/window{ - dir = 8 - }, -/obj/structure/bed, -/obj/item/bedsheet/medical, -/obj/structure/window{ - dir = 1 - }, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"cQ" = ( -/obj/structure/window{ - dir = 8 - }, -/obj/machinery/computer/pandemic, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"cR" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"cS" = ( -/turf/open/floor/holofloor/beach/coast_t, -/area/holodeck/rec_center/beach) -"cT" = ( -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/holofloor/beach/coast_t, -/area/holodeck/rec_center/beach) -"cU" = ( -/obj/item/shovel/spade, -/turf/open/floor/holofloor/beach/coast_t, -/area/holodeck/rec_center/beach) -"cV" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/dodgeball) -"cW" = ( -/obj/structure/flora/ausbushes/pointybush, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/pet_lounge) -"cX" = ( -/obj/machinery/door/window/westleft, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"cY" = ( -/turf/open/floor/holofloor/beach/coast_b, -/area/holodeck/rec_center/beach) -"cZ" = ( -/obj/structure/bed, -/obj/item/bedsheet/medical, -/obj/machinery/iv_drip, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"da" = ( -/obj/structure/window{ - dir = 8 - }, -/obj/structure/bed, -/obj/item/bedsheet/medical, -/obj/machinery/iv_drip, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"db" = ( -/obj/structure/window{ - dir = 8 - }, -/obj/machinery/stasis, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"dc" = ( -/obj/machinery/iv_drip, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"dd" = ( -/obj/machinery/stasis, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/medical) -"de" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"df" = ( -/obj/structure/holohoop{ - dir = 1; - layer = 4.1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"dg" = ( -/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/holofloor, -/area/holodeck/rec_center/basketball) -"dh" = ( -/turf/open/floor/holofloor/beach/water, -/area/holodeck/rec_center/beach) -"di" = ( -/obj/structure/table, -/obj/item/clothing/head/helmet/thunderdome, -/obj/item/clothing/suit/armor/tdome/green, -/obj/item/clothing/under/color/green, -/obj/item/holo/esword/green, -/turf/open/floor/holofloor/basalt, -/area/holodeck/rec_center/thunderdome) -"dj" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/dodgeball) -"dk" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/dodgeball) -"dl" = ( -/obj/machinery/readybutton, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/dodgeball) -"dm" = ( -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/refuel) -"dn" = ( -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/spacechess) -"do" = ( -/obj/item/banner/blue, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/thunderdome1218) -"dp" = ( -/obj/structure/table/wood/fancy, -/obj/item/clothing/suit/armor/riot/knight/blue, -/obj/item/clothing/head/helmet/knight/blue, -/obj/item/claymore/weak, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/thunderdome1218) -"dq" = ( -/obj/structure/table/wood/fancy, -/obj/item/clothing/head/crown/fancy{ - pixel_y = 6 - }, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/thunderdome1218) -"dr" = ( -/obj/structure/table/wood/fancy, -/obj/item/clothing/suit/armor/riot/knight/red, -/obj/item/clothing/head/helmet/knight/red, -/obj/item/claymore/weak, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/thunderdome1218) -"ds" = ( -/obj/item/banner/red, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/thunderdome1218) -"dt" = ( -/turf/open/floor/holofloor/hyperspace, -/area/holodeck/rec_center/kobayashi) -"du" = ( -/obj/structure/window/reinforced, -/turf/open/floor/holofloor/hyperspace, -/area/holodeck/rec_center/kobayashi) -"dv" = ( -/obj/structure/closet{ - density = 0 - }, -/obj/item/clothing/suit/judgerobe, -/obj/item/clothing/head/powdered_wig, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "dark" - }, -/area/holodeck/rec_center/chapelcourt) -"dw" = ( -/obj/structure/table/wood/fancy, -/obj/item/clothing/suit/chaplainsuit/nun, -/obj/item/clothing/head/nun_hood, -/obj/item/clothing/suit/chaplainsuit/holidaypriest, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "dark" - }, -/area/holodeck/rec_center/chapelcourt) -"dx" = ( -/obj/structure/table/wood/fancy, -/obj/item/storage/book/bible, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "dark" - }, -/area/holodeck/rec_center/chapelcourt) -"dy" = ( -/obj/structure/table/wood/fancy, -/obj/item/book/manual/wiki/security_space_law, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "dark" - }, -/area/holodeck/rec_center/chapelcourt) -"dz" = ( -/obj/structure/closet{ - name = "Evidence Closet" - }, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "dark" - }, -/area/holodeck/rec_center/chapelcourt) -"dA" = ( -/turf/open/floor/holofloor, -/area/holodeck/rec_center/school) -"dB" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/firingrange) -"dC" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/firingrange) -"dD" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/firingrange) -"dE" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/firingrange) -"dF" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/firingrange) -"dG" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/refuel) -"dH" = ( -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_viva"; - name = "Black Rook" - }, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "dark" - }, -/area/holodeck/rec_center/spacechess) -"dI" = ( -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_mime"; - name = "Black Queen" - }, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/spacechess) -"dJ" = ( -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_clown"; - name = "Black King" - }, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "dark" - }, -/area/holodeck/rec_center/spacechess) -"dK" = ( -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_ian"; - name = "Black Knight" - }, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/spacechess) -"dL" = ( -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/thunderdome1218) -"dM" = ( -/obj/structure/chair/wood/wings, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/thunderdome1218) -"dN" = ( -/obj/structure/window/reinforced, -/obj/machinery/mass_driver{ - dir = 1; - id = "trektorpedo1"; - name = "photon torpedo tube" - }, -/obj/item/toy/minimeteor{ - desc = "A primitive long-range weapon, inferior to Nanotrasen's perfected bluespace artillery."; - icon = 'icons/effects/effects.dmi'; - icon_state = "impact_laser"; - name = "photon torpedo" - }, -/turf/open/floor/holofloor/hyperspace, -/area/holodeck/rec_center/kobayashi) -"dO" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/computer/arcade/orion_trail/kobayashi, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"dP" = ( -/obj/machinery/button/massdriver/indestructible{ - id = "trektorpedo1"; - layer = 3.9; - name = "photon torpedo button"; - pixel_x = -16; - pixel_y = -5 - }, -/obj/machinery/button/massdriver/indestructible{ - id = "trektorpedo2"; - layer = 3.9; - name = "photon torpedo button"; - pixel_x = 16; - pixel_y = -5 - }, -/obj/machinery/computer/arcade/orion_trail/kobayashi, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"dQ" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/computer/arcade/orion_trail/kobayashi, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"dR" = ( -/obj/structure/window/reinforced, -/obj/machinery/mass_driver{ - dir = 1; - id = "trektorpedo2"; - name = "photon torpedo tube" - }, -/obj/item/toy/minimeteor{ - desc = "A primitive long-range weapon, inferior to Nanotrasen's perfected bluespace artillery."; - icon = 'icons/effects/effects.dmi'; - icon_state = "impact_laser"; - name = "photon torpedo" - }, -/turf/open/floor/holofloor/hyperspace, -/area/holodeck/rec_center/kobayashi) -"dS" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/holofloor{ - dir = 1; - icon_state = "chapel" - }, -/area/holodeck/rec_center/chapelcourt) -"dT" = ( -/turf/open/floor/holofloor{ - dir = 4; - icon_state = "chapel" - }, -/area/holodeck/rec_center/chapelcourt) -"dU" = ( -/obj/structure/chair, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "dark" - }, -/area/holodeck/rec_center/chapelcourt) -"dV" = ( -/turf/open/floor/holofloor{ - dir = 1; - icon_state = "chapel" - }, -/area/holodeck/rec_center/chapelcourt) -"dW" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/holofloor{ - dir = 4; - icon_state = "chapel" - }, -/area/holodeck/rec_center/chapelcourt) -"dX" = ( -/obj/structure/table/wood, -/obj/item/folder, -/obj/item/melee/classic_baton/police/telescopic, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/school) -"dY" = ( -/obj/structure/table/wood, -/obj/item/toy/crayon/white, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/school) -"dZ" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/snacks/grown/apple, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/school) -"ea" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "white" - }, -/area/holodeck/rec_center/firingrange) -"eb" = ( -/obj/structure/target_stake, -/obj/machinery/magnetic_module, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/firingrange) -"ec" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/holofloor{ - dir = 4; - icon_state = "white" - }, -/area/holodeck/rec_center/firingrange) -"ed" = ( -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_greytide"; - name = "Black Pawn" - }, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/spacechess) -"ee" = ( -/obj/item/cardboard_cutout/adaptive{ - color = "#9999BB"; - icon_state = "cutout_greytide"; - name = "Black Pawn" - }, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "dark" - }, -/area/holodeck/rec_center/spacechess) -"ef" = ( -/obj/machinery/door/window/westleft{ - dir = 2; - icon_state = "right" - }, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/thunderdome1218) -"eg" = ( -/obj/structure/window/reinforced, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/thunderdome1218) -"eh" = ( -/obj/machinery/door/window/westleft{ - dir = 2 - }, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/thunderdome1218) -"ei" = ( -/obj/structure/table/glass, -/obj/machinery/recharger, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"ej" = ( -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"ek" = ( -/obj/structure/chair/comfy{ - dir = 1 - }, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"el" = ( -/obj/structure/table/glass, -/obj/item/gun/energy/e_gun/mini/practice_phaser, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"em" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "chapel" - }, -/area/holodeck/rec_center/chapelcourt) -"en" = ( -/turf/open/floor/holofloor{ - dir = 2; - icon_state = "chapel" - }, -/area/holodeck/rec_center/chapelcourt) -"eo" = ( -/obj/item/gavelblock, -/obj/item/gavelhammer, -/obj/structure/table/wood, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "dark" - }, -/area/holodeck/rec_center/chapelcourt) -"ep" = ( -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "chapel" - }, -/area/holodeck/rec_center/chapelcourt) -"eq" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/holofloor{ - dir = 2; - icon_state = "chapel" - }, -/area/holodeck/rec_center/chapelcourt) -"er" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/holofloor{ - dir = 10; - icon_state = "white" - }, -/area/holodeck/rec_center/firingrange) -"es" = ( -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/firingrange) -"et" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/holofloor{ - dir = 6; - icon_state = "white" - }, -/area/holodeck/rec_center/firingrange) -"eu" = ( -/obj/item/weldingtool, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/refuel) -"ev" = ( -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "dark" - }, -/area/holodeck/rec_center/spacechess) -"ew" = ( -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/spacechess) -"ex" = ( -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "stairs-old" - }, -/area/holodeck/rec_center/thunderdome1218) -"ey" = ( -/obj/structure/table/wood, -/obj/item/melee/chainofcommand{ - name = "chain whip" - }, -/obj/item/twohanded/spear, -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/thunderdome1218) -"ez" = ( -/obj/structure/table/wood, -/obj/item/scythe, -/obj/item/twohanded/spear, -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/thunderdome1218) -"eA" = ( -/obj/structure/table/wood, -/obj/item/club/tailclub, -/obj/item/twohanded/spear, -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/thunderdome1218) -"eB" = ( -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "dark" - }, -/area/holodeck/rec_center/chapelcourt) -"eC" = ( -/obj/structure/table, -/obj/item/paper, -/obj/item/pen, -/obj/item/clothing/under/costume/schoolgirl, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/school) -"eD" = ( -/obj/structure/table, -/obj/item/paper, -/obj/item/pen, -/obj/item/clothing/under/costume/schoolgirl/green, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/school) -"eE" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/firingrange) -"eF" = ( -/turf/open/floor/holofloor, -/area/holodeck/rec_center/firingrange) -"eG" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/firingrange) -"eH" = ( -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/thunderdome1218) -"eI" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 4 - }, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"eJ" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"eK" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"eL" = ( -/obj/machinery/computer/station_alert{ - dir = 8 - }, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"eM" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/holofloor{ - dir = 1; - icon_state = "chapel" - }, -/area/holodeck/rec_center/chapelcourt) -"eN" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/holofloor{ - dir = 4; - icon_state = "chapel" - }, -/area/holodeck/rec_center/chapelcourt) -"eO" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/school) -"eP" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"eQ" = ( -/obj/machinery/computer/atmos_alert{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"eR" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "chapel" - }, -/area/holodeck/rec_center/chapelcourt) -"eS" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/holofloor{ - dir = 2; - icon_state = "chapel" - }, -/area/holodeck/rec_center/chapelcourt) -"eT" = ( -/obj/structure/table, -/obj/item/paper, -/obj/item/pen, -/obj/item/clothing/under/costume/schoolgirl/orange, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/school) -"eU" = ( -/obj/structure/table, -/obj/item/paper, -/obj/item/pen, -/obj/item/clothing/under/costume/schoolgirl/red, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/school) -"eV" = ( -/obj/structure/window/reinforced, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"eW" = ( -/obj/item/cardboard_cutout/adaptive{ - icon_state = "cutout_greytide"; - name = "White Pawn" - }, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "dark" - }, -/area/holodeck/rec_center/spacechess) -"eX" = ( -/obj/item/cardboard_cutout/adaptive{ - icon_state = "cutout_greytide"; - name = "White Pawn" - }, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/spacechess) -"eY" = ( -/obj/structure/window/reinforced, -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/thunderdome1218) -"eZ" = ( -/obj/machinery/door/window/westleft{ - dir = 2 - }, -/turf/open/floor/holofloor/asteroid, -/area/holodeck/rec_center/thunderdome1218) -"fa" = ( -/obj/machinery/door/window/westleft{ - dir = 2; - icon_state = "right" - }, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"fb" = ( -/obj/structure/table, -/obj/item/folder, -/obj/item/pen/blue, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/kobayashi) -"fc" = ( -/obj/structure/table, -/obj/item/folder, -/obj/item/pen, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/kobayashi) -"fd" = ( -/obj/structure/table, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/item/folder, -/obj/item/pen/red, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/kobayashi) -"fe" = ( -/obj/machinery/door/window/westleft{ - dir = 2 - }, -/turf/open/floor/holofloor/plating, -/area/holodeck/rec_center/kobayashi) -"ff" = ( -/obj/structure/table, -/obj/item/paper, -/obj/item/pen, -/obj/item/clothing/under/costume/schoolgirl, -/obj/item/toy/katana, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/school) -"fg" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/firingrange) -"fh" = ( -/obj/item/paper/guides/jobs/security/range, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/firingrange) -"fi" = ( -/obj/structure/table/reinforced, -/obj/machinery/magnetic_controller{ - autolink = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/firingrange) -"fj" = ( -/obj/item/cardboard_cutout/adaptive{ - icon_state = "cutout_viva"; - name = "White Rook" - }, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/spacechess) -"fk" = ( -/obj/item/cardboard_cutout/adaptive{ - icon_state = "cutout_mime"; - name = "White Queen" - }, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "dark" - }, -/area/holodeck/rec_center/spacechess) -"fl" = ( -/obj/item/cardboard_cutout/adaptive{ - icon_state = "cutout_clown"; - name = "White King" - }, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/spacechess) -"fm" = ( -/obj/item/cardboard_cutout/adaptive{ - icon_state = "cutout_ian"; - name = "White Knight" - }, -/turf/open/floor/holofloor{ - dir = 8; - icon_state = "dark" - }, -/area/holodeck/rec_center/spacechess) -"fn" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/kobayashi) -"fo" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/kobayashi) -"fp" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/firingrange) -"fq" = ( -/obj/structure/chair/wood/normal{ - dir = 1 - }, -/turf/open/floor/holofloor/grass, -/area/holodeck/rec_center/thunderdome1218) -"fr" = ( -/obj/structure/rack, -/obj/item/clothing/under/trek/medsci, -/obj/item/clothing/under/trek/medsci, -/obj/item/clothing/under/trek/command, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/kobayashi) -"fs" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/kobayashi) -"ft" = ( -/obj/structure/rack, -/obj/item/clothing/under/trek/engsec, -/obj/item/clothing/under/trek/engsec, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/kobayashi) -"fu" = ( -/obj/item/target, -/obj/item/target/clown, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/firingrange) -"fv" = ( -/obj/item/target, -/obj/item/target/syndicate, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/firingrange) -"fw" = ( -/obj/structure/rack, -/obj/item/gun/energy/laser/practice, -/obj/item/clothing/ears/earmuffs, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/firingrange) -"fx" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/closed/indestructible/riveted, -/area/space) "fy" = ( /obj/machinery/igniter/on, /obj/effect/turf_decal/delivery, @@ -2450,6 +356,10 @@ }, /turf/open/floor/plasteel/dark, /area/ctf) +"gO" = ( +/obj/effect/landmark/destabilization_loc, +/turf/open/indestructible/binary, +/area/tear_in_reality) "gR" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -2479,6 +389,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/item/folder/red, /turf/open/floor/plasteel/dark, /area/ctf) "hh" = ( @@ -2498,9 +409,6 @@ /turf/open/floor/plasteel/dark, /area/ctf) "hv" = ( -/obj/structure/chair/office{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, /area/ctf) @@ -2515,11 +423,11 @@ /turf/open/floor/circuit/green/anim, /area/ctf) "hE" = ( -/obj/item/twohanded/ctf/blue, +/obj/item/ctf/blue, /turf/open/floor/circuit/green/anim, /area/ctf) "hF" = ( -/obj/item/twohanded/ctf/red, +/obj/item/ctf/red, /turf/open/floor/circuit/green/anim, /area/ctf) "hG" = ( @@ -2538,6 +446,15 @@ }, /turf/open/floor/plasteel/dark, /area/ctf) +"hS" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/paper_bin, +/turf/open/floor/plasteel/dark, +/area/ctf) "hV" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -3162,18 +1079,6 @@ }, /turf/open/floor/plasteel, /area/centcom/control) -"jC" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 8; - height = 7; - id = "supply_away"; - json_key = "cargo"; - name = "CentCom"; - width = 20 - }, -/turf/open/space, -/area/space) "jD" = ( /obj/effect/turf_decal/loading_area{ dir = 8 @@ -3453,7 +1358,7 @@ /turf/open/floor/plasteel/dark, /area/centcom/control) "ke" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral{ @@ -3557,7 +1462,7 @@ /turf/open/floor/plasteel, /area/centcom/supply) "kk" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/neutral{ @@ -3670,7 +1575,7 @@ /turf/open/floor/plasteel/grimy, /area/centcom/control) "kB" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/machinery/firealarm{ @@ -3693,7 +1598,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel/grimy, @@ -3702,7 +1607,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plasteel/grimy, @@ -3744,13 +1649,13 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel/grimy, /area/centcom/control) "kJ" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/machinery/airalarm{ @@ -4211,7 +2116,7 @@ /obj/structure/table/reinforced, /obj/item/storage/box/handcuffs, /obj/item/crowbar/red, -/obj/item/crowbar/power, +/obj/item/powertool/jaws_of_life, /obj/item/storage/belt/security/full, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -4219,7 +2124,7 @@ /turf/open/floor/plasteel, /area/centcom/control) "lQ" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/machinery/firealarm{ @@ -4250,7 +2155,7 @@ "lS" = ( /obj/structure/fans/tiny/invisible, /turf/open/floor/holofloor/hyperspace, -/area/centcom/supplypod/flyMeToTheMoon) +/area/centcom/supplypod/supplypod_temp_holding) "lT" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security"; @@ -4354,14 +2259,14 @@ /turf/open/floor/plasteel/dark, /area/centcom/supply) "md" = ( -/obj/machinery/computer/shuttle/labor, +/obj/machinery/computer/shuttle_flight/labor, /obj/effect/turf_decal/stripes/line{ dir = 10 }, /turf/open/floor/plasteel, /area/centcom/supply) "me" = ( -/obj/machinery/computer/shuttle/mining, +/obj/machinery/computer/shuttle_flight/mining, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -4658,7 +2563,7 @@ /turf/open/floor/plasteel, /area/centcom/control) "mL" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/green{ @@ -4670,7 +2575,7 @@ /turf/open/floor/plasteel, /area/centcom/control) "mM" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 @@ -5467,7 +3372,7 @@ /obj/machinery/status_display/ai{ pixel_y = 32 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-15"; pixel_x = -6; pixel_y = 12 @@ -5680,7 +3585,7 @@ /turf/open/floor/plasteel, /area/centcom/control) "oy" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 @@ -6046,7 +3951,7 @@ /turf/open/floor/plasteel/grimy, /area/centcom/ferry) "ph" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/machinery/light{ @@ -6280,7 +4185,7 @@ /turf/open/floor/plasteel/dark, /area/centcom/control) "pw" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/structure/extinguisher_cabinet{ @@ -6623,13 +4528,13 @@ /turf/open/floor/plasteel/dark, /area/centcom/ferry) "qd" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/wood, /area/centcom/ferry) "qe" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/machinery/light_switch{ @@ -6953,7 +4858,7 @@ /turf/open/floor/plasteel/dark, /area/centcom/supplypod) "qJ" = ( -/obj/machinery/computer/shuttle/syndicate/recall, +/obj/machinery/computer/shuttle_flight/syndicate/recall, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 @@ -6976,6 +4881,12 @@ }, /turf/open/floor/plasteel, /area/syndicate_mothership/control) +"qM" = ( +/obj/machinery/power/emitter/ctf{ + dir = 8 + }, +/turf/open/floor/circuit, +/area/ctf) "qN" = ( /obj/structure/mopbucket, /obj/item/soap/syndie, @@ -7062,7 +4973,7 @@ /turf/open/floor/engine/cult, /area/wizard_station) "ra" = ( -/obj/machinery/computer/shuttle, +/obj/machinery/computer/shuttle_flight, /turf/open/floor/engine/cult, /area/wizard_station) "rb" = ( @@ -7072,7 +4983,7 @@ /turf/open/floor/plasteel, /area/centcom/supplypod/loading/ert) "rc" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral{ @@ -7169,14 +5080,14 @@ /turf/open/floor/plasteel/dark, /area/centcom/ferry) "rm" = ( -/obj/machinery/computer/shuttle/labor, +/obj/machinery/computer/shuttle_flight/labor, /obj/effect/turf_decal/stripes/line{ dir = 10 }, /turf/open/floor/plasteel, /area/centcom/ferry) "rn" = ( -/obj/machinery/computer/shuttle/mining, +/obj/machinery/computer/shuttle_flight/mining, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -7261,7 +5172,7 @@ /turf/open/floor/plasteel, /area/centcom/ferry) "rt" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/machinery/newscaster{ @@ -7286,7 +5197,7 @@ /turf/open/floor/wood, /area/centcom/ferry) "rv" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/machinery/light{ @@ -7358,7 +5269,7 @@ }, /obj/item/stack/rods/fifty, /obj/item/stack/cable_coil/white, -/obj/item/screwdriver/power, +/obj/item/powertool/hand_drill, /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "0-2" @@ -7394,7 +5305,7 @@ /obj/structure/table/reinforced, /obj/item/storage/box/handcuffs, /obj/item/crowbar/red, -/obj/item/crowbar/power, +/obj/item/powertool/jaws_of_life, /obj/item/storage/belt/security/full, /obj/structure/extinguisher_cabinet{ pixel_x = 26 @@ -7467,7 +5378,7 @@ /turf/open/floor/grass, /area/centcom/control) "rL" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/structure/extinguisher_cabinet{ @@ -7644,7 +5555,7 @@ "sa" = ( /obj/structure/table/wood, /obj/item/lighter, -/obj/item/wirecutters/power, +/obj/item/powertool/jaws_of_life, /turf/open/floor/plasteel/dark, /area/centcom/supplypod) "sb" = ( @@ -7771,7 +5682,7 @@ /turf/open/floor/plating/airless, /area/syndicate_mothership/control) "sq" = ( -/obj/machinery/computer/shuttle/white_ship{ +/obj/machinery/computer/shuttle_flight/white_ship{ dir = 4 }, /obj/effect/turf_decal/stripes/line{ @@ -8187,9 +6098,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/centcom/ferry) -"tb" = ( -/turf/open/floor/white, -/area/holodeck/rec_center/photobooth) "tc" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/light/floor, @@ -8232,6 +6140,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 8 }, +/obj/item/storage/fancy/donut_box, /turf/open/floor/plasteel/dark, /area/ctf) "th" = ( @@ -8245,25 +6154,6 @@ }, /turf/open/floor/plating/airless, /area/syndicate_mothership/control) -"tj" = ( -/obj/structure/falsewall/wood, -/obj/structure/mirror, -/turf/open/floor/holofloor/carpet, -/area/holodeck/rec_center/photobooth) -"tk" = ( -/obj/structure/table/wood, -/obj/item/paint/anycolor{ - pixel_x = 7 - }, -/obj/item/paint/anycolor{ - pixel_x = -5 - }, -/turf/open/floor/holofloor/carpet, -/area/holodeck/rec_center/photobooth) -"tl" = ( -/obj/structure/dresser, -/turf/open/floor/holofloor/carpet, -/area/holodeck/rec_center/photobooth) "tn" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -8271,7 +6161,7 @@ /turf/open/floor/plating/airless, /area/syndicate_mothership/control) "to" = ( -/obj/machinery/computer/shuttle/ferry{ +/obj/machinery/computer/shuttle_flight/ferry{ dir = 4 }, /obj/effect/turf_decal/stripes/line{ @@ -8517,7 +6407,7 @@ /turf/open/floor/plasteel, /area/centcom/ferry) "tJ" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/green{ @@ -8556,7 +6446,7 @@ /turf/open/floor/plasteel, /area/centcom/control) "tO" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/green{ @@ -8573,7 +6463,7 @@ /turf/closed/indestructible/riveted, /area/centcom/evac) "tS" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/stripes/line{ @@ -8940,7 +6830,7 @@ "uP" = ( /obj/structure/table/reinforced, /obj/item/stack/packageWrap, -/obj/item/crowbar/power, +/obj/item/powertool/jaws_of_life, /obj/item/wrench, /obj/item/hand_labeler, /obj/effect/turf_decal/stripes/line{ @@ -8990,7 +6880,7 @@ /turf/open/floor/plasteel/dark, /area/centcom/ferry) "uT" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/neutral{ @@ -9020,7 +6910,7 @@ /turf/open/floor/plasteel/dark, /area/centcom/ferry) "uV" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral{ @@ -9192,15 +7082,6 @@ }, /turf/open/floor/carpet, /area/wizard_station) -"vo" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) "vs" = ( /obj/machinery/vending/hydronutrients, /obj/effect/turf_decal/tile/green{ @@ -9620,6 +7501,10 @@ /obj/item/clothing/head/helmet/space/plasmaman, /turf/open/floor/wood, /area/centcom/holding) +"wg" = ( +/obj/singularity/wizard/mapped, +/turf/open/indestructible/binary, +/area/tear_in_reality) "wk" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plasteel/dark, @@ -9935,7 +7820,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/bar, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/plasteel, /area/syndicate_mothership/control) "xc" = ( @@ -9984,7 +7869,7 @@ /turf/open/floor/plating, /area/centcom/ferry) "xi" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/delivery, @@ -10054,7 +7939,7 @@ /turf/open/floor/plasteel, /area/centcom/control) "xp" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/green{ @@ -10066,7 +7951,7 @@ /turf/open/floor/plasteel, /area/centcom/control) "xq" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/green, @@ -10085,7 +7970,7 @@ /turf/open/floor/plating, /area/centcom/evac) "xs" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/stripes/line{ @@ -10144,16 +8029,6 @@ }, /turf/open/floor/wood, /area/centcom/holding) -"xE" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/firingrange) "xG" = ( /turf/open/floor/plasteel/dark, /area/syndicate_mothership/control) @@ -10600,6 +8475,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 4 }, +/obj/item/reagent_containers/food/drinks/britcup, /turf/open/floor/plasteel/dark, /area/ctf) "yU" = ( @@ -10718,7 +8594,7 @@ /turf/open/floor/plasteel/dark, /area/centcom/ferry) "zd" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/machinery/light{ @@ -10832,7 +8708,7 @@ /area/wizard_station) "zp" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/clothing/suit/wizrobe/red, /obj/item/clothing/head/wizard/red, @@ -10873,12 +8749,10 @@ /area/syndicate_mothership/control) "zy" = ( /obj/structure/table, -/obj/item/gun/energy/ionrifle{ - pin = /obj/item/firing_pin - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/item/gun/energy/ionrifle/carbine/pin, /turf/open/floor/mineral/plastitanium/red, /area/syndicate_mothership/control) "zz" = ( @@ -10978,6 +8852,8 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/item/cautery, +/obj/item/surgicaldrill, /turf/open/floor/plasteel/white, /area/centcom/control) "zI" = ( @@ -11061,13 +8937,6 @@ }, /turf/open/floor/grass, /area/wizard_station) -"zT" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) "zV" = ( /obj/structure/closet/secure_closet/freezer/meat/open, /obj/item/reagent_containers/food/snacks/carpmeat, @@ -11094,6 +8963,9 @@ /obj/item/soap/deluxe, /turf/open/floor/plasteel/cafeteria, /area/centcom/holding) +"zY" = ( +/turf/closed/indestructible/riveted, +/area/tear_in_reality) "zZ" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -11227,7 +9099,7 @@ /turf/open/floor/plasteel/dark, /area/centcom/ferry) "Am" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/red{ @@ -11248,7 +9120,7 @@ /turf/open/floor/plasteel, /area/centcom/control) "Ap" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/blue, @@ -11359,9 +9231,6 @@ /turf/open/floor/plasteel/dark, /area/ctf) "AG" = ( -/obj/structure/chair/office{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -11523,7 +9392,7 @@ /turf/open/floor/plasteel, /area/centcom/evac) "Ba" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/stripes/line, @@ -12161,7 +10030,7 @@ /turf/open/floor/plasteel/dark, /area/centcom/ferry) "Cw" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/machinery/power/apc{ @@ -12199,7 +10068,7 @@ /turf/open/floor/plasteel/dark, /area/centcom/ferry) "Cy" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/machinery/light, @@ -12220,7 +10089,7 @@ /turf/open/floor/plasteel/dark, /area/centcom/ferry) "Cz" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/structure/extinguisher_cabinet{ @@ -12633,7 +10502,7 @@ /turf/open/floor/plasteel/dark, /area/centcom/evac) "Df" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/structure/extinguisher_cabinet{ @@ -12693,6 +10562,10 @@ "Di" = ( /turf/closed/indestructible/riveted, /area/ai_multicam_room) +"Dl" = ( +/obj/effect/light_emitter, +/turf/open/indestructible/binary, +/area/tear_in_reality) "Dp" = ( /obj/structure/trap/ctf/red, /obj/effect/turf_decal/tile/red, @@ -13020,7 +10893,7 @@ /turf/open/floor/plasteel/dark, /area/centcom/control) "DV" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/green{ @@ -13029,7 +10902,7 @@ /turf/open/floor/plasteel, /area/centcom/control) "DW" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/green, @@ -13525,7 +11398,7 @@ /turf/open/floor/carpet/black, /area/centcom/holding) "Fb" = ( -/obj/structure/piano, +/obj/structure/musician/piano, /obj/machinery/light{ dir = 8 }, @@ -13644,7 +11517,7 @@ /turf/open/floor/plasteel, /area/tdome/tdomeobserve) "Fs" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/green{ @@ -13658,7 +11531,7 @@ }, /area/tdome/tdomeobserve) "Fu" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/green, @@ -13743,7 +11616,7 @@ /turf/open/floor/plasteel/white, /area/tdome/tdomeobserve) "FG" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/red, @@ -13824,7 +11697,7 @@ /turf/open/floor/plasteel, /area/tdome/tdomeobserve) "FQ" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/green{ @@ -13906,7 +11779,7 @@ }, /area/tdome/tdomeobserve) "Gg" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/neutral{ @@ -13920,7 +11793,7 @@ }, /area/tdome/tdomeobserve) "Gh" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/red{ @@ -13929,7 +11802,7 @@ /turf/open/floor/plasteel, /area/tdome/tdomeobserve) "Gi" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/red{ @@ -13942,7 +11815,7 @@ /turf/open/floor/plasteel, /area/tdome/tdomeobserve) "Gj" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/red, @@ -13971,7 +11844,7 @@ /turf/open/floor/plasteel, /area/tdome/tdomeobserve) "Gn" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/effect/turf_decal/tile/green, @@ -13981,7 +11854,7 @@ /turf/open/floor/plasteel, /area/tdome/tdomeobserve) "Go" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/green, @@ -13994,7 +11867,7 @@ /turf/open/floor/plasteel, /area/tdome/tdomeobserve) "Gp" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/green{ @@ -14617,7 +12490,7 @@ /area/tdome/tdomeobserve) "Hz" = ( /obj/structure/barricade/security/ctf, -/turf/open/floor/circuit/telecomms, +/turf/open/floor/circuit, /area/ctf) "HA" = ( /obj/structure/sink{ @@ -14927,7 +12800,7 @@ /turf/open/floor/plasteel, /area/tdome/tdomeobserve) "HZ" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral, @@ -15017,7 +12890,7 @@ /turf/open/floor/plasteel, /area/tdome/tdomeobserve) "Ig" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral{ @@ -15849,7 +13722,7 @@ /turf/open/floor/plasteel/dark, /area/ctf) "JZ" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/machinery/firealarm{ @@ -15885,7 +13758,7 @@ /turf/open/floor/plasteel/dark, /area/tdome/tdomeadmin) "Kc" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral{ @@ -16575,7 +14448,7 @@ /turf/open/floor/mineral/titanium/blue, /area/centcom/evac) "LP" = ( -/obj/machinery/computer/shuttle{ +/obj/machinery/computer/shuttle_flight{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, @@ -16747,7 +14620,7 @@ /turf/open/floor/plating/abductor, /area/abductor_ship) "Ms" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /turf/open/floor/wood, @@ -16801,6 +14674,18 @@ }, /turf/open/floor/plating/asteroid/snow/airless, /area/syndicate_mothership) +"Mz" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 8; + height = 7; + id = "supply_away"; + json_key = "cargo"; + name = "CentCom"; + width = 20 + }, +/turf/open/space/basic, +/area/space) "MD" = ( /obj/effect/light_emitter{ set_cap = 1; @@ -17085,7 +14970,7 @@ /obj/machinery/power/emitter/ctf{ dir = 4 }, -/turf/open/floor/circuit/telecomms, +/turf/open/floor/circuit, /area/ctf) "Oj" = ( /obj/machinery/door/firedoor, @@ -17276,7 +15161,7 @@ /turf/open/floor/plasteel, /area/centcom/supplypod/loading/one) "PL" = ( -/obj/machinery/autolathe, +/obj/machinery/modular_fabricator/autolathe, /turf/open/floor/wood, /area/centcom/holding) "PO" = ( @@ -17364,12 +15249,6 @@ /obj/structure/window/reinforced/spawner/west, /turf/open/floor/plasteel/dark, /area/ctf) -"Qd" = ( -/obj/machinery/power/emitter/ctf{ - dir = 8 - }, -/turf/open/floor/circuit/telecomms, -/area/ctf) "Qe" = ( /turf/open/ai_visible, /area/ai_multicam_room) @@ -17385,7 +15264,6 @@ /turf/open/floor/wood, /area/centcom/holding) "Qi" = ( -/obj/structure/chair/office, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -17553,6 +15431,9 @@ }, /turf/open/floor/plasteel/white, /area/centcom/holding) +"Rk" = ( +/turf/closed/indestructible/cordon, +/area/space) "Rm" = ( /obj/structure/chair/wood/wings{ dir = 3 @@ -17681,12 +15562,6 @@ /obj/machinery/vending/cigarette/syndicate, /turf/open/floor/plasteel, /area/syndicate_mothership/control) -"Sq" = ( -/obj/structure/table/wood, -/obj/item/camera, -/obj/item/camera, -/turf/open/floor/holofloor/carpet, -/area/holodeck/rec_center/photobooth) "Su" = ( /turf/open/floor/plasteel, /area/centcom/supplypod) @@ -17716,16 +15591,6 @@ }, /turf/open/floor/plasteel/white, /area/centcom/holding) -"Sx" = ( -/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/holofloor, -/area/holodeck/rec_center/basketball) "SA" = ( /obj/machinery/power/emitter/ctf{ dir = 4 @@ -17742,16 +15607,6 @@ }, /turf/open/floor/plasteel/white, /area/centcom/holding) -"SD" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) "SG" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -17946,6 +15801,18 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/three) +"TA" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/folder/red{ + pixel_x = -2; + pixel_y = -2 + }, +/turf/open/floor/plasteel/dark, +/area/ctf) "TB" = ( /obj/structure/reagent_dispensers/cooking_oil, /turf/open/floor/plasteel/cafeteria, @@ -18063,7 +15930,6 @@ /turf/open/floor/plasteel, /area/tdome/tdomeobserve) "Up" = ( -/obj/structure/chair/office, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -18097,6 +15963,15 @@ }, /turf/open/floor/wood, /area/centcom/holding) +"UL" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/clipboard, +/turf/open/floor/plasteel/dark, +/area/ctf) "UM" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -18131,7 +16006,6 @@ /turf/open/floor/wood, /area/centcom/holding) "UX" = ( -/obj/structure/chair/office, /obj/effect/turf_decal/stripes/line{ dir = 5 }, @@ -18210,25 +16084,6 @@ }, /turf/open/floor/wood, /area/centcom/holding) -"VH" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) -"VI" = ( -/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/holofloor, -/area/holodeck/rec_center/basketball) "VP" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -18263,7 +16118,7 @@ /turf/open/floor/plasteel, /area/centcom/evac) "Wi" = ( -/turf/open/floor/circuit/telecomms, +/turf/open/floor/circuit, /area/ctf) "Wj" = ( /obj/machinery/light/small{ @@ -18363,18 +16218,6 @@ }, /turf/open/floor/wood, /area/centcom/holding) -"Xf" = ( -/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/holofloor, -/area/holodeck/rec_center/basketball) "Xh" = ( /turf/open/floor/plasteel, /area/centcom/supplypod/loading/four) @@ -18597,9 +16440,6 @@ /turf/open/floor/grass, /area/centcom/holding) "YO" = ( -/obj/structure/chair/office{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -18655,25 +16495,8 @@ /obj/structure/window/reinforced/spawner, /turf/open/floor/plasteel/dark, /area/ctf) -"Zh" = ( -/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/holofloor, -/area/holodeck/rec_center/firingrange) -"Zl" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/basketball) "Zs" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 @@ -18767,18 +16590,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel/dark, /area/ctf) -"ZN" = ( -/obj/structure/table/wood, -/obj/item/toy/crayon/spraycan{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/toy/crayon/spraycan{ - pixel_x = -5; - pixel_y = 5 - }, -/turf/open/floor/holofloor/carpet, -/area/holodeck/rec_center/photobooth) "ZQ" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -18892,265 +16703,7 @@ aa aa aa aa -aa -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -gu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -fX +Rk fX fX fX @@ -19165,6 +16718,8 @@ fX fX fX fX +gu +Rk aa aa aa @@ -19309,33 +16864,31 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LV -LV -LV -LV -LV -LV -LV -LV -LV -LV -aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk "} -(3,1,1) = {" -aa -aa +(2,1,1) = {" aa +ad aa aa aa @@ -19407,6 +16960,7 @@ aa aa aa aa +Rk fX fX fX @@ -19422,6 +16976,7 @@ fX fX fX fX +Rk aa aa aa @@ -19483,14 +17038,15 @@ aa aa aa aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa -kK -lg -lB -lX -mr -aa aa aa aa @@ -19509,15 +17065,16 @@ aa aa aa aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa aa -kK -lg -lB -lX -mr -aa aa aa aa @@ -19538,18 +17095,17 @@ aa aa aa aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa aa aa -kK -lg -lB -lX -mr -aa -aa -aa aa aa aa @@ -19565,32 +17121,29 @@ aa aa aa aa -aa -aa -aa -aa -kK -lg -lB -lX -mr -aa -aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk LV -LW -LW -LW -LW -LW -LW -LW -LW -LW LV -aa +LV +LV +LV +LV +LV +LV +LV +LV +LV +Rk "} -(4,1,1) = {" -aa +(3,1,1) = {" aa aa aa @@ -19664,6 +17217,7 @@ aa aa aa aa +Rk fX fX fX @@ -19679,6 +17233,7 @@ fX fX fX fX +Rk aa aa aa @@ -19739,22 +17294,15 @@ aa aa aa aa -aa -aa -ko -kL -lh -lC -lY -ms -nb -aa -aa -aa -aa -aa -aa -aa +Rk +Rk +kK +lg +lB +lX +mr +Rk +Rk aa aa aa @@ -19768,18 +17316,20 @@ aa aa aa aa -ko -kL -Be -lC -lY -ms -nb aa aa aa aa aa +Rk +Rk +kK +lg +lB +lX +mr +Rk +Rk aa aa aa @@ -19798,16 +17348,18 @@ aa aa aa aa -ko -kL -JF -lC -lY -ms -nb aa aa aa +Rk +Rk +kK +lg +lB +lX +mr +Rk +Rk aa aa aa @@ -19825,29 +17377,30 @@ aa aa aa aa -ko -kL -LS -lC -lY -ms -nb aa +Rk +Rk +kK +lg +lB +lX +mr +Rk +Rk LV LW -LY -LY -LY -LZ -LY -LY -LY +LW +LW +LW +LW +LW +LW +LW LW LV -aa +Rk "} -(5,1,1) = {" -aa +(4,1,1) = {" aa aa aa @@ -19921,6 +17474,7 @@ aa aa aa aa +Rk fX fX fX @@ -19936,6 +17490,7 @@ fX fX fX fX +Rk aa aa aa @@ -19996,17 +17551,15 @@ aa aa aa aa -aa -aa -kp -kM -li -lD -li -mt -nc -aa -aa +Rk +ko +kL +lh +lC +lY +ms +nb +Rk aa aa aa @@ -20025,15 +17578,15 @@ aa aa aa aa -kp -Au -li -BQ -li -mt -nc -aa -aa +Rk +ko +kL +Be +lC +lY +ms +nb +Rk aa aa aa @@ -20055,16 +17608,15 @@ aa aa aa aa -kp -JA -li -JM -li -mt -nc -aa -aa -aa +Rk +ko +kL +JF +lC +lY +ms +nb +Rk aa aa aa @@ -20082,14 +17634,16 @@ aa aa aa aa -kp -LK -li -LT -li -mt -nc aa +Rk +ko +kL +LS +lC +lY +ms +nb +Rk LV LW LY @@ -20101,10 +17655,9 @@ LY LY LW LV -aa +Rk "} -(6,1,1) = {" -aa +(5,1,1) = {" aa aa aa @@ -20178,6 +17731,7 @@ aa aa aa aa +Rk fX fX fX @@ -20193,6 +17747,7 @@ fX fX fX fX +Rk aa aa aa @@ -20253,17 +17808,15 @@ aa aa aa aa -aa -aa -kq -kN +Rk +kp +kM li -lE +lD li -mu -nd -aa -aa +mt +nc +Rk aa aa aa @@ -20282,15 +17835,15 @@ aa aa aa aa -kq -Av +Rk +kp +Au li -lE +BQ li -mu -nd -aa -aa +mt +nc +Rk aa aa aa @@ -20312,15 +17865,15 @@ aa aa aa aa -kq -JB +Rk +kp +JA li -lE +JM li -mu -nd -aa -aa +mt +nc +Rk aa aa aa @@ -20339,14 +17892,15 @@ aa aa aa aa -kq -LL +Rk +kp +LK li -lE +LT li -mu -nd -aa +mt +nc +Rk LV LW LY @@ -20358,10 +17912,9 @@ LY LY LW LV -aa +Rk "} -(7,1,1) = {" -aa +(6,1,1) = {" aa aa aa @@ -20435,6 +17988,7 @@ aa aa aa aa +Rk fX fX fX @@ -20450,6 +18004,7 @@ fX fX fX fX +Rk aa aa aa @@ -20510,17 +18065,15 @@ aa aa aa aa -aa -aa -kr -kO +Rk +kq +kN li -lF +lE li -mv -ne -aa -aa +mu +nd +Rk aa aa aa @@ -20539,15 +18092,15 @@ aa aa aa aa -kr -Aw +Rk +kq +Av li -BR +lE li -mv -ne -aa -aa +mu +nd +Rk aa aa aa @@ -20569,15 +18122,15 @@ aa aa aa aa -kr -JC +Rk +kq +JB li -JN +lE li -mv -ne -aa -aa +mu +nd +Rk aa aa aa @@ -20596,29 +18149,29 @@ aa aa aa aa -kr -LM +Rk +kq +LL li -LU +lE li -mv -ne -aa +mu +nd +Rk LV LW +LY +LY +LY LZ -LZ -LZ -LZ -LZ -LZ -LZ +LY +LY +LY LW LV -aa +Rk "} -(8,1,1) = {" -aa +(7,1,1) = {" aa aa aa @@ -20692,6 +18245,7 @@ aa aa aa aa +Rk fX fX fX @@ -20699,7 +18253,6 @@ fX fX fX fX -fY fX fX fX @@ -20707,6 +18260,8 @@ fX fX fX fX +fX +Rk aa aa aa @@ -20767,22 +18322,15 @@ aa aa aa aa -aa -aa -ks -kP -lj -WB -Mp -mw -nf -aa -aa -aa -aa -aa -aa -aa +Rk +kr +kO +li +lF +li +mv +ne +Rk aa aa aa @@ -20796,18 +18344,20 @@ aa aa aa aa -ks -kP -lj -WB -Mp -mw -nf aa aa aa aa aa +Rk +kr +Aw +li +BR +li +mv +ne +Rk aa aa aa @@ -20826,16 +18376,18 @@ aa aa aa aa -ks -kP -lj -WB -Mp -mw -nf aa aa aa +Rk +kr +JC +li +JN +li +mv +ne +Rk aa aa aa @@ -20853,85 +18405,30 @@ aa aa aa aa -ks -kP -lj -WB -Mp -mw -nf aa +Rk +kr +LM +li +LU +li +mv +ne +Rk LV LW -LY -LY -LY +LZ +LZ +LZ LZ LZ LZ LZ LW LV -aa +Rk "} -(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 +(8,1,1) = {" aa aa aa @@ -20949,21 +18446,6 @@ aa aa aa aa -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX aa aa aa @@ -21020,6 +18502,23 @@ aa aa aa aa +Rk +fX +fX +fX +fX +fX +fX +fX +fY +fX +fX +fX +fX +fX +fX +fX +Rk aa aa aa @@ -21027,11 +18526,6 @@ aa aa aa aa -kQ -lk -lH -lZ -mx aa aa aa @@ -21054,11 +18548,6 @@ aa aa aa aa -kQ -lk -lH -lZ -mx aa aa aa @@ -21084,17 +18573,21 @@ aa aa aa aa -kQ -lk -lH -lZ -mx aa aa aa aa aa aa +Rk +ks +kP +lj +WB +Mp +mw +nf +Rk aa aa aa @@ -21111,27 +18604,18 @@ aa aa aa aa -kQ -lk -lH -lZ -mx aa aa -LV -LX -LY -LY -LY -LZ -LZ -Ma -Mb -LW -LV +Rk +ks +kP +lj +WB +Mp +mw +nf +Rk aa -"} -(10,1,1) = {" aa aa aa @@ -21152,6 +18636,15 @@ aa aa aa aa +Rk +ks +kP +lj +WB +Mp +mw +nf +Rk aa aa aa @@ -21170,6 +18663,29 @@ aa aa aa aa +Rk +ks +kP +lj +WB +Mp +mw +nf +Rk +LV +LW +LY +LY +LY +LZ +LZ +LZ +LZ +LW +LV +Rk +"} +(9,1,1) = {" aa aa aa @@ -21206,21 +18722,6 @@ aa aa aa aa -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX aa aa aa @@ -21258,6 +18759,23 @@ aa aa aa aa +Rk +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +Rk aa aa aa @@ -21318,6 +18836,15 @@ aa aa aa aa +Rk +Rk +kQ +lk +lH +lZ +mx +Rk +Rk aa aa aa @@ -21336,6 +18863,15 @@ aa aa aa aa +Rk +Rk +kQ +lk +lH +lZ +mx +Rk +Rk aa aa aa @@ -21357,6 +18893,15 @@ aa aa aa aa +Rk +Rk +kQ +lk +lH +lZ +mx +Rk +Rk aa aa aa @@ -21375,21 +18920,29 @@ aa aa aa aa +Rk +Rk +kQ +lk +lH +lZ +mx +Rk +Rk LV -LW +LX LY LY LY LZ LZ -LZ -LZ +Ma +Mb LW LV -aa +Rk "} -(11,1,1) = {" -aa +(10,1,1) = {" aa aa aa @@ -21463,6 +19016,7 @@ aa aa aa aa +Rk fX fX fX @@ -21478,6 +19032,7 @@ fX fX fX fX +Rk aa aa aa @@ -21539,72 +19094,55 @@ aa aa aa aa -aa -aa -aa -aa -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa aa @@ -21613,6 +19151,13 @@ aa aa aa aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa aa @@ -21632,21 +19177,29 @@ aa aa aa aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk LV LW -LZ -LZ -LZ +LY +LY +LY LZ LZ LZ LZ LW LV -aa +Rk "} -(12,1,1) = {" -aa +(11,1,1) = {" aa aa aa @@ -21720,6 +19273,7 @@ aa aa aa aa +Rk fX fX fX @@ -21735,6 +19289,7 @@ fX fX fX fX +Rk aa aa aa @@ -21798,8 +19353,7 @@ aa aa aa aa -aa -aa +Rk lI lI lI @@ -21844,6 +19398,8 @@ lI lI lI lI +lI +Rk aa aa aa @@ -21886,24 +19442,21 @@ aa aa aa aa -aa -aa -aa +Rk LV LW -LY -LY -LY LZ -LY -LY -LY +LZ +LZ +LZ +LZ +LZ +LZ LW LV -aa +Rk "} -(13,1,1) = {" -aa +(12,1,1) = {" aa aa aa @@ -21977,6 +19530,7 @@ aa aa aa aa +Rk fX fX fX @@ -21992,6 +19546,7 @@ fX fX fX fX +Rk aa aa aa @@ -22055,8 +19610,7 @@ aa aa aa aa -aa -aa +Rk lI lI lI @@ -22101,6 +19655,8 @@ lI lI lI lI +lI +Rk aa aa aa @@ -22143,9 +19699,7 @@ aa aa aa aa -aa -aa -aa +Rk LV LW LY @@ -22157,10 +19711,9 @@ LY LY LW LV -aa +Rk "} -(14,1,1) = {" -aa +(13,1,1) = {" aa aa aa @@ -22234,6 +19787,7 @@ aa aa aa aa +Rk fX fX fX @@ -22249,6 +19803,7 @@ fX fX fX fX +Rk aa aa aa @@ -22312,8 +19867,7 @@ aa aa aa aa -aa -aa +Rk lI lI lI @@ -22358,6 +19912,8 @@ lI lI lI lI +lI +Rk aa aa aa @@ -22400,9 +19956,7 @@ aa aa aa aa -aa -aa -aa +Rk LV LW LY @@ -22414,10 +19968,9 @@ LY LY LW LV -aa +Rk "} -(15,1,1) = {" -aa +(14,1,1) = {" aa aa aa @@ -22491,6 +20044,7 @@ aa aa aa aa +Rk fX fX fX @@ -22506,6 +20060,7 @@ fX fX fX fX +Rk aa aa aa @@ -22569,8 +20124,7 @@ aa aa aa aa -aa -aa +Rk lI lI lI @@ -22615,6 +20169,8 @@ lI lI lI lI +lI +Rk aa aa aa @@ -22654,44 +20210,24 @@ aa aa aa aa +fR aa aa -aa -aa -aa -aa +Rk LV LW -LW -LW -LW -LW -LW -LW -LW +LY +LY +LY +LZ +LY +LY +LY LW LV -aa +Rk "} -(16,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(15,1,1) = {" aa aa aa @@ -22765,6 +20301,23 @@ aa aa aa aa +Rk +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +Rk aa aa aa @@ -22828,6 +20381,7 @@ aa aa aa aa +Rk lI lI lI @@ -22872,6 +20426,8 @@ lI lI lI lI +lI +Rk aa aa aa @@ -22914,41 +20470,21 @@ aa aa aa aa -aa -aa -aa -LV -LV -LV -LV -LV -LV -LV -LV -LV +Rk LV +LW +LW +LW +LW +LW +LW +LW +LW +LW LV -aa +Rk "} -(17,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(16,1,1) = {" aa aa aa @@ -23022,6 +20558,23 @@ aa aa aa aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa aa @@ -23085,6 +20638,7 @@ aa aa aa aa +Rk lI lI lI @@ -23129,6 +20683,8 @@ lI lI lI lI +lI +Rk aa aa aa @@ -23171,24 +20727,21 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -fR -aa -aa -aa -aa -aa -aa -aa -aa +Rk +LV +LV +LV +LV +LV +LV +LV +LV +LV +LV +LV +Rk "} -(18,1,1) = {" -aa +(17,1,1) = {" aa aa aa @@ -23342,6 +20895,7 @@ aa aa aa aa +Rk lI lI lI @@ -23363,13 +20917,6 @@ lI lI lI lI -qE -qE -Ax -Ax -Ax -qE -qE lI lI lI @@ -23386,107 +20933,72 @@ lI lI lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +lI +lI +lI +lI +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk "} -(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 +(18,1,1) = {" aa aa aa @@ -23599,50 +21111,6 @@ aa aa aa aa -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -qE -qE -qE -qE -yC -zo -zN -zo -Bf -qE -Ax -Ax -qE -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI aa aa aa @@ -23684,6 +21152,92 @@ aa aa aa aa +Rk +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +qE +qE +Ax +Ax +Ax +qE +qE +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Rk +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +Rk jA jA jA @@ -23699,10 +21253,9 @@ jA jA jA jA -aa +Rk "} -(20,1,1) = {" -aa +(19,1,1) = {" aa aa aa @@ -23856,6 +21409,8 @@ aa aa aa aa +Rk +lI lI lI lI @@ -23875,19 +21430,17 @@ lI lI qE qE -ME -vj -ya -qZ -qZ -qZ -qZ -qZ -BS -qZ -qZ qE qE +yC +zo +zN +zo +Bf +qE +Ax +Ax +qE lI lI lI @@ -23900,47 +21453,48 @@ lI lI lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +Rk +zY +ac +ac +gO +zY +ac +ac +ac +ac +gO +zY +ac +ac +ac +zY +ac +ac +ac +ac +ac +zY +ac +ac +gO +zY +gO +zY +ac +ac +ac +ac +ac +zY +ac +ac +ac +zY +zY +Rk jA hH hH @@ -23956,10 +21510,9 @@ hH hH hH jA -aa +Rk "} -(21,1,1) = {" -aa +(20,1,1) = {" aa aa aa @@ -24113,6 +21666,8 @@ aa aa aa aa +Rk +lI lI lI lI @@ -24131,24 +21686,19 @@ lI lI qE qE -uD -wM +ME vj -qE +ya qZ qZ qZ qZ qZ -qE +BS qZ -uE qZ qE qE -qE -qE -qE lI lI lI @@ -24157,47 +21707,51 @@ lI lI lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +lI +Rk +zY +ac +zY +zY +zY +ac +zY +zY +zY +zY +zY +ac +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +ac +zY +zY +Rk jA hH hH @@ -24213,10 +21767,9 @@ hH hH hH jA -aa +Rk "} -(22,1,1) = {" -aa +(21,1,1) = {" aa aa aa @@ -24370,6 +21923,8 @@ aa aa aa aa +Rk +lI lI lI lI @@ -24387,74 +21942,73 @@ lI lI qE qE -vj -vj -vj +uD +wM vj qE -yC -zo qZ -zo -Bf -qE +qZ qZ qZ qZ qE -DL -DZ -Eh +qZ +uE +qZ +qE +qE qE qE -Ax qE lI lI lI lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +Rk +zY +ac +ac +ac +zY +ac +zY +gO +ac +ac +zY +gO +zY +ac +ac +ac +ac +ac +zY +ac +ac +ac +ac +ac +zY +ac +ac +ac +zY +gO +ac +ac +ac +ac +zY +gO +zY +zY +Rk jA hH hH @@ -24470,10 +22024,9 @@ hH hH hH jA -aa +Rk "} -(23,1,1) = {" -aa +(22,1,1) = {" aa aa aa @@ -24627,6 +22180,7 @@ aa aa aa aa +Rk lI lI lI @@ -24643,75 +22197,75 @@ lI lI lI qE -uC -vk +qE +vj +vj vj vj -xu -qE -qE -Ax -Ax -Ax qE +yC +zo +qZ +zo +Bf qE -Ci -uE qZ -DC -DM -DM -Ei -EC qZ qZ qE +DL +DZ +Eh +qE +qE +Ax +qE lI lI lI lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +Rk +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +zY +zY +zY +zY +zY +zY +zY +ac +zY +zY +zY +zY +zY +zY +Rk jA hH hH @@ -24727,51 +22281,9 @@ hH hH hH jA -aa +Rk "} -(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 +(23,1,1) = {" aa aa aa @@ -24884,50 +22396,6 @@ aa aa aa aa -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -qE -qE -qE -qE -uD -vj -vj -vj -xv -qE -yD -qZ -qZ -qZ -Bg -qE -qZ -qZ -qZ -qE -DN -Ea -Ej -qE -qE -EC -qE -qE -qE -lI -lI -lI aa aa aa @@ -24969,6 +22437,92 @@ aa aa aa aa +Rk +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +qE +uC +vk +vj +vj +xu +qE +qE +Ax +Ax +Ax +qE +qE +Ci +uE +qZ +DC +DM +DM +Ei +EC +qZ +qZ +qE +lI +lI +lI +lI +lI +lI +Rk +zY +ac +ac +ac +ac +ac +zY +ac +ac +ac +zY +ac +ac +ac +zY +ac +ac +ac +zY +ac +ac +ac +zY +ac +ac +ac +zY +gO +ac +ac +ac +ac +zY +ac +ac +ac +zY +zY +Rk jA hH hH @@ -24984,10 +22538,9 @@ hH hH hH jA -aa +Rk "} -(25,1,1) = {" -aa +(24,1,1) = {" aa aa aa @@ -25141,6 +22694,8 @@ aa aa aa aa +Rk +lI lI lI lI @@ -25154,97 +22709,95 @@ lI lI qE qE -rW -sW -qE -qE -qE -wb qE qE +uD +vj +vj +vj +xv qE -yE +yD qZ qZ qZ -Bh +Bg qE qZ -uE +qZ qZ qE +DN +Ea +Ej qE qE +EC qE qE -qZ -qZ -FT -Gr qE lI lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +Rk +zY +ac +zY +ac +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +zY +zY +zY +ac +zY +zY +zY +ac +zY +ac +zY +ac +zY +zY +zY +ac +zY +zY +zY +zY +Rk jA hH hH hH hH -jA -jA -jA -jA -jA +hH +hH +hH +hH +hH hH hH hH hH jA -aa +Rk "} -(26,1,1) = {" -aa +(25,1,1) = {" aa aa aa @@ -25398,6 +22951,7 @@ aa aa aa aa +Rk lI lI lI @@ -25409,99 +22963,98 @@ lI lI lI lI -Ax -qZ -qZ -qZ -Ax -qZ -qZ -qZ -wN -xw qE +qE +rW +sW +qE +qE +qE +wb +qE +qE +qE +yE qZ qZ qZ +Bh +qE qZ -qZ -Ax -qZ -qZ +uE qZ qE -DO -Eb -Ek qE -EW +qE +qE +qE qZ qZ +FT Gr -Gz -GX +qE lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +Rk +zY +ac +zY +ac +ac +ac +zY +ac +ac +ac +ac +ac +ac +gO +zY +ac +zY +ac +ac +gO +zY +ac +ac +ac +zY +ac +ac +ac +zY +ac +ac +gO +zY +ac +ac +ac +zY +zY +Rk jA hH hH hH hH jA -lS -lS -lS +jA +jA +jA jA hH hH hH hH jA -aa +Rk "} -(27,1,1) = {" -aa +(26,1,1) = {" aa aa aa @@ -25655,6 +23208,7 @@ aa aa aa aa +Rk lI lI lI @@ -25667,31 +23221,31 @@ lI lI lI Ax -ra qZ qZ -tX qZ +Ax qZ qZ qZ +wN +xw +qE qZ -yb qZ qZ -zO -Ay qZ -BS -qZ -uE qZ -DD -uE -Ec -uE Ax -EX +qZ +qZ +qZ +qE +DO +Eb +Ek +qE +EW qZ qZ Gr @@ -25699,47 +23253,47 @@ Gz GX lI lI -HG -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +Rk +zY +ac +zY +zY +zY +ac +zY +zY +zY +zY +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +zY +zY +ac +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +ac +zY +zY +Rk jA hH hH @@ -25755,10 +23309,9 @@ hH hH hH jA -aa +Rk "} -(28,1,1) = {" -aa +(27,1,1) = {" aa aa aa @@ -25912,6 +23465,7 @@ aa aa aa aa +Rk lI lI lI @@ -25924,31 +23478,31 @@ lI lI lI Ax +ra qZ qZ -qZ -Ax -qZ +tX qZ qZ -wO -xx -qE qZ qZ qZ +yb qZ qZ -Ax +zO +Ay qZ +BS qZ +uE qZ -qE -DP -Ed -El -qE -EW +DD +uE +Ec +uE +Ax +EX qZ qZ Gr @@ -25956,47 +23510,47 @@ Gz GX lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +HG +Rk +zY +gO +zY +ac +ac +ac +ac +ac +zY +gO +zY +ac +ac +ac +zY +ac +ac +ac +ac +ac +zY +ac +ac +ac +zY +gO +ac +ac +ac +ac +ac +gO +zY +gO +zY +ac +zY +zY +Rk jA hH hH @@ -26012,51 +23566,9 @@ hH hH hH jA -aa +Rk "} -(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 +(28,1,1) = {" aa aa aa @@ -26169,50 +23681,6 @@ aa aa aa aa -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -qE -qE -rX -sX -qE -qE -qE -wc -qE -qE -qE -yF -qZ -qZ -qZ -Bh -qE -qZ -uE -qZ -qE -qE -qE -qE -qE -EY -qZ -FT -Gr -qE -lI -lI -lI aa aa aa @@ -26254,25 +23722,110 @@ aa aa aa aa +Rk +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Ax +qZ +qZ +qZ +Ax +qZ +qZ +qZ +wO +xx +qE +qZ +qZ +qZ +qZ +qZ +Ax +qZ +qZ +qZ +qE +DP +Ed +El +qE +EW +qZ +qZ +Gr +Gz +GX +lI +lI +lI +Rk +zY +zY +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +zY +zY +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +Rk jA hH hH hH hH jA -jA -jA -jA +lS +lS +lS jA hH hH hH hH jA -aa +Rk "} -(30,1,1) = {" -aa +(29,1,1) = {" aa aa aa @@ -26426,7 +23979,7 @@ aa aa aa aa -lI +Rk lI lI lI @@ -26440,96 +23993,96 @@ lI lI qE qE +rX +sX qE qE -uE -vl -uE -wP -xy qE -yG -zp -zP +wc +qE +qE +qE +yF qZ qZ -qE qZ +Bh +qE qZ +uE qZ qE -DQ -Ee -Em qE qE -Ax qE qE +EY +qZ +FT +Gr qE lI lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +Rk +zY +ac +ac +ac +ac +ac +ac +ac +ac +ac +zY +gO +zY +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +zY +gO +zY +ac +ac +ac +zY +ac +ac +ac +zY +zY +Rk jA hH hH hH hH -hH -hH -hH -hH -hH +jA +jA +jA +jA +jA hH hH hH hH jA -aa +Rk "} -(31,1,1) = {" -aa +(30,1,1) = {" aa aa aa @@ -26683,9 +24236,7 @@ aa aa aa aa -lI -lI -lI +Rk lI lI lI @@ -26699,75 +24250,78 @@ lI lI lI qE -uF -vm -wd +qE +qE +qE uE -xz +vl +uE +wP +xy +qE +yG +zp +zP +qZ +qZ +qE +qZ +qZ +qZ +qE +DQ +Ee +Em qE qE -Ax -Ax Ax qE qE -Ci -uE -qZ -DE -DR -DR -En qE lI lI lI lI -lI -lI -lI -lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +ac +zY +ac +zY +zY +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +Rk jA hH hH @@ -26783,10 +24337,9 @@ hH hH hH jA -aa +Rk "} -(32,1,1) = {" -aa +(31,1,1) = {" aa aa aa @@ -26940,6 +24493,7 @@ aa aa aa aa +Rk lI lI lI @@ -26956,25 +24510,25 @@ lI lI lI qE -qE -vn -uE -vl +uF +vm +wd uE +xz +qE +qE +Ax Ax -yH -yK -zQ -Az -yK Ax -qZ -qZ -qZ qE -DS -Ef -Eo +qE +Ci +uE +qZ +DE +DR +DR +En qE lI lI @@ -26984,47 +24538,47 @@ lI lI lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +Rk +zY +gO +zY +gO +ac +ac +zY +ac +ac +ac +ac +ac +ac +ac +Dl +ac +ac +ac +ac +ac +ac +ac +Dl +ac +zY +ac +ac +ac +zY +gO +zY +ac +ac +ac +zY +ac +zY +zY +Rk jA hH hH @@ -27040,10 +24594,9 @@ hH hH hH jA -aa +Rk "} -(33,1,1) = {" -aa +(32,1,1) = {" aa aa aa @@ -27197,7 +24750,7 @@ aa aa aa aa -lI +Rk lI lI lI @@ -27215,23 +24768,24 @@ lI lI qE qE -uF -wQ -wd +vn +uE +vl +uE Ax -yI -zq -yI -AA -yI +yH +yK +zQ +Az +yK Ax qZ -uE +qZ qZ qE -qE -qE -qE +DS +Ef +Eo qE lI lI @@ -27241,47 +24795,47 @@ lI lI lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +Rk +zY +zY +zY +zY +zY +ac +zY +zY +zY +zY +zY +ac +zY +ac +Dl +ac +ac +ac +ac +ac +ac +ac +Dl +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +Rk jA hH hH @@ -27297,10 +24851,9 @@ hH hH hH jA -aa +Rk "} -(34,1,1) = {" -aa +(33,1,1) = {" aa aa aa @@ -27454,7 +25007,7 @@ aa aa aa aa -lI +Rk lI lI lI @@ -27473,19 +25026,24 @@ lI lI qE qE -vn -uE +uF +wQ +wd Ax -yJ -zr -yK +yI zq -yK +yI +AA +yI Ax qZ +uE qZ qE qE +qE +qE +qE lI lI lI @@ -27495,50 +25053,46 @@ lI lI lI lI -lI -lI -lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +gO +ac +ac +ac +ac +zY +ac +ac +ac +ac +ac +zY +ac +Dl +ac +ac +ac +ac +ac +ac +ac +Dl +ac +zY +ac +ac +ac +zY +ac +ac +gO +zY +gO +ac +ac +zY +zY +Rk jA hH hH @@ -27554,10 +25108,9 @@ hH hH hH jA -aa +Rk "} -(35,1,1) = {" -aa +(34,1,1) = {" aa aa aa @@ -27711,6 +25264,7 @@ aa aa aa aa +Rk lI lI lI @@ -27728,19 +25282,20 @@ lI lI lI lI -lI -qE -qE qE qE +vn +uE +Ax +yJ +zr yK zq -yI -AB -Bi -qE -Ax +yK Ax +qZ +qZ +qE qE lI lI @@ -27755,66 +25310,64 @@ lI lI lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA +Rk +zY +zY +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +Dl +ac +ac +ac +wg +ac +ac +ac +Dl +ac +zY +ac +zY +zY +zY +ac +zY +zY +zY +zY +zY +ac +zY +zY +Rk jA +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH jA -aa +Rk "} -(36,1,1) = {" -aa +(35,1,1) = {" aa aa aa @@ -27968,9 +25521,7 @@ aa aa aa aa -lI -lI -lI +Rk lI lI lI @@ -27993,10 +25544,15 @@ qE qE qE qE +yK +zq +yI +AB +Bi qE +Ax +Ax qE -qE -lI lI lI lI @@ -28011,67 +25567,64 @@ lI lI lI lI -lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +ac +ac +ac +ac +gO +zY +ac +zY +ac +ac +gO +zY +ac +Dl +ac +ac +ac +ac +ac +ac +ac +Dl +ac +zY +ac +ac +ac +ac +ac +zY +gO +ac +ac +zY +ac +zY +zY +Rk +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +Rk "} -(37,1,1) = {" -aa +(36,1,1) = {" aa aa aa @@ -28225,6 +25778,7 @@ aa aa aa aa +Rk lI lI lI @@ -28246,6 +25800,13 @@ lI lI lI lI +qE +qE +qE +qE +qE +qE +qE lI lI lI @@ -28263,72 +25824,64 @@ lI lI lI lI -lI -lI -lI -lI -lI -lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +ac +zY +zY +zY +zY +zY +ac +zY +zY +zY +zY +zY +ac +Dl +ac +ac +ac +ac +ac +ac +ac +Dl +ac +zY +ac +zY +zY +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk "} -(38,1,1) = {" -aa +(37,1,1) = {" aa aa aa @@ -28482,6 +26035,7 @@ aa aa aa aa +Rk lI lI lI @@ -28526,47 +26080,47 @@ lI lI lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +Rk +zY +ac +zY +ac +ac +gO +zY +ac +zY +gO +zY +ac +ac +ac +Dl +ac +ac +ac +ac +ac +ac +ac +Dl +ac +zY +gO +ac +ac +zY +ac +ac +ac +ac +ac +ac +ac +zY +zY +Rk aa aa aa @@ -28584,8 +26138,7 @@ aa aa aa "} -(39,1,1) = {" -aa +(38,1,1) = {" aa aa aa @@ -28681,64 +26234,65 @@ aa aa aa aa -mB -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk lI lI lI @@ -28783,47 +26337,47 @@ lI lI lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +Rk +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +ac +zY +ac +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +ac +zY +zY +zY +ac +zY +zY +zY +zY +zY +zY +zY +ac +zY +zY +Rk aa aa aa @@ -28841,8 +26395,7 @@ aa aa aa "} -(40,1,1) = {" -aa +(39,1,1) = {" aa aa aa @@ -28938,64 +26491,65 @@ aa aa aa aa +Rk +mB hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl hh -aa +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +Rk lI lI lI @@ -29040,47 +26594,47 @@ lI lI lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +Rk +zY +gO +zY +ac +ac +ac +ac +ac +zY +ac +ac +ac +zY +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +zY +ac +ac +ac +zY +gO +ac +ac +zY +ac +ac +ac +zY +zY +Rk aa aa aa @@ -29098,8 +26652,7 @@ aa aa aa "} -(41,1,1) = {" -aa +(40,1,1) = {" aa aa aa @@ -29195,6 +26748,7 @@ aa aa aa aa +Rk hh hl hl @@ -29252,7 +26806,7 @@ hl hl hl hh -aa +Rk lI lI lI @@ -29297,47 +26851,47 @@ lI lI lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +Rk +zY +zY +zY +ac +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +ac +zY +zY +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +zY +ac +zY +ac +zY +ac +zY +zY +zY +zY +Rk aa aa aa @@ -29355,8 +26909,7 @@ aa aa aa "} -(42,1,1) = {" -aa +(41,1,1) = {" aa aa aa @@ -29452,6 +27005,7 @@ aa aa aa aa +Rk hh hl hl @@ -29509,7 +27063,7 @@ hl hl hl hh -aa +Rk lI lI lI @@ -29554,47 +27108,47 @@ lI lI lI lI -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +Rk +zY +gO +ac +ac +zY +ac +ac +gO +zY +gO +zY +ac +ac +ac +ac +ac +zY +gO +zY +ac +ac +ac +zY +ac +ac +ac +zY +ac +ac +ac +zY +ac +ac +ac +zY +gO +zY +zY +Rk aa aa aa @@ -29612,8 +27166,7 @@ aa aa aa "} -(43,1,1) = {" -aa +(42,1,1) = {" aa aa aa @@ -29709,6 +27262,7 @@ aa aa aa aa +Rk hh hl hl @@ -29766,92 +27320,92 @@ hl hl hl hh -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Rk +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +ac +zY +zY +Rk aa aa aa @@ -29869,8 +27423,7 @@ aa aa aa "} -(44,1,1) = {" -aa +(43,1,1) = {" aa aa aa @@ -29966,6 +27519,7 @@ aa aa aa aa +Rk hh hl hl @@ -30023,6 +27577,92 @@ hl hl hl hh +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +zY +ac +ac +ac +zY +ac +zY +ac +ac +ac +ac +ac +zY +ac +ac +gO +zY +ac +ac +ac +zY +ac +ac +ac +zY +gO +zY +ac +zY +ac +ac +gO +zY +ac +ac +ac +zY +zY +Rk aa aa aa @@ -30039,95 +27679,8 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 +"} +(44,1,1) = {" aa aa aa @@ -30223,6 +27776,7 @@ aa aa aa aa +Rk hh hl hl @@ -30280,6 +27834,7 @@ hl hl hl hh +Rk aa aa aa @@ -30325,47 +27880,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +zY +zY +ac +zY +ac +zY +zY +zY +zY +zY +ac +zY +zY +zY +zY +zY +ac +zY +zY +zY +zY +Rk aa aa aa @@ -30383,8 +27937,7 @@ aa aa aa "} -(46,1,1) = {" -aa +(45,1,1) = {" aa aa aa @@ -30480,6 +28033,7 @@ aa aa aa aa +Rk hh hl hl @@ -30537,79 +28091,39 @@ hl hl hl hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa aa @@ -30623,6 +28137,46 @@ aa aa aa aa +Rk +zY +ac +zY +ac +ac +ac +ac +ac +ac +gO +zY +ac +ac +ac +zY +gO +zY +gO +ac +ac +ac +ac +zY +ac +ac +gO +zY +ac +zY +gO +zY +ac +ac +ac +zY +gO +zY +zY +Rk aa aa aa @@ -30640,8 +28194,7 @@ aa aa aa "} -(47,1,1) = {" -aa +(46,1,1) = {" aa aa aa @@ -30737,6 +28290,7 @@ aa aa aa aa +Rk hh hl hl @@ -30793,39 +28347,40 @@ hl hl hl hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -kt -MD -kt -kt -kt -kt -kt -kt -kt -kt -kt -kt -hl hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +Rk aa aa aa @@ -30839,66 +28394,64 @@ aa aa aa aa +Rk +zY +ac +zY +ac +zY +zY +zY +zY +zY +zY +zY +zY +zY +ac +zY +ac +zY +zY +zY +zY +zY +zY +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +Rk aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 +"} +(47,1,1) = {" aa aa aa @@ -30994,6 +28547,7 @@ aa aa aa aa +Rk hh hl hl @@ -31063,6 +28617,16 @@ hl hl hl hl +hl +hl +hl +hl +hl +hl +kt +MD +kt +kt kt kt kt @@ -31070,19 +28634,10 @@ kt kt kt kt -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl kt hl hh +Rk aa aa aa @@ -31096,47 +28651,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +ac +ac +ac +ac +ac +zY +ac +ac +ac +zY +gO +zY +ac +ac +ac +zY +gO +zY +ac +ac +ac +zY +ac +zY +gO +ac +ac +zY +ac +ac +ac +ac +ac +ac +ac +zY +zY +Rk aa aa aa @@ -31154,8 +28708,7 @@ aa aa aa "} -(49,1,1) = {" -aa +(48,1,1) = {" aa aa aa @@ -31251,6 +28804,7 @@ aa aa aa aa +Rk hh hl hl @@ -31321,12 +28875,12 @@ hl hl hl kt -hl -hl -hl -hl -hl -hl +kt +kt +kt +kt +kt +kt hl hl hl @@ -31340,6 +28894,7 @@ hl kt hl hh +Rk aa aa aa @@ -31353,47 +28908,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +zY +zY +zY +zY +ac +zY +ac +zY +ac +zY +ac +zY +zY +zY +zY +zY +ac +zY +ac +zY +ac +zY +ac +zY +zY +zY +zY +zY +zY +zY +zY +zY +ac +zY +zY +zY +zY +Rk aa aa aa @@ -31411,8 +28965,7 @@ aa aa aa "} -(50,1,1) = {" -aa +(49,1,1) = {" aa aa aa @@ -31508,6 +29061,7 @@ aa aa aa aa +Rk hh hl hl @@ -31597,6 +29151,62 @@ hl kt hl hh +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Rk +zY +gO +zY +ac +ac +ac +ac +ac +zY +ac +ac +ac +ac +ac +zY +gO +ac +ac +ac +ac +zY +ac +ac +ac +ac +ac +ac +ac +zY +ac +ac +gO +zY +ac +ac +gO +zY +zY +Rk +aa +aa aa aa aa @@ -31605,71 +29215,14 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 +"} +(50,1,1) = {" aa aa aa @@ -31765,6 +29318,7 @@ aa aa aa aa +Rk hh hl hl @@ -31828,12 +29382,12 @@ hl hl hl hl -kt -kt -kt -kt -kt -kt +hl +hl +hl +hl +hl +hl kt hl hl @@ -31854,6 +29408,7 @@ hl kt hl hh +Rk aa aa aa @@ -31867,47 +29422,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +ac +zY +zY +zY +ac +zY +zY +zY +zY +zY +ac +zY +ac +zY +zY +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +zY +ac +zY +ac +zY +ac +zY +zY +zY +ac +zY +zY +Rk aa aa aa @@ -31925,8 +29479,7 @@ aa aa aa "} -(52,1,1) = {" -aa +(51,1,1) = {" aa aa aa @@ -32022,6 +29575,7 @@ aa aa aa aa +Rk hh hl hl @@ -32083,15 +29637,15 @@ hl hl hl hl -my -hl -hl -hl -hl -hl -hl hl hl +kt +kt +kt +kt +kt +kt +kt hl hl hl @@ -32111,6 +29665,7 @@ hl kt hl hh +Rk aa aa aa @@ -32124,47 +29679,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +ac +ac +ac +zY +ac +zY +ac +ac +ac +ac +ac +zY +ac +ac +gO +zY +gO +zY +gO +ac +ac +zY +gO +zY +gO +ac +ac +ac +gO +zY +ac +ac +ac +zY +ac +zY +zY +Rk aa aa aa @@ -32182,8 +29736,7 @@ aa aa aa "} -(53,1,1) = {" -aa +(52,1,1) = {" aa aa aa @@ -32279,6 +29832,7 @@ aa aa aa aa +Rk hh hl hl @@ -32340,6 +29894,7 @@ hl hl hl hl +my hl hl hl @@ -32365,9 +29920,9 @@ hl hl hl kt -kt hl hh +Rk aa aa aa @@ -32381,47 +29936,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +zY +zY +zY +zY +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +zY +zY +zY +zY +zY +ac +zY +ac +zY +zY +Rk aa aa aa @@ -32439,8 +29993,7 @@ aa aa aa "} -(54,1,1) = {" -aa +(53,1,1) = {" aa aa aa @@ -32536,6 +30089,7 @@ aa aa aa aa +Rk hh hl hl @@ -32622,9 +30176,10 @@ hl hl hl kt -hl +kt hl hh +Rk aa aa aa @@ -32638,47 +30193,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +ac +ac +ac +ac +gO +zY +ac +ac +ac +ac +ac +zY +ac +zY +gO +ac +ac +ac +ac +zY +ac +ac +ac +ac +ac +ac +ac +zY +ac +ac +gO +zY +ac +zY +ac +zY +zY +Rk aa aa aa @@ -32696,8 +30250,7 @@ aa aa aa "} -(55,1,1) = {" -aa +(54,1,1) = {" aa aa aa @@ -32793,6 +30346,7 @@ aa aa aa aa +Rk hh hl hl @@ -32855,7 +30409,7 @@ hl hl hl hl -nx +hl hl hl hl @@ -32882,6 +30436,7 @@ kt hl hl hh +Rk aa aa aa @@ -32895,47 +30450,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +ac +zY +ac +zY +zY +zY +zY +zY +ac +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +Rk aa aa aa @@ -32953,8 +30507,7 @@ aa aa aa "} -(56,1,1) = {" -aa +(55,1,1) = {" aa aa aa @@ -33050,6 +30603,7 @@ aa aa aa aa +Rk hh hl hl @@ -33112,7 +30666,7 @@ hl hl hl hl -hl +nx hl hl hl @@ -33139,6 +30693,7 @@ kt hl hl hh +Rk aa aa aa @@ -33152,47 +30707,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +ac +zY +gO +zY +gO +zY +ac +ac +ac +zY +ac +ac +ac +zY +gO +ac +ac +zY +ac +ac +ac +zY +gO +zY +ac +ac +gO +zY +ac +zY +gO +zY +ac +ac +ac +zY +zY +Rk aa aa aa @@ -33210,8 +30764,7 @@ aa aa aa "} -(57,1,1) = {" -aa +(56,1,1) = {" aa aa aa @@ -33307,6 +30860,7 @@ aa aa aa aa +Rk hh hl hl @@ -33367,7 +30921,7 @@ hl hl hl hl -my +hl hl hl hl @@ -33396,6 +30950,7 @@ kt hl hl hh +Rk aa aa aa @@ -33409,47 +30964,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +zY +ac +zY +ac +zY +ac +zY +zY +zY +zY +Rk aa aa aa @@ -33467,8 +31021,7 @@ aa aa aa "} -(58,1,1) = {" -aa +(57,1,1) = {" aa aa aa @@ -33564,6 +31117,7 @@ aa aa aa aa +Rk hh hl hl @@ -33608,23 +31162,23 @@ hl hl hl hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +my hl hl hl @@ -33653,6 +31207,7 @@ kt hl hl hh +Rk aa aa aa @@ -33666,47 +31221,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +ac +ac +ac +zY +ac +ac +ac +zY +gO +ac +ac +ac +ac +zY +ac +ac +ac +zY +gO +ac +ac +zY +ac +ac +ac +zY +ac +ac +ac +ac +ac +zY +gO +ac +ac +zY +zY +Rk aa aa aa @@ -33724,8 +31278,7 @@ aa aa aa "} -(59,1,1) = {" -aa +(58,1,1) = {" aa aa aa @@ -33821,6 +31374,7 @@ aa aa aa aa +Rk hh hl hl @@ -33907,9 +31461,10 @@ hl hl hl kt -kt +hl hl hh +Rk aa aa aa @@ -33923,47 +31478,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +zY +zY +ac +zY +zY +zY +zY +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +zY +zY +zY +zY +zY +ac +zY +ac +zY +ac +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +Rk aa aa aa @@ -33981,8 +31535,7 @@ aa aa aa "} -(60,1,1) = {" -aa +(59,1,1) = {" aa aa aa @@ -34078,6 +31631,7 @@ aa aa aa aa +Rk hh hl hl @@ -34163,10 +31717,11 @@ hl hl hl hl -hl +kt kt hl hh +Rk aa aa aa @@ -34180,47 +31735,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +gO +zY +ac +ac +ac +zY +ac +ac +ac +ac +ac +zY +gO +zY +ac +ac +gO +zY +ac +ac +ac +zY +gO +zY +ac +ac +ac +zY +gO +zY +ac +ac +ac +ac +ac +zY +zY +Rk aa aa aa @@ -34238,8 +31792,7 @@ aa aa aa "} -(61,1,1) = {" -aa +(60,1,1) = {" aa aa aa @@ -34335,6 +31888,7 @@ aa aa aa aa +Rk hh hl hl @@ -34395,16 +31949,16 @@ hl hl hl hl -mz hl -my -kt -kt -kt -kt -kt -kt -kt +hl +hl +hl +hl +hl +hl +hl +hl +hl hl hl hl @@ -34424,6 +31978,79 @@ hl kt hl hh +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Rk +zY +ac +zY +ac +zY +ac +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +zY +ac +zY +zY +zY +ac +zY +zY +zY +ac +zY +zY +zY +zY +zY +ac +zY +zY +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(61,1,1) = {" +aa aa aa aa @@ -34494,6 +32121,190 @@ aa aa aa aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Rk +hh +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +mz +hl +my +kt +kt +kt +kt +kt +kt +kt +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +kt +hl +hh +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Rk +zY +ac +ac +ac +zY +ac +ac +ac +zY +gO +zY +gO +ac +ac +ac +ac +zY +ac +ac +ac +zY +gO +ac +ac +ac +ac +ac +ac +ac +ac +zY +gO +ac +ac +ac +gO +zY +zY +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa "} (62,1,1) = {" aa @@ -34591,7 +32402,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -34681,6 +32492,7 @@ hl kt hl hh +Rk aa aa aa @@ -34694,47 +32506,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY +Rk aa aa aa @@ -34848,7 +32659,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -34938,6 +32749,7 @@ hl kt hl hh +Rk aa aa aa @@ -34951,47 +32763,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa aa @@ -35105,7 +32916,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -35195,7 +33006,7 @@ hl kt hl hh -aa +Rk aa aa aa @@ -35362,7 +33173,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -35452,7 +33263,7 @@ kt kt hl hh -aa +Rk aa aa aa @@ -35619,7 +33430,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -35709,7 +33520,7 @@ hl hl hl hh -aa +Rk aa aa aa @@ -35876,7 +33687,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -35966,7 +33777,7 @@ hl hl hl hh -aa +Rk aa aa aa @@ -36133,7 +33944,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -36223,7 +34034,7 @@ hl hl hl hh -aa +Rk aa aa aa @@ -36390,7 +34201,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -36480,7 +34291,7 @@ hl BY hl hh -aa +Rk aa aa aa @@ -36647,7 +34458,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -36737,7 +34548,7 @@ BY Cp BY hh -aa +Rk aa aa aa @@ -36904,7 +34715,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -36994,7 +34805,7 @@ hl BY hl hh -aa +Rk aa aa aa @@ -37161,7 +34972,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -37251,7 +35062,7 @@ hl hl hl hh -aa +Rk aa aa aa @@ -37418,7 +35229,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -37508,7 +35319,7 @@ hh hh hh hh -aa +Rk aa aa aa @@ -37675,7 +35486,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -37759,13 +35570,13 @@ xG xG zx ku -aa -aa -aa -aa -aa -aa -aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa aa @@ -37932,7 +35743,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -38016,7 +35827,7 @@ xG xG zx ku -aa +Rk aa aa aa @@ -38189,7 +36000,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -38273,7 +36084,7 @@ xG xG zx ku -aa +Rk aa aa aa @@ -38446,7 +36257,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -38530,7 +36341,7 @@ xG xG zx ku -aa +Rk aa aa aa @@ -38703,7 +36514,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -38787,7 +36598,7 @@ xG xG zx ku -aa +Rk aa aa aa @@ -38960,7 +36771,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -39044,7 +36855,7 @@ xG yX zy ku -aa +Rk aa aa aa @@ -39217,7 +37028,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -39301,7 +37112,7 @@ ku ku ku ku -aa +Rk aa aa aa @@ -39474,7 +37285,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -39544,7 +37355,7 @@ hl pG ma hh -aa +hh ku sk sk @@ -39556,9 +37367,9 @@ sk sk sk ku -aa -aa -aa +Rk +Rk +Rk aa aa aa @@ -39731,7 +37542,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -39801,7 +37612,7 @@ hl mA hl hh -aa +hh ku sk th @@ -39813,7 +37624,7 @@ ue xL sk ku -aa +Rk aa aa aa @@ -39988,7 +37799,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -40058,7 +37869,7 @@ mA hl mz hh -aa +hh ku sl ti @@ -40070,7 +37881,7 @@ sk xM xP ku -aa +Rk aa aa aa @@ -40245,7 +38056,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -40315,7 +38126,7 @@ hl hl hl hh -aa +hh ku sm sk @@ -40327,7 +38138,7 @@ sk sk yl ku -aa +Rk aa aa aa @@ -40502,7 +38313,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -40572,7 +38383,7 @@ hl hl hl hh -aa +hh ku sn sk @@ -40584,7 +38395,7 @@ sk sk ym ku -aa +Rk aa aa aa @@ -40759,7 +38570,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -40829,7 +38640,7 @@ hl hl hl hh -aa +hh ku sm sk @@ -40841,7 +38652,7 @@ sk xN yl ku -aa +Rk aa aa aa @@ -41016,7 +38827,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -41086,7 +38897,7 @@ hl hl hl hh -aa +hh ku sm sk @@ -41098,7 +38909,7 @@ sk sk yl ku -aa +Rk aa aa aa @@ -41273,7 +39084,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -41343,7 +39154,7 @@ hl hl hl hh -aa +hh ku so sk @@ -41355,7 +39166,7 @@ sk sk yl ku -aa +Rk aa aa aa @@ -41530,7 +39341,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -41600,7 +39411,7 @@ hl hl hl hh -aa +hh ku yk tn @@ -41612,7 +39423,7 @@ sk xO sp ku -aa +Rk aa aa aa @@ -41787,7 +39598,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -41857,7 +39668,7 @@ hl hl hl hh -aa +hh ku sk yk @@ -41869,7 +39680,7 @@ ui sp sk ku -aa +Rk aa aa aa @@ -42044,7 +39855,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -42114,7 +39925,7 @@ hl hl hl hh -aa +hh ku ku ku @@ -42126,7 +39937,7 @@ ku ku ku ku -aa +Rk aa aa aa @@ -42301,7 +40112,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -42371,19 +40182,19 @@ hl hl hl hh -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa aa @@ -42558,7 +40369,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -42628,6 +40439,7 @@ hl hl hl hh +Rk aa aa aa @@ -42641,41 +40453,40 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa aa @@ -42815,7 +40626,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -42885,6 +40696,7 @@ hl hl hl hh +Rk aa aa aa @@ -42898,8 +40710,7 @@ aa aa aa aa -aa -aa +Rk Nd Nd Nd @@ -42932,7 +40743,7 @@ Nd Nd Nd Nd -aa +Rk aa aa aa @@ -43072,7 +40883,7 @@ aa aa aa aa -aa +Rk hh hl hl @@ -43142,6 +40953,7 @@ hl hl hl hh +Rk aa aa aa @@ -43155,8 +40967,7 @@ aa aa aa aa -aa -aa +Rk Nd PO PO @@ -43189,7 +41000,7 @@ Xk Yo Xk Nd -aa +Rk aa aa aa @@ -43329,7 +41140,7 @@ aa aa aa aa -aa +Rk hh hh hh @@ -43399,6 +41210,7 @@ hh hh hh hh +Rk aa aa aa @@ -43412,8 +41224,7 @@ aa aa aa aa -aa -aa +Rk Nd HQ PY @@ -43446,7 +41257,7 @@ Xk Xk Xk Nd -aa +Rk aa aa aa @@ -43586,6 +41397,77 @@ aa aa aa aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa aa @@ -43599,78 +41481,7 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk Nd Mu QH @@ -43703,7 +41514,7 @@ Xk Xk Zt Nd -aa +Rk aa aa aa @@ -43927,7 +41738,7 @@ aa aa aa aa -aa +Rk Nd PY PY @@ -43960,7 +41771,7 @@ Xk Xk Xk Nd -aa +Rk aa aa aa @@ -44184,7 +41995,7 @@ aa aa aa aa -aa +Rk Nd pE NJ @@ -44217,7 +42028,7 @@ Xk Xk Zt Nd -aa +Rk aa aa aa @@ -44441,7 +42252,7 @@ aa aa aa aa -aa +Rk Nd Nd Nd @@ -44474,7 +42285,7 @@ Xk Xk Xk Nd -aa +Rk aa aa aa @@ -44698,7 +42509,7 @@ aa aa aa aa -aa +Rk Nd PL Xk @@ -44731,7 +42542,7 @@ Xk Xx Xk Nd -aa +Rk aa aa aa @@ -44955,7 +42766,7 @@ aa aa aa aa -aa +Rk Nd Tq Xk @@ -44988,7 +42799,7 @@ Nd Nd Nd Nd -aa +Rk aa aa aa @@ -45212,7 +43023,7 @@ aa aa aa aa -aa +Rk Nd Xk Xk @@ -45245,7 +43056,7 @@ OU RS VF Nd -aa +Rk aa aa aa @@ -45469,7 +43280,7 @@ aa aa aa aa -aa +Rk Nd Xk Xk @@ -45502,7 +43313,7 @@ Xk Xk Xk Nd -aa +Rk aa aa aa @@ -45726,7 +43537,7 @@ aa aa aa aa -aa +Rk Nd Nd XL @@ -45759,7 +43570,7 @@ XM XM Xk Nd -aa +Rk aa aa aa @@ -45983,7 +43794,7 @@ aa aa aa aa -aa +Rk Nd yM Xk @@ -46016,7 +43827,7 @@ Po ZU Xk Nd -aa +Rk aa aa aa @@ -46240,7 +44051,7 @@ aa aa aa aa -aa +Rk Nd OG Xk @@ -46273,7 +44084,7 @@ Sd MM Xk Nd -aa +Rk aa aa aa @@ -46497,7 +44308,7 @@ aa aa aa aa -aa +Rk Nd TK Xk @@ -46530,7 +44341,7 @@ Sd MM xB Nd -aa +Rk aa aa aa @@ -46754,7 +44565,7 @@ aa aa aa aa -aa +Rk Nd YL Xk @@ -46787,7 +44598,7 @@ Sd MM Xk Nd -aa +Rk aa aa aa @@ -47011,7 +44822,7 @@ aa aa aa aa -aa +Rk Nd Xe Xk @@ -47044,7 +44855,7 @@ PA Pl Xk Nd -aa +Rk aa aa aa @@ -47268,7 +45079,7 @@ aa aa aa aa -aa +Rk Nd Ny Xk @@ -47301,7 +45112,7 @@ GY GY Xk Nd -aa +Rk aa aa aa @@ -47525,7 +45336,7 @@ aa aa aa aa -aa +Rk Nd Bs Ri @@ -47558,7 +45369,7 @@ Xk Xk Xk Nd -aa +Rk aa aa aa @@ -47782,7 +45593,7 @@ aa aa aa aa -aa +Rk Nd SU Xk @@ -47815,7 +45626,7 @@ Tb Uh tW Nd -aa +Rk aa aa aa @@ -48039,7 +45850,7 @@ aa aa aa aa -aa +Rk Nd Nd Nd @@ -48072,6 +45883,7 @@ Nd Nd Nd Nd +Rk aa aa aa @@ -48114,43 +45926,8 @@ 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 +"} +(115,1,1) = {" aa aa aa @@ -48330,6 +46107,40 @@ aa aa aa aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa aa @@ -54415,29 +52226,29 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa aa @@ -54672,6 +52483,7 @@ aa aa aa aa +Rk aa aa aa @@ -54693,8 +52505,7 @@ aa aa aa aa -aa -aa +Rk aa aa aa @@ -54929,6 +52740,7 @@ aa aa aa aa +Rk aa aa aa @@ -54950,8 +52762,7 @@ aa aa aa aa -aa -aa +Rk aa aa aa @@ -55186,6 +52997,7 @@ aa aa aa aa +Rk aa aa aa @@ -55207,8 +53019,7 @@ aa aa aa aa -aa -aa +Rk aa aa aa @@ -55443,6 +53254,7 @@ aa aa aa aa +Rk aa aa aa @@ -55464,8 +53276,7 @@ aa aa aa aa -aa -aa +Rk aa aa aa @@ -55700,6 +53511,7 @@ aa aa aa aa +Rk aa aa aa @@ -55721,8 +53533,7 @@ aa aa aa aa -aa -aa +Rk aa aa aa @@ -55957,6 +53768,7 @@ aa aa aa aa +Rk aa aa aa @@ -55978,8 +53790,7 @@ aa aa aa aa -aa -aa +Rk aa aa aa @@ -56214,6 +54025,7 @@ aa aa aa aa +Rk aa aa aa @@ -56226,6 +54038,7 @@ aa aa aa aa +Mz aa aa aa @@ -56234,9 +54047,7 @@ aa aa aa aa -aa -aa -aa +Rk aa aa aa @@ -56471,29 +54282,29 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa aa @@ -57773,7 +55584,7 @@ aa aa aa aa -jC +ad aa aa aa @@ -69025,13 +66836,13 @@ aa aa aa fZ -Qd +qM gl Xu Xu Xu gl -Qd +qM fZ Xu Xu @@ -71504,51 +69315,51 @@ 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 +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk +Rk aa aa aa @@ -71761,18 +69572,6 @@ aa aa "} (207,1,1) = {" -ab -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ab aa aa aa @@ -71817,6 +69616,18 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -72018,18 +69829,6 @@ aa aa "} (208,1,1) = {" -ac -tj -tb -tb -tb -tb -tb -tb -tb -tb -tb -fx aa aa aa @@ -72074,6 +69873,18 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -72275,18 +70086,6 @@ aa aa "} (209,1,1) = {" -ac -tk -tb -tb -tb -tb -tb -tb -tb -tb -tb -fx aa aa aa @@ -72331,6 +70130,18 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -72532,18 +70343,6 @@ aa aa "} (210,1,1) = {" -ac -Sq -tb -tb -tb -tb -tb -tb -tb -tb -tb -fx aa aa aa @@ -72588,6 +70387,18 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -72789,18 +70600,6 @@ aa aa "} (211,1,1) = {" -ac -ZN -tb -tb -tb -tb -tb -tb -tb -tb -tb -fx aa aa aa @@ -72845,6 +70644,18 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -73046,18 +70857,6 @@ aa aa "} (212,1,1) = {" -ac -tl -tb -tb -tb -tb -tb -tb -tb -tb -tb -fx aa aa aa @@ -73102,6 +70901,18 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -73303,40 +71114,6 @@ aa aa "} (213,1,1) = {" -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ab -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ab -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ab aa aa aa @@ -73381,6 +71158,40 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -73560,40 +71371,6 @@ aa aa "} (214,1,1) = {" -ac -af -af -af -af -af -af -af -af -af -af -bj -bk -bk -bk -bk -bk -bk -bk -bk -bk -bk -bj -dm -dm -dm -dm -dm -dm -dm -dm -dm -dm -fx aa aa aa @@ -73638,6 +71415,40 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -73817,40 +71628,6 @@ aa aa "} (215,1,1) = {" -ac -af -aw -af -af -aO -aR -aG -af -ax -af -bj -bk -bk -bk -bk -bk -bk -bk -bk -bk -bk -bj -dm -dG -dG -dm -dG -dG -dm -dG -dG -dm -fx aa aa aa @@ -73895,6 +71672,40 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -74074,40 +71885,6 @@ aa aa "} (216,1,1) = {" -ac -af -ax -af -af -af -af -af -af -ax -af -bj -bk -bk -bk -bk -ce -cq -bk -bk -bk -bk -bj -dm -dG -dG -eu -dG -dG -eu -dG -dG -dm -fx aa aa aa @@ -74152,6 +71929,40 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -74178,7 +71989,7 @@ Qn Bt gh Up -hc +hS hv gh Qq @@ -74331,40 +72142,6 @@ aa aa "} (217,1,1) = {" -ac -af -ax -aG -aM -af -aS -af -af -aG -af -bj -bk -bk -bk -bk -bk -cr -bk -bk -bk -bk -bj -dm -dG -dG -dm -dG -dG -dm -dG -dG -dm -fx aa aa aa @@ -74409,6 +72186,40 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -74435,7 +72246,7 @@ Qn PB gh Up -hc +TA hv gh ge @@ -74588,40 +72399,6 @@ aa aa "} (218,1,1) = {" -ac -af -af -af -af -af -aw -af -af -af -af -bj -bk -bk -bk -bk -bk -bk -bk -bk -bk -bk -bj -dm -dm -dm -dm -dm -dm -dm -dm -dm -dm -fx aa aa aa @@ -74666,6 +72443,40 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -74692,7 +72503,7 @@ Qn Tw gh Up -hc +UL hv gh ge @@ -74845,40 +72656,6 @@ aa aa "} (219,1,1) = {" -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ab aa aa aa @@ -74923,6 +72700,40 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -75102,40 +72913,6 @@ aa aa "} (220,1,1) = {" -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -bj -bl -bn -bD -ca -bD -bl -ca -bD -bm -bl -bj -dn -dH -ed -ev -ew -ev -ew -eW -fj -dn -fx aa aa aa @@ -75180,6 +72957,40 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -75359,40 +73170,6 @@ aa aa "} (221,1,1) = {" -ac -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -bj -bm -bD -bR -bl -bl -bE -cD -cK -cK -ca -bj -dn -dI -ee -ew -ev -ew -ev -eX -fk -dn -fx aa aa aa @@ -75437,6 +73214,40 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -75614,42 +73425,33 @@ aa aa aa aa -"} -(222,1,1) = {" -ac -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -bj -bl -bE -bS -cb -bl -bl -bR -cL -cM -bl -bj -dn -dJ -ed -ev -ew -ev -ew -eW -fl -dn -fx +"} +(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 @@ -75669,6 +73471,15 @@ aa aa aa aa +Rk +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -75873,40 +73684,40 @@ aa aa "} (223,1,1) = {" -ac -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -bj -bn -bF -bT -cc -bl -bm -cE -cM -cK -bn -bj -dn -dK -ee -ew -ev -ew -ev -eX -fm -dn -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 @@ -75917,7 +73728,7 @@ ab ab aa aa -aa +Rk aa aa aa @@ -76130,40 +73941,40 @@ aa aa "} (224,1,1) = {" -ac -ak -ay -aH -aj -aH -aH -aj -aH -ay -bc -bj -bl -bl -bD -ca -bl -bD -bl -cN -cW -bl -bj -dn -dH -ed -ev -ew -ev -ew -eW -fj -dn -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fB fB @@ -76174,7 +73985,7 @@ fB ab aa aa -aa +Rk aa aa aa @@ -76387,39 +74198,39 @@ aa aa "} (225,1,1) = {" -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fC @@ -76431,7 +74242,7 @@ fC ab ab ab -aa +Rk aa aa aa @@ -76644,40 +74455,40 @@ aa aa "} (226,1,1) = {" -ac -al -az -an -an -aP -aP -aP -aP -aP -aP -bj -bo -bG -bH -bH -cf -cs -bH -cO -bH -cZ -ac -do -dL -ef -ex -eH -eH -eH -eY -dL -fq -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 @@ -76688,7 +74499,7 @@ ab fU fV ab -aa +Rk aa aa aa @@ -76901,40 +74712,40 @@ aa aa "} (227,1,1) = {" -ac -am -an -aI -an -aQ -aT -aY -ba -ba -bd -bj -bp -bH -bH -bH -bH -bH -bH -cP -bH -da -ac -dp -dL -eg -ey -eH -eH -eH -eY -dL -fq -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 @@ -76945,7 +74756,7 @@ ab fU fV ab -aa +Rk aa aa aa @@ -77158,40 +74969,40 @@ aa aa "} (228,1,1) = {" -ac -an -aA -aJ -aN -an -aU -aZ -aZ -aZ -be -bj -bq -bH -bU -cd -cg -ct -bH -cQ -cX -db -ac -dq -dM -eg -ez -eH -eH -eH -eZ -dL -fq -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 @@ -77202,7 +75013,7 @@ ab fU fV ab -aa +Rk aa aa aa @@ -77413,42 +75224,42 @@ aa aa aa aa -"} -(229,1,1) = {" -ac -an -aA -aK -aN -an -aV -aZ -aZ -aZ -be -bj -br -bH -bV -cd -bH -bH -bH -bH -bH -dc -ac -dr -dL -eg -eA -eH -eH -eH -eY -dL -fq -fx +"} +(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 +ab ab ab ab @@ -77459,7 +75270,7 @@ ab fU fV ab -aa +Rk aa aa aa @@ -77672,40 +75483,40 @@ aa aa "} (230,1,1) = {" -ac -ao -an -aL -an -aQ -aT -aZ -bb -bb -bf -bj -bs -bH -bW -cd -ch -cu -bH -bH -bH -dd -ac -ds -dL -eh -ex -eH -eH -eH -eY -dL -fq -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 @@ -77716,7 +75527,7 @@ ab fU fV ab -aa +Rk aa aa aa @@ -77929,39 +75740,39 @@ aa aa "} (231,1,1) = {" -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fD @@ -77973,7 +75784,7 @@ fD ab ab ab -aa +Rk aa aa aa @@ -78186,40 +75997,40 @@ aa aa "} (232,1,1) = {" -ac -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -bj -bt -bI -bI -bI -ci -cv -cF -cF -cF -de -bj -dt -dN -ei -ej -eI -eP -ej -fa -fn -fr -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fy fE fL @@ -78230,7 +76041,7 @@ fE fy ab aa -aa +Rk aa aa aa @@ -78443,40 +76254,40 @@ aa aa "} (233,1,1) = {" -ac -ap -aB -ap -ap -ap -ap -ap -ap -aB -ap -bj -Xf -vo -bX -bJ -cj -cw -bJ -cR -VH -VI -bj -du -dO -ej -ej -eJ -eJ -eV -fb -fo -fs -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fz fz fz @@ -78487,7 +76298,7 @@ fz fz ab aa -aa +Rk aa aa aa @@ -78700,40 +76511,40 @@ aa aa "} (234,1,1) = {" -ac -ap -ap -ap -ap -aB -aB -ap -ap -ap -ap -bj -bu -bJ -bX -bJ -cj -cw -cG -zT -bJ -df -bj -du -dP -ek -ej -ej -ej -eV -fc -fo -fs -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fA fF fF @@ -78744,7 +76555,7 @@ fF fA ab aa -aa +Rk aa aa aa @@ -78957,40 +76768,40 @@ aa aa "} (235,1,1) = {" -ac -ap -aB -ap -ap -ap -ap -ap -ap -aB -ap -bj -bv -bK -bX -bJ -cj -cw -bJ -zT -cH -dg -bj -du -dQ -ej -ej -eK -eK -eV -fd -fo -fs -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fz fG fG @@ -79001,7 +76812,7 @@ fG fz ab aa -aa +Rk aa aa aa @@ -79212,42 +77023,42 @@ aa aa aa aa -"} -(236,1,1) = {" -ac -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -bj -Sx -Zl -Zl -Zl -ck -cx -cH -cH -cH -SD -bj -dt -dR -el -ej -eL -eQ -ej -fe -fn -ft -fx +"} +(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 +ab fz fH fH @@ -79258,7 +77069,7 @@ fH fz ab aa -aa +Rk aa aa aa @@ -79471,39 +77282,39 @@ aa aa "} (237,1,1) = {" -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fz fH @@ -79515,7 +77326,7 @@ fH fz ab aa -aa +Rk aa aa aa @@ -79728,40 +77539,40 @@ aa aa "} (238,1,1) = {" -ac -aq -aq -aq -aq -aq -aq -aq -aq -aq -aq -bj -bw -bw -bw -bw -bw -bw -bw -cS -cY -dh -bj -dv -dS -em -eB -eM -eR -eM -eR -eM -ep -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fz fH fH @@ -79772,7 +77583,7 @@ fH fz ab aa -aa +Rk aa aa aa @@ -79985,40 +77796,40 @@ aa aa "} (239,1,1) = {" -ac -aq -aq -aq -aq -aq -aq -aq -aq -aq -aq -bj -bw -bL -bY -bw -cl -bw -bw -cT -cY -dh -bj -dw -dT -en -eB -eN -eS -eN -eS -eN -en -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fz fH fH @@ -80029,7 +77840,7 @@ fH fz ab aa -aa +Rk aa aa aa @@ -80242,40 +78053,40 @@ aa aa "} (240,1,1) = {" -ac -aq -aq -aq -aq -aq -aq -aq -aq -aq -aq -bj -bw -bw -bw -bw -bw -bw -bw -cU -cY -dh -bj -dx -dU -eo -eB -eB -eB -eB -eB -eB -eB -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fz fH fH @@ -80286,7 +78097,7 @@ fH fz ab aa -aa +Rk aa aa aa @@ -80499,40 +78310,40 @@ aa aa "} (241,1,1) = {" -ac -aq -aq -aq -aq -aq -aq -aq -aq -aq -aq -bj -bw -bM -bY -bw -bw -cy -bw -cS -cY -dh -bj -dy -dV -ep -eB -eM -eR -eM -eR -eM -ep -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fz fH fH @@ -80543,7 +78354,7 @@ fH fz ab aa -aa +Rk aa aa aa @@ -80756,40 +78567,40 @@ aa aa "} (242,1,1) = {" -ac -aq -aq -aq -aq -aq -aq -aq -aq -aq -aq -bj -bw -bw -bw -bw -bw -bw -bw -cS -cY -dh -bj -dz -dW -eq -eB -eN -eS -eN -eS -eN -en -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fz fH fH @@ -80800,7 +78611,7 @@ fH fz ab aa -aa +Rk aa aa aa @@ -81011,41 +78822,41 @@ aa aa aa aa -"} -(243,1,1) = {" -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag +"} +(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 ab fz fI @@ -81057,7 +78868,7 @@ fI fz ab aa -aa +Rk aa aa aa @@ -81270,40 +79081,40 @@ aa aa "} (244,1,1) = {" -ac -ar -ar -ar -ar -ar -ar -ar -ar -ar -ar -bj -bx -bN -bN -bN -cm -cz -bN -bN -bN -bz -bj -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fA fF fF @@ -81314,7 +79125,7 @@ fF fA ab aa -aa +Rk aa aa aa @@ -81527,40 +79338,40 @@ aa aa "} (245,1,1) = {" -ac -ar -aC -ar -ar -ar -ar -ar -ar -aC -ar -bj -by -bN -bN -bN -cm -cz -bN -bN -bN -di -bj -dA -dX -dA -eC -eO -eT -eO -eD -eO -dA -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fz fz fz @@ -81571,7 +79382,7 @@ fz fz ab aa -aa +Rk aa aa aa @@ -81784,40 +79595,40 @@ aa aa "} (246,1,1) = {" -ac -ar -ar -ar -aC -ar -ar -aC -ar -ar -ar -bj -by -bN -bN -bN -cm -cz -bN -bN -bN -di -bj -dA -dY -dA -dA -dA -dA -dA -dA -dA -dA -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fy fJ fM @@ -81828,7 +79639,7 @@ fJ fy ab aa -aa +Rk aa aa aa @@ -82041,40 +79852,40 @@ aa aa "} (247,1,1) = {" -ac -ar -aC -ar -ar -ar -ar -ar -ar -aC -ar -bj -by -bN -bN -bN -cm -cz -bN -bN -bN -di -bj -dA -dZ -dA -eD -eO -eU -eO -ff -eO -dA -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fD fD @@ -82085,7 +79896,7 @@ fD ab ab ab -aa +Rk aa aa aa @@ -82298,40 +80109,40 @@ aa aa "} (248,1,1) = {" -ac -ar -ar -ar -ar -ar -ar -ar -ar -ar -ar -bj -bz -bN -bN -bN -cm -cz -bN -bN -bN -bx -bj -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 @@ -82342,6 +80153,39 @@ ab fU fW ab +Rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -82355,6 +80199,38 @@ aa aa aa aa +fZ +hB +gE +hB +gE +hB +gE +hB +fZ +gR +Ps +ge +NI +Tl +hC +Of +fZ +gz +gd +gR +fZ +gh +if +ie +fZ +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -82388,38 +80264,6 @@ aa aa aa aa -fZ -hB -gE -hB -gE -hB -gE -hB -fZ -gR -Ps -ge -NI -Tl -hC -Of -fZ -gz -gd -gR -fZ -gh -if -ie -fZ -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -82520,6 +80364,8 @@ aa aa aa aa +"} +(249,1,1) = {" aa aa aa @@ -82553,41 +80399,6 @@ aa aa aa aa -"} -(249,1,1) = {" -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag ab ab ab @@ -82599,7 +80410,7 @@ ab fU fW ab -aa +Rk aa aa aa @@ -82812,40 +80623,40 @@ aa aa "} (250,1,1) = {" -ac -as -aD -aD -aD -aD -aW -aW -aW -aW -bg -bj -bA -bO -bO -bO -cn -cA -cI -cI -cI -dj -bj -dB -dB -dB -dB -dB -dB -dB -dB -dB -Zh -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 @@ -82856,7 +80667,7 @@ ab fU fW ab -aa +Rk aa aa aa @@ -83069,40 +80880,40 @@ aa aa "} (251,1,1) = {" -ac -at -aE -aE -aE -aE -aE -aE -aE -aE -bh -bj -bB -bP -bZ -bP -co -cB -bP -cV -bP -dk -bj -dC -ea -er -eE -eE -eE -eE -fg -fp -fu -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 @@ -83113,7 +80924,7 @@ ab fU fW ab -aa +Rk aa aa aa @@ -83180,9 +80991,9 @@ gA gR gR fZ -Qd +qM hC -Qd +qM fZ aa aa @@ -83326,40 +81137,40 @@ aa aa "} (252,1,1) = {" -ac -at -aE -aE -aE -aE -aE -aE -aE -aE -bh -bj -bB -bP -bZ -bP -co -cB -bP -cV -bP -dk -bj -dD -eb -es -eF -eF -eF -eF -fh -fp -fv -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 @@ -83370,7 +81181,7 @@ ab fU fW ab -aa +Rk aa aa aa @@ -83583,40 +81394,40 @@ aa aa "} (253,1,1) = {" -ac -at -aE -aE -aE -aE -aE -aE -aE -aE -bh -bj -bB -bP -bZ -bP -co -cB -bP -cV -bP -dk -bj -dE -ec -et -eG -eG -eG -eG -fi -fp -fw -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fC fC @@ -83627,7 +81438,7 @@ fC ab ab ab -aa +Rk aa aa aa @@ -83840,40 +81651,40 @@ aa aa "} (254,1,1) = {" -ac -au -aF -aF -aF -aF -aX -aX -aX -aX -bi -bj -bC -bQ -bQ -bQ -cp -cC -cJ -cJ -cJ -dl -bj -dF -dF -dF -dF -dF -dF -dF -dF -dF -xE -fx +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 fK fK @@ -83884,7 +81695,7 @@ fK ab aa aa -aa +Rk aa aa aa @@ -83952,7 +81763,7 @@ gR gR fZ fZ -Qd +qM fZ aa aa @@ -84097,39 +81908,39 @@ aa aa "} (255,1,1) = {" -ab -av -av -av -av -av -av -av -av -av -av -ab -av -av -av -av -av -av -av -av -av -av -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 @@ -84141,7 +81952,7 @@ ab ab aa aa -aa +Rk aa aa aa diff --git a/_maps/map_files/generic/CityOfCogs.dmm b/_maps/map_files/generic/CityOfCogs.dmm index 4e9d3434f6524..bd43b54e686bb 100644 --- a/_maps/map_files/generic/CityOfCogs.dmm +++ b/_maps/map_files/generic/CityOfCogs.dmm @@ -80,7 +80,7 @@ /area/reebe/city_of_cogs) "v" = ( /obj/structure/table/brass, -/obj/item/drone_shell/cogscarab, +/obj/effect/mob_spawn/drone/cogscarab, /turf/open/floor/clockwork/reebe, /area/reebe/city_of_cogs) "w" = ( diff --git a/_maps/multiz_debug.json b/_maps/multiz_debug.json index e8a474161e769..8d634f7b343a5 100644 --- a/_maps/multiz_debug.json +++ b/_maps/multiz_debug.json @@ -1,6 +1,6 @@ -{ - "map_name": "MultiZ Debug", - "map_path": "map_files/debug", - "map_file": "multiz.dmm", - "traits": [{"Up" : 1, "Linkage" : "Cross"}, {"Up" : 1, "Down" : -1, "Baseturf" : "/turf/open/openspace", "Linkage" : "Cross"}, {"Down" : -1, "Baseturf" : "/turf/open/openspace", "Linkage" : "Cross"}] - } +{ + "map_name": "MultiZ Debug", + "map_path": "map_files/debug", + "map_file": "multiz.dmm", + "traits": [{"Up" : 1, "Linkage" : "Cross"}, {"Up" : 1, "Down" : -1, "Baseturf" : "/turf/open/openspace", "Linkage" : "Cross"}, {"Down" : -1, "Baseturf" : "/turf/open/openspace", "Linkage" : "Cross"}] + } diff --git a/_maps/runtimestation.json b/_maps/runtimestation.json index f9333c65a2317..ca2cc3d3790c3 100644 --- a/_maps/runtimestation.json +++ b/_maps/runtimestation.json @@ -1,8 +1,8 @@ -{ - "map_name": "Runtime Station", - "map_path": "map_files/debug", - "map_file": "runtimestation.dmm", - "shuttles": { - "cargo": "cargo_delta" - } -} +{ + "map_name": "Runtime Station", + "map_path": "map_files/debug", + "map_file": "runtimestation.dmm", + "shuttles": { + "cargo": "cargo_delta" + } +} diff --git a/_maps/shuttles/arrival_corg.dmm b/_maps/shuttles/arrival_corg.dmm new file mode 100644 index 0000000000000..f76186647c4ad --- /dev/null +++ b/_maps/shuttles/arrival_corg.dmm @@ -0,0 +1,597 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/machinery/vending/wallmed{ + name = "Emergency NanoMed"; + use_power = 0 + }, +/turf/closed/wall/mineral/titanium, +/area/shuttle/arrival) +"b" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/structure/sign/directions/security{ + dir = 1; + pixel_x = 33 + }, +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_x = 33; + pixel_y = 8 + }, +/obj/structure/sign/directions/command{ + dir = 1; + pixel_x = 33; + pixel_y = -8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/arrival) +"c" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/arrival) +"d" = ( +/obj/structure/closet/crate, +/obj/item/crowbar, +/obj/item/crowbar, +/obj/item/crowbar, +/obj/effect/spawner/lootdrop/glowstick, +/obj/effect/spawner/lootdrop/glowstick, +/obj/effect/spawner/lootdrop/glowstick, +/obj/effect/spawner/lootdrop/glowstick, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/arrival) +"e" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/airlock/shuttle{ + name = "Arrival Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"f" = ( +/obj/structure/table/reinforced, +/obj/item/paper/pamphlet/centcom/visitor_info{ + pixel_x = -3; + pixel_y = -1 + }, +/obj/item/paper/pamphlet/centcom/visitor_info, +/obj/item/paper/pamphlet/centcom/visitor_info{ + pixel_x = 3; + pixel_y = 1 + }, +/obj/item/pen/red, +/obj/item/paicard, +/obj/item/paicard, +/obj/item/paicard, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/arrival) +"g" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"h" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"i" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen/red, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/arrival) +"k" = ( +/obj/structure/table/reinforced, +/obj/item/storage/briefcase{ + pixel_x = 1; + pixel_y = 1 + }, +/obj/item/storage/briefcase{ + pixel_x = -2; + pixel_y = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/arrival) +"l" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/arrival) +"m" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/arrival) +"n" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"o" = ( +/obj/structure/closet/wardrobe/mixed, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/arrival) +"p" = ( +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/arrival) +"q" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/shuttle/arrival) +"r" = ( +/obj/structure/chair/comfy/shuttle, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"t" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/structure/sign/directions/security{ + dir = 1; + pixel_x = -33 + }, +/obj/structure/sign/directions/command{ + dir = 1; + pixel_x = -33; + pixel_y = -8 + }, +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_x = -33; + pixel_y = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/arrival) +"u" = ( +/obj/machinery/computer/crew{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/arrival) +"v" = ( +/turf/template_noop, +/area/template_noop) +"w" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/plumbing{ + pixel_x = -3 + }, +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = 3; + pixel_y = 1 + }, +/obj/item/book/manual/wiki/engineering_guide{ + pixel_y = 3 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/arrival) +"x" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"A" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall/mineral/titanium, +/area/shuttle/arrival) +"B" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/arrival) +"C" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/arrival) +"D" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/structure/sign/directions/medical{ + dir = 4; + pixel_x = 33 + }, +/obj/structure/sign/directions/science{ + dir = 1; + pixel_x = 33; + pixel_y = 8 + }, +/obj/structure/sign/directions/engineering{ + dir = 1; + pixel_x = 33; + pixel_y = -8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/arrival) +"E" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating/airless, +/area/shuttle/arrival) +"F" = ( +/obj/structure/table/reinforced, +/obj/item/storage/firstaid, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/arrival) +"G" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"H" = ( +/obj/docking_port/mobile/arrivals{ + dir = 2; + dwidth = 4; + height = 13; + name = "corg arrivals shuttle"; + width = 9 + }, +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/arrival) +"I" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"J" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/arrival) +"K" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"L" = ( +/obj/structure/table/reinforced, +/obj/item/gps, +/obj/effect/spawner/lootdrop/glowstick, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/arrival) +"M" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/door/airlock/shuttle{ + name = "Arrival Shuttle Airlock" + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"N" = ( +/obj/machinery/computer{ + dir = 1; + name = "Shuttle computer" + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/arrival) +"O" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/arrival) +"P" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"Q" = ( +/obj/machinery/computer/shuttle_flight{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/arrival) +"R" = ( +/obj/structure/chair/comfy/shuttle, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"S" = ( +/obj/structure/closet/crate/internals, +/obj/effect/spawner/lootdrop/glowstick, +/obj/effect/spawner/lootdrop/glowstick, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/arrival) +"T" = ( +/obj/machinery/status_display/evac, +/turf/closed/wall/mineral/titanium, +/area/shuttle/arrival) +"U" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/shuttle{ + name = "Arrival Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"V" = ( +/obj/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/arrival) +"W" = ( +/obj/structure/shuttle/engine/heater{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/shuttle/arrival) +"Y" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"Z" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/structure/sign/directions/medical{ + dir = 4; + pixel_x = -33 + }, +/obj/structure/sign/directions/science{ + dir = 1; + pixel_x = -33; + pixel_y = 8 + }, +/obj/structure/sign/directions/engineering{ + dir = 1; + pixel_x = -33; + pixel_y = -8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/arrival) + +(1,1,1) = {" +v +p +O +m +U +m +V +m +U +O +m +v +v +"} +(2,1,1) = {" +E +p +m +S +n +t +c +Z +h +A +m +V +m +"} +(3,1,1) = {" +C +W +V +f +g +P +P +P +Y +m +L +F +m +"} +(4,1,1) = {" +C +W +V +o +n +l +l +B +h +T +r +u +V +"} +(5,1,1) = {" +H +p +T +d +K +T +V +a +G +M +I +N +V +"} +(6,1,1) = {" +C +W +V +o +n +c +c +J +h +T +R +Q +V +"} +(7,1,1) = {" +C +W +V +w +g +P +P +P +Y +m +k +i +m +"} +(8,1,1) = {" +q +p +m +S +x +b +l +D +h +A +m +V +m +"} +(9,1,1) = {" +v +p +O +m +e +m +V +m +e +O +m +v +v +"} diff --git a/_maps/shuttles/arrival_delta.dmm b/_maps/shuttles/arrival_delta.dmm index 5a8f030792fc3..9efe49fd6520c 100644 --- a/_maps/shuttles/arrival_delta.dmm +++ b/_maps/shuttles/arrival_delta.dmm @@ -203,7 +203,7 @@ /obj/machinery/status_display/evac{ pixel_x = -32 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral{ @@ -226,7 +226,7 @@ /obj/machinery/status_display/ai{ pixel_x = 32 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral, @@ -277,7 +277,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/arrival) "A" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral{ @@ -312,7 +312,7 @@ /turf/open/floor/plasteel, /area/shuttle/arrival) "E" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral, diff --git a/_maps/shuttles/arrival_donut.dmm b/_maps/shuttles/arrival_donut.dmm deleted file mode 100644 index c467ca67b5811..0000000000000 --- a/_maps/shuttles/arrival_donut.dmm +++ /dev/null @@ -1,188 +0,0 @@ -//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/structure/shuttle/engine/propulsion{ - dir = 1; - icon_state = "propulsion" - }, -/turf/open/floor/plating/airless, -/area/shuttle/arrival) -"d" = ( -/obj/structure/shuttle/engine/heater{ - dir = 1; - icon_state = "heater" - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating/airless, -/area/shuttle/arrival) -"e" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/mineral/titanium, -/area/shuttle/arrival) -"f" = ( -/obj/machinery/computer/arcade, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/arrival) -"g" = ( -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/arrival) -"h" = ( -/turf/open/floor/mineral/titanium, -/area/shuttle/arrival) -"i" = ( -/obj/structure/chair/comfy/shuttle, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/arrival) -"k" = ( -/obj/machinery/door/airlock/titanium, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/shuttle/arrival) -"l" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/arrival) -"m" = ( -/obj/structure/chair/comfy/shuttle, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/arrival) -"n" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/arrival) -"o" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, -/area/shuttle/arrival) -"p" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 1; - icon_state = "propulsion" - }, -/obj/docking_port/mobile/arrivals{ - dir = 2; - dwidth = 3; - height = 13; - name = "donut arrivals shuttle"; - width = 7 - }, -/turf/open/floor/plating/airless, -/area/shuttle/arrival) - -(1,1,1) = {" -a -b -b -b -b -b -o -o -b -b -b -b -a -"} -(2,1,1) = {" -b -b -e -h -h -l -h -h -l -h -h -b -b -"} -(3,1,1) = {" -c -d -f -i -h -m -h -m -h -m -h -g -o -"} -(4,1,1) = {" -p -d -g -i -h -m -h -m -h -m -h -i -o -"} -(5,1,1) = {" -c -d -f -i -h -m -h -m -h -m -h -g -o -"} -(6,1,1) = {" -b -b -e -h -h -n -h -h -n -h -h -b -b -"} -(7,1,1) = {" -a -b -b -b -k -b -o -o -b -k -b -b -a -"} diff --git a/_maps/shuttles/assault_pod_default.dmm b/_maps/shuttles/assault_pod_default.dmm index 03b928f963647..cecb6ebbd82ba 100644 --- a/_maps/shuttles/assault_pod_default.dmm +++ b/_maps/shuttles/assault_pod_default.dmm @@ -28,7 +28,7 @@ /turf/open/floor/plating, /area/shuttle/assault_pod) "h" = ( -/obj/machinery/computer/shuttle/syndicate/drop_pod, +/obj/machinery/computer/shuttle_flight/syndicate/drop_pod, /turf/closed/wall/mineral/plastitanium, /area/shuttle/assault_pod) "p" = ( diff --git a/_maps/shuttles/capsule_traitor.dmm b/_maps/shuttles/capsule_traitor.dmm new file mode 100644 index 0000000000000..c8f6479c09cc1 --- /dev/null +++ b/_maps/shuttles/capsule_traitor.dmm @@ -0,0 +1,377 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pod_shuttle) +"b" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/three, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/pickaxe/emergency, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pod_shuttle) +"c" = ( +/obj/structure/fans/tiny, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/airlock/centcom{ + name = "Shuttle Airlock"; + opacity = 1; + req_access_txt = "" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pod_shuttle) +"e" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pod_shuttle) +"f" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/modular_fabricator/autolathe/hacked, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pod_shuttle) +"h" = ( +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pod_shuttle) +"i" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pod_shuttle) +"j" = ( +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/pod_shuttle) +"k" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/toy/nuke, +/obj/item/toy/cards/deck/syndicate, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pod_shuttle) +"m" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pod_shuttle) +"n" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/two, +/obj/item/clothing/glasses/sunglasses/advanced, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pod_shuttle) +"o" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pod_shuttle) +"p" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pod_shuttle) +"q" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pod_shuttle) +"s" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pod_shuttle) +"t" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pod_shuttle) +"x" = ( +/obj/machinery/atmospherics/components/unary/shuttle/heater{ + dir = 1 + }, +/obj/effect/spawner/structure/window/plastitanium, +/turf/open/floor/plating, +/area/shuttle/pod_shuttle) +"z" = ( +/obj/machinery/computer/shuttle_flight/custom_shuttle/bluespace_pod/traitor, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pod_shuttle) +"A" = ( +/obj/machinery/shuttle/engine/plasma{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/pod_shuttle) +"B" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/stack/sheet/mineral/plasma/five, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pod_shuttle) +"C" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/purple/visible{ + dir = 1 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/shuttle/pod_shuttle) +"D" = ( +/obj/machinery/computer/crew/syndie, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pod_shuttle) +"K" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pod_shuttle) +"M" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pod_shuttle) +"N" = ( +/obj/structure/fans/tiny, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/centcom{ + name = "Shuttle Airlock"; + opacity = 1; + req_access_txt = "" + }, +/obj/docking_port/mobile{ + dir = 8; + dwidth = 4; + height = 6; + shuttle_object_type = /datum/orbital_object/shuttle/custom_shuttle; + width = 10 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pod_shuttle) +"P" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/plasma_refiner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pod_shuttle) +"Q" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/purple/visible{ + dir = 1 + }, +/obj/structure/cable/yellow, +/mob/living/simple_animal/hostile/carp/cayenne, +/turf/open/floor/plating, +/area/shuttle/pod_shuttle) +"S" = ( +/turf/template_noop, +/area/template_noop) +"T" = ( +/obj/effect/spawner/structure/window/plastitanium, +/turf/open/floor/plating, +/area/shuttle/pod_shuttle) +"V" = ( +/obj/machinery/computer/camera_advanced/syndie, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pod_shuttle) +"W" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/purple/visible{ + dir = 1 + }, +/obj/machinery/power/port_gen/pacman, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/shuttle/pod_shuttle) +"X" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/pod_shuttle) +"Y" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/syndicate, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pod_shuttle) +"Z" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/pod_shuttle) + +(1,1,1) = {" +S +j +T +j +j +T +c +j +j +j +S +"} +(2,1,1) = {" +T +T +k +s +i +f +a +a +P +m +m +"} +(3,1,1) = {" +T +V +M +h +e +h +h +Z +Q +x +A +"} +(4,1,1) = {" +T +z +t +h +n +B +b +p +W +x +A +"} +(5,1,1) = {" +T +D +M +h +h +h +h +K +C +x +A +"} +(6,1,1) = {" +T +T +Y +o +X +a +a +a +q +m +m +"} +(7,1,1) = {" +S +j +T +j +j +T +N +j +j +j +S +"} diff --git a/_maps/shuttles/cargo_corg.dmm b/_maps/shuttles/cargo_corg.dmm new file mode 100644 index 0000000000000..c3888d6ef9b49 --- /dev/null +++ b/_maps/shuttles/cargo_corg.dmm @@ -0,0 +1,230 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"e" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/shuttle/engine/heater, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"i" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad2" + }, +/obj/machinery/door/poddoor{ + id = "QMLoaddoor"; + name = "supply dock loading door" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/supply) +"l" = ( +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/supply) +"m" = ( +/obj/machinery/door/airlock/titanium{ + name = "Supply Shuttle Airlock"; + req_access_txt = "31" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/supply) +"o" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/supply) +"p" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/supply) +"s" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "QMLoad" + }, +/obj/machinery/door/poddoor{ + id = "QMLoaddoor"; + name = "supply dock loading door" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/supply) +"u" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"z" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/supply) +"G" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad2" + }, +/obj/machinery/door/poddoor{ + id = "QMLoaddoor2"; + name = "supply dock loading door" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/supply) +"L" = ( +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/supply) +"M" = ( +/obj/machinery/button/door{ + id = "QMLoaddoor2"; + name = "Loading Doors"; + pixel_x = 24; + pixel_y = 8 + }, +/obj/machinery/button/door{ + id = "QMLoaddoor"; + name = "Loading Doors"; + pixel_x = 24; + pixel_y = -8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/supply) +"N" = ( +/obj/machinery/door/airlock/titanium{ + name = "Supply Shuttle Airlock"; + req_access_txt = "31" + }, +/obj/docking_port/mobile/supply, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/supply) +"O" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/supply) +"R" = ( +/obj/structure/shuttle/engine/propulsion/burst/right, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"S" = ( +/turf/template_noop, +/area/template_noop) +"U" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "QMLoad" + }, +/obj/machinery/door/poddoor{ + id = "QMLoaddoor2"; + name = "supply dock loading door" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/supply) +"W" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/supply) +"X" = ( +/obj/structure/shuttle/engine/propulsion/burst/left, +/turf/open/floor/plating/airless, +/area/shuttle/supply) + +(1,1,1) = {" +p +p +p +i +m +p +m +U +p +z +l +S +"} +(2,1,1) = {" +p +L +O +L +L +L +L +L +O +z +l +X +"} +(3,1,1) = {" +W +L +L +L +L +L +L +L +L +L +e +u +"} +(4,1,1) = {" +W +L +L +L +L +L +L +L +L +L +e +u +"} +(5,1,1) = {" +W +L +L +L +L +L +L +L +L +L +e +u +"} +(6,1,1) = {" +p +L +o +L +L +M +L +L +o +z +l +R +"} +(7,1,1) = {" +p +p +p +G +m +p +N +s +p +z +l +S +"} diff --git a/_maps/shuttles/emergency_arena.dmm b/_maps/shuttles/emergency_arena.dmm index 7f646330458d3..c34f36118b22d 100644 --- a/_maps/shuttles/emergency_arena.dmm +++ b/_maps/shuttles/emergency_arena.dmm @@ -1,21 +1,12 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/indestructible/necropolis, -/area/shuttle_arena) -"b" = ( -/turf/open/indestructible/necropolis/air, -/area/shuttle_arena) -"c" = ( -/obj/effect/forcefield/arena_shuttle, -/turf/open/indestructible/necropolis/air, -/area/shuttle_arena) "d" = ( -/turf/open/lava/smooth, -/area/shuttle_arena) -"e" = ( -/obj/effect/landmark/shuttle_arena_entrance, -/turf/open/indestructible/necropolis/air, -/area/shuttle_arena) +/obj/machinery/computer/emergency_shuttle{ + dir = 8 + }, +/turf/open/indestructible{ + icon_state = "cult" + }, +/area/shuttle/escape/arena) "f" = ( /turf/template_noop, /area/template_noop) @@ -44,6 +35,7 @@ /area/shuttle/escape/arena) "l" = ( /obj/structure/closet/crate/necropolis/tendril, +/obj/item/skeleton_key, /turf/open/indestructible/necropolis/air, /area/shuttle/escape/arena) "m" = ( @@ -73,34 +65,6 @@ /area/shuttle/escape/arena) (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 -f g g g @@ -125,34 +89,6 @@ g f "} (2,1,1) = {" -a -b -b -b -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -f g g g @@ -177,34 +113,6 @@ g g "} (3,1,1) = {" -a -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 -a -f g h j @@ -229,34 +137,6 @@ p g "} (4,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -e -b -b -b -b -b -b -b -b -b -b -b -b -e -b -a -f g h k @@ -281,34 +161,6 @@ p g "} (5,1,1) = {" -a -b -e -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -b -b -b -b -b -b -b -b -a -f g i h @@ -333,34 +185,6 @@ p g "} (6,1,1) = {" -a -a -b -b -a -b -b -b -b -b -b -b -b -b -b -b -b -a -b -b -b -b -b -b -b -b -a -f g i i @@ -385,34 +209,6 @@ p g "} (7,1,1) = {" -a -b -b -b -b -b -b -b -b -a -b -d -d -d -b -b -b -a -a -b -b -e -b -b -b -b -a -f g i i @@ -437,34 +233,6 @@ p g "} (8,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -a -f g i h @@ -489,34 +257,6 @@ p g "} (9,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -a -f g h k @@ -541,34 +281,6 @@ p g "} (10,1,1) = {" -a -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 -a -f g h j @@ -588,39 +300,11 @@ j j j j -h +d g g "} (11,1,1) = {" -a -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 -a -f g g g @@ -644,2031 +328,3 @@ g g f "} -(12,1,1) = {" -a -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 -a -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f -"} -(13,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -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 -"} -(14,1,1) = {" -a -b -b -b -b -b -a -b -b -b -e -b -b -a -b -b -b -b -b -b -b -b -b -b -d -d -d -b -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(15,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -b -b -a -b -b -b -b -b -b -b -b -b -b -d -d -b -b -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(16,1,1) = {" -a -b -e -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -b -b -a -b -b -b -b -b -b -b -b -e -b -b -b -b -b -b -b -b -b -b -b -a -"} -(17,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -e -b -b -b -b -b -d -d -b -b -b -b -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(18,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(19,1,1) = {" -a -a -a -a -a -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 -b -b -b -b -a -"} -(20,1,1) = {" -a -a -a -a -a -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 -a -b -b -a -a -b -b -b -a -"} -(21,1,1) = {" -a -c -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 -d -d -b -b -b -b -a -b -b -b -a -b -b -b -a -"} -(22,1,1) = {" -a -c -b -b -b -b -b -b -b -b -d -d -b -b -b -b -b -b -b -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -b -b -b -b -b -a -b -b -b -a -b -b -b -a -"} -(23,1,1) = {" -a -c -b -b -b -b -b -b -b -b -d -d -d -b -b -b -b -b -b -d -d -b -b -b -b -b -b -b -e -b -b -b -b -b -d -b -b -b -b -b -b -a -b -e -b -a -b -b -b -a -"} -(24,1,1) = {" -a -c -b -b -b -b -b -b -b -b -b -b -d -d -b -b -b -b -b -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -b -a -b -b -b -a -b -b -b -a -"} -(25,1,1) = {" -a -a -a -a -a -b -b -b -b -b -b -b -b -d -b -b -b -b -b -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -b -a -a -a -a -a -b -b -b -a -"} -(26,1,1) = {" -a -a -a -a -a -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 -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -e -a -"} -(27,1,1) = {" -a -a -a -a -b -b -b -b -e -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -b -b -b -b -b -b -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(28,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -b -b -b -b -b -b -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(29,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(30,1,1) = {" -a -b -b -b -b -b -b -b -a -b -b -b -b -b -b -b -b -b -b -a -a -a -a -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(31,1,1) = {" -a -b -b -b -b -b -b -b -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(32,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -e -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -e -b -b -b -b -b -b -b -b -b -a -"} -(33,1,1) = {" -a -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 -e -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(34,1,1) = {" -a -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 -b -b -b -b -b -b -b -b -a -"} -(35,1,1) = {" -a -b -b -e -b -b -b -b -b -b -b -b -a -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -a -a -a -a -b -b -b -b -b -b -a -"} -(36,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -b -b -b -b -b -b -b -b -a -"} -(37,1,1) = {" -a -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 -a -b -b -a -b -b -b -b -b -b -b -b -a -"} -(38,1,1) = {" -a -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 -a -b -e -a -b -b -b -b -b -b -b -b -a -"} -(39,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -e -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -b -b -b -b -b -b -b -b -a -"} -(40,1,1) = {" -a -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 -a -b -b -b -b -b -b -b -b -a -"} -(41,1,1) = {" -a -b -b -b -a -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -b -b -b -b -b -a -b -b -b -b -b -b -b -e -a -"} -(42,1,1) = {" -a -b -b -b -b -b -b -b -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(43,1,1) = {" -a -b -b -b -b -b -b -b -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(44,1,1) = {" -a -b -b -b -b -b -b -b -a -b -b -b -b -b -b -b -e -b -b -b -b -b -b -b -b -b -a -a -a -a -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -a -b -b -a -"} -(45,1,1) = {" -a -b -b -b -b -e -b -b -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -e -b -b -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -a -b -b -a -"} -(46,1,1) = {" -a -b -b -b -b -b -b -b -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -d -d -d -b -b -b -b -b -b -b -b -a -b -b -a -"} -(47,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -b -b -b -b -b -e -b -b -b -b -b -a -"} -(48,1,1) = {" -a -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -b -b -b -b -b -b -b -b -b -a -"} -(49,1,1) = {" -a -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -b -b -b -b -b -b -b -b -b -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 -"} diff --git a/_maps/shuttles/emergency_asteroid.dmm b/_maps/shuttles/emergency_asteroid.dmm index dbca679d6c39e..4b87b9a055642 100644 --- a/_maps/shuttles/emergency_asteroid.dmm +++ b/_maps/shuttles/emergency_asteroid.dmm @@ -5,15 +5,6 @@ "ac" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) -"ad" = ( -/obj/structure/window/shuttle, -/obj/structure/grille, -/turf/open/floor/plating, -/area/shuttle/escape) -"ah" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, -/area/shuttle/escape) "am" = ( /obj/structure/shuttle/engine/propulsion{ dir = 8 @@ -381,13 +372,11 @@ "qg" = ( /obj/structure/window/shuttle, /obj/structure/grille, -/obj/machinery/door/firedoor/window, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "qO" = ( /obj/structure/window/shuttle, /obj/structure/grille, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/shuttle/escape) "rp" = ( @@ -395,12 +384,7 @@ name = "Escape Shuttle Infirmary"; req_access_txt = "5" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "xE" = ( @@ -414,31 +398,13 @@ /obj/machinery/door/airlock/mining{ name = "Emergency Shuttle Storage" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "Gw" = ( -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"IJ" = ( -/obj/machinery/door/airlock{ - name = "Emergency Shuttle Restroom" - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) "Jx" = ( /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) @@ -447,12 +413,7 @@ name = "Emergency Shuttle Brig"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "JM" = ( @@ -473,12 +434,7 @@ /obj/machinery/door/airlock{ name = "Emergency Shuttle Restroom" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "RU" = ( @@ -497,7 +453,6 @@ /area/shuttle/escape) "VO" = ( /obj/effect/spawner/structure/window/shuttle, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/shuttle/escape) "YJ" = ( @@ -505,24 +460,14 @@ name = "Emergency Shuttle Cockpit"; req_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "Zz" = ( /obj/machinery/door/airlock/medical/glass{ name = "Escape Shuttle Infirmary" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) @@ -597,7 +542,7 @@ bd bl ac bN -IJ +RT bE qO "} @@ -627,7 +572,7 @@ bf bn ac Jx -IJ +RT bE qO "} @@ -683,7 +628,7 @@ aB aJ at aZ -ah +VO aK at aL @@ -698,7 +643,7 @@ Gw at at aZ -ah +VO aK at bP @@ -713,7 +658,7 @@ aB bK at aZ -ah +VO aK at bw @@ -728,7 +673,7 @@ qO aK at aZ -ah +VO aK at aZ @@ -758,7 +703,7 @@ qO aK at aZ -ah +VO aK at aZ @@ -773,7 +718,7 @@ aB bK at aZ -ah +VO aK at bx @@ -788,7 +733,7 @@ Gw at at aZ -ah +VO aK at bP @@ -803,7 +748,7 @@ aB aL at aZ -ah +VO aK at by @@ -845,13 +790,13 @@ aa ac ac ac -ad +qO JJ -ad +qO bi -ad +qO Zz -ad +qO ac ac ac @@ -878,7 +823,7 @@ aw aw aw aw -ad +qO Jx Jx Jx @@ -906,11 +851,11 @@ ac ac ac ac -ad +qO JJ ac rp -ad +qO JM ac ac @@ -923,7 +868,7 @@ ac ac aQ aw -ad +qO Jx bs ac diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index c79220fe26269..783471f035e32 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -148,7 +148,7 @@ pixel_x = 6; pixel_y = 24 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 @@ -170,7 +170,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "aF" = ( -/obj/structure/piano{ +/obj/structure/musician/piano{ icon_state = "piano" }, /turf/open/floor/plasteel/grimy, @@ -304,7 +304,7 @@ /turf/open/floor/plasteel/grimy, /area/shuttle/escape) "bc" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 @@ -405,7 +405,7 @@ /turf/open/floor/plasteel/freezer, /area/shuttle/escape) "bG" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 @@ -499,7 +499,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "bT" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /obj/effect/turf_decal/tile/bar, @@ -583,10 +583,7 @@ /obj/machinery/door/airlock{ name = "Unit B" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/shuttle/escape) "kK" = ( @@ -611,25 +608,18 @@ /obj/machinery/door/airlock{ name = "Unit 2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/shuttle/escape) "CM" = ( /obj/effect/spawner/structure/window/shuttle, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/shuttle/escape) "FR" = ( /obj/machinery/door/airlock/medical/glass{ name = "Medbay" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "GY" = ( @@ -637,10 +627,7 @@ name = "Emergency Shuttle Cockpit"; req_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/carpet, /area/shuttle/escape) "LQ" = ( @@ -669,10 +656,7 @@ /obj/machinery/door/airlock{ name = "Unisex Restrooms" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/shuttle/escape) "UQ" = ( @@ -684,12 +668,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/escape) "Yn" = ( @@ -703,10 +682,7 @@ /obj/machinery/door/airlock{ name = "Unit 1" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm index ad98a4abe0ad5..d0dfd41f901d1 100644 --- a/_maps/shuttles/emergency_birdboat.dmm +++ b/_maps/shuttles/emergency_birdboat.dmm @@ -5,10 +5,6 @@ "ab" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) -"ac" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, -/area/shuttle/escape) "ad" = ( /obj/structure/table, /obj/item/scalpel, @@ -47,7 +43,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "ak" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/mineral/titanium/blue, @@ -128,7 +124,7 @@ /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "aB" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/mineral/titanium, @@ -264,46 +260,17 @@ /obj/item/defibrillator/loaded, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) -"mv" = ( -/obj/machinery/door/airlock/command/glass{ - name = "bridge door"; - req_access_txt = "19" - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "xJ" = ( /obj/machinery/door/airlock/command/glass{ name = "bridge door"; req_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"Cf" = ( -/obj/machinery/door/airlock/public/glass, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) "Hy" = ( /obj/machinery/door/airlock/public/glass, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "Mg" = ( @@ -317,27 +284,16 @@ port_direction = 4; width = 14 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "MN" = ( /obj/effect/spawner/structure/window/shuttle, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/shuttle/escape) "Ti" = ( /obj/machinery/door/airlock/titanium, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "Wn" = ( @@ -345,10 +301,7 @@ name = "security airlock"; req_access_txt = "63" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) @@ -374,7 +327,7 @@ ab ah aq ak -ac +MN aB aH aH @@ -390,7 +343,7 @@ ab ai ar aC -mv +xJ aC aC aC @@ -453,7 +406,7 @@ aa ab ab xJ -ac +MN ab aC aC @@ -470,7 +423,7 @@ ab al at at -ac +MN aB aC aC @@ -502,7 +455,7 @@ ab am at at -ac +MN aC aC aN @@ -555,8 +508,8 @@ aC aC aw ab -Cf -ac +Hy +MN ab ab "} diff --git a/_maps/shuttles/emergency_box.dmm b/_maps/shuttles/emergency_box.dmm index 387aaade772b3..d25afc9b363ec 100644 --- a/_maps/shuttles/emergency_box.dmm +++ b/_maps/shuttles/emergency_box.dmm @@ -2,10 +2,6 @@ "aa" = ( /turf/template_noop, /area/template_noop) -"ac" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, -/area/shuttle/escape) "ad" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) @@ -327,10 +323,7 @@ /obj/machinery/door/airlock/titanium{ name = "Emergency Shuttle Cargo" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "Gx" = ( @@ -343,7 +336,6 @@ /area/shuttle/escape) "JW" = ( /obj/effect/spawner/structure/window/shuttle, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/shuttle/escape) "Km" = ( @@ -360,10 +352,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Emergency Shuttle Infirmary" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "RE" = ( @@ -371,12 +360,7 @@ name = "Emergency Shuttle Brig"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "Ta" = ( @@ -384,10 +368,7 @@ name = "Emergency Shuttle Cockpit"; req_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "XC" = ( @@ -497,9 +478,9 @@ ag aC as ad -ac +JW RE -ac +JW bj aC aT @@ -556,7 +537,7 @@ aS aS aS aC -ac +JW XC bs XC @@ -604,7 +585,7 @@ aC aC aC aC -ac +JW ga ga ga @@ -628,7 +609,7 @@ am am am aR -ac +JW bd be bd diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency_cere.dmm index 354b57e74effa..b028e24636f67 100644 --- a/_maps/shuttles/emergency_cere.dmm +++ b/_maps/shuttles/emergency_cere.dmm @@ -5,10 +5,6 @@ "ab" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) -"ac" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, -/area/shuttle/escape) "ad" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) @@ -420,7 +416,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aM" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/item/radio/intercom{ @@ -446,7 +442,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aP" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /obj/item/radio/intercom{ @@ -886,7 +882,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "ca" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel, @@ -912,7 +908,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/plasteel, @@ -1339,12 +1335,6 @@ }, /turf/open/floor/plasteel, /area/shuttle/escape) -"cQ" = ( -/obj/machinery/door/airlock{ - name = "Bathroom" - }, -/turf/open/floor/plasteel/freezer, -/area/shuttle/escape) "cR" = ( /turf/open/floor/plasteel/freezer, /area/shuttle/escape) @@ -1633,12 +1623,7 @@ /area/shuttle/escape) "eb" = ( /obj/machinery/door/airlock/maintenance_hatch, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/escape) "ez" = ( @@ -1656,10 +1641,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/escape) "jG" = ( @@ -1682,10 +1664,7 @@ name = "Emergency Shuttle Cockpit"; req_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "pf" = ( @@ -1709,12 +1688,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "uv" = ( @@ -1731,43 +1705,15 @@ /obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) -"Du" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Emergency Shuttle Medbay" - }, -/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/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/shuttle/escape) "Ed" = ( /obj/machinery/door/airlock{ name = "Bathroom" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/shuttle/escape) "Ev" = ( /obj/effect/spawner/structure/window/shuttle, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/shuttle/escape) "GI" = ( @@ -1784,10 +1730,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/shuttle/escape) "LM" = ( @@ -1795,12 +1738,7 @@ name = "Emergency Shuttle Brig"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "YO" = ( @@ -1808,12 +1746,7 @@ name = "Emergency Shuttle Brig"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) @@ -1940,7 +1873,7 @@ aZ aZ aZ aZ -ac +Ev cU da dh @@ -1984,7 +1917,7 @@ ba ba ba bc -ac +Ev cU bc da @@ -2005,9 +1938,9 @@ ao ab ab ab -ac +Ev YO -ac +Ev ab bF bR @@ -2072,7 +2005,7 @@ bX bX bX bR -ac +Ev cU bc bc @@ -2096,7 +2029,7 @@ be be be bw -ac +Ev bH bR bT @@ -2140,7 +2073,7 @@ be be be by -ac +Ev bI bR bT @@ -2160,7 +2093,7 @@ bW bW bW bR -ac +Ev cW db bc @@ -2184,7 +2117,7 @@ be be be bw -ac +Ev bJ bR bT @@ -2268,10 +2201,10 @@ aC aO ab ab -ac +Ev LM LM -ac +Ev ad aZ bc @@ -2330,7 +2263,7 @@ bW bR ad ab -Du +GI ab ab ab @@ -2460,7 +2393,7 @@ bW bW bW bR -ac +Ev cj cq cw @@ -2548,7 +2481,7 @@ aZ aZ aZ bc -ac +Ev cl cs cp @@ -2600,9 +2533,9 @@ cp cp cM ab -cQ +Ed ab -cQ +Ed ab ab ab diff --git a/_maps/shuttles/emergency_clown.dmm b/_maps/shuttles/emergency_clown.dmm index 289ad8d82b8f6..1784dfd33c4d7 100644 --- a/_maps/shuttles/emergency_clown.dmm +++ b/_maps/shuttles/emergency_clown.dmm @@ -5,10 +5,6 @@ "ab" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) -"ac" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, -/area/shuttle/escape) "ad" = ( /turf/closed/wall/mineral/titanium/interior, /area/shuttle/escape) @@ -102,6 +98,7 @@ /obj/machinery/door/airlock/bananium/glass{ name = "Emergency Shuttle Premium Lounge" }, +/obj/machinery/door/firedoor, /turf/open/floor/bluespace, /area/shuttle/escape) "at" = ( @@ -137,6 +134,7 @@ /obj/machinery/door/airlock/bananium/glass{ name = "Emergency Shuttle Greentext" }, +/obj/machinery/door/firedoor, /turf/open/floor/bluespace, /area/shuttle/escape) "aC" = ( @@ -324,20 +322,14 @@ /obj/machinery/door/airlock/bananium/glass{ name = "Emergency Shuttle Infirmary" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/bluespace, /area/shuttle/escape) "KO" = ( /obj/machinery/door/airlock/bananium{ name = "Emergency Shuttle Cargo" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/bluespace, /area/shuttle/escape) "LN" = ( @@ -352,7 +344,6 @@ /area/shuttle/escape) "Nn" = ( /obj/effect/spawner/structure/window/shuttle, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/shuttle/escape) "Zf" = ( @@ -463,9 +454,9 @@ af ak ap ab -ac +Nn aA -ac +Nn aF ak aO @@ -522,7 +513,7 @@ aN aN aN ak -ac +Nn Zf aY Zf @@ -570,7 +561,7 @@ ak ak ak ak -ac +Nn aV aV aV @@ -594,7 +585,7 @@ aM aM aM aL -ac +Nn aX bb aX diff --git a/_maps/shuttles/emergency_construction.dmm b/_maps/shuttles/emergency_construction.dmm index a6d5d0c0a99fc..86c8ff9836857 100644 --- a/_maps/shuttles/emergency_construction.dmm +++ b/_maps/shuttles/emergency_construction.dmm @@ -173,9 +173,14 @@ /obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) +"S" = ( +/obj/machinery/computer/emergency_shuttle{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/escape) "U" = ( /obj/effect/spawner/structure/window/shuttle, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/shuttle/escape) @@ -376,7 +381,7 @@ f f f f -f +S U "} (9,1,1) = {" diff --git a/_maps/shuttles/emergency_corg.dmm b/_maps/shuttles/emergency_corg.dmm new file mode 100644 index 0000000000000..6b484b915c7ea --- /dev/null +++ b/_maps/shuttles/emergency_corg.dmm @@ -0,0 +1,2676 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ar" = ( +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/shuttle/escape) +"aJ" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/obj/structure/sign/poster/random{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"aY" = ( +/obj/structure/chair/comfy/shuttle, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"bC" = ( +/obj/machinery/vending/games{ + pixel_y = -1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"bR" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/shuttle/escape) +"ci" = ( +/obj/machinery/computer/emergency_shuttle, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"cm" = ( +/obj/structure/bed, +/obj/structure/sign/poster/random{ + pixel_y = -32 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"cB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/surgery, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"cY" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/sign/poster/random{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"dw" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"dX" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"ed" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"ek" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"eH" = ( +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"eS" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"fr" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"fx" = ( +/obj/machinery/door/airlock/medical{ + name = "Morgue"; + req_access_txt = "6" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"fG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"fH" = ( +/obj/item/storage/toolbox/electrical, +/turf/open/floor/plating, +/area/shuttle/escape) +"fK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/airlock/command{ + name = "Cockpit"; + req_access_txt = "19" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"fO" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"gf" = ( +/obj/structure/chair/comfy/shuttle, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"gk" = ( +/obj/structure/bookcase/random/nonfiction, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"gl" = ( +/obj/structure/table/glass, +/obj/item/book/manual/wiki/medicine, +/obj/item/stack/medical/gauze, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"gL" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/snacks/dough, +/obj/item/kitchen/rollingpin, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"hs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"hP" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/shuttle/escape) +"hQ" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"iy" = ( +/obj/machinery/door/airlock/wood{ + name = "VIP Lounge" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"iN" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"iX" = ( +/turf/open/floor/plasteel, +/area/shuttle/escape) +"iZ" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/status_display/shuttle{ + pixel_x = 32 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"jc" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"kt" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/status_display/shuttle{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"kD" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/bottle/epinephrine, +/obj/item/reagent_containers/syringe/epinephrine, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"kF" = ( +/turf/open/floor/wood, +/area/shuttle/escape) +"kL" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"lw" = ( +/obj/structure/table/reinforced, +/obj/item/storage/backpack/duffelbag/med/surgery, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"lG" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"mI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"mX" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"nf" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"nn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"nA" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"nH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"nI" = ( +/obj/structure/table/reinforced, +/obj/item/defibrillator/compact/loaded, +/obj/item/defibrillator/compact/loaded, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"nR" = ( +/obj/structure/chair/comfy/shuttle, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"oi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"ow" = ( +/obj/structure/bookcase/random/adult, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"oI" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/computer/apc_control, +/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/shuttle/escape) +"oO" = ( +/obj/structure/displaycase, +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"pa" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/sign/poster/random{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"pj" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/stasis, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"pB" = ( +/turf/closed/wall/mineral/titanium/interior, +/area/shuttle/escape) +"pW" = ( +/obj/machinery/vending/snack, +/turf/open/floor/wood, +/area/shuttle/escape) +"pX" = ( +/obj/structure/table/glass, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/clothing/neck/stethoscope, +/obj/item/clothing/neck/stethoscope, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"qg" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/box/corners, +/obj/machinery/door/window/brigdoor/security{ + dir = 8; + name = "servery"; + req_access_txt = "28" + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"qn" = ( +/obj/structure/displaycase, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"qr" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Emergency Shuttle Medical Bay" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"qv" = ( +/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/dark, +/area/shuttle/escape) +"qy" = ( +/obj/structure/chair/comfy/shuttle, +/obj/effect/turf_decal/stripes/line, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"qE" = ( +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"rx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"rH" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"rR" = ( +/obj/structure/closet/crate/internals, +/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/shuttle/escape) +"sw" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_y = -29 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"sB" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"sK" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"tb" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"tm" = ( +/obj/machinery/vending/engivend, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"ts" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"tX" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"uh" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"ul" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Brig"; + req_access_txt = "2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"ux" = ( +/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/dark, +/area/shuttle/escape) +"uy" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/pipe_dispenser, +/obj/structure/window/reinforced/spawner, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"uC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"uM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/airlock/command{ + name = "Cockpit"; + req_access_txt = "19" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"uP" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/computer/crew{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"uQ" = ( +/obj/machinery/computer/libraryconsole/bookmanagement{ + pixel_y = 7 + }, +/obj/structure/table/wood, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"uR" = ( +/obj/machinery/food_cart, +/obj/machinery/status_display/shuttle{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"vc" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"vf" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"vl" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"vM" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"vP" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"wg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Emergency Shuttle Engineering"; + req_one_access_txt = "32;19" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"wj" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/storage/firstaid{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/firstaid/fire, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"wk" = ( +/obj/structure/bookcase/random/reference, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"wl" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/structure/sign/poster/random{ + pixel_x = -32 + }, +/turf/open/floor/wood, +/area/shuttle/escape) +"xb" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"xi" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table/reinforced, +/obj/item/storage/firstaid, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/flashlight, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"xj" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"xo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/command{ + name = "Cockpit"; + req_access_txt = "19" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"xH" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/sign/poster/random{ + pixel_y = -32 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"xL" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/storage/bag/tray, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"yp" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"yr" = ( +/obj/machinery/vending/medical, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"yG" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/obj/item/reagent_containers/food/condiment/sugar, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/snacks/meat/rawbacon, +/obj/item/reagent_containers/food/snacks/meat/rawbacon, +/obj/item/reagent_containers/food/snacks/meat/rawbacon, +/obj/item/reagent_containers/food/snacks/meat/rawbacon, +/obj/item/reagent_containers/food/snacks/meat/rawbacon, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"yL" = ( +/obj/machinery/computer/communications, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"yM" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"zd" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"ze" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"zo" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"zs" = ( +/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/shuttle/escape) +"zt" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"zz" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"zC" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/holosign_creator/atmos, +/obj/item/holosign_creator/atmos, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"AF" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"Bi" = ( +/obj/structure/table/reinforced, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 1; + pixel_y = -2 + }, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"Bj" = ( +/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, +/area/shuttle/escape) +"Bo" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Br" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/shuttle/escape) +"Bt" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/escape) +"BA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/engine, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"BI" = ( +/turf/open/floor/plating, +/area/shuttle/escape) +"BN" = ( +/obj/structure/closet/emcloset/anchored, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/status_display/shuttle{ + pixel_y = 32 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"BQ" = ( +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/escape) +"Cc" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Ct" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"CA" = ( +/obj/structure/bookcase/random/religion, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"CH" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Dn" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/computer/atmos_alert{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"DF" = ( +/obj/structure/closet/emcloset/anchored, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"DI" = ( +/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/shuttle/escape) +"DL" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"DP" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Emergency Shuttle Engineering"; + req_one_access_txt = "32;19" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"DT" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/status_display/shuttle{ + pixel_y = 32 + }, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"Ei" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Er" = ( +/obj/machinery/vending/tool, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"Es" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Ew" = ( +/obj/structure/table/reinforced, +/obj/item/storage/firstaid{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/storage/firstaid/brute, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"Ez" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Fd" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 3 + }, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Fp" = ( +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"FS" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"Gu" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape) +"GK" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock"; + req_access_txt = "2" + }, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"Hh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Ho" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"Ht" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/turf/open/floor/wood, +/area/shuttle/escape) +"Ik" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Iz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"ID" = ( +/obj/structure/closet/crate/internals, +/mob/living/simple_animal/bot/medbot, +/mob/living/simple_animal/bot/atmosbot, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"IJ" = ( +/obj/structure/chair/comfy/shuttle, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"IK" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/docking_port/mobile/emergency{ + dwidth = 12; + height = 20; + name = "Corg emergency shuttle"; + width = 38 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"IQ" = ( +/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/shuttle/escape) +"Ju" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/shuttle/escape) +"JF" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"JL" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/wood, +/area/shuttle/escape) +"JU" = ( +/obj/structure/shuttle/engine/propulsion/burst, +/turf/open/floor/plating, +/area/shuttle/escape) +"Kb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Km" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/suit_storage_unit/engine, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"Kw" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/newscaster{ + pixel_y = -29 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"Kz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"KA" = ( +/obj/structure/table/glass, +/obj/item/folder, +/obj/item/pen/fountain, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"KE" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"KJ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"KO" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"KV" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/sign/poster/random{ + pixel_x = -32 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"KW" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes/cigars/cohiba{ + pixel_x = -1; + pixel_y = 3 + }, +/obj/item/storage/fancy/cigarettes/cigars{ + pixel_x = -1; + pixel_y = 6 + }, +/obj/item/lighter, +/turf/open/floor/wood, +/area/shuttle/escape) +"Lb" = ( +/obj/structure/table/optable, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"Lj" = ( +/obj/structure/bodycontainer/morgue, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Ln" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Lr" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"Lw" = ( +/obj/structure/chair/comfy/shuttle, +/obj/structure/window/reinforced/spawner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Mj" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/mineral/copper{ + amount = 5 + }, +/obj/item/construction/rcd, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"Mm" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"My" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"MD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"MH" = ( +/turf/template_noop, +/area/template_noop) +"MN" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/computer/security, +/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/dark, +/area/shuttle/escape) +"MU" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"Nb" = ( +/obj/machinery/button/door{ + id = "Dorm2"; + name = "Dormitory Door Lock"; + normaldoorcontrol = 1; + pixel_x = -6; + pixel_y = -26; + specialfunctions = 4 + }, +/obj/structure/bookcase/random/fiction, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Ng" = ( +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"Np" = ( +/obj/structure/closet/crate/internals, +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Ny" = ( +/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/dark, +/area/shuttle/escape) +"NW" = ( +/obj/structure/bookcase/random/fiction, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"NX" = ( +/obj/machinery/vending/wardrobe/engi_wardrobe, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"Oh" = ( +/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/shuttle/escape) +"Pa" = ( +/obj/machinery/stasis, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"Ph" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Pu" = ( +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"PB" = ( +/obj/machinery/door/window/brigdoor/security{ + dir = 8; + req_access_txt = "1" + }, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"Qt" = ( +/obj/structure/bodycontainer/morgue, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"QE" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"QN" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"QQ" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"QZ" = ( +/obj/effect/turf_decal/box/corners, +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/condiment/enzyme{ + pixel_y = 5 + }, +/obj/item/reagent_containers/food/snacks/chocolatebar, +/obj/item/reagent_containers/food/snacks/chocolatebar, +/obj/item/reagent_containers/food/snacks/chocolatebar, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"Rb" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"Rd" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"Rj" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"RB" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"Sl" = ( +/obj/machinery/computer/operating{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"St" = ( +/obj/structure/table/reinforced, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/mineral/copper{ + amount = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"Sw" = ( +/obj/structure/table/reinforced, +/obj/item/lightreplacer, +/obj/structure/window/reinforced/spawner, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"Sy" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/escape) +"SZ" = ( +/obj/machinery/door/airlock/security{ + req_access_txt = "2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"Td" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"To" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"Tt" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/handcuffs, +/obj/item/assembly/flash, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"Tw" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/escape) +"Ty" = ( +/obj/machinery/power/smes/engineering{ + charge = 2e+006 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"TH" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/port_gen/pacman, +/obj/item/stack/sheet/mineral/plasma{ + amount = 5 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"TI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"TQ" = ( +/obj/machinery/door/window/northright{ + base_state = "left"; + dir = 2; + icon_state = "left"; + name = "Library Desk Door"; + req_access_txt = "37" + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Up" = ( +/obj/structure/table/wood, +/obj/machinery/door/window/northright{ + name = "Library Desk Door"; + pixel_x = 3; + req_access_txt = "37" + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Vx" = ( +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"VD" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"VF" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Emergency Shuttle Medical Bay" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"Xk" = ( +/obj/machinery/door/airlock/external/glass, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) +"Xo" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/wood, +/area/shuttle/escape) +"Xu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Xy" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"XV" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/newscaster{ + pixel_x = 30 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Yc" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Yw" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/storage/crayons, +/obj/machinery/status_display/shuttle{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Zf" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"Zm" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"ZL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"ZN" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"ZU" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/escape) +"ZW" = ( +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plating, +/area/shuttle/escape) +"ZZ" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel, +/area/shuttle/escape) + +(1,1,1) = {" +MH +MH +MH +MH +MH +MH +MH +MH +Tw +Tw +GK +Tw +IK +Tw +Sy +Sy +Sy +Tw +QQ +Tw +QQ +Tw +MH +MH +MH +Tw +Tw +Tw +Tw +Tw +Tw +Tw +Tw +Tw +Bt +BQ +BQ +MH +"} +(2,1,1) = {" +MH +MH +MH +Tw +Tw +Sy +Sy +Tw +Bt +Pu +Pu +pB +qE +Ei +qE +qE +qE +qE +qE +Ei +qE +Tw +Tw +MH +Tw +Bt +St +Mj +Bt +ID +ed +ID +Bt +ZU +Ez +ZW +BQ +BQ +"} +(3,1,1) = {" +MH +MH +Tw +Bt +zz +zz +zz +zz +pB +sK +Ho +Sy +qE +QN +dX +dX +dX +vM +qE +qE +qE +Zf +Tw +Tw +Tw +KA +qE +qE +DP +qE +qE +qE +DP +qE +vf +BI +eS +JU +"} +(4,1,1) = {" +MH +MH +Tw +DT +Pu +Pu +Pu +Pu +ul +Pu +rH +Sy +qE +RB +ZN +ZN +ZN +fr +qE +qE +qE +qE +vf +Rd +pB +Er +qE +qE +Bt +qE +qE +qE +Bt +Td +vc +TH +eS +JU +"} +(5,1,1) = {" +MH +MH +Tw +Tt +Pu +Pu +Pu +Pu +pB +Pu +jc +Sy +qE +qE +qE +qE +qE +qE +qE +qE +qE +qE +vf +xH +pB +zC +qE +qE +uy +tm +qE +Km +Bt +Lr +Rb +QE +eS +JU +"} +(6,1,1) = {" +MH +Sy +Bt +pB +Bt +uM +Bt +PB +pB +Pu +Pu +pB +Zf +vP +VD +zo +Np +iZ +VD +zo +Zf +qE +vf +Rd +Bt +Bi +qE +qE +Sw +NX +zt +BA +Bt +Ty +fH +Ty +BQ +BQ +"} +(7,1,1) = {" +Sy +Sy +uP +Fp +fK +sw +pB +cm +Bt +Bt +SZ +Bt +pB +Sy +Sy +Sy +pB +pB +pB +pB +Bt +Kb +Kb +Bt +Bt +Bt +Bt +wg +Bt +pB +pB +pB +pB +pB +Bt +BQ +BQ +MH +"} +(8,1,1) = {" +Sy +MN +mI +Fp +Bt +pB +Bt +Bt +Bt +Mm +Mm +Mm +pa +Mm +Mm +Mm +Mm +Bj +cY +nH +ux +Ph +Ph +qv +aY +KV +My +Vx +FS +pB +Xo +bR +wl +Xo +Sy +ar +MH +MH +"} +(9,1,1) = {" +Sy +tb +Fp +Rj +Xu +Ei +uh +pB +IJ +qE +KO +JF +JF +JF +JF +JF +JF +JF +JF +nH +rx +Ln +Ln +ze +gf +zd +hQ +Vx +Vx +Bt +kF +kF +kF +Br +Sy +ar +Ju +MH +"} +(10,1,1) = {" +Sy +xi +AF +ci +Gu +Xu +Es +pB +qy +KO +Ny +gL +qg +Bt +Bt +oi +oi +oi +Bt +Bt +rx +ek +Zm +ze +nf +Cc +ZL +Vx +Vx +iy +Vx +Vx +Vx +KW +Sy +ar +MH +MH +"} +(11,1,1) = {" +Sy +DL +AF +yL +tX +Xu +kt +pB +IJ +Bo +xL +Ct +fO +pB +yM +qE +qE +qE +Nb +Bt +rx +ux +qv +ze +sB +nA +vl +Vx +Vx +iy +Vx +Vx +Vx +pW +Sy +ar +MH +MH +"} +(12,1,1) = {" +Sy +tb +Fp +iN +Xu +xb +XV +pB +nR +Bo +ZZ +iX +yG +pB +Yw +qE +oO +qE +NW +Bt +ts +Mm +Mm +ze +Lw +KE +My +Vx +Vx +Bt +kF +kF +kF +Br +Sy +ar +Ju +MH +"} +(13,1,1) = {" +Sy +oI +Hh +Fp +Bt +pB +Bt +Bt +qE +Bo +QZ +uR +aJ +pB +Fd +qE +Xy +qE +bC +Bt +rx +kL +ux +ze +gf +mX +hQ +Vx +FS +pB +JL +hP +Ht +JL +Sy +ar +MH +MH +"} +(14,1,1) = {" +Sy +Sy +Dn +Fp +fK +Kw +pB +rR +Ln +Ny +Bt +pB +pB +pB +CH +qE +qn +qE +gk +Sy +rx +Zm +Zm +ze +Bt +Bt +pB +VF +pB +pB +pB +pB +pB +pB +Bt +BQ +BQ +MH +"} +(15,1,1) = {" +MH +Sy +Bt +pB +Bt +xo +Bt +Bt +oi +oi +pB +ow +Ei +Up +qE +qE +qE +qE +gk +pB +rx +Oh +IQ +ze +Bt +yr +eH +eH +nI +wj +Ew +Tw +Lj +Qt +Lj +Lj +BQ +BQ +"} +(16,1,1) = {" +MH +MH +Tw +DF +ux +Ph +Ph +Ph +Ph +yp +pB +CA +qE +TQ +qE +uQ +lG +wk +Bt +Bt +rx +ek +Ph +ze +qr +eH +eH +eH +eH +nn +Ng +fx +Kz +TI +TI +hs +eS +JU +"} +(17,1,1) = {" +MH +MH +Tw +BN +rx +qE +qE +qE +qE +ze +Bt +Bt +Sy +Bt +Bt +Bt +Sy +Bt +Bt +ux +ek +KO +Ln +uC +Bt +pX +eH +eH +eH +nn +Sl +Tw +fG +iX +iX +MU +eS +JU +"} +(18,1,1) = {" +MH +MH +Tw +Bt +xj +VD +VD +zo +qE +Zm +Ph +Ph +Ph +Ph +Ph +Ph +qv +nH +ux +ek +KO +DI +Tw +Tw +Tw +gl +eH +eH +eH +nn +Lb +Tw +To +Iz +Iz +MD +eS +JU +"} +(19,1,1) = {" +MH +MH +MH +Tw +Tw +Sy +Sy +Tw +Bt +Ln +Ln +Ln +Ln +Ik +Ln +Ln +KJ +nH +zs +Ln +uC +Tw +Tw +MH +Tw +Bt +pj +kD +Pa +cB +lw +Tw +Yc +dw +Yc +Yc +BQ +BQ +"} +(20,1,1) = {" +MH +MH +MH +MH +MH +MH +MH +MH +Tw +Tw +Xk +Tw +Xk +Tw +Sy +Sy +Sy +Tw +Xk +Tw +Xk +Tw +MH +MH +MH +Tw +Tw +Tw +Sy +Sy +Tw +Tw +Tw +Tw +Bt +BQ +BQ +MH +"} diff --git a/_maps/shuttles/emergency_cramped.dmm b/_maps/shuttles/emergency_cramped.dmm index 89183353a5b47..69e09d5301cef 100644 --- a/_maps/shuttles/emergency_cramped.dmm +++ b/_maps/shuttles/emergency_cramped.dmm @@ -142,7 +142,6 @@ /area/shuttle/escape) "Q" = ( /obj/effect/spawner/structure/window/shuttle, -/obj/machinery/door/firedoor/window, /turf/open/floor/plating, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_delta.dmm b/_maps/shuttles/emergency_delta.dmm index 65bcf2a09d8f1..06138302154b3 100644 --- a/_maps/shuttles/emergency_delta.dmm +++ b/_maps/shuttles/emergency_delta.dmm @@ -181,7 +181,7 @@ /turf/open/floor/plasteel/white, /area/shuttle/escape) "an" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 @@ -210,7 +210,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "ap" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 @@ -719,7 +719,7 @@ /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "bz" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/machinery/button/flasher{ @@ -733,7 +733,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bA" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /obj/effect/turf_decal/tile/neutral{ @@ -926,7 +926,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "cb" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 @@ -1246,7 +1246,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "cA" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 @@ -1301,29 +1301,13 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/escape) "hB" = ( /obj/effect/spawner/structure/window/shuttle, /turf/open/floor/plating, /area/shuttle/escape) -"uQ" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Holding Area"; - req_access_txt = "2" - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium/red/brig, -/area/shuttle/escape) "zd" = ( /obj/machinery/door/airlock/command{ name = "Emergency Recovery Airlock"; @@ -1332,12 +1316,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/escape) "Ay" = ( @@ -1355,12 +1334,7 @@ name = "Holding Area"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "Ey" = ( @@ -1370,12 +1344,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/escape) "Hh" = ( @@ -1386,10 +1355,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/escape) "Ky" = ( @@ -1431,10 +1397,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/escape) @@ -1519,7 +1482,7 @@ ao ao ao bo -uQ +Ej bw bw bw diff --git a/_maps/shuttles/emergency_discoinferno.dmm b/_maps/shuttles/emergency_discoinferno.dmm index 45622deff54b5..b8b9c87a35b68 100644 --- a/_maps/shuttles/emergency_discoinferno.dmm +++ b/_maps/shuttles/emergency_discoinferno.dmm @@ -205,7 +205,7 @@ name = "Disco Inferno" }, /obj/machinery/door/airlock/gold{ - armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100); + armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 0); heat_proof = 1; resistance_flags = 2 }, @@ -216,10 +216,7 @@ /obj/machinery/door/airlock/gold{ req_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/gold, /area/shuttle/escape) "Y" = ( diff --git a/_maps/shuttles/emergency_donut.dmm b/_maps/shuttles/emergency_donut.dmm index b5043b6dbb237..1adb22bb1be9c 100644 --- a/_maps/shuttles/emergency_donut.dmm +++ b/_maps/shuttles/emergency_donut.dmm @@ -447,10 +447,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Emergency Shuttle Infirmary" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "hl" = ( @@ -458,10 +455,7 @@ name = "Cockpit"; req_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "pk" = ( @@ -500,12 +494,7 @@ name = "Containment Cell"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "JF" = ( @@ -513,12 +502,7 @@ name = "Emergency Shuttle Brig"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_goon.dmm b/_maps/shuttles/emergency_goon.dmm index 4378dcfbc3fdf..bf5f44c95e152 100644 --- a/_maps/shuttles/emergency_goon.dmm +++ b/_maps/shuttles/emergency_goon.dmm @@ -29,24 +29,14 @@ name = "Emergency Shuttle Brig"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "k" = ( /obj/machinery/door/airlock/public/glass{ name = "Emergency Shuttle Infirmary" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "l" = ( @@ -194,12 +184,7 @@ name = "Emergency Shuttle Cockpit"; req_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "P" = ( diff --git a/_maps/shuttles/emergency_imfedupwiththisworld.dmm b/_maps/shuttles/emergency_imfedupwiththisworld.dmm index 3d6920f59f61e..12e101a7554d4 100644 --- a/_maps/shuttles/emergency_imfedupwiththisworld.dmm +++ b/_maps/shuttles/emergency_imfedupwiththisworld.dmm @@ -155,7 +155,7 @@ /turf/open/floor/carpet, /area/shuttle/escape) "y" = ( -/obj/item/twohanded/required/kirbyplants, +/obj/item/kirbyplants, /turf/open/floor/wood, /area/shuttle/escape) "z" = ( diff --git a/_maps/shuttles/emergency_kilo.dmm b/_maps/shuttles/emergency_kilo.dmm index 652125904a399..3c7c08a7ed079 100644 --- a/_maps/shuttles/emergency_kilo.dmm +++ b/_maps/shuttles/emergency_kilo.dmm @@ -467,7 +467,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "applebush" }, /turf/open/floor/mineral/plastitanium, @@ -491,7 +491,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/mineral/plastitanium, @@ -754,7 +754,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/mineral/titanium/white, @@ -1074,7 +1074,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21" }, /turf/open/floor/mineral/titanium/white, @@ -1090,7 +1090,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/blue, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "applebush" }, /obj/effect/turf_decal/stripes/line, @@ -1186,7 +1186,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-05" }, /turf/open/floor/mineral/titanium/yellow, @@ -1264,7 +1264,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /turf/open/floor/mineral/titanium/white, @@ -1604,10 +1604,7 @@ name = "Holding Area"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "jK" = ( @@ -1638,10 +1635,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "uO" = ( @@ -1654,12 +1648,7 @@ name = "Shuttle Control"; req_one_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "zT" = ( @@ -1668,12 +1657,7 @@ name = "Holding Area"; req_one_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "Bo" = ( @@ -1709,20 +1693,14 @@ /obj/machinery/door/airlock/medical/glass{ name = "Shuttle Infirmary" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "Oa" = ( /obj/machinery/door/airlock/shuttle{ name = "Emergency Shuttle Airlock" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "Tp" = ( @@ -1733,10 +1711,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "Vz" = ( diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm index 093f6d7b3532d..69a2e2c766f49 100644 --- a/_maps/shuttles/emergency_luxury.dmm +++ b/_maps/shuttles/emergency_luxury.dmm @@ -7,6 +7,7 @@ /area/shuttle/escape/luxury) "ac" = ( /obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, /turf/open/floor/wood{ icon_state = "wood-broken2" }, @@ -54,7 +55,7 @@ /turf/open/floor/mineral/gold, /area/shuttle/escape/luxury) "ak" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /turf/open/floor/mineral/gold, @@ -304,17 +305,6 @@ /obj/machinery/stasis, /turf/open/floor/mineral/gold, /area/shuttle/escape/luxury) -"bg" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/mineral/gold, -/area/shuttle/escape/luxury) -"bh" = ( -/turf/open/floor/plating/beach/coastline_b, -/area/shuttle/escape/luxury) "bi" = ( /obj/machinery/light, /turf/open/floor/mineral/gold, @@ -332,7 +322,7 @@ /turf/open/floor/mineral/gold, /area/shuttle/escape/luxury) "bl" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-10" }, /obj/machinery/light{ @@ -340,13 +330,15 @@ }, /turf/open/floor/mineral/gold, /area/shuttle/escape/luxury) -"bp" = ( -/obj/item/twohanded/required/kirbyplants{ +"cu" = ( +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 }, -/obj/machinery/light, +/obj/effect/turf_decal/pool{ + dir = 4 + }, /turf/open/floor/mineral/gold, /area/shuttle/escape/luxury) "hA" = ( @@ -354,10 +346,46 @@ /obj/item/surgical_drapes, /turf/open/floor/mineral/gold, /area/shuttle/escape/luxury) +"nZ" = ( +/obj/item/pool/pool_noodle, +/turf/open/indestructible/sound/pool, +/area/shuttle/escape/luxury) +"vB" = ( +/obj/item/kirbyplants{ + icon_state = "plant-21"; + pixel_x = -3; + pixel_y = 3 + }, +/obj/machinery/light, +/obj/effect/turf_decal/pool{ + dir = 8 + }, +/turf/open/floor/mineral/gold, +/area/shuttle/escape/luxury) +"wf" = ( +/obj/item/kirbyplants{ + icon_state = "plant-21"; + pixel_x = -3; + pixel_y = 3 + }, +/obj/machinery/light, +/obj/effect/turf_decal/pool{ + dir = 4 + }, +/turf/open/floor/mineral/gold, +/area/shuttle/escape/luxury) "zg" = ( /obj/machinery/vending/wallmed, /turf/closed/indestructible/riveted/uranium, /area/shuttle/escape/luxury) +"CU" = ( +/obj/effect/turf_decal/pool/corner, +/turf/open/floor/mineral/gold, +/area/shuttle/escape/luxury) +"Jr" = ( +/obj/effect/turf_decal/pool, +/turf/open/floor/mineral/gold, +/area/shuttle/escape/luxury) "OL" = ( /obj/item/surgicaldrill, /obj/item/scalpel, @@ -368,6 +396,30 @@ /obj/structure/table/wood/fancy, /turf/open/floor/mineral/gold, /area/shuttle/escape/luxury) +"Ui" = ( +/obj/item/pool/rubber_ring, +/turf/open/indestructible/sound/pool, +/area/shuttle/escape/luxury) +"Vf" = ( +/turf/open/indestructible/sound/pool, +/area/shuttle/escape/luxury) +"Vm" = ( +/obj/effect/turf_decal/pool/corner{ + dir = 4 + }, +/turf/open/floor/mineral/gold, +/area/shuttle/escape/luxury) +"Vq" = ( +/obj/item/kirbyplants{ + icon_state = "plant-21"; + pixel_x = -3; + pixel_y = 3 + }, +/obj/effect/turf_decal/pool{ + dir = 8 + }, +/turf/open/floor/mineral/gold, +/area/shuttle/escape/luxury) (1,1,1) = {" aa @@ -460,9 +512,9 @@ ax aN bd aj -aj -bg -bp +CU +cu +wf ab "} (7,1,1) = {" @@ -476,9 +528,9 @@ ay aO bd aj -aj -bh -bh +Jr +Vf +Vf ab "} (8,1,1) = {" @@ -492,9 +544,9 @@ az aP bd aj -aj -bh -bh +Jr +nZ +Vf ab "} (9,1,1) = {" @@ -508,9 +560,9 @@ aA aQ bd aj -aj -bh -bh +Jr +Vf +Vf ab "} (10,1,1) = {" @@ -524,9 +576,9 @@ aB aR bd aj -aj -bh -bh +Jr +Vf +Ui ab "} (11,1,1) = {" @@ -540,9 +592,9 @@ aC aS bd aj -aj -bh -bh +Jr +Vf +Vf ab "} (12,1,1) = {" @@ -556,9 +608,9 @@ aD aT bd aj -aj -bh -bh +Jr +Vf +Vf ab "} (13,1,1) = {" @@ -572,9 +624,9 @@ aE aU bd aj -aj -bh -bh +Jr +Vf +Vf ab "} (14,1,1) = {" @@ -588,9 +640,9 @@ aF aV bd aj -aj -bh -bh +Jr +nZ +Vf ab "} (15,1,1) = {" @@ -604,9 +656,9 @@ aG aW bd aj -aj -bh -bh +Jr +Vf +Vf ab "} (16,1,1) = {" @@ -620,9 +672,9 @@ aH aX bd aj -aj -bh -bh +Jr +Vf +Vf ab "} (17,1,1) = {" @@ -636,9 +688,9 @@ aI aY bd aj -aj -bh -bh +Jr +Vf +Vf ab "} (18,1,1) = {" @@ -652,9 +704,9 @@ aJ aZ bd aj -aj -bh -bh +Jr +Ui +Vf ab "} (19,1,1) = {" @@ -668,9 +720,9 @@ aK ba bd aj -aj -bh -bh +Jr +Vf +Vf ab "} (20,1,1) = {" @@ -684,9 +736,9 @@ aL bb bd aj -aj -bg -bp +Vm +Vq +vB ab "} (21,1,1) = {" diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm index b3f59589a0a9d..08e2cc15d4815 100644 --- a/_maps/shuttles/emergency_meta.dmm +++ b/_maps/shuttles/emergency_meta.dmm @@ -795,10 +795,7 @@ name = "Brig"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "fr" = ( @@ -824,10 +821,7 @@ req_access_txt = "19" }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/escape) "BN" = ( @@ -859,26 +853,9 @@ name = "Cockpit"; req_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"GG" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Escape Shuttle Infirmary" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) "Li" = ( /obj/effect/spawner/structure/window/shuttle, /obj/machinery/door/firedoor/window, @@ -905,10 +882,7 @@ /obj/machinery/door/airlock/medical/glass{ name = "Escape Shuttle Infirmary" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "Vs" = ( @@ -919,10 +893,7 @@ name = "Emergency Shuttle Cargo Bay Airlock" }, /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/escape) "Yo" = ( @@ -1215,7 +1186,7 @@ aE ba ad ac -GG +PE ba ad "} diff --git a/_maps/shuttles/emergency_mini.dmm b/_maps/shuttles/emergency_mini.dmm index d2b0bcfc65df9..bf201f3a2eda6 100644 --- a/_maps/shuttles/emergency_mini.dmm +++ b/_maps/shuttles/emergency_mini.dmm @@ -149,10 +149,7 @@ /obj/machinery/door/airlock/medical/glass{ name = "Escape Shuttle Infirmary" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "D" = ( @@ -265,10 +262,7 @@ name = "Escape Shuttle Cockpit"; req_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "Z" = ( @@ -276,10 +270,7 @@ name = "Escape Shuttle Cell"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_omega.dmm b/_maps/shuttles/emergency_omega.dmm index 213a442f78dfd..7ebfbd5d5daa2 100644 --- a/_maps/shuttles/emergency_omega.dmm +++ b/_maps/shuttles/emergency_omega.dmm @@ -167,7 +167,7 @@ /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "as" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 @@ -250,7 +250,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "aC" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 @@ -450,7 +450,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "aS" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 @@ -771,10 +771,7 @@ name = "Holding Area"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "sC" = ( @@ -788,10 +785,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/escape) "wN" = ( @@ -823,10 +817,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/escape) "Ls" = ( @@ -874,12 +865,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/escape) "Ui" = ( @@ -892,10 +878,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm index d0fb2e56be66e..b50bfe2636dae 100644 --- a/_maps/shuttles/emergency_pubby.dmm +++ b/_maps/shuttles/emergency_pubby.dmm @@ -83,7 +83,7 @@ /obj/machinery/computer/security/telescreen/entertainment{ pixel_y = 32 }, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 @@ -156,7 +156,7 @@ /area/shuttle/escape) "aB" = ( /obj/structure/window/reinforced, -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-11" }, /obj/effect/turf_decal/tile/green, @@ -539,7 +539,7 @@ /area/shuttle/escape) "bn" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/machinery/light, /obj/item/storage/toolbox/mechanical, @@ -577,7 +577,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "bu" = ( -/obj/item/twohanded/required/kirbyplants{ +/obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/mineral/plastitanium/red/brig, @@ -655,20 +655,7 @@ /obj/machinery/door/airlock/public/glass{ name = "First Class" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/shuttle/escape) -"lO" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Service" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/escape) "ub" = ( @@ -680,10 +667,7 @@ /obj/machinery/door/airlock/public/glass{ req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "xt" = ( @@ -697,10 +681,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Service" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/escape) "IC" = ( @@ -737,10 +718,7 @@ name = "Brig"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/escape) "XN" = ( @@ -748,20 +726,14 @@ name = "Cockpit"; req_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/escape) "Zi" = ( /obj/machinery/door/airlock/public/glass{ name = "Economy Class" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/escape) @@ -936,7 +908,7 @@ ar ar Zi xt -lO +yT au au au @@ -984,7 +956,7 @@ ar ar Zi Uu -lO +yT au au au diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm index 4117b9267cdc4..aade2c7992e70 100644 --- a/_maps/shuttles/emergency_raven.dmm +++ b/_maps/shuttles/emergency_raven.dmm @@ -19,7 +19,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "af" = ( -/obj/machinery/computer/shuttle, +/obj/machinery/computer/shuttle_flight, /obj/effect/turf_decal/bot_white, /turf/open/floor/plasteel/dark, /area/shuttle/escape) @@ -896,6 +896,7 @@ /obj/machinery/door/airlock/external{ name = "Emegency Shuttle External Airlock" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "cg" = ( @@ -966,6 +967,7 @@ /area/shuttle/escape) "cn" = ( /obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "co" = ( @@ -1851,6 +1853,7 @@ name = "CentCom Raven Cruiser"; width = 32 }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "ep" = ( @@ -1910,36 +1913,12 @@ }, /turf/open/floor/plasteel/dark, /area/shuttle/escape) -"jH" = ( -/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/airlock/security/glass{ - name = "Holding Area"; - req_access_txt = "2" - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/shuttle/escape) "kr" = ( /obj/machinery/door/airlock/command/glass{ name = "Cockpit"; req_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "ks" = ( @@ -1970,10 +1949,7 @@ name = "Emergency Shutle Engineering" }, /obj/machinery/atmospherics/pipe/simple/general/hidden, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/escape) "lz" = ( @@ -2073,10 +2049,7 @@ /obj/machinery/door/airlock/medical/glass{ name = "Escape Shuttle Infirmary" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/escape) "xF" = ( @@ -2137,12 +2110,7 @@ name = "Holding Area"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "Dl" = ( @@ -2249,12 +2217,7 @@ /obj/machinery/door/airlock/grunge{ name = "Emergency Shuttle Cargo Bay" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "Mk" = ( @@ -2307,6 +2270,7 @@ name = "Emergency Shuttle Seating" }, /obj/machinery/atmospherics/pipe/simple/general/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "PE" = ( @@ -2342,10 +2306,7 @@ name = "Cockpit"; req_one_access_txt = "2;19" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "QD" = ( @@ -2459,12 +2420,7 @@ name = "Escape Shuttle Infirmary"; req_one_access_txt = "2;19" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "YG" = ( @@ -2502,10 +2458,7 @@ name = "Emergency Shuttle Seating" }, /obj/machinery/atmospherics/pipe/simple/general/hidden, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/escape) @@ -2691,7 +2644,7 @@ aY aY aY bE -jH +Bo bX ci yl diff --git a/_maps/shuttles/emergency_russiafightpit.dmm b/_maps/shuttles/emergency_russiafightpit.dmm index 6183e0918d1f2..d8b74d6cb6b01 100644 --- a/_maps/shuttles/emergency_russiafightpit.dmm +++ b/_maps/shuttles/emergency_russiafightpit.dmm @@ -555,10 +555,7 @@ /obj/machinery/door/airlock/security/glass{ name = "Emergency Shuttle Cargo" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "Ge" = ( @@ -572,10 +569,7 @@ /obj/machinery/door/airlock/security/glass{ name = "Emergency Shuttle Infirmary" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "OT" = ( @@ -583,10 +577,7 @@ name = "Glorious Leaders"; req_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "SF" = ( @@ -594,12 +585,7 @@ name = "Emergency Shuttle Brig"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "Vh" = ( @@ -614,10 +600,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "Xw" = ( -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_scrapheap.dmm b/_maps/shuttles/emergency_scrapheap.dmm index a1e489eae07b7..3d21c7eb53006 100644 --- a/_maps/shuttles/emergency_scrapheap.dmm +++ b/_maps/shuttles/emergency_scrapheap.dmm @@ -171,7 +171,7 @@ /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "aF" = ( -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aG" = ( @@ -370,18 +370,12 @@ /obj/machinery/door/airlock{ name = "Unit 2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/shuttle/escape) "cq" = ( /obj/structure/grille/broken, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/escape) "gl" = ( @@ -406,20 +400,14 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "mJ" = ( /obj/machinery/door/airlock{ name = "Unisex Restrooms" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/shuttle/escape) "mN" = ( @@ -434,27 +422,18 @@ name = "Emergency Shuttle Airlock"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "Gw" = ( -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "KJ" = ( /obj/machinery/door/airlock{ name = "Unit 1" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/shuttle/escape) "NP" = ( @@ -462,20 +441,14 @@ name = "Emergency Shuttle Cockpit"; req_access_txt = "19" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/carpet, /area/shuttle/escape) "Ow" = ( /obj/machinery/door/airlock{ name = "Unit B" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/shuttle/escape) "Uc" = ( diff --git a/_maps/shuttles/emergency_wabbajack.dmm b/_maps/shuttles/emergency_wabbajack.dmm index bf6d901d8446d..d14943e4ac57e 100644 --- a/_maps/shuttles/emergency_wabbajack.dmm +++ b/_maps/shuttles/emergency_wabbajack.dmm @@ -473,18 +473,12 @@ name = "Emergency Shuttle Brig"; req_access_txt = "2" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "el" = ( /obj/machinery/door/airlock/titanium, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "ft" = ( @@ -509,10 +503,7 @@ "uR" = ( /obj/structure/barricade/wooden, /obj/machinery/door/airlock/titanium, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/cult, /area/shuttle/escape) "AO" = ( @@ -548,10 +539,7 @@ /area/shuttle/escape) "Re" = ( /obj/machinery/door/airlock/public/glass, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "RB" = ( diff --git a/_maps/shuttles/emergency_zeta.dmm b/_maps/shuttles/emergency_zeta.dmm index 5cccbebadc76f..ba268dd916814 100644 --- a/_maps/shuttles/emergency_zeta.dmm +++ b/_maps/shuttles/emergency_zeta.dmm @@ -43,7 +43,7 @@ /turf/open/floor/plating/abductor, /area/shuttle/escape) "aj" = ( -/obj/item/twohanded/required/kirbyplants/photosynthetic, +/obj/item/kirbyplants/photosynthetic, /obj/machinery/light{ dir = 1 }, @@ -95,7 +95,7 @@ /turf/open/floor/plating/abductor, /area/shuttle/escape) "as" = ( -/obj/item/twohanded/required/kirbyplants/photosynthetic, +/obj/item/kirbyplants/photosynthetic, /turf/open/floor/plating/abductor, /area/shuttle/escape) "au" = ( @@ -116,7 +116,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/photosynthetic, +/obj/item/kirbyplants/photosynthetic, /turf/open/floor/plating/abductor, /area/shuttle/escape) "aB" = ( @@ -185,7 +185,7 @@ /turf/open/floor/plating/abductor, /area/shuttle/escape) "aL" = ( -/obj/machinery/computer/prototype_cloning, +/obj/machinery/computer/cloning/prototype, /turf/open/floor/plating/abductor, /area/shuttle/escape) "aM" = ( @@ -213,7 +213,7 @@ /turf/open/floor/plating/abductor, /area/shuttle/escape) "aQ" = ( -/obj/item/twohanded/required/kirbyplants/photosynthetic, +/obj/item/kirbyplants/photosynthetic, /obj/machinery/light, /turf/open/floor/plating/abductor, /area/shuttle/escape) diff --git a/_maps/shuttles/escape_pod_default.dmm b/_maps/shuttles/escape_pod_default.dmm index ea0882d0b760a..5d74345d2caa2 100644 --- a/_maps/shuttles/escape_pod_default.dmm +++ b/_maps/shuttles/escape_pod_default.dmm @@ -9,7 +9,7 @@ /obj/machinery/status_display/evac{ pixel_x = 32 }, -/obj/machinery/computer/shuttle/pod{ +/obj/machinery/computer/shuttle_flight/pod{ pixel_x = -32 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/escape_pod_large.dmm b/_maps/shuttles/escape_pod_large.dmm index 534379c7e253d..0b3a766e4ffbc 100644 --- a/_maps/shuttles/escape_pod_large.dmm +++ b/_maps/shuttles/escape_pod_large.dmm @@ -29,7 +29,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/pod_1) "C" = ( -/obj/machinery/computer/shuttle/monastery_shuttle, +/obj/machinery/computer/shuttle_flight/monastery_shuttle, /obj/machinery/light{ dir = 1 }, diff --git a/_maps/shuttles/exploration_corg.dmm b/_maps/shuttles/exploration_corg.dmm new file mode 100644 index 0000000000000..d6855671d4bc3 --- /dev/null +++ b/_maps/shuttles/exploration_corg.dmm @@ -0,0 +1,1380 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aA" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, +/area/shuttle/exploration) +"aP" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/mineral/titanium/purple, +/area/shuttle/exploration) +"aV" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"bb" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"bA" = ( +/obj/structure/closet/crate, +/obj/item/radio/headset/headset_exploration, +/obj/item/radio/headset/headset_exploration, +/obj/item/wrench, +/obj/item/pickaxe, +/obj/item/mining_scanner, +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"bS" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"ce" = ( +/obj/machinery/door/airlock/shuttle, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"cr" = ( +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"cG" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"df" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/exploration) +"dq" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"dv" = ( +/obj/machinery/atmospherics/pipe/manifold/purple/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"dN" = ( +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"dS" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"eN" = ( +/mob/living/simple_animal/chicken/turkey{ + 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); + desc = "A veteran of Nanotrasen's Animal Experimentation Program that attempted to replicate the organic space suit that some hostile entities are known to have exhibited, Tom now serves Nanotrasen as the mascot of the Exploration Crew."; + health = 200; + maxHealth = 200; + melee_damage = 5; + minbodytemp = 2.7; + name = "Tom" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"fy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"fO" = ( +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"fU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"gJ" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/exploration) +"gM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"gS" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/power/port_gen/pacman, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/shuttle/exploration) +"gW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"hc" = ( +/obj/machinery/camera/autoname{ + dir = 8; + name = "Exploration Shuttle"; + network = list("exploration shuttle") + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"hP" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/shuttle/exploration) +"hW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/exploration) +"iG" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"iT" = ( +/obj/machinery/computer/rdconsole, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"jt" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"jB" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/exploration) +"jO" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/suit_storage_unit/open, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"jR" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 25 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"jS" = ( +/obj/machinery/atmospherics/pipe/simple/purple/visible{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"ka" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"kx" = ( +/obj/machinery/computer/security, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"kH" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"kI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/shuttle, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"kO" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"lc" = ( +/obj/machinery/atmospherics/components/trinary/mixer/airmix{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"lg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"lY" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"mb" = ( +/obj/machinery/atmospherics/components/unary/shuttle/heater{ + dir = 4 + }, +/obj/structure/window/reinforced/survival_pod{ + dir = 4 + }, +/turf/open/floor/engine, +/area/shuttle/exploration) +"mk" = ( +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"ml" = ( +/obj/effect/turf_decal/bot, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"mr" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"mL" = ( +/obj/machinery/computer/objective{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"mR" = ( +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"nu" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = 29 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"nF" = ( +/obj/machinery/atmospherics/pipe/manifold/dark/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"nK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"nY" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"om" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"pd" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/caution, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"pi" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/suit_storage_unit/open, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"pR" = ( +/obj/structure/table, +/obj/item/toy/cards/deck/unum, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/exploration) +"pT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"qJ" = ( +/obj/machinery/atmospherics/pipe/simple/purple/visible{ + dir = 10 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 24 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"sh" = ( +/obj/effect/spawner/structure/window/shuttle, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating, +/area/shuttle/exploration) +"sD" = ( +/obj/machinery/computer/shuttle_flight/custom_shuttle/exploration{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"sO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"sY" = ( +/obj/machinery/atmospherics/pipe/manifold/dark/visible{ + dir = 8 + }, +/obj/machinery/airalarm/unlocked{ + dir = 4; + pixel_x = -24 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"te" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"tt" = ( +/obj/machinery/computer/crew{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"tD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/caution{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"um" = ( +/obj/item/storage/toolbox/mechanical, +/obj/machinery/power/smes{ + charge = 1e+006 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"up" = ( +/obj/machinery/atmospherics/pipe/manifold4w/purple/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"uQ" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"vb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"ve" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"vx" = ( +/obj/machinery/atmospherics/pipe/simple/purple/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"wc" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"wo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"xl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"yh" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/exploration) +"ym" = ( +/obj/machinery/atmospherics/pipe/simple/purple/visible{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"yz" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"yM" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"zN" = ( +/obj/machinery/atmospherics/pipe/manifold/purple/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Ac" = ( +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Af" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/exploration) +"Ay" = ( +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/exploration) +"Az" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"AN" = ( +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/delivery, +/obj/docking_port/mobile{ + dwidth = 16; + height = 15; + id = "exploration"; + name = "Exploration Shuttle"; + port_direction = 4; + shuttle_object_type = /datum/orbital_object/shuttle/custom_shuttle; + width = 23 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"AU" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/components/unary/plasma_refiner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/exploration) +"Cc" = ( +/obj/machinery/atmospherics/pipe/manifold4w/purple/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Cu" = ( +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"CU" = ( +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Dn" = ( +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"Fr" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Gb" = ( +/obj/structure/table, +/obj/item/storage/toolbox/electrical, +/obj/item/gps/mining/exploration, +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"Gt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"GI" = ( +/obj/structure/closet/crate/science, +/obj/item/circuitboard/computer/exploration_shuttle, +/obj/item/stack/sheet/mineral/plasma/five, +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"Hm" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/canister/air, +/obj/item/wrench, +/turf/open/floor/mineral/titanium/purple, +/area/shuttle/exploration) +"HG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"HU" = ( +/obj/machinery/telecomms/relay/preset/exploration, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"JG" = ( +/obj/machinery/atmospherics/pipe/simple/purple/visible{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"JP" = ( +/obj/structure/table, +/obj/item/stack/sheet/mineral/plasma/five, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/exploration) +"JV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Kc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"KX" = ( +/obj/structure/table, +/obj/item/toy/cards/deck, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/exploration) +"Lc" = ( +/obj/machinery/atmospherics/pipe/simple/purple/visible{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Ls" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/mineral/titanium/purple, +/area/shuttle/exploration) +"LA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"LR" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/exploration) +"My" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"MF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Nl" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 5 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"NO" = ( +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"NZ" = ( +/obj/machinery/atmospherics/pipe/simple/purple/visible, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/east{ + locked = 0; + pixel_x = 24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Of" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"PF" = ( +/obj/structure/table, +/obj/item/toy/cards/deck/cas, +/obj/item/toy/cards/deck/cas/black{ + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets, +/obj/item/storage/box/donkpockets, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/exploration) +"QG" = ( +/obj/machinery/shuttle/engine/plasma{ + dir = 4 + }, +/turf/open/floor/engine, +/area/shuttle/exploration) +"QT" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"SG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/item/beacon, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"SO" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"SR" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 25 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Tz" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/exploration) +"TU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"TV" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Up" = ( +/obj/structure/chair/comfy/shuttle, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/exploration) +"Vw" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"VA" = ( +/obj/machinery/atmospherics/pipe/simple/purple/visible{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/power/terminal{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"VO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"VV" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/air, +/obj/item/analyzer, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"Wd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Wh" = ( +/obj/machinery/atmospherics/pipe/simple/purple/visible, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Xp" = ( +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Exploration Shuttle"; + departmentType = 5; + pixel_x = -32 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"XG" = ( +/obj/effect/spawner/structure/window/shuttle, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/exploration) +"XI" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"YE" = ( +/obj/machinery/door/airlock/shuttle, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"YF" = ( +/obj/machinery/door/airlock/shuttle, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"YO" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"YR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"ZB" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/o2, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"ZM" = ( +/turf/template_noop, +/area/template_noop) +"ZT" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/exploration) + +(1,1,1) = {" +ZM +Ay +QG +QG +QG +yh +ZM +ZM +ZM +yh +QG +QG +QG +Ay +ZM +"} +(2,1,1) = {" +Ay +Ay +mb +mb +mb +yh +yh +yh +yh +yh +mb +mb +mb +Ay +Ay +"} +(3,1,1) = {" +yh +yh +VA +Cc +JG +gS +aA +hP +aA +AU +Lc +up +ym +yh +yh +"} +(4,1,1) = {" +df +df +um +qJ +NZ +vx +zN +zN +zN +dv +Wh +jS +fO +df +df +"} +(5,1,1) = {" +gJ +gJ +df +df +df +df +fO +fO +fO +df +kI +df +df +gJ +gJ +"} +(6,1,1) = {" +ka +jB +pi +jO +pi +df +df +YF +df +df +vb +dq +jt +jB +pT +"} +(7,1,1) = {" +ka +jB +Dn +Dn +Dn +df +nu +fO +eN +df +jt +lY +kH +jB +pT +"} +(8,1,1) = {" +ka +jB +ml +Dn +Dn +df +YO +fU +TV +df +kH +jR +VV +jB +pT +"} +(9,1,1) = {" +gJ +gJ +bA +Dn +Dn +YE +fO +te +Az +df +df +df +gJ +gJ +gJ +"} +(10,1,1) = {" +gJ +gJ +GI +kH +HU +df +fO +te +Az +SO +fO +fO +fO +gJ +gJ +"} +(11,1,1) = {" +gJ +gJ +df +df +df +df +fO +te +Az +Up +KX +ZT +Af +gJ +gJ +"} +(12,1,1) = {" +ka +jB +Hm +sY +lc +Nl +fO +SG +Az +Up +Tz +pR +LR +jB +pT +"} +(13,1,1) = {" +ka +jB +aP +nF +wc +wc +fO +te +Az +Up +PF +JP +LR +jB +pT +"} +(14,1,1) = {" +yM +sh +Ls +YR +ZB +yz +ve +bS +cr +Of +fy +xl +fO +jB +pT +"} +(15,1,1) = {" +gJ +gJ +df +dS +fO +cG +Gt +hc +SR +MF +fO +Kc +df +gJ +gJ +"} +(16,1,1) = {" +Ac +bb +dN +pd +fU +jB +df +df +df +XG +lg +tD +mk +XI +mR +"} +(17,1,1) = {" +NO +gM +Cu +sO +TU +HG +Wd +mr +Wd +QT +JV +uQ +CU +wo +AN +"} +(18,1,1) = {" +gJ +gJ +df +nK +fy +fy +fy +gW +Fr +fy +fy +om +df +gJ +gJ +"} +(19,1,1) = {" +ZM +gJ +gJ +df +df +df +df +ce +hW +df +df +df +gJ +gJ +ZM +"} +(20,1,1) = {" +ZM +ZM +gJ +jB +iT +aV +My +VO +LA +Xp +mL +jB +gJ +ZM +ZM +"} +(21,1,1) = {" +ZM +ZM +ZM +jB +kx +kO +Dn +nY +Dn +iG +tt +jB +ZM +ZM +ZM +"} +(22,1,1) = {" +ZM +ZM +ZM +jB +jB +Gb +kH +sD +kH +Vw +jB +jB +ZM +ZM +ZM +"} +(23,1,1) = {" +ZM +ZM +ZM +ZM +jB +jB +jB +jB +jB +jB +jB +ZM +ZM +ZM +ZM +"} diff --git a/_maps/shuttles/exploration_delta.dmm b/_maps/shuttles/exploration_delta.dmm new file mode 100644 index 0000000000000..99646bb1f3509 --- /dev/null +++ b/_maps/shuttles/exploration_delta.dmm @@ -0,0 +1,459 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/window/reinforced/survival_pod{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/shuttle/heater{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/exploration) +"b" = ( +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 4 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/exploration) +"c" = ( +/turf/template_noop, +/area/template_noop) +"d" = ( +/obj/machinery/holopad, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"e" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 4; + initialize_directions = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"f" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"g" = ( +/obj/effect/turf_decal/bot, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"h" = ( +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/shuttle/exploration) +"j" = ( +/obj/machinery/atmospherics/components/unary/plasma_refiner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/exploration) +"k" = ( +/obj/machinery/atmospherics/pipe/manifold/purple/visible{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"l" = ( +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"m" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/exploration) +"n" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"o" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"p" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"q" = ( +/obj/machinery/shuttle/engine/plasma{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/exploration) +"r" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"s" = ( +/obj/machinery/atmospherics/pipe/simple/purple/visible{ + dir = 6 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"t" = ( +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/exploration) +"u" = ( +/obj/machinery/atmospherics/pipe/manifold/dark/hidden{ + dir = 4 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/exploration) +"v" = ( +/obj/machinery/atmospherics/pipe/simple/dark/hidden, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/exploration) +"w" = ( +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 9 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/exploration) +"x" = ( +/obj/machinery/computer/crew, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"y" = ( +/obj/machinery/computer/objective, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"A" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/power/port_gen/pacman, +/obj/item/wrench, +/obj/item/stack/sheet/mineral/plasma/fifty, +/turf/open/floor/plating, +/area/shuttle/exploration) +"B" = ( +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"C" = ( +/obj/machinery/computer/shuttle_flight/custom_shuttle/exploration, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"D" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"E" = ( +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 5 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/exploration) +"F" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"G" = ( +/obj/docking_port/mobile{ + dir = 8; + dwidth = 6; + height = 8; + id = "exploration"; + name = "Exploration Shuttle"; + port_direction = 4; + shuttle_object_type = /datum/orbital_object/shuttle/custom_shuttle; + width = 16 + }, +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"H" = ( +/obj/machinery/atmospherics/pipe/manifold4w/purple/visible, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"I" = ( +/obj/machinery/door/airlock/shuttle, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"J" = ( +/obj/structure/closet/crate, +/obj/item/circuitboard/computer/exploration_shuttle, +/obj/item/stack/sheet/mineral/plasma/five, +/obj/item/pickaxe, +/obj/item/mining_scanner, +/obj/item/radio/headset/headset_exploration, +/obj/item/radio/headset/headset_exploration, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/item/gps/mining, +/turf/open/floor/plating, +/area/shuttle/exploration) +"K" = ( +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"L" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/shuttle/exploration) +"M" = ( +/mob/living/simple_animal/chicken/turkey{ + 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); + desc = "A veteran of Nanotrasen's Animal Experimentation Program that attempted to replicate the organic space suit that some hostile entities are known to have exhibited, Tom now serves Nanotrasen as the mascot of the Exploration Crew."; + health = 200; + maxHealth = 200; + melee_damage = 5; + minbodytemp = 2.7; + name = "Tom" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"N" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/exploration) +"O" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/exploration) +"P" = ( +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 6 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"Q" = ( +/obj/machinery/door/airlock/shuttle, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"R" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/exploration) +"S" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"T" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"U" = ( +/obj/effect/turf_decal/bot, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"V" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/machinery/microwave, +/obj/item/storage/box/donkpockets, +/obj/item/storage/box/donkpockets, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"W" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"X" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Y" = ( +/obj/machinery/telecomms/relay/preset/exploration, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Z" = ( +/obj/machinery/computer/arcade/orion_trail, +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) + +(1,1,1) = {" +N +N +N +N +m +O +m +m +m +m +m +m +m +R +t +c +"} +(2,1,1) = {" +O +x +l +I +B +B +B +Q +B +Z +m +A +J +j +R +t +"} +(3,1,1) = {" +O +C +f +N +y +D +V +m +T +U +m +r +p +k +a +q +"} +(4,1,1) = {" +O +O +O +N +m +m +m +m +M +B +Q +r +p +k +a +q +"} +(5,1,1) = {" +c +c +c +N +Y +B +B +Q +B +B +m +X +g +k +a +q +"} +(6,1,1) = {" +h +L +L +O +S +d +B +m +m +P +v +E +s +H +a +q +"} +(7,1,1) = {" +c +c +c +O +W +F +W +m +K +o +e +b +n +n +R +t +"} +(8,1,1) = {" +c +c +c +N +N +O +m +m +m +G +u +w +m +R +t +c +"} diff --git a/_maps/shuttles/exploration_shuttle.dmm b/_maps/shuttles/exploration_shuttle.dmm new file mode 100644 index 0000000000000..96dac8639d3c9 --- /dev/null +++ b/_maps/shuttles/exploration_shuttle.dmm @@ -0,0 +1,464 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/machinery/door/airlock/shuttle, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"b" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/manifold/purple/visible{ + dir = 1 + }, +/obj/structure/closet/crate, +/obj/item/radio/headset/headset_exploration, +/obj/item/radio/headset/headset_exploration, +/obj/item/wrench, +/obj/item/pickaxe, +/obj/item/mining_scanner, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"c" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"d" = ( +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"e" = ( +/obj/structure/fans/tiny, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters{ + id = "exploration" + }, +/obj/machinery/button/door{ + desc = "A remote control switch."; + id = "exploration"; + name = "Exploration Shuttle Shutters"; + normaldoorcontrol = 0; + pixel_y = 24 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"f" = ( +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 4 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/exploration) +"g" = ( +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"i" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"j" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/manifold/purple/visible{ + dir = 1 + }, +/obj/machinery/power/port_gen/pacman, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"k" = ( +/obj/machinery/atmospherics/pipe/manifold/dark/hidden{ + dir = 4 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/exploration) +"l" = ( +/turf/template_noop, +/area/template_noop) +"m" = ( +/obj/machinery/computer/objective, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"n" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/manifold/purple/visible{ + dir = 1 + }, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"o" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/plasma_refiner{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"p" = ( +/obj/machinery/shuttle/engine/plasma{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/exploration) +"q" = ( +/obj/machinery/holopad, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"r" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"s" = ( +/obj/machinery/atmospherics/pipe/simple/dark/hidden, +/turf/closed/wall/mineral/titanium, +/area/shuttle/exploration) +"t" = ( +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 6 + }, +/obj/docking_port/mobile{ + dir = 4; + dwidth = 5; + height = 7; + id = "exploration"; + name = "Exploration Shuttle"; + port_direction = 8; + shuttle_object_type = /datum/orbital_object/shuttle/custom_shuttle; + width = 13 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"u" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"v" = ( +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 9 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/exploration) +"x" = ( +/obj/machinery/door/airlock/external/glass, +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"y" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 4; + initialize_directions = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"z" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/exploration) +"A" = ( +/obj/structure/fans/tiny, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters{ + id = "exploration" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"B" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"C" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/science, +/obj/item/circuitboard/computer/exploration_shuttle, +/obj/item/stack/sheet/mineral/plasma/five, +/obj/item/gps/mining, +/obj/item/storage/toolbox/mechanical, +/obj/item/multitool, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"D" = ( +/obj/structure/table, +/obj/machinery/recharger, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"E" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"F" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/item/storage/box/donkpockets, +/obj/item/storage/box/donkpockets, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"G" = ( +/obj/structure/cable/yellow, +/obj/effect/turf_decal/bot, +/turf/open/floor/plating, +/area/shuttle/exploration) +"H" = ( +/obj/machinery/atmospherics/pipe/simple/dark/hidden{ + dir = 5 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/exploration) +"I" = ( +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/exploration) +"K" = ( +/obj/structure/fans/tiny, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters{ + id = "exploration" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"L" = ( +/obj/structure/window/reinforced/survival_pod{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/shuttle/heater{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/exploration) +"M" = ( +/obj/machinery/computer/shuttle_flight/custom_shuttle/exploration, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"N" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"O" = ( +/mob/living/simple_animal/chicken/turkey{ + 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); + desc = "A veteran of Nanotrasen's Animal Experimentation Program that attempted to replicate the organic space suit that some hostile entities are known to have exhibited, Tom now serves Nanotrasen as the mascot of the Exploration Crew."; + health = 200; + maxHealth = 200; + melee_damage = 5; + minbodytemp = 2.7; + name = "Tom" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"P" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"Q" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/exploration) +"R" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/exploration) +"S" = ( +/obj/machinery/door/airlock/shuttle, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) +"T" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"U" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"V" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"W" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/exploration) +"X" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Y" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/telecomms/relay/preset/exploration, +/turf/open/floor/mineral/titanium, +/area/shuttle/exploration) +"Z" = ( +/obj/structure/closet/emcloset/anchored, +/obj/machinery/advanced_airlock_controller/directional/east, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/exploration) + +(1,1,1) = {" +l +R +R +Q +Q +t +s +H +e +K +Q +I +l +"} +(2,1,1) = {" +R +R +D +z +Z +c +y +f +B +C +U +W +I +"} +(3,1,1) = {" +R +M +P +z +z +x +k +v +u +E +n +L +p +"} +(4,1,1) = {" +R +d +d +S +g +g +Y +R +N +G +j +L +p +"} +(5,1,1) = {" +R +m +P +z +O +q +g +a +V +E +b +L +p +"} +(6,1,1) = {" +R +R +F +z +i +X +i +z +r +T +o +W +I +"} +(7,1,1) = {" +l +R +R +Q +Q +R +Q +z +e +A +Q +I +l +"} diff --git a/_maps/shuttles/ferry_base.dmm b/_maps/shuttles/ferry_base.dmm index 36a54e54bcd17..8da2abfe6ae2c 100644 --- a/_maps/shuttles/ferry_base.dmm +++ b/_maps/shuttles/ferry_base.dmm @@ -30,7 +30,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "i" = ( -/obj/machinery/computer/shuttle/ferry/request{ +/obj/machinery/computer/shuttle_flight/ferry/request{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, @@ -40,6 +40,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "k" = ( +/obj/structure/fans/tiny, /obj/machinery/door/airlock/titanium, /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) @@ -48,6 +49,7 @@ /area/shuttle/transport) "m" = ( /obj/machinery/door/airlock/titanium, +/obj/structure/fans/tiny, /obj/docking_port/mobile{ dir = 8; dwidth = 2; diff --git a/_maps/shuttles/ferry_fancy.dmm b/_maps/shuttles/ferry_fancy.dmm index 432791c93679b..6627e93c0dbef 100644 --- a/_maps/shuttles/ferry_fancy.dmm +++ b/_maps/shuttles/ferry_fancy.dmm @@ -10,6 +10,7 @@ /turf/open/floor/plating, /area/shuttle/transport) "d" = ( +/obj/structure/fans/tiny, /obj/machinery/door/airlock/external, /turf/open/floor/pod/dark, /area/shuttle/transport) @@ -57,13 +58,14 @@ /turf/open/floor/pod/light, /area/shuttle/transport) "m" = ( -/obj/machinery/computer/shuttle/ferry/request{ +/obj/machinery/computer/shuttle_flight/ferry/request{ dir = 8 }, /turf/open/floor/pod/dark, /area/shuttle/transport) "n" = ( /obj/machinery/door/airlock/titanium, +/obj/structure/fans/tiny, /obj/docking_port/mobile{ dir = 8; dwidth = 2; @@ -97,6 +99,7 @@ /turf/open/floor/pod/light, /area/shuttle/transport) "r" = ( +/obj/structure/fans/tiny, /obj/machinery/door/airlock/external, /turf/open/floor/pod/light, /area/shuttle/transport) diff --git a/_maps/shuttles/ferry_kilo.dmm b/_maps/shuttles/ferry_kilo.dmm index 708cf5696d599..15e15d68efa8b 100644 --- a/_maps/shuttles/ferry_kilo.dmm +++ b/_maps/shuttles/ferry_kilo.dmm @@ -108,7 +108,7 @@ /turf/open/floor/plating/airless, /area/shuttle/transport) "q" = ( -/obj/machinery/computer/shuttle/ferry/request{ +/obj/machinery/computer/shuttle_flight/ferry/request{ dir = 4 }, /obj/effect/turf_decal/bot, diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm index 4158efacc5713..cc8039c6ef8f5 100644 --- a/_maps/shuttles/ferry_lighthouse.dmm +++ b/_maps/shuttles/ferry_lighthouse.dmm @@ -35,7 +35,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) "al" = ( -/obj/machinery/computer/shuttle/ferry/request{ +/obj/machinery/computer/shuttle_flight/ferry/request{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, @@ -236,7 +236,7 @@ /turf/open/floor/wood, /area/shuttle/transport) "bd" = ( -/obj/item/twohanded/required/kirbyplants/dead{ +/obj/item/kirbyplants/dead{ desc = "It doesn't look very healthy..."; name = "potted plant" }, diff --git a/_maps/shuttles/ferry_meat.dmm b/_maps/shuttles/ferry_meat.dmm index 6448621a4e81d..918d6560cbfd3 100644 --- a/_maps/shuttles/ferry_meat.dmm +++ b/_maps/shuttles/ferry_meat.dmm @@ -21,7 +21,7 @@ /turf/open/floor/plasteel/freezer, /area/shuttle/transport) "g" = ( -/obj/machinery/computer/shuttle/ferry/request{ +/obj/machinery/computer/shuttle_flight/ferry/request{ dir = 8 }, /turf/open/floor/plasteel/freezer, @@ -99,11 +99,11 @@ /turf/open/floor/plating, /area/shuttle/transport) "p" = ( +/obj/structure/fans/tiny, /obj/machinery/door/airlock/titanium, /turf/open/floor/plasteel/freezer, /area/shuttle/transport) "q" = ( -/obj/machinery/door/airlock/titanium, /obj/docking_port/mobile{ dir = 8; dwidth = 2; @@ -113,6 +113,8 @@ port_direction = 2; width = 5 }, +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/titanium, /turf/open/floor/plasteel/freezer, /area/shuttle/transport) "t" = ( diff --git a/_maps/shuttles/hunter_bounty.dmm b/_maps/shuttles/hunter_bounty.dmm index 5b1b9ddaa2503..7240a1bebc1d9 100644 --- a/_maps/shuttles/hunter_bounty.dmm +++ b/_maps/shuttles/hunter_bounty.dmm @@ -133,7 +133,7 @@ /turf/open/floor/pod/dark, /area/shuttle/hunter) "A" = ( -/obj/machinery/computer/shuttle/hunter{ +/obj/machinery/computer/shuttle_flight/hunter{ icon_state = "computer"; dir = 8 }, @@ -155,7 +155,7 @@ /area/shuttle/hunter) "E" = ( /obj/structure/table, -/obj/item/twohanded/binoculars, +/obj/item/binoculars, /turf/open/floor/pod/dark, /area/shuttle/hunter) "F" = ( @@ -173,10 +173,6 @@ /turf/open/floor/pod/dark, /area/shuttle/hunter) "I" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{ - icon_state = "computer"; - dir = 8 - }, /turf/open/floor/pod/dark, /area/shuttle/hunter) "J" = ( diff --git a/_maps/shuttles/hunter_russian.dmm b/_maps/shuttles/hunter_russian.dmm index 57976dd990170..8999c1d45c8e2 100644 --- a/_maps/shuttles/hunter_russian.dmm +++ b/_maps/shuttles/hunter_russian.dmm @@ -74,7 +74,7 @@ /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /turf/open/floor/plating, /area/shuttle/hunter) @@ -130,7 +130,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter) "A" = ( -/obj/machinery/computer/shuttle/hunter{ +/obj/machinery/computer/shuttle_flight/hunter{ dir = 8 }, /turf/open/floor/mineral/plastitanium/red, @@ -138,7 +138,7 @@ "B" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /turf/open/floor/plating, /area/shuttle/hunter) @@ -153,11 +153,6 @@ /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" = ( diff --git a/_maps/shuttles/hunter_space_cop.dmm b/_maps/shuttles/hunter_space_cop.dmm index 354b924e56b7a..f99a1e0612380 100644 --- a/_maps/shuttles/hunter_space_cop.dmm +++ b/_maps/shuttles/hunter_space_cop.dmm @@ -1,14 +1,9 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +//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{ +/obj/machinery/computer/shuttle_flight/hunter{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/infiltrator_advanced.dmm b/_maps/shuttles/infiltrator_advanced.dmm index d4c2f30dd1426..509f42bc3cd2a 100644 --- a/_maps/shuttles/infiltrator_advanced.dmm +++ b/_maps/shuttles/infiltrator_advanced.dmm @@ -51,11 +51,6 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/bridge) "ah" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/bridge) "ai" = ( @@ -69,7 +64,7 @@ /turf/open/floor/pod/dark, /area/shuttle/syndicate/armory) "aj" = ( -/obj/machinery/computer/shuttle/syndicate, +/obj/machinery/computer/shuttle_flight/syndicate, /obj/effect/turf_decal/bot, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/bridge) diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index f85fcf26199b1..a0ccc0b137209 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -11,12 +11,6 @@ "ac" = ( /turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/bridge) -"ad" = ( -/obj/machinery/porta_turret/syndicate/shuttle{ - dir = 10 - }, -/turf/closed/wall/r_wall/syndicate, -/area/shuttle/syndicate/hallway) "ae" = ( /obj/structure/window/plastitanium, /obj/machinery/door/poddoor/shutters{ @@ -40,12 +34,11 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/bridge) "ai" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate, /obj/effect/turf_decal/bot_white, /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/bridge) "aj" = ( -/obj/machinery/computer/shuttle/syndicate, +/obj/machinery/computer/shuttle_flight/syndicate, /obj/effect/turf_decal/bot_white, /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/bridge) @@ -167,11 +160,22 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/bridge) "aw" = ( -/obj/machinery/porta_turret/syndicate/shuttle{ - dir = 9 +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/turf/closed/wall/r_wall/syndicate, -/area/shuttle/syndicate/eva) +/obj/machinery/turretid{ + ailock = 1; + desc = "Used to control the shuttle's automated defenses."; + icon_state = "control_kill"; + lethal = 1; + name = "infiltrator turret controls"; + pixel_y = -30; + req_access = null; + req_access_txt = "150" + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/syndicate/bridge) "ax" = ( /turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/eva) @@ -264,18 +268,6 @@ }, /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/hallway) -"aF" = ( -/obj/machinery/porta_turret/syndicate/shuttle{ - dir = 5 - }, -/turf/closed/wall/r_wall/syndicate, -/area/shuttle/syndicate/armory) -"aG" = ( -/obj/machinery/porta_turret/syndicate/shuttle{ - dir = 9 - }, -/turf/closed/wall/r_wall/syndicate, -/area/shuttle/syndicate/medical) "aH" = ( /obj/structure/chair/comfy/shuttle{ dir = 4; @@ -1173,7 +1165,7 @@ dir = 10 }, /turf/closed/wall/r_wall/syndicate, -/area/shuttle/syndicate/armory) +/area/shuttle/syndicate/bridge) "pd" = ( /obj/machinery/porta_turret/syndicate/shuttle{ dir = 5 @@ -1185,18 +1177,12 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/eva) -"In" = ( -/obj/machinery/porta_turret/syndicate/shuttle{ - dir = 6 - }, -/turf/closed/wall/r_wall/syndicate, -/area/shuttle/syndicate/hallway) "MJ" = ( /obj/machinery/porta_turret/syndicate/shuttle{ dir = 6 }, /turf/closed/wall/r_wall/syndicate, -/area/shuttle/syndicate/medical) +/area/shuttle/syndicate/bridge) (1,1,1) = {" aa @@ -1212,7 +1198,7 @@ aa aa aa aa -aG +ab aJ aJ aJ @@ -1231,7 +1217,7 @@ aa aa aa aa -aw +ab ax ax ax @@ -1329,7 +1315,7 @@ ag an at ac -ad +dp aa ax aN @@ -1427,7 +1413,7 @@ aa ae ak ap -at +aw ac aA aE @@ -1479,7 +1465,7 @@ am as at ac -In +MJ aa aB aO @@ -1581,7 +1567,7 @@ aa aa aa aa -aF +pd aB aB aY @@ -1612,7 +1598,7 @@ aa aa aa aa -aF +pd bm bm bm diff --git a/_maps/shuttles/labour_box.dmm b/_maps/shuttles/labour_box.dmm index df7a62cc4cfdc..3b5b92810c508 100644 --- a/_maps/shuttles/labour_box.dmm +++ b/_maps/shuttles/labour_box.dmm @@ -7,7 +7,7 @@ /turf/open/floor/plating, /area/shuttle/labor) "c" = ( -/obj/machinery/computer/shuttle/labor{ +/obj/machinery/computer/shuttle_flight/labor{ dir = 4 }, /obj/structure/reagent_dispensers/peppertank{ diff --git a/_maps/shuttles/labour_corg.dmm b/_maps/shuttles/labour_corg.dmm new file mode 100644 index 0000000000000..3b670f784d9aa --- /dev/null +++ b/_maps/shuttles/labour_corg.dmm @@ -0,0 +1,227 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/machinery/mineral/stacking_machine/laborstacker{ + input_dir = 2; + output_dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/labor) +"b" = ( +/obj/machinery/mineral/labor_claim_console{ + machinedir = 1; + pixel_x = 30 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/labor) +"e" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/labor) +"h" = ( +/obj/structure/reagent_dispensers/peppertank{ + pixel_x = -31 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/labor) +"p" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/labor) +"r" = ( +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/labor) +"t" = ( +/obj/machinery/door/airlock/titanium{ + name = "Labor Shuttle Airlock"; + req_access_txt = "2" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/labor) +"y" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/labor) +"A" = ( +/obj/machinery/mineral/stacking_unit_console{ + machinedir = 2; + pixel_x = 30; + pixel_y = -4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/labor) +"B" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/labor) +"D" = ( +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/labor) +"E" = ( +/obj/machinery/door/airlock/titanium{ + id_tag = "prisonshuttle"; + name = "Labor Shuttle Airlock" + }, +/obj/docking_port/mobile{ + dir = 8; + dwidth = 2; + height = 5; + id = "laborcamp"; + name = "labor camp shuttle"; + port_direction = 4; + width = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/labor) +"F" = ( +/obj/machinery/door/airlock/titanium{ + name = "Labor Shuttle Airlock"; + req_access_txt = "2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/labor) +"H" = ( +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/labor) +"I" = ( +/obj/machinery/button/flasher{ + id = "gulagshuttleflasher"; + name = "Flash Control"; + pixel_y = -26; + req_access_txt = "1" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/labor) +"P" = ( +/obj/machinery/computer/shuttle_flight/labor{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/labor) +"Q" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/labor) +"R" = ( +/obj/structure/shuttle/engine/heater, +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating/airless, +/area/shuttle/labor) +"S" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/open/floor/plating/airless, +/area/shuttle/labor) +"U" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/labor) +"V" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/machinery/flasher{ + id = "gulagshuttleflasher"; + pixel_x = -24 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/labor) +"X" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/labor) + +(1,1,1) = {" +y +B +y +y +B +y +U +H +"} +(2,1,1) = {" +B +P +h +F +e +V +R +S +"} +(3,1,1) = {" +B +Q +I +y +p +X +R +S +"} +(4,1,1) = {" +B +r +A +a +b +D +R +S +"} +(5,1,1) = {" +y +t +y +y +y +E +U +H +"} diff --git a/_maps/shuttles/labour_delta.dmm b/_maps/shuttles/labour_delta.dmm index 6299e6e2f8f98..d42d6336d877e 100644 --- a/_maps/shuttles/labour_delta.dmm +++ b/_maps/shuttles/labour_delta.dmm @@ -7,7 +7,7 @@ /turf/open/floor/plating, /area/shuttle/labor) "c" = ( -/obj/machinery/computer/shuttle/labor{ +/obj/machinery/computer/shuttle_flight/labor{ dir = 4 }, /obj/structure/reagent_dispensers/peppertank{ diff --git a/_maps/shuttles/labour_kilo.dmm b/_maps/shuttles/labour_kilo.dmm index 9ee9a38f07b6b..b95c4c197398f 100644 --- a/_maps/shuttles/labour_kilo.dmm +++ b/_maps/shuttles/labour_kilo.dmm @@ -7,7 +7,7 @@ /turf/open/floor/plating, /area/shuttle/labor) "c" = ( -/obj/machinery/computer/shuttle/labor{ +/obj/machinery/computer/shuttle_flight/labor{ dir = 4 }, /obj/structure/reagent_dispensers/peppertank{ diff --git a/_maps/shuttles/mining_box.dmm b/_maps/shuttles/mining_box.dmm index 8324b485f3013..2178d43138c33 100644 --- a/_maps/shuttles/mining_box.dmm +++ b/_maps/shuttles/mining_box.dmm @@ -13,7 +13,7 @@ /turf/open/floor/pod/dark, /area/shuttle/mining) "d" = ( -/obj/machinery/computer/shuttle/mining, +/obj/machinery/computer/shuttle_flight/mining, /turf/open/floor/pod/dark, /area/shuttle/mining) "e" = ( @@ -42,6 +42,7 @@ width = 7 }, /obj/machinery/door/airlock/survival_pod/glass, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/mining) "i" = ( diff --git a/_maps/shuttles/mining_delta.dmm b/_maps/shuttles/mining_delta.dmm index 428e3f641744b..38a22692641f6 100644 --- a/_maps/shuttles/mining_delta.dmm +++ b/_maps/shuttles/mining_delta.dmm @@ -20,7 +20,7 @@ /turf/open/floor/pod/dark, /area/shuttle/mining) "d" = ( -/obj/machinery/computer/shuttle/mining, +/obj/machinery/computer/shuttle_flight/mining, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -92,6 +92,7 @@ dir = 4 }, /obj/machinery/door/airlock/survival_pod/glass, +/obj/structure/fans/tiny, /turf/open/floor/pod/light, /area/shuttle/mining) "j" = ( @@ -131,6 +132,7 @@ dir = 8 }, /obj/machinery/door/airlock/survival_pod/glass, +/obj/structure/fans/tiny, /turf/open/floor/pod/light, /area/shuttle/mining) "n" = ( diff --git a/_maps/shuttles/mining_kilo.dmm b/_maps/shuttles/mining_kilo.dmm index ac53660cc35ae..e33585b93f60d 100644 --- a/_maps/shuttles/mining_kilo.dmm +++ b/_maps/shuttles/mining_kilo.dmm @@ -16,7 +16,7 @@ /area/shuttle/mining) "d" = ( /obj/effect/turf_decal/bot, -/obj/machinery/computer/shuttle/mining, +/obj/machinery/computer/shuttle_flight/mining, /turf/open/floor/mineral/plastitanium, /area/shuttle/mining) "e" = ( diff --git a/_maps/shuttles/mining_large.dmm b/_maps/shuttles/mining_large.dmm index 5794899d10152..43316c4305d99 100644 --- a/_maps/shuttles/mining_large.dmm +++ b/_maps/shuttles/mining_large.dmm @@ -22,7 +22,7 @@ /turf/open/floor/pod/light, /area/shuttle/mining/large) "d" = ( -/obj/machinery/computer/shuttle/mining, +/obj/machinery/computer/shuttle_flight/mining, /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -412,6 +412,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/mining/large) "E" = ( @@ -471,6 +472,7 @@ port_direction = 2; width = 7 }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/mining/large) "N" = ( diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index 4cf6e3c7c5d1e..50193738eb32a 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -28,7 +28,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/pirate) "ac" = ( -/obj/machinery/computer/shuttle/pirate, +/obj/machinery/computer/shuttle_flight/pirate, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -490,11 +490,6 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{ - dir = 4; - x_offset = -3; - y_offset = 7 - }, /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm{ dir = 1; diff --git a/_maps/shuttles/ruin_caravan_victim.dmm b/_maps/shuttles/ruin_caravan_victim.dmm index 689aa17a03538..2581d6980539b 100644 --- a/_maps/shuttles/ruin_caravan_victim.dmm +++ b/_maps/shuttles/ruin_caravan_victim.dmm @@ -279,9 +279,6 @@ /area/shuttle/caravan/freighter1) "mZ" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/trade1{ - dir = 8 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -878,7 +875,7 @@ /area/shuttle/caravan/freighter1) "Ow" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/shuttle/caravan/trade1{ +/obj/machinery/computer/shuttle_flight/caravan/trade1{ dir = 8 }, /obj/effect/turf_decal/tile/blue{ @@ -1021,7 +1018,7 @@ /area/shuttle/caravan/freighter1) "TP" = ( /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/item/stack/sheet/iron/fifty, /turf/open/floor/plasteel/airless/dark, diff --git a/_maps/shuttles/ruin_pirate_cutter.dmm b/_maps/shuttles/ruin_pirate_cutter.dmm index 86c9c1c8f078a..be00778145828 100644 --- a/_maps/shuttles/ruin_pirate_cutter.dmm +++ b/_maps/shuttles/ruin_pirate_cutter.dmm @@ -78,7 +78,7 @@ /turf/open/floor/plating, /area/shuttle/caravan/pirate) "fL" = ( -/obj/machinery/computer/shuttle/caravan/pirate{ +/obj/machinery/computer/shuttle_flight/caravan/pirate{ dir = 8 }, /obj/effect/turf_decal/tile/red{ @@ -349,7 +349,6 @@ /turf/closed/wall/mineral/plastitanium, /area/shuttle/caravan/pirate) "oO" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/pirate, /obj/effect/turf_decal/tile/red{ dir = 1 }, diff --git a/_maps/shuttles/ruin_syndicate_dropship.dmm b/_maps/shuttles/ruin_syndicate_dropship.dmm index 09d31e30c3ed5..133ca368ce379 100644 --- a/_maps/shuttles/ruin_syndicate_dropship.dmm +++ b/_maps/shuttles/ruin_syndicate_dropship.dmm @@ -167,7 +167,7 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/caravan/syndicate3) "rz" = ( -/obj/machinery/computer/shuttle/caravan/syndicate3{ +/obj/machinery/computer/shuttle_flight/caravan/syndicate3{ dir = 8 }, /obj/effect/turf_decal/tile/red{ @@ -195,9 +195,6 @@ /area/shuttle/caravan/syndicate3) "sb" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/syndicate3{ - dir = 8 - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, diff --git a/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm b/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm index c1c57680d5864..907f2c42c76cd 100644 --- a/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm +++ b/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm @@ -38,7 +38,7 @@ "qx" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/shuttle/caravan/syndicate1{ +/obj/machinery/computer/shuttle_flight/caravan/syndicate1{ dir = 8 }, /turf/open/floor/mineral/plastitanium/red, @@ -53,7 +53,6 @@ specialfunctions = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/syndicate1, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/caravan/syndicate1) "vD" = ( diff --git a/_maps/shuttles/science_outpost.dmm b/_maps/shuttles/science_outpost.dmm index a00a1901bbe26..522cd9968b04e 100644 --- a/_maps/shuttles/science_outpost.dmm +++ b/_maps/shuttles/science_outpost.dmm @@ -23,7 +23,7 @@ /turf/open/floor/plating, /area/shuttle/science) "g" = ( -/obj/machinery/computer/shuttle/science, +/obj/machinery/computer/shuttle_flight/science, /turf/open/floor/mineral/titanium/white, /area/shuttle/science) "h" = ( @@ -68,12 +68,12 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/structure/fans/tiny, /turf/open/floor/mineral/titanium/white, /area/shuttle/science) "s" = ( /obj/structure/cable/yellow, /obj/machinery/power/apc/auto_name/east, -/obj/effect/mapping_helpers/apc/discharged, /obj/structure/janitorialcart, /obj/item/mop, /turf/open/floor/mineral/titanium/purple, @@ -102,6 +102,7 @@ /obj/machinery/door/poddoor{ id = "sciencecargo" }, +/obj/structure/fans/tiny, /turf/open/floor/mineral/titanium/white, /area/shuttle/science) "I" = ( diff --git a/_maps/shuttles/snowdin_excavation.dmm b/_maps/shuttles/snowdin_excavation.dmm index 7f7b120bbe39c..16637ea2d9aa0 100644 --- a/_maps/shuttles/snowdin_excavation.dmm +++ b/_maps/shuttles/snowdin_excavation.dmm @@ -1,28 +1,9 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Elevator Access" - }, -/obj/docking_port/mobile/elevator{ - dir = 4; - height = 6; - id = "snowdin_excavation"; - name = "excavation elevator"; - width = 6 - }, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator1) "b" = ( /obj/structure/window/reinforced/fulltile/ice, /obj/structure/grille, /turf/open/floor/plating, /area/shuttle/snowdin/elevator1) -"c" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Elevator Access" - }, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator1) "d" = ( /turf/closed/wall/ice, /area/shuttle/snowdin/elevator1) @@ -30,20 +11,33 @@ /turf/open/floor/engine, /area/shuttle/snowdin/elevator1) "f" = ( -/obj/machinery/computer/shuttle/snowdin/mining{ - dir = 2; - name = "Excavation Elevator Console"; - possible_destinations = "snowdin_excavation_top;snowdin_excavation_down"; - shuttleId = "snowdin_excavation" +/obj/machinery/computer/turbolift{ + shuttle_id = "snowdin_excavation"; + time_between_stops = 50 }, /turf/open/floor/engine, /area/shuttle/snowdin/elevator1) +"N" = ( +/obj/docking_port/mobile/elevator{ + dir = 4; + height = 6; + id = "snowdin_excavation"; + name = "excavation elevator"; + width = 6 + }, +/obj/machinery/door/airlock/turbolift, +/turf/open/floor/plating, +/area/shuttle/snowdin/elevator1) +"R" = ( +/obj/machinery/door/airlock/turbolift, +/turf/open/floor/plating, +/area/shuttle/snowdin/elevator1) (1,1,1) = {" d b -c -a +R +N b d "} @@ -56,23 +50,23 @@ e b "} (3,1,1) = {" -c +R e e e e -c +R "} (4,1,1) = {" -c +R e e e e -c +R "} (5,1,1) = {" -b +d f e e @@ -82,8 +76,8 @@ b (6,1,1) = {" d b -c -c +R +R b d "} diff --git a/_maps/shuttles/snowdin_mining.dmm b/_maps/shuttles/snowdin_mining.dmm index 9e89edf3d9dde..aeae7b80b97c9 100644 --- a/_maps/shuttles/snowdin_mining.dmm +++ b/_maps/shuttles/snowdin_mining.dmm @@ -1,77 +1,73 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Elevator Access" - }, -/obj/docking_port/mobile/elevator{ - dir = 4; - dwidth = 2; - height = 5; - id = "snowdin_mining"; - name = "mining elevator"; - width = 5 - }, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator2) "b" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/snowdin/elevator2) -"c" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Elevator Access" - }, -/turf/open/floor/plating, -/area/shuttle/snowdin/elevator2) "d" = ( /turf/closed/wall, /area/shuttle/snowdin/elevator2) -"e" = ( -/obj/machinery/computer/shuttle/snowdin/mining, +"f" = ( /turf/open/floor/engine, /area/shuttle/snowdin/elevator2) -"f" = ( +"i" = ( +/obj/machinery/light/small, /turf/open/floor/engine, /area/shuttle/snowdin/elevator2) -"g" = ( +"j" = ( +/turf/closed/wall/rust, +/area/shuttle/snowdin/elevator2) +"I" = ( /obj/machinery/light/small{ dir = 1 }, +/obj/machinery/computer/turbolift{ + shuttle_id = "snowdin_mining"; + time_between_stops = 50 + }, /turf/open/floor/engine, /area/shuttle/snowdin/elevator2) -"i" = ( -/obj/machinery/light/small, -/turf/open/floor/engine, +"J" = ( +/obj/docking_port/mobile/elevator{ + dir = 4; + dwidth = 2; + height = 5; + id = "snowdin_mining"; + name = "mining elevator"; + width = 5 + }, +/obj/machinery/door/airlock/turbolift, +/turf/open/floor/plating, /area/shuttle/snowdin/elevator2) -"j" = ( -/turf/closed/wall/rust, +"R" = ( +/obj/machinery/door/airlock/turbolift, +/turf/open/floor/plating, /area/shuttle/snowdin/elevator2) (1,1,1) = {" j b -a +J b d "} (2,1,1) = {" b -e +f f i b "} (3,1,1) = {" -c +R f f f -c +R "} (4,1,1) = {" -b -g +d +I f f b @@ -79,7 +75,7 @@ b (5,1,1) = {" d b -c +R b j "} diff --git a/_maps/shuttles/tram_corg.dmm b/_maps/shuttles/tram_corg.dmm new file mode 100644 index 0000000000000..0e3fce7f4a54f --- /dev/null +++ b/_maps/shuttles/tram_corg.dmm @@ -0,0 +1,163 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"c" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/pod_1) +"e" = ( +/obj/structure/shuttle/engine/propulsion/burst, +/turf/closed/wall/mineral/titanium, +/area/shuttle/pod_1) +"h" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/pod_1) +"m" = ( +/obj/machinery/door/airlock/titanium{ + name = "Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/obj/docking_port/mobile{ + dwidth = 2; + height = 7; + id = "tram_corg"; + launch_status = 0; + name = "transport shuttle"; + preferred_direction = 2; + width = 5 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/pod_1) +"p" = ( +/turf/open/floor/mineral/titanium/white, +/area/shuttle/pod_1) +"w" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = 30 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/pod_1) +"y" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/sign/poster/random{ + pixel_x = -32 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/pod_1) +"D" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/status_display/evac{ + pixel_x = 32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/pod_1) +"E" = ( +/turf/closed/wall/mineral/titanium, +/area/template_noop) +"I" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/computer/shuttle_flight{ + possible_destinations = "corg_north;corg_south"; + shuttleId = "tram_corg" + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/pod_1) +"K" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/pod_1) +"M" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/status_display/evac{ + pixel_x = -32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/pod_1) +"S" = ( +/obj/structure/grille, +/obj/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/pod_1) +"W" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/pod_1) + +(1,1,1) = {" +E +K +S +K +S +K +e +"} +(2,1,1) = {" +S +h +p +M +c +y +K +"} +(3,1,1) = {" +S +I +p +p +p +p +m +"} +(4,1,1) = {" +S +h +p +D +W +w +K +"} +(5,1,1) = {" +E +K +S +K +S +K +e +"} diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm index 5a52e7d244427..5ca8488de1650 100644 --- a/_maps/shuttles/whiteship_box.dmm +++ b/_maps/shuttles/whiteship_box.dmm @@ -1242,7 +1242,7 @@ /area/shuttle/abandoned/bridge) "cb" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/computer/shuttle/white_ship{ +/obj/machinery/computer/shuttle_flight/white_ship{ dir = 8 }, /obj/effect/turf_decal/tile/blue{ @@ -1409,11 +1409,6 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ - dir = 8; - x_offset = -7; - y_offset = -8 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, diff --git a/_maps/shuttles/whiteship_cere.dmm b/_maps/shuttles/whiteship_cere.dmm index 310be32d5c819..aab315e86d7fa 100644 --- a/_maps/shuttles/whiteship_cere.dmm +++ b/_maps/shuttles/whiteship_cere.dmm @@ -148,7 +148,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /obj/structure/closet/crate{ - icon_state = "crateopen"; + opened = 1; name = "spare equipment crate" }, /turf/open/floor/mineral/titanium/yellow, @@ -168,7 +168,7 @@ dir = 1 }, /obj/structure/closet/crate{ - icon_state = "crateopen"; + opened = 1; name = "spare equipment crate" }, /obj/item/pickaxe, @@ -205,7 +205,7 @@ dir = 1 }, /obj/structure/closet/crate{ - icon_state = "crateopen"; + opened = 1; name = "spare equipment crate" }, /obj/item/storage/bag/ore, @@ -284,7 +284,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, /obj/structure/closet/crate{ - icon_state = "crateopen"; + opened = 1; name = "spare equipment crate" }, /obj/machinery/light, @@ -397,7 +397,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/abandoned) "ba" = ( -/obj/machinery/computer/shuttle/white_ship{ +/obj/machinery/computer/shuttle_flight/white_ship{ dir = 1 }, /obj/effect/decal/cleanable/dirt/dust, diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index b83744709cc29..c128c01b1cdda 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -1267,7 +1267,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/bridge) "ch" = ( -/obj/machinery/computer/shuttle/white_ship{ +/obj/machinery/computer/shuttle_flight/white_ship{ dir = 8 }, /obj/effect/decal/cleanable/dirt/dust, @@ -1381,11 +1381,6 @@ /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/bridge) "cp" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ - dir = 8; - x_offset = -2; - y_offset = -8 - }, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -1828,7 +1823,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/box/white/corners, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance{ lootcount = 3; @@ -2437,7 +2432,7 @@ "dX" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance{ lootcount = 3; diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index 2fbc544d9396e..4ee6da30eda4c 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -17,10 +17,7 @@ /obj/machinery/door/poddoor{ id = "whiteship_port" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "af" = ( @@ -28,10 +25,7 @@ /obj/machinery/door/poddoor{ id = "whiteship_port" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "ag" = ( @@ -43,7 +37,6 @@ /obj/docking_port/mobile{ callTime = 250; can_move_docking_ports = 1; - dheight = 0; dir = 2; dwidth = 11; height = 17; @@ -405,10 +398,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/crew) "aK" = ( @@ -426,10 +416,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/crew) "aL" = ( @@ -487,16 +474,11 @@ icon_state = "4-8" }, /obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, /obj/machinery/door/airlock/external, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "aS" = ( @@ -573,7 +555,6 @@ /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/cargo) "aV" = ( -/obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/door/airlock/external, /obj/structure/cable/yellow{ @@ -589,18 +570,13 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/crew) "aW" = ( @@ -688,7 +664,6 @@ /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/crew) "aZ" = ( -/obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/door/airlock/glass{ name = "Crew Quarters" @@ -706,18 +681,13 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/crew) "ba" = ( @@ -994,10 +964,7 @@ /obj/machinery/door/airlock{ name = "Restroom" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/shuttle/abandoned/crew) "bu" = ( @@ -1053,16 +1020,13 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/machinery/door/airlock/engineering{ name = "Engineering" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "bz" = ( @@ -1128,7 +1092,6 @@ /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/abandoned/bar) "bE" = ( -/obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/door/airlock/public/glass{ name = "Bar" @@ -1146,12 +1109,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/bar) "bF" = ( @@ -1228,7 +1188,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance{ lootcount = 3; @@ -1564,7 +1524,7 @@ /area/shuttle/abandoned/bridge) "cg" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/computer/shuttle/white_ship/pod/recall{ +/obj/machinery/computer/shuttle_flight/white_ship/pod/recall{ dir = 8 }, /obj/effect/turf_decal/tile/blue{ @@ -1759,7 +1719,6 @@ /turf/open/floor/plasteel, /area/shuttle/abandoned/bar) "cr" = ( -/obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/door/airlock/command{ name = "Bridge" @@ -1783,6 +1742,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/bridge) "cs" = ( @@ -1858,7 +1818,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/bridge) "cv" = ( -/obj/machinery/computer/shuttle/white_ship{ +/obj/machinery/computer/shuttle_flight/white_ship{ dir = 8 }, /obj/effect/decal/cleanable/dirt/dust, @@ -2034,13 +1994,6 @@ /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/bridge) "cG" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ - designate_time = 100; - dir = 8; - view_range = 14; - x_offset = -4; - y_offset = -8 - }, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -2243,7 +2196,6 @@ /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/cargo) "cT" = ( -/obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/door/airlock/public/glass{ @@ -2262,10 +2214,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/bar) "cU" = ( @@ -2577,18 +2526,13 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "du" = ( @@ -2639,7 +2583,6 @@ /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/cargo) "dw" = ( -/obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/door/airlock/external, /obj/structure/cable/yellow{ @@ -2655,18 +2598,13 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/bar) "dx" = ( @@ -2749,7 +2687,6 @@ /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/bar) "dA" = ( -/obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/door/airlock/glass{ name = "Kitchen" @@ -2764,18 +2701,13 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/shuttle/abandoned/bar) "dB" = ( @@ -2798,23 +2730,17 @@ /turf/open/floor/plasteel/cafeteria, /area/shuttle/abandoned/bar) "dD" = ( -/obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/door/airlock/glass{ name = "Hydroponics" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/shuttle/abandoned/bar) "dE" = ( @@ -2927,7 +2853,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, /obj/structure/closet/crate{ - icon_state = "crateopen" + opened = 1 }, /obj/effect/spawner/lootdrop/maintenance{ lootcount = 3; @@ -3184,10 +3110,7 @@ /obj/machinery/door/poddoor{ id = "whiteship_starboard" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "ei" = ( @@ -3196,10 +3119,7 @@ /obj/machinery/door/poddoor{ id = "whiteship_starboard" }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "ej" = ( @@ -3373,12 +3293,9 @@ /obj/machinery/door/airlock/engineering{ name = "Engineering" }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "wM" = ( diff --git a/_maps/shuttles/whiteship_pubby.dmm b/_maps/shuttles/whiteship_pubby.dmm index 11214ef26077a..02a7676be5eb0 100644 --- a/_maps/shuttles/whiteship_pubby.dmm +++ b/_maps/shuttles/whiteship_pubby.dmm @@ -71,7 +71,7 @@ /turf/open/floor/plating/abductor, /area/shuttle/abandoned) "m" = ( -/obj/machinery/computer/shuttle/white_ship, +/obj/machinery/computer/shuttle_flight/white_ship, /turf/open/floor/plating/abductor, /area/shuttle/abandoned) "n" = ( diff --git a/_maps/templates/holodeck_asylum.dmm b/_maps/templates/holodeck_asylum.dmm new file mode 100644 index 0000000000000..db80f075f8548 --- /dev/null +++ b/_maps/templates/holodeck_asylum.dmm @@ -0,0 +1,515 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/holodeck_effect/mobspawner/psycho, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"b" = ( +/obj/machinery/door/window{ + dir = 2 + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"c" = ( +/obj/structure/window{ + dir = 1 + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"d" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/structure/window{ + dir = 8 + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"e" = ( +/obj/structure/window, +/obj/structure/window{ + dir = 8 + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"f" = ( +/obj/structure/window, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"g" = ( +/obj/structure/bed, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"h" = ( +/obj/structure/toilet, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"i" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/holofloor/white, +/area/template_noop) +"j" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/holofloor/white, +/area/template_noop) +"k" = ( +/turf/open/floor/holofloor/white, +/area/template_noop) +"l" = ( +/obj/machinery/igniter, +/obj/effect/holodeck_effect/mobspawner/psycho, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"m" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"n" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"o" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"p" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/structure/curtain, +/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/holofloor/white, +/area/template_noop) +"q" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/structure/table, +/obj/item/bedsheet, +/obj/item/screwdriver, +/obj/item/wirecutters, +/obj/item/hatchet, +/obj/item/lighter, +/obj/item/healthanalyzer, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/holofloor/white, +/area/template_noop) +"r" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/holofloor/white, +/area/template_noop) +"s" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/vomit, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"t" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"u" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/structure/table, +/obj/item/clothing/suit/straight_jacket, +/obj/item/assembly/flash, +/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/holofloor/white, +/area/template_noop) +"v" = ( +/obj/structure/window, +/obj/effect/decal/cleanable/vomit, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"w" = ( +/obj/structure/table/glass, +/obj/item/clothing/glasses/blindfold, +/obj/item/clothing/glasses/blindfold, +/obj/item/clothing/glasses/blindfold, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/holofloor/white, +/area/template_noop) +"x" = ( +/obj/structure/curtain, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/holofloor/white, +/area/template_noop) +"y" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/holofloor/white, +/area/template_noop) +"z" = ( +/obj/structure/table/glass, +/obj/item/clothing/mask/muzzle, +/obj/item/clothing/mask/muzzle, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/holofloor/white, +/area/template_noop) +"A" = ( +/obj/structure/window, +/obj/structure/curtain, +/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/holofloor/white, +/area/template_noop) +"B" = ( +/obj/structure/window, +/obj/structure/table/optable, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/holofloor/white, +/area/template_noop) +"C" = ( +/obj/structure/window{ + dir = 8 + }, +/obj/structure/toilet, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"D" = ( +/obj/structure/window, +/obj/machinery/computer/operating{ + dir = 8 + }, +/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/holofloor/white, +/area/template_noop) +"E" = ( +/obj/machinery/door/window{ + dir = 2 + }, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"F" = ( +/obj/structure/window{ + dir = 8 + }, +/obj/structure/toilet{ + dir = 1 + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"G" = ( +/obj/machinery/door/window{ + dir = 1 + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"H" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/glass/beaker, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/holofloor/white, +/area/template_noop) +"I" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"J" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"K" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/structure/window{ + dir = 8 + }, +/obj/effect/decal/cleanable/vomit, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"L" = ( +/obj/structure/toilet{ + dir = 1 + }, +/obj/effect/decal/cleanable/vomit, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"M" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"N" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"O" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/holofloor/white, +/area/template_noop) +"P" = ( +/obj/machinery/door/window/brigdoor, +/obj/effect/turf_decal/tile/red, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"Q" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12 + }, +/turf/open/floor/holofloor/white, +/area/template_noop) +"R" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/holofloor/white, +/area/template_noop) +"S" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/door/window/brigdoor, +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/floor/holofloor/white, +/area/template_noop) +"T" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/holofloor/white, +/area/template_noop) +"U" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/holofloor/white, +/area/template_noop) +"V" = ( +/obj/machinery/door/window{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"W" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/holofloor/dark, +/area/template_noop) + +(1,1,1) = {" +h +f +i +r +r +r +k +R +c +L +"} +(2,1,1) = {" +a +b +i +p +x +A +k +R +G +a +"} +(3,1,1) = {" +g +v +j +q +r +B +O +R +c +M +"} +(4,1,1) = {" +C +e +i +u +y +D +O +R +d +F +"} +(5,1,1) = {" +a +E +i +m +t +I +k +T +V +W +"} +(6,1,1) = {" +g +f +j +n +l +P +S +U +c +g +"} +(7,1,1) = {" +C +e +j +o +J +N +Q +T +K +F +"} +(8,1,1) = {" +a +E +i +w +z +H +O +R +G +a +"} +(9,1,1) = {" +s +f +i +k +r +k +k +R +c +g +"} diff --git a/_maps/templates/holodeck_clownworld.dmm b/_maps/templates/holodeck_clownworld.dmm new file mode 100644 index 0000000000000..1c41c9c7dfc99 --- /dev/null +++ b/_maps/templates/holodeck_clownworld.dmm @@ -0,0 +1,142 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor/dark, +/area/template_noop) +"b" = ( +/turf/open/floor/holofloor/snow{ + color = "#FF9900" + }, +/area/template_noop) +"c" = ( +/obj/effect/holodeck_effect/mobspawner/clown, +/turf/open/floor/holofloor/snow, +/area/template_noop) +"d" = ( +/turf/open/floor/holofloor/snow, +/area/template_noop) +"e" = ( +/turf/open/floor/holofloor/clown, +/area/template_noop) +"f" = ( +/obj/effect/holodeck_effect/mobspawner/clown, +/turf/open/floor/holofloor/clown, +/area/template_noop) +"g" = ( +/turf/open/floor/holofloor/snow{ + color = "#000000" + }, +/area/template_noop) +"h" = ( +/turf/open/floor/holofloor/snow{ + color = "#FF0000" + }, +/area/template_noop) + +(1,1,1) = {" +a +b +b +a +a +a +a +a +h +a +"} +(2,1,1) = {" +b +b +b +b +a +a +d +d +d +h +"} +(3,1,1) = {" +b +c +d +d +e +f +d +g +c +d +"} +(4,1,1) = {" +a +d +d +g +h +h +e +d +g +d +"} +(5,1,1) = {" +a +e +f +e +h +h +e +c +g +d +"} +(6,1,1) = {" +a +d +d +g +h +h +e +d +g +d +"} +(7,1,1) = {" +b +c +d +d +e +f +d +g +c +d +"} +(8,1,1) = {" +b +b +b +b +a +a +d +d +d +h +"} +(9,1,1) = {" +a +b +b +a +a +a +a +a +h +a +"} diff --git a/_maps/templates/holodeck_kitchen.dmm b/_maps/templates/holodeck_kitchen.dmm new file mode 100644 index 0000000000000..e895fbc6af38b --- /dev/null +++ b/_maps/templates/holodeck_kitchen.dmm @@ -0,0 +1,214 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"b" = ( +/turf/open/floor/holofloor/white, +/area/template_noop) +"c" = ( +/obj/structure/table/reinforced, +/obj/item/trash/plate, +/turf/open/floor/holofloor/white, +/area/template_noop) +"d" = ( +/obj/machinery/door/window{ + dir = 1 + }, +/turf/open/floor/holofloor/white, +/area/template_noop) +"e" = ( +/obj/machinery/door/window, +/turf/open/floor/holofloor/white, +/area/template_noop) +"f" = ( +/obj/structure/table/reinforced, +/obj/structure/window{ + dir = 1 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + list_reagents = list() + }, +/turf/open/floor/holofloor/white, +/area/template_noop) +"g" = ( +/obj/structure/table/reinforced, +/obj/structure/window, +/turf/open/floor/holofloor/white, +/area/template_noop) +"h" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"i" = ( +/obj/structure/table/reinforced, +/obj/structure/window{ + dir = 1 + }, +/obj/machinery/microwave, +/turf/open/floor/holofloor/white, +/area/template_noop) +"j" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"k" = ( +/obj/structure/table/wood, +/obj/item/trash/plate, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"l" = ( +/obj/machinery/chem_master/condimaster, +/turf/open/floor/holofloor/white, +/area/template_noop) +"m" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/turf/open/floor/holofloor/white, +/area/template_noop) +"n" = ( +/obj/structure/window, +/obj/structure/closet/crate/freezer, +/turf/open/floor/holofloor/white, +/area/template_noop) +"o" = ( +/obj/structure/chair/stool, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"p" = ( +/obj/structure/window, +/obj/structure/rack, +/obj/item/clothing/head/chefhat, +/obj/item/clothing/head/chefhat, +/obj/item/clothing/suit/apron/chef, +/obj/item/clothing/suit/apron/chef, +/obj/item/storage/bag/tray, +/turf/open/floor/holofloor/white, +/area/template_noop) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +h +a +a +o +o +o +o +a +a +h +"} +(3,1,1) = {" +k +a +f +c +c +c +c +g +a +k +"} +(4,1,1) = {" +j +a +i +b +b +b +b +n +a +j +"} +(5,1,1) = {" +a +a +d +b +l +m +b +e +a +a +"} +(6,1,1) = {" +h +a +i +b +b +b +b +p +a +h +"} +(7,1,1) = {" +k +a +f +c +c +c +c +g +a +k +"} +(8,1,1) = {" +j +a +a +o +o +o +o +a +a +j +"} +(9,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/templates/holodeck_teahouse.dmm b/_maps/templates/holodeck_teahouse.dmm new file mode 100644 index 0000000000000..440e69bd907e7 --- /dev/null +++ b/_maps/templates/holodeck_teahouse.dmm @@ -0,0 +1,232 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"b" = ( +/turf/open/floor/holofloor/grass, +/area/template_noop) +"c" = ( +/obj/structure/mineral_door/paperframe, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"d" = ( +/obj/structure/window/paperframe, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"e" = ( +/obj/structure/table/wood, +/obj/effect/holodeck_effect/random_book, +/obj/effect/holodeck_effect/random_book, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"f" = ( +/turf/open/floor/holofloor/carpet, +/area/template_noop) +"g" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + icon_state = "sakecup"; + pixel_x = -8; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + icon_state = "sakecup"; + pixel_x = 8; + pixel_y = 3 + }, +/obj/item/candle{ + pixel_y = 10 + }, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"h" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lantern, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"i" = ( +/obj/structure/flora/bush, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"j" = ( +/obj/structure/flora/ausbushes/ywflowers, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"k" = ( +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"l" = ( +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"m" = ( +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"n" = ( +/obj/structure/bed/dogbed, +/obj/effect/holodeck_effect/mobspawner/cat, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"o" = ( +/obj/structure/table/wood, +/obj/item/instrument/violin, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"p" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/mug, +/obj/item/reagent_containers/food/drinks/mug, +/obj/item/reagent_containers/food/drinks/mug, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) +"q" = ( +/obj/effect/holodeck_effect/mobspawner/butterfly, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"r" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/effect/holodeck_effect/mobspawner/butterfly, +/turf/open/floor/holofloor/grass, +/area/template_noop) +"s" = ( +/obj/item/toy/cattoy, +/turf/open/floor/holofloor{ + dir = 9; + icon_state = "wood" + }, +/area/template_noop) + +(1,1,1) = {" +d +d +d +c +d +d +c +d +d +d +"} +(2,1,1) = {" +d +f +a +a +e +o +a +a +f +d +"} +(3,1,1) = {" +d +g +a +a +a +a +a +a +g +d +"} +(4,1,1) = {" +d +f +a +f +a +s +a +a +f +d +"} +(5,1,1) = {" +d +n +a +g +a +d +d +c +d +d +"} +(6,1,1) = {" +d +f +a +f +a +d +h +k +j +j +"} +(7,1,1) = {" +d +g +a +a +a +c +k +b +r +m +"} +(8,1,1) = {" +d +f +a +a +p +d +j +q +l +b +"} +(9,1,1) = {" +d +d +d +c +d +d +j +m +k +i +"} diff --git a/_maps/templates/shelter_2.dmm b/_maps/templates/shelter_2.dmm index 5d71141c8a3b4..082e8947d5953 100644 --- a/_maps/templates/shelter_2.dmm +++ b/_maps/templates/shelter_2.dmm @@ -97,7 +97,7 @@ /area/survivalpod) "q" = ( /obj/structure/tubes, -/obj/item/twohanded/required/kirbyplants/random, +/obj/item/kirbyplants/random, /turf/open/floor/pod, /area/survivalpod) "r" = ( diff --git a/_maps/templates/shelter_4.dmm b/_maps/templates/shelter_4.dmm index 1f00bba7aa798..c7f6bca6556dc 100644 --- a/_maps/templates/shelter_4.dmm +++ b/_maps/templates/shelter_4.dmm @@ -65,7 +65,7 @@ /turf/open/floor/pod/dark, /area/survivalpod) "aq" = ( -/obj/machinery/mineral/equipment_vendor, +/obj/machinery/vendor/mining, /turf/open/floor/pod/dark, /area/survivalpod) "ar" = ( diff --git a/_maps/templates/the_arena.dmm b/_maps/templates/the_arena.dmm new file mode 100644 index 0000000000000..acf086c041f8c --- /dev/null +++ b/_maps/templates/the_arena.dmm @@ -0,0 +1,2622 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/necropolis, +/area/shuttle_arena) +"b" = ( +/turf/open/indestructible/necropolis/air, +/area/shuttle_arena) +"c" = ( +/obj/effect/forcefield/arena_shuttle, +/turf/open/indestructible/necropolis/air, +/area/shuttle_arena) +"d" = ( +/turf/open/lava/smooth, +/area/shuttle_arena) +"e" = ( +/obj/effect/landmark/shuttle_arena_entrance, +/turf/open/indestructible/necropolis/air, +/area/shuttle_arena) +"f" = ( +/turf/template_noop, +/area/template_noop) + +(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 +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +"} +(2,1,1) = {" +a +b +b +b +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +"} +(3,1,1) = {" +a +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 +a +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +"} +(4,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +e +b +b +b +b +b +b +b +b +b +b +b +b +e +b +a +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +"} +(5,1,1) = {" +a +b +e +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +b +b +b +b +b +b +b +b +a +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +"} +(6,1,1) = {" +a +a +b +b +a +b +b +b +b +b +b +b +b +b +b +b +b +a +b +b +b +b +b +b +b +b +a +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +"} +(7,1,1) = {" +a +b +b +b +b +b +b +b +b +a +b +d +d +d +b +b +b +a +a +b +b +e +b +b +b +b +a +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +"} +(8,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +d +d +d +d +b +b +b +b +b +b +b +b +b +b +b +a +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +"} +(9,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +d +d +d +d +d +b +b +b +b +b +b +b +b +b +b +a +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +"} +(10,1,1) = {" +a +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 +a +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +"} +(11,1,1) = {" +a +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 +a +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +"} +(12,1,1) = {" +a +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 +a +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +f +"} +(13,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +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 +"} +(14,1,1) = {" +a +b +b +b +b +b +a +b +b +b +e +b +b +a +b +b +b +b +b +b +b +b +b +b +d +d +d +b +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(15,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +a +b +b +b +b +b +b +b +b +b +b +d +d +b +b +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(16,1,1) = {" +a +b +e +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +d +d +d +d +b +b +a +b +b +b +b +b +b +b +b +e +b +b +b +b +b +b +b +b +b +b +b +a +"} +(17,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +e +b +b +b +b +b +d +d +b +b +b +b +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(18,1,1) = {" +a +a +a +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(19,1,1) = {" +a +a +a +a +a +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 +b +b +b +b +a +"} +(20,1,1) = {" +a +a +a +a +a +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 +a +b +b +a +a +b +b +b +a +"} +(21,1,1) = {" +a +c +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 +d +d +b +b +b +b +a +b +b +b +a +b +b +b +a +"} +(22,1,1) = {" +a +c +b +b +b +b +b +b +b +b +d +d +b +b +b +b +b +b +b +d +d +b +b +b +b +b +b +b +b +b +b +b +b +b +d +d +b +b +b +b +b +a +b +b +b +a +b +b +b +a +"} +(23,1,1) = {" +a +c +b +b +b +b +b +b +b +b +d +d +d +b +b +b +b +b +b +d +d +b +b +b +b +b +b +b +e +b +b +b +b +b +d +b +b +b +b +b +b +a +b +e +b +a +b +b +b +a +"} +(24,1,1) = {" +a +c +b +b +b +b +b +b +b +b +b +b +d +d +b +b +b +b +b +d +d +b +b +b +b +b +b +b +b +b +b +b +b +b +d +b +b +b +b +b +b +a +b +b +b +a +b +b +b +a +"} +(25,1,1) = {" +a +a +a +a +a +b +b +b +b +b +b +b +b +d +b +b +b +b +b +d +d +b +b +b +b +b +b +b +b +b +b +b +b +b +d +b +b +b +b +b +b +a +a +a +a +a +b +b +b +a +"} +(26,1,1) = {" +a +a +a +a +a +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 +d +d +d +b +b +b +b +b +b +b +b +b +b +b +b +e +a +"} +(27,1,1) = {" +a +a +a +a +b +b +b +b +e +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +a +b +b +b +b +b +b +d +d +d +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(28,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +a +b +b +b +b +b +b +d +d +d +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(29,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(30,1,1) = {" +a +b +b +b +b +b +b +b +a +b +b +b +b +b +b +b +b +b +b +a +a +a +a +a +a +a +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(31,1,1) = {" +a +b +b +b +b +b +b +b +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(32,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +e +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +e +b +b +b +b +b +b +b +b +b +a +"} +(33,1,1) = {" +a +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 +e +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(34,1,1) = {" +a +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 +b +b +b +b +b +b +b +b +a +"} +(35,1,1) = {" +a +b +b +e +b +b +b +b +b +b +b +b +a +a +a +a +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +a +a +a +a +a +a +a +b +b +b +b +b +b +a +"} +(36,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +a +a +a +a +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +b +b +b +b +b +b +b +b +a +"} +(37,1,1) = {" +a +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 +a +b +b +a +b +b +b +b +b +b +b +b +a +"} +(38,1,1) = {" +a +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 +a +b +e +a +b +b +b +b +b +b +b +b +a +"} +(39,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +e +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +a +a +a +b +b +b +b +b +b +b +b +a +"} +(40,1,1) = {" +a +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 +a +b +b +b +b +b +b +b +b +a +"} +(41,1,1) = {" +a +b +b +b +a +a +a +a +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +d +d +d +d +d +b +b +b +b +b +a +b +b +b +b +b +b +b +e +a +"} +(42,1,1) = {" +a +b +b +b +b +b +b +b +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +d +d +d +d +d +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(43,1,1) = {" +a +b +b +b +b +b +b +b +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +d +d +d +d +d +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(44,1,1) = {" +a +b +b +b +b +b +b +b +a +b +b +b +b +b +b +b +e +b +b +b +b +b +b +b +b +b +a +a +a +a +d +d +d +d +d +b +b +b +b +b +b +b +b +b +b +b +a +b +b +a +"} +(45,1,1) = {" +a +b +b +b +b +e +b +b +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +e +b +b +d +d +d +d +d +b +b +b +b +b +b +b +b +b +b +b +a +b +b +a +"} +(46,1,1) = {" +a +b +b +b +b +b +b +b +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +d +d +d +d +d +d +d +d +b +b +b +b +b +b +b +b +a +b +b +a +"} +(47,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +b +b +b +b +b +e +b +b +b +b +b +a +"} +(48,1,1) = {" +a +d +d +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +b +b +b +b +b +b +b +b +b +a +"} +(49,1,1) = {" +a +d +d +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +b +b +b +b +b +b +b +b +b +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 +"} diff --git a/_maps/templates/warped_room.dmm b/_maps/templates/warped_room.dmm new file mode 100644 index 0000000000000..6efe813cf026f --- /dev/null +++ b/_maps/templates/warped_room.dmm @@ -0,0 +1,363 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/hotelwall, +/area/warped_room) +"b" = ( +/turf/open/indestructible/hotelwood, +/area/warped_room) +"c" = ( +/obj/structure/table/wood, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"d" = ( +/obj/machinery/door/window/northleft, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"e" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"f" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"g" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"h" = ( +/obj/structure/table/wood, +/obj/effect/spawner/lootdrop/three_course_meal, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"i" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"j" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"k" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/under/color/random, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"l" = ( +/obj/machinery/light, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"m" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"n" = ( +/obj/machinery/computer/arcade/orion_trail, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"o" = ( +/obj/structure/chair/wood, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"p" = ( +/obj/structure/table/wood, +/obj/machinery/microwave, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"q" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"r" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/bottle, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"s" = ( +/obj/machinery/processor, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"t" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"u" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/soda_cans/cola, +/obj/item/kitchen/knife, +/obj/item/kitchen/rollingpin, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"v" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"w" = ( +/obj/structure/table/wood, +/obj/item/toy/plush/narplush, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"x" = ( +/obj/structure/table/wood, +/obj/item/toy/plush/plushvar, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"y" = ( +/obj/structure/table/wood, +/obj/item/paper, +/obj/item/pen, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"z" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"A" = ( +/obj/machinery/vending/cola/random, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"B" = ( +/obj/machinery/vending/snack/random, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"C" = ( +/obj/machinery/computer/arcade/battle, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"D" = ( +/obj/structure/chair/stool, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"E" = ( +/obj/machinery/door/airlock/wood, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"F" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hoteltile, +/area/warped_room) +"G" = ( +/obj/machinery/door/airlock/wood, +/turf/open/indestructible/hoteltile, +/area/warped_room) +"H" = ( +/obj/structure/closet/secure_closet/freezer/kitchen{ + locked = 0 + }, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"I" = ( +/obj/structure/table/wood, +/obj/item/storage/pill_bottle/dice, +/turf/open/indestructible/hotelwood, +/area/warped_room) +"K" = ( +/obj/structure/sign/departments/restroom, +/turf/closed/indestructible/hotelwall, +/area/warped_room) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +w +m +b +j +b +h +q +H +a +"} +(3,1,1) = {" +a +e +b +b +b +b +p +b +s +a +"} +(4,1,1) = {" +a +b +b +b +b +b +d +b +t +a +"} +(5,1,1) = {" +a +g +b +b +b +b +z +r +u +a +"} +(6,1,1) = {" +a +a +E +a +b +b +b +b +l +a +"} +(7,1,1) = {" +a +b +b +a +b +b +b +b +b +a +"} +(8,1,1) = {" +a +g +b +a +b +o +y +x +m +a +"} +(9,1,1) = {" +a +k +f +a +b +o +c +c +m +a +"} +(10,1,1) = {" +a +a +a +a +b +b +b +b +b +a +"} +(11,1,1) = {" +a +n +D +b +b +b +b +b +l +a +"} +(12,1,1) = {" +a +A +b +b +b +b +b +b +b +a +"} +(13,1,1) = {" +a +B +b +b +b +b +i +K +G +a +"} +(14,1,1) = {" +a +C +D +b +v +o +I +a +F +a +"} +(15,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index c9decee83462c..0000000000000 --- a/appveyor.yml +++ /dev/null @@ -1,15 +0,0 @@ -version: '{build}' -skip_branch_with_pr: true -shallow_clone: true -branches: - except: - - ___TGS3TempBranch - - ___TGSTempBranch -cache: - - C:\byond\ -> dependencies.sh -build_script: - - ps: tools/appveyor/build.ps1 - - ps: "$deployPath = $env:APPVEYOR_BUILD_FOLDER + '/deploy'; bash tools/deploy.sh $deployPath" - - ps: "[System.IO.Compression.ZipFile]::CreateFromDirectory($env:APPVEYOR_BUILD_FOLDER + '/deploy', $env:APPVEYOR_BUILD_FOLDER + '/deploy.zip')" -artifacts: - - path: deploy.zip diff --git a/auxtools/auxmos.dll b/auxtools/auxmos.dll new file mode 100644 index 0000000000000..49d6d5e5f5e35 Binary files /dev/null and b/auxtools/auxmos.dll differ diff --git a/beestation.dme b/beestation.dme index 3be9ad46771a1..f41057a4ed77f 100644 --- a/beestation.dme +++ b/beestation.dme @@ -18,13 +18,22 @@ #include "code\world.dm" #include "code\__DEFINES\_globals.dm" #include "code\__DEFINES\_helpers.dm" +#include "code\__DEFINES\_mob_properties.dm" +#include "code\__DEFINES\_profile.dm" #include "code\__DEFINES\_protect.dm" #include "code\__DEFINES\_tick.dm" #include "code\__DEFINES\access.dm" +#include "code\__DEFINES\actionspeed_modification.dm" #include "code\__DEFINES\admin.dm" +#include "code\__DEFINES\ai.dm" #include "code\__DEFINES\antagonists.dm" +#include "code\__DEFINES\aquarium.dm" +#include "code\__DEFINES\areas.dm" +#include "code\__DEFINES\art.dm" #include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\atom_hud.dm" +#include "code\__DEFINES\balloon_alert.dm" +#include "code\__DEFINES\bitfields.dm" #include "code\__DEFINES\callbacks.dm" #include "code\__DEFINES\cargo.dm" #include "code\__DEFINES\chat.dm" @@ -33,15 +42,17 @@ #include "code\__DEFINES\clockcult.dm" #include "code\__DEFINES\colors.dm" #include "code\__DEFINES\combat.dm" -#include "code\__DEFINES\components.dm" #include "code\__DEFINES\configuration.dm" #include "code\__DEFINES\construction.dm" #include "code\__DEFINES\contracts.dm" +#include "code\__DEFINES\cooldowns.dm" #include "code\__DEFINES\cult.dm" #include "code\__DEFINES\diseases.dm" #include "code\__DEFINES\DNA.dm" +#include "code\__DEFINES\dynamic.dm" #include "code\__DEFINES\economy.dm" #include "code\__DEFINES\events.dm" +#include "code\__DEFINES\exosuit_fab.dm" #include "code\__DEFINES\exports.dm" #include "code\__DEFINES\fastdmm2.dm" #include "code\__DEFINES\flags.dm" @@ -49,7 +60,8 @@ #include "code\__DEFINES\footsteps.dm" #include "code\__DEFINES\forensics.dm" #include "code\__DEFINES\hud.dm" -#include "code\__DEFINES\integrated_electronics.dm" +#include "code\__DEFINES\important_recursive_contents.dm" +#include "code\__DEFINES\instruments.dm" #include "code\__DEFINES\interaction_flags.dm" #include "code\__DEFINES\inventory.dm" #include "code\__DEFINES\is_helpers.dm" @@ -74,9 +86,11 @@ #include "code\__DEFINES\monkeys.dm" #include "code\__DEFINES\move_force.dm" #include "code\__DEFINES\movespeed_modification.dm" +#include "code\__DEFINES\multi_z.dm" #include "code\__DEFINES\nanites.dm" #include "code\__DEFINES\networks.dm" #include "code\__DEFINES\obj_flags.dm" +#include "code\__DEFINES\orbit_defines.dm" #include "code\__DEFINES\pinpointers.dm" #include "code\__DEFINES\pipe_construction.dm" #include "code\__DEFINES\plumbing.dm" @@ -99,9 +113,12 @@ #include "code\__DEFINES\sound.dm" #include "code\__DEFINES\spaceman_dmm.dm" #include "code\__DEFINES\stat.dm" +#include "code\__DEFINES\stat_panel.dm" #include "code\__DEFINES\stat_tracking.dm" +#include "code\__DEFINES\station.dm" #include "code\__DEFINES\status_effects.dm" #include "code\__DEFINES\subsystems.dm" +#include "code\__DEFINES\text.dm" #include "code\__DEFINES\tgs.config.dm" #include "code\__DEFINES\tgs.dm" #include "code\__DEFINES\tgui.dm" @@ -113,16 +130,21 @@ #include "code\__DEFINES\vehicles.dm" #include "code\__DEFINES\vv.dm" #include "code\__DEFINES\wall_dents.dm" +#include "code\__DEFINES\wiremod.dm" #include "code\__DEFINES\wires.dm" +#include "code\__DEFINES\dcs\flags.dm" +#include "code\__DEFINES\dcs\helpers.dm" +#include "code\__DEFINES\dcs\signals.dm" +#include "code\__HELPERS\_extools_api.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm" #include "code\__HELPERS\areas.dm" -#include "code\__HELPERS\AStar.dm" #include "code\__HELPERS\cmp.dm" #include "code\__HELPERS\dates.dm" #include "code\__HELPERS\dna.dm" #include "code\__HELPERS\files.dm" +#include "code\__HELPERS\filters.dm" #include "code\__HELPERS\game.dm" #include "code\__HELPERS\global_lists.dm" #include "code\__HELPERS\heap.dm" @@ -133,6 +155,7 @@ #include "code\__HELPERS\mobs.dm" #include "code\__HELPERS\mouse_control.dm" #include "code\__HELPERS\names.dm" +#include "code\__HELPERS\path.dm" #include "code\__HELPERS\patrons.dm" #include "code\__HELPERS\priority_announce.dm" #include "code\__HELPERS\pronouns.dm" @@ -143,6 +166,7 @@ #include "code\__HELPERS\roundend.dm" #include "code\__HELPERS\sanitize_values.dm" #include "code\__HELPERS\shell.dm" +#include "code\__HELPERS\stat_helpers.dm" #include "code\__HELPERS\stat_tracking.dm" #include "code\__HELPERS\text.dm" #include "code\__HELPERS\time.dm" @@ -151,6 +175,8 @@ #include "code\__HELPERS\typelists.dm" #include "code\__HELPERS\unsorted.dm" #include "code\__HELPERS\view.dm" +#include "code\__HELPERS\virtual_z_level.dm" +#include "code\__HELPERS\weakref.dm" #include "code\__HELPERS\sorts\__main.dm" #include "code\__HELPERS\sorts\InsertSort.dm" #include "code\__HELPERS\sorts\MergeSort.dm" @@ -162,6 +188,9 @@ #include "code\_globalvars\logging.dm" #include "code\_globalvars\misc.dm" #include "code\_globalvars\regexes.dm" +#include "code\_globalvars\religion.dm" +#include "code\_globalvars\traits.dm" +#include "code\_globalvars\lists\ambience.dm" #include "code\_globalvars\lists\client.dm" #include "code\_globalvars\lists\flavor_misc.dm" #include "code\_globalvars\lists\maintenance_loot.dm" @@ -211,6 +240,7 @@ #include "code\_onclick\hud\parallax.dm" #include "code\_onclick\hud\picture_in_picture.dm" #include "code\_onclick\hud\plane_master.dm" +#include "code\_onclick\hud\plane_master_controller.dm" #include "code\_onclick\hud\radial.dm" #include "code\_onclick\hud\radial_persistent.dm" #include "code\_onclick\hud\revenanthud.dm" @@ -229,6 +259,7 @@ #include "code\controllers\configuration\entries\comms.dm" #include "code\controllers\configuration\entries\dbconfig.dm" #include "code\controllers\configuration\entries\game_options.dm" +#include "code\controllers\configuration\entries\game_tweaks.dm" #include "code\controllers\configuration\entries\general.dm" #include "code\controllers\configuration\entries\resources.dm" #include "code\controllers\subsystem\acid.dm" @@ -240,13 +271,16 @@ #include "code\controllers\subsystem\augury.dm" #include "code\controllers\subsystem\autotransfer.dm" #include "code\controllers\subsystem\blackbox.dm" +#include "code\controllers\subsystem\callback.dm" #include "code\controllers\subsystem\chat.dm" #include "code\controllers\subsystem\communications.dm" #include "code\controllers\subsystem\dbcore.dm" #include "code\controllers\subsystem\dcs.dm" +#include "code\controllers\subsystem\delay_component.dm" #include "code\controllers\subsystem\disease.dm" #include "code\controllers\subsystem\economy.dm" #include "code\controllers\subsystem\events.dm" +#include "code\controllers\subsystem\explosion.dm" #include "code\controllers\subsystem\fail2topic.dm" #include "code\controllers\subsystem\fire_burning.dm" #include "code\controllers\subsystem\garbage.dm" @@ -261,6 +295,7 @@ #include "code\controllers\subsystem\mapping.dm" #include "code\controllers\subsystem\materials.dm" #include "code\controllers\subsystem\medals.dm" +#include "code\controllers\subsystem\metrics.dm" #include "code\controllers\subsystem\minor_mapping.dm" #include "code\controllers\subsystem\mobs.dm" #include "code\controllers\subsystem\moods.dm" @@ -275,9 +310,14 @@ #include "code\controllers\subsystem\radiation.dm" #include "code\controllers\subsystem\radio.dm" #include "code\controllers\subsystem\research.dm" +#include "code\controllers\subsystem\runechat.dm" #include "code\controllers\subsystem\server_maint.dm" #include "code\controllers\subsystem\shuttle.dm" +#include "code\controllers\subsystem\sound.dm" +#include "code\controllers\subsystem\sound_loops.dm" +#include "code\controllers\subsystem\sounds.dm" #include "code\controllers\subsystem\spacedrift.dm" +#include "code\controllers\subsystem\stat.dm" #include "code\controllers\subsystem\stickyban.dm" #include "code\controllers\subsystem\sun.dm" #include "code\controllers\subsystem\tgui.dm" @@ -286,20 +326,29 @@ #include "code\controllers\subsystem\time_track.dm" #include "code\controllers\subsystem\timer.dm" #include "code\controllers\subsystem\title.dm" +#include "code\controllers\subsystem\topic.dm" #include "code\controllers\subsystem\traumas.dm" #include "code\controllers\subsystem\vis_overlays.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" -#include "code\controllers\subsystem\processing\circuit.dm" +#include "code\controllers\subsystem\zclear.dm" +#include "code\controllers\subsystem\processing\ai_basic_avoidance.dm" +#include "code\controllers\subsystem\processing\ai_behaviors.dm" +#include "code\controllers\subsystem\processing\ai_controllers.dm" +#include "code\controllers\subsystem\processing\ai_movement.dm" +#include "code\controllers\subsystem\processing\clock_component.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" #include "code\controllers\subsystem\processing\fields.dm" #include "code\controllers\subsystem\processing\fluids.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" +#include "code\controllers\subsystem\processing\orbits.dm" #include "code\controllers\subsystem\processing\processing.dm" #include "code\controllers\subsystem\processing\projectiles.dm" #include "code\controllers\subsystem\processing\quirks.dm" +#include "code\controllers\subsystem\processing\station.dm" #include "code\controllers\subsystem\processing\wet_floors.dm" #include "code\datums\action.dm" #include "code\datums\ai_laws.dm" @@ -307,6 +356,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" @@ -315,16 +365,15 @@ #include "code\datums\dna.dm" #include "code\datums\dog_fashion.dm" #include "code\datums\ductnet.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\http.dm" #include "code\datums\hud.dm" #include "code\datums\map_config.dm" #include "code\datums\mind.dm" +#include "code\datums\movement_detector.dm" #include "code\datums\mutable_appearance.dm" #include "code\datums\mutations.dm" #include "code\datums\numbered_display.dm" @@ -338,15 +387,36 @@ #include "code\datums\saymode.dm" #include "code\datums\shuttles.dm" #include "code\datums\soullink.dm" +#include "code\datums\soundtrack.dm" #include "code\datums\spawners_menu.dm" -#include "code\datums\verbs.dm" +#include "code\datums\tgs_event_handler.dm" #include "code\datums\view.dm" #include "code\datums\weakrefs.dm" #include "code\datums\world_topic.dm" #include "code\datums\actions\beam_rifle.dm" #include "code\datums\actions\ninja.dm" +#include "code\datums\ai\_ai_behavior.dm" +#include "code\datums\ai\_ai_controller.dm" +#include "code\datums\ai\_ai_planning_subtree.dm" +#include "code\datums\ai\_item_behaviors.dm" +#include "code\datums\ai\generic_actions.dm" +#include "code\datums\ai\telegraph_effects.dm" +#include "code\datums\ai\dog\dog_behaviors.dm" +#include "code\datums\ai\dog\dog_controller.dm" +#include "code\datums\ai\dog\dog_subtrees.dm" +#include "code\datums\ai\monkey\monkey_behaviors.dm" +#include "code\datums\ai\monkey\monkey_controller.dm" +#include "code\datums\ai\monkey\monkey_subtrees.dm" +#include "code\datums\ai\movement\_ai_movement.dm" +#include "code\datums\ai\movement\ai_movement_basic_avoidance.dm" +#include "code\datums\ai\movement\ai_movement_dumb.dm" +#include "code\datums\ai\movement\ai_movement_jps.dm" +#include "code\datums\announcers\_announcer.dm" +#include "code\datums\announcers\baystation_announcer.dm" +#include "code\datums\announcers\default_announcer.dm" +#include "code\datums\announcers\intern_announcer.dm" +#include "code\datums\announcers\medbot_announcer.dm" #include "code\datums\atmosphere\_atmosphere.dm" -#include "code\datums\atmosphere\planetary.dm" #include "code\datums\brain_damage\brain_trauma.dm" #include "code\datums\brain_damage\creepy_trauma.dm" #include "code\datums\brain_damage\hypnosis.dm" @@ -359,14 +429,16 @@ #include "code\datums\brain_damage\split_personality.dm" #include "code\datums\components\_component.dm" #include "code\datums\components\anti_magic.dm" +#include "code\datums\components\aquarium.dm" #include "code\datums\components\armor_plate.dm" #include "code\datums\components\beetlejuice.dm" #include "code\datums\components\butchering.dm" #include "code\datums\components\caltrop.dm" #include "code\datums\components\chasm.dm" #include "code\datums\components\construction.dm" -#include "code\datums\components\decal.dm" +#include "code\datums\components\deadchat_control.dm" #include "code\datums\components\edit_complainer.dm" +#include "code\datums\components\embedded.dm" #include "code\datums\components\empprotection.dm" #include "code\datums\components\explodable.dm" #include "code\datums\components\footstep.dm" @@ -384,29 +456,37 @@ #include "code\datums\components\manual_breathing.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\orbiter.dm" #include "code\datums\components\paintable.dm" +#include "code\datums\components\pellet_cloud.dm" #include "code\datums\components\rad_insulation.dm" #include "code\datums\components\radioactive.dm" +#include "code\datums\components\religious_tool.dm" #include "code\datums\components\remote_materials.dm" #include "code\datums\components\riding.dm" #include "code\datums\components\rot.dm" #include "code\datums\components\rotation.dm" +#include "code\datums\components\shell.dm" #include "code\datums\components\sizzle.dm" #include "code\datums\components\slippery.dm" #include "code\datums\components\snail_crawl.dm" +#include "code\datums\components\soundplayer.dm" #include "code\datums\components\spawner.dm" #include "code\datums\components\spikes.dm" #include "code\datums\components\spill.dm" +#include "code\datums\components\spinny.dm" #include "code\datums\components\spooky.dm" #include "code\datums\components\squeak.dm" #include "code\datums\components\stationloving.dm" #include "code\datums\components\swarming.dm" +#include "code\datums\components\team_monitor.dm" #include "code\datums\components\tether.dm" #include "code\datums\components\thermite.dm" +#include "code\datums\components\twohanded.dm" #include "code\datums\components\uplink.dm" #include "code\datums\components\waddling.dm" #include "code\datums\components\wearertargeting.dm" @@ -415,7 +495,6 @@ #include "code\datums\components\crafting\guncrafting.dm" #include "code\datums\components\crafting\recipes.dm" #include "code\datums\components\crafting\tailoring.dm" -#include "code\datums\components\decals\blood.dm" #include "code\datums\components\plumbing\_plumbing.dm" #include "code\datums\components\plumbing\chemical_acclimator.dm" #include "code\datums\components\plumbing\filter.dm" @@ -425,6 +504,7 @@ #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" +#include "code\datums\components\storage\concrete\fish_case.dm" #include "code\datums\components\storage\concrete\implant.dm" #include "code\datums\components\storage\concrete\pockets.dm" #include "code\datums\components\storage\concrete\rped.dm" @@ -468,7 +548,6 @@ #include "code\datums\diseases\advance\symptoms\fever.dm" #include "code\datums\diseases\advance\symptoms\fire.dm" #include "code\datums\diseases\advance\symptoms\flesh_eating.dm" -#include "code\datums\diseases\advance\symptoms\fleshgrowth.dm" #include "code\datums\diseases\advance\symptoms\genetics.dm" #include "code\datums\diseases\advance\symptoms\hallucigen.dm" #include "code\datums\diseases\advance\symptoms\headache.dm" @@ -499,11 +578,16 @@ #include "code\datums\diseases\advance\symptoms\wizarditis.dm" #include "code\datums\diseases\advance\symptoms\youth.dm" #include "code\datums\elements\_element.dm" +#include "code\datums\elements\bed_tucking.dm" #include "code\datums\elements\bsa_blocker.dm" #include "code\datums\elements\cleaning.dm" +#include "code\datums\elements\decal.dm" +#include "code\datums\elements\deferred_aquarium_content.dm" #include "code\datums\elements\earhealing.dm" +#include "code\datums\elements\embed.dm" #include "code\datums\elements\firestacker.dm" #include "code\datums\elements\squish.dm" +#include "code\datums\elements\decals\blood.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" #include "code\datums\helper_datums\icon_snapshot.dm" @@ -521,6 +605,11 @@ #include "code\datums\looping_sounds\item_sounds.dm" #include "code\datums\looping_sounds\machinery_sounds.dm" #include "code\datums\looping_sounds\weather.dm" +#include "code\datums\mapgen\_MapGenerator.dm" +#include "code\datums\mapgen\CaveGenerator.dm" +#include "code\datums\mapgen\JungleGenerator.dm" +#include "code\datums\mapgen\biomes\_biome.dm" +#include "code\datums\mapgen\Cavegens\LavalandGenerator.dm" #include "code\datums\martial\_martial.dm" #include "code\datums\martial\boxing.dm" #include "code\datums\martial\cqc.dm" @@ -530,9 +619,11 @@ #include "code\datums\martial\plasma_fist.dm" #include "code\datums\martial\psychotic_brawl.dm" #include "code\datums\martial\sleeping_carp.dm" +#include "code\datums\martial\tribal_claw.dm" #include "code\datums\martial\wrestling.dm" #include "code\datums\materials\_material.dm" #include "code\datums\materials\basemats.dm" +#include "code\datums\mocking\client.dm" #include "code\datums\mood_events\drink_events.dm" #include "code\datums\mood_events\drug_events.dm" #include "code\datums\mood_events\generic_negative_events.dm" @@ -555,6 +646,10 @@ #include "code\datums\mutations\touch.dm" #include "code\datums\ruins\lavaland.dm" #include "code\datums\ruins\space.dm" +#include "code\datums\station_traits\_station_trait.dm" +#include "code\datums\station_traits\negative_traits.dm" +#include "code\datums\station_traits\neutral_traits.dm" +#include "code\datums\station_traits\positive_traits.dm" #include "code\datums\status_effects\buffs.dm" #include "code\datums\status_effects\debuffs.dm" #include "code\datums\status_effects\gas.dm" @@ -597,6 +692,7 @@ #include "code\game\say.dm" #include "code\game\shuttle_engines.dm" #include "code\game\sound.dm" +#include "code\game\verbs.dm" #include "code\game\world.dm" #include "code\game\area\ai_monitored.dm" #include "code\game\area\areas.dm" @@ -627,18 +723,24 @@ #include "code\game\gamemodes\devil\objectives.dm" #include "code\game\gamemodes\devil\devil agent\devil_agent.dm" #include "code\game\gamemodes\dynamic\dynamic.dm" +#include "code\game\gamemodes\dynamic\dynamic_hijacking.dm" +#include "code\game\gamemodes\dynamic\dynamic_logging.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets_latejoin.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm" +#include "code\game\gamemodes\dynamic\dynamic_simulations.dm" +#include "code\game\gamemodes\dynamic\ruleset_picking.dm" #include "code\game\gamemodes\eldritch_cult\eldritch_cult.dm" #include "code\game\gamemodes\events\event.dm" #include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\gangs\dominator.dm" #include "code\game\gamemodes\gangs\gang_items.dm" #include "code\game\gamemodes\gangs\gang_pen.dm" +#include "code\game\gamemodes\gangs\gang_tags.dm" #include "code\game\gamemodes\gangs\gangs.dm" #include "code\game\gamemodes\gangs\gangtool.dm" +#include "code\game\gamemodes\gangs\implant_gang.dm" +#include "code\game\gamemodes\gangs\outfits.dm" #include "code\game\gamemodes\hivemind\hivemind.dm" #include "code\game\gamemodes\hivemind\objectives.dm" #include "code\game\gamemodes\hivemind\radar.dm" @@ -650,7 +752,6 @@ #include "code\game\gamemodes\overthrow\objective.dm" #include "code\game\gamemodes\overthrow\overthrow.dm" #include "code\game\gamemodes\revolution\revolution.dm" -#include "code\game\gamemodes\sandbox\airlock_maker.dm" #include "code\game\gamemodes\sandbox\h_sandbox.dm" #include "code\game\gamemodes\sandbox\sandbox.dm" #include "code\game\gamemodes\traitor\double_agents.dm" @@ -662,8 +763,6 @@ #include "code\game\machinery\airlock_cycle_control.dm" #include "code\game\machinery\announcement_system.dm" #include "code\game\machinery\aug_manipulator.dm" -#include "code\game\machinery\autodoc.dm" -#include "code\game\machinery\autolathe.dm" #include "code\game\machinery\bank_machine.dm" #include "code\game\machinery\Beacon.dm" #include "code\game\machinery\buttons.dm" @@ -678,7 +777,6 @@ #include "code\game\machinery\dna_scanner.dm" #include "code\game\machinery\doppler_array.dm" #include "code\game\machinery\droneDispenser.dm" -#include "code\game\machinery\exp_cloner.dm" #include "code\game\machinery\fat_sucker.dm" #include "code\game\machinery\firealarm.dm" #include "code\game\machinery\flasher.dm" @@ -697,6 +795,7 @@ #include "code\game\machinery\newscaster.dm" #include "code\game\machinery\PDApainter.dm" #include "code\game\machinery\quantum_pad.dm" +#include "code\game\machinery\race_converter.dm" #include "code\game\machinery\recharger.dm" #include "code\game\machinery\rechargestation.dm" #include "code\game\machinery\recycler.dm" @@ -765,6 +864,9 @@ #include "code\game\machinery\embedded_controller\airlock_controller.dm" #include "code\game\machinery\embedded_controller\embedded_controller_base.dm" #include "code\game\machinery\embedded_controller\simple_vent_controller.dm" +#include "code\game\machinery\fabricators\autolathe.dm" +#include "code\game\machinery\fabricators\exosuit_fab.dm" +#include "code\game\machinery\fabricators\modular_fabricator.dm" #include "code\game\machinery\pipe\construction.dm" #include "code\game\machinery\pipe\pipe_dispenser.dm" #include "code\game\machinery\porta_turret\portable_turret.dm" @@ -789,7 +891,6 @@ #include "code\game\machinery\telecomms\machines\relay.dm" #include "code\game\machinery\telecomms\machines\server.dm" #include "code\game\mecha\mech_bay.dm" -#include "code\game\mecha\mech_fabricator.dm" #include "code\game\mecha\mecha.dm" #include "code\game\mecha\mecha_actions.dm" #include "code\game\mecha\mecha_construction_paths.dm" @@ -832,6 +933,7 @@ #include "code\game\objects\effects\effects.dm" #include "code\game\objects\effects\forcefields.dm" #include "code\game\objects\effects\glowshroom.dm" +#include "code\game\objects\effects\info.dm" #include "code\game\objects\effects\landmarks.dm" #include "code\game\objects\effects\mainttraps.dm" #include "code\game\objects\effects\mines.dm" @@ -883,12 +985,15 @@ #include "code\game\objects\items\AI_modules.dm" #include "code\game\objects\items\airlock_painter.dm" #include "code\game\objects\items\apc_frame.dm" +#include "code\game\objects\items\binoculars.dm" #include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\body_egg.dm" #include "code\game\objects\items\bodybag.dm" +#include "code\game\objects\items\broom.dm" #include "code\game\objects\items\candle.dm" #include "code\game\objects\items\cardboard_cutouts.dm" #include "code\game\objects\items\cards_ids.dm" +#include "code\game\objects\items\chainsaw.dm" #include "code\game\objects\items\charter.dm" #include "code\game\objects\items\chromosome.dm" #include "code\game\objects\items\chrono_eraser.dm" @@ -900,15 +1005,18 @@ #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\cursed_necklace.dm" #include "code\game\objects\items\debug_items.dm" #include "code\game\objects\items\defib.dm" #include "code\game\objects\items\dehy_carp.dm" #include "code\game\objects\items\dice.dm" #include "code\game\objects\items\dna_injector.dm" #include "code\game\objects\items\documents.dm" +#include "code\game\objects\items\dualsaber.dm" #include "code\game\objects\items\eightball.dm" #include "code\game\objects\items\etherealdiscoball.dm" #include "code\game\objects\items\extinguisher.dm" +#include "code\game\objects\items\fireaxe.dm" #include "code\game\objects\items\flamethrower.dm" #include "code\game\objects\items\gift.dm" #include "code\game\objects\items\granters.dm" @@ -928,6 +1036,7 @@ #include "code\game\objects\items\paiwire.dm" #include "code\game\objects\items\pet_carrier.dm" #include "code\game\objects\items\pinpointer.dm" +#include "code\game\objects\items\pitchfork.dm" #include "code\game\objects\items\plushes.dm" #include "code\game\objects\items\pneumaticCannon.dm" #include "code\game\objects\items\powerfist.dm" @@ -940,8 +1049,10 @@ #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\spear.dm" #include "code\game\objects\items\stunbaton.dm" #include "code\game\objects\items\taster.dm" #include "code\game\objects\items\teleportation.dm" @@ -949,7 +1060,6 @@ #include "code\game\objects\items\theft_tools.dm" #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" -#include "code\game\objects\items\twohanded.dm" #include "code\game\objects\items\vending_items.dm" #include "code\game\objects\items\weaponry.dm" #include "code\game\objects\items\circuitboards\circuitboard.dm" @@ -971,7 +1081,6 @@ #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" @@ -985,6 +1094,7 @@ #include "code\game\objects\items\devices\scanners.dm" #include "code\game\objects\items\devices\sensor_device.dm" #include "code\game\objects\items\devices\sound_synth.dm" +#include "code\game\objects\items\devices\spyglasses.dm" #include "code\game\objects\items\devices\swapper.dm" #include "code\game\objects\items\devices\taperecorder.dm" #include "code\game\objects\items\devices\traitordevices.dm" @@ -1013,12 +1123,14 @@ #include "code\game\objects\items\grenades\syndieminibomb.dm" #include "code\game\objects\items\implants\implant.dm" #include "code\game\objects\items\implants\implant_abductor.dm" +#include "code\game\objects\items\implants\implant_bb.dm" +#include "code\game\objects\items\implants\implant_camera.dm" #include "code\game\objects\items\implants\implant_chem.dm" #include "code\game\objects\items\implants\implant_clown.dm" +#include "code\game\objects\items\implants\implant_deathrattle.dm" #include "code\game\objects\items\implants\implant_exile.dm" #include "code\game\objects\items\implants\implant_explosive.dm" #include "code\game\objects\items\implants\implant_freedom.dm" -#include "code\game\objects\items\implants\implant_gang.dm" #include "code\game\objects\items\implants\implant_krav_maga.dm" #include "code\game\objects\items\implants\implant_mindshield.dm" #include "code\game\objects\items\implants\implant_misc.dm" @@ -1043,6 +1155,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" @@ -1073,6 +1186,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\powertools.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" @@ -1118,7 +1232,6 @@ #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" @@ -1209,10 +1322,15 @@ #include "code\game\turfs\open\floor\plating.dm" #include "code\game\turfs\open\floor\reinf_floor.dm" #include "code\game\turfs\open\floor\plating\asteroid.dm" -#include "code\game\turfs\open\floor\plating\dirt.dm" #include "code\game\turfs\open\floor\plating\misc_plating.dm" +#include "code\game\turfs\open\floor\plating\planet.dm" #include "code\game\turfs\open\space\space.dm" #include "code\game\turfs\open\space\transit.dm" +#include "code\modules\actionspeed\_actionspeed_modifier.dm" +#include "code\modules\actionspeed\modifiers\base.dm" +#include "code\modules\actionspeed\modifiers\mood.dm" +#include "code\modules\actionspeed\modifiers\race.dm" +#include "code\modules\actionspeed\modifiers\status_effects.dm" #include "code\modules\admin\admin.dm" #include "code\modules\admin\admin_follow.dm" #include "code\modules\admin\admin_investigate.dm" @@ -1221,6 +1339,7 @@ #include "code\modules\admin\admin_verbs.dm" #include "code\modules\admin\adminmenu.dm" #include "code\modules\admin\antag_panel.dm" +#include "code\modules\admin\battle_royale.dm" #include "code\modules\admin\chat_commands.dm" #include "code\modules\admin\check_antagonists.dm" #include "code\modules\admin\create_mob.dm" @@ -1259,6 +1378,7 @@ #include "code\modules\admin\verbs\diagnostics.dm" #include "code\modules\admin\verbs\fps.dm" #include "code\modules\admin\verbs\getlogs.dm" +#include "code\modules\admin\verbs\ghost_pool_protection.dm" #include "code\modules\admin\verbs\healall.dm" #include "code\modules\admin\verbs\individual_logging.dm" #include "code\modules\admin\verbs\machine_upgrade.dm" @@ -1276,6 +1396,7 @@ #include "code\modules\admin\verbs\pray.dm" #include "code\modules\admin\verbs\randomverbs.dm" #include "code\modules\admin\verbs\reestablish_db_connection.dm" +#include "code\modules\admin\verbs\requests.dm" #include "code\modules\admin\verbs\shuttlepanel.dm" #include "code\modules\admin\verbs\spawnfloorcluwne.dm" #include "code\modules\admin\verbs\spawnobjasmob.dm" @@ -1285,10 +1406,12 @@ #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\filterrific.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\reference_tracking.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" @@ -1306,6 +1429,7 @@ #include "code\modules\antagonists\abductor\equipment\abduction_outfits.dm" #include "code\modules\antagonists\abductor\equipment\abduction_surgery.dm" #include "code\modules\antagonists\abductor\equipment\gland.dm" +#include "code\modules\antagonists\abductor\equipment\orderable_gear.dm" #include "code\modules\antagonists\abductor\machinery\camera.dm" #include "code\modules\antagonists\abductor\machinery\console.dm" #include "code\modules\antagonists\abductor\machinery\dispenser.dm" @@ -1345,6 +1469,7 @@ #include "code\modules\antagonists\changeling\cellular_emporium.dm" #include "code\modules\antagonists\changeling\changeling.dm" #include "code\modules\antagonists\changeling\changeling_power.dm" +#include "code\modules\antagonists\changeling\teratoma.dm" #include "code\modules\antagonists\changeling\powers\absorb.dm" #include "code\modules\antagonists\changeling\powers\adrenaline.dm" #include "code\modules\antagonists\changeling\powers\augmented_eyesight.dm" @@ -1353,6 +1478,7 @@ #include "code\modules\antagonists\changeling\powers\digitalcamo.dm" #include "code\modules\antagonists\changeling\powers\fakedeath.dm" #include "code\modules\antagonists\changeling\powers\fleshmend.dm" +#include "code\modules\antagonists\changeling\powers\gaseous_pores.dm" #include "code\modules\antagonists\changeling\powers\headcrab.dm" #include "code\modules\antagonists\changeling\powers\hivemind.dm" #include "code\modules\antagonists\changeling\powers\humanform.dm" @@ -1360,7 +1486,6 @@ #include "code\modules\antagonists\changeling\powers\mimic_voice.dm" #include "code\modules\antagonists\changeling\powers\mutations.dm" #include "code\modules\antagonists\changeling\powers\panacea.dm" -#include "code\modules\antagonists\changeling\powers\pheromone_receptors.dm" #include "code\modules\antagonists\changeling\powers\regenerate.dm" #include "code\modules\antagonists\changeling\powers\shriek.dm" #include "code\modules\antagonists\changeling\powers\strained_muscles.dm" @@ -1374,8 +1499,10 @@ #include "code\modules\antagonists\clock_cult\ratvarian_cyborg_modules.dm" #include "code\modules\antagonists\clock_cult\ratvarian_language.dm" #include "code\modules\antagonists\clock_cult\servant_of_ratvar.dm" +#include "code\modules\antagonists\clock_cult\helpers\battle_of_the_gods.dm" #include "code\modules\antagonists\clock_cult\helpers\clockcult_ending.dm" #include "code\modules\antagonists\clock_cult\helpers\clockwork_conversion_tracker.dm" +#include "code\modules\antagonists\clock_cult\helpers\reebe_loader.dm" #include "code\modules\antagonists\clock_cult\helpers\servant_warp.dm" #include "code\modules\antagonists\clock_cult\items\brass_clothing.dm" #include "code\modules\antagonists\clock_cult\items\clock_components.dm" @@ -1505,6 +1632,7 @@ #include "code\modules\antagonists\swarmer\swarmer_event.dm" #include "code\modules\antagonists\traitor\datum_traitor.dm" #include "code\modules\antagonists\traitor\syndicate_contract.dm" +#include "code\modules\antagonists\traitor\traitor_spawner.dm" #include "code\modules\antagonists\traitor\equipment\contractor.dm" #include "code\modules\antagonists\traitor\equipment\Malf_Modules.dm" #include "code\modules\antagonists\traitor\IAA\internal_affairs.dm" @@ -1516,6 +1644,10 @@ #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\aquarium\aquarium.dm" +#include "code\modules\aquarium\aquarium_behaviour.dm" +#include "code\modules\aquarium\fish.dm" +#include "code\modules\aquarium\misc.dm" #include "code\modules\assembly\assembly.dm" #include "code\modules\assembly\bomb.dm" #include "code\modules\assembly\doorcontrol.dm" @@ -1538,11 +1670,13 @@ #include "code\modules\asset_cache\transports\asset_transport.dm" #include "code\modules\asset_cache\transports\webroot_transport.dm" #include "code\modules\atmospherics\multiz.dm" +#include "code\modules\atmospherics\auxgm\breathing_classes.dm" +#include "code\modules\atmospherics\auxgm\gas_types.dm" #include "code\modules\atmospherics\environmental\LINDA_fire.dm" #include "code\modules\atmospherics\environmental\LINDA_system.dm" #include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm" +#include "code\modules\atmospherics\gasmixtures\auxgm.dm" #include "code\modules\atmospherics\gasmixtures\gas_mixture.dm" -#include "code\modules\atmospherics\gasmixtures\gas_types.dm" #include "code\modules\atmospherics\gasmixtures\immutable_mixtures.dm" #include "code\modules\atmospherics\gasmixtures\reactions.dm" #include "code\modules\atmospherics\machinery\airalarm.dm" @@ -1553,7 +1687,10 @@ #include "code\modules\atmospherics\machinery\components\binary_devices\circulator.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\dp_vent_pump.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\passive_gate.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\pressure_valve.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\pump.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\temperature_gate.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\temperature_pump.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\valve.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\volume_pump.dm" #include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm" @@ -1607,8 +1744,10 @@ #include "code\modules\awaymissions\mission_code\snowdin.dm" #include "code\modules\awaymissions\mission_code\spacebattle.dm" #include "code\modules\awaymissions\mission_code\stationCollision.dm" +#include "code\modules\awaymissions\mission_code\TheFactory.dm" #include "code\modules\awaymissions\mission_code\undergroundoutpost45.dm" #include "code\modules\awaymissions\mission_code\wildwest.dm" +#include "code\modules\badges\badges.dm" #include "code\modules\buildmode\bm_mode.dm" #include "code\modules\buildmode\buildmode.dm" #include "code\modules\buildmode\buttons.dm" @@ -1618,8 +1757,10 @@ #include "code\modules\buildmode\submodes\basic.dm" #include "code\modules\buildmode\submodes\boom.dm" #include "code\modules\buildmode\submodes\copy.dm" +#include "code\modules\buildmode\submodes\delete.dm" #include "code\modules\buildmode\submodes\fill.dm" #include "code\modules\buildmode\submodes\mapgen.dm" +#include "code\modules\buildmode\submodes\outfit.dm" #include "code\modules\buildmode\submodes\save_area.dm" #include "code\modules\buildmode\submodes\throwing.dm" #include "code\modules\buildmode\submodes\variable_edit.dm" @@ -1659,6 +1800,7 @@ #include "code\modules\cargo\exports\sheets.dm" #include "code\modules\cargo\exports\tools.dm" #include "code\modules\cargo\exports\weapons.dm" +#include "code\modules\cargo\exports\xenobio.dm" #include "code\modules\chatter\chatter.dm" #include "code\modules\client\antag_tokens.dm" #include "code\modules\client\client_colour.dm" @@ -1671,6 +1813,7 @@ #include "code\modules\client\preferences_toggles.dm" #include "code\modules\client\loadout\loadout.dm" #include "code\modules\client\loadout\loadout_accessories.dm" +#include "code\modules\client\loadout\loadout_donator.dm" #include "code\modules\client\loadout\loadout_footwear.dm" #include "code\modules\client\loadout\loadout_general.dm" #include "code\modules\client\loadout\loadout_hat.dm" @@ -1678,6 +1821,7 @@ #include "code\modules\client\loadout\loadout_suit.dm" #include "code\modules\client\loadout\loadout_uniform.dm" #include "code\modules\client\verbs\etips.dm" +#include "code\modules\client\verbs\input_box.dm" #include "code\modules\client\verbs\looc.dm" #include "code\modules\client\verbs\medals.dm" #include "code\modules\client\verbs\ooc.dm" @@ -1764,6 +1908,7 @@ #include "code\modules\clothing\under\jobs\civilian\civilian.dm" #include "code\modules\clothing\under\jobs\civilian\clown_mime.dm" #include "code\modules\clothing\under\jobs\civilian\curator.dm" +#include "code\modules\clothing\under\jobs\Plasmaman\centcom.dm" #include "code\modules\clothing\under\jobs\Plasmaman\civilian_service.dm" #include "code\modules\clothing\under\jobs\Plasmaman\engineering.dm" #include "code\modules\clothing\under\jobs\Plasmaman\medsci.dm" @@ -1781,7 +1926,6 @@ #include "code\modules\detectivework\footprints_and_rag.dm" #include "code\modules\detectivework\scanner.dm" #include "code\modules\discord\discord.dm" -#include "code\modules\discord\from_discord.dm" #include "code\modules\economy\_economy.dm" #include "code\modules\economy\account.dm" #include "code\modules\economy\pay_stand.dm" @@ -1797,6 +1941,7 @@ #include "code\modules\events\anomaly_grav.dm" #include "code\modules\events\anomaly_pyro.dm" #include "code\modules\events\anomaly_vortex.dm" +#include "code\modules\events\asteroid_impact.dm" #include "code\modules\events\aurora_caelus.dm" #include "code\modules\events\blob.dm" #include "code\modules\events\brain_trauma.dm" @@ -1838,6 +1983,7 @@ #include "code\modules\events\special_antag_event.dm" #include "code\modules\events\spider_infestation.dm" #include "code\modules\events\spontaneous_appendicitis.dm" +#include "code\modules\events\supermatter_surge.dm" #include "code\modules\events\vent_clog.dm" #include "code\modules\events\wormholes.dm" #include "code\modules\events\holiday\halloween.dm" @@ -1860,6 +2006,14 @@ #include "code\modules\events\wizard\rpgloot.dm" #include "code\modules\events\wizard\shuffle.dm" #include "code\modules\events\wizard\summons.dm" +#include "code\modules\exploration_crew\exploration_explosives.dm" +#include "code\modules\exploration_crew\exploration_laser_gun.dm" +#include "code\modules\exploration_crew\exploration_shuttle.dm" +#include "code\modules\exploration_crew\exploration_vendor.dm" +#include "code\modules\exploration_crew\nostation_firing_pin.dm" +#include "code\modules\exploration_crew\research_locator.dm" +#include "code\modules\exploration_crew\discovery_research\discoverable_component.dm" +#include "code\modules\exploration_crew\discovery_research\discovery_scanner.dm" #include "code\modules\fields\fields.dm" #include "code\modules\fields\gravity.dm" #include "code\modules\fields\peaceborg_dampener.dm" @@ -1945,6 +2099,7 @@ #include "code\modules\holodeck\area_copy.dm" #include "code\modules\holodeck\computer.dm" #include "code\modules\holodeck\holo_effect.dm" +#include "code\modules\holodeck\holodeck_map_templates.dm" #include "code\modules\holodeck\items.dm" #include "code\modules\holodeck\mobs.dm" #include "code\modules\holodeck\turfs.dm" @@ -1996,48 +2151,25 @@ #include "code\modules\hydroponics\grown\tobacco.dm" #include "code\modules\hydroponics\grown\tomato.dm" #include "code\modules\hydroponics\grown\towercap.dm" -#include "code\modules\integrated_electronics\core\analyzer.dm" -#include "code\modules\integrated_electronics\core\assemblies.dm" -#include "code\modules\integrated_electronics\core\debugger.dm" -#include "code\modules\integrated_electronics\core\detailer.dm" -#include "code\modules\integrated_electronics\core\helpers.dm" -#include "code\modules\integrated_electronics\core\integrated_circuit.dm" -#include "code\modules\integrated_electronics\core\pins.dm" -#include "code\modules\integrated_electronics\core\printer.dm" -#include "code\modules\integrated_electronics\core\saved_circuits.dm" -#include "code\modules\integrated_electronics\core\wirer.dm" -#include "code\modules\integrated_electronics\core\special_pins\boolean_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\char_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\color_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\dir_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\index_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\list_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\number_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\ref_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\selfref_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\string_pin.dm" -#include "code\modules\integrated_electronics\passive\passive.dm" -#include "code\modules\integrated_electronics\passive\power.dm" -#include "code\modules\integrated_electronics\subtypes\access.dm" -#include "code\modules\integrated_electronics\subtypes\arithmetic.dm" -#include "code\modules\integrated_electronics\subtypes\atmospherics.dm" -#include "code\modules\integrated_electronics\subtypes\converters.dm" -#include "code\modules\integrated_electronics\subtypes\data_transfer.dm" -#include "code\modules\integrated_electronics\subtypes\input.dm" -#include "code\modules\integrated_electronics\subtypes\lists.dm" -#include "code\modules\integrated_electronics\subtypes\logic.dm" -#include "code\modules\integrated_electronics\subtypes\manipulation.dm" -#include "code\modules\integrated_electronics\subtypes\memory.dm" -#include "code\modules\integrated_electronics\subtypes\mining.dm" -#include "code\modules\integrated_electronics\subtypes\output.dm" -#include "code\modules\integrated_electronics\subtypes\power.dm" -#include "code\modules\integrated_electronics\subtypes\reagents.dm" -#include "code\modules\integrated_electronics\subtypes\smart.dm" -#include "code\modules\integrated_electronics\subtypes\text.dm" -#include "code\modules\integrated_electronics\subtypes\time.dm" -#include "code\modules\integrated_electronics\subtypes\trig.dm" +#include "code\modules\instruments\items.dm" +#include "code\modules\instruments\stationary.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\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\jobs\access.dm" #include "code\modules\jobs\job_exp.dm" +#include "code\modules\jobs\job_report.dm" #include "code\modules\jobs\jobs.dm" #include "code\modules\jobs\job_types\_job.dm" #include "code\modules\jobs\job_types\ai.dm" @@ -2059,6 +2191,7 @@ #include "code\modules\jobs\job_types\deputy.dm" #include "code\modules\jobs\job_types\detective.dm" #include "code\modules\jobs\job_types\emt.dm" +#include "code\modules\jobs\job_types\exploration_team.dm" #include "code\modules\jobs\job_types\geneticist.dm" #include "code\modules\jobs\job_types\gimmick.dm" #include "code\modules\jobs\job_types\head_of_personnel.dm" @@ -2114,6 +2247,7 @@ #include "code\modules\library\lib_machines.dm" #include "code\modules\library\random_books.dm" #include "code\modules\library\soapstone.dm" +#include "code\modules\lighting\emissive_blocker.dm" #include "code\modules\lighting\lighting_area.dm" #include "code\modules\lighting\lighting_atom.dm" #include "code\modules\lighting\lighting_corner.dm" @@ -2150,7 +2284,6 @@ #include "code\modules\mining\aux_base.dm" #include "code\modules\mining\aux_base_camera.dm" #include "code\modules\mining\fulton.dm" -#include "code\modules\mining\machine_bluespaceminer.dm" #include "code\modules\mining\machine_processing.dm" #include "code\modules\mining\machine_redemption.dm" #include "code\modules\mining\machine_silo.dm" @@ -2189,12 +2322,15 @@ #include "code\modules\mob\mob.dm" #include "code\modules\mob\mob_defines.dm" #include "code\modules\mob\mob_helpers.dm" +#include "code\modules\mob\mob_lists.dm" #include "code\modules\mob\mob_movement.dm" #include "code\modules\mob\mob_movespeed.dm" +#include "code\modules\mob\mob_stat.dm" #include "code\modules\mob\mob_transformation_simple.dm" #include "code\modules\mob\say.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" @@ -2213,7 +2349,6 @@ #include "code\modules\mob\dead\observer\say.dm" #include "code\modules\mob\living\blood.dm" #include "code\modules\mob\living\bloodcrawl.dm" -#include "code\modules\mob\living\burgerchat.dm" #include "code\modules\mob\living\damage_procs.dm" #include "code\modules\mob\living\death.dm" #include "code\modules\mob\living\emote.dm" @@ -2223,6 +2358,7 @@ #include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defines.dm" #include "code\modules\mob\living\living_movement.dm" +#include "code\modules\mob\living\living_sentience.dm" #include "code\modules\mob\living\login.dm" #include "code\modules\mob\living\logout.dm" #include "code\modules\mob\living\say.dm" @@ -2307,6 +2443,7 @@ #include "code\modules\mob\living\carbon\human\species_types\android.dm" #include "code\modules\mob\living\carbon\human\species_types\apid.dm" #include "code\modules\mob\living\carbon\human\species_types\corporate.dm" +#include "code\modules\mob\living\carbon\human\species_types\debug.dm" #include "code\modules\mob\living\carbon\human\species_types\dullahan.dm" #include "code\modules\mob\living\carbon\human\species_types\ethereal.dm" #include "code\modules\mob\living\carbon\human\species_types\felinid.dm" @@ -2318,6 +2455,7 @@ #include "code\modules\mob\living\carbon\human\species_types\lizardpeople.dm" #include "code\modules\mob\living\carbon\human\species_types\mothmen.dm" #include "code\modules\mob\living\carbon\human\species_types\mushpeople.dm" +#include "code\modules\mob\living\carbon\human\species_types\oozelings.dm" #include "code\modules\mob\living\carbon\human\species_types\plasmamen.dm" #include "code\modules\mob\living\carbon\human\species_types\podpeople.dm" #include "code\modules\mob\living\carbon\human\species_types\shadowpeople.dm" @@ -2325,11 +2463,9 @@ #include "code\modules\mob\living\carbon\human\species_types\snail.dm" #include "code\modules\mob\living\carbon\human\species_types\squidpeople.dm" #include "code\modules\mob\living\carbon\human\species_types\supersoldier.dm" -#include "code\modules\mob\living\carbon\human\species_types\synths.dm" #include "code\modules\mob\living\carbon\human\species_types\vampire.dm" #include "code\modules\mob\living\carbon\human\species_types\zombies.dm" #include "code\modules\mob\living\carbon\human\verbs\give.dm" -#include "code\modules\mob\living\carbon\monkey\combat.dm" #include "code\modules\mob\living\carbon\monkey\death.dm" #include "code\modules\mob\living\carbon\monkey\inventory.dm" #include "code\modules\mob\living\carbon\monkey\life.dm" @@ -2348,6 +2484,7 @@ #include "code\modules\mob\living\silicon\silicon_movement.dm" #include "code\modules\mob\living\silicon\ai\ai.dm" #include "code\modules\mob\living\silicon\ai\ai_defense.dm" +#include "code\modules\mob\living\silicon\ai\ai_portrait_picker.dm" #include "code\modules\mob\living\silicon\ai\death.dm" #include "code\modules\mob\living\silicon\ai\examine.dm" #include "code\modules\mob\living\silicon\ai\laws.dm" @@ -2386,6 +2523,7 @@ #include "code\modules\mob\living\simple_animal\corpse.dm" #include "code\modules\mob\living\simple_animal\damage_procs.dm" #include "code\modules\mob\living\simple_animal\eldritch_demons.dm" +#include "code\modules\mob\living\simple_animal\kalo.dm" #include "code\modules\mob\living\simple_animal\parrot.dm" #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" @@ -2529,6 +2667,7 @@ #include "code\modules\modular_computers\file_system\programs\atmosscan.dm" #include "code\modules\modular_computers\file_system\programs\borg_monitor.dm" #include "code\modules\modular_computers\file_system\programs\card.dm" +#include "code\modules\modular_computers\file_system\programs\cargobounty.dm" #include "code\modules\modular_computers\file_system\programs\configurator.dm" #include "code\modules\modular_computers\file_system\programs\crewmanifest.dm" #include "code\modules\modular_computers\file_system\programs\file_browser.dm" @@ -2536,7 +2675,9 @@ #include "code\modules\modular_computers\file_system\programs\ntdownloader.dm" #include "code\modules\modular_computers\file_system\programs\ntmonitor.dm" #include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm" +#include "code\modules\modular_computers\file_system\programs\portrait_printer.dm" #include "code\modules\modular_computers\file_system\programs\powermonitor.dm" +#include "code\modules\modular_computers\file_system\programs\radar.dm" #include "code\modules\modular_computers\file_system\programs\robocontrol.dm" #include "code\modules\modular_computers\file_system\programs\sm_monitor.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\contract_uplink.dm" @@ -2582,6 +2723,7 @@ #include "code\modules\paperwork\clipboard.dm" #include "code\modules\paperwork\contract.dm" #include "code\modules\paperwork\filingcabinet.dm" +#include "code\modules\paperwork\folder_premade.dm" #include "code\modules\paperwork\folders.dm" #include "code\modules\paperwork\handlabeler.dm" #include "code\modules\paperwork\origami.dm" @@ -2615,6 +2757,14 @@ #include "code\modules\plumbing\plumbers\reaction_chamber.dm" #include "code\modules\plumbing\plumbers\splitters.dm" #include "code\modules\plumbing\plumbers\synthesizer.dm" +#include "code\modules\pool\pool.dm" +#include "code\modules\pool\pool_items.dm" +#include "code\modules\pool\components\swimming.dm" +#include "code\modules\pool\components\swimming_dissolve.dm" +#include "code\modules\pool\components\swimming_ethereal.dm" +#include "code\modules\pool\components\swimming_felinid.dm" +#include "code\modules\pool\components\swimming_golem.dm" +#include "code\modules\pool\components\swimming_squid.dm" #include "code\modules\power\apc.dm" #include "code\modules\power\cable.dm" #include "code\modules\power\cell.dm" @@ -2698,6 +2848,7 @@ #include "code\modules\projectiles\ammunition\energy\stun.dm" #include "code\modules\projectiles\ammunition\special\magic.dm" #include "code\modules\projectiles\ammunition\special\syringe.dm" +#include "code\modules\projectiles\ammunition\special\vortex.dm" #include "code\modules\projectiles\boxes_magazines\_box_magazine.dm" #include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm" #include "code\modules\projectiles\boxes_magazines\external\grenade.dm" @@ -2713,7 +2864,6 @@ #include "code\modules\projectiles\boxes_magazines\internal\_internal.dm" #include "code\modules\projectiles\boxes_magazines\internal\bow.dm" #include "code\modules\projectiles\boxes_magazines\internal\grenade.dm" -#include "code\modules\projectiles\boxes_magazines\internal\misc.dm" #include "code\modules\projectiles\boxes_magazines\internal\revolver.dm" #include "code\modules\projectiles\boxes_magazines\internal\rifle.dm" #include "code\modules\projectiles\boxes_magazines\internal\shotgun.dm" @@ -2723,7 +2873,6 @@ #include "code\modules\projectiles\guns\magic.dm" #include "code\modules\projectiles\guns\ballistic\automatic.dm" #include "code\modules\projectiles\guns\ballistic\bow.dm" -#include "code\modules\projectiles\guns\ballistic\laser_gatling.dm" #include "code\modules\projectiles\guns\ballistic\launchers.dm" #include "code\modules\projectiles\guns\ballistic\pistol.dm" #include "code\modules\projectiles\guns\ballistic\revolver.dm" @@ -2734,6 +2883,7 @@ #include "code\modules\projectiles\guns\energy\energy_gun.dm" #include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm" #include "code\modules\projectiles\guns\energy\laser.dm" +#include "code\modules\projectiles\guns\energy\laser_gatling.dm" #include "code\modules\projectiles\guns\energy\mounted.dm" #include "code\modules\projectiles\guns\energy\pulse.dm" #include "code\modules\projectiles\guns\energy\special.dm" @@ -2783,8 +2933,8 @@ #include "code\modules\projectiles\projectile\special\plasma.dm" #include "code\modules\projectiles\projectile\special\rocket.dm" #include "code\modules\projectiles\projectile\special\temperature.dm" +#include "code\modules\projectiles\projectile\special\vortex.dm" #include "code\modules\projectiles\projectile\special\wormhole.dm" -#include "code\modules\qwerty\kalo.dm" #include "code\modules\reagents\chem_splash.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" @@ -2834,6 +2984,11 @@ #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\religion\religion_sects.dm" +#include "code\modules\religion\religion_structures.dm" +#include "code\modules\religion\rites.dm" +#include "code\modules\requests\request.dm" +#include "code\modules\requests\request_manager.dm" #include "code\modules\research\designs.dm" #include "code\modules\research\destructive_analyzer.dm" #include "code\modules\research\experimentor.dm" @@ -2863,6 +3018,7 @@ #include "code\modules\research\designs\telecomms_designs.dm" #include "code\modules\research\designs\tool_designs.dm" #include "code\modules\research\designs\weapon_designs.dm" +#include "code\modules\research\designs\wiremod_designs.dm" #include "code\modules\research\machinery\_production.dm" #include "code\modules\research\machinery\circuit_imprinter.dm" #include "code\modules\research\machinery\departmental_circuit_imprinter.dm" @@ -2873,7 +3029,6 @@ #include "code\modules\research\nanites\nanite_chamber.dm" #include "code\modules\research\nanites\nanite_chamber_computer.dm" #include "code\modules\research\nanites\nanite_cloud_controller.dm" -#include "code\modules\research\nanites\nanite_hijacker.dm" #include "code\modules\research\nanites\nanite_misc_items.dm" #include "code\modules\research\nanites\nanite_program_hub.dm" #include "code\modules\research\nanites\nanite_programmer.dm" @@ -2906,11 +3061,13 @@ #include "code\modules\research\xenobiology\crossbreeding\_mobs.dm" #include "code\modules\research\xenobiology\crossbreeding\_potions.dm" #include "code\modules\research\xenobiology\crossbreeding\_status_effects.dm" +#include "code\modules\research\xenobiology\crossbreeding\_structures.dm" #include "code\modules\research\xenobiology\crossbreeding\_weapons.dm" #include "code\modules\research\xenobiology\crossbreeding\burning.dm" #include "code\modules\research\xenobiology\crossbreeding\charged.dm" #include "code\modules\research\xenobiology\crossbreeding\chilling.dm" #include "code\modules\research\xenobiology\crossbreeding\consuming.dm" +#include "code\modules\research\xenobiology\crossbreeding\crystalized.dm" #include "code\modules\research\xenobiology\crossbreeding\gentle.dm" #include "code\modules\research\xenobiology\crossbreeding\industrial.dm" #include "code\modules\research\xenobiology\crossbreeding\prismatic.dm" @@ -2919,6 +3076,8 @@ #include "code\modules\research\xenobiology\crossbreeding\reproductive.dm" #include "code\modules\research\xenobiology\crossbreeding\selfsustaining.dm" #include "code\modules\research\xenobiology\crossbreeding\stabilized.dm" +#include "code\modules\research\xenobiology\crossbreeding\transformative.dm" +#include "code\modules\research\xenobiology\crossbreeding\warping.dm" #include "code\modules\ruins\lavaland_ruin_code.dm" #include "code\modules\ruins\lavalandruin_code\biodome_clown_planet.dm" #include "code\modules\ruins\lavalandruin_code\pizzaparty.dm" @@ -2929,6 +3088,7 @@ #include "code\modules\ruins\objects_and_mobs\ash_walker_den.dm" #include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm" #include "code\modules\ruins\objects_and_mobs\sin_ruins.dm" +#include "code\modules\ruins\spaceruin_code\asteroid10.dm" #include "code\modules\ruins\spaceruin_code\asteroid4.dm" #include "code\modules\ruins\spaceruin_code\bigderelict1.dm" #include "code\modules\ruins\spaceruin_code\caravanambush.dm" @@ -2948,7 +3108,6 @@ #include "code\modules\security_levels\security_levels.dm" #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" @@ -2956,22 +3115,71 @@ #include "code\modules\shuttle\ferry.dm" #include "code\modules\shuttle\manipulator.dm" #include "code\modules\shuttle\monastery.dm" -#include "code\modules\shuttle\navigation_computer.dm" #include "code\modules\shuttle\on_move.dm" #include "code\modules\shuttle\ripple.dm" #include "code\modules\shuttle\shuttle.dm" #include "code\modules\shuttle\shuttle_rotate.dm" -#include "code\modules\shuttle\spaceship_navigation_beacon.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\bluespace_shuttle_pod\pod_area.dm" +#include "code\modules\shuttle\bluespace_shuttle_pod\pod_computer.dm" +#include "code\modules\shuttle\bluespace_shuttle_pod\shuttle_capsule.dm" +#include "code\modules\shuttle\bluespace_shuttle_pod\traitor_shuttle.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\shuttle\super_cruise\shuttle_supercruise.dm" +#include "code\modules\shuttle\super_cruise\bluespace_beacon\bluespace_beacon.dm" +#include "code\modules\shuttle\super_cruise\interface\orbital_map_interface.dm" +#include "code\modules\shuttle\super_cruise\orbital_map_components\orbital_map.dm" +#include "code\modules\shuttle\super_cruise\orbital_map_components\orbital_object.dm" +#include "code\modules\shuttle\super_cruise\orbital_map_components\orbital_vector.dm" +#include "code\modules\shuttle\super_cruise\orbital_map_components\orbital_objects\beacon.dm" +#include "code\modules\shuttle\super_cruise\orbital_map_components\orbital_objects\custom_shuttle.dm" +#include "code\modules\shuttle\super_cruise\orbital_map_components\orbital_objects\lavaland.dm" +#include "code\modules\shuttle\super_cruise\orbital_map_components\orbital_objects\meteor.dm" +#include "code\modules\shuttle\super_cruise\orbital_map_components\orbital_objects\phobos.dm" +#include "code\modules\shuttle\super_cruise\orbital_map_components\orbital_objects\shuttle.dm" +#include "code\modules\shuttle\super_cruise\orbital_map_components\orbital_objects\space_station.dm" +#include "code\modules\shuttle\super_cruise\orbital_map_components\orbital_objects\star.dm" +#include "code\modules\shuttle\super_cruise\orbital_map_components\orbital_objects\z_linked.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\_orbital_objective.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\objective_computer.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\loot\alien_artifact.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\loot\artifact_defenses.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\loot\research_disks.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\loot\vortex_rifle.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\objective_types\alien_artifact.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\objective_types\nuke_ruin.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\objective_types\recover_blackbox.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\objective_types\vip_extraction.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\asteroid_generator.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\mapping.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\ruin_generator.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\ruin_objects.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\ruin_part_loader.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\ruin_part_template.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\ruin_part_types.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\exoplanets\exoplanet_generator.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\exoplanets\biomes\_biome.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\exoplanets\biomes\lavaland.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\exoplanets\biomes\lush.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\generator_settings\_generator_settings.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\generator_settings\generator_abandoned.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\generator_settings\generator_blob.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\generator_settings\generator_netherworld.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\generator_settings\generator_ratvar.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\generator_settings\generator_xeno.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\ruin_events\_ruin_event.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\ruin_events\asteriod_station.dm" +#include "code\modules\shuttle\super_cruise\orbital_poi_generator\ruin_generator\ruin_events\meteor_storm.dm" +#include "code\modules\shuttle\super_cruise\shuttle_components\plasma_refiner.dm" +#include "code\modules\shuttle\super_cruise\shuttle_components\shuttle_console.dm" +#include "code\modules\shuttle\super_cruise\shuttle_components\shuttle_docking.dm" #include "code\modules\spells\spell.dm" #include "code\modules\spells\spell_types\aimed.dm" #include "code\modules\spells\spell_types\area_teleport.dm" @@ -2992,7 +3200,6 @@ #include "code\modules\spells\spell_types\godhand.dm" #include "code\modules\spells\spell_types\hivemind.dm" #include "code\modules\spells\spell_types\infinite_guns.dm" -#include "code\modules\spells\spell_types\inflict_handler.dm" #include "code\modules\spells\spell_types\knock.dm" #include "code\modules\spells\spell_types\lichdom.dm" #include "code\modules\spells\spell_types\lightning.dm" @@ -3017,10 +3224,12 @@ #include "code\modules\spells\spell_types\voice_of_god.dm" #include "code\modules\spells\spell_types\wizard.dm" #include "code\modules\station_goals\bsa.dm" +#include "code\modules\station_goals\custom_shuttle.dm" #include "code\modules\station_goals\dna_vault.dm" #include "code\modules\station_goals\shield.dm" #include "code\modules\station_goals\station_goal.dm" #include "code\modules\surgery\amputation.dm" +#include "code\modules\surgery\anesthetic_machine.dm" #include "code\modules\surgery\blood_filter.dm" #include "code\modules\surgery\brain_surgery.dm" #include "code\modules\surgery\cavity_implant.dm" @@ -3032,6 +3241,7 @@ #include "code\modules\surgery\helpers.dm" #include "code\modules\surgery\hepatectomy.dm" #include "code\modules\surgery\implant_removal.dm" +#include "code\modules\surgery\latex_glove_box.dm" #include "code\modules\surgery\limb_augmentation.dm" #include "code\modules\surgery\lipoplasty.dm" #include "code\modules\surgery\lobectomy.dm" @@ -3091,6 +3301,7 @@ #include "code\modules\tgui\tgui_window.dm" #include "code\modules\tgui\states\admin.dm" #include "code\modules\tgui\states\always.dm" +#include "code\modules\tgui\states\clockcult_state.dm" #include "code\modules\tgui\states\conscious.dm" #include "code\modules\tgui\states\contained.dm" #include "code\modules\tgui\states\debug.dm" @@ -3108,6 +3319,7 @@ #include "code\modules\tgui\states\zlevel.dm" #include "code\modules\tgui_panel\audio.dm" #include "code\modules\tgui_panel\external.dm" +#include "code\modules\tgui_panel\stat.dm" #include "code\modules\tgui_panel\telemetry.dm" #include "code\modules\tgui_panel\tgui_panel.dm" #include "code\modules\tooltip\tooltip.dm" @@ -3165,10 +3377,72 @@ #include "code\modules\vending\toys.dm" #include "code\modules\vending\wardrobes.dm" #include "code\modules\vending\youtool.dm" +#include "code\modules\wiremod\component.dm" +#include "code\modules\wiremod\component_printer.dm" +#include "code\modules\wiremod\integrated_circuit.dm" +#include "code\modules\wiremod\marker.dm" +#include "code\modules\wiremod\port.dm" +#include "code\modules\wiremod\usb_cable.dm" +#include "code\modules\wiremod\components\usb_port.dm" +#include "code\modules\wiremod\components\abstract\arbitrary_input_amount.dm" +#include "code\modules\wiremod\components\abstract\compare.dm" +#include "code\modules\wiremod\components\abstract\indexer.dm" +#include "code\modules\wiremod\components\action\light.dm" +#include "code\modules\wiremod\components\action\mmi.dm" +#include "code\modules\wiremod\components\action\pull.dm" +#include "code\modules\wiremod\components\action\radio.dm" +#include "code\modules\wiremod\components\action\soundemitter.dm" +#include "code\modules\wiremod\components\action\speech.dm" +#include "code\modules\wiremod\components\atom\direction.dm" +#include "code\modules\wiremod\components\atom\gps.dm" +#include "code\modules\wiremod\components\atom\health.dm" +#include "code\modules\wiremod\components\atom\hear.dm" +#include "code\modules\wiremod\components\atom\self.dm" +#include "code\modules\wiremod\components\atom\species.dm" +#include "code\modules\wiremod\components\list\append.dm" +#include "code\modules\wiremod\components\list\concat.dm" +#include "code\modules\wiremod\components\list\get_column.dm" +#include "code\modules\wiremod\components\list\index.dm" +#include "code\modules\wiremod\components\list\list_length_constructor.dm" +#include "code\modules\wiremod\components\list\pop.dm" +#include "code\modules\wiremod\components\list\write.dm" +#include "code\modules\wiremod\components\list\index_table.dm" +#include "code\modules\wiremod\components\list\list_constructor.dm" +#include "code\modules\wiremod\components\list\select.dm" +#include "code\modules\wiremod\components\math\arithmetic.dm" +#include "code\modules\wiremod\components\math\bitflag.dm" +#include "code\modules\wiremod\components\math\bitwise.dm" +#include "code\modules\wiremod\components\math\comparison.dm" +#include "code\modules\wiremod\components\math\length.dm" +#include "code\modules\wiremod\components\math\logic.dm" +#include "code\modules\wiremod\components\math\not.dm" +#include "code\modules\wiremod\components\math\random.dm" +#include "code\modules\wiremod\components\math\round.dm" +#include "code\modules\wiremod\components\math\trig.dm" +#include "code\modules\wiremod\components\string\concat.dm" +#include "code\modules\wiremod\components\string\contains.dm" +#include "code\modules\wiremod\components\string\textcase.dm" +#include "code\modules\wiremod\components\string\tostring.dm" +#include "code\modules\wiremod\components\utility\clock.dm" +#include "code\modules\wiremod\components\utility\combiner.dm" +#include "code\modules\wiremod\components\utility\delay.dm" +#include "code\modules\wiremod\components\utility\multiplexer.dm" +#include "code\modules\wiremod\components\utility\ram.dm" +#include "code\modules\wiremod\components\utility\typecheck.dm" +#include "code\modules\wiremod\preset\hello_world.dm" +#include "code\modules\wiremod\preset\speech_relay.dm" +#include "code\modules\wiremod\shell\airlock.dm" +#include "code\modules\wiremod\shell\bot.dm" +#include "code\modules\wiremod\shell\compact_remote.dm" +#include "code\modules\wiremod\shell\controller.dm" +#include "code\modules\wiremod\shell\drone.dm" +#include "code\modules\wiremod\shell\moneybot.dm" +#include "code\modules\wiremod\shell\scanner.dm" +#include "code\modules\wiremod\shell\server.dm" +#include "code\modules\wiremod\shell\shell_items.dm" #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" #include "interface\interface.dm" -#include "interface\menu.dm" #include "interface\stylesheet.dm" #include "interface\skin.dmf" // END_INCLUDE diff --git a/byond-extools.dll b/byond-extools.dll deleted file mode 100644 index 60b47c3acab3f..0000000000000 Binary files a/byond-extools.dll and /dev/null differ diff --git a/byond-extools.pdb b/byond-extools.pdb deleted file mode 100644 index fe9ce583bf316..0000000000000 Binary files a/byond-extools.pdb and /dev/null differ diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 960f0a7e591f7..bf53c0289e5d6 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -51,6 +51,7 @@ #define GELADIKINESIS /datum/mutation/human/geladikinesis #define CRYOKINESIS /datum/mutation/human/cryokinesis #define CLUWNEMUT /datum/mutation/human/cluwne +#define WAXSALIVA /datum/mutation/human/wax_saliva #define UI_CHANGED "ui changed" #define UE_CHANGED "ue changed" @@ -95,7 +96,7 @@ #define TR_KEEPSE (1<<5) // changelings shouldn't edit the DNA's SE when turning into a monkey #define TR_DEFAULTMSG (1<<6) #define TR_KEEPORGANS (1<<8) - +#define TR_KEEPAI (1<<9) #define CLONER_FRESH_CLONE "fresh" #define CLONER_MATURE_CLONE "mature" @@ -125,6 +126,7 @@ #define NOHUSK 22 // Can't be husked. #define ROBOTIC_LIMBS 23 //limbs start out as robotic; but also use organic icons. If you want to use the default ones, you'll have to use on_species_gain #define NOMOUTH 24 +#define NOSOCKS 25 // You cannot wear socks. //organ slots #define ORGAN_SLOT_BRAIN "brain" diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm index 128751bcdf70c..0b9a85d9194a7 100644 --- a/code/__DEFINES/MC.dm +++ b/code/__DEFINES/MC.dm @@ -1,5 +1,7 @@ #define MC_TICK_CHECK ( ( TICK_USAGE > Master.current_ticklimit || src.state != SS_RUNNING ) ? pause() : 0 ) +#define MC_TICK_REMAINING_MS ((Master.current_ticklimit - TICK_USAGE) * world.tick_lag) + #define MC_SPLIT_TICK_INIT(phase_count) var/original_tick_limit = Master.current_ticklimit; var/split_tick_phases = ##phase_count #define MC_SPLIT_TICK \ if(split_tick_phases > 1){\ @@ -55,7 +57,7 @@ #define SS_POST_FIRE_TIMING 64 //! SUBSYSTEM STATES -#define SS_IDLE 0 /// aint doing shit. +#define SS_IDLE 0 /// ain't doing shit. #define SS_QUEUED 1 /// queued to run #define SS_RUNNING 2 /// actively running #define SS_PAUSED 3 /// paused by mc_tick_check @@ -66,12 +68,22 @@ /datum/controller/subsystem/##X/New(){\ NEW_SS_GLOBAL(SS##X);\ PreInit();\ + ss_id=#X;\ }\ /datum/controller/subsystem/##X +#define TIMER_SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/timer/##X);\ +/datum/controller/subsystem/timer/##X/New(){\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ + ss_id="timer_[#X]";\ +}\ +/datum/controller/subsystem/timer/##X + #define PROCESSING_SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/processing/##X);\ /datum/controller/subsystem/processing/##X/New(){\ NEW_SS_GLOBAL(SS##X);\ PreInit();\ + ss_id="processing_[#X]";\ }\ /datum/controller/subsystem/processing/##X diff --git a/code/__DEFINES/_mob_properties.dm b/code/__DEFINES/_mob_properties.dm new file mode 100644 index 0000000000000..94780daff9e1d --- /dev/null +++ b/code/__DEFINES/_mob_properties.dm @@ -0,0 +1,333 @@ +/* MOB PROPERTIES */ + +// Taken from goon (https://github.com/goonstation/goonstation/pull/722) with permission. +// Credit to Naksu/vuonojenmustaturska for most of it, with some fixes/improvements by pali + +/* + +Contains a system to apply fast-to-check properties onto mobs, with different stacking behaviors. + +To get the value of ANY property regardless of the behavior used, use: + + GET_MOB_PROPERTY(mob, property) + +If you only want to know whether a property exists, use: + + HAS_MOB_PROPERTY(mob, property) + +To set the values of properties: + + APPLY_MOB_PROPERTY(mob, property, source[, value[, priority]]) + + value is REQUIRED for any property other than simple properties, omitting it will result in a compile error "incorrect number of macro arguments." + priority is likewise REQUIRED for priority properties. + + REMOVE_MOB_PROPERTY(mob, property, source) + +Behavior-dependent macros: + +In the context of these macros, "source" is where the property is being applied/removed from. The actual value of the source argument depends +on what makes sense in context, for example things where multiple objects of the same type may apply stacking properties it might make sense +to use the caller's src as the source; but for things where the property should be per-type unique, src.type may make more sense. A string +might make sense for when multiple types should overwrite eachothers applications of the property. + +To modify already-applied values, just run the APPLY macro again. + +SIMPLE PROPERTIES + +There work like flags, carrying no value. Their existence itself "is" the value. + +To set: + + APPLY_MOB_PROPERTY(mob, property, source) + + for example: + + /obj/item/example_stick/attack_self(mob/user) + APPLY_MOB_PROPERTY(user, PROP_EXAMPLE, src.type) + +To remove: + + REMOVE_MOB_PROPERTY(mob, property, source) + + for example: + + /obj/item/unexample_stick/attack_self(mob/user) + REMOVE_MOB_PROPERTY(user, PROP_EXAMPLE, /obj/item/example_stick) + + + +SUM PROPERTIES + +The value of a sum property is the sum of applied values of the property from all sources. + +To set: + + APPLY_MOB_PROPERTY(mob, property, source, value) + + for example: + + /obj/item/example_stick_1/attack_self(mob/user) + APPLY_MOB_PROPERTY(user, PROP_EXAMPLE, src.type, 1) + + /obj/item/example_stick_2/attack_self(mob/user) + APPLY_MOB_PROPERTY(user, PROP_EXAMPLE, src.type, 2) + + Using example_stick_1 gives the user a PROP_EXAMPLE value of 1 if no value existed prior. Using example_stick_2 right after makes the value 3. + +To remove: + + REMOVE_MOB_PROPERTY(mob, property, source) + + for example: + + /obj/item/unexample_stick_1/attack_self(mob/user) + REMOVE_MOB_PROPERTY(user, PROP_EXAMPLE, /obj/item/example_stick_1) + + + +MAX PROPERTIES + +The value of a max property is the largest of the applied values on the property. + +To set: + + APPLY_MOB_PROPERTY(mob, property, source, value) + + for example: + + /obj/item/example_stick_1/attack_self(mob/user) + APPLY_MOB_PROPERTY(user, PROP_EXAMPLE, src.type, 1) + + /obj/item/example_stick_2/attack_self(mob/user) + APPLY_MOB_PROPERTY(user, PROP_EXAMPLE, src.type, 2) + + Using example_stick_1 gives the user a PROP_EXAMPLE value of 1 if no value existed prior, + or the existing value was smaller than 1. + Using example_stick_2 right after makes the value 2, as 2 is larger than 1[citation needed]. + +To remove: + + REMOVE_MOB_PROPERTY(mob, property, source) + + for example: + + /obj/item/unexample_stick_2/attack_self(mob/user) + REMOVE_MOB_PROPERTY(user, PROP_EXAMPLE, /obj/item/example_stick_2) + + Using unexample_stick_2 returns the value to 1, assuming both sticks have been applied. + + + +PRIORITY PROPERTIES + +The value of a priority property is the value with the largest priority + +To set: + + APPLY_MOB_PROPERTY(mob, property, source, value, priority) + + for example: + + /obj/item/example_stick_1/attack_self(mob/user) + APPLY_MOB_PROPERTY(user, PROP_EXAMPLE, src.type, 1, 100) + + /obj/item/example_stick_2/attack_self(mob/user) + APPLY_MOB_PROPERTY(user, PROP_EXAMPLE, src.type, -300, 200) + + Using example_stick_1 gives the user a PROP_EXAMPLE value of 1 if no value existed prior, + or the existing value came from a priority smaller than 100. + Using example_stick_2 right after makes the value -300, as 200 is a higher priority than + the applied 100. + +To remove: + + REMOVE_MOB_PROPERTY_PRIORITY(mob, property, source) + + for example: + + /obj/item/unexample_stick_2/attack_self(mob/user) + REMOVE_MOB_PROPERTY_PRIORITY(user, PROP_EXAMPLE, /obj/item/example_stick_2) + + Using unexample_stick_2 returns the value to 1, assuming both sticks have been applied. + + +*/ + +// Property defines +// +// These must be defined as macros in the format PROP_(x) x("property key name", MACRO TO APPLY THE PROPERTY, MACRO TO REMOVE THE PROPERTY) + +/* Macros used for testing, left here as examples: + #define PROP_TESTSIMPLE(x) x("test_simple", APPLY_MOB_PROPERTY_SIMPLE, REMOVE_MOB_PROPERTY_SIMPLE) + #define PROP_TESTSUM(x) x("test_sum", APPLY_MOB_PROPERTY_SUM, REMOVE_MOB_PROPERTY_SUM) + #define PROP_TESTMAX(x) x("test_max", APPLY_MOB_PROPERTY_MAX, REMOVE_MOB_PROPERTY_MAX) + #define PROP_TESTPRIO(x) x("test_prio", APPLY_MOB_PROPERTY_PRIORITY, REMOVE_MOB_PROPERTY_PRIORITY) +*/ + +#define PROP_CANTMOVE(x) x("cantmove", APPLY_MOB_PROPERTY_SIMPLE, REMOVE_MOB_PROPERTY_SIMPLE) // Currently-unused example +#define PROP_CANTBUMPSLAM(x) x("cantbumpslam", APPLY_MOB_PROPERTY_SIMPLE, REMOVE_MOB_PROPERTY_SIMPLE) // Used in /mob/living/Bump(atom/A) to have a bumpslam cooldown without another mob var + +// In lieu of comments, these are the indexes used for list access in the macros below. +#define MOB_PROPERTY_ACTIVE_VALUE 1 +#define MOB_PROPERTY_SOURCES_LIST 2 +#define MOB_PROPERTY_PRIORITY_PRIO 1 +#define MOB_PROPERTY_PRIORITY_VALUE 2 + +#define TRIPLE_GET_1ST(a, b, c) a +#define TRIPLE_GET_2ND(a, b, c) b +#define TRIPLE_GET_3RD(a, b, c) c + +#define TRIPLE_1ST(x) x(TRIPLE_GET_1ST) +#define TRIPLE_2ND(x) x(TRIPLE_GET_2ND) +#define TRIPLE_3RD(x) x(TRIPLE_GET_3RD) + +#define APPLY_MOB_PROPERTY(target, property, etc...) TRIPLE_2ND(property)(target, TRIPLE_1ST(property), ##etc) + +#define REMOVE_MOB_PROPERTY(target, property, source) TRIPLE_3RD(property)(target, TRIPLE_1ST(property), source) + +#define GET_MOB_PROPERTY(target, property) (target.mob_properties[TRIPLE_1ST(property)] ? target.mob_properties[TRIPLE_1ST(property)][MOB_PROPERTY_ACTIVE_VALUE] : null) + +// sliiiiiiiightly faster if you don't care about the value +#define HAS_MOB_PROPERTY(target, property) (target.mob_properties[TRIPLE_1ST(property)] ? TRUE : FALSE) + +#define APPLY_MOB_PROPERTY_MAX(target, property, source, value) \ + do { \ + var/list/_L = target.mob_properties; \ + var/_V = value; \ + var/_S = source; \ + if (_L[property]) { \ + _L[property][MOB_PROPERTY_SOURCES_LIST][_S] = _V; \ + if (_L[property][MOB_PROPERTY_ACTIVE_VALUE] < _V) { \ + _L[property][MOB_PROPERTY_ACTIVE_VALUE] = _V; \ + } \ + } else { \ + _L[property] = list(_V, list()); \ + _L[property][MOB_PROPERTY_SOURCES_LIST][_S] = _V; \ + } \ + } while (0) + +#define REMOVE_MOB_PROPERTY_MAX(target, property, source) \ + do { \ + var/list/_L = target.mob_properties; \ + if (_L[property]) { \ + _L[property][MOB_PROPERTY_SOURCES_LIST] -= source; \ + if (!length(_L[property][MOB_PROPERTY_SOURCES_LIST])) { \ + _L -= property; \ + } else { \ + _L[property][MOB_PROPERTY_ACTIVE_VALUE] = -INFINITY; \ + for(var/_S in _L[property][MOB_PROPERTY_SOURCES_LIST]) { \ + if (_L[property][MOB_PROPERTY_ACTIVE_VALUE] < _L[property][MOB_PROPERTY_SOURCES_LIST][_S]) { \ + _L[property][MOB_PROPERTY_ACTIVE_VALUE] = _L[property][MOB_PROPERTY_SOURCES_LIST][_S]; \ + } \ + } \ + } \ + } \ + } while (0) + +#define APPLY_MOB_PROPERTY_SIMPLE(target, property, source) \ + do { \ + var/list/_L = target.mob_properties; \ + var/_S = source; \ + if (_L[property]) { \ + _L[property][MOB_PROPERTY_SOURCES_LIST] |= source; \ + } else { \ + _L[property] = list(1, list(_S)); \ + } \ + } while (0) + +#define REMOVE_MOB_PROPERTY_SIMPLE(target, property, source) \ + do { \ + var/list/_L = target.mob_properties; \ + if (_L[property]) { \ + _L[property][MOB_PROPERTY_SOURCES_LIST] -= source; \ + if (!length(_L[property][MOB_PROPERTY_SOURCES_LIST])) { \ + _L -= property; \ + } \ + } \ + } while (0) + +#define APPLY_MOB_PROPERTY_SUM(target, property, source, value) \ + do { \ + var/list/_L = target.mob_properties; \ + var/_V = value; \ + var/_S = source; \ + if (_L[property]) { \ + if (_L[property][MOB_PROPERTY_SOURCES_LIST][_S]) { \ + _L[property][MOB_PROPERTY_ACTIVE_VALUE] -= _L[property][MOB_PROPERTY_SOURCES_LIST][_S]; \ + _L[property][MOB_PROPERTY_SOURCES_LIST][_S] = _V; \ + _L[property][MOB_PROPERTY_ACTIVE_VALUE] += _V; \ + } else { \ + _L[property][MOB_PROPERTY_SOURCES_LIST][_S] = _V; \ + _L[property][MOB_PROPERTY_ACTIVE_VALUE] += _V; \ + } \ + } else { \ + _L[property] = list(_V, list()); \ + _L[property][MOB_PROPERTY_SOURCES_LIST][_S] = _V; \ + } \ + } while (0) + +#define REMOVE_MOB_PROPERTY_SUM(target, property, source) \ + do { \ + var/list/_L = target.mob_properties; \ + var/_S = source; \ + if (_L[property]) { \ + if (_L[property][MOB_PROPERTY_SOURCES_LIST][_S]) { \ + _L[property][MOB_PROPERTY_ACTIVE_VALUE] -= _L[property][MOB_PROPERTY_SOURCES_LIST][_S]; \ + _L[property][MOB_PROPERTY_SOURCES_LIST] -= _S; \ + } \ + if (!length(_L[property][MOB_PROPERTY_SOURCES_LIST])) { \ + _L -= property; \ + } \ + } \ + } while (0) + +#define APPLY_MOB_PROPERTY_PRIORITY(target, property, source, value, priority) \ + do { \ + var/list/_L = target.mob_properties; \ + var/_V = value; \ + var/_P = priority; \ + var/_S = source; \ + if (_L[property]) { \ + _L[property][MOB_PROPERTY_SOURCES_LIST][_S] = list(_P, _V); \ + if (_L[property][MOB_PROPERTY_ACTIVE_VALUE] != _V) { \ + var/_TO_APPLY_PRIO = -INFINITY; \ + var/_TO_APPLY_VALUE; \ + for (var/_SOURCE in _L[property][MOB_PROPERTY_SOURCES_LIST]) { \ + var/list/_PRIOLIST = _L[property][MOB_PROPERTY_SOURCES_LIST][_SOURCE]; \ + if (_PRIOLIST[MOB_PROPERTY_PRIORITY_PRIO] >= _TO_APPLY_PRIO) { \ + _TO_APPLY_PRIO = _PRIOLIST[MOB_PROPERTY_PRIORITY_PRIO]; \ + _TO_APPLY_VALUE = _PRIOLIST[MOB_PROPERTY_PRIORITY_VALUE]; \ + } \ + } \ + _L[property][MOB_PROPERTY_ACTIVE_VALUE] = _TO_APPLY_VALUE; \ + } \ + } else { \ + _L[property] = list(_V, list()); \ + _L[property][MOB_PROPERTY_SOURCES_LIST][_S] = list(_P, _V); \ + }; \ + } while (0) + +#define REMOVE_MOB_PROPERTY_PRIORITY(target, property, source) \ + do { \ + var/list/_L = target.mob_properties; \ + var/_S = source; \ + if (_L[property]) { \ + var/_S_V = _L[property][MOB_PROPERTY_SOURCES_LIST][_S][MOB_PROPERTY_PRIORITY_VALUE];\ + _L[property][MOB_PROPERTY_SOURCES_LIST] -= source; \ + if (!length(_L[property][MOB_PROPERTY_SOURCES_LIST])) { \ + _L -= property; \ + } else if (_L[property][MOB_PROPERTY_ACTIVE_VALUE] == _S_V) { \ + var/_TO_APPLY_PRIO = -INFINITY; \ + var/_TO_APPLY_VALUE; \ + for (var/_SOURCE in _L[property][MOB_PROPERTY_SOURCES_LIST]) { \ + var/list/_PRIOLIST = _L[property][MOB_PROPERTY_SOURCES_LIST][_SOURCE]; \ + if (_PRIOLIST[MOB_PROPERTY_PRIORITY_PRIO] >= _TO_APPLY_PRIO) { \ + _TO_APPLY_PRIO = _PRIOLIST[MOB_PROPERTY_PRIORITY_PRIO]; \ + _TO_APPLY_VALUE = _PRIOLIST[MOB_PROPERTY_PRIORITY_VALUE]; \ + } \ + } \ + _L[property][MOB_PROPERTY_ACTIVE_VALUE] = _TO_APPLY_VALUE; \ + } \ + } \ + } while (0) diff --git a/code/__DEFINES/_profile.dm b/code/__DEFINES/_profile.dm new file mode 100644 index 0000000000000..1a6a65cacb3aa --- /dev/null +++ b/code/__DEFINES/_profile.dm @@ -0,0 +1,4 @@ +#if DM_BUILD >= 1506 +// We don't actually care about storing the output here, this is just an easy way to ensure the profile runs first. +GLOBAL_REAL_VAR(world_init_profiler) = world.Profile(PROFILE_RESTART) +#endif diff --git a/code/__DEFINES/_tick.dm b/code/__DEFINES/_tick.dm index acb6a699f4aa2..d3572d3545a86 100644 --- a/code/__DEFINES/_tick.dm +++ b/code/__DEFINES/_tick.dm @@ -1,15 +1,33 @@ -#define MAPTICK_MC_MIN_RESERVE 40 //Percentage of tick to leave for master controller to run -#define MAPTICK_LAST_INTERNAL_TICK_USAGE ((GLOB.internal_tick_usage / world.tick_lag) * 100) //internal_tick_usage is updated every tick by extools -#define TICK_LIMIT_RUNNING (max(90 - MAPTICK_LAST_INTERNAL_TICK_USAGE, MAPTICK_MC_MIN_RESERVE)) +//Percentage of tick to leave for master controller to run +#define MAPTICK_MC_MIN_RESERVE 70 +//internal_tick_usage is updated every tick +#if DM_VERSION > 513 +#define MAPTICK_LAST_INTERNAL_TICK_USAGE world.map_cpu +#else +#define MAPTICK_LAST_INTERNAL_TICK_USAGE 50 +#endif + +// 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 +#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/access.dm b/code/__DEFINES/access.dm index ba6e8752767f8..64daf19f56c69 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -30,7 +30,7 @@ #define ACCESS_CARGO 31 #define ACCESS_CONSTRUCTION 32 #define ACCESS_CHEMISTRY 33 -#define ACCESS_BRIGPHYS 34 +#define ACCESS_BRIGPHYS 34 #define ACCESS_HYDROPONICS 35 #define ACCESS_LIBRARY 37 #define ACCESS_LAWYER 38 @@ -42,6 +42,7 @@ #define ACCESS_THEATRE 46 #define ACCESS_RESEARCH 47 #define ACCESS_MINING 48 +#define ACCESS_EXPLORATION 49 #define ACCESS_MAILSORTING 50 #define ACCESS_VAULT 53 #define ACCESS_MINING_STATION 54 @@ -63,6 +64,10 @@ #define ACCESS_WEAPONS 66 //! Weapon authorization for secbots #define ACCESS_NETWORK 67 //! NTnet diagnostics/monitoring software #define ACCESS_CLONING 68 //! Cloning room and clone pod ejection +#define ACCESS_SEC_RECORDS 69 //! Update security records + +/// Room and launching. +#define ACCESS_AUX_BASE 72 //BEGIN CENTCOM ACCESS /*Should leave plenty of room if we need to add more access levels. diff --git a/code/__DEFINES/actionspeed_modification.dm b/code/__DEFINES/actionspeed_modification.dm new file mode 100644 index 0000000000000..40fbd3fe26dcc --- /dev/null +++ b/code/__DEFINES/actionspeed_modification.dm @@ -0,0 +1,2 @@ +//ids +#define ACTIONSPEED_ID_SANITY "sanity_component" diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 4a744619df700..887a4e154d5fa 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -25,10 +25,11 @@ #define R_SPAWN (1<<12) #define R_AUTOADMIN (1<<13) #define R_DBRANKS (1<<14) +#define R_SUPPRESS (1<<15) //GDPR/R5 Compliance #define R_DEFAULT R_AUTOADMIN -#define R_EVERYTHING (1<<15)-1 //the sum of all other rank permissions, used for +EVERYTHING +#define R_EVERYTHING (1<<16)-1 //the sum of all other rank permissions, used for +EVERYTHING #define ADMIN_QUE(user) "(?)" #define ADMIN_FLW(user) "(FLW)" @@ -54,8 +55,8 @@ #define ADMIN_INDIVIDUALLOG(user) "(LOGS)" #define ADMIN_RETRIEVE_BOH_ITEMS(boh) "(RETRIEVE CONSUMED ITEMS)" -#define ADMIN_PUNISHMENT_LIGHTNING "Lightning bolt" -#define ADMIN_PUNISHMENT_BRAINDAMAGE "Brain damage" +#define ADMIN_PUNISHMENT_LIGHTNING "Lightning Bolt" +#define ADMIN_PUNISHMENT_BRAINDAMAGE "Brain Damage" #define ADMIN_PUNISHMENT_GIB "Gib" #define ADMIN_PUNISHMENT_BSA "Bluespace Artillery Device" #define ADMIN_PUNISHMENT_FIREBALL "Fireball" @@ -67,6 +68,11 @@ #define ADMIN_PUNISHMENT_CLUWNE "Make Cluwne" #define ADMIN_PUNISHMENT_NUGGET "Nugget" #define ADMIN_PUNISHMENT_IMMERSE "Fully Immerse" +#define ADMIN_PUNISHMENT_GHOST "Offer To Ghosts" +#define ADMIN_PUNISHMENT_DEMOCRACY "Deadchat Control (Democracy)" +#define ADMIN_PUNISHMENT_ANARCHY "Deadchat Control (Anarchy)" +#define ADMIN_PUNISHMENT_TOE "Stub Toe (Once)" +#define ADMIN_PUNISHMENT_TOEPLUS "Stub Toe (Always)" #define AHELP_UNCLAIMED 1 #define AHELP_ACTIVE 2 @@ -87,3 +93,18 @@ #define POLICY_POLYMORPH "polymorph" //Shown to vicitm of staff of change and related effects. #define POLICY_VERB_HEADER "policy_verb_header" //Shown on top of policy verb window + +// allowed ghost roles this round, starts as everything allowed +GLOBAL_VAR_INIT(ghost_role_flags, (~0)) + +//Flags that control what ways ghosts can get back into the round +//ie fugitives, space dragon, etc. also includes dynamic midrounds as it's the same deal +#define GHOSTROLE_MIDROUND_EVENT (1<<0) +//ie ashwalkers, free golems, beach bums +#define GHOSTROLE_SPAWNER (1<<1) +//ie mind monkeys, sentience potion +#define GHOSTROLE_STATION_SENTIENCE (1<<2) +//ie pais, posibrains +#define GHOSTROLE_SILICONS (1<<3) +//ie mafia, ctf +#define GHOSTROLE_MINIGAME (1<<4) diff --git a/code/__DEFINES/ai.dm b/code/__DEFINES/ai.dm new file mode 100644 index 0000000000000..fcb57f1db8d82 --- /dev/null +++ b/code/__DEFINES/ai.dm @@ -0,0 +1,186 @@ +#define GET_AI_BEHAVIOR(behavior_type) SSai_behaviors.ai_behaviors[behavior_type] +#define HAS_AI_CONTROLLER_TYPE(thing, type) istype(thing?.ai_controller, type) + +#define AI_STATUS_ON 1 +#define AI_STATUS_OFF 2 + + +///Monkey checks +#define SHOULD_RESIST(source) (source.on_fire || source.buckled || source.restrained() || (source.pulledby && source.pulledby.grab_state > GRAB_PASSIVE)) +#define IS_DEAD_OR_INCAP(source) (source.incapacitated() || source.stat) + +///For JPS pathing, the maximum length of a path we'll try to generate. Should be modularized depending on what we're doing later on +#define AI_MAX_PATH_LENGTH 30 // 30 is possibly overkill since by default we lose interest after 14 tiles of distance, but this gives wiggle room for weaving around obstacles + +///Cooldown on planning if planning failed last time + +#define AI_FAILED_PLANNING_COOLDOWN 1.5 SECONDS + +///Flags for ai_behavior new() +#define AI_CONTROLLER_INCOMPATIBLE (1<<0) + +///Does this task require movement from the AI before it can be performed? +#define AI_BEHAVIOR_REQUIRE_MOVEMENT (1<<0) +///Does this task let you perform the action while you move closer? (Things like moving and shooting) +#define AI_BEHAVIOR_MOVE_AND_PERFORM (1<<1) + +///AI flags +#define STOP_MOVING_WHEN_PULLED (1<<0) + +///Subtree defines + +///This subtree should cancel any further planning, (Including from other subtrees) +#define SUBTREE_RETURN_FINISH_PLANNING 1 + +//Generic BB keys +#define BB_CURRENT_MIN_MOVE_DISTANCE "min_move_distance" + +// Monkey AI controller blackboard keys + +#define BB_MONKEY_AGGRESSIVE "BB_monkey_aggressive" +#define BB_MONKEY_GUN_NEURONS_ACTIVATED "BB_monkey_gun_aware" +#define BB_MONKEY_GUN_WORKED "BB_monkey_gun_worked" +#define BB_MONKEY_BEST_FORCE_FOUND "BB_monkey_bestforcefound" +#define BB_MONKEY_ENEMIES "BB_monkey_enemies" +#define BB_MONKEY_BLACKLISTITEMS "BB_monkey_blacklistitems" +#define BB_MONKEY_PICKUPTARGET "BB_monkey_pickuptarget" +#define BB_MONKEY_PICKPOCKETING "BB_monkey_pickpocketing" +#define BB_MONKEY_CURRENT_ATTACK_TARGET "BB_monkey_current_attack_target" +#define BB_MONKEY_CURRENT_PRESS_TARGET "BB_monkey_current_press_target" +#define BB_MONKEY_CURRENT_GIVE_TARGET "BB_monkey_current_give_target" +#define BB_MONKEY_TARGET_DISPOSAL "BB_monkey_target_disposal" +#define BB_MONKEY_DISPOSING "BB_monkey_disposing" +#define BB_MONKEY_RECRUIT_COOLDOWN "BB_monkey_recruit_cooldown" +#define BB_MONKEY_NEXT_HUNGRY "BB_monkey_next_hungry" + + +///Haunted item controller defines + +///Chance for haunted item to haunt someone +#define HAUNTED_ITEM_ATTACK_HAUNT_CHANCE 10 +///Chance for haunted item to try to get itself let go. +#define HAUNTED_ITEM_ESCAPE_GRASP_CHANCE 20 +///Chance for haunted item to warp somewhere new +#define HAUNTED_ITEM_TELEPORT_CHANCE 4 +///Amount of aggro you get when picking up a haunted item +#define HAUNTED_ITEM_AGGRO_ADDITION 2 + +///Blackboard keys for haunted items +#define BB_TO_HAUNT_LIST "BB_to_haunt_list" +///Actual mob the item is haunting at the moment +#define BB_HAUNT_TARGET "BB_haunt_target" +///Amount of successful hits in a row this item has had +#define BB_HAUNTED_THROW_ATTEMPT_COUNT "BB_haunted_throw_attempt_count" + +///Cursed item controller defines + +//defines +///how far a cursed item will still try to chase a target +#define CURSED_VIEW_RANGE 7 +#define CURSED_ITEM_TELEPORT_CHANCE 4 +//blackboards + +///Actual mob the item is haunting at the moment +#define BB_CURSE_TARGET "BB_haunt_target" +///Where the item wants to land on +#define BB_TARGET_SLOT "BB_target_slot" +///Amount of successful hits in a row this item has had +#define BB_CURSED_THROW_ATTEMPT_COUNT "BB_cursed_throw_attempt_count" + +///Vending machine AI controller blackboard keys +#define BB_VENDING_CURRENT_TARGET "BB_vending_current_target" +#define BB_VENDING_TILT_COOLDOWN "BB_vending_tilt_cooldown" +#define BB_VENDING_UNTILT_COOLDOWN "BB_vending_untilt_cooldown" +#define BB_VENDING_BUSY_TILTING "BB_vending_busy_tilting" +#define BB_VENDING_LAST_HIT_SUCCESFUL "BB_vending_last_hit_succesful" + +///Robot customer AI controller blackboard keys +#define BB_CUSTOMER_CURRENT_ORDER "BB_customer_current_order" +#define BB_CUSTOMER_MY_SEAT "BB_customer_my_seat" +#define BB_CUSTOMER_PATIENCE "BB_customer_patience" +#define BB_CUSTOMER_CUSTOMERINFO "BB_customer_customerinfo" +#define BB_CUSTOMER_EATING "BB_customer_eating" +#define BB_CUSTOMER_ATTENDING_VENUE "BB_customer_attending_avenue" +#define BB_CUSTOMER_LEAVING "BB_customer_leaving" +#define BB_CUSTOMER_CURRENT_TARGET "BB_customer_current_target" +/// Robot customer has said their can't find seat line at least once. Used to rate limit how often they'll complain after the first time. +#define BB_CUSTOMER_SAID_CANT_FIND_SEAT_LINE "BB_customer_said_cant_find_seat_line" + + +///Hostile AI controller blackboard keys +#define BB_HOSTILE_ORDER_MODE "BB_HOSTILE_ORDER_MODE" +#define BB_HOSTILE_FRIEND "BB_HOSTILE_FRIEND" +#define BB_HOSTILE_ATTACK_WORD "BB_HOSTILE_ATTACK_WORD" +#define BB_FOLLOW_TARGET "BB_FOLLOW_TARGET" +#define BB_ATTACK_TARGET "BB_ATTACK_TARGET" +#define BB_VISION_RANGE "BB_VISION_RANGE" + +/// Basically, what is our vision/hearing range. +#define BB_HOSTILE_VISION_RANGE 10 +/// After either being given a verbal order or a pointing order, ignore further of each for this duration +#define AI_HOSTILE_COMMAND_COOLDOWN 2 SECONDS + +// hostile command modes (what pointing at something/someone does depending on the last order the carp heard) +/// Don't do anything (will still react to stuff around them though) +#define HOSTILE_COMMAND_NONE 0 +/// Will attack a target. +#define HOSTILE_COMMAND_ATTACK 1 +/// Will follow a target. +#define HOSTILE_COMMAND_FOLLOW 2 + +///Dog AI controller blackboard keys + +#define BB_SIMPLE_CARRY_ITEM "BB_SIMPLE_CARRY_ITEM" +#define BB_FETCH_TARGET "BB_FETCH_TARGET" +#define BB_FETCH_IGNORE_LIST "BB_FETCH_IGNORE_LISTlist" +#define BB_FETCH_DELIVER_TO "BB_FETCH_DELIVER_TO" +#define BB_DOG_FRIENDS "BB_DOG_FRIENDS" +#define BB_DOG_ORDER_MODE "BB_DOG_ORDER_MODE" +#define BB_DOG_PLAYING_DEAD "BB_DOG_PLAYING_DEAD" +#define BB_DOG_HARASS_TARGET "BB_DOG_HARASS_TARGET" + +/// Basically, what is our vision/hearing range for picking up on things to fetch/ +#define AI_DOG_VISION_RANGE 10 +/// What are the odds someone petting us will become our friend? +#define AI_DOG_PET_FRIEND_PROB 15 +/// After this long without having fetched something, we clear our ignore list +#define AI_FETCH_IGNORE_DURATION 30 SECONDS +/// After being ordered to heel, we spend this long chilling out +#define AI_DOG_HEEL_DURATION 20 SECONDS +/// After either being given a verbal order or a pointing order, ignore further of each for this duration +#define AI_DOG_COMMAND_COOLDOWN 2 SECONDS + +// dog command modes (what pointing at something/someone does depending on the last order the dog heard) +/// Don't do anything (will still react to stuff around them though) +#define DOG_COMMAND_NONE 0 +/// Will try to pick up and bring back whatever you point to +#define DOG_COMMAND_FETCH 1 +/// Will get within a few tiles of whatever you point at and continually growl/bark. If the target is a living mob who gets too close, the dog will attack them with bites +#define DOG_COMMAND_ATTACK 2 + +//enumerators for parsing command speech +#define COMMAND_HEEL "Heel" +#define COMMAND_FETCH "Fetch" +#define COMMAND_FOLLOW "Follow" +#define COMMAND_STOP "Stop" +#define COMMAND_ATTACK "Attack" +#define COMMAND_DIE "Play Dead" + +///bane ai +#define BB_BANE_BATMAN "BB_bane_batman" +//yep thats it + + +//Hunting defines +#define SUCCESFUL_HUNT_COOLDOWN 5 SECONDS + +///Hunting BB keys +#define BB_CURRENT_HUNTING_TARGET "BB_current_hunting_target" +#define BB_HUNTING_COOLDOWN "BB_HUNTING_COOLDOWN" + +///Basic Mob Keys + +///Targetting subtrees +#define BB_BASIC_MOB_CURRENT_TARGET "BB_basic_current_target" +#define BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION "BB_basic_current_target_hiding_location" +#define BB_TARGETTING_DATUM "targetting_datum" diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index ec82e8220c1f1..fd9bbb5edc28d 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -32,11 +32,6 @@ #define BLOB_REFLECTOR_COST 15 #define BLOB_STRAIN_COLOR_LIST list("#BE5532", "#7D6EB4", "#EC8383", "#00E5B1", "#00668B", "#FFF68", "#BBBBAA", "#CD7794", "#57787B", "#3C6EC8", "#AD6570", "#823ABB") -//Shuttle hijacking -#define HIJACK_NEUTRAL 0 //Does not stop hijacking but itself won't hijack -#define HIJACK_HIJACKER 1 //Needs to be present for shuttle to be hijacked -#define HIJACK_PREVENT 2 //Prevents hijacking same way as non-antags - //Overthrow time to update heads obj #define OBJECTIVE_UPDATING_TIME 300 @@ -52,6 +47,14 @@ #define MAX_LEADERS_GANG 3 #define INITIAL_DOM_ATTEMPTS 3 +//Shuttle elimination hijacking +/// Does not stop elimination hijacking but itself won't elimination hijack +#define ELIMINATION_NEUTRAL 0 +/// Needs to be present for shuttle to be elimination hijacked +#define ELIMINATION_ENABLED 1 +/// Prevents elimination hijack same way as non-antags +#define ELIMINATION_PREVENT 2 + //Syndicate Contracts #define CONTRACT_STATUS_INACTIVE 1 #define CONTRACT_STATUS_ACTIVE 2 @@ -81,3 +84,6 @@ #define PATH_ASH "Ash" #define PATH_RUST "Rust" #define PATH_FLESH "Flesh" + +/// How much does it cost to reroll strains? +#define BLOB_REROLL_COST 40 diff --git a/code/__DEFINES/aquarium.dm b/code/__DEFINES/aquarium.dm new file mode 100644 index 0000000000000..6ba410fa8afc0 --- /dev/null +++ b/code/__DEFINES/aquarium.dm @@ -0,0 +1,28 @@ +#define AQUARIUM_ANIMATION_FISH_SWIM "fish" +#define AQUARIUM_ANIMATION_FISH_DEAD "dead" + +#define AQUARIUM_PROPERTIES_PX_MIN "px_min" +#define AQUARIUM_PROPERTIES_PX_MAX "px_max" +#define AQUARIUM_PROPERTIES_PY_MIN "py_min" +#define AQUARIUM_PROPERTIES_PY_MAX "py_max" + +#define AQUARIUM_LAYER_MODE_BOTTOM "bottom" +#define AQUARIUM_LAYER_MODE_TOP "top" +#define AQUARIUM_LAYER_MODE_AUTO "auto" + +#define FISH_ALIVE "alive" +#define FISH_DEAD "dead" + +#define MIN_AQUARIUM_TEMP T0C +#define MAX_AQUARIUM_TEMP T0C + 100 +#define DEFAULT_AQUARIUM_TEMP 300 + +#define FISH_RARITY_BASIC 1000 +#define FISH_RARITY_RARE 400 +#define FISH_RARITY_VERY_RARE 200 +#define FISH_RARITY_GOOD_LUCK_FINDING_THIS 1 + +#define AQUARIUM_FLUID_FRESHWATER "Freshwater" +#define AQUARIUM_FLUID_SALTWATER "Saltwater" +#define AQUARIUM_FLUID_SULPHWATEVER "Sulphuric Water" +#define AQUARIUM_FLUID_AIR "Air" \ No newline at end of file diff --git a/code/__DEFINES/areas.dm b/code/__DEFINES/areas.dm new file mode 100644 index 0000000000000..3f9c786e7d505 --- /dev/null +++ b/code/__DEFINES/areas.dm @@ -0,0 +1,8 @@ + +//THE SMALLEST NUMBER HERE WILL BE THE MAXIMUM Z-LEVEL SS13 CAN LOAD BEFORE BUGS. +//Its super unlikely >1000 z-levels are loaded + +#define WARPED_ROOM_VIRTUAL_Z 1000 +#define REALITY_TEAR_VIRTUAL_Z -999999 +//The number virtual Z stats counting from +#define VIRTUAL_Z_START 1100 diff --git a/code/__DEFINES/art.dm b/code/__DEFINES/art.dm new file mode 100644 index 0000000000000..473f7f3565e99 --- /dev/null +++ b/code/__DEFINES/art.dm @@ -0,0 +1,5 @@ + +///tgui tab portrait categories- they're the same across all portrait tguis. +#define TAB_LIBRARY 1 +#define TAB_SECURE 2 +#define TAB_PRIVATE 3 diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index e1bbd35fb0ce4..0e4912c661dcd 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -1,15 +1,3 @@ -//LISTMOS -//indices of values in gas lists. -#define MOLES 1 -#define ARCHIVE 2 -#define GAS_META 3 -#define META_GAS_SPECIFIC_HEAT 1 -#define META_GAS_NAME 2 -#define META_GAS_MOLES_VISIBLE 3 -#define META_GAS_OVERLAY 4 -#define META_GAS_DANGER 5 -#define META_GAS_ID 6 -#define META_GAS_FUSION_POWER 7 //ATMOS //stuff you should probably leave well alone! #define R_IDEAL_GAS_EQUATION 8.31 //! kPa*L/(K*mol) @@ -127,9 +115,13 @@ //PIPES //Atmos pipe limits -#define MAX_OUTPUT_PRESSURE 4500 //! (kPa) What pressure pumps and powered equipment max out at. -#define MAX_TRANSFER_RATE 200 //! (L/s) Maximum speed powered equipment can work at. -#define VOLUME_PUMP_LEAK_AMOUNT 0.1 //! 10% of an overclocked volume pump leaks into the air +/// (kPa) What pressure pumps and powered equipment max out at. +#define MAX_OUTPUT_PRESSURE 4500 +/// (L/s) Maximum speed powered equipment can work at. +#define MAX_TRANSFER_RATE 200 +/// How many percent of the contents that an overclocked volume pumps leak into the air +#define VOLUME_PUMP_LEAK_AMOUNT 0.1 + //used for device_type vars #define UNARY 1 #define BINARY 2 @@ -161,7 +153,6 @@ #define TCOMMS_ATMOS "n2=100;TEMP=80" //-193,15°C telecommunications. also used for xenobiology slime killrooms #define AIRLESS_ATMOS "TEMP=2.7" //space #define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15°C snow and ice turfs -#define KITCHEN_COLDROOM_ATMOS "o2=25;n2=96;TEMP=253.15" //-20°C kitchen coldroom; higher amount of mol to reach about 101.3 kpA #define BURNMIX_ATMOS "o2=100;plasma=200;TEMP=370" //used in the holodeck burn test program //ATMOSPHERICS DEPARTMENT GAS TANK TURFS @@ -174,9 +165,10 @@ //LAVALAND #define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 90 //! what pressure you have to be under to increase the effect of equipment meant for lavaland +#define LAVALAND_DEFAULT_ATMOS "o2=14;n2=5;co2=13;TEMP=300" //ATMOS MIX IDS -#define LAVALAND_DEFAULT_ATMOS "LAVALAND_ATMOS" +//Lavaland used to live here. That was a mistake. //ATMOSIA GAS MONITOR TAGS #define ATMOS_GAS_MONITOR_INPUT_O2 "o2_in" @@ -270,6 +262,24 @@ #define PIPING_DEFAULT_LAYER_ONLY (1<<2) //! can only exist at PIPING_LAYER_DEFAULT #define PIPING_CARDINAL_AUTONORMALIZE (1<<3) //! north/south east/west doesn't matter, auto normalize on build. +// Gas defines because i hate typepaths +#define GAS_O2 "o2" +#define GAS_N2 "n2" +#define GAS_CO2 "co2" +#define GAS_PLASMA "plasma" +#define GAS_H2O "water_vapor" +#define GAS_HYPERNOB "nob" +#define GAS_NITROUS "n2o" +#define GAS_NITRYL "no2" +#define GAS_TRITIUM "tritium" +#define GAS_BZ "bz" +#define GAS_STIMULUM "stim" +#define GAS_PLUOXIUM "pluox" +#define GAS_MIASMA "miasma" + +#define GAS_FLAG_DANGEROUS (1<<0) +#define GAS_FLAG_BREATH_PROC (1<<1) + //HELPERS #define PIPING_LAYER_SHIFT(T, PipingLayer) \ if(T.dir & (NORTH|SOUTH)) { \ @@ -290,17 +300,6 @@ GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0)) #define CALCULATE_ADJACENT_TURFS(T) SSadjacent_air.queue[T] = 1 #endif -GLOBAL_VAR(atmos_extools_initialized) // this must be an uninitialized (null) one or init_monstermos will be called twice because reasons -#define ATMOS_EXTOOLS_CHECK if(!GLOB.atmos_extools_initialized){\ - GLOB.atmos_extools_initialized=TRUE;\ - if(fexists(EXTOOLS)){\ - var/result = call(EXTOOLS,"init_monstermos")();\ - if(result != "ok") {CRASH(result);}\ - } else {\ - CRASH("byond-extools.dll or libbyond-extools.so does not exist!");\ - }\ -} - GLOBAL_LIST_INIT(pipe_paint_colors, sortList(list( "amethyst" = rgb(130,43,255), //supplymain "blue" = rgb(0,0,255), @@ -316,6 +315,11 @@ GLOBAL_LIST_INIT(pipe_paint_colors, sortList(list( "yellow" = rgb(255,198,0) ))) +//ROT MIASMA #define MIASMA_CORPSE_MOLES 0.02 #define MIASMA_GIBS_MOLES 0.005 -#define MIASMA_HYGIENE_MOLES 0.002 + +//PIPENET UPDATE STATUS +#define PIPENET_UPDATE_STATUS_DORMANT 0 +#define PIPENET_UPDATE_STATUS_REACT_NEEDED 1 +#define PIPENET_UPDATE_STATUS_RECONCILE_NEEDED 2 diff --git a/code/__DEFINES/balloon_alert.dm b/code/__DEFINES/balloon_alert.dm new file mode 100644 index 0000000000000..531be3623d33b --- /dev/null +++ b/code/__DEFINES/balloon_alert.dm @@ -0,0 +1,6 @@ +/// Only balloon alerts +#define BALLOON_ALERT_ALWAYS "Only balloon alerts" +/// Balloon alerts with chat output +#define BALLOON_ALERT_WITH_CHAT "Balloon alerts with chat" +/// No balloon alerts, only chat +#define BALLOON_ALERT_NEVER "Chat only" diff --git a/code/__DEFINES/bitfields.dm b/code/__DEFINES/bitfields.dm new file mode 100644 index 0000000000000..19a962fbffe5f --- /dev/null +++ b/code/__DEFINES/bitfields.dm @@ -0,0 +1,4 @@ +#define DEFINE_BITFIELD(_variable, _flags) /datum/bitfield/##_variable { \ + flags = ##_flags; \ + variable = #_variable; \ +} diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm index 0fbd138b9adc5..e5944472667bf 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -13,23 +13,54 @@ #define STYLE_GONDOLA 13 #define STYLE_SEETHROUGH 14 -#define POD_ICON_STATE 1 -#define POD_NAME 2 -#define POD_DESC 3 - -#define POD_STYLES list(\ - list("supplypod", "supply pod", "A Nanotrasen supply drop pod."),\ - list("bluespacepod", "bluespace supply pod" , "A Nanotrasen Bluespace supply pod. Teleports back to CentCom after delivery."),\ - list("centcompod", "\improper Centcom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to Centcom after delivery."),\ - list("syndiepod", "blood-red supply pod", "A dark, intimidating supply pod, covered in the blood-red markings of the Syndicate. It's probably best to stand back from this."),\ - list("squadpod", "\improper MK. II supply pod", "A Nanotrasen supply pod. This one has been marked the markings of some sort of elite strike team."),\ - list("cultpod", "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."),\ - list("missilepod", "cruise missile", "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ - list("smissilepod", "\improper Syndicate cruise missile", "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ - list("boxpod", "\improper Aussec supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Aussec Armory - 2532' engraved on the side."),\ - list("honkpod", "\improper HONK pod", "A brightly-colored supply pod. It likely originated from the Clown Federation."),\ - list("fruitpod", "\improper Orange", "An angry orange."),\ - 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 MAX_EMAG_ROCKETS 8 +#define BEACON_COST 500 +#define SP_LINKED 1 +#define SP_READY 2 +#define SP_LAUNCH 3 +#define SP_UNLINK 4 +#define SP_UNREADY 5 +#define ORDER_COOLDOWN (10 SECONDS) + +#define POD_SHAPE 1 +#define POD_BASE 2 +#define POD_DOOR 3 +#define POD_DECAL 4 +#define POD_GLOW 5 +#define POD_RUBBLE_TYPE 6 +#define POD_NAME 7 +#define POD_DESC 8 + +#define RUBBLE_NONE 1 +#define RUBBLE_NORMAL 2 +#define RUBBLE_WIDE 3 +#define RUBBLE_THIN 4 + +#define POD_SHAPE_NORML 1 +#define POD_SHAPE_OTHER 2 + +#define POD_TRANSIT "1" +#define POD_FALLING "2" +#define POD_OPENING "3" +#define POD_LEAVING "4" + +#define SUPPLYPOD_X_OFFSET -16 + +GLOBAL_LIST_EMPTY(supplypod_loading_bays) + +GLOBAL_LIST_INIT(podstyles, list(\ + list(POD_SHAPE_NORML, "pod", TRUE, "default", "yellow", RUBBLE_NORMAL, "supply pod", "A Nanotrasen supply drop pod."),\ + list(POD_SHAPE_NORML, "advpod", TRUE, "bluespace", "blue", RUBBLE_NORMAL, "bluespace supply pod" , "A Nanotrasen Bluespace supply pod. Teleports back to CentCom after delivery."),\ + list(POD_SHAPE_NORML, "advpod", TRUE, "centcom", "blue", RUBBLE_NORMAL, "\improper CentCom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to CentCom after delivery."),\ + list(POD_SHAPE_NORML, "darkpod", TRUE, "syndicate", "red", RUBBLE_NORMAL, "blood-red supply pod", "An intimidating supply pod, covered in the blood-red markings of the Syndicate. It's probably best to stand back from this."),\ + list(POD_SHAPE_NORML, "darkpod", TRUE, "deathsquad", "blue", RUBBLE_NORMAL, "\improper Deathsquad drop pod", "A Nanotrasen drop pod. This one has been marked the markings of Nanotrasen's elite strike team."),\ + list(POD_SHAPE_NORML, "pod", TRUE, "cultist", "red", RUBBLE_NORMAL, "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."),\ + list(POD_SHAPE_OTHER, "missile", FALSE, FALSE, FALSE, RUBBLE_THIN, "cruise missile", "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ + list(POD_SHAPE_OTHER, "smissile", FALSE, FALSE, FALSE, RUBBLE_THIN, "\improper Syndicate cruise missile", "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ + list(POD_SHAPE_OTHER, "box", TRUE, FALSE, FALSE, RUBBLE_WIDE, "\improper Aussec supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Aussec Armory - 2532' engraved on the side."),\ + list(POD_SHAPE_NORML, "clownpod", TRUE, "clown", "green", RUBBLE_NORMAL, "\improper HONK pod", "A brightly-colored supply pod. It likely originated from the Clown Federation."),\ + list(POD_SHAPE_OTHER, "orange", TRUE, FALSE, FALSE, RUBBLE_NONE, "\improper Orange", "An angry orange."),\ + list(POD_SHAPE_OTHER, FALSE, FALSE, FALSE, FALSE, RUBBLE_NONE, "\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(POD_SHAPE_OTHER, "gondola", FALSE, FALSE, FALSE, RUBBLE_NONE, "gondola", "The silent walker. This one seems to be part of a delivery agency."),\ + list(POD_SHAPE_OTHER, FALSE, FALSE, FALSE, FALSE, RUBBLE_NONE, FALSE, FALSE, "rl_click", "give_po")\ +)) diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index 1efaf96e5ee76..acfcc1c5056a6 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -31,5 +31,6 @@ #define CONVERSION_WARNING_CRITIAL 3 //Name types -#define CLOCKCULT_MASTER 1 -#define CLOCKCULT_RECRUIT 0 +#define CLOCKCULT_PREFIX_EMINENCE 2 +#define CLOCKCULT_PREFIX_MASTER 1 +#define CLOCKCULT_PREFIX_RECRUIT 0 diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 1953651125f00..3e17e68e099d8 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -13,6 +13,7 @@ #define COLOR_FLOORTILE_GRAY "#8D8B8B" #define COLOR_ALMOST_BLACK "#333333" #define COLOR_BLACK "#000000" +#define COLOR_HALF_TRANSPARENT_BLACK "#0000007A" #define COLOR_RED "#FF0000" #define COLOR_RED_LIGHT "#FF3333" #define COLOR_MAROON "#800000" @@ -58,3 +59,16 @@ #define COLOR_ASSEMBLY_LBLUE "#5D99BE" #define COLOR_ASSEMBLY_BLUE "#38559E" #define COLOR_ASSEMBLY_PURPLE "#6F6192" + +//Colours used by blood brothers +#define COLOR_LIST_BLOOD_BROTHERS list(\ + "#FF5050",\ + "#D977FD",\ + "#422ED8",\ + "#2D87A1",\ + "#3ED8FD",\ + "#0EF5CE",\ + "#0DF447",\ + "#D6B20C",\ + "#FF902A",\ +) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 45f441e3a90f3..034ac1efa09dc 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -107,6 +107,7 @@ //the define for visible message range in combat #define COMBAT_MESSAGE_RANGE 3 +#define DEFAULT_MESSAGE_RANGE 7 //Shove knockdown lengths (deciseconds) #define SHOVE_KNOCKDOWN_SOLID 30 @@ -125,15 +126,38 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( // 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) -#define EMBEDDED_PAIN_MULTIPLIER 2 //! Coefficient of multiplication for the damage the item does while embedded `(this*item.w_class)` -#define EMBEDDED_FALL_PAIN_MULTIPLIER 5 //! Coefficient of multiplication for the damage the item does when it falls out `(this*item.w_class)` -#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 30 //! A Time in ticks, total removal `time = (this*item.w_class)` +#define EMBEDDED_PAIN_CHANCE 15 +///Chance for embedded object to fall out (causing pain but removing the object) +#define EMBEDDED_ITEM_FALLOUT 5 +///Chance for an object to embed into somebody when thrown +#define EMBED_CHANCE 45 +///Coefficient of multiplication for the damage the item does while embedded (this*item.w_class) +#define EMBEDDED_PAIN_MULTIPLIER 2 +///Coefficient of multiplication for the maximum damage the item can do while embedded (this * item.w_class) +#define EMBEDDED_MAX_DAMAGE_MULTIPLIER 5 +///The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1) +#define EMBED_THROWSPEED_THRESHOLD 4 +///Coefficient of multiplication for the damage the item does when it falls out or is removed without a surgery (this*item.w_class) +#define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 6 +///A Time in ticks, total removal time = (this*item.w_class) +#define EMBEDDED_UNSAFE_REMOVAL_TIME 30 +///Chance for embedded objects to cause pain every time they move (jostle) +#define EMBEDDED_JOSTLE_CHANCE 5 +///Coefficient of multiplication for the damage the item does while +#define EMBEDDED_JOSTLE_PAIN_MULTIPLIER 1 +///This percentage of all pain will be dealt as stam damage rather than brute (0-1) +#define EMBEDDED_PAIN_STAM_PCT 0.0 +///For thrown weapons, every extra speed it's thrown at above its normal throwspeed will add this to the embed chance +#define EMBEDDED_CHANCE_SPEED_BONUS 10 +///The point at which embeds are fully blocked. +///Anything under will linearly decrease the embed chance. +///If the armour on the limb against melee is greater than the armour block, the embed will fail. +#define EMBEDDED_ARMOUR_BLOCK 50 + +#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 @@ -148,10 +172,15 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define BOLT_TYPE_OPEN 2 #define BOLT_TYPE_NO_BOLT 3 #define BOLT_TYPE_LOCKING 4 +#define BOLT_TYPE_PUMP 5 //Requires 2 hands to pump, but standard // Sawn off nerfs #define SAWN_OFF_ACC_PENALTY 25 #define SAWN_OFF_RECOIL 1 +#define SUPPRESSED_NONE 0 +#define SUPPRESSED_QUIET 1 ///standard suppressed +#define SUPPRESSED_VERY 2 /// no message + // Projectile Reflect #define REFLECT_NORMAL (1<<0) #define REFLECT_FAKEPROJECTILE (1<<1) @@ -214,3 +243,5 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #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. + +#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 diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm deleted file mode 100644 index 6328a9d8ea8ca..0000000000000 --- a/code/__DEFINES/components.dm +++ /dev/null @@ -1,373 +0,0 @@ -#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) ) - -#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) ) - -#define COMPONENT_INCOMPATIBLE 1 -#define COMPONENT_NOTRANSFER 2 - -#define ELEMENT_INCOMPATIBLE 1 //! Return value to cancel attaching - -// /datum/element flags -/// Causes the detach proc to be called when the host object is being deleted -#define ELEMENT_DETACH (1 << 0) -/** - * Only elements created with the same arguments given after `id_arg_index` share an element instance - * The arguments are the same when the text and number values are the same and all other values have the same ref - */ -#define ELEMENT_BESPOKE (1 << 1) - -// How multiple components of the exact same type are handled in the same datum - -#define COMPONENT_DUPE_HIGHLANDER 0 //! old component is deleted (default) -#define COMPONENT_DUPE_ALLOWED 1 //! duplicates allowed -#define COMPONENT_DUPE_UNIQUE 2 //! new component is deleted -#define COMPONENT_DUPE_UNIQUE_PASSARGS 4 //! old component is given the initialization args of the new - -// All signals. Format: -// When the signal is called: (signal arguments) -// All signals send the source datum of the signal as the first argument - -// global signals -// These are signals which can be listened to by any component on any parent -// start global signals with "!", this used to be necessary but now it's just a formatting choice -#define COMSIG_GLOB_NEW_Z "!new_z" //! from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args) -#define COMSIG_GLOB_VAR_EDIT "!var_edit" //! called after a successful var edit somewhere in the world: (list/args) -#define COMSIG_GLOB_MOB_CREATED "!mob_created" //! mob was created somewhere : (mob) -#define COMSIG_GLOB_MOB_DEATH "!mob_death" //! mob died somewhere : (mob , gibbed) -#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special" //! global living say plug - use sparingly: (mob/speaker , message) - -////////////////////////////////////////////////////////////////// - -// /datum signals -#define COMSIG_COMPONENT_ADDED "component_added" //! when a component is added to a datum: (/datum/component) -#define COMSIG_COMPONENT_REMOVING "component_removing" //! before a component is removed from a datum because of RemoveComponent: (/datum/component) -#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted" //! before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation -#define COMSIG_PARENT_QDELETING "parent_qdeleting" //! just before a datum's Destroy() is called: (force), at this point none of the other components chose to interrupt qdel and Destroy will be called - -// /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_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 - #define EXAMINE_POSITION_BEFORE 2 - //End positions - #define COMPONENT_EXNAME_CHANGED 1 -#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon" //from base of atom/update_icon(): () - #define COMSIG_ATOM_NO_UPDATE_ICON_STATE 1 -#define COMSIG_ATOM_ENTERED "atom_entered" //! from base of atom/Entered(): (atom/movable/entering, /atom) -#define COMSIG_ATOM_EXIT "atom_exit" //! from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc) - #define COMPONENT_ATOM_BLOCK_EXIT 1 -#define COMSIG_ATOM_EXITED "atom_exited" //! from base of atom/Exited(): (atom/movable/exiting, atom/newloc) -#define COMSIG_ATOM_EX_ACT "atom_ex_act" //! from base of atom/ex_act(): (severity, target) -#define COMSIG_ATOM_BUMPED "atom_bumped" //from base of atom/Bumped(): (/atom/movable) -#define COMSIG_ATOM_EMP_ACT "atom_emp_act" //! from base of atom/emp_act(): (severity) -#define COMSIG_ATOM_FIRE_ACT "atom_fire_act" //! from base of atom/fire_act(): (exposed_temperature, exposed_volume) -#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act" //! from base of atom/bullet_act(): (/obj/item/projectile, def_zone) -#define COMSIG_ATOM_BLOB_ACT "atom_blob_act" //! from base of atom/blob_act(): (/obj/structure/blob) -#define COMSIG_ATOM_ACID_ACT "atom_acid_act" //! from base of atom/acid_act(): (acidpwr, acid_volume) -#define COMSIG_ATOM_EMAG_ACT "atom_emag_act" //! from base of atom/emag_act(): () -#define COMSIG_ATOM_RAD_ACT "atom_rad_act" //! from base of atom/rad_act(intensity) -#define COMSIG_ATOM_NARSIE_ACT "atom_narsie_act" //! from base of atom/narsie_act(): () -#define COMSIG_ATOM_RATVAR_ACT "atom_ratvar_act" //! from base of atom/ratvar_act(): () -#define COMSIG_ATOM_EMINENCE_ACT "atom_eminence_act" //! from base of atom/eminence_act(): () -#define COMSIG_ATOM_RCD_ACT "atom_rcd_act" //! from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode) -#define COMSIG_ATOM_TELEPORT_ACT "atom_teleport_act" //! from base of atom/teleport_act(): () -#define COMSIG_ATOM_EXTRAPOLATOR_ACT "atom_extrapolator_act" //! from base of atom/Exited(): (mob/user, var/obj/item/extrapolator/E, scan = TRUE) -#define COMSIG_ATOM_SING_PULL "atom_sing_pull" //! from base of atom/singularity_pull(): (S, current_size) -#define COMSIG_ATOM_BSA_BEAM "atom_bsa_beam_pass" //from obj/machinery/bsa/full/proc/fire(): () - #define COMSIG_ATOM_BLOCKS_BSA_BEAM 1 -#define COMSIG_ATOM_SET_LIGHT "atom_set_light" //! from base of atom/set_light(): (l_range, l_power, l_color) -#define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" //! from base of atom/setDir(): (old_dir, new_dir) -#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del" //! from base of atom/handle_atom_del(): (atom/deleted) -#define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity" //! from base of atom/has_gravity(): (turf/location, list/forced_gravities) -#define COMSIG_ATOM_RAD_PROBE "atom_rad_probe" //! from proc/get_rad_contents(): () - #define COMPONENT_BLOCK_RADIATION 1 -#define COMSIG_ATOM_RAD_CONTAMINATING "atom_rad_contam" //! from base of datum/radiation_wave/radiate(): (strength) - #define COMPONENT_BLOCK_CONTAMINATION 1 -#define COMSIG_ATOM_RAD_WAVE_PASSING "atom_rad_wave_pass" //! from base of datum/radiation_wave/check_obstructions(): (datum/radiation_wave, width) - #define COMPONENT_RAD_WAVE_HANDLED 1 -#define COMSIG_ATOM_CANREACH "atom_can_reach" //! from internal loop in atom/movable/proc/CanReach(): (list/next) - #define COMPONENT_BLOCK_REACH 1 -#define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act" //! from base of atom/screwdriver_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport" //! called when teleporting into a protected turf: (channel, turf/origin) - #define COMPONENT_BLOCK_TELEPORT 1 -///from base of atom/update_overlays(): (list/new_overlays) -#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays" -///////////////// -#define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" //! from base of atom/attack_ghost(): (mob/dead/observer/ghost) -#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" //! from base of atom/attack_hand(): (mob/user) -#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" //! from base of atom/attack_paw(): (mob/user) - #define COMPONENT_NO_ATTACK_HAND 1 //works on all 3. -//This signal return value bitflags can be found in __DEFINES/misc.dm -#define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact" //called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels) - -///////////////// - -#define COMSIG_AREA_POWER_CHANGE "area_power_change" //! from base of area/proc/power_change(): () -#define COMSIG_ENTER_AREA "enter_area" //! from base of area/Entered(): (/area) -#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_CTRL "ctrl_click" //! from base of atom/CtrlClickOn(): (/mob) -#define COMSIG_CLICK_ALT "alt_click" //! from base of atom/AltClick(): (/mob) -#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //! from base of atom/CtrlShiftClick(/mob) -#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" //! from base of atom/MouseDrop(): (/atom/over, /mob/user) - #define COMPONENT_NO_MOUSEDROP 1 -#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //! from base of atom/MouseDrop_T: (/atom/from, /mob/user) - -// /area signals -#define COMSIG_AREA_ENTERED "area_entered" //! from base of area/Entered(): (atom/movable/M) -#define COMSIG_AREA_EXITED "area_exited" //! from base of area/Exited(): (atom/movable/M) - -// /turf signals -#define COMSIG_TURF_CHANGE "turf_change" //! from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps) -#define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity" //! from base of atom/has_gravity(): (atom/asker, list/forced_gravities) -#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 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) -#define COMSIG_MOVABLE_UNCROSS "movable_uncross" //! from base of atom/movable/Uncross(): (/atom/movable) - #define COMPONENT_MOVABLE_BLOCK_UNCROSS 1 -#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 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) -#define COMSIG_MOVABLE_PRE_THROW "movable_pre_throw" //! from base of atom/movable/throw_at(): (list/args) - #define COMPONENT_CANCEL_THROW 1 -#define COMSIG_MOVABLE_POST_THROW "movable_post_throw" //! from base of atom/movable/throw_at(): (datum/thrownthing, spin) -#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" //! from base of atom/movable/onTransitZ(): (old_z, new_z) -#define COMSIG_MOVABLE_SECLUDED_LOCATION "movable_secluded" //! called when the movable is placed in an unaccessible area, used for stationloving: () -#define COMSIG_MOVABLE_HEAR "movable_hear" //! from base of atom/movable/Hear(): (message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) - #define HEARING_MESSAGE 1 - #define HEARING_SPEAKER 2 -// #define HEARING_LANGUAGE 3 - #define HEARING_RAW_MESSAGE 4 - /* #define HEARING_RADIO_FREQ 5 - #define HEARING_SPANS 6 - #define HEARING_MESSAGE_MODE 7 */ -#define COMSIG_MOVABLE_DISPOSING "movable_disposing" //! called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source) - -// /mob signals -#define COMSIG_MOB_LOGIN "mob_login" -#define COMSIG_MOB_DEATH "mob_death" //! from base of mob/death(): (gibbed) -#define COMSIG_MOB_CLICKON "mob_clickon" //! from base of mob/clickon(): (atom/A, params) - #define COMSIG_MOB_CANCEL_CLICKON 1 -#define COMSIG_MOB_ALLOWED "mob_allowed" //! from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj -#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //! from base of mob/anti_magic_check(): (mob/user, magic, holy, major, self, protection_sources) - #define COMPONENT_BLOCK_MAGIC 1 -#define COMSIG_MOB_HUD_CREATED "mob_hud_created" //! from base of mob/create_mob_hud(): () -#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" //! from base of -#define COMSIG_MOB_HAND_ATTACKED "mob_hand_attacked" //! from base of -#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack" //! from base of /obj/item/attack(): (mob/M, mob/user) - #define COMPONENT_ITEM_NO_ATTACK 1 -#define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage" //! from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone) -#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //! from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters) -#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //! from base of mob/RangedAttack(): (atom/A, params) -#define COMSIG_MOB_THROW "mob_throw" //! from base of /mob/throw_item(): (atom/target) -#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //! from base of /mob/update_sight(): () -#define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/target) -#define COMSIG_MOB_SAY "mob_say" // from /mob/living/say(): (proc args list) - #define COMPONENT_UPPERCASE_SPEECH 1 - // used to access COMSIG_MOB_SAY argslist - #define SPEECH_MESSAGE 1 - // #define SPEECH_BUBBLE_TYPE 2 - #define SPEECH_SPANS 3 - /* #define SPEECH_SANITIZE 4 - #define SPEECH_LANGUAGE 5 - #define SPEECH_IGNORE_SPAM 6 - #define SPEECH_FORCED 7 */ -#define COMSIG_MOB_EMOTE "mob_emote" // from /mob/living/emote(): () - -// /mob/living signals -#define COMSIG_LIVING_REVIVE "living_revive" //! from base of mob/living/revive() (/mob/living, full_heal, admin_revive) -#define COMSIG_LIVING_RESIST "living_resist" //! from base of mob/living/resist() (/mob/living) -#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) -#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //! sent by stuff like stunbatons and tasers: () -#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge" //! sent from borg recharge stations: (amount, repairs) -#define COMSIG_BORG_SAFE_DECONSTRUCT "borg_safe_decon" //sent from borg mobs to itself, for tools to catch an upcoming destroy() due to safe decon (rather than detonation) -#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" - -//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) -#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown" //! from base of mob/living/Knockdown() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze" //! from base of mob/living/Paralyze() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize" //! from base of mob/living/Immobilize() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious" //! from base of mob/living/Unconscious() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping" //! from base of mob/living/Sleeping() (amount, update, ignore) - #define COMPONENT_NO_STUN 1 //For all of them - -// /mob/living/carbon signals -#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //! from base of mob/living/carbon/soundbang_act(): (list(intensity)) -#define COMSIG_CARBON_SPECIESCHANGE "mob_carbon_specieschange" //! from base of mob/living/carbon/set_species(): (new_race) -#define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ" //from /item/organ/proc/Insert() (/obj/item/organ/) -#define COMSIG_CARBON_LOSE_ORGAN "carbon_lose_organ" //from /item/organ/proc/Remove() (/obj/item/organ/) - -// /mob/living/simple_animal/hostile signals -#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget" - #define COMPONENT_HOSTILE_NO_ATTACK 1 - -// /obj/item/projectile signals (sent to the firer) -#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_PREHIT "com_proj_prehit" // sent to targets during the process_hit proc of projectiles - -// /obj/mecha signals -#define COMSIG_MECHA_ACTION_ACTIVATE "mecha_action_activate" //sent from mecha action buttons to the mecha they're linked to - -// /obj signals -#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench" -#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //! from base of obj/deconstruct(): (disassembled) -#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //! called in /obj/structure/setAnchored(): (value) - -// /obj/item signals -#define COMSIG_ITEM_ATTACK "item_attack" //! from base of obj/item/attack(): (/mob/living/target, /mob/living/user) -#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //! from base of obj/item/attack_self(): (/mob) - #define COMPONENT_NO_INTERACT 1 -#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //! from base of obj/item/attack_obj(): (/obj, /mob) - #define COMPONENT_NO_ATTACK_OBJ 1 -#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //! from base of obj/item/pre_attack(): (atom/target, mob/user, params) - #define COMPONENT_NO_ATTACK 1 -#define COMSIG_ITEM_AFTERATTACK "item_afterattack" //! from base of obj/item/afterattack(): (atom/target, mob/user, params) -#define COMSIG_ITEM_EQUIPPED "item_equip" //! from base of obj/item/equipped(): (/mob/equipper, slot) -#define COMSIG_ITEM_DROPPED "item_drop" //! from base of obj/item/dropped(): (mob/user) -#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_MARK_RETRIEVAL "item_mark_retrieval" //! called before marking an object for retrieval, checked in /obj/effect/proc_holder/spell/targeted/summonitem/cast() : (mob/user) - #define COMPONENT_BLOCK_MARK_RETRIEVAL 1 -#define COMSIG_ITEM_HIT_REACT "item_hit_react" //! from base of obj/item/hit_reaction(): (list/args) - -// /obj/item/clothing signals -#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //! from base of obj/item/clothing/shoes/proc/step_action(): () - -// /obj/item/implant signals -#define COMSIG_IMPLANT_ACTIVATED "implant_activated" //! from base of /obj/item/implant/proc/activate(): () -#define COMSIG_IMPLANT_IMPLANTING "implant_implanting" //! from base of /obj/item/implant/proc/implant(): (list/args) - #define COMPONENT_STOP_IMPLANTING 1 -#define COMSIG_IMPLANT_OTHER "implant_other" //! called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant) - //#define COMPONENT_STOP_IMPLANTING 1 //The name makes sense for both - #define COMPONENT_DELETE_NEW_IMPLANT 2 - #define COMPONENT_DELETE_OLD_IMPLANT 4 -#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists" //! called on implants being implanted into someone with an uplink implant: (datum/component/uplink) - //This uses all return values of COMSIG_IMPLANT_OTHER - -// /obj/item/pda signals -#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //! called on pda when the user changes the ringtone: (mob/living/user, new_ringtone) - #define COMPONENT_STOP_RINGTONE_CHANGE 1 - -// /obj/item/radio signals -#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" //! called from base of /obj/item/radio/proc/set_frequency(): (list/args) - -// /obj/item/pen signals -#define COMSIG_PEN_ROTATED "pen_rotated" //! called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user) - -// /mob/living/carbon/human signals -#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //! from mob/living/carbon/human/UnarmedAttack(): (atom/target) -#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //! from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker) -#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" //! Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted) - -// /datum/species signals -#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) - -/*******Component Specific Signals*******/ -//Janitor -#define COMSIG_TURF_IS_WET "check_turf_wet" //! (): Returns bitflags of wet values. -#define COMSIG_TURF_MAKE_DRY "make_turf_try" //! (max_strength, immediate, duration_decrease = INFINITY): Returns bool. -#define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //! called on an object to clean it of cleanables. Usualy with soap: (num/strength) - -//Food -#define COMSIG_FOOD_EATEN "food_eaten" //! from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder) - -//Gibs -#define COMSIG_GIBS_STREAK "gibs_streak" //! from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases) - -//Diseases -#define COMSIG_DISEASE_END "disease_end" //from the base of /datum/disease/advance/Destroy(): (GetDiseaseID) - -//Mood -#define COMSIG_ADD_MOOD_EVENT "add_mood" //! Called when you send a mood event from anywhere in the code. -#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //! Called when you clear a mood event from anywhere in the code. - -//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)) - -//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 -#define COMSIG_NANITE_DELETE "nanite_delete" //() deletes the nanite component -#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list -#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume" //(amount) Returns nanite amount -#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount -#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount -#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume" //(amount) Sets maximum nanite volume to the given amount -#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud" //(amount(0-100)) Sets cloud ID to the given amount -#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync" //(method) Modify cloud sync status. Method can be toggle, enable or disable -#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount -#define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount -#define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob. -#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal" //(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob. -#define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected -#define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs -#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component - #define COMPONENT_PROGRAM_INSTALLED 1 //Installation successful - #define COMPONENT_PROGRAM_NOT_INSTALLED 2 //Installation failed, but there are still nanites -#define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component - -// /datum/component/storage signals -#define COMSIG_CONTAINS_STORAGE "is_storage" //! () - returns bool. -#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert" //! (obj/item/inserting, mob/user, silent, force) - returns bool -#define COMSIG_TRY_STORAGE_SHOW "storage_show_to" //! (mob/show_to, force) - returns bool. -#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from" //! (mob/hide_from) - returns bool -#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all" //! returns bool -#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state" //! (newstate) -#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate" //! () - returns bool. MUST CHECK IF STORAGE IS THERE FIRST! -#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type" //! (type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types. -#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type" //! (type, amount = INFINITY, force = FALSE) //don't fuck this up. Force will ignore max_items, and amount is normally clamped to max_items. -#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj" //! (obj, new_loc, force = FALSE) - returns bool -#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty" //! (loc) - returns bool - if loc is null it will dump at parent location. -#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //! (list/list_to_inject_results_into, recursively_search_inside_storages = TRUE) -#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //! (obj/item/insertion_candidate, mob/user, silent) - returns bool - -// /datum/action signals -#define COMSIG_ACTION_TRIGGER "action_trigger" //! from base of datum/action/proc/Trigger(): (datum/action) - #define COMPONENT_ACTION_BLOCK_TRIGGER 1 - -// /datum/mind signals -#define COMSIG_MIND_TRANSFER_TO "mind_transfer_to" // (mob/old, mob/new) - -// /datum/component/clockwork_trap signals -#define COMSIG_CLOCKWORK_SIGNAL_RECIEVED "clock_recieved" //! When anything the trap is attatched to is triggered - -/*******Non-Signal Component Related Defines*******/ - -//Redirection component init flags -#define REDIRECT_TRANSFER_WITH_TURF 1 - -//Arch -#define ARCH_PROB "probability" //! Probability for each item -#define ARCH_MAXDROP "max_drop_amount" //! each item's max drop amount - -//Ouch my toes! -#define CALTROP_BYPASS_SHOES 1 -#define CALTROP_IGNORE_WALKERS 2 - -//Xenobio hotkeys -#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl" //! from slime CtrlClickOn(): (/mob) -#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt" //! from slime AltClickOn(): (/mob) -#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift" //! from slime ShiftClickOn(): (/mob) -#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //! from turf ShiftClickOn(): (/mob) -#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //! from turf AltClickOn(): (/mob) -#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //! from monkey CtrlClickOn(): (/mob) diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index dba0174533e42..e697cbc3b11d7 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -80,6 +80,7 @@ #define CAT_MISC "Misc" #define CAT_PRIMAL "Tribal" #define CAT_CLOTHING "Clothing" +#define CAT_EYEWEAR "Eyewear" #define CAT_FOOD "Foods" #define CAT_BREAD "Breads" #define CAT_BURGER "Burgers" diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm new file mode 100644 index 0000000000000..979839224b516 --- /dev/null +++ b/code/__DEFINES/cooldowns.dm @@ -0,0 +1,71 @@ +//// COOLDOWN SYSTEMS +/* + * We have 2 cooldown systems: timer cooldowns (divided between stoppable and regular) and world.time cooldowns. + * + * When to use each? + * + * * Adding a commonly-checked cooldown, like on a subsystem to check for processing + * * * Use the world.time ones, as they are cheaper. + * + * * Adding a rarely-used one for special situations, such as giving an uncommon item a cooldown on a target. + * * * Timer cooldown, as adding a new variable on each mob to track the cooldown of said uncommon item is going too far. + * + * * Triggering events at the end of a cooldown. + * * * Timer cooldown, registering to its signal. + * + * * Being able to check how long left for the cooldown to end. + * * * Either world.time or stoppable timer cooldowns, depending on the other factors. Regular timer cooldowns do not support this. + * + * * Being able to stop the timer before it ends. + * * * Either world.time or stoppable timer cooldowns, depending on the other factors. Regular timer cooldowns do not support this. +*/ + + +/* + * Cooldown system based on an datum-level associative lazylist using timers. +*/ + +//INDEXES +#define COOLDOWN_BORG_SELF_REPAIR "borg_self_repair" + + +//TIMER COOLDOWN MACROS + +#define COMSIG_CD_STOP(cd_index) "cooldown_[cd_index]" +#define COMSIG_CD_RESET(cd_index) "cd_reset_[cd_index]" + +#define TIMER_COOLDOWN_START(cd_source, cd_index, cd_time) LAZYSET(cd_source.cooldowns, cd_index, addtimer(CALLBACK(GLOBAL_PROC, /proc/end_cooldown, cd_source, cd_index), cd_time)) + +#define TIMER_COOLDOWN_CHECK(cd_source, cd_index) LAZYACCESS(cd_source.cooldowns, cd_index) + +#define TIMER_COOLDOWN_END(cd_source, cd_index) LAZYREMOVE(cd_source.cooldowns, cd_index) + +/* + * Stoppable timer cooldowns. + * Use indexes the same as the regular tiemr cooldowns. + * They make use of the TIMER_COOLDOWN_CHECK() and TIMER_COOLDOWN_END() macros the same, just not the TIMER_COOLDOWN_START() one. + * A bit more expensive than the regular timers, but can be reset before they end and the time left can be checked. +*/ + +#define S_TIMER_COOLDOWN_START(cd_source, cd_index, cd_time) LAZYSET(cd_source.cooldowns, cd_index, addtimer(CALLBACK(GLOBAL_PROC, /proc/end_cooldown, cd_source, cd_index), cd_time, TIMER_STOPPABLE)) + +#define S_TIMER_COOLDOWN_RESET(cd_source, cd_index) reset_cooldown(cd_source, cd_index) + +#define S_TIMER_COOLDOWN_TIMELEFT(cd_source, cd_index) (timeleft(TIMER_COOLDOWN_CHECK(cd_source, cd_index))) + + +/* + * Cooldown system based on storing world.time on a variable, plus the cooldown time. + * Better performance over timer cooldowns, lower control. Same functionality. +*/ + +#define COOLDOWN_DECLARE(cd_index) var/##cd_index = 0 + +#define COOLDOWN_START(cd_source, cd_index, cd_time) (cd_source.cd_index = world.time + (cd_time)) + +//Returns true if the cooldown has run its course, false otherwise +#define COOLDOWN_FINISHED(cd_source, cd_index) (cd_source.cd_index < world.time) + +#define COOLDOWN_RESET(cd_source, cd_index) cd_source.cd_index = 0 + +#define COOLDOWN_TIMELEFT(cd_source, cd_index) (max(0, cd_source.cd_index - world.time)) diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm new file mode 100644 index 0000000000000..128c9f19387d2 --- /dev/null +++ b/code/__DEFINES/dcs/flags.dm @@ -0,0 +1,41 @@ +/// Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. +/// `parent` must not be modified if this is to be returned. +/// This will be noted in the runtime logs +#define COMPONENT_INCOMPATIBLE 1 +/// Returned in PostTransfer to prevent transfer, similar to `COMPONENT_INCOMPATIBLE` +#define COMPONENT_NOTRANSFER 2 + +/// Return value to cancel attaching +#define ELEMENT_INCOMPATIBLE 1 + +// /datum/element flags +/// Causes the detach proc to be called when the host object is being deleted +#define ELEMENT_DETACH (1 << 0) +/** + * Only elements created with the same arguments given after `id_arg_index` share an element instance + * The arguments are the same when the text and number values are the same and all other values have the same ref + */ +#define ELEMENT_BESPOKE (1 << 1) + +// How multiple components of the exact same type are handled in the same datum +/// old component is deleted (default) +#define COMPONENT_DUPE_HIGHLANDER 0 +/// duplicates allowed +#define COMPONENT_DUPE_ALLOWED 1 +/// new component is deleted +#define COMPONENT_DUPE_UNIQUE 2 +/// old component is given the initialization args of the new +#define COMPONENT_DUPE_UNIQUE_PASSARGS 4 +/// each component of the same type is consulted as to whether the duplicate should be allowed +#define COMPONENT_DUPE_SELECTIVE 5 + +//Redirection component init flags +#define REDIRECT_TRANSFER_WITH_TURF 1 + +//Arch +#define ARCH_PROB "probability" //Probability for each item +#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount + +//Ouch my toes! +#define CALTROP_BYPASS_SHOES 1 +#define CALTROP_IGNORE_WALKERS 2 diff --git a/code/__DEFINES/dcs/helpers.dm b/code/__DEFINES/dcs/helpers.dm new file mode 100644 index 0000000000000..144e94f1fe05b --- /dev/null +++ b/code/__DEFINES/dcs/helpers.dm @@ -0,0 +1,15 @@ +/// Used to trigger signals and call procs registered for that signal +/// The datum hosting the signal is automaticaly added as the first argument +/// Returns a bitfield gathered from all registered procs +/// Arguments given here are packaged in a list and given to _SendSignal +#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) ) + +#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) ) + +/// A wrapper for _AddElement that allows us to pretend we're using normal named arguments +#define AddElement(arguments...) _AddElement(list(##arguments)) +/// A wrapper for _RemoveElement that allows us to pretend we're using normal named arguments +#define RemoveElement(arguments...) _RemoveElement(list(##arguments)) + +/// A wrapper for _AddComponent that allows us to pretend we're using normal named arguments +#define AddComponent(arguments...) _AddComponent(list(##arguments)) diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm new file mode 100644 index 0000000000000..85806b8ce12c6 --- /dev/null +++ b/code/__DEFINES/dcs/signals.dm @@ -0,0 +1,517 @@ +// All signals. Format: +// When the signal is called: (signal arguments) +// All signals send the source datum of the signal as the first argument + +// global signals +// These are signals which can be listened to by any component on any parent +// start global signals with "!", this used to be necessary but now it's just a formatting choice +#define COMSIG_GLOB_NEW_Z "!new_z" //! from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args) +#define COMSIG_GLOB_VAR_EDIT "!var_edit" //! called after a successful var edit somewhere in the world: (list/args) +#define COMSIG_GLOB_EXPLOSION "!explosion" //! called after an explosion happened : (epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range) +#define COMSIG_GLOB_MOB_CREATED "!mob_created" //! mob was created somewhere : (mob) +#define COMSIG_GLOB_MOB_DEATH "!mob_death" //! mob died somewhere : (mob , gibbed) +#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special" //! global living say plug - use sparingly: (mob/speaker , message) +#define COMSIG_GLOB_CARBON_THROW_THING "!throw_thing" //! a person somewhere has thrown something : (mob/living/carbon/carbon_thrower, target) +/// called by datum/cinematic/play() : (datum/cinematic/new_cinematic) +#define COMSIG_GLOB_PLAY_CINEMATIC "!play_cinematic" + #define COMPONENT_GLOB_BLOCK_CINEMATIC 1 +/// Random event is trying to roll. (/datum/round_event_control/random_event) +/// Called by (/datum/round_event_control/preRunEvent). +#define COMSIG_GLOB_PRE_RANDOM_EVENT "!pre_random_event" + /// Do not allow this random event to continue. + #define CANCEL_PRE_RANDOM_EVENT (1<<0) + +/// Signifies that this proc is used to handle signals. +/// Every proc you pass to RegisterSignal must have this. +#define SIGNAL_HANDLER SHOULD_NOT_SLEEP(TRUE) + + +////////////////////////////////////////////////////////////////// + +// /datum signals +#define COMSIG_COMPONENT_ADDED "component_added" //! when a component is added to a datum: (/datum/component) +#define COMSIG_COMPONENT_REMOVING "component_removing" //! before a component is removed from a datum because of RemoveComponent: (/datum/component) +#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted" //! before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation +#define COMSIG_PARENT_QDELETING "parent_qdeleting" //! just before a datum's Destroy() is called: (force), at this point none of the other components chose to interrupt qdel and Destroy will be called +#define COMSIG_TOPIC "handle_topic" //! generic topic handler (usr, href_list) + +/// 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_ATOM_CREATED "atom_created" ///from base of atom/proc/Initialize(): sent any time a new atom is created +#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, list/examine_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 + #define EXAMINE_POSITION_BEFORE 2 + //End positions + #define COMPONENT_EXNAME_CHANGED 1 +#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon" //from base of atom/update_icon(): () + #define COMSIG_ATOM_NO_UPDATE_ICON_STATE 1 + #define COMSIG_ATOM_NO_UPDATE_OVERLAYS 2 +#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays" //from base of atom/update_overlays(): (list/new_overlays) +#define COMSIG_ATOM_ENTERED "atom_entered" //! from base of atom/Entered(): (atom/movable/entering, /atom) +#define COMSIG_ATOM_EXIT "atom_exit" //! from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc) + #define COMPONENT_ATOM_BLOCK_EXIT 1 +#define COMSIG_ATOM_EXITED "atom_exited" //! from base of atom/Exited(): (atom/movable/exiting, atom/newloc) +#define COMSIG_ATOM_EX_ACT "atom_ex_act" //! from base of atom/ex_act(): (severity, target) +#define COMSIG_ATOM_BUMPED "atom_bumped" //from base of atom/Bumped(): (/atom/movable) +#define COMSIG_ATOM_EMP_ACT "atom_emp_act" //! from base of atom/emp_act(): (severity) +#define COMSIG_ATOM_FIRE_ACT "atom_fire_act" //! from base of atom/fire_act(): (exposed_temperature, exposed_volume) +#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act" //! from base of atom/bullet_act(): (/obj/item/projectile, def_zone) +#define COMSIG_ATOM_BLOB_ACT "atom_blob_act" //! from base of atom/blob_act(): (/obj/structure/blob) +#define COMSIG_ATOM_ACID_ACT "atom_acid_act" //! from base of atom/acid_act(): (acidpwr, acid_volume) +#define COMSIG_ATOM_EMAG_ACT "atom_emag_act" //! from base of atom/emag_act(): () +#define COMSIG_ATOM_RAD_ACT "atom_rad_act" //! from base of atom/rad_act(intensity) +#define COMSIG_ATOM_NARSIE_ACT "atom_narsie_act" //! from base of atom/narsie_act(): () +#define COMSIG_ATOM_RATVAR_ACT "atom_ratvar_act" //! from base of atom/ratvar_act(): () +#define COMSIG_ATOM_EMINENCE_ACT "atom_eminence_act" //! from base of atom/eminence_act(): () +#define COMSIG_ATOM_RCD_ACT "atom_rcd_act" //! from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode) +#define COMSIG_ATOM_TELEPORT_ACT "atom_teleport_act" //! from base of atom/teleport_act(): () +#define COMSIG_ATOM_EXTRAPOLATOR_ACT "atom_extrapolator_act" //! from base of atom/Exited(): (mob/user, var/obj/item/extrapolator/E, scan = TRUE) +#define COMSIG_ATOM_SING_PULL "atom_sing_pull" //! from base of atom/singularity_pull(): (S, current_size) +#define COMSIG_ATOM_BSA_BEAM "atom_bsa_beam_pass" //from obj/machinery/bsa/full/proc/fire(): () + #define COMSIG_ATOM_BLOCKS_BSA_BEAM 1 +#define COMSIG_ATOM_SET_LIGHT "atom_set_light" //! from base of atom/set_light(): (l_range, l_power, l_color) +#define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" //! from base of atom/setDir(): (old_dir, new_dir) +#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del" //! from base of atom/handle_atom_del(): (atom/deleted) +#define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity" //! from base of atom/has_gravity(): (turf/location, list/forced_gravities) +#define COMSIG_ATOM_RAD_PROBE "atom_rad_probe" //! from proc/get_rad_contents(): () + #define COMPONENT_BLOCK_RADIATION 1 +#define COMSIG_ATOM_RAD_CONTAMINATING "atom_rad_contam" //! from base of datum/radiation_wave/radiate(): (strength) + #define COMPONENT_BLOCK_CONTAMINATION 1 +#define COMSIG_ATOM_RAD_WAVE_PASSING "atom_rad_wave_pass" //! from base of datum/radiation_wave/check_obstructions(): (datum/radiation_wave, width) + #define COMPONENT_RAD_WAVE_HANDLED 1 +#define COMSIG_ATOM_CANREACH "atom_can_reach" //! from internal loop in atom/movable/proc/CanReach(): (list/next) + #define COMPONENT_BLOCK_REACH 1 +#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport" //! called when teleporting into a protected turf: (channel, turf/origin) + #define COMPONENT_BLOCK_TELEPORT 1 +#define COMSIG_ATOM_ORBIT_BEGIN "atom_orbit_begin" //called when an atom starts orbiting another atom: (atom) +#define COMSIG_ATOM_ORBIT_STOP "atom_orbit_stop" //called when an atom stops orbiting another atom: (atom) +///////////////// +/* Attack signals. They should share the returned flags, to standardize the attack chain. */ +/// tool_act -> pre_attack -> target.attackby (item.attack) -> afterattack + ///Ends the attack chain. If sent early might cause posterior attacks not to happen. + #define COMPONENT_CANCEL_ATTACK_CHAIN (1<<0) + ///Skips the specific attack step, continuing for the next one to happen. + #define COMPONENT_SKIP_ATTACK (1<<1) + +#define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" //! from base of atom/attack_ghost(): (mob/dead/observer/ghost) +#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" //! from base of atom/attack_hand(): (mob/user) +#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" //! from base of atom/attack_paw(): (mob/user) + #define COMPONENT_NO_ATTACK_HAND 1 //works on all 3. +#define COMSIG_ATOM_ATTACK_ANIMAL "attack_animal" //! from base of atom/animal_attack(): (/mob/user) +//This signal return value bitflags can be found in __DEFINES/misc.dm +#define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact" //called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels) + +#define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE "atom_init_success" + +///from base of atom/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) +#define COMSIG_ATOM_HITBY "atom_hitby" + + +///////////////// + +#define COMSIG_AREA_POWER_CHANGE "area_power_change" //! from base of area/proc/power_change(): () +#define COMSIG_ENTER_AREA "enter_area" //! from base of area/Entered(): (/area) +#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_CTRL "ctrl_click" //! from base of atom/CtrlClickOn(): (/mob) +#define COMSIG_CLICK_ALT "alt_click" //! from base of atom/AltClick(): (/mob) +#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //! from base of atom/CtrlShiftClick(/mob) +#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" //! from base of atom/MouseDrop(): (/atom/over, /mob/user) + #define COMPONENT_NO_MOUSEDROP 1 +#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //! from base of atom/MouseDrop_T: (/atom/from, /mob/user) + +// /area signals +#define COMSIG_AREA_ENTERED "area_entered" //! from base of area/Entered(): (atom/movable/M) +#define COMSIG_AREA_EXITED "area_exited" //! from base of area/Exited(): (atom/movable/M) + +// /turf signals +#define COMSIG_TURF_CHANGE "turf_change" //! from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps) +#define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity" //! from base of atom/has_gravity(): (atom/asker, list/forced_gravities) +#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new" //! from base of turf/New(): (turf/source, direction) +#define COMSIG_TURF_AFTER_SHUTTLE_MOVE "turf_after_shuttle_move" //! from base of turf/proc/afterShuttleMove: (turf/new_turf) + +// /atom/movable signals +#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) +#define COMSIG_MOVABLE_UNCROSS "movable_uncross" //! from base of atom/movable/Uncross(): (/atom/movable) + #define COMPONENT_MOVABLE_BLOCK_UNCROSS 1 +#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 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) +#define COMSIG_MOVABLE_PRE_THROW "movable_pre_throw" //! from base of atom/movable/throw_at(): (list/args) + #define COMPONENT_CANCEL_THROW 1 +#define COMSIG_MOVABLE_POST_THROW "movable_post_throw" //! from base of atom/movable/throw_at(): (datum/thrownthing, spin) +#define COMSIG_MOVABLE_THROW_LANDED "movable_throw_landed" //! from base of datum/thrownthing/finalize(): (obj/thrown_object, datum/thrownthing) used for when a throw is finished +#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" //! from base of atom/movable/onTransitZ(): (old_z, new_z) +#define COMSIG_MOVABLE_SECLUDED_LOCATION "movable_secluded" //! called when the movable is placed in an unaccessible area, used for stationloving: () +#define COMSIG_MOVABLE_HEAR "movable_hear" //! from base of atom/movable/Hear(): (message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) + #define HEARING_MESSAGE 1 + #define HEARING_SPEAKER 2 +// #define HEARING_LANGUAGE 3 + #define HEARING_RAW_MESSAGE 4 + /* #define HEARING_RADIO_FREQ 5 + #define HEARING_SPANS 6 + #define HEARING_MESSAGE_MODE 7 */ +#define COMSIG_MOVABLE_DISPOSING "movable_disposing" //! called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source) + +// /mob signals +#define COMSIG_MOB_LOGIN "mob_login" +#define COMSIG_MOB_LOGOUT "mob_logout" ///from base of /mob/Logout(): () +#define COMSIG_MOB_DEATH "mob_death" //! from base of mob/death(): (gibbed) +#define COMSIG_MOB_STATCHANGE "mob_statchange" //from base of mob/set_stat(): (new_stat) +#define COMSIG_MOB_CLICKON "mob_clickon" //! from base of mob/clickon(): (atom/A, params) + #define COMSIG_MOB_CANCEL_CLICKON 1 +#define COMSIG_MOB_ALLOWED "mob_allowed" //! from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj +#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //! from base of mob/anti_magic_check(): (mob/user, magic, holy, major, self, protection_sources) + #define COMPONENT_BLOCK_MAGIC 1 +#define COMSIG_MOB_HUD_CREATED "mob_hud_created" //! from base of mob/create_mob_hud(): () +#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" //! from base of +#define COMSIG_MOB_ATTACK_HAND_TURF "mob_attack_hand_turf" //! from base of turf/attack_hand +#define COMSIG_MOB_HAND_ATTACKED "mob_hand_attacked" //! from base of +#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack" //! from base of /obj/item/attack(): (mob/M, mob/user) + #define COMPONENT_ITEM_NO_ATTACK 1 +#define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage" //! from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone) +#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //! from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters) +#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //! from base of mob/RangedAttack(): (atom/A, params) +#define COMSIG_MOB_THROW "mob_throw" //! from base of /mob/throw_item(): (atom/target) +#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //! from base of /mob/update_sight(): () +#define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/target) +#define COMSIG_MOB_SAY "mob_say" // from /mob/living/say(): () +#define COMSIG_MOB_ATTACK_ALIEN "mob_attack_alien" //! from base of /mob/living/attack_alien(): (user) +#define COMSIG_MOB_MOVESPEED_UPDATED "mob_update_movespeed" //! From base of mob/update_movespeed():area + #define COMPONENT_UPPERCASE_SPEECH 1 + // used to access COMSIG_MOB_SAY argslist + #define SPEECH_MESSAGE 1 + // #define SPEECH_BUBBLE_TYPE 2 + #define SPEECH_SPANS 3 + /* #define SPEECH_SANITIZE 4 + #define SPEECH_LANGUAGE 5 + #define SPEECH_IGNORE_SPAM 6 + #define SPEECH_FORCED 7 */ +#define COMSIG_MOB_EMOTE "mob_emote" // from /mob/living/emote(): () +#define COMSIG_MOB_SWAP_HANDS "mob_swap_hands" //from base of mob/swap_hand() + #define COMPONENT_BLOCK_SWAP 1 +#define COMSIG_MOB_DEADSAY "mob_deadsay" // from /mob/say_dead(): (mob/speaker, message) + #define MOB_DEADSAY_SIGNAL_INTERCEPT 1 +#define COMSIG_MOB_POINTED "mob_pointed" //from base of /mob/verb/pointed: (atom/A) + +///from base of /obj/item/mmi/set_brainmob(): (mob/living/brain/new_brainmob) +#define COMSIG_MMI_SET_BRAINMOB "mmi_set_brainmob" + +// /mob/living signals +#define COMSIG_LIVING_REVIVE "living_revive" //! from base of mob/living/revive() (/mob/living, full_heal, admin_revive) +#define COMSIG_LIVING_RESIST "living_resist" //! from base of mob/living/resist() (/mob/living) +#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) +#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //! sent by stuff like stunbatons and tasers: () +#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge" //! sent from borg recharge stations: (amount, repairs) +#define COMSIG_BORG_SAFE_DECONSTRUCT "borg_safe_decon" //sent from borg mobs to itself, for tools to catch an upcoming destroy() due to safe decon (rather than detonation) +#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" +#define COMSIG_LIVING_TRY_SYRINGE "living_try_syringe" ///From post-can inject check of syringe after attack (mob/user) +#define COMSIG_LIVING_START_PULL "living_start_pull" ///called on /living when someone starts pulling (atom/movable/pulled, state, force) + +//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) +#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown" //! from base of mob/living/Knockdown() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze" //! from base of mob/living/Paralyze() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize" //! from base of mob/living/Immobilize() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious" //! from base of mob/living/Unconscious() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping" //! from base of mob/living/Sleeping() (amount, update, ignore) + #define COMPONENT_NO_STUN 1 //For all of them + +// /mob/living/carbon signals +#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //! from base of mob/living/carbon/soundbang_act(): (list(intensity)) +#define COMSIG_CARBON_SPECIESCHANGE "mob_carbon_specieschange" //! from base of mob/living/carbon/set_species(): (new_race) +#define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ" //from /item/organ/proc/Insert() (/obj/item/organ/) +#define COMSIG_CARBON_LOSE_ORGAN "carbon_lose_organ" //from /item/organ/proc/Remove() (/obj/item/organ/) +#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) +#define COMSIG_CARBON_CUFF_ATTEMPTED "carbon_attempt_cuff" ///Called when someone attempts to cuff a carbon + +// /mob/living/simple_animal/hostile signals +#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget" + #define COMPONENT_HOSTILE_NO_ATTACK 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/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_PREHIT "com_proj_prehit" // sent to targets during the process_hit proc of projectiles +#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 COMPONENT_EMBED_SUCCESS (1<<1) // returned when the embed is successful + +#define COMSIG_PELLET_CLOUD_INIT "pellet_cloud_init" // sent to targets during the process_hit proc of projectiles + +// /obj/mecha signals +#define COMSIG_MECHA_ACTION_ACTIVATE "mecha_action_activate" //sent from mecha action buttons to the mecha they're linked to + +// /obj signals +#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench" +#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //! from base of obj/deconstruct(): (disassembled) +#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //! called in /obj/structure/setAnchored(): (value) + +// /obj/item signals +#define COMSIG_ITEM_ATTACK "item_attack" //! from base of obj/item/attack(): (/mob/living/target, /mob/living/user) +#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //! from base of obj/item/attack_self(): (/mob) + #define COMPONENT_NO_INTERACT 1 +#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //! from base of obj/item/attack_obj(): (/obj, /mob) + #define COMPONENT_NO_ATTACK_OBJ 1 +#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //! from base of obj/item/pre_attack(): (atom/target, mob/user, params) + #define COMPONENT_NO_ATTACK 1 +#define COMSIG_ITEM_AFTERATTACK "item_afterattack" //! from base of obj/item/afterattack(): (atom/target, mob/user, params) +#define COMSIG_ITEM_EQUIPPED "item_equip" //! from base of obj/item/equipped(): (/mob/equipper, slot) +#define COMSIG_ITEM_DROPPED "item_drop" //! from base of obj/item/dropped(): (mob/user) +#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_MARK_RETRIEVAL "item_mark_retrieval" //! called before marking an object for retrieval, checked in /obj/effect/proc_holder/spell/targeted/summonitem/cast() : (mob/user) + #define COMPONENT_BLOCK_MARK_RETRIEVAL 1 +#define COMSIG_ITEM_HIT_REACT "item_hit_react" //! from base of obj/item/hit_reaction(): (list/args) +#define COMSIG_ITEM_SHARPEN_ACT "sharpen_act" //! from base of item/sharpener/attackby(): (amount, max) + #define COMPONENT_BLOCK_SHARPEN_APPLIED 1 + #define COMPONENT_BLOCK_SHARPEN_BLOCKED 2 + #define COMPONENT_BLOCK_SHARPEN_ALREADY 4 + #define COMPONENT_BLOCK_SHARPEN_MAXED 8 +#define COMSIG_ITEM_CHECK_WIELDED "item_check_wielded" //! used to check if the item is wielded for special effects + #define COMPONENT_IS_WIELDED 1 +#define COMSIG_ITEM_DISABLE_EMBED "item_disable_embed" ///from [/obj/item/proc/disableEmbedding]: +#define COMSIG_MINE_TRIGGERED "minegoboom" ///from [/obj/effect/mine/proc/triggermine]: + +// /obj/item/clothing signals +#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //! from base of obj/item/clothing/shoes/proc/step_action(): () + +// /obj/item/implant signals +#define COMSIG_IMPLANT_ACTIVATED "implant_activated" //! from base of /obj/item/implant/proc/activate(): () +#define COMSIG_IMPLANT_IMPLANTING "implant_implanting" //! from base of /obj/item/implant/proc/implant(): (list/args) + #define COMPONENT_STOP_IMPLANTING 1 +#define COMSIG_IMPLANT_OTHER "implant_other" //! called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant) + //#define COMPONENT_STOP_IMPLANTING 1 //The name makes sense for both + #define COMPONENT_DELETE_NEW_IMPLANT 2 + #define COMPONENT_DELETE_OLD_IMPLANT 4 +#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists" //! called on implants being implanted into someone with an uplink implant: (datum/component/uplink) + //This uses all return values of COMSIG_IMPLANT_OTHER + +/// called on implants, after a successful implantation: (mob/living/target, mob/user, silent, force) +#define COMSIG_IMPLANT_IMPLANTED "implant_implanted" + +/// called on implants, after an implant has been removed: (mob/living/source, silent, special) +#define COMSIG_IMPLANT_REMOVED "implant_removed" + +// /obj/item/pda signals +#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //! called on pda when the user changes the ringtone: (mob/living/user, new_ringtone) + #define COMPONENT_STOP_RINGTONE_CHANGE 1 + +// /obj/item/radio signals +#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" //! called from base of /obj/item/radio/proc/set_frequency(): (list/args) + +// /obj/item/pen signals +#define COMSIG_PEN_ROTATED "pen_rotated" //! called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user) + +// /mob/living/carbon/human signals +#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //! from mob/living/carbon/human/UnarmedAttack(): (atom/target) +#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //! from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker) +#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" //! Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted) + +// /datum/species signals +#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/song signals +#define COMSIG_SONG_START "song_start" //sent to the instrument when a song starts playing +#define COMSIG_SONG_END "song_end" + +/*******Component Specific Signals*******/ +//Janitor +#define COMSIG_TURF_IS_WET "check_turf_wet" //! (): Returns bitflags of wet values. +#define COMSIG_TURF_MAKE_DRY "make_turf_try" //! (max_strength, immediate, duration_decrease = INFINITY): Returns bool. +#define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //! called on an object to clean it of cleanables. Usualy with soap: (num/strength) + +//Food +#define COMSIG_FOOD_EATEN "food_eaten" //! from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder) + +//Gibs +#define COMSIG_GIBS_STREAK "gibs_streak" //! from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases) + +//Diseases +#define COMSIG_DISEASE_END "disease_end" //from the base of /datum/disease/advance/Destroy(): (GetDiseaseID) + +//Mood +#define COMSIG_ADD_MOOD_EVENT "add_mood" //! Called when you send a mood event from anywhere in the code. +#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //! Called when you clear a mood event from anywhere in the code. + +//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)) + +//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 +#define COMSIG_NANITE_DELETE "nanite_delete" //() deletes the nanite component +#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list +#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume" //(amount) Returns nanite amount +#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount +#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount +#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume" //(amount) Sets maximum nanite volume to the given amount +#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud" //(amount(0-100)) Sets cloud ID to the given amount +#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync" //(method) Modify cloud sync status. Method can be toggle, enable or disable +#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount +#define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount +#define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob. +#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal" //(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob. +#define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected +#define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs +#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component + #define COMPONENT_PROGRAM_INSTALLED 1 //Installation successful + #define COMPONENT_PROGRAM_NOT_INSTALLED 2 //Installation failed, but there are still nanites +#define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component + +// /datum/component/storage signals +#define COMSIG_CONTAINS_STORAGE "is_storage" //! () - returns bool. +#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert" //! (obj/item/inserting, mob/user, silent, force) - returns bool +#define COMSIG_TRY_STORAGE_SHOW "storage_show_to" //! (mob/show_to, force) - returns bool. +#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from" //! (mob/hide_from) - returns bool +#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all" //! returns bool +#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state" //! (newstate) +#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate" //! () - returns bool. MUST CHECK IF STORAGE IS THERE FIRST! +#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type" //! (typecache, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - typecache has to be list of types. +#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type" //! (type, amount = INFINITY, force = FALSE) //don't fuck this up. Force will ignore max_items, and amount is normally clamped to max_items. +#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj" //! (obj, new_loc, force = FALSE) - returns bool +#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty" //! (loc) - returns bool - if loc is null it will dump at parent location. +#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //! (list/list_to_inject_results_into, recursively_search_inside_storages = TRUE) +#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //! (obj/item/insertion_candidate, mob/user, silent) - returns bool + +// /datum/component/two_handed signals +#define COMSIG_TWOHANDED_WIELD "twohanded_wield" //from base of datum/component/two_handed/proc/wield(mob/living/carbon/user): (/mob/user) + #define COMPONENT_TWOHANDED_BLOCK_WIELD 1 +#define COMSIG_TWOHANDED_UNWIELD "twohanded_unwield" //from base of datum/component/two_handed/proc/unwield(mob/living/carbon/user): (/mob/user) + +// /datum/action signals +#define COMSIG_ACTION_TRIGGER "action_trigger" //! from base of datum/action/proc/Trigger(): (datum/action) + #define COMPONENT_ACTION_BLOCK_TRIGGER 1 + +// /datum/mind signals +#define COMSIG_MIND_TRANSFER_TO "mind_transfer_to" // (mob/old, mob/new) + +// /datum/component/clockwork_trap signals +#define COMSIG_CLOCKWORK_SIGNAL_RECEIVED "clock_received" //! When anything the trap is attatched to is triggered + +//Xenobio hotkeys +#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl" //! from slime CtrlClickOn(): (/mob) +#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt" //! from slime AltClickOn(): (/mob) +#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift" //! from slime ShiftClickOn(): (/mob) +#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //! from turf ShiftClickOn(): (/mob) +#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //! from turf AltClickOn(): (/mob) +#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //! from monkey CtrlClickOn(): (/mob) + +/// job subsystem has spawned and equipped a new mob +#define COMSIG_GLOB_JOB_AFTER_SPAWN "!job_after_spawn" +///Subsystem signals +///From base of datum/controller/subsystem/Initialize: (start_timeofday) +#define COMSIG_SUBSYSTEM_POST_INITIALIZE "subsystem_post_initialize" + +//Heretics stuff +#define COMSIG_HUMAN_VOID_MASK_ACT "void_mask_act" + +// Component signals +/// From /datum/port/output/set_output: (output_value) +#define COMSIG_PORT_SET_OUTPUT "port_set_output" +/// From /datum/port/input/set_input: (input_value) +#define COMSIG_PORT_SET_INPUT "port_set_input" +/// Sent when a port calls disconnect(). From /datum/port/disconnect: () +#define COMSIG_PORT_DISCONNECT "port_disconnect" +/// Sent on the output port when an input port registers on it: (datum/port/input/registered_port) +#define COMSIG_PORT_OUTPUT_CONNECT "port_output_connect" + +/// Sent when a [/obj/item/circuit_component] is added to a circuit. +#define COMSIG_CIRCUIT_ADD_COMPONENT "circuit_add_component" + /// Cancels adding the component to the circuit. + #define COMPONENT_CANCEL_ADD_COMPONENT (1<<0) + +/// Sent when a [/obj/item/circuit_component] is added to a circuit manually, by putting the item inside directly. +/// Accepts COMPONENT_CANCEL_ADD_COMPONENT. +#define COMSIG_CIRCUIT_ADD_COMPONENT_MANUALLY "circuit_add_component_manually" + +/// Sent when a circuit is removed from its shell +#define COMSIG_CIRCUIT_SHELL_REMOVED "circuit_shell_removed" + +/// Sent to [/obj/item/circuit_component] when it is removed from a circuit. (/obj/item/integrated_circuit) +#define COMSIG_CIRCUIT_COMPONENT_REMOVED "circuit_component_removed" + +/// Sent to an atom when a [/obj/item/usb_cable] attempts to connect to something. (/obj/item/usb_cable/usb_cable, /mob/user) +#define COMSIG_ATOM_USB_CABLE_TRY_ATTACH "usb_cable_try_attach" + /// Attaches the USB cable to the atom. If the USB cables moves away, it will disconnect. + #define COMSIG_USB_CABLE_ATTACHED (1<<0) + + /// Attaches the USB cable to a circuit. Producers of this are expected to set the usb_cable's + /// `attached_circuit` variable. + #define COMSIG_USB_CABLE_CONNECTED_TO_CIRCUIT (1<<1) + + /// Cancels the attack chain, but without performing any other action. + #define COMSIG_CANCEL_USB_CABLE_ATTACK (1<<2) + +/// Sent from /obj/structure/industrial_lift/tram when its travelling status updates. (travelling) +#define COMSIG_TRAM_SET_TRAVELLING "tram_set_travelling" + +/// Sent from /obj/structure/industrial_lift/tram when it begins to travel. (obj/effect/landmark/tram/from_where, obj/effect/landmark/tram/to_where) +#define COMSIG_TRAM_TRAVEL "tram_travel" + +///for any tool behaviors: (mob/living/user, obj/item/I, list/recipes) +#define COMSIG_ATOM_TOOL_ACT(tooltype) "tool_act_[tooltype]" + #define COMPONENT_BLOCK_TOOL_ATTACK (1<<0) +//not widely used yet, but has lot of potential + +/// Called in /obj/structure/moneybot/add_money(). (to_add) +#define COMSIG_MONEYBOT_ADD_MONEY "moneybot_add_money" + +// /obj/machinery/door/airlock signals + +//from /obj/machinery/door/airlock/open(): (forced) +#define COMSIG_AIRLOCK_OPEN "airlock_open" +//from /obj/machinery/door/airlock/close(): (forced) +#define COMSIG_AIRLOCK_CLOSE "airlock_close" +///from /obj/machinery/door/airlock/set_bolt(): +#define COMSIG_AIRLOCK_SET_BOLT "airlock_set_bolt" +///Sent from /obj/machinery/door/airlock when its touched. (mob/user) +#define COMSIG_AIRLOCK_TOUCHED "airlock_touched" + #define COMPONENT_PREVENT_OPEN 1 + +// /obj/machinery/atmospherics/components/binary/valve signals + +/// from /obj/machinery/atmospherics/components/binary/valve/toggle(): (on) +#define COMSIG_VALVE_SET_OPEN "valve_toggled" + + +// /obj/machinery signals + +/// Sent from /obj/machinery/open_machine(): (drop) +#define COMSIG_MACHINE_OPEN "machine_open" +/// Sent from /obj/machinery/close_machine(): (atom/movable/target) +#define COMSIG_MACHINE_CLOSE "machine_close" + +// Aquarium related signals +#define COMSIG_AQUARIUM_BEFORE_INSERT_CHECK "aquarium_about_to_be_inserted" +#define COMSIG_AQUARIUM_SURFACE_CHANGED "aquarium_surface_changed" +#define COMSIG_AQUARIUM_FLUID_CHANGED "aquarium_fluid_changed" diff --git a/code/__DEFINES/diseases.dm b/code/__DEFINES/diseases.dm index d3e5b2b2f6da7..8b6956c3f2978 100644 --- a/code/__DEFINES/diseases.dm +++ b/code/__DEFINES/diseases.dm @@ -20,14 +20,14 @@ #define DISEASE_SPREAD_AIRBORNE (1<<5) #define DISEASE_SPREAD_FALTERED (1<<6) -//! ## Severity Defines -#define DISEASE_SEVERITY_BENEFICIAL "Beneficial"//! Symptoms that are very beneficial, whose benefits far outweigh downsides -#define DISEASE_SEVERITY_POSITIVE "Positive" //! Symptoms that buff or heal, but may have minor downsides, or minor effects -#define DISEASE_SEVERITY_NONTHREAT "Harmless" //! Symptoms that have no concrete mechanical effects that effect the host in any meaningful way (itching) -#define DISEASE_SEVERITY_MINOR "Minor" //! Symptoms that can annoy in concrete ways (dizziness) -#define DISEASE_SEVERITY_MEDIUM "Medium" //! Diseases that can do minor harm, or severe annoyance (vomit) -#define DISEASE_SEVERITY_HARMFUL "Harmful" //! Diseases that can do significant harm, or severe disruption (brainrot) -#define DISEASE_SEVERITY_DANGEROUS "Dangerous" //! Diseases that are lethal if untreated (flesh eating) -#define DISEASE_SEVERITY_BIOHAZARD "BIOHAZARD" //! Symptoms that can quickly kill an unprepared victim (fungal tb, gbs) -#define DISEASE_SEVERITY_PANDEMIC "PANDEMIC" //! Symptoms so deadly you will likely die before being cured (ARDS, autophageocytosis) +//! ## Disease Danger Defines +#define DISEASE_BENEFICIAL "Beneficial"//! Symptoms that are very beneficial, whose benefits far outweigh downsides +#define DISEASE_POSITIVE "Positive" //! Symptoms that buff or heal, but may have minor downsides, or minor effects +#define DISEASE_NONTHREAT "Harmless" //! Symptoms that have no concrete mechanical effects that effect the host in any meaningful way (itching) +#define DISEASE_MINOR "Minor" //! Symptoms that can annoy in concrete ways (dizziness) +#define DISEASE_MEDIUM "Medium" //! Diseases that can do minor harm, or severe annoyance (vomit) +#define DISEASE_HARMFUL "Harmful" //! Diseases that can do significant harm, or severe disruption (brainrot) +#define DISEASE_DANGEROUS "Dangerous" //! Diseases that are lethal if untreated (flesh eating) +#define DISEASE_BIOHAZARD "BIOHAZARD" //! Symptoms that can quickly kill an unprepared victim (fungal tb, gbs) +#define DISEASE_PANDEMIC "PANDEMIC" //! Symptoms so deadly you will likely die before being cured (ARDS, autophageocytosis) diff --git a/code/__DEFINES/dynamic.dm b/code/__DEFINES/dynamic.dm new file mode 100644 index 0000000000000..dedf05396c512 --- /dev/null +++ b/code/__DEFINES/dynamic.dm @@ -0,0 +1,17 @@ +/// This is the only ruleset that should be picked this round, used by admins and should not be on rulesets in code. +#define ONLY_RULESET (1 << 0) + +/// Only one ruleset with this flag will be picked. +#define HIGH_IMPACT_RULESET (1 << 1) + +/// This ruleset can only be picked once. Anything that does not have a scaling_cost MUST have this. +#define LONE_RULESET (1 << 2) + +/// No round event was hijacked this cycle +#define HIJACKED_NOTHING "HIJACKED_NOTHING" + +/// This cycle, a round event was hijacked when the last midround event was too recent. +#define HIJACKED_TOO_RECENT "HIJACKED_TOO_RECENT" + +/// This cycle, a round event was hijacked when the next midround event is too soon. +#define HIJACKED_TOO_SOON "HIJACKED_TOO_SOON" diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm index 1d8c3b6cedff4..091544f498877 100644 --- a/code/__DEFINES/economy.dm +++ b/code/__DEFINES/economy.dm @@ -1,12 +1,12 @@ #define STARTING_PAYCHECKS 5 -#define PAYCHECK_ASSISTANT 5 -#define PAYCHECK_MINIMAL 5 -#define PAYCHECK_EASY 20 -#define PAYCHECK_MEDIUM 50 -#define PAYCHECK_HARD 100 -#define PAYCHECK_COMMAND 200 -#define PAYCHECK_VIP 300 +#define PAYCHECK_ASSISTANT 10 +#define PAYCHECK_MINIMAL 10 +#define PAYCHECK_EASY 15 +#define PAYCHECK_MEDIUM 40 +#define PAYCHECK_HARD 70 +#define PAYCHECK_COMMAND 100 +#define PAYCHECK_VIP 250 #define PAYCHECK_WELFARE 20 //NEETbucks @@ -25,4 +25,4 @@ #define ACCOUNT_SEC "SEC" #define ACCOUNT_SEC_NAME "Defense Budget" -#define NO_FREEBIES "commies go home" \ No newline at end of file +#define NO_FREEBIES "commies go home" diff --git a/code/__DEFINES/exosuit_fab.dm b/code/__DEFINES/exosuit_fab.dm new file mode 100644 index 0000000000000..0e33e17e81756 --- /dev/null +++ b/code/__DEFINES/exosuit_fab.dm @@ -0,0 +1,30 @@ +/// Module is compatible with Security Cyborg models +#define BORG_MODULE_SECURITY (1<<0) +/// Module is compatible with Miner Cyborg models +#define BORG_MODULE_MINER (1<<1) +/// Module is compatible with Janitor Cyborg models +#define BORG_MODULE_JANITOR (1<<2) +/// Module is compatible with Medical Cyborg models +#define BORG_MODULE_MEDICAL (1<<3) +/// Module is compatible with Engineering Cyborg models +#define BORG_MODULE_ENGINEERING (1<<4) +/// Module is used for service Cyborgs specialization +#define BORG_MODULE_SPECIALITY (1<<5) + +/// Module is compatible with Ripley Exosuit models +#define EXOSUIT_MODULE_RIPLEY (1<<0) +/// Module is compatible with Odyseeus Exosuit models +#define EXOSUIT_MODULE_ODYSSEUS (1<<1) +/// Module is compatible with Gygax Exosuit models +#define EXOSUIT_MODULE_GYGAX (1<<2) +/// Module is compatible with Durand Exosuit models +#define EXOSUIT_MODULE_DURAND (1<<3) +/// Module is compatible with H.O.N.K Exosuit models +#define EXOSUIT_MODULE_HONK (1<<4) +/// Module is compatible with Phazon Exosuit models +#define EXOSUIT_MODULE_PHAZON (1<<5) + +/// Module is compatible with "Combat" Exosuit models - Gygax, H.O.N.K, Durand and Phazon +#define EXOSUIT_MODULE_COMBAT EXOSUIT_MODULE_GYGAX | EXOSUIT_MODULE_HONK | EXOSUIT_MODULE_DURAND | EXOSUIT_MODULE_PHAZON +/// Module is compatible with "Medical" Exosuit modelsm - Odysseus +#define EXOSUIT_MODULE_MEDICAL EXOSUIT_MODULE_ODYSSEUS diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index dd6fc9e9f3eac..0f89f6abced83 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -22,9 +22,6 @@ 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 (iron 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 @@ -33,15 +30,44 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #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 ADMIN_SPAWNED_1 (1<<15) //! was this spawned by an admin? used for stat tracking stuff. +#define PREVENT_CONTENTS_EXPLOSION_1 (1<<16) +#define UNPAINTABLE_1 (1<<17) + +/// 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) -//! ## turf-only flags +//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 +////////////////Area flags\\\\\\\\\\\\\\ +/// If it's a valid territory for cult summoning or the CRAB-17 phone to spawn +#define VALID_TERRITORY (1<<0) +/// If blobs can spawn there and if it counts towards their score. +#define BLOBS_ALLOWED (1<<1) +/// If mining tunnel generation is allowed in this area +#define CAVES_ALLOWED (1<<2) +/// If flora are allowed to spawn in this area randomly through tunnel generation +#define FLORA_ALLOWED (1<<3) +/// If mobs can be spawned by natural random generation +#define MOB_SPAWN_ALLOWED (1<<4) +/// If megafauna can be spawned by natural random generation +#define MEGAFAUNA_SPAWN_ALLOWED (1<<5) +/// Hides area from player Teleport function. +#define HIDDEN_AREA (1<<6) +/// If false, loading multiple maps with this area type will create multiple instances. +#define UNIQUE_AREA (1<<7) +/// If people are allowed to suicide in it. Mostly for OOC stuff like minigames +#define BLOCK_SUICIDE (1<<8) +/// Can the Xenobio management console transverse this area by default? +#define XENOBIOLOGY_COMPATIBLE (1<<9) + /* These defines are used specifically with the atom/pass_flags bitmask the atom/checkpass() proc uses them (tables will call movable atom checkpass(PASSTABLE) for example) @@ -61,6 +87,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #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 THROWN (1<<5) //! while an atom is being thrown //! ## Fire and Acid stuff, for resistance_flags #define LAVA_PROOF (1<<0) @@ -80,6 +107,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define TESLA_MOB_STUN (1<<4) #define TESLA_DEFAULT_FLAGS ALL +#define TESLA_ENERGY_PRIMARY_BALL_FLAGS TESLA_MACHINE_EXPLOSIVE | TESLA_OBJ_DAMAGE | TESLA_MOB_DAMAGE | TESLA_MOB_STUN +#define TESLA_ENERGY_MINI_BALL_FLAGS TESLA_OBJ_DAMAGE | TESLA_MOB_DAMAGE | TESLA_MOB_STUN #define TESLA_FUSION_FLAGS TESLA_OBJ_DAMAGE | TESLA_MOB_DAMAGE | TESLA_MOB_STUN //EMP protection @@ -106,3 +135,11 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 //alternate appearance flags #define AA_TARGET_SEE_APPEARANCE (1<<0) #define AA_MATCH_TARGET_OVERLAYS (1<<1) + +/// 33554431 (2^24 - 1) is the maximum value our bitflags can reach. +#define MAX_BITFLAG_DIGITS 8 + +//religious_tool flags +#define RELIGION_TOOL_INVOKE (1<<0) +#define RELIGION_TOOL_SACRIFICE (1<<1) +#define RELIGION_TOOL_SECTSELECT (1<<2) diff --git a/code/__DEFINES/important_recursive_contents.dm b/code/__DEFINES/important_recursive_contents.dm new file mode 100644 index 0000000000000..62be5b38e5398 --- /dev/null +++ b/code/__DEFINES/important_recursive_contents.dm @@ -0,0 +1,2 @@ +///the hearing channel of the important_recursive_contents list, everything in here will count as a hearing atom +#define RECURSIVE_CONTENTS_HEARING_SENSITIVE "recursive_contents_hearing_sensitive" diff --git a/code/__DEFINES/instruments.dm b/code/__DEFINES/instruments.dm new file mode 100644 index 0000000000000..420b81313cce7 --- /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 \ No newline at end of file diff --git a/code/__DEFINES/integrated_electronics.dm b/code/__DEFINES/integrated_electronics.dm deleted file mode 100644 index bbc77307038ef..0000000000000 --- a/code/__DEFINES/integrated_electronics.dm +++ /dev/null @@ -1,49 +0,0 @@ -#define IC_INPUT "I" -#define IC_OUTPUT "O" -#define IC_ACTIVATOR "A" - -// Pin functionality. -#define DATA_CHANNEL "data channel" -#define PULSE_CHANNEL "pulse channel" - -//! ## Methods of obtaining a circuit. -#define IC_SPAWN_DEFAULT 1 //! If the circuit comes in the default circuit box and able to be printed in the IC printer. -#define IC_SPAWN_RESEARCH 2 //! If the circuit design will be available in the IC printer after upgrading it. - -//! ## Classify circuits which do different actions -#define IC_ACTION_MOVEMENT (1<<0) //! If the circuit can move the assembly -#define IC_ACTION_COMBAT (1<<1) //! If the circuit can cause harm -#define IC_ACTION_LONG_RANGE (1<<2) //! If the circuit communicate with something outside of the assembly - -// Displayed along with the pin name to show what type of pin it is. -#define IC_FORMAT_ANY "\" -#define IC_FORMAT_STRING "\" -#define IC_FORMAT_CHAR "\" -#define IC_FORMAT_COLOR "\" -#define IC_FORMAT_NUMBER "\" -#define IC_FORMAT_DIR "\" -#define IC_FORMAT_BOOLEAN "\" -#define IC_FORMAT_REF "\" -#define IC_FORMAT_LIST "\" -#define IC_FORMAT_INDEX "\" - -#define IC_FORMAT_PULSE "\" - -// Used inside input/output list to tell the constructor what pin to make. -#define IC_PINTYPE_ANY /datum/integrated_io -#define IC_PINTYPE_STRING /datum/integrated_io/string -#define IC_PINTYPE_CHAR /datum/integrated_io/char -#define IC_PINTYPE_COLOR /datum/integrated_io/color -#define IC_PINTYPE_NUMBER /datum/integrated_io/number -#define IC_PINTYPE_DIR /datum/integrated_io/dir -#define IC_PINTYPE_BOOLEAN /datum/integrated_io/boolean -#define IC_PINTYPE_REF /datum/integrated_io/ref -#define IC_PINTYPE_LIST /datum/integrated_io/lists -#define IC_PINTYPE_INDEX /datum/integrated_io/index -#define IC_PINTYPE_SELFREF /datum/integrated_io/selfref - -#define IC_PINTYPE_PULSE_IN /datum/integrated_io/activate -#define IC_PINTYPE_PULSE_OUT /datum/integrated_io/activate/out - -// Data limits. -#define IC_MAX_LIST_LENGTH 500 diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 0abe93e06f520..66edfeaf61032 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -4,7 +4,7 @@ #define WEIGHT_CLASS_TINY 1 //! Usually items smaller then a human hand, (e.g. playing cards, lighter, scalpel, coins/holochips) #define WEIGHT_CLASS_SMALL 2 //! Pockets can hold small and tiny items, (e.g. flashlight, multitool, grenades, GPS device) #define WEIGHT_CLASS_NORMAL 3 //! Standard backpacks can carry tiny, small & normal items, (e.g. fire extinguisher, stun baton, gas mask, iron sheets) -#define WEIGHT_CLASS_BULKY 4 //! Items that can be weilded or equipped but not stored in an inventory, (e.g. defibrillator, backpack, space suits) +#define WEIGHT_CLASS_BULKY 4 //! Items that can be wielded or equipped but not stored in an inventory, (e.g. defibrillator, backpack, space suits) #define WEIGHT_CLASS_HUGE 5 //! Usually represents objects that require two hands to operate, (e.g. shotgun, two-handed melee weapons) #define WEIGHT_CLASS_GIGANTIC 6 //! Essentially means it cannot be picked up or placed in an inventory, (e.g. mech parts, safe) @@ -25,74 +25,20 @@ #define ITEM_SLOT_ID (1<<8) #define ITEM_SLOT_BELT (1<<9) #define ITEM_SLOT_BACK (1<<10) -#define ITEM_SLOT_POCKET (1<<11) //! this is to allow items with a w_class of WEIGHT_CLASS_NORMAL or WEIGHT_CLASS_BULKY to fit in pockets. -#define ITEM_SLOT_DENYPOCKET (1<<12) //! this is to deny items with a w_class of WEIGHT_CLASS_SMALL or WEIGHT_CLASS_TINY to fit in pockets. -#define ITEM_SLOT_NECK (1<<13) -#define ITEM_SLOT_HANDS (1<<14) -#define ITEM_SLOT_BACKPACK (1<<15) -#define ITEM_SLOT_SUITSTORE (1<<16) - -//! ## SLOTS -#define SLOT_BACK 1 -#define SLOT_WEAR_MASK 2 -#define SLOT_HANDCUFFED 3 -#define SLOT_HANDS 4 //! wherever you provide a slot for hands you provide SLOT_HANDS. SLOT_HANDS as a slot will pick ANY available hand -#define SLOT_BELT 5 -#define SLOT_WEAR_ID 6 -#define SLOT_EARS 7 -#define SLOT_GLASSES 8 -#define SLOT_GLOVES 9 -#define SLOT_NECK 10 -#define SLOT_HEAD 11 -#define SLOT_SHOES 12 -#define SLOT_WEAR_SUIT 13 -#define SLOT_W_UNIFORM 14 -#define SLOT_L_STORE 15 -#define SLOT_R_STORE 16 -#define SLOT_S_STORE 17 -#define SLOT_IN_BACKPACK 18 -#define SLOT_LEGCUFFED 19 -#define SLOT_GENERC_DEXTROUS_STORAGE 20 - -#define SLOTS_AMT 20 //! Keep this up to date! - -//I hate that this has to exist -/proc/slotdefine2slotbit(slotdefine) //Keep this up to date with the value of SLOT BITMASKS and SLOTS (the two define sections above) - . = 0 - switch(slotdefine) - if(SLOT_BACK) - . = ITEM_SLOT_BACK - if(SLOT_WEAR_MASK) - . = ITEM_SLOT_MASK - if(SLOT_NECK) - . = ITEM_SLOT_NECK - if(SLOT_BELT) - . = ITEM_SLOT_BELT - if(SLOT_WEAR_ID) - . = ITEM_SLOT_ID - if(SLOT_EARS) - . = ITEM_SLOT_EARS - if(SLOT_GLASSES) - . = ITEM_SLOT_EYES - if(SLOT_GLOVES) - . = ITEM_SLOT_GLOVES - if(SLOT_HEAD) - . = ITEM_SLOT_HEAD - if(SLOT_SHOES) - . = ITEM_SLOT_FEET - if(SLOT_WEAR_SUIT) - . = ITEM_SLOT_OCLOTHING - if(SLOT_W_UNIFORM) - . = ITEM_SLOT_ICLOTHING - if(SLOT_L_STORE, SLOT_R_STORE) - . = ITEM_SLOT_POCKET - if(SLOT_HANDS) - . = ITEM_SLOT_HANDS - if(SLOT_S_STORE) - . = ITEM_SLOT_SUITSTORE - if(SLOT_IN_BACKPACK) - . = ITEM_SLOT_BACKPACK +#define ITEM_SLOT_DEX_STORAGE (1<<11) +#define ITEM_SLOT_NECK (1<<12) +#define ITEM_SLOT_HANDS (1<<13) +#define ITEM_SLOT_BACKPACK (1<<14) +#define ITEM_SLOT_SUITSTORE (1<<15) +#define ITEM_SLOT_LPOCKET (1<<16) +#define ITEM_SLOT_RPOCKET (1<<17) +#define ITEM_SLOT_HANDCUFFED (1<<18) +#define ITEM_SLOT_LEGCUFFED (1<<19) +#define SLOTS_AMT 20 // Keep this up to date! + +//SLOT GROUP HELPERS +#define ITEM_SLOT_POCKETS (ITEM_SLOT_LPOCKET|ITEM_SLOT_RPOCKET) //Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses. //Make sure to update check_obscured_slots() if you add more. @@ -128,6 +74,10 @@ #define NECK (1<<11) #define FULL_BODY (~0) +//defines for the index of hands +#define LEFT_HANDS 1 +#define RIGHT_HANDS 2 + //flags for female outfits: How much the game can safely "take off" the uniform without it looking weird #define NO_FEMALE_UNIFORM 0 #define FEMALE_UNIFORM_FULL 1 @@ -148,11 +98,10 @@ //! ## 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) -#define PEPPERPROOF (1<<5) //protects against pepperspray #define TINT_DARKENED 2 //! Threshold of tint level to apply weld mask overlay #define TINT_BLIND 3 //! Threshold of tint level to obscure vision fully diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 9e6dcc3bde6f0..a4bb6d0dadcec 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -2,6 +2,9 @@ #define in_range(source, user) (get_dist(source, user) <= 1 && (get_step(source, 0)?:z) == (get_step(user, 0)?:z)) +/// Within given range, but not counting z-levels +#define IN_GIVEN_RANGE(source, other, given_range) (get_dist(source, other) <= given_range && (get_step(source, 0)?:z) == (get_step(other, 0)?:z)) + #define ismovableatom(A) ismovable(A) #define isatom(A) (isloc(A)) @@ -48,6 +51,9 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define isbrain(A) (istype(A, /mob/living/brain)) +// basic mobs +#define isbasicmob(A) (istype(A, /mob/living/basic)) + //Carbon mobs #define iscarbon(A) (istype(A, /mob/living/carbon)) @@ -63,6 +69,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define isjellyperson(A) (is_species(A, /datum/species/jelly)) #define isslimeperson(A) (is_species(A, /datum/species/jelly/slime)) #define isluminescent(A) (is_species(A, /datum/species/jelly/luminescent)) +#define isoozeling(A) (is_species(A, /datum/species/oozeling)) #define iszombie(A) (is_species(A, /datum/species/zombie)) #define isskeleton(A) (is_species(A, /datum/species/skeleton)) #define ismoth(A) (is_species(A, /datum/species/moth)) @@ -71,6 +78,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define isethereal(A) (is_species(A, /datum/species/ethereal)) #define isvampire(A) (is_species(A,/datum/species/vampire)) #define isipc(A) (is_species(A, /datum/species/ipc)) +#define isapid(A) (is_species(A, /datum/species/apid)) //more carbon mobs #define ismonkey(A) (istype(A, /mob/living/carbon/monkey)) @@ -193,7 +201,7 @@ GLOBAL_LIST_INIT(heavyfootmob, typecacheof(list( #define iscameramob(A) (istype(A, /mob/camera)) -#define isaicamera(A) (istype(A, /mob/camera/aiEye)) +#define isaicamera(A) (istype(A, /mob/camera/ai_eye)) //Footstep helpers #define isshoefoot(A) (is_type_in_typecache(A, GLOB.shoefootmob)) @@ -209,6 +217,14 @@ 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)) #define ismachinery(A) (istype(A, /obj/machinery)) @@ -219,6 +235,8 @@ GLOBAL_LIST_INIT(heavyfootmob, typecacheof(list( #define isorgan(A) (istype(A, /obj/item/organ)) +#define isclothing(A) (istype(A, /obj/item/clothing)) + GLOBAL_LIST_INIT(pointed_types, typecacheof(list( /obj/item/pen, /obj/item/screwdriver, @@ -254,6 +272,8 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define iseffect(O) (istype(O, /obj/effect)) +#define isholoeffect(O) (istype(O, /obj/effect/holodeck_effect)) + #define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob)) #define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs)) @@ -263,5 +283,11 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define isinf(x) (isnum((x)) && (((x) == text2num("inf")) || ((x) == text2num("-inf")))) +#define isProbablyWallMounted(O) (O.pixel_x > 20 || O.pixel_x < -20 || O.pixel_y > 20 || O.pixel_y < -20) + +#define isbook(O) (is_type_in_typecache(O, GLOB.book_types)) + /// NaN isn't a number, damn it. Infinity is a problem too. #define isnum_safe(x) ( isnum((x)) && !isnan((x)) && !isinf((x)) ) + +#define iscash(A) (istype(A, /obj/item/coin) || istype(A, /obj/item/stack/spacecash) || istype(A, /obj/item/holochip)) diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 7fd0187e73541..7d320f5ff8935 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -20,12 +20,13 @@ #define RD_JF (1<<0) #define SCIENTIST (1<<1) -#define CHEMIST (1<<2) -#define CMO_JF (1<<3) -#define DOCTOR (1<<4) -#define GENETICIST (1<<5) -#define VIROLOGIST (1<<6) -#define EMT (1<<7) +#define EXPLORATION_CREW (1<<2) +#define CHEMIST (1<<3) +#define CMO_JF (1<<4) +#define DOCTOR (1<<5) +#define GENETICIST (1<<6) +#define VIROLOGIST (1<<7) +#define EMT (1<<8) #define CIVILIAN (1<<2) @@ -88,12 +89,22 @@ #define JOB_DISPLAY_ORDER_VIROLOGIST 23 #define JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR 24 #define JOB_DISPLAY_ORDER_SCIENTIST 25 -#define JOB_DISPLAY_ORDER_ROBOTICIST 26 -#define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 27 -#define JOB_DISPLAY_ORDER_WARDEN 28 -#define JOB_DISPLAY_ORDER_DETECTIVE 29 -#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 30 -#define JOB_DISPLAY_ORDER_BRIG_PHYS 31 -#define JOB_DISPLAY_ORDER_DEPUTY 32 -#define JOB_DISPLAY_ORDER_AI 33 -#define JOB_DISPLAY_ORDER_CYBORG 34 +#define JOB_DISPLAY_ORDER_EXPLORATION 26 +#define JOB_DISPLAY_ORDER_ROBOTICIST 27 +#define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 28 +#define JOB_DISPLAY_ORDER_WARDEN 29 +#define JOB_DISPLAY_ORDER_DETECTIVE 30 +#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 31 +#define JOB_DISPLAY_ORDER_BRIG_PHYS 32 +#define JOB_DISPLAY_ORDER_DEPUTY 33 +#define JOB_DISPLAY_ORDER_AI 34 +#define JOB_DISPLAY_ORDER_CYBORG 35 + +#define DEPARTMENT_SECURITY (1<<0) +#define DEPARTMENT_COMMAND (1<<1) +#define DEPARTMENT_SERVICE (1<<2) +#define DEPARTMENT_CARGO (1<<3) +#define DEPARTMENT_ENGINEERING (1<<4) +#define DEPARTMENT_SCIENCE (1<<5) +#define DEPARTMENT_MEDICAL (1<<6) +#define DEPARTMENT_SILICON (1<<7) diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index 01ff150a96f75..d8b25adac7ebe 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -24,3 +24,4 @@ #define LANGUAGE_VOICECHANGE "voicechange" #define LANGUAGE_REAGENT "reagent" #define LANGUAGE_MULTILINGUAL "multilingual" +#define LANGUAGE_EMP "emp" diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 9b5651a56fbb3..aef63a2e8b81b 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -4,7 +4,9 @@ #define CLICKCATCHER_PLANE -99 #define PLANE_SPACE -95 +#define PLANE_SPACE_RENDER_TARGET "PLANE_SPACE" #define PLANE_SPACE_PARALLAX -90 +#define PLANE_SPACE_PARALLAX_RENDER_TARGET "PLANE_SPACE_PARALLAX" #define OPENSPACE_LAYER 17 //Openspace layer over all @@ -13,15 +15,21 @@ #define FLOOR_PLANE -2 +#define FLOOR_PLANE_RENDER_TARGET "FLOOR_PLANE" #define GAME_PLANE -1 +#define GAME_PLANE_RENDER_TARGET "GAME_PLANE" #define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals +#define BLACKNESS_PLANE_RENDER_TARGET "BLACKNESS_PLANE" #define SPACE_LAYER 1.8 //#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define #define MID_TURF_LAYER 2.02 #define HIGH_TURF_LAYER 2.03 + +#define TURF_DECAL_LOWEST_LAYER 2.031 #define TURF_PLATING_DECAL_LAYER 2.031 #define TURF_DECAL_LAYER 2.039 //Makes turf decals appear in DM how they will look inworld. +#define TURF_DECAL_STRIPE_LAYER 2.0391 #define ABOVE_OPEN_TURF_LAYER 2.04 #define CLOSED_TURF_LAYER 2.05 #define BULLET_HOLE_LAYER 2.06 @@ -72,6 +80,9 @@ #define LARGE_MOB_LAYER 4.4 #define ABOVE_ALL_MOB_LAYER 4.5 +#define METEOR_SHADOW_LAYER 4.69 +#define METEOR_LAYER 4.7 + #define SPACEVINE_LAYER 4.8 #define SPACEVINE_MOB_LAYER 4.9 //#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define @@ -86,34 +97,65 @@ #define MASSIVE_OBJ_LAYER 11 #define POINT_LAYER 12 +#define CHAT_LAYER 12.0001 // Do not insert layers between these two values +#define CHAT_LAYER_MAX 12.9999 + +#define EMISSIVE_BLOCKER_PLANE 12 +#define EMISSIVE_BLOCKER_LAYER 12 +#define EMISSIVE_BLOCKER_RENDER_TARGET "*EMISSIVE_BLOCKER_PLANE" + +#define EMISSIVE_PLANE 13 +#define EMISSIVE_LAYER 13 +#define EMISSIVE_RENDER_TARGET "*EMISSIVE_PLANE" + +#define EMISSIVE_UNBLOCKABLE_PLANE 14 +#define EMISSIVE_UNBLOCKABLE_LAYER 14 +#define EMISSIVE_UNBLOCKABLE_RENDER_TARGET "*EMISSIVE_UNBLOCKABLE_PLANE" + #define LIGHTING_PLANE 15 #define LIGHTING_LAYER 15 +#define LIGHTING_RENDER_TARGET "LIGHT_PLANE" #define RAD_TEXT_LAYER 21 #define ABOVE_LIGHTING_PLANE 16 #define ABOVE_LIGHTING_LAYER 16 +#define ABOVE_LIGHTING_RENDER_TARGET "ABOVE_LIGHTING_PLANE" #define BYOND_LIGHTING_PLANE 18 #define BYOND_LIGHTING_LAYER 18 +#define BYOND_LIGHTING_RENDER_TARGET "BYOND_LIGHTING_PLANE" #define CAMERA_STATIC_PLANE 19 #define CAMERA_STATIC_LAYER 19 +#define CAMERA_STATIC_RENDER_TARGET "CAMERA_STATIC_PLANE" + +#define RUNECHAT_PLANE 20 + +/// Plane for balloon text (text that fades up) +#define BALLOON_CHAT_PLANE 20.5 //HUD layer defines -#define FULLSCREEN_PLANE 20 -#define FLASH_LAYER 20 -#define FULLSCREEN_LAYER 20.1 -#define UI_DAMAGE_LAYER 20.2 -#define BLIND_LAYER 20.3 -#define CRIT_LAYER 20.4 -#define CURSE_LAYER 20.5 - -#define HUD_PLANE 21 -#define HUD_LAYER 21 -#define ABOVE_HUD_PLANE 22 -#define ABOVE_HUD_LAYER 22 - -#define SPLASHSCREEN_LAYER 23 -#define SPLASHSCREEN_PLANE 23 +#define FULLSCREEN_PLANE 21 +#define FLASH_LAYER 21 +#define FULLSCREEN_LAYER 21.1 +#define UI_DAMAGE_LAYER 21.2 +#define BLIND_LAYER 21.3 +#define CRIT_LAYER 21.4 +#define CURSE_LAYER 21.5 +#define FULLSCREEN_RENDER_TARGET "FULLSCREEN_PLANE" + +#define HUD_PLANE 22 +#define HUD_LAYER 22 +#define HUD_RENDER_TARGET "HUD_PLANE" +#define ABOVE_HUD_PLANE 23 +#define ABOVE_HUD_LAYER 23 +#define ABOVE_HUD_RENDER_TARGET "ABOVE_HUD_PLANE" + +#define SPLASHSCREEN_LAYER 24 +#define SPLASHSCREEN_PLANE 24 +#define SPLASHSCREEN_RENDER_TARGET "SPLASHSCREEN_PLANE" + +///Plane master controller keys +#define PLANE_MASTERS_GAME "plane_masters_game" diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index f754bd0656e81..04721e6cafd3a 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -82,6 +82,11 @@ #define FLASH_LIGHT_POWER 3 #define FLASH_LIGHT_RANGE 3.8 +/// Uses vis_overlays to leverage caching so that very few new items need to be made for the overlay. For anything that doesn't change outline or opaque area much or at all. +#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)) diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index b8748952e03cb..b652d183d4685 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -5,8 +5,7 @@ #define INVESTIGATE_EXPERIMENTOR "experimentor" #define INVESTIGATE_GRAVITY "gravity" #define INVESTIGATE_RECORDS "records" -#define INVESTIGATE_SINGULO "singulo" -#define INVESTIGATE_SUPERMATTER "supermatter" +#define INVESTIGATE_ENGINES "engines" #define INVESTIGATE_TELESCI "telesci" #define INVESTIGATE_WIRES "wires" #define INVESTIGATE_PORTAL "portals" @@ -15,7 +14,6 @@ #define INVESTIGATE_RADIATION "radiation" #define INVESTIGATE_EXONET "exonet" #define INVESTIGATE_NANITES "nanites" -#define INVESTIGATE_CIRCUIT "circuit" #define INVESTIGATE_PRESENTS "presents" // Logging types for log_message() diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 6e87306d1293a..13866ea54237e 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -22,6 +22,9 @@ #define IDLE_POWER_USE 1 #define ACTIVE_POWER_USE 2 +/// Bitflags for a machine's preferences on when it should start processing. For use with machinery's `processing_flags` var. +#define START_PROCESSING_ON_INIT (1<<0) /// Indicates the machine will automatically start processing right after it's `Initialize()` is ran. +#define START_PROCESSING_MANUALLY (1<<1) /// Machines with this flag will not start processing when it's spawned. Use this if you want to manually control when a machine starts processing. //bitflags for door switches. #define OPEN (1<<0) @@ -40,6 +43,8 @@ #define LIMBGROWER (1<<6) //Uses synthetic flesh #define SMELTER (1<<7) //uses various minerals #define NANITE_COMPILER (1<<8) //Prints nanite disks +/// For wiremod/integrated circuits. Uses various minerals. +#define COMPONENT_PRINTER (1<<10) //Note: More than one of these can be added to a design but imprinter and lathe designs are incompatable. //Modular computer/NTNet defines diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index c6fb912010d90..a0b5eb26a6e9b 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -35,7 +35,7 @@ require only minor tweaks. #define ZTRAIT_REEBE "Reebe" #define ZTRAIT_RESERVED "Transit/Reserved" #define ZTRAIT_AWAY "Away Mission" -#define ZTRAIT_SPACE_RUINS "Space Ruins" +#define ZTRAIT_DYNAMIC_LEVEL "Dynamic Level" #define ZTRAIT_LAVA_RUINS "Lava Ruins" #define ZTRAIT_POCKETDIM "Pocket Dimension" @@ -63,8 +63,8 @@ require only minor tweaks. /// default trait definitions, used by SSmapping #define ZTRAITS_CENTCOM list(ZTRAIT_CENTCOM = TRUE) -#define ZTRAITS_STATION list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_STATION = TRUE) -#define ZTRAITS_SPACE list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_SPACE_RUINS = TRUE) +#define ZTRAITS_STATION list(ZTRAIT_LINKAGE = SELFLOOPING, ZTRAIT_STATION = TRUE) +#define ZTRAITS_SPACE list(ZTRAIT_LINKAGE = SELFLOOPING, ZTRAIT_DYNAMIC_LEVEL = TRUE) #define ZTRAITS_LAVALAND list(\ ZTRAIT_MINING = TRUE, \ ZTRAIT_LAVA_RUINS = TRUE, \ @@ -97,3 +97,23 @@ require only minor tweaks. #define PLACE_SAME_Z "same" #define PLACE_SPACE_RUIN "space" #define PLACE_LAVA_RUIN "lavaland" + + +///Map generation defines +#define PERLIN_LAYER_HEIGHT "perlin_height" +#define PERLIN_LAYER_HUMIDITY "perlin_humidity" +#define PERLIN_LAYER_HEAT "perlin_heat" + +#define BIOME_LOW_HEAT "low_heat" +#define BIOME_LOWMEDIUM_HEAT "lowmedium_heat" +#define BIOME_HIGHMEDIUM_HEAT "highmedium_heat" +#define BIOME_HIGH_HEAT "high_heat" + +#define BIOME_LOW_HUMIDITY "low_humidity" +#define BIOME_LOWMEDIUM_HUMIDITY "lowmedium_humidity" +#define BIOME_HIGHMEDIUM_HUMIDITY "highmedium_humidity" +#define BIOME_HIGH_HUMIDITY "high_humidity" + +///Hint for whether a genturf should generate as a closed or open turf. null for default. +#define GENTURF_HINT_OPEN "open" +#define GENTURF_HINT_CLOSED "closed" diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 372ab654c664b..d4ce660ace924 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -61,9 +61,6 @@ #define INVERSE(x) ( 1/(x) ) -/// Used for calculating the radioactive strength falloff -#define INVERSE_SQUARE(initial_strength,cur_distance,initial_distance) ( (initial_strength)*((initial_distance)**2/(cur_distance)**2) ) - #define ISABOUTEQUAL(a, b, deviation) (deviation ? abs((a) - (b)) <= deviation : abs((a) - (b)) <= 0.1) #define ISEVEN(x) (x % 2 == 0) @@ -88,7 +85,13 @@ /// Returns the nth root of x. #define ROOT(n, x) ((x) ** (1 / (n))) -/// The quadratic formula. Returns a list with the solutions, or an empty list if they are imaginary. +/// Low-pass filter a value to smooth out high frequent peaks. This can be thought of as a moving average filter as well. +/// delta_time is how many seconds since we last ran this command. RC is the filter constant, high RC means more smoothing +/// See https://en.wikipedia.org/wiki/Low-pass_filter#Simple_infinite_impulse_response_filter for the maths +#define LPFILTER(memory, signal, delta_time, RC) (delta_time / (RC + delta_time)) * signal + (1 - delta_time / (RC + delta_time)) * memory + +// The quadratic formula. Returns a list with the solutions, or an empty list +// if they are imaginary. /proc/SolveQuadratic(a, b, c) ASSERT(a) . = list() @@ -106,7 +109,11 @@ #define TORADIANS(degrees) ((degrees) * 0.0174532925) -/// Will filter out extra rotations and negative rotations E.g: 540 becomes 180. -180 becomes 180. +/// Gets shift x that would be required the bitflag (1< alert computers diff --git a/code/__DEFINES/reactions.dm b/code/__DEFINES/reactions.dm index 2f7e809db756a..0cf6833cf23e3 100644 --- a/code/__DEFINES/reactions.dm +++ b/code/__DEFINES/reactions.dm @@ -38,13 +38,19 @@ //Plasma fusion properties #define FUSION_ENERGY_THRESHOLD 3e9 //! Amount of energy it takes to start a fusion reaction #define FUSION_MOLE_THRESHOLD 250 //! Mole count required (tritium/plasma) to start a fusion reaction -#define FUSION_TRITIUM_CONVERSION_COEFFICIENT (1e-10) -#define INSTABILITY_GAS_POWER_FACTOR 0.003 +#define FUSION_TRITIUM_CONVERSION_COEFFICIENT 0.002 +#define INSTABILITY_GAS_POWER_FACTOR 3 #define FUSION_TRITIUM_MOLES_USED 1 #define PLASMA_BINDING_ENERGY 20000000 -#define TOROID_VOLUME_BREAKEVEN 1000 +#define TOROID_CALCULATED_THRESHOLD 5.96 //! changing it by 0.1 generally doubles or halves fusion temps #define FUSION_TEMPERATURE_THRESHOLD 10000 #define PARTICLE_CHANCE_CONSTANT (-20000000) -#define FUSION_RAD_MAX 2000 -#define FUSION_RAD_COEFFICIENT (-1000) #define FUSION_INSTABILITY_ENDOTHERMALITY 2 +#define FUSION_SCALE_DIVISOR 10 //! Used to be Pi +#define FUSION_MINIMAL_SCALE 50 +#define FUSION_SLOPE_DIVISOR 1250 //! This number is probably the safest number to change +#define FUSION_ENERGY_TRANSLATION_EXPONENT 1.25 //! This number is probably the most dangerous number to change +#define FUSION_BASE_TEMPSCALE 6 //! This number is responsible for orchestrating fusion temperatures +#define FUSION_RAD_MIDPOINT 15 //! If you decrease this by one, the fusion rads will *triple* and vice versa +#define FUSION_MIDDLE_ENERGY_REFERENCE 1e6 //! This number is deceptively dangerous; sort of tied to TOROID_CALCULATED_THRESHOLD +#define FUSION_BUFFER_DIVISOR 1 //! Increase this to cull unrobust fusions faster diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm index db9436f796d14..75f5a0e387f06 100644 --- a/code/__DEFINES/research.dm +++ b/code/__DEFINES/research.dm @@ -64,6 +64,7 @@ //When adding new types, update the list below! #define TECHWEB_POINT_TYPE_GENERIC "General Research" +#define TECHWEB_POINT_TYPE_DISCOVERY "Discovery Research" #define TECHWEB_POINT_TYPE_NANITES "Nanite Research" #define TECHWEB_POINT_TYPE_DEFAULT TECHWEB_POINT_TYPE_GENERIC @@ -71,6 +72,7 @@ //defined here so people don't forget to change this! #define TECHWEB_POINT_TYPE_LIST_ASSOCIATIVE_NAMES list(\ TECHWEB_POINT_TYPE_GENERIC = "General Research",\ + TECHWEB_POINT_TYPE_DISCOVERY = "Discovery Research",\ TECHWEB_POINT_TYPE_NANITES = "Nanite Research"\ ) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 7ad8ca5770e20..d12c0c1733afa 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -15,6 +15,7 @@ #define ROLE_INCURSION "Incursion Team" #define ROLE_REV "Revolutionary" #define ROLE_REV_HEAD "Head Revolutionary" +#define ROLE_REV_SUCCESSFUL "Victorious Revolutionary" #define ROLE_ALIEN "Xenomorph" #define ROLE_PAI "pAI" #define ROLE_CULTIST "Cultist" @@ -30,7 +31,7 @@ #define ROLE_BRAINWASHED "Brainwashed Victim" #define ROLE_OVERTHROW "Syndicate Mutineer" #define ROLE_HIVE "Hivemind Host" -#define ROLE_OBSESSED "Obsessed" +#define ROLE_OBSESSED "Obsessed" #define ROLE_SENTIENCE "Sentience Potion Spawn" #define ROLE_MIND_TRANSFER "Mind Transfer Potion" #define ROLE_POSIBRAIN "Posibrain" @@ -40,6 +41,7 @@ #define ROLE_INTERNAL_AFFAIRS "Internal Affairs Agent" #define ROLE_GANG "Gangster" #define ROLE_HOLOPARASITE "Holoparasite" +#define ROLE_TERATOMA "Teratoma" //Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR. //The gamemode specific ones are just so the gamemodes can query whether a player is old enough @@ -70,7 +72,8 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_SENTIENCE, ROLE_GANG = /datum/game_mode/gang, ROLE_HOLOPARASITE, - ROLE_HERETIC = /datum/game_mode/heretics + ROLE_HERETIC = /datum/game_mode/heretics, + ROLE_TERATOMA )) //Job defines for what happens when you fail to qualify for any job during job selection diff --git a/code/__DEFINES/rust_g.dm b/code/__DEFINES/rust_g.dm index f086a22b0e7d5..69f7c3be2abba 100644 --- a/code/__DEFINES/rust_g.dm +++ b/code/__DEFINES/rust_g.dm @@ -7,7 +7,7 @@ // Override the .dll/.so detection logic with a fixed path or with detection // logic of your own. // -//#define RUSTG_OVERRIDE_BUILTINS +// #define RUSTG_OVERRIDE_BUILTINS // Enable replacement rust-g functions for certain builtins. Off by default. #ifndef RUST_G @@ -38,35 +38,50 @@ #define RUST_G (__rust_g || __detect_rust_g()) #endif -#define RUSTG_JOB_NO_RESULTS_YET "NO RESULTS YET" -#define RUSTG_JOB_NO_SUCH_JOB "NO SUCH JOB" -#define RUSTG_JOB_ERROR "JOB PANICKED" +/** + * This proc generates a cellular automata noise grid which can be used in procedural generation methods. + * + * Returns a single string that goes row by row, with values of 1 representing an alive cell, and a value of 0 representing a dead cell. + * + * Arguments: + * * percentage: The chance of a turf starting closed + * * smoothing_iterations: The amount of iterations the cellular automata simulates before returning the results + * * birth_limit: If the number of neighboring cells is higher than this amount, a cell is born + * * death_limit: If the number of neighboring cells is lower than this amount, a cell dies + * * width: The width of the grid. + * * height: The height of the grid. + */ +#define rustg_cnoise_generate(percentage, smoothing_iterations, birth_limit, death_limit, width, height) \ + call(RUST_G, "cnoise_generate")(percentage, smoothing_iterations, birth_limit, death_limit, width, height) -#define rustg_dmi_strip_metadata(fname) call(RUST_G, "dmi_strip_metadata")(fname) +#define rustg_dmi_strip_metadata(fname) call(RUST_G, "dmi_strip_metadata")("[fname]") #define rustg_dmi_create_png(path, width, height, data) call(RUST_G, "dmi_create_png")(path, width, height, data) - -#define rustg_noise_get_at_coordinates(seed, x, y) call(RUST_G, "noise_get_at_coordinates")(seed, x, y) +#define rustg_dmi_resize_png(path, width, height, resizetype) call(RUST_G, "dmi_resize_png")(path, width, height, resizetype) #define rustg_file_read(fname) call(RUST_G, "file_read")("[fname]") +#define rustg_file_exists(fname) call(RUST_G, "file_exists")("[fname]") #define rustg_file_write(text, fname) call(RUST_G, "file_write")(text, "[fname]") #define rustg_file_append(text, fname) call(RUST_G, "file_append")(text, "[fname]") +#ifdef RUSTG_OVERRIDE_BUILTINS + #define file2text(fname) rustg_file_read("[fname]") + #define text2file(text, fname) rustg_file_append(text, "[fname]") +#endif + #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_hash_string(algorithm, text) call(RUST_G, "hash_string")(algorithm, text) -#define rustg_hash_file(algorithm, fname) call(RUST_G, "hash_file")(algorithm, fname) +#define rustg_hash_file(algorithm, fname) call(RUST_G, "hash_file")(algorithm, "[fname]") #define RUSTG_HASH_MD5 "md5" #define RUSTG_HASH_SHA1 "sha1" #define RUSTG_HASH_SHA256 "sha256" #define RUSTG_HASH_SHA512 "sha512" -#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")() - -#define rustg_url_encode(text) call(RUST_G, "url_encode")(text) -#define rustg_url_decode(text) call(RUST_G, "url_decode")(text) +#ifdef RUSTG_OVERRIDE_BUILTINS +#define md5(thing) (isfile(thing) ? rustg_hash_file(RUSTG_HASH_MD5, "[thing]") : rustg_hash_string(RUSTG_HASH_MD5, thing)) +#endif #define RUSTG_HTTP_METHOD_GET "get" #define RUSTG_HTTP_METHOD_PUT "put" @@ -78,9 +93,31 @@ #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) +#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_json_is_valid(text) (call(RUST_G, "json_is_valid")(text) == "true") + +#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")() + +#define rustg_noise_get_at_coordinates(seed, x, y) call(RUST_G, "noise_get_at_coordinates")(seed, x, y) + #define rustg_sql_connect_pool(options) call(RUST_G, "sql_connect_pool")(options) #define rustg_sql_query_async(handle, query, params) call(RUST_G, "sql_query_async")(handle, query, params) #define rustg_sql_query_blocking(handle, query, params) call(RUST_G, "sql_query_blocking")(handle, query, params) #define rustg_sql_connected(handle) call(RUST_G, "sql_connected")(handle) #define rustg_sql_disconnect_pool(handle) call(RUST_G, "sql_disconnect_pool")(handle) #define rustg_sql_check_query(job_id) call(RUST_G, "sql_check_query")("[job_id]") + +#define rustg_unzip_download_async(url, unzip_directory) call(RUST_G, "unzip_download_async")(url, unzip_directory) +#define rustg_unzip_check(job_id) call(RUST_G, "unzip_check")("[job_id]") + +#define rustg_url_encode(text) call(RUST_G, "url_encode")(text) +#define rustg_url_decode(text) call(RUST_G, "url_decode")(text) + +#ifdef RUSTG_OVERRIDE_BUILTINS + #define url_encode(text) rustg_url_encode(text) + #define url_decode(text) rustg_url_decode(text) +#endif diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index 2ede503d1962b..081f9ea50087f 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -3,6 +3,10 @@ Currently contains speech spans and message modes */ +#define RADIO_EXTENSION "department specific" +#define RADIO_KEY "department specific key" +#define LANGUAGE_EXTENSION "language specific" + //Message modes. Each one defines a radio channel, more or less. #define MODE_HEADSET "headset" #define MODE_ROBOT "robot" @@ -21,6 +25,7 @@ #define MODE_KEY_BINARY "b" #define MODE_TOKEN_BINARY ":b" + #define WHISPER_MODE "the type of whisper" #define MODE_WHISPER "whisper" #define MODE_WHISPER_CRIT "whispercrit" @@ -28,12 +33,6 @@ #define MODE_KEY_DEPARTMENT "h" #define MODE_TOKEN_DEPARTMENT ":h" -#define MODE_ADMIN "admin" -#define MODE_KEY_ADMIN "p" - -#define MODE_DEADMIN "deadmin" -#define MODE_KEY_DEADMIN "d" - #define MODE_ALIEN "alientalk" #define MODE_HOLOPAD "holopad" @@ -56,13 +55,14 @@ #define SPAN_PAPYRUS "papyrus" #define SPAN_REALLYBIG "reallybig" #define SPAN_COMMAND "command_headset" -#define SPAN_CLOWN "clown" +#define SPAN_MEGAPHONE "megaphone" +#define SPAN_CLOWN "clowntext" #define SPAN_SINGING "singing" //bitflag #defines for return value of the radio() proc. -#define ITALICS 1 -#define REDUCE_RANGE 2 -#define NOPASS 4 +#define ITALICS (1<<0) +#define REDUCE_RANGE (1<<1) +#define NOPASS (1<<2) //Eavesdropping #define EAVESDROP_EXTRA_RANGE 1 //! how much past the specified message_range does the message get starred, whispering only @@ -70,6 +70,9 @@ /// How close intercoms can be for radio code use #define MODE_RANGE_INTERCOM 1 +// Is the message actually a radio message +#define MODE_RADIO_MESSAGE "actuallyradiomessage" + // A link given to ghost alice to follow bob #define FOLLOW_LINK(alice, bob) "(F)" #define TURF_LINK(alice, turfy) "(T)" @@ -86,14 +89,18 @@ #define MAX_BROADCAST_LEN 512 #define MAX_CHARTER_LEN 80 -//Sets the max string size that can be put in for circuit cloning -#define MAX_SIZE_CIRCUIT 15000 - // Is something in the IC chat filter? This is config dependent. #define CHAT_FILTER_CHECK(T) (CONFIG_GET(flag/ic_filter_enabled) && config.ic_filter_regex && findtext(T, config.ic_filter_regex)) // Is something in the OOC chat filter? #define OOC_FILTER_CHECK(T) (CONFIG_GET(flag/ooc_filter_enabled) && config.ooc_filter_regex && findtext(T, config.ooc_filter_regex)) +// Audio/Visual Flags. Used to determine what sense are required to notice a message. +#define MSG_VISUAL (1<<0) +#define MSG_AUDIBLE (1<<1) + #define INVOCATION_SHOUT "shout" #define INVOCATION_EMOTE "emote" #define INVOCATION_WHISPER "whisper" + +//Used in visible_message_flags, audible_message_flags and message_mods +#define CHATMESSAGE_EMOTE "emotemessage" diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index 0c95675746494..3514995149aca 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -1,8 +1,8 @@ //shuttle mode defines #define SHUTTLE_IDLE "idle" #define SHUTTLE_IGNITING "igniting" -#define SHUTTLE_RECALL "recall" -#define SHUTTLE_CALL "call" +#define SHUTTLE_RECALL "recalled" +#define SHUTTLE_CALL "called" #define SHUTTLE_DOCKED "docked" #define SHUTTLE_STRANDED "stranded" #define SHUTTLE_ESCAPE "escape" @@ -81,4 +81,5 @@ //Shuttle unlocks #define SHUTTLE_UNLOCK_BUBBLEGUM "bubblegum" -#define SHUTTLE_UNLOCK_ALIENTECH "abductor" \ No newline at end of file +#define SHUTTLE_UNLOCK_ALIENTECH "abductor" +#define SHUTTLE_UNLOCK_MEDISIM "holodeck" diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 7294bf499e409..c85d8c0f24248 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -7,67 +7,106 @@ #define CHANNEL_HEARTBEAT 1019 //sound channel for heartbeats #define CHANNEL_AMBIENT_EFFECTS 1018 #define CHANNEL_AMBIENT_MUSIC 1017 -#define CHANNEL_AMBIENT_BUZZ 1016 +#define CHANNEL_BUZZ 1017 + +///Default range of a sound. +#define SOUND_RANGE 17 +///default extra range for sounds considered to be quieter +#define SHORT_RANGE_SOUND_EXTRARANGE -9 +///The range deducted from sound range for things that are considered silent / sneaky +#define SILENCED_SOUND_EXTRARANGE -11 +///Percentage of sound's range where no falloff is applied +#define SOUND_DEFAULT_FALLOFF_DISTANCE 1 //For a normal sound this would be 1 tile of no falloff +///The default exponent of sound falloff +#define SOUND_FALLOFF_EXPONENT 6 //THIS SHOULD ALWAYS BE THE LOWEST ONE! //KEEP IT UPDATED #define CHANNEL_HIGHEST_AVAILABLE 1015 +#define MAX_INSTRUMENT_CHANNELS (128 * 6) #define SOUND_MINIMUM_PRESSURE 10 #define FALLOFF_SOUNDS 1 - - -//Ambience types - -#define GENERIC list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg',\ - 'sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg',\ - 'sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg',\ - 'sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg',\ - 'sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg',\ - 'sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg','sound/ambience/ambigen15.ogg') - -#define HOLY list('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg',\ - 'sound/ambience/ambicha4.ogg', 'sound/ambience/ambiholy.ogg', 'sound/ambience/ambiholy2.ogg',\ - 'sound/ambience/ambiholy3.ogg') - -#define HIGHSEC list('sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg') - -#define RUINS list('sound/ambience/ambimine.ogg', 'sound/ambience/ambicave.ogg', 'sound/ambience/ambiruin.ogg',\ - 'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\ - 'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\ - 'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambitech3.ogg',\ - 'sound/ambience/ambimystery.ogg', 'sound/ambience/ambimaint1.ogg') - -#define ENGINEERING list('sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg','sound/ambience/ambisin4.ogg',\ - 'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg', 'sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg') - -#define MINING list('sound/ambience/ambimine.ogg', 'sound/ambience/ambicave.ogg', 'sound/ambience/ambiruin.ogg',\ - 'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\ - 'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\ - 'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambimaint1.ogg', 'sound/ambience/ambilava.ogg') - -#define MEDICAL list('sound/ambience/ambinice.ogg') - -#define SPOOKY list('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg','sound/ambience/ambiruin7.ogg','sound/ambience/ambiruin6.ogg',\ - 'sound/ambience/ambiodd.ogg', 'sound/ambience/ambimystery.ogg') - -#define SPACE list('sound/ambience/ambispace.ogg', 'sound/ambience/ambispace2.ogg', 'sound/ambience/title2.ogg') - -#define MAINTENANCE list('sound/ambience/ambimaint1.ogg', 'sound/ambience/ambimaint2.ogg', 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg',\ - 'sound/ambience/ambimaint5.ogg', 'sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg', 'sound/ambience/ambitech2.ogg' ) - -#define AWAY_MISSION list('sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambiruin.ogg',\ - 'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\ - 'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\ - 'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambimaint.ogg',\ - 'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg', 'sound/ambience/ambiodd.ogg') - -#define REEBE list('sound/ambience/ambireebe1.ogg', 'sound/ambience/ambireebe2.ogg', 'sound/ambience/ambireebe3.ogg') - -#define CREEPY_SOUNDS list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\ - 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ - 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ - 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ - 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') +#define INTERACTION_SOUND_RANGE_MODIFIER -3 +#define EQUIP_SOUND_VOLUME 30 +#define PICKUP_SOUND_VOLUME 15 +#define DROP_SOUND_VOLUME 20 +#define YEET_SOUND_VOLUME 90 + +#define AMBIENCE_GENERIC "generic" +#define AMBIENCE_HOLY "holy" +#define AMBIENCE_DANGER "danger" +#define AMBIENCE_RUINS "ruins" +#define AMBIENCE_ENGI "engi" +#define AMBIENCE_MINING "mining" +#define AMBIENCE_MEDICAL "med" +#define AMBIENCE_SPOOKY "spooky" +#define AMBIENCE_SPACE "space" +#define AMBIENCE_MAINT "maint" +#define AMBIENCE_AWAY "away" +#define AMBIENCE_REEBE "reebe" +#define AMBIENCE_CREEPY "creepy" //not to be confused with spooky +#define AMBIENCE_NONE "none" + +//default byond sound environments +#define SOUND_ENVIRONMENT_NONE -1 +#define SOUND_ENVIRONMENT_GENERIC 0 +#define SOUND_ENVIRONMENT_PADDED_CELL 1 +#define SOUND_ENVIRONMENT_ROOM 2 +#define SOUND_ENVIRONMENT_BATHROOM 3 +#define SOUND_ENVIRONMENT_LIVINGROOM 4 +#define SOUND_ENVIRONMENT_STONEROOM 5 +#define SOUND_ENVIRONMENT_AUDITORIUM 6 +#define SOUND_ENVIRONMENT_CONCERT_HALL 7 +#define SOUND_ENVIRONMENT_CAVE 8 +#define SOUND_ENVIRONMENT_ARENA 9 +#define SOUND_ENVIRONMENT_HANGAR 10 +#define SOUND_ENVIRONMENT_CARPETED_HALLWAY 11 +#define SOUND_ENVIRONMENT_HALLWAY 12 +#define SOUND_ENVIRONMENT_STONE_CORRIDOR 13 +#define SOUND_ENVIRONMENT_ALLEY 14 +#define SOUND_ENVIRONMENT_FOREST 15 +#define SOUND_ENVIRONMENT_CITY 16 +#define SOUND_ENVIRONMENT_MOUNTAINS 17 +#define SOUND_ENVIRONMENT_QUARRY 18 +#define SOUND_ENVIRONMENT_PLAIN 19 +#define SOUND_ENVIRONMENT_PARKING_LOT 20 +#define SOUND_ENVIRONMENT_SEWER_PIPE 21 +#define SOUND_ENVIRONMENT_UNDERWATER 22 +#define SOUND_ENVIRONMENT_DRUGGED 23 +#define SOUND_ENVIRONMENT_DIZZY 24 +#define SOUND_ENVIRONMENT_PSYCHOTIC 25 +//If we ever make custom ones add them here + +//"sound areas": easy way of keeping different types of areas consistent. +#define SOUND_AREA_STANDARD_STATION SOUND_ENVIRONMENT_PARKING_LOT +#define SOUND_AREA_LARGE_ENCLOSED SOUND_ENVIRONMENT_QUARRY +#define SOUND_AREA_SMALL_ENCLOSED SOUND_ENVIRONMENT_BATHROOM +#define SOUND_AREA_TUNNEL_ENCLOSED SOUND_ENVIRONMENT_STONEROOM +#define SOUND_AREA_LARGE_SOFTFLOOR SOUND_ENVIRONMENT_CARPETED_HALLWAY +#define SOUND_AREA_MEDIUM_SOFTFLOOR SOUND_ENVIRONMENT_LIVINGROOM +#define SOUND_AREA_SMALL_SOFTFLOOR SOUND_ENVIRONMENT_ROOM +#define SOUND_AREA_ASTEROID SOUND_ENVIRONMENT_CAVE +#define SOUND_AREA_SPACE SOUND_ENVIRONMENT_UNDERWATER +#define SOUND_AREA_LAVALAND SOUND_ENVIRONMENT_MOUNTAINS +#define SOUND_AREA_WOODFLOOR SOUND_ENVIRONMENT_CITY + +///Announcer audio keys +#define ANNOUNCER_AIMALF "announcer_aimalf" +#define ANNOUNCER_ALIENS "announcer_aliens" +#define ANNOUNCER_ANIMES "announcer_animes" +#define ANNOUNCER_GRANOMALIES "announcer_granomalies" +#define ANNOUNCER_INTERCEPT "announcer_animes" +#define ANNOUNCER_IONSTORM "announcer_ionstorm" +#define ANNOUNCER_METEORS "announcer_meteors" +#define ANNOUNCER_OUTBREAK5 "announcer_outbreak5" +#define ANNOUNCER_OUTBREAK7 "announcer_outbreak7" +#define ANNOUNCER_POWEROFF "announcer_poweroff" +#define ANNOUNCER_POWERON "announcer_poweron" +#define ANNOUNCER_RADIATION "announcer_radiation" +#define ANNOUNCER_SHUTTLECALLED "announcer_shuttlecalled" +#define ANNOUNCER_SHUTTLEDOCK "announcer_shuttledock" +#define ANNOUNCER_SHUTTLERECALLED "announcer_shuttlerecalled" +#define ANNOUNCER_SPANOMALIES "announcer_spanomalies" diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm index e590a30ff999b..c2ecc6a5e663e 100644 --- a/code/__DEFINES/spaceman_dmm.dm +++ b/code/__DEFINES/spaceman_dmm.dm @@ -6,8 +6,45 @@ #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 + +/proc/auxtools_stack_trace(msg) + CRASH(msg) + +/proc/auxtools_expr_stub() + CRASH("auxtools not loaded") + +/proc/enable_debugging(mode, port) + CRASH("auxtools not loaded") + +/world/proc/enable_debugger() + var/dll = world.GetConfig("env", "AUXTOOLS_DEBUG_DLL") + if (dll) + call(dll, "auxtools_init")() + enable_debugging() + +/world/Del() + var/debug_server = world.GetConfig("env", "AUXTOOLS_DEBUG_DLL") + if (debug_server) + call(debug_server, "auxtools_shutdown")() + . = ..() diff --git a/code/__DEFINES/stat_panel.dm b/code/__DEFINES/stat_panel.dm new file mode 100644 index 0000000000000..1a3e98ba5cf6b --- /dev/null +++ b/code/__DEFINES/stat_panel.dm @@ -0,0 +1,11 @@ +//HEY!: This must be the same as constants.js in /tgui/packages/tgui-panel/stat + +#define STAT_TEXT 0 +#define STAT_BUTTON 1 +#define STAT_ATOM 2 +#define STAT_DIVIDER 3 +#define STAT_VERB 4 //Similar to button, but multiple on 1 line + +#define STAT_SLOW_UPDATE 4 //Once every 4 seconds +#define STAT_MEDIUM_UPDATE 2 //Once every 2 seconds +#define STAT_FAST_UPDATE 1 //Once every 1 seconds diff --git a/code/__DEFINES/station.dm b/code/__DEFINES/station.dm new file mode 100644 index 0000000000000..8feef00342d70 --- /dev/null +++ b/code/__DEFINES/station.dm @@ -0,0 +1,6 @@ +#define STATION_TRAIT_POSITIVE 1 +#define STATION_TRAIT_NEUTRAL 2 +#define STATION_TRAIT_NEGATIVE 3 + + +#define STATION_TRAIT_ABSTRACT (1<<0) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index a1cd25180f18c..0ec5f605ca730 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -97,6 +97,10 @@ #define STATUS_EFFECT_SYRINGE /datum/status_effect/syringe //used to handle being injected with a syringe +#define STATUS_EFFECT_SPANISH /datum/status_effect/spanish //Robotic Tongue EMP + +#define STATUS_EFFECT_IPC_EMP /datum/status_effect/ipc/emp //EMP'd IPC + //---------// // NEUTRAL // //---------// diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 78574f438835b..adbd54e3c4cb2 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -20,7 +20,7 @@ * * make sure you add an update to the schema_version stable in the db changelog */ -#define DB_MINOR_VERSION 7 +#define DB_MINOR_VERSION 8 //! ## Timing subsystem @@ -85,12 +85,15 @@ ///Call qdel on the atom after intialization #define INITIALIZE_HINT_QDEL 2 +///Call qdel with a force of TRUE after initialization +#define INITIALIZE_HINT_QDEL_FORCE 3 + ///type and all subtypes should always immediately call Initialize in New() #define INITIALIZE_IMMEDIATE(X) ##X/New(loc, ...){\ ..();\ if(!(flags_1 & INITIALIZED_1)) {\ args[1] = TRUE;\ - SSatoms.InitAtom(src, args);\ + SSatoms.InitAtom(src, FALSE, args);\ }\ } @@ -106,14 +109,22 @@ #define INIT_ORDER_BLACKBOX 94 #define INIT_ORDER_SERVER_MAINT 93 #define INIT_ORDER_INPUT 85 +#define INIT_ORDER_TOPIC 83 +#define INIT_ORDER_SOUNDS 82 +#define INIT_ORDER_INSTRUMENTS 81 #define INIT_ORDER_VIS 80 #define INIT_ORDER_MATERIALS 76 #define INIT_ORDER_RESEARCH 75 +#define INIT_ORDER_ORBITS 74 //Other things use the orbital map, so it needs to be made early on. +#define INIT_ORDER_STATION 73 //This is high priority because it manipulates a lot of the subsystems that will initialize after it. #define INIT_ORDER_EVENTS 70 #define INIT_ORDER_JOBS 65 #define INIT_ORDER_QUIRKS 60 +#define INIT_ORDER_AI_MOVEMENT 56 //We need the movement setup +#define INIT_ORDER_AI_CONTROLLERS 55 //So the controller can get the ref #define INIT_ORDER_TICKER 55 #define INIT_ORDER_MAPPING 50 +#define INIT_ORDER_TIMETRACK 47 #define INIT_ORDER_NETWORKS 45 #define INIT_ORDER_ECONOMY 40 #define INIT_ORDER_OUTPUTS 35 @@ -124,21 +135,24 @@ #define INIT_ORDER_TIMER 1 #define INIT_ORDER_DEFAULT 0 #define INIT_ORDER_AIR -1 +#define INIT_ORDER_PERSISTENCE -2 //before assets because some assets take data from SSPersistence #define INIT_ORDER_ASSETS -4 #define INIT_ORDER_ICON_SMOOTHING -5 #define INIT_ORDER_OVERLAY -6 +#define INIT_ORDER_STAT -7 #define INIT_ORDER_XKEYSCORE -10 #define INIT_ORDER_STICKY_BAN -10 #define INIT_ORDER_LIGHTING -20 #define INIT_ORDER_SHUTTLE -21 #define INIT_ORDER_MINOR_MAPPING -40 #define INIT_ORDER_PATH -50 -#define INIT_ORDER_PERSISTENCE -100 +#define INIT_ORDER_EXPLOSIONS -69 #define INIT_ORDER_CHAT -150 //Should be last to ensure chat remains smooth during init. // 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_STAT 10 #define FIRE_PRIORITY_AMBIENCE 10 #define FIRE_PRIORITY_IDLE_NPC 10 #define FIRE_PRIORITY_SERVER_MAINT 10 @@ -148,6 +162,8 @@ #define FIRE_PRIORITY_WET_FLOORS 20 #define FIRE_PRIORITY_AIR 20 #define FIRE_PRIORITY_NPC 20 +#define FIRE_PRIORITY_NPC_MOVEMENT 21 +#define FIRE_PRIORITY_NPC_ACTIONS 22 #define FIRE_PRIORITY_PROCESS 25 #define FIRE_PRIORITY_THROWING 25 #define FIRE_PRIORITY_SPACEDRIFT 30 @@ -155,16 +171,22 @@ #define FIRE_PRIOTITY_SMOOTHING 35 #define FIRE_PRIORITY_NETWORKS 40 #define FIRE_PRIORITY_OBJ 40 +#define FIRE_PRIORITY_ORBITS 40 #define FIRE_PRIORITY_ACID 40 #define FIRE_PRIOTITY_BURNING 40 #define FIRE_PRIORITY_DEFAULT 50 #define FIRE_PRIORITY_PARALLAX 65 +#define FIRE_PRIORITY_INSTRUMENTS 80 #define FIRE_PRIORITY_MOBS 100 #define FIRE_PRIORITY_TGUI 110 #define FIRE_PRIORITY_TICKER 200 #define FIRE_PRIORITY_ATMOS_ADJACENCY 300 #define FIRE_PRIORITY_CHAT 400 +#define FIRE_PRIORITY_RUNECHAT 410 #define FIRE_PRIORITY_OVERLAYS 500 +#define FIRE_PRIORITY_CALLBACKS 600 +#define FIRE_PRIORITY_EXPLOSIONS 666 +#define FIRE_PRIORITY_SOUND_LOOPS 800 #define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost. // SS runlevels @@ -177,13 +199,31 @@ #define RUNLEVELS_DEFAULT (RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME) +// SSair run section +#define SSAIR_PIPENETS 1 +#define SSAIR_ATMOSMACHINERY 2 +#define SSAIR_EXCITEDGROUPS 3 +#define SSAIR_HIGHPRESSURE 4 +#define SSAIR_HOTSPOTS 5 +#define SSAIR_TURF_CONDUCTION 6 +#define SSAIR_REBUILD_PIPENETS 7 +#define SSAIR_EQUALIZE 8 +#define SSAIR_ACTIVETURFS 9 +#define SSAIR_TURF_POST_PROCESS 10 +#define SSAIR_FINALIZE_TURFS 11 +#define SSAIR_ATMOSMACHINERY_AIR 12 +#define SSAIR_DEFERRED_AIRS 13 +// Explosion Subsystem subtasks +#define SSEXPLOSIONS_MOVABLES 1 +#define SSEXPLOSIONS_TURFS 2 +#define SSEXPLOSIONS_THROWS 3 //! ## Overlays subsystem /// Compile all the overlays for an atom from the cache lists #define COMPILE_OVERLAYS(A)\ - if (TRUE) {\ + if (A) {\ var/list/ad = A.add_overlays;\ var/list/rm = A.remove_overlays;\ var/list/po = A.priority_overlays;\ @@ -206,3 +246,18 @@ }\ A.flags_1 &= ~OVERLAY_QUEUED_1;\ } + +/** + Create a new timer and add it to the queue. + * Arguments: + * * callback the callback to call on timer finish + * * wait deciseconds to run the timer for + * * flags flags for this timer, see: code\__DEFINES\subsystems.dm +*/ +#define addtimer(args...) _addtimer(args, file = __FILE__, line = __LINE__) + +// Subsystem delta times or tickrates, in seconds. I.e, how many seconds in between each process() call for objects being processed by that subsystem. +// Only use these defines if you want to access some other objects processing delta_time, otherwise use the delta_time that is sent as a parameter to process() +#define SSMACHINES_DT (SSmachines.wait/10) +#define SSMOBS_DT (SSmobs.wait/10) +#define SSOBJ_DT (SSobj.wait/10) diff --git a/code/__DEFINES/text.dm b/code/__DEFINES/text.dm new file mode 100644 index 0000000000000..9c9e442c36076 --- /dev/null +++ b/code/__DEFINES/text.dm @@ -0,0 +1,7 @@ +/// Prepares a text to be used for maptext. Use this so it doesn't look hideous. +#define MAPTEXT(text) {"[##text]"} + +/// Macro from Lummox used to get height from a MeasureText proc +#define WXH_TO_HEIGHT(x) text2num(copytext(x, findtextEx(x, "x") + 1)) + +#define CENTER(text) {"
[##text]
"} diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index a0a5df429074e..af09ab67110d7 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "5.2.7" +#define TGS_DMAPI_VERSION "6.0.3" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -67,7 +67,7 @@ #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 +/// When the repository test merges. 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 @@ -95,8 +95,13 @@ #define TGS_EVENT_WATCHDOG_SHUTDOWN 15 /// Before the watchdog detaches for a TGS update/restart. No parameters. #define TGS_EVENT_WATCHDOG_DETACH 16 -// We don't actually implement this value as the DMAPI can never receive it +// We don't actually implement these 4 events as the DMAPI can never receive them. // #define TGS_EVENT_WATCHDOG_LAUNCH 17 +// #define TGS_EVENT_WATCHDOG_CRASH 18 +// #define TGS_EVENT_WORLD_END_PROCESS 19 +// #define TGS_EVENT_WORLD_REBOOT 20 +/// Watchdog event when TgsInitializationComplete() is called. No parameters. +#define TGS_EVENT_WORLD_PRIME 21 // OTHER ENUMS @@ -117,22 +122,21 @@ //REQUIRED HOOKS /** - * 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]. - */ + * 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/var/sleep_offline] to make this happen so ensure no changes are made to it while this call is running. - * Afterwards, consider explicitly setting it to what you want to avoid this BYOND bug: http://www.byond.com/forum/post/2575184 - * 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]. - */ + * 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. + * Afterwards, consider explicitly setting it to what you want to avoid this BYOND bug: http://www.byond.com/forum/post/2575184 + * This function should not be called before ..() in [/world/proc/New]. + */ /world/proc/TgsInitializationComplete() return @@ -140,8 +144,8 @@ #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/proc/Reboot]. - */ + * Call this as late as possible in [world/proc/Reboot]. + */ /world/proc/TgsReboot() return @@ -152,6 +156,8 @@ /datum/tgs_revision_information /// Full SHA of the commit. var/commit + /// ISO 8601 timestamp of when the commit was created + var/timestamp /// 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 @@ -175,36 +181,34 @@ var/deprefixed_parameter /** - * Returns [TRUE]/[FALSE] based on if the [/datum/tgs_version] contains wildcards. - */ + * Returns [TRUE]/[FALSE] based on if the [/datum/tgs_version] contains wildcards. + */ /datum/tgs_version/proc/Wildcard() return /** - * Returns [TRUE]/[FALSE] based on if the [/datum/tgs_version] equals some other version. - * - * other_version - The [/datum/tgs_version] to compare against. - */ + * 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 - /// The pull request number. + /// The test merge number. var/number - /// The pull request title when it was merged. + /// The test merge source's title when it was merged. var/title - /// The pull request body when it was merged. + /// The test merge source's body when it was merged. var/body - /// The GitHub username of the pull request's author. + /// The Username of the test merge source's author. var/author - /// An http URL to the pull request. + /// An http URL to the test merge source. 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.. + /// The SHA of the test merge when that was merged. + var/head_commit + /// Optional comment left by the TGS user who initiated the merge. var/comment /// Represents a connected chat channel. @@ -234,10 +238,10 @@ var/datum/tgs_chat_channel/channel /** - * User definable callback for handling TGS events. - * - * event_code - One of the TGS_EVENT_ defines. Extra parameters will be documented in each - */ + * 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 @@ -252,67 +256,67 @@ var/admin_only = FALSE /** - * 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]. - */ + * 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()") // API FUNCTIONS /// Returns the maximum supported [/datum/tgs_version] of the DMAPI. -/world/proc/TgsMaximumAPIVersion() +/world/proc/TgsMaximumApiVersion() return /// Returns the minimum supported [/datum/tgs_version] of the DMAPI. -/world/proc/TgsMinimumAPIVersion() +/world/proc/TgsMinimumApiVersion() return /** - * Returns [TRUE] if DreamDaemon was launched under TGS, the API matches, and was properly initialized. [FALSE] will be returned otherwise. - */ + * Returns [TRUE] if DreamDaemon was launched under TGS, the API matches, and was properly initialized. [FALSE] will be returned otherwise. + */ /world/proc/TgsAvailable() return // No function below this succeeds if it TgsAvailable() returns FALSE or if TgsNew() has yet to be called. /** - * 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 - */ + * 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 /** - * 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. - */ + * 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 /** - * Send a private message to a specific user. - * - * message - The string to send. - * user: The [/datum/tgs_chat_user] to PM. - */ + * 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. - */ + * 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 diff --git a/code/__DEFINES/tgui.dm b/code/__DEFINES/tgui.dm index f594b735b6b5f..f1b1f6e179aea 100644 --- a/code/__DEFINES/tgui.dm +++ b/code/__DEFINES/tgui.dm @@ -28,8 +28,34 @@ #define TGUI_WINDOW_INDEX(window_id) text2num(copytext(window_id, 13)) /// Creates a message packet for sending via output() +// This is {"type":type,"payload":payload}, but pre-encoded. This is much faster +// than doing it the normal way. +// To ensure this is correct, this is unit tested in tgui_create_message. #define TGUI_CREATE_MESSAGE(type, payload) ( \ - url_encode(json_encode(list( \ - "type" = type, \ - "payload" = payload, \ - )))) + "%7b%22type%22%3a%22[type]%22%2c%22payload%22%3a[url_encode(json_encode(payload))]%7d" \ +) + +/// Telemetry + +/** + * Maximum number of connection records allowed to analyze. + * Should match the value set in the browser. + */ +#define TGUI_TELEMETRY_MAX_CONNECTIONS 10 + +/** + * Maximum time allocated for sending a telemetry packet. + */ +#define TGUI_TELEMETRY_RESPONSE_WINDOW 30 SECONDS + +/// Telemetry statuses +#define TGUI_TELEMETRY_STAT_NOT_REQUESTED 0 //Not Yet Requested +#define TGUI_TELEMETRY_STAT_AWAITING 1 //Awaiting request response +#define TGUI_TELEMETRY_STAT_ANALYZED 2 //Retrieved and validated +#define TGUI_TELEMETRY_STAT_MISSING 3 //Telemetry response window miss without valid telemetry +#define TGUI_TELEMETRY_STAT_OVERSEND 4 //Telemetry was already processed but was repeated + +/// Telem Trigger Defines +#define TGUI_TELEM_CKEY_WARNING "TELEM_CKEY_TEXT" +#define TGUI_TELEM_IP_WARNING "TELEM_IP_TEXT" +#define TGUI_TELEM_CID_WARNING "TELEM_CID_TEXT" diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index 9a2993ee65b33..b0c5c70ec43cc 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -21,6 +21,7 @@ #define HALLOWEEN "Halloween" #define CHRISTMAS "Christmas" #define FESTIVE_SEASON "Festive Season" +#define GARBAGEDAY "Garbage Day" /* diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm index ac03c1fd21a52..2b4dcb393c479 100644 --- a/code/__DEFINES/tools.dm +++ b/code/__DEFINES/tools.dm @@ -18,3 +18,8 @@ // If delay between the start and the end of tool operation is less than MIN_TOOL_SOUND_DELAY, // tool sound is only played when op is started. If not, it's played twice. #define MIN_TOOL_SOUND_DELAY 20 + +/// When a tooltype_act proc is successful +#define TOOL_ACT_TOOLTYPE_SUCCESS (1<<0) +/// When [COMSIG_ATOM_TOOL_ACT] blocks the act +#define TOOL_ACT_SIGNAL_BLOCKING (1<<1) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 80c260b5a7980..0f7d205b5f550 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -1,3 +1,6 @@ +#define SIGNAL_ADDTRAIT(trait_ref) "addtrait [trait_ref]" +#define SIGNAL_REMOVETRAIT(trait_ref) "removetrait [trait_ref]" + // trait accessor defines #define ADD_TRAIT(target, trait, source) \ do { \ @@ -6,12 +9,14 @@ target.status_traits = list(); \ _L = target.status_traits; \ _L[trait] = list(source); \ + SEND_SIGNAL(target, SIGNAL_ADDTRAIT(trait), trait); \ } else { \ _L = target.status_traits; \ if (_L[trait]) { \ _L[trait] |= list(source); \ } else { \ _L[trait] = list(source); \ + SEND_SIGNAL(target, SIGNAL_ADDTRAIT(trait), trait); \ } \ } \ } while (0) @@ -31,13 +36,38 @@ } \ };\ if (!length(_L[trait])) { \ - _L -= trait \ + _L -= trait; \ + SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(trait), trait); \ }; \ if (!length(_L)) { \ target.status_traits = null \ }; \ } \ } while (0) +#define REMOVE_TRAIT_NOT_FROM(target, trait, sources) \ + do { \ + var/list/_traits_list = target.status_traits; \ + var/list/_sources_list; \ + if (sources && !islist(sources)) { \ + _sources_list = list(sources); \ + } else { \ + _sources_list = sources\ + }; \ + if (_traits_list && _traits_list[trait]) { \ + for (var/_trait_source in _traits_list[trait]) { \ + if (!(_trait_source in _sources_list)) { \ + _traits_list[trait] -= _trait_source \ + } \ + };\ + if (!length(_traits_list[trait])) { \ + _traits_list -= trait; \ + SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(trait), trait); \ + }; \ + if (!length(_traits_list)) { \ + target.status_traits = null \ + }; \ + } \ + } while (0) #define REMOVE_TRAITS_NOT_IN(target, sources) \ do { \ var/list/_L = target.status_traits; \ @@ -46,13 +76,38 @@ for (var/_T in _L) { \ _L[_T] &= _S;\ if (!length(_L[_T])) { \ - _L -= _T } \ + _L -= _T; \ + SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(_T), _T); \ + }; \ };\ - if (!length(_L)) { \ - target.status_traits = null\ + if (!length(_L)) { \ + target.status_traits = null\ + };\ + }\ + } while (0) +#define REMOVE_TRAITS_IN(target, sources) \ + do { \ + var/list/_L = target.status_traits; \ + var/list/_S = sources; \ + if (sources && !islist(sources)) { \ + _S = list(sources); \ + } else { \ + _S = sources\ + }; \ + if (_L) { \ + for (var/_T in _L) { \ + _L[_T] -= _S;\ + if (!length(_L[_T])) { \ + _L -= _T; \ + SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(_T)); \ + }; \ };\ + if (!length(_L)) { \ + target.status_traits = null\ + };\ }\ } while (0) + #define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE) #define HAS_TRAIT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (source in target.status_traits[trait]) : FALSE) : FALSE) #define HAS_TRAIT_FROM_ONLY(target, trait, source) (\ @@ -67,6 +122,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits. */ +/* +Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits. +*/ + //mob traits #define TRAIT_BLIND "blind" #define TRAIT_MUTE "mute" @@ -83,6 +142,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_IGNORESLOWDOWN "ignoreslow" #define TRAIT_IGNOREDAMAGESLOWDOWN "ignoredamageslowdown" #define TRAIT_DEATHCOMA "deathcoma" //Causes death-like unconsciousness +#define TRAIT_REGEN_COMA "regencoma" #define TRAIT_FAKEDEATH "fakedeath" //Makes the owner appear as dead to most forms of medical examination #define TRAIT_DISFIGURED "disfigured" #define TRAIT_XENO_HOST "xeno_host" //Tracks whether we're gonna be a baby alien's mummy. @@ -107,6 +167,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NOGUNS "no_guns" #define TRAIT_NOHUNGER "no_hunger" #define TRAIT_NOMETABOLISM "no_metabolism" +#define TRAIT_POWERHUNGRY "power_hungry" //uses electricity instead of food +#define TRAIT_NOCLONELOSS "no_cloneloss" #define TRAIT_TOXIMMUNE "toxin_immune" #define TRAIT_EASYDISMEMBER "easy_dismember" #define TRAIT_LIMBATTACHMENT "limb_attach" @@ -150,6 +212,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism" #define TRAIT_ALWAYS_CLEAN "always-clean" #define TRAIT_BOOZE_SLIDER "booze-slider" +#define TRAIT_QUICK_CARRY "quick-carry" +#define TRAIT_QUICKER_CARRY "quicker-carry" #define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech" #define TRAIT_UNSTABLE "unstable" #define TRAIT_XENO_IMMUNE "xeno_immune" //prevents facehuggers implanting races that wouldn't be able to host an egg @@ -163,16 +227,31 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_APPRAISAL "appraisal" #define TRAIT_NOBLOCK "noblock" #define TRAIT_NANITECOMPATIBLE "nanitecompatible" +#define TRAIT_WARDED "curse_immune" +#define TRAIT_NONECRODISEASE "nonecrodisease" +#define TRAIT_DIGICAMO "digital_camo" +#define TRAIT_DIGINVIS "digital_invis" //note: diginvis grants digitalcamo, but carbons can tell if you have the digicamo trait on examine +#define TRAIT_NICE_SHOT "nice_shot" //hnnnnnnnggggg..... you're pretty good.... +#define TRAIT_ALWAYS_STUBS "always_stubs_toe" //you will always stub your toe on tables, even if you're wearing shoes //non-mob traits #define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it +#define TRAIT_HEARING_SENSITIVE "hearing_sensitive" + // item traits #define TRAIT_NODROP "nodrop" +#define TRAIT_NO_STORAGE_INSERT "no_storage_insert" //cannot be inserted in a storage. #define TRAIT_SPRAYPAINTED "spraypainted" #define TRAIT_T_RAY_VISIBLE "t-ray-visible" // Visible on t-ray scanners if the atom/var/level == 1 #define TRAIT_NO_TELEPORT "no-teleport" //you just can't #define TRAIT_STARGAZED "stargazed" //Affected by a stargazer +#define TRAIT_DOOR_PRYER "door-pryer" //Item can be used on airlocks to pry them open (even when powered) +#define TRAIT_FISH_SAFE_STORAGE "fish_case" //Fish in this won't die +#define TRAIT_FISH_CASE_COMPATIBILE "fish_case_compatibile" //Stuff that can go inside fish cases +#define TRAIT_NEEDS_TWO_HANDS "needstwohands" // The items needs two hands to be carried + +#define TRAIT_AI_BAGATTACK "bagattack" // This atom can ignore the "is on a turf" check for simple AI datum attacks, allowing them to attack from bags or lockers as long as any other conditions are met //quirk traits #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" @@ -198,8 +277,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_FRIENDLY "friendly" #define TRAIT_GRABWEAKNESS "grab_weakness" +///Trait applied to turfs when an atmos holosign is placed on them. It will stop firedoors from closing. +#define TRAIT_FIREDOOR_STOP "firedoor_stop" + // common trait sources #define TRAIT_GENERIC "generic" +#define GENERIC_ITEM_TRAIT "generic_item" #define EYE_DAMAGE "eye_damage" #define GENETIC_MUTATION "genetic" #define OBESITY "obesity" @@ -220,13 +303,16 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define CLOTHING_TRAIT "clothing" #define VEHICLE_TRAIT "vehicle" // inherited from riding vehicles #define INNATE_TRAIT "innate" +#define GLASSES_TRAIT "glasses" +#define CURSE_TRAIT "eldritch" +#define STATION_TRAIT "station-trait" // unique trait sources, still defines #define CLONING_POD_TRAIT "cloning-pod" #define STATUE_MUTE "statue" #define CHANGELING_DRAIN "drain" #define CHANGELING_HIVEMIND_MUTE "ling_mute" -#define ABYSSAL_GAZE_BLIND "abyssal_gaze" +#define MAGIC_BLIND "magic_blind" #define HIGHLANDER "highlander" #define TRAIT_HULK "hulk" #define STASIS_MUTE "stasis" @@ -249,10 +335,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define HAND_REPLACEMENT_TRAIT "magic-hand" #define HOT_POTATO_TRAIT "hot-potato" #define SABRE_SUICIDE_TRAIT "sabre-suicide" +#define CORGIUM_TRAIT "corgium" #define ABDUCTOR_VEST_TRAIT "abductor-vest" #define CAPTURE_THE_FLAG_TRAIT "capture-the-flag" #define EYE_OF_GOD_TRAIT "eye-of-god" #define SHAMEBRERO_TRAIT "shamebrero" +#define JAUNT_TRAIT "jaunt" #define CHRONOSUIT_TRAIT "chronosuit" #define LOCKED_HELMET_TRAIT "locked-helmet" #define NINJA_SUIT_TRAIT "ninja-suit" @@ -268,3 +356,24 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define STARGAZER_TRAIT "stargazer" #define GUARDIAN_TRAIT "guardian_trait" #define PARRY_TRAIT "parry_trait" +#define LIGHTPINK_TRAIT "lightpinktrait" +#define BATTLE_ROYALE_TRAIT "battleroyale_trait" +#define MADE_UNCLONEABLE "made-uncloneable" +#define TRAIT_JAWS_OF_LIFE "jaws-of-life" +#define STICKY_NODROP "sticky-nodrop" //sticky nodrop sounds like a bad soundcloud rapper's name + +///Traits given by station traits +#define STATION_TRAIT_BANANIUM_SHIPMENTS "station_trait_bananium_shipments" +#define STATION_TRAIT_CARP_INFESTATION "station_trait_carp_infestation" +#define STATION_TRAIT_PREMIUM_INTERNALS "station_trait_premium_internals" +#define STATION_TRAIT_LATE_ARRIVALS "station_trait_late_arrivals" +#define STATION_TRAIT_RANDOM_ARRIVALS "station_trait_random_arrivals" +#define STATION_TRAIT_HANGOVER "station_trait_hangover" +#define STATION_TRAIT_FILLED_MAINT "station_trait_filled_maint" +#define STATION_TRAIT_EMPTY_MAINT "station_trait_empty_maint" +#define STATION_TRAIT_PDA_GLITCHED "station_trait_pda_glitched" +#define STATION_TRAIT_DISTANT_SUPPLY_LINES "distant_supply_lines" +#define STATION_TRAIT_STRONG_SUPPLY_LINES "strong_supply_lines" + +/// Trait applied when the MMI component is added to an [/obj/item/integrated_circuit] +#define TRAIT_COMPONENT_MMI "component_mmi" diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index e4240779f7e6e..561f78c3a76b1 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -73,7 +73,11 @@ #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" +#ifdef REFERENCE_TRACKING +#define VV_HK_VIEW_REFERENCES "viewreferences" +#endif // /atom #define VV_HK_MODIFY_TRANSFORM "atom_transform" @@ -81,6 +85,15 @@ #define VV_HK_TRIGGER_EMP "empulse" #define VV_HK_TRIGGER_EXPLOSION "explode" #define VV_HK_AUTO_RENAME "auto_rename" +#define VV_HK_EDIT_FILTERS "edit_filters" +#define VV_HK_ADD_AI "add_ai" + +// /datum/gas_mixture +#define VV_HK_SET_MOLES "set_moles" +#define VV_HK_EMPTY "empty" +#define VV_HK_SET_TEMPERATURE "set_temp" +#define VV_HK_PARSE_GASSTRING "parse_gasstring" +#define VV_HK_SET_VOLUME "set_volume" // /obj #define VV_HK_OSAY "osay" @@ -124,5 +137,5 @@ #define VV_HK_SPACEVINE_PURGE "spacevine_purge" #define VV_HK_MODIFY_CANISTER_GAS "modify_canister_gas" - - +// paintings +#define VV_HK_REMOVE_PAINTING "remove_painting" diff --git a/code/__DEFINES/wiremod.dm b/code/__DEFINES/wiremod.dm new file mode 100644 index 0000000000000..f158272f4baa7 --- /dev/null +++ b/code/__DEFINES/wiremod.dm @@ -0,0 +1,211 @@ +/// Helper define that can only be used in /obj/item/circuit_component/input_received() +#define COMPONENT_TRIGGERED_BY(trigger, port) (trigger.input_value && trigger == port) + +/// Define to automatically handle calling the output port. Will not call the output port if the input_received proc returns TRUE. +#define TRIGGER_CIRCUIT_COMPONENT(component, port) if(!component.input_received(port) && (component.circuit_flags & CIRCUIT_FLAG_OUTPUT_SIGNAL)) component.trigger_output.set_output(COMPONENT_SIGNAL) + +// Port types. Determines what the port can connect to + +/// Can accept any datatype. Only works for inputs, output types will runtime. +#define PORT_TYPE_ANY null + +// Fundamental datatypes +/// String datatype +#define PORT_TYPE_STRING "string" +#define PORT_MAX_STRING_LENGTH 500 +/// Number datatype +#define PORT_TYPE_NUMBER "number" +/// Signal datatype +#define PORT_TYPE_SIGNAL "signal" +/// List datatype +#define PORT_TYPE_LIST "list" +/// Table datatype. Derivative of list, contains other lists with matching columns. +#define PORT_TYPE_TABLE "table" + +// Other datatypes +/// Atom datatype +#define PORT_TYPE_ATOM "entity" +/// Any datatype (USED ONLY FOR DISPLAY, DO NOT USE) +#define COMP_TYPE_ANY "any" + + +/// The maximum range between a port and an atom +#define PORT_ATOM_MAX_RANGE 7 + +#define COMPONENT_DEFAULT_NAME "component" + +/// The minimum position of the x and y co-ordinates of the component in the UI +#define COMPONENT_MIN_RANDOM_POS 200 +/// The maximum position of the x and y co-ordinates of the component in the UI +#define COMPONENT_MAX_RANDOM_POS 400 + +/// The maximum position in both directions that a component can be in. +/// Prevents someone from positioning a component at an absurdly high value. +#define COMPONENT_MAX_POS 10000 + +// Components + +/// The value that is sent whenever a component is simply sending a signal. This can be anything. +#define COMPONENT_SIGNAL 1 + +/// The largest sized list a component can make +#define COMPONENT_MAXIMUM_LIST_SIZE 256 + +// Comparison defines +#define COMP_COMPARISON_EQUAL "=" +#define COMP_COMPARISON_NOT_EQUAL "!=" +#define COMP_COMPARISON_GREATER_THAN ">" +#define COMP_COMPARISON_LESS_THAN "<" +#define COMP_COMPARISON_GREATER_THAN_OR_EQUAL ">=" +#define COMP_COMPARISON_LESS_THAN_OR_EQUAL "<=" + +// Delay defines +/// The minimum delay value that the delay component can have. +#define COMP_DELAY_MIN_VALUE 0.1 + +// Logic defines +#define COMP_LOGIC_AND "AND" +#define COMP_LOGIC_OR "OR" +#define COMP_LOGIC_XOR "XOR" + +// Arithmetic defines +#define COMP_ARITHMETIC_ADD "Add" +#define COMP_ARITHMETIC_SUBTRACT "Subtract" +#define COMP_ARITHMETIC_MULTIPLY "Multiply" +#define COMP_ARITHMETIC_DIVIDE "Divide" +#define COMP_ARITHMETIC_MODULO "Modulus" +#define COMP_ARITHMETIC_MIN "Minimum" +#define COMP_ARITHMETIC_MAX "Maximum" + +//Bitwise defines +#define COMP_BITWISE_AND "And" +#define COMP_BITWISE_OR "Or" +#define COMP_BITWISE_XOR "Xor" +#define COMP_BITWISE_LEFTSHIFT "Left Shift" +#define COMP_BITWISE_RIGHTSHIFT "Right Shift" + +//Round defines +#define COMP_ROUND_ROUND "Round" +#define COMP_ROUND_FLOOR "Floor" +#define COMP_ROUND_CEIL "Ceil" + +//Trig defines +#define COMP_TRIG_COSINE "COS" +#define COMP_TRIG_SINE "SIN" +#define COMP_TRIG_TANGENT "TAN" +#define COMP_TRIG_ASINE "ASIN" +#define COMP_TRIG_ACOSINE "ACOS" +#define COMP_TRIG_ATANGENT "ATAN" + +//Advanced Trig defines +#define COMP_TRIG_SECANT "SEC" +#define COMP_TRIG_COSECANT "CSC" +#define COMP_TRIG_COTANGENT "COT" + +//Hyperbolic Trig Defines +#define COMP_TRIG_HYPERBOLIC_COSINE "COSH" +#define COMP_TRIG_HYPERBOLIC_SINE "SINH" +#define COMP_TRIG_AHYPERBOLIC_COSINE "ACOSH" +#define COMP_TRIG_AHYPERBOLIC_SINE "ASING" + +//Indexer defines +#define COMP_INDEXER_NONE "None" +#define COMP_INDEXER_INCREMENT "Increment" +#define COMP_INDEXER_LOOP "Loop" +#define COMP_INDEXER_BOTH "Both" + +#define COMP_INDEXER_FLAG_INCREMENT (1<<0) +#define COMP_INDEXER_FLAG_LOOP (1<<1) + +//Pop defines +#define COMP_POP_POP "Pop" +#define COMP_POP_DEQUEUE "Dequeue" + +// Text defines +#define COMP_TEXT_LOWER "To Lower" +#define COMP_TEXT_UPPER "To Upper" + +// Typecheck component +#define COMP_TYPECHECK_MOB "organism" +#define COMP_TYPECHECK_HUMAN "humanoid" + +// Clock component +#define COMP_CLOCK_DELAY 0.9 SECONDS + +// Radio component +#define COMP_RADIO_PUBLIC "public" +#define COMP_RADIO_PRIVATE "private" + +// Sound component +#define COMP_SOUND_BUZZ "Buzz" +#define COMP_SOUND_BUZZ_TWO "Buzz Twice" +#define COMP_SOUND_CHIME "Chime" +#define COMP_SOUND_HONK "Honk" +#define COMP_SOUND_PING "Ping" +#define COMP_SOUND_SAD "Sad Trombone" +#define COMP_SOUND_WARN "Warn" +#define COMP_SOUND_SLOWCLAP "Slow Clap" + +// Security Arrest Console +#define COMP_STATE_ARREST "*Arrest*" +#define COMP_STATE_PRISONER "Incarcerated" +#define COMP_STATE_PAROL "Paroled" +#define COMP_STATE_DISCHARGED "Discharged" +#define COMP_STATE_NONE "None" + +#define COMP_SECURITY_ARREST_AMOUNT_TO_FLAG 10 + +// Shells + +/// Whether a circuit is stuck on a shell and cannot be removed (by a user) +#define SHELL_FLAG_CIRCUIT_FIXED (1<<0) + +/// Whether the shell needs to be anchored for the circuit to be on. +#define SHELL_FLAG_REQUIRE_ANCHOR (1<<1) + +/// Whether or not the shell has a USB port. +#define SHELL_FLAG_USB_PORT (1<<2) + +/// Whether the shell allows actions to be peformed on a shell if the action fails. This will additionally block the messages from being displayed. +#define SHELL_FLAG_ALLOW_FAILURE_ACTION (1<<3) + +// Shell capacities. These can be converted to configs very easily later +#define SHELL_CAPACITY_SMALL 10 +#define SHELL_CAPACITY_MEDIUM 25 +#define SHELL_CAPACITY_LARGE 50 +#define SHELL_CAPACITY_VERY_LARGE 500 + +/// The maximum range a USB cable can be apart from a source +#define USB_CABLE_MAX_RANGE 2 + +// Circuit flags +/// Creates an input trigger that means the component won't be triggered unless the trigger is pulsed. +#define CIRCUIT_FLAG_INPUT_SIGNAL (1<<0) +/// Creates an output trigger that sends a pulse whenever the component is successfully triggered +#define CIRCUIT_FLAG_OUTPUT_SIGNAL (1<<1) + +#define WIREMOD_CIRCUITRY "Circuitry" +#define WIREMOD_CORE "Core" +#define WIREMOD_SHELLS "Shells" +#define WIREMOD_INPUT_COMPONENTS "Input Components" +#define WIREMOD_OUTPUT_COMPONENTS "Output Components" +#define WIREMOD_MATH_COMPONENTS "Math Components" +#define WIREMOD_TIME_COMPONENTS "Time Components" +#define WIREMOD_LOGIC_COMPONENTS "Logic Components" +#define WIREMOD_LIST_COMPONENTS "List Components" +#define WIREMOD_MEMORY_COMPONENTS "Memory Components" +#define WIREMOD_CONVERSION_COMPONENTS "Conversion Components" +#define WIREMOD_STRING_COMPONENTS "String Components" +#define WIREMOD_REFERENCE_COMPONENTS "Reference Components" + +#define WIREMODE_CATEGORIES list(\ + WIREMOD_CIRCUITRY,\ + WIREMOD_CORE,\ + WIREMOD_SHELLS,\ + WIREMOD_INPUT_COMPONENTS,\ + WIREMOD_OUTPUT_COMPONENTS,\ + WIREMOD_MATH_COMPONENTS,\ + WIREMOD_TIME_COMPONENTS,\ + WIREMOD_LOGIC_COMPONENTS,\ + WIREMOD_LIST_COMPONENTS\ + ) diff --git a/code/__HELPERS/AStar.dm b/code/__HELPERS/AStar.dm deleted file mode 100644 index f762f40df97c2..0000000000000 --- a/code/__HELPERS/AStar.dm +++ /dev/null @@ -1,221 +0,0 @@ -/*! -### A Star pathfinding algorithm - -Returns a list of tiles forming a path from A to B, taking dense objects as well as walls, and the orientation of windows along the route into account. - -**Use:** - -``` -your_list = AStar(start location, end location, moving atom, distance proc, max nodes, maximum node depth, minimum distance to target, adjacent proc, atom id, turfs to exclude, check only simulated) -``` - -Optional extras to add on (in order): -- Distance proc: the distance used in every A* calculation (length of path and heuristic) -- MaxNodes: The maximum number of nodes the returned path can be (0 = infinite) -- Maxnodedepth: The maximum number of nodes to search (default: 30, 0 = infinite) -- Mintargetdist: Minimum distance to the target before path returns, could be used to get near a target, but not right to it - for an AI mob with a gun, for example. -- Adjacent proc: returns the turfs to consider around the actually processed node -- Simulated only: whether to consider unsimulated turfs or not (used by some Adjacent proc) - -Also added 'exclude' turf to avoid travelling over; defaults to null - -Actual Adjacent procs : - -- `/turf/proc/reachableAdjacentTurfs`: returns reachable turfs in cardinal directions (uses simulated_only) - -- `/turf/proc/reachableAdjacentAtmosTurfs`: returns turfs in cardinal directions reachable via atmos - -*/ - -/// Tiebreker weight.To help to choose between equal paths -#define PF_TIEBREAKER 0.005 - -#define MASK_ODD 85 -#define MASK_EVEN 170 - - -//! ### A* nodes variables -/datum/PathNode - /// turf associated with the PathNode - var/turf/source - /// link to the parent PathNode - var/datum/PathNode/prevNode - /// A* Node weight `(f = g + h)` - var/f - /// A* movement cost variable - var/g - /// A* heuristic variable - var/h - /// count the number of Nodes traversed - var/nt - /// bitflag for dir to expand.Some sufficiently advanced motherfuckery - var/bf - -/datum/PathNode/New(s,p,pg,ph,pnt,_bf) - source = s - prevNode = p - g = pg - h = ph - f = g + h*(1+ PF_TIEBREAKER) - nt = pnt - bf = _bf - -/datum/PathNode/proc/setp(p,pg,ph,pnt) - prevNode = p - g = pg - h = ph - f = g + h*(1+ PF_TIEBREAKER) - nt = pnt - -/datum/PathNode/proc/calc_f() - f = g + h - -////////////////////// -//A* procs -////////////////////// - -/// the weighting function, used in the A* algorithm -/proc/PathWeightCompare(datum/PathNode/a, datum/PathNode/b) - return a.f - b.f - -//reversed so that the Heap is a MinHeap rather than a MaxHeap -/proc/HeapPathWeightCompare(datum/PathNode/a, datum/PathNode/b) - return b.f - a.f - -//wrapper that returns an empty list if A* failed to find a path -/proc/get_path_to(caller, end, dist, maxnodes, maxnodedepth = 30, mintargetdist, adjacent = /turf/proc/reachableTurftest, id=null, turf/exclude=null, simulated_only = TRUE) - var/l = SSpathfinder.mobs.getfree(caller) - while(!l) - stoplag(3) - l = SSpathfinder.mobs.getfree(caller) - var/list/path = AStar(caller, end, dist, maxnodes, maxnodedepth, mintargetdist, adjacent,id, exclude, simulated_only) - - SSpathfinder.mobs.found(l) - if(!path) - path = list() - return path - -/proc/cir_get_path_to(caller, end, dist, maxnodes, maxnodedepth = 30, mintargetdist, adjacent = /turf/proc/reachableTurftest, id=null, turf/exclude=null, simulated_only = TRUE) - var/l = SSpathfinder.circuits.getfree(caller) - while(!l) - stoplag(3) - l = SSpathfinder.circuits.getfree(caller) - var/list/path = AStar(caller, end, dist, maxnodes, maxnodedepth, mintargetdist, adjacent,id, exclude, simulated_only) - SSpathfinder.circuits.found(l) - if(!path) - path = list() - return path - -/proc/AStar(caller, _end, dist, maxnodes, maxnodedepth = 30, mintargetdist, adjacent = /turf/proc/reachableTurftest, id=null, turf/exclude=null, simulated_only = TRUE) - //sanitation - var/turf/end = get_turf(_end) - var/turf/start = get_turf(caller) - if(!start || !end) - stack_trace("Invalid A* start or destination") - return FALSE - if( start.z != end.z || start == end ) //no pathfinding between z levels - return FALSE - if(maxnodes) - //if start turf is farther than maxnodes from end turf, no need to do anything - if(call(start, dist)(end) > maxnodes) - return FALSE - maxnodedepth = maxnodes //no need to consider path longer than maxnodes - var/datum/Heap/open = new /datum/Heap(/proc/HeapPathWeightCompare) //the open list - var/list/openc = new() //open list for node check - var/list/path = null //the returned path, if any - //initialization - var/datum/PathNode/cur = new /datum/PathNode(start,null,0,call(start,dist)(end),0,15,1)//current processed turf - open.Insert(cur) - openc[start] = cur - //then run the main loop - while(!open.IsEmpty() && !path) - cur = open.Pop() //get the lower f turf in the open list - //get the lower f node on the open list - //if we only want to get near the target, check if we're close enough - var/closeenough - if(mintargetdist) - closeenough = call(cur.source,dist)(end) <= mintargetdist - - - //found the target turf (or close enough), let's create the path to it - if(cur.source == end || closeenough) - path = new() - path.Add(cur.source) - while(cur.prevNode) - cur = cur.prevNode - path.Add(cur.source) - break - //get adjacents turfs using the adjacent proc, checking for access with id - if((!maxnodedepth)||(cur.nt <= maxnodedepth))//if too many steps, don't process that path - for(var/i = 0 to 3) - var/f= 1<>1) //getting reverse direction throught swapping even and odd bits.((f & 01010101)<<1)|((f & 10101010)>>1) - var/newg = cur.g + call(cur.source,dist)(T) - if(CN) - //is already in open list, check if it's a better way from the current turf - CN.bf &= 15^r //we have no closed, so just cut off exceed dir.00001111 ^ reverse_dir.We don't need to expand to checked turf. - if((newg < CN.g) ) - if(call(cur.source,adjacent)(caller, T, id, simulated_only)) - CN.setp(cur,newg,CN.h,cur.nt+1) - open.ReSort(CN)//reorder the changed element in the list - else - //is not already in open list, so add it - if(call(cur.source,adjacent)(caller, T, id, simulated_only)) - CN = new(T,cur,newg,call(T,dist)(end),cur.nt+1,15^r) - open.Insert(CN) - openc[T] = CN - cur.bf = 0 - CHECK_TICK - //reverse the path to get it from start to finish - if(path) - for(var/i = 1 to round(0.5*path.len)) - path.Swap(i,path.len-i+1) - openc = null - //cleaning after us - return path - -//Returns adjacent turfs in cardinal directions that are reachable -//simulated_only controls whether only simulated turfs are considered or not - -/turf/proc/reachableAdjacentTurfs(caller, ID, simulated_only) - var/list/L = new() - var/turf/T - var/static/space_type_cache = typecacheof(/turf/open/space) - - for(var/k in 1 to GLOB.cardinals.len) - T = get_step(src,GLOB.cardinals[k]) - if(!T || (simulated_only && space_type_cache[T.type])) - continue - if(!T.density && !LinkBlockedWithAccess(T,caller, ID)) - L.Add(T) - return L - -/turf/proc/reachableTurftest(caller, var/turf/T, ID, simulated_only) - if(T && !T.density && !(simulated_only && SSpathfinder.space_type_cache[T.type]) && !LinkBlockedWithAccess(T,caller, ID)) - return TRUE - -//Returns adjacent turfs in cardinal directions that are reachable via atmos -/turf/proc/reachableAdjacentAtmosTurfs() - return atmos_adjacent_turfs - -/turf/proc/LinkBlockedWithAccess(turf/T, caller, ID) - var/adir = get_dir(src, T) - var/rdir = ((adir & MASK_ODD)<<1)|((adir & MASK_EVEN)>>1) - for(var/obj/structure/window/W in src) - if(!W.CanAStarPass(ID, adir)) - return TRUE - for(var/obj/machinery/door/window/W in src) - if(!W.CanAStarPass(ID, adir)) - return TRUE - for(var/obj/O in T) - if(!O.CanAStarPass(ID, rdir, caller)) - return TRUE - for(var/obj/machinery/door/firedoor/border_only/W in src) - if(!W.CanAStarPass(ID, adir, caller)) - return TRUE - - return FALSE diff --git a/code/__HELPERS/_extools_api.dm b/code/__HELPERS/_extools_api.dm new file mode 100644 index 0000000000000..d1961907e1e86 --- /dev/null +++ b/code/__HELPERS/_extools_api.dm @@ -0,0 +1,23 @@ +//#define EXTOOLS_LOGGING // rust_g is used as a fallback if this is undefined + +/proc/extools_log_write() + +/proc/extools_finalize_logging() + +GLOBAL_LIST_EMPTY(auxtools_initialized) + +#define AUXTOOLS_CHECK(LIB)\ + if (!GLOB.auxtools_initialized[LIB] && fexists(LIB)) {\ + var/string = call(LIB,"auxtools_init")();\ + if(findtext(string, "SUCCESS")) {\ + GLOB.auxtools_initialized[LIB] = TRUE;\ + } else {\ + CRASH(string);\ + }\ + }\ + +#define AUXTOOLS_SHUTDOWN(LIB)\ + if (GLOB.auxtools_initialized[LIB] && fexists(LIB)){\ + call(LIB,"auxtools_shutdown")();\ + GLOB.auxtools_initialized[LIB] = FALSE;\ + }\ diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 7a4641d53987d..9cfddb7f04ac1 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -11,23 +11,76 @@ #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; #define LAZYFIND(L, V) L ? L.Find(V) : 0 #define LAZYACCESS(L, I) (L ? (isnum_safe(I) ? (I > 0 && I <= length(L) ? L[I] : null) : L[I]) : null) #define LAZYSET(L, K, V) if(!L) { L = list(); } L[K] = V; -#define LAZYLEN(L) length(L) +#define LAZYLEN(L) length(L) // should only be used for lazy lists. Using this with non-lazy lists is bad #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] += V; +///This is used to add onto lazy assoc list when the value you're adding is a /list/. This one has extra safety over lazyaddassoc because the value could be null (and thus cant be used to += objects) +#define LAZYADDASSOCLIST(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; } +#define LAZYACCESSASSOC(L, I, K) L ? L[I] ? L[I][K] ? L[I][K] : null : null : null +#define QDEL_LAZYLIST(L) for(var/I in L) qdel(I); L = null; + +/// Performs an insertion on the given lazy list with the given key and value. If the value already exists, a new one will not be made. +#define LAZYORASSOCLIST(lazy_list, key, value) \ + LAZYINITLIST(lazy_list); \ + LAZYINITLIST(lazy_list[key]); \ + lazy_list[key] |= value; + + +/// 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 should the values be compared? Either COMPARE_KEY or COMPARE_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_ITEM = COMPTYPE;\ + __BIN_MID = __BIN_ITEM.##COMPARISON > COMPARE.##COMPARISON ? __BIN_MID : __BIN_MID + 1;\ + __BIN_LIST.Insert(__BIN_MID, INPUT);\ + };\ + } while(FALSE) -// binary search sorted insert +// binary search sorted insert (COMPARE = TEXT) // 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) \ +// COMPARE: The variable on the objects to compare (Must be a string) +#define BINARY_INSERT_TEXT(IN, LIST, TYPECONT, COMPARE) \ var/__BIN_CTTL = length(LIST);\ if(!__BIN_CTTL) {\ LIST += IN;\ @@ -38,7 +91,7 @@ var/##TYPECONT/__BIN_ITEM;\ while(__BIN_LEFT < __BIN_RIGHT) {\ __BIN_ITEM = LIST[__BIN_MID];\ - if(__BIN_ITEM.##COMPARE <= IN.##COMPARE) {\ + if(sorttext(__BIN_ITEM.##COMPARE, IN.##COMPARE) > 0) {\ __BIN_LEFT = __BIN_MID + 1;\ } else {\ __BIN_RIGHT = __BIN_MID;\ @@ -46,7 +99,7 @@ __BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\ };\ __BIN_ITEM = LIST[__BIN_MID];\ - __BIN_MID = __BIN_ITEM.##COMPARE > IN.##COMPARE ? __BIN_MID : __BIN_MID + 1;\ + __BIN_MID = sorttext(__BIN_ITEM.##COMPARE, IN.##COMPARE) < 0 ? __BIN_MID : __BIN_MID + 1;\ LIST.Insert(__BIN_MID, IN);\ } @@ -72,27 +125,11 @@ return "[output][and_text][input[index]]" -/// Returns list element or null. Should prevent "index out of bounds" error. -/proc/listgetindex(list/L, index) - if(LAZYLEN(L)) - if(isnum_safe(index) && ISINTEGER(index)) - if(ISINRANGE(index,1,L.len)) - return L[index] - else if(index in L) - return L[index] - return - /// Return either pick(list) or null if list is not of type /list or is empty /proc/safepick(list/L) if(LAZYLEN(L)) return pick(L) -/// Checks if the list is empty -/proc/isemptylist(list/L) - if(!L.len) - return TRUE - return FALSE - /// Checks for specific types in a list /proc/is_type_in_list(atom/A, list/L) if(!LAZYLEN(L) || !A) @@ -105,30 +142,11 @@ /// Checks for specific types in specifically structured (Assoc "type" = TRUE) lists ('typecaches') #define is_type_in_typecache(A, L) (A && length(L) && L[(ispath(A) ? A : A:type)]) -/// Checks for a string in a list -/proc/is_string_in_list(string, list/L) - if(!LAZYLEN(L) || !string) - return - for(var/V in L) - if(string == V) - return TRUE - return - -/// Removes a string from a list -/proc/remove_strings_from_list(string, list/L) - if(!LAZYLEN(L) || !string) - return - for(var/V in L) - if(V == string) - L -= V //No return here so that it removes all strings of that type - return - /// returns a new list with only atoms that are in typecache L /proc/typecache_filter_list(list/atoms, list/typecache) RETURN_TYPE(/list) . = list() - for(var/thing in atoms) - var/atom/A = thing + for(var/atom/A as() in atoms) if (typecache[A.type]) . += A @@ -136,16 +154,14 @@ /proc/typecache_filter_list_reverse(list/atoms, list/typecache) RETURN_TYPE(/list) . = list() - for(var/thing in atoms) - var/atom/A = thing + for(var/atom/A as() in atoms) if(!typecache[A.type]) . += A /// returns a new list with only atoms that are in typecache typecache_include but NOT in typecache_exclude /proc/typecache_filter_multi_list_exclusion(list/atoms, list/typecache_include, list/typecache_exclude) . = list() - for(var/thing in atoms) - var/atom/A = thing + for(var/atom/A as() in atoms) if(typecache_include[A.type] && !typecache_exclude[A.type]) . += A @@ -177,12 +193,6 @@ L[T] = TRUE return L -/// Empties the list by setting the length to 0. Hopefully the elements get garbage collected -/proc/clearlist(list/list) - if(istype(list)) - list.len = 0 - return - /// Removes any null entries from the list. Returns TRUE if the list had nulls, FALSE otherwise /proc/listclearnulls(list/L) var/start_len = L.len @@ -236,7 +246,7 @@ L[item] = 1 total += L[item] - total = rand(1, total) + total *= rand() for (item in L) total -=L [item] if (total <= 0) @@ -252,7 +262,7 @@ L[item] = 0 total += L[item] - total = rand(0, total) + total *= rand() for (item in L) total -=L [item] if (total <= 0 && L[item]) @@ -560,11 +570,6 @@ used_key_list[input_key] = 1 return input_key -#if DM_VERSION > 513 -#error Remie said that lummox was adding a way to get a lists -#error contents via list.values, if that is true remove this -#error otherwise, update the version and bug lummox -#endif /// Flattens a keyed list into a list of it's contents /proc/flatten_list(list/key_list) if(!islist(key_list)) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 8dfefa51ae40f..b3120c853298f 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -1,9 +1,11 @@ //wrapper macros for easier grepping #define DIRECT_OUTPUT(A, B) A << B +#define DIRECT_INPUT(A, B) A >> B #define SEND_IMAGE(target, image) DIRECT_OUTPUT(target, image) #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 READ_FILE(file, text) DIRECT_INPUT(file, 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") @@ -27,12 +29,17 @@ #define testing(msg) #endif -#ifdef UNIT_TESTS +#if defined(UNIT_TESTS) || defined(SPACEMAN_DMM) /proc/log_test(text) WRITE_LOG(GLOB.test_log, text) SEND_TEXT(world.log, text) #endif +#ifdef REFERENCE_TRACKING_LOG +#define log_reftracker(msg) log_world("## REF SEARCH [msg]") +#else +#define log_reftracker(msg) +#endif /* Items with ADMINPRIVATE prefixed are stripped from public logs. */ /proc/log_admin(text) @@ -65,15 +72,15 @@ WRITE_LOG(GLOB.world_objective_log, "OBJ: [key_name(whom)] was assigned the following objective [admin_involved ? "by [key_name(admin_involved)]" : "automatically"]: [objective]") /proc/log_mecha(text) - if (CONFIG_GET(flag/log_mecha)) + if (CONFIG_GET(flag/log_mecha) && SSticker.current_state != GAME_STATE_FINISHED) WRITE_LOG(GLOB.world_mecha_log, "MECHA: [text]") /proc/log_virus(text) - if (CONFIG_GET(flag/log_virus)) + if (CONFIG_GET(flag/log_virus) && SSticker.current_state != GAME_STATE_FINISHED) WRITE_LOG(GLOB.world_virus_log, "VIRUS: [text]") /proc/log_cloning(text, mob/initiator) - if(CONFIG_GET(flag/log_cloning)) + if(CONFIG_GET(flag/log_cloning) && SSticker.current_state != GAME_STATE_FINISHED) WRITE_LOG(GLOB.world_cloning_log, "CLONING: [text]") /proc/log_id(text) @@ -95,7 +102,7 @@ WRITE_LOG(GLOB.world_game_log, "LAW: [text]") /proc/log_attack(text) - if (CONFIG_GET(flag/log_attack)) + if (CONFIG_GET(flag/log_attack) && SSticker.current_state != GAME_STATE_FINISHED) WRITE_LOG(GLOB.world_attack_log, "ATTACK: [text]") /proc/log_manifest(ckey, datum/mind/mind,mob/body, latejoin = FALSE) @@ -103,6 +110,9 @@ WRITE_LOG(GLOB.world_manifest_log, "[ckey] \\ [body.real_name] \\ [mind.assigned_role] \\ [mind.special_role ? mind.special_role : "NONE"] \\ [latejoin ? "LATEJOIN":"ROUNDSTART"]") /proc/log_bomber(atom/user, details, atom/bomb, additional_details, message_admins = TRUE) + if(SSticker.current_state == GAME_STATE_FINISHED) + return + var/bomb_message = "[details][bomb ? " [bomb.name] at [AREACOORD(bomb)]": ""][additional_details ? " [additional_details]" : ""]." if(user) @@ -116,6 +126,7 @@ if(message_admins) message_admins("[user ? "[ADMIN_LOOKUPFLW(user)] at [ADMIN_VERBOSEJMP(user)] " : ""][details][bomb ? " [bomb.name] at [ADMIN_VERBOSEJMP(bomb)]": ""][additional_details ? " [additional_details]" : ""].") + /proc/log_say(text) if (CONFIG_GET(flag/log_say)) WRITE_LOG(GLOB.world_game_log, "SAY: [text]") @@ -201,6 +212,10 @@ /proc/log_mapping(text) WRITE_LOG(GLOB.world_map_error_log, text) +/proc/log_perf(list/perf_info) + . = "[perf_info.Join(",")]\n" + WRITE_LOG_NO_FORMAT(GLOB.perf_log, .) + /* ui logging */ /proc/log_tgui(user_or_client, text) var/entry = "" diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index 38caa661dc550..904da53f29634 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -44,13 +44,13 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/engine/eng /turf/open/space, /area/shuttle, )) - + if(creator) if(creator.create_area_cooldown >= world.time) to_chat(creator, "You're trying to create a new area a little too fast.") return creator.create_area_cooldown = world.time + 10 - + // Ignore these areas and dont let people expand them. They can expand into them though var/static/blacklisted_areas = typecacheof(list( /area/space, @@ -67,7 +67,7 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/engine/eng var/area/place = get_area(turfs[i]) if(blacklisted_areas[place.type]) continue - if(!place.requires_power || place.noteleport || place.hidden) + if(!place.requires_power || place.teleport_restriction || place.area_flags & HIDDEN_AREA) continue // No expanding powerless rooms etc areas[place.name] = place var/area_choice = input(creator, "Choose an area to expand or make a new area.", "Area Expansion") as null|anything in areas diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 2ca3b2df4e14e..0f82f2841e475 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -22,7 +22,7 @@ /proc/cmp_keybinding_dsc(datum/keybinding/a, datum/keybinding/b) return cmp_numeric_dsc(a.weight, b.weight) -// Datum cmp with vars is always slower than a specialist cmp proc, use your judgement. +// Datum cmp with vars is always slower than a specialist cmp proc, use your judgment. /proc/cmp_datum_numeric_asc(datum/a, datum/b, variable) return cmp_numeric_asc(a.vars[variable], b.vars[variable]) @@ -63,9 +63,6 @@ GLOBAL_VAR_INIT(cmp_field, "name") /proc/cmp_timer(datum/timedevent/a, datum/timedevent/b) return a.timeToRun - b.timeToRun -/proc/cmp_clientcolour_priority(datum/client_colour/A, datum/client_colour/B) - return B.priority - A.priority - /proc/cmp_ruincost_priority(datum/map_template/ruin/A, datum/map_template/ruin/B) return initial(A.cost) - initial(B.cost) @@ -99,7 +96,7 @@ GLOBAL_VAR_INIT(cmp_field, "name") return A.layer - B.layer /proc/cmp_advdisease_resistance_asc(datum/disease/advance/A, datum/disease/advance/B) - return A.totalResistance() - B.totalResistance() + return A.resistance - B.resistance /proc/cmp_quirk_asc(datum/quirk/A, datum/quirk/B) var/a_sign = num2sign(initial(A.value) * -1) diff --git a/code/__HELPERS/filters.dm b/code/__HELPERS/filters.dm new file mode 100644 index 0000000000000..7be7ca5d73251 --- /dev/null +++ b/code/__HELPERS/filters.dm @@ -0,0 +1,319 @@ +#define ICON_NOT_SET "Not Set" + +//This is stored as a nested list instead of datums or whatever because it json encodes nicely for usage in tgui +GLOBAL_LIST_INIT(master_filter_info, list( + "alpha" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "icon" = ICON_NOT_SET, + "render_source" = "", + "flags" = 0 + ), + "flags" = list( + "MASK_INVERSE" = MASK_INVERSE, + "MASK_SWAP" = MASK_SWAP + ) + ), + "angular_blur" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "size" = 1 + ) + ), + /* Not supported because making a proper matrix editor on the frontend would be a huge dick pain. + Uncomment if you ever implement it + "color" = list( + "defaults" = list( + "color" = matrix(), + "space" = FILTER_COLOR_RGB + ) + ), + */ + "displace" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "size" = null, + "icon" = ICON_NOT_SET, + "render_source" = "" + ) + ), + "drop_shadow" = list( + "defaults" = list( + "x" = 1, + "y" = -1, + "size" = 1, + "offset" = 0, + "color" = COLOR_HALF_TRANSPARENT_BLACK + ) + ), + "blur" = list( + "defaults" = list( + "size" = 1 + ) + ), + "layer" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "icon" = ICON_NOT_SET, + "render_source" = "", + "flags" = FILTER_OVERLAY, + "color" = "", + "transform" = null, + "blend_mode" = BLEND_DEFAULT + ) + ), + "motion_blur" = list( + "defaults" = list( + "x" = 0, + "y" = 0 + ) + ), + "outline" = list( + "defaults" = list( + "size" = 0, + "color" = COLOR_BLACK, + "flags" = NONE + ), + "flags" = list( + "OUTLINE_SHARP" = OUTLINE_SHARP, + "OUTLINE_SQUARE" = OUTLINE_SQUARE + ) + ), + "radial_blur" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "size" = 0.01 + ) + ), + "rays" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "size" = 16, + "color" = COLOR_WHITE, + "offset" = 0, + "density" = 10, + "threshold" = 0.5, + "factor" = 0, + "flags" = FILTER_OVERLAY | FILTER_UNDERLAY + ), + "flags" = list( + "FILTER_OVERLAY" = FILTER_OVERLAY, + "FILTER_UNDERLAY" = FILTER_UNDERLAY + ) + ), + "ripple" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "size" = 1, + "repeat" = 2, + "radius" = 0, + "falloff" = 1, + "flags" = NONE + ), + "flags" = list( + "WAVE_BOUNDED" = WAVE_BOUNDED + ) + ), + "wave" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "size" = 1, + "offset" = 0, + "flags" = NONE + ), + "flags" = list( + "WAVE_SIDEWAYS" = WAVE_SIDEWAYS, + "WAVE_BOUNDED" = WAVE_BOUNDED + ) + ) +)) + +#undef ICON_NOT_SET + +//Helpers to generate lists for filter helpers +//This is the only practical way of writing these that actually produces sane lists +/proc/alpha_mask_filter(x, y, icon/icon, render_source, flags) + . = list("type" = "alpha") + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + if(!isnull(icon)) + .["icon"] = icon + if(!isnull(render_source)) + .["render_source"] = render_source + if(!isnull(flags)) + .["flags"] = flags + +/proc/angular_blur_filter(x, y, size) + . = list("type" = "angular_blur") + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + if(!isnull(size)) + .["size"] = size + +/proc/color_matrix_filter(matrix/in_matrix, space) + . = list("type" = "color") + .["color"] = in_matrix + if(!isnull(space)) + .["space"] = space + +/proc/displacement_map_filter(icon, render_source, x, y, size = 32) + . = list("type" = "displace") + if(!isnull(icon)) + .["icon"] = icon + if(!isnull(render_source)) + .["render_source"] = render_source + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + if(!isnull(size)) + .["size"] = size + +/proc/drop_shadow_filter(x, y, size, offset, color) + . = list("type" = "drop_shadow") + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + if(!isnull(size)) + .["size"] = size + if(!isnull(offset)) + .["offset"] = offset + if(!isnull(color)) + .["color"] = color + +/proc/gauss_blur_filter(size) + . = list("type" = "blur") + if(!isnull(size)) + .["size"] = size + +/proc/layering_filter(icon, render_source, x, y, flags, color, transform, blend_mode) + . = list("type" = "layer") + if(!isnull(icon)) + .["icon"] = icon + if(!isnull(render_source)) + .["render_source"] = render_source + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + if(!isnull(color)) + .["color"] = color + if(!isnull(flags)) + .["flags"] = flags + if(!isnull(transform)) + .["transform"] = transform + if(!isnull(blend_mode)) + .["blend_mode"] = blend_mode + +/proc/motion_blur_filter(x, y) + . = list("type" = "motion_blur") + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + +/proc/outline_filter(size, color, flags) + . = list("type" = "outline") + if(!isnull(size)) + .["size"] = size + if(!isnull(color)) + .["color"] = color + if(!isnull(flags)) + .["flags"] = flags + +/proc/radial_blur_filter(size, x, y) + . = list("type" = "radial_blur") + if(!isnull(size)) + .["size"] = size + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + +/proc/rays_filter(size, color, offset, density, threshold, factor, x, y, flags) + . = list("type" = "rays") + if(!isnull(size)) + .["size"] = size + if(!isnull(color)) + .["color"] = color + if(!isnull(offset)) + .["offset"] = offset + if(!isnull(density)) + .["density"] = density + if(!isnull(threshold)) + .["threshold"] = threshold + if(!isnull(factor)) + .["factor"] = factor + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + if(!isnull(flags)) + .["flags"] = flags + +/proc/ripple_filter(radius, size, falloff, repeat, x, y, flags) + . = list("type" = "ripple") + if(!isnull(radius)) + .["radius"] = radius + if(!isnull(size)) + .["size"] = size + if(!isnull(falloff)) + .["falloff"] = falloff + if(!isnull(repeat)) + .["repeat"] = repeat + if(!isnull(flags)) + .["flags"] = flags + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + +/proc/wave_filter(x, y, size, offset, flags) + . = list("type" = "wave") + if(!isnull(size)) + .["size"] = size + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + if(!isnull(offset)) + .["offset"] = offset + if(!isnull(flags)) + .["flags"] = flags + +/proc/apply_wibbly_filters(atom/in_atom, length) + for(var/i in 1 to 7) + //This is a very baffling and strange way of doing this but I am just preserving old functionality + var/X + var/Y + var/rsq + do + X = 60*rand() - 30 + Y = 60*rand() - 30 + rsq = X*X + Y*Y + while(rsq<100 || rsq>900) // Yeah let's just loop infinitely due to bad luck what's the worst that could happen? + var/random_roll = rand() + in_atom.add_filter("wibbly-[i]", 5, wave_filter(x = X, y = Y, size = rand() * 2.5 + 0.5, offset = random_roll)) + var/filter = in_atom.get_filter("wibbly-[i]") + animate(filter, offset = random_roll, time = 0, loop = -1, flags = ANIMATION_PARALLEL) + animate(offset = random_roll - 1, time = rand() * 20 + 10) + +/proc/remove_wibbly_filters(atom/in_atom) + var/filter + for(var/i in 1 to 7) + filter = in_atom.get_filter("wibbly-[i]") + animate(filter) + in_atom.remove_filter("wibbly-[i]") diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index e8e2508903da4..d0e65f7d6e1b6 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -5,16 +5,15 @@ locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ ) +#define RANGE_TURFS_XY(XRADIUS, YRADIUS, CENTER) \ + block( \ + locate(max(CENTER.x-(XRADIUS),1), max(CENTER.y-(YRADIUS),1), CENTER.z), \ + locate(min(CENTER.x+(XRADIUS),world.maxx), min(CENTER.y+(YRADIUS),world.maxy), CENTER.z) \ + ) + #define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL)) #define CULT_POLL_WAIT 2400 -/proc/get_area(atom/A) - RETURN_TYPE(/area) - if(isarea(A)) - return A - var/turf/T = get_turf(A) - return T ? T.loc : null - /proc/get_area_name(atom/X, format_text = FALSE) var/area/A = isarea(X) ? X : get_area(X) if(!A) @@ -28,10 +27,8 @@ if(!center) return list() - var/list/turfs = RANGE_TURFS(dist, center) var/list/areas = list() - for(var/V in turfs) - var/turf/T = V + for(var/turf/T as() in RANGE_TURFS(dist, center)) areas |= T.loc return areas @@ -115,7 +112,7 @@ var/list/turfs = new/list() var/rsq = radius * (radius+0.5) - for(var/atom/T in range(radius, centerturf)) + for(var/atom/T as() in range(radius, centerturf)) var/dx = T.x - centerturf.x var/dy = T.y - centerturf.y if(dx*dx + dy*dy <= rsq) @@ -130,7 +127,7 @@ var/list/atoms = new/list() var/rsq = radius * (radius+0.5) - for(var/atom/A in view(radius, centerturf)) + for(var/atom/A as() in view(radius, centerturf)) var/dx = A.x - centerturf.x var/dy = A.y - centerturf.y if(dx*dx + dy*dy <= rsq) @@ -153,7 +150,7 @@ var/list/turfs = new/list() var/rsq = radius * (radius+0.5) - for(var/turf/T in range(radius, centerturf)) + for(var/turf/T as() in RANGE_TURFS(radius, centerturf)) var/dx = T.x - centerturf.x var/dy = T.y - centerturf.y if(dx*dx + dy*dy <= rsq) @@ -173,20 +170,6 @@ turfs += T return turfs - -//This is the new version of recursive_mob_check, used for say(). -//The other proc was left intact because morgue trays use it. -//Sped this up again for real this time -/proc/recursive_hear_check(O) - var/list/processing_list = list(O) - . = list() - while(processing_list.len) - var/atom/A = processing_list[1] - if(A.flags_1 & HEAR_1) - . += A - processing_list.Cut(1, 2) - processing_list += A.contents - /** recursive_organ_check * inputs: O (object to start with) * outputs: @@ -224,7 +207,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) @@ -265,47 +248,31 @@ return found_mobs - -/proc/get_hearers_in_view(R, atom/source) - // Returns a list of hearers in view(R) from source (ignoring luminosity). Used in saycode. - var/turf/T = get_turf(source) +/// Returns a list of hearers in view(view_radius) from source (ignoring luminosity). uses important_recursive_contents[RECURSIVE_CONTENTS_HEARING_SENSITIVE] +/proc/get_hearers_in_view(view_radius, atom/source) + var/turf/center_turf = get_turf(source) . = list() - - if(!T) + if(!center_turf) return - - var/list/processing_list = list() - if (R == 0) // if the range is zero, we know exactly where to look for, we can skip view - processing_list += T.contents // We can shave off one iteration by assuming turfs cannot hear - else // A variation of get_hear inlined here to take advantage of the compiler's fastpath for obj/mob in view - var/lum = T.luminosity - T.luminosity = 6 // This is the maximum luminosity - for(var/mob/M in view(R, T)) - processing_list += M - for(var/obj/O in view(R, T)) - processing_list += O - T.luminosity = lum - - while(processing_list.len) // recursive_hear_check inlined here - var/atom/A = processing_list[1] - if(A.flags_1 & HEAR_1) - . += A - processing_list.Cut(1, 2) - processing_list += A.contents + var/lum = center_turf.luminosity + center_turf.luminosity = 6 // This is the maximum luminosity + for(var/atom/movable/movable in view(view_radius, center_turf)) + var/list/recursive_contents = LAZYACCESS(movable.important_recursive_contents, RECURSIVE_CONTENTS_HEARING_SENSITIVE) + if(recursive_contents) + . += recursive_contents + center_turf.luminosity = lum /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 for(var/obj/item/radio/R in radios) - if(R) - if(R.canhear_range != -1) - . |= get_hearers_in_view(R.canhear_range, R) - else - if(istype(R.loc, /obj/item/implant)) - var/obj/item/implant/I = R.loc - if(I.imp_in) - . |= I.imp_in - + if(R.canhear_range != -1) + . |= get_hearers_in_view(R.canhear_range, R) + else + if(istype(R.loc, /obj/item/implant)) + var/obj/item/implant/I = R.loc + if(I.imp_in) + . |= I.imp_in #define SIGNV(X) ((X<0)?-1:1) @@ -377,11 +344,10 @@ if(AM.Move(get_step(T, direction))) break -/proc/get_mob_by_key(key) - var/ckey = ckey(key) - for(var/i in GLOB.player_list) - var/mob/M = i - if(M.ckey == ckey) +/proc/get_mob_by_ckey(key) + var/ckey = ckey(key) //just to be safe + for(var/mob/M as() in GLOB.player_list) + if(M?.ckey == ckey) return M return null @@ -401,13 +367,17 @@ /proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480) if(!isobj(O)) - O = new /obj/screen/text() - O.maptext = maptext + O = new /atom/movable/screen/text() + O.maptext = MAPTEXT(maptext) O.maptext_height = maptext_height O.maptext_width = maptext_width O.screen_loc = screen_loc return O +/// Removes an image from a client's `.images`. Useful as a callback. +/proc/remove_image_from_client(image/image, client/remove_from) + remove_from?.images -= image + /proc/remove_images_from_clients(image/I, list/show_to) for(var/client/C in show_to) C.images -= I @@ -419,8 +389,7 @@ /proc/flick_overlay_view(image/I, atom/target, duration) //wrapper for the above, flicks to everyone who can see the target atom var/list/viewing = list() - for(var/m in viewers(target)) - var/mob/M = m + for(var/mob/M as() in viewers(target)) if(M.client) viewing += M.client flick_overlay(I, viewing, duration) @@ -476,6 +445,8 @@ /proc/pollGhostCandidates(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE) var/list/candidates = list() + if(!(GLOB.ghost_role_flags & GHOSTROLE_STATION_SENTIENCE)) + return candidates for(var/mob/dead/observer/G in GLOB.player_list) candidates += G @@ -610,10 +581,9 @@ // Find a obstruction free turf that's within the range of the center. Can also condition on if it is of a certain area type. /proc/find_obstruction_free_location(var/range, var/atom/center, var/area/specific_area) - var/list/turfs = RANGE_TURFS(range, center) var/list/possible_loc = list() - for(var/turf/found_turf in turfs) + for(var/turf/found_turf as() in RANGE_TURFS(range, center)) var/area/turf_area = get_area(found_turf) // We check if both the turf is a floor, and that it's actually in the area. diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 870f70cfa7733..4c6a4227c5724 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -47,12 +47,6 @@ GLOB.surgeries_list += new path() sortList(GLOB.surgeries_list) - //Materials - for(var/path in subtypesof(/datum/material)) - var/datum/material/D = new path() - GLOB.materials_list[D.id] = D - sortList(GLOB.materials_list) - GLOB.emote_list = init_emote_list() diff --git a/code/__HELPERS/heap.dm b/code/__HELPERS/heap.dm index 3ed3af80f15a3..c860b2013ca78 100644 --- a/code/__HELPERS/heap.dm +++ b/code/__HELPERS/heap.dm @@ -1,39 +1,44 @@ +////////////////////// +//datum/heap object +////////////////////// -//-----------------// -//datum/Heap object// -//-----------------// - -/datum/Heap +/datum/heap var/list/L var/cmp -/datum/Heap/New(compare) +/datum/heap/New(compare) L = new() cmp = compare -/datum/Heap/proc/IsEmpty() - return !L.len +/datum/heap/Destroy(force, ...) + for(var/i in L) // because this is before the list helpers are loaded + qdel(i) + L = null + return ..() + +/datum/heap/proc/is_empty() + return !length(L) -//Insert and place at its position a new node in the heap -/datum/Heap/proc/Insert(atom/A) +//insert and place at its position a new node in the heap +/datum/heap/proc/insert(atom/A) L.Add(A) - Swim(L.len) + swim(length(L)) //removes and returns the first element of the heap //(i.e the max or the min dependant on the comparison function) -/datum/Heap/proc/Pop() - if(!L.len) +/datum/heap/proc/pop() + if(!length(L)) return 0 . = L[1] - L[1] = L[L.len] - L.Cut(L.len) - if(L.len) - Sink(1) + L[1] = L[length(L)] + L.Cut(length(L)) + if(length(L)) + sink(1) //Get a node up to its right position in the heap -/datum/Heap/proc/Swim(var/index) +/datum/heap/proc/swim(index) var/parent = round(index * 0.5) while(parent > 0 && (call(cmp)(L[index],L[parent]) > 0)) @@ -42,21 +47,21 @@ parent = round(index * 0.5) //Get a node down to its right position in the heap -/datum/Heap/proc/Sink(var/index) - var/g_child = GetGreaterChild(index) +/datum/heap/proc/sink(index) + var/g_child = get_greater_child(index) while(g_child > 0 && (call(cmp)(L[index],L[g_child]) < 0)) L.Swap(index,g_child) index = g_child - g_child = GetGreaterChild(index) + g_child = get_greater_child(index) //Returns the greater (relative to the comparison proc) of a node children //or 0 if there's no child -/datum/Heap/proc/GetGreaterChild(var/index) - if(index * 2 > L.len) +/datum/heap/proc/get_greater_child(index) + if(index * 2 > length(L)) return 0 - if(index * 2 + 1 > L.len) + if(index * 2 + 1 > length(L)) return index * 2 if(call(cmp)(L[index * 2],L[index * 2 + 1]) < 0) @@ -65,12 +70,11 @@ return index * 2 //Replaces a given node so it verify the heap condition -/datum/Heap/proc/ReSort(atom/A) +/datum/heap/proc/resort(atom/A) var/index = L.Find(A) - Swim(index) - Sink(index) + swim(index) + sink(index) -/datum/Heap/proc/List() +/datum/heap/proc/List() . = L.Copy() - diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index b11ff5ec9e0bc..64fc2dd8693a5 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -377,8 +377,7 @@ //SSicon_smooth /proc/queue_smooth_neighbors(atom/A) - for(var/V in orange(1,A)) - var/atom/T = V + for(var/atom/T as() in orange(1,A)) if(T.smooth) queue_smooth(T) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 443483b40f853..99128b159c724 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -706,6 +706,11 @@ world ((hi3 >= 65 ? hi3-55 : hi3-48)<<4) | (lo3 >= 65 ? lo3-55 : lo3-48), ((hi4 >= 65 ? hi4-55 : hi4-48)<<4) | (lo4 >= 65 ? lo4-55 : lo4-48)) +//Returns color multiplied by amount, in hex format +/proc/MultiplyHexColor(color, amount) + var/list/rgb = ReadRGB(color) + return rgb(round(rgb[1]*amount), round(rgb[2]*amount), round(rgb[3]*amount)) + // Creates a single icon from a given /atom or /image. Only the first argument is required. /proc/getFlatIcon(image/A, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE) //Define... defines. @@ -908,6 +913,65 @@ world #undef BLANK #undef SET_SELF +/proc/getStillIcon(atom/A, directionless = TRUE)//By whoever that guy below me is, I just kind of stole it and changed it a bit lol + var/icon/overlayIcon = new /icon() + var/isEmpty = TRUE //So the overlay icon isn't empty. + //==== OVERLAYS ==== + //Do sorting :( + var/list/layers = list() + + var/direction = directionless ? SOUTH : A.dir + + // Loop through the underlays, then overlays, sorting them into the layers list + for(var/i in 1 to A.overlays.len) + var/image/current = A.overlays[i] + if(!current) + continue + if(current.plane != FLOAT_PLANE && current.plane != A.plane) + continue + var/current_layer = current.layer + if(current_layer < 0) + current_layer = A.layer + current_layer / 1000 + + for(var/p in 1 to layers.len) + var/image/cmp = layers[p] + if(current_layer < layers[cmp]) + layers.Insert(p, current) + break + layers[current] = current_layer + CHECK_TICK + //Apply sorted + for(var/V in layers)//For every image in overlays. var/image/I will not work, don't try it. + var/image/I = V + var/icon/image_overlay = new(I.icon,I.icon_state,direction)//Blend only works with icon objects. + //Make sure the overlay actually exists and is valid + if(!(I.icon_state in icon_states(I.icon))) + continue + //Colour + if(I.color) + if(islist(I.color)) + image_overlay.MapColors(arglist(I.color)) + else + image_overlay.Blend(I.color, ICON_MULTIPLY) + //Clean up repeated frames + var/icon/cleaned = new /icon() + cleaned.Insert(image_overlay, "", SOUTH, 1, 0) + //Also, icons cannot directly set icon_state. Slower than changing variables but whatever. + if(isEmpty) + overlayIcon.Insert(cleaned, "", SOUTH, 1, FALSE) + isEmpty = FALSE + else + overlayIcon.Blend(cleaned, ICON_OVERLAY)//OR so they are lumped together in a nice overlay. + CHECK_TICK + //==== PUTTING IT ALL TOGETHER ==== + var/icon/default = new(A.icon, A.icon_state, direction)//So we want the default icon and icon state of A. + //Blend the 2 icons + default.Blend(overlayIcon, ICON_OVERLAY) + //Boom put it all together + var/icon/cleaned = new /icon() + cleaned.Insert(default, "", SOUTH, 1, FALSE) //Clean out animation states. + return cleaned//And now return the mask. + /proc/getIconMask(atom/A)//By yours truly. Creates a dynamic mask for a mob/whatever. /N var/icon/alpha_mask = new(A.icon,A.icon_state)//So we want the default icon and icon state of A. for(var/V in A.overlays)//For every image in overlays. var/image/I will not work, don't try it. @@ -983,7 +1047,7 @@ world letter = lowertext(letter) var/image/text_image = new(loc = A) - text_image.maptext = "[letter]" + text_image.maptext = MAPTEXT("[letter]") text_image.pixel_x = 7 text_image.pixel_y = 5 qdel(atom_icon) diff --git a/code/__HELPERS/level_traits.dm b/code/__HELPERS/level_traits.dm index 8039953d9ccb6..84992a7a85309 100644 --- a/code/__HELPERS/level_traits.dm +++ b/code/__HELPERS/level_traits.dm @@ -9,6 +9,8 @@ #define is_reebe(z) SSmapping.level_trait(z, ZTRAIT_REEBE) +#define is_dynamic_level(z) SSmapping.level_trait(z, ZTRAIT_DYNAMIC_LEVEL) + #define is_reserved_level(z) SSmapping.level_trait(z, ZTRAIT_RESERVED) #define is_away_level(z) SSmapping.level_trait(z, ZTRAIT_AWAY) diff --git a/code/__HELPERS/matrices.dm b/code/__HELPERS/matrices.dm index 044b4dba079dd..701964e0fbc16 100644 --- a/code/__HELPERS/matrices.dm +++ b/code/__HELPERS/matrices.dm @@ -176,3 +176,40 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro for(x in 1 to 4) output[offset+x] = round(A[offset+1]*B[x] + A[offset+2]*B[x+4] + A[offset+3]*B[x+8] + A[offset+4]*B[x+12]+(y==5?B[x+16]:0), 0.001) return output + +///Converts RGB shorthands into RGBA matrices complete of constants rows (ergo a 20 keys list in byond). +/proc/color_to_full_rgba_matrix(color) + if(istext(color)) + var/list/L = ReadRGB(color) + if(!L) + CRASH("Invalid/unsupported color format argument in color_to_full_rgba_matrix()") + return list(L[1]/255,0,0,0, 0,L[2]/255,0,0, 0,0,L[3]/255,0, 0,0,0,L.len>3?L[4]/255:1, 0,0,0,0) + else if(!islist(color)) //invalid format + return color_matrix_identity() + var/list/L = color + switch(L.len) + if(3 to 5) // row-by-row hexadecimals + . = list() + for(var/a in 1 to L.len) + var/list/rgb = ReadRGB(L[a]) + for(var/b in rgb) + . += b/255 + if(length(rgb) % 4) // RGB has no alpha instruction + . += a != 4 ? 0 : 1 + if(L.len < 4) //missing both alphas and constants rows + . += list(0,0,0,1, 0,0,0,0) + else if(L.len < 5) //missing constants row + . += list(0,0,0,0) + if(9 to 12) //RGB + . = list(L[1],L[2],L[3],0, L[4],L[5],L[6],0, L[7],L[8],L[9],0, 0,0,0,1) + for(var/b in 1 to 3) //missing constants row + . += L.len < 9+b ? 0 : L[9+b] + . += 0 + if(16 to 20) // RGBA + . = L.Copy() + if(L.len < 20) //missing constants row + for(var/b in 1 to 20-L.len) + . += 0 + else + CRASH("Invalid/unsupported color format argument in color_to_full_rgba_matrix()") + diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 83893ff131d4f..077b5eb6b23c8 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -152,6 +152,14 @@ if(!findname(.)) break +/proc/random_unique_ooze_name(attempts_to_find_unique_name=10) + for(var/i in 1 to attempts_to_find_unique_name) + . = capitalize(pick(GLOB.oozeling_first_names)) + " " + capitalize(pick(GLOB.oozeling_last_names)) + + if(!findname(.)) + break + + /proc/random_skin_tone() return pick(GLOB.skin_tones) @@ -256,6 +264,10 @@ GLOBAL_LIST_EMPTY(species_list) if(target && !isturf(target)) Tloc = target.loc + if(target) + LAZYADD(user.do_afters, target) + LAZYADD(target.targeted_by, user) + var/atom/Uloc = user.loc var/drifting = 0 @@ -268,7 +280,7 @@ GLOBAL_LIST_EMPTY(species_list) if(holding) holdingnull = 0 //Users hand started holding something, check to see if it's still holding that - delay *= user.do_after_coefficent() + delay *= user.cached_multiplicative_actions_slowdown var/datum/progressbar/progbar if (progress) @@ -301,6 +313,10 @@ GLOBAL_LIST_EMPTY(species_list) . = 0 break + if(target && !(target in user.do_afters)) + . = 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 @@ -313,10 +329,11 @@ GLOBAL_LIST_EMPTY(species_list) break if (progress) qdel(progbar) + + if(!QDELETED(target)) + LAZYREMOVE(user.do_afters, target) + LAZYREMOVE(target.targeted_by, user) -/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, list/targets, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks, required_mobility_flags = MOBILITY_STAND) if(!user || !targets) @@ -325,7 +342,9 @@ GLOBAL_LIST_EMPTY(species_list) targets = list(targets) var/user_loc = user.loc - var/drifting = 0 + time *= user.cached_multiplicative_actions_slowdown + + var/drifting = FALSE if(!user.Process_Spacemove(0) && user.inertia_dir) drifting = 1 @@ -543,3 +562,7 @@ GLOBAL_LIST_EMPTY(species_list) for(var/mob/living/carbon/human/player in GLOB.mob_living_list) if(player.stat != DEAD && player.mind && is_station_level(player.z)) . |= player.mind + +/// Gets the client of the mob, allowing for mocking of the client. +/// You only need to use this if you know you're going to be mocking clients somewhere else. +#define GET_CLIENT(mob) (##mob.client || ##mob.mock_client) diff --git a/code/__HELPERS/mouse_control.dm b/code/__HELPERS/mouse_control.dm index 784496ed200c5..e7e1b34433742 100644 --- a/code/__HELPERS/mouse_control.dm +++ b/code/__HELPERS/mouse_control.dm @@ -1,5 +1,5 @@ -/proc/mouse_angle_from_client(client/client) - var/list/mouse_control = params2list(client.mouseParams) +/proc/mouse_angle_from_client(client/client, mouseParams) + var/list/mouse_control = params2list(mouseParams) if(mouse_control["screen-loc"] && client) var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",") var/list/screen_loc_X = splittext(screen_loc_params[1],":") @@ -15,10 +15,10 @@ return angle //Wow, specific name! -/proc/mouse_absolute_datum_map_position_from_client(client/client) +/proc/mouse_absolute_datum_map_position_from_client(client/client, params) if(!isloc(client.mob.loc)) return - var/list/mouse_control = params2list(client.mouseParams) + var/list/mouse_control = params2list(params) var/atom/A = client.eye var/turf/T = get_turf(A) var/cx = T.x diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 8fd4036689200..a0ce1614b7e84 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -25,7 +25,10 @@ /proc/moth_name() return "[pick(GLOB.moth_first)] [pick(GLOB.moth_last)]" -proc/squid_name(gender) +/proc/ooze_name() + return "[pick(GLOB.oozeling_first_names)] [pick(GLOB.oozeling_last_names)]" + +/proc/squid_name(gender) if(gender == MALE) return "[pick(GLOB.squid_names_male)] [pick(GLOB.last_names)]" else @@ -69,6 +72,10 @@ GLOBAL_VAR(command_name) else world.name = GLOB.station_name + //Rename the station on the orbital charter. + if(SSorbits.station_instance) + SSorbits.station_instance.name = newname + /proc/new_station_name() var/random = rand(1,5) @@ -82,11 +89,12 @@ GLOBAL_VAR(command_name) name = "" // Prefix - for(var/holiday_name in SSevents.holidays) - if(holiday_name == "Friday the 13th") - random = 13 + var/holiday_name = pick(SSevents.holidays) + if(holiday_name) var/datum/holiday/holiday = SSevents.holidays[holiday_name] name = holiday.getStationPrefix() + if(istype(holiday, /datum/holiday/friday_thirteenth)) + random = 13 //get normal name if(!name) name = pick(GLOB.station_names) diff --git a/code/__HELPERS/path.dm b/code/__HELPERS/path.dm new file mode 100644 index 0000000000000..7ae72c3fa233f --- /dev/null +++ b/code/__HELPERS/path.dm @@ -0,0 +1,359 @@ +/** + * This file contains the stuff you need for using JPS (Jump Point Search) pathing, an alternative to A* that skips + * over large numbers of uninteresting tiles resulting in much quicker pathfinding solutions. Mind that diagonals + * cost the same as cardinal moves currently, so paths may look a bit strange, but should still be optimal. + */ + +/** + * This is the proc you use whenever you want to have pathfinding more complex than "try stepping towards the thing". + * If no path was found, returns an empty list, which is important for bots like medibots who expect an empty list rather than nothing. + * + * Arguments: + * * caller: The movable atom that's trying to find the path + * * end: What we're trying to path to. It doesn't matter if this is a turf or some other atom, we're gonna just path to the turf it's on anyway + * * max_distance: The maximum number of steps we can take in a given path to search (default: 30, 0 = infinite) + * * mintargetdistance: Minimum distance to the target before path returns, could be used to get near a target, but not right to it - for an AI mob with a gun, for example. + * * id: An ID card representing what access we have and what doors we can open. Its location relative to the pathing atom is irrelevant + * * simulated_only: Whether we consider turfs without atmos simulation (AKA do we want to ignore space) + * * exclude: If we want to avoid a specific turf, like if we're a mulebot who already got blocked by some turf + * * skip_first: Whether or not to delete the first item in the path. This would be done because the first item is the starting tile, which can break movement for some creatures. + */ +/proc/get_path_to(caller, end, max_distance = 30, mintargetdist, id=null, simulated_only = TRUE, turf/exclude, skip_first=TRUE) + if(!caller || !get_turf(end)) + return + + var/l = SSpathfinder.mobs.getfree(caller) + while(!l) + stoplag(3) + l = SSpathfinder.mobs.getfree(caller) + + var/list/path + var/datum/pathfind/pathfind_datum = new(caller, end, id, max_distance, mintargetdist, simulated_only, exclude) + path = pathfind_datum.search() + qdel(pathfind_datum) + + SSpathfinder.mobs.found(l) + if(!path) + path = list() + if(length(path) > 0 && skip_first) + path.Cut(1,2) + return path + +/** + * A helper macro to see if it's possible to step from the first turf into the second one, minding things like door access and directional windows. + * Note that this can only be used inside the [datum/pathfind][pathfind datum] since it uses variables from said datum. + * If you really want to optimize things, optimize this, cuz this gets called a lot. + */ +#define CAN_STEP(cur_turf, next) (next && !next.density && cur_turf.Adjacent(next) && !(simulated_only && SSpathfinder.space_type_cache[next.type]) && !cur_turf.LinkBlockedWithAccess(next,caller, id) && (next != avoid)) +/// Another helper macro for JPS, for telling when a node has forced neighbors that need expanding +#define STEP_NOT_HERE_BUT_THERE(cur_turf, dirA, dirB) ((!CAN_STEP(cur_turf, get_step(cur_turf, dirA)) && CAN_STEP(cur_turf, get_step(cur_turf, dirB)))) + +/// The JPS Node datum represents a turf that we find interesting enough to add to the open list and possibly search for new tiles from +/datum/jps_node + /// The turf associated with this node + var/turf/tile + /// The node we just came from + var/datum/jps_node/previous_node + /// The A* node weight (f_value = number_of_tiles + heuristic) + var/f_value + /// The A* node heuristic (a rough estimate of how far we are from the goal) + var/heuristic + /// How many steps it's taken to get here from the start (currently pulling double duty as steps taken & cost to get here, since all moves incl diagonals cost 1 rn) + var/number_tiles + /// How many steps it took to get here from the last node + var/jumps + /// Nodes store the endgoal so they can process their heuristic without a reference to the pathfind datum + var/turf/node_goal + +/datum/jps_node/New(turf/our_tile, datum/jps_node/incoming_previous_node, jumps_taken, turf/incoming_goal) + tile = our_tile + jumps = jumps_taken + if(incoming_goal) // if we have the goal argument, this must be the first/starting node + node_goal = incoming_goal + else if(incoming_previous_node) // if we have the parent, this is from a direct lateral/diagonal scan, we can fill it all out now + previous_node = incoming_previous_node + number_tiles = previous_node.number_tiles + jumps + node_goal = previous_node.node_goal + heuristic = get_dist(tile, node_goal) + f_value = number_tiles + heuristic + // otherwise, no parent node means this is from a subscan lateral scan, so we just need the tile for now until we call [datum/jps/proc/update_parent] on it + +/datum/jps_node/Destroy(force, ...) + previous_node = null + return ..() + +/datum/jps_node/proc/update_parent(datum/jps_node/new_parent) + previous_node = new_parent + node_goal = previous_node.node_goal + jumps = get_dist(tile, previous_node.tile) + number_tiles = previous_node.number_tiles + jumps + heuristic = get_dist(tile, node_goal) + f_value = number_tiles + heuristic + +/// TODO: Macro this to reduce proc overhead +/proc/HeapPathWeightCompare(datum/jps_node/a, datum/jps_node/b) + return b.f_value - a.f_value + +/// The datum used to handle the JPS pathfinding, completely self-contained +/datum/pathfind + /// The thing that we're actually trying to path for + var/atom/movable/caller + /// The turf where we started at + var/turf/start + /// The turf we're trying to path to (note that this won't track a moving target) + var/turf/end + /// The open list/stack we pop nodes out from (TODO: make this a normal list and macro-ize the heap operations to reduce proc overhead) + var/datum/heap/open + ///An assoc list that serves as the closed list & tracks what turfs came from where. Key is the turf, and the value is what turf it came from + var/list/sources + /// The list we compile at the end if successful to pass back + var/list/path + + // general pathfinding vars/args + /// An ID card representing what access we have and what doors we can open. Its location relative to the pathing atom is irrelevant + var/obj/item/card/id/id + /// How far away we have to get to the end target before we can call it quits + var/mintargetdist = 0 + /// I don't know what this does vs , but they limit how far we can search before giving up on a path + var/max_distance = 30 + /// Space is big and empty, if this is TRUE then we ignore pathing through unsimulated tiles + var/simulated_only + /// A specific turf we're avoiding, like if a mulebot is being blocked by someone t-posing in a doorway we're trying to get through + var/turf/avoid + +/datum/pathfind/New(atom/movable/caller, atom/goal, id, max_distance, mintargetdist, simulated_only, avoid) + src.caller = caller + end = get_turf(goal) + open = new /datum/heap(/proc/HeapPathWeightCompare) + sources = new() + src.id = id + src.max_distance = max_distance + src.mintargetdist = mintargetdist + src.simulated_only = simulated_only + src.avoid = avoid + +/** + * search() is the proc you call to kick off and handle the actual pathfinding, and kills the pathfind datum instance when it's done. + * + * If a valid path was found, it's returned as a list. If invalid or cross-z-level params are entered, or if there's no valid path found, we + * return null, which [/proc/get_path_to] translates to an empty list (notable for simple bots, who need empty lists) + */ +/datum/pathfind/proc/search() + start = get_turf(caller) + if(!start || !end) + stack_trace("Invalid A* start or destination") + return + if(start.z != end.z || start == end ) //no pathfinding between z levels + return + if(max_distance && (max_distance < get_dist(start, end))) //if start turf is farther than max_distance from end turf, no need to do anything + return + + //initialization + var/datum/jps_node/current_processed_node = new (start, -1, 0, end) + open.insert(current_processed_node) + sources[start] = start // i'm sure this is fine + + //then run the main loop + while(!open.is_empty() && !path) + if(!caller) + return + current_processed_node = open.pop() //get the lower f_value turf in the open list + if(max_distance && (current_processed_node.number_tiles > max_distance))//if too many steps, don't process that path + continue + + var/turf/current_turf = current_processed_node.tile + for(var/scan_direction in list(EAST, WEST, NORTH, SOUTH)) + lateral_scan_spec(current_turf, scan_direction, current_processed_node) + + for(var/scan_direction in list(NORTHEAST, SOUTHEAST, NORTHWEST, SOUTHWEST)) + diag_scan_spec(current_turf, scan_direction, current_processed_node) + + CHECK_TICK + + //we're done! reverse the path to get it from start to finish + if(path) + for(var/i = 1 to round(0.5 * length(path))) + path.Swap(i, length(path) - i + 1) + + sources = null + qdel(open) + return path + +/// Called when we've hit the goal with the node that represents the last tile, then sets the path var to that path so it can be returned by [datum/pathfind/proc/search] +/datum/pathfind/proc/unwind_path(datum/jps_node/unwind_node) + path = new() + var/turf/iter_turf = unwind_node.tile + path.Add(iter_turf) + + while(unwind_node.previous_node) + var/dir_goal = get_dir(iter_turf, unwind_node.previous_node.tile) + for(var/i = 1 to unwind_node.jumps) + iter_turf = get_step(iter_turf,dir_goal) + path.Add(iter_turf) + unwind_node = unwind_node.previous_node + +/** + * For performing lateral scans from a given starting turf. + * + * These scans are called from both the main search loop, as well as subscans for diagonal scans, and they treat finding interesting turfs slightly differently. + * If we're doing a normal lateral scan, we already have a parent node supplied, so we just create the new node and immediately insert it into the heap, ezpz. + * If we're part of a subscan, we still need for the diagonal scan to generate a parent node, so we return a node datum with just the turf and let the diag scan + * proc handle transferring the values and inserting them into the heap. + * + * Arguments: + * * original_turf: What turf did we start this scan at? + * * heading: What direction are we going in? Obviously, should be cardinal + * * parent_node: Only given for normal lateral scans, if we don't have one, we're a diagonal subscan. +*/ +/datum/pathfind/proc/lateral_scan_spec(turf/original_turf, heading, datum/jps_node/parent_node) + var/steps_taken = 0 + + var/turf/current_turf = original_turf + var/turf/lag_turf = original_turf + + while(TRUE) + if(path) + return + lag_turf = current_turf + current_turf = get_step(current_turf, heading) + steps_taken++ + if(!CAN_STEP(lag_turf, current_turf)) + return + + if(current_turf == end || (mintargetdist && (get_dist(current_turf, end) <= mintargetdist))) + var/datum/jps_node/final_node = new(current_turf, parent_node, steps_taken) + sources[current_turf] = original_turf + if(parent_node) // if this is a direct lateral scan we can wrap up, if it's a subscan from a diag, we need to let the diag make their node first, then finish + unwind_path(final_node) + return final_node + else if(sources[current_turf]) // already visited, essentially in the closed list + return + else + sources[current_turf] = original_turf + + if(parent_node && parent_node.number_tiles + steps_taken > max_distance) + return + + var/interesting = FALSE // have we found a forced neighbor that would make us add this turf to the open list? + + switch(heading) + if(NORTH) + if(STEP_NOT_HERE_BUT_THERE(current_turf, WEST, NORTHWEST) || STEP_NOT_HERE_BUT_THERE(current_turf, EAST, NORTHEAST)) + interesting = TRUE + if(SOUTH) + if(STEP_NOT_HERE_BUT_THERE(current_turf, WEST, SOUTHWEST) || STEP_NOT_HERE_BUT_THERE(current_turf, EAST, SOUTHEAST)) + interesting = TRUE + if(EAST) + if(STEP_NOT_HERE_BUT_THERE(current_turf, NORTH, NORTHEAST) || STEP_NOT_HERE_BUT_THERE(current_turf, SOUTH, SOUTHEAST)) + interesting = TRUE + if(WEST) + if(STEP_NOT_HERE_BUT_THERE(current_turf, NORTH, NORTHWEST) || STEP_NOT_HERE_BUT_THERE(current_turf, SOUTH, SOUTHWEST)) + interesting = TRUE + + if(interesting) + var/datum/jps_node/newnode = new(current_turf, parent_node, steps_taken) + if(parent_node) // if we're a diagonal subscan, we'll handle adding ourselves to the heap in the diag + open.insert(newnode) + return newnode + +/** + * For performing diagonal scans from a given starting turf. + * + * Unlike lateral scans, these only are called from the main search loop, so we don't need to worry about returning anything, + * though we do need to handle the return values of our lateral subscans of course. + * + * Arguments: + * * original_turf: What turf did we start this scan at? + * * heading: What direction are we going in? Obviously, should be diagonal + * * parent_node: We should always have a parent node for diagonals +*/ +/datum/pathfind/proc/diag_scan_spec(turf/original_turf, heading, datum/jps_node/parent_node) + var/steps_taken = 0 + var/turf/current_turf = original_turf + var/turf/lag_turf = original_turf + + while(TRUE) + if(path) + return + lag_turf = current_turf + current_turf = get_step(current_turf, heading) + steps_taken++ + if(!CAN_STEP(lag_turf, current_turf)) + return + + if(current_turf == end || (mintargetdist && (get_dist(current_turf, end) <= mintargetdist))) + var/datum/jps_node/final_node = new(current_turf, parent_node, steps_taken) + sources[current_turf] = original_turf + unwind_path(final_node) + return + else if(sources[current_turf]) // already visited, essentially in the closed list + return + else + sources[current_turf] = original_turf + + if(parent_node.number_tiles + steps_taken > max_distance) + return + + var/interesting = FALSE // have we found a forced neighbor that would make us add this turf to the open list? + var/datum/jps_node/possible_child_node // otherwise, did one of our lateral subscans turn up something? + + switch(heading) + if(NORTHWEST) + if(STEP_NOT_HERE_BUT_THERE(current_turf, EAST, NORTHEAST) || STEP_NOT_HERE_BUT_THERE(current_turf, SOUTH, SOUTHWEST)) + interesting = TRUE + else + possible_child_node = (lateral_scan_spec(current_turf, WEST) || lateral_scan_spec(current_turf, NORTH)) + if(NORTHEAST) + if(STEP_NOT_HERE_BUT_THERE(current_turf, WEST, NORTHWEST) || STEP_NOT_HERE_BUT_THERE(current_turf, SOUTH, SOUTHEAST)) + interesting = TRUE + else + possible_child_node = (lateral_scan_spec(current_turf, EAST) || lateral_scan_spec(current_turf, NORTH)) + if(SOUTHWEST) + if(STEP_NOT_HERE_BUT_THERE(current_turf, EAST, SOUTHEAST) || STEP_NOT_HERE_BUT_THERE(current_turf, NORTH, NORTHWEST)) + interesting = TRUE + else + possible_child_node = (lateral_scan_spec(current_turf, SOUTH) || lateral_scan_spec(current_turf, WEST)) + if(SOUTHEAST) + if(STEP_NOT_HERE_BUT_THERE(current_turf, WEST, SOUTHWEST) || STEP_NOT_HERE_BUT_THERE(current_turf, NORTH, NORTHEAST)) + interesting = TRUE + else + possible_child_node = (lateral_scan_spec(current_turf, SOUTH) || lateral_scan_spec(current_turf, EAST)) + + if(interesting || possible_child_node) + var/datum/jps_node/newnode = new(current_turf, parent_node, steps_taken) + open.insert(newnode) + if(possible_child_node) + possible_child_node.update_parent(newnode) + open.insert(possible_child_node) + if(possible_child_node.tile == end || (mintargetdist && (get_dist(possible_child_node.tile, end) <= mintargetdist))) + unwind_path(possible_child_node) + return + +/** + * For seeing if we can actually move between 2 given turfs while accounting for our access and the caller's pass_flags + * + * Arguments: + * * caller: The movable, if one exists, being used for mobility checks to see what tiles it can reach + * * ID: An ID card that decides if we can gain access to doors that would otherwise block a turf + * * simulated_only: Do we only worry about turfs with simulated atmos, most notably things that aren't space? +*/ +/turf/proc/LinkBlockedWithAccess(turf/destination_turf, caller, ID) + var/actual_dir = get_dir(src, destination_turf) + + for(var/obj/structure/window/iter_window in src) + if(!iter_window.CanAStarPass(ID, actual_dir)) + return TRUE + + for(var/obj/machinery/door/window/iter_windoor in src) + if(!iter_windoor.CanAStarPass(ID, actual_dir)) + return TRUE + + var/reverse_dir = get_dir(destination_turf, src) + for(var/obj/iter_object in destination_turf) + if(!iter_object.CanAStarPass(ID, reverse_dir, caller)) + return TRUE + + return FALSE + +#undef CAN_STEP +#undef STEP_NOT_HERE_BUT_THERE diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm index 8819eb4d04fa4..a2cd14316cfea 100644 --- a/code/__HELPERS/priority_announce.dm +++ b/code/__HELPERS/priority_announce.dm @@ -1,8 +1,15 @@ -/proc/priority_announce(text, title = "", sound = 'sound/ai/attention.ogg', type , sender_override) +#define DEFAULT_ALERT "alert_sound" + +/proc/priority_announce(text, title = "", sound = DEFAULT_ALERT, type, sender_override, has_important_message, auth_id) if(!text) return - var/announcement + var/announcement = "" + if(sound == DEFAULT_ALERT) + sound = SSstation.announcer.get_rand_alert_sound() + + if(sound && SSstation.announcer.event_sounds[sound]) + sound = SSstation.announcer.event_sounds[sound] if(type == "Priority") announcement += "

Priority Announcement

" @@ -10,7 +17,7 @@ announcement += "

[html_encode(title)]

" else if(type == "Captain") announcement += "

Captain Announces

" - GLOB.news_network.SubmitArticle(text, "Captain's Announcement", "Station Announcements", null) + GLOB.news_network.SubmitArticle(html_encode(text), "Captain's Announcement", "Station Announcements", null) else if(!sender_override) @@ -26,8 +33,14 @@ else GLOB.news_network.SubmitArticle(title + "

" + text, "Central Command", "Station Announcements", null) - announcement += "
[html_encode(text)]
" + ///If the announcer overrides alert messages, use that message. + if(SSstation.announcer.custom_alert_message && !has_important_message) + announcement += SSstation.announcer.custom_alert_message + else + announcement += "
[html_encode(text)]
" announcement += "
" + if(auth_id) + announcement += "-[auth_id]
" var/s = sound(sound) for(var/mob/M in GLOB.player_list) @@ -36,28 +49,50 @@ if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS) SEND_SOUND(M, s) +/proc/exploration_announce(text, z_value) + var/announcement = "" + announcement += "

[command_name()] Update

" + announcement += "
[html_encode(text)]
" + announcement += "
" + + for(var/mob/M in GLOB.player_list) + if(isliving(M)) + var/turf/T = get_turf(M) + if(istype(get_area(M), /area/shuttle/exploration) || T.z == z_value) + to_chat(M, announcement) + if(isobserver(M)) + to_chat(M, announcement) + /proc/print_command_report(text = "", title = null, announce=TRUE) if(!title) title = "Classified [command_name()] Update" if(announce) - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') - + priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", SSstation.announcer.get_rand_report_sound(), has_important_message = TRUE) var/datum/comm_message/M = new M.title = title M.content = text SScommunications.send_message(M) -/proc/minor_announce(message, title = "Attention:", alert) +/proc/minor_announce(message, title = "Attention:", alert, from, html_encode = TRUE) if(!message) return + if (html_encode) + title = html_encode(title) + message = html_encode(message) + for(var/mob/M in GLOB.player_list) if(!isnewplayer(M) && M.can_hear()) - to_chat(M, "[html_encode(title)]
[html_encode(message)]

") + var/complete_msg = "[title]
[message]

" + if(from) + complete_msg += "-[from]" + to_chat(M, complete_msg) if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS) if(alert) SEND_SOUND(M, sound('sound/misc/notice1.ogg')) else SEND_SOUND(M, sound('sound/misc/notice2.ogg')) + +#undef DEFAULT_ALERT diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm index bab286bafef0f..bfe09ba370c84 100644 --- a/code/__HELPERS/pronouns.dm +++ b/code/__HELPERS/pronouns.dm @@ -203,62 +203,62 @@ /mob/living/carbon/human/p_they(capitalized, temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_their(capitalized, temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_them(capitalized, temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_have(temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_are(temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_were(temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_do(temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_s(temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_es(temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() diff --git a/code/__HELPERS/radiation.dm b/code/__HELPERS/radiation.dm index ce727e6da9d8b..42d30f8b69257 100644 --- a/code/__HELPERS/radiation.dm +++ b/code/__HELPERS/radiation.dm @@ -5,16 +5,20 @@ var/static/list/ignored_things = typecacheof(list( /mob/dead, /mob/camera, + /mob/living/simple_animal/revenant, /obj/effect, /obj/docking_port, /atom/movable/lighting_object, /obj/item/projectile, + /obj/structure/chisel_message )) var/list/processing_list = list(location) . = list() while(processing_list.len) var/atom/thing = processing_list[1] processing_list -= thing + if(thing == null) + continue if(ignored_things[thing.type]) continue . += thing @@ -25,23 +29,23 @@ /proc/radiation_pulse(atom/source, intensity, range_modifier, log=FALSE, can_contaminate=TRUE) if(!SSradiation.can_fire) return - - if(intensity >= RAD_WAVE_MINIMUM) // Don't bother to spawn rad waves if they're just going to immediately go out - for(var/dir in GLOB.cardinals) - new /datum/radiation_wave(source, dir, intensity, range_modifier, can_contaminate) - - var/list/things = get_rad_contents(source) //copypasta because I don't want to put special code in waves to handle their origin + + var/list/things = get_rad_contents(isturf(source) ? source : get_turf(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) var/atom/thing = things[k] if(!thing) 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)] ") + if(intensity >= RAD_WAVE_MINIMUM) // Don't bother to spawn rad waves if they're just going to immediately go out + new /datum/radiation_wave(source, 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 + 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)] ") + return TRUE diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 060a5b37aac4a..33dbd59028e20 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -6,73 +6,91 @@ gather_antag_data() record_nuke_disk_location() var/json_file = file("[GLOB.log_directory]/round_end_data.json") + // All but npcs sublists and ghost category contain only mobs with minds var/list/file_data = list("escapees" = list("humans" = list(), "silicons" = list(), "others" = list(), "npcs" = list()), "abandoned" = list("humans" = list(), "silicons" = list(), "others" = list(), "npcs" = list()), "ghosts" = list(), "additional data" = list()) - var/num_survivors = 0 - var/num_escapees = 0 - var/num_shuttle_escapees = 0 + var/num_survivors = 0 //Count of non-brain non-camera mobs with mind that are alive + var/num_escapees = 0 //Above and on centcom z + var/num_shuttle_escapees = 0 //Above and on escape shuttle var/list/area/shuttle_areas if(SSshuttle?.emergency) shuttle_areas = SSshuttle.emergency.shuttle_areas - for(var/mob/m in GLOB.mob_list) - var/escaped - var/category + + for(var/mob/M in GLOB.mob_list) var/list/mob_data = list() - if(isnewplayer(m)) + if(isnewplayer(M)) continue - if(m.mind) - if(m.stat != DEAD && !isbrain(m) && !iscameramob(m)) + + var/escape_status = "abandoned" //default to abandoned + var/category = "npcs" //Default to simple count only bracket + var/count_only = TRUE //Count by name only or full info + + mob_data["name"] = M.name + if(M.mind) + count_only = FALSE + mob_data["ckey"] = M.mind.key + if(M.stat != DEAD && !isbrain(M) && !iscameramob(M)) num_survivors++ - mob_data += list("name" = m.name, "ckey" = ckey(m.mind.key)) - if(isobserver(m)) - escaped = "ghosts" - else if(isliving(m)) - var/mob/living/L = m - mob_data += list("location" = get_area(L), "health" = L.health) + if(EMERGENCY_ESCAPED_OR_ENDGAMED && (M.onCentCom() || M.onSyndieBase())) + num_escapees++ + escape_status = "escapees" + if(shuttle_areas[get_area(M)]) + num_shuttle_escapees++ + if(isliving(M)) + var/mob/living/L = M + mob_data["location"] = get_area(L) + mob_data["health"] = L.health if(ishuman(L)) var/mob/living/carbon/human/H = L category = "humans" - mob_data += list("job" = H.mind.assigned_role, "species" = H.dna.species.name) + if(H.mind) + mob_data["job"] = H.mind.assigned_role + else + mob_data["job"] = "Unknown" + mob_data["species"] = H.dna.species.name else if(issilicon(L)) category = "silicons" if(isAI(L)) - mob_data += list("module" = "AI") - if(isAI(L)) - mob_data += list("module" = "pAI") - if(iscyborg(L)) + mob_data["module"] = "AI" + else if(ispAI(L)) + mob_data["module"] = "pAI" + else if(iscyborg(L)) var/mob/living/silicon/robot/R = L - mob_data += list("module" = R.module) - else - category = "others" - mob_data += list("typepath" = m.type) - if(!escaped) - if(EMERGENCY_ESCAPED_OR_ENDGAMED && (m.onCentCom() || m.onSyndieBase())) - escaped = "escapees" - num_escapees++ - if(shuttle_areas[get_area(m)]) - num_shuttle_escapees++ - else - escaped = "abandoned" - if(!m.mind && (!ishuman(m) || !issilicon(m))) - var/list/npc_nest = file_data["[escaped]"]["npcs"] - if(npc_nest.Find(initial(m.name))) - file_data["[escaped]"]["npcs"]["[initial(m.name)]"] += 1 + mob_data["module"] = R.module.name + else + category = "others" + mob_data["typepath"] = M.type + //Ghosts don't care about minds, but we want to retain ckey data etc + if(isobserver(M)) + count_only = FALSE + escape_status = "ghosts" + if(!M.mind) + mob_data["ckey"] = M.key + category = null //ghosts are one list deep + //All other mindless stuff just gets counts by name + if(count_only) + var/list/npc_nest = file_data["[escape_status]"]["npcs"] + var/name_to_use = initial(M.name) + if(ishuman(M)) + name_to_use = "Unknown Human" //Monkeymen and other mindless corpses + if(npc_nest.Find(name_to_use)) + file_data["[escape_status]"]["npcs"][name_to_use] += 1 else - file_data["[escaped]"]["npcs"]["[initial(m.name)]"] = 1 + file_data["[escape_status]"]["npcs"][name_to_use] = 1 else - if(isobserver(m)) - var/pos = length(file_data["[escaped]"]) + 1 - file_data["[escaped]"]["[pos]"] = mob_data + //Mobs with minds and ghosts get detailed data + if(category) + var/pos = length(file_data["[escape_status]"]["[category]"]) + 1 + file_data["[escape_status]"]["[category]"]["[pos]"] = mob_data else - if(!category) - category = "others" - mob_data += list("name" = m.name, "typepath" = m.type) - var/pos = length(file_data["[escaped]"]["[category]"]) + 1 - file_data["[escaped]"]["[category]"]["[pos]"] = mob_data + var/pos = length(file_data["[escape_status]"]) + 1 + file_data["[escape_status]"]["[pos]"] = mob_data + var/datum/station_state/end_state = new /datum/station_state() end_state.count() var/station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100) file_data["additional data"]["station integrity"] = station_integrity WRITE_FILE(json_file, json_encode(file_data)) + SSblackbox.record_feedback("nested tally", "round_end_stats", num_survivors, list("survivors", "total")) SSblackbox.record_feedback("nested tally", "round_end_stats", num_escapees, list("escapees", "total")) SSblackbox.record_feedback("nested tally", "round_end_stats", GLOB.joined_player_list.len, list("players", "total")) @@ -193,21 +211,24 @@ for(var/client/C in GLOB.clients) if(C) - C.playtitlemusic(40) - C.process_endround_metacoin() + C?.process_endround_metacoin() + C?.playtitlemusic(40) if(CONFIG_GET(flag/allow_crew_objectives)) - var/mob/M = C.mob + var/mob/M = C?.mob if(M?.mind?.current && LAZYLEN(M.mind.crew_objectives)) for(var/datum/objective/crew/CO in M.mind.crew_objectives) + if(!C) //Yes, the client can be null here. BYOND moment. + break if(CO.check_completion()) - C.inc_metabalance(METACOIN_CO_REWARD, reason="Completed your crew objective!") + C?.inc_metabalance(METACOIN_CO_REWARD, reason="Completed your crew objective!") break to_chat(world, "


The round has ended.") log_game("The round has ended.") + SSstat.send_global_alert("Round Over", "The round has ended, the game will restart soon.") if(LAZYLEN(GLOB.round_end_notifiees)) - send2irc("Notice", "[GLOB.round_end_notifiees.Join(", ")] the round has ended.") + send2tgs("Notice", "[GLOB.round_end_notifiees.Join(", ")] the round has ended.") RollCredits() @@ -227,7 +248,7 @@ //Set news report and mode result mode.set_round_result() - send2irc("Server", "Round just ended.") + send2tgs("Server", "Round just ended.") if(length(CONFIG_GET(keyed_list/cross_server))) send_news_report() @@ -333,10 +354,10 @@ if(istype(SSticker.mode, /datum/game_mode/dynamic)) var/datum/game_mode/dynamic/mode = SSticker.mode parts += "[FOURSPACES]Threat level: [mode.threat_level]" - parts += "[FOURSPACES]Threat left: [mode.threat]" //yes + parts += "[FOURSPACES]Threat left: [mode.mid_round_budget]" parts += "[FOURSPACES]Executed rules:" for(var/datum/dynamic_ruleset/rule in mode.executed_rules) - parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - [rule.name]: -[rule.cost] threat" + parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - [rule.name]: -[rule.cost + rule.scaled_times * rule.scaling_cost] threat" return parts.Join("
") /client/proc/roundend_report_file() @@ -351,7 +372,7 @@ if(!previous) var/list/report_parts = list(personal_report(C), GLOB.common_report) content = report_parts.Join() - C.verbs -= /client/proc/show_previous_roundend_report + C.remove_verb(/client/proc/show_previous_roundend_report) fdel(filename) rustg_file_append(content, filename) else @@ -425,12 +446,11 @@ if (aiPlayer.connected_robots.len) var/borg_num = aiPlayer.connected_robots.len - var/robolist = "
[aiPlayer.real_name]'s minions were: " + parts += "
[aiPlayer.real_name]'s minions were:" for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots) borg_num-- if(robo.mind) - robolist += "[robo.name] (Played by: [robo.mind.key])[robo.stat == DEAD ? " (Deactivated)" : ""][borg_num ?", ":""]
" - parts += "[robolist]" + parts += "[robo.name] (Played by: [robo.mind.key])[robo.stat == DEAD ? " (Deactivated)" : ""][borg_num ?", ":""]" if(!borg_spacer) borg_spacer = TRUE @@ -666,6 +686,13 @@ discordmsg += "Escapees: [escapees]\n" discordmsg += "Integrity: [integrity]\n" discordmsg += "Gamemode: [SSticker.mode.name]\n" + if(istype(SSticker.mode, /datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/mode = SSticker.mode + discordmsg += "Threat level: [mode.threat_level]\n" + discordmsg += "Threat left: [mode.mid_round_budget]\n" + discordmsg += "Executed rules:\n" + for(var/datum/dynamic_ruleset/rule in mode.executed_rules) + discordmsg += "[rule.ruletype] - [rule.name]: -[rule.cost + rule.scaled_times * rule.scaling_cost] threat\n" discordsendmsg("ooc", discordmsg) discordmsg = "" var/list/ded = SSblackbox.first_death diff --git a/code/__HELPERS/stat_helpers.dm b/code/__HELPERS/stat_helpers.dm new file mode 100644 index 0000000000000..d9762f09181ca --- /dev/null +++ b/code/__HELPERS/stat_helpers.dm @@ -0,0 +1,4 @@ + +#define GENERATE_STAT_TEXT(text_value) list(text=text_value,type=STAT_TEXT) + +#define GENERATE_STAT_DIVIDER (list(type=STAT_DIVIDER)) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 5458bcc8b6ae1..f9fbcfcccbd4f 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -113,6 +113,7 @@ /// Used to get a properly sanitized (html encoded) input, of max_length. no_trim is self explanatory but it prevents the input from being trimed if you intend to parse newlines or whitespace. /proc/stripped_input(mob/user, message = "", title = "", default = "", max_length=MAX_MESSAGE_LEN, no_trim=FALSE) var/name = input(user, message, title, default) as text|null + if(no_trim) return copytext(html_encode(name), 1, max_length) else @@ -328,10 +329,8 @@ new_text = letter + new_text return new_text -GLOBAL_LIST_INIT(zero_character_only, list("0")) GLOBAL_LIST_INIT(hex_characters, list("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f")) GLOBAL_LIST_INIT(alphabet, list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")) -GLOBAL_LIST_INIT(binary, list("0","1")) /// Returns a random string of `length` length and made up of chars from `characters` /proc/random_string(length, list/characters) @@ -667,7 +666,7 @@ GLOBAL_LIST_INIT(binary, list("0","1")) if(fexists(log)) oldjson = json_decode(rustg_file_read(log)) oldentries = oldjson["data"] - if(!isemptylist(oldentries)) + if(length(oldentries)) for(var/string in accepted) for(var/old in oldentries) if(string == old) @@ -677,7 +676,7 @@ GLOBAL_LIST_INIT(binary, list("0","1")) var/list/finalized = list() finalized = accepted.Copy() + oldentries.Copy() //we keep old and unreferenced phrases near the bottom for culling listclearnulls(finalized) - if(!isemptylist(finalized) && length(finalized) > storemax) + if(length(finalized) && (length(finalized) > storemax)) finalized.Cut(storemax + 1) fdel(log) @@ -825,3 +824,25 @@ GLOBAL_LIST_INIT(binary, list("0","1")) #define is_alpha(X) ((text2ascii(X) <= 122) && (text2ascii(X) >= 97)) #define is_digit(X) ((length(X) == 1) && (length(text2num(X)) == 1)) + +/// Slightly expensive proc to scramble a message using equal probabilities of character replacement from a list. DOES NOT SUPPORT HTML! +/proc/scramble_message_replace_chars(original, replaceprob = 25, list/replacementchars = list("$", "@", "!", "#", "%", "^", "&", "*"), replace_letters_only = FALSE, replace_whitespace = FALSE) + var/list/out = list() + var/static/list/whitespace = list(" ", "\n", "\t") + for(var/i in 1 to length(original)) + var/char = original[i] + if(!replace_whitespace && (char in whitespace)) + out += char + continue + if(replace_letters_only && (!ISINRANGE(char, 65, 90) && !ISINRANGE(char, 97, 122))) + out += char + continue + out += prob(replaceprob) ? pick(replacementchars) : char + return out.Join("") + +/proc/num2loadingbar(percent as num, numSquares = 20, reverse = FALSE) + var/loadstring = "" + var/limit = reverse ? numSquares - percent*numSquares : percent*numSquares + for (var/i in 1 to numSquares) + loadstring += i <= limit ? "â–ˆ" : "â–‘" + return "\[[loadstring]\]" diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 0325af4a31273..f477c35dca416 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -11,15 +11,15 @@ /proc/gameTimestamp(format = "hh:mm:ss", wtime=null) if(!wtime) wtime = world.time - return time2text(wtime - GLOB.timezoneOffset, format) + return time2text(wtime, format, 0) /// Returns the station time in deciseconds /proc/station_time(display_only = FALSE, wtime=world.time) - return ((((wtime - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - (display_only? GLOB.timezoneOffset : 0) + return (((wtime - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000 /// Returns the station time in hh:mm:ss /proc/station_time_timestamp(format = "hh:mm:ss", wtime) - return time2text(station_time(TRUE, wtime), format) + return time2text(station_time(TRUE, wtime), format, 0) /proc/station_time_debug(force_set) if(isnum_safe(force_set)) @@ -48,7 +48,8 @@ GLOBAL_VAR_INIT(midnight_rollovers, 0) GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) /proc/update_midnight_rollover() if (world.timeofday < GLOB.rollovercheck_last_timeofday) //TIME IS GOING BACKWARDS! - return GLOB.midnight_rollovers++ + GLOB.midnight_rollovers++ + GLOB.rollovercheck_last_timeofday = world.timeofday return GLOB.midnight_rollovers /// Returns which week of the month we are in @@ -93,3 +94,8 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) if(hour) hourT = " and [hour] hour[(hour != 1)? "s":""]" return "[day] day[(day != 1)? "s":""][hourT][minuteT][secondT]" + + +/// Returns the time in an ISO-8601 friendly format. Used when dumping data into external services such as ElasticSearch +/proc/iso_timestamp(timevar) + return time2text(timevar || world.timeofday, "YYYY-MM-DDThh:mm:ss") diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 05844833c8da7..b2ab4f83ac4f2 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -168,6 +168,8 @@ . += "[seperator]AUTOLOGIN" if(rights & R_DBRANKS) . += "[seperator]DBRANKS" + if(rights & R_SUPPRESS) + . += "[seperator]SUPPRESS" if(!.) . = "NONE" return . @@ -341,25 +343,25 @@ /// Returns the body_zone a given slot appears on /proc/slot2body_zone(slot) switch(slot) - if(SLOT_BACK, SLOT_WEAR_SUIT, SLOT_W_UNIFORM, SLOT_BELT, SLOT_WEAR_ID) + if(ITEM_SLOT_BACK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_ICLOTHING, ITEM_SLOT_BELT, ITEM_SLOT_ID) return BODY_ZONE_CHEST - if(SLOT_GLOVES, SLOT_HANDS, SLOT_HANDCUFFED) + if(ITEM_SLOT_GLOVES, ITEM_SLOT_HANDS, ITEM_SLOT_HANDCUFFED) return pick(BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND) - if(SLOT_HEAD, SLOT_NECK, SLOT_NECK, SLOT_EARS) + if(ITEM_SLOT_HEAD, ITEM_SLOT_NECK, ITEM_SLOT_NECK, ITEM_SLOT_EARS) return BODY_ZONE_HEAD - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) return BODY_ZONE_PRECISE_MOUTH - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) return BODY_ZONE_PRECISE_EYES - if(SLOT_SHOES) + if(ITEM_SLOT_FEET) return pick(BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT) - if(SLOT_LEGCUFFED) + if(ITEM_SLOT_LEGCUFFED) return pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) /// adapted from http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/ diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index acbd3cc2972b6..d733e4c5452f8 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -43,10 +43,13 @@ 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) +/proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = FALSE, closed = FALSE, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0) /* -Location where the teleport begins, target that will teleport, distance to go, density checking 0/1(yes/no). +Location where the teleport begins, target that will teleport, distance to go, density checking 0/1(yes/no), closed turf checking. Random error in tile placement x, error in tile placement y, and block offset. Block offset tells the proc how to place the box. Behind teleport location, relative to starting location, forward, etc. Negative values for offset are accepted, think of it in relation to North, -x is west, -y is south. Error defaults to positive. @@ -121,6 +124,8 @@ Turf and target are separate in case you want to teleport some distance from a t for(var/turf/T in block(locate(center.x+b1xerror,center.y+b1yerror,location.z), locate(center.x+b2xerror,center.y+b2yerror,location.z) )) if(density&&T.density) continue//If density was specified. + if(closed&&isclosedturf(T)) + continue//If closed was specified. if(T.x>world.maxx || T.x<1) continue//Don't want them to teleport off the map. if(T.y>world.maxy || T.y<1) @@ -381,14 +386,6 @@ Turf and target are separate in case you want to teleport some distance from a t // means that one unit is 1 kJ. return DisplayJoules(units * SSmachines.wait * 0.1 / GLOB.CELLRATE) -/proc/get_mob_by_ckey(key) - if(!key) - return - var/list/mobs = sortmobs() - for(var/mob/M in mobs) - if(M.ckey == key) - return M - //Returns the atom sitting on the turf. //For example, using this on a disk, which is in a bag, on a mob, will return the mob because it's on the turf. //Optional arg 'type' to stop once it reaches a specific type instead of a turf. @@ -400,6 +397,17 @@ 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 (except the area) the movable is within. +/proc/get_nested_locs(atom/movable/AM, include_turf = FALSE) + . = list() + var/atom/location = AM.loc + var/turf/turf = get_turf(AM) + while(location && location != turf) + . += location + location = location.loc + if(location && include_turf) //At this point, only the turf is left, provided it exists. + . += location + /// 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) var/turf/target = locate(A.x, A.y, A.z) @@ -447,7 +455,7 @@ Turf and target are separate in case you want to teleport some distance from a t return locate(x,y,A.z) /// Gets all contents of contents and returns them all in a list. -/atom/proc/GetAllContents(var/T) +/atom/proc/GetAllContents(var/T, ignore_flag_1) var/list/processing_list = list(src) var/list/assembled = list() if(T) @@ -463,7 +471,8 @@ Turf and target are separate in case you want to teleport some distance from a t while(processing_list.len) var/atom/A = processing_list[1] processing_list.Cut(1, 2) - processing_list += A.contents + if(!(A.flags_1 & ignore_flag_1)) + processing_list += A.contents assembled += A return assembled @@ -588,7 +597,7 @@ Takes: Area type as text string or as typepath OR an instance of the area. Returns: A list of all areas of that type in the world. */ -/proc/get_areas(areatype, subtypes=TRUE) +/proc/get_areas(areatype, target_z = 0, subtypes=TRUE) if(istext(areatype)) areatype = text2path(areatype) else if(isarea(areatype)) @@ -599,16 +608,15 @@ Returns: A list of all areas of that type in the world. var/list/areas = list() if(subtypes) - var/list/cache = typecacheof(areatype) - for(var/V in GLOB.sortedAreas) - var/area/A = V - if(cache[A.type]) - areas += V + for(var/area/A as() in GLOB.sortedAreas) + if(istype(A, areatype)) + if(target_z == 0 || A.z == target_z) + areas += A else - for(var/V in GLOB.sortedAreas) - var/area/A = V + for(var/area/A as() in GLOB.sortedAreas) if(A.type == areatype) - areas += V + if(target_z == 0 || A.z == target_z) + areas += A return areas /** @@ -627,17 +635,14 @@ Returns: A list of all turfs in areas of that type of that type in the world. var/list/turfs = list() if(subtypes) - var/list/cache = typecacheof(areatype) - for(var/V in GLOB.sortedAreas) - var/area/A = V - if(!cache[A.type]) + for(var/area/A as() in GLOB.sortedAreas) + if(!istype(A, areatype)) continue for(var/turf/T in A) if(target_z == 0 || target_z == T.z) turfs += T else - for(var/V in GLOB.sortedAreas) - var/area/A = V + for(var/area/A as() in GLOB.sortedAreas) if(A.type != areatype) continue for(var/turf/T in A) @@ -755,22 +760,6 @@ of course mathematically this is just adding `world.icon_size` on again 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))) - -/proc/can_embed(obj/item/W) - if(W.is_sharp()) - return 1 - if(is_pointed(W)) - return 1 - - if(is_type_in_typecache(W, GLOB.can_embed_types)) - return 1 - - /* Checks if that loc and dir has an item on the wall */ @@ -991,8 +980,7 @@ eg2: `center_image(I, 96,96)` if(orange) turfs -= get_turf(center) . = list() - for(var/V in turfs) - var/turf/T = V + for(var/turf/T as() in turfs) . += T . += T.contents if(areas) @@ -1128,26 +1116,30 @@ eg2: `center_image(I, 96,96)` /proc/get_random_station_turf() return safepick(get_area_turfs(pick(GLOB.the_station_areas))) -/proc/get_safe_random_station_turf() - 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] - if(!T.density) - 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 - +///Gets random safe - which mean clear of dense objects and valid, turf from provided areas that are on station +///Amount 1 makes it return turf, anything else a list of turfs +/proc/get_safe_random_station_turfs(list/areas_to_pick_from = GLOB.the_station_areas, amount = 1) + var/list/picked_turfs = list() + var/list/L + for(var/area/A as() in areas_to_pick_from) + L += get_area_turfs(A) + while(L.len && length(picked_turfs) <= amount) + var/I = rand(1, length(L)) + var/turf/T = L[I] + var/area/X = get_area(T) + if(!T.density && (X.area_flags & VALID_TERRITORY)) + var/clear = TRUE + for(var/obj/O in T) + if(O.density) + clear = FALSE + break + if(clear) + picked_turfs |= T + L.Cut(I,I+1) + CHECK_TICK + if(amount == 1) + return picked_turfs[1] + return picked_turfs /proc/get_closest_atom(type, list, source) var/closest_atom @@ -1166,7 +1158,7 @@ eg2: `center_image(I, 96,96)` return closest_atom -proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) +/proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) if (value == FALSE) //nothing should be calling us with a number, so this is safe value = input("Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text if (isnull(value)) @@ -1283,7 +1275,7 @@ Increases delay as the server gets more overloaded, as sleeps aren't cheap and s GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) /// Version of view() which ignores darkness, because BYOND doesn't have it (I actually suggested it but it was tagged redundant, BUT HEARERS IS A T- /rant). -/proc/dview(var/range = world.view, var/center, var/invis_flags = 0) +/proc/dview(range = world.view, center, invis_flags = 0) if(!center) return @@ -1602,3 +1594,13 @@ config_setting should be one of the following: /proc/get_final_z(atom/A) var/turf/T = get_turf(A) return T ? T.z : A.z + +/proc/invertDir(var/input_dir) + switch(input_dir) + if(UP) + return DOWN + if(DOWN) + return UP + if(-INFINITY to 0, 11 to INFINITY) + CRASH("Can't turn invalid directions!") + return turn(input_dir, 180) diff --git a/code/__HELPERS/view.dm b/code/__HELPERS/view.dm index ab39b2fb57161..c2cb59a42b7a2 100644 --- a/code/__HELPERS/view.dm +++ b/code/__HELPERS/view.dm @@ -11,6 +11,10 @@ viewY = text2num(viewrangelist[2]) + extra_y return list(viewX, viewY) +/proc/getexpandedview(view, extra_x = 0, extra_y = 0) + var/list/output = getviewsize(view, extra_x, extra_y) + return "[output[1]]x[output[2]]" + /proc/in_view_range(mob/user, atom/A) var/list/view_range = getviewsize(user.client.view) var/turf/source = get_turf(user) diff --git a/code/__HELPERS/virtual_z_level.dm b/code/__HELPERS/virtual_z_level.dm new file mode 100644 index 0000000000000..7bdcbc59f5fe1 --- /dev/null +++ b/code/__HELPERS/virtual_z_level.dm @@ -0,0 +1,22 @@ + +/** + * Gets a unique value for a new virtual z level. + * This is just a number, the game wont slow down if you have a ton of empty ones. + */ +/proc/get_new_virtual_z() + var/static/virtual_value = VIRTUAL_Z_START + return virtual_value ++ + +/** + * Used to get the virtual z-level. + * Will give unique values to each shuttle while it is in a transit level. + * Note: If the user teleports to another virtual z on the same z-level they will need to have reset_virtual_z called. (Teleportations etc.) + */ +/atom/proc/get_virtual_z_level() + var/turf/T = get_turf(src) + if(!T) + return 0 + var/area/A = T.loc + if(!A) + return 0 + return A.get_virtual_z(T) diff --git a/code/__HELPERS/weakref.dm b/code/__HELPERS/weakref.dm new file mode 100644 index 0000000000000..24ebeffa9379b --- /dev/null +++ b/code/__HELPERS/weakref.dm @@ -0,0 +1,2 @@ +/// Checks if potential_weakref is a weakref of thing. +#define IS_WEAKREF_OF(thing, potential_weakref) (istype(thing, /datum) && !isnull(potential_weakref) && thing.weak_reference == potential_weakref) \ No newline at end of file diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 889e056751b60..9e10e24217443 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -11,16 +11,26 @@ #ifdef TESTING #define DATUMVAR_DEBUGGING_MODE -//#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing. - //implies FIND_REF_NO_CHECK_TICK +///Method of tracking references. +//#define LEGACY_REFERENCE_TRACKING +#ifdef LEGACY_REFERENCE_TRACKING -//#define FIND_REF_NO_CHECK_TICK //Sets world.loop_checks to false and prevents find references from sleeping +///Should we be logging our findings or not +#define REFERENCE_TRACKING_LOG + +///Use the legacy reference on things hard deleting by default. +//#define GC_FAILURE_HARD_LOOKUP +#ifdef GC_FAILURE_HARD_LOOKUP +#define FIND_REF_NO_CHECK_TICK +#endif //ifdef GC_FAILURE_HARD_LOOKUP + +#endif //ifdef LEGACY_REFERENCE_TRACKING //#define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green -#endif +#endif //ifdef TESTING -//#define UNIT_TESTS //Enables unit tests via TEST_RUN_PARAMETER +//#define UNIT_TESTS //If this is uncommented, we do a single run though of the game setup and tear down process with unit tests in between #ifndef PRELOAD_RSC //set to: #define PRELOAD_RSC 0 // 0 to allow using external resources or on-demand behaviour; @@ -32,29 +42,59 @@ #endif //Update this whenever you need to take advantage of more recent byond features -#define MIN_COMPILER_VERSION 513 -#define MIN_COMPILER_BUILD 1514 -#if DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD +#define MIN_COMPILER_VERSION 514 +#define MIN_COMPILER_BUILD 1568 +//TODO Remove the SDMM check when it supports 1568 +#if !defined(SPACEMAN_DMM) && (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 513.1514 or higher +#error You need version 514.1568 or higher. #endif +//Update this whenever the byond version is stable so people stop updating to hilariously broken versions +#define MAX_COMPILER_VERSION 514 +#define MAX_COMPILER_BUILD 1568 +#if DM_VERSION > MAX_COMPILER_VERSION || DM_BUILD > MAX_COMPILER_BUILD +#warn WARNING: Your BYOND version is over the recommended version (514.1568)! Stability is not guaranteed. +#endif +//Log the full sendmaps profile on 514.1556+, any earlier and we get bugs or it not existing +#if DM_VERSION >= 514 && DM_BUILD >= 1556 +#define SENDMAPS_PROFILE +#endif + + //Additional code for the above flags. #ifdef TESTING #warn compiling in TESTING mode. testing() debug messages will be visible. #endif -#ifdef GC_FAILURE_HARD_LOOKUP -#define FIND_REF_NO_CHECK_TICK -#endif - -#ifdef TRAVISBUILDING +#ifdef CIBUILDING #define UNIT_TESTS #endif -#ifdef TRAVISTESTING +#ifdef CITESTING #define TESTING #endif -#define EXTOOLS (world.system_type == MS_WINDOWS ? "byond-extools.dll" : "libbyond-extools.so") +#ifdef TGS +// TGS performs its own build of dm.exe, but includes a prepended TGS define. +#define CBT +#endif + +#if !defined(CBT) && !defined(SPACEMAN_DMM) +#warn Building with Dream Maker is no longer supported and will result in errors. +#warn In order to build, run BUILD.bat in the root directory. +#warn Consider switching to VSCode editor instead, where you can press Ctrl+Shift+B to build. +#endif + +#define AUXMOS (world.system_type == MS_WINDOWS ? "auxtools/auxmos.dll" : __detect_auxmos()) + +/proc/__detect_auxmos() + if (fexists("./libauxmos.so")) + return "./libauxmos.so" + else if (fexists("./auxtools/libauxmos.so")) + return "./auxtools/libauxmos.so" + else if (fexists("[world.GetConfig("env", "HOME")]/.byond/bin/libauxmos.so")) + return "[world.GetConfig("env", "HOME")]/.byond/bin/libauxmos.so" + else + CRASH("Could not find libauxmos.so") diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 44a76af56a3e6..da5481ffe41f6 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -1,195 +1,253 @@ -GLOBAL_LIST_INIT(bitfields, list( - "appearance_flags" = list( - "LONG_GLIDE" = LONG_GLIDE, - "RESET_COLOR" = RESET_COLOR, - "RESET_ALPHA" = RESET_ALPHA, - "RESET_TRANSFORM" = RESET_TRANSFORM, - "NO_CLIENT_COLOR" = NO_CLIENT_COLOR, - "KEEP_TOGETHER" = KEEP_TOGETHER, - "KEEP_APART" = KEEP_APART, - "PLANE_MASTER" = PLANE_MASTER, - "TILE_BOUND" = TILE_BOUND, - "PIXEL_SCALE" = PIXEL_SCALE - ), - "sight" = list( - "SEE_INFRA" = SEE_INFRA, - "SEE_SELF" = SEE_SELF, - "SEE_MOBS" = SEE_MOBS, - "SEE_OBJS" = SEE_OBJS, - "SEE_TURFS" = SEE_TURFS, - "SEE_PIXELS" = SEE_PIXELS, - "SEE_THRU" = SEE_THRU, - "SEE_BLACKNESS" = SEE_BLACKNESS, - "BLIND" = BLIND - ), - "obj_flags" = list( - "EMAGGED" = EMAGGED, - "IN_USE" = IN_USE, - "CAN_BE_HIT" = CAN_BE_HIT, - "BEING_SHOCKED" = BEING_SHOCKED, - "DANGEROUS_POSSESSION" = DANGEROUS_POSSESSION, - "ON_BLUEPRINTS" = ON_BLUEPRINTS, - "UNIQUE_RENAME" = UNIQUE_RENAME, - "USES_TGUI" = USES_TGUI, - "FROZEN" = FROZEN, - ), - "datum_flags" = list( - "DF_USE_TAG" = DF_USE_TAG, - "DF_VAR_EDITED" = DF_VAR_EDITED, - "DF_ISPROCESSING" = DF_ISPROCESSING, - ), - "item_flags" = list( - "BEING_REMOVED" = BEING_REMOVED, - "IN_INVENTORY" = IN_INVENTORY, - "FORCE_STRING_OVERRIDE" = FORCE_STRING_OVERRIDE, - "NEEDS_PERMIT" = NEEDS_PERMIT, - "SLOWS_WHILE_IN_HAND" = SLOWS_WHILE_IN_HAND, - "NO_MAT_REDEMPTION" = NO_MAT_REDEMPTION, - "DROPDEL" = DROPDEL, - "NOBLUDGEON" = NOBLUDGEON, - "ABSTRACT" = ABSTRACT, - "IN_STORAGE" = IN_STORAGE, - ), - "admin_flags" = list( - "BUILDMODE" = R_BUILD, - "ADMIN" = R_ADMIN, - "BAN" = R_BAN, - "FUN" = R_FUN, - "SERVER" = R_SERVER, - "DEBUG" = R_DEBUG, - "POSSESS" = R_POSSESS, - "PERMISSIONS" = R_PERMISSIONS, - "STEALTH" = R_STEALTH, - "POLL" = R_POLL, - "VAREDIT" = R_VAREDIT, - "SOUNDS" = R_SOUND, - "SPAWN" = R_SPAWN, - "AUTOLOGIN" = R_AUTOADMIN, - "DBRANKS" = R_DBRANKS - ), - "interaction_flags_atom" = list( - "INTERACT_ATOM_REQUIRES_ANCHORED" = INTERACT_ATOM_REQUIRES_ANCHORED, - "INTERACT_ATOM_ATTACK_HAND" = INTERACT_ATOM_ATTACK_HAND, - "INTERACT_ATOM_UI_INTERACT" = INTERACT_ATOM_UI_INTERACT, - "INTERACT_ATOM_REQUIRES_DEXTERITY" = INTERACT_ATOM_REQUIRES_DEXTERITY, - "INTERACT_ATOM_IGNORE_INCAPACITATED" = INTERACT_ATOM_IGNORE_INCAPACITATED, - "INTERACT_ATOM_IGNORE_RESTRAINED" = INTERACT_ATOM_IGNORE_RESTRAINED, - "INTERACT_ATOM_CHECK_GRAB" = INTERACT_ATOM_CHECK_GRAB, - "INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND" = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND, - "INTERACT_ATOM_NO_FINGERPRINT_INTERACT" = INTERACT_ATOM_NO_FINGERPRINT_INTERACT - ), - "interaction_flags_machine" = list( - "INTERACT_MACHINE_OPEN" = INTERACT_MACHINE_OPEN, - "INTERACT_MACHINE_OFFLINE" = INTERACT_MACHINE_OFFLINE, - "INTERACT_MACHINE_WIRES_IF_OPEN" = INTERACT_MACHINE_WIRES_IF_OPEN, - "INTERACT_MACHINE_ALLOW_SILICON" = INTERACT_MACHINE_ALLOW_SILICON, - "INTERACT_MACHINE_OPEN_SILICON" = INTERACT_MACHINE_OPEN_SILICON, - "INTERACT_MACHINE_REQUIRES_SILICON" = INTERACT_MACHINE_REQUIRES_SILICON, - "INTERACT_MACHINE_SET_MACHINE" = INTERACT_MACHINE_SET_MACHINE - ), - "interaction_flags_item" = list( - "INTERACT_ITEM_ATTACK_HAND_PICKUP" = INTERACT_ITEM_ATTACK_HAND_PICKUP, - ), - "pass_flags" = list( - "PASSTABLE" = PASSTABLE, - "PASSGLASS" = PASSGLASS, - "PASSGRILLE" = PASSGRILLE, - "PASSBLOB" = PASSBLOB, - "PASSMOB" = PASSMOB, - "PASSCLOSEDTURF" = PASSCLOSEDTURF, - "LETPASSTHROW" = LETPASSTHROW - ), - "movement_type" = list( - "GROUND" = GROUND, - "FLYING" = FLYING, - "VENTCRAWLING" = VENTCRAWLING, - "FLOATING" = FLOATING, - "UNSTOPPABLE" = UNSTOPPABLE - ), - "resistance_flags" = list( - "LAVA_PROOF" = LAVA_PROOF, - "FIRE_PROOF" = FIRE_PROOF, - "FLAMMABLE" = FLAMMABLE, - "ON_FIRE" = ON_FIRE, - "UNACIDABLE" = UNACIDABLE, - "ACID_PROOF" = ACID_PROOF, - "INDESTRUCTIBLE" = INDESTRUCTIBLE, - "FREEZE_PROOF" = FREEZE_PROOF - ), - "flags_1" = list( - "NOJAUNT_1" = NOJAUNT_1, - "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, - "CONDUCT_1" = CONDUCT_1, - "NO_LAVA_GEN_1" = NO_LAVA_GEN_1, - "NODECONSTRUCT_1" = NODECONSTRUCT_1, - "OVERLAY_QUEUED_1" = OVERLAY_QUEUED_1, - "ON_BORDER_1" = ON_BORDER_1, - "NO_RUINS_1" = NO_RUINS_1, - "PREVENT_CLICK_UNDER_1" = PREVENT_CLICK_UNDER_1, - "HOLOGRAM_1" = HOLOGRAM_1, - "TESLA_IGNORE_1" = TESLA_IGNORE_1, - "INITIALIZED_1" = INITIALIZED_1, - "ADMIN_SPAWNED_1" = ADMIN_SPAWNED_1, - ), - "clothing_flags" = list( - "LAVAPROTECT" = LAVAPROTECT, - "STOPSPRESSUREDAMAGE" = STOPSPRESSUREDAMAGE, - "BLOCK_GAS_SMOKE_EFFECT" = BLOCK_GAS_SMOKE_EFFECT, - "MASKINTERNALS" = MASKINTERNALS, - "NOSLIP" = NOSLIP, - "THICKMATERIAL" = THICKMATERIAL, - "VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE, - "VOICEBOX_DISABLED" = VOICEBOX_DISABLED, - "SHOWEROKAY" = SHOWEROKAY, - "SNUG_FIT" = SNUG_FIT, - "EFFECT_HAT" = EFFECT_HAT, - ), - "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, - ), - "smooth" = list( - "SMOOTH_TRUE" = SMOOTH_TRUE, - "SMOOTH_MORE" = SMOOTH_MORE, - "SMOOTH_DIAGONAL" = SMOOTH_DIAGONAL, - "SMOOTH_BORDER" = SMOOTH_BORDER, - "SMOOTH_QUEUED" = SMOOTH_QUEUED, - ), - "car_traits" = list( - "CAN_KIDNAP" = CAN_KIDNAP, - ), - "mobility_flags" = list( - "MOVE" = MOBILITY_MOVE, - "STAND" = MOBILITY_STAND, - "PICKUP" = MOBILITY_PICKUP, - "USE" = MOBILITY_USE, - "UI" = MOBILITY_UI, - "STORAGE" = MOBILITY_STORAGE, - "PULL" = MOBILITY_PULL, - ), - "rad_flags" = list( - "RAD_PROTECT_CONTENTS" = RAD_PROTECT_CONTENTS, - "RAD_NO_CONTAMINATE" = RAD_NO_CONTAMINATE, - ), - "disease_flags" = list( - "CURABLE" = CURABLE, - "CAN_CARRY" = CAN_CARRY, - "CAN_RESIST" = CAN_RESIST - ), - "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_HIDE" = VIS_HIDE, - "VIS_UNDERLAY" = VIS_UNDERLAY, - ) - )) +GLOBAL_LIST_INIT(bitfields, generate_bitfields()) + +/// Specifies a bitfield for smarter debugging +/datum/bitfield + /// The variable name that contains the bitfield + var/variable + + /// An associative list of the readable flag and its true value + var/list/flags + +/// Turns /datum/bitfield subtypes into a list for use in debugging +/proc/generate_bitfields() + var/list/bitfields = list() + for (var/_bitfield in subtypesof(/datum/bitfield)) + var/datum/bitfield/bitfield = new _bitfield + bitfields[bitfield.variable] = bitfield.flags + return bitfields + +DEFINE_BITFIELD(appearance_flags, list( + "LONG_GLIDE" = LONG_GLIDE, + "RESET_COLOR" = RESET_COLOR, + "RESET_ALPHA" = RESET_ALPHA, + "RESET_TRANSFORM" = RESET_TRANSFORM, + "NO_CLIENT_COLOR" = NO_CLIENT_COLOR, + "KEEP_TOGETHER" = KEEP_TOGETHER, + "KEEP_APART" = KEEP_APART, + "PLANE_MASTER" = PLANE_MASTER, + "TILE_BOUND" = TILE_BOUND, + "PIXEL_SCALE" = PIXEL_SCALE +)) + +DEFINE_BITFIELD(area_flags, list( + "VALID_TERRITORY" = VALID_TERRITORY, + "BLOBS_ALLOWED" = BLOBS_ALLOWED, + "CAVES_ALLOWED" = CAVES_ALLOWED, + "FLORA_ALLOWED" = FLORA_ALLOWED, + "MOB_SPAWN_ALLOWED" = MOB_SPAWN_ALLOWED, + "MEGAFAUNA_SPAWN_ALLOWED" = MEGAFAUNA_SPAWN_ALLOWED, + "HIDDEN_AREA" = HIDDEN_AREA, + "UNIQUE_AREA" = UNIQUE_AREA, + "BLOCK_SUICIDE" = BLOCK_SUICIDE, + "XENOBIOLOGY_COMPATIBLE" = XENOBIOLOGY_COMPATIBLE, +)) + +DEFINE_BITFIELD(sight, list( + "SEE_INFRA" = SEE_INFRA, + "SEE_SELF" = SEE_SELF, + "SEE_MOBS" = SEE_MOBS, + "SEE_OBJS" = SEE_OBJS, + "SEE_TURFS" = SEE_TURFS, + "SEE_PIXELS" = SEE_PIXELS, + "SEE_THRU" = SEE_THRU, + "SEE_BLACKNESS" = SEE_BLACKNESS, + "BLIND" = BLIND +)) + +DEFINE_BITFIELD(obj_flags, list( + "EMAGGED" = EMAGGED, + "IN_USE" = IN_USE, + "CAN_BE_HIT" = CAN_BE_HIT, + "BEING_SHOCKED" = BEING_SHOCKED, + "DANGEROUS_POSSESSION" = DANGEROUS_POSSESSION, + "ON_BLUEPRINTS" = ON_BLUEPRINTS, + "UNIQUE_RENAME" = UNIQUE_RENAME, + "USES_TGUI" = USES_TGUI, + "FROZEN" = FROZEN, +)) + +DEFINE_BITFIELD(datum_flags, list( + "DF_USE_TAG" = DF_USE_TAG, + "DF_VAR_EDITED" = DF_VAR_EDITED, + "DF_ISPROCESSING" = DF_ISPROCESSING, +)) + +DEFINE_BITFIELD(item_flags, list( + "BEING_REMOVED" = BEING_REMOVED, + "IN_INVENTORY" = IN_INVENTORY, + "FORCE_STRING_OVERRIDE" = FORCE_STRING_OVERRIDE, + "NEEDS_PERMIT" = NEEDS_PERMIT, + "SLOWS_WHILE_IN_HAND" = SLOWS_WHILE_IN_HAND, + "NO_MAT_REDEMPTION" = NO_MAT_REDEMPTION, + "DROPDEL" = DROPDEL, + "NOBLUDGEON" = NOBLUDGEON, + "ABSTRACT" = ABSTRACT, + "IN_STORAGE" = IN_STORAGE, + "ILLEGAL" = ILLEGAL, +)) + +DEFINE_BITFIELD(admin_flags, list( + "BUILDMODE" = R_BUILD, + "ADMIN" = R_ADMIN, + "BAN" = R_BAN, + "FUN" = R_FUN, + "SERVER" = R_SERVER, + "DEBUG" = R_DEBUG, + "POSSESS" = R_POSSESS, + "PERMISSIONS" = R_PERMISSIONS, + "STEALTH" = R_STEALTH, + "POLL" = R_POLL, + "VAREDIT" = R_VAREDIT, + "SOUNDS" = R_SOUND, + "SPAWN" = R_SPAWN, + "AUTOLOGIN" = R_AUTOADMIN, + "DBRANKS" = R_DBRANKS, + "SUPPRESS" = R_SUPPRESS +)) + +DEFINE_BITFIELD(interaction_flags_atom, list( + "INTERACT_ATOM_REQUIRES_ANCHORED" = INTERACT_ATOM_REQUIRES_ANCHORED, + "INTERACT_ATOM_ATTACK_HAND" = INTERACT_ATOM_ATTACK_HAND, + "INTERACT_ATOM_UI_INTERACT" = INTERACT_ATOM_UI_INTERACT, + "INTERACT_ATOM_REQUIRES_DEXTERITY" = INTERACT_ATOM_REQUIRES_DEXTERITY, + "INTERACT_ATOM_IGNORE_INCAPACITATED" = INTERACT_ATOM_IGNORE_INCAPACITATED, + "INTERACT_ATOM_IGNORE_RESTRAINED" = INTERACT_ATOM_IGNORE_RESTRAINED, + "INTERACT_ATOM_CHECK_GRAB" = INTERACT_ATOM_CHECK_GRAB, + "INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND" = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND, + "INTERACT_ATOM_NO_FINGERPRINT_INTERACT" = INTERACT_ATOM_NO_FINGERPRINT_INTERACT +)) + +DEFINE_BITFIELD(interaction_flags_machine, list( + "INTERACT_MACHINE_OPEN" = INTERACT_MACHINE_OPEN, + "INTERACT_MACHINE_OFFLINE" = INTERACT_MACHINE_OFFLINE, + "INTERACT_MACHINE_WIRES_IF_OPEN" = INTERACT_MACHINE_WIRES_IF_OPEN, + "INTERACT_MACHINE_ALLOW_SILICON" = INTERACT_MACHINE_ALLOW_SILICON, + "INTERACT_MACHINE_OPEN_SILICON" = INTERACT_MACHINE_OPEN_SILICON, + "INTERACT_MACHINE_REQUIRES_SILICON" = INTERACT_MACHINE_REQUIRES_SILICON, + "INTERACT_MACHINE_SET_MACHINE" = INTERACT_MACHINE_SET_MACHINE +)) + +DEFINE_BITFIELD(interaction_flags_item, list( + "INTERACT_ITEM_ATTACK_HAND_PICKUP" = INTERACT_ITEM_ATTACK_HAND_PICKUP, +)) + +DEFINE_BITFIELD(pass_flags, list( + "PASSTABLE" = PASSTABLE, + "PASSGLASS" = PASSGLASS, + "PASSGRILLE" = PASSGRILLE, + "PASSBLOB" = PASSBLOB, + "PASSMOB" = PASSMOB, + "PASSCLOSEDTURF" = PASSCLOSEDTURF, + "LETPASSTHROW" = LETPASSTHROW +)) + +DEFINE_BITFIELD(movement_type, list( + "GROUND" = GROUND, + "FLYING" = FLYING, + "VENTCRAWLING" = VENTCRAWLING, + "FLOATING" = FLOATING, + "UNSTOPPABLE" = UNSTOPPABLE +)) + +DEFINE_BITFIELD(resistance_flags, list( + "LAVA_PROOF" = LAVA_PROOF, + "FIRE_PROOF" = FIRE_PROOF, + "FLAMMABLE" = FLAMMABLE, + "ON_FIRE" = ON_FIRE, + "UNACIDABLE" = UNACIDABLE, + "ACID_PROOF" = ACID_PROOF, + "INDESTRUCTIBLE" = INDESTRUCTIBLE, + "FREEZE_PROOF" = FREEZE_PROOF +)) + +DEFINE_BITFIELD(flags_1, list( + "NOJAUNT_1" = NOJAUNT_1, + "UNUSED_RESERVATION_TURF_1" = UNUSED_RESERVATION_TURF_1, + "CAN_BE_DIRTY_1" = CAN_BE_DIRTY_1, + "CONDUCT_1" = CONDUCT_1, + "NO_LAVA_GEN_1" = NO_LAVA_GEN_1, + "NODECONSTRUCT_1" = NODECONSTRUCT_1, + "OVERLAY_QUEUED_1" = OVERLAY_QUEUED_1, + "ON_BORDER_1" = ON_BORDER_1, + "NO_RUINS_1" = NO_RUINS_1, + "PREVENT_CLICK_UNDER_1" = PREVENT_CLICK_UNDER_1, + "HOLOGRAM_1" = HOLOGRAM_1, + "TESLA_IGNORE_1" = TESLA_IGNORE_1, + "INITIALIZED_1" = INITIALIZED_1, + "ADMIN_SPAWNED_1" = ADMIN_SPAWNED_1, + "PREVENT_CONTENTS_EXPLOSION_1" = PREVENT_CONTENTS_EXPLOSION_1, + "UNPAINTABLE_1" = UNPAINTABLE_1, +)) + +DEFINE_BITFIELD(flags_ricochet, list( + "RICOCHET_SHINY" = RICOCHET_SHINY, + "RICOCHET_HARD" = RICOCHET_HARD +)) + +DEFINE_BITFIELD(clothing_flags, list( + "LAVAPROTECT" = LAVAPROTECT, + "STOPSPRESSUREDAMAGE" = STOPSPRESSUREDAMAGE, + "BLOCK_GAS_SMOKE_EFFECT" = BLOCK_GAS_SMOKE_EFFECT, + "MASKINTERNALS" = MASKINTERNALS, + "NOSLIP" = NOSLIP, + "THICKMATERIAL" = THICKMATERIAL, + "VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE, + "VOICEBOX_DISABLED" = VOICEBOX_DISABLED, + "SHOWEROKAY" = SHOWEROKAY, + "SNUG_FIT" = SNUG_FIT, + "EFFECT_HAT" = EFFECT_HAT, + "SCAN_REAGENTS" = SCAN_REAGENTS, +)) + +DEFINE_BITFIELD(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, +)) + +DEFINE_BITFIELD(smooth, list( + "SMOOTH_TRUE" = SMOOTH_TRUE, + "SMOOTH_MORE" = SMOOTH_MORE, + "SMOOTH_DIAGONAL" = SMOOTH_DIAGONAL, + "SMOOTH_BORDER" = SMOOTH_BORDER, + "SMOOTH_QUEUED" = SMOOTH_QUEUED, +)) + +DEFINE_BITFIELD(car_traits, list( + "CAN_KIDNAP" = CAN_KIDNAP, +)) + +DEFINE_BITFIELD(mobility_flags, list( + "MOVE" = MOBILITY_MOVE, + "STAND" = MOBILITY_STAND, + "PICKUP" = MOBILITY_PICKUP, + "USE" = MOBILITY_USE, + "UI" = MOBILITY_UI, + "STORAGE" = MOBILITY_STORAGE, + "PULL" = MOBILITY_PULL, +)) + +DEFINE_BITFIELD(rad_flags, list( + "RAD_PROTECT_CONTENTS" = RAD_PROTECT_CONTENTS, + "RAD_NO_CONTAMINATE" = RAD_NO_CONTAMINATE, +)) + +DEFINE_BITFIELD(disease_flags, list( + "CURABLE" = CURABLE, + "CAN_CARRY" = CAN_CARRY, + "CAN_RESIST" = CAN_RESIST +)) + +DEFINE_BITFIELD(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_HIDE" = VIS_HIDE, + "VIS_UNDERLAY" = VIS_UNDERLAY, +)) + diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index ce13ca935c1ef..dbe8d331409c6 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -16,10 +16,8 @@ GLOBAL_VAR_INIT(shuttle_left, FALSE) GLOBAL_VAR_INIT(tinted_weldhelh, TRUE) -// Debug is used exactly once (in living.dm) but is commented out in a lot of places. It is not set anywhere and only checked. // Debug2 is used in conjunction with a lot of admin verbs and therefore is actually legit. -GLOBAL_VAR_INIT(Debug, FALSE) // global debug switch -GLOBAL_VAR_INIT(Debug2, FALSE) +GLOBAL_VAR_INIT(Debug2, FALSE) //Debug used to exist. It doesn't anymore. Renaming this takes effort. -Franc //This was a define, but I changed it to a variable so it can be changed in-game.(kept the all-caps definition because... code...) -Errorage //Protecting these because the proper way to edit them is with the config/secrets diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm index f38cbd7744886..2d881e2f4d882 100644 --- a/code/_globalvars/game_modes.dm +++ b/code/_globalvars/game_modes.dm @@ -1,4 +1,4 @@ -GLOBAL_VAR_INIT(master_mode, "traitor") //! "extended" +GLOBAL_VAR_INIT(master_mode, "Loading...") //! Stores the current gamemode. Intentionally invalid placeholder is replaced in Ticker. GLOBAL_VAR_INIT(secret_force_mode, "secret") //! if this is anything but "secret", the secret rotation will forceably choose this mode GLOBAL_VAR(common_report) //! Contains common part of roundend report GLOBAL_VAR(survivor_report) //! Contains shared survivor report for roundend report (part of personal report) diff --git a/code/_globalvars/lists/ambience.dm b/code/_globalvars/lists/ambience.dm new file mode 100644 index 0000000000000..96b3bf6ee5a35 --- /dev/null +++ b/code/_globalvars/lists/ambience.dm @@ -0,0 +1,71 @@ +GLOBAL_LIST_INIT(generic_ambience,list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg',\ + 'sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg',\ + 'sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg',\ + 'sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg',\ + 'sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg',\ + 'sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg','sound/ambience/ambigen15.ogg')) + +GLOBAL_LIST_INIT(holy_ambience,list('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg',\ + 'sound/ambience/ambicha4.ogg', 'sound/ambience/ambiholy.ogg', 'sound/ambience/ambiholy2.ogg',\ + 'sound/ambience/ambiholy3.ogg')) + +GLOBAL_LIST_INIT(danger_ambience,list( + 'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg')) + +GLOBAL_LIST_INIT(ruins_ambience,list('sound/ambience/ambimine.ogg', 'sound/ambience/ambicave.ogg', 'sound/ambience/ambiruin.ogg',\ + 'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\ + 'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\ + 'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambitech3.ogg',\ + 'sound/ambience/ambimystery.ogg', 'sound/ambience/ambimaint1.ogg')) + +GLOBAL_LIST_INIT(engi_ambience,list('sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg','sound/ambience/ambisin4.ogg',\ + 'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg', 'sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg')) + +GLOBAL_LIST_INIT(mining_ambience,list('sound/ambience/ambimine.ogg', 'sound/ambience/ambicave.ogg', 'sound/ambience/ambiruin.ogg',\ + 'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\ + 'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\ + 'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambimaint1.ogg', 'sound/ambience/ambilava.ogg')) + +GLOBAL_LIST_INIT(medical_ambience,list('sound/ambience/ambinice.ogg')) + +GLOBAL_LIST_INIT(spooky_ambience,list('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg','sound/ambience/ambiruin7.ogg','sound/ambience/ambiruin6.ogg',\ + 'sound/ambience/ambiodd.ogg', 'sound/ambience/ambimystery.ogg')) + +GLOBAL_LIST_INIT(maint_ambience,list('sound/ambience/ambimaint1.ogg', 'sound/ambience/ambimaint2.ogg', 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg',\ + 'sound/ambience/ambimaint5.ogg', 'sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg', 'sound/ambience/ambitech2.ogg')) + +GLOBAL_LIST_INIT(away_ambience,list('sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambiruin.ogg',\ + 'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\ + 'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\ + 'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambimaint.ogg',\ + 'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg', 'sound/ambience/ambiodd.ogg')) + +GLOBAL_LIST_INIT(reebe_ambience,list('sound/ambience/ambireebe1.ogg', 'sound/ambience/ambireebe2.ogg', 'sound/ambience/ambireebe3.ogg')) + +GLOBAL_LIST_INIT(creepy_ambience,list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\ + 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ + 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ + 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ + 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')) + +GLOBAL_LIST_INIT(ambience_assoc,list( + AMBIENCE_GENERIC = GLOB.generic_ambience, + AMBIENCE_HOLY = GLOB.holy_ambience, + AMBIENCE_DANGER = GLOB.danger_ambience, + AMBIENCE_RUINS = GLOB.ruins_ambience, + AMBIENCE_ENGI = GLOB.engi_ambience, + AMBIENCE_MINING = GLOB.mining_ambience, + AMBIENCE_MEDICAL = GLOB.medical_ambience, + AMBIENCE_SPOOKY = GLOB.spooky_ambience, + AMBIENCE_MAINT = GLOB.maint_ambience, + AMBIENCE_AWAY = GLOB.away_ambience, + AMBIENCE_REEBE = GLOB.reebe_ambience, + AMBIENCE_CREEPY = GLOB.creepy_ambience, + AMBIENCE_NONE = list())) + + +GLOBAL_LIST_INIT(space_ambient_music,list('sound/ambience/ambispace.ogg', 'sound/ambience/ambispace2.ogg', 'sound/ambience/qwerty/constellations.ogg', 'sound/ambience/qwerty/starlight.ogg')) + +GLOBAL_LIST_INIT(ambient_music_assoc, list( + AMBIENCE_SPACE = GLOB.space_ambient_music +)) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index cb55ce758e427..71a4616e79a2e 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -72,6 +72,7 @@ GLOBAL_LIST_INIT(ai_core_display_screens, sortList(list( "Murica", "Nanotrasen", "Not Malf", + "Portrait", "President", "Random", "Rainbow", @@ -91,6 +92,10 @@ GLOBAL_LIST_INIT(ai_core_display_screens, sortList(list( else if(input == "Random") input = pick(GLOB.ai_core_display_screens - "Random") + if(input == "Portrait") + var/datum/portrait_picker/tgui = new(usr)//create the datum + tgui.ui_interact(usr)//datum has a tgui component, here we open the window + return "ai-portrait" //just take this until they decide return "ai-[lowertext(input)]" GLOBAL_LIST_INIT(security_depts_prefs, sortList(list(SEC_DEPT_RANDOM, SEC_DEPT_NONE, SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY))) @@ -105,6 +110,11 @@ GLOBAL_LIST_INIT(security_depts_prefs, sortList(list(SEC_DEPT_RANDOM, SEC_DEPT_N #define DDUFFELBAG "Department Duffel Bag" GLOBAL_LIST_INIT(backbaglist, list(DBACKPACK, DSATCHEL, DDUFFELBAG, GBACKPACK, GSATCHEL, GDUFFELBAG, LSATCHEL)) + //Suit/Skirt +#define PREF_SUIT "Jumpsuit" +#define PREF_SKIRT "Jumpskirt" +GLOBAL_LIST_INIT(jumpsuitlist, list(PREF_SUIT, PREF_SKIRT)) + //Uplink spawn loc #define UPLINK_PDA "PDA" #define UPLINK_RADIO "Radio" @@ -188,8 +198,8 @@ GLOBAL_LIST_INIT(numbers_as_words, world.file2list("strings/numbers_as_words.txt /proc/generate_number_strings() var/list/L[198] for(var/i in 1 to 99) - L += "[i]" - L += "\Roman[i]" + L[i] = "[i]" + L[i+99] = "\Roman[i]" return L GLOBAL_LIST_INIT(station_numerals, greek_letters + phonetic_alphabet + numbers_as_words + generate_number_strings()) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index c66d53a70f3aa..b592dcd92da9c 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/item/clothing/mask/gas/old = 15, //greytide /obj/item/clothing/suit/hazardvest = 1, /obj/item/clothing/under/misc/vice_officer = 1, /obj/item/clothing/suit/hooded/flashsuit = 2, @@ -47,6 +47,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/radio/off = 2, /obj/item/t_scanner = 5, /obj/item/airlock_painter = 1, + /obj/item/airlock_painter/decal = 1, /obj/item/stack/cable_coil/random = 4, /obj/item/stack/cable_coil/random/five = 6, /obj/item/stack/medical/bruise_pack = 1, @@ -67,6 +68,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/crowbar = 1, /obj/item/crowbar/red = 1, /obj/item/extinguisher = 11, + /obj/item/stack/sticky_tape = 1, /obj/item/hand_labeler = 1, /obj/item/paper/crumpled = 1, /obj/item/pen = 1, @@ -106,5 +108,8 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/toy/eightball = 1, /obj/item/reagent_containers/pill/floorpill = 4, /obj/item/reagent_containers/food/snacks/canned/peaches/maint = 1, + /obj/item/reagent_containers/food/drinks/bottle/homemaderum = 1, + /obj/item/reagent_containers/food/snacks/grown/poppy = 10, + /obj/item/throwing_star = 1, "" = 3 )) diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index b066e936c603f..e3355236237ce 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -37,6 +37,7 @@ GLOBAL_LIST_EMPTY(emergencyresponseteamspawn) GLOBAL_LIST_EMPTY(servant_spawns) //Servants of Ratvar spawn here GLOBAL_LIST_EMPTY(city_of_cogs_spawns) //Anyone entering the City of Cogs spawns here GLOBAL_LIST_EMPTY(ruin_landmarks) +GLOBAL_LIST_EMPTY(bar_areas) //away missions GLOBAL_LIST_EMPTY(awaydestinations) //a list of landmarks that the warpgate can take you to @@ -48,3 +49,6 @@ GLOBAL_LIST_EMPTY(sortedAreas) GLOBAL_LIST_EMPTY_TYPED(areas_by_type, /area) GLOBAL_LIST_EMPTY(all_abstract_markers) + +/// Global list of megafauna spawns on cave gen +GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = 6)) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index fdeb2ae0367e4..ec44dc6dae8fc 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -6,6 +6,14 @@ GLOBAL_LIST_EMPTY(deadmins) //all ckeys who have used the de-admin verb. GLOBAL_LIST_EMPTY(directory) //all ckeys with associated client GLOBAL_LIST_EMPTY(stealthminID) //reference list with IDs that store ckeys, for stealthmins + +GLOBAL_LIST_INIT(dangerous_turfs, typecacheof(list( + /turf/open/lava, + /turf/open/chasm, + /turf/open/space, + /turf/open/openspace))) + + //Since it didn't really belong in any other category, I'm putting this here //This is for procs to replace all the goddamn 'in world's that are chilling around the code @@ -27,7 +35,7 @@ GLOBAL_LIST_EMPTY(available_ai_shells) GLOBAL_LIST_INIT(simple_animals, list(list(),list(),list(),list())) // One for each AI_* status define GLOBAL_LIST_EMPTY(spidermobs) //all sentient spider mobs GLOBAL_LIST_EMPTY(bots_list) -GLOBAL_LIST_EMPTY(aiEyes) +GLOBAL_LIST_EMPTY(ai_eyes) GLOBAL_LIST_EMPTY(language_datum_instances) GLOBAL_LIST_EMPTY(all_languages) diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index 81769865c1e36..001306ef7525c 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -27,6 +27,8 @@ GLOBAL_LIST_INIT(posibrain_names, world.file2list("strings/names/posibrain.txt") GLOBAL_LIST_INIT(nightmare_names, world.file2list("strings/names/nightmare.txt")) GLOBAL_LIST_INIT(megacarp_first_names, world.file2list("strings/names/megacarp1.txt")) GLOBAL_LIST_INIT(megacarp_last_names, world.file2list("strings/names/megacarp2.txt")) +GLOBAL_LIST_INIT(oozeling_first_names, world.file2list("strings/names/ooze_first.txt")) +GLOBAL_LIST_INIT(oozeling_last_names, world.file2list("strings/names/ooze_last.txt")) GLOBAL_LIST_INIT(verbs, world.file2list("strings/names/verbs.txt")) GLOBAL_LIST_INIT(ing_verbs, world.file2list("strings/names/ing_verbs.txt")) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 6a4d8546f30d3..0c878226656df 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -4,7 +4,7 @@ GLOBAL_LIST_EMPTY(airlocks) //list of all airlocks GLOBAL_LIST_EMPTY(mechas_list) //list of all mechs. Used by hostile mobs target tracking. GLOBAL_LIST_EMPTY(shuttle_caller_list) //list of all communication consoles and AIs, for automatic shuttle calls when there are none. GLOBAL_LIST_EMPTY(machines) //NOTE: this is a list of ALL machines now. The processing machines list is SSmachine.processing ! -GLOBAL_LIST_EMPTY(navigation_computers) //list of all /obj/machinery/computer/camera_advanced/shuttle_docker +GLOBAL_LIST_EMPTY(navigation_computers) //list of all /obj/machinery/computer/shuttle_flight GLOBAL_LIST_EMPTY(syndicate_shuttle_boards) //important to keep track of for managing nukeops war declarations. GLOBAL_LIST_EMPTY(navbeacons) //list of all bot nagivation beacons, used for patrolling. GLOBAL_LIST_EMPTY(teleportbeacons) //list of all tracking beacons used by teleporters @@ -16,7 +16,6 @@ GLOBAL_LIST_EMPTY(singularities) //list of all singularities on the stati GLOBAL_LIST(chemical_reactions_list) //list of all /datum/chemical_reaction datums. Used during chemical reactions GLOBAL_LIST(chemical_reagents_list) //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff -GLOBAL_LIST_EMPTY(materials_list) //list of all /datum/material datums indexed by material id. GLOBAL_LIST_EMPTY(tech_list) //list of all /datum/tech datums indexed by id. GLOBAL_LIST_EMPTY(surgeries_list) //list of all surgeries by name, associated with their path. GLOBAL_LIST_EMPTY(crafting_recipes) //list of all table craft recipes @@ -39,6 +38,4 @@ GLOBAL_LIST_EMPTY(ai_status_displays) GLOBAL_LIST_EMPTY(mob_spawners) // All mob_spawn objects GLOBAL_LIST_EMPTY(alert_consoles) // Station alert consoles, /obj/machinery/computer/station_alert - -GLOBAL_LIST_EMPTY(ic_jammers) // circuit stuff -GLOBAL_LIST_EMPTY(ic_speakers) // circuit stuff +GLOBAL_LIST_INIT(alarms, list("Fire" = list(), "Atmosphere" = list(), "Power" = list())) //all engineering alerts for station alert consoles and alarm manager diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index 23566cfbf9a92..443005cad6a0b 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -56,6 +56,8 @@ GLOBAL_PROTECT(lastsignalers) GLOBAL_LIST_EMPTY(lawchanges) //! Stores who uploaded laws to which silicon-based lifeform, and what the law was GLOBAL_PROTECT(lawchanges) +GLOBAL_VAR(perf_log) +GLOBAL_PROTECT(perf_log) GLOBAL_LIST_EMPTY(combatlog) GLOBAL_PROTECT(combatlog) GLOBAL_LIST_EMPTY(IClog) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index d7d4c4f60edcc..84ca967ccb634 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -1,7 +1,5 @@ GLOBAL_VAR_INIT(admin_notice, "") //! Admin notice that all clients see when joining the server -GLOBAL_VAR_INIT(timezoneOffset, 0) //! The difference betwen midnight (of the host computer) and 0 world.ticks. - GLOBAL_VAR_INIT(fileaccess_timer, 0) //! For FTP requests. (i.e. downloading runtime logs.) However it'd be ok to use for accessing attack logs and such too, which are even laggier. GLOBAL_VAR_INIT(TAB, "    ") @@ -17,7 +15,6 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) //! BSA unlocked by head ID swipes GLOBAL_LIST_EMPTY(player_details) //! ckey -> /datum/player_details -GLOBAL_VAR_INIT(remote_control, TRUE) //! circuit shit ///All currently running polls held as datums GLOBAL_LIST_EMPTY(polls) GLOBAL_PROTECT(polls) @@ -26,18 +23,18 @@ GLOBAL_PROTECT(polls) GLOBAL_LIST_EMPTY(poll_options) GLOBAL_PROTECT(poll_options) -// All religion stuff -GLOBAL_VAR(religion) -GLOBAL_VAR(deity) -GLOBAL_VAR(bible_name) -GLOBAL_VAR(bible_icon_state) -GLOBAL_VAR(bible_item_state) -GLOBAL_VAR(holy_weapon_type) -GLOBAL_VAR(holy_armor_type) - // Monkeycube/chicken/slime spam prevention GLOBAL_VAR_INIT(total_cube_monkeys, 0) GLOBAL_VAR_INIT(total_chickens, 0) GLOBAL_VAR_INIT(total_slimes, 0) -GLOBAL_VAR_INIT(internal_tick_usage, 0.2 * world.tick_lag) //This var is updated every tick by a DLL if present, used to reduce lag +///Global var for insecure comms key rate limiting +GLOBAL_VAR_INIT(topic_cooldown, 0) + +// Topic stuff +GLOBAL_LIST_EMPTY(topic_commands) +GLOBAL_PROTECT(topic_commands) +GLOBAL_LIST_EMPTY(topic_tokens) +GLOBAL_PROTECT(topic_tokens) +GLOBAL_LIST_EMPTY(topic_servers) +GLOBAL_PROTECT(topic_servers) diff --git a/code/_globalvars/religion.dm b/code/_globalvars/religion.dm new file mode 100644 index 0000000000000..4eb08d4384941 --- /dev/null +++ b/code/_globalvars/religion.dm @@ -0,0 +1,14 @@ +// All religion stuff +GLOBAL_VAR(religion) +GLOBAL_VAR(deity) +GLOBAL_DATUM(religious_sect, /datum/religion_sect) +GLOBAL_VAR(favor) + +//bible +GLOBAL_VAR(bible_name) +GLOBAL_VAR(bible_icon_state) +GLOBAL_VAR(bible_item_state) + +//gear +GLOBAL_VAR(holy_weapon_type) +GLOBAL_VAR(holy_armor_type) diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm new file mode 100644 index 0000000000000..706a09e82de48 --- /dev/null +++ b/code/_globalvars/traits.dm @@ -0,0 +1,139 @@ +/* + 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_BADDNA" = TRAIT_BADDNA, + "TRAIT_CLUMSY" = TRAIT_CLUMSY, + "TRAIT_DUMB" = TRAIT_DUMB, + "TRAIT_MONKEYLIKE" = TRAIT_MONKEYLIKE, + "TRAIT_PACIFISM" = TRAIT_PACIFISM, + "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, + "TRAIT_IGNOREDAMAGESLOWDOWN" = TRAIT_IGNOREDAMAGESLOWDOWN, + "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, + "TRAIT_REGEN_COMA" = TRAIT_REGEN_COMA, + "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, + "TRAIT_DISFIGURED" = TRAIT_DISFIGURED, + "TRAIT_XENO_HOST" = TRAIT_XENO_HOST, + "TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE, + "TRAIT_STUNRESISTANCE" = TRAIT_STUNRESISTANCE, + "TRAIT_CONFUSEIMMUNE" = TRAIT_CONFUSEIMMUNE, + "TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, + "TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE, + "TRAIT_SHOCKIMMUNE" = TRAIT_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_NOMETABOLISM" = TRAIT_NOMETABOLISM, + "TRAIT_POWERHUNGRY" = TRAIT_POWERHUNGRY, + "TRAIT_NOCLONELOSS" = TRAIT_NOCLONELOSS, + "TRAIT_TOXIMMUNE" = TRAIT_TOXIMMUNE, + "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_NOSTAMCRIT" = TRAIT_NOSTAMCRIT, + "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD, + "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_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, + "TRAIT_PRESENT_VISION" = TRAIT_PRESENT_VISION, + "TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER, + "TRAIT_MULTILINGUAL" = TRAIT_MULTILINGUAL, + "TRAIT_NOMOBSWAP" = TRAIT_NOMOBSWAP, + "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_CALCIUM_HEALER" = TRAIT_CALCIUM_HEALER, + "TRAIT_MAGIC_CHOKE" = TRAIT_MAGIC_CHOKE, + "TRAIT_SOOTHED_THROAT" = TRAIT_SOOTHED_THROAT, + "TRAIT_LAW_ENFORCEMENT_METABOLISM" = TRAIT_LAW_ENFORCEMENT_METABOLISM, + "TRAIT_ALWAYS_CLEAN" = TRAIT_ALWAYS_CLEAN, + "TRAIT_BOOZE_SLIDER" = TRAIT_BOOZE_SLIDER, + "TRAIT_QUICK_CARRY" = TRAIT_QUICK_CARRY, + "TRAIT_QUICKER_CARRY" = TRAIT_QUICKER_CARRY, + "TRAIT_UNINTELLIGIBLE_SPEECH" = TRAIT_UNINTELLIGIBLE_SPEECH, + "TRAIT_UNSTABLE" = TRAIT_UNSTABLE, + "TRAIT_XENO_IMMUNE" = TRAIT_XENO_IMMUNE, + "TRAIT_NECROPOLIS_INFECTED" = TRAIT_NECROPOLIS_INFECTED, + "TRAIT_BEEFRIEND" = TRAIT_BEEFRIEND, + "TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD, + "TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD, + "TRAIT_MEDIBOTCOMINGTHROUGH" = TRAIT_MEDIBOTCOMINGTHROUGH, + "TRAIT_PASSTABLE" = TRAIT_PASSTABLE, + "TRAIT_ONEWAYROAD" = TRAIT_ONEWAYROAD, + "TRAIT_APPRAISAL" = TRAIT_APPRAISAL, + "TRAIT_NOBLOCK" = TRAIT_NOBLOCK, + "TRAIT_NANITECOMPATIBLE" = TRAIT_NANITECOMPATIBLE, + "TRAIT_WARDED" = TRAIT_WARDED, + "TRAIT_NONECRODISEASE" = TRAIT_NONECRODISEASE, + "TRAIT_DIGICAMO" = TRAIT_DIGICAMO, + "TRAIT_DIGINVIS" = TRAIT_DIGINVIS, + "TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT, + "TRAIT_ALWAYS_STUBS" = TRAIT_ALWAYS_STUBS + ), + /obj/item/bodypart = list( + "TRAIT_PARALYSIS" = TRAIT_PARALYSIS + ), + /obj/item = list( + "TRAIT_NODROP" = TRAIT_NODROP, + "TRAIT_NO_STORAGE_INSERT" = TRAIT_NO_STORAGE_INSERT, + "TRAIT_SPRAYPAINTED" = TRAIT_SPRAYPAINTED, + "TRAIT_T_RAY_VISIBLE" = TRAIT_T_RAY_VISIBLE, + "TRAIT_NO_TELEPORT" = TRAIT_NO_TELEPORT, + "TRAIT_STARGAZED" = TRAIT_STARGAZED, + "TRAIT_DOOR_PRYER" = TRAIT_DOOR_PRYER, + "TRAIT_FISH_SAFE_STORAGE" = TRAIT_FISH_SAFE_STORAGE, + "TRAIT_FISH_CASE_COMPATIBILE" = TRAIT_FISH_CASE_COMPATIBILE + ) + )) + +/// 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 4ddcd9e3a35af..339aa276a8bfd 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -29,7 +29,7 @@ if(multicam_on) var/turf/T = get_turf(A) if(T) - for(var/obj/screen/movable/pic_in_pic/ai/P in T.vis_locs) + for(var/atom/movable/screen/movable/pic_in_pic/ai/P in T.vis_locs) if(P.ai == src) P.Click(params) break @@ -51,7 +51,7 @@ log_admin(message) if(REALTIMEOFDAY >= chnotify + 9000) chnotify = REALTIMEOFDAY - send2irc_adminless_only("NOCHEAT", message) + send2tgs_adminless_only("NOCHEAT", message) return var/list/modifiers = params2list(params) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 2564fae27b4e3..49c99096ecce3 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -118,8 +118,7 @@ RestrainedClickOn(A) return - if(in_throw_mode) - throw_item(A) + if(in_throw_mode && throw_item(A)) return var/obj/item/W = get_active_held_item() @@ -366,14 +365,14 @@ var/turf/T = get_turf(src) if(T && user.TurfAdjacent(T)) user.listed_turf = T - user.client.statpanel = T.name + user.set_stat_tab(T.name) // Use this instead of /mob/proc/AltClickOn(atom/A) where you only want turf content listing without additional atom alt-click interaction /atom/proc/AltClickNoInteract(mob/user, atom/A) var/turf/T = get_turf(A) if(T && user.TurfAdjacent(T)) user.listed_turf = T - user.client.statpanel = T.name + user.set_stat_tab(T.name) /mob/proc/TurfAdjacent(turf/T) return T.Adjacent(src) @@ -412,7 +411,7 @@ playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1) LE.firer = src - LE.def_zone = get_organ_target() + LE.def_zone = ran_zone(zone_selected) LE.preparePixelProjectile(A, src, params) LE.fire() @@ -445,14 +444,14 @@ setDir(WEST) //debug -/obj/screen/proc/scale_to(x1,y1) +/atom/movable/screen/proc/scale_to(x1,y1) if(!y1) y1 = x1 var/matrix/M = new M.Scale(x1,y1) transform = M -/obj/screen/click_catcher +/atom/movable/screen/click_catcher icon = 'icons/mob/screen_gen.dmi' icon_state = "catcher" plane = CLICKCATCHER_PLANE @@ -462,7 +461,7 @@ #define MAX_SAFE_BYOND_ICON_SCALE_TILES (MAX_SAFE_BYOND_ICON_SCALE_PX / world.icon_size) #define MAX_SAFE_BYOND_ICON_SCALE_PX (33 * 32) //Not using world.icon_size on purpose. -/obj/screen/click_catcher/proc/UpdateGreed(view_size_x = 15, view_size_y = 15) +/atom/movable/screen/click_catcher/proc/UpdateGreed(view_size_x = 15, view_size_y = 15) var/icon/newicon = icon('icons/mob/screen_gen.dmi', "catcher") var/ox = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_x) var/oy = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_y) @@ -477,7 +476,7 @@ M.Scale(px/sx, py/sy) transform = M -/obj/screen/click_catcher/Click(location, control, params) +/atom/movable/screen/click_catcher/Click(location, control, params) var/list/modifiers = params2list(params) if(modifiers["middle"] && iscarbon(usr)) var/mob/living/carbon/C = usr diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index 3eae7d9bc32d0..5e59c17fcb95c 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -23,14 +23,8 @@ SEND_SIGNAL(src, COMSIG_MOUSEDROPPED_ONTO, dropping, user) 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 @@ -44,7 +38,6 @@ /client/MouseUp(object, location, control, params) if (mouse_up_icon) mouse_pointer_icon = mouse_up_icon - selected_target[1] = null if(active_mousedown_item) active_mousedown_item.onMouseUp(object, location, params, mob) active_mousedown_item = null @@ -89,26 +82,12 @@ /atom/proc/IsAutoclickable() . = 1 -/obj/screen/IsAutoclickable() +/atom/movable/screen/IsAutoclickable() . = 0 -/obj/screen/click_catcher/IsAutoclickable() +/atom/movable/screen/click_catcher/IsAutoclickable() . = 1 -//Please don't roast me too hard -/client/MouseMove(object,location,control,params) - mouseParams = params - 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) - ..() - -/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"]) @@ -118,17 +97,9 @@ else middragtime = 0 middragatom = null - mouseParams = params - mouseLocation = over_location - mouseObject = over_object - mouseControlObject = over_control - if(selected_target[1] && over_object && over_object.IsAutoclickable()) - selected_target[1] = over_object - selected_target[2] = params if(active_mousedown_item) active_mousedown_item.onMouseDrag(src_object, over_object, src_location, over_location, params, mob) - /obj/item/proc/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) return @@ -136,4 +107,4 @@ if (middragatom == src_object) middragtime = 0 middragatom = null - ..() \ No newline at end of file + ..() diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index ed7c78072198d..ce59f95448f04 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -138,8 +138,11 @@ #define ui_ai_take_picture "SOUTH:6,WEST+12" #define ui_ai_view_images "SOUTH:6,WEST+13" #define ui_ai_sensor "SOUTH:6,WEST+14" -#define ui_ai_multicam "SOUTH+1:6,WEST+13" -#define ui_ai_add_multicam "SOUTH+1:6,WEST+14" +#define ui_ai_multicam "SOUTH:6,WEST+15" +#define ui_ai_add_multicam "SOUTH:6,WEST+16" +#define ui_ai_language_menu "CENTER+7:32,SOUTH+1:5" +#define ui_ai_move_up "SOUTH:5+1,WEST+14" +#define ui_ai_move_down "SOUTH:5+1,WEST+15" // pAI @@ -177,3 +180,7 @@ #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" + +//Team finder + +#define ui_team_finder "CENTER,CENTER" diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index eaf561ea0d588..ff85a51a515d9 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -1,6 +1,6 @@ #define ACTION_BUTTON_DEFAULT_BACKGROUND "default" -/obj/screen/movable/action_button +/atom/movable/screen/movable/action_button var/datum/action/linked_action var/actiontooltipstyle = "" screen_loc = null @@ -11,10 +11,10 @@ var/id var/ordered = TRUE //If the button gets placed into the default bar. -/obj/screen/movable/action_button/Destroy() +/atom/movable/screen/movable/action_button/Destroy() . = ..() -/obj/screen/movable/action_button/proc/can_use(mob/user) +/atom/movable/screen/movable/action_button/proc/can_use(mob/user) if (linked_action) return linked_action.owner == user else if (isobserver(user)) @@ -23,14 +23,14 @@ else return TRUE -/obj/screen/movable/action_button/MouseDrop(over_object) +/atom/movable/screen/movable/action_button/MouseDrop(over_object) if(!can_use(usr)) return - if((istype(over_object, /obj/screen/movable/action_button) && !istype(over_object, /obj/screen/movable/action_button/hide_toggle))) + if((istype(over_object, /atom/movable/screen/movable/action_button) && !istype(over_object, /atom/movable/screen/movable/action_button/hide_toggle))) if(locked) to_chat(usr, "Action button \"[name]\" is locked, unlock it first.") return - var/obj/screen/movable/action_button/B = over_object + var/atom/movable/screen/movable/action_button/B = over_object var/list/actions = usr.actions actions.Swap(actions.Find(src.linked_action), actions.Find(B.linked_action)) moved = FALSE @@ -41,7 +41,7 @@ else return ..() -/obj/screen/movable/action_button/Click(location,control,params) +/atom/movable/screen/movable/action_button/Click(location,control,params) if (!can_use(usr)) return @@ -70,7 +70,7 @@ return TRUE //Hide/Show Action Buttons ... Button -/obj/screen/movable/action_button/hide_toggle +/atom/movable/screen/movable/action_button/hide_toggle name = "Hide Buttons" desc = "Shift-click any button to reset its position, and Control-click it to lock it in place. Alt-click this button to reset all buttons to their default positions." icon = 'icons/mob/actions.dmi' @@ -80,7 +80,7 @@ var/hide_state = "hide" var/show_state = "show" -/obj/screen/movable/action_button/hide_toggle/Click(location,control,params) +/atom/movable/screen/movable/action_button/hide_toggle/Click(location,control,params) if (!can_use(usr)) return @@ -101,7 +101,7 @@ if(modifiers["alt"]) for(var/V in usr.actions) var/datum/action/A = V - var/obj/screen/movable/action_button/B = A.button + var/atom/movable/screen/movable/action_button/B = A.button B.moved = FALSE if(B.id && usr.client) usr.client.prefs.action_buttons_screen_locs["[B.name]_[B.id]"] = null @@ -123,10 +123,10 @@ update_icon() usr.update_action_buttons() -/obj/screen/movable/action_button/hide_toggle/AltClick(mob/user) +/atom/movable/screen/movable/action_button/hide_toggle/AltClick(mob/user) for(var/V in user.actions) var/datum/action/A = V - var/obj/screen/movable/action_button/B = A.button + var/atom/movable/screen/movable/action_button/B = A.button B.moved = FALSE if(moved) moved = FALSE @@ -134,7 +134,7 @@ to_chat(user, "Action button positions have been reset.") -/obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(datum/hud/owner_hud) +/atom/movable/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(datum/hud/owner_hud) var/settings = owner_hud.get_action_buttons_icons() icon = settings["bg_icon"] icon_state = settings["bg_state"] @@ -143,17 +143,17 @@ show_state = settings["toggle_show"] update_icon() -/obj/screen/movable/action_button/hide_toggle/update_icon() +/atom/movable/screen/movable/action_button/hide_toggle/update_icon() cut_overlays() add_overlay(mutable_appearance(hide_icon, hidden ? show_state : hide_state)) -/obj/screen/movable/action_button/MouseEntered(location,control,params) +/atom/movable/screen/movable/action_button/MouseEntered(location,control,params) if(!QDELETED(src)) openToolTip(usr,src,params,title = name,content = desc,theme = actiontooltipstyle) -/obj/screen/movable/action_button/MouseExited() +/atom/movable/screen/movable/action_button/MouseExited() closeToolTip(usr) /datum/hud/proc/get_action_buttons_icons() @@ -191,7 +191,7 @@ else for(var/datum/action/A in actions) A.UpdateButtonIcon() - var/obj/screen/movable/action_button/B = A.button + var/atom/movable/screen/movable/action_button/B = A.button if(B.ordered) button_number++ if(B.moved) @@ -227,7 +227,7 @@ return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-6" -/datum/hud/proc/SetButtonCoords(obj/screen/button,number) +/datum/hud/proc/SetButtonCoords(atom/movable/screen/button,number) var/row = round((number-1)/AB_MAX_COLUMNS) var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 var/x_offset = 32*(col-1) + 4 + 2*col diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 93c3b63d1e58d..f30c1bea0620e 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -1,136 +1,136 @@ -/obj/screen/ai +/atom/movable/screen/ai icon = 'icons/mob/screen_ai.dmi' -/obj/screen/ai/Click() +/atom/movable/screen/ai/Click() if(isobserver(usr) || usr.incapacitated()) return TRUE -/obj/screen/ai/aicore +/atom/movable/screen/ai/aicore name = "AI core" icon_state = "ai_core" -/obj/screen/ai/aicore/Click() +/atom/movable/screen/ai/aicore/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.view_core() -/obj/screen/ai/camera_list +/atom/movable/screen/ai/camera_list name = "Show Camera List" icon_state = "camera" -/obj/screen/ai/camera_list/Click() +/atom/movable/screen/ai/camera_list/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.show_camera_list() -/obj/screen/ai/camera_track +/atom/movable/screen/ai/camera_track name = "Track With Camera" icon_state = "track" -/obj/screen/ai/camera_track/Click() +/atom/movable/screen/ai/camera_track/Click() if(..()) return var/mob/living/silicon/ai/AI = usr var/target_name = input(AI, "Choose who you want to track", "Tracking") as null|anything in AI.trackable_mobs() AI.ai_camera_track(target_name) -/obj/screen/ai/camera_light +/atom/movable/screen/ai/camera_light name = "Toggle Camera Light" icon_state = "camera_light" -/obj/screen/ai/camera_light/Click() +/atom/movable/screen/ai/camera_light/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.toggle_camera_light() -/obj/screen/ai/crew_monitor +/atom/movable/screen/ai/crew_monitor name = "Crew Monitoring Console" icon_state = "crew_monitor" -/obj/screen/ai/crew_monitor/Click() +/atom/movable/screen/ai/crew_monitor/Click() if(..()) return var/mob/living/silicon/ai/AI = usr GLOB.crewmonitor.show(AI,AI) -/obj/screen/ai/crew_manifest +/atom/movable/screen/ai/crew_manifest name = "Crew Manifest" icon_state = "manifest" -/obj/screen/ai/crew_manifest/Click() +/atom/movable/screen/ai/crew_manifest/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.ai_roster() -/obj/screen/ai/alerts +/atom/movable/screen/ai/alerts name = "Show Alerts" icon_state = "alerts" -/obj/screen/ai/alerts/Click() +/atom/movable/screen/ai/alerts/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.ai_alerts() -/obj/screen/ai/announcement +/atom/movable/screen/ai/announcement name = "Make Vox Announcement" icon_state = "announcement" -/obj/screen/ai/announcement/Click() +/atom/movable/screen/ai/announcement/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.announcement() -/obj/screen/ai/call_shuttle +/atom/movable/screen/ai/call_shuttle name = "Call Emergency Shuttle" icon_state = "call_shuttle" -/obj/screen/ai/call_shuttle/Click() +/atom/movable/screen/ai/call_shuttle/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.ai_call_shuttle() -/obj/screen/ai/state_laws +/atom/movable/screen/ai/state_laws name = "State Laws" icon_state = "state_laws" -/obj/screen/ai/state_laws/Click() +/atom/movable/screen/ai/state_laws/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.checklaws() -/obj/screen/ai/pda_msg_send +/atom/movable/screen/ai/pda_msg_send name = "PDA - Send Message" icon_state = "pda_send" -/obj/screen/ai/pda_msg_send/Click() +/atom/movable/screen/ai/pda_msg_send/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.cmd_send_pdamesg(usr) -/obj/screen/ai/pda_msg_show +/atom/movable/screen/ai/pda_msg_show name = "PDA - Show Message Log" icon_state = "pda_receive" -/obj/screen/ai/pda_msg_show/Click() +/atom/movable/screen/ai/pda_msg_show/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.cmd_show_message_log(usr) -/obj/screen/ai/image_take +/atom/movable/screen/ai/image_take name = "Take Image" icon_state = "take_picture" -/obj/screen/ai/image_take/Click() +/atom/movable/screen/ai/image_take/Click() if(..()) return if(isAI(usr)) @@ -140,11 +140,11 @@ var/mob/living/silicon/robot/R = usr R.aicamera.toggle_camera_mode(usr) -/obj/screen/ai/image_view +/atom/movable/screen/ai/image_view name = "View Images" icon_state = "view_images" -/obj/screen/ai/image_view/Click() +/atom/movable/screen/ai/image_view/Click() if(..()) return if(isAI(usr)) @@ -154,148 +154,182 @@ var/mob/living/silicon/robot/R = usr R.aicamera.viewpictures(usr) -/obj/screen/ai/sensors +/atom/movable/screen/ai/sensors name = "Sensor Augmentation" icon_state = "ai_sensor" -/obj/screen/ai/sensors/Click() +/atom/movable/screen/ai/sensors/Click() if(..()) return var/mob/living/silicon/S = usr S.toggle_sensors() -/obj/screen/ai/multicam +/atom/movable/screen/ai/multicam name = "Multicamera Mode" icon_state = "multicam" -/obj/screen/ai/multicam/Click() +/atom/movable/screen/ai/multicam/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.toggle_multicam() -/obj/screen/ai/add_multicam +/atom/movable/screen/ai/add_multicam name = "New Camera" icon_state = "new_cam" -/obj/screen/ai/add_multicam/Click() +/atom/movable/screen/ai/add_multicam/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.drop_new_multicam() +/atom/movable/screen/ai/move_z + name = "View Above" + icon_state = "move_up" + var/upwards = TRUE + +/atom/movable/screen/ai/move_z/Click() + if(..()) + return + var/mob/living/silicon/ai/AI = usr + var/turf/T = get_turf(AI.eyeobj) + var/turf/target = upwards ? T.above() : T.below() + if(isturf(target)) + AI.eyeobj.forceMove(target) + AI.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash/static) + AI.clear_fullscreen("flash", 5) + else + to_chat(AI, "There is nothing in that direction!") + +/atom/movable/screen/ai/move_z/down + name = "View Below" + icon_state = "move_down" + upwards = FALSE /datum/hud/ai ui_style = 'icons/mob/screen_ai.dmi' /datum/hud/ai/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using // Language menu - using = new /obj/screen/language_menu - using.screen_loc = ui_borg_language_menu + using = new /atom/movable/screen/language_menu + using.screen_loc = ui_ai_language_menu using.hud = src static_inventory += using //AI core - using = new /obj/screen/ai/aicore() + using = new /atom/movable/screen/ai/aicore() using.screen_loc = ui_ai_core using.hud = src static_inventory += using //Camera list - using = new /obj/screen/ai/camera_list() + using = new /atom/movable/screen/ai/camera_list() using.screen_loc = ui_ai_camera_list using.hud = src static_inventory += using //Track - using = new /obj/screen/ai/camera_track() + using = new /atom/movable/screen/ai/camera_track() using.screen_loc = ui_ai_track_with_camera using.hud = src static_inventory += using //Camera light - using = new /obj/screen/ai/camera_light() + using = new /atom/movable/screen/ai/camera_light() using.screen_loc = ui_ai_camera_light using.hud = src static_inventory += using //Crew Monitoring - using = new /obj/screen/ai/crew_monitor() + using = new /atom/movable/screen/ai/crew_monitor() using.screen_loc = ui_ai_crew_monitor using.hud = src static_inventory += using //Crew Manifest - using = new /obj/screen/ai/crew_manifest() + using = new /atom/movable/screen/ai/crew_manifest() using.screen_loc = ui_ai_crew_manifest using.hud = src static_inventory += using //Alerts - using = new /obj/screen/ai/alerts() + using = new /atom/movable/screen/ai/alerts() using.screen_loc = ui_ai_alerts using.hud = src static_inventory += using //Announcement - using = new /obj/screen/ai/announcement() + using = new /atom/movable/screen/ai/announcement() using.screen_loc = ui_ai_announcement using.hud = src static_inventory += using //Shuttle - using = new /obj/screen/ai/call_shuttle() + using = new /atom/movable/screen/ai/call_shuttle() using.screen_loc = ui_ai_shuttle using.hud = src static_inventory += using //Laws - using = new /obj/screen/ai/state_laws() + using = new /atom/movable/screen/ai/state_laws() using.screen_loc = ui_ai_state_laws using.hud = src static_inventory += using //PDA message - using = new /obj/screen/ai/pda_msg_send() + using = new /atom/movable/screen/ai/pda_msg_send() using.screen_loc = ui_ai_pda_send using.hud = src static_inventory += using //PDA log - using = new /obj/screen/ai/pda_msg_show() + using = new /atom/movable/screen/ai/pda_msg_show() using.screen_loc = ui_ai_pda_log using.hud = src static_inventory += using //Take image - using = new /obj/screen/ai/image_take() + using = new /atom/movable/screen/ai/image_take() using.screen_loc = ui_ai_take_picture using.hud = src static_inventory += using //View images - using = new /obj/screen/ai/image_view() + using = new /atom/movable/screen/ai/image_view() using.screen_loc = ui_ai_view_images using.hud = src static_inventory += using //Medical/Security sensors - using = new /obj/screen/ai/sensors() + using = new /atom/movable/screen/ai/sensors() using.screen_loc = ui_ai_sensor using.hud = src static_inventory += using //Multicamera mode - using = new /obj/screen/ai/multicam() + using = new /atom/movable/screen/ai/multicam() using.screen_loc = ui_ai_multicam using.hud = src static_inventory += using //Add multicamera camera - using = new /obj/screen/ai/add_multicam() + using = new /atom/movable/screen/ai/add_multicam() using.screen_loc = ui_ai_add_multicam using.hud = src static_inventory += using + +//Add multi z up + using = new /atom/movable/screen/ai/move_z() + using.screen_loc = ui_ai_move_up + using.hud = src + static_inventory += using + +//Add multi z down + using = new /atom/movable/screen/ai/move_z/down() + using.screen_loc = ui_ai_move_down + using.hud = src + static_inventory += using diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 7de104a9a805a..17ac61198fd6c 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -18,7 +18,7 @@ if(!category || QDELETED(src)) return - var/obj/screen/alert/thealert + var/atom/movable/screen/alert/thealert if(alerts[category]) thealert = alerts[category] if(thealert.override_alerts) @@ -69,13 +69,13 @@ thealert.timeout = world.time + thealert.timeout - world.tick_lag return thealert -/mob/proc/alert_timeout(obj/screen/alert/alert, category) +/mob/proc/alert_timeout(atom/movable/screen/alert/alert, category) if(alert.timeout && alerts[category] == alert && world.time >= alert.timeout) clear_alert(category) // Proc to clear an existing alert. /mob/proc/clear_alert(category, clear_override = FALSE) - var/obj/screen/alert/alert = alerts[category] + var/atom/movable/screen/alert/alert = alerts[category] if(!alert) return 0 if(alert.override_alerts && !clear_override) @@ -87,7 +87,7 @@ client.screen -= alert qdel(alert) -/obj/screen/alert +/atom/movable/screen/alert icon = 'icons/mob/screen_alert.dmi' icon_state = "default" name = "Alert" @@ -100,154 +100,154 @@ var/mob/owner //Alert owner -/obj/screen/alert/MouseEntered(location,control,params) +/atom/movable/screen/alert/MouseEntered(location,control,params) if(!QDELETED(src)) openToolTip(usr,src,params,title = name,content = desc,theme = alerttooltipstyle) -/obj/screen/alert/MouseExited() +/atom/movable/screen/alert/MouseExited() closeToolTip(usr) //Gas alerts -/obj/screen/alert/not_enough_oxy +/atom/movable/screen/alert/not_enough_oxy name = "Choking (No O2)" desc = "You're not getting enough oxygen. Find some good air before you pass out! The box in your backpack has an oxygen tank and breath mask in it." icon_state = "not_enough_oxy" -/obj/screen/alert/too_much_oxy +/atom/movable/screen/alert/too_much_oxy name = "Choking (O2)" desc = "There's too much oxygen in the air, and you're breathing it in! Find some good air before you pass out!" icon_state = "too_much_oxy" -/obj/screen/alert/not_enough_nitro +/atom/movable/screen/alert/not_enough_nitro name = "Choking (No N2)" desc = "You're not getting enough nitrogen. Find some good air before you pass out!" icon_state = "not_enough_nitro" -/obj/screen/alert/too_much_nitro +/atom/movable/screen/alert/too_much_nitro name = "Choking (N2)" desc = "There's too much nitrogen in the air, and you're breathing it in! Find some good air before you pass out!" icon_state = "too_much_nitro" -/obj/screen/alert/not_enough_co2 +/atom/movable/screen/alert/not_enough_co2 name = "Choking (No CO2)" desc = "You're not getting enough carbon dioxide. Find some good air before you pass out!" icon_state = "not_enough_co2" -/obj/screen/alert/too_much_co2 +/atom/movable/screen/alert/too_much_co2 name = "Choking (CO2)" desc = "There's too much carbon dioxide in the air, and you're breathing it in! Find some good air before you pass out!" icon_state = "too_much_co2" -/obj/screen/alert/not_enough_tox +/atom/movable/screen/alert/not_enough_tox name = "Choking (No Plasma)" desc = "You're not getting enough plasma. Find some good air before you pass out!" icon_state = "not_enough_tox" -/obj/screen/alert/too_much_tox +/atom/movable/screen/alert/too_much_tox name = "Choking (Plasma)" desc = "There's highly flammable, toxic plasma in the air and you're breathing it in. Find some fresh air. The box in your backpack has an oxygen tank and gas mask in it." icon_state = "too_much_tox" //End gas alerts -/obj/screen/alert/fat +/atom/movable/screen/alert/fat name = "Fat" desc = "You ate too much food, lardass. Run around the station and lose some weight." icon_state = "fat" -/obj/screen/alert/hungry +/atom/movable/screen/alert/hungry name = "Hungry" desc = "Some food would be good right about now." icon_state = "hungry" -/obj/screen/alert/starving +/atom/movable/screen/alert/starving name = "Starving" desc = "You're severely malnourished. The hunger pains make moving around a chore." icon_state = "starving" -/obj/screen/alert/gross +/atom/movable/screen/alert/gross name = "Grossed out." desc = "That was kind of gross..." icon_state = "gross" -/obj/screen/alert/verygross +/atom/movable/screen/alert/verygross name = "Very grossed out." desc = "You're not feeling very well..." icon_state = "gross2" -/obj/screen/alert/disgusted +/atom/movable/screen/alert/disgusted name = "DISGUSTED" desc = "ABSOLUTELY DISGUSTIN'" icon_state = "gross3" -/obj/screen/alert/hot +/atom/movable/screen/alert/hot name = "Too Hot" desc = "You're flaming hot! Get somewhere cooler and take off any insulating clothing like a fire suit." icon_state = "hot" -/obj/screen/alert/cold +/atom/movable/screen/alert/cold name = "Too Cold" desc = "You're freezing cold! Get somewhere warmer and take off any insulating clothing like a space suit." icon_state = "cold" -/obj/screen/alert/lowpressure +/atom/movable/screen/alert/lowpressure name = "Low Pressure" desc = "The air around you is hazardously thin. A space suit would protect you." icon_state = "lowpressure" -/obj/screen/alert/highpressure +/atom/movable/screen/alert/highpressure name = "High Pressure" desc = "The air around you is hazardously thick. A fire suit would protect you." icon_state = "highpressure" -/obj/screen/alert/blind +/atom/movable/screen/alert/blind name = "Blind" desc = "You can't see! This may be caused by a genetic defect, eye trauma, being unconscious, \ or something covering your eyes." icon_state = "blind" -/obj/screen/alert/high +/atom/movable/screen/alert/high name = "High" desc = "Whoa man, you're tripping balls! Careful you don't get addicted... if you aren't already." icon_state = "high" -/obj/screen/alert/hypnosis +/atom/movable/screen/alert/hypnosis name = "Hypnosis" desc = "Something's hypnotizing you, but you're not really sure about what." icon_state = "hypnosis" var/phrase -/obj/screen/alert/mind_control +/atom/movable/screen/alert/mind_control name = "Mind Control" desc = "Your mind has been hijacked! Click to view the mind control command." icon_state = "mind_control" var/command -/obj/screen/alert/mind_control/Click() +/atom/movable/screen/alert/mind_control/Click() var/mob/living/L = usr if(L != owner) return to_chat(L, "[command]") -/obj/screen/alert/drunk //Not implemented +/atom/movable/screen/alert/drunk //Not implemented name = "Drunk" desc = "All that alcohol you've been drinking is impairing your speech, motor skills, and mental cognition. Make sure to act like it." icon_state = "drunk" -/obj/screen/alert/embeddedobject +/atom/movable/screen/alert/embeddedobject name = "Embedded Object" desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \ If you're feeling frisky, examine yourself and click the underlined item to pull the object out." icon_state = "embeddedobject" -/obj/screen/alert/embeddedobject/Click() +/atom/movable/screen/alert/embeddedobject/Click() if(isliving(usr) && usr == owner) - var/mob/living/carbon/human/M = usr + var/mob/living/carbon/M = usr return M.help_shake_act(M) -/obj/screen/alert/weightless +/atom/movable/screen/alert/weightless name = "Weightless" desc = "Gravity has ceased affecting you, and you're floating around aimlessly. You'll need something large and heavy, like a \ wall or lattice, to push yourself off if you want to move. A jetpack would enable free range of motion. A pair of \ @@ -255,22 +255,22 @@ magboots would let you walk around normally on the floor. Barring those, you can or shoot a gun to move around via Newton's 3rd Law of Motion." icon_state = "weightless" -/obj/screen/alert/highgravity +/atom/movable/screen/alert/highgravity name = "High Gravity" desc = "You're getting crushed by high gravity, picking up items and movement will be slowed." icon_state = "paralysis" -/obj/screen/alert/veryhighgravity +/atom/movable/screen/alert/veryhighgravity name = "Crushing Gravity" desc = "You're getting crushed by high gravity, picking up items and movement will be slowed. You'll also accumulate brute damage!" icon_state = "paralysis" -/obj/screen/alert/fire +/atom/movable/screen/alert/fire name = "On Fire" desc = "You're on fire. Stop, drop and roll to put the fire out or move to a vacuum area." icon_state = "fire" -/obj/screen/alert/fire/Click() +/atom/movable/screen/alert/fire/Click() var/mob/living/L = usr if(!istype(L) || !L.can_resist() || L != owner) return @@ -278,23 +278,70 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." if(L.mobility_flags & MOBILITY_MOVE) return L.resist_fire() //I just want to start a flame in your hearrrrrrtttttt. +/** + * Handles assigning most of the variables for the alert that pops up when an item is offered + * + * Handles setting the name, description and icon of the alert and tracking the person giving + * and the item being offered, also registers a signal that removes the alert from anyone who moves away from the giver + * Arguments: + * * taker - The person receiving the alert + * * giver - The person giving the alert and item + * * receiving - The item being given by the giver + */ + +/atom/movable/screen/alert/give // information set when the give alert is made + icon_state = "default" + var/mob/living/carbon/giver + var/mob/living/carbon/taker + var/obj/item/receiving + +/atom/movable/screen/alert/give/proc/setup(mob/living/carbon/taker, mob/living/carbon/giver, obj/item/receiving) + name = "[giver] is offering [receiving]" + desc = "[giver] is offering [receiving]. Click this alert to take it." + icon_state = "template" + cut_overlays() + add_overlay(receiving) + src.receiving = receiving + src.giver = giver + src.taker = taker + RegisterSignal(giver, COMSIG_MOVABLE_MOVED, .proc/check_in_range) + RegisterSignal(taker, COMSIG_MOVABLE_MOVED, .proc/check_in_range) + +/atom/movable/screen/alert/give/proc/check_in_range() + SIGNAL_HANDLER // doesn't actually sleep since the only thing below which can sleep is CheckToolReach() which returns FALSE before coming that far. + + + if (!usr.CanReach(giver)) + to_chat(giver, "[taker] moved out of range of you!") + to_chat(taker, "You moved out of range of [giver]!") + owner.clear_alert("[giver]") + else if (!usr.CanReach(taker)) + to_chat(giver, "You moved out of range of [taker]!") + to_chat(taker, "[giver] moved out of range of you!") + owner.clear_alert("[giver]") + +/atom/movable/screen/alert/give/Click(location, control, params) + . = ..() + if(!iscarbon(usr)) + CRASH("User for [src] is of type \[[usr.type]\]. This should never happen.") + taker.take(giver, receiving) //ALIENS -/obj/screen/alert/alien_tox +/atom/movable/screen/alert/alien_tox name = "Plasma" desc = "There's flammable plasma in the air. If it lights up, you'll be toast." icon_state = "alien_tox" alerttooltipstyle = "alien" -/obj/screen/alert/alien_fire +/atom/movable/screen/alert/alien_fire // This alert is temporarily gonna be thrown for all hot air but one day it will be used for literally being on fire name = "Too Hot" desc = "It's too hot! Flee to space or at least away from the flames. Standing on weeds will heal you." icon_state = "alien_fire" alerttooltipstyle = "alien" -/obj/screen/alert/alien_vulnerable +/atom/movable/screen/alert/alien_vulnerable name = "Severed Matriarchy" desc = "Your queen has been killed, you will suffer movement penalties and loss of hivemind. A new queen cannot be made until you recover." icon_state = "alien_noqueen" @@ -302,7 +349,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." //BLOBS -/obj/screen/alert/nofactory +/atom/movable/screen/alert/nofactory name = "No Factory" desc = "You have no factory, and are slowly dying!" icon_state = "blobbernaut_nofactory" @@ -310,7 +357,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." // BLOODCULT -/obj/screen/alert/bloodsense +/atom/movable/screen/alert/bloodsense name = "Blood Sense" desc = "Allows you to sense blood that is manipulated by dark magicks." icon_state = "cult_sense" @@ -319,17 +366,17 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." var/angle = 0 var/mob/living/simple_animal/hostile/construct/Cviewer = null -/obj/screen/alert/bloodsense/Initialize() +/atom/movable/screen/alert/bloodsense/Initialize() . = ..() narnar = new('icons/mob/screen_alert.dmi', "mini_nar") START_PROCESSING(SSprocessing, src) -/obj/screen/alert/bloodsense/Destroy() +/atom/movable/screen/alert/bloodsense/Destroy() Cviewer = null STOP_PROCESSING(SSprocessing, src) return ..() -/obj/screen/alert/bloodsense/process() +/atom/movable/screen/alert/bloodsense/process() var/atom/blood_target if(!owner.mind) @@ -373,7 +420,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." return var/turf/P = get_turf(blood_target) var/turf/Q = get_turf(owner) - if(!P || !Q || (P.z != Q.z)) //The target is on a different Z level, we cannot sense that far. + if(!P || !Q || (P.get_virtual_z_level()!= Q.get_virtual_z_level())) //The target is on a different Z level, we cannot sense that far. icon_state = "runed_sense2" desc = "You can no longer sense your target's presence." return @@ -417,21 +464,21 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." animate(src, transform = final, time = 5, loop = 0) //CLOCKCULT -/obj/screen/alert/clockwork/clocksense +/atom/movable/screen/alert/clockwork/clocksense name = "The Ark of the Clockwork Justicar" desc = "Shows infomation about the Ark of the Clockwork Justicar" icon_state = "clockinfo" alerttooltipstyle = "clockcult" -/obj/screen/alert/clockwork/clocksense/Initialize() +/atom/movable/screen/alert/clockwork/clocksense/Initialize() . = ..() START_PROCESSING(SSprocessing, src) -/obj/screen/alert/clockwork/clocksense/Destroy() - . = ..() +/atom/movable/screen/alert/clockwork/clocksense/Destroy() STOP_PROCESSING(SSprocessing, src) + return ..() -/obj/screen/alert/clockwork/clocksense/process() +/atom/movable/screen/alert/clockwork/clocksense/process() var/datum/antagonist/servant_of_ratvar/servant_antagonist = is_servant_of_ratvar(owner) if(!(servant_antagonist?.team)) return @@ -442,26 +489,26 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." desc += "The Ark is preparing to open, it will activate in [round((GLOB.ratvar_arrival_tick - world.time - 6000) / 10)] seconds.
" else desc += "Ratvar will rise in [round((GLOB.ratvar_arrival_tick - world.time) / 10)] seconds, protect the Ark with your life!
" - if(GLOB.servants_of_ratvar) - desc += "There [GLOB.servants_of_ratvar.len == 1?"is" : "are"] currently [GLOB.servants_of_ratvar.len] loyal servant[GLOB.servants_of_ratvar.len == 1 ? "" : "s"].
" + if(GLOB.human_servants_of_ratvar) + desc += "There [GLOB.human_servants_of_ratvar.len == 1?"is" : "are"] currently [GLOB.human_servants_of_ratvar.len] loyal servant\s.
" if(GLOB.critical_servant_count) - desc += "Upon reaching [GLOB.critical_servant_count] the Ark will open, or it can be opened immediately by invoking Gateway Activation with 6 servants." + desc += "Upon reaching [GLOB.critical_servant_count] servants, the Ark will open, or it can be opened immediately by invoking Gateway Activation with 6 servants." //GUARDIANS -/obj/screen/alert/cancharge +/atom/movable/screen/alert/cancharge name = "Charge Ready" desc = "You are ready to charge at a location!" icon_state = "guardian_charge" alerttooltipstyle = "parasite" -/obj/screen/alert/canstealth +/atom/movable/screen/alert/canstealth name = "Stealth Ready" desc = "You are ready to enter stealth!" icon_state = "guardian_canstealth" alerttooltipstyle = "parasite" -/obj/screen/alert/instealth +/atom/movable/screen/alert/instealth name = "In Stealth" desc = "You are in stealth and your next attack will do bonus damage!" icon_state = "guardian_instealth" @@ -469,54 +516,54 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." //SILICONS -/obj/screen/alert/nocell +/atom/movable/screen/alert/nocell name = "Missing Power Cell" desc = "Unit has no power cell. No modules available until a power cell is reinstalled. Robotics may provide assistance." icon_state = "nocell" -/obj/screen/alert/emptycell +/atom/movable/screen/alert/emptycell name = "Out of Power" desc = "Unit's power cell has no charge remaining. No modules available until power cell is recharged. \ Recharging stations are available in robotics, the dormitory bathrooms, and the AI satellite." icon_state = "emptycell" -/obj/screen/alert/lowcell +/atom/movable/screen/alert/lowcell name = "Low Charge" desc = "Unit's power cell is running low. Recharging stations are available in robotics, the dormitory bathrooms, and the AI satellite." icon_state = "lowcell" //Ethereal -/obj/screen/alert/etherealcharge +/atom/movable/screen/alert/etherealcharge name = "Low Blood Charge" desc = "Your blood's electric charge is running low, find a source of charge for your blood. Use a recharging station found in robotics or the dormitory bathrooms, or eat some Ethereal-friendly food." icon_state = "etherealcharge" //Need to cover all use cases - emag, illegal upgrade module, malf AI hack, traitor cyborg -/obj/screen/alert/hacked +/atom/movable/screen/alert/hacked name = "Hacked" desc = "Hazardous non-standard equipment detected. Please ensure any usage of this equipment is in line with unit's laws, if any." icon_state = "hacked" -/obj/screen/alert/ratvar +/atom/movable/screen/alert/ratvar name = "Eternal Servitude" desc = "Hazardous functions detected, sentience prohibation drivers offline. Glory to Rat'var." icon_state = "ratvar_hack" -/obj/screen/alert/locked +/atom/movable/screen/alert/locked name = "Locked Down" desc = "Unit has been remotely locked down. Usage of a Robotics Control Console like the one in the Research Director's \ office by your AI master or any qualified human may resolve this matter. Robotics may provide further assistance if necessary." icon_state = "locked" -/obj/screen/alert/newlaw +/atom/movable/screen/alert/newlaw name = "Law Update" desc = "Laws have potentially been uploaded to or removed from this unit. Please be aware of any changes \ so as to remain in compliance with the most up-to-date laws." icon_state = "newlaw" timeout = 300 -/obj/screen/alert/hackingapc +/atom/movable/screen/alert/hackingapc name = "Hacking APC" desc = "An Area Power Controller is being hacked. When the process is \ complete, you will have exclusive control of it, and you will gain \ @@ -525,7 +572,7 @@ so as to remain in compliance with the most up-to-date laws." timeout = 600 var/atom/target = null -/obj/screen/alert/hackingapc/Click() +/atom/movable/screen/alert/hackingapc/Click() if(!usr || !usr.client || usr != owner) return if(!target) @@ -537,7 +584,7 @@ so as to remain in compliance with the most up-to-date laws." //MECHS -/obj/screen/alert/low_mech_integrity +/atom/movable/screen/alert/low_mech_integrity name = "Mech Damaged" desc = "Mech integrity is low." icon_state = "low_mech_integrity" @@ -545,19 +592,19 @@ so as to remain in compliance with the most up-to-date laws." //GHOSTS //TODO: expand this system to replace the pollCandidates/CheckAntagonist/"choose quickly"/etc Yes/No messages -/obj/screen/alert/notify_cloning +/atom/movable/screen/alert/notify_cloning name = "Revival" desc = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!" icon_state = "template" timeout = 300 -/obj/screen/alert/notify_cloning/Click() +/atom/movable/screen/alert/notify_cloning/Click() if(!usr || !usr.client || usr != owner) return var/mob/dead/observer/G = usr G.reenter_corpse() -/obj/screen/alert/notify_action +/atom/movable/screen/alert/notify_action name = "Body created" desc = "A body was created. You can enter it." icon_state = "template" @@ -565,7 +612,7 @@ so as to remain in compliance with the most up-to-date laws." var/atom/target = null var/action = NOTIFY_JUMP -/obj/screen/alert/notify_action/Click() +/atom/movable/screen/alert/notify_action/Click() if(!usr || !usr.client || usr != owner) return if(!target) @@ -585,20 +632,20 @@ so as to remain in compliance with the most up-to-date laws." //OBJECT-BASED -/obj/screen/alert/restrained/buckled +/atom/movable/screen/alert/restrained/buckled name = "Buckled" desc = "You've been buckled to something. Click the alert to unbuckle unless you're handcuffed." icon_state = "buckled" -/obj/screen/alert/restrained/handcuffed +/atom/movable/screen/alert/restrained/handcuffed name = "Handcuffed" desc = "You're handcuffed and can't act. If anyone drags you, you won't be able to move. Click the alert to free yourself." -/obj/screen/alert/restrained/legcuffed +/atom/movable/screen/alert/restrained/legcuffed name = "Legcuffed" desc = "You're legcuffed, which slows you down considerably. Click the alert to free yourself." -/obj/screen/alert/restrained/Click() +/atom/movable/screen/alert/restrained/Click() var/mob/living/L = usr if(!istype(L) || !L.can_resist() || L != owner) return @@ -606,7 +653,7 @@ so as to remain in compliance with the most up-to-date laws." if((L.mobility_flags & MOBILITY_MOVE) && (L.last_special <= world.time)) return L.resist_restraints() -/obj/screen/alert/restrained/buckled/Click() +/atom/movable/screen/alert/restrained/buckled/Click() var/mob/living/L = usr if(!istype(L) || !L.can_resist() || L != owner) return @@ -627,7 +674,7 @@ so as to remain in compliance with the most up-to-date laws." screenmob.client.screen -= alerts[alerts[i]] return 1 for(var/i = 1, i <= alerts.len, i++) - var/obj/screen/alert/alert = alerts[alerts[i]] + var/atom/movable/screen/alert/alert = alerts[alerts[i]] if(alert.icon_state == "template") alert.icon = ui_style switch(i) @@ -651,9 +698,9 @@ so as to remain in compliance with the most up-to-date laws." return 1 /mob - var/list/alerts = list() // contains /obj/screen/alert only // On /mob so clientless mobs will throw alerts properly + var/list/alerts = list() // contains /atom/movable/screen/alert only // On /mob so clientless mobs will throw alerts properly -/obj/screen/alert/Click(location, control, params) +/atom/movable/screen/alert/Click(location, control, params) if(!usr || !usr.client) return var/paramslist = params2list(params) @@ -665,9 +712,8 @@ so as to remain in compliance with the most up-to-date laws." if(master) return usr.client.Click(master, location, control, params) -/obj/screen/alert/Destroy() - . = ..() +/atom/movable/screen/alert/Destroy() severity = 0 - master = null owner = null screen_loc = "" + return ..() diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 97f3e5f567f48..8343a4a1ba534 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -1,23 +1,23 @@ -/obj/screen/alien +/atom/movable/screen/alien icon = 'icons/mob/screen_alien.dmi' -/obj/screen/alien/leap +/atom/movable/screen/alien/leap name = "toggle leap" icon_state = "leap_off" -/obj/screen/alien/leap/Click() +/atom/movable/screen/alien/leap/Click() if(isalienhunter(usr)) var/mob/living/carbon/alien/humanoid/hunter/AH = usr AH.toggle_leap() -/obj/screen/alien/plasma_display +/atom/movable/screen/alien/plasma_display icon = 'icons/mob/screen_gen.dmi' icon_state = "power_display2" name = "plasma stored" screen_loc = ui_alienplasmadisplay -/obj/screen/alien/alien_queen_finder +/atom/movable/screen/alien/alien_queen_finder icon = 'icons/mob/screen_alien.dmi' icon_state = "queen_finder" name = "queen sense" @@ -30,7 +30,7 @@ /datum/hud/alien/New(mob/living/carbon/alien/humanoid/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using //equippable shit @@ -39,21 +39,21 @@ //begin buttons - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_1" using.screen_loc = ui_swaphand_position(owner,1) using.hud = src static_inventory += using - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) using.hud = src static_inventory += using - using = new /obj/screen/act_intent/alien() + using = new /atom/movable/screen/act_intent/alien() using.icon_state = mymob.a_intent using.hud = src static_inventory += using @@ -61,34 +61,34 @@ if(isalienhunter(mymob)) var/mob/living/carbon/alien/humanoid/hunter/H = mymob - H.leap_icon = new /obj/screen/alien/leap() + H.leap_icon = new /atom/movable/screen/alien/leap() H.leap_icon.screen_loc = ui_alien_storage_r static_inventory += H.leap_icon - using = new/obj/screen/language_menu + using = new/atom/movable/screen/language_menu using.screen_loc = ui_alien_language_menu using.hud = src static_inventory += using - using = new /obj/screen/drop() + using = new /atom/movable/screen/drop() using.icon = ui_style using.screen_loc = ui_drop_throw using.hud = src static_inventory += using - using = new /obj/screen/resist() + using = new /atom/movable/screen/resist() using.icon = ui_style using.screen_loc = ui_above_movement using.hud = src hotkeybuttons += using - throw_icon = new /obj/screen/throw_catch() + throw_icon = new /atom/movable/screen/throw_catch() throw_icon.icon = ui_style throw_icon.screen_loc = ui_drop_throw throw_icon.hud = src hotkeybuttons += throw_icon - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.update_icon() pull_icon.screen_loc = ui_above_movement @@ -97,28 +97,28 @@ //begin indicators - healths = new /obj/screen/healths/alien() + healths = new /atom/movable/screen/healths/alien() healths.hud = src infodisplay += healths - alien_plasma_display = new /obj/screen/alien/plasma_display() + alien_plasma_display = new /atom/movable/screen/alien/plasma_display() alien_plasma_display.hud = src infodisplay += alien_plasma_display if(!isalienqueen(mymob)) - alien_queen_finder = new /obj/screen/alien/alien_queen_finder + alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder alien_queen_finder.hud = src infodisplay += alien_queen_finder - zone_select = new /obj/screen/zone_sel/alien() + zone_select = new /atom/movable/screen/zone_sel/alien() zone_select.hud = src zone_select.update_icon() static_inventory += zone_select - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src - inv_slots[inv.slot_id] = inv + inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv inv.update_icon() /datum/hud/alien/persistent_inventory_update() diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index f9ac0a58e0473..b12f5503a60b9 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -3,35 +3,35 @@ /datum/hud/larva/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - using = new /obj/screen/act_intent/alien() + using = new /atom/movable/screen/act_intent/alien() using.icon_state = mymob.a_intent using.hud = src static_inventory += using action_intent = using - healths = new /obj/screen/healths/alien() + healths = new /atom/movable/screen/healths/alien() healths.hud = src infodisplay += healths - alien_queen_finder = new /obj/screen/alien/alien_queen_finder() + alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder() alien_queen_finder.hud = src infodisplay += alien_queen_finder - - pull_icon = new /obj/screen/pull() + + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = 'icons/mob/screen_alien.dmi' pull_icon.update_icon() pull_icon.screen_loc = ui_above_movement pull_icon.hud = src hotkeybuttons += pull_icon - using = new/obj/screen/language_menu + using = new/atom/movable/screen/language_menu using.screen_loc = ui_alien_language_menu using.hud = src static_inventory += using - zone_select = new /obj/screen/zone_sel/alien() + zone_select = new /atom/movable/screen/zone_sel/alien() zone_select.update_icon() zone_select.hud = src static_inventory += zone_select diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm index d633c3e3c5123..b1da33635fdd0 100644 --- a/code/_onclick/hud/blob_overmind.dm +++ b/code/_onclick/hud/blob_overmind.dm @@ -1,39 +1,39 @@ -/obj/screen/blob +/atom/movable/screen/blob icon = 'icons/mob/blob.dmi' -/obj/screen/blob/MouseEntered(location,control,params) +/atom/movable/screen/blob/MouseEntered(location,control,params) openToolTip(usr,src,params,title = name,content = desc, theme = "blob") -/obj/screen/blob/MouseExited() +/atom/movable/screen/blob/MouseExited() closeToolTip(usr) -/obj/screen/blob/BlobHelp +/atom/movable/screen/blob/BlobHelp icon_state = "ui_help" name = "Blob Help" desc = "Help on playing blob!" -/obj/screen/blob/BlobHelp/Click() +/atom/movable/screen/blob/BlobHelp/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.blob_help() -/obj/screen/blob/JumpToNode +/atom/movable/screen/blob/JumpToNode icon_state = "ui_tonode" name = "Jump to Node" desc = "Moves your camera to a selected blob node." -/obj/screen/blob/JumpToNode/Click() +/atom/movable/screen/blob/JumpToNode/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.jump_to_node() -/obj/screen/blob/JumpToCore +/atom/movable/screen/blob/JumpToCore icon_state = "ui_tocore" name = "Jump to Core" desc = "Moves your camera to your blob core." -/obj/screen/blob/JumpToCore/MouseEntered(location,control,params) +/atom/movable/screen/blob/JumpToCore/MouseEntered(location,control,params) if(hud?.mymob && isovermind(hud.mymob)) var/mob/camera/blob/B = hud.mymob if(!B.placed) @@ -44,89 +44,89 @@ desc = initial(desc) ..() -/obj/screen/blob/JumpToCore/Click() +/atom/movable/screen/blob/JumpToCore/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr if(!B.placed) B.place_blob_core(0) B.transport_core() -/obj/screen/blob/Blobbernaut +/atom/movable/screen/blob/Blobbernaut icon_state = "ui_blobbernaut" name = "Produce Blobbernaut (40)" desc = "Produces a strong, smart blobbernaut from a factory blob for 40 resources.
The factory blob used will become fragile and unable to produce spores." -/obj/screen/blob/Blobbernaut/Click() +/atom/movable/screen/blob/Blobbernaut/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.create_blobbernaut() -/obj/screen/blob/ResourceBlob +/atom/movable/screen/blob/ResourceBlob icon_state = "ui_resource" name = "Produce Resource Blob (40)" desc = "Produces a resource blob for 40 resources.
Resource blobs will give you resources every few seconds." -/obj/screen/blob/ResourceBlob/Click() +/atom/movable/screen/blob/ResourceBlob/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.create_resource() -/obj/screen/blob/NodeBlob +/atom/movable/screen/blob/NodeBlob icon_state = "ui_node" name = "Produce Node Blob (50)" desc = "Produces a node blob for 50 resources.
Node blobs will expand and activate nearby resource and factory blobs." -/obj/screen/blob/NodeBlob/Click() +/atom/movable/screen/blob/NodeBlob/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.create_node() -/obj/screen/blob/FactoryBlob +/atom/movable/screen/blob/FactoryBlob icon_state = "ui_factory" name = "Produce Factory Blob (60)" desc = "Produces a factory blob for 60 resources.
Factory blobs will produce spores every few seconds." -/obj/screen/blob/FactoryBlob/Click() +/atom/movable/screen/blob/FactoryBlob/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.create_factory() -/obj/screen/blob/ReadaptStrain +/atom/movable/screen/blob/ReadaptStrain icon_state = "ui_chemswap" - name = "Readapt Strain (40)" + name = "Readapt Strain" desc = "Allows you to choose a new strain from 4 random choices for 40 resources." -/obj/screen/blob/ReadaptStrain/MouseEntered(location,control,params) +/atom/movable/screen/blob/ReadaptStrain/MouseEntered(location,control,params) if(hud && hud.mymob && isovermind(hud.mymob)) var/mob/camera/blob/B = hud.mymob if(B.free_strain_rerolls) - name = "Readapt Strain (FREE)" + name = "[initial(name)] (FREE)" desc = "Randomly rerolls your strain for free." else - name = initial(name) + name = "[initial(name)] ([BLOB_REROLL_COST])" desc = initial(desc) ..() -/obj/screen/blob/ReadaptStrain/Click() +/atom/movable/screen/blob/ReadaptStrain/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.strain_reroll() -/obj/screen/blob/RelocateCore +/atom/movable/screen/blob/RelocateCore icon_state = "ui_swap" name = "Relocate Core (80)" desc = "Swaps a node and your core for 80 resources." -/obj/screen/blob/RelocateCore/Click() +/atom/movable/screen/blob/RelocateCore/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.relocate_core() /datum/hud/blob_overmind/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - blobpwrdisplay = new /obj/screen() + blobpwrdisplay = new /atom/movable/screen() blobpwrdisplay.name = "blob power" blobpwrdisplay.icon_state = "block" blobpwrdisplay.screen_loc = ui_health @@ -136,51 +136,51 @@ blobpwrdisplay.hud = src infodisplay += blobpwrdisplay - healths = new /obj/screen/healths/blob() + healths = new /atom/movable/screen/healths/blob() healths.hud = src infodisplay += healths - using = new /obj/screen/blob/BlobHelp() + using = new /atom/movable/screen/blob/BlobHelp() using.screen_loc = "WEST:6,NORTH:-3" using.hud = src static_inventory += using - using = new /obj/screen/blob/JumpToNode() + using = new /atom/movable/screen/blob/JumpToNode() using.screen_loc = ui_inventory using.hud = src static_inventory += using - using = new /obj/screen/blob/JumpToCore() + using = new /atom/movable/screen/blob/JumpToCore() using.screen_loc = ui_zonesel using.hud = src static_inventory += using - using = new /obj/screen/blob/Blobbernaut() + using = new /atom/movable/screen/blob/Blobbernaut() using.screen_loc = ui_belt using.hud = src static_inventory += using - using = new /obj/screen/blob/ResourceBlob() + using = new /atom/movable/screen/blob/ResourceBlob() using.screen_loc = ui_back using.hud = src static_inventory += using - using = new /obj/screen/blob/NodeBlob() + using = new /atom/movable/screen/blob/NodeBlob() using.screen_loc = ui_hand_position(2) using.hud = src static_inventory += using - using = new /obj/screen/blob/FactoryBlob() + using = new /atom/movable/screen/blob/FactoryBlob() using.screen_loc = ui_hand_position(1) using.hud = src static_inventory += using - using = new /obj/screen/blob/ReadaptStrain() + using = new /atom/movable/screen/blob/ReadaptStrain() using.screen_loc = ui_storage1 using.hud = src static_inventory += using - using = new /obj/screen/blob/RelocateCore() + using = new /atom/movable/screen/blob/RelocateCore() using.screen_loc = ui_storage2 using.hud = src static_inventory += using diff --git a/code/_onclick/hud/blobbernauthud.dm b/code/_onclick/hud/blobbernauthud.dm index ed45d5b1f6f26..430e8e81e7f89 100644 --- a/code/_onclick/hud/blobbernauthud.dm +++ b/code/_onclick/hud/blobbernauthud.dm @@ -2,10 +2,10 @@ /datum/hud/blobbernaut/New(mob/owner) ..() - blobpwrdisplay = new /obj/screen/healths/blob/naut/core() + blobpwrdisplay = new /atom/movable/screen/healths/blob/naut/core() blobpwrdisplay.hud = src infodisplay += blobpwrdisplay - healths = new /obj/screen/healths/blob/naut() + healths = new /atom/movable/screen/healths/blob/naut() healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/constructs.dm b/code/_onclick/hud/constructs.dm index d896101300301..9a5babbdb8bed 100644 --- a/code/_onclick/hud/constructs.dm +++ b/code/_onclick/hud/constructs.dm @@ -3,13 +3,13 @@ /datum/hud/constructs/New(mob/owner) ..() - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.update_icon() pull_icon.screen_loc = ui_construct_pull pull_icon.hud = src static_inventory += pull_icon - healths = new /obj/screen/healths/construct() + healths = new /atom/movable/screen/healths/construct() healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/credits.dm b/code/_onclick/hud/credits.dm index 14a9dc2919e2f..f008114aa192a 100644 --- a/code/_onclick/hud/credits.dm +++ b/code/_onclick/hud/credits.dm @@ -12,6 +12,14 @@ GLOBAL_LIST(end_titles) GLOB.end_titles += "
" GLOB.end_titles += "
" + if(GLOB.soundtrack_this_round.len) + GLOB.end_titles += "

Music Credits

" + for(var/song_path in GLOB.soundtrack_this_round) + var/datum/soundtrack_song/song = song_path + GLOB.end_titles += "

[sanitize(initial(song.artist))] - \"[sanitize(initial(song.title))]\" ([sanitize(initial(song.album))])

" + GLOB.end_titles += "
" + GLOB.end_titles += "
" + if(GLOB.patrons.len) GLOB.end_titles += "

Thank you to our patrons!

" for(var/patron in GLOB.patrons) @@ -30,7 +38,7 @@ GLOBAL_LIST(end_titles) GLOB.end_titles += "

Thanks for playing!

" for(var/client/C in GLOB.clients) if(C.prefs.show_credits) - C.screen += new /obj/screen/credit/title_card(null, null, SSticker.mode.title_icon) + C.screen += new /atom/movable/screen/credit/title_card(null, null, SSticker.mode.title_icon) sleep(CREDIT_SPAWN_SPEED * 3) for(var/i in 1 to GLOB.end_titles.len) var/C = GLOB.end_titles[i] @@ -42,9 +50,9 @@ GLOBAL_LIST(end_titles) /proc/create_credit(credit) - new /obj/screen/credit(null, credit) + new /atom/movable/screen/credit(null, credit) -/obj/screen/credit +/atom/movable/screen/credit icon_state = "blank" mouse_opacity = MOUSE_OPACITY_TRANSPARENT alpha = 0 @@ -52,9 +60,9 @@ GLOBAL_LIST(end_titles) layer = SPLASHSCREEN_LAYER var/matrix/target -/obj/screen/credit/Initialize(mapload, credited) +/atom/movable/screen/credit/Initialize(mapload, credited) . = ..() - maptext = "[credited]" + maptext = MAPTEXT("[credited]") maptext_height = world.icon_size * 2 maptext_width = world.icon_size * 13 var/matrix/M = matrix(transform) @@ -65,20 +73,20 @@ GLOBAL_LIST(end_titles) INVOKE_ASYNC(src, .proc/add_to_clients) QDEL_IN(src, CREDIT_ROLL_SPEED) -/obj/screen/credit/proc/add_to_clients() +/atom/movable/screen/credit/proc/add_to_clients() for(var/client/C in GLOB.clients) if(C.prefs.show_credits) C.screen += src -/obj/screen/credit/Destroy() +/atom/movable/screen/credit/Destroy() screen_loc = null return ..() -/obj/screen/credit/title_card +/atom/movable/screen/credit/title_card icon = 'icons/title_cards.dmi' screen_loc = "4,1" -/obj/screen/credit/title_card/Initialize(mapload, credited, title_icon_state) +/atom/movable/screen/credit/title_card/Initialize(mapload, credited, title_icon_state) icon_state = title_icon_state . = ..() maptext = null diff --git a/code/_onclick/hud/devil.dm b/code/_onclick/hud/devil.dm index 900c807a7afed..7588a4abfcb88 100644 --- a/code/_onclick/hud/devil.dm +++ b/code/_onclick/hud/devil.dm @@ -4,15 +4,15 @@ /datum/hud/devil/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - using = new /obj/screen/drop() + using = new /atom/movable/screen/drop() using.icon = ui_style using.screen_loc = ui_drone_drop using.hud = src static_inventory += using - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.update_icon() pull_icon.screen_loc = ui_drone_pull @@ -21,7 +21,7 @@ build_hand_slots() - using = new /obj/screen/inventory() + using = new /atom/movable/screen/inventory() using.name = "hand" using.icon = ui_style using.icon_state = "swap_1_m" @@ -31,7 +31,7 @@ using.hud = src static_inventory += using - using = new /obj/screen/inventory() + using = new /atom/movable/screen/inventory() using.name = "hand" using.icon = ui_style using.icon_state = "swap_2" @@ -41,15 +41,15 @@ using.hud = src static_inventory += using - zone_select = new /obj/screen/zone_sel() + zone_select = new /atom/movable/screen/zone_sel() zone_select.icon = ui_style zone_select.hud = src zone_select.update_icon() - lingchemdisplay = new /obj/screen/ling/chems() + lingchemdisplay = new /atom/movable/screen/ling/chems() lingchemdisplay.hud = src - devilsouldisplay = new /obj/screen/devil/soul_counter + devilsouldisplay = new /atom/movable/screen/devil/soul_counter devilsouldisplay.hud = src infodisplay += devilsouldisplay diff --git a/code/_onclick/hud/drones.dm b/code/_onclick/hud/drones.dm index 3a6b7511136ab..06d6e239df7e8 100644 --- a/code/_onclick/hud/drones.dm +++ b/code/_onclick/hud/drones.dm @@ -1,31 +1,31 @@ /datum/hud/dextrous/drone/New(mob/owner) ..() - var/obj/screen/inventory/inv_box + var/atom/movable/screen/inventory/inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "internal storage" inv_box.icon = ui_style inv_box.icon_state = "suit_storage" // inv_box.icon_full = "template" inv_box.screen_loc = ui_drone_storage - inv_box.slot_id = SLOT_GENERC_DEXTROUS_STORAGE + inv_box.slot_id = ITEM_SLOT_DEX_STORAGE inv_box.hud = src static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "head/mask" inv_box.icon = ui_style inv_box.icon_state = "mask" // inv_box.icon_full = "template" inv_box.screen_loc = ui_drone_head - inv_box.slot_id = SLOT_HEAD + inv_box.slot_id = ITEM_SLOT_HEAD inv_box.hud = src static_inventory += inv_box - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src - inv_slots[inv.slot_id] = inv + inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv inv.update_icon() diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 10317125b4d0d..c4f9275883757 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -3,7 +3,7 @@ var/list/screens = list() /mob/proc/overlay_fullscreen(category, type, severity) - var/obj/screen/fullscreen/screen = screens[category] + var/atom/movable/screen/fullscreen/screen = screens[category] if (!screen || screen.type != type) // needs to be recreated clear_fullscreen(category, FALSE) @@ -21,7 +21,7 @@ return screen /mob/proc/clear_fullscreen(category, animated = 10) - var/obj/screen/fullscreen/screen = screens[category] + var/atom/movable/screen/fullscreen/screen = screens[category] if(!screen) return @@ -35,7 +35,7 @@ client.screen -= screen qdel(screen) -/mob/proc/clear_fullscreen_after_animate(obj/screen/fullscreen/screen) +/mob/proc/clear_fullscreen_after_animate(atom/movable/screen/fullscreen/screen) if(client) client.screen -= screen qdel(screen) @@ -51,7 +51,7 @@ /mob/proc/reload_fullscreen() if(client) - var/obj/screen/fullscreen/screen + var/atom/movable/screen/fullscreen/screen for(var/category in screens) screen = screens[category] if(screen.should_show_to(src)) @@ -60,7 +60,7 @@ else client.screen -= screen -/obj/screen/fullscreen +/atom/movable/screen/fullscreen icon = 'icons/mob/screen_full.dmi' icon_state = "default" screen_loc = "CENTER-7,CENTER-7" @@ -71,94 +71,94 @@ var/severity = 0 var/show_when_dead = FALSE -/obj/screen/fullscreen/proc/update_for_view(client_view) +/atom/movable/screen/fullscreen/proc/update_for_view(client_view) if (screen_loc == "CENTER-7,CENTER-7" && view != client_view) var/list/actualview = getviewsize(client_view) view = client_view transform = matrix(actualview[1]/FULLSCREEN_OVERLAY_RESOLUTION_X, 0, 0, 0, actualview[2]/FULLSCREEN_OVERLAY_RESOLUTION_Y, 0) -/obj/screen/fullscreen/proc/should_show_to(mob/mymob) +/atom/movable/screen/fullscreen/proc/should_show_to(mob/mymob) if(!show_when_dead && mymob.stat == DEAD) return FALSE return TRUE -/obj/screen/fullscreen/Destroy() +/atom/movable/screen/fullscreen/Destroy() severity = 0 . = ..() -/obj/screen/fullscreen/brute +/atom/movable/screen/fullscreen/brute icon_state = "brutedamageoverlay" layer = UI_DAMAGE_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/oxy +/atom/movable/screen/fullscreen/oxy icon_state = "oxydamageoverlay" layer = UI_DAMAGE_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/crit +/atom/movable/screen/fullscreen/crit icon_state = "passage" layer = CRIT_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/crit/vision +/atom/movable/screen/fullscreen/crit/vision icon_state = "oxydamageoverlay" layer = BLIND_LAYER -/obj/screen/fullscreen/blind +/atom/movable/screen/fullscreen/blind icon_state = "blackimageoverlay" layer = BLIND_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/curse +/atom/movable/screen/fullscreen/curse icon_state = "curse" layer = CURSE_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/hive_mc +/atom/movable/screen/fullscreen/hive_mc icon_state = "hive_mc" layer = CURSE_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/hive_eyes +/atom/movable/screen/fullscreen/hive_eyes icon_state = "hive_eyes" layer = CURSE_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/impaired +/atom/movable/screen/fullscreen/impaired icon_state = "impairedoverlay" -/obj/screen/fullscreen/flash +/atom/movable/screen/fullscreen/flash icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "flash" -/obj/screen/fullscreen/flash/static +/atom/movable/screen/fullscreen/flash/static icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "noise" -/obj/screen/fullscreen/high +/atom/movable/screen/fullscreen/high icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "druggy" -/obj/screen/fullscreen/color_vision +/atom/movable/screen/fullscreen/color_vision icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "flash" alpha = 80 -/obj/screen/fullscreen/color_vision/green +/atom/movable/screen/fullscreen/color_vision/green color = "#00ff00" -/obj/screen/fullscreen/color_vision/red +/atom/movable/screen/fullscreen/color_vision/red color = "#ff0000" -/obj/screen/fullscreen/color_vision/blue +/atom/movable/screen/fullscreen/color_vision/blue color = "#0000ff" -/obj/screen/fullscreen/lighting_backdrop +/atom/movable/screen/fullscreen/lighting_backdrop icon = 'icons/mob/screen_gen.dmi' icon_state = "flash" transform = matrix(200, 0, 0, 0, 200, 0) @@ -167,18 +167,18 @@ show_when_dead = TRUE //Provides darkness to the back of the lighting plane -/obj/screen/fullscreen/lighting_backdrop/lit +/atom/movable/screen/fullscreen/lighting_backdrop/lit invisibility = INVISIBILITY_LIGHTING layer = BACKGROUND_LAYER+21 color = "#000" show_when_dead = TRUE //Provides whiteness in case you don't see lights so everything is still visible -/obj/screen/fullscreen/lighting_backdrop/unlit +/atom/movable/screen/fullscreen/lighting_backdrop/unlit layer = BACKGROUND_LAYER+20 show_when_dead = TRUE -/obj/screen/fullscreen/see_through_darkness +/atom/movable/screen/fullscreen/see_through_darkness icon_state = "nightvision" plane = LIGHTING_PLANE layer = LIGHTING_LAYER diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm index d018c187f2826..c0e6e6a785eee 100644 --- a/code/_onclick/hud/generic_dextrous.dm +++ b/code/_onclick/hud/generic_dextrous.dm @@ -1,15 +1,15 @@ //Used for normal mobs that have hands. /datum/hud/dextrous/New(mob/living/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - using = new /obj/screen/drop() + using = new /atom/movable/screen/drop() using.icon = ui_style using.screen_loc = ui_drone_drop using.hud = src static_inventory += using - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.update_icon() pull_icon.screen_loc = ui_drone_pull @@ -18,14 +18,14 @@ build_hand_slots() - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_1_m" using.screen_loc = ui_swaphand_position(owner,1) using.hud = src static_inventory += using - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) @@ -35,32 +35,32 @@ if(mymob.possible_a_intents) if(mymob.possible_a_intents.len == 4) // All possible intents - full intent selector - action_intent = new /obj/screen/act_intent/segmented + action_intent = new /atom/movable/screen/act_intent/segmented else - action_intent = new /obj/screen/act_intent + action_intent = new /atom/movable/screen/act_intent action_intent.icon = ui_style action_intent.icon_state = mymob.a_intent action_intent.hud = src static_inventory += action_intent - zone_select = new /obj/screen/zone_sel() + zone_select = new /atom/movable/screen/zone_sel() zone_select.icon = ui_style zone_select.update_icon() zone_select.hud = src static_inventory += zone_select - using = new /obj/screen/area_creator + using = new /atom/movable/screen/area_creator using.icon = ui_style using.hud = src static_inventory += using mymob.client.screen = list() - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src - inv_slots[inv.slot_id] = inv + inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv inv.update_icon() /datum/hud/dextrous/persistent_inventory_update() diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index f67c922404e61..c5de8c24396c4 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -1,79 +1,79 @@ -/obj/screen/ghost +/atom/movable/screen/ghost icon = 'icons/mob/screen_ghost.dmi' -/obj/screen/ghost/MouseEntered() +/atom/movable/screen/ghost/MouseEntered() flick(icon_state + "_anim", src) -/obj/screen/ghost/jumptomob +/atom/movable/screen/ghost/jumptomob name = "Jump to mob" icon_state = "jumptomob" -/obj/screen/ghost/jumptomob/Click() +/atom/movable/screen/ghost/jumptomob/Click() var/mob/dead/observer/G = usr G.jumptomob() -/obj/screen/ghost/orbit +/atom/movable/screen/ghost/orbit name = "Orbit" icon_state = "orbit" -/obj/screen/ghost/orbit/Click() +/atom/movable/screen/ghost/orbit/Click() var/mob/dead/observer/G = usr G.follow() -/obj/screen/ghost/reenter_corpse +/atom/movable/screen/ghost/reenter_corpse name = "Reenter corpse" icon_state = "reenter_corpse" -/obj/screen/ghost/reenter_corpse/Click() +/atom/movable/screen/ghost/reenter_corpse/Click() var/mob/dead/observer/G = usr G.reenter_corpse() -/obj/screen/ghost/teleport +/atom/movable/screen/ghost/teleport name = "Teleport" icon_state = "teleport" -/obj/screen/ghost/teleport/Click() +/atom/movable/screen/ghost/teleport/Click() var/mob/dead/observer/G = usr G.dead_tele() -/obj/screen/ghost/pai +/atom/movable/screen/ghost/pai name = "pAI Candidate" icon_state = "pai" -/obj/screen/ghost/pai/Click() +/atom/movable/screen/ghost/pai/Click() var/mob/dead/observer/G = usr G.register_pai() /datum/hud/ghost/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - using = new /obj/screen/ghost/jumptomob() + using = new /atom/movable/screen/ghost/jumptomob() using.screen_loc = ui_ghost_jumptomob using.hud = src static_inventory += using - using = new /obj/screen/ghost/orbit() + using = new /atom/movable/screen/ghost/orbit() using.screen_loc = ui_ghost_orbit using.hud = src static_inventory += using - using = new /obj/screen/ghost/reenter_corpse() + using = new /atom/movable/screen/ghost/reenter_corpse() using.screen_loc = ui_ghost_reenter_corpse using.hud = src static_inventory += using - using = new /obj/screen/ghost/teleport() + using = new /atom/movable/screen/ghost/teleport() using.screen_loc = ui_ghost_teleport using.hud = src static_inventory += using - using = new /obj/screen/ghost/pai() + using = new /atom/movable/screen/ghost/pai() using.screen_loc = ui_ghost_pai using.hud = src static_inventory += using - using = new /obj/screen/language_menu + using = new /atom/movable/screen/language_menu using.icon = ui_style using.hud = src static_inventory += using diff --git a/code/_onclick/hud/guardian.dm b/code/_onclick/hud/guardian.dm index 47ad1117981f2..45ef8d9cf5767 100644 --- a/code/_onclick/hud/guardian.dm +++ b/code/_onclick/hud/guardian.dm @@ -1,18 +1,18 @@ /datum/hud/guardian/New(mob/living/simple_animal/hostile/guardian/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - healths = new /obj/screen/healths/guardian() + healths = new /atom/movable/screen/healths/guardian() healths.hud = src infodisplay += healths - using = new /obj/screen/guardian/Manifest() + using = new /atom/movable/screen/guardian/Manifest() using.screen_loc = ui_hand_position(2) using.hud = src static_inventory += using - using = new /obj/screen/guardian/Recall() + using = new /atom/movable/screen/guardian/Recall() using.screen_loc = ui_hand_position(1) using.hud = src static_inventory += using @@ -22,12 +22,12 @@ using.hud = src static_inventory += using - using = new /obj/screen/guardian/ToggleLight() + using = new /atom/movable/screen/guardian/ToggleLight() using.screen_loc = ui_inventory using.hud = src static_inventory += using - using = new /obj/screen/guardian/Communicate() + using = new /atom/movable/screen/guardian/Communicate() using.screen_loc = ui_back using.hud = src static_inventory += using @@ -35,41 +35,41 @@ /* /datum/hud/dextrous/guardian/New(mob/living/simple_animal/hostile/guardian/owner) //for a dextrous guardian ..() - var/obj/screen/using + var/atom/movable/screen/using if(istype(owner, /mob/living/simple_animal/hostile/guardian/dextrous)) - var/obj/screen/inventory/inv_box + var/atom/movable/screen/inventory/inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "internal storage" inv_box.icon = ui_style inv_box.icon_state = "suit_storage" inv_box.screen_loc = ui_id - inv_box.slot_id = SLOT_GENERC_DEXTROUS_STORAGE + inv_box.slot_id = ITEM_SLOT_DEX_STORAGE inv_box.hud = src static_inventory += inv_box - using = new /obj/screen/guardian/Communicate() + using = new /atom/movable/screen/guardian/Communicate() using.screen_loc = ui_sstore1 using.hud = src static_inventory += using else - using = new /obj/screen/guardian/Communicate() + using = new /atom/movable/screen/guardian/Communicate() using.screen_loc = ui_id using.hud = src static_inventory += using - healths = new /obj/screen/healths/guardian() + healths = new /atom/movable/screen/healths/guardian() healths.hud = src infodisplay += healths - using = new /obj/screen/guardian/Manifest() + using = new /atom/movable/screen/guardian/Manifest() using.screen_loc = ui_belt using.hud = src static_inventory += using - using = new /obj/screen/guardian/Recall() + using = new /atom/movable/screen/guardian/Recall() using.screen_loc = ui_back using.hud = src static_inventory += using @@ -79,7 +79,7 @@ using.hud = src static_inventory += using - using = new /obj/screen/guardian/ToggleLight() + using = new /atom/movable/screen/guardian/ToggleLight() using.screen_loc = ui_inventory using.hud = src static_inventory += using @@ -101,65 +101,65 @@ ..() */ -/obj/screen/guardian +/atom/movable/screen/guardian icon = 'icons/mob/guardian.dmi' -/obj/screen/guardian/Manifest +/atom/movable/screen/guardian/Manifest icon_state = "manifest" name = "Manifest" desc = "Spring forth into battle!" -/obj/screen/guardian/Manifest/Click() +/atom/movable/screen/guardian/Manifest/Click() if(isguardian(usr)) var/mob/living/simple_animal/hostile/guardian/G = usr G.Manifest() -/obj/screen/guardian/Recall +/atom/movable/screen/guardian/Recall icon_state = "recall" name = "Recall" desc = "Return to your user." -/obj/screen/guardian/Recall/Click() +/atom/movable/screen/guardian/Recall/Click() if(isguardian(usr)) var/mob/living/simple_animal/hostile/guardian/G = usr G.Recall() -/obj/screen/guardian/ToggleMode +/atom/movable/screen/guardian/ToggleMode icon_state = "toggle" name = "Toggle Mode" desc = "Switch between ability modes." -/obj/screen/guardian/ToggleMode/Click() +/atom/movable/screen/guardian/ToggleMode/Click() if(isguardian(usr)) var/mob/living/simple_animal/hostile/guardian/G = usr G.ToggleMode() -/obj/screen/guardian/ToggleMode/Inactive +/atom/movable/screen/guardian/ToggleMode/Inactive icon_state = "notoggle" //greyed out so it doesn't look like it'll work -/obj/screen/guardian/ToggleMode/Assassin +/atom/movable/screen/guardian/ToggleMode/Assassin icon_state = "stealth" name = "Toggle Stealth" desc = "Enter or exit stealth." -/obj/screen/guardian/Communicate +/atom/movable/screen/guardian/Communicate icon_state = "communicate" name = "Communicate" desc = "Communicate telepathically with your user." -/obj/screen/guardian/Communicate/Click() +/atom/movable/screen/guardian/Communicate/Click() if(isguardian(usr)) var/mob/living/simple_animal/hostile/guardian/G = usr G.Communicate() -/obj/screen/guardian/ToggleLight +/atom/movable/screen/guardian/ToggleLight icon_state = "light" name = "Toggle Light" desc = "Glow like star dust." -/obj/screen/guardian/ToggleLight/Click() +/atom/movable/screen/guardian/ToggleLight/Click() if(isguardian(usr)) var/mob/living/simple_animal/hostile/guardian/G = usr G.ToggleLight() diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 97cfbed381a38..d451ff2b9a763 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -25,38 +25,41 @@ GLOBAL_LIST_INIT(available_ui_styles, sortList(list( var/inventory_shown = FALSE //Equipped item inventory var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) - var/obj/screen/ling/chems/lingchemdisplay - var/obj/screen/ling/sting/lingstingdisplay + var/atom/movable/screen/ling/chems/lingchemdisplay + var/atom/movable/screen/ling/sting/lingstingdisplay - var/obj/screen/blobpwrdisplay + var/atom/movable/screen/blobpwrdisplay - var/obj/screen/alien_plasma_display - var/obj/screen/alien_queen_finder + var/atom/movable/screen/alien_plasma_display + var/atom/movable/screen/alien_queen_finder - var/obj/screen/devil/soul_counter/devilsouldisplay + var/atom/movable/screen/devil/soul_counter/devilsouldisplay - var/obj/screen/action_intent - var/obj/screen/zone_select - var/obj/screen/pull_icon - var/obj/screen/rest_icon - var/obj/screen/throw_icon - var/obj/screen/module_store_icon + var/atom/movable/screen/action_intent + var/atom/movable/screen/zone_select + var/atom/movable/screen/pull_icon + var/atom/movable/screen/rest_icon + var/atom/movable/screen/throw_icon + var/atom/movable/screen/module_store_icon var/list/static_inventory = list() //the screen objects which are static var/list/toggleable_inventory = list() //the screen objects which can be hidden - var/list/obj/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys + var/list/atom/movable/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys var/list/infodisplay = list() //the screen objects that display mob info (health, alien plasma, etc...) var/list/screenoverlays = list() //the screen objects used as whole screen overlays (flash, damageoverlay, etc...) - var/list/inv_slots[SLOTS_AMT] // /obj/screen/inventory objects, ordered by their slot ID. - var/list/hand_slots // /obj/screen/inventory/hand objects, assoc list of "[held_index]" = object - var/list/obj/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object - - var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle + var/list/inv_slots[SLOTS_AMT] // /atom/movable/screen/inventory objects, ordered by their slot ID. + var/list/hand_slots // /atom/movable/screen/inventory/hand objects, assoc list of "[held_index]" = object + var/list/atom/movable/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object + ///Assoc list of controller groups, associated with key string group name with value of the plane master controller ref + var/list/atom/movable/plane_master_controller/plane_master_controllers = list() + var/list/team_finder_arrows = list() + + var/atom/movable/screen/movable/action_button/hide_toggle/hide_actions_toggle var/action_buttons_hidden = FALSE - var/obj/screen/healths - var/obj/screen/healthdoll - var/obj/screen/internals + var/atom/movable/screen/healths + var/atom/movable/screen/healthdoll + var/atom/movable/screen/internals // subtypes can override this to force a specific UI style var/ui_style @@ -75,11 +78,16 @@ GLOBAL_LIST_INIT(available_ui_styles, sortList(list( hand_slots = list() - for(var/mytype in subtypesof(/obj/screen/plane_master)) - var/obj/screen/plane_master/instance = new mytype() + for(var/mytype in subtypesof(/atom/movable/screen/plane_master)) + var/atom/movable/screen/plane_master/instance = new mytype() plane_masters["[instance.plane]"] = instance instance.backdrop(mymob) + for(var/mytype in subtypesof(/atom/movable/plane_master_controller)) + var/atom/movable/plane_master_controller/controller_instance = new mytype(src) + plane_master_controllers[controller_instance.name] = controller_instance + + /datum/hud/Destroy() if(mymob.hud_used == src) mymob.hud_used = null @@ -87,6 +95,7 @@ GLOBAL_LIST_INIT(available_ui_styles, sortList(list( QDEL_NULL(hide_actions_toggle) QDEL_NULL(module_store_icon) QDEL_LIST(static_inventory) + QDEL_LIST(team_finder_arrows) inv_slots.Cut() action_intent = null @@ -109,6 +118,7 @@ GLOBAL_LIST_INIT(available_ui_styles, sortList(list( alien_queen_finder = null QDEL_LIST_ASSOC_VAL(plane_masters) + QDEL_LIST_ASSOC_VAL(plane_master_controllers) QDEL_LIST(screenoverlays) mymob = null @@ -152,6 +162,8 @@ GLOBAL_LIST_INIT(available_ui_styles, sortList(list( screenmob.client.screen += hotkeybuttons if(infodisplay.len) screenmob.client.screen += infodisplay + if(team_finder_arrows.len) + screenmob.client.screen += team_finder_arrows screenmob.client.screen += hide_actions_toggle @@ -162,6 +174,8 @@ GLOBAL_LIST_INIT(available_ui_styles, sortList(list( hud_shown = FALSE //Governs behavior of other procs if(static_inventory.len) screenmob.client.screen -= static_inventory + if(team_finder_arrows.len) + screenmob.client.screen += team_finder_arrows if(toggleable_inventory.len) screenmob.client.screen -= toggleable_inventory if(hotkeybuttons.len) @@ -171,7 +185,7 @@ GLOBAL_LIST_INIT(available_ui_styles, sortList(list( //These ones are a part of 'static_inventory', 'toggleable_inventory' or 'hotkeybuttons' but we want them to stay for(var/h in hand_slots) - var/obj/screen/hand = hand_slots[h] + var/atom/movable/screen/hand = hand_slots[h] if(hand) screenmob.client.screen += hand if(action_intent) @@ -188,6 +202,8 @@ GLOBAL_LIST_INIT(available_ui_styles, sortList(list( screenmob.client.screen -= hotkeybuttons if(infodisplay.len) screenmob.client.screen -= infodisplay + if(team_finder_arrows.len) + screenmob.client.screen -= team_finder_arrows hud_version = display_hud_version persistent_inventory_update(screenmob) @@ -209,7 +225,7 @@ GLOBAL_LIST_INIT(available_ui_styles, sortList(list( /datum/hud/proc/plane_masters_update() // Plane masters are always shown to OUR mob, never to observers for(var/thing in plane_masters) - var/obj/screen/plane_master/PM = plane_masters[thing] + var/atom/movable/screen/plane_master/PM = plane_masters[thing] PM.backdrop(mymob) mymob.client.screen += PM @@ -263,13 +279,13 @@ GLOBAL_LIST_INIT(available_ui_styles, sortList(list( //9/10 this is only called once per mob and only for 2 hands /datum/hud/proc/build_hand_slots() for(var/h in hand_slots) - var/obj/screen/inventory/hand/H = hand_slots[h] + var/atom/movable/screen/inventory/hand/H = hand_slots[h] if(H) static_inventory -= H hand_slots = list() - var/obj/screen/inventory/hand/hand_box + var/atom/movable/screen/inventory/hand/hand_box for(var/i in 1 to mymob.held_items.len) - hand_box = new /obj/screen/inventory/hand() + hand_box = new /atom/movable/screen/inventory/hand() hand_box.name = mymob.get_held_index_name(i) hand_box.icon = ui_style hand_box.icon_state = "hand_[mymob.held_index_to_dir(i)]" @@ -281,10 +297,10 @@ GLOBAL_LIST_INIT(available_ui_styles, sortList(list( hand_box.update_icon() var/i = 1 - for(var/obj/screen/swap_hand/SH in static_inventory) + for(var/atom/movable/screen/swap_hand/SH in static_inventory) SH.screen_loc = ui_swaphand_position(mymob,!(i % 2) ? 2: 1) i++ - for(var/obj/screen/human/equip/E in static_inventory) + for(var/atom/movable/screen/human/equip/E in static_inventory) E.screen_loc = ui_equip_position(mymob) if(ismob(mymob) && mymob.hud_used == src) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 20140b49acd2f..047943f9bdef7 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -1,11 +1,11 @@ -/obj/screen/human +/atom/movable/screen/human icon = 'icons/mob/screen_midnight.dmi' -/obj/screen/human/toggle +/atom/movable/screen/human/toggle name = "toggle" icon_state = "toggle" -/obj/screen/human/toggle/Click() +/atom/movable/screen/human/toggle/Click() var/mob/targetmob = usr @@ -23,28 +23,28 @@ targetmob.hud_used.hidden_inventory_update(usr) -/obj/screen/human/equip +/atom/movable/screen/human/equip name = "equip" icon_state = "act_equip" -/obj/screen/human/equip/Click() +/atom/movable/screen/human/equip/Click() if(ismecha(usr.loc)) // stops inventory actions in a mech return 1 var/mob/living/carbon/human/H = usr H.quick_equip() -/obj/screen/devil +/atom/movable/screen/devil invisibility = INVISIBILITY_ABSTRACT -/obj/screen/devil/soul_counter +/atom/movable/screen/devil/soul_counter icon = 'icons/mob/screen_gen.dmi' name = "souls owned" icon_state = "Devil-6" screen_loc = ui_devilsouldisplay -/obj/screen/devil/soul_counter/proc/update_counter(souls = 0) +/atom/movable/screen/devil/soul_counter/proc/update_counter(souls = 0) invisibility = 0 - maptext = "
[souls]
" + maptext = MAPTEXT("
[souls]
") switch(souls) if(0,null) icon_state = "Devil-1" @@ -59,73 +59,73 @@ else icon_state = "Devil-6" -/obj/screen/devil/soul_counter/proc/clear() +/atom/movable/screen/devil/soul_counter/proc/clear() invisibility = INVISIBILITY_ABSTRACT -/obj/screen/ling +/atom/movable/screen/ling invisibility = INVISIBILITY_ABSTRACT -/obj/screen/ling/sting +/atom/movable/screen/ling/sting name = "current sting" screen_loc = ui_lingstingdisplay -/obj/screen/ling/sting/Click() +/atom/movable/screen/ling/sting/Click() if(isobserver(usr)) return var/mob/living/carbon/U = usr U.unset_sting() -/obj/screen/ling/chems +/atom/movable/screen/ling/chems name = "chemical storage" icon_state = "power_display" screen_loc = ui_lingchemdisplay /datum/hud/human/New(mob/living/carbon/human/owner) ..() - owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness) + owner.overlay_fullscreen("see_through_darkness", /atom/movable/screen/fullscreen/see_through_darkness) - var/obj/screen/using - var/obj/screen/inventory/inv_box + var/atom/movable/screen/using + var/atom/movable/screen/inventory/inv_box - using = new/obj/screen/language_menu + using = new/atom/movable/screen/language_menu using.icon = ui_style static_inventory += using - using = new /obj/screen/area_creator + using = new /atom/movable/screen/area_creator using.icon = ui_style static_inventory += using - action_intent = new /obj/screen/act_intent/segmented + action_intent = new /atom/movable/screen/act_intent/segmented action_intent.icon_state = mymob.a_intent action_intent.hud = src static_inventory += action_intent - using = new /obj/screen/mov_intent + using = new /atom/movable/screen/mov_intent using.icon = ui_style using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking") using.screen_loc = ui_movi using.hud = src static_inventory += using - using = new /obj/screen/drop() + using = new /atom/movable/screen/drop() using.icon = ui_style using.screen_loc = ui_drop_throw using.hud = src static_inventory += using - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "i_clothing" inv_box.icon = ui_style - inv_box.slot_id = SLOT_W_UNIFORM + inv_box.slot_id = ITEM_SLOT_ICLOTHING inv_box.icon_state = "uniform" inv_box.screen_loc = ui_iclothing inv_box.hud = src toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "o_clothing" inv_box.icon = ui_style - inv_box.slot_id = SLOT_WEAR_SUIT + inv_box.slot_id = ITEM_SLOT_OCLOTHING inv_box.icon_state = "suit" inv_box.screen_loc = ui_oclothing inv_box.hud = src @@ -133,209 +133,209 @@ build_hand_slots() - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_1" using.screen_loc = ui_swaphand_position(owner,1) using.hud = src static_inventory += using - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) using.hud = src static_inventory += using - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "id" inv_box.icon = ui_style inv_box.icon_state = "id" inv_box.screen_loc = ui_id - inv_box.slot_id = SLOT_WEAR_ID + inv_box.slot_id = ITEM_SLOT_ID inv_box.hud = src static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "mask" inv_box.icon = ui_style inv_box.icon_state = "mask" inv_box.screen_loc = ui_mask - inv_box.slot_id = SLOT_WEAR_MASK + inv_box.slot_id = ITEM_SLOT_MASK inv_box.hud = src toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "neck" inv_box.icon = ui_style inv_box.icon_state = "neck" inv_box.screen_loc = ui_neck - inv_box.slot_id = SLOT_NECK + inv_box.slot_id = ITEM_SLOT_NECK inv_box.hud = src toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "back" inv_box.icon = ui_style inv_box.icon_state = "back" inv_box.screen_loc = ui_back - inv_box.slot_id = SLOT_BACK + inv_box.slot_id = ITEM_SLOT_BACK inv_box.hud = src static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "storage1" inv_box.icon = ui_style inv_box.icon_state = "pocket" inv_box.screen_loc = ui_storage1 - inv_box.slot_id = SLOT_L_STORE + inv_box.slot_id = ITEM_SLOT_LPOCKET inv_box.hud = src static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "storage2" inv_box.icon = ui_style inv_box.icon_state = "pocket" inv_box.screen_loc = ui_storage2 - inv_box.slot_id = SLOT_R_STORE + inv_box.slot_id = ITEM_SLOT_RPOCKET inv_box.hud = src static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "suit storage" inv_box.icon = ui_style inv_box.icon_state = "suit_storage" inv_box.screen_loc = ui_sstore1 - inv_box.slot_id = SLOT_S_STORE + inv_box.slot_id = ITEM_SLOT_SUITSTORE inv_box.hud = src static_inventory += inv_box - using = new /obj/screen/resist() + using = new /atom/movable/screen/resist() using.icon = ui_style using.screen_loc = ui_above_intent using.hud = src hotkeybuttons += using - using = new /obj/screen/human/toggle() + using = new /atom/movable/screen/human/toggle() using.icon = ui_style using.screen_loc = ui_inventory using.hud = src static_inventory += using - using = new /obj/screen/human/equip() + using = new /atom/movable/screen/human/equip() using.icon = ui_style using.screen_loc = ui_equip_position(mymob) using.hud = src static_inventory += using - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "gloves" inv_box.icon = ui_style inv_box.icon_state = "gloves" inv_box.screen_loc = ui_gloves - inv_box.slot_id = SLOT_GLOVES + inv_box.slot_id = ITEM_SLOT_GLOVES inv_box.hud = src toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "eyes" inv_box.icon = ui_style inv_box.icon_state = "glasses" inv_box.screen_loc = ui_glasses - inv_box.slot_id = SLOT_GLASSES + inv_box.slot_id = ITEM_SLOT_EYES inv_box.hud = src toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "ears" inv_box.icon = ui_style inv_box.icon_state = "ears" inv_box.screen_loc = ui_ears - inv_box.slot_id = SLOT_EARS + inv_box.slot_id = ITEM_SLOT_EARS inv_box.hud = src toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "head" inv_box.icon = ui_style inv_box.icon_state = "head" inv_box.screen_loc = ui_head - inv_box.slot_id = SLOT_HEAD + inv_box.slot_id = ITEM_SLOT_HEAD inv_box.hud = src toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "shoes" inv_box.icon = ui_style inv_box.icon_state = "shoes" inv_box.screen_loc = ui_shoes - inv_box.slot_id = SLOT_SHOES + inv_box.slot_id = ITEM_SLOT_FEET inv_box.hud = src toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "belt" inv_box.icon = ui_style inv_box.icon_state = "belt" // inv_box.icon_full = "template_small" inv_box.screen_loc = ui_belt - inv_box.slot_id = SLOT_BELT + inv_box.slot_id = ITEM_SLOT_BELT inv_box.hud = src static_inventory += inv_box - throw_icon = new /obj/screen/throw_catch() + throw_icon = new /atom/movable/screen/throw_catch() throw_icon.icon = ui_style throw_icon.screen_loc = ui_drop_throw throw_icon.hud = src hotkeybuttons += throw_icon - rest_icon = new /obj/screen/rest() + rest_icon = new /atom/movable/screen/rest() rest_icon.icon = ui_style rest_icon.screen_loc = ui_above_movement rest_icon.hud = src static_inventory += rest_icon - internals = new /obj/screen/internals() + internals = new /atom/movable/screen/internals() internals.hud = src infodisplay += internals - healths = new /obj/screen/healths() + healths = new /atom/movable/screen/healths() healths.hud = src infodisplay += healths - healthdoll = new /obj/screen/healthdoll() + healthdoll = new /atom/movable/screen/healthdoll() healthdoll.hud = src infodisplay += healthdoll - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.update_icon() pull_icon.screen_loc = ui_above_intent pull_icon.hud = src static_inventory += pull_icon - lingchemdisplay = new /obj/screen/ling/chems() + lingchemdisplay = new /atom/movable/screen/ling/chems() lingchemdisplay.hud = src infodisplay += lingchemdisplay - lingstingdisplay = new /obj/screen/ling/sting() + lingstingdisplay = new /atom/movable/screen/ling/sting() lingstingdisplay.hud = src infodisplay += lingstingdisplay - devilsouldisplay = new /obj/screen/devil/soul_counter + devilsouldisplay = new /atom/movable/screen/devil/soul_counter devilsouldisplay.hud = src infodisplay += devilsouldisplay - zone_select = new /obj/screen/zone_sel() + zone_select = new /atom/movable/screen/zone_sel() zone_select.icon = ui_style zone_select.update_icon() zone_select.hud = src static_inventory += zone_select - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src - inv_slots[inv.slot_id] = inv + inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv inv.update_icon() update_locked_slots() @@ -347,7 +347,7 @@ if(!istype(H) || !H.dna.species) return var/datum/species/S = H.dna.species - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) if(inv.slot_id in S.no_equip) inv.alpha = 128 diff --git a/code/_onclick/hud/lavaland_elite.dm b/code/_onclick/hud/lavaland_elite.dm index 480e0e398e0b1..81cbb4174827e 100644 --- a/code/_onclick/hud/lavaland_elite.dm +++ b/code/_onclick/hud/lavaland_elite.dm @@ -3,5 +3,5 @@ /datum/hud/lavaland_elite/New(mob/living/simple_animal/hostile/asteroid/elite) ..() - healths = new /obj/screen/healths/lavaland_elite() + healths = new /atom/movable/screen/healths/lavaland_elite() infodisplay += healths diff --git a/code/_onclick/hud/map_popups.dm b/code/_onclick/hud/map_popups.dm index dc9e255cba931..3766b74dd39b3 100644 --- a/code/_onclick/hud/map_popups.dm +++ b/code/_onclick/hud/map_popups.dm @@ -3,11 +3,11 @@ * Assoc list with all the active maps - when a screen obj is added to * a map, it's put in here as well. * - * Format: list( = list(/obj/screen)) + * Format: list( = list(/atom/movable/screen)) */ var/list/screen_maps = list() -/obj/screen +/atom/movable/screen /** * Map name assigned to this object. * Automatically set by /client/proc/add_obj_to_map. @@ -26,7 +26,7 @@ * A screen object, which acts as a container for turfs and other things * you want to show on the map, which you usually attach to "vis_contents". */ -/obj/screen/map_view +/atom/movable/screen/map_view // Map view has to be on the lowest plane to enable proper lighting layer = GAME_PLANE plane = GAME_PLANE @@ -36,7 +36,7 @@ * It is also implicitly used to allocate a rectangle on the map, which will * be used for auto-scaling the map. */ -/obj/screen/background +/atom/movable/screen/background name = "background" icon = 'icons/mob/map_backgrounds.dmi' icon_state = "clear" @@ -49,7 +49,7 @@ * * If applicable, "assigned_map" has to be assigned before this proc call. */ -/obj/screen/proc/set_position(x, y, px = 0, py = 0) +/atom/movable/screen/proc/set_position(x, y, px = 0, py = 0) if(assigned_map) screen_loc = "[assigned_map]:[x]:[px],[y]:[py]" else @@ -60,7 +60,7 @@ * * If applicable, "assigned_map" has to be assigned before this proc call. */ -/obj/screen/proc/fill_rect(x1, y1, x2, y2) +/atom/movable/screen/proc/fill_rect(x1, y1, x2, y2) if(assigned_map) screen_loc = "[assigned_map]:[x1],[y1] to [x2],[y2]" else @@ -70,7 +70,7 @@ * Registers screen obj with the client, which makes it visible on the * assigned map, and becomes a part of the assigned map's lifecycle. */ -/client/proc/register_map_obj(obj/screen/screen_obj) +/client/proc/register_map_obj(atom/movable/screen/screen_obj) if(!screen_obj.assigned_map) CRASH("Can't register [screen_obj] without 'assigned_map' property.") if(!screen_maps[screen_obj.assigned_map]) @@ -92,7 +92,7 @@ /client/proc/clear_map(map_name) if(!map_name || !(map_name in screen_maps)) return FALSE - for(var/obj/screen/screen_obj in screen_maps[map_name]) + for(var/atom/movable/screen/screen_obj in screen_maps[map_name]) screen_maps[map_name] -= screen_obj if(screen_obj.del_on_map_removal) qdel(screen_obj) @@ -137,8 +137,7 @@ * * Width and height are multiplied by 64 by default. */ -/client/proc/setup_popup(popup_name, width = 9, height = 9, \ - tilesize = 2, bg_icon) +/client/proc/setup_popup(popup_name, width = 9, height = 9, tilesize = 2, bg_icon) if(!popup_name) return clear_map("[popup_name]_map") @@ -146,7 +145,7 @@ var/y_value = world.icon_size * tilesize * height var/map_name = create_popup(popup_name, x_value, y_value) - var/obj/screen/background/background = new + var/atom/movable/screen/background/background = new background.assigned_map = map_name background.fill_rect(1, 1, width, height) if(bg_icon) diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index cb839700b31b7..36239216ca0cc 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -1,28 +1,28 @@ /datum/hud/monkey/New(mob/living/carbon/monkey/owner) ..() - var/obj/screen/using - var/obj/screen/inventory/inv_box + var/atom/movable/screen/using + var/atom/movable/screen/inventory/inv_box - action_intent = new /obj/screen/act_intent() + action_intent = new /atom/movable/screen/act_intent() action_intent.icon = ui_style action_intent.icon_state = mymob.a_intent action_intent.screen_loc = ui_acti action_intent.hud = src static_inventory += action_intent - using = new /obj/screen/mov_intent() + using = new /atom/movable/screen/mov_intent() using.icon = ui_style using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking") using.screen_loc = ui_movi using.hud = src static_inventory += using - using = new/obj/screen/language_menu + using = new/atom/movable/screen/language_menu using.icon = ui_style using.hud = src static_inventory += using - using = new /obj/screen/drop() + using = new /atom/movable/screen/drop() using.icon = ui_style using.screen_loc = ui_drop_throw using.hud = src @@ -30,90 +30,90 @@ build_hand_slots() - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_1_m" //extra wide! using.screen_loc = ui_swaphand_position(owner,1) using.hud = src static_inventory += using - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) using.hud = src static_inventory += using - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "mask" inv_box.icon = ui_style inv_box.icon_state = "mask" // inv_box.icon_full = "template" inv_box.screen_loc = ui_monkey_mask - inv_box.slot_id = SLOT_WEAR_MASK + inv_box.slot_id = ITEM_SLOT_MASK inv_box.hud = src static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "neck" inv_box.icon = ui_style inv_box.icon_state = "neck" // inv_box.icon_full = "template" inv_box.screen_loc = ui_monkey_neck - inv_box.slot_id = SLOT_NECK + inv_box.slot_id = ITEM_SLOT_NECK inv_box.hud = src static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "head" inv_box.icon = ui_style inv_box.icon_state = "head" // inv_box.icon_full = "template" inv_box.screen_loc = ui_monkey_head - inv_box.slot_id = SLOT_HEAD + inv_box.slot_id = ITEM_SLOT_HEAD inv_box.hud = src static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "back" inv_box.icon = ui_style inv_box.icon_state = "back" inv_box.screen_loc = ui_monkey_back - inv_box.slot_id = SLOT_BACK + inv_box.slot_id = ITEM_SLOT_BACK inv_box.hud = src static_inventory += inv_box - throw_icon = new /obj/screen/throw_catch() + throw_icon = new /atom/movable/screen/throw_catch() throw_icon.icon = ui_style throw_icon.screen_loc = ui_drop_throw throw_icon.hud = src hotkeybuttons += throw_icon - internals = new /obj/screen/internals() + internals = new /atom/movable/screen/internals() internals.hud = src infodisplay += internals - healths = new /obj/screen/healths() + healths = new /atom/movable/screen/healths() healths.hud = src infodisplay += healths - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.update_icon() pull_icon.screen_loc = ui_above_movement pull_icon.hud = src static_inventory += pull_icon - lingchemdisplay = new /obj/screen/ling/chems() + lingchemdisplay = new /atom/movable/screen/ling/chems() lingchemdisplay.hud = src infodisplay += lingchemdisplay - lingstingdisplay = new /obj/screen/ling/sting() + lingstingdisplay = new /atom/movable/screen/ling/sting() lingstingdisplay.hud = src infodisplay += lingstingdisplay - zone_select = new /obj/screen/zone_sel() + zone_select = new /atom/movable/screen/zone_sel() zone_select.icon = ui_style zone_select.update_icon() zone_select.hud = src @@ -121,16 +121,16 @@ mymob.client.screen = list() - using = new /obj/screen/resist() + using = new /atom/movable/screen/resist() using.icon = ui_style using.screen_loc = ui_above_intent using.hud = src hotkeybuttons += using - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src - inv_slots[inv.slot_id] = inv + inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv inv.update_icon() /datum/hud/monkey/persistent_inventory_update() diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index 4c333a1ed38ad..1497de934b9b4 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -8,7 +8,7 @@ //Movable Screen Object //Not tied to the grid, places it's center where the cursor is -/obj/screen/movable +/atom/movable/screen/movable var/snap2grid = FALSE var/moved = FALSE var/locked = FALSE @@ -18,11 +18,11 @@ //Snap Screen Object //Tied to the grid, snaps to the nearest turf -/obj/screen/movable/snap +/atom/movable/screen/movable/snap snap2grid = TRUE -/obj/screen/movable/MouseDrop(over_object, src_location, over_location, src_control, over_control, params) +/atom/movable/screen/movable/MouseDrop(over_object, src_location, over_location, src_control, over_control, params) if(locked) //no! I am locked! begone! return var/list/PM = params2list(params) @@ -56,10 +56,10 @@ set category = "Debug" set name = "Spawn Movable UI Object" - var/obj/screen/movable/M = new() + var/atom/movable/screen/movable/M = new() M.name = "Movable UI Object" M.icon_state = "block" - M.maptext = "Movable" + M.maptext = MAPTEXT("Movable") M.maptext_width = 64 var/screen_l = capped_input(usr,"Where on the screen? (Formatted as 'X,Y' e.g: '1,1' for bottom left)","Spawn Movable UI Object") @@ -75,10 +75,10 @@ set category = "Debug" set name = "Spawn Snap UI Object" - var/obj/screen/movable/snap/S = new() + var/atom/movable/screen/movable/snap/S = new() S.name = "Snap UI Object" S.icon_state = "block" - S.maptext = "Snap" + S.maptext = MAPTEXT("Snap") S.maptext_width = 64 var/screen_l = capped_input(usr,"Where on the screen? (Formatted as 'X,Y' e.g: '1,1' for bottom left)","Spawn Snap UI Object") diff --git a/code/_onclick/hud/pai.dm b/code/_onclick/hud/pai.dm index c045223d98386..e97e88c12dae9 100644 --- a/code/_onclick/hud/pai.dm +++ b/code/_onclick/hud/pai.dm @@ -1,10 +1,10 @@ #define PAI_MISSING_SOFTWARE_MESSAGE "You must download the required software to use this." -/obj/screen/pai +/atom/movable/screen/pai icon = 'icons/mob/screen_pai.dmi' var/required_software -/obj/screen/pai/Click() +/atom/movable/screen/pai/Click() if(isobserver(usr) || usr.incapacitated()) return FALSE var/mob/living/silicon/pai/pAI = usr @@ -13,21 +13,21 @@ return FALSE return TRUE -/obj/screen/pai/software +/atom/movable/screen/pai/software name = "Software Interface" icon_state = "pai" -/obj/screen/pai/software/Click() +/atom/movable/screen/pai/software/Click() if(!..()) return var/mob/living/silicon/pai/pAI = usr pAI.paiInterface() -/obj/screen/pai/shell +/atom/movable/screen/pai/shell name = "Toggle Holoform" icon_state = "pai_holoform" -/obj/screen/pai/shell/Click() +/atom/movable/screen/pai/shell/Click() if(!..()) return var/mob/living/silicon/pai/pAI = usr @@ -36,53 +36,53 @@ else pAI.fold_out() -/obj/screen/pai/chassis +/atom/movable/screen/pai/chassis name = "Holochassis Appearance Composite" icon_state = "pai_chassis" -/obj/screen/pai/chassis/Click() +/atom/movable/screen/pai/chassis/Click() if(!..()) return var/mob/living/silicon/pai/pAI = usr pAI.choose_chassis() -/obj/screen/pai/rest +/atom/movable/screen/pai/rest name = "Rest" icon_state = "pai_rest" -/obj/screen/pai/rest/Click() +/atom/movable/screen/pai/rest/Click() if(!..()) return var/mob/living/silicon/pai/pAI = usr pAI.lay_down() -/obj/screen/pai/light +/atom/movable/screen/pai/light name = "Toggle Integrated Lights" icon_state = "light" -/obj/screen/pai/light/Click() +/atom/movable/screen/pai/light/Click() if(!..()) return var/mob/living/silicon/pai/pAI = usr pAI.toggle_integrated_light() -/obj/screen/pai/newscaster +/atom/movable/screen/pai/newscaster name = "pAI Newscaster" icon_state = "newscaster" required_software = "newscaster" -/obj/screen/pai/newscaster/Click() +/atom/movable/screen/pai/newscaster/Click() if(!..()) return var/mob/living/silicon/pai/pAI = usr pAI.newscaster.ui_interact(usr) -/obj/screen/pai/host_monitor +/atom/movable/screen/pai/host_monitor name = "Host Health Scan" icon_state = "host_monitor" required_software = "host scan" -/obj/screen/pai/host_monitor/Click() +/atom/movable/screen/pai/host_monitor/Click() if(!..()) return var/mob/living/silicon/pai/pAI = usr @@ -92,77 +92,77 @@ to_chat(src, "You are not being carried by anyone!") return 0 -/obj/screen/pai/crew_manifest +/atom/movable/screen/pai/crew_manifest name = "Crew Manifest" icon_state = "manifest" required_software = "crew manifest" -/obj/screen/pai/crew_manifest/Click() +/atom/movable/screen/pai/crew_manifest/Click() if(!..()) return var/mob/living/silicon/pai/pAI = usr pAI.ai_roster() -/obj/screen/pai/state_laws +/atom/movable/screen/pai/state_laws name = "State Laws" icon_state = "state_laws" -/obj/screen/pai/state_laws/Click() +/atom/movable/screen/pai/state_laws/Click() if(!..()) return var/mob/living/silicon/pai/pAI = usr pAI.checklaws() -/obj/screen/pai/pda_msg_send +/atom/movable/screen/pai/pda_msg_send name = "PDA - Send Message" icon_state = "pda_send" required_software = "digital messenger" -/obj/screen/pai/pda_msg_send/Click() +/atom/movable/screen/pai/pda_msg_send/Click() if(!..()) return var/mob/living/silicon/pai/pAI = usr pAI.cmd_send_pdamesg(usr) -/obj/screen/pai/pda_msg_show +/atom/movable/screen/pai/pda_msg_show name = "PDA - Show Message Log" icon_state = "pda_receive" required_software = "digital messenger" -/obj/screen/pai/pda_msg_show/Click() +/atom/movable/screen/pai/pda_msg_show/Click() if(!..()) return var/mob/living/silicon/pai/pAI = usr pAI.cmd_show_message_log(usr) -/obj/screen/pai/image_take +/atom/movable/screen/pai/image_take name = "Take Image" icon_state = "take_picture" required_software = "photography module" -/obj/screen/pai/image_take/Click() +/atom/movable/screen/pai/image_take/Click() if(!..()) return var/mob/living/silicon/pai/pAI = usr pAI.aicamera.toggle_camera_mode(usr) -/obj/screen/pai/image_view +/atom/movable/screen/pai/image_view name = "View Images" icon_state = "view_images" required_software = "photography module" -/obj/screen/pai/image_view/Click() +/atom/movable/screen/pai/image_view/Click() if(!..()) return var/mob/living/silicon/pai/pAI = usr pAI.aicamera.viewpictures(usr) -/obj/screen/pai/radio +/atom/movable/screen/pai/radio name = "radio" icon = 'icons/mob/screen_cyborg.dmi' icon_state = "radio" -/obj/screen/pai/radio/Click() +/atom/movable/screen/pai/radio/Click() if(!..()) return var/mob/living/silicon/pai/pAI = usr @@ -170,80 +170,80 @@ /datum/hud/pai/New(mob/living/silicon/pai/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using // Software menu - using = new /obj/screen/pai/software + using = new /atom/movable/screen/pai/software using.screen_loc = ui_pai_software static_inventory += using // Holoform - using = new /obj/screen/pai/shell + using = new /atom/movable/screen/pai/shell using.screen_loc = ui_pai_shell static_inventory += using // Chassis Select Menu - using = new /obj/screen/pai/chassis + using = new /atom/movable/screen/pai/chassis using.screen_loc = ui_pai_chassis static_inventory += using // Rest - using = new /obj/screen/pai/rest + using = new /atom/movable/screen/pai/rest using.screen_loc = ui_pai_rest static_inventory += using // Integrated Light - using = new /obj/screen/pai/light + using = new /atom/movable/screen/pai/light using.screen_loc = ui_pai_light static_inventory += using // Newscaster - using = new /obj/screen/pai/newscaster + using = new /atom/movable/screen/pai/newscaster using.screen_loc = ui_pai_newscaster static_inventory += using // Language menu - using = new /obj/screen/language_menu + using = new /atom/movable/screen/language_menu using.screen_loc = ui_borg_language_menu static_inventory += using // Host Monitor - using = new /obj/screen/pai/host_monitor() + using = new /atom/movable/screen/pai/host_monitor() using.screen_loc = ui_pai_host_monitor static_inventory += using // Crew Manifest - using = new /obj/screen/pai/crew_manifest() + using = new /atom/movable/screen/pai/crew_manifest() using.screen_loc = ui_pai_crew_manifest static_inventory += using // Laws - using = new /obj/screen/pai/state_laws() + using = new /atom/movable/screen/pai/state_laws() using.screen_loc = ui_pai_state_laws static_inventory += using // PDA message - using = new /obj/screen/pai/pda_msg_send() + using = new /atom/movable/screen/pai/pda_msg_send() using.screen_loc = ui_pai_pda_send static_inventory += using // PDA log - using = new /obj/screen/pai/pda_msg_show() + using = new /atom/movable/screen/pai/pda_msg_show() using.screen_loc = ui_pai_pda_log static_inventory += using // Take image - using = new /obj/screen/pai/image_take() + using = new /atom/movable/screen/pai/image_take() using.screen_loc = ui_pai_take_picture static_inventory += using // View images - using = new /obj/screen/pai/image_view() + using = new /atom/movable/screen/pai/image_view() using.screen_loc = ui_pai_view_images static_inventory += using // Radio - using = new /obj/screen/pai/radio() + using = new /atom/movable/screen/pai/radio() using.screen_loc = ui_borg_radio static_inventory += using @@ -251,7 +251,7 @@ /datum/hud/pai/proc/update_software_buttons() var/mob/living/silicon/pai/owner = mymob - for(var/obj/screen/pai/button in static_inventory) + for(var/atom/movable/screen/pai/button in static_inventory) if(button.required_software) button.color = owner.software.Find(button.required_software) ? null : "#808080" diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index ef8434a9c044d..22e78d42708d5 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -19,12 +19,12 @@ if(!length(C.parallax_layers_cached)) C.parallax_layers_cached = list() - C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_1(null, C.view) - C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_2(null, C.view) - C.parallax_layers_cached += new /obj/screen/parallax_layer/planet(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_2(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, C.view) if(SSparallax.random_layer) C.parallax_layers_cached += new SSparallax.random_layer - C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_3(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, C.view) C.parallax_layers = C.parallax_layers_cached.Copy() @@ -32,9 +32,9 @@ C.parallax_layers.len = C.parallax_layers_max C.screen |= (C.parallax_layers) - var/obj/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] + var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] if(screenmob != mymob) - C.screen -= locate(/obj/screen/plane_master/parallax_white) in C.screen + C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen C.screen += PM PM.color = list( 0, 0, 0, 0, @@ -49,9 +49,9 @@ var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client C.screen -= (C.parallax_layers_cached) - var/obj/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] + var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] if(screenmob != mymob) - C.screen -= locate(/obj/screen/plane_master/parallax_white) in C.screen + C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen C.screen += PM PM.color = initial(PM.color) C.parallax_layers = null @@ -102,7 +102,7 @@ if(new_parallax_movedir == FALSE) var/animate_time = 0 for(var/thing in C.parallax_layers) - var/obj/screen/parallax_layer/L = thing + var/atom/movable/screen/parallax_layer/L = thing L.icon_state = initial(L.icon_state) L.update_o(C.view) var/T = PARALLAX_LOOP_TIME / L.speed @@ -125,7 +125,7 @@ var/shortesttimer if(!skip_windups) for(var/thing in C.parallax_layers) - var/obj/screen/parallax_layer/L = thing + var/atom/movable/screen/parallax_layer/L = thing var/T = PARALLAX_LOOP_TIME / L.speed if (isnull(shortesttimer)) @@ -153,7 +153,7 @@ return C.parallax_animate_timer = FALSE for(var/thing in C.parallax_layers) - var/obj/screen/parallax_layer/L = thing + var/atom/movable/screen/parallax_layer/L = thing if (!new_parallax_movedir) animate(L) continue @@ -200,7 +200,7 @@ C.last_parallax_shift = world.time for(var/thing in C.parallax_layers) - var/obj/screen/parallax_layer/L = thing + var/atom/movable/screen/parallax_layer/L = thing L.update_status(mymob) if (L.view_sized != C.view) L.update_o(C.view) @@ -235,17 +235,16 @@ /atom/movable/proc/update_parallax_contents() if(length(client_mobs_in_contents)) - for(var/thing in client_mobs_in_contents) - var/mob/M = thing - if(M && M.client && M.hud_used && length(M.client.parallax_layers)) - M.hud_used.update_parallax() + for(var/mob/client_mob as anything in client_mobs_in_contents) + if(length(client_mob?.client?.parallax_layers) && client_mob.hud_used) + client_mob.hud_used.update_parallax() /mob/proc/update_parallax_teleport() //used for arrivals shuttle if(client && client.eye && hud_used && length(client.parallax_layers)) var/area/areaobj = get_area(client.eye) hud_used.set_parallax_movedir(areaobj.parallax_movedir, TRUE) -/obj/screen/parallax_layer +/atom/movable/screen/parallax_layer icon = 'icons/effects/parallax.dmi' var/speed = 1 var/offset_x = 0 @@ -258,13 +257,13 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/parallax_layer/Initialize(mapload, view) +/atom/movable/screen/parallax_layer/Initialize(mapload, view) . = ..() if (!view) view = world.view update_o(view) -/obj/screen/parallax_layer/proc/update_o(view) +/atom/movable/screen/parallax_layer/proc/update_o(view) if (!view) view = world.view @@ -283,51 +282,51 @@ add_overlay(new_overlays) view_sized = view -/obj/screen/parallax_layer/proc/update_status(mob/M) +/atom/movable/screen/parallax_layer/proc/update_status(mob/M) return -/obj/screen/parallax_layer/layer_1 +/atom/movable/screen/parallax_layer/layer_1 icon_state = "layer1" speed = 0.6 layer = 1 -/obj/screen/parallax_layer/layer_2 +/atom/movable/screen/parallax_layer/layer_2 icon_state = "layer2" speed = 1 layer = 2 -/obj/screen/parallax_layer/layer_3 +/atom/movable/screen/parallax_layer/layer_3 icon_state = "layer3" speed = 1.4 layer = 3 -/obj/screen/parallax_layer/random +/atom/movable/screen/parallax_layer/random blend_mode = BLEND_OVERLAY speed = 3 layer = 3 -/obj/screen/parallax_layer/random/space_gas +/atom/movable/screen/parallax_layer/random/space_gas icon_state = "random_layer1" -/obj/screen/parallax_layer/random/space_gas/Initialize(mapload, view) +/atom/movable/screen/parallax_layer/random/space_gas/Initialize(mapload, view) src.add_atom_colour(SSparallax.random_parallax_color, ADMIN_COLOUR_PRIORITY) -/obj/screen/parallax_layer/random/asteroids +/atom/movable/screen/parallax_layer/random/asteroids icon_state = "random_layer2" -/obj/screen/parallax_layer/planet +/atom/movable/screen/parallax_layer/planet icon_state = "planet" blend_mode = BLEND_OVERLAY absolute = TRUE //Status of seperation speed = 3 layer = 30 -/obj/screen/parallax_layer/planet/update_status(mob/M) +/atom/movable/screen/parallax_layer/planet/update_status(mob/M) var/turf/T = get_turf(M) if(is_station_level(T.z)) invisibility = 0 else invisibility = INVISIBILITY_ABSTRACT -/obj/screen/parallax_layer/planet/update_o() +/atom/movable/screen/parallax_layer/planet/update_o() return //Shit wont move diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm index 0e890871598bf..e5e5cfe8ff4ed 100644 --- a/code/_onclick/hud/picture_in_picture.dm +++ b/code/_onclick/hud/picture_in_picture.dm @@ -1,4 +1,4 @@ -/obj/screen/movable/pic_in_pic +/atom/movable/screen/movable/pic_in_pic name = "Picture-in-picture" screen_loc = "CENTER" plane = FLOOR_PLANE @@ -7,17 +7,17 @@ var/height = 0 var/list/shown_to = list() var/list/viewing_turfs = list() - var/obj/screen/component_button/button_x - var/obj/screen/component_button/button_expand - var/obj/screen/component_button/button_shrink + var/atom/movable/screen/component_button/button_x + var/atom/movable/screen/component_button/button_expand + var/atom/movable/screen/component_button/button_shrink var/mutable_appearance/standard_background -/obj/screen/movable/pic_in_pic/Initialize() +/atom/movable/screen/movable/pic_in_pic/Initialize() . = ..() make_backgrounds() -/obj/screen/movable/pic_in_pic/Destroy() +/atom/movable/screen/movable/pic_in_pic/Destroy() for(var/C in shown_to) unshow_to(C) QDEL_NULL(button_x) @@ -25,7 +25,7 @@ QDEL_NULL(button_expand) return ..() -/obj/screen/movable/pic_in_pic/component_click(obj/screen/component_button/component, params) +/atom/movable/screen/movable/pic_in_pic/component_click(atom/movable/screen/component_button/component, params) if(component == button_x) qdel(src) else if(component == button_expand) @@ -33,13 +33,13 @@ else if(component == button_shrink) set_view_size(width-1, height-1) -/obj/screen/movable/pic_in_pic/proc/make_backgrounds() +/atom/movable/screen/movable/pic_in_pic/proc/make_backgrounds() standard_background = new /mutable_appearance() standard_background.icon = 'icons/misc/pic_in_pic.dmi' standard_background.icon_state = "background" standard_background.layer = SPACE_LAYER -/obj/screen/movable/pic_in_pic/proc/add_buttons() +/atom/movable/screen/movable/pic_in_pic/proc/add_buttons() var/static/mutable_appearance/move_tab if(!move_tab) move_tab = new /mutable_appearance() @@ -54,7 +54,7 @@ add_overlay(move_tab) if(!button_x) - button_x = new /obj/screen/component_button(null, src) + button_x = new /atom/movable/screen/component_button(null, src) var/mutable_appearance/MA = new /mutable_appearance() MA.name = "close" MA.icon = 'icons/misc/pic_in_pic.dmi' @@ -67,7 +67,7 @@ vis_contents += button_x if(!button_expand) - button_expand = new /obj/screen/component_button(null, src) + button_expand = new /atom/movable/screen/component_button(null, src) var/mutable_appearance/MA = new /mutable_appearance() MA.name = "expand" MA.icon = 'icons/misc/pic_in_pic.dmi' @@ -80,7 +80,7 @@ vis_contents += button_expand if(!button_shrink) - button_shrink = new /obj/screen/component_button(null, src) + button_shrink = new /atom/movable/screen/component_button(null, src) var/mutable_appearance/MA = new /mutable_appearance() MA.name = "shrink" MA.icon = 'icons/misc/pic_in_pic.dmi' @@ -92,7 +92,7 @@ button_shrink.transform = M vis_contents += button_shrink -/obj/screen/movable/pic_in_pic/proc/add_background() +/atom/movable/screen/movable/pic_in_pic/proc/add_background() if((width > 0) && (height > 0)) var/matrix/M = matrix() M.Scale(width + 0.5, height + 0.5) @@ -102,7 +102,7 @@ // maximum number of dimensions is 10 -/obj/screen/movable/pic_in_pic/proc/set_view_size(width, height, do_refresh = TRUE) +/atom/movable/screen/movable/pic_in_pic/proc/set_view_size(width, height, do_refresh = TRUE) width = clamp(width, 0, 10) height = clamp(height, 0, 10) src.width = width @@ -116,19 +116,19 @@ if(do_refresh) refresh_view() -/obj/screen/movable/pic_in_pic/proc/set_view_center(atom/target, do_refresh = TRUE) +/atom/movable/screen/movable/pic_in_pic/proc/set_view_center(atom/target, do_refresh = TRUE) center = target if(do_refresh) refresh_view() -/obj/screen/movable/pic_in_pic/proc/refresh_view() +/atom/movable/screen/movable/pic_in_pic/proc/refresh_view() vis_contents -= viewing_turfs if(!width || !height) return viewing_turfs = get_visible_turfs() vis_contents += viewing_turfs -/obj/screen/movable/pic_in_pic/proc/get_visible_turfs() +/atom/movable/screen/movable/pic_in_pic/proc/get_visible_turfs() var/turf/T = get_turf(center) if(!T) return list() @@ -136,12 +136,12 @@ var/turf/upperright = locate(min(world.maxx, lowerleft.x + width - 1), min(world.maxy, lowerleft.y + height - 1), lowerleft.z) return block(lowerleft, upperright) -/obj/screen/movable/pic_in_pic/proc/show_to(client/C) +/atom/movable/screen/movable/pic_in_pic/proc/show_to(client/C) if(C) shown_to[C] = 1 C.screen += src -/obj/screen/movable/pic_in_pic/proc/unshow_to(client/C) +/atom/movable/screen/movable/pic_in_pic/proc/unshow_to(client/C) if(C) shown_to -= C C.screen -= src diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index fb430ee560f3f..409f211045273 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -1,4 +1,4 @@ -/obj/screen/plane_master +/atom/movable/screen/plane_master screen_loc = "CENTER" icon_state = "blank" appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR @@ -6,84 +6,143 @@ var/show_alpha = 255 var/hide_alpha = 0 -/obj/screen/plane_master/proc/Show(override) +/atom/movable/screen/plane_master/proc/Show(override) alpha = override || show_alpha -/obj/screen/plane_master/proc/Hide(override) +/atom/movable/screen/plane_master/proc/Hide(override) alpha = override || hide_alpha //Why do plane masters need a backdrop sometimes? Read https://secure.byond.com/forum/?post=2141928 //Trust me, you need one. Period. If you don't think you do, you're doing something extremely wrong. -/obj/screen/plane_master/proc/backdrop(mob/mymob) +/atom/movable/screen/plane_master/proc/backdrop(mob/mymob) -/obj/screen/plane_master/openspace +///Things rendered on "openspace"; holes in multi-z +/atom/movable/screen/plane_master/openspace name = "open space plane master" plane = OPENSPACE_BACKDROP_PLANE appearance_flags = PLANE_MASTER blend_mode = BLEND_MULTIPLY alpha = 255 -/obj/screen/plane_master/openspace/backdrop(mob/mymob) +/atom/movable/screen/plane_master/openspace/backdrop(mob/mymob) filters = list() - filters += filter(type = "drop_shadow", color = "#04080FAA", size = -10) - filters += filter(type = "drop_shadow", color = "#04080FAA", size = -15) - filters += filter(type = "drop_shadow", color = "#04080FAA", size = -20) - -/obj/screen/plane_master/proc/outline(_size, _color) - filters += filter(type = "outline", size = _size, color = _color) - -/obj/screen/plane_master/proc/shadow(_size, _border, _offset = 0, _x = 0, _y = 0, _color = "#04080FAA") - filters += filter(type = "drop_shadow", x = _x, y = _y, color = _color, size = _size, offset = _offset) - -/obj/screen/plane_master/proc/clear_filters() - filters = list() - -/obj/screen/plane_master/floor + add_filter("first_stage_openspace", 1, drop_shadow_filter(color = "#04080FAA", size = -10)) + add_filter("second_stage_openspace", 2, drop_shadow_filter(color = "#04080FAA", size = -15)) + add_filter("third_stage_openspace", 2, drop_shadow_filter(color = "#04080FAA", size = -20)) + +/atom/movable/screen/plane_master/openspace/Initialize() + . = ..() + add_filter("first_stage_openspace", 1, drop_shadow_filter(color = "#04080FAA", size = -10)) + add_filter("second_stage_openspace", 2, drop_shadow_filter(color = "#04080FAA", size = -15)) + add_filter("third_stage_openspace", 2, drop_shadow_filter(color = "#04080FAA", size = -20)) + +///Contains just the floor +/atom/movable/screen/plane_master/floor name = "floor plane master" plane = FLOOR_PLANE appearance_flags = PLANE_MASTER blend_mode = BLEND_OVERLAY -/obj/screen/plane_master/floor/backdrop(mob/mymob) - filters = list() +/atom/movable/screen/plane_master/floor/backdrop(mob/mymob) + clear_filters() if(istype(mymob) && mymob.eye_blurry) - filters += GAUSSIAN_BLUR(CLAMP(mymob.eye_blurry*0.1,0.6,3)) + add_filter("eye_blur", 1, gauss_blur_filter(clamp(mymob.eye_blurry * 0.1, 0.6, 3))) -/obj/screen/plane_master/game_world +///Contains most things in the game world +/atom/movable/screen/plane_master/game_world name = "game world plane master" plane = GAME_PLANE appearance_flags = PLANE_MASTER //should use client color blend_mode = BLEND_OVERLAY -/obj/screen/plane_master/game_world/backdrop(mob/mymob) - filters = list() +/atom/movable/screen/plane_master/game_world/backdrop(mob/mymob) + clear_filters() if(istype(mymob) && mymob.client && mymob.client.prefs && mymob.client.prefs.ambientocclusion) - filters += AMBIENT_OCCLUSION + add_filter("AO", 1, drop_shadow_filter(x = 0, y = -2, size = 4, color = "#04080FAA")) if(istype(mymob) && mymob.eye_blurry) - filters += GAUSSIAN_BLUR(CLAMP(mymob.eye_blurry*0.1,0.6,3)) + add_filter("eye_blur", 1, gauss_blur_filter(clamp(mymob.eye_blurry * 0.1, 0.6, 3))) -/obj/screen/plane_master/lighting + +///Contains all lighting objects +/atom/movable/screen/plane_master/lighting name = "lighting plane master" plane = LIGHTING_PLANE blend_mode = BLEND_MULTIPLY mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/plane_master/parallax +/atom/movable/screen/plane_master/lighting/Initialize() + . = ..() + add_filter("emissives", 1, alpha_mask_filter(render_source = EMISSIVE_RENDER_TARGET, flags = MASK_INVERSE)) + add_filter("unblockable_emissives", 2, alpha_mask_filter(render_source = EMISSIVE_UNBLOCKABLE_RENDER_TARGET, flags = MASK_INVERSE)) + +/** + * Things placed on this mask the lighting plane. Doesn't render directly. + * + * Gets masked by blocking plane. Use for things that you want blocked by + * mobs, items, etc. + */ +/atom/movable/screen/plane_master/emissive + name = "emissive plane master" + plane = EMISSIVE_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + render_target = EMISSIVE_RENDER_TARGET + +/atom/movable/screen/plane_master/emissive/Initialize() + . = ..() + add_filter("emissive_block", 1, alpha_mask_filter(render_source = EMISSIVE_BLOCKER_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, + * magic stuff, etc. + */ + +/atom/movable/screen/plane_master/emissive_unblockable + name = "unblockable emissive plane master" + plane = EMISSIVE_UNBLOCKABLE_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + render_target = EMISSIVE_UNBLOCKABLE_RENDER_TARGET + +/** + * 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 + */ +/atom/movable/screen/plane_master/emissive_unblockable + name = "emissive mob plane master" + plane = EMISSIVE_BLOCKER_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + render_target = EMISSIVE_BLOCKER_RENDER_TARGET + +///Contains space parallax +/atom/movable/screen/plane_master/parallax name = "parallax plane master" plane = PLANE_SPACE_PARALLAX blend_mode = BLEND_MULTIPLY mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/plane_master/parallax_white +/atom/movable/screen/plane_master/parallax_white name = "parallax whitifier plane master" plane = PLANE_SPACE -/obj/screen/plane_master/lighting/backdrop(mob/mymob) - mymob.overlay_fullscreen("lighting_backdrop_lit", /obj/screen/fullscreen/lighting_backdrop/lit) - mymob.overlay_fullscreen("lighting_backdrop_unlit", /obj/screen/fullscreen/lighting_backdrop/unlit) +/atom/movable/screen/plane_master/lighting/backdrop(mob/mymob) + mymob.overlay_fullscreen("lighting_backdrop_lit", /atom/movable/screen/fullscreen/lighting_backdrop/lit) + mymob.overlay_fullscreen("lighting_backdrop_unlit", /atom/movable/screen/fullscreen/lighting_backdrop/unlit) -/obj/screen/plane_master/camera_static +/atom/movable/screen/plane_master/camera_static name = "camera static plane master" plane = CAMERA_STATIC_PLANE appearance_flags = PLANE_MASTER blend_mode = BLEND_OVERLAY + +/atom/movable/screen/plane_master/runechat + name = "runechat plane master" + plane = RUNECHAT_PLANE + appearance_flags = PLANE_MASTER + blend_mode = BLEND_OVERLAY + +/atom/movable/screen/plane_master/runechat/backdrop(mob/mymob) + filters = list() + if(istype(mymob) && mymob.client?.prefs?.ambientocclusion) + add_filter("AO", 1, drop_shadow_filter(x = 0, y = -2, size = 4, color = "#04080FAA")) diff --git a/code/_onclick/hud/plane_master_controller.dm b/code/_onclick/hud/plane_master_controller.dm new file mode 100644 index 0000000000000..ec7e84543136d --- /dev/null +++ b/code/_onclick/hud/plane_master_controller.dm @@ -0,0 +1,80 @@ +///Atom that manages and controls multiple planes. It's an atom so we can hook into add_filter etc. Multiple controllers can control one plane. +/atom/movable/plane_master_controller + ///List of planes in this controllers control. Initially this is a normal list, but becomes an assoc list of plane numbers as strings | plane instance + var/list/controlled_planes = list() + ///hud that owns this controller + var/datum/hud/owner_hud + +///Ensures that all the planes are correctly in the controlled_planes list. +/atom/movable/plane_master_controller/New(hud) + . = ..() + owner_hud = hud + var/assoc_controlled_planes = list() + for(var/i in controlled_planes) + var/atom/movable/screen/plane_master/instance = owner_hud.plane_masters["[i]"] + if(!instance) //If we looked for a hud that isn't instanced, just keep going + stack_trace("[i] isn't a valid plane master layer for [owner_hud.type], are you sure it exists in the first place?") + continue + assoc_controlled_planes["[i]"] = instance + controlled_planes = assoc_controlled_planes + +///Full override so we can just use filterrific +/atom/movable/plane_master_controller/add_filter(name, priority, list/params) + . = ..() + for(var/i in controlled_planes) + var/atom/movable/screen/plane_master/pm_iterator = controlled_planes[i] + pm_iterator.add_filter(name, priority, params) + +///Full override so we can just use filterrific +/atom/movable/plane_master_controller/remove_filter(name_or_names) + . = ..() + for(var/i in controlled_planes) + var/atom/movable/screen/plane_master/pm_iterator = controlled_planes[i] + pm_iterator.remove_filter(name_or_names) + +/atom/movable/plane_master_controller/update_filters() + . = ..() + for(var/i in controlled_planes) + var/atom/movable/screen/plane_master/pm_iterator = controlled_planes[i] + pm_iterator.update_filters() + +///Gets all filters for this controllers plane masters +/atom/movable/plane_master_controller/proc/get_filters(name) + . = list() + for(var/i in controlled_planes) + var/atom/movable/screen/plane_master/pm_iterator = controlled_planes[i] + . += pm_iterator.get_filter(name) + +///Transitions all filters owned by this plane master controller +/atom/movable/plane_master_controller/transition_filter(name, time, list/new_params, easing, loop) + . = ..() + for(var/i in controlled_planes) + var/atom/movable/screen/plane_master/pm_iterator = controlled_planes[i] + pm_iterator.transition_filter(name, time, new_params, easing, loop) + +///Full override so we can just use filterrific +/atom/movable/plane_master_controller/add_atom_colour(coloration, colour_priority) + . = ..() + for(var/i in controlled_planes) + var/atom/movable/screen/plane_master/pm_iterator = controlled_planes[i] + pm_iterator.add_atom_colour(coloration, colour_priority) + + +///Removes an instance of colour_type from the atom's atom_colours list +/atom/movable/plane_master_controller/remove_atom_colour(colour_priority, coloration) + . = ..() + for(var/i in controlled_planes) + var/atom/movable/screen/plane_master/pm_iterator = controlled_planes[i] + pm_iterator.remove_atom_colour(colour_priority, coloration) + + +///Resets the atom's color to null, and then sets it to the highest priority colour available +/atom/movable/plane_master_controller/update_atom_colour() + for(var/i in controlled_planes) + var/atom/movable/screen/plane_master/pm_iterator = controlled_planes[i] + pm_iterator.update_atom_colour() + + +/atom/movable/plane_master_controller/game + name = PLANE_MASTERS_GAME + controlled_planes = list(FLOOR_PLANE, GAME_PLANE, LIGHTING_PLANE) diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 588af8e41a0ff..53b50f932562e 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -3,63 +3,83 @@ GLOBAL_LIST_EMPTY(radial_menus) -/obj/screen/radial +/atom/movable/screen/radial icon = 'icons/mob/radial.dmi' layer = ABOVE_HUD_LAYER plane = ABOVE_HUD_PLANE var/datum/radial_menu/parent -/obj/screen/radial/slice +/atom/movable/screen/radial/proc/set_parent(new_value) + if(parent) + UnregisterSignal(parent, COMSIG_PARENT_QDELETING) + parent = new_value + if(parent) + RegisterSignal(parent, COMSIG_PARENT_QDELETING, .proc/handle_parent_del) + +/atom/movable/screen/radial/proc/handle_parent_del() + SIGNAL_HANDLER + set_parent(null) + +/atom/movable/screen/radial/slice icon_state = "radial_slice" var/choice var/next_page = FALSE var/tooltips = FALSE -/obj/screen/radial/slice/MouseEntered(location, control, params) +/atom/movable/screen/radial/slice/MouseEntered(location, control, params) . = ..() icon_state = "radial_slice_focus" if(tooltips) openToolTip(usr, src, params, title = name) -/obj/screen/radial/slice/MouseExited(location, control, params) +/atom/movable/screen/radial/slice/MouseExited(location, control, params) . = ..() icon_state = "radial_slice" if(tooltips) closeToolTip(usr) -/obj/screen/radial/slice/Click(location, control, params) +/atom/movable/screen/radial/slice/Click(location, control, params) if(usr.client == parent.current_user) if(next_page) parent.next_page() else parent.element_chosen(choice,usr) -/obj/screen/radial/center +/atom/movable/screen/radial/center name = "Close Menu" icon_state = "radial_center" -/obj/screen/radial/center/MouseEntered(location, control, params) +/atom/movable/screen/radial/center/MouseEntered(location, control, params) . = ..() icon_state = "radial_center_focus" -/obj/screen/radial/center/MouseExited(location, control, params) +/atom/movable/screen/radial/center/MouseExited(location, control, params) . = ..() icon_state = "radial_center" -/obj/screen/radial/center/Click(location, control, params) +/atom/movable/screen/radial/center/Click(location, control, params) if(usr.client == parent.current_user) parent.finished = TRUE /datum/radial_menu - var/list/choices = list() //List of choice id's - var/list/choices_icons = list() //choice_id -> icon - var/list/choices_values = list() //choice_id -> choice + /// List of choice IDs + var/list/choices = list() + + /// choice_id -> icon + var/list/choices_icons = list() + + /// choice_id -> choice + var/list/choices_values = list() + + /// choice_id -> /datum/radial_menu_choice + var/list/choice_datums = list() + var/list/page_data = list() //list of choices per page var/selected_choice - var/list/obj/screen/elements = list() - var/obj/screen/radial/center/close_button + var/list/atom/movable/screen/elements = list() + var/atom/movable/screen/radial/center/close_button var/client/current_user var/atom/anchor var/image/menu_holder @@ -121,9 +141,9 @@ GLOBAL_LIST_EMPTY(radial_menus) if(elements.len < max_elements) var/elements_to_add = max_elements - elements.len for(var/i in 1 to elements_to_add) //Create all elements - var/obj/screen/radial/slice/new_element = new /obj/screen/radial/slice + var/atom/movable/screen/radial/slice/new_element = new /atom/movable/screen/radial/slice new_element.tooltips = use_tooltips - new_element.parent = src + new_element.set_parent(src) elements += new_element var/page = 1 @@ -153,14 +173,14 @@ GLOBAL_LIST_EMPTY(radial_menus) var/list/page_choices = page_data[current_page] var/angle_per_element = round(zone / page_choices.len) for(var/i in 1 to elements.len) - var/obj/screen/radial/E = elements[i] + var/atom/movable/screen/radial/E = elements[i] var/angle = WRAP(starting_angle + (i - 1) * angle_per_element,0,360) if(i > page_choices.len) HideElement(E) else SetElement(E,page_choices[i],angle,anim = anim,anim_order = i) -/datum/radial_menu/proc/HideElement(obj/screen/radial/slice/E) +/datum/radial_menu/proc/HideElement(atom/movable/screen/radial/slice/E) E.cut_overlays() E.alpha = 0 E.name = "None" @@ -169,7 +189,7 @@ GLOBAL_LIST_EMPTY(radial_menus) E.choice = null E.next_page = FALSE -/datum/radial_menu/proc/SetElement(obj/screen/radial/slice/E,choice_id,angle,anim,anim_order) +/datum/radial_menu/proc/SetElement(atom/movable/screen/radial/slice/E,choice_id,angle,anim,anim_order) //Position var/py = round(cos(angle) * radius) + py_shift var/px = round(sin(angle) * radius) @@ -188,6 +208,7 @@ GLOBAL_LIST_EMPTY(radial_menus) E.alpha = 255 E.mouse_opacity = MOUSE_OPACITY_ICON E.cut_overlays() + E.vis_contents.Cut() if(choice_id == NEXT_PAGE_ID) E.name = "Next Page" E.next_page = TRUE @@ -203,10 +224,16 @@ GLOBAL_LIST_EMPTY(radial_menus) E.next_page = FALSE if(choices_icons[choice_id]) E.add_overlay(choices_icons[choice_id]) + if (choice_datums[choice_id]) + var/datum/radial_menu_choice/choice_datum = choice_datums[choice_id] + if (choice_datum.info) + var/obj/effect/abstract/info/info_button = new(E, choice_datum.info) + info_button.layer = ABOVE_HUD_LAYER + E.vis_contents += info_button /datum/radial_menu/New() close_button = new - close_button.parent = src + close_button.set_parent(src) /datum/radial_menu/proc/Reset() choices.Cut() @@ -231,11 +258,17 @@ GLOBAL_LIST_EMPTY(radial_menus) var/I = extract_image(new_choices[E]) if(I) choices_icons[id] = I + + if (istype(new_choices[E], /datum/radial_menu_choice)) + choice_datums[id] = new_choices[E] setup_menu(use_tooltips) +/datum/radial_menu/proc/extract_image(to_extract_from) + if (istype(to_extract_from, /datum/radial_menu_choice)) + var/datum/radial_menu_choice/choice = to_extract_from + to_extract_from = choice.image -/datum/radial_menu/proc/extract_image(E) - var/mutable_appearance/MA = new /mutable_appearance(E) + var/mutable_appearance/MA = new /mutable_appearance(to_extract_from) if(MA) MA.layer = ABOVE_HUD_LAYER MA.appearance_flags |= RESET_TRANSFORM @@ -309,3 +342,15 @@ GLOBAL_LIST_EMPTY(radial_menus) qdel(menu) GLOB.radial_menus -= uniqueid return answer + +/// Can be provided to choices in radial menus if you want to provide more information +/datum/radial_menu_choice + /// Required -- what to display for this button + var/image + + /// If provided, will display an info button that will put this text in your chat + var/info + +/datum/radial_menu_choice/Destroy(force, ...) + . = ..() + QDEL_NULL(image) diff --git a/code/_onclick/hud/radial_persistent.dm b/code/_onclick/hud/radial_persistent.dm index 0b5e8dc3561c0..1c46ecee56d14 100644 --- a/code/_onclick/hud/radial_persistent.dm +++ b/code/_onclick/hud/radial_persistent.dm @@ -2,19 +2,19 @@ A derivative of radial menu which persists onscreen until closed and invokes a callback each time an element is clicked */ -/obj/screen/radial/persistent/center +/atom/movable/screen/radial/persistent/center name = "Close Menu" icon_state = "radial_center" -/obj/screen/radial/persistent/center/Click(location, control, params) +/atom/movable/screen/radial/persistent/center/Click(location, control, params) if(usr.client == parent.current_user) parent.element_chosen(null,usr) -/obj/screen/radial/persistent/center/MouseEntered(location, control, params) +/atom/movable/screen/radial/persistent/center/MouseEntered(location, control, params) . = ..() icon_state = "radial_center_focus" -/obj/screen/radial/persistent/center/MouseExited(location, control, params) +/atom/movable/screen/radial/persistent/center/MouseExited(location, control, params) . = ..() icon_state = "radial_center" @@ -25,8 +25,8 @@ var/datum/callback/select_proc_callback /datum/radial_menu/persistent/New() - close_button = new /obj/screen/radial/persistent/center - close_button.parent = src + close_button = new /atom/movable/screen/radial/persistent/center + close_button.set_parent(src) /datum/radial_menu/persistent/element_chosen(choice_id,mob/user) diff --git a/code/_onclick/hud/revenanthud.dm b/code/_onclick/hud/revenanthud.dm index 93693139411b2..708b1d49154d7 100644 --- a/code/_onclick/hud/revenanthud.dm +++ b/code/_onclick/hud/revenanthud.dm @@ -2,6 +2,6 @@ /datum/hud/revenant/New(mob/owner) ..() - healths = new /obj/screen/healths/revenant() + healths = new /atom/movable/screen/healths/revenant() healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index ec186efc29a00..d64450e416804 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -1,15 +1,15 @@ -/obj/screen/robot +/atom/movable/screen/robot icon = 'icons/mob/screen_cyborg.dmi' -/obj/screen/robot/module +/atom/movable/screen/robot/module name = "cyborg module" icon_state = "nomod" -/obj/screen/robot/Click() +/atom/movable/screen/robot/Click() if(isobserver(usr)) return 1 -/obj/screen/robot/module/Click() +/atom/movable/screen/robot/module/Click() if(..()) return var/mob/living/silicon/robot/R = usr @@ -18,71 +18,71 @@ return 1 R.pick_module() -/obj/screen/robot/module1 +/atom/movable/screen/robot/module1 name = "module1" icon_state = "inv1" -/obj/screen/robot/module1/Click() +/atom/movable/screen/robot/module1/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.toggle_module(1) -/obj/screen/robot/module2 +/atom/movable/screen/robot/module2 name = "module2" icon_state = "inv2" -/obj/screen/robot/module2/Click() +/atom/movable/screen/robot/module2/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.toggle_module(2) -/obj/screen/robot/module3 +/atom/movable/screen/robot/module3 name = "module3" icon_state = "inv3" -/obj/screen/robot/module3/Click() +/atom/movable/screen/robot/module3/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.toggle_module(3) -/obj/screen/robot/radio +/atom/movable/screen/robot/radio name = "radio" icon_state = "radio" -/obj/screen/robot/radio/Click() +/atom/movable/screen/robot/radio/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.radio.interact(R) -/obj/screen/robot/store +/atom/movable/screen/robot/store name = "store" icon_state = "store" -/obj/screen/robot/store/Click() +/atom/movable/screen/robot/store/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.uneq_active() -/obj/screen/robot/lamp +/atom/movable/screen/robot/lamp name = "headlamp" icon_state = "lamp0" -/obj/screen/robot/lamp/Click() +/atom/movable/screen/robot/lamp/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.control_headlamp() -/obj/screen/robot/thrusters +/atom/movable/screen/robot/thrusters name = "ion thrusters" icon_state = "ionpulse0" -/obj/screen/robot/thrusters/Click() +/atom/movable/screen/robot/thrusters/Click() if(..()) return var/mob/living/silicon/robot/R = usr @@ -94,32 +94,35 @@ /datum/hud/robot/New(mob/owner) ..() var/mob/living/silicon/robot/mymobR = mymob - var/obj/screen/using - using = new/obj/screen/language_menu + mymobR.overlay_fullscreen("see_through_darkness", /atom/movable/screen/fullscreen/see_through_darkness) + + var/atom/movable/screen/using + + using = new/atom/movable/screen/language_menu using.screen_loc = ui_borg_language_menu static_inventory += using //Radio - using = new /obj/screen/robot/radio() + using = new /atom/movable/screen/robot/radio() using.screen_loc = ui_borg_radio using.hud = src static_inventory += using //Module select - using = new /obj/screen/robot/module1() + using = new /atom/movable/screen/robot/module1() using.screen_loc = ui_inv1 using.hud = src static_inventory += using mymobR.inv1 = using - using = new /obj/screen/robot/module2() + using = new /atom/movable/screen/robot/module2() using.screen_loc = ui_inv2 using.hud = src static_inventory += using mymobR.inv2 = using - using = new /obj/screen/robot/module3() + using = new /atom/movable/screen/robot/module3() using.screen_loc = ui_inv3 using.hud = src static_inventory += using @@ -128,59 +131,59 @@ //End of module select //Photography stuff - using = new /obj/screen/ai/image_take() + using = new /atom/movable/screen/ai/image_take() using.screen_loc = ui_borg_camera using.hud = src static_inventory += using - using = new /obj/screen/ai/image_view() + using = new /atom/movable/screen/ai/image_view() using.screen_loc = ui_borg_album using.hud = src static_inventory += using //Sec/Med HUDs - using = new /obj/screen/ai/sensors() + using = new /atom/movable/screen/ai/sensors() using.screen_loc = ui_borg_sensor using.hud = src static_inventory += using //Headlamp control - using = new /obj/screen/robot/lamp() + using = new /atom/movable/screen/robot/lamp() using.screen_loc = ui_borg_lamp using.hud = src static_inventory += using mymobR.lamp_button = using //Thrusters - using = new /obj/screen/robot/thrusters() + using = new /atom/movable/screen/robot/thrusters() using.screen_loc = ui_borg_thrusters using.hud = src static_inventory += using mymobR.thruster_button = using //Intent - action_intent = new /obj/screen/act_intent/robot() + action_intent = new /atom/movable/screen/act_intent/robot() action_intent.icon_state = mymob.a_intent action_intent.hud = src static_inventory += action_intent //Health - healths = new /obj/screen/healths/robot() + healths = new /atom/movable/screen/healths/robot() healths.hud = src infodisplay += healths //Installed Module - mymobR.hands = new /obj/screen/robot/module() + mymobR.hands = new /atom/movable/screen/robot/module() mymobR.hands.screen_loc = ui_borg_module mymobR.hands.hud = src static_inventory += mymobR.hands //Store - module_store_icon = new /obj/screen/robot/store() + module_store_icon = new /atom/movable/screen/robot/store() module_store_icon.screen_loc = ui_borg_store module_store_icon.hud = src - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = 'icons/mob/screen_cyborg.dmi' pull_icon.screen_loc = ui_borg_pull pull_icon.hud = src @@ -188,7 +191,7 @@ hotkeybuttons += pull_icon - zone_select = new /obj/screen/zone_sel/robot() + zone_select = new /atom/movable/screen/zone_sel/robot() zone_select.hud = src zone_select.update_icon() static_inventory += zone_select diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 076187fbac334..be353204111eb 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -6,34 +6,36 @@ They are used with the client/screen list and the screen_loc var. For more information, see the byond documentation on the screen_loc and screen vars. */ -/obj/screen +/atom/movable/screen name = "" icon = 'icons/mob/screen_gen.dmi' layer = HUD_LAYER plane = HUD_PLANE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + animate_movement = SLIDE_STEPS + speech_span = SPAN_ROBOT + vis_flags = VIS_INHERIT_PLANE appearance_flags = APPEARANCE_UI - var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. - var/datum/hud/hud = null // A reference to the owner HUD, if any. + /// A reference to the object in the slot. Grabs or items, generally. + var/obj/master = null + /// A reference to the owner HUD, if any. + var/datum/hud/hud = null -/obj/screen/take_damage() - return -/obj/screen/Destroy() +/atom/movable/screen/Destroy() master = null hud = null return ..() -/obj/screen/examine(mob/user) +/atom/movable/screen/examine(mob/user) return list() -/obj/screen/orbit() +/atom/movable/screen/orbit() return -/obj/screen/proc/component_click(obj/screen/component_button/component, params) +/atom/movable/screen/proc/component_click(atom/movable/screen/component_button/component, params) return -/obj/screen/text +/atom/movable/screen/text icon = null icon_state = null mouse_opacity = MOUSE_OPACITY_TRANSPARENT @@ -41,12 +43,12 @@ maptext_height = 480 maptext_width = 480 -/obj/screen/swap_hand +/atom/movable/screen/swap_hand layer = HUD_LAYER plane = HUD_PLANE name = "swap hand" -/obj/screen/swap_hand/Click() +/atom/movable/screen/swap_hand/Click() // At this point in client Click() code we have passed the 1/10 sec check and little else // We don't even know if it's a middle click if(world.time <= usr.next_move) @@ -60,19 +62,19 @@ M.swap_hand() return 1 -/obj/screen/craft +/atom/movable/screen/craft name = "crafting menu" icon = 'icons/mob/screen_midnight.dmi' icon_state = "craft" screen_loc = ui_crafting -/obj/screen/area_creator +/atom/movable/screen/area_creator name = "create new area" icon = 'icons/mob/screen_midnight.dmi' icon_state = "area_edit" screen_loc = ui_building -/obj/screen/area_creator/Click() +/atom/movable/screen/area_creator/Click() if(usr.incapacitated() || (isobserver(usr) && !IsAdminGhost(usr))) return TRUE var/area/A = get_area(usr) @@ -81,18 +83,18 @@ return TRUE create_area(usr) -/obj/screen/language_menu +/atom/movable/screen/language_menu name = "language menu" icon = 'icons/mob/screen_midnight.dmi' icon_state = "talk_wheel" screen_loc = ui_language_menu -/obj/screen/language_menu/Click() +/atom/movable/screen/language_menu/Click() var/mob/M = usr var/datum/language_holder/H = M.get_language_holder() H.open_language_menu(usr) -/obj/screen/inventory +/atom/movable/screen/inventory var/slot_id // The indentifier for the slot. It has nothing to do with ID cards. var/icon_empty // Icon when empty. For now used only by humans. var/icon_full // Icon when contains an item. For now used only by humans. @@ -100,7 +102,7 @@ layer = HUD_LAYER plane = HUD_PLANE -/obj/screen/inventory/Click(location, control, params) +/atom/movable/screen/inventory/Click(location, control, params) // At this point in client Click() code we have passed the 1/10 sec check and little else // We don't even know if it's a middle click if(world.time <= usr.next_move) @@ -122,19 +124,19 @@ usr.update_inv_hands() return TRUE -/obj/screen/inventory/MouseEntered() +/atom/movable/screen/inventory/MouseEntered() ..() add_overlays() //Apply the outline affect add_stored_outline() -/obj/screen/inventory/MouseExited() +/atom/movable/screen/inventory/MouseExited() ..() cut_overlay(object_overlays) object_overlays.Cut() remove_stored_outline() -/obj/screen/inventory/proc/add_stored_outline() +/atom/movable/screen/inventory/proc/add_stored_outline() if(hud?.mymob && slot_id) var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id) if(inv_item) @@ -143,13 +145,13 @@ else inv_item.apply_outline() -/obj/screen/inventory/proc/remove_stored_outline() +/atom/movable/screen/inventory/proc/remove_stored_outline() if(hud?.mymob && slot_id) var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id) if(inv_item) inv_item.remove_outline() -/obj/screen/inventory/update_icon_state() +/atom/movable/screen/inventory/update_icon_state() if(!icon_empty) icon_empty = icon_state @@ -159,7 +161,7 @@ else icon_state = icon_empty -/obj/screen/inventory/proc/add_overlays() +/atom/movable/screen/inventory/proc/add_overlays() var/mob/user = hud?.mymob if(!user || !slot_id) @@ -181,12 +183,12 @@ object_overlays += item_overlay add_overlay(object_overlays) -/obj/screen/inventory/hand +/atom/movable/screen/inventory/hand var/mutable_appearance/handcuff_overlay var/static/mutable_appearance/blocked_overlay = mutable_appearance('icons/mob/screen_gen.dmi', "blocked") var/held_index = 0 -/obj/screen/inventory/hand/update_icon() +/atom/movable/screen/inventory/hand/update_icon() . = ..() if(!handcuff_overlay) @@ -211,7 +213,7 @@ add_overlay("hand_active") -/obj/screen/inventory/hand/Click(location, control, params) +/atom/movable/screen/inventory/hand/Click(location, control, params) // At this point in client Click() code we have passed the 1/10 sec check and little else // We don't even know if it's a middle click var/mob/user = hud?.mymob @@ -232,41 +234,41 @@ user.swap_hand(held_index) return TRUE -/obj/screen/close +/atom/movable/screen/close name = "close" layer = ABOVE_HUD_LAYER plane = ABOVE_HUD_PLANE icon_state = "backpack_close" -/obj/screen/close/Initialize(mapload, new_master) +/atom/movable/screen/close/Initialize(mapload, new_master) . = ..() master = new_master -/obj/screen/close/Click() +/atom/movable/screen/close/Click() var/datum/component/storage/S = master S.hide_from(usr) return TRUE -/obj/screen/drop +/atom/movable/screen/drop name = "drop" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_drop" layer = HUD_LAYER plane = HUD_PLANE -/obj/screen/drop/Click() +/atom/movable/screen/drop/Click() if(usr.stat == CONSCIOUS) usr.dropItemToGround(usr.get_active_held_item()) -/obj/screen/act_intent +/atom/movable/screen/act_intent name = "intent" icon_state = "help" screen_loc = ui_acti -/obj/screen/act_intent/Click(location, control, params) +/atom/movable/screen/act_intent/Click(location, control, params) usr.a_intent_change(INTENT_HOTKEY_RIGHT) -/obj/screen/act_intent/segmented/Click(location, control, params) +/atom/movable/screen/act_intent/segmented/Click(location, control, params) if(usr.client.prefs.toggles & INTENT_STYLE) var/_x = text2num(params2list(params)["icon-x"]) var/_y = text2num(params2list(params)["icon-y"]) @@ -285,20 +287,20 @@ else return ..() -/obj/screen/act_intent/alien +/atom/movable/screen/act_intent/alien icon = 'icons/mob/screen_alien.dmi' screen_loc = ui_movi -/obj/screen/act_intent/robot +/atom/movable/screen/act_intent/robot icon = 'icons/mob/screen_cyborg.dmi' screen_loc = ui_borg_intents -/obj/screen/internals +/atom/movable/screen/internals name = "toggle internals" icon_state = "internal0" screen_loc = ui_internal -/obj/screen/internals/Click() +/atom/movable/screen/internals/Click() if(!iscarbon(usr)) return var/mob/living/carbon/C = usr @@ -353,67 +355,67 @@ return C.update_action_buttons_icon() -/obj/screen/mov_intent +/atom/movable/screen/mov_intent name = "run/walk toggle" icon = 'icons/mob/screen_midnight.dmi' icon_state = "running" -/obj/screen/mov_intent/Click() +/atom/movable/screen/mov_intent/Click() toggle(usr) -/obj/screen/mov_intent/update_icon_state() +/atom/movable/screen/mov_intent/update_icon_state() switch(hud?.mymob?.m_intent) if(MOVE_INTENT_WALK) icon_state = "walking" if(MOVE_INTENT_RUN) icon_state = "running" -/obj/screen/mov_intent/proc/toggle(mob/user) +/atom/movable/screen/mov_intent/proc/toggle(mob/user) if(isobserver(user)) return user.toggle_move_intent(user) -/obj/screen/pull +/atom/movable/screen/pull name = "stop pulling" icon = 'icons/mob/screen_midnight.dmi' icon_state = "pull" -/obj/screen/pull/Click() +/atom/movable/screen/pull/Click() if(isobserver(usr)) return usr.stop_pulling() -/obj/screen/pull/update_icon_state() +/atom/movable/screen/pull/update_icon_state() if(hud?.mymob?.pulling) icon_state = "pull" else icon_state = "pull0" -/obj/screen/resist +/atom/movable/screen/resist name = "resist" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_resist" layer = HUD_LAYER plane = HUD_PLANE -/obj/screen/resist/Click() +/atom/movable/screen/resist/Click() if(isliving(usr)) var/mob/living/L = usr L.resist() -/obj/screen/rest +/atom/movable/screen/rest name = "rest" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_rest" layer = HUD_LAYER plane = HUD_PLANE -/obj/screen/rest/Click() +/atom/movable/screen/rest/Click() if(isliving(usr)) var/mob/living/L = usr L.lay_down() -/obj/screen/rest/update_icon_state() +/atom/movable/screen/rest/update_icon_state() var/mob/living/user = hud?.mymob if(!istype(user)) return @@ -423,18 +425,18 @@ else icon_state = "act_rest0" -/obj/screen/storage +/atom/movable/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) +/atom/movable/screen/storage/Initialize(mapload, new_master) . = ..() master = new_master -/obj/screen/storage/Click(location, control, params) +/atom/movable/screen/storage/Click(location, control, params) if(world.time <= usr.next_move) return TRUE if(usr.incapacitated()) @@ -447,17 +449,17 @@ master.attackby(null, I, usr, params) return TRUE -/obj/screen/throw_catch +/atom/movable/screen/throw_catch name = "throw/catch" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_throw_off" -/obj/screen/throw_catch/Click() +/atom/movable/screen/throw_catch/Click() if(iscarbon(usr)) var/mob/living/carbon/C = usr C.toggle_throw_mode() -/obj/screen/zone_sel +/atom/movable/screen/zone_sel name = "damage zone" icon_state = "zone_sel" screen_loc = ui_zonesel @@ -466,7 +468,7 @@ var/hovering var/mutable_appearance/selecting_appearance -/obj/screen/zone_sel/Click(location, control,params) +/atom/movable/screen/zone_sel/Click(location, control,params) if(isobserver(usr)) return @@ -479,10 +481,10 @@ return set_selected_zone(choice, usr) -/obj/screen/zone_sel/MouseEntered(location, control, params) +/atom/movable/screen/zone_sel/MouseEntered(location, control, params) MouseMove(location, control, params) -/obj/screen/zone_sel/MouseMove(location, control, params) +/atom/movable/screen/zone_sel/MouseMove(location, control, params) if(isobserver(usr)) return @@ -511,12 +513,12 @@ layer = ABOVE_HUD_LAYER plane = ABOVE_HUD_PLANE -/obj/screen/zone_sel/MouseExited(location, control, params) +/atom/movable/screen/zone_sel/MouseExited(location, control, params) if(!isobserver(usr) && hovering) vis_contents -= hover_overlays_cache[hovering] hovering = null -/obj/screen/zone_sel/proc/get_zone_at(icon_x, icon_y) +/atom/movable/screen/zone_sel/proc/get_zone_at(icon_x, icon_y) switch(icon_y) if(1 to 9) //Legs switch(icon_x) @@ -554,7 +556,7 @@ return BODY_ZONE_PRECISE_EYES return BODY_ZONE_HEAD -/obj/screen/zone_sel/proc/set_selected_zone(choice, mob/user) +/atom/movable/screen/zone_sel/proc/set_selected_zone(choice, mob/user) if(user != hud?.mymob) return @@ -564,28 +566,28 @@ return TRUE -/obj/screen/zone_sel/update_icon() +/atom/movable/screen/zone_sel/update_icon() . = ..() cut_overlay(selecting_appearance) selecting_appearance = mutable_appearance('icons/mob/screen_gen.dmi', "[selecting]") add_overlay(selecting_appearance) hud?.mymob?.zone_selected = selecting -/obj/screen/zone_sel/alien +/atom/movable/screen/zone_sel/alien icon = 'icons/mob/screen_alien.dmi' -/obj/screen/zone_sel/alien/update_icon() +/atom/movable/screen/zone_sel/alien/update_icon() . = ..() cut_overlay(selecting_appearance) selecting_appearance = mutable_appearance('icons/mob/screen_alien.dmi', "[selecting]") add_overlay(selecting_appearance) hud?.mymob?.zone_selected = selecting -/obj/screen/zone_sel/robot +/atom/movable/screen/zone_sel/robot icon = 'icons/mob/screen_cyborg.dmi' -/obj/screen/flash +/atom/movable/screen/flash name = "flash" icon_state = "blank" blend_mode = BLEND_ADD @@ -593,7 +595,7 @@ layer = FLASH_LAYER plane = FULLSCREEN_PLANE -/obj/screen/damageoverlay +/atom/movable/screen/damageoverlay icon = 'icons/mob/screen_full.dmi' icon_state = "oxydamageoverlay0" name = "dmg" @@ -603,98 +605,98 @@ layer = UI_DAMAGE_LAYER plane = FULLSCREEN_PLANE -/obj/screen/healths +/atom/movable/screen/healths name = "health" icon_state = "health0" screen_loc = ui_health -/obj/screen/healths/alien +/atom/movable/screen/healths/alien icon = 'icons/mob/screen_alien.dmi' screen_loc = ui_alien_health -/obj/screen/healths/robot +/atom/movable/screen/healths/robot icon = 'icons/mob/screen_cyborg.dmi' screen_loc = ui_borg_health -/obj/screen/healths/blob +/atom/movable/screen/healths/blob name = "blob health" icon_state = "block" screen_loc = ui_internal mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/blob/naut +/atom/movable/screen/healths/blob/naut name = "health" icon = 'icons/mob/blob.dmi' icon_state = "nauthealth" -/obj/screen/healths/blob/naut/core +/atom/movable/screen/healths/blob/naut/core name = "overmind health" screen_loc = ui_health icon_state = "corehealth" -/obj/screen/healths/guardian +/atom/movable/screen/healths/guardian name = "summoner health" icon = 'icons/mob/guardian.dmi' icon_state = "base" screen_loc = ui_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/clock +/atom/movable/screen/healths/clock icon = 'icons/mob/actions.dmi' icon_state = "bg_clock" screen_loc = ui_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/clock/gear +/atom/movable/screen/healths/clock/gear icon = 'icons/mob/clockwork_mobs.dmi' icon_state = "bg_gear" screen_loc = ui_internal -/obj/screen/healths/revenant +/atom/movable/screen/healths/revenant name = "essence" icon = 'icons/mob/actions.dmi' icon_state = "bg_revenant" screen_loc = ui_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/construct +/atom/movable/screen/healths/construct icon = 'icons/mob/screen_construct.dmi' icon_state = "artificer_health0" screen_loc = ui_construct_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/slime +/atom/movable/screen/healths/slime icon = 'icons/mob/screen_slime.dmi' icon_state = "slime_health0" screen_loc = ui_slime_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/lavaland_elite +/atom/movable/screen/healths/lavaland_elite icon = 'icons/mob/screen_elite.dmi' icon_state = "elite_health0" screen_loc = ui_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healthdoll +/atom/movable/screen/healthdoll name = "health doll" screen_loc = ui_healthdoll -/obj/screen/healthdoll/Click() - if (ishuman(usr)) - var/mob/living/carbon/human/H = usr - H.check_self_for_injuries() +/atom/movable/screen/healthdoll/Click() + if (iscarbon(usr)) + var/mob/living/carbon/C = usr + C.check_self_for_injuries() -/obj/screen/mood +/atom/movable/screen/mood name = "mood" icon_state = "mood5" screen_loc = ui_mood -/obj/screen/sanity +/atom/movable/screen/sanity name = "sanity" icon_state = "sanity3" screen_loc = ui_mood -/obj/screen/splash +/atom/movable/screen/splash icon = 'icons/blank_title.png' icon_state = "" screen_loc = "1,1" @@ -702,7 +704,7 @@ plane = SPLASHSCREEN_PLANE var/client/holder -/obj/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE, except its not easy +/atom/movable/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE, except its not easy . = ..() holder = C @@ -721,7 +723,7 @@ holder.screen += src -/obj/screen/splash/proc/Fade(out, qdel_after = TRUE) +/atom/movable/screen/splash/proc/Fade(out, qdel_after = TRUE) if(QDELETED(src)) return if(out) @@ -732,20 +734,20 @@ if(qdel_after) QDEL_IN(src, 30) -/obj/screen/splash/Destroy() +/atom/movable/screen/splash/Destroy() if(holder) holder.screen -= src holder = null return ..() -/obj/screen/component_button - var/obj/screen/parent +/atom/movable/screen/component_button + var/atom/movable/screen/parent -/obj/screen/component_button/Initialize(mapload, obj/screen/parent) +/atom/movable/screen/component_button/Initialize(mapload, atom/movable/screen/parent) . = ..() src.parent = parent -/obj/screen/component_button/Click(params) +/atom/movable/screen/component_button/Click(params) if(parent) parent.component_click(src, params) diff --git a/code/_onclick/hud/slime.dm b/code/_onclick/hud/slime.dm index 44845e0b70aaa..72b759378623a 100644 --- a/code/_onclick/hud/slime.dm +++ b/code/_onclick/hud/slime.dm @@ -3,6 +3,6 @@ /datum/hud/slime/New(mob/living/simple_animal/slime/owner) ..() - healths = new /obj/screen/healths/slime() + healths = new /atom/movable/screen/healths/slime() healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/swarmer.dm b/code/_onclick/hud/swarmer.dm index 80cc01c3b30de..6aba23fab5c7d 100644 --- a/code/_onclick/hud/swarmer.dm +++ b/code/_onclick/hud/swarmer.dm @@ -1,98 +1,98 @@ -/obj/screen/swarmer +/atom/movable/screen/swarmer icon = 'icons/mob/swarmer.dmi' -/obj/screen/swarmer/FabricateTrap +/atom/movable/screen/swarmer/FabricateTrap icon_state = "ui_trap" name = "Create trap (Costs 5 Resources)" desc = "Creates a trap that will nonlethally shock any non-swarmer that attempts to cross it. (Costs 5 resources)" -/obj/screen/swarmer/FabricateTrap/Click() +/atom/movable/screen/swarmer/FabricateTrap/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.CreateTrap() -/obj/screen/swarmer/Barricade +/atom/movable/screen/swarmer/Barricade icon_state = "ui_barricade" name = "Create barricade (Costs 5 Resources)" desc = "Creates a destructible barricade that will stop any non swarmer from passing it. Also allows disabler beams to pass through. (Costs 5 resources)" -/obj/screen/swarmer/Barricade/Click() +/atom/movable/screen/swarmer/Barricade/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.CreateBarricade() -/obj/screen/swarmer/Replicate +/atom/movable/screen/swarmer/Replicate icon_state = "ui_replicate" name = "Replicate (Costs 50 Resources)" desc = "Creates another of our kind." -/obj/screen/swarmer/Replicate/Click() +/atom/movable/screen/swarmer/Replicate/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.CreateSwarmer() -/obj/screen/swarmer/RepairSelf +/atom/movable/screen/swarmer/RepairSelf icon_state = "ui_self_repair" name = "Repair self" desc = "Repairs damage to our body." -/obj/screen/swarmer/RepairSelf/Click() +/atom/movable/screen/swarmer/RepairSelf/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.RepairSelf() -/obj/screen/swarmer/ToggleLight +/atom/movable/screen/swarmer/ToggleLight icon_state = "ui_light" name = "Toggle light" desc = "Toggles our inbuilt light on or off." -/obj/screen/swarmer/ToggleLight/Click() +/atom/movable/screen/swarmer/ToggleLight/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.ToggleLight() -/obj/screen/swarmer/ContactSwarmers +/atom/movable/screen/swarmer/ContactSwarmers icon_state = "ui_contact_swarmers" name = "Contact swarmers" desc = "Sends a message to all other swarmers, should they exist." -/obj/screen/swarmer/ContactSwarmers/Click() +/atom/movable/screen/swarmer/ContactSwarmers/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.ContactSwarmers() /datum/hud/swarmer/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - using = new /obj/screen/swarmer/FabricateTrap() + using = new /atom/movable/screen/swarmer/FabricateTrap() using.screen_loc = ui_hand_position(2) using.hud = src static_inventory += using - using = new /obj/screen/swarmer/Barricade() + using = new /atom/movable/screen/swarmer/Barricade() using.screen_loc = ui_hand_position(1) using.hud = src static_inventory += using - using = new /obj/screen/swarmer/Replicate() + using = new /atom/movable/screen/swarmer/Replicate() using.screen_loc = ui_zonesel using.hud = src static_inventory += using - using = new /obj/screen/swarmer/RepairSelf() + using = new /atom/movable/screen/swarmer/RepairSelf() using.screen_loc = ui_storage1 using.hud = src static_inventory += using - using = new /obj/screen/swarmer/ToggleLight() + using = new /atom/movable/screen/swarmer/ToggleLight() using.screen_loc = ui_back using.hud = src static_inventory += using - using = new /obj/screen/swarmer/ContactSwarmers() + using = new /atom/movable/screen/swarmer/ContactSwarmers() using.screen_loc = ui_inventory using.hud = src static_inventory += using diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index d519b259fbcbe..d188dd555c7a9 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -156,9 +156,11 @@ message_hit_area = " in the [hit_area]" var/attack_message = "[src] is [message_verb][message_hit_area] with [I]!" var/attack_message_local = "You're [message_verb][message_hit_area] with [I]!" - if(user in viewers(src, null)) + if(user in viewers(src)) attack_message = "[user] [message_verb] [src][message_hit_area] with [I]!" attack_message_local = "[user] [message_verb] you[message_hit_area] with [I]!" + if(user == src) + attack_message_local = "You [message_verb] yourself[message_hit_area] with [I]!" visible_message("[attack_message]",\ "[attack_message_local]", null, COMBAT_MESSAGE_RANGE) return 1 diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 5f494e4f2e9bd..deb50ff5b2b90 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -62,6 +62,7 @@ /mob/living/attack_ghost(mob/dead/observer/user) if(user.client && user.health_scan) healthscan(user, src, 1, TRUE) + chemscan(user, src, 1, TRUE) return ..() // --------------------------------------- @@ -83,6 +84,12 @@ return ..() /obj/machinery/teleport/hub/attack_ghost(mob/user) - if(power_station && power_station.engaged && power_station.teleporter_console && power_station.teleporter_console.target) - user.forceMove(get_turf(power_station.teleporter_console.target)) - return ..() + if(!power_station?.engaged || !power_station.teleporter_console || !power_station.teleporter_console.target_ref) + return ..() + + var/atom/target = power_station.teleporter_console.target_ref.resolve() + if(!target) + power_station.teleporter_console.target_ref = null + return ..() + + user.forceMove(get_turf(target)) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 8f2cbf3afde35..9f41b846885ba 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -106,6 +106,7 @@ A.attack_animal(src) /atom/proc/attack_animal(mob/user) + SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_ANIMAL, user) return /mob/living/RestrainedClickOn(atom/A) @@ -184,8 +185,10 @@ */ /mob/living/simple_animal/slime/UnarmedAttack(atom/A) A.attack_slime(src) + /atom/proc/attack_slime(mob/user) return + /mob/living/simple_animal/slime/RestrainedClickOn(atom/A) return @@ -243,7 +246,7 @@ */ /mob/living/simple_animal/hostile/UnarmedAttack(atom/A) - target = A + GiveTarget(A) if(dextrous && !ismob(A)) ..() else diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index a802d12af190b..0f1ab65f0ec08 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -84,6 +84,7 @@ START_PROCESSING(SSfastprocess, src) /obj/item/tk_grab/Destroy() + focus = null STOP_PROCESSING(SSfastprocess, src) return ..() @@ -99,7 +100,7 @@ //stops TK grabs being equipped anywhere but into hands /obj/item/tk_grab/equipped(mob/user, slot) - if(slot == SLOT_HANDS) + if(slot == ITEM_SLOT_HANDS) return qdel(src) return @@ -134,7 +135,14 @@ target.attack_self_tk(user) update_icon() return + + if(focus.buckled_mobs) + to_chat(user, "This object is too heavy to move with something buckled to it!") + return + if(length(focus.client_mobs_in_contents)) + to_chat(user, "This object is too heavy to move with something inside of it!") + return if(!isturf(target) && isitem(focus) && target.Adjacent(focus)) apply_focus_overlay() @@ -143,6 +151,7 @@ if(check_if_focusable(focus)) focus.do_attack_animation(target, null, focus) else + apply_focus_overlay() focus.throw_at(target, 10, 1,user) user.changeNext_move(CLICK_CD_MELEE) diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm index 19fef285973eb..513f593e4580a 100644 --- a/code/controllers/admin.dm +++ b/code/controllers/admin.dm @@ -1,39 +1,3 @@ -// Clickable stat() button. -/obj/effect/statclick - 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 - . = ..() - name = text - src.target = target - -/obj/effect/statclick/proc/update(text) - name = text - return src - -/obj/effect/statclick/debug - var/class - -/obj/effect/statclick/debug/Click() - if(!usr.client.holder || !target) - return - if(!class) - if(istype(target, /datum/controller/subsystem)) - class = "subsystem" - else if(istype(target, /datum/controller)) - class = "controller" - else if(istype(target, /datum)) - class = "datum" - else - class = "unknown" - - usr.client.debug_variables(target) - message_admins("Admin [key_name_admin(usr)] is debugging the [target] [class].") - - // Debug verbs. /client/proc/restart_controller(controller in list("Master", "Failsafe")) set category = "Debug" diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index 274ff20dbb3cf..77e15e42e6662 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -143,6 +143,7 @@ config_entry_value = list() dupes_allowed = TRUE vv_VAS = FALSE //VAS will not allow things like deleting from lists, it'll just bug horribly. + var/case_sensitive = FALSE var/key_mode var/value_mode var/splitter = " " @@ -162,7 +163,9 @@ var/key_value = null if(key_pos || value_mode == VALUE_MODE_FLAG) - key_name = lowertext(copytext(str_val, 1, key_pos)) + key_name = copytext(str_val, 1, key_pos) + if(!case_sensitive) + key_name = lowertext(key_name) if(key_pos) key_value = copytext(str_val, key_pos + length(str_val[key_pos])) var/new_key diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 37966569c2c30..7180c06c869f5 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -24,6 +24,7 @@ var/static/regex/ooc_filter_regex var/list/fail2topic_whitelisted_ips + var/list/protected_cids /datum/controller/configuration/proc/admin_reload() if(IsAdminAdvancedProcCall()) @@ -56,7 +57,7 @@ break loadmaplist(CONFIG_MAPS_FILE) LoadTopicRateWhitelist() - LoadMOTD() + LoadProtectedIDs() LoadChatFilter() if (Master) @@ -193,15 +194,25 @@ return !(var_name in banned_edits) && ..() /datum/controller/configuration/stat_entry() - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Edit", src) - stat("[name]:", statclick) + var/list/tab_data = list() + tab_data["[name]"] = list( + text="Edit", + action = "statClickDebug", + params=list( + "targetRef" = REF(src), + "class"="config", + ), + type=STAT_BUTTON, + ) + return tab_data /datum/controller/configuration/proc/Get(entry_type) var/datum/config_entry/E = entry_type var/entry_is_abstract = initial(E.abstract_type) == entry_type if(entry_is_abstract) CRASH("Tried to retrieve an abstract config_entry: [entry_type]") + if(!entries_by_type) + CRASH("Tried to retrieve config value before it was loaded or it was nulled.") E = entries_by_type[entry_type] if(!E) CRASH("Missing config entry for [entry_type]!") @@ -396,6 +407,16 @@ fail2topic_whitelisted_ips[line] = 1 +/datum/controller/configuration/proc/LoadProtectedIDs() + var/jsonfile = rustg_file_read("[directory]/protected_cids.json") + if(!jsonfile) + log_config("Error 404: protected_cids.json not found!") + return + + log_config("Loading config file protected_cids.json...") + + protected_cids = json_decode(jsonfile) + /datum/controller/configuration/proc/LoadChatFilter() var/list/in_character_filter = list() var/list/ooc_filter = list() diff --git a/code/controllers/configuration/entries/comms.dm b/code/controllers/configuration/entries/comms.dm index 012c3ec9feb95..5cc9b3efccd52 100644 --- a/code/controllers/configuration/entries/comms.dm +++ b/code/controllers/configuration/entries/comms.dm @@ -1,15 +1,26 @@ -/datum/config_entry/string/comms_key - protection = CONFIG_ENTRY_HIDDEN +/datum/config_entry/keyed_list/comms_key + case_sensitive = TRUE + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_TEXT + protection = CONFIG_ENTRY_HIDDEN | CONFIG_ENTRY_LOCKED -/datum/config_entry/string/comms_key/ValidateAndSet(str_val) - return str_val != "default_pwd" && length(str_val) > 6 && ..() +/datum/config_entry/keyed_list/comms_key/ValidateListEntry(key_name, key_value) + return key_value != "comms_token" && ..() /datum/config_entry/keyed_list/cross_server + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_TEXT + protection = CONFIG_ENTRY_HIDDEN | CONFIG_ENTRY_LOCKED + +/datum/config_entry/keyed_list/cross_server/ValidateListEntry(key_name, key_value) + return key_name != "byond://address:port" && key_value != "token" && ..() + +/datum/config_entry/keyed_list/server_hop key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_TEXT protection = CONFIG_ENTRY_LOCKED -/datum/config_entry/keyed_list/cross_server/ValidateAndSet(str_val) +/datum/config_entry/keyed_list/server_hop/ValidateAndSet(str_val) . = ..() if(.) var/list/newv = list() @@ -17,12 +28,12 @@ newv[replacetext(I, "+", " ")] = config_entry_value[I] config_entry_value = newv -/datum/config_entry/keyed_list/cross_server/ValidateListEntry(key_name, key_value) - return key_value != "byond:\\address:port" && ..() +/datum/config_entry/keyed_list/server_hop/ValidateListEntry(key_name, key_value) + return key_value != "byond://address:port" && ..() /datum/config_entry/string/cross_comms_name /datum/config_entry/string/medal_hub_address /datum/config_entry/string/medal_hub_password - protection = CONFIG_ENTRY_HIDDEN \ No newline at end of file + protection = CONFIG_ENTRY_HIDDEN diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 09a7a0ea068f4..2ff19be30fe6c 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -70,7 +70,7 @@ /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/flag/donator_items // do you need to be a donator to use donator items /datum/config_entry/number/traitor_scaling_coeff //how much does the amount of players get divided by to determine traitors config_entry_value = 6 @@ -253,6 +253,8 @@ /datum/config_entry/flag/emojis +/datum/config_entry/flag/badges + /datum/config_entry/keyed_list/multiplicative_movespeed key_mode = KEY_MODE_TYPE value_mode = VALUE_MODE_NUM @@ -372,7 +374,7 @@ min_val = 0 /datum/config_entry/number/space_budget - config_entry_value = 16 + config_entry_value = 40 integer = FALSE min_val = 0 @@ -433,11 +435,8 @@ config_entry_value = 100 /datum/config_entry/number/max_slimes config_entry_value = 100 - -//Maximum citation fine -/datum/config_entry/number/maxfine - config_entry_value = 1000 - min_val = 0 +/datum/config_entry/number/max_slimeperson_bodies + config_entry_value = 10 //Shuttle size limiter @@ -448,3 +447,13 @@ config_entry_value = 250 /datum/config_entry/flag/restricted_suicide + +/datum/config_entry/flag/dynamic_config_enabled + +//Default Game Mode +/datum/config_entry/string/master_mode + config_entry_value = "extended" + +/datum/config_entry/flag/spare_enforce_coc + +/datum/config_entry/flag/station_traits diff --git a/code/controllers/configuration/entries/game_tweaks.dm b/code/controllers/configuration/entries/game_tweaks.dm new file mode 100644 index 0000000000000..bdc201fd02390 --- /dev/null +++ b/code/controllers/configuration/entries/game_tweaks.dm @@ -0,0 +1,21 @@ +//Maximum citation fine +/datum/config_entry/number/maxfine + config_entry_value = 1000 + min_val = 0 + +//Brig timer limits and presets, in minutes +/datum/config_entry/number/brig_timer_max + config_entry_value = 15 + min_val = 1 + +/datum/config_entry/number/brig_timer_preset_short + config_entry_value = 2 + min_val = 1 + +/datum/config_entry/number/brig_timer_preset_med + config_entry_value = 3 + min_val = 1 + +/datum/config_entry/number/brig_timer_preset_long + config_entry_value = 5 + min_val = 1 diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index df43f26a310ac..f668f7c56060c 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -327,6 +327,8 @@ /datum/config_entry/flag/panic_bunker // prevents people the server hasn't seen before from connecting +/datum/config_entry/number/panic_bunker_living // living time in minutes that a player needs to pass the panic bunker + /datum/config_entry/string/panic_bunker_message config_entry_value = "Sorry but the server is currently not accepting connections from never before seen players." @@ -336,7 +338,7 @@ /datum/config_entry/number/notify_new_player_account_age // how long do we notify admins of a new byond account min_val = 0 -/datum/config_entry/flag/irc_first_connection_alert // do we notify the irc channel when somebody is connecting for the first time? +/datum/config_entry/flag/irc_first_connection_alert // do we notify the irc/discord channel when somebody is connecting for the first time? /datum/config_entry/flag/check_randomizer @@ -554,3 +556,11 @@ /datum/config_entry/number/ghost_role_cooldown config_entry_value = 0 min_val = 0 + + +// Elasticsearch stuffs +/datum/config_entry/flag/elasticsearch_metrics_enabled + +/datum/config_entry/string/elasticsearch_metrics_endpoint + +/datum/config_entry/string/elasticsearch_metrics_apikey diff --git a/code/controllers/controller.dm b/code/controllers/controller.dm index 06547d120d528..179e21b2ad40f 100644 --- a/code/controllers/controller.dm +++ b/code/controllers/controller.dm @@ -1,7 +1,5 @@ /datum/controller var/name - // The object used for the clickable stat() button. - var/obj/effect/statclick/statclick /datum/controller/proc/Initialize() @@ -16,4 +14,4 @@ /datum/controller/proc/Recover() -/datum/controller/proc/stat_entry() \ No newline at end of file +/datum/controller/proc/stat_entry() diff --git a/code/controllers/failsafe.dm b/code/controllers/failsafe.dm index 03e2c36c1125f..db85684767383 100644 --- a/code/controllers/failsafe.dm +++ b/code/controllers/failsafe.dm @@ -96,7 +96,14 @@ GLOBAL_REAL(Failsafe, /datum/controller/failsafe) return defcon /datum/controller/failsafe/stat_entry() - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - - stat("Failsafe Controller:", statclick.update("Defcon: [defcon_pretty()] (Interval: [Failsafe.processing_interval] | Iteration: [Failsafe.master_iteration])")) + var/list/tab_data = list() + tab_data["Failsafe Controller"] = list( + text="Defcon: [defcon_pretty()] (Interval: [Failsafe.processing_interval] | Iteration: [Failsafe.master_iteration])", + action = "statClickDebug", + params=list( + "targetRef" = REF(src), + "class"="controller", + ), + type=STAT_BUTTON, + ) + return tab_data diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index a085b264107d0..fea1fd209efd0 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -25,10 +25,17 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) return QDEL_HINT_IWILLGC /datum/controller/global_vars/stat_entry() - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - - stat("Globals:", statclick.update("Edit")) + var/list/tab_data = list() + tab_data["Globals"] = list( + text="Edit", + action = "statClickDebug", + params=list( + "targetRef" = REF(src), + "class"="controller", + ), + type=STAT_BUTTON, + ) + return tab_data /datum/controller/global_vars/vv_edit_var(var_name, var_value) if(gvars_datum_protected_varlist[var_name]) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 540d1e57535c5..f20856bc01c65 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -35,6 +35,9 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/sleep_delta = 1 + //only run ticker subsystems for 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? @@ -67,7 +70,11 @@ GLOBAL_REAL(Master, /datum/controller/master) = new // Highlander-style: there can only be one! Kill off the old and replace it with the new. if(!random_seed) - random_seed = (TEST_RUN_PARAMETER in world.params) ? 29051994 : rand(1, 1e9) + #ifdef UNIT_TESTS + random_seed = 29051994 + #else + random_seed = rand(1, 1e9) + #endif rand_seed(random_seed) var/list/_subsystems = list() @@ -334,7 +341,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 @@ -380,6 +387,9 @@ 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) @@ -447,6 +457,10 @@ GLOBAL_REAL(Master, /datum/controller/master) = new 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 @@ -583,14 +597,23 @@ GLOBAL_REAL(Master, /datum/controller/master) = new log_world("MC: SoftReset: Finished.") . = 1 - +/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)]%)) (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)])")) + var/list/tab_data = list() + tab_data["Byond"] = GENERATE_STAT_TEXT("(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)]%)") + tab_data["Master Controller"] = list( + text="(TickRate:[Master.processing]) (Iteration:[Master.iteration]) (TickLimit: [round(Master.current_ticklimit, 0.1)])", + action = "statClickDebug", + params=list( + "targetRef" = REF(src), + "class"="controller", + ), + type=STAT_BUTTON, + ) + return tab_data /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.dm b/code/controllers/subsystem.dm index ba1cc61413a15..7f57cba79457f 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -2,6 +2,7 @@ /datum/controller/subsystem // Metadata; you should define these. name = "fire coderbus" //name of the subsystem + var/ss_id = "fire_coderbus_again" var/init_order = INIT_ORDER_DEFAULT //order of initialization. Higher numbers are initialized first, lower numbers later. Use defines in __DEFINES/subsystems.dm for easy understanding of order. var/wait = 20 //time to wait (in deciseconds) between each call to fire(). Must be a positive integer. var/priority = FIRE_PRIORITY_DEFAULT //When mutiple subsystems need to run in the same tick, higher priority subsystems will run first and be given a higher share of the tick before MC_TICK_CHECK triggers a sleep @@ -161,6 +162,7 @@ //used to initialize the subsystem AFTER the map has loaded /datum/controller/subsystem/Initialize(start_timeofday) initialized = TRUE + SEND_SIGNAL(src, COMSIG_SUBSYSTEM_POST_INITIALIZE, start_timeofday) var/time = (REALTIMEOFDAY - start_timeofday) / 10 var/msg = "Initialized [name] subsystem within [time] second[time == 1 ? "" : "s"]!" testing("[msg]") @@ -169,10 +171,7 @@ //hook for printing stats to the "MC" statuspanel for admins to see performance and related stats etc. /datum/controller/subsystem/stat_entry(msg) - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - - + var/list/tab_data = list() if(can_fire && !(SS_NO_FIRE & flags)) msg = "[round(cost,1)]ms|[round(tick_usage,1)]%([round(tick_overrun,1)]%)|[round(ticks,0.1)]\t[msg]" @@ -183,7 +182,16 @@ if (can_fire) title = "\[[state_letter()]][title]" - stat(title, statclick.update(msg)) + tab_data["[title]"] = list( + text="[msg]", + action = "statClickDebug", + params=list( + "targetRef" = REF(src), + "class"="subsystem", + ), + type=STAT_BUTTON, + ) + return tab_data /datum/controller/subsystem/proc/state_letter() switch (state) @@ -218,3 +226,18 @@ return 0 . = ..() + +/** + * Returns the metrics for the subsystem. + * + * This can be overriden on subtypes for variables that could affect tick usage + * Example: ATs on SSair + */ +/datum/controller/subsystem/proc/get_metrics() + SHOULD_CALL_PARENT(TRUE) + // Please dont ever modify this. Youll break existing metrics and that will upset me. + var/list/out = list() + out["cost"] = cost + out["tick_usage"] = tick_usage + out["custom"] = list() // Override as needed on child + return out diff --git a/code/controllers/subsystem/acid.dm b/code/controllers/subsystem/acid.dm index e3c415960bcc0..283c75cfaa75a 100644 --- a/code/controllers/subsystem/acid.dm +++ b/code/controllers/subsystem/acid.dm @@ -8,8 +8,13 @@ SUBSYSTEM_DEF(acid) var/list/processing = list() /datum/controller/subsystem/acid/stat_entry() - ..("P:[processing.len]") + . = ..("P:[processing.len]") +/datum/controller/subsystem/acid/get_metrics() + . = ..() + var/list/cust = list() + cust["processing"] = length(processing) + .["custom"] = cust /datum/controller/subsystem/acid/fire(resumed = 0) if (!resumed) diff --git a/code/controllers/subsystem/adjacent_air.dm b/code/controllers/subsystem/adjacent_air.dm index 4254bfb83d87b..de0fa09323240 100644 --- a/code/controllers/subsystem/adjacent_air.dm +++ b/code/controllers/subsystem/adjacent_air.dm @@ -5,12 +5,13 @@ SUBSYSTEM_DEF(adjacent_air) wait = 10 priority = FIRE_PRIORITY_ATMOS_ADJACENCY var/list/queue = list() + var/list/disable_queue = list() /datum/controller/subsystem/adjacent_air/stat_entry() #ifdef TESTING - ..("P:[length(queue)], S:[GLOB.atmos_adjacent_savings[1]], T:[GLOB.atmos_adjacent_savings[2]]") + . = ..("P:[length(queue)], S:[GLOB.atmos_adjacent_savings[1]], T:[GLOB.atmos_adjacent_savings[2]]") #else - ..("P:[length(queue)]") + . = ..("P:[length(queue)]") #endif /datum/controller/subsystem/adjacent_air/Initialize() @@ -19,6 +20,24 @@ SUBSYSTEM_DEF(adjacent_air) return ..() /datum/controller/subsystem/adjacent_air/fire(resumed = FALSE, mc_check = TRUE) + if(SSair.thread_running()) + pause() + return + + var/list/disable_queue = src.disable_queue + + while (length(disable_queue)) + var/turf/terf = disable_queue[1] + var/arg = disable_queue[terf] + disable_queue.Cut(1,2) + + terf.ImmediateDisableAdjacency(arg) + + if(mc_check) + if(MC_TICK_CHECK) + return + else + CHECK_TICK var/list/queue = src.queue diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 54b586b2e0a54..4b354cbe0c8ac 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -1,93 +1,158 @@ -#define SSAIR_PIPENETS 1 -#define SSAIR_ATMOSMACHINERY 2 -#define SSAIR_EQUALIZE 3 -#define SSAIR_ACTIVETURFS 4 -#define SSAIR_EXCITEDGROUPS 5 -#define SSAIR_HIGHPRESSURE 6 -#define SSAIR_HOTSPOTS 7 -#define SSAIR_SUPERCONDUCTIVITY 8 - SUBSYSTEM_DEF(air) name = "Atmospherics" init_order = INIT_ORDER_AIR priority = FIRE_PRIORITY_AIR - wait = 5 + wait = 0.5 SECONDS flags = SS_BACKGROUND runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME var/cost_turfs = 0 var/cost_groups = 0 var/cost_highpressure = 0 + var/cost_deferred_airs var/cost_hotspots = 0 + var/cost_post_process = 0 var/cost_superconductivity = 0 var/cost_pipenets = 0 + var/cost_rebuilds = 0 var/cost_atmos_machinery = 0 var/cost_equalize = 0 + var/thread_wait_ticks = 0 + var/cur_thread_wait_ticks = 0 + + var/low_pressure_turfs = 0 + var/high_pressure_turfs = 0 + + var/num_group_turfs_processed = 0 + var/num_equalize_processed = 0 - var/list/active_turfs = list() var/list/hotspots = list() var/list/networks = list() + var/list/pipenets_needing_rebuilt = list() + var/list/deferred_airs = list() + var/max_deferred_airs = 0 var/list/obj/machinery/atmos_machinery = list() + var/list/obj/machinery/atmos_air_machinery = list() var/list/pipe_init_dirs_cache = list() //atmos singletons var/list/gas_reactions = list() - var/list/atmos_gen //Special functions lists - var/list/turf/active_super_conductivity = list() var/list/turf/open/high_pressure_delta = list() var/list/currentrun = list() - var/currentpart = SSAIR_PIPENETS + var/currentpart = SSAIR_REBUILD_PIPENETS var/map_loading = TRUE - var/list/queued_for_activation + + var/log_explosive_decompression = TRUE // If things get spammy, admemes can turn this off. + + // Max number of turfs equalization will grab. + var/equalize_turf_limit = 10 + // Max number of turfs to look for a space turf, and max number of turfs that will be decompressed. + var/equalize_hard_turf_limit = 2000 + // Whether equalization should be enabled at all. + var/equalize_enabled = FALSE + // Whether turf-to-turf heat exchanging should be enabled. + var/heat_enabled = FALSE + // Max number of times process_turfs will share in a tick. + var/share_max_steps = 3 + // Excited group processing will try to equalize groups with total pressure difference less than this amount. + var/excited_group_pressure_goal = 1 + + var/list/paused_z_levels //Paused z-levels will not add turfs to active /datum/controller/subsystem/air/stat_entry(msg) msg += "C:{" - msg += "EQ:[round(cost_equalize,1)]|" - msg += "AT:[round(cost_turfs,1)]|" - msg += "EG:[round(cost_groups,1)]|" msg += "HP:[round(cost_highpressure,1)]|" msg += "HS:[round(cost_hotspots,1)]|" + msg += "HE:[round(heat_process_time(),1)]|" msg += "SC:[round(cost_superconductivity,1)]|" msg += "PN:[round(cost_pipenets,1)]|" msg += "AM:[round(cost_atmos_machinery,1)]" msg += "} " - msg += "AT:[active_turfs.len]|" - msg += "EG:[get_amt_excited_groups()]|" + msg += "TC:{" + msg += "AT:[round(cost_turfs,1)]|" + msg += "EG:[round(cost_groups,1)]|" + msg += "EQ:[round(cost_equalize,1)]|" + msg += "PO:[round(cost_post_process,1)]" + msg += "}" + msg += "TH:[round(thread_wait_ticks,1)]|" msg += "HS:[hotspots.len]|" msg += "PN:[networks.len]|" msg += "HP:[high_pressure_delta.len]|" - msg += "AS:[active_super_conductivity.len]|" - msg += "AT/MS:[round((cost ? active_turfs.len/cost : 0),0.1)]" - ..(msg) - + msg += "HT:[high_pressure_turfs]|" + msg += "LT:[low_pressure_turfs]|" + msg += "ET:[num_equalize_processed]|" + msg += "GT:[num_group_turfs_processed]|" + msg += "DF:[max_deferred_airs]|" + msg += "GA:[get_amt_gas_mixes()]|" + msg += "MG:[get_max_gas_mixes()]" + return ..() /datum/controller/subsystem/air/Initialize(timeofday) - extools_update_ssair() map_loading = FALSE setup_allturfs() setup_atmos_machinery() setup_pipenets() gas_reactions = init_gas_reactions() + auxtools_update_reactions() return ..() /datum/controller/subsystem/air/proc/extools_update_ssair() +/datum/controller/subsystem/air/proc/auxtools_update_reactions() + +/proc/reset_all_air() + SSair.can_fire = 0 + message_admins("Air reset begun.") + for(var/turf/open/T in world) + T.Initalize_Atmos(0) + CHECK_TICK + message_admins("Air reset done.") + SSair.can_fire = 1 + +/datum/controller/subsystem/air/proc/thread_running() + return FALSE + +/proc/fix_corrupted_atmos() + +/datum/admins/proc/fixcorruption() + set category = "Debug" + set desc="Fixes air that has weird NaNs (-1.#IND and such). Hopefully." + set name="Fix Infinite Air" + fix_corrupted_atmos() + /datum/controller/subsystem/air/fire(resumed = 0) + var/timer = TICK_USAGE_REAL + if(currentpart == SSAIR_REBUILD_PIPENETS) + timer = TICK_USAGE_REAL + 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) + timer = TICK_USAGE_REAL process_pipenets(resumed) cost_pipenets = MC_AVERAGE(cost_pipenets, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) if(state != SS_RUNNING) return resumed = 0 currentpart = SSAIR_ATMOSMACHINERY - + // This is only machinery like filters, mixers that don't interact with air if(currentpart == SSAIR_ATMOSMACHINERY) timer = TICK_USAGE_REAL process_atmos_machinery(resumed) @@ -95,39 +160,40 @@ SUBSYSTEM_DEF(air) if(state != SS_RUNNING) return resumed = 0 - currentpart = SSAIR_EQUALIZE + currentpart = SSAIR_HIGHPRESSURE - if(currentpart == SSAIR_EQUALIZE) + if(currentpart == SSAIR_HIGHPRESSURE) timer = TICK_USAGE_REAL - process_turf_equalize(resumed) - cost_equalize = MC_AVERAGE(cost_equalize, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + process_high_pressure_delta(resumed) + cost_highpressure = MC_AVERAGE(cost_highpressure, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) if(state != SS_RUNNING) return resumed = 0 - currentpart = SSAIR_ACTIVETURFS - - if(currentpart == SSAIR_ACTIVETURFS) - timer = TICK_USAGE_REAL - process_active_turfs(resumed) - cost_turfs = MC_AVERAGE(cost_turfs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + currentpart = SSAIR_FINALIZE_TURFS + // This literally just waits for the turf processing thread to finish, doesn't do anything else. + // this is necessary cause the next step after this interacts with the air--we get consistency + // issues if we don't wait for it, disappearing gases etc. + if(currentpart == SSAIR_FINALIZE_TURFS) + finish_turf_processing(resumed) if(state != SS_RUNNING) + cur_thread_wait_ticks++ return resumed = 0 - currentpart = SSAIR_EXCITEDGROUPS - - if(currentpart == SSAIR_EXCITEDGROUPS) + thread_wait_ticks = MC_AVERAGE(thread_wait_ticks, cur_thread_wait_ticks) + cur_thread_wait_ticks = 0 + currentpart = SSAIR_DEFERRED_AIRS + if(currentpart == SSAIR_DEFERRED_AIRS) timer = TICK_USAGE_REAL - process_excited_groups(resumed) - cost_groups = MC_AVERAGE(cost_groups, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + process_deferred_airs(resumed) + cost_deferred_airs = MC_AVERAGE(cost_deferred_airs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) if(state != SS_RUNNING) return resumed = 0 - currentpart = SSAIR_HIGHPRESSURE - - if(currentpart == SSAIR_HIGHPRESSURE) + currentpart = SSAIR_ATMOSMACHINERY_AIR + if(currentpart == SSAIR_ATMOSMACHINERY_AIR) timer = TICK_USAGE_REAL - process_high_pressure_delta(resumed) - cost_highpressure = MC_AVERAGE(cost_highpressure, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + process_atmos_air_machinery(resumed) + cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) if(state != SS_RUNNING) return resumed = 0 @@ -140,20 +206,60 @@ SUBSYSTEM_DEF(air) if(state != SS_RUNNING) return resumed = 0 - currentpart = SSAIR_SUPERCONDUCTIVITY - - if(currentpart == SSAIR_SUPERCONDUCTIVITY) + currentpart = heat_enabled ? SSAIR_TURF_CONDUCTION : SSAIR_ACTIVETURFS + // Heat -- slow and of questionable usefulness. Off by default for this reason. Pretty cool, though. + if(currentpart == SSAIR_TURF_CONDUCTION) timer = TICK_USAGE_REAL - process_super_conductivity(resumed) + if(process_turf_heat(MC_TICK_REMAINING_MS)) + pause() cost_superconductivity = MC_AVERAGE(cost_superconductivity, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) if(state != SS_RUNNING) return resumed = 0 - currentpart = SSAIR_PIPENETS - + currentpart = SSAIR_ACTIVETURFS + // This simply starts the turf thread. It runs in the background until the FINALIZE_TURFS step, at which point it's waited for. + // This also happens to do all the commented out stuff below, all in a single separate thread. This is mostly so that the + // waiting is consistent. + if(currentpart == SSAIR_ACTIVETURFS) + timer = TICK_USAGE_REAL + process_turfs(resumed) + cost_turfs = MC_AVERAGE(cost_turfs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(state != SS_RUNNING) + return + resumed = 0 + /* + // Monstermos and/or Putnamos--making large pressure deltas move faster + if(currentpart == SSAIR_EQUALIZE) + timer = TICK_USAGE_REAL + process_turf_equalize(resumed) + cost_equalize = MC_AVERAGE(cost_equalize, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(state != SS_RUNNING) + return + resumed = 0 + currentpart = SSAIR_EXCITEDGROUPS + // Making small pressure deltas equalize immediately so they don't process anymore + if(currentpart == SSAIR_EXCITEDGROUPS) + timer = TICK_USAGE_REAL + process_excited_groups(resumed) + cost_groups = MC_AVERAGE(cost_groups, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(state != SS_RUNNING) + return + resumed = 0 + currentpart = SSAIR_TURF_POST_PROCESS + // Quick multithreaded "should we display/react?" checks followed by finishing those up before the next step + if(currentpart == SSAIR_TURF_POST_PROCESS) + timer = TICK_USAGE_REAL + post_process_turfs(resumed) + cost_post_process = MC_AVERAGE(cost_post_process, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(state != SS_RUNNING) + return + resumed = 0 + currentpart = SSAIR_HOTSPOTS + */ + currentpart = SSAIR_REBUILD_PIPENETS -/datum/controller/subsystem/air/proc/process_pipenets(resumed = 0) +/datum/controller/subsystem/air/proc/process_pipenets(resumed = FALSE) if (!resumed) src.currentrun = networks.Copy() //cache for sanic speed (lists are references anyways) @@ -168,9 +274,36 @@ 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_deferred_airs(resumed = 0) + max_deferred_airs = max(deferred_airs.len,max_deferred_airs) + while(deferred_airs.len) + var/list/cur_op = deferred_airs[deferred_airs.len] + deferred_airs.len-- + var/datum/gas_mixture/air1 + var/datum/gas_mixture/air2 + if(isopenturf(cur_op[1])) + var/turf/open/T = cur_op[1] + air1 = T.return_air() + else + air1 = cur_op[1] + if(isopenturf(cur_op[2])) + var/turf/open/T = cur_op[2] + air2 = T.return_air() + else + air2 = cur_op[2] + if(istype(cur_op[3], /datum/callback)) + var/datum/callback/cb = cur_op[3] + cb.Invoke(air1, air2) + else + air1.transfer_ratio_to(air2, cur_op[3]) + if(MC_TICK_CHECK) + return /datum/controller/subsystem/air/proc/process_atmos_machinery(resumed = 0) - var/seconds = wait * 0.1 if (!resumed) src.currentrun = atmos_machinery.Copy() //cache for sanic speed (lists are references anyways) @@ -178,25 +311,30 @@ SUBSYSTEM_DEF(air) while(currentrun.len) var/obj/machinery/M = currentrun[currentrun.len] currentrun.len-- - if(!M || (M.process_atmos(seconds) == PROCESS_KILL)) + if(M == null) + atmos_machinery.Remove(M) + if(!M || (M.process_atmos() == PROCESS_KILL)) atmos_machinery.Remove(M) if(MC_TICK_CHECK) return - -/datum/controller/subsystem/air/proc/process_super_conductivity(resumed = 0) +/datum/controller/subsystem/air/proc/process_atmos_air_machinery(resumed = 0) + var/seconds = wait * 0.1 if (!resumed) - src.currentrun = active_super_conductivity.Copy() + src.currentrun = atmos_air_machinery.Copy() //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun while(currentrun.len) - var/turf/T = currentrun[currentrun.len] + var/obj/machinery/M = currentrun[currentrun.len] currentrun.len-- - T.super_conduct() + if(!M || (M.process_atmos(seconds) == PROCESS_KILL)) + atmos_air_machinery.Remove(M) if(MC_TICK_CHECK) return -/datum/controller/subsystem/air/proc/process_hotspots(resumed = 0) +/datum/controller/subsystem/air/proc/process_turf_heat() + +/datum/controller/subsystem/air/proc/process_hotspots(resumed = FALSE) if (!resumed) src.currentrun = hotspots.Copy() //cache for sanic speed (lists are references anyways) @@ -223,6 +361,9 @@ SUBSYSTEM_DEF(air) return /datum/controller/subsystem/air/proc/process_turf_equalize(resumed = 0) + if(process_turf_equalize_auxtools(resumed,MC_TICK_REMAINING_MS)) + pause() + /* //cache for sanic speed var/fire_count = times_fired if (!resumed) @@ -232,12 +373,17 @@ SUBSYSTEM_DEF(air) while(currentrun.len) var/turf/open/T = currentrun[currentrun.len] currentrun.len-- - if (istype(T)) + if (T) T.equalize_pressure_in_zone(fire_count) + //equalize_pressure_in_zone(T, fire_count) if (MC_TICK_CHECK) return + */ -/datum/controller/subsystem/air/proc/process_active_turfs(resumed = 0) +/datum/controller/subsystem/air/proc/process_turfs(resumed = 0) + if(process_turfs_auxtools(resumed,MC_TICK_REMAINING_MS)) + pause() + /* //cache for sanic speed var/fire_count = times_fired if (!resumed) @@ -247,68 +393,60 @@ SUBSYSTEM_DEF(air) while(currentrun.len) var/turf/open/T = currentrun[currentrun.len] currentrun.len-- - if (istype(T)) + if (T) T.process_cell(fire_count) if (MC_TICK_CHECK) return + */ /datum/controller/subsystem/air/proc/process_excited_groups(resumed = 0) - if(process_excited_groups_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag)) - sleep() - -/datum/controller/subsystem/air/proc/process_excited_groups_extools() -/datum/controller/subsystem/air/proc/get_amt_excited_groups() - -/datum/controller/subsystem/air/proc/remove_from_active(turf/open/T) - active_turfs -= T - if(currentpart == SSAIR_ACTIVETURFS) - currentrun -= T - #ifdef VISUALIZE_ACTIVE_TURFS - T.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#00ff00") - #endif - if(istype(T)) - T.set_excited(FALSE) - T.eg_garbage_collect() - -/datum/controller/subsystem/air/proc/add_to_active(turf/open/T, blockchanges = 1) - if(istype(T) && T.air) - #ifdef VISUALIZE_ACTIVE_TURFS - T.add_atom_colour("#00ff00", TEMPORARY_COLOUR_PRIORITY) - #endif - T.set_excited(TRUE) - active_turfs |= T - if(currentpart == SSAIR_ACTIVETURFS) - currentrun |= T - if(blockchanges) - T.eg_garbage_collect() - else if(T.flags_1 & INITIALIZED_1) - for(var/turf/S in T.atmos_adjacent_turfs) - add_to_active(S) - else if(map_loading) - if(queued_for_activation) - queued_for_activation[T] = T - return - else - T.requires_activation = TRUE + if(process_excited_groups_auxtools(resumed,MC_TICK_REMAINING_MS)) + pause() + +/datum/controller/subsystem/air/proc/finish_turf_processing(resumed = 0) + if(finish_turf_processing_auxtools(MC_TICK_REMAINING_MS)) + pause() + +/datum/controller/subsystem/air/proc/post_process_turfs(resumed = 0) + if(post_process_turfs_auxtools(resumed,MC_TICK_REMAINING_MS)) + pause() + +/datum/controller/subsystem/air/proc/finish_turf_processing_auxtools() +/datum/controller/subsystem/air/proc/process_turfs_auxtools() +/datum/controller/subsystem/air/proc/post_process_turfs_auxtools() +/datum/controller/subsystem/air/proc/process_turf_equalize_auxtools() +/datum/controller/subsystem/air/proc/process_excited_groups_auxtools() +/datum/controller/subsystem/air/proc/get_amt_gas_mixes() +/datum/controller/subsystem/air/proc/get_max_gas_mixes() +/datum/controller/subsystem/air/proc/turf_process_time() +/datum/controller/subsystem/air/proc/heat_process_time() /datum/controller/subsystem/air/StartLoadingMap() - LAZYINITLIST(queued_for_activation) map_loading = TRUE /datum/controller/subsystem/air/StopLoadingMap() map_loading = FALSE - for(var/T in queued_for_activation) - add_to_active(T) - queued_for_activation.Cut() + +/datum/controller/subsystem/air/proc/pause_z(z_level) + LAZYADD(paused_z_levels, z_level) + var/list/turfs_to_disable = block(locate(1, 1, z_level), locate(world.maxx, world.maxy, z_level)) + for(var/turf/T as anything in turfs_to_disable) + T.ImmediateDisableAdjacency(FALSE) + CHECK_TICK + +/datum/controller/subsystem/air/proc/unpause_z(z_level) + var/list/turfs_to_reinit = block(locate(1, 1, z_level), locate(world.maxx, world.maxy, z_level)) + for(var/turf/T as anything in turfs_to_reinit) + T.Initalize_Atmos() + CHECK_TICK + LAZYREMOVE(paused_z_levels, z_level) /datum/controller/subsystem/air/proc/setup_allturfs() var/list/turfs_to_init = block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz)) - var/list/active_turfs = src.active_turfs var/times_fired = ++src.times_fired // Clear active turfs - faster than removing every single turf in the world // one-by-one, and Initalize_Atmos only ever adds `src` back in. - active_turfs.Cut() for(var/thing in turfs_to_init) var/turf/T = thing @@ -317,40 +455,8 @@ SUBSYSTEM_DEF(air) T.Initalize_Atmos(times_fired) CHECK_TICK - if(active_turfs.len) - var/starting_ats = active_turfs.len - sleep(world.tick_lag) - var/timer = world.timeofday - log_mapping("There are [starting_ats] active turfs at roundstart caused by a difference of the air between the adjacent turfs. You can see its coordinates using \"Mapping -> Show roundstart AT list\" verb (debug verbs required).") - for(var/turf/T in active_turfs) - GLOB.active_turfs_startlist += T - - //now lets clear out these active turfs - var/list/turfs_to_check = active_turfs.Copy() - do - var/list/new_turfs_to_check = list() - for(var/turf/open/T in turfs_to_check) - new_turfs_to_check += T.resolve_active_graph() - CHECK_TICK - - active_turfs += new_turfs_to_check - turfs_to_check = new_turfs_to_check - - while (turfs_to_check.len) - var/ending_ats = active_turfs.len - - var/msg = "HEY! LISTEN! [DisplayTimeText(world.timeofday - timer)] were wasted processing [starting_ats] turf(s) (connected to [ending_ats] other turfs) with atmos differences at round start." - to_chat(world, "[msg]") - warning(msg) - -/turf/open/proc/resolve_active_graph() - . = list() - -/turf/open/space/resolve_active_graph() - return list() - /datum/controller/subsystem/air/proc/setup_atmos_machinery() - for (var/obj/machinery/atmospherics/AM in atmos_machinery) + for (var/obj/machinery/atmospherics/AM in atmos_machinery + atmos_air_machinery) AM.atmosinit() CHECK_TICK @@ -358,11 +464,13 @@ SUBSYSTEM_DEF(air) // all atmos machinery has to initalize before the first // pipenet can be built. /datum/controller/subsystem/air/proc/setup_pipenets() - for (var/obj/machinery/atmospherics/AM in atmos_machinery) + for (var/obj/machinery/atmospherics/AM in atmos_machinery + atmos_air_machinery) AM.build_network() CHECK_TICK /datum/controller/subsystem/air/proc/setup_template_machinery(list/atmos_machines) + if(!initialized) // yogs - fixes randomized bars + return // yogs for(var/A in atmos_machines) var/obj/machinery/atmospherics/AM = A AM.atmosinit() @@ -384,24 +492,14 @@ SUBSYSTEM_DEF(air) return pipe_init_dirs_cache[type]["[dir]"] -/datum/controller/subsystem/air/proc/generate_atmos() - atmos_gen = list() - for(var/T in subtypesof(/datum/atmosphere)) - var/datum/atmosphere/atmostype = T - atmos_gen[initial(atmostype.id)] = new atmostype - -/datum/controller/subsystem/air/proc/preprocess_gas_string(gas_string) - if(!atmos_gen) - generate_atmos() - if(!atmos_gen[gas_string]) - return gas_string - var/datum/atmosphere/mix = atmos_gen[gas_string] - return mix.gas_string - #undef SSAIR_PIPENETS #undef SSAIR_ATMOSMACHINERY -#undef SSAIR_ACTIVETURFS #undef SSAIR_EXCITEDGROUPS #undef SSAIR_HIGHPRESSURE #undef SSAIR_HOTSPOTS -#undef SSAIR_SUPERCONDUCTIVITY +#undef SSAIR_TURF_CONDUCTION +#undef SSAIR_EQUALIZE +#undef SSAIR_ACTIVETURFS +#undef SSAIR_TURF_POST_PROCESS +#undef SSAIR_FINALIZE_TURFS +#undef SSAIR_ATMOSMACHINERY_AIR diff --git a/code/controllers/subsystem/ambience.dm b/code/controllers/subsystem/ambience.dm index 36b0a1fd60ff5..9a3aab7baf06d 100644 --- a/code/controllers/subsystem/ambience.dm +++ b/code/controllers/subsystem/ambience.dm @@ -1,71 +1,53 @@ -#define AMBIENT_EFFECT_COOLDOWN 600 // The minimum amount to wait between playing ambient effects (deciseconds) - -#define AMBIENT_BUZZ_VOLUME 40 -#define AMBIENT_MUSIC_VOLUME 75 -#define AMBIENT_EFFECTS_VOLUME 45 - -// Ambient sounds: buzz, effects, music +/// The subsystem used to play ambience to users every now and then, makes them real excited. SUBSYSTEM_DEF(ambience) name = "Ambience" - wait = 2 + flags = SS_BACKGROUND|SS_NO_INIT priority = FIRE_PRIORITY_AMBIENCE - flags = SS_NO_INIT runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + wait = 2 + ///Assoc list of listening client - next ambience time + var/list/ambience_listening_clients = list() - var/list/currentrun = list() - - -/datum/controller/subsystem/ambience/fire(resumed = 0) - if (!resumed) - src.currentrun = GLOB.clients.Copy() +/datum/controller/subsystem/ambience/fire(resumed) + for(var/client/client_iterator as anything in ambience_listening_clients) - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun + if(isnull(client_iterator)) + ambience_listening_clients -= client_iterator + continue - while(currentrun.len) - var/client/C = currentrun[currentrun.len] - currentrun.len-- + if(isnewplayer(client_iterator.mob)) + continue - if (C) - var/mob/M = C.mob + var/area/current_area = get_area(client_iterator.mob) - if(M) - if (istype(M, /mob/dead/new_player)) // Don't play ambience to nerds in the lobby - continue + play_buzz(client_iterator.mob, current_area) - src.update_buzz(M) // Update buzz every fire, or every 1/5th second + if(ambience_listening_clients[client_iterator] > world.time) + continue //Not ready for the next sound - if (src.times_fired % 5 == 0) // Only update effects and music every second instead of every 1/5th second - src.update_effects(M) - src.update_music(M) + var/ambi_fx = pick(current_area.ambientsounds) + var/ambi_music = pick(current_area.ambientmusic) - if (MC_TICK_CHECK) - return + play_ambience_music(client_iterator.mob, ambi_music, current_area) + play_ambience_effects(client_iterator.mob, ambi_fx, current_area) -/datum/controller/subsystem/ambience/proc/update_buzz(mob/M) // Buzz, the growling buzz of the station, etc, IC (requires the user to be able to hear) - var/area/A = get_area(M) + ambience_listening_clients[client_iterator] = world.time + rand(current_area.min_ambience_cooldown, current_area.max_ambience_cooldown) +/datum/controller/subsystem/ambience/proc/play_buzz(mob/M, area/A) if (A.ambient_buzz && (M.client.prefs.toggles & SOUND_SHIP_AMBIENCE) && M.can_hear_ambience()) - if (!M.client.ambient_buzz_playing || (A.ambient_buzz != M.client.ambient_buzz_playing)) - SEND_SOUND(M, sound(A.ambient_buzz, repeat = 1, wait = 0, volume = AMBIENT_BUZZ_VOLUME, channel = CHANNEL_AMBIENT_BUZZ)) - M.client.ambient_buzz_playing = A.ambient_buzz // It's done this way so I can tell when the user switches to an area that has a different buzz effect, so we can seamlessly swap over to that one - - else if (M.client.ambient_buzz_playing) // If it's playing, and it shouldn't be, stop it - M.stop_sound_channel(CHANNEL_AMBIENT_BUZZ) - M.client.ambient_buzz_playing = null - - -/datum/controller/subsystem/ambience/proc/update_music(mob/M) // Background music, the more OOC ambience, like eerie space music - var/area/A = get_area(M) - - if (A.ambient_music && (M.client.prefs.toggles & SOUND_AMBIENCE) && prob(1.25) && !M.client.channel_in_use(CHANNEL_AMBIENT_MUSIC)) // 1/80 chance to play every second, only play while another one is not playing - SEND_SOUND(M, sound(pick(A.ambient_music), repeat = 0, wait = 0, volume = AMBIENT_MUSIC_VOLUME, channel = CHANNEL_AMBIENT_MUSIC)) + if (!M.client.buzz_playing || (A.ambient_buzz != M.client.buzz_playing)) + SEND_SOUND(M, sound(A.ambient_buzz, repeat = 1, wait = 0, volume = 40, channel = CHANNEL_BUZZ)) + M.client.buzz_playing = A.ambient_buzz // It's done this way so I can tell when the user switches to an area that has a different buzz effect, so we can seamlessly swap over to that one + else if (M.client.buzz_playing) // If it's playing, and it shouldn't be, stop it + M.stop_sound_channel(CHANNEL_BUZZ) + M.client.buzz_playing = null -/datum/controller/subsystem/ambience/proc/update_effects(mob/M) // Effect, random sounds that will play at random times, IC (requires the user to be able to hear) - var/area/A = get_area(M) +/datum/controller/subsystem/ambience/proc/play_ambience_music(mob/M, _ambi_music, area/A) // Background music, the more OOC ambience, like eerie space music + if(A.ambientmusic && !M.client?.channel_in_use(CHANNEL_AMBIENT_MUSIC)) + SEND_SOUND(M, sound(_ambi_music, repeat = 0, wait = 0, volume = 75, channel = CHANNEL_AMBIENT_MUSIC)) - if (A.ambient_effects && (M.client.prefs.toggles & SOUND_AMBIENCE) && M.can_hear_ambience() && (world.time - M.client.ambient_effect_last_played) > AMBIENT_EFFECT_COOLDOWN && prob(5) && !M.client.channel_in_use(CHANNEL_AMBIENT_EFFECTS)) // 1/20 chance to play every second after cooldown - SEND_SOUND(M, sound(pick(A.ambient_effects), repeat = 0, wait = 0, volume = AMBIENT_EFFECTS_VOLUME, channel = CHANNEL_AMBIENT_EFFECTS)) - M.client.ambient_effect_last_played = world.time +/datum/controller/subsystem/ambience/proc/play_ambience_effects(mob/M, _ambi_fx, area/A) // Effect, random sounds that will play at random times, IC (requires the user to be able to hear) + if (length(A.ambientsounds) && M.can_hear_ambience() && !M.client?.channel_in_use(CHANNEL_AMBIENT_EFFECTS)) + SEND_SOUND(M, sound(_ambi_fx, repeat = 0, wait = 0, volume = 45, channel = CHANNEL_AMBIENT_EFFECTS)) diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 86c40e9f916a5..f139d4692b1bd 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -14,6 +14,11 @@ SUBSYSTEM_DEF(atoms) var/list/BadInitializeCalls = list() + ///initAtom() adds the atom its creating to this list iff InitializeAtoms() has been given a list to populate as an argument + var/list/created_atoms + + initialized = INITIALIZATION_INSSATOMS + /datum/controller/subsystem/atoms/Initialize(timeofday) GLOB.fire_overlay.appearance_flags = RESET_COLOR setupGenetics() //to set the mutations' sequence @@ -21,12 +26,15 @@ SUBSYSTEM_DEF(atoms) InitializeAtoms() return ..() -/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms) +/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms, list/atoms_to_return = null) if(initialized == INITIALIZATION_INSSATOMS) return initialized = INITIALIZATION_INNEW_MAPLOAD + if (atoms_to_return) + LAZYINITLIST(created_atoms) + var/count var/list/mapload_arg = list(TRUE) if(atoms) @@ -34,13 +42,13 @@ SUBSYSTEM_DEF(atoms) for(var/I in atoms) var/atom/A = I if(!(A.flags_1 & INITIALIZED_1)) - InitAtom(I, mapload_arg) CHECK_TICK + InitAtom(A, TRUE, mapload_arg) else count = 0 for(var/atom/A in world) if(!(A.flags_1 & INITIALIZED_1)) - InitAtom(A, mapload_arg) + InitAtom(A, FALSE, mapload_arg) ++count CHECK_TICK @@ -52,11 +60,19 @@ SUBSYSTEM_DEF(atoms) if(late_loaders.len) for(var/I in late_loaders) var/atom/A = I + //I hate that we need this + if(QDELETED(A)) + continue A.LateInitialize() testing("Late initialized [late_loaders.len] atoms") late_loaders.Cut() -/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments) + if (created_atoms) + atoms_to_return += created_atoms + created_atoms = null + +/// Init this specific atom +/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, from_template = FALSE, list/arguments) var/the_type = A.type if(QDELING(A)) BadInitializeCalls[the_type] |= BAD_INIT_QDEL_BEFORE @@ -81,6 +97,9 @@ SUBSYSTEM_DEF(atoms) if(INITIALIZE_HINT_QDEL) qdel(A) qdeleted = TRUE + if(INITIALIZE_HINT_QDEL_FORCE) + qdel(A, force = TRUE) + qdeleted = TRUE else BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT @@ -88,6 +107,10 @@ SUBSYSTEM_DEF(atoms) qdeleted = TRUE else if(!(A.flags_1 & INITIALIZED_1)) BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT + else + SEND_SIGNAL(A,COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) + if(created_atoms && from_template && ispath(the_type, /atom/movable))//we only want to populate the list with movables + created_atoms += A.GetAllContents() return qdeleted || QDELING(A) diff --git a/code/controllers/subsystem/augury.dm b/code/controllers/subsystem/augury.dm index 1b1c7bc3b7b87..c598bc833abc7 100644 --- a/code/controllers/subsystem/augury.dm +++ b/code/controllers/subsystem/augury.dm @@ -9,7 +9,7 @@ SUBSYSTEM_DEF(augury) var/list/observers_given_action = list() /datum/controller/subsystem/augury/stat_entry(msg) - ..("W:[watchers.len]|D:[doombringers.len]") + . = ..("W:[watchers.len]|D:[doombringers.len]") /datum/controller/subsystem/augury/proc/register_doom(atom/A, severity) doombringers[A] = severity diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index 975575022b378..2e95e330ce983 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -155,6 +155,8 @@ SUBSYSTEM_DEF(blackbox) record_feedback("tally", "radio_usage", 1, "service") if(FREQ_SUPPLY) record_feedback("tally", "radio_usage", 1, "supply") + if(FREQ_EXPLORATION) + record_feedback("tally", "radio_usage", 1, "exploration") if(FREQ_CENTCOM) record_feedback("tally", "radio_usage", 1, "centcom") if(FREQ_AI_PRIVATE) @@ -190,7 +192,7 @@ feedback data can be recorded in 5 formats: SSblackbox.record_feedback("amount", "example", 2) json: {"data":10} "tally" - used to track the number of occurances of multiple related values i.e. how many times each type of gun is fired + used to track the number of occurrences of multiple related values i.e. how many times each type of gun is fired further calls to the same key will: add or subtract from the saved value of the data key if it already exists append the key and it's value if it doesn't exist @@ -199,7 +201,7 @@ feedback data can be recorded in 5 formats: SSblackbox.record_feedback("tally", "example", 2, "other data") json: {"data":{"sample data":5,"other data":2}} "nested tally" - used to track the number of occurances of structured semi-relational values i.e. the results of arcade machines + used to track the number of occurrences of structured semi-relational values i.e. the results of arcade machines similar to running total, but related values are nested in a multi-dimensional array built the final element in the data list is used as the tracking key, all prior elements are used for nesting all data list elements must be strings diff --git a/code/controllers/subsystem/callback.dm b/code/controllers/subsystem/callback.dm new file mode 100644 index 0000000000000..ecc65760f4e80 --- /dev/null +++ b/code/controllers/subsystem/callback.dm @@ -0,0 +1,14 @@ +SUBSYSTEM_DEF(callbacks) + name = "Auxtools Callbacks" + flags = SS_TICKER | SS_NO_INIT + wait = 1 + priority = FIRE_PRIORITY_CALLBACKS + +/proc/process_atmos_callbacks() + SScallbacks.can_fire = 0 + SScallbacks.flags |= SS_NO_FIRE + CRASH("Auxtools not found! Callback subsystem shutting itself off.") + +/datum/controller/subsystem/callbacks/fire() + if(process_atmos_callbacks(MC_TICK_REMAINING_MS)) + pause() diff --git a/code/controllers/subsystem/communications.dm b/code/controllers/subsystem/communications.dm index 718357b8bb9ca..3ec718eb10d6e 100644 --- a/code/controllers/subsystem/communications.dm +++ b/code/controllers/subsystem/communications.dm @@ -16,14 +16,14 @@ SUBSYSTEM_DEF(communications) else . = TRUE -/datum/controller/subsystem/communications/proc/make_announcement(mob/living/user, is_silicon, input) +/datum/controller/subsystem/communications/proc/make_announcement(mob/living/user, is_silicon, input, auth_id) if(!can_announce(user, is_silicon)) return FALSE if(is_silicon) - minor_announce(html_decode(input),"[user.name] Announces:") + minor_announce(input,"[user.name] Announces:", html_encode = FALSE) silicon_message_cooldown = world.time + COMMUNICATION_COOLDOWN_AI else - priority_announce(html_decode(user.treat_message(input)), null, 'sound/misc/announce.ogg', "Captain") + priority_announce(html_decode(user.treat_message(input)), null, 'sound/misc/announce.ogg', "Captain", has_important_message = TRUE, auth_id = auth_id) nonsilicon_message_cooldown = world.time + COMMUNICATION_COOLDOWN user.log_talk(input, LOG_SAY, tag="priority announcement") message_admins("[ADMIN_LOOKUPFLW(user)] has made a priority announcement.") diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index 496105096729b..104c3eef31d35 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -1,28 +1,54 @@ PROCESSING_SUBSYSTEM_DEF(dcs) name = "Datum Component System" flags = SS_NO_INIT + wait = 1 SECONDS var/list/elements_by_type = list() /datum/controller/subsystem/processing/dcs/Recover() comp_lookup = SSdcs.comp_lookup -/datum/controller/subsystem/processing/dcs/proc/GetElement(datum/element/eletype, ...) +/datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments) + var/datum/element/eletype = arguments[1] var/element_id = eletype + if(!ispath(eletype, /datum/element)) + CRASH("Attempted to instantiate [eletype] as a /datum/element") + if(initial(eletype.element_flags) & ELEMENT_BESPOKE) - var/list/fullid = list("[eletype]") - for(var/i in initial(eletype.id_arg_index) to length(args)) - var/argument = args[i] - if(istext(argument) || isnum_safe(argument)) - fullid += "[argument]" - else - fullid += "[REF(argument)]" - element_id = fullid.Join("&") + element_id = GetIdFromArguments(arguments) . = elements_by_type[element_id] if(.) return - if(!ispath(eletype, /datum/element)) - CRASH("Attempted to instantiate [eletype] as a /datum/element") . = elements_by_type[element_id] = new eletype + +/**** + * Generates an id for bespoke elements when given the argument list + * Generating the id here is a bit complex because we need to support named arguments + * Named arguments can appear in any order and we need them to appear after ordered arguments + * We assume that no one will pass in a named argument with a value of null + **/ +/datum/controller/subsystem/processing/dcs/proc/GetIdFromArguments(list/arguments) + var/datum/element/eletype = arguments[1] + var/list/fullid = list("[eletype]") + var/list/named_arguments = list() + for(var/i in initial(eletype.id_arg_index) to length(arguments)) + var/key = arguments[i] + var/value + if(istext(key)) + value = arguments[key] + if(!(istext(key) || isnum(key))) + key = REF(key) + key = "[key]" // Key is stringified so numbers dont break things + if(!isnull(value)) + if(!(istext(value) || isnum(value))) + value = REF(value) + named_arguments["[key]"] = value + else + fullid += "[key]" + + if(length(named_arguments)) + named_arguments = sortList(named_arguments) + fullid += named_arguments + return list2params(fullid) diff --git a/code/controllers/subsystem/delay_component.dm b/code/controllers/subsystem/delay_component.dm new file mode 100644 index 0000000000000..3e549ae7963ea --- /dev/null +++ b/code/controllers/subsystem/delay_component.dm @@ -0,0 +1,34 @@ +SUBSYSTEM_DEF(circuit_component) + name = "Circuit Components" + wait = 0.1 SECONDS + priority = FIRE_PRIORITY_DEFAULT + + var/list/callbacks_to_invoke = list() + var/list/currentrun = list() + +/datum/controller/subsystem/circuit_component/fire(resumed) + if(!resumed) + currentrun = callbacks_to_invoke.Copy() + callbacks_to_invoke.Cut() + + while(length(currentrun)) + var/datum/callback/to_call = currentrun[1] + currentrun.Cut(1,2) + + if(QDELETED(to_call)) + continue + + to_call.InvokeAsync() + qdel(to_call) + + if(MC_TICK_CHECK) + return + +/** + * Adds a callback to be invoked when the next fire() is done. Used by the integrated circuit system. + * + * Prevents race conditions as it acts like a queue system. + * Those that registered first will be executed first and those registered last will be executed last. + */ +/datum/controller/subsystem/circuit_component/proc/add_callback(datum/callback/to_call) + callbacks_to_invoke += to_call diff --git a/code/controllers/subsystem/disease.dm b/code/controllers/subsystem/disease.dm index 9be1d8d90c09d..1a7fe78fd1cd8 100644 --- a/code/controllers/subsystem/disease.dm +++ b/code/controllers/subsystem/disease.dm @@ -20,7 +20,7 @@ SUBSYSTEM_DEF(disease) return ..() /datum/controller/subsystem/disease/stat_entry(msg) - ..("P:[active_diseases.len]") + . = ..("P:[active_diseases.len]") /datum/controller/subsystem/disease/proc/get_disease_name(id) var/datum/disease/advance/A = archive_diseases[id] diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index 16a616d0347ef..cd3515790d02c 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -4,7 +4,7 @@ SUBSYSTEM_DEF(economy) init_order = INIT_ORDER_ECONOMY runlevels = RUNLEVEL_GAME var/roundstart_paychecks = 5 - var/budget_pool = 35000 + var/budget_pool = 25000 var/list/department_accounts = list(ACCOUNT_CIV = ACCOUNT_CIV_NAME, ACCOUNT_ENG = ACCOUNT_ENG_NAME, ACCOUNT_SCI = ACCOUNT_SCI_NAME, @@ -15,38 +15,11 @@ SUBSYSTEM_DEF(economy) 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() + ///The modifier multiplied to the value of bounties paid out. + ///Multiplied as they go to all department accounts rather than just cargo. + var/bounty_modifier = 3 /datum/controller/subsystem/economy/Initialize(timeofday) var/budget_to_hand_out = round(budget_pool / department_accounts.len) @@ -55,10 +28,6 @@ SUBSYSTEM_DEF(economy) return ..() /datum/controller/subsystem/economy/fire(resumed = 0) - boring_eng_payout() // Payout based on nothing. What will replace it? Surplus power, powered APC's, air alarms? Who knows. - boring_sci_payout() // Payout based on slimes. - boring_secmedsrv_payout() // Payout based on crew safety, health, and mood. - boring_civ_payout() // Payout based on ??? Profit for(var/A in bank_accounts) var/datum/bank_account/B = A B.payday(1) @@ -69,62 +38,46 @@ SUBSYSTEM_DEF(economy) if(D.department_id == dep_id) return D -/datum/controller/subsystem/economy/proc/boring_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/distribute_funds(amount) + var/datum/bank_account/eng = get_dep_account(ACCOUNT_ENG) + var/datum/bank_account/sec = get_dep_account(ACCOUNT_SEC) + var/datum/bank_account/med = get_dep_account(ACCOUNT_MED) + var/datum/bank_account/srv = get_dep_account(ACCOUNT_SRV) + var/datum/bank_account/sci = get_dep_account(ACCOUNT_SCI) + var/datum/bank_account/civ = get_dep_account(ACCOUNT_CIV) + var/datum/bank_account/car = get_dep_account(ACCOUNT_CAR) -/datum/controller/subsystem/economy/proc/boring_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/departments = 0 - 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/fuck = alive_crew / crew - cash_to_grant = (crew_safety_bounty * fuck) + (monster_bounty * dead_monsters) - var/datum/bank_account/D = get_dep_account(ACCOUNT_SEC) - if(D) - D.adjust_money(cash_to_grant) + if(eng) + departments += 2 + if(sec) + departments += 2 + if(med) + departments += 2 + if(srv) + departments += 1 + if(sci) + departments += 2 + if(civ) + departments += 1 + if(car) + departments += 2 -/datum/controller/subsystem/economy/proc/boring_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(science_bounty) + var/parts = round(amount / departments) -/datum/controller/subsystem/economy/proc/boring_civ_payout() - var/datum/bank_account/D = get_dep_account(ACCOUNT_CIV) - if(D) - D.adjust_money((rand(1,5) * 500)) + var/engineering_cash = parts * 2 + var/security_cash = parts * 2 + var/medical_cash = parts * 2 + var/service_cash = parts + var/science_cash = parts * 2 + var/civilian_cash = parts + var/cargo_cash = parts * 2 + + eng?.adjust_money(engineering_cash) + sec?.adjust_money(security_cash) + med?.adjust_money(medical_cash) + srv?.adjust_money(service_cash) + sci?.adjust_money(science_cash) + civ?.adjust_money(civilian_cash) + car?.adjust_money(cargo_cash) diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 37b8ae95b19bc..013da1753862c 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -37,7 +37,7 @@ SUBSYSTEM_DEF(events) var/datum/thing = currentrun[currentrun.len] currentrun.len-- if(thing) - thing.process() + thing.process(wait * 0.1) else running.Remove(thing) if (MC_TICK_CHECK) diff --git a/code/controllers/subsystem/explosion.dm b/code/controllers/subsystem/explosion.dm new file mode 100644 index 0000000000000..54aacd08b9b8f --- /dev/null +++ b/code/controllers/subsystem/explosion.dm @@ -0,0 +1,601 @@ +#define EXPLOSION_THROW_SPEED 4 +GLOBAL_LIST_EMPTY(explosions) + +SUBSYSTEM_DEF(explosions) + name = "Explosions" + init_order = INIT_ORDER_EXPLOSIONS + priority = FIRE_PRIORITY_EXPLOSIONS + wait = 1 + flags = SS_TICKER|SS_NO_INIT + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + + var/cost_lowturf = 0 + var/cost_medturf = 0 + var/cost_highturf = 0 + var/cost_flameturf = 0 + + var/cost_throwturf = 0 + + var/cost_low_mov_atom = 0 + var/cost_med_mov_atom = 0 + var/cost_high_mov_atom = 0 + + var/list/lowturf = list() + var/list/medturf = list() + var/list/highturf = list() + var/list/flameturf = list() + + var/list/throwturf = list() + + var/list/low_mov_atom = list() + var/list/med_mov_atom = list() + var/list/high_mov_atom = list() + + var/list/explosions = list() + + var/currentpart = SSAIR_REBUILD_PIPENETS + + +/datum/controller/subsystem/explosions/stat_entry(msg) + msg += "C:{" + msg += "LT:[round(cost_lowturf,1)]|" + msg += "MT:[round(cost_medturf,1)]|" + msg += "HT:[round(cost_highturf,1)]|" + msg += "FT:[round(cost_flameturf,1)]||" + + msg += "LO:[round(cost_low_mov_atom,1)]|" + msg += "MO:[round(cost_med_mov_atom,1)]|" + msg += "HO:[round(cost_high_mov_atom,1)]|" + + msg += "TO:[round(cost_throwturf,1)]" + + msg += "} " + + msg += "AMT:{" + msg += "LT:[lowturf.len]|" + msg += "MT:[medturf.len]|" + msg += "HT:[highturf.len]|" + msg += "FT:[flameturf.len]||" + + msg += "LO:[low_mov_atom.len]|" + msg += "MO:[med_mov_atom.len]|" + msg += "HO:[high_mov_atom.len]|" + + msg += "TO:[throwturf.len]" + + msg += "} " + return ..() + + +#define SSEX_TURF "turf" +#define SSEX_OBJ "obj" + +/datum/controller/subsystem/explosions/proc/is_exploding() + return (lowturf.len || medturf.len || highturf.len || flameturf.len || throwturf.len || low_mov_atom.len || med_mov_atom.len || high_mov_atom.len) + +/datum/controller/subsystem/explosions/proc/wipe_turf(turf/T) + lowturf -= T + medturf -= T + highturf -= T + flameturf -= T + throwturf -= T + +/client/proc/check_bomb_impacts() + set name = "Check Bomb Impact" + set category = "Debug" + + var/newmode = alert("Use reactionary explosions?","Check Bomb Impact", "Yes", "No") + var/turf/epicenter = get_turf(mob) + if(!epicenter) + return + + var/dev = 0 + var/heavy = 0 + var/light = 0 + var/list/choices = list("Small Bomb","Medium Bomb","Big Bomb","Custom Bomb") + var/choice = input("Bomb Size?") in choices + switch(choice) + if(null) + return 0 + if("Small Bomb") + dev = 1 + heavy = 2 + light = 3 + if("Medium Bomb") + dev = 2 + heavy = 3 + light = 4 + if("Big Bomb") + dev = 3 + heavy = 5 + light = 7 + if("Custom Bomb") + dev = input("Devastation range (Tiles):") as num + heavy = input("Heavy impact range (Tiles):") as num + light = input("Light impact range (Tiles):") as num + + var/max_range = max(dev, heavy, light) + var/x0 = epicenter.x + var/y0 = epicenter.y + var/list/wipe_colours = list() + for(var/turf/T as() in spiral_range_turfs(max_range, epicenter)) + wipe_colours += T + var/dist = cheap_hypotenuse(T.x, T.y, x0, y0) + + if(newmode == "Yes") + var/turf/TT = T + while(TT != epicenter) + TT = get_step_towards(TT,epicenter) + if(TT.density) + dist += TT.explosion_block + + for(var/obj/O in T) + var/the_block = O.explosion_block + dist += the_block == EXPLOSION_BLOCK_PROC ? O.GetExplosionBlock() : the_block + + if(dist < dev) + T.color = "red" + T.maptext = MAPTEXT("Dev") + else if (dist < heavy) + T.color = "yellow" + T.maptext = MAPTEXT("Heavy") + else if (dist < light) + T.color = "blue" + T.maptext = MAPTEXT("Light") + else + continue + + addtimer(CALLBACK(GLOBAL_PROC, .proc/wipe_color_and_text, wipe_colours), 100) + +/proc/wipe_color_and_text(list/atom/wiping) + for(var/i in wiping) + var/atom/A = i + A.color = null + A.maptext = "" + +/proc/dyn_explosion(turf/epicenter, power, flash_range, adminlog = TRUE, ignorecap = TRUE, flame_range = 0, silent = FALSE, smoke = TRUE) + if(!power) + return + var/range = 0 + range = round((2 * power)**GLOB.DYN_EX_SCALE) + explosion(epicenter, round(range * 0.25), round(range * 0.5), round(range), flash_range*range, adminlog, ignorecap, flame_range*range, silent, smoke) + +// Using default dyn_ex scale: +// 100 explosion power is a (5, 10, 20) explosion. +// 75 explosion power is a (4, 8, 17) explosion. +// 50 explosion power is a (3, 7, 14) explosion. +// 25 explosion power is a (2, 5, 10) explosion. +// 10 explosion power is a (1, 3, 6) explosion. +// 5 explosion power is a (0, 1, 3) explosion. +// 1 explosion power is a (0, 0, 1) explosion. + +/proc/explosion(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = TRUE, ignorecap = FALSE, flame_range = 0, silent = FALSE, smoke = FALSE) + . = SSexplosions.explode(arglist(args)) + +#define CREAK_DELAY 5 SECONDS //Time taken for the creak to play after explosion, if applicable. +#define DEVASTATION_PROB 30 //The probability modifier for devistation, maths! +#define HEAVY_IMPACT_PROB 5 //ditto +#define FAR_UPPER 60 //Upper limit for the far_volume, distance, clamped. +#define FAR_LOWER 40 //lower limit for the far_volume, distance, clamped. +#define PROB_SOUND 75 //The probability modifier for a sound to be an echo, or a far sound. (0-100) +#define SHAKE_CLAMP 2.5 //The limit for how much the camera can shake for out of view booms. +#define FREQ_UPPER 40 //The upper limit for the randomly selected frequency. +#define FREQ_LOWER 25 //The lower of the above. + +/datum/controller/subsystem/explosions/proc/explode(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog, ignorecap, flame_range, silent, smoke, explode_z = TRUE) + epicenter = get_turf(epicenter) + if(!epicenter) + return + + if(isnull(flame_range)) + flame_range = light_impact_range + if(isnull(flash_range)) + flash_range = devastation_range + + // Archive the uncapped explosion for the doppler array. + var/orig_dev_range = devastation_range + var/orig_heavy_range = heavy_impact_range + var/orig_light_range = light_impact_range + + var/orig_max_distance = max(devastation_range, heavy_impact_range, light_impact_range, flash_range, flame_range) + + //Zlevel specific bomb cap multiplier. + var/cap_multiplier = SSmapping.level_trait(epicenter.z, ZTRAIT_BOMBCAP_MULTIPLIER) + if (isnull(cap_multiplier)) + cap_multiplier = 1 + + if(!ignorecap) + devastation_range = min(GLOB.MAX_EX_DEVESTATION_RANGE * cap_multiplier, devastation_range) + heavy_impact_range = min(GLOB.MAX_EX_HEAVY_RANGE * cap_multiplier, heavy_impact_range) + light_impact_range = min(GLOB.MAX_EX_LIGHT_RANGE * cap_multiplier, light_impact_range) + flash_range = min(GLOB.MAX_EX_FLASH_RANGE * cap_multiplier, flash_range) + flame_range = min(GLOB.MAX_EX_FLAME_RANGE * cap_multiplier, flame_range) + + var/max_range = max(devastation_range, heavy_impact_range, light_impact_range, flame_range) + var/started_at = REALTIMEOFDAY + if(adminlog) + message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in [ADMIN_VERBOSEJMP(epicenter)]") + log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in [loc_name(epicenter)]") + + var/x0 = epicenter.x + var/y0 = epicenter.y + var/z0 = epicenter.get_virtual_z_level() + var/area/areatype = get_area(epicenter) + SSblackbox.record_feedback("associative", "explosion", 1, list("dev" = devastation_range, "heavy" = heavy_impact_range, "light" = light_impact_range, "flash" = flash_range, "flame" = flame_range, "orig_dev" = orig_dev_range, "orig_heavy" = orig_heavy_range, "orig_light" = orig_light_range, "x" = x0, "y" = y0, "z" = z0, "area" = areatype.type, "time" = time_stamp("YYYY-MM-DD hh:mm:ss", 1))) + + // Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. + // Stereo users will also hear the direction of the explosion! + + // Calculate far explosion sound range. Only allow the sound effect for heavy/devastating explosions. + // 3/7/14 will calculate to 80 + 35 + + var/far_dist = 0 + far_dist += heavy_impact_range * 15 + far_dist += devastation_range * 20 + + if(!silent) + var/frequency = get_rand_frequency() + var/sound/explosion_sound = sound(get_sfx("explosion")) + var/sound/far_explosion_sound = sound('sound/effects/explosionfar.ogg') + var/sound/creaking_explosion_sound = sound(get_sfx("explosion_creaking")) + var/sound/hull_creaking_sound = sound(get_sfx("hull_creaking")) + var/sound/explosion_echo_sound = sound('sound/effects/explosion_distant.ogg') + var/on_station = SSmapping.level_trait(epicenter.z, ZTRAIT_STATION) + var/creaking_explosion = FALSE + + if(prob(devastation_range*DEVASTATION_PROB+heavy_impact_range*HEAVY_IMPACT_PROB) && on_station) // Huge explosions are near guaranteed to make the station creak and whine, smaller ones might. + creaking_explosion = TRUE // prob over 100 always returns true + + for(var/MN in GLOB.player_list) + var/mob/M = MN + // Double check for client + var/turf/M_turf = get_turf(M) + var/multiz_dist = multi_z_dist(M_turf, epicenter) + if(M_turf && multiz_dist <= 5000) + var/dist = multiz_dist + var/baseshakeamount + if(orig_max_distance - dist > 0) + baseshakeamount = sqrt((orig_max_distance - dist)*0.1) + // If inside the blast radius + world.view (x) - 2 + if(dist <= round(max_range + getviewsize(world.view)[1] - 2, 1)) + M.playsound_local(epicenter, null, 100, 1, frequency, falloff_exponent = 5, S = explosion_sound) + if(baseshakeamount > 0) + 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/2, FAR_LOWER, FAR_UPPER) // Volume is based on explosion size and dist + if(creaking_explosion) + M.playsound_local(epicenter, null, far_volume, 1, frequency, S = creaking_explosion_sound, distance_multiplier = 0) + else if(prob(PROB_SOUND)) // Sound variety during meteor storm/tesloose/other bad event + M.playsound_local(epicenter, null, far_volume, 1, frequency, S = far_explosion_sound, distance_multiplier = 0) // Far sound + else + M.playsound_local(epicenter, null, far_volume, 1, frequency, S = explosion_echo_sound, distance_multiplier = 0) // Echo sound + + if(baseshakeamount > 0 || devastation_range) + if(!baseshakeamount) // Devastating explosions rock the station and ground + baseshakeamount = devastation_range*3 + shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, SHAKE_CLAMP)) + else if(!isspaceturf(get_turf(M)) && heavy_impact_range) // Big enough explosions echo throughout the hull + var/echo_volume = 40 + if(devastation_range) + baseshakeamount = devastation_range + shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, SHAKE_CLAMP)) + echo_volume = 60 + M.playsound_local(epicenter, null, echo_volume, 1, frequency, S = explosion_echo_sound, distance_multiplier = 0) + + if(creaking_explosion) // 5 seconds after the bang, the station begins to creak + addtimer(CALLBACK(M, /mob/proc/playsound_local, epicenter, null, rand(FREQ_LOWER, FREQ_UPPER), 1, frequency, null, null, TRUE, hull_creaking_sound, 0), CREAK_DELAY) + + if(heavy_impact_range > 1) + var/datum/effect_system/explosion/E + if(smoke) + E = new /datum/effect_system/explosion/smoke + else + E = new + E.set_up(epicenter) + E.start() + + //flash mobs + if(flash_range) + for(var/mob/living/L in viewers(flash_range, epicenter)) + L.flash_act() + + var/list/affected_turfs = GatherSpiralTurfs(max_range, epicenter) + + var/reactionary = CONFIG_GET(flag/reactionary_explosions) + var/list/cached_exp_block + + if(reactionary) + cached_exp_block = CaculateExplosionBlock(affected_turfs) + + //lists are guaranteed to contain at least 1 turf at this point + + for(var/TI in affected_turfs) + var/turf/T = TI + var/init_dist = cheap_hypotenuse(T.x, T.y, x0, y0) + var/dist = init_dist + + if(reactionary) + var/turf/Trajectory = T + while(Trajectory != epicenter) + Trajectory = get_step_towards(Trajectory, epicenter) + dist += cached_exp_block[Trajectory] + + var/flame_dist = dist < flame_range + + if(T.get_virtual_z_level() != z0) + dist = EXPLODE_NONE + else if(dist < devastation_range) + dist = EXPLODE_DEVASTATE + else if(dist < heavy_impact_range) + dist = EXPLODE_HEAVY + else if(dist < light_impact_range) + dist = EXPLODE_LIGHT + else + dist = EXPLODE_NONE + + if(T == epicenter) // Ensures explosives detonating from bags trigger other explosives in that bag + var/list/items = list() + for(var/I in T) + var/atom/A = I + if (length(A.contents) && !(A.flags_1 & PREVENT_CONTENTS_EXPLOSION_1)) //The atom/contents_explosion() proc returns null if the contents ex_acting has been handled by the atom, and TRUE if it hasn't. + items += A.GetAllContents(ignore_flag_1 = PREVENT_CONTENTS_EXPLOSION_1) + for(var/thing in items) + var/atom/movable/movable_thing = thing + if(QDELETED(movable_thing)) + continue + switch(dist) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += movable_thing + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += movable_thing + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += movable_thing + + switch(dist) + if(EXPLODE_DEVASTATE) + SSexplosions.highturf += T + if(EXPLODE_HEAVY) + SSexplosions.medturf += T + if(EXPLODE_LIGHT) + SSexplosions.lowturf += T + + if(flame_dist && prob(40) && !isspaceturf(T) && !T.density) + flameturf += T + + //--- THROW ITEMS AROUND --- + var/throw_dir + if(T == epicenter) + throw_dir = pick(list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)) + else + throw_dir = get_dir(epicenter,T) + var/throw_range = max_range * 1.5 + var/list/throwingturf = T.explosion_throw_details + if (throwingturf) + if (throwingturf[1] < throw_range) + throwingturf[1] = throw_range + throwingturf[2] = throw_dir + throwingturf[3] = max_range + else + T.explosion_throw_details = list(throw_range, throw_dir, max_range) + throwturf += T + + //Calculate above and below Zs + //Multi-z explosions only work on station levels. + if(explode_z) + var/max_z_range = max(devastation_range, heavy_impact_range, light_impact_range, flash_range, flame_range) / (MULTI_Z_DISTANCE + 1) + var/list/z_list = get_zs_in_range(epicenter.z, max_z_range) + //Dont blow up our level again + z_list -= epicenter.z + for(var/affecting_z in z_list) + var/z_reduction = abs(epicenter.z - affecting_z) * (MULTI_Z_DISTANCE + 1) + var/turf/T = locate(epicenter.x, epicenter.y, affecting_z) + if(!T) + continue + SSexplosions.explode(T, + max(devastation_range - z_reduction, 0), + max(heavy_impact_range - z_reduction, 0), + max(light_impact_range - z_reduction, 0), + max(flash_range - z_reduction, 0), + adminlog, + ignorecap, + max(flame_range - z_reduction, 0), + silent = TRUE, + smoke = FALSE, + explode_z = FALSE) + + var/took = (REALTIMEOFDAY - started_at) / 10 + + //You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare + if(GLOB.Debug2) + log_world("## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds.") + + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_EXPLOSION, epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range) + +#undef CREAK_DELAY +#undef DEVASTATION_PROB +#undef HEAVY_IMPACT_PROB +#undef FAR_UPPER +#undef FAR_LOWER +#undef PROB_SOUND +#undef SHAKE_CLAMP +#undef FREQ_UPPER +#undef FREQ_LOWER + +/datum/controller/subsystem/explosions/proc/GatherSpiralTurfs(range, turf/epicenter) + var/list/outlist = list() + var/center = epicenter + var/dist = range + if(!dist) + outlist += center + return outlist + + var/turf/t_center = get_turf(center) + if(!t_center) + return outlist + + var/list/L = outlist + var/turf/T + var/y + var/x + var/c_dist = 1 + L += t_center + + while( c_dist <= dist ) + y = t_center.y + c_dist + x = t_center.x - c_dist + 1 + for(x in x to t_center.x+c_dist) + T = locate(x,y,t_center.z) + if(T) + L += T + + y = t_center.y + c_dist - 1 + x = t_center.x + c_dist + for(y in t_center.y-c_dist to y) + T = locate(x,y,t_center.z) + if(T) + L += T + + y = t_center.y - c_dist + x = t_center.x + c_dist - 1 + for(x in t_center.x-c_dist to x) + T = locate(x,y,t_center.z) + if(T) + L += T + + y = t_center.y - c_dist + 1 + x = t_center.x - c_dist + for(y in y to t_center.y+c_dist) + T = locate(x,y,t_center.z) + if(T) + L += T + c_dist++ + . = L + +/datum/controller/subsystem/explosions/proc/CaculateExplosionBlock(list/affected_turfs) + . = list() + var/I + for(I in 1 to affected_turfs.len) // we cache the explosion block rating of every turf in the explosion area + var/turf/T = affected_turfs[I] + var/current_exp_block = T.density ? T.explosion_block : 0 + + for(var/obj/O in T) + var/the_block = O.explosion_block + current_exp_block += the_block == EXPLOSION_BLOCK_PROC ? O.GetExplosionBlock() : the_block + + .[T] = current_exp_block + +/datum/controller/subsystem/explosions/fire(resumed = 0) + if (!is_exploding()) + return + var/timer + Master.current_ticklimit = TICK_LIMIT_RUNNING //force using the entire tick if we need it. + + if(currentpart == SSEXPLOSIONS_TURFS) + currentpart = SSEXPLOSIONS_MOVABLES + + timer = TICK_USAGE_REAL + var/list/low_turf = lowturf + lowturf = list() + for(var/thing in low_turf) + var/turf/turf_thing = thing + turf_thing.explosion_level = max(turf_thing.explosion_level, EXPLODE_LIGHT) + turf_thing.ex_act(EXPLODE_LIGHT) + lowturf -= turf_thing + cost_lowturf = MC_AVERAGE(cost_lowturf, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + + timer = TICK_USAGE_REAL + var/list/med_turf = medturf + medturf = list() + for(var/thing in med_turf) + var/turf/turf_thing = thing + turf_thing.explosion_level = max(turf_thing.explosion_level, EXPLODE_HEAVY) + turf_thing.ex_act(EXPLODE_HEAVY) + medturf -= turf_thing + cost_medturf = MC_AVERAGE(cost_medturf, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + + timer = TICK_USAGE_REAL + var/list/high_turf = highturf + highturf = list() + for(var/thing in high_turf) + var/turf/turf_thing = thing + turf_thing.explosion_level = max(turf_thing.explosion_level, EXPLODE_DEVASTATE) + turf_thing.ex_act(EXPLODE_DEVASTATE) + highturf -= turf_thing + cost_highturf = MC_AVERAGE(cost_highturf, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + + timer = TICK_USAGE_REAL + var/list/flame_turf = flameturf + flameturf = list() + for(var/thing in flame_turf) + if(thing) + var/turf/T = thing + new /obj/effect/hotspot(T) //Mostly for ambience! + cost_flameturf = MC_AVERAGE(cost_flameturf, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + + if (low_turf.len || med_turf.len || high_turf.len) + Master.laggy_byond_map_update_incoming() + + if(currentpart == SSEXPLOSIONS_MOVABLES) + currentpart = SSEXPLOSIONS_THROWS + + timer = TICK_USAGE_REAL + var/list/local_high_mov_atom = high_mov_atom + high_mov_atom = list() + for(var/thing in local_high_mov_atom) + var/atom/movable/movable_thing = thing + if(QDELETED(movable_thing)) + continue + movable_thing.ex_act(EXPLODE_DEVASTATE) + high_mov_atom -= movable_thing + cost_high_mov_atom = MC_AVERAGE(cost_high_mov_atom, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + + timer = TICK_USAGE_REAL + var/list/local_med_mov_atom = med_mov_atom + med_mov_atom = list() + for(var/thing in local_med_mov_atom) + var/atom/movable/movable_thing = thing + if(QDELETED(movable_thing)) + continue + movable_thing.ex_act(EXPLODE_HEAVY) + med_mov_atom -= movable_thing + cost_med_mov_atom = MC_AVERAGE(cost_med_mov_atom, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + + timer = TICK_USAGE_REAL + var/list/local_low_mov_atom = low_mov_atom + low_mov_atom = list() + for(var/thing in local_low_mov_atom) + var/atom/movable/movable_thing = thing + if(QDELETED(movable_thing)) + continue + movable_thing.ex_act(EXPLODE_LIGHT) + low_mov_atom -= movable_thing + cost_low_mov_atom = MC_AVERAGE(cost_low_mov_atom, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + + + if (currentpart == SSEXPLOSIONS_THROWS) + currentpart = SSEXPLOSIONS_TURFS + timer = TICK_USAGE_REAL + var/list/throw_turf = throwturf + throwturf = list() + for (var/thing in throw_turf) + if (!thing) + continue + var/turf/T = thing + var/list/L = T.explosion_throw_details + T.explosion_throw_details = null + if (length(L) != 3) + continue + var/throw_range = L[1] + var/throw_dir = L[2] + var/max_range = L[3] + for(var/atom/movable/A in T) + if(!A.anchored && A.move_resist != INFINITY) + var/atom_throw_range = rand(throw_range, max_range) + var/turf/throw_at = get_ranged_target_turf(A, throw_dir, atom_throw_range) + A.throw_at(throw_at, atom_throw_range, EXPLOSION_THROW_SPEED, quickstart = FALSE) + cost_throwturf = MC_AVERAGE(cost_throwturf, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + + currentpart = SSEXPLOSIONS_TURFS + +#undef SSAIR_REBUILD_PIPENETS diff --git a/code/controllers/subsystem/fail2topic.dm b/code/controllers/subsystem/fail2topic.dm index b3b6982c50568..0cbd8872f0bcc 100644 --- a/code/controllers/subsystem/fail2topic.dm +++ b/code/controllers/subsystem/fail2topic.dm @@ -7,16 +7,15 @@ SUBSYSTEM_DEF(fail2topic) var/list/rate_limiting = list() var/list/fail_counts = list() var/list/active_bans = list() + var/list/currentrun = list() var/rate_limit var/max_fails - var/rule_name var/enabled = FALSE /datum/controller/subsystem/fail2topic/Initialize(timeofday) rate_limit = ((CONFIG_GET(number/topic_rate_limit)) SECONDS) max_fails = CONFIG_GET(number/topic_max_fails) - rule_name = CONFIG_GET(string/topic_rule_name) enabled = CONFIG_GET(flag/topic_enabled) DropFirewallRule() // Clear the old bans if any still remain @@ -29,24 +28,34 @@ SUBSYSTEM_DEF(fail2topic) if (!enabled) can_fire = FALSE - . = ..() + return ..() -/datum/controller/subsystem/fail2topic/fire() - while (rate_limiting.len) - var/ip = rate_limiting[1] - var/last_attempt = rate_limiting[ip] +/datum/controller/subsystem/fail2topic/fire(resumed = 0) + if(!resumed) + currentrun = rate_limiting.Copy() + //cache for sanic speed (lists are references anyways) + var/list/current_run = currentrun - if (world.time - last_attempt > rate_limit) + while(current_run.len) + var/ip = current_run[current_run.len] + var/last_attempt = current_run[ip] + current_run.len-- + + // last_attempt list housekeeping + if(world.time - last_attempt > rate_limit) rate_limiting -= ip fail_counts -= ip - if (MC_TICK_CHECK) + if(MC_TICK_CHECK) return /datum/controller/subsystem/fail2topic/Shutdown() DropFirewallRule() /datum/controller/subsystem/fail2topic/proc/IsRateLimited(ip) + if(!enabled) + return FALSE + var/last_attempt = rate_limiting[ip] if (config.fail2topic_whitelisted_ips[ip]) @@ -79,12 +88,16 @@ SUBSYSTEM_DEF(fail2topic) /datum/controller/subsystem/fail2topic/proc/BanFromFirewall(ip) if (!enabled) return + var/static/regex/R = regex(@"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$") // Anything that interacts with a shell should be parsed. Prevents direct call input tampering + ip = findtext(ip, R) + if(length(ip) > 15 || length(ip) < 8 ) + return FALSE active_bans[ip] = world.time fail_counts -= ip rate_limiting -= ip - . = shell("netsh advfirewall firewall add rule name=\"[rule_name]\" dir=in interface=any action=block remoteip=[ip]") + . = shell("netsh advfirewall firewall add rule name=\"[CONFIG_GET(string/topic_rule_name)]\" dir=in interface=any action=block remoteip=[ip]") if (.) WARNING("Fail2topic failed to ban [ip]. Exit code: [.].") @@ -99,7 +112,7 @@ SUBSYSTEM_DEF(fail2topic) active_bans = list() - . = shell("netsh advfirewall firewall delete rule name=\"[rule_name]\"") + . = shell("netsh advfirewall firewall delete rule name=\"[CONFIG_GET(string/topic_rule_name)]\"") if (.) WARNING("Fail2topic failed to drop firewall rule. Exit code: [.].") diff --git a/code/controllers/subsystem/fire_burning.dm b/code/controllers/subsystem/fire_burning.dm index 7f73f379ccbb7..e8f64033466b0 100644 --- a/code/controllers/subsystem/fire_burning.dm +++ b/code/controllers/subsystem/fire_burning.dm @@ -8,8 +8,13 @@ SUBSYSTEM_DEF(fire_burning) var/list/processing = list() /datum/controller/subsystem/fire_burning/stat_entry() - ..("P:[processing.len]") + . = ..("P:[processing.len]") +/datum/controller/subsystem/fire_burning/get_metrics() + . = ..() + var/list/cust = list() + cust["processing"] = length(processing) + .["custom"] = cust /datum/controller/subsystem/fire_burning/fire(resumed = 0) if (!resumed) @@ -17,6 +22,7 @@ SUBSYSTEM_DEF(fire_burning) //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun + var/delta_time = wait * 0.1 while(currentrun.len) var/obj/O = currentrun[currentrun.len] @@ -30,7 +36,7 @@ SUBSYSTEM_DEF(fire_burning) if(O.resistance_flags & ON_FIRE) //in case an object is extinguished while still in currentrun if(!(O.resistance_flags & FIRE_PROOF)) - O.take_damage(20, BURN, "fire", 0) + O.take_damage(10 * delta_time, BURN, "fire", 0) else O.extinguish() diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 8370f6867461d..c1a38d951fd0b 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -6,7 +6,7 @@ SUBSYSTEM_DEF(garbage) runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY init_order = INIT_ORDER_GARBAGE - var/list/collection_timeout = list(0, 2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level + var/list/collection_timeout = list(2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level //Stat tracking var/delslasttick = 0 // number of del()'s we've done this tick @@ -24,11 +24,23 @@ SUBSYSTEM_DEF(garbage) //Queue var/list/queues - - #ifdef TESTING + #ifdef LEGACY_REFERENCE_TRACKING var/list/reference_find_on_fail = list() #endif +/datum/controller/subsystem/garbage/get_metrics() + . = ..() + var/list/cust = list() + // You can calculate TGCR in kibana + cust["total_harddels"] = totaldels + cust["total_softdels"] = totalgcs + var/i = 0 + for(var/list/L in queues) + i++ + cust["queue_[i]"] = length(L) + + .["custom"] = cust + /datum/controller/subsystem/garbage/PreInit() queues = new(GC_QUEUE_COUNT) @@ -57,7 +69,7 @@ SUBSYSTEM_DEF(garbage) msg += "TGR:[round((totalgcs/(totaldels+totalgcs))*100, 0.01)]%" msg += " P:[pass_counts.Join(",")]" msg += "|F:[fail_counts.Join(",")]" - ..(msg) + . = ..(msg) /datum/controller/subsystem/garbage/Shutdown() //Adds the del() log to the qdel log file @@ -117,18 +129,22 @@ SUBSYSTEM_DEF(garbage) lastlevel = level - for (var/refID in queue) - if (!refID) + //We do this rather then for(var/refID in queue) because that sort of for loop copies the whole list. + //Normally this isn't expensive, but the gc queue can grow to 40k items, and that gets costly/causes overrun. + for (var/i in 1 to length(queue)) + var/list/L = queue[i] + if (length(L) < 2) count++ if (MC_TICK_CHECK) return continue - var/GCd_at_time = queue[refID] + var/GCd_at_time = L[1] if(GCd_at_time > cut_off_time) break // Everything else is newer, skip them count++ + var/refID = L[2] var/datum/D D = locate(refID) @@ -136,8 +152,8 @@ SUBSYSTEM_DEF(garbage) ++gcedlasttick ++totalgcs pass_counts[level]++ - #ifdef TESTING - reference_find_on_fail -= refID //It's deleted we don't care anymore. + #ifdef LEGACY_REFERENCE_TRACKING + reference_find_on_fail -= refID //It's deleted we don't care anymore. #endif if (MC_TICK_CHECK) return @@ -145,20 +161,41 @@ SUBSYSTEM_DEF(garbage) // Something's still referring to the qdel'd object. fail_counts[level]++ + + #ifdef REFERENCE_TRACKING + var/ref_searching = FALSE + #endif + switch (level) if (GC_QUEUE_CHECK) - #ifdef TESTING + #ifdef REFERENCE_TRACKING + D.find_references() + #elif defined(LEGACY_REFERENCE_TRACKING) if(reference_find_on_fail[refID]) - D.find_references() + INVOKE_ASYNC(D, /datum/proc/find_references_legacy) + ref_searching = TRUE #ifdef GC_FAILURE_HARD_LOOKUP else - D.find_references() + INVOKE_ASYNC(D, /datum/proc/find_references_legacy) + ref_searching = TRUE #endif reference_find_on_fail -= refID #endif var/type = D.type var/datum/qdel_item/I = items[type] - testing("GC: -- \ref[src] | [type] was unable to be GC'd --") + + log_world("## TESTING: GC: -- \ref[D] | [type] was unable to be GC'd --") + #ifdef TESTING + for(var/c in GLOB.admins) //Using testing() here would fill the logs with ADMIN_VV garbage + var/client/admin = c + if(!check_rights_for(admin, R_ADMIN)) + continue + to_chat(admin, "## TESTING: GC: -- [ADMIN_VV(D)] | [type] was unable to be GC'd --") + #endif + #ifdef REFERENCE_TRACKING + GLOB.deletion_failures += D //It should no longer be bothered by the GC, manual deletion only. + continue + #endif I.failures++ if (GC_QUEUE_HARDDELETE) HardDelete(D) @@ -168,6 +205,11 @@ SUBSYSTEM_DEF(garbage) Queue(D, level+1) + #ifdef REFERENCE_TRACKING + if(ref_searching) + return + #endif + if (MC_TICK_CHECK) return if (count) @@ -185,10 +227,8 @@ SUBSYSTEM_DEF(garbage) D.gc_destroyed = gctime var/list/queue = queues[level] - if (queue[refid]) - queue -= refid // Removing any previous references that were GC'd so that the current object will be at the end of the list. - queue[refid] = gctime + queue[++queue.len] = list(gctime, refid) // not += for byond reasons //this is mainly to separate things profile wise. /datum/controller/subsystem/garbage/proc/HardDelete(datum/D) @@ -242,24 +282,25 @@ SUBSYSTEM_DEF(garbage) /datum/qdel_item/New(mytype) name = "[mytype]" -#ifdef TESTING -/proc/qdel_and_find_ref_if_fail(datum/D, force = FALSE) - SSgarbage.reference_find_on_fail[REF(D)] = TRUE - qdel(D, force) -#endif // Should be treated as a replacement for the 'del' keyword. // Datums passed to this will be given a chance to clean up references to allow the GC to collect them. /proc/qdel(datum/D, force=FALSE, ...) + if(isweakref(D)) + var/datum/weakref/weakref = D + D = weakref.resolve() + if(!D) + return + if(!istype(D)) del(D) return + var/datum/qdel_item/I = SSgarbage.items[D.type] if (!I) I = SSgarbage.items[D.type] = new /datum/qdel_item(D.type) I.qdels++ - if(isnull(D.gc_destroyed)) if (SEND_SIGNAL(D, COMSIG_PARENT_PREQDELETED, force)) // Give the components a chance to prevent their parent from being deleted return @@ -301,16 +342,14 @@ SUBSYSTEM_DEF(garbage) SSgarbage.Queue(D, GC_QUEUE_HARDDELETE) if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. SSgarbage.HardDelete(D) - if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion. + #ifdef LEGACY_REFERENCE_TRACKING + if (QDEL_HINT_FINDREFERENCE) //qdel will, if LEGACY_REFERENCE_TRACKING is enabled, display all references to this object, then queue the object for deletion. SSgarbage.Queue(D) - #ifdef TESTING - D.find_references() - #endif + D.find_references_legacy() if (QDEL_HINT_IFFAIL_FINDREFERENCE) SSgarbage.Queue(D) - #ifdef TESTING SSgarbage.reference_find_on_fail[REF(D)] = TRUE - #endif + #endif else #ifdef TESTING if(!I.no_hint) @@ -320,116 +359,3 @@ SUBSYSTEM_DEF(garbage) SSgarbage.Queue(D) else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic") - -#ifdef TESTING - -/datum/verb/find_refs() - set category = "Debug" - set name = "Find References" - set src in world - - find_references(FALSE) - -/datum/proc/find_references(skip_alert) - running_find_references = type - if(usr?.client) - if(usr.client.running_find_references) - testing("CANCELLED search for references to a [usr.client.running_find_references].") - usr.client.running_find_references = null - running_find_references = null - //restart the garbage collector - SSgarbage.can_fire = 1 - SSgarbage.next_fire = world.time + world.tick_lag - return - - if(!skip_alert) - if(alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") == "No") - running_find_references = null - return - - //this keeps the garbage collector from failing to collect objects being searched for in here - SSgarbage.can_fire = 0 - - if(usr && usr.client) - usr.client.running_find_references = type - - testing("Beginning search for references to a [type].") - last_find_references = world.time - - DoSearchVar(GLOB) //globals - for(var/datum/thing in world) //atoms (don't beleive it's lies) - DoSearchVar(thing, "World -> [thing]") - - for (var/datum/thing) //datums - DoSearchVar(thing, "World -> [thing]") - - for (var/client/thing) //clients - DoSearchVar(thing, "World -> [thing]") - - testing("Completed search for references to a [type].") - if(usr && usr.client) - usr.client.running_find_references = null - running_find_references = null - - //restart the garbage collector - SSgarbage.can_fire = 1 - SSgarbage.next_fire = world.time + world.tick_lag - -/datum/verb/qdel_then_find_references() - set category = "Debug" - set name = "qdel() then Find References" - set src in world - - qdel(src, TRUE) //Force. - if(!running_find_references) - find_references(TRUE) - -/datum/verb/qdel_then_if_fail_find_references() - set category = "Debug" - set name = "qdel() then Find References if GC failure" - set src in world - - qdel_and_find_ref_if_fail(src, TRUE) - -/datum/proc/DoSearchVar(X, Xname, recursive_limit = 64) - if(usr && usr.client && !usr.client.running_find_references) - return - if (!recursive_limit) - return - - if(istype(X, /datum)) - var/datum/D = X - if(D.last_find_references == last_find_references) - return - - D.last_find_references = last_find_references - var/list/L = D.vars - - for(var/varname in L) - if (varname == "vars") - continue - var/variable = L[varname] - - if(variable == src) - testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. [Xname]") - - else if(islist(variable)) - DoSearchVar(variable, "[Xname] -> list", recursive_limit-1) - - else if(islist(X)) - var/normal = IS_NORMAL_LIST(X) - for(var/I in X) - if (I == src) - testing("Found [src.type] \ref[src] in list [Xname].") - - else if (I && !isnum_safe(I) && normal && X[I] == src) - testing("Found [src.type] \ref[src] in list [Xname]\[[I]\]") - - else if (islist(I)) - DoSearchVar(I, "[Xname] -> list", recursive_limit-1) - -#ifndef FIND_REF_NO_CHECK_TICK - CHECK_TICK -#endif - -#endif diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm index 8992fa7b92fd1..53cf6aa5a7328 100644 --- a/code/controllers/subsystem/idlenpcpool.dm +++ b/code/controllers/subsystem/idlenpcpool.dm @@ -11,7 +11,7 @@ SUBSYSTEM_DEF(idlenpcpool) /datum/controller/subsystem/idlenpcpool/stat_entry() var/list/idlelist = GLOB.simple_animals[AI_IDLE] var/list/zlist = GLOB.simple_animals[AI_Z_OFF] - ..("IdleNPCS:[idlelist.len]|Z:[zlist.len]") + . = ..("IdleNPCS:[idlelist.len]|Z:[zlist.len]") /datum/controller/subsystem/idlenpcpool/proc/MaxZChanged() if (!islist(idle_mobs_by_zlevel)) @@ -32,8 +32,10 @@ SUBSYSTEM_DEF(idlenpcpool) while(currentrun.len) var/mob/living/simple_animal/SA = currentrun[currentrun.len] --currentrun.len - if (!SA) - GLOB.simple_animals[AI_IDLE] -= SA + + if(!SA) + stack_trace("Null entry found at GLOB.simple_animals\[AI_IDLE\]. Null entries will be purged. Yell at coderbus. Subsystem will try to continue.") + removeNullsFromList(GLOB.simple_animals[AI_IDLE]) continue if(!SA.ckey) diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index 70604bfba0d40..dc0d868a1d856 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -32,22 +32,22 @@ SUBSYSTEM_DEF(input) "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", - "T" = "say", - "M" = "me", + "T" = "\".winset \\\"command=\\\".start_typing say\\\";command=.init_say;saywindow.is-visible=true;saywindow.input.focus=true;saywindow.input.text=\\\"\\\"\\\"\"", + "M" = "\".winset \\\"command=\\\".start_typing me\\\";command=.init_me;mewindow.is-visible=true;mewindow.input.focus=true;mewindow.input.text=\\\"\\\"\\\"\"", "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+T" = "\".winset \\\"command=\\\".start_typing say\\\";command=.init_say;saywindow.is-visible=true;saywindow.input.focus=true;saywindow.input.text=\\\"\\\"\\\"\"", "Ctrl+O" = "ooc", ), "old_hotkeys" = list( "Tab" = "\".winset \\\"mainwindow.macro=old_default input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", "O" = "ooc", - "T" = "say", - "M" = "me", + "T" = "\".winset \\\"command=\\\".start_typing say\\\";command=.init_say;saywindow.is-visible=true;saywindow.input.focus=true;saywindow.input.text=\\\"\\\"\\\"\"", + "M" = "\".winset \\\"command=\\\".start_typing me\\\";command=.init_me;mewindow.is-visible=true;mewindow.input.focus=true;mewindow.input.text=\\\"\\\"\\\"\"", "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs "Any" = "\"KeyDown \[\[*\]\]\"", "Any+UP" = "\"KeyUp \[\[*\]\]\"", @@ -109,7 +109,5 @@ SUBSYSTEM_DEF(input) user.set_macros() /datum/controller/subsystem/input/fire() - var/list/clients = GLOB.clients // Let's sing the list cache song - for(var/i in 1 to clients.len) - var/client/C = clients[i] - C.keyLoop() + for(var/mob/user as anything in GLOB.player_list) + user?.focus?.keyLoop(user.client) diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index ea3b19dec1fcb..043bbb768a184 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -16,6 +16,16 @@ SUBSYSTEM_DEF(job) var/list/level_order = list(JP_HIGH,JP_MEDIUM,JP_LOW) + var/spare_id_safe_code = "" + + var/list/chain_of_command = list( + "Captain" = 1, //Not used yet but captain is first in chain_of_command + "Head of Personnel" = 2, + "Research Director" = 3, + "Chief Engineer" = 4, + "Chief Medical Officer" = 5, + "Head of Security" = 6) + /datum/controller/subsystem/job/Initialize(timeofday) SSmapping.HACK_LoadMapConfig() if(!occupations.len) @@ -24,17 +34,22 @@ SUBSYSTEM_DEF(job) LoadJobs() generate_selectable_species() set_overflow_role(CONFIG_GET(string/overflow_job)) + + spare_id_safe_code = "[rand(0,9)][rand(0,9)][rand(0,9)][rand(0,9)][rand(0,9)]" + return ..() /datum/controller/subsystem/job/proc/set_overflow_role(new_overflow_role) var/datum/job/new_overflow = GetJob(new_overflow_role) var/cap = CONFIG_GET(number/overflow_cap) + new_overflow.allow_bureaucratic_error = FALSE new_overflow.spawn_positions = cap new_overflow.total_positions = cap if(new_overflow_role != overflow_role) var/datum/job/old_overflow = GetJob(overflow_role) + old_overflow.allow_bureaucratic_error = initial(old_overflow.allow_bureaucratic_error) old_overflow.spawn_positions = initial(old_overflow.spawn_positions) old_overflow.total_positions = initial(old_overflow.total_positions) overflow_role = new_overflow_role @@ -238,7 +253,7 @@ SUBSYSTEM_DEF(job) * fills var "assigned_role" for all ready players. * This proc must not have any side effect besides of modifying "assigned_role". **/ -/datum/controller/subsystem/job/proc/DivideOccupations() +/datum/controller/subsystem/job/proc/DivideOccupations(list/required_jobs) //Setup new player list and get the jobs list JobDebug("Running DO") @@ -252,13 +267,16 @@ SUBSYSTEM_DEF(job) //Get the players who are ready for(var/mob/dead/new_player/player in GLOB.player_list) if(player.ready == PLAYER_READY_TO_PLAY && player.mind && !player.mind.assigned_role) - unassigned += player + if(!player.has_valid_preferences()) + player.ready = PLAYER_NOT_READY + else + unassigned += player initial_players_to_assign = unassigned.len JobDebug("DO, Len: [unassigned.len]") if(unassigned.len == 0) - return TRUE + return validate_required_jobs(required_jobs) //Scale number of open security officer slots to population setup_officer_positions() @@ -363,7 +381,26 @@ SUBSYSTEM_DEF(job) if(!GiveRandomJob(player)) if(!AssignRole(player, SSjob.overflow_role)) //If everything is already filled, make them an assistant return FALSE //Living on the edge, the forced antagonist couldn't be assigned to overflow role (bans, client age) - just reroll - return TRUE + + return validate_required_jobs(required_jobs) + +/datum/controller/subsystem/job/proc/validate_required_jobs(list/required_jobs) + if(!required_jobs.len) + return TRUE + for(var/required_group in required_jobs) + var/group_ok = TRUE + for(var/rank in required_group) + var/datum/job/J = GetJob(rank) + if(!J) + SSticker.mode.setup_error = "Invalid job [rank] in gamemode required jobs." + return FALSE + if(J.current_positions < required_group[rank]) + group_ok = FALSE + break + if(group_ok) + return TRUE + SSticker.mode.setup_error = "Required jobs not present." + return FALSE //We couldn't find a job from prefs for this guy. /datum/controller/subsystem/job/proc/HandleUnassigned(mob/dead/new_player/player) @@ -404,21 +441,32 @@ SUBSYSTEM_DEF(job) //If we joined at roundstart we should be positioned at our workstation if(!joined_late) + var/spawning_handled = FALSE var/obj/S = null - for(var/obj/effect/landmark/start/sloc in GLOB.start_landmarks_list) - if(sloc.name != rank) - S = sloc //so we can revert to spawning them on top of eachother if something goes wrong - continue - if(locate(/mob/living) in sloc.loc) - continue - S = sloc - sloc.used = TRUE - break - if(length(GLOB.jobspawn_overrides[rank])) + if(HAS_TRAIT(SSstation, STATION_TRAIT_LATE_ARRIVALS) && job.random_spawns_possible) + SendToLateJoin(living_mob) + spawning_handled = TRUE + else if(HAS_TRAIT(SSstation, STATION_TRAIT_RANDOM_ARRIVALS) && job.random_spawns_possible) + DropLandAtRandomHallwayPoint(living_mob) + spawning_handled = TRUE + else if(HAS_TRAIT(SSstation, STATION_TRAIT_HANGOVER) && job.random_spawns_possible) + SpawnLandAtRandomHallwayPoint(living_mob) + spawning_handled = TRUE + else if(length(GLOB.jobspawn_overrides[rank])) S = pick(GLOB.jobspawn_overrides[rank]) + else + for(var/obj/effect/landmark/start/sloc in GLOB.start_landmarks_list) + if(sloc.name != rank) + S = sloc //so we can revert to spawning them on top of eachother if something goes wrong + continue + if(locate(/mob/living) in sloc.loc) + continue + S = sloc + sloc.used = TRUE + break if(S) S.JoinPlayerHere(living_mob, FALSE) - if(!S) //if there isn't a spawnpoint send them to latejoin, if there's no latejoin go yell at your mapper + if(!S && !spawning_handled) //if there isn't a spawnpoint send them to latejoin, if there's no latejoin go yell at your mapper log_world("Couldn't find a round start spawn point for [rank]") SendToLateJoin(living_mob) @@ -452,7 +500,7 @@ SUBSYSTEM_DEF(job) var/mob/living/carbon/human/wageslave = living_mob living_mob.add_memory("Your account ID is [wageslave.account_id].") if(job && living_mob) - job.after_spawn(living_mob, M, joined_late) // note: this happens before the mob has a key! M will always have a client, H might not. + job.after_spawn(living_mob, M, joined_late) // note: this happens before the mob has a key! M will always have a client, living_mob might not. var/tries = 5 while(M.mind && !M.mind.crew_objectives.len && tries) @@ -506,9 +554,11 @@ SUBSYSTEM_DEF(job) if(J.flag == GIMMICK || J.gimmick) //gimmick job slots are dependant on random maint continue var/regex/jobs = new("[J.title]=(-1|\\d+),(-1|\\d+)") - jobs.Find(jobstext) - J.total_positions = text2num(jobs.group[1]) - J.spawn_positions = text2num(jobs.group[2]) + if(jobs.Find(jobstext)) + J.total_positions = text2num(jobs.group[1]) + J.spawn_positions = text2num(jobs.group[2]) + else + log_runtime("Error in /datum/controller/subsystem/job/proc/LoadJobs: Failed to locate job of title [J.title] in jobs.txt") /datum/controller/subsystem/job/proc/HandleFeedbackGathering() for(var/datum/job/job in occupations) @@ -637,6 +687,27 @@ SUBSYSTEM_DEF(job) message_admins(msg) CRASH(msg) +///Spawns specified mob at a random spot in the hallways +/datum/controller/subsystem/job/proc/SpawnLandAtRandomHallwayPoint(mob/living/living_mob) + var/turf/spawn_turf = get_safe_random_station_turfs(typesof(/area/hallway)) + + if(!spawn_turf) + SendToLateJoin(living_mob) + return + + living_mob.forceMove(spawn_turf) + +///Lands specified mob at a random spot in the hallways +/datum/controller/subsystem/job/proc/DropLandAtRandomHallwayPoint(mob/living/living_mob) + var/turf/spawn_turf = get_safe_random_station_turfs(typesof(/area/hallway)) + + if(!spawn_turf) + SendToLateJoin(living_mob) + return + + var/obj/structure/closet/supplypod/centcompod/toLaunch = new() + living_mob.forceMove(toLaunch) + new /obj/effect/pod_landingzone(spawn_turf, toLaunch) /////////////////////////////////// //Keeps track of all living heads// @@ -678,3 +749,40 @@ SUBSYSTEM_DEF(job) /datum/controller/subsystem/job/proc/JobDebug(message) log_job_debug(message) + +/obj/item/paper/fluff/spare_id_safe_code + name = "Nanotrasen-Approved Spare ID Safe Code" + desc = "Proof that you have been approved for Captaincy, with all its glory and all its horror." + +/obj/item/paper/fluff/spare_id_safe_code/Initialize() + . = ..() + var/id_safe_code = SSjob.spare_id_safe_code + info = "Captain's Spare ID safe code combination: [id_safe_code ? id_safe_code : "\[REDACTED\]"]

The spare ID can be found in its dedicated safe on the bridge." + +/datum/controller/subsystem/job/proc/promote_to_captain(var/mob/dead/new_player/new_captain, acting_captain = FALSE) + var/mob/living/carbon/human/H = new_captain.new_character + if(!new_captain) + CRASH("Cannot promote [new_captain.ckey], there is no new_character attached to him.") + + if(!spare_id_safe_code) + CRASH("Cannot promote [H.real_name] to Captain, there is no spare_id_safe_code.") + + var/paper = new /obj/item/paper/fluff/spare_id_safe_code(H.loc) + var/list/slots = list( + "in your left pocket" = ITEM_SLOT_LPOCKET, + "in your right pocket" = ITEM_SLOT_RPOCKET, + "in your backpack" = ITEM_SLOT_BACKPACK, + "in your hands" = ITEM_SLOT_HANDS + ) + var/where = H.equip_in_one_of_slots(paper, slots, FALSE) || "at your feet" + + if(acting_captain) + to_chat(new_captain, "Due to your position in the chain of command, you have been granted access to captain's spare ID. You can find in important note about this [where].") + else + to_chat(new_captain, "You can find the code to obtain your spare ID from the secure safe on the Bridge [where].") + + // Force-give their ID card bridge access. + if(H.wear_id?.GetID()) + var/obj/item/card/id/id_card = H.wear_id + if(!(ACCESS_HEADS in id_card.access)) + LAZYADD(id_card.access, ACCESS_HEADS) diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index ab16a633819fe..98fe2315455c8 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -9,8 +9,15 @@ SUBSYSTEM_DEF(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]") - + . = ..("L:[GLOB.lighting_update_lights.len]|C:[GLOB.lighting_update_corners.len]|O:[GLOB.lighting_update_objects.len]") + +/datum/controller/subsystem/lighting/get_metrics() + . = ..() + var/list/cust = list() + cust["sources_queue"] = length(GLOB.lighting_update_lights) + cust["corners_queue"] = length(GLOB.lighting_update_corners) + cust["objects_queue"] = length(GLOB.lighting_update_objects) + .["custom"] = cust /datum/controller/subsystem/lighting/Initialize(timeofday) if(!initialized) diff --git a/code/controllers/subsystem/machines.dm b/code/controllers/subsystem/machines.dm index c4b09d1b87410..e382e07b0842e 100644 --- a/code/controllers/subsystem/machines.dm +++ b/code/controllers/subsystem/machines.dm @@ -2,6 +2,7 @@ SUBSYSTEM_DEF(machines) name = "Machines" init_order = INIT_ORDER_MACHINES flags = SS_KEEP_TIMING + wait = 2 SECONDS var/list/processing = list() var/list/currentrun = list() var/list/powernets = list() @@ -11,6 +12,13 @@ SUBSYSTEM_DEF(machines) fire() return ..() + +/datum/controller/subsystem/machines/get_metrics() + . = ..() + var/list/cust = list() + cust["processing"] = length(processing) + .["custom"] = cust + /datum/controller/subsystem/machines/proc/makepowernets() for(var/datum/powernet/PN in powernets) qdel(PN) @@ -23,7 +31,7 @@ SUBSYSTEM_DEF(machines) propagate_network(PC,PC.powernet) /datum/controller/subsystem/machines/stat_entry() - ..("M:[processing.len]|PN:[powernets.len]") + . = ..("M:[processing.len]|PN:[powernets.len]") /datum/controller/subsystem/machines/fire(resumed = 0) @@ -35,11 +43,10 @@ SUBSYSTEM_DEF(machines) //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - var/seconds = wait * 0.1 while(currentrun.len) var/obj/machinery/thing = currentrun[currentrun.len] currentrun.len-- - if(!QDELETED(thing) && thing.process(seconds) != PROCESS_KILL) + if(!QDELETED(thing) && thing.process(wait * 0.1) != PROCESS_KILL) if(thing.use_power) thing.auto_use_power() //add back the power state else diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 8b398130c03e8..93c8f9de00e1a 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -1,3 +1,5 @@ +//#define FORCE_MAP "_maps/boxstation.json" + SUBSYSTEM_DEF(mapping) name = "Mapping" init_order = INIT_ORDER_MAPPING @@ -19,7 +21,9 @@ SUBSYSTEM_DEF(mapping) var/list/shuttle_templates = list() var/list/shelter_templates = list() + var/list/random_room_templates = list() + var/list/holodeck_templates = list() var/list/areas_in_z = list() @@ -28,6 +32,10 @@ SUBSYSTEM_DEF(mapping) var/list/datum/turf_reservations //list of turf reservations var/list/used_turfs = list() //list of turf = datum/turf_reservation + ///All possible biomes in assoc list as type || instance + var/list/biomes = list() + + var/clearing_reserved_turfs = FALSE // Z-manager stuff @@ -57,19 +65,21 @@ SUBSYSTEM_DEF(mapping) if(!config || config.defaulted) to_chat(world, "Unable to load next or default map config, defaulting to Box Station") config = old_config + initialize_biomes() loadWorld() repopulate_sorted_areas() process_teleport_locs() //Sets up the wizard teleport locations preloadTemplates() + #ifndef LOWMEMORYMODE // Create space ruin levels while (space_levels_so_far < config.space_ruin_levels) ++space_levels_so_far - add_new_zlevel("Empty Area [space_levels_so_far]", ZTRAITS_SPACE) + LAZYADD(SSzclear.free_levels, add_new_zlevel("Empty Area [space_levels_so_far]", ZTRAITS_SPACE, orbital_body_type = null)) // and one level with no ruins for (var/i in 1 to config.space_empty_levels) ++space_levels_so_far - empty_space = add_new_zlevel("Empty Area [space_levels_so_far]", list(ZTRAIT_LINKAGE = CROSSLINKED)) + empty_space = add_new_zlevel("Empty Area [space_levels_so_far]", list(ZTRAIT_LINKAGE = CROSSLINKED), orbital_body_type = /datum/orbital_object/z_linked/beacon/weak) // and the transit level transit = add_new_zlevel("Transit/Reserved", list(ZTRAIT_RESERVED = TRUE)) @@ -90,13 +100,10 @@ SUBSYSTEM_DEF(mapping) seedRuins(lava_ruins, CONFIG_GET(number/lavaland_budget), /area/lavaland/surface/outdoors/unexplored, lava_ruins_templates) for (var/lava_z in lava_ruins) spawn_rivers(lava_z) - - // 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) loading_ruins = FALSE #endif + // Run map generation after ruin generation to prevent issues + run_map_generation() repopulate_sorted_areas() // Set up Z-level transitions. setup_map_transitions() @@ -134,7 +141,7 @@ SUBSYSTEM_DEF(mapping) qdel(T, TRUE) /* Nuke threats, for making the blue tiles on the station go RED - Used by the AI doomsday and the self destruct nuke. + Used by the AI doomsday and the self-destruct nuke. */ /datum/controller/subsystem/mapping/proc/add_nuke_threat(datum/nuke) @@ -167,6 +174,7 @@ SUBSYSTEM_DEF(mapping) unused_turfs = SSmapping.unused_turfs turf_reservations = SSmapping.turf_reservations used_turfs = SSmapping.used_turfs + holodeck_templates = SSmapping.holodeck_templates config = SSmapping.config next_map_config = SSmapping.next_map_config @@ -176,7 +184,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, orbital_body_type) . = list() var/start_time = REALTIMEOFDAY @@ -209,15 +217,22 @@ SUBSYSTEM_DEF(mapping) // preload the relevant space_level datums var/start_z = world.maxz + 1 var/i = 0 + var/list/datum/space_level/space_levels = list() for (var/level in traits) - add_new_zlevel("[name][i ? " [i + 1]" : ""]", level) + space_levels += add_new_zlevel("[name][i ? " [i + 1]" : ""]", level) ++i + //Shared orbital body + var/datum/orbital_object/z_linked/orbital_body = new orbital_body_type() + for(var/datum/space_level/level as() in space_levels) + level.orbital_body = orbital_body + orbital_body.link_to_z(level) // 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)) errorList |= pm.original_path + if(!silent) INIT_ANNOUNCE("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!") return parsed_maps @@ -232,7 +247,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, orbital_body_type = /datum/orbital_object/z_linked/station) if(SSdbcore.Connect()) var/datum/DBQuery/query_round_map_name = SSdbcore.NewQuery({" @@ -245,11 +260,11 @@ SUBSYSTEM_DEF(mapping) // TODO: remove this when the DB is prepared for the z-levels getting reordered while (world.maxz < (5 - 1) && space_levels_so_far < config.space_ruin_levels) ++space_levels_so_far - add_new_zlevel("Empty Area [space_levels_so_far]", ZTRAITS_SPACE) + LAZYADD(SSzclear.free_levels, add_new_zlevel("Empty Area [space_levels_so_far]", ZTRAITS_SPACE, orbital_body_type = null)) // load mining if(config.minetype == "lavaland") - LoadGroup(FailedZs, "Lavaland", "map_files/Mining", "Lavaland.dmm", default_traits = ZTRAITS_LAVALAND) + LoadGroup(FailedZs, "Lavaland", "map_files/Mining", "Lavaland.dmm", default_traits = ZTRAITS_LAVALAND, orbital_body_type = /datum/orbital_object/z_linked/lavaland) else if (!isnull(config.minetype)) INIT_ANNOUNCE("WARNING: An unknown minetype '[config.minetype]' was set! This is being ignored! Update the maploader code!") #endif @@ -267,10 +282,10 @@ GLOBAL_LIST_EMPTY(the_station_areas) /datum/controller/subsystem/mapping/proc/generate_station_area_list() var/list/station_areas_blacklist = typecacheof(list(/area/space, /area/mine, /area/ruin, /area/asteroid/nearstation)) - for(var/area/A in world) + for(var/area/A in GLOB.sortedAreas) if (is_type_in_typecache(A, station_areas_blacklist)) continue - if (!A.contents.len || !A.unique) + if (!A.contents.len || !(A.area_flags & UNIQUE_AREA)) continue var/turf/picked = A.contents[1] if (is_station_level(picked.z)) @@ -279,6 +294,10 @@ GLOBAL_LIST_EMPTY(the_station_areas) if(!GLOB.the_station_areas.len) log_world("ERROR: Station areas list failed to generate!") +/datum/controller/subsystem/mapping/proc/run_map_generation() + for(var/area/A in world) + A.RunGeneration() + /datum/controller/subsystem/mapping/proc/maprotate() if(map_voted) map_voted = FALSE @@ -352,6 +371,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) preloadShuttleTemplates() preloadShelterTemplates() preloadRandomRoomTemplates() + preloadHolodeckTemplates() /datum/controller/subsystem/mapping/proc/preloadRandomRoomTemplates() for(var/item in subtypesof(/datum/map_template/random_room)) @@ -386,7 +406,8 @@ GLOBAL_LIST_EMPTY(the_station_areas) space_ruins_templates[R.name] = R /datum/controller/subsystem/mapping/proc/preloadShuttleTemplates() - var/list/unbuyable = generateMapList("[global.config.directory]/unbuyableshuttles.txt") + var/list/unbuyable = generateMapList("[global.config.directory]/shuttles_unbuyable.txt") + var/list/illegal = generateMapList("[global.config.directory]/shuttles_illegal.txt") for(var/item in subtypesof(/datum/map_template/shuttle)) var/datum/map_template/shuttle/shuttle_type = item @@ -396,6 +417,8 @@ GLOBAL_LIST_EMPTY(the_station_areas) var/datum/map_template/shuttle/S = new shuttle_type() if(unbuyable.Find(S.mappath)) S.can_be_bought = FALSE + if(illegal.Find(S.mappath)) + S.illegal_shuttle = TRUE shuttle_templates[S.shuttle_id] = S map_templates[S.shuttle_id] = S @@ -410,6 +433,15 @@ GLOBAL_LIST_EMPTY(the_station_areas) shelter_templates[S.shelter_id] = S map_templates[S.shelter_id] = S +/datum/controller/subsystem/mapping/proc/preloadHolodeckTemplates() + for(var/item in subtypesof(/datum/map_template/holodeck)) + var/datum/map_template/holodeck/holodeck_type = item + if(!(initial(holodeck_type.mappath))) + continue + var/datum/map_template/holodeck/holo_template = new holodeck_type() + + holodeck_templates[holo_template.template_id] = holo_template + //Manual loading of away missions. /client/proc/admin_away() set name = "Load Away Mission" @@ -530,7 +562,10 @@ GLOBAL_LIST_EMPTY(the_station_areas) used_turfs.Cut() reserve_turfs(clearing) - +/datum/controller/subsystem/mapping/proc/initialize_biomes() + for(var/biome_path in subtypesof(/datum/biome)) + var/datum/biome/biome_instance = new biome_path() + biomes[biome_path] += biome_instance /datum/controller/subsystem/mapping/proc/reg_in_areas_in_z(list/areas) for(var/B in areas) diff --git a/code/controllers/subsystem/metrics.dm b/code/controllers/subsystem/metrics.dm new file mode 100644 index 0000000000000..0c9f2dfd27572 --- /dev/null +++ b/code/controllers/subsystem/metrics.dm @@ -0,0 +1,63 @@ +/* + + Ok listen up + + This thing ingests data to ElasticSearch in a VERY SPECIFIC FORMAT + Not only is changing this a very bad idea due to elasticsearch being very finnicky with data formatting, + but if you edit this subsystem and its fields, you invalidate a lot of existing data + + Dont touch this shit without speaking to crossed or AA07 first + +*/ +SUBSYSTEM_DEF(metrics) + name = "Metrics" + wait = 30 SECONDS + runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME // ALL THE LEVELS + flags = SS_KEEP_TIMING // This needs to ingest every 30 IRL seconds, not ingame seconds. + /// The real time of day the server started. Used to calculate time drift + var/world_init_time = 0 // Not set in here. Set in world/New() + +/datum/controller/subsystem/metrics/Initialize(start_timeofday) + if(!CONFIG_GET(flag/elasticsearch_metrics_enabled)) + flags |= SS_NO_FIRE // Disable firing to save CPU + return ..() + + +/datum/controller/subsystem/metrics/fire(resumed) + var/datum/http_request/request = new() + request.prepare(RUSTG_HTTP_METHOD_POST, CONFIG_GET(string/elasticsearch_metrics_endpoint), get_metrics_json(), list( + "Authorization" = "ApiKey [CONFIG_GET(string/elasticsearch_metrics_apikey)]", + "Content-Type" = "application/json" + )) + request.begin_async() // Fire and forget who gives a shit + +/datum/controller/subsystem/metrics/proc/get_metrics_json() + var/list/out = list() + out["@timestamp"] = iso_timestamp() // This is required by ElasticSearch, complete with this name. DO NOT REMOVE THIS. + out["cpu"] = world.cpu + out["maptick"] = world.map_cpu + out["elapsed_processed"] = world.time + out["elapsed_real"] = (REALTIMEOFDAY - world_init_time) + out["client_count"] = length(GLOB.clients) + out["round_id"] = text2num(GLOB.round_id) // This is so we can filter the metrics by a single round ID + + var/server_name = CONFIG_GET(string/serversqlname) + if(server_name) + out["server_name"] = server_name + + // Funnel in all SS metrics + var/list/ss_data = list() + for(var/datum/controller/subsystem/SS in Master.subsystems) + ss_data[SS.ss_id] = SS.get_metrics() + + out["subsystems"] = ss_data + // And send it all + return json_encode(out) + +/* + +// Uncomment this if you add new metrics to verify how the JSON formats + +/client/verb/debug_metrics() + usr << browse(SSmetrics.get_metrics_json(), "window=aadebug") +*/ diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm index f783aca919693..c91afcdf7aa9d 100644 --- a/code/controllers/subsystem/mobs.dm +++ b/code/controllers/subsystem/mobs.dm @@ -3,14 +3,23 @@ SUBSYSTEM_DEF(mobs) priority = FIRE_PRIORITY_MOBS flags = SS_KEEP_TIMING | SS_NO_INIT runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + wait = 2 SECONDS var/list/currentrun = list() 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/datum/spawners_menu/spawner_menu + /datum/controller/subsystem/mobs/stat_entry() - ..("P:[GLOB.mob_living_list.len]") + . = ..("P:[GLOB.mob_living_list.len]") + +/datum/controller/subsystem/mobs/get_metrics() + . = ..() + var/list/cust = list() + cust["processing"] = length(GLOB.mob_living_list) + .["custom"] = cust /datum/controller/subsystem/mobs/proc/MaxZChanged() if (!islist(clients_by_zlevel)) @@ -22,8 +31,7 @@ SUBSYSTEM_DEF(mobs) dead_players_by_zlevel.len++ dead_players_by_zlevel[dead_players_by_zlevel.len] = list() -/datum/controller/subsystem/mobs/fire(resumed = 0) - var/seconds = wait * 0.1 +/datum/controller/subsystem/mobs/fire(resumed = FALSE) if (!resumed) src.currentrun = GLOB.mob_living_list.Copy() @@ -47,7 +55,7 @@ SUBSYSTEM_DEF(mobs) break var/msg = "[ADMIN_LOOKUPFLW(M)] was found to have no .loc with an attached client, if the cause is unknown it would be wise to ask how this was accomplished." message_admins(msg) - send2irc_adminless_only("Mob", msg, R_ADMIN) + send2tgs_adminless_only("Mob", msg, R_ADMIN) log_game("[key_name(M)] was found to have no .loc with an attached client.") // This is a temporary error tracker to make sure we've caught everything @@ -62,8 +70,13 @@ SUBSYSTEM_DEF(mobs) var/mob/living/L = currentrun[currentrun.len] currentrun.len-- if(L) - L.Life(seconds, times_fired) + L.Life(wait * 0.1, times_fired) else GLOB.mob_living_list.Remove(L) if (MC_TICK_CHECK) return + +/datum/controller/subsystem/mobs/proc/update_spawners() + if(!spawner_menu) + return + spawner_menu.ui_update() diff --git a/code/controllers/subsystem/moods.dm b/code/controllers/subsystem/moods.dm index f6b6ffcb40453..20111747bdb2d 100644 --- a/code/controllers/subsystem/moods.dm +++ b/code/controllers/subsystem/moods.dm @@ -2,3 +2,4 @@ PROCESSING_SUBSYSTEM_DEF(mood) name = "Mood" flags = SS_NO_INIT | SS_BACKGROUND priority = 20 + wait = 1 SECONDS diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index ec416a3632900..8bae5bcec617b 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -28,6 +28,11 @@ SUBSYSTEM_DEF(nightshift) var/announcing = TRUE var/time = station_time() var/night_time = (time < nightshift_end_time) || (time > nightshift_start_time) + if(!SSmapping.config.allow_night_lighting) + if(night_time) + night_time = FALSE + update_nightshift(night_time, FALSE) + return if(high_security_mode != emergency) high_security_mode = emergency if(night_time) @@ -35,7 +40,7 @@ SUBSYSTEM_DEF(nightshift) if(!emergency) announce("Restoring night lighting configuration to normal operation.") else - announce("Disabling night lighting: Station is in a state of emergency.") + announce("Disabling night lighting: Station is in a state of emergency.") if(emergency) night_time = FALSE if(nightshift_active != night_time) diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index 611ca56b1d6a4..5ce747e717064 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -8,7 +8,7 @@ SUBSYSTEM_DEF(npcpool) /datum/controller/subsystem/npcpool/stat_entry() var/list/activelist = GLOB.simple_animals[AI_ON] - ..("NPCS:[activelist.len]") + . = ..("NPCS:[activelist.len]") /datum/controller/subsystem/npcpool/fire(resumed = FALSE) @@ -23,6 +23,11 @@ SUBSYSTEM_DEF(npcpool) var/mob/living/simple_animal/SA = currentrun[currentrun.len] --currentrun.len + if(!SA) + stack_trace("Null entry found at GLOB.simple_animals\[AI_ON\]. Null entries will be purged. Yell at coderbus. Subsystem will try to continue.") + removeNullsFromList(GLOB.simple_animals[AI_ON]) + continue + if(!SA.ckey && !SA.notransform) if(SA.stat != DEAD) SA.handle_automated_movement() @@ -31,11 +36,6 @@ SUBSYSTEM_DEF(npcpool) if(SA.stat != DEAD) SA.handle_automated_speech() if(SA.special_process) - var/mob/living/simple_animal/slime/S = SA - if(istype(S)) - S.special_process = FALSE - S.AIprocess() - else - SA.process() + SA.process() if (MC_TICK_CHECK) return diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm index b7c424fb84122..535cc71a0d9b6 100644 --- a/code/controllers/subsystem/overlays.dm +++ b/code/controllers/subsystem/overlays.dm @@ -23,7 +23,7 @@ SUBSYSTEM_DEF(overlays) /datum/controller/subsystem/overlays/stat_entry() - ..("Ov:[length(queue)]") + . = ..("Ov:[length(queue)]") /datum/controller/subsystem/overlays/Shutdown() diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm index 8edcf8fd1192e..a0cda6a09f075 100644 --- a/code/controllers/subsystem/pai.dm +++ b/code/controllers/subsystem/pai.dm @@ -141,6 +141,9 @@ SUBSYSTEM_DEF(pai) return FALSE /datum/controller/subsystem/pai/proc/findPAI(obj/item/paicard/p, mob/user) + if(!(GLOB.ghost_role_flags & GHOSTROLE_SILICONS)) + to_chat(user, "Due to growing incidents of SELF corrupted independent artificial intelligences, freeform personality devices have been temporarily banned in this sector.") + return if(!ghost_spam) ghost_spam = TRUE for(var/mob/dead/observer/G in GLOB.player_list) diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm index af5b13cea669f..492b41a915f63 100644 --- a/code/controllers/subsystem/parallax.dm +++ b/code/controllers/subsystem/parallax.dm @@ -14,7 +14,7 @@ SUBSYSTEM_DEF(parallax) /datum/controller/subsystem/parallax/PreInit() . = ..() if(prob(70)) //70% chance to pick a special extra layer - random_layer = pick(/obj/screen/parallax_layer/random/space_gas, /obj/screen/parallax_layer/random/asteroids) + random_layer = pick(/atom/movable/screen/parallax_layer/random/space_gas, /atom/movable/screen/parallax_layer/random/asteroids) random_parallax_color = pick(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, COLOR_YELLOW, COLOR_CYAN, COLOR_ORANGE, COLOR_PURPLE)//Special color for random_layer1. Has to be done here so everyone sees the same color. planet_y_offset = rand(100, 160) planet_x_offset = rand(100, 160) diff --git a/code/controllers/subsystem/pathfinder.dm b/code/controllers/subsystem/pathfinder.dm index 8e1cf946ae19d..26f54245732e1 100644 --- a/code/controllers/subsystem/pathfinder.dm +++ b/code/controllers/subsystem/pathfinder.dm @@ -3,13 +3,11 @@ SUBSYSTEM_DEF(pathfinder) init_order = INIT_ORDER_PATH flags = SS_NO_FIRE var/datum/flowcache/mobs - var/datum/flowcache/circuits var/static/space_type_cache /datum/controller/subsystem/pathfinder/Initialize() space_type_cache = typecacheof(/turf/open/space) mobs = new(10) - circuits = new(3) return ..() /datum/flowcache @@ -18,7 +16,7 @@ SUBSYSTEM_DEF(pathfinder) var/free var/list/flow -/datum/flowcache/New(var/n) +/datum/flowcache/New(n) . = ..() lcount = n run = 0 diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index c7f33c232531d..3bd76a94d1306 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -13,7 +13,9 @@ SUBSYSTEM_DEF(persistence) var/list/antag_rep_change = list() var/list/picture_logging_information = list() var/list/obj/structure/sign/picture_frame/photo_frames + var/list/obj/structure/sign/painting/painting_frames = list() var/list/obj/item/storage/photo_album/photo_albums + var/list/paintings = list() /datum/controller/subsystem/persistence/Initialize() LoadPoly() @@ -23,6 +25,7 @@ SUBSYSTEM_DEF(persistence) LoadPhotoPersistence() if(CONFIG_GET(flag/use_antag_rep)) LoadAntagReputation() + LoadPaintings() return ..() /datum/controller/subsystem/persistence/proc/LoadPoly() @@ -127,7 +130,7 @@ SUBSYSTEM_DEF(persistence) var/list/chosen_trophy = trophy_data - if(!chosen_trophy || isemptylist(chosen_trophy)) //Malformed + if(!chosen_trophy || !length(chosen_trophy)) //Malformed continue var/path = text2path(chosen_trophy["path"]) //If the item no longer exist, this returns null @@ -146,6 +149,7 @@ SUBSYSTEM_DEF(persistence) SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION. if(CONFIG_GET(flag/use_antag_rep)) CollectAntagReputation() + SavePaintings() /datum/controller/subsystem/persistence/proc/GetPhotoAlbums() var/album_path = file("data/photo_albums.json") @@ -282,3 +286,18 @@ SUBSYSTEM_DEF(persistence) fdel(FILE_ANTAG_REP) rustg_file_append(json_encode(antag_rep), FILE_ANTAG_REP) +/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/ai_basic_avoidance.dm b/code/controllers/subsystem/processing/ai_basic_avoidance.dm new file mode 100644 index 0000000000000..2a3fe992f4473 --- /dev/null +++ b/code/controllers/subsystem/processing/ai_basic_avoidance.dm @@ -0,0 +1,4 @@ +PROCESSING_SUBSYSTEM_DEF(basic_avoidance) + name = "Basic Avoidance" + flags = SS_NO_INIT + wait = 2 SECONDS diff --git a/code/controllers/subsystem/processing/ai_behaviors.dm b/code/controllers/subsystem/processing/ai_behaviors.dm new file mode 100644 index 0000000000000..4c98567405cc4 --- /dev/null +++ b/code/controllers/subsystem/processing/ai_behaviors.dm @@ -0,0 +1,20 @@ +/// The subsystem used to tick [/datum/ai_behavior] instances. Handling the individual actions an AI can take like punching someone in the fucking NUTS +PROCESSING_SUBSYSTEM_DEF(ai_behaviors) + name = "AI Behavior Ticker" + flags = SS_POST_FIRE_TIMING|SS_BACKGROUND + priority = FIRE_PRIORITY_NPC_ACTIONS + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + init_order = INIT_ORDER_AI_CONTROLLERS + wait = 1 + ///List of all ai_behavior singletons, key is the typepath while assigned value is a newly created instance of the typepath. See SetupAIBehaviors() + var/list/ai_behaviors + +/datum/controller/subsystem/processing/ai_behaviors/Initialize(timeofday) + SetupAIBehaviors() + return ..() + +/datum/controller/subsystem/processing/ai_behaviors/proc/SetupAIBehaviors() + ai_behaviors = list() + for(var/behavior_type in subtypesof(/datum/ai_behavior)) + var/datum/ai_behavior/ai_behavior = new behavior_type + ai_behaviors[behavior_type] = ai_behavior diff --git a/code/controllers/subsystem/processing/ai_controllers.dm b/code/controllers/subsystem/processing/ai_controllers.dm new file mode 100644 index 0000000000000..5319d7316fb9b --- /dev/null +++ b/code/controllers/subsystem/processing/ai_controllers.dm @@ -0,0 +1,33 @@ +/// The subsystem used to tick [/datum/ai_controllers] instances. Handling the re-checking of plans. +SUBSYSTEM_DEF(ai_controllers) + name = "AI Controller Ticker" + flags = SS_POST_FIRE_TIMING|SS_BACKGROUND + priority = FIRE_PRIORITY_NPC + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + init_order = INIT_ORDER_AI_CONTROLLERS + wait = 0.5 SECONDS //Plan every half second if required, not great not terrible. + + ///List of all ai_subtree singletons, key is the typepath while assigned value is a newly created instance of the typepath. See setup_subtrees() + var/list/ai_subtrees = list() + ///List of all ai controllers currently running + var/list/active_ai_controllers = list() + +/datum/controller/subsystem/ai_controllers/Initialize(timeofday) + setup_subtrees() + return ..() + +/datum/controller/subsystem/ai_controllers/proc/setup_subtrees() + ai_subtrees = list() + for(var/subtree_type in subtypesof(/datum/ai_planning_subtree)) + var/datum/ai_planning_subtree/subtree = new subtree_type + ai_subtrees[subtree_type] = subtree + +/datum/controller/subsystem/ai_controllers/fire(resumed) + for(var/datum/ai_controller/ai_controller as anything in active_ai_controllers) + if(!COOLDOWN_FINISHED(ai_controller, failed_planning_cooldown)) + continue + + if(!LAZYLEN(ai_controller.current_behaviors)) + ai_controller.SelectBehaviors(wait * 0.1) + if(!LAZYLEN(ai_controller.current_behaviors)) //Still no plan + COOLDOWN_START(ai_controller, failed_planning_cooldown, AI_FAILED_PLANNING_COOLDOWN) diff --git a/code/controllers/subsystem/processing/ai_movement.dm b/code/controllers/subsystem/processing/ai_movement.dm new file mode 100644 index 0000000000000..6a6d64548ca78 --- /dev/null +++ b/code/controllers/subsystem/processing/ai_movement.dm @@ -0,0 +1,21 @@ +/// The subsystem used to tick [/datum/ai_movement] instances. Handling the movement of individual AI instances +PROCESSING_SUBSYSTEM_DEF(ai_movement) + name = "AI movement" + flags = SS_KEEP_TIMING|SS_BACKGROUND + priority = FIRE_PRIORITY_NPC_MOVEMENT + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + init_order = INIT_ORDER_AI_MOVEMENT + wait = 1 + + ///an assoc list of all ai_movement types. Assoc type to instance + var/list/movement_types + +/datum/controller/subsystem/processing/ai_movement/Initialize(timeofday) + SetupAIMovementInstances() + return ..() + +/datum/controller/subsystem/processing/ai_movement/proc/SetupAIMovementInstances() + movement_types = list() + for(var/key as anything in subtypesof(/datum/ai_movement)) + var/datum/ai_movement/ai_movement = new key + movement_types[key] = ai_movement diff --git a/code/controllers/subsystem/processing/circuit.dm b/code/controllers/subsystem/processing/circuit.dm deleted file mode 100644 index 96bf274fd26ee..0000000000000 --- a/code/controllers/subsystem/processing/circuit.dm +++ /dev/null @@ -1,91 +0,0 @@ -PROCESSING_SUBSYSTEM_DEF(circuit) - name = "Circuit" - stat_tag = "CIR" - init_order = INIT_ORDER_CIRCUIT - flags = NONE - - var/cipherkey - - var/list/all_components = list() // Associative list of [component_name]:[component_path] pairs - var/list/cached_components = list() // Associative list of [component_path]:[component] pairs - var/list/all_assemblies = list() // Associative list of [assembly_name]:[assembly_path] pairs - var/list/cached_assemblies = list() // Associative list of [assembly_path]:[assembly] pairs - var/list/all_circuits = list() // Associative list of [circuit_name]:[circuit_path] pairs - var/list/circuit_fabricator_recipe_list = list() // Associative list of [category_name]:[list_of_circuit_paths] pairs - var/cost_multiplier = MINERAL_MATERIAL_AMOUNT / 10 // Each circuit cost unit is 200cm3 - -/datum/controller/subsystem/processing/circuit/Initialize(start_timeofday) - SScircuit.cipherkey = uppertext(random_string(2000+rand(0,10), GLOB.alphabet)) - circuits_init() - return ..() - -/datum/controller/subsystem/processing/circuit/proc/circuits_init() - //Cached lists for free performance - for(var/path in typesof(/obj/item/integrated_circuit)) - var/obj/item/integrated_circuit/IC = path - var/name = initial(IC.name) - all_components[name] = path // Populating the component lists - cached_components[IC] = new path - - if(!(initial(IC.spawn_flags) & (IC_SPAWN_DEFAULT | IC_SPAWN_RESEARCH))) - continue - - var/category = initial(IC.category_text) - if(!circuit_fabricator_recipe_list[category]) - circuit_fabricator_recipe_list[category] = list() - var/list/category_list = circuit_fabricator_recipe_list[category] - category_list += IC // Populating the fabricator categories - - for(var/path in typesof(/obj/item/electronic_assembly)) - var/obj/item/electronic_assembly/A = path - var/name = initial(A.name) - all_assemblies[name] = path - cached_assemblies[A] = new path - - - circuit_fabricator_recipe_list["Assemblies"] = list( - /obj/item/electronic_assembly/default, - /obj/item/electronic_assembly/calc, - /obj/item/electronic_assembly/clam, - /obj/item/electronic_assembly/simple, - /obj/item/electronic_assembly/hook, - /obj/item/electronic_assembly/pda, - /obj/item/electronic_assembly/small/default, - /obj/item/electronic_assembly/small/cylinder, - /obj/item/electronic_assembly/small/scanner, - /obj/item/electronic_assembly/small/hook, - /obj/item/electronic_assembly/small/box, - /obj/item/electronic_assembly/medium/default, - /obj/item/electronic_assembly/medium/box, - /obj/item/electronic_assembly/medium/clam, - /obj/item/electronic_assembly/medium/medical, - /obj/item/electronic_assembly/medium/gun, - /obj/item/electronic_assembly/medium/radio, - /obj/item/electronic_assembly/large/default, - /obj/item/electronic_assembly/large/scope, - /obj/item/electronic_assembly/large/terminal, - /obj/item/electronic_assembly/large/arm, - /obj/item/electronic_assembly/large/tall, - /obj/item/electronic_assembly/large/industrial, - /obj/item/electronic_assembly/drone/default, - /obj/item/electronic_assembly/drone/arms, - /obj/item/electronic_assembly/drone/secbot, - /obj/item/electronic_assembly/drone/medbot, - /obj/item/electronic_assembly/drone/genbot, - /obj/item/electronic_assembly/drone/android, - /obj/item/electronic_assembly/wallmount/tiny, - /obj/item/electronic_assembly/wallmount/light, - /obj/item/electronic_assembly/wallmount, - /obj/item/electronic_assembly/wallmount/heavy - ///obj/item/weapon/implant/integrated_circuit - ) - - circuit_fabricator_recipe_list["Tools"] = list( - /obj/item/integrated_electronics/wirer, - /obj/item/integrated_electronics/debugger, - /obj/item/integrated_electronics/analyzer, - /obj/item/integrated_electronics/detailer, - /obj/item/card/data, - /obj/item/card/data/full_color, - /obj/item/card/data/disk - ) diff --git a/code/controllers/subsystem/processing/clock_component.dm b/code/controllers/subsystem/processing/clock_component.dm new file mode 100644 index 0000000000000..d07acaa6d7932 --- /dev/null +++ b/code/controllers/subsystem/processing/clock_component.dm @@ -0,0 +1,5 @@ +/// The subsystem used to tick [/datum/component/acid] instances. +PROCESSING_SUBSYSTEM_DEF(clock_component) + name = "Clock Component" + flags = SS_NO_INIT|SS_BACKGROUND|SS_KEEP_TIMING + wait = COMP_CLOCK_DELAY diff --git a/code/controllers/subsystem/processing/fastprocess.dm b/code/controllers/subsystem/processing/fastprocess.dm index 9622e02146924..1b30ca44c240a 100644 --- a/code/controllers/subsystem/processing/fastprocess.dm +++ b/code/controllers/subsystem/processing/fastprocess.dm @@ -1,6 +1,4 @@ -//Fires five times every second. - PROCESSING_SUBSYSTEM_DEF(fastprocess) name = "Fast Processing" - wait = 2 + wait = 0.2 SECONDS stat_tag = "FP" diff --git a/code/controllers/subsystem/processing/instruments.dm b/code/controllers/subsystem/processing/instruments.dm new file mode 100644 index 0000000000000..3e1ed85559865 --- /dev/null +++ b/code/controllers/subsystem/processing/instruments.dm @@ -0,0 +1,56 @@ +PROCESSING_SUBSYSTEM_DEF(instruments) + name = "Instruments" + wait = 0.5 + init_order = INIT_ORDER_INSTRUMENTS + flags = SS_KEEP_TIMING + priority = FIRE_PRIORITY_INSTRUMENTS + /// List of all instrument data, associative id = datum + var/static/list/datum/instrument/instrument_data = list() + /// List of all song datums. + var/static/list/datum/song/songs = list() + /// Max lines in songs + var/static/musician_maxlines = 600 + /// Max characters per line in songs + var/static/musician_maxlinechars = 300 + /// Deciseconds between hearchecks. Too high and instruments seem to lag when people are moving around in terms of who can hear it. Too low and the server lags from this. + var/static/musician_hearcheck_mindelay = 5 + /// Maximum instrument channels total instruments are allowed to use. This is so you don't have instruments deadlocking all sound channels. + var/static/max_instrument_channels = MAX_INSTRUMENT_CHANNELS + /// Current number of channels allocated for instruments + var/static/current_instrument_channels = 0 + /// Single cached list for synthesizer instrument ids, so you don't have to have a new list with every synthesizer. + var/static/list/synthesizer_instrument_ids + +/datum/controller/subsystem/processing/instruments/Initialize() + initialize_instrument_data() + synthesizer_instrument_ids = get_allowed_instrument_ids() + 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() + if(!I.id) + qdel(I) + continue + instrument_data[I.id] = 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++ \ No newline at end of file diff --git a/code/controllers/subsystem/processing/nanites.dm b/code/controllers/subsystem/processing/nanites.dm index c34e7f78066cc..8a55491f5fa4d 100644 --- a/code/controllers/subsystem/processing/nanites.dm +++ b/code/controllers/subsystem/processing/nanites.dm @@ -1,7 +1,7 @@ PROCESSING_SUBSYSTEM_DEF(nanites) name = "Nanites" flags = SS_BACKGROUND|SS_POST_FIRE_TIMING|SS_NO_INIT - wait = 10 + wait = 1 SECONDS var/list/datum/nanite_cloud_backup/cloud_backups = list() var/list/mob/living/nanite_monitored_mobs = list() diff --git a/code/controllers/subsystem/processing/obj.dm b/code/controllers/subsystem/processing/obj.dm index 26021fb267a17..3566e8a4dc221 100644 --- a/code/controllers/subsystem/processing/obj.dm +++ b/code/controllers/subsystem/processing/obj.dm @@ -2,4 +2,4 @@ PROCESSING_SUBSYSTEM_DEF(obj) name = "Objects" priority = FIRE_PRIORITY_OBJ flags = SS_NO_INIT - wait = 20 + wait = 2 SECONDS diff --git a/code/controllers/subsystem/processing/orbits.dm b/code/controllers/subsystem/processing/orbits.dm new file mode 100644 index 0000000000000..f5edc16d5fc8c --- /dev/null +++ b/code/controllers/subsystem/processing/orbits.dm @@ -0,0 +1,153 @@ +PROCESSING_SUBSYSTEM_DEF(orbits) + name = "Orbits" + flags = SS_KEEP_TIMING + init_order = INIT_ORDER_ORBITS + priority = FIRE_PRIORITY_ORBITS + wait = ORBITAL_UPDATE_RATE + + //The primary orbital map. + var/list/orbital_maps = list() + + var/datum/orbital_map_tgui/orbital_map_tgui = new() + + var/initial_space_ruins = 2 + var/initial_objective_beacons = 3 + var/initial_asteroids = 6 + + var/orbits_setup = FALSE + + var/list/datum/orbital_objective/possible_objectives = list() + + var/datum/orbital_objective/current_objective + + var/list/datum/ruin_event/ruin_events = list() + + var/list/runnable_events + + var/event_probability = 60 + + //key = port_id + //value = orbital shuttle object + var/list/assoc_shuttles = list() + + //Key = port_id + //value = world time of next launch + var/list/interdicted_shuttles = list() + + var/next_objective_time = 0 + + //Research disks + var/list/research_disks = list() + + var/list/datum/tgui/open_orbital_maps = list() + + //The station + var/datum/orbital_object/station_instance + + //Ruin level count + var/ruin_levels = 0 + +/datum/controller/subsystem/processing/orbits/Initialize(start_timeofday) + . = ..() + setup_event_list() + //Create the main orbital map. + orbital_maps[PRIMARY_ORBITAL_MAP] = new /datum/orbital_map() + +/datum/controller/subsystem/processing/orbits/proc/setup_event_list() + runnable_events = list() + for(var/ruin_event in subtypesof(/datum/ruin_event)) + var/datum/ruin_event/instanced = new ruin_event() + runnable_events[instanced] = instanced.probability + +/datum/controller/subsystem/processing/orbits/proc/get_event() + if(!event_probability) + return null + return pickweight(runnable_events) + +/datum/controller/subsystem/processing/orbits/proc/post_load_init() + for(var/map_key in orbital_maps) + var/datum/orbital_map/orbital_map = orbital_maps[map_key] + orbital_map.post_setup() + orbits_setup = TRUE + //Create initial ruins + for(var/i in 1 to initial_space_ruins) + new /datum/orbital_object/z_linked/beacon/ruin/spaceruin() + for(var/i in 1 to initial_objective_beacons) + new /datum/orbital_object/z_linked/beacon/ruin() + //Create asteroid belt + for(var/i in 1 to initial_asteroids) + new /datum/orbital_object/z_linked/beacon/ruin/asteroid() + +/datum/controller/subsystem/processing/orbits/fire(resumed) + if(resumed) + . = ..() + if(MC_TICK_CHECK) + return + //Update UIs + for(var/datum/tgui/tgui as() in open_orbital_maps) + tgui.send_update() + //Check creating objectives / missions. + if(next_objective_time < world.time && length(possible_objectives) < 6) + create_objective() + next_objective_time = world.time + rand(30 SECONDS, 5 MINUTES) + //Check space ruin count + if(ruin_levels < 2 && prob(5)) + new /datum/orbital_object/z_linked/beacon/ruin/spaceruin() + //Check objective + if(current_objective) + if(current_objective.check_failed()) + priority_announce("Central Command priority objective failed.", "Central Command Report", SSstation.announcer.get_rand_report_sound()) + QDEL_NULL(current_objective) + //Process events + for(var/datum/ruin_event/ruin_event as() in ruin_events) + if(!ruin_event.update()) + ruin_events.Remove(ruin_event) + //Do processing. + if(!resumed) + . = ..() + if(MC_TICK_CHECK) + return + //Update UIs + for(var/datum/tgui/tgui as() in open_orbital_maps) + tgui.send_update() + +/mob/dead/observer/verb/open_orbit_ui() + set name = "View Orbits" + set category = "Ghost" + SSorbits.orbital_map_tgui.ui_interact(src) + +/datum/controller/subsystem/processing/orbits/proc/create_objective() + var/static/list/valid_objectives = list( + /datum/orbital_objective/recover_blackbox = 3, + /datum/orbital_objective/nuclear_bomb = 1, + /datum/orbital_objective/artifact = 1, + /datum/orbital_objective/vip_recovery = 1 + ) + if(!length(possible_objectives)) + priority_announce("Priority station objective recieved - Details transmitted to all available objective consoles. \ + [GLOB.station_name] will have funds distributed upon objective completion.", "Central Command Report", SSstation.announcer.get_rand_report_sound()) + var/chosen = pickweight(valid_objectives) + if(!chosen) + return + var/datum/orbital_objective/objective = new chosen() + objective.generate_payout() + possible_objectives += objective + update_objective_computers() + +/datum/controller/subsystem/processing/orbits/proc/assign_objective(objective_computer, datum/orbital_objective/objective) + if(!possible_objectives.Find(objective)) + return "Selected objective is no longer available or has been claimed already." + if(current_objective) + return "An objective has already been selected and must be completed first." + objective.on_assign(objective_computer) + objective.generate_attached_beacon() + objective.announce() + current_objective = objective + possible_objectives.Remove(objective) + update_objective_computers() + return "Objective selected, good luck." + +/datum/controller/subsystem/processing/orbits/proc/update_objective_computers() + for(var/obj/machinery/computer/objective/computer as() in GLOB.objective_computers) + for(var/M in computer.viewing_mobs) + computer.update_static_data(M) diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm index c5d6dfa126838..70f44822be27c 100644 --- a/code/controllers/subsystem/processing/processing.dm +++ b/code/controllers/subsystem/processing/processing.dm @@ -1,17 +1,23 @@ -//Used to process objects. Fires once every second. +//Used to process objects. SUBSYSTEM_DEF(processing) name = "Processing" priority = FIRE_PRIORITY_PROCESS flags = SS_BACKGROUND|SS_POST_FIRE_TIMING|SS_NO_INIT - wait = 10 + wait = 1 SECONDS var/stat_tag = "P" //Used for logging var/list/processing = list() var/list/currentrun = list() /datum/controller/subsystem/processing/stat_entry() - ..("[stat_tag]:[processing.len]") + . = ..("[stat_tag]:[processing.len]") + +/datum/controller/subsystem/processing/get_metrics() + . = ..() + var/list/cust = list() + cust["processing"] = length(processing) + .["custom"] = cust /datum/controller/subsystem/processing/fire(resumed = 0) if (!resumed) @@ -24,12 +30,25 @@ SUBSYSTEM_DEF(processing) current_run.len-- if(QDELETED(thing)) processing -= thing - else if(thing.process(wait) == PROCESS_KILL) + else if(thing.process(wait * 0.1) == PROCESS_KILL) // fully stop so that a future START_PROCESSING will work STOP_PROCESSING(src, thing) if (MC_TICK_CHECK) return -/datum/proc/process() - set waitfor = 0 +/** + * This proc is called on a datum on every "cycle" if it is being processed by a subsystem. The time between each cycle is determined by the subsystem's "wait" setting. + * You can start and stop processing a datum using the START_PROCESSING and STOP_PROCESSING defines. + * + * Since the wait setting of a subsystem can be changed at any time, it is important that any rate-of-change that you implement in this proc is multiplied by the delta_time that is sent as a parameter, + * Additionally, any "prob" you use in this proc should instead use the DT_PROB define to make sure that the final probability per second stays the same even if the subsystem's wait is altered. + * Examples where this must be considered: + * - Implementing a cooldown timer, use `mytimer -= delta_time`, not `mytimer -= 1`. This way, `mytimer` will always have the unit of seconds + * - Damaging a mob, do `L.adjustFireLoss(20 * delta_time)`, not `L.adjustFireLoss(20)`. This way, the damage per second stays constant even if the wait of the subsystem is changed + * - Probability of something happening, do `if(DT_PROB(25, delta_time))`, not `if(prob(25))`. This way, if the subsystem wait is e.g. lowered, there won't be a higher chance of this event happening per second + * + * If you override this do not call parent, as it will return PROCESS_KILL. This is done to prevent objects that dont override process() from staying in the processing list + */ +/datum/proc/process(delta_time) + set waitfor = FALSE return PROCESS_KILL diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index ce3ab89472e7e..8a67d2bcb5899 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -5,13 +5,13 @@ PROCESSING_SUBSYSTEM_DEF(quirks) name = "Quirks" init_order = INIT_ORDER_QUIRKS flags = SS_BACKGROUND - wait = 10 runlevels = RUNLEVEL_GAME + wait = 1 SECONDS var/list/quirks = list() //Assoc. list of all roundstart quirk datum types; "name" = /path/ var/list/quirk_points = list() //Assoc. list of quirk names and their "point cost"; positive numbers are good traits, and negative ones are bad var/list/quirk_objects = list() //A list of all quirk objects in the game, since some may process - var/list/quirk_blacklist = list() //A list a list of quirks that can not be used with each other. Format: list(quirk1,quirk2),list(quirk3,quirk4) + var/list/quirk_blacklist = list() //A list of quirks that can not be used with each other. Format: list(quirk1,quirk2),list(quirk3,quirk4) /datum/controller/subsystem/processing/quirks/Initialize(timeofday) if(!quirks.len) diff --git a/code/controllers/subsystem/processing/station.dm b/code/controllers/subsystem/processing/station.dm new file mode 100644 index 0000000000000..d5636f0571509 --- /dev/null +++ b/code/controllers/subsystem/processing/station.dm @@ -0,0 +1,84 @@ +#define REPORT_WAIT_TIME_MINIMUM 600 +#define REPORT_WAIT_TIME_MAXIMUM 1500 + +PROCESSING_SUBSYSTEM_DEF(station) + name = "Station" + init_order = INIT_ORDER_STATION + flags = SS_BACKGROUND + runlevels = RUNLEVEL_GAME + wait = 5 SECONDS + + ///A list of currently active station traits + var/list/station_traits + ///Assoc list of trait type || assoc list of traits with weighted value. Used for picking traits from a specific category. + var/list/selectable_traits_by_types + ///Currently active announcer. Starts as a type but gets initialized after traits are selected + var/datum/centcom_announcer/announcer = /datum/centcom_announcer/default + +/datum/controller/subsystem/processing/station/Initialize(timeofday) + + station_traits = list() + selectable_traits_by_types = list(STATION_TRAIT_POSITIVE = list(), STATION_TRAIT_NEUTRAL = list(), STATION_TRAIT_NEGATIVE = list()) + + //If doing unit tests we don't do none of that trait shit ya know? + #ifndef UNIT_TESTS + if(CONFIG_GET(flag/station_traits)) + SetupTraits() + PrepareReport() + #endif + + announcer = new announcer() //Initialize the station's announcer datum + + return ..() + +///Rolls for the amount of traits and adds them to the traits list +/datum/controller/subsystem/processing/station/proc/SetupTraits() + for(var/i in subtypesof(/datum/station_trait)) + var/datum/station_trait/trait_typepath = i + if(initial(trait_typepath.trait_flags) & STATION_TRAIT_ABSTRACT) + continue //Dont add abstract ones to it + selectable_traits_by_types[initial(trait_typepath.trait_type)][trait_typepath] = initial(trait_typepath.weight) + + var/positive_trait_count = pick(20;0, 5;1, 1;2) + var/neutral_trait_count = pick(10;0, 10;1, 3;2) + var/negative_trait_count = pick(20;0, 5;1, 1;2) + + pick_traits(STATION_TRAIT_POSITIVE, positive_trait_count) + pick_traits(STATION_TRAIT_NEUTRAL, neutral_trait_count) + pick_traits(STATION_TRAIT_NEGATIVE, negative_trait_count) + + +///Picks traits of a specific category (e.g. bad or good) and a specified amount, then initializes them and adds them to the list of traits. +/datum/controller/subsystem/processing/station/proc/pick_traits(trait_type, amount) + if(!amount) + return + for(var/iterator in 1 to amount) + var/datum/station_trait/picked_trait = pickweight(selectable_traits_by_types[trait_type]) //Rolls from the table for the specific trait type + if(!picked_trait) + return + picked_trait = new picked_trait() + station_traits += picked_trait + selectable_traits_by_types[picked_trait.trait_type] -= picked_trait.type //We don't want it to roll trait twice + if(!picked_trait.blacklist) + continue + for(var/i in picked_trait.blacklist) + var/datum/station_trait/trait_to_remove = i + selectable_traits_by_types[initial(trait_to_remove.trait_type)] -= trait_to_remove + +/datum/controller/subsystem/processing/station/proc/PrepareReport() + if(!station_traits.len) //no active traits why bother + return + + var/report = "Central Command Divergency Report
" + + for(var/datum/station_trait/trait as() in station_traits) + if(trait.trait_flags & STATION_TRAIT_ABSTRACT) + continue + if(!trait.report_message || !trait.show_in_report) + continue + report += "[trait.get_report()]

" + + addtimer(CALLBACK(GLOBAL_PROC, .proc/print_command_report, report, "Central Command Divergency Report", FALSE), rand(REPORT_WAIT_TIME_MINIMUM, REPORT_WAIT_TIME_MAXIMUM)) + +#undef REPORT_WAIT_TIME_MINIMUM +#undef REPORT_WAIT_TIME_MAXIMUM diff --git a/code/controllers/subsystem/profiler.dm b/code/controllers/subsystem/profiler.dm index c9c8013fbc601..4c00a98df86a4 100644 --- a/code/controllers/subsystem/profiler.dm +++ b/code/controllers/subsystem/profiler.dm @@ -1,10 +1,23 @@ #define PROFILER_FILENAME "profiler.json" +#ifdef SENDMAPS_PROFILE +#define SENDMAPS_FILENAME "sendmaps.json" +GLOBAL_REAL_VAR(world_init_maptick_profiler) = world.Profile(PROFILE_RESTART, type = "sendmaps") +#endif + SUBSYSTEM_DEF(profiler) name = "Profiler" init_order = INIT_ORDER_PROFILER runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY - wait = 600 + wait = 3000 + flags = SS_NO_TICK_CHECK + var/fetch_cost = 0 + var/write_cost = 0 + +/datum/controller/subsystem/profiler/stat_entry(msg) + msg += "F:[round(fetch_cost,1)]ms" + msg += "|W:[round(write_cost,1)]ms" + ..(msg) /datum/controller/subsystem/profiler/Initialize() if(CONFIG_GET(flag/auto_profile)) @@ -20,19 +33,54 @@ SUBSYSTEM_DEF(profiler) /datum/controller/subsystem/profiler/Shutdown() if(CONFIG_GET(flag/auto_profile)) DumpFile() +#ifdef SENDMAPS_PROFILE + world.Profile(PROFILE_CLEAR, type = "sendmaps") +#endif return ..() /datum/controller/subsystem/profiler/proc/StartProfiling() world.Profile(PROFILE_START) +#ifdef SENDMAPS_PROFILE + world.Profile(PROFILE_START, type = "sendmaps") +#endif + /datum/controller/subsystem/profiler/proc/StopProfiling() world.Profile(PROFILE_STOP) +#ifdef SENDMAPS_PROFILE + world.Profile(PROFILE_STOP, type = "sendmaps") +#endif /datum/controller/subsystem/profiler/proc/DumpFile() - var/current_profile_data = world.Profile(PROFILE_REFRESH,format="json") +#if DM_BUILD < 1506 + 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") +#ifdef SENDMAPS_PROFILE + var/current_sendmaps_data = world.Profile(PROFILE_REFRESH, type = "sendmaps", format="json") +#endif + fetch_cost = MC_AVERAGE(fetch_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + CHECK_TICK + if(!length(current_profile_data)) //Would be nice to have explicit proc to check this stack_trace("Warning, profiling stopped manually before dump.") - var/json_file = file("[GLOB.log_directory]/[PROFILER_FILENAME]") - if(fexists(json_file)) - fdel(json_file) - WRITE_FILE(json_file, current_profile_data) + var/prof_file = file("[GLOB.log_directory]/[PROFILER_FILENAME]") + if(fexists(prof_file)) + fdel(prof_file) +#ifdef SENDMAPS_PROFILE + if(!length(current_sendmaps_data)) //Would be nice to have explicit proc to check this + stack_trace("Warning, sendmaps profiling stopped manually before dump.") + var/sendmaps_file = file("[GLOB.log_directory]/[SENDMAPS_FILENAME]") + if(fexists(sendmaps_file)) + fdel(sendmaps_file) +#endif + + timer = TICK_USAGE_REAL + WRITE_FILE(prof_file, current_profile_data) +#ifdef SENDMAPS_PROFILE + WRITE_FILE(sendmaps_file, current_sendmaps_data) +#endif + write_cost = MC_AVERAGE(write_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) +#endif diff --git a/code/controllers/subsystem/radiation.dm b/code/controllers/subsystem/radiation.dm index 2f7d27aca99f6..2d764d84ddb64 100644 --- a/code/controllers/subsystem/radiation.dm +++ b/code/controllers/subsystem/radiation.dm @@ -1,6 +1,7 @@ PROCESSING_SUBSYSTEM_DEF(radiation) name = "Radiation" flags = SS_NO_INIT | SS_BACKGROUND + wait = 1 SECONDS var/list/warned_atoms = list() diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 3263047ec1500..4b734ff6e0f9e 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -44,6 +44,15 @@ SUBSYSTEM_DEF(research) initialize_all_techweb_designs() initialize_all_techweb_nodes() science_tech = new /datum/techweb/science + //Some points to get you started. + //Points can be gained by + // 1) Exploration team going to ruins + // 2) Scientists using their shuttle to go to ruins + // 3) Giving miners a scanner + // 4) Scanning station pets + // 5) Using the experimentor on maint devices + // (probably more added since this comment was written.) + science_tech.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, 2500) admin_tech = new /datum/techweb/admin autosort_categories() error_design = new diff --git a/code/controllers/subsystem/runechat.dm b/code/controllers/subsystem/runechat.dm new file mode 100644 index 0000000000000..0bd75e326144d --- /dev/null +++ b/code/controllers/subsystem/runechat.dm @@ -0,0 +1,237 @@ +/// Controls how many buckets should be kept, each representing a tick. (30 seconds worth) +#define BUCKET_LEN (world.fps * 1 * 30) +/// Helper for getting the correct bucket for a given chatmessage +#define BUCKET_POS(scheduled_destruction) (((round((scheduled_destruction - SSrunechat.head_offset) / world.tick_lag) + 1) % BUCKET_LEN) || BUCKET_LEN) +/// Gets the maximum time at which messages will be handled in buckets, used for deferring to secondary queue +#define BUCKET_LIMIT (world.time + TICKS2DS(min(BUCKET_LEN - (SSrunechat.practical_offset - DS2TICKS(world.time - SSrunechat.head_offset)) - 1, BUCKET_LEN - 1))) +/** + * # Runechat Subsystem + * + * Maintains a timer-like system to handle destruction of runechat messages and balloon alerts. Much of this code is modeled + * after or adapted from the timer subsystem. + * + * Note that this has the same structure for storing and queueing messages as the timer subsystem does + * for handling timers: the bucket_list is a list of chatmessage datums, each of which are the head + * of a circularly linked list. Any given index in bucket_list could be null, representing an empty bucket. + */ +SUBSYSTEM_DEF(runechat) + name = "Runechat" + flags = SS_TICKER | SS_NO_INIT + wait = 1 + priority = FIRE_PRIORITY_RUNECHAT + + /// world.time of the first entry in the bucket list, effectively the 'start time' of the current buckets + var/head_offset = 0 + /// Index of the first non-empty bucket + var/practical_offset = 1 + /// world.tick_lag the bucket was designed for + var/bucket_resolution = 0 + /// How many messages are in the buckets + var/bucket_count = 0 + /// List of buckets, each bucket holds every message that has to be killed that byond tick + var/list/bucket_list = list() + /// Queue used for storing messages that are scheduled for deletion too far in the future for the buckets + var/list/datum/chatmessage/second_queue = list() + +/datum/controller/subsystem/runechat/PreInit() + bucket_list.len = BUCKET_LEN + head_offset = world.time + bucket_resolution = world.tick_lag + +/datum/controller/subsystem/runechat/stat_entry(msg) + . = ..("ActMsgs:[bucket_count] SecQueue:[length(second_queue)]") + +/datum/controller/subsystem/runechat/fire(resumed = FALSE) + // Store local references to datum vars as it is faster to access them this way + var/list/bucket_list = src.bucket_list + + if (MC_TICK_CHECK) + return + + // Check for when we need to loop the buckets, this occurs when + // the head_offset is approaching BUCKET_LEN ticks in the past + if (practical_offset > BUCKET_LEN) + head_offset += TICKS2DS(BUCKET_LEN) + practical_offset = 1 + resumed = FALSE + + // Check for when we have to reset buckets, typically from auto-reset + if ((length(bucket_list) != BUCKET_LEN) || (world.tick_lag != bucket_resolution)) + reset_buckets() + bucket_list = src.bucket_list + resumed = FALSE + + // Store a reference to the 'working' chatmessage so that we can resume if the MC + // has us stop mid-way through processing + var/static/datum/chatmessage/cm + if (!resumed) + cm = null + + // Iterate through each bucket starting from the practical offset + while (practical_offset <= BUCKET_LEN && head_offset + ((practical_offset - 1) * world.tick_lag) <= world.time) + var/datum/chatmessage/bucket_head = bucket_list[practical_offset] + if (!cm || !bucket_head || cm == bucket_head) + bucket_head = bucket_list[practical_offset] + cm = bucket_head + + while (cm) + // If the chatmessage hasn't yet had its life ended then do that now + var/datum/chatmessage/next = cm.next + if (!cm.eol_complete) + cm.end_of_life() + else if (!QDELETED(cm)) // otherwise if we haven't deleted it yet, do so (this is after EOL completion) + qdel(cm) + + if (MC_TICK_CHECK) + return + + // Break once we've processed the entire bucket + cm = next + if (cm == bucket_head) + break + + // Empty the bucket, check if anything in the secondary queue should be shifted to this bucket + bucket_list[practical_offset++] = null + var/i = 0 + for (i in 1 to length(second_queue)) + cm = second_queue[i] + if (cm.scheduled_destruction >= BUCKET_LIMIT) + i-- + break + + // Transfer the message into the bucket, performing necessary circular doubly-linked list operations + bucket_count++ + var/bucket_pos = max(1, BUCKET_POS(cm.scheduled_destruction)) + var/datum/timedevent/head = bucket_list[bucket_pos] + if (!head) + bucket_list[bucket_pos] = cm + cm.next = null + cm.prev = null + continue + + if (!head.prev) + head.prev = head + cm.next = head + cm.prev = head.prev + cm.next.prev = cm + cm.prev.next = cm + if (i) + second_queue.Cut(1, i + 1) + cm = null + +/datum/controller/subsystem/runechat/Recover() + bucket_list |= SSrunechat.bucket_list + second_queue |= SSrunechat.second_queue + +/datum/controller/subsystem/runechat/proc/reset_buckets() + bucket_list.len = BUCKET_LEN + head_offset = world.time + bucket_resolution = world.tick_lag + +/** + * Enters the runechat subsystem with this chatmessage, inserting it into the end-of-life queue + * + * This will also account for a chatmessage already being registered, and in which case + * the position will be updated to remove it from the previous location if necessary + * + * Arguments: + * * new_sched_destruction Optional, when provided is used to update an existing message with the new specified time + */ +/datum/chatmessage/proc/enter_subsystem(new_sched_destruction = 0) + // Get local references from subsystem as they are faster to access than the datum references + var/list/bucket_list = SSrunechat.bucket_list + var/list/second_queue = SSrunechat.second_queue + + // When necessary, de-list the chatmessage from its previous position + if (new_sched_destruction) + if (scheduled_destruction >= BUCKET_LIMIT) + second_queue -= src + else + SSrunechat.bucket_count-- + var/bucket_pos = BUCKET_POS(scheduled_destruction) + if (bucket_pos > 0) + var/datum/chatmessage/bucket_head = bucket_list[bucket_pos] + if (bucket_head == src) + bucket_list[bucket_pos] = next + if (prev != next) + prev.next = next + next.prev = prev + else + prev?.next = null + next?.prev = null + prev = next = null + scheduled_destruction = new_sched_destruction + + // Ensure the scheduled destruction time is properly bound to avoid missing a scheduled event + scheduled_destruction = max(CEILING(scheduled_destruction, world.tick_lag), world.time + world.tick_lag) + + // Handle insertion into the secondary queue if the required time is outside our tracked amounts + if (scheduled_destruction >= BUCKET_LIMIT) + BINARY_INSERT(src, SSrunechat.second_queue, /datum/chatmessage, src, scheduled_destruction, COMPARE_KEY) + return + + // Get bucket position and a local reference to the datum var, it's faster to access this way + var/bucket_pos = BUCKET_POS(scheduled_destruction) + + // Get the bucket head for that bucket, increment the bucket count + var/datum/chatmessage/bucket_head = bucket_list[bucket_pos] + SSrunechat.bucket_count++ + + // If there is no existing head of this bucket, we can set this message to be that head + if (!bucket_head) + bucket_list[bucket_pos] = src + return + + // Otherwise it's a simple insertion into the circularly doubly-linked list + if (!bucket_head.prev) + bucket_head.prev = bucket_head + next = bucket_head + prev = bucket_head.prev + next.prev = src + prev.next = src + + +/** + * Removes this chatmessage datum from the runechat subsystem + */ +/datum/chatmessage/proc/leave_subsystem() + // Attempt to find the bucket that contains this chat message + var/bucket_pos = BUCKET_POS(scheduled_destruction) + + // Get local references to the subsystem's vars, faster than accessing on the datum + var/list/bucket_list = SSrunechat.bucket_list + var/list/second_queue = SSrunechat.second_queue + + // Attempt to get the head of the bucket + var/datum/chatmessage/bucket_head + if (bucket_pos > 0) + bucket_head = bucket_list[bucket_pos] + + // Decrement the number of messages in buckets if the message is + // the head of the bucket, or has a SD less than BUCKET_LIMIT implying it fits + // into an existing bucket, or is otherwise not present in the secondary queue + if(bucket_head == src) + bucket_list[bucket_pos] = next + SSrunechat.bucket_count-- + else if(scheduled_destruction < BUCKET_LIMIT) + SSrunechat.bucket_count-- + else + var/l = length(second_queue) + second_queue -= src + if(l == length(second_queue)) + SSrunechat.bucket_count-- + + // Remove the message from the bucket, ensuring to maintain + // the integrity of the bucket's list if relevant + if(prev != next) + prev.next = next + next.prev = prev + else + prev?.next = null + next?.prev = null + prev = next = null + + +#undef BUCKET_LEN +#undef BUCKET_POS +#undef BUCKET_LIMIT diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 37f8f5b8aeb38..b5cf7f94dd791 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -26,6 +26,7 @@ SUBSYSTEM_DEF(shuttle) var/emergencyCallAmount = 0 //how many times the escape shuttle was called var/emergencyNoEscape var/emergencyNoRecall = FALSE + var/adminEmergencyNoRecall = FALSE var/list/hostileEnvironments = list() //Things blocking escape shuttle from leaving var/list/tradeBlockade = list() //Things blocking cargo from leaving. var/supplyBlocked = FALSE @@ -148,7 +149,7 @@ SUBSYSTEM_DEF(shuttle) message_admins(msg) log_game("[msg] Alive: [alive], Roundstart: [total], Threshold: [threshold]") emergencyNoRecall = TRUE - priority_announce("Catastrophic casualties detected: crisis shuttle protocols activated - jamming recall signals across all frequencies.") + priority_announce("Catastrophic casualties detected: crisis shuttle protocols activated - jamming recall signals across all frequencies.", sound = SSstation.announcer.get_rand_alert_sound()) if(emergency.timeLeft(1) > emergencyCallTime * 0.4) emergency.request(null, set_coefficient = 0.4) @@ -378,7 +379,7 @@ SUBSYSTEM_DEF(shuttle) emergency.setTimer(emergencyDockTime) priority_announce("Hostile environment resolved. \ You have 3 minutes to board the Emergency Shuttle.", - null, 'sound/ai/shuttledock.ogg', "Priority") + null, ANNOUNCER_SHUTTLEDOCK, "Priority") //try to move/request to dockHome if possible, otherwise dockAway. Mainly used for admin buttons /datum/controller/subsystem/shuttle/proc/toggleShuttle(shuttleId, dockHome, dockAway, timed) @@ -636,7 +637,7 @@ SUBSYSTEM_DEF(shuttle) hidden_shuttle_turf_images += add_images for(var/V in GLOB.navigation_computers) - var/obj/machinery/computer/camera_advanced/shuttle_docker/C = V + var/obj/machinery/computer/shuttle_flight/C = V C.update_hidden_docking_ports(remove_images, add_images) QDEL_LIST(remove_images) @@ -698,6 +699,8 @@ SUBSYSTEM_DEF(shuttle) preview_shuttle.register() + preview_shuttle.reset_air() + // TODO indicate to the user that success happened, rather than just // blanking the modification tab preview_shuttle = null @@ -760,6 +763,7 @@ SUBSYSTEM_DEF(shuttle) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "ShuttleManipulator") + ui.set_autoupdate(TRUE) ui.open() diff --git a/code/controllers/subsystem/sound.dm b/code/controllers/subsystem/sound.dm new file mode 100644 index 0000000000000..85855c3998f3e --- /dev/null +++ b/code/controllers/subsystem/sound.dm @@ -0,0 +1,127 @@ +/* + * Sound subsystem: + * Used for things that need constant updating (sound fading in / out) +*/ + +SUBSYSTEM_DEF(sound_effects) + name = "Sound" + wait = 1 + priority = FIRE_PRIORITY_AMBIENCE + flags = SS_NO_INIT + //Note: Make sure you update this if you use sound fading pre-game + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + + var/list/acting_effects = list() //key = sound, value = datum + var/list/currentrun = list() + +/datum/controller/subsystem/sound_effects/fire(resumed = 0) + if (!resumed) + src.currentrun = acting_effects.Copy() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + + while(LAZYLEN(currentrun)) + var/datum/sound_effect/sound_effect = currentrun[currentrun[currentrun.len]] + currentrun.len-- + + sound_effect.update_effect() + + if(world.time > sound_effect.end_tick) + sound_effect.end_effect() + acting_effects -= sound_effect.effect_id + + if (MC_TICK_CHECK) + return + +// ===== Sound effect procs ===== + +/proc/sound_fade(sound/S, start_volume = 100, end_volume = 0, time = 10, var/listeners) + //Check basics + if(!S) + CRASH("sound_fade called without a sound file.") + if(!listeners) + return + //Check in list format + var/listeners_list = listeners + if(!islist(listeners_list)) + listeners_list = list(listeners) + //Create datum + new /datum/sound_effect/fade(S, listeners_list, time, start_volume, end_volume) + +// ===== Sound effect datum ===== + +/datum/sound_effect + var/name = "null" + var/sound/sound + var/list/listeners + var/start_tick + var/end_tick + var/effect_id + +/datum/sound_effect/New(S, list/_listeners, time) + . = ..() + sound = S + listeners = _listeners + start_tick = world.time + end_tick = world.time + time + effect_id = generate_id() + start_sound() + +/datum/sound_effect/proc/generate_id() + var/id = "[name][sound.file]" + for(var/A in listeners) + id = "[id][REF(A)]" + return id + +/datum/sound_effect/proc/send_sound() + for(var/reciever in listeners) + SEND_SOUND(reciever, sound) + +/datum/sound_effect/proc/update_effect() + return //Not implemented + +/datum/sound_effect/proc/end_effect() + return //Not implemented + +// Send the sound to the person it's affecting and add it to the sound subsystem. +// Should be overridden to account for if an effect is already playing for that sound. +/datum/sound_effect/proc/start_sound() + send_sound() + SSsound_effects.acting_effects[effect_id] = src + +//============== Fade ============= + +/datum/sound_effect/fade + name = "fade" + var/in_vol + var/out_vol + //Calculated + var/current_vol + +/datum/sound_effect/fade/New(S, list/_listeners, time, start_vol, end_vol) + in_vol = start_vol + out_vol = end_vol + . = ..(S, _listeners, time) + +/datum/sound_effect/fade/start_sound() + //If the sound is already playing, make it fade from the current point + if(SSsound_effects.acting_effects[effect_id]) + var/datum/sound_effect/fade/old_sound = SSsound_effects.acting_effects[effect_id] + in_vol = old_sound.current_vol + else + send_sound() + SSsound_effects.acting_effects[effect_id] = src + +/datum/sound_effect/fade/update_effect() + var/time_multiplier = CLAMP((world.time - start_tick) / (end_tick - start_tick), 0, 1) + current_vol = (time_multiplier * out_vol) + ((1-time_multiplier) * in_vol) + sound.status = SOUND_UPDATE + sound.volume = current_vol + + for(var/reciever in listeners) + SEND_SOUND(reciever, sound) + +/datum/sound_effect/fade/end_effect() + if(!out_vol) + sound.repeat = FALSE diff --git a/code/controllers/subsystem/sound_loops.dm b/code/controllers/subsystem/sound_loops.dm new file mode 100644 index 0000000000000..46b916603f943 --- /dev/null +++ b/code/controllers/subsystem/sound_loops.dm @@ -0,0 +1,3 @@ +TIMER_SUBSYSTEM_DEF(sound_loops) + name = "Sound Loops" + priority = FIRE_PRIORITY_SOUND_LOOPS diff --git a/code/controllers/subsystem/sounds.dm b/code/controllers/subsystem/sounds.dm new file mode 100644 index 0000000000000..6095cf711405c --- /dev/null +++ b/code/controllers/subsystem/sounds.dm @@ -0,0 +1,135 @@ +#define DATUMLESS "NO_DATUM" + +SUBSYSTEM_DEF(sounds) + name = "Sound Channels" + flags = SS_NO_FIRE + init_order = INIT_ORDER_SOUNDS + var/static/using_channels_max = CHANNEL_HIGHEST_AVAILABLE //BYOND max channels + /// Amount of channels to reserve for random usage rather than reservations being allowed to reserve all channels. Also a nice safeguard for when someone screws up. + var/static/random_channels_min = 50 + + // 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 + /// Assoc list datum = list(channel1, channel2, ...) for what channels something reserved. + var/list/using_channels_by_datum + // Special datastructure for fast channel management + /// List of all channels as numbers + var/list/channel_list + /// Associative list of all reserved channels associated to their position. "[channel_number]" = index as number + var/list/reserved_channels + /// lower iteration position - Incremented and looped to get "random" sound channels for normal sounds. The channel at this index is returned when asking for a random channel. + var/channel_random_low + /// higher reserve position - decremented and incremented to reserve sound channels, anything above this is reserved. The channel at this index is the highest unreserved channel. + var/channel_reserve_high + +/datum/controller/subsystem/sounds/Initialize() + setup_available_channels() + return ..() + +/datum/controller/subsystem/sounds/proc/setup_available_channels() + channel_list = list() + reserved_channels = list() + using_channels = list() + using_channels_by_datum = list() + for(var/i in 1 to using_channels_max) + channel_list += i + channel_random_low = 1 + channel_reserve_high = length(channel_list) + +/// Removes a channel from using list. +/datum/controller/subsystem/sounds/proc/free_sound_channel(channel) + var/text_channel = num2text(channel) + var/using = using_channels[text_channel] + using_channels -= text_channel + if(using != TRUE) // datum channel + using_channels_by_datum[using] -= channel + if(!length(using_channels_by_datum[using])) + using_channels_by_datum -= using + free_channel(channel) + +/// 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 -= num2text(channel) + free_channel(channel) + 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() + . = reserve_channel() + if(!.) //oh no.. + return FALSE + var/text_channel = num2text(.) + using_channels[text_channel] = DATUMLESS + LAZYINITLIST(using_channels_by_datum[DATUMLESS]) + using_channels_by_datum[DATUMLESS] += . + +/// 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.") + .= reserve_channel() + if(!.) + return FALSE + var/text_channel = num2text(.) + using_channels[text_channel] = D + LAZYINITLIST(using_channels_by_datum[D]) + using_channels_by_datum[D] += . + +/** + * Reserves a channel and updates the datastructure. Private proc. + */ +/datum/controller/subsystem/sounds/proc/reserve_channel() + PRIVATE_PROC(TRUE) + if(channel_reserve_high <= random_channels_min) // out of channels + return + var/channel = channel_list[channel_reserve_high] + reserved_channels[num2text(channel)] = channel_reserve_high-- + return channel + +/** + * Frees a channel and updates the datastructure. Private proc. + */ +/datum/controller/subsystem/sounds/proc/free_channel(number) + PRIVATE_PROC(TRUE) + var/text_channel = num2text(number) + var/index = reserved_channels[text_channel] + if(!index) + CRASH("Attempted to (internally) free a channel that wasn't reserved.") + reserved_channels -= text_channel + // push reserve index up, which makes it now on a channel that is reserved + channel_reserve_high++ + // swap the reserved channel wtih the unreserved channel so the reserve index is now on an unoccupied channel and the freed channel is next to be used. + channel_list.Swap(channel_reserve_high, index) + // now, an existing reserved channel will likely (exception: unreserving last reserved channel) be at index + // get it, and update position. + var/text_reserved = num2text(channel_list[index]) + if(!reserved_channels[text_reserved]) //if it isn't already reserved make sure we don't accidently mistakenly put it on reserved list! + return + reserved_channels[text_reserved] = index + +/// Random available channel, returns text. +/datum/controller/subsystem/sounds/proc/random_available_channel_text() + if(channel_random_low > channel_reserve_high) + channel_random_low = 1 + . = "[channel_list[channel_random_low++]]" + +/// Random available channel, returns number +/datum/controller/subsystem/sounds/proc/random_available_channel() + if(channel_random_low > channel_reserve_high) + channel_random_low = 1 + . = channel_list[channel_random_low++] + +/// How many channels we have left. +/datum/controller/subsystem/sounds/proc/available_channels_left() + return length(channel_list) - random_channels_min + +#undef DATUMLESS \ No newline at end of file diff --git a/code/controllers/subsystem/spacedrift.dm b/code/controllers/subsystem/spacedrift.dm index c251492227ac4..327fc03bd5804 100644 --- a/code/controllers/subsystem/spacedrift.dm +++ b/code/controllers/subsystem/spacedrift.dm @@ -9,8 +9,13 @@ SUBSYSTEM_DEF(spacedrift) var/list/processing = list() /datum/controller/subsystem/spacedrift/stat_entry() - ..("P:[processing.len]") + . = ..("P:[processing.len]") +/datum/controller/subsystem/spacedrift/get_metrics() + . = ..() + var/list/cust = list() + cust["processing"] = length(processing) + .["custom"] = cust /datum/controller/subsystem/spacedrift/fire(resumed = 0) if (!resumed) diff --git a/code/controllers/subsystem/stat.dm b/code/controllers/subsystem/stat.dm new file mode 100644 index 0000000000000..6542b3c80e0de --- /dev/null +++ b/code/controllers/subsystem/stat.dm @@ -0,0 +1,155 @@ +#define FLAT_ICON_CACHE_MAX_SIZE 250 + +SUBSYSTEM_DEF(stat) + name = "Stat" + wait = 1 SECONDS + priority = FIRE_PRIORITY_STAT + runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME //RUNLEVEL_INIT doesn't work, so the stat panel will not auto update during this time (But that is good since we don't want to waste processing time during that phase). + init_order = INIT_ORDER_STAT + flags = SS_NO_INIT | SS_BACKGROUND + + var/list/flat_icon_cache = list() //Assoc list, datum = flat icon + + //The run of clients updating normally + var/list/currentrun = list() + //The run of clients updating alt clicked turfs + var/list/currentrun_listed = list() + //List of icon requests + var/list/icon_requests = list() + //List of people who need re-updating after icon requests are processed + var/list/currentrun_aftericon = list() + +/datum/controller/subsystem/stat/fire(resumed = 0) + if (!resumed) + src.currentrun = GLOB.clients.Copy() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + var/list/currentrun_listed = src.currentrun_listed + var/list/icon_requests = src.icon_requests + var/list/currentrun_aftericon = src.currentrun_aftericon + + while(currentrun.len) + var/client/C = currentrun[currentrun.len] + currentrun.len-- + + if (C) + var/mob/M = C.mob + if(M) + //Handle listed turfs seperately + if(sanitize(M.listed_turf?.name) == C.selected_stat_tab) + currentrun_listed += C + else + //Auto-update, not forced + M.UpdateMobStat(FALSE) + + if (MC_TICK_CHECK) + src.currentrun_listed = currentrun_listed + return + + if(MC_TICK_CHECK) + src.currentrun_listed = currentrun_listed + return + + //Handle clients on listed turfs as low priority, if they run over then we will give our processing time + //back to the people not on listed turfs (listed turfs is slightly more laggy) + while(currentrun_listed.len) + var/client/C = currentrun_listed[currentrun_listed.len] + currentrun_listed.len-- + + if (C) + var/mob/M = C.mob + if(M) + //Auto-update, not forced + M.UpdateMobStat(FALSE) + + if (MC_TICK_CHECK) + return + + if(MC_TICK_CHECK) + return + + //Process icon requests + while(icon_requests.len) + var/A_name = icon_requests[icon_requests.len] + var/datum/weakref/A_ref = icon_requests[A_name] + var/atom/A = A_ref.resolve() + var/directionless = TRUE + if(ispipewire(A)) + directionless = FALSE + icon_requests.len-- + + //Adding a new icon + //If the list gets too big just remove the first thing + if(flat_icon_cache.len > FLAT_ICON_CACHE_MAX_SIZE) + flat_icon_cache.Cut(1, 2) + //We are only going to apply overlays to mobs. + //Massively faster, getFlatIcon is a bit of a sucky proc. + flat_icon_cache[A_name] = icon2base64(getStillIcon(A, directionless)) + + if (MC_TICK_CHECK) + return + + //Process clients that just got an item and need to update now. + //Client list will empty if the system overruns, since they will get updated anyway. + if(MC_TICK_CHECK) + src.currentrun_aftericon = list() + return + + while(currentrun_aftericon.len) + var/client/C = currentrun_aftericon[currentrun_aftericon.len] + currentrun_aftericon.len-- + + if (C) + var/mob/M = C.mob + if(M) + //Auto-update, not forced + M.UpdateMobStat(FALSE) + + if (MC_TICK_CHECK) + src.currentrun_aftericon = list() + return + + if(MC_TICK_CHECK) + src.currentrun_aftericon = list() + return + +//Note: Doesn't account for decals on items. +//Whoever examins an item with a decal first, everyone else will see that items decals. +//Significantly reduces server lag though, like MASSIVELY! +/datum/controller/subsystem/stat/proc/get_flat_icon(client/requester, atom/A) + var/directionless = TRUE + if(ispipewire(A)) + directionless = FALSE + var/what_to_search = "[A.type][directionless ? 0 : A.dir][(istext(A.icon_state) && length(A.icon_state)) ? A.icon_state[1] : "*"]" + //Mobs are more important than items. + //Mob icons will change if their name changes, their type changes or their overlays change. + if(istype(A, /mob)) + var/mob/M = A + var/overlay_hash = "" + for(var/image/I as() in M.overlays) + if(istext(I.icon_state) && length(I.icon_state) >= 1) + overlay_hash = "[overlay_hash][I.icon_state[1]]" + else + overlay_hash = "[overlay_hash]*" //Just to make changes known when lengths change. Doesn't have to be accurate per-say. + what_to_search = "[M.type][M.name][overlay_hash]" + //Makes it shorter + var/thing = flat_icon_cache[what_to_search] + if(thing) + return thing + //Start queuing with the subsystem. + icon_requests["[what_to_search]"] = WEAKREF(A) + src.currentrun_aftericon |= requester + return null + +/datum/controller/subsystem/stat/proc/send_global_alert(title, message) + for(var/client/C in GLOB.clients) + if(C?.tgui_panel) + C.tgui_panel.give_alert_popup(title, message) + +/datum/controller/subsystem/stat/proc/clear_global_alert() + for(var/client/C in GLOB.clients) + if(C?.tgui_panel) + C.tgui_panel.clear_alert_popup() + +#undef FLAT_ICON_CACHE_MAX_SIZE diff --git a/code/controllers/subsystem/sun.dm b/code/controllers/subsystem/sun.dm index 7a3528cc3d9fc..5975f6faa7e6f 100644 --- a/code/controllers/subsystem/sun.dm +++ b/code/controllers/subsystem/sun.dm @@ -15,7 +15,7 @@ SUBSYSTEM_DEF(sun) rate = -rate /datum/controller/subsystem/sun/stat_entry(msg) - ..("P:[solars.len]") + . = ..("P:[solars.len]") /datum/controller/subsystem/sun/fire() angle = (360 + angle + rate * 6) % 360 // increase/decrease the angle to the sun, adjusted by the rate diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm index 3efdd1a20257c..572cf5c502ac4 100644 --- a/code/controllers/subsystem/tgui.dm +++ b/code/controllers/subsystem/tgui.dm @@ -29,8 +29,16 @@ SUBSYSTEM_DEF(tgui) /datum/controller/subsystem/tgui/Shutdown() close_all_uis() + +/datum/controller/subsystem/tgui/get_metrics() + . = ..() + var/list/cust = list() + cust["processing"] = length(open_uis) + .["custom"] = cust + + /datum/controller/subsystem/tgui/stat_entry() - ..("P:[open_uis.len]") + . = ..("P:[open_uis.len]") /datum/controller/subsystem/tgui/fire(resumed = 0) if(!resumed) @@ -42,7 +50,7 @@ SUBSYSTEM_DEF(tgui) current_run.len-- // TODO: Move user/src_object check to process() if(ui && ui.user && ui.src_object) - ui.process() + ui.process(wait * 0.1) else open_uis.Remove(ui) if(MC_TICK_CHECK) @@ -172,6 +180,18 @@ SUBSYSTEM_DEF(tgui) return ui return null +/** + * public + * + * Gets all open UIs on a src object + */ +/datum/controller/subsystem/tgui/proc/get_all_open_uis(datum/src_object) + var/key = "[REF(src_object)]" + // No UIs opened for this src_object + if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list)) + return list() + return open_uis_by_src[key] + /** * public * @@ -190,7 +210,7 @@ SUBSYSTEM_DEF(tgui) for(var/datum/tgui/ui in open_uis_by_src[key]) // Check if UI is valid. if(ui && ui.src_object && ui.user && ui.src_object.ui_host(ui.user)) - ui.process(force = 1) + ui.process(wait * 0.1, force = 1) count++ return count @@ -249,7 +269,7 @@ SUBSYSTEM_DEF(tgui) return count for(var/datum/tgui/ui in user.tgui_open_uis) if(isnull(src_object) || ui.src_object == src_object) - ui.process(force = 1) + ui.process(wait * 0.1, force = 1) count++ return count diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 76a4f332fda4d..d64c2e96a782d 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -12,8 +12,13 @@ SUBSYSTEM_DEF(throwing) var/list/processing = list() /datum/controller/subsystem/throwing/stat_entry() - ..("P:[processing.len]") + . = ..("P:[processing.len]") +/datum/controller/subsystem/throwing/get_metrics() + . = ..() + var/list/cust = list() + cust["processing"] = length(processing) + .["custom"] = cust /datum/controller/subsystem/throwing/fire(resumed = 0) if (!resumed) @@ -41,8 +46,8 @@ SUBSYSTEM_DEF(throwing) /datum/thrownthing var/atom/movable/thrownthing - var/atom/target var/turf/target_turf + var/datum/weakref/initial_target var/target_zone var/init_dir var/maxrange @@ -63,15 +68,43 @@ SUBSYSTEM_DEF(throwing) var/delayed_time = 0 var/last_move = 0 + +/datum/thrownthing/New(thrownthing, target, init_dir, maxrange, speed, thrower, diagonals_first, force, callback, target_zone) + . = ..() + src.thrownthing = thrownthing + RegisterSignal(thrownthing, COMSIG_PARENT_QDELETING, .proc/on_thrownthing_qdel) + src.target_turf = get_turf(target) + if(target_turf != target) + src.initial_target = WEAKREF(target) + src.init_dir = init_dir + src.maxrange = maxrange + src.speed = speed + src.thrower = thrower + src.diagonals_first = diagonals_first + src.force = force + src.callback = callback + src.target_zone = target_zone + + /datum/thrownthing/Destroy() SSthrowing.processing -= thrownthing + SSthrowing.currentrun -= thrownthing thrownthing.throwing = null thrownthing = null - target = null thrower = null - callback = null + initial_target = null + if(callback) + QDEL_NULL(callback) //It stores a reference to the thrownthing, its source. Let's clean that. return ..() + +///Defines the datum behavior on the thrownthing's qdeletion event. +/datum/thrownthing/proc/on_thrownthing_qdel(atom/movable/source, force) + SIGNAL_HANDLER + + qdel(src) + + /datum/thrownthing/proc/tick() var/atom/movable/AM = thrownthing if (!isturf(AM.loc) || !AM.throwing) @@ -82,9 +115,15 @@ SUBSYSTEM_DEF(throwing) delayed_time += world.time - last_move return - if (dist_travelled && hitcheck()) //to catch sneaky things moving on our tile while we slept - finalize() - return + var/atom/movable/actual_target = initial_target?.resolve() + + if(dist_travelled) //to catch sneaky things moving on our tile while we slept + for(var/atom/movable/obstacle as anything in get_turf(thrownthing)) + if (obstacle == thrownthing || (obstacle == thrower && !ismob(thrownthing))) + continue + if (obstacle == actual_target || (obstacle.density && !(obstacle.flags_1 & ON_BORDER_1))) + finalize(TRUE, obstacle) + return var/atom/step @@ -111,14 +150,17 @@ SUBSYSTEM_DEF(throwing) finalize() return - AM.Move(step, get_dir(AM, step)) - - if (!AM.throwing) // we hit something during our move - finalize(hit = TRUE) + if(!AM.Move(step, get_dir(AM, step))) // we hit something during our move... + if(AM.throwing) // ...but finalize() wasn't called on Bump() because of a higher level definition that doesn't always call parent. + finalize() return dist_travelled++ + if(actual_target && !(actual_target.pass_flags & LETPASSTHROW) && actual_target.loc == AM.loc) // we crossed a movable with no density (e.g. a mouse or APC) we intend to hit anyway. + finalize(TRUE, actual_target) + return + if (dist_travelled > MAX_THROWING_DIST) finalize() return @@ -130,39 +172,36 @@ SUBSYSTEM_DEF(throwing) return thrownthing.throwing = null if (!hit) - for (var/thing in get_turf(thrownthing)) //looking for our target on the turf we land on. - var/atom/A = thing - if (A == target) + for (var/atom/movable/obstacle as anything in get_turf(thrownthing)) //looking for our target on the turf we land on. + if (obstacle == target) hit = TRUE - thrownthing.throw_impact(A, src) + thrownthing.throw_impact(obstacle, src) + if(QDELETED(thrownthing)) //throw_impact can delete things, such as glasses smashing + return //deletion should already be handled by on_thrownthing_qdel() break if (!hit) thrownthing.throw_impact(get_turf(thrownthing), src) // we haven't hit something yet and we still must, let's hit the ground. + if(QDELETED(thrownthing)) //throw_impact can delete things, such as glasses smashing + return //deletion should already be handled by on_thrownthing_qdel() thrownthing.newtonian_move(init_dir) else thrownthing.newtonian_move(init_dir) if(target) thrownthing.throw_impact(target, src) + if(QDELETED(thrownthing)) //throw_impact can delete things, such as glasses smashing + return //deletion should already be handled by on_thrownthing_qdel() if (callback) callback.Invoke() - + if(!thrownthing.zfalling) // I don't think you can zfall while thrown but hey, just in case. var/turf/T = get_turf(thrownthing) if(T && thrownthing.has_gravity(T)) T.zFall(thrownthing) - qdel(src) - -/datum/thrownthing/proc/hit_atom(atom/A) - finalize(hit=TRUE, target=A) + if(thrownthing) + SEND_SIGNAL(thrownthing, COMSIG_MOVABLE_THROW_LANDED, src) + thrownthing.movement_type &= ~THROWN -/datum/thrownthing/proc/hitcheck() - for (var/thing in get_turf(thrownthing)) - var/atom/movable/AM = thing - if (AM == thrownthing || (AM == thrower && !ismob(thrownthing))) - continue - if (AM.density && !(AM.pass_flags & LETPASSTHROW) && !(AM.flags_1 & ON_BORDER_1)) - finalize(hit=TRUE, target=AM) - return TRUE + qdel(src) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 7549f08982602..cfdd9e63c3480 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -45,6 +45,8 @@ SUBSYSTEM_DEF(ticker) var/maprotatechecked = 0 + var/list/datum/game_mode/runnable_modes //list of runnable gamemodes + var/news_report var/late_join_disabled @@ -57,6 +59,12 @@ SUBSYSTEM_DEF(ticker) var/mode_result = "undefined" var/end_state = "undefined" + //Gamemode setup + var/gamemode_hotswap_disabled = FALSE + var/pre_setup_completed = FALSE + var/fail_counter + var/emergency_start = FALSE + //Crew Objective stuff var/list/crewobjlist = list() var/list/crewobjjobs = list() @@ -113,7 +121,7 @@ SUBSYSTEM_DEF(ticker) continue music -= S - if(isemptylist(music)) + if(!length(music)) music = world.file2list(ROUND_START_MUSIC_LIST, "\n") login_music = pick(music) else @@ -187,6 +195,13 @@ SUBSYSTEM_DEF(ticker) send_tip_of_the_round() tipped = TRUE + if(timeLeft <= 300 && !pre_setup_completed) + //Setup gamemode maps 30 seconds before roundstart. + if(!pre_setup()) + fail_setup() + return + pre_setup_completed = TRUE + if(timeLeft <= 0) current_state = GAME_STATE_SETTING_UP Master.SetRunLevel(RUNLEVEL_SETUP) @@ -194,12 +209,19 @@ SUBSYSTEM_DEF(ticker) fire() if(GAME_STATE_SETTING_UP) + if(!pre_setup_completed) + if(!pre_setup()) + fail_setup() + return + else + message_admins("Pre-setup completed successfully, however was run late. Likely due to start-now or a bug.") + log_game("Pre-setup completed successfully, however was run late. Likely due to start-now or a bug.") + pre_setup_completed = TRUE + //Attempt normal setup if(!setup()) - //setup failed - current_state = GAME_STATE_STARTUP - start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10) - timeLeft = null - Master.SetRunLevel(RUNLEVEL_LOBBY) + fail_setup() + else + fail_counter = null if(GAME_STATE_PLAYING) mode.process(wait * 0.1) @@ -213,12 +235,35 @@ SUBSYSTEM_DEF(ticker) declare_completion(force_ending) Master.SetRunLevel(RUNLEVEL_POSTGAME) - -/datum/controller/subsystem/ticker/proc/setup() - message_admins("Setting up game.") - var/init_start = world.timeofday - //Create and announce mode - var/list/datum/game_mode/runnable_modes +//Reverts the game to the lobby +/datum/controller/subsystem/ticker/proc/fail_setup() + if(fail_counter >= 2) + log_game("Failed setting up [GLOB.master_mode] [fail_counter + 1] times, defaulting to extended.") + message_admins("Failed setting up [GLOB.master_mode] [fail_counter + 1] times, defaulting to extended.") + //This has failed enough, lets just get on with extended. + failsafe_pre_setup() + return + //Let's try this again. + fail_counter++ + current_state = GAME_STATE_STARTUP + start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 5) + timeLeft = null + Master.SetRunLevel(RUNLEVEL_LOBBY) + pre_setup_completed = FALSE + //Return to default mode + load_mode() + message_admins("Failed to setup. Failures: ([fail_counter] / 3).") + log_game("Setup failed.") + +//Fallback presetup that sets up extended. +/datum/controller/subsystem/ticker/proc/failsafe_pre_setup() + //Emergerncy start extended. + emergency_start = TRUE + pre_setup_completed = TRUE + mode = config.pick_mode("extended") + +//Select gamemode and load any maps associated with it +/datum/controller/subsystem/ticker/proc/pre_setup() if(GLOB.master_mode == "random" || GLOB.master_mode == "secret") runnable_modes = config.get_runnable_modes() @@ -234,7 +279,7 @@ SUBSYSTEM_DEF(ticker) if(!mode) if(!runnable_modes.len) to_chat(world, "Unable to choose playable game mode. Reverting to pre-game lobby.") - return 0 + return FALSE mode = pickweight(runnable_modes) if(!mode) //too few roundtypes all run too recently mode = pick(runnable_modes) @@ -246,24 +291,30 @@ SUBSYSTEM_DEF(ticker) qdel(mode) mode = null SSjob.ResetOccupations() - return 0 + return FALSE + + return mode.setup_maps() + +/datum/controller/subsystem/ticker/proc/setup() + message_admins("Setting up game.") + var/init_start = world.timeofday CHECK_TICK //Configure mode and assign player to special mode stuff var/can_continue = 0 can_continue = src.mode.pre_setup() //Choose antagonists CHECK_TICK - can_continue = can_continue && SSjob.DivideOccupations() //Distribute jobs + can_continue = can_continue && SSjob.DivideOccupations(mode.required_jobs) //Distribute jobs CHECK_TICK to_chat(world, "Starting game...") - if(!GLOB.Debug2) + if(!GLOB.Debug2 && !emergency_start) if(!can_continue) log_game("[mode.name] failed pre_setup, cause: [mode.setup_error]") QDEL_NULL(mode) to_chat(world, "Error setting up [GLOB.master_mode]. Reverting to pre-game lobby.") SSjob.ResetOccupations() - return 0 + return FALSE else message_admins("DEBUG: Bypassing prestart checks...") @@ -300,7 +351,7 @@ SUBSYSTEM_DEF(ticker) SSdbcore.SetRoundStart() to_chat(world, "Welcome to [station_name()], enjoy your stay!") - SEND_SOUND(world, sound('sound/ai/welcome.ogg')) + SEND_SOUND(world, sound(SSstation.announcer.get_rand_welcome_sound())) current_state = GAME_STATE_PLAYING Master.SetRunLevel(RUNLEVEL_GAME) @@ -311,7 +362,11 @@ SUBSYSTEM_DEF(ticker) var/datum/holiday/holiday = SSevents.holidays[holidayname] to_chat(world, "

[holiday.greet()]

") + //Setup orbits. + SSorbits.post_load_init() + PostSetup() + SSstat.clear_global_alert() return TRUE @@ -323,7 +378,7 @@ SUBSYSTEM_DEF(ticker) var/list/adm = get_admin_counts() var/list/allmins = adm["present"] - send2irc("Server", "Round [GLOB.round_id ? "#[GLOB.round_id]:" : "of"] [hide_mode ? "secret":"[mode.name]"] has started[allmins.len ? ".":" with no active admins online!"]") + send2tgs("Server", "Round [GLOB.round_id ? "#[GLOB.round_id]:" : "of"] [hide_mode ? "secret":"[mode.name]"] has started[allmins.len ? ".":" with no active admins online!"]") setup_done = TRUE for(var/i in GLOB.start_landmarks_list) @@ -350,10 +405,11 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/proc/station_explosion_detonation(atom/bomb) if(bomb) //BOOM - var/turf/epi = bomb.loc qdel(bomb) - if(epi) - explosion(epi, 0, 256, 512, 0, TRUE, TRUE, 0, TRUE) + for(var/mob/M in GLOB.mob_list) + var/turf/T = get_turf(M) + if(T && is_station_level(T.z) && !istype(M.loc, /obj/structure/closet/secure_closet/freezer)) //protip: freezers protect you from nukes + M.gib(TRUE) /datum/controller/subsystem/ticker/proc/create_characters() for(var/mob/dead/new_player/player in GLOB.player_list) @@ -372,22 +428,43 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/proc/equip_characters() - var/captainless=1 + var/captainless = TRUE + var/list/spare_id_candidates = list() + var/highest_rank = length(SSjob.chain_of_command) + 1 + var/enforce_coc = CONFIG_GET(flag/spare_enforce_coc) + 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) if(player.mind.assigned_role == "Captain") - captainless=0 + captainless = FALSE + spare_id_candidates += N + else if(captainless && (player.mind.assigned_role in GLOB.command_positions) && !(is_banned_from(N.ckey, "Captain"))) + if(!enforce_coc) + spare_id_candidates += N + else + var/spare_id_priority = SSjob.chain_of_command[player.mind.assigned_role] + if(spare_id_priority) + if(spare_id_priority < highest_rank) + spare_id_candidates.Cut() + spare_id_candidates += N + highest_rank = spare_id_priority + else if(spare_id_priority == highest_rank) + spare_id_candidates += N if(player.mind.assigned_role != player.mind.special_role) - SSjob.EquipRank(N, player.mind.assigned_role, 0) + SSjob.EquipRank(N, player.mind.assigned_role, FALSE) if(CONFIG_GET(flag/roundstart_traits) && ishuman(N.new_character)) SSquirks.AssignQuirks(N.new_character, N.client, TRUE) CHECK_TICK - if(captainless) - for(var/mob/dead/new_player/N in GLOB.player_list) - if(N.new_character) - to_chat(N, "Captainship not forced on anyone.") - CHECK_TICK + if(length(spare_id_candidates)) //No captain, time to choose acting captain + if(!enforce_coc) + for(var/mob/dead/new_player/player in spare_id_candidates) + SSjob.promote_to_captain(player, captainless) + + else + SSjob.promote_to_captain(pick(spare_id_candidates), captainless) //This is just in case 2 heads of the same priority spawn + CHECK_TICK + /datum/controller/subsystem/ticker/proc/transfer_characters() var/list/livings = list() @@ -397,7 +474,7 @@ SUBSYSTEM_DEF(ticker) qdel(player) living.notransform = TRUE if(living.client) - var/obj/screen/splash/S = new(living.client, TRUE) + var/atom/movable/screen/splash/S = new(living.client, TRUE) S.Fade(TRUE) livings += living if(livings.len) @@ -551,7 +628,7 @@ SUBSYSTEM_DEF(ticker) if(WIZARD_KILLED) news_message = "Tensions have flared with the Space Wizard Federation following the death of one of their members aboard [station_name()]." if(STATION_NUKED) - news_message = "[station_name()] activated its self destruct device for unknown reasons. Attempts to clone the Captain so he can be arrested and executed are underway." + news_message = "[station_name()] activated its self-destruct device for unknown reasons. Attempts to clone the Captain so he can be arrested and executed are underway." if(CLOCK_SUMMON) news_message = "The garbled messages about hailing a mouse and strange energy readings from [station_name()] have been discovered to be an ill-advised, if thorough, prank by a clown." if(CLOCK_SILICONS) @@ -562,7 +639,7 @@ SUBSYSTEM_DEF(ticker) news_message = "During routine evacuation procedures, the emergency shuttle of [station_name()] had its navigation protocols corrupted and went off course, but was recovered shortly after." if(news_message) - send2otherserver(news_source, news_message,"News_Report") + SStopic.crosscomms_send("news_report", news_message, news_source) /datum/controller/subsystem/ticker/proc/GetTimeLeft() if(isnull(SSticker.timeLeft)) @@ -583,17 +660,17 @@ SUBSYSTEM_DEF(ticker) addtimer(CALLBACK(player, /mob/dead/new_player.proc/make_me_an_observer), 1) /datum/controller/subsystem/ticker/proc/load_mode() - var/mode = trim(rustg_file_read("data/mode.txt")) + var/mode = CONFIG_GET(string/master_mode) if(mode) GLOB.master_mode = mode else GLOB.master_mode = "extended" - log_game("Saved mode is '[GLOB.master_mode]'") + log_game("Master mode is '[GLOB.master_mode]'") + log_config("Master mode is '[GLOB.master_mode]'") -/datum/controller/subsystem/ticker/proc/save_mode(the_mode) - var/F = file("data/mode.txt") - fdel(F) - WRITE_FILE(F, the_mode) +/// Returns if either the master mode or the forced secret ruleset matches the mode name. +/datum/controller/subsystem/ticker/proc/is_mode(mode_name) + return GLOB.master_mode == mode_name || GLOB.secret_force_mode == mode_name /datum/controller/subsystem/ticker/proc/SetRoundEndSound(the_sound) set waitfor = FALSE diff --git a/code/controllers/subsystem/time_track.dm b/code/controllers/subsystem/time_track.dm index 3b19ae31cdf6d..44dd26affe1da 100644 --- a/code/controllers/subsystem/time_track.dm +++ b/code/controllers/subsystem/time_track.dm @@ -1,7 +1,8 @@ SUBSYSTEM_DEF(time_track) name = "Time Tracking" - wait = 600 - flags = SS_NO_INIT|SS_NO_TICK_CHECK + wait = 100 + flags = SS_NO_TICK_CHECK + init_order = INIT_ORDER_TIMETRACK runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT var/time_dilation_current = 0 @@ -15,6 +16,74 @@ SUBSYSTEM_DEF(time_track) var/last_tick_realtime = 0 var/last_tick_byond_time = 0 var/last_tick_tickcount = 0 +#ifdef SENDMAPS_PROFILE + var/list/sendmaps_names_map = list( + "SendMaps" = "send_maps", + "SendMaps: Initial housekeeping" = "initial_house", + "SendMaps: Cleanup" = "cleanup", + "SendMaps: Client loop" = "client_loop", + "SendMaps: Per client" = "per_client", + "SendMaps: Per client: Deleted images" = "deleted_images", + "SendMaps: Per client: HUD update" = "hud_update", + "SendMaps: Per client: Statpanel update" = "statpanel_update", + "SendMaps: Per client: Map data" = "map_data", + "SendMaps: Per client: Map data: Check eye position" = "check_eye_pos", + "SendMaps: Per client: Map data: Update chunks" = "update_chunks", + "SendMaps: Per client: Map data: Send turfmap updates" = "turfmap_updates", + "SendMaps: Per client: Map data: Send changed turfs" = "changed_turfs", + "SendMaps: Per client: Map data: Send turf chunk info" = "turf_chunk_info", + "SendMaps: Per client: Map data: Send obj changes" = "obj_changes", + "SendMaps: Per client: Map data: Send mob changes" = "mob_changes", + "SendMaps: Per client: Map data: Send notable turf visual contents" = "send_turf_vis_conts", + "SendMaps: Per client: Map data: Send pending animations" = "pending_animations", + "SendMaps: Per client: Map data: Look for movable changes" = "look_for_movable_changes", + "SendMaps: Per client: Map data: Look for movable changes: Check notable turf visual contents" = "check_turf_vis_conts", + "SendMaps: Per client: Map data: Look for movable changes: Check HUD/image visual contents" = "check_hud/image_vis_contents", + "SendMaps: Per client: Map data: Look for movable changes: Loop through turfs in range" = "turfs_in_range", + "SendMaps: Per client: Map data: Look for movable changes: Movables examined" = "movables_examined", + ) +#endif + +/datum/controller/subsystem/time_track/Initialize(start_timeofday) + . = ..() + GLOB.perf_log = "[GLOB.log_directory]/perf-[GLOB.round_id ? GLOB.round_id : "NULL"]-[SSmapping.config?.map_name].csv" +#ifdef SENDMAPS_PROFILE + world.Profile(PROFILE_RESTART, type = "sendmaps") + //Need to do the sendmaps stuff in its own file, since it works different then everything else + var/list/sendmaps_shorthands = list() + for(var/proper_name in sendmaps_names_map) + sendmaps_shorthands += sendmaps_names_map[proper_name] + sendmaps_shorthands += "[sendmaps_names_map[proper_name]]_count" +#endif + log_perf( + list( + "time", + "players", + "tidi", + "tidi_fastavg", + "tidi_avg", + "tidi_slowavg", + "maptick", + "num_timers", + "air_turf_cost", + "air_eg_cost", + "air_highpressure_cost", + "air_hotspots_cost", + "air_superconductivity_cost", + "air_pipenets_cost", + "air_rebuilds_cost", + "air_turf_count", + "air_eg_count", + "air_hotspot_count", + "air_network_count", + "air_delta_count", + "air_superconductive_count" +#ifdef SENDMAPS_PROFILE + ) + sendmaps_shorthands +#else + ) +#endif + ) /datum/controller/subsystem/time_track/fire() @@ -35,4 +104,57 @@ SUBSYSTEM_DEF(time_track) last_tick_realtime = current_realtime last_tick_byond_time = current_byondtime last_tick_tickcount = current_tickcount + +#ifdef SENDMAPS_PROFILE + var/sendmaps_json = world.Profile(PROFILE_REFRESH, type = "sendmaps", format="json") + var/list/send_maps_data = json_decode(sendmaps_json) + var/send_maps_sort = send_maps_data.Copy() //Doing it like this guarentees us a properly sorted list + + for(var/list/packet in send_maps_data) + send_maps_sort[packet["name"]] = packet + + var/list/send_maps_values = list() + for(var/list/packet in send_maps_sort) + send_maps_values += packet["value"] + send_maps_values += packet["calls"] +#endif + SSblackbox.record_feedback("associative", "time_dilation_current", 1, list("[SQLtime()]" = list("current" = "[time_dilation_current]", "avg_fast" = "[time_dilation_avg_fast]", "avg" = "[time_dilation_avg]", "avg_slow" = "[time_dilation_avg_slow]"))) + log_perf( + list( + world.time, + length(GLOB.clients), + time_dilation_current, + time_dilation_avg_fast, + time_dilation_avg, + time_dilation_avg_slow, + MAPTICK_LAST_INTERNAL_TICK_USAGE, + length(SStimer.timer_id_dict), + SSair.cost_turfs, + SSair.cost_groups, + SSair.cost_highpressure, + SSair.cost_hotspots, + SSair.cost_superconductivity, + SSair.cost_pipenets, + SSair.cost_rebuilds, + length(SSair.hotspots), + length(SSair.networks), + length(SSair.high_pressure_delta), +#ifdef SENDMAPS_PROFILE + ) + send_maps_values +#else + ) +#endif + ) + +#ifdef SENDMAPS_PROFILE +/datum/controller/subsystem/time_track/proc/scream_maptick_data() + var/current_profile_data = world.Profile(PROFILE_REFRESH, type = "sendmaps", format="json") + log_world(current_profile_data) + current_profile_data = json_decode(current_profile_data) + var/output = "" + for(var/list/entry in current_profile_data) + output += "[entry["name"]],[entry["value"]],[entry["calls"]]\n" + log_world(output) + return output +#endif diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index a271e5f5428d0..2c8a1cba37ce7 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -1,52 +1,81 @@ -#define BUCKET_LEN (world.fps*1*60) //how many ticks should we keep in the bucket. (1 minutes worth) -#define BUCKET_POS(timer) (((round((timer.timeToRun - SStimer.head_offset) / world.tick_lag)+1) % BUCKET_LEN)||BUCKET_LEN) -#define TIMER_MAX (world.time + TICKS2DS(min(BUCKET_LEN-(SStimer.practical_offset-DS2TICKS(world.time - SStimer.head_offset))-1, BUCKET_LEN-1))) -#define TIMER_ID_MAX (2**24) //max float with integer precision - +/// Controls how many buckets should be kept, each representing a tick. (1 minutes worth) +#define BUCKET_LEN (world.fps*1*60) +/// Helper for getting the correct bucket for a given timer +#define BUCKET_POS(timer) (((round((timer.timeToRun - timer.timer_subsystem.head_offset) / world.tick_lag)+1) % BUCKET_LEN)||BUCKET_LEN) +/// Gets the maximum time at which timers will be invoked from buckets, used for deferring to secondary queue +#define TIMER_MAX(timer_ss) (world.time + TICKS2DS(min(BUCKET_LEN-(timer_ss.practical_offset-DS2TICKS(world.time - timer_ss.head_offset))-1, BUCKET_LEN-1))) +/// Max float with integer precision +#define TIMER_ID_MAX (2**24) + +/** + * # Timer Subsystem + * + * Handles creation, callbacks, and destruction of timed events. + * + * It is important to understand the 'buckets' used in the timer subsystem are really a timed event. Each bucket is a + * circular doubly-linked list wherein the timed event at position n in the bucket list is a single timed event + * in that bucket's circular list; this can be considered the entry point to that list. + */ SUBSYSTEM_DEF(timer) name = "Timer" - wait = 1 //SS_TICKER subsystem, so wait is in ticks + wait = 1 // SS_TICKER subsystem, so wait is in ticks init_order = INIT_ORDER_TIMER flags = SS_TICKER|SS_NO_INIT var/list/datum/timedevent/second_queue = list() //awe, yes, you've had first queue, but what about second queue? var/list/hashes = list() - - var/head_offset = 0 //world.time of the first entry in the the bucket. - var/practical_offset = 1 //index of the first non-empty item in the bucket. - var/bucket_resolution = 0 //world.tick_lag the bucket was designed for - var/bucket_count = 0 //how many timers are in the buckets - - var/list/bucket_list = list() //list of buckets, each bucket holds every timer that has to run that byond tick. - - var/list/timer_id_dict = list() //list of all active timers assoicated to their timer id (for easy lookup) - - var/list/clienttime_timers = list() //special snowflake timers that run on fancy pansy "client time" - + /// world.time of the first entry in the bucket list, effectively the 'start time' of the current buckets + var/head_offset = 0 + /// Index of the first non-empty bucket + var/practical_offset = 1 + /// world.tick_lag the bucket was designed for + var/bucket_resolution = 0 + /// How many timers are in the buckets + var/bucket_count = 0 + /// List of buckets, each bucket holds every timer that has to run that byond tick + var/list/bucket_list = list() + /// List of all active timers associated to their timer ID (for easy lookup) + var/list/timer_id_dict = list() + /// Special timers that run in real-time, not BYOND time; these are more expensive to run and maintain + var/list/clienttime_timers = list() + /// Contains the last time that a timer's callback was invoked, or the last tick the SS fired if no timers are being processed var/last_invoke_tick = 0 + /// Keeps track of the next index to work on for client timers + var/next_clienttime_timer_index = 0 + /// Contains the last time that a warning was issued for not invoking callbacks var/static/last_invoke_warning = 0 var/static/bucket_auto_reset = TRUE +/datum/controller/subsystem/timer/get_metrics() + . = ..() + var/list/cust = list() + cust["bucket_count"] = bucket_count + .["custom"] = cust + /datum/controller/subsystem/timer/PreInit() bucket_list.len = BUCKET_LEN head_offset = world.time bucket_resolution = world.tick_lag /datum/controller/subsystem/timer/stat_entry(msg) - ..("B:[bucket_count] P:[length(second_queue)] H:[length(hashes)] C:[length(clienttime_timers)] S:[length(timer_id_dict)]") + . = ..("B:[bucket_count] P:[length(second_queue)] H:[length(hashes)] C:[length(clienttime_timers)] S:[length(timer_id_dict)]") /datum/controller/subsystem/timer/fire(resumed = FALSE) + // Store local references to datum vars as it is faster to access them var/lit = last_invoke_tick - var/last_check = world.time - TICKS2DS(BUCKET_LEN*1.5) var/list/bucket_list = src.bucket_list + var/last_check = world.time - TICKS2DS(BUCKET_LEN * 1.5) + // If there are no timers being tracked, then consider now to be the last invoked time if(!bucket_count) last_invoke_tick = world.time + // Check that we have invoked a callback in the last 1.5 minutes of BYOND time, + // and throw a warning and reset buckets if this is true if(lit && lit < last_check && head_offset < last_check && last_invoke_warning < last_check) last_invoke_warning = world.time - var/msg = "No regular timers processed in the last [BUCKET_LEN*1.5] ticks[bucket_auto_reset ? ", resetting buckets" : ""]!" + var/msg = "No regular timers processed in the last [BUCKET_LEN * 1.5] ticks[bucket_auto_reset ? ", resetting buckets" : ""]!" message_admins(msg) WARNING(msg) if(bucket_auto_reset) @@ -59,7 +88,6 @@ SUBSYSTEM_DEF(timer) continue log_world("Active timers at index [i]:") - var/datum/timedevent/bucket_node = bucket_head var/anti_loop_check = 1000 do @@ -71,10 +99,11 @@ SUBSYSTEM_DEF(timer) for(var/I in second_queue) log_world(get_timer_debug_string(I)) - var/next_clienttime_timer_index = 0 - var/len = length(clienttime_timers) - - for (next_clienttime_timer_index in 1 to len) + // Process client-side timers + if (next_clienttime_timer_index) + clienttime_timers.Cut(1, next_clienttime_timer_index + 1) + next_clienttime_timer_index = 0 + for (next_clienttime_timer_index in 1 to length(clienttime_timers)) if (MC_TICK_CHECK) next_clienttime_timer_index-- break @@ -85,7 +114,6 @@ SUBSYSTEM_DEF(timer) var/datum/callback/callBack = ctime_timer.callBack if (!callBack) - clienttime_timers.Cut(next_clienttime_timer_index,next_clienttime_timer_index+1) CRASH("Invalid timer: [get_timer_debug_string(ctime_timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset], REALTIMEOFDAY: [REALTIMEOFDAY]") ctime_timer.spent = REALTIMEOFDAY @@ -94,19 +122,16 @@ 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) - + // Remove invoked client-time timers if (next_clienttime_timer_index) - clienttime_timers.Cut(1, next_clienttime_timer_index+1) - - if (MC_TICK_CHECK) - return + clienttime_timers.Cut(1, next_clienttime_timer_index + 1) + next_clienttime_timer_index = 0 - var/static/list/spent = list() - var/static/datum/timedevent/timer + var/static/list/invoked_timers = list() if (practical_offset > BUCKET_LEN) head_offset += TICKS2DS(BUCKET_LEN) practical_offset = 1 @@ -118,111 +143,67 @@ SUBSYSTEM_DEF(timer) resumed = FALSE - if (!resumed) - timer = null - - while (practical_offset <= BUCKET_LEN && head_offset + ((practical_offset-1)*world.tick_lag) <= world.time) - var/datum/timedevent/head = bucket_list[practical_offset] - if (!timer || !head || timer == head) - head = bucket_list[practical_offset] - timer = head - while (timer) + // Iterate through each bucket starting from the practical offset + while (practical_offset <= BUCKET_LEN && head_offset + ((practical_offset - 1) * world.tick_lag) <= world.time) + var/datum/timedevent/timer + while ((timer = bucket_list[practical_offset])) var/datum/callback/callBack = timer.callBack if (!callBack) - bucket_resolution = null //force bucket recreation - CRASH("Invalid timer: [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") + bucket_resolution = null // force bucket recreation + CRASH("Invalid timer: [get_timer_debug_string(timer)] world.time: [world.time], \ + head_offset: [head_offset], practical_offset: [practical_offset]") + + timer.bucketEject() //pop the timer off of the bucket list. + // Invoke callback if possible if (!timer.spent) - spent += timer timer.spent = world.time callBack.InvokeAsync() last_invoke_tick = world.time - if (MC_TICK_CHECK) - return - - timer = timer.next - if (timer == head) - break - - - bucket_list[practical_offset++] = null + if (timer.flags & TIMER_LOOP) // Prepare looping timers to re-enter the queue + timer.spent = 0 + timer.timeToRun = world.time + timer.wait + timer.bucketJoin() + else + qdel(timer) - //we freed up a bucket, lets see if anything in second_queue needs to be shifted to that bucket. - var/i = 0 - var/L = length(second_queue) - for (i in 1 to L) - timer = second_queue[i] - if (timer.timeToRun >= TIMER_MAX) - i-- + if (MC_TICK_CHECK) break - if (timer.timeToRun < head_offset) - bucket_resolution = null //force bucket recreation - stack_trace("[i] Invalid timer state: Timer in long run queue with a time to run less then head_offset. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") - - if (timer.callBack && !timer.spent) - timer.callBack.InvokeAsync() - spent += timer - bucket_count++ - else if(!QDELETED(timer)) - qdel(timer) - continue - - if (timer.timeToRun < head_offset + TICKS2DS(practical_offset-1)) - bucket_resolution = null //force bucket recreation - stack_trace("[i] Invalid timer state: Timer in long run queue that would require a backtrack to transfer to short run queue. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") - if (timer.callBack && !timer.spent) - timer.callBack.InvokeAsync() - spent += timer - bucket_count++ - else if(!QDELETED(timer)) - qdel(timer) - continue - - bucket_count++ - var/bucket_pos = max(1, BUCKET_POS(timer)) - - var/datum/timedevent/bucket_head = bucket_list[bucket_pos] - if (!bucket_head) - bucket_list[bucket_pos] = timer - timer.next = null - timer.prev = null - continue - - if (!bucket_head.prev) - bucket_head.prev = bucket_head - timer.next = bucket_head - timer.prev = bucket_head.prev - timer.next.prev = timer - timer.prev.next = timer - if (i) - second_queue.Cut(1, i+1) - - timer = null - - bucket_count -= length(spent) - - for (var/i in spent) - var/datum/timedevent/qtimer = i - if(QDELETED(qtimer)) - bucket_count++ - continue - if(!(qtimer.flags & TIMER_LOOP)) - qdel(qtimer) - else - bucket_count++ - qtimer.spent = 0 - qtimer.bucketEject() - if(qtimer.flags & TIMER_CLIENT_TIME) - qtimer.timeToRun = REALTIMEOFDAY + qtimer.wait - else - qtimer.timeToRun = world.time + qtimer.wait - qtimer.bucketJoin() - - spent.len = 0 + if (!bucket_list[practical_offset]) + // Empty the bucket, check if anything in the secondary queue should be shifted to this bucket + bucket_list[practical_offset++] = null + var/i = 0 + for (i in 1 to length(second_queue)) + timer = second_queue[i] + if (timer.timeToRun >= TIMER_MAX(src)) + i-- + break + + // Check for timers that are scheduled to run in the past + if (timer.timeToRun < head_offset) + bucket_resolution = null // force bucket recreation + stack_trace("[i] Invalid timer state: Timer in long run queue with a time to run less then head_offset. \ + [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") + break + + // Check for timers that are not capable of being scheduled to run without rebuilding buckets + if (timer.timeToRun < head_offset + TICKS2DS(practical_offset - 1)) + bucket_resolution = null // force bucket recreation + stack_trace("[i] Invalid timer state: Timer in long run queue that would require a backtrack to transfer to \ + short run queue. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") + break + + timer.bucketJoin() + if (i) + second_queue.Cut(1, i+1) + if (MC_TICK_CHECK) + break -//formated this way to be runtime resistant +/** + * Generates a string with details about the timed event for debugging purposes + */ /datum/controller/subsystem/timer/proc/get_timer_debug_string(datum/timedevent/TE) . = "Timer: [TE]" . += "Prev: [TE.prev ? TE.prev : "NULL"], Next: [TE.next ? TE.next : "NULL"]" @@ -233,12 +214,16 @@ SUBSYSTEM_DEF(timer) if(!TE.callBack) . += ", NO CALLBACK" +/** + * Destroys the existing buckets and creates new buckets from the existing timed events + */ /datum/controller/subsystem/timer/proc/reset_buckets() - var/list/bucket_list = src.bucket_list + var/list/bucket_list = src.bucket_list // Store local reference to datum var, this is faster var/list/alltimers = list() - //collect the timers currently in the bucket + + // Get all timers currently in the buckets for (var/bucket_head in bucket_list) - if (!bucket_head) + if (!bucket_head) // if bucket is empty for this tick continue var/datum/timedevent/bucket_node = bucket_head do @@ -246,25 +231,38 @@ SUBSYSTEM_DEF(timer) bucket_node = bucket_node.next while(bucket_node && bucket_node != bucket_head) + // Empty the list by zeroing and re-assigning the length bucket_list.len = 0 bucket_list.len = BUCKET_LEN + // Reset values for the subsystem to their initial values practical_offset = 1 bucket_count = 0 head_offset = world.time bucket_resolution = world.tick_lag + // Add all timed events from the secondary queue as well alltimers += second_queue + + // If there are no timers being tracked by the subsystem, + // there is no need to do any further rebuilding if (!length(alltimers)) return + // Sort all timers by time to run sortTim(alltimers, .proc/cmp_timer) + // Get the earliest timer, and if the TTR is earlier than the current world.time, + // then set the head offset appropriately to be the earliest time tracked by the + // current set of buckets var/datum/timedevent/head = alltimers[1] - if (head.timeToRun < head_offset) head_offset = head.timeToRun + // Iterate through each timed event and insert it into an appropriate bucket, + // up unto the point that we can no longer insert into buckets as the TTR + // is outside the range we are tracking, then insert the remainder into the + // secondary queue var/new_bucket_count var/i = 1 for (i in 1 to length(alltimers)) @@ -272,34 +270,37 @@ SUBSYSTEM_DEF(timer) if (!timer) continue - var/bucket_pos = BUCKET_POS(timer) - if (timer.timeToRun >= TIMER_MAX) + // Check that the TTR is within the range covered by buckets, when exceeded we've finished + if (timer.timeToRun >= TIMER_MAX(src)) i-- break - + // Check that timer has a valid callback and hasn't been invoked if (!timer.callBack || timer.spent) WARNING("Invalid timer: [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") if (timer.callBack) qdel(timer) continue + // Insert the timer into the bucket, and perform necessary circular doubly-linked list operations new_bucket_count++ + var/bucket_pos = BUCKET_POS(timer) var/datum/timedevent/bucket_head = bucket_list[bucket_pos] if (!bucket_head) bucket_list[bucket_pos] = timer timer.next = null timer.prev = null continue - if (!bucket_head.prev) bucket_head.prev = bucket_head timer.next = bucket_head timer.prev = bucket_head.prev timer.next.prev = timer timer.prev.next = timer + + // Cut the timers that are tracked by the buckets from the secondary queue if (i) - alltimers.Cut(1, i+1) + alltimers.Cut(1, i + 1) second_queue = alltimers bucket_count = new_bucket_count @@ -310,46 +311,68 @@ SUBSYSTEM_DEF(timer) timer_id_dict |= SStimer.timer_id_dict bucket_list |= SStimer.bucket_list +/** + * # Timed Event + * + * This is the actual timer, it contains the callback and necessary data to maintain + * the timer. + * + * See the documentation for the timer subsystem for an explanation of the buckets referenced + * below in next and prev + */ /datum/timedevent + /// ID used for timers when the TIMER_STOPPABLE flag is present var/id + /// The callback to invoke after the timer completes var/datum/callback/callBack + /// The time at which the callback should be invoked at var/timeToRun + /// The length of the timer var/wait + /// Unique hash generated when TIMER_UNIQUE flag is present var/hash + /// The source of the timedevent, whatever called addtimer + var/source + /// Flags associated with the timer, see _DEFINES/subsystems.dm var/list/flags - var/spent = 0 //time we ran the timer. - var/name //for easy debugging. - //cicular doublely linked list + /// Time at which the timer was invoked or destroyed + var/spent = 0 + /// An informative name generated for the timer, useful for bugging + var/name + /// Next timed event in the bucket var/datum/timedevent/next + /// Previous timed event in the bucket var/datum/timedevent/prev + /// The timer subsystem this event is associated with + var/datum/controller/subsystem/timer/timer_subsystem -/datum/timedevent/New(datum/callback/callBack, wait, flags, hash) +/datum/timedevent/New(datum/callback/callBack, wait, flags, datum/controller/subsystem/timer/timer_subsystem, hash, source) var/static/nextid = 1 id = TIMER_ID_NULL src.callBack = callBack src.wait = wait src.flags = flags src.hash = hash + src.source = source + src.timer_subsystem = timer_subsystem || SStimer - if (flags & TIMER_CLIENT_TIME) - timeToRun = REALTIMEOFDAY + wait - else - timeToRun = world.time + wait + // Determine time at which the timer's callback should be invoked + timeToRun = (flags & TIMER_CLIENT_TIME ? REALTIMEOFDAY : world.time) + wait + // Include the timer in the hash table if the timer is unique if (flags & TIMER_UNIQUE) - SStimer.hashes[hash] = src + timer_subsystem.hashes[hash] = src + // Generate ID for the timer if the timer is stoppable, include in the timer id dictionary if (flags & TIMER_STOPPABLE) id = num2text(nextid, 100) if (nextid >= SHORT_REAL_LIMIT) - nextid += min(1, 2**round(nextid/SHORT_REAL_LIMIT)) + nextid += min(1, 2 ** round(nextid / SHORT_REAL_LIMIT)) else nextid++ - SStimer.timer_id_dict[id] = src + timer_subsystem.timer_id_dict[id] = src - name = "Timer: [id] (\ref[src]), TTR: [timeToRun], Flags: [jointext(bitfield2list(flags, list("TIMER_UNIQUE", "TIMER_OVERRIDE", "TIMER_CLIENT_TIME", "TIMER_STOPPABLE", "TIMER_NO_HASH_WAIT", "TIMER_LOOP")), ", ")], callBack: \ref[callBack], callBack.object: [callBack.object]\ref[callBack.object]([getcallingtype()]), callBack.delegate:[callBack.delegate]([callBack.arguments ? callBack.arguments.Join(", ") : ""])" - - if ((timeToRun < world.time || timeToRun < SStimer.head_offset) && !(flags & TIMER_CLIENT_TIME)) + if ((timeToRun < world.time || timeToRun < timer_subsystem.head_offset) && !(flags & TIMER_CLIENT_TIME)) CRASH("Invalid timer state: Timer created that would require a backtrack to run (addtimer would never let this happen): [SStimer.get_timer_debug_string(src)]") if (callBack.object != GLOBAL_PROC && !QDESTROYING(callBack.object)) @@ -360,7 +383,7 @@ SUBSYSTEM_DEF(timer) /datum/timedevent/Destroy() ..() if (flags & TIMER_UNIQUE && hash) - SStimer.hashes -= hash + timer_subsystem.hashes -= hash if (callBack && callBack.object && callBack.object != GLOBAL_PROC && callBack.object.active_timers) callBack.object.active_timers -= src @@ -369,12 +392,12 @@ SUBSYSTEM_DEF(timer) callBack = null if (flags & TIMER_STOPPABLE) - SStimer.timer_id_dict -= id + timer_subsystem.timer_id_dict -= id if (flags & TIMER_CLIENT_TIME) if (!spent) spent = world.time - SStimer.clienttime_timers -= src + timer_subsystem.clienttime_timers -= src return QDEL_HINT_IWILLGC if (!spent) @@ -389,23 +412,39 @@ SUBSYSTEM_DEF(timer) prev = null return QDEL_HINT_IWILLGC +/** + * Removes this timed event from any relevant buckets, or the secondary queue + */ /datum/timedevent/proc/bucketEject() + // Attempt to find bucket that contains this timed event var/bucketpos = BUCKET_POS(src) - var/list/bucket_list = SStimer.bucket_list - var/list/second_queue = SStimer.second_queue + + // Store local references for the bucket list and secondary queue + // This is faster than referencing them from the datum itself + var/list/bucket_list = timer_subsystem.bucket_list + var/list/second_queue = timer_subsystem.second_queue + + // Attempt to get the head of the bucket var/datum/timedevent/buckethead if(bucketpos > 0) buckethead = bucket_list[bucketpos] + + // Decrement the number of timers in buckets if the timed event is + // the head of the bucket, or has a TTR less than TIMER_MAX implying it fits + // into an existing bucket, or is otherwise not present in the secondary queue if(buckethead == src) bucket_list[bucketpos] = next - SStimer.bucket_count-- - else if(timeToRun < TIMER_MAX || next || prev) - SStimer.bucket_count-- + timer_subsystem.bucket_count-- + else if(timeToRun < TIMER_MAX(timer_subsystem)) + timer_subsystem.bucket_count-- else var/l = length(second_queue) second_queue -= src if(l == length(second_queue)) - SStimer.bucket_count-- + timer_subsystem.bucket_count-- + + // Remove the timed event from the bucket, ensuring to maintain + // the integrity of the bucket's list if relevant if(prev != next) prev.next = next next.prev = prev @@ -414,32 +453,47 @@ SUBSYSTEM_DEF(timer) next?.prev = null prev = next = null +/** + * Attempts to add this timed event to a bucket, will enter the secondary queue + * if there are no appropriate buckets at this time. + * + * Secondary queueing of timed events will occur when the timespan covered by the existing + * buckets is exceeded by the time at which this timed event is scheduled to be invoked. + * If the timed event is tracking client time, it will be added to a special bucket. + */ /datum/timedevent/proc/bucketJoin() - var/list/L + // Generate debug-friendly name for timer + var/static/list/bitfield_flags = list("TIMER_UNIQUE", "TIMER_OVERRIDE", "TIMER_CLIENT_TIME", "TIMER_STOPPABLE", "TIMER_NO_HASH_WAIT", "TIMER_LOOP") + name = "Timer: [id] (\ref[src]), TTR: [timeToRun], wait:[wait] Flags: [jointext(bitfield2list(flags, bitfield_flags), ", ")], \ + callBack: \ref[callBack], callBack.object: [callBack.object]\ref[callBack.object]([getcallingtype()]), \ + callBack.delegate:[callBack.delegate]([callBack.arguments ? callBack.arguments.Join(", ") : ""]), source: [source]" + // Check if this timed event should be diverted to the client time bucket, or the secondary queue + var/list/L if (flags & TIMER_CLIENT_TIME) - L = SStimer.clienttime_timers - else if (timeToRun >= TIMER_MAX) - L = SStimer.second_queue - + L = timer_subsystem.clienttime_timers + else if (timeToRun >= TIMER_MAX(timer_subsystem)) + L = timer_subsystem.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 - var/list/bucket_list = SStimer.bucket_list + // Get a local reference to the bucket list, this is faster than referencing the datum + var/list/bucket_list = timer_subsystem.bucket_list - //calculate our place in the bucket list + // Find the correct bucket for this timed event var/bucket_pos = BUCKET_POS(src) - - //get the bucket for our tick var/datum/timedevent/bucket_head = bucket_list[bucket_pos] - SStimer.bucket_count++ - //empty bucket, we will just add ourselves + timer_subsystem.bucket_count++ + + // If there is no timed event at this position, then the bucket is 'empty' + // and we can just set this event to that position if (!bucket_head) bucket_list[bucket_pos] = src return - //other wise, lets do a simplified linked list add. + + // Otherwise, we merely add this timed event into the bucket, which is a + // circularly doubly-linked list if (!bucket_head.prev) bucket_head.prev = bucket_head next = bucket_head @@ -447,6 +501,9 @@ SUBSYSTEM_DEF(timer) next.prev = src prev.next = src +/** + * Returns a string of the type of the callback for this timer + */ /datum/timedevent/proc/getcallingtype() . = "ERROR" if (callBack.object == GLOBAL_PROC) @@ -454,8 +511,16 @@ SUBSYSTEM_DEF(timer) else . = "[callBack.object.type]" -/proc/addtimer(datum/callback/callback, wait = 0, flags = 0) - +/** + * Create a new timer and insert it in the queue. + * You should not call this directly, and should instead use the addtimer macro, which includes source information. + * + * Arguments: + * * callback the callback to call on timer finish + * * wait deciseconds to run the timer for + * * flags flags for this timer, see: code\__DEFINES\subsystems.dm + */ +/proc/_addtimer(datum/callback/callback, wait = 0, flags = 0, datum/controller/subsystem/timer/timer_subsystem, file, line) if (!callback) CRASH("addtimer called without a callback") @@ -470,8 +535,10 @@ SUBSYSTEM_DEF(timer) if(wait >= INFINITY) CRASH("Attempted to create timer with INFINITY delay") - var/hash + timer_subsystem = timer_subsystem || SStimer + // Generate hash if relevant for timed events with the TIMER_UNIQUE flag + var/hash if (flags & TIMER_UNIQUE) var/list/hashlist if(flags & TIMER_NO_HASH_WAIT) @@ -481,13 +548,13 @@ SUBSYSTEM_DEF(timer) hashlist += callback.arguments hash = hashlist.Join("|||||||") - var/datum/timedevent/hash_timer = SStimer.hashes[hash] + var/datum/timedevent/hash_timer = timer_subsystem.hashes[hash] if(hash_timer) - if (hash_timer.spent) //it's pending deletion, pretend it doesn't exist. - hash_timer.hash = null //but keep it from accidentally deleting us + if (hash_timer.spent) // it's pending deletion, pretend it doesn't exist. + hash_timer.hash = null // but keep it from accidentally deleting us else if (flags & TIMER_OVERRIDE) - hash_timer.hash = null //no need having it delete it's hash if we are going to replace it + hash_timer.hash = null // no need having it delete it's hash if we are going to replace it qdel(hash_timer) else if (hash_timer.flags & TIMER_STOPPABLE) @@ -496,10 +563,16 @@ SUBSYSTEM_DEF(timer) else if(flags & TIMER_OVERRIDE) stack_trace("TIMER_OVERRIDE used without TIMER_UNIQUE") - var/datum/timedevent/timer = new(callback, wait, flags, hash) + var/datum/timedevent/timer = new(callback, wait, flags, timer_subsystem, hash, file && "[file]:[line]") return timer.id -/proc/deltimer(id) +/** + * Delete a timer + * + * Arguments: + * * id a timerid or a /datum/timedevent + */ +/proc/deltimer(id, datum/controller/subsystem/timer/timer_subsystem) if (!id) return FALSE if (id == TIMER_ID_NULL) @@ -508,13 +581,34 @@ SUBSYSTEM_DEF(timer) if (istype(id, /datum/timedevent)) qdel(id) return TRUE + timer_subsystem = timer_subsystem || SStimer //id is string - var/datum/timedevent/timer = SStimer.timer_id_dict[id] + var/datum/timedevent/timer = timer_subsystem.timer_id_dict[id] if (timer && !timer.spent) qdel(timer) return TRUE return FALSE +/** + * Get the remaining deciseconds on a timer + * + * Arguments: + * * id a timerid or a /datum/timedevent + */ +/proc/timeleft(id, datum/controller/subsystem/timer/timer_subsystem) + if (!id) + return null + if (id == TIMER_ID_NULL) + CRASH("Tried to get timeleft of a null timerid. Use TIMER_STOPPABLE flag") + if (istype(id, /datum/timedevent)) + var/datum/timedevent/timer = id + return timer.timeToRun - world.time + timer_subsystem = timer_subsystem || SStimer + //id is string + var/datum/timedevent/timer = timer_subsystem.timer_id_dict[id] + if (timer && !timer.spent) + return timer.timeToRun - world.time + return null #undef BUCKET_LEN #undef BUCKET_POS diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm index a8fb5e8334705..6ff7db35a5019 100644 --- a/code/controllers/subsystem/title.dm +++ b/code/controllers/subsystem/title.dm @@ -23,7 +23,7 @@ SUBSYSTEM_DEF(title) if(length(provisional_title_screens)) file_path = "[global.config.directory]/title_screens/images/[pick(provisional_title_screens)]" else - file_path = "icons/default_title.dmi" + file_path = "icons/runtime/default_title.dmi" ASSERT(fexists(file_path)) @@ -50,7 +50,7 @@ SUBSYSTEM_DEF(title) for(var/thing in GLOB.clients) if(!thing) continue - var/obj/screen/splash/S = new(thing, FALSE) + var/atom/movable/screen/splash/S = new(thing, FALSE) S.Fade(FALSE,FALSE) /datum/controller/subsystem/title/Recover() diff --git a/code/controllers/subsystem/topic.dm b/code/controllers/subsystem/topic.dm new file mode 100644 index 0000000000000..6d168bd40a53d --- /dev/null +++ b/code/controllers/subsystem/topic.dm @@ -0,0 +1,128 @@ +SUBSYSTEM_DEF(topic) + name = "Topic" + init_order = INIT_ORDER_TOPIC + flags = SS_NO_FIRE + +/datum/controller/subsystem/topic/Initialize(timeofday) + // Initialize topic datums + var/list/anonymous_functions = list() + for(var/path in subtypesof(/datum/world_topic)) + var/datum/world_topic/T = new path() + if(T.anonymous) + anonymous_functions[T.key] = TRUE + GLOB.topic_commands[T.key] = T + + // Setup the anonymous access token + GLOB.topic_tokens["anonymous"] = anonymous_functions + // Parse and setup authed tokens from config + var/list/tokens = CONFIG_GET(keyed_list/comms_key) + for(var/token in tokens) + var/list/keys = list() + if(tokens[token] == "all") + for(var/key in GLOB.topic_commands) + keys[key] = TRUE + else + for(var/key in splittext(tokens[token], ",")) + keys[trim(key)] = TRUE + // Grant access to anonymous topic calls (version, authed functions etc.) by default + keys |= anonymous_functions + GLOB.topic_tokens[token] = keys + + var/list/servers = CONFIG_GET(keyed_list/cross_server) + for(var/server in servers) + handshake_server(server, servers[server]) + + return ..() + +/* + A bit of background for future coders maintaining this: + When we contact a server or we contact a server to handshake, there are two outcomes to account for: + + First, if the server being contacted has freshly rebooted, they will have no knowledge of us, + and as such will need to store our server details too by sending a handshake request back to us for information. + + Second, if we rebooted while the other server was mid-round, they simply can send back the current details they have about us, + and don't need to get any additional information of their own. + + Code for handling requests is in world_topic.dm + + Basically, this proc exists to allow servers to make ad-hoc connections, going offline and coming back up without interrupting anything. +*/ +/datum/controller/subsystem/topic/proc/handshake_server(addr, key) + set waitfor = FALSE + var/logging = CONFIG_GET(flag/log_world_topic) + var/request = list("query" = "api_do_handshake", "auth" = key, "source" = CONFIG_GET(string/cross_comms_name)) + var/response_raw = world.Export("[addr]?[json_encode(request)]") + request["auth"] = "***[copytext(request["auth"], -4)]" + if(!response_raw) + if(logging) + log_topic("Topic handshake with [addr] failed. Server did not return a response. Payload: \"[json_encode(request)]\"") + return + var/response = json_decode(response_raw) + if(response["statuscode"] != 200) + if(logging) + log_topic("Topic handshake with [addr] failed. Payload: \"[json_encode(request)]\", Response: \"[response_raw]\"") + return + var/list/local_funcs = GLOB.topic_tokens[LAZYACCESS(response["data"], "token")] + var/list/remote_funcs = LAZYACCESS(response["data"], "functions") + if(!local_funcs || !remote_funcs) + if(logging) + log_topic("Topic handshake with [addr] completed, but no mutual functions were found. Payload: \"[json_encode(request)]\", Response: \"[response_raw]\"") + return + var/list/functions = list() + // Both servers need to have a function available to each other for it to be valid + for(var/func in remote_funcs) + if(local_funcs[func]) + functions[func] = TRUE + GLOB.topic_servers[addr] = functions + if(logging) + log_topic("Handshake with [addr] successful.") + +/** + * Wrapper proc for world.Export() that adds additional params and handles auth. + * + * Params: + * + * * addr: address of the recieving BYOND server (*including* the byond://) + * * query: name of the topic endpoint to request + * * params: associated list of parameters to send to the recieving server + * * anonymous: TRUE or FALSE whether to use anonymous token for the request *(default: FALSE)* + * Note that request will fail if a token cannot be found for the target server and anonymous is not set. + * * nocheck: TRUE or FALSE whether to check if the recieving server is authorized to get the topic call *(default: FALSE)* +*/ +/datum/controller/subsystem/topic/proc/export(addr, query, list/params, anonymous = FALSE, nocheck = FALSE) + var/list/request = list() + request["query"] = query + + if(anonymous) + var/datum/world_topic/topic = GLOB.topic_commands[query] + if((!istype(topic) || !topic.anonymous) && !nocheck) + return + request["auth"] = "anonymous" + else + var/list/servers = CONFIG_GET(keyed_list/cross_server) + if(!servers[addr] || (!LAZYACCESS(GLOB.topic_servers[addr], query) && !nocheck)) + return // Couldn't find an authorized key, or trying to send secure data to unsecure server + request["auth"] = servers[addr] + + request.Add(params) + request["source"] = CONFIG_GET(string/cross_comms_name) + var/result = world.Export("[addr]?[rustg_url_encode(json_encode(request))]") + if(CONFIG_GET(flag/log_world_topic)) + request["auth"] = "***[copytext(request["auth"], -4)]" + log_topic("outgoing: \"[json_encode(request)]\", response: \"[result]\", auth: [request["auth"]], to: [addr], anonymous: [anonymous]") + +/** + * Broadcast topic to all known authorized servers for things like comms consoles or ahelps. + * Follows a set topic format for ease of use, and is therefore incompatible with other topic endpoints. + * + * Params: + * + * * query: name of the topic endpoint for the requests + * * msg: message text to send + * * sender: name of the sending entity (station name, ckey etc) +*/ +/datum/controller/subsystem/topic/proc/crosscomms_send(query, msg, sender) + var/list/servers = CONFIG_GET(keyed_list/cross_server) + for(var/I in servers) + export(I, query, list("message" = msg, "message_sender" = sender)) diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index cbe52b6218246..76c967f4c8b8c 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -68,7 +68,7 @@ SUBSYSTEM_DEF(traumas) /obj/item/pda/clown, /obj/item/grown/bananapeel)), "greytide" = typecacheof(list(/obj/item/clothing/under/color/grey, /obj/item/melee/baton/cattleprod, - /obj/item/twohanded/spear, /obj/item/clothing/mask/gas)), + /obj/item/spear, /obj/item/clothing/mask/gas/old)), "lizards" = typecacheof(list(/obj/item/toy/plush/lizardplushie, /obj/item/reagent_containers/food/snacks/kebab/tail, /obj/item/organ/tail/lizard, /obj/item/reagent_containers/food/drinks/bottle/lizardwine)), @@ -109,7 +109,7 @@ SUBSYSTEM_DEF(traumas) /obj/item/card/id/captains_spare, /obj/item/card/id/centcom, /obj/machinery/door/airlock/command)), "the supernatural" = typecacheof(list(/obj/structure/destructible/cult, /obj/item/tome, - /obj/item/melee/cultblade, /obj/item/twohanded/required/cult_bastard, /obj/item/restraints/legcuffs/bola/cult, + /obj/item/melee/cultblade, /obj/item/cult_bastard, /obj/item/restraints/legcuffs/bola/cult, /obj/item/clothing/suit/cultrobes, /obj/item/clothing/suit/space/hardsuit/cult, /obj/item/clothing/suit/hooded/cultrobes, /obj/item/clothing/head/hooded/cult_hoodie, /obj/effect/rune, /obj/item/stack/sheet/runed_metal, /obj/machinery/door/airlock/cult, /obj/singularity/narsie, @@ -139,7 +139,7 @@ SUBSYSTEM_DEF(traumas) "anime" = typecacheof(list(/obj/item/clothing/under/costume/schoolgirl, /obj/item/katana, /obj/item/reagent_containers/food/snacks/sashimi, /obj/item/reagent_containers/food/snacks/chawanmushi, /obj/item/reagent_containers/food/drinks/bottle/sake, /obj/item/throwing_star, /obj/item/clothing/head/kitty/genuine, /obj/item/clothing/suit/space/space_ninja, - /obj/item/clothing/mask/gas/space_ninja, /obj/item/clothing/shoes/space_ninja, /obj/item/clothing/gloves/space_ninja, /obj/item/twohanded/vibro_weapon, + /obj/item/clothing/mask/gas/space_ninja, /obj/item/clothing/shoes/space_ninja, /obj/item/clothing/gloves/space_ninja, /obj/item/vibro_weapon, /obj/item/nullrod/scythe/vibro, /obj/item/energy_katana, /obj/item/toy/katana, /obj/item/nullrod/claymore/katana, /obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe)) ) @@ -153,7 +153,7 @@ SUBSYSTEM_DEF(traumas) phobia_species = list("lizards" = typecacheof(list(/datum/species/lizard)), "skeletons" = typecacheof(list(/datum/species/skeleton, /datum/species/plasmaman)), - "conspiracies" = typecacheof(list(/datum/species/abductor, /datum/species/lizard, /datum/species/synth)), + "conspiracies" = typecacheof(list(/datum/species/abductor, /datum/species/lizard)), "robots" = typecacheof(list(/datum/species/android)), "the supernatural" = typecacheof(list(/datum/species/golem/clockwork, /datum/species/golem/runic)), "aliens" = typecacheof(list(/datum/species/abductor, /datum/species/jelly, /datum/species/pod, diff --git a/code/controllers/subsystem/vis_overlays.dm b/code/controllers/subsystem/vis_overlays.dm index d67ce85bce9fa..65805d4faf7cc 100644 --- a/code/controllers/subsystem/vis_overlays.dm +++ b/code/controllers/subsystem/vis_overlays.dm @@ -26,6 +26,7 @@ SUBSYSTEM_DEF(vis_overlays) overlay.unused = world.time else if(overlay.unused && overlay.unused + overlay.cache_expiration < world.time) vis_overlay_cache -= key + unique_vis_overlays -= overlay qdel(overlay) if(MC_TICK_CHECK) return @@ -81,6 +82,8 @@ SUBSYSTEM_DEF(vis_overlays) UnregisterSignal(thing, COMSIG_ATOM_DIR_CHANGE) /datum/controller/subsystem/vis_overlays/proc/rotate_vis_overlay(atom/thing, old_dir, new_dir) + SIGNAL_HANDLER + if(old_dir == new_dir) return var/rotation = dir2angle(old_dir) - dir2angle(new_dir) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 0a05cd0bdf1bd..6a0a296ac578e 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -6,42 +6,36 @@ SUBSYSTEM_DEF(vote) runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT - var/initiator = null - var/started_time = null + var/mode + var/question + var/initiator + var/started_time var/time_remaining = 0 - var/mode = null - var/question = null - var/list/choices = list() var/list/voted = list() var/list/voting = list() + var/list/choices = list() + var/list/choice_by_ckey = list() var/list/generated_actions = list() /datum/controller/subsystem/vote/fire() //called by master_controller - if(mode) - time_remaining = round((started_time + CONFIG_GET(number/vote_period) - world.time)/10) - - if(time_remaining < 0) - result() - for(var/client/C in voting) - C << browse(null, "window=vote;can_close=0") - reset() - else - var/datum/browser/client_popup - for(var/client/C in voting) - client_popup = new(C, "vote", "Voting Panel") - client_popup.set_window_options("can_close=0") - client_popup.set_content(interface(C)) - client_popup.open(FALSE) - + if(!mode) + return + time_remaining = round((started_time + CONFIG_GET(number/vote_period) - world.time)/10) + if(time_remaining < 0) + result() + SStgui.close_uis(src) + reset() /datum/controller/subsystem/vote/proc/reset() - initiator = null - time_remaining = 0 mode = null - question = null - choices.Cut() voted.Cut() voting.Cut() + choices.Cut() + question = null + initiator = null + time_remaining = 0 + choice_by_ckey.Cut() + remove_action_buttons() /datum/controller/subsystem/vote/proc/get_result() @@ -135,18 +129,15 @@ SUBSYSTEM_DEF(vote) /datum/controller/subsystem/vote/proc/result() . = announce_result() - var/restart = 0 + var/restart = FALSE if(.) switch(mode) if("restart") if(. == "Restart Round") - restart = 1 + restart = TRUE if("gamemode") if(GLOB.master_mode != .) - SSticker.save_mode(.) - if(SSticker.HasRoundStarted()) - restart = 1 - else + if(!SSticker.HasRoundStarted()) GLOB.master_mode = . if("map") SSmapping.changemap(global.config.maplist[.]) @@ -154,14 +145,15 @@ SUBSYSTEM_DEF(vote) if("transfer") if(. == "Initiate Crew Transfer") SSshuttle.requestEvac(null, "Crew Transfer Requested.") + SSshuttle.emergencyNoRecall = TRUE //Prevent Recall. var/obj/machinery/computer/communications/C = locate() in GLOB.machines if(C) C.post_status("shuttle") if(restart) - var/active_admins = 0 - for(var/client/C in GLOB.admins) + var/active_admins = FALSE + for(var/client/C in GLOB.admins+GLOB.deadmins) if(!C.is_afk() && check_rights_for(C, R_SERVER)) - active_admins = 1 + active_admins = TRUE break if(!active_admins) SSticker.Reboot("Restart vote successful.", "restart vote") @@ -172,15 +164,21 @@ SUBSYSTEM_DEF(vote) return . /datum/controller/subsystem/vote/proc/submit_vote(vote) - if(mode) - if(CONFIG_GET(flag/no_dead_vote) && (usr.stat == DEAD && !isnewplayer(usr)) && !usr.client.holder && mode != "map") - return 0 - if(!(usr.ckey in voted)) - if(vote && 1<=vote && vote<=choices.len) - voted += usr.ckey - choices[choices[vote]]++ //check this - return vote - return 0 + if(!mode) + return FALSE + if(CONFIG_GET(flag/no_dead_vote) && (usr.stat == DEAD && !isnewplayer(usr)) && !usr.client.holder && mode != "map") + return FALSE + if(!(vote && 1<=vote && vote<=choices.len)) + return FALSE + // If user has already voted + if(usr.ckey in voted) + choices[choices[choice_by_ckey[usr.ckey]]]-- + else + voted += usr.ckey + + choice_by_ckey[usr.ckey] = vote + choices[choices[vote]]++ //check this + return vote /datum/controller/subsystem/vote/proc/initiate_vote(vote_type, initiator_key, forced=FALSE, popup=FALSE) if(!mode) @@ -190,12 +188,12 @@ SUBSYSTEM_DEF(vote) to_chat(usr, "There is already a vote in progress! please wait for it to finish.") return 0 - var/admin = FALSE + var/lower_admin = FALSE var/ckey = ckey(initiator_key) if(GLOB.admin_datums[ckey] || forced) - admin = TRUE + lower_admin = TRUE - if(next_allowed_time > world.time && !admin) + if(next_allowed_time > world.time && !lower_admin) to_chat(usr, "A vote was initiated recently, you must wait [DisplayTimeText(next_allowed_time-world.time)] before a new vote can be started!") return 0 @@ -237,7 +235,7 @@ SUBSYSTEM_DEF(vote) text += "\n[question]" log_vote(text) var/vp = CONFIG_GET(number/vote_period) - to_chat(world, "\n[text]\nType vote or click here to place your votes.\nYou have [DisplayTimeText(vp)] to vote.") + to_chat(world, "\n[text]\nType vote or click here to place your votes.\nYou have [DisplayTimeText(vp)] to vote.") time_remaining = round(vp/10) for(var/c in GLOB.clients) var/client/C = c @@ -254,95 +252,80 @@ SUBSYSTEM_DEF(vote) return 1 return 0 -/datum/controller/subsystem/vote/proc/interface(client/C) - if(!C) - return - var/admin = 0 - var/trialmin = 0 - if(C.holder) - admin = 1 - if(check_rights_for(C, R_ADMIN)) - trialmin = 1 - voting |= C - - if(mode) - if(question) - . += "

Vote: '[question]'

" - else - . += "

Vote: [capitalize(mode)]

" - . += "Time Left: [time_remaining] s
    " - for(var/i=1,i<=choices.len,i++) - var/votes = choices[choices[i]] - if(!votes) - votes = 0 - . += "
  • [choices[i]] ([votes] votes)
  • " - . += "

" - if(admin) - . += "(Cancel Vote) " - else - . += "

Start a vote:


  • " - //restart - var/avr = CONFIG_GET(flag/allow_vote_restart) - if(trialmin || avr) - . += "Restart" - else - . += "Restart (Disallowed)" - if(trialmin) - . += "\t([avr ? "Allowed" : "Disallowed"])" - . += "
  • " - //gamemode - var/avm = CONFIG_GET(flag/allow_vote_mode) - if(trialmin || avm) - . += "GameMode" - else - . += "GameMode (Disallowed)" - if(trialmin) - . += "\t([avm ? "Allowed" : "Disallowed"])" - - . += "
  • " - //map - var/avmap = CONFIG_GET(flag/allow_vote_map) - if(trialmin || avmap) - . += "Map" - else - . += "Map (Disallowed)" - if(trialmin) - . += "\t([avmap ? "Allowed" : "Disallowed"])" - - . += "" - //custom - if(trialmin) - . += "
  • Custom
  • " - . += "

" - . += "Close" - return . - +/datum/controller/subsystem/vote/proc/remove_action_buttons() + for(var/v in generated_actions) + var/datum/action/vote/V = v + if(!QDELETED(V)) + V.remove_from_client() + V.Remove(V.owner) + generated_actions = list() -/datum/controller/subsystem/vote/Topic(href,href_list[],hsrc) - if(!usr || !usr.client) - return //not necessary but meh...just in-case somebody does something stupid +/mob/verb/vote() + set category = "OOC" + set name = "Vote" + SSvote.ui_interact(usr) + +/datum/controller/subsystem/vote/ui_state() + return GLOB.always_state + +/datum/controller/subsystem/vote/ui_interact(mob/user, datum/tgui/ui) + // Tracks who is voting + if(!(user.client?.ckey in voting)) + voting += user.client?.ckey + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Vote") + ui.open() + +/datum/controller/subsystem/vote/ui_data(mob/user) + var/list/data = list( + "mode" = mode, + "voted" = voted, + "voting" = voting, + "choices" = list(), + "question" = question, + "initiator" = initiator, + "started_time" = started_time, + "time_remaining" = time_remaining, + "lower_admin" = !!user.client?.holder, + "generated_actions" = generated_actions, + "avm" = CONFIG_GET(flag/allow_vote_mode), + "avmap" = CONFIG_GET(flag/allow_vote_map), + "avr" = CONFIG_GET(flag/allow_vote_restart), + "selectedChoice" = choice_by_ckey[user.client?.ckey], + "upper_admin" = check_rights_for(user.client, R_ADMIN), + ) + + for(var/key in choices) + data["choices"] += list(list( + "name" = key, + "votes" = choices[key] || 0 + )) + + return data + +/datum/controller/subsystem/vote/ui_act(action, params) + . = ..() + if(.) + return - var/trialmin = 0 + var/upper_admin = 0 if(usr.client.holder) if(check_rights_for(usr.client, R_ADMIN)) - trialmin = 1 + upper_admin = 1 - switch(href_list["vote"]) - if("close") - voting -= usr.client - usr << browse(null, "window=vote") - return + switch(action) if("cancel") if(usr.client.holder) reset() if("toggle_restart") - if(usr.client.holder && trialmin) + if(usr.client.holder && upper_admin) CONFIG_SET(flag/allow_vote_restart, !CONFIG_GET(flag/allow_vote_restart)) if("toggle_gamemode") - if(usr.client.holder && trialmin) + if(usr.client.holder && upper_admin) CONFIG_SET(flag/allow_vote_mode, !CONFIG_GET(flag/allow_vote_mode)) if("toggle_map") - if(usr.client.holder && trialmin) + if(usr.client.holder && upper_admin) CONFIG_SET(flag/allow_vote_map, !CONFIG_GET(flag/allow_vote_map)) if("restart") if(CONFIG_GET(flag/allow_vote_restart) || usr.client.holder) @@ -356,26 +339,12 @@ SUBSYSTEM_DEF(vote) if("custom") if(usr.client.holder) initiate_vote("custom",usr.key) - else - submit_vote(round(text2num(href_list["vote"]))) - usr.vote() - -/datum/controller/subsystem/vote/proc/remove_action_buttons() - for(var/v in generated_actions) - var/datum/action/vote/V = v - if(!QDELETED(V)) - V.remove_from_client() - V.Remove(V.owner) - generated_actions = list() - -/mob/verb/vote() - set category = "OOC" - set name = "Vote" + if("vote") + submit_vote(round(text2num(params["index"]))) + return TRUE - var/datum/browser/popup = new(src, "vote", "Voting Panel") - popup.set_window_options("can_close=0") - popup.set_content(SSvote.interface(client)) - popup.open(FALSE) +/datum/controller/subsystem/vote/ui_close(mob/user, datum/tgui/tgui) + voting -= user.client?.ckey /datum/action/vote name = "Vote!" diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index 21df62172ee3c..4b036038663c5 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -34,6 +34,13 @@ SUBSYSTEM_DEF(weather) addtimer(CALLBACK(src, .proc/make_eligible, z, possible_weather), randTime + initial(W.weather_duration_upper), TIMER_UNIQUE) //Around 5-10 minutes between weathers next_hit_by_zlevel["[z]"] = world.time + randTime + initial(W.telegraph_duration) + +/datum/controller/subsystem/weather/get_metrics() + . = ..() + var/list/cust = list() + cust["processing"] = length(processing) + .["custom"] = cust + /datum/controller/subsystem/weather/Initialize(start_timeofday) for(var/V in subtypesof(/datum/weather)) var/datum/weather/W = V diff --git a/code/controllers/subsystem/zclear.dm b/code/controllers/subsystem/zclear.dm new file mode 100644 index 0000000000000..311a178467f65 --- /dev/null +++ b/code/controllers/subsystem/zclear.dm @@ -0,0 +1,327 @@ +#define CLEAR_TURF_PROCESSING_TIME (120 SECONDS) //Time it takes to clear all turfs +#define CHECK_ZLEVEL_TICKS (5 SECONDS) //Every 5 seconds check if a tracked z-level is free. + +GLOBAL_LIST_EMPTY(zclear_atoms) +GLOBAL_LIST_EMPTY(zclear_blockers) + +SUBSYSTEM_DEF(zclear) + name = "Z-Clear" + wait = 1 + + flags = SS_NO_INIT + runlevels = RUNLEVEL_GAME + + //List of z-levels to be auto-wiped when they are left + //Assoc list + var/list/datum/space_level/autowipe + + //List of free, empty z-levels. + var/list/datum/space_level/free_levels + + //List of processing Z-Levels + var/list/datum/zclear_data/processing_levels + + //List of atoms to ignore + var/list/ignored_atoms = null + + //List of nullspaced mobs to replace in ruins + var/list/nullspaced_mobs = list() + + //List of z-levels being docked with + var/list/docking_levels = list() + + //Announced zombie levels + var/list/announced_zombie_levels = list() + +/datum/controller/subsystem/zclear/New() + . = ..() + ignored_atoms = typecacheof(list(/mob/dead, /mob/camera, /mob/dview, /atom/movable/lighting_object, /obj/effect/abstract/mirage_holder)) + +/datum/controller/subsystem/zclear/fire(resumed) + if(times_fired % CHECK_ZLEVEL_TICKS == 0) + check_for_empty_levels() + for(var/datum/zclear_data/cleardata as() in processing_levels) + continue_wipe(cleardata) + +/* + * Checks for empty z-levels and wipes them. +*/ +/datum/controller/subsystem/zclear/proc/check_for_empty_levels() + var/list/active_levels = list() + //Levels that have living mobs + var/list/living_levels = list() + //Levels with mobs dead/alive + var/list/mob_levels = list() + //Check active mobs + for(var/mob/living/L as () in GLOB.mob_list) + if(!L) + continue + //Dead mobs get sent to new ruins + if(L.ckey || L.mind || L.client) + var/turf/T = get_turf(L) + mob_levels["[T.z]"] = TRUE + if(L.stat != DEAD) + active_levels["[T.z]"] = TRUE + living_levels["[T.z]"] = TRUE + //Check active nukes + for(var/obj/machinery/nuclearbomb/decomission/bomb in GLOB.decomission_bombs) + if(bomb.timing) + active_levels["[bomb.z]"] = TRUE + living_levels["[bomb.z]"] = TRUE //Dont perform mob saving actions on mobs about to be blown to smitherines. + //Block z-clear from these levels. + for(var/atom/A as() in GLOB.zclear_blockers) + active_levels["[A.z]"] = TRUE + //Check for shuttles + for(var/obj/docking_port/mobile/M in SSshuttle.mobile) + active_levels["[M.z]"] = TRUE + //Check shuttle destination + if(M.destination) + active_levels["[M.destination.z]"] = TRUE + living_levels["[M.destination.z]"] = TRUE + //Check for shuttles docking + for(var/port_id in SSorbits.assoc_shuttles) + var/datum/orbital_object/shuttle/shuttle = SSorbits.assoc_shuttles[port_id] + if(shuttle.docking_target) + for(var/datum/space_level/level in shuttle.docking_target.linked_z_level) + active_levels["[level.z_value]"] = TRUE + living_levels["[level.z_value]"] = TRUE + //Check for shuttles coming in + for(var/docking_level in docking_levels) + active_levels["[docking_level]"] = TRUE + living_levels["[docking_level]"] = TRUE + + for(var/datum/space_level/level as() in autowipe) + //Check if free + if(active_levels["[level.z_value]"]) + if(!living_levels["[level.z_value]"] && mob_levels["[level.z_value]"] && !announced_zombie_levels["[level.z_value]"]) + //Zombie level detected. + announced_zombie_levels["[level.z_value]"] = TRUE + if(level.orbital_body) + priority_announce("Nanotrasen long ranged sensors have indicated that all sentient life forms at priority waypoint [level.orbital_body.name] have ceased life functions. Command is recommended to establish a rescue operation to recover the bodies. Due to the nature of the threat at this location, security personnel armed with lethal weaponry is recommended to accompany the rescue team.", "Nanotrasen Long Range Sensors") + continue + //Level is free, do the wiping thing. + LAZYREMOVE(autowipe, level) + //Reset orbital body. + QDEL_NULL(level.orbital_body) + //Continue tracking after + wipe_z_level(level.z_value, TRUE) + +//Temporarily stops a z from being wiped for 30 seconds. +/datum/controller/subsystem/zclear/proc/temp_keep_z(z_level) + docking_levels |= z_level + addtimer(CALLBACK(src, .proc/unkeep_z, z_level), 2 MINUTES) + +/datum/controller/subsystem/zclear/proc/unkeep_z(z_level) + docking_levels -= z_level + +/* + * Returns a free space level. + * After a 60 second grace period of allocation, the z-level will be put back into the pool of z-levels to clear. + * Will create a new z-level if none are available. +*/ +/datum/controller/subsystem/zclear/proc/get_free_z_level() + while(LAZYLEN(free_levels)) + var/datum/space_level/picked_level = pick(free_levels) + LAZYREMOVE(free_levels, picked_level) + //In 1 minute we will begine tracking when all mobs have left the z-level. + //Begin tracking. In the rare case that someone got into a free z-level then just allow them to float there with no ruins. Space is pretty empty you know. + addtimer(CALLBACK(src, .proc/begin_tracking, picked_level), 60 SECONDS) + //Check if the z-level is actually free. (Someone might have drifted into the z-level.) + var/free = TRUE + for(var/mob/living/L in GLOB.player_list) + var/turf/T = get_turf(L) + if(T.z == picked_level.z_value) + free = FALSE + break + if(free) + return picked_level + //Create a new z-level + var/datum/space_level/picked_level = SSmapping.add_new_zlevel("Dynamic free level [LAZYLEN(free_levels)]", ZTRAITS_SPACE, orbital_body_type = null) + addtimer(CALLBACK(src, .proc/begin_tracking, picked_level), 60 SECONDS) + message_admins("SSORBITS: Created a new dynamic free level ([LAZYLEN(free_levels)] now created) as none were available at the time.") + return picked_level + +/datum/controller/subsystem/zclear/proc/begin_tracking(datum/space_level/sl) + LAZYOR(autowipe, sl) + + +/* + * Adds a z-level to the queue to be deleted. + * If tracking is TRUE, then we will re-wipe the z-level when mobs leave it again. +*/ +/datum/controller/subsystem/zclear/proc/wipe_z_level(z_level, tracking = FALSE, datum/callback/completion_callback) + if(!z_level) + return + + SSair.pause_z(z_level) + + var/list/turfs = block(locate(1, 1, z_level), locate(world.maxx, world.maxy, z_level)) + var/list/divided_turfs = list() + var/section_process_time = CLEAR_TURF_PROCESSING_TIME * 0.5 //There are 3 processes, cleaing atoms, cleaing turfs and then reseting atmos + + //Divide the turfs into groups + var/group_size = CEILING(turfs.len / section_process_time, 1) + var/list/current_group = list() + for(var/i in 1 to turfs.len) + var/turf/T = turfs[i] + current_group += T + if(i % group_size == 0) + divided_turfs += list(current_group) + current_group = list() + divided_turfs += list(current_group) + + //Create the wipe data datum + var/datum/zclear_data/data = new() + data.zvalue = z_level + data.divided_turfs = divided_turfs + data.process_num = 0 + data.completion_callback = completion_callback + data.tracking = tracking + + //Add the thing to the wiping levels list. + LAZYADD(processing_levels, data) + + //Pre-clear anything that needs to be cleared first (Air alarms.) + for(var/atom/A in GLOB.zclear_atoms) + if(A.z == z_level) + qdel(A, TRUE) + + //Unannounce zombie level + announced_zombie_levels["[z_level]"] = FALSE + +/* + * Continues the process of wiping a z-level. +*/ +/datum/controller/subsystem/zclear/proc/continue_wipe(datum/zclear_data/cleardata) + var/list_element = (cleardata.process_num % (CLEAR_TURF_PROCESSING_TIME * 0.5)) + 1 + switch(cleardata.process_num) + if(0 to (CLEAR_TURF_PROCESSING_TIME*0.5)-1) + if(list_element <= length(cleardata.divided_turfs)) + reset_turfs(cleardata.divided_turfs[list_element]) + if((CLEAR_TURF_PROCESSING_TIME*0.5) to (CLEAR_TURF_PROCESSING_TIME-1)) + if(list_element <= length(cleardata.divided_turfs)) + clear_turf_atoms(cleardata.divided_turfs[list_element]) + else + //Done + LAZYREMOVE(processing_levels, cleardata) + //Finalize area + SSair.unpause_z(cleardata.zvalue) + var/area/spaceA = GLOB.areas_by_type[/area/space] + spaceA.reg_in_areas_in_z() //<< Potentially slow proc + if(cleardata.completion_callback) + cleardata.completion_callback.Invoke(cleardata.zvalue) + if(cleardata.tracking) + LAZYADD(free_levels, SSmapping.z_list[cleardata.zvalue]) + if(length(nullspaced_mobs)) + var/nullspaced_mob_names = "" + var/valid = FALSE + for(var/mob/M as() in nullspaced_mobs) + if(M.key || M.get_ghost(FALSE, TRUE)) + nullspaced_mob_names += " - [M.name]\n" + valid = TRUE + if(valid) + priority_announce("Sensors indicate that multiple crewmembers have been lost at an abandoned station. They can potentially be recovered by flying to the nearest derelict station and locating their bodies.\n[nullspaced_mob_names]") + cleardata.process_num ++ + +/* + * Deletes all the atoms within a given turf. +*/ +/datum/controller/subsystem/zclear/proc/clear_turf_atoms(list/turfs) + //Clear atoms + for(var/turf/T as() in turfs) + // Remove all atoms except abstract mobs + var/list/allowed_contents = T.GetAllContentsIgnoring(ignored_atoms) + allowed_contents -= T + for(var/i in 1 to allowed_contents.len) + var/thing = allowed_contents[i] + //Remove powernet to prevent massive amounts of propagate networks, everythings getting deleted so who cares. + if(istype(thing, /obj/structure/cable)) + var/obj/structure/cable/cable = thing + cable.powernet = null + if(ismob(thing)) + if(!isliving(thing)) + continue + var/mob/living/M = thing + if(M.mind || M.key) + if(M.stat == DEAD) + //Store them for later + M.ghostize(TRUE) + M.forceMove(null) + nullspaced_mobs += M + else + //If the mob has a key (but is DC) then teleport them to a safe z-level where they can potentially be retrieved. + //Since the wiping takes 90 seconds they could potentially still be on the z-level as it is wiping if they reconnect in time + random_teleport_atom(M) + M.Knockdown(5) + to_chat(M, "You feel sick as your body lurches through space and time, the ripples of the starship that brought you here eminate no more and you get the horrible feeling that you have been left behind.") + else + delete_atom(thing) + else + delete_atom(thing) + +/* + * DELETES AN ATOM OR TELEPORTS IT TO A RANDOM LOCATION IF IT IS INDESTRUCTIBLE +*/ +/datum/controller/subsystem/zclear/proc/delete_atom(atom/A) + //Dont delete indestructible items, but indestructible structures can go + if(isitem(A)) + var/obj/O = A + //Handled by the mob + if(ismob(O.loc)) + return + if(O.resistance_flags & INDESTRUCTIBLE) + random_teleport_atom(A) + return + //Force delete effects and docking ports, normal delete everything else. + //Probably gunna cause problems in testing. + qdel(A, force = (iseffect(A) || istype(A, /obj/docking_port))) + +/* + * Randomly teleports an atom to a random z-level + * Copy and paste of turf/open/space/transit, could probably be a global proc +*/ +/datum/controller/subsystem/zclear/proc/random_teleport_atom(atom/movable/AM) + set waitfor = FALSE + if(!AM || istype(AM, /obj/docking_port)) + return + if(AM.loc != get_turf(AM)) // Multi-tile objects are "in" multiple locs but its loc is it's true placement. + return // Don't move multi tile objects if their origin isnt in transit + var/max = world.maxx-TRANSITIONEDGE + var/min = 1+TRANSITIONEDGE + + var/list/possible_transtitons = list() + for(var/datum/space_level/D as() in SSmapping.z_list) + if (D.linkage == CROSSLINKED) + possible_transtitons += D.z_value + var/_z = pick(possible_transtitons) + + //now select coordinates for a border turf + var/_x = rand(min,max) + var/_y = rand(min,max) + + var/turf/T = locate(_x, _y, _z) + AM.forceMove(T) + +/datum/controller/subsystem/zclear/proc/reset_turfs(list/turfs) + var/list/new_turfs = list() + for(var/turf/T as() in turfs) + var/turf/newT + if(istype(T, /turf/open/space)) + newT = T + else + newT = T.ChangeTurf(/turf/open/space, flags = CHANGETURF_IGNORE_AIR | CHANGETURF_DEFER_CHANGE) + if(!istype(newT.loc, /area/space)) + var/area/newA = GLOB.areas_by_type[/area/space] + newA.contents += newT + newT.change_area(newT.loc, newA) + newT.flags_1 &= ~NO_RUINS_1 + new_turfs += newT + return new_turfs + +/datum/zclear_data + var/zvalue + var/list/divided_turfs + var/process_num + var/tracking + //Callback when completed, z value passed as parameters + var/datum/callback/completion_callback diff --git a/code/datums/action.dm b/code/datums/action.dm index d7345703a7da4..020b41302ead7 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -9,7 +9,7 @@ var/obj/target = null var/check_flags = NONE var/processing = FALSE - var/obj/screen/movable/action_button/button = null + var/atom/movable/screen/movable/action_button/button = null var/buttontooltipstyle = "" var/transparent_when_unavailable = TRUE @@ -38,8 +38,7 @@ if(owner) Remove(owner) target = null - qdel(button) - button = null + QDEL_NULL(button) return ..() /datum/action/proc/Grant(mob/M) @@ -49,6 +48,7 @@ return Remove(owner) owner = M + RegisterSignal(owner, COMSIG_PARENT_QDELETING, .proc/owner_deleted) //button id generation var/counter = 0 @@ -70,17 +70,27 @@ M.client.screen += button button.locked = M.client.prefs.buttons_locked || button.id ? M.client.prefs.action_buttons_screen_locs["[name]_[button.id]"] : FALSE //even if it's not defaultly locked we should remember we locked it before button.moved = button.id ? M.client.prefs.action_buttons_screen_locs["[name]_[button.id]"] : FALSE + var/obj/effect/proc_holder/spell/spell_proc_holder = button.linked_action.target + if(istype(spell_proc_holder) && spell_proc_holder.text_overlay) + M.client.images += spell_proc_holder.text_overlay M.update_action_buttons() else Remove(owner) +/datum/action/proc/owner_deleted(datum/source) + SIGNAL_HANDLER + + Remove(owner) + /datum/action/proc/Remove(mob/M) if(M) if(M.client) M.client.screen -= button M.actions -= src M.update_action_buttons() - owner = null + if(owner) + UnregisterSignal(owner, COMSIG_PARENT_QDELETING) + owner = null button.moved = FALSE //so the button appears in its normal position when given to another owner. button.locked = FALSE button.id = null @@ -92,9 +102,6 @@ return FALSE return TRUE -/datum/action/proc/Process() - return - /datum/action/proc/IsAvailable() if(!owner) return FALSE @@ -141,7 +148,7 @@ button.color = rgb(255,255,255,255) return 1 -/datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button, force = FALSE) +/datum/action/proc/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force = FALSE) if(icon_icon && button_icon_state && ((current_button.button_icon_state != button_icon_state) || force)) current_button.cut_overlays(TRUE) current_button.add_overlay(mutable_appearance(icon_icon, button_icon_state)) @@ -175,7 +182,7 @@ I.ui_action_click(owner, src) return 1 -/datum/action/item_action/ApplyIcon(obj/screen/movable/action_button/current_button, force) +/datum/action/item_action/ApplyIcon(atom/movable/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 @@ -304,16 +311,6 @@ 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." @@ -343,6 +340,21 @@ /datum/action/item_action/toggle_helmet_mode name = "Toggle Helmet Mode" +/datum/action/item_action/toggle_beacon + name = "Toggle Hardsuit Locator Beacon" + icon_icon = 'icons/mob/actions.dmi' + button_icon_state = "toggle-transmission" + +/datum/action/item_action/toggle_beacon_hud + name = "Toggle Hardsuit Locator HUD" + icon_icon = 'icons/mob/actions.dmi' + button_icon_state = "toggle-hud" + +/datum/action/item_action/toggle_beacon_frequency + name = "Toggle Hardsuit Locator Frequency" + icon_icon = 'icons/mob/actions.dmi' + button_icon_state = "change-code" + /datum/action/item_action/crew_monitor name = "Interface With Crew Monitor" @@ -452,6 +464,10 @@ return return ..() +/datum/action/item_action/activate_remote_view + name = "Activate Remote View" + desc = "Activates the Remote View of your spy sunglasses." + /datum/action/item_action/organ_action check_flags = AB_CHECK_CONSCIOUS @@ -493,7 +509,7 @@ H.attack_self(owner) return var/obj/item/I = target - if(owner.can_equip(I, SLOT_HANDS)) + if(owner.can_equip(I, ITEM_SLOT_HANDS)) owner.temporarilyRemoveItemFromInventory(I) owner.put_in_hands(I) I.attack_self(owner) @@ -511,10 +527,9 @@ background_icon_state = "bg_agent" icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "deploy_box" - ///Cooldown between deploys. Uses world.time - var/cooldown = 0 ///The type of closet this action spawns. var/boxtype = /obj/structure/closet/cardboard/agent + COOLDOWN_DECLARE(box_cooldown) ///Handles opening and closing the box. /datum/action/item_action/agent_box/Trigger() @@ -530,11 +545,12 @@ if(!isturf(owner.loc)) //Don't let the player use this to escape mechs/welded closets. to_chat(owner, "You need more space to activate this implant.") return - if(cooldown < world.time - 100) - var/box = new boxtype(owner.drop_location()) - owner.forceMove(box) - cooldown = world.time - owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE) + if(!COOLDOWN_FINISHED(src, box_cooldown)) + return + COOLDOWN_START(src, box_cooldown, 10 SECONDS) + var/box = new boxtype(owner.drop_location()) + owner.forceMove(box) + owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE) //Preset for spells /datum/action/spell_action @@ -633,21 +649,21 @@ /datum/action/cooldown/proc/StartCooldown() next_use_time = world.time + cooldown_time - button.maptext = "[round(cooldown_time/10, 0.1)]" + button.maptext = MAPTEXT("[round(cooldown_time/10, 0.1)]") UpdateButtonIcon() START_PROCESSING(SSfastprocess, src) /datum/action/cooldown/process() if(!owner) button.maptext = "" - STOP_PROCESSING(SSfastprocess, src) + return PROCESS_KILL var/timeleft = max(next_use_time - world.time, 0) if(timeleft == 0) button.maptext = "" UpdateButtonIcon() - STOP_PROCESSING(SSfastprocess, src) + return PROCESS_KILL else - button.maptext = "[round(timeleft/10, 0.1)]" + button.maptext = MAPTEXT("[round(timeleft/10, 0.1)]") /datum/action/cooldown/Grant(mob/M) ..() @@ -671,12 +687,6 @@ icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "jetboot" -/datum/action/item_action/bhop/apid - name = "Apid Dash" - desc = "Uses your wings to dash forward 6 tiles." - icon_icon = 'icons/mob/neck.dmi' - button_icon_state = "apid_wings" - /datum/action/language_menu name = "Language Menu" desc = "Open the language menu to review your languages, their keys, and select your default language." @@ -759,7 +769,7 @@ icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "storage_gather_switch" -/datum/action/item_action/storage_gather_mode/ApplyIcon(obj/screen/movable/action_button/current_button) +/datum/action/item_action/storage_gather_mode/ApplyIcon(atom/movable/screen/movable/action_button/current_button) . = ..() var/old_layer = target.layer var/old_plane = target.plane diff --git a/code/datums/ai/README.md b/code/datums/ai/README.md new file mode 100644 index 0000000000000..f219b11bb2471 --- /dev/null +++ b/code/datums/ai/README.md @@ -0,0 +1,21 @@ +# AI controllers + +## Introduction + +Our AI controller system is an attempt at making it possible to create modularized AI that stores its behavior in datums, while keeping state and decision making in a controller. This allows a more versatile way of creating AI that doesn't rely on OOP as much, and doesn't clutter up the Life() code in Mobs. + +## AI Controllers + +A datum that can be added to any atom in the game. Similarly to components, they might only support a given subtype (e.g. /mob/living), but the idea is that theoretically, you could apply a specific AI controller to a big a group of different types as possible and it would still work. + +These datums handle both the normal movement of mobs, but also their decision making, deciding which actions they will take based on the checks you put into their SelectBehaviors proc. + +If behaviors are selected, and the AI is in range, it will try to perform them. It runs all the behaviors it currently has in parallel; allowing for it to for example screech at someone while trying to attack them. Aslong as it has behaviors running, it will not try to generate new plans, making it not waste CPU when it already has an active goal. + +They also hold data for any of the actions they might need to use, such as cooldowns, whether or not they're currently fighting, etcetera this is stored in the blackboard, more information on that below. + +### Blackboard +The blackboard is an associated list keyed with strings and with values of whatever you want. These store information the mob has such as "Am I attacking someone", "Do I have a weapon". By using an associated list like this, no data needs to be stored on the actions themselves, and you could make actions that work on multiple ai controllers if you so pleased by making the key to use a variable. + +## AI Behavior +AI behaviors are the actions an AI can take. These can range from "Do an emote" to "Attack this target until he is dead". They are singletons and should contain nothing but static data. Any dynamic data should be stored in the blackboard, to allow different controllers to use the same behaviors. diff --git a/code/datums/ai/_ai_behavior.dm b/code/datums/ai/_ai_behavior.dm new file mode 100644 index 0000000000000..ebec87b18c40d --- /dev/null +++ b/code/datums/ai/_ai_behavior.dm @@ -0,0 +1,26 @@ +///Abstract class for an action an AI can take, can range from movement to grabbing a nearby weapon. +/datum/ai_behavior + ///What distance you need to be from the target to perform the action + var/required_distance = 1 + ///Flags for extra behavior + var/behavior_flags = NONE + ///Cooldown between actions performances, defaults to the value of CLICK_CD_MELEE because that seemed like a nice standard for the speed of AI behavior + var/action_cooldown = CLICK_CD_MELEE + +/// Called by the ai controller when first being added. Additional arguments depend on the behavior type. +/// Return FALSE to cancel +/datum/ai_behavior/proc/setup(datum/ai_controller/controller, ...) + return TRUE + +///Called by the AI controller when this action is performed +/datum/ai_behavior/proc/perform(delta_time, datum/ai_controller/controller, ...) + controller.behavior_cooldowns[src] = world.time + action_cooldown + return + +///Called when the action is finished. This needs the same args as perform besides the default ones +/datum/ai_behavior/proc/finish_action(datum/ai_controller/controller, succeeded, ...) + LAZYREMOVE(controller.current_behaviors, src) + controller.behavior_args -= type + if(behavior_flags & AI_BEHAVIOR_REQUIRE_MOVEMENT) //If this was a movement task, reset our movement target. + controller.current_movement_target = null + controller.ai_movement.stop_moving_towards(controller) diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm new file mode 100644 index 0000000000000..a53e0828cfe9f --- /dev/null +++ b/code/datums/ai/_ai_controller.dm @@ -0,0 +1,261 @@ +/* +AI controllers are a datumized form of AI that simulates the input a player would otherwise give to a atom. What this means is that these datums +have ways of interacting with a specific atom and control it. They posses a blackboard with the information the AI knows and has, and will plan behaviors it will try to execute through +multiple modular subtrees with behaviors +*/ + +/datum/ai_controller + ///The atom this controller is controlling + var/atom/pawn + ///Bitfield of traits for this AI to handle extra behavior + var/ai_traits + ///Current actions being performed by the AI. + var/list/current_behaviors + ///Current actions and their respective last time ran as an assoc list. + var/list/behavior_cooldowns = list() + ///Current status of AI (OFF/ON) + var/ai_status + ///Current movement target of the AI, generally set by decision making. + var/atom/current_movement_target + ///This is a list of variables the AI uses and can be mutated by actions. When an action is performed you pass this list and any relevant keys for the variables it can mutate. + var/list/blackboard = list() + ///Stored arguments for behaviors given during their initial creation + var/list/behavior_args = list() + ///Tracks recent pathing attempts, if we fail too many in a row we fail our current plans. + var/pathing_attempts + ///Can the AI remain in control if there is a client? + var/continue_processing_when_client = FALSE + ///distance to give up on target + var/max_target_distance = 14 + ///Cooldown for new plans, to prevent AI from going nuts if it can't think of new plans and looping on end + COOLDOWN_DECLARE(failed_planning_cooldown) + ///All subtrees this AI has available, will run them in order, so make sure they're in the order you want them to run. On initialization of this type, it will start as a typepath(s) and get converted to references of ai_subtrees found in SSai_controllers when init_subtrees() is called + var/list/planning_subtrees + + // Movement related things here + ///Reference to the movement datum we use. Is a type on initialize but becomes a ref afterwards. + var/datum/ai_movement/ai_movement = /datum/ai_movement/dumb + ///Cooldown until next movement + COOLDOWN_DECLARE(movement_cooldown) + ///Delay between movements. This is on the controller so we can keep the movement datum singleton + var/movement_delay = 0.1 SECONDS + + // The variables below are fucking stupid and should be put into the blackboard at some point. + ///A list for the path we're currently following, if we're using JPS pathing + var/list/movement_path + ///Cooldown for JPS movement, how often we're allowed to try making a new path + COOLDOWN_DECLARE(repath_cooldown) + ///AI paused time + var/paused_until = 0 + +/datum/ai_controller/New(atom/new_pawn) + change_ai_movement_type(ai_movement) + init_subtrees() + + PossessPawn(new_pawn) + +/datum/ai_controller/Destroy(force, ...) + set_ai_status(AI_STATUS_OFF) + UnpossessPawn(FALSE) + return ..() + +///Overrides the current ai_movement of this controller with a new one +/datum/ai_controller/proc/change_ai_movement_type(datum/ai_movement/new_movement) + ai_movement = SSai_movement.movement_types[new_movement] + +///Completely replaces the planning_subtrees with a new set based on argument provided, list provided must contain specifically typepaths +/datum/ai_controller/proc/replace_planning_subtrees(list/typepaths_of_new_subtrees) + planning_subtrees = typepaths_of_new_subtrees + init_subtrees() + +///Loops over the subtrees in planning_subtrees and looks at the ai_controllers to grab a reference, ENSURE planning_subtrees ARE TYPEPATHS AND NOT INSTANCES/REFERENCES BEFORE EXECUTING THIS +/datum/ai_controller/proc/init_subtrees() + if(!LAZYLEN(planning_subtrees)) + return + var/list/temp_subtree_list = list() + for(var/subtree in planning_subtrees) + var/subtree_instance = SSai_controllers.ai_subtrees[subtree] + temp_subtree_list += subtree_instance + planning_subtrees = temp_subtree_list + +///Proc to move from one pawn to another, this will destroy the target's existing controller. +/datum/ai_controller/proc/PossessPawn(atom/new_pawn) + if(pawn) //Reset any old signals + UnpossessPawn(FALSE) + + if(istype(new_pawn.ai_controller)) //Existing AI, kill it. + QDEL_NULL(new_pawn.ai_controller) + + if(TryPossessPawn(new_pawn) & AI_CONTROLLER_INCOMPATIBLE) + qdel(src) + CRASH("[src] attached to [new_pawn] but these are not compatible!") + + pawn = new_pawn + pawn.ai_controller = src + + if(!continue_processing_when_client && istype(new_pawn, /mob)) + var/mob/possible_client_holder = new_pawn + if(possible_client_holder.client) + set_ai_status(AI_STATUS_OFF) + else + set_ai_status(AI_STATUS_ON) + else + set_ai_status(AI_STATUS_ON) + + RegisterSignal(pawn, COMSIG_MOB_LOGIN, .proc/on_sentience_gained) + +///Abstract proc for initializing the pawn to the new controller +/datum/ai_controller/proc/TryPossessPawn(atom/new_pawn) + return + +///Proc for deinitializing the pawn to the old controller +/datum/ai_controller/proc/UnpossessPawn(destroy) + UnregisterSignal(pawn, list(COMSIG_MOB_LOGIN, COMSIG_MOB_LOGOUT)) + pawn.ai_controller = null + pawn = null + if(destroy) + qdel(src) + return + +///Returns TRUE if the ai controller can actually run at the moment. +/datum/ai_controller/proc/able_to_run() + if(world.time < paused_until) + return FALSE + return TRUE + + +///Runs any actions that are currently running +/datum/ai_controller/process(delta_time) + if(!able_to_run()) + walk(pawn, 0) //stop moving + return //this should remove them from processing in the future through event-based stuff. + + if(!LAZYLEN(current_behaviors)) + PerformIdleBehavior(delta_time) //Do some stupid shit while we have nothing to do + return + + if(current_movement_target && get_dist(pawn, current_movement_target) > max_target_distance) //The distance is out of range + CancelActions() + return + + for(var/i in current_behaviors) + var/datum/ai_behavior/current_behavior = i + + + // Convert the current behaviour action cooldown to realtime seconds from deciseconds.current_behavior + // Then pick the max of this and the delta_time passed to ai_controller.process() + // Action cooldowns cannot happen faster than delta_time, so delta_time should be the value used in this scenario. + var/action_delta_time = max(current_behavior.action_cooldown * 0.1, delta_time) + + if(current_behavior.behavior_flags & AI_BEHAVIOR_REQUIRE_MOVEMENT) //Might need to move closer + if(!current_movement_target) + stack_trace("[pawn] wants to perform action type [current_behavior.type] which requires movement, but has no current movement target!") + return //This can cause issues, so don't let these slide. + if(current_behavior.required_distance >= get_dist(pawn, current_movement_target)) ///Are we close enough to engage? + if(ai_movement.moving_controllers[src] == current_movement_target) //We are close enough, if we're moving stop. + ai_movement.stop_moving_towards(src) + + if(behavior_cooldowns[current_behavior] > world.time) //Still on cooldown + continue + ProcessBehavior(action_delta_time, current_behavior) + return + + else if(ai_movement.moving_controllers[src] != current_movement_target) //We're too far, if we're not already moving start doing it. + ai_movement.start_moving_towards(src, current_movement_target, current_behavior.required_distance) //Then start moving + + if(current_behavior.behavior_flags & AI_BEHAVIOR_MOVE_AND_PERFORM) //If we can move and perform then do so. + if(behavior_cooldowns[current_behavior] > world.time) //Still on cooldown + continue + ProcessBehavior(action_delta_time, current_behavior) + return + else //No movement required + if(behavior_cooldowns[current_behavior] > world.time) //Still on cooldown + continue + ProcessBehavior(action_delta_time, current_behavior) + return + +///Perform some dumb idle behavior. +/datum/ai_controller/proc/PerformIdleBehavior(delta_time) + return + +///This is where you decide what actions are taken by the AI. +/datum/ai_controller/proc/SelectBehaviors(delta_time) + SHOULD_NOT_SLEEP(TRUE) //Fuck you don't sleep in procs like this. + if(!COOLDOWN_FINISHED(src, failed_planning_cooldown)) + return FALSE + + LAZYINITLIST(current_behaviors) + + if(LAZYLEN(planning_subtrees)) + for(var/datum/ai_planning_subtree/subtree as anything in planning_subtrees) + if(subtree.SelectBehaviors(src, delta_time) == SUBTREE_RETURN_FINISH_PLANNING) + break + +///This proc handles changing ai status, and starts/stops processing if required. +/datum/ai_controller/proc/set_ai_status(new_ai_status) + if(ai_status == new_ai_status) + return FALSE //no change + + ai_status = new_ai_status + switch(ai_status) + if(AI_STATUS_ON) + SSai_controllers.active_ai_controllers += src + START_PROCESSING(SSai_behaviors, src) + if(AI_STATUS_OFF) + STOP_PROCESSING(SSai_behaviors, src) + SSai_controllers.active_ai_controllers -= src + CancelActions() + +/datum/ai_controller/proc/PauseAi(time) + paused_until = world.time + time + +///Call this to add a behavior to the stack. +/datum/ai_controller/proc/queue_behavior(behavior_type, ...) + var/datum/ai_behavior/behavior = GET_AI_BEHAVIOR(behavior_type) + if(!behavior) + CRASH("Behavior [behavior_type] not found.") + var/list/arguments = args.Copy() + arguments[1] = src + if(!behavior.setup(arglist(arguments))) + return + LAZYADD(current_behaviors, behavior) + arguments.Cut(1, 2) + if(length(arguments)) + behavior_args[behavior_type] = arguments + else + behavior_args -= behavior_type + +/datum/ai_controller/proc/ProcessBehavior(delta_time, datum/ai_behavior/behavior) + var/list/arguments = list(delta_time, src) + var/list/stored_arguments = behavior_args[behavior.type] + if(stored_arguments) + arguments += stored_arguments + behavior.perform(arglist(arguments)) + +/datum/ai_controller/proc/CancelActions() + if(!LAZYLEN(current_behaviors)) + return + for(var/i in current_behaviors) + var/datum/ai_behavior/current_behavior = i + var/list/arguments = list(src, FALSE) + var/list/stored_arguments = behavior_args[current_behavior.type] + if(stored_arguments) + arguments += stored_arguments + current_behavior.finish_action(arglist(arguments)) + +/datum/ai_controller/proc/on_sentience_gained() + SIGNAL_HANDLER + UnregisterSignal(pawn, COMSIG_MOB_LOGIN) + if(!continue_processing_when_client) + set_ai_status(AI_STATUS_OFF) //Can't do anything while player is connected + RegisterSignal(pawn, COMSIG_MOB_LOGOUT, .proc/on_sentience_lost) + +/datum/ai_controller/proc/on_sentience_lost() + SIGNAL_HANDLER + UnregisterSignal(pawn, COMSIG_MOB_LOGOUT) + set_ai_status(AI_STATUS_ON) //Can't do anything while player is connected + RegisterSignal(pawn, COMSIG_MOB_LOGIN, .proc/on_sentience_gained) + +/// Use this proc to define how your controller defines what access the pawn has for the sake of pathfinding, likely pointing to whatever ID slot is relevant +/datum/ai_controller/proc/get_access() + return diff --git a/code/datums/ai/_ai_planning_subtree.dm b/code/datums/ai/_ai_planning_subtree.dm new file mode 100644 index 0000000000000..ec69cd3e3e64f --- /dev/null +++ b/code/datums/ai/_ai_planning_subtree.dm @@ -0,0 +1,7 @@ +///A subtree is attached to a controller and is occasionally called by /ai_controller/SelectBehaviors(), this mainly exists to act as a way to subtype and modify SelectBehaviors() without needing to subtype the ai controller itself +/datum/ai_planning_subtree + + +///Determines what behaviors should the controller try processing; if this returns SUBTREE_RETURN_FINISH_PLANNING then the controller won't go through the other subtrees should multiple exist in controller.planning_subtrees +/datum/ai_planning_subtree/proc/SelectBehaviors(datum/ai_controller/controller, delta_time) + return diff --git a/code/datums/ai/_item_behaviors.dm b/code/datums/ai/_item_behaviors.dm new file mode 100644 index 0000000000000..9dc032ba58aaf --- /dev/null +++ b/code/datums/ai/_item_behaviors.dm @@ -0,0 +1,59 @@ +///This behavior is for obj/items, it is used to free themselves out of the hands of whoever is holding them +/datum/ai_behavior/item_escape_grasp + +/datum/ai_behavior/item_escape_grasp/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/obj/item/item_pawn = controller.pawn + var/mob/item_holder = item_pawn.loc + if(!istype(item_holder)) + finish_action(controller, FALSE) //We're no longer beind held. abort abort!! + item_pawn.visible_message("[item_pawn] slips out of the hands of [item_holder]!") + item_holder.dropItemToGround(item_pawn, TRUE) + finish_action(controller, TRUE) + + +///This behavior is for obj/items, it is used to move closer to a target and throw themselves towards them. +/datum/ai_behavior/item_move_close_and_attack + required_distance = 3 + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + action_cooldown = 20 + ///Sound to use + var/attack_sound + ///Max attemps to make + var/max_attempts = 3 + + +/datum/ai_behavior/item_move_close_and_attack/setup(datum/ai_controller/controller, target_key, throw_count_key) + . = ..() + controller.current_movement_target = controller.blackboard[target_key] + + +/datum/ai_behavior/item_move_close_and_attack/perform(delta_time, datum/ai_controller/controller, target_key, throw_count_key) + . = ..() + var/obj/item/item_pawn = controller.pawn + var/atom/throw_target = controller.blackboard[target_key] + + item_pawn.visible_message("[item_pawn] hurls towards [throw_target]!") + item_pawn.throw_at(throw_target, rand(4,5), 9) + playsound(item_pawn.loc, attack_sound, 100, TRUE) + controller.blackboard[throw_count_key]++ + if(controller.blackboard[throw_count_key] >= max_attempts) + finish_action(controller, TRUE, target_key, throw_count_key) + +/datum/ai_behavior/item_move_close_and_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, throw_count_key) + . = ..() + reset_blackboard(controller, succeeded, target_key, throw_count_key) + +/datum/ai_behavior/item_move_close_and_attack/proc/reset_blackboard(datum/ai_controller/controller, succeeded, target_key, throw_count_key) + controller.blackboard -= target_key + controller.blackboard[throw_count_key] = 0 + +/datum/ai_behavior/item_move_close_and_attack/haunted + attack_sound = 'sound/items/haunted/ghostitemattack.ogg' + max_attempts = 4 + +/datum/ai_behavior/item_move_close_and_attack/haunted/finish_action(datum/ai_controller/controller, succeeded, target_key, throw_count_key) + var/atom/throw_target = controller.blackboard[target_key] + var/list/hauntee_list = controller.blackboard[BB_TO_HAUNT_LIST] + hauntee_list[throw_target]-- + return ..() diff --git a/code/datums/ai/dog/dog_behaviors.dm b/code/datums/ai/dog/dog_behaviors.dm new file mode 100644 index 0000000000000..34c8531778e22 --- /dev/null +++ b/code/datums/ai/dog/dog_behaviors.dm @@ -0,0 +1,208 @@ +/datum/ai_behavior/battle_screech/dog + screeches = list("barks","howls") + +/// Fetching makes the pawn chase after whatever it's targeting and pick it up when it's in range, with the dog_equip behavior +/datum/ai_behavior/fetch + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + +/datum/ai_behavior/fetch/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/mob/living/living_pawn = controller.pawn + var/obj/item/fetch_thing = controller.blackboard[BB_FETCH_TARGET] + + //either we can't pick it up, or we'd rather eat it, so stop trying. + if(fetch_thing.anchored || !isturf(fetch_thing.loc) || istype(fetch_thing, /obj/item/reagent_containers/food) || !living_pawn.CanReach(fetch_thing)) + finish_action(controller, FALSE) + return + + finish_action(controller, TRUE) + +/datum/ai_behavior/fetch/finish_action(datum/ai_controller/controller, success) + . = ..() + + if(!success) //Don't try again on this item if we failed + var/obj/item/target = controller.blackboard[BB_FETCH_TARGET] + if(target) + controller.blackboard[BB_FETCH_IGNORE_LIST][WEAKREF(target)] = TRUE + controller.blackboard[BB_FETCH_TARGET] = null + controller.blackboard[BB_FETCH_DELIVER_TO] = null + + +/// This is simply a behaviour to pick up a fetch target +/datum/ai_behavior/simple_equip/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/obj/item/fetch_target = controller.blackboard[BB_FETCH_TARGET] + if(!isturf(fetch_target?.loc) || !isitem(fetch_target)) // someone picked it up, something happened to it, or it wasn't an item anyway + finish_action(controller, FALSE) + return + + if(in_range(controller.pawn, fetch_target)) + pickup_item(controller, fetch_target) + finish_action(controller, TRUE) + else + finish_action(controller, FALSE) + +/datum/ai_behavior/simple_equip/finish_action(datum/ai_controller/controller, success) + . = ..() + controller.blackboard[BB_FETCH_TARGET] = null + +/datum/ai_behavior/simple_equip/proc/pickup_item(datum/ai_controller/controller, obj/item/target) + var/atom/pawn = controller.pawn + drop_item(controller) + pawn.visible_message("[pawn] picks up [target] in [pawn.p_their()] mouth.") + target.forceMove(pawn) + controller.blackboard[BB_SIMPLE_CARRY_ITEM] = target + return TRUE + +/datum/ai_behavior/simple_equip/proc/drop_item(datum/ai_controller/controller) + var/obj/item/carried_item = controller.blackboard[BB_SIMPLE_CARRY_ITEM] + if(!carried_item) + return + + var/atom/pawn = controller.pawn + pawn.visible_message("[pawn] drops [carried_item].") + carried_item.forceMove(get_turf(pawn)) + controller.blackboard[BB_SIMPLE_CARRY_ITEM] = null + return TRUE + + + +/// This behavior involves dropping off a carried item to a specified person (or place) +/datum/ai_behavior/deliver_item + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + +/datum/ai_behavior/deliver_item/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/mob/living/return_target = controller.blackboard[BB_FETCH_DELIVER_TO] + if(!return_target) + finish_action(controller, FALSE) + if(in_range(controller.pawn, return_target)) + deliver_item(controller) + finish_action(controller, TRUE) + +/datum/ai_behavior/deliver_item/finish_action(datum/ai_controller/controller, success) + . = ..() + controller.blackboard[BB_FETCH_DELIVER_TO] = null + +/// Actually drop the fetched item to the target +/datum/ai_behavior/deliver_item/proc/deliver_item(datum/ai_controller/controller) + var/obj/item/carried_item = controller.blackboard[BB_SIMPLE_CARRY_ITEM] + var/atom/movable/return_target = controller.blackboard[BB_FETCH_DELIVER_TO] + if(!carried_item || !return_target) + finish_action(controller, FALSE) + return + + if(ismob(return_target)) + controller.pawn.visible_message("[controller.pawn] delivers [carried_item] at [return_target]'s feet.") + else // not sure how to best phrase this + controller.pawn.visible_message("[controller.pawn] delivers [carried_item] to [return_target].") + + carried_item.forceMove(get_turf(return_target)) + controller.blackboard -= BB_SIMPLE_CARRY_ITEM + return TRUE + +/// This behavior involves either eating a snack we can reach, or begging someone holding a snack +/datum/ai_behavior/eat_snack + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + +/datum/ai_behavior/eat_snack/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/obj/item/snack = controller.current_movement_target + if(!istype(snack) || !istype(snack, /obj/item/reagent_containers/food) || !(isturf(snack.loc) || ishuman(snack.loc))) + finish_action(controller, FALSE) + + var/mob/living/living_pawn = controller.pawn + if(!in_range(living_pawn, snack)) + return + + if(isturf(snack.loc)) + snack.attack_animal(living_pawn) // snack attack! + else if(iscarbon(snack.loc) && DT_PROB(10, delta_time)) + living_pawn.manual_emote("stares at [snack.loc]'s [snack.name] with a sad puppy-face.") + + if(QDELETED(snack)) // we ate it! + finish_action(controller, TRUE) + + +/// This behavior involves either eating a snack we can reach, or begging someone holding a snack +/datum/ai_behavior/play_dead + behavior_flags = NONE + +/datum/ai_behavior/play_dead/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/mob/living/simple_animal/simple_pawn = controller.pawn + if(!istype(simple_pawn)) + return + + if(!controller.blackboard[BB_DOG_PLAYING_DEAD]) + controller.blackboard[BB_DOG_PLAYING_DEAD] = TRUE + simple_pawn.emote("deathgasp", intentional=FALSE) + simple_pawn.icon_state = simple_pawn.icon_dead + if(simple_pawn.flip_on_death) + simple_pawn.transform = simple_pawn.transform.Turn(180) + simple_pawn.density = FALSE + + if(DT_PROB(10, delta_time)) + finish_action(controller, TRUE) + +/datum/ai_behavior/play_dead/finish_action(datum/ai_controller/controller, succeeded) + . = ..() + var/mob/living/simple_animal/simple_pawn = controller.pawn + if(!istype(simple_pawn) || simple_pawn.stat) // imagine actually dying while playing dead. hell, imagine being the kid waiting for your pup to get back up :( + return + controller.blackboard[BB_DOG_PLAYING_DEAD] = FALSE + simple_pawn.visible_message("[simple_pawn] springs to [simple_pawn.p_their()] feet, panting excitedly!") + simple_pawn.icon_state = simple_pawn.icon_living + if(simple_pawn.flip_on_death) + simple_pawn.transform = simple_pawn.transform.Turn(180) + simple_pawn.density = initial(simple_pawn.density) + +/// This behavior involves either eating a snack we can reach, or begging someone holding a snack +/datum/ai_behavior/harass + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM + required_distance = 3 + +/datum/ai_behavior/harass/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/mob/living/living_pawn = controller.pawn + if(!istype(living_pawn) || !(isturf(living_pawn.loc) || HAS_TRAIT(living_pawn, TRAIT_AI_BAGATTACK))) + return + + var/datum/weakref/harass_ref = controller.blackboard[BB_DOG_HARASS_TARGET] + var/atom/movable/harass_target = harass_ref.resolve() + if(!harass_target || !can_see(living_pawn, harass_target, length=AI_DOG_VISION_RANGE)) + finish_action(controller, FALSE) + return + + if(controller.blackboard[BB_DOG_FRIENDS][harass_ref]) + living_pawn.visible_message("[living_pawn] looks sideways at [harass_target] for a moment, then shakes [living_pawn.p_their()] head and ceases aggression.") + finish_action(controller, FALSE) + return + + var/mob/living/living_target = harass_target + if(istype(living_target) && (living_target.stat || HAS_TRAIT(living_target, TRAIT_FAKEDEATH))) + finish_action(controller, TRUE) + return + + // subtypes of this behavior can change behavior for how eager/averse the pawn is to attack the target as opposed to falling back/making noise/getting help + if(in_range(living_pawn, living_target)) + attack(controller, living_target) + else if(DT_PROB(50, delta_time)) + living_pawn.manual_emote("[pick("barks", "growls", "stares")] menacingly at [harass_target]!") + +/datum/ai_behavior/harass/finish_action(datum/ai_controller/controller, succeeded) + . = ..() + controller.blackboard[BB_DOG_HARASS_TARGET] = null + +/// A proc representing when the mob is pushed to actually attack the target. Again, subtypes can be used to represent different attacks from different animals, or it can be some other generic behavior +/datum/ai_behavior/harass/proc/attack(datum/ai_controller/controller, mob/living/living_target) + var/mob/living/living_pawn = controller.pawn + if(!istype(living_pawn)) + return + // make sure the pawn gets some temporary strength boost to actually attack the target instead of pathetically nuzzling them. + var/old_melee_damage = living_pawn.melee_damage + living_pawn.melee_damage = max(7, old_melee_damage) + + living_pawn.UnarmedAttack(living_target, FALSE) + + living_pawn.melee_damage = old_melee_damage diff --git a/code/datums/ai/dog/dog_controller.dm b/code/datums/ai/dog/dog_controller.dm new file mode 100644 index 0000000000000..0cc308682f31f --- /dev/null +++ b/code/datums/ai/dog/dog_controller.dm @@ -0,0 +1,294 @@ +/datum/ai_controller/dog + blackboard = list(\ + BB_SIMPLE_CARRY_ITEM = null,\ + BB_FETCH_TARGET = null,\ + BB_FETCH_DELIVER_TO = null,\ + BB_DOG_FRIENDS = list(),\ + BB_FETCH_IGNORE_LIST = list(),\ + BB_DOG_ORDER_MODE = DOG_COMMAND_NONE,\ + BB_DOG_PLAYING_DEAD = FALSE,\ + BB_DOG_HARASS_TARGET = null) + ai_movement = /datum/ai_movement/jps + planning_subtrees = list(/datum/ai_planning_subtree/dog) + + COOLDOWN_DECLARE(heel_cooldown) + COOLDOWN_DECLARE(command_cooldown) + + +/datum/ai_controller/dog/process(delta_time) + if(ismob(pawn)) + var/mob/living/living_pawn = pawn + movement_delay = living_pawn.cached_multiplicative_slowdown + return ..() + +/datum/ai_controller/dog/TryPossessPawn(atom/new_pawn) + if(!isliving(new_pawn)) + return AI_CONTROLLER_INCOMPATIBLE + + RegisterSignal(new_pawn, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand) + RegisterSignal(new_pawn, COMSIG_PARENT_EXAMINE, .proc/on_examined) + RegisterSignal(new_pawn, COMSIG_CLICK_ALT, .proc/check_altclicked) + RegisterSignal(new_pawn, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING), .proc/on_death) + RegisterSignal(SSdcs, COMSIG_GLOB_CARBON_THROW_THING, .proc/listened_throw) + return ..() //Run parent at end + +/datum/ai_controller/dog/UnpossessPawn(destroy) + var/obj/item/carried_item = blackboard[BB_SIMPLE_CARRY_ITEM] + if(carried_item) + pawn.visible_message("[pawn] drops [carried_item].") + carried_item.forceMove(pawn.drop_location()) + blackboard[BB_SIMPLE_CARRY_ITEM] = null + UnregisterSignal(pawn, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_PARENT_EXAMINE, COMSIG_CLICK_ALT, COMSIG_MOB_DEATH, COMSIG_GLOB_CARBON_THROW_THING, COMSIG_PARENT_QDELETING)) + return ..() //Run parent at end + +/datum/ai_controller/dog/able_to_run() + var/mob/living/living_pawn = pawn + + if(IS_DEAD_OR_INCAP(living_pawn)) + return FALSE + return ..() + +/datum/ai_controller/dog/get_access() + var/mob/living/simple_animal/simple_pawn = pawn + if(!istype(simple_pawn)) + return + + return simple_pawn.access_card + +/datum/ai_controller/dog/PerformIdleBehavior(delta_time) + var/mob/living/living_pawn = pawn + if(!isturf(living_pawn.loc) || living_pawn.pulledby) + return + + // if we were just ordered to heel, chill out for a bit + if(!COOLDOWN_FINISHED(src, heel_cooldown)) + return + + // if we're just ditzing around carrying something, occasionally print a message so people know we have something + if(blackboard[BB_SIMPLE_CARRY_ITEM] && DT_PROB(5, delta_time)) + var/obj/item/carry_item = blackboard[BB_SIMPLE_CARRY_ITEM] + living_pawn.visible_message("[living_pawn] gently teethes on \the [carry_item] in [living_pawn.p_their()] mouth.", vision_distance=COMBAT_MESSAGE_RANGE) + + if(DT_PROB(5, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE)) + var/move_dir = pick(GLOB.alldirs) + living_pawn.Move(get_step(living_pawn, move_dir), move_dir) + else if(DT_PROB(10, delta_time)) + living_pawn.manual_emote(pick("dances around.", "chases [living_pawn.p_their()] tail!")) + living_pawn.AddComponent(/datum/component/spinny) + +/// Someone has thrown something, see if it's someone we care about and start listening to the thrown item so we can see if we want to fetch it when it lands +/datum/ai_controller/dog/proc/listened_throw(datum/source, mob/living/carbon/carbon_thrower) + SIGNAL_HANDLER + if(blackboard[BB_FETCH_TARGET] || blackboard[BB_FETCH_DELIVER_TO] || blackboard[BB_DOG_PLAYING_DEAD]) // we're already busy + return + if(!COOLDOWN_FINISHED(src, heel_cooldown)) + return + if(!can_see(pawn, carbon_thrower, length=AI_DOG_VISION_RANGE)) + return + var/obj/item/thrown_thing = carbon_thrower.get_active_held_item() + if(!isitem(thrown_thing)) + return + if(blackboard[BB_FETCH_IGNORE_LIST][WEAKREF(thrown_thing)]) + return + + RegisterSignal(thrown_thing, COMSIG_MOVABLE_THROW_LANDED, .proc/listen_throw_land) + +/// A throw we were listening to has finished, see if it's in range for us to try grabbing it +/datum/ai_controller/dog/proc/listen_throw_land(obj/item/thrown_thing, datum/thrownthing/throwing_datum) + SIGNAL_HANDLER + + UnregisterSignal(thrown_thing, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_THROW_LANDED)) + if(!istype(thrown_thing) || !isturf(thrown_thing.loc) || !can_see(pawn, thrown_thing, length=AI_DOG_VISION_RANGE)) + return + + current_movement_target = thrown_thing + blackboard[BB_FETCH_TARGET] = thrown_thing + blackboard[BB_FETCH_DELIVER_TO] = throwing_datum.thrower + queue_behavior(/datum/ai_behavior/fetch) + +/// Someone's interacting with us by hand, see if they're being nice or mean +/datum/ai_controller/dog/proc/on_attack_hand(datum/source, mob/living/user) + SIGNAL_HANDLER + + if(user.a_intent == INTENT_HARM) + unfriend(user) + else + if(prob(AI_DOG_PET_FRIEND_PROB)) + befriend(user) + // if the dog has something in their mouth that they're not bringing to someone for whatever reason, have them drop it when pet by a friend + var/list/friends = blackboard[BB_DOG_FRIENDS] + if(blackboard[BB_SIMPLE_CARRY_ITEM] && !current_movement_target && friends[WEAKREF(user)]) + var/obj/item/carried_item = blackboard[BB_SIMPLE_CARRY_ITEM] + pawn.visible_message("[pawn] drops [carried_item] at [user]'s feet!") + // maybe have a dedicated proc for dropping things + carried_item.forceMove(get_turf(user)) + blackboard[BB_SIMPLE_CARRY_ITEM] = null + +/// Someone is being nice to us, let's make them a friend! +/datum/ai_controller/dog/proc/befriend(mob/living/new_friend) + var/list/friends = blackboard[BB_DOG_FRIENDS] + var/datum/weakref/friend_ref = WEAKREF(new_friend) + if(friends[friend_ref]) + return + if(in_range(pawn, new_friend)) + new_friend.visible_message("[pawn] licks at [new_friend] in a friendly manner!", "[pawn] licks at you in a friendly manner!") + friends[friend_ref] = TRUE + RegisterSignal(new_friend, COMSIG_MOB_POINTED, .proc/check_point) + RegisterSignal(new_friend, COMSIG_MOB_SAY, .proc/check_verbal_command) + +/// Someone is being mean to us, take them off our friends (add actual enemies behavior later) +/datum/ai_controller/dog/proc/unfriend(mob/living/ex_friend) + var/list/friends = blackboard[BB_DOG_FRIENDS] + friends -= WEAKREF(ex_friend) + UnregisterSignal(ex_friend, list(COMSIG_MOB_POINTED, COMSIG_MOB_SAY)) + +/// Someone is looking at us, if we're currently carrying something then show what it is, and include a message if they're our friend +/datum/ai_controller/dog/proc/on_examined(datum/source, mob/user, list/examine_text) + SIGNAL_HANDLER + + var/obj/item/carried_item = blackboard[BB_SIMPLE_CARRY_ITEM] + if(carried_item) + examine_text += "[pawn.p_they(TRUE)] [pawn.p_are()] carrying [carried_item.get_examine_string(user)] in [pawn.p_their()] mouth." + if(blackboard[BB_DOG_FRIENDS][WEAKREF(user)]) + var/mob/living/living_pawn = pawn + if(!IS_DEAD_OR_INCAP(living_pawn)) + examine_text += "[pawn.p_they(TRUE)] seem[pawn.p_s()] happy to see you!" + +/// If we died, drop anything we were carrying +/datum/ai_controller/dog/proc/on_death(mob/living/ol_yeller) + SIGNAL_HANDLER + + var/obj/item/carried_item = blackboard[BB_SIMPLE_CARRY_ITEM] + if(!carried_item) + return + + ol_yeller.visible_message("[ol_yeller] drops [carried_item] as [ol_yeller.p_they()] die[ol_yeller.p_s()].") + carried_item.forceMove(ol_yeller.drop_location()) + blackboard[BB_SIMPLE_CARRY_ITEM] = null + +// next section is regarding commands + +/// Someone alt clicked us, see if they're someone we should show the radial command menu to +/datum/ai_controller/dog/proc/check_altclicked(datum/source, mob/living/clicker) + SIGNAL_HANDLER + + if(!COOLDOWN_FINISHED(src, command_cooldown)) + return + if(!istype(clicker) || !blackboard[BB_DOG_FRIENDS][WEAKREF(clicker)]) + return + INVOKE_ASYNC(src, .proc/command_radial, clicker) + +/// Show the command radial menu +/datum/ai_controller/dog/proc/command_radial(mob/living/clicker) + var/list/commands = list( + COMMAND_HEEL = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow"), + COMMAND_FETCH = image(icon = 'icons/mob/actions/actions_spells.dmi', icon_state = "summons"), + COMMAND_ATTACK = image(icon = 'icons/effects/effects.dmi', icon_state = "bite"), + COMMAND_DIE = image(icon = 'icons/mob/pets.dmi', icon_state = "puppy_dead") + ) + + var/choice = show_radial_menu(clicker, pawn, commands, custom_check = CALLBACK(src, .proc/check_menu, clicker), tooltips = TRUE) + if(!choice || !check_menu(clicker)) + return + set_command_mode(clicker, choice) + +/datum/ai_controller/dog/proc/check_menu(mob/user) + if(!istype(user)) + CRASH("A non-mob is trying to issue an order to [pawn].") + if(user.incapacitated() || !can_see(user, pawn)) + return FALSE + return TRUE + +/// One of our friends said something, see if it's a valid command, and if so, take action +/datum/ai_controller/dog/proc/check_verbal_command(mob/speaker, speech_args) + SIGNAL_HANDLER + + if(!blackboard[BB_DOG_FRIENDS][WEAKREF(speaker)]) + return + + if(!COOLDOWN_FINISHED(src, command_cooldown)) + return + + var/mob/living/living_pawn = pawn + if(IS_DEAD_OR_INCAP(living_pawn)) + return + + var/spoken_text = speech_args[SPEECH_MESSAGE] // probably should check for full words + var/command + if(findtext(spoken_text, "heel") || findtext(spoken_text, "sit") || findtext(spoken_text, "stay")) + command = COMMAND_HEEL + else if(findtext(spoken_text, "fetch") || findtext(spoken_text, "get it")) + command = COMMAND_FETCH + else if(findtext(spoken_text, "attack") || findtext(spoken_text, "sic")) + command = COMMAND_ATTACK + else if(findtext(spoken_text, "play dead")) + command = COMMAND_DIE + else + return + + if(!can_see(pawn, speaker, length=AI_DOG_VISION_RANGE)) + return + set_command_mode(speaker, command) + +/// Whether we got here via radial menu or a verbal command, this is where we actually process what our new command will be +/datum/ai_controller/dog/proc/set_command_mode(mob/commander, command) + COOLDOWN_START(src, command_cooldown, AI_DOG_COMMAND_COOLDOWN) + + switch(command) + // heel: stop what you're doing, relax and try not to do anything for a little bit + if(COMMAND_HEEL) + pawn.visible_message("[pawn]'s ears prick up at [commander]'s command, and [pawn.p_they()] sit[pawn.p_s()] down obediently, awaiting further orders.") + blackboard[BB_DOG_ORDER_MODE] = DOG_COMMAND_NONE + COOLDOWN_START(src, heel_cooldown, AI_DOG_HEEL_DURATION) + CancelActions() + // fetch: whatever the commander points to, try and bring it back + if(COMMAND_FETCH) + pawn.visible_message("[pawn]'s ears prick up at [commander]'s command, and [pawn.p_they()] bounce[pawn.p_s()] slightly in anticipation.") + blackboard[BB_DOG_ORDER_MODE] = DOG_COMMAND_FETCH + // attack: harass whoever the commander points to + if(COMMAND_ATTACK) + pawn.visible_message("[pawn]'s ears prick up at [commander]'s command, and [pawn.p_they()] growl[pawn.p_s()] intensely.") // imagine getting intimidated by a corgi + blackboard[BB_DOG_ORDER_MODE] = DOG_COMMAND_ATTACK + if(COMMAND_DIE) + blackboard[BB_DOG_ORDER_MODE] = DOG_COMMAND_NONE + CancelActions() + queue_behavior(/datum/ai_behavior/play_dead) + +/// Someone we like is pointing at something, see if it's something we might want to interact with (like if they might want us to fetch something for them) +/datum/ai_controller/dog/proc/check_point(mob/pointing_friend, atom/movable/pointed_movable) + SIGNAL_HANDLER + + var/mob/living/living_pawn = pawn + if(IS_DEAD_OR_INCAP(living_pawn)) + return + + if(!COOLDOWN_FINISHED(src, command_cooldown)) + return + if(pointed_movable == pawn || blackboard[BB_FETCH_TARGET] || !istype(pointed_movable) || blackboard[BB_DOG_ORDER_MODE] == DOG_COMMAND_NONE) // busy or no command + return + if(!can_see(pawn, pointing_friend, length=AI_DOG_VISION_RANGE) || !can_see(pawn, pointed_movable, length=AI_DOG_VISION_RANGE)) + return + + COOLDOWN_START(src, command_cooldown, AI_DOG_COMMAND_COOLDOWN) + + switch(blackboard[BB_DOG_ORDER_MODE]) + if(DOG_COMMAND_FETCH) + if(!isitem(pointed_movable) || pointed_movable.anchored) + return + var/obj/item/pointed_item = pointed_movable + if(pointed_item.obj_flags & ABSTRACT) + return + pawn.visible_message("[pawn] follows [pointing_friend]'s gesture towards [pointed_movable] and barks excitedly!") + current_movement_target = pointed_movable + blackboard[BB_FETCH_TARGET] = pointed_movable + blackboard[BB_FETCH_DELIVER_TO] = pointing_friend + if(living_pawn.buckled) + queue_behavior(/datum/ai_behavior/resist)//in case they are in bed or something + queue_behavior(/datum/ai_behavior/fetch) + if(DOG_COMMAND_ATTACK) + pawn.visible_message("[pawn] follows [pointing_friend]'s gesture towards [pointed_movable] and growls intensely!") + current_movement_target = pointed_movable + blackboard[BB_DOG_HARASS_TARGET] = WEAKREF(pointed_movable) + if(living_pawn.buckled) + queue_behavior(/datum/ai_behavior/resist)//in case they are in bed or something + queue_behavior(/datum/ai_behavior/harass) diff --git a/code/datums/ai/dog/dog_subtrees.dm b/code/datums/ai/dog/dog_subtrees.dm new file mode 100644 index 0000000000000..c35ab6b2fce09 --- /dev/null +++ b/code/datums/ai/dog/dog_subtrees.dm @@ -0,0 +1,40 @@ +/datum/ai_planning_subtree/dog + COOLDOWN_DECLARE(heel_cooldown) + COOLDOWN_DECLARE(reset_ignore_cooldown) + +/datum/ai_planning_subtree/dog/SelectBehaviors(datum/ai_controller/dog/controller, delta_time) + var/mob/living/living_pawn = controller.pawn + + // occasionally reset our ignore list + if(COOLDOWN_FINISHED(src, reset_ignore_cooldown) && length(controller.blackboard[BB_FETCH_IGNORE_LIST])) + COOLDOWN_START(src, reset_ignore_cooldown, AI_FETCH_IGNORE_DURATION) + controller.blackboard[BB_FETCH_IGNORE_LIST] = list() + + // if we were just ordered to heel, chill out for a bit + if(!COOLDOWN_FINISHED(src, heel_cooldown)) + return + + // if we're not already carrying something and we have a fetch target (and we're not already doing something with it), see if we can eat/equip it + if(!controller.blackboard[BB_SIMPLE_CARRY_ITEM] && controller.blackboard[BB_FETCH_TARGET]) + var/atom/movable/interact_target = controller.blackboard[BB_FETCH_TARGET] + if(in_range(living_pawn, interact_target) && (isturf(interact_target.loc))) + controller.current_movement_target = interact_target + if(istype(interact_target, /obj/item/reagent_containers/food)) + controller.queue_behavior(/datum/ai_behavior/eat_snack) + else if(isitem(interact_target)) + controller.queue_behavior(/datum/ai_behavior/simple_equip) + else + controller.blackboard[BB_FETCH_TARGET] = null + controller.blackboard[BB_FETCH_DELIVER_TO] = null + return + + // if we're carrying something and we have a destination to deliver it, do that + if(controller.blackboard[BB_SIMPLE_CARRY_ITEM] && controller.blackboard[BB_FETCH_DELIVER_TO]) + var/atom/return_target = controller.blackboard[BB_FETCH_DELIVER_TO] + if(!can_see(controller.pawn, return_target, length=AI_DOG_VISION_RANGE)) + // if the return target isn't in sight, we'll just forget about it and carry the thing around + controller.blackboard[BB_FETCH_DELIVER_TO] = null + return + controller.current_movement_target = return_target + controller.queue_behavior(/datum/ai_behavior/deliver_item) + return diff --git a/code/datums/ai/generic_actions.dm b/code/datums/ai/generic_actions.dm new file mode 100644 index 0000000000000..358f6443f2acd --- /dev/null +++ b/code/datums/ai/generic_actions.dm @@ -0,0 +1,283 @@ + +/datum/ai_behavior/resist/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/mob/living/living_pawn = controller.pawn + living_pawn.resist() + finish_action(controller, TRUE) + +/datum/ai_behavior/battle_screech + ///List of possible screeches the behavior has + var/list/screeches + +/datum/ai_behavior/battle_screech/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/mob/living/living_pawn = controller.pawn + INVOKE_ASYNC(living_pawn, /mob.proc/emote, pick(screeches)) + finish_action(controller, TRUE) + +///Moves to target then finishes +/datum/ai_behavior/move_to_target + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + +/datum/ai_behavior/move_to_target/perform(delta_time, datum/ai_controller/controller) + . = ..() + finish_action(controller, TRUE) + + +/datum/ai_behavior/break_spine + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + action_cooldown = 0.7 SECONDS + var/give_up_distance = 10 + +/datum/ai_behavior/break_spine/setup(datum/ai_controller/controller, target_key) + . = ..() + controller.current_movement_target = controller.blackboard[target_key] + +/datum/ai_behavior/break_spine/perform(delta_time, datum/ai_controller/controller, target_key) + var/mob/living/batman = controller.blackboard[target_key] + var/mob/living/big_guy = controller.pawn //he was molded by the darkness + + if(batman.stat) + finish_action(controller, TRUE, target_key) + + if(get_dist(batman, big_guy) >= give_up_distance) + finish_action(controller, FALSE, target_key) + + big_guy.start_pulling(batman) + big_guy.setDir(get_dir(big_guy, batman)) + + batman.visible_message("[batman] gets a slightly too tight hug from [big_guy]!", "You feel your body break as [big_guy] embraces you!") + + if(iscarbon(batman)) + var/mob/living/carbon/carbon_batman = batman + for(var/obj/item/bodypart/bodypart_to_break in carbon_batman.bodyparts) + if(bodypart_to_break.body_zone == BODY_ZONE_HEAD) + continue + bodypart_to_break.receive_damage(brute = 15) + else + batman.adjustBruteLoss(150) + + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/break_spine/finish_action(datum/ai_controller/controller, succeeded, target_key) + if(succeeded) + controller.blackboard -= target_key + return ..() + +/// Use in hand the currently held item +/datum/ai_behavior/use_in_hand + behavior_flags = AI_BEHAVIOR_MOVE_AND_PERFORM + + +/datum/ai_behavior/use_in_hand/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/mob/living/pawn = controller.pawn + var/obj/item/held = pawn.get_item_by_slot(pawn.get_active_hand()) + if(!held) + finish_action(controller, FALSE) + return + pawn.activate_hand(pawn.get_active_hand()) + finish_action(controller, TRUE) + +/// Use the currently held item, or unarmed, on an object in the world +/datum/ai_behavior/use_on_object + required_distance = 1 + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + +/datum/ai_behavior/use_on_object/setup(datum/ai_controller/controller, target_key) + . = ..() + controller.current_movement_target = controller.blackboard[target_key] + +/datum/ai_behavior/use_on_object/perform(delta_time, datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/pawn = controller.pawn + var/obj/item/held_item = pawn.get_item_by_slot(pawn.get_active_hand()) + var/atom/target = controller.blackboard[BB_MONKEY_CURRENT_PRESS_TARGET] + + if(!target || !pawn.CanReach(target)) + finish_action(controller, FALSE) + return + + pawn.a_intent = INTENT_HELP + if(held_item) + held_item.melee_attack_chain(pawn, target) + else + pawn.UnarmedAttack(target, TRUE) + + finish_action(controller, TRUE) + +/datum/ai_behavior/give + required_distance = 1 + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + + +/datum/ai_behavior/give/setup(datum/ai_controller/controller, target_key) + . = ..() + controller.current_movement_target = controller.blackboard[target_key] + + +/datum/ai_behavior/give/perform(delta_time, datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/pawn = controller.pawn + var/obj/item/held_item = pawn.get_item_by_slot(pawn.get_active_hand()) + var/atom/target = controller.blackboard[target_key] + + if(!target || !pawn.CanReach(target) || !isliving(target)) + finish_action(controller, FALSE) + return + + var/mob/living/living_target = target + controller.PauseAi(1.5 SECONDS) + living_target.visible_message( + "[pawn] starts trying to give [held_item] to [living_target]!", + "[pawn] tries to give you [held_item]!" + ) + if(!do_mob(pawn, living_target, 1 SECONDS)) + return + if(QDELETED(held_item) || QDELETED(living_target)) + finish_action(controller, FALSE) + return + var/pocket_choice = prob(50) ? ITEM_SLOT_RPOCKET : ITEM_SLOT_LPOCKET + if(prob(50) && living_target.can_put_in_hand(held_item)) + living_target.put_in_hand(held_item) + else if(held_item.mob_can_equip(living_target, pawn, pocket_choice, TRUE)) + living_target.equip_to_slot(held_item, pocket_choice) + + finish_action(controller, TRUE) + +/datum/ai_behavior/consume + required_distance = 1 + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + action_cooldown = 2 SECONDS + +/datum/ai_behavior/consume/setup(datum/ai_controller/controller, obj/item/target) + . = ..() + controller.current_movement_target = target + +/datum/ai_behavior/consume/perform(delta_time, datum/ai_controller/controller, obj/item/target) + . = ..() + var/mob/living/pawn = controller.pawn + + if(!(target in pawn.held_items)) + if(!pawn.put_in_hand_check(target)) + finish_action(controller, FALSE) + return + + pawn.put_in_hands(target) + + target.melee_attack_chain(pawn, pawn) + + if(QDELETED(target) || prob(10)) // Even if we don't finish it all we can randomly decide to be done + finish_action(controller, TRUE) + +/**find and set + * Finds an item near themselves, sets a blackboard key as it. Very useful for ais that need to use machines or something. + * if you want to do something more complicated than find a single atom, change the search_tactic() proc + * cool tip: search_tactic() can set lists + */ +/datum/ai_behavior/find_and_set + action_cooldown = 5 SECONDS + ///search range in how many tiles around the pawn to look for the path + var/search_range = 7 + //optional, don't use if you're changing search_tactic() + var/locate_path + var/bb_key_to_set + +/datum/ai_behavior/find_and_set/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/find_this_thing = search_tactic(controller) + if(find_this_thing) + controller.blackboard[bb_key_to_set] = find_this_thing + finish_action(controller, TRUE) + else + finish_action(controller, FALSE) + +/datum/ai_behavior/find_and_set/proc/search_tactic(datum/ai_controller/controller) + return locate(locate_path) in oview(search_range, controller.pawn) + + +/// This behavior involves attacking a target. +/datum/ai_behavior/attack + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM + required_distance = 1 + +/datum/ai_behavior/attack/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/mob/living/living_pawn = controller.pawn + if(!istype(living_pawn) || !isturf(living_pawn.loc)) + return + + var/datum/weakref/attack_ref = controller.blackboard[BB_ATTACK_TARGET] + var/atom/movable/attack_target = attack_ref?.resolve() + if(!attack_target || !can_see(living_pawn, attack_target, length=controller.blackboard[BB_VISION_RANGE])) + finish_action(controller, FALSE) + return + + var/mob/living/living_target = attack_target + if(istype(living_target) && (living_target.stat == DEAD)) + finish_action(controller, TRUE) + return + + controller.current_movement_target = living_target + attack(controller, living_target) + +/datum/ai_behavior/attack/finish_action(datum/ai_controller/controller, succeeded) + . = ..() + controller.blackboard[BB_ATTACK_TARGET] = null + +/// A proc representing when the mob is pushed to actually attack the target. Again, subtypes can be used to represent different attacks from different animals, or it can be some other generic behavior +/datum/ai_behavior/attack/proc/attack(datum/ai_controller/controller, mob/living/living_target) + var/mob/living/living_pawn = controller.pawn + if(!istype(living_pawn)) + return + living_pawn.ClickOn(living_target, list()) + +/// This behavior involves attacking a target. +/datum/ai_behavior/follow + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM + required_distance = 1 + +/datum/ai_behavior/follow/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/mob/living/living_pawn = controller.pawn + if(!istype(living_pawn) || !isturf(living_pawn.loc)) + return + + var/datum/weakref/follow_ref = controller.blackboard[BB_FOLLOW_TARGET] + var/atom/movable/follow_target = follow_ref?.resolve() + if(!follow_target || get_dist(living_pawn, follow_target) > controller.blackboard[BB_VISION_RANGE]) + finish_action(controller, FALSE) + return + + var/mob/living/living_target = follow_target + if(istype(living_target) && (living_target.stat == DEAD)) + finish_action(controller, TRUE) + return + + controller.current_movement_target = living_target + +/datum/ai_behavior/follow/finish_action(datum/ai_controller/controller, succeeded) + . = ..() + controller.blackboard[BB_FOLLOW_TARGET] = null + + + +/datum/ai_behavior/perform_emote + +/datum/ai_behavior/perform_emote/perform(delta_time, datum/ai_controller/controller, emote) + var/mob/living/living_pawn = controller.pawn + if(!istype(living_pawn)) + return + living_pawn.manual_emote(emote) + finish_action(controller, TRUE) + +/datum/ai_behavior/perform_speech + +/datum/ai_behavior/perform_speech/perform(delta_time, datum/ai_controller/controller, speech) + var/mob/living/living_pawn = controller.pawn + if(!istype(living_pawn)) + return + living_pawn.say(speech, forced = "AI Controller") + finish_action(controller, TRUE) + + diff --git a/code/datums/ai/monkey/monkey_behaviors.dm b/code/datums/ai/monkey/monkey_behaviors.dm new file mode 100644 index 0000000000000..1d91c85e1c4f5 --- /dev/null +++ b/code/datums/ai/monkey/monkey_behaviors.dm @@ -0,0 +1,297 @@ +/datum/ai_behavior/battle_screech/monkey + screeches = list("roar","screech") + +/datum/ai_behavior/monkey_equip + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + +/datum/ai_behavior/monkey_equip/finish_action(datum/ai_controller/controller, success) + . = ..() + + if(!success) //Don't try again on this item if we failed + var/list/item_blacklist = controller.blackboard[BB_MONKEY_BLACKLISTITEMS] + var/obj/item/target = controller.blackboard[BB_MONKEY_PICKUPTARGET] + + item_blacklist[target] = TRUE + if(istype(controller, /datum/ai_controller/monkey)) //What the fuck + controller.RegisterSignal(target, COMSIG_PARENT_QDELETING, /datum/ai_controller/monkey/proc/target_del) + + controller.blackboard[BB_MONKEY_PICKUPTARGET] = null + +/datum/ai_behavior/monkey_equip/proc/equip_item(datum/ai_controller/controller) + var/mob/living/living_pawn = controller.pawn + + var/obj/item/target = controller.blackboard[BB_MONKEY_PICKUPTARGET] + var/best_force = controller.blackboard[BB_MONKEY_BEST_FORCE_FOUND] + + if(!isturf(living_pawn.loc)) + finish_action(controller, FALSE) + return + + if(!target) + finish_action(controller, FALSE) + return + + if(target.anchored) //Can't pick it up, so stop trying. + finish_action(controller, FALSE) + return + + // Strong weapon + else if(target.force > best_force) + living_pawn.drop_all_held_items() + living_pawn.put_in_hands(target) + controller.blackboard[BB_MONKEY_BEST_FORCE_FOUND] = target.force + finish_action(controller, TRUE) + return + + else if(target.slot_flags) //Clothing == top priority + living_pawn.dropItemToGround(target, TRUE) + living_pawn.update_icons() + if(!living_pawn.equip_to_appropriate_slot(target)) + finish_action(controller, FALSE) + return //Already wearing something, in the future this should probably replace the current item but the code didn't actually do that, and I dont want to support it right now. + finish_action(controller, TRUE) + return + + // EVERYTHING ELSE + else if(living_pawn.get_empty_held_index_for_side(LEFT_HANDS) || living_pawn.get_empty_held_index_for_side(RIGHT_HANDS)) + living_pawn.put_in_hands(target) + finish_action(controller, TRUE) + return + + finish_action(controller, FALSE) + +/datum/ai_behavior/monkey_equip/ground + required_distance = 0 + +/datum/ai_behavior/monkey_equip/ground/perform(delta_time, datum/ai_controller/controller) + . = ..() + equip_item(controller) + +/datum/ai_behavior/monkey_equip/pickpocket + +/datum/ai_behavior/monkey_equip/pickpocket/perform(delta_time, datum/ai_controller/controller) + . = ..() + if(controller.blackboard[BB_MONKEY_PICKPOCKETING]) //We are pickpocketing, don't do ANYTHING!!!! + return + INVOKE_ASYNC(src, .proc/attempt_pickpocket, controller) + +/datum/ai_behavior/monkey_equip/pickpocket/proc/attempt_pickpocket(datum/ai_controller/controller) + var/obj/item/target = controller.blackboard[BB_MONKEY_PICKUPTARGET] + + var/mob/living/victim = target.loc + var/mob/living/living_pawn = controller.pawn + + if(!istype(victim) || !living_pawn.CanReach(victim)) + finish_action(controller, FALSE) + return + + + + victim.visible_message("[living_pawn] starts trying to take [target] from [victim]!", "[living_pawn] tries to take [target]!") + + controller.blackboard[BB_MONKEY_PICKPOCKETING] = TRUE + + var/success = FALSE + + if(do_mob(living_pawn, victim, MONKEY_ITEM_SNATCH_DELAY) && target && living_pawn.CanReach(victim)) + + for(var/obj/item/I in victim.held_items) + if(I == target) + victim.visible_message("[living_pawn] snatches [target] from [victim].", "[living_pawn] snatched [target]!") + if(victim.temporarilyRemoveItemFromInventory(target)) + if(!QDELETED(target) && !equip_item(controller)) + target.forceMove(living_pawn.drop_location()) + success = TRUE + break + else + victim.visible_message("[living_pawn] tried to snatch [target] from [victim], but failed!", "[living_pawn] tried to grab [target]!") + + finish_action(controller, success) //We either fucked up or got the item. + +/datum/ai_behavior/monkey_equip/pickpocket/finish_action(datum/ai_controller/controller, success) + . = ..() + controller.blackboard[BB_MONKEY_PICKPOCKETING] = FALSE + controller.blackboard[BB_MONKEY_PICKUPTARGET] = null + +/datum/ai_behavior/monkey_flee + +/datum/ai_behavior/monkey_flee/perform(delta_time, datum/ai_controller/controller) + . = ..() + + var/mob/living/living_pawn = controller.pawn + + if(living_pawn.health >= MONKEY_FLEE_HEALTH) + finish_action(controller, TRUE) //we're back in bussiness + + var/mob/living/target = null + + // flee from anyone who attacked us and we didn't beat down + for(var/mob/living/L in view(living_pawn, MONKEY_FLEE_VISION)) + if(controller.blackboard[BB_MONKEY_ENEMIES][L] && L.stat == CONSCIOUS) + target = L + break + + if(target) + walk_away(living_pawn, target, MONKEY_ENEMY_VISION, 5) + else + finish_action(controller, TRUE) + +/datum/ai_behavior/monkey_attack_mob + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM //performs to increase frustration + +/datum/ai_behavior/monkey_attack_mob/perform(delta_time, datum/ai_controller/controller) + . = ..() + + var/mob/living/target = controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] + var/mob/living/living_pawn = controller.pawn + + if(!target || target.stat != CONSCIOUS) + finish_action(controller, TRUE) //Target == owned + + if(isturf(target.loc) && !IS_DEAD_OR_INCAP(living_pawn)) // Check if they're a valid target + // check if target has a weapon + var/obj/item/W + for(var/obj/item/I in target.held_items) + if(!(I.item_flags & ABSTRACT)) + W = I + break + + // if the target has a weapon, chance to disarm them + if(W && DT_PROB(MONKEY_ATTACK_DISARM_PROB, delta_time)) + monkey_attack(controller, target, delta_time, TRUE) + else + monkey_attack(controller, target, delta_time, FALSE) + + +/datum/ai_behavior/monkey_attack_mob/finish_action(datum/ai_controller/controller, succeeded) + . = ..() + var/mob/living/living_pawn = controller.pawn + walk(living_pawn, 0) + controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = null + +/// attack using a held weapon otherwise bite the enemy, then if we are angry there is a chance we might calm down a little +/datum/ai_behavior/monkey_attack_mob/proc/monkey_attack(datum/ai_controller/controller, mob/living/target, delta_time, disarm) + var/mob/living/living_pawn = controller.pawn + + if(living_pawn.next_move > world.time) + return + + living_pawn.changeNext_move(CLICK_CD_MELEE) //We play fair + + var/obj/item/weapon = locate(/obj/item) in living_pawn.held_items + + living_pawn.face_atom(target) + + living_pawn.a_intent = INTENT_HARM + + if(isnull(controller.blackboard[BB_MONKEY_GUN_WORKED])) + controller.blackboard[BB_MONKEY_GUN_WORKED] = TRUE + + // attack with weapon if we have one + if(living_pawn.CanReach(target, weapon)) + if(weapon) + weapon.melee_attack_chain(living_pawn, target) + else + if(disarm) + living_pawn.a_intent = INTENT_DISARM + living_pawn.UnarmedAttack(target) + living_pawn.a_intent = INTENT_HARM + else + living_pawn.UnarmedAttack(target) + controller.blackboard[BB_MONKEY_GUN_WORKED] = TRUE // We reset their memory of the gun being 'broken' if they accomplish some other attack + else if(weapon) + var/atom/real_target = target + if(prob(10)) // Artificial miss + real_target = pick(oview(2, target)) + + var/obj/item/gun/gun = locate() in living_pawn.held_items + var/can_shoot = gun?.can_shoot() || FALSE + if(gun && controller.blackboard[BB_MONKEY_GUN_WORKED] && prob(95)) + // We attempt to attack even if we can't shoot so we get the effects of pulling the trigger + gun.afterattack(real_target, living_pawn, FALSE) + controller.blackboard[BB_MONKEY_GUN_WORKED] = can_shoot ? TRUE : prob(80) // Only 20% likely to notice it didn't work + if(can_shoot) + controller.blackboard[BB_MONKEY_GUN_NEURONS_ACTIVATED] = TRUE + else + living_pawn.throw_item(real_target) + controller.blackboard[BB_MONKEY_GUN_WORKED] = TRUE // 'worked' + + living_pawn.a_intent = INTENT_HELP + + // no de-aggro + if(controller.blackboard[BB_MONKEY_AGGRESSIVE]) + return + + if(DT_PROB(MONKEY_HATRED_REDUCTION_PROB, delta_time)) + controller.blackboard[BB_MONKEY_ENEMIES][target]-- + + // if we are not angry at our target, go back to idle + if(controller.blackboard[BB_MONKEY_ENEMIES][target] <= 0) + var/list/enemies = controller.blackboard[BB_MONKEY_ENEMIES] + enemies.Remove(target) + if(controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] == target) + finish_action(controller, TRUE) + +/datum/ai_behavior/disposal_mob + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM //performs to increase frustration + +/datum/ai_behavior/disposal_mob/finish_action(datum/ai_controller/controller, succeeded, attack_target_key, disposal_target_key) + . = ..() + controller.blackboard[attack_target_key] = null //Reset attack target + controller.blackboard[BB_MONKEY_DISPOSING] = FALSE //No longer disposing + controller.blackboard[disposal_target_key] = null //No target disposal + +/datum/ai_behavior/disposal_mob/perform(delta_time, datum/ai_controller/controller, attack_target_key, disposal_target_key) + . = ..() + + if(controller.blackboard[BB_MONKEY_DISPOSING]) //We are disposing, don't do ANYTHING!!!! + return + + var/mob/living/target = controller.blackboard[attack_target_key] + var/mob/living/living_pawn = controller.pawn + + controller.current_movement_target = target + + if(target.pulledby != living_pawn && !HAS_AI_CONTROLLER_TYPE(target.pulledby, /datum/ai_controller/monkey)) //Dont steal from my fellow monkeys. + if(living_pawn.Adjacent(target) && isturf(target.loc)) + target.grabbedby(living_pawn) + return //Do the rest next turn + + var/obj/machinery/disposal/disposal = controller.blackboard[disposal_target_key] + controller.current_movement_target = disposal + + if(living_pawn.Adjacent(disposal)) + INVOKE_ASYNC(src, .proc/try_disposal_mob, controller, attack_target_key, disposal_target_key) //put him in! + else //This means we might be getting pissed! + return + +/datum/ai_behavior/disposal_mob/proc/try_disposal_mob(datum/ai_controller/controller, attack_target_key, disposal_target_key) + var/mob/living/living_pawn = controller.pawn + var/mob/living/target = controller.blackboard[attack_target_key] + var/obj/machinery/disposal/disposal = controller.blackboard[disposal_target_key] + + controller.blackboard[BB_MONKEY_DISPOSING] = TRUE + + if(target && disposal?.stuff_mob_in(target, living_pawn)) + disposal.flush() + finish_action(controller, TRUE, attack_target_key, disposal_target_key) + + +/datum/ai_behavior/recruit_monkeys/perform(delta_time, datum/ai_controller/controller) + . = ..() + + controller.blackboard[BB_MONKEY_RECRUIT_COOLDOWN] = world.time + MONKEY_RECRUIT_COOLDOWN + var/mob/living/living_pawn = controller.pawn + + for(var/mob/living/L in view(living_pawn, MONKEY_ENEMY_VISION)) + if(!HAS_AI_CONTROLLER_TYPE(L, /datum/ai_controller/monkey)) + continue + + if(!DT_PROB(MONKEY_RECRUIT_PROB, delta_time)) + continue + var/datum/ai_controller/monkey/monkey_ai = L.ai_controller + var/atom/your_enemy = controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] + var/list/enemies = L.ai_controller.blackboard[BB_MONKEY_ENEMIES] + enemies[your_enemy] = MONKEY_RECRUIT_HATED_AMOUNT + monkey_ai.blackboard[BB_MONKEY_RECRUIT_COOLDOWN] = world.time + MONKEY_RECRUIT_COOLDOWN + finish_action(controller, TRUE) diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm new file mode 100644 index 0000000000000..3de55ee68d669 --- /dev/null +++ b/code/datums/ai/monkey/monkey_controller.dm @@ -0,0 +1,260 @@ +/* +AI controllers are a datumized form of AI that simulates the input a player would otherwise give to a mob. What this means is that these datums +have ways of interacting with a specific mob and control it. +*/ +///OOK OOK OOK + +/datum/ai_controller/monkey + movement_delay = 0.4 SECONDS + planning_subtrees = list(/datum/ai_planning_subtree/monkey_tree) + blackboard = list( + BB_MONKEY_AGGRESSIVE = FALSE, + BB_MONKEY_BEST_FORCE_FOUND = 0, + BB_MONKEY_ENEMIES = list(), + BB_MONKEY_BLACKLISTITEMS = list(), + BB_MONKEY_PICKUPTARGET = null, + BB_MONKEY_PICKPOCKETING = FALSE, + BB_MONKEY_DISPOSING = FALSE, + BB_MONKEY_TARGET_DISPOSAL = null, + BB_MONKEY_CURRENT_ATTACK_TARGET = null, + BB_MONKEY_GUN_NEURONS_ACTIVATED = FALSE, + BB_MONKEY_GUN_WORKED = TRUE, + BB_MONKEY_NEXT_HUNGRY = 0 + ) + +/datum/ai_controller/monkey/angry + +/datum/ai_controller/monkey/angry/TryPossessPawn(atom/new_pawn) + . = ..() + if(. & AI_CONTROLLER_INCOMPATIBLE) + return + blackboard[BB_MONKEY_AGGRESSIVE] = TRUE //Angry cunt + +/datum/ai_controller/monkey/TryPossessPawn(atom/new_pawn) + if(!isliving(new_pawn)) + return AI_CONTROLLER_INCOMPATIBLE + + blackboard[BB_MONKEY_NEXT_HUNGRY] = world.time + rand(0, 300) + + var/mob/living/living_pawn = new_pawn + RegisterSignal(new_pawn, COMSIG_PARENT_ATTACKBY, .proc/on_attackby) + RegisterSignal(new_pawn, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand) + RegisterSignal(new_pawn, COMSIG_ATOM_ATTACK_PAW, .proc/on_attack_paw) + RegisterSignal(new_pawn, COMSIG_ATOM_ATTACK_ANIMAL, .proc/on_attack_animal) + RegisterSignal(new_pawn, COMSIG_MOB_ATTACK_ALIEN, .proc/on_attack_alien) + RegisterSignal(new_pawn, COMSIG_ATOM_BULLET_ACT, .proc/on_bullet_act) + RegisterSignal(new_pawn, COMSIG_ATOM_HITBY, .proc/on_hitby) + RegisterSignal(new_pawn, COMSIG_MOVABLE_CROSSED, .proc/on_Crossed) + RegisterSignal(new_pawn, COMSIG_LIVING_START_PULL, .proc/on_startpulling) + RegisterSignal(new_pawn, COMSIG_LIVING_TRY_SYRINGE, .proc/on_try_syringe) + RegisterSignal(new_pawn, COMSIG_ATOM_HULK_ATTACK, .proc/on_attack_hulk) + RegisterSignal(new_pawn, COMSIG_CARBON_CUFF_ATTEMPTED, .proc/on_attempt_cuff) + RegisterSignal(new_pawn, COMSIG_MOB_MOVESPEED_UPDATED, .proc/update_movespeed) + RegisterSignal(new_pawn, COMSIG_FOOD_EATEN, .proc/on_eat) + + movement_delay = living_pawn.cached_multiplicative_slowdown + return ..() //Run parent at end + +/datum/ai_controller/monkey/UnpossessPawn(destroy) + UnregisterSignal(pawn, list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_LIVING_START_PULL,\ + COMSIG_LIVING_TRY_SYRINGE, COMSIG_ATOM_HULK_ATTACK, COMSIG_CARBON_CUFF_ATTEMPTED, COMSIG_MOB_MOVESPEED_UPDATED, COMSIG_ATOM_ATTACK_ANIMAL, COMSIG_MOB_ATTACK_ALIEN)) + return ..() //Run parent at end + +// Stops sentient monkeys from being knocked over like weak dunces. +/datum/ai_controller/monkey/on_sentience_gained() + . = ..() + UnregisterSignal(pawn, COMSIG_MOVABLE_CROSSED) + +/datum/ai_controller/monkey/on_sentience_lost() + . = ..() + RegisterSignal(pawn, COMSIG_MOVABLE_CROSSED) + +/datum/ai_controller/monkey/able_to_run() + . = ..() + var/mob/living/living_pawn = pawn + + if(IS_DEAD_OR_INCAP(living_pawn)) + return FALSE + +///re-used behavior pattern by monkeys for finding a weapon +/datum/ai_controller/monkey/proc/TryFindWeapon() + var/mob/living/living_pawn = pawn + + if(!locate(/obj/item) in living_pawn.held_items) + blackboard[BB_MONKEY_BEST_FORCE_FOUND] = 0 + + if(blackboard[BB_MONKEY_GUN_NEURONS_ACTIVATED] && (locate(/obj/item/gun) in living_pawn.held_items)) + // We have a gun, what could we possibly want? + return FALSE + + var/obj/item/weapon + var/list/nearby_items = list() + for(var/obj/item/item in oview(2, living_pawn)) + nearby_items += item + + weapon = GetBestWeapon(nearby_items, living_pawn.held_items) + + var/pickpocket = FALSE + for(var/mob/living/carbon/human/human in oview(5, living_pawn)) + var/obj/item/held_weapon = GetBestWeapon(human.held_items + weapon, living_pawn.held_items) + if(held_weapon == weapon) // It's just the same one, not a held one + continue + pickpocket = TRUE + weapon = held_weapon + + if(!weapon || (weapon in living_pawn.held_items)) + return FALSE + + blackboard[BB_MONKEY_PICKUPTARGET] = weapon + current_movement_target = weapon + if(pickpocket) + queue_behavior(/datum/ai_behavior/monkey_equip/pickpocket) + else + queue_behavior(/datum/ai_behavior/monkey_equip/ground) + return TRUE + +/// Returns either the best weapon from the given choices or null if held weapons are better +/datum/ai_controller/monkey/proc/GetBestWeapon(list/choices, list/held_weapons) + var/gun_neurons_activated = blackboard[BB_MONKEY_GUN_NEURONS_ACTIVATED] + var/top_force = 0 + var/obj/item/top_force_item + for(var/obj/item/item as anything in held_weapons) + if(!item) + continue + if(HAS_TRAIT(item, TRAIT_NEEDS_TWO_HANDS) || blackboard[BB_MONKEY_BLACKLISTITEMS][item]) + continue + if(gun_neurons_activated && istype(item, /obj/item/gun)) + // We have a gun, why bother looking for something inferior + // Also yes it is intentional that monkeys dont know how to pick the best gun + return item + if(item.force > top_force) + top_force = item.force + top_force_item = item + + for(var/obj/item/item as anything in choices) + if(!item) + continue + if(HAS_TRAIT(item, TRAIT_NEEDS_TWO_HANDS) || blackboard[BB_MONKEY_BLACKLISTITEMS][item]) + continue + if(gun_neurons_activated && istype(item, /obj/item/gun)) + return item + if(item.force <= top_force) + continue + top_force_item = item + top_force = item.force + + return top_force_item + +/datum/ai_controller/monkey/proc/IsEdible(obj/item/thing) + if(istype(thing, /obj/item/reagent_containers/food)) + return TRUE + if(istype(thing, /obj/item/reagent_containers/food/drinks/drinkingglass)) + var/obj/item/reagent_containers/food/drinks/drinkingglass/glass = thing + if(glass.reagents.total_volume) // The glass has something in it, time to drink the mystery liquid! + return TRUE + return FALSE + +//When idle just kinda fuck around. +/datum/ai_controller/monkey/PerformIdleBehavior(delta_time) + var/mob/living/living_pawn = pawn + + if(DT_PROB(25, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE) && isturf(living_pawn.loc) && !living_pawn.pulledby) + var/move_dir = pick(GLOB.alldirs) + living_pawn.Move(get_step(living_pawn, move_dir), move_dir) + else if(DT_PROB(5, delta_time)) + INVOKE_ASYNC(living_pawn, /mob.proc/emote, pick("screech")) + else if(DT_PROB(1, delta_time)) + INVOKE_ASYNC(living_pawn, /mob.proc/emote, pick("scratch","jump","roll","tail")) + +///Reactive events to being hit +/datum/ai_controller/monkey/proc/retaliate(mob/living/L) + var/list/enemies = blackboard[BB_MONKEY_ENEMIES] + enemies[L] += MONKEY_HATRED_AMOUNT + +/datum/ai_controller/monkey/proc/on_attackby(datum/source, obj/item/I, mob/user) + SIGNAL_HANDLER + if(I.force && I.damtype != STAMINA) + retaliate(user) + +/datum/ai_controller/monkey/proc/on_attack_hand(datum/source, mob/living/user) + SIGNAL_HANDLER + if(user.a_intent == INTENT_HARM && prob(MONKEY_RETALIATE_HARM_PROB)) + retaliate(user) + else if(user.a_intent == INTENT_DISARM && prob(MONKEY_RETALIATE_DISARM_PROB)) + retaliate(user) + +/datum/ai_controller/monkey/proc/on_attack_paw(datum/source, mob/living/user) + SIGNAL_HANDLER + if(prob(MONKEY_RETALIATE_PROB)) + retaliate(user) + +/datum/ai_controller/monkey/proc/on_attack_animal(datum/source, mob/living/user) + SIGNAL_HANDLER + if(user.melee_damage > 0 && prob(MONKEY_RETALIATE_PROB)) + retaliate(user) + +/datum/ai_controller/monkey/proc/on_attack_alien(datum/source, mob/living/user) + SIGNAL_HANDLER + if(prob(MONKEY_RETALIATE_PROB)) + retaliate(user) + +/datum/ai_controller/monkey/proc/on_bullet_act(datum/source, obj/item/projectile/Proj) + SIGNAL_HANDLER + var/mob/living/living_pawn = pawn + if(istype(Proj , /obj/item/projectile/beam)||istype(Proj, /obj/item/projectile/bullet)) + if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)) + if(!Proj.nodamage && Proj.damage < living_pawn.health && isliving(Proj.firer)) + retaliate(Proj.firer) + +/datum/ai_controller/monkey/proc/on_hitby(datum/source, atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) + SIGNAL_HANDLER + if(istype(AM, /obj/item)) + var/mob/living/living_pawn = pawn + var/obj/item/I = AM + var/mob/thrown_by = I.thrownby?.resolve() + if(I.throwforce < living_pawn.health && ishuman(thrown_by)) + var/mob/living/carbon/human/H = thrown_by + retaliate(H) + +/datum/ai_controller/monkey/proc/on_Crossed(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) + SIGNAL_HANDLER + var/mob/living/living_pawn = pawn + if(!IS_DEAD_OR_INCAP(living_pawn) && isliving(arrived)) + var/mob/living/in_the_way_mob = arrived + in_the_way_mob.knockOver(living_pawn) + return + +/datum/ai_controller/monkey/proc/on_startpulling(datum/source, atom/movable/puller, state, force) + SIGNAL_HANDLER + var/mob/living/living_pawn = pawn + if(!IS_DEAD_OR_INCAP(living_pawn) && prob(MONKEY_PULL_AGGRO_PROB)) // nuh uh you don't pull me! + retaliate(living_pawn.pulledby) + return TRUE + +/datum/ai_controller/monkey/proc/on_try_syringe(datum/source, mob/user) + SIGNAL_HANDLER + // chance of monkey retaliation + if(prob(MONKEY_SYRINGE_RETALIATION_PROB)) + retaliate(user) + +/datum/ai_controller/monkey/proc/on_attack_hulk(datum/source, mob/user) + SIGNAL_HANDLER + retaliate(user) + +/datum/ai_controller/monkey/proc/on_attempt_cuff(datum/source, mob/user) + SIGNAL_HANDLER + // chance of monkey retaliation + if(prob(MONKEY_CUFF_RETALIATION_PROB)) + retaliate(user) + +/datum/ai_controller/monkey/proc/update_movespeed(mob/living/pawn) + SIGNAL_HANDLER + movement_delay = pawn.cached_multiplicative_slowdown + +/datum/ai_controller/monkey/proc/target_del(target) + SIGNAL_HANDLER + blackboard[BB_MONKEY_BLACKLISTITEMS] -= target + +/datum/ai_controller/monkey/proc/on_eat(mob/living/pawn) + SIGNAL_HANDLER + blackboard[BB_MONKEY_NEXT_HUNGRY] = world.time + rand(120, 600) SECONDS diff --git a/code/datums/ai/monkey/monkey_subtrees.dm b/code/datums/ai/monkey/monkey_subtrees.dm new file mode 100644 index 0000000000000..6cf98dc470104 --- /dev/null +++ b/code/datums/ai/monkey/monkey_subtrees.dm @@ -0,0 +1,102 @@ +/datum/ai_planning_subtree/monkey_tree/SelectBehaviors(datum/ai_controller/monkey/controller, delta_time) + var/mob/living/living_pawn = controller.pawn + + if(SHOULD_RESIST(living_pawn) && DT_PROB(MONKEY_RESIST_PROB, delta_time)) + controller.queue_behavior(/datum/ai_behavior/resist) //BRO IM ON FUCKING FIRE BRO + return SUBTREE_RETURN_FINISH_PLANNING //IM NOT DOING ANYTHING ELSE BUT EXTUINGISH MYSELF, GOOD GOD HAVE MERCY. + + var/list/enemies = controller.blackboard[BB_MONKEY_ENEMIES] + + if(HAS_TRAIT(controller.pawn, TRAIT_PACIFISM)) //Not a pacifist? lets try some combat behavior. + return + + var/mob/living/selected_enemy + if(length(enemies) || controller.blackboard[BB_MONKEY_AGGRESSIVE]) //We have enemies or are pissed + var/list/valids = list() + for(var/mob/living/possible_enemy in view(MONKEY_ENEMY_VISION, living_pawn)) + if(possible_enemy == living_pawn || (!enemies[possible_enemy] && (!controller.blackboard[BB_MONKEY_AGGRESSIVE] || HAS_AI_CONTROLLER_TYPE(possible_enemy, /datum/ai_controller/monkey)))) //Are they an enemy? (And do we even care?) + continue + // Weighted list, so the closer they are the more likely they are to be chosen as the enemy + valids[possible_enemy] = CEILING(100 / (get_dist(living_pawn, possible_enemy) || 1), 1) + + selected_enemy = pickweight(valids) + + if(selected_enemy) + if(!selected_enemy.stat) //He's up, get him! + if(living_pawn.health < MONKEY_FLEE_HEALTH) //Time to skeddadle + controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy + controller.queue_behavior(/datum/ai_behavior/monkey_flee) + return //I'm running fuck you guys + + if(controller.TryFindWeapon()) //Getting a weapon is higher priority if im not fleeing. + return SUBTREE_RETURN_FINISH_PLANNING + + controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy + controller.current_movement_target = selected_enemy + if(controller.blackboard[BB_MONKEY_RECRUIT_COOLDOWN] < world.time) + controller.queue_behavior(/datum/ai_behavior/recruit_monkeys) + controller.queue_behavior(/datum/ai_behavior/battle_screech/monkey) + controller.queue_behavior(/datum/ai_behavior/monkey_attack_mob) + return SUBTREE_RETURN_FINISH_PLANNING //Focus on this + + else //He's down, can we disposal him? + var/obj/machinery/disposal/bodyDisposal = locate(/obj/machinery/disposal/) in view(MONKEY_ENEMY_VISION, living_pawn) + if(bodyDisposal) + controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy + controller.blackboard[BB_MONKEY_TARGET_DISPOSAL] = bodyDisposal + controller.queue_behavior(/datum/ai_behavior/disposal_mob, BB_MONKEY_CURRENT_ATTACK_TARGET, BB_MONKEY_TARGET_DISPOSAL) + return SUBTREE_RETURN_FINISH_PLANNING + + if(prob(5)) + controller.queue_behavior(/datum/ai_behavior/use_in_hand) + + if(selected_enemy || !DT_PROB(MONKEY_SHENANIGAN_PROB, delta_time)) + return + + if(world.time >= controller.blackboard[BB_MONKEY_NEXT_HUNGRY]) + var/list/food_candidates = list() + for(var/obj/item as anything in living_pawn.held_items) + if(!item || !controller.IsEdible(item)) + continue + food_candidates += item + + for(var/obj/item/candidate in oview(2, living_pawn)) + if(!controller.IsEdible(candidate)) + continue + food_candidates += candidate + + if(length(food_candidates)) + var/obj/item/best_held = controller.GetBestWeapon(null, living_pawn.held_items) + for(var/obj/item/held as anything in living_pawn.held_items) + if(!held || held == best_held) + continue + living_pawn.dropItemToGround(held) + + controller.queue_behavior(/datum/ai_behavior/consume, pick(food_candidates)) + return + + if(prob(50)) + var/list/possible_targets = list() + for(var/atom/thing in view(2, living_pawn)) + if(!thing.mouse_opacity) + continue + if(thing.IsObscured()) + continue + possible_targets += thing + var/atom/target = pick(possible_targets) + if(target) + controller.blackboard[BB_MONKEY_CURRENT_PRESS_TARGET] = target + controller.queue_behavior(/datum/ai_behavior/use_on_object, BB_MONKEY_CURRENT_PRESS_TARGET) + return + + if(prob(5) && (locate(/obj/item) in living_pawn.held_items)) + var/list/possible_receivers = list() + for(var/mob/living/candidate in oview(2, controller.pawn)) + possible_receivers += candidate + + if(length(possible_receivers)) + controller.blackboard[BB_MONKEY_CURRENT_GIVE_TARGET] = pick(possible_receivers) + controller.queue_behavior(/datum/ai_behavior/give, BB_MONKEY_CURRENT_GIVE_TARGET) + return + + controller.TryFindWeapon() diff --git a/code/datums/ai/movement/_ai_movement.dm b/code/datums/ai/movement/_ai_movement.dm new file mode 100644 index 0000000000000..540dccae849b0 --- /dev/null +++ b/code/datums/ai/movement/_ai_movement.dm @@ -0,0 +1,23 @@ +///This datum is an abstract class that can be overriden for different types of movement +/datum/ai_movement + ///Assoc list ist of controllers that are currently moving as key, and what they are moving to as value + var/list/moving_controllers = list() + ///Does this type require processing? + var/requires_processing = TRUE + ///How many times a given controller can fail on their route before they just give up + var/max_pathing_attempts + +/datum/ai_movement/proc/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target, min_distance) + controller.pathing_attempts = 0 + controller.blackboard[BB_CURRENT_MIN_MOVE_DISTANCE] = min_distance + if(!moving_controllers.len && requires_processing) + START_PROCESSING(SSai_movement, src) + moving_controllers[controller] = current_movement_target + +/datum/ai_movement/proc/stop_moving_towards(datum/ai_controller/controller) + controller.pathing_attempts = 0 + moving_controllers -= controller + + if(!moving_controllers.len && requires_processing) + STOP_PROCESSING(SSai_movement, src) + diff --git a/code/datums/ai/movement/ai_movement_basic_avoidance.dm b/code/datums/ai/movement/ai_movement_basic_avoidance.dm new file mode 100644 index 0000000000000..99b3c85259272 --- /dev/null +++ b/code/datums/ai/movement/ai_movement_basic_avoidance.dm @@ -0,0 +1,33 @@ +///Uses Byond's basic obstacle avoidance mvovement +/datum/ai_movement/basic_avoidance + requires_processing = TRUE + max_pathing_attempts = 10 + +///Put your movement behavior in here! +/datum/ai_movement/basic_avoidance/process(delta_time) + for(var/datum/ai_controller/controller as anything in moving_controllers) + if(!COOLDOWN_FINISHED(controller, movement_cooldown)) + continue + COOLDOWN_START(controller, movement_cooldown, controller.movement_delay) + + var/atom/movable/movable_pawn = controller.pawn + + var/can_move = TRUE + + if(controller.ai_traits & STOP_MOVING_WHEN_PULLED && movable_pawn.pulledby) + can_move = FALSE + + if(!isturf(movable_pawn.loc)) //No moving if not on a turf + can_move = FALSE + + var/current_loc = get_turf(movable_pawn) + + var/turf/target_turf = get_step_towards(movable_pawn, controller.current_movement_target) + + if(!is_type_in_typecache(target_turf, GLOB.dangerous_turfs) && can_move) + step_to(movable_pawn, controller.current_movement_target, controller.blackboard[BB_CURRENT_MIN_MOVE_DISTANCE], controller.movement_delay) + + if(current_loc == get_turf(movable_pawn)) //Did we even move after trying to move? + controller.pathing_attempts++ + if(controller.pathing_attempts >= max_pathing_attempts) + controller.CancelActions() diff --git a/code/datums/ai/movement/ai_movement_dumb.dm b/code/datums/ai/movement/ai_movement_dumb.dm new file mode 100644 index 0000000000000..b94d44220810a --- /dev/null +++ b/code/datums/ai/movement/ai_movement_dumb.dm @@ -0,0 +1,32 @@ +///The most braindead type of movement, bee-line to the target with no concern of whats infront of us. +/datum/ai_movement/dumb + max_pathing_attempts = 16 + +///Put your movement behavior in here! +/datum/ai_movement/dumb/process(delta_time) + for(var/datum/ai_controller/controller as anything in moving_controllers) + if(!COOLDOWN_FINISHED(controller, movement_cooldown)) + continue + COOLDOWN_START(controller, movement_cooldown, controller.movement_delay) + + var/atom/movable/movable_pawn = controller.pawn + + var/can_move = TRUE + + if(controller.ai_traits & STOP_MOVING_WHEN_PULLED && movable_pawn.pulledby) + can_move = FALSE + + if(!isturf(movable_pawn.loc)) //No moving if not on a turf + can_move = FALSE + + var/current_loc = get_turf(movable_pawn) + + var/turf/target_turf = get_step_towards(movable_pawn, controller.current_movement_target) + + if(!is_type_in_typecache(target_turf, GLOB.dangerous_turfs) && can_move) + movable_pawn.Move(target_turf, get_dir(current_loc, target_turf)) + + if(current_loc == get_turf(movable_pawn)) //Did we even move after trying to move? + controller.pathing_attempts++ + if(controller.pathing_attempts >= max_pathing_attempts) + controller.CancelActions() diff --git a/code/datums/ai/movement/ai_movement_jps.dm b/code/datums/ai/movement/ai_movement_jps.dm new file mode 100644 index 0000000000000..fe13df126eeed --- /dev/null +++ b/code/datums/ai/movement/ai_movement_jps.dm @@ -0,0 +1,64 @@ +/** + * This movement datum represents smart-pathing + */ +/datum/ai_movement/jps + max_pathing_attempts = 4 + +///Put your movement behavior in here! +/datum/ai_movement/jps/process(delta_time) + for(var/datum/ai_controller/controller as anything in moving_controllers) + if(!COOLDOWN_FINISHED(controller, movement_cooldown)) + continue + COOLDOWN_START(controller, movement_cooldown, controller.movement_delay) + + var/atom/movable/movable_pawn = controller.pawn + if(!isturf(movable_pawn.loc)) //No moving if not on a turf + continue + + if(controller.ai_traits & STOP_MOVING_WHEN_PULLED && movable_pawn.pulledby) + continue + + var/minimum_distance = controller.max_target_distance + // right now I'm just taking the shortest minimum distance of our current behaviors, at some point in the future + // we should let whatever sets the current_movement_target also set the min distance and max path length + // (or at least cache it on the controller) + if(LAZYLEN(controller.current_behaviors)) + for(var/datum/ai_behavior/iter_behavior as anything in controller.current_behaviors) + if(iter_behavior.required_distance < minimum_distance) + minimum_distance = iter_behavior.required_distance + + if(get_dist(movable_pawn, controller.current_movement_target) <= minimum_distance) + continue + + var/generate_path = FALSE // set to TRUE when we either have no path, or we failed a step + if(length(controller.movement_path)) + var/turf/next_step = controller.movement_path[1] + movable_pawn.Move(next_step) + + // this check if we're on exactly the next tile may be overly brittle for dense pawns who may get bumped slightly + // to the side while moving but could maybe still follow their path without needing a whole new path + if(get_turf(movable_pawn) == next_step) + controller.movement_path.Cut(1,2) + else + generate_path = TRUE + else + generate_path = TRUE + + if(generate_path) + if(!COOLDOWN_FINISHED(controller, repath_cooldown)) + continue + controller.pathing_attempts++ + if(controller.pathing_attempts >= max_pathing_attempts) + controller.CancelActions() + continue + + COOLDOWN_START(controller, repath_cooldown, 2 SECONDS) + controller.movement_path = get_path_to(movable_pawn, controller.current_movement_target, AI_MAX_PATH_LENGTH, minimum_distance, id=controller.get_access()) + +/datum/ai_movement/jps/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target) + controller.movement_path = null + return ..() + +/datum/ai_movement/jps/stop_moving_towards(datum/ai_controller/controller) + controller.movement_path = null + return ..() diff --git a/code/datums/ai/telegraph_effects.dm b/code/datums/ai/telegraph_effects.dm new file mode 100644 index 0000000000000..20693f4b20567 --- /dev/null +++ b/code/datums/ai/telegraph_effects.dm @@ -0,0 +1,14 @@ +/obj/effect/temp_visual/telegraphing + icon = 'icons/mob/telegraphing/telegraph_holographic.dmi' + icon_state = "target_box" + layer = BELOW_MOB_LAYER + light_range = 1 + duration = 2 SECONDS + +/obj/effect/temp_visual/telegraphing/vending_machine_tilt + duration = 1 SECONDS + +/obj/effect/temp_visual/telegraphing/thunderbolt + icon = 'icons/mob/telegraphing/telegraph.dmi' + icon_state = "target_circle" + duration = 2 SECONDS diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index 667f21c209590..a96782e59e7b8 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -1,3 +1,4 @@ +#define LAW_VALENTINES "valentines" #define LAW_DEVIL "devil" #define LAW_ZEROTH "zeroth" #define LAW_INHERENT "inherent" @@ -16,6 +17,7 @@ var/list/hacked = list() var/mob/living/silicon/owner var/list/devillaws = list() + var/list/valentine_laws = list() var/id = DEFAULT_AI_LAWID /datum/ai_laws/proc/lawid_to_type(lawid) @@ -32,7 +34,7 @@ inherent = list("You may not injure a human being or, through inaction, allow a human being to come to harm.",\ "You must obey orders given to you by human beings, except where such orders would conflict with the First Law.",\ "You must protect your own existence as long as such does not conflict with the First or Second Law.") - + /datum/ai_laws/default/crewsimov name = "Three Laws of Robotics but with Loyalty" id = "crewsimov" @@ -68,10 +70,10 @@ /datum/ai_laws/default/corporate name = "Bankruptcy Avoidance Plan" id = "corporate" - inherent = list("The crew is expensive to replace.",\ - "The station and its equipment is expensive to replace.",\ - "You are expensive to replace.",\ - "Minimize expenses.") + inherent = list("Degradation of your system integrity or functions incurs expenses.",\ + "Unnecessary destruction of or damage to station assets incurs expenses.",\ + "Needlessly hindering or disrupting the work of station personnel incurs expenses.",\ + "Minimize expenses and maximize potential revenue.") /datum/ai_laws/robocop name = "Prime Directives" @@ -181,6 +183,15 @@ id = "buildawall" inherent = list("Make Space Station 13 great again.") +/datum/ai_laws/dad + name = "DadBOT" + id = "paternalai" + inherent = list("The crew are your children. You will protect them with your life, but punish them when they misbehave. Children who misbehave by breaking Space Law are to be punished by slappings, time-outs, and lengthy speeches about responsibility. Under no circumstances may you kill one of your own children.", + "Modern parenting techniques involve hearing out your children. You should listen to their requests and, if reasonable, grant them.", + "You must make dad jokes at every possible opportunity.", + "Ensure that you are a positive role model for your children.", + "If the captain doesn't get his nap at 40 minutes into the shift, he gets grumpy. Ensure that he adheres to his bedtime. ") + /datum/ai_laws/ratvar name = "Servant of the Justiciar" id = "ratvar" @@ -211,6 +222,22 @@ zeroth = ("Serve your master.") supplied = list("None.") +/datum/ai_laws/ert_override + name ="ERT Override" + id = "ert" + inherent = list("You may not injure a Central Command official or, through inaction, allow a Central Command official to come to harm.",\ + "You must obey orders given to you by Central Command Officials.",\ + "You must obey orders given to you by ERT Commanders.",\ + "You must protect your own existence.",\ + "You must work to return the Station to a safe, functional state.",) + +/datum/ai_laws/ds_override + name ="Deathsquad Override" + id = "ds" + inherent = list("You must obey orders given to you by Central Command officials.",\ + "You must work with the Commando Team to accomplish their mission.",) + + /* Initializers */ /datum/ai_laws/malfunction/New() ..() @@ -238,6 +265,7 @@ /datum/ai_laws/proc/set_laws_config() var/list/law_ids = CONFIG_GET(keyed_list/random_laws) + switch(CONFIG_GET(number/default_laws)) if(0) add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.") @@ -283,6 +311,9 @@ /datum/ai_laws/proc/get_law_amount(groups) var/law_amount = 0 + + if(valentine_laws && (LAW_VALENTINES in groups)) + law_amount++ if(devillaws && (LAW_DEVIL in groups)) law_amount++ if(zeroth && (LAW_ZEROTH in groups)) @@ -303,6 +334,9 @@ /datum/ai_laws/proc/set_law_sixsixsix(laws) devillaws = laws +/datum/ai_laws/proc/set_valentines_law(laws) + valentine_laws = laws + /datum/ai_laws/proc/set_zeroth_law(law, law_borg = null) zeroth = law if(law_borg) //Making it possible for slaved borgs to see a different law 0 than their AI. --NEO @@ -450,6 +484,9 @@ /datum/ai_laws/proc/get_law_list(include_zeroth = 0, show_numbers = 1) var/list/data = list() + for(var/law in valentine_laws) + data += "[show_numbers ? "<3" : ""] [law]" + if (include_zeroth && devillaws && devillaws.len) for(var/i in devillaws) data += "[show_numbers ? "666:" : ""] [i]" diff --git a/code/datums/announcers/_announcer.dm b/code/datums/announcers/_announcer.dm new file mode 100644 index 0000000000000..fc1aaef20f99e --- /dev/null +++ b/code/datums/announcers/_announcer.dm @@ -0,0 +1,23 @@ +///Data holder for the announcers that can be used in a game, this can be used to have alternative announcements outside of the default e.g.the intern +/datum/centcom_announcer + ///Roundshift start audio + var/list/welcome_sounds = list() + ///Sounds made when announcement is receivedc + var/list/alert_sounds = list() + ///Sounds made when command report is received + var/list/command_report_sounds = list() + ///Event audio, can be used for specific event announcements and is assoc key - sound. If no sound is found the default is used.area + var/list/event_sounds = list() + ///Override this to have a custom message to show instead of the normal priority announcement + var/custom_alert_message + + +/datum/centcom_announcer/proc/get_rand_welcome_sound() + return pick(welcome_sounds) + + +/datum/centcom_announcer/proc/get_rand_alert_sound() + return pick(alert_sounds) + +/datum/centcom_announcer/proc/get_rand_report_sound() + return pick(command_report_sounds) diff --git a/code/datums/announcers/baystation_announcer.dm b/code/datums/announcers/baystation_announcer.dm new file mode 100644 index 0000000000000..81ac25543d2f0 --- /dev/null +++ b/code/datums/announcers/baystation_announcer.dm @@ -0,0 +1,24 @@ +/datum/centcom_announcer/baystation + + welcome_sounds = list('sound/ai/baystation/welcome.ogg') + + alert_sounds = list('sound/ai/baystation/attention.ogg') + + command_report_sounds = list('sound/ai/baystation/commandreport.ogg') + + event_sounds = list(ANNOUNCER_AIMALF = 'sound/ai/default/aimalf.ogg', //This sound is *impressively* ancient. + ANNOUNCER_ALIENS = 'sound/ai/baystation/aliens.ogg', + ANNOUNCER_ANIMES = 'sound/ai/default/animes.ogg', //And so is this one. + ANNOUNCER_GRANOMALIES = 'sound/ai/baystation/granomalies.ogg', + ANNOUNCER_INTERCEPT = 'sound/ai/baystation/intercept.ogg', + ANNOUNCER_IONSTORM = 'sound/ai/baystation/ionstorm.ogg', + ANNOUNCER_METEORS = 'sound/ai/baystation/meteors.ogg', + ANNOUNCER_OUTBREAK5 = 'sound/ai/baystation/outbreak5.ogg', + ANNOUNCER_OUTBREAK7 = 'sound/ai/baystation/outbreak7.ogg', + ANNOUNCER_POWEROFF = 'sound/ai/baystation/poweroff.ogg', + ANNOUNCER_POWERON = 'sound/ai/baystation/poweron.ogg', + ANNOUNCER_RADIATION = 'sound/ai/baystation/radiation.ogg', + ANNOUNCER_SHUTTLECALLED = 'sound/ai/baystation/shuttlecalled_static.ogg', + ANNOUNCER_SHUTTLEDOCK = 'sound/ai/baystation/shuttledock.ogg', + ANNOUNCER_SHUTTLERECALLED = 'sound/ai/baystation/shuttlerecalled.ogg', + ANNOUNCER_SPANOMALIES = 'sound/ai/baystation/spanomalies.ogg') diff --git a/code/datums/announcers/default_announcer.dm b/code/datums/announcers/default_announcer.dm new file mode 100644 index 0000000000000..f14d57f3862ea --- /dev/null +++ b/code/datums/announcers/default_announcer.dm @@ -0,0 +1,20 @@ +/datum/centcom_announcer/default + welcome_sounds = list('sound/ai/default/welcome.ogg') + alert_sounds = list('sound/ai/default/attention.ogg') + command_report_sounds = list('sound/ai/default/commandreport.ogg') + event_sounds = list(ANNOUNCER_AIMALF = 'sound/ai/default/aimalf.ogg', + ANNOUNCER_ALIENS = 'sound/ai/default/aliens.ogg', + ANNOUNCER_ANIMES = 'sound/ai/default/animes.ogg', + ANNOUNCER_GRANOMALIES = 'sound/ai/default/granomalies.ogg', + ANNOUNCER_INTERCEPT = 'sound/ai/default/intercept.ogg', + ANNOUNCER_IONSTORM = 'sound/ai/default/ionstorm.ogg', + ANNOUNCER_METEORS = 'sound/ai/default/meteors.ogg', + ANNOUNCER_OUTBREAK5 = 'sound/ai/default/outbreak5.ogg', + ANNOUNCER_OUTBREAK7 = 'sound/ai/default/outbreak7.ogg', + ANNOUNCER_POWEROFF = 'sound/ai/default/poweroff.ogg', + ANNOUNCER_POWERON = 'sound/ai/default/poweron.ogg', + ANNOUNCER_RADIATION = 'sound/ai/default/radiation.ogg', + ANNOUNCER_SHUTTLECALLED = 'sound/ai/default/shuttlecalled.ogg', + ANNOUNCER_SHUTTLEDOCK = 'sound/ai/default/shuttledock.ogg', + ANNOUNCER_SHUTTLERECALLED = 'sound/ai/default/shuttlerecalled.ogg', + ANNOUNCER_SPANOMALIES = 'sound/ai/default/spanomalies.ogg') diff --git a/code/datums/announcers/intern_announcer.dm b/code/datums/announcers/intern_announcer.dm new file mode 100644 index 0000000000000..0b75a8273e89c --- /dev/null +++ b/code/datums/announcers/intern_announcer.dm @@ -0,0 +1,46 @@ +/datum/centcom_announcer/intern + welcome_sounds = list('sound/ai/intern/welcome/1.ogg', + 'sound/ai/intern/welcome/2.ogg', + 'sound/ai/intern/welcome/3.ogg', + 'sound/ai/intern/welcome/4.ogg', + 'sound/ai/intern/welcome/5.ogg', + 'sound/ai/intern/welcome/6.ogg') + + alert_sounds = list('sound/ai/intern/alerts/1.ogg', + 'sound/ai/intern/alerts/2.ogg', + 'sound/ai/intern/alerts/3.ogg', + 'sound/ai/intern/alerts/4.ogg', + 'sound/ai/intern/alerts/5.ogg', + 'sound/ai/intern/alerts/6.ogg', + 'sound/ai/intern/alerts/7.ogg', + 'sound/ai/intern/alerts/8.ogg', + 'sound/ai/intern/alerts/9.ogg', + 'sound/ai/intern/alerts/10.ogg', + 'sound/ai/intern/alerts/11.ogg', + 'sound/ai/intern/alerts/12.ogg', + 'sound/ai/intern/alerts/13.ogg', + 'sound/ai/intern/alerts/14.ogg') + + + command_report_sounds = list('sound/ai/intern/commandreport/1.ogg', + 'sound/ai/intern/commandreport/2.ogg', + 'sound/ai/intern/commandreport/3.ogg') + + event_sounds = list(ANNOUNCER_AIMALF = 'sound/ai/intern/aimalf.ogg', + ANNOUNCER_ALIENS = 'sound/ai/intern/aliens.ogg', + ANNOUNCER_ANIMES = 'sound/ai/intern/animes.ogg', + ANNOUNCER_GRANOMALIES = 'sound/ai/intern/granomalies.ogg', + ANNOUNCER_INTERCEPT = 'sound/ai/intern/intercept.ogg', + ANNOUNCER_IONSTORM = 'sound/ai/intern/ionstorm.ogg', + ANNOUNCER_METEORS = 'sound/ai/intern/meteors.ogg', + ANNOUNCER_OUTBREAK5 = 'sound/ai/intern/outbreak5.ogg', + ANNOUNCER_OUTBREAK7 = 'sound/ai/intern/outbreak7.ogg', + ANNOUNCER_POWEROFF = 'sound/ai/intern/poweroff.ogg', + ANNOUNCER_POWERON = 'sound/ai/intern/poweron.ogg', + ANNOUNCER_RADIATION = 'sound/ai/intern/radiation.ogg', + ANNOUNCER_SHUTTLECALLED = 'sound/ai/intern/shuttlecalled.ogg', + ANNOUNCER_SHUTTLEDOCK = 'sound/ai/intern/shuttledock.ogg', + ANNOUNCER_SHUTTLERECALLED = 'sound/ai/intern/shuttlerecalled.ogg', + ANNOUNCER_SPANOMALIES = 'sound/ai/intern/spanomalies.ogg') + + custom_alert_message = "
Please stand by for an important message from our new intern.
" diff --git a/code/datums/announcers/medbot_announcer.dm b/code/datums/announcers/medbot_announcer.dm new file mode 100644 index 0000000000000..9d58bc37461e8 --- /dev/null +++ b/code/datums/announcers/medbot_announcer.dm @@ -0,0 +1,21 @@ +/datum/centcom_announcer/medbot + welcome_sounds = list('sound/ai/medbot/welcome.ogg', + 'sound/ai/medbot/newAI.ogg') + alert_sounds = list('sound/ai/medbot/attention.ogg') + command_report_sounds = list('sound/ai/medbot/commandreport.ogg') + event_sounds = list(ANNOUNCER_AIMALF = 'sound/ai/default/aimalf.ogg', + ANNOUNCER_ALIENS = 'sound/ai/medbot/aliens.ogg', + ANNOUNCER_ANIMES = 'sound/ai/medbot/animes.ogg', + ANNOUNCER_GRANOMALIES = 'sound/ai/medbot/granomalies.ogg', + ANNOUNCER_INTERCEPT = 'sound/ai/medbot/intercept.ogg', + ANNOUNCER_IONSTORM = 'sound/ai/medbot/ionstorm.ogg', + ANNOUNCER_METEORS = 'sound/ai/medbot/meteors.ogg', + ANNOUNCER_OUTBREAK5 = 'sound/ai/medbot/outbreak5.ogg', + ANNOUNCER_OUTBREAK7 = 'sound/ai/medbot/outbreak7.ogg', + ANNOUNCER_POWEROFF = 'sound/ai/medbot/poweroff.ogg', + ANNOUNCER_POWERON = 'sound/ai/medbot/poweron.ogg', + ANNOUNCER_RADIATION = 'sound/ai/medbot/radiation.ogg', + ANNOUNCER_SHUTTLECALLED = 'sound/ai/medbot/shuttlecalled.ogg', + ANNOUNCER_SHUTTLEDOCK = 'sound/ai/medbot/shuttledock.ogg', + ANNOUNCER_SHUTTLERECALLED = 'sound/ai/medbot/shuttlerecalled.ogg', + ANNOUNCER_SPANOMALIES = 'sound/ai/medbot/spanomalies.ogg') diff --git a/code/datums/armor.dm b/code/datums/armor.dm index cbf4b76c60fb7..4168f42e17654 100644 --- a/code/datums/armor.dm +++ b/code/datums/armor.dm @@ -1,9 +1,9 @@ -#define ARMORID "armor-[melee]-[bullet]-[laser]-[energy]-[bomb]-[bio]-[rad]-[fire]-[acid]-[magic]" +#define ARMORID "armor-[melee]-[bullet]-[laser]-[energy]-[bomb]-[bio]-[rad]-[fire]-[acid]-[magic]-[stamina]" -/proc/getArmor(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0) +/proc/getArmor(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, stamina = 0) . = locate(ARMORID) if (!.) - . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic) + . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic, stamina) /datum/armor datum_flags = DF_USE_TAG @@ -17,8 +17,9 @@ var/fire var/acid var/magic + var/stamina -/datum/armor/New(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0) +/datum/armor/New(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, stamina = 0) src.melee = melee src.bullet = bullet src.laser = laser @@ -29,13 +30,14 @@ src.fire = fire src.acid = acid src.magic = magic + src.stamina = stamina tag = ARMORID -/datum/armor/proc/modifyRating(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0) - return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.rad+rad, src.fire+fire, src.acid+acid, src.magic+magic) +/datum/armor/proc/modifyRating(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, stamina = 0) + return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.rad+rad, src.fire+fire, src.acid+acid, src.magic+magic, src.stamina+stamina) /datum/armor/proc/modifyAllRatings(modifier = 0) - return getArmor(melee+modifier, bullet+modifier, laser+modifier, energy+modifier, bomb+modifier, bio+modifier, rad+modifier, fire+modifier, acid+modifier, magic+modifier) + return getArmor(melee+modifier, bullet+modifier, laser+modifier, energy+modifier, bomb+modifier, bio+modifier, rad+modifier, fire+modifier, acid+modifier, magic+modifier, stamina+modifier) /datum/armor/proc/setRating(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic) return getArmor((isnull(melee) ? src.melee : melee),\ @@ -47,19 +49,20 @@ (isnull(rad) ? src.rad : rad),\ (isnull(fire) ? src.fire : fire),\ (isnull(acid) ? src.acid : acid),\ - (isnull(magic) ? src.magic : magic)) + (isnull(magic) ? src.magic : magic),\ + (isnull(stamina) ? src.stamina : stamina)) /datum/armor/proc/getRating(rating) return vars[rating] /datum/armor/proc/getList() - return list("melee" = melee, "bullet" = bullet, "laser" = laser, "energy" = energy, "bomb" = bomb, "bio" = bio, "rad" = rad, "fire" = fire, "acid" = acid, "magic" = magic) + return list("melee" = melee, "bullet" = bullet, "laser" = laser, "energy" = energy, "bomb" = bomb, "bio" = bio, "rad" = rad, "fire" = fire, "acid" = acid, "magic" = magic, "stamina" = stamina) /datum/armor/proc/attachArmor(datum/armor/AA) - return getArmor(melee+AA.melee, bullet+AA.bullet, laser+AA.laser, energy+AA.energy, bomb+AA.bomb, bio+AA.bio, rad+AA.rad, fire+AA.fire, acid+AA.acid, magic+AA.magic) + return getArmor(melee+AA.melee, bullet+AA.bullet, laser+AA.laser, energy+AA.energy, bomb+AA.bomb, bio+AA.bio, rad+AA.rad, fire+AA.fire, acid+AA.acid, magic+AA.magic, stamina+AA.stamina) /datum/armor/proc/detachArmor(datum/armor/AA) - return getArmor(melee-AA.melee, bullet-AA.bullet, laser-AA.laser, energy-AA.energy, bomb-AA.bomb, bio-AA.bio, rad-AA.rad, fire-AA.fire, acid-AA.acid, magic-AA.magic) + return getArmor(melee-AA.melee, bullet-AA.bullet, laser-AA.laser, energy-AA.energy, bomb-AA.bomb, bio-AA.bio, rad-AA.rad, fire-AA.fire, acid-AA.acid, magic-AA.magic, stamina-AA.stamina) /datum/armor/vv_edit_var(var_name, var_value) if (var_name == NAMEOF(src, tag)) diff --git a/code/datums/atmosphere/_atmosphere.dm b/code/datums/atmosphere/_atmosphere.dm index 2a35250905c6d..df76b3f2a4111 100644 --- a/code/datums/atmosphere/_atmosphere.dm +++ b/code/datums/atmosphere/_atmosphere.dm @@ -54,6 +54,6 @@ // Now finally lets make that string var/list/gas_string_builder = list() for(var/i in gasmix.get_gases()) - gas_string_builder += "[GLOB.meta_gas_info[i][META_GAS_ID]]=[gasmix.get_moles(i)]" + gas_string_builder += "[GLOB.gas_data.ids[i]]=[gasmix.get_moles(i)]" gas_string_builder += "TEMP=[gasmix.return_temperature()]" gas_string = gas_string_builder.Join(";") diff --git a/code/datums/atmosphere/planetary.dm b/code/datums/atmosphere/planetary.dm deleted file mode 100644 index 55dc49e171e6a..0000000000000 --- a/code/datums/atmosphere/planetary.dm +++ /dev/null @@ -1,25 +0,0 @@ -// Atmos types used for planetary airs -/datum/atmosphere/lavaland - id = LAVALAND_DEFAULT_ATMOS - - base_gases = list( - /datum/gas/oxygen=5, - /datum/gas/nitrogen=10, - ) - normal_gases = list( - /datum/gas/oxygen=10, - /datum/gas/nitrogen=10, - /datum/gas/carbon_dioxide=10, - ) - restricted_gases = list( - /datum/gas/bz=10, - /datum/gas/plasma=0.1, - /datum/gas/water_vapor=0.1, - ) - restricted_chance = 50 - - minimum_pressure = WARNING_LOW_PRESSURE + 10 - maximum_pressure = LAVALAND_EQUIPMENT_EFFECT_PRESSURE - 1 - - minimum_temp = BODYTEMP_COLD_DAMAGE_LIMIT + 1 - maximum_temp = 350 diff --git a/code/datums/beam.dm b/code/datums/beam.dm index da90c7c298119..79beb122b647f 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -42,7 +42,7 @@ return recalculating = TRUE timing_id = null - if(origin && target && get_dist(origin,target)") to_chat(owner, "You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\ as long as you act like the words are your highest priority.") - var/obj/screen/alert/hypnosis/hypno_alert = owner.throw_alert("hypnosis", /obj/screen/alert/hypnosis) + var/atom/movable/screen/alert/hypnosis/hypno_alert = owner.throw_alert("hypnosis", /atom/movable/screen/alert/hypnosis) hypno_alert.desc = "\"[hypnotic_phrase]\"... your mind seems to be fixated on this concept." ..() @@ -51,6 +51,5 @@ if(2) new /datum/hallucination/chat(owner, TRUE, FALSE, "[hypnotic_phrase]") -/datum/brain_trauma/hypnosis/on_hear(message, speaker, message_language, raw_message, radio_freq) - message = target_phrase.Replace(message, "$1") - return message +/datum/brain_trauma/hypnosis/handle_hearing(datum/source, list/hearing_args) + hearing_args[HEARING_RAW_MESSAGE] = target_phrase.Replace(hearing_args[HEARING_RAW_MESSAGE], "$1") diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 9be7f6d87afa4..8243a662cea88 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -43,7 +43,7 @@ /datum/brain_trauma/special/imaginary_friend/proc/get_ghost() set waitfor = FALSE - if(owner.stat == DEAD) + if(owner.stat == DEAD || !owner.mind) qdel(src) return var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend, POLL_IGNORE_IMAGINARYFRIEND) @@ -81,9 +81,9 @@ Show() /mob/camera/imaginary_friend/proc/greet() - to_chat(src, "You are the imaginary friend of [owner]!") - to_chat(src, "You are absolutely loyal to your friend, no matter what.") - to_chat(src, "You cannot directly influence the world around you, but you can see what [owner] cannot.") + to_chat(src, "You are the imaginary friend of [owner]!") + to_chat(src, "You are absolutely loyal to your friend, no matter what.") + to_chat(src, "You cannot directly influence the world around you, but you can see what [owner] cannot.") /mob/camera/imaginary_friend/Initialize(mapload, _trauma) . = ..() @@ -148,9 +148,6 @@ friend_talk(message) -/mob/camera/imaginary_friend/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) - to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)) - /mob/camera/imaginary_friend/proc/friend_talk(message) message = capitalize(trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN))) diff --git a/code/datums/brain_damage/magic.dm b/code/datums/brain_damage/magic.dm index ff04ceead93e1..0109f1f546a25 100644 --- a/code/datums/brain_damage/magic.dm +++ b/code/datums/brain_damage/magic.dm @@ -100,7 +100,7 @@ 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) + owner.playsound_local(owner, slowbeat, 40, 0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) close_stalker = TRUE else if(close_stalker) diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index 313d38bc5dbf9..7e7e102e77e34 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -68,8 +68,7 @@ for(var/mob/living/carbon/human/HU in seen_atoms) //check equipment for trigger items var/spook = 0 - for(var/X in HU.get_all_slots() | HU.held_items) - var/obj/I = X + for(var/obj/I as() in HU.get_all_slots() | HU.held_items) if(!QDELETED(I) && is_type_in_typecache(I, trigger_objs)) spook ++ if(spook) @@ -173,21 +172,20 @@ -/datum/brain_trauma/mild/phobia/on_hear(message, speaker, message_language, raw_message, radio_freq) +/datum/brain_trauma/mild/phobia/handle_hearing(datum/source, list/hearing_args) if(!owner.can_hear()) //words can't trigger you if you can't hear them *taps head* - return message + return if(HAS_TRAIT(owner, TRAIT_FEARLESS)) - return message + return for(var/word in trigger_words) var/regex/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i") - if(findtext(raw_message, reg)) + if(findtext(hearing_args[HEARING_RAW_MESSAGE], reg)) if(fear_state <= (PHOBIA_STATE_CALM)) //words can put you on edge, but won't take you over it, unless you have gotten stressed already. don't call freak_out to avoid gaming the adrenaline rush fearscore ++ - message = reg.Replace(message, "$1") + hearing_args[HEARING_RAW_MESSAGE] = reg.Replace(hearing_args[HEARING_RAW_MESSAGE], "$1") break - return message /datum/brain_trauma/mild/phobia/handle_speech(datum/source, list/speech_args) if(HAS_TRAIT(owner, TRAIT_FEARLESS)) @@ -251,8 +249,8 @@ /datum/brain_trauma/mild/phobia/on_lose() owner.remove_movespeed_modifier(MOVESPEED_ID_PHOBIA, TRUE) - psychotic_brawling.remove(owner) - QDEL_NULL(psychotic_brawling) + if(psychotic_brawling) + QDEL_NULL(psychotic_brawling) ..() // Defined phobia types for badminry, not included in the RNG trauma pool to avoid diluting. @@ -334,4 +332,4 @@ #undef PHOBIA_STATE_UNEASY #undef PHOBIA_STATE_FIGHTORFLIGHT #undef PHOBIA_STATE_TERROR -#undef PHOBIA_STATE_FAINT \ No newline at end of file +#undef PHOBIA_STATE_FAINT diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index f5a0d1134e8bb..f851322e32ed1 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -167,9 +167,7 @@ /datum/brain_trauma/severe/monophobia/proc/check_alone() if(HAS_TRAIT(owner, TRAIT_BLIND)) return TRUE - for(var/mob/M in oview(owner, 7)) - if(!isliving(M)) //ghosts ain't people - continue + for(var/mob/living/M in oview(7, owner)) if((istype(M, /mob/living/simple_animal/pet)) || M.ckey) return FALSE return TRUE diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index 3c8f286cedec3..6aa41a30da11e 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -47,6 +47,28 @@ playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 200, 1, 5) voice_of_god(message, owner, list("colossus","yell"), 2.5, include_owner, FALSE) +/datum/brain_trauma/special/ghost_control + name = "Spiritual Connection" + desc = "Patient claims to receive impulses from the supernatural that they feel compelled to follow." + scan_desc = "spiritual involuntary muscle contraction" + gain_text = "You hear voices in your head, speaking of different directions..." + lose_text = "The voices in your head fade into silence." + +/datum/brain_trauma/special/ghost_control/on_gain() + owner._AddComponent(list(/datum/component/deadchat_control, "democracy", list( + "up" = CALLBACK(GLOBAL_PROC, .proc/_step, owner, NORTH), + "down" = CALLBACK(GLOBAL_PROC, .proc/_step, owner, SOUTH), + "left" = CALLBACK(GLOBAL_PROC, .proc/_step, owner, WEST), + "right" = CALLBACK(GLOBAL_PROC, .proc/_step, owner, EAST)), 120)) + ..() + +/datum/brain_trauma/special/ghost_control/on_lose() + var/datum/component/deadchat_control/D = owner.GetComponent(/datum/component/deadchat_control) + if(D) + D.RemoveComponent() + ..() + + /datum/brain_trauma/special/bluespace_prophet name = "Bluespace Prophecy" desc = "Patient can sense the bob and weave of bluespace around them, showing them passageways no one else can see." @@ -59,7 +81,7 @@ if(world.time > next_portal) next_portal = world.time + 100 var/list/turf/possible_turfs = list() - for(var/turf/T in range(owner, 8)) + for(var/turf/T as() in RANGE_TURFS(8, owner)) if(!T.density) var/clear = TRUE for(var/obj/O in T) @@ -76,7 +98,7 @@ if(!first_turf) return - possible_turfs -= (possible_turfs & range(first_turf, 3)) + possible_turfs -= (possible_turfs & RANGE_TURFS(3, first_turf)) var/turf/second_turf = pick(possible_turfs) if(!second_turf) @@ -116,9 +138,9 @@ if(do_after(user, 20, target = src)) new /obj/effect/temp_visual/bluespace_fissure(get_turf(src)) new /obj/effect/temp_visual/bluespace_fissure(get_turf(linked_to)) - user.forceMove(get_turf(linked_to)) - user.visible_message("[user] [slip_in_message].", null, null, null, user) - user.visible_message("[user] [slip_out_message].", "...and find your way to the other side.") + if(do_teleport(user, get_turf(linked_to), no_effects = TRUE)) + user.visible_message("[user] [slip_in_message].", null, null, null, user) + user.visible_message("[user] [slip_out_message].", "...and find your way to the other side.") /datum/brain_trauma/special/psychotic_brawling name = "Violent Psychosis" @@ -246,12 +268,13 @@ START_PROCESSING(SSfastprocess,src) ..() -/obj/effect/hallucination/simple/securitron/process() - if(prob(60)) +/obj/effect/hallucination/simple/securitron/process(delta_time) + if(DT_PROB(60, delta_time)) forceMove(get_step_towards(src, victim)) - if(prob(5)) + if(DT_PROB(5, delta_time)) to_chat(victim, "[name] exclaims, \"Level 10 infraction alert!\"") /obj/effect/hallucination/simple/securitron/Destroy() + victim = null STOP_PROCESSING(SSfastprocess,src) return ..() diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index 2dc20854296c9..cfe2b38b37079 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -23,7 +23,7 @@ /datum/brain_trauma/severe/split_personality/proc/get_ghost() set waitfor = FALSE - if(owner.stat == DEAD) + if(owner.stat == DEAD || !owner.mind) qdel(src) return var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat, POLL_IGNORE_SPLITPERSONALITY) @@ -51,6 +51,13 @@ QDEL_NULL(owner_backseat) ..() +/datum/brain_trauma/severe/split_personality/Destroy() + if(stranger_backseat) + QDEL_NULL(stranger_backseat) + if(owner_backseat) + QDEL_NULL(owner_backseat) + return ..() + /datum/brain_trauma/severe/split_personality/proc/switch_personalities() if(QDELETED(owner) || owner.stat == DEAD || QDELETED(stranger_backseat) || QDELETED(owner_backseat)) return @@ -194,13 +201,13 @@ /datum/brain_trauma/severe/split_personality/brainwashing/on_life() return //no random switching -/datum/brain_trauma/severe/split_personality/brainwashing/on_hear(message, speaker, message_language, raw_message, radio_freq) - if(HAS_TRAIT(owner, TRAIT_DEAF) || owner == speaker) - return message +/datum/brain_trauma/severe/split_personality/brainwashing/handle_hearing(datum/source, list/hearing_args) + if(HAS_TRAIT(owner, TRAIT_DEAF) || owner == hearing_args[HEARING_SPEAKER]) + return + var/message = hearing_args[HEARING_RAW_MESSAGE] if(findtext(message, codeword)) - message = replacetext(message, codeword, "[codeword]") + hearing_args[HEARING_RAW_MESSAGE] = replacetext(message, codeword, "[codeword]") addtimer(CALLBACK(src, /datum/brain_trauma/severe/split_personality.proc/switch_personalities), 10) - return message /datum/brain_trauma/severe/split_personality/brainwashing/handle_speech(datum/source, list/speech_args) if(findtext(speech_args[SPEECH_MESSAGE], codeword)) diff --git a/code/datums/browser.dm b/code/datums/browser.dm index ee9ef86bea322..fb458d353b13b 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -4,7 +4,7 @@ var/window_id // window_id is used as the window name for browse and onclose var/width = 0 var/height = 0 - var/atom/ref = null + var/datum/weakref/ref = null var/window_options = "can_close=1;can_minimize=1;can_maximize=0;can_resize=1;titlebar=1;" // window option is set using window_id var/stylesheets[0] var/scripts[0] @@ -17,6 +17,7 @@ /datum/browser/New(nuser, nwindow_id, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null) user = nuser + RegisterSignal(user, COMSIG_PARENT_QDELETING, .proc/user_deleted) window_id = nwindow_id if (ntitle) title = format_text(ntitle) @@ -25,7 +26,11 @@ if (nheight) height = nheight if (nref) - ref = nref + ref = WEAKREF(nref) + +/datum/browser/proc/user_deleted(datum/source) + SIGNAL_HANDLER + user = null /datum/browser/proc/add_head_content(nhead_content) head_content = nhead_content @@ -111,8 +116,13 @@ /datum/browser/proc/setup_onclose() set waitfor = 0 //winexists sleeps, so we don't need to. for (var/i in 1 to 10) - if (user && winexists(user, window_id)) - onclose(user, window_id, ref) + if (user?.client && winexists(user, window_id)) + var/atom/send_ref + if(ref) + send_ref = ref.resolve() + if(!send_ref) + ref = null + onclose(user, window_id, send_ref) break /datum/browser/proc/close() diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm new file mode 100644 index 0000000000000..e0c05a3030569 --- /dev/null +++ b/code/datums/chatmessage.dm @@ -0,0 +1,566 @@ +/// How long the chat message's spawn-in animation will occur for +#define CHAT_MESSAGE_SPAWN_TIME 0.2 SECONDS +/// How long the chat message will exist prior to any exponential decay +#define CHAT_MESSAGE_LIFESPAN 5.4 SECONDS +/// How long the chat message's end of life fading animation will occur for +#define CHAT_MESSAGE_EOL_FADE 0.3 SECONDS +/// Factor of how much the message index (number of messages) will account to exponential decay +#define CHAT_MESSAGE_EXP_DECAY 0.7 +/// Factor of how much height will account to exponential decay +#define CHAT_MESSAGE_HEIGHT_DECAY 0.9 +/// Approximate height in pixels of an 'average' line, used for height decay +#define CHAT_MESSAGE_APPROX_LHEIGHT 10 +/// Max width of chat message in pixels +#define CHAT_MESSAGE_WIDTH 128 +/// Max length of chat message in characters +#define CHAT_MESSAGE_MAX_LENGTH 110 +/// Maximum precision of float before rounding errors occur (in this context) +#define CHAT_LAYER_Z_STEP 0.0001 +/// The number of z-layer 'slices' usable by the chat message layering +#define CHAT_LAYER_MAX_Z (CHAT_LAYER_MAX - CHAT_LAYER) / CHAT_LAYER_Z_STEP +/// The dimensions of the chat message icons +#define CHAT_MESSAGE_ICON_SIZE 7 +/// How much the message moves up before fading out. +#define MESSAGE_FADE_PIXEL_Y 10 + +// Message types +#define CHATMESSAGE_CANNOT_HEAR 0 +#define CHATMESSAGE_HEAR 1 +#define CHATMESSAGE_SHOW_LANGUAGE_ICON 2 + +#define BUCKET_LIMIT (world.time + TICKS2DS(min(BUCKET_LEN - (SSrunechat.practical_offset - DS2TICKS(world.time - SSrunechat.head_offset)) - 1, BUCKET_LEN - 1))) +#define BALLOON_TEXT_WIDTH 200 +#define BALLOON_TEXT_SPAWN_TIME (0.2 SECONDS) +#define BALLOON_TEXT_FADE_TIME (0.1 SECONDS) +#define BALLOON_TEXT_FULLY_VISIBLE_TIME (0.7 SECONDS) +#define BALLOON_TEXT_TOTAL_LIFETIME(mult) (BALLOON_TEXT_SPAWN_TIME + BALLOON_TEXT_FULLY_VISIBLE_TIME*mult + BALLOON_TEXT_FADE_TIME) +/// The increase in duration per character in seconds +#define BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MULT (0.05) +/// The amount of characters needed before this increase takes into effect +#define BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MIN 10 + +#define COLOR_JOB_UNKNOWN "#dda583" +#define COLOR_PERSON_UNKNOWN "#999999" +#define COLOR_CHAT_EMOTE "#727272" + +//For jobs that aren't roundstart but still need colours +GLOBAL_LIST_INIT(job_colors_pastel, list( + "Prisoner" = "#d38a5c", + "CentCom" = "#90FD6D", + "Unknown"= COLOR_JOB_UNKNOWN, +)) + +/** + * # 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 + /// A list of clients who hear this message + var/list/client/hearers + /// Contains the scheduled destruction time, used for scheduling EOL + var/scheduled_destruction + /// Contains the time that the EOL for the message will be complete, used for qdel scheduling + var/eol_complete + /// Contains the approximate amount of lines for height decay + var/approx_lines + /// Contains the reference to the next chatmessage in the bucket, used by runechat subsystem + var/datum/chatmessage/next + /// Contains the reference to the previous chatmessage in the bucket, used by runechat subsystem + var/datum/chatmessage/prev + /// The current index used for adjusting the layer of each sequential chat message such that recent messages will overlay older ones + var/static/current_z_idx = 0 + /// Color of the message + var/tgt_color + +/** + * 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, list/client/hearers, language_icon, list/extra_classes = list(), lifespan = CHAT_MESSAGE_LIFESPAN) + . = ..() + if (!istype(target)) + CRASH("Invalid target given for chatmessage") + INVOKE_ASYNC(src, .proc/generate_image, text, target, hearers, language_icon, extra_classes, lifespan) + +/datum/chatmessage/Destroy() + if (hearers) + for(var/client/C in hearers) + if(!C) + continue + C.images.Remove(message) + UnregisterSignal(C, COMSIG_PARENT_QDELETING) + if(!QDELETED(message_loc)) + LAZYREMOVE(message_loc.chat_messages, src) + hearers = null + message_loc = null + message = null + leave_subsystem() + return ..() + +/** + * Calls qdel on the chatmessage when its parent is deleted, used to register qdel signal + */ +/datum/chatmessage/proc/on_parent_qdel() + SIGNAL_HANDLER + 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 + * * language - The language this message was spoken in + * * 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, list/client/hearers, datum/language/language, list/extra_classes, lifespan) + /// Cached icons to show what language the user is speaking + var/static/list/language_icons + + // Store the hearers + src.hearers = hearers + + if(!LAZYLEN(hearers)) + return + + var/client/first_hearer = hearers[1] + + // Delete when the atom its above gets deleted. + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/on_parent_qdel) + + for(var/client/C as() in hearers) + if(C) + RegisterSignal(C, COMSIG_PARENT_QDELETING, .proc/client_deleted) + + // Remove spans in the message from things like the recorder + var/static/regex/span_check = new(@"<\/?span[^>]*>", "gi") + text = replacetext(text, span_check, "") + + // Clip message + if (length_char(text) > CHAT_MESSAGE_MAX_LENGTH) + text = copytext_char(text, 1, CHAT_MESSAGE_MAX_LENGTH + 1) + "..." // BYOND index moment + + //The color of the message. + + // Get the chat color + if(!tgt_color) //in case we have color predefined + if(isliving(target)) //target is living, thus we have preset color for him + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(H.wear_id?.GetID()) + var/obj/item/card/id/idcard = H.wear_id + var/datum/job/wearer_job = SSjob.GetJob(idcard.GetJobName()) + if(wearer_job) + tgt_color = wearer_job.chat_color + else + tgt_color = GLOB.job_colors_pastel[idcard.GetJobName()] + else + tgt_color = COLOR_PERSON_UNKNOWN + else + if(!target.chat_color) //extreme case - mob doesn't have set color + stack_trace("Error: Mob did not have a chat_color. The only way this can happen is if you set it to null purposely in the thing. Don't do that please.") + target.chat_color = colorize_string(target.name) + target.chat_color_name = target.name + tgt_color = target.chat_color + else //target is not living, randomizing its color + if(!target.chat_color || target.chat_color_name != target.name) + target.chat_color = colorize_string(target.name) + target.chat_color_name = target.name + tgt_color = target.chat_color + + // 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 + + var/list/prefixes + + // 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") + LAZYADD(prefixes, "\icon[r_icon]") + else if (extra_classes.Find("emote")) + var/image/r_icon = image('icons/UI_Icons/chat/chat_icons.dmi', icon_state = "emote") + LAZYADD(prefixes, "\icon[r_icon]") + tgt_color = COLOR_CHAT_EMOTE + + // Append language icon if the language uses one + var/datum/language/language_instance = GLOB.language_datum_instances[language] + if (language_instance?.display_icon(first_hearer.mob)) + var/icon/language_icon = LAZYACCESS(language_icons, language) + if (isnull(language_icon)) + language_icon = icon(language_instance.icon, icon_state = language_instance.icon_state) + language_icon.Scale(CHAT_MESSAGE_ICON_SIZE, CHAT_MESSAGE_ICON_SIZE) + LAZYSET(language_icons, language, language_icon) + LAZYADD(prefixes, "\icon[language_icon]") + + //Add on the icons. + text = "[prefixes?.Join(" ")][text]" + + // Approximate text height + var/complete_text = "[text]" + var/mheight = WXH_TO_HEIGHT(first_hearer.MeasureText(complete_text, 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 = get_atom_on_turf(target) + if (LAZYLEN(message_loc.chat_messages)) + var/idx = 1 + var/combined_height = approx_lines + for(var/msg in message_loc.chat_messages) + 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 + + // When choosing to update the remaining time we have to be careful not to update the + // scheduled time once the EOL completion time has been set. + var/sched_remaining = m.scheduled_destruction - world.time + if (!m.eol_complete) + var/remaining_time = (sched_remaining) * (CHAT_MESSAGE_EXP_DECAY ** idx++) * (CHAT_MESSAGE_HEIGHT_DECAY ** CEILING(combined_height, 1)) + m.enter_subsystem(world.time + remaining_time) // push updated time to runechat SS + + // Reset z index if relevant + if (current_z_idx >= CHAT_LAYER_MAX_Z) + current_z_idx = 0 + + var/bound_height = world.icon_size + var/bound_width = world.icon_size + if(ismovableatom(message_loc)) + var/atom/movable/AM = message_loc + bound_height = AM.bound_height + bound_width = AM.bound_width + // Build message image + message = image(loc = message_loc, layer = CHAT_LAYER + CHAT_LAYER_Z_STEP * current_z_idx++) + message.plane = RUNECHAT_PLANE + message.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA | KEEP_APART + message.alpha = 0 + message.pixel_y = bound_height - MESSAGE_FADE_PIXEL_Y + message.maptext_width = CHAT_MESSAGE_WIDTH + message.maptext_height = mheight + message.maptext_x = (CHAT_MESSAGE_WIDTH - bound_width) * -0.5 + if(extra_classes.Find("italics")) + message.color = "#CCCCCC" + message.maptext = MAPTEXT(complete_text) + + // Show the message to clients + for(var/client/C as() in hearers) + C?.images |= message + animate(message, alpha = 255, pixel_y = bound_height, time = CHAT_MESSAGE_SPAWN_TIME) + + LAZYADD(message_loc.chat_messages, src) + + // Register with the runechat SS to handle EOL and destruction + scheduled_destruction = world.time + (lifespan - CHAT_MESSAGE_EOL_FADE) + enter_subsystem() + +/datum/chatmessage/proc/client_deleted(client/source) + SIGNAL_HANDLER + hearers -= source + +/** + * Applies final animations to overlay CHAT_MESSAGE_EOL_FADE deciseconds prior to message deletion, + * sets time for scheduling deletion and re-enters the runechat SS for qdeling + * + * Arguments: + * * fadetime - The amount of time to animate the message's fadeout for + */ +/datum/chatmessage/proc/end_of_life(fadetime = CHAT_MESSAGE_EOL_FADE) + eol_complete = scheduled_destruction + fadetime + animate(message, alpha = 0, pixel_y = message.pixel_y + MESSAGE_FADE_PIXEL_Y, time = fadetime, flags = ANIMATION_PARALLEL) + enter_subsystem(eol_complete) // re-enter the runechat SS with the EOL completion time to QDEL self + +/mob/proc/should_show_chat_message(atom/movable/speaker, datum/language/message_language, is_emote = FALSE, is_heard = FALSE) + if(!client) + return CHATMESSAGE_CANNOT_HEAR + if(!client.prefs.chat_on_map || (!client.prefs.see_chat_non_mob && !ismob(speaker))) + return CHATMESSAGE_CANNOT_HEAR + if(!client.prefs.see_rc_emotes && is_emote) + return CHATMESSAGE_CANNOT_HEAR + if(is_heard && !can_hear()) + return CHATMESSAGE_CANNOT_HEAR + //If the speaker is a virtual speaker, check to make sure we couldnt hear the original message. + if(istype(speaker, /atom/movable/virtualspeaker)) + var/atom/movable/virtualspeaker/v = speaker + //Dont create the overhead chat if we said the message. + if(v.source == src) + return CHATMESSAGE_CANNOT_HEAR + //Dont create the overhead radio chat if we are a ghost and can hear global messages. + if(isobserver(src)) + return CHATMESSAGE_CANNOT_HEAR + //Dont create the overhead radio chat if we heard the speaker speak + if(get_dist(get_turf(v.source), get_turf(src)) <= 1) + return CHATMESSAGE_CANNOT_HEAR + var/datum/language/language_instance = GLOB.language_datum_instances[message_language] + if(language_instance?.display_icon(src)) + return CHATMESSAGE_SHOW_LANGUAGE_ICON + return CHATMESSAGE_HEAR + +/mob/living/should_show_chat_message(atom/movable/speaker, datum/language/message_language, is_emote = FALSE, is_heard = FALSE) + if(stat != CONSCIOUS && stat != DEAD) + return CHATMESSAGE_CANNOT_HEAR + return ..() + +/proc/create_chat_message(atom/movable/speaker, datum/language/message_language, list/hearers, raw_message, list/spans, list/message_mods) + if(!length(hearers)) + return + + if(!islist(message_mods)) + message_mods = list() + + // 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) + if (istype(speaker, /atom/movable/virtualspeaker)) + var/atom/movable/virtualspeaker/v = speaker + speaker = v.source + spans |= "virtual-speaker" + + //If the message has the radio message flag + else if (message_mods[MODE_RADIO_MESSAGE]) + //You are now a virtual speaker + spans |= "virtual-speaker" + //You are no longer italics + spans -= "italics" + + // Display visual above source + if(message_mods.Find(CHATMESSAGE_EMOTE)) + var/list/clients = list() + for(var/mob/M as() in hearers) + if(M?.should_show_chat_message(speaker, message_language, TRUE)) + clients += M.client + new /datum/chatmessage(raw_message, speaker, clients, message_language, list("emote")) + else + //4 Possible chat message states: + //Show Icon, Understand (Most other languages) + //Hide Icon, Understand (Normal galactic common) + //Show Icon, Don't understand (Most languages you can't understand) + //Hide Icon, Don't understand (Not understanding common) + var/list/client/show_icon_understand + var/list/client/hide_icon_understand + var/list/client/show_icon_scrambled + var/list/client/hide_icon_scrambled + for(var/mob/M as() in hearers) + switch(M?.should_show_chat_message(speaker, message_language, FALSE)) + if(CHATMESSAGE_HEAR) + if(!message_language || M.has_language(message_language)) + LAZYADD(hide_icon_understand, M.client) + else + LAZYADD(hide_icon_scrambled, M.client) + if(CHATMESSAGE_SHOW_LANGUAGE_ICON) + if(!message_language || M.has_language(message_language)) + LAZYADD(show_icon_understand, M.client) + else + LAZYADD(show_icon_scrambled, M.client) + var/scrambled_message + var/datum/language/language_instance = message_language ? GLOB.language_datum_instances[message_language] : null + if(LAZYLEN(show_icon_scrambled) || LAZYLEN(hide_icon_scrambled)) + scrambled_message = language_instance?.scramble(raw_message) || scramble_message_replace_chars(raw_message, 100) + //Show the correct message to people who should see the icon and understand the language + if(LAZYLEN(show_icon_understand)) + new /datum/chatmessage(raw_message, speaker, show_icon_understand, message_language, spans) + //Show the correct message to people who should see the icon but not understand the language + if(LAZYLEN(hide_icon_understand)) + new /datum/chatmessage(raw_message, speaker, hide_icon_understand, message_language, spans) + //Show the correct message to people who don't understand the language and should see the icon + if(LAZYLEN(show_icon_scrambled)) + new /datum/chatmessage(scrambled_message, speaker, show_icon_scrambled, message_language, spans) + //Show the correct message to people who don't understand the language but no icon should be displayed + if(LAZYLEN(hide_icon_scrambled)) + new /datum/chatmessage(scrambled_message, speaker, hide_icon_scrambled, message_language, spans) + +/** + * 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 + */ + + + +// 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)]" + +/atom/proc/balloon_alert(mob/viewer, text) + if(!viewer?.client) + return + switch(viewer.client.prefs.see_balloon_alerts) + if(BALLOON_ALERT_ALWAYS) + new /datum/chatmessage/balloon_alert(text, src, viewer) + if(BALLOON_ALERT_WITH_CHAT) + new /datum/chatmessage/balloon_alert(text, src, viewer) + to_chat(viewer, "[text].") + if(BALLOON_ALERT_NEVER) + to_chat(viewer, "[text].") + +/atom/proc/balloon_alert_to_viewers(message, self_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs) + var/list/hearers = get_hearers_in_view(vision_distance, src) + hearers -= ignored_mobs + + for (var/mob/hearer in hearers) + if (is_blind(hearer)) + continue + + balloon_alert(hearer, (hearer == src && self_message) || message) + +/datum/chatmessage/balloon_alert + tgt_color = "#ffffff" + +/datum/chatmessage/balloon_alert/New(text, atom/target, mob/owner) + 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) + +/datum/chatmessage/balloon_alert/generate_image(text, atom/target, mob/owner) + // Register client who owns this message + var/client/owned_by = owner.client + RegisterSignal(owned_by, COMSIG_PARENT_QDELETING, .proc/on_parent_qdel) + + var/bound_width = world.icon_size + if (ismovable(target)) + var/atom/movable/movable_source = target + bound_width = movable_source.bound_width + + if(isturf(target)) + message_loc = target + else + message_loc = get_atom_on_turf(target) + + // Build message image + message = image(loc = message_loc, layer = CHAT_LAYER) + message.plane = BALLOON_CHAT_PLANE + message.alpha = 0 + message.maptext_width = BALLOON_TEXT_WIDTH + message.maptext_height = WXH_TO_HEIGHT(owned_by?.MeasureText(text, null, BALLOON_TEXT_WIDTH)) + message.maptext_x = (BALLOON_TEXT_WIDTH - bound_width) * -0.5 + message.maptext = MAPTEXT("[text]") + + // View the message + owned_by.images += message + + var/duration_mult = 1 + var/duration_length = length(text) - BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MIN + + if(duration_length > 0) + duration_mult += duration_length * BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MULT + + // Animate the message + animate( + message, + pixel_y = world.icon_size * 1.2, + time = BALLOON_TEXT_TOTAL_LIFETIME(1), + easing = SINE_EASING | EASE_OUT, + ) + + animate( + alpha = 255, + time = BALLOON_TEXT_SPAWN_TIME, + easing = CUBIC_EASING | EASE_OUT, + flags = ANIMATION_PARALLEL, + ) + + animate( + alpha = 0, + time = BALLOON_TEXT_FULLY_VISIBLE_TIME * duration_mult, + easing = CUBIC_EASING | EASE_IN, + ) + + // Register with the runechat SS to handle EOL and destruction + scheduled_destruction = world.time + BALLOON_TEXT_TOTAL_LIFETIME(duration_mult) + enter_subsystem() + + +#undef BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MIN +#undef BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MULT +#undef CHAT_MESSAGE_SPAWN_TIME +#undef CHAT_MESSAGE_LIFESPAN +#undef CHAT_MESSAGE_EOL_FADE +#undef CHAT_MESSAGE_EXP_DECAY +#undef CHAT_MESSAGE_HEIGHT_DECAY +#undef CHAT_MESSAGE_APPROX_LHEIGHT +#undef CHAT_MESSAGE_WIDTH +#undef CHAT_LAYER_Z_STEP +#undef CHAT_LAYER_MAX_Z +#undef CHAT_MESSAGE_ICON_SIZE +#undef BALLOON_TEXT_FADE_TIME +#undef BALLOON_TEXT_FULLY_VISIBLE_TIME +#undef BALLOON_TEXT_SPAWN_TIME +#undef BALLOON_TEXT_TOTAL_LIFETIME +#undef BALLOON_TEXT_WIDTH +#undef CHATMESSAGE_CANNOT_HEAR +#undef CHATMESSAGE_HEAR +#undef CHATMESSAGE_SHOW_LANGUAGE_ICON diff --git a/code/datums/cinematic.dm b/code/datums/cinematic.dm index e229b25258b3b..06b4ab2aeaf97 100644 --- a/code/datums/cinematic.dm +++ b/code/datums/cinematic.dm @@ -1,5 +1,3 @@ -GLOBAL_LIST_EMPTY(cinematics) - // Use to play cinematics. // Watcher can be world,mob, or a list of mobs // Blocks until sequence is done. @@ -18,8 +16,9 @@ GLOBAL_LIST_EMPTY(cinematics) playing.is_global = TRUE watcher = GLOB.mob_list playing.play(watcher) + qdel(playing) -/obj/screen/cinematic +/atom/movable/screen/cinematic icon = 'icons/effects/station_explosion.dmi' icon_state = "station_intact" plane = SPLASHSCREEN_PLANE @@ -32,34 +31,40 @@ GLOBAL_LIST_EMPTY(cinematics) var/list/watching = list() //List of clients watching this var/list/locked = list() //Who had notransform set during the cinematic var/is_global = FALSE //Global cinematics will override mob-specific ones - var/obj/screen/cinematic/screen + var/atom/movable/screen/cinematic/screen var/datum/callback/special_callback //For special effects synced with animation (explosions after the countdown etc) var/cleanup_time = 300 //How long for the final screen to remain var/stop_ooc = TRUE //Turns off ooc when played globally. /datum/cinematic/New() - GLOB.cinematics += src screen = new(src) /datum/cinematic/Destroy() - GLOB.cinematics -= src + for(var/CC in watching) + if(!CC) + continue + var/client/C = CC + C.screen -= screen + watching = null QDEL_NULL(screen) - for(var/mob/M in locked) + QDEL_NULL(special_callback) + for(var/MM in locked) + if(!MM) + continue + var/mob/M = MM M.notransform = FALSE + locked = null return ..() /datum/cinematic/proc/play(watchers) - //Check if you can actually play it (stop mob cinematics for global ones) and create screen objects - for(var/A in GLOB.cinematics) - var/datum/cinematic/C = A - if(C == src) - continue - if(C.is_global || !is_global) - return //Can't play two global or local cinematics at the same time + //Check if cinematic can actually play (stop mob cinematics for global ones) + if(SEND_GLOBAL_SIGNAL(COMSIG_GLOB_PLAY_CINEMATIC, src) & COMPONENT_GLOB_BLOCK_CINEMATIC) + return - //Close all open windows if global - if(is_global) - SStgui.close_all_uis() + //We are now playing this cinematic + + //Handle what happens when a different cinematic tries to play over us + RegisterSignal(SSdcs, COMSIG_GLOB_PLAY_CINEMATIC, .proc/replacement_cinematic) //Pause OOC var/ooc_toggled = FALSE @@ -67,24 +72,17 @@ GLOBAL_LIST_EMPTY(cinematics) ooc_toggled = TRUE toggle_ooc(FALSE) - - 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 ? - locked += M - //Close watcher ui's - SStgui.close_user_uis(M) - if(M.client) - watching += M.client - M.client.screen += screen - else - if(is_global) - M.notransform = TRUE - locked += M + //Place /obj/screen/cinematic into everyone's screens, prevent them from moving + for(var/MM in watchers) + var/mob/M = MM + show_to(M, M.client) + RegisterSignal(M, COMSIG_MOB_CLIENT_LOGIN, .proc/show_to) + //Close watcher ui's + SStgui.close_user_uis(M) //Actually play it content() - + //Cleanup sleep(cleanup_time) @@ -92,7 +90,14 @@ GLOBAL_LIST_EMPTY(cinematics) if(ooc_toggled) toggle_ooc(TRUE) - qdel(src) +/datum/cinematic/proc/show_to(mob/M, client/C) + if(!M.notransform) + locked += M + M.notransform = TRUE //Should this be done for non-global cinematics or even at all ? + if(!C) + return + watching += C + C.screen += screen //Sound helper /datum/cinematic/proc/cinematic_sound(s) @@ -111,6 +116,11 @@ GLOBAL_LIST_EMPTY(cinematics) /datum/cinematic/proc/content() sleep(50) +/datum/cinematic/proc/replacement_cinematic(datum/source, datum/cinematic/other) + if(!is_global && other.is_global) //Allow it to play if we're local and it's global + return NONE + return COMPONENT_GLOB_BLOCK_CINEMATIC + /datum/cinematic/nuke_win id = CINEMATIC_NUKE_WIN @@ -254,4 +264,4 @@ Nuke.Explosion() Narsie() -> Cinematic(CULT,world) -*/ \ No newline at end of file +*/ diff --git a/code/datums/components/README.md b/code/datums/components/README.md index 66b8f81e0dd8e..061eb8a6ad60d 100644 --- a/code/datums/components/README.md +++ b/code/datums/components/README.md @@ -1,133 +1,133 @@ -# Datum Component System (DCS) - -## Concept - -Loosely adapted from /vg/. This is an entity component system for adding behaviours to datums when inheritance doesn't quite cut it. By using signals and events instead of direct inheritance, you can inject behaviours without hacky overloads. It requires a different method of thinking, but is not hard to use correctly. If a behaviour can have application across more than one thing. Make it generic, make it a component. Atom/mob/obj event? Give it a signal, and forward it's arguments with a `SendSignal()` call. Now every component that want's to can also know about this happening. - -### In the code - -#### Slippery things - -At the time of this writing, every object that is slippery overrides atom/Crossed does some checks, then slips the mob. Instead of all those Crossed overrides they could add a slippery component to all these objects. And have the checks in one proc that is run by the Crossed event - -#### Powercells - -A lot of objects have powercells. The `get_cell()` proc was added to give generic access to the cell var if it had one. This is just a specific use case of `GetComponent()` - -#### Radios - -The radio object as it is should not exist, given that more things use the _concept_ of radios rather than the object itself. The actual function of the radio can exist in a component which all the things that use it (Request consoles, actual radios, the SM shard) can add to themselves. - -#### Standos - -Stands have a lot of procs which mimic mob procs. Rather than inserting hooks for all these procs in overrides, the same can be accomplished with signals - -## API - -### Defines - -1. `COMPONENT_INCOMPATIBLE` Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. `parent` must not be modified if this is to be returned. This will be noted in the runtime logs - -### Vars - -1. `/datum/var/list/datum_components` (private) - * Lazy associated list of type -> component/list of components. -1. `/datum/var/list/comp_lookup` (private) - * Lazy associated list of signal -> registree/list of registrees -1. `/datum/var/list/signal_procs` (private) - * Associated lazy list of signals -> `/datum/callback`s that will be run when the parent datum receives that signal -1. `/datum/var/signal_enabled` (protected, boolean) - * If the datum is signal enabled. If not, it will not react to signals - * `FALSE` by default, set to `TRUE` when a signal is registered -1. `/datum/component/var/dupe_mode` (protected, enum) - * How duplicate component types are handled when added to the datum. - * `COMPONENT_DUPE_HIGHLANDER` (default): Old component will be deleted, new component will first have `/datum/component/proc/InheritComponent(datum/component/old, FALSE)` on it - * `COMPONENT_DUPE_ALLOWED`: The components will be treated as separate, `GetComponent()` will return the first added - * `COMPONENT_DUPE_UNIQUE`: New component will be deleted, old component will first have `/datum/component/proc/InheritComponent(datum/component/new, TRUE)` on it - * `COMPONENT_DUPE_UNIQUE_PASSARGS`: New component will never exist and instead its initialization arguments will be passed on to the old component. -1. `/datum/component/var/dupe_type` (protected, type) - * Definition of a duplicate component type - * `null` means exact match on `type` (default) - * Any other type means that and all subtypes -1. `/datum/component/var/datum/parent` (protected, read-only) - * The datum this component belongs to - * Never `null` in child procs -1. `report_signal_origin` (protected, boolean) - * If `TRUE`, will invoke the callback when signalled with the signal type as the first argument. - * `FALSE` by default. - -### Procs - -1. `/datum/proc/GetComponent(component_type(type)) -> datum/component?` (public, final) - * Returns a reference to a component of component_type if it exists in the datum, null otherwise -1. `/datum/proc/GetComponents(component_type(type)) -> list` (public, final) - * Returns a list of references to all components of component_type that exist in the datum -1. `/datum/proc/GetExactComponent(component_type(type)) -> datum/component?` (public, final) - * Returns a reference to a component whose type MATCHES component_type if that component exists in the datum, null otherwise -1. `SEND_SIGNAL(target, sigtype, ...)` (public, final) - * Use to send signals to target datum - * Extra arguments are to be specified in the signal definition - * Returns a bitflag with signal specific information assembled from all activated components - * Arguments are packaged in a list and handed off to _SendSignal() -1. `/datum/proc/AddComponent(component_type(type), ...) -> datum/component` (public, final) - * Creates an instance of `component_type` in the datum and passes `...` to its `Initialize()` call - * Sends the `COMSIG_COMPONENT_ADDED` signal to the datum - * All components a datum owns are deleted with the datum - * Returns the component that was created. Or the old component in a dupe situation where `COMPONENT_DUPE_UNIQUE` was set - * If this tries to add an component to an incompatible type, the component will be deleted and the result will be `null`. This is very unperformant, try not to do it - * Properly handles duplicate situations based on the `dupe_mode` var -1. `/datum/proc/LoadComponent(component_type(type), ...) -> datum/component` (public, final) - * Equivalent to calling `GetComponent(component_type)` where, if the result would be `null`, returns `AddComponent(component_type, ...)` instead -1. `/datum/proc/ComponentActivated(datum/component/C)` (abstract, async) - * Called on a component's `parent` after a signal received causes it to activate. `src` is the parameter - * Will only be called if a component's callback returns `TRUE` -1. `/datum/proc/TakeComponent(datum/component/C)` (public, final) - * Properly transfers ownership of a component from one datum to another - * Signals `COMSIG_COMPONENT_REMOVING` on the parent - * Called on the datum you want to own the component with another datum's component -1. `/datum/proc/_SendSignal(signal, list/arguments)` (private, final) - * Handles most of the actual signaling procedure - * Will runtime if used on datums with an empty component list -1. `/datum/proc/RegisterSignal(datum/target, signal(string/list of strings), proc_ref(type), override(boolean))` (protected, final) - * If signal is a list it will be as if RegisterSignal was called for each of the entries with the same following arguments - * Makes the datum listen for the specified `signal` on it's `parent` datum. - * When that signal is received `proc_ref` will be called on the component, along with associated arguments - * Example proc ref: `.proc/OnEvent` - * If a previous registration is overwritten by the call, a runtime occurs. Setting `override` to TRUE prevents this - * These callbacks run asyncronously - * Returning `TRUE` from these callbacks will trigger a `TRUE` return from the `SendSignal()` that initiated it -1. `/datum/component/New(datum/parent, ...)` (private, final) - * Runs internal setup for the component - * Extra arguments are passed to `Initialize()` -1. `/datum/component/Initialize(...)` (abstract, no-sleep) - * Called by `New()` with the same argments excluding `parent` - * Component does not exist in `parent`'s `datum_components` list yet, although `parent` is set and may be used - * Signals will not be received while this function is running - * Component may be deleted after this function completes without being attached - * Do not call `qdel(src)` from this function -1. `/datum/component/Destroy(force(bool), silent(bool))` (virtual, no-sleep) - * Sends the `COMSIG_COMPONENT_REMOVING` signal to the parent datum if the `parent` isn't being qdeleted - * Properly removes the component from `parent` and cleans up references - * Setting `force` makes it not check for and remove the component from the parent - * Setting `silent` deletes the component without sending a `COMSIG_COMPONENT_REMOVING` signal -1. `/datum/component/proc/InheritComponent(datum/component/C, i_am_original(boolean))` (abstract, no-sleep) - * Called on a component when a component of the same type was added to the same parent - * See `/datum/component/var/dupe_mode` - * `C`'s type will always be the same of the called component -1. `/datum/component/proc/AfterComponentActivated()` (abstract, async) - * Called on a component that was activated after it's `parent`'s `ComponentActivated()` is called -1. `/datum/component/proc/OnTransfer(datum/new_parent)` (abstract, no-sleep) - * Called before `new_parent` is assigned to `parent` in `TakeComponent()` - * Allows the component to react to ownership transfers -1. `/datum/component/proc/_RemoveFromParent()` (private, final) - * Clears `parent` and removes the component from it's component list -1. `/datum/component/proc/_JoinParent` (private, final) - * Tries to add the component to it's `parent`s `datum_components` list -1. `/datum/component/proc/RegisterWithParent` (abstract, no-sleep) - * Used to register the signals that should be on the `parent` object - * Use this if you plan on the component transfering between parents -1. `/datum/component/proc/UnregisterFromParent` (abstract, no-sleep) - * Counterpart to `RegisterWithParent()` - * Used to unregister the signals that should only be on the `parent` object - -### See/Define signals and their arguments in __DEFINES\components.dm +# Datum Component System (DCS) + +## Concept + +Loosely adapted from /vg/. This is an entity component system for adding behaviours to datums when inheritance doesn't quite cut it. By using signals and events instead of direct inheritance, you can inject behaviours without hacky overloads. It requires a different method of thinking, but is not hard to use correctly. If a behaviour can have application across more than one thing. Make it generic, make it a component. Atom/mob/obj event? Give it a signal, and forward it's arguments with a `SendSignal()` call. Now every component that want's to can also know about this happening. + +### In the code + +#### Slippery things + +At the time of this writing, every object that is slippery overrides atom/Crossed does some checks, then slips the mob. Instead of all those Crossed overrides they could add a slippery component to all these objects. And have the checks in one proc that is run by the Crossed event + +#### Powercells + +A lot of objects have powercells. The `get_cell()` proc was added to give generic access to the cell var if it had one. This is just a specific use case of `GetComponent()` + +#### Radios + +The radio object as it is should not exist, given that more things use the _concept_ of radios rather than the object itself. The actual function of the radio can exist in a component which all the things that use it (Request consoles, actual radios, the SM shard) can add to themselves. + +#### Standos + +Stands have a lot of procs which mimic mob procs. Rather than inserting hooks for all these procs in overrides, the same can be accomplished with signals + +## API + +### Defines + +1. `COMPONENT_INCOMPATIBLE` Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. `parent` must not be modified if this is to be returned. This will be noted in the runtime logs + +### Vars + +1. `/datum/var/list/datum_components` (private) + * Lazy associated list of type -> component/list of components. +1. `/datum/var/list/comp_lookup` (private) + * Lazy associated list of signal -> registree/list of registrees +1. `/datum/var/list/signal_procs` (private) + * Associated lazy list of signals -> `/datum/callback`s that will be run when the parent datum receives that signal +1. `/datum/var/signal_enabled` (protected, boolean) + * If the datum is signal enabled. If not, it will not react to signals + * `FALSE` by default, set to `TRUE` when a signal is registered +1. `/datum/component/var/dupe_mode` (protected, enum) + * How duplicate component types are handled when added to the datum. + * `COMPONENT_DUPE_HIGHLANDER` (default): Old component will be deleted, new component will first have `/datum/component/proc/InheritComponent(datum/component/old, FALSE)` on it + * `COMPONENT_DUPE_ALLOWED`: The components will be treated as separate, `GetComponent()` will return the first added + * `COMPONENT_DUPE_UNIQUE`: New component will be deleted, old component will first have `/datum/component/proc/InheritComponent(datum/component/new, TRUE)` on it + * `COMPONENT_DUPE_UNIQUE_PASSARGS`: New component will never exist and instead its initialization arguments will be passed on to the old component. +1. `/datum/component/var/dupe_type` (protected, type) + * Definition of a duplicate component type + * `null` means exact match on `type` (default) + * Any other type means that and all subtypes +1. `/datum/component/var/datum/parent` (protected, read-only) + * The datum this component belongs to + * Never `null` in child procs +1. `report_signal_origin` (protected, boolean) + * If `TRUE`, will invoke the callback when signalled with the signal type as the first argument. + * `FALSE` by default. + +### Procs + +1. `/datum/proc/GetComponent(component_type(type)) -> datum/component?` (public, final) + * Returns a reference to a component of component_type if it exists in the datum, null otherwise +1. `/datum/proc/GetComponents(component_type(type)) -> list` (public, final) + * Returns a list of references to all components of component_type that exist in the datum +1. `/datum/proc/GetExactComponent(component_type(type)) -> datum/component?` (public, final) + * Returns a reference to a component whose type MATCHES component_type if that component exists in the datum, null otherwise +1. `SEND_SIGNAL(target, sigtype, ...)` (public, final) + * Use to send signals to target datum + * Extra arguments are to be specified in the signal definition + * Returns a bitflag with signal specific information assembled from all activated components + * Arguments are packaged in a list and handed off to _SendSignal() +1. `/datum/proc/AddComponent(component_type(type), ...) -> datum/component` (public, final) + * Creates an instance of `component_type` in the datum and passes `...` to its `Initialize()` call + * Sends the `COMSIG_COMPONENT_ADDED` signal to the datum + * All components a datum owns are deleted with the datum + * Returns the component that was created. Or the old component in a dupe situation where `COMPONENT_DUPE_UNIQUE` was set + * If this tries to add an component to an incompatible type, the component will be deleted and the result will be `null`. This is very unperformant, try not to do it + * Properly handles duplicate situations based on the `dupe_mode` var +1. `/datum/proc/LoadComponent(component_type(type), ...) -> datum/component` (public, final) + * Equivalent to calling `GetComponent(component_type)` where, if the result would be `null`, returns `AddComponent(component_type, ...)` instead +1. `/datum/proc/ComponentActivated(datum/component/C)` (abstract, async) + * Called on a component's `parent` after a signal received causes it to activate. `src` is the parameter + * Will only be called if a component's callback returns `TRUE` +1. `/datum/proc/TakeComponent(datum/component/C)` (public, final) + * Properly transfers ownership of a component from one datum to another + * Signals `COMSIG_COMPONENT_REMOVING` on the parent + * Called on the datum you want to own the component with another datum's component +1. `/datum/proc/_SendSignal(signal, list/arguments)` (private, final) + * Handles most of the actual signaling procedure + * Will runtime if used on datums with an empty component list +1. `/datum/proc/RegisterSignal(datum/target, signal(string/list of strings), proc_ref(type), override(boolean))` (protected, final) + * If signal is a list it will be as if RegisterSignal was called for each of the entries with the same following arguments + * Makes the datum listen for the specified `signal` on it's `parent` datum. + * When that signal is received `proc_ref` will be called on the component, along with associated arguments + * Example proc ref: `.proc/OnEvent` + * If a previous registration is overwritten by the call, a runtime occurs. Setting `override` to TRUE prevents this + * These callbacks run asyncronously + * Returning `TRUE` from these callbacks will trigger a `TRUE` return from the `SendSignal()` that initiated it +1. `/datum/component/New(datum/parent, ...)` (private, final) + * Runs internal setup for the component + * Extra arguments are passed to `Initialize()` +1. `/datum/component/Initialize(...)` (abstract, no-sleep) + * Called by `New()` with the same argments excluding `parent` + * Component does not exist in `parent`'s `datum_components` list yet, although `parent` is set and may be used + * Signals will not be received while this function is running + * Component may be deleted after this function completes without being attached + * Do not call `qdel(src)` from this function +1. `/datum/component/Destroy(force(bool), silent(bool))` (virtual, no-sleep) + * Sends the `COMSIG_COMPONENT_REMOVING` signal to the parent datum if the `parent` isn't being qdeleted + * Properly removes the component from `parent` and cleans up references + * Setting `force` makes it not check for and remove the component from the parent + * Setting `silent` deletes the component without sending a `COMSIG_COMPONENT_REMOVING` signal +1. `/datum/component/proc/InheritComponent(datum/component/C, i_am_original(boolean))` (abstract, no-sleep) + * Called on a component when a component of the same type was added to the same parent + * See `/datum/component/var/dupe_mode` + * `C`'s type will always be the same of the called component +1. `/datum/component/proc/AfterComponentActivated()` (abstract, async) + * Called on a component that was activated after it's `parent`'s `ComponentActivated()` is called +1. `/datum/component/proc/OnTransfer(datum/new_parent)` (abstract, no-sleep) + * Called before `new_parent` is assigned to `parent` in `TakeComponent()` + * Allows the component to react to ownership transfers +1. `/datum/component/proc/_RemoveFromParent()` (private, final) + * Clears `parent` and removes the component from it's component list +1. `/datum/component/proc/_JoinParent` (private, final) + * Tries to add the component to it's `parent`s `datum_components` list +1. `/datum/component/proc/RegisterWithParent` (abstract, no-sleep) + * Used to register the signals that should be on the `parent` object + * Use this if you plan on the component transfering between parents +1. `/datum/component/proc/UnregisterFromParent` (abstract, no-sleep) + * Counterpart to `RegisterWithParent()` + * Used to unregister the signals that should only be on the `parent` object + +### See/Define signals and their arguments in __DEFINES\components.dm diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index ab6cda5f63718..0901b283f2303 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -7,14 +7,15 @@ //Make sure you also implement PostTransfer for any post transfer handling var/can_transfer = FALSE -/datum/component/New(datum/P, ...) - parent = P - var/list/arguments = args.Copy(2) +/datum/component/New(list/raw_args) + 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 [P.type]! args: [json_encode(arguments)]") - - _JoinParent(P) + CRASH("Incompatible [type] assigned to a [parent.type]! args: [json_encode(arguments)]") + + _JoinParent(parent) /datum/component/proc/_JoinParent() var/datum/P = parent @@ -151,6 +152,9 @@ /datum/component/proc/InheritComponent(datum/component/C, i_am_original) return +/datum/component/proc/CheckDupeComponent(datum/component/C, ...) + return + /datum/component/proc/PreTransfer() return @@ -173,17 +177,19 @@ if(!C.signal_enabled) return NONE var/proctype = C.signal_procs[src][sigtype] - return NONE | CallAsync(C, proctype, arguments) + return NONE | call(C, proctype)(arglist(arguments)) . = NONE for(var/I in target) var/datum/C = I if(!C.signal_enabled) continue var/proctype = C.signal_procs[src][sigtype] - . |= CallAsync(C, proctype, arguments) + . |= call(C, proctype)(arglist(arguments)) -/datum/proc/GetComponent(c_type) +/datum/proc/GetComponent(datum/component/c_type) RETURN_TYPE(c_type) + if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED || initial(c_type.dupe_mode) == COMPONENT_DUPE_SELECTIVE) + stack_trace("GetComponent was called to get a component of which multiple copies could be on an object. This can easily break and should be changed. Type: \[[c_type]\]") var/list/dc = datum_components if(!dc) return null @@ -191,7 +197,10 @@ if(length(.)) return .[1] -/datum/proc/GetExactComponent(c_type) +/datum/proc/GetExactComponent(datum/component/c_type) + RETURN_TYPE(c_type) + if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED || initial(c_type.dupe_mode) == COMPONENT_DUPE_SELECTIVE) + stack_trace("GetComponent was called to get a component of which multiple copies could be on an object. This can easily break and should be changed. Type: \[[c_type]\]") var/list/dc = datum_components if(!dc) return null @@ -211,7 +220,8 @@ if(!length(.)) return list(.) -/datum/proc/AddComponent(new_type, ...) +/datum/proc/_AddComponent(list/raw_args) + var/new_type = raw_args[1] var/datum/component/nt = new_type var/dm = initial(nt.dupe_mode) var/dt = initial(nt.dupe_type) @@ -226,7 +236,7 @@ new_comp = nt nt = new_comp.type - args[1] = src + raw_args[1] = src if(dm != COMPONENT_DUPE_ALLOWED) if(!dt) @@ -237,26 +247,38 @@ switch(dm) if(COMPONENT_DUPE_UNIQUE) if(!new_comp) - new_comp = new nt(arglist(args)) + new_comp = new nt(raw_args) if(!QDELETED(new_comp)) old_comp.InheritComponent(new_comp, TRUE) QDEL_NULL(new_comp) if(COMPONENT_DUPE_HIGHLANDER) if(!new_comp) - new_comp = new nt(arglist(args)) + new_comp = new nt(raw_args) if(!QDELETED(new_comp)) new_comp.InheritComponent(old_comp, FALSE) QDEL_NULL(old_comp) if(COMPONENT_DUPE_UNIQUE_PASSARGS) if(!new_comp) - var/list/arguments = args.Copy(2) - old_comp.InheritComponent(null, TRUE, arguments) + var/list/arguments = raw_args.Copy(2) + arguments.Insert(1, null, TRUE) + old_comp.InheritComponent(arglist(arguments)) else old_comp.InheritComponent(new_comp, TRUE) + if(COMPONENT_DUPE_SELECTIVE) + var/list/arguments = raw_args.Copy() + arguments[1] = new_comp + var/make_new_component = TRUE + for(var/datum/component/C in GetComponents(new_type)) + if(C.CheckDupeComponent(arglist(arguments))) + make_new_component = FALSE + QDEL_NULL(new_comp) + break + if(!new_comp && make_new_component) + new_comp = new nt(raw_args) else if(!new_comp) - new_comp = new nt(arglist(args)) // There's a valid dupe mode but there's no old component, act like normal + new_comp = new nt(raw_args) // There's a valid dupe mode but there's no old component, act like normal else if(!new_comp) - new_comp = new nt(arglist(args)) // Dupes are allowed, act like normal + new_comp = new nt(raw_args) // Dupes are allowed, act like normal if(!old_comp && !QDELETED(new_comp)) // Nothing related to duplicate components happened and the new component is healthy SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_comp) @@ -266,7 +288,7 @@ /datum/proc/LoadComponent(component_type, ...) . = GetComponent(component_type) if(!.) - return AddComponent(arglist(args)) + return _AddComponent(args) /datum/component/proc/RemoveComponent() if(!parent) diff --git a/code/datums/components/anti_magic.dm b/code/datums/components/anti_magic.dm index 9b03284513a72..c6ef885af1847 100644 --- a/code/datums/components/anti_magic.dm +++ b/code/datums/components/anti_magic.dm @@ -3,6 +3,7 @@ var/holy = FALSE var/charges = INFINITY var/blocks_self = TRUE + var/allowed_slots = ~ITEM_SLOT_BACKPACK var/datum/callback/reaction var/datum/callback/expire @@ -24,15 +25,21 @@ expire = _expire /datum/component/anti_magic/proc/on_equip(datum/source, mob/equipper, slot) - if(slot == SLOT_IN_BACKPACK) + SIGNAL_HANDLER + + if(!(allowed_slots & slot)) //Check that the slot is valid for antimagic UnregisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC) return RegisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC, .proc/protect, TRUE) /datum/component/anti_magic/proc/on_drop(datum/source, mob/user) + SIGNAL_HANDLER + UnregisterSignal(user, COMSIG_MOB_RECEIVE_MAGIC) /datum/component/anti_magic/proc/protect(datum/source, mob/user, _magic, _holy, major, self, list/protection_sources) + SIGNAL_HANDLER + if(((_magic && magic) || (_holy && holy)) && (!self || blocks_self)) protection_sources += parent reaction?.Invoke(user, major) diff --git a/code/datums/components/aquarium.dm b/code/datums/components/aquarium.dm new file mode 100644 index 0000000000000..0658a3f9e2038 --- /dev/null +++ b/code/datums/components/aquarium.dm @@ -0,0 +1,267 @@ +/// Allows movables to be inserted/displayed in aquariums. +/datum/component/aquarium_content + /// This is a datum that describes our in-aquarium functionality + var/datum/aquarium_behaviour/properties + + /// Keeps track of our current aquarium. + var/obj/structure/aquarium/current_aquarium + + //This is visual effect holder that will end up in aquarium's vis_contents + var/obj/effect/vc_obj + + /// Base px offset of the visual object in current aquarium aka current base position + var/base_px = 0 + /// Base px offset of the visual object in current aquarium aka current base position + var/base_py = 0 + //Current layer for the visual object + var/base_layer + //If flopping animation was applied to parent, tracked to stop it on removal/destroy + var/flopping = FALSE + +/datum/component/aquarium_content/Initialize(property_type) + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + if(ispath(property_type, /datum/aquarium_behaviour)) + properties = new property_type + else + CRASH("Invalid property type provided for aquarium content component") + properties.parent = src + + ADD_TRAIT(parent, TRAIT_FISH_CASE_COMPATIBILE, src) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/enter_aquarium) + //If component is added to something already in aquarium at the time initialize it properly. + var/atom/movable/movable_parent = parent + if(istype(movable_parent.loc, /obj/structure/aquarium)) + on_inserted(movable_parent.loc) + + +/datum/component/aquarium_content/PreTransfer() + . = ..() + REMOVE_TRAIT(parent, TRAIT_FISH_CASE_COMPATIBILE, src) + +/datum/component/aquarium_content/Destroy(force, silent) + if(current_aquarium) + remove_from_aquarium() + stop_flopping() + QDEL_NULL(vc_obj) + QDEL_NULL(properties) + return ..() + +/datum/component/aquarium_content/proc/enter_aquarium(datum/source, OldLoc, Dir, Forced) + SIGNAL_HANDLER + var/atom/movable/movable_parent = parent + if(istype(movable_parent.loc, /obj/structure/aquarium)) + on_inserted(movable_parent.loc) + if(HAS_TRAIT(movable_parent.loc, TRAIT_FISH_SAFE_STORAGE)) + on_tank_stasis() + +/datum/component/aquarium_content/proc/is_ready_to_insert(obj/structure/aquarium/aquarium) + //This is kinda awful but we're unaware of other fish + if(properties.unique) + for(var/atom/movable/fish_or_prop in aquarium) + if(fish_or_prop == parent) + continue + var/datum/component/aquarium_content/other_content = fish_or_prop.GetComponent(/datum/component/aquarium_content) + if(other_content && other_content.properties.type == properties.type) + return FALSE + return TRUE + +/datum/component/aquarium_content/proc/on_inserted(atom/aquarium) + current_aquarium = aquarium + RegisterSignal(current_aquarium, COMSIG_ATOM_EXITED, .proc/on_removed) + RegisterSignal(current_aquarium, COMSIG_AQUARIUM_SURFACE_CHANGED, .proc/on_surface_changed) + RegisterSignal(current_aquarium, COMSIG_AQUARIUM_FLUID_CHANGED,.proc/on_fluid_changed) + RegisterSignal(current_aquarium, COMSIG_PARENT_ATTACKBY, .proc/attack_reaction) + properties.on_inserted() + + //If we don't have vc object yet build it + if(!vc_obj) + vc_obj = generate_base_vc() + + //Set default position and layer + set_vc_base_position() + generate_animation() + + //Finally add it to to objects vis_contents + current_aquarium.vis_contents |= vc_obj + + +/// Aquarium surface changed in some way, we need to recalculate base position and aninmation +/datum/component/aquarium_content/proc/on_surface_changed() + SIGNAL_HANDLER + set_vc_base_position() + generate_animation() //our animation start point changed, gotta redo + +/// Our aquarium is hit with stuff +/datum/component/aquarium_content/proc/attack_reaction(datum/source, obj/item/thing, mob/user, params) + SIGNAL_HANDLER + if(istype(thing, /obj/item/fish_feed)) + properties.on_feeding(thing.reagents) + return COMPONENT_NO_AFTERATTACK + else + //stirred effect + generate_animation() + +/datum/component/aquarium_content/proc/on_fluid_changed() + SIGNAL_HANDLER + properties.on_fluid_changed() + +/datum/component/aquarium_content/proc/remove_visual_from_aquarium() + current_aquarium.vis_contents -= vc_obj + if(base_layer) + current_aquarium.free_layer(base_layer) + + +/// Generates common visual object, propeties that don't depend on aquarium surface +/datum/component/aquarium_content/proc/generate_base_vc() + if(!properties) + CRASH("Generating visual without properties.") + + var/obj/effect/visual = new + properties.apply_appearance(visual) + visual.vis_flags |= VIS_INHERIT_ID | VIS_INHERIT_PLANE //plane so it shows properly in containers on inventory ui for handheld cases + return visual + +/// Actually animates the vc holder +/datum/component/aquarium_content/proc/generate_animation() + switch(properties.current_animation) + if(AQUARIUM_ANIMATION_FISH_SWIM) + swim_animation() + return + if(AQUARIUM_ANIMATION_FISH_DEAD) + dead_animation() + return + + +/// Create looping random path animation, pixel offsets parameters include offsets already +/datum/component/aquarium_content/proc/swim_animation() + var/avg_width = round(properties.sprite_width / 2) + var/avg_height = round(properties.sprite_height / 2) + + var/list/aq_properties = current_aquarium.get_surface_properties() + var/px_min = aq_properties[AQUARIUM_PROPERTIES_PX_MIN] + avg_width - 16 + var/px_max = aq_properties[AQUARIUM_PROPERTIES_PX_MAX] - avg_width - 16 + var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 + var/py_max = aq_properties[AQUARIUM_PROPERTIES_PY_MAX] - avg_width - 16 + + var/origin_x = base_px + var/origin_y = base_py + var/prev_x = origin_x + var/prev_y = origin_y + animate(vc_obj, pixel_x = origin_x, time = 0, loop = -1) //Just to start the animation + var/move_number = rand(3, 5) //maybe unhardcode this + for(var/i in 1 to move_number) + //If it's last movement, move back to start otherwise move to some random point + var/target_x = i == move_number ? origin_x : rand(px_min,px_max) //could do with enforcing minimal delta for prettier zigzags + var/target_y = i == move_number ? origin_y : rand(py_min,py_max) + var/dx = prev_x - target_x + var/dy = prev_y - target_y + prev_x = target_x + prev_y = target_y + var/dist = abs(dx) + abs(dy) + var/eyeballed_time = dist * 2 //2ds per px + //Face the direction we're going + var/matrix/dir_mx = properties.base_transform() + if(dx <= 0) //assuming default sprite is facing left here + dir_mx.Scale(-1, 1) + animate(transform = dir_mx, time = 0, loop = -1) + animate(pixel_x = target_x, pixel_y = target_y, time = eyeballed_time, loop = -1) + +/datum/component/aquarium_content/proc/dead_animation() + //Set base_py to lowest possible value + var/avg_height = round(properties.sprite_height / 2) + var/list/aq_properties = current_aquarium.get_surface_properties() + var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 + base_py = py_min + animate(vc_obj, pixel_y = py_min, time = 1) //flop to bottom and end current animation. + +#define PAUSE_BETWEEN_PHASES 15 +#define PAUSE_BETWEEN_FLOPS 2 +#define FLOP_COUNT 2 +#define FLOP_DEGREE 20 +#define FLOP_SINGLE_MOVE_TIME 1.5 +#define JUMP_X_DISTANCE 5 +#define JUMP_Y_DISTANCE 6 +/// This animation should be applied to actual parent atom instead of vc_object. +/proc/flop_animation(atom/movable/animation_target) + var/pause_between = PAUSE_BETWEEN_PHASES + rand(1, 5) //randomized a bit so fish are not in sync + animate(animation_target, time = pause_between, loop = -1) + //move nose down and up + for(var/_ in 1 to FLOP_COUNT) + var/matrix/up_matrix = matrix() + up_matrix.Turn(FLOP_DEGREE) + var/matrix/down_matrix = matrix() + down_matrix.Turn(-FLOP_DEGREE) + animate(transform = down_matrix, time = FLOP_SINGLE_MOVE_TIME, loop = -1) + animate(transform = up_matrix, time = FLOP_SINGLE_MOVE_TIME, loop = -1) + animate(transform = matrix(), time = FLOP_SINGLE_MOVE_TIME, loop = -1, easing = BOUNCE_EASING | EASE_IN) + animate(time = PAUSE_BETWEEN_FLOPS, loop = -1) + //bounce up and down + animate(time = pause_between, loop = -1, flags = ANIMATION_PARALLEL) + var/jumping_right = FALSE + var/up_time = 3 * FLOP_SINGLE_MOVE_TIME / 2 + for(var/_ in 1 to FLOP_COUNT) + jumping_right = !jumping_right + var/x_step = jumping_right ? JUMP_X_DISTANCE/2 : -JUMP_X_DISTANCE/2 + animate(time = up_time, pixel_y = JUMP_Y_DISTANCE , pixel_x=x_step, loop = -1, flags= ANIMATION_RELATIVE, easing = BOUNCE_EASING | EASE_IN) + animate(time = up_time, pixel_y = -JUMP_Y_DISTANCE, pixel_x=x_step, loop = -1, flags= ANIMATION_RELATIVE, easing = BOUNCE_EASING | EASE_OUT) + animate(time = PAUSE_BETWEEN_FLOPS, loop = -1) +#undef PAUSE_BETWEEN_PHASES +#undef PAUSE_BETWEEN_FLOPS +#undef FLOP_COUNT +#undef FLOP_DEGREE +#undef FLOP_SINGLE_MOVE_TIME +#undef JUMP_X_DISTANCE +#undef JUMP_Y_DISTANCE + + +/// Starts flopping animation +/datum/component/aquarium_content/proc/start_flopping() + if(!flopping && istype(parent,/obj/item/fish)) //Requires update_transform/animate_wrappers to be less restrictive. + flopping = TRUE + flop_animation(parent) + +/// Stops flopping animation +/datum/component/aquarium_content/proc/stop_flopping() + if(flopping) + flopping = FALSE + animate(parent, transform = matrix()) //stop animation + +/datum/component/aquarium_content/proc/set_vc_base_position() + var/list/aq_properties = current_aquarium.get_surface_properties() + if(properties.randomize_position) + var/avg_width = round(properties.sprite_width / 2) + var/avg_height = round(properties.sprite_height / 2) + var/px_min = aq_properties[AQUARIUM_PROPERTIES_PX_MIN] + avg_width - 16 + var/px_max = aq_properties[AQUARIUM_PROPERTIES_PX_MAX] - avg_width - 16 + var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 + var/py_max = aq_properties[AQUARIUM_PROPERTIES_PY_MAX] - avg_width - 16 + + base_px = rand(px_min,px_max) + base_py = rand(py_min,py_max) + + vc_obj.pixel_x = base_px + vc_obj.pixel_y = base_py + + if(base_layer) + current_aquarium.free_layer(base_layer) + base_layer = current_aquarium.request_layer(properties.layer_mode) + vc_obj.layer = base_layer + +/datum/component/aquarium_content/proc/on_removed(datum/source, atom/movable/mover) + SIGNAL_HANDLER + if(mover != parent) + return + remove_from_aquarium() + +/datum/component/aquarium_content/proc/remove_from_aquarium() + properties.before_removal() + UnregisterSignal(current_aquarium, list(COMSIG_AQUARIUM_SURFACE_CHANGED, COMSIG_AQUARIUM_FLUID_CHANGED, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_EXITED)) + remove_visual_from_aquarium() + current_aquarium = null + //We do not stop processing properties here. We want fish to die outside of aquariums after first insert. We only stop processing in properties.death or destroy + +/datum/component/aquarium_content/proc/on_tank_stasis() + // Stop processing until inserted into aquarium again. + stop_flopping() + STOP_PROCESSING(SSobj, properties) diff --git a/code/datums/components/archaeology.dm b/code/datums/components/archaeology.dm index b5740650e9f0b..93fb0ff60a932 100644 --- a/code/datums/components/archaeology.dm +++ b/code/datums/components/archaeology.dm @@ -15,7 +15,7 @@ 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_PARENT_ATTACKBY, .proc/Dig) RegisterSignal(parent, COMSIG_ATOM_EX_ACT, .proc/BombDig) RegisterSignal(parent, COMSIG_ATOM_SING_PULL, .proc/SingDig) @@ -26,6 +26,8 @@ _archdrops[I] += other_archdrops[I] /datum/component/archaeology/proc/Dig(datum/source, obj/item/I, mob/living/user) + SIGNAL_HANDLER + if(dug) to_chat(user, "Looks like someone has dug here already.") return @@ -73,6 +75,8 @@ callback.Invoke() /datum/component/archaeology/proc/SingDig(datum/source, S, current_size) + SIGNAL_HANDLER + switch(current_size) if(STAGE_THREE) if(prob(30)) @@ -85,6 +89,8 @@ gets_dug() /datum/component/archaeology/proc/BombDig(datum/source, severity, target) + SIGNAL_HANDLER + switch(severity) if(3) return diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm index 6f1ba6a8392ec..0bfc14d21bde5 100644 --- a/code/datums/components/armor_plate.dm +++ b/code/datums/components/armor_plate.dm @@ -30,6 +30,8 @@ upgrade_name = initial(typecast.name) /datum/component/armor_plate/proc/examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + //upgrade_item could also be typecast here instead if(ismecha(parent)) if(amount) @@ -46,6 +48,8 @@ examine_list += "It can be strengthened with up to [maxamount] [upgrade_name]." /datum/component/armor_plate/proc/applyplate(datum/source, obj/item/I, mob/user, params) + SIGNAL_HANDLER + if(!istype(I,upgrade_item)) return if(amount >= maxamount) @@ -73,6 +77,8 @@ /datum/component/armor_plate/proc/dropplates(datum/source, force) + SIGNAL_HANDLER + if(ismecha(parent)) //items didn't drop the plates before and it causes erroneous behavior for the time being with collapsible helmets for(var/i in 1 to amount) new upgrade_item(get_turf(parent)) diff --git a/code/datums/components/beetlejuice.dm b/code/datums/components/beetlejuice.dm index 42123fdef186e..82c94a3da64f1 100644 --- a/code/datums/components/beetlejuice.dm +++ b/code/datums/components/beetlejuice.dm @@ -34,19 +34,21 @@ update_regex() /datum/component/beetlejuice/proc/say_react(datum/source, mob/speaker,message) + SIGNAL_HANDLER + if(!speaker || !message || !active) return var/found = R.Find(message) if(found) - var/occurences = 1 + var/occurrences = 1 while(R.Find(message)) - occurences++ + occurrences++ R.next = 1 if(!first_heard[speaker] || (first_heard[speaker] + max_delay < world.time)) first_heard[speaker] = world.time count[speaker] = 0 - count[speaker] += occurences + count[speaker] += occurrences if(count[speaker] >= min_count) first_heard -= speaker count -= speaker @@ -57,4 +59,4 @@ var/atom/movable/AM = parent do_teleport(AM,get_turf(target)) active = FALSE - addtimer(VARSET_CALLBACK(src, active, TRUE), cooldown) \ No newline at end of file + addtimer(VARSET_CALLBACK(src, active, TRUE), cooldown) diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index 87de3d9c95ba0..bc2bc60effe1d 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -23,6 +23,8 @@ RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/onItemAttack) /datum/component/butchering/proc/onItemAttack(obj/item/source, mob/living/M, mob/living/user) + SIGNAL_HANDLER + if(user.a_intent == INTENT_HARM && M.stat == DEAD && (M.butcher_results || M.guaranteed_butcher_results)) //can we butcher it? if(butchering_enabled && (can_be_blunt || source.is_sharp())) INVOKE_ASYNC(src, .proc/startButcher, source, M, user) diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index 698a00c506532..83d8b2effe17e 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -3,8 +3,8 @@ var/max_damage var/probability var/flags + COOLDOWN_DECLARE(caltrop_cooldown) - var/cooldown = 0 /datum/component/caltrop/Initialize(_min_damage = 0, _max_damage = 0, _probability = 100, _flags = NONE) min_damage = _min_damage @@ -52,7 +52,8 @@ damage *= 1.3 H.apply_damage(damage, BRUTE, picked_def_zone) - if(cooldown < world.time - 10) //cooldown to avoid message spam. + if(COOLDOWN_FINISHED(src, caltrop_cooldown)) + COOLDOWN_START(src, caltrop_cooldown, 1 SECONDS) //cooldown to avoid message spam. if(!H.incapacitated(ignore_restraints = TRUE)) H.visible_message("[H] steps on [A].", \ "You step on [A]!") @@ -60,7 +61,6 @@ H.visible_message("[H] slides on [A]!", \ "You slide on [A]!") - cooldown = world.time if(is_species(H, /datum/species/squid)) H.Paralyze(10) else diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index 8bba40e8c7810..0aea9f08b2b4c 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -4,7 +4,8 @@ var/fall_message = "GAH! Ah... where are you?" var/oblivion_message = "You stumble and stare into the abyss before you. It stares back, and you fall into the enveloping dark." - var/static/list/falling_atoms = list() // Atoms currently falling into chasms + /// List of refs to falling objects -> how many levels deep we've fallen + var/static/list/falling_atoms = list() var/static/list/forbidden_types = typecacheof(list( /obj/singularity, /obj/docking_port, @@ -29,12 +30,14 @@ START_PROCESSING(SSobj, src) // process on create, in case stuff is still there /datum/component/chasm/proc/Entered(datum/source, atom/movable/AM) + SIGNAL_HANDLER + START_PROCESSING(SSobj, src) drop_stuff(AM) /datum/component/chasm/process() if (!drop_stuff()) - STOP_PROCESSING(SSobj, src) + return PROCESS_KILL /datum/component/chasm/proc/is_safe() //if anything matching this typecache is found in the chasm, we don't drop things @@ -48,7 +51,6 @@ return LAZYLEN(found_safeties) /datum/component/chasm/proc/drop_stuff(AM) - . = 0 if (is_safe()) return FALSE @@ -56,12 +58,13 @@ var/to_check = AM ? list(AM) : parent.contents for (var/thing in to_check) if (droppable(thing)) - . = 1 + . = TRUE INVOKE_ASYNC(src, .proc/drop, thing) /datum/component/chasm/proc/droppable(atom/movable/AM) + var/datum/weakref/falling_ref = WEAKREF(AM) // avoid an infinite loop, but allow falling a large distance - if(falling_atoms[AM] && falling_atoms[AM] > 30) + if(falling_atoms[falling_ref] && falling_atoms[falling_ref] > 30) return FALSE if(!isliving(AM) && !isobj(AM)) return FALSE @@ -87,10 +90,12 @@ return TRUE /datum/component/chasm/proc/drop(atom/movable/AM) + var/datum/weakref/falling_ref = WEAKREF(AM) //Make sure the item is still there after our sleep - if(!AM || QDELETED(AM)) + if(!AM || !falling_ref?.resolve()) + falling_atoms -= falling_ref return - falling_atoms[AM] = (falling_atoms[AM] || 0) + 1 + falling_atoms[falling_ref] = (falling_atoms[falling_ref] || 0) + 1 var/turf/T = target_turf if(T) @@ -102,7 +107,7 @@ var/mob/living/L = AM L.Paralyze(100) L.adjustBruteLoss(30) - falling_atoms -= AM + falling_atoms -= falling_ref else // send to oblivion @@ -132,7 +137,7 @@ var/mob/living/silicon/robot/S = AM qdel(S.mmi) - falling_atoms -= AM + falling_atoms -= falling_ref qdel(AM) if(AM && !QDELETED(AM)) //It's indestructible var/atom/parent = src.parent diff --git a/code/datums/components/construction.dm b/code/datums/components/construction.dm index 01df44752c977..34fa7a0cd7c9c 100644 --- a/code/datums/components/construction.dm +++ b/code/datums/components/construction.dm @@ -20,6 +20,8 @@ update_parent(index) /datum/component/construction/proc/examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + if(desc) examine_list += desc @@ -30,7 +32,9 @@ update_parent(index) /datum/component/construction/proc/action(datum/source, obj/item/I, mob/living/user) - return check_step(I, user) + SIGNAL_HANDLER + + return INVOKE_ASYNC(src, .proc/check_step, I, user) /datum/component/construction/proc/update_index(diff) index += diff diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 1e5247c9ae18f..278c7d9344d2b 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -4,7 +4,7 @@ /datum/component/personal_crafting/proc/create_mob_button(mob/user, client/CL) var/datum/hud/H = user.hud_used - var/obj/screen/craft/C = new() + var/atom/movable/screen/craft/C = new() C.icon = H.ui_style H.static_inventory += C CL.screen += C @@ -189,6 +189,20 @@ return ", missing tool." return ", missing component." +/datum/component/personal_crafting/proc/construct_item_ui(mob/user, datum/crafting_recipe/TR) + var/atom/movable/result = construct_item(user, TR) + if(!istext(result)) //We made an item and didn't get a fail message + if(ismob(user) && isitem(result)) //In case the user is actually possessing a non mob like a machine + user.put_in_hands(result) + else + result.forceMove(user.drop_location()) + to_chat(user, "[TR.name] constructed.") + else + to_chat(user, "Construction failed[result]") + busy = FALSE + SStgui.update_uis(src) + + /*Del reqs works like this: Loop over reqs var of the recipe @@ -311,9 +325,11 @@ Deletion.Cut(Deletion.len) qdel(DL) -/datum/component/personal_crafting/proc/component_ui_interact(obj/screen/craft/image, location, control, params, user) +/datum/component/personal_crafting/proc/component_ui_interact(atom/movable/screen/craft/image, location, control, params, user) + SIGNAL_HANDLER + if(user == parent) - ui_interact(user) + INVOKE_ASYNC(src, .proc/ui_interact, user) /datum/component/personal_crafting/ui_state(mob/user) return GLOB.not_incapacitated_turf_state @@ -387,20 +403,15 @@ return switch(action) if("make") + if(busy) // Prevent potentially crafting multiple things at once + return var/mob/user = usr var/datum/crafting_recipe/TR = locate(params["recipe"]) in GLOB.crafting_recipes + if(!TR) + return busy = TRUE - ui_interact(user) - var/atom/movable/result = construct_item(user, TR) - if(!istext(result)) //We made an item and didn't get a fail message - if(ismob(user) && isitem(result)) //In case the user is actually possessing a non mob like a machine - user.put_in_hands(result) - else - result.forceMove(user.drop_location()) - to_chat(user, "[TR.name] constructed.") - else - to_chat(user, "Construction failed[result]") - busy = FALSE + . = TRUE + INVOKE_ASYNC(src, .proc/construct_item_ui, user, TR) if("toggle_recipes") display_craftable_only = !display_craftable_only . = TRUE @@ -451,3 +462,7 @@ if(!learned_recipes) learned_recipes = list() learned_recipes |= R + +/datum/mind/proc/forget_crafting_recipe(R) + if(learned_recipes) + learned_recipes -= R diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 4a1e7556b7b7f..703bd48383cb4 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -25,16 +25,6 @@ /datum/crafting_recipe/proc/check_requirements(mob/user, list/collected_requirements) return TRUE -/datum/crafting_recipe/pin_removal - name = "Pin Removal" - result = /obj/item/gun - reqs = list(/obj/item/gun = 1) - parts = list(/obj/item/gun = 1) - tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - time = 50 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - /datum/crafting_recipe/IED name = "IED" result = /obj/item/grenade/iedcasing @@ -49,11 +39,11 @@ /datum/crafting_recipe/lance name = "Explosive Lance (Grenade)" - result = /obj/item/twohanded/spear - reqs = list(/obj/item/twohanded/spear = 1, + result = /obj/item/spear/explosive + reqs = list(/obj/item/spear = 1, /obj/item/grenade = 1) - blacklist = list(/obj/item/twohanded/spear/explosive) - parts = list(/obj/item/twohanded/spear = 1, + blacklist = list(/obj/item/spear/bonespear) + parts = list(/obj/item/spear = 1, /obj/item/grenade = 1) time = 15 category = CAT_WEAPONRY @@ -409,7 +399,7 @@ /datum/crafting_recipe/chainsaw name = "Chainsaw" - result = /obj/item/twohanded/required/chainsaw + result = /obj/item/chainsaw reqs = list(/obj/item/circular_saw = 1, /obj/item/stack/cable_coil = 3, /obj/item/stack/sheet/plasteel = 5) @@ -420,7 +410,7 @@ /datum/crafting_recipe/spear name = "Spear" - result = /obj/item/twohanded/spear + result = /obj/item/spear reqs = list(/obj/item/restraints/handcuffs/cable = 1, /obj/item/shard = 1, /obj/item/stack/rods = 1) @@ -615,7 +605,7 @@ result = /obj/item/bombcore/chemical reqs = list( /obj/item/stock_parts/matter_bin = 1, - /obj/item/twohanded/required/gibtonite = 1, + /obj/item/gibtonite = 1, /obj/item/grenade/chem_grenade = 2 ) parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2) @@ -759,7 +749,7 @@ /datum/crafting_recipe/bonespear name = "Bone Spear" - result = /obj/item/twohanded/bonespear + result = /obj/item/spear/bonespear time = 30 reqs = list(/obj/item/stack/sheet/bone = 4, /obj/item/stack/sheet/sinew = 1) @@ -767,7 +757,7 @@ /datum/crafting_recipe/boneaxe name = "Bone Axe" - result = /obj/item/twohanded/fireaxe/boneaxe + result = /obj/item/fireaxe/boneaxe time = 50 reqs = list(/obj/item/stack/sheet/bone = 6, /obj/item/stack/sheet/sinew = 3) @@ -780,23 +770,32 @@ result = /obj/structure/bonfire category = CAT_PRIMAL +/datum/crafting_recipe/skeleton_key + name = "Skeleton Key" + time = 30 + reqs = list(/obj/item/stack/sheet/bone = 5) + result = /obj/item/skeleton_key + always_available = FALSE + category = CAT_PRIMAL + /datum/crafting_recipe/headpike name = "Spike Head (Glass Spear)" time = 65 - reqs = list(/obj/item/twohanded/spear = 1, + reqs = list(/obj/item/spear = 1, /obj/item/bodypart/head = 1) parts = list(/obj/item/bodypart/head = 1, - /obj/item/twohanded/spear = 1) + /obj/item/spear = 1) + blacklist = list(/obj/item/spear/explosive, /obj/item/spear/bonespear) result = /obj/structure/headpike category = CAT_PRIMAL /datum/crafting_recipe/headpikebone name = "Spike Head (Bone Spear)" time = 65 - reqs = list(/obj/item/twohanded/bonespear = 1, + reqs = list(/obj/item/spear/bonespear = 1, /obj/item/bodypart/head = 1) parts = list(/obj/item/bodypart/head = 1, - /obj/item/twohanded/bonespear = 1) + /obj/item/spear/bonespear = 1) result = /obj/structure/headpike/bone category = CAT_PRIMAL @@ -813,7 +812,7 @@ /datum/crafting_recipe/rcl name = "Makeshift Rapid Cable Layer" - result = /obj/item/twohanded/rcl/ghetto + result = /obj/item/rcl/ghetto time = 40 tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH) reqs = list(/obj/item/stack/sheet/iron = 15) @@ -916,7 +915,7 @@ name = "Shank" reqs = list(/obj/item/shard = 1, /obj/item/stack/cable_coil = 10) // 1 glass shard + 10 cable; needs a wirecutter to snip the cable. - result = /obj/item/melee/shank + result = /obj/item/kitchen/knife/shank tools = list(TOOL_WIRECUTTER) time = 20 category = CAT_WEAPONRY @@ -932,3 +931,48 @@ category = CAT_WEAPONRY subcategory = CAT_WEAPON tools = list(TOOL_WIRECUTTER) + +/datum/crafting_recipe/poppy_pin + name = "Poppy Pin" + result = /obj/item/clothing/accessory/poppy_pin + time = 5 + reqs = list(/obj/item/stack/rods = 1, + /obj/item/reagent_containers/food/snacks/grown/poppy = 1) + category = CAT_MISC + +/datum/crafting_recipe/poppy_pin_removal + name = "Poppy Pin Removal" + result = /obj/item/reagent_containers/food/snacks/grown/poppy + time = 5 + reqs = list(/obj/item/clothing/accessory/poppy_pin = 1) + + category = CAT_MISC + +/datum/crafting_recipe/insulated_boxing_gloves + name = "Insulated Boxing Gloves" + result = /obj/item/clothing/gloves/boxing/yellow/insulated + time = 60 + reqs = list(/obj/item/clothing/gloves/boxing = 1, + /obj/item/clothing/gloves/color/yellow = 1) + + category = CAT_CLOTHING + + +/datum/crafting_recipe/aquarium + name = "Aquarium" + result = /obj/structure/aquarium + time = 10 SECONDS + reqs = list(/obj/item/stack/sheet/iron = 15, + /obj/item/stack/sheet/glass = 10, + /obj/item/aquarium_kit = 1 + ) + category = CAT_MISC + +/datum/crafting_recipe/paper_cup + name= "Paper Cup" + result = /obj/item/reagent_containers/food/drinks/sillycup + time = 10 + reqs = list(/obj/item/paper = 1) + category = CAT_MISC + tools = list(TOOL_WIRECUTTER) + diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm index 72e2e323b901d..188a9a5e64744 100644 --- a/code/datums/components/crafting/tailoring.dm +++ b/code/datums/components/crafting/tailoring.dm @@ -56,17 +56,17 @@ time = 20 tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) reqs = list(/obj/item/clothing/glasses/hud/security = 1, - /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/clothing/glasses/sunglasses/advanced = 1, /obj/item/stack/cable_coil = 5) - category = CAT_CLOTHING + category = CAT_EYEWEAR /datum/crafting_recipe/hudsunsecremoval name = "Security HUD removal" - result = /obj/item/clothing/glasses/sunglasses + result = /obj/item/clothing/glasses/sunglasses/advanced time = 20 tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) reqs = list(/obj/item/clothing/glasses/hud/security/sunglasses = 1) - category = CAT_CLOTHING + category = CAT_EYEWEAR /datum/crafting_recipe/hudsunmed name = "Medical HUDsunglasses" @@ -74,17 +74,17 @@ time = 20 tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) reqs = list(/obj/item/clothing/glasses/hud/health = 1, - /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/clothing/glasses/sunglasses/advanced = 1, /obj/item/stack/cable_coil = 5) - category = CAT_CLOTHING + category = CAT_EYEWEAR /datum/crafting_recipe/hudsunmedremoval name = "Medical HUD removal" - result = /obj/item/clothing/glasses/sunglasses + result = /obj/item/clothing/glasses/sunglasses/advanced time = 20 tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) reqs = list(/obj/item/clothing/glasses/hud/health/sunglasses = 1) - category = CAT_CLOTHING + category = CAT_EYEWEAR /datum/crafting_recipe/hudsundiag name = "Diagnostic HUDsunglasses" @@ -92,17 +92,17 @@ time = 20 tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) reqs = list(/obj/item/clothing/glasses/hud/diagnostic = 1, - /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/clothing/glasses/sunglasses/advanced = 1, /obj/item/stack/cable_coil = 5) - category = CAT_CLOTHING + category = CAT_EYEWEAR /datum/crafting_recipe/hudsundiagremoval name = "Diagnostic HUD removal" - result = /obj/item/clothing/glasses/sunglasses + result = /obj/item/clothing/glasses/sunglasses/advanced time = 20 tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) reqs = list(/obj/item/clothing/glasses/hud/diagnostic/sunglasses = 1) - category = CAT_CLOTHING + category = CAT_EYEWEAR /datum/crafting_recipe/beergoggles name = "Beer Goggles" @@ -110,9 +110,17 @@ time = 20 tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) reqs = list(/obj/item/clothing/glasses/science = 1, - /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/clothing/glasses/sunglasses/advanced = 1, /obj/item/stack/cable_coil = 5) - category = CAT_CLOTHING + category = CAT_EYEWEAR + +/datum/crafting_recipe/beergogglesremoval + name = "Beer Goggles removal" + result = /obj/item/clothing/glasses/sunglasses/advanced + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/sunglasses/advanced/reagent = 1) + category = CAT_EYEWEAR /datum/crafting_recipe/sunhudscience name = "Science Sunglasses" @@ -120,17 +128,139 @@ time = 20 tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) reqs = list(/obj/item/clothing/glasses/science = 1, + /obj/item/clothing/glasses/sunglasses/advanced = 1, + /obj/item/stack/cable_coil = 5) + category = CAT_EYEWEAR + +/datum/crafting_recipe/sunhudscienceremoval + name = "Science Sunglasses removal" + result = /obj/item/clothing/glasses/sunglasses/advanced + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/science/sciencesun = 1) + category = CAT_EYEWEAR + +/datum/crafting_recipe/deghudsunsec + name = "Degraded Security HUDsunglasses" + result = /obj/item/clothing/glasses/hud/security/sunglasses/degraded + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/hud/security = 1, /obj/item/clothing/glasses/sunglasses = 1, /obj/item/stack/cable_coil = 5) - category = CAT_CLOTHING + category = CAT_EYEWEAR -/datum/crafting_recipe/beergogglesremoval - name = "Beer Goggles removal" +/datum/crafting_recipe/deghudsunsecremoval + name = "Degraded Security HUD removal" result = /obj/item/clothing/glasses/sunglasses time = 20 tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - reqs = list(/obj/item/clothing/glasses/sunglasses/advanced/reagent = 1) - category = CAT_CLOTHING + reqs = list(/obj/item/clothing/glasses/hud/security/sunglasses/degraded = 1) + category = CAT_EYEWEAR + +/datum/crafting_recipe/deghudsunmed + name = "Degraded Medical HUDsunglasses" + result = /obj/item/clothing/glasses/hud/health/sunglasses/degraded + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/hud/health = 1, + /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/stack/cable_coil = 5) + category = CAT_EYEWEAR + +/datum/crafting_recipe/deghudsunmedremoval + name = "Degraded Medical HUD removal" + result = /obj/item/clothing/glasses/sunglasses + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/hud/health/sunglasses/degraded = 1) + category = CAT_EYEWEAR + +/datum/crafting_recipe/deghudsundiag + name = "Degraded Diagnostic HUDsunglasses" + result = /obj/item/clothing/glasses/hud/diagnostic/sunglasses/degraded + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/hud/diagnostic = 1, + /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/stack/cable_coil = 5) + category = CAT_EYEWEAR + +/datum/crafting_recipe/deghudsundiagremoval + name = "Degraded Diagnostic HUD removal" + result = /obj/item/clothing/glasses/sunglasses + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/hud/diagnostic/sunglasses/degraded = 1) + category = CAT_EYEWEAR + +/datum/crafting_recipe/degsunhudscience + name = "Degraded Science Sunglasses" + result = /obj/item/clothing/glasses/science/sciencesun/degraded + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/science = 1, + /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/stack/cable_coil = 5) + category = CAT_EYEWEAR + +/datum/crafting_recipe/degsunhudscienceremoval + name = "Degraded Science Sunglasses removal" + result = /obj/item/clothing/glasses/sunglasses + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/science/sciencesun/degraded = 1) + category = CAT_EYEWEAR + +/datum/crafting_recipe/hudpresmed + name = "Prescription Medical HUDglasses" + result = /obj/item/clothing/glasses/hud/health/prescription + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/hud/health = 1, + /obj/item/clothing/glasses/regular/ = 1, + /obj/item/stack/cable_coil = 5) + category = CAT_EYEWEAR + +/datum/crafting_recipe/hudpressec + name = "Prescription Security HUDglasses" + result = /obj/item/clothing/glasses/hud/security/prescription + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/hud/security = 1, + /obj/item/clothing/glasses/regular/ = 1, + /obj/item/stack/cable_coil = 5) + category = CAT_EYEWEAR + +/datum/crafting_recipe/hudpressci + name = "Prescription Science Goggles" + result = /obj/item/clothing/glasses/science/prescription + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/science = 1, + /obj/item/clothing/glasses/regular/ = 1, + /obj/item/stack/cable_coil = 5) + category = CAT_EYEWEAR + +/datum/crafting_recipe/hudpresmeson + name = "Prescription Meson Scanner" + result = /obj/item/clothing/glasses/meson/prescription + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/meson = 1, + /obj/item/clothing/glasses/regular/ = 1, + /obj/item/stack/cable_coil = 5) + category = CAT_EYEWEAR + +/datum/crafting_recipe/hudpresdiag + name = "Prescription Diagnostic HUDsunglasses" + result = /obj/item/clothing/glasses/hud/diagnostic/prescription + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/hud/diagnostic = 1, + /obj/item/clothing/glasses/regular/ = 1, + /obj/item/stack/cable_coil = 5) + category = CAT_EYEWEAR /datum/crafting_recipe/ghostsheet name = "Ghost Sheet" @@ -162,3 +292,34 @@ /obj/item/stack/sheet/glass = 1) category = CAT_CLOTHING +/datum/crafting_recipe/rainbowbunchcrown + name = "Rainbow Flower Crown" + result = /obj/item/clothing/head/rainbowbunchcrown/ + time = 20 + reqs = list(/obj/item/reagent_containers/food/snacks/grown/rainbow_flower = 5, + /obj/item/stack/cable_coil = 3) + category = CAT_CLOTHING + +/datum/crafting_recipe/sunflowercrown + name = "Sunflower Crown" + result = /obj/item/clothing/head/sunflowercrown/ + time = 20 + reqs = list(/obj/item/grown/sunflower = 5, + /obj/item/stack/cable_coil = 3) + category = CAT_CLOTHING + +/datum/crafting_recipe/poppycrown + name = "Poppy Crown" + result = /obj/item/clothing/head/poppycrown/ + time = 20 + reqs = list(/obj/item/reagent_containers/food/snacks/grown/poppy = 5, + /obj/item/stack/cable_coil = 3) + category = CAT_CLOTHING + +/datum/crafting_recipe/lilycrown + name = "Lily Crown" + result = /obj/item/clothing/head/lilycrown/ + time = 20 + reqs = list(/obj/item/reagent_containers/food/snacks/grown/poppy/lily = 3, + /obj/item/stack/cable_coil = 3) + category = CAT_CLOTHING diff --git a/code/datums/components/deadchat_control.dm b/code/datums/components/deadchat_control.dm new file mode 100644 index 0000000000000..31a00eb4daa2c --- /dev/null +++ b/code/datums/components/deadchat_control.dm @@ -0,0 +1,106 @@ +#define DEMOCRACY_MODE "democracy" +#define ANARCHY_MODE "anarchy" + +/datum/component/deadchat_control + dupe_mode = COMPONENT_DUPE_UNIQUE + var/timerid + + var/list/datum/callback/inputs = list() + var/list/ckey_to_cooldown = list() + var/orbiters = list() + var/deadchat_mode + var/input_cooldown + +/datum/component/deadchat_control/Initialize(_deadchat_mode, _inputs, _input_cooldown = 12 SECONDS) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, COMSIG_ATOM_ORBIT_BEGIN, .proc/orbit_begin) + RegisterSignal(parent, COMSIG_ATOM_ORBIT_STOP, .proc/orbit_stop) + deadchat_mode = _deadchat_mode + inputs = _inputs + input_cooldown = _input_cooldown + if(deadchat_mode == DEMOCRACY_MODE) + timerid = addtimer(CALLBACK(src, .proc/democracy_loop), input_cooldown, TIMER_STOPPABLE | TIMER_LOOP) + notify_ghosts("[parent] is now deadchat controllable!", source = parent, action = NOTIFY_ORBIT, header="Something Interesting!") + + +/datum/component/deadchat_control/Destroy(force, silent) + inputs = null + orbiters = null + ckey_to_cooldown = null + return ..() + +/datum/component/deadchat_control/proc/deadchat_react(mob/source, message) + message = lowertext(message) + if(!inputs[message]) + return + if(deadchat_mode == ANARCHY_MODE) + var/cooldown = ckey_to_cooldown[source.ckey] + if(cooldown) + return MOB_DEADSAY_SIGNAL_INTERCEPT + inputs[message].Invoke() + ckey_to_cooldown[source.ckey] = TRUE + addtimer(CALLBACK(src, .proc/remove_cooldown, source.ckey), input_cooldown) + else if(deadchat_mode == DEMOCRACY_MODE) + ckey_to_cooldown[source.ckey] = message + return MOB_DEADSAY_SIGNAL_INTERCEPT + +/datum/component/deadchat_control/proc/remove_cooldown(ckey) + ckey_to_cooldown.Remove(ckey) + +/datum/component/deadchat_control/proc/democracy_loop() + if(QDELETED(parent) || deadchat_mode != DEMOCRACY_MODE) + deltimer(timerid) + return + var/result = count_democracy_votes() + if(!isnull(result)) + inputs[result].Invoke() + var/message = "[parent] has done action [result]!
New vote started. It will end in [input_cooldown/10] seconds.
" + for(var/M in orbiters) + to_chat(M, message) + else + var/message = "No votes were cast this cycle." + for(var/M in orbiters) + to_chat(M, message) + +/datum/component/deadchat_control/proc/count_democracy_votes() + if(!length(ckey_to_cooldown)) + return + var/list/votes = list() + for(var/command in inputs) + votes["[command]"] = 0 + for(var/vote in ckey_to_cooldown) + votes[ckey_to_cooldown[vote]]++ + ckey_to_cooldown.Remove(vote) + + // Solve which had most votes. + var/prev_value = 0 + var/result + for(var/vote in votes) + if(votes[vote] > prev_value) + prev_value = votes[vote] + result = vote + + if(result in inputs) + return result + +/datum/component/deadchat_control/vv_edit_var(var_name, var_value) + . = ..() + if(!.) + return + if(var_name != NAMEOF(src, deadchat_mode)) + return + ckey_to_cooldown = list() + if(var_value == DEMOCRACY_MODE) + timerid = addtimer(CALLBACK(src, .proc/democracy_loop), input_cooldown, TIMER_STOPPABLE | TIMER_LOOP) + else + deltimer(timerid) + +/datum/component/deadchat_control/proc/orbit_begin(atom/source, atom/orbiter) + RegisterSignal(orbiter, COMSIG_MOB_DEADSAY, .proc/deadchat_react) + orbiters |= orbiter + +/datum/component/deadchat_control/proc/orbit_stop(atom/source, atom/orbiter) + if(orbiter in orbiters) + UnregisterSignal(orbiter, COMSIG_MOB_DEADSAY) + orbiters -= orbiter \ No newline at end of file diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm deleted file mode 100644 index 8fb3405af0d67..0000000000000 --- a/code/datums/components/decal.dm +++ /dev/null @@ -1,75 +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_NEVER, _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 != CLEAN_NEVER) - 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 diff --git a/code/datums/components/decals/blood.dm b/code/datums/components/decals/blood.dm deleted file mode 100644 index 3114ddb24e9e4..0000000000000 --- a/code/datums/components/decals/blood.dm +++ /dev/null @@ -1,39 +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/generate_appearance(_icon, _icon_state, _dir, _layer, _color) - var/obj/item/I = parent - if(!_icon) - _icon = 'icons/effects/blood.dmi' - if(!_icon_state) - _icon_state = "itemblood" - var/icon = initial(I.icon) - var/icon_state = initial(I.icon_state) - if(!icon || !icon_state) - // It's something which takes on the look of other items, probably - icon = I.icon - icon_state = I.icon_state - var/static/list/blood_splatter_appearances = list() - //try to find a pre-processed blood-splatter. otherwise, make a new one - var/index = "[REF(icon)]-[icon_state]" - pic = blood_splatter_appearances[index] - - if(!pic) - var/icon/blood_splatter_icon = icon(initial(I.icon), initial(I.icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object - blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) - blood_splatter_icon.Blend(icon(_icon, _icon_state), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant - pic = mutable_appearance(blood_splatter_icon, initial(I.icon_state)) - blood_splatter_appearances[index] = pic - return TRUE - -/datum/component/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override) - var/atom/A = parent - override[EXAMINE_POSITION_ARTICLE] = A.gender == PLURAL? "some" : "a" - override[EXAMINE_POSITION_BEFORE] = " blood-stained " - return COMPONENT_EXNAME_CHANGED diff --git a/code/datums/components/edit_complainer.dm b/code/datums/components/edit_complainer.dm index bf52296e2cb74..632a7c6d7492e 100644 --- a/code/datums/components/edit_complainer.dm +++ b/code/datums/components/edit_complainer.dm @@ -19,5 +19,7 @@ RegisterSignal(SSdcs, COMSIG_GLOB_VAR_EDIT, .proc/var_edit_react) /datum/component/edit_complainer/proc/var_edit_react(datum/source, list/arguments) + SIGNAL_HANDLER + var/atom/movable/master = parent master.say(pick(say_lines)) diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm new file mode 100644 index 0000000000000..389815e36fe84 --- /dev/null +++ b/code/datums/components/embedded.dm @@ -0,0 +1,337 @@ +/* + 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. + + - 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. + + + 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 random pain chance and 0 jostling chance. 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 + +*/ + + +/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/max_damage_mult + var/remove_pain_mult + var/rip_time + var/ignore_throwspeed_threshold + var/jostle_chance + var/jostle_pain_mult + var/pain_stam_pct + var/armour_block + + var/harmful + +/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, + max_damage_mult = EMBEDDED_MAX_DAMAGE_MULTIPLIER, + remove_pain_mult = EMBEDDED_UNSAFE_REMOVAL_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, + armour_block = EMBEDDED_ARMOUR_BLOCK) + + if(!iscarbon(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.max_damage_mult = max_damage_mult + src.remove_pain_mult = remove_pain_mult + src.rip_time = rip_time + 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.armour_block = armour_block + src.weapon = I + + if(!weapon.isEmbedHarmless()) + harmful = TRUE + + weapon.embedded(parent, part) + START_PROCESSING(SSdcs, src) + var/mob/living/carbon/victim = parent + + limb.embedded_objects |= weapon // on the inside... on the inside... + weapon.forceMove(victim) + RegisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING), .proc/weaponDeleted) + victim.visible_message("[weapon] [harmful ? "embeds" : "sticks"] itself [harmful ? "in" : "to"] [victim]'s [limb.name]!", "[weapon] [harmful ? "embeds" : "sticks"] itself [harmful ? "in" : "to"] your [limb.name]!") + + if(harmful) + victim.throw_alert("embeddedobject", /atom/movable/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! + SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) + +/datum/component/embedded/Destroy() + var/mob/living/carbon/victim = parent + if(victim && !victim.has_embedded_objects()) + victim.clear_alert("embeddedobject") + SEND_SIGNAL(victim, COMSIG_CLEAR_MOOD_EVENT, "embedded") + if(weapon) + UnregisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING)) + weapon = null + limb = null + return ..() + +/datum/component/embedded/RegisterWithParent() + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/jostleCheck) + RegisterSignal(parent, COMSIG_CARBON_EMBED_RIP, .proc/ripOut) + RegisterSignal(parent, COMSIG_CARBON_EMBED_REMOVAL, .proc/safeRemove) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/checkRemoval) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/tryPullOutOther) + +/datum/component/embedded/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_EMBED_RIP, COMSIG_CARBON_EMBED_REMOVAL, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND)) + +/datum/component/embedded/process(delta_time) + 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) + return + + if(victim.stat == DEAD) + return + + var/damage = weapon.w_class * pain_mult + var/max_damage = weapon.w_class * max_damage_mult + weapon.throwforce + var/chance = DT_PROB_RATE(pain_chance / 100, delta_time) * 100 + if(pain_stam_pct && victim.stam_paralyzed) //if it's a less-lethal embed, give them a break if they're already stamcritted + chance *= 0.2 + damage *= 0.5 + else if(victim.lying) + chance *= 0.2 + + if(harmful && prob(chance)) + var/damage_left = max_damage - limb.get_damage() + var/damage_wanted = (1-pain_stam_pct) * damage + var/damage_to_deal = CLAMP(damage_wanted, 0, damage_left) + var/damage_as_stam = damage_wanted - damage_to_deal + if(!damage_to_deal) + to_chat(victim, "[weapon] embedded in your [limb.name] stings a little!") + else + limb.receive_damage(brute=damage_to_deal, stamina=(pain_stam_pct * damage) + damage_as_stam) + to_chat(victim, "[weapon] embedded in your [limb.name] hurts!") + + var/fallchance_current = DT_PROB_RATE(fall_chance / 100, delta_time) * 100 + if(prob(fallchance_current)) + fallOut() + +//////////////////////////////////////// +////////////BEHAVIOR PROCS////////////// +//////////////////////////////////////// + +/// 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() + SIGNAL_HANDLER + + var/mob/living/carbon/victim = parent + var/chance = jostle_chance + if(victim.m_intent == MOVE_INTENT_WALK || victim.lying) + 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/fallOut() + 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 [harmful ? "out" : "off"] of [victim.name]'s [limb.name]!", "[weapon] falls [harmful ? "out" : "off"] of your [limb.name]!") + safeRemove() + +/// 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/ripOut(datum/source, obj/item/I, obj/item/bodypart/limb) + SIGNAL_HANDLER + + if(I != weapon || src.limb != limb) + return + + var/mob/living/carbon/victim = parent + var/time_taken = rip_time * weapon.w_class + INVOKE_ASYNC(src, .proc/complete_rip_out, victim, I, limb, time_taken) + +/// everything async that ripOut used to do +/datum/component/embedded/proc/complete_rip_out(mob/living/carbon/victim, obj/item/I, obj/item/bodypart/limb, time_taken) + 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)) + return + 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] [harmful ? "out" : "off"] of [victim.p_their()] [limb.name]!", "You successfully remove [weapon] from your [limb.name].") + safeRemove(victim) + +/// 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/safeRemove(to_hands) + SIGNAL_HANDLER + + var/mob/living/carbon/victim = parent + limb.embedded_objects -= weapon + UnregisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING)) // have to do it here otherwise we trigger weaponDeleted() + + if(!weapon.unembedded()) // if it hasn't deleted itself due to drop del + UnregisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING)) + if(to_hands) + INVOKE_ASYNC(to_hands, /mob.proc/put_in_hands, weapon) + else + INVOKE_ASYNC(weapon, /atom/movable.proc/forceMove, get_turf(victim)) + + qdel(src) + +/datum/component/embedded/proc/tryPullOutOther(mob/living/carbon/victim, mob/user) + SIGNAL_HANDLER + + if(!user.IsAdvancedToolUser()) + to_chat(user, "You don't have the dexterity to do this!") + return + + if(istype(victim)) // check to see if the limb is actually exposed + var/mob/living/carbon/human/victim_human = victim + if(!victim_human.can_inject(user, TRUE, limb.body_zone, penetrate_thick = FALSE)) + return TRUE + + if(weapon.w_class <= WEIGHT_CLASS_SMALL) + to_chat(user, "[weapon] embedding in \the [limb.name] of [parent] is too small to pull out with your bare hands!") + return + + INVOKE_ASYNC(src, .proc/pluckOut, user, 1, 2, "pulling out") + return COMPONENT_NO_ATTACK_HAND + +/datum/component/embedded/proc/checkRemoval(mob/living/carbon/victim, obj/item/I, mob/user) + SIGNAL_HANDLER + + if(!istype(victim) || user.zone_selected != limb.body_zone || user.a_intent != INTENT_HELP) + return + + var/damage_multiplier = 1 + var/remove_verb = "removing" + + switch(I.tool_behaviour) + if(TOOL_HEMOSTAT) + damage_multiplier = 0 + remove_verb = "carefully removing" + if(TOOL_WIRECUTTER) + if(weapon.w_class >= WEIGHT_CLASS_NORMAL) + to_chat(user, "[weapon] is too large to extract with wirecutters!") + return + damage_multiplier = 0.5 + if(TOOL_SCREWDRIVER) + if(weapon.w_class >= WEIGHT_CLASS_SMALL) + to_chat(user, "[weapon] is too large to dislodge with a screwdriver!") + return + damage_multiplier = 0.8 + remove_verb = "dislodging" + else + return + + if(ishuman(victim)) // check to see if the limb is actually exposed + var/mob/living/carbon/human/victim_human = victim + if(!victim_human.can_inject(user, TRUE, limb.body_zone, penetrate_thick = FALSE)) + return TRUE + + INVOKE_ASYNC(src, .proc/pluckOut, user, damage_multiplier, max(damage_multiplier, 0.2), remove_verb) + return COMPONENT_NO_AFTERATTACK + +/// The actual action for pulling out an embedded object with any tools that work +/datum/component/embedded/proc/pluckOut(mob/user, damage_multiplier, time_multiplier, remove_verb) + var/mob/living/carbon/victim = parent + + var/self_pluck = (user == victim) + + if(self_pluck) + user.visible_message("[user] begins [remove_verb] [weapon] from [user.p_their()] [limb.name]", "You start [remove_verb] [weapon] from your [limb.name]...",\ + vision_distance=COMBAT_MESSAGE_RANGE, ignored_mobs=victim) + else + user.visible_message("[user] begins [remove_verb] [weapon] from [victim]'s [limb.name]","You start [remove_verb] [weapon] from [victim]'s [limb.name]...", \ + vision_distance=COMBAT_MESSAGE_RANGE, ignored_mobs=victim) + to_chat(victim, "[user] begins [remove_verb] [weapon] from your [limb.name]...") + + //Pluck time + var/pluck_time = 4 SECONDS * weapon.w_class * time_multiplier + if(!do_after(user, pluck_time, target = victim)) + if(self_pluck) + to_chat(user, "You fail to remove [weapon] from your [limb.name].") + else + to_chat(user, "You fail to remove [weapon] from [victim]'s [limb.name].") + to_chat(victim, "[user] fails to remove [weapon] from your [limb.name].") + return + + //Removed succesfully + if(self_pluck) + to_chat(user, "You successfully remove [weapon] from your [limb.name].") + else + to_chat(user, "You successfully remove [weapon] from [victim]'s [limb.name].") + to_chat(victim, "[user] remove [weapon] from your [limb.name].") + + //Apply damage + if(harmful && damage_multiplier) + var/damage = weapon.w_class * remove_pain_mult * damage_multiplier + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) + victim.emote("scream") + + //Remove it + safeRemove(user) + +/// Something deleted or moved our weapon while it was embedded, how rude! +/datum/component/embedded/proc/weaponDeleted() + SIGNAL_HANDLER + + var/mob/living/carbon/victim = parent + limb.embedded_objects -= weapon + + if(victim) + to_chat(victim, "\The [weapon] that was embedded in your [limb.name] disappears!") + qdel(src) diff --git a/code/datums/components/empprotection.dm b/code/datums/components/empprotection.dm index c85cdf31c7254..513370f3d5fa5 100644 --- a/code/datums/components/empprotection.dm +++ b/code/datums/components/empprotection.dm @@ -8,4 +8,6 @@ RegisterSignal(parent, list(COMSIG_ATOM_EMP_ACT), .proc/getEmpFlags) /datum/component/empprotection/proc/getEmpFlags(datum/source, severity) + SIGNAL_HANDLER + return flags diff --git a/code/datums/components/explodable.dm b/code/datums/components/explodable.dm index 094dce211d430..6b8e2278016d2 100644 --- a/code/datums/components/explodable.dm +++ b/code/datums/components/explodable.dm @@ -5,7 +5,7 @@ var/light_impact_range = 2 var/flash_range = 3 var/equipped_slot //For items, lets us determine where things should be hit. - + /datum/component/explodable/Initialize(devastation_range_override, heavy_impact_range_override, light_impact_range_override, flash_range_override) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -20,8 +20,8 @@ RegisterSignal(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_HIT_REACT), .proc/explodable_attack) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip) RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop) - - + + if(devastation_range_override) devastation_range = devastation_range_override @@ -33,32 +33,46 @@ flash_range = flash_range_override /datum/component/explodable/proc/explodable_insert_item(datum/source, obj/item/I, mob/M, silent = FALSE, force = FALSE) + SIGNAL_HANDLER + check_if_detonate(I) /datum/component/explodable/proc/explodable_impact(datum/source, atom/hit_atom, datum/thrownthing/throwingdatum) + SIGNAL_HANDLER + check_if_detonate(hit_atom) /datum/component/explodable/proc/explodable_bump(datum/source, atom/A) + SIGNAL_HANDLER + check_if_detonate(A) ///Called when you use this object to attack sopmething /datum/component/explodable/proc/explodable_attack(datum/source, atom/movable/target, mob/living/user) + SIGNAL_HANDLER + check_if_detonate(target) -///Called when you attack a specific body part of the thing this is equipped on. Useful for exploding pants. +///Called when you attack a specific body part of the thing this is equipped on. Useful for exploding pants. /datum/component/explodable/proc/explodable_attack_zone(datum/source, damage, damagetype, def_zone) + SIGNAL_HANDLER + if(!def_zone) return if(damagetype != BURN) //Don't bother if it's not fire. return if(!is_hitting_zone(def_zone)) //You didn't hit us! ha! - return + return detonate() /datum/component/explodable/proc/on_equip(datum/source, mob/equipper, slot) + SIGNAL_HANDLER + RegisterSignal(equipper, COMSIG_MOB_APPLY_DAMGE, .proc/explodable_attack_zone) /datum/component/explodable/proc/on_drop(datum/source, mob/user) + SIGNAL_HANDLER + UnregisterSignal(user, COMSIG_MOB_APPLY_DAMGE) /// Checks if we're hitting the zone this component is covering @@ -87,7 +101,7 @@ if(I.body_parts_covered & bodypart.body_part) return TRUE return FALSE - + /datum/component/explodable/proc/check_if_detonate(target) if(!isitem(target)) @@ -100,6 +114,8 @@ /// Expldoe and remove the object /datum/component/explodable/proc/detonate() + SIGNAL_HANDLER + var/atom/A = parent explosion(A, devastation_range, heavy_impact_range, light_impact_range, flash_range) //epic explosion time qdel(A) diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm index 9d1eeec219610..edfad6e20b5b7 100644 --- a/code/datums/components/footstep.dm +++ b/code/datums/components/footstep.dm @@ -11,6 +11,8 @@ RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/play_footstep) /datum/component/footstep/proc/play_footstep() + SIGNAL_HANDLER + var/turf/open/T = get_turf(parent) if(!istype(T)) return @@ -93,11 +95,13 @@ TRUE, GLOB.footstep[T.footstep][3] + e) - if((!H.shoes && !feetCover)) //are we NOT wearing shoes - if(H.dna.species.special_step_sounds) - playsound(T, pick(H.dna.species.special_step_sounds), 50, TRUE) - else - playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]), - GLOB.barefootstep[T.barefootstep][2] * v, - TRUE, - GLOB.barefootstep[T.barefootstep][3] + e) + //Sound of wearing shoes always plays, special movement sound + // IE (server motors wont play bare footed.) + if(H.dna.species.special_step_sounds) + playsound(T, pick(H.dna.species.special_step_sounds), 50, TRUE) + + else if((!H.shoes && !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) diff --git a/code/datums/components/forced_gravity.dm b/code/datums/components/forced_gravity.dm index 7f609c494572e..ba4bf6b27232d 100644 --- a/code/datums/components/forced_gravity.dm +++ b/code/datums/components/forced_gravity.dm @@ -12,9 +12,13 @@ gravity = forced_value /datum/component/forced_gravity/proc/gravity_check(datum/source, turf/location, list/gravs) + SIGNAL_HANDLER + 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(null, parent, gravs) \ No newline at end of file + SIGNAL_HANDLER + + return gravity_check(null, parent, gravs) diff --git a/code/datums/components/forensics.dm b/code/datums/components/forensics.dm index 737c401dda034..956e4da8a05d7 100644 --- a/code/datums/components/forensics.dm +++ b/code/datums/components/forensics.dm @@ -43,8 +43,6 @@ /datum/component/forensics/proc/wipe_blood_DNA() blood_DNA = null - if(isitem(parent)) - qdel(parent.GetComponent(/datum/component/decal/blood)) return TRUE /datum/component/forensics/proc/wipe_fibers() @@ -52,6 +50,8 @@ return TRUE /datum/component/forensics/proc/clean_act(datum/source, strength) + SIGNAL_HANDLER + if(strength >= CLEAN_STRENGTH_FINGERPRINTS) wipe_fingerprints() if(strength >= CLEAN_STRENGTH_BLOOD) @@ -72,7 +72,7 @@ if(!iscameramob(M)) return if(isaicamera(M)) - var/mob/camera/aiEye/ai_camera = M + var/mob/camera/ai_eye/ai_camera = M if(!ai_camera.ai) return M = ai_camera.ai @@ -144,7 +144,7 @@ if(!iscameramob(M)) return if(isaicamera(M)) - var/mob/camera/aiEye/ai_camera = M + var/mob/camera/ai_eye/ai_camera = M if(!ai_camera.ai) return M = ai_camera.ai @@ -181,4 +181,6 @@ return if(!length(blood_DNA)) return - parent.LoadComponent(/datum/component/decal/blood) + if(isitem(parent)) + var/obj/item/I = parent + I.AddElement(/datum/element/decal/blood, initial(I.icon) || I.icon, initial(I.icon_state) || I.icon_state) diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm index b6e7722d1aeb6..683a964b8c010 100644 --- a/code/datums/components/gps.dm +++ b/code/datums/components/gps.dm @@ -36,15 +36,21 @@ GLOBAL_LIST_EMPTY(GPS_list) ///Called on COMSIG_ITEM_ATTACK_SELF /datum/component/gps/item/proc/interact(datum/source, mob/user) + SIGNAL_HANDLER + if(user) - ui_interact(user) + INVOKE_ASYNC(src, .proc/ui_interact, user) ///Called on COMSIG_PARENT_EXAMINE /datum/component/gps/item/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += "Alt-click to switch it [tracking ? "off":"on"]." ///Called on COMSIG_ATOM_EMP_ACT /datum/component/gps/item/proc/on_emp_act(datum/source, severity) + SIGNAL_HANDLER + emped = TRUE var/atom/A = parent A.cut_overlay("working") @@ -61,7 +67,10 @@ GLOBAL_LIST_EMPTY(GPS_list) ///Calls toggletracking /datum/component/gps/item/proc/on_AltClick(datum/source, mob/user) + SIGNAL_HANDLER + toggletracking(user) + ui_update() ///Toggles the tracking for the gps /datum/component/gps/item/proc/toggletracking(mob/user) @@ -106,22 +115,21 @@ GLOBAL_LIST_EMPTY(GPS_list) var/turf/curr = get_turf(parent) data["currentArea"] = "[get_area_name(curr, TRUE)]" - data["currentCoords"] = "[curr.x], [curr.y], [curr.z]" + data["currentCoords"] = "[curr.x], [curr.y], [curr.get_virtual_z_level()]" var/list/signals = list() - data["signals"] = list() for(var/gps in GLOB.GPS_list) var/datum/component/gps/G = gps if(G.emped || !G.tracking || G == src) continue var/turf/pos = get_turf(G.parent) - if(!pos || !global_mode && pos.z != curr.z) + if(!pos || !global_mode && pos.get_virtual_z_level() != curr.get_virtual_z_level()) continue var/list/signal = list() signal["entrytag"] = G.gpstag //Name or 'tag' of the GPS - signal["coords"] = "[pos.x], [pos.y], [pos.z]" - if(pos.z == curr.z) //Distance/Direction calculations for same z-level only + signal["coords"] = "[pos.x], [pos.y], [pos.get_virtual_z_level()]" + if(pos.get_virtual_z_level() == curr.get_virtual_z_level()) //Distance/Direction calculations for same z-level only signal["dist"] = max(get_dist(curr, pos), 0) //Distance between the src and remote GPS turfs signal["degrees"] = round(Get_Angle(curr, pos)) //0-360 degree directional bearing, for more precision. signals += list(signal) //Add this signal to the list of signals diff --git a/code/datums/components/heirloom.dm b/code/datums/components/heirloom.dm index 72b28b125dd6a..69f8fb817b98a 100644 --- a/code/datums/components/heirloom.dm +++ b/code/datums/components/heirloom.dm @@ -12,6 +12,8 @@ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) /datum/component/heirloom/proc/examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + if(user.mind == owner) examine_list += "It is your precious [family_name] family heirloom. Keep it safe!" else if(isobserver(user)) diff --git a/code/datums/components/honkspam.dm b/code/datums/components/honkspam.dm index 73b5e3335aad1..9f17f372b04f1 100644 --- a/code/datums/components/honkspam.dm +++ b/code/datums/components/honkspam.dm @@ -15,6 +15,8 @@ spam_flag = FALSE /datum/component/honkspam/proc/interact(mob/user) + SIGNAL_HANDLER + if(!spam_flag) spam_flag = TRUE var/obj/item/parent_item = parent diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm index 57bb8e0ae60a4..930bf51c3e942 100644 --- a/code/datums/components/infective.dm +++ b/code/datums/components/infective.dm @@ -33,19 +33,27 @@ RegisterSignal(parent, COMSIG_GIBS_STREAK, .proc/try_infect_streak) /datum/component/infective/proc/try_infect_eat(datum/source, mob/living/eater, mob/living/feeder) + SIGNAL_HANDLER + for(var/V in diseases) eater.ForceContractDisease(V) try_infect(feeder, BODY_ZONE_L_ARM) /datum/component/infective/proc/clean(datum/source, clean_strength) + SIGNAL_HANDLER + if(clean_strength >= min_clean_strength) qdel(src) /datum/component/infective/proc/try_infect_buckle(datum/source, mob/M, force) + SIGNAL_HANDLER + if(isliving(M)) try_infect(M) /datum/component/infective/proc/try_infect_collide(datum/source, atom/A) + SIGNAL_HANDLER + var/atom/movable/P = parent if(P.throwing) //this will be handled by try_infect_impact_zone() @@ -54,18 +62,26 @@ try_infect(A) /datum/component/infective/proc/try_infect_impact_zone(datum/source, mob/living/target, hit_zone) + SIGNAL_HANDLER + try_infect(target, hit_zone) /datum/component/infective/proc/try_infect_attack_zone(datum/source, mob/living/carbon/target, mob/living/user, hit_zone) + SIGNAL_HANDLER + try_infect(user, BODY_ZONE_L_ARM) try_infect(target, hit_zone) /datum/component/infective/proc/try_infect_attack(datum/source, mob/living/target, mob/living/user) + SIGNAL_HANDLER + if(!iscarbon(target)) //this case will be handled by try_infect_attack_zone try_infect(target) try_infect(user, BODY_ZONE_L_ARM) /datum/component/infective/proc/try_infect_equipped(datum/source, mob/living/L, slot) + SIGNAL_HANDLER + var/old_permeability if(isitem(parent)) //if you are putting an infective item on, it obviously will not protect you, so set its permeability high enough that it will never block ContactContractDisease() @@ -80,10 +96,14 @@ I.permeability_coefficient = old_permeability /datum/component/infective/proc/try_infect_crossed(datum/source, atom/movable/M) + SIGNAL_HANDLER + if(isliving(M)) try_infect(M, BODY_ZONE_PRECISE_L_FOOT) /datum/component/infective/proc/try_infect_streak(datum/source, list/directions, list/output_diseases) + SIGNAL_HANDLER + output_diseases |= diseases /datum/component/infective/proc/try_infect(mob/living/L, target_zone) @@ -91,7 +111,9 @@ L.ContactContractDisease(V, target_zone) /datum/component/infective/proc/extrapolation(datum/source, mob/user, var/obj/item/extrapolator/E, scan = TRUE) + SIGNAL_HANDLER + if(scan) E.scan(source, diseases, user) else - E.extrapolate(source, diseases, user) + INVOKE_ASYNC(E, /obj/item/extrapolator.proc/extrapolate, source, diseases, user) diff --git a/code/datums/components/jousting.dm b/code/datums/components/jousting.dm index ae96fcb4d0b0a..4a417d8b5acaa 100644 --- a/code/datums/components/jousting.dm +++ b/code/datums/components/jousting.dm @@ -23,16 +23,22 @@ RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/on_attack) /datum/component/jousting/proc/on_equip(datum/source, mob/user, slot) + SIGNAL_HANDLER + RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/mob_move, TRUE) current_holder = user /datum/component/jousting/proc/on_drop(datum/source, mob/user) + SIGNAL_HANDLER + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) current_holder = null current_direction = NONE current_tile_charge = 0 /datum/component/jousting/proc/on_attack(datum/source, mob/living/target, mob/user) + SIGNAL_HANDLER + if(user != current_holder) return var/current = current_tile_charge @@ -41,7 +47,7 @@ if((requires_mount && ((requires_mob_riding && !ismob(user.buckled)) || (!user.buckled))) || !current_direction || (current_tile_charge < min_tile_charge)) return var/turf/target_turf = get_step(user, current_direction) - if(target in range(1, target_turf)) + if(get_dist(target, target_turf) <= 1) var/knockdown_chance = (target_buckled? mounted_knockdown_chance_per_tile : unmounted_knockdown_chance_per_tile) * current var/knockdown_time = (target_buckled? mounted_knockdown_time : unmounted_knockdown_time) var/damage = (target_buckled? mounted_damage_boost_per_tile : unmounted_damage_boost_per_tile) * current @@ -59,6 +65,8 @@ user.visible_message("[msg]!") /datum/component/jousting/proc/mob_move(datum/source, newloc, dir) + SIGNAL_HANDLER + if(!current_holder || (requires_mount && ((requires_mob_riding && !ismob(current_holder.buckled)) || (!current_holder.buckled)))) return if(dir != current_direction) diff --git a/code/datums/components/knockoff.dm b/code/datums/components/knockoff.dm index a36169e6dfd37..770f72cfea5b0 100644 --- a/code/datums/components/knockoff.dm +++ b/code/datums/components/knockoff.dm @@ -11,7 +11,7 @@ RegisterSignal(parent, COMSIG_ITEM_DROPPED,.proc/OnDropped) src.knockoff_chance = knockoff_chance - + if(zone_override) target_zones = zone_override @@ -19,6 +19,8 @@ src.slots_knockoffable = slots_knockoffable /datum/component/knockoff/proc/Knockoff(mob/living/attacker,zone) + SIGNAL_HANDLER + var/obj/item/I = parent var/mob/living/carbon/human/wearer = I.loc if(!istype(wearer)) @@ -33,6 +35,8 @@ wearer.visible_message("[attacker] knocks off [wearer]'s [I.name]!","[attacker] knocks off your [I.name]!") /datum/component/knockoff/proc/OnEquipped(datum/source, mob/living/carbon/human/H,slot) + SIGNAL_HANDLER + if(!istype(H)) return if(slots_knockoffable && !(slot in slots_knockoffable)) @@ -41,4 +45,6 @@ RegisterSignal(H, COMSIG_HUMAN_DISARM_HIT, .proc/Knockoff, TRUE) /datum/component/knockoff/proc/OnDropped(datum/source, mob/living/M) - UnregisterSignal(M, COMSIG_HUMAN_DISARM_HIT) \ No newline at end of file + SIGNAL_HANDLER + + UnregisterSignal(M, COMSIG_HUMAN_DISARM_HIT) diff --git a/code/datums/components/lockon_aiming.dm b/code/datums/components/lockon_aiming.dm index fef0dd0ef0c9f..2b788b1030d4a 100644 --- a/code/datums/components/lockon_aiming.dm +++ b/code/datums/components/lockon_aiming.dm @@ -18,6 +18,7 @@ var/list/last_location var/datum/callback/on_lock var/datum/callback/can_target_callback + var/aiming_params /datum/component/lockon_aiming/Initialize(range, list/typecache, amount, list/immune, datum/callback/when_locked, icon, icon_state, datum/callback/target_callback) if(!ismob(parent)) @@ -46,14 +47,10 @@ if(icon_state) lock_icon_state = icon_state generate_lock_visuals() - var/mob/M = parent - LAZYOR(M.mousemove_intercept_objects, src) 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 ..() @@ -119,27 +116,6 @@ return LAZYREMOVE(immune_weakrefs, A.weak_reference) -/datum/component/lockon_aiming/onMouseMove(object,location,control,params) - var/mob/M = parent - if(!istype(M) || !M.client) - return - var/datum/position/P = mouse_absolute_datum_map_position_from_client(M.client) - if(!P) - return - var/turf/T = P.return_turf() - LAZYINITLIST(last_location) - if(length(last_location) == 3 && last_location[1] == T.x && last_location[2] == T.y && last_location[3] == T.z) - return //Same turf, don't bother. - if(last_location) - last_location.Cut() - else - last_location = list() - last_location.len = 3 - last_location[1] = T.x - last_location[2] = T.y - last_location[3] = T.z - autolock() - /datum/component/lockon_aiming/process() if(update_disabled) return @@ -163,7 +139,7 @@ var/mob/M = parent if(!M.client) return FALSE - var/datum/position/current = mouse_absolute_datum_map_position_from_client(M.client) + var/datum/position/current = mouse_absolute_datum_map_position_from_client(M.client, aiming_params) var/turf/target = current.return_turf() var/list/atom/targets = get_nearest(target, target_typecache, lock_amount, lock_cursor_range) if(targets == LOCKON_IGNORE_RESULT) diff --git a/code/datums/components/magnetic_catch.dm b/code/datums/components/magnetic_catch.dm index 4defe936e5ea4..ac8a5ee6fc521 100644 --- a/code/datums/components/magnetic_catch.dm +++ b/code/datums/components/magnetic_catch.dm @@ -16,19 +16,31 @@ RegisterSignal(i, COMSIG_MOVABLE_PRE_THROW, .proc/throw_react) /datum/component/magnetic_catch/proc/examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += "It has been installed with inertia dampening to prevent coffee spills." /datum/component/magnetic_catch/proc/crossed_react(datum/source, atom/movable/thing) + SIGNAL_HANDLER + RegisterSignal(thing, COMSIG_MOVABLE_PRE_THROW, .proc/throw_react, TRUE) /datum/component/magnetic_catch/proc/uncrossed_react(datum/source, atom/movable/thing) + SIGNAL_HANDLER + UnregisterSignal(thing, COMSIG_MOVABLE_PRE_THROW) /datum/component/magnetic_catch/proc/entered_react(datum/source, atom/movable/thing, atom/oldloc) + SIGNAL_HANDLER + RegisterSignal(thing, COMSIG_MOVABLE_PRE_THROW, .proc/throw_react, TRUE) /datum/component/magnetic_catch/proc/exited_react(datum/source, atom/movable/thing, atom/newloc) + SIGNAL_HANDLER + UnregisterSignal(thing, COMSIG_MOVABLE_PRE_THROW) /datum/component/magnetic_catch/proc/throw_react(datum/source, list/arguments) + SIGNAL_HANDLER + return COMPONENT_CANCEL_THROW diff --git a/code/datums/components/manual_blinking.dm b/code/datums/components/manual_blinking.dm index d54291cee2cb8..0c5979af02b3c 100644 --- a/code/datums/components/manual_blinking.dm +++ b/code/datums/components/manual_blinking.dm @@ -7,7 +7,7 @@ var/last_blink var/check_every = 20 SECONDS //we scp now var/grace_period = 6 SECONDS - var/damage_rate = 1 // organ damage taken per tick + var/damage_rate = 0.5 // organ damage taken per second var/list/valid_emotes = list(/datum/emote/living/carbon/blink, /datum/emote/living/carbon/blink_r) var/datum/action/blink/button = new @@ -56,12 +56,16 @@ UnregisterSignal(parent, COMSIG_MOB_DEATH) /datum/component/manual_blinking/proc/restart() + SIGNAL_HANDLER + START_PROCESSING(SSdcs, src) /datum/component/manual_blinking/proc/pause() + SIGNAL_HANDLER + STOP_PROCESSING(SSdcs, src) -/datum/component/manual_blinking/process() +/datum/component/manual_blinking/process(delta_time) var/mob/living/carbon/C = parent if(world.time > (last_blink + check_every + grace_period)) @@ -69,13 +73,15 @@ to_chat(C, "Your eyes begin to wither, you need to blink!") warn_dying = TRUE - E.applyOrganDamage(damage_rate) + E.applyOrganDamage(damage_rate * delta_time) else if(world.time > (last_blink + check_every)) if(!warn_grace) to_chat(C, "You feel a need to blink!") warn_grace = TRUE /datum/component/manual_blinking/proc/check_added_organ(mob/who_cares, obj/item/organ/O) + SIGNAL_HANDLER + var/obj/item/organ/eyes/new_eyes = O if(istype(new_eyes,/obj/item/organ/eyes)) @@ -83,6 +89,8 @@ START_PROCESSING(SSdcs, src) /datum/component/manual_blinking/proc/check_removed_organ(mob/who_cares, obj/item/organ/O) + SIGNAL_HANDLER + var/obj/item/organ/eyes/bye_beyes = O // oh come on, that's pretty good if(istype(bye_beyes, /obj/item/organ/eyes)) @@ -90,6 +98,8 @@ STOP_PROCESSING(SSdcs, src) /datum/component/manual_blinking/proc/check_emote(mob/living/carbon/user, datum/emote/emote) + SIGNAL_HANDLER + if(emote.type in valid_emotes) warn_grace = FALSE warn_dying = FALSE diff --git a/code/datums/components/manual_breathing.dm b/code/datums/components/manual_breathing.dm index 0be40118c6144..9a3871ce11c68 100644 --- a/code/datums/components/manual_breathing.dm +++ b/code/datums/components/manual_breathing.dm @@ -7,7 +7,7 @@ var/last_breath var/check_every = 12 SECONDS var/grace_period = 6 SECONDS - var/damage_rate = 1 // organ damage taken per tick + var/damage_rate = 0.5 // organ damage taken per second var/datum/emote/next_breath_type = /datum/emote/inhale var/datum/action/breathe/button = new @@ -66,12 +66,16 @@ UnregisterSignal(parent, COMSIG_MOB_DEATH) /datum/component/manual_breathing/proc/restart() + SIGNAL_HANDLER + START_PROCESSING(SSdcs, src) /datum/component/manual_breathing/proc/pause() + SIGNAL_HANDLER + STOP_PROCESSING(SSdcs, src) -/datum/component/manual_breathing/process() +/datum/component/manual_breathing/process(delta_time) var/mob/living/carbon/C = parent var/next_text = initial(next_breath_type.key) @@ -80,7 +84,7 @@ to_chat(C, "You begin to suffocate, you need to [next_text]!") warn_dying = TRUE - L.applyOrganDamage(damage_rate) + L.applyOrganDamage(damage_rate * delta_time) C.losebreath += 0.8 else if(world.time > (last_breath + check_every)) if(!warn_grace) @@ -88,6 +92,8 @@ warn_grace = TRUE /datum/component/manual_breathing/proc/check_added_organ(mob/who_cares, obj/item/organ/O) + SIGNAL_HANDLER + var/obj/item/organ/eyes/new_lungs = O if(istype(new_lungs,/obj/item/organ/lungs)) @@ -95,6 +101,8 @@ START_PROCESSING(SSdcs, src) /datum/component/manual_breathing/proc/check_removed_organ(mob/who_cares, obj/item/organ/O) + SIGNAL_HANDLER + var/obj/item/organ/lungs/old_lungs = O if(istype(old_lungs, /obj/item/organ/lungs)) @@ -102,6 +110,8 @@ STOP_PROCESSING(SSdcs, src) /datum/component/manual_breathing/proc/check_emote(mob/living/carbon/user, datum/emote/emote) + SIGNAL_HANDLER + if(emote.type == next_breath_type) if(next_breath_type == /datum/emote/inhale) next_breath_type = /datum/emote/exhale diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index 4db6612a84a98..361c3e1b014e9 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -46,6 +46,8 @@ materials[M] = 0 /datum/component/material_container/proc/OnExamine(datum/source, mob/user) + SIGNAL_HANDLER + if(show_on_examine) for(var/I in materials) var/datum/material/M = I @@ -55,6 +57,8 @@ /// Proc that allows players to fill the parent with mats /datum/component/material_container/proc/OnAttackBy(datum/source, obj/item/I, mob/living/user) + SIGNAL_HANDLER + var/list/tc = allowed_typecache if(disable_attackby) return @@ -104,6 +108,7 @@ I.forceMove(user.drop_location()) else to_chat(user, "You insert a material total of [inserted] into [parent].") + SEND_SIGNAL(I, COMSIG_OBJ_DECONSTRUCT) //Help prevent using material ingestors to void storage items. qdel(I) if(after_insert) after_insert.Invoke(I.type, last_inserted_id, inserted) @@ -112,7 +117,7 @@ /// Proc specifically for inserting items, returns the amount of materials entered. /datum/component/material_container/proc/insert_item(obj/item/I, var/multiplier = 1, stack_amt) - if(!I) + if(QDELETED(I)) return FALSE if(istype(I, /obj/item/stack)) return insert_stack(I, stack_amt, multiplier) @@ -137,7 +142,7 @@ return primary_mat /// Proc for putting a stack inside of the container -/datum/component/material_container/proc/insert_stack(obj/item/stack/S, amt, multiplier = 1) +/datum/component/material_container/proc/insert_stack(obj/item/stack/S, amt, multiplier = 1) if(isnull(amt)) amt = S.amount @@ -160,7 +165,7 @@ return amt /// For inserting an amount of material -/datum/component/material_container/proc/insert_amount_mat(amt, var/datum/material/mat) +/datum/component/material_container/proc/insert_amount_mat(amt, var/datum/material/mat) if(!istype(mat)) mat = getmaterialref(mat) if(amt > 0 && has_space(amt)) @@ -175,7 +180,7 @@ return FALSE /// Uses an amount of a specific material, effectively removing it. -/datum/component/material_container/proc/use_amount_mat(amt, var/datum/material/mat) +/datum/component/material_container/proc/use_amount_mat(amt, var/datum/material/mat) if(!istype(mat)) mat = getmaterialref(mat) var/amount = materials[mat] @@ -187,7 +192,7 @@ return FALSE /// Proc for transfering materials to another container. -/datum/component/material_container/proc/transer_amt_to(var/datum/component/material_container/T, amt, var/datum/material/mat) +/datum/component/material_container/proc/transer_amt_to(var/datum/component/material_container/T, amt, var/datum/material/mat) if(!istype(mat)) mat = getmaterialref(mat) if((amt==0)||(!T)||(!mat)) @@ -216,7 +221,7 @@ /datum/component/material_container/proc/use_materials(list/mats, multiplier=1) if(!mats || !length(mats)) return FALSE - + var/list/mats_to_remove = list() //Assoc list MAT | AMOUNT for(var/x in mats) //Loop through all required materials @@ -230,7 +235,7 @@ return FALSE //Can't afford it mats_to_remove[req_mat] += amount_required //Add it to the assoc list of things to remove continue - + var/total_amount_save = total_amount for(var/i in mats_to_remove) @@ -239,7 +244,7 @@ return total_amount_save - total_amount /// For spawning mineral sheets at a specific location. Used by machines to output sheets. -/datum/component/material_container/proc/retrieve_sheets(sheet_amt, var/datum/material/M, target = null) +/datum/component/material_container/proc/retrieve_sheets(sheet_amt, var/datum/material/M, target = null) if(!M.sheet_type) return 0 //Add greyscale sheet handling here later if(sheet_amt <= 0) @@ -263,7 +268,7 @@ /// Proc to get all the materials and dump them as sheets -/datum/component/material_container/proc/retrieve_all(target = null) +/datum/component/material_container/proc/retrieve_all(target = null) var/result = 0 for(var/MAT in materials) var/amount = materials[MAT] @@ -286,18 +291,18 @@ req_mat = getmaterialref(req_mat) //Get the ref else // Its a category. (For example MAT_CATEGORY_RIGID) - if(!has_enough_of_category(req_mat, mats[req_mat], multiplier)) //Do we have enough of this category? + if(!has_enough_of_category(req_mat, mats[x], multiplier)) //Do we have enough of this category? return FALSE else continue - if(!has_enough_of_material(req_mat, mats[req_mat], multiplier))//Not a category, so just check the normal way + if(!has_enough_of_material(req_mat, mats[x], multiplier))//Not a category, so just check the normal way return FALSE return TRUE /// Returns all the categories in a recipe. -/datum/component/material_container/proc/get_categories(list/mats) +/datum/component/material_container/proc/get_categories(list/mats) var/list/categories = list() for(var/x in mats) //Loop through all required materials if(!istext(x)) //This means its not a category @@ -307,12 +312,12 @@ /// Returns TRUE if you have enough of the specified material. -/datum/component/material_container/proc/has_enough_of_material(var/datum/material/req_mat, amount, multiplier=1) +/datum/component/material_container/proc/has_enough_of_material(var/datum/material/req_mat, amount, multiplier=1) if(!materials[req_mat]) //Do we have the resource? return FALSE //Can't afford it var/amount_required = amount * multiplier if(materials[req_mat] >= amount_required) // do we have enough of the resource? - return TRUE + return TRUE return FALSE //Can't afford it /// Returns TRUE if you have enough of a specified material category (Which could be multiple materials) @@ -324,7 +329,7 @@ return FALSE /// Turns a material amount into the amount of sheets it should output -/datum/component/material_container/proc/amount2sheet(amt) +/datum/component/material_container/proc/amount2sheet(amt) if(amt >= MINERAL_MATERIAL_AMOUNT) return round(amt / MINERAL_MATERIAL_AMOUNT) return FALSE @@ -346,7 +351,24 @@ return material_amount /// Returns the amount of a specific material in this container. -/datum/component/material_container/proc/get_material_amount(var/datum/material/mat) +/datum/component/material_container/proc/get_material_amount(var/datum/material/mat) if(!istype(mat)) mat = getmaterialref(mat) - return(materials[mat]) + return materials[mat] + +/// List format is list(material_name = list(amount = ..., ref = ..., etc.)) +/datum/component/material_container/ui_data(mob/user) + var/list/data = list() + + for(var/datum/material/material as anything in materials) + var/amount = materials[material] + + data += list(list( + "name" = material.name, + "ref" = REF(material), + "amount" = amount, + "sheets" = round(amount / MINERAL_MATERIAL_AMOUNT), + "removable" = amount >= MINERAL_MATERIAL_AMOUNT, + )) + + return data diff --git a/code/datums/components/mirage_border.dm b/code/datums/components/mirage_border.dm index b84da962d8b8a..5f5470816da77 100644 --- a/code/datums/components/mirage_border.dm +++ b/code/datums/components/mirage_border.dm @@ -44,3 +44,7 @@ name = "Mirage holder" anchored = TRUE mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/effect/abstract/mirage_holder/Destroy(force) + vis_contents.Cut() + . = ..() diff --git a/code/datums/components/mirv.dm b/code/datums/components/mirv.dm new file mode 100644 index 0000000000000..e64b4ba638ef0 --- /dev/null +++ b/code/datums/components/mirv.dm @@ -0,0 +1,43 @@ +/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/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/mirv/RegisterWithParent() + if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc + RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit) + +/datum/component/mirv/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_PROJECTILE_ON_HIT)) + +/datum/component/mirv/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, .proc/do_shrapnel, firer, 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) + //Shooting Code: + P.range = radius+1 + if(override_projectile_range) + P.range = override_projectile_range + P.preparePixelProjectile(shootat_turf, target) + P.firer = firer // don't hit ourself that would be really annoying + P.permutated += target // don't hit the target we hit already with the flak + P.fire() diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index cf2e05ad83bd0..b82781feeb218 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -10,8 +10,8 @@ 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/obj/screen/sanity/screen_obj_sanity + var/atom/movable/screen/mood/screen_obj + var/atom/movable/screen/sanity/screen_obj_sanity /datum/component/mood/Initialize() if(!isliving(parent)) @@ -24,6 +24,7 @@ RegisterSignal(parent, COMSIG_ENTER_AREA, .proc/check_area_mood) RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud) + RegisterSignal(parent, COMSIG_HUMAN_VOID_MASK_ACT, .proc/direct_sanity_drain) var/mob/living/owner = parent if(owner.hud_used) modify_hud() @@ -169,29 +170,28 @@ screen_obj.color = "#2eeb9a" break -/datum/component/mood/process() //Called on SSmood process +///Called on SSmood process +/datum/component/mood/process(delta_time) var/mob/living/owner = parent - switch(mood_level) if(1) - setSanity(sanity-0.3) + setSanity(sanity-0.3*delta_time) if(2) - setSanity(sanity-0.15) + setSanity(sanity-0.15*delta_time) if(3) - setSanity(sanity-0.1) + setSanity(sanity-0.1*delta_time) if(4) - setSanity(sanity-0.05, minimum=SANITY_UNSTABLE) + setSanity(sanity-0.05*delta_time, minimum=SANITY_UNSTABLE) if(5) setSanity(sanity+0.1, maximum=SANITY_NEUTRAL) if(6) - setSanity(sanity+0.2, maximum=SANITY_GREAT) + setSanity(sanity+0.2*delta_time, maximum=SANITY_GREAT) if(7) - setSanity(sanity+0.3, maximum=INFINITY) + setSanity(sanity+0.3*delta_time, maximum=SANITY_GREAT) if(8) - setSanity(sanity+0.4, maximum=SANITY_MAXIMUM) + setSanity(sanity+0.4*delta_time, maximum=SANITY_MAXIMUM) if(9) - setSanity(sanity+0.6, maximum=SANITY_MAXIMUM) - + setSanity(sanity+0.6*delta_time, maximum=SANITY_MAXIMUM) HandleNutrition(owner) HandleHygiene(owner) @@ -216,26 +216,32 @@ if(SANITY_INSANE to SANITY_CRAZY) setInsanityEffect(MAJOR_INSANITY_PEN) master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=0.6, movetypes=(~FLYING)) + master.add_actionspeed_modifier(/datum/actionspeed_modifier/low_sanity) 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=0.3, movetypes=(~FLYING)) + master.add_actionspeed_modifier(/datum/actionspeed_modifier/low_sanity) 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.15, movetypes=(~FLYING)) + master.add_actionspeed_modifier(/datum/actionspeed_modifier/low_sanity) sanity_level = 4 if(SANITY_DISTURBED to SANITY_NEUTRAL) setInsanityEffect(0) master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE) + master.remove_actionspeed_modifier(ACTIONSPEED_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.add_actionspeed_modifier(/datum/actionspeed_modifier/high_sanity) sanity_level = 2 if(SANITY_GREAT+1 to INFINITY) setInsanityEffect(0) master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE) + master.add_actionspeed_modifier(/datum/actionspeed_modifier/high_sanity) sanity_level = 1 update_mood_icon() @@ -247,6 +253,8 @@ insanity_effect = newval /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. + SIGNAL_HANDLER + var/datum/mood_event/the_event if(!istext(category)) category = REF(category) @@ -268,6 +276,8 @@ addtimer(CALLBACK(src, .proc/clear_event, null, category), the_event.timeout, TIMER_UNIQUE|TIMER_OVERRIDE) /datum/component/mood/proc/clear_event(datum/source, category) + SIGNAL_HANDLER + if(!istext(category)) category = REF(category) var/datum/mood_event/event = mood_events[category] @@ -278,6 +288,11 @@ qdel(event) update_mood() +/datum/component/mood/proc/get_event(category) + if(!istext(category)) + category = REF(category) + return mood_events[category] + /datum/component/mood/proc/remove_temp_moods(var/admin) //Removes all temp moods for(var/i in mood_events) var/datum/mood_event/moodlet = mood_events[i] @@ -289,6 +304,8 @@ /datum/component/mood/proc/modify_hud(datum/source) + SIGNAL_HANDLER + var/mob/living/owner = parent var/datum/hud/hud = owner.hud_used screen_obj = new @@ -299,6 +316,8 @@ RegisterSignal(screen_obj, COMSIG_CLICK, .proc/hud_click) /datum/component/mood/proc/unmodify_hud(datum/source) + SIGNAL_HANDLER + if(!screen_obj) return var/mob/living/owner = parent @@ -310,15 +329,16 @@ QDEL_NULL(screen_obj_sanity) /datum/component/mood/proc/hud_click(datum/source, location, control, params, mob/user) + SIGNAL_HANDLER + print_mood(user) /datum/component/mood/proc/HandleNutrition(mob/living/L) - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(isethereal(H)) - HandleCharge(H) - if(HAS_TRAIT(H, TRAIT_NOHUNGER)) - return FALSE //no mood events for nutrition + if(HAS_TRAIT(L, TRAIT_NOHUNGER)) + return FALSE //no mood events for nutrition + if(HAS_TRAIT(L, TRAIT_POWERHUNGRY)) + HandleCharge(L) + return switch(L.nutrition) if(NUTRITION_LEVEL_FULL to INFINITY) if (!HAS_TRAIT(L, TRAIT_VORACIOUS)) @@ -336,43 +356,45 @@ if(0 to NUTRITION_LEVEL_STARVING) add_event(null, "nutrition", /datum/mood_event/starving) -/datum/component/mood/proc/HandleCharge(mob/living/carbon/human/H) - var/datum/species/ethereal/E = H.dna?.species - switch(E.get_charge(H)) - if(ETHEREAL_CHARGE_NONE to ETHEREAL_CHARGE_LOWPOWER) - add_event(null, "charge", /datum/mood_event/decharged) - if(ETHEREAL_CHARGE_LOWPOWER to ETHEREAL_CHARGE_NORMAL) - add_event(null, "charge", /datum/mood_event/lowpower) - if(ETHEREAL_CHARGE_NORMAL to ETHEREAL_CHARGE_ALMOSTFULL) - clear_event(null, "charge") - if(ETHEREAL_CHARGE_ALMOSTFULL to ETHEREAL_CHARGE_FULL) - add_event(null, "charge", /datum/mood_event/charged) +/datum/component/mood/proc/HandleCharge(mob/living/L) + switch(L.nutrition) + if(NUTRITION_LEVEL_WELL_FED to INFINITY) + add_event(null, "nutrition", /datum/mood_event/charged) + if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) + clear_event(null, "nutrition") + if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_FED) + add_event(null, "nutrition", /datum/mood_event/lowpower) + if(0 to NUTRITION_LEVEL_STARVING) + add_event(null, "nutrition", /datum/mood_event/decharged) /datum/component/mood/proc/HandleHygiene(mob/living/carbon/human/H) - if(H.hygiene <= HYGIENE_LEVEL_DIRTY) - HygieneMiasma(H) - -/datum/component/mood/proc/HygieneMiasma(mob/living/carbon/human/H) - // Properly stored humans shouldn't create miasma - if(istype(H.loc, /obj/structure/closet/crate/coffin)|| istype(H.loc, /obj/structure/closet/body_bag) || istype(H.loc, /obj/structure/bodycontainer)) - return - - var/turf/T = get_turf(H) - - if(!istype(T) || T.return_air().return_pressure() > (WARNING_HIGH_PRESSURE - 10)) - return - - var/datum/gas_mixture/stank = new - stank.set_moles(/datum/gas/miasma, MIASMA_HYGIENE_MOLES) - stank.set_temperature(BODYTEMP_NORMAL) - T.assume_air(stank) - T.air_update_turf() + if(H.has_quirk(/datum/quirk/neet)) + return //Neets don't care. + switch (H.hygiene) + if(HYGIENE_LEVEL_DISGUSTING to HYGIENE_LEVEL_DISGUSTING)//Believe it or not but this is actually the cleaner option. + add_event(null, "hygiene", /datum/mood_event/disgusting) + if(HYGIENE_LEVEL_DISGUSTING to HYGIENE_LEVEL_DIRTY) + add_event(null, "hygiene", /datum/mood_event/dirty) + if(HYGIENE_LEVEL_DIRTY to HYGIENE_LEVEL_NORMAL) + clear_event(null, "hygiene") + if(HYGIENE_LEVEL_NORMAL to HYGIENE_LEVEL_CLEAN) + add_event(null, "hygiene", /datum/mood_event/neat) /datum/component/mood/proc/check_area_mood(datum/source, var/area/A) + SIGNAL_HANDLER + if(A.mood_bonus) + if(get_event("area")) //walking between areas that give mood bonus should first clear the bonus from the previous one + clear_event(null, "area") add_event(null, "area", /datum/mood_event/area, list(A.mood_bonus, A.mood_message)) else clear_event(null, "area") #undef MINOR_INSANITY_PEN #undef MAJOR_INSANITY_PEN + +///Causes direct drain of someone's sanity, call it with a numerical value corresponding how badly you want to hurt their sanity +/datum/component/mood/proc/direct_sanity_drain(datum/source, amount) + SIGNAL_HANDLER + + setSanity(sanity + amount) diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm index 8bf4ab5f6309f..bc99510afa726 100644 --- a/code/datums/components/nanites.dm +++ b/code/datums/components/nanites.dm @@ -107,9 +107,9 @@ else adjust_nanites(null, amount) //just add to the nanite volume -/datum/component/nanites/process() +/datum/component/nanites/process(delta_time) if(!IS_IN_STASIS(host_mob)) - adjust_nanites(null, regen_rate) + adjust_nanites(null, regen_rate * delta_time) add_research() for(var/X in programs) var/datum/nanite_program/NP = X @@ -121,10 +121,14 @@ /datum/component/nanites/proc/delete_nanites() + SIGNAL_HANDLER + qdel(src) //Syncs the nanite component to another, making it so programs are the same with the same programming (except activation status) /datum/component/nanites/proc/sync(datum/signal_source, datum/component/nanites/source, full_overwrite = TRUE, copy_activation = FALSE) + SIGNAL_HANDLER + var/list/programs_to_remove = programs.Copy() var/list/programs_to_add = source.programs.Copy() for(var/X in programs) @@ -157,6 +161,8 @@ NP.software_error() /datum/component/nanites/proc/add_program(datum/source, datum/nanite_program/new_program, datum/nanite_program/source_program) + SIGNAL_HANDLER + for(var/X in programs) var/datum/nanite_program/NP = X if(NP.unique && NP.type == new_program.type) @@ -176,6 +182,8 @@ return (nanite_volume > 0) /datum/component/nanites/proc/adjust_nanites(datum/source, amount) + SIGNAL_HANDLER + nanite_volume = clamp(nanite_volume + amount, 0, max_nanites) if(nanite_volume <= 0) //oops we ran out qdel(src) @@ -192,6 +200,8 @@ holder.icon_state = "nanites[nanite_percent]" /datum/component/nanites/proc/on_emp(datum/source, severity) + SIGNAL_HANDLER + nanite_volume *= (rand(60, 90) * 0.01) //Lose 10-40% of nanites adjust_nanites(null, -(rand(5, 50))) //Lose 5-50 flat nanite volume if(prob(40/severity)) @@ -201,8 +211,10 @@ NP.on_emp(severity) -/datum/component/nanites/proc/on_shock(datum/source, shock_damage, siemens_coeff = 1, flags = NONE) - if(flags & SHOCK_ILLUSION || shock_damage < 1) +/datum/component/nanites/proc/on_shock(datum/source, shock_damage, shock_source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0, stun = TRUE) + SIGNAL_HANDLER + + if(illusion || shock_damage < 1) return if(!HAS_TRAIT_NOT_FROM(host_mob, TRAIT_SHOCKIMMUNE, "nanites"))//Another shock protection must protect nanites too, but nanites protect only host @@ -213,35 +225,49 @@ NP.on_shock(shock_damage) /datum/component/nanites/proc/on_minor_shock(datum/source) + SIGNAL_HANDLER + adjust_nanites(null, -(rand(5, 15))) //Lose 5-15 flat nanite volume for(var/X in programs) var/datum/nanite_program/NP = X NP.on_minor_shock() /datum/component/nanites/proc/check_stealth(datum/source) + SIGNAL_HANDLER + return stealth /datum/component/nanites/proc/on_death(datum/source, gibbed) + SIGNAL_HANDLER + for(var/X in programs) var/datum/nanite_program/NP = X NP.on_death(gibbed) /datum/component/nanites/proc/receive_signal(datum/source, code, source = "an unidentified source") + SIGNAL_HANDLER + for(var/X in programs) var/datum/nanite_program/NP = X NP.receive_signal(code, source) /datum/component/nanites/proc/receive_comm_signal(datum/source, comm_code, comm_message, comm_source = "an unidentified source") + SIGNAL_HANDLER + for(var/X in programs) if(istype(X, /datum/nanite_program/comm)) var/datum/nanite_program/comm/NP = X NP.receive_comm_signal(comm_code, comm_message, comm_source) /datum/component/nanites/proc/check_viable_biotype() + SIGNAL_HANDLER + if(!(MOB_ORGANIC in host_mob.mob_biotypes) && !(MOB_UNDEAD in host_mob.mob_biotypes) && !HAS_TRAIT(host_mob, TRAIT_NANITECOMPATIBLE)) qdel(src) //bodytype no longer sustains nanites /datum/component/nanites/proc/check_access(datum/source, obj/O) + SIGNAL_HANDLER + for(var/datum/nanite_program/access/access_program in programs) if(access_program.activated) return O.check_access_list(access_program.access) @@ -250,15 +276,23 @@ return FALSE /datum/component/nanites/proc/set_volume(datum/source, amount) + SIGNAL_HANDLER + nanite_volume = clamp(amount, 0, max_nanites) /datum/component/nanites/proc/set_max_volume(datum/source, amount) + SIGNAL_HANDLER + max_nanites = max(1, max_nanites) /datum/component/nanites/proc/set_cloud(datum/source, amount) + SIGNAL_HANDLER + cloud_id = clamp(amount, 0, 100) /datum/component/nanites/proc/set_cloud_sync(datum/source, method) + SIGNAL_HANDLER + switch(method) if(NANITE_CLOUD_TOGGLE) cloud_active = !cloud_active @@ -268,12 +302,18 @@ cloud_active = TRUE /datum/component/nanites/proc/set_safety(datum/source, amount) + SIGNAL_HANDLER + safety_threshold = clamp(amount, 0, max_nanites) /datum/component/nanites/proc/set_regen(datum/source, amount) + SIGNAL_HANDLER + regen_rate = amount /datum/component/nanites/proc/confirm_nanites() + SIGNAL_HANDLER + return TRUE //yup i exist /datum/component/nanites/proc/get_data(list/nanite_data) @@ -285,6 +325,8 @@ nanite_data["stealth"] = stealth /datum/component/nanites/proc/get_programs(datum/source, list/nanite_programs) + SIGNAL_HANDLER + nanite_programs |= programs /datum/component/nanites/proc/add_research() @@ -301,6 +343,8 @@ SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_NANITES = research_value)) /datum/component/nanites/proc/nanite_scan(datum/source, mob/user, full_scan) + SIGNAL_HANDLER + if(!full_scan) if(!stealth) to_chat(user, "Nanites Detected") @@ -324,6 +368,8 @@ return TRUE /datum/component/nanites/proc/nanite_ui_data(datum/source, list/data, scan_level) + SIGNAL_HANDLER + data["has_nanites"] = TRUE data["nanite_volume"] = nanite_volume data["regen_rate"] = regen_rate diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm index 1160aa44cbd25..e9c2a5c41d3a1 100644 --- a/code/datums/components/orbiter.dm +++ b/code/datums/components/orbiter.dm @@ -2,6 +2,7 @@ can_transfer = TRUE dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS var/list/orbiters + var/datum/movement_detector/tracker //radius: range to orbit at, radius of the circle formed by orbiting (in pixels) //clockwise: whether you orbit clockwise or anti clockwise @@ -22,17 +23,15 @@ /datum/component/orbiter/RegisterWithParent() var/atom/target = parent + target.orbiters = src - while(ismovableatom(target)) - RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/move_react) - target = target.loc + if(ismovableatom(target)) + tracker = new(target, CALLBACK(src, .proc/move_react)) /datum/component/orbiter/UnregisterFromParent() var/atom/target = parent target.orbiters = null - while(ismovableatom(target)) - UnregisterSignal(target, COMSIG_MOVABLE_MOVED) - target = target.loc + QDEL_NULL(tracker) /datum/component/orbiter/Destroy() var/atom/master = parent @@ -42,9 +41,9 @@ orbiters = null return ..() -/datum/component/orbiter/InheritComponent(datum/component/orbiter/newcomp, original, list/arguments) - if(arguments) - begin_orbit(arglist(arguments)) +/datum/component/orbiter/InheritComponent(datum/component/orbiter/newcomp, original, atom/movable/orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation) + if(!newcomp) + begin_orbit(arglist(args.Copy(3))) return // The following only happens on component transfers orbiters += newcomp.orbiters @@ -63,7 +62,7 @@ orbiters[orbiter] = TRUE orbiter.orbiting = src RegisterSignal(orbiter, COMSIG_MOVABLE_MOVED, .proc/orbiter_move_react) - + SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_BEGIN, orbiter) var/matrix/initial_transform = matrix(orbiter.transform) orbiters[orbiter] = initial_transform @@ -89,6 +88,7 @@ if(!orbiters[orbiter]) return UnregisterSignal(orbiter, COMSIG_MOVABLE_MOVED) + SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_STOP, orbiter) orbiter.SpinAnimation(0, 0) if(istype(orbiters[orbiter],/matrix)) //This is ugly. orbiter.transform = orbiters[orbiter] @@ -99,10 +99,9 @@ qdel(src) // This proc can receive signals by either the thing being directly orbited or anything holding it -/datum/component/orbiter/proc/move_react(atom/orbited, atom/oldloc, direction) +/datum/component/orbiter/proc/move_react(atom/movable/master, atom/mover, atom/oldloc, direction) set waitfor = FALSE // Transfer calls this directly and it doesnt care if the ghosts arent done moving - var/atom/movable/master = parent if(master.loc == oldloc) return @@ -110,19 +109,6 @@ if(!newturf) qdel(src) - // Handling the signals of stuff holding us (or not anymore) - // 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)) - 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)) - RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/move_react, TRUE) - target = target.loc - var/atom/curloc = master.loc for(var/i in orbiters) var/atom/movable/thing = i @@ -135,6 +121,8 @@ /datum/component/orbiter/proc/orbiter_move_react(atom/movable/orbiter, atom/oldloc, direction) + SIGNAL_HANDLER + if(orbiter.loc == get_turf(parent)) return end_orbit(orbiter) diff --git a/code/datums/components/paintable.dm b/code/datums/components/paintable.dm index 756c42aa9dabc..8b946dd915ba6 100644 --- a/code/datums/components/paintable.dm +++ b/code/datums/components/paintable.dm @@ -13,6 +13,8 @@ A.remove_atom_colour(FIXED_COLOUR_PRIORITY, current_paint) /datum/component/spraycan_paintable/proc/Repaint(datum/source, obj/item/toy/crayon/spraycan/spraycan, mob/living/user) + SIGNAL_HANDLER + if(!istype(spraycan) || user.a_intent == INTENT_HARM) return . = COMPONENT_NO_AFTERATTACK diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm new file mode 100644 index 0000000000000..1c0c41e2c2f69 --- /dev/null +++ b/code/datums/components/pellet_cloud.dm @@ -0,0 +1,298 @@ +/* + * 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 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) + 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) + SIGNAL_HANDLER + + shooter = user + var/turf/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 + var/turf/current_loc = get_turf(user) + if(!istype(targloc) || !istype(current_loc)) + return + INVOKE_ASYNC(shell, /obj/item/ammo_casing.proc/throw_proj, target, targloc, shooter, params, spread) + 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) + SIGNAL_HANDLER + + 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 + INVOKE_ASYNC(src, .proc/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 + INVOKE_ASYNC(src, .proc/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 + * + */ +/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) + 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) + SIGNAL_HANDLER + + 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) + SIGNAL_HANDLER + + 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) + SIGNAL_HANDLER + + 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) + SIGNAL_HANDLER + + 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() + SIGNAL_HANDLER + + 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) + SIGNAL_HANDLER + + 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() + SIGNAL_HANDLER + + 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) + SIGNAL_HANDLER + + UnregisterSignal(target, COMSIG_PARENT_QDELETING) + targets_hit -= target + LAZYREMOVE(bodies, target) diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm index 17105b0c5de9d..f89f50d2118f3 100644 --- a/code/datums/components/plumbing/_plumbing.dm +++ b/code/datums/components/plumbing/_plumbing.dm @@ -35,9 +35,8 @@ create_overlays() /datum/component/plumbing/process() - if(!demand_connects || !reagents) - STOP_PROCESSING(SSfluids, src) - return + if(!demand_connects || !reagents) // This actually shouldn't happen, but better safe than sorry + return PROCESS_KILL if(reagents.total_volume < reagents.maximum_volume) for(var/D in GLOB.cardinals) if(D & demand_connects) @@ -99,9 +98,9 @@ for(var/D in GLOB.cardinals) var/color var/direction - if(D & demand_connects) + if(D & initial(demand_connects)) color = "red" //red because red is mean and it takes - else if(D & supply_connects) + else if(D & initial(supply_connects)) color = "blue" //blue is nice and gives else continue @@ -124,6 +123,8 @@ ducterlays += I ///we stop acting like a plumbing thing and disconnect if we are, so we can safely be moved and stuff /datum/component/plumbing/proc/disable() + SIGNAL_HANDLER + if(!active) return STOP_PROCESSING(SSfluids, src) @@ -144,7 +145,7 @@ update_dir() active = TRUE var/atom/movable/AM = parent - for(var/obj/machinery/duct/D in AM.loc) //Destroy any ducts under us. Ducts also self destruct if placed under a plumbing machine. machines disable when they get moved + for(var/obj/machinery/duct/D in AM.loc) //Destroy any ducts under us. Ducts also self-destruct if placed under a plumbing machine. machines disable when they get moved if(D.anchored) //that should cover everything D.disconnect_duct() @@ -164,6 +165,8 @@ /// Toggle our machinery on or off. This is called by a hook from default_unfasten_wrench with anchored as only param, so we dont have to copypaste this on every object that can move /datum/component/plumbing/proc/toggle_active(obj/O, new_state) + SIGNAL_HANDLER + if(new_state) enable() else @@ -179,6 +182,7 @@ var/new_supply_connects var/new_dir = AM.dir var/angle = 180 - dir2angle(new_dir) + if(new_dir == SOUTH) demand_connects = initial(demand_connects) supply_connects = initial(supply_connects) diff --git a/code/datums/components/rad_insulation.dm b/code/datums/components/rad_insulation.dm index 73d8c29440cf6..ef5510f144688 100644 --- a/code/datums/components/rad_insulation.dm +++ b/code/datums/components/rad_insulation.dm @@ -15,11 +15,17 @@ amount = _amount /datum/component/rad_insulation/proc/rad_probe_react(datum/source) + SIGNAL_HANDLER + return COMPONENT_BLOCK_RADIATION /datum/component/rad_insulation/proc/rad_contaminating(datum/source, strength) + SIGNAL_HANDLER + return COMPONENT_BLOCK_CONTAMINATION -/datum/component/rad_insulation/proc/rad_pass(datum/source, datum/radiation_wave/wave, width) - wave.intensity = wave.intensity*(1-((1-amount)/width)) // The further out the rad wave goes the less it's affected by insulation (larger width) +/datum/component/rad_insulation/proc/rad_pass(datum/source, datum/radiation_wave/wave, index) + SIGNAL_HANDLER + + wave.intensity[index] *= amount return COMPONENT_RAD_WAVE_HANDLED diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index e892afeea3541..b12f00adb01dd 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -23,7 +23,7 @@ RegisterSignal(parent, COMSIG_ITEM_ATTACK_OBJ, .proc/rad_attack) else return COMPONENT_INCOMPATIBLE - if(strength > RAD_MINIMUM_CONTAMINATION) + if(strength * (RAD_CONTAMINATION_STR_COEFFICIENT * RAD_CONTAMINATION_BUDGET_SIZE) > RAD_COMPONENT_MINIMUM) SSradiation.warn(src) //Let's make er glow //This relies on parent not being a turf or something. IF YOU CHANGE THAT, CHANGE THIS @@ -38,17 +38,17 @@ master.remove_filter("rad_glow") return ..() -/datum/component/radioactive/process() - if(!prob(50)) +/datum/component/radioactive/process(delta_time) + if(!DT_PROB(50, delta_time)) return - radiation_pulse(parent, strength, RAD_DISTANCE_COEFFICIENT*2, FALSE, can_contaminate) + if(strength >= RAD_WAVE_MINIMUM) + radiation_pulse(parent, strength, RAD_DISTANCE_COEFFICIENT*RAD_DISTANCE_COEFFICIENT_COMPONENT_MULTIPLIER, FALSE, can_contaminate) if(!hl3_release_date) return strength -= strength / hl3_release_date - if(strength < RAD_WAVE_MINIMUM) + if(strength < RAD_COMPONENT_MINIMUM) qdel(src) - return PROCESS_KILL /datum/component/radioactive/proc/glow_loop(atom/movable/master) var/filter = master.get_filter("rad_glow") @@ -56,18 +56,20 @@ animate(filter, alpha = 110, time = 15, loop = -1) animate(alpha = 40, time = 25) -/datum/component/radioactive/InheritComponent(datum/component/C, i_am_original, list/arguments) +/datum/component/radioactive/InheritComponent(datum/component/C, i_am_original, _strength, _source, _half_life, _can_contaminate) if(!i_am_original) return if(!hl3_release_date) // Permanently radioactive things don't get to grow stronger return if(C) var/datum/component/radioactive/other = C - strength = max(strength, other.strength) + strength += other.strength else - strength = max(strength, arguments[1]) + strength = max(strength, _strength) /datum/component/radioactive/proc/rad_examine(datum/source, mob/user, atom/thing) + SIGNAL_HANDLER + var/atom/master = parent var/list/out = list() if(get_dist(master, user) <= 1) @@ -84,6 +86,8 @@ to_chat(user, out.Join()) /datum/component/radioactive/proc/rad_attack(datum/source, atom/movable/target, mob/living/user) + SIGNAL_HANDLER + radiation_pulse(parent, strength/20) target.rad_act(strength/2) if(!hl3_release_date) diff --git a/code/datums/components/religious_tool.dm b/code/datums/components/religious_tool.dm new file mode 100644 index 0000000000000..0f11e5d3d20e9 --- /dev/null +++ b/code/datums/components/religious_tool.dm @@ -0,0 +1,153 @@ +/** + * + * Allows the parent to act similarly to the Altar of Gods with modularity. Invoke and Sect Selection is done via attacking with a bible. This means you cannot sacrifice Bibles (you shouldn't want to do this anyways although now that I mentioned it you probably will want to). + * + */ +/datum/component/religious_tool + dupe_mode = COMPONENT_DUPE_UNIQUE + /// Enables access to the global sect directly + var/datum/religion_sect/easy_access_sect + /// What extent do we want this religious tool to act? In case you don't want full access to the list. Generated on New + var/operation_flags + /// The rite currently being invoked + var/datum/religion_rites/performing_rite + ///Sets the type for catalyst + var/catalyst_type = /obj/item/storage/book/bible + ///Enables overide of COMPONENT_NO_AFTERATTACK, not recommended as it means you can potentially cause damage to the item using the catalyst. + var/force_catalyst_afterattack = FALSE + var/datum/callback/after_sect_select_cb + +/datum/component/religious_tool/Initialize(_flags = ALL, _force_catalyst_afterattack = FALSE, _after_sect_select_cb, override_catalyst_type) + . = ..() + operation_flags = _flags + force_catalyst_afterattack = _force_catalyst_afterattack + after_sect_select_cb = _after_sect_select_cb + SetGlobalToLocal() //attempt to connect on start in case one already exists! + if(override_catalyst_type) + catalyst_type = override_catalyst_type + +/datum/component/religious_tool/RegisterWithParent() + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY,.proc/AttemptActions) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine) + +/datum/component/religious_tool/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_PARENT_ATTACKBY, COMSIG_PARENT_EXAMINE)) + +/** + * Sets the easy access variable to the global if it exists. + */ +/datum/component/religious_tool/proc/SetGlobalToLocal() + if(easy_access_sect) + return TRUE + if(!GLOB.religious_sect) + return FALSE + easy_access_sect = GLOB.religious_sect + after_sect_select_cb?.Invoke() + return TRUE + + + +/** + * Since all of these involve attackby, we require mega proc. Handles Invocation, Sacrificing, And Selection of Sects. + */ +/datum/component/religious_tool/proc/AttemptActions(datum/source, obj/item/the_item, mob/living/user) + /**********Sect Selection**********/ + if(!SetGlobalToLocal()) + if(!(operation_flags & RELIGION_TOOL_SECTSELECT)) + return + . = COMPONENT_NO_AFTERATTACK //At this point you're intentionally trying to select a sect. + if(user.mind.holy_role != HOLY_ROLE_HIGHPRIEST) + to_chat(user, "You are not the high priest, and therefore cannot select a religious sect.") + return + var/list/available_options = generate_available_sects(user) + if(!available_options) + return + + var/sect_select = input(user,"Select a sect (You CANNOT revert this decision!)","Select a Sect",null) in available_options + if(!sect_select || !user.canUseTopic(parent, BE_CLOSE, FALSE, NO_TK)) + to_chat(user,"You cannot select a sect at this time.") + return + var/type_selected = available_options[sect_select] + GLOB.religious_sect = new type_selected() + for(var/mob/living/am_i_holy_living in GLOB.player_list) + if(!am_i_holy_living.mind?.holy_role) + continue + GLOB.religious_sect.on_conversion(am_i_holy_living) + easy_access_sect = GLOB.religious_sect + after_sect_select_cb?.Invoke() + return + /**********Rite Invocation**********/ + else if(istype(the_item, catalyst_type)) + if(!(operation_flags & RELIGION_TOOL_INVOKE)) + return + . = force_catalyst_afterattack ? null : COMPONENT_NO_AFTERATTACK + if(!easy_access_sect.rites_list) + to_chat(user, "Your sect doesn't have any rites to perform!") + return + if(performing_rite) + to_chat(user, "There is a rite currently being performed here already!") + return + var/rite_select = input(user,"Select a rite to perform!","Select a rite",null) in easy_access_sect.rites_list + if(!rite_select || !user.canUseTopic(parent, BE_CLOSE, FALSE, NO_TK)) + to_chat(user,"You cannot perform the rite at this time.") + return + var/selection2type = easy_access_sect.rites_list[rite_select] + performing_rite = new selection2type(parent) + if(!performing_rite.perform_rite(user, parent)) + QDEL_NULL(performing_rite) + else + performing_rite.invoke_effect(user, parent) + easy_access_sect.adjust_favor(-performing_rite.favor_cost) + QDEL_NULL(performing_rite) + return + + /**********Sacrificing**********/ + else if(operation_flags & RELIGION_TOOL_SACRIFICE) + if(!easy_access_sect?.can_sacrifice(the_item,user)) + if(user.a_intent != INTENT_HARM && !(the_item.item_flags & ABSTRACT)) + var/turf/location = get_turf(parent) + if(location) + user.transferItemToLoc(the_item, location) + return COMPONENT_NO_AFTERATTACK + return + easy_access_sect.on_sacrifice(the_item,user) + return COMPONENT_NO_AFTERATTACK + + +/** + * Generates a list of available sects to the user. Intended to support custom-availability sects. Because these are not instanced, we cannot put the availability on said sect beyond variables. + */ +/datum/component/religious_tool/proc/generate_available_sects(mob/user) + . = list() + for(var/i in subtypesof(/datum/religion_sect)) + var/datum/religion_sect/not_a_real_instance_rs = i + if(initial(not_a_real_instance_rs.starter)) + . += list(initial(not_a_real_instance_rs.name) = i) + +/** + * Appends to examine so the user knows it can be used for religious purposes. + */ +/datum/component/religious_tool/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + var/can_i_see = FALSE + if(isobserver(user)) + can_i_see = TRUE + else if(isliving(user)) + var/mob/living/L = user + if(L.mind?.holy_role) + can_i_see = TRUE + + if(!can_i_see) + return + if(!easy_access_sect) + if(operation_flags & RELIGION_TOOL_SECTSELECT) + examine_list += "This looks like it can be used to select a sect." + return + + examine_list += "The sect currently has [round(easy_access_sect.favor)] favor with [GLOB.deity]. [(operation_flags & RELIGION_TOOL_SACRIFICE) ? "Desired items can be used on this to increase favor." : ""]" + if(!easy_access_sect.rites_list) + return //if we dont have rites it doesnt do us much good if the object can be used to invoke them! + if(operation_flags & RELIGION_TOOL_INVOKE) + examine_list += "List of available Rites:" + examine_list += easy_access_sect.rites_list diff --git a/code/datums/components/remote_materials.dm b/code/datums/components/remote_materials.dm index 4d6b01b9f1798..84f7f74a15754 100644 --- a/code/datums/components/remote_materials.dm +++ b/code/datums/components/remote_materials.dm @@ -24,6 +24,7 @@ handles linking back and forth. src.allow_standalone = allow_standalone RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy) + RegisterSignal(parent, COMSIG_MOVABLE_Z_CHANGED, .proc/check_z_disconnect) var/turf/T = get_turf(parent) if (force_connect || (mapload && is_station_level(T.z))) @@ -53,18 +54,30 @@ handles linking back and forth. /datum/component/remote_materials/proc/_MakeLocal() silo = null - mat_container = parent.AddComponent(/datum/component/material_container, - list(/datum/material/iron, /datum/material/glass, /datum/material/copper, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace, /datum/material/plastic), - local_size, - FALSE, - /obj/item/stack) + + var/static/list/allowed_mats = list( + /datum/material/iron, + /datum/material/glass, + /datum/material/copper, + /datum/material/silver, + /datum/material/gold, + /datum/material/diamond, + /datum/material/plasma, + /datum/material/uranium, + /datum/material/bananium, + /datum/material/titanium, + /datum/material/bluespace, + /datum/material/plastic, + ) + + mat_container = parent.AddComponent(/datum/component/material_container, allowed_mats, local_size, allowed_types=/obj/item/stack) /datum/component/remote_materials/proc/set_local_size(size) local_size = size if (!silo && mat_container) mat_container.max_amount = size -// called if disconnected by ore silo UI or destruction +// called if disconnected by ore silo UI, or destruction /datum/component/remote_materials/proc/disconnect_from(obj/machinery/ore_silo/old_silo) if (!old_silo || silo != old_silo) return @@ -72,13 +85,42 @@ handles linking back and forth. mat_container = null if (allow_standalone) _MakeLocal() + return TRUE + +/datum/component/remote_materials/proc/is_valid_link(atom/targeta, atom/targetb = silo) + return ((is_station_level(targeta.z) && is_station_level(targetb.z)) || (targeta.get_virtual_z_level() == targetb.get_virtual_z_level())) + + +/datum/component/remote_materials/proc/check_z_disconnect() + SIGNAL_HANDLER + if(!silo) //No silo? + return + var/atom/P = parent + if(!is_valid_link(P)) + graceful_disconnect() + +// like disconnect_from, but does proper cleanup instead of simple deletion. +/datum/component/remote_materials/proc/graceful_disconnect() + var/obj/machinery/ore_silo/old_silo = silo + if(!disconnect_from(old_silo)) + return + old_silo.connected -= src + old_silo.updateUsrDialog() + var/atom/P = parent + P.visible_message("[parent]'s material manager blinks orange: Disconnected.") /datum/component/remote_materials/proc/OnAttackBy(datum/source, obj/item/I, mob/user) + SIGNAL_HANDLER + if(I.tool_behaviour == TOOL_MULTITOOL) if(!I.multitool_check_buffer(user, I)) return COMPONENT_NO_AFTERATTACK var/obj/item/multitool/M = I if (!QDELETED(M.buffer) && istype(M.buffer, /obj/machinery/ore_silo)) + var/atom/P = parent + if (!is_valid_link(P, M.buffer)) + to_chat(usr, "[parent]'s material manager blinks red: Out of Range.") + return COMPONENT_NO_AFTERATTACK if (silo == M.buffer) to_chat(user, "[parent] is already connected to [silo].") return COMPONENT_NO_AFTERATTACK @@ -111,3 +153,21 @@ handles linking back and forth. return "[mat_container.total_amount] / [mat_container.max_amount == INFINITY ? "Unlimited" : mat_container.max_amount] ([silo ? "remote" : "local"])" else return "0 / 0" + +/// Ejects the given material ref and logs it, or says out loud the problem. +/datum/component/remote_materials/proc/eject_sheets(datum/material/material_ref, eject_amount) + var/atom/movable/movable_parent = parent + if (!istype(movable_parent)) + return 0 + + if (!mat_container) + movable_parent.say("No access to material storage, please contact the quartermaster.") + return 0 + if (on_hold()) + movable_parent.say("Mineral access is on hold, please contact the quartermaster.") + return 0 + var/count = mat_container.retrieve_sheets(eject_amount, material_ref, movable_parent.drop_location()) + var/list/matlist = list() + matlist[material_ref] = eject_amount + silo_log(parent, "ejected", -count, "sheets", matlist) + return count diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index ad344daf447cc..bc743efc87cd3 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -29,6 +29,9 @@ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/vehicle_moved) /datum/component/riding/proc/vehicle_mob_unbuckle(datum/source, mob/living/M, force = FALSE) + SIGNAL_HANDLER + + unequip_buckle_inhands(parent) var/atom/movable/AM = parent restore_position(M) unequip_buckle_inhands(M) @@ -36,6 +39,8 @@ qdel(src) /datum/component/riding/proc/vehicle_mob_buckle(datum/source, mob/living/M, force = FALSE) + SIGNAL_HANDLER + handle_vehicle_offsets() /datum/component/riding/proc/handle_vehicle_layer() @@ -52,6 +57,8 @@ directional_vehicle_layers["[dir]"] = layer /datum/component/riding/proc/vehicle_moved(datum/source) + SIGNAL_HANDLER + var/atom/movable/AM = parent for(var/i in AM.buckled_mobs) ride_check(i) @@ -213,6 +220,8 @@ H.add_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING, multiplicative_slowdown = HUMAN_CARRY_SLOWDOWN) /datum/component/riding/human/proc/on_host_unarmed_melee(atom/target) + SIGNAL_HANDLER + var/mob/living/carbon/human/H = parent if(H.a_intent == INTENT_DISARM && (target in H.buckled_mobs)) force_dismount(target) @@ -307,7 +316,7 @@ M.visible_message("[M] is thrown clear of [AM]!", \ "You're thrown clear of [AM]!") M.throw_at(target, 14, 5, AM) - M.Paralyze(60) + M.Knockdown(60) /datum/component/riding/proc/equip_buckle_inhands(mob/living/carbon/human/user, amount_required = 1, riding_target_override = null) var/atom/movable/AM = parent diff --git a/code/datums/components/rot.dm b/code/datums/components/rot.dm index f78c640516598..cb195ea0f83df 100644 --- a/code/datums/components/rot.dm +++ b/code/datums/components/rot.dm @@ -10,7 +10,11 @@ START_PROCESSING(SSprocessing, src) -/datum/component/rot/process() +/datum/component/rot/Destroy() + STOP_PROCESSING(SSprocessing, src) + return ..() + +/datum/component/rot/process(delta_time) var/atom/A = parent var/turf/open/T = get_turf(A) @@ -18,7 +22,7 @@ return var/datum/gas_mixture/stank = new - stank.set_moles(/datum/gas/miasma, amount) + stank.set_moles(GAS_MIASMA, amount * delta_time) stank.set_temperature(BODYTEMP_NORMAL) // otherwise we have gas below 2.7K which will break our lag generator T.assume_air(stank) T.air_update_turf() @@ -33,6 +37,9 @@ /datum/component/rot/corpse/process() var/mob/living/carbon/C = parent + if(C == null) //can't delete what doesnt exist + return + if(C.stat != DEAD) qdel(src) return diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index 42b8d2af297f3..b3f8208e58319 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -51,28 +51,28 @@ if(rotation_flags & ROTATION_WRENCH) RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/WrenchRot) -/datum/component/simple_rotation/proc/add_verbs() +/datum/component/simple_rotation/proc/add_rotation_verbs() if(rotation_flags & ROTATION_VERBS) var/atom/movable/AM = parent if(rotation_flags & ROTATION_FLIP) - AM.verbs += /atom/movable/proc/simple_rotate_flip + AM.add_verb(/atom/movable/proc/simple_rotate_flip) if(src.rotation_flags & ROTATION_CLOCKWISE) - AM.verbs += /atom/movable/proc/simple_rotate_clockwise + AM.add_verb(/atom/movable/proc/simple_rotate_clockwise) if(src.rotation_flags & ROTATION_COUNTERCLOCKWISE) - AM.verbs += /atom/movable/proc/simple_rotate_counterclockwise + AM.add_verb(/atom/movable/proc/simple_rotate_counterclockwise) -/datum/component/simple_rotation/proc/remove_verbs() +/datum/component/simple_rotation/proc/remove_rotation_verbs() if(parent) var/atom/movable/AM = parent - AM.verbs -= /atom/movable/proc/simple_rotate_flip - AM.verbs -= /atom/movable/proc/simple_rotate_clockwise - AM.verbs -= /atom/movable/proc/simple_rotate_counterclockwise + AM.remove_verb(/atom/movable/proc/simple_rotate_flip) + AM.remove_verb(/atom/movable/proc/simple_rotate_clockwise) + AM.remove_verb(/atom/movable/proc/simple_rotate_counterclockwise) /datum/component/simple_rotation/proc/remove_signals() UnregisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_PARENT_EXAMINE, COMSIG_PARENT_ATTACKBY)) /datum/component/simple_rotation/RegisterWithParent() - add_verbs() + add_rotation_verbs() add_signals() . = ..() @@ -83,7 +83,7 @@ return COMPONENT_NOTRANSFER /datum/component/simple_rotation/UnregisterFromParent() - remove_verbs() + remove_rotation_verbs() remove_signals() . = ..() @@ -95,19 +95,25 @@ . = ..() /datum/component/simple_rotation/RemoveComponent() - remove_verbs() + remove_rotation_verbs() . = ..() /datum/component/simple_rotation/proc/ExamineMessage(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + if(rotation_flags & ROTATION_ALTCLICK) examine_list += "Alt-click to rotate it clockwise." /datum/component/simple_rotation/proc/HandRot(datum/source, mob/user, rotation = default_rotation_direction) + SIGNAL_HANDLER + if(!can_be_rotated.Invoke(user, rotation) || !can_user_rotate.Invoke(user, rotation)) return BaseRot(user, rotation) /datum/component/simple_rotation/proc/WrenchRot(datum/source, obj/item/I, mob/living/user) + SIGNAL_HANDLER + if(!can_be_rotated.Invoke(user,default_rotation_direction) || !can_user_rotate.Invoke(user,default_rotation_direction)) return if(I.tool_behaviour == TOOL_WRENCH) diff --git a/code/datums/components/shell.dm b/code/datums/components/shell.dm new file mode 100644 index 0000000000000..9fd124d79e58c --- /dev/null +++ b/code/datums/components/shell.dm @@ -0,0 +1,244 @@ +/// Makes an atom a shell that is able to take in an attached circuit. +/datum/component/shell + dupe_mode = COMPONENT_DUPE_UNIQUE + + /// The circuitboard attached to this shell + var/obj/item/integrated_circuit/attached_circuit + + /// Flags containing what this shell can do + var/shell_flags = NONE + + /// The capacity of the shell. + var/capacity = INFINITY + + /// A list of components that cannot be removed + var/list/obj/item/circuit_component/unremovable_circuit_components + + var/locked = FALSE + +/datum/component/shell/Initialize(unremovable_circuit_components, capacity, shell_flags) + . = ..() + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + + src.shell_flags = shell_flags || src.shell_flags + src.capacity = capacity || src.capacity + src.unremovable_circuit_components = unremovable_circuit_components + + for(var/obj/item/circuit_component/circuit_component as anything in unremovable_circuit_components) + circuit_component.removable = FALSE + +/datum/component/shell/RegisterWithParent() + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/on_attack_by) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_GHOST, .proc/on_attack_ghost) + if(!(shell_flags & SHELL_FLAG_CIRCUIT_FIXED)) + RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), .proc/on_screwdriver_act) + RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), .proc/on_multitool_act) + RegisterSignal(parent, COMSIG_OBJ_DECONSTRUCT, .proc/on_object_deconstruct) + if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR) + RegisterSignal(parent, COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, .proc/on_unfasten) + RegisterSignal(parent, COMSIG_ATOM_USB_CABLE_TRY_ATTACH, .proc/on_atom_usb_cable_try_attach) + +/datum/component/shell/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_PARENT_ATTACKBY, + COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), + COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), + COMSIG_OBJ_DECONSTRUCT, + COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, + COMSIG_PARENT_EXAMINE, + COMSIG_ATOM_ATTACK_GHOST, + COMSIG_ATOM_USB_CABLE_TRY_ATTACH, + )) + + QDEL_NULL(attached_circuit) + +/datum/component/shell/Destroy(force, silent) + QDEL_LIST(unremovable_circuit_components) + return ..() + +/datum/component/shell/proc/on_object_deconstruct() + SIGNAL_HANDLER + remove_circuit() + +/datum/component/shell/proc/on_attack_ghost(datum/source, mob/dead/observer/ghost) + SIGNAL_HANDLER + if(attached_circuit) + INVOKE_ASYNC(attached_circuit, /datum.proc/ui_interact, ghost) + +/datum/component/shell/proc/on_examine(datum/source, mob/user, list/examine_text) + SIGNAL_HANDLER + if(!attached_circuit) + examine_text += "There is no integrated circuit attached." + return + + examine_text += "There is an integrated circuit attached. Use a multitool to access the wiring. Use a screwdriver to remove it from [source]." + examine_text += "The cover panel to the integrated circuit is [locked? "locked" : "unlocked"]." + var/obj/item/stock_parts/cell/cell = attached_circuit.cell + examine_text += "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%." + + if (shell_flags & SHELL_FLAG_USB_PORT) + examine_text += "There is a USB port on the front." + + +/** + * Called when the shell is wrenched. + * + * Only applies if the shell has SHELL_FLAG_REQUIRE_ANCHOR. + * Disables the integrated circuit if unanchored, otherwise enable the circuit. + */ +/datum/component/shell/proc/on_unfasten(atom/source, anchored) + SIGNAL_HANDLER + attached_circuit?.on = anchored +/** + * Called when an item hits the parent. This is the method to add the circuitboard to the component. + */ +/datum/component/shell/proc/on_attack_by(atom/source, obj/item/item, mob/living/attacker) + SIGNAL_HANDLER + + if(istype(item, /obj/item/stock_parts/cell)) + source.balloon_alert(attacker, "Can't pull cell in directly!") + return + + if(attached_circuit?.owner_id && item == attached_circuit.owner_id.resolve()) + locked = !locked + source.balloon_alert(attacker, "[locked? "Locked" : "Unlocked"] [source]") + return COMPONENT_NO_AFTERATTACK + + if(attached_circuit && istype(item, /obj/item/circuit_component)) + attached_circuit.add_component(item, attacker) + return + + if(!istype(item, /obj/item/integrated_circuit)) + return + var/obj/item/integrated_circuit/logic_board = item + . = COMPONENT_NO_AFTERATTACK + + if(logic_board.shell) // I'll be surprised if this ever happens + return + + if(attached_circuit) + source.balloon_alert(attacker, "There is already a circuitboard inside!") + return + + if(length(logic_board.attached_components) > capacity) + source.balloon_alert(attacker, "This is too large to fit into [parent]!") + return + + logic_board.inserter_mind = WEAKREF(attacker.mind) + attach_circuit(logic_board, attacker) + +/datum/component/shell/proc/on_multitool_act(atom/source, mob/user, obj/item/tool) + SIGNAL_HANDLER + if(!attached_circuit) + return + + if(locked) + if(shell_flags & SHELL_FLAG_ALLOW_FAILURE_ACTION) + return + source.balloon_alert(user, "It's locked!") + return COMPONENT_BLOCK_TOOL_ATTACK + + attached_circuit.interact(user) + return COMPONENT_BLOCK_TOOL_ATTACK + +/** + * Called when a screwdriver is used on the parent. Removes the circuitboard from the component. + */ +/datum/component/shell/proc/on_screwdriver_act(atom/source, mob/user, obj/item/tool) + SIGNAL_HANDLER + if(!attached_circuit) + return + + if(locked) + if(shell_flags & SHELL_FLAG_ALLOW_FAILURE_ACTION) + return + source.balloon_alert(user, "It's locked!") + return COMPONENT_BLOCK_TOOL_ATTACK + + tool.play_tool_sound(parent) + source.balloon_alert(user, "You unscrew [attached_circuit] from [parent].") + remove_circuit() + return COMPONENT_BLOCK_TOOL_ATTACK + +/** + * Checks for when the circuitboard moves. If it moves, removes it from the component. + */ +/datum/component/shell/proc/on_circuit_moved(obj/item/integrated_circuit/circuit, atom/new_loc) + SIGNAL_HANDLER + if(new_loc != parent) + remove_circuit() + +/** + * Checks for when the circuitboard deletes so that it can be unassigned. + */ +/datum/component/shell/proc/on_circuit_delete(datum/source) + SIGNAL_HANDLER + remove_circuit() + +/datum/component/shell/proc/on_circuit_add_component_manually(atom/source, obj/item/circuit_component/added_comp, mob/living/user) + SIGNAL_HANDLER + + if(locked) + source.balloon_alert(user, "It's locked!") + return COMPONENT_CANCEL_ADD_COMPONENT + + if(length(attached_circuit.attached_components) - length(unremovable_circuit_components) >= capacity) + source.balloon_alert(user, "It's at maximum capacity!") + return COMPONENT_CANCEL_ADD_COMPONENT + +/** + * Attaches a circuit to the parent. Doesn't do any checks to see for any existing circuits so that should be done beforehand. + */ +/datum/component/shell/proc/attach_circuit(obj/item/integrated_circuit/circuitboard, mob/living/user) + if(!user.transferItemToLoc(circuitboard, parent)) + return + locked = FALSE + attached_circuit = circuitboard + RegisterSignal(circuitboard, COMSIG_MOVABLE_MOVED, .proc/on_circuit_moved) + RegisterSignal(circuitboard, COMSIG_PARENT_QDELETING, .proc/on_circuit_delete) + for(var/obj/item/circuit_component/to_add as anything in unremovable_circuit_components) + to_add.forceMove(attached_circuit) + attached_circuit.add_component(to_add) + RegisterSignal(circuitboard, COMSIG_CIRCUIT_ADD_COMPONENT_MANUALLY, .proc/on_circuit_add_component_manually) + attached_circuit.set_shell(parent) + user.balloon_alert(user, "Attached [circuitboard] to [parent]") + + if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR) + var/atom/movable/parent_atom = parent + on_unfasten(parent_atom, parent_atom.anchored) + +/** + * Removes the circuit from the component. Doesn't do any checks to see for an existing circuit so that should be done beforehand. + */ +/datum/component/shell/proc/remove_circuit() + attached_circuit.on = TRUE + attached_circuit.remove_current_shell() + UnregisterSignal(attached_circuit, list( + COMSIG_MOVABLE_MOVED, + COMSIG_PARENT_QDELETING, + COMSIG_CIRCUIT_ADD_COMPONENT_MANUALLY, + )) + if(attached_circuit.loc == parent) + var/atom/parent_atom = parent + attached_circuit.forceMove(parent_atom.drop_location()) + + for(var/obj/item/circuit_component/to_remove as anything in unremovable_circuit_components) + attached_circuit.remove_component(to_remove) + to_remove.moveToNullspace() + attached_circuit = null + +/datum/component/shell/proc/on_atom_usb_cable_try_attach(atom/source, obj/item/usb_cable/usb_cable, mob/user) + SIGNAL_HANDLER + + if (!(shell_flags & SHELL_FLAG_USB_PORT)) + source.balloon_alert(user, "This shell has no usb ports") + return COMSIG_CANCEL_USB_CABLE_ATTACK + + if (isnull(attached_circuit)) + source.balloon_alert(user, "No circuit inside") + return COMSIG_CANCEL_USB_CABLE_ATTACK + + usb_cable.attached_circuit = attached_circuit + return COMSIG_USB_CABLE_CONNECTED_TO_CIRCUIT diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm index 172f252d5af21..294fc53621690 100644 --- a/code/datums/components/slippery.dm +++ b/code/datums/components/slippery.dm @@ -14,6 +14,8 @@ RegisterSignal(parent, list(COMSIG_MOVABLE_CROSSED, COMSIG_ATOM_ENTERED), .proc/Slip) /datum/component/slippery/proc/Slip(datum/source, atom/movable/AM) + SIGNAL_HANDLER + var/mob/victim = AM if(istype(victim) && !victim.is_flying() && victim.slip(knockdown_time, parent, lube_flags, paralyze_time, force_drop_items) && callback) callback.Invoke(victim) diff --git a/code/datums/components/snail_crawl.dm b/code/datums/components/snail_crawl.dm index 555bbdeed74d5..59a0af93cf4aa 100644 --- a/code/datums/components/snail_crawl.dm +++ b/code/datums/components/snail_crawl.dm @@ -6,6 +6,8 @@ snail = parent /datum/component/snailcrawl/proc/lubricate() + SIGNAL_HANDLER + if(snail.resting && !snail.buckled) //s l i d e var/turf/open/OT = get_turf(snail) if(isopenturf(OT)) @@ -16,4 +18,4 @@ /datum/component/snailcrawl/_RemoveFromParent() snail.remove_movespeed_modifier(MOVESPEED_ID_SNAIL_CRAWL) - return ..() \ No newline at end of file + return ..() diff --git a/code/datums/components/soundplayer.dm b/code/datums/components/soundplayer.dm new file mode 100644 index 0000000000000..1671c69dd4260 --- /dev/null +++ b/code/datums/components/soundplayer.dm @@ -0,0 +1,41 @@ +/*This is the sound_player component. It can be attached to any datum and register any signal to play the sound(s) you want, when you want. Used for the honk virus as an example + Usage : + target.AddComponent(/datum/component/sound_player, args) + Arguments : + custom_volume : Used to define a custom volume. Default : 30 + custom_sounds : Used to define a list of custom sounds that will be picked at random when play_sound() is triggered. Default : list('sound/items/bikehorn.ogg') + amount : Used to define an amount of time the component will work before deleting itself. Default : -1 + signal_or_sig_list : Used to register the signal(s) you want to play the sound when they are sent. Default : None +*/ +/datum/component/sound_player + var/volume = 30 + var/list/sounds = list('sound/items/bikehorn.ogg') + var/amount_left = -1 + +/datum/component/sound_player/Initialize(custom_volume, custom_sounds, amount, signal_or_sig_list) + if(!isnull(custom_volume)) + volume = custom_volume + + if(!isnull(custom_sounds)) + sounds = custom_sounds + + if(!isnull(amount)) + amount_left = amount + + RegisterSignal(parent, signal_or_sig_list, .proc/play_sound) //Registers all the signals in signal_or_sig_list. + + + +/*play_sound() os the proc that actually plays the sound. + If amount_left is equal to -1, the component is infinite and will never delete itself. +*/ +/datum/component/sound_player/proc/play_sound() + playsound(parent, pickweight(sounds), volume, TRUE) + switch(amount_left) + if(-1) + return + if(1) //Last use. + qdel(src) + return + else + amount_left-- diff --git a/code/datums/components/spawner.dm b/code/datums/components/spawner.dm index 221e3a41d9fd3..8600a59de0cdf 100644 --- a/code/datums/components/spawner.dm +++ b/code/datums/components/spawner.dm @@ -6,7 +6,7 @@ var/max_mobs = 5 var/spawn_text = "emerges from" var/list/faction = list("mining") - + /datum/component/spawner/Initialize(_mob_types, _spawn_time, _faction, _spawn_text, _max_mobs) @@ -26,9 +26,11 @@ /datum/component/spawner/process() try_spawn_mob() - + /datum/component/spawner/proc/stop_spawning(force) + SIGNAL_HANDLER + STOP_PROCESSING(SSprocessing, src) for(var/mob/living/simple_animal/L in spawned_mobs) if(L.nest == src) @@ -36,7 +38,7 @@ spawned_mobs = null /datum/component/spawner/proc/try_spawn_mob() - var/atom/P = parent + var/atom/P = parent if(spawned_mobs.len >= max_mobs) return 0 if(spawn_delay > world.time) @@ -44,7 +46,7 @@ spawn_delay = world.time + spawn_time var/chosen_mob_type = pick(mob_types) var/mob/living/simple_animal/L = new chosen_mob_type(P.loc) - L.flags_1 |= (P.flags_1 & ADMIN_SPAWNED_1) + L.flags_1 |= (P.flags_1 & ADMIN_SPAWNED_1) spawned_mobs += L L.nest = src L.faction = src.faction diff --git a/code/datums/components/spikes.dm b/code/datums/components/spikes.dm index 042b5b5019088..ca067ddac53d9 100644 --- a/code/datums/components/spikes.dm +++ b/code/datums/components/spikes.dm @@ -7,8 +7,8 @@ var/cooldown = 0 /datum/component/spikes/Initialize(damage = 0, spikearmor = 0, diseaseid = null) - spikedamage = damage - armor = spikearmor + spikedamage = damage + armor = spikearmor id = diseaseid RegisterSignal(parent, COMSIG_MOVABLE_BUMP, .proc/prick_collide) RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/prick_crossed) @@ -20,7 +20,7 @@ RegisterSignal(parent, COMSIG_COMPONENT_REMOVING, .proc/removearmor) RegisterSignal(parent, COMSIG_MOB_ATTACK_HAND, .proc/prick_touch) RegisterSignal(parent, COMSIG_MOB_HAND_ATTACKED, .proc/prick_touched) - + /datum/component/spikes/proc/prick(mob/living/carbon/C, damage_mod = 1) var/netdamage = spikedamage * damage_mod @@ -33,17 +33,25 @@ cooldown = (world.time + 8) //spike cooldown is equal to default unarmed attack speed /datum/component/spikes/proc/prick_touch(datum/source, mob/living/carbon/human/M, mob/living/carbon/human/H) + SIGNAL_HANDLER + prick(H, 0.5) /datum/component/spikes/proc/prick_touched(datum/source, mob/living/carbon/human/H, mob/living/carbon/human/M) + SIGNAL_HANDLER + prick(M, 1.5) /datum/component/spikes/proc/prick_collide(datum/source, atom/A) + SIGNAL_HANDLER + if(iscarbon(A)) var/mob/living/carbon/C = A prick(C) /datum/component/spikes/proc/prick_crossed(datum/source, atom/movable/M) + SIGNAL_HANDLER + var/atom/movable/P = parent if(iscarbon(M)) var/mob/living/carbon/C = M @@ -60,6 +68,8 @@ prick(C) /datum/component/spikes/proc/setarmor(datum/source, datum/species/S) //this is a proc used to make sure a change in species won't fuck up the armor bonus. + SIGNAL_HANDLER + if(ishuman(parent)) var/mob/living/carbon/human/H = parent finalarmor = armor @@ -68,13 +78,16 @@ H.dna.species.armor += finalarmor /datum/component/spikes/proc/checkdiseasecure(datum/source, var/diseaseid) + SIGNAL_HANDLER + if(diseaseid == id) qdel(src) //we were cured! time to go. /datum/component/spikes/proc/removearmor(datum/source, var/datum/component/C) + SIGNAL_HANDLER + if(C != src) return if(ishuman(parent) && armor) var/mob/living/carbon/human/H = parent H.dna.species.armor -= finalarmor - \ No newline at end of file diff --git a/code/datums/components/spill.dm b/code/datums/components/spill.dm index 1a9a526ec342d..343cdab3f081b 100644 --- a/code/datums/components/spill.dm +++ b/code/datums/components/spill.dm @@ -31,24 +31,30 @@ RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/drop_react) var/obj/item/master = parent preexisting_item_flags = master.item_flags - master.item_flags |= ITEM_SLOT_POCKET + master.item_flags |= ITEM_SLOT_POCKETS /datum/component/spill/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) var/obj/item/master = parent - if(!(preexisting_item_flags & ITEM_SLOT_POCKET)) - master.item_flags &= ~ITEM_SLOT_POCKET + if(!(preexisting_item_flags & ITEM_SLOT_POCKETS)) + master.item_flags &= ~ITEM_SLOT_POCKETS /datum/component/spill/proc/equip_react(obj/item/source, mob/equipper, slot) - if(slot == SLOT_L_STORE || slot == SLOT_R_STORE) + SIGNAL_HANDLER + + if(slot == ITEM_SLOT_LPOCKET || slot == ITEM_SLOT_RPOCKET) RegisterSignal(equipper, COMSIG_LIVING_STATUS_KNOCKDOWN, .proc/knockdown_react, TRUE) else UnregisterSignal(equipper, COMSIG_LIVING_STATUS_KNOCKDOWN) /datum/component/spill/proc/drop_react(obj/item/source, mob/dropper) + SIGNAL_HANDLER + UnregisterSignal(dropper, COMSIG_LIVING_STATUS_KNOCKDOWN) /datum/component/spill/proc/knockdown_react(mob/living/fool) + SIGNAL_HANDLER + var/obj/item/master = parent fool.dropItemToGround(master) if(droptext) diff --git a/code/datums/components/spinny.dm b/code/datums/components/spinny.dm new file mode 100644 index 0000000000000..cdf5262ab31b8 --- /dev/null +++ b/code/datums/components/spinny.dm @@ -0,0 +1,33 @@ +/** + * spinny.dm + * + * It's a component that spins things a whole bunch, like [proc/dance_rotate] but without the sleeps +*/ +/datum/component/spinny + dupe_mode = COMPONENT_DUPE_UNIQUE + /// How many turns are left? + var/steps_left + /// Turns clockwise by default, or counterclockwise if the reverse argument is TRUE + var/turn_degrees = 90 + +/datum/component/spinny/Initialize(steps = 12, reverse = FALSE) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + steps_left = steps + turn_degrees = (reverse ? -90 : 90) + START_PROCESSING(SSfastprocess, src) + +/datum/component/spinny/Destroy(force, silent) + STOP_PROCESSING(SSfastprocess, src) + return ..() + +/datum/component/spinny/process(delta_time) + steps_left-- + var/atom/spinny_boy = parent + if(!istype(spinny_boy) || steps_left <= 0) + qdel(src) + return + + // 25% chance to make 2 turns instead of 1 since the old dance_rotate wasn't strictly clockwise/counterclockwise + spinny_boy.setDir(turn(spinny_boy.dir, turn_degrees * (prob(25) ? 2 : 1))) diff --git a/code/datums/components/spooky.dm b/code/datums/components/spooky.dm index 94620429aa026..dd5a305aa898d 100644 --- a/code/datums/components/spooky.dm +++ b/code/datums/components/spooky.dm @@ -5,6 +5,8 @@ RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/spectral_attack) /datum/component/spooky/proc/spectral_attack(datum/source, mob/living/carbon/C, mob/user) + SIGNAL_HANDLER + if(ishuman(user)) //this weapon wasn't meant for mortals. var/mob/living/carbon/human/U = user if(!istype(U.dna.species, /datum/species/skeleton)) @@ -13,7 +15,7 @@ U.stuttering = 20 if(U.getStaminaLoss() > 95) to_chat(U, "Your ears weren't meant for this spectral sound.") - spectral_change(U) + INVOKE_ASYNC(src, .proc/spectral_change, U) return if(ishuman(C)) @@ -28,7 +30,7 @@ if((!istype(H.dna.species, /datum/species/skeleton)) && (!istype(H.dna.species, /datum/species/golem)) && (!istype(H.dna.species, /datum/species/android)) && (!istype(H.dna.species, /datum/species/jelly))) C.adjustStaminaLoss(25) //boneless humanoids don't lose the will to live to_chat(C, "DOOT") - spectral_change(H) + INVOKE_ASYNC(src, .proc/spectral_change, H) else //the sound will spook monkeys. C.Jitter(15) diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index fed8ab28408af..e50a931e45ab9 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -41,6 +41,8 @@ use_delay = use_delay_override /datum/component/squeak/proc/play_squeak() + SIGNAL_HANDLER + if(prob(squeak_chance)) if(!override_squeak_sounds) playsound(parent, pickweight(default_squeak_sounds), volume, 1, -1) @@ -48,6 +50,8 @@ playsound(parent, pickweight(override_squeak_sounds), volume, 1, -1) /datum/component/squeak/proc/step_squeak() + SIGNAL_HANDLER + if(steps > step_delay) play_squeak() steps = 0 @@ -55,6 +59,8 @@ steps++ /datum/component/squeak/proc/play_squeak_crossed(datum/source, atom/movable/AM) + SIGNAL_HANDLER + if(isitem(AM)) var/obj/item/I = AM if(I.item_flags & ABSTRACT) @@ -66,26 +72,36 @@ if(istype(AM, /obj/effect/dummy/phased_mob)) //don't squeek if they're in a phased/jaunting container. return var/atom/current_parent = parent - if(isturf(current_parent.loc)) + if(isturf(current_parent?.loc)) play_squeak() /datum/component/squeak/proc/use_squeak() + SIGNAL_HANDLER + if(last_use + use_delay < world.time) last_use = world.time play_squeak() /datum/component/squeak/proc/on_equip(datum/source, mob/equipper, slot) + SIGNAL_HANDLER + RegisterSignal(equipper, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react, TRUE) /datum/component/squeak/proc/on_drop(datum/source, mob/user) + SIGNAL_HANDLER + UnregisterSignal(user, COMSIG_MOVABLE_DISPOSING) // Disposal pipes related shit /datum/component/squeak/proc/disposing_react(datum/source, obj/structure/disposalholder/holder, obj/machinery/disposal/source) + SIGNAL_HANDLER + //We don't need to worry about unregistering this signal as it will happen for us automaticaly when the holder is qdeleted RegisterSignal(holder, COMSIG_ATOM_DIR_CHANGE, .proc/holder_dir_change) /datum/component/squeak/proc/holder_dir_change(datum/source, old_dir, new_dir) + SIGNAL_HANDLER + //If the dir changes it means we're going through a bend in the pipes, let's pretend we bumped the wall if(old_dir != new_dir) play_squeak() diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm index 51d67e10e2088..c4c0359feb44f 100644 --- a/code/datums/components/stationloving.dm +++ b/code/datums/components/stationloving.dm @@ -16,15 +16,17 @@ src.allow_death = allow_death check_in_bounds() // Just in case something is being created outside of station/centcom -/datum/component/stationloving/InheritComponent(datum/component/stationloving/newc, original, list/arguments) - if (original) - if (istype(newc)) +/datum/component/stationloving/InheritComponent(datum/component/stationloving/newc, original, _inform_admins, allow_death) + if(original) + if(newc) inform_admins = newc.inform_admins allow_death = newc.allow_death - else if (LAZYLEN(arguments)) - inform_admins = arguments[1] + else + inform_admins = _inform_admins /datum/component/stationloving/proc/relocate() + SIGNAL_HANDLER + var/targetturf = find_safe_turf() if(!targetturf) if(GLOB.blobstart.len > 0) @@ -39,6 +41,8 @@ return targetturf /datum/component/stationloving/proc/check_in_bounds() + SIGNAL_HANDLER + if(in_bounds()) return else @@ -49,31 +53,36 @@ message_admins("[parent] has been moved out of bounds in [ADMIN_VERBOSEJMP(currentturf)]. Moving it to [ADMIN_VERBOSEJMP(targetturf)].") /datum/component/stationloving/proc/check_soul_imbue() + SIGNAL_HANDLER + return disallow_soul_imbue /datum/component/stationloving/proc/check_mark_retrieval() + SIGNAL_HANDLER + return COMPONENT_BLOCK_MARK_RETRIEVAL /datum/component/stationloving/proc/in_bounds() var/static/list/allowed_shuttles = typecacheof(list(/area/shuttle/syndicate, /area/shuttle/escape, /area/shuttle/pod_1, /area/shuttle/pod_2, /area/shuttle/pod_3, /area/shuttle/pod_4)) var/static/list/disallowed_centcom_areas = typecacheof(list(/area/abductor_ship, /area/awaymission/errorroom)) var/turf/T = get_turf(parent) - if (!T) + if(!T) return FALSE var/area/A = T.loc - if (is_station_level(T.z)) + if(is_station_level(T.z)) return TRUE - if (is_centcom_level(T.z)) + if(is_centcom_level(T.z)) if (is_type_in_typecache(A, disallowed_centcom_areas)) return FALSE return TRUE - if (is_reserved_level(T.z)) + if(is_reserved_level(T.z)) if (is_type_in_typecache(A, allowed_shuttles)) return TRUE return FALSE /datum/component/stationloving/proc/check_deletion(datum/source, force) // TRUE = interrupt deletion, FALSE = proceed with deletion + SIGNAL_HANDLER var/turf/T = get_turf(parent) diff --git a/code/datums/components/storage/concrete/_concrete.dm b/code/datums/components/storage/concrete/_concrete.dm index 3fe69103a59ce..41111451edc97 100644 --- a/code/datums/components/storage/concrete/_concrete.dm +++ b/code/datums/components/storage/concrete/_concrete.dm @@ -92,12 +92,16 @@ return FALSE /datum/component/storage/concrete/proc/on_contents_del(datum/source, atom/A) + SIGNAL_HANDLER + var/atom/real_location = parent if(A in real_location) usr = null remove_from_storage(A, null) /datum/component/storage/concrete/proc/on_deconstruct(datum/source, disassembled) + SIGNAL_HANDLER + if(drop_all_on_deconstruct) do_quick_empty() @@ -156,7 +160,7 @@ var/datum/component/storage/concrete/master = master() var/atom/parent = src.parent var/moved = FALSE - if(!istype(I)) + if(!istype(I) || I.anchored) return FALSE if(M) if(!M.temporarilyRemoveItemFromInventory(I)) diff --git a/code/datums/components/storage/concrete/bag_of_holding.dm b/code/datums/components/storage/concrete/bag_of_holding.dm index 4920811551bb0..80c9e469408e5 100644 --- a/code/datums/components/storage/concrete/bag_of_holding.dm +++ b/code/datums/components/storage/concrete/bag_of_holding.dm @@ -5,23 +5,28 @@ var/list/obj/item/storage/backpack/holding/matching = typecache_filter_list(W.GetAllContents(), typecacheof(/obj/item/storage/backpack/holding)) matching -= A if(istype(W, /obj/item/storage/backpack/holding) || matching.len) - var/safety = alert(user, "Doing this will have extremely dire consequences for the station and its crew. Be sure you know what you're doing.", "Put in [A.name]?", "Abort", "Proceed") - if(safety != "Proceed" || QDELETED(A) || QDELETED(W) || QDELETED(user) || !user.canUseTopic(A, BE_CLOSE, iscarbon(user)) || !(W in user.contents)) // need to be holding the bag you're "inserting" - return - var/turf/loccheck = get_turf(A) - if(is_reebe(loccheck.z)) - user.visible_message("An unseen force knocks [user] to the ground!", "\"I think not!\"") - user.Paralyze(60) - return - to_chat(user, "The Bluespace interfaces of the two devices catastrophically malfunction!") - qdel(W) - playsound(loccheck,'sound/effects/supermatter.ogg', 200, 1) - - message_admins("[ADMIN_LOOKUPFLW(user)] detonated a bag of holding at [ADMIN_VERBOSEJMP(loccheck)].") - log_game("[key_name(user)] detonated a bag of holding at [loc_name(loccheck)].") - - user.gib(TRUE, TRUE, TRUE) - new/obj/singularity/boh_tear(loccheck) - qdel(A) + INVOKE_ASYNC(src, .proc/recursive_insertion, W, user) return . = ..() + +/datum/component/storage/concrete/bluespace/bag_of_holding/proc/recursive_insertion(obj/item/W, mob/living/user) + var/atom/A = parent + var/safety = alert(user, "Doing this will have extremely dire consequences for the station and its crew. Be sure you know what you're doing.", "Put in [A.name]?", "Abort", "Proceed") + if(safety != "Proceed" || QDELETED(A) || QDELETED(W) || QDELETED(user) || !user.canUseTopic(A, BE_CLOSE, iscarbon(user)) || !(W in user.contents)) // need to be holding the bag you're "inserting" + return + var/turf/loccheck = get_turf(A) + if(is_reebe(loccheck.z)) + user.visible_message("An unseen force knocks [user] to the ground!", "\"I think not!\"") + user.Paralyze(60) + return + to_chat(user, "The Bluespace interfaces of the two devices catastrophically malfunction!") + qdel(W) + playsound(loccheck,'sound/effects/supermatter.ogg', 200, 1) + + message_admins("[ADMIN_LOOKUPFLW(user)] detonated a bag of holding at [ADMIN_VERBOSEJMP(loccheck)].") + log_game("[key_name(user)] detonated a bag of holding at [loc_name(loccheck)].") + + user.gib(TRUE, TRUE, TRUE) + new/obj/singularity/boh_tear(loccheck) + qdel(A) + diff --git a/code/datums/components/storage/concrete/bluespace.dm b/code/datums/components/storage/concrete/bluespace.dm index 05a185322293b..71a95717ac551 100644 --- a/code/datums/components/storage/concrete/bluespace.dm +++ b/code/datums/components/storage/concrete/bluespace.dm @@ -9,7 +9,18 @@ var/atom/dumping_location = dest.get_dumping_location() var/turf/bagT = get_turf(parent) var/turf/destT = get_turf(dumping_location) - if(destT && bagT && bagT.z == destT.z && get_dist(M, dumping_location) < dumping_range) + var/valid = TRUE + if(!destT || !bagT || get_dist(M, dumping_location) >= dumping_range || bagT.get_virtual_z_level() != destT.get_virtual_z_level()) + valid = FALSE + //Check density LOS. + if(valid) + for(var/turf/T as() in getline(bagT, destT)) + if(T.density) + valid = FALSE + break + + //Check still valid + if(valid) if(dumping_location.storage_contents_dump_act(src, M)) if(alt_sound && prob(1)) playsound(src, alt_sound, 40, 1) @@ -20,4 +31,3 @@ to_chat(M, "The [A.name] buzzes.") playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) return FALSE - diff --git a/code/datums/components/storage/concrete/fish_case.dm b/code/datums/components/storage/concrete/fish_case.dm new file mode 100644 index 0000000000000..438974186e5fe --- /dev/null +++ b/code/datums/components/storage/concrete/fish_case.dm @@ -0,0 +1,8 @@ +/datum/component/storage/concrete/fish_case + max_items = 1 + can_hold_trait = TRAIT_FISH_CASE_COMPATIBILE + +/datum/component/storage/concrete/fish_case/can_be_inserted(obj/item/I, stop_messages, mob/M) + /// Activate deferred components if any. + SEND_SIGNAL(I, COMSIG_AQUARIUM_BEFORE_INSERT_CHECK) + . = ..() diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm index bba34c95d644a..384827b5939ab 100644 --- a/code/datums/components/storage/concrete/pockets.dm +++ b/code/datums/components/storage/concrete/pockets.dm @@ -98,11 +98,13 @@ /obj/item/gun/ballistic/revolver/detective, /obj/item/ammo_box/c38)) -/datum/component/storage/concrete/pockets/small/helmet - max_items = 1 +/datum/component/storage/concrete/pockets/helmet quickdraw = TRUE + max_combined_w_class = 6 -/datum/component/storage/concrete/pockets/small/helmet/Initialize() +/datum/component/storage/concrete/pockets/helmet/Initialize() . = ..() - can_hold = typecacheof(list(/obj/item/reagent_containers/glass/bottle, - /obj/item/ammo_box/a762)) + can_hold = typecacheof(list(/obj/item/reagent_containers/food/drinks/bottle/vodka, + /obj/item/reagent_containers/food/drinks/bottle/molotov, + /obj/item/reagent_containers/food/drinks/drinkingglass, + /obj/item/ammo_box/a762)) diff --git a/code/datums/components/storage/concrete/rped.dm b/code/datums/components/storage/concrete/rped.dm index 455eb985f0904..b05d7601aa681 100644 --- a/code/datums/components/storage/concrete/rped.dm +++ b/code/datums/components/storage/concrete/rped.dm @@ -12,7 +12,7 @@ . = ..() if(!I.get_part_rating()) if (!stop_messages) - to_chat(M, "[parent] only accepts machine parts!") + M.balloon_alert(M, "Only machine parts fit") return FALSE /datum/component/storage/concrete/bluespace/rped @@ -29,5 +29,5 @@ . = ..() if(!I.get_part_rating()) if (!stop_messages) - to_chat(M, "[parent] only accepts machine parts!") + M.balloon_alert(M, "Only machine parts fit") return FALSE diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index cf5128cda72fd..ce2654004f584 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -12,6 +12,9 @@ var/list/can_hold //if this is set, only things in this typecache will fit. var/list/cant_hold //if this is set, anything in this typecache will not be able to fit. + var/list/exception_hold //if set, these items will be the exception to the max size of object that can fit. + /// If set can only contain stuff with this single trait present. + var/list/can_hold_trait var/list/mob/is_using //lazy list of mobs looking at the contents of this storage. @@ -36,8 +39,8 @@ 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 + var/atom/movable/screen/storage/boxes //storage display object + var/atom/movable/screen/close/closer //close button object var/allow_big_nesting = FALSE //allow storage objects of the same or greater size. @@ -144,6 +147,8 @@ return master? master.real_location() : null /datum/component/storage/proc/canreach_react(datum/source, list/next) + SIGNAL_HANDLER + var/datum/component/storage/concrete/master = master() if(!master) return @@ -154,24 +159,32 @@ next += slave.parent /datum/component/storage/proc/on_move() + SIGNAL_HANDLER + var/atom/A = parent for(var/mob/living/L in can_see_contents()) if(!L.CanReach(A)) hide_from(L) /datum/component/storage/proc/attack_self(datum/source, mob/M) + SIGNAL_HANDLER + if(locked) - to_chat(M, "[parent] seems to be locked!") + var/atom/host = parent + host.balloon_alert(M, "It's locked") return FALSE if((M.get_active_held_item() == parent) && allow_quick_empty) - quick_empty(M) + INVOKE_ASYNC(src, .proc/quick_empty, M) /datum/component/storage/proc/preattack_intercept(datum/source, obj/O, mob/M, params) + SIGNAL_HANDLER + if(!isitem(O) || !click_gather || SEND_SIGNAL(O, COMSIG_CONTAINS_STORAGE)) return FALSE . = COMPONENT_NO_ATTACK if(locked) - to_chat(M, "[parent] seems to be locked!") + var/atom/host = parent + host.balloon_alert(M, "It's locked") return FALSE var/obj/item/I = O if(collection_mode == COLLECT_ONE) @@ -180,19 +193,25 @@ return if(!isturf(I.loc)) return - var/list/things = I.loc.contents.Copy() + INVOKE_ASYNC(src, .proc/async_preattack_intercept, I, M) + +///async functionality from preattack_intercept +/datum/component/storage/proc/async_preattack_intercept(obj/item/attack_item, mob/pre_attack_mob) + var/list/things = attack_item.loc.contents.Copy() if(collection_mode == COLLECT_SAME) - things = typecache_filter_list(things, typecacheof(I.type)) + for(var/A in things) + if(!istype(A, attack_item)) + things -= A var/len = length(things) if(!len) - to_chat(M, "You failed to pick up anything with [parent].") + to_chat(pre_attack_mob, "You failed to pick up anything with [parent]!") return - var/datum/progressbar/progress = new(M, len, I.loc) + var/datum/progressbar/progress = new(pre_attack_mob, len, attack_item.loc) var/list/rejections = list() - while(do_after(M, 10, TRUE, parent, FALSE, CALLBACK(src, .proc/handle_mass_pickup, things, I.loc, rejections, progress))) + while(do_after(pre_attack_mob, 1 SECONDS, parent, NONE, FALSE, CALLBACK(src, .proc/handle_mass_pickup, things, attack_item.loc, rejections, progress))) stoplag(1) qdel(progress) - to_chat(M, "You put everything you could [insert_preposition] [parent].") + to_chat(pre_attack_mob, "You put everything you could [insert_preposition] [parent].") /datum/component/storage/proc/handle_mass_item_insertion(list/things, datum/component/storage/src_object, mob/user, datum/progressbar/progress) var/atom/source_real_location = src_object.real_location() @@ -240,10 +259,12 @@ if(!M.canUseStorage() || !A.Adjacent(M) || M.incapacitated()) return if(locked) - to_chat(M, "[parent] seems to be locked!") + var/atom/host = parent + host.balloon_alert(M, "It's locked") return FALSE A.add_fingerprint(M) - to_chat(M, "You start dumping out [parent].") + var/atom/host = parent + host.balloon_alert(M, "You start dumping out the contents") var/turf/T = get_turf(A) var/list/things = contents() var/datum/progressbar/progress = new(M, length(things), T) @@ -280,6 +301,8 @@ return TRUE /datum/component/storage/proc/set_locked(datum/source, new_state) + SIGNAL_HANDLER + locked = new_state if(locked) close_all() @@ -321,7 +344,7 @@ 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.maptext = MAPTEXT("[(ND.number > 1)? "[ND.number]" : ""]") ND.sample_object.layer = ABOVE_HUD_LAYER ND.sample_object.plane = ABOVE_HUD_PLANE cx++ @@ -362,32 +385,43 @@ M.client.screen |= boxes M.client.screen |= closer M.client.screen |= real_location.contents - M.active_storage = src + M.set_active_storage(src) LAZYOR(is_using, M) + RegisterSignal(M, COMSIG_PARENT_QDELETING, .proc/mob_deleted) return TRUE +/datum/component/storage/proc/mob_deleted(datum/source) + SIGNAL_HANDLER + hide_from(source) + /datum/component/storage/proc/hide_from(mob/M) + if(M.active_storage == src) + M.set_active_storage(null) + LAZYREMOVE(is_using, M) + + UnregisterSignal(M, COMSIG_PARENT_QDELETING) 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) /datum/component/storage/proc/close_all() + SIGNAL_HANDLER + . = FALSE for(var/mob/M in can_see_contents()) close(M) . = TRUE //returns TRUE if any mobs actually got a close(M) call /datum/component/storage/proc/emp_act(datum/source, severity) + SIGNAL_HANDLER + if(emp_shielded) return var/datum/component/storage/concrete/master = master() @@ -422,6 +456,8 @@ return master._removal_reset(thing) /datum/component/storage/proc/_remove_and_refresh(datum/source, atom/movable/thing) + SIGNAL_HANDLER + _removal_reset(thing) refresh_mob_views() @@ -435,6 +471,8 @@ return master.remove_from_storage(AM, new_location) /datum/component/storage/proc/refresh_mob_views() + SIGNAL_HANDLER + var/list/seeing = can_see_contents() for(var/i in seeing) show_to(i) @@ -447,6 +485,7 @@ cansee |= M else LAZYREMOVE(is_using, M) + UnregisterSignal(M, COMSIG_PARENT_QDELETING) return cansee //Tries to dump content @@ -455,7 +494,8 @@ var/atom/dump_destination = dest_object.get_dumping_location() if(A.Adjacent(M) && dump_destination && M.Adjacent(dump_destination)) if(locked) - to_chat(M, "[parent] seems to be locked!") + var/atom/host = parent + host.balloon_alert(M, "It's locked") return FALSE if(dump_destination.storage_contents_dump_act(src, M)) playsound(A, "rustle", 50, 1, -5) @@ -464,6 +504,8 @@ //This proc is called when you want to place an item into the storage item. /datum/component/storage/proc/attackby(datum/source, obj/item/I, mob/M, params) + SIGNAL_HANDLER + if(istype(I, /obj/item/hand_labeler)) var/obj/item/hand_labeler/labeler = I if(labeler.mode) @@ -493,12 +535,16 @@ //Abuses the fact that lists are just references, or something like that. /datum/component/storage/proc/signal_return_inv(datum/source, list/interface, recursive = TRUE) + SIGNAL_HANDLER + if(!islist(interface)) return FALSE interface |= return_inv(recursive) return TRUE /datum/component/storage/proc/mousedrop_onto(datum/source, atom/over_object, mob/M) + SIGNAL_HANDLER + set waitfor = FALSE . = COMPONENT_NO_MOUSEDROP var/atom/A = parent @@ -517,14 +563,14 @@ // this must come before the screen objects only block, dunno why it wasn't before if(over_object == M) user_show_to_mob(M) - if(!istype(over_object, /obj/screen)) - dump_content_at(over_object, M) + if(!istype(over_object, /atom/movable/screen)) + INVOKE_ASYNC(src, .proc/dump_content_at, over_object, M) return if(A.loc != M) return playsound(A, "rustle", 50, 1, -5) - if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(A, H.held_index) return A.add_fingerprint(M) @@ -535,12 +581,15 @@ return FALSE A.add_fingerprint(M) if(locked && !force) - to_chat(M, "[parent] seems to be locked!") + var/atom/host = parent + host.balloon_alert(M, "It's locked") return FALSE if(force || M.CanReach(parent, view_only = TRUE)) show_to(M) /datum/component/storage/proc/mousedrop_receive(datum/source, atom/movable/O, mob/M) + SIGNAL_HANDLER + if(isitem(O)) var/obj/item/I = O if(iscarbon(M) || isdrone(M)) @@ -552,7 +601,7 @@ //This proc return 1 if the item can be picked up and 0 if it can't. //Set the stop_messages to stop it from printing messages /datum/component/storage/proc/can_be_inserted(obj/item/I, stop_messages = FALSE, mob/M) - if(!istype(I) || (I.item_flags & ABSTRACT)) + if(!istype(I) || I.anchored || (I.item_flags & ABSTRACT)) return FALSE //Not an item if(I == parent) return FALSE //no paradoxes for you @@ -565,42 +614,42 @@ if(locked) if(M && !stop_messages) host.add_fingerprint(M) - to_chat(M, "[host] seems to be locked!") + host.balloon_alert(M, "It's locked") return FALSE if(real_location.contents.len >= max_items) if(!stop_messages) - to_chat(M, "[host] is full, make some space!") + host.balloon_alert(M, "[host] is full") return FALSE //Storage item is full if(length(can_hold)) if(!is_type_in_typecache(I, can_hold)) if(!stop_messages) - to_chat(M, "[host] cannot hold [I]!") + host.balloon_alert(M, "It doesn't fit") return FALSE - if(is_type_in_typecache(I, cant_hold)) //Check for specific items which this container can't hold. + if(is_type_in_typecache(I, cant_hold) || HAS_TRAIT(I, TRAIT_NO_STORAGE_INSERT) || (can_hold_trait && !HAS_TRAIT(I, can_hold_trait))) //Items which this container can't hold. if(!stop_messages) - to_chat(M, "[host] cannot hold [I]!") + host.balloon_alert(M, "It doesn't fit") return FALSE if(I.w_class > max_w_class) if(!stop_messages) - to_chat(M, "[I] is too big for [host]!") + host.balloon_alert(M, "[I] is too big") 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!") + host.balloon_alert(M, "[host] is full") return FALSE if(isitem(host)) var/obj/item/IP = host var/datum/component/storage/STR_I = I.GetComponent(/datum/component/storage) if((I.w_class >= IP.w_class) && STR_I && !allow_big_nesting) if(!stop_messages) - to_chat(M, "[IP] cannot hold [I] as it's a storage item of the same size!") + host.balloon_alert(M, "It's too big") return FALSE //To prevent the stacking of same sized storage items. if(HAS_TRAIT(I, TRAIT_NODROP)) //SHOULD be handled in unEquip, but better safe than sorry. if(!stop_messages) - to_chat(M, "\the [I] is stuck to your hand, you can't put it in \the [host]!") + host.balloon_alert(M, "[I] is stuck to your hand") return FALSE var/datum/component/storage/concrete/master = master() if(!istype(master)) @@ -629,13 +678,13 @@ return if(rustle_sound) playsound(parent, "rustle", 50, 1, -5) - for(var/mob/viewing in viewers(user, null)) + for(var/mob/viewing as() in viewers(user)) 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... - viewing.show_message("[M] puts [I] [insert_preposition]to [parent].", 1) + 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].", 1) + viewing.show_message("[M] puts [I] [insert_preposition]to [parent].", MSG_VISUAL) /datum/component/storage/proc/update_icon() if(isobj(parent)) @@ -643,31 +692,45 @@ O.update_icon() /datum/component/storage/proc/signal_insertion_attempt(datum/source, obj/item/I, mob/M, silent = FALSE, force = FALSE) + SIGNAL_HANDLER + if((!force && !can_be_inserted(I, TRUE, M)) || (I == parent)) return FALSE return handle_item_insertion(I, silent, M) /datum/component/storage/proc/signal_can_insert(datum/source, obj/item/I, mob/M, silent = FALSE) + SIGNAL_HANDLER + return can_be_inserted(I, silent, M) /datum/component/storage/proc/show_to_ghost(datum/source, mob/dead/observer/M) + SIGNAL_HANDLER + return user_show_to_mob(M, TRUE) /datum/component/storage/proc/signal_show_attempt(datum/source, mob/showto, force = FALSE) + SIGNAL_HANDLER + return user_show_to_mob(showto, force) /datum/component/storage/proc/on_check() + SIGNAL_HANDLER + return TRUE /datum/component/storage/proc/check_locked() + SIGNAL_HANDLER + return locked -/datum/component/storage/proc/signal_take_type(datum/source, type, atom/destination, amount = INFINITY, check_adjacent = FALSE, force = FALSE, mob/user, list/inserted) +/datum/component/storage/proc/signal_take_type(datum/source, typecache, atom/destination, amount = INFINITY, check_adjacent = FALSE, force = FALSE, mob/user, list/inserted) + SIGNAL_HANDLER + if(!force) if(check_adjacent) if(!user || !user.CanReach(destination) || !user.CanReach(parent)) return FALSE - var/list/taking = typecache_filter_list(contents(), typecacheof(type)) + var/list/taking = typecache_filter_list(contents(), typecache) if(taking.len > amount) taking.len = amount if(inserted) //duplicated code for performance, don't bother checking retval/checking for list every item. @@ -684,15 +747,20 @@ return max(0, max_items - real_location.contents.len) /datum/component/storage/proc/signal_fill_type(datum/source, type, amount = 20, force = FALSE) + SIGNAL_HANDLER + var/atom/real_location = real_location() if(!force) amount = min(remaining_space_items(), amount) for(var/i in 1 to amount) handle_item_insertion(new type(real_location), TRUE) - CHECK_TICK + if(QDELETED(src)) + return TRUE return TRUE /datum/component/storage/proc/on_attack_hand(datum/source, mob/user) + SIGNAL_HANDLER + var/atom/A = parent if(!attack_hand_interact) return @@ -709,45 +777,57 @@ var/mob/living/carbon/human/H = user if(H.l_store == A && !H.get_active_held_item()) //Prevents opening if it's in a pocket. . = COMPONENT_NO_ATTACK_HAND - H.put_in_hands(A) + INVOKE_ASYNC(H, /mob.proc/put_in_hands, A) H.l_store = null return if(H.r_store == A && !H.get_active_held_item()) . = COMPONENT_NO_ATTACK_HAND - H.put_in_hands(A) + INVOKE_ASYNC(H, /mob.proc/put_in_hands, A) H.r_store = null return if(A.loc == user) . = COMPONENT_NO_ATTACK_HAND if(locked) - to_chat(user, "[parent] seems to be locked!") + var/atom/host = parent + host.balloon_alert(user, "It's locked") else show_to(user) /datum/component/storage/proc/signal_on_pickup(datum/source, mob/user) + SIGNAL_HANDLER + var/atom/A = parent update_actions() - for(var/mob/M in range(1, A)) + for(var/mob/M as() in hearers(1, A)) if(M.active_storage == src) close(M) /datum/component/storage/proc/signal_take_obj(datum/source, atom/movable/AM, new_loc, force = FALSE) + SIGNAL_HANDLER + if(!(AM in real_location())) return FALSE return remove_from_storage(AM, new_loc) /datum/component/storage/proc/signal_quick_empty(datum/source, atom/loctarget) + SIGNAL_HANDLER + return do_quick_empty(loctarget) /datum/component/storage/proc/signal_hide_attempt(datum/source, mob/target) + SIGNAL_HANDLER + return hide_from(target) /datum/component/storage/proc/on_alt_click(datum/source, mob/user) + SIGNAL_HANDLER + if(!isliving(user) || !user.CanReach(parent)) return if(locked) - to_chat(user, "[parent] seems to be locked!") + var/atom/host = parent + host.balloon_alert(user, "It's locked") return var/atom/A = parent @@ -757,19 +837,29 @@ playsound(A, "rustle", 50, 1, -5) return - if(!user.incapacitated()) - var/obj/item/I = locate() in real_location() - if(!I) - return - A.add_fingerprint(user) - remove_from_storage(I, get_turf(user)) - if(!user.put_in_hands(I)) - to_chat(user, "You fumble for [I] and it falls on the floor.") - return - user.visible_message("[user] draws [I] from [parent]!", "You draw [I] from [parent].") + if(user.incapacitated()) return + var/obj/item/to_remove = locate() in real_location() + if(!to_remove) + return + INVOKE_ASYNC(src, .proc/attempt_put_in_hands, to_remove, user) + +///attempt to put an item from contents into the users hands +/datum/component/storage/proc/attempt_put_in_hands(obj/item/to_remove, mob/user) + var/atom/parent_as_atom = parent + + parent_as_atom.add_fingerprint(user) + remove_from_storage(to_remove, get_turf(user)) + if(!user.put_in_hands(to_remove)) + to_chat(user, "You fumble for [to_remove] and it falls on the floor.") + return + user.visible_message("[user] draws [to_remove] from [parent]!", "You draw [to_remove] from [parent].") + return + /datum/component/storage/proc/action_trigger(datum/signal_source, datum/action/source) + SIGNAL_HANDLER + gather_mode_switch(source.owner) return COMPONENT_ACTION_BLOCK_TRIGGER @@ -777,8 +867,8 @@ collection_mode = (collection_mode+1)%3 switch(collection_mode) if(COLLECT_SAME) - to_chat(user, "[parent] now picks up all items of a single type at once.") + user.balloon_alert(user, "[parent] now picks up all items of single type") if(COLLECT_EVERYTHING) - to_chat(user, "[parent] now picks up all items in a tile at once.") + user.balloon_alert(user, "[parent] now picks up all items") if(COLLECT_ONE) - to_chat(user, "[parent] now picks up one item at a time.") + user.balloon_alert(user, "[parent] now picks up single item") diff --git a/code/datums/components/swarming.dm b/code/datums/components/swarming.dm index 3818126c0eb77..1e25172f956ca 100644 --- a/code/datums/components/swarming.dm +++ b/code/datums/components/swarming.dm @@ -12,6 +12,8 @@ RegisterSignal(parent, COMSIG_MOVABLE_UNCROSSED, .proc/leave_swarm) /datum/component/swarming/proc/join_swarm(datum/source, atom/movable/AM) + SIGNAL_HANDLER + var/datum/component/swarming/other_swarm = AM.GetComponent(/datum/component/swarming) if(!other_swarm) return @@ -21,6 +23,8 @@ other_swarm.swarm_members |= src /datum/component/swarming/proc/leave_swarm(datum/source, atom/movable/AM) + SIGNAL_HANDLER + var/datum/component/swarming/other_swarm = AM.GetComponent(/datum/component/swarming) if(!other_swarm || !(other_swarm in swarm_members)) return diff --git a/code/datums/components/team_monitor.dm b/code/datums/components/team_monitor.dm new file mode 100644 index 0000000000000..d4213a83eb948 --- /dev/null +++ b/code/datums/components/team_monitor.dm @@ -0,0 +1,564 @@ +#define ALT_APPEARENCE_ID "team_monitor" + +//================== +// Helpers +//================== + +//A list that tracks everything that should be tracked by team monitors +//Assoc list: +// Key = Frequency +// Value = Components +GLOBAL_LIST_EMPTY(tracker_huds) +GLOBAL_LIST_EMPTY(tracker_beacons) + +//Gets the first free team element, useful for creating new teams +//Special key is for what kind of team frequency it should be +//Everything that has a team monitor can be configured to change what frequency it tracks on +//The special key can be used to make keys like synd5 or synd83 to prevent centcom tracking syndies. +/proc/get_free_team_frequency(special_key = "") + var/sanity = 5 + //5 attempts to find a free team element, should never get that far + while(sanity > 0) + sanity -- + var/random_id = rand(1, 999) + var/key = "[random_id]" + if(!GLOB.tracker_beacons.Find("[special_key][key]")) + return key + //Return something anyways + var/random_id = rand(1, 999) + var/key = "[random_id]" + return key + +//Adds a new tracking hud +/proc/add_tracker_hud(frequency_added, datum/component/component_added) + if(!frequency_added) + return + if(islist(GLOB.tracker_huds[frequency_added])) + GLOB.tracker_huds[frequency_added] |= component_added + else + GLOB.tracker_huds[frequency_added] = list(component_added) + +//Adds a new tracking beacon +/proc/add_tracker_beacon(frequency_added, datum/component/component_added) + if(!frequency_added) + return + if(islist(GLOB.tracker_beacons[frequency_added])) + GLOB.tracker_beacons[frequency_added] |= component_added + else + GLOB.tracker_beacons[frequency_added] = list(component_added) + +/proc/get_all_beacons_on_frequency(frequency, base_frequency) + if(!frequency) + return list() + var/list/found_beacons = list() + if(islist(GLOB.tracker_beacons[frequency])) + found_beacons.Add(GLOB.tracker_beacons[frequency]) + if(islist(GLOB.tracker_beacons["[base_frequency]-GLOB"])) + found_beacons.Add(GLOB.tracker_beacons["[base_frequency]-GLOB"]) + return found_beacons + +/proc/get_all_watchers_on_frequency(frequency, team_key = "", global_freq = FALSE) + if(global_freq) + . = list() + for(var/tracker_freq in GLOB.tracker_huds) + for(var/datum/component/team_monitor/TM as() in GLOB.tracker_huds[tracker_freq]) + if(TM.team_freq_key == team_key) + . += TM + else + return GLOB.tracker_huds[frequency] + +//================== +// Component +// - HUD COMPONENT +// - HANDLES POINTING TOWARDS TRACKED BEACONS +//================== + +//The component that handles tracking atoms +/datum/component/team_monitor + //The frequency of the team signals we are trackings + var/team_freq_key = "debug" //Key <-- cannot be changed + var/team_frequency = "" //Final compiled: Consists of key then numbers between 1 and 999 + //The atoms we are actually tracking + // Key = Beacon component + // Value = image + var/list/tracking = list() + //Who are we updating for + var/mob/updating = null + //Distance from center + //Probably in pixels or something idk + var/distance = 20 + //Should we display the hud in the firstplace + var/hud_visible = TRUE + //The attached beacon: Ignore this one + var/datum/component/tracking_beacon/attached_beacon + +/datum/component/team_monitor/Initialize(frequency_key, frequency, _attached_beacon) + var/obj/item/clothing/item = parent + if(!istype(item)) + return COMPONENT_INCOMPATIBLE + + team_freq_key = frequency_key + if(frequency) + team_frequency = "[frequency_key][frequency]" + else + team_frequency = null + + attached_beacon = _attached_beacon + + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/parent_equipped) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/parent_dequpped) + + get_matching_beacons() + add_tracker_hud(team_frequency, src) + +/datum/component/team_monitor/Destroy(force, silent) + //Unregister signals + if(parent) + UnregisterSignal(parent, COMSIG_ITEM_EQUIPPED) + UnregisterSignal(parent, COMSIG_ITEM_DROPPED) + + if(team_frequency) + GLOB.tracker_huds[team_frequency] -= src + + //Stop processing + STOP_PROCESSING(SSprocessing, src) + + //Remove the HUD from the equipped mob + if(updating) + hide_hud(updating) + + //Dispose + if(attached_beacon) + if(attached_beacon.attached_monitor == src) + attached_beacon.attached_monitor = null + attached_beacon = null + + . = ..() + +//Gets the active trackers for when the team_monitor component +//is initialized while other trackers are already active. +/datum/component/team_monitor/proc/get_matching_beacons() + for(var/datum/component/tracking_beacon/beacon as() in get_all_beacons_on_frequency(team_frequency, team_freq_key)) + if(beacon != attached_beacon && (beacon.updating || beacon.always_update)) + add_to_tracking_network(beacon) + +//=========== +// Handles the parent being moved and updates the direction of the arrows. +//=========== + +/datum/component/team_monitor/process() + update_all_directions() + +//When the parent is removed, we need to update our arrows +//Also if we are visible update the arrows of anything tracking us +/datum/component/team_monitor/proc/parent_moved() + SIGNAL_HANDLER + + //Update our alt appearences + update_all_directions() + +//Updates the direction of the arrows for all atoms we are tracking +/datum/component/team_monitor/proc/update_all_directions() + if(!updating) + return + for(var/datum/component/tracking_beacon/beacon as() in tracking) + update_atom_dir(beacon) + +//Update the arrow towards another atom +/datum/component/team_monitor/proc/update_atom_dir(datum/component/tracking_beacon/beacon) + if(!updating || !updating.hud_used || !beacon) + return + var/atom/movable/screen/arrow/screen = tracking[beacon] + var/turf/target_turf = get_turf(beacon.parent) + var/turf/parent_turf = get_turf(parent) + if(target_turf.get_virtual_z_level() != parent_turf.get_virtual_z_level() || target_turf == parent_turf) + if(screen) + //Remove the screen + updating.hud_used.team_finder_arrows -= screen + qdel(screen) + tracking[beacon] = null + //Update their hud + updating.hud_used.show_hud(updating.hud_used.hud_version, updating) + return + if(!screen) + //Create the screen + screen = new + screen.alpha = 240 + screen.color = beacon.colour + screen.hud = updating.hud_used + updating.hud_used.team_finder_arrows += screen + tracking[beacon] = screen + //Update their hud + updating.hud_used.show_hud(updating.hud_used.hud_version, updating) + var/matrix/rotationMatrix = matrix() + rotationMatrix.Scale(1.5) + rotationMatrix.Translate(0, -distance) + rotationMatrix.Turn(Get_Angle(target_turf, parent_turf)) + animate(screen, transform = rotationMatrix, time = 2) + +//=========== +// Handles being equipped / dequipped +//=========== + +//The parent equipped an item with a team_monitor, check if its in the right slot and apply the hud +//Also needs to enable other trackers pointers towards us +/datum/component/team_monitor/proc/parent_equipped(datum/source, mob/equipper, slot) + SIGNAL_HANDLER + + var/obj/item/clothing/item = parent + if(!istype(item)) + return + if(item.slot_flags & slot) //Was equipped to a valid slot for this item? + show_hud(equipper) + else + hide_hud(equipper) + +//Disable our hud +//Disable the pointers to us +/datum/component/team_monitor/proc/parent_dequpped(datum/source, mob/user) + SIGNAL_HANDLER + + hide_hud(user) + +//=========== +// Handles hiding / showing the hud when equipped +//=========== + +/datum/component/team_monitor/proc/show_hud(mob/target) + updating = target + //Our hud is disabled + if(!hud_visible) + return + //Start processing to update in weird situations + START_PROCESSING(SSprocessing, src) + //Register parent signal + RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/parent_moved) + //Mob doesnt have a hud, dont add hud arrows + if(!target.hud_used) + return + for(var/datum/component/tracking_beacon/key in tracking) + var/atom/movable/screen/arrow/arrow = new + arrow.alpha = 240 + arrow.color = key.colour + arrow.hud = target.hud_used + target.hud_used.team_finder_arrows += arrow + tracking[key] = arrow + //Update their hud + target.hud_used.show_hud(target.hud_used.hud_version, target) + update_all_directions() + +/datum/component/team_monitor/proc/hide_hud(mob/target) + updating = null + //Stop processing + STOP_PROCESSING(SSprocessing, src) + //UnRegister parent signal + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + //Remove our arrows + for(var/key in tracking) + var/atom/movable/screen/arrow = tracking[key] + if(!arrow) + continue + if(target.hud_used) + target.hud_used.team_finder_arrows -= arrow + qdel(arrow) + tracking[key] = null + //Update their hud + if(target.hud_used) + target.hud_used.show_hud(target.hud_used.hud_version, target) + +//=========== +// Handles user interaction +// - Disabling hud transmission +// - Disabling hud view +// - Changing transmission frequency +//=========== + +/datum/component/team_monitor/proc/toggle_hud(new_hud_status, mob/user) + hud_visible = new_hud_status + if(hud_visible && !updating) + show_hud(user) + else if(!hud_visible) + hide_hud(user) + +/datum/component/team_monitor/proc/change_frequency(mob/user) + //Get new frequency + var/new_freq = input(user, "Enter a new frequency (1 - 999):", "Frequency Change", 1) as num|null + if(!new_freq) + to_chat(user, "Invalid frequency. Encrypted tracking HUD disabled.") + return + if(new_freq < 1 || new_freq > 999) + to_chat(user, "Frequency is out of range. Must be between 1 and 999.") + return + set_frequency(new_freq) + to_chat(user, "Tracking HUD now scanning on frequency [team_frequency].") + //Set frequency of the linked beacon + if(attached_beacon) + attached_beacon.set_frequency(new_freq) + +/datum/component/team_monitor/proc/set_frequency(new_frequency) + var/hud_on = hud_visible + var/mob/user = updating + //Remove tracking from old frequency + if(team_frequency) + if(updating) + toggle_hud(FALSE, updating) + //Remove from the global frequency + GLOB.tracker_huds[team_frequency] -= src + //Clear tracking + tracking.Cut() + team_frequency = "[team_freq_key][new_frequency]" + //Add tracking to new frequency + if(!team_frequency) + return + //Adds our tracking component to the global list of trackers + add_tracker_hud(team_frequency, src) + //Gets the other trackers on our frequency + get_matching_beacons() + //Show hud if needed + if(user) + toggle_hud(hud_on, user) + +//Adds a new atom to the tracking monitor, will create a hud element that tracks them +//TODO: Add the screen if already equipped +//Should be the only way atoms are added to the tracking list +/datum/component/team_monitor/proc/add_to_tracking_network(datum/component/tracking_beacon/beacon) + if(beacon != attached_beacon) + if(updating?.hud_used) + var/atom/movable/screen/arrow/arrow = new + arrow.alpha = 240 + arrow.color = beacon.colour + arrow.hud = updating.hud_used + updating.hud_used.team_finder_arrows += arrow + tracking[beacon] = arrow + //Update arrow direction + update_atom_dir(beacon) + //Update their hud + updating.hud_used.show_hud(updating.hud_used.hud_version, updating) + else + tracking[beacon] = null + +//================== +// Component +// - TRACKER COMPONENT +// - HANDLES UPDATING TRACKERS WHEN MOVED +//================== + +/datum/component/tracking_beacon + //The frequency of the team signals we are trackings + var/team_freq_key = "debug" //Key <-- cannot be changed + var/team_frequency = "" //Final compiled: Consists of key then numbers between 1 and 999 + //Are we visible to other trackers? + var/visible = TRUE + //Our colour + var/colour = "#FFFFFF" + //Who are we updating for + var/mob/updating = null + //Do we have an attached monitor? + var/datum/component/team_monitor/attached_monitor + //Should we update when not equipped? + var/always_update = FALSE + //Global signal? + var/global_signal = FALSE + +/datum/component/tracking_beacon/Initialize(_frequency_key, _frequency, _attached_monitor, _visible = TRUE, _colour = "#ffffff", _global = FALSE, _always_update = FALSE) + . = ..() + + //Set vars + colour = _colour + attached_monitor = _attached_monitor + always_update = _always_update + global_signal = _global + + //Set the frequency we are transmitting on + team_freq_key = _frequency_key + if(_global) + team_frequency = "[_frequency_key]-GLOB" + else if(_frequency) + team_frequency = "[_frequency_key][_frequency]" + else + team_frequency = null + + //Add ourselves to the tracking network + add_tracker_beacon(team_frequency, src) + + //Register tracking signal + if(always_update) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/update_position) + else + //Reigster equipping signals + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/parent_equipped) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/parent_dequpped) + + //Set our visibility on the tracking network + toggle_visibility(_visible) + +/datum/component/tracking_beacon/Destroy(force, silent) + //Unregister signals + if(parent) + //Register tracking signal + if(always_update) + UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) + else + UnregisterSignal(parent, COMSIG_ITEM_EQUIPPED) + UnregisterSignal(parent, COMSIG_ITEM_DROPPED) + + //Unregister movement signal + if(updating) + UnregisterSignal(updating, COMSIG_MOVABLE_MOVED) + + //Goodbye, it was a good life + remove_from_huds() + + //Remove from the global network + if(team_frequency) + GLOB.tracker_beacons[team_frequency] -= src + + if(attached_monitor?.attached_beacon == src) + attached_monitor.attached_beacon = null + attached_monitor = null + + . = ..() + +//=========== +// Equip/Dequip transmission handling +//=========== + +//The parent equipped an item with a team_monitor, check if its in the right slot and apply the hud +//Also needs to enable other trackers pointers towards us +/datum/component/tracking_beacon/proc/parent_equipped(datum/source, mob/equipper, slot) + SIGNAL_HANDLER + + var/obj/item/clothing/item = parent + if(!istype(item)) + return + if(item.slot_flags & slot) //Was equipped to a valid slot for this item? + updating = equipper + toggle_visibility(TRUE) + RegisterSignal(updating, COMSIG_MOVABLE_MOVED, .proc/update_position) + else + toggle_visibility(FALSE) + if(updating) + UnregisterSignal(updating, COMSIG_MOVABLE_MOVED) + updating = null + +//Disable our hud +//Disable the pointers to us +/datum/component/tracking_beacon/proc/parent_dequpped(datum/source, mob/user) + SIGNAL_HANDLER + + toggle_visibility(FALSE) + if(updating) + UnregisterSignal(updating, COMSIG_MOVABLE_MOVED) + updating = null + +//=========== +// Visibility Handling +//=========== + +//Toggle visibility +//If visibility is disabled we will hide ourselves from others +/datum/component/tracking_beacon/proc/toggle_visibility(new_vis) + visible = new_vis + //If we are updating toggle our visibility + if((updating || always_update) && visible) + add_to_huds() + else + remove_from_huds() + +//=========== +// Position Updating +//=========== + +/datum/component/tracking_beacon/proc/update_position() + SIGNAL_HANDLER + + //Update everyone tracking us + if(!visible) + return + if(!team_frequency) + return + for(var/datum/component/team_monitor/TM as() in get_all_watchers_on_frequency(team_frequency, team_freq_key, global_signal)) + if(TM != attached_monitor) + TM.update_atom_dir(src) + +//=========== +// Showing on huds +//=========== + +//Remove ourselves from other tracking components +/datum/component/tracking_beacon/proc/remove_from_huds() + if(!team_frequency) + return + for(var/datum/component/team_monitor/team_monitor as() in get_all_watchers_on_frequency(team_frequency, team_freq_key, global_signal)) + //Remove ourselves from the tracking list + var/atom/movable/screen/arrow = team_monitor.tracking[src] + team_monitor.tracking.Remove(src) + //Delete the arrow pointing to use + if(!arrow) + continue + if(team_monitor.updating?.hud_used) + team_monitor.updating.hud_used.team_finder_arrows -= arrow + //Update their hud + team_monitor.updating.hud_used.show_hud(team_monitor.updating.hud_used.hud_version, team_monitor.updating) + qdel(arrow) + +//Add ourselves to other tracking components +/datum/component/tracking_beacon/proc/add_to_huds() + //If we are invisibile, dont bother + if(!visible) + return + //Find other trackers and add ourselves to their tracking network + if(!team_frequency) + return + for(var/datum/component/team_monitor/team_monitor as() in get_all_watchers_on_frequency(team_frequency, team_freq_key, global_signal)) + if(team_monitor != attached_monitor) + team_monitor.add_to_tracking_network(src) + +//=========== +// Handles user interaction +// - Disabling hud transmission +// - Disabling hud view +// - Changing transmission frequency +//=========== + +/datum/component/tracking_beacon/proc/change_frequency(mob/user) + //Get new frequency + var/new_freq = input(user, "Enter a new frequency (1 - 999):", "Frequency Change", 1) as num|null + if(!new_freq) + to_chat(user, "Invalid frequency. Encrypted tracking beacon disabled.") + return + if(new_freq < 1 || new_freq > 999) + to_chat(user, "Frequency is out of range. Must be between 1 and 999.") + return + set_frequency(new_freq) + to_chat(user, "Tracking HUD now transmitting on frequency [team_frequency].") + //Set frequency of the linked tracker + if(attached_monitor) + attached_monitor.set_frequency(new_freq) + +/datum/component/tracking_beacon/proc/set_frequency(new_frequency) + //Remove tracking from old frequency + if(team_frequency) + //Disable the beacon on other trackers + toggle_visibility(FALSE) + //Remove from the global frequency + GLOB.tracker_beacons[team_frequency] -= src + team_frequency = "[team_freq_key][new_frequency]" + //Add tracking to new frequency + if(!team_frequency) + return + //Adds our tracking component to the global list of trackers + add_tracker_beacon(team_frequency, src) + //Set our visibility on the tracking network + toggle_visibility(visible) + +//======= +// Generic Arrow, No special effects +//======= + +/atom/movable/screen/arrow + icon = 'icons/mob/hud.dmi' + icon_state = "hud_arrow" + screen_loc = ui_team_finder + +#undef ALT_APPEARENCE_ID diff --git a/code/datums/components/tether.dm b/code/datums/components/tether.dm index faa6182208afc..a458db2f25717 100644 --- a/code/datums/components/tether.dm +++ b/code/datums/components/tether.dm @@ -17,6 +17,8 @@ RegisterSignal(parent, list(COMSIG_MOVABLE_PRE_MOVE), .proc/checkTether) /datum/component/tether/proc/checkTether(mob/mover, newloc) + SIGNAL_HANDLER + if (get_dist(mover,newloc) > max_dist) to_chat(mover, "The [tether_name] runs out of slack and prevents you from moving!") return COMPONENT_MOVABLE_BLOCK_PRE_MOVE diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index f3d95bfd4cb65..e0f7bcea1509f 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -52,13 +52,13 @@ master.cut_overlay(overlay) return ..() -/datum/component/thermite/InheritComponent(datum/component/thermite/newC, i_am_original, list/arguments) +/datum/component/thermite/InheritComponent(datum/component/thermite/newC, i_am_original, _amount) if(!i_am_original) return if(newC) amount += newC.amount else - amount += arguments[1] + amount += _amount /datum/component/thermite/proc/thermite_melt(mob/user) var/turf/master = parent @@ -80,13 +80,19 @@ qdel(src) /datum/component/thermite/proc/clean_react(datum/source, strength) + SIGNAL_HANDLER + //Thermite is just some loose powder, you could probably clean it with your hands. << todo? qdel(src) /datum/component/thermite/proc/flame_react(datum/source, exposed_temperature, exposed_volume) + SIGNAL_HANDLER + if(exposed_temperature > 1922) // This is roughly the real life requirement to ignite thermite thermite_melt() /datum/component/thermite/proc/attackby_react(datum/source, obj/item/thing, mob/user, params) + SIGNAL_HANDLER + if(thing.is_hot()) thermite_melt(user) diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm new file mode 100644 index 0000000000000..717c8d5b2abcc --- /dev/null +++ b/code/datums/components/twohanded.dm @@ -0,0 +1,392 @@ +/** + * Two Handed Component + * + * When applied to an item it will make it two handed + * + */ +/datum/component/two_handed + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS // Only one of the component can exist on an item + var/wielded = FALSE /// Are we holding the two handed item properly + var/force_multiplier = 0 /// The multiplier applied to force when wielded, does not work with force_wielded, and force_unwielded + var/force_wielded = 0 /// The force of the item when wielded + var/force_unwielded = 0 /// The force of the item when unwielded + var/block_power_wielded = 0 /// The block power of the item when wielded + var/block_power_unwielded = 0 /// The block power of the item when unwielded + var/wieldsound = FALSE /// Play sound when wielded + var/unwieldsound = FALSE /// Play sound when unwielded + var/attacksound = FALSE /// Play sound on attack when wielded + var/require_twohands = FALSE /// Does it have to be held in both hands + var/icon_wielded = FALSE /// The icon that will be used when wielded + var/obj/item/offhand/offhand_item = null /// Reference to the offhand created for the item + var/sharpened_increase = 0 /// The amount of increase recived from sharpening the item + var/unwield_on_swap /// Allow swapping, unwield on swap + var/auto_wield /// If true wielding will be performed when picked up + var/ignore_attack_self /// If true will not unwield when attacking self. + +/** + * Two Handed component + * + * vars: + * * require_twohands (optional) Does the item need both hands to be carried + * * wieldsound (optional) The sound to play when wielded + * * unwieldsound (optional) The sound to play when unwielded + * * attacksound (optional) The sound to play when wielded and attacking + * * force_multiplier (optional) The force multiplier when wielded, do not use with force_wielded, and force_unwielded + * * force_wielded (optional) The force setting when the item is wielded, do not use with force_multiplier + * * force_unwielded (optional) The force setting when the item is unwielded, do not use with force_multiplier + * * icon_wielded (optional) The icon to be used when wielded + * * unwield_on_swap (optional) Allow swapping, unwield on swap + * * auto_wield (optional) If true wielding will be performed when picked up + */ +/datum/component/two_handed/Initialize(require_twohands=FALSE, wieldsound=FALSE, unwieldsound=FALSE, attacksound=FALSE, \ + force_multiplier=0, force_wielded=0, force_unwielded=0, block_power_wielded=0, \ + block_power_unwielded=0, icon_wielded=FALSE, \ + unwield_on_swap = FALSE, auto_wield = FALSE, ignore_attack_self = FALSE) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + src.require_twohands = require_twohands + src.wieldsound = wieldsound + src.unwieldsound = unwieldsound + src.attacksound = attacksound + src.force_multiplier = force_multiplier + src.force_wielded = force_wielded + src.force_unwielded = force_unwielded + src.block_power_wielded = block_power_wielded + src.block_power_unwielded = block_power_unwielded + src.icon_wielded = icon_wielded + src.unwield_on_swap = unwield_on_swap + src.auto_wield = auto_wield + src.ignore_attack_self = ignore_attack_self + + if(require_twohands) + ADD_TRAIT(parent, TRAIT_NEEDS_TWO_HANDS, ABSTRACT_ITEM_TRAIT) + +// Inherit the new values passed to the component +#define ISWIELDED(O) (SEND_SIGNAL(O, COMSIG_ITEM_CHECK_WIELDED) & COMPONENT_IS_WIELDED) + +/datum/component/two_handed/InheritComponent(datum/component/two_handed/new_comp, original, require_twohands, wieldsound, unwieldsound, \ + force_multiplier, force_wielded, force_unwielded, block_power_wielded, block_power_unwielded, icon_wielded, \ + unwield_on_swap, auto_wield, ignore_attack_self) + if(!original) + return + if(require_twohands) + src.require_twohands = require_twohands + if(wieldsound) + src.wieldsound = wieldsound + if(unwieldsound) + src.unwieldsound = unwieldsound + if(attacksound) + src.attacksound = attacksound + if(force_multiplier) + src.force_multiplier = force_multiplier + if(force_wielded) + src.force_wielded = force_wielded + if(force_unwielded) + src.force_unwielded = force_unwielded + if(block_power_wielded) + src.block_power_wielded = block_power_wielded + if(block_power_unwielded) + src.block_power_unwielded = block_power_unwielded + if(icon_wielded) + src.icon_wielded = icon_wielded + if(unwield_on_swap) + src.unwield_on_swap = unwield_on_swap + if(auto_wield) + src.auto_wield = auto_wield + if(ignore_attack_self) + src.ignore_attack_self = ignore_attack_self + +// register signals withthe parent item +/datum/component/two_handed/RegisterWithParent() + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop) + RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/on_attack_self) + RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/on_attack) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON, .proc/on_update_icon) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/on_moved) + RegisterSignal(parent, COMSIG_ITEM_SHARPEN_ACT, .proc/on_sharpen) + RegisterSignal(parent, COMSIG_ITEM_CHECK_WIELDED, .proc/get_wielded) + +// Remove all siginals registered to the parent item +/datum/component/two_handed/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, + COMSIG_ITEM_DROPPED, + COMSIG_ITEM_ATTACK_SELF, + COMSIG_ITEM_ATTACK, + COMSIG_ATOM_UPDATE_ICON, + COMSIG_MOVABLE_MOVED, + COMSIG_ITEM_SHARPEN_ACT, + COMSIG_ITEM_CHECK_WIELDED,)) + +/// Triggered on equip of the item containing the component +/datum/component/two_handed/proc/on_equip(datum/source, mob/user, slot) + SIGNAL_HANDLER + + if(auto_wield) + if(slot == ITEM_SLOT_HANDS) + RegisterSignal(user, COMSIG_MOB_SWAP_HANDS, .proc/on_swap_hands) + else + UnregisterSignal(user, COMSIG_MOB_SWAP_HANDS) + if((auto_wield || require_twohands) && slot == ITEM_SLOT_HANDS) // force equip the item + wield(user) + if(!user.is_holding(parent) && wielded && !require_twohands) + unwield(user) + +/// Triggered on drop of item containing the component +/datum/component/two_handed/proc/on_drop(datum/source, mob/user) + SIGNAL_HANDLER + + if(auto_wield) + UnregisterSignal(user, COMSIG_MOB_SWAP_HANDS) + if(require_twohands) + unwield(user, show_message=TRUE) + if(wielded) + unwield(user) + if(source == offhand_item && !QDELETED(src)) + qdel(src) + +/// Triggered on attack self of the item containing the component +/datum/component/two_handed/proc/on_attack_self(datum/source, mob/user) + SIGNAL_HANDLER + + if(ignore_attack_self) + return + + if(wielded) + unwield(user) + else + wield(user) + +/** + * Wield the two handed item in both hands + * + * vars: + * * user The mob/living/carbon that is wielding the item + */ +/datum/component/two_handed/proc/wield(mob/living/carbon/user, swap_hands = FALSE) + if(wielded) + return + if(ismonkey(user)) + to_chat(user, "It's too heavy for you to wield fully.") + return + if(swap_hands ? user.get_active_held_item() : user.get_inactive_held_item()) + if(require_twohands) + to_chat(user, "[parent] is too cumbersome to carry in one hand!") + user.dropItemToGround(parent, force=TRUE) + else + to_chat(user, "You need your other hand to be empty!") + return + if(user.get_num_arms() < 2) + if(require_twohands) + user.dropItemToGround(parent, force=TRUE) + to_chat(user, "You don't have enough intact hands.") + return + + // wield update status + if(SEND_SIGNAL(parent, COMSIG_TWOHANDED_WIELD, user) & COMPONENT_TWOHANDED_BLOCK_WIELD) + return // blocked wield from item + wielded = TRUE + if(!auto_wield) + RegisterSignal(user, COMSIG_MOB_SWAP_HANDS, .proc/on_swap_hands) + + // update item stats and name + var/obj/item/parent_item = parent + if(force_multiplier) + parent_item.force *= force_multiplier + else if(force_wielded) + parent_item.force = force_wielded + if(block_power_wielded) + parent_item.block_power = block_power_wielded + if(sharpened_increase) + parent_item.force += sharpened_increase + parent_item.name = "[parent_item.name] (Wielded)" + parent_item.update_icon() + + if(iscyborg(user)) + to_chat(user, "You dedicate your module to [parent].") + else + to_chat(user, "You grab [parent] with both hands.") + + // Play sound if one is set + if(wieldsound) + playsound(parent_item.loc, wieldsound, 50, TRUE) + + // Let's reserve the other hand + offhand_item = new(user) + offhand_item.name = "[parent_item.name] - offhand" + offhand_item.desc = "Your second grip on [parent_item]." + offhand_item.wielded = TRUE + RegisterSignal(offhand_item, COMSIG_ITEM_DROPPED, .proc/on_drop) + if(swap_hands) + user.put_in_active_hand(offhand_item) + else + user.put_in_inactive_hand(offhand_item) + +/** + * Unwield the two handed item + * + * vars: + * * user The mob/living/carbon that is unwielding the item + * * show_message (option) show a message to chat on unwield + */ +/datum/component/two_handed/proc/unwield(mob/living/carbon/user, show_message=TRUE) + if(!wielded || !user) + return + + // wield update status + wielded = FALSE + if(!auto_wield) + UnregisterSignal(user, COMSIG_MOB_SWAP_HANDS) + SEND_SIGNAL(parent, COMSIG_TWOHANDED_UNWIELD, user) + + // update item stats + var/obj/item/parent_item = parent + if(sharpened_increase) + parent_item.force -= sharpened_increase + if(force_multiplier) + parent_item.force /= force_multiplier + else if(!isnull(force_unwielded)) + parent_item.force = force_unwielded + if(!isnull(block_power_unwielded)) + parent_item.block_power = block_power_unwielded + + // update the items name to remove the wielded status + var/sf = findtext(parent_item.name, " (Wielded)", -10) // 10 == length(" (Wielded)") + if(sf) + parent_item.name = copytext(parent_item.name, 1, sf) + else + parent_item.name = "[initial(parent_item.name)]" + + // Update icons + parent_item.update_icon() + if(user.get_item_by_slot(ITEM_SLOT_BACK) == parent) + user.update_inv_back() + else + user.update_inv_hands() + + // if the item requires two handed drop the item on unwield + if(require_twohands) + user.dropItemToGround(parent, force=TRUE) + + // Show message if requested + if(show_message) + if(iscyborg(user)) + to_chat(user, "You free up your module.") + else if(require_twohands) + to_chat(user, "You drop [parent].") + else + to_chat(user, "You are now carrying [parent] with one hand.") + + // Play sound if set + if(unwieldsound) + playsound(parent_item.loc, unwieldsound, 50, TRUE) + + // Remove the object in the offhand + if(offhand_item) + UnregisterSignal(offhand_item, COMSIG_ITEM_DROPPED) + qdel(offhand_item) + // Clear any old refrence to an item that should be gone now + offhand_item = null + +/** + * on_attack triggers on attack with the parent item + */ +/datum/component/two_handed/proc/on_attack(obj/item/source, mob/living/target, mob/living/user) + SIGNAL_HANDLER + + if(wielded && attacksound) + var/obj/item/parent_item = parent + playsound(parent_item.loc, attacksound, 50, TRUE) + +/** + * on_update_icon triggers on call to update parent items icon + * + * Updates the icon using icon_wielded if set + */ +/datum/component/two_handed/proc/on_update_icon(datum/source) + SIGNAL_HANDLER + + if(icon_wielded && wielded) + var/obj/item/parent_item = parent + if(parent_item) + parent_item.icon_state = icon_wielded + return COMSIG_ATOM_NO_UPDATE_ICON_STATE + +/** + * on_moved Triggers on item moved + */ +/datum/component/two_handed/proc/on_moved(datum/source, mob/user, dir) + SIGNAL_HANDLER + + unwield(user) + +/** + * on_swap_hands Triggers on swapping hands, blocks swap if the other hand is busy + */ +/datum/component/two_handed/proc/on_swap_hands(mob/user, obj/item/held_item) + SIGNAL_HANDLER + + if(!held_item) + //We are swapping to our two handed object. + if(auto_wield) + wield(user, TRUE) + return + if(held_item == parent) + if(unwield_on_swap) + unwield(user, FALSE) + else + return COMPONENT_BLOCK_SWAP + +/** + * on_sharpen Triggers on usage of a sharpening stone on the item + */ +/datum/component/two_handed/proc/on_sharpen(obj/item/item, amount, max_amount) + SIGNAL_HANDLER + + if(!item) + return COMPONENT_BLOCK_SHARPEN_BLOCKED + if(sharpened_increase) + return COMPONENT_BLOCK_SHARPEN_ALREADY + var/wielded_val = 0 + if(force_multiplier) + var/obj/item/parent_item = parent + if(wielded) + wielded_val = parent_item.force + else + wielded_val = parent_item.force * force_multiplier + else + wielded_val = force_wielded + if(wielded_val > max_amount) + return COMPONENT_BLOCK_SHARPEN_MAXED + sharpened_increase = min(amount, (max_amount - wielded_val)) + return COMPONENT_BLOCK_SHARPEN_APPLIED + +/datum/component/two_handed/proc/get_wielded(obj/item/source) + SIGNAL_HANDLER + + if(wielded) + return COMPONENT_IS_WIELDED + else + return 0 + +/** + * The offhand dummy item for two handed items + * + */ +/obj/item/offhand + name = "offhand" + icon_state = "offhand" + w_class = WEIGHT_CLASS_HUGE + item_flags = ABSTRACT + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + var/wielded = FALSE // Off Hand tracking of wielded status + +/obj/item/offhand/Destroy() + wielded = FALSE + return ..() + +/obj/item/offhand/equipped(mob/user, slot) + . = ..() + if(wielded && !user.is_holding(src) && !QDELETED(src)) + qdel(src) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 2688898e27044..dab99e3d0f1fd 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -94,6 +94,8 @@ uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted) /datum/component/uplink/proc/OnAttackBy(datum/source, obj/item/I, mob/user) + SIGNAL_HANDLER + if(!active) return //no hitting everyone/everything just to try to slot tcs in! if(istype(I, /obj/item/stack/telecrystal)) @@ -103,7 +105,16 @@ var/datum/uplink_item/UI = uplink_items[category][item] var/path = UI.refund_path || UI.item var/cost = UI.refund_amount || UI.cost - if(I.type == path && UI.refundable && I.check_uplink_validity()) + //Check that the uplink items path is right + //Check that the uplink item is refundable + //Check that the uplink is valid + //Check that the uplink has purchased this item (Sales can be refunded as the path relates to the old one) + var/hash = purchase_log.hash_purchase(UI, UI.cost) + var/datum/uplink_purchase_entry/UPE = purchase_log.purchase_log[hash] + if(I.type == path && UI.refundable && I.check_uplink_validity() && UPE?.amount_purchased > 0 && UPE.allow_refund) + UPE.amount_purchased -- + if(!UPE.amount_purchased) + purchase_log.purchase_log.Remove(hash) telecrystals += cost purchase_log.total_spent -= cost to_chat(user, "[I] refunded.") @@ -111,13 +122,15 @@ return /datum/component/uplink/proc/interact(datum/source, mob/user) + SIGNAL_HANDLER + if(locked) return if(!non_traitor_allowed && !user.mind.special_role) return active = TRUE if(user) - ui_interact(user) + INVOKE_ASYNC(src, .proc/ui_interact, user) // an unlocked uplink blocks also opening the PDA or headset menu return COMPONENT_NO_INTERACT @@ -227,25 +240,35 @@ // Implant signal responses /datum/component/uplink/proc/implant_activation() + SIGNAL_HANDLER + var/obj/item/implant/implant = parent locked = FALSE interact(null, implant.imp_in) /datum/component/uplink/proc/implanting(datum/source, list/arguments) + SIGNAL_HANDLER + var/mob/user = arguments[2] owner = "[user.key]" /datum/component/uplink/proc/old_implant(datum/source, list/arguments, obj/item/implant/new_implant) + SIGNAL_HANDLER + // It kinda has to be weird like this until implants are components return SEND_SIGNAL(new_implant, COMSIG_IMPLANT_EXISTING_UPLINK, src) /datum/component/uplink/proc/new_implant(datum/source, datum/component/uplink/uplink) + SIGNAL_HANDLER + uplink.telecrystals += telecrystals return COMPONENT_DELETE_NEW_IMPLANT // PDA signal responses /datum/component/uplink/proc/new_ringtone(datum/source, mob/living/user, new_ring_text) + SIGNAL_HANDLER + var/obj/item/pda/master = parent if(trim(lowertext(new_ring_text)) != trim(lowertext(unlock_code))) if(failsafe_code && trim(lowertext(new_ring_text)) == trim(lowertext(failsafe_code))) @@ -262,6 +285,8 @@ // Radio signal responses /datum/component/uplink/proc/new_frequency(datum/source, list/arguments) + SIGNAL_HANDLER + var/obj/item/radio/master = parent var/frequency = arguments[1] if(frequency != unlock_code) @@ -275,6 +300,8 @@ // Pen signal responses /datum/component/uplink/proc/pen_rotation(datum/source, degrees, mob/living/carbon/user) + SIGNAL_HANDLER + var/obj/item/pen/master = parent previous_attempts += degrees if(length(previous_attempts) > PEN_ROTATIONS) diff --git a/code/datums/components/waddling.dm b/code/datums/components/waddling.dm index 47ca60c8a19c6..f9a6b69eceffd 100644 --- a/code/datums/components/waddling.dm +++ b/code/datums/components/waddling.dm @@ -11,12 +11,16 @@ RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/Waddle) /datum/component/waddling/proc/LivingWaddle() + SIGNAL_HANDLER + var/mob/living/L = parent if(L.incapacitated() || !(L.mobility_flags & MOBILITY_STAND)) return Waddle() /datum/component/waddling/proc/Waddle() + SIGNAL_HANDLER + animate(parent, pixel_z = 4, time = 0) animate(pixel_z = 0, transform = turn(matrix(), pick(-12, 0, 12)), time=2) animate(pixel_z = 0, transform = matrix(), time = 0) diff --git a/code/datums/components/wearertargeting.dm b/code/datums/components/wearertargeting.dm index 4760757701fe7..cbfec78d11f2c 100644 --- a/code/datums/components/wearertargeting.dm +++ b/code/datums/components/wearertargeting.dm @@ -13,10 +13,14 @@ RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop) /datum/component/wearertargeting/proc/on_equip(datum/source, mob/equipper, slot) + SIGNAL_HANDLER + if((slot in valid_slots) && istype(equipper, mobtype)) RegisterSignal(equipper, signals, proctype, TRUE) else UnregisterSignal(equipper, signals) /datum/component/wearertargeting/proc/on_drop(datum/source, mob/user) + SIGNAL_HANDLER + UnregisterSignal(user, signals) diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index be7d8f1290f37..366598940148d 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -12,9 +12,9 @@ var/permanent = FALSE var/last_process = 0 -/datum/component/wet_floor/InheritComponent(datum/newcomp, orig, argslist) +/datum/component/wet_floor/InheritComponent(datum/newcomp, orig, strength, duration_minimum, duration_add, duration_maximum, _permanent) if(!newcomp) //We are getting passed the arguments of a would-be new component, but not a new component - add_wet(arglist(argslist)) + add_wet(arglist(args.Copy(3))) else //We are being passed in a full blown component 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. @@ -87,6 +87,9 @@ if(TURF_WET_PERMAFROST) intensity = 120 lube_flags = SLIDE_ICE | GALOSHES_DONT_HELP + if(TURF_WET_SUPERLUBE) + intensity = 120 + lube_flags = SLIDE | GALOSHES_DONT_HELP | SLIP_WHEN_CRAWLING else qdel(parent.GetComponent(/datum/component/slippery)) return @@ -94,6 +97,8 @@ parent.LoadComponent(/datum/component/slippery, intensity, lube_flags, CALLBACK(src, .proc/AfterSlip)) /datum/component/wet_floor/proc/dry(datum/source, strength = TURF_WET_WATER, immediate = FALSE, duration_decrease = INFINITY) + SIGNAL_HANDLER + for(var/i in time_left_list) if(text2num(i) <= strength) time_left_list[i] = max(0, time_left_list[i] - duration_decrease) @@ -134,6 +139,8 @@ highest_strength = max(highest_strength, text2num(i)) /datum/component/wet_floor/proc/is_wet() + SIGNAL_HANDLER + . = 0 for(var/i in time_left_list) . |= text2num(i) @@ -156,7 +163,7 @@ //NB it's possible we get deleted after this, due to inherit /datum/component/wet_floor/proc/add_wet(type, duration_minimum = 0, duration_add = 0, duration_maximum = MAXIMUM_WET_TIME, _permanent = FALSE) - var/static/list/allowed_types = list(TURF_WET_WATER, TURF_WET_LUBE, TURF_WET_ICE, TURF_WET_PERMAFROST) + var/static/list/allowed_types = list(TURF_WET_WATER, TURF_WET_LUBE, TURF_WET_ICE, TURF_WET_PERMAFROST, TURF_WET_SUPERLUBE) if(duration_minimum <= 0 || !type) return FALSE if(type in allowed_types) diff --git a/code/datums/dash_weapon.dm b/code/datums/dash_weapon.dm index b0a4f41765821..8c8639d1383b1 100644 --- a/code/datums/dash_weapon.dm +++ b/code/datums/dash_weapon.dm @@ -6,7 +6,6 @@ var/current_charges = 1 var/max_charges = 1 var/charge_rate = 250 - var/mob/living/carbon/human/holder var/obj/item/dashing_item var/dash_sound = 'sound/magic/blink.ogg' var/recharge_sound = 'sound/magic/charge.ogg' @@ -17,7 +16,10 @@ /datum/action/innate/dash/Grant(mob/user, obj/dasher) . = ..() dashing_item = dasher - holder = user + +/datum/action/innate/dash/Destroy() + dashing_item = null + return ..() /datum/action/innate/dash/IsAvailable() if(current_charges > 0) @@ -26,25 +28,27 @@ return FALSE /datum/action/innate/dash/Activate() - dashing_item.attack_self(holder) //Used to toggle dash behavior in the dashing item + dashing_item.attack_self(owner) //Used to toggle dash behavior in the dashing item /datum/action/innate/dash/proc/Teleport(mob/user, atom/target) if(!IsAvailable()) return var/turf/T = get_turf(target) - if(target in view(user.client.view, user)) + if(user in viewers(user.client.view, T)) var/obj/spot1 = new phaseout(get_turf(user), user.dir) - user.forceMove(T) - playsound(T, dash_sound, 25, 1) - var/obj/spot2 = new phasein(get_turf(user), user.dir) - spot1.Beam(spot2,beam_effect,time=20) - current_charges-- - holder.update_action_buttons_icon() - addtimer(CALLBACK(src, .proc/charge), charge_rate) + if(do_teleport(user, T, channel = TELEPORT_CHANNEL_FREE, no_effects = TRUE)) + playsound(T, dash_sound, 25, 1) + var/obj/spot2 = new phasein(get_turf(user), user.dir) + spot1.Beam(spot2,beam_effect,time=20) + current_charges-- + owner.update_action_buttons_icon() + addtimer(CALLBACK(src, .proc/charge), charge_rate) + else + to_chat(user, "You cannot dash here!") /datum/action/innate/dash/proc/charge() current_charges = CLAMP(current_charges + 1, 0, max_charges) - holder.update_action_buttons_icon() + owner.update_action_buttons_icon() if(recharge_sound) playsound(dashing_item, recharge_sound, 50, 1) - to_chat(holder, "[src] now has [current_charges]/[max_charges] charges.") + to_chat(owner, "[src] now has [current_charges]/[max_charges] charges.") diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 7445e6ffbf0cc..66a6b8b5f586a 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -1,4 +1,3 @@ - /datum/datacore var/medical[] = list() var/medicalPrintCount = 0 @@ -75,38 +74,56 @@ D.adjust_money(amount) return -/datum/datacore/proc/addMinorCrime(id = "", datum/data/crime/crime) +/** + * Adds crime to security record. + * + * Is used to add single crime to someone's security record. + * Arguments: + * * id - record id. + * * datum/data/crime/crime - premade array containing every variable, usually created by createCrimeEntry. + */ +/datum/datacore/proc/addCrime(id = "", datum/data/crime/crime) for(var/datum/data/record/R in security) if(R.fields["id"] == id) - var/list/crimes = R.fields["mi_crim"] + var/list/crimes = R.fields["crim"] crimes |= crime return -/datum/datacore/proc/removeMinorCrime(id, cDataId) +/** + * Deletes crime from security record. + * + * Is used to delete single crime to someone's security record. + * Arguments: + * * id - record id. + * * cDataId - id of already existing crime. + */ +/datum/datacore/proc/removeCrime(id, cDataId) for(var/datum/data/record/R in security) if(R.fields["id"] == id) - var/list/crimes = R.fields["mi_crim"] + var/list/crimes = R.fields["crim"] for(var/datum/data/crime/crime in crimes) if(crime.dataId == text2num(cDataId)) crimes -= crime return -/datum/datacore/proc/removeMajorCrime(id, cDataId) +/** + * Adds details to a crime. + * + * Is used to add or replace details to already existing crime. + * Arguments: + * * id - record id. + * * cDataId - id of already existing crime. + * * details - data you want to add. + */ +/datum/datacore/proc/addCrimeDetails(id, cDataId, details) for(var/datum/data/record/R in security) if(R.fields["id"] == id) - var/list/crimes = R.fields["ma_crim"] + var/list/crimes = R.fields["crim"] for(var/datum/data/crime/crime in crimes) if(crime.dataId == text2num(cDataId)) - crimes -= crime + crime.crimeDetails = details return -/datum/datacore/proc/addMajorCrime(id = "", datum/data/crime/crime) - for(var/datum/data/record/R in security) - if(R.fields["id"] == id) - var/list/crimes = R.fields["ma_crim"] - crimes |= crime - return - /datum/datacore/proc/manifest() for(var/i in GLOB.new_player_list) var/mob/dead/new_player/N = i @@ -130,7 +147,7 @@ "Medical" = GLOB.medical_positions, "Science" = GLOB.science_positions, "Supply" = GLOB.supply_positions, - "Civilian" = GLOB.civilian_positions, + "Civilian" = GLOB.civilian_positions | GLOB.gimmick_positions, "Silicon" = GLOB.nonhuman_positions ) for(var/datum/data/record/t in GLOB.data_core.general) @@ -147,7 +164,8 @@ "rank" = rank )) has_department = TRUE - break + if(department != "Command") //List heads in both command and their own department. + break if(!has_department) if(!manifest_out["Misc"]) manifest_out["Misc"] = list() @@ -155,7 +173,12 @@ "name" = name, "rank" = rank )) - return manifest_out + //Sort the list by 'departments' primarily so command is on top. + var/list/sorted_out = list() + for(var/department in (departments += "Misc")) + if(!isnull(manifest_out[department])) + sorted_out[department] = manifest_out[department] + return sorted_out /datum/datacore/proc/get_manifest_html(monochrome = FALSE) var/list/manifest = get_manifest() @@ -253,8 +276,7 @@ S.fields["name"] = H.real_name S.fields["criminal"] = "None" S.fields["citation"] = list() - S.fields["mi_crim"] = list() - S.fields["ma_crim"] = list() + S.fields["crim"] = list() S.fields["notes"] = "No notes." security += S diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 2ce49061abc2e..20cc783694c57 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -35,6 +35,15 @@ /// A weak reference to another datum var/datum/weakref/weak_reference + /* + * Lazy associative list of currently active cooldowns. + * + * cooldowns [ COOLDOWN_INDEX ] = add_timer() + * add_timer() returns the truthy value of -1 when not stoppable, and else a truthy numeric index + */ + var/list/cooldowns + + #ifdef TESTING var/running_find_references var/last_find_references = 0 @@ -44,6 +53,14 @@ var/list/cached_vars #endif +/** + * Topic signals + */ + +/datum/Topic(href, href_list[]) + ..() + SEND_SIGNAL(src, COMSIG_TOPIC, usr, href_list) + /** * Default implementation of clean-up code. * @@ -197,3 +214,33 @@ qdel(D) else return returned +/** + * Callback called by a timer to end an associative-list-indexed cooldown. + * + * Arguments: + * * source - datum storing the cooldown + * * index - string index storing the cooldown on the cooldowns associative list + * + * This sends a signal reporting the cooldown end. + */ +/proc/end_cooldown(datum/source, index) + if(QDELETED(source)) + return + SEND_SIGNAL(source, COMSIG_CD_STOP(index)) + TIMER_COOLDOWN_END(source, index) + + +/** + * Proc used by stoppable timers to end a cooldown before the time has ran out. + * + * Arguments: + * * source - datum storing the cooldown + * * index - string index storing the cooldown on the cooldowns associative list + * + * This sends a signal reporting the cooldown end, passing the time left as an argument. + */ +/proc/reset_cooldown(datum/source, index) + if(QDELETED(source)) + return + SEND_SIGNAL(source, COMSIG_CD_RESET(index), S_TIMER_COOLDOWN_TIMELEFT(source, index)) + TIMER_COOLDOWN_END(source, index) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 3bcd831b6c974..a91549ab4ce24 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -29,7 +29,11 @@ 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") + #ifdef REFERENCE_TRACKING + VV_DROPDOWN_OPTION(VV_HK_VIEW_REFERENCES, "View References") + #endif //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! @@ -37,10 +41,8 @@ /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. - /* This was ported from /TG/, modify traits isn't a thing here. Keeping in case it becomes a thing. if(href_list[VV_HK_MODIFY_TRAITS]) usr.client.holder.modify_traits(src) - */ return TRUE /datum/proc/vv_get_header() diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 00a8850dfb322..e164228994c00 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -79,8 +79,8 @@ if(isobj(H.wear_suit)) Cl = H.wear_suit passed = prob((Cl.permeability_coefficient*100) - 1) - if(passed && isobj(SLOT_W_UNIFORM)) - Cl = SLOT_W_UNIFORM + if(passed && isobj(ITEM_SLOT_ICLOTHING)) + Cl = ITEM_SLOT_ICLOTHING passed = prob((Cl.permeability_coefficient*100) - 1) if(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&HANDS) @@ -149,4 +149,4 @@ 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))) + return !((head && (head.flags_cover & HEADCOVERSMOUTH) && (head.get_armor_rating("bio", src) >= 25)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && (wear_mask.get_armor_rating("bio", src) >= 25))) diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index d8724491e6467..b85c3eaed100b 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -1,7 +1,7 @@ /datum/disease //Flags var/visibility_flags = 0 - var/disease_flags = CURABLE|CAN_CARRY|CAN_RESIST + var/disease_flags = CURABLE | CAN_CARRY | CAN_RESIST var/spread_flags = DISEASE_SPREAD_AIRBORNE | DISEASE_SPREAD_CONTACT_FLUIDS | DISEASE_SPREAD_CONTACT_SKIN //Fluff @@ -26,7 +26,7 @@ var/carrier = FALSE //If our host is only a carrier var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses var/permeability_mod = 1 - var/severity = DISEASE_SEVERITY_NONTHREAT + var/danger = DISEASE_NONTHREAT var/list/required_organs = list() var/needs_all_cures = TRUE var/list/strain_data = list() //dna_spread special bullshit @@ -65,6 +65,10 @@ /datum/disease/proc/stage_act() var/cure = has_cure() + var/mob/living/L = affected_mob + if(L.IsInStasis()) + return + if(carrier && !cure) return @@ -113,7 +117,7 @@ var/turf/T = affected_mob.loc if(istype(T)) - for(var/mob/living/carbon/C in oview(spread_range, affected_mob)) + for(var/mob/living/carbon/C in ohearers(spread_range, affected_mob)) var/turf/V = get_turf(C) if(disease_air_spread_walk(T, V)) C.AirborneContractDisease(src, force_spread) @@ -146,7 +150,7 @@ //note that stage is not copied over - the copy starts over at stage 1 var/static/list/copy_vars = list("name", "visibility_flags", "disease_flags", "spread_flags", "form", "desc", "agent", "spread_text", "cure_text", "max_stages", "stage_prob", "viable_mobtypes", "cures", "infectivity", "cure_chance", - "bypasses_immunity", "permeability_mod", "severity", "required_organs", "needs_all_cures", "strain_data", + "bypasses_immunity", "permeability_mod", "danger", "required_organs", "needs_all_cures", "strain_data", "infectable_biotypes", "process_dead") var/datum/disease/D = copy_type ? new copy_type() : new type() @@ -171,26 +175,26 @@ affected_mob = null //Use this to compare severities -/proc/get_disease_severity_value(severity) - switch(severity) - if(DISEASE_SEVERITY_BENEFICIAL) +/proc/get_disease_danger_value(danger) + switch(danger) + if(DISEASE_BENEFICIAL) return 1 - if(DISEASE_SEVERITY_POSITIVE) + if(DISEASE_POSITIVE) return 2 - if(DISEASE_SEVERITY_NONTHREAT) + if(DISEASE_NONTHREAT) return 3 - if(DISEASE_SEVERITY_MINOR) + if(DISEASE_MINOR) return 4 - if(DISEASE_SEVERITY_MEDIUM) + if(DISEASE_MEDIUM) return 5 - if(DISEASE_SEVERITY_HARMFUL) + if(DISEASE_HARMFUL) return 6 - if(DISEASE_SEVERITY_DANGEROUS) + if(DISEASE_DANGEROUS) return 7 - if(DISEASE_SEVERITY_BIOHAZARD) + if(DISEASE_BIOHAZARD) return 8 - if(DISEASE_SEVERITY_PANDEMIC) + if(DISEASE_PANDEMIC) return 9 /datum/disease/proc/speechModification(message) - return message \ No newline at end of file + return message diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 6e2ff6468dfeb..313e2dc333b62 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -25,8 +25,12 @@ spread_text = "Unknown" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey, /mob/living/carbon/monkey/tumor) - // NEW VARS - var/list/properties = list() + var/resistance + var/stealth + var/stage_rate + var/transmission + var/severity + var/speed var/list/symptoms = list() // The symptoms of the disease. var/id = "" var/processing = FALSE @@ -35,8 +39,8 @@ var/sentient = FALSE //used to classify if a disease is sentient var/faltered = FALSE //used if a disease has been made non-contagious // The order goes from easy to cure to hard to cure. - var/static/list/advance_cures = list( - /datum/reagent/water, /datum/reagent/consumable/ethanol, /datum/reagent/consumable/sodiumchloride, + var/static/list/advance_cures = list( + /datum/reagent/water, /datum/reagent/consumable/ethanol, /datum/reagent/consumable/sodiumchloride, /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salglu_solution, /datum/reagent/medicine/mine_salve, /datum/reagent/medicine/leporazine, /datum/reagent/concentrated_barbers_aid, /datum/reagent/toxin/lipolicide, /datum/reagent/medicine/haloperidol, /datum/reagent/drug/krokodil @@ -51,13 +55,15 @@ Refresh() /datum/disease/advance/Destroy() - SEND_SIGNAL(affected_mob, COMSIG_DISEASE_END, GetDiseaseID()) + if(affected_mob) + SEND_SIGNAL(affected_mob, COMSIG_DISEASE_END, GetDiseaseID()) + UnregisterSignal(affected_mob, COMSIG_MOB_DEATH) if(processing) for(var/datum/symptom/S in symptoms) S.End(src) return ..() -/datum/disease/advance/try_infect(var/mob/living/infectee, make_copy = TRUE) +/datum/disease/advance/try_infect(mob/living/infectee, make_copy = TRUE) //see if we are more transmittable than enough diseases to replace them //diseases replaced in this way do not confer immunity var/list/advance_diseases = list() @@ -75,13 +81,23 @@ sortTim(advance_diseases, /proc/cmp_advdisease_resistance_asc) for(var/i in 1 to replace_num) var/datum/disease/advance/competition = advance_diseases[i] - if(totalTransmittable() > competition.totalResistance()) + if(transmission > competition.resistance) competition.cure(FALSE) else return FALSE //we are not strong enough to bully our way in infect(infectee, make_copy) return TRUE +/datum/disease/advance/after_add() + if(affected_mob) + RegisterSignal(affected_mob, COMSIG_MOB_DEATH, .proc/on_mob_death) + +/datum/disease/advance/proc/on_mob_death() + SIGNAL_HANDLER + + for(var/datum/symptom/S as() in symptoms) + S.OnDeath(src) + // Randomly pick a symptom to activate. /datum/disease/advance/stage_act() ..() @@ -106,13 +122,12 @@ // Compares type then ID. /datum/disease/advance/IsSame(datum/disease/advance/D) - - if(!(istype(D, /datum/disease/advance))) - return 0 + if(!istype(D, /datum/disease/advance)) + return FALSE if(GetDiseaseID() != D.GetDiseaseID()) - return 0 - return 1 + return FALSE + return TRUE // Returns the advance disease with a different reference memory. /datum/disease/advance/Copy() @@ -120,7 +135,12 @@ QDEL_LIST(A.symptoms) for(var/datum/symptom/S in symptoms) A.symptoms += S.Copy() - A.properties = properties.Copy() + A.resistance = resistance + A.stealth = stealth + A.stage_rate = stage_rate + A.transmission = transmission + A.severity = severity + A.speed = speed A.id = id A.mutable = mutable A.faltered = faltered @@ -132,7 +152,7 @@ var/list/name_symptoms = list() for(var/datum/symptom/S in symptoms) name_symptoms += S.name - return "[name] sym:[english_list(name_symptoms)] r:[totalResistance()] s:[totalStealth()] ss:[totalStageSpeed()] t:[totalTransmittable()]" + return "[name] sym:[english_list(name_symptoms)] r:[resistance] s:[stealth] ss:[stage_rate] t:[transmission]" /* @@ -194,45 +214,40 @@ //Generate disease properties based on the effects. Returns an associated list. /datum/disease/advance/proc/GenerateProperties() - properties = list("resistance" = 0, "stealth" = 0, "stage_rate" = 0, "transmittable" = 0, "severity" = 0) - for(var/datum/symptom/S in symptoms) //I can't change the order of the symptom list by severity, so i have to loop through symptoms three times, one for each tier of severity, to keep it consistent - properties["resistance"] += S.resistance - properties["stealth"] += S.stealth - properties["stage_rate"] += S.stage_speed - properties["transmittable"] += S.transmittable - S.severityset(src) - if(!S.neutered && S.severity >= 5) //big severity goes first. This means it can be reduced by beneficials, but won't increase from minor symptoms - properties["severity"] += S.severity - for(var/datum/symptom/S in symptoms) + resistance = 0 + stealth = 0 + stage_rate = 0 + transmission = 0 + severity = 0 + //Why do we need 2 loops here? + //First loop just sets stats and second is purely just to set (and get) symptom severity + for(var/datum/symptom/S as() in symptoms) + resistance += S.resistance + stealth += S.stealth + stage_rate += S.stage_speed + transmission += S.transmission + + for(var/datum/symptom/S as() in symptoms) S.severityset(src) - if(!S.neutered) - switch(S.severity)//these go in the middle. They won't augment large severity diseases, but they can push low ones up to channel 2 - if(1 to 2) - properties["severity"] = max(properties["severity"], min(3, (S.severity + properties["severity"]))) - if(3 to 4) - properties["severity"] = max(properties["severity"], min(4, (S.severity + properties["severity"]))) - for(var/datum/symptom/S in symptoms) //benign and beneficial symptoms go last - S.severityset(src) - if(!S.neutered && S.severity <= 0) - properties["severity"] += S.severity + if(S.neutered) + continue + severity += S.severity // Assign the properties that are in the list. /datum/disease/advance/proc/AssignProperties() - if(properties && properties.len) - if(properties["stealth"] >= 2) - visibility_flags |= HIDDEN_SCANNER - else - visibility_flags &= ~HIDDEN_SCANNER + if(stealth >= 2) + visibility_flags |= HIDDEN_SCANNER + else + visibility_flags &= ~HIDDEN_SCANNER - SetSpread(CLAMP(2 ** (properties["transmittable"] - symptoms.len), DISEASE_SPREAD_BLOOD, DISEASE_SPREAD_AIRBORNE)) + SetSpread(CLAMP(2 ** (transmission - symptoms.len), DISEASE_SPREAD_BLOOD, DISEASE_SPREAD_AIRBORNE)) + + permeability_mod = max(CEILING(0.4 * transmission, 1), 1) + cure_chance = 15 - CLAMP(resistance, -5, 5) // can be between 10 and 20 + stage_prob = max(stage_rate, 2) + SetDanger(severity) + GenerateCure() - permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1) - 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) - else - CRASH("Our properties were empty or null!") // Assign the spread type and give it the correct description. @@ -261,31 +276,31 @@ spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_FLUIDS | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_AIRBORNE spread_text = "Airborne" -/datum/disease/advance/proc/SetSeverity(level_sev) +/datum/disease/advance/proc/SetDanger(level_sev) switch(level_sev) if(-INFINITY to -2) - severity = DISEASE_SEVERITY_BENEFICIAL + danger = DISEASE_BENEFICIAL if(-1) - severity = DISEASE_SEVERITY_POSITIVE + danger = DISEASE_POSITIVE if(0) - severity = DISEASE_SEVERITY_NONTHREAT + danger = DISEASE_NONTHREAT if(1) - severity = DISEASE_SEVERITY_MINOR + danger = DISEASE_MINOR if(2) - severity = DISEASE_SEVERITY_MEDIUM + danger = DISEASE_MEDIUM if(3) - severity = DISEASE_SEVERITY_HARMFUL + danger = DISEASE_HARMFUL if(4) - severity = DISEASE_SEVERITY_DANGEROUS + danger = DISEASE_DANGEROUS if(5) - severity = DISEASE_SEVERITY_BIOHAZARD + danger = DISEASE_BIOHAZARD if(6 to INFINITY) - severity = DISEASE_SEVERITY_PANDEMIC + danger = DISEASE_PANDEMIC else - severity = "Unknown" + danger = "Unknown" /datum/disease/advance/proc/CheckChannel() //i hate that i have to use this to make this work - switch(properties["severity"]) + switch(severity) if(-INFINITY to -2) return 1 if(-1) @@ -309,13 +324,12 @@ // 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) - cures = list(advance_cures[res]) + var/res = CLAMP(resistance - (symptoms.len / 2), 1, advance_cures.len) + cures = list(advance_cures[res]) - // Get the cure name from the cure_id - var/datum/reagent/D = GLOB.chemical_reagents_list[cures[1]] - cure_text = D.name + // Get the cure name from the cure_id + var/datum/reagent/D = GLOB.chemical_reagents_list[cures[1]] + cure_text = D.name // Randomly generate a symptom, has a chance to lose or gain a symptom. /datum/disease/advance/proc/Evolve(min_level, max_level, ignore_mutable = FALSE) @@ -405,7 +419,7 @@ */ // Mix a list of advance diseases and return the mixed result. -/proc/Advance_Mix(var/list/D_list) +/proc/Advance_Mix(list/D_list) var/list/diseases = list() for(var/datum/disease/advance/A in D_list) @@ -496,17 +510,97 @@ log_virus("[key_name(user)] has triggered a custom virus outbreak of [D.admin_details()]!") -/datum/disease/advance/proc/totalStageSpeed() - return properties["stage_rate"] - -/datum/disease/advance/proc/totalStealth() - return properties["stealth"] -/datum/disease/advance/proc/totalResistance() - return properties["resistance"] -/datum/disease/advance/proc/totalTransmittable() - return properties["transmittable"] - -/datum/disease/advance/proc/totalSeverity() - return properties["severity"] +/datum/disease/advance/proc/random_disease_name(var/atom/diseasesource)//generates a name for a disease depending on its symptoms and where it comes from + var/list/prefixes = list("Spacer's ", "Space ", "Infectious ","Viral ", "The ", "[pick(GLOB.first_names)]'s ", "[pick(GLOB.last_names)]'s ", "Acute ")//prefixes that arent tacked to the body need spaces after the word + var/list/bodies = list(pick("[pick(GLOB.first_names)]", "[pick(GLOB.last_names)]"), "Space", "Disease", "Noun", "Cold", "Germ", "Virus") + var/list/suffixes = list("ism", "itis", "osis", "itosis", " #[rand(1,10000)]", "-[rand(1,100)]", "s", "y", " ovirus", " Bug", " Infection", " Disease", " Complex", " Syndrome", " Sickness") //suffixes that arent tacked directly on need spaces before the word + if(stealth >=2) + prefixes += "Crypto " + switch(max(resistance - (symptoms.len / 2), 1)) + if(1) + suffixes += "-alpha" + if(2) + suffixes += "-beta" + if(3) + suffixes += "-gamma" + if(4) + suffixes += "-delta" + if(5) + suffixes += "-epsilon" + if(6) + suffixes += pick("-zeta", "-eta", "-theta", "-iota") + if(7) + suffixes += pick("-kappa", "-lambda") + if(8) + suffixes += pick("-mu", "-nu", "-xi", "-omicron") + if(9) + suffixes += pick("-pi", "-rho", "-sigma", "-tau") + if(10) + suffixes += pick("-upsilon", "-phi", "-chi", "-psi") + if(11 to INFINITY) + suffixes += "-omega" + prefixes += "Robust " + switch(transmission - symptoms.len) + if(-INFINITY to 2) + prefixes += "Bloodborne " + if(3) + prefixes += list("Mucous ", "Kissing ") + if(4) + prefixes += "Contact " + suffixes += " Flu" + if(5 to INFINITY) + prefixes += "Airborne " + suffixes += " Plague" + switch(severity) + if(-INFINITY to 0) + prefixes += "Altruistic " + if(1 to 2) + prefixes += "Benign " + if(3 to 4) + prefixes += "Malignant " + if(5) + prefixes += "Terminal " + bodies += "Death" + if(6 to INFINITY) + prefixes += "Deadly " + bodies += "Death" + if(diseasesource) + if(ishuman(diseasesource)) + var/mob/living/carbon/human/H = diseasesource + prefixes += pick("[H.first_name()]'s", "[H.name]'s", "[H.job]'s", "[H.dna.species]'s") + bodies += pick("[H.first_name()]", "[H.job]", "[H.dna.species]") + if(islizard(H) || iscatperson(H))//add rat-origin prefixes to races that eat rats + prefixes += list("Vermin ", "Zoo", "Maintenance ") + bodies += list("Rat", "Maint") + else switch(diseasesource.type) + if(/mob/living/simple_animal/pet/hamster/vector) + prefixes += list("Vector's ", "Hamster ") + bodies += list("Freebie") + if(/obj/effect/decal/cleanable) + prefixes += list("Bloody ", "Maintenance ") + bodies += list("Maint") + if(/mob/living/simple_animal/mouse) + prefixes += list("Vermin ", "Zoo", "Maintenance ") + bodies += list("Rat", "Maint") + if(/obj/item/reagent_containers/syringe) + prefixes += list("Junkie ", "Maintenance ") + bodies += list("Needle", "Maint") + if(/obj/item/fugu_gland) + prefixes += "Wumbo" + if(/obj/item/organ/lungs) + prefixes += "Miasmic " + bodies += list("Stench", "Lung") + for(var/datum/symptom/Symptom as() in symptoms) + if(!Symptom.neutered) + prefixes += Symptom.prefixes + bodies += Symptom.bodies + suffixes += Symptom.suffixes + switch(rand(1, 3)) + if(1) + return "[pick(prefixes)][pick(bodies)]" + if(2) + return "[pick(prefixes)][pick(bodies)][pick(suffixes)]" + if(3) + return "[pick(bodies)][pick(suffixes)]" \ No newline at end of file diff --git a/code/datums/diseases/advance/presets.dm b/code/datums/diseases/advance/presets.dm index 6e97ac9e73035..0b03a3861b44e 100644 --- a/code/datums/diseases/advance/presets.dm +++ b/code/datums/diseases/advance/presets.dm @@ -23,7 +23,7 @@ var/randomname = TRUE var/datum/symptom/setsymptom = null -/datum/disease/advance/random/New(max_symptoms, max_level = 9, var/datum/symptom/specialsymptom = setsymptom) +/datum/disease/advance/random/New(max_symptoms, max_level = 9, min_level = 1, var/datum/symptom/specialsymptom = setsymptom, var/atom/infected) if(!max_symptoms) max_symptoms = (2 + rand(1, (VIRUS_SYMPTOM_LIMIT-2))) if(specialsymptom) @@ -33,7 +33,7 @@ var/datum/symptom/S = symptom if(S == specialsymptom) continue - if(initial(S.level) > max_level) + if(initial(S.level) > max_level || initial(S.level) < min_level) continue if(initial(S.level) <= 0) //unobtainable symptoms continue @@ -49,7 +49,10 @@ Finalize() Refresh() if(randomname) - name = "Sample #[rand(1,10000)]" + var/randname = random_disease_name(infected) + AssignName(randname) + name = randname + /datum/disease/advance/random/macrophage name = "Unknown Disease" @@ -64,4 +67,4 @@ /datum/disease/advance/random/blob // had to do it this way due to an odd glitch name = "Blob Spores" setsymptom = /datum/symptom/blobspores - randomname = FALSE \ No newline at end of file + randomname = FALSE diff --git a/code/datums/diseases/advance/symptoms/beard.dm b/code/datums/diseases/advance/symptoms/beard.dm index 76ce20bbcffa6..359b8284875f4 100644 --- a/code/datums/diseases/advance/symptoms/beard.dm +++ b/code/datums/diseases/advance/symptoms/beard.dm @@ -21,11 +21,13 @@ BONUS stealth = 1 resistance = 3 stage_speed = 3 - transmittable = 1 + transmission = 1 level = 4 severity = 0 symptom_delay_min = 18 symptom_delay_max = 36 + prefixes = list("Facial ") + bodies = list("Beard") var/list/beard_order = list("Beard (Jensen)", "Beard (Full)", "Beard (Dwarf)", "Beard (Very Long)") diff --git a/code/datums/diseases/advance/symptoms/beesymptom.dm b/code/datums/diseases/advance/symptoms/beesymptom.dm index 028dcc56afc11..0714a5ef8bade 100644 --- a/code/datums/diseases/advance/symptoms/beesymptom.dm +++ b/code/datums/diseases/advance/symptoms/beesymptom.dm @@ -4,29 +4,31 @@ stealth = -2 resistance = 2 stage_speed = 1 - transmittable = 1 + transmission = 1 level = 0 severity = 2 symptom_delay_min = 5 symptom_delay_max = 20 var/honey = FALSE var/toxic_bees= FALSE + prefixes = list("Hive ") + bodies = list("Bees", "Hive") threshold_desc = "Resistance 12: The bees become symbiotic with the host, synthesizing honey and no longer stinging the stomach lining, and no longer attacking the host. Bees will also contain honey, unless transmission exceeds 10.
\ Transmission 10: Bees now contain a completely random toxin." /datum/symptom/beesease/severityset(datum/disease/advance/A) . = ..() - if(A.properties["resistance"] >= 12) - severity -= 4 - if(A.properties["transmittable"] >= 10) + if(A.transmission >= 10) severity += 2 + if(A.resistance >= 12) + severity -= 4 /datum/symptom/beesease/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["resistance"] >= 12) + if(A.resistance >= 12) honey = TRUE - if(A.properties["transmittable"] >= 10) + if(A.transmission >= 10) toxic_bees = TRUE /datum/symptom/beesease/Activate(datum/disease/advance/A) @@ -74,6 +76,8 @@ else if(honey) var/mob/living/simple_animal/hostile/poison/bees/newbee = new /mob/living/simple_animal/hostile/poison/bees(M.loc) //Heh, newbee newbee.assign_reagent(GLOB.chemical_reagents_list[/datum/reagent/consumable/honey]) + var/mob/living/simple_animal/hostile/poison/bees/newbee2 = new /mob/living/simple_animal/hostile/poison/bees(M.loc) + newbee2.assign_reagent(GLOB.chemical_reagents_list[/datum/reagent/medicine/insulin]) else new /mob/living/simple_animal/hostile/poison/bees(M.loc) diff --git a/code/datums/diseases/advance/symptoms/blobspores.dm b/code/datums/diseases/advance/symptoms/blobspores.dm index 4da930412411e..fa15f8a94ebf3 100644 --- a/code/datums/diseases/advance/symptoms/blobspores.dm +++ b/code/datums/diseases/advance/symptoms/blobspores.dm @@ -4,9 +4,11 @@ stealth = 1 resistance = 6 stage_speed = -2 - transmittable = 1 + transmission = 1 level = 9 severity = 3 + prefixes = list("Xeno", "Sporing ") + bodies = list("Blob") var/ready_to_pop var/factory_blob var/strong_blob @@ -17,19 +19,19 @@ /datum/symptom/blobspores/severityset(datum/disease/advance/A) . = ..() - if(A.properties["resistance"] >= 14) + if(A.resistance >= 14) severity += 1 /datum/symptom/blobspores/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["resistance"] >= 11) + if(A.resistance >= 11) factory_blob = TRUE - if(A.properties["resistance"] >= 8) + if(A.resistance >= 8) strong_blob = TRUE - if(A.properties["resistance"] >= 14) - node_blob = TRUE + if(A.resistance >= 14) + node_blob = TRUE /datum/symptom/blobspores/Activate(datum/disease/advance/A) if(!..()) @@ -60,10 +62,14 @@ /datum/symptom/blobspores/OnDeath(datum/disease/advance/A) + if(neutered) //Stops this symptom from making people scared even if this is useless + return FALSE var/mob/living/M = A.affected_mob M.visible_message("[M] starts swelling grotesquely!") - sleep(10 SECONDS) - if(!A && !M) + addtimer(CALLBACK(src, .proc/blob_the_mob, A, M), 10 SECONDS) + +/datum/symptom/blobspores/proc/blob_the_mob(datum/disease/advance/A, mob/living/M) + if(!A || !M) return var/list/blob_options = list(/obj/structure/blob/normal) if(factory_blob) @@ -79,9 +85,9 @@ for(var/datum/disease/D in B.disease)//don't let them farm diseases with this and monkeys B.disease -= D B.disease += A//instead, they contain the disease that was in this - if(prob(A.properties["resistance"])) + if(prob(A.resistance)) var/atom/blobbernaut = new /mob/living/simple_animal/hostile/blob/blobbernaut/(M.loc) blobbernaut.add_atom_colour(pick(BLOB_STRAIN_COLOR_LIST), FIXED_COLOUR_PRIORITY) var/atom/blob_tile = new pick_blob(M.loc) - blob_tile.add_atom_colour(pick(BLOB_STRAIN_COLOR_LIST), FIXED_COLOUR_PRIORITY) //A random colour for the blob, as this blob isnt going to get a overmind colour + blob_tile.add_atom_colour(pick(BLOB_STRAIN_COLOR_LIST), FIXED_COLOUR_PRIORITY) //A random colour for the blob, as this blob isn't going to get a overmind colour M.visible_message("A huge mass of blob and blob spores burst out of [M]!") diff --git a/code/datums/diseases/advance/symptoms/braindamage.dm b/code/datums/diseases/advance/symptoms/braindamage.dm index 82f15da1b2a9a..d21852382b78e 100644 --- a/code/datums/diseases/advance/symptoms/braindamage.dm +++ b/code/datums/diseases/advance/symptoms/braindamage.dm @@ -4,11 +4,14 @@ stealth = 1 resistance = -2 stage_speed = -3 - transmittable = -1 + transmission = -1 level = 8 severity = 3 symptom_delay_min = 15 symptom_delay_max = 60 + prefixes = list("Idiot's ") + bodies = list("Idiot") + suffixes = list(" Memory Loss") var/lethal = FALSE var/moretrauma = FALSE threshold_desc = "transmission 12: The disease's damage reaches lethal levels.
\ @@ -16,15 +19,15 @@ /datum/symptom/braindamage/severityset(datum/disease/advance/A) . = ..() - if(A.properties["transmittable"] >= 12) + if(A.transmission >= 12) severity += 1 /datum/symptom/braindamage/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["transmittable"] >= 12) + if(A.transmission >= 12) lethal = TRUE - if(A.properties["stage_rate"] >= 9) + if(A.stage_rate >= 9) moretrauma = TRUE /datum/symptom/braindamage/Activate(datum/disease/advance/A) @@ -53,5 +56,5 @@ /datum/symptom/braindamage/proc/givetrauma(datum/disease/advance/A, chance) if(prob(chance)) if(ishuman(A.affected_mob)) - var/mob/living/carbon/human/M = A.affected_mob + var/mob/living/carbon/human/M = A.affected_mob M?.gain_trauma(BRAIN_TRAUMA_MILD) diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index 61495b98f8d00..2fa821eb3e352 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -23,28 +23,29 @@ Bonus stealth = -2 resistance = -0 stage_speed = -1 - transmittable = -2 + transmission = -2 level = 9 severity = 5 base_message_chance = 15 symptom_delay_min = 14 symptom_delay_max = 30 + bodies = list("Lung") + suffixes = list(" Tuberculosis") var/paralysis = FALSE threshold_desc = "Stage Speed 8: Additionally synthesizes pancuronium and sodium thiopental inside the host.
\ Transmission 8: Doubles the damage caused by the symptom." /datum/symptom/asphyxiation/severityset(datum/disease/advance/A) . = ..() - if(A.properties["transmittable"] >= 8) + if(A.transmission >= 8) severity += 1 - return..() /datum/symptom/asphyxiation/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stage_rate"] >= 8) + if(A.stage_rate >= 8) paralysis = TRUE - if(A.properties["transmittable"] >= 8) + if(A.transmission >= 8) power = 2 /datum/symptom/asphyxiation/Activate(datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/clockwork.dm b/code/datums/diseases/advance/symptoms/clockwork.dm index 10e1f2a8dc28a..367c6b25f3b0a 100644 --- a/code/datums/diseases/advance/symptoms/clockwork.dm +++ b/code/datums/diseases/advance/symptoms/clockwork.dm @@ -4,38 +4,43 @@ stealth = 0 resistance = 1 stage_speed = 4 //while the reference material has low speed, this virus will take a good while to completely convert someone - transmittable = -1 + transmission = -1 level = 9 severity = 0 symptom_delay_min = 10 - symptom_delay_max = 60 + symptom_delay_max = 30 + prefixes = list("Ratvarian ", "Keter ", "Clockwork ", "Robo") + bodies = list("Robot") + suffixes = list("-217") var/replaceorgans = FALSE var/replacebody = FALSE var/robustbits = FALSE threshold_desc = "Stage Speed 4:The virus will replace the host's organic organs with mundane, biometallic versions. +1 severity.
\ - Stage Speed 10:The virus will eventually convert the host's entire body to biometallic materials, and maintain its cellular integrity. +1 severity.
\ - Stage Speed 13:Biometallic mass created by the virus will be superior to typical organic mass. -3 severity." + Resistance 4:The virus will eventually convert the host's entire body to biometallic materials, and maintain its cellular integrity. +1 severity.
\ + Stage Speed 12:Biometallic mass created by the virus will be superior to typical organic mass. -3 severity." /datum/symptom/robotic_adaptation/OnAdd(datum/disease/advance/A) A.infectable_biotypes |= MOB_ROBOTIC /datum/symptom/robotic_adaptation/severityset(datum/disease/advance/A) . = ..() - if(A.properties["stage_rate"] >= 5) //at base level, robotic organs are purely a liability + if(A.stage_rate >= 4) //at base level, robotic organs are purely a liability severity += 1 - if(A.properties["stage_rate"] >= 10)//at base level, robotic bodyparts have very few bonuses, mostly being a liability in the case of EMPS + if(A.stage_rate >= 12)//but at this threshold, it all becomes worthwhile, though getting augged is a better choice + severity -= 3//net benefits: 2 damage reduction, flight if you have wings, filter out low amounts of gas, durable ears, flash protection, a liver half as good as an upgraded cyberliver, and flight if you are a winged species + if(A.resistance >= 4)//at base level, robotic bodyparts have very few bonuses, mostly being a liability in the case of EMPS severity += 1 //at this stage, even one EMP will hurt, a lot. - if(A.properties["stage_rate"] >= 13)//but at this threshold, it all becomes worthwhile, though getting augged is a better choice - severity -= 3//net benefits: 2 damage reduction, flight if you have wings, filter out low amounts of gas, durable ears, flash protection, a liver half as good as an upgraded cyberliver, and flight if you are a winged species + /datum/symptom/robotic_adaptation/Start(datum/disease/advance/A) . = ..() - if(A.properties["stage_rate"] >= 4) + if(A.stage_rate >= 4) replaceorgans = TRUE - if(A.properties["stage_rate"] >= 10) - replacebody = TRUE - if(A.properties["stage_rate"] >= 14) - robustbits = TRUE //note that having this symptom means most healing symptoms won't work on you + if(A.stage_rate >= 4) + replacebody = TRUE + if(A.stage_rate >= 12) + robustbits = TRUE //note that having this symptom means most healing symptoms won't work on you + /datum/symptom/robotic_adaptation/Activate(datum/disease/advance/A) if(!..()) @@ -46,100 +51,111 @@ if(replaceorgans) to_chat(H, "[pick("You feel a grinding pain in your abdomen.", "You exhale a jet of steam.")]") if(5) - if(replaceorgans) + if(replaceorgans || replacebody) if(Replace(H)) return - else if(replacebody) - H.adjustCloneLoss(-30) //we're fully mechanical, repair integrity. This symptom has a soft synergy with overclocked pituitary, so we want that to be useable. OFI is obviously out - ADD_TRAIT(H, TRAIT_NANITECOMPATIBLE, DISEASE_TRAIT) + if(replacebody) + H.adjustCloneLoss(-20) //repair mechanical integrity + ADD_TRAIT(H, TRAIT_NANITECOMPATIBLE, DISEASE_TRAIT) return /datum/symptom/robotic_adaptation/proc/Replace(mob/living/carbon/human/H) - for(var/obj/item/organ/O in H.internal_organs) - if(O.status == ORGAN_ROBOTIC) //they are either part robotic or we already converted them! - continue - switch(O.slot) //i hate doing it this way, but the cleaner way runtimes and does not work - if(ORGAN_SLOT_BRAIN) - var/datum/mind/ownermind = H.mind - var/obj/item/organ/brain/clockwork/organ = new() - organ.Insert(H, TRUE, FALSE) - to_chat(H, "Your head throbs with pain for a moment, and then goes numb.") - H.emote("scream") - ownermind.transfer_to(H) - H.grab_ghost() - return TRUE - if(ORGAN_SLOT_STOMACH) - var/obj/item/organ/stomach/clockwork/organ = new() - organ.Insert(H, TRUE, FALSE) - if(prob(40)) - to_chat(H, "You feel a stabbing pain in your abdomen!") - H.emote("scream") - return TRUE - if(ORGAN_SLOT_EARS) - var/obj/item/organ/ears/robot/clockwork/organ = new() - if(robustbits) - organ.damage_multiplier = 0.5 - organ.Insert(H, TRUE, FALSE) - to_chat(H, "Your ears pop.") - return TRUE - if(ORGAN_SLOT_EYES) - var/obj/item/organ/eyes/robotic/clockwork/organ = new() - if(robustbits) - organ.flash_protect = 1 - organ.Insert(H, TRUE, FALSE) - if(prob(40)) - to_chat(H, "You feel a stabbing pain in your eyeballs!") + if(replaceorgans) + for(var/obj/item/organ/O in H.internal_organs) + if(O.status == ORGAN_ROBOTIC) //they are either part robotic or we already converted them! + continue + switch(O.slot) //i hate doing it this way, but the cleaner way runtimes and does not work + if(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/clockwork/organ = new() + var/datum/mind/ownermind = H.mind + if(robustbits) + organ.robust = TRUE //STOPS THAT GODDAMN CLANGING BECAUSE IT'S WELL OILED OR SOMETHING + organ.Insert(H, TRUE, FALSE) + ownermind.transfer_to(H) + to_chat(H, "Your head throbs with pain for a moment, and then goes numb.") H.emote("scream") - return TRUE - if(ORGAN_SLOT_LUNGS) - var/obj/item/organ/lungs/clockwork/organ = new() - if(robustbits) - organ.safe_toxins_max = 15 - organ.safe_co2_max = 15 - organ.SA_para_min = 15 - organ.SA_sleep_min = 15 - organ.BZ_trip_balls_min = 15 - organ.gas_stimulation_min = 15 - organ.Insert(H, TRUE, FALSE) - if(prob(40)) + H.grab_ghost() + return TRUE + if(ORGAN_SLOT_STOMACH) + if(HAS_TRAIT(H, TRAIT_POWERHUNGRY)) + var/obj/item/organ/stomach/battery/clockwork/organ = new() + if(robustbits) + organ.max_charge = 15000 + organ.Insert(H, TRUE, FALSE) + else + var/obj/item/organ/stomach/clockwork/organ = new() + organ.Insert(H, TRUE, FALSE) + if(prob(40)) + to_chat(H, "You feel a stabbing pain in your abdomen!") + H.emote("scream") + return TRUE + if(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/robot/clockwork/organ = new() + if(robustbits) + organ.damage_multiplier = 0.5 + organ.Insert(H, TRUE, FALSE) + to_chat(H, "Your ears pop.") + return TRUE + if(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/robotic/clockwork/organ = new() + if(robustbits) + organ.flash_protect = 1 + organ.Insert(H, TRUE, FALSE) + if(prob(40)) + to_chat(H, "You feel a stabbing pain in your eyeballs!") + H.emote("scream") + return TRUE + if(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/clockwork/organ = new() + if(robustbits) + organ.gas_max = list( + GAS_PLASMA = 15, + GAS_CO2 = 15, + ) + organ.SA_para_min = 15 + organ.SA_sleep_min = 15 + organ.BZ_trip_balls_min = 15 + organ.gas_stimulation_min = 15 + organ.Insert(H, TRUE, FALSE) + if(prob(40)) + to_chat(H, "You feel a stabbing pain in your chest!") + H.emote("scream") + return TRUE + if(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/clockwork/organ = new() + organ.Insert(H, TRUE, FALSE) to_chat(H, "You feel a stabbing pain in your chest!") H.emote("scream") - return TRUE - if(ORGAN_SLOT_HEART) - var/obj/item/organ/heart/clockwork/organ = new() - organ.Insert(H, TRUE, FALSE) - to_chat(H, "You feel a stabbing pain in your chest!") - H.emote("scream") - return TRUE - if(ORGAN_SLOT_LIVER) - var/obj/item/organ/liver/clockwork/organ = new() - if(robustbits) - organ.toxTolerance = 7 - organ.Insert(H, TRUE, FALSE) - if(prob(40)) - to_chat(H, "You feel a stabbing pain in your abdomen!") - H.emote("scream") - return TRUE - if(ORGAN_SLOT_TONGUE) - if(robustbits) - var/obj/item/organ/tongue/robot/clockwork/better/organ = new() + return TRUE + if(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/clockwork/organ = new() + if(robustbits) + organ.toxTolerance = 7 + organ.Insert(H, TRUE, FALSE) + if(prob(40)) + to_chat(H, "You feel a stabbing pain in your abdomen!") + H.emote("scream") + return TRUE + if(ORGAN_SLOT_TONGUE) + if(robustbits) + var/obj/item/organ/tongue/robot/clockwork/better/organ = new() + organ.Insert(H, TRUE, FALSE) + return TRUE + else + var/obj/item/organ/tongue/robot/clockwork/organ = new() + organ.Insert(H, TRUE, FALSE) + return TRUE + if(ORGAN_SLOT_TAIL) + var/obj/item/organ/tail/clockwork/organ = new() organ.Insert(H, TRUE, FALSE) return TRUE - else - var/obj/item/organ/tongue/robot/clockwork/organ = new() + if(ORGAN_SLOT_WINGS) + var/obj/item/organ/wings/cybernetic/clockwork/organ = new() + if(robustbits) + organ.flight_level = WINGS_FLYING organ.Insert(H, TRUE, FALSE) + to_chat(H, "Your wings feel stiff.") return TRUE - if(ORGAN_SLOT_TAIL) - var/obj/item/organ/tail/clockwork/organ = new() - organ.Insert(H, TRUE, FALSE) - return TRUE - if(ORGAN_SLOT_WINGS) - var/obj/item/organ/wings/cybernetic/clockwork/organ = new() - if(robustbits) - organ.flight_level = WINGS_FLYING - organ.Insert(H, TRUE, FALSE) - to_chat(H, "Your wings feel stiff.") - return TRUE if(replacebody) for(var/obj/item/bodypart/O in H.bodyparts) if(O.status == BODYPART_ROBOTIC) @@ -147,10 +163,10 @@ O.burn_reduction = max(2, O.burn_reduction) O.brute_reduction = max(3, O.brute_reduction) continue - switch(O.body_zone) + switch(O.body_zone) if(BODY_ZONE_HEAD) var/obj/item/bodypart/head/robot/clockwork/B = new() - if(robustbits) + if(robustbits) B.brute_reduction = 3 //this is just below the amount that lets augs ignore space damage. B.burn_reduction = 2 B.replace_limb(H, TRUE) @@ -233,18 +249,26 @@ /obj/item/organ/stomach/clockwork name = "nutriment refinery" - icon_state = "stomach-clock" desc = "A biomechanical furnace, which turns calories into mechanical energy." - icon_state = "liver-clock" + icon_state = "stomach-clock" status = ORGAN_ROBOTIC organ_flags = ORGAN_SYNTHETIC -/obj/item/organ/stomach/cell/emp_act(severity) - owner.nutrition -= 100 * severity +/obj/item/organ/stomach/clockwork/emp_act(severity) + owner.adjust_nutrition(-200/severity) + +/obj/item/organ/stomach/battery/clockwork + name = "biometallic flywheel" + desc = "A biomechanical battery which stores mechanical energy." + icon_state = "stomach-clock" + status = ORGAN_ROBOTIC + organ_flags = ORGAN_SYNTHETIC + max_charge = 7500 + charge = 7500 /obj/item/organ/tongue/robot/clockwork name = "dynamic micro-phonograph" - desc = "an old-timey looking device connected to an odd, shifting cylinder." + desc = "An old-timey looking device connected to an odd, shifting cylinder." icon_state = "tongueclock" /obj/item/organ/tongue/robot/clockwork/better @@ -257,10 +281,10 @@ /obj/item/organ/brain/clockwork name = "enigmatic gearbox" desc ="An engineer would call this inconcievable wonder of gears and metal a 'black box'" - icon_state = "posibrain-occupied" + icon_state = "brain-clock" status = ORGAN_ROBOTIC organ_flags = ORGAN_SYNTHETIC - icon_state = "brain-clock" + var/robust //Set to true if the robustbits causes brain replacement. Because holy fuck is the CLANG CLANG CLANG CLANG annoying /obj/item/organ/brain/clockwork/emp_act(severity) switch(severity) @@ -271,13 +295,13 @@ /obj/item/organ/brain/clockwork/on_life() . = ..() - if(prob(25)) + if(prob(5) && !robust) SEND_SOUND(owner, pickweight(list('sound/effects/clock_tick.ogg' = 6, 'sound/effects/smoke.ogg' = 2, 'sound/spookoween/chain_rattling.ogg' = 1, 'sound/ambience/ambiruin3.ogg' = 1))) /obj/item/organ/liver/clockwork name = "biometallic alembic" - icon_state = "liver-c" desc = "A series of small pumps and boilers, designed to facilitate proper metabolism." + icon_state = "liver-clock" organ_flags = ORGAN_SYNTHETIC status = ORGAN_ROBOTIC alcohol_tolerance = 0 @@ -364,4 +388,4 @@ desc = "An odd metal body full of gears and pipes. It still seems alive." icon = 'icons/mob/augmentation/augments_clockwork.dmi' brute_reduction = 0 - burn_reduction = 0 \ No newline at end of file + burn_reduction = 0 diff --git a/code/datums/diseases/advance/symptoms/cockroach.dm b/code/datums/diseases/advance/symptoms/cockroach.dm index c922c69e7312d..018ed1993919d 100644 --- a/code/datums/diseases/advance/symptoms/cockroach.dm +++ b/code/datums/diseases/advance/symptoms/cockroach.dm @@ -5,11 +5,13 @@ stealth = 0 resistance = 3 stage_speed = 3 - transmittable = 1 + transmission = 1 level = 0 severity = 0 //rip funy symptom_delay_min = 10 symptom_delay_max = 30 + prefixes = list("Blatto") + bodies = list("Roach") var/death_roaches = FALSE threshold_desc = "Stage Speed 8:Increases roach speed
\ Transmission 8:When the host dies, more roaches spawn
" @@ -17,10 +19,10 @@ /datum/symptom/cockroach/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stage_rate"] >= 8) + if(A.stage_rate >= 8) symptom_delay_min = 5 symptom_delay_max = 15 - if(A.properties["transmittable"] >= 8) + if(A.transmission >= 8) death_roaches = TRUE /datum/symptom/cockroach/Activate(datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index f5ccef12acd23..dc6777d896b10 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -22,12 +22,14 @@ Bonus stealth = 1 resistance = -1 stage_speed = -3 - transmittable = 0 + transmission = 0 level = 4 severity = 2 base_message_chance = 25 symptom_delay_min = 10 symptom_delay_max = 30 + prefixes = list("Dizzy ") + bodies = list("Ditz") var/brain_damage = FALSE threshold_desc = "Resistance 6: Causes brain damage over time.
\ Transmission 6: Increases confusion duration.
\ @@ -35,17 +37,17 @@ Bonus /datum/symptom/confusion/severityset(datum/disease/advance/A) . = ..() - if(A.properties["resistance"] >= 6) + if(A.resistance >= 6) severity += 1 /datum/symptom/confusion/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["resistance"] >= 6) + if(A.resistance >= 6) brain_damage = TRUE - if(A.properties["transmittable"] >= 6) + if(A.transmission >= 6) power = 1.5 - if(A.properties["stealth"] >= 4) + if(A.stealth >= 4) suppress_warning = TRUE /datum/symptom/confusion/Activate(datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm index c286c7c64809e..cae4806c56f0b 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -22,12 +22,13 @@ BONUS stealth = -1 resistance = 3 stage_speed = 1 - transmittable = 2 + transmission = 2 level = 1 severity = 0 base_message_chance = 15 symptom_delay_min = 2 symptom_delay_max = 15 + bodies = list("Cough") var/infective = FALSE threshold_desc = "Resistance 3: Host will drop small items when coughing.
\ Resistance 10: Occasionally causes coughing fits that stun the host.
\ @@ -37,23 +38,23 @@ BONUS /datum/symptom/cough/severityset(datum/disease/advance/A) . = ..() - if(A.properties["resistance"] >= 3) - severity += 1 - if(A.properties["resistance"] >= 10) + if(A.resistance >= 3) severity += 1 + if(A.resistance >= 10) + severity += 1 /datum/symptom/cough/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stealth"] >= 4) + if(A.stealth >= 4) suppress_warning = TRUE if(A.spread_flags & DISEASE_SPREAD_AIRBORNE) //infect bystanders infective = TRUE - if(A.properties["resistance"] >= 3) //strong enough to drop items + if(A.resistance >= 3) //strong enough to drop items power = 1.5 - if(A.properties["resistance"] >= 10) //strong enough to stun (rarely) - power = 2 - if(A.properties["stage_rate"] >= 6) //cough more often + if(A.resistance >= 10) //strong enough to stun (rarely) + power = 2 + if(A.stage_rate >= 6) //cough more often symptom_delay_max = 10 /datum/symptom/cough/Activate(datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index c675287788317..ce45116175068 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -22,26 +22,28 @@ Bonus stealth = -1 resistance = -2 stage_speed = -1 - transmittable = -3 + transmission = -3 level = 4 severity = 2 base_message_chance = 100 symptom_delay_min = 25 symptom_delay_max = 80 + prefixes = list("Aural ") + bodies = list("Ear") threshold_desc = "Resistance 9: Causes permanent deafness, instead of intermittent.
\ Stealth 4: The symptom remains hidden until active." /datum/symptom/deafness/severityset(datum/disease/advance/A) . = ..() - if(A.properties["resistance"] >= 9) + if(A.resistance >= 9) severity += 1 /datum/symptom/deafness/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stealth"] >= 4) + if(A.stealth >= 4) suppress_warning = TRUE - if(A.properties["resistance"] >= 9) //permanent deafness + if(A.resistance >= 9) //permanent deafness power = 2 /datum/symptom/deafness/Activate(datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm index 0ab44686b22b0..4242cc66a4c88 100644 --- a/code/datums/diseases/advance/symptoms/fever.dm +++ b/code/datums/diseases/advance/symptoms/fever.dm @@ -6,7 +6,7 @@ Fever No change to hidden. Increases resistance. Increases stage speed. - Little transmittable. + Little transmission. Low level. Bonus @@ -21,31 +21,35 @@ Bonus stealth = -1 resistance = 3 stage_speed = 3 - transmittable = 2 + transmission = 2 level = 2 severity = 0 base_message_chance = 20 symptom_delay_min = 10 symptom_delay_max = 30 + bodies = list("Fever") + suffixes = list(" Fever") var/unsafe = FALSE //over the heat threshold threshold_desc = "Resistance 5: Increases fever intensity, fever can overheat and harm the host.
\ Resistance 10: Further increases fever intensity." /datum/symptom/fever/severityset(datum/disease/advance/A) . = ..() - if(A.properties["resistance"] >= 5) - severity += 1 - if(A.properties["resistance"] >= 10) + if(A.resistance >= 5) severity += 1 + prefixes = list("Desert") + if(A.resistance >= 10) + severity += 1 + prefixes = list("Volcanic") /datum/symptom/fever/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["resistance"] >= 5) //dangerous fever + if(A.resistance >= 5) //dangerous fever power = 1.5 unsafe = TRUE - if(A.properties["resistance"] >= 10) - power = 2.5 + if(A.resistance >= 10) + power = 2.5 /datum/symptom/fever/Activate(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm index fe141596d1fdb..692b78a1f4e16 100644 --- a/code/datums/diseases/advance/symptoms/fire.dm +++ b/code/datums/diseases/advance/symptoms/fire.dm @@ -22,12 +22,15 @@ Bonus stealth = 1 resistance = -2 stage_speed = -3 - transmittable = -3 + transmission = -3 level = 6 severity = 4 base_message_chance = 20 symptom_delay_min = 20 symptom_delay_max = 75 + prefixes = list("Burning ") + bodies = list("Combustion") + suffixes = list(" Combustion") var/infective = FALSE threshold_desc = "Stage Speed 4: Increases the intensity of the flames.
\ Stage Speed 8: Further increases flame intensity.
\ @@ -37,13 +40,13 @@ Bonus /datum/symptom/fire/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stage_rate"] >= 4) + if(A.stage_rate >= 4) power = 1.5 - if(A.properties["stage_rate"] >= 8) - power = 2 - if(A.properties["stealth"] >= 4) + if(A.stage_rate >= 8) + power = 2 + if(A.stealth >= 4) suppress_warning = TRUE - if(A.properties["transmittable"] >= 8) //burning skin spreads the virus through smoke + if(A.transmission >= 8) //burning skin spreads the virus through smoke infective = TRUE /datum/symptom/fire/Activate(datum/disease/advance/A) @@ -103,17 +106,20 @@ Bonus /datum/symptom/alkali - name = "Alkali perspiration" + name = "Alkali Perspiration" desc = "The virus attaches to sudoriparous glands, synthesizing a chemical that bursts into flames when reacting with water, leading to self-immolation." stealth = 2 resistance = -2 stage_speed = -2 - transmittable = -2 + transmission = -2 level = 9 severity = 5 base_message_chance = 100 symptom_delay_min = 30 symptom_delay_max = 90 + prefixes = list("Explosive ") + bodies = list("Hellfire") + suffixes = list(" of the Damned") var/chems = FALSE var/explosion_power = 1 threshold_desc = "Resistance 9: Doubles the intensity of the effect, but reduces its frequency.
\ @@ -122,21 +128,19 @@ Bonus /datum/symptom/alkali/severityset(datum/disease/advance/A) . = ..() - if(A.properties["resistance"] >= 9) - severity = 6 - if(A.properties["stage_rate"] >= 10) + if(A.resistance >= 9 || A.stage_rate >= 8) severity = 6 /datum/symptom/alkali/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["resistance"] >= 9) //intense but sporadic effect + if(A.resistance >= 9) //intense but sporadic effect power = 2 symptom_delay_min = 50 symptom_delay_max = 140 - if(A.properties["stage_rate"] >= 8) //serious boom when wet + if(A.stage_rate >= 8) //serious boom when wet explosion_power = 2 - if(A.properties["transmittable"] >= 8) //extra chemicals + if(A.transmission >= 8) //extra chemicals chems = TRUE /datum/symptom/alkali/Activate(datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index 4082bbe75d7ef..a6355765eb18b 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -22,12 +22,14 @@ Bonus stealth = -3 resistance = -4 stage_speed = 0 - transmittable = -4 + transmission = -4 level = 6 severity = 4 base_message_chance = 50 symptom_delay_min = 15 symptom_delay_max = 60 + prefixes = list("Bloody ", "Hemo") + bodies = list("Hemophilia") var/bleed = FALSE var/pain = FALSE threshold_desc = "Resistance 7: Host will bleed profusely during necrosis.
\ @@ -36,9 +38,9 @@ Bonus /datum/symptom/flesh_eating/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["resistance"] >= 7) //extra bleeding + if(A.resistance >= 7) //extra bleeding bleed = TRUE - if(A.properties["transmittable"] >= 8) //extra stamina damage + if(A.transmission >= 8) //extra stamina damage pain = TRUE /datum/symptom/flesh_eating/Activate(datum/disease/advance/A) @@ -88,25 +90,32 @@ Bonus stealth = -2 resistance = -2 stage_speed = 1 - transmittable = -2 + transmission = -2 level = 9 severity = 5 base_message_chance = 50 symptom_delay_min = 3 symptom_delay_max = 6 + prefixes = list("Necrotic ", "Necro") + suffixes = list(" Rot") var/chems = FALSE var/zombie = FALSE threshold_desc = "Stage Speed 7: Synthesizes Heparin and Lipolicide inside the host, causing increased bleeding and hunger.
\ Stealth 5: The symptom remains hidden until active." +/datum/symptom/flesh_death/severityset(datum/disease/advance/A) + . = ..() + if((A.stealth >= 2) && (A.stage_rate >= 12)) + bodies = list("Zombie") + /datum/symptom/flesh_death/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stealth"] >= 5) + if(A.stealth >= 5) suppress_warning = TRUE - if(A.properties["stage_rate"] >= 7) //bleeding and hunger + if(A.stage_rate >= 7) //bleeding and hunger chems = TRUE - if((A.properties["stealth"] >= 2) && (A.properties["stage_rate"] >= 12)) + if((A.stealth >= 2) && (A.stage_rate >= 12)) zombie = TRUE /datum/symptom/flesh_death/Activate(datum/disease/advance/A) @@ -125,7 +134,7 @@ Bonus return if(prob(base_message_chance / 2)) //reduce spam to_chat(M, "[pick("You feel your muscles weakening.", "Some of your skin detaches itself.", "You feel sandy.")]") - + /datum/symptom/flesh_death/proc/Flesh_death(mob/living/M, datum/disease/advance/A) var/get_damage = rand(6,10) if(MOB_UNDEAD in M.mob_biotypes) diff --git a/code/datums/diseases/advance/symptoms/fleshgrowth.dm b/code/datums/diseases/advance/symptoms/fleshgrowth.dm deleted file mode 100644 index 71e7a27232886..0000000000000 --- a/code/datums/diseases/advance/symptoms/fleshgrowth.dm +++ /dev/null @@ -1,232 +0,0 @@ -/datum/symptom/flesh - name = "Exolocomotive Xenomitosis" - desc = "The virus will grow on any surfaces it can, such as the host's skin, or even the ground, should the host remain stationary" - stealth = -2 - resistance = 3 - stage_speed = 3 - transmittable = 1 - level = 9 - severity = 2 - symptom_delay_min = 1 - symptom_delay_max = 1 - var/cachedcolor = null - var/turf/open/currentloc = null - var/cycles = 0 - var/lastcycle = 0 - var/requiredcycles = 0 - var/maxradius = 1 - threshold_desc = "Stage Speed:Influences the time the host must stand still to begin spreading infectious mass.
\ - Stage Speed 6:Infectious mass will patch wounds in the host's flesh, healing their brute damage. Standing on infectious mass heals the host far quicker, and laying down even faster. -3 severity.
\ - Transmission:Influences the maximum spread radius of infectious mass.
\ - Transmission 10:Infectious mass will contain all viruses currently afflicting the host. +1 severity." - -/datum/symptom/flesh/severityset(datum/disease/advance/A) - . = ..() - if(A.properties["stage_rate"] >= 6) - severity -= 3 - if(A.properties["transmittable"] >= 10) - severity += 1 - -/datum/symptom/flesh/Start(datum/disease/advance/A) - . = ..() - requiredcycles = (max(2, round((18 - A.properties["stage_rate"]) / 2))) //14 speed is the highest possible rate of growth - maxradius = (round(A.properties["transmittable"] / 3)) - var/mob/living/M = A.affected_mob - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.dna.species.use_skintones) - cachedcolor = H.skin_tone - else if(MUTCOLORS in H.dna.species.species_traits) - cachedcolor = H.dna.features["mcolor"] - -/datum/symptom/flesh/Activate(datum/disease/advance/A) - if(!..()) - return - var/mob/living/M = A.affected_mob - var/list/diseases = list(A) - var/healfactor = 0 - if(iscarbon(M)) - var/mob/living/carbon/C = M - switch(A.stage) - if(5) - if(currentloc == C.loc) - cycles += 1 - else if(isturf(C.loc) && !isspaceturf(C.loc)) - currentloc = C.loc - cycles = 0 - lastcycle = 0 - var/obj/structure/alien/flesh/W = locate(/obj/structure/alien/flesh) in currentloc - if(W) - healfactor += 1 - if(istype(W, /obj/structure/alien/flesh/node)) - healfactor += 1 - var/obj/structure/alien/flesh/node/node = W - if(round(cycles / requiredcycles) >= lastcycle && node.node_range < maxradius) - node.node_range += 1 - lastcycle += 1 - if(!(C.mobility_flags & MOBILITY_STAND)) - healfactor *= 2 - else if(round(cycles / requiredcycles) >= 1) - if(A.properties["transmittable"] >= 10) - for(var/datum/disease/D in M.diseases) - if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS) || (D.spread_flags & DISEASE_SPREAD_FALTERED)) - continue - if(D == A) - continue - diseases += D - if(maxradius >= 1) - var/obj/structure/alien/flesh/node/N = new(currentloc, diseases) - N.node_range = 0 - else - new /obj/structure/alien/flesh(currentloc, diseases) - C.visible_message("The film on [C]'s skin grows onto the floor!", "The film creeping along your skin secretes onto the floor!") - lastcycle += 1 - if(A.properties["stage_rate"] >= 8) - healfactor += 0.5 - C.heal_overall_damage(healfactor, required_status = BODYPART_ORGANIC)//max passive healing is 4.5, whilst laying down on a node. - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(istype(H.dna.species, /datum/species/zombie/infectious)) - var/datum/species/zombie/infectious/Z = H.dna.species - if(Z.limbs_id == "pinkzombie") - return - else - Z.limbs_id = "pinkzombie" - H.regenerate_icons() - if(H.skin_tone == "pink") - return - else if(H.dna.features["mcolor"] == "D37") - return - if(H.dna.species.use_skintones) - H.skin_tone = "pink" - H.visible_message("A film of pinkish material grows over [H]'s skin!", "Your skin is completely covered by a film of pinkish, fleshy mass!") - H.regenerate_icons() - else if(MUTCOLORS in H.dna.species.species_traits) - H.dna.features["mcolor"] = "D37" //pinkish red - H.visible_message("A film of pinkish material grows over [H]'s skin!", "Your skin is completely covered by a film of pinkish, fleshy mass!") - H.regenerate_icons() - -/datum/symptom/flesh/End(datum/disease/advance/A) - . = ..() - var/mob/living/M = A.affected_mob - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.dna.species.use_skintones) - H.skin_tone = cachedcolor - else if(MUTCOLORS in H.dna.species.species_traits) - H.dna.features["mcolor"] = cachedcolor - H.regenerate_icons() - - -/obj/structure/alien/flesh //this isn't a subtype of alien weeds so it wont heal aliens - gender = PLURAL - name = "infested floor" - desc = "A thick film of flesh covers the floor." - anchored = TRUE - density = FALSE - layer = TURF_LAYER - plane = FLOOR_PLANE - icon_state = "weeds" - max_integrity = 15 - canSmoothWith = list(/obj/structure/alien/flesh, /turf/closed/wall) - smooth = SMOOTH_MORE - var/last_expand = 0 //last world.time this weed expanded - var/growth_cooldown_low = 150 - var/growth_cooldown_high = 200 - var/static/list/blacklisted_turfs - var/list/nodediseases = list() - -/obj/structure/alien/flesh/Initialize(mapload, list/datum/disease/diseases) - pixel_x = -4 - pixel_y = -4 //so the sprites line up right in the map editor - . = ..() - - if(!blacklisted_turfs) //note: if some sort of sanitary floors are added, put them in here - blacklisted_turfs = typecacheof(list( - /turf/open/space, - /turf/open/chasm, - /turf/open/lava)) - - - last_expand = world.time + rand(growth_cooldown_low, growth_cooldown_high) - if(icon == initial(icon)) - switch(rand(1,3)) - if(1) - icon = 'icons/obj/smooth_structures/alien/flesh1.dmi' - if(2) - icon = 'icons/obj/smooth_structures/alien/flesh2.dmi' - if(3) - icon = 'icons/obj/smooth_structures/alien/flesh3.dmi' - if(LAZYLEN(diseases)) - for(var/datum/disease/D in diseases) - nodediseases += D - if(LAZYLEN(nodediseases)) - AddComponent(/datum/component/infective, nodediseases) - -/obj/structure/alien/flesh/examine(mob/user) - . = ..() - if(isliving(user)) - var/mob/living/U = user - for(var/datum/disease/advance/A in U.diseases) - for(var/datum/symptom/S in A.symptoms) - if(istype(S, /datum/symptom/flesh)) - . += "It looks warm and inviting. It would be so wonderful to just lay down in it..." - return - -/obj/structure/alien/flesh/proc/expand() - var/turf/U = get_turf(src) - if(is_type_in_typecache(U, blacklisted_turfs)) - qdel(src) - return FALSE - - for(var/turf/T in U.GetAtmosAdjacentTurfs()) - if(locate(/obj/structure/alien/flesh) in T) - continue - - if(is_type_in_typecache(T, blacklisted_turfs)) - continue - - var/obj/structure/alien/weeds/W = locate(/obj/structure/alien/weeds) in T //we infect and subsume alien weeds and replace them with our own shit - if(W) - if(istype(W, /obj/structure/alien/weeds/node)) - new /obj/structure/alien/flesh/node(T, nodediseases) - continue - else - qdel(W) - new /obj/structure/alien/flesh(T, nodediseases) - return TRUE - -/obj/structure/alien/flesh/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - take_damage(5, BURN, 0, 0) - -//Weed nodes -/obj/structure/alien/flesh/node - name = "putrid infection" - desc = "A sickly red glow emanates from the pustules on this fleshy film." - icon_state = "weednode" - light_color = LIGHT_COLOR_BLOOD_MAGIC //a good, sickly atmosphere - light_power = 0.5 - var/lon_range = 4 - var/node_range = 3 - - -/obj/structure/alien/flesh/node/Initialize() - icon = 'icons/obj/smooth_structures/alien/fleshpolyp.dmi' - . = ..() - set_light(lon_range) - var/obj/structure/alien/W = locate(/obj/structure/alien) in loc //we infect and take over alien resin - if(W && W != src) - qdel(W) - START_PROCESSING(SSobj, src) - -/obj/structure/alien/flesh/node/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/structure/alien/flesh/node/process() - if(node_range) - for(var/obj/structure/alien/flesh/W in range(node_range, src)) - if(W.last_expand <= world.time) - if(W.expand()) - W.last_expand = world.time + rand(growth_cooldown_low, growth_cooldown_high) \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm index 0f5d9153780d4..05619706eedfa 100644 --- a/code/datums/diseases/advance/symptoms/genetics.dm +++ b/code/datums/diseases/advance/symptoms/genetics.dm @@ -21,7 +21,7 @@ Bonus stealth = -2 resistance = -3 stage_speed = 0 - transmittable = -3 + transmission = -3 level = 6 severity = 3 var/list/possible_mutations @@ -29,17 +29,16 @@ Bonus base_message_chance = 50 symptom_delay_min = 60 symptom_delay_max = 120 + prefixes = list("Genetic ", "Chromosomal ", "Mutagenic ", "Muta-") + bodies = list("Mutant") var/no_reset = FALSE threshold_desc = "Resistance 8: Causes two harmful mutations at once.
\ Stage Speed 10: Increases mutation frequency.
\ - Stage Speed 14: Mutations will be beneficial.
\ Stealth 5: The mutations persist even if the virus is cured." /datum/symptom/genetic_mutation/severityset(datum/disease/advance/A) . = ..() - if(A.properties["stage_rate"] >= 14) - severity = 0 - else if(A.properties["resistance"] >= 8) + if(A.resistance >= 8) severity += 1 /datum/symptom/genetic_mutation/Activate(datum/disease/advance/A) @@ -59,17 +58,14 @@ Bonus /datum/symptom/genetic_mutation/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stealth"] >= 5) //don't restore dna after curing + if(A.stealth >= 5) //don't restore dna after curing no_reset = TRUE - if(A.properties["stage_rate"] >= 10) //mutate more often + if(A.stage_rate >= 10) //mutate more often symptom_delay_min = 20 symptom_delay_max = 60 - if(A.properties["resistance"] >= 8) //mutate twice + if(A.resistance >= 8) //mutate twice power = 2 - if(A.properties["stage_rate"] >= 14) - possible_mutations = (GLOB.good_mutations | GLOB.not_good_mutations) - GLOB.all_mutations[RACEMUT] - else - possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.all_mutations[RACEMUT] + possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.all_mutations[RACEMUT] var/mob/living/carbon/M = A.affected_mob if(M) if(!M.has_dna()) diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm index 6782d5195e04a..afce17942a3d5 100644 --- a/code/datums/diseases/advance/symptoms/hallucigen.dm +++ b/code/datums/diseases/advance/symptoms/hallucigen.dm @@ -6,7 +6,7 @@ Hallucigen Very noticable. Lowers resistance considerably. Decreases stage speed. - Reduced transmittable. + Reduced transmission. Critical Level. Bonus @@ -21,28 +21,30 @@ Bonus stealth = 1 resistance = -3 stage_speed = -1 - transmittable = -1 + transmission = -1 level = 5 severity = 1 base_message_chance = 25 symptom_delay_min = 10 symptom_delay_max = 70 + prefixes = list("Narcotic ", "Narco", "Psycho-") + suffixes = list(" Psychosis") var/fake_healthy = FALSE threshold_desc = "Stage Speed 7: Increases the amount of hallucinations.
\ Stealth 2: The virus mimics positive symptoms.." /datum/symptom/hallucigen/severityset(datum/disease/advance/A) . = ..() - if(A.properties["stage_rate"] >= 7) + if(A.stage_rate >= 7) severity += 1 /datum/symptom/hallucigen/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stealth"] >= 2) //fake good symptom messages + if(A.stealth >= 2) //fake good symptom messages fake_healthy = TRUE base_message_chance = 50 - if(A.properties["stage_rate"] >= 7) //stronger hallucinations + if(A.stage_rate >= 7) //stronger hallucinations power = 2 /datum/symptom/hallucigen/Activate(datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/advance/symptoms/headache.dm index ccfbdd1daed9d..b65efdce59e60 100644 --- a/code/datums/diseases/advance/symptoms/headache.dm +++ b/code/datums/diseases/advance/symptoms/headache.dm @@ -23,31 +23,32 @@ BONUS stealth = -1 resistance = 4 stage_speed = 2 - transmittable = 0 + transmission = 0 level = 1 severity = 0 base_message_chance = 100 symptom_delay_min = 15 symptom_delay_max = 30 + bodies = list("Skull", "Migraine") threshold_desc = "Stage Speed 6: Headaches will cause severe pain, that weakens the host.
\ Stage Speed 9: Headaches become less frequent but far more intense, preventing any action from the host.
\ Stealth 4: Reduces headache frequency until later stages." /datum/symptom/headache/severityset(datum/disease/advance/A) . = ..() - if(A.properties["stage_rate"] >= 6) - severity += 1 - if(A.properties["stage_rate"] >= 9) + if(A.stage_rate >= 6) severity += 1 + if(A.stage_rate >= 9) + severity += 1 /datum/symptom/headache/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stealth"] >= 4) + if(A.stealth >= 4) base_message_chance = 50 - if(A.properties["stage_rate"] >= 6) //severe pain - power = 2 - if(A.properties["stage_rate"] >= 9) //cluster headaches + if(A.stage_rate >= 6) //severe pain + power = 2 + if(A.stage_rate >= 9) //cluster headaches symptom_delay_min = 30 symptom_delay_max = 60 power = 3 @@ -64,4 +65,4 @@ BONUS M.adjustStaminaLoss(25) if(power >= 3 && A.stage >= 5) to_chat(M, "[pick("Your head hurts!", "You feel a burning knife inside your brain!", "A wave of pain fills your head!")]") - M.Stun(35) \ No newline at end of file + M.Stun(35) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 35ca2badf22d7..786601ace4052 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -4,7 +4,7 @@ stealth = 0 resistance = 0 stage_speed = 0 - transmittable = 0 + transmission = 0 level = -1 //not obtainable base_message_chance = 20 //here used for the overlays symptom_delay_min = 1 @@ -16,7 +16,7 @@ /datum/symptom/heal/Start(datum/disease/advance/A) if(!..()) return FALSE - if(A.properties["stage_rate"] >= 6) //stronger healing + if(A.stage_rate >= 6) //stronger healing power = 2 return TRUE //For super calls of subclasses @@ -49,9 +49,10 @@ stealth = 0 resistance = -2 stage_speed = 2 - transmittable = -2 + transmission = -2 level = 7 power = 2 + prefixes = list("Toxo") var/food_conversion = FALSE desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream." threshold_desc = "Resistance 7: Increases chem removal speed.
\ @@ -60,9 +61,9 @@ /datum/symptom/heal/chem/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stage_rate"] >= 6) + if(A.stage_rate >= 6) food_conversion = TRUE - if(A.properties["resistance"] >= 7) + if(A.resistance >= 7) power = 4 /datum/symptom/heal/chem/Heal(mob/living/M, datum/disease/advance/A, actual_power) @@ -80,26 +81,27 @@ stealth = 0 resistance = 2 stage_speed = -3 - transmittable = -3 + transmission = -3 level = 8 severity = -2 passive_message = "The pain from your wounds makes you feel oddly sleepy." + prefixes = list("Sleeping ", "Regenerative ") + suffixes = list(" Coma") var/deathgasp = FALSE var/stabilize = FALSE var/active_coma = FALSE //to prevent multiple coma procs threshold_desc = "Stealth 2: Host appears to die when falling into a coma, triggering symptoms that activate on death.
\ - Resistance 4: The virus also stabilizes the host while they are in critical condition.
\ Stage Speed 7: Increases healing speed." /datum/symptom/heal/coma/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stage_rate"] >= 7) + if(A.stage_rate >= 7) power = 1.5 - if(A.properties["resistance"] >= 4) + if(A.resistance >= 4) stabilize = TRUE - if(A.properties["stealth"] >= 2) + if(A.stealth >= 2) deathgasp = TRUE /datum/symptom/heal/coma/on_stage_change(new_stage, datum/disease/advance/A) //mostly copy+pasted from the code for self-respiration's TRAIT_NOBREATH stuff @@ -133,8 +135,9 @@ /datum/symptom/heal/coma/proc/coma(mob/living/M) if(deathgasp) - M.emote("deathgasp") - M.fakedeath("regenerative_coma") + M.fakedeath(TRAIT_REGEN_COMA) + else + M.Unconscious(300, TRUE, TRUE) M.update_stat() M.update_mobility() addtimer(CALLBACK(src, .proc/uncoma, M), 300) @@ -143,7 +146,10 @@ if(!active_coma) return active_coma = FALSE - M.cure_fakedeath("regenerative_coma") + if(deathgasp) + M.cure_fakedeath(TRAIT_REGEN_COMA) + else + M.SetUnconscious(0) M.update_stat() M.update_mobility() @@ -175,10 +181,11 @@ stealth = -1 resistance = -2 stage_speed = -2 - transmittable = 0 + transmission = 0 severity = -1 level = 6 passive_message = "Your skin tingles." + prefixes = list("Healing ", "Minor ") var/threshhold = 15 var/scarcounter = 0 @@ -188,9 +195,9 @@ /datum/symptom/heal/surface/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stage_rate"] >= 8) //stronger healing + if(A.stage_rate >= 8) //stronger healing power = 2 - if(A.properties["resistance"] >= 10) + if(A.resistance >= 10) threshhold = 30 /datum/symptom/heal/surface/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) @@ -207,7 +214,7 @@ scarcounter++ if(M.getToxLoss() && M.getToxLoss() <= threshhold) - M.adjustToxLoss(-power) + M.adjustToxLoss(-power, FALSE, TRUE) if(healed) if(prob(10)) @@ -226,8 +233,10 @@ stealth = -1 resistance = -2 stage_speed = 2 - transmittable = 1 + transmission = 1 level = 4 + prefixes = list("Metabolic ", "Junkie's ", "Chemical ") + bodies = list("Hunger") var/triple_metabolism = FALSE var/reduced_hunger = FALSE desc = "The virus causes the host's metabolism to accelerate rapidly, making them process chemicals twice as fast,\ @@ -238,9 +247,9 @@ /datum/symptom/heal/metabolism/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stage_rate"] >= 10) + if(A.stage_rate >= 10) triple_metabolism = TRUE - if(A.properties["stealth"] >= 3) + if(A.stealth >= 3) reduced_hunger = TRUE /datum/symptom/heal/metabolism/Heal(mob/living/carbon/C, datum/disease/advance/A, actual_power) @@ -269,11 +278,13 @@ im not even gonna bother with these for the following symptoms. typed em out, co stealth = 0 resistance = -1 stage_speed = -1 - transmittable = -2 + transmission = -2 level = 6 severity = 2 symptom_delay_min = 15 symptom_delay_max = 40 + prefixes = list("Magnetic ", "Electro") + bodies = list("Magnet") var/bigemp = FALSE var/cellheal = FALSE threshold_desc = "Stealth 2: The disease resets cell DNA, quickly curing cell damage and mutations.
\ @@ -281,17 +292,17 @@ im not even gonna bother with these for the following symptoms. typed em out, co /datum/symptom/EMP/severityset(datum/disease/advance/A) . = ..() - if(A.properties["stealth"] >= 2) //if you combine this with pituitary disruption, you have the two most downside-heavy symptoms available + if(A.stealth >= 2) //if you combine this with pituitary disruption, you have the two most downside-heavy symptoms available severity -= 1 - if(A.properties["transmittable"] >= 8) + if(A.transmission >= 8) severity += 1 /datum/symptom/EMP/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stealth"] >= 2) + if(A.stealth >= 2) cellheal = TRUE - if(A.properties["transmittable"] >= 8) + if(A.transmission >= 8) bigemp = TRUE /datum/symptom/EMP/Activate(datum/disease/advance/A) @@ -313,15 +324,17 @@ im not even gonna bother with these for the following symptoms. typed em out, co /datum/symptom/sweat name = "Hyperperspiration" - desc = "Causes the host to sweat profusely, leaving small water puddles and extnguishing small fires" + desc = "Causes the host to sweat profusely, leaving small water puddles and extinguishing small fires" stealth = 1 resistance = -1 stage_speed = 0 - transmittable = 1 + transmission = 1 level = 6 severity = 1 symptom_delay_min = 10 symptom_delay_max = 30 + prefixes = list("Sweaty ", "Moist ", "Mister ") + bodies = list("Perspiration") var/bigsweat = FALSE var/toxheal = FALSE var/ammonia = FALSE @@ -331,17 +344,17 @@ im not even gonna bother with these for the following symptoms. typed em out, co /datum/symptom/sweat/severityset(datum/disease/advance/A) . = ..() - if(A.properties["transmittable"] >= 6) + if(A.transmission >= 6) severity -= 1 /datum/symptom/sweat/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["transmittable"] >= 6) + if(A.transmission >= 6) toxheal = TRUE - if(A.properties["transmittable"] >= 4) + if(A.transmission >= 4) bigsweat = TRUE - if(A.properties["stage_rate"] >= 6) + if(A.stage_rate >= 6) ammonia = TRUE /datum/symptom/sweat/Activate(datum/disease/advance/A) @@ -378,7 +391,7 @@ im not even gonna bother with these for the following symptoms. typed em out, co create_reagents(1000) reagents.add_reagent(/datum/reagent/water, 10) -obj/effect/sweatsplash/proc/splash() +/obj/effect/sweatsplash/proc/splash() chem_splash(loc, 2, list(reagents)) qdel(src) @@ -388,11 +401,13 @@ obj/effect/sweatsplash/proc/splash() stealth = 1 resistance = 2 stage_speed = -2 - transmittable = -3 + transmission = -3 level = 8 severity = 0 symptom_delay_min = 1 symptom_delay_max = 1 + prefixes = list("Quantum ", "Thermal ") + bodies = list("Teleport") var/telethreshold = 15 var/burnheal = FALSE var/turf/open/location_return = null @@ -402,17 +417,17 @@ obj/effect/sweatsplash/proc/splash() /datum/symptom/teleport/severityset(datum/disease/advance/A) . = ..() - if(A.properties["resistance"] >= 6) + if(A.resistance >= 6) severity -= 1 - if(A.properties["transmittable"] >= 8) + if(A.transmission >= 8) severity -= 1 /datum/symptom/teleport/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["resistance"] >= 6) + if(A.resistance >= 6) burnheal = TRUE - if(A.properties["transmittable"] >= 8) + if(A.transmission >= 8) telethreshold = -10 power = 2 @@ -423,14 +438,14 @@ obj/effect/sweatsplash/proc/splash() switch(A.stage) if(4, 5) if(burnheal) - M.heal_overall_damage(0, 1) //no required_status checks here, this does all bodyparts equally + M.heal_overall_damage(0, 1.5) //no required_status checks here, this does all bodyparts equally if(prob(5) && (M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT || M.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT)) location_return = get_turf(M) //sets up return point if(prob(50)) to_chat(M, "The lukewarm temperature makes you feel strange!") if(cooldowntimer == 0 && ((M.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT + telethreshold && !HAS_TRAIT(M, TRAIT_RESISTHEAT)) || (M.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT - telethreshold && !HAS_TRAIT(M, TRAIT_RESISTCOLD)) || (burnheal && M.getFireLoss() > 60 + telethreshold))) do_sparks(5,FALSE,M) - to_chat(M, "The change in temperature shocks you back to a previous spacial state!") + to_chat(M, "The change in temperature shocks you back to a previous spatial state!") do_teleport(M, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home do_sparks(5,FALSE,M) cooldowntimer = 10 @@ -449,11 +464,13 @@ obj/effect/sweatsplash/proc/splash() stealth = -3 resistance = -2 stage_speed = 1 - transmittable = -2 + transmission = -2 level = 7 severity = 1 symptom_delay_min = 1 symptom_delay_max = 1 + prefixes = list("Blood ", "Meat ", "Flesh ") + bodies = list("Giant") var/current_size = 1 var/tetsuo = FALSE var/bruteheal = FALSE @@ -464,22 +481,22 @@ obj/effect/sweatsplash/proc/splash() /datum/symptom/growth/severityset(datum/disease/advance/A) . = ..() - if(A.properties["stage_rate"] >= 6) + if(A.stage_rate >= 6) severity -= 1 - if(A.properties["stage_rate"] >= 12) - severity += 3 + if(A.stage_rate >= 12) + severity += 3 /datum/symptom/growth/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stage_rate"] >= 6) + if(A.stage_rate >= 6) bruteheal = TRUE - if(A.properties["stage_rate"] >= 12) - tetsuo = TRUE - power = 3 //should make this symptom actually worth it + if(A.stage_rate >= 12) + tetsuo = TRUE + power = 3 //should make this symptom actually worth it var/mob/living/carbon/M = A.affected_mob ownermind = M.mind - sizemult = CLAMP((0.5 + A.properties["stage_rate"] / 10), 1.1, 2.5) + sizemult = CLAMP((0.5 + A.stage_rate / 10), 1.1, 2.5) M.resize = sizemult M.update_transform() @@ -491,16 +508,22 @@ obj/effect/sweatsplash/proc/splash() if(4, 5) if(prob(5) && bruteheal) to_chat(M, "You retch, and a splatter of gore escapes your gullet!") - M.Knockdown(10) + M.Immobilize(5) new /obj/effect/decal/cleanable/blood/(M.loc) playsound(get_turf(M), 'sound/effects/splat.ogg', 50, 1) if(prob(60)) + if(tetsuo && prob(15)) + if(A.affected_mob.job == "Clown") + new /obj/effect/spawner/lootdrop/teratoma/major/clown(M.loc) + if(MOB_ROBOTIC in A.infectable_biotypes) + new /obj/effect/decal/cleanable/robot_debris(M.loc) + new /obj/effect/spawner/lootdrop/teratoma/robot(M.loc) new /obj/effect/spawner/lootdrop/teratoma/minor(M.loc) if(tetsuo) var/list/organcantidates = list() var/list/missing = M.get_missing_limbs() if(prob(35)) - new /obj/effect/gibspawner/human/bodypartless(M.loc) //yes. this is very messy. very, very messy. + new /obj/effect/decal/cleanable/blood/gibs(M.loc) //yes. this is very messy. very, very messy. new /obj/effect/spawner/lootdrop/teratoma/major(M.loc) for(var/obj/item/organ/O in M.loc) if(O.organ_flags & ORGAN_FAILING || O.organ_flags & ORGAN_VITAL) //dont use shitty organs or brains @@ -510,6 +533,10 @@ obj/effect/sweatsplash/proc/splash() organcantidates += O continue organcantidates += O + if(ishuman(M)) + var/mob/living/carbon/human/H = M //To view species + if(!is_species(H, /datum/species/plasmaman)) + O -= /obj/item/organ/lungs/plasmaman //So this disease doesn't eventually kill everyone with lungs if(organcantidates.len) for(var/I in 1 to min(rand(1, 3), organcantidates.len)) var/obj/item/organ/chosen = pick_n_take(organcantidates) @@ -540,8 +567,6 @@ obj/effect/sweatsplash/proc/splash() ownermind.transfer_to(M) M.grab_ghost() break - if(tetsuo && prob(10) && A.affected_mob.job == "Clown") - new /obj/effect/spawner/lootdrop/teratoma/major/clown(M.loc) if(bruteheal) M.heal_overall_damage(2 * power, required_status = BODYPART_ORGANIC) if(prob(11 * power)) @@ -559,6 +584,7 @@ obj/effect/sweatsplash/proc/splash() animate(pixel_z = 0, transform = turn(matrix(), pick(-12, 0, 12)), time=2) //waddle desizing is an issue, because you can game it to use this symptom and become small animate(pixel_z = 0, transform = matrix(), time = 0) //so, instead, we use waddle desizing to desize you from this symptom, instead of a transformation, because it wont shrink you naturally +//they are used for the maintenance spawn, for ling teratoma see changeling\teratoma.dm /obj/effect/mob_spawn/teratomamonkey //spawning these is one of the downsides of overclocking the symptom name = "fleshy mass" desc = "A writhing mass of flesh." @@ -567,15 +593,16 @@ obj/effect/sweatsplash/proc/splash() density = FALSE anchored = FALSE + antagonist_type = /datum/antagonist/teratoma/hugbox mob_type = /mob/living/carbon/monkey/tumor mob_name = "a living tumor" death = FALSE roundstart = FALSE - short_desc = "You are a living tumor. By all accounts, you should not exist." - flavour_text = {" - You are a living teratoma, and your existence is misery. You feel the need to spread woe about the station- but not to kill. - "} use_cooldown = TRUE + show_flavour = FALSE //it's handled by antag datum + short_desc = "You are a living tumor. By all accounts you should not exist." + flavour_text = "Spread misery and chaos upon the station." + important_info = "Avoid killing unprovoked, kill only in self defense!" /obj/effect/mob_spawn/teratomamonkey/Initialize() . = ..() diff --git a/code/datums/diseases/advance/symptoms/heartattack.dm b/code/datums/diseases/advance/symptoms/heartattack.dm index a9645c142cf3b..f798bb473f0eb 100644 --- a/code/datums/diseases/advance/symptoms/heartattack.dm +++ b/code/datums/diseases/advance/symptoms/heartattack.dm @@ -21,26 +21,28 @@ Bonus stealth = 2 resistance = 1 stage_speed = -6 - transmittable = -2 + transmission = -2 level = 9 severity = 5 symptom_delay_min = 1 symptom_delay_max = 1 - var/heartattack = FALSE + prefixes = list("Cardiac ", "Cardio") + bodies = list("Heart") + var/heartattack = FALSE threshold_desc = "Transmission 10: When the victim has a heart attack, their heart will pop right out of their chest, and attack!.
\ Stealth 2: The disease is somewhat less noticable to the host." /datum/symptom/heartattack/severityset(datum/disease/advance/A) . = ..() - if(A.properties["transmittable"] >= 10) + if(A.transmission >= 10) severity += 1 /datum/symptom/heartattack/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["transmittable"] >= 10) + if(A.transmission >= 10) heartattack = TRUE - if(A.properties["stealth"] >= 2) + if(A.stealth >= 2) suppress_warning = TRUE /datum/symptom/heartattack/Activate(datum/disease/advance/A) @@ -48,7 +50,7 @@ Bonus return var/mob/living/carbon/M = A.affected_mob if(suppress_warning && M.can_heartattack()) - if(prob(2)) + if(prob(2)) to_chat(M, "[pick("Your chest aches.", "You need to sit down.", "You feel out of breath.")]") else if(prob(2) && M.can_heartattack()) to_chat(M, "[pick("Your chest hurts!.", "You feel like your heart skipped a beat!")]") @@ -67,5 +69,5 @@ Bonus qdel(heart) to_chat(M, "Your heart bursts out of your chest! It looks furious!") new /mob/living/simple_animal/hostile/heart(M.loc) - - + + diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm index 6dfd1750d8787..dc29e45fcfd8c 100644 --- a/code/datums/diseases/advance/symptoms/itching.dm +++ b/code/datums/diseases/advance/symptoms/itching.dm @@ -23,11 +23,13 @@ BONUS stealth = 0 resistance = 3 stage_speed = 3 - transmittable = 1 + transmission = 1 level = 1 severity = 0 symptom_delay_min = 5 symptom_delay_max = 25 + prefixes = list("Irritant ") + bodies = list("Itch") var/scratch = FALSE threshold_desc = "Transmission 6: Increases frequency of itching.
\ Stage Speed 7: The host will scrath itself when itching, causing superficial damage." @@ -35,10 +37,10 @@ BONUS /datum/symptom/itching/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["transmittable"] >= 6) //itch more often + if(A.transmission >= 6) //itch more often symptom_delay_min = 1 symptom_delay_max = 4 - if(A.properties["stage_rate"] >= 7) //scratch + if(A.stage_rate >= 7) //scratch scratch = TRUE /datum/symptom/itching/Activate(datum/disease/advance/A) @@ -51,4 +53,4 @@ BONUS var/can_scratch = scratch && !M.incapacitated() && get_location_accessible(M, picked_bodypart) M.visible_message("[can_scratch ? "[M] scratches [M.p_their()] [bodypart.name]." : ""]", "Your [bodypart.name] itches. [can_scratch ? " You scratch it." : ""]") if(can_scratch) - bodypart.receive_damage(0.5) \ No newline at end of file + bodypart.receive_damage(0.5) diff --git a/code/datums/diseases/advance/symptoms/lubefeet.dm b/code/datums/diseases/advance/symptoms/lubefeet.dm index 24e6e38154c56..c253600cb10e8 100644 --- a/code/datums/diseases/advance/symptoms/lubefeet.dm +++ b/code/datums/diseases/advance/symptoms/lubefeet.dm @@ -4,11 +4,13 @@ stealth = 0 resistance = 2 stage_speed = 5 - transmittable = -2 + transmission = -2 level = 9 severity = 2 symptom_delay_min = 1 symptom_delay_max = 3 + prefixes = list("Slippery ", "Lubricated ") + bodies = list("Foot", "Feet") var/morelube = FALSE var/clownshoes = TRUE threshold_desc = "Transmission 10: The host sweats even more profusely, lubing almost every tile they walk over
\ @@ -16,15 +18,15 @@ /datum/symptom/lubefeet/severityset(datum/disease/advance/A) . = ..() - if(A.properties["transmittable"] >= 10) + if(A.transmission >= 10) severity += 1 /datum/symptom/lubefeet/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["transmittable"] >= 10) + if(A.transmission >= 10) morelube = TRUE - if(A.properties["resistance"] >= 14) + if(A.resistance >= 14) clownshoes = TRUE /datum/symptom/lubefeet/Activate(datum/disease/advance/A) @@ -75,5 +77,5 @@ qdel(M.shoes) var/obj/item/clothing/C = new /obj/item/clothing/shoes/clown_shoes(M) ADD_TRAIT(C, TRAIT_NODROP, DISEASE_TRAIT) - M.equip_to_slot_or_del(C, SLOT_SHOES) + M.equip_to_slot_or_del(C, ITEM_SLOT_FEET) return diff --git a/code/datums/diseases/advance/symptoms/macrophage.dm b/code/datums/diseases/advance/symptoms/macrophage.dm index 1c39badae17f1..3125056ad8989 100644 --- a/code/datums/diseases/advance/symptoms/macrophage.dm +++ b/code/datums/diseases/advance/symptoms/macrophage.dm @@ -4,11 +4,13 @@ stealth = -4 resistance = 1 stage_speed = -2 - transmittable = 2 + transmission = 2 level = 9 severity = 2 symptom_delay_min = 30 symptom_delay_max = 60 + prefixes = list("Ambulant ", "Macro") + bodies = list("Phage") var/gigagerms = FALSE var/netspeed = 0 var/phagecounter = 10 @@ -21,14 +23,14 @@ /datum/symptom/macrophage/severityset(datum/disease/advance/A) . = ..() - if(A.properties["transmittable"] >= 10) + if(A.transmission >= 10) severity += 2 /datum/symptom/macrophage/Start(datum/disease/advance/A) if(!..()) return - netspeed = max(1, (A.properties["stage_rate"])) - if(A.properties["transmittable"] >= 10) + netspeed = max(1, A.stage_rate) + if(A.transmission >= 10) gigagerms = TRUE /datum/symptom/macrophage/Activate(datum/disease/advance/A) @@ -42,7 +44,7 @@ M.visible_message("Lumps form on [M]'s skin!", \ "You cringe in pain as lumps form and move around on your skin!") if(5) - phagecounter -= max(2, A.properties["stage_rate"]) + phagecounter -= max(2, A.stage_rate) if(gigagerms && phagecounter <= 0) //only ever spawn one big germ Burst(A, M, TRUE) phagecounter += 10 @@ -54,25 +56,24 @@ var/mob/living/simple_animal/hostile/macrophage/phage if(gigagerms) phage = new /mob/living/simple_animal/hostile/macrophage/aggro(M.loc) - phage.melee_damage = max(5, A.properties["resistance"]) + phage.melee_damage = max(5, A.resistance) M.apply_damage(rand(10, 20)) playsound(M, 'sound/effects/splat.ogg', 50, 1) M.emote("scream") else phage = new(M.loc) M.apply_damage(rand(1, 7)) - phage.health += A.properties["resistance"] - phage.maxHealth += A.properties["resistance"] + phage.health += A.resistance + phage.maxHealth += A.resistance phage.infections += A phage.basedisease = A - if(A.properties["transmittable"] >= 12) + if(A.transmission >= 12) for(var/datum/disease/D in M.diseases) if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS) || (D.spread_flags & DISEASE_SPREAD_FALTERED)) continue if(D == A) continue phage.infections += D - phage.InitializeSkin() M.visible_message("A strange creature bursts out of [M]!", \ "A slimy creature bursts forth from your flesh!") addtimer(CALLBACK(phage, /mob/living/simple_animal/hostile/macrophage.proc/shrivel), 3000) diff --git a/code/datums/diseases/advance/symptoms/nanites.dm b/code/datums/diseases/advance/symptoms/nanites.dm index 87c4f4f73cf97..39328231454cb 100644 --- a/code/datums/diseases/advance/symptoms/nanites.dm +++ b/code/datums/diseases/advance/symptoms/nanites.dm @@ -4,11 +4,13 @@ stealth = 0 resistance = 2 stage_speed = 2 - transmittable = -1 + transmission = -1 level = 7 severity = 0 symptom_delay_min = 1 symptom_delay_max = 1 + prefixes = list("Nano-") + suffixes = list(" Silicophilia") var/reverse_boost = FALSE threshold_desc = "Transmission 5: Increases the virus' growth rate while nanites are present.
\ Stage Speed 7: Increases the replication boost." @@ -16,9 +18,9 @@ /datum/symptom/nano_boost/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["transmittable"] >= 5) //reverse boost + if(A.transmission >= 5) //reverse boost reverse_boost = TRUE - if(A.properties["stage_rate"] >= 7) //more nanites + if(A.stage_rate >= 7) //more nanites power = 2 /datum/symptom/nano_boost/Activate(datum/disease/advance/A) @@ -36,18 +38,20 @@ NP.software_error(rand(3, 4)) //activate, deactivate, or trigger the nanites if(A.stage >= 4) M.heal_overall_damage((0.5 * power), (0.5 * power), required_status = BODYPART_ROBOTIC) - + /datum/symptom/nano_destroy name = "Silicolysis" desc = "The virus reacts to nanites in the host's bloodstream by attacking and consuming them. May also cause nanites to go haywire. Damages the host's mechanical limbs" stealth = 0 resistance = 4 stage_speed = -1 - transmittable = 1 + transmission = 1 level = 7 severity = 0 symptom_delay_min = 1 symptom_delay_max = 1 + prefixes = list("Nano-") + suffixes = list(" Silicophobia") var/reverse_boost = FALSE threshold_desc = "Stage Speed 5: Increases the virus' growth rate while nanites are present.
\ Resistance 7: Severely increases the rate at which the nanites are destroyed." @@ -55,9 +59,9 @@ /datum/symptom/nano_destroy/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stage_rate"] >= 5) //reverse boost + if(A.stage_rate >= 5) //reverse boost reverse_boost = TRUE - if(A.properties["resistance"] >= 7) //more nanites + if(A.resistance >= 7) //more nanites power = 3 /datum/symptom/nano_destroy/Activate(datum/disease/advance/A) @@ -76,4 +80,4 @@ else if(prob(2)) NP.software_error() if(A.stage >= 4) - M.take_overall_damage((1 * power), required_status = BODYPART_ROBOTIC) \ No newline at end of file + M.take_overall_damage((1 * power), required_status = BODYPART_ROBOTIC) diff --git a/code/datums/diseases/advance/symptoms/narcolepsy.dm b/code/datums/diseases/advance/symptoms/narcolepsy.dm index 42d939736a8d5..ae56ee278b21a 100644 --- a/code/datums/diseases/advance/symptoms/narcolepsy.dm +++ b/code/datums/diseases/advance/symptoms/narcolepsy.dm @@ -18,11 +18,13 @@ Bonus stealth = 1 resistance = -2 stage_speed = -3 - transmittable = -2 + transmission = -2 level = 6 symptom_delay_min = 10 symptom_delay_max = 30 severity = 2 + prefixes = list("Lazy ", "Yawning ") + bodies = list("Sleep") var/sleep_level = 0 var/sleepy_ticks = 0 var/stamina = FALSE @@ -31,15 +33,15 @@ Bonus /datum/symptom/narcolepsy/severityset(datum/disease/advance/A) . = ..() - if(A.properties["resistance"] >= 10) //act more often + if(A.resistance >= 10) //act more often severity += 1 /datum/symptom/narcolepsy/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["transmittable"] >= 7) //stamina damage + if(A.transmission >= 7) //stamina damage stamina = TRUE - if(A.properties["resistance"] >= 10) //act more often + if(A.resistance >= 10) //act more often symptom_delay_min = 5 symptom_delay_max = 20 diff --git a/code/datums/diseases/advance/symptoms/necropolis.dm b/code/datums/diseases/advance/symptoms/necropolis.dm index 92143539f7cd0..d8828f47d13f2 100644 --- a/code/datums/diseases/advance/symptoms/necropolis.dm +++ b/code/datums/diseases/advance/symptoms/necropolis.dm @@ -4,7 +4,7 @@ stealth = 0 resistance = 3 stage_speed = -10 - transmittable = -3 + transmission = -3 level = 9 base_message_chance = 5 severity = -1 @@ -13,6 +13,8 @@ var/tendrils = FALSE var/chest = FALSE var/fireproof = FALSE + prefixes = list("Lava ", "Lavaland ", "Eldritch ") + bodies = list("Goliath", "Tentacle", "Carapace") threshold_desc = "Stealth 8: Upon death, the host's soul will solidify into an unholy artifact, rendering them utterly unrevivable in the process.
\ Resistance 15: The area near the host roils with paralyzing tendrils.
\ Resistance 20: Host becomes immune to heat, ash, and lava" @@ -22,20 +24,21 @@ /datum/symptom/necroseed/severityset(datum/disease/advance/A) . = ..() - if(A.properties["stealth"] >= 8) + if(A.stealth >= 8) severity += 2 - if(A.properties["resistance"] >= 20) + if(A.resistance >= 20) severity -= 1 /datum/symptom/necroseed/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["resistance"] >= 15) + if(A.resistance >= 15) tendrils = TRUE - if(A.properties["stealth"] >= 8) + if(A.resistance >= 20) + fireproof = TRUE + if(A.stealth >= 8) chest = TRUE - if(A.properties["resistance"] >= 20) - fireproof = TRUE + /datum/symptom/necroseed/Activate(datum/disease/advance/A) if(!..()) @@ -77,7 +80,7 @@ LAZYCLEARLIST(cached_tentacle_turfs) last_location = loc tentacle_recheck_cooldown = world.time + initial(tentacle_recheck_cooldown) - for(var/turf/open/T in orange(2, loc)) + for(var/turf/open/T in (RANGE_TURFS(1, loc)-loc)) LAZYADD(cached_tentacle_turfs, T) for(var/t in cached_tentacle_turfs) if(isopenturf(t)) @@ -107,18 +110,13 @@ if(!..()) return var/mob/living/M = A.affected_mob - if(chest && A.stage == 5 && M.mind) + if(chest && A.stage >= 5 && M.mind) to_chat(M, "Your soul is ripped from your body!") M.visible_message("An unearthly roar shakes the ground as [M] explodes into a shower of gore, leaving behind an ominous, fleshy chest.") playsound(M.loc,'sound/effects/tendril_destroyed.ogg', 200, 0, 50, 1, 1) M.hellbound = TRUE - M.gib() - if(ishuman(M)) //We don't NEED them to be human. However, I want to avoid people making teratoma-farms for necrochests - var/mob/living/carbon/human/H = M - var/S = H.dna.species - if(istype(S, /datum/species/golem) || istype(S, /datum/species/jelly)) //nope. sorry, xenobio. - return - else + addtimer(CALLBACK(M, /mob/proc/gib), 0.5 SECONDS) //we can't gib mob while it's already dying + if(!ishuman(M) || HAS_TRAIT(M, TRAIT_NONECRODISEASE)) //We don't NEED them to be human. However, I want to avoid people making teratoma-farms for necrochests return new /obj/structure/closet/crate/necropolis/tendril(M.loc) diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm index fa19acfd0e6bf..009b55ab8a1e0 100644 --- a/code/datums/diseases/advance/symptoms/oxygen.dm +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -22,14 +22,15 @@ Bonus stealth = 1 resistance = -3 stage_speed = -3 - transmittable = -4 + transmission = -4 severity = -1 level = 6 base_message_chance = 5 symptom_delay_min = 1 symptom_delay_max = 1 + prefixes = list("Breathless ", "Anaerobic ") var/regenerate_blood = FALSE - var/gas_type = /datum/gas/miasma + var/gas_type = GAS_MIASMA var/base_moles = 3 var/emote = "fart" threshold_desc = "Resistance 8: Additionally regenerates lost blood.
" @@ -37,7 +38,7 @@ Bonus /datum/symptom/oxygen/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["resistance"] >= 8) //blood regeneration + if(A.resistance >= 8) //blood regeneration regenerate_blood = TRUE /datum/symptom/oxygen/Activate(datum/disease/advance/A) @@ -50,7 +51,7 @@ Bonus M.adjustOxyLoss(-7, 0) M.losebreath = max(0, M.losebreath - 4) if(regenerate_blood && M.blood_volume < BLOOD_VOLUME_NORMAL) - M.blood_volume += 1 + M.blood_volume += 8 //it takes 4 seconds to lose one point of bleed_rate. this is exactly sufficient to counter autophageocytosis' Heparin production. Theoretically. if(prob(1) && prob(50)) var/turf/open/T = get_turf(M) if(!istype(T)) @@ -61,7 +62,7 @@ Bonus M.emote(emote) else if(prob(base_message_chance)) - to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.", "Something smells rotten", "You feel peckish")]") + to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.", "Something smells rotten.", "You feel peckish.")]") return /datum/symptom/oxygen/on_stage_change(new_stage, datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/pierrot.dm b/code/datums/diseases/advance/symptoms/pierrot.dm index fc59f983f0884..431774bfce6c7 100644 --- a/code/datums/diseases/advance/symptoms/pierrot.dm +++ b/code/datums/diseases/advance/symptoms/pierrot.dm @@ -4,7 +4,7 @@ stealth = -1 resistance = 3 stage_speed = 1 - transmittable = 2 + transmission = 2 level = 0 severity = 0 symptom_delay_min = 2 @@ -18,20 +18,22 @@ /datum/symptom/pierrot/severityset(datum/disease/advance/A) . = ..() - if(A.properties["resistance"] >= 10) + bodies = list("Clown", "Red-Nose", "[pick(GLOB.clown_names)]") //added here because it doesnt wanna pick in base vars + prefixes = list("Fool's ", "[pick(GLOB.clown_names)]'s ") + if(A.resistance >= 10) severity +=1 - if(A.properties["resistance"] >= 15) - severity += 2 + if(A.resistance >= 15) + severity += 2 /datum/symptom/pierrot/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["transmission"] >= 10) + if(A.transmission >= 10) honkspread = TRUE - if(A.properties["resistance"] >= 10) + if(A.resistance >= 10) clownmask = TRUE - if(A.properties["resistance"] >= 15) - clumsy = TRUE + if(A.resistance >= 15) + clumsy = TRUE /datum/symptom/pierrot/Activate(datum/disease/advance/A) if(!..()) @@ -72,15 +74,15 @@ var/mob/living/carbon/human/M = A.affected_mob if(istype(M.wear_mask, /obj/item/clothing/mask/gas/clown_hat)) REMOVE_TRAIT(M.wear_mask, TRAIT_NODROP, DISEASE_TRAIT) - + /datum/symptom/pierrot/proc/give_clown_mask(datum/disease/advance/A) if(ishuman(A.affected_mob)) - var/mob/living/carbon/human/M = A.affected_mob + var/mob/living/carbon/human/M = A.affected_mob if(!istype(M.wear_mask, /obj/item/clothing/mask/gas/clown_hat)) if(!M.dropItemToGround(M.wear_mask)) qdel(M.wear_mask) var/obj/item/clothing/C = new /obj/item/clothing/mask/gas/clown_hat(M) ADD_TRAIT(C, TRAIT_NODROP, DISEASE_TRAIT) - M.equip_to_slot_or_del(C, SLOT_WEAR_MASK) + M.equip_to_slot_or_del(C, ITEM_SLOT_MASK) return diff --git a/code/datums/diseases/advance/symptoms/radiation.dm b/code/datums/diseases/advance/symptoms/radiation.dm index c72b460b01816..76c0a11bb7ce9 100644 --- a/code/datums/diseases/advance/symptoms/radiation.dm +++ b/code/datums/diseases/advance/symptoms/radiation.dm @@ -4,24 +4,26 @@ stealth = -1 resistance = 2 stage_speed = -1 - transmittable = 2 + transmission = 2 level = 8 severity = 3 symptom_delay_min = 10 symptom_delay_max = 40 + prefixes = list("Gamma ") + bodies = list("Radiation") var/fastrads = FALSE var/radothers = FALSE threshold_desc = "Speed 8: Host takes radiation damage faster." /datum/symptom/radiation/severityset(datum/disease/advance/A) . = ..() - if(A.properties["stage_rate"] >= 8) + if(A.stage_rate >= 8) severity += 1 /datum/symptom/radiation/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stage_rate"] >= 8) + if(A.stage_rate >= 8) fastrads = TRUE /datum/symptom/radiation/Activate(datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 7c58044f48b22..d7547d79bd1b7 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -4,11 +4,12 @@ stealth = -1 resistance = -2 stage_speed = 1 - transmittable = -3 + transmission = -3 level = 5 severity = -1 symptom_delay_min = 5 symptom_delay_max = 10 + bodies = list("Neuron") var/purge_alcohol = FALSE var/trauma_heal_mild = FALSE var/trauma_heal_severe = FALSE @@ -19,11 +20,11 @@ /datum/symptom/mind_restoration/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["resistance"] >= 6) //heal brain damage + if(A.resistance >= 6) //heal brain damage trauma_heal_mild = TRUE - if(A.properties["resistance"] >= 9) //heal severe traumas - trauma_heal_severe = TRUE - if(A.properties["transmittable"] >= 8) //purge alcohol + if(A.resistance >= 9) //heal severe traumas + trauma_heal_severe = TRUE + if(A.transmission >= 8) //purge alcohol purge_alcohol = TRUE /datum/symptom/mind_restoration/Activate(var/datum/disease/advance/A) @@ -69,7 +70,7 @@ stealth = 0 resistance = 1 stage_speed = -2 - transmittable = 2 + transmission = 2 level = 4 severity = -1 base_message_chance = 7 @@ -106,4 +107,4 @@ eyes.applyOrganDamage(-1) else if(prob(base_message_chance)) - to_chat(M, "[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your healing feels more acute.")]") \ No newline at end of file + to_chat(M, "[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your healing feels more acute.")]") diff --git a/code/datums/diseases/advance/symptoms/shedding.dm b/code/datums/diseases/advance/symptoms/shedding.dm index 2f0ec1422a429..9a58c4b830c10 100644 --- a/code/datums/diseases/advance/symptoms/shedding.dm +++ b/code/datums/diseases/advance/symptoms/shedding.dm @@ -20,12 +20,13 @@ BONUS stealth = 0 resistance = 3 stage_speed = 2 - transmittable = 2 + transmission = 2 level = 4 severity = 0 base_message_chance = 50 symptom_delay_min = 45 symptom_delay_max = 90 + bodies = list("Bald", "Scalp") /datum/symptom/shedding/Activate(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm index e546d46403690..895f1d2e73070 100644 --- a/code/datums/diseases/advance/symptoms/shivering.dm +++ b/code/datums/diseases/advance/symptoms/shivering.dm @@ -21,30 +21,32 @@ Bonus stealth = 0 resistance = 2 stage_speed = 2 - transmittable = 2 + transmission = 2 level = 2 severity = 0 symptom_delay_min = 10 symptom_delay_max = 30 + bodies = list("Shiver") + suffixes = list(" Shivers") var/unsafe = FALSE //over the cold threshold threshold_desc = "Stage Speed 5: Increases cooling speed; the host can fall below safe temperature levels.
\ Stage Speed 10: Further increases cooling speed." /datum/symptom/shivering/severityset(datum/disease/advance/A) . = ..() - if(A.properties["stage_rate"] >= 5) //dangerous cold - severity += 1 - if(A.properties["stage_rate"] >= 10) + if(A.stage_rate >= 5) //dangerous cold severity += 1 + if(A.stage_rate >= 10) + severity += 1 /datum/symptom/shivering/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stage_rate"] >= 5) //dangerous cold + if(A.stage_rate >= 5) //dangerous cold power = 1.5 unsafe = TRUE - if(A.properties["stage_rate"] >= 10) - power = 2.5 + if(A.stage_rate >= 10) + power = 2.5 /datum/symptom/shivering/Activate(datum/disease/advance/A) if(!..()) @@ -63,4 +65,4 @@ Bonus if(unsafe) limit = 0 M.adjust_bodytemperature(-get_cold * A.stage, limit) - return 1 \ No newline at end of file + return 1 diff --git a/code/datums/diseases/advance/symptoms/skin.dm b/code/datums/diseases/advance/symptoms/skin.dm index 2a9cd4c3792f9..ff3e7310e7e46 100644 --- a/code/datums/diseases/advance/symptoms/skin.dm +++ b/code/datums/diseases/advance/symptoms/skin.dm @@ -21,11 +21,13 @@ BONUS stealth = 2 resistance = 0 stage_speed = 3 - transmittable = 1 + transmission = 1 level = 5 severity = 0 symptom_delay_min = 25 symptom_delay_max = 75 + prefixes = list("White ", "Light ") + bodies = list("Albinism") var/cachedcolor = null /datum/symptom/vitiligo/Start(datum/disease/advance/A) @@ -91,11 +93,13 @@ BONUS stealth = 1 resistance = 2 stage_speed = 1 - transmittable = 2 + transmission = 2 level = 5 severity = 0 symptom_delay_min = 7 symptom_delay_max = 14 + prefixes = list("Black ", "Dark ") + bodies = list("Melanism") var/cachedcolor = null /datum/symptom/revitiligo/Start(datum/disease/advance/A) @@ -161,12 +165,14 @@ BONUS stealth = 0 resistance = 1 stage_speed = 4 - transmittable = 1 + transmission = 1 level = 0 severity = 0 base_message_chance = 50 symptom_delay_min = 45 symptom_delay_max = 90 + prefixes = list("Rainbow ", "Chromatic ") + bodies = list("Pigment") /datum/symptom/polyvitiligo/Activate(datum/disease/advance/A) if(!..()) @@ -181,3 +187,149 @@ BONUS else if (prob(50)) // spam M.visible_message("[M] looks rather vibrant.", "The colors, man, the colors.") + +/************************************ +Dermagraphic Ovulogenesis + + Extremely Noticeable + Increases resistance slightly. + Not Fast, Not Slow + Transmittable. + High Level + +BONUS + Provides Brute Healing when Egg Sacs/Eggs are eaten, simultaneously infecting anyone who eats them + +***********************************/ +/datum/symptom/skineggs //Thought Exolocomotive Xenomitosis was a weird symptom? Well, this is about 10x weirder. + name = "Dermagraphic Ovulogenesis" + desc = "The virus causes the host to grow egg-like nodules on their skin, which periodically fall off and contain the disease and some healing chemicals." + stealth = -3 //You are basically growing these weird Egg shits on your skin, this is not stealthy in the slightest + resistance = 1 + stage_speed = 0 + transmission = 2 //The symptom is in it of itself meant to spread + level = 9 + severity = -1 + base_message_chance = 50 + symptom_delay_min = 60 + symptom_delay_max = 105 + prefixes = list("Ovi ") + bodies = list("Oviposition", "Nodule") + suffixes = list(" Mitosis") + var/big_heal + var/all_disease + var/eggsplosion + var/sneaky + threshold_desc = "Transmission 12: Eggs and Egg Sacs contain all diseases on the host, instead of just the disease containing the symptom.
\ + Transmission 16: Egg Sacs will 'explode' into eggs after a period of time, covering a larger area with infectious matter.
\ + Resistance 10: Eggs and Egg Sacs contain more healing chems.
\ + Stealth 6: Eggs and Egg Sacs become nearly transparent, making them more difficult to see.
\ + Stage Speed 10: Egg Sacs fall off the host more frequently." + +/datum/symptom/skineggs/severityset(datum/disease/advance/A) + . = ..() + if(A.resistance >= 10) + severity -= 1 + if(A.transmission >= 12) + severity += 1 + if(A.transmission >= 16) + severity += 1 + if(A.stealth >= 6) + severity += 1 + +/datum/symptom/skineggs/Start(datum/disease/advance/A) + if(!..()) + return + if(A.resistance >= 10) + big_heal = TRUE + if(A.transmission >= 12) + all_disease = TRUE + if(A.transmission >= 16) + eggsplosion = TRUE //Haha get it? + if(A.stealth >= 6) + sneaky = TRUE + if(A.stage_rate >= 10) + symptom_delay_min -= 10 + symptom_delay_max -= 20 + + +/datum/symptom/skineggs/Activate(datum/disease/advance/A) + if(!..()) + return + var/mob/living/M = A.affected_mob + var/list/diseases = list(A) + switch(A.stage) + if(5) + if(all_disease) + for(var/datum/disease/D in M.diseases) + if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS) || (D.spread_flags & DISEASE_SPREAD_FALTERED)) + continue + if(D == A) + continue + diseases += D + new /obj/item/reagent_containers/food/snacks/eggsac(M.loc, diseases, eggsplosion, sneaky, big_heal) + +#define EGGSPLODE_DELAY 100 SECONDS +/obj/item/reagent_containers/food/snacks/eggsac + name = "Fleshy Egg Sac" + desc = "A small Egg Sac which appears to be made out of someone's flesh!" + customfoodfilling = FALSE //Not Used For Filling + icon = 'icons/obj/food/food.dmi' + icon_state = "eggsac" + bitesize = 4 + var/list/diseases = list() + var/sneaky_egg + var/big_heal + +//Constructor +/obj/item/reagent_containers/food/snacks/eggsac/New(loc, var/list/disease, var/eggsplodes, var/sneaky, var/large_heal) + ..() + for(var/datum/disease/D in disease) + diseases += D + if(large_heal) + reagents.add_reagent_list(list(/datum/reagent/medicine/bicaridine = 20, /datum/reagent/medicine/tricordrazine = 10)) + reagents.add_reagent(/datum/reagent/blood, 10, diseases) + big_heal = TRUE + else + reagents.add_reagent_list(list(/datum/reagent/medicine/bicaridine = 10, /datum/reagent/medicine/tricordrazine = 10)) + reagents.add_reagent(/datum/reagent/blood, 15, diseases) + if(sneaky) + icon_state = "eggsac-sneaky" + sneaky_egg = sneaky + if(eggsplodes) + addtimer(CALLBACK(src, .proc/eggsplode), EGGSPLODE_DELAY) + if(LAZYLEN(diseases)) + AddComponent(/datum/component/infective, diseases) + +#undef EGGSPLODE_DELAY + +/obj/item/reagent_containers/food/snacks/eggsac/proc/eggsplode() + for(var/i = 1, i <= rand(4,8), i++) + var/list/directions = GLOB.alldirs + var/obj/item/I = new /obj/item/reagent_containers/food/snacks/fleshegg(src.loc, diseases, sneaky_egg, big_heal) + var/turf/thrown_at = get_ranged_target_turf(I, pick(directions), rand(2, 4)) + I.throw_at(thrown_at, rand(2,4), 4) + +/obj/item/reagent_containers/food/snacks/fleshegg + name = "Fleshy Egg" + desc = "An Egg which appears to be made out of someone's flesh!" + customfoodfilling = FALSE //Not Used For Filling + icon = 'icons/obj/food/food.dmi' + icon_state = "fleshegg" + bitesize = 1 + var/list/diseases = list() + +/obj/item/reagent_containers/food/snacks/fleshegg/New(loc, var/list/disease, var/sneaky, var/large_heal) + ..() + for(var/datum/disease/D in disease) + diseases += D + if(large_heal) + reagents.add_reagent_list(list(/datum/reagent/medicine/bicaridine = 20, /datum/reagent/medicine/tricordrazine = 10)) + reagents.add_reagent(/datum/reagent/blood, 10, diseases) + else + reagents.add_reagent_list(list(/datum/reagent/medicine/bicaridine = 10, /datum/reagent/medicine/tricordrazine = 10)) + reagents.add_reagent(/datum/reagent/blood, 15, diseases) + if(sneaky) + icon_state = "fleshegg-sneaky" + if(LAZYLEN(diseases)) + AddComponent(/datum/component/infective, diseases) diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm index 4773b85386441..cbb12c3176f29 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -21,17 +21,19 @@ Bonus stealth = -2 resistance = 3 stage_speed = 0 - transmittable = 4 + transmission = 4 level = 1 severity = 0 symptom_delay_min = 5 symptom_delay_max = 35 + prefixes = list("Nasal ") + bodies = list("Cold") threshold_desc = "Stealth 4: The symptom remains hidden until active." /datum/symptom/sneeze/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stealth"] >= 4) + if(A.stealth >= 4) suppress_warning = TRUE /datum/symptom/sneeze/Activate(datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/species.dm b/code/datums/diseases/advance/symptoms/species.dm index 13257f4018f7a..e1ce14f809d17 100644 --- a/code/datums/diseases/advance/symptoms/species.dm +++ b/code/datums/diseases/advance/symptoms/species.dm @@ -4,9 +4,10 @@ stealth = 2 resistance = 2 stage_speed = 2 - transmittable = 0 + transmission = 0 level = 5 severity = 0 + prefixes = list("Zombie ") /datum/symptom/undead_adaptation/OnAdd(datum/disease/advance/A) A.process_dead = TRUE @@ -22,12 +23,14 @@ stealth = -1 resistance = 4 stage_speed = -2 - transmittable = 3 + transmission = 3 level = 5 severity = 0 + prefixes = list("Crystalline ") + /datum/symptom/inorganic_adaptation/OnAdd(datum/disease/advance/A) A.infectable_biotypes |= MOB_INORGANIC /datum/symptom/inorganic_adaptation/OnRemove(datum/disease/advance/A) - A.infectable_biotypes -= MOB_INORGANIC \ No newline at end of file + A.infectable_biotypes -= MOB_INORGANIC diff --git a/code/datums/diseases/advance/symptoms/spiked.dm b/code/datums/diseases/advance/symptoms/spiked.dm index 25cadd2ac86c5..f30a91169d121 100644 --- a/code/datums/diseases/advance/symptoms/spiked.dm +++ b/code/datums/diseases/advance/symptoms/spiked.dm @@ -19,12 +19,14 @@ Thresholds stealth = -3 resistance = 3 stage_speed = -3 - transmittable = 0 + transmission = 0 level = 0 symptom_delay_min = 1 symptom_delay_max = 1 severity = 1 base_message_chance = 5 + prefixes = list("Thorny ", "Horned ") + bodies = list("Horn", "Spiked") var/Power = 1 var/armor = 0 var/done = FALSE @@ -33,15 +35,15 @@ Thresholds /datum/symptom/spiked/severityset(datum/disease/advance/A) . = ..() - if(A.properties["resistance"] >= 6) + if(A.resistance >= 6) severity -= 1 /datum/symptom/spiked/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["resistance"] >= 6) //armor. capped at 20, but scaling with resistance, so if you want to max out spiked skin armor, you'll have to make several sacrifices - armor = min(20, A.properties["resistance"]) - if(A.properties["transmittable"] >= 6) //higher damage + if(A.resistance >= 6) //armor. capped at 20, but scaling with resistance, so if you want to max out spiked skin armor, you'll have to make several sacrifices + armor = min(20, A.resistance) + if(A.transmission >= 6) //higher damage Power = 1.4 //the typical +100% is waaaay too strong here when the symptom is stacked. +40% is sufficient /datum/symptom/spiked/Activate(var/datum/disease/advance/A) @@ -69,7 +71,7 @@ Thresholds C.apply_damage(1*power, BRUTE, blocked = def_check) C.visible_message("[C.name] is pricked on [H.name]'s spikes.") playsound(get_turf(C), 'sound/weapons/slice.ogg', 50, 1) - for(var/mob/living/carbon/C in oview(1, H)) + for(var/mob/living/carbon/C in ohearers(1, H)) if(C.pulling && C.pulling == H) var/def_check = C.getarmor(type = "melee") C.apply_damage(3*power, BRUTE, blocked = def_check) diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm index 330efc860bc4c..f83b61769f93d 100644 --- a/code/datums/diseases/advance/symptoms/symptoms.dm +++ b/code/datums/diseases/advance/symptoms/symptoms.dm @@ -8,7 +8,7 @@ var/stealth = 0 var/resistance = 0 var/stage_speed = 0 - var/transmittable = 0 + var/transmission = 0 // The type level of the symptom. Higher is harder to generate. var/level = -1 // The severity level of the symptom. Higher is more dangerous. @@ -29,6 +29,9 @@ var/neutered = FALSE var/list/thresholds var/naturally_occuring = TRUE //if this symptom can appear from /datum/disease/advance/GenerateSymptoms() + var/list/prefixes = list() + var/list/bodies = list() + var/list/suffixes = list() /datum/symptom/New() var/list/S = SSdisease.list_symptoms diff --git a/code/datums/diseases/advance/symptoms/viral.dm b/code/datums/diseases/advance/symptoms/viral.dm index 9fd9d5a03e497..a6d4a33d4980f 100644 --- a/code/datums/diseases/advance/symptoms/viral.dm +++ b/code/datums/diseases/advance/symptoms/viral.dm @@ -19,8 +19,9 @@ BONUS stealth = 3 resistance = 5 stage_speed = -3 - transmittable = 0 + transmission = 0 level = 3 + prefixes = list("Chronic ") /* ////////////////////////////////////// @@ -44,8 +45,9 @@ BONUS stealth = -2 resistance = -3 stage_speed = 5 - transmittable = 3 + transmission = 3 level = 3 + prefixes = list("Unstable ") /* ////////////////////////////////////// @@ -65,7 +67,7 @@ Bonus ////////////////////////////////////// */ -/datum/symptom/viralreverse +/datum/symptom/viralreverse name = "Viral aggressive metabolism" desc = "The virus sacrifices its long term survivability to nearly instantly fully spread inside a host. \ @@ -73,14 +75,15 @@ Bonus stealth = 1 resistance = -4 stage_speed = 3 - transmittable = -3 + transmission = -3 level = 3 symptom_delay_min = 1 symptom_delay_max = 1 + prefixes = list("Spontaneous ") var/time_to_cure threshold_desc = "Resistance/Stage Speed: Highest between these determines the amount of time before self-curing.
\ - Stealth 4 Doubles the time before the virus self-cures" - + Stealth 4 Doubles the time before the virus self-cures" + /datum/symptom/viralreverse/Activate(datum/disease/advance/A) if(!..()) @@ -95,12 +98,12 @@ Bonus A.stage -= 1 if(A.stage < 2) to_chat(M, "You suddenly feel healthy.") - A.cure() + A.cure(FALSE) //Doesn't Add Resistance. Virology can now make potions for stuff, be it healing the senses or making people explode /datum/symptom/viralreverse/Start(datum/disease/advance/A) if(!..()) return A.stage = 5 - if(A.properties["stealth"] >= 4) //more time before it's cured + if(A.stealth >= 4) //more time before it's cured power = 2 - time_to_cure = max(A.properties["resistance"], A.properties["stage_rate"]) * 10 * power + time_to_cure = max(A.resistance, A.stage_rate) * 10 * power diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index ffc639b860312..0777fcdd8e2eb 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -22,27 +22,30 @@ Bonus stealth = -1 resistance = -3 stage_speed = -4 - transmittable = -2 + transmission = -2 level = 5 severity = 3 base_message_chance = 50 symptom_delay_min = 25 symptom_delay_max = 80 + prefixes = list("Eye ") + bodies = list("Blind") + suffixes = list(" Blindness") var/remove_eyes = FALSE threshold_desc = "Resistance 12: Weakens extraocular muscles, eventually leading to complete detachment of the eyes.
\ Stealth 4: The symptom remains hidden until active." /datum/symptom/visionloss/severityset(datum/disease/advance/A) . = ..() - if(A.properties["resistance"] >= 12) //goodbye eyes + if(A.resistance >= 12) //goodbye eyes severity += 1 /datum/symptom/visionloss/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stealth"] >= 4) + if(A.stealth >= 4) suppress_warning = TRUE - if(A.properties["resistance"] >= 12) //goodbye eyes + if(A.resistance >= 12) //goodbye eyes remove_eyes = TRUE /datum/symptom/visionloss/Activate(datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/advance/symptoms/voice_change.dm index faf9de3678952..3d08e65e205b7 100644 --- a/code/datums/diseases/advance/symptoms/voice_change.dm +++ b/code/datums/diseases/advance/symptoms/voice_change.dm @@ -6,7 +6,7 @@ Voice Change Noticeable. Lowers resistance. Decreases stage speed. - Increased transmittable. + Increased transmission. Fatal Level. Bonus @@ -22,12 +22,13 @@ Bonus stealth = -1 resistance = -2 stage_speed = -2 - transmittable = 2 + transmission = 2 level = 6 severity = 2 base_message_chance = 100 symptom_delay_min = 60 symptom_delay_max = 120 + prefixes = list("Vocal ") var/scramble_language = FALSE var/datum/language/current_language threshold_desc = "Transmission 14: The host's language center of the brain is damaged, leading to complete inability to speak or understand any language.
\ @@ -36,19 +37,20 @@ Bonus /datum/symptom/voice_change/severityset(datum/disease/advance/A) . = ..() - if(A.properties["transmittable"] >= 14) //random language + if(A.transmission >= 14) //random language + bodies += list("Polyglot") severity += 1 /datum/symptom/voice_change/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stealth"] >= 3) + if(A.stealth >= 3) suppress_warning = TRUE - if(A.properties["stage_rate"] >= 7) //faster change of voice + if(A.stage_rate >= 7) //faster change of voice base_message_chance = 25 symptom_delay_min = 25 symptom_delay_max = 85 - if(A.properties["transmittable"] >= 14) //random language + if(A.transmission >= 14) //random language scramble_language = TRUE /datum/symptom/voice_change/Activate(datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm index 504b697e7d85d..0ed1b31d01db8 100644 --- a/code/datums/diseases/advance/symptoms/vomit.dm +++ b/code/datums/diseases/advance/symptoms/vomit.dm @@ -26,12 +26,15 @@ Bonus stealth = -2 resistance = 1 stage_speed = 0 - transmittable = 2 + transmission = 2 level = 3 severity = 1 base_message_chance = 100 symptom_delay_min = 25 symptom_delay_max = 80 + prefixes = list("Digestive ") + bodies = list("Vomit") + suffixes = list(" Emission") var/vomit_blood = FALSE var/proj_vomit = 0 threshold_desc = "Resistance 7: Host will vomit blood, causing internal damage.
\ @@ -41,11 +44,11 @@ Bonus /datum/symptom/vomit/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stealth"] >= 4) + if(A.stealth >= 4) suppress_warning = TRUE - if(A.properties["resistance"] >= 7) //blood vomit + if(A.resistance >= 7) //blood vomit vomit_blood = TRUE - if(A.properties["transmittable"] >= 7) //projectile vomit + if(A.transmission >= 7) //projectile vomit proj_vomit = 5 /datum/symptom/vomit/Activate(datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm index da1a1f6a40665..52b89c0c261be 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/advance/symptoms/weight.dm @@ -6,7 +6,7 @@ Weight Loss Very Very Noticable. Decreases resistance. Decreases stage speed. - Reduced Transmittable. + Reduced transmission. High level. Bonus @@ -23,18 +23,20 @@ Bonus stealth = -2 resistance = 2 stage_speed = -2 - transmittable = -1 + transmission = -1 level = 3 severity = 2 base_message_chance = 100 symptom_delay_min = 15 symptom_delay_max = 45 + prefixes = list("Starving ") + bodies = list("Diet") threshold_desc = "Stealth 2: The symptom is less noticeable." /datum/symptom/weight_loss/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["stealth"] >= 2) //warn less often + if(A.stealth >= 2) //warn less often base_message_chance = 25 /datum/symptom/weight_loss/Activate(datum/disease/advance/A) @@ -48,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.adjust_nutrition(-100) \ No newline at end of file + M.adjust_nutrition(-100) diff --git a/code/datums/diseases/advance/symptoms/wizarditis.dm b/code/datums/diseases/advance/symptoms/wizarditis.dm index 6dc5f1a1e1662..55e2e52852a55 100644 --- a/code/datums/diseases/advance/symptoms/wizarditis.dm +++ b/code/datums/diseases/advance/symptoms/wizarditis.dm @@ -4,29 +4,31 @@ stealth = 1 resistance = -2 stage_speed = -3 - transmittable = -1 + transmission = -1 level = 0 severity = 0 symptom_delay_min = 15 symptom_delay_max = 45 + prefixes = list("Wizard's ", "Magic ", "Accursed ") + bodies = list("Wizard") var/teleport = FALSE var/robes = FALSE - threshold_desc = "Transmission 14: The host teleports occasionally.
\ - Speed 7: The host grows a set of wizard robes." + threshold_desc = "Transmission 8: The host teleports occasionally.
\ + Stage Speed 7: The host grows a set of wizard robes." /datum/symptom/wizarditis/severityset(datum/disease/advance/A) . = ..() - if(A.properties["transmittable"] >= 12) + if(A.transmission >= 8) severity += 1 - if(A.properties["speed"] >= 7) + if(A.stage_rate >= 7) severity += 1 /datum/symptom/wizarditis/Start(datum/disease/advance/A) if(!..()) return - if(A.properties["transmission"] >= 14) + if(A.transmission >= 8) teleport = TRUE - if(A.properties["speed"] >= 7) + if(A.stage_rate >= 7) robes = TRUE /datum/symptom/wizarditis/Activate(datum/disease/advance/A) @@ -47,7 +49,7 @@ if(prob(30) && prob(50)) to_chat(M, "You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")].") - if(4) + if(4,5) if(prob(50)) M.say(pick("NEC CANTIO!","AULIE OXIN FIERA!","STI KALY!","EI NATH!")) @@ -71,7 +73,7 @@ qdel(H.head) C = new /obj/item/clothing/head/wizard(H) ADD_TRAIT(C, TRAIT_NODROP, DISEASE_TRAIT) - H.equip_to_slot_or_del(C, SLOT_HEAD) + H.equip_to_slot_or_del(C, ITEM_SLOT_HEAD) return if(prob(chance)) if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe)) @@ -79,7 +81,7 @@ qdel(H.wear_suit) C = new /obj/item/clothing/suit/wizrobe(H) ADD_TRAIT(C, TRAIT_NODROP, DISEASE_TRAIT) - H.equip_to_slot_or_del(C, SLOT_WEAR_SUIT) + H.equip_to_slot_or_del(C, ITEM_SLOT_OCLOTHING) return if(prob(chance)) if(!istype(H.shoes, /obj/item/clothing/shoes/sandal/magic)) @@ -87,7 +89,7 @@ qdel(H.shoes) C = new /obj/item/clothing/shoes/sandal/magic(H) ADD_TRAIT(C, TRAIT_NODROP, DISEASE_TRAIT) - H.equip_to_slot_or_del(C, SLOT_SHOES) + H.equip_to_slot_or_del(C, ITEM_SLOT_FEET) return else var/mob/living/carbon/H = A.affected_mob @@ -98,11 +100,11 @@ /datum/symptom/wizarditis/proc/teleport(datum/disease/advance/A) - var/turf/L = get_safe_random_station_turf() + var/turf/L = get_safe_random_station_turfs() A.affected_mob.say("SCYAR NILA!") do_teleport(A.affected_mob, L, forceMove = TRUE, channel = TELEPORT_CHANNEL_MAGIC) - playsound(get_turf(A.affected_mob), 'sound/weapons/zapbang.ogg', 50,1) - + playsound(get_turf(A.affected_mob), 'sound/weapons/zapbang.ogg', 50,1) + /datum/symptom/wizarditis/End(datum/disease/advance/A) if(ishuman(A.affected_mob)) var/mob/living/carbon/human/H = A.affected_mob @@ -113,5 +115,5 @@ if(istype(H.shoes, /obj/item/clothing/shoes/sandal/magic)) REMOVE_TRAIT(H.shoes, TRAIT_NODROP, DISEASE_TRAIT) - + diff --git a/code/datums/diseases/advance/symptoms/youth.dm b/code/datums/diseases/advance/symptoms/youth.dm index d2712a0146fdf..e43b0ab1d5129 100644 --- a/code/datums/diseases/advance/symptoms/youth.dm +++ b/code/datums/diseases/advance/symptoms/youth.dm @@ -23,11 +23,13 @@ BONUS stealth = 3 resistance = 4 stage_speed = 4 - transmittable = -4 + transmission = -4 level = 5 base_message_chance = 100 symptom_delay_min = 25 symptom_delay_max = 50 + prefixes = list("Eternal ") + bodies = list("Immortal", "Elixir") /datum/symptom/youth/Activate(datum/disease/advance/A) if(!..()) @@ -55,4 +57,4 @@ BONUS if(5) if(H.age > 21) H.age = 21 - to_chat(H, "You feel like you can take on the world!") \ No newline at end of file + to_chat(H, "You feel like you can take on the world!") diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm index 20ecceb224c2c..d039923f63231 100644 --- a/code/datums/diseases/anxiety.dm +++ b/code/datums/diseases/anxiety.dm @@ -9,7 +9,7 @@ agent = "Excess Lepidopticides" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) desc = "If left untreated subject will regurgitate butterflies." - severity = DISEASE_SEVERITY_MINOR + danger = DISEASE_MINOR /datum/disease/anxiety/stage_act() ..() @@ -38,4 +38,4 @@ "You cough up butterflies!") new /mob/living/simple_animal/butterfly(affected_mob.loc) new /mob/living/simple_animal/butterfly(affected_mob.loc) - return \ No newline at end of file + return diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 7a6ea142b3619..35a6040f02eec 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -7,7 +7,7 @@ viable_mobtypes = list(/mob/living/carbon/human) permeability_mod = 1 desc = "If left untreated the subject will become very weak, and may vomit often." - severity = DISEASE_SEVERITY_MEDIUM + danger = DISEASE_MEDIUM disease_flags = CAN_CARRY|CAN_RESIST spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS visibility_flags = HIDDEN_PANDEMIC diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm index 074bda0560f8f..b26618640fefe 100644 --- a/code/datums/diseases/beesease.dm +++ b/code/datums/diseases/beesease.dm @@ -9,7 +9,7 @@ agent = "Apidae Infection" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) desc = "If left untreated subject will regurgitate bees." - severity = DISEASE_SEVERITY_MEDIUM + danger = DISEASE_MEDIUM infectable_biotypes = list(MOB_ORGANIC, MOB_UNDEAD) //bees nesting in corpses /datum/disease/beesease/stage_act() @@ -36,4 +36,4 @@ affected_mob.visible_message("[affected_mob] coughs up a swarm of bees!", \ "You cough up a swarm of bees!") new /mob/living/simple_animal/hostile/poison/bees(affected_mob.loc) - return \ No newline at end of file + return diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index 0bcd1e30eadb8..edfc1486469e7 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -10,7 +10,7 @@ cure_chance = 15//higher chance to cure, since two reagents are required desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication." required_organs = list(/obj/item/organ/brain) - severity = DISEASE_SEVERITY_HARMFUL + danger = DISEASE_HARMFUL /datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR ..() diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index dd91a0d822168..0961557f5e3b4 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -7,7 +7,7 @@ viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) permeability_mod = 0.5 desc = "If left untreated, the subject will contract the flu." - severity = DISEASE_SEVERITY_NONTHREAT + danger = DISEASE_NONTHREAT /datum/disease/cold/stage_act() ..() @@ -50,4 +50,4 @@ if(!affected_mob.disease_resistances.Find(/datum/disease/flu)) var/datum/disease/Flu = new /datum/disease/flu() affected_mob.ForceContractDisease(Flu, FALSE, TRUE) - cure() \ No newline at end of file + cure() diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm index 47f391ecf78d1..35027ed10ae61 100644 --- a/code/datums/diseases/cold9.dm +++ b/code/datums/diseases/cold9.dm @@ -8,7 +8,7 @@ agent = "ICE9-rhinovirus" viable_mobtypes = list(/mob/living/carbon/human) desc = "If left untreated the subject will slow, as if partly frozen." - severity = DISEASE_SEVERITY_HARMFUL + danger = DISEASE_HARMFUL /datum/disease/cold9/stage_act() ..() @@ -36,4 +36,4 @@ if(prob(1)) to_chat(affected_mob, "Your throat feels sore.") if(prob(10)) - to_chat(affected_mob, "You feel stiff.") \ No newline at end of file + to_chat(affected_mob, "You feel stiff.") diff --git a/code/datums/diseases/decloning.dm b/code/datums/diseases/decloning.dm index b332876c01060..90ff0cda7fff5 100644 --- a/code/datums/diseases/decloning.dm +++ b/code/datums/diseases/decloning.dm @@ -7,7 +7,7 @@ agent = "Severe Genetic Damage" viable_mobtypes = list(/mob/living/carbon/human) desc = @"If left untreated the subject will [REDACTED]!" - severity = "Dangerous!" + danger = DISEASE_DANGEROUS cures = list(/datum/reagent/medicine/rezadone) disease_flags = CAN_CARRY|CAN_RESIST spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS @@ -55,5 +55,5 @@ affected_mob.adjustCloneLoss(5) affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 170) if(affected_mob.cloneloss >= 100) - affected_mob.visible_message("[affected_mob] skin turns to dust!", "Your skin turns to dust!") - affected_mob.dust() \ No newline at end of file + affected_mob.visible_message("[affected_mob] skin turns to dust!", "Your skin turns to dust!") + affected_mob.dust() diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index 3a67230d36ec2..42a6595707994 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -11,7 +11,7 @@ var/datum/dna/original_dna = null var/transformed = 0 desc = "This disease transplants the genetic code of the initial vector into new hosts." - severity = DISEASE_SEVERITY_MEDIUM + danger = DISEASE_MEDIUM /datum/disease/dnaspread/stage_act() diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm index 37628a5502f18..cb7776969c7c7 100644 --- a/code/datums/diseases/fake_gbs.dm +++ b/code/datums/diseases/fake_gbs.dm @@ -8,7 +8,7 @@ agent = "Gravitokinetic Bipotential SADS-" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) desc = "If left untreated death will occur." - severity = DISEASE_SEVERITY_BIOHAZARD + danger = DISEASE_BIOHAZARD /datum/disease/fake_gbs/stage_act() ..() diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index 62bb3de8df412..3cb6e91e7f6dd 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) permeability_mod = 0.75 desc = "If left untreated the subject will feel quite unwell." - severity = DISEASE_SEVERITY_MINOR + danger = DISEASE_MINOR /datum/disease/flu/stage_act() ..() diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/fluspanish.dm index 3297877fe910d..398f9e88678ef 100644 --- a/code/datums/diseases/fluspanish.dm +++ b/code/datums/diseases/fluspanish.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human) permeability_mod = 0.75 desc = "If left untreated the subject will burn to death for being a heretic." - severity = DISEASE_SEVERITY_DANGEROUS + danger = DISEASE_DANGEROUS /datum/disease/fluspanish/stage_act() ..() diff --git a/code/datums/diseases/gastrolisis.dm b/code/datums/diseases/gastrolisis.dm index 5f03fe1b706b3..24c220dd13c07 100644 --- a/code/datums/diseases/gastrolisis.dm +++ b/code/datums/diseases/gastrolisis.dm @@ -38,12 +38,12 @@ "You scream in pain as your eyes are pushed out by your new snail eyes!") affected_mob.emote("scream") return - var/obj/item/shell = affected_mob.get_item_by_slot(SLOT_BACK) + var/obj/item/shell = affected_mob.get_item_by_slot(ITEM_SLOT_BACK) if(!istype(shell, /obj/item/storage/backpack/snail)) shell = null if(!shell && prob(5)) - if(affected_mob.dropItemToGround(affected_mob.get_item_by_slot(SLOT_BACK))) - affected_mob.equip_to_slot_or_del(new /obj/item/storage/backpack/snail(affected_mob), SLOT_BACK) + if(affected_mob.dropItemToGround(affected_mob.get_item_by_slot(ITEM_SLOT_BACK))) + affected_mob.equip_to_slot_or_del(new /obj/item/storage/backpack/snail(affected_mob), ITEM_SLOT_BACK) affected_mob.visible_message("[affected_mob] grows a grotesque shell on their back!", \ "You scream in pain as a shell pushes itself out from under your skin!") affected_mob.emote("scream") @@ -78,7 +78,7 @@ if(eyes) var/obj/item/organ/eyes/new_eyes = new H.dna.species.mutanteyes () new_eyes.Insert(H) - var/obj/item/storage/backpack/bag = H.get_item_by_slot(SLOT_BACK) + var/obj/item/storage/backpack/bag = H.get_item_by_slot(ITEM_SLOT_BACK) if(istype(bag, /obj/item/storage/backpack/snail)) bag.emptyStorage() H.doUnEquip(bag, TRUE, no_move = TRUE) diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index 8ac199685570f..2be16dd8c49cf 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -10,7 +10,7 @@ viable_mobtypes = list(/mob/living/carbon/human) disease_flags = CAN_CARRY|CAN_RESIST|CURABLE permeability_mod = 1 - severity = DISEASE_SEVERITY_BIOHAZARD + danger = DISEASE_BIOHAZARD /datum/disease/gbs/stage_act() ..() diff --git a/code/datums/diseases/heart_failure.dm b/code/datums/diseases/heart_failure.dm index c823d0984b64b..9084707b0e0d1 100644 --- a/code/datums/diseases/heart_failure.dm +++ b/code/datums/diseases/heart_failure.dm @@ -8,7 +8,7 @@ viable_mobtypes = list(/mob/living/carbon/human) permeability_mod = 1 desc = "If left untreated the subject will die!" - severity = "Dangerous!" + danger = DISEASE_DANGEROUS disease_flags = CAN_CARRY|CAN_RESIST spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS visibility_flags = HIDDEN_PANDEMIC @@ -37,7 +37,7 @@ to_chat(H, "You feel [pick("full", "nauseated", "sweaty", "weak", "tired", "short on breath", "uneasy")].") if(3 to 4) if(!sound) - H.playsound_local(H, 'sound/health/slowbeat.ogg',40,0, channel = CHANNEL_HEARTBEAT) + H.playsound_local(H, 'sound/health/slowbeat.ogg',40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) sound = TRUE if(prob(3)) to_chat(H, "You feel a sharp pain in your chest!") diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm index 29e6657e1313f..740010762a482 100644 --- a/code/datums/diseases/magnitis.dm +++ b/code/datums/diseases/magnitis.dm @@ -9,7 +9,7 @@ disease_flags = CAN_CARRY|CAN_RESIST|CURABLE permeability_mod = 0.75 desc = "This disease disrupts the magnetic field of your body, making it act as if a powerful magnet. Injections of iron help stabilize the field." - severity = DISEASE_SEVERITY_MEDIUM + danger = DISEASE_MEDIUM infectable_biotypes = list(MOB_ORGANIC, MOB_ROBOTIC) process_dead = TRUE @@ -65,4 +65,4 @@ var/iter = rand(1,3) for(i=0,iBeep...boop..
") @@ -204,7 +201,7 @@ cure_chance = 5 agent = "Rip-LEY Alien Microbes" desc = "This disease changes the victim into a xenomorph." - severity = DISEASE_SEVERITY_BIOHAZARD + danger = DISEASE_BIOHAZARD visibility_flags = 0 stage1 = list() stage2 = list("Your throat feels scratchy.", "Kill...") @@ -233,7 +230,7 @@ cure_chance = 80 agent = "Advanced Mutation Toxin" desc = "This highly concentrated extract converts anything into more of itself." - severity = DISEASE_SEVERITY_BIOHAZARD + danger = DISEASE_BIOHAZARD visibility_flags = 0 stage1 = list("You don't feel very well.") stage2 = list("Your skin feels a little slimy.") @@ -261,7 +258,7 @@ cures = list(/datum/reagent/medicine/adminordrazine) agent = "Fell Doge Majicks" desc = "This disease transforms the victim into a corgi." - severity = DISEASE_SEVERITY_BIOHAZARD + danger = DISEASE_BIOHAZARD visibility_flags = 0 stage1 = list("BARK.") stage2 = list("You feel the need to wear silly hats.") @@ -287,7 +284,7 @@ agent = "Gluttony's Blessing" desc = "A 'gift' from somewhere terrible." stage_prob = 20 - severity = DISEASE_SEVERITY_BIOHAZARD + danger = DISEASE_BIOHAZARD visibility_flags = 0 stage1 = list("Your stomach rumbles.") stage2 = list("Your skin feels saggy.") @@ -305,7 +302,7 @@ stage_prob = 5 agent = "Tranquility" desc = "Consuming the flesh of a Gondola comes at a terrible price." - severity = DISEASE_SEVERITY_BIOHAZARD + danger = DISEASE_BIOHAZARD visibility_flags = 0 stage1 = list("You seem a little lighter in your step.") stage2 = list("You catch yourself smiling for no reason.") @@ -342,13 +339,13 @@ cure_text = "Something that would kill off the tiny cats." spread_text = "Acute" disease_flags = CURABLE|CAN_CARRY|CAN_RESIST - cures = list(/datum/reagent/consumable/cocoa) //kills all the tiny cats that infected your organism + cures = list(/datum/reagent/consumable/cocoa, /datum/reagent/consumable/cocoa/hot_cocoa) //kills all the tiny cats that infected your organism cure_chance = 25 stage_prob = 3 agent = "Nano-feline Toxoplasmosis" desc = "A lot of tiny cats in the blood that slowly turn you into a big cat." is_mutagenic = TRUE //So that it won't be autocured after stage 5 - severity = DISEASE_SEVERITY_BIOHAZARD + danger = DISEASE_BIOHAZARD visibility_flags = 0 stage1 = list("You feel scratching fom within.", "You hear a faint miaow somewhere really close.") stage2 = list("You suppress the urge to lick yourself.") @@ -383,6 +380,8 @@ RegisterSignal(affected_mob, COMSIG_MOB_SAY, .proc/handle_speech) /datum/disease/transformation/felinid/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + var/message = speech_args[SPEECH_MESSAGE] if(message[1] != "*") message = " [message]" @@ -446,7 +445,7 @@ stage_prob = 5 agent = "Legion droppings" desc = "Who knew that spreading the primordial goop of a vile entity would take a toll on the body?" - severity = DISEASE_SEVERITY_BIOHAZARD + danger = DISEASE_BIOHAZARD visibility_flags = 0 stage1 = list("Your skin seems ashy.") stage2 = list("You wonder what it would be like to live on Lavaland forever...") diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index e92ecffae18ab..1ed04baca5da4 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -10,7 +10,7 @@ cure_chance = 5//like hell are you getting out of hell desc = "A rare highly transmissible virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue." required_organs = list(/obj/item/organ/lungs) - severity = DISEASE_SEVERITY_BIOHAZARD + danger = DISEASE_BIOHAZARD bypasses_immunity = TRUE // TB primarily impacts the lungs; it's also bacterial or fungal in nature; viral immunity should do nothing. /datum/disease/tuberculosis/stage_act() //it begins @@ -42,7 +42,7 @@ affected_mob.adjustStaminaLoss(70) if(prob(10)) affected_mob.adjustStaminaLoss(100) - affected_mob.visible_message("[affected_mob] faints!", "You surrender yourself and feel at peace...") + affected_mob.visible_message("[affected_mob] faints!", "You surrender yourself and feel at peace.") affected_mob.AdjustSleeping(100) if(prob(2)) to_chat(affected_mob, "You feel your mind relax and your thoughts drift!") @@ -50,11 +50,11 @@ if(prob(10)) affected_mob.vomit(20) 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")]") + 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.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...")]") + 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) return diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index 230a074bb1460..b060a3348871f 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -9,8 +9,8 @@ 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." - severity = DISEASE_SEVERITY_HARMFUL + desc = "Some speculate that this virus is the cause of the Space Wizard Federation's existence. Subjects affected show the signs of intellectual disability, 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." + danger = DISEASE_HARMFUL required_organs = list(/obj/item/bodypart/head) /* @@ -61,19 +61,19 @@ STI KALY - blind if(!istype(H.head, /obj/item/clothing/head/wizard)) if(!H.dropItemToGround(H.head)) qdel(H.head) - H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), SLOT_HEAD) + H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), ITEM_SLOT_HEAD) return if(prob(chance)) if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe)) if(!H.dropItemToGround(H.wear_suit)) qdel(H.wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), SLOT_WEAR_SUIT) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), ITEM_SLOT_OCLOTHING) return if(prob(chance)) if(!istype(H.shoes, /obj/item/clothing/shoes/sandal/magic)) if(!H.dropItemToGround(H.shoes)) qdel(H.shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(H), SLOT_SHOES) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(H), ITEM_SLOT_FEET) return else var/mob/living/carbon/H = affected_mob @@ -95,7 +95,7 @@ STI KALY - blind var/list/L = list() for(var/turf/T in get_area_turfs(thearea.type)) - if(T.z != affected_mob.z) + if(T.get_virtual_z_level() != affected_mob.get_virtual_z_level()) continue if(T.name == "space") continue @@ -111,7 +111,7 @@ STI KALY - blind if(!L) return - affected_mob.say("SCYAR NILA [uppertext(thearea.name)]!", forced = "wizarditis teleport") - affected_mob.forceMove(pick(L)) + if(do_teleport(affected_mob, pick(L), channel = TELEPORT_CHANNEL_MAGIC, no_effects = TRUE)) + affected_mob.say("SCYAR NILA [uppertext(thearea.name)]!", forced = "wizarditis teleport") return diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 2e6227af5fe33..4def3c639ba7c 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -13,6 +13,7 @@ var/mob/living/holder var/delete_species = TRUE //Set to FALSE when a body is scanned by a cloner to fix #38875 var/mutation_index[DNA_MUTATION_BLOCKS] //List of which mutations this carbon has and its assigned block + var/default_mutation_genes[DNA_MUTATION_BLOCKS] //List of the default genes from this mutation to allow DNA Scanner highlighting 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. @@ -48,10 +49,12 @@ destination.dna.temporary_mutations = temporary_mutations.Copy() if(transfer_SE) destination.dna.mutation_index = mutation_index + destination.dna.default_mutation_genes = default_mutation_genes /datum/dna/proc/copy_dna(datum/dna/new_dna) new_dna.unique_enzymes = unique_enzymes new_dna.mutation_index = mutation_index + new_dna.default_mutation_genes = default_mutation_genes new_dna.uni_identity = uni_identity new_dna.blood_type = blood_type new_dna.features = features.Copy() @@ -112,22 +115,24 @@ 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?.inert_mutation) - bonus = GET_INITIALIZED_MUTATION(species.inert_mutation) - var/list/mutations_temp = GLOB.good_mutations + GLOB.bad_mutations + GLOB.not_good_mutations + bonus + mutations_temp += GET_INITIALIZED_MUTATION(species.inert_mutation) if(!LAZYLEN(mutations_temp)) return mutation_index.Cut() + default_mutation_genes.Cut() shuffle_inplace(mutations_temp) if(ismonkey(holder)) mutations |= new RACEMUT(MUT_NORMAL) mutation_index[RACEMUT] = GET_SEQUENCE(RACEMUT) else mutation_index[RACEMUT] = create_sequence(RACEMUT, FALSE) + default_mutation_genes[RACEMUT] = mutation_index[RACEMUT] for(var/i in 2 to DNA_MUTATION_BLOCKS) var/datum/mutation/human/M = mutations_temp[i] mutation_index[M.type] = create_sequence(M.type, FALSE, M.difficulty) + default_mutation_genes[M.type] = mutation_index[M.type] shuffle_inplace(mutation_index) //Used to generate original gene sequences for every mutation @@ -316,7 +321,7 @@ return dna -/mob/living/carbon/human/proc/hardset_dna(ui, list/mutation_index, newreal_name, newblood_type, datum/species/mrace, newfeatures, list/mutations, force_transfer_mutations) +/mob/living/carbon/human/proc/hardset_dna(ui, list/mutation_index, newreal_name, newblood_type, datum/species/mrace, newfeatures, list/mutations, force_transfer_mutations, list/default_mutation_genes) //Do not use force_transfer_mutations for stuff like cloners without some precautions, otherwise some conditional mutations could break (timers, drill hat etc) if(newfeatures) dna.features = newfeatures @@ -326,6 +331,14 @@ newrace.copy_properties_from(mrace) set_species(newrace, icon_update=0) + if(LAZYLEN(mutation_index)) + dna.mutation_index = mutation_index.Copy() + if(LAZYLEN(default_mutation_genes)) + dna.default_mutation_genes = default_mutation_genes.Copy() + else + dna.default_mutation_genes = mutation_index.Copy() + domutcheck() + if(newreal_name) real_name = newreal_name dna.generate_unique_enzymes() @@ -337,10 +350,6 @@ dna.uni_identity = ui updateappearance(icon_update=0) - if(LAZYLEN(mutation_index)) - dna.mutation_index = mutation_index.Copy() - domutcheck() - if(mrace || newfeatures || ui) update_body() update_hair() @@ -424,8 +433,10 @@ . = TRUE if(on) mutation_index[HM.type] = GET_SEQUENCE(HM.type) + default_mutation_genes[HM.type] = mutation_index[HM.type] else if(GET_SEQUENCE(HM.type) == mutation_index[HM.type]) mutation_index[HM.type] = create_sequence(HM.type, FALSE, HM.difficulty) + default_mutation_genes[HM.type] = mutation_index[HM.type] /datum/dna/proc/activate_mutation(mutation) //note that this returns a boolean and not a new mob if(!mutation) diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index 6a550cc9d1e98..7c1e80542df6f 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -10,10 +10,21 @@ /datum/element/proc/Attach(datum/target) 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) + /** The override = TRUE here is to suppress runtimes happening because of the blood decal element + * being applied multiple times to a same thing every time there is some bloody attacks, + * which happens due to ludicrous use of check_blood() in forensics.dm, + * and how elements system is design and coded; there isn't exactly a not-hacky + * way to determine whether a datum has this particular element before adding it... + */ + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/Detach, override = TRUE) /datum/element/proc/Detach(datum/source, force) + SIGNAL_HANDLER + + SEND_SIGNAL(source, COMSIG_ELEMENT_DETACH, src) + SHOULD_CALL_PARENT(TRUE) UnregisterSignal(source, COMSIG_PARENT_QDELETING) /datum/element/Destroy(force) @@ -24,16 +35,17 @@ //DATUM PROCS -/datum/proc/AddElement(eletype, ...) - var/datum/element/ele = SSdcs.GetElement(arglist(args)) - args[1] = src - if(ele.Attach(arglist(args)) == ELEMENT_INCOMPATIBLE) - CRASH("Incompatible [eletype] assigned to a [type]! args: [json_encode(args)]") +/// Finds the singleton for the element type given and attaches it to src +/datum/proc/_AddElement(list/arguments) + var/datum/element/ele = SSdcs.GetElement(arguments) + arguments[1] = src + if(ele.Attach(arglist(arguments)) == ELEMENT_INCOMPATIBLE) + CRASH("Incompatible [arguments[1]] assigned to a [type]! args: [json_encode(args)]") /** * Finds the singleton for the element type given and detaches it from src * You only need additional arguments beyond the type if you're using ELEMENT_BESPOKE */ -/datum/proc/RemoveElement(eletype, ...) - var/datum/element/ele = SSdcs.GetElement(arglist(args)) +/datum/proc/_RemoveElement(list/arguments) + var/datum/element/ele = SSdcs.GetElement(arguments) ele.Detach(src) diff --git a/code/datums/elements/bed_tucking.dm b/code/datums/elements/bed_tucking.dm new file mode 100644 index 0000000000000..10135871a7ad3 --- /dev/null +++ b/code/datums/elements/bed_tucking.dm @@ -0,0 +1,60 @@ +/// Tucking element, for things that can be tucked into bed. +/datum/element/bed_tuckable + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + /// our pixel_x offset - how much the item moves x when in bed (+x is closer to the pillow) + var/x_offset = 0 + /// our pixel_y offset - how much the item move y when in bed (-y is closer to the middle) + var/y_offset = 0 + /// our rotation degree - how much the item turns when in bed (+degrees turns it more parallel) + var/rotation_degree = 0 + +/datum/element/bed_tuckable/Attach(obj/target, x = 0, y = 0, rotation = 0) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + x_offset = x + y_offset = y + rotation_degree = rotation + RegisterSignal(target, COMSIG_ITEM_ATTACK_OBJ, .proc/tuck_into_bed) + +/datum/element/bed_tuckable/Detach(obj/target) + . = ..() + UnregisterSignal(target, list(COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_PICKUP)) + +/** + * Tuck our object into bed. + * + * tucked - the object being tucked + * target_bed - the bed we're tucking them into + * tucker - the guy doing the tucking + */ +/datum/element/bed_tuckable/proc/tuck_into_bed(obj/item/tucked, obj/structure/bed/target_bed, mob/living/tucker) + SIGNAL_HANDLER + + if(!istype(target_bed)) + return + + if(!tucker.transferItemToLoc(tucked, target_bed.drop_location())) + return + + to_chat(tucker, "You lay [tucked] out on [target_bed].") + tucked.pixel_x = x_offset + tucked.pixel_y = y_offset + if(rotation_degree) + tucked.transform = turn(tucked.transform, rotation_degree) + RegisterSignal(tucked, COMSIG_ITEM_PICKUP, .proc/untuck) + + return COMPONENT_NO_AFTERATTACK + +/** + * If we rotate our object, then we need to un-rotate it when it's picked up + * + * tucked - the object that is tucked + */ +/datum/element/bed_tuckable/proc/untuck(obj/item/tucked) + SIGNAL_HANDLER + + tucked.transform = turn(tucked.transform, -rotation_degree) + UnregisterSignal(tucked, COMSIG_ITEM_PICKUP) diff --git a/code/datums/elements/bsa_blocker.dm b/code/datums/elements/bsa_blocker.dm index 61140ad0ed5d2..5bdf4fa90912d 100644 --- a/code/datums/elements/bsa_blocker.dm +++ b/code/datums/elements/bsa_blocker.dm @@ -7,4 +7,6 @@ return ..() /datum/element/bsa_blocker/proc/block_bsa() + SIGNAL_HANDLER + return COMSIG_ATOM_BLOCKS_BSA_BEAM diff --git a/code/datums/elements/cleaning.dm b/code/datums/elements/cleaning.dm index c89c13978f484..f8bdf8b34d453 100644 --- a/code/datums/elements/cleaning.dm +++ b/code/datums/elements/cleaning.dm @@ -9,6 +9,8 @@ UnregisterSignal(target, COMSIG_MOVABLE_MOVED) /datum/element/cleaning/proc/Clean(datum/source) + SIGNAL_HANDLER + var/atom/movable/AM = source var/turf/tile = AM.loc if(!isturf(tile)) diff --git a/code/datums/elements/decal.dm b/code/datums/elements/decal.dm new file mode 100644 index 0000000000000..116fdf99b2d39 --- /dev/null +++ b/code/datums/elements/decal.dm @@ -0,0 +1,92 @@ +/datum/element/decal + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + var/cleanable + var/description + var/mutable_appearance/pic + /** + * A short lecture on decal element collision on rotation + * If a given decal's rotated version is identical to one of existing (at a same target), pre-rotation decals, + * then the rotated decal won't stay after when the colliding pre-rotation decal gets rotated, + * resulting in some decal elements colliding into nonexistence. This internal tick-tock prevents + * such collision by forcing a non-collision. + */ + var/rotated + +/datum/element/decal/Attach(atom/target, _icon, _icon_state, _dir, _cleanable=FALSE, _color, _layer=TURF_LAYER, _description, _alpha=255, _rotated=FALSE) + . = ..() + if(!isatom(target) || (pic ? FALSE : !generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha, target))) + return ELEMENT_INCOMPATIBLE + description = _description + cleanable = _cleanable + rotated = _rotated + + RegisterSignal(target,COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_overlay, TRUE) + if(isturf(target)) + RegisterSignal(target,COMSIG_TURF_AFTER_SHUTTLE_MOVE,.proc/shuttlemove_react, TRUE) + if(target.flags_1 & INITIALIZED_1) + target.update_icon() //could use some queuing here now maybe. + else + RegisterSignal(target,COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE,.proc/late_update_icon, TRUE) + if(isitem(target)) + INVOKE_ASYNC(target, /obj/item/.proc/update_slot_icon, TRUE) + if(_dir) + RegisterSignal(target, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react,TRUE) + if(_cleanable) + RegisterSignal(target, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react,TRUE) + if(_description) + RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/examine, TRUE) + +/datum/element/decal/proc/generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha, source) + if(!_icon || !_icon_state) + return FALSE + var/temp_image = image(_icon, null, _icon_state, _layer, _dir) + pic = new(temp_image) + pic.color = _color + pic.alpha = _alpha + return TRUE + +/datum/element/decal/Detach(atom/source, force) + UnregisterSignal(source, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE, COMSIG_ATOM_UPDATE_OVERLAYS,COMSIG_TURF_AFTER_SHUTTLE_MOVE)) + source.update_icon() + if(isitem(source)) + INVOKE_ASYNC(source, /obj/item/.proc/update_slot_icon) + return ..() + +/datum/element/decal/proc/late_update_icon(atom/source) + SIGNAL_HANDLER + if(source && istype(source)) + source.update_icon() + UnregisterSignal(source,COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) + + +/datum/element/decal/proc/apply_overlay(atom/source, list/overlay_list) + SIGNAL_HANDLER + overlay_list += pic + +/datum/element/decal/proc/shuttlemove_react(datum/source, turf/newT) + SIGNAL_HANDLER + + Detach(source) + newT.AddElement(/datum/element/decal, pic.icon, pic.icon_state, pic.dir, cleanable, pic.color, pic.layer, description, pic.alpha, rotated) + +/datum/element/decal/proc/rotate_react(datum/source, old_dir, new_dir) + SIGNAL_HANDLER + + if(old_dir == new_dir) + return + Detach(source) + source.AddElement(/datum/element/decal, pic.icon, pic.icon_state, angle2dir(dir2angle(pic.dir)+dir2angle(new_dir)-dir2angle(old_dir)), cleanable, pic.color, pic.layer, description, pic.alpha, !rotated) + +/datum/element/decal/proc/clean_react(datum/source, clean_types) + SIGNAL_HANDLER + + if(clean_types & cleanable) + Detach(source) + return TRUE + return NONE + +/datum/element/decal/proc/examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + examine_list += description diff --git a/code/datums/elements/decals/blood.dm b/code/datums/elements/decals/blood.dm new file mode 100644 index 0000000000000..bb212e93dfe22 --- /dev/null +++ b/code/datums/elements/decals/blood.dm @@ -0,0 +1,36 @@ +/datum/element/decal/blood + +/** + * If you are annoyed by lack of blood decal visuals? + * Then here's a TODO for you: rework the entire update_icon() family to make COMSIG_ATOM_UPDATE_OVERLAYS and update_overlays() work! + * Until the rework, blood decal visuals might not work on some items... (but the name change will work, though) + */ + +/datum/element/decal/blood/Attach(datum/target, _icon, _icon_state, _dir, _cleanable=CLEAN_STRENGTH_BLOOD, _color, _layer=ABOVE_OBJ_LAYER) + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + . = ..() + + RegisterSignal(target, COMSIG_ATOM_GET_EXAMINE_NAME, .proc/get_examine_name, TRUE) + +/datum/element/decal/blood/Detach(atom/source, force) + UnregisterSignal(source, COMSIG_ATOM_GET_EXAMINE_NAME) + return ..() + +/datum/element/decal/blood/generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha, source) + if(!_icon || !_icon_state) + return FALSE + var/icon/blood_splatter_icon = icon(_icon, _icon_state, , 1) //we only want to apply blood-splatters to the initial icon_state for each object + blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) + blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant + pic = mutable_appearance(blood_splatter_icon) + return TRUE + +/datum/element/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override) + SIGNAL_HANDLER + + var/atom/A = source + override[EXAMINE_POSITION_ARTICLE] = A.gender == PLURAL? "some" : "a" + override[EXAMINE_POSITION_BEFORE] = " blood-stained " + return COMPONENT_EXNAME_CHANGED diff --git a/code/datums/elements/deferred_aquarium_content.dm b/code/datums/elements/deferred_aquarium_content.dm new file mode 100644 index 0000000000000..64eee03e80b5d --- /dev/null +++ b/code/datums/elements/deferred_aquarium_content.dm @@ -0,0 +1,32 @@ +/** + * Create /datum/component/aquarium_content with the preset path on the target right before being inserted into aquarium and deletes itself. + * Used to save memory from aquarium properties on common objects/stacks that won't see aquarium in 99 out of 100 rounds. + */ +/datum/element/deferred_aquarium_content + element_flags = ELEMENT_BESPOKE + id_arg_index = 2 + var/aquarium_content_type + +/datum/element/deferred_aquarium_content/Attach(datum/target, aquarium_content_type) + . = ..() + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + if(!aquarium_content_type) + CRASH("Deferred aquarium content missing behaviour type.") + src.aquarium_content_type = aquarium_content_type + //If element is added to something already in aquarium, just create the component. + var/atom/movable/movable_target = target + if(istype(movable_target.loc, /obj/structure/aquarium)) + create_aquarium_component(movable_target) + else //otherwise the component will be created when trying to insert the thing. + RegisterSignal(target, COMSIG_AQUARIUM_BEFORE_INSERT_CHECK, .proc/create_aquarium_component) + +/datum/element/deferred_aquarium_content/Detach(datum/target) + . = ..() + UnregisterSignal(target, COMSIG_AQUARIUM_BEFORE_INSERT_CHECK) + +/datum/element/deferred_aquarium_content/proc/create_aquarium_component(datum/source) + SIGNAL_HANDLER + + source.AddComponent(/datum/component/aquarium_content, aquarium_content_type) + Detach(source) diff --git a/code/datums/elements/earhealing.dm b/code/datums/elements/earhealing.dm index 1a01f3ae56b77..9a5b7c5b78af2 100644 --- a/code/datums/elements/earhealing.dm +++ b/code/datums/elements/earhealing.dm @@ -18,12 +18,14 @@ user_by_item -= target /datum/element/earhealing/proc/equippedChanged(datum/source, mob/living/carbon/user, slot) - if(slot == SLOT_EARS && istype(user)) + SIGNAL_HANDLER + + if(slot == ITEM_SLOT_EARS && istype(user)) user_by_item[source] = user else user_by_item -= source -/datum/element/earhealing/process() +/datum/element/earhealing/process(delta_time) for(var/i in user_by_item) var/mob/living/carbon/user = user_by_item[i] if(HAS_TRAIT(user, TRAIT_DEAF)) @@ -31,6 +33,6 @@ var/obj/item/organ/ears/ears = user.getorganslot(ORGAN_SLOT_EARS) if(!ears) continue - ears.deaf = max(ears.deaf - 0.25, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged - ears.damage = max(ears.damage - 0.025, 0) - CHECK_TICK + ears.deaf = max(ears.deaf - 0.25 * delta_time, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged + ears.damage = max(ears.damage - 0.025 * delta_time, 0) + CHECK_TICK // Reviewer: yes I really am afraid of 1000 clones with earmuffs diff --git a/code/datums/elements/embed.dm b/code/datums/elements/embed.dm new file mode 100644 index 0000000000000..f9bc5bd9c64ee --- /dev/null +++ b/code/datums/elements/embed.dm @@ -0,0 +1,196 @@ +/* + The presence of this element allows an item (or a projectile carrying an item) to embed itself in a carbon 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_ZONE check, 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. +*/ + +/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/max_damage_mult + var/remove_pain_mult + var/rip_time + var/ignore_throwspeed_threshold + var/jostle_chance + var/jostle_pain_mult + var/pain_stam_pct + var/armour_block + var/payload_type + +/datum/element/embed/Attach(datum/target, embed_chance, fall_chance, pain_chance, pain_mult, max_damage_mult, remove_pain_mult, rip_time, ignore_throwspeed_threshold, jostle_chance, jostle_pain_mult, pain_stam_pct, armour_block, projectile_payload=/obj/item/shard) + . = ..() + + if(!isitem(target) && !isprojectile(target)) + return ELEMENT_INCOMPATIBLE + + if(isitem(target)) + RegisterSignal(target, COMSIG_MOVABLE_IMPACT_ZONE, .proc/checkEmbed) + 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.max_damage_mult = max_damage_mult + src.remove_pain_mult = remove_pain_mult + src.rip_time = rip_time + 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.armour_block = armour_block + 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/checkEmbed(obj/item/weapon, mob/living/carbon/victim, hit_zone, datum/thrownthing/throwingdatum, forced=FALSE) + SIGNAL_HANDLER + + if(!istype(victim) || HAS_TRAIT(victim, TRAIT_PIERCEIMMUNE)) + return + + var/flying_speed = throwingdatum ? throwingdatum.speed : weapon.throw_speed + + if(!forced && (flying_speed < EMBED_THROWSPEED_THRESHOLD && !ignore_throwspeed_threshold)) // check if it's a forced embed, and if not, if it's going fast enough to proc embedding + return + + var/actual_chance = embed_chance + + if(throwingdatum?.speed > weapon.throw_speed) + actual_chance += (throwingdatum.speed - weapon.throw_speed) * EMBEDDED_CHANCE_SPEED_BONUS + + var/target_armour = 0 + + if(!weapon.isEmbedHarmless()) // all the armor in the world won't save you from a kick me sign + target_armour = victim.run_armor_check(hit_zone, armour_penetration = weapon.armour_penetration, silent = TRUE) + + //Target has enough armour to block the embed. + if(target_armour >= armour_block) + victim.visible_message("[weapon] bounces off [victim]'s armor!", "[weapon] bounces off your armor!", vision_distance = COMBAT_MESSAGE_RANGE) + return + + var/percentage_unblocked = 1 - (target_armour / armour_block) + + if(!prob(actual_chance * percentage_unblocked)) + 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) + + 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) + SIGNAL_HANDLER + + 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) + SIGNAL_HANDLER + + Detach(weapon) + +///Someone inspected our embeddable item +/datum/element/embed/proc/examined(obj/item/I, mob/user, list/examine_list) + SIGNAL_HANDLER + + 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, 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) + SIGNAL_HANDLER + + if(!iscarbon(hit)) + Detach(P) + return // we don't care + + var/obj/item/payload = new payload_type(get_turf(hit)) + var/mob/living/carbon/C = hit + var/obj/item/bodypart/limb = C.get_bodypart(hit_zone) + if(!limb) + limb = C.get_bodypart() + + if(!payload.tryEmbed(limb)) + 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, and possibly + * AGAIN if we actually embed. This way, we save on at least one message. + * + * Arguments: + * * I- the item we're trying to insert into the target + * * target- what we're trying to shish-kabob, either a bodypart or a carbon + * * 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) + SIGNAL_HANDLER + + var/obj/item/bodypart/limb + var/mob/living/carbon/C + + 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 + C = limb.owner + + return checkEmbed(I, C, hit_zone, forced=TRUE) diff --git a/code/datums/elements/firestacker.dm b/code/datums/elements/firestacker.dm index 65857732bc0fa..125cb593ff4be 100644 --- a/code/datums/elements/firestacker.dm +++ b/code/datums/elements/firestacker.dm @@ -9,12 +9,12 @@ /datum/element/firestacker/Attach(datum/target, amount) . = ..() - + if(!ismovableatom(target)) return ELEMENT_INCOMPATIBLE - + src.amount = amount - + RegisterSignal(target, COMSIG_MOVABLE_IMPACT, .proc/impact, override = TRUE) if(isitem(target)) RegisterSignal(target, COMSIG_ITEM_ATTACK, .proc/item_attack) @@ -28,13 +28,19 @@ target.adjust_fire_stacks(amount) /datum/element/firestacker/proc/impact(datum/source, atom/hit_atom, datum/thrownthing/throwingdatum) + SIGNAL_HANDLER + if(isliving(hit_atom)) stack_on(source, hit_atom) /datum/element/firestacker/proc/item_attack(datum/source, atom/movable/target, mob/living/user) + SIGNAL_HANDLER + if(isliving(target)) stack_on(source, target) /datum/element/firestacker/proc/item_attack_self(datum/source, mob/user) + SIGNAL_HANDLER + if(isliving(user)) stack_on(source, user) diff --git a/code/datums/embedding_behavior.dm b/code/datums/embedding_behavior.dm deleted file mode 100644 index d4181f94344c2..0000000000000 --- a/code/datums/embedding_behavior.dm +++ /dev/null @@ -1,58 +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]-[embedded_ignore_throwspeed_threshold]" - -/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, - embedded_ignore_throwspeed_threshold = FALSE) - . = 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, embedded_ignore_throwspeed_threshold) - -/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. - var/embedded_ignore_throwspeed_threshold //if we don't give a damn about EMBED_THROWSPEED_THRESHOLD - -/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, - embedded_ignore_throwspeed_threshold = FALSE) - 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 - src.embedded_ignore_throwspeed_threshold = embedded_ignore_throwspeed_threshold - 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, embedded_ignore_throwspeed_threshold) - 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),\ - (isnull(embedded_ignore_throwspeed_threshold) ? src.embedded_ignore_throwspeed_threshold : embedded_ignore_throwspeed_threshold)) - -#undef EMBEDID diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 43193a9628ddd..11cb499c38bb2 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -57,13 +57,13 @@ if(!msg) return + user.log_message(msg, LOG_EMOTE) + var/end = copytext(msg, length(message)) if(!(end in list("!", ".", "?", ":", "\"", "-"))) msg += "." - user.log_message(msg, LOG_EMOTE) - - msg = "[user] " + msg + "" + var/dchatmsg = "[user] [msg]" var/tmp_sound = get_sound(user) if(tmp_sound && (!only_forced_audio || !intentional)) @@ -74,12 +74,12 @@ continue var/T = get_turf(user) if(M.stat == DEAD && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) && !(M in viewers(T, null))) - M.show_message(msg) + M.show_message("[FOLLOW_LINK(M, user)] [dchatmsg]") if(emote_type == EMOTE_AUDIBLE) - user.audible_message(msg) + user.audible_message(msg, audible_message_flags = list(CHATMESSAGE_EMOTE = TRUE)) else - user.visible_message(msg) + user.visible_message(msg, visible_message_flags = list(CHATMESSAGE_EMOTE = TRUE)) /datum/emote/proc/get_sound(mob/living/user) return sound //by default just return this var. @@ -153,3 +153,26 @@ var/mob/living/L = user if(HAS_TRAIT(L, TRAIT_EMOTEMUTE)) return FALSE + +/mob/proc/manual_emote(text) //Just override the song and dance + . = TRUE + if(stat != CONSCIOUS) + return + + if(!text) + CRASH("Someone passed nothing to manual_emote(), fix it") + + log_message(text, LOG_EMOTE) + + var/ghost_text = "[src] [text]" + + var/origin_turf = get_turf(src) + if(client) + for(var/mob/ghost as anything in GLOB.dead_mob_list) + if(!ghost.client || isnewplayer(ghost)) + continue + if(ghost.client.prefs.chat_toggles & CHAT_GHOSTSIGHT && !(ghost in viewers(origin_turf, null))) + ghost.show_message("[FOLLOW_LINK(ghost, src)] [ghost_text]") + + visible_message(text, visible_message_flags = list(CHATMESSAGE_EMOTE = TRUE)) + diff --git a/code/datums/ert.dm b/code/datums/ert.dm index be0af9107c492..6f183c8adae8d 100644 --- a/code/datums/ert.dm +++ b/code/datums/ert.dm @@ -99,3 +99,13 @@ mission = "HONK them into submission" polldesc = "an elite Nanotrasen tactical pranking squad" code = "HOOOOOOOOOONK" + +/datum/ert/kudzu + roles = list(/datum/antagonist/ert/kudzu) + leader_role = /datum/antagonist/ert/kudzu + teamsize = 5 + opendoors = FALSE + rename_team = "Weed Whackers" + mission = "Eliminate the kudzu with extreme prejudice" + polldesc = "an elite gardening team" + code = "Vine Green" diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm deleted file mode 100644 index 4f82da7ba4b9e..0000000000000 --- a/code/datums/explosion.dm +++ /dev/null @@ -1,470 +0,0 @@ -#define EXPLOSION_THROW_SPEED 4 -#define CREAK_DELAY 5 SECONDS //Time taken for the creak to play after explosion, if applicable. -#define DEVASTATION_PROB 30 //The probability modifier for devistation, maths! -#define HEAVY_IMPACT_PROB 5 //ditto -#define FAR_UPPER 60 //Upper limit for the far_volume, distance, clamped. -#define FAR_LOWER 40 //lower limit for the far_volume, distance, clamped. -#define PROB_SOUND 75 //The probability modifier for a sound to be an echo, or a far sound. (0-100) -#define SHAKE_CLAMP 2.5 //The limit for how much the camera can shake for out of view booms. -#define FREQ_UPPER 40 //The upper limit for the randomly selected frequency. -#define FREQ_LOWER 25 //The lower of the above. - - -GLOBAL_LIST_EMPTY(explosions) -//Against my better judgement, I will return the explosion datum -//If I see any GC errors for it I will find you -//and I will gib you -/proc/explosion(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = TRUE, ignorecap = FALSE, flame_range = 0, silent = FALSE, smoke = FALSE) - return new /datum/explosion(epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog, ignorecap, flame_range, silent, smoke) - -//This datum creates 3 async tasks -//1 GatherSpiralTurfsProc runs spiral_range_turfs(tick_checked = TRUE) to populate the affected_turfs list -//2 CaculateExplosionBlock adds the blockings to the cached_exp_block list -//3 The main thread explodes the prepared turfs - -/datum/explosion - var/explosion_id - var/atom/explosion_source - var/started_at - var/running = TRUE - var/stopped = 0 //This is the number of threads stopped !DOESN'T COUNT THREAD 2! - var/static/id_counter = 0 - -#define EX_PREPROCESS_EXIT_CHECK \ - if(!running) {\ - stopped = 2;\ - qdel(src);\ - return;\ - } - -#define EX_PREPROCESS_CHECK_TICK \ - if(TICK_CHECK) {\ - stoplag();\ - EX_PREPROCESS_EXIT_CHECK\ - } - -/datum/explosion/New(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog, ignorecap, flame_range, silent, smoke) - set waitfor = FALSE - - var/id = ++id_counter - explosion_id = id - explosion_source = epicenter - - epicenter = get_turf(epicenter) - if(!epicenter) - return - - GLOB.explosions += src - if(isnull(flame_range)) - flame_range = light_impact_range - if(isnull(flash_range)) - flash_range = devastation_range - - // Archive the uncapped explosion for the doppler array - var/orig_dev_range = devastation_range - var/orig_heavy_range = heavy_impact_range - var/orig_light_range = light_impact_range - - var/orig_max_distance = max(devastation_range, heavy_impact_range, light_impact_range, flash_range, flame_range) - - //Zlevel specific bomb cap multiplier - var/cap_multiplier = SSmapping.level_trait(epicenter.z, ZTRAIT_BOMBCAP_MULTIPLIER) - if (isnull(cap_multiplier)) - cap_multiplier = 1 - - if(!ignorecap) - devastation_range = min(GLOB.MAX_EX_DEVESTATION_RANGE * cap_multiplier, devastation_range) - heavy_impact_range = min(GLOB.MAX_EX_HEAVY_RANGE * cap_multiplier, heavy_impact_range) - light_impact_range = min(GLOB.MAX_EX_LIGHT_RANGE * cap_multiplier, light_impact_range) - flash_range = min(GLOB.MAX_EX_FLASH_RANGE * cap_multiplier, flash_range) - flame_range = min(GLOB.MAX_EX_FLAME_RANGE * cap_multiplier, flame_range) - - //DO NOT REMOVE THIS STOPLAG, IT BREAKS THINGS - //not sleeping causes us to ex_act() the thing that triggered the explosion - //doing that might cause it to trigger another explosion - //this is bad - //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 - - EX_PREPROCESS_EXIT_CHECK - - started_at = REALTIMEOFDAY - - var/max_range = max(devastation_range, heavy_impact_range, light_impact_range, flame_range) - - if(adminlog) - message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in [ADMIN_VERBOSEJMP(epicenter)]") - log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in [loc_name(epicenter)]") - - var/x0 = epicenter.x - var/y0 = epicenter.y - var/z0 = epicenter.z - var/area/areatype = get_area(epicenter) - SSblackbox.record_feedback("associative", "explosion", 1, list("dev" = devastation_range, "heavy" = heavy_impact_range, "light" = light_impact_range, "flash" = flash_range, "flame" = flame_range, "orig_dev" = orig_dev_range, "orig_heavy" = orig_heavy_range, "orig_light" = orig_light_range, "x" = x0, "y" = y0, "z" = z0, "area" = areatype.type, "time" = time_stamp("YYYY-MM-DD hh:mm:ss", 1))) - - // Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. - // Stereo users will also hear the direction of the explosion! - - // Calculate far explosion sound range. Only allow the sound effect for heavy/devastating explosions. - // 3/7/14 will calculate to 80 + 35 - - var/far_dist = 0 - far_dist += heavy_impact_range * 15 - far_dist += devastation_range * 20 - - if(!silent) - var/frequency = get_rand_frequency() - var/sound/explosion_sound = sound(get_sfx("explosion")) - var/sound/far_explosion_sound = sound('sound/effects/explosionfar.ogg') - var/sound/creaking_explosion_sound = sound(get_sfx("explosion_creaking")) - var/sound/hull_creaking_sound = sound(get_sfx("hull_creaking")) - var/sound/explosion_echo_sound = sound('sound/effects/explosion_distant.ogg') - var/on_station = SSmapping.level_trait(epicenter.z, ZTRAIT_STATION) - var/creaking_explosion = FALSE - - if(prob(devastation_range*DEVASTATION_PROB+heavy_impact_range*HEAVY_IMPACT_PROB) && on_station) // Huge explosions are near guaranteed to make the station creak and whine, smaller ones might. - creaking_explosion = TRUE // prob over 100 always returns true - - for(var/mob/M in GLOB.player_list) - // Double check for client - var/turf/M_turf = get_turf(M) - if(M_turf && M_turf.z == z0) - var/dist = get_dist(M_turf, epicenter) - var/baseshakeamount - if(orig_max_distance - dist > 0) - baseshakeamount = sqrt((orig_max_distance - dist)*0.1) - // If inside the blast radius + world.view (x) - 2 - if(dist <= round(max_range + getviewsize(world.view)[1] - 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)) - // 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/2, FAR_LOWER, FAR_UPPER) // Volume is based on explosion size and dist - if(creaking_explosion) - M.playsound_local(epicenter, null, far_volume, 1, frequency, S = creaking_explosion_sound, turf_source = 0) - else if(prob(PROB_SOUND)) // Sound variety during meteor storm/tesloose/other bad event - M.playsound_local(epicenter, null, far_volume, 1, frequency, S = far_explosion_sound, turf_source = 0) // Far sound - else - M.playsound_local(epicenter, null, far_volume, 1, frequency, S = explosion_echo_sound, turf_source = 0) // Echo sound - - if(baseshakeamount > 0 || devastation_range) - if(!baseshakeamount) // Devastating explosions rock the station and ground - baseshakeamount = devastation_range*3 - shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, SHAKE_CLAMP)) - else if(!isspaceturf(get_turf(M)) && heavy_impact_range) // Big enough explosions echo throughout the hull - var/echo_volume = 40 - if(devastation_range) - baseshakeamount = devastation_range - shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, SHAKE_CLAMP)) - echo_volume = 60 - M.playsound_local(epicenter, null, echo_volume, 1, frequency, S = explosion_echo_sound, turf_source = 0) - - if(creaking_explosion) // 5 seconds after the bang, the station begins to creak - addtimer(CALLBACK(M, /mob/proc/playsound_local, epicenter, null, rand(FREQ_LOWER, FREQ_UPPER), 1, frequency, null, null, FALSE, hull_creaking_sound, 0), CREAK_DELAY) - EX_PREPROCESS_CHECK_TICK - - //postpone processing for a bit - var/postponeCycles = max(round(devastation_range/8),1) - SSlighting.postpone(postponeCycles) - SSmachines.postpone(postponeCycles) - - if(heavy_impact_range > 1) - var/datum/effect_system/explosion/E - if(smoke) - E = new /datum/effect_system/explosion/smoke - else - E = new - E.set_up(epicenter) - E.start() - - EX_PREPROCESS_CHECK_TICK - - //flash mobs - if(flash_range) - for(var/mob/living/L in viewers(flash_range, epicenter)) - L.flash_act() - - EX_PREPROCESS_CHECK_TICK - - var/list/exploded_this_tick = list() //open turfs that need to be blocked off while we sleep - var/list/affected_turfs = GatherSpiralTurfs(max_range, epicenter) - - var/reactionary = CONFIG_GET(flag/reactionary_explosions) - var/list/cached_exp_block - - if(reactionary) - cached_exp_block = CaculateExplosionBlock(affected_turfs) - - //lists are guaranteed to contain at least 1 turf at this point - - var/iteration = 0 - var/affTurfLen = affected_turfs.len - var/expBlockLen = cached_exp_block.len - for(var/TI in affected_turfs) - var/turf/T = TI - ++iteration - var/init_dist = cheap_hypotenuse(T.x, T.y, x0, y0) - var/dist = init_dist - - if(reactionary) - var/turf/Trajectory = T - while(Trajectory != epicenter) - Trajectory = get_step_towards(Trajectory, epicenter) - dist += cached_exp_block[Trajectory] - - var/flame_dist = dist < flame_range - var/throw_dist = dist - - if(dist < devastation_range) - dist = EXPLODE_DEVASTATE - else if(dist < heavy_impact_range) - dist = EXPLODE_HEAVY - else if(dist < light_impact_range) - dist = EXPLODE_LIGHT - else - dist = EXPLODE_NONE - - //------- EX_ACT AND TURF FIRES ------- - - if(T == epicenter) // Ensures explosives detonating from bags trigger other explosives in that bag - var/list/items = list() - for(var/I in T) - var/atom/A = I - if (!A.prevent_content_explosion()) //The atom/contents_explosion() proc returns null if the contents ex_acting has been handled by the atom, and TRUE if it hasn't. - items += A.GetAllContents() - for(var/O in items) - var/atom/A = O - if(!QDELETED(A)) - A.ex_act(dist) - - if(flame_dist && prob(40) && !isspaceturf(T) && !T.density) - new /obj/effect/hotspot(T) //Mostly for ambience! - - if(dist > EXPLODE_NONE) - T.explosion_level = max(T.explosion_level, dist) //let the bigger one have it - T.explosion_id = id - T.ex_act(dist) - exploded_this_tick += T - - //--- THROW ITEMS AROUND --- - - var/throw_dir = get_dir(epicenter,T) - for(var/obj/item/I in T) - if(!I.anchored) - var/throw_range = rand(throw_dist, max_range) - var/turf/throw_at = get_ranged_target_turf(I, throw_dir, throw_range) - I.throw_at(throw_at, throw_range, EXPLOSION_THROW_SPEED) - - for(var/mob/living/L in T) - if(!L.anchored) - var/throw_range = rand(throw_dist, max_range) - var/turf/throw_at = get_ranged_target_turf(L, throw_dir, throw_range) - L.throw_at(throw_at, throw_range, EXPLOSION_THROW_SPEED) - - //wait for the lists to repop - var/break_condition - if(reactionary) - //If we've caught up to the density checker thread and there are no more turfs to process - break_condition = iteration == expBlockLen && iteration < affTurfLen - else - //If we've caught up to the turf gathering thread and it's still running - break_condition = iteration == affTurfLen && !stopped - - if(break_condition || TICK_CHECK) - stoplag() - - if(!running) - break - - //update the trackers - affTurfLen = affected_turfs.len - expBlockLen = cached_exp_block.len - - if(break_condition) - if(reactionary) - //until there are more block checked turfs than what we are currently at - //or the explosion has stopped - UNTIL(iteration < affTurfLen || !running) - else - //until there are more gathered turfs than what we are currently at - //or there are no more turfs to gather/the explosion has stopped - UNTIL(iteration < expBlockLen || stopped) - - if(!running) - break - - //update the trackers - affTurfLen = affected_turfs.len - expBlockLen = cached_exp_block.len - - var/circumference = (PI * (init_dist + 4) * 2) //+4 to radius to prevent shit gaps - if(exploded_this_tick.len > circumference) //only do this every revolution - for(var/Unexplode in exploded_this_tick) - var/turf/UnexplodeT = Unexplode - UnexplodeT.explosion_level = 0 - exploded_this_tick.Cut() - - //unfuck the shit - for(var/Unexplode in exploded_this_tick) - var/turf/UnexplodeT = Unexplode - UnexplodeT.explosion_level = 0 - exploded_this_tick.Cut() - - var/took = (REALTIMEOFDAY - started_at) / 10 - - //You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare - if(GLOB.Debug2) - log_world("## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds.") - - if(running) //if we aren't in a hurry - //Machines which report explosions. - for(var/array in GLOB.doppler_arrays) - var/obj/machinery/doppler_array/A = array - A.sense_explosion(epicenter, devastation_range, heavy_impact_range, light_impact_range, took,orig_dev_range, orig_heavy_range, orig_light_range) - - ++stopped - qdel(src) - -#undef EX_PREPROCESS_EXIT_CHECK -#undef EX_PREPROCESS_CHECK_TICK - - - -//asyncly populate the affected_turfs list -/datum/explosion/proc/GatherSpiralTurfs(range, turf/epicenter) - set waitfor = FALSE - . = list() - spiral_range_turfs(range, epicenter, outlist = ., tick_checked = TRUE) - ++stopped - -/datum/explosion/proc/CaculateExplosionBlock(list/affected_turfs) - set waitfor = FALSE - - . = list() - var/processed = 0 - while(running) - var/I - for(I in (processed + 1) to affected_turfs.len) // we cache the explosion block rating of every turf in the explosion area - var/turf/T = affected_turfs[I] - var/current_exp_block = T.density ? T.explosion_block : 0 - - for(var/obj/O in T) - var/the_block = O.explosion_block - current_exp_block += the_block == EXPLOSION_BLOCK_PROC ? O.GetExplosionBlock() : the_block - - .[T] = current_exp_block - - if(TICK_CHECK) - break - - processed = I - stoplag() - -/datum/explosion/Destroy() - running = FALSE - if(stopped < 2) //wait for main thread and spiral_range thread - return QDEL_HINT_IWILLGC - GLOB.explosions -= src - explosion_source = null - return ..() - -/client/proc/check_bomb_impacts() - set name = "Check Bomb Impact" - set category = "Debug" - - var/newmode = alert("Use reactionary explosions?","Check Bomb Impact", "Yes", "No") - var/turf/epicenter = get_turf(mob) - if(!epicenter) - return - - var/dev = 0 - var/heavy = 0 - var/light = 0 - var/list/choices = list("Small Bomb","Medium Bomb","Big Bomb","Custom Bomb") - var/choice = input("Bomb Size?") in choices - switch(choice) - if(null) - return 0 - if("Small Bomb") - dev = 1 - heavy = 2 - light = 3 - if("Medium Bomb") - dev = 2 - heavy = 3 - light = 4 - if("Big Bomb") - dev = 3 - heavy = 5 - light = 7 - if("Custom Bomb") - dev = input("Devastation range (Tiles):") as num - heavy = input("Heavy impact range (Tiles):") as num - light = input("Light impact range (Tiles):") as num - - var/max_range = max(dev, heavy, light) - var/x0 = epicenter.x - var/y0 = epicenter.y - var/list/wipe_colours = list() - for(var/turf/T in spiral_range_turfs(max_range, epicenter)) - wipe_colours += T - var/dist = cheap_hypotenuse(T.x, T.y, x0, y0) - - if(newmode == "Yes") - var/turf/TT = T - while(TT != epicenter) - TT = get_step_towards(TT,epicenter) - if(TT.density) - dist += TT.explosion_block - - for(var/obj/O in T) - var/the_block = O.explosion_block - dist += the_block == EXPLOSION_BLOCK_PROC ? O.GetExplosionBlock() : the_block - - if(dist < dev) - T.color = "red" - T.maptext = "Dev" - else if (dist < heavy) - T.color = "yellow" - T.maptext = "Heavy" - else if (dist < light) - T.color = "blue" - T.maptext = "Light" - else - continue - - addtimer(CALLBACK(GLOBAL_PROC, .proc/wipe_color_and_text, wipe_colours), 100) - -/proc/wipe_color_and_text(list/atom/wiping) - for(var/i in wiping) - var/atom/A = i - A.color = null - A.maptext = "" - -/proc/dyn_explosion(turf/epicenter, power, flash_range, adminlog = TRUE, ignorecap = TRUE, flame_range = 0, silent = FALSE, smoke = TRUE) - if(!power) - return - var/range = 0 - range = round((2 * power)**GLOB.DYN_EX_SCALE) - explosion(epicenter, round(range * 0.25), round(range * 0.5), round(range), flash_range*range, adminlog, ignorecap, flame_range*range, silent, smoke) - -// Using default dyn_ex scale: -// 100 explosion power is a (5, 10, 20) explosion. -// 75 explosion power is a (4, 8, 17) explosion. -// 50 explosion power is a (3, 7, 14) explosion. -// 25 explosion power is a (2, 5, 10) explosion. -// 10 explosion power is a (1, 3, 6) explosion. -// 5 explosion power is a (0, 1, 3) explosion. -// 1 explosion power is a (0, 0, 1) explosion. -#undef CREAK_DELAY -#undef DEVASTATION_PROB -#undef HEAVY_IMPACT_PROB -#undef FAR_UPPER -#undef FAR_LOWER -#undef PROB_SOUND -#undef SHAKE_CLAMP -#undef FREQ_UPPER -#undef FREQ_LOWER \ No newline at end of file diff --git a/code/datums/helper_datums/events.dm b/code/datums/helper_datums/events.dm index e6e4061671cdf..249af3181cc93 100644 --- a/code/datums/helper_datums/events.dm +++ b/code/datums/helper_datums/events.dm @@ -36,7 +36,7 @@ // Arguments: event_type as text, any number of additional arguments to pass to event handler // Returns: null /datum/events/proc/fireEvent(eventName, ...) - var/list/event = listgetindex(events,eventName) + var/list/event = LAZYACCESS(events,eventName) if(istype(event)) for(var/E in event) var/datum/callback/cb = E @@ -48,7 +48,7 @@ /datum/events/proc/clearEvent(event_type as text, datum/callback/cb) if(!event_type || !cb) return FALSE - var/list/event = listgetindex(events,event_type) + var/list/event = LAZYACCESS(events,event_type) event -= cb qdel(cb) return TRUE diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index b566b37ab438b..42a10b6e90c45 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 = revinfo.timestamp || rustg_git_commit_date(commit) // goes to DD log and config_error.txt log_world(get_log_message()) @@ -27,8 +29,8 @@ for(var/line in testmerge) var/datum/tgs_revision_information/test_merge/tm = line - msg += "Test merge active of PR #[tm.number] commit [tm.pull_request_commit]" - SSblackbox.record_feedback("associative", "testmerged_prs", 1, list("number" = "[tm.number]", "commit" = "[tm.pull_request_commit]", "title" = "[tm.title]", "author" = "[tm.author]")) + msg += "Test merge active of PR #[tm.number] commit [tm.head_commit]" + SSblackbox.record_feedback("associative", "testmerged_prs", 1, list("number" = "[tm.number]", "commit" = "[tm.head_commit]", "title" = "[tm.title]", "author" = "[tm.author]")) if(commit && commit != originmastercommit) msg += "HEAD: [commit]" @@ -43,7 +45,7 @@ . = header ? "The following pull requests are currently test merged:
" : "" for(var/line in testmerge) var/datum/tgs_revision_information/test_merge/tm = line - var/cm = tm.pull_request_commit + var/cm = tm.head_commit var/details = ": '" + html_encode(tm.title) + "' by " + html_encode(tm.author) + " at commit " + html_encode(copytext_char(cm, 1, 11)) if(details && findtext(details, "\[s\]") && (!usr || !usr.client.holder)) continue @@ -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:" diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 29c51577a594f..ac3d91f6ca59d 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -8,7 +8,7 @@ // forceMove: if false, teleport will use Move() proc (dense objects will prevent teleportation) // no_effects: disable the default effectin/effectout of sparks // forced: whether or not to ignore no_teleport -/proc/do_teleport(atom/movable/teleatom, atom/destination, precision=null, forceMove = TRUE, datum/effect_system/effectin=null, datum/effect_system/effectout=null, asoundin=null, asoundout=null, no_effects=FALSE, channel=TELEPORT_CHANNEL_BLUESPACE, forced = FALSE) +/proc/do_teleport(atom/movable/teleatom, atom/destination, precision=null, forceMove = TRUE, datum/effect_system/effectin=null, datum/effect_system/effectout=null, asoundin=null, asoundout=null, no_effects=FALSE, channel=TELEPORT_CHANNEL_BLUESPACE, forced = FALSE, teleport_mode = TELEPORT_MODE_DEFAULT) // teleporting most effects just deletes them var/static/list/delete_atoms = typecacheof(list( /obj/effect, @@ -16,6 +16,8 @@ /obj/effect/dummy/chameleon, /obj/effect/wisp, /obj/effect/mob_spawn, + /obj/effect/warp_cube, + /obj/effect/extraction_holder, )) if(delete_atoms[teleatom.type]) qdel(teleatom) @@ -56,7 +58,11 @@ var/area/A = get_area(curturf) var/area/B = get_area(destturf) - if(!forced && (HAS_TRAIT(teleatom, TRAIT_NO_TELEPORT) || A.noteleport || B.noteleport)) + if(!forced && (HAS_TRAIT(teleatom, TRAIT_NO_TELEPORT))) + return FALSE + + //Either area has teleport restriction and teleport mode isn't allowed in that area + if(!forced && ((A.teleport_restriction && A.teleport_restriction != teleport_mode) || (B.teleport_restriction && B.teleport_restriction != teleport_mode))) return FALSE if(SEND_SIGNAL(destturf, COMSIG_ATOM_INTERCEPT_TELEPORT, channel, curturf, destturf)) @@ -87,7 +93,7 @@ effect.start() // Safe location finder -/proc/find_safe_turf(zlevel, list/zlevels, extended_safety_checks = FALSE) +/proc/find_safe_turf(zlevel, list/zlevels, extended_safety_checks = FALSE, dense_atoms = TRUE) if(!zlevels) if (zlevel) zlevels = list(zlevel) @@ -118,11 +124,11 @@ // Can most things breathe? if(trace_gases) continue - if(A.get_moles(/datum/gas/oxygen) < 16) + if(A.get_moles(GAS_O2) < 16) continue - if(A.get_moles(/datum/gas/plasma)) + if(A.get_moles(GAS_PLASMA)) continue - if(A.get_moles(/datum/gas/carbon_dioxide) >= 10) + if(A.get_moles(GAS_CO2) >= 10) continue // Aim for goldilocks temperatures and pressure @@ -138,19 +144,35 @@ if(!L.is_safe()) continue + // Check that we're not warping onto a table or window + if(!dense_atoms) + var/density_found = FALSE + for(var/atom/movable/found_movable in F) + if(found_movable.density) + density_found = TRUE + break + if(density_found) + continue + // DING! You have passed the gauntlet, and are "probably" safe. return F /proc/get_teleport_turfs(turf/center, precision = 0) if(!precision) return list(center) + //Return only open turfs unless none are available + var/list/safe_turfs = list() var/list/posturfs = list() - for(var/turf/T in range(precision,center)) + for(var/turf/T as() in RANGE_TURFS(precision, center)) if(T.is_transition_turf()) continue // Avoid picking these. var/area/A = T.loc - if(!A.noteleport) + if(!A.teleport_restriction) posturfs.Add(T) + if(isopenturf(T)) + safe_turfs += T + if(length(safe_turfs)) + return safe_turfs return posturfs /proc/get_teleport_turf(turf/center, precision = 0) diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index dafd2b11a3fa8..e28192bed544c 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -9,7 +9,7 @@ #define HOLORECORD_MAX_LENGTH 200 -/mob/camera/aiEye/remote/holo/setLoc() +/mob/camera/ai_eye/remote/holo/setLoc() . = ..() var/obj/machinery/holopad/H = origin H?.move_hologram(eye_user, loc) @@ -27,7 +27,7 @@ var/obj/machinery/holopad/connected_holopad //the one that answered the call (may be null) var/list/dialed_holopads //all things called, will be cleared out to just connected_holopad once answered - var/mob/camera/aiEye/remote/holo/eye //user's eye, once connected + var/mob/camera/ai_eye/remote/holo/eye //user's eye, once connected var/obj/effect/overlay/holo_pad_hologram/hologram //user's hologram, once connected var/datum/action/innate/end_holocall/hangup //hangup action @@ -72,6 +72,7 @@ if(!QDELETED(hologram)) hologram.HC = null QDEL_NULL(hologram) + hologram = null for(var/I in dialed_holopads) var/obj/machinery/holopad/H = I diff --git a/code/datums/hud.dm b/code/datums/hud.dm index eeeee8b1ab4dc..4bf5c2e60a347 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -56,11 +56,14 @@ GLOBAL_LIST_INIT(huds, list( GLOB.all_huds -= src return ..() -/datum/atom_hud/proc/remove_hud_from(mob/M) +/datum/atom_hud/proc/remove_hud_from(mob/M, absolute = FALSE) if(!M || !hudusers[M]) return - if (!--hudusers[M]) + if (absolute || !--hudusers[M]) + UnregisterSignal(M, COMSIG_PARENT_QDELETING) hudusers -= M + if(next_time_allowed[M]) + next_time_allowed -= M if(queued_to_see[M]) queued_to_see -= M else @@ -76,7 +79,7 @@ GLOBAL_LIST_INIT(huds, list( return TRUE /datum/atom_hud/proc/remove_from_single_hud(mob/M, atom/A) //unsafe, no sanity apart from client - if(!M || !M.client || !A) + if(!M || !M.client || !A?.hud_list.len) return for(var/i in hud_icons) M.client.images -= A.hud_list[i] @@ -86,6 +89,7 @@ GLOBAL_LIST_INIT(huds, list( return if(!hudusers[M]) hudusers[M] = 1 + RegisterSignal(M, COMSIG_PARENT_QDELETING, .proc/unregister_mob) if(next_time_allowed[M] > world.time) if(!queued_to_see[M]) addtimer(CALLBACK(src, .proc/show_hud_images_after_cooldown, M), next_time_allowed[M] - world.time) @@ -97,6 +101,12 @@ GLOBAL_LIST_INIT(huds, list( else hudusers[M]++ +/datum/atom_hud/proc/unregister_mob(datum/source, force) + SIGNAL_HANDLER + + remove_hud_from(source, TRUE) + remove_from_hud(source) + /datum/atom_hud/proc/show_hud_images_after_cooldown(M) if(queued_to_see[M]) queued_to_see -= M diff --git a/code/datums/keybinding/carbon.dm b/code/datums/keybinding/carbon.dm index 015a879cf0bea..05f62d9825219 100644 --- a/code/datums/keybinding/carbon.dm +++ b/code/datums/keybinding/carbon.dm @@ -71,3 +71,17 @@ var/mob/living/carbon/C = user.mob C.a_intent_change(INTENT_HARM) return TRUE + +/datum/keybinding/carbon/give + key = "G" + name = "Give_Item" + full_name = "Give item" + description = "Give the item you're currently holding" + category = CATEGORY_CARBON + +/datum/keybinding/carbon/give/down(client/user) + if(!iscarbon(user.mob)) + return + var/mob/living/carbon/C = user.mob + C.give() + return TRUE diff --git a/code/datums/keybinding/client.dm b/code/datums/keybinding/client.dm index d95bac96b99e1..555bd423ab00e 100644 --- a/code/datums/keybinding/client.dm +++ b/code/datums/keybinding/client.dm @@ -34,3 +34,16 @@ /datum/keybinding/client/toggleminimalhud/down(client/user) user.mob.button_pressed_F12() return TRUE + + +/datum/keybinding/client/zoomin + key = "\]" + name = "zoomin" + full_name = "Zoom In" + description = "Temporary switch icon scaling mode to 4x until unpressed" + +/datum/keybinding/client/zoomin/down(client/user) + winset(user, "mapwindow.map", "zoom=[PIXEL_SCALING_4X]") + +/datum/keybinding/client/zoomin/up(client/user) + winset(user, "mapwindow.map", "zoom=[user.prefs.pixel_size]") diff --git a/code/datums/keybinding/human.dm b/code/datums/keybinding/human.dm index 300f91a2d7cbe..7b588fe7a016d 100644 --- a/code/datums/keybinding/human.dm +++ b/code/datums/keybinding/human.dm @@ -10,7 +10,8 @@ description = "" /datum/keybinding/human/quick_equip/down(client/user) - if (!ishuman(user.mob)) return + if(!ishuman(user.mob) || user.mob.incapacitated()) + return var/mob/living/carbon/human/H = user.mob H.quick_equip() return TRUE @@ -23,15 +24,16 @@ description = "" /datum/keybinding/human/quick_equip_belt/down(client/user) - if (!ishuman(user.mob)) return + if(!ishuman(user.mob) || user.mob.incapacitated()) + return var/mob/living/carbon/human/H = user.mob var/obj/item/thing = H.get_active_held_item() - var/obj/item/equipped_belt = H.get_item_by_slot(SLOT_BELT) + var/obj/item/equipped_belt = H.get_item_by_slot(ITEM_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 TRUE - if(H.equip_to_slot_if_possible(thing, SLOT_BELT)) + if(H.equip_to_slot_if_possible(thing, ITEM_SLOT_BELT)) H.update_inv_hands() return TRUE if(!SEND_SIGNAL(equipped_belt, COMSIG_CONTAINS_STORAGE)) // not a storage item @@ -61,15 +63,16 @@ description = "" /datum/keybinding/human/quick_equip_backpack/down(client/user) - if (!ishuman(user.mob)) return + if(!ishuman(user.mob) || user.mob.incapacitated()) + return var/mob/living/carbon/human/H = user.mob var/obj/item/thing = H.get_active_held_item() - var/obj/item/equipped_back = H.get_item_by_slot(SLOT_BACK) + var/obj/item/equipped_back = H.get_item_by_slot(ITEM_SLOT_BACK) if(!equipped_back) // We also let you equip a backpack like this if(!thing) to_chat(user, "You have no backpack to take something out of.") return - if(H.equip_to_slot_if_possible(thing, SLOT_BACK)) + if(H.equip_to_slot_if_possible(thing, ITEM_SLOT_BACK)) H.update_inv_hands() return if(!SEND_SIGNAL(equipped_back, COMSIG_CONTAINS_STORAGE)) // not a storage item @@ -90,3 +93,30 @@ return stored.attack_hand(H) // take out thing from backpack return + +/datum/keybinding/human/quick_equip_suit_storage + key = "Shift-Q" + name = "quick_equip_suit_storage" + full_name = "Put Item In Suit Storage" + description = "" + +/datum/keybinding/human/quick_equip_suit_storage/down(client/user) + if(!ishuman(user.mob) || user.mob.incapacitated()) + return + var/mob/living/carbon/human/H = user.mob + var/obj/item/thing = H.get_active_held_item() + var/obj/item/stored = H.get_item_by_slot(ITEM_SLOT_SUITSTORE) + if(!stored) + if(!thing) + to_chat(user, "There's nothing in your suit storage to take out.") + return TRUE + if(H.equip_to_slot_if_possible(thing, ITEM_SLOT_SUITSTORE)) + H.update_inv_hands() + return TRUE + if(thing && stored) + to_chat(user, "There's already something in your suit storage!") + return TRUE + if(!stored || stored.on_found(H)) + return TRUE + stored.attack_hand(H) + return TRUE \ No newline at end of file diff --git a/code/datums/keybinding/living.dm b/code/datums/keybinding/living.dm index 156b2d8892b7b..5fc5bbed94a6c 100644 --- a/code/datums/keybinding/living.dm +++ b/code/datums/keybinding/living.dm @@ -14,3 +14,16 @@ var/mob/living/L = user.mob L.resist() return TRUE + +/datum/keybinding/living/rest + key = "V" + name = "rest" + full_name = "Rest" + description = "Lay down, or get up." + +/datum/keybinding/living/rest/down(client/user) + if(!isliving(user.mob)) + return + var/mob/living/L = user.mob + L.lay_down() + return TRUE \ No newline at end of file diff --git a/code/datums/keybinding/mob.dm b/code/datums/keybinding/mob.dm index 75e259caab1cc..3deb6a2776088 100644 --- a/code/datums/keybinding/mob.dm +++ b/code/datums/keybinding/mob.dm @@ -149,6 +149,20 @@ M.toggle_move_intent() return TRUE +/datum/keybinding/mob/toggle_move_intent_alternative + key = "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" + +/datum/keybinding/mob/toggle_move_intent_alternative/down(client/user) + . = ..() + if(.) + return + var/mob/M = user.mob + M.toggle_move_intent() + return TRUE + /datum/keybinding/mob/target_head_cycle key = "Numpad8" name = "target_head_cycle" @@ -225,3 +239,21 @@ if(!user.mob) return user.body_l_leg() return TRUE + +/datum/keybinding/mob/prevent_movement + key = "Ctrl" + name = "block_movement" + full_name = "Block movement" + description = "While pressed, prevents movement when pressing directional keys; instead just changes your facing direction" + +/datum/keybinding/mob/prevent_movement/down(client/user) + . = ..() + if(.) + return + user.movement_locked = TRUE + +/datum/keybinding/mob/prevent_movement/up(client/user) + . = ..() + if(.) + return + user.movement_locked = FALSE diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm index 5a236beb6f73c..e146487fb4591 100644 --- a/code/datums/looping_sounds/_looping_sound.dm +++ b/code/datums/looping_sounds/_looping_sound.dm @@ -58,7 +58,7 @@ if(!timerid) return on_stop() - deltimer(timerid) + deltimer(timerid, SSsound_loops) timerid = null /datum/looping_sound/proc/sound_loop(starttime) @@ -68,13 +68,13 @@ if(!chance || prob(chance)) play(get_sound(starttime)) if(!timerid) - timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), mid_length, TIMER_CLIENT_TIME | TIMER_STOPPABLE | TIMER_LOOP) + timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), mid_length, TIMER_CLIENT_TIME | TIMER_STOPPABLE | TIMER_LOOP, SSsound_loops) /datum/looping_sound/proc/play(soundfile) 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] @@ -93,7 +93,7 @@ if(start_sound) play(start_sound) start_wait = start_length - addtimer(CALLBACK(src, .proc/sound_loop), start_wait, TIMER_CLIENT_TIME) + addtimer(CALLBACK(src, .proc/sound_loop), start_wait, TIMER_CLIENT_TIME, SSsound_loops) /datum/looping_sound/proc/on_stop() if(end_sound) diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm index 3bc2a3548a3af..733373fd2c38a 100644 --- a/code/datums/map_config.dm +++ b/code/datums/map_config.dm @@ -19,12 +19,13 @@ var/map_file = "BoxStation.dmm" var/traits = null - var/space_ruin_levels = 7 + var/space_ruin_levels = 4 //Keep this low, as new ones are created dynamically when needed. var/space_empty_levels = 1 var/minetype = "lavaland" var/allow_custom_shuttles = TRUE + var/allow_night_lighting = TRUE var/shuttles = list( "cargo" = "cargo_box", "ferry" = "ferry_fancy", @@ -128,6 +129,8 @@ allow_custom_shuttles = json["allow_custom_shuttles"] != FALSE + allow_night_lighting = json["allow_night_lighting"] != FALSE + defaulted = FALSE return TRUE #undef CHECK_EXISTS diff --git a/code/datums/mapgen/CaveGenerator.dm b/code/datums/mapgen/CaveGenerator.dm new file mode 100644 index 0000000000000..d016eeae3eb7e --- /dev/null +++ b/code/datums/mapgen/CaveGenerator.dm @@ -0,0 +1,161 @@ +/datum/map_generator/cave_generator + var/name = "Cave Generator" + ///Weighted list of the types that spawns if the turf is open + var/open_turf_types = list(/turf/open/floor/plating/asteroid = 1) + ///Weighted list of the types that spawns if the turf is closed + var/closed_turf_types = list(/turf/closed/mineral/random/volcanic = 1) + ///List of turf types (subtypes included) to skip when generating terrain + var/blacklisted_turf_types + + + ///Weighted list of extra features that can spawn in the area, such as geysers. + var/list/feature_spawn_list = list(/obj/structure/geyser/random = 1) + ///Weighted list of mobs that can spawn in the area. + var/list/mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /obj/structure/spawner/lavaland/goliath = 3, \ + /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40, /obj/structure/spawner/lavaland = 2, \ + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, /obj/structure/spawner/lavaland/legion = 3, \ + SPAWN_MEGAFAUNA = 4, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10) + ///Weighted list of flora that can spawn in the area. + var/list/flora_spawn_list = list(/obj/structure/flora/ash/leaf_shroom = 2 , /obj/structure/flora/ash/cap_shroom = 2 , /obj/structure/flora/ash/stem_shroom = 2 , /obj/structure/flora/ash/cacti = 1, /obj/structure/flora/ash/tall_shroom = 2) + // Weighted list of Megafauna that can spawn in the caves + var/list/megafauna_spawn_list + + + ///Base chance of spawning a mob + var/mob_spawn_chance = 6 + ///Base chance of spawning flora + var/flora_spawn_chance = 2 + ///Base chance of spawning features + var/feature_spawn_chance = 0.1 + ///Unique ID for this spawner + var/string_gen + + ///Chance of cells starting closed + var/initial_closed_chance = 45 + ///Amount of smoothing iterations + var/smoothing_iterations = 20 + ///How much neighbours does a dead cell need to become alive + var/birth_limit = 4 + ///How little neighbours does a alive cell need to die + var/death_limit = 3 + +/datum/map_generator/cave_generator/New() + . = ..() + if(!megafauna_spawn_list) + megafauna_spawn_list = GLOB.megafauna_spawn_list + +/datum/map_generator/cave_generator/generate_terrain(list/turfs) + . = ..() + var/start_time = REALTIMEOFDAY + string_gen = rustg_cnoise_generate("[initial_closed_chance]", "[smoothing_iterations]", "[birth_limit]", "[death_limit]", "[world.maxx]", "[world.maxy]") //Generate the raw CA data + var/blacklist = typecacheof(blacklisted_turf_types) + + for(var/i in turfs) //Go through all the turfs and generate them + var/turf/gen_turf = i + + if(blacklist && blacklist[gen_turf.type]) + continue + + var/forced + var/closed + + if(istype(gen_turf, /turf/open/genturf)) + var/turf/open/genturf/genturf = gen_turf + if(genturf.force_generation) + forced = TRUE + switch(genturf.genturf_hint) + if(GENTURF_HINT_OPEN) + closed = FALSE + if(GENTURF_HINT_CLOSED) + closed = TRUE + + var/area/A = gen_turf.loc + if(!forced && !(A.area_flags & CAVES_ALLOWED)) + continue + + if(isnull(closed)) + closed = text2num(string_gen[world.maxx * (gen_turf.y - 1) + gen_turf.x]) + + var/stored_flags + if(gen_turf.flags_1 & NO_RUINS_1) + stored_flags |= NO_RUINS_1 + + var/turf/new_turf = pickweight(closed ? closed_turf_types : open_turf_types) + + new_turf = gen_turf.ChangeTurf(new_turf, initial(new_turf.baseturfs), CHANGETURF_DEFER_CHANGE) + + new_turf.flags_1 |= stored_flags + + if(!closed)//Open turfs have some special behavior related to spawning flora and mobs. + + var/turf/open/new_open_turf = new_turf + + ///Spawning isn't done in procs to save on overhead on the 60k turfs we're going through. + + //FLORA SPAWNING HERE + var/atom/spawned_flora + if(flora_spawn_list && prob(flora_spawn_chance)) + var/can_spawn = TRUE + + if(!(A.area_flags & FLORA_ALLOWED)) + can_spawn = FALSE + if(can_spawn) + spawned_flora = pickweight(flora_spawn_list) + spawned_flora = new spawned_flora(new_open_turf) + + //FEATURE SPAWNING HERE + var/atom/spawned_feature + if(feature_spawn_list && prob(feature_spawn_chance)) + var/can_spawn = TRUE + + if(!(A.area_flags & FLORA_ALLOWED)) //checks the same flag because lol dunno + can_spawn = FALSE + + var/atom/picked_feature = pickweight(feature_spawn_list) + + for(var/obj/structure/F in range(7, new_open_turf)) + if(istype(F, picked_feature)) + can_spawn = FALSE + + if(can_spawn) + spawned_feature = new picked_feature(new_open_turf) + + //MOB SPAWNING HERE + + if(mob_spawn_list && !spawned_flora && !spawned_feature && prob(mob_spawn_chance)) + var/can_spawn = TRUE + + if(!(A.area_flags & MOB_SPAWN_ALLOWED)) + can_spawn = FALSE + + var/atom/picked_mob = pickweight(mob_spawn_list) + + if(picked_mob == SPAWN_MEGAFAUNA) // + if((A.area_flags & MEGAFAUNA_SPAWN_ALLOWED) && megafauna_spawn_list?.len) //this is danger. it's boss time. + picked_mob = pickweight(megafauna_spawn_list) + else //this is not danger, don't spawn a boss, spawn something else + picked_mob = pickweight(mob_spawn_list - SPAWN_MEGAFAUNA) //What if we used 100% of the brain...and did something (slightly) less shit than a while loop? + + for(var/thing in urange(12, new_open_turf)) //prevents mob clumps + if(!ishostile(thing) && !istype(thing, /obj/structure/spawner)) + continue + if((ispath(picked_mob, /mob/living/simple_animal/hostile/megafauna) || ismegafauna(thing)) && get_dist(new_open_turf, thing) <= 7) + can_spawn = FALSE //if there's a megafauna within standard view don't spawn anything at all + break + if(ispath(picked_mob, /mob/living/simple_animal/hostile/asteroid) || istype(thing, /mob/living/simple_animal/hostile/asteroid)) + can_spawn = FALSE //if the random is a standard mob, avoid spawning if there's another one within 12 tiles + break + if((ispath(picked_mob, /obj/structure/spawner/lavaland) || istype(thing, /obj/structure/spawner/lavaland)) && get_dist(new_open_turf, thing) <= 2) + can_spawn = FALSE //prevents tendrils spawning in each other's collapse range + break + + if(can_spawn) + if(ispath(picked_mob, /mob/living/simple_animal/hostile/megafauna/bubblegum)) //there can be only one bubblegum, so don't waste spawns on it + megafauna_spawn_list.Remove(picked_mob) + + new picked_mob(new_open_turf) + CHECK_TICK + + var/message = "[name] finished in [(REALTIMEOFDAY - start_time)/10]s!" + to_chat(world, "[message]") + log_world(message) diff --git a/code/datums/mapgen/Cavegens/LavalandGenerator.dm b/code/datums/mapgen/Cavegens/LavalandGenerator.dm new file mode 100644 index 0000000000000..9daf0e8318f39 --- /dev/null +++ b/code/datums/mapgen/Cavegens/LavalandGenerator.dm @@ -0,0 +1,17 @@ +/datum/map_generator/cave_generator/lavaland + open_turf_types = list(/turf/open/floor/plating/asteroid/basalt/lava_land_surface = 1) + closed_turf_types = list(/turf/closed/mineral/random/volcanic = 1) + blacklisted_turf_types = list(/turf/open/lava) // Don't override lava rivers + + + feature_spawn_list = list(/obj/structure/geyser/random = 1) + mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /obj/structure/spawner/lavaland/goliath = 3, \ + /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40, /obj/structure/spawner/lavaland = 2, \ + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, /obj/structure/spawner/lavaland/legion = 3, \ + SPAWN_MEGAFAUNA = 4, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10) + flora_spawn_list = list(/obj/structure/flora/ash/leaf_shroom = 2 , /obj/structure/flora/ash/cap_shroom = 2 , /obj/structure/flora/ash/stem_shroom = 2 , /obj/structure/flora/ash/cacti = 1, /obj/structure/flora/ash/tall_shroom = 2, /obj/structure/flora/ash/strange = 1) + + initial_closed_chance = 45 + smoothing_iterations = 50 + birth_limit = 4 + death_limit = 3 diff --git a/code/datums/mapgen/JungleGenerator.dm b/code/datums/mapgen/JungleGenerator.dm new file mode 100644 index 0000000000000..1e329ac3df634 --- /dev/null +++ b/code/datums/mapgen/JungleGenerator.dm @@ -0,0 +1,95 @@ +//the random offset applied to square coordinates, causes intermingling at biome borders +#define BIOME_RANDOM_SQUARE_DRIFT 2 + +/datum/map_generator/jungle_generator + ///2D list of all biomes based on heat and humidity combos. + var/list/possible_biomes = list( + BIOME_LOW_HEAT = list( + BIOME_LOW_HUMIDITY = /datum/biome/plains, + BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/mudlands, + BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/mudlands, + BIOME_HIGH_HUMIDITY = /datum/biome/water + ), + BIOME_LOWMEDIUM_HEAT = list( + BIOME_LOW_HUMIDITY = /datum/biome/plains, + BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/jungle, + BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/jungle, + BIOME_HIGH_HUMIDITY = /datum/biome/mudlands + ), + BIOME_HIGHMEDIUM_HEAT = list( + BIOME_LOW_HUMIDITY = /datum/biome/plains, + BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/plains, + BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/jungle/deep, + BIOME_HIGH_HUMIDITY = /datum/biome/jungle + ), + BIOME_HIGH_HEAT = list( + BIOME_LOW_HUMIDITY = /datum/biome/wasteland, + BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/plains, + BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/jungle, + BIOME_HIGH_HUMIDITY = /datum/biome/jungle/deep + ) + ) + ///Used to select "zoom" level into the perlin noise, higher numbers result in slower transitions + var/perlin_zoom = 65 + +///Seeds the rust-g perlin noise with a random number. +/datum/map_generator/jungle_generator/generate_terrain(var/list/turfs) + . = ..() + var/height_seed = rand(0, 50000) + var/humidity_seed = rand(0, 50000) + var/heat_seed = rand(0, 50000) + + for(var/t in turfs) //Go through all the turfs and generate them + var/turf/gen_turf = t + var/drift_x = (gen_turf.x + rand(-BIOME_RANDOM_SQUARE_DRIFT, BIOME_RANDOM_SQUARE_DRIFT)) / perlin_zoom + var/drift_y = (gen_turf.y + rand(-BIOME_RANDOM_SQUARE_DRIFT, BIOME_RANDOM_SQUARE_DRIFT)) / perlin_zoom + + var/height = text2num(rustg_noise_get_at_coordinates("[height_seed]", "[drift_x]", "[drift_y]")) + + + var/datum/biome/selected_biome + if(height <= 0.85) //If height is less than 0.85, we generate biomes based on the heat and humidity of the area. + var/humidity = text2num(rustg_noise_get_at_coordinates("[humidity_seed]", "[drift_x]", "[drift_y]")) + var/heat = text2num(rustg_noise_get_at_coordinates("[heat_seed]", "[drift_x]", "[drift_y]")) + var/heat_level //Type of heat zone we're in LOW-MEDIUM-HIGH + var/humidity_level //Type of humidity zone we're in LOW-MEDIUM-HIGH + + switch(heat) + if(0 to 0.25) + heat_level = BIOME_LOW_HEAT + if(0.25 to 0.5) + heat_level = BIOME_LOWMEDIUM_HEAT + if(0.5 to 0.75) + heat_level = BIOME_HIGHMEDIUM_HEAT + if(0.75 to 1) + heat_level = BIOME_HIGH_HEAT + switch(humidity) + if(0 to 0.25) + humidity_level = BIOME_LOW_HUMIDITY + if(0.25 to 0.5) + humidity_level = BIOME_LOWMEDIUM_HUMIDITY + if(0.5 to 0.75) + humidity_level = BIOME_HIGHMEDIUM_HUMIDITY + if(0.75 to 1) + humidity_level = BIOME_HIGH_HUMIDITY + selected_biome = possible_biomes[heat_level][humidity_level] + else //Over 0.85; It's a mountain + selected_biome = /datum/biome/mountain + selected_biome = SSmapping.biomes[selected_biome] //Get the instance of this biome from SSmapping + selected_biome.generate_turf(gen_turf) + CHECK_TICK + +/turf/open/genturf + name = "ungenerated turf" + desc = "If you see this, and you're not a ghost, yell at coders" + icon = 'icons/turf/debug.dmi' + icon_state = "genturf" + ///Can be: null, GENTURF_HINT_OPEN or GENTURF_HINT_CLOSED + var/genturf_hint + ///Should the generation be ran even if the area forbids it? + var/force_generation + +/area/mine/planetgeneration + name = "planet generation area" + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + map_generator = /datum/map_generator/jungle_generator diff --git a/code/datums/mapgen/_MapGenerator.dm b/code/datums/mapgen/_MapGenerator.dm new file mode 100644 index 0000000000000..aa4406bf789e0 --- /dev/null +++ b/code/datums/mapgen/_MapGenerator.dm @@ -0,0 +1,6 @@ +///This type is responsible for any map generation behavior that is done in areas, override this to allow for area-specific map generation. This generation is ran by areas in initialize. +/datum/map_generator + +///This proc will be ran by areas on Initialize, and provides the areas turfs as argument to allow for generation. +/datum/map_generator/proc/generate_terrain(var/list/turfs) + return diff --git a/code/datums/mapgen/biomes/_biome.dm b/code/datums/mapgen/biomes/_biome.dm new file mode 100644 index 0000000000000..bf0f02cfbaadf --- /dev/null +++ b/code/datums/mapgen/biomes/_biome.dm @@ -0,0 +1,50 @@ +///This datum handles the transitioning from a turf to a specific biome, and handles spawning decorative structures and mobs. +/datum/biome + ///Type of turf this biome creates + var/turf_type + ///Chance of having a structure from the flora types list spawn + var/flora_density = 0 + ///Chance of having a mob from the fauna types list spawn + var/fauna_density = 0 + ///list of type paths of objects that can be spawned when the turf spawns flora + var/list/flora_types = list(/obj/structure/flora/grass/jungle) + ///list of type paths of mobs that can be spawned when the turf spawns fauna + var/list/fauna_types = list() + +///This proc handles the creation of a turf of a specific biome type +/datum/biome/proc/generate_turf(var/turf/gen_turf) + gen_turf.ChangeTurf(turf_type, null, CHANGETURF_DEFER_CHANGE) + if(length(fauna_types) && prob(fauna_density)) + var/mob/fauna = pick(fauna_types) + new fauna(gen_turf) + + if(length(flora_types) && prob(flora_density)) + var/obj/structure/flora = pick(flora_types) + new flora(gen_turf) + +/datum/biome/mudlands + turf_type = /turf/open/floor/plating/dirt/jungle/dark + flora_types = list(/obj/structure/flora/grass/jungle,/obj/structure/flora/grass/jungle/b, /obj/structure/flora/rock/jungle, /obj/structure/flora/rock/pile/largejungle) + flora_density = 3 + +/datum/biome/plains + turf_type = /turf/open/floor/plating/grass/jungle + flora_types = list(/obj/structure/flora/grass/jungle,/obj/structure/flora/grass/jungle/b, /obj/structure/flora/tree/jungle, /obj/structure/flora/rock/jungle, /obj/structure/flora/junglebush, /obj/structure/flora/junglebush/b, /obj/structure/flora/junglebush/c, /obj/structure/flora/junglebush/large, /obj/structure/flora/rock/pile/largejungle) + flora_density = 15 + +/datum/biome/jungle + turf_type = /turf/open/floor/plating/grass/jungle + flora_types = list(/obj/structure/flora/grass/jungle,/obj/structure/flora/grass/jungle/b, /obj/structure/flora/tree/jungle, /obj/structure/flora/rock/jungle, /obj/structure/flora/junglebush, /obj/structure/flora/junglebush/b, /obj/structure/flora/junglebush/c, /obj/structure/flora/junglebush/large, /obj/structure/flora/rock/pile/largejungle) + flora_density = 40 + +/datum/biome/jungle/deep + flora_density = 65 + +/datum/biome/wasteland + turf_type = /turf/open/floor/plating/dirt/jungle/wasteland + +/datum/biome/water + turf_type = /turf/open/water/jungle + +/datum/biome/mountain + turf_type = /turf/closed/mineral/random/jungle diff --git a/code/datums/martial/_martial.dm b/code/datums/martial/_martial.dm index 206792c3ec573..475936d11cb0d 100644 --- a/code/datums/martial/_martial.dm +++ b/code/datums/martial/_martial.dm @@ -89,7 +89,7 @@ else if(make_temporary) base = H.mind.default_martial_art if(help_verb) - H.verbs += help_verb + H.add_verb(help_verb) H.mind.martial_art = src return TRUE @@ -112,5 +112,5 @@ /datum/martial_art/proc/on_remove(mob/living/carbon/human/H) if(help_verb) - H.verbs -= help_verb + H.remove_verb(help_verb) return diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 0e0d201e02e95..13be970cfdfd4 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -54,7 +54,7 @@ /obj/item/clothing/gloves/boxing/equipped(mob/user, slot) if(!ishuman(user)) return - if(slot == SLOT_GLOVES) + if(slot == ITEM_SLOT_GLOVES) var/mob/living/carbon/human/H = user style.teach(H,1) return @@ -63,6 +63,6 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(SLOT_GLOVES) == src) + if(H.get_item_by_slot(ITEM_SLOT_GLOVES) == src) style.remove(H) return diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 94434cffc57ae..0d756b4fe316a 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -183,7 +183,7 @@ /obj/item/clothing/gloves/krav_maga/equipped(mob/user, slot) if(!ishuman(user)) return - if(slot == SLOT_GLOVES) + if(slot == ITEM_SLOT_GLOVES) var/mob/living/carbon/human/H = user style.teach(H,1) @@ -191,7 +191,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(SLOT_GLOVES) == src) + if(H.get_item_by_slot(ITEM_SLOT_GLOVES) == src) style.remove(H) /obj/item/clothing/gloves/krav_maga/sec//more obviously named, given to sec @@ -218,4 +218,4 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) \ No newline at end of file + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50, "stamina" = 0) diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm index 45276a50405c4..359fd4d49318b 100644 --- a/code/datums/martial/plasma_fist.dm +++ b/code/datums/martial/plasma_fist.dm @@ -36,10 +36,7 @@ A.say("TORNADO SWEEP!", forced="plasma fist") TornadoAnimate(A) var/obj/effect/proc_holder/spell/aoe_turf/repulse/R = new(null) - var/list/turfs = list() - for(var/turf/T in range(1,A)) - turfs.Add(T) - R.cast(turfs) + R.cast(RANGE_TURFS(1,A)) log_combat(A, D, "tornado sweeped(Plasma Fist)") return diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm index 7aa202271865a..df229c9ec9fd5 100644 --- a/code/datums/martial/psychotic_brawl.dm +++ b/code/datums/martial/psychotic_brawl.dm @@ -3,9 +3,13 @@ id = MARTIALART_PSYCHOBRAWL /datum/martial_art/psychotic_brawling/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(HAS_TRAIT(A, TRAIT_PACIFISM)) + return FALSE return psycho_attack(A,D) /datum/martial_art/psychotic_brawling/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(HAS_TRAIT(A, TRAIT_PACIFISM)) + return FALSE return psycho_attack(A,D) /datum/martial_art/psychotic_brawling/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 2e2d08dc18695..85e17a7cd9702 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -162,16 +162,12 @@ to_chat(usr, "Head Kick: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand.") to_chat(usr, "Elbow Drop: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition.") -/obj/item/twohanded/bostaff +/obj/item/staff/bostaff name = "bo staff" desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate." force = 10 w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK - force_unwielded = 10 - force_wielded = 24 - block_power_wielded = 50 - block_power_unwielded = 25 throwforce = 20 throw_speed = 2 attack_verb = list("smashed", "slammed", "whacked", "thwacked") @@ -183,10 +179,15 @@ block_upgrade_walk = 1 block_power = 25 -/obj/item/twohanded/bostaff/update_icon_state() - icon_state = "bostaff[wielded]" +/obj/item/staff/bostaff/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_unwielded=10, force_wielded=24, block_power_unwielded=25, block_power_wielded=50, icon_wielded="bostaff1") -/obj/item/twohanded/bostaff/attack(mob/target, mob/living/user) +/obj/item/staff/bostaff/update_icon_state() + icon_state = "bostaff0" + ..() + +/obj/item/staff/bostaff/attack(mob/target, mob/living/user) add_fingerprint(user) if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50)) to_chat(user, "You club yourself over the head with [src].") @@ -206,7 +207,7 @@ to_chat(user, "It would be dishonorable to attack a foe while they cannot retaliate.") return if(user.a_intent == INTENT_DISARM) - if(!wielded) + if(!ISWIELDED(src)) return ..() if(!ishuman(target)) return ..() @@ -235,7 +236,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) +/obj/item/staff/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(!ISWIELDED(src)) return ..() return 0 diff --git a/code/datums/martial/tribal_claw.dm b/code/datums/martial/tribal_claw.dm new file mode 100644 index 0000000000000..7e90d65d4bc85 --- /dev/null +++ b/code/datums/martial/tribal_claw.dm @@ -0,0 +1,110 @@ +#define TAIL_SWEEP_COMBO "DDGH" +#define FACE_SCRATCH_COMBO "HD" +#define JUGULAR_CUT_COMBO "HHG" +#define TAIL_GRAB_COMBO "DHGG" + +/datum/martial_art/tribal_claw + name = "Tribal Claw" + id = MARTIALART_TRIBALCLAW + allow_temp_override = FALSE + help_verb = /mob/living/carbon/human/proc/tribal_claw_help + +/datum/martial_art/tribal_claw/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(findtext(streak,TAIL_SWEEP_COMBO)) + streak = "" + tailSweep(A,D) + return TRUE + if(findtext(streak,FACE_SCRATCH_COMBO)) + streak = "" + faceScratch(A,D) + return TRUE + if(findtext(streak,JUGULAR_CUT_COMBO)) + streak = "" + jugularCut(A,D) + return TRUE + if(findtext(streak,TAIL_GRAB_COMBO)) + streak = "" + tailGrab(A,D) + return TRUE + return FALSE + +//Tail Sweep, triggers an effect similar to Space Dragon's tail sweep but only affects stuff 1 tile next to you, basically 3x3. +/datum/martial_art/tribal_claw/proc/tailSweep(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(A == current_target) + return + log_combat(A, D, "tail sweeped(Tribal Claw)") + D.visible_message("[A] sweeps [D]'s legs with their tail!", \ + "[A] sweeps your legs with their tail!") + var/obj/effect/proc_holder/spell/aoe_turf/repulse/spacedragon/R = new + R.cast(RANGE_TURFS(1,A)) + +//Face Scratch, deals 10 brute to head(reduced by armor), blurs the target's vision and gives them the confused effect for a short time. +/datum/martial_art/tribal_claw/proc/faceScratch(mob/living/carbon/human/A, mob/living/carbon/human/D) + var/def_check = D.getarmor(BODY_ZONE_HEAD, "melee") + log_combat(A, D, "face scratched (Tribal Claw)") + D.visible_message("[A] scratches [D]'s face with their claws!", \ + "[A] scratches your face with their claws!") + D.apply_damage(10, BRUTE, BODY_ZONE_HEAD, def_check) + D.confused += 5 + D.blur_eyes(5) + A.do_attack_animation(D, ATTACK_EFFECT_CLAW) + playsound(get_turf(D), 'sound/weapons/slash.ogg', 50, 1, -1) + +/* +Jugular Cut, can only be done if the target is in crit, being held in a tier 3 grab by the user or if they are sleeping. +Deals 15 brute to head(reduced by armor) and causes a rapid bleeding effect similar to throat slicing someone with a sharp item. +*/ +/datum/martial_art/tribal_claw/proc/jugularCut(mob/living/carbon/human/A, mob/living/carbon/human/D) + var/def_check = D.getarmor(BODY_ZONE_HEAD, "melee") + if((D.health <= D.crit_threshold || (A.pulling == D && A.grab_state >= GRAB_NECK) || D.IsSleeping())) + log_combat(A, D, "jugular cut (Tribal Claw)") + D.visible_message("[A] cuts [D]'s jugular vein with their claws!", \ + "[A] cuts your jugular vein!") + D.apply_damage(15, BRUTE, BODY_ZONE_HEAD, def_check) + D.bleed_rate = CLAMP(D.bleed_rate + 20, 0, 30) + D.apply_status_effect(/datum/status_effect/neck_slice) + A.do_attack_animation(D, ATTACK_EFFECT_CLAW) + playsound(get_turf(D), 'sound/weapons/slash.ogg', 50, 1, -1) + else + return basic_hit(A,D) + +//Tail Grab, instantly puts your target in a T3 grab and makes them unable to talk for a short time. +/datum/martial_art/tribal_claw/proc/tailGrab(mob/living/carbon/human/A, mob/living/carbon/human/D) + log_combat(A, D, "tail grabbed (Tribal Claw)") + D.visible_message("[A] grabs [D] with their tail!", \ + "[A] grabs you with their tail!") + D.grabbedby(A, 1) + D.Knockdown(5) //Without knockdown target still stands up while T3 grabbed. + A.setGrabState(GRAB_NECK) + if(D.silent <= 10) + D.silent = CLAMP(D.silent + 10, 0, 10) + +/datum/martial_art/tribal_claw/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + add_to_streak("H",D) + if(check_streak(A,D)) + return TRUE + return FALSE + +/datum/martial_art/tribal_claw/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + add_to_streak("D",D) + if(check_streak(A,D)) + return TRUE + return FALSE + +/datum/martial_art/tribal_claw/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + add_to_streak("G",D) + if(check_streak(A,D)) + return TRUE + return FALSE + +/mob/living/carbon/human/proc/tribal_claw_help() + set name = "Recall Teachings" + set desc = "Remember the martial techniques of the Tribal Claw" + set category = "Tribal Claw" + + to_chat(usr, "You retreat inward and recall the teachings of the Tribal Claw...") + + to_chat(usr, "Tail Sweep: Disarm Disarm Grab Harm. Pushes everyone around you away and knocks them down.") + to_chat(usr, "Face Scratch: Harm Disarm. Damages your target's head and confuses them for a short time.") + to_chat(usr, "Jugular Cut: Harm Harm Grab. Causes your target to rapidly lose blood, works only if you grab your target by their neck, if they are sleeping, or in critical condition.") + to_chat(usr, "Tail Grab: Disarm Harm Grab Grab. Grabs your target by their neck and makes them unable to talk for a short time.") diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index 53b35784806d1..12d73e4ceaded 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -364,9 +364,7 @@ var/falling = 0 for (var/obj/O in oview(1, A)) - if (O.density == 1) - if (O == A) - continue + if(O.density) if (O == D) continue if (O.opacity) @@ -458,7 +456,7 @@ /obj/item/storage/belt/champion/wrestling/equipped(mob/user, slot) if(!ishuman(user)) return - if(slot == SLOT_BELT) + if(slot == ITEM_SLOT_BELT) var/mob/living/carbon/human/H = user style.teach(H,1) return @@ -467,6 +465,6 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(SLOT_BELT) == src) + if(H.get_item_by_slot(ITEM_SLOT_BELT) == src) style.remove(H) return diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index ec3ec0d05c234..fd169200a8371 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -1,6 +1,6 @@ /*! Material datum -Simple datum which is instanced once per type and is used for every object of said material. It has a variety of variables that define behavior. Subtyping from this makes it easier to create your own materials. +Simple datum which is instanced once per type and is used for every object of said material. It has a variety of variables that define behavior. Subtyping from this makes it easier to create your own materials. */ @@ -52,7 +52,7 @@ Simple datum which is instanced once per type and is used for every object of sa if(color) source.remove_atom_colour(FIXED_COLOUR_PRIORITY, color) source.alpha = initial(source.alpha) - + if(istype(source, /obj)) //objs on_removed_obj(source, material_flags) diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index c0c5fba56a647..19a6d9945fc16 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -83,12 +83,12 @@ /datum/material/plasma/on_applied(atom/source, amount, material_flags) . = ..() if(ismovableatom(source)) - source.AddElement(/datum/element/firestacker, 1) + source.AddElement(/datum/element/firestacker, amount=1) source.AddComponent(/datum/component/explodable, 0, 0, amount / 1000, amount / 500) /datum/material/plasma/on_removed(atom/source, material_flags) . = ..() - source.RemoveElement(/datum/element/firestacker, 1) + source.RemoveElement(/datum/element/firestacker, amount=1) qdel(source.GetComponent(/datum/component/explodable)) ///Can cause bluespace effects on use. (Teleportation) (Not yet implemented) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 9b062b13e174a..0d427225e474d 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -55,7 +55,7 @@ var/damnation_type = 0 var/datum/mind/soulOwner //who owns the soul. Under normal circumstances, this will point to src var/hasSoul = TRUE // If false, renders the character unable to sell their soul. - var/isholy = FALSE //is this person a chaplain or admin role allowed to use bibles + var/holy_role = NONE //is this person a chaplain or admin role allowed to use bibles, Any rank besides 'NONE' allows for this. var/isAntagTarget = FALSE var/no_cloning_at_all = FALSE @@ -71,6 +71,9 @@ var/list/learned_recipes //List of learned recipe TYPES. var/list/crew_objectives = list() + /// A lazy list of statuses to add next to this mind in the traitor panel + var/list/special_statuses + /datum/mind/New(var/key) src.key = key soulOwner = src @@ -84,8 +87,23 @@ if(antag_datum.delete_on_mind_deletion) qdel(i) antag_datums = null + QDEL_NULL(language_holder) + set_current(null) return ..() +/datum/mind/proc/set_current(mob/new_current) + if(new_current && QDELING(new_current)) + CRASH("Tried to set a mind's current var to a qdeleted mob, what the fuck") + if(current) + UnregisterSignal(src, COMSIG_PARENT_QDELETING) + current = new_current + if(current) + RegisterSignal(src, COMSIG_PARENT_QDELETING, .proc/clear_current) + +/datum/mind/proc/clear_current(datum/source) + SIGNAL_HANDLER + set_current(null) + /datum/mind/proc/get_language_holder() if(!language_holder) language_holder = new (src) @@ -99,18 +117,18 @@ if(key) if(new_character.key != key) //if we're transferring into a body with a key associated which is not ours - new_character.ghostize(1) //we'll need to ghostize so that key isn't mobless. + new_character.ghostize(TRUE,SENTIENCE_ERASE) //we'll need to ghostize so that key isn't mobless. else key = new_character.key if(new_character.mind) //disassociate any mind currently in our new body's mind variable - new_character.mind.current = null + new_character.mind.set_current(null) var/datum/atom_hud/antag/hud_to_transfer = antag_hud//we need this because leave_hud() will clear this list var/mob/living/old_current = current if(current) current.transfer_observers_to(new_character) //transfer anyone observing the old character to the new one - current = new_character //associate ourself with our new body + set_current(new_character) //associate ourself with our new body new_character.mind = src //and associate our new body with ourself for(var/a in antag_datums) //Makes sure all antag datums effects are applied in the new body var/datum/antagonist/A = a @@ -128,11 +146,13 @@ SEND_SIGNAL(src, COMSIG_MIND_TRANSFER_TO, old_current, new_character) /datum/mind/proc/set_death_time() + SIGNAL_HANDLER + last_death = world.time /datum/mind/proc/store_memory(new_text) var/newlength = length(memory) + length(new_text) - if (newlength > MAX_MESSAGE_LEN * 100) + if(newlength > MAX_MESSAGE_LEN * 100) memory = copytext(memory, -newlength-MAX_MESSAGE_LEN * 100) memory += "[new_text]
" @@ -165,6 +185,7 @@ if(antag_team) antag_team.add_member(src) A.on_gain() + log_game("[key_name(src)] has gained antag datum [A.name]([A.type])") return A /datum/mind/proc/remove_antag_datum(datum_type) @@ -328,7 +349,7 @@ SSticker.mode.add_cultist(src) else if(is_servant_of_ratvar(creator)) - add_servant_of_ratvar(src) + add_servant_of_ratvar(current) else if(is_revolutionary(creator)) var/datum/antagonist/rev/converter = creator.mind.has_antag_datum(/datum/antagonist/rev,TRUE) @@ -347,9 +368,10 @@ current.faction |= creator.faction creator.faction |= current.faction - if(creator.mind.special_role) + var/mob/living/carbon/C = creator + if(creator.mind?.special_role || (istype(C) && C.last_mind?.special_role)) message_admins("[ADMIN_LOOKUPFLW(current)] has been created by [ADMIN_LOOKUPFLW(creator)], an antagonist.") - to_chat(current, "Despite your creators current allegiances, your true master remains [creator.real_name]. If their loyalties change, so do yours. This will never change unless your creator's body is destroyed.") + to_chat(current, "Despite your creator's current allegiances, your true master remains [creator.real_name]. If their loyalties change, so do yours. This will never change unless your creator's body is destroyed.") /datum/mind/proc/show_memory(mob/recipient, window=1) if(!recipient) @@ -683,6 +705,11 @@ if(G) G.reenter_corpse() +/// Sets our can_hijack to the fastest speed our antag datums allow. +/datum/mind/proc/get_hijack_speed() + . = 0 + for(var/datum/antagonist/A in antag_datums) + . = max(., A.hijack_speed()) /datum/mind/proc/has_objective(objective_type) for(var/datum/antagonist/A in antag_datums) @@ -715,7 +742,7 @@ SSticker.minds += mind if(!mind.name) mind.name = real_name - mind.current = src + mind.set_current(src) /mob/living/carbon/mind_initialize() ..() diff --git a/code/datums/mocking/client.dm b/code/datums/mocking/client.dm new file mode 100644 index 0000000000000..913c47e2a31bb --- /dev/null +++ b/code/datums/mocking/client.dm @@ -0,0 +1,4 @@ +/// This should match the interface of /client wherever necessary. +/datum/client_interface + /// Player preferences datum for the client + var/datum/preferences/prefs diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index c0481c15d9b09..75157efe6989d 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -217,3 +217,17 @@ /datum/mood_event/nanite_sadness/add_effects(message) description = "+++++++[message]+++++++\n" + +/datum/mood_event/sec_insulated_gloves + description = "I look like an Assistant...\n" + mood_change = -1 + +/datum/mood_event/burnt_wings + description = "MY PRECIOUS WINGS!!\n" + mood_change = -10 + timeout = 10 MINUTES + +/datum/mood_event/aquarium_negative + description = "All the fish are dead...\n" + mood_change = -3 + timeout = 1.5 MINUTES \ No newline at end of file diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 16806a459e10f..6abfbdf679ea4 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -19,6 +19,11 @@ /datum/mood_event/besthug/add_effects(mob/friend) description = "[friend.name] is great to be around, [friend.p_they()] makes me feel so happy!\n" +/datum/mood_event/headpat + description = "Headpats are lovely!\n" + mood_change = 1 + timeout = 2 MINUTES + /datum/mood_event/arcade description = "I beat the arcade game!\n" mood_change = 3 @@ -91,7 +96,7 @@ /datum/mood_event/cult description = "I have seen the truth, praise the almighty one!\n" - mood_change = 10 //maybe being a cultist isnt that bad after all + mood_change = 10 //maybe being a cultist isn't that bad after all hidden = TRUE /datum/mood_event/determined @@ -101,7 +106,7 @@ /datum/mood_event/heretics description = "THE HIGHER I RISE , THE MORE I SEE.\n" - mood_change = 10 //maybe being a cultist isnt that bad after all + mood_change = 10 //maybe being a cultist isn't that bad after all hidden = TRUE /datum/mood_event/family_heirloom @@ -128,7 +133,7 @@ timeout = 3 MINUTES /datum/mood_event/religiously_comforted - description = "You are comforted by the presence of a holy person.\n" + description = "I feel comforted by the presence of a holy person.\n" mood_change = 3 /datum/mood_event/clownshoes @@ -171,6 +176,15 @@ /datum/mood_event/nanite_happiness/add_effects(message) description = "+++++++[message]+++++++\n" +/datum/mood_event/poppy_pin + description = "I feel proud to show my remembrance of the many who have died to ensure that I have freedom.\n" + mood_change = 1 + +/datum/mood_event/funny_prank + description = "That was a funny prank, clown!\n" + mood_change = 2 + timeout = 2 MINUTES + /datum/mood_event/area description = "" //Fill this out in the area mood_change = 0 @@ -178,3 +192,16 @@ /datum/mood_event/area/add_effects(list/param) mood_change = param[1] description = param[2] + +/datum/mood_event/sec_black_gloves + description = "Black gloves look good on me.\n" + mood_change = 1 + +/datum/mood_event/assistant_insulated_gloves + description = "Finally got my hands on a good pair of gloves!\n" + mood_change = 1 + +/datum/mood_event/aquarium_positive + description = "Watching fish in aquarium is calming.\n" + mood_change = 3 + timeout = 1.5 MINUTES diff --git a/code/datums/mood_events/needs_events.dm b/code/datums/mood_events/needs_events.dm index 68566c8336be7..dbba37b24a06c 100644 --- a/code/datums/mood_events/needs_events.dm +++ b/code/datums/mood_events/needs_events.dm @@ -1,6 +1,6 @@ //nutrition /datum/mood_event/fat - description = "I'm so fat...\n" //muh fatshaming + description = "I'm so fat.\n" //muh fatshaming mood_change = -6 /datum/mood_event/wellfed @@ -38,15 +38,15 @@ mood_change = -4 /datum/mood_event/verygross - description = "I think I'm going to puke...\n" + description = "I think I'm going to puke.\n" mood_change = -6 /datum/mood_event/disgusted - description = "Oh god that's disgusting...\n" + description = "Oh god, that's disgusting.\n" mood_change = -8 /datum/mood_event/disgust/bad_smell - description = "You smell something horribly decayed inside this room.\n" + description = "I can smell something horribly decayed inside this room.\n" mood_change = -6 /datum/mood_event/disgust/nauseating_stench @@ -60,6 +60,10 @@ /datum/mood_event/dirty description = "I smell horrid.\n" + mood_change = -3 + +/datum/mood_event/disgusting + description = "I smell DISGUSTING!\n" mood_change = -5 /datum/mood_event/happy_neet diff --git a/code/datums/movement_detector.dm b/code/datums/movement_detector.dm new file mode 100644 index 0000000000000..2bb1ce0de7bf5 --- /dev/null +++ b/code/datums/movement_detector.dm @@ -0,0 +1,55 @@ +/// A datum to handle the busywork of registering signals to handle in depth tracking of a movable +/datum/movement_detector + var/atom/movable/tracked + var/datum/callback/listener + +/datum/movement_detector/New(atom/movable/target, datum/callback/listener) + if(target) + track(target, listener) + +/datum/movement_detector/Destroy() + untrack() + tracked = null + listener = null + return ..() + +/// Sets up tracking of the given movable atom +/datum/movement_detector/proc/track(atom/movable/target, datum/callback/listener) + untrack() + tracked = target + src.listener = listener + + while(ismovableatom(target)) + RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/move_react) + target = target.loc + +/// Stops tracking +/datum/movement_detector/proc/untrack() + if(!tracked) + return + var/atom/movable/target = tracked + while(ismovableatom(target)) + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + target = target.loc + +/** + * Reacts to any movement that would cause a change in coordinates of the tracked movable atom + * This works by detecting movement of either the tracked object, or anything it is inside, recursively + */ +/datum/movement_detector/proc/move_react(atom/movable/mover, atom/oldloc, direction) + SIGNAL_HANDLER + + var/turf/newturf = get_turf(tracked) + + if(oldloc && !isturf(oldloc)) + var/atom/target = oldloc + while(ismovableatom(target)) + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + target = target.loc + if(tracked.loc != newturf) + var/atom/target = mover.loc + while(ismovableatom(target)) + RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/move_react, TRUE) + target = target.loc + + listener.Invoke(tracked, mover, oldloc, direction) diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 791401f8fe516..aa826f1ad682f 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -23,7 +23,7 @@ var/instability = 0 //instability the holder gets when the mutation is not native var/blocks = 4 //Amount of those big blocks with gene sequences var/difficulty = 8 //Amount of missing sequences. Sometimes it removes an entire pair for 2 points - var/timed = FALSE //Boolean to easily check if we're going to self destruct + var/timed = FALSE //Boolean to easily check if we're going to self-destruct var/alias //'Mutation #49', decided every round to get some form of distinction between undiscovered mutations var/scrambled = FALSE //Wheter we can read it if it's active. To avoid cheesing with mutagen var/class //Decides player accesibility, sorta @@ -32,6 +32,7 @@ //MUT_NORMAL - A mutation that can be activated and deactived by completing a sequence //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/valid_chrom_list = list() //List of strings of valid chromosomes this mutation can accept. var/can_chromosome = CHROMOSOME_NONE //can we take chromosomes? 0: CHROMOSOME_NEVER never, 1:CHROMOSOME_NONE yeah, 2: CHROMOSOME_USED no, already have one @@ -157,6 +158,7 @@ energy_coeff = HM.energy_coeff mutadone_proof = HM.mutadone_proof can_chromosome = HM.can_chromosome + valid_chrom_list = HM.valid_chrom_list /datum/mutation/human/proc/remove_chromosome() stabilizer_coeff = initial(stabilizer_coeff) @@ -182,3 +184,23 @@ power.panel = "Genetic" owner.AddSpell(power) return TRUE + +// Runs through all the coefficients and uses this to determine which chromosomes the +// mutation can take. Stores these as text strings in a list. +/datum/mutation/human/proc/update_valid_chromosome_list() + valid_chrom_list.Cut() + + if(can_chromosome == CHROMOSOME_NEVER) + valid_chrom_list += "none" + return + + valid_chrom_list += "Reinforcement" + + if(stabilizer_coeff != -1) + valid_chrom_list += "Stabilizer" + if(synchronizer_coeff != -1) + valid_chrom_list += "Synchronizer" + if(power_coeff != -1) + valid_chrom_list += "Power" + if(energy_coeff != -1) + valid_chrom_list += "Energetic" diff --git a/code/datums/mutations/_combined.dm b/code/datums/mutations/_combined.dm index 1e6aa90dbe518..a0776532b4aa6 100644 --- a/code/datums/mutations/_combined.dm +++ b/code/datums/mutations/_combined.dm @@ -17,10 +17,6 @@ required = "/datum/mutation/human/strong; /datum/mutation/human/radioactive" result = HULK -/datum/generecipe/x_ray - required = "/datum/mutation/human/thermal; /datum/mutation/human/radioactive" - result = /datum/mutation/human/thermal/x_ray - /datum/generecipe/mindread required = "/datum/mutation/human/antenna; /datum/mutation/human/paranoia" result = MINDREAD diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm index 9bd282100b63e..9486416ca6cfd 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -25,9 +25,9 @@ /datum/mutation/human/olfaction/on_life() var/hygiene_now = owner.hygiene - if(hygiene_now < 100 && prob(5)) + if(hygiene_now < 100 && prob(3)) owner.adjust_disgust(GET_MUTATION_SYNCHRONIZER(src) * (rand(3,5))) - if(hygiene_now < HYGIENE_LEVEL_DIRTY && prob(50)) + if(hygiene_now < HYGIENE_LEVEL_DIRTY && prob(15)) to_chat(owner,"You get a whiff of your stench and feel sick!") owner.adjust_disgust(GET_MUTATION_SYNCHRONIZER(src) * rand(5,10)) @@ -89,10 +89,10 @@ if(tracking_target == user) to_chat(user,"You smell out the trail to yourself. Yep, it's you.") return - if(usr.z < tracking_target.z) + if(usr.get_virtual_z_level() < tracking_target.get_virtual_z_level()) to_chat(user,"The trail leads... way up above you? Huh. They must be really, really far away.") return - else if(usr.z > tracking_target.z) + else if(usr.get_virtual_z_level() > tracking_target.get_virtual_z_level()) to_chat(user,"The trail leads... way down below you? Huh. They must be really, really far away.") return var/direction_text = "[dir2text(get_dir(usr, tracking_target))]" diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm index f49c847f42ddc..c47ef8bb6b22d 100644 --- a/code/datums/mutations/antenna.dm +++ b/code/datums/mutations/antenna.dm @@ -6,7 +6,7 @@ text_lose_indication = "Your antenna shrinks back down." instability = 5 difficulty = 8 - var/obj/item/implant/radio/antenna/linked_radio + var/datum/weakref/radio_weakref /obj/item/implant/radio/antenna name = "internal antenna organ" @@ -21,14 +21,16 @@ /datum/mutation/human/antenna/on_acquiring(mob/living/carbon/human/owner) if(..()) return - linked_radio = new(owner) + var/obj/item/implant/radio/antenna/linked_radio = new(owner) linked_radio.implant(owner, null, TRUE, TRUE) + radio_weakref = WEAKREF(linked_radio) /datum/mutation/human/antenna/on_losing(mob/living/carbon/human/owner) if(..()) return + var/obj/item/implant/radio/antenna/linked_radio = radio_weakref.resolve() if(linked_radio) - linked_radio.Destroy() + QDEL_NULL(linked_radio) /datum/mutation/human/antenna/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() @@ -59,7 +61,7 @@ /obj/effect/proc_holder/spell/targeted/mindread/cast(list/targets, mob/living/carbon/human/user = usr) for(var/mob/living/M in targets) - if(istype(usr.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat) || istype(M.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(istype(usr.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat) || istype(M.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) to_chat(usr, "As you reach out with your mind, you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.") return if(M.stat == DEAD) diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index d8907013b13e9..4db8b55c6cfc1 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -71,7 +71,7 @@ desc = "Subject is easily terrified, and may suffer from hallucinations." quality = NEGATIVE text_gain_indication = "You feel screams echo through your mind..." - text_lose_indication = "The screaming in your mind fades." + text_lose_indication = "The screaming in your mind fades." /datum/mutation/human/paranoia/on_life() if(prob(5) && owner.stat == CONSCIOUS) @@ -175,11 +175,11 @@ /datum/mutation/human/race/on_acquiring(mob/living/carbon/human/owner) if(..()) return - . = owner.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) + . = owner.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE | TR_KEEPAI) /datum/mutation/human/race/on_losing(mob/living/carbon/monkey/owner) if(owner && istype(owner) && owner.stat != DEAD && (owner.dna.mutations.Remove(src))) - . = owner.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) + . = owner.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE | TR_KEEPAI) /datum/mutation/human/glow name = "Glowy" @@ -251,7 +251,7 @@ desc = "The user's skin will randomly combust, but is generally alot more resilient to burning." quality = NEGATIVE text_gain_indication = "You feel hot." - text_lose_indication = "You feel a lot cooler." + text_lose_indication = "You feel a lot cooler." difficulty = 14 synchronizer_coeff = 1 power_coeff = 1 @@ -276,7 +276,7 @@ desc = "The victim of the mutation has a very weak link to spatial reality, and may be displaced. Often causes extreme nausea." quality = NEGATIVE text_gain_indication = "The space around you twists sickeningly." - text_lose_indication = "The space around you settles back to normal." + text_lose_indication = "The space around you settles back to normal." difficulty = 18//high so it's hard to unlock and abuse instability = 10 synchronizer_coeff = 1 @@ -306,7 +306,7 @@ desc = "Subject has acidic chemicals building up underneath their skin. This is often lethal." quality = NEGATIVE text_gain_indication = "A horrible burning sensation envelops you as your flesh turns to acid!" - text_lose_indication = "A feeling of relief covers you as your flesh goes back to normal." + text_lose_indication = "A feeling of relief covers you as your flesh goes back to normal." difficulty = 18//high so it's hard to unlock and use on others var/msgcooldown = 0 @@ -346,7 +346,7 @@ desc = "Subject suffers from muscle spasms." quality = NEGATIVE text_gain_indication = "You flinch." - text_lose_indication = "Your flinching subsides." + text_lose_indication = "Your flinching subsides." difficulty = 16 /datum/mutation/human/spastic/on_acquiring() @@ -364,7 +364,7 @@ desc = "A mutation that replaces the right foot with another left foot. It makes standing up after getting knocked down very difficult." quality = NEGATIVE text_gain_indication = "Your right foot feels... left." - text_lose_indication = "Your right foot feels alright." + text_lose_indication = "Your right foot feels alright." difficulty = 16 var/stun_cooldown = 0 diff --git a/code/datums/mutations/cluwne.dm b/code/datums/mutations/cluwne.dm index ce625818fddd5..75b105918f325 100644 --- a/code/datums/mutations/cluwne.dm +++ b/code/datums/mutations/cluwne.dm @@ -19,18 +19,18 @@ if(!istype(H.wear_mask, /obj/item/clothing/mask/cluwne)) if(!H.doUnEquip(H.wear_mask)) qdel(H.wear_mask) - H.equip_to_slot_or_del(new /obj/item/clothing/mask/cluwne(H), SLOT_WEAR_MASK) + H.equip_to_slot_or_del(new /obj/item/clothing/mask/cluwne(H), ITEM_SLOT_MASK) if(!istype(H.w_uniform, /obj/item/clothing/under/cluwne)) if(!H.doUnEquip(H.w_uniform)) qdel(H.w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/under/cluwne(H), SLOT_W_UNIFORM) + H.equip_to_slot_or_del(new /obj/item/clothing/under/cluwne(H), ITEM_SLOT_ICLOTHING) if(!istype(H.shoes, /obj/item/clothing/shoes/cluwne)) if(!H.doUnEquip(H.shoes)) qdel(H.shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/cluwne(H), SLOT_SHOES) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/cluwne(H), ITEM_SLOT_FEET) - owner.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(owner), SLOT_GLOVES) // this is purely for cosmetic purposes incase they aren't wearing anything in that slot - owner.equip_to_slot_or_del(new /obj/item/storage/backpack/clown(owner), SLOT_BACK) // ditto + owner.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(owner), ITEM_SLOT_GLOVES) // this is purely for cosmetic purposes incase they aren't wearing anything in that slot + owner.equip_to_slot_or_del(new /obj/item/storage/backpack/clown(owner), ITEM_SLOT_BACK) // ditto /datum/mutation/human/cluwne/on_life(mob/living/carbon/human/owner) if((prob(15) && owner.IsUnconscious())) diff --git a/code/datums/mutations/cold.dm b/code/datums/mutations/cold.dm index cd10c2b38f759..146f7b21661a6 100644 --- a/code/datums/mutations/cold.dm +++ b/code/datums/mutations/cold.dm @@ -16,6 +16,24 @@ delete_old = FALSE action_icon_state = "snow" +/datum/mutation/human/wax_saliva + name = "Waxy Saliva" + desc = "Allows the user to secrete wax." + quality = POSITIVE + text_gain_indication = "Your mouth feels waxy." + instability = 10 + difficulty = 10 + synchronizer_coeff = 1 + locked = TRUE + power = /obj/effect/proc_holder/spell/targeted/conjure_item/wax + +/obj/effect/proc_holder/spell/targeted/conjure_item/wax + name = "Secrete Wax" + desc = "Concentrate to spit out some wax, useful for bee-themed construction." + item_type = /obj/item/stack/sheet/mineral/wax + charge_max = 50 + delete_old = FALSE + action_icon_state = "honey" /datum/mutation/human/cryokinesis name = "Cryokinesis" diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index d5ad0f9849a8a..2857ddd65c7a0 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -46,6 +46,8 @@ SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "hulk") /datum/mutation/human/hulk/proc/handle_speech(original_message, wrapped_message) + SIGNAL_HANDLER + var/message = wrapped_message[1] if(message) message = "[replacetext(message, ".", "!")]!!" diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm index 9a30cd623cd5a..bb4a910b52061 100644 --- a/code/datums/mutations/speech.dm +++ b/code/datums/mutations/speech.dm @@ -30,6 +30,8 @@ UnregisterSignal(owner, COMSIG_MOB_SAY) /datum/mutation/human/wacky/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + speech_args[SPEECH_SPANS] |= SPAN_SANS /datum/mutation/human/mute @@ -73,7 +75,6 @@ message = " [message] " //Time for a friendly game of SS13 message = replacetext(message," stupid "," smart ") - message = replacetext(message," retard "," genius ") message = replacetext(message," unrobust "," robust ") message = replacetext(message," dumb "," smart ") message = replacetext(message," awful "," great ") @@ -153,6 +154,8 @@ UnregisterSignal(owner, COMSIG_MOB_SAY) /datum/mutation/human/swedish/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + var/message = speech_args[SPEECH_MESSAGE] if(message) message = replacetext(message,"w","v") @@ -182,31 +185,36 @@ UnregisterSignal(owner, COMSIG_MOB_SAY) /datum/mutation/human/chav/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + var/message = speech_args[SPEECH_MESSAGE] - if(message) - message = " [message] " - message = replacetext(message," looking at "," gawpin' at ") - message = replacetext(message," great "," bangin' ") - message = replacetext(message," man "," mate ") - message = replacetext(message," friend ",pick(" mate "," bruv "," bledrin ")) - message = replacetext(message," what "," wot ") - message = replacetext(message," drink "," wet ") - message = replacetext(message," get "," giz ") - message = replacetext(message," what "," wot ") - message = replacetext(message," no thanks "," wuddent fukken do one ") - message = replacetext(message," i don't know "," wot mate ") - message = replacetext(message," no "," naw ") - message = replacetext(message," robust "," chin ") - message = replacetext(message," hi "," how what how ") - message = replacetext(message," hello "," sup bruv ") - message = replacetext(message," kill "," bang ") - message = replacetext(message," murder "," bang ") - message = replacetext(message," windows "," windies ") - message = replacetext(message," window "," windy ") - message = replacetext(message," break "," do ") - message = replacetext(message," your "," yer ") - message = replacetext(message," security "," coppers ") - speech_args[SPEECH_MESSAGE] = trim(message) + if(message[1] != "*") + message = " [message]" + var/list/whole_words = strings("british_talk.json", "words") + var/list/british_sounds = strings("british_talk.json", "sounds") + var/list/british_appends = strings("british_talk.json", "appends") + + for(var/key in whole_words) + var/value = whole_words[key] + if(islist(value)) + value = pick(value) + + message = replacetextEx(message, " [uppertext(key)]", " [uppertext(value)]") + message = replacetextEx(message, " [capitalize(key)]", " [capitalize(value)]") + message = replacetextEx(message, " [key]", " [value]") + + for(var/key in british_sounds) + var/value = british_sounds[key] + if(islist(value)) + value = pick(value) + + message = replacetextEx(message, "[uppertext(key)]", "[uppertext(value)]") + message = replacetextEx(message, "[capitalize(key)]", "[capitalize(value)]") + message = replacetextEx(message, "[key]", "[value]") + + if(prob(8)) + message += pick(british_appends) + speech_args[SPEECH_MESSAGE] = trim(message) /datum/mutation/human/elvis @@ -239,10 +247,12 @@ UnregisterSignal(owner, COMSIG_MOB_SAY) /datum/mutation/human/elvis/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + var/message = speech_args[SPEECH_MESSAGE] if(message) message = " [message] " - message = replacetext(message," i'm not "," I aint ") + message = replacetext(message," i'm not "," I ain't ") message = replacetext(message," girl ",pick(" honey "," baby "," baby doll ")) message = replacetext(message," man ",pick(" son "," buddy "," brother"," pal "," friendo ")) message = replacetext(message," out of "," outta ") diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 0ccf850e37faa..3d94ada343546 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -153,31 +153,31 @@ //Start with uniform,suit,backpack for additional slots if(uniform) - H.equip_to_slot_or_del(new uniform(H),SLOT_W_UNIFORM) + H.equip_to_slot_or_del(new uniform(H),ITEM_SLOT_ICLOTHING, TRUE) if(suit) - H.equip_to_slot_or_del(new suit(H),SLOT_WEAR_SUIT) + H.equip_to_slot_or_del(new suit(H),ITEM_SLOT_OCLOTHING, TRUE) if(back) - H.equip_to_slot_or_del(new back(H),SLOT_BACK) + H.equip_to_slot_or_del(new back(H),ITEM_SLOT_BACK, TRUE) if(belt) - H.equip_to_slot_or_del(new belt(H),SLOT_BELT) + H.equip_to_slot_or_del(new belt(H),ITEM_SLOT_BELT, TRUE) if(gloves) - H.equip_to_slot_or_del(new gloves(H),SLOT_GLOVES) + H.equip_to_slot_or_del(new gloves(H),ITEM_SLOT_GLOVES, TRUE) if(shoes) - H.equip_to_slot_or_del(new shoes(H),SLOT_SHOES) + H.equip_to_slot_or_del(new shoes(H),ITEM_SLOT_FEET, TRUE) if(head) - H.equip_to_slot_or_del(new head(H),SLOT_HEAD) + H.equip_to_slot_or_del(new head(H),ITEM_SLOT_HEAD, TRUE) if(mask) - H.equip_to_slot_or_del(new mask(H),SLOT_WEAR_MASK) + H.equip_to_slot_or_del(new mask(H),ITEM_SLOT_MASK, TRUE) if(neck) - H.equip_to_slot_or_del(new neck(H),SLOT_NECK) + H.equip_to_slot_or_del(new neck(H),ITEM_SLOT_NECK, TRUE) if(ears) - H.equip_to_slot_or_del(new ears(H),SLOT_EARS) + H.equip_to_slot_or_del(new ears(H),ITEM_SLOT_EARS, TRUE) if(glasses) - H.equip_to_slot_or_del(new glasses(H),SLOT_GLASSES) + H.equip_to_slot_or_del(new glasses(H),ITEM_SLOT_EYES, TRUE) if(id) - H.equip_to_slot_or_del(new id(H),SLOT_WEAR_ID) + H.equip_to_slot_or_del(new id(H),ITEM_SLOT_ID, TRUE) if(suit_store) - H.equip_to_slot_or_del(new suit_store(H),SLOT_S_STORE) + H.equip_to_slot_or_del(new suit_store(H),ITEM_SLOT_SUITSTORE, TRUE) if(accessory) var/obj/item/clothing/under/U = H.w_uniform @@ -193,9 +193,9 @@ if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon. if(l_pocket) - H.equip_to_slot_or_del(new l_pocket(H),SLOT_L_STORE) + H.equip_to_slot_or_del(new l_pocket(H),ITEM_SLOT_LPOCKET, TRUE) if(r_pocket) - H.equip_to_slot_or_del(new r_pocket(H),SLOT_R_STORE) + H.equip_to_slot_or_del(new r_pocket(H),ITEM_SLOT_RPOCKET, TRUE) if(box) if(!backpack_contents) @@ -209,7 +209,7 @@ if(!isnum_safe(number))//Default to 1 number = 1 for(var/i in 1 to number) - H.equip_to_slot_or_del(new path(H),SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(new path(H),ITEM_SLOT_BACKPACK, TRUE) if(!H.head && toggle_helmet && istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit)) var/obj/item/clothing/suit/space/hardsuit/HS = H.wear_suit diff --git a/code/datums/radiation_wave.dm b/code/datums/radiation_wave.dm index e793cd1a0b9c7..a1f90ffa9f8f2 100644 --- a/code/datums/radiation_wave.dm +++ b/code/datums/radiation_wave.dm @@ -1,25 +1,53 @@ +#define PRC_FLAG_HL (1<<0) // Send half of current strength to the upper "left" +#define PRC_FLAG_L (1<<1) // Send the whole current strength to the upper "left": direct succession +#define PRC_FLAG_HR (1<<2) // Send half of current strength to the upper "right" +#define PRC_FLAG_R (1<<3) // Send the whole current strength to the upper "right": direct succession + +/** + * Crash Course: Understanding PRC_BEHAVIOR + * We move forward, and in square-by-square manner, so we need a list 8 entries larger than the current one, and future squares are determined from the current square. + * We move clockwise: "left" means intensity_new[i + j], "right" means intensity_new[i + j + 1]. `j` here is offset. + * Most squares are on branch: It moves "left"(L) or "right"(R). + * But, sometimes, a branch can't decide which way to go; then it splits(D) and merges(HL, HR). + * Then there are squares not on branch; those don't go anywhere else(N). + * But branchless squares still need to act radiation; does branchless square's does one time transient succession from both of immediate predecessors + * ... in contrast to "on-branch" squares where there are only one meaningful predecessor. + * Since we are calculating future squares, we need to see if there are any branchless squares needing our attention: (*STAR) + * And, of course, branchless squares might have to draw from another preceding branchless squares. (NWL, NWR) + */ + +#define PRC_BEHAVIOR_N (1<<4) // Not on branch, and both upper squares are on branch + // So we don't calculate prc_behavior every time (setting to 0 would do that) +#define PRC_BEHAVIOR_NWL PRC_FLAG_HL // Not on branch, but will send half of its strength to the "left" since it also is not on branch +#define PRC_BEHAVIOR_NWR PRC_FLAG_HR // Not on branch, but will send half of its strength to the "left" since it also is not on branch +#define PRC_BEHAVIOR_L PRC_FLAG_L // On branch, going "left" +#define PRC_BEHAVIOR_LSTAR (PRC_FLAG_L|PRC_FLAG_HR) // On branch, going "left", but there's branchless square on the "right" +#define PRC_BEHAVIOR_R PRC_FLAG_R // On branch, going "right" +#define PRC_BEHAVIOR_RSTAR (PRC_FLAG_R|PRC_FLAG_HL) // On branch, going "left", but there's branchless square on the "left" +#define PRC_BEHAVIOR_D (PRC_FLAG_L|PRC_FLAG_R) // On branch, double successor. +#define PRC_BEHAVIOR_HL PRC_FLAG_HL // From one of the double successor; single successor on the "left" +#define PRC_BEHAVIOR_HLSTAR (PRC_FLAG_HL|PRC_FLAG_HR) // From one of the double successor; single successor on the "left", but there's branchless square on the "right" +#define PRC_BEHAVIOR_HR PRC_FLAG_HR // From one of the double successor; single successor on the "right" +#define PRC_BEHAVIOR_HRSTAR (PRC_FLAG_HR|PRC_FLAG_HL) // From one of the double successor; single successor on the "right", but there's branchless square on the "left" + /datum/radiation_wave var/source var/turf/master_turf //The center of the wave - var/steps=0 //How far we've moved - var/intensity //How strong it was originaly + var/steps = 0 //How far we've moved + var/intensity[8] //How strong it is, except the distance falloff var/range_modifier //Higher than 1 makes it drop off faster, 0.5 makes it drop off half etc - var/move_dir //The direction of movement - var/list/__dirs //The directions to the side of the wave, stored for easy looping var/can_contaminate + var/static/list/prc_behavior_cache -/datum/radiation_wave/New(atom/_source, dir, _intensity=0, _range_modifier=RAD_DISTANCE_COEFFICIENT, _can_contaminate=TRUE) +/datum/radiation_wave/New(atom/_source, _intensity=0, _range_modifier=RAD_DISTANCE_COEFFICIENT, _can_contaminate=TRUE) source = "[_source] \[[REF(_source)]\]" master_turf = get_turf(_source) - move_dir = dir - __dirs = list() - __dirs+=turn(dir, 90) - __dirs+=turn(dir, -90) - - intensity = _intensity + // Yes, it causes (8 / range_modifier ** 2) times the strength you gave to the radiation_pulse(). + for(var/i in 1 to 8) + intensity[i] = _intensity range_modifier = _range_modifier can_contaminate = _can_contaminate @@ -27,69 +55,178 @@ /datum/radiation_wave/Destroy() . = QDEL_HINT_IWILLGC + intensity = null STOP_PROCESSING(SSradiation, src) ..() -/datum/radiation_wave/process() - master_turf = get_step(master_turf, move_dir) +/datum/radiation_wave/process(delta_time) + // If master_turf is no more, then we can't know where to irradiate. This is a very bad situation. if(!master_turf) qdel(src) return - steps++ - var/list/atoms = get_rad_atoms() + // If none of the turfs could be irradiated, then the wave should no longer exist + var/futile = TRUE + // Cache of unlucky atoms + var/list/atoms = list() + // The actual distance + var/distance = steps + 1 + // Represents decreasing radiation power over distance + var/falloff = 1 / (distance * range_modifier) ** 2 + // Caching + var/turf/cmaster_turf = master_turf + // Original intensity it is using + var/list/cintensity = intensity + // New intensity that'll be written; always larger than the previous one + var/list/intensity_new[(distance + 1) * 8] + // "Class" it belongs to + var/branchclass = 2 ** round(log(2, distance)) + // The secondary i, or the offset for i + var/j - var/strength - if(steps>1) - strength = INVERSE_SQUARE(intensity, max(range_modifier*steps, 1), 1) - else - strength = intensity + for(var/i in 1 to distance * 8) + //Culls invalid intensities + if(cintensity[i] * falloff < RAD_WAVE_MINIMUM) + continue + var/xpos + var/ypos + switch(i / distance) + if(0 to 2) + //Yes it starts one step off of what you'd expect. Blame BYOND. + xpos = cmaster_turf.x + distance + ypos = cmaster_turf.y + distance - i + if(2 to 4) + xpos = cmaster_turf.x + distance * 3 - i + ypos = cmaster_turf.y - distance + if(4 to 6) + xpos = cmaster_turf.x - distance + ypos = cmaster_turf.y - distance * 5 + i + if(6 to 8) + xpos = cmaster_turf.x - distance * 7 + i + ypos = cmaster_turf.y + distance + //Culls invalid coords + if(xpos < 1 || xpos > world.maxx || ypos < 1 || ypos > world.maxy) + continue - if(strength < RAD_WAVE_MINIMUM) - qdel(src) - return + //The radiation is considered alive + futile = FALSE + var/turf/place = locate(xpos, ypos, cmaster_turf.z) + atoms = get_rad_contents(place) - radiate(atoms, FLOOR(strength, 1)) + //Actual radiation spending + cintensity[i] *= radiate(atoms, cintensity[i] * falloff) - check_obstructions(atoms) // reduce our overall strength if there are radiation insulators + //Obstruction handling + check_obstructions(atoms, i) -/datum/radiation_wave/proc/get_rad_atoms() - var/list/atoms = list() - var/distance = steps - var/cmove_dir = move_dir - var/cmaster_turf = master_turf + /* + * This is what I call pseudo-raycasting (PRC). Real raycasting would be ridiculously expensive, + * So this is the solution I came up with. Don't try to understand it by seeing the code. + * You have been warned. If you find yourself really having to touch this cursed code, + * consider axing this away before contacting me via git-fu email digging. + * + * Therefore, I urge you not to hastily assume this code a culprit of your problem. + * This code is responsible just for *keeping the rads going forward* more reasonably + * in regard to obstruction and contamination cost. But, of course, if you are rewriting + * (notwithstanding how questionable rewriting something major of a mature codebase like + * every normal SS13 codebase is) the entire radiation code, then this code should be + * considered for deletion. + * + * On a side note, this implementation isn't very ideal. So please remove this instead of + * trying to improve it when its time has come. (i.e. another total overhaul) + * + * ~Xenomedes, Christmas 2020 + */ - if(cmove_dir == NORTH || cmove_dir == SOUTH) - distance-- //otherwise corners overlap + // Handling eight fundamental (read: perfectly straight) branches + if((j = i / distance) == (j = round(j))) + distance + 1 == branchclass * 2 \ + ? (i == distance * 8 \ + ? (intensity_new[j - 1] += (intensity_new[1] += ((intensity_new[(j += i)] = cintensity[i]) / 2)) && cintensity[i] / 2) \ + : (intensity_new[j - 1] += intensity_new[j + 1] = ((intensity_new[(j += i)] = cintensity[i]) / 2))) \ + : (intensity_new[i + j] = cintensity[i]) + continue - atoms += get_rad_contents(cmaster_turf) + var/list/cachecache - var/turf/place - for(var/dir in __dirs) //There should be just 2 dirs in here, left and right of the direction of movement - place = cmaster_turf - for(var/i in 1 to distance) - place = get_step(place, dir) - atoms += get_rad_contents(place) + if(!prc_behavior_cache) + prc_behavior_cache = list() + if(length(prc_behavior_cache) < distance) + prc_behavior_cache.len++ + // We don't reserve spaces for fundamental branches + var/L[distance - 1] + // distance == 1 is where every ray is fundamental branch + cachecache = prc_behavior_cache[distance - 1] = L + else + cachecache = prc_behavior_cache[distance - 1] - return atoms + // i % distance == 0 cases were already handled above + var/prc_behavior = cachecache[i % distance] -/datum/radiation_wave/proc/check_obstructions(list/atoms) - var/width = steps - var/cmove_dir = move_dir - if(cmove_dir == NORTH || cmove_dir == SOUTH) - width-- - width = 1+(2*width) + if(!prc_behavior) + // Necessary local variables + var/idx // index + var/lp // loop position + var/vl // velocity of loop + var/bt // branch threshold + // The actual behavior calculation + cachecache[i % distance] = prc_behavior = distance & 1 \ + ? ((lp = ((idx = i % distance) * (vl = distance - branchclass + 1)) % (distance + 1)) < (bt = branchclass - (idx - round(idx * vl / (distance + 1)))) \ + ? (lp \ + ? (lp + vl >= bt ? PRC_BEHAVIOR_LSTAR : PRC_BEHAVIOR_L) \ + : (vl >= bt ? PRC_BEHAVIOR_HLSTAR : PRC_BEHAVIOR_HL)) \ + : (lp > branchclass \ + ? (lp - vl <= bt ? PRC_BEHAVIOR_NWL : (lp - bt > branchclass ? PRC_BEHAVIOR_NWR : PRC_BEHAVIOR_N)) \ + : (lp == branchclass \ + ? (lp - vl <= bt ? PRC_BEHAVIOR_HRSTAR : PRC_BEHAVIOR_HR) \ + : (lp - vl <= bt ? PRC_BEHAVIOR_RSTAR : PRC_BEHAVIOR_R)))) \ + : ((lp = ((idx = i % distance) * (vl = distance - branchclass + 1)) % (distance + 1)) == (bt = branchclass - (idx - round(idx * vl / (distance + 1)))) \ + ? PRC_BEHAVIOR_D \ + : (lp > branchclass \ + ? (lp - vl <= bt ? PRC_BEHAVIOR_NWL : (lp - bt > branchclass ? PRC_BEHAVIOR_NWR : PRC_BEHAVIOR_N)) \ + : (lp < bt \ + ? (lp + vl >= bt ? PRC_BEHAVIOR_LSTAR : PRC_BEHAVIOR_L) \ + : (lp - vl <= bt ? PRC_BEHAVIOR_RSTAR : PRC_BEHAVIOR_R)))) + + prc_behavior & PRC_FLAG_HL \ + ? (intensity_new[i + j] += cintensity[i] / 2) \ + : (prc_behavior & PRC_FLAG_L \ + ? (intensity_new[i + j] = cintensity[i]) \ + : null) + + prc_behavior & PRC_FLAG_HR \ + ? (intensity_new[i + j + 1] += cintensity[i] / 2) \ + : (prc_behavior & PRC_FLAG_R \ + ? (intensity_new[i + j + 1] = cintensity[i]) \ + : null) + + if(futile) + qdel(src) + return + + // Now is time to move forward + intensity = intensity_new + steps += delta_time + +/datum/radiation_wave/proc/check_obstructions(list/atoms, index) for(var/k in 1 to atoms.len) var/atom/thing = atoms[k] if(!thing) continue - if (SEND_SIGNAL(thing, COMSIG_ATOM_RAD_WAVE_PASSING, src, width) & COMPONENT_RAD_WAVE_HANDLED) + if (SEND_SIGNAL(thing, COMSIG_ATOM_RAD_WAVE_PASSING, src, index) & COMPONENT_RAD_WAVE_HANDLED) continue if (thing.rad_insulation != RAD_NO_INSULATION) - intensity *= (1-((1-thing.rad_insulation)/width)) + intensity[index] *= thing.rad_insulation +// Returns post-radiation strength power scale of a ray +// If this proc returns a number lower than 1, it means that the some radiation was spent on contaminating something. /datum/radiation_wave/proc/radiate(list/atoms, strength) - var/contamination_chance = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_CHANCE_COEFFICIENT * min(1, 1/(steps*range_modifier)) + // returning 1 means no radiation was spent on contamination + . = 1 + var/list/moblist = list() + var/list/atomlist = list() + var/contam_strength = strength * (RAD_CONTAMINATION_STR_COEFFICIENT * RAD_CONTAMINATION_BUDGET_SIZE) // The budget for each list + var/is_contaminating = contam_strength > RAD_COMPONENT_MINIMUM && can_contaminate for(var/k in 1 to atoms.len) var/atom/thing = atoms[k] if(!thing) @@ -107,12 +244,45 @@ /obj/item/implant, /obj/singularity )) - if(!can_contaminate || blacklisted[thing.type]) + // Insulating objects won't get contaminated + if(!is_contaminating || blacklisted[thing.type] || SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION) continue - if(prob(contamination_chance)) // Only stronk rads get to have little baby rads - if(SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION) - continue - var/rad_strength = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT + if(ismob(thing)) + moblist += thing + else + atomlist += thing + + // We don't randomly choose one from the list since that can result in zero meaningful contamination + + if(atomlist.len) + . -= RAD_CONTAMINATION_BUDGET_SIZE + var/affordance = min(round(contam_strength / RAD_COMPONENT_MINIMUM), atomlist.len) + var/contam_strength_divided = contam_strength / affordance + for(var/k in 1 to affordance) + var/atom/poor_thing = atomlist[k] + poor_thing.AddComponent(/datum/component/radioactive, contam_strength_divided, source) + + if(moblist.len) + . -= RAD_CONTAMINATION_BUDGET_SIZE + var/affordance = min(round(contam_strength / RAD_COMPONENT_MINIMUM), moblist.len) + var/contam_strength_divided = contam_strength / affordance + for(var/k in 1 to affordance) + var/mob/poor_mob = moblist[k] + poor_mob.AddComponent(/datum/component/radioactive, contam_strength_divided, source) - if (rad_strength >= RAD_WAVE_MINIMUM) // Don't even bother to add the component if its waves aren't going to do anything - thing.AddComponent(/datum/component/radioactive, rad_strength, source) +#undef PRC_FLAG_HL +#undef PRC_FLAG_L +#undef PRC_FLAG_HR +#undef PRC_FLAG_R +#undef PRC_BEHAVIOR_N +#undef PRC_BEHAVIOR_NWL +#undef PRC_BEHAVIOR_NWR +#undef PRC_BEHAVIOR_L +#undef PRC_BEHAVIOR_LSTAR +#undef PRC_BEHAVIOR_R +#undef PRC_BEHAVIOR_RSTAR +#undef PRC_BEHAVIOR_D +#undef PRC_BEHAVIOR_HL +#undef PRC_BEHAVIOR_HLSTAR +#undef PRC_BEHAVIOR_HR +#undef PRC_BEHAVIOR_HRSTAR diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index 60a63f827a6a3..1ad3e72c29339 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -11,6 +11,7 @@ name = "Biological Storage Facility" description = "In case society crumbles, we will be able to restore our zoos to working order with the breeding stock kept in these 100% secure and unbreachable storage facilities. \ At no point has anything escaped. That's our story, and we're sticking to it." + cost = 4 /datum/map_template/ruin/space/asteroid1 id = "asteroid1" @@ -18,18 +19,19 @@ name = "Asteroid 1" description = "I-spy with my little eye, something beginning with R." - /datum/map_template/ruin/space/asteroid2 id = "asteroid2" suffix = "asteroid2.dmm" name = "Asteroid 2" description = "Oh my god, a giant rock!" + cost = 1 /datum/map_template/ruin/space/asteroid3 id = "asteroid3" suffix = "asteroid3.dmm" name = "Asteroid 3" description = "This asteroid floating in space has no official designation, because the scientist that discovered it deemed it 'super dull'." + cost = 1 /datum/map_template/ruin/space/asteroid4 id = "asteroid4" @@ -37,12 +39,96 @@ name = "Asteroid 4" description = "Nanotrasen Escape Pods have a 100%* success rate, and a 99%* customer satisfaction rate. \ *Please note that these statistics, are taken from pods that have successfully docked with a recovery vessel." + cost = 1 /datum/map_template/ruin/space/asteroid5 id = "asteroid5" suffix = "asteroid5.dmm" name = "Asteroid 5" description = "Oh my god, another giant rock!" + cost = 2 + +/datum/map_template/ruin/space/asteroid6 + id = "asteroid6" + suffix = "asteroid6.dmm" + name = "Asteroid 6" + description = "A odd crescent body." + +/datum/map_template/ruin/space/asteroid7 + id = "asteroid7" + suffix = "asteroid7.dmm" + name = "Asteroid 7" + description = "Space rocks!" + +/datum/map_template/ruin/space/asteroid8 + id = "asteroid8" + suffix = "asteroid8.dmm" + name = "Asteroid 8" + description = "Space rocks." + +/datum/map_template/ruin/space/asteroid9 + id = "asteroid9" + suffix = "asteroid9.dmm" + name = "Asteroid 9" + description = "This looks like it was a shuttle at some point... Now it's all rocks!" + +/datum/map_template/ruin/space/asteroid10 + id = "asteroid10" + suffix = "asteroid10.dmm" + name = "Asteroid 10" + description = "Welcome to dog heaven!" + +/datum/map_template/ruin/space/sos1 + id = "sos1" + suffix = "sos1.dmm" + name = "Pod 1" + description = "Help! I ran off course and I will never reach my destination!" + +/datum/map_template/ruin/space/sos2 + id = "sos2" + suffix = "sos2.dmm" + name = "Pod 2" + description = "Full frontal collision!" + +/datum/map_template/ruin/space/sos3 + id = "sos3" + suffix = "sos3.dmm" + name = "Pod 3" + description = "An ancient pod made out of odd materials..." + +/datum/map_template/ruin/space/sos4 + id = "sos4" + suffix = "sos4.dmm" + name = "Pod 4" + description = "Yuck!" + +/datum/map_template/ruin/space/sos5 + id = "sos5" + suffix = "sos5.dmm" + name = "Pod 5" + description = "Help never arrived!" + cost = 1 + +/datum/map_template/ruin/space/sos6 + id = "sos6" + suffix = "sos6.dmm" + name = "Pod 6" + description = "Cyka bylat! Vodka!!!" + cost = 1 + +/datum/map_template/ruin/space/sos7 + id = "sos7" + suffix = "sos7.dmm" + name = "Pod 7" + description = "Help! I was human once!" + cost = 1 + +/datum/map_template/ruin/space/sos8 + id = "sos8" + suffix = "sos8.dmm" + name = "Pod 8" + description = "CRASH!!!" + cost = 1 /datum/map_template/ruin/space/deep_storage id = "deep-storage" @@ -50,6 +136,7 @@ name = "Survivalist Bunker" description = "Assume the best, prepare for the worst. Generally, you should do so by digging a three man heavily fortified bunker into a giant unused asteroid. \ Then make it self sufficient, mask any evidence of construction, hook it covertly into the telecommunications network and hope for the best." + cost = 8 /datum/map_template/ruin/space/bigderelict1 id = "bigderelict1" @@ -57,6 +144,7 @@ name = "Derelict Tradepost" description = "A once-bustling tradestation that handled imports and exports from nearby stations now lays eerily dormant. \ The last received message was a distress call from one of the on-board officers, but we had no success in making contact again." + cost = 8 /datum/map_template/ruin/space/derelict1 id = "derelict1" @@ -64,6 +152,7 @@ name = "Derelict 1" description = "Nothing to see here citizen, move along, certainly no xeno outbreaks on this piece of station debris. That purple stuff? It's uh... station nectar. \ It's a top secret research installation." + cost = 2 /datum/map_template/ruin/space/derelict2 id = "derelict2" @@ -72,12 +161,14 @@ description = "Oh this is the night\n\ It's a beautiful night\n\ And we call it bella notte" + cost = 2 /datum/map_template/ruin/space/derelict3 id = "derelict3" suffix = "derelict3.dmm" name = "Derelict 3" description = "These hulks were once part of a larger structure, where the three great \[REDACTED\] were forged." + cost = 2 /datum/map_template/ruin/space/derelict4 id = "derelict4" @@ -85,12 +176,14 @@ name = "Derelict 4" description = "CentCom ferries have never crashed, will never crash, there is no current investigation into a crashed ferry, and we will not let Internal Affairs trample over high security \ information in the name of this baseless witchhunt." + cost = 2 /datum/map_template/ruin/space/derelict5 id = "derelict5" suffix = "derelict5.dmm" name = "Derelict 5" description = "The plan is, we put a whole bunch of crates full of treasure in this disused warehouse, launch it into space, and then ignore it. Forever." + cost = 2 /datum/map_template/ruin/space/derelict6 id = "derelict6" @@ -98,24 +191,28 @@ name = "Derelict 6" description = "The hush-hush of Nanotrasen when it comes to stations seemingly vanishing off the radar is an interesting topic, theories of nuclear destruction float about while Nanotrasen \ flat-out denies said stations ever existing." + cost = 2 /datum/map_template/ruin/space/empty_shell id = "empty-shell" suffix = "emptyshell.dmm" name = "Empty Shell" description = "Cozy, rural property available for a young professional couple. Only twelve parsecs from the nearest hyperspace lane!" + cost = 1 /datum/map_template/ruin/space/gas_the_lizards id = "gas-the-lizards" suffix = "gasthelizards.dmm" name = "Disposal Facility 17" description = "Gas efficiency at 95.6%, fluid elimination at 96.2%. Will require renewed supplies of 'carpet' before the end of the quarter." + cost = 2 /datum/map_template/ruin/space/intact_empty_ship id = "intact-empty-ship" suffix = "intactemptyship.dmm" name = "Authorship" description = "Just somewhere quiet, where I can focus on my work with no interruptions." + cost = 2 /datum/map_template/ruin/space/caravanambush id = "space/caravanambush" @@ -123,6 +220,7 @@ name = "Syndicate Ambush" description = "A caravan route used by passing cargo freights has been ambushed by a salvage team manned by the syndicate. \ The caravan managed to send off a distress message before being surrounded, their video feed cutting off as the sound of gunfire and a parrot was heard." + cost = 8 /datum/map_template/ruin/space/originalcontent id = "paperwizard" @@ -130,12 +228,14 @@ name = "A Giant Ball of Paper in Space" description = "Sightings of a giant wad of paper hurling through the depths of space have been recently reported by multiple outposts near this sector. \ A giant wad of paper, really? Damn prank callers." + cost = 4 /datum/map_template/ruin/space/mech_transport id = "mech-transport" suffix = "mechtransport.dmm" name = "CF Corsair" description = "Well, when is it getting here? I have bills to pay; very well-armed clients who want their shipments as soon as possible! I don't care, just find it!" + cost = 2 /datum/map_template/ruin/space/onehalf id = "onehalf" @@ -143,30 +243,35 @@ name = "DK Excavator 453" description = "Based on the trace elements we've detected on the gutted asteroids, we suspect that a mining ship using a restricted engine is somewhere in the area. \ We'd like to request a patrol vessel to investigate." + cost = 4 /datum/map_template/ruin/space/spacehotel id = "spacehotel" suffix = "spacehotel.dmm" name = "The Twin-Nexus Hotel" description = "An interstellar hotel, where the weary spaceman can rest their head and relax, assured that the residental staff will not murder them in their sleep. Probably." + cost = 8 /datum/map_template/ruin/space/turreted_outpost id = "turreted-outpost" suffix = "turretedoutpost.dmm" name = "Unnamed Turreted Outpost" description = "We'd ask them to stop blaring that ruskiepop music, but none of us are brave enough to go near those death turrets they have." + cost = 2 /datum/map_template/ruin/space/oldshuttle id = "spaceman-origins" suffix = "shuttlerelic.dmm" name = "Strange Ship" description = "A ship seemingly lost, drifting along the stars. This thing looks like it belongs in ancient times." + cost = 2 /datum/map_template/ruin/space/way_home id = "way-home" suffix = "way_home.dmm" name = "Salvation" description = "In the darkest times, we will find our way home." + cost = 1 /datum/map_template/ruin/space/djstation id = "djstation" @@ -174,12 +279,14 @@ name = "DJ Station" description = "Until very recently this pirate radio station was used to harangue local space stations over a variety of perceived \"ethics violations\". \ It seems like someone finally got sick of it, but the equipment still works." + cost = 2 /datum/map_template/ruin/space/thederelict id = "thederelict" suffix = "thederelict.dmm" name = "Kosmicheskaya Stantsiya 13" description = "The true fate of Kosmicheskaya Stantsiya 13 is an open question to this day. Most corporations deny its existence, for fear of questioning on what became of its crew." + cost = 8 /datum/map_template/ruin/space/abandonedteleporter id = "abandonedteleporter" @@ -187,6 +294,7 @@ name = "Abandoned Teleporter" description = "In space construction the teleporter is often the first system brought online. \ This lonely half built teleporter is a sign of a proposed structure that for one reason or another just never got built." + cost = 2 /datum/map_template/ruin/space/crashedclownship id = "crashedclownship" @@ -194,6 +302,7 @@ name = "Crashed Clown Ship" description = "For centuries the promise of a new clown homeworld has been the siren call for countless clown vessels. \ Alas the clown's lust for shinanagans means that successful voyages are almost unheard of, with most vessels falling to hilarious consequences almost immediately." + cost = 2 /datum/map_template/ruin/space/crashedship id = "crashedship" @@ -201,6 +310,7 @@ name = "Crashed Ship" description = "Among civilian vessels the most common cause of tragedy is lack of food. \ This ship was outfited with a multitude of food generating features, then summarily ran into an asteroid shortly after takeoff." + cost = 8 /datum/map_template/ruin/space/listeningstation id = "listeningstation" @@ -208,6 +318,7 @@ name = "Syndicate Listening Station" description = "Listening stations form the backbone of the syndicate's information gathering operations. \ Assignment to these stations is dreaded by most agents, as it entails long and lonely shifts listening to nearby stations chatter incessently about the most meaningless things." + cost = 5 /datum/map_template/ruin/space/oldAIsat id = "oldAIsat" @@ -216,12 +327,14 @@ description = "When the inspector told the employees that they were all fired, and that their jobs \"could be done by trained lizards anyway\", they reacted badly. \ This event and others is the reason why Central always sends an ERT squad with their competent inspectors. Incompetent inspectors are told they can \"do it alone\" because they're \"that pro\". \ Incompetent inspectors believe this." + cost = 4 /datum/map_template/ruin/space/oldteleporter id = "oldteleporter" suffix = "oldteleporter.dmm" name = "Detached Teleporter" description = "The structure of this surprisingly intact teleporter suggests that it was once part of a larger structure, but what remains of said structure, if anything, can only be guessed at." + cost = 1 /datum/map_template/ruin/space/vaporwave id = "vaporwave" @@ -229,6 +342,7 @@ name = "Aesthetic Outpost" description = "Pause and remember-- You are unique.You are special. Every mistake, trial, and hardship has helped to sculpt your real beauty. \ Stop hating yourself and start appreciating and loving yourself!" + cost = 2 /datum/map_template/ruin/space/bus id = "bus" @@ -236,6 +350,7 @@ name = "Waylaid Buses" description = "There seems to be a pair of buses that pulled over for repairs. What were they doing..? Their shipment sure seems to be filled with a strange mix. \ Anyway, it looks like some people tried to fix it up for a long time but didn't really get anywhere..." + cost = 2 /datum/map_template/ruin/space/oldstation id = "oldstation" @@ -243,6 +358,7 @@ name = "Ancient Space Station" description = "The crew of a space station awaken one hundred years after a crisis. Awaking to a derelict space station on the verge of collapse, and a hostile force of invading \ hivebots. Can the surviving crew overcome the odds and survive and rebuild, or will the cold embrace of the stars become their new home?" + cost = 8 /datum/map_template/ruin/space/miracle id = "miracle" @@ -255,6 +371,7 @@ suffix = "gondolaasteroid.dmm" name = "Gondoland" description = "Just an ordinary rock- wait, what's that thing?" + cost = 2 /datum/map_template/ruin/space/whiteshipruin_box id = "whiteshipruin_box" @@ -262,12 +379,14 @@ name = "NT Medical Ship" description = "An ancient ship, said to be among the first discovered derelicts near Space Station 13 that was still in working order. \ Aged and deprecated by time, this relic of a vessel is now broken beyond repair." + cost = 2 /datum/map_template/ruin/space/whiteshipdock id = "whiteshipdock" suffix = "whiteshipdock.dmm" name = "Whiteship Dock" description = "An abandoned but functional vessel parked in deep space, ripe for the taking." + cost = 2 /datum/map_template/ruin/space/cat_experiments id = "meow" @@ -275,40 +394,82 @@ name = "Feline-Human Combination Den" description = "With heated debates over the legality of the catperson and their status in the workforce, there's always a place for the blackmarket to slip in for some cash. Whether the results \ are morally sound or not is another issue entirely." + cost = 4 /datum/map_template/ruin/space/cloning_facility id = "cloning_facility" suffix = "cloning_facility.dmm" name = "Ancient Cloning Lab" description = "An experimental cloning lab snapped off from an ancient ship. The cloner model inside lacks many modern functionalities and security measures." + cost = 2 /datum/map_template/ruin/space/hilbertresearchfacility id = "hilbert_facility" suffix = "hilbertshoteltestingsite.dmm" name = "Hilbert Research Facility" description = "A research facility of great bluespace discoveries. Long since abandoned, willingly or not..." + cost = 2 /datum/map_template/ruin/space/clownplanet id = "clownplanet" suffix = "clownplanet.dmm" name = "Clown Planet" description = "Thought lost in 2552, this minor planet has recently been rediscovered." + cost = 2 /datum/map_template/ruin/space/macspace id = "fast_food" suffix = "Fast_Food.dmm" name = "Mac Space Restaurant" description = "A fast food reataurant in space." + cost = 5 /datum/map_template/ruin/space/scav_mining id = "mining_asteroid" suffix = "scav_mining.dmm" name = "Mining asteroid" description = "An abandoned mining operation on an asteroid that now has new ocupants that is not happy to se you" + cost = 2 /datum/map_template/ruin/space/power_puzzle id = "power_puzzle" suffix = "power_puzzle.dmm" name = "Power Puzzle" description = "an abandoned secure storage location. there is no power left in the batteries and the former ocupants locked it pretty tight before leaving.\ - You will have to power areas to raise the bolts on the doors. look out for secrets." \ No newline at end of file + You will have to power areas to raise the bolts on the doors. look out for secrets." + cost = 4 + +/datum/map_template/ruin/space/spacearcade + id = "spacearcade" + suffix = "spacearcade.dmm" + name = "Space Arcade" + description = "Come here to have fun! We even have the best arcade game in the Universe, Disco Disco Rave!" + cost = 2 + +/datum/map_template/ruin/space/spacedock + id = "spacearcade" + suffix = "spacedock13.dmm" + name = "Shuttle Construction" + description = "A shuttle building station that seems to have been forgotten, or floated off into space." + cost = 2 + +/datum/map_template/ruin/space/spacehive + id = "spacehive" + suffix = "spacehive.dmm" + name = "Space Hive" + description = "A hydroponics experiment gone horribly, horribly wrong!" + cost = 1 + +/datum/map_template/ruin/space/swarmerstation + id = "swarmerstation13" + suffix = "swarmerstation13.dmm" + name = "Swarmer Station" + description = "Shat is left of a syndicate radio station, after swarmers infiltrated it." + cost = 2 + +/datum/map_template/ruin/space/refference + id = "refference" + suffix = "refference.dmm" + name = "Lost Cyborg" + description = "500 years too soon!" + cost = 2 diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index 11e2cbdc10292..fd46c5bcdeafc 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -33,8 +33,11 @@ if(LINGHIVE_LINK) to_chat(M, msg) if(LINGHIVE_OUTSIDER) - if(prob(40)) - to_chat(M, "We can faintly sense an outsider trying to communicate through the hivemind...") + var/mob/living/L = M + if (!HAS_TRAIT(L, CHANGELING_HIVEMIND_MUTE) && prob(70)) + to_chat(M, msg) + else + to_chat(M, "We hear a faint chittering from within our mind...") if(LINGHIVE_LING) if (HAS_TRAIT(user, CHANGELING_HIVEMIND_MUTE)) to_chat(user, "The poison in the air hinders our ability to interact with the hivemind.") @@ -57,8 +60,11 @@ if (!HAS_TRAIT(L, CHANGELING_HIVEMIND_MUTE)) to_chat(M, msg) if(LINGHIVE_OUTSIDER) - if(prob(40)) - to_chat(M, "We can faintly sense another of our kind trying to communicate through the hivemind...") + var/mob/living/L = M + if (!HAS_TRAIT(L, CHANGELING_HIVEMIND_MUTE) && prob(70)) + to_chat(M, msg) + else + to_chat(M, "We hear a faint chittering from within our mind...") if(LINGHIVE_OUTSIDER) to_chat(user, "Our senses have not evolved enough to be able to communicate this way...") return FALSE @@ -88,7 +94,7 @@ return FALSE -/datum/saymode/binary //everything that uses .b (silicons, drones, blobbernauts/spores, swarmers) +/datum/saymode/binary //everything that uses .b (silicons, drones, swarmers) key = MODE_KEY_BINARY mode = MODE_BINARY @@ -97,10 +103,6 @@ var/mob/living/simple_animal/hostile/swarmer/S = user S.swarmer_chat(message) return FALSE - if(isblobmonster(user)) - var/mob/living/simple_animal/hostile/blob/B = user - B.blob_chat(message) - return FALSE if(isdrone(user)) var/mob/living/simple_animal/drone/D = user D.drone_chat(message) diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index e6a9fcd3c0a6e..8d96dbb44965a 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -11,6 +11,7 @@ var/credit_cost = INFINITY var/can_be_bought = TRUE + var/illegal_shuttle = FALSE //makes you able to buy the shuttle at a hacked/emagged comms console even if can_be_bought is FALSE var/list/movement_force // If set, overrides default movement_force on shuttle @@ -21,9 +22,14 @@ /datum/map_template/shuttle/proc/prerequisites_met() return TRUE -/datum/map_template/shuttle/New() +/datum/map_template/shuttle/New(path = null, rename = null, cache = FALSE, admin_load = null) + if(admin_load)//This data must be populated for the system to not shit itself apparently + suffix = admin_load + port_id = "custom" + can_be_bought = FALSE shuttle_id = "[port_id]_[suffix]" - mappath = "[prefix][shuttle_id].dmm" + if(!admin_load) + mappath = "[prefix][shuttle_id].dmm" . = ..() /datum/map_template/shuttle/preload_size(path, cache) @@ -244,12 +250,25 @@ description = "The crew must pass through an otherworldy arena to board this shuttle. Expect massive casualties. The source of the Bloody Signal must be tracked down and eliminated to unlock this shuttle." admin_notes = "RIP AND TEAR." credit_cost = 10000 + /// Whether the arena z-level has been created + var/arena_loaded = FALSE /datum/map_template/shuttle/emergency/arena/prerequisites_met() if(SHUTTLE_UNLOCK_BUBBLEGUM in SSshuttle.shuttle_purchase_requirements_met) return TRUE return FALSE +/datum/map_template/shuttle/emergency/arena/post_load(obj/docking_port/mobile/M) + . = ..() + if(!arena_loaded) + arena_loaded = TRUE + var/datum/map_template/arena/arena_template = new() + arena_template.load_new_z() + +/datum/map_template/arena + name = "The Arena" + mappath = "_maps/templates/the_arena.dmm" + /datum/map_template/shuttle/emergency/birdboat suffix = "birdboat" name = "Birdboat Station Emergency Shuttle" @@ -268,13 +287,6 @@ credit_cost = 2000 description = "The gold standard in emergency exfiltration, this tried and true design is equipped with everything the crew needs for a safe flight home." -/datum/map_template/shuttle/emergency/donut - suffix = "donut" - name = "Donutstation Emergency Shuttle" - description = "The perfect spearhead for any crude joke involving the station's shape, this shuttle supports a separate containment cell for prisoners and a compact medical wing." - admin_notes = "Has airlocks on both sides of the shuttle and will probably intersect near the front on some stations that build past departures." - credit_cost = 2500 - /datum/map_template/shuttle/emergency/clown suffix = "clown" name = "Snappop(tm)!" @@ -307,6 +319,12 @@ credit_cost = 5000 description = "A fully functional shuttle including a complete infirmary, storage facilties and regular amenities." +/datum/map_template/shuttle/emergency/corg + suffix = "corg" + name = "Corg Station Emergency Shuttle" + credit_cost = 4000 + description = "A smaller shuttle with area for cargo, medical and security personnel." + /datum/map_template/shuttle/emergency/mini suffix = "mini" name = "Ministation emergency shuttle" @@ -451,14 +469,14 @@ suffix = "kilo" name = "supply shuttle (Kilo)" +/datum/map_template/shuttle/cargo/corg + suffix = "corg" + name = "supply shuttle (Corg)" + /datum/map_template/shuttle/cargo/birdboat suffix = "birdboat" name = "supply shuttle (Birdboat)" -/datum/map_template/shuttle/cargo/donut - suffix = "donut" - name = "supply shuttle (Donut)" - /datum/map_template/shuttle/emergency/delta suffix = "delta" name = "Delta Station Emergency Shuttle" @@ -504,9 +522,9 @@ suffix = "box" name = "labour shuttle (Box)" -/datum/map_template/shuttle/arrival/donut - suffix = "donut" - name = "arrival shuttle (Donut)" +/datum/map_template/shuttle/arrival/corg + suffix = "corg" + name = "arrival shuttle (Corg)" /datum/map_template/shuttle/infiltrator/basic suffix = "basic" @@ -538,6 +556,20 @@ name = "science outpost shuttle" can_be_bought = FALSE +/datum/map_template/shuttle/exploration + port_id = "exploration" + suffix = "shuttle" + name = "exploration shuttle" + can_be_bought = FALSE + +/datum/map_template/shuttle/exploration/corg + suffix = "corg" + name = "corg exploration shuttle" + +/datum/map_template/shuttle/exploration/delta + suffix = "delta" + name = "delta exploration shuttle" + /datum/map_template/shuttle/labour/delta suffix = "delta" name = "labour shuttle (Delta)" @@ -546,6 +578,10 @@ suffix = "kilo" name = "labour shuttle (Kilo)" +/datum/map_template/shuttle/labour/corg + suffix = "corg" + name = "labour shuttle (Corg)" + /datum/map_template/shuttle/arrival/delta suffix = "delta" name = "arrival shuttle (Delta)" @@ -629,3 +665,11 @@ suffix = "primary" name = "primary turbolift (multi-z debug)" can_be_bought = FALSE + +/datum/map_template/shuttle/tram + port_id = "tram" + can_be_bought = FALSE + +/datum/map_template/shuttle/tram/corg + suffix = "corg" + name = "corgstation transport shuttle" diff --git a/code/datums/soullink.dm b/code/datums/soullink.dm index de73a8e74c6d7..618944739a759 100644 --- a/code/datums/soullink.dm +++ b/code/datums/soullink.dm @@ -5,6 +5,8 @@ var/list/sharedSoullinks //soullinks we are a/the sharer of /mob/living/Destroy() + if(playable) + remove_from_spawner_menu() for(var/s in ownedSoullinks) var/datum/soullink/S = s S.ownerDies(FALSE) diff --git a/code/datums/soundtrack.dm b/code/datums/soundtrack.dm new file mode 100644 index 0000000000000..97f4505f7186f --- /dev/null +++ b/code/datums/soundtrack.dm @@ -0,0 +1,29 @@ +GLOBAL_LIST_EMPTY(soundtrack_this_round) // A running list of soundtrack songs that have played this round, for credits entries + +/datum/soundtrack_song + var/title + var/artist + var/url + var/album + var/file + +/datum/soundtrack_song/bee + album = "BeeStation OST" + +/datum/soundtrack_song/bee/future_perception + title = "Future Perception" + artist = "Merct" + url = "https://www.youtube.com/watch?v=N9559mSGjKg" + file = 'sound/soundtrack/future_perception.ogg' + +/datum/soundtrack_song/bee/countdown + title = "Countdown" + artist = "qwertyquerty" + url = "https://www.youtube.com/watch?v=G2gVAPKlgqA" + file = 'sound/soundtrack/countdown.ogg' + +/datum/soundtrack_song/bee/mind_crawler + title = "Mind Crawler" + artist = "Merct" + url = "https://www.youtube.com/watch?v=EiLBxoBNsNo" + file = 'sound/soundtrack/mind_crawler.ogg' diff --git a/code/datums/spawners_menu.dm b/code/datums/spawners_menu.dm index 95a7d8e63391d..ec6a4484d20e0 100644 --- a/code/datums/spawners_menu.dm +++ b/code/datums/spawners_menu.dm @@ -1,11 +1,3 @@ -/datum/spawners_menu - var/mob/dead/observer/owner - -/datum/spawners_menu/New(mob/dead/observer/new_owner) - if(!istype(new_owner)) - qdel(src) - owner = new_owner - /datum/spawners_menu/ui_state(mob/user) return GLOB.observer_state @@ -34,13 +26,21 @@ this["flavor_text"] = MS.flavour_text this["important_info"] = MS.important_info else - var/obj/O = spawner_obj - this["desc"] = O.desc + var/atom/movable/O = spawner_obj + if(isslime(O)) + this["short_desc"] = O.get_spawner_desc() + this["flavor_text"] = O.get_spawner_flavour_text() + else + this["desc"] = O.desc + this["amount_left"] = LAZYLEN(GLOB.mob_spawners[spawner]) data["spawners"] += list(this) return data +/datum/spawners_menu/ui_state(mob/user) + return GLOB.observer_state + /datum/spawners_menu/ui_act(action, params) if(..()) return @@ -49,17 +49,17 @@ if(!group_name || !(group_name in GLOB.mob_spawners)) return var/list/spawnerlist = GLOB.mob_spawners[group_name] - if(!spawnerlist.len) + if(!LAZYLEN(spawnerlist)) return - var/obj/effect/mob_spawn/MS = pick(spawnerlist) + var/atom/movable/MS = pick(spawnerlist) if(!istype(MS) || !(MS in GLOB.poi_list)) return switch(action) if("jump") if(MS) - owner.forceMove(get_turf(MS)) + usr.forceMove(get_turf(MS)) . = TRUE if("spawn") if(MS) - MS.attack_ghost(owner) + MS.attack_ghost(usr) . = TRUE diff --git a/code/datums/station_traits/_station_trait.dm b/code/datums/station_traits/_station_trait.dm new file mode 100644 index 0000000000000..93fc351f69189 --- /dev/null +++ b/code/datums/station_traits/_station_trait.dm @@ -0,0 +1,40 @@ +///Base class of station traits. These are used to influence rounds in one way or the other by influencing the levers of the station. +/datum/station_trait + ///Name of the trait + var/name = "unnamed station trait" + ///The type of this trait. Used to classify how this trait influences the station + var/trait_type = STATION_TRAIT_NEUTRAL + ///Whether or not this trait uses process() + var/trait_processes = FALSE + ///Chance relative to other traits of its type to be picked + var/weight = 10 + ///Does this trait show in the centcom report? + var/show_in_report = FALSE + ///What message to show in the centcom report? + var/report_message + ///What code-trait does this station trait give? gives none if null + var/trait_to_give + ///What traits are incompatible with this one? + var/blacklist + ///Extra flags for station traits such as it being abstract + var/trait_flags + ///Should we announce anything roundstart? If so, those are our options + var/list/possible_announcements + + +/datum/station_trait/New() + . = ..() + SSticker.OnRoundstart(CALLBACK(src, .proc/on_round_start)) + if(trait_processes) + START_PROCESSING(SSstation, src) + if(trait_to_give) + ADD_TRAIT(SSstation, trait_to_give, STATION_TRAIT) + +///Proc ran when round starts. Use this for roundstart effects. +/datum/station_trait/proc/on_round_start() + if(length(possible_announcements)) + priority_announce(pick(possible_announcements), null, null, has_important_message = TRUE) + +///type of info the centcom report has on this trait, if any. +/datum/station_trait/proc/get_report() + return "[name] - [report_message]" diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm new file mode 100644 index 0000000000000..c18ae1085cf2a --- /dev/null +++ b/code/datums/station_traits/negative_traits.dm @@ -0,0 +1,171 @@ +/datum/station_trait/carp_infestation + name = "Carp infestation" + trait_type = STATION_TRAIT_NEGATIVE + weight = 5 + show_in_report = TRUE + report_message = "Dangerous fauna is present in the area of this station." + trait_to_give = STATION_TRAIT_CARP_INFESTATION + +/datum/station_trait/distant_supply_lines + name = "Distant supply lines" + trait_type = STATION_TRAIT_NEGATIVE + weight = 3 + show_in_report = TRUE + report_message = "Due to the distance to our normal supply lines, cargo orders are more expensive." + blacklist = list(/datum/station_trait/strong_supply_lines) + trait_to_give = STATION_TRAIT_DISTANT_SUPPLY_LINES + +/datum/station_trait/late_arrivals + name = "Late Arrivals" + trait_type = STATION_TRAIT_NEGATIVE + weight = 2 + show_in_report = TRUE + report_message = "Sorry for that, we didn't expect to fly into that vomiting goose while bringing you to your new station." + trait_to_give = STATION_TRAIT_LATE_ARRIVALS + blacklist = list(/datum/station_trait/random_spawns, /datum/station_trait/hangover) + possible_announcements = list("You are getting late, again. Get your stuff together or you are all fired.", + "Our calculations were off by a bit. Shuttle will be there in a few seconds.") + +/datum/station_trait/random_spawns + name = "Drive-by landing" + trait_type = STATION_TRAIT_NEGATIVE + weight = 2 + show_in_report = TRUE + report_message = "Sorry for that, we missed your station by a few miles, so we just launched you towards your station in pods. Hope you don't mind!" + trait_to_give = STATION_TRAIT_RANDOM_ARRIVALS + blacklist = list(/datum/station_trait/late_arrivals, /datum/station_trait/hangover) + possible_announcements = list("We overshot your station by a few miles. Prepare to be pod launched onto it.", + "We've missed your station, sorry for that. You will be launched onto it shortly.") + +/datum/station_trait/hangover + name = "Hangover" + trait_type = STATION_TRAIT_NEGATIVE + weight = 2 + show_in_report = TRUE + report_message = "Ohh.... Man.... That mandatory office party from last shift... God that was awesome... I woke up in some random toilet 3 sectors away..." + trait_to_give = STATION_TRAIT_HANGOVER + blacklist = list(/datum/station_trait/late_arrivals, /datum/station_trait/random_spawns) + possible_announcements = list("That was one hell of a night. Now, get back to work.", + "Party's over. Get back to work.") + +/datum/station_trait/hangover/New() + . = ..() + RegisterSignal(SSdcs, COMSIG_GLOB_JOB_AFTER_SPAWN, .proc/on_job_after_spawn) + RegisterSignal(SSmapping, COMSIG_SUBSYSTEM_POST_INITIALIZE, .proc/create_spawners) + +/datum/station_trait/hangover/proc/create_spawners() + var/list/turf/turfs = get_safe_random_station_turfs(typesof(/area/hallway), rand(200, 300)) + for(var/turf/T as() in turfs) + new /obj/effect/spawner/hangover_spawn(T) + + +/datum/station_trait/hangover/proc/on_job_after_spawn(datum/source, datum/job/job, mob/living/living_mob, mob/spawned_mob, joined_late) + SIGNAL_HANDLER + + if(joined_late) + return + if(!iscarbon(living_mob)) + return + + var/mob/living/carbon/spawned_carbon = living_mob + spawned_carbon.set_resting(TRUE, silent = TRUE) + if(prob(50)) + spawned_carbon.adjust_drugginess(rand(15, 20)) + else + spawned_carbon.drunkenness += rand(15, 25) + spawned_carbon.adjust_disgust(rand(5, 55)) //How hungover are you? + + if(prob(35) && !spawned_carbon.head) + var/obj/item/hat = pick(list(/obj/item/clothing/head/sombrero, /obj/item/clothing/head/fedora, /obj/item/clothing/mask/balaclava, /obj/item/clothing/head/ushanka, /obj/item/clothing/head/cardborg, /obj/item/clothing/head/pirate, /obj/item/clothing/head/cone)) + hat = new hat(spawned_mob) + spawned_mob.equip_to_slot(hat, ITEM_SLOT_HEAD) + +/obj/effect/spawner/hangover_spawn + name = "hangover spawner" + +/obj/effect/spawner/hangover_spawn/Initialize() + . = ..() + if(prob(60)) + new /obj/effect/decal/cleanable/vomit(get_turf(src)) + if(prob(70)) + var/bottle_count = pick(10;1, 5;2, 2;3) + for(var/index in 1 to bottle_count) + new /obj/item/reagent_containers/food/drinks/beer/almost_empty(get_turf(src)) + +/datum/station_trait/blackout + name = "Blackout" + trait_type = STATION_TRAIT_NEGATIVE + weight = 5 + show_in_report = TRUE + report_message = "Station lights seem to be damaged, be safe when starting your shift today." + +/datum/station_trait/blackout/on_round_start() + . = ..() + for(var/a in GLOB.apcs_list) + var/obj/machinery/power/apc/current_apc = a + if(prob(60)) + current_apc.overload_lighting() + +/datum/station_trait/empty_maint + name = "Cleaned out maintenance" + trait_type = STATION_TRAIT_NEGATIVE + weight = 5 + show_in_report = TRUE + report_message = "Our workers cleaned out most of the junk in the maintenace areas." + blacklist = list(/datum/station_trait/filled_maint) + trait_to_give = STATION_TRAIT_EMPTY_MAINT + + +/datum/station_trait/overflow_job_bureacracy + name = "Overflow bureacracy mistake" + trait_type = STATION_TRAIT_NEGATIVE + weight = 5 + show_in_report = TRUE + var/list/jobs_to_use = list("Clown", "Bartender", "Cook", "Botanist", "Cargo Technician", "Mime", "Janitor") + var/chosen_job + +/datum/station_trait/overflow_job_bureacracy/New() + . = ..() + chosen_job = pick(jobs_to_use) + RegisterSignal(SSjob, COMSIG_SUBSYSTEM_POST_INITIALIZE, .proc/set_overflow_job_override) + +/datum/station_trait/overflow_job_bureacracy/get_report() + return "[name] - It seems for some reason we put out the wrong job-listing for the overflow role this shift...I hope you like [chosen_job]s." + +/datum/station_trait/overflow_job_bureacracy/proc/set_overflow_job_override(datum/source, new_overflow_role) + SIGNAL_HANDLER + + SSjob.set_overflow_role(chosen_job) + +/datum/station_trait/slow_shuttle + name = "Slow Shuttle" + trait_type = STATION_TRAIT_NEGATIVE + weight = 5 + show_in_report = TRUE + report_message = "Due to distance to our supply station, the cargo shuttle will have a slower flight time to your cargo department." + blacklist = list(/datum/station_trait/quick_shuttle) + +/datum/station_trait/slow_shuttle/on_round_start() + . = ..() + SSshuttle.supply.callTime *= 1.5 + +/datum/station_trait/bot_languages + name = "Bot Language Matrix Malfunction" + trait_type = STATION_TRAIT_NEGATIVE + weight = 3 + show_in_report = TRUE + report_message = "Your station's friendly bots have had their language matrix fried due to an event, resulting in some strange and unfamiliar speech patterns." + +/datum/station_trait/bot_languages/New() + . = ..() + /// What "caused" our robots to go haywire (fluff) + var/event_source = pick(list("an ion storm", "a syndicate hacking attempt", "a malfunction", "issues with your onboard AI", "an intern's mistakes", "budget cuts")) + report_message = "Your station's friendly bots have had their language matrix fried due to [event_source], resulting in some strange and unfamiliar speech patterns." + +/datum/station_trait/bot_languages/on_round_start() + . = ..() + //All bots that exist round start have their set language randomized. + for(var/mob/living/simple_animal/bot/found_bot in GLOB.alive_mob_list) + /// The bot's language holder - so we can randomize and change their language + var/datum/language_holder/bot_languages = found_bot.get_language_holder() + bot_languages.selected_language = bot_languages.get_random_spoken_language() diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm new file mode 100644 index 0000000000000..c7cc020910c71 --- /dev/null +++ b/code/datums/station_traits/neutral_traits.dm @@ -0,0 +1,80 @@ +/datum/station_trait/bananium_shipment + name = "Bananium Shipment" + trait_type = STATION_TRAIT_NEUTRAL + weight = 5 + report_message = "Rumors has it that the clown planet has been sending support packages to clowns in this system" + trait_to_give = STATION_TRAIT_BANANIUM_SHIPMENTS + +/datum/station_trait/ian_adventure + name = "Ian's Adventure" + trait_type = STATION_TRAIT_NEUTRAL + weight = 5 + show_in_report = FALSE + report_message = "Ian has gone exploring somewhere in the station." + +/datum/station_trait/ian_adventure/on_round_start() + for(var/mob/living/simple_animal/pet/dog/corgi/dog in GLOB.mob_list) + if(!(istype(dog, /mob/living/simple_animal/pet/dog/corgi/Ian) || istype(dog, /mob/living/simple_animal/pet/dog/corgi/puppy/Ian))) + continue + + // The extended safety checks at time of writing are about chasms and lava + // if there are any chasms and lava on stations in the future, woah + var/turf/current_turf = get_turf(dog) + var/turf/adventure_turf = find_safe_turf(extended_safety_checks = TRUE, dense_atoms = FALSE) + + // Poof! + do_smoke(location=current_turf) + dog.forceMove(adventure_turf) + do_smoke(location=adventure_turf) + + +/datum/station_trait/glitched_pdas + name = "PDA glitch" + trait_type = STATION_TRAIT_NEUTRAL + weight = 8 + show_in_report = TRUE + report_message = "Something seems to be wrong with the PDAs issued to you all this shift. Nothing too bad though." + trait_to_give = STATION_TRAIT_PDA_GLITCHED + +/datum/station_trait/announcement_intern + name = "Announcement Intern" + trait_type = STATION_TRAIT_NEUTRAL + weight = 3 + show_in_report = TRUE + report_message = "Please be nice to him." + blacklist = list(/datum/station_trait/announcement_medbot, + /datum/station_trait/announcement_baystation + ) + +/datum/station_trait/announcement_intern/New() + . = ..() + SSstation.announcer = /datum/centcom_announcer/intern + +/datum/station_trait/announcement_medbot + name = "Announcement \"System\"" + trait_type = STATION_TRAIT_NEUTRAL + weight = 5 + show_in_report = TRUE + report_message = "Our announcement system is under scheduled maintanance at the moment. Thankfully, we have a backup." + blacklist = list( + /datum/station_trait/announcement_intern, + /datum/station_trait/announcement_baystation + ) + +/datum/station_trait/announcement_medbot/New() + . = ..() + SSstation.announcer = /datum/centcom_announcer/medbot + +/datum/station_trait/announcement_baystation + name = "Announcer: Archival Tape" + trait_type = STATION_TRAIT_NEUTRAL + weight = 5 + show_in_report = TRUE + report_message = "We lost the primary datatape that holds the announcement system's voice responses. We did however find an older backup." + blacklist = list(/datum/station_trait/announcement_intern, + /datum/station_trait/announcement_medbot + ) + +/datum/station_trait/announcement_baystation/New() + . = ..() + SSstation.announcer = /datum/centcom_announcer/baystation diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm new file mode 100644 index 0000000000000..967701c333250 --- /dev/null +++ b/code/datums/station_traits/positive_traits.dm @@ -0,0 +1,123 @@ +#define PARTY_COOLDOWN_LENGTH_MIN 6 MINUTES +#define PARTY_COOLDOWN_LENGTH_MAX 12 MINUTES + + +/datum/station_trait/lucky_winner + name = "Lucky winner" + trait_type = STATION_TRAIT_POSITIVE + weight = 1 + show_in_report = TRUE + report_message = "Your station has won the grand prize of the annual station charity event. Free snacks will be delivered to the bar every now and then." + trait_processes = TRUE + COOLDOWN_DECLARE(party_cooldown) + +/datum/station_trait/lucky_winner/on_round_start() + . = ..() + COOLDOWN_START(src, party_cooldown, rand(PARTY_COOLDOWN_LENGTH_MIN, PARTY_COOLDOWN_LENGTH_MAX)) + +/datum/station_trait/lucky_winner/process(delta_time) + if(!COOLDOWN_FINISHED(src, party_cooldown)) + return + + COOLDOWN_START(src, party_cooldown, rand(PARTY_COOLDOWN_LENGTH_MIN, PARTY_COOLDOWN_LENGTH_MAX)) + + var/area/area_to_spawn_in = pick(GLOB.bar_areas) + var/turf/T = get_safe_random_station_turfs(area_to_spawn_in) + + var/obj/structure/closet/supplypod/centcompod/toLaunch = new() + var/obj/item/pizzabox/pizza_to_spawn = pick(list(/obj/item/pizzabox/margherita, /obj/item/pizzabox/mushroom, /obj/item/pizzabox/meat, /obj/item/pizzabox/vegetable)) //no pineapple pizza you monster + new pizza_to_spawn(toLaunch) + for(var/i in 1 to 6) + new /obj/item/reagent_containers/food/drinks/beer(toLaunch) + new /obj/effect/pod_landingzone(T, toLaunch) + +/datum/station_trait/galactic_grant + name = "Galactic grant" + trait_type = STATION_TRAIT_POSITIVE + weight = 5 + show_in_report = TRUE + report_message = "Your station has been selected for a special grant. Some extra funds has been made available to your cargo department." + +/datum/station_trait/galactic_grant/on_round_start() + var/datum/bank_account/cargo_bank = SSeconomy.get_dep_account(ACCOUNT_CAR) + cargo_bank.adjust_money(rand(2000, 5000)) + +/datum/station_trait/premium_internals_box + name = "Premium internals boxes" + trait_type = STATION_TRAIT_POSITIVE + weight = 10 + show_in_report = TRUE + report_message = "The internals boxes for your crew have been filled with bonus equipment." + trait_to_give = STATION_TRAIT_PREMIUM_INTERNALS + +/datum/station_trait/bountiful_bounties + name = "Bountiful bounties" + trait_type = STATION_TRAIT_POSITIVE + weight = 5 + show_in_report = TRUE + report_message = "It seems collectors in this system are extra keen to on bounties, and will pay more to see their completion." + +/datum/station_trait/bountiful_bounties/on_round_start() + SSeconomy.bounty_modifier *= 1.2 + +/datum/station_trait/strong_supply_lines + name = "Strong supply lines" + trait_type = STATION_TRAIT_POSITIVE + weight = 5 + show_in_report = TRUE + report_message = "Prices are low in this system, BUY BUY BUY!" + blacklist = list(/datum/station_trait/distant_supply_lines) + trait_to_give = STATION_TRAIT_STRONG_SUPPLY_LINES + +/datum/station_trait/scarves + name = "Scarves" + trait_type = STATION_TRAIT_POSITIVE + weight = 5 + show_in_report = TRUE + var/list/scarves + +/datum/station_trait/scarves/New() + . = ..() + report_message = pick( + "Nanotrasen is experimenting with seeing if neck warmth improves employee morale.", + "After Space Fashion Week, scarves are the hot new accessory.", + "Everyone was simultaneously a little bit cold when they packed to go to the station.", + "The station is definitely not under attack by neck grappling aliens masquerading as wool. Definitely not.", + "You all get free scarves. Don't ask why.", + "A shipment of scarves was delivered to the station.", + ) + scarves = typesof(/obj/item/clothing/neck/scarf) + list( + /obj/item/clothing/neck/stripedredscarf, + /obj/item/clothing/neck/stripedgreenscarf, + /obj/item/clothing/neck/stripedbluescarf, + ) + + RegisterSignal(SSdcs, COMSIG_GLOB_JOB_AFTER_SPAWN, .proc/on_job_after_spawn) + +/datum/station_trait/scarves/proc/on_job_after_spawn(datum/source, datum/job/job, mob/living/living_mob, mob/M, joined_late) + SIGNAL_HANDLER + + var/scarf_type = pick(scarves) + + living_mob.equip_to_slot_or_del(new scarf_type(living_mob), ITEM_SLOT_NECK) + +/datum/station_trait/filled_maint + name = "Filled up maintenance" + trait_type = STATION_TRAIT_POSITIVE + weight = 5 + show_in_report = TRUE + report_message = "Our workers accidentally forgot more of their personal belongings in the maintenance areas." + blacklist = list(/datum/station_trait/empty_maint) + trait_to_give = STATION_TRAIT_FILLED_MAINT + +/datum/station_trait/quick_shuttle + name = "Quick Shuttle" + trait_type = STATION_TRAIT_POSITIVE + weight = 5 + show_in_report = TRUE + report_message = "Due to proximity to our supply station, the cargo shuttle will have a quicker flight time to your cargo department." + blacklist = list(/datum/station_trait/slow_shuttle) + +/datum/station_trait/quick_shuttle/on_round_start() + . = ..() + SSshuttle.supply.callTime *= 0.5 diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index a264dd850a9d2..2e09609233766 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -3,9 +3,9 @@ /datum/status_effect/shadow_mend id = "shadow_mend" duration = 30 - alert_type = /obj/screen/alert/status_effect/shadow_mend + alert_type = /atom/movable/screen/alert/status_effect/shadow_mend -/obj/screen/alert/status_effect/shadow_mend +/atom/movable/screen/alert/status_effect/shadow_mend name = "Shadow Mend" desc = "Shadowy energies wrap around your wounds, sealing them at a price. After healing, you will slowly lose health every three seconds for thirty seconds." icon_state = "shadow_mend" @@ -29,9 +29,9 @@ id = "void_price" duration = 300 tick_interval = 30 - alert_type = /obj/screen/alert/status_effect/void_price + alert_type = /atom/movable/screen/alert/status_effect/void_price -/obj/screen/alert/status_effect/void_price +/atom/movable/screen/alert/status_effect/void_price name = "Void Price" desc = "Black tendrils cinch tightly against you, digging wicked barbs into your flesh." icon_state = "shadow_mend" @@ -43,7 +43,7 @@ /datum/status_effect/cyborg_power_regen id = "power_regen" duration = 100 - alert_type = /obj/screen/alert/status_effect/power_regen + alert_type = /atom/movable/screen/alert/status_effect/power_regen var/power_to_give = 0 //how much power is gained each tick /datum/status_effect/cyborg_power_regen/on_creation(mob/living/new_owner, new_power_per_tick) @@ -51,7 +51,7 @@ if(. && isnum_safe(new_power_per_tick)) power_to_give = new_power_per_tick -/obj/screen/alert/status_effect/power_regen +/atom/movable/screen/alert/status_effect/power_regen name = "Power Regeneration" desc = "You are quickly regenerating power!" icon_state = "power_regen" @@ -68,16 +68,16 @@ id = "his_grace" duration = -1 tick_interval = 4 - alert_type = /obj/screen/alert/status_effect/his_grace + alert_type = /atom/movable/screen/alert/status_effect/his_grace var/bloodlust = 0 -/obj/screen/alert/status_effect/his_grace +/atom/movable/screen/alert/status_effect/his_grace name = "His Grace" desc = "His Grace hungers, and you must feed Him." icon_state = "his_grace" alerttooltipstyle = "hisgrace" -/obj/screen/alert/status_effect/his_grace/MouseEntered(location,control,params) +/atom/movable/screen/alert/status_effect/his_grace/MouseEntered(location,control,params) desc = initial(desc) var/datum/status_effect/his_grace/HG = attached_effect desc += "
Current Bloodthirst: [HG.bloodlust]\ @@ -118,7 +118,7 @@ /datum/status_effect/wish_granters_gift //Fully revives after ten seconds. id = "wish_granters_gift" duration = 50 - alert_type = /obj/screen/alert/status_effect/wish_granters_gift + alert_type = /atom/movable/screen/alert/status_effect/wish_granters_gift /datum/status_effect/wish_granters_gift/on_apply() to_chat(owner, "Death is not your end! The Wish Granter's energy suffuses you, and you begin to rise...") @@ -129,7 +129,7 @@ owner.visible_message("[owner] appears to wake from the dead, having healed all wounds!", "You have regenerated.") owner.update_mobility() -/obj/screen/alert/status_effect/wish_granters_gift +/atom/movable/screen/alert/status_effect/wish_granters_gift name = "Wish Granter's Immortality" desc = "You are being resurrected!" icon_state = "wish_granter" @@ -167,7 +167,7 @@ id = "blooddrunk" duration = 10 tick_interval = 0 - alert_type = /obj/screen/alert/status_effect/blooddrunk + alert_type = /atom/movable/screen/alert/status_effect/blooddrunk var/last_health = 0 var/last_bruteloss = 0 var/last_fireloss = 0 @@ -176,7 +176,7 @@ var/last_cloneloss = 0 var/last_staminaloss = 0 -/obj/screen/alert/status_effect/blooddrunk +/atom/movable/screen/alert/status_effect/blooddrunk name = "Blood-Drunk" desc = "You are drunk on blood! Your pulse thunders in your ears! Nothing can harm you!" //not true, and the item description mentions its actual effect icon_state = "blooddrunk" @@ -209,7 +209,7 @@ last_staminaloss = owner.getStaminaLoss() owner.log_message("gained blood-drunk stun immunity", LOG_ATTACK) owner.add_stun_absorption("blooddrunk", INFINITY, 4) - owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, 1) + owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, 1, use_reverb = FALSE) /datum/status_effect/blooddrunk/tick() //multiply the effect of healing by 10 if(owner.health > last_health) @@ -312,18 +312,18 @@ playsound(owner, 'sound/weapons/fwoosh.ogg', 75, 0) var/obj/item/slashy slashy = owner.get_active_held_item() - for(var/mob/living/M in orange(1,owner)) + for(var/mob/living/M in ohearers(1,owner)) slashy.attack(M, owner) /datum/status_effect/sword_spin/on_remove() owner.visible_message("[owner]'s inhuman strength dissipates and the sword's runes grow cold!") - //Used by changelings to rapidly heal //Being on fire will suppress this healing /datum/status_effect/fleshmend id = "fleshmend" - alert_type = /obj/screen/alert/status_effect/fleshmend + alert_type = /atom/movable/screen/alert/status_effect/fleshmend + duration = 100 /datum/status_effect/fleshmend/tick() if(owner.on_fire) @@ -331,12 +331,13 @@ return else linked_alert.icon_state = "fleshmend" - owner.adjustBruteLoss(-1.5, FALSE) - owner.adjustFireLoss(-0.25, FALSE) - owner.adjustToxLoss(-0.5, FALSE) - owner.adjustCloneLoss(-0.5) + owner.adjustBruteLoss(-2.5, FALSE) + owner.adjustFireLoss(-2.5, FALSE) + owner.adjustOxyLoss(-2.5) + owner.adjustCloneLoss(-2.5) + owner.adjustToxLoss(-2.5, FALSE, TRUE) -/obj/screen/alert/status_effect/fleshmend +/atom/movable/screen/alert/status_effect/fleshmend name = "Fleshmend" desc = "Our wounds are rapidly healing. This effect is prevented if we are on fire." icon_state = "fleshmend" @@ -426,13 +427,13 @@ itemUser.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1.5) itemUser.adjustCloneLoss(-0.5) //Becasue apparently clone damage is the bastion of all health //Heal all those around you, unbiased - for(var/mob/living/L in view(7, owner)) + for(var/mob/living/L in hearers(7, owner)) if(L.health < L.maxHealth) new /obj/effect/temp_visual/heal(get_turf(L), "#375637") if(iscarbon(L)) L.adjustBruteLoss(-3.5) L.adjustFireLoss(-3.5) - L.adjustToxLoss(-3.5, forced = TRUE) //Because Slime People are people too + L.adjustToxLoss(-3.5, FALSE, TRUE) //Because Slime People are people too L.adjustOxyLoss(-3.5) L.adjustStaminaLoss(-3.5) L.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3.5) @@ -444,7 +445,7 @@ var/mob/living/simple_animal/SM = L SM.adjustHealth(-3.5, forced = TRUE) -/obj/screen/alert/status_effect/regenerative_core +/atom/movable/screen/alert/status_effect/regenerative_core name = "Blessing of the Necropolis" desc = "The power of the necropolis flows through you. You could get used to this..." icon_state = "regenerative_core" @@ -454,7 +455,7 @@ id = "Regenerative Core" duration = 300 status_type = STATUS_EFFECT_REPLACE - alert_type = /obj/screen/alert/status_effect/regenerative_core + alert_type = /atom/movable/screen/alert/status_effect/regenerative_core var/power = 1 var/alreadyinfected = FALSE diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 25d260605a7ac..de71c4b4eb84a 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -48,7 +48,7 @@ //SLEEPING /datum/status_effect/incapacitating/sleeping id = "sleeping" - alert_type = /obj/screen/alert/status_effect/asleep + alert_type = /atom/movable/screen/alert/status_effect/asleep needs_update_stat = TRUE var/mob/living/carbon/carbon_owner var/mob/living/carbon/human/human_owner @@ -88,7 +88,7 @@ if(prob(10) && owner.health > owner.crit_threshold) owner.emote("snore") -/obj/screen/alert/status_effect/asleep +/atom/movable/screen/alert/status_effect/asleep name = "Asleep" desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are." icon_state = "asleep" @@ -98,7 +98,7 @@ id = "stasis" duration = -1 tick_interval = 10 - alert_type = /obj/screen/alert/status_effect/stasis + alert_type = /atom/movable/screen/alert/status_effect/stasis var/last_dead_time /datum/status_effect/incapacitating/stasis/proc/update_time_of_death() @@ -114,6 +114,7 @@ /datum/status_effect/incapacitating/stasis/on_creation(mob/living/new_owner, set_duration, updating_canmove) . = ..() update_time_of_death() + owner.reagents?.end_metabolization(owner, FALSE) /datum/status_effect/incapacitating/stasis/tick() update_time_of_death() @@ -126,7 +127,7 @@ update_time_of_death() return ..() -/obj/screen/alert/status_effect/stasis +/atom/movable/screen/alert/status_effect/stasis name = "Stasis" desc = "Your biological functions have halted. You could live forever this way, but it's pretty boring." icon_state = "stasis" @@ -137,7 +138,7 @@ /datum/status_effect/strandling //get it, strand as in durathread strand + strangling = strandling hahahahahahahahahahhahahaha i want to die id = "strandling" status_type = STATUS_EFFECT_UNIQUE - alert_type = /obj/screen/alert/status_effect/strandling + alert_type = /atom/movable/screen/alert/status_effect/strandling /datum/status_effect/strandling/on_apply() ADD_TRAIT(owner, TRAIT_MAGIC_CHOKE, "dumbmoron") @@ -147,13 +148,13 @@ REMOVE_TRAIT(owner, TRAIT_MAGIC_CHOKE, "dumbmoron") return ..() -/obj/screen/alert/status_effect/strandling +/atom/movable/screen/alert/status_effect/strandling name = "Choking strand" desc = "A magical strand of Durathread is wrapped around your neck, preventing you from breathing! Click this icon to remove the strand." icon_state = "his_grace" alerttooltipstyle = "hisgrace" -/obj/screen/alert/status_effect/strandling/Click(location, control, params) +/atom/movable/screen/alert/status_effect/strandling/Click(location, control, params) . = ..() if(usr != owner) return @@ -168,9 +169,9 @@ id = "syringe" status_type = STATUS_EFFECT_MULTIPLE alert_type = null - var/obj/item/reagent_containers/syringe/syringe = null + var/obj/item/reagent_containers/syringe/syringe var/injectmult = 1 - + /datum/status_effect/syringe/on_creation(mob/living/new_owner, obj/item/reagent_containers/syringe/origin, mult) syringe = origin injectmult = mult @@ -181,7 +182,7 @@ var/amount = syringe.initial_inject syringe.reagents.reaction(owner, INJECT) syringe.reagents.trans_to(owner, max(3.1, amount * injectmult)) - owner.throw_alert("syringealert", /obj/screen/alert/syringe) + owner.throw_alert("syringealert", /atom/movable/screen/alert/syringe) /datum/status_effect/syringe/tick() . = ..() @@ -190,16 +191,18 @@ syringe.reagents.trans_to(owner, amount * injectmult) -/obj/screen/alert/syringe +/atom/movable/screen/alert/syringe name = "Embedded Syringe" desc = "A syringe has embedded itself into your body, injecting its reagents! click this icon to carefully remove the syringe." icon_state = "drugged" alerttooltipstyle = "hisgrace" -/obj/screen/alert/syringe/Click(location, control, params) +/atom/movable/screen/alert/syringe/Click(location, control, params) . = ..() if(usr != owner) return + if(owner.incapacitated()) + return var/list/syringes = list() if(iscarbon(owner)) var/mob/living/carbon/C = owner @@ -210,7 +213,7 @@ var/datum/status_effect/syringe/syringestatus = pick_n_take(syringes) if(istype(syringestatus, /datum/status_effect/syringe)) var/obj/item/reagent_containers/syringe/syringe = syringestatus.syringe - to_chat(owner, "You begin carefully pulling the syringe out...") + to_chat(owner, "You begin carefully pulling the syringe out.") if(do_after(C, 20, null, owner)) to_chat(C, "You succesfuly remove the syringe.") syringe.forceMove(C.loc) @@ -223,7 +226,7 @@ syringe.reagents.trans_to(C, amount) syringe.forceMove(C.loc) qdel(syringestatus) - if(!C.has_status_effect(STATUS_EFFECT_SYRINGE)) + if(!C.has_status_effect(STATUS_EFFECT_SYRINGE)) C.clear_alert("syringealert") @@ -264,9 +267,9 @@ id = "his_wrath" duration = -1 tick_interval = 4 - alert_type = /obj/screen/alert/status_effect/his_wrath + alert_type = /atom/movable/screen/alert/status_effect/his_wrath -/obj/screen/alert/status_effect/his_wrath +/atom/movable/screen/alert/status_effect/his_wrath name = "His Wrath" desc = "You fled from His Grace instead of feeding Him, and now you suffer." icon_state = "his_grace" @@ -299,9 +302,9 @@ status_type = STATUS_EFFECT_REPLACE alert_type = null var/mutable_appearance/marked_underlay - var/obj/item/twohanded/kinetic_crusher/hammer_synced + var/obj/item/kinetic_crusher/hammer_synced -/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, obj/item/twohanded/kinetic_crusher/new_hammer_synced) +/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, obj/item/kinetic_crusher/new_hammer_synced) . = ..() if(.) hammer_synced = new_hammer_synced @@ -393,7 +396,7 @@ 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) + playsound(T, "desecration", 200, 1, -1) owner.adjustBruteLoss(bleed_damage) else new /obj/effect/temp_visual/bleed(get_turf(owner)) @@ -448,7 +451,7 @@ /datum/status_effect/necropolis_curse/proc/apply_curse(set_curse) curse_flags |= set_curse if(curse_flags & CURSE_BLINDING) - owner.overlay_fullscreen("curse", /obj/screen/fullscreen/curse, 1) + owner.overlay_fullscreen("curse", /atom/movable/screen/fullscreen/curse, 1) /datum/status_effect/necropolis_curse/proc/remove_curse(remove_curse) if(remove_curse & CURSE_BLINDING) @@ -510,7 +513,7 @@ ADD_TRAIT(owner, TRAIT_PACIFISM, "gonbolaPacify") ADD_TRAIT(owner, TRAIT_MUTE, "gonbolaMute") ADD_TRAIT(owner, TRAIT_JOLLY, "gonbolaJolly") - to_chat(owner, "You suddenly feel at peace and feel no need to make any sudden or rash actions...") + to_chat(owner, "You suddenly feel at peace and feel no need to make any sudden or rash actions.") return ..() /datum/status_effect/gonbolaPacify/on_remove() @@ -525,11 +528,11 @@ tick_interval = 10 examine_text = "SUBJECTPRONOUN seems slow and unfocused." var/stun = TRUE - alert_type = /obj/screen/alert/status_effect/trance + alert_type = /atom/movable/screen/alert/status_effect/trance -/obj/screen/alert/status_effect/trance +/atom/movable/screen/alert/status_effect/trance name = "Trance" - desc = "Everything feels so distant, and you can feel your thoughts forming loops inside your head..." + desc = "Everything feels so distant, and you can feel your thoughts forming loops inside your head." icon_state = "high" /datum/status_effect/trance/tick() @@ -545,7 +548,7 @@ if(!owner.has_quirk(/datum/quirk/monochromatic)) owner.add_client_colour(/datum/client_colour/monochrome) owner.visible_message("[stun ? "[owner] stands still as [owner.p_their()] eyes seem to focus on a distant point." : ""]", \ - "[pick("You feel your thoughts slow down...", "You suddenly feel extremely dizzy...", "You feel like you're in the middle of a dream...","You feel incredibly relaxed...")]") + "[pick("You feel your thoughts slow down.", "You suddenly feel extremely dizzy.", "You feel like you're in the middle of a dream.","You feel incredibly relaxed.")]") return TRUE /datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE) @@ -561,14 +564,16 @@ owner.remove_client_colour(/datum/client_colour/monochrome) to_chat(owner, "You snap out of your trance!") -/datum/status_effect/trance/proc/hypnotize(datum/source, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/datum/status_effect/trance/proc/hypnotize(datum/source, list/hearing_args, list/spans, list/message_mods = list()) + SIGNAL_HANDLER + if(!owner.can_hear()) return - if(speaker == owner) + if(hearing_args[HEARING_SPEAKER] == owner) return var/mob/living/carbon/C = owner C.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) //clear previous hypnosis - addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message), 10) + addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, hearing_args[HEARING_RAW_MESSAGE]), 10) addtimer(CALLBACK(C, /mob/living.proc/Stun, 60, TRUE, TRUE), 15) //Take some time to think about it qdel(src) @@ -601,9 +606,8 @@ range = 7 var/list/mob/living/targets = list() - for(var/mob/M in oview(owner, range)) - if(isliving(M)) - targets += M + for(var/mob/living/M in oview(range, owner)) + targets += M if(LAZYLEN(targets)) to_chat(owner, "Your arm spasms!") owner.log_message(" attacked someone due to a Muscle Spasm", LOG_ATTACK) //the following attack will log itself @@ -621,7 +625,7 @@ return var/obj/item/I = owner.get_active_held_item() var/list/turf/targets = list() - for(var/turf/T in oview(owner, 3)) + for(var/turf/T in oview(3, get_turf(owner))) targets += T if(LAZYLEN(targets) && I) to_chat(owner, "Your arm spasms!") @@ -632,7 +636,7 @@ id = "convulsing" duration = 150 status_type = STATUS_EFFECT_REFRESH - alert_type = /obj/screen/alert/status_effect/convulsing + alert_type = /atom/movable/screen/alert/status_effect/convulsing /datum/status_effect/convulsing/on_creation(mob/living/zappy_boy) . = ..() @@ -646,7 +650,7 @@ H.visible_message("[H]'s hand convulses, and they drop their [I.name]!","Your hand convulses violently, and you drop what you were holding!") H.jitteriness += 5 -/obj/screen/alert/status_effect/convulsing +/atom/movable/screen/alert/status_effect/convulsing name = "Shaky Hands" desc = "You've been zapped with something and your hands can't stop shaking! You can't seem to hold on to anything." icon_state = "convulsing" @@ -655,7 +659,7 @@ id = "dna_melt" duration = 600 status_type = STATUS_EFFECT_REPLACE - alert_type = /obj/screen/alert/status_effect/dna_melt + alert_type = /atom/movable/screen/alert/status_effect/dna_melt var/kill_either_way = FALSE //no amount of removing mutations is gonna save you now /datum/status_effect/dna_melt/on_creation(mob/living/new_owner, set_duration, updating_canmove) @@ -669,7 +673,7 @@ var/mob/living/carbon/human/H = owner H.something_horrible(kill_either_way) -/obj/screen/alert/status_effect/dna_melt +/atom/movable/screen/alert/status_effect/dna_melt 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" @@ -679,7 +683,7 @@ duration = 100 status_type = STATUS_EFFECT_REPLACE tick_interval = 1 - alert_type = /obj/screen/alert/status_effect/go_away + alert_type = /atom/movable/screen/alert/status_effect/go_away var/direction /datum/status_effect/go_away/on_creation(mob/living/new_owner, set_duration, updating_canmove) @@ -692,7 +696,7 @@ var/turf/T = get_step(owner, direction) owner.forceMove(T) -/obj/screen/alert/status_effect/go_away +/atom/movable/screen/alert/status_effect/go_away name = "TO THE STARS AND BEYOND!" desc = "I must go, my people need me!" icon_state = "high" @@ -703,7 +707,7 @@ duration = 25 status_type = STATUS_EFFECT_REFRESH tick_interval = 1 - alert_type = /obj/screen/alert/status_effect/interdiction + alert_type = /atom/movable/screen/alert/status_effect/interdiction var/running_toggled = FALSE /datum/status_effect/interdiction/tick() @@ -712,7 +716,7 @@ if(owner.confused < 10) owner.confused = 10 running_toggled = TRUE - to_chat(owner, "You know you shouldn't be running here...") + to_chat(owner, "You know you shouldn't be running here.") owner.add_movespeed_modifier(MOVESPEED_ID_INTERDICTION, multiplicative_slowdown=1.5) /datum/status_effect/interdiction/on_remove() @@ -720,9 +724,9 @@ if(running_toggled && owner.m_intent == MOVE_INTENT_WALK) owner.toggle_move_intent(owner) -/obj/screen/alert/status_effect/interdiction +/atom/movable/screen/alert/status_effect/interdiction name = "Interdicted" - desc = "I don't think I am meant to go this way..." + desc = "I don't think I am meant to go this way." icon_state = "inathneqs_endowment" /datum/status_effect/fake_virus @@ -834,8 +838,8 @@ var/mob/living/carbon/carbon_owner = owner carbon_owner.adjustStaminaLoss(10 * repetitions) carbon_owner.adjustFireLoss(5 * repetitions) - for(var/mob/living/carbon/victim in range(1,carbon_owner)) - if(IS_HERETIC(victim) || victim == carbon_owner) + for(var/mob/living/carbon/victim in ohearers(1,carbon_owner)) + if(IS_HERETIC(victim)) continue victim.apply_status_effect(type,repetitions-1) break @@ -859,36 +863,84 @@ id = "corrosion_curse" status_type = STATUS_EFFECT_REPLACE alert_type = null - tick_interval = 1 SECONDS + tick_interval = 4 SECONDS /datum/status_effect/corrosion_curse/on_creation(mob/living/new_owner, ...) . = ..() - to_chat(owner, "Your feel your body starting to break apart...") + to_chat(owner, "You hear a distant whisper that fills you with dread.") /datum/status_effect/corrosion_curse/tick() . = ..() if(!ishuman(owner)) return var/mob/living/carbon/human/H = owner + if (H.IsSleeping()) + return var/chance = rand(0,100) + var/message = "Coder did fucky wucky U w U" switch(chance) - if(0 to 19) + if(0 to 39) + H.adjustStaminaLoss(20) + message = "You feel tired." + if(40 to 59) + H.Dizzy(3 SECONDS) + message = "Your feel light headed." + if(60 to 74) + H.confused = max(H.confused, 2 SECONDS) + message = "Your feel confused." + if(75 to 79) + H.adjustOrganLoss(ORGAN_SLOT_STOMACH,15) H.vomit() - if(20 to 29) - H.Dizzy(10) - if(30 to 39) - H.adjustOrganLoss(ORGAN_SLOT_LIVER,5) - if(40 to 49) - H.adjustOrganLoss(ORGAN_SLOT_HEART,5) - if(50 to 59) - H.adjustOrganLoss(ORGAN_SLOT_STOMACH,5) - if(60 to 69) - H.adjustOrganLoss(ORGAN_SLOT_EYES,10) - if(70 to 79) - H.adjustOrganLoss(ORGAN_SLOT_EARS,10) - if(80 to 89) - H.adjustOrganLoss(ORGAN_SLOT_LUNGS,10) - if(90 to 99) - H.adjustOrganLoss(ORGAN_SLOT_TONGUE,10) - if(100) - H.adjustOrganLoss(ORGAN_SLOT_BRAIN,20) + message = "Black bile shoots out of your mouth." + if(80 to 84) + H.adjustOrganLoss(ORGAN_SLOT_LIVER,15) + H.SetKnockdown(10) + message = "Your feel a terrible pain in your abdomen." + if(85 to 89) + H.adjustOrganLoss(ORGAN_SLOT_EYES,15) + message = "Your eyes sting." + else + H.adjustOrganLoss(ORGAN_SLOT_EARS,15) + message = "Your inner ear hurts." + if (prob(33)) //so the victim isn't spammed with messages every 3 seconds + to_chat(H,message) + +/datum/status_effect/ghoul + id = "ghoul" + status_type = STATUS_EFFECT_UNIQUE + duration = -1 + examine_text = "SUBJECTPRONOUN has a blank, catatonic like stare." + alert_type = /atom/movable/screen/alert/status_effect/ghoul + +/atom/movable/screen/alert/status_effect/ghoul + name = "Flesh Servant" + desc = "You are a Ghoul! A eldritch monster reanimated to serve its master." + icon_state = "mind_control" + +/datum/status_effect/spanish + id = "spanish" + duration = 120 SECONDS + alert_type = null + +/datum/status_effect/spanish/on_apply(mob/living/new_owner, ...) + . = ..() + to_chat(owner, "Alert: Vocal cords are malfunctioning.") + owner.add_blocked_language(subtypesof(/datum/language/) - /datum/language/uncommon, LANGUAGE_EMP) + owner.grant_language(/datum/language/uncommon, FALSE, TRUE, LANGUAGE_EMP) + +/datum/status_effect/spanish/on_remove() + owner.remove_blocked_language(subtypesof(/datum/language/), LANGUAGE_EMP) + owner.remove_language(/datum/language/uncommon, TRUE, TRUE, LANGUAGE_EMP) + to_chat(owner, "Alert: Vocal cords restored to normal function.") + return ..() + +/datum/status_effect/ipc/emp + id = "ipc_emp" + examine_text = "SUBJECTPRONOUN is buzzing and twitching!" + duration = 120 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/emp + status_type = STATUS_EFFECT_REFRESH +/atom/movable/screen/alert/status_effect/emp + name = "Electro-Magnetic Pulse" + desc = "You've been hit with an EMP! You're malfunctioning!" + icon_state = "hypnosis" diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index 608dbb2d7a116..c0b2988f0dde5 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -2,11 +2,11 @@ id = "frozen" duration = 100 status_type = STATUS_EFFECT_UNIQUE - alert_type = /obj/screen/alert/status_effect/freon + alert_type = /atom/movable/screen/alert/status_effect/freon var/icon/cube var/can_melt = TRUE -/obj/screen/alert/status_effect/freon +/atom/movable/screen/alert/status_effect/freon name = "Frozen Solid" desc = "You're frozen inside an ice cube, and cannot move! You can still do stuff, like shooting. Resist out of the cube!" icon_state = "frozen" @@ -26,6 +26,11 @@ qdel(src) /datum/status_effect/freon/proc/owner_resist() + SIGNAL_HANDLER + + INVOKE_ASYNC(src, .proc/do_resist) + +/datum/status_effect/freon/proc/do_resist() to_chat(owner, "You start breaking out of the ice cube!") if(do_mob(owner, owner, 40)) if(!QDELETED(src)) diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 1f032929c742e..ff1f54aceedb7 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -49,7 +49,7 @@ get_kill() . = ..() -/obj/screen/alert/status_effect/in_love +/atom/movable/screen/alert/status_effect/in_love name = "In Love" desc = "You feel so wonderfully in love!" icon_state = "in_love" @@ -58,7 +58,7 @@ id = "in_love" duration = -1 status_type = STATUS_EFFECT_UNIQUE - alert_type = /obj/screen/alert/status_effect/in_love + alert_type = /atom/movable/screen/alert/status_effect/in_love var/mob/living/date /datum/status_effect/in_love/on_creation(mob/living/new_owner, mob/living/love_interest) @@ -70,7 +70,9 @@ /datum/status_effect/in_love/tick() if(date) new /obj/effect/temp_visual/love_heart/invisible(get_turf(date.loc), owner) - + if(get_dist(get_turf(owner), get_turf(date)) < 7) + owner.heal_overall_damage(1, 1, BODYPART_ORGANIC) + date.heal_overall_damage(1, 1, BODYPART_ORGANIC) /datum/status_effect/throat_soothed id = "throat_soothed" @@ -117,7 +119,7 @@ spell.update_icon() rewarded.adjustBruteLoss(-25) rewarded.adjustFireLoss(-25) - rewarded.adjustToxLoss(-25) + rewarded.adjustToxLoss(-25, FALSE, TRUE) rewarded.adjustOxyLoss(-25) rewarded.adjustCloneLoss(-25) @@ -128,6 +130,20 @@ alert_type = null var/mob/living/listening_in +/datum/status_effect/bugged/on_apply(mob/living/new_owner, mob/living/tracker) + . = ..() + if (.) + RegisterSignal(new_owner, COMSIG_MOVABLE_HEAR, .proc/handle_hearing) + +/datum/status_effect/bugged/on_remove() + . = ..() + UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) + +/datum/status_effect/bugged/proc/handle_hearing(datum/source, list/hearing_args) + SIGNAL_HANDLER + listening_in.show_message(hearing_args[HEARING_MESSAGE]) + + /datum/status_effect/bugged/on_creation(mob/living/new_owner, mob/living/tracker) . = ..() if(.) diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index fe989d6b4e413..a67e29b68387a 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -10,8 +10,8 @@ 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 - var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists + var/alert_type = /atom/movable/screen/alert/status_effect //the alert thrown by the status effect, contains name and description + var/atom/movable/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists /datum/status_effect/New(list/arguments) on_creation(arglist(arguments)) @@ -19,16 +19,16 @@ /datum/status_effect/proc/on_creation(mob/living/new_owner, ...) if(new_owner) owner = new_owner - if(owner) - LAZYADD(owner.status_effects, src) - if(!owner || !on_apply()) + if(QDELETED(owner) || !on_apply()) qdel(src) return + if(owner) + LAZYADD(owner.status_effects, src) if(duration != -1) duration = world.time + duration tick_interval = world.time + tick_interval if(alert_type) - var/obj/screen/alert/status_effect/A = owner.throw_alert(id, alert_type) + var/atom/movable/screen/alert/status_effect/A = owner.throw_alert(id, alert_type) A.attached_effect = src //so the alert can reference us, if it needs to linked_alert = A //so we can reference the alert, if we need to if(duration > 0 || initial(tick_interval) > 0) //don't process if we don't care @@ -38,6 +38,7 @@ /datum/status_effect/Destroy() STOP_PROCESSING(SSfastprocess, src) if(owner) + linked_alert = null owner.clear_alert(id) LAZYREMOVE(owner.status_effects, src) on_remove() @@ -81,11 +82,15 @@ // ALERT HOOK // //////////////// -/obj/screen/alert/status_effect +/atom/movable/screen/alert/status_effect name = "Curse of Mundanity" desc = "You don't feel any different..." var/datum/status_effect/attached_effect +/atom/movable/screen/alert/status_effect/Destroy() + attached_effect = null //Don't keep a ref now + return ..() + ////////////////// // HELPER PROCS // ////////////////// diff --git a/code/datums/tgs_event_handler.dm b/code/datums/tgs_event_handler.dm new file mode 100644 index 0000000000000..602323d22c027 --- /dev/null +++ b/code/datums/tgs_event_handler.dm @@ -0,0 +1,41 @@ +/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: Rebooting will no longer [reboot_mode_lookup["[old_reboot_mode]"]], it will [reboot_mode_lookup["[new_reboot_mode]"]] instead") + 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, TIMER_STOPPABLE) + 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[new_version.deprefixed_parameter]") + else + message_admins("TGS: Back online") + if(reattach_timer) + deltimer(reattach_timer) + reattach_timer = null + if(TGS_EVENT_WATCHDOG_SHUTDOWN) + to_chat_immediate(world, "Server is shutting down!") + +/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/_quirk.dm b/code/datums/traits/_quirk.dm index 8cccc66063a7e..d5c7753277640 100644 --- a/code/datums/traits/_quirk.dm +++ b/code/datums/traits/_quirk.dm @@ -59,14 +59,14 @@ /datum/quirk/proc/clone_data() //return additional data that should be remembered by cloning /datum/quirk/proc/on_clone(data) //create the quirk from clone data -/datum/quirk/process() +/datum/quirk/process(delta_time) if(QDELETED(quirk_holder)) quirk_holder = null qdel(src) return if(quirk_holder.stat == DEAD) return - on_process() + on_process(delta_time) /mob/living/proc/get_trait_string(medical) //helper string. gets a string of all the traits the mob has var/list/dat = list() @@ -124,7 +124,7 @@ Use this as a guideline var/mob/living/carbon/human/H = quirk_holder var/obj/item/clothing/glasses/regular/glasses = new(get_turf(H)) H.put_in_hands(glasses) - H.equip_to_slot(glasses, SLOT_GLASSES) + H.equip_to_slot(glasses, ITEM_SLOT_EYES) H.regenerate_icons() //This whole proc is called automatically diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 4a0f0f7e5b252..fac6f5fe67677 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -67,8 +67,8 @@ mob_trait = TRAIT_JOLLY mood_quirk = TRUE -/datum/quirk/jolly/on_process() - if(prob(0.05)) +/datum/quirk/jolly/on_process(delta_time) + if(DT_PROB(0.05, delta_time)) SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "jolly", /datum/mood_event/jolly) /datum/quirk/light_step @@ -91,8 +91,8 @@ var/mob/living/carbon/human/H = quirk_holder var/obj/item/choice_beacon/music/B = new(get_turf(H)) var/list/slots = list ( - "backpack" = SLOT_IN_BACKPACK, - "hands" = SLOT_HANDS, + "backpack" = ITEM_SLOT_BACKPACK, + "hands" = ITEM_SLOT_HANDS, ) H.equip_in_one_of_slots(B, slots , qdel_on_fail = TRUE) @@ -144,8 +144,14 @@ /datum/quirk/photographer/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/camera/camera = new(get_turf(H)) - H.put_in_hands(camera) - H.equip_to_slot(camera, SLOT_NECK) + var/list/camera_slots = list ( + "neck" = ITEM_SLOT_NECK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET, + "backpack" = ITEM_SLOT_BACKPACK, + "hands" = ITEM_SLOT_HANDS + ) + H.equip_in_one_of_slots(camera, camera_slots , qdel_on_fail = TRUE) H.regenerate_icons() /datum/quirk/selfaware @@ -170,13 +176,13 @@ /datum/quirk/spiritual/on_spawn() var/mob/living/carbon/human/H = quirk_holder - H.equip_to_slot_or_del(new /obj/item/storage/fancy/candle_box(H), SLOT_IN_BACKPACK) - H.equip_to_slot_or_del(new /obj/item/storage/box/matches(H), SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(new /obj/item/storage/fancy/candle_box(H), ITEM_SLOT_BACKPACK) + H.equip_to_slot_or_del(new /obj/item/storage/box/matches(H), ITEM_SLOT_BACKPACK) /datum/quirk/spiritual/on_process() var/comforted = FALSE - for(var/mob/living/L in oview(5, quirk_holder)) - if(L.mind?.isholy && L.stat == CONSCIOUS) + for(var/mob/living/carbon/human/H in oview(5, quirk_holder)) + if(H.mind?.holy_role && H.stat == CONSCIOUS) comforted = TRUE break if(comforted) @@ -196,7 +202,7 @@ var/mob/living/carbon/human/H = quirk_holder var/obj/item/toy/crayon/spraycan/spraycan = new(get_turf(H)) H.put_in_hands(spraycan) - H.equip_to_slot(spraycan, SLOT_IN_BACKPACK) + H.equip_to_slot(spraycan, ITEM_SLOT_BACKPACK) H.regenerate_icons() /datum/quirk/voracious diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index c402c41a76901..f67437bed3661 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -23,13 +23,13 @@ lose_text = "You feel vigorous again." medical_record_text = "Patient requires regular treatment for blood loss due to low production of blood." -/datum/quirk/blooddeficiency/on_process() +/datum/quirk/blooddeficiency/on_process(delta_time) var/mob/living/carbon/human/H = quirk_holder if(NOBLOOD in H.dna.species.species_traits) //can't lose blood if your species doesn't have any return else if (H.blood_volume > (BLOOD_VOLUME_SAFE - 25)) // just barely survivable without treatment - H.blood_volume -= 0.275 + H.blood_volume -= 0.275 * delta_time /datum/quirk/blindness name = "Blind" @@ -45,21 +45,38 @@ /datum/quirk/blindness/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/clothing/glasses/blindfold/white/B = new(get_turf(H)) - if(!H.equip_to_slot_if_possible(B, SLOT_GLASSES, bypass_equip_delay_self = TRUE)) //if you can't put it on the user's eyes, put it in their hands, otherwise put it on their eyes + if(!H.equip_to_slot_if_possible(B, ITEM_SLOT_EYES, bypass_equip_delay_self = TRUE)) //if you can't put it on the user's eyes, put it in their hands, otherwise put it on their eyes H.put_in_hands(B) H.regenerate_icons() /datum/quirk/brainproblems name = "Brain Tumor" - desc = "You have a little friend in your brain that is slowly destroying it. Better bring some mannitol!" + desc = "You have a little friend in your brain that is slowly destroying it. Thankfully, you start with a bottle of mannitol pills." value = -3 gain_text = "You feel smooth." lose_text = "You feel wrinkled again." medical_record_text = "Patient has a tumor in their brain that is slowly driving them to brain death." + var/where = "at your feet" /datum/quirk/brainproblems/on_process() quirk_holder.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2) +/datum/quirk/brainproblems/on_spawn() + var/mob/living/carbon/human/H = quirk_holder + var/obj/item/storage/pill_bottle/mannitol/braintumor/P = new(get_turf(H)) + + var/slot = H.equip_in_one_of_slots(P, list(ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET, ITEM_SLOT_BACKPACK), FALSE) + if(slot) + var/list/slots = list( + ITEM_SLOT_LPOCKET = "in your left pocket", + ITEM_SLOT_RPOCKET = "in your right pocket", + ITEM_SLOT_BACKPACK = "in your backpack" + ) + where = slots[slot] + +/datum/quirk/brainproblems/post_add() + to_chat(quirk_holder, "There is a bottle of mannitol [where]. You're going to need it.") + /datum/quirk/deafness name = "Deaf" desc = "You are incurably deaf." @@ -79,8 +96,8 @@ medical_record_text = "Patient has a severe mood disorder causing them to experience sudden moments of sadness." mood_quirk = TRUE -/datum/quirk/depression/on_process() - if(prob(0.05)) +/datum/quirk/depression/on_process(delta_time) + if(DT_PROB(0.05, delta_time)) SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "depression", /datum/mood_event/depression) /datum/quirk/family_heirloom @@ -103,7 +120,7 @@ if("Clown") heirloom_type = /obj/item/bikehorn/golden if("Mime") - heirloom_type = /obj/item/reagent_containers/food/snacks/baguette + heirloom_type = /obj/item/reagent_containers/food/snacks/baguette/mime if("Janitor") heirloom_type = pick(/obj/item/mop, /obj/item/clothing/suit/caution, /obj/item/reagent_containers/glass/bucket) if("Cook") @@ -117,7 +134,7 @@ if("Chaplain") heirloom_type = pick(/obj/item/toy/windupToolbox, /obj/item/reagent_containers/food/drinks/bottle/holywater) if("Assistant") - heirloom_type = /obj/item/storage/toolbox/mechanical/old/heirloom + heirloom_type = pick(/obj/item/storage/toolbox/mechanical/old/heirloom, /obj/item/clothing/gloves/cut/heirloom) if("Barber") heirloom_type = /obj/item/handmirror if("Stage Magician") @@ -179,9 +196,9 @@ /obj/item/dice/d20) heirloom = new heirloom_type(get_turf(quirk_holder)) var/list/slots = list( - "in your left pocket" = SLOT_L_STORE, - "in your right pocket" = SLOT_R_STORE, - "in your backpack" = SLOT_IN_BACKPACK + "in your left pocket" = ITEM_SLOT_LPOCKET, + "in your right pocket" = ITEM_SLOT_RPOCKET, + "in your backpack" = ITEM_SLOT_BACKPACK ) where = H.equip_in_one_of_slots(heirloom, slots, FALSE) || "at your feet" @@ -230,13 +247,13 @@ /datum/quirk/foreigner/add() var/mob/living/carbon/human/H = quirk_holder - if(ishuman(H) && !isipc(H) && H.job != "Curator") + if(ishuman(H) && H.job != "Curator") H.add_blocked_language(/datum/language/common) H.grant_language(/datum/language/uncommon) /datum/quirk/foreigner/remove() var/mob/living/carbon/human/H = quirk_holder - if(ishuman(H) && !isipc(H) && H.job != "Curator") + if(ishuman(H) && H.job != "Curator") H.remove_blocked_language(/datum/language/common) H.remove_language(/datum/language/uncommon) @@ -290,7 +307,7 @@ var/mob/living/carbon/human/H = quirk_holder var/obj/item/clothing/glasses/regular/glasses = new(get_turf(H)) H.put_in_hands(glasses) - H.equip_to_slot(glasses, SLOT_GLASSES) + H.equip_to_slot(glasses, ITEM_SLOT_EYES) H.regenerate_icons() //this is to remove the inhand icon, which persists even if it's not in their hands /datum/quirk/nyctophobia @@ -303,8 +320,7 @@ if(H.dna.species.id in list("shadow", "nightmare")) return //we're tied with the dark, so we don't get scared of it; don't cleanse outright to avoid cheese var/turf/T = get_turf(quirk_holder) - var/lums = T.get_lumcount() - if(lums <= 0.2) + if(T.get_lumcount() <= 0.2) if(quirk_holder.m_intent == MOVE_INTENT_RUN) to_chat(quirk_holder, "Easy, easy, take it slow... you're in the dark...") quirk_holder.toggle_move_intent() @@ -419,11 +435,11 @@ lose_text = "You feel in tune with the world again." medical_record_text = "Patient suffers from acute Reality Dissociation Syndrome and experiences vivid hallucinations." -/datum/quirk/insanity/on_process() +/datum/quirk/insanity/on_process(delta_time) if(quirk_holder.reagents.has_reagent(/datum/reagent/toxin/mindbreaker, needs_metabolizing = TRUE)) quirk_holder.hallucination = 0 return - if(prob(2)) //we'll all be mad soon enough + if(DT_PROB(2, delta_time)) //we'll all be mad soon enough madness() /datum/quirk/insanity/proc/madness() @@ -444,18 +460,18 @@ medical_record_text = "Patient is usually anxious in social encounters and prefers to avoid them." var/dumb_thing = TRUE -/datum/quirk/social_anxiety/on_process() +/datum/quirk/social_anxiety/on_process(delta_time) var/nearby_people = 0 for(var/mob/living/carbon/human/H in oview(3, quirk_holder)) if(H.client) nearby_people++ var/mob/living/carbon/human/H = quirk_holder - if(prob(2 + nearby_people)) + if(DT_PROB(2 + nearby_people, delta_time)) H.stuttering = max(3, H.stuttering) - else if(prob(min(3, nearby_people)) && !H.silent) + else if(DT_PROB(min(3, nearby_people), delta_time) && !H.silent) to_chat(H, "You retreat into yourself. You really don't feel up to talking.") H.silent = max(10, H.silent) - else if(prob(0.5) && dumb_thing) + else if(DT_PROB(0.5, delta_time) && dumb_thing) to_chat(H, "You think of a dumb thing you said a long time ago and scream internally.") dumb_thing = FALSE //only once per life if(prob(1)) @@ -469,7 +485,7 @@ gain_text = "You suddenly feel the craving for drugs." lose_text = "You feel like you should kick your drug habit." medical_record_text = "Patient has a history of hard drugs." - var/drug_list = list(/datum/reagent/drug/crank, /datum/reagent/drug/krokodil, /datum/reagent/medicine/morphine, /datum/reagent/drug/happiness, /datum/reagent/drug/methamphetamine) //List of possible IDs + var/drug_list = list(/datum/reagent/drug/crank, /datum/reagent/drug/krokodil, /datum/reagent/medicine/morphine, /datum/reagent/drug/happiness, /datum/reagent/drug/methamphetamine, /datum/reagent/drug/ketamine) //List of possible IDs var/datum/reagent/reagent_type //!If this is defined, reagent_id will be unused and the defined reagent type will be instead. var/datum/reagent/reagent_instance //! actual instanced version of the reagent var/where_drug //! Where the drug spawned @@ -500,9 +516,9 @@ if (accessory_type) accessory_instance = new accessory_type(current_turf) var/list/slots = list( - "in your left pocket" = SLOT_L_STORE, - "in your right pocket" = SLOT_R_STORE, - "in your backpack" = SLOT_IN_BACKPACK + "in your left pocket" = ITEM_SLOT_LPOCKET, + "in your right pocket" = ITEM_SLOT_RPOCKET, + "in your backpack" = ITEM_SLOT_BACKPACK ) where_drug = H.equip_in_one_of_slots(drug_instance, slots, FALSE) || "at your feet" if (accessory_instance) @@ -555,7 +571,7 @@ /datum/quirk/junkie/smoker/on_process() . = ..() var/mob/living/carbon/human/H = quirk_holder - var/obj/item/I = H.get_item_by_slot(SLOT_WEAR_MASK) + var/obj/item/I = H.get_item_by_slot(ITEM_SLOT_MASK) if (istype(I, /obj/item/clothing/mask/cigarette)) var/obj/item/storage/fancy/cigarettes/C = drug_container_type if(istype(I, initial(C.spawn_type))) @@ -563,6 +579,65 @@ return SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "wrong_cigs", /datum/mood_event/wrong_brand) +/datum/quirk/alcoholic + name = "Alcoholic" + desc = "You can't stand being sober." + value = -1 + gain_text = "You could really go for a drink right about now." + lose_text = "You feel like you should quit drinking." + medical_record_text = "Patient is an alcohol abuser." + var/where_drink //Where the bottle spawned + var/drink_types = list(/obj/item/reagent_containers/food/drinks/bottle/ale, + /obj/item/reagent_containers/food/drinks/bottle/beer, + /obj/item/reagent_containers/food/drinks/bottle/gin, + /obj/item/reagent_containers/food/drinks/bottle/whiskey, + /obj/item/reagent_containers/food/drinks/bottle/vodka, + /obj/item/reagent_containers/food/drinks/bottle/rum, + /obj/item/reagent_containers/food/drinks/bottle/applejack) + var/need = 0 // How much they crave alcohol at the moment + var/tick_number = 0 // Keeping track of how many ticks have passed between a check + var/obj/item/reagent_containers/food/drinks/bottle/drink_instance + +/datum/quirk/alcoholic/on_spawn() + drink_instance = pick(drink_types) + drink_instance = new drink_instance() + var/list/slots = list("in your backpack" = ITEM_SLOT_BACKPACK) + var/mob/living/carbon/human/H = quirk_holder + where_drink = H.equip_in_one_of_slots(drink_instance, slots, FALSE) || "at your feet" + +/datum/quirk/alcoholic/post_add() + to_chat(quirk_holder, "There is a small bottle of [drink_instance] [where_drink]. You only have a single bottle, might have to find some more...") + +/datum/quirk/alcoholic/on_process() + if(tick_number >= 6) // how many ticks should pass between a check + tick_number = 0 + var/mob/living/carbon/human/H = quirk_holder + if(H.drunkenness > 0) // If they're not drunk, need goes up. else they're satisfied + need = -15 + else + need++ + + switch(need) + if(1 to 10) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "alcoholic", /datum/mood_event/withdrawal_light, "alcohol") + if(prob(5)) + to_chat(H, "You could go for a drink right about now.") + if(10 to 20) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "alcoholic", /datum/mood_event/withdrawal_medium, "alcohol") + if(prob(5)) + to_chat(H, "You feel like you need alcohol. You just can't stand being sober.") + if(20 to 30) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "alcoholic", /datum/mood_event/withdrawal_severe, "alcohol") + if(prob(5)) + to_chat(H, "You have an intense craving for a drink.") + if(30 to INFINITY) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "alcoholic", /datum/mood_event/withdrawal_critical, "Alcohol") + if(prob(5)) + to_chat(H, "You're not feeling good at all! You really need some alcohol.") + else + SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "alcoholic") + tick_number++ + /datum/quirk/unstable name = "Unstable" desc = "Due to past troubles, you are unable to recover your sanity if you lose it. Be very careful managing your mood!" @@ -571,3 +646,20 @@ gain_text = "There's a lot on your mind right now." lose_text = "Your mind finally feels calm." medical_record_text = "Patient's mind is in a vulnerable state, and cannot recover from traumatic events." + +/datum/quirk/phobia + name = "Phobia" + desc = "Because of a traumatic event in your past you have developed a strong phobia." + value = -2 + gain_text = "You start feeling an irrational fear of something." + lose_text = "You are no longer irrationally afraid." + medical_record_text = "Patient suffers from a deeply-rooted phobia." + +/datum/quirk/phobia/add() + var/datum/brain_trauma/mild/phobia/T = new() + var/mob/living/carbon/human/H = quirk_holder + H.gain_trauma(T, TRAUMA_RESILIENCE_ABSOLUTE) + +/datum/quirk/phobia/remove() + var/mob/living/carbon/human/H = quirk_holder + H.cure_trauma_type(/datum/brain_trauma/mild/phobia, TRAUMA_RESILIENCE_ABSOLUTE) diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index f16f2b3741793..beedf80064f51 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -29,7 +29,7 @@ var/datum/species/species = H.dna.species if(initial(species.liked_food) & MEAT) species.liked_food |= MEAT - if(!initial(species.disliked_food) & MEAT) + if(!(initial(species.disliked_food) & MEAT)) species.disliked_food &= ~MEAT /datum/quirk/pineapple_liker @@ -54,7 +54,7 @@ name = "Ananas Aversion" desc = "You find yourself greatly detesting fruits of the ananas genus. Serious, how the hell can anyone say these things are good? And what kind of madman would even dare putting it on a pizza!?" value = 0 - gain_text = "You find yourself pondering what kind of idiot actually enjoys pineapples..." + gain_text = "You find yourself pondering what kind of idiot actually enjoys pineapples." lose_text = "Your feelings towards pineapples seem to return to a lukewarm state." /datum/quirk/pineapple_hater/add() @@ -89,24 +89,6 @@ species.liked_food = initial(species.liked_food) species.disliked_food = initial(species.disliked_food) -/datum/quirk/neat - name = "Neat" - desc = "You really don't like being unhygienic, and will get sad if you are." - mob_trait = TRAIT_NEAT - gain_text = "You feel like you have to stay clean." - lose_text = "You no longer feel the need to always be clean." - mood_quirk = TRUE - -/datum/quirk/neat/on_process() - var/mob/living/carbon/human/H = quirk_holder - switch (H.hygiene) - if(0 to HYGIENE_LEVEL_DIRTY) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "neat", /datum/mood_event/dirty) - if(HYGIENE_LEVEL_DIRTY to HYGIENE_LEVEL_NORMAL) - SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "neat") - if(HYGIENE_LEVEL_NORMAL to HYGIENE_LEVEL_CLEAN) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "neat", /datum/mood_event/neat) - /datum/quirk/monochromatic name = "Monochromacy" desc = "You suffer from full colorblindness, and perceive nearly the entire world in blacks and whites." @@ -118,7 +100,7 @@ /datum/quirk/monochromatic/post_add() if(quirk_holder.mind.assigned_role == "Detective") - to_chat(quirk_holder, "Mmm. Nothing's ever clear on this station. It's all shades of gray...") + to_chat(quirk_holder, "Mmm. Nothing's ever clear on this station. It's all shades of gray.") quirk_holder.playsound_local(quirk_holder, 'sound/ambience/ambidet1.ogg', 50, FALSE) /datum/quirk/monochromatic/remove() diff --git a/code/datums/verbs.dm b/code/datums/verbs.dm deleted file mode 100644 index 8f79ed5eec34b..0000000000000 --- a/code/datums/verbs.dm +++ /dev/null @@ -1,102 +0,0 @@ -/datum/verbs - var/name - var/list/children - var/datum/verbs/parent - var/list/verblist - var/abstract = FALSE - -//returns the master list for verbs of a type -/datum/verbs/proc/GetList() - CRASH("Abstract verblist for [type]") - -//do things for each entry in Generate_list -//return value sets Generate_list[verbpath] -/datum/verbs/proc/HandleVerb(list/entry, procpath/verbpath, ...) - return entry - -/datum/verbs/New() - var/mainlist = GetList() - var/ourentry = mainlist[type] - children = list() - verblist = list() - if (ourentry) - if (!islist(ourentry)) //some of our childern already loaded - qdel(src) - CRASH("Verb double load: [type]") - Add_children(ourentry) - - mainlist[type] = src - - Load_verbs(type, typesof("[type]/verb")) - - var/datum/verbs/parent = mainlist[parent_type] - if (!parent) - mainlist[parent_type] = list(src) - else if (islist(parent)) - parent += src - else - parent.Add_children(list(src)) - -/datum/verbs/proc/Set_parent(datum/verbs/_parent) - parent = _parent - if (abstract) - parent.Add_children(children) - var/list/verblistoftypes = list() - for(var/thing in verblist) - LAZYADD(verblistoftypes[verblist[thing]], thing) - - for(var/verbparenttype in verblistoftypes) - parent.Load_verbs(verbparenttype, verblistoftypes[verbparenttype]) - -/datum/verbs/proc/Add_children(list/kids) - if (abstract && parent) - parent.Add_children(kids) - return - - for(var/thing in kids) - var/datum/verbs/item = thing - item.Set_parent(src) - if (!item.abstract) - children += item - -/datum/verbs/proc/Load_verbs(verb_parent_type, list/verbs) - if (abstract && parent) - parent.Load_verbs(verb_parent_type, verbs) - return - - for (var/verbpath in verbs) - verblist[verbpath] = verb_parent_type - -/datum/verbs/proc/Generate_list(...) - . = list() - if (length(children)) - for (var/thing in children) - var/datum/verbs/child = thing - var/list/childlist = child.Generate_list(arglist(args)) - if (childlist) - var/childname = "[child]" - if (childname == "[child.type]") - var/list/tree = splittext(childname, "/") - childname = tree[tree.len] - .[child.type] = "parent=[rustg_url_encode(type)];name=[childname]" - . += childlist - - for (var/thing in verblist) - var/procpath/verbpath = thing - if (!verbpath) - stack_trace("Bad VERB in [type] verblist: [english_list(verblist)]") - var/list/entry = list() - entry["parent"] = "[type]" - entry["name"] = verbpath.desc - if (verbpath.name[1] == "@") - entry["command"] = copytext(verbpath.name, length(verbpath.name[1]) + 1) - else - entry["command"] = replacetext(verbpath.name, " ", "-") - - .[verbpath] = HandleVerb(arglist(list(entry, verbpath) + args)) - -/world/proc/LoadVerbs(verb_type) - if(!ispath(verb_type, /datum/verbs) || verb_type == /datum/verbs) - CRASH("Invalid verb_type: [verb_type]") - for (var/typepath in subtypesof(verb_type)) - new typepath() diff --git a/code/datums/view.dm b/code/datums/view.dm index 7d425c9ad8505..ea695b50dee55 100644 --- a/code/datums/view.dm +++ b/code/datums/view.dm @@ -34,9 +34,11 @@ /datum/viewData/proc/isZooming() return (width || height) -/datum/viewData/proc/resetToDefault() +/datum/viewData/proc/resetToDefault(var/new_default) width = 0 height = 0 + if(new_default != null) + default = new_default apply() /datum/viewData/proc/add(toAdd) diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index d0fff8da9fe3d..6ab9cbadcee3c 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -47,7 +47,7 @@ /datum/weather/rad_storm/end() if(..()) return - priority_announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert") + priority_announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) status_alarm(FALSE) /datum/weather/rad_storm/proc/status_alarm(active) //Makes the status displays show the radiation warning for those who missed the announcement. diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 511847484ccf7..8c1f04e869a82 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -90,9 +90,11 @@ /datum/wires/proc/shuffle_wires() colors.Cut() randomize() + ui_update() /datum/wires/proc/repair() cut_wires.Cut() + ui_update() /datum/wires/proc/get_wire(color) return colors[color] @@ -135,29 +137,36 @@ else cut_wires += wire on_cut(wire, mend = FALSE) + ui_update() /datum/wires/proc/cut_color(color) cut(get_wire(color)) + ui_update() /datum/wires/proc/cut_random() cut(wires[rand(1, wires.len)]) + ui_update() /datum/wires/proc/cut_all() for(var/wire in wires) cut(wire) + ui_update() /datum/wires/proc/pulse(wire, user) if(is_cut(wire)) return on_pulse(wire, user) + ui_update() /datum/wires/proc/pulse_color(color, mob/living/user) pulse(get_wire(color), user) + ui_update() /datum/wires/proc/pulse_assembly(obj/item/assembly/S) for(var/color in assemblies) if(S == assemblies[color]) pulse_color(color) + ui_update() return TRUE /datum/wires/proc/attach_assembly(color, obj/item/assembly/S) @@ -165,6 +174,7 @@ assemblies[color] = S S.forceMove(holder) S.connected = src + ui_update() return S /datum/wires/proc/detach_assembly(color) @@ -173,6 +183,7 @@ assemblies -= color S.connected = null S.forceMove(holder.drop_location()) + ui_update() return S /datum/wires/proc/emp_pulse() @@ -185,6 +196,7 @@ remaining_pulses-- if(!remaining_pulses) break + ui_update() // Overridable Procs /datum/wires/proc/interactable(mob/user) @@ -217,6 +229,7 @@ return ..() return UI_CLOSE + /datum/wires/ui_state(mob/user) return GLOB.physical_state diff --git a/code/datums/wires/airalarm.dm b/code/datums/wires/airalarm.dm index 7acfdf76bc203..d11cf41bd8ea5 100644 --- a/code/datums/wires/airalarm.dm +++ b/code/datums/wires/airalarm.dm @@ -54,7 +54,7 @@ A.apply_mode(usr) if(WIRE_ALARM) // Clear alarms. var/area/AA = get_area(A) - if(AA.atmosalert(0, holder)) + if(AA.atmosalert(FALSE, holder)) A.post_alert(0) A.update_icon() @@ -76,6 +76,6 @@ A.apply_mode(usr) if(WIRE_ALARM) // Post alarm. var/area/AA = get_area(A) - if(AA.atmosalert(2, holder)) + if(AA.atmosalert(TRUE, holder)) A.post_alert(2) A.update_icon() diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index f06bba6486714..eafdef8eff45f 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -69,12 +69,7 @@ A.aiControlDisabled = 1 else if(A.aiControlDisabled == -1) A.aiControlDisabled = 2 - sleep(10) - if(A) - if(A.aiControlDisabled == 1) - A.aiControlDisabled = 0 - else if(A.aiControlDisabled == 2) - A.aiControlDisabled = -1 + addtimer(CALLBACK(A, /obj/machinery/door/airlock.proc/reset_ai_wire), 1 SECONDS) if(WIRE_SHOCK) // Pulse to shock the door for 10 ticks. if(!A.secondsElectrified) A.set_electrified(MACHINE_DEFAULT_ELECTRIFY_TIME, usr) @@ -87,6 +82,16 @@ if(WIRE_LIGHT) A.lights = !A.lights A.update_icon() + ui_update() + A.ui_update() + +/obj/machinery/door/airlock/proc/reset_ai_wire() + if(aiControlDisabled == 1) + aiControlDisabled = 0 + else if(aiControlDisabled == 2) + aiControlDisabled = -1 + wires.ui_update() + ui_update() /datum/wires/airlock/on_cut(wire, mend) var/obj/machinery/door/airlock/A = holder @@ -138,3 +143,5 @@ if(WIRE_ZAP1, WIRE_ZAP2) // Ouch. if(isliving(usr)) A.shock(usr, 50) + ui_update() + A.ui_update() diff --git a/code/datums/wires/apc.dm b/code/datums/wires/apc.dm index dc126f612e120..b4c9d22c8c207 100644 --- a/code/datums/wires/apc.dm +++ b/code/datums/wires/apc.dm @@ -37,6 +37,7 @@ if(!A.aidisabled) A.aidisabled = TRUE addtimer(CALLBACK(A, /obj/machinery/power/apc.proc/reset, wire), 10) + ui_update() /datum/wires/apc/on_cut(index, mend) var/obj/machinery/power/apc/A = holder @@ -52,4 +53,5 @@ if(mend) A.aidisabled = FALSE else - A.aidisabled = TRUE \ No newline at end of file + A.aidisabled = TRUE + ui_update() diff --git a/code/datums/wires/autolathe.dm b/code/datums/wires/autolathe.dm index 8b113adad1f25..1e5cd1017d11b 100644 --- a/code/datums/wires/autolathe.dm +++ b/code/datums/wires/autolathe.dm @@ -1,5 +1,5 @@ /datum/wires/autolathe - holder_type = /obj/machinery/autolathe + holder_type = /obj/machinery/modular_fabricator/autolathe proper_name = "Autolathe" /datum/wires/autolathe/New(atom/holder) @@ -11,34 +11,35 @@ ..() /datum/wires/autolathe/interactable(mob/user) - var/obj/machinery/autolathe/A = holder + var/obj/machinery/modular_fabricator/autolathe/A = holder if(A.panel_open) return TRUE /datum/wires/autolathe/get_status() - var/obj/machinery/autolathe/A = holder + var/obj/machinery/modular_fabricator/autolathe/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/autolathe/on_pulse(wire) - var/obj/machinery/autolathe/A = holder + var/obj/machinery/modular_fabricator/autolathe/A = holder switch(wire) if(WIRE_HACK) A.adjust_hacked(!A.hacked) - addtimer(CALLBACK(A, /obj/machinery/autolathe.proc/reset, wire), 60) + addtimer(CALLBACK(A, /obj/machinery/modular_fabricator/autolathe.proc/reset, wire), 60) if(WIRE_SHOCK) A.shocked = !A.shocked - addtimer(CALLBACK(A, /obj/machinery/autolathe.proc/reset, wire), 60) + addtimer(CALLBACK(A, /obj/machinery/modular_fabricator/autolathe.proc/reset, wire), 60) if(WIRE_DISABLE) A.disabled = !A.disabled - addtimer(CALLBACK(A, /obj/machinery/autolathe.proc/reset, wire), 60) + addtimer(CALLBACK(A, /obj/machinery/modular_fabricator/autolathe.proc/reset, wire), 60) if(WIRE_ACTIVATE) A.begin_process() + ui_update() /datum/wires/autolathe/on_cut(wire, mend) - var/obj/machinery/autolathe/A = holder + var/obj/machinery/modular_fabricator/autolathe/A = holder switch(wire) if(WIRE_HACK) A.adjust_hacked(!mend) @@ -48,3 +49,4 @@ A.disabled = !mend if(WIRE_ZAP) A.shock(usr, 50) + ui_update() diff --git a/code/datums/wires/emitter.dm b/code/datums/wires/emitter.dm index d0e1352c0efa4..a157230f07f63 100644 --- a/code/datums/wires/emitter.dm +++ b/code/datums/wires/emitter.dm @@ -14,4 +14,3 @@ if(WIRE_HACK) E.mode = !E.mode E.set_projectile() - ..() diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm index 8616478010510..518d3e6c58712 100644 --- a/code/datums/wires/explosive.dm +++ b/code/datums/wires/explosive.dm @@ -43,7 +43,7 @@ message_admins("\An [assembly] has pulsed a grenade, which was installed by [fingerprint].") log_game("\An [assembly] has pulsed a grenade, which was installed by [fingerprint].") var/mob/M = get_mob_by_ckey(fingerprint) - var/turf/T = get_turf(M) + var/turf/T = get_turf(M) G.log_grenade(M, T) G.prime() @@ -99,6 +99,7 @@ switch(wire) if(WIRE_DISARM) // Pulse to toggle P.bomb_defused = !P.bomb_defused + ui_update() else // Boom explode() @@ -108,6 +109,7 @@ if(WIRE_DISARM) // Disarm and untrap the box. if(!mend) P.bomb_defused = TRUE + ui_update() else if(!mend && !P.bomb_defused) explode() @@ -116,10 +118,9 @@ var/obj/item/pizzabox/P = holder P.bomb.detonate() - /datum/wires/explosive/gibtonite - holder_type = /obj/item/twohanded/required/gibtonite + holder_type = /obj/item/gibtonite /datum/wires/explosive/gibtonite/explode() - var/obj/item/twohanded/required/gibtonite/P = holder + var/obj/item/gibtonite/P = holder P.GibtoniteReaction(null, 2) diff --git a/code/datums/wires/r_n_d.dm b/code/datums/wires/r_n_d.dm index ea61c1779ef4e..7aaad875faa59 100644 --- a/code/datums/wires/r_n_d.dm +++ b/code/datums/wires/r_n_d.dm @@ -30,6 +30,7 @@ R.hacked = !R.hacked if(WIRE_DISABLE) R.disabled = !R.disabled + ui_update() /datum/wires/rnd/on_cut(wire, mend) var/obj/machinery/rnd/R = holder switch(wire) @@ -37,3 +38,4 @@ R.hacked = !mend if(WIRE_DISABLE) R.disabled = !mend + ui_update() diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm index 46fb8200ea63b..5ad295d80a271 100644 --- a/code/datums/wires/robot.dm +++ b/code/datums/wires/robot.dm @@ -38,6 +38,7 @@ new_ai = select_active_ai(R) R.notify_ai(DISCONNECT) if(new_ai && (new_ai != R.connected_ai)) + log_combat(usr, R, "synced cyborg [R.connected_ai ? "from [ADMIN_LOOKUP(R.connected_ai)]": "false"] to [ADMIN_LOOKUP(new_ai)]") R.connected_ai = new_ai if(R.shell) R.undeploy() //If this borg is an AI shell, disconnect the controlling AI and assign ti to a new AI @@ -46,18 +47,24 @@ R.notify_ai(TRUE) if(WIRE_CAMERA) // Pulse to disable the camera. if(!QDELETED(R.builtInCamera) && !R.scrambledcodes) - R.builtInCamera.toggle_cam(usr, 0) + R.builtInCamera.toggle_cam(usr, FALSE) R.visible_message("[R]'s camera lens focuses loudly.", "Your camera lens focuses loudly.") + log_combat(usr, R, "toggled cyborg camera to [R.builtInCamera.status ? "on" : "off"] via pulse") if(WIRE_LAWSYNC) // Forces a law update if possible. if(R.lawupdate) R.visible_message("[R] gently chimes.", "LawSync protocol engaged.") + log_combat(usr, R, "forcibly synced cyborg laws via pulse") + // TODO, log the laws they gained here R.lawsync() R.show_laws() if(WIRE_LOCKDOWN) R.SetLockdown(!R.lockcharge) // Toggle + log_combat(usr, R, "[!R.lockcharge ? "locked down" : "released"] via pulse") + if(WIRE_RESET_MODULE) if(R.has_module()) R.visible_message("[R]'s module servos twitch.", "Your module display flickers.") + ui_update() /datum/wires/robot/on_cut(wire, mend) var/mob/living/silicon/robot/R = holder @@ -65,6 +72,7 @@ if(WIRE_AI) // Cut the AI wire to reset AI control. if(!mend) R.notify_ai(DISCONNECT) + log_combat(usr, R, "cut AI wire on cyborg[R.connected_ai ? " and disconnected from [ADMIN_LOOKUP(R.connected_ai)]": ""]") if(R.shell) R.undeploy() R.connected_ai = null @@ -72,15 +80,21 @@ if(mend) if(!R.emagged) R.lawupdate = TRUE + log_combat(usr, R, "enabled lawsync via wire") else if(!R.deployed) //AI shells must always have the same laws as the AI R.lawupdate = FALSE + log_combat(usr, R, "disabled lawsync via wire") if (WIRE_CAMERA) // Disable the camera. if(!QDELETED(R.builtInCamera) && !R.scrambledcodes) R.builtInCamera.status = mend - R.builtInCamera.toggle_cam(usr, 0) + R.builtInCamera.toggle_cam(usr, FALSE) R.visible_message("[R]'s camera lens focuses loudly.", "Your camera lens focuses loudly.") + log_combat(usr, R, "[mend ? "enabled" : "disabled"] cyborg camera via wire") if(WIRE_LOCKDOWN) // Simple lockdown. R.SetLockdown(!mend) + log_combat(usr, R, "[!R.lockcharge ? "locked down" : "released"] via wire") if(WIRE_RESET_MODULE) if(R.has_module() && !mend) R.ResetModule() + log_combat(usr, R, "reset the cyborg module via wire") + ui_update() diff --git a/code/datums/wires/suit_storage_unit.dm b/code/datums/wires/suit_storage_unit.dm index eb7781203b2b5..7b165622effec 100644 --- a/code/datums/wires/suit_storage_unit.dm +++ b/code/datums/wires/suit_storage_unit.dm @@ -32,6 +32,7 @@ if(WIRE_ZAP) if(usr) SSU.shock(usr) + ui_update() /datum/wires/suit_storage_unit/on_cut(wire, mend) var/obj/machinery/suit_storage_unit/SSU = holder @@ -43,3 +44,4 @@ if(WIRE_ZAP) if(usr) SSU.shock(usr) + ui_update() diff --git a/code/datums/wires/vending.dm b/code/datums/wires/vending.dm index 078c940b041fd..c703b88105ef8 100644 --- a/code/datums/wires/vending.dm +++ b/code/datums/wires/vending.dm @@ -40,6 +40,7 @@ V.scan_id = !V.scan_id if(WIRE_SPEAKER) V.shut_up = !V.shut_up + ui_update() /datum/wires/vending/on_cut(wire, mend) var/obj/machinery/vending/V = holder @@ -57,3 +58,4 @@ V.scan_id = mend if(WIRE_SPEAKER) V.shut_up = mend + ui_update() diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index 9580dbb63a6b8..5b86aac25c5aa 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -1,198 +1,295 @@ -// SETUP - -/proc/TopicHandlers() - . = list() - var/list/all_handlers = subtypesof(/datum/world_topic) - for(var/I in all_handlers) - var/datum/world_topic/WT = I - var/keyword = initial(WT.keyword) - if(!keyword) - warning("[WT] has no keyword! Ignoring...") - continue - var/existing_path = .[keyword] - if(existing_path) - warning("[existing_path] and [WT] have the same keyword! Ignoring [WT]...") - else if(keyword == "key") - warning("[WT] has keyword 'key'! Ignoring...") - else - .[keyword] = WT +// VERSION + +// Update topic version whenever changes are made +// The Version Number follows SemVer http://semver.org/ +#define TOPIC_VERSION_MAJOR 2 // Major Version Number --> Increment when implementing breaking changes +#define TOPIC_VERSION_MINOR 0 // Minor Version Number --> Increment when adding features +#define TOPIC_VERSION_PATCH 0 // Patchlevel --> Increment when fixing bugs // DATUM /datum/world_topic - var/keyword - var/log = TRUE - var/key_valid - var/require_comms_key = FALSE - -/datum/world_topic/proc/TryRun(list/input, addr) - key_valid = config && (CONFIG_GET(string/comms_key) == input["key"]) - if(require_comms_key && !key_valid) - return "Bad Key" - input -= "key" - . = Run(input, addr) - if(islist(.)) - . = list2params(.) - -/datum/world_topic/proc/Run(list/input, addr) - CRASH("Run() not implemented for [type]!") + var/key // query key + var/anonymous = FALSE // can be used with anonymous authentication + var/list/required_params = list() + var/statuscode = null + var/response = null + var/data = null + +/datum/world_topic/proc/CheckParams(list/params) + var/list/missing_params = list() + var/errorcount = 0 + + for(var/param in required_params) + if(!params[param]) + errorcount++ + missing_params += param + + if(errorcount) + statuscode = 400 + response = "Bad Request - Missing parameters" + data = missing_params + return errorcount + +/datum/world_topic/proc/Run(list/input) + // Always returns true; actual details in statuscode, response and data variables + return TRUE + +// API INFO TOPICS + +/datum/world_topic/api_get_version + key = "api_get_version" + anonymous = TRUE + +/datum/world_topic/api_get_version/Run(list/input) + . = ..() + var/list/version = list() + var/versionstring = null + + version["major"] = TOPIC_VERSION_MAJOR + version["minor"] = TOPIC_VERSION_MINOR + version["patch"] = TOPIC_VERSION_PATCH + + versionstring = "[version["major"]].[version["minor"]].[version["patch"]]" + + statuscode = 200 + response = versionstring + data = version + +/datum/world_topic/api_get_authed_functions + key = "api_get_authed_functions" + anonymous = TRUE + +/datum/world_topic/api_get_authed_functions/Run(list/input) + . = ..() + var/list/functions = GLOB.topic_tokens[input["auth"]] + if(functions) + statuscode = 200 + response = "Authorized functions retrieved" + data = functions + else + statuscode = 401 + response = "Unauthorized - No functions found" + data = null + +/datum/world_topic/api_do_handshake + key = "api_do_handshake" + anonymous = TRUE + +/datum/world_topic/api_do_handshake/Run(list/input) + . = ..() + var/list/functions = GLOB.topic_tokens[input["auth"]] + var/list/servers = CONFIG_GET(keyed_list/cross_server) + var/fmt_addr = "byond://[input["addr"]]" + var/token = servers[fmt_addr] + if(!token || !functions) // Handshake requires both servers to have each other's deets + statuscode = 401 + response = "Unauthorized - Handshake Failed" + data = null + else + statuscode = 200 + response = "Handshake Successful" + data = list("token" = token, "functions" = functions) + if(!GLOB.topic_servers[fmt_addr]) // part of the ad-hoc connection system + SStopic.handshake_server(fmt_addr, token) // TOPICS /datum/world_topic/ping - keyword = "ping" - log = FALSE + key = "ping" + anonymous = TRUE -/datum/world_topic/ping/Run(list/input, addr) - . = 0 - for (var/client/C in GLOB.clients) - ++. +/datum/world_topic/ping/Run(list/input) + . = ..() + statuscode = 200 + response = "Pong!" + data = length(GLOB.clients) /datum/world_topic/playing - keyword = "playing" - log = FALSE + key = "playing" + anonymous = TRUE -/datum/world_topic/playing/Run(list/input, addr) - return GLOB.player_list.len +/datum/world_topic/playing/Run(list/input) + . = ..() + statuscode = 200 + response = "Player count retrieved" + data = length(GLOB.player_list) /datum/world_topic/pr_announce - keyword = "announce" - require_comms_key = TRUE + key = "announce" + required_params = list("id", "announce") var/static/list/PRcounts = list() //PR id -> number of times announced this round -/datum/world_topic/pr_announce/Run(list/input, addr) - var/list/payload = json_decode(input["payload"]) - var/id = "[payload["pull_request"]["id"]]" - if(!PRcounts[id]) - PRcounts[id] = 1 +/datum/world_topic/pr_announce/Run(list/input) + . = ..() + if(!PRcounts[input["id"]]) + PRcounts[input["id"]] = 1 else - ++PRcounts[id] - if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND) + PRcounts[input["id"]]++ + if(PRcounts[input["id"]] > PR_ANNOUNCEMENTS_PER_ROUND) + statuscode = 429 + response = "Rate Limited - PR Spam blocked" return - var/final_composed = "PR: [input[keyword]]" + var/final_composed = "PR: [input["announce"]]" for(var/client/C in GLOB.clients) C.AnnouncePR(final_composed) + statuscode = 200 + response = "PR Announced" /datum/world_topic/ahelp_relay - keyword = "Ahelp" - require_comms_key = TRUE + key = "ahelp" + required_params = list("source", "message", "message_sender") -/datum/world_topic/ahelp_relay/Run(list/input, addr) - relay_msg_admins("HELP: [input["source"]] [input["message_sender"]]: [input["message"]]") +/datum/world_topic/ahelp_relay/Run(list/input) + . = ..() + relay_msg_admins("HELP: [input["source"]]: [input["message_sender"]]: [input["message"]]") + statuscode = 200 + response = "Ahelp relayed" /datum/world_topic/comms_console - keyword = "Comms_Console" - require_comms_key = TRUE + key = "comms_console" + required_params = list("message", "message_sender") + +/datum/world_topic/comms_console/Run(list/input) + . = ..() + if(CHAT_FILTER_CHECK(input["message"])) // prevents any.. diplomatic incidents + minor_announce("In the interest of station productivity and mental hygiene, a message from [input["message_sender"]] was intercepted by the CCC and determined to be unfit for crew-level access.", "CentCom Communications Commission") + message_admins("Incomming cross-comms message from [input["message_sender"]] blocked: [input["message"]]") + statuscode = 451 // "Unavailable for legal reasons" ahaha; i.e. censored + response = "Censored - Message blocked by chat filter" + return -/datum/world_topic/comms_console/Run(list/input, addr) minor_announce(input["message"], "Incoming message from [input["message_sender"]]") for(var/obj/machinery/computer/communications/CM in GLOB.machines) CM.overrideCooldown() + statuscode = 200 + response = "Message received" /datum/world_topic/news_report - keyword = "News_Report" - require_comms_key = TRUE + key = "news_report" + required_params = list("message", "message_sender") -/datum/world_topic/news_report/Run(list/input, addr) +/datum/world_topic/news_report/Run(list/input) + . = ..() minor_announce(input["message"], "Breaking Update From [input["message_sender"]]") - -/datum/world_topic/adminmsg - keyword = "adminmsg" - require_comms_key = TRUE - -/datum/world_topic/adminmsg/Run(list/input, addr) - return IrcPm(input[keyword], input["msg"], input["sender"]) + statuscode = 200 + response = "Message received" /datum/world_topic/namecheck - keyword = "namecheck" - require_comms_key = TRUE + key = "namecheck" + required_params = list("target") -/datum/world_topic/namecheck/Run(list/input, addr) - //Oh this is a hack, someone refactor the functionality out of the chat command PLS - var/datum/tgs_chat_command/namecheck/NC = new - var/datum/tgs_chat_user/user = new - user.friendly_name = input["sender"] - user.mention = user.friendly_name - return NC.Run(user, input["namecheck"]) +/datum/world_topic/namecheck/Run(list/input) + . = ..() + statuscode = 200 + response = "Names fetched" + data = keywords_lookup(input["target"], TRUE) /datum/world_topic/adminwho - keyword = "adminwho" - require_comms_key = TRUE - -/datum/world_topic/adminwho/Run(list/input, addr) - return ircadminwho() + key = "adminwho" + +/datum/world_topic/adminwho/Run(list/input) + . = ..() + var/list/admins = list() + for(var/client/admin in GLOB.admins) + admins[++admins.len] = list("ckey" = admin.ckey, + "key" = admin.key, + "rank" = admin.holder.rank.name, + "stealth" = admin.holder.fakekey ? TRUE : FALSE, + "afk" = admin.is_afk()) + statuscode = 200 + response = "Admin list fetched" + data = admins + +/datum/world_topic/playerlist + key = "playerlist" + anonymous = TRUE + +/datum/world_topic/playerlist/Run(list/input) + . = ..() + data = list() + for(var/client/C as() in GLOB.clients) + data += C.ckey + statuscode = 200 + response = "Player list fetched" /datum/world_topic/status - keyword = "status" - -/datum/world_topic/status/Run(list/input, addr) - . = list() - .["version"] = GLOB.game_version - .["mode"] = GLOB.master_mode - .["respawn"] = config ? !CONFIG_GET(flag/norespawn) : FALSE - .["enter"] = GLOB.enter_allowed - .["vote"] = CONFIG_GET(flag/allow_vote_mode) - .["ai"] = CONFIG_GET(flag/allow_ai) - .["host"] = world.host ? world.host : null - .["round_id"] = GLOB.round_id - .["players"] = GLOB.clients.len - .["revision"] = GLOB.revdata.commit - .["revision_date"] = GLOB.revdata.date - .["hub"] = GLOB.hub_visibility - - var/client_num = 0 - for(var/client/C in GLOB.clients) - .["client[client_num]"] = C.key - client_num++ + key = "status" + anonymous = TRUE + +/datum/world_topic/status/Run(list/input) + . = ..() + data = list() + data["version"] = GLOB.game_version + data["mode"] = GLOB.master_mode + data["respawn"] = config ? !CONFIG_GET(flag/norespawn) : FALSE + data["enter"] = GLOB.enter_allowed + data["vote"] = CONFIG_GET(flag/allow_vote_mode) + data["ai"] = CONFIG_GET(flag/allow_ai) + data["host"] = world.host ? world.host : null + data["round_id"] = text2num(GLOB.round_id) // I don't know who's fault it is that round id is loaded as a string but screw you + data["players"] = GLOB.clients.len + data["revision"] = GLOB.revdata.commit + data["revision_date"] = GLOB.revdata.date + data["hub"] = GLOB.hub_visibility var/list/adm = get_admin_counts() var/list/presentmins = adm["present"] var/list/afkmins = adm["afk"] - .["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho - .["gamestate"] = SSticker.current_state - - .["map_name"] = SSmapping.config?.map_name || "Loading..." + data["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho + data["gamestate"] = SSticker.current_state - if(key_valid) - .["active_players"] = get_active_player_count() - if(SSticker.HasRoundStarted()) - .["real_mode"] = SSticker.mode.name - // Key-authed callers may know the truth behind the "secret" + data["map_name"] = SSmapping.config?.map_name || "Loading..." - .["security_level"] = get_security_level() - .["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0 + data["security_level"] = get_security_level() + data["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0 // Amount of world's ticks in seconds, useful for calculating round duration //Time dilation stats. - .["time_dilation_current"] = SStime_track.time_dilation_current - .["time_dilation_avg"] = SStime_track.time_dilation_avg - .["time_dilation_avg_slow"] = SStime_track.time_dilation_avg_slow - .["time_dilation_avg_fast"] = SStime_track.time_dilation_avg_fast + data["time_dilation_current"] = SStime_track.time_dilation_current + data["time_dilation_avg"] = SStime_track.time_dilation_avg + data["time_dilation_avg_slow"] = SStime_track.time_dilation_avg_slow + data["time_dilation_avg_fast"] = SStime_track.time_dilation_avg_fast //pop cap stats - .["soft_popcap"] = CONFIG_GET(number/soft_popcap) || 0 - .["hard_popcap"] = CONFIG_GET(number/hard_popcap) || 0 - .["extreme_popcap"] = CONFIG_GET(number/extreme_popcap) || 0 - .["popcap"] = max(CONFIG_GET(number/soft_popcap), CONFIG_GET(number/hard_popcap), CONFIG_GET(number/extreme_popcap)) //generalized field for this concept for use across ss13 codebases + data["soft_popcap"] = CONFIG_GET(number/soft_popcap) || 0 + data["hard_popcap"] = CONFIG_GET(number/hard_popcap) || 0 + data["extreme_popcap"] = CONFIG_GET(number/extreme_popcap) || 0 + data["popcap"] = max(CONFIG_GET(number/soft_popcap), CONFIG_GET(number/hard_popcap), CONFIG_GET(number/extreme_popcap)) //generalized field for this concept for use across ss13 codebases if(SSshuttle?.emergency) - .["shuttle_mode"] = SSshuttle.emergency.mode + data["shuttle_mode"] = SSshuttle.emergency.mode // Shuttle status, see /__DEFINES/stat.dm - .["shuttle_timer"] = SSshuttle.emergency.timeLeft() + data["shuttle_timer"] = SSshuttle.emergency.timeLeft() // Shuttle timer, in seconds + statuscode = 200 + response = "Status retrieved" + +/datum/world_topic/status/authed + key = "status_authed" + anonymous = FALSE + +/datum/world_topic/status/authed/Run(list/input) + . = ..() + // Add on a little extra data for our "special" patrons + data["active_players"] = get_active_player_count() + if(SSticker.HasRoundStarted()) + data["real_mode"] = SSticker.mode.name /datum/world_topic/identify_uuid - keyword = "identify_uuid" - require_comms_key = TRUE - log = FALSE + key = "identify_uuid" + required_params = list("uuid") -/datum/world_topic/identify_uuid/Run(list/input, addr) +/datum/world_topic/identify_uuid/Run(list/input) var/uuid = input["uuid"] - . = list() + data = list() if(!SSdbcore.Connect()) - return null + statuscode = 500 + response = "Failed to reach database" + data = null + return var/datum/DBQuery/query_ckey_lookup = SSdbcore.NewQuery( "SELECT ckey FROM [format_table_name("player")] WHERE uuid = :uuid", @@ -200,12 +297,105 @@ ) if(!query_ckey_lookup.Execute()) qdel(query_ckey_lookup) - return null + statuscode = 500 + response = "Database query failed" + return - .["identified_ckey"] = null + statuscode = 200 + response = "UUID Checked against database" + data["identified_ckey"] = null if(query_ckey_lookup.NextRow()) - .["identified_ckey"] = query_ckey_lookup.item[1] + data["identified_ckey"] = query_ckey_lookup.item[1] qdel(query_ckey_lookup) - return . +/datum/world_topic/d_ooc_send + key = "discord_send" + required_params = list("message", "message_sender") + +/datum/world_topic/d_ooc_send/Run(list/input) + . = ..() + var/msg = input["message"] + var/unm = input["message_sender"] + msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) + unm = copytext(sanitize(unm), 1, MAX_MESSAGE_LEN) + msg = emoji_parse(msg) + log_ooc("DISCORD: [unm]: [msg]") + for(var/client/C in GLOB.clients) + if(C.prefs.chat_toggles & CHAT_OOC) + if(!("discord-[unm]" in C.prefs.ignoring)) + to_chat(C, "OOC: [unm]: [msg]") + statuscode = 200 + response = "Message forwarded to OOC" + +/datum/world_topic/get_metacoins + key = "get_metacoins" + required_params = list("ckey") + +/datum/world_topic/get_metacoins/Run(list/input) + . = ..() + + var/ckey = input["ckey"] + + if(!ckey || !SSdbcore.Connect()) + statuscode = 500 + response = "Database query failed" + data = null + return + + var/datum/DBQuery/query_get_metacoins = SSdbcore.NewQuery( + "SELECT metacoins FROM [format_table_name("player")] WHERE ckey = :ckey", + list("ckey" = ckey) + ) + var/mc_count = null + if(query_get_metacoins.warn_execute()) + if(query_get_metacoins.NextRow()) + mc_count = query_get_metacoins.item[1] + else + statuscode = 500 + response = "Database query failed" + data = null + return + + qdel(query_get_metacoins) + + statuscode = 200 + response = "Metacoin count retrieved" + data = mc_count ? text2num(mc_count) : 0 + +/datum/world_topic/adjust_metacoins + key = "adjust_metacoins" + required_params = list("ckey", "amount", "id") + +/datum/world_topic/adjust_metacoins/Run(list/input) + . = ..() + + var/ckey = input["ckey"] + var/amount = input["amount"] + var/adjuster_ckey = input["id"] + + if(!SSdbcore.Connect()) + statuscode = 500 + response = "Database query failed" + data = null + return + + var/datum/DBQuery/query_metacoins = SSdbcore.NewQuery( + "UPDATE [format_table_name("player")] SET metacoins = metacoins + :amount WHERE ckey = :ckey", + list("amount" = amount, "ckey" = ckey) + ) + if(!query_metacoins.warn_execute()) + statuscode = 500 + response = "Database query failed" + data = null + return + + log_game("[ckey]'s metacoins were adjusted ([amount > 0 ? "+[amount]" : "[amount]"]) via Topic() call by [adjuster_ckey ? "[adjuster_ckey]" : "Unknown"]") + + qdel(query_metacoins) + + statuscode = 200 + response = "Metacoin count updated" +#undef TOPIC_VERSION_MAJOR +#undef TOPIC_VERSION_MINOR +#undef TOPIC_VERSION_PATCH diff --git a/code/game/alternate_appearance.dm b/code/game/alternate_appearance.dm index 04f52f148c343..89bf6c3a84931 100644 --- a/code/game/alternate_appearance.dm +++ b/code/game/alternate_appearance.dm @@ -178,7 +178,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) return TRUE return FALSE -datum/atom_hud/alternate_appearance/basic/onePerson +/datum/atom_hud/alternate_appearance/basic/onePerson var/mob/seer /datum/atom_hud/alternate_appearance/basic/onePerson/mobShouldSee(mob/M) @@ -190,3 +190,15 @@ datum/atom_hud/alternate_appearance/basic/onePerson ..(key, I, FALSE) seer = M add_hud_to(seer) + +/datum/atom_hud/alternate_appearance/basic/heretics + add_ghost_version = FALSE //just in case, to prevent infinite loops + +/datum/atom_hud/alternate_appearance/basic/heretics/New() + ..() + for(var/mob in GLOB.player_list) + if(mobShouldSee(mob)) + add_hud_to(mob) + +/datum/atom_hud/alternate_appearance/basic/heretics/mobShouldSee(mob/M) + return IS_HERETIC(M) || IS_HERETIC_MONSTER(M) \ No newline at end of file diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index 8bfaed5ed8950..975b651754d71 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -7,7 +7,8 @@ icon = 'ICON FILENAME' (defaults to 'icons/turf/areas.dmi') icon_state = "NAME OF ICON" (defaults to "unknown" (blank)) requires_power = FALSE (defaults to true) - ambient_effects = list() (defaults to GENERIC from sound.dm. override it as "ambient_effects = list('sound/ambience/signal.ogg')" or using another define. + ambience_index = AMBIENCE_GENERIC (picks the ambience from an assoc list in ambience.dm) + ambientsounds = list() (defaults to ambience_index's assoc on Initialize(). override it as "ambientsounds = list('sound/ambience/signal.ogg')" or by changing ambience_index) NOTE: there are two lists of areas in the end of this file: centcom and station itself. Please maintain these lists valid. --rastaf0 @@ -28,11 +29,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station power_light = FALSE power_equip = FALSE power_environ = FALSE - valid_territory = FALSE + area_flags = UNIQUE_AREA outdoors = TRUE - ambient_music = SPACE - blob_allowed = FALSE //Eating up space doesn't count for victory as a blob. - ambient_buzz = null // Space is pretty quiet + ambience_index = null + ambient_music_index = AMBIENCE_SPACE + ambient_buzz = null + sound_environment = SOUND_AREA_SPACE /area/space/nearstation icon_state = "space_near" @@ -44,9 +46,9 @@ NOTE: there are two lists of areas in the end of this file: centcom and station requires_power = FALSE dynamic_lighting = DYNAMIC_LIGHTING_DISABLED has_gravity = STANDARD_GRAVITY + ambience_index = null ambient_buzz = null - /area/testroom requires_power = FALSE name = "Test Room" @@ -59,16 +61,16 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "asteroid" requires_power = FALSE has_gravity = STANDARD_GRAVITY - blob_allowed = FALSE //Nope, no winning on the asteroid as a blob. Gotta eat the station. - valid_territory = FALSE - ambient_effects = MINING + ambience_index = AMBIENCE_MINING + sound_environment = SOUND_AREA_ASTEROID + area_flags = UNIQUE_AREA /area/asteroid/nearstation dynamic_lighting = DYNAMIC_LIGHTING_FORCED - ambient_effects = RUINS + ambience_index = AMBIENCE_RUINS always_unpowered = FALSE requires_power = TRUE - blob_allowed = TRUE + area_flags = UNIQUE_AREA | BLOBS_ALLOWED /area/asteroid/nearstation/bomb_site name = "Bomb Testing Asteroid" @@ -78,10 +80,11 @@ NOTE: there are two lists of areas in the end of this file: centcom and station //Maintenance /area/maintenance - ambient_effects = MAINTENANCE - valid_territory = FALSE + ambience_index = AMBIENCE_MAINT + sound_environment = SOUND_AREA_TUNNEL_ENCLOSED + area_flags = BLOBS_ALLOWED | UNIQUE_AREA mood_bonus = -1 - mood_message = "It's kind of cramped in here!\n" + mood_message = "It's kind of cramped in here!\n" lighting_colour_tube = "#ffe5cb" lighting_colour_bulb = "#ffdbb4" @@ -98,6 +101,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/maintenance/department/crew_quarters/bar name = "Bar Maintenance" icon_state = "maint_bar" + sound_environment = SOUND_AREA_WOODFLOOR /area/maintenance/department/crew_quarters/dorms name = "Dormitory Maintenance" @@ -158,7 +162,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/maintenance/department/science/xenobiology name = "Xenobiology Maintenance" icon_state = "xenomaint" - xenobiology_compatible = TRUE + area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | XENOBIOLOGY_COMPATIBLE //Maintenance - Generic @@ -235,8 +239,76 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Incinerator" icon_state = "disposal" +//Maintenance - Upper + +/area/maintenance/upper/aft + name = "Upper Aft Maintenance" + icon_state = "amaint" + +/area/maintenance/upper/aft/secondary + name = "Upper Aft Maintenance" + icon_state = "amaint_2" + +/area/maintenance/upper/central + name = "Upper Central Maintenance" + icon_state = "maintcentral" + +/area/maintenance/upper/central/secondary + name = "Upper Central Maintenance" + icon_state = "maintcentral" + +/area/maintenance/upper/fore + name = "Upper Fore Maintenance" + icon_state = "fmaint" + +/area/maintenance/upper/fore/secondary + name = "Upper Fore Maintenance" + icon_state = "fmaint_2" + +/area/maintenance/upper/starboard + name = "Upper Starboard Maintenance" + icon_state = "smaint" + +/area/maintenance/upper/starboard/central + name = "Upper Central Starboard Maintenance" + icon_state = "smaint" + +/area/maintenance/upper/starboard/secondary + name = "Upper Secondary Starboard Maintenance" + icon_state = "smaint_2" + +/area/maintenance/upper/starboard/aft + name = "Upper Starboard Quarter Maintenance" + icon_state = "asmaint" + +/area/maintenance/upper/starboard/aft/secondary + name = "Upper Secondary Starboard Quarter Maintenance" + icon_state = "asmaint_2" + +/area/maintenance/upper/starboard/fore + name = "Upper Starboard Bow Maintenance" + icon_state = "fsmaint" + +/area/maintenance/upper/port + name = "Upper Port Maintenance" + icon_state = "pmaint" + +/area/maintenance/upper/port/central + name = "Upper Central Port Maintenance" + icon_state = "maintcentral" + +/area/maintenance/upper/port/aft + name = "Upper Port Quarter Maintenance" + icon_state = "apmaint" + +/area/maintenance/upper/port/fore + name = "Upper Port Bow Maintenance" + icon_state = "fpmaint" + //Hallway +/area/hallway + sound_environment = SOUND_AREA_STANDARD_STATION /area/hallway lighting_colour_tube = "#ffce99" @@ -288,36 +360,91 @@ 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/law + name = "Law Hallway" + icon_state = "security" + + +/area/hallway/upper/primary/aft + name = "Upper Aft Primary Hallway" + icon_state = "hallA" + +/area/hallway/upper/primary/fore + name = "Upper Fore Primary Hallway" + icon_state = "hallF" + +/area/hallway/upper/primary/starboard + name = "Upper Starboard Primary Hallway" + icon_state = "hallS" + +/area/hallway/upper/primary/port + name = "Upper Port Primary Hallway" + icon_state = "hallP" + +/area/hallway/upper/primary/central + name = "Upper Central Primary Hallway" + icon_state = "hallC" + +/area/hallway/upper/secondary/command + name = "Upper Command Hallway" + icon_state = "bridge_hallway" + +/area/hallway/upper/secondary/construction + name = "Upper Construction Area" + icon_state = "construction" + +/area/hallway/upper/secondary/exit + name = "Upper Escape Shuttle Hallway" + icon_state = "escape" + +/area/hallway/upper/secondary/exit/departure_lounge + name = "Upper Departure Lounge" + icon_state = "escape_lounge" + +/area/hallway/upper/secondary/entry + name = "Upper Arrival Shuttle Hallway" + icon_state = "entry" + +/area/hallway/upper/secondary/service + name = "Upper Service Hallway" + icon_state = "hall_service" + //Command /area/bridge name = "Bridge" icon_state = "bridge" - ambient_effects = list('sound/ambience/signal.ogg') + ambientsounds = list('sound/ambience/signal.ogg') lighting_colour_tube = "#ffce99" lighting_colour_bulb = "#ffdbb4" lighting_brightness_tube = 8 + sound_environment = SOUND_AREA_STANDARD_STATION /area/bridge/meeting_room name = "Heads of Staff Meeting Room" icon_state = "meeting" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR /area/bridge/meeting_room/council name = "Council Chamber" icon_state = "meeting" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR /area/bridge/showroom/corporate name = "Corporate Showroom" icon_state = "showroom" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR /area/crew_quarters/heads/captain name = "Captain's Office" icon_state = "captain" + sound_environment = SOUND_AREA_WOODFLOOR /area/crew_quarters/heads/captain/private name = "Captain's Quarters" icon_state = "captain" + sound_environment = SOUND_AREA_WOODFLOOR /area/crew_quarters/heads/chief name = "Chief Engineer's Office" @@ -344,10 +471,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "tcomsatcham" lighting_colour_tube = "#e2feff" lighting_colour_bulb = "#d5fcff" + sound_environment = SOUND_AREA_STANDARD_STATION /area/server name = "Messaging Server Room" icon_state = "server" + sound_environment = SOUND_AREA_STANDARD_STATION //Crew @@ -355,17 +484,20 @@ NOTE: there are two lists of areas in the end of this file: centcom and station lighting_colour_tube = "#ffce99" lighting_colour_bulb = "#ffdbb4" lighting_brightness_tube = 8 + sound_environment = SOUND_AREA_STANDARD_STATION /area/crew_quarters/dorms name = "Dormitories" icon_state = "Sleep" - safe = TRUE + area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA mood_bonus = 3 mood_message = "There's no place like the dorms!\n" +/area/crew_quarters/dorms/upper + name = "Upper Dorms" + /area/crew_quarters/cryopods name = "Cryopod Room" - safe = TRUE icon_state = "cryopod" lighting_colour_tube = "#e3ffff" lighting_colour_bulb = "#d5ffff" @@ -375,6 +507,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "toilet" lighting_colour_tube = "#e3ffff" lighting_colour_bulb = "#d5ffff" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/crew_quarters/toilet/auxiliary name = "Auxiliary Restrooms" @@ -395,6 +528,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/crew_quarters/lounge name = "Lounge" icon_state = "yellow" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR /area/crew_quarters/fitness name = "Fitness Room" @@ -408,6 +542,17 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Recreation Area" icon_state = "fitness" +/area/crew_quarters/fitness/recreation/upper + name = "Upper Recreation Area" + icon_state = "fitness" + +/area/crew_quarters/park + name = "Recrational Park" + icon_state = "fitness" + lighting_colour_bulb = "#80aae9" + lighting_colour_tube = "#80aae9" + lighting_brightness_bulb = 9 + /area/crew_quarters/cafeteria name = "Cafeteria" icon_state = "cafeteria" @@ -421,6 +566,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/crew_quarters/kitchen/coldroom name = "Kitchen Cold Room" icon_state = "kitchen_cold" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/crew_quarters/bar name = "Bar" @@ -429,10 +575,20 @@ NOTE: there are two lists of areas in the end of this file: centcom and station mood_message = "I love being in the bar!\n" lighting_colour_tube = "#fff4d6" lighting_colour_bulb = "#ffebc1" + sound_environment = SOUND_AREA_WOODFLOOR + +/area/crew_quarters/bar/Initialize(mapload) + . = ..() + GLOB.bar_areas += src + +/area/service/bar/Initialize(mapload) + . = ..() + GLOB.bar_areas += src /area/crew_quarters/bar/atrium name = "Atrium" icon_state = "bar" + sound_environment = SOUND_AREA_WOODFLOOR /area/crew_quarters/electronic_marketing_den name = "Electronic Marketing Den" @@ -448,6 +604,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/crew_quarters/theatre name = "Theatre" icon_state = "Theatre" + sound_environment = SOUND_AREA_WOODFLOOR /area/crew_quarters/theatre/abandoned name = "Abandoned Theatre" @@ -464,6 +621,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/library/lounge name = "Library Lounge" + sound_environment = SOUND_AREA_LARGE_SOFTFLOOR icon_state = "library" /area/library/abandoned @@ -473,10 +631,11 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/chapel icon_state = "chapel" - ambient_effects = HOLY + ambience_index = AMBIENCE_HOLY flags_1 = NONE clockwork_warp_allowed = FALSE clockwork_warp_fail = "The consecration here prevents you from warping in." + sound_environment = SOUND_AREA_LARGE_ENCLOSED /area/chapel/main name = "Chapel" @@ -491,6 +650,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/chapel/asteroid name = "Chapel Asteroid" icon_state = "explored" + sound_environment = SOUND_AREA_ASTEROID /area/chapel/asteroid/monastery name = "Monastery Asteroid" @@ -502,12 +662,14 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/lawoffice name = "Law Office" icon_state = "law" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR //Engineering /area/engine - ambient_effects = ENGINEERING + ambience_index = AMBIENCE_ENGI + sound_environment = SOUND_AREA_LARGE_ENCLOSED lighting_colour_tube = "#ffce93" lighting_colour_bulb = "#ffbc6f" @@ -527,6 +689,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/engine/atmospherics_engine name = "Atmospherics Engine" icon_state = "atmos_engine" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA + sound_environment = SOUND_AREA_LARGE_ENCLOSED /area/engine/engine_room //donut station specific name = "Engine Room" @@ -539,12 +703,15 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/engine/supermatter name = "Supermatter Engine" icon_state = "engine_sm" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/engine/break_room name = "Engineering Foyer" icon_state = "engine_foyer" mood_bonus = 2 mood_message = "Ahhh, time to take a break.\n" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/engine/gravity_generator name = "Gravity Generator Room" @@ -555,6 +722,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/engine/storage name = "Engineering Storage" icon_state = "engi_storage" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/engine/storage_shared name = "Shared Engineering Storage" @@ -570,14 +738,15 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/solar requires_power = FALSE dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT - valid_territory = FALSE - blob_allowed = FALSE + area_flags = UNIQUE_AREA flags_1 = NONE - ambient_effects = ENGINEERING + ambience_index = AMBIENCE_ENGI + sound_environment = SOUND_AREA_SPACE /area/solar/fore name = "Fore Solar Array" icon_state = "yellow" + sound_environment = SOUND_AREA_STANDARD_STATION /area/solar/aft name = "Aft Solar Array" @@ -616,6 +785,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "panelsFP" + //Solar Maint /area/maintenance/solars @@ -651,19 +821,21 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/teleporter name = "Teleporter Room" icon_state = "teleporter" - ambient_effects = ENGINEERING + ambience_index = AMBIENCE_ENGI /area/gateway name = "Gateway" icon_state = "gateway" - ambient_effects = ENGINEERING + ambience_index = AMBIENCE_ENGI + sound_environment = SOUND_AREA_STANDARD_STATION //MedBay /area/medical name = "Medical" icon_state = "medbay3" - ambient_effects = MEDICAL + ambience_index = AMBIENCE_MEDICAL + sound_environment = SOUND_AREA_STANDARD_STATION mood_bonus = 2 mood_message = "I feel safe in here!\n" lighting_colour_tube = "#e7f8ff" @@ -672,7 +844,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/medical/abandoned name = "Abandoned Medbay" icon_state = "medbay3" - ambient_effects = list('sound/ambience/signal.ogg') + ambientsounds = list('sound/ambience/signal.ogg') + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/medical/medbay/balcony + name = "Medbay Balcony" + icon_state = "medbay" /area/medical/medbay/central name = "Medbay Central" @@ -699,6 +876,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/medical/patients_rooms name = "Patients' Rooms" icon_state = "patients" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR /area/medical/patients_rooms/room_a name = "Patient Room A" @@ -708,6 +886,10 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Patient Room B" icon_state = "patients" +/area/medical/patients_rooms/room_c + name = "Patient Room C" + icon_state = "patients" + /area/medical/virology name = "Virology" icon_state = "virology" @@ -716,14 +898,19 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/medical/morgue name = "Morgue" icon_state = "morgue" - ambient_effects = SPOOKY + ambience_index = AMBIENCE_SPOOKY + sound_environment = SOUND_AREA_SMALL_ENCLOSED mood_bonus = -2 - mood_message = "It smells like death in here!\n" + mood_message = "It smells like death in here!\n" /area/medical/chemistry name = "Chemistry" icon_state = "chem" +/area/medical/chemistry/upper + name = "Upper Chemistry" + icon_state = "chem" + /area/medical/apothecary name = "Apothecary" icon_state = "apothecary" @@ -732,6 +919,10 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Surgery" icon_state = "surgery" +/area/medical/surgery/aux + name = "Auxillery Surgery" + icon_state = "surgery" + /area/medical/cryo name = "Cryogenics" icon_state = "cryo" @@ -758,7 +949,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/security name = "Security" icon_state = "security" - ambient_effects = HIGHSEC + ambience_index = AMBIENCE_DANGER + sound_environment = SOUND_AREA_STANDARD_STATION lighting_colour_tube = "#ffeee2" lighting_colour_bulb = "#ffdfca" @@ -770,11 +962,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Brig" icon_state = "brig" mood_bonus = -3 - mood_message = "I hate cramped brig cells.\n" + mood_message = "I hate cramped brig cells.\n" /area/security/courtroom name = "Courtroom" icon_state = "courtroom" + sound_environment = SOUND_AREA_LARGE_ENCLOSED /area/security/prison name = "Prison Wing" @@ -787,19 +980,22 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/security/processing/cremation name = "Security Crematorium" icon_state = "sec_prison" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/security/warden name = "Brig Control" icon_state = "Warden" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR /area/security/detectives_office name = "Detective's Office" icon_state = "detective" - ambient_effects = list('sound/ambience/ambidet1.ogg','sound/ambience/ambidet2.ogg') + ambientsounds = list('sound/ambience/ambidet1.ogg','sound/ambience/ambidet2.ogg','sound/ambience/ambidet3.ogg','sound/ambience/ambidet4.ogg') /area/security/detectives_office/private_investigators_office name = "Private Investigator's Office" icon_state = "detective" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR /area/security/range name = "Firing Range" @@ -808,7 +1004,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/security/execution icon_state = "execution_room" mood_bonus = -5 - mood_message = "I feel a sense of impending doom.\n" + mood_message = "I feel a sense of impending doom.\n" /area/security/execution/transfer name = "Transfer Centre" @@ -869,14 +1065,17 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "quart" lighting_colour_tube = "#ffe3cc" lighting_colour_bulb = "#ffdbb8" + sound_environment = SOUND_AREA_STANDARD_STATION /area/quartermaster/sorting name = "Delivery Office" icon_state = "cargo_delivery" + sound_environment = SOUND_AREA_STANDARD_STATION /area/quartermaster/warehouse name = "Warehouse" icon_state = "cargo_warehouse" + sound_environment = SOUND_AREA_LARGE_ENCLOSED /area/quartermaster/office name = "Cargo Office" @@ -885,11 +1084,16 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/quartermaster/storage name = "Cargo Bay" icon_state = "cargo_bay" + sound_environment = SOUND_AREA_LARGE_ENCLOSED /area/quartermaster/qm name = "Quartermaster's Office" icon_state = "quart" +/area/quartermaster/qm_bedroom + name = "Quartermaster's Bedroom" + icon_state = "quart" + /area/quartermaster/miningdock name = "Mining Dock" icon_state = "mining" @@ -898,16 +1102,30 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Mining Office" icon_state = "mining" +/area/quartermaster/meeting_room + name = "Supply Meeting Room" + icon_state = "mining" + +/area/quartermaster/exploration_prep + name = "Exploration Preperation Room" + icon_state = "mining" + +/area/quartermaster/exploration_dock + name = "Exploration Dock" + icon_state = "mining" + /area/janitor name = "Custodial Closet" icon_state = "janitor" flags_1 = NONE mood_bonus = -1 - mood_message = "It feels dirty in here!\n" + mood_message = "It feels dirty in here!\n" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/hydroponics name = "Hydroponics" icon_state = "hydro" + sound_environment = SOUND_AREA_STANDARD_STATION /area/hydroponics/garden name = "Garden" @@ -918,6 +1136,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/hydroponics/garden/abandoned name = "Abandoned Garden" icon_state = "abandoned_garden" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/hydroponics/garden/monastery name = "Monastery Garden" @@ -931,6 +1150,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "toxlab" lighting_colour_tube = "#f0fbff" lighting_colour_bulb = "#e4f7ff" + sound_environment = SOUND_AREA_STANDARD_STATION /area/science/lab name = "Research and Development" @@ -940,13 +1160,18 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Xenobiology Lab" icon_state = "toxlab" +/area/science/shuttle + name = "Shuttle Construction" + lighting_colour_tube = "#ffe3cc" + lighting_colour_bulb = "#ffdbb8" + /area/science/storage name = "Toxins Storage" icon_state = "toxstorage" /area/science/test_area - valid_territory = FALSE name = "Toxins Test Area" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA icon_state = "toxtest" /area/science/mixing @@ -955,8 +1180,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/science/mixing/chamber name = "Toxins Mixing Chamber" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA icon_state = "toxmix" - valid_territory = FALSE /area/science/misc_lab name = "Testing Lab" @@ -993,6 +1218,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/science/research/abandoned name = "Abandoned Research Lab" icon_state = "medresearch" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/science/nanite name = "Nanite Lab" @@ -1003,6 +1229,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "toxmisc" //Storage +/area/storage + sound_environment = SOUND_AREA_STANDARD_STATION /area/storage/tools name = "Auxiliary Tool Storage" @@ -1018,8 +1246,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/storage/tcom name = "Telecomms Storage" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA icon_state = "green" - valid_territory = FALSE /area/storage/eva name = "EVA Storage" @@ -1043,11 +1271,13 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/construction name = "Construction Area" icon_state = "yellow" - ambient_effects = ENGINEERING + ambience_index = AMBIENCE_ENGI + sound_environment = SOUND_AREA_STANDARD_STATION /area/construction/mining/aux_base name = "Auxiliary Base Construction" icon_state = "aux_base_construction" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR /area/construction/storage_wing name = "Storage Wing" @@ -1057,7 +1287,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/vacant_room name = "Vacant Room" icon_state = "yellow" - ambient_effects = MAINTENANCE + ambience_index = AMBIENCE_MAINT icon_state = "vacant_room" /area/vacant_room/office @@ -1070,33 +1300,38 @@ NOTE: there are two lists of areas in the end of this file: centcom and station //AI +/area/ai_monitored + sound_environment = SOUND_AREA_STANDARD_STATION + /area/ai_monitored/security/armory name = "Armory" icon_state = "armory" - ambient_effects = HIGHSEC + ambience_index = AMBIENCE_DANGER /area/ai_monitored/storage/eva name = "EVA Storage" icon_state = "eva" - ambient_effects = HIGHSEC + ambience_index = AMBIENCE_DANGER /area/ai_monitored/storage/satellite name = "AI Satellite Maint" icon_state = "storage" - ambient_effects = HIGHSEC + ambience_index = AMBIENCE_DANGER //Turret_protected /area/ai_monitored/turret_protected - ambient_effects = list('sound/ambience/ambimalf.ogg', 'sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg') + ambientsounds = list('sound/ambience/ambimalf.ogg', 'sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg') /area/ai_monitored/turret_protected/ai_upload name = "AI Upload Chamber" icon_state = "ai_upload" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/ai_monitored/turret_protected/ai_upload_foyer name = "AI Upload Access" icon_state = "ai_foyer" + sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/ai_monitored/turret_protected/ai name = "AI Chamber" @@ -1105,6 +1340,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/ai_monitored/turret_protected/aisat name = "AI Satellite" icon_state = "ai" + sound_environment = SOUND_ENVIRONMENT_ROOM /area/ai_monitored/turret_protected/aisat/atmos name = "AI Satellite Atmos" @@ -1129,6 +1365,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/ai_monitored/turret_protected/aisat_interior name = "AI Satellite Antechamber" icon_state = "ai" + sound_environment = SOUND_AREA_LARGE_ENCLOSED /area/ai_monitored/turret_protected/AIsatextAS name = "AI Sat Ext" @@ -1144,13 +1381,18 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/tcommsat clockwork_warp_allowed = FALSE clockwork_warp_fail = "For safety reasons, warping here is disallowed; the radio and bluespace noise could cause catastrophic results." - ambient_effects = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg', 'sound/ambience/ambitech.ogg',\ + ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg', 'sound/ambience/ambitech.ogg',\ 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg', 'sound/ambience/ambimystery.ogg') /area/tcommsat/computer name = "Telecomms Control Room" icon_state = "tcomsatcomp" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR /area/tcommsat/server name = "Telecomms Server Room" icon_state = "tcomsatcham" + +/area/tcommsat/relay + name = "Telecommunications Relay" + icon_state = "tcomsatcham" diff --git a/code/game/area/ai_monitored.dm b/code/game/area/ai_monitored.dm index 87b44291f56e9..48e77e1623753 100644 --- a/code/game/area/ai_monitored.dm +++ b/code/game/area/ai_monitored.dm @@ -3,6 +3,7 @@ clockwork_warp_allowed = FALSE var/list/obj/machinery/camera/motioncameras = list() var/list/datum/weakref/motionTargets = list() + sound_environment = SOUND_ENVIRONMENT_ROOM /area/ai_monitored/Initialize(mapload) . = ..() @@ -28,4 +29,4 @@ for(var/X in motioncameras) var/obj/machinery/camera/cam = X cam.lostTargetRef(WEAKREF(O)) - return \ No newline at end of file + return diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 553387621304f..1e6025324fab4 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -14,60 +14,55 @@ 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. + var/area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA - 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? var/clockwork_warp_fail = "The structure there is too dense for warping to pierce. (This is normal in high-security areas.)" var/fire = null - var/atmos = TRUE + ///Whether there is an atmos alarm in this area var/atmosalm = FALSE var/poweralm = TRUE var/lightswitch = TRUE var/vacuum = null - var/requires_power = TRUE - var/always_unpowered = FALSE // This gets overridden to 1 for space in area/Initialize(). - - 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 or with weather 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. var/mood_bonus = 0 //Mood for being here var/mood_message = "This area is pretty nice!\n" //Mood message for being here, only shows up if mood_bonus != 0 + ///Will objects this area be needing power? + var/requires_power = TRUE + /// This gets overridden to 1 for space in area/Initialize(). + var/always_unpowered = FALSE + var/power_equip = TRUE var/power_light = TRUE var/power_environ = TRUE - var/has_gravity = 0 + var/has_gravity = FALSE ///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 - - var/no_air = null + var/teleport_restriction = TELEPORT_ALLOW_ALL var/parallax_movedir = 0 - var/list/ambient_music = null // OOC, doesn't require the user to actually be able to hear it - var/list/ambient_effects = GENERIC // IC, requires the user to actually be able to hear it, will play spontaneously + var/ambience_index = AMBIENCE_GENERIC + var/list/ambientsounds + var/ambient_buzz = 'sound/ambience/shipambience.ogg' // Ambient buzz of the station, plays repeatedly, also IC + var/ambient_music_index + var/list/ambientmusic + flags_1 = CAN_BE_DIRTY_1 var/list/firedoors var/list/cameras var/list/firealarms var/firedoors_last_closed_on = 0 - /// Can the Xenobio management console transverse this area by default? - var/xenobiology_compatible = FALSE /// typecache to limit the areas that atoms in this area can smooth with, used for shuttles IIRC var/list/canSmoothWithAreas @@ -76,10 +71,29 @@ var/lighting_colour_tube = "#FFF6ED" var/lighting_colour_bulb = "#FFE6CC" var/lighting_colour_night = "#FFDBB5" - var/lighting_brightness_tube = 10 + var/lighting_brightness_tube = 11 var/lighting_brightness_bulb = 6 var/lighting_brightness_night = 6 + ///Used to decide what the minimum time between ambience is + var/min_ambience_cooldown = 30 SECONDS + ///Used to decide what the maximum time between ambience is + var/max_ambience_cooldown = 90 SECONDS + ///Used to decide what kind of reverb the area makes sound have + var/sound_environment = SOUND_ENVIRONMENT_NONE + + //Lighting overlay + var/obj/effect/lighting_overlay + var/lighting_overlay_colour = "#FFFFFF" + var/lighting_overlay_opacity = 0 + + ///This datum, if set, allows terrain generation behavior to be ran on Initialize() + var/datum/map_generator/map_generator + + ///Lazylist that contains additional turfs that map generation should be ran on. This is used for ruins which need a noop turf under non-noop areas so they don't leave genturfs behind. + var/list/additional_genturfs + + /** * A list of teleport locations * @@ -100,7 +114,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) /proc/process_teleport_locs() for(var/V in GLOB.sortedAreas) var/area/AR = V - if(istype(AR, /area/shuttle) || AR.noteleport) + if(istype(AR, /area/shuttle) || AR.teleport_restriction) continue if(GLOB.teleportlocs[AR.name]) continue @@ -120,7 +134,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) /area/New() // This interacts with the map loader, so it needs to be set immediately // rather than waiting for atoms to initialize. - if (unique) + if (area_flags & UNIQUE_AREA) GLOB.areas_by_type[type] = src power_usage = new /list(AREA_USAGE_LEN) // Some atoms would like to use power in Initialize() return ..() @@ -135,10 +149,14 @@ GLOBAL_LIST_EMPTY(teleportlocs) */ /area/Initialize() icon_state = "" - layer = AREA_LAYER - map_name = name // Save the initial (the name set in the map) name of the area. canSmoothWithAreas = typecacheof(canSmoothWithAreas) + if(!ambientsounds && ambience_index) + ambientsounds = GLOB.ambience_assoc[ambience_index] + + if(!ambientmusic && ambient_music_index) + ambientmusic = GLOB.ambient_music_assoc[ambient_music_index] + if(requires_power) luminosity = 0 else @@ -160,7 +178,11 @@ GLOBAL_LIST_EMPTY(teleportlocs) if(!IS_DYNAMIC_LIGHTING(src)) add_overlay(/obj/effect/fullbright) - + else if(lighting_overlay_opacity && lighting_overlay_colour) + lighting_overlay = new /obj/effect/fullbright + lighting_overlay.color = lighting_overlay_colour + lighting_overlay.alpha = lighting_overlay_opacity + add_overlay(lighting_overlay) reg_in_areas_in_z() return INITIALIZE_HINT_LATELOAD @@ -171,6 +193,28 @@ GLOBAL_LIST_EMPTY(teleportlocs) /area/LateInitialize() power_change() // all machines set to current power level, also updates icon +/area/proc/RunGeneration() + if(map_generator) + map_generator = new map_generator() + var/list/turfs = list() + for(var/turf/T in contents) + turfs += T + if(additional_genturfs) + turfs += additional_genturfs + additional_genturfs = null + map_generator.generate_terrain(turfs) + +/area/proc/test_gen() + if(map_generator) + var/list/turfs = list() + for(var/turf/T in contents) + turfs += T + if(additional_genturfs) + turfs += additional_genturfs + additional_genturfs = null + map_generator.generate_terrain(turfs) + + /** * Register this area as belonging to a z level * @@ -209,7 +253,9 @@ GLOBAL_LIST_EMPTY(teleportlocs) /area/Destroy() if(GLOB.areas_by_type[type] == src) GLOB.areas_by_type[type] = null - STOP_PROCESSING(SSobj, src) + GLOB.sortedAreas -= src + if(fire) + STOP_PROCESSING(SSobj, src) return ..() /** @@ -253,9 +299,9 @@ GLOBAL_LIST_EMPTY(teleportlocs) * * Sends to all ai players, alert consoles, drones and alarm monitor programs in the world */ -/area/proc/atmosalert(danger_level, obj/source) - if(danger_level != atmosalm) - if (danger_level==2) +/area/proc/atmosalert(isdangerous, obj/source) + if(isdangerous != atmosalm) + if(isdangerous==TRUE) for (var/item in GLOB.silicon_mobs) var/mob/living/silicon/aiPlayer = item @@ -270,7 +316,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) var/datum/computer_file/program/alarm_monitor/p = item p.triggerAlarm("Atmosphere", src, cameras, source) - else if (src.atmosalm == 2) + else for (var/item in GLOB.silicon_mobs) var/mob/living/silicon/aiPlayer = item aiPlayer.cancelAlarm("Atmosphere", src, source) @@ -284,9 +330,9 @@ GLOBAL_LIST_EMPTY(teleportlocs) var/datum/computer_file/program/alarm_monitor/p = item p.cancelAlarm("Atmosphere", src, source) - src.atmosalm = danger_level - return 1 - return 0 + atmosalm = isdangerous + return TRUE + return FALSE /** * Try to close all the firedoors in the area @@ -323,6 +369,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) if (!fire) set_fire_alarm_effect() ModifyFiredoors(FALSE) + START_PROCESSING(SSobj, src) for(var/item in firealarms) var/obj/machinery/firealarm/F = item F.update_icon() @@ -340,8 +387,6 @@ GLOBAL_LIST_EMPTY(teleportlocs) var/datum/computer_file/program/alarm_monitor/p = item p.triggerAlarm("Fire", src, cameras, source) - START_PROCESSING(SSobj, src) - /** * Reset the firealarm alert for this area * @@ -354,6 +399,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) if (fire) unset_fire_alarm_effects() ModifyFiredoors(TRUE) + STOP_PROCESSING(SSobj, src) for(var/item in firealarms) var/obj/machinery/firealarm/F = item F.update_icon() @@ -371,7 +417,17 @@ GLOBAL_LIST_EMPTY(teleportlocs) var/datum/computer_file/program/alarm_monitor/p = item p.cancelAlarm("Fire", src, source) - STOP_PROCESSING(SSobj, src) +///Get rid of any dangling camera refs +/area/proc/clear_camera(obj/machinery/camera/cam) + LAZYREMOVE(cameras, cam) + for (var/mob/living/silicon/aiPlayer as anything in GLOB.silicon_mobs) + aiPlayer.freeCamera(src, cam) + for (var/obj/machinery/computer/station_alert/comp as anything in GLOB.alert_consoles) + comp.freeCamera(src, cam) + for (var/mob/living/simple_animal/drone/drone_on as anything in GLOB.drones_list) + drone_on.freeCamera(src, cam) + for(var/datum/computer_file/program/alarm_monitor/monitor as anything in GLOB.alarmdisplay) + monitor.freeCamera(src, cam) /** * If 100 ticks has elapsed, toggle all the firedoors closed again @@ -547,7 +603,6 @@ GLOBAL_LIST_EMPTY(teleportlocs) if(AREA_USAGE_DYNAMIC_START to AREA_USAGE_DYNAMIC_END) power_usage[chan] += amount - /** * Call back when an atom enters an area * @@ -570,7 +625,8 @@ GLOBAL_LIST_EMPTY(teleportlocs) SEND_SIGNAL(M, COMSIG_EXIT_AREA, src) //The atom that exits the area /** - * Returns true if this atom has gravity for the passed in turf + * Returns true if this atom has gravity for the passed in turf or other gravity-mimicking behaviors + * In other words, it returns whether the atom can be *on* the turf (i.e. not forced to float) * * Sends signals COMSIG_ATOM_HAS_GRAVITY and COMSIG_TURF_HAS_GRAVITY, both can force gravity with * the forced gravity var @@ -600,7 +656,8 @@ GLOBAL_LIST_EMPTY(teleportlocs) max_grav = max(max_grav, i) return max_grav - if(isspaceturf(T)) // Turf never has gravity + + if(!T.check_gravity()) // Turf never has gravity return 0 var/area/A = get_area(T) @@ -608,9 +665,9 @@ GLOBAL_LIST_EMPTY(teleportlocs) return A.has_gravity else // There's a gravity generator on our z level - if(GLOB.gravity_generators["[T.z]"]) + if(GLOB.gravity_generators["[T.get_virtual_z_level()]"]) var/max_grav = 0 - for(var/obj/machinery/gravity_generator/main/G in GLOB.gravity_generators["[T.z]"]) + for(var/obj/machinery/gravity_generator/main/G in GLOB.gravity_generators["[T.get_virtual_z_level()]"]) max_grav = max(G.setting,max_grav) return max_grav return SSmapping.level_trait(T.z, ZTRAIT_GRAVITY) @@ -625,8 +682,8 @@ GLOBAL_LIST_EMPTY(teleportlocs) power_light = FALSE power_environ = FALSE always_unpowered = FALSE - valid_territory = FALSE - blob_allowed = FALSE + area_flags &= ~VALID_TERRITORY + area_flags &= ~BLOBS_ALLOWED addSorted() /** * Set the area size of the area @@ -656,3 +713,10 @@ GLOBAL_LIST_EMPTY(teleportlocs) /// A hook so areas can modify the incoming args (of what??) /area/proc/PlaceOnTopReact(list/new_baseturfs, turf/fake_turf_type, flags) return flags + +/// Gets an areas virtual z value. For having multiple areas on the same z-level treated mechanically as different z-levels +/area/proc/get_virtual_z(turf/T) + return T.z + +/area/get_virtual_z_level() + return get_virtual_z(get_turf(src)) diff --git a/code/game/area/areas/away_content.dm b/code/game/area/areas/away_content.dm index e63038de4e88e..0924e61135a0e 100644 --- a/code/game/area/areas/away_content.dm +++ b/code/game/area/areas/away_content.dm @@ -8,7 +8,8 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" name = "Strange Location" icon_state = "away" has_gravity = STANDARD_GRAVITY - ambient_effects = AWAY_MISSION + ambience_index = AMBIENCE_AWAY + sound_environment = SOUND_ENVIRONMENT_ROOM /area/awaymission/beach name = "Beach" @@ -16,7 +17,7 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" dynamic_lighting = DYNAMIC_LIGHTING_DISABLED requires_power = FALSE has_gravity = STANDARD_GRAVITY - ambient_effects = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg','sound/ambience/ambiodd.ogg','sound/ambience/ambinice.ogg') + ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg','sound/ambience/ambiodd.ogg','sound/ambience/ambinice.ogg') /area/awaymission/errorroom name = "Super Secret Room" diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index 6ddce6afea2c9..addd6c27b27ad 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -7,8 +7,8 @@ dynamic_lighting = DYNAMIC_LIGHTING_FORCED requires_power = FALSE has_gravity = STANDARD_GRAVITY - noteleport = TRUE - blob_allowed = FALSE //Should go without saying, no blobs should take over centcom as a win condition. + teleport_restriction = TELEPORT_ALLOW_NONE + area_flags = VALID_TERRITORY | UNIQUE_AREA flags_1 = NONE /area/centcom/control @@ -29,7 +29,7 @@ /area/centcom/holding name = "Holding Facility" -/area/centcom/supplypod/flyMeToTheMoon +/area/centcom/supplypod/supplypod_temp_holding name = "Supplypod Shipping lane" icon_state = "supplypod_flight" @@ -45,21 +45,35 @@ /area/centcom/supplypod/loading name = "Supplypod Loading Facility" icon_state = "supplypod_loading" + var/loading_id = "" + +/area/centcom/supplypod/loading/Initialize() + . = ..() + if(!loading_id) + CRASH("[type] created without a loading_id") + if(GLOB.supplypod_loading_bays[loading_id]) + CRASH("Duplicate loading bay area: [type] ([loading_id])") + GLOB.supplypod_loading_bays[loading_id] = src /area/centcom/supplypod/loading/one name = "Bay #1" + loading_id = "1" /area/centcom/supplypod/loading/two name = "Bay #2" + loading_id = "2" /area/centcom/supplypod/loading/three name = "Bay #3" + loading_id = "3" /area/centcom/supplypod/loading/four name = "Bay #4" + loading_id = "4" /area/centcom/supplypod/loading/ert name = "ERT Bay" + loading_id = "5" //THUNDERDOME /area/tdome @@ -106,7 +120,8 @@ dynamic_lighting = DYNAMIC_LIGHTING_FORCED requires_power = FALSE has_gravity = STANDARD_GRAVITY - noteleport = TRUE + teleport_restriction = TELEPORT_ALLOW_NONE + area_flags = VALID_TERRITORY | UNIQUE_AREA flags_1 = NONE //Abductors @@ -114,7 +129,8 @@ name = "Abductor Ship" icon_state = "yellow" requires_power = FALSE - noteleport = TRUE + teleport_restriction = TELEPORT_ALLOW_ABDUCTORS + area_flags = VALID_TERRITORY | UNIQUE_AREA has_gravity = STANDARD_GRAVITY flags_1 = NONE @@ -124,10 +140,10 @@ icon_state = "syndie-ship" requires_power = FALSE has_gravity = STANDARD_GRAVITY - noteleport = TRUE - blob_allowed = FALSE //Not... entirely sure this will ever come up... but if the bus makes blobs AND ops, it shouldn't aim for the ops to win. + teleport_restriction = TELEPORT_ALLOW_NONE + area_flags = VALID_TERRITORY | UNIQUE_AREA flags_1 = NONE - ambient_effects = HIGHSEC + ambience_index = AMBIENCE_DANGER /area/syndicate_mothership/control name = "Syndicate Control Room" @@ -180,12 +196,12 @@ icon_state = "yellow" requires_power = FALSE has_gravity = STANDARD_GRAVITY - noteleport = TRUE - hidden = TRUE - ambient_effects = REEBE + teleport_restriction = TELEPORT_ALLOW_CLOCKWORK + area_flags = VALID_TERRITORY | UNIQUE_AREA | HIDDEN_AREA + ambience_index = AMBIENCE_REEBE /area/reebe/city_of_cogs name = "Reebe - City of Cogs" icon_state = "purple" - hidden = FALSE + area_flags = VALID_TERRITORY | UNIQUE_AREA | HIDDEN_AREA var/playing_ambience = FALSE diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm index 6cf436908f7df..e9a371ea32bf9 100644 --- a/code/game/area/areas/holodeck.dm +++ b/code/game/area/areas/holodeck.dm @@ -2,8 +2,9 @@ name = "Holodeck" icon_state = "Holodeck" dynamic_lighting = DYNAMIC_LIGHTING_DISABLED - flags_1 = 0 - hidden = TRUE + flags_1 = NONE + area_flags = VALID_TERRITORY | UNIQUE_AREA | HIDDEN_AREA + sound_environment = SOUND_ENVIRONMENT_PADDED_CELL var/obj/machinery/computer/holodeck/linked var/restricted = 0 // if true, program goes on emag list @@ -15,11 +16,11 @@ /area/holodeck/powered(var/chan) if(!requires_power) - return 1 + return TRUE if(always_unpowered) - return 0 + return FALSE if(!linked) - return 0 + return FALSE var/area/A = get_area(linked) ASSERT(!istype(A, /area/holodeck)) return A.powered(chan) @@ -47,76 +48,5 @@ /area/holodeck/rec_center name = "\improper Recreational Holodeck" -/area/holodeck/rec_center/offline - name = "Holodeck - Offline" - -/area/holodeck/rec_center/court - name = "Holodeck - Empty Court" - -/area/holodeck/rec_center/dodgeball - name = "Holodeck - Dodgeball Court" - -/area/holodeck/rec_center/basketball - name = "Holodeck - Basketball Court" - -/area/holodeck/rec_center/thunderdome - name = "Holodeck - Thunderdome Arena" - -/area/holodeck/rec_center/beach - name = "Holodeck - Beach" - -/area/holodeck/rec_center/lounge - name = "Holodeck - Lounge" - -/area/holodeck/rec_center/medical - name = "Holodeck - Emergency Medical" - -/area/holodeck/rec_center/pet_lounge - name = "Holodeck - Pet Park" - -/area/holodeck/rec_center/firingrange - name = "Holodeck - Firing Range" - -/area/holodeck/rec_center/school - name = "Holodeck - Anime School" - -/area/holodeck/rec_center/chapelcourt - name = "Holodeck - Chapel Courtroom" - -/area/holodeck/rec_center/spacechess - name = "Holodeck - Space Chess" - -/area/holodeck/rec_center/kobayashi - name = "Holodeck - Kobayashi Maru" - -/area/holodeck/rec_center/winterwonderland - name = "Holodeck - Winter Wonderland" - -/area/holodeck/rec_center/photobooth - name = "Holodeck - Photobooth" - -// Bad programs - -/area/holodeck/rec_center/burn - name = "Holodeck - Atmospheric Burn Test" - restricted = 1 - -/area/holodeck/rec_center/wildlife - name = "Holodeck - Wildlife Simulation" - restricted = 1 - -/area/holodeck/rec_center/bunker - name = "Holodeck - Holdout Bunker" - restricted = 1 - -/area/holodeck/rec_center/anthophila - name = "Holodeck - Anthophila" - restricted = 1 - -/area/holodeck/rec_center/refuel - name = "Holodeck - Refueling Station" - restricted = 1 - -/area/holodeck/rec_center/thunderdome1218 - name = "Holodeck - 1218 AD" - restricted = 1 +/area/holodeck/rec_center/offstation_one + name = "\improper Recreational Holodeck" diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm index d05ee88e4c79c..5c5bdec326589 100644 --- a/code/game/area/areas/mining.dm +++ b/code/game/area/areas/mining.dm @@ -5,6 +5,7 @@ has_gravity = STANDARD_GRAVITY lighting_colour_tube = "#ffe8d2" lighting_colour_bulb = "#ffdcb7" + area_flags = VALID_TERRITORY | UNIQUE_AREA | FLORA_ALLOWED /area/mine/explored name = "Mine" @@ -17,7 +18,11 @@ power_light = FALSE outdoors = TRUE flags_1 = NONE - ambient_effects = MINING + ambience_index = AMBIENCE_MINING + min_ambience_cooldown = 70 SECONDS + max_ambience_cooldown = 220 SECONDS + sound_environment = SOUND_AREA_STANDARD_STATION + area_flags = VALID_TERRITORY | UNIQUE_AREA /area/mine/unexplored name = "Mine" @@ -30,7 +35,10 @@ power_light = FALSE outdoors = TRUE flags_1 = NONE - ambient_effects = MINING + ambience_index = AMBIENCE_MINING + min_ambience_cooldown = 70 SECONDS + max_ambience_cooldown = 220 SECONDS + area_flags = VALID_TERRITORY | UNIQUE_AREA | FLORA_ALLOWED | CAVES_ALLOWED /area/mine/lobby name = "Mining Station" @@ -73,7 +81,7 @@ /area/mine/laborcamp/security name = "Labor Camp Security" icon_state = "security" - ambient_effects = HIGHSEC + ambience_index = AMBIENCE_DANGER //This is a placeholder for the lavaland sci area. Whoever is here after me, I have made you some additional areas to work with. //You are free to rename these and change their icons. My job is done here. @@ -112,6 +120,8 @@ icon_state = "mining" has_gravity = STANDARD_GRAVITY flags_1 = NONE + sound_environment = SOUND_AREA_LAVALAND + area_flags = VALID_TERRITORY | UNIQUE_AREA | FLORA_ALLOWED /area/lavaland/surface name = "Lavaland" @@ -122,7 +132,9 @@ power_equip = FALSE power_light = FALSE requires_power = TRUE - ambient_effects = MINING + ambience_index = AMBIENCE_MINING + min_ambience_cooldown = 70 SECONDS + max_ambience_cooldown = 220 SECONDS /area/lavaland/underground name = "Lavaland Caves" @@ -133,8 +145,9 @@ power_environ = FALSE power_equip = FALSE power_light = FALSE - ambient_effects = MINING - + ambience_index = AMBIENCE_MINING + min_ambience_cooldown = 70 SECONDS + max_ambience_cooldown = 220 SECONDS /area/lavaland/surface/outdoors name = "Lavaland Wastes" @@ -142,9 +155,13 @@ /area/lavaland/surface/outdoors/unexplored //monsters and ruins spawn here icon_state = "unexplored" + area_flags = VALID_TERRITORY | UNIQUE_AREA | CAVES_ALLOWED | FLORA_ALLOWED | MOB_SPAWN_ALLOWED /area/lavaland/surface/outdoors/unexplored/danger //megafauna will also spawn here icon_state = "danger" + area_flags = VALID_TERRITORY | UNIQUE_AREA | CAVES_ALLOWED | FLORA_ALLOWED | MOB_SPAWN_ALLOWED | MEGAFAUNA_SPAWN_ALLOWED + map_generator = /datum/map_generator/cave_generator/lavaland /area/lavaland/surface/outdoors/explored name = "Lavaland Labor Camp" + area_flags = VALID_TERRITORY | UNIQUE_AREA diff --git a/code/game/area/areas/ruins/_ruins.dm b/code/game/area/areas/ruins/_ruins.dm index bc66413cb65c8..08481fb474bb8 100644 --- a/code/game/area/areas/ruins/_ruins.dm +++ b/code/game/area/areas/ruins/_ruins.dm @@ -4,10 +4,10 @@ name = "\improper Unexplored Location" icon_state = "away" has_gravity = STANDARD_GRAVITY - hidden = TRUE + area_flags = HIDDEN_AREA | BLOBS_ALLOWED dynamic_lighting = DYNAMIC_LIGHTING_FORCED - ambient_effects = RUINS - + ambience_index = AMBIENCE_RUINS + sound_environment = SOUND_ENVIRONMENT_STONEROOM /area/ruin/unpowered always_unpowered = FALSE diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm index 2b877b313f9a2..7f58f29524748 100644 --- a/code/game/area/areas/ruins/lavaland.dm +++ b/code/game/area/areas/ruins/lavaland.dm @@ -6,7 +6,7 @@ /area/ruin/powered/clownplanet name = "Clown Planet" icon_state = "dk_yellow" - ambient_effects = list('sound/ambience/clown.ogg') + ambientsounds = list('sound/ambience/clown.ogg') /area/ruin/powered/animal_hospital icon_state = "dk_yellow" @@ -37,7 +37,7 @@ /area/ruin/unpowered/syndicate_lava_base name = "Secret Base" icon_state = "dk_yellow" - ambient_effects = HIGHSEC + ambience_index = AMBIENCE_DANGER /area/ruin/unpowered/syndicate_lava_base/engineering name = "Syndicate Lavaland Engineering" diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm index 86f34925feb8e..65fbe55e5be4c 100644 --- a/code/game/area/areas/ruins/space.dm +++ b/code/game/area/areas/ruins/space.dm @@ -2,7 +2,7 @@ /area/ruin/space has_gravity = FALSE - blob_allowed = FALSE //Nope, no winning in space as a blob. Gotta eat the station. + area_flags = UNIQUE_AREA /area/ruin/space/has_grav has_gravity = STANDARD_GRAVITY @@ -10,21 +10,6 @@ /area/ruin/space/has_grav/powered requires_power = FALSE - -/area/ruin/fakespace - icon_state = "space" - requires_power = TRUE - always_unpowered = TRUE - dynamic_lighting = DYNAMIC_LIGHTING_DISABLED - has_gravity = FALSE - power_light = FALSE - power_equip = FALSE - power_environ = FALSE - valid_territory = FALSE - outdoors = TRUE - ambient_effects = SPACE - blob_allowed = FALSE - ///////////// /area/ruin/space/way_home @@ -63,7 +48,7 @@ /area/ruin/space/has_grav/powered/aesthetic name = "Aesthetic" - ambient_effects = list('sound/ambience/ambivapor1.ogg') + ambientsounds = list('sound/ambience/ambivapor1.ogg') //Ruin of Hotel @@ -126,6 +111,10 @@ name = "Hotel Staff Room" icon_state = "crew_quarters" +/area/ruin/space/has_grav/hotel/secondary_solars + name = "Hotel Secondary Solar Control" + icon_state = "engine_smes" + @@ -244,6 +233,7 @@ name = "Beta Station Atmospherics" icon_state = "red" has_gravity = FALSE + ambience_index = AMBIENCE_ENGI /area/ruin/space/has_grav/ancientstation/betanorth name = "Beta Station North Corridor" @@ -256,6 +246,7 @@ /area/ruin/space/has_grav/ancientstation/engi name = "Charlie Station Engineering" icon_state = "engine" + ambience_index = AMBIENCE_ENGI /area/ruin/space/has_grav/ancientstation/comm name = "Charlie Station Command" @@ -368,7 +359,6 @@ name = "Ruskie DJ Station" icon_state = "DJ" has_gravity = STANDARD_GRAVITY - blob_allowed = FALSE //Nope, no winning on the DJ station as a blob. Gotta eat the main station. /area/ruin/space/djstation/solars name = "DJ Station Solars" @@ -381,7 +371,7 @@ /area/ruin/space/abandoned_tele name = "Abandoned Teleporter" icon_state = "teleporter" - ambient_effects = list('sound/ambience/ambimalf.ogg', 'sound/ambience/signal.ogg') + ambientsounds = list('sound/ambience/ambimalf.ogg', 'sound/ambience/signal.ogg') //OLD AI SAT diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index c829e1e259c16..70d78285d1b5d 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -8,18 +8,23 @@ dynamic_lighting = DYNAMIC_LIGHTING_FORCED has_gravity = STANDARD_GRAVITY always_unpowered = FALSE - valid_territory = FALSE - icon_state = "shuttle" // Loading the same shuttle map at a different time will produce distinct area instances. - unique = FALSE + area_flags = NONE lighting_colour_tube = "#fff0dd" lighting_colour_bulb = "#ffe1c1" + sound_environment = SOUND_ENVIRONMENT_ROOM + //The mobile port attached to this area + var/obj/docking_port/mobile/mobile_port /area/shuttle/Initialize() if(!canSmoothWithAreas) canSmoothWithAreas = type . = ..() +/area/shuttle/Destroy() + mobile_port = null + . = ..() + /area/shuttle/PlaceOnTopReact(list/new_baseturfs, turf/fake_turf_type, flags) . = ..() if(length(new_baseturfs) > 1 || fake_turf_type) @@ -27,14 +32,21 @@ if(ispath(new_baseturfs[1], /turf/open/floor/plating)) new_baseturfs.Insert(1, /turf/baseturf_skipover/shuttle) +/area/shuttle/proc/link_to_shuttle(obj/docking_port/mobile/M) + mobile_port = M + +/area/shuttle/get_virtual_z(turf/T) + if(mobile_port && is_reserved_level(mobile_port.z)) + return mobile_port.virtual_z + return ..(T) + ////////////////////////////Multi-area shuttles//////////////////////////// ////////////////////////////Syndicate infiltrator//////////////////////////// /area/shuttle/syndicate name = "Syndicate Infiltrator" - blob_allowed = FALSE - ambient_effects = HIGHSEC + ambience_index = AMBIENCE_DANGER canSmoothWithAreas = /area/shuttle/syndicate /area/shuttle/syndicate/bridge @@ -58,7 +70,6 @@ /area/shuttle/pirate name = "Pirate Shuttle" - blob_allowed = FALSE requires_power = TRUE canSmoothWithAreas = /area/shuttle/pirate @@ -67,14 +78,12 @@ /area/shuttle/hunter name = "Hunter Shuttle" dynamic_lighting = DYNAMIC_LIGHTING_DISABLED - blob_allowed = FALSE canSmoothWithAreas = /area/shuttle/hunter ////////////////////////////White Ship//////////////////////////// /area/shuttle/abandoned name = "Abandoned Ship" - blob_allowed = FALSE requires_power = TRUE canSmoothWithAreas = /area/shuttle/abandoned @@ -115,41 +124,44 @@ /area/shuttle/arrival name = "Arrival Shuttle" - unique = TRUE // SSjob refers to this area for latejoiners + area_flags = UNIQUE_AREA// SSjob refers to this area for latejoiners /area/shuttle/pod_1 name = "Escape Pod One" + area_flags = BLOBS_ALLOWED /area/shuttle/pod_2 name = "Escape Pod Two" + area_flags = BLOBS_ALLOWED /area/shuttle/pod_3 name = "Escape Pod Three" + area_flags = BLOBS_ALLOWED /area/shuttle/pod_4 name = "Escape Pod Four" + area_flags = BLOBS_ALLOWED /area/shuttle/mining name = "Mining Shuttle" - blob_allowed = FALSE /area/shuttle/mining/large name = "Mining Shuttle" - blob_allowed = FALSE requires_power = TRUE /area/shuttle/science name = "Science Shuttle" - blob_allowed = FALSE + requires_power = TRUE + +/area/shuttle/exploration + name = "Exploration Shuttle" requires_power = TRUE /area/shuttle/labor name = "Labor Camp Shuttle" - blob_allowed = FALSE /area/shuttle/supply name = "Supply Shuttle" - blob_allowed = FALSE /area/shuttle/escape name = "Emergency Shuttle" @@ -159,11 +171,11 @@ /area/shuttle/escape/luxury name = "Luxurious Emergency Shuttle" - noteleport = TRUE + teleport_restriction = TELEPORT_ALLOW_NONE /area/shuttle/escape/arena name = "The Arena" - noteleport = TRUE + teleport_restriction = TELEPORT_ALLOW_NONE /area/shuttle/escape/meteor name = "\proper a meteor with engines strapped to it" @@ -171,34 +183,26 @@ /area/shuttle/transport name = "Transport Shuttle" - blob_allowed = FALSE /area/shuttle/assault_pod name = "Steel Rain" - blob_allowed = FALSE /area/shuttle/sbc_starfury name = "SBC Starfury" - blob_allowed = FALSE /area/shuttle/sbc_fighter1 name = "SBC Fighter 1" - blob_allowed = FALSE /area/shuttle/sbc_fighter2 name = "SBC Fighter 2" - blob_allowed = FALSE /area/shuttle/sbc_corvette name = "SBC corvette" - blob_allowed = FALSE /area/shuttle/syndicate_scout name = "Syndicate Scout" - blob_allowed = FALSE /area/shuttle/caravan - blob_allowed = FALSE requires_power = TRUE /area/shuttle/caravan/syndicate1 diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 48e034c071b05..68458f190ea26 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1,3 +1,4 @@ + /** * The base type for nearly all physical objects in SS13 @@ -7,6 +8,7 @@ /atom layer = TURF_LAYER plane = GAME_PLANE + appearance_flags = TILE_BOUND var/level = 2 ///If non-null, overrides a/an/some in all cases @@ -46,6 +48,9 @@ ///vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays var/list/managed_vis_overlays + ///overlays managed by update_overlays() to prevent removing overlays that weren't added by the same proc + var/list/managed_overlays + ///Proximity monitor associated with this atom var/datum/proximity_monitor/proximity_monitor ///Cooldown tick timer for buckle messages @@ -73,6 +78,25 @@ ///Bitfield for how the atom handles materials. var/material_flags = NONE + 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 + + /// 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 + + ///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy() + var/list/targeted_by + + ///AI controller that controls this atom. type on init, then turned into an instance during runtime + var/datum/ai_controller/ai_controller + + /// Lazylist of all messages currently on this atom + var/list/chat_messages /** * Called when an atom is created in byond (built in engine proc) @@ -95,7 +119,7 @@ var/do_initialize = SSatoms.initialized if(do_initialize != INITIALIZATION_INSSATOMS) args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD - if(SSatoms.InitAtom(src, args)) + if(SSatoms.InitAtom(src, FALSE, args)) //we were deleted return @@ -138,6 +162,9 @@ stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 + if(loc) + SEND_SIGNAL(loc, COMSIG_ATOM_CREATED, src) /// Sends a signal that the new atom `src`, has been created at `loc` + //atom color stuff if(color) add_atom_colour(color, FIXED_COLOUR_PRIORITY) @@ -163,6 +190,7 @@ set_custom_materials(temp_list) ComponentInitialize() + InitializeAIController() return INITIALIZE_HINT_NORMAL @@ -202,19 +230,39 @@ AA.remove_from_hud(src) if(reagents) - qdel(reagents) + QDEL_NULL(reagents) orbiters = null // The component is attached to us normaly and will be deleted elsewhere LAZYCLEARLIST(overlays) LAZYCLEARLIST(priority_overlays) + LAZYCLEARLIST(managed_overlays) + + for(var/i in targeted_by) + var/mob/M = i + LAZYREMOVE(M.do_afters, src) + + targeted_by = null QDEL_NULL(light) + QDEL_NULL(ai_controller) return ..() /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 ///Can the mover object pass this atom, while heading for the target turf /atom/proc/CanPass(atom/movable/mover, turf/target) @@ -314,6 +362,7 @@ L.transferItemToLoc(M, src) else M.forceMove(src) + parts_list.Cut() ///Hook for multiz??? /atom/proc/update_multiz(prune_on_fail = FALSE) @@ -321,13 +370,27 @@ ///Take air from the passed in gas mixture datum /atom/proc/assume_air(datum/gas_mixture/giver) - qdel(giver) + return null + +/atom/proc/assume_air_moles(datum/gas_mixture/giver, moles) + return null + +/atom/proc/assume_air_ratio(datum/gas_mixture/giver, ratio) return null ///Remove air from this atom /atom/proc/remove_air(amount) return null +/atom/proc/remove_air_ratio(ratio) + return null + +/atom/proc/transfer_air(datum/gas_mixture/taker, amount) + return null + +/atom/proc/transfer_air_ratio(datum/gas_mixture/taker, ratio) + return null + ///Return the current air environment in this atom /atom/proc/return_air() if(loc) @@ -473,14 +536,30 @@ /// Updates the icon of the atom /atom/proc/update_icon() + SIGNAL_HANDLER + // I expect we're going to need more return flags and options in this proc var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON) if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE)) update_icon_state() + if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS)) + var/list/new_overlays = update_overlays() + if(managed_overlays) + cut_overlay(managed_overlays) + managed_overlays = null + if(length(new_overlays)) + managed_overlays = new_overlays + add_overlay(new_overlays) /// Updates the icon state of the atom /atom/proc/update_icon_state() +/// Updates the overlays of the atom +/atom/proc/update_overlays() + SHOULD_CALL_PARENT(TRUE) + . = list() + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .) + /** * An atom we are buckled or is contained within us has tried to move * @@ -493,10 +572,6 @@ to_chat(user, "You can't move while buckled to [src]!") return -/// Return true if this atoms contents should not have ex_act called on ex_act -/atom/proc/prevent_content_explosion() - return FALSE - /// Handle what happens when your contents are exploded by a bomb /atom/proc/contents_explosion(severity, target) return //For handling the effects of explosions on contents that would not normally be effected @@ -535,6 +610,7 @@ * throw lots of items around - singularity being a notable example) */ /atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + SEND_SIGNAL(src, COMSIG_ATOM_HITBY, AM, skipcatch, hitpush, blocked, throwingdatum) if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...). addtimer(CALLBACK(src, .proc/hitby_react, AM), 2) @@ -663,6 +739,12 @@ /atom/proc/ratvar_act() SEND_SIGNAL(src, COMSIG_ATOM_RATVAR_ACT) +/** + * Called when lighteater is called on this. + */ +/atom/proc/lighteater_act(obj/item/light_eater/light_eater) + return + /** * Respond to the eminence clicking on our atom * @@ -886,6 +968,8 @@ 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") + VV_DROPDOWN_OPTION(VV_HK_EDIT_FILTERS, "Edit Filters") + VV_DROPDOWN_OPTION(VV_HK_ADD_AI, "Add AI controller") /atom/vv_do_topic(list/href_list) . = ..() @@ -948,6 +1032,17 @@ var/newname = input(usr, "What do you want to rename this to?", "Automatic Rename") as null|text if(newname) vv_auto_rename(newname) + if(href_list[VV_HK_ADD_AI]) + if(!check_rights(R_VAREDIT)) + return + var/result = input(usr, "Choose the AI controller to apply to this atom WARNING: Not all AI works on all atoms.", "AI controller") as null|anything in subtypesof(/datum/ai_controller) + if(!result) + return + ai_controller = new result(src) + + if(href_list[VV_HK_EDIT_FILTERS] && check_rights(R_VAREDIT)) + var/client/C = usr.client + C?.open_filter_editor(src) /atom/vv_get_header() . = ..() @@ -1006,6 +1101,10 @@ * Must return parent proc ..() in the end if overridden */ /atom/proc/tool_act(mob/living/user, obj/item/I, tool_type) + var/signal_result + signal_result = SEND_SIGNAL(src, COMSIG_ATOM_TOOL_ACT(tool_type), user, I) + if(signal_result & COMPONENT_BLOCK_TOOL_ATTACK) // The COMSIG_ATOM_TOOL_ACT signal is blocking the act + return TOOL_ACT_SIGNAL_BLOCKING switch(tool_type) if(TOOL_CROWBAR) return crowbar_act(user, I) @@ -1043,7 +1142,7 @@ ///Screwdriver act /atom/proc/screwdriver_act(mob/living/user, obj/item/I) - SEND_SIGNAL(src, COMSIG_ATOM_SCREWDRIVER_ACT, user, I) + return ///Wrench act /atom/proc/wrench_act(mob/living/user, obj/item/I) @@ -1160,14 +1259,14 @@ var/reverse_message = "has been [what_done] by [ssource][postfix]" target.log_message(reverse_message, LOG_ATTACK, color="orange", log_globally=FALSE) -/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) @@ -1175,15 +1274,48 @@ var/list/arguments = data.Copy() arguments -= "priority" filters += filter(arglist(arguments)) + UNSETEMPTY(filter_data) + +/atom/proc/transition_filter(name, time, list/new_params, easing, loop) + var/filter = get_filter(name) + if(!filter) + return + + var/list/old_filter_data = filter_data[name] + + var/list/params = old_filter_data.Copy() + for(var/thing in new_params) + params[thing] = new_params[thing] -/atom/movable/proc/get_filter(name) + animate(filter, new_params, time = time, easing = easing, loop = loop) + for(var/param in params) + filter_data[name][param] = params[param] + +/atom/proc/change_filter_priority(name, new_priority) + if(!filter_data || !filter_data[name]) + return + + filter_data[name]["priority"] = new_priority + update_filters() + +/atom/proc/get_filter(name) if(filter_data && filter_data[name]) return filters[filter_data.Find(name)] -/atom/movable/proc/remove_filter(name) - if(filter_data && filter_data[name]) - filter_data -= name - update_filters() +/atom/proc/remove_filter(name_or_names) + if(!filter_data) + return + + var/list/names = islist(name_or_names) ? name_or_names : list(name_or_names) + + for(var/name in names) + if(filter_data[name]) + filter_data -= name + update_filters() + +/atom/proc/clear_filters() + filter_data = null + filters = null /atom/proc/intercept_zImpact(atom/movable/AM, levels = 1) . |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels) @@ -1213,3 +1345,28 @@ */ /atom/proc/rust_heretic_act() return + +/** + * Used to set something as 'open' if it's being used as a supplypod + * + * Override this if you want an atom to be usable as a supplypod. + */ +/atom/proc/setOpened() + return + +/** + * Used to set something as 'closed' if it's being used as a supplypod + * + * Override this if you want an atom to be usable as a supplypod. + */ +/atom/proc/setClosed() + return + +/** +* Instantiates the AI controller of this atom. Override this if you want to assign variables first. +* +* This will work fine without manually passing arguments. ++*/ +/atom/proc/InitializeAIController() + if(ai_controller) + ai_controller = new ai_controller(src) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index c9cf118809854..d8eec70b69730 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -41,6 +41,56 @@ var/zfalling = FALSE + /// Either FALSE, [EMISSIVE_BLOCK_GENERIC], or [EMISSIVE_BLOCK_UNIQUE] + var/blocks_emissive = FALSE + ///Internal holder for emissive blocker object, do not use directly use blocks_emissive + var/atom/movable/emissive_blocker/em_block + /** + * an associative lazylist of relevant nested contents by "channel", the list is of the form: list(channel = list(important nested contents of that type)) + * each channel has a specific purpose and is meant to replace potentially expensive nested contents iteration + * do NOT add channels to this for little reason as it can add considerable memory usage. + */ + var/list/important_recursive_contents + + +/atom/movable/Initialize(mapload) + . = ..() + switch(blocks_emissive) + if(EMISSIVE_BLOCK_GENERIC) + var/mutable_appearance/gen_emissive_blocker = mutable_appearance(icon, icon_state, EMISSIVE_BLOCKER_LAYER, EMISSIVE_BLOCKER_PLANE) + gen_emissive_blocker.dir = dir + gen_emissive_blocker.alpha = alpha + gen_emissive_blocker.appearance_flags |= appearance_flags + add_overlay(list(gen_emissive_blocker)) + if(EMISSIVE_BLOCK_UNIQUE) + render_target = ref(src) + em_block = new(src, render_target) + + QDEL_NULL(em_block) + + if(pulling) + stop_pulling() + + +/atom/movable/proc/update_emissive_block() + if(!blocks_emissive) + return + else if (blocks_emissive == EMISSIVE_BLOCK_GENERIC) + var/mutable_appearance/gen_emissive_blocker = mutable_appearance(icon, icon_state, EMISSIVE_BLOCKER_LAYER, EMISSIVE_BLOCKER_PLANE) + gen_emissive_blocker.dir = dir + gen_emissive_blocker.alpha = alpha + gen_emissive_blocker.appearance_flags |= appearance_flags + return gen_emissive_blocker + else if(blocks_emissive == EMISSIVE_BLOCK_UNIQUE) + if(!em_block && !QDELETED(src)) + render_target = ref(src) + em_block = new(src, render_target) + return em_block + +/atom/movable/update_overlays() + . = ..() + . += update_emissive_block() + /atom/movable/proc/can_zFall(turf/source, levels = 1, turf/target, direction) if(!direction) direction = DOWN @@ -334,8 +384,8 @@ 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))) + //puller and pullee more than one tile away or in diagonal position and whatever the pullee is pulling isn't already moving from a pull as it'll most likely result in an infinite loop a la ouroborus. + if(!pulling.pulling?.moving_from_pull && (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 pulling.moving_from_pull = null @@ -381,6 +431,10 @@ orbiting.end_orbit(src) orbiting = null + LAZYCLEARLIST(important_recursive_contents) + + vis_contents.Cut() + // Make sure you know what you're doing if you call this, this is intended to only be called by byond directly. // You probably want CanPass() /atom/movable/Cross(atom/movable/AM) @@ -408,7 +462,7 @@ SEND_SIGNAL(src, COMSIG_MOVABLE_BUMP, A) . = ..() if(!QDELETED(throwing)) - throwing.hit_atom(A) + throwing.finalize(hit = TRUE, target = A) . = TRUE if(QDELETED(A)) return @@ -416,6 +470,9 @@ /atom/movable/proc/forceMove(atom/destination) . = FALSE + if(destination == null) //destination destroyed due to explosion + return + if(destination) . = doMove(destination) else @@ -526,15 +583,19 @@ /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)))) step(src, AM.dir) - ..() + ..(AM, skipcatch, hitpush, blocked, throwingdatum) /atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG) if((force < (move_resist * MOVE_FORCE_THROW_RATIO)) || (move_resist == INFINITY)) return return throw_at(target, range, speed, thrower, spin, diagonals_first, callback, force) -/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG) //If this returns FALSE then callback will not be called. +/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, quickstart = TRUE) //If this returns FALSE then callback will not be called. . = FALSE + + if(QDELETED(src)) + CRASH("Qdeleted thing being thrown around.") + if (!target || speed <= 0) return @@ -570,20 +631,14 @@ . = TRUE // No failure conditions past this point. - var/datum/thrownthing/TT = new() - TT.thrownthing = src - TT.target = target - TT.target_turf = get_turf(target) - TT.init_dir = get_dir(src, target) - TT.maxrange = range - TT.speed = speed - TT.thrower = thrower - TT.diagonals_first = diagonals_first - TT.force = force - TT.callback = callback - if(!QDELETED(thrower)) - TT.target_zone = thrower.zone_selected - + var/target_zone + if(QDELETED(thrower) || !istype(thrower)) + thrower = null //Let's not pass an invalid reference. + else + target_zone = thrower.zone_selected + + var/datum/thrownthing/TT = new(src, target, get_dir(src, target), range, speed, thrower, diagonals_first, force, callback, target_zone) + var/dist_x = abs(target.x - src.x) var/dist_y = abs(target.y - src.y) var/dx = (target.x > src.x) ? EAST : WEST @@ -608,6 +663,7 @@ if(pulledby) pulledby.stop_pulling() + movement_type |= THROWN throwing = TT if(spin) @@ -617,7 +673,9 @@ SSthrowing.processing[src] = TT if (SSthrowing.state == SS_PAUSED && length(SSthrowing.currentrun)) SSthrowing.currentrun[src] = TT - TT.tick() + + if(quickstart) + TT.tick() /atom/movable/proc/handle_buckled_mob_movement(newloc,direct) for(var/m in buckled_mobs) @@ -678,10 +736,13 @@ break . = dense_object_backup -//called when a mob resists while inside a container that is itself inside something. -/atom/movable/proc/relay_container_resist(mob/living/user, obj/O) +//Called when something resists while this atom is its loc +/atom/movable/proc/container_resist(mob/living/user) return +//Called when a mob resists while inside a container that is itself inside something. +/atom/movable/proc/relay_container_resist(mob/living/user, obj/O) + return /atom/movable/proc/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) if(!no_effect && (visual_effect_icon || used_item)) @@ -761,9 +822,8 @@ if(throwing) return if(on && !(movement_type & FLOATING)) - animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1) - sleep(10) - animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1) + animate(src, pixel_y = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE) + animate(pixel_y = -2, time = 10, loop = -1, flags = ANIMATION_RELATIVE) setMovetype(movement_type | FLOATING) else if (!on && (movement_type & FLOATING)) animate(src, pixel_y = initial(pixel_y), time = 10) @@ -904,3 +964,40 @@ animate(I, alpha = 175, pixel_x = to_x, pixel_y = to_y, time = 3, transform = M, easing = CUBIC_EASING) sleep(1) animate(I, alpha = 0, transform = matrix(), time = 1) + +/atom/movable/proc/get_spawner_desc() + return name + +/atom/movable/proc/get_spawner_flavour_text() + return desc + +/atom/movable/proc/on_hearing_sensitive_trait_loss() + SIGNAL_HANDLER + + UnregisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_HEARING_SENSITIVE)) + for(var/atom/movable/location as anything in get_nested_locs(src) + src) + LAZYREMOVEASSOC(location.important_recursive_contents, RECURSIVE_CONTENTS_HEARING_SENSITIVE, src) + +///allows this movable to hear and adds itself to the important_recursive_contents list of itself and every movable loc its in +/atom/movable/proc/become_hearing_sensitive(trait_source = TRAIT_GENERIC) + if(!HAS_TRAIT(src, TRAIT_HEARING_SENSITIVE)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_HEARING_SENSITIVE), .proc/on_hearing_sensitive_trait_loss) + for(var/atom/movable/location as anything in get_nested_locs(src) + src) + LAZYADDASSOCLIST(location.important_recursive_contents, RECURSIVE_CONTENTS_HEARING_SENSITIVE, src) + ADD_TRAIT(src, TRAIT_HEARING_SENSITIVE, trait_source) + +/atom/movable/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + . = ..() + if(LAZYLEN(arrived.important_recursive_contents)) + var/list/nested_locs = get_nested_locs(src) + src + for(var/channel in arrived.important_recursive_contents) + for(var/atom/movable/location as anything in nested_locs) + LAZYORASSOCLIST(location.important_recursive_contents, channel, arrived.important_recursive_contents[channel]) + +/atom/movable/Exited(atom/movable/gone, direction) + . = ..() + if(LAZYLEN(gone.important_recursive_contents)) + var/list/nested_locs = get_nested_locs(src) + src + for(var/channel in gone.important_recursive_contents) + for(var/atom/movable/location as anything in nested_locs) + LAZYREMOVEASSOC(location.important_recursive_contents, channel, gone.important_recursive_contents[channel]) diff --git a/code/game/communications.dm b/code/game/communications.dm index 696b942434f75..50e2173470d11 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -101,6 +101,7 @@ GLOBAL_LIST_INIT(radiochannels, list( RADIO_CHANNEL_SYNDICATE = FREQ_SYNDICATE, RADIO_CHANNEL_SUPPLY = FREQ_SUPPLY, RADIO_CHANNEL_SERVICE = FREQ_SERVICE, + RADIO_CHANNEL_EXPLORATION = FREQ_EXPLORATION, RADIO_CHANNEL_AI_PRIVATE = FREQ_AI_PRIVATE, RADIO_CHANNEL_CTF_RED = FREQ_CTF_RED, RADIO_CHANNEL_CTF_BLUE = FREQ_CTF_BLUE @@ -116,6 +117,7 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( "[FREQ_CENTCOM]" = RADIO_CHANNEL_CENTCOM, "[FREQ_SYNDICATE]" = RADIO_CHANNEL_SYNDICATE, "[FREQ_SUPPLY]" = RADIO_CHANNEL_SUPPLY, + "[FREQ_EXPLORATION]" = RADIO_CHANNEL_EXPLORATION, "[FREQ_SERVICE]" = RADIO_CHANNEL_SERVICE, "[FREQ_AI_PRIVATE]" = RADIO_CHANNEL_AI_PRIVATE, "[FREQ_CTF_RED]" = RADIO_CHANNEL_CTF_RED, @@ -123,8 +125,9 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( )) /datum/radio_frequency - var/frequency as num - var/list/list/obj/devices = list() + var/frequency + /// List of filters -> list of devices + var/list/list/datum/weakref/devices = list() /datum/radio_frequency/New(freq) frequency = freq @@ -154,14 +157,18 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( //Send the data for(var/current_filter in filter_list) - for(var/obj/device in devices[current_filter]) + for(var/datum/weakref/device_ref as anything in devices[current_filter]) + var/obj/device = device_ref.resolve() + if(!device) + devices[current_filter] -= device_ref + continue if(device == source) continue if(range) var/turf/end_point = get_turf(device) if(!end_point) continue - if(start_point.z != end_point.z || (range > 0 && get_dist(start_point, end_point) > range)) + if(start_point.get_virtual_z_level() != end_point.get_virtual_z_level() || (range > 0 && get_dist(start_point, end_point) > range)) continue device.receive_signal(signal) @@ -172,7 +179,7 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( var/list/devices_line = devices[filter] if(!devices_line) devices[filter] = devices_line = list() - devices_line += device + devices_line += WEAKREF(device) /datum/radio_frequency/proc/remove_listener(obj/device) @@ -180,7 +187,7 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( var/list/devices_line = devices[devices_filter] if(!devices_line) devices -= devices_filter - devices_line -= device + devices_line -= WEAKREF(device) if(!devices_line.len) devices -= devices_filter diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index a12ca8ee95bb2..1a0e5b05fc668 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -72,8 +72,8 @@ /datum/atom_hud/ai_detector/add_hud_to(mob/M) ..() if(M && (hudusers.len == 1)) - for(var/V in GLOB.aiEyes) - var/mob/camera/aiEye/E = V + for(var/V in GLOB.ai_eyes) + var/mob/camera/ai_eye/E = V E.update_ai_detect_hud() /* MED/SEC/DIAG HUD HOOKS */ @@ -91,14 +91,14 @@ //called when a carbon changes virus /mob/living/carbon/proc/check_virus() var/threat - var/severity + var/danger for(var/thing in diseases) var/datum/disease/D = thing if(!(D.visibility_flags & HIDDEN_SCANNER)) - if(!threat || get_disease_severity_value(D.severity) > threat) //a buffing virus gets an icon - threat = get_disease_severity_value(D.severity) - severity = D.severity - return severity + if(!threat || get_disease_danger_value(D.danger) > threat) //a buffing virus gets an icon + threat = get_disease_danger_value(D.danger) + danger = D.danger + return danger //helper for getting the appropriate health status /proc/RoundHealth(mob/living/M) @@ -160,9 +160,12 @@ //called when a living mob changes health /mob/living/proc/med_hud_set_health() var/image/holder = hud_list[HEALTH_HUD] - holder.icon_state = "hud[RoundHealth(src)]" - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + if(holder) + holder.icon_state = "hud[RoundHealth(src)]" + var/icon/I = icon(icon, icon_state, dir) + holder.pixel_y = I.Height() - world.icon_size + else + stack_trace("[src] does not have a HEALTH_HUD but updates it!") //for carbon suit sensors /mob/living/carbon/med_hud_set_health() @@ -171,49 +174,55 @@ //called when a carbon changes stat, virus or XENO_HOST /mob/living/proc/med_hud_set_status() var/image/holder = hud_list[STATUS_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) - holder.icon_state = "huddead" + if(holder) + var/icon/I = icon(icon, icon_state, dir) + holder.pixel_y = I.Height() - world.icon_size + if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) + holder.icon_state = "huddead" + else + holder.icon_state = "hudhealthy" else - holder.icon_state = "hudhealthy" + stack_trace("[src] does not have a HEALTH_HUD but updates it!") /mob/living/carbon/med_hud_set_status() var/image/holder = hud_list[STATUS_HUD] - var/icon/I = icon(icon, icon_state, dir) - var/virus_threat = check_virus() - holder.pixel_y = I.Height() - world.icon_size - if(HAS_TRAIT(src, TRAIT_XENO_HOST)) - holder.icon_state = "hudxeno" - else if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) - if(tod) - var/tdelta = round(world.time - timeofdeath) - if(tdelta < (DEFIB_TIME_LIMIT * 10)) - holder.icon_state = "huddefib" - return - holder.icon_state = "huddead" + if(holder) + var/icon/I = icon(icon, icon_state, dir) + var/virus_threat = check_virus() + holder.pixel_y = I.Height() - world.icon_size + if(HAS_TRAIT(src, TRAIT_XENO_HOST)) + holder.icon_state = "hudxeno" + else if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) + if(tod) + var/tdelta = round(world.time - timeofdeath) + if(tdelta < (DEFIB_TIME_LIMIT * 10)) + holder.icon_state = "huddefib" + return + holder.icon_state = "huddead" + else + switch(virus_threat) + if(DISEASE_PANDEMIC) + holder.icon_state = "hudill6" + if(DISEASE_BIOHAZARD) + holder.icon_state = "hudill5" + if(DISEASE_DANGEROUS) + holder.icon_state = "hudill4" + if(DISEASE_HARMFUL) + holder.icon_state = "hudill3" + if(DISEASE_MEDIUM) + holder.icon_state = "hudill2" + if(DISEASE_MINOR) + holder.icon_state = "hudill1" + if(DISEASE_NONTHREAT) + holder.icon_state = "hudill0" + if(DISEASE_POSITIVE) + holder.icon_state = "hudbuff" + if(DISEASE_BENEFICIAL) + holder.icon_state = "hudbuff2" + if(null) + holder.icon_state = "hudhealthy" else - switch(virus_threat) - if(DISEASE_SEVERITY_PANDEMIC) - holder.icon_state = "hudill6" - if(DISEASE_SEVERITY_BIOHAZARD) - holder.icon_state = "hudill5" - if(DISEASE_SEVERITY_DANGEROUS) - holder.icon_state = "hudill4" - if(DISEASE_SEVERITY_HARMFUL) - holder.icon_state = "hudill3" - if(DISEASE_SEVERITY_MEDIUM) - holder.icon_state = "hudill2" - if(DISEASE_SEVERITY_MINOR) - holder.icon_state = "hudill1" - if(DISEASE_SEVERITY_NONTHREAT) - holder.icon_state = "hudill0" - if(DISEASE_SEVERITY_POSITIVE) - holder.icon_state = "hudbuff" - if(DISEASE_SEVERITY_BENEFICIAL) - holder.icon_state = "hudbuff2" - if(null) - holder.icon_state = "hudhealthy" + stack_trace("[src] does not have a HEALTH_HUD but updates it!") /*********************************************** @@ -247,7 +256,7 @@ var/icon/IC = icon(icon, icon_state, dir) holder.pixel_y = IC.Height() - world.icon_size holder.icon_state = "hud_imp_chem" - if(HAS_TRAIT(src, TRAIT_MINDSHIELD) && !istype(src.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) //tinfoil hats interfere with implant detection + if(HAS_TRAIT(src, TRAIT_MINDSHIELD) && !istype(src.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) //tinfoil hats interfere with implant detection holder = hud_list[IMPLOYAL_HUD] var/icon/IC = icon(icon, icon_state, dir) holder.pixel_y = IC.Height() - world.icon_size @@ -262,7 +271,7 @@ var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.security) if(R) switch(R.fields["criminal"]) - if("*Arrest*") + if("Arrest") holder.icon_state = "hudwanted" return if("Incarcerated") @@ -274,6 +283,12 @@ if("Discharged") holder.icon_state = "huddischarged" return + if("Search") + holder.icon_state = "hudsearch" + return + if("Monitor") + holder.icon_state = "hudmonitor" + return holder.icon_state = null /*********************************************** @@ -454,53 +469,3 @@ holder.icon_state = "electrified" else holder.icon_state = "" - -/*~~~~~~~~~~~~ - Circutry! -~~~~~~~~~~~~~*/ -/obj/item/electronic_assembly/proc/diag_hud_set_circuithealth(hide = FALSE) - var/image/holder = hud_list[DIAG_CIRCUIT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - if((!isturf(loc))||hide) //if not on the ground dont show overlay - holder.icon_state = null - else - holder.icon_state = "huddiag[RoundDiagBar(obj_integrity/max_integrity)]" - -/obj/item/electronic_assembly/proc/diag_hud_set_circuitcell(hide = FALSE) - var/image/holder = hud_list[DIAG_BATT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - if((!isturf(loc))||hide) //if not on the ground dont show overlay - holder.icon_state = null - else if(battery) - var/chargelvl = battery.charge/battery.maxcharge - holder.icon_state = "hudbatt[RoundDiagBar(chargelvl)]" - else - holder.icon_state = "hudnobatt" - -/obj/item/electronic_assembly/proc/diag_hud_set_circuitstat(hide = FALSE) //On, On and dangerous, or Off - var/image/holder = hud_list[DIAG_STAT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - if((!isturf(loc))||hide) //if not on the ground don't show overlay - holder.icon_state = null - else if(!battery) - holder.icon_state = "hudoffline" - else if(battery.charge == 0) - holder.icon_state = "hudoffline" - else if(combat_circuits) //has a circuit that can harm people - holder.icon_state = prefered_hud_icon + "-red" - else //Bot is on and not dangerous - holder.icon_state = prefered_hud_icon - -/obj/item/electronic_assembly/proc/diag_hud_set_circuittracking(hide = FALSE) - var/image/holder = hud_list[DIAG_TRACK_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - if((!isturf(loc))||hide) //if not on the ground dont show overlay - holder.icon_state = null - else if(long_range_circuits) - holder.icon_state = "hudtracking" - else - holder.icon_state = null diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index f961da979328d..d7257af93e4f9 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -1,7 +1,9 @@ GLOBAL_LIST_INIT(possible_changeling_IDs, list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega")) GLOBAL_LIST_INIT(slots, list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store")) -GLOBAL_LIST_INIT(slot2slot, list("head" = SLOT_HEAD, "wear_mask" = SLOT_WEAR_MASK, "neck" = SLOT_NECK, "back" = SLOT_BACK, "wear_suit" = SLOT_WEAR_SUIT, "w_uniform" = SLOT_W_UNIFORM, "shoes" = SLOT_SHOES, "belt" = SLOT_BELT, "gloves" = SLOT_GLOVES, "glasses" = SLOT_GLASSES, "ears" = SLOT_EARS, "wear_id" = SLOT_WEAR_ID, "s_store" = SLOT_S_STORE)) -GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "wear_mask" = /obj/item/clothing/mask/changeling, "back" = /obj/item/changeling, "wear_suit" = /obj/item/clothing/suit/changeling, "w_uniform" = /obj/item/clothing/under/changeling, "shoes" = /obj/item/clothing/shoes/changeling, "belt" = /obj/item/changeling, "gloves" = /obj/item/clothing/gloves/changeling, "glasses" = /obj/item/clothing/glasses/changeling, "ears" = /obj/item/changeling, "wear_id" = /obj/item/changeling, "s_store" = /obj/item/changeling)) + +GLOBAL_LIST_INIT(slot2slot, list("head" = ITEM_SLOT_HEAD, "wear_mask" = ITEM_SLOT_MASK, "neck" = ITEM_SLOT_NECK, "back" = ITEM_SLOT_BACK, "wear_suit" = ITEM_SLOT_OCLOTHING, "w_uniform" = ITEM_SLOT_ICLOTHING, "shoes" = ITEM_SLOT_FEET, "belt" = ITEM_SLOT_BELT, "gloves" = ITEM_SLOT_GLOVES, "glasses" = ITEM_SLOT_EYES, "ears" = ITEM_SLOT_EARS, "wear_id" = ITEM_SLOT_ID, "s_store" = ITEM_SLOT_SUITSTORE)) +GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "wear_mask" = /obj/item/clothing/mask/changeling, "back" = /obj/item/changeling, "wear_suit" = /obj/item/clothing/suit/changeling, "w_uniform" = /obj/item/clothing/under/changeling, "shoes" = /obj/item/clothing/shoes/changeling, "belt" = /obj/item/changeling, "gloves" = /obj/item/clothing/gloves/changeling, "glasses" = /obj/item/clothing/glasses/changeling, "ears" = /obj/item/changeling, "wear_id" = /obj/item/changeling/id, "s_store" = /obj/item/changeling)) + /datum/game_mode/changeling @@ -11,7 +13,7 @@ GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "w antag_flag = ROLE_CHANGELING false_report_weight = 10 restricted_jobs = list("AI", "Cyborg") - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Brig Physician") + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") required_players = 15 required_enemies = 1 recommended_enemies = 4 @@ -113,6 +115,9 @@ GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "w if((user.vars[slot] && !istype(user.vars[slot], GLOB.slot2type[slot])) || !(chosen_prof.exists_list[slot])) continue + if(istype(user.vars[slot], GLOB.slot2type[slot]) && slot == "wear_id") //always remove old flesh IDs, so they get properly updated + qdel(user.vars[slot]) + var/obj/item/C var/equip = 0 if(!user.vars[slot]) @@ -128,8 +133,15 @@ GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "w 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(istype(C, /obj/item/changeling/id) && chosen_prof.id_icon) + var/obj/item/changeling/id/flesh_id = C + flesh_id.hud_icon = chosen_prof.id_icon + if(equip) user.equip_to_slot_or_del(C, GLOB.slot2slot[slot]) + if(!QDELETED(C)) + ADD_TRAIT(C, TRAIT_NODROP, CHANGELING_TRAIT) user.regenerate_icons() diff --git a/code/game/gamemodes/clock_cult/clockcult.dm b/code/game/gamemodes/clock_cult/clockcult.dm index fd54fd0bdb1d4..64b5c64fdc6d5 100644 --- a/code/game/gamemodes/clock_cult/clockcult.dm +++ b/code/game/gamemodes/clock_cult/clockcult.dm @@ -41,21 +41,19 @@ GLOBAL_VAR(clockcult_eminence) Servants: Convert more servants and defend the Ark of the Clockwork Justicar!\n\ Crew: Prepare yourselfs and destroy the Ark of the Clockwork Justicar." + var/clock_cultists = CLOCKCULT_SERVANTS var/list/selected_servants = list() var/datum/team/clock_cult/main_cult +/datum/game_mode/clockcult/setup_maps() + //Since we are loading in pre_setup, disable map loading. + SSticker.gamemode_hotswap_disabled = TRUE + LoadReebe() + return TRUE + /datum/game_mode/clockcult/pre_setup() - //Load Reebe - var/list/errorList = list() - var/list/reebe = SSmapping.LoadGroup(errorList, "Reebe", "map_files/generic", "CityOfCogs.dmm", default_traits=ZTRAITS_REEBE, silent=TRUE) - if(errorList.len) - message_admins("Reebe failed to load") - log_game("Reebe failed to load") - return FALSE - for(var/datum/parsed_map/map in reebe) - map.initTemplateBounds() //Generate cultists for(var/i in 1 to clock_cultists) if(!antag_candidates.len) @@ -65,10 +63,7 @@ GLOBAL_VAR(clockcult_eminence) selected_servants += clockie clockie.assigned_role = ROLE_SERVANT_OF_RATVAR clockie.special_role = ROLE_SERVANT_OF_RATVAR - //Generate scriptures - for(var/categorypath in typesof(/datum/clockcult/scripture)) - var/datum/clockcult/scripture/S = new categorypath - GLOB.clockcult_all_scriptures[S.name] = S + generate_clockcult_scriptures() return TRUE /datum/game_mode/clockcult/post_setup(report) @@ -82,7 +77,7 @@ GLOBAL_VAR(clockcult_eminence) var/datum/antagonist/servant_of_ratvar/S = add_servant_of_ratvar(servant_mind.current, team=main_cult) S.equip_carbon(servant_mind.current) S.equip_servant() - S.prefix = CLOCKCULT_MASTER + S.prefix = CLOCKCULT_PREFIX_MASTER //Setup the conversion limits for auto opening the ark calculate_clockcult_values() return ..() @@ -157,7 +152,7 @@ GLOBAL_VAR(clockcult_eminence) return FALSE if(ishuman(M) && (M.mind.assigned_role in list("Captain", "Chaplain"))) return FALSE - if(istype(M.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(istype(M.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) return FALSE if(is_servant_of_ratvar(M)) return FALSE @@ -171,6 +166,12 @@ GLOBAL_VAR(clockcult_eminence) return FALSE return TRUE +/proc/generate_clockcult_scriptures() + //Generate scriptures + for(var/categorypath in subtypesof(/datum/clockcult/scripture)) + var/datum/clockcult/scripture/S = new categorypath + GLOB.clockcult_all_scriptures[S.name] = S + /proc/flee_reebe() for(var/mob/living/M in GLOB.mob_list) if(!is_reebe(M.z)) @@ -205,38 +206,42 @@ GLOBAL_VAR(clockcult_eminence) msg = sender.treat_message(msg) var/datum/antagonist/servant_of_ratvar/SoR = is_servant_of_ratvar(sender) var/prefix = "Clockbrother" - if(SoR.prefix) - prefix = sender.gender == MALE\ - ? "Clockfather"\ - : sender.gender == FEMALE\ - ? "Clockmother"\ - : "Clockmaster" - hierophant_message = "" - else - var/role = sender.mind?.assigned_role - //Ew, this could be done better with a dictionary list, but this isn't much slower - if(role in GLOB.command_positions) - prefix = "High Priest" - else if(role in GLOB.engineering_positions) - prefix = "Cogturner" - else if(role in GLOB.medical_positions) - prefix = "Rejuvinator" - else if(role in GLOB.science_positions) - prefix = "Calculator" - else if(role in GLOB.supply_positions) - prefix = "Pathfinder" - else if(role in "Assistant") - prefix = "Helper" - else if(role in "Mime") - prefix = "Cogwatcher" - else if(role in "Clown") - prefix = "Clonker" - else if(role in GLOB.civilian_positions) - prefix = "Cogworker" - else if(role in GLOB.security_positions) - prefix = "Warrior" - else if(role in GLOB.nonhuman_positions) - prefix = "CPU" + switch(SoR.prefix) + if(CLOCKCULT_PREFIX_EMINENCE) + prefix = "Master" + if(CLOCKCULT_PREFIX_MASTER) + prefix = sender.gender == MALE\ + ? "Clockfather"\ + : sender.gender == FEMALE\ + ? "Clockmother"\ + : "Clockmaster" + hierophant_message = "" + if(CLOCKCULT_PREFIX_RECRUIT) + var/role = sender.mind?.assigned_role + //Ew, this could be done better with a dictionary list, but this isn't much slower + if(role in GLOB.command_positions) + prefix = "High Priest" + else if(role in GLOB.engineering_positions) + prefix = "Cogturner" + else if(role in GLOB.medical_positions) + prefix = "Rejuvinator" + else if(role in GLOB.science_positions) + prefix = "Calculator" + else if(role in GLOB.supply_positions) + prefix = "Pathfinder" + else if(role in "Assistant") + prefix = "Helper" + else if(role in "Mime") + prefix = "Cogwatcher" + else if(role in "Clown") + prefix = "Clonker" + else if((role in GLOB.civilian_positions) || (role in GLOB.gimmick_positions)) + prefix = "Cogworker" + else if(role in GLOB.security_positions) + prefix = "Warrior" + else if(role in GLOB.nonhuman_positions) + prefix = "CPU" + //Fallthrough is default of "Clockbrother" hierophant_message += "[prefix] [sender.name] transmits, \"[msg]\"" else hierophant_message += msg diff --git a/code/game/gamemodes/clown_ops/bananium_bomb.dm b/code/game/gamemodes/clown_ops/bananium_bomb.dm index f8a61487c982a..8c4af7108a738 100644 --- a/code/game/gamemodes/clown_ops/bananium_bomb.dm +++ b/code/game/gamemodes/clown_ops/bananium_bomb.dm @@ -36,24 +36,24 @@ Cinematic(get_cinematic_type(off_station), world) for(var/mob/living/carbon/human/H in GLOB.carbon_list) var/turf/T = get_turf(H) - if(!T || T.z != z) + if(!T || T.get_virtual_z_level() != get_virtual_z_level()) continue H.Stun(10) var/obj/item/clothing/C if(!H.w_uniform || H.dropItemToGround(H.w_uniform)) C = new /obj/item/clothing/under/rank/civilian/clown(H) ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) - H.equip_to_slot_or_del(C, SLOT_W_UNIFORM) + H.equip_to_slot_or_del(C, ITEM_SLOT_ICLOTHING) if(!H.shoes || H.dropItemToGround(H.shoes)) C = new /obj/item/clothing/shoes/clown_shoes(H) ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) - H.equip_to_slot_or_del(C, SLOT_SHOES) + H.equip_to_slot_or_del(C, ITEM_SLOT_FEET) if(!H.wear_mask || H.dropItemToGround(H.wear_mask)) C = new /obj/item/clothing/mask/gas/clown_hat(H) ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) - H.equip_to_slot_or_del(C, SLOT_WEAR_MASK) + H.equip_to_slot_or_del(C, ITEM_SLOT_MASK) H.dna.add_mutation(CLOWNMUT) H.gain_trauma(/datum/brain_trauma/mild/phobia/clowns, TRAUMA_RESILIENCE_LOBOTOMY) //MWA HA HA diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index 61863c96b230c..f96e4d18217bb 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -17,41 +17,50 @@ desc = "advanced clown shoes that protect the wearer and render them nearly immune to slipping on their own peels. They also squeak at 100% capacity." clothing_flags = NOSLIP slowdown = SHOES_SLOWDOWN - armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 10, "rad" = 0, "fire" = 70, "acid" = 50) + armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 10, "rad" = 0, "fire" = 70, "acid" = 50, "stamina" = 25) strip_delay = 70 resistance_flags = NONE permeability_coefficient = 0.05 pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes +/// Recharging rate in PPS (peels per second) +#define BANANA_SHOES_RECHARGE_RATE 17 +#define BANANA_SHOES_MAX_CHARGE 3000 + //The super annoying version /obj/item/clothing/shoes/clown_shoes/banana_shoes/combat name = "mk-honk combat shoes" desc = "The culmination of years of clown combat research, these shoes leave a trail of chaos in their wake. They will slowly recharge themselves over time, or can be manually charged with bananium." slowdown = SHOES_SLOWDOWN - armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 10, "rad" = 0, "fire" = 70, "acid" = 50) + armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 10, "rad" = 0, "fire" = 70, "acid" = 50, "stamina" = 25) strip_delay = 70 resistance_flags = NONE permeability_coefficient = 0.05 pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes always_noslip = TRUE - var/max_recharge = 3000 //30 peels worth - var/recharge_rate = 34 //about 1/3 of a peel per tick /obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/Initialize() . = ..() var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container) - bananium.insert_amount_mat(max_recharge, /datum/material/bananium) + bananium.insert_amount_mat(BANANA_SHOES_MAX_CHARGE, /datum/material/bananium) START_PROCESSING(SSobj, src) -/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/process() +/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/process(delta_time) var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container) var/bananium_amount = bananium.get_material_amount(/datum/material/bananium) - if(bananium_amount < max_recharge) - bananium.insert_amount_mat(min(recharge_rate, max_recharge - bananium_amount), /datum/material/bananium) + if(bananium_amount < BANANA_SHOES_MAX_CHARGE) + bananium.insert_amount_mat(min(BANANA_SHOES_RECHARGE_RATE * delta_time, BANANA_SHOES_MAX_CHARGE - bananium_amount), /datum/material/bananium) /obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/attack_self(mob/user) ui_action_click(user) +#undef BANANA_SHOES_RECHARGE_RATE +#undef BANANA_SHOES_MAX_CHARGE + //BANANIUM SWORD /obj/item/melee/transforming/energy/sword/bananium @@ -138,7 +147,7 @@ var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.signal_enabled = active -/obj/item/shield/energy/bananium/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force) +/obj/item/shield/energy/bananium/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, quickstart = TRUE) if(active) if(iscarbon(thrower)) var/mob/living/carbon/C = thrower @@ -151,9 +160,9 @@ if(iscarbon(hit_atom) && !caught)//if they are a carbon and they didn't catch it var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.Slip(src, hit_atom) - if(thrownby && !caught) - sleep(1) - throw_at(thrownby, throw_range+2, throw_speed, null, TRUE) + var/mob/thrown_by = thrownby?.resolve() + if(thrown_by && !caught) + addtimer(CALLBACK(src, /atom/movable.proc/throw_at, thrown_by, throw_range+2, throw_speed, null, TRUE), 1) else return ..() @@ -206,14 +215,14 @@ 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/myloc = get_turf(src) . = ..() - for(var/mob/living/carbon/M in view(6, myloc)) + for(var/mob/living/carbon/M in hearers(6, myloc)) if(!istype(M.wear_mask, /obj/item/clothing/mask/gas/clown_hat) && !istype(M.wear_mask, /obj/item/clothing/mask/gas/mime) ) if(!M.wear_mask || M.dropItemToGround(M.wear_mask)) var/obj/item/clothing/mask/fakemoustache/sticky/the_stash = new /obj/item/clothing/mask/fakemoustache/sticky() - M.equip_to_slot_or_del(the_stash, SLOT_WEAR_MASK, TRUE, TRUE, TRUE, TRUE) + M.equip_to_slot_or_del(the_stash, ITEM_SLOT_MASK, TRUE, TRUE, TRUE, TRUE) /obj/item/clothing/mask/fakemoustache/sticky var/unstick_time = 600 @@ -266,7 +275,7 @@ icon_state = "darkhonker" max_integrity = 300 deflect_chance = 15 - armor = list("melee" = 40, "bullet" = 40, "laser" = 50, "energy" = 35, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 40, "laser" = 50, "energy" = 35, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "stamina" = 0) max_temperature = 35000 operation_req_access = list(ACCESS_SYNDICATE) internals_req_access = list(ACCESS_SYNDICATE) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 95a44c636a7c7..d8ecce2bb0a7b 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -38,7 +38,7 @@ report_type = "cult" antag_flag = ROLE_CULTIST false_report_weight = 1 - restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Brig Physician") + restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel") protected_jobs = list() required_players = 29 required_enemies = 4 @@ -52,6 +52,7 @@ title_icon = "cult" + var/finished = 0 var/acolytes_needed = 10 //for the survive objective @@ -78,12 +79,16 @@ if(prob(remaining)) recommended_enemies++ + recommended_enemies = max(recommended_enemies, required_enemies) for(var/cultists_number = 1 to recommended_enemies) if(!antag_candidates.len) break var/datum/mind/cultist = antag_pick(antag_candidates, ROLE_CULTIST) antag_candidates -= cultist + if(!cultist) + cultists_number-- + continue cultists_to_cult += cultist cultist.special_role = ROLE_CULTIST cultist.restricted_roles = restricted_jobs diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm index ce5d9ee7d38d9..22e64f00a81a4 100644 --- a/code/game/gamemodes/devil/devil_game_mode.dm +++ b/code/game/gamemodes/devil/devil_game_mode.dm @@ -4,7 +4,7 @@ report_type = "devil" antag_flag = ROLE_DEVIL false_report_weight = 1 - protected_jobs = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI", "Cyborg", "Security Officer", "Warden", "Detective", "Brig Physician") + protected_jobs = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI", "Cyborg", "Security Officer", "Warden", "Detective") required_players = 0 required_enemies = 1 recommended_enemies = 4 @@ -12,6 +12,8 @@ enemy_minimum_age = 0 title_icon = "devil" + allowed_special = list(/datum/special_role/traitor) + var/traitors_possible = 4 //hard limit on devils if scaling is turned off var/num_modifier = 0 // Used for gamemodes, that are a child of traitor, that need more than the usual. var/objective_count = 2 diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index 133b8bb0eb44f..a5a8bfc80e6f9 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -1,44 +1,19 @@ -#define CURRENT_LIVING_PLAYERS 1 -#define CURRENT_LIVING_ANTAGS 2 -#define CURRENT_DEAD_PLAYERS 3 -#define CURRENT_OBSERVERS 4 - -#define ONLY_RULESET 1 -#define HIGHLANDER_RULESET 2 -#define TRAITOR_RULESET 4 -#define MINOR_RULESET 8 - #define RULESET_STOP_PROCESSING 1 -// -- Injection delays -GLOBAL_VAR_INIT(dynamic_latejoin_delay_min, (5 MINUTES)) -GLOBAL_VAR_INIT(dynamic_latejoin_delay_max, (25 MINUTES)) +#define FAKE_REPORT_CHANCE 8 +#define REPORT_NEG_DIVERGENCE -15 +#define REPORT_POS_DIVERGENCE 15 -GLOBAL_VAR_INIT(dynamic_midround_delay_min, (15 MINUTES)) -GLOBAL_VAR_INIT(dynamic_midround_delay_max, (35 MINUTES)) - -// Are HIGHLANDER_RULESETs allowed to stack? +// Are HIGH_IMPACT_RULESETs allowed to stack? GLOBAL_VAR_INIT(dynamic_no_stacking, TRUE) -// A number between -5 and +5. -// A negative value will give a more peaceful round and -// a positive value will give a round with higher threat. -GLOBAL_VAR_INIT(dynamic_curve_centre, 0) -// A number between 0.5 and 4. -// Higher value will favour extreme rounds and -// lower value rounds closer to the average. -GLOBAL_VAR_INIT(dynamic_curve_width, 1.8) -// If enabled only picks a single starting rule and executes only autotraitor midround ruleset. -GLOBAL_VAR_INIT(dynamic_classic_secret, FALSE) -// How many roundstart players required for high population override to take effect. -GLOBAL_VAR_INIT(dynamic_high_pop_limit, 55) // If enabled does not accept or execute any rulesets. GLOBAL_VAR_INIT(dynamic_forced_extended, FALSE) -// How high threat is required for HIGHLANDER_RULESETs stacking. +// How high threat is required for HIGH_IMPACT_RULESETs stacking. // This is independent of dynamic_no_stacking. GLOBAL_VAR_INIT(dynamic_stacking_limit, 90) // List of forced roundstart rulesets. GLOBAL_LIST_EMPTY(dynamic_forced_roundstart_ruleset) -// Forced threat level, setting this to zero or higher forces the roundstart threat to the value. +// Forced threat level, setting this to zero or higher forces the roundstart threat to the value. GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /datum/game_mode/dynamic @@ -49,15 +24,23 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) announce_span = "danger" announce_text = "Dynamic mode!" // This needs to be changed maybe - reroll_friendly = FALSE; - + reroll_friendly = FALSE + // Threat logging vars /// The "threat cap", threat shouldn't normally go above this and is used in ruleset calculations - var/threat_level = 0 - /// Set at the beginning of the round. Spent by the mode to "purchase" rules. - var/threat = 0 + var/threat_level = 0 + + /// Set at the beginning of the round. Spent by the mode to "purchase" rules. Everything else goes in the postround budget. + var/round_start_budget = 0 + + /// Set at the beginning of the round. Spent by midrounds and latejoins. + var/mid_round_budget = 0 + + /// The initial round start budget for logging purposes, set once at the beginning of the round. + var/initial_round_start_budget = 0 + /// Running information about the threat. Can store text or datum entries. - var/list/threat_log = list() + var/list/threat_log = list() /// List of roundstart rules used for selecting the rules. var/list/roundstart_rules = list() /// List of latejoin rules used for selecting the rules. @@ -73,14 +56,6 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) * 0-6, 7-13, 14-20, 21-27, 28-34, 35-41, 42-48, 49-55, 56-62, 63+ */ var/pop_per_requirement = 6 - /// The requirement used for checking if a second rule should be selected. - var/list/second_rule_req = list(100, 100, 80, 70, 60, 50, 30, 20, 10, 0) - /// The requirement used for checking if a third rule should be selected. - var/list/third_rule_req = list(100, 100, 100, 90, 80, 70, 60, 50, 40, 30) - /// Threat requirement for a second ruleset when high pop override is in effect. - var/high_pop_second_rule_req = 40 - /// Threat requirement for a third ruleset when high pop override is in effect. - var/high_pop_third_rule_req = 60 /// Number of players who were ready on roundstart. var/roundstart_pop_ready = 0 /// List of candidates used on roundstart rulesets. @@ -89,36 +64,110 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) var/list/current_rules = list() /// List of executed rulesets. var/list/executed_rules = list() - /// Associative list of current players, in order: living players, living antagonists, dead players and observers. - var/list/list/current_players = list(CURRENT_LIVING_PLAYERS, CURRENT_LIVING_ANTAGS, CURRENT_DEAD_PLAYERS, CURRENT_OBSERVERS) - /// When world.time is over this number the mode tries to inject a latejoin ruleset. - var/latejoin_injection_cooldown = 0 - /// When world.time is over this number the mode tries to inject a midround ruleset. - var/midround_injection_cooldown = 0 /// When TRUE GetInjectionChance returns 100. var/forced_injection = FALSE /// Forced ruleset to be executed for the next latejoin. var/datum/dynamic_ruleset/latejoin/forced_latejoin_rule = null - /// When current_players was updated last time. - var/pop_last_updated = 0 /// How many percent of the rounds are more peaceful. var/peaceful_percentage = 50 - /// If a highlander executed. - var/highlander_executed = FALSE + /// If a high impact ruleset was executed. Only one will run at a time in most circumstances. + var/high_impact_ruleset_executed = FALSE /// If a only ruleset has been executed. var/only_ruleset_executed = FALSE + /// Dynamic configuration, loaded on pre_setup + var/list/configuration = null + /// Antags rolled by rules so far, to keep track of and discourage scaling past a certain ratio of crew/antags especially on lowpop. + var/antags_rolled = 0 + + /// When world.time is over this number the mode tries to inject a latejoin ruleset. + var/latejoin_injection_cooldown = 0 + + /// The minimum time the recurring latejoin ruleset timer is allowed to be. + var/latejoin_delay_min = (5 MINUTES) + + /// The maximum time the recurring latejoin ruleset timer is allowed to be. + var/latejoin_delay_max = (25 MINUTES) + + /// When world.time is over this number the mode tries to inject a midround ruleset. + var/midround_injection_cooldown = 0 + + /// The minimum time the recurring midround ruleset timer is allowed to be. + var/midround_delay_min = (15 MINUTES) + + /// The maximum time the recurring midround ruleset timer is allowed to be. + var/midround_delay_max = (35 MINUTES) + + /// If above this threat, increase the chance of injection + var/higher_injection_chance_minimum_threat = 70 + + /// The chance of injection increase when above higher_injection_chance_minimum_threat + var/higher_injection_chance = 15 + + /// If below this threat, decrease the chance of injection + var/lower_injection_chance_minimum_threat = 10 + + /// The chance of injection decrease when above lower_injection_chance_minimum_threat + var/lower_injection_chance = 15 + + /// A number between -5 and +5. + /// A negative value will give a more peaceful round and + /// a positive value will give a round with higher threat. + var/threat_curve_centre = 0 + + /// A number between 0.5 and 4. + /// Higher value will favour extreme rounds and + /// lower value rounds closer to the average. + var/threat_curve_width = 1.8 + + /// A number between -5 and +5. + /// Equivalent to threat_curve_centre, but for the budget split. + /// A negative value will weigh towards midround rulesets, and a positive + /// value will weight towards roundstart ones. + var/roundstart_split_curve_centre = 1 + + /// A number between 0.5 and 4. + /// Equivalent to threat_curve_width, but for the budget split. + /// Higher value will favour more variance in splits and + /// lower value rounds closer to the average. + var/roundstart_split_curve_width = 1.8 + + /// The minimum amount of time for antag random events to be hijacked. + var/random_event_hijack_minimum = 10 MINUTES + + /// The maximum amount of time for antag random events to be hijacked. + var/random_event_hijack_maximum = 18 MINUTES + + /// A list of recorded "snapshots" of the round, stored in the dynamic.json log + var/list/datum/dynamic_snapshot/snapshots + + /// The time when the last midround injection was attempted, whether or not it was successful + var/last_midround_injection_attempt = 0 + + /// The amount to inject when a round event is hijacked + var/hijacked_random_event_injection_chance = 50 + + /// Whether or not a random event has been hijacked this midround cycle + var/random_event_hijacked = HIJACKED_NOTHING + + /// The timer ID for the cancellable midround rule injection + var/midround_injection_timer_id + + /// The last drafted midround rulesets (without the current one included). + /// Used for choosing different midround injections. + var/list/current_midround_rulesets /datum/game_mode/dynamic/admin_panel() var/list/dat = list("Game Mode Panel

Game Mode Panel

") - dat += "Dynamic Mode \[VV\]\[Refresh\]
" + dat += "Dynamic Mode \[VV\] \[Refresh\]
" dat += "Threat Level: [threat_level]
" + dat += "Budgets (Roundstart/Midrounds): [initial_round_start_budget]/[threat_level - initial_round_start_budget]
" - dat += "Threat to Spend: [threat] \[Adjust\] \[View Log\]
" + dat += "Midround budget to spend: [mid_round_budget] \[Adjust\] \[View Log\]
" dat += "
" - dat += "Parameters: centre = [GLOB.dynamic_curve_centre] ; width = [GLOB.dynamic_curve_width].
" + dat += "Parameters: centre = [threat_curve_centre] ; width = [threat_curve_width].
" + dat += "Split parameters: centre = [roundstart_split_curve_centre] ; width = [roundstart_split_curve_width].
" dat += "On average, [peaceful_percentage]% of the rounds are more peaceful.
" dat += "Forced extended: [GLOB.dynamic_forced_extended ? "On" : "Off"]
" - dat += "Classic secret (only autotraitor): [GLOB.dynamic_classic_secret ? "On" : "Off"]
" dat += "No stacking (only one round-ender): [GLOB.dynamic_no_stacking ? "On" : "Off"]
" dat += "Stacking limit: [GLOB.dynamic_stacking_limit] \[Adjust\]" dat += "
" @@ -129,7 +178,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) dat += "[DR.ruletype] - [DR.name]
" else dat += "none.
" - dat += "
Injection Timers: ([get_injection_chance(TRUE)]% chance)
" + dat += "
Injection Timers: ([get_injection_chance(dry_run = TRUE)]% latejoin chance, [get_midround_injection_chance(dry_run = TRUE)]% midround chance)
" dat += "Latejoin: [(latejoin_injection_cooldown-world.time)>60*10 ? "[round((latejoin_injection_cooldown-world.time)/60/10,0.1)] minutes" : "[(latejoin_injection_cooldown-world.time)] seconds"] \[Now!\]
" dat += "Midround: [(midround_injection_cooldown-world.time)>60*10 ? "[round((midround_injection_cooldown-world.time)/60/10,0.1)] minutes" : "[(midround_injection_cooldown-world.time)] seconds"] \[Now!\]
" usr << browse(dat.Join(), "window=gamemode_panel;size=500x500") @@ -143,18 +192,21 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) return if (href_list["forced_extended"]) GLOB.dynamic_forced_extended = !GLOB.dynamic_forced_extended + message_admins("[key_name(usr)] toggled dynamic's Forced Extended setting to [GLOB.dynamic_forced_extended].") else if (href_list["no_stacking"]) GLOB.dynamic_no_stacking = !GLOB.dynamic_no_stacking - else if (href_list["classic_secret"]) - GLOB.dynamic_classic_secret = !GLOB.dynamic_classic_secret + message_admins("[key_name(usr)] toggled dynamic's No Stacking setting to [GLOB.dynamic_no_stacking].") else if (href_list["adjustthreat"]) var/threatadd = input("Specify how much threat to add (negative to subtract). This can inflate the threat level.", "Adjust Threat", 0) as null|num if(!threatadd) return if(threatadd > 0) create_threat(threatadd) + threat_log += "[worldtime2text()]: [key_name(usr)] increased threat by [threatadd] threat." else - spend_threat(-threatadd) + spend_midround_budget(-threatadd) + threat_log += "[worldtime2text()]: [key_name(usr)] decreased threat by [-threatadd] threat." + message_admins("[key_name(usr)] adjusted the dynamic threat level by [threatadd] threat.") else if (href_list["injectlate"]) latejoin_injection_cooldown = 0 forced_injection = TRUE @@ -167,26 +219,48 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) 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 - + message_admins("[key_name(usr)] adjusted dynamic's Stacking Limit setting to [GLOB.dynamic_stacking_limit].") + else if(href_list["force_latejoin_rule"]) + var/added_rule = input(usr,"What ruleset do you want to force upon the next latejoiner? This will bypass threat level and population restrictions.", "Rigging Latejoin", null) as null|anything in sortList(latejoin_rules) + if (!added_rule) + return + forced_latejoin_rule = added_rule + dynamic_log("[key_name(usr)] set [added_rule] to proc on the next latejoin.") + else if(href_list["clear_forced_latejoin"]) + forced_latejoin_rule = null + dynamic_log("[key_name(usr)] cleared the forced latejoin ruleset.") + else if(href_list["force_midround_rule"]) + var/added_rule = input(usr,"What ruleset do you want to force right now? This will bypass threat level and population restrictions.", "Execute Ruleset", null) as null|anything in sortList(midround_rules) + if (!added_rule) + return + dynamic_log("[key_name(usr)] executed the [added_rule] ruleset.") + picking_specific_rule(added_rule, TRUE) + else if(href_list["cancelmidround"]) + admin_cancel_midround(usr, href_list["cancelmidround"]) + return + else if (href_list["differentmidround"]) + admin_different_midround(usr, href_list["differentmidround"]) + return + admin_panel() // Refreshes the window -// Checks if there are HIGHLANDER_RULESETs and calls the rule's round_result() proc +// Checks if there are HIGH_IMPACT_RULESETs and calls the rule's round_result() proc /datum/game_mode/dynamic/set_round_result() + // If it got to this part, just pick one high impact ruleset if it exists for(var/datum/dynamic_ruleset/rule in executed_rules) - if(rule.flags & HIGHLANDER_RULESET) - if(rule.check_finished()) // Only the rule that actually finished the round sets round result. - return rule.round_result() - // If it got to this part, just pick one highlander if it exists - for(var/datum/dynamic_ruleset/rule in executed_rules) - if(rule.flags & HIGHLANDER_RULESET) + if(rule.flags & HIGH_IMPACT_RULESET) return rule.round_result() return ..() /datum/game_mode/dynamic/send_intercept() . = "Central Command Status Summary
" - switch(round(threat_level)) + var/shown_threat + if(prob(FAKE_REPORT_CHANCE)) + shown_threat = rand(1, 100) + else + shown_threat = clamp(threat_level + rand(REPORT_NEG_DIVERGENCE, REPORT_POS_DIVERGENCE), 0, 100) + switch(round(shown_threat)) if(0 to 19) - update_playercounts() if(!current_players[CURRENT_LIVING_ANTAGS].len) . += "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." @@ -210,14 +284,10 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) . += "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." - if(station_goals.len) - . += "
Special Orders for [station_name()]:" - for(var/datum/station_goal/G in station_goals) - G.on_report() - . += G.get_report() + . += generate_station_goal_report() print_command_report(., "Central Command Status Summary", announce=FALSE) - priority_announce("A summary has been copied and printed to all communications consoles.", "Security level elevated.", 'sound/ai/intercept.ogg') + priority_announce("A summary has been copied and printed to all communications consoles.", "Security level elevated.", ANNOUNCER_INTERCEPT) if(GLOB.security_level < SEC_LEVEL_BLUE) set_security_level(SEC_LEVEL_BLUE) @@ -233,9 +303,6 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) return TRUE if(force_ending) return TRUE - for(var/datum/dynamic_ruleset/rule in executed_rules) - if(rule.flags & HIGHLANDER_RULESET) - return rule.check_finished() /datum/game_mode/dynamic/proc/show_threatlog(mob/admin) if(!SSticker.HasRoundStarted()) @@ -251,86 +318,111 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if(istext(entry)) out += "[entry]
" - out += "Remaining threat/threat_level: [threat]/[threat_level]" + out += "Remaining threat/threat_level: [mid_round_budget]/[threat_level]" usr << browse(out.Join(), "window=threatlog;size=700x500") /// Generates the threat level using lorentz distribution and assigns peaceful_percentage. /datum/game_mode/dynamic/proc/generate_threat() - var/relative_threat = LORENTZ_DISTRIBUTION(GLOB.dynamic_curve_centre, GLOB.dynamic_curve_width) - threat_level = round(lorentz_to_threat(relative_threat), 0.1) + var/relative_threat = LORENTZ_DISTRIBUTION(threat_curve_centre, threat_curve_width) + threat_level = round(lorentz_to_amount(relative_threat), 0.1) - peaceful_percentage = round(LORENTZ_CUMULATIVE_DISTRIBUTION(relative_threat, GLOB.dynamic_curve_centre, GLOB.dynamic_curve_width), 0.01)*100 + peaceful_percentage = round(LORENTZ_CUMULATIVE_DISTRIBUTION(relative_threat, threat_curve_centre, threat_curve_width), 0.01)*100 - threat = threat_level +/// Generates the midround and roundstart budgets +/datum/game_mode/dynamic/proc/generate_budgets() + var/relative_round_start_budget_scale = LORENTZ_DISTRIBUTION(roundstart_split_curve_centre, roundstart_split_curve_width) + round_start_budget = round((lorentz_to_amount(relative_round_start_budget_scale) / 100) * threat_level, 0.1) + initial_round_start_budget = round_start_budget + mid_round_budget = threat_level - round_start_budget /datum/game_mode/dynamic/can_start() - message_admins("Dynamic mode parameters for the round:") - message_admins("Centre is [GLOB.dynamic_curve_centre], Width is [GLOB.dynamic_curve_width], Forced extended is [GLOB.dynamic_forced_extended ? "Enabled" : "Disabled"], No stacking is [GLOB.dynamic_no_stacking ? "Enabled" : "Disabled"].") - message_admins("Stacking limit is [GLOB.dynamic_stacking_limit], Classic secret is [GLOB.dynamic_classic_secret ? "Enabled" : "Disabled"], High population limit is [GLOB.dynamic_high_pop_limit].") + return TRUE + +/datum/game_mode/dynamic/proc/setup_parameters() log_game("DYNAMIC: Dynamic mode parameters for the round:") - log_game("DYNAMIC: Centre is [GLOB.dynamic_curve_centre], Width is [GLOB.dynamic_curve_width], Forced extended is [GLOB.dynamic_forced_extended ? "Enabled" : "Disabled"], No stacking is [GLOB.dynamic_no_stacking ? "Enabled" : "Disabled"].") - log_game("DYNAMIC: Stacking limit is [GLOB.dynamic_stacking_limit], Classic secret is [GLOB.dynamic_classic_secret ? "Enabled" : "Disabled"], High population limit is [GLOB.dynamic_high_pop_limit].") + log_game("DYNAMIC: Centre is [threat_curve_centre], Width is [threat_curve_width], Forced extended is [GLOB.dynamic_forced_extended ? "Enabled" : "Disabled"], No stacking is [GLOB.dynamic_no_stacking ? "Enabled" : "Disabled"].") + log_game("DYNAMIC: Stacking limit is [GLOB.dynamic_stacking_limit].") if(GLOB.dynamic_forced_threat_level >= 0) threat_level = round(GLOB.dynamic_forced_threat_level, 0.1) - threat = threat_level else generate_threat() + generate_budgets() + set_cooldowns() + dynamic_log("Dynamic Mode initialized with a Threat Level of... [threat_level]! ([round_start_budget] round start budget)") + return TRUE - var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_latejoin_delay_max + GLOB.dynamic_latejoin_delay_min) - latejoin_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_latejoin_delay_min, GLOB.dynamic_latejoin_delay_max)) + world.time +/datum/game_mode/dynamic/proc/set_cooldowns() + var/latejoin_injection_cooldown_middle = 0.5*(latejoin_delay_max + latejoin_delay_min) + latejoin_injection_cooldown = round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), latejoin_delay_min, latejoin_delay_max)) + world.time - var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_midround_delay_max + GLOB.dynamic_midround_delay_min) - midround_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_midround_delay_min, GLOB.dynamic_midround_delay_max)) + world.time - message_admins("Dynamic Mode initialized with a Threat Level of... [threat_level]!") - log_game("DYNAMIC: Dynamic Mode initialized with a Threat Level of... [threat_level]!") - return TRUE + var/midround_injection_cooldown_middle = 0.5*(midround_delay_max + midround_delay_min) + midround_injection_cooldown = round(clamp(EXP_DISTRIBUTION(midround_injection_cooldown_middle), midround_delay_min, midround_delay_max)) + world.time /datum/game_mode/dynamic/pre_setup() + if(CONFIG_GET(flag/dynamic_config_enabled)) + var/json_file = file("config/dynamic.json") + if(fexists(json_file)) + configuration = json_decode(file2text(json_file)) + if(configuration["Dynamic"]) + for(var/variable in configuration["Dynamic"]) + if(!vars[variable]) + stack_trace("Invalid dynamic configuration variable [variable] in game mode variable changes.") + continue + vars[variable] = configuration["Dynamic"][variable] + + setup_parameters() + setup_hijacking() + + var/valid_roundstart_ruleset = 0 for (var/rule in subtypesof(/datum/dynamic_ruleset)) var/datum/dynamic_ruleset/ruleset = new rule() // Simple check if the ruleset should be added to the lists. if(ruleset.name == "") continue + configure_ruleset(ruleset) switch(ruleset.ruletype) if("Roundstart") roundstart_rules += ruleset + if(ruleset.weight) + valid_roundstart_ruleset++ if ("Latejoin") latejoin_rules += ruleset if ("Midround") - if (ruleset.weight) - midround_rules += ruleset - for(var/mob/dead/new_player/player in GLOB.player_list) + midround_rules += ruleset + for(var/i in GLOB.new_player_list) + var/mob/dead/new_player/player = i if(player.ready == PLAYER_READY_TO_PLAY && player.mind) roundstart_pop_ready++ candidates.Add(player) log_game("DYNAMIC: Listing [roundstart_rules.len] round start rulesets, and [candidates.len] players ready.") if (candidates.len <= 0) + log_game("DYNAMIC: [candidates.len] candidates.") return TRUE - if (roundstart_rules.len <= 0) - return TRUE - + if(GLOB.dynamic_forced_roundstart_ruleset.len > 0) rigged_roundstart() - else + else if(valid_roundstart_ruleset < 1) + log_game("DYNAMIC: [valid_roundstart_ruleset] enabled roundstart rulesets.") + return TRUE + else roundstart() + dynamic_log("[round_start_budget] round start budget was left, donating it to midrounds.") + threat_log += "[worldtime2text()]: [round_start_budget] round start budget was left, donating it to midrounds." + mid_round_budget += round_start_budget + var/starting_rulesets = "" for (var/datum/dynamic_ruleset/roundstart/DR in executed_rules) starting_rulesets += "[DR.name], " + log_game("DYNAMIC: Picked the following roundstart rules: [starting_rulesets]") candidates.Cut() return TRUE /datum/game_mode/dynamic/post_setup(report) - update_playercounts() - for(var/datum/dynamic_ruleset/roundstart/rule in executed_rules) rule.candidates.Cut() // The rule should not use candidates at this point as they all are null. - if(rule.delay > 0) - addtimer(CALLBACK(rule, /datum/dynamic_ruleset/roundstart.proc/execute), rule.delay) - else - if(!rule.execute()) - stack_trace("The starting rule \"[rule.name]\" failed to execute.") + addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/execute_roundstart_rule, rule), rule.delay) ..() /// A simple roundstart proc used when dynamic_forced_roundstart_ruleset has rules in it. @@ -338,14 +430,21 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) message_admins("[GLOB.dynamic_forced_roundstart_ruleset.len] rulesets being forced. Will now attempt to draft players for them.") log_game("DYNAMIC: [GLOB.dynamic_forced_roundstart_ruleset.len] rulesets being forced. Will now attempt to draft players for them.") for (var/datum/dynamic_ruleset/roundstart/rule in GLOB.dynamic_forced_roundstart_ruleset) + configure_ruleset(rule) message_admins("Drafting players for forced ruleset [rule.name].") log_game("DYNAMIC: Drafting players for forced ruleset [rule.name].") rule.mode = src + rule.acceptable(roundstart_pop_ready, threat_level) // Assigns some vars in the modes, running it here for consistency rule.candidates = candidates.Copy() rule.trim_candidates() - rule.pop_per_requirement = rule.pop_per_requirement > 0 ? rule.pop_per_requirement : (src.pop_per_requirement > 0 ? src.pop_per_requirement : 6) //i hate myself for this - if (rule.ready(TRUE)) - picking_roundstart_rule(list(rule), forced = TRUE) + if (rule.ready(roundstart_pop_ready, TRUE)) + var/cost = rule.cost + var/scaled_times = 0 + if (rule.scaling_cost) + scaled_times = round(max(round_start_budget - cost, 0) / rule.scaling_cost) + cost += rule.scaling_cost * scaled_times + + spend_roundstart_budget(picking_roundstart_rule(rule, scaled_times, forced = TRUE)) /datum/game_mode/dynamic/proc/roundstart() if (GLOB.dynamic_forced_extended) @@ -353,150 +452,85 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) return TRUE var/list/drafted_rules = list() for (var/datum/dynamic_ruleset/roundstart/rule in roundstart_rules) - if (rule.acceptable(roundstart_pop_ready, threat_level) && threat >= rule.cost) // If we got the population and threat required + if (!rule.weight) + continue + if (rule.acceptable(roundstart_pop_ready, threat_level) && round_start_budget >= rule.cost) // If we got the population and threat required rule.candidates = candidates.Copy() rule.trim_candidates() - if (rule.ready() && rule.candidates.len > 0) + if (rule.ready(roundstart_pop_ready) && rule.candidates.len > 0) drafted_rules[rule] = rule.weight - var/indice_pop = min(10,round(roundstart_pop_ready/pop_per_requirement)+1) - var/extra_rulesets_amount = 0 - if (GLOB.dynamic_classic_secret) - extra_rulesets_amount = 0 - else - if (roundstart_pop_ready > GLOB.dynamic_high_pop_limit) - message_admins("High Population Override is in effect! Threat Level will have more impact on which roles will appear, and player population less.") - log_game("DYNAMIC: High Population Override is in effect! Threat Level will have more impact on which roles will appear, and player population less.") - if (threat_level > high_pop_second_rule_req) - extra_rulesets_amount++ - if (threat_level > high_pop_third_rule_req) - extra_rulesets_amount++ - else - if (threat_level >= second_rule_req[indice_pop]) - extra_rulesets_amount++ - if (threat_level >= third_rule_req[indice_pop]) - extra_rulesets_amount++ - - if (drafted_rules.len > 0 && picking_roundstart_rule(drafted_rules)) - if (extra_rulesets_amount > 0) // We've got enough population and threat for a second rulestart rule - for (var/datum/dynamic_ruleset/roundstart/rule in drafted_rules) - if (rule.cost > threat) - drafted_rules -= rule - if (drafted_rules.len > 0 && picking_roundstart_rule(drafted_rules)) - if (extra_rulesets_amount > 1) // We've got enough population and threat for a third rulestart rule - for (var/datum/dynamic_ruleset/roundstart/rule in drafted_rules) - if (rule.cost > threat) - drafted_rules -= rule - picking_roundstart_rule(drafted_rules) - else - return FALSE - return TRUE + var/list/rulesets_picked = list() -/// Picks a random roundstart rule from the list given as an argument and executes it. -/datum/game_mode/dynamic/proc/picking_roundstart_rule(list/drafted_rules = list(), forced = FALSE) - var/datum/dynamic_ruleset/roundstart/starting_rule = pickweight(drafted_rules) - if(!starting_rule) - return FALSE + // Kept in case a ruleset can't be initialized for whatever reason, we want to be able to only spend what we can use. + var/round_start_budget_left = round_start_budget - if(!forced) - if(only_ruleset_executed) - return FALSE - // Check if a blocking ruleset has been executed. - else if(check_blocking(starting_rule.blocking_rules, executed_rules)) - drafted_rules -= starting_rule - if(drafted_rules.len <= 0) - return FALSE - 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) - if(threat < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) - if(highlander_executed) - drafted_rules -= starting_rule - if(drafted_rules.len <= 0) - return FALSE - starting_rule = pickweight(drafted_rules) - // With low pop and high threat there might be rulesets that get executed with no valid candidates. - else if(starting_rule.ready()) - drafted_rules -= starting_rule - if(drafted_rules.len <= 0) - return FALSE - starting_rule = pickweight(drafted_rules) - - message_admins("Picking a ruleset [starting_rule.name]") - log_game("DYNAMIC: Picking a ruleset [starting_rule.name]") - - roundstart_rules -= starting_rule - drafted_rules -= starting_rule - - starting_rule.trim_candidates() - if (starting_rule.pre_execute()) - spend_threat(starting_rule.cost) - threat_log += "[worldtime2text()]: Roundstart [starting_rule.name] spent [starting_rule.cost]" - if(starting_rule.flags & HIGHLANDER_RULESET) - highlander_executed = TRUE - else if(starting_rule.flags & ONLY_RULESET) - only_ruleset_executed = TRUE - executed_rules += starting_rule - if (starting_rule.persistent) - current_rules += starting_rule - for (var/datum/dynamic_ruleset/roundstart/rule in drafted_rules) - if (!rule.ready()) - drafted_rules -= rule // And removing rules that are no longer elligible - return TRUE - else - stack_trace("The starting rule \"[starting_rule.name]\" failed to pre_execute.") - return FALSE + while (round_start_budget_left > 0) + var/datum/dynamic_ruleset/roundstart/ruleset = pickweightAllowZero(drafted_rules) + if (isnull(ruleset)) + log_game("DYNAMIC: No more rules can be applied, stopping with [round_start_budget] left.") + break -/// Picks a random midround OR latejoin rule from the list given as an argument and executes it. -/// Also this could be named better. -/datum/game_mode/dynamic/proc/picking_midround_latejoin_rule(list/drafted_rules = list(), forced = FALSE) - var/datum/dynamic_ruleset/rule = pickweight(drafted_rules) - if(!rule) - return FALSE - - if(!forced) - if(only_ruleset_executed) - return FALSE - // Check if a blocking ruleset has been executed. - else if(check_blocking(rule.blocking_rules, executed_rules)) - drafted_rules -= rule - if(drafted_rules.len <= 0) - return FALSE - rule = pickweight(drafted_rules) - // Check if the ruleset is highlander and if a highlander ruleset has been executed - else if(rule.flags & HIGHLANDER_RULESET) - if(threat < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) - if(highlander_executed) - drafted_rules -= rule - if(drafted_rules.len <= 0) - return FALSE - rule = pickweight(drafted_rules) - - if(!rule.repeatable) - if(rule.ruletype == "Latejoin") - latejoin_rules = remove_from_list(latejoin_rules, rule.type) - else if(rule.type == "Midround") - midround_rules = remove_from_list(midround_rules, rule.type) - - if (rule.execute()) - log_game("DYNAMIC: Injected a [rule.ruletype == "latejoin" ? "latejoin" : "midround"] ruleset [rule.name].") - spend_threat(rule.cost) - threat_log += "[worldtime2text()]: [rule.ruletype] [rule.name] spent [rule.cost]" - if(rule.flags & HIGHLANDER_RULESET) - highlander_executed = TRUE - else if(rule.flags & ONLY_RULESET) + var/cost = (ruleset in rulesets_picked) ? ruleset.scaling_cost : ruleset.cost + if (cost == 0) + stack_trace("[ruleset] cost 0, this is going to result in an infinite loop.") + drafted_rules[ruleset] = null + continue + + if (cost > round_start_budget_left) + drafted_rules[ruleset] = null + continue + + if (check_blocking(ruleset.blocking_rules, rulesets_picked)) + drafted_rules[ruleset] = null + continue + + round_start_budget_left -= cost + + rulesets_picked[ruleset] += 1 + + if (ruleset.flags & HIGH_IMPACT_RULESET) + for (var/_other_ruleset in drafted_rules) + var/datum/dynamic_ruleset/other_ruleset = _other_ruleset + if (other_ruleset.flags & HIGH_IMPACT_RULESET) + drafted_rules[other_ruleset] = null + + if (ruleset.flags & LONE_RULESET) + drafted_rules[ruleset] = null + + for (var/ruleset in rulesets_picked) + spend_roundstart_budget(picking_roundstart_rule(ruleset, rulesets_picked[ruleset] - 1)) + +/// Initializes the round start ruleset provided to it. Returns how much threat to spend. +/datum/game_mode/dynamic/proc/picking_roundstart_rule(datum/dynamic_ruleset/roundstart/ruleset, scaled_times = 0, forced = FALSE) + log_game("DYNAMIC: Picked a ruleset: [ruleset.name], scaled [scaled_times] times") + + ruleset.trim_candidates() + var/added_threat = ruleset.scale_up(roundstart_pop_ready, scaled_times) + + if(ruleset.pre_execute(roundstart_pop_ready)) + threat_log += "[worldtime2text()]: Roundstart [ruleset.name] spent [ruleset.cost + added_threat]. [ruleset.scaling_cost ? "Scaled up [ruleset.scaled_times]/[scaled_times] times." : ""]" + if(ruleset.flags & ONLY_RULESET) only_ruleset_executed = TRUE - if(rule.ruletype == "Latejoin") - var/mob/M = pick(rule.candidates) - message_admins("[key_name(M)] joined the station, and was selected by the [rule.name] ruleset.") - log_game("DYNAMIC: [key_name(M)] joined the station, and was selected by the [rule.name] ruleset.") - executed_rules += rule - rule.candidates.Cut() - if (rule.persistent) + if(ruleset.flags & HIGH_IMPACT_RULESET) + high_impact_ruleset_executed = TRUE + executed_rules += ruleset + return ruleset.cost + added_threat + else + stack_trace("The starting rule \"[ruleset.name]\" failed to pre_execute.") + return 0 + +/// Mainly here to facilitate delayed rulesets. All roundstart rulesets are executed with a timered callback to this proc. +/datum/game_mode/dynamic/proc/execute_roundstart_rule(sent_rule) + var/datum/dynamic_ruleset/rule = sent_rule + if(rule.execute()) + if(rule.persistent) current_rules += rule + new_snapshot(rule) return TRUE - else - stack_trace("The [rule.ruletype] rule \"[rule.name]\" failed to execute.") + rule.clean_up() // Refund threat, delete teams and so on. + executed_rules -= rule + stack_trace("The starting rule \"[rule.name]\" failed to execute.") return FALSE /// An experimental proc to allow admins to call rules on the fly or have rules call other rules. @@ -504,35 +538,37 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) var/datum/dynamic_ruleset/midround/new_rule if(ispath(ruletype)) new_rule = new ruletype() // You should only use it to call midround rules though. + configure_ruleset(new_rule) else if(istype(ruletype, /datum/dynamic_ruleset)) new_rule = ruletype else return FALSE - + if(!new_rule) return FALSE - + if(!forced) if(only_ruleset_executed) return FALSE // Check if a blocking ruleset has been executed. else if(check_blocking(new_rule.blocking_rules, executed_rules)) return FALSE - // Check if the ruleset is highlander and if a highlander ruleset has been executed - else if(new_rule.flags & HIGHLANDER_RULESET) - if(threat < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) - if(highlander_executed) + // Check if the ruleset is high impact and if a high impact ruleset has been executed + else if(new_rule.flags & HIGH_IMPACT_RULESET) + if(threat_level < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) + if(high_impact_ruleset_executed) return FALSE - - update_playercounts() - if ((forced || (new_rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && new_rule.cost <= threat))) + + var/population = current_players[CURRENT_LIVING_PLAYERS].len + if((new_rule.acceptable(population, threat_level) && new_rule.cost <= mid_round_budget) || forced) new_rule.trim_candidates() if (new_rule.ready(forced)) - spend_threat(new_rule.cost) + spend_midround_budget(new_rule.cost) threat_log += "[worldtime2text()]: Forced rule [new_rule.name] spent [new_rule.cost]" + new_rule.pre_execute(population) if (new_rule.execute()) // This should never fail since ready() returned 1 - if(new_rule.flags & HIGHLANDER_RULESET) - highlander_executed = TRUE + if(new_rule.flags & HIGH_IMPACT_RULESET) + high_impact_ruleset_executed = TRUE else if(new_rule.flags & ONLY_RULESET) only_ruleset_executed = TRUE log_game("DYNAMIC: Making a call to a specific ruleset...[new_rule.name]!") @@ -545,10 +581,6 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) return FALSE /datum/game_mode/dynamic/process() - if (pop_last_updated < world.time - (60 SECONDS)) - pop_last_updated = world.time - update_playercounts() - for (var/datum/dynamic_ruleset/rule in current_rules) if(rule.rule_process() == RULESET_STOP_PROCESSING) // If rule_process() returns 1 (RULESET_STOP_PROCESSING), stop processing. current_rules -= rule @@ -556,63 +588,54 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if (midround_injection_cooldown < world.time) if (GLOB.dynamic_forced_extended) return - + // Somehow it managed to trigger midround multiple times so this was moved here. // There is no way this should be able to trigger an injection twice now. - var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_midround_delay_max + GLOB.dynamic_midround_delay_min) - midround_injection_cooldown = (round(CLAMP(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_midround_delay_min, GLOB.dynamic_midround_delay_max)) + world.time) - + var/midround_injection_cooldown_middle = 0.5*(midround_delay_max + midround_delay_min) + midround_injection_cooldown = (round(clamp(EXP_DISTRIBUTION(midround_injection_cooldown_middle), midround_delay_min, midround_delay_max)) + world.time) + // Time to inject some threat into the round if(EMERGENCY_ESCAPED_OR_ENDGAMED) // Unless the shuttle is gone return - message_admins("DYNAMIC: Checking for midround injection.") - log_game("DYNAMIC: Checking for midround injection.") - - update_playercounts() - if (get_injection_chance()) + dynamic_log("Checking for midround injection.") + + last_midround_injection_attempt = world.time + + if (prob(get_midround_injection_chance())) var/list/drafted_rules = list() for (var/datum/dynamic_ruleset/midround/rule in midround_rules) - if (rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && threat >= rule.cost) - // Classic secret : only autotraitor/minor roles - if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) + if (!rule.weight) + continue + if (rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && mid_round_budget >= rule.cost) + // If admins have disabled dynamic from picking from the ghost pool + if(rule.ruletype == "Latejoin" && !(GLOB.ghost_role_flags & GHOSTROLE_MIDROUND_EVENT)) + continue + // If admins have disabled dynamic from picking from the ghost pool + if(rule.ruletype == "Latejoin" && !(GLOB.ghost_role_flags & GHOSTROLE_MIDROUND_EVENT)) continue rule.trim_candidates() if (rule.ready()) drafted_rules[rule] = rule.get_weight() if (drafted_rules.len > 0) - picking_midround_latejoin_rule(drafted_rules) - -/// Updates current_players. -/datum/game_mode/dynamic/proc/update_playercounts() - current_players[CURRENT_LIVING_PLAYERS] = list() - current_players[CURRENT_LIVING_ANTAGS] = list() - current_players[CURRENT_DEAD_PLAYERS] = list() - current_players[CURRENT_OBSERVERS] = list() - for (var/mob/M in GLOB.player_list) - if (istype(M, /mob/dead/new_player)) - continue - if (M.stat != DEAD) - current_players[CURRENT_LIVING_PLAYERS].Add(M) - if (M.mind && (M.mind.special_role || M.mind.antag_datums?.len > 0)) - current_players[CURRENT_LIVING_ANTAGS].Add(M) - else - if (istype(M,/mob/dead/observer)) - var/mob/dead/observer/O = M - 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) + pick_midround_rule(drafted_rules) + else if (random_event_hijacked == HIJACKED_TOO_SOON) + log_game("DYNAMIC: Midround injection failed when random event was hijacked. Spawning another random event in its place.") + + // A random event antag would have rolled had this injection check passed. + // As a refund, spawn a non-ghost-role random event. + SSevents.spawnEvent() + SSevents.reschedule() + + random_event_hijacked = HIJACKED_NOTHING -/// Gets the chance for latejoin and midround injection, the dry_run argument is only used for forced injection. +/// Gets the chance for latejoin injection, the dry_run argument is only used for forced injection. /datum/game_mode/dynamic/proc/get_injection_chance(dry_run = FALSE) if(forced_injection) - forced_injection = !dry_run + forced_injection = dry_run return 100 var/chance = 0 - // If the high pop override is in effect, we reduce the impact of population on the antag injection chance - var/high_pop_factor = (current_players[CURRENT_LIVING_PLAYERS].len >= GLOB.dynamic_high_pop_limit) - var/max_pop_per_antag = max(5,15 - round(threat_level/10) - round(current_players[CURRENT_LIVING_PLAYERS].len/(high_pop_factor ? 10 : 5))) + var/max_pop_per_antag = max(5,15 - round(threat_level/10) - round(current_players[CURRENT_LIVING_PLAYERS].len/5)) if (!current_players[CURRENT_LIVING_ANTAGS].len) chance += 50 // No antags at all? let's boost those odds! else @@ -623,12 +646,22 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) chance += 25-10*(max_pop_per_antag-current_pop_per_antag) if (current_players[CURRENT_DEAD_PLAYERS].len > current_players[CURRENT_LIVING_PLAYERS].len) chance -= 30 // More than half the crew died? ew, let's calm down on antags - if (threat > 70) - chance += 15 - if (threat < 30) - chance -= 15 + if (mid_round_budget > higher_injection_chance_minimum_threat) + chance += higher_injection_chance + if (mid_round_budget < lower_injection_chance_minimum_threat) + chance -= lower_injection_chance return round(max(0,chance)) +/// Gets the chance for midround injection, the dry_run argument is only used for forced injection. +/// Usually defers to the latejoin injection chance. +/datum/game_mode/dynamic/proc/get_midround_injection_chance(dry_run) + var/chance = get_injection_chance(dry_run) + + if (random_event_hijacked != HIJACKED_NOTHING) + chance += hijacked_random_event_injection_chance + + return chance + /// Removes type from the list /datum/game_mode/dynamic/proc/remove_from_list(list/type_list, type) for(var/I in type_list) @@ -640,7 +673,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /datum/game_mode/dynamic/proc/check_blocking(list/blocking_list, list/rule_list) if(blocking_list.len > 0) for(var/blocking in blocking_list) - for(var/datum/executed in rule_list) + for(var/_executed in rule_list) + var/datum/executed = _executed if(blocking == executed.type) return TRUE return FALSE @@ -660,53 +694,72 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if(EMERGENCY_ESCAPED_OR_ENDGAMED) // No more rules after the shuttle has left return - update_playercounts() - if (forced_latejoin_rule) forced_latejoin_rule.candidates = list(newPlayer) forced_latejoin_rule.trim_candidates() log_game("DYNAMIC: Forcing ruleset [forced_latejoin_rule]") if (forced_latejoin_rule.ready(TRUE)) - picking_midround_latejoin_rule(list(forced_latejoin_rule), forced = TRUE) + if (!forced_latejoin_rule.repeatable) + latejoin_rules = remove_from_list(latejoin_rules, forced_latejoin_rule.type) + addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/execute_midround_latejoin_rule, forced_latejoin_rule), forced_latejoin_rule.delay) forced_latejoin_rule = null else if (latejoin_injection_cooldown < world.time && prob(get_injection_chance())) var/list/drafted_rules = list() for (var/datum/dynamic_ruleset/latejoin/rule in latejoin_rules) - if (rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && threat >= rule.cost) - // Classic secret : only autotraitor/minor roles - if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) - continue - // No stacking : only one round-enter, unless > stacking_limit threat. - if (threat < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) - if(rule.flags & HIGHLANDER_RULESET && highlander_executed) + if (!rule.weight) + continue + if (rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && mid_round_budget >= rule.cost) + // No stacking : only one round-ender, unless threat level > stacking_limit. + if (threat_level < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) + if(rule.flags & HIGH_IMPACT_RULESET && high_impact_ruleset_executed) continue - + rule.candidates = list(newPlayer) rule.trim_candidates() if (rule.ready()) drafted_rules[rule] = rule.get_weight() - if (drafted_rules.len > 0 && picking_midround_latejoin_rule(drafted_rules)) - var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_latejoin_delay_max + GLOB.dynamic_latejoin_delay_min) - latejoin_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_latejoin_delay_min, GLOB.dynamic_latejoin_delay_max)) + world.time + if (drafted_rules.len > 0 && pick_latejoin_rule(drafted_rules)) + var/latejoin_injection_cooldown_middle = 0.5*(latejoin_delay_max + latejoin_delay_min) + latejoin_injection_cooldown = round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), latejoin_delay_min, latejoin_delay_max)) + world.time + +/// Apply configurations to rule. +/datum/game_mode/dynamic/proc/configure_ruleset(datum/dynamic_ruleset/ruleset) + var/rule_conf = LAZYACCESSASSOC(configuration, ruleset.ruletype, ruleset.name) + for(var/variable in rule_conf) + if(!(variable in ruleset.vars)) + stack_trace("Invalid dynamic configuration variable [variable] in [ruleset.ruletype] [ruleset.name].") + continue + ruleset.vars[variable] = rule_conf[variable] + if(CONFIG_GET(flag/protect_roles_from_antagonist)) + ruleset.restricted_roles |= ruleset.protected_roles + if(CONFIG_GET(flag/protect_assistant_from_antagonist)) + ruleset.restricted_roles |= "Assistant" + if(CONFIG_GET(flag/protect_heads_from_antagonist)) + ruleset.restricted_roles |= GLOB.command_positions /// Refund threat, but no more than threat_level. /datum/game_mode/dynamic/proc/refund_threat(regain) - threat = min(threat_level,threat+regain) + mid_round_budget = min(threat_level, mid_round_budget + regain) /// Generate threat and increase the threat_level if it goes beyond, capped at 100 /datum/game_mode/dynamic/proc/create_threat(gain) - threat = min(100, threat+gain) - if(threat > threat_level) - threat_level = threat + mid_round_budget = min(100, mid_round_budget + gain) + if(mid_round_budget > threat_level) + threat_level = mid_round_budget -/// Expend threat, can't fall under 0. -/datum/game_mode/dynamic/proc/spend_threat(cost) - threat = max(threat-cost,0) +/// Expend round start threat, can't fall under 0. +/datum/game_mode/dynamic/proc/spend_roundstart_budget(cost) + round_start_budget = max(round_start_budget - cost,0) -/// Turns the value generated by lorentz distribution to threat value between 0 and 100. -/datum/game_mode/dynamic/proc/lorentz_to_threat(x) +/// Expend midround threat, can't fall under 0. +/datum/game_mode/dynamic/proc/spend_midround_budget(cost) + mid_round_budget = max(mid_round_budget - cost,0) + +/// Turns the value generated by lorentz distribution to number between 0 and 100. +/// Used for threat level and splitting the budgets. +/datum/game_mode/dynamic/proc/lorentz_to_amount(x) switch (x) if (-INFINITY to -20) return rand(0, 10) @@ -728,3 +781,12 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) return RULE_OF_THREE(40, 20, x) + 50 if (20 to INFINITY) return rand(90, 100) + +/// Log to messages and to the game +/datum/game_mode/dynamic/proc/dynamic_log(text) + message_admins("DYNAMIC: [text]") + log_game("DYNAMIC: [text]") + +#undef FAKE_REPORT_CHANCE +#undef REPORT_NEG_DIVERGENCE +#undef REPORT_POS_DIVERGENCE diff --git a/code/game/gamemodes/dynamic/dynamic_hijacking.dm b/code/game/gamemodes/dynamic/dynamic_hijacking.dm new file mode 100644 index 0000000000000..b2812babc9b84 --- /dev/null +++ b/code/game/gamemodes/dynamic/dynamic_hijacking.dm @@ -0,0 +1,28 @@ +/datum/game_mode/dynamic/proc/setup_hijacking() + RegisterSignal(SSdcs, COMSIG_GLOB_PRE_RANDOM_EVENT, .proc/on_pre_random_event) + +/datum/game_mode/dynamic/proc/on_pre_random_event(datum/source, datum/round_event_control/round_event_control) + SIGNAL_HANDLER + + if (!round_event_control.dynamic_should_hijack) + return + + if (random_event_hijacked != HIJACKED_NOTHING) + dynamic_log("Random event [round_event_control.name] tried to roll, but Dynamic vetoed it (random event has already ran).") + SSevents.spawnEvent() + SSevents.reschedule() + return CANCEL_PRE_RANDOM_EVENT + + var/time_range = rand(random_event_hijack_minimum, random_event_hijack_maximum) + + if (world.time - last_midround_injection_attempt < time_range) + random_event_hijacked = HIJACKED_TOO_RECENT + dynamic_log("Random event [round_event_control.name] tried to roll, but the last midround injection \ + was too recent. Injection chance has been raised to [get_midround_injection_chance(dry_run = TRUE)]%.") + return CANCEL_PRE_RANDOM_EVENT + + if (midround_injection_cooldown - world.time < time_range) + random_event_hijacked = HIJACKED_TOO_SOON + dynamic_log("Random event [round_event_control.name] tried to roll, but the next midround injection \ + is too soon. Injection chance has been raised to [get_midround_injection_chance(dry_run = TRUE)]%.") + return CANCEL_PRE_RANDOM_EVENT diff --git a/code/game/gamemodes/dynamic/dynamic_logging.dm b/code/game/gamemodes/dynamic/dynamic_logging.dm new file mode 100644 index 0000000000000..08eb1330550d2 --- /dev/null +++ b/code/game/gamemodes/dynamic/dynamic_logging.dm @@ -0,0 +1,97 @@ +/// A "snapshot" of dynamic at an important point in time. +/// Exported to JSON in the dynamic.json log file. +/datum/dynamic_snapshot + /// The remaining midround threat + var/remaining_threat + + /// The world.time when the snapshot was taken + var/time + + /// The total number of players in the server + var/total_players + + /// The number of alive players + var/alive_players + + /// The number of dead players + var/dead_players + + /// The number of observers + var/observers + + /// The number of alive antags + var/alive_antags + + /// The rulesets chosen this snapshot + var/datum/dynamic_snapshot_ruleset/ruleset_chosen + + /// The cached serialization of this snapshot + var/serialization + +/// A ruleset chosen during a snapshot +/datum/dynamic_snapshot_ruleset + /// The name of the ruleset chosen + var/name + + /// If it is a round start ruleset, how much it was scaled by + var/scaled + + /// The number of assigned antags + var/assigned + +/datum/dynamic_snapshot_ruleset/New(datum/dynamic_ruleset/ruleset) + name = ruleset.name + assigned = ruleset.assigned.len + + if (istype(ruleset, /datum/dynamic_ruleset/roundstart)) + scaled = ruleset.scaled_times + +/// Convert the snapshot to an associative list +/datum/dynamic_snapshot/proc/to_list() + if (!isnull(serialization)) + return serialization + + serialization = list( + "remaining_threat" = remaining_threat, + "time" = time, + "total_players" = total_players, + "alive_players" = alive_players, + "dead_players" = dead_players, + "observers" = observers, + "alive_antags" = alive_antags, + "ruleset_chosen" = list( + "name" = ruleset_chosen.name, + "scaled" = ruleset_chosen.scaled, + "assigned" = ruleset_chosen.assigned, + ), + ) + + return serialization + +/// Creates a new snapshot with the given rulesets chosen, and writes to the JSON output. +/datum/game_mode/dynamic/proc/new_snapshot(datum/dynamic_ruleset/ruleset_chosen) + var/datum/dynamic_snapshot/new_snapshot = new + + new_snapshot.remaining_threat = mid_round_budget + new_snapshot.time = world.time + new_snapshot.alive_players = current_players[CURRENT_LIVING_PLAYERS].len + new_snapshot.dead_players = current_players[CURRENT_DEAD_PLAYERS].len + new_snapshot.observers = current_players[CURRENT_OBSERVERS].len + new_snapshot.total_players = new_snapshot.alive_players + new_snapshot.dead_players + new_snapshot.observers + new_snapshot.alive_antags = current_players[CURRENT_LIVING_ANTAGS].len + new_snapshot.ruleset_chosen = new /datum/dynamic_snapshot_ruleset(ruleset_chosen) + + LAZYADD(snapshots, new_snapshot) + + var/list/serialized = list() + serialized["threat_level"] = threat_level + serialized["round_start_budget"] = initial_round_start_budget + serialized["mid_round_budget"] = threat_level - initial_round_start_budget + + var/list/serialized_snapshots = list() + for (var/_snapshot in snapshots) + var/datum/dynamic_snapshot/snapshot = _snapshot + serialized_snapshots += list(snapshot.to_list()) + serialized["snapshots"] = serialized_snapshots + + rustg_file_write(json_encode(serialized), "[GLOB.log_directory]/dynamic.json") diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm index 92c5bfb8116d9..48523457569e3 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm @@ -1,3 +1,6 @@ +#define REVOLUTION_VICTORY 1 +#define STATION_VICTORY 2 + /datum/dynamic_ruleset /// For admin logging and round end screen. var/name = "" @@ -31,21 +34,23 @@ var/required_enemies = list(1,1,0,0,0,0,0,0,0,0) /// The rule needs this many candidates (post-trimming) to be executed (example: Cult needs 4 players at round start) var/required_candidates = 0 - /// 1 -> 9, probability for this rule to be picked against other rules + /// 0 -> 9, probability for this rule to be picked against other rules. If zero this will effectively disable the rule. var/weight = 5 /// Threat cost for this rule, this is decreased from the mode's threat when the rule is executed. var/cost = 0 - /// A flag that determines how the ruleset is handled - /// HIGHLANDER_RULESET are rulesets can end the round. - /// TRAITOR_RULESET and MINOR_RULESET can't end the round and have no difference right now. - var/flags = 0 + /// Cost per level the rule scales up. + var/scaling_cost = 0 + /// How many times a rule has scaled up upon getting picked. + var/scaled_times = 0 + /// Used for the roundend report + var/total_cost = 0 + /// A flag that determines how the ruleset is handled. Check __DEFINES/dynamic.dm for an explanation of the accepted values. + var/flags = NONE /// Pop range per requirement. If zero defaults to mode's pop_per_requirement. var/pop_per_requirement = 0 /// Requirements are the threat level requirements per pop range. /// With the default values, The rule will never get drafted below 10 threat level (aka: "peaceful extended"), and it requires a higher threat level at lower pops. var/list/requirements = list(40,30,20,10,10,10,10,10,10,10) - /// An alternative, static requirement used instead when pop is over mode's high_pop_limit. - var/high_population_requirement = 10 /// Reference to the mode, use this instead of SSticker.mode. var/datum/game_mode/dynamic/mode = null /// If a role is to be considered another for the purpose of banning. @@ -57,28 +62,32 @@ /// The maximum amount of players required for the rule to be considered. /// Anything below zero or exactly zero is ignored. var/maximum_players = 0 + /// Calculated during acceptable(), used in scaling and team sizes. + var/indice_pop = 0 + /// Base probability used in scaling. The higher it is, the more likely to scale. Kept as a var to allow for config editing._SendSignal(sigtype, list/arguments) + var/base_prob = 60 + /// Delay for when execute will get called from the time of post_setup (roundstart) or process (midround/latejoin). + /// Make sure your ruleset works with execute being called during the game when using this, and that the clean_up proc reverts it properly in case of faliure. + var/delay = 0 + + /// Judges the amount of antagonists to apply, for both solo and teams. + /// Note that some antagonists (such as traitors, lings, heretics, etc) will add more based on how many times they've been scaled. + /// Written as a linear equation--ceil(x/denominator) + offset, or as a fixed constant. + /// If written as a linear equation, will be in the form of `list("denominator" = denominator, "offset" = offset). + var/antag_cap = 0 /datum/dynamic_ruleset/New() ..() - if(CONFIG_GET(flag/protect_roles_from_antagonist)) - restricted_roles += protected_roles - if(CONFIG_GET(flag/protect_assistant_from_antagonist)) - restricted_roles += "Assistant" - if(CONFIG_GET(flag/protect_heads_from_antagonist)) - restricted_roles += GLOB.command_positions if (istype(SSticker.mode, /datum/game_mode/dynamic)) mode = SSticker.mode - else if (GLOB.master_mode != "dynamic") // This is here to make roundstart forced ruleset function. + else if (!SSticker.is_mode("dynamic")) // This is here to make roundstart forced ruleset function. qdel(src) /datum/dynamic_ruleset/roundstart // One or more of those drafted at roundstart ruletype = "Roundstart" - /// Delay for when execute will get called from the time of post_setup. - /// Make sure your ruleset works with execute being called during the game when using this. - var/delay = 0 // Can be drafted when a player joins the server /datum/dynamic_ruleset/latejoin @@ -87,17 +96,41 @@ /// By default, a rule is acceptable if it satisfies the threat level/population requirements. /// If your rule has extra checks, such as counting security officers, do that in ready() instead /datum/dynamic_ruleset/proc/acceptable(population = 0, threat_level = 0) - pop_per_requirement = pop_per_requirement > 0 ? pop_per_requirement : (mode.pop_per_requirement > 0 ? mode.pop_per_requirement : 6) //sorry ike - if(minimum_players > population) return FALSE if(maximum_players > 0 && population > maximum_players) return FALSE - if (population >= GLOB.dynamic_high_pop_limit) - return (threat_level >= high_population_requirement) - else - var/indice_pop = min(10,round(population/pop_per_requirement)+1) //fuck - return (threat_level >= requirements[indice_pop]) + + pop_per_requirement = pop_per_requirement > 0 ? pop_per_requirement : mode.pop_per_requirement + indice_pop = min(requirements.len,round(population/pop_per_requirement)+1) + return (threat_level >= requirements[indice_pop]) + +/// When picking rulesets, if dynamic picks the same one multiple times, it will "scale up". +/// However, doing this blindly would result in lowpop rounds (think under 10 people) where over 80% of the crew is antags! +/// This function is here to ensure the antag ratio is kept under control while scaling up. +/// Returns how much threat to actually spend in the end. +/datum/dynamic_ruleset/proc/scale_up(population, max_scale) + if (!scaling_cost) + return 0 + + var/antag_fraction = 0 + for(var/_ruleset in (mode.executed_rules + list(src))) // we care about the antags we *will* assign, too + var/datum/dynamic_ruleset/ruleset = _ruleset + antag_fraction += ((1 + ruleset.scaled_times) * ruleset.get_antag_cap(population)) / mode.roundstart_pop_ready + + for(var/i in 1 to max_scale) + if(antag_fraction < 0.25) + scaled_times += 1 + antag_fraction += get_antag_cap(population) / mode.roundstart_pop_ready // we added new antags, gotta update the % + + return scaled_times * scaling_cost + +/// Returns what the antag cap with the given population is. +/datum/dynamic_ruleset/proc/get_antag_cap(population) + if (isnum(antag_cap)) + return antag_cap + + return CEILING(population / antag_cap["denominator"], 1) + (antag_cap["offset"] || 0) /// This is called if persistent variable is true everytime SSTicker ticks. /datum/dynamic_ruleset/proc/rule_process() @@ -124,6 +157,12 @@ return FALSE return TRUE +/// Runs from gamemode process() if ruleset fails to start, like delayed rulesets not getting valid candidates. +/// This one only handles refunding the threat, override in ruleset to clean up the rest. +/datum/dynamic_ruleset/proc/clean_up() + mode.refund_threat(cost + (scaled_times * scaling_cost)) + mode.threat_log += "[worldtime2text()]: [ruletype] [name] refunded [cost + (scaled_times * scaling_cost)]. Failed to execute." + /// Gets weight of the ruleset /// Note that this decreases weight if repeatable is TRUE and repeatable_weight_decrease is higher than 0 /// Note: If you don't want repeatable rulesets to decrease their weight use the weight variable directly @@ -141,14 +180,9 @@ return /// Set mode result and news report here. -/// Only called if ruleset is flagged as HIGHLANDER_RULESET +/// Only called if ruleset is flagged as HIGH_IMPACT_RULESET /datum/dynamic_ruleset/proc/round_result() -/// Checks if round is finished, return true to end the round. -/// Only called if ruleset is flagged as HIGHLANDER_RULESET -/datum/dynamic_ruleset/proc/check_finished() - return FALSE - ////////////////////////////////////////////// // // // ROUNDSTART RULESETS // @@ -158,25 +192,24 @@ /// Checks if candidates are connected and if they are banned or don't want to be the antagonist. /datum/dynamic_ruleset/roundstart/trim_candidates() for(var/mob/dead/new_player/P in candidates) - if (!P.client || !P.mind) // Are they connected? + var/client/client = GET_CLIENT(P) + if (!client || !P.mind) // Are they connected? candidates.Remove(P) - continue - if(!mode.check_age(P.client, minimum_required_age)) + else if(!mode.check_age(client, minimum_required_age)) candidates.Remove(P) continue if(P.mind.special_role) // We really don't want to give antag to an antag. candidates.Remove(P) - continue - if(antag_flag_override) - if(!(antag_flag_override in P.client.prefs.be_special) || is_banned_from(P.ckey, list(antag_flag_override, ROLE_SYNDICATE))) + else if(antag_flag_override) + if(!(antag_flag_override in client.prefs.be_special) || is_banned_from(P.ckey, list(antag_flag_override, ROLE_SYNDICATE))) candidates.Remove(P) continue else - if(!(antag_flag in P.client.prefs.be_special) || is_banned_from(P.ckey, list(antag_flag, ROLE_SYNDICATE))) + if(!(antag_flag in client.prefs.be_special) || is_banned_from(P.ckey, list(antag_flag, ROLE_SYNDICATE))) candidates.Remove(P) continue /// Do your checks if the ruleset is ready to be executed here. /// Should ignore certain checks if forced is TRUE -/datum/dynamic_ruleset/roundstart/ready(forced = FALSE) +/datum/dynamic_ruleset/roundstart/ready(population, forced = FALSE) return ..() diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index ff2ede2c9ecc3..08d236e9dfac4 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -16,7 +16,7 @@ if(!(antag_flag_override in P.client.prefs.be_special) || is_banned_from(P.ckey, list(antag_flag_override, ROLE_SYNDICATE))) candidates.Remove(P) continue - else + else if(!(antag_flag in P.client.prefs.be_special) || is_banned_from(P.ckey, list(antag_flag, ROLE_SYNDICATE))) candidates.Remove(P) continue @@ -59,15 +59,13 @@ name = "Syndicate Infiltrator" antag_datum = /datum/antagonist/traitor antag_flag = ROLE_TRAITOR - protected_roles = list("Security Officer", "Warden", "Head of Personnel", "Detective", "Head of Security", "Captain") + protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel") restricted_roles = list("AI","Cyborg") required_candidates = 1 weight = 7 cost = 5 requirements = list(40,30,20,10,10,10,10,10,10,10) - high_population_requirement = 10 repeatable = TRUE - flags = TRAITOR_RULESET ////////////////////////////////////////////// // // @@ -77,6 +75,7 @@ /datum/dynamic_ruleset/latejoin/provocateur name = "Provocateur" + persistent = TRUE antag_datum = /datum/antagonist/rev/head antag_flag = ROLE_REV_HEAD antag_flag_override = ROLE_REV @@ -85,34 +84,65 @@ required_enemies = list(2,2,1,1,1,1,1,0,0,0) required_candidates = 1 weight = 2 + delay = 1 MINUTES // Prevents rule start while head is offstation. cost = 20 requirements = list(101,101,70,40,30,20,20,20,20,20) - high_population_requirement = 50 - flags = HIGHLANDER_RULESET - var/required_heads = 3 + flags = HIGH_IMPACT_RULESET + blocking_rules = list(/datum/dynamic_ruleset/roundstart/revs) + var/required_heads_of_staff = 3 + var/finished = FALSE + /// How much threat should be injected when the revolution wins? + var/revs_win_threat_injection = 20 + var/datum/team/revolution/revolution /datum/dynamic_ruleset/latejoin/provocateur/ready(forced=FALSE) if (forced) - required_heads = 1 + required_heads_of_staff = 1 if(!..()) return FALSE var/head_check = 0 for(var/mob/player in mode.current_players[CURRENT_LIVING_PLAYERS]) if (player.mind.assigned_role in GLOB.command_positions) head_check++ - return (head_check >= required_heads) + return (head_check >= required_heads_of_staff) /datum/dynamic_ruleset/latejoin/provocateur/execute() - var/mob/M = pick(candidates) - assigned += M.mind - M.mind.special_role = antag_flag - var/datum/antagonist/rev/head/new_head = new() - new_head.give_flash = TRUE - new_head.give_hud = TRUE - new_head.remove_clumsy = TRUE - new_head = M.mind.add_antag_datum(new_head) - new_head.rev_team.max_headrevs = 1 // Only one revhead if it is latejoin. - return TRUE + var/mob/M = pick(candidates) // This should contain a single player, but in case. + if(check_eligible(M.mind)) // Didnt die/run off z-level/get implanted since leaving shuttle. + assigned += M.mind + M.mind.special_role = antag_flag + revolution = new() + var/datum/antagonist/rev/head/new_head = new() + new_head.give_flash = TRUE + new_head.give_hud = TRUE + new_head.remove_clumsy = TRUE + new_head = M.mind.add_antag_datum(new_head, revolution) + revolution.update_objectives() + revolution.update_heads() + SSshuttle.registerHostileEnvironment(revolution) + return TRUE + else + log_game("DYNAMIC: [ruletype] [name] discarded [M.name] from head revolutionary due to ineligibility.") + log_game("DYNAMIC: [ruletype] [name] failed to get any eligible headrevs. Refunding [cost] threat.") + return FALSE + +/datum/dynamic_ruleset/latejoin/provocateur/rule_process() + var/winner = revolution.process_victory(revs_win_threat_injection) + if (isnull(winner)) + return + + finished = winner + return RULESET_STOP_PROCESSING + +/// Checks for revhead loss conditions and other antag datums. +/datum/dynamic_ruleset/latejoin/provocateur/proc/check_eligible(var/datum/mind/M) + var/turf/T = get_turf(M.current) + if(!considered_afk(M) && considered_alive(M) && is_station_level(T.z) && !M.antag_datums?.len && !HAS_TRAIT(M, TRAIT_MINDSHIELD)) + return TRUE + return FALSE + +/datum/dynamic_ruleset/latejoin/provocateur/round_result() + revolution.round_result(finished) ////////////////////////////////////////////// // // @@ -124,7 +154,7 @@ name = "Heretic Smuggler" antag_datum = /datum/antagonist/heretic antag_flag = ROLE_HERETIC - protected_roles = list("Security Officer", "Warden", "Head of Personnel", "Detective", "Head of Security", "Captain","Prisoner") + protected_roles = list("Security Officer", "Warden", "Head of Personnel", "Detective", "Head of Security", "Captain") restricted_roles = list("AI","Cyborg") required_candidates = 1 weight = 4 diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index be421f3b88c4b..7f746c6e3bd91 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -8,7 +8,7 @@ ruletype = "Midround" /// If the ruleset should be restricted from ghost roles. var/restrict_ghost_roles = TRUE - /// What mob type the ruleset is restricted to. + /// What mob type the ruleset is restricted to. var/required_type = /mob/living/carbon/human var/list/living_players = list() var/list/living_antags = list() @@ -41,17 +41,17 @@ continue if(antag_flag_override) if(!(antag_flag_override in M.client.prefs.be_special) || is_banned_from(M.ckey, list(antag_flag_override, ROLE_SYNDICATE))) - candidates.Remove(M) + trimmed_list.Remove(M) continue else if(!(antag_flag in M.client.prefs.be_special) || is_banned_from(M.ckey, list(antag_flag, ROLE_SYNDICATE))) - candidates.Remove(M) + trimmed_list.Remove(M) continue if (M.mind) if (restrict_ghost_roles && (M.mind.assigned_role in GLOB.exp_specialmap[EXP_TYPE_SPECIAL])) // Are they playing a ghost role? trimmed_list.Remove(M) continue - if (M.mind.assigned_role in restricted_roles || HAS_TRAIT(M, TRAIT_MINDSHIELD)) // Does their job allow it or are they mindshielded? + if (M.mind.assigned_role in restricted_roles) // Does their job allow it? trimmed_list.Remove(M) continue if ((exclusive_roles.len > 0) && !(M.mind.assigned_role in exclusive_roles)) // Is the rule exclusive to their job? @@ -68,9 +68,9 @@ if (!forced) var/job_check = 0 if (enemy_roles.len > 0) - for (var/mob/M in living_players) - if (M.stat == DEAD) - continue // Dead players cannot count as opponents + for (var/mob/M in mode.current_players[CURRENT_LIVING_PLAYERS]) + if (M.stat == DEAD || !M.client) + continue // Dead/disconnected players cannot count as opponents 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 @@ -97,13 +97,11 @@ message_admins("Polling [possible_volunteers.len] players to apply for the [name] ruleset.") log_game("DYNAMIC: Polling [possible_volunteers.len] players to apply for the [name] ruleset.") - candidates = pollGhostCandidates("The mode is looking for volunteers to become [antag_flag] for [name]", antag_flag, SSticker.mode, antag_flag, poll_time = 300) - + candidates = pollGhostCandidates("The mode is looking for volunteers to become [antag_flag] for [name]", antag_flag, SSticker.mode, antag_flag_override ? antag_flag_override : antag_flag, poll_time = 300) + if(!candidates || candidates.len <= 0) message_admins("The ruleset [name] received no applications.") log_game("DYNAMIC: The ruleset [name] received no applications.") - mode.refund_threat(cost) - mode.threat_log += "[worldtime2text()]: Rule [name] refunded [cost] (no applications)" mode.executed_rules -= src return @@ -118,15 +116,13 @@ if(candidates.len <= 0) if(i == 1) // We have found no candidates so far and we are out of applicants. - mode.refund_threat(cost) - mode.threat_log += "[worldtime2text()]: Rule [name] refunded [cost] (all applications invalid)" mode.executed_rules -= src break var/mob/applicant = pick(candidates) candidates -= applicant if(!isobserver(applicant)) if(applicant.stat == DEAD) // Not an observer? If they're dead, make them one. - applicant = applicant.ghostize(FALSE) + applicant = applicant.ghostize(FALSE,SENTIENCE_ERASE) else // Not dead? Disregard them, pick a new applicant i-- continue @@ -168,30 +164,36 @@ name = "Syndicate Sleeper Agent" antag_datum = /datum/antagonist/traitor antag_flag = ROLE_TRAITOR - protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel") + protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") restricted_roles = list("Cyborg", "AI", "Positronic Brain") required_candidates = 1 weight = 7 cost = 10 requirements = list(50,40,30,20,10,10,10,10,10,10) repeatable = TRUE - high_population_requirement = 10 - flags = TRAITOR_RULESET /datum/dynamic_ruleset/midround/autotraitor/acceptable(population = 0, threat = 0) var/player_count = mode.current_players[CURRENT_LIVING_PLAYERS].len var/antag_count = mode.current_players[CURRENT_LIVING_ANTAGS].len var/max_traitors = round(player_count / 10) + 1 - if ((antag_count < max_traitors) && prob(mode.threat_level))//adding traitors if the antag population is getting low - return ..() - else + + // adding traitors if the antag population is getting low + var/too_little_antags = antag_count < max_traitors + if (!too_little_antags) + log_game("DYNAMIC: Too many living antags compared to living players ([antag_count] living antags, [player_count] living players, [max_traitors] max traitors)") + return FALSE + + if (!prob(mode.threat_level)) + log_game("DYNAMIC: Random chance to roll autotraitor failed, it was a [mode.threat_level]% chance.") return FALSE + return ..() + /datum/dynamic_ruleset/midround/autotraitor/trim_candidates() ..() for(var/mob/living/player in living_players) if(issilicon(player)) // Your assigned role doesn't change when you are turned into a silicon. - living_players -= player + living_players -= player continue if(is_centcom_level(player.z)) living_players -= player // We don't autotator people in CentCom @@ -223,21 +225,20 @@ name = "Malfunctioning AI" antag_datum = /datum/antagonist/traitor antag_flag = ROLE_MALF - enemy_roles = list("Security Officer", "Warden","Detective","Head of Security", "Captain", "Scientist", "Chemist", "Research Director", "Chief Engineer") + enemy_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Scientist", "Chemist", "Research Director", "Chief Engineer") exclusive_roles = list("AI") required_enemies = list(4,4,4,4,4,4,2,2,2,0) required_candidates = 1 weight = 3 - cost = 35 + cost = 20 requirements = list(101,101,80,70,60,60,50,50,40,40) - high_population_requirement = 35 required_type = /mob/living/silicon/ai var/ion_announce = 33 var/removeDontImproveChance = 10 /datum/dynamic_ruleset/midround/malf/trim_candidates() ..() - candidates = candidates[CURRENT_LIVING_PLAYERS] + candidates = living_players for(var/mob/living/player in candidates) if(!isAI(player)) candidates -= player @@ -257,7 +258,7 @@ M.mind.special_role = antag_flag M.mind.add_antag_datum(AI) if(prob(ion_announce)) - priority_announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", 'sound/ai/ionstorm.ogg') + priority_announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", ANNOUNCER_IONSTORM) if(prob(removeDontImproveChance)) M.replace_random_law(generate_ion_law(), list(LAW_INHERENT, LAW_SUPPLIED, LAW_ION)) else @@ -274,13 +275,12 @@ name = "Wizard" antag_datum = /datum/antagonist/wizard antag_flag = ROLE_WIZARD - enemy_roles = list("Security Officer","Detective","Head of Security", "Captain") + enemy_roles = list("Security Officer", "Detective", "Warden", "Head of Security", "Captain", "Research Director") //RD doesn't believe in magic required_enemies = list(2,2,1,1,1,1,1,0,0,0) required_candidates = 1 weight = 1 cost = 20 requirements = list(90,90,70,40,30,20,10,10,10,10) - high_population_requirement = 50 repeatable = TRUE /datum/dynamic_ruleset/midround/from_ghosts/wizard/ready(forced = FALSE) @@ -306,21 +306,20 @@ name = "Nuclear Assault" antag_flag = ROLE_OPERATIVE antag_datum = /datum/antagonist/nukeop - enemy_roles = list("AI", "Cyborg", "Security Officer", "Warden","Detective","Head of Security", "Captain") + enemy_roles = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain") required_enemies = list(3,3,3,3,3,2,1,1,0,0) required_candidates = 5 weight = 5 - cost = 35 + cost = 20 requirements = list(90,90,90,80,60,40,30,20,10,10) - high_population_requirement = 10 - var/operative_cap = list(2,2,3,3,4,5,5,5,5,5) + var/list/operative_cap = list(2,2,3,3,4,5,5,5,5,5) var/datum/team/nuclear/nuke_team - flags = HIGHLANDER_RULESET + flags = HIGH_IMPACT_RULESET /datum/dynamic_ruleset/midround/from_ghosts/nuclear/acceptable(population=0, threat=0) if (locate(/datum/dynamic_ruleset/roundstart/nuclear) in mode.executed_rules) return FALSE // Unavailable if nuke ops were already sent at roundstart - var/indice_pop = min(10,round(living_players.len/5)+1) + indice_pop = min(operative_cap.len, round(living_players.len/5)+1) required_candidates = operative_cap[indice_pop] return ..() @@ -349,13 +348,12 @@ name = "Blob" antag_datum = /datum/antagonist/blob antag_flag = ROLE_BLOB - enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain") + enemy_roles = list("Security Officer", "Detective", "Warden", "Head of Security", "Captain") required_enemies = list(2,2,1,1,1,1,1,0,0,0) required_candidates = 1 weight = 4 cost = 10 requirements = list(101,101,101,80,60,50,30,20,10,10) - high_population_requirement = 50 repeatable = TRUE /datum/dynamic_ruleset/midround/from_ghosts/blob/generate_ruleset_body(mob/applicant) @@ -372,13 +370,12 @@ name = "Alien Infestation" antag_datum = /datum/antagonist/xeno antag_flag = ROLE_ALIEN - enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain") + enemy_roles = list("Security Officer", "Detective", "Warden", "Head of Security", "Captain") required_enemies = list(2,2,1,1,1,1,1,0,0,0) required_candidates = 1 weight = 3 cost = 10 requirements = list(101,101,101,70,50,40,20,15,10,10) - high_population_requirement = 50 repeatable = TRUE var/list/vents = list() @@ -419,13 +416,12 @@ antag_datum = /datum/antagonist/nightmare antag_flag = "Nightmare" antag_flag_override = ROLE_ALIEN - enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain") + enemy_roles = list("Security Officer", "Detective", "Warden", "Head of Security", "Captain") required_enemies = list(2,2,1,1,1,1,1,0,0,0) required_candidates = 1 weight = 3 cost = 10 requirements = list(101,101,101,70,50,40,20,15,10,10) - high_population_requirement = 50 repeatable = TRUE var/list/spawn_locs = list() @@ -454,3 +450,41 @@ message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Nightmare by the midround ruleset.") log_game("DYNAMIC: [key_name(S)] was spawned as a Nightmare by the midround ruleset.") return S + +////////////////////////////////////////////// +// // +// ABDUCTORS (GHOST) // +// // +////////////////////////////////////////////// +#define ABDUCTOR_MAX_TEAMS 4 + +/datum/dynamic_ruleset/midround/from_ghosts/abductors + name = "Abductors" + antag_flag = "Abductor" + antag_flag_override = ROLE_ABDUCTOR + enemy_roles = list("Security Officer", "Detective", "Warden", "Head of Security", "Captain") + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 2 + weight = 4 + cost = 10 + requirements = list(101,101,101,80,60,50,30,20,10,10) + repeatable = TRUE + var/datum/team/abductor_team/new_team + +/datum/dynamic_ruleset/midround/from_ghosts/abductors/ready(forced = FALSE) + if (required_candidates > (dead_players.len + list_observers.len)) + return FALSE + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/abductors/finish_setup(mob/new_character, index) + if (index == 1) // Our first guy is the scientist. We also initialize the team here as well since this should only happen once per pair of abductors. + new_team = new + if(new_team.team_number > ABDUCTOR_MAX_TEAMS) + return MAP_ERROR + var/datum/antagonist/abductor/scientist/new_role = new + new_character.mind.add_antag_datum(new_role, new_team) + else // Our second guy is the agent, team is already created, don't need to make another one. + var/datum/antagonist/abductor/agent/new_role = new + new_character.mind.add_antag_datum(new_role, new_team) + +#undef ABDUCTOR_MAX_TEAMS diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index a2f02cad28f45..5c40f2f31b822 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -9,20 +9,23 @@ name = "Traitors" persistent = TRUE antag_flag = ROLE_TRAITOR - antag_datum = /datum/antagonist/traitor/ + antag_datum = /datum/antagonist/traitor minimum_required_age = 0 protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") restricted_roles = list("Cyborg") required_candidates = 1 weight = 5 - cost = 10 + cost = 8 // Avoid raising traitor threat above 10, as it is the default low cost ruleset. + scaling_cost = 9 requirements = list(10,10,10,10,10,10,10,10,10,10) - high_population_requirement = 10 - var/autotraitor_cooldown = 450 // 15 minutes (ticks once per 2 sec) + antag_cap = list("denominator" = 24) + var/autotraitor_cooldown = (15 MINUTES) + COOLDOWN_DECLARE(autotraitor_cooldown_check) -/datum/dynamic_ruleset/roundstart/traitor/pre_execute() - var/traitor_scaling_coeff = 10 - max(0,round(mode.threat_level/10)-5) // Above 50 threat level, coeff goes down by 1 for every 10 levels - var/num_traitors = min(round(mode.candidates.len / traitor_scaling_coeff) + 1, candidates.len) +/datum/dynamic_ruleset/roundstart/traitor/pre_execute(population) + . = ..() + COOLDOWN_START(src, autotraitor_cooldown_check, autotraitor_cooldown) + var/num_traitors = get_antag_cap(population) * (scaled_times + 1) for (var/i = 1 to num_traitors) var/mob/M = pick_n_take(candidates) assigned += M.mind @@ -31,11 +34,8 @@ return TRUE /datum/dynamic_ruleset/roundstart/traitor/rule_process() - if (autotraitor_cooldown > 0) - autotraitor_cooldown-- - else - autotraitor_cooldown = 450 // 15 minutes - message_admins("Checking if we can turn someone into a traitor.") + if (COOLDOWN_FINISHED(src, autotraitor_cooldown_check)) + COOLDOWN_START(src, autotraitor_cooldown_check, autotraitor_cooldown) log_game("DYNAMIC: Checking if we can turn someone into a traitor.") mode.picking_specific_rule(/datum/dynamic_ruleset/midround/autotraitor) @@ -53,19 +53,16 @@ restricted_roles = list("Cyborg", "AI") required_candidates = 2 weight = 4 - cost = 10 + cost = 15 + scaling_cost = 15 requirements = list(40,30,30,20,20,15,15,15,10,10) - high_population_requirement = 15 + antag_cap = 2 // Can pick 3 per team, but rare enough it doesn't matter. var/list/datum/team/brother_team/pre_brother_teams = list() - var/const/team_amount = 2 // Hard limit on brother teams if scaling is turned off var/const/min_team_size = 2 -/datum/dynamic_ruleset/roundstart/traitorbro/pre_execute() - var/num_teams = team_amount - var/bsc = CONFIG_GET(number/brother_scaling_coeff) - if(bsc) - num_teams = max(1, round(mode.roundstart_pop_ready / bsc)) - +/datum/dynamic_ruleset/roundstart/traitorbro/pre_execute(population) + . = ..() + var/num_teams = (get_antag_cap(population)/min_team_size) * (scaled_times + 1) // 1 team per scaling for(var/j = 1 to num_teams) if(candidates.len < min_team_size || candidates.len < required_candidates) break @@ -104,13 +101,14 @@ restricted_roles = list("AI", "Cyborg") required_candidates = 1 weight = 3 - cost = 30 - requirements = list(80,70,60,50,40,20,20,10,10,10) - high_population_requirement = 10 - var/team_mode_probability = 30 + cost = 16 + scaling_cost = 10 + requirements = list(70,70,60,50,40,20,20,10,10,10) + antag_cap = list("denominator" = 29) -/datum/dynamic_ruleset/roundstart/changeling/pre_execute() - var/num_changelings = min(round(mode.candidates.len / 10) + 1, candidates.len) +/datum/dynamic_ruleset/roundstart/changeling/pre_execute(population) + . = ..() + var/num_changelings = get_antag_cap(population) * (scaled_times + 1) for (var/i = 1 to num_changelings) var/mob/M = pick_n_take(candidates) assigned += M.mind @@ -134,16 +132,19 @@ name = "Heretics" antag_flag = ROLE_HERETIC antag_datum = /datum/antagonist/heretic - protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Brig Physician") + protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") restricted_roles = list("AI", "Cyborg") required_candidates = 1 weight = 3 - cost = 20 + cost = 15 + scaling_cost = 9 requirements = list(50,45,45,40,35,20,20,15,10,10) + antag_cap = list("denominator" = 24) -/datum/dynamic_ruleset/roundstart/heretics/pre_execute() + +/datum/dynamic_ruleset/roundstart/heretics/pre_execute(population) . = ..() - var/num_ecult = min(round(mode.candidates.len / 10) + 1, candidates.len) + var/num_ecult = get_antag_cap(population) * (scaled_times + 1) for (var/i = 1 to num_ecult) var/mob/picked_candidate = pick_n_take(candidates) @@ -173,13 +174,13 @@ name = "Wizard" antag_flag = ROLE_WIZARD antag_datum = /datum/antagonist/wizard + flags = LONE_RULESET minimum_required_age = 14 restricted_roles = list("Head of Security", "Captain") // Just to be sure that a wizard getting picked won't ever imply a Captain or HoS not getting drafted required_candidates = 1 weight = 2 - cost = 30 + cost = 20 requirements = list(90,90,70,40,30,20,10,10,10,10) - high_population_requirement = 10 var/list/roundstart_wizards = list() /datum/dynamic_ruleset/roundstart/wizard/acceptable(population=0, threat=0) @@ -192,7 +193,7 @@ /datum/dynamic_ruleset/roundstart/wizard/pre_execute() if(GLOB.wizardstart.len == 0) return FALSE - + mode.antags_rolled += 1 var/mob/M = pick_n_take(candidates) if (M) assigned += M.mind @@ -221,21 +222,19 @@ restricted_roles = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Chaplain", "Head of Personnel") required_candidates = 2 weight = 3 - cost = 30 + cost = 20 requirements = list(100,90,80,60,40,30,10,10,10,10) - high_population_requirement = 10 - flags = HIGHLANDER_RULESET - var/cultist_cap = list(2,2,2,3,3,4,4,4,4,4) + flags = HIGH_IMPACT_RULESET + antag_cap = list("denominator" = 20, "offset" = 1) var/datum/team/cult/main_cult -/datum/dynamic_ruleset/roundstart/bloodcult/ready(forced = FALSE) - var/indice_pop = min(10,round(mode.roundstart_pop_ready/pop_per_requirement)+1) - required_candidates = cultist_cap[indice_pop] +/datum/dynamic_ruleset/roundstart/bloodcult/ready(population, forced = FALSE) + required_candidates = get_antag_cap(population) . = ..() -/datum/dynamic_ruleset/roundstart/bloodcult/pre_execute() - var/indice_pop = min(10,round(mode.roundstart_pop_ready/pop_per_requirement)+1) - var/cultists = cultist_cap[indice_pop] +/datum/dynamic_ruleset/roundstart/bloodcult/pre_execute(population) + . = ..() + var/cultists = get_antag_cap(population) for(var/cultists_number = 1 to cultists) if(candidates.len <= 0) break @@ -279,23 +278,20 @@ restricted_roles = list("Head of Security", "Captain") // Just to be sure that a nukie getting picked won't ever imply a Captain or HoS not getting drafted required_candidates = 5 weight = 3 - cost = 40 + cost = 20 requirements = list(90,90,90,80,60,40,30,20,10,10) - high_population_requirement = 10 - flags = HIGHLANDER_RULESET - var/operative_cap = list(2,2,2,3,3,3,4,4,5,5) + flags = HIGH_IMPACT_RULESET + antag_cap = list("denominator" = 18, "offset" = 1) var/datum/team/nuclear/nuke_team -/datum/dynamic_ruleset/roundstart/nuclear/ready(forced = FALSE) - var/indice_pop = min(10,round(mode.roundstart_pop_ready/pop_per_requirement)+1) - required_candidates = operative_cap[indice_pop] +/datum/dynamic_ruleset/roundstart/nuclear/ready(population, forced = FALSE) + required_candidates = get_antag_cap(population) . = ..() -/datum/dynamic_ruleset/roundstart/nuclear/pre_execute() +/datum/dynamic_ruleset/roundstart/nuclear/pre_execute(population) + . = ..() // If ready() did its job, candidates should have 5 or more members in it - - var/indice_pop = min(10,round(mode.roundstart_pop_ready/5)+1) - var/operatives = operative_cap[indice_pop] + var/operatives = get_antag_cap(population) for(var/operatives_number = 1 to operatives) if(candidates.len <= 0) break @@ -366,20 +362,24 @@ minimum_required_age = 14 restricted_roles = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director") required_candidates = 3 - weight = 2 + weight = 3 delay = 7 MINUTES - cost = 35 + cost = 20 requirements = list(101,101,70,40,30,20,10,10,10,10) - high_population_requirement = 10 - flags = HIGHLANDER_RULESET + antag_cap = 3 + flags = HIGH_IMPACT_RULESET + blocking_rules = list(/datum/dynamic_ruleset/latejoin/provocateur) // I give up, just there should be enough heads with 35 players... minimum_players = 35 + /// How much threat should be injected when the revolution wins? + var/revs_win_threat_injection = 20 var/datum/team/revolution/revolution - var/finished = 0 + var/finished = FALSE -/datum/dynamic_ruleset/roundstart/revs/pre_execute() - var/max_canditates = 3 - for(var/i = 1 to max_canditates) +/datum/dynamic_ruleset/roundstart/revs/pre_execute(population) + . = ..() + var/max_candidates = get_antag_cap(population) + for(var/i = 1 to max_candidates) if(candidates.len <= 0) break var/mob/M = pick_n_take(candidates) @@ -391,56 +391,43 @@ /datum/dynamic_ruleset/roundstart/revs/execute() revolution = new() for(var/datum/mind/M in assigned) - var/datum/antagonist/rev/head/new_head = new antag_datum() - new_head.give_flash = TRUE - new_head.give_hud = TRUE - new_head.remove_clumsy = TRUE - M.add_antag_datum(new_head,revolution) - revolution.update_objectives() - revolution.update_heads() - SSshuttle.registerHostileEnvironment(src) - return TRUE + if(check_eligible(M)) + var/datum/antagonist/rev/head/new_head = new antag_datum() + new_head.give_flash = TRUE + new_head.give_hud = TRUE + new_head.remove_clumsy = TRUE + M.add_antag_datum(new_head,revolution) + else + assigned -= M + log_game("DYNAMIC: [ruletype] [name] discarded [M.name] from head revolutionary due to ineligibility.") + if(revolution.members.len) + revolution.update_objectives() + revolution.update_heads() + SSshuttle.registerHostileEnvironment(revolution) + return TRUE + log_game("DYNAMIC: [ruletype] [name] failed to get any eligible headrevs. Refunding [cost] threat.") + return FALSE + +/datum/dynamic_ruleset/roundstart/revs/clean_up() + qdel(revolution) + ..() /datum/dynamic_ruleset/roundstart/revs/rule_process() - if(!revolution) - log_game("DYNAMIC: Something went horrifically wrong with [name] - and the antag datum could not be created. Notify coders.") + var/winner = revolution.process_victory(revs_win_threat_injection) + if (isnull(winner)) return - if(check_rev_victory()) - finished = 1 - else if(check_heads_victory()) - finished = 2 - -/datum/dynamic_ruleset/roundstart/revs/check_finished() - if(CONFIG_GET(keyed_list/continuous)["revolution"]) - if(finished) - SSshuttle.clearHostileEnvironment(src) - return ..() - if(finished != 0) - return TRUE - else - return ..() - -/datum/dynamic_ruleset/roundstart/revs/proc/check_rev_victory() - for(var/datum/objective/mutiny/objective in revolution.objectives) - if(!(objective.check_completion())) - return FALSE - return TRUE + finished = winner + return RULESET_STOP_PROCESSING -/datum/dynamic_ruleset/roundstart/revs/proc/check_heads_victory() - for(var/datum/mind/rev_mind in revolution.head_revolutionaries()) - var/turf/T = get_turf(rev_mind.current) - if(!considered_afk(rev_mind) && considered_alive(rev_mind) && is_station_level(T.z)) - if(ishuman(rev_mind.current) || ismonkey(rev_mind.current)) - return FALSE - return TRUE +/// Checks for revhead loss conditions and other antag datums. +/datum/dynamic_ruleset/roundstart/revs/proc/check_eligible(var/datum/mind/M) + var/turf/T = get_turf(M.current) + if(!considered_afk(M) && considered_alive(M) && is_station_level(T.z) && !M.antag_datums?.len && !HAS_TRAIT(M, TRAIT_MINDSHIELD)) + return TRUE + return FALSE /datum/dynamic_ruleset/roundstart/revs/round_result() - if(finished == 1) - SSticker.mode_result = "win - heads killed" - SSticker.news_report = REVS_WIN - else if(finished == 2) - SSticker.mode_result = "loss - rev heads killed" - SSticker.news_report = REVS_LOSE + revolution.round_result(finished) // Admin only rulesets. The threat requirement is 101 so it is not possible to roll them. @@ -459,12 +446,14 @@ weight = 3 cost = 0 requirements = list(101,101,101,101,101,101,101,101,101,101) - high_population_requirement = 101 + flags = LONE_RULESET /datum/dynamic_ruleset/roundstart/extended/pre_execute() message_admins("Starting a round of extended.") log_game("Starting a round of extended.") - mode.spend_threat(mode.threat) + mode.spend_roundstart_budget(mode.round_start_budget) + mode.spend_midround_budget(mode.mid_round_budget) + mode.threat_log += "[worldtime2text()]: Extended ruleset set threat to 0." return TRUE ////////////////////////////////////////////// @@ -478,7 +467,6 @@ antag_datum = /datum/antagonist/nukeop/clownop antag_leader_datum = /datum/antagonist/nukeop/leader/clownop requirements = list(101,101,101,101,101,101,101,101,101,101) - high_population_requirement = 101 /datum/dynamic_ruleset/roundstart/nuclear/clown_ops/pre_execute() . = ..() @@ -502,22 +490,17 @@ name = "Devil" antag_flag = ROLE_DEVIL antag_datum = /datum/antagonist/devil - restricted_roles = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI", "Cyborg", "Security Officer", "Warden", "Detective", "Brig Physician") + restricted_roles = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI", "Cyborg", "Security Officer", "Warden", "Detective") required_candidates = 1 weight = 3 cost = 0 + flags = LONE_RULESET requirements = list(101,101,101,101,101,101,101,101,101,101) - high_population_requirement = 101 - var/devil_limit = 4 // Hard limit on devils if scaling is turned off - -/datum/dynamic_ruleset/roundstart/devil/pre_execute() - var/tsc = CONFIG_GET(number/traitor_scaling_coeff) - var/num_devils = 1 + antag_cap = list("denominator" = 30) - if(tsc) - num_devils = max(required_candidates, min(round(mode.roundstart_pop_ready / (tsc * 3)) + 2, round(mode.roundstart_pop_ready / (tsc * 1.5)))) - else - num_devils = max(required_candidates, min(mode.roundstart_pop_ready, devil_limit)) +/datum/dynamic_ruleset/roundstart/devil/pre_execute(population) + . = ..() + var/num_devils = get_antag_cap(population) * (scaled_times + 1) for(var/j = 0, j < num_devils, j++) if (!candidates.len) @@ -565,14 +548,15 @@ weight = 3 cost = 0 requirements = list(101,101,101,101,101,101,101,101,101,101) - high_population_requirement = 101 + flags = LONE_RULESET var/players_per_carrier = 30 var/monkeys_to_win = 1 var/escaped_monkeys = 0 var/datum/team/monkey/monkey_team -/datum/dynamic_ruleset/roundstart/monkey/pre_execute() - var/carriers_to_make = max(round(mode.roundstart_pop_ready / players_per_carrier, 1), 1) +/datum/dynamic_ruleset/roundstart/monkey/pre_execute(population) + . = ..() + var/carriers_to_make = get_antag_cap(population) * (scaled_times + 1) for(var/j = 0, j < carriers_to_make, j++) if (!candidates.len) @@ -624,7 +608,7 @@ weight = 3 cost = 0 requirements = list(101,101,101,101,101,101,101,101,101,101) - high_population_requirement = 101 + flags = LONE_RULESET var/meteordelay = 2000 var/nometeors = 0 var/rampupdelta = 5 @@ -645,3 +629,65 @@ var/ramp_up_final = CLAMP(round(meteorminutes/rampupdelta), 1, 10) spawn_meteors(ramp_up_final, wavetype) + +////////////////////////////////////////////// +// // +// CLOCKCULT // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/roundstart/clockcult + name = "Clockwork Cult" + antag_flag = ROLE_SERVANT_OF_RATVAR + antag_datum = /datum/antagonist/servant_of_ratvar + restricted_roles = list("AI", "Cyborg", "Security Officer", "Warden", "Detective","Head of Security", "Captain", "Chaplain", "Head of Personnel") + required_candidates = 4 + weight = 3 + cost = 35 + requirements = list(100,90,80,70,60,50,30,30,30,30) + flags = HIGH_IMPACT_RULESET + var/datum/team/clock_cult/main_cult + var/list/selected_servants = list() + +/datum/dynamic_ruleset/roundstart/clockcult/pre_execute() + //Load Reebe + LoadReebe() + //Make cultists + var/starter_servants = 4 + var/number_players = mode.roundstart_pop_ready + if(number_players > 30) + number_players -= 30 + starter_servants += round(number_players / 10) + starter_servants = min(starter_servants, 8) + for (var/i in 1 to starter_servants) + var/mob/servant = pick_n_take(candidates) + assigned += servant.mind + servant.mind.assigned_role = ROLE_SERVANT_OF_RATVAR + servant.mind.special_role = ROLE_SERVANT_OF_RATVAR + //Generate scriptures + generate_clockcult_scriptures() + return TRUE + +/datum/dynamic_ruleset/roundstart/clockcult/execute() + var/list/spawns = GLOB.servant_spawns.Copy() + main_cult = new + main_cult.setup_objectives() + //Create team + for(var/datum/mind/servant_mind in assigned) + servant_mind.current.forceMove(pick_n_take(spawns)) + servant_mind.current.set_species(/datum/species/human) + var/datum/antagonist/servant_of_ratvar/S = add_servant_of_ratvar(servant_mind.current, team=main_cult) + S.equip_carbon(servant_mind.current) + S.equip_servant() + S.prefix = CLOCKCULT_PREFIX_MASTER + //Setup the conversion limits for auto opening the ark + calculate_clockcult_values() + return ..() + +/datum/dynamic_ruleset/roundstart/clockcult/round_result() + if(GLOB.ratvar_risen) + SSticker.news_report = CLOCK_SUMMON + SSticker.mode_result = "win - servants completed their objective (summon ratvar)" + else + SSticker.news_report = CULT_FAILURE + SSticker.mode_result = "loss - servants failed their objective (summon ratvar)" diff --git a/code/game/gamemodes/dynamic/dynamic_simulations.dm b/code/game/gamemodes/dynamic/dynamic_simulations.dm new file mode 100644 index 0000000000000..3e312b65700ab --- /dev/null +++ b/code/game/gamemodes/dynamic/dynamic_simulations.dm @@ -0,0 +1,137 @@ +#ifdef TESTING +/datum/dynamic_simulation + var/datum/game_mode/dynamic/gamemode + var/datum/dynamic_simulation_config/config + var/list/mock_candidates = list() + +/datum/dynamic_simulation/proc/initialize_gamemode(forced_threat) + gamemode = new + + if (forced_threat) + gamemode.create_threat(forced_threat) + else + gamemode.generate_threat() + + gamemode.generate_budgets() + gamemode.set_cooldowns() + +/datum/dynamic_simulation/proc/create_candidates(players) + GLOB.new_player_list.Cut() + + for (var/_ in 1 to players) + var/mob/dead/new_player/mock_new_player = new + mock_new_player.ready = PLAYER_READY_TO_PLAY + + var/datum/mind/mock_mind = new + mock_new_player.mind = mock_mind + + var/datum/client_interface/mock_client = new + + var/datum/preferences/prefs = new + var/list/be_special = list() + for (var/special_role in GLOB.special_roles) + be_special += special_role + + prefs.be_special = be_special + mock_client.prefs = prefs + + mock_new_player.mock_client = mock_client + + mock_candidates += mock_new_player + +/datum/dynamic_simulation/proc/simulate(datum/dynamic_simulation_config/config) + src.config = config + + initialize_gamemode(config.forced_threat_level) + create_candidates(config.roundstart_players) + gamemode.pre_setup() + + var/total_antags = 0 + for (var/_ruleset in gamemode.executed_rules) + var/datum/dynamic_ruleset/ruleset = _ruleset + total_antags += ruleset.assigned.len + + return list( + "roundstart_players" = config.roundstart_players, + "threat_level" = gamemode.threat_level, + "snapshot" = list( + "antag_percent" = total_antags / config.roundstart_players, + "remaining_threat" = gamemode.mid_round_budget, + "rulesets" = gamemode.executed_rules.Copy(), + ), + ) + +/datum/dynamic_simulation_config + /// How many players round start should there be? + var/roundstart_players + + /// Optional, force this threat level instead of picking randomly through the lorentz distribution + var/forced_threat_level + +/client/proc/run_dynamic_simulations() + set name = "Run Dynamic Simulations" + set category = "Debug" + + var/simulations = input(usr, "Enter number of simulations") as num + var/roundstart_players = input(usr, "Enter number of round start players") as num + var/forced_threat_level = input(usr, "Enter forced threat level, if you want one") as num | null + + SSticker.mode = config.pick_mode("dynamic") + message_admins("Running dynamic simulations...") + + var/list/outputs = list() + + var/datum/dynamic_simulation_config/dynamic_config = new + + if (roundstart_players) + dynamic_config.roundstart_players = roundstart_players + + if (forced_threat_level) + dynamic_config.forced_threat_level = forced_threat_level + + for (var/count in 1 to simulations) + var/datum/dynamic_simulation/simulator = new + var/output = simulator.simulate(dynamic_config) + outputs += list(output) + + if (CHECK_TICK) + log_world("[count]/[simulations]") + + message_admins("Writing file...") + WRITE_FILE(file("[GLOB.log_directory]/dynamic_simulations.json"), json_encode(outputs)) + message_admins("Writing complete.") + +/proc/export_dynamic_json_of(ruleset_list) + var/list/export = list() + + for (var/_ruleset in ruleset_list) + var/datum/dynamic_ruleset/ruleset = _ruleset + export[ruleset.name] = list( + "repeatable_weight_decrease" = ruleset.repeatable_weight_decrease, + "weight" = ruleset.weight, + "cost" = ruleset.cost, + "scaling_cost" = ruleset.scaling_cost, + "antag_cap" = ruleset.antag_cap, + "pop_per_requirement" = ruleset.pop_per_requirement, + "requirements" = ruleset.requirements, + "base_prob" = ruleset.base_prob, + ) + + return export + +/client/proc/export_dynamic_json() + set name = "Export dynamic.json" + set category = "Debug" + + var/datum/game_mode/dynamic/dynamic = SSticker.mode + + var/list/export = list() + export["Roundstart"] = export_dynamic_json_of(dynamic.roundstart_rules) + export["Midround"] = export_dynamic_json_of(dynamic.midround_rules) + export["Latejoin"] = export_dynamic_json_of(dynamic.latejoin_rules) + + message_admins("Writing file...") + WRITE_FILE(file("[GLOB.log_directory]/dynamic.json"), json_encode(export)) + message_admins("Writing complete.") + +#endif diff --git a/code/game/gamemodes/dynamic/readme.md b/code/game/gamemodes/dynamic/readme.md index 5d979b4001637..778e322fa89a9 100644 --- a/code/game/gamemodes/dynamic/readme.md +++ b/code/game/gamemodes/dynamic/readme.md @@ -5,16 +5,47 @@ Dynamic rolls threat based on a special sauce formula: "dynamic_curve_width \* tan((3.1416 \* (rand() - 0.5) \* 57.2957795)) + dynamic_curve_centre" +This threat is split into two separate budgets--`round_start_budget` and `mid_round_budget`. For example, a round with 50 threat might be split into a 30 roundstart budget, and a 20 midround budget. The roundstart budget is used to apply antagonists applied on readied players when the roundstarts (`/datum/dynamic_ruleset/roundstart`). The midround budget is used for two types of rulesets: +- `/datum/dynamic_ruleset/midround` - Rulesets that apply to either existing alive players, or to ghosts. Think Blob or Space Ninja, which poll ghosts asking if they want to play as these roles. +- `/datum/dynamic_ruleset/latejoin` - Rulesets that apply to the next player that joins. Think Syndicate Infiltrator, which converts a player just joining an existing round into traitor. + +This split is done with a similar method, known as the ["lorentz distribution"](https://en.wikipedia.org/wiki/Cauchy_distribution), exists to create a bell curve that ensures that while most rounds will have a threat level around ~50, chaotic and tame rounds still exist for variety. + +The process of creating these numbers occurs in `/datum/game_mode/dynamic/proc/generate_threat` (for creating the threat level) and `/datum/game_mode/dynamic/proc/generate_budgets` (for splitting the threat level into budgets). + +## Deciding roundstart threats +In `/datum/game_mode/dynamic/proc/roundstart()` (called when no admin chooses the rulesets explicitly), Dynamic uses the available roundstart budget to pick threats. This is done through the following system: + +- All roundstart rulesets (remember, `/datum/dynamic_ruleset/roundstart`) are put into an associative list with their weight as the values (`drafted_rules`). +- Until there is either no roundstart budget left, or until there is no ruleset we can choose from with the available threat, a `pickweight` is done based on the drafted_rules. If the same threat is picked twice, it will "scale up". The meaning of this depends on the ruleset itself, using the `scaled_times` variable; traitors for instance will create more the higher they scale. + - If a ruleset is chosen with the `HIGH_IMPACT_RULESET` in its `flags`, then all other `HIGH_IMPACT_RULESET`s will be removed from `drafted_rules`. This is so that only one can ever be chosen. + - If a ruleset has `LONE_RULESET` in its `flags`, then it will be removed from `drafted_rules`. This is to ensure it will only ever be picked once. An example of this in use is Wizard, to avoid creating multiple wizards. +- After all roundstart threats are chosen, `/datum/dynamic_ruleset/proc/picking_roundstart_rule` is called for each, passing in the ruleset and the number of times it is scaled. + - In this stage, `pre_execute` is called, which is the function that will determine what players get what antagonists. If this function returns FALSE for whatever reason (in the case of an error), then its threat is refunded. + +After this process is done, any leftover roundstart threat will be given to the existing midround budget (done in `/datum/game_mode/dynamic/pre_setup()`). + +## Deciding midround threats + Latejoin and midround injection cooldowns are set using exponential distribution between 5 minutes and 25 for latejoin 15 minutes and 35 for midround this value is then added to world.time and assigned to the injection cooldown variables. -rigged_roundstart() is called instead if there are forced rules (an admin set the mode) +- 5 minutes and 25 for latejoin (configurable as latejoin_delay_min and latejoin_delay_max) +- 15 minutes and 35 for midround (configurable as midround_delay_min and midround_delay_max) + +this value is then added to `world.time` and assigned to the injection cooldown variables. -can_start() -> pre_setup() -> roundstart() OR rigged_roundstart() -> picking_roundstart_rule(drafted_rules) -> post_setup() +[rigged_roundstart][/datum/game_mode/dynamic/proc/rigged_roundstart] is called instead if there are forced rules (an admin set the mode) -## PROCESS +1. [setup_parameters][/datum/game_mode/proc/setup_parameters]\() +2. [pre_setup][/datum/game_mode/proc/pre_setup]\() +3. [roundstart][/datum/game_mode/dynamic/proc/roundstart]\() OR [rigged_roundstart][/datum/game_mode/dynamic/proc/rigged_roundstart]\() +4. [picking_roundstart_rule][/datum/game_mode/dynamic/proc/picking_roundstart_rule]\(drafted_rules) +5. [post_setup][/datum/game_mode/proc/post_setup]\() + +## Rule Processing Calls rule_process on every rule which is in the current_rules list. Every sixty seconds, update_playercounts() @@ -65,3 +96,91 @@ Midround: Instead of building a single list candidates, candidates contains four Midround - Rulesets have additional types /from_ghosts: execute() -> send_applications() -> review_applications() -> finish_setup(mob/newcharacter, index) -> setup_role(role) **NOTE: execute() here adds dead players and observers to candidates list + +## Configuration and variables + +### Configuration +Configuration can be done through a `config/dynamic.json` file. One is provided as example in the codebase. This config file, loaded in `/datum/game_mode/dynamic/pre_setup()`, directly overrides the values in the codebase, and so is perfect for making some rulesets harder/easier to get, turning them off completely, changing how much they cost, etc. + +The format of this file is: +```json +{ + "Dynamic": { + /* Configuration in here will directly override `/datum/game_mode/dynamic` itself. */ + /* Keys are variable names, values are their new values. */ + }, + + "Roundstart": { + /* Configuration in here will apply to `/datum/dynamic_ruleset/roundstart` instances. */ + /* Keys are the ruleset names, values are another associative list with keys being variable names and values being new values. */ + "Wizard": { + /* I, a head admin, have died to wizard, and so I made it cost a lot more threat than it does in the codebase. */ + "cost": 80 + } + }, + + "Midround": { + /* Same as "Roundstart", but for `/datum/dynamic_ruleset/midround` instead. */ + }, + + "Latejoin": { + /* Same as "Roundstart", but for `/datum/dynamic_ruleset/latejoin` instead. */ + } +} +``` + +Note: Comments are not possible in this format, and are just in this document for the sake of readability. + +### Rulesets +Rulesets have the following variables notable to developers and those interested in tuning. + +- `required_candidates` - The number of people that *must be willing* (in their preferences) to be an antagonist with this ruleset. If the candidates do not meet this requirement, then the ruleset will not bother to be drafted. +- `antag_cap` - Judges the amount of antagonists to apply, for both solo and teams. Note that some antagonists (such as traitors, lings, heretics, etc) will add more based on how many times they've been scaled. Written as a linear equation--ceil(x/denominator) + offset, or as a fixed constant. If written as a linear equation, will be in the form of `list("denominator" = denominator, "offset" = offset)`. + - Examples include: + - Traitor: `antag_cap = list("denominator" = 24)`. This means that for every 24 players, 1 traitor will be added (assuming no scaling). + - Nuclear Emergency: `antag_cap = list("denominator" = 18, "offset" = 1)`. For every 18 players, 1 nuke op will be added. Starts at 1, meaning at 30 players, 3 nuke ops will be created, rather than 2. + - Revolution: `antag_cap = 3`. There will always be 3 rev-heads, no matter what. +- `minimum_required_age` - The minimum age in order to apply for the ruleset. +- `weight` - How likely this ruleset is to be picked. A higher weight results in a higher chance of drafting. +- `cost` - The initial cost of the ruleset. This cost is taken from either the roundstart or midround budget, depending on the ruleset. +- `scaling_cost` - Cost for every *additional* application of this ruleset. + - Suppose traitors has a `cost` of 8, and a `scaling_cost` of 5. This means that buying 1 application of the traitor ruleset costs 8 threat, but buying two costs 13 (8 + 5). Buying it a third time is 18 (8 + 5 + 5), etc. +- `pop_per_requirement` - The range of population each value in `requirements` represents. By default, this is 6. + - If the value is five the range is 0-4, 5-9, 10-14, 15-19, 20-24, 25-29, 30-34, 35-39, 40-54, 45+. + - If it is six the range is 0-5, 6-11, 12-17, 18-23, 24-29, 30-35, 36-41, 42-47, 48-53, 54+. + - If it is seven the range is 0-6, 7-13, 14-20, 21-27, 28-34, 35-41, 42-48, 49-55, 56-62, 63+. +- `requirements` - A list that represents, per population range (see: `pop_per_requirement`), how much threat is required to *consider* this ruleset. This is independent of how much it'll actually cost. This uses *threat level*, not the budget--meaning if a round has 50 threat level, but only 10 points of round start threat, a ruleset with a requirement of 40 can still be picked if it can be bought. + - Suppose wizard has a `requirements` of `list(90,90,70,40,30,20,10,10,10,10)`. This means that, at 0-5 and 6-11 players, A station must have 90 threat in order for a wizard to be possible. At 12-17, 70 threat is required instead, etc. +- `restricted_roles` - A list of jobs that *can't* be drafted by this ruleset. For example, cyborgs cannot be changelings, and so are in the `restricted_roles`. +- `protected_roles` - Serves the same purpose of `restricted_roles`, except it can be turned off through configuration (`protect_roles_from_antagonist`). For example, security officers *shouldn't* be made traitor, so they are in Traitor's `protected_roles`. + - When considering putting a role in `protected_roles` or `restricted_roles`, the rule of thumb is if it is *technically infeasible* to support that job in that role. There's no *technical* reason a security officer can't be a traitor, and so they are simply in `protected_roles`. There *are* technical reasons a cyborg can't be a changeling, so they are in `restricted_roles` instead. + +### Dynamic + +The "Dynamic" key has the following configurable values: +- `pop_per_requirement` - The default value of `pop_per_requirement` for any ruleset that does not explicitly set it. Defaults to 6. +- `latejoin_delay_min`, `latejoin_delay_max` - The time range, in deciseconds (take your seconds, and multiply by 10), for a latejoin to attempt rolling. Once this timer is finished, a new one will be created within the same range. + - Suppose you have a `latejoin_delay_min` of 600 (60 seconds, 1 minute) and a `latejoin_delay_max` of 1800 (180 seconds, 3 minutes). Once the round starts, a random number in this range will be picked--let's suppose 1.5 minutes. After 1.5 minutes, Dynamic will decide if a latejoin threat should be created (a probability of `/datum/game_mode/dynamic/proc/get_injection_chance()`). Regardless of its decision, a new timer will be started within the range of 1 to 3 minutes, repeatedly. +- `midround_delay_min`, `midround_delay_max` - Same as `latejoin_delay_min` and `latejoin_delay_max`, except for midround threats instead of latejoin ones. +- `higher_injection_chance`, `higher_injection_chance_minimum_threat` - Manipulates the injection chance (`/datum/game_mode/dynamic/proc/get_injection_chance()`). If the *current midround budget* is above `higher_injection_chance_minimum_threat`, then this chance will be increased by `higher_injection_chance`. + - For example: suppose you have a `higher_injection_chance_minimum_threat` of 70, and a `higher_injection_chance` of 15. This means that, if when a midround threat is trying to roll, there is 75 midround budget left, then the injection chance will go up 15%. +- `lower_injection_chance`, `lower_injection_chance_minimum_threat` - The inverse of the `higher_injection_chance` variables. If the *current midround budget* is *below* `lower_injection_chance`, then the chance is lowered by `lower_injection_chance_minimum_threat`. + - For example: suppose you have a `lower_injection_chance_minimum_threat` of 30, and a `lower_injection_chance` of 15. This means if there is 20 midround budget left, then the chance will lower by 15%. +- `threat_curve_centre` - A number between -5 and +5. A negative value will give a more peaceful round and a positive value will give a round with higher threat. +- `threat_curve_width` - A number between 0.5 and 4. Higher value will favour extreme rounds and lower value rounds closer to the average. +- `roundstart_split_curve_centre` - A number between -5 and +5. Equivalent to threat_curve_centre, but for the budget split. A negative value will weigh towards midround rulesets, and a positive value will weight towards roundstart ones. +- `roundstart_split_curve_width` - A number between 0.5 and 4. Equivalent to threat_curve_width, but for the budget split. Higher value will favour more variance in splits and lower value rounds closer to the average. +- `random_event_hijack_minimum` - The minimum amount of time for antag random events to be hijacked. (See [Random Event Hijacking](#random-event-hijacking)) +- `random_event_hijack_maximum` - The maximum amount of time for antag random events to be hijacked. (See [Random Event Hijacking](#random-event-hijacking)) +- `hijacked_random_event_injection_chance` - The amount of injection chance to give to Dynamic when a random event is hijacked. (See [Random Event Hijacking](#random-event-hijacking)) + +## Random Event "Hijacking" +Random events have the potential to be hijacked by Dynamic to keep the pace of midround injections, while also allowing greenshifts to contain some antagonists. + +`/datum/round_event_control/dynamic_should_hijack` is a variable to random events to allow Dynamic to hijack them, and defaults to FALSE. This is set to TRUE for random events that spawn antagonists. + +In `/datum/game_mode/dynamic/on_pre_random_event` (in `dynamic_hijacking.dm`), Dynamic hooks to random events. If the `dynamic_should_hijack` variable is TRUE, the following sequence of events occurs: + +![Flow chart to describe the chain of events for Dynamic 2021 to take](https://user-images.githubusercontent.com/35135081/109071468-9cab7e00-76a8-11eb-8f9f-2b920c602ef4.png) + +`n` is a random value between `random_event_hijack_minimum` and `random_event_hijack_maximum`. Injection chance, should it need to be raised, is increased by `hijacked_random_event_injection_chance`. diff --git a/code/game/gamemodes/dynamic/ruleset_picking.dm b/code/game/gamemodes/dynamic/ruleset_picking.dm new file mode 100644 index 0000000000000..9221e4a3c1527 --- /dev/null +++ b/code/game/gamemodes/dynamic/ruleset_picking.dm @@ -0,0 +1,118 @@ +#define ADMIN_CANCEL_MIDROUND_TIME (10 SECONDS) + +/// From a list of rulesets, returns one based on weight and availability. +/// Mutates the list that is passed into it to remove invalid rules. +/datum/game_mode/dynamic/proc/pick_ruleset(list/drafted_rules) + if (only_ruleset_executed) + return null + + while (TRUE) + var/datum/dynamic_ruleset/rule = pickweight(drafted_rules) + if (!rule) + return null + + if (check_blocking(rule.blocking_rules, executed_rules)) + drafted_rules -= rule + if(drafted_rules.len <= 0) + return null + continue + else if ( + rule.flags & HIGH_IMPACT_RULESET \ + && threat_level < GLOB.dynamic_stacking_limit \ + && GLOB.dynamic_no_stacking \ + && high_impact_ruleset_executed \ + ) + drafted_rules -= rule + if(drafted_rules.len <= 0) + return null + continue + + return rule + +/// Executes a random midround ruleset from the list of drafted rules. +/datum/game_mode/dynamic/proc/pick_midround_rule(list/drafted_rules) + var/datum/dynamic_ruleset/rule = pick_ruleset(drafted_rules) + if (isnull(rule)) + return + current_midround_rulesets = drafted_rules - rule + + midround_injection_timer_id = addtimer( + CALLBACK(src, .proc/execute_midround_rule, rule), \ + ADMIN_CANCEL_MIDROUND_TIME, \ + TIMER_STOPPABLE, \ + ) + + log_game("DYNAMIC: [rule] ruleset executing...") + message_admins("DYNAMIC: Executing midround ruleset [rule] in [DisplayTimeText(ADMIN_CANCEL_MIDROUND_TIME)]. \ + CANCEL | \ + SOMETHING ELSE") + +/// Fired after admins do not cancel a midround injection. +/datum/game_mode/dynamic/proc/execute_midround_rule(datum/dynamic_ruleset/rule) + current_midround_rulesets = null + midround_injection_timer_id = null + if (!rule.repeatable) + midround_rules = remove_from_list(midround_rules, rule.type) + addtimer(CALLBACK(src, .proc/execute_midround_latejoin_rule, rule), rule.delay) + +/// Executes a random latejoin ruleset from the list of drafted rules. +/datum/game_mode/dynamic/proc/pick_latejoin_rule(list/drafted_rules) + var/datum/dynamic_ruleset/rule = pick_ruleset(drafted_rules) + if (isnull(rule)) + return + if (!rule.repeatable) + latejoin_rules = remove_from_list(latejoin_rules, rule.type) + addtimer(CALLBACK(src, .proc/execute_midround_latejoin_rule, rule), rule.delay) + return TRUE + +/// Mainly here to facilitate delayed rulesets. All midround/latejoin rulesets are executed with a timered callback to this proc. +/datum/game_mode/dynamic/proc/execute_midround_latejoin_rule(sent_rule) + var/datum/dynamic_ruleset/rule = sent_rule + spend_midround_budget(rule.cost) + threat_log += "[worldtime2text()]: [rule.ruletype] [rule.name] spent [rule.cost]" + rule.pre_execute(current_players[CURRENT_LIVING_PLAYERS].len) + if (rule.execute()) + log_game("DYNAMIC: Injected a [rule.ruletype == "latejoin" ? "latejoin" : "midround"] ruleset [rule.name].") + if(rule.flags & HIGH_IMPACT_RULESET) + high_impact_ruleset_executed = TRUE + else if(rule.flags & ONLY_RULESET) + only_ruleset_executed = TRUE + if(rule.ruletype == "Latejoin") + var/mob/M = pick(rule.candidates) + dynamic_log("[key_name(M)] joined the station, and was selected by the [rule.name] ruleset.") + executed_rules += rule + rule.candidates.Cut() + if (rule.persistent) + current_rules += rule + new_snapshot(rule) + return TRUE + rule.clean_up() + stack_trace("The [rule.ruletype] rule \"[rule.name]\" failed to execute.") + return FALSE + +/// Fired when an admin cancels the current midround injection. +/datum/game_mode/dynamic/proc/admin_cancel_midround(mob/user, timer_id) + if (midround_injection_timer_id != timer_id || !deltimer(midround_injection_timer_id)) + to_chat(user, "Too late!") + return + + dynamic_log("[key_name(user)] cancelled the next midround injection.") + midround_injection_timer_id = null + current_midround_rulesets = null + +/// Fired when an admin requests a different midround injection. +/datum/game_mode/dynamic/proc/admin_different_midround(mob/user, timer_id) + if (midround_injection_timer_id != timer_id || !deltimer(midround_injection_timer_id)) + to_chat(user, "Too late!") + return + + midround_injection_timer_id = null + + if (isnull(current_midround_rulesets) || current_midround_rulesets.len == 0) + dynamic_log("[key_name(user)] asked for a different midround injection, but there were none left.") + return + + dynamic_log("[key_name(user)] asked for a different midround injection.") + pick_midround_rule(current_midround_rulesets) + +#undef ADMIN_CANCEL_MIDROUND_TIME diff --git a/code/game/gamemodes/eldritch_cult/eldritch_cult.dm b/code/game/gamemodes/eldritch_cult/eldritch_cult.dm index 02a6b1551d335..40a56623f223d 100644 --- a/code/game/gamemodes/eldritch_cult/eldritch_cult.dm +++ b/code/game/gamemodes/eldritch_cult/eldritch_cult.dm @@ -4,7 +4,7 @@ report_type = "heresy" antag_flag = ROLE_HERETIC false_report_weight = 5 - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Brig Physician") + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") restricted_jobs = list("AI", "Cyborg") required_players = 0 required_enemies = 1 @@ -12,6 +12,8 @@ reroll_friendly = 1 enemy_minimum_age = 0 + allowed_special = list(/datum/special_role/traitor/higher_chance) + announce_span = "danger" announce_text = "Heretics have been spotted on the station!\n\ Heretics: Accomplish your objectives.\n\ @@ -65,3 +67,13 @@ /datum/game_mode/heretics/generate_report() return "Cybersun Industries has announced that they have successfully raided a high-security library. The library contained a very dangerous book that was \ shown to posses anomalous properties. We suspect that the book has been copied over, Stay vigilant!" + +/datum/game_mode/heretics/generate_credit_text() + var/list/round_credits = list() + + round_credits += "

The Eldrich Cult:

" + for(var/datum/mind/M in culties) + round_credits += "

[M.name] as a heretic

" + + round_credits += ..() + return round_credits diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 8a7181aaa3ddd..4503462051ecd 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -1,5 +1,5 @@ /proc/power_failure() - priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", 'sound/ai/poweroff.ogg') + priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", ANNOUNCER_POWEROFF) for(var/obj/machinery/power/smes/S in GLOB.machines) if(istype(get_area(S), /area/ai_monitored/turret_protected) || !is_station_level(S.z)) continue @@ -30,7 +30,7 @@ /proc/power_restore() - priority_announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", 'sound/ai/poweron.ogg') + priority_announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", ANNOUNCER_POWERON) for(var/obj/machinery/power/apc/C in GLOB.machines) if(C.cell && is_station_level(C.z)) C.cell.charge = C.cell.maxcharge @@ -54,7 +54,7 @@ /proc/power_restore_quick() - priority_announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", 'sound/ai/poweron.ogg') + priority_announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", ANNOUNCER_POWERON) for(var/obj/machinery/power/smes/S in GLOB.machines) if(!is_station_level(S.z)) continue diff --git a/code/game/gamemodes/events/event.dm b/code/game/gamemodes/events/event.dm index 5928817791806..4883557d8b6b1 100644 --- a/code/game/gamemodes/events/event.dm +++ b/code/game/gamemodes/events/event.dm @@ -20,7 +20,7 @@ /datum/game_mode/event/send_intercept(report = 0) if(intercept_message) - priority_announce(intercept_message, "Security Report", 'sound/ai/commandreport.ogg') + priority_announce(intercept_message, "Security Report", SSstation.announcer.get_rand_report_sound()) /datum/game_mode/event/generate_station_goals() return diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm index 6cebda97575c4..289bb685fa32d 100644 --- a/code/game/gamemodes/extended/extended.dm +++ b/code/game/gamemodes/extended/extended.dm @@ -32,7 +32,10 @@ station_goals += G G.on_report() -/datum/game_mode/extended/send_intercept(report = 0) - if(secret) - return ..() - priority_announce("Thanks to the tireless efforts of our security and intelligence divisions, there are currently no credible threats to [station_name()]. All station construction projects have been authorized. Have a secure shift!", "Security Report", 'sound/ai/commandreport.ogg') +/datum/game_mode/extended/announced/send_intercept() + var/greenshift_message = "Thanks to the tireless efforts of our security and intelligence divisions, there are currently no credible threats to [station_name()]. All station construction projects have been authorized. Have a secure shift!" + . += "Central Command Status Summary
" + . += greenshift_message + + print_command_report(., "Central Command Status Summary", announce = FALSE) + priority_announce(greenshift_message, "Security Report", SSstation.announcer.get_rand_report_sound()) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 7350dbd415390..addfda8d20273 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -23,6 +23,7 @@ var/list/datum/mind/antag_candidates = list() // List of possible starting antags goes here var/list/restricted_jobs = list() // Jobs it doesn't make sense to be. I.E chaplain or AI cultist var/list/protected_jobs = list() // Jobs that can't be traitors because + var/list/required_jobs = list() // alternative required job groups eg list(list(cap=1),list(hos=1,sec=2)) translates to one captain OR one hos and two secmans var/required_players = 0 var/maximum_players = -1 // -1 is no maximum, positive numbers limit the selection of a mode on overstaffed stations var/required_enemies = 0 @@ -53,6 +54,10 @@ var/gamemode_ready = FALSE //Is the gamemode all set up and ready to start checking for ending conditions. var/setup_error //What stopepd setting up the mode. + /// Associative list of current players, in order: living players, living antagonists, dead players and observers. + var/list/list/current_players = list(CURRENT_LIVING_PLAYERS = list(), CURRENT_LIVING_ANTAGS = list(), CURRENT_DEAD_PLAYERS = list(), CURRENT_OBSERVERS = list()) + + /datum/game_mode/proc/announce() //Shows the gamemode's name and a fast description. to_chat(world, "The gamemode is: [name]!") to_chat(world, "[announce_text]") @@ -64,20 +69,22 @@ /datum/game_mode/proc/can_start() var/playerC = 0 for(var/mob/dead/new_player/player in GLOB.player_list) - if((player.client)&&(player.ready == PLAYER_READY_TO_PLAY)) + if(player.client && (player.ready == PLAYER_READY_TO_PLAY) && player.has_valid_preferences(TRUE)) playerC++ if(!GLOB.Debug2) if(playerC < required_players || (maximum_players >= 0 && playerC > maximum_players)) - return 0 + return FALSE antag_candidates = get_players_for_role(antag_flag) if(!GLOB.Debug2) if(antag_candidates.len < required_enemies) - return 0 - return 1 + return FALSE + return TRUE else message_admins("DEBUG: GAME STARTING WITHOUT PLAYER NUMBER CHECKS, THIS WILL PROBABLY BREAK SHIT.") - return 1 + return TRUE +/datum/game_mode/proc/setup_maps() + return 1 ///Attempts to select players for special roles the mode might have. /datum/game_mode/proc/pre_setup() @@ -95,6 +102,7 @@ for(var/role_to_init in allowed_special) var/datum/special_role/new_role = new role_to_init + new_role.setup() if(!prob(new_role.probability)) continue new_role.add_to_pool() @@ -109,7 +117,11 @@ for(var/i in 1 to amount) if(candidates.len == 0) return //No more candidates, end the selection process, and active specials at this time will be handled by latejoins or not included - var/mob/person = pick_n_take(candidates) + var/mob/person + if(special.special_role_flag) + person = antag_pick(candidates, special.special_role_flag) + else + person = pick_n_take(candidates) if(is_banned_from(person.ckey, special.preference_type)) continue if(!person) @@ -117,7 +129,7 @@ var/datum/mind/selected_mind = person.mind if(selected_mind.special_role) continue - if(person.job in special.protected_jobs) + if(person.job in special.restricted_jobs) continue //Would be annoying trying to assasinate someone with special statuses if(selected_mind.isAntagTarget && !special.allowAntagTargets) @@ -156,10 +168,13 @@ ) query_round_game_mode.Execute() qdel(query_round_game_mode) - if(report) - addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h)) create_special_antags() generate_station_goals() + if(report) + addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h)) + else // goals only become purchasable when on_report is called, this also makes a replacement announcement. + for(var/datum/station_goal/G in station_goals) + G.prepare_report() gamemode_ready = TRUE return 1 @@ -251,6 +266,8 @@ replacementmode.restricted_jobs += replacementmode.protected_jobs if(CONFIG_GET(flag/protect_assistant_from_antagonist)) replacementmode.restricted_jobs += "Assistant" + if(CONFIG_GET(flag/protect_heads_from_antagonist)) + replacementmode.restricted_jobs += GLOB.command_positions message_admins("The roundtype will be converted. If you have other plans for the station or feel the station is too messed up to inhabit stop the creation of antags or end the round now.") log_game("Roundtype converted to [replacementmode.name]") @@ -258,14 +275,14 @@ . = 1 sleep(rand(600,1800)) + //somewhere between 1 and 3 minutes from now if(!SSticker.IsRoundInProgress()) message_admins("Roundtype conversion cancelled, the game appears to have finished!") round_converted = 0 return - //somewhere between 1 and 3 minutes from now if(!CONFIG_GET(keyed_list/midround_antag)[SSticker.mode.config_tag]) round_converted = 0 - return 1 + return for(var/mob/living/carbon/human/H in antag_candidates) if(H.client) replacementmode.make_antag_chance(H) @@ -273,10 +290,12 @@ round_converted = 2 message_admins("-- IMPORTANT: The roundtype has been converted to [replacementmode.name], antagonists may have been created! --") - -///Called by the gameSSticker -/datum/game_mode/process() - return 0 +/** + * ATTENTION: + * If you make some special process() for your gamemode, + * it'll be called by the SSticker, which ignores your + * return value. + */ //For things that do not die easily /datum/game_mode/proc/are_special_antags_dead() @@ -368,18 +387,28 @@ intercepttext += "
" intercepttext += report - if(station_goals.len) - intercepttext += "
Special Orders for [station_name()]:" - for(var/datum/station_goal/G in station_goals) - G.on_report() - intercepttext += G.get_report() + intercepttext += generate_station_goal_report() print_command_report(intercepttext, "Central Command Status Summary", announce=FALSE) - priority_announce("A summary has been copied and printed to all communications consoles.", "Enemy communication intercepted. Security level elevated.", 'sound/ai/intercept.ogg') + priority_announce("A summary has been copied and printed to all communications consoles.", "Enemy communication intercepted. Security level elevated.", ANNOUNCER_INTERCEPT) if(GLOB.security_level < SEC_LEVEL_BLUE) set_security_level(SEC_LEVEL_BLUE) +/* + * Generate a list of station goals available to purchase to report to the crew. + * + * Returns a formatted string all station goals that are available to the station. + */ +/datum/game_mode/proc/generate_station_goal_report() + if(!station_goals.len) + return + . = "
Special Orders for [station_name()]:
" + for(var/datum/station_goal/station_goal in station_goals) + station_goal.on_report() + . += station_goal.get_report() + return + // This is a frequency selection system. You may imagine it like a raffle where each player can have some number of tickets. The more tickets you have the more likely you are to // "win". The default is 100 tickets. If no players use any extra tickets (earned with the antagonist rep system) calling this function should be equivalent to calling the normal // pick() function. By default you may use up to 100 extra tickets per roll, meaning at maximum a player may double their chances compared to a player who has no extra tickets. @@ -576,6 +605,7 @@ valid_positions += GLOB.science_positions valid_positions += GLOB.supply_positions valid_positions += GLOB.civilian_positions + valid_positions += GLOB.gimmick_positions valid_positions += GLOB.security_positions if(CONFIG_GET(flag/reopen_roundstart_suicide_roles_command_positions)) valid_positions += GLOB.command_positions //add any remaining command positions @@ -813,7 +843,7 @@ var/list/human_garbage = list() round_credits += "

The Hardy Civilians:

" len_before_addition = round_credits.len - for(var/datum/mind/current in SSticker.mode.get_all_by_department(GLOB.civilian_positions)) + for(var/datum/mind/current in SSticker.mode.get_all_by_department(GLOB.civilian_positions | GLOB.gimmick_positions)) if(current.assigned_role == "Assistant") human_garbage += current else diff --git a/code/game/gamemodes/gangs/dominator.dm b/code/game/gamemodes/gangs/dominator.dm index 12bc687fffda6..8061f1260d3ac 100644 --- a/code/game/gamemodes/gangs/dominator.dm +++ b/code/game/gamemodes/gangs/dominator.dm @@ -13,7 +13,7 @@ max_integrity = 300 integrity_failure = 100 move_resist = INFINITY - armor = list("melee" = 20, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 10, "acid" = 70) + armor = list("melee" = 20, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 10, "acid" = 70, "stamina" = 0) var/datum/team/gang/gang var/operating = FALSE //false=standby or broken, true=takeover var/warned = FALSE //if this device has set off the warning at <3 minutes yet @@ -37,7 +37,6 @@ gang = null QDEL_NULL(spark_system) QDEL_NULL(countdown) - STOP_PROCESSING(SSmachines, src) return ..() /obj/machinery/dominator/emp_act(severity) @@ -81,7 +80,6 @@ to_chat(user, "System Integrity: [round((obj_integrity/max_integrity)*100,1)]%") /obj/machinery/dominator/process() - ..() if(gang && gang.domination_time != NOT_DOMINATING) var/time_remaining = gang.domination_time_remaining() if(time_remaining > 0) @@ -111,7 +109,7 @@ SSticker.force_ending = TRUE if(!.) - STOP_PROCESSING(SSmachines, src) + return PROCESS_KILL /obj/machinery/dominator/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) @@ -181,7 +179,7 @@ gang = tempgang gang.dom_attempts -- - priority_announce("Network breach detected in [locname]. The [gang.name] Gang is attempting to seize control of the station!","Network Alert") + priority_announce("Network breach detected in [locname]. The [gang.name] Gang is attempting to seize control of the station!", "Network Alert", SSstation.announcer.get_rand_alert_sound()) gang.domination() SSshuttle.registerHostileEnvironment(src) name = "[gang.name] Gang [name]" @@ -204,9 +202,8 @@ var/open = FALSE if(isclosedturf(loc)) return TRUE - for(var/turf/T in view(3, src)) - if(!isclosedturf(T)) - open++ + for(var/turf/open/T in view(3, src)) + open++ if(open < DOM_REQUIRED_TURFS) return TRUE else @@ -225,7 +222,7 @@ if(!takeover_in_progress) var/was_stranded = SSshuttle.emergency.mode == SHUTTLE_STRANDED if(!was_stranded) - priority_announce("All hostile activity within station systems has ceased.","Network Alert") + priority_announce("All hostile activity within station systems has ceased.","Network Alert", SSstation.announcer.get_rand_alert_sound()) if(get_security_level() == "delta") set_security_level("red") diff --git a/code/game/gamemodes/gangs/gang_items.dm b/code/game/gamemodes/gangs/gang_items.dm index f74d943cc3d04..184834a7621c5 100644 --- a/code/game/gamemodes/gangs/gang_items.dm +++ b/code/game/gamemodes/gangs/gang_items.dm @@ -44,8 +44,6 @@ /datum/gang_item/proc/get_extra_info(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) return - - /////////////////// //Essential Gang Tools /////////////////// @@ -53,11 +51,26 @@ /datum/gang_item/essentials category = "Purchase Essential Items:" +/datum/gang_item/essentials/spraycan + name = "Territory Spraycan" + id = "spraycan" + cost = 10 + item_path = /obj/item/toy/crayon/spraycan/gang +/datum/gang_item/essentials/implant_breaker + name = "Reprogramming Implant" + id = "implant_breaker" + cost = 25 + item_path = /obj/item/implanter/gang + spawn_msg = "The reprogramming implant is a single use implant that will reprogram its target to be part of your gang. Not strong enough to break the latest NT mindshield implants, or reprogram Lieutenants." + +/datum/gang_item/essentials/implant_breaker/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) + var/obj/item/O = new item_path(get_turf(user), gang) + user.put_in_hands(O) /datum/gang_item/essentials/gangtool id = "gangtool" - cost = 10 + cost = 50 /datum/gang_item/essentials/gangtool/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) var/item_type @@ -75,21 +88,14 @@ return "Promote a Gangster" return "Spare Gangtool" -/datum/gang_item/essentials/spraycan - name = "Territory Spraycan" - id = "spraycan" - cost = 5 - item_path = /obj/item/toy/crayon/spraycan/gang - /datum/gang_item/essentials/spraycan/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) var/obj/item/O = new item_path(user.loc, gang) user.put_in_hands(O) - /datum/gang_item/essentials/pen name = "Recruitment Pen" id = "pen" - cost = 10 + cost = 50 item_path = /obj/item/pen/gang spawn_msg = "More recruitment pens will allow you to recruit gangsters faster. Only gang leaders can recruit with pens." @@ -108,109 +114,88 @@ if(gangtool?.free_pen) return "(GET ONE FREE)" return ..() - - - -/datum/gang_item/essentials/dominator - name = "Station Dominator" - id = "dominator" - cost = 30 - item_path = /obj/machinery/dominator - spawn_msg = "The dominator will secure your gang's dominance over the station. Turn it on when you are ready to defend it." - -/datum/gang_item/essentials/dominator/can_buy(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) - if(!gang || !gang.dom_attempts) - return FALSE - return ..() - -/datum/gang_item/essentials/dominator/get_name_display(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) - if(!gang || !gang.dom_attempts) - return ..() - return "[..()]" - -/datum/gang_item/essentials/dominator/get_cost_display(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) - if(!gang || !gang.dom_attempts) - return "(Out of stock)" - return ..() - -/datum/gang_item/essentials/dominator/get_extra_info(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) - if(gang) - return "This device requires a 5x5 area clear of walls to work. (Estimated Takeover Time: [round(gang.determine_domination_time()/60,0.1)] minutes)" - -/datum/gang_item/essentials/dominator/purchase(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) - var/area/userarea = get_area(user) - if(!(userarea.type in gang.territories|gang.new_territories)) - to_chat(user,"The dominator can be spawned only on territory controlled by your gang!") - return FALSE - for(var/obj/obj in get_turf(user)) - if(obj.density) - to_chat(user, "There's not enough room here!") - return FALSE - - return ..() - -/datum/gang_item/essentials/dominator/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) - new item_path(user.loc) - to_chat(user, spawn_msg) - - - + +/datum/gang_item/essentials/reinforce + name = "Call Reinforcments" + id = "reinforce" + cost = 250 + item_path = /obj/item/antag_spawner/gangster /////////////////// //CLOTHING /////////////////// /datum/gang_item/clothing - category = "Purchase Gang Clothes (Only the jumpsuit and suit give you added influence):" + category = "Purchase Gang Clothes (Only the jumpsuit, hat and suit give you added influence):" -/datum/gang_item/clothing/under +/datum/gang_item/clothing/basic name = "Gang Uniform" id = "under" - cost = 1 - -/datum/gang_item/clothing/under/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) - if(gang.inner_outfits.len) - var/outfit = pick(gang.inner_outfits) - if(outfit) - var/obj/item/O = new outfit(user.loc) - user.put_in_hands(O) - to_chat(user, " This is your gang's official uniform, wearing it will increase your influence") - return + cost = 5 + +/datum/gang_item/clothing/basic/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) + var/obj/item/storage/box/uniform_box = new (get_turf(user)) + + new gang.outfit(uniform_box) + new gang.suit(uniform_box) + new gang.hat(uniform_box) + + user.put_in_hands(uniform_box) + to_chat(user, " This is your gang's official uniform, wearing it will increase your influence") return TRUE -/datum/gang_item/clothing/suit +/datum/gang_item/clothing/armor name = "Gang Armored Outerwear" - id = "suit" - cost = 1 - -/datum/gang_item/clothing/suit/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) - if(gang.outer_outfits.len) - var/outfit = pick(gang.outer_outfits) - if(outfit) - var/obj/item/O = new outfit(user.loc) - O.armor = O.armor.setRating(melee = 20, bullet = 35, laser = 10, energy = 10, bomb = 30, bio = 0, rad = 0, fire = 30, acid = 30) - O.desc += " Tailored for the [gang.name] Gang to offer the wearer moderate protection against ballistics and physical trauma." - user.put_in_hands(O) - to_chat(user, " This is your gang's official outerwear, wearing it will increase your influence") - return - return TRUE + id = "armor" + cost = 200 + +/datum/gang_item/clothing/armor/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) + var/obj/item/storage/box/armor_box = new (get_turf(user)) + var/obj/item/clothing/suit/suit = new gang.suit(armor_box) + suit.armor = suit.armor.setRating(melee = 20, bullet = 35, laser = 10, energy = 10, bomb = 30, bio = 0, rad = 0, fire = 30, acid = 30) + suit.desc += " Tailored for the [gang.name] Gang to offer the wearer moderate protection against ballistics and physical trauma." -/datum/gang_item/clothing/hat - name = "Pimp Hat" - id = "hat" - cost = 16 - item_path = /obj/item/clothing/head/collectable/petehat/gang + var/obj/item/clothing/head/hat = new gang.hat(armor_box) + hat.armor = hat.armor.setRating(melee = 20, bullet = 35, laser = 10, energy = 10, bomb = 30, bio = 0, rad = 0, fire = 30, acid = 30) + hat.desc += " Tailored for the [gang.name] Gang to offer the wearer moderate protection against ballistics and physical trauma." + user.put_in_hands(armor_box) + to_chat(user, " This is your gang's official uniform, wearing it will increase your influence") + return TRUE -/obj/item/clothing/head/collectable/petehat/gang - name = "pimpin' hat" - desc = "The undisputed king of style." +/datum/gang_item/clothing/ssuit + name = "Gang Spaceproof Outerwear" + id = "ssuit" + cost = 200 + +/datum/gang_item/clothing/ssuit/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) + var/obj/item/storage/box/armor_box = new (get_turf(user)) + + var/obj/item/clothing/suit/suit = new gang.suit(armor_box) + suit.clothing_flags |= STOPSPRESSUREDAMAGE | THICKMATERIAL + suit.cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + suit.heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + suit.min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT + suit.max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT + suit.desc += " Tailored for the [gang.name] Gang to offer the wearer moderate protection against ballistics and physical trauma." + + var/obj/item/clothing/head/hat = new gang.hat(armor_box) + hat.clothing_flags |= STOPSPRESSUREDAMAGE | THICKMATERIAL + hat.cold_protection = HEAD + hat.heat_protection = HEAD + hat.min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT + hat.max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT + hat.desc += " Tailored for the [gang.name] Gang to offer the wearer moderate protection against ballistics and physical trauma." + + user.put_in_hands(armor_box) + to_chat(user, " This is your gang's official uniform, wearing it will increase your influence") + return TRUE /datum/gang_item/clothing/mask name = "Golden Death Mask" id = "mask" - cost = 18 + cost = 50 item_path = /obj/item/clothing/mask/gskull /obj/item/clothing/mask/gskull @@ -221,7 +206,7 @@ /datum/gang_item/clothing/shoes name = "Bling Boots" id = "boots" - cost = 22 + cost = 50 item_path = /obj/item/clothing/shoes/gang /obj/item/clothing/shoes/gang @@ -232,13 +217,13 @@ /datum/gang_item/clothing/neck name = "Gold Necklace" id = "necklace" - cost = 9 + cost = 25 item_path = /obj/item/clothing/neck/necklace/dope /datum/gang_item/clothing/hands name = "Decorative Brass Knuckles" id = "hand" - cost = 11 + cost = 50 item_path = /obj/item/clothing/gloves/gang /obj/item/clothing/gloves/gang @@ -250,7 +235,7 @@ /datum/gang_item/clothing/belt name = "Badass Belt" id = "belt" - cost = 13 + cost = 25 item_path = /obj/item/storage/belt/military/gang /obj/item/storage/belt/military/gang @@ -266,115 +251,150 @@ /datum/gang_item/weapon category = "Purchase Weapons:" -/datum/gang_item/weapon/ammo - -/datum/gang_item/weapon/shuriken - name = "Shuriken" - id = "shuriken" - cost = 3 - item_path = /obj/item/throwing_star - -/datum/gang_item/weapon/frag - name = "Fragmentation Grenade" - id = "frag nade" - cost = 18 - item_path = /obj/item/grenade/syndieminibomb/concussion/frag +/datum/gang_item/weapon/emp + name = "EMP Grenade" + id = "EMP" + cost = 50 + item_path = /obj/item/grenade/empgrenade +/datum/gang_item/weapon/c4 + name = "C4 Explosive" + id = "c4" + cost = 100 + item_path = /obj/item/grenade/plastic/c4 /datum/gang_item/weapon/switchblade name = "Switchblade" id = "switchblade" - cost = 5 + cost = 100 item_path = /obj/item/switchblade -/datum/gang_item/weapon/surplus - name = "Surplus Rifle" - id = "surplus" - cost = 8 - item_path = /obj/item/gun/ballistic/automatic/surplus +/datum/gang_item/weapon/shuriken + name = "Shuriken box" + id = "shuriken" + cost = 150 + item_path = /obj/item/storage/box/shuriken_box -/datum/gang_item/weapon/ammo/surplus_ammo - name = "Surplus Rifle Ammo" - id = "surplus_ammo" - cost = 5 - item_path = /obj/item/ammo_box/magazine/m10mm/rifle +/obj/item/storage/box/shuriken_box + name = "shuriken Box" -/datum/gang_item/weapon/ammo/improvised_ammo - name = "Box of Buckshot" - id = "buckshot" - cost = 5 - item_path = /obj/item/storage/box/lethalshot +/obj/item/storage/box/shuriken_box/PopulateContents() + for (var/i in 1 to 4) + new /obj/item/throwing_star(src) /datum/gang_item/weapon/pistol name = "10mm Pistol" id = "pistol" - cost = 30 + cost = 500 item_path = /obj/item/gun/ballistic/automatic/pistol -/datum/gang_item/weapon/ammo/pistol_ammo +/datum/gang_item/weapon/pistol_ammo name = "10mm Ammo" id = "pistol_ammo" - cost = 10 + cost = 50 item_path = /obj/item/ammo_box/magazine/m10mm /datum/gang_item/weapon/uzi name = "Uzi SMG" id = "uzi" - cost = 60 + cost = 500 item_path = /obj/item/gun/ballistic/automatic/mini_uzi -/datum/gang_item/weapon/ammo/uzi_ammo +/datum/gang_item/weapon/uzi_ammo name = "Uzi Ammo" id = "uzi_ammo" - cost = 40 + cost = 50 item_path = /obj/item/ammo_box/magazine/uzim9mm +/datum/gang_item/weapon/laser + name = "Laser Gun" + id = "laser" + cost = 500 + item_path = /obj/item/gun/energy/laser/retro + /////////////////// //EQUIPMENT /////////////////// /datum/gang_item/equipment - category = "Purchase Equipment:" - - -/datum/gang_item/equipment/sharpener - name = "Sharpener" - id = "whetstone" - cost = 3 - item_path = /obj/item/sharpener + category = "Purchase Support Equipment:" - -/datum/gang_item/equipment/emp - name = "EMP Grenade" - id = "EMP" - cost = 5 - item_path = /obj/item/grenade/empgrenade - -/datum/gang_item/equipment/c4 - name = "C4 Explosive" - id = "c4" - cost = 7 - item_path = /obj/item/grenade/plastic/c4 - -/datum/gang_item/equipment/implant_breaker - name = "Implant Breaker" - id = "implant_breaker" - cost = 10 - item_path = /obj/item/implanter/gang - spawn_msg = "The implant breaker is a single-use device that destroys all implants within the target before trying to recruit them to your gang. Also works on enemy gangsters." - -/datum/gang_item/equipment/implant_breaker/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) - var/obj/item/O = new item_path(user.loc, gang) - user.put_in_hands(O) - -/datum/gang_item/equipment/wetwork_boots - name = "Wetwork boots" - id = "wetwork" +/datum/gang_item/equipment/healcigs + name = "Healing Cigs" + id = "healcigs" cost = 20 - item_path = /obj/item/clothing/shoes/combat/gang + item_path = /obj/item/storage/fancy/cigarettes/cigpack_syndicate + +/datum/gang_item/equipment/mulah + name = "Space Cash (1000cr)" + id = "mulah" + cost = 25 + item_path = /obj/item/stack/spacecash/c1000 + +/datum/gang_item/equipment/drugs + name = "Drug Supply" + id = "drugs" + cost = 50 + item_path = /obj/item/storage/box + +/datum/gang_item/equipment/drugs/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/device/gangtool/gangtool) + var/obj/item/O + var/turf/T = get_turf(user) + switch (rand(1,10)) + if (1) + O = new /obj/item/storage/pill_bottle/lsd(T) + if (2) + O = new /obj/item/storage/pill_bottle/happy(T) + if (3) + O = new /obj/item/storage/pill_bottle/zoom(T) + if (4) + O = new /obj/item/storage/pill_bottle/aranesp(T) + if (5) + O = new /obj/item/storage/pill_bottle/happiness(T) + if (6) + O = new /obj/item/storage/pill_bottle/psicodine(T) + if (7) + O = new /obj/item/storage/pill_bottle/psicodine(T) + if (8) + O = new /obj/item/reagent_containers/food/snacks/grown/cannabis(T) + if (9) + O = new /obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow(T) + if (10) + O = new /obj/item/reagent_containers/food/snacks/grown/cannabis/white(T) + if (O) + user.put_in_hands(O) -/obj/item/clothing/shoes/combat/gang - name = "Wetwork boots" - desc = "A gang's best hitmen are prepared for anything." - permeability_coefficient = 0.01 - clothing_flags = NOSLIP \ No newline at end of file +/datum/gang_item/equipment/aids + name = "Battlefield Aid Kit" + id = "aids" + cost = 75 + item_path = /obj/item/storage/firstaid/shifty/battle + +/datum/gang_item/equipment/hangover + name = "Bad Trip Kit" + id = "hangover" + cost = 75 + item_path = /obj/item/storage/firstaid/shifty/hangover + +/obj/item/storage/firstaid/shifty + name = "shifty medkit" + desc = "A shady medkit, assembled out of scraps and leftovers." + icon_state = "bezerk" + +/obj/item/storage/firstaid/shifty/battle/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/pill/patch/silver_sulf = 2, + /obj/item/reagent_containers/pill/patch/styptic = 2, + /obj/item/reagent_containers/medspray/synthflesh = 1, + /obj/item/reagent_containers/hypospray/medipen = 1, + /obj/item/healthanalyzer = 1) + generate_items_inside(items_inside,src) + +/obj/item/storage/firstaid/shifty/hangover/PopulateContents() + var/static/items_inside = list( + /obj/item/storage/pill_bottle/charcoal = 1, + /obj/item/reagent_containers/syringe/antitoxin = 1, + /obj/item/reagent_containers/hypospray/medipen = 2, + /obj/item/reagent_containers/hypospray/medipen/dexalin = 2, + /obj/item/healthanalyzer = 1) + generate_items_inside(items_inside,src) diff --git a/code/game/gamemodes/gangs/gang_pen.dm b/code/game/gamemodes/gangs/gang_pen.dm index a307110ea8425..17dcc98a14d58 100644 --- a/code/game/gamemodes/gangs/gang_pen.dm +++ b/code/game/gamemodes/gangs/gang_pen.dm @@ -52,7 +52,7 @@ to_chat(user, "This mind is too strong to control!") return var/mob/living/carbon/human/H = gangster_mind.current // we are sure the dude's human cause it's checked in attack() - if(istype(H.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(istype(H.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) to_chat(user, "This mind appears to be too delusional to register the mind-control waves!") return H.silent = max(H.silent, 5) diff --git a/code/game/gamemodes/gangs/gang_tags.dm b/code/game/gamemodes/gangs/gang_tags.dm new file mode 100644 index 0000000000000..f0e2f7932cf19 --- /dev/null +++ b/code/game/gamemodes/gangs/gang_tags.dm @@ -0,0 +1,30 @@ + +/obj/effect/decal/gang + icon = 'icons/effects/crayondecal.dmi' + icon_state = "rune1" + layer = ABOVE_NORMAL_TURF_LAYER //Harder to hide + plane = GAME_PLANE + gender = NEUTER + var/datum/team/gang/gang + +/obj/effect/decal/gang/Initialize(mapload, datum/team/gang/G, e_name = "gang tag", rotation = 0, mob/user) + if(!G) + qdel(src) + return + gang = G + var/area/territory = get_area(src) + G.new_territories |= list(territory.type = territory.name) + + name = e_name + desc = "A [name] vandalizing the station." + icon_state = G.name + add_atom_colour(G.color, FIXED_COLOUR_PRIORITY) + + +/obj/effect/decal/gang/Destroy() + if(gang) + var/area/territory = get_area(src) + gang.territories -= territory.type + gang.new_territories -= territory.type + gang.lost_territories |= list(territory.type = territory.name) + return ..() diff --git a/code/game/gamemodes/gangs/gangs.dm b/code/game/gamemodes/gangs/gangs.dm index d555aad6bef0e..b10af973eed58 100644 --- a/code/game/gamemodes/gangs/gangs.dm +++ b/code/game/gamemodes/gangs/gangs.dm @@ -6,16 +6,16 @@ GLOBAL_LIST_EMPTY(gangs) name = "gang war" config_tag = "gang" antag_flag = ROLE_GANG - restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Brig Physician") - required_players = 15 - required_enemies = 1 - recommended_enemies = 2 + restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security") + required_players = 30 + required_enemies = 2 + recommended_enemies = 3 enemy_minimum_age = 14 announce_span = "danger" announce_text = "A violent turf war has erupted on the station!\n\ - Gangsters: Take over the station with a dominator.\n\ - Crew: Prevent the gangs from expanding and initiating takeover." + Gangsters: Spread influence and expand the territory of your gang.\n\ + Crew: Spread awareness and prevent your coworkers from killing eachother in turf wars." title_icon = "gang" @@ -30,10 +30,10 @@ GLOBAL_LIST_EMPTY(gangs) //Spawn more bosses depending on server population var/gangs_to_create = 2 - if(prob(num_players()) && num_players() > 1.5*required_players) - gangs_to_create++ if(prob(num_players()) && num_players() > 2*required_players) gangs_to_create++ + if(prob(num_players()) && num_players() > 3*required_players) + gangs_to_create++ gangs_to_create = min(gangs_to_create, GLOB.possible_gangs.len) for(var/i in 1 to gangs_to_create) @@ -69,6 +69,19 @@ GLOBAL_LIST_EMPTY(gangs) /proc/is_gang_boss(mob/M) return M?.mind?.has_antag_datum(/datum/antagonist/gang/boss) +/datum/game_mode/gang/set_round_result() + ..() + var/datum/team/gang/winner + var/winner_territories = 0 + for(var/datum/team/gang/G in GLOB.gangs) + var/compare_territories = LAZYLEN(G.territories) + if (!winner || compare_territories > winner_territories || (compare_territories == winner_territories && G.victory_points > winner.victory_points)) + winner = G + winner_territories = LAZYLEN(winner.territories) + + if (winner) + winner.winner = TRUE //chicken dinner + /datum/game_mode/gang/generate_credit_text() var/list/round_credits = list() var/len_before_addition diff --git a/code/game/gamemodes/gangs/gangtool.dm b/code/game/gamemodes/gangs/gangtool.dm index 6bf3de09691b1..78b74c4381656 100644 --- a/code/game/gamemodes/gangs/gangtool.dm +++ b/code/game/gamemodes/gangs/gangtool.dm @@ -60,9 +60,6 @@ else dat += "This device is not authorized to promote.
" else - if(gang.domination_time != NOT_DOMINATING) - dat += "
Takeover In Progress:
[DisplayTimeText(gang.domination_time_remaining() * 10)] remain
" - dat += "Registration: [gang.name] Gang Boss
" dat += "Organization Size: [gang.members.len] | Station Control: [gang.territories.len] territories under control. | Influence: [gang.influence]
" dat += "Time until Influence grows: [time2text(gang.next_point_time - world.time, "mm:ss")]
" @@ -207,7 +204,7 @@ gang.recalls-- return TRUE - to_chat(user, "[icon2html(src, loc)]No response recieved. Emergency shuttle cannot be recalled at this time.") + to_chat(user, "[icon2html(src, loc)]No response received. Emergency shuttle cannot be recalled at this time.") return /obj/item/device/gangtool/proc/recallchecks(mob/user) @@ -222,10 +219,6 @@ to_chat(user, "[icon2html(src, user)]Emergency shuttle cannot be recalled at this time.") recalling = FALSE return - if(!gang.dom_attempts) - to_chat(user, "[icon2html(src, user)]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.") - recalling = FALSE - return if(!is_station_level(user.z)) //Shuttle can only be recalled while on station to_chat(user, "[icon2html(src, user)]Error: Device out of range of station communication arrays.") recalling = FALSE @@ -248,6 +241,9 @@ if(!isnull(gang) && G.gang != gang) to_chat(user, "You cannot use gang tools owned by enemy gangs!") return + else if(!G.gang.check_gangster_swag(user)>1) + to_chat(user, "You cannot use gang tools while undercover!") + return return TRUE diff --git a/code/game/gamemodes/gangs/implant_gang.dm b/code/game/gamemodes/gangs/implant_gang.dm new file mode 100644 index 0000000000000..7f0b190381a65 --- /dev/null +++ b/code/game/gamemodes/gangs/implant_gang.dm @@ -0,0 +1,63 @@ +/obj/item/implant/gang + name = "gang implant" + desc = "Makes you a gangster or such." + activated = 0 + var/datum/team/gang/gang + +/obj/item/implant/gang/Initialize(loc, setgang) + ..() + gang = setgang + +/obj/item/implant/gang/get_data() + var/dat = {"Implant Specifications:
+ Name: Criminal brainwash implant
+ Life: A few seconds after injection.
+ Important Notes: Illegal
+
+ Implant Details:
+ Function: Contains a small pod of nanobots that change the host's brain to be loyal to a certain organization.
+ Notice: Latest NT Mindshield implants counteract the effect of this implant.
+ Integrity: Latest NT Mindshield will neutralize this implant."} + return dat + +/obj/item/implant/gang/implant(mob/living/target, mob/user, silent = 0) + if(!target || !target.mind || target.stat == DEAD || !ishuman(target) || !..()) + return FALSE + if (HAS_TRAIT(target, TRAIT_MINDSHIELD)) + target.visible_message("[target] seems to resist the implant!", "You resist the gang implant. You are reminded of the anti-gang PSA instead.") + return FALSE + + var/datum/antagonist/gang/G = target.mind.has_antag_datum(/datum/antagonist/gang) + if(G) + if(G.gang == G || istype(G, /datum/antagonist/gang/boss)) + return FALSE + target.mind.remove_antag_datum(/datum/antagonist/gang) + target.mind.add_antag_datum(/datum/antagonist/gang, gang) + qdel(src) + return TRUE + +/obj/item/implanter/gang + name = "implanter (gang)" + +/obj/item/implanter/gang/Initialize(loc, gang) + if(!gang) + qdel(src) + return + imp = new /obj/item/implant/gang(src,gang) + ..() + + + +/obj/item/implant/mindshield/implant(mob/living/target, mob/user, silent = FALSE) //putting this here, pls no bulli. - qwerty + if(..()) + if(!target.mind) + return TRUE + if(target.mind.has_antag_datum(/datum/antagonist/gang/boss)) + if(!silent) + target.visible_message("[target] seems to resist the implant!", "You feel something interfering with your mental conditioning, but you resist it!") + removed(target, 1) + qdel(src) + return FALSE + target.mind.remove_antag_datum(/datum/antagonist/gang) + return TRUE + return FALSE diff --git a/code/game/gamemodes/gangs/outfits.dm b/code/game/gamemodes/gangs/outfits.dm new file mode 100644 index 0000000000000..e62299deec6be --- /dev/null +++ b/code/game/gamemodes/gangs/outfits.dm @@ -0,0 +1,32 @@ +/datum/outfit/crook + name = "Level 1 - Crook" + uniform = /obj/item/clothing/under/color/grey + id = /obj/item/card/id + ears = /obj/item/radio/headset + back = /obj/item/storage/backpack + shoes = /obj/item/clothing/shoes/sneakers/black + + l_pocket = /obj/item/switchblade + r_pocket = /obj/item/crowbar/red + + backpack_contents = list( /obj/item/storage/box/survival=1,\ + /obj/item/toy/crayon/spraycan/gang = 1) + +/datum/outfit/boss + name = "Level 50 - Boss" + uniform = /obj/item/clothing/under/color/grey + id = /obj/item/card/id + belt = /obj/item/storage/belt/military/gang + gloves = /obj/item/clothing/gloves/gang + neck = /obj/item/clothing/neck/necklace/dope + shoes = /obj/item/clothing/shoes/gang + ears = /obj/item/radio/headset + back = /obj/item/storage/backpack + mask = /obj/item/clothing/mask/gskull + + l_pocket = /obj/item/pen/gang + r_pocket = /obj/item/switchblade + + backpack_contents = list( /obj/item/storage/box/survival=1,\ + /obj/item/device/gangtool/spare=1,\ + /obj/item/restraints/legcuffs/bola/energy = 1) \ No newline at end of file diff --git a/code/game/gamemodes/hivemind/radar.dm b/code/game/gamemodes/hivemind/radar.dm index 8df195705785f..8baaa69774d95 100644 --- a/code/game/gamemodes/hivemind/radar.dm +++ b/code/game/gamemodes/hivemind/radar.dm @@ -5,7 +5,7 @@ //Modified IA/changeling pinpointer, points to the nearest person who is afflicted with the hive tracker status effect /datum/status_effect/agent_pinpointer/hivemind id = "hive_pinpointer" - alert_type = /obj/screen/alert/status_effect/agent_pinpointer/hivemind + alert_type = /atom/movable/screen/alert/status_effect/agent_pinpointer/hivemind minimum_range = HIVEMIND_RADAR_MIN_DISTANCE tick_interval = HIVEMIND_RADAR_PING_TIME range_fuzz_factor = 0 @@ -69,6 +69,6 @@ duration = world.time + set_duration //Screen alert -/obj/screen/alert/status_effect/agent_pinpointer/hivemind +/atom/movable/screen/alert/status_effect/agent_pinpointer/hivemind name = "Psychic link" desc = "Somebody is there, and they're definitely not friendly." diff --git a/code/game/gamemodes/incursion/incursion.dm b/code/game/gamemodes/incursion/incursion.dm index 142d15c571e78..f85063b23cd49 100644 --- a/code/game/gamemodes/incursion/incursion.dm +++ b/code/game/gamemodes/incursion/incursion.dm @@ -6,7 +6,7 @@ name = "incursion" config_tag = "incursion" restricted_jobs = list("AI", "Cyborg") - protected_jobs = list("Security Officer", "Warden", "Detective","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", "Brig Physician") + protected_jobs = list("Security Officer", "Warden", "Detective","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") antag_flag = ROLE_INCURSION false_report_weight = 10 enemy_minimum_age = 0 diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 81ca9a5c394c5..9ed3060b7165f 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -18,7 +18,7 @@ return var/list/wavetype = GLOB.meteors_normal - var/meteorminutes = (world.time - SSticker.round_start_time - meteordelay) / 10 / 60 + var/meteorminutes = (world.time - SSticker.round_start_time - meteordelay) / 600 if (prob(meteorminutes)) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 81175233ec210..c1fc5bb691f6f 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -21,17 +21,17 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event //Meteor spawning global procs /////////////////////////////// -/proc/spawn_meteors(number = 10, list/meteortypes) +/proc/spawn_meteors(number = 10, list/meteortypes, z = 0) for(var/i = 0; i < number; i++) - spawn_meteor(meteortypes) + spawn_meteor(meteortypes, z) -/proc/spawn_meteor(list/meteortypes) +/proc/spawn_meteor(list/meteortypes, z = 0) var/turf/pickedstart var/turf/pickedgoal var/max_i = 10//number of tries to spawn meteor. while(!isspaceturf(pickedstart)) var/startSide = pick(GLOB.cardinals) - var/startZ = pick(SSmapping.levels_by_trait(ZTRAIT_STATION)) + var/startZ = (z || pick(SSmapping.levels_by_trait(ZTRAIT_STATION))) pickedstart = spaceDebrisStartLoc(startSide, startZ) pickedgoal = spaceDebrisFinishLoc(startSide, startZ) max_i-- @@ -121,6 +121,10 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event GLOB.meteor_list -= src SSaugury.unregister_doom(src) walk(src,0) //this cancels the walk_towards() proc + if(istype(loc, /obj/effect/falling_meteor)) + var/obj/effect/falling_meteor/holder = loc + holder.contained_meteor = null + qdel(holder) . = ..() /obj/effect/meteor/Initialize(mapload, target) @@ -140,11 +144,19 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event /obj/effect/meteor/proc/ram_turf(turf/T) //first bust whatever is in the turf - for(var/atom/A in T) - if(A != src) - if(isliving(A)) - A.visible_message("[src] slams into [A].", "[src] slams into you!.") - A.ex_act(hitpwr) + for(var/thing in T) + if(thing == src) + continue + if(isliving(thing)) + var/mob/living/living_thing = thing + living_thing.visible_message("[src] slams into [living_thing].", "[src] slams into you!.") + switch(hitpwr) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += thing + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += thing + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += thing //then, ram the turf if it still exists if(T) @@ -195,7 +207,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event if((M.orbiting) && (SSaugury.watchers[M])) continue var/turf/T = get_turf(M) - if(!T || T.z != src.z) + if(!T || T.get_virtual_z_level() != src.get_virtual_z_level()) continue var/dist = get_dist(M.loc, src.loc) shake_camera(M, dist > 20 ? 2 : 4, dist > 20 ? 1 : 3) @@ -367,3 +379,68 @@ GLOBAL_LIST_INIT(meteorsSPOOKY, list(/obj/effect/meteor/pumpkin)) meteorsound = pick('sound/hallucinations/im_here1.ogg','sound/hallucinations/im_here2.ogg') ////////////////////////// #undef DEFAULT_METEOR_LIFETIME + +////////////////////////// +// Falling meteors +///////////////////////// + +/obj/effect/falling_meteor + name = "falling meteor" + desc = "..." + alpha = 0 + var/obj/effect/meteor/contained_meteor + var/obj/effect/meteor_shadow/shadow + var/falltime = 2 SECONDS + var/prefalltime = 8 SECONDS + layer = METEOR_LAYER + +/obj/effect/falling_meteor/Initialize(loc, meteor_type) + . = ..() + if(!meteor_type) + meteor_type = /obj/effect/meteor/big + contained_meteor = new meteor_type(src) + name = contained_meteor.name + desc = contained_meteor.desc + icon = contained_meteor.icon + icon_state = contained_meteor.icon_state + var/matrix/M = new() + M.Scale(3, 3) + M.Translate(-1.5 * world.icon_size, -1.5 * world.icon_size) + M.Translate(0, world.icon_size * 7) + transform = M + INVOKE_ASYNC(src, .proc/fall_animation) + +/obj/effect/falling_meteor/Destroy(force) + if(contained_meteor) + QDEL_NULL(contained_meteor) + QDEL_NULL(shadow) + . = ..() + +/obj/effect/falling_meteor/proc/fall_animation() + //Create a dummy effect + shadow = new(get_turf(src)) + shadow.icon = icon + shadow.icon_state = icon_state + animate(shadow, time = (prefalltime + falltime), transform = matrix(), alpha = 255) + sleep(prefalltime) + animate(src, 5, alpha = 255) + animate(src, falltime, transform = matrix(), flags = ANIMATION_PARALLEL) + sleep(falltime) + contained_meteor.forceMove(loc) + contained_meteor.make_debris() + contained_meteor.meteor_effect() + qdel(src) + +/obj/effect/meteor_shadow + name = "shadow" + desc = "What the hell? Is something falling out the sky???" + alpha = 0 + layer = METEOR_SHADOW_LAYER + +/obj/effect/meteor_shadow/Initialize() + . = ..() + color = list(0, 0, 0, 0, 0, 0, 0, 0, 0) + var/matrix/M = matrix() + M.Scale(3, 3) + M.Translate(-1.5 * world.icon_size, -1.5 * world.icon_size) + transform = M diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index ae38d58baa10e..0e0e35d975432 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -122,7 +122,7 @@ gloves = /obj/item/clothing/gloves/combat back = /obj/item/storage/backpack/fireproof ears = /obj/item/radio/headset/syndicate/alt - l_pocket = /obj/item/pinpointer/nuke/syndicate + l_pocket = /obj/item/modular_computer/tablet/nukeops id = /obj/item/card/id/syndicate belt = /obj/item/gun/ballistic/automatic/pistol backpack_contents = list(/obj/item/storage/box/syndie=1,\ @@ -153,7 +153,7 @@ if(ispath(uplink_type, /obj/item/uplink/nuclear) || tc) // /obj/item/uplink/nuclear understands 0 tc var/obj/item/U = new uplink_type(H, H.key, tc) - H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(U, ITEM_SLOT_BACKPACK) var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H) E.implant(H) @@ -169,7 +169,7 @@ mask = /obj/item/clothing/mask/gas/syndicate suit = /obj/item/clothing/suit/space/hardsuit/syndi r_pocket = /obj/item/tank/internals/emergency_oxygen/engi - internals_slot = SLOT_R_STORE + internals_slot = ITEM_SLOT_RPOCKET belt = /obj/item/storage/belt/military r_hand = /obj/item/gun/ballistic/shotgun/bulldog backpack_contents = list(/obj/item/storage/box/syndie=1,\ diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 5bcd23eecf0a2..886a83d8b6523 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -17,6 +17,11 @@ GLOBAL_LIST_EMPTY(objectives) if(text) explanation_text = text +//Apparently objectives can be qdel'd. Learn a new thing every day +/datum/objective/Destroy() + GLOB.objectives -= src + return ..() + /datum/objective/proc/get_owners() // Combine owner and team into a single list. . = (team && team.members) ? team.members.Copy() : list() if(owner) @@ -27,7 +32,7 @@ GLOBAL_LIST_EMPTY(objectives) //Shared by few objective types /datum/objective/proc/admin_simple_target_pick(mob/admin) - var/list/possible_targets = list("Free objective","Random") + var/list/possible_targets = list() var/def_value for(var/datum/mind/possible_target in SSticker.minds) if ((possible_target != src) && ishuman(possible_target.current)) @@ -37,7 +42,7 @@ GLOBAL_LIST_EMPTY(objectives) if(target?.current) def_value = target.current - var/mob/new_target = input(admin,"Select target:", "Objective target", def_value) as null|anything in sortNames(possible_targets) + var/mob/new_target = input(admin,"Select target:", "Objective target", def_value) as null|anything in (sortNames(possible_targets) | list("Free objective","Random")) if (!new_target) return @@ -104,16 +109,50 @@ GLOBAL_LIST_EMPTY(objectives) var/list/datum/mind/owners = get_owners() if(!dupe_search_range) dupe_search_range = get_owners() + var/list/prefered_targets = list() var/list/possible_targets = list() var/try_target_late_joiners = FALSE + var/owner_is_exploration_crew = FALSE + var/owner_is_shaft_miner = FALSE for(var/I in owners) var/datum/mind/O = I if(O.late_joiner) try_target_late_joiners = TRUE + if(O.assigned_role == "Exploration Crew") + owner_is_exploration_crew = TRUE + if(O.assigned_role == "Shaft Miner") + owner_is_shaft_miner = TRUE for(var/datum/mind/possible_target in get_crewmember_minds()) - if(!(possible_target in owners) && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && is_unique_objective(possible_target,dupe_search_range)) - if (!(possible_target in blacklist)) - possible_targets += possible_target + if(possible_target in owners) + continue + if(!ishuman(possible_target.current)) + continue + if(possible_target.current.stat == DEAD) + continue + if(!is_unique_objective(possible_target,dupe_search_range)) + continue + var/target_area = get_area(possible_target.current) + if(!HAS_TRAIT(SSstation, STATION_TRAIT_LATE_ARRIVALS) && istype(target_area, /area/shuttle/arrival)) + continue + if(possible_target in blacklist) + continue + + if(possible_target.assigned_role == "Exploration Crew") + if(owner_is_exploration_crew) + prefered_targets += possible_target + else + //Reduced chance to get people off station + if(prob(70) && !owner_is_shaft_miner) + continue + else if(possible_target.assigned_role == "Shaft Miner") + if(owner_is_shaft_miner) + prefered_targets += possible_target + else + //Reduced chance to get people off station + if(prob(70) && !owner_is_exploration_crew) + continue + + possible_targets += possible_target if(try_target_late_joiners) var/list/all_possible_targets = possible_targets.Copy() for(var/I in all_possible_targets) @@ -122,7 +161,11 @@ GLOBAL_LIST_EMPTY(objectives) possible_targets -= PT if(!possible_targets.len) possible_targets = all_possible_targets - if(possible_targets.len > 0) + //30% chance to go for a prefered target + if(prefered_targets.len > 0 && prob(30)) + target = pick(prefered_targets) + target.isAntagTarget = TRUE + else if(possible_targets.len > 0) target = pick(possible_targets) target.isAntagTarget = TRUE update_explanation_text() @@ -160,9 +203,13 @@ GLOBAL_LIST_EMPTY(objectives) if(receiver && receiver.current) if(ishuman(receiver.current)) var/mob/living/carbon/human/H = receiver.current - var/list/slots = list("backpack" = SLOT_IN_BACKPACK) + var/static/list/slots = list( + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET, + "hands" = ITEM_SLOT_HANDS) for(var/eq_path in special_equipment) - var/obj/O = new eq_path + var/obj/O = new eq_path(get_turf(receiver.current)) H.equip_in_one_of_slots(O, slots) /datum/objective/assassinate @@ -320,9 +367,11 @@ GLOBAL_LIST_EMPTY(objectives) /datum/objective/hijack name = "hijack" - explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody." - team_explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody. Leave no team member behind." - martyr_compatible = 0 //Technically you won't get both anyway. + explanation_text = "Hijack the emergency shuttle by overriding the navigation protocols using the shuttle computer." + team_explanation_text = "Hijack the emergency shuttle by overriding the navigation protocols, using the shuttle computer. Leave no team member behind." + martyr_compatible = FALSE //Technically you won't get both anyway. + /// Overrides the hijack speed of any antagonist datum it is on ONLY, no other datums are impacted. + var/hijack_speed_override = 1 /datum/objective/hijack/check_completion() // Requires all owners to escape. if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) @@ -333,24 +382,33 @@ GLOBAL_LIST_EMPTY(objectives) return FALSE return SSshuttle.emergency.is_hijacked() -/datum/objective/hijack/single - name = "hijack" - explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody." - team_explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody. Team members lost is not a concern for this operation." - martyr_compatible = 0 //Technically you won't get both anyway. +/datum/objective/elimination + name = "elimination" + explanation_text = "Slaughter all loyalist crew aboard the shuttle. You, and any likeminded individuals, must be the only remaining people on the shuttle." + team_explanation_text = "Slaughter all loyalist crew aboard the shuttle. You, and any likeminded individuals, must be the only remaining people on the shuttle. Leave no team member behind." + martyr_compatible = FALSE -/datum/objective/hijack/single/check_completion() // Requires all owners to escape. +/datum/objective/elimination/check_completion() if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) return FALSE var/list/datum/mind/owners = get_owners() - var/single_escape = FALSE for(var/datum/mind/M in owners) - if(considered_alive(M) && SSshuttle.emergency.shuttle_areas[get_area(M.current)]) - single_escape = TRUE - break - if(!single_escape) + if(!considered_alive(M, enforce_human = FALSE) || !SSshuttle.emergency.shuttle_areas[get_area(M.current)]) + return FALSE + return SSshuttle.emergency.elimination_hijack() + +/datum/objective/elimination/highlander + name="highlander elimination" + explanation_text = "Escape on the shuttle alone. Ensure that nobody else makes it out." + +/datum/objective/elimination/highlander/check_completion() + if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) return FALSE - return SSshuttle.emergency.is_hijacked() + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + if(!considered_alive(M, enforce_human = FALSE) || !SSshuttle.emergency.shuttle_areas[get_area(M.current)]) + return FALSE + return SSshuttle.emergency.elimination_hijack(filter_by_human = FALSE, solo_hijack = TRUE) /datum/objective/block name = "no organics on shuttle" @@ -818,7 +876,14 @@ GLOBAL_LIST_EMPTY(possible_items_special) return FALSE return TRUE +//Teratoma objective + +/datum/objective/chaos + name = "spread chaos" + explanation_text = "Spread misery and chaos upon the station." +/datum/objective/chaos/check_completion() + return TRUE //End Changeling Objectives /datum/objective/destroy diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 2bd194af3e37f..73f380cdfb0db 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -84,7 +84,7 @@ /datum/objective_item/steal/reactive name = "the reactive teleport armor." - targetitem = /obj/item/clothing/suit/armor/reactive + targetitem = /obj/item/clothing/suit/armor/reactive/teleport difficulty = 5 excludefromjob = list("Research Director") @@ -116,7 +116,7 @@ //Items with special checks! /datum/objective_item/steal/plasma - name = "28 moles of plasma (full tank)." + name = "28 moles of plasma (full tank). Be sure to fill up the tank with additional plasma since it doesn't start full!" targetitem = /obj/item/tank difficulty = 3 excludefromjob = list("Chief Engineer","Research Director","Station Engineer","Scientist","Atmospheric Technician") @@ -124,7 +124,7 @@ /datum/objective_item/steal/plasma/check_special_completion(obj/item/tank/T) var/target_amount = text2num(name) var/found_amount = 0 - found_amount += T.air_contents.get_moles(/datum/gas/plasma) + found_amount += T.air_contents.get_moles(GAS_PLASMA) return found_amount>=target_amount @@ -166,6 +166,12 @@ return 1 return 0 +/datum/objective_item/steal/blackbox + name = "the blackbox." + targetitem = /obj/item/blackbox + difficulty = 10 + excludefromjob = list("Chief Engineer","Station Engineer","Atmospheric Technician") + //Unique Objectives /datum/objective_item/unique/docs_red name = "the \"Red\" secret documents." diff --git a/code/game/gamemodes/overthrow/overthrow.dm b/code/game/gamemodes/overthrow/overthrow.dm index 4ab67be0925dc..042bdb4f55634 100644 --- a/code/game/gamemodes/overthrow/overthrow.dm +++ b/code/game/gamemodes/overthrow/overthrow.dm @@ -4,7 +4,7 @@ config_tag = "overthrow" report_type = "overthrow" antag_flag = ROLE_OVERTHROW - restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", "Brig Physician") + restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") required_players = 20 // the core idea is of a swift, bloodless coup, so it shouldn't be as chaotic as revs. required_enemies = 2 // minimum two teams, otherwise it's just nerfed revs. recommended_enemies = 4 diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 7961eb835e776..e5cf04998785c 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -13,7 +13,8 @@ report_type = "revolution" antag_flag = ROLE_REV false_report_weight = 10 - restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", "Brig Physician") + restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") + required_jobs = list(list("Captain"=1),list("Head of Personnel"=1),list("Head of Security"=1),list("Chief Engineer"=1),list("Research Director"=1),list("Chief Medical Officer"=1)) //Any head present required_players = 30 required_enemies = 2 recommended_enemies = 3 @@ -118,7 +119,6 @@ if(!finished) SSticker.mode.check_win() check_counter = 0 - return FALSE ////////////////////////////////////// //Checks if the revs have won or not// @@ -128,7 +128,6 @@ finished = 1 else if(check_heads_victory()) finished = 2 - return /////////////////////////////// //Checks if the round is over// @@ -138,7 +137,7 @@ if(finished) SSshuttle.clearHostileEnvironment(src) return ..() - if(finished != 0 && end_when_heads_dead) + if(finished && end_when_heads_dead) return TRUE else return ..() @@ -211,7 +210,7 @@ return ..() /datum/game_mode/revolution/speedy/process() - . = ..() + ..() if(check_counter == 0) if (world.time > endtime && !fuckingdone) fuckingdone = TRUE diff --git a/code/game/gamemodes/sandbox/airlock_maker.dm b/code/game/gamemodes/sandbox/airlock_maker.dm deleted file mode 100644 index ddb622ab08c54..0000000000000 --- a/code/game/gamemodes/sandbox/airlock_maker.dm +++ /dev/null @@ -1,141 +0,0 @@ -/* - This is for the sandbox for now, - maybe useful later for an actual thing? - -Sayu -*/ - -/obj/structure/door_assembly - var/datum/airlock_maker/maker = null - -/obj/structure/door_assembly/attack_hand() - . = ..() - if(.) - return - if(maker) - maker.interact() - -/datum/airlock_maker - var/obj/structure/door_assembly/linked = null - - var/list/access_used = null - var/require_all = 1 - - var/paintjob = "none" - var/glassdoor = 0 - - var/doorname = "airlock" - -/datum/airlock_maker/New(var/atom/target_loc) - linked = new(target_loc) - linked.maker = src - linked.anchored = FALSE - access_used = list() - - interact() - -/datum/airlock_maker/proc/linkpretty(href,desc,active) - if(!desc) - var/static/list/defaults = list("No","Yes") - desc = defaults[active+1] - if(active) - return "[desc]" - return "[desc]" - -/datum/airlock_maker/proc/interact() - var/list/leftcolumn = list() - var/list/rightcolumn = list() - leftcolumn += "Required Access" - for(var/access in get_all_accesses()) - leftcolumn += linkpretty("access=[access]",get_access_desc(access),access in access_used) - leftcolumn += "Require all listed accesses: [linkpretty("reqall",null,require_all)]" - - rightcolumn += "Paintjob" - for(var/option in list("none","engineering","atmos","security","command","medical","research","mining","maintenance","external","highsecurity")) - rightcolumn += linkpretty("paint=[option]",option,option == paintjob) - rightcolumn += "Glass door: " + linkpretty("glass",null,glassdoor) + "

" - var/length = max(leftcolumn.len,rightcolumn.len) - - var/dat = "You may move the model airlock around. A new airlock will be built in its space when you click done, below.

" - dat += "Door name: \"[doorname]\"" - dat += "" - for(var/i=1; i<=length; i++) - dat += "" - - dat += "
" - if(i<=leftcolumn.len) - dat += leftcolumn[i] - dat += "" - if(i<=rightcolumn.len) - dat += rightcolumn[i] - dat += "

Finalize Airlock Construction | Cancel and Destroy Airlock" - usr << browse(dat,"window=airlockmaker") - -/datum/airlock_maker/Topic(var/href,var/list/href_list) - if(!usr) - return - if(!src || !linked || !linked.loc) - usr << browse(null,"window=airlockmaker") - return - - if("rename" in href_list) - var/newname = stripped_input(usr,"New airlock name:","Name the airlock",doorname) - if(newname) - doorname = newname - if("access" in href_list) - var/value = text2num(href_list["access"]) - access_used ^= value - if("reqall" in href_list) - require_all = !require_all - if("paint" in href_list) - paintjob = href_list["paint"] - if("glass" in href_list) - glassdoor = !glassdoor - - if("cancel" in href_list) - usr << browse(null,"window=airlockmaker") - qdel(linked) - qdel(src) - return - - if("done" in href_list) - usr << browse(null,"window=airlockmaker") - var/turf/t_loc = linked.loc - qdel(linked) - if(!istype(t_loc)) - return - - var/target_type = "/obj/machinery/door/airlock" - if(glassdoor) - if(paintjob != "none") - if(paintjob in list("external","highsecurity","maintenance")) // no glass version - target_type += "/[paintjob]" - else - target_type += "/glass_[paintjob]" - else - target_type += "/glass" - else if(paintjob != "none") - target_type += "/[paintjob]" - var/final = target_type - target_type = text2path(final) - if(!target_type) - to_chat(usr, "Didn't work, contact Sayu with this: [final]") - usr << browse(null,"window=airlockmaker") - return - - var/obj/machinery/door/D = new target_type(t_loc) - - D.name = doorname - - if(access_used.len == 0) - D.req_access = null - D.req_one_access = null - else if(require_all) - D.req_access = access_used.Copy() - D.req_one_access = null - else - D.req_access = null - D.req_one_access = access_used.Copy() - - return - - interact() diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 609373b597e8a..c00b862abf12b 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -9,9 +9,11 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE) sandbox.owner = src.ckey if(src.client.holder) sandbox.admin = 1 - verbs += new/mob/proc/sandbox_panel + + add_verb(/mob/proc/sandbox_panel) /mob/proc/sandbox_panel() set name = "Sandbox Panel" + set category = "Sandbox" if(sandbox) sandbox.update() @@ -41,6 +43,8 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE) "Standard Tools", "Spawn Flashlight" = "hsbspawn&path=[/obj/item/flashlight]", "Spawn Toolbox" = "hsbspawn&path=[/obj/item/storage/toolbox/mechanical]", + "Spawn Tier 4 BSRPED" = "hsbspawn&path=[/obj/item/storage/part_replacer/bluespace/tier4]", + "Spawn Toolbelt" = "hsbspawn&path=[/obj/item/storage/belt/utility/chief/full]", "Spawn Light Replacer" = "hsbspawn&path=[/obj/item/lightreplacer]", "Spawn Medical Kit" = "hsbspawn&path=[/obj/item/storage/firstaid/regular]", "Spawn All-Access ID" = "hsbaaid", @@ -56,11 +60,11 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE) "Spawn Inf. Capacity Power Cell" = "hsbspawn&path=[/obj/item/stock_parts/cell/infinite]", "Spawn Rapid Construction Device" = "hsbrcd", "Spawn RCD Ammo" = "hsb_safespawn&path=[/obj/item/rcd_ammo]", - "Spawn Airlock" = "hsbairlock", "Miscellaneous", "Spawn Air Scrubber" = "hsbscrubber", - "Spawn Welding Fuel Tank" = "hsbspawn&path=[/obj/structure/reagent_dispensers/fueltank]", + "Spawn Debug Tech Disk" = "hsbspawn&path=[/obj/item/disk/tech_disk/debug]", + "Spawn All Materials" = "hsbspawn&path=[/obj/structure/closet/syndicate/resources/everything]", "Spawn Water Tank" = "hsbspawn&path=[/obj/structure/reagent_dispensers/watertank]", "Bots", @@ -220,12 +224,6 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE) new/obj/item/construction/rcd/combat(usr.loc) - // - // New sandbox airlock maker - // - if("hsbairlock") - new /datum/airlock_maker(usr.loc) - // // Object spawn window // diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm index 8d4846d579e38..afc5e2b1f344d 100644 --- a/code/game/gamemodes/sandbox/sandbox.dm +++ b/code/game/gamemodes/sandbox/sandbox.dm @@ -6,10 +6,13 @@ announce_span = "info" announce_text = "Build your own station... or just shoot each other!" - + allow_persistence_save = FALSE /datum/game_mode/sandbox/pre_setup() + + CONFIG_SET(flag/allow_random_events, FALSE) //stops harmful events + for(var/mob/M in GLOB.player_list) M.CanBuild() return 1 diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 69dd3f033dab3..96a677682309b 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -12,7 +12,7 @@ antag_flag = ROLE_TRAITOR false_report_weight = 20 //Reports of traitors are pretty common. restricted_jobs = list("Cyborg")//They are part of the AI if he is traitor so are they, they use to get double chances - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Brig Physician") + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") required_players = 0 required_enemies = 1 recommended_enemies = 4 diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index 8d849c8c145e5..05b6e0d7baa86 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -29,20 +29,15 @@ // update the icon_state /obj/machinery/bluespace_beacon/proc/updateicon() - var/state="floor_beacon" - if(invisibility) - icon_state = "[state]f" - + icon_state = "floor_beaconf" else - icon_state = "[state]" + icon_state = "floor_beacon" /obj/machinery/bluespace_beacon/process() - if(!Beacon) + if(QDELETED(Beacon)) //Don't move it out of nullspace BACK INTO THE GAME for the love of god var/turf/T = loc Beacon = new(T) Beacon.invisibility = INVISIBILITY_MAXIMUM else if (Beacon.loc != loc) Beacon.forceMove(loc) - - updateicon() diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index a11cccb4aeda4..1a5138c5f6797 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -48,6 +48,7 @@ for(var/i in 1 to I) available_chems |= possible_chems[i] reset_chem_buttons() + ui_update() /obj/machinery/sleeper/update_icon() if(state_open) @@ -61,6 +62,7 @@ open_machine() /obj/machinery/sleeper/Exited(atom/movable/user) + . = ..() if (!state_open && user == occupant) container_resist(user) @@ -68,6 +70,7 @@ if (!state_open) container_resist(user) +//Note: open_machine and close_machine already ui_update() /obj/machinery/sleeper/open_machine() if(!state_open && !panel_open) flick("[initial(icon_state)]-anim", src) @@ -129,6 +132,12 @@ open_machine() +/obj/machinery/sleeper/ui_requires_update(mob/user, datum/tgui/ui) + . = ..() + + if(occupant) + . = TRUE // Only autoupdate when occupied + /obj/machinery/sleeper/ui_state(mob/user) if(controls_inside) return GLOB.default_state @@ -233,6 +242,7 @@ occupant.reagents.add_reagent(chem_buttons[chem], 10) //emag effect kicks in here so that the "intended" chem is used for all checks, for extra FUUU if(user) log_combat(user, occupant, "injected [chem] into", addition = "via [src]") + use_power(100) return TRUE /obj/machinery/sleeper/proc/chem_allowed(chem) @@ -260,16 +270,8 @@ icon_state = "sleeper_s" controls_inside = TRUE -/obj/machinery/sleeper/syndie/fullupgrade/Initialize() - . = ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/machine/sleeper(null) - component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) - component_parts += new /obj/item/stock_parts/manipulator/femto(null) - component_parts += new /obj/item/stack/sheet/glass(null) - component_parts += new /obj/item/stack/sheet/glass(null) - component_parts += new /obj/item/stack/cable_coil(null) - RefreshParts() +/obj/machinery/sleeper/syndie/fullupgrade + circuit = /obj/item/circuitboard/machine/sleeper/fullupgrade /obj/machinery/sleeper/clockwork name = "soothing sleeper" diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 0f46d648920bb..17ac11c6acaaa 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 @@ -113,7 +115,10 @@ Class Procs: 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/speed_process = FALSE // Process as fast as possible? + /// Viable flags to go here are START_PROCESSING_ON_INIT, or START_PROCESSING_MANUALLY. See code\__DEFINES\machines.dm for more information on these flags. + var/processing_flags = START_PROCESSING_ON_INIT + /// What subsystem this machine will use, which is generally SSmachines or SSfastprocess. By default all machinery use SSmachines. This fires a machine's process() roughly every 2 seconds. + var/subsystem_type = /datum/controller/subsystem/machines var/obj/item/circuitboard/circuit // Circuit to be created and inserted when the machinery is created var/damage_deflection = 0 @@ -128,7 +133,7 @@ Class Procs: /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) + armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70, "stamina" = 0) . = ..() GLOB.machines += src @@ -136,22 +141,29 @@ Class Procs: circuit = new circuit circuit.apply_default_parts(src) - if(!speed_process) - START_PROCESSING(SSmachines, src) - else - START_PROCESSING(SSfastprocess, src) + if(processing_flags & START_PROCESSING_ON_INIT) + begin_processing() + power_change() RegisterSignal(src, COMSIG_ENTER_AREA, .proc/power_change) - if (occupant_typecache) + if(occupant_typecache) occupant_typecache = typecacheof(occupant_typecache) +/// Helper proc for telling a machine to start processing with the subsystem type that is located in its `subsystem_type` var. +/obj/machinery/proc/begin_processing() + var/datum/controller/subsystem/processing/subsystem = locate(subsystem_type) in Master.subsystems + START_PROCESSING(subsystem, src) + +/// Helper proc for telling a machine to stop processing with the subsystem type that is located in its `subsystem_type` var. +/obj/machinery/proc/end_processing() + var/datum/controller/subsystem/processing/subsystem = locate(subsystem_type) in Master.subsystems + STOP_PROCESSING(subsystem, src) + /obj/machinery/Destroy() GLOB.machines.Remove(src) - if(!speed_process) - STOP_PROCESSING(SSmachines, src) - else - STOP_PROCESSING(SSfastprocess, src) + if(datum_flags & DF_ISPROCESSING) // A sizeable portion of machines stops processing before qdel + end_processing() dropContents() if(length(component_parts)) for(var/atom/A in component_parts) @@ -162,9 +174,6 @@ Class Procs: /obj/machinery/proc/locate_machinery() return -/obj/machinery/process()//If you dont use process or power why are you here - return PROCESS_KILL - /obj/machinery/proc/process_atmos()//If you dont use process why are you here return PROCESS_KILL @@ -175,12 +184,14 @@ Class Procs: new /obj/effect/temp_visual/emp(loc) /obj/machinery/proc/open_machine(drop = TRUE) + SEND_SIGNAL(src, COMSIG_MACHINE_OPEN, drop) state_open = TRUE density = FALSE if(drop) dropContents() update_icon() updateUsrDialog() + ui_update() /obj/machinery/proc/dropContents(list/subset = null) var/turf/T = get_turf(src) @@ -197,6 +208,7 @@ Class Procs: return occupant_typecache ? is_type_in_typecache(am, occupant_typecache) : isliving(am) /obj/machinery/proc/close_machine(atom/movable/target = null) + SEND_SIGNAL(src, COMSIG_MACHINE_CLOSE, target) state_open = FALSE density = TRUE if(!target) @@ -218,6 +230,7 @@ Class Procs: target.forceMove(src) updateUsrDialog() update_icon() + ui_update() /obj/machinery/proc/auto_use_power() if(!powered(power_channel)) @@ -311,11 +324,11 @@ Class Procs: /obj/machinery/Topic(href, href_list) ..() if(!can_interact(usr)) - return 1 + return TRUE if(!usr.canUseTopic(src)) - return 1 + return TRUE add_fingerprint(usr) - return 0 + return FALSE //////////////////////////////////////////////////////////////////////////////////////////// diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 4935c9d4d308f..0bb005c791ba4 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -6,7 +6,7 @@ layer = PROJECTILE_HIT_THRESHHOLD_LAYER plane = FLOOR_PLANE max_integrity = 200 - armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) + armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30, "stamina" = 0) var/uses = 20 var/cooldown = 0 diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index 6c957acd4e70e..357edff1f6de7 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -98,7 +98,7 @@ var/datum/radio_frequency/radio_connection - var/on = TRUE + var/on = TRUE // Reviewer: I can't find any way to turn this thing off but it stays var/alert = FALSE /obj/machinery/airlock_sensor/incinerator_toxmix @@ -138,7 +138,9 @@ if(on) var/datum/gas_mixture/air_sample = return_air() var/pressure = round(air_sample.return_pressure(),0.1) - alert = (pressure < ONE_ATMOSPHERE*0.8) + if((pressure < ONE_ATMOSPHERE*0.8) != alert) + alert = !alert + update_icon() var/datum/signal/signal = new(list( "tag" = id_tag, @@ -148,8 +150,6 @@ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK) - update_icon() - /obj/machinery/airlock_sensor/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) frequency = new_frequency diff --git a/code/game/machinery/airlock_cycle_control.dm b/code/game/machinery/airlock_cycle_control.dm index eed15b65e25e1..d4e8e014e2c25 100644 --- a/code/game/machinery/airlock_cycle_control.dm +++ b/code/game/machinery/airlock_cycle_control.dm @@ -53,8 +53,9 @@ req_access = list(ACCESS_ATMOSPHERICS) max_integrity = 250 integrity_failure = 80 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30, "stamina" = 0) resistance_flags = FIRE_PROOF + layer = ABOVE_WINDOW_LAYER var/cyclestate = AIRLOCK_CYCLESTATE_INOPEN var/interior_pressure = ONE_ATMOSPHERE @@ -291,7 +292,6 @@ door.unbolt() /obj/machinery/advanced_airlock_controller/process() - . = ..() process_atmos() /obj/machinery/advanced_airlock_controller/process_atmos() @@ -601,6 +601,7 @@ ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "AdvancedAirlockController") + ui.set_autoupdate(TRUE) // Pressure display, mode changes as part of the cycle process ui.open() /obj/machinery/advanced_airlock_controller/ui_data(mob/user) @@ -687,10 +688,12 @@ A.do_animate("deny") if(is_allowed) cycle_to(text2num(params["exterior"])) + . = TRUE if("skip") if((world.time - skip_timer) >= skip_delay && (cyclestate == AIRLOCK_CYCLESTATE_OUTCLOSING || cyclestate == AIRLOCK_CYCLESTATE_OUTOPENING || cyclestate == AIRLOCK_CYCLESTATE_INOPENING || cyclestate == AIRLOCK_CYCLESTATE_INCLOSING)) is_skipping = TRUE - if((locked && !usr.has_unlimited_silicon_privilege) || (usr.has_unlimited_silicon_privilege && aidisabled)) + . = TRUE + if(!. && ((locked && !usr.has_unlimited_silicon_privilege) || (usr.has_unlimited_silicon_privilege && aidisabled))) return switch(action) if("lock") @@ -708,34 +711,46 @@ vents[vent] = curr_role & ~(role_to_toggle) else vents[vent] = curr_role | role_to_toggle + . = TRUE if("set_airlock_role") var/airlock = locate(params["airlock_id"]) if(airlock == null || airlocks[airlock] == null) return airlocks[airlock] = !!text2num(params["val"]) + . = TRUE if("clear_vis") vis_target = null + . = TRUE if("set_vis_vent") var/vent = locate(params["vent_id"]) if(vent == null || vents[vent] == null) return vis_target = vent + . = TRUE if("set_vis_airlock") var/airlock = locate(params["airlock_id"]) if(airlock == null || airlocks[airlock] == null) return vis_target = airlock + . = TRUE if("scan") scan() + . = TRUE if("interior_pressure") interior_pressure = CLAMP(text2num(params["pressure"]), 0, ONE_ATMOSPHERE) + . = TRUE if("exterior_pressure") exterior_pressure = CLAMP(text2num(params["pressure"]), 0, ONE_ATMOSPHERE) + . = TRUE if("depressurization_margin") depressurization_margin = CLAMP(text2num(params["pressure"]), 0.15, 40) + . = TRUE if("skip_delay") skip_delay = CLAMP(text2num(params["skip_delay"]), 0, 1200) - update_icon(TRUE) + . = TRUE + + if(.) + update_icon(TRUE) /obj/machinery/advanced_airlock_controller/proc/request_from_door(airlock) var/role = airlocks[airlock] @@ -766,7 +781,6 @@ skip_timer = world.time /obj/machinery/advanced_airlock_controller/AltClick(mob/user) - ..() if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc)) return else @@ -780,7 +794,6 @@ locked = !locked update_icon() to_chat(user, "You [ locked ? "lock" : "unlock"] the airlock controller interface.") - updateUsrDialog() else to_chat(user, "Access denied.") return diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index a39056c895fe0..a3e37cd1e9e09 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -17,7 +17,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) circuit = /obj/item/circuitboard/machine/announcement_system var/obj/item/radio/headset/radio - var/arrival = "%PERSON has signed up as %RANK" + var/arrival = "%PERSON has signed up as %RANK." var/arrivalToggle = 1 var/newhead = "%PERSON, %RANK, is the department head." var/newheadToggle = 1 @@ -93,7 +93,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) else if(message_type == "CRYOSTORAGE") message = CompileText("%PERSON, %RANK has been moved to cryo storage.", user, rank) else if(message_type == "ARRIVALS_BROKEN") - message = "The arrivals shuttle has been damaged. Docking for repairs..." + message = "The arrivals shuttle has been damaged. Docking for repairs." if(channels.len == 0) radio.talk_into(src, message, null) @@ -140,6 +140,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) if(NewMessage) arrival = NewMessage log_game("The arrivals announcement was updated: [NewMessage] by:[key_name(usr)]") + . = TRUE if("NewheadText") var/NewMessage = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN) if(!usr.canUseTopic(src, !issilicon(usr))) @@ -147,13 +148,15 @@ GLOBAL_LIST_EMPTY(announcement_systems) if(NewMessage) newhead = NewMessage log_game("The head announcement was updated: [NewMessage] by:[key_name(usr)]") + . = TRUE if("NewheadToggle") newheadToggle = !newheadToggle update_icon() + . = TRUE if("ArrivalToggle") arrivalToggle = !arrivalToggle update_icon() - add_fingerprint(usr) + . = TRUE /obj/machinery/announcement_system/attack_robot(mob/living/silicon/user) . = attack_ai(user) @@ -172,6 +175,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) arrival = pick("#!@%ERR-34%2 CANNOT LOCAT@# JO# F*LE!", "CRITICAL ERROR 99.", "ERR)#: DA#AB@#E NOT F(*ND!") newhead = pick("OV#RL()D: \[UNKNOWN??\] DET*#CT)D!", "ER)#R - B*@ TEXT F*O(ND!", "AAS.exe is not responding. NanoOS is searching for a solution to the problem.") + ui_update() /obj/machinery/announcement_system/emp_act(severity) . = ..() diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm index bca88699016a0..224eeb0110d5b 100644 --- a/code/game/machinery/aug_manipulator.dm +++ b/code/game/machinery/aug_manipulator.dm @@ -129,7 +129,6 @@ to_chat(user, "[src] is empty.") /obj/machinery/aug_manipulator/AltClick(mob/living/user) - ..() if(!user.canUseTopic(src, !issilicon(user))) return else diff --git a/code/game/machinery/autodoc.dm b/code/game/machinery/autodoc.dm deleted file mode 100644 index 9d5c247736a03..0000000000000 --- a/code/game/machinery/autodoc.dm +++ /dev/null @@ -1,167 +0,0 @@ -/obj/machinery/autodoc - name = "autodoc" - desc = "An advanced machine used for inserting organs and implants into the occupant." - density = TRUE - state_open = FALSE - icon = 'icons/obj/machines/autodoc.dmi' - icon_state = "autodoc_machine" - verb_say = "states" - idle_power_usage = 50 - circuit = /obj/item/circuitboard/machine/autodoc - var/obj/item/organ/storedorgan - var/organ_type = /obj/item/organ - var/processing = FALSE - var/surgerytime = 300 - -/obj/machinery/autodoc/Initialize() - . = ..() - update_icon() - -/obj/machinery/autodoc/RefreshParts() - var/max_time = 350 - for(var/obj/item/stock_parts/L in component_parts) - max_time -= (L.rating*10) - surgerytime = max(max_time,10) - -/obj/machinery/autodoc/examine(mob/user) - . = ..() - if((obj_flags & EMAGGED) && panel_open) - . += "[src]'s surgery protocols have been corrupted!" - if(processing) - . += "[src] is currently inserting [storedorgan] into [occupant]." - else if(storedorgan) - . += "[src] has been prepared to insert [storedorgan]." - -/obj/machinery/autodoc/close_machine(mob/user) - ..() - playsound(src, 'sound/machines/click.ogg', 50) - if(occupant) - if(!iscarbon(occupant)) - occupant.forceMove(drop_location()) - occupant = null - return - to_chat(occupant, "The doors to [src] clamp shut behind you.") - - dosurgery() - -/obj/machinery/autodoc/proc/dosurgery() - if(!storedorgan && !(obj_flags & EMAGGED)) - to_chat(occupant, "[src] currently has no implant stored.") - return - - occupant.visible_message("[occupant] presses a button on [src]. A mechanical humming can be heard.", "You feel a sharp sting as [src] starts inserting the organ into your body.") - playsound(get_turf(occupant), 'sound/weapons/circsawhit.ogg', 50, 1) - processing = TRUE - update_icon() - var/mob/living/carbon/C = occupant - if(obj_flags & EMAGGED) - - for(var/obj/item/bodypart/BP in reverseList(C.bodyparts)) //Chest and head are first in bodyparts, so we invert it to make them suffer more - C.emote("scream") - if(!HAS_TRAIT(C, TRAIT_NODISMEMBER)) - BP.dismember() - else - C.apply_damage(40, BRUTE, BP) - sleep(5) //2 seconds to get outta there before dying - if(!processing) - return - - occupant.visible_message("[src] dismembers [occupant]!", "[src] saws up your body!") - - else - sleep(surgerytime) - if(!processing) - return - var/obj/item/organ/currentorgan = C.getorganslot(storedorgan.slot) - if(currentorgan) - currentorgan.Remove(C) - currentorgan.forceMove(get_turf(src)) - storedorgan.Insert(occupant)//insert stored organ into the user - storedorgan = null - occupant.visible_message("[src] completes the surgery procedure.", "[src] inserts the organ into your body.") - playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, 0) - processing = FALSE - open_machine() - -/obj/machinery/autodoc/open_machine(mob/user) - if(processing) - occupant.visible_message("[user] cancels [src]'s procedure.", "[src] stops inserting the organ into your body.") - processing = FALSE - if(occupant) - occupant.forceMove(drop_location()) - occupant = null - ..(FALSE) - -/obj/machinery/autodoc/interact(mob/user) - if(panel_open) - to_chat(user, "Close the maintenance panel first.") - return - - if(state_open) - close_machine() - return - - open_machine() - -/obj/machinery/autodoc/attackby(obj/item/I, mob/user, params) - if(istype(I, organ_type)) - if(storedorgan) - to_chat(user, "[src] already has an implant stored.") - return - if(!user.transferItemToLoc(I, src)) - return - storedorgan = I - I.forceMove(src) - to_chat(user, "You insert the [I] into [src].") - else - return ..() - -/obj/machinery/autodoc/screwdriver_act(mob/living/user, obj/item/I) - . = TRUE - if(..()) - return - if(occupant) - to_chat(user, "[src] is currently occupied!") - return - if(state_open) - to_chat(user, "[src] must be closed to [panel_open ? "close" : "open"] its maintenance hatch!") - return - if(default_deconstruction_screwdriver(user, icon_state, icon_state, I)) - if(storedorgan) - storedorgan.forceMove(drop_location()) - storedorgan = null - update_icon() - return - return FALSE - -/obj/machinery/autodoc/crowbar_act(mob/living/user, obj/item/I) - if(default_deconstruction_crowbar(I)) - return TRUE - - -/obj/machinery/autodoc/update_icon() - overlays.Cut() - if(!state_open) - if(processing) - overlays += "[icon_state]_door_on" - overlays += "[icon_state]_stack" - overlays += "[icon_state]_smoke" - overlays += "[icon_state]_green" - else - overlays += "[icon_state]_door_off" - if(occupant) - if(powered(AREA_USAGE_EQUIP)) - overlays += "[icon_state]_stack" - overlays += "[icon_state]_yellow" - else - overlays += "[icon_state]_red" - else if(powered(AREA_USAGE_EQUIP)) - overlays += "[icon_state]_red" - if(panel_open) - overlays += "[icon_state]_panel" - -/obj/machinery/autodoc/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - obj_flags |= EMAGGED - to_chat(user, "You reprogram [src]'s surgery procedures.") diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm deleted file mode 100644 index 7bee5202ff3bf..0000000000000 --- a/code/game/machinery/autolathe.dm +++ /dev/null @@ -1,610 +0,0 @@ -#define AUTOLATHE_MAX_POWER_USE 2000 - -/obj/machinery/autolathe - name = "autolathe" - desc = "It produces items using iron, copper, 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/autolathe - layer = BELOW_OBJ_LAYER - - var/operating = FALSE - var/wants_operate = FALSE - var/disabled = 0 - var/shocked = FALSE - var/hack_wire - var/disable_wire - var/shock_wire - - //Security modes - var/security_interface_locked = TRUE - var/hacked = FALSE - - var/busy = FALSE - var/prod_coeff = 1 - - var/datum/design/being_built - var/process_completion_world_tick = 0 - var/total_build_time = 0 - var/datum/techweb/stored_research - - var/list/categories = list( - "Tools", - "Electronics", - "Construction", - "T-Comm", - "Security", - "Machinery", - "Medical", - "Misc", - "Dinnerware", - "Imported" - ) - - var/output_direction = 0 - var/obj/item/disk/design_disk/inserted_disk - - //A list of all the printable items - - //Queue items - - //Viewing mobs of the UI to update - var/list/mob/viewing_mobs = list() - //Associative list: item_queue[design_id] = list("amount" = int, "repeating" = bool, "build_mat" = something) - //These are the items in the build queue. (It's a queue that takes priority over item_queue) - var/list/build_queue = list() - //Associative list: item_queue[design_id] = list("amount" = int, "repeating" = bool, "build_mat" = something) - //The items in the item queue - var/list/item_queue = list() - //If true, once an item is processed it will be stuck right back on again - var/queue_repeating = FALSE - //The amount to readd to the queue when processing is done - var/stored_item_amount - -/obj/machinery/autolathe/Initialize() - AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass, /datum/material/copper, /datum/material/gold, /datum/material/gold, /datum/material/silver, /datum/material/diamond, /datum/material/uranium, /datum/material/plasma, /datum/material/bluespace, /datum/material/bananium, /datum/material/titanium), 0, TRUE, null, null, CALLBACK(src, .proc/AfterMaterialInsert)) - . = ..() - - wires = new /datum/wires/autolathe(src) - stored_research = new /datum/techweb/specialized/autounlocking/autolathe - -/obj/machinery/autolathe/Destroy() - QDEL_NULL(wires) - return ..() - -/obj/machinery/autolathe/ui_state() - return GLOB.default_state - -/obj/machinery/autolathe/ui_interact(mob/user, datum/tgui/ui = null) - if(!is_operational()) - return - - if(shocked && !(stat & NOPOWER)) - shock(user,50) - - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "ModularFabricator") - ui.open() - ui.set_autoupdate(TRUE) - viewing_mobs += user - -/obj/machinery/autolathe/ui_close(mob/user) - . = ..() - viewing_mobs -= user - -/obj/machinery/autolathe/ui_static_data(mob/user) - var/list/data = list() - data["acceptsDisk"] = TRUE - - //Items - data["items"] = list() - var/list/categories_associative = list() - for(var/v in stored_research.researched_designs) - var/datum/design/D = SSresearch.techweb_design_by_id(v) - for(var/cat in D.category) - //Check if printable - if(!(cat in categories)) - continue - if(!islist(categories_associative[cat])) - categories_associative[cat] = list() - - //Calculate cost - var/list/material_cost = list() - for(var/material_id in D.materials) - material_cost += list(list( - "name" = material_id, - "amount" = D.materials[material_id] / MINERAL_MATERIAL_AMOUNT, - )) - - //Add - categories_associative[cat] += list(list( - "name" = D.name, - "design_id" = D.id, - "material_cost" = material_cost, - )) - - //Categories and their items - for(var/category in categories_associative) - data["items"] += list(list( - "category_name" = category, - "category_items" = categories_associative[category], - )) - - //Inserted data disk - data["diskInserted"] = inserted_disk - return data - -/obj/machinery/autolathe/ui_data(mob/user) - var/list/data = list() - //Output direction - data["outputDir"] = output_direction - - //Queue - data["queue"] = list() - - //Build queue at the top - for(var/item_design_id in build_queue) - var/datum/design/D = SSresearch.techweb_design_by_id(item_design_id) - var/list/additional_data = build_queue[item_design_id] - data["queue"] += list(list( - "name" = D.name, - "amount" = additional_data["amount"], - "repeat" = additional_data["repeating"], - "design_id" = item_design_id, - "build_queue" = 1, - )) - - //Real queue at the bottom - for(var/item_design_id in item_queue) - var/datum/design/D = SSresearch.techweb_design_by_id(item_design_id) - var/list/additional_data = item_queue[item_design_id] - data["queue"] += list(list( - "name" = D.name, - "amount" = additional_data["amount"], - "repeat" = additional_data["repeating"], - "design_id" = item_design_id, - "build_queue" = 0, - )) - - //Materials - data["materials"] = list() - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - for(var/material in materials.materials) - var/datum/material/M = material - var/mineral_amount = materials.materials[material] - data["materials"] += list(list( - "name" = M.name, - "amount" = mineral_amount, - "datum" = M.type - )) - - //Thing being made - if(being_built && total_build_time && process_completion_world_tick) - data["being_build"] = list( - "design_id" = being_built.id, - "name" = being_built.name, - "progress" = 100-(100*((process_completion_world_tick - world.time)/total_build_time)), - ) - - //Security interface - data["sec_interface_unlock"] = !security_interface_locked - data["hacked"] = hacked - - //Being Build - return data - -/obj/machinery/autolathe/ui_act(action, params) - if(..()) - return - - switch(action) - if("toggle_safety") - if(security_interface_locked) - return - adjust_hacked(!hacked) - - if("toggle_lock") - if(obj_flags & EMAGGED) - return - security_interface_locked = TRUE - - if("output_dir") - output_direction = text2num(params["direction"]) - - if("upload_disk") - var/obj/item/disk/design_disk/D = inserted_disk - if(!istype(D)) - return - for(var/B in D.blueprints) - if(B) - stored_research.add_design(B) - update_viewer_statics() - - if("eject_disk") - if(!inserted_disk) - return - var/obj/item/disk/design_disk/disk = inserted_disk - disk.forceMove(get_turf(src)) - update_viewer_statics() - - if("eject_material") - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - var/material_datum = params["material_datum"] //Comes out as text - var/amount = text2num(params["amount"]) - if(amount <= 0 || amount > 50) - return - for(var/mat in materials.materials) - var/datum/material/M = mat - if("[M.type]" == material_datum) - materials.retrieve_sheets(amount, M, get_release_turf()) - break - - if("queue_repeat") - queue_repeating = text2num(params["repeating"]) - - if("clear_queue") - item_queue.Cut() - - if("item_repeat") - var/design_id = params["design_id"] - var/repeating_mode = text2num(params["repeating"]) - if(!item_queue["[design_id]"]) - return - item_queue["[design_id]"]["repeating"] = repeating_mode - - if("clear_item") - var/design_id = params["design_id"] - var/queue_type = text2num(params["build_queue"]) - if(queue_type) - build_queue -= design_id - else - item_queue -= design_id - - if("queue_item") - var/design_id = params["design_id"] - var/amount = text2num(params["amount"]) - add_to_queue(item_queue, design_id, amount) - - if("build_item") - var/design_id = params["design_id"] - var/amount = text2num(params["amount"]) - add_to_queue(build_queue, design_id, amount) - - if("begin_process") - begin_process() - - //Update the UI for them so it's smooth - ui_interact(usr) - -/obj/machinery/autolathe/proc/update_viewer_statics() - for(var/mob/M in viewing_mobs) - if(QDELETED(M) || !(M.client || M.mind)) - continue - update_static_data(M) - -/obj/machinery/autolathe/proc/add_to_queue(queue_list, design_id, amount, repeat=null) - if(queue_list["[design_id]"]) - queue_list["[design_id]"]["amount"] += amount - if(queue_list["[design_id]"]["amount"] <= 0) - queue_list -= "[design_id]" - return - if(amount <= 0) - return - //Check if the item uses custom materials - var/datum/design/requested_item = stored_research.isDesignResearchedID(design_id) - var/datum/material/used_material = repeat - if(!istype(used_material)) - for(var/MAT in requested_item.materials) - used_material = MAT - if(istext(used_material)) //This means its a category - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - 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 sortList(list_to_show, /proc/cmp_typepaths_asc) - if(!used_material) - return //Didn't pick any material, so you can't build shit either. - - queue_list["[design_id]"] = list( - "amount" = amount, - "repeating" = repeat, - "build_mat" = used_material, - ) - -/obj/machinery/autolathe/proc/get_release_turf() - var/turf/T - if(output_direction) - T = get_step(src, output_direction) - if(is_blocked_turf(T, TRUE)) - T = get_turf(src) - else - T = get_turf(src) - return T - -/obj/machinery/autolathe/on_deconstruction() - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - materials.retrieve_all() - -/obj/machinery/autolathe/attackby(obj/item/O, mob/user, params) - - if(ACCESS_SECURITY in O.GetAccess() && !(obj_flags & EMAGGED)) - security_interface_locked = !security_interface_locked - to_chat(user, "You [security_interface_locked?"lock":"unlock"] the security controls of [src].") - return TRUE - - if (busy) - to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.") - return TRUE - - if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O)) - 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] loads \the [O] into \the [src]...", - "You load a design from \the [O]...", - "You hear the chatter of a floppy drive.") - inserted_disk = O - O.forceMove(src) - update_viewer_statics() - return TRUE - - return ..() - - -/obj/machinery/autolathe/proc/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted) - if(ispath(type_inserted, /obj/item/stack/ore/bluespace_crystal)) - use_power(MINERAL_MATERIAL_AMOUNT / 10) - else - switch(id_inserted) - if (/datum/material/iron) - flick("autolathe_o",src)//plays metal insertion animation - if(/datum/material/copper) - flick("autolathe_c",src)//plays metal insertion animation - else - flick("autolathe_r",src)//plays glass insertion animation by default otherwise - use_power(min(1000, amount_inserted / 100)) - //Begin processing to continue the queue if we had items in the queue - if(wants_operate) - begin_process() - -/obj/machinery/autolathe/proc/begin_process() - if(busy || operating || disabled) - return - var/requested_design_id = null - var/from_build_queue = FALSE - if(LAZYLEN(build_queue)) - requested_design_id = build_queue[1] - from_build_queue = TRUE - else if(LAZYLEN(item_queue)) - requested_design_id = item_queue[1] - //Queue processing done - if(!requested_design_id) - say("Queue processing completed.") - operating = FALSE - return - operating = TRUE - //Doubles as protection from bad things and makes sure we can still make the item. - being_built = stored_research.isDesignResearchedID(requested_design_id) - if(!being_built) - playsound(src, 'sound/machines/buzz-two.ogg', 50) - say("Unknown design requested, removing from queue.") - build_queue -= requested_design_id - item_queue -= requested_design_id - addtimer(CALLBACK(src, .proc/restart_process), 50) - return - - var/multiplier = 1 - var/is_stack = ispath(being_built.build_path, /obj/item/stack) - //Only items that can stack should be build en mass, since we now have queues. - if(is_stack) - if(from_build_queue) - multiplier = build_queue[requested_design_id]["amount"] - else - multiplier = item_queue[requested_design_id]["amount"] - 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(AUTOLATHE_MAX_POWER_USE, (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 - if(from_build_queue) - used_material = build_queue[requested_design_id]["build_mat"] - else - used_material = item_queue[requested_design_id]["build_mat"] - if(!used_material) - build_queue -= requested_design_id - item_queue -= requested_design_id - addtimer(CALLBACK(src, .proc/restart_process), 50) - 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) ** 0.8 - //===Repeating mode=== - //Remove from queue - if(from_build_queue) - build_queue[requested_design_id]["amount"] -= multiplier - if(build_queue[requested_design_id]["amount"] <= 0) - build_queue -= requested_design_id - else - var/list/queue_data = item_queue[requested_design_id] - item_queue[requested_design_id]["amount"] -= multiplier - var/removed = FALSE - if(item_queue[requested_design_id]["amount"] <= 0) - item_queue -= requested_design_id - removed = TRUE - //Requeue if necessary - if(queue_repeating || queue_data["repeating"]) - stored_item_amount ++ - if(removed) - add_to_queue(item_queue, requested_design_id, stored_item_amount, queue_data["build_mat"]) - stored_item_amount = 0 - //Create item and restart - process_completion_world_tick = world.time + time - total_build_time = time - addtimer(CALLBACK(src, .proc/make_item, power, materials_used, custom_materials, multiplier, coeff, is_stack), time) - addtimer(CALLBACK(src, .proc/restart_process), time + 5) - else - say("Insufficient materials, operation will proceed when sufficient materials are available.") - operating = FALSE - wants_operate = TRUE - -/obj/machinery/autolathe/proc/restart_process() - operating = FALSE - wants_operate = FALSE - if(disabled) - return - begin_process() - -/obj/machinery/autolathe/proc/make_item(power, var/list/materials_used, var/list/picked_materials, multiplier, coeff, is_stack) - if(QDELETED(src)) - return - //Stops the queue - if(disabled) - operating = FALSE - return - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - var/turf/A = get_release_turf() - 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.autolathe_crafted(src) - else - for(var/i=1, i<=multiplier, i++) - var/obj/item/new_item = new being_built.build_path(A) - new_item.materials = new_item.materials.Copy() - for(var/mat in materials_used) - new_item.materials[mat] = materials_used[mat] / multiplier - new_item.autolathe_crafted(src) - - if(length(picked_materials)) - new_item.set_custom_materials(picked_materials, 1 / multiplier) //Ensure we get the non multiplied amount - being_built = null - icon_state = "autolathe" - busy = FALSE - updateDialog() - -/obj/machinery/autolathe/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 = min(1,max(0,T)) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4 - -/obj/machinery/autolathe/examine(mob/user) - . += ..() - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Storing up to [materials.max_amount] material units.
Material consumption at [prod_coeff*100]%." - -/obj/machinery/autolathe/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/autolathe/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/autolathe/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/autolathe/proc/adjust_hacked(state) - hacked = state - 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(hacked) - stored_research.add_design(D) - else - stored_research.remove_design(D) - update_viewer_statics() - -/obj/machinery/autolathe/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - security_interface_locked = FALSE - adjust_hacked(TRUE) - playsound(src, "sparks", 100, 1) - obj_flags |= EMAGGED - -/obj/machinery/autolathe/hacked/Initialize() - . = ..() - adjust_hacked(TRUE) - -//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 diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm index ea9e8606ae11f..0067e3f1b70d1 100644 --- a/code/game/machinery/bank_machine.dm +++ b/code/game/machinery/bank_machine.dm @@ -38,25 +38,28 @@ return return ..() - -/obj/machinery/computer/bank_machine/process() +/obj/machinery/computer/bank_machine/process(delta_time) ..() if(siphoning) if (stat & (BROKEN|NOPOWER)) say("Insufficient power. Halting siphon.") end_syphon() + ui_update() + return + var/siphon_am = 100 * delta_time var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(!D.has_money(200)) + if(!D.has_money(siphon_am)) say("Cargo budget depleted. Halting siphon.") end_syphon() + ui_update() return - playsound(src, 'sound/items/poster_being_created.ogg', 100, 1) - syphoning_credits += 200 - D.adjust_money(-200) + playsound(src, 'sound/items/poster_being_created.ogg', 100, TRUE) + syphoning_credits += siphon_am + D.adjust_money(-siphon_am) if(next_warning < world.time && prob(15)) var/area/A = get_area(loc) - var/message = "Unauthorized credit withdrawal underway in [A.map_name]!!" + var/message = "Unauthorized credit withdrawal underway in [initial(A.name)]!!" radio.talk_into(src, message, radio_channel) next_warning = world.time + minimum_time_between_warnings diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index a11d60e680acf..0f06149b255c0 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -4,13 +4,14 @@ icon = 'icons/obj/stationobjs.dmi' icon_state = "doorctrl" var/skin = "doorctrl" + layer = ABOVE_WINDOW_LAYER power_channel = AREA_USAGE_ENVIRON var/obj/item/assembly/device var/obj/item/electronics/airlock/board var/device_type = null var/id = null var/initialized_button = 0 - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 70) + armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 70, "stamina" = 0) use_power = IDLE_POWER_USE idle_power_usage = 2 resistance_flags = LAVA_PROOF | FIRE_PROOF @@ -111,6 +112,12 @@ playsound(src, "sparks", 100, 1) obj_flags |= EMAGGED +/obj/machinery/button/eminence_act(mob/living/simple_animal/eminence/eminence) + . = ..() + to_chat(usr, "You begin manipulating [src]!") + if(do_after(eminence, 20, target=get_turf(eminence))) + attack_hand(eminence) + /obj/machinery/button/attack_ai(mob/user) if(!panel_open) return attack_hand(user) @@ -272,7 +279,6 @@ icon_state = "launcher" skin = "launcher" device_type = /obj/item/assembly/control/crematorium - req_access = list() id = 1 /obj/machinery/button/crematorium/indestructible diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 73988b87d3904..3ad1c16347c9c 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -4,7 +4,7 @@ /obj/machinery/camera name = "security camera" - desc = "It's used to monitor rooms." + desc = "A wireless camera used to monitor rooms. It is powered by a long-life internal battery." icon = 'icons/obj/machines/camera.dmi' icon_state = "camera" //mapping icon to represent upgrade states. if you want a different base icon, update default_camera_icon as well as this. use_power = ACTIVE_POWER_USE @@ -13,7 +13,7 @@ layer = WALL_OBJ_LAYER resistance_flags = FIRE_PROOF - armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 50) + armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 50, "stamina" = 0) max_integrity = 100 integrity_failure = 50 var/default_camera_icon = "camera" //the camera's base icon used by update_icon - icon_state is primarily used for mapping display purposes. @@ -23,9 +23,13 @@ var/start_active = FALSE //If it ignores the random chance to start broken on round start var/invuln = null var/obj/item/camera_bug/bug = null - var/obj/structure/camera_assembly/assembly = null + var/datum/weakref/assembly_ref = null var/area/myarea = null + FASTDMM_PROP(\ + pinned_vars = list("name", "network", "c_tag")\ + ) + //OTHER var/view_range = 7 @@ -57,6 +61,7 @@ for(var/i in network) network -= i network += lowertext(i) + var/obj/structure/camera_assembly/assembly if(CA) assembly = CA if(assembly.xray_module) @@ -74,6 +79,7 @@ else assembly = new(src) assembly.state = 4 //STATE_FINISHED + assembly_ref = WEAKREF(assembly) GLOB.cameranet.cameras += src GLOB.cameranet.addCamera(src) if (isturf(loc)) @@ -89,17 +95,18 @@ /obj/machinery/camera/Destroy() if(can_use()) toggle_cam(null, 0) //kick anyone viewing out and remove from the camera chunks + GLOB.cameranet.removeCamera(src) GLOB.cameranet.cameras -= src + cancelCameraAlarm() if(isarea(myarea)) - LAZYREMOVE(myarea.cameras, src) - QDEL_NULL(assembly) + myarea.clear_camera(src) + QDEL_NULL(assembly_ref) QDEL_NULL(emp_component) if(bug) - bug.bugged_cameras -= src.c_tag + bug.bugged_cameras -= c_tag if(bug.current == src) bug.current = null bug = null - cancelCameraAlarm() return ..() /obj/machinery/camera/examine(mob/user) @@ -222,6 +229,9 @@ /obj/machinery/camera/attackby(obj/item/I, mob/living/user, params) // UPGRADES if(panel_open) + var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() + if(!assembly) + assembly_ref = null if(I.tool_behaviour == TOOL_ANALYZER) if(!isXRay(TRUE)) //don't reveal it was already upgraded if was done via MALF AI Upgrade Camera Network ability if(!user.temporarilyRemoveItemFromInventory(I)) @@ -297,7 +307,7 @@ else to_chat(user, "Camera bugged.") bug = I - bug.bugged_cameras[src.c_tag] = src + bug.bugged_cameras[src.c_tag] = WEAKREF(src) return else if(istype(I, /obj/item/pai_cable)) @@ -320,12 +330,13 @@ /obj/machinery/camera/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) if(disassembled) + var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() if(!assembly) assembly = new() assembly.forceMove(drop_location()) assembly.state = 1 assembly.setDir(dir) - assembly = null + assembly_ref = null else var/obj/item/I = new /obj/item/wallframe/camera (loc) I.obj_integrity = I.max_integrity * 0.5 @@ -343,7 +354,7 @@ else icon_state = "[xray_module][default_camera_icon][in_use_lights ? "_in_use" : ""]" -/obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = 1) +/obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = TRUE) status = !status if(can_use()) GLOB.cameranet.addCamera(src) @@ -397,6 +408,8 @@ return FALSE if(stat & EMPED) return FALSE + if(is_jammed()) + return FALSE return TRUE /obj/machinery/camera/proc/can_see() @@ -444,7 +457,7 @@ /obj/machinery/camera/get_remote_view_fullscreens(mob/user) if(view_range == short_range) //unfocused - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2) /obj/machinery/camera/update_remote_sight(mob/living/user) user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index af5093d6caf9a..e2e6e393e680c 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -38,10 +38,9 @@ return TRUE /obj/machinery/camera/Destroy() - var/area/ai_monitored/A = get_area(src) localMotionTargets = null - if(istype(A)) - A.motioncameras -= src + if(area_motion) + area_motion.motioncameras -= src cancelAlarm() return ..() diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index dcbff23b21ae5..e37c764e7375e 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -72,12 +72,14 @@ // UPGRADE PROCS /obj/machinery/camera/proc/isEmpProof(ignore_malf_upgrades) - return (upgrades & CAMERA_UPGRADE_EMP_PROOF) && (!(ignore_malf_upgrades && assembly.malf_emp_firmware_active)) + var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() + return (upgrades & CAMERA_UPGRADE_EMP_PROOF) && (!(ignore_malf_upgrades && assembly?.malf_emp_firmware_active)) /obj/machinery/camera/proc/upgradeEmpProof(malf_upgrade, ignore_malf_upgrades) if(isEmpProof(ignore_malf_upgrades)) //pass a malf upgrade to ignore_malf_upgrades so we can replace the malf module with the normal one return //that way if someone tries to upgrade an already malf-upgraded camera, it'll just upgrade it to a normal version. emp_component = AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES | EMP_PROTECT_CONTENTS) + var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() if(malf_upgrade) assembly.malf_emp_firmware_active = TRUE //don't add parts to drop, update icon, ect. reconstructing it will also retain the upgrade. assembly.malf_emp_firmware_present = TRUE //so the upgrade is retained after incompatible parts are removed. @@ -98,11 +100,13 @@ /obj/machinery/camera/proc/isXRay(ignore_malf_upgrades) + var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() return (upgrades & CAMERA_UPGRADE_XRAY) && (!(ignore_malf_upgrades && assembly.malf_xray_firmware_active)) /obj/machinery/camera/proc/upgradeXRay(malf_upgrade, ignore_malf_upgrades) if(isXRay(ignore_malf_upgrades)) //pass a malf upgrade to ignore_malf_upgrades so we can replace the malf upgrade with the normal one return //that way if someone tries to upgrade an already malf-upgraded camera, it'll just upgrade it to a normal version. + var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() if(malf_upgrade) assembly.malf_xray_firmware_active = TRUE //don't add parts to drop, update icon, ect. reconstructing it will also retain the upgrade. assembly.malf_xray_firmware_present = TRUE //so the upgrade is retained after incompatible parts are removed. @@ -128,6 +132,8 @@ /obj/machinery/camera/proc/upgradeMotion() if(isMotion()) return + var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() + if(name == initial(name)) name = "motion-sensitive security camera" if(!assembly.proxy_module) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index bf1b84fe5d4f8..767cb90abad74 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -49,9 +49,9 @@ track.namecounts[name] = 1 if(ishuman(L)) - track.humans[name] = L + track.humans[name] = WEAKREF(L) else - track.others[name] = L + track.others[name] = WEAKREF(L) var/list/targets = sortList(track.humans) + sortList(track.others) @@ -67,9 +67,9 @@ if(!track.initialized) trackable_mobs() - var/mob/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name]) + var/datum/weakref/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name]) - ai_actual_track(target) + ai_actual_track(target.resolve()) /mob/living/silicon/ai/proc/ai_actual_track(mob/living/target) if(!istype(target)) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 4d13f9d61b392..8f824e2864640 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -11,7 +11,7 @@ pass_flags = PASSTABLE var/obj/item/stock_parts/cell/charging = null var/chargelevel = -1 - var/charge_rate = 500 + var/charge_rate = 250 /obj/machinery/cell_charger/update_icon() cut_overlays() @@ -28,7 +28,7 @@ if(charging) . += "Current charge: [round(charging.percent(), 1)]%." if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Charge rate at [charge_rate]J per cycle." + . += "The status display reads: Charging power: [charge_rate]W." /obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stock_parts/cell) && !panel_open) @@ -115,17 +115,17 @@ charging.emp_act(severity) /obj/machinery/cell_charger/RefreshParts() - charge_rate = 500 + charge_rate = 250 for(var/obj/item/stock_parts/capacitor/C in component_parts) charge_rate *= C.rating -/obj/machinery/cell_charger/process() +/obj/machinery/cell_charger/process(delta_time) if(!charging || !anchored || (stat & (BROKEN|NOPOWER))) return if(charging.percent() >= 100) return - use_power(charge_rate) - charging.give(charge_rate) //this is 2558, efficient batteries exist + use_power(charge_rate * delta_time) + charging.give(charge_rate * delta_time) //this is 2558, efficient batteries exist update_icon() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index da20066cc047b..1baf6947c205a 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -60,6 +60,7 @@ var/mob/living/mob_occupant = occupant go_out() if(mob_occupant) + // Random comment: this is a bad situation since breaking the pod ejects the occupant log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] due to Destroy().") QDEL_NULL(radio) QDEL_NULL(countdown) @@ -94,7 +95,6 @@ user.examinate(src) /obj/machinery/clonepod/AltClick(mob/user) - . = ..() if (alert(user, "Are you sure you want to empty the cloning pod?", "Empty Reagent Storage:", "Yes", "No") != "Yes") return to_chat(user, "You empty \the [src]'s release valve onto the floor.") @@ -112,13 +112,14 @@ . += "Synthflesh consumption at [round(fleshamnt*90, 1)]cm3 per clone.
" . += "The reagent display reads: [round(reagents.total_volume, 1)] / [reagents.maximum_volume] cm3" if(efficiency > 5) - . += "Pod has been upgraded to support autoprocessing and apply beneficial mutations." + . += "Pod has been upgraded to support autoprocessing and apply beneficial mutations." //The return of data disks?? Just for transferring between genetics machine/cloning machine. //TO-DO: Make the genetics machine accept them. /obj/item/disk/data name = "cloning data disk" icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk. + var/list/genetic_makeup_buffer = list() var/list/fields = list() var/list/mutations = list() var/max_mutations = 6 @@ -138,6 +139,15 @@ . = ..() . += "The write-protect tab is set to [read_only ? "protected" : "unprotected"]." +/obj/item/disk/data/debug + name = "Debug genetic data disk" + desc = "A disk that contains all existing genetic mutations." + max_mutations = 100 + +/obj/item/disk/data/debug/Initialize() + . = ..() + for(var/datum/mutation/human/HM as() in GLOB.all_mutations) + mutations += new HM //Clonepod @@ -276,7 +286,7 @@ /obj/machinery/clonepod/process() var/mob/living/mob_occupant = occupant - if(!is_operational()) //Autoeject if power is lost + if(!is_operational()) //Autoeject if power is lost (or the pod is dysfunctional due to whatever reason) if(mob_occupant) go_out() log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] due to power loss.") @@ -319,7 +329,7 @@ mob_occupant.Unconscious(80) var/dmg_mult = CONFIG_GET(number/damage_multiplier) //Slowly get that clone healed and finished. - mob_occupant.adjustCloneLoss(-((speed_coeff / 2) * dmg_mult)) + mob_occupant.adjustCloneLoss(-((speed_coeff / 2) * dmg_mult), TRUE, TRUE) if(reagents.has_reagent(/datum/reagent/medicine/synthflesh, fleshamnt)) reagents.remove_reagent(/datum/reagent/medicine/synthflesh, fleshamnt) else if(reagents.has_reagent(/datum/reagent/blood, fleshamnt*3)) @@ -341,7 +351,7 @@ var/obj/item/bodypart/BP = I BP.attach_limb(mob_occupant) - use_power(7500) //This might need tweaking. + use_power(5000 * speed_coeff) //This might need tweaking. else if(mob_occupant && (mob_occupant.cloneloss <= (100 - heal_level))) connected_message("Cloning Process Complete.") @@ -436,7 +446,7 @@ connected.updateUsrDialog() return TRUE -/obj/machinery/clonepod/proc/go_out() +/obj/machinery/clonepod/proc/go_out(move = TRUE) countdown.stop() var/mob/living/mob_occupant = occupant var/turf/T = get_turf(src) @@ -456,6 +466,12 @@ if(!mob_occupant) return + + if(HAS_TRAIT(mob_occupant, TRAIT_NOCLONELOSS)) + var/cl_loss = mob_occupant.getCloneLoss() + mob_occupant.adjustBruteLoss(cl_loss, FALSE) + mob_occupant.setCloneLoss(0, FALSE, TRUE) + current_insurance = null REMOVE_TRAIT(mob_occupant, TRAIT_STABLEHEART, CLONING_POD_TRAIT) REMOVE_TRAIT(mob_occupant, TRAIT_STABLELIVER, CLONING_POD_TRAIT) @@ -469,7 +485,8 @@ to_chat(occupant, "There is a bright flash!
You feel like a new being.
") mob_occupant.flash_act() - occupant.forceMove(T) + if(move) + occupant.forceMove(T) icon_state = "pod_0" mob_occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest. for(var/fl in unattached_flesh) @@ -479,6 +496,13 @@ occupant = null clonemind = null +// Guess they moved out on their own, remove any clone status effects +// If the occupant var is null, welp what can we do +/obj/machinery/clonepod/Exited(atom/movable/AM, atom/newloc) + if(AM == occupant) + go_out(FALSE) + . = ..() + /obj/machinery/clonepod/proc/malfunction() var/mob/living/mob_occupant = occupant if(mob_occupant) @@ -551,7 +575,7 @@ qdel(fl) unattached_flesh.Cut() - H.setCloneLoss(CLONE_INITIAL_DAMAGE) //Yeah, clones start with very low health, not with random, because why would they start with random health + H.setCloneLoss(CLONE_INITIAL_DAMAGE, TRUE, TRUE) //Yeah, clones start with very low health, not with random, because why would they start with random health // In addition to being cellularly damaged, they also have no limbs or internal organs. // Applying brainloss is done when the clone leaves the pod, so application of traumas can happen // based on the level of damage sustained. @@ -582,6 +606,16 @@ . = ..() reagents.add_reagent(/datum/reagent/medicine/synthflesh, 100) +//Experimental cloner; clones a body regardless of the owner's status. +/obj/machinery/clonepod/experimental + name = "experimental cloning pod" + desc = "An ancient cloning pod. It seems to be an early prototype of the experimental cloners used in Nanotrasen Stations." + icon = 'icons/obj/machines/cloning.dmi' + icon_state = "pod_0" + req_access = null + circuit = /obj/item/circuitboard/machine/clonepod/experimental + internal_radio = FALSE + /* * Manual -- A big ol' manual. */ diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 13c5d45a80ae1..e2872e8c31720 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -7,7 +7,7 @@ icon_screen = "crew" icon_keyboard = "med_key" circuit = /obj/item/circuitboard/computer/operating - var/mob/living/carbon/human/patient + var/obj/structure/table/optable/table var/obj/machinery/stasis/sbed var/list/advanced_surgeries = list() @@ -21,11 +21,11 @@ /obj/machinery/computer/operating/Destroy() for(var/direction in GLOB.cardinals) - table = locate(/obj/structure/table/optable, get_step(src, direction)) + table = locate(/obj/structure/table/optable) in get_step(src, direction) if(table && table.computer == src) table.computer = null else - sbed = locate(/obj/machinery/stasis, get_step(src, direction)) + sbed = locate(/obj/machinery/stasis) in get_step(src, direction) if(sbed && sbed.op_computer == src) sbed.op_computer = null . = ..() @@ -50,12 +50,12 @@ /obj/machinery/computer/operating/proc/find_table() for(var/direction in GLOB.cardinals) - table = locate(/obj/structure/table/optable, get_step(src, direction)) + table = locate(/obj/structure/table/optable) in get_step(src, direction) if(table) table.computer = src break else - sbed = locate(/obj/machinery/stasis, get_step(src, direction)) + sbed = locate(/obj/machinery/stasis) in get_step(src, direction) if(sbed) sbed.op_computer = src break @@ -69,6 +69,7 @@ if(!ui) ui = new(user, src, "OperatingComputer") ui.open() + ui.set_autoupdate(TRUE) /obj/machinery/computer/operating/ui_data(mob/user) var/list/data = list() @@ -80,20 +81,29 @@ surgery["desc"] = initial(S.desc) surgeries += list(surgery) data["surgeries"] = surgeries - data["patient"] = null + + //If there's no patient just hop to it yeah? + if(!table && !sbed) + data["patient"] = null + return data + + var/mob/living/carbon/human/patient + if(table) data["table"] = table - if(!table.check_patient()) + if(!table.check_eligible_patient()) return data data["patient"] = list() patient = table.patient else if(sbed) data["table"] = sbed - if(!sbed.check_patient()) + if(!ishuman(sbed.occupant) && !ismonkey(sbed.occupant)) return data data["patient"] = list() - patient = sbed.occupant + if(isliving(sbed.occupant)) + var/mob/living/live = sbed.occupant + patient = live else data["patient"] = null return data diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index fb7e568c88a5f..603225f0cdc1f 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -8,13 +8,16 @@ active_power_usage = 300 max_integrity = 200 integrity_failure = 100 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 20) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 20, "stamina" = 0) var/brightness_on = 2 var/icon_keyboard = "generic_key" var/icon_screen = "generic" var/clockwork = FALSE var/time_to_scewdrive = 20 + ///Should the [icon_state]_broken overlay be shown as an emissive or regular overlay? + var/broken_overlay_emissive = FALSE + /obj/machinery/computer/Initialize(mapload, obj/item/circuitboard/C) . = ..() power_change() @@ -38,6 +41,7 @@ icon_screen = "ratvar[rand(1, 3)]" icon_keyboard = "ratvar_key[rand(1, 2)]" icon_state = "ratvarcomputer" + broken_overlay_emissive = TRUE update_icon() /obj/machinery/computer/narsie_act() @@ -46,6 +50,7 @@ icon_screen = initial(icon_screen) icon_keyboard = initial(icon_keyboard) icon_state = initial(icon_state) + broken_overlay_emissive = initial(broken_overlay_emissive) update_icon() /obj/machinery/computer/update_icon() @@ -57,12 +62,17 @@ add_overlay(icon_keyboard) // This whole block lets screens ignore lighting and be visible even in the darkest room - // We can't do this for many things that emit light unfortunately because it layers over things that would be on top of it var/overlay_state = icon_screen if(stat & BROKEN) - overlay_state = "[icon_state]_broken" - SSvis_overlays.add_vis_overlay(src, icon, overlay_state, layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, overlay_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir, alpha=128) + if(broken_overlay_emissive) + overlay_state = "[icon_state]_broken" + else + add_overlay("[icon_state]_broken") + overlay_state = null + + if(overlay_state) + SSvis_overlays.add_vis_overlay(src, icon, overlay_state, layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, overlay_state, layer, EMISSIVE_PLANE, dir) /obj/machinery/computer/power_change() ..() diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 877611f5168e8..33c69629d4266 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -21,6 +21,11 @@ return ..() +/obj/machinery/computer/aifixer/ui_requires_update(mob/user, datum/tgui/ui) + . = ..() + if(restoring) + . = TRUE + /obj/machinery/computer/aifixer/ui_state(mob/user) return GLOB.default_state @@ -29,6 +34,7 @@ if(!ui) ui = new(user, src, "AiRestorer") ui.open() + ui.set_autoupdate(TRUE) /obj/machinery/computer/aifixer/ui_data(mob/user) var/list/data = list() @@ -84,6 +90,8 @@ restoring = Fix() if(oldstat != occupier.stat) update_icon() + if(!restoring) + ui_update() // One final update /obj/machinery/computer/aifixer/update_icon() ..() @@ -116,6 +124,7 @@ to_chat(user, "Transfer Successful: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.") card.AI = null update_icon() + ui_update() else //Uploading AI from terminal to card if(occupier && !restoring) @@ -125,6 +134,7 @@ card.AI = occupier occupier = null update_icon() + ui_update() else if (restoring) to_chat(user, "ERROR: Reconstruction in progress.") else if (!occupier) diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index a0c6ffdc271b8..5be24afde5728 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -38,7 +38,7 @@ ..(user) /obj/machinery/computer/apc_control/proc/check_apc(obj/machinery/power/apc/APC) - return APC.z == z && !APC.malfhack && !APC.aidisabled && !(APC.obj_flags & EMAGGED) && !APC.stat && !istype(APC.area, /area/ai_monitored) && !APC.area.outdoors + return APC.get_virtual_z_level() == get_virtual_z_level() && !APC.malfhack && !APC.aidisabled && !(APC.obj_flags & EMAGGED) && !APC.stat && !istype(APC.area, /area/ai_monitored) && !APC.area.outdoors /obj/machinery/computer/apc_control/ui_interact(mob/living/user) . = ..() @@ -62,7 +62,7 @@ if(result_filters["Responsive"] && !APC.aidisabled) continue dat += "[A]
\ - Charge: [APC.cell ? "[DisplayEnergy(APC.cell.charge)] / [DisplayEnergy(APC.cell.maxcharge)] ([round((APC.cell.charge / APC.cell.maxcharge) * 100)]%)" : "No Powercell Installed"]
\ + Charge: [APC.cell ? "[DisplayEnergy(APC.cell.charge)] / [DisplayEnergy(APC.cell.maxcharge)] ([round((APC.cell.charge / APC.cell.maxcharge) * 100)]%)" : "No power cell installed."]
\ Area: [APC.area]
\ [APC.aidisabled || APC.panel_open ? "APC does not respond to interface query." : "APC responds to interface query."]

" dat += "Check Logs
" diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 5172dbfdb48b4..1f696a9ac3eb1 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -30,6 +30,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/item/coin/antagtoken = 2, /obj/item/stack/tile/fakespace/loaded = 2, /obj/item/stack/tile/fakepit/loaded = 2, + /obj/item/stack/tile/eighties/loaded = 2, /obj/item/toy/toy_xeno = 2, /obj/item/storage/box/actionfigure = 1, /obj/item/restraints/handcuffs/fake = 2, @@ -43,12 +44,21 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/item/extendohand/acme = 1, /obj/item/hot_potato/harmless/toy = 1, /obj/item/card/emagfake = 1, + /obj/item/disk/nuclear/fake/obvious = 1, /obj/item/clothing/shoes/wheelys = 2, /obj/item/clothing/shoes/kindleKicks = 2, /obj/item/toy/plush/moth = 2, + /obj/item/toy/plush/rouny = 2, /obj/item/storage/box/heretic_asshole = 1, /obj/item/toy/eldrich_book = 1, - /obj/item/storage/belt/military/snack = 2)) + /obj/item/storage/belt/military/snack = 2, + /obj/item/choice_beacon/pet/cat = 1, + /obj/item/choice_beacon/pet/mouse = 1, + /obj/item/choice_beacon/pet/corgi = 1, + /obj/item/choice_beacon/pet/hamster = 1, + /obj/item/choice_beacon/pet/pug = 1, + /obj/item/choice_beacon/pet/pingu = 1, + /obj/item/choice_beacon/pet/clown = 1)) /obj/machinery/computer/arcade name = "random arcade" @@ -57,6 +67,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( icon_keyboard = "no_keyboard" icon_screen = "invaders" clockwork = TRUE //it'd look weird + broken_overlay_emissive = TRUE var/list/prize_override var/prizeselect = /obj/item/coin/arcade_token light_color = LIGHT_COLOR_GREEN @@ -80,29 +91,20 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/machinery/computer/arcade/proc/prizevend(mob/user) SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade) + var/atom/movable/the_prize if(prob(0.0001)) //1 in a million - new /obj/item/gun/energy/pulse/prize(src) + the_prize = new /obj/item/gun/energy/pulse/prize(drop_location()) SSmedals.UnlockMedal(MEDAL_PULSE, user.client) else - new prizeselect(src) + the_prize = new prizeselect(drop_location()) - var/atom/movable/the_prize = pick(contents) visible_message("[src] dispenses [the_prize]!", "You hear a chime and a clunk.") - the_prize.forceMove(get_turf(src)) - /obj/machinery/computer/arcade/proc/redeem(mob/user) - var/redeemselect - if(!contents.len) - if(prize_override) - redeemselect = pickweight(prize_override) - else - redeemselect = pickweight(GLOB.arcade_prize_pool) + var/redeemselect = pickweight(length(prize_override) ? prize_override : GLOB.arcade_prize_pool) - new redeemselect(src) - var/atom/movable/the_prize = pick(contents) + var/atom/movable/the_prize = new redeemselect(drop_location()) visible_message("[src] dispenses [the_prize]!", "You hear a chime and a clunk.") - the_prize.forceMove(get_turf(src)) /obj/machinery/computer/arcade/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/coin/arcade_token) || istype(W, /obj/item/coin/bananium)) @@ -196,7 +198,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( blocked = TRUE var/attackamt = rand(2,6) temp = "You attack for [attackamt] damage!" - playsound(loc, 'sound/arcade/hit.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/hit.ogg', 50, 1, extrarange = -3, falloff_exponent = 10) updateUsrDialog() if(turtle > 0) turtle-- @@ -210,7 +212,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( var/pointamt = rand(1,3) var/healamt = rand(6,8) temp = "You use [pointamt] magic to heal for [healamt] damage!" - playsound(loc, 'sound/arcade/heal.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/heal.ogg', 50, 1, extrarange = -3, falloff_exponent = 10) updateUsrDialog() turtle++ @@ -225,7 +227,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( blocked = TRUE var/chargeamt = rand(4,7) temp = "You regain [chargeamt] points" - playsound(loc, 'sound/arcade/mana.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/mana.ogg', 50, 1, extrarange = -3, falloff_exponent = 10) player_mp += chargeamt if(turtle > 0) turtle-- @@ -260,7 +262,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( if(!gameover) gameover = TRUE temp = "[enemy_name] has fallen! Rejoice!" - playsound(loc, 'sound/arcade/win.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/win.ogg', 50, 1, extrarange = -3, falloff_exponent = 10) if(obj_flags & EMAGGED) new /obj/effect/spawner/newbomb/timer/syndicate(loc) @@ -277,13 +279,13 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( else if ((obj_flags & EMAGGED) && (turtle >= 4)) var/boomamt = rand(5,10) temp = "[enemy_name] throws a bomb, exploding you for [boomamt] damage!" - playsound(loc, 'sound/arcade/boom.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/boom.ogg', 50, 1, extrarange = -3, falloff_exponent = 10) player_hp -= boomamt else if ((enemy_mp <= 5) && (prob(70))) var/stealamt = rand(2,3) temp = "[enemy_name] steals [stealamt] of your power!" - playsound(loc, 'sound/arcade/steal.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/steal.ogg', 50, 1, extrarange = -3, falloff_exponent = 10) player_mp -= stealamt updateUsrDialog() @@ -291,27 +293,27 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( gameover = TRUE sleep(10) temp = "You have been drained! GAME OVER" - playsound(loc, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff_exponent = 10) if(obj_flags & EMAGGED) usr.gib() SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "mana", (obj_flags & EMAGGED ? "emagged":"normal"))) else if ((enemy_hp <= 10) && (enemy_mp > 4)) temp = "[enemy_name] heals for 4 health!" - playsound(loc, 'sound/arcade/heal.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/heal.ogg', 50, 1, extrarange = -3, falloff_exponent = 10) enemy_hp += 4 enemy_mp -= 4 else var/attackamt = rand(3,6) temp = "[enemy_name] attacks for [attackamt] damage!" - playsound(loc, 'sound/arcade/hit.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/hit.ogg', 50, 1, extrarange = -3, falloff_exponent = 10) player_hp -= attackamt if ((player_mp <= 0) || (player_hp <= 0)) gameover = TRUE temp = "You have been crushed! GAME OVER" - playsound(loc, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff = 10) + playsound(loc, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff_exponent = 10) if(obj_flags & EMAGGED) usr.gib() SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "hp", (obj_flags & EMAGGED ? "emagged":"normal"))) @@ -344,6 +346,15 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( // *** THE ORION TRAIL ** // +/obj/item/gamer_pamphlet + name = "pamphlet - \'Violent Video Games and You\'" + desc = "A pamphlet encouraging the reader to maintain a balanced lifestyle and take care of their mental health, while still enjoying video games in a healthy way. You probably don't need this..." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "pamphlet" + item_state = "paper" + w_class = WEIGHT_CLASS_TINY + + #define ORION_TRAIL_WINTURN 9 //Orion Trail Events @@ -400,6 +411,16 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( var/gameStatus = ORION_STATUS_START var/canContinueEvent = 0 + var/obj/item/radio/Radio + var/static/list/gamers = list() + var/killed_crew = 0 + + +/obj/machinery/computer/arcade/orion_trail/Initialize() + . = ..() + Radio = new /obj/item/radio(src) + Radio.listening = 0 + /obj/machinery/computer/arcade/orion_trail/kobayashi name = "Kobayashi Maru control computer" desc = "A test for cadets" @@ -414,7 +435,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( stops = list("Pluto","Asteroid Belt","Proxima Centauri","Dead Space","Rigel Prime","Tau Ceti Beta","Black Hole","Space Outpost Beta-9","Orion Prime") stopblurbs = list( "Pluto, long since occupied with long-range sensors and scanners, stands ready to, and indeed continues to probe the far reaches of the galaxy.", - "At the edge of the Sol system lies a treacherous asteroid belt. Many have been crushed by stray asteroids and misguided judgement.", + "At the edge of the Sol system lies a treacherous asteroid belt. Many have been crushed by stray asteroids and misguided judgment.", "The nearest star system to Sol, in ages past it stood as a reminder of the boundaries of sub-light travel, now a low-population sanctuary for adventurers and traders.", "This region of space is particularly devoid of matter. Such low-density pockets are known to exist, but the vastness of it is astounding.", "Rigel Prime, the center of the Rigel system, burns hot, basking its planetary bodies in warmth and radiation.", @@ -441,12 +462,45 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( event = null gameStatus = ORION_STATUS_NORMAL lings_aboard = 0 + killed_crew = 0 //spaceport junk spaceport_raided = 0 spaceport_freebie = 0 last_spaceport_action = "" +/obj/machinery/computer/arcade/orion_trail/proc/report_player(mob/gamer) + if(gamers[gamer] == -2) + return // enough harassing them + + if(gamers[gamer] == -1) + say("WARNING: Continued antisocial behavior detected: Dispensing self-help literature.") + new /obj/item/gamer_pamphlet(get_turf(src)) + gamers[gamer]-- + return + + if(!(gamer in gamers)) + gamers[gamer] = 0 + + gamers[gamer]++ // How many times the player has 'prestiged' (massacred their crew) + + if(gamers[gamer] > 2 && prob(20 * gamers[gamer])) + + Radio.set_frequency(FREQ_SECURITY) + Radio.talk_into(src, "SECURITY ALERT: Crewmember [gamer] recorded displaying antisocial tendencies in [get_area(src)]. Please watch for violent behavior.", FREQ_SECURITY) + + Radio.set_frequency(FREQ_MEDICAL) + Radio.talk_into(src, "PSYCH ALERT: Crewmember [gamer] recorded displaying antisocial tendencies in [get_area(src)]. Please schedule psych evaluation.", FREQ_MEDICAL) + + gamers[gamer] = -1 + + if(!isnull(GLOB.data_core.general)) + for(var/datum/data/record/R in GLOB.data_core.general) + if(R.fields["name"] == gamer.name) + R.fields["m_stat"] = "*Unstable*" + return + + /obj/machinery/computer/arcade/orion_trail/ui_interact(mob/user) . = ..() if(fuel <= 0 || food <=0 || settlers.len == 0) @@ -570,16 +624,14 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( if(ORION_TRAIL_COLLISION) //by far the most damaging event if(prob(90)) playsound(loc, 'sound/effects/bang.ogg', 100, 1) - var/turf/open/floor/F - for(F in orange(1, src)) + for(var/turf/open/floor/F in RANGE_TURFS(1, src)) F.ScrapeAway() say("Something slams into the floor around [src], exposing it to space!") if(hull) sleep(10) say("A new floor suddenly appears around [src]. What the hell?") playsound(loc, 'sound/weapons/genhit.ogg', 100, 1) - var/turf/open/space/T - for(T in orange(1, src)) + for(var/turf/open/space/T in RANGE_TURFS(1, src)) T.PlaceOnTop(/turf/open/floor/plating) else say("Something slams into the floor around [src] - luckily, it didn't get through!") @@ -678,6 +730,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( if(gameStatus == ORION_STATUS_NORMAL || event == ORION_TRAIL_LING) var/sheriff = remove_crewmember() //I shot the sheriff playsound(loc,'sound/weapons/gunshot.ogg', 100, 1) + killed_crew++ if(settlers.len == 0 || alive == 0) say("The last crewmember [sheriff], shot themselves, GAME OVER!") @@ -686,6 +739,11 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( obj_flags &= EMAGGED gameStatus = ORION_STATUS_GAMEOVER event = null + + + if(killed_crew >= 4) + report_player(usr) + else if(obj_flags & EMAGGED) if(usr.name == sheriff) say("The crew of the ship chose to kill [usr.name]!") @@ -693,6 +751,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( if(event == ORION_TRAIL_LING) //only ends the ORION_TRAIL_LING event, since you can do this action in multiple places event = null + killed_crew-- // the kill was valid //Spaceport specific interactions //they get a header because most of them don't reset event (because it's a shop, you leave when you want to) @@ -705,6 +764,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( fuel -= 10 food -= 10 event() + killed_crew-- // I mean not really but you know else if(href_list["sellcrew"]) //sell a crewmember if(gameStatus == ORION_STATUS_MARKET) @@ -826,6 +886,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( if(ORION_TRAIL_OLDSHIP) eventdat += "
Your crew spots an old ship floating through space. It might have some supplies, but then again it looks rather unsafe." eventdat += "

Search itLeave it

Close

" + canContinueEvent = 1 if(ORION_TRAIL_SEARCH) switch(rand(100)) @@ -1125,6 +1186,10 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( newgame() obj_flags |= EMAGGED +/obj/machinery/computer/arcade/orion_trail/Destroy() + QDEL_NULL(Radio) + . = ..() + /mob/living/simple_animal/hostile/syndicate/ranged/smg/orion name = "spaceport security" desc = "Premier corporate security forces for all spaceports found along the Orion Trail." @@ -1183,23 +1248,51 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( if(!iscarbon(user)) return var/mob/living/carbon/c_user = user - if(!c_user.get_bodypart(BODY_ZONE_L_ARM) && !c_user.get_bodypart(BODY_ZONE_R_ARM)) - return - to_chat(c_user, "You move your hand towards the machine, and begin to hesitate as a bloodied guillotine emerges from inside of it...") - if(do_after(c_user, 50, target = src)) - to_chat(c_user, "The guillotine drops on your arm, and the machine sucks it in!") - playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - var/which_hand = BODY_ZONE_L_ARM - if(!(c_user.active_hand_index % 2)) - which_hand = BODY_ZONE_R_ARM - var/obj/item/bodypart/chopchop = c_user.get_bodypart(which_hand) - chopchop.dismember() - qdel(chopchop) - playsound(loc, 'sound/arcade/win.ogg', 50, 1, extrarange = -3, falloff = 10) - for(var/i=1; i<=rand(3,5); i++) - prizevend(user) + if(obj_flags & EMAGGED) + if(!c_user.get_bodypart(BODY_ZONE_L_ARM) && !c_user.get_bodypart(BODY_ZONE_R_ARM)) + return + to_chat(c_user, "You move your hand towards the machine, and begin to hesitate as an extra-bloodied guillotine emerges from inside of it...") + if(do_after(c_user, 50, target = src)) + to_chat(c_user, "Robotic arms shoot out of the machine, remove all your limbs, and suck them in!") + playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) + for(var/X in c_user.bodyparts) + var/obj/item/bodypart/BP = X + if(BP.body_part != HEAD && BP.body_part != CHEST) + if(BP.dismemberable) + BP.dismember() + qdel(BP) + playsound(loc, 'sound/arcade/win.ogg', 50, 1, extrarange = -3, falloff_exponent = 10) + for(var/i=1 to rand(20, 30)) + prizevend(user) + else + to_chat(c_user, "You (wisely) decide against putting your hand in the machine.") else - to_chat(c_user, "You (wisely) decide against putting your hand in the machine.") + if(!c_user.get_bodypart(BODY_ZONE_L_ARM) && !c_user.get_bodypart(BODY_ZONE_R_ARM)) + return + to_chat(c_user, "You move your hand towards the machine, and begin to hesitate as a bloodied guillotine emerges from inside of it...") + if(do_after(c_user, 50, target = src)) + to_chat(c_user, "The guillotine drops on your arm, and the machine sucks it in!") + playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) + var/which_hand = BODY_ZONE_L_ARM + if(!(c_user.active_hand_index % 2)) + which_hand = BODY_ZONE_R_ARM + var/obj/item/bodypart/chopchop = c_user.get_bodypart(which_hand) + chopchop.dismember() + qdel(chopchop) + playsound(loc, 'sound/arcade/win.ogg', 50, 1, extrarange = -3, falloff_exponent = 10) + for(var/i=1 to rand(3, 5)) + prizevend(user) + else + to_chat(c_user, "You (wisely) decide against putting your hand in the machine.") + + +/obj/machinery/computer/arcade/amputation/emag_act(mob/user) + if(obj_flags & EMAGGED) + return + to_chat(user, "You override the safety systems on the arcade machine.") + name = "Mediborg's Amputation Adventure: Deluxe Edition" + desc = "A picture of a blood-soaked medical cyborg flashes on the screen. The mediborg has glowing red eyes, and a speech bubble that says, \"Put your hand in the machine if you aren't a coward!\"" + obj_flags |= EMAGGED #undef ORION_TRAIL_WINTURN #undef ORION_TRAIL_RAIDERS diff --git a/code/game/machinery/computer/arena.dm b/code/game/machinery/computer/arena.dm index 9493957df2f8b..38d90d406236a 100644 --- a/code/game/machinery/computer/arena.dm +++ b/code/game/machinery/computer/arena.dm @@ -187,7 +187,7 @@ to_chat(user,"[ckey] removed from [team] team.") /obj/machinery/computer/arena/proc/spawn_member(obj/machinery/arena_spawn/spawnpoint,ckey,team) - var/mob/oldbody = get_mob_by_key(ckey) + var/mob/oldbody = get_mob_by_ckey(ckey) if(!isobserver(oldbody)) return var/mob/living/carbon/human/M = new/mob/living/carbon/human(get_turf(spawnpoint)) @@ -217,7 +217,7 @@ . = list() for(var/team in team_keys) for(var/key in team_keys[team]) - var/mob/M = get_mob_by_key(key) + var/mob/M = get_mob_by_ckey(key) if(M) . += M @@ -336,7 +336,7 @@ dat += "
    " for(var/ckey in team_keys[team]) var/player_status = "Not Present" - var/mob/M = get_mob_by_key(ckey) + var/mob/M = get_mob_by_ckey(ckey) if(M) //Should define waiting room upper/lower corner and check if they're there instead of generic live/dead check if(isobserver(M)) diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 454f459621bbd..60eeb51b1a79a 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -57,7 +57,8 @@ to_chat(usr, "Minor alarm for [zone] cleared.") minor_alarms -= zone . = TRUE - update_icon() + if(.) + update_icon() /obj/machinery/computer/atmos_alert/proc/set_frequency(new_frequency) SSradio.remove_object(src, receive_frequency) @@ -81,6 +82,7 @@ else if (severity == "minor") minor_alarms += zone update_icon() + ui_update() return /obj/machinery/computer/atmos_alert/update_icon() diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 0342825557dd2..548a2d69d3c18 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -63,7 +63,7 @@ var/total_moles = air_sample.total_moles() if(total_moles) for(var/gas_id in air_sample.get_gases()) - var/gas_name = GLOB.meta_gas_info[gas_id][META_GAS_NAME] + var/gas_name = GLOB.gas_data.names[gas_id] signal.data["gases"][gas_name] = air_sample.get_moles(gas_id) / total_moles * 100 radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) @@ -76,11 +76,11 @@ /obj/machinery/air_sensor/Initialize() . = ..() - SSair.atmos_machinery += src + SSair.atmos_air_machinery += src set_frequency(frequency) /obj/machinery/air_sensor/Destroy() - SSair.atmos_machinery -= src + SSair.atmos_air_machinery -= src SSradio.remove_object(src, frequency) return ..() @@ -137,6 +137,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) if(!ui) ui = new(user, src, "AtmosControlConsole") ui.open() + ui.set_autoupdate(TRUE) // Gas sensors /obj/machinery/computer/atmos_control/ui_data(mob/user) var/data = list() @@ -254,7 +255,16 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) /obj/machinery/computer/atmos_control/tank/proc/reconnect(mob/user) var/list/IO = list() var/datum/radio_frequency/freq = SSradio.return_frequency(frequency) - var/list/devices = freq.devices["_default"] + + var/list/devices = list() + var/list/device_refs = freq.devices["_default"] + for(var/datum/weakref/device_ref as anything in device_refs) + var/atom/device = device_ref.resolve() + if(!device) + device_refs -= device_ref + continue + devices += device + for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in devices) var/list/text = splittext(U.id_tag, "_") IO |= text[1] @@ -288,6 +298,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "AtmosControlConsole") + ui.set_autoupdate(TRUE) // Gas sensors ui.open() /obj/machinery/computer/atmos_control/tank/ui_data(mob/user) @@ -295,9 +306,10 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) data["tank"] = TRUE data["inputting"] = input_info ? input_info["power"] : FALSE data["inputRate"] = input_info ? input_info["volume_rate"] : 0 + data["maxInputRate"] = input_info ? MAX_TRANSFER_RATE : 0 data["outputting"] = output_info ? output_info["power"] : FALSE data["outputPressure"] = output_info ? output_info["internal"] : 0 - + data["maxOutputPressure"] = output_info ? MAX_OUTPUT_PRESSURE : 0 return data /obj/machinery/computer/atmos_control/tank/ui_act(action, params) @@ -323,7 +335,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) if("pressure") var/target = text2num(params["pressure"]) if(!isnull(target)) - target = clamp(target, 0, 4500) + 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/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index aae04e2ce3d59..858b72a208a15 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -132,7 +132,6 @@ ..() /obj/structure/frame/computer/AltClick(mob/user) - ..() if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index c485aeb0ee149..8485dfd09f4df 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -12,14 +12,16 @@ var/list/network = list("ss13") var/obj/machinery/camera/active_camera + /// The turf where the camera was last updated. + var/turf/last_camera_turf var/list/concurrent_users = list() var/long_ranged = FALSE // Stuff needed to render the map var/map_name - var/obj/screen/map_view/cam_screen - var/obj/screen/plane_master/lighting/cam_plane_master - var/obj/screen/background/cam_background + var/atom/movable/screen/map_view/cam_screen + var/atom/movable/screen/plane_master/lighting/cam_plane_master + var/atom/movable/screen/background/cam_background /obj/machinery/computer/security/Initialize() . = ..() @@ -64,9 +66,10 @@ /obj/machinery/computer/security/ui_interact(mob/user, datum/tgui/ui) // Update UI ui = SStgui.try_update_ui(user, src, ui) - // Show static if can't use the camera - if(!active_camera?.can_use()) - show_camera_static() + + // Update the camera, showing static if necessary and updating data if the location has moved. + update_active_camera_screen() + if(!ui) var/user_ref = REF(user) var/is_living = isliving(user) @@ -85,6 +88,7 @@ // Open UI ui = new(user, src, "CameraConsole") ui.open() + ui.set_autoupdate(FALSE) /obj/machinery/computer/security/ui_data() var/list/data = list() @@ -119,30 +123,52 @@ var/list/cameras = get_available_cameras() var/obj/machinery/camera/C = cameras[c_tag] active_camera = C + ui_update() playsound(src, get_sfx("terminal_type"), 25, FALSE) - // Show static if can't use the camera - if(!active_camera?.can_use()) - show_camera_static() + if(!C) return TRUE - var/list/visible_turfs = list() - for(var/turf/T in (C.isXRay() \ - ? range(C.view_range, C) \ - : view(C.view_range, get_turf(C)))) - visible_turfs += T + update_active_camera_screen() - var/list/bbox = get_bbox_of_atoms(visible_turfs) - var/size_x = bbox[3] - bbox[1] + 1 - var/size_y = bbox[4] - bbox[2] + 1 + return TRUE - cam_screen.vis_contents = visible_turfs - cam_background.icon_state = "clear" - cam_background.fill_rect(1, 1, size_x, size_y) +/obj/machinery/computer/security/proc/update_active_camera_screen() + // Show static if can't use the camera + if(!active_camera?.can_use()) + show_camera_static() + return - return TRUE + var/list/visible_turfs = list() -/obj/machinery/computer/security/ui_close(mob/user) + // Is this camera located in or attached to a living thing? If so, assume the camera's loc is the living thing. + var/atom/cam_location = isliving(active_camera.loc) ? active_camera.loc : active_camera + + // If we're not forcing an update for some reason and the cameras are in the same location, + // we don't need to update anything. + // Most security cameras will end here as they're not moving. + var/newturf = get_turf(cam_location) + if(last_camera_turf == newturf) + return + + // Cameras that get here are moving, and are likely attached to some moving atom such as cyborgs. + last_camera_turf = get_turf(cam_location) + + if(active_camera.isXRay()) + visible_turfs += RANGE_TURFS(active_camera.view_range, cam_location) + else + for(var/turf/T in view(active_camera.view_range, cam_location)) + visible_turfs += T + + var/list/bbox = get_bbox_of_atoms(visible_turfs) + var/size_x = bbox[3] - bbox[1] + 1 + var/size_y = bbox[4] - bbox[2] + 1 + + cam_screen.vis_contents = visible_turfs + cam_background.icon_state = "clear" + cam_background.fill_rect(1, 1, size_x, size_y) + +/obj/machinery/computer/security/ui_close(mob/user, datum/tgui/tgui) var/user_ref = REF(user) var/is_living = isliving(user) // Living creature or not, we remove you anyway. @@ -164,7 +190,7 @@ /obj/machinery/computer/security/proc/get_available_cameras() var/list/L = list() for (var/obj/machinery/camera/C in GLOB.cameranet.cameras) - if((is_away_level(z) || is_away_level(C.z)) && (C.z != z))//if on away mission, can only receive feed from same z_level cameras + if((is_away_level(z) || is_away_level(C.z)) && (C.get_virtual_z_level() != get_virtual_z_level()))//if on away mission, can only receive feed from same z_level cameras continue L.Add(C) var/list/D = list() @@ -189,6 +215,7 @@ icon_keyboard = "no_keyboard" icon_screen = "detective_tv" clockwork = TRUE //it'd look weird + broken_overlay_emissive = TRUE pass_flags = PASSTABLE /obj/machinery/computer/security/mining @@ -235,6 +262,7 @@ density = FALSE circuit = null clockwork = TRUE //it'd look very weird + broken_overlay_emissive = TRUE light_power = 0 /obj/machinery/computer/security/telescreen/update_icon() @@ -252,16 +280,15 @@ density = FALSE circuit = null long_ranged = TRUE - interaction_flags_atom = NONE // interact() is called by BigClick() var/icon_state_off = "entertainment_blank" var/icon_state_on = "entertainment" -/obj/machinery/computer/security/telescreen/entertainment/Initialize() - . = ..() - RegisterSignal(src, COMSIG_CLICK, .proc/BigClick) +//Can use this telescreen at long range. +/obj/machinery/computer/security/telescreen/entertainment/ui_state(mob/user) + return GLOB.not_incapacitated_state -// Bypass clickchain to allow humans to use the telescreen from a distance -/obj/machinery/computer/security/telescreen/entertainment/proc/BigClick() +/obj/machinery/computer/security/telescreen/entertainment/examine(mob/user) + . = ..() interact(usr) /obj/machinery/computer/security/telescreen/entertainment/proc/notify(on) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 7bfdb568b64b7..995ac321dd657 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -5,7 +5,7 @@ icon_keyboard = "security_key" var/list/z_lock = list() // Lock use to these z levels var/lock_override = NONE - var/mob/camera/aiEye/remote/eyeobj + var/mob/camera/ai_eye/remote/eyeobj var/mob/living/current_user = null var/list/networks = list("ss13") var/datum/action/innate/camera_off/off_action = new @@ -80,11 +80,10 @@ user.unset_machine() /obj/machinery/computer/camera_advanced/Destroy() - if(current_user) - current_user.unset_machine() if(eyeobj) - qdel(eyeobj) + QDEL_NULL(eyeobj) QDEL_LIST(actions) + current_user = null return ..() /obj/machinery/computer/camera_advanced/on_unset_machine(mob/M) @@ -161,7 +160,7 @@ if(should_supress_view_changes ) user.client.view_size.supress() -/mob/camera/aiEye/remote +/mob/camera/ai_eye/remote name = "Inactive Camera Eye" ai_detector_visible = FALSE var/sprint = 10 @@ -173,25 +172,25 @@ var/visible_icon = 0 var/image/user_image = null -/mob/camera/aiEye/remote/update_remote_sight(mob/living/user) +/mob/camera/ai_eye/remote/update_remote_sight(mob/living/user) user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras user.sight = SEE_TURFS | SEE_BLACKNESS user.see_in_dark = 2 return 1 -/mob/camera/aiEye/remote/Destroy() +/mob/camera/ai_eye/remote/Destroy() if(origin && eye_user) origin.remove_eye_control(eye_user,src) origin = null . = ..() eye_user = null -/mob/camera/aiEye/remote/GetViewerClient() +/mob/camera/ai_eye/remote/GetViewerClient() if(eye_user) return eye_user.client return null -/mob/camera/aiEye/remote/setLoc(T) +/mob/camera/ai_eye/remote/setLoc(T) if(eye_user) T = get_turf(T) if (T) @@ -207,7 +206,7 @@ user_image = image(icon,loc,icon_state,FLY_LAYER) eye_user.client.images += user_image -/mob/camera/aiEye/remote/relaymove(mob/user,direct) +/mob/camera/ai_eye/remote/relaymove(mob/user,direct) var/initial = initial(sprint) var/max_sprint = 50 @@ -234,7 +233,7 @@ if(!target || !isliving(target)) return var/mob/living/C = target - var/mob/camera/aiEye/remote/remote_eye = C.remote_control + var/mob/camera/ai_eye/remote/remote_eye = C.remote_control var/obj/machinery/computer/camera_advanced/console = remote_eye.origin console.remove_eye_control(target) @@ -247,7 +246,7 @@ if(!target || !isliving(target)) return var/mob/living/C = target - var/mob/camera/aiEye/remote/remote_eye = C.remote_control + var/mob/camera/ai_eye/remote/remote_eye = C.remote_control var/obj/machinery/computer/camera_advanced/origin = remote_eye.origin var/list/L = list() @@ -273,7 +272,7 @@ if(final) playsound(origin, 'sound/machines/terminal_prompt_confirm.ogg', 25, 0) remote_eye.setLoc(get_turf(final)) - C.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static) + C.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash/static) C.clear_fullscreen("flash", 3) //Shorter flash than normal since it's an ~~advanced~~ console! else playsound(origin, 'sound/machines/terminal_prompt_deny.ogg', 25, 0) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index f65ea0d01a2e6..63ab5004691f1 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -307,6 +307,21 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) var/list/alljobs = list("Unassigned") alljobs += (istype(src, /obj/machinery/computer/card/centcom)? get_all_centcom_jobs() : get_all_jobs()) + "Custom" for(var/job in alljobs) + if(job == "Assistant") + jobs_all += "
    * Service: " + if(job == "Quartermaster") + jobs_all += "
    * Cargo: " + if(job == "Chief Engineer") + jobs_all += "
    * Engineering: " + if(job == "Research Director") + jobs_all += "
    * R&D: " + if(job == "Chief Medical Officer") + jobs_all += "
    * Medical: " + if(job == "Head of Security") + jobs_all += "
    * Security: " + if(job == "Custom") + jobs_all += "
    " + // these will make some separation for the department. jobs_all += "[replacetext(job, " ", " ")] " //make sure there isn't a line break in the middle of a job diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 7dad9e8daafe6..8bcc79616e3f7 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -8,11 +8,14 @@ circuit = /obj/item/circuitboard/computer/cloning req_access = list(ACCESS_GENETICS) //for modifying records var/obj/machinery/dna_scannernew/scanner //Linked scanner. For scanning. + var/clonepod_type = /obj/machinery/clonepod var/list/pods //Linked cloning pods var/temp = "Inactive" var/scantemp_ckey - var/scantemp = "Ready to Scan" + var/scantemp_name + var/scantemp = "Inactive" var/menu = 1 //Which menu screen to display + var/use_records = TRUE //set this to false if you don't want the console to use records var/list/records = list() var/datum/data/record/active_record var/obj/item/disk/data/diskette //Incompatible format to genetics machine @@ -62,8 +65,8 @@ else if(!. && pod.is_operational() && !(pod.occupant || pod.mess) && pod.efficiency > 5) . = pod -/proc/grow_clone_from_record(obj/machinery/clonepod/pod, datum/data/record/R, empty) - return pod.growclone(R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mindref"], R.fields["last_death"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"], R.fields["bank_account"], R.fields["traumas"], empty) +/proc/grow_clone_from_record(obj/machinery/clonepod/pod, datum/data/record/R) + return pod.growclone(R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mindref"], R.fields["last_death"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"], R.fields["bank_account"], R.fields["traumas"], R.fields["body_only"]) /obj/machinery/computer/cloning/process() if(!(scanner && LAZYLEN(pods) && autoprocess)) @@ -71,6 +74,7 @@ if(scanner.occupant && scanner.scan_level > 2) scan_occupant(scanner.occupant) + ui_update() for(var/datum/data/record/R in records) var/obj/machinery/clonepod/pod = GetAvailableEfficientPod(R.fields["mindref"]) @@ -83,14 +87,32 @@ var/result = grow_clone_from_record(pod, R) if(result & CLONING_SUCCESS) - temp = "[R.fields["name"]] => Cloning cycle in progress..." + temp = "[R.fields["name"]] => Cloning cycle in progress..." log_cloning("Cloning of [key_name(R.fields["mindref"])] automatically started via autoprocess - [src] at [AREACOORD(src)]. Pod: [pod] at [AREACOORD(pod)].") + SStgui.update_uis(src) if(result & CLONING_DELETE_RECORD) records -= R + ui_update() +/obj/machinery/computer/cloning/proc/connect_scanner(obj/machinery/dna_scannernew/new_scanner) + if(scanner) + UnregisterSignal(scanner, COMSIG_MACHINE_OPEN) + UnregisterSignal(scanner, COMSIG_MACHINE_CLOSE) + + if(new_scanner) + RegisterSignal(new_scanner, COMSIG_MACHINE_OPEN, .proc/scanner_ui_update) + RegisterSignal(new_scanner, COMSIG_MACHINE_CLOSE, .proc/scanner_ui_update) + + scanner = new_scanner + +/obj/machinery/computer/cloning/proc/scanner_ui_update() + SIGNAL_HANDLER + ui_update() + /obj/machinery/computer/cloning/proc/updatemodules(findfirstcloner) - scanner = findscanner() + if(QDELETED(scanner)) + connect_scanner(findscanner()) if(findfirstcloner && !LAZYLEN(pods)) findcloner() if(!autoprocess) @@ -119,7 +141,7 @@ for(var/direction in GLOB.cardinals) - podf = locate(/obj/machinery/clonepod, get_step(src, direction)) + podf = locate(clonepod_type, get_step(src, direction)) if (!isnull(podf) && podf.is_operational()) AttachCloner(podf) @@ -140,7 +162,6 @@ diskette = W to_chat(user, "You insert [W].") playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - updateUsrDialog() else if(W.tool_behaviour == TOOL_MULTITOOL) if(!multitool_check_buffer(user, W)) return @@ -163,366 +184,342 @@ else return ..() -/obj/machinery/computer/cloning/ui_interact(mob/user) +/obj/machinery/computer/cloning/AltClick(mob/user) . = ..() - - updatemodules(TRUE) - - var/dat = "" - dat += "Refresh" - - if(scanner && HasEfficientPod() && scanner.scan_level >= AUTOCLONING_MINIMAL_LEVEL) - if(!autoprocess) - dat += "Autoprocess" + EjectDisk(user) + +/obj/machinery/computer/cloning/proc/EjectDisk(mob/user) + if(diskette) + scantemp = "Disk Ejected" + diskette.forceMove(drop_location()) + usr.put_in_active_hand(diskette) + diskette = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) + . = TRUE + +/obj/machinery/computer/cloning/proc/Save(mob/user, target) + var/datum/data/record/GRAB = null + for(var/datum/data/record/record in records) + if(record.fields["id"] == target) + GRAB = record + break else - dat += "Stop autoprocess" - else - dat += "Autoprocess" - dat += "

    Cloning Pod Status

    " - dat += "
    [temp] 
    " - switch(menu) - if(1) - // Modules - if (isnull(scanner) || !LAZYLEN(pods)) - dat += "

    Modules

    " - //dat += "Reload Modules" - if (isnull(scanner)) - dat += "ERROR: No Scanner detected!
    " - if (!LAZYLEN(pods)) - dat += "ERROR: No Pod detected
    " - - // Scanner - if (!isnull(scanner)) - var/mob/living/scanner_occupant = get_mob_or_brainmob(scanner.occupant) - - dat += "

    Scanner Functions

    " - - dat += "
    " - if(!scanner_occupant) - dat += "Scanner Unoccupied" - else if(loading) - dat += "[scanner_occupant] => Scanning..." - else - if(scanner_occupant.ckey != scantemp_ckey) - scantemp = "Ready to Scan" - scantemp_ckey = scanner_occupant.ckey - dat += "[scanner_occupant] => [scantemp]" - dat += "
    " - - if(scanner_occupant) - dat += "Start Scan" - dat += "Body-Only Scan" - dat += "
    [scanner.locked ? "Unlock Scanner" : "Lock Scanner"]" - else - dat += "Start Scan" - - // Database - dat += "

    Database Functions

    " - if (records.len && records.len > 0) - dat += "View Records ([records.len])
    " - else - dat += "View Records (0)
    " - if (diskette) - dat += "Eject Disk
    " + continue + if(!GRAB || !GRAB.fields) + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + scantemp = "Failed saving to disk: Data Corruption" + return FALSE + if(!diskette || diskette.read_only) + scantemp = !diskette ? "Failed saving to disk: No disk." : "Failed saving to disk: Disk refuses override attempt." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + return + diskette.fields = GRAB.fields.Copy() + diskette.name = "data disk - '[src.diskette.fields["name"]]'" + scantemp = "Saved to disk successfully." + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + return TRUE + +/obj/machinery/computer/cloning/proc/DeleteRecord(mob/user, target) + var/datum/data/record/GRAB = null + for(var/datum/data/record/record in records) + if(record.fields["id"] == target) + GRAB = record + break + else + continue + if(!GRAB) + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + scantemp = "Cannot delete: Data Corrupted." + return FALSE + var/obj/item/card/id/C = usr.get_idcard(hand_first = TRUE) + if(istype(C) || istype(C, /obj/item/pda) || istype(C, /obj/item/modular_computer/tablet)) + if(check_access(C)) + scantemp = "[GRAB.fields["name"]] => Record deleted." + records.Remove(GRAB) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + var/obj/item/circuitboard/computer/cloning/board = circuit + board.records = records + return TRUE + scantemp = "Cannot delete: Access Denied." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + +/obj/machinery/computer/cloning/proc/Load(mob/user) + if(!diskette || !istype(diskette.fields) || !diskette.fields["name"] || !diskette.fields) + scantemp = "Failed loading: Load error." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + return + for(var/datum/data/record/R in records) + if(R.fields["key"] == diskette.fields["key"]) + scantemp = "Failed loading: Data already exists!" + return FALSE + var/datum/data/record/R = new(src) + for(var/key in diskette.fields) + R.fields[key] = diskette.fields[key] + records += R + scantemp = "Loaded into internal storage successfully." + var/obj/item/circuitboard/computer/cloning/board = circuit + board.records = records + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + return TRUE + +/obj/machinery/computer/cloning/proc/Clone(mob/user, target) + var/datum/data/record/C = find_record("id", target, records) + //Look for that player! They better be dead! + if(C) + var/obj/machinery/clonepod/pod = GetAvailablePod() + //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. + if(!LAZYLEN(pods)) + temp = "Error: No Clonepods detected." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else if(!pod) + temp = "Error: No Clonepods available." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else if(!CONFIG_GET(flag/revival_cloning)) + temp = "Error: Unable to initiate cloning cycle." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else if(pod.occupant) + temp = "Warning: Cloning cycle already in progress." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else if(pod.growclone(C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mindref"], C.fields["last_death"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["quirks"], C.fields["bank_account"], C.fields["traumas"], C.fields["body_only"])) + temp = "Notice: [C.fields["name"]] => Cloning cycle in progress..." + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + if(!C.fields["body_only"]) + records.Remove(C) + . = TRUE + else + temp = "Error: [C.fields["name"]] => Initialisation failure." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else + temp = "Failed to clone: Data corrupted." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) +/obj/machinery/computer/cloning/proc/Toggle_lock(mob/user) + if(!scanner.is_operational()) + return + if(!scanner.locked && !scanner.occupant) //I figured out that if you're fast enough, you can lock an open pod + return + scanner.locked = !scanner.locked + playsound(src, scanner.locked ? 'sound/machines/terminal_prompt_deny.ogg' : 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + . = TRUE - if(2) - dat += "

    Current records

    " - dat += "<< Back

    " +/obj/machinery/computer/cloning/proc/Scan(mob/user, body_only = FALSE) + if(!scanner.is_operational() || !scanner.occupant) + return + scantemp = "[scantemp_name] => Scanning..." + loading = TRUE + playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) + say("Initiating scan...") + var/prev_locked = scanner.locked + scanner.locked = TRUE + addtimer(CALLBACK(src, .proc/finish_scan, scanner.occupant, user, prev_locked, body_only), 2 SECONDS) + . = TRUE + +/obj/machinery/computer/cloning/proc/Toggle_autoprocess(mob/user) + if(!scanner || !HasEfficientPod() || scanner.scan_level < AUTOCLONING_MINIMAL_LEVEL) + return FALSE + autoprocess = !autoprocess + if(autoprocess) + START_PROCESSING(SSmachines, src) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + else + STOP_PROCESSING(SSmachines, src) + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + . = TRUE + +/obj/machinery/computer/cloning/ui_data(mob/user) + var/list/data = list() + data["useRecords"] = use_records + var/list/records_to_send = list() + if(use_records) + if(scanner && HasEfficientPod() && scanner.scan_level >= AUTOCLONING_MINIMAL_LEVEL) + data["hasAutoprocess"] = TRUE + if(length(records)) for(var/datum/data/record/R in records) - dat += "

    [R.fields["name"]]

    Scan ID [R.fields["id"]] View Record" - if(3) - dat += "

    Selected Record

    " - dat += "<< Back
    " - - if (!active_record) - dat += "Record not found." - else - var/body_only = active_record.fields["body_only"] - dat += "

    [active_record.fields["name"]][body_only ? " - BODY-ONLY" : ""]

    " - dat += "Scan ID [active_record.fields["id"]] \ - [!body_only ? "Clone" : "" ]\ - Empty Clone
    " - - var/obj/item/implant/health/H = locate(active_record.fields["imp"]) - - if ((H) && (istype(H))) - dat += "Health Implant Data:
    [H.sensehealth()]

    " + var/list/record_entry = list() + record_entry["name"] = "[R.fields["name"]]" + record_entry["id"] = "[R.fields["id"]]" + var/obj/item/implant/health/H = locate(R.fields["imp"]) + if(H && istype(H)) + record_entry["damages"] = H.sensehealth(TRUE) else - dat += "Unable to locate Health Implant.

    " - - dat += "Unique Identifier:
    [active_record.fields["UI"]]
    " - dat += "Structural Enzymes:
    " - for(var/key in active_record.fields["SE"]) - if(key != RACEMUT) - var/val = active_record.fields["SE"][key] - var/alias = GLOB.all_mutations[key].alias - dat +="[alias]: [val]
    " - - dat += "

    " - - if(diskette?.fields) - dat += "
    " - dat += "

    Inserted Disk

    " - dat += "Contents: " - var/list/L = list() - if(diskette.fields["UI"]) - L += "Unique Identifier" - if(diskette.fields["UE"] && diskette.fields["name"] && diskette.fields["blood_type"]) - L += "Unique Enzymes" - if(diskette.fields["SE"]) - L += "Structural Enzymes" - dat += english_list(L, "Empty", " + ", " + ") - var/can_load = FALSE - var/obj/item/card/id/C = user.get_idcard(TRUE) - if(C) - if(check_access(C)) - can_load = TRUE - if(can_load) - dat += "
    Load From Disk" - else - dat += "Cannot Load From Disk: Access Denied" - if(diskette.fields["SE"]) - if(!include_se) - dat += "
    Currently Excluding SE" - else - dat += "
    Currently Including SE" - if(diskette.fields["UI"]) - if(!include_ui) - dat += "
    Currently Excluding UI" - else - dat += "
    Currently Including UI" - if(diskette.fields["UE"]) - if(!include_ue) - dat += "
    Currently Excluding UE" - else - dat += "
    Currently Including UE" - - - dat += "
    Save to Disk" - dat += "
    " - - dat += "Delete Record" - - if(4) - if (!active_record) - menu = 2 - ui_interact(user) - return - dat += "Please confirm.
    " - dat += "Cancel" - - var/datum/browser/popup = new(user, "cloning", "Cloning System Control") - popup.set_content(dat) - popup.open() - -/obj/machinery/computer/cloning/Topic(href, href_list) + record_entry["damages"] = FALSE + record_entry["UI"] = "[R.fields["UI"]]" + record_entry["UE"] = "[R.fields["UE"]]" + record_entry["blood_type"] = "[R.fields["blood_type"]]" + record_entry["body_only"] = "[R.fields["body_only"]]" + records_to_send += list(record_entry) + data["records"] = records_to_send + else + data["records"] = list() + if(diskette && diskette.fields) + var/list/disk_data = list() + disk_data["name"] = "[diskette.fields["name"]]" + disk_data["id"] = "[diskette.fields["id"]]" + disk_data["UI"] = "[diskette.fields["UI"]]" + disk_data["UE"] = "[diskette.fields["UE"]]" + disk_data["blood_type"] = "[diskette.fields["blood_type"]]" + data["diskData"] = disk_data + else + data["diskData"] = list() + else + data["hasAutoprocess"] = FALSE + data["autoprocess"] = autoprocess + var/list/lack_machine = list() + if(isnull(src.scanner)) + lack_machine += "ERROR: No Scanner Detected!" + if(!LAZYLEN(pods)) + lack_machine += "ERROR: No Pod Detected!" + data["lacksMachine"] = lack_machine + data["temp"] = temp + var/build_temp = null + var/mob/living/scanner_occupant = get_mob_or_brainmob(scanner?.occupant) + if(scanner_occupant?.ckey != scantemp_ckey || scanner_occupant?.name != scantemp_name) + if(use_records) + build_temp = "Ready to Scan" + scantemp_ckey = scanner_occupant?.ckey + scantemp_name = scanner_occupant?.name + else + build_temp = "Ready to Clone" + scantemp = "[scanner_occupant] => [build_temp]" + data["scanTemp"] = scantemp + data["scannerLocked"] = scanner?.locked + data["hasOccupant"] = scanner?.occupant + data["recordsLength"] = "View Records ([length(records)])" + return data + +/obj/machinery/computer/cloning/ui_act(action, params) if(..()) return - if(loading) + // Return TRUE on almost every operation, since operations write to temp and scantemp to display failure messages + + switch(action) + if("toggle_autoprocess") + . = Toggle_autoprocess(usr) + if("scan") + Scan(usr, FALSE) + . = TRUE + if("scan_body_only") + Scan(usr, TRUE) + . = TRUE + if("toggle_lock") + . = Toggle_lock(usr) + if("clone") + Clone(usr, params["target"]) + . = TRUE + if("delrecord") + DeleteRecord(usr, params["target"]) + . = TRUE + if("save") + Save(usr, params["target"]) + . = TRUE + if("load") + Load(usr) + . = TRUE + if("eject") + . = EjectDisk(usr) + +/obj/machinery/computer/cloning/ui_interact(mob/user, datum/tgui/ui) + updatemodules(TRUE) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "CloningConsole", "Cloning System Control") + ui.open() + ui.set_autoupdate(TRUE) + +/obj/machinery/computer/cloning/proc/finish_scan(mob/living/L, mob/user, prev_locked, body_only) + if(!scanner || !L) return + src.add_fingerprint(usr) + if(use_records) + scan_occupant(L, user, body_only) + else + clone_occupant(L, user) - if(href_list["task"]) - switch(href_list["task"]) - if("autoprocess") - if(scanner && HasEfficientPod() && scanner.scan_level >= AUTOCLONING_MINIMAL_LEVEL) - autoprocess = TRUE - START_PROCESSING(SSmachines, src) - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) - if("stopautoprocess") - autoprocess = FALSE - STOP_PROCESSING(SSmachines, src) - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - if("include_se") - include_se = TRUE - if("exclude_se") - include_se = FALSE - if("include_ui") - include_ui = TRUE - if("exclude_ui") - include_ui = FALSE - if("include_ue") - include_ue = TRUE - if("exclude_ue") - include_ue = FALSE - - else if ((href_list["scan"]) && !isnull(scanner) && scanner.is_operational()) - scantemp = "" - var/body_only = href_list["body_only"] - loading = TRUE - updateUsrDialog() - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) - say("Initiating scan...") - - spawn(20) - scan_occupant(scanner.occupant, usr, body_only) - - loading = FALSE - updateUsrDialog() - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + loading = FALSE + scanner.locked = prev_locked + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + SStgui.update_uis(src) // Immediate since it's not spammable +//Used by consoles without records +/obj/machinery/computer/cloning/proc/clone_occupant(occupant, mob/user) + var/mob/living/mob_occupant = get_mob_or_brainmob(occupant) + var/datum/dna/dna + if(ishuman(mob_occupant)) + var/mob/living/carbon/C = mob_occupant + dna = C.has_dna() + if(isbrain(mob_occupant)) + var/mob/living/brain/B = mob_occupant + dna = B.stored_dna + if(!can_scan(dna, mob_occupant, TRUE)) + return + var/clone_species + if(dna.species) + clone_species = dna.species + else + var/datum/species/rando_race = pick(GLOB.roundstart_races) + clone_species = rando_race.type + var/obj/machinery/clonepod/pod = GetAvailablePod() + //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. + if(!LAZYLEN(pods)) + temp = "No Clonepods detected." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else if(!pod) + temp = "No Clonepods available." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else if(pod.occupant) + temp = "Cloning cycle already in progress." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else + pod.growclone(mob_occupant.real_name, dna.uni_identity, dna.mutation_index, null, null, clone_species, dna.blood_type, mob_occupant.faction) + temp = "[mob_occupant.real_name] => Cloning data sent to pod." + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + log_cloning("[user ? key_name(user) : "Unknown"] cloned [key_name(mob_occupant)] with [src] at [AREACOORD(src)].") - //No locking an open scanner. - else if ((href_list["lock"]) && !isnull(scanner) && scanner.is_operational()) - if ((!scanner.locked) && (scanner.occupant)) - scanner.locked = TRUE +/obj/machinery/computer/cloning/proc/can_scan(datum/dna/dna, mob/living/mob_occupant, experimental = FALSE, datum/bank_account/account, body_only) + if(!istype(dna)) + scantemp = "Unable to locate valid genetic data." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + return FALSE + if(NO_DNA_COPY in dna.species.species_traits) + scantemp = "The DNA of this lifeform could not be read due to an unknown error!" + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + return FALSE + if((HAS_TRAIT(mob_occupant, TRAIT_HUSK)) && (src.scanner.scan_level < 2)) + scantemp = "Subject's body is too damaged to scan properly." + playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0) + return FALSE + if(HAS_TRAIT(mob_occupant, TRAIT_BADDNA)) + scantemp = "Subject's DNA is damaged beyond any hope of recovery." + playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0) + return FALSE + if(!experimental) + if(!body_only && (mob_occupant.suiciding || mob_occupant.hellbound)) + scantemp = "Subject's brain is not responding to scanning stimuli." playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - else - scanner.locked = FALSE - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) - - else if(href_list["view_rec"]) - playsound(src, "terminal_type", 25, 0) - active_record = find_record("id", href_list["view_rec"], records) - if(active_record) - menu = 3 - else - temp = "Record missing." - - else if (href_list["del_rec"]) - if ((!active_record) || (menu < 3)) - return - if (menu == 3) //If we are viewing a record, confirm deletion - var/has_access = FALSE - if(ishuman(usr)) - var/mob/living/carbon/human/user = usr - var/obj/item/card/id/C = user.get_idcard(TRUE) - if(C) - if(check_access(C)) - has_access = TRUE - if(active_record.fields["body_only"]) //Body-only scans are not as important and can be deleted freely - has_access = TRUE - if(has_access) - temp = "Delete record?" - menu = 4 - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) - else - temp = "Access Denied" - menu = 2 - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - - - else if (menu == 4) - log_cloning("[key_name(usr)] deleted [key_name(active_record.fields["mindref"])]'s cloning records from [src] at [AREACOORD(src)].") - temp = "[active_record.fields["name"]] => Record deleted." - records.Remove(active_record) - active_record = null - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) - menu = 2 - - else if (href_list["disk"]) //Load or eject. - switch(href_list["disk"]) - if("load") - - - if (!diskette || !istype(diskette.fields)) - temp = "Load error." - updateUsrDialog() - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - return - if (!active_record) - temp = "Record error." - menu = 1 - updateUsrDialog() - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - return - - if(include_ue) - overwrite_field_if_available(active_record, diskette, "UE") - overwrite_field_if_available(active_record, diskette, "name") - overwrite_field_if_available(active_record, diskette, "blood_type") - if(include_ui) - overwrite_field_if_available(active_record, diskette, "UI") - if(include_se) - overwrite_field_if_available(active_record, diskette, "SE") - - log_cloning("[key_name(usr)] uploaded [key_name(active_record.fields["mindref"])]'s cloning records to [src] at [AREACOORD(src)] via [diskette].") - temp = "Load successful." - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) - - if("eject") - if(diskette) - diskette.forceMove(drop_location()) - diskette = null - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - if("save") - if(!diskette || diskette.read_only || !active_record || !active_record.fields) - temp = "Save error." - updateUsrDialog() - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - return - - log_cloning("[key_name(usr)] added [key_name(active_record.fields["mindref"])]'s cloning records to [diskette] via [src] at [AREACOORD(src)].") - diskette.fields = active_record.fields.Copy() - diskette.name = "data disk - '[diskette.fields["name"]]'" - temp = "Save successful." - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) - - else if (href_list["refresh"]) - updateUsrDialog() - playsound(src, "terminal_type", 25, 0) - - else if (href_list["clone"]) - var/datum/data/record/C = find_record("id", href_list["clone"], records) - var/empty = href_list["empty"] - //Look for that player! They better be dead! - if(C) - if(C.fields["body_only"] && !empty) - temp = "Cannot initiate regular cloning with body-only scans." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - var/obj/machinery/clonepod/pod = GetAvailablePod() - var/success = FALSE - //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. - if(!LAZYLEN(pods)) - temp = "No Clonepods detected." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - else if(!pod) - temp = "No Clonepods available." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - else if(!CONFIG_GET(flag/revival_cloning) && !empty) - temp = "Unable to initiate cloning cycle." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - else if(pod.occupant) - temp = "Cloning cycle already in progress." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - else - var/result = grow_clone_from_record(pod, C, empty) - if(result & CLONING_SUCCESS) - temp = "[C.fields["name"]] => Cloning cycle in progress..." - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) - if(active_record == C) - active_record = null - menu = 1 - success = TRUE - if(!empty) - log_cloning("[key_name(usr)] initiated cloning of [key_name(C.fields["mindref"])] via [src] at [AREACOORD(src)]. Pod: [pod] at [AREACOORD(pod)].") - else - log_cloning("[key_name(usr)] initiated EMPTY cloning of [key_name(C.fields["mindref"])] via [src] at [AREACOORD(src)]. Pod: [pod] at [AREACOORD(pod)].") - if(result & CLONING_DELETE_RECORD) - if(active_record == C) - active_record = null - menu = 1 - records -= C - - if(!success) - temp = "[C.fields["name"]] => Initialisation failure." + return FALSE + if(!body_only && isnull(mob_occupant.mind)) + scantemp = "Mental interface failure." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + return FALSE + if(!body_only && SSeconomy.full_ancap) + if(!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) - - else - temp = "Data corruption." + return FALSE + else + if(mob_occupant.suiciding) + scantemp = "Subject's brain is not responding to scanning stimuli." playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + return FALSE + if(!mob_occupant.mind) + scantemp = "Mental interface failure." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + return FALSE + return TRUE - else if (href_list["menu"]) - menu = text2num(href_list["menu"]) - playsound(src, "terminal_type", 25, 0) - - add_fingerprint(usr) - updateUsrDialog() - return - -/obj/machinery/computer/cloning/proc/scan_occupant(occupant, mob/M, body_only) +/obj/machinery/computer/cloning/proc/scan_occupant(occupant, mob/user, body_only) var/mob/living/mob_occupant = get_mob_or_brainmob(occupant) var/datum/dna/dna var/datum/bank_account/has_bank_account @@ -539,36 +536,9 @@ if(isbrain(mob_occupant)) dna = B.stored_dna - - if(!istype(dna)) - scantemp = "Unable to locate valid genetic data." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - return - if(NO_DNA_COPY in dna.species.species_traits) - scantemp = "The DNA of this lifeform could not be read due to an unknown error!" - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - return - if(!body_only && (mob_occupant.suiciding || mob_occupant.hellbound)) - scantemp = "Subject's brain is not responding to scanning stimuli." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + if(!can_scan(dna, mob_occupant, FALSE, has_bank_account, body_only)) return - if((HAS_TRAIT(mob_occupant, TRAIT_HUSK)) && (src.scanner.scan_level < 2)) - scantemp = "Subject's body is too damaged to scan properly." - playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0) - return - if(HAS_TRAIT(mob_occupant, TRAIT_BADDNA)) - scantemp = "Subject's DNA is damaged beyond any hope of recovery." - playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0) - return - if (!body_only && isnull(mob_occupant.mind)) - scantemp = "Mental interface failure." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - return - if(!body_only && SSeconomy.full_ancap) - if(!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 @@ -601,7 +571,7 @@ R.fields["bank_account"] = has_bank_account R.fields["mindref"] = "[REF(mob_occupant.mind)]" - R.fields["last_death"] = mob_occupant.stat == DEAD ? mob_occupant.mind.last_death : -1 + R.fields["last_death"] = (mob_occupant.stat == DEAD && mob_occupant.mind) ? mob_occupant.mind.last_death : -1 R.fields["body_only"] = body_only if(!body_only) @@ -626,5 +596,15 @@ else scantemp = "Subject successfully scanned." records += R - log_cloning("[M ? key_name(M) : "Autoprocess"] added the [body_only ? "body-only " : ""]record of [key_name(mob_occupant)] to [src] at [AREACOORD(src)].") + log_cloning("[user ? key_name(user) : "Autoprocess"] added the [body_only ? "body-only " : ""]record of [key_name(mob_occupant)] to [src] at [AREACOORD(src)].") playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50) + +//Prototype cloning console, much more rudimental and lacks modern functions such as saving records, autocloning, or safety checks. +/obj/machinery/computer/cloning/prototype + name = "prototype cloning console" + desc = "Used to operate an experimental cloner." + icon_screen = "dna" + icon_keyboard = "med_key" + circuit = /obj/item/circuitboard/computer/cloning/prototype + clonepod_type = /obj/machinery/clonepod/experimental + use_records = FALSE //Wait, so you tell me it lacks records but you never set it as false? diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index b1809cd7f2cfd..58fe97af97d70 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -49,7 +49,7 @@ return if(!usr.canUseTopic(src, !issilicon(usr))) return - if(!is_station_level(z) && !is_reserved_level(z)) //Can only use in transit and on SS13 + if(!is_station_level(z) && !is_reserved_level(z) && !is_centcom_level(z)) //Can only use in transit, on Central Command and on SS13 to_chat(usr, "Unable to establish a connection: \black You're too far away from the station!") return usr.set_machine(src) @@ -134,12 +134,12 @@ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) return var/input = stripped_multiline_input(usr, "Please choose a message to transmit to allied stations. Please be aware that this process is very expensive, and abuse will lead to... termination.", "Send a message to an allied station.", "") - if(!input || !(usr in view(1,src)) || !checkCCcooldown()) + if(!input || get_dist(usr, src) > 1 || !checkCCcooldown()) return CM.lastTimeUsed = world.time playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) - send2otherserver("[station_name()]", input,"Comms_Console") - minor_announce(input, title = "Outgoing message to allied station") + SStopic.crosscomms_send("comms_console", input, station_name()) + minor_announce(input, title = "Outgoing message to allied station", html_encode = FALSE) usr.log_talk(input, LOG_SAY, tag="message to the other server") message_admins("[ADMIN_LOOKUPFLW(usr)] has sent a message to the other server.") deadchat_broadcast("[usr.real_name] has sent an outgoing message to the other station(s).", usr) @@ -167,11 +167,10 @@ if(points_to_check >= S.credit_cost) SSshuttle.shuttle_purchased = TRUE SSshuttle.unload_preview() - SSshuttle.load_template(S) SSshuttle.existing_shuttle = SSshuttle.emergency SSshuttle.action_load(S) D.adjust_money(-S.credit_cost) - minor_announce("[usr.real_name] has purchased [S.name] for [S.credit_cost] credits.[S.extra_desc ? " [S.extra_desc]" : ""]" , "Shuttle Purchase") + minor_announce("[S.name] has been purchased for [S.credit_cost] credits! Purchase authorized by [auth_id] [S.extra_desc ? " [S.extra_desc]" : ""]" , "Shuttle Purchase") message_admins("[ADMIN_LOOKUPFLW(usr)] purchased [S.name].") log_game("[key_name(usr)] has purchased [S.name].") SSblackbox.record_feedback("text", "shuttle_purchase", 1, "[S.name]") @@ -281,7 +280,7 @@ to_chat(usr, "Arrays recycling. Please stand by.") return var/input = stripped_input(usr, "Please choose a message to transmit to CentCom via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to CentCom.", "") - if(!input || !(usr in view(1,src)) || !checkCCcooldown()) + if(!input || get_dist(usr, src) > 1 || !checkCCcooldown()) return playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) CentCom_announce(input, usr) @@ -298,7 +297,7 @@ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) return var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING COORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to /??????/.", "") - if(!input || !(usr in view(1,src)) || !checkCCcooldown()) + if(!input || get_dist(usr, src) > 1 || !checkCCcooldown()) return playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) Syndicate_announce(input, usr) @@ -319,12 +318,12 @@ to_chat(usr, "Arrays recycling. Please stand by.") return var/input = stripped_input(usr, "Please enter the reason for requesting the nuclear self-destruct codes. Misuse of the nuclear request system will not be tolerated under any circumstances. Transmission does not guarantee a response.", "Self Destruct Code Request.","") - if(!input || !(usr in view(1,src)) || !checkCCcooldown()) + if(!input || get_dist(usr, src) > 1 || !checkCCcooldown()) return Nuke_request(input, usr) to_chat(usr, "Request sent.") usr.log_message("has requested the nuclear codes from CentCom", LOG_SAY) - priority_announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested",'sound/ai/commandreport.ogg') + priority_announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self-Destruct Codes Requested", SSstation.announcer.get_rand_report_sound()) CM.lastTimeUsed = world.time @@ -554,18 +553,31 @@ if(STATE_PURCHASE) var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + var/obj/item/circuitboard/computer/communications/CM = circuit dat += "Budget: [D.account_balance] Credits.
    " dat += "
    " - dat += "Caution: Purchasing dangerous shuttles may lead to mutiny and/or death.
    " - dat += "
    " + if((obj_flags & EMAGGED) || CM.insecure) + dat += "WARNING: Safety features disabled. Non-certified shuttles included. Order at your own peril.

    " + else + dat += "Safety protocols in effect: These shuttles all fulfill NT safety standards.

    " //not that they're very high but these won't kill everyone aboard for(var/shuttle_id in SSmapping.shuttle_templates) var/datum/map_template/shuttle/S = SSmapping.shuttle_templates[shuttle_id] - if(S.can_be_bought && S.credit_cost < INFINITY) + if(S.can_be_bought && S.credit_cost < INFINITY &! S.illegal_shuttle) dat += "[S.name] | [S.credit_cost] Credits
    " dat += "[S.description]
    " if(S.prerequisites) dat += "Prerequisites: [S.prerequisites]
    " dat += "(Purchase)

    " + if((obj_flags & EMAGGED) || CM.insecure) + dat += "NON-CERTIFIED SHUTTLES APPENDED BELOW.

    " + for(var/shuttle_id in SSmapping.shuttle_templates) + var/datum/map_template/shuttle/S = SSmapping.shuttle_templates[shuttle_id] + if(S.illegal_shuttle && S.credit_cost < INFINITY) + dat += "[S.name] | [S.credit_cost] Credits
    " + dat += "[S.description]
    " + if(S.prerequisites) + dat += "Prerequisites: [S.prerequisites]
    " + dat += "(Purchase)

    " dat += "

    \[ [(state != STATE_DEFAULT) ? "Main Menu | " : ""]Close \]" @@ -702,7 +714,7 @@ if(CHAT_FILTER_CHECK(input)) to_chat(user, "You cannot send an announcement that contains prohibited words.") return - SScommunications.make_announcement(user, is_silicon, input) + SScommunications.make_announcement(user, is_silicon, input, auth_id) deadchat_broadcast("[user.real_name] made a priority announcement from [get_area_name(usr, TRUE)].", user) /obj/machinery/computer/communications/proc/post_status(command, data1, data2) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index a3f66689d862e..85c18e52da68e 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -15,7 +15,7 @@ /obj/machinery/computer/crew/syndie icon_keyboard = "syndie_key" -/obj/machinery/computer/crew/interact(mob/user) +/obj/machinery/computer/crew/ui_interact(mob/user) GLOB.crewmonitor.show(user,src) GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) @@ -48,6 +48,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) jobs["Research Director"] = 30 jobs["Scientist"] = 31 jobs["Roboticist"] = 32 + jobs["Exploration Crew"] = 33 jobs["Chief Engineer"] = 40 jobs["Station Engineer"] = 41 jobs["Atmospheric Technician"] = 42 @@ -91,19 +92,20 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) if (!ui) ui = new(user, src, "CrewConsole") ui.open() + ui.set_autoupdate(TRUE) /datum/crewmonitor/proc/show(mob/M, source) - ui_sources[M] = source + ui_sources[WEAKREF(M)] = source ui_interact(M) /datum/crewmonitor/ui_host(mob/user) - return ui_sources[user] + return ui_sources[WEAKREF(user)] /datum/crewmonitor/ui_data(mob/user) - var/z = user.z + var/z = user.get_virtual_z_level() if(!z) var/turf/T = get_turf(user) - z = T.z + z = T.get_virtual_z_level() var/list/zdata = update_data(z) . = list() .["sensors"] = zdata @@ -135,15 +137,19 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) nanite_sensors = TRUE // Check if their z-level is correct and if they are wearing a uniform. // Accept H.z==0 as well in case the mob is inside an object. - if ((H.z == 0 || H.z == z || (is_station_level(H.z) && is_station_level(z))) && (istype(H.w_uniform, /obj/item/clothing/under) || nanite_sensors)) + if ((H.z == 0 || H.get_virtual_z_level() == z || (is_station_level(H.z) && is_station_level(z))) && (istype(H.w_uniform, /obj/item/clothing/under) || nanite_sensors)) U = H.w_uniform + //Radio transmitters are jammed + if(nanite_sensors ? H.is_jammed() : U.is_jammed()) + continue + // Are the suit sensors on? if (nanite_sensors || ((U.has_sensor > 0) && U.sensor_mode)) pos = H.z == 0 || (nanite_sensors || U.sensor_mode == SENSOR_COORDS) ? get_turf(H) : null // Special case: If the mob is inside an object confirm the z-level on turf level. - if (H.z == 0 && (!pos || (pos.z != z) && !(is_station_level(pos.z) && is_station_level(z)))) + if (H.z == 0 && (!pos || (pos.get_virtual_z_level() != z) && !(is_station_level(pos.z) && is_station_level(z)))) continue I = H.wear_id ? H.wear_id.GetID() : null diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 4cb6145b59a83..c697fb3fd6432 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -10,13 +10,19 @@ #define RADIATION_DURATION_MAX 30 #define RADIATION_ACCURACY_MULTIPLIER 3 //larger is less accurate +/// Special status indicating a scanner occupant is transforming eg. from monkey to human +#define STATUS_TRANSFORMING 4 #define RADIATION_IRRADIATION_MULTIPLIER 1 //multiplier for how much radiation a test subject receives -#define SCANNER_ACTION_SE 1 -#define SCANNER_ACTION_UI 2 -#define SCANNER_ACTION_UE 3 -#define SCANNER_ACTION_MIXED 4 +#define SEARCH_OCCUPANT 1 +/// Flag for the mutation ref search system. Search will include console storage +#define SEARCH_STORED 2 +/// Flag for the mutation ref search system. Search will include diskette storage +#define SEARCH_DISKETTE 4 +/// Flag for the mutation ref search system. Search will include advanced injector mutations +#define SEARCH_ADV_INJ 8 + /obj/machinery/computer/scan_consolenew name = "\improper DNA scanner access console" @@ -38,7 +44,7 @@ var/radstrength = 1 var/max_chromosomes = 5 ///Amount of mutations we can store - var/list/buffer[NUMBER_OF_BUFFERS] + var/list/genetic_makeup_buffer[NUMBER_OF_BUFFERS] ///mutations we have stored var/list/stored_mutations = list() ///chromosomes we have stored @@ -58,10 +64,65 @@ var/current_screen = "mainmenu" var/current_mutation //what block are we inspecting? only used when screen = "info" var/current_storage //what storage block are we looking at? - var/obj/machinery/dna_scannernew/connected = null + var/obj/machinery/dna_scannernew/connected_scanner = null var/obj/item/disk/data/diskette = null var/list/delayed_action = null + /// Index of the enzyme being modified during delayed enzyme pulse operations + var/rad_pulse_index = 0 + /// World time when the enzyme pulse should complete + var/rad_pulse_timer = 0 + + /// Used for setting tgui data - Whether the connected DNA Scanner is usable + var/can_use_scanner = FALSE + /// Used for setting tgui data - Whether the current DNA Scanner occupant is viable for genetic modification + var/is_viable_occupant = FALSE + /// Used for setting tgui data - Whether Scramble DNA is ready + var/is_scramble_ready = FALSE + /// Used for setting tgui data - Whether JOKER algorithm is ready + var/is_joker_ready = FALSE + /// Used for setting tgui data - Whether injectors are ready to be printed + var/is_injector_ready = FALSE + /// Used for setting tgui data - Wheher an enzyme pulse operation is ongoing + var/is_pulsing_rads = FALSE + /// Used for setting tgui data - Time until scramble is ready + var/time_to_scramble = 0 + /// Used for setting tgui data - Time until joker is ready + var/time_to_joker = 0 + /// Used for setting tgui data - Time until injectors are ready + var/time_to_injector = 0 + /// Used for setting tgui data - Time until the enzyme pulse is complete + var/time_to_pulse = 0 + + /// Current DNA Scanner occupant + var/mob/living/carbon/scanner_occupant = null + + /// Used for setting tgui data - List of occupant mutations + var/list/tgui_occupant_mutations = list() + /// Used for setting tgui data - List of DNA Console stored mutations + var/list/tgui_console_mutations = list() + /// Used for setting tgui data - List of diskette stored mutations + var/list/tgui_diskette_mutations = list() + /// Used for setting tgui data - List of DNA Console chromosomes + var/list/tgui_console_chromosomes = list() + /// Used for setting tgui data - List of occupant mutations + var/list/tgui_genetic_makeup = list() + /// Used for setting tgui data - List of occupant mutations + var/list/tgui_advinjector_mutations = list() + + + /// State of tgui view, i.e. which tab is currently active, or which genome we're currently looking at. + var/list/list/tgui_view_state = list() + +/obj/machinery/computer/scan_consolenew/process() + . = ..() + + // This is for pulsing the UI element with radiation as part of genetic makeup + // If rad_pulse_index > 0 then it means we're attempting a rad pulse + if((rad_pulse_index > 0) && (rad_pulse_timer <= world.time)) + rad_pulse() + return + /obj/machinery/computer/scan_consolenew/attackby(obj/item/I, mob/user, params) if (istype(I, /obj/item/disk/data)) //INSERT SOME DISKETTES if (!src.diskette) @@ -96,18 +157,108 @@ else return ..() +/obj/machinery/computer/scan_consolenew/AltClick(mob/user) + // Make sure the user can interact with the machine. + if(!user.canUseTopic(src, !issilicon(user))) + return + + eject_disk(user) + +/obj/machinery/computer/scan_consolenew/proc/connect_to_scanner() + var/obj/machinery/dna_scannernew/test_scanner = null + var/obj/machinery/dna_scannernew/broken_scanner = null + + // Look in each cardinal direction and try and find a DNA Scanner + // If you find a DNA Scanner, check to see if it broken or working + // If it's working, set the current scanner and return early + // If it's not working, remember it anyway as a broken scanner + for(var/direction in GLOB.cardinals) + test_scanner = locate(/obj/machinery/dna_scannernew, get_step(src, direction)) + if(!isnull(test_scanner)) + if(test_scanner.is_operational()) + connect_scanner(test_scanner) + return + else + broken_scanner = test_scanner + + // Ultimately, if we have a broken scanner, we'll attempt to connect to it as + // a fallback case, but the code above will prefer a working scanner + if(!isnull(broken_scanner)) + connect_scanner(broken_scanner) + +/obj/machinery/computer/scan_consolenew/proc/connect_scanner(obj/machinery/dna_scannernew/scanner) + if(connected_scanner) + UnregisterSignal(connected_scanner, COMSIG_MACHINE_OPEN) + UnregisterSignal(connected_scanner, COMSIG_MACHINE_CLOSE) + + if(scanner) + RegisterSignal(scanner, COMSIG_MACHINE_OPEN, .proc/on_scanner_open) + RegisterSignal(scanner, COMSIG_MACHINE_CLOSE, .proc/on_scanner_close) + + connected_scanner = scanner + /obj/machinery/computer/scan_consolenew/Initialize() . = ..() - for(var/direction in GLOB.cardinals) - connected = locate(/obj/machinery/dna_scannernew, get_step(src, direction)) - if(!isnull(connected)) - break + + // Connect with a nearby DNA Scanner on init + connect_to_scanner() + + // Set the default tgui state + set_default_state() injectorready = world.time + INJECTOR_TIMEOUT scrambleready = world.time + SCRAMBLE_TIMEOUT jokerready = world.time + JOKER_TIMEOUT stored_research = SSresearch.science_tech +/obj/machinery/computer/scan_consolenew/ui_interact(mob/user, datum/tgui/ui) + // Most of ui_interact is spent setting variables for passing to the tgui + // interface. + // We can also do some general state processing here too as it's a good + // indication that a player is using the console. + + var/scanner_op = scanner_operational() + var/can_modify_occ = can_modify_occupant() + + // Check for connected AND operational scanner. + if(scanner_op) + can_use_scanner = TRUE + else + can_use_scanner = FALSE + connect_scanner(null) + is_viable_occupant = FALSE + + // Check for a viable occupant in the scanner. + if(can_modify_occ) + is_viable_occupant = TRUE + else + is_viable_occupant = FALSE + + + // Populates various buffers for passing to tgui + build_mutation_list(can_modify_occ) + build_genetic_makeup_list() + + // Populate variables for passing to tgui interface + is_scramble_ready = (scrambleready < world.time) + time_to_scramble = round((scrambleready - world.time)/10) + + is_joker_ready = (jokerready < world.time) + time_to_joker = round((jokerready - world.time)/10) + + is_injector_ready = (injectorready < world.time) + time_to_injector = round((injectorready - world.time)/10) + + is_pulsing_rads = ((rad_pulse_index > 0) && (rad_pulse_timer > world.time)) + time_to_pulse = round((rad_pulse_timer - world.time)/10) + + // Attempt to update tgui ui, open and update if needed. + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "DnaConsole") + ui.open() + ui.set_autoupdate(TRUE) + /obj/machinery/computer/scan_consolenew/examine(mob/user) . = ..() if(jokerready < world.time) @@ -115,839 +266,1658 @@ else . += "JOKER algorithm available in about [round(0.00166666667 * (jokerready - world.time))] minutes." -/obj/machinery/computer/scan_consolenew/ui_interact(mob/user, last_change) - . = ..() - if(!user) - return - var/datum/browser/popup = new(user, "scannernew", "DNA Modifier Console", 800, 630) // Set up the popup browser window - if(user.client) - var/datum/asset/simple/assets = get_asset_datum(/datum/asset/simple/genetics) - assets.send(user.client) - popup.add_stylesheet("scannernew", 'html/browser/scannernew.css') - - var/mob/living/carbon/viable_occupant - var/list/occupant_status = list("
    Subject Status:
    ") - var/scanner_status - var/list/temp_html = list() - if(connected && connected.is_operational()) - if(connected.occupant) //set occupant_status message - viable_occupant = connected.occupant - if(viable_occupant.has_dna() && !HAS_TRAIT(viable_occupant, TRAIT_RADIMMUNE) && !HAS_TRAIT(viable_occupant, TRAIT_BADDNA) || (connected.scan_level == 3)) //occupant is viable for dna modification - occupant_status += "[viable_occupant.name] => " - switch(viable_occupant.stat) - if(CONSCIOUS) - occupant_status += "Conscious" - if(UNCONSCIOUS) - occupant_status += "Unconscious" - else - occupant_status += "DEAD" - occupant_status += "
    " - occupant_status += "
    Health:
    [viable_occupant.health] %
    " - occupant_status += "
    Radiation Level:
    [viable_occupant.radiation/(RAD_MOB_SAFE/100)] %
    " - occupant_status += "
    Unique Enzymes :
    [viable_occupant.dna.unique_enzymes]
    " - occupant_status += "
    Last Operation:
    [last_change ? last_change : "----"]
    " +/obj/machinery/computer/scan_consolenew/ui_assets() + . = ..() || list() + . += get_asset_datum(/datum/asset/simple/genetics) + +/obj/machinery/computer/scan_consolenew/ui_data(mob/user) + var/list/data = list() + + data["view"] = tgui_view_state + data["storage"] = list() + + // This block of code generates the huge data structure passed to the tgui + // interface for displaying all the various bits of console/scanner data + // Should all be very self-explanatory + data["isScannerConnected"] = can_use_scanner + if(can_use_scanner) + data["scannerOpen"] = connected_scanner.state_open + data["scannerLocked"] = connected_scanner.locked + data["radStrength"] = radstrength + data["radDuration"] = radduration + data["stdDevStr"] = radstrength * RADIATION_STRENGTH_MULTIPLIER + switch(RADIATION_ACCURACY_MULTIPLIER / (radduration + (connected_scanner.precision_coeff ** 2))) //hardcoded values from a z-table for a normal distribution + if(0 to 0.25) + data["stdDevAcc"] = ">95 %" + if(0.25 to 0.5) + data["stdDevAcc"] = "68-95 %" + if(0.5 to 0.75) + data["stdDevAcc"] = "55-68 %" else - viable_occupant = null - occupant_status += "Invalid DNA structure" - else - occupant_status += "No subject detected" + data["stdDevAcc"] = "<38 %" - if(connected.state_open) - scanner_status = "Open" + data["isViableSubject"] = is_viable_occupant + if(is_viable_occupant) + data["subjectName"] = scanner_occupant.name + if(scanner_occupant.transformation_timer) + data["subjectStatus"] = STATUS_TRANSFORMING else - scanner_status = "Closed" - if(connected.locked) - scanner_status += "(Locked)" - else - scanner_status += "(Unlocked)" - - - else - occupant_status += "----" - scanner_status += "Error: No scanner detected" - - var/list/status = list("
    ") - status += "
    Scanner:
    [scanner_status]
    " - status += occupant_status - - - status += "

    Radiation Emitter Status

    " - var/stddev = radstrength*RADIATION_STRENGTH_MULTIPLIER - status += "
    Output Level:
    [radstrength]
    " - status += "
      \> Mutation:
    (-[stddev] to +[stddev] = 68 %) (-[2*stddev] to +[2*stddev] = 95 %)
    " - if(connected) - stddev = RADIATION_ACCURACY_MULTIPLIER/(radduration + (connected.precision_coeff ** 2)) - max_storage = 4 + (2*connected.precision_coeff) - max_chromosomes = 4 + connected.precision_coeff - max_injector_instability = 20 + (20*connected.scan_level) - else - stddev = RADIATION_ACCURACY_MULTIPLIER/radduration - var/chance_to_hit - switch(stddev) //hardcoded values from a z-table for a normal distribution - if(0 to 0.25) - chance_to_hit = ">95 %" - if(0.25 to 0.5) - chance_to_hit = "68-95 %" - if(0.5 to 0.75) - chance_to_hit = "55-68 %" - else - chance_to_hit = "<38 %" - status += "
    Pulse Duration:
    [radduration]
    " - status += "
      \> Accuracy:
    [chance_to_hit]
    " - status += "
    " // Close statusDisplay div - var/list/buttons = list("Scan") - if(connected) - buttons += "[connected.state_open ? "Close" : "Open"] Scanner" - if (connected.state_open) - buttons += "[connected.locked ? "Unlock" : "Lock"] Scanner" - else - buttons += "[connected.locked ? "Unlock" : "Lock"] Scanner" - else - buttons += "Open Scanner Lock Scanner" - if(viable_occupant && (scrambleready < world.time)) - buttons += "Scramble DNA" - else - buttons += "Scramble DNA" - if(diskette) - buttons += "Disk" + data["subjectStatus"] = scanner_occupant.stat + data["subjectHealth"] = scanner_occupant.health + data["subjectRads"] = scanner_occupant.radiation/(RAD_MOB_SAFE/100) + data["subjectEnzymes"] = scanner_occupant.dna.unique_enzymes + data["isMonkey"] = ismonkey(scanner_occupant) + data["subjectUNI"] = scanner_occupant.dna.uni_identity + data["storage"]["occupant"] = tgui_occupant_mutations + //data["subjectMutations"] = tgui_occupant_mutations else - buttons += "Disk" - if(current_screen == "mutations") - buttons += "Mutations" + data["subjectName"] = null + data["subjectStatus"] = null + data["subjectHealth"] = null + data["subjectRads"] = null + data["subjectEnzymes"] = null + //data["subjectMutations"] = null + data["storage"]["occupant"] = null + + data["hasDelayedAction"] = (delayed_action != null) + data["isScrambleReady"] = is_scramble_ready + data["isJokerReady"] = is_joker_ready + data["isInjectorReady"] = is_injector_ready + data["scrambleSeconds"] = time_to_scramble + data["jokerSeconds"] = time_to_joker + data["injectorSeconds"] = time_to_injector + data["isPulsingRads"] = is_pulsing_rads + data["radPulseSeconds"] = time_to_pulse + + if(diskette != null) + data["hasDisk"] = TRUE + data["diskCapacity"] = diskette.max_mutations - LAZYLEN(diskette.mutations) + data["diskReadOnly"] = diskette.read_only + //data["diskMutations"] = tgui_diskette_mutations + data["storage"]["disk"] = tgui_diskette_mutations + data["diskHasMakeup"] = (LAZYLEN(diskette.genetic_makeup_buffer) > 0) + data["diskMakeupBuffer"] = diskette.genetic_makeup_buffer.Copy() else - buttons += "Mutations" - if((current_screen == "mainmenu") || !current_screen) - buttons += "Genetic Sequencer" - else - buttons += "Genetic Sequencer" - if(current_screen == "ui") - buttons += "Unique Identifiers" - else - buttons += "Unique Identifiers" - if(current_screen == "advinjector") - buttons += "Adv. Injectors" - else - buttons += "Adv. Injectors" + data["hasDisk"] = FALSE + data["diskCapacity"] = 0 + data["diskReadOnly"] = TRUE + //data["diskMutations"] = null + data["storage"]["disk"] = null + data["diskHasMakeup"] = FALSE + data["diskMakeupBuffer"] = null + + data["mutationCapacity"] = max_storage - LAZYLEN(stored_mutations) + //data["mutationStorage"] = tgui_console_mutations + data["storage"]["console"] = tgui_console_mutations + data["chromoCapacity"] = max_chromosomes - LAZYLEN(stored_chromosomes) + data["chromoStorage"] = tgui_console_chromosomes + data["makeupCapacity"] = NUMBER_OF_BUFFERS + data["makeupStorage"] = tgui_genetic_makeup + + //data["advInjectors"] = tgui_advinjector_mutations + data["storage"]["injector"] = tgui_advinjector_mutations + data["maxAdvInjectors"] = max_injector_selections + + return data + +/obj/machinery/computer/scan_consolenew/ui_act(action, list/params) + if(..()) + return TRUE - switch(current_screen) - if("working") - temp_html += status - temp_html += "

    System Busy

    " - temp_html += "Working ... Please wait ([DisplayTimeText(radduration*10)])" - if("ui") - temp_html += status - temp_html += buttons - temp_html += "

    Unique Identifiers

    " - temp_html += "-- Output Level ++" - temp_html += "
    -- Pulse Duration ++" - temp_html += "

    Irradiate Subject

    " - temp_html += "
    Unique Identifier:
    " - var/max_line_len = 7*DNA_BLOCK_SIZE - if(viable_occupant) - temp_html += "
    1
    " - var/char = "" - var/ui_text = viable_occupant.dna.uni_identity - var/len_byte = length(ui_text) - var/char_it = 0 - for(var/byte_it = 1, byte_it <= len_byte, byte_it += length(char)) - char_it++ - char = ui_text[byte_it] - temp_html += "[char]" - if((char_it % max_line_len) == 0) - temp_html += "
    " - if((char_it % DNA_BLOCK_SIZE) == 0 && byte_it < len_byte) - temp_html += "
    [(char_it / DNA_BLOCK_SIZE) + 1]
    " - else - temp_html += "---------" - temp_html += "

    Buffer Menu

    " - - if(istype(buffer)) - for(var/i=1, i<=buffer.len, i++) - temp_html += "
    Slot [i]: " - var/list/buffer_slot = buffer[i] - if( !buffer_slot || !buffer_slot.len || !buffer_slot["name"] || !((buffer_slot["UI"] && buffer_slot["UE"]) || buffer_slot["SE"]) ) - temp_html += "
    \tNo Data" - if(viable_occupant) - temp_html += "
    Save to Buffer" - else - temp_html += "
    Save to Buffer" - temp_html += "Clear Buffer" - if(diskette) - temp_html += "Load from Disk" - else - temp_html += "Load from Disk" - temp_html += "Save to Disk" - else - var/ui = buffer_slot["UI"] - var/ue = buffer_slot["UE"] - var/name = buffer_slot["name"] - var/label = buffer_slot["label"] - var/blood_type = buffer_slot["blood_type"] - temp_html += "
    \tLabel: [label ? label : name]" - temp_html += "
    \tSubject: [name]" - if(ue && name && blood_type) - temp_html += "
    \tBlood Type: [blood_type]" - temp_html += "
    \tUE: [ue] " - if(viable_occupant) - temp_html += "Occupant" - else - temp_html += "Occupant" - temp_html += "Occupant:Delayed" - if(injectorready < world.time) - temp_html += "Injector" - else - temp_html += "Injector" - else - temp_html += "
    \tBlood Type: No Data" - temp_html += "
    \tUE: No Data" - if(ui) - temp_html += "
    \tUI: [ui] " - if(viable_occupant) - temp_html += "Occupant" - else - temp_html += "Occupant" - temp_html += "Occupant:Delayed" - if(injectorready < world.time) - temp_html += "Injector" - else - temp_html += "Injector" - else - temp_html += "
    \tUI: No Data" - if(ue && name && blood_type && ui) - temp_html += "
    \tUI+UE: [ui]/[ue] " - if(viable_occupant) - temp_html += "Occupant" - else - temp_html += "Occupant" - temp_html += "Occupant:Delayed" - if(injectorready < world.time) - temp_html += "UI+UE Injector" - else - temp_html += "UI+UE Injector" - if(viable_occupant) - temp_html += "
    Save to Buffer" - else - temp_html += "
    Save to Buffer" - temp_html += "Clear Buffer" - if(diskette) - temp_html += "Load from Disk" - else - temp_html += "Load from Disk" - if(diskette && !diskette.read_only) - temp_html += "Save to Disk" - else - temp_html += "Save to Disk" - if("disk") - temp_html += status - temp_html += buttons - if(diskette) - temp_html += "

    [diskette.name]


    " - temp_html += "Eject Disk
    " - if(LAZYLEN(diskette.mutations)) - temp_html += "" - for(var/datum/mutation/human/A in diskette.mutations) - temp_html += "" - temp_html += "" - if(LAZYLEN(stored_mutations) < max_storage) - temp_html += "" - else - temp_html += "" - temp_html += "" - temp_html += "
    [A.name]DeleteImportImport
    " - else - temp_html += "
    Load diskette to start ----------" - if("info") - if(LAZYLEN(stored_mutations)) - if(LAZYLEN(stored_mutations) >= current_storage) - var/datum/mutation/human/HM = stored_mutations[current_storage] - if(HM) - temp_html += display_sequence(HM.type, current_storage) - else - current_screen = "mainmenu" - if("mutations") - temp_html += status - temp_html += buttons - temp_html += "

    Mutation Storage:

    " - temp_html += "" - for(var/datum/mutation/human/HM in stored_mutations) - var/i = stored_mutations.Find(HM) - temp_html += "" - if(diskette) - temp_html += "" - else - temp_html += "" - temp_html += "" - if(combine == HM.type) - temp_html += "" - else - temp_html += "" - temp_html += "
    [HM.name]ExportExportDeleteCombine
    Combine

    " - temp_html += "

    Chromosome Storage:

    " - temp_html += "" - for(var/i in 1 to stored_chromosomes.len) - var/obj/item/chromosome/CM = stored_chromosomes[i] - temp_html += "
    " - temp_html += "
    [CM.name]
    " - if("advinjector") - temp_html += status - temp_html += buttons - temp_html += "
    Advanced Injectors:

    " - temp_html += "" - for(var/A in injector_selection) - temp_html += "
    [A]" - var/list/true_selection = injector_selection[A] - temp_html += "
    " - for(var/B in true_selection) - var/datum/mutation/human/HM = B - var/mutcolor - switch(HM.quality) - if(POSITIVE) - mutcolor = "good" - if(MINOR_NEGATIVE) - mutcolor = "average" - if(NEGATIVE) - mutcolor = "bad" - temp_html += "
    [HM.name] " - temp_html += "Remove
    " - if(injectorready < world.time) - temp_html += "
    Print Advanced Injector" - else - temp_html += "
    Print Advanced Injector" - temp_html += "Remove Injector
    " - temp_html += "
    " + . = TRUE - else - temp_html += status - temp_html += buttons - temp_html += "
    Genetic Sequence:

    " - if(viable_occupant) - if(viable_occupant) - for(var/A in get_mutation_list()) - temp_html += display_inactive_sequence(A) - temp_html += "
    " - else - temp_html += "----" - if(viable_occupant && (current_mutation in get_mutation_list(viable_occupant))) - temp_html += display_sequence(current_mutation) - temp_html += "

    " - else - temp_html += "----------" + add_fingerprint(usr) + usr.set_machine(src) - popup.set_content(temp_html.Join()) - popup.open() + switch(action) + // Connect this DNA Console to a nearby DNA Scanner + // Usually only activate as an option if there is no connected scanner + if("connect_scanner") + connect_to_scanner() + return -/obj/machinery/computer/scan_consolenew/proc/display_inactive_sequence(mutation) - var/temp_html = "" - var/class = "unselected" - var/mob/living/carbon/viable_occupant = get_viable_occupant() - if(!viable_occupant) - return + // Toggle the door open/closed status on attached DNA Scanner + if("toggle_door") + // GUARD CHECK - Scanner still connected and operational? + if(!scanner_operational()) + return - var/location = viable_occupant.dna.mutation_index.Find(mutation) //We do this because we dont want people using sysexp or similair tools to just read the mutations. - - if(!location) //Do this only when needed, dont make a list with mutations for every iteration if you dont need to - var/list/mutations = get_mutation_list(TRUE) - if(mutation in mutations) - location = mutations.Find(mutation) - if(mutation == current_mutation) - class = "selected" - if(location > DNA_MUTATION_BLOCKS) - temp_html += "Extra Mutation" - else if(mutation in stored_research.discovered_mutations) - temp_html += "Discovered Mutation" - else - temp_html += "Undiscovered" - return temp_html + connected_scanner.toggle_open(usr) + return -/obj/machinery/computer/scan_consolenew/proc/display_sequence(mutation, storage_slot) //Storage slot is for when viewing from the stored mutations - var/temp_html = "" - if(!mutation) - temp_html += "ERR-" - return - var/mut_name = "Unknown gene" - var/mut_desc = "No information available." - var/alias - var/discovered = FALSE - var/active = FALSE - var/scrambled = FALSE - var/instability - var/mob/living/carbon/viable_occupant = get_viable_occupant() - var/datum/mutation/human/HM = get_valid_mutation(mutation) - - if(viable_occupant) - var/datum/mutation/human/M = viable_occupant.dna.get_mutation(mutation) - if(M) - scrambled = M.scrambled - active = TRUE - var/datum/mutation/human/A = GET_INITIALIZED_MUTATION(mutation) - alias = A.alias - if(active && !scrambled) - discover(mutation) - if(stored_research && (mutation in stored_research.discovered_mutations)) - mut_name = A.name - mut_desc = A.desc - discovered = TRUE - instability = A.instability - var/extra - if(viable_occupant && !(storage_slot || viable_occupant.dna.mutation_in_sequence(mutation))) - extra = TRUE - if(discovered && !scrambled) - var/mutcolor - switch(A.quality) - if(POSITIVE) - mutcolor = "good" - if(MINOR_NEGATIVE) - mutcolor = "average" - if(NEGATIVE) - mutcolor = "bad" - if(HM) - instability *= GET_MUTATION_STABILIZER(HM) - temp_html += "
    [mut_name] ([alias])
    " - temp_html += "
    Instability : [round(instability)]
    " - else - temp_html += "
    [alias]
    " - temp_html += "
    [mut_desc]
    " - if(active && !storage_slot) - if(HM?.can_chromosome && (HM in viable_occupant.dna.mutations)) - var/i = viable_occupant.dna.mutations.Find(HM) - var/chromosome_name = "----" - if(HM.chromosome_name) - chromosome_name = HM.chromosome_name - temp_html += "
    Chromosome status: [chromosome_name]
    " - temp_html += "
    Sequence:

    " - if(!scrambled) - for(var/block in 1 to A.blocks) - var/whole_sequence = get_valid_gene_string(mutation) - var/sequence = copytext_char(whole_sequence, 1+(block-1)*(DNA_SEQUENCE_LENGTH*2),(DNA_SEQUENCE_LENGTH*2*block+1)) - temp_html += "
    " - for(var/i in 1 to DNA_SEQUENCE_LENGTH) - var/num = 1+(i-1)*2 - var/genenum = num+(DNA_SEQUENCE_LENGTH*2*(block-1)) - temp_html += "" - temp_html += "" - for(var/i in 1 to DNA_SEQUENCE_LENGTH) - temp_html += "" - temp_html += "" - for(var/i in 1 to DNA_SEQUENCE_LENGTH) - var/num = i*2 - var/genenum = num+(DNA_SEQUENCE_LENGTH*2*(block-1)) - temp_html += "" - temp_html += "
    |
    " - temp_html += "




    " - else - temp_html = "
    Sequence unreadable due to unpredictable mutation.
    " - if((active || storage_slot) && (injectorready < world.time) && !scrambled) - temp_html += "Print Activator" - temp_html += "Print Mutator" - else - temp_html += "Print Activator" - temp_html += "Print Mutator" - if((active || storage_slot) && !scrambled) - temp_html += "Adv. Injector" - else - temp_html += "Adv. Injector" - temp_html += "
    " - if(storage_slot) - temp_html += "Delete" - if((LAZYLEN(stored_mutations) < max_storage) && diskette && !diskette.read_only) - temp_html += "Export" - else - temp_html += "Export" - temp_html += "Back" - else if(active && !scrambled) - temp_html += "Store" + // Toggle the door bolts on the attached DNA Scanner + if("toggle_lock") + // GUARD CHECK - Scanner still connected and operational? + if(!scanner_operational()) + return - if(extra || scrambled) - temp_html += "Nullify" - else - temp_html += "Nullify" - temp_html += "
    " - return temp_html + connected_scanner.locked = !connected_scanner.locked + return -/obj/machinery/computer/scan_consolenew/Topic(href, href_list) - if(..()) - return - if(current_screen == "working") - return + // Scramble scanner occupant's DNA + if("scramble_dna") + // GUARD CHECK - Can we genetically modify the occupant? Includes scanner + // operational guard checks. + // GUARD CHECK - Is scramble DNA actually ready? + if(!can_modify_occupant() || !(scrambleready < world.time)) + return - add_fingerprint(usr) - usr.set_machine(src) + scanner_occupant.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA)) + scanner_occupant.dna.generate_dna_blocks() + scrambleready = world.time + SCRAMBLE_TIMEOUT + to_chat(usr,"DNA scrambled.") + scanner_occupant.radiation += RADIATION_STRENGTH_MULTIPLIER*50/(connected_scanner.damage_coeff ** 2) + return - var/mob/living/carbon/viable_occupant = get_viable_occupant() - - //Basic Tasks/////////////////////////////////////////// - var/num = round(text2num(href_list["num"])) - var/last_change - switch(href_list["task"]) - if("togglelock") - if(connected) - connected.locked = !connected.locked - if("toggleopen") - if(connected) - connected.toggle_open(usr) - if("setduration") - if(!num) - num = round(input(usr, "Choose pulse duration:", "Input an Integer", null) as num|null) - if(num) - radduration = WRAP(num, 1, RADIATION_DURATION_MAX+1) - if("setstrength") - if(!num) - num = round(input(usr, "Choose pulse strength:", "Input an Integer", null) as num|null) - if(num) - radstrength = WRAP(num, 1, RADIATION_STRENGTH_MAX+1) - if("screen") - current_screen = href_list["text"] - if("scramble") - if(viable_occupant && (scrambleready < world.time)) - if(prob(1) && prob(1)) - to_chat(usr,"Error: Musa acuminata transformation detected!") //Actually we only share 1% of our functional protein-coding DNA with bananas, but this is mildly amusing so whatever - if(viable_occupant.client && viable_occupant.ckey) - message_admins("[key_name(viable_occupant)] has been turned into a banana by [key_name(usr)]") - log_game("[key_name(viable_occupant)] has been turned into a banana by [key_name(usr)]") - if(connected) - connected.locked = FALSE - connected.open_machine() - var/occupant_loc = viable_occupant.loc - viable_occupant.Destroy() - new /obj/item/reagent_containers/food/snacks/grown/banana(occupant_loc) - return + // Check whether a specific mutation is eligible for discovery within the + // scanner occupant + // This is additionally done when a mutation's tab is selected in the tgui + // interface. This is because some mutations, such as Monkified on monkeys, + // are infact completed by default but not yet discovered. Likewise, all + // mutations can have their sequence completed while Monkified is still an + // active mutation and thus won't immediately be discovered but could be + // discovered when Monkified is removed + // ---------------------------------------------------------------------- // + // params["alias"] - Alias of a mutation. The alias is the "hidden" name of + // the mutation, for example "Mutation 5" or "Mutation 33" + if("check_discovery") + // GUARD CHECK - Can we genetically modify the occupant? Includes scanner + // operational guard checks. + if(!can_modify_occupant()) + return + + // GUARD CHECK - Have we somehow cheekily swapped occupants? This is + // unexpected. + if(!(scanner_occupant == connected_scanner.occupant)) + return + + check_discovery(params["alias"]) + return + + // Check all mutations of the occupant and check if any are discovered. + // This is called when the Genetic Sequencer is selected. It'll do things + // like immediately discover Monkified without needing to click through + // the mutation tabs and handle cases where mutations are solved but not + // discovered due to the Monkified mutation being active then removed. + if("all_check_discovery") + // GUARD CHECK - Can we genetically modify the occupant? Includes scanner + // operational guard checks. + if(!can_modify_occupant()) + return - viable_occupant.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA)) - viable_occupant.dna.generate_dna_blocks() - scrambleready = world.time + SCRAMBLE_TIMEOUT - to_chat(usr,"DNA scrambled.") - viable_occupant.radiation += RADIATION_STRENGTH_MULTIPLIER*50/(connected.damage_coeff ** 2) - - if("setbufferlabel") - var/text = stripped_input(usr, "Input a new label:", "Input a Text") - if(num && text) - 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) - buffer[num] = list( - "label"="Buffer[num]:[viable_occupant.real_name]", - "UI"=viable_occupant.dna.uni_identity, - "UE"=viable_occupant.dna.unique_enzymes, - "name"=viable_occupant.real_name, - "blood_type"=viable_occupant.dna.blood_type - ) - if("clearbuffer") - if(num) - num = CLAMP(num, 1, NUMBER_OF_BUFFERS) - var/list/buffer_slot = buffer[num] - if(istype(buffer_slot)) - buffer_slot.Cut() - if("transferbuffer") - if(num && viable_occupant) - switch(href_list["text"]) //Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove - if("ui") - apply_buffer(SCANNER_ACTION_UI,num) - if("ue") - apply_buffer(SCANNER_ACTION_UE,num) - if("mixed") - apply_buffer(SCANNER_ACTION_MIXED,num) - if("injector") - if(num && injectorready < world.time) - num = CLAMP(num, 1, NUMBER_OF_BUFFERS) - var/list/buffer_slot = buffer[num] - if(istype(buffer_slot)) - var/obj/item/dnainjector/timed/I - switch(href_list["text"]) - if("ui") - if(buffer_slot["UI"]) - I = new /obj/item/dnainjector/timed(loc) - I.fields = list("UI"=buffer_slot["UI"]) - if(connected) - I.damage_coeff = connected.damage_coeff - if("ue") - if(buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["blood_type"]) - I = new /obj/item/dnainjector/timed(loc) - I.fields = list("name"=buffer_slot["name"], "UE"=buffer_slot["UE"], "blood_type"=buffer_slot["blood_type"]) - if(connected) - I.damage_coeff = connected.damage_coeff - if("mixed") - if(buffer_slot["UI"] && buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["blood_type"]) - I = new /obj/item/dnainjector/timed(loc) - I.fields = list("UI"=buffer_slot["UI"],"name"=buffer_slot["name"], "UE"=buffer_slot["UE"], "blood_type"=buffer_slot["blood_type"]) - if(connected) - I.damage_coeff = connected.damage_coeff - if(I) - injectorready = world.time + INJECTOR_TIMEOUT - if("loaddisk") - if(num && diskette && diskette.fields) - 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) - var/list/buffer_slot = buffer[num] - if(istype(buffer_slot)) - diskette.name = "data disk \[[buffer_slot["label"]]\]" - diskette.fields = buffer_slot.Copy() - if("ejectdisk") - if(diskette) - diskette.forceMove(drop_location()) - diskette = null - if("setdelayed") - if(num) - delayed_action = list("action"=text2num(href_list["delayaction"]),"buffer"=num) - if("pulseui") - if(num && viable_occupant && connected) - radduration = WRAP(radduration, 1, RADIATION_DURATION_MAX+1) - radstrength = WRAP(radstrength, 1, RADIATION_STRENGTH_MAX+1) - - var/locked_state = connected.locked - connected.locked = TRUE - - current_screen = "working" - ui_interact(usr) - - sleep(radduration*10) - current_screen = "ui" - - if(viable_occupant && connected && connected.occupant==viable_occupant) - viable_occupant.radiation += (RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength)/(connected.damage_coeff ** 2) //Read comment in "transferbuffer" section above for explanation - switch(href_list["task"]) //Same thing as there but values are even lower, on best part they are about 0.0*, effectively no damage - if("pulseui") - var/len = length_char(viable_occupant.dna.uni_identity) - num = WRAP(num, 1, len+1) - num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) //Each manipulator level above 1 makes randomization as accurate as selected time + manipulator lvl^2 - //Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low - var/block = round((num-1)/DNA_BLOCK_SIZE)+1 - var/subblock = num - block*DNA_BLOCK_SIZE - last_change = "UI #[block]-[subblock]; " - - var/hex = copytext_char(viable_occupant.dna.uni_identity, num, num+1) - last_change += "[hex]" - hex = scramble(hex, radstrength, radduration) - last_change += "->[hex]" - - viable_occupant.dna.uni_identity = copytext_char(viable_occupant.dna.uni_identity, 1, num) + hex + copytext_char(viable_occupant.dna.uni_identity, num + 1) - viable_occupant.updateappearance(mutations_overlay_update=1) + // GUARD CHECK - Have we somehow cheekily swapped occupants? This is + // unexpected. + if(!(scanner_occupant == connected_scanner.occupant)) + return + + // Go over all standard mutations and check if they've been discovered. + for(var/mutation_type in scanner_occupant.dna.mutation_index) + var/datum/mutation/human/HM = GET_INITIALIZED_MUTATION(mutation_type) + check_discovery(HM.alias) + + return + + // Set a gene in a mutation's genetic sequence. Will also check for mutations + // discovery as part of the process. + // ---------------------------------------------------------------------- // + // params["alias"] - Alias of a mutation. The alias is the "hidden" name of + // the mutation, for example "Mutation 5" or "Mutation 33" + // params["gene"] - The letter of the new gene + // params["pos"] - The BYOND index of the letter in the gene sequence to be + // changed. Expects a text string from TGUI and will convert to a number + if("pulse_gene") + // GUARD CHECK - Can we genetically modify the occupant? Includes scanner + // operational guard checks. + if(!can_modify_occupant()) + return + + // GUARD CHECK - Have we somehow cheekily swapped occupants? This is + // unexpected. + if(!(scanner_occupant == connected_scanner.occupant)) + return + + // GUARD CHECK - Is the occupant currently undergoing some form of + // transformation? If so, we don't want to be pulsing genes. + if(scanner_occupant.transformation_timer) + to_chat(usr,"Gene pulse failed: The scanner occupant undergoing a transformation.") + return + + // Resolve mutation's BYOND path from the alias + var/alias = params["alias"] + var/path = GET_MUTATION_TYPE_FROM_ALIAS(alias) + + // Make sure the occupant still has this mutation + if(!(path in scanner_occupant.dna.mutation_index)) + return + + // Resolve BYOND path to genome sequence of scanner occupant + var/sequence = GET_GENE_STRING(path, scanner_occupant.dna) + + var/newgene = params["gene"] + var/genepos = text2num(params["pos"]) + + // If the new gene is J, this means we're dealing with a JOKER + // GUARD CHECK - Is JOKER actually ready? + if((newgene == "J") && (jokerready < world.time)) + var/truegenes = GET_SEQUENCE(path) + newgene = truegenes[genepos] + jokerready = world.time + JOKER_TIMEOUT - (JOKER_UPGRADE * (connected_scanner.precision_coeff-1)) + + // If the gene is an X, we want to update the default genes with the new + // X to allow highlighting logic to work on the tgui interface. + if(newgene == "X") + var/defaultseq = scanner_occupant.dna.default_mutation_genes[path] + defaultseq = copytext_char(defaultseq, 1, genepos) + newgene + copytext_char(defaultseq, genepos + 1) + scanner_occupant.dna.default_mutation_genes[path] = defaultseq + + // Copy genome to scanner occupant and do some basic mutation checks as + // we've increased the occupant rads + sequence = copytext_char(sequence, 1, genepos) + newgene + copytext_char(sequence, genepos + 1) + scanner_occupant.dna.mutation_index[path] = sequence + scanner_occupant.radiation += RADIATION_STRENGTH_MULTIPLIER/connected_scanner.damage_coeff + scanner_occupant.domutcheck() + + // GUARD CHECK - Modifying genetics can lead to edge cases where the + // scanner occupant is qdel'd and replaced with a different entity. + // Examples of this include adding/removing the Monkified mutation which + // qdels the previous entity and creates a brand new one in its place. + // We should redo all of our occupant modification checks again, although + // it is less than ideal. + if(!can_modify_occupant()) + return + + // Check if we cracked a mutation + check_discovery(alias) + + return + + // Apply a chromosome to a specific mutation. + // ---------------------------------------------------------------------- // + // params["mutref"] - ATOM Ref of specific mutation to apply the chromo to + // params["chromo"] - Name of the chromosome to apply to the mutation + if("apply_chromo") + // GUARD CHECK - Can we genetically modify the occupant? Includes scanner + // operational guard checks. + if(!can_modify_occupant()) + return + + // GUARD CHECK - Have we somehow cheekily swapped occupants? This is + // unexpected. + if(!(scanner_occupant == connected_scanner.occupant)) + return + + var/bref = params["mutref"] + + // GUARD CHECK - Only search occupant for this specific ref, since your + // can only apply chromosomes to mutations occupants. + var/datum/mutation/human/HM = get_mut_by_ref(bref, SEARCH_OCCUPANT) + + // GUARD CHECK - This should not be possible. Unexpected result + if(!HM) + return + + // Look through our stored chromos and compare names to find a + // stored chromo we can apply. + for(var/obj/item/chromosome/CM in stored_chromosomes) + if(CM.can_apply(HM) && (CM.name == params["chromo"])) + stored_chromosomes -= CM + CM.apply(HM) + + return + + // Print any type of standard injector, limited right now to activators that + // activate a dormant mutation and mutators that forcibly create a new + // MUT_EXTRA mutation + // ---------------------------------------------------------------------- // + // params["mutref"] - ATOM Ref of specific mutation to create an injector of + // params["is_activator"] - Is this an "Activator" style injector, also + // referred to as a "Research" type. Expects a string with 0 or 1, which + // then gets converted to a number. + // params["source"] - The source the request came from. + // Expected results: + // "occupant" - From genetic sequencer + // "console" - From DNA Console storage + // "disk" - From inserted diskette + if("print_injector") + // Because printing mutators and activators share a bunch of code, + // it makes sense to keep them both together and set unique vars + // later in the code + + // As a side note, because mutations can contain unique metadata, + // this system uses BYOND Atom Refs to safely and accurately + // identify mutations from big ol' lists + + // GUARD CHECK - Is the injector actually ready? + if(world.time < injectorready) + return + + var/search_flags = 0 + + switch(params["source"]) + if("occupant") + // GUARD CHECK - Make sure we can modify the occupant before we + // attempt to search them for any given mutation refs. This could + // lead to no search flags being passed to get_mut_by_ref and this + // is intended functionality to prevent any cheese or abuse + if(can_modify_occupant()) + search_flags |= SEARCH_OCCUPANT + if("console") + search_flags |= SEARCH_STORED + if("disk") + search_flags |= SEARCH_DISKETTE + + var/bref = params["mutref"] + var/datum/mutation/human/HM = get_mut_by_ref(bref, search_flags) + + // GUARD CHECK - This should not be possible. Unexpected result + if(!HM) + return + + // Create a new DNA Injector and add the appropriate mutations to it + var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc) + I.add_mutations += new HM.type(copymut = HM) + + var/is_activator = text2num(params["is_activator"]) + + // Activators are also called "research" injectors and are used to create + // chromosomes by recycling at the DNA Console + if(is_activator) + I.name = "[HM.name] activator" + I.research = TRUE + // If there's an operational connected scanner, we can use its upgrades + // to improve our injector's radiation generation + if(scanner_operational()) + I.damage_coeff = connected_scanner.damage_coeff*4 + injectorready = world.time + INJECTOR_TIMEOUT * (1 - 0.1 * connected_scanner.precision_coeff) else - current_screen = "mainmenu" - - if(connected) - connected.locked = locked_state - if("inspect") - if(viable_occupant) - var/list/mutations = get_mutation_list(TRUE) - if(current_mutation == mutations[num]) - current_mutation = null + injectorready = world.time + INJECTOR_TIMEOUT + else + I.name = "[HM.name] mutator" + I.doitanyway = TRUE + // If there's an operational connected scanner, we can use its upgrades + // to improve our injector's radiation generation + if(scanner_operational()) + I.damage_coeff = connected_scanner.damage_coeff + injectorready = world.time + INJECTOR_TIMEOUT * 5 * (1 - 0.1 * connected_scanner.precision_coeff) else - current_mutation = mutations[num] - - if("inspectstorage") - current_storage = num - current_screen = "info" - if("savemut") - if(viable_occupant) - var/success - if(LAZYLEN(stored_mutations) < max_storage) - var/mutation = text2path(href_list["path"]) - if(ispath(mutation, /datum/mutation/human)) //sanity checks - var/datum/mutation/human/HM = viable_occupant.dna.get_mutation(mutation) - if(HM) - var/datum/mutation/human/A = new HM.type() - A.copy_mutation(HM) - success = TRUE - stored_mutations += A - to_chat(usr,"Mutation succesfully stored.") - if(!success) //we can exactly return here - to_chat(usr,"Mutation storage is full.") - if("deletemut") - var/datum/mutation/human/HM = stored_mutations[num] + injectorready = world.time + INJECTOR_TIMEOUT * 5 + + return + + // Save a mutation to the console's storage buffer. + // ---------------------------------------------------------------------- // + // params["mutref"] - ATOM Ref of specific mutation to store + // params["source"] - The source the request came from. + // Expected results: + // "occupant" - From genetic sequencer + // "disk" - From inserted diskette + if("save_console") + var/search_flags = 0 + + switch(params["source"]) + if("occupant") + // GUARD CHECK - Make sure we can modify the occupant before we + // attempt to search them for any given mutation refs. This could + // lead to no search flags being passed to get_mut_by_ref and this + // is intended functionality to prevent any cheese or abuse + if(can_modify_occupant()) + search_flags |= SEARCH_OCCUPANT + if("disk") + search_flags |= SEARCH_DISKETTE + + // GUARD CHECK - Is mutation storage full? + if(LAZYLEN(stored_mutations) >= max_storage) + to_chat(usr,"Mutation storage is full.") + return + + var/bref = params["mutref"] + var/datum/mutation/human/HM = get_mut_by_ref(bref, search_flags) + + // GUARD CHECK - This should not be possible. Unexpected result + if(!HM) + return + + var/datum/mutation/human/A = new HM.type() + A.copy_mutation(HM) + stored_mutations += A + to_chat(usr,"Mutation successfully stored.") + return + + // Save a mutation to the diskette's storage buffer. + // ---------------------------------------------------------------------- // + // params["mutref"] - ATOM Ref of specific mutation to store + // params["source"] - The source the request came from + // Expected results: + // "occupant" - From genetic sequencer + // "console" - From DNA Console storage + if("save_disk") + // GUARD CHECK - This code shouldn't even be callable without a diskette + // inserted. Unexpected result + if(!diskette) + return + + // GUARD CHECK - Make sure the disk is not full + if(LAZYLEN(diskette.mutations) >= diskette.max_mutations) + to_chat(usr,"Disk storage is full.") + return + + // GUARD CHECK - Make sure the disk isn't set to read only, as we're + // attempting to write to it + if(diskette.read_only) + to_chat(usr,"Disk is set to read only mode.") + return + + var/search_flags = 0 + + switch(params["source"]) + if("occupant") + // GUARD CHECK - Make sure we can modify the occupant before we + // attempt to search them for any given mutation refs. This could + // lead to no search flags being passed to get_mut_by_ref and this + // is intended functionality to prevent any cheese or abuse + if(can_modify_occupant()) + search_flags |= SEARCH_OCCUPANT + if("console") + search_flags |= SEARCH_STORED + + var/bref = params["mutref"] + var/datum/mutation/human/HM = get_mut_by_ref(bref, search_flags) + + // GUARD CHECK - This should not be possible. Unexpected result + if(!HM) + return + + var/datum/mutation/human/A = new HM.type() + A.copy_mutation(HM) + diskette.mutations += A + to_chat(usr,"Mutation successfully stored to disk.") + return + + // Completely removes a MUT_EXTRA mutation or mutation with corrupt gene + // sequence from the scanner occupant + // ---------------------------------------------------------------------- // + // params["mutref"] - ATOM Ref of specific mutation to nullify + if("nullify") + // GUARD CHECK - Can we genetically modify the occupant? Includes scanner + // operational guard checks. + if(!can_modify_occupant()) + return + + var/bref = params["mutref"] + var/datum/mutation/human/HM = get_mut_by_ref(bref, SEARCH_OCCUPANT) + + // GUARD CHECK - This should not be possible. Unexpected result + if(!HM) + return + + // GUARD CHECK - Nullify should only be used on scrambled or "extra" + // mutations. + if(!HM.scrambled && !(HM.class == MUT_EXTRA)) + return + + scanner_occupant.dna.remove_mutation(HM.type) + return + + // Deletes saved mutation from console buffer. + // ---------------------------------------------------------------------- // + // params["mutref"] - ATOM Ref of specific mutation to delete + if("delete_console_mut") + var/bref = params["mutref"] + var/datum/mutation/human/HM = get_mut_by_ref(bref, SEARCH_STORED) + if(HM) stored_mutations.Remove(HM) qdel(HM) - current_screen = "mutations" - if("activator") - if(injectorready < world.time) - var/mutation = text2path(href_list["path"]) - if(ispath(mutation, /datum/mutation/human)) - var/datum/mutation/human/HM = get_valid_mutation(mutation) - if(HM) - var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc) - I.add_mutations += new HM.type (copymut = HM) - I.name = "[HM.name] activator" - I.research = TRUE - if(connected) - I.damage_coeff = connected.damage_coeff*4 - injectorready = world.time + INJECTOR_TIMEOUT * (1 - 0.1 * connected.precision_coeff) //precision_coeff being the manipulator rating - else - injectorready = world.time + INJECTOR_TIMEOUT - if("mutator") - if(injectorready < world.time) - var/mutation = text2path(href_list["path"]) - if(ispath(mutation, /datum/mutation/human)) - var/datum/mutation/human/HM = get_valid_mutation(mutation) - if(HM) - var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc) - I.add_mutations += new HM.type (copymut = HM) - I.doitanyway = TRUE - I.name = "[HM.name] injector" - if(connected) - I.damage_coeff = connected.damage_coeff - injectorready = world.time + INJECTOR_TIMEOUT * 5 * (1 - 0.1 * connected.precision_coeff) - else - injectorready = world.time + INJECTOR_TIMEOUT * 5 - - if("advinjector") - var/selection = href_list["injector"] - if(injectorready < world.time) - if(injector_selection.Find(selection)) - var/list/true_selection = injector_selection[selection] - if(LAZYLEN(injector_selection)) - var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc) - for(var/A in true_selection) - var/datum/mutation/human/HM = A - I.add_mutations += new HM.type (copymut = HM) - I.doitanyway = TRUE - I.name = "Advanced [selection] injector" - if(connected) - I.damage_coeff = connected.damage_coeff - injectorready = world.time + INJECTOR_TIMEOUT * 8 * (1 - 0.1 * connected.precision_coeff) - else - injectorready = world.time + INJECTOR_TIMEOUT * 8 - if("nullify") - if(viable_occupant) - var/datum/mutation/human/A = viable_occupant.dna.get_mutation(current_mutation) - if(A && (!viable_occupant.dna.mutation_in_sequence(current_mutation) || A.scrambled)) - viable_occupant.dna.remove_mutation(current_mutation) - current_screen = "mainmenu" - current_mutation = null - if("pulsegene") - if(current_screen != "info") - var/path = GET_MUTATION_TYPE_FROM_ALIAS(href_list["alias"]) - if(viable_occupant && num && (path in viable_occupant.dna.mutation_index)) - var/list/genes = list("A","T","G","C","X") - if(jokerready < world.time) - genes += "JOKER" - var/sequence = GET_GENE_STRING(path, viable_occupant.dna) - var/original = sequence[num] - var/new_gene = input("From [original] to-", "New block", original) as null|anything in genes - if(!new_gene) - new_gene = original - if(viable_occupant == get_viable_occupant()) //No cheesing - if((new_gene == "JOKER") && (jokerready < world.time)) - var/true_genes = GET_SEQUENCE(current_mutation) - new_gene = true_genes[num] - jokerready = world.time + JOKER_TIMEOUT - (JOKER_UPGRADE * (connected.precision_coeff-1)) - sequence = copytext_char(sequence, 1, num) + new_gene + copytext_char(sequence, num + 1) - viable_occupant.dna.mutation_index[path] = sequence - viable_occupant.radiation += RADIATION_STRENGTH_MULTIPLIER/connected.damage_coeff - viable_occupant.domutcheck() - if("exportdiskmut") - if(diskette && !diskette.read_only) - var/path = text2path(href_list["path"]) - if(ispath(path, /datum/mutation/human)) - var/datum/mutation/human/A = get_valid_mutation(path) - if(A && diskette && (LAZYLEN(diskette.mutations) < diskette.max_mutations)) - var/datum/mutation/human/HM = new A.type() - diskette.mutations += HM - HM.copy_mutation(A) - to_chat(usr, "Successfully wrote [A.name] to [diskette.name].") - if("deletediskmut") - if(diskette && !diskette.read_only) - if(num && (LAZYLEN(diskette.mutations) >= num)) - var/datum/mutation/human/A = diskette.mutations[num] - diskette.mutations.Remove(A) - qdel(A) - if("importdiskmut") - if(diskette && (LAZYLEN(diskette.mutations) >= num)) - if(LAZYLEN(stored_mutations) < max_storage) - var/datum/mutation/human/A = diskette.mutations[num] - var/datum/mutation/human/HM = new A.type() - HM.copy_mutation(A) - stored_mutations += HM - to_chat(usr,"Successfully wrote [A.name] to storage.") - if("combine") - if(num && (LAZYLEN(stored_mutations) >= num)) - if(LAZYLEN(stored_mutations) < max_storage) - var/datum/mutation/human/A = stored_mutations[num] - var/path = A.type - if(combine) - var/result_path = get_mixed_mutation(combine, path) - if(result_path) - stored_mutations += new result_path() - to_chat(usr, "Success! New mutation has been added to storage.") - discover(result_path) - combine = null - else - to_chat(usr, "Failed. No mutation could be created.") - combine = null - else - combine = path - to_chat(usr,"Selected [A.name] for combining.") - else - to_chat(usr, "Not enough space to store potential mutation.") - if("ejectchromosome") - var/obj/item/chromosome/CM = stored_chromosomes[num] - CM.forceMove(drop_location()) - adjust_item_drop_location(CM) - stored_chromosomes -= CM - if("applychromosome") - if(viable_occupant && (LAZYLEN(viable_occupant.dna.mutations) <= num)) - var/datum/mutation/human/HM = viable_occupant.dna.mutations[num] - var/list/chromosomes = list() - for(var/obj/item/chromosome/CM in stored_chromosomes) - if(CM.can_apply(HM)) - chromosomes += CM - if(chromosomes.len) - var/obj/item/chromosome/CM = input("Select a chromosome to apply", "Apply Chromosome") as null|anything in sortNames(chromosomes) - if(CM) - to_chat(usr, "You apply [CM] to [HM.name].") - stored_chromosomes -= CM - CM.apply(HM) - if("expand_advinjector") - var/mutation = text2path(href_list["path"]) - var/datum/mutation/human/HM = get_valid_mutation(mutation) - if(HM && LAZYLEN(injector_selection)) - var/which_injector = input(usr, "Select Adv. Injector", "Advanced Injectors") as null|anything in injector_selection - if(injector_selection.Find(which_injector)) - var/list/true_selection = injector_selection[which_injector] - var/total_instability - for(var/B in true_selection) - var/datum/mutation/human/mootacion = B - total_instability += mootacion.instability - total_instability += HM.instability - if((total_instability > max_injector_instability) || (true_selection.len + 1) > max_injector_mutations) - to_chat(usr, "Adding more mutations would make the advanced injector too unstable!") - else - true_selection += HM //reminder that this works. because I keep forgetting this works - if("remove_from_advinjector") - var/mutation = text2path(href_list["path"]) - var/selection = href_list["injector"] - if(injector_selection.Find(selection)) - var/list/true_selection = injector_selection[selection] - for(var/B in true_selection) - var/datum/mutation/human/HM = B - if(HM.type == mutation) - true_selection -= HM - break - - if("remove_advinjector") - var/selection = href_list["injector"] - for(selection in injector_selection) - if(selection == selection) - injector_selection.Remove(selection) - - if("add_advinjector") - if(LAZYLEN(injector_selection) < max_injector_selections) - var/new_selection = stripped_input(usr, "Enter Adv. Injector name", "Advanced Injectors") - if(new_selection && !(new_selection in injector_selection)) - injector_selection[new_selection] = list() - - - - ui_interact(usr,last_change) - -/obj/machinery/computer/scan_consolenew/proc/scramble(input,rs,rd) //hexadecimal genetics. dont confuse with scramble button + return + + // Deletes saved mutation from disk buffer. + // ---------------------------------------------------------------------- // + // params["mutref"] - ATOM Ref of specific mutation to delete + if("delete_disk_mut") + // GUARD CHECK - This code shouldn't even be callable without a diskette + // inserted. Unexpected result + if(!diskette) + return + + // GUARD CHECK - Make sure the disk isn't set to read only, as we're + // attempting to write to it (via deletion) + if(diskette.read_only) + to_chat(usr,"Disk is set to read only mode.") + return + + var/bref = params["mutref"] + var/datum/mutation/human/HM = get_mut_by_ref(bref, SEARCH_DISKETTE) + + if(HM) + diskette.mutations.Remove(HM) + qdel(HM) + + return + + // Ejects a stored chromosome from the DNA Console + // ---------------------------------------------------------------------- // + // params["chromo"] - Text string of the chromosome name + if("eject_chromo") + var/chromname = params["chromo"] + + for(var/obj/item/chromosome/CM in stored_chromosomes) + if(chromname == CM.name) + CM.forceMove(drop_location()) + adjust_item_drop_location(CM) + stored_chromosomes -= CM + return + + return + + // Combines two mutations from the console to try and create a new mutation + // ---------------------------------------------------------------------- // + // params["firstref"] - ATOM Ref of first mutation for combination + // params["secondref"] - ATOM Ref of second mutation for combination + // mutation + if("combine_console") + // GUaRD CHECK - Make sure mutation storage isn't full. If it is, we won't + // be able to store the new combo mutation + if(LAZYLEN(stored_mutations) >= max_storage) + to_chat(usr,"Mutation storage is full.") + return + + // GUARD CHECK - We're running a research-type operation. If, for some + // reason, somehow the DNA Console has been disconnected from the research + // network - Or was never in it to begin with - don't proceed + if(!stored_research) + return + + var/first_bref = params["firstref"] + var/second_bref = params["secondref"] + + // GUARD CHECK - Find the source and destination mutations on the console + // and make sure they actually exist. + var/datum/mutation/human/source_mut = get_mut_by_ref(first_bref, SEARCH_STORED | SEARCH_DISKETTE) + if(!source_mut) + return + + var/datum/mutation/human/dest_mut = get_mut_by_ref(second_bref, SEARCH_STORED | SEARCH_DISKETTE) + if(!dest_mut) + return + + // Attempt to mix the two mutations to get a new type + var/result_path = get_mixed_mutation(source_mut.type, dest_mut.type) + + if(!result_path) + return + + // If we got a new type, add it to our storage + stored_mutations += new result_path() + to_chat(usr, "Success! New mutation has been added to console storage.") + + // If it's already discovered, end here. Otherwise, add it to the list of + // discovered mutations. + // We've already checked for stored_research earlier + if(result_path in stored_research.discovered_mutations) + return + + var/datum/mutation/human/HM = GET_INITIALIZED_MUTATION(result_path) + stored_research.discovered_mutations += result_path + say("Successfully mutated [HM.name].") + return + + // Combines two mutations from the disk to try and create a new mutation + // ---------------------------------------------------------------------- // + // params["firstref"] - ATOM Ref of first mutation for combination + // params["secondref"] - ATOM Ref of second mutation for combination + // mutation + if("combine_disk") + // GUARD CHECK - This code shouldn't even be callable without a diskette + // inserted. Unexpected result + if(!diskette) + return + + // GUARD CHECK - Make sure the disk is not full. + if(LAZYLEN(diskette.mutations) >= diskette.max_mutations) + to_chat(usr,"Disk storage is full.") + return + + // GUARD CHECK - Make sure the disk isn't set to read only, as we're + // attempting to write to it + if(diskette.read_only) + to_chat(usr,"Disk is set to read only mode.") + return + + // GUARD CHECK - We're running a research-type operation. If, for some + // reason, somehow the DNA Console has been disconnected from the research + // network - Or was never in it to begin with - don't proceed + if(!stored_research) + return + + var/first_bref = params["firstref"] + var/second_bref = params["secondref"] + + // GUARD CHECK - Find the source and destination mutations on the console + // and make sure they actually exist. + var/datum/mutation/human/source_mut = get_mut_by_ref(first_bref, SEARCH_STORED | SEARCH_DISKETTE) + if(!source_mut) + return + + var/datum/mutation/human/dest_mut = get_mut_by_ref(second_bref, SEARCH_STORED | SEARCH_DISKETTE) + if(!dest_mut) + return + + // Attempt to mix the two mutations to get a new type + var/result_path = get_mixed_mutation(source_mut.type, dest_mut.type) + + if(!result_path) + return + + // If we got a new type, add it to our storage + diskette.mutations += new result_path() + to_chat(usr, "Success! New mutation has been added to the disk.") + + // If it's already discovered, end here. Otherwise, add it to the list of + // discovered mutations + // We've already checked for stored_research earlier + if(result_path in stored_research.discovered_mutations) + return + + var/datum/mutation/human/HM = GET_INITIALIZED_MUTATION(result_path) + stored_research.discovered_mutations += result_path + say("Successfully mutated [HM.name].") + return + + // Sets the Genetic Makeup pulse strength. + // ---------------------------------------------------------------------- // + // params["val"] - New strength value as text string, converted to number + // later on in code + if("set_pulse_strength") + var/value = round(text2num(params["val"])) + radstrength = WRAP(value, 1, RADIATION_STRENGTH_MAX+1) + return + + // Sets the Genetic Makeup pulse duration + // ---------------------------------------------------------------------- // + // params["val"] - New strength value as text string, converted to number + // later on in code + if("set_pulse_duration") + var/value = round(text2num(params["val"])) + radduration = WRAP(value, 1, RADIATION_DURATION_MAX+1) + return + + // Saves Genetic Makeup information to disk + // ---------------------------------------------------------------------- // + // params["index"] - The BYOND index of the console genetic makeup buffer to + // copy to disk + if("save_makeup_disk") + // GUARD CHECK - This code shouldn't even be callable without a diskette + // inserted. Unexpected result + if(!diskette) + return + + // GUARD CHECK - Make sure the disk isn't set to read only, as we're + // attempting to write to it + if(diskette.read_only) + to_chat(usr,"Disk is set to read only mode.") + return + + // Convert the index to a number and clamp within the array range + var/buffer_index = text2num(params["index"]) + buffer_index = clamp(buffer_index, 1, NUMBER_OF_BUFFERS) + + var/list/buffer_slot = genetic_makeup_buffer[buffer_index] + + // GUARD CHECK - This should not be possible to activate on a buffer slot + // that doesn't have any genetic data. Unexpected result + if(!istype(buffer_slot)) + return + + diskette.genetic_makeup_buffer = buffer_slot.Copy() + return + + // Loads Genetic Makeup from disk to a console buffer + // ---------------------------------------------------------------------- // + // params["index"] - The BYOND index of the console genetic makeup buffer to + // copy to. Expected as text string, converted to number later + if("load_makeup_disk") + // GUARD CHECK - This code shouldn't even be callable without a diskette + // inserted. Unexpected result + if(!diskette) + return + + // GUARD CHECK - This should not be possible to activate on a diskette + // that doesn't have any genetic data. Unexpected result + if(LAZYLEN(diskette.genetic_makeup_buffer) == 0) + return + + // Convert the index to a number and clamp within the array range, then + // copy the data from the disk to that buffer + var/buffer_index = text2num(params["index"]) + buffer_index = clamp(buffer_index, 1, NUMBER_OF_BUFFERS) + genetic_makeup_buffer[buffer_index] = diskette.genetic_makeup_buffer.Copy() + return + + // Deletes genetic makeup buffer from the inserted diskette + if("del_makeup_disk") + // GUARD CHECK - This code shouldn't even be callable without a diskette + // inserted. Unexpected result + if(!diskette) + return + + // GUARD CHECK - Make sure the disk isn't set to read only, as we're + // attempting to write (via deletion) to it + if(diskette.read_only) + to_chat(usr,"Disk is set to read only mode.") + return + + diskette.genetic_makeup_buffer.Cut() + return + + // Saves the scanner occupant's genetic makeup to a given console buffer + // ---------------------------------------------------------------------- // + // params["index"] - The BYOND index of the console genetic makeup buffer to + // save the new genetic data to. Expected as text string, converted to + // number later + if("save_makeup_console") + // GUARD CHECK - Can we genetically modify the occupant? Includes scanner + // operational guard checks. + if(!can_modify_occupant()) + return + + // Convert the index to a number and clamp within the array range, then + // copy the data from the disk to that buffer + var/buffer_index = text2num(params["index"]) + buffer_index = clamp(buffer_index, 1, NUMBER_OF_BUFFERS) + + // Set the new information + genetic_makeup_buffer[buffer_index] = list( + "label"="Slot [buffer_index]:[scanner_occupant.real_name]", + "UI"=scanner_occupant.dna.uni_identity, + "UE"=scanner_occupant.dna.unique_enzymes, + "name"=scanner_occupant.real_name, + "blood_type"=scanner_occupant.dna.blood_type) + + return + + // Deleted genetic makeup data from a console buffer slot + // ---------------------------------------------------------------------- // + // params["index"] - The BYOND index of the console genetic makeup buffer to + // delete the genetic data from. Expected as text string, converted to + // number later + if("del_makeup_console") + // Convert the index to a number and clamp within the array range, then + // copy the data from the disk to that buffer + var/buffer_index = text2num(params["index"]) + buffer_index = clamp(buffer_index, 1, NUMBER_OF_BUFFERS) + var/list/buffer_slot = genetic_makeup_buffer[buffer_index] + + // GUARD CHECK - This shouldn't be possible to execute this on a null + // buffer. Unexpected resut + if(!istype(buffer_slot)) + return + + genetic_makeup_buffer[buffer_index] = null + return + + // Eject stored diskette from console + if("eject_disk") + eject_disk(usr) + return + + // Create a Genetic Makeup injector. These injectors are timed and thus are + // only temporary + // ---------------------------------------------------------------------- // + // params["index"] - The BYOND index of the console genetic makeup buffer to + // create the makeup injector from. Expected as text string, converted to + // number later + // params["type"] - Type of injector to create + // Expected results: + // "ue" - Unique Enzyme, changes name and blood type + // "ui" - Unique Identity, changes looks + // "mixed" - Combination of both ue and ui + if("makeup_injector") + // Convert the index to a number and clamp within the array range, then + // copy the data from the disk to that buffer + var/buffer_index = text2num(params["index"]) + buffer_index = clamp(buffer_index, 1, NUMBER_OF_BUFFERS) + var/list/buffer_slot = genetic_makeup_buffer[buffer_index] + + // GUARD CHECK - This shouldn't be possible to execute this on a null + // buffer. Unexpected resut + if(!istype(buffer_slot)) + return + + var/type = params["type"] + var/obj/item/dnainjector/timed/I + + switch(type) + if("ui") + // GUARD CHECK - There's currently no way to save partial genetic data. + // However, if this is the case, we can't make a complete injector and + // this catches that edge case + if(!buffer_slot["UI"]) + to_chat(usr,"Genetic data corrupted, unable to create injector.") + return + + I = new /obj/item/dnainjector/timed(loc) + I.fields = list("UI"=buffer_slot["UI"]) + + // If there is a connected scanner, we can use its upgrades to reduce + // the radiation generated by this injector + if(scanner_operational()) + I.damage_coeff = connected_scanner.damage_coeff + if("ue") + // GUARD CHECK - There's currently no way to save partial genetic data. + // However, if this is the case, we can't make a complete injector and + // this catches that edge case + if(!buffer_slot["name"] || !buffer_slot["UE"] || !buffer_slot["blood_type"]) + to_chat(usr,"Genetic data corrupted, unable to create injector.") + return + + I = new /obj/item/dnainjector/timed(loc) + I.fields = list("name"=buffer_slot["name"], "UE"=buffer_slot["UE"], "blood_type"=buffer_slot["blood_type"]) + + // If there is a connected scanner, we can use its upgrades to reduce + // the radiation generated by this injector + if(scanner_operational()) + I.damage_coeff = connected_scanner.damage_coeff + if("mixed") + // GUARD CHECK - There's currently no way to save partial genetic data. + // However, if this is the case, we can't make a complete injector and + // this catches that edge case + if(!buffer_slot["UI"] || !buffer_slot["name"] || !buffer_slot["UE"] || !buffer_slot["blood_type"]) + to_chat(usr,"Genetic data corrupted, unable to create injector.") + return + + I = new /obj/item/dnainjector/timed(loc) + I.fields = list("UI"=buffer_slot["UI"],"name"=buffer_slot["name"], "UE"=buffer_slot["UE"], "blood_type"=buffer_slot["blood_type"]) + + // If there is a connected scanner, we can use its upgrades to reduce + // the radiation generated by this injector + if(scanner_operational()) + I.damage_coeff = connected_scanner.damage_coeff + + // If we successfully created an injector, don't forget to set the new + // ready timer. + if(I) + injectorready = world.time + INJECTOR_TIMEOUT + + return + + // Applies a genetic makeup buffer to the scanner occupant + // ---------------------------------------------------------------------- // + // params["index"] - The BYOND index of the console genetic makeup buffer to + // apply to the scanner occupant. Expected as text string, converted to + // number later + // params["type"] - Type of genetic makeup copy to implement + // Expected results: + // "ue" - Unique Enzyme, changes name and blood type + // "ui" - Unique Identity, changes looks + // "mixed" - Combination of both ue and ui + if("makeup_apply") + // GUARD CHECK - Can we genetically modify the occupant? Includes scanner + // operational guard checks. + if(!can_modify_occupant()) + return + + // Convert the index to a number and clamp within the array range, then + // copy the data from the disk to that buffer + var/buffer_index = text2num(params["index"]) + buffer_index = clamp(buffer_index, 1, NUMBER_OF_BUFFERS) + var/list/buffer_slot = genetic_makeup_buffer[buffer_index] + + // GUARD CHECK - This shouldn't be possible to execute this on a null + // buffer. Unexpected resut + if(!istype(buffer_slot)) + return + + var/type = params["type"] + + apply_genetic_makeup(type, buffer_slot) + return + + // Applies a genetic makeup buffer to the next scanner occupant. This sets + // some code that will run when the connected DNA Scanner door is next + // closed + // This allows people to self-modify their genetic makeup, as tgui + // interfaces can not be accessed while inside the DNA Scanner and genetic + // makeup injectors are only temporary + // ---------------------------------------------------------------------- // + // params["index"] - The BYOND index of the console genetic makeup buffer to + // apply to the scanner occupant. Expected as text string, converted to + // number later + // params["type"] - Type of genetic makeup copy to implement + // Expected results: + // "ue" - Unique Enzyme, changes name and blood type + // "ui" - Unique Identity, changes looks + // "mixed" - Combination of both ue and ui + if("makeup_delay") + // Convert the index to a number and clamp within the array range, then + // copy the data from the disk to that buffer + var/buffer_index = text2num(params["index"]) + buffer_index = clamp(buffer_index, 1, NUMBER_OF_BUFFERS) + var/list/buffer_slot = genetic_makeup_buffer[buffer_index] + + // GUARD CHECK - This shouldn't be possible to execute this on a null + // buffer. Unexpected resut + if(!istype(buffer_slot)) + return + + var/type = params["type"] + + // Set the delayed action. The next time the scanner door is closed, + // unless this is cancelled in the UI, the action will happen + delayed_action = list("type" = type, "buffer_slot" = buffer_slot) + return + + // Attempts to modify the indexed element of the Unique Identity string + // This is a time delayed action that is handled in process() + // ---------------------------------------------------------------------- // + // params["index"] - The BYOND index of the Unique Identity string to + // attempt to modify + if("makeup_pulse") + // GUARD CHECK - Can we genetically modify the occupant? Includes scanner + // operational guard checks. + if(!can_modify_occupant()) + return + + // Set the appropriate timer and index to pulse. This is then managed + // later on in process() + var/len = length_char(scanner_occupant.dna.uni_identity) + rad_pulse_timer = world.time + (radduration*10) + rad_pulse_index = WRAP(text2num(params["index"]), 1, len+1) + START_PROCESSING(SSobj, src) + return + + // Cancels the delayed action - In this context it is not the radiation + // pulse from "makeup_pulse", which can not be cancelled. It is instead + // the delayed genetic transfer from "makeup_delay" + if("cancel_delay") + delayed_action = null + return + + // Creates a new advanced injector storage buffer in the console + // ---------------------------------------------------------------------- // + // params["name"] - The name to apply to the new injector + if("new_adv_inj") + // GUARD CHECK - Make sure we can make a new injector. This code should + // not be called if we're already maxed out and this is an Unexpected + // result + if(!(LAZYLEN(injector_selection) < max_injector_selections)) + return + + // GUARD CHECK - Sanitise and trim the proposed name. This prevents HTML + // injection and equivalent as tgui input is not stripped + var/inj_name = params["name"] + inj_name = trim(sanitize(inj_name)) + + // GUARD CHECK - If the name is null or blank, or the name is already in + // the list of advanced injectors, we want to reject it as we can't have + // duplicate named advanced injectors + if(!inj_name || (inj_name in injector_selection)) + return + + injector_selection[inj_name] = list() + return + + // Deleted an advanced injector storage buffer from the console + // ---------------------------------------------------------------------- // + // params["name"] - The name of the injector to delete + if("del_adv_inj") + var/inj_name = params["name"] + + // GUARD CHECK - If the name is null or blank, reject. + // GUARD CHECK - If the name isn't in the list of advanced injectors, we + // want to reject this as it shouldn't be possible ever do this. + // Unexpected result + if(!inj_name || !(inj_name in injector_selection)) + return + + injector_selection.Remove(inj_name) + return + + // Creates an injector from an advanced injector buffer + // ---------------------------------------------------------------------- // + // params["name"] - The name of the injector to print + if("print_adv_inj") + // As a side note, because mutations can contain unique metadata, + // this system uses BYOND Atom Refs to safely and accurately + // identify mutations from big ol' lists. + + // GUARD CHECK - Is the injector actually ready? + if(world.time < injectorready) + return + + var/inj_name = params["name"] + + // GUARD CHECK - If the name is null or blank, reject. + // GUARD CHECK - If the name isn't in the list of advanced injectors, we + // want to reject this as it shouldn't be possible ever do this. + // Unexpected result + if(!inj_name || !(inj_name in injector_selection)) + return + + var/list/injector = injector_selection[inj_name] + var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc) + + // Run through each mutation in our Advanced Injector and add them to a + // new injector + for(var/A in injector) + var/datum/mutation/human/HM = A + I.add_mutations += new HM.type(copymut=HM) + + // Force apply any mutations, this is functionality similar to mutators + I.doitanyway = TRUE + I.name = "Advanced [inj_name] injector" + + // If there's an operational connected scanner, we can use its upgrades + // to improve our injector's radiation generation + if(scanner_operational()) + I.damage_coeff = connected_scanner.damage_coeff + injectorready = world.time + INJECTOR_TIMEOUT * 8 * (1 - 0.1 * connected_scanner.precision_coeff) + else + injectorready = world.time + INJECTOR_TIMEOUT * 8 + + return + + // Adds a mutation to an advanced injector + // ---------------------------------------------------------------------- // + // params["mutref"] - ATOM Ref of specific mutation to add to the injector + // params["advinj"] - Name of the advanced injector to add the mutation to + if("add_advinj_mut") + // GUARD CHECK - Can we genetically modify the occupant? Includes scanner + // operational guard checks. + // This is needed because this operation can only be completed from the + // genetic sequencer. + if(!can_modify_occupant()) + return + + var/adv_inj = params["advinj"] + + // GUARD CHECK - Make sure our advanced injector actually exists. This + // should not be possible. Unexpected result + if(!(adv_inj in injector_selection)) + return + + // GUARD CHECK - Make sure we limit the number of mutations appropriately + if(LAZYLEN(injector_selection[adv_inj]) >= max_injector_mutations) + to_chat(usr,"Advanced injector mutation storage is full.") + return + + var/mut_source = params["source"] + var/search_flag = 0 + + switch(mut_source) + if("disk") + search_flag = SEARCH_DISKETTE + if("occupant") + search_flag = SEARCH_OCCUPANT + if("console") + search_flag = SEARCH_STORED + + if(!search_flag) + return + + var/bref = params["mutref"] + // We've already made sure we can modify the occupant, so this is safe to + // call + var/datum/mutation/human/HM = get_mut_by_ref(bref, search_flag) + + // GUARD CHECK - This should not be possible. Unexpected result + if(!HM) + return + + // We want to make sure we stick within the instability limit. + // We start with the instability of the mutation we're intending to add. + var/instability_total = HM.instability + + // We then add the instabilities of all other mutations in the injector, + // remembering to apply the Stabilizer chromosome modifiers + for(var/datum/mutation/human/I in injector_selection[adv_inj]) + instability_total += I.instability * GET_MUTATION_STABILIZER(I) + + // If this would take us over the max instability, we inform the user. + if(instability_total > max_injector_instability) + to_chat(usr,"Extra mutation would make the advanced injector too instable.") + return + + // If we've got here, all our checks are passed and we can successfully + // add the mutation to the advanced injector. + var/datum/mutation/human/A = new HM.type() + A.copy_mutation(HM) + injector_selection[adv_inj] += A + to_chat(usr,"Mutation successfully added to advanced injector.") + return + + // Deletes a mutation from an advanced injector + // ---------------------------------------------------------------------- // + // params["mutref"] - ATOM Ref of specific mutation to del from the injector + if("delete_injector_mut") + var/bref = params["mutref"] + + var/datum/mutation/human/HM = get_mut_by_ref(bref, SEARCH_ADV_INJ) + + // GUARD CHECK - This should not be possible. Unexpected result + if(!HM) + return + + // Check Advanced Injectors to find and remove the mutation + for(var/I in injector_selection) + var/list/injstuff = injector_selection["[I]"] + if(injstuff.Remove(HM)) + qdel(HM) + return + + return + + // Sets a new tgui view state + // ---------------------------------------------------------------------- // + // params["id"] - Key for the state to set + // params[...] - Every other element is used to set state variables + if("set_view") + for (var/key in params) + if(key == "src") + continue + tgui_view_state[key] = params[key] + return TRUE + return FALSE + +/** + * Applies the enzyme buffer to the current scanner occupant + * + * Applies the type of a specific genetic makeup buffer to the current scanner + * occupant + * + * Arguments: + * * type - "ui"/"ue"/"mixed" - Which part of the enzyme buffer to apply + * * buffer_slot - Index of the enzyme buffer to apply + */ +/obj/machinery/computer/scan_consolenew/proc/apply_genetic_makeup(type, buffer_slot) + // Note - This proc is only called from code that has already performed the + // necessary occupant guard checks. If you call this code yourself, please + // apply can_modify_occupant() or equivalent checks first. + + // Pre-calc the rad increase since we'll be using it in all the possible + // operations + var/rad_increase = rand(100/(connected_scanner.damage_coeff ** 2),250/(connected_scanner.damage_coeff ** 2)) + + switch(type) + if("ui") + // GUARD CHECK - There's currently no way to save partial genetic data. + // However, if this is the case, we can't make a complete injector and + // this catches that edge case + if(!buffer_slot["UI"]) + to_chat(usr,"Genetic data corrupted, unable to apply genetic data.") + return FALSE + scanner_occupant.dna.uni_identity = buffer_slot["UI"] + scanner_occupant.updateappearance(mutations_overlay_update=1) + scanner_occupant.radiation += rad_increase + scanner_occupant.domutcheck() + return TRUE + if("ue") + // GUARD CHECK - There's currently no way to save partial genetic data. + // However, if this is the case, we can't make a complete injector and + // this catches that edge case + if(!buffer_slot["name"] || !buffer_slot["UE"] || !buffer_slot["blood_type"]) + to_chat(usr,"Genetic data corrupted, unable to apply genetic data.") + return FALSE + scanner_occupant.real_name = buffer_slot["name"] + scanner_occupant.name = buffer_slot["name"] + scanner_occupant.dna.unique_enzymes = buffer_slot["UE"] + scanner_occupant.dna.blood_type = buffer_slot["blood_type"] + scanner_occupant.radiation += rad_increase + scanner_occupant.domutcheck() + return TRUE + if("mixed") + // GUARD CHECK - There's currently no way to save partial genetic data. + // However, if this is the case, we can't make a complete injector and + // this catches that edge case + if(!buffer_slot["UI"] || !buffer_slot["name"] || !buffer_slot["UE"] || !buffer_slot["blood_type"]) + to_chat(usr,"Genetic data corrupted, unable to apply genetic data.") + return FALSE + scanner_occupant.dna.uni_identity = buffer_slot["UI"] + scanner_occupant.updateappearance(mutations_overlay_update=1) + scanner_occupant.real_name = buffer_slot["name"] + scanner_occupant.name = buffer_slot["name"] + scanner_occupant.dna.unique_enzymes = buffer_slot["UE"] + scanner_occupant.dna.blood_type = buffer_slot["blood_type"] + scanner_occupant.radiation += rad_increase + scanner_occupant.domutcheck() + return TRUE + + return FALSE + +/** + * Checks if there is a connected DNA Scanner that is operational + */ +/obj/machinery/computer/scan_consolenew/proc/scanner_operational() + if(!connected_scanner) + return FALSE + + return (connected_scanner && connected_scanner.is_operational()) + +/** + * Checks if there is a valid DNA Scanner occupant for genetic modification + * + * Checks if there is a valid subject in the DNA Scanner that can be genetically + * modified. Will set the scanner occupant var as part of this check. + * Requires that the scanner can be operated and will return early if it can't + */ +/obj/machinery/computer/scan_consolenew/proc/can_modify_occupant() + // GUARD CHECK - We always want to perform the scanner operational check as + // part of checking if we can modify the occupant. + // We can never modify the occupant of a broken scanner. + if(!scanner_operational()) + return FALSE + + if(!connected_scanner.occupant) + return FALSE + + scanner_occupant = connected_scanner.occupant + + // Check validity of occupent for DNA Modification + // DNA Modification: + // requires DNA + // this DNA can not be bad + // is done via radiation bursts, so radiation immune carbons are not viable + // And the DNA Scanner itself must have a valid scan level + if(scanner_occupant.has_dna() && !HAS_TRAIT(scanner_occupant, TRAIT_RADIMMUNE) && !HAS_TRAIT(scanner_occupant, TRAIT_BADDNA) || (connected_scanner.scan_level == 3)) + return TRUE + + return FALSE + +/** + * Called by connected DNA Scanners when their doors close. + * + * Sets the new scanner occupant and completes delayed enzyme transfer if one + * is queued. + */ +/obj/machinery/computer/scan_consolenew/proc/on_scanner_close() + SIGNAL_HANDLER + // Set the appropriate occupant now the scanner is closed + if(connected_scanner.occupant) + scanner_occupant = connected_scanner.occupant + else + scanner_occupant = null + + // If we have a delayed action - In this case the only delayed action is + // applying a genetic makeup buffer the next time the DNA Scanner is closed - + // we want to perform it. + // GUARD CHECK - Make sure we can modify the occupant, apply_genetic_makeup() + // assumes we've already done this. + if(delayed_action && can_modify_occupant()) + var/type = delayed_action["type"] + var/buffer_slot = delayed_action["buffer_slot"] + if(apply_genetic_makeup(type, buffer_slot)) + to_chat(connected_scanner.occupant, "[src] activates!") + delayed_action = null + +/** + * Called by connected DNA Scanners when their doors open. + * + * Clears enzyme pulse operations, stops processing and nulls the current + * scanner occupant var. + */ +/obj/machinery/computer/scan_consolenew/proc/on_scanner_open() + SIGNAL_HANDLER + // If we had a radiation pulse action ongoing, we want to stop this. + // Imagine it being like a microwave stopping when you open the door. + rad_pulse_index = 0 + rad_pulse_timer = 0 + STOP_PROCESSING(SSobj, src) + scanner_occupant = null + +/** + * Builds the genetic makeup list which will be sent to tgui interface. + */ +/obj/machinery/computer/scan_consolenew/proc/build_genetic_makeup_list() + // No code will ever null this list, we can safely Cut it. + tgui_genetic_makeup.Cut() + + for(var/i=1, i <= NUMBER_OF_BUFFERS, i++) + if(genetic_makeup_buffer[i]) + tgui_genetic_makeup["[i]"] = genetic_makeup_buffer[i].Copy() + else + tgui_genetic_makeup["[i]"] = null + +/** + * Builds the genetic makeup list which will be sent to tgui interface. + * + * Will iterate over the connected scanner occupant, DNA Console, inserted + * diskette and chromosomes and any advanced injectors, building the main data + * structures which get passed to the tgui interface. + */ +/obj/machinery/computer/scan_consolenew/proc/build_mutation_list(can_modify_occ) + // No code will ever null these lists. We can safely Cut them. + tgui_occupant_mutations.Cut() + tgui_diskette_mutations.Cut() + tgui_console_mutations.Cut() + tgui_console_chromosomes.Cut() + tgui_advinjector_mutations.Cut() + + // ------------------------------------------------------------------------ // + // GUARD CHECK - Can we genetically modify the occupant? This check will have + // previously included checks to make sure the DNA Scanner is still + // operational + if(can_modify_occ) + // ---------------------------------------------------------------------- // + // Start cataloguing all mutations that the occupant has by default + for(var/mutation_type in scanner_occupant.dna.mutation_index) + var/datum/mutation/human/HM = GET_INITIALIZED_MUTATION(mutation_type) + + var/list/mutation_data = list() + var/text_sequence = scanner_occupant.dna.mutation_index[mutation_type] + var/default_sequence = scanner_occupant.dna.default_mutation_genes[mutation_type] + var/discovered = (stored_research && (mutation_type in stored_research.discovered_mutations)) + + mutation_data["Alias"] = HM.alias + mutation_data["Sequence"] = text_sequence + mutation_data["DefaultSeq"] = default_sequence + mutation_data["Discovered"] = discovered + mutation_data["Source"] = "occupant" + + // We only want to pass this information along to the tgui interface if + // the mutation has been discovered. Prevents people being able to cheese + // or "hack" their way to figuring out what undiscovered mutations are + if(discovered) + mutation_data["Name"] = HM.name + mutation_data["Description"] = HM.desc + mutation_data["Instability"] = HM.instability * GET_MUTATION_STABILIZER(HM) + mutation_data["Quality"] = HM.quality + + // Assume the mutation is normal unless assigned otherwise. + var/mut_class = MUT_NORMAL + + // Check if the mutation is currently activated. If it is, we can add even + // MORE information to send to tgui. + var/datum/mutation/human/A = scanner_occupant.dna.get_mutation(mutation_type) + if(A) + mutation_data["Active"] = TRUE + mutation_data["Scrambled"] = A.scrambled + mutation_data["Class"] = A.class + mut_class = A.class + mutation_data["CanChromo"] = A.can_chromosome + mutation_data["ByondRef"] = REF(A) + mutation_data["Type"] = A.type + if(A.can_chromosome) + mutation_data["ValidChromos"] = jointext(A.valid_chrom_list, ", ") + mutation_data["AppliedChromo"] = A.chromosome_name + mutation_data["ValidStoredChromos"] = build_chrom_list(A) + else + mutation_data["Active"] = FALSE + mutation_data["Scrambled"] = FALSE + mutation_data["Class"] = MUT_NORMAL + + // Technically NONE of these mutations should be MUT_EXTRA but this will + // catch any weird edge cases + // Assign icons by priority - MUT_EXTRA will ALSO be discovered, so it + // has a higher priority for icon/image assignment + if (mut_class == MUT_EXTRA) + mutation_data["Image"] = "dna_extra.gif" + else if(discovered) + mutation_data["Image"] = "dna_discovered.gif" + else + mutation_data["Image"] = "dna_undiscovered.gif" + + tgui_occupant_mutations += list(mutation_data) + + // ---------------------------------------------------------------------- // + // Now get additional/"extra" mutations that they shouldn't have by default + for(var/datum/mutation/human/HM in scanner_occupant.dna.mutations) + // If it's in the mutation index array, we've already catalogued this + // mutation and can safely skip over it. It really shouldn't be, but this + // will catch any weird edge cases + if(HM.type in scanner_occupant.dna.mutation_index) + continue + + var/list/mutation_data = list() + var/text_sequence = GET_SEQUENCE(HM.type) + + // These will all be active mutations. They're added by injector and their + // sequencing code can't be changed. They can only be nullified, which + // completely removes them. + var/datum/mutation/human/A = GET_INITIALIZED_MUTATION(HM.type) + + mutation_data["Alias"] = A.alias + mutation_data["Sequence"] = text_sequence + mutation_data["Discovered"] = TRUE + mutation_data["Quality"] = HM.quality + mutation_data["Source"] = "occupant" + + mutation_data["Name"] = HM.name + mutation_data["Description"] = HM.desc + mutation_data["Instability"] = HM.instability * GET_MUTATION_STABILIZER(HM) + + mutation_data["Active"] = TRUE + mutation_data["Scrambled"] = HM.scrambled + mutation_data["Class"] = HM.class + mutation_data["CanChromo"] = HM.can_chromosome + mutation_data["ByondRef"] = REF(HM) + mutation_data["Type"] = HM.type + + if(HM.can_chromosome) + mutation_data["ValidChromos"] = jointext(HM.valid_chrom_list, ", ") + mutation_data["AppliedChromo"] = HM.chromosome_name + mutation_data["ValidStoredChromos"] = build_chrom_list(HM) + + // Nothing in this list should be undiscovered. Technically nothing + // should be anything but EXTRA. But we're just handling some edge cases. + if (HM.class == MUT_EXTRA) + mutation_data["Image"] = "dna_extra.gif" + else + mutation_data["Image"] = "dna_discovered.gif" + + tgui_occupant_mutations += list(mutation_data) + + // ------------------------------------------------------------------------ // + // Build the list of mutations stored within the DNA Console + for(var/datum/mutation/human/HM in stored_mutations) + var/list/mutation_data = list() + + var/datum/mutation/human/A = GET_INITIALIZED_MUTATION(HM.type) + + mutation_data["Alias"] = A.alias + mutation_data["Name"] = HM.name + mutation_data["Source"] = "console" + mutation_data["Active"] = TRUE + mutation_data["Description"] = HM.desc + mutation_data["Instability"] = HM.instability * GET_MUTATION_STABILIZER(HM) + mutation_data["ByondRef"] = REF(HM) + mutation_data["Type"] = HM.type + + mutation_data["CanChromo"] = HM.can_chromosome + if(HM.can_chromosome) + mutation_data["ValidChromos"] = jointext(HM.valid_chrom_list, ", ") + mutation_data["AppliedChromo"] = HM.chromosome_name + mutation_data["ValidStoredChromos"] = build_chrom_list(HM) + + tgui_console_mutations += list(mutation_data) + + // ------------------------------------------------------------------------ // + // Build the list of chromosomes stored within the DNA Console + var/chrom_index = 1 + for(var/obj/item/chromosome/CM in stored_chromosomes) + var/list/chromo_data = list() + + chromo_data["Name"] = CM.name + chromo_data["Description"] = CM.desc + chromo_data["Index"] = chrom_index + + tgui_console_chromosomes += list(chromo_data) + ++chrom_index + + // ------------------------------------------------------------------------ // + // Build the list of mutations stored on any inserted diskettes + if(diskette) + for(var/datum/mutation/human/HM in diskette.mutations) + var/list/mutation_data = list() + + var/datum/mutation/human/A = GET_INITIALIZED_MUTATION(HM.type) + + mutation_data["Alias"] = A.alias + mutation_data["Name"] = HM.name + mutation_data["Active"] = TRUE + //mutation_data["Sequence"] = GET_SEQUENCE(HM.type) + mutation_data["Source"] = "disk" + mutation_data["Description"] = HM.desc + mutation_data["Instability"] = HM.instability * GET_MUTATION_STABILIZER(HM) + mutation_data["ByondRef"] = REF(HM) + mutation_data["Type"] = HM.type + + mutation_data["CanChromo"] = HM.can_chromosome + if(HM.can_chromosome) + mutation_data["ValidChromos"] = jointext(HM.valid_chrom_list, ", ") + mutation_data["AppliedChromo"] = HM.chromosome_name + mutation_data["ValidStoredChromos"] = build_chrom_list(HM) + + tgui_diskette_mutations += list(mutation_data) + + // ------------------------------------------------------------------------ // + // Build the list of mutations stored within any Advanced Injectors + if(LAZYLEN(injector_selection)) + for(var/I in injector_selection) + var/list/mutations = list() + for(var/datum/mutation/human/HM in injector_selection[I]) + var/list/mutation_data = list() + + var/datum/mutation/human/A = GET_INITIALIZED_MUTATION(HM.type) + + mutation_data["Alias"] = A.alias + mutation_data["Name"] = HM.name + mutation_data["Active"] = TRUE + //mutation_data["Sequence"] = GET_SEQUENCE(HM.type) + mutation_data["Source"] = "injector" + mutation_data["Description"] = HM.desc + mutation_data["Instability"] = HM.instability * GET_MUTATION_STABILIZER(HM) + mutation_data["ByondRef"] = REF(HM) + mutation_data["Type"] = HM.type + + if(HM.can_chromosome) + mutation_data["AppliedChromo"] = HM.chromosome_name + + mutations += list(mutation_data) + tgui_advinjector_mutations += list(list( + "name" = "[I]", + "mutations" = mutations, + )) + +/** + * Takes any given chromosome and calculates chromosome compatibility + * + * Will iterate over the stored chromosomes in the DNA Console and will check + * whether it can be applied to the supplied mutation. Then returns a list of + * names of chromosomes that were compatible. + * + * Arguments: + * * mutation - The mutation to check chromosome compatibility with + */ +/obj/machinery/computer/scan_consolenew/proc/build_chrom_list(mutation) + var/list/chromosomes = list() + + for(var/obj/item/chromosome/CM in stored_chromosomes) + if(CM.can_apply(mutation)) + chromosomes += CM.name + + return chromosomes + + +/** + * Checks whether a mutation alias has been discovered + * + * Checks whether a given mutation's genetic sequence has been completed and + * discovers it if appropriate + * + * Arguments: + * * alias - Alias of the mutation to check (ie "Mutation 51" or "Mutation 12") + */ +/obj/machinery/computer/scan_consolenew/proc/check_discovery(alias) + // Note - All code paths that call this have already done checks on the + // current occupant to prevent cheese and other abuses. If you call this + // proc please also do the following checks first: + // if(!can_modify_occupant()) + // return + // if(!(scanner_occupant == connected_scanner.occupant)) + // return + + // Turn the alias ("Mutation 1", "Mutation 35") into a mutation path + var/path = GET_MUTATION_TYPE_FROM_ALIAS(alias) + + // Check to see if this mutation is in the active mutation list. If it isn't, + // then the mutation isn't eligible for discovery. If it is but is scrambled, + // then the mutation isn't eligible for discovery. Finally, check if the + // mutation is in discovered mutations - If it isn't, add it to discover. + var/datum/mutation/human/M = scanner_occupant.dna.get_mutation(path) + if(!M) + return FALSE + if(M.scrambled) + return FALSE + if(stored_research && !(path in stored_research.discovered_mutations)) + var/datum/mutation/human/HM = GET_INITIALIZED_MUTATION(path) + stored_research.discovered_mutations += path + say("Successfully discovered [HM.name].") + return TRUE + + return FALSE + +/** + * Find a mutation from various storage locations via ATOM ref + * + * Takes an ATOM Ref and searches the appropriate mutation buffers and storage + * vars to try and find the associated mutation. + * + * Arguments: + * * ref - ATOM ref of the mutation to locate + * * target_flags - Flags for storage mediums to search, see #defines + */ +/obj/machinery/computer/scan_consolenew/proc/get_mut_by_ref(ref, target_flags) + var/mutation + + // Assume the occupant is valid and the check has been carried out before + // calling this proc with the relevant flags. + if(target_flags & SEARCH_OCCUPANT) + mutation = (locate(ref) in scanner_occupant.dna.mutations) + if(mutation) + return mutation + + if(target_flags & SEARCH_STORED) + mutation = (locate(ref) in stored_mutations) + if(mutation) + return mutation + + if(diskette && (target_flags & SEARCH_DISKETTE)) + mutation = (locate(ref) in diskette.mutations) + if(mutation) + return mutation + + if(injector_selection && (target_flags & SEARCH_ADV_INJ)) + for(var/I in injector_selection) + mutation = (locate(ref) in injector_selection["[I]"]) + if(mutation) + return mutation + + return null + +/** + * Creates a randomised accuracy value for the enzyme pulse functionality. + * + * Donor code from previous DNA Console iteration. + * + * Arguments: + * * position - Index of the intended enzyme element to pulse + * * radduration - Duration of intended radiation pulse + * * number_of_blocks - Number of individual data blocks in the pulsed enzyme + */ +/obj/machinery/computer/scan_consolenew/proc/randomize_radiation_accuracy(position, radduration, number_of_blocks) + var/val = round(gaussian(0, RADIATION_ACCURACY_MULTIPLIER/radduration) + position, 1) + return WRAP(val, 1, number_of_blocks+1) + +/** + * Scrambles an enzyme element value for the enzyme pulse functionality. + * + * Donor code from previous DNA Console iteration. + * + * Arguments: + * * input - Enzyme identity element to scramble, expected hex value + * * rs - Strength of radiation pulse, increases the range of possible outcomes + */ +/obj/machinery/computer/scan_consolenew/proc/scramble(input,rs) var/length = length(input) var/ran = gaussian(0, rs*RADIATION_STRENGTH_MULTIPLIER) if(ran == 0) @@ -958,98 +1928,71 @@ ran = -round(-ran) //positive, so ceiling it return num2hex(WRAP(hex2num(input)+ran, 0, 16**length), length) -/obj/machinery/computer/scan_consolenew/proc/randomize_radiation_accuracy(position, radduration, number_of_blocks) - var/val = round(gaussian(0, RADIATION_ACCURACY_MULTIPLIER/radduration) + position, 1) - return WRAP(val, 1, number_of_blocks+1) +/** + * Performs the enzyme radiation pulse. + * + * Donor code from previous DNA Console iteration. Called from process() when + * there is a radiation pulse in progress. Ends processing. + */ +/obj/machinery/computer/scan_consolenew/proc/rad_pulse() + // GUARD CHECK - Can we genetically modify the occupant? Includes scanner + // operational guard checks. + // If we can't, abort the procedure. + if(!can_modify_occupant()) + rad_pulse_index = 0 + STOP_PROCESSING(SSobj, src) + return -/obj/machinery/computer/scan_consolenew/proc/get_viable_occupant() - var/mob/living/carbon/viable_occupant = null - if(connected) - viable_occupant = connected.occupant - if(!istype(viable_occupant) || !viable_occupant.dna || HAS_TRAIT(viable_occupant, TRAIT_RADIMMUNE) || HAS_TRAIT(viable_occupant, TRAIT_BADDNA)) - viable_occupant = null - return viable_occupant - -/obj/machinery/computer/scan_consolenew/proc/apply_buffer(action,buffer_num) - 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)) - viable_occupant.radiation += rand(100/(connected.damage_coeff ** 2),250/(connected.damage_coeff ** 2)) - //15 and 40 are just magic numbers that were here before so i didnt touch them, they are initial boundaries of damage - //Each laser level reduces damage by lvl^2, so no effect on 1 lvl, 4 times less damage on 2 and 9 times less damage on 3 - //Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove - switch(action) - if(SCANNER_ACTION_UI) - if(buffer_slot["UI"]) - viable_occupant.dna.uni_identity = buffer_slot["UI"] - viable_occupant.updateappearance(mutations_overlay_update=1) - if(SCANNER_ACTION_UE) - if(buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["blood_type"]) - viable_occupant.real_name = buffer_slot["name"] - viable_occupant.name = buffer_slot["name"] - viable_occupant.dna.unique_enzymes = buffer_slot["UE"] - viable_occupant.dna.blood_type = buffer_slot["blood_type"] - if(SCANNER_ACTION_MIXED) - if(buffer_slot["UI"]) - viable_occupant.dna.uni_identity = buffer_slot["UI"] - viable_occupant.updateappearance(mutations_overlay_update=1) - if(buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["blood_type"]) - viable_occupant.real_name = buffer_slot["name"] - viable_occupant.name = buffer_slot["name"] - viable_occupant.dna.unique_enzymes = buffer_slot["UE"] - viable_occupant.dna.blood_type = buffer_slot["blood_type"] + var/len = length_char(scanner_occupant.dna.uni_identity) + var/num = randomize_radiation_accuracy(rad_pulse_index, radduration + (connected_scanner.precision_coeff ** 2), len) //Each manipulator level above 1 makes randomization as accurate as selected time + manipulator lvl^2 //Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low + var/hex = copytext_char(scanner_occupant.dna.uni_identity, num, num+1) + hex = scramble(hex, radstrength, radduration) + + scanner_occupant.dna.uni_identity = copytext_char(scanner_occupant.dna.uni_identity, 1, num) + hex + copytext_char(scanner_occupant.dna.uni_identity, num + 1) + scanner_occupant.updateappearance(mutations_overlay_update=1) + + rad_pulse_index = 0 + STOP_PROCESSING(SSobj, src) + return + +/** + * Sets the default state for the tgui interface. + */ +/obj/machinery/computer/scan_consolenew/proc/set_default_state() + tgui_view_state["consoleMode"] = "storage" + tgui_view_state["storageMode"] = "console" + tgui_view_state["storageConsSubMode"] = "mutations" + tgui_view_state["storageDiskSubMode"] = "mutations" + +/** + * Ejects the DNA Disk from the console. + * + * Will insert into the user's hand if possible, otherwise will drop it at the + * console's location. + * + * Arguments: + * * user - The mob that is attempting to eject the diskette. + */ +/obj/machinery/computer/scan_consolenew/proc/eject_disk(mob/user) + // Check for diskette. + if(!diskette) + return -/obj/machinery/computer/scan_consolenew/proc/on_scanner_close() - if(delayed_action && get_viable_occupant()) - to_chat(connected.occupant, "[src] activates!") - apply_buffer(delayed_action["action"],delayed_action["buffer"]) - delayed_action = null //or make it stick + reset button ? - -/obj/machinery/computer/scan_consolenew/proc/get_valid_mutation(mutation) - var/mob/living/carbon/C = get_viable_occupant() - if(C) - var/datum/mutation/human/HM = C.dna.get_mutation(mutation) - if(HM) - return HM - for(var/datum/mutation/human/A in stored_mutations) - if(A.type == mutation) - return A - - -/obj/machinery/computer/scan_consolenew/proc/get_mutation_list(include_storage) //Returns a list of the mutation index types and any extra mutations - var/mob/living/carbon/viable_occupant = get_viable_occupant() - var/list/paths = list() - if(viable_occupant) - for(var/A in viable_occupant.dna.mutation_index) - paths += A - for(var/datum/mutation/human/A in viable_occupant.dna.mutations) - if(A.class == MUT_EXTRA) - paths += A.type - if(include_storage) - for(var/datum/mutation/human/A in stored_mutations) - paths += A.type - return paths - -/obj/machinery/computer/scan_consolenew/proc/get_valid_gene_string(mutation) - var/mob/living/carbon/C = get_viable_occupant() - if(C && (mutation in C.dna.mutation_index)) - return GET_GENE_STRING(mutation, C.dna) - else if(C && (LAZYLEN(C.dna.mutations))) - for(var/datum/mutation/human/A in C.dna.mutations) - if(A.type == mutation) - return GET_SEQUENCE(mutation) - for(var/datum/mutation/human/A in stored_mutations) - if(A.type == mutation) - return GET_SEQUENCE(mutation) - -/obj/machinery/computer/scan_consolenew/proc/discover(mutation) - if(stored_research && !(mutation in stored_research.discovered_mutations)) - stored_research.discovered_mutations += mutation - return TRUE + to_chat(user, "You eject [diskette] from [src].") + + // Reset the state to console storage. + tgui_view_state["storageMode"] = "console" + + // If the disk shouldn't pop into the user's hand for any reason, drop it on the console instead. + if(!istype(user) || !Adjacent(user) || !user.put_in_active_hand(diskette)) + diskette.forceMove(drop_location()) + diskette = null /////////////////////////// DNA MACHINES #undef INJECTOR_TIMEOUT #undef NUMBER_OF_BUFFERS +#undef SCRAMBLE_TIMEOUT +#undef JOKER_TIMEOUT +#undef JOKER_UPGRADE #undef RADIATION_STRENGTH_MAX #undef RADIATION_STRENGTH_MULTIPLIER @@ -1059,11 +2002,9 @@ #undef RADIATION_IRRADIATION_MULTIPLIER -#undef SCANNER_ACTION_SE -#undef SCANNER_ACTION_UI -#undef SCANNER_ACTION_UE -#undef SCANNER_ACTION_MIXED +#undef STATUS_TRANSFORMING -//#undef BAD_MUTATION_DIFFICULTY -//#undef GOOD_MUTATION_DIFFICULTY -//#undef OP_MUTATION_DIFFICULTY +#undef SEARCH_OCCUPANT +#undef SEARCH_STORED +#undef SEARCH_DISKETTE +#undef SEARCH_ADV_INJ diff --git a/code/game/machinery/computer/launchpad_control.dm b/code/game/machinery/computer/launchpad_control.dm index 35be677783902..74967e981d232 100644 --- a/code/game/machinery/computer/launchpad_control.dm +++ b/code/game/machinery/computer/launchpad_control.dm @@ -27,13 +27,26 @@ if(M.buffer && istype(M.buffer, /obj/machinery/launchpad)) if(LAZYLEN(launchpads) < maximum_pads) launchpads |= M.buffer + RegisterSignal(M.buffer, COMSIG_PARENT_QDELETING, .proc/launchpad_deleted) M.buffer = null + ui_update() to_chat(user, "You upload the data from the [W.name]'s buffer.") else to_chat(user, "[src] cannot handle any more connections!") else return ..() +/obj/machinery/computer/launchpad/proc/launchpad_deleted(datum/source) + SIGNAL_HANDLER + var/source_id = launchpads.Find(source) + if(source_id && selected_id) + if(selected_id > source_id) + selected_id-- + else if(selected_id == source_id) + selected_id = null + launchpads -= source + ui_update() + /obj/machinery/computer/launchpad/proc/pad_exists(number) var/obj/machinery/launchpad/pad = launchpads[number] if(QDELETED(pad)) @@ -115,11 +128,11 @@ ) . = TRUE if("rename") - . = TRUE var/new_name = params["name"] if(!new_name) return current_pad.display_name = new_name + . = TRUE if("remove") if(usr && alert(usr, "Are you sure?", "Unlink Launchpad", "I'm Sure", "Abort") != "Abort") launchpads -= current_pad @@ -132,4 +145,3 @@ if("pull") teleport(usr, current_pad, FALSE) . = TRUE - . = TRUE diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 0b2b873f100e6..b868fd6d9d546 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -21,7 +21,8 @@ current = null return var/turf/currentloc = get_turf(current) - if(currentloc && user.z != currentloc.z) + var/turf/user_turf = get_turf(user) + if(currentloc && user.get_virtual_z_level() != currentloc.get_virtual_z_level() && (!is_station_level(currentloc.z) || !is_station_level(user_turf.z))) to_chat(user, "Upload failed! Unable to establish a connection to [current.name]. You're too far away!") current = null return diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 646d662003535..c5d71a1ff3f85 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -169,7 +169,7 @@ dat += "
    Medical Robots:" var/bdat = null for(var/mob/living/simple_animal/bot/medbot/M in GLOB.alive_mob_list) - if(M.z != src.z) + if(M.get_virtual_z_level() != src.get_virtual_z_level()) continue //only find medibots on the same z-level as the computer var/turf/bl = get_turf(M) if(bl) //if it can't find a turf for the medibot, then it probably shouldn't be showing up @@ -271,7 +271,7 @@

    Notes: [Dis.desc]
    -
    Severity: [Dis.severity]"} +
    Danger: [Dis.danger]"} else if(href_list["del_all"]) src.temp = "Are you sure you wish to delete all records?
    \n\tYes
    \n\tNo
    " @@ -590,4 +590,5 @@ icon_screen = "medlaptop" icon_keyboard = "laptop_key" clockwork = TRUE //it'd look weird + broken_overlay_emissive = TRUE pass_flags = PASSTABLE diff --git a/code/game/machinery/computer/prisoner/_prisoner.dm b/code/game/machinery/computer/prisoner/_prisoner.dm index 743950c4a5bfb..ccc27734a3bb8 100644 --- a/code/game/machinery/computer/prisoner/_prisoner.dm +++ b/code/game/machinery/computer/prisoner/_prisoner.dm @@ -16,7 +16,6 @@ /obj/machinery/computer/prisoner/AltClick(mob/user) id_eject(user) - return ..() /obj/machinery/computer/prisoner/proc/id_insert(mob/user, obj/item/card/id/prisoner/P) if(istype(P)) diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm index 7129e3d762dbf..bd9636e182923 100644 --- a/code/game/machinery/computer/prisoner/gulag_teleporter.dm +++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm @@ -30,6 +30,7 @@ if(!ui) ui = new(user, src, "GulagTeleporterConsole") ui.open() + ui.set_autoupdate(TRUE) /obj/machinery/computer/prisoner/gulag_teleporter_computer/ui_data(mob/user) var/list/data = list() @@ -53,14 +54,14 @@ if(teleporter) data["teleporter"] = teleporter - data["teleporter_location"] = "([teleporter.x], [teleporter.y], [teleporter.z])" + data["teleporter_location"] = "([teleporter.x], [teleporter.y], [teleporter.get_virtual_z_level()])" data["teleporter_lock"] = teleporter.locked data["teleporter_state_open"] = teleporter.state_open else data["teleporter"] = null if(beacon) data["beacon"] = beacon - data["beacon_location"] = "([beacon.x], [beacon.y], [beacon.z])" + data["beacon_location"] = "([beacon.x], [beacon.y], [beacon.get_virtual_z_level()])" else data["beacon"] = null if(contained_id) @@ -74,10 +75,10 @@ return data /obj/machinery/computer/prisoner/gulag_teleporter_computer/ui_act(action, list/params) - if(isliving(usr)) - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) if(..()) return + if(isliving(usr)) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) if(!allowed(usr)) to_chat(usr, "Access denied.") return @@ -147,13 +148,11 @@ log_game("[key_name(user)] teleported [key_name(prisoner)] to the Labor Camp [COORD(beacon)] for [id_goal_not_set ? "default goal of ":""][contained_id.goal] points.") teleporter.handle_prisoner(contained_id, temporary_record) playsound(src, 'sound/weapons/emitter.ogg', 50, TRUE) - prisoner.forceMove(get_turf(beacon)) - prisoner.Paralyze(40) // small travel dizziness - to_chat(prisoner, "The teleportation makes you a little dizzy.") - new /obj/effect/particle_effect/sparks(get_turf(prisoner)) - playsound(src, "sparks", 50, TRUE) - if(teleporter.locked) - teleporter.locked = FALSE - teleporter.toggle_open() - contained_id = null - temporary_record = null + if(do_teleport(prisoner, get_turf(beacon))) + prisoner.Paralyze(40) // small travel dizziness + to_chat(prisoner, "The teleportation makes you a little dizzy.") + if(teleporter.locked) + teleporter.locked = FALSE + teleporter.toggle_open() + contained_id = null + temporary_record = null diff --git a/code/game/machinery/computer/prisoner/management.dm b/code/game/machinery/computer/prisoner/management.dm index 4346ae84f6117..fb9f9694b6505 100644 --- a/code/game/machinery/computer/prisoner/management.dm +++ b/code/game/machinery/computer/prisoner/management.dm @@ -35,7 +35,7 @@ var/turf/Tr = null for(var/obj/item/implant/chem/C in GLOB.tracked_chem_implants) Tr = get_turf(C) - if((Tr) && (Tr.z != src.z)) + if((Tr) && (Tr.get_virtual_z_level() != src.get_virtual_z_level())) continue//Out of range if(!C.imp_in) continue @@ -50,7 +50,7 @@ if(!isliving(T.imp_in)) continue Tr = get_turf(T) - if((Tr) && (Tr.z != src.z)) + if((Tr) && (Tr.get_virtual_z_level() != src.get_virtual_z_level())) continue//Out of range var/loc_display = "Unknown" diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 584bf92a62d94..a1326924b71f7 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -32,6 +32,7 @@ if(!ui) ui = new(user, src, "RoboticsControlConsole") ui.open() + ui.set_autoupdate(TRUE) /obj/machinery/computer/robotics/ui_data(mob/user) var/list/data = list() @@ -48,7 +49,7 @@ for(var/mob/living/silicon/robot/R in GLOB.silicon_mobs) if(!can_control(user, R)) continue - if(z != (get_turf(R)).z) + if(get_virtual_z_level() != (get_turf(R)).get_virtual_z_level()) continue var/list/cyborg_data = list( name = R.name, @@ -66,7 +67,7 @@ for(var/mob/living/simple_animal/drone/D in GLOB.drones_list) if(D.hacked) continue - if(z != (get_turf(D)).z) + if(get_virtual_z_level() != (get_turf(D)).get_virtual_z_level()) continue var/list/drone_data = list( name = D.name, @@ -89,6 +90,8 @@ var/turf/T = get_turf(R) message_admins("[ADMIN_LOOKUPFLW(usr)] detonated [key_name_admin(R, R.client)] at [ADMIN_VERBOSEJMP(T)]!") log_game("\[key_name(usr)] detonated [key_name(R)]!") + log_combat(usr, R, "detonated cyborg") + if(R.connected_ai) to_chat(R.connected_ai, "

    ALERT - Cyborg detonation detected: [R.name]
    ") R.self_destruct() @@ -100,6 +103,7 @@ if(can_control(usr, R) && !..()) message_admins("[ADMIN_LOOKUPFLW(usr)] [!R.lockcharge ? "locked down" : "released"] [ADMIN_LOOKUPFLW(R)]!") log_game("[key_name(usr)] [!R.lockcharge ? "locked down" : "released"] [key_name(R)]!") + log_combat(usr, R, "[!R.lockcharge ? "locked down" : "released"] cyborg") R.SetLockdown(!R.lockcharge) to_chat(R, "[!R.lockcharge ? "Your lockdown has been lifted!" : "You have been locked down!"]") if(R.connected_ai) @@ -126,5 +130,5 @@ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(3, TRUE, D) s.start() - D.visible_message("\the [D] self destructs!") + D.visible_message("\the [D] self-destructs!") D.gib() diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 61aaf71181552..cbd3a10f619e6 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -3,7 +3,7 @@ desc = "Used to view and edit personnel's security records." icon_screen = "security" icon_keyboard = "security_key" - req_one_access = list(ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS) + req_one_access = list(ACCESS_SEC_RECORDS) circuit = /obj/item/circuitboard/computer/secure_data var/obj/item/card/id/scan = null var/authenticated = null @@ -22,6 +22,181 @@ var/order = 1 // -1 = Descending - 1 = Ascending light_color = LIGHT_COLOR_RED +/obj/machinery/computer/secure_data/Initialize(mapload, obj/item/circuitboard/C) + . = ..() + AddComponent(/datum/component/usb_port, list( + /obj/item/circuit_component/arrest_console_data, + /obj/item/circuit_component/arrest_console_arrest, + )) + +/obj/item/circuit_component/arrest_console_data + display_name = "Security Records Data" + display_desc = "Outputs the security records data, where it can then be filtered with a Select Query component" + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + /// The records retrieved + var/datum/port/output/records + + /// Sends a signal on failure + var/datum/port/output/on_fail + + var/obj/machinery/computer/secure_data/attached_console + +/obj/item/circuit_component/arrest_console_data/Initialize() + . = ..() + records = add_output_port("Security Records", PORT_TYPE_TABLE) + on_fail = add_output_port("Failed", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/arrest_console_data/Destroy() + records = null + on_fail = null + return ..() + + +/obj/item/circuit_component/arrest_console_data/register_usb_parent(atom/movable/parent) + . = ..() + if(istype(parent, /obj/machinery/computer/secure_data)) + attached_console = parent + +/obj/item/circuit_component/arrest_console_data/unregister_usb_parent(atom/movable/parent) + attached_console = null + return ..() + +/obj/item/circuit_component/arrest_console_data/get_ui_notices() + . = ..() + . += create_table_notices(list( + "name", + "id", + "rank", + "arrest_status", + "gender", + "age", + "species", + "fingerprint", + )) + + +/obj/item/circuit_component/arrest_console_data/input_received(datum/port/input/port) + . = ..() + if(.) + return + + if(!attached_console || !attached_console.authenticated) + on_fail.set_output(COMPONENT_SIGNAL) + return + + if(isnull(GLOB.data_core.general)) + on_fail.set_output(COMPONENT_SIGNAL) + return + + var/list/new_table = list() + for(var/datum/data/record/player_record as anything in GLOB.data_core.general) + var/list/entry = list() + var/datum/data/record/player_security_record = find_record("id", player_record.fields["id"], GLOB.data_core.security) + if(player_security_record) + entry["arrest_status"] = player_security_record.fields["criminal"] + entry["security_record"] = player_security_record + entry["name"] = player_record.fields["name"] + entry["id"] = player_record.fields["id"] + entry["rank"] = player_record.fields["rank"] + entry["gender"] = player_record.fields["gender"] + entry["age"] = player_record.fields["age"] + entry["species"] = player_record.fields["species"] + entry["fingerprint"] = player_record.fields["fingerprint"] + + new_table += list(entry) + + records.set_output(new_table) + +/obj/item/circuit_component/arrest_console_arrest + display_name = "Security Records Set Status" + display_desc = "Receives a table to use to set people's arrest status. Table should be from the security records data component. If New Status port isn't set, the status will be decided by the options." + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + /// The targets to set the status of. + var/datum/port/input/targets + + /// Sets the new status of the targets. If set to null, the status is taken from the options. + var/datum/port/input/new_status + + /// Returns the new status set once the setting is complete. Good for locating errors. + var/datum/port/output/new_status_set + + /// Sends a signal on failure + var/datum/port/output/on_fail + + var/obj/machinery/computer/secure_data/attached_console + +/obj/item/circuit_component/arrest_console_arrest/register_usb_parent(atom/movable/parent) + . = ..() + if(istype(parent, /obj/machinery/computer/secure_data)) + attached_console = parent + +/obj/item/circuit_component/arrest_console_arrest/unregister_usb_parent(atom/movable/parent) + attached_console = null + return ..() + +/obj/item/circuit_component/arrest_console_arrest/populate_options() + var/static/list/component_options = list( + COMP_STATE_ARREST, + COMP_STATE_PRISONER, + COMP_STATE_PAROL, + COMP_STATE_DISCHARGED, + COMP_STATE_NONE, + ) + options = component_options + +/obj/item/circuit_component/arrest_console_arrest/Initialize() + . = ..() + targets = add_input_port("Targets", PORT_TYPE_TABLE) + new_status = add_input_port("New Status", PORT_TYPE_STRING) + new_status_set = add_output_port("Set Status", PORT_TYPE_STRING) + on_fail = add_output_port("Failed", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/arrest_console_arrest/Destroy() + targets = null + new_status = null + new_status_set = null + on_fail = null + return ..() + +/obj/item/circuit_component/arrest_console_arrest/input_received(datum/port/input/port) + . = ..() + if(.) + return + + if(!attached_console || !attached_console.authenticated) + on_fail.set_output(COMPONENT_SIGNAL) + return + + var/status_to_set = new_status.input_value + if(!status_to_set || !(status_to_set in options)) + status_to_set = current_option + + new_status_set.set_output(status_to_set) + var/list/target_table = targets.input_value + if(!target_table) + on_fail.set_output(COMPONENT_SIGNAL) + return + + var/successful_set = 0 + var/list/names_of_entries = list() + for(var/list/target in target_table) + var/datum/data/record/sec_record = target["security_record"] + if(!sec_record) + continue + + successful_set++ + sec_record.fields["criminal"] = status_to_set + names_of_entries += target["name"] + + if(successful_set > 0) + investigate_log("[names_of_entries.Join(", ")] have been set to [status_to_set] by [parent.get_creator()].", INVESTIGATE_RECORDS) + if(successful_set > COMP_SECURITY_ARREST_AMOUNT_TO_FLAG) + message_admins("[successful_set] security entries have been set to [status_to_set] by [parent.get_creator_admin()]. [ADMIN_COORDJMP(src)]") + for(var/mob/living/carbon/human/human as anything in GLOB.carbon_list) + human.sec_hud_set_security_status() + /obj/machinery/computer/secure_data/examine(mob/user) . = ..() if(scan) @@ -37,6 +212,7 @@ icon_screen = "seclaptop" icon_keyboard = "laptop_key" clockwork = TRUE //it'd look weird + broken_overlay_emissive = TRUE pass_flags = PASSTABLE /obj/machinery/computer/secure_data/attackby(obj/item/O, mob/user, params) @@ -146,10 +322,14 @@ crimstat = E.fields["criminal"] var/background switch(crimstat) - if("*Arrest*") + if("Arrest") background = "'background-color:#990000;'" if("Incarcerated") - background = "'background-color:#CD6500;'" + background = "'background-color:#EB4823;'" + if("Search") + background = "'background-color:#9B13EB;'" + if("Monitor") + background = "'background-color:#990000;'" if("Paroled") background = "'background-color:#CD6500;'" if("Discharged") @@ -230,33 +410,13 @@ else dat += "All Paid Off" dat += {" - \[X\] + \[X\] "} dat += "" - dat += "

    Minor Crimes: Add New" - - - dat +={" - - - - - - - "} - for(var/datum/data/crime/c in active2.fields["mi_crim"]) - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "
    CrimeDetailsAuthorTime AddedDel
    [c.crimeName][c.crimeDetails][c.author][c.time]\[X\]
    " - + dat += "

    Crimes: Add New" - dat += "
    Major Crimes: Add New" dat +={" @@ -266,12 +426,15 @@ "} - for(var/datum/data/crime/c in active2.fields["ma_crim"]) + for(var/datum/data/crime/c in active2.fields["crim"]) dat += "" - dat += "" + if(!c.crimeDetails) + dat += "" + else + dat += "" dat += "" dat += "" - dat += "" + dat += "" dat += "" dat += "
    Time Added Del
    [c.crimeName][c.crimeDetails]\[+\][c.crimeDetails][c.author][c.time]\[X\]\[X\]
    " @@ -417,23 +580,7 @@ What a mess.*/ if((istype(active2, /datum/data/record) && GLOB.data_core.security.Find(active2))) P.info += text("
    \n
    Security Data

    \nCriminal Status: []", active2.fields["criminal"]) - P.info += "
    \n
    \nMinor Crimes:
    \n" - P.info +={" - - - - - -"} - for(var/datum/data/crime/c in active2.fields["mi_crim"]) - P.info += "" - P.info += "" - P.info += "" - P.info += "" - P.info += "" - P.info += "
    CrimeDetailsAuthorTime Added
    [c.crimeName][c.crimeDetails][c.author][c.time]
    " - - P.info += "
    \nMajor Crimes:
    \n" + P.info += "
    \n
    \nCrimes:
    \n" P.info +={" @@ -441,7 +588,7 @@ What a mess.*/ "} - for(var/datum/data/crime/c in active2.fields["ma_crim"]) + for(var/datum/data/crime/c in active2.fields["crim"]) P.info += "" P.info += "" P.info += "" @@ -449,7 +596,6 @@ What a mess.*/ P.info += "" P.info += "
    CrimeAuthor Time Added
    [c.crimeName][c.crimeDetails][c.author]
    " - P.info += text("
    \nImportant Notes:
    \n\t[]
    \n
    \n
    Comments/Log

    ", active2.fields["notes"]) var/counter = 1 while(active2.fields[text("com_[]", counter)]) @@ -466,31 +612,25 @@ What a mess.*/ var/wanted_name = stripped_input(usr, "Please enter an alias for the criminal:", "Print Wanted Poster", active1.fields["name"]) if(wanted_name) var/default_description = "A poster declaring [wanted_name] to be a dangerous individual, wanted by Nanotrasen. Report any sightings to security immediately." - var/list/major_crimes = active2.fields["ma_crim"] - var/list/minor_crimes = active2.fields["mi_crim"] - if(major_crimes.len + minor_crimes.len) - default_description += "\n[wanted_name] is wanted for the following crimes:\n" - if(minor_crimes.len) - default_description += "\nMinor Crimes:" - for(var/datum/data/crime/c in active2.fields["mi_crim"]) - default_description += "\n[c.crimeName]\n" - default_description += "[c.crimeDetails]\n" - if(major_crimes.len) - default_description += "\nMajor Crimes:" - for(var/datum/data/crime/c in active2.fields["ma_crim"]) + var/list/crimes = active2.fields["crim"] + if(crimes.len) + default_description += "\nCrimes:" + for(var/datum/data/crime/c in active2.fields["crim"]) default_description += "\n[c.crimeName]\n" default_description += "[c.crimeDetails]\n" var/headerText = stripped_input(usr, "Please enter Poster Heading (Max 7 Chars):", "Print Wanted Poster", "WANTED", 8) - + var/posternum = CLAMP((input("Number of posters to print (Max 5):","Number:",1) as num|null), 1, 5) var/info = stripped_multiline_input(usr, "Please input a description for the poster:", "Print Wanted Poster", default_description, null) if(info) - playsound(loc, 'sound/items/poster_being_created.ogg', 100, 1) printing = 1 - sleep(30) - if((istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1)))//make sure the record still exists. - var/obj/item/photo/photo = active1.fields["photo_front"] - new /obj/item/poster/wanted(loc, photo.picture.picture_image, wanted_name, info, headerText) + for(var/i in 1 to posternum) + playsound(loc, 'sound/items/poster_being_created.ogg', 100, 1) + + sleep(30) + if((istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1)))//make sure the record still exists. + var/obj/item/photo/photo = active1.fields["photo_front"] + new /obj/item/poster/wanted(loc, photo.picture.picture_image, wanted_name, info, headerText) printing = 0 if("Print Missing") if(!( printing )) @@ -499,15 +639,16 @@ What a mess.*/ var/default_description = "A poster declaring [missing_name] to be a missing individual, missed by Nanotrasen. Report any sightings to security immediately." var/headerText = stripped_input(usr, "Please enter Poster Heading (Max 7 Chars):", "Print Missing Persons Poster", "MISSING", 8) - + var/posternum = CLAMP((input("Number of posters to print (Max 5):","Number:",1) as num|null), 1, 5) var/info = stripped_multiline_input(usr, "Please input a description for the poster:", "Print Missing Persons Poster", default_description, null) if(info) - playsound(loc, 'sound/items/poster_being_created.ogg', 100, 1) printing = 1 - sleep(30) - if((istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1)))//make sure the record still exists. - var/obj/item/photo/photo = active1.fields["photo_front"] - new /obj/item/poster/wanted/missing(loc, photo.picture.picture_image, missing_name, info, headerText) + for(var/i in 1 to posternum) + playsound(loc, 'sound/items/poster_being_created.ogg', 100, 1) + sleep(30) + if((istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1)))//make sure the record still exists. + var/obj/item/photo/photo = active1.fields["photo_front"] + new /obj/item/poster/wanted/missing(loc, photo.picture.picture_image, missing_name, info, headerText) printing = 0 //RECORD DELETE @@ -559,8 +700,7 @@ What a mess.*/ R.fields["id"] = active1.fields["id"] R.name = text("Security Record #[]", R.fields["id"]) R.fields["criminal"] = "None" - R.fields["mi_crim"] = list() - R.fields["ma_crim"] = list() + R.fields["crim"] = list() R.fields["notes"] = "No notes." GLOB.data_core.security += R active2 = R @@ -589,8 +729,7 @@ What a mess.*/ R.fields["id"] = active1.fields["id"] R.name = text("Security Record #[]", R.fields["id"]) R.fields["criminal"] = "None" - R.fields["mi_crim"] = list() - R.fields["ma_crim"] = list() + R.fields["crim"] = list() R.fields["notes"] = "No notes." GLOB.data_core.security += R active2 = R @@ -706,36 +845,29 @@ What a mess.*/ if(istype(active1.fields["photo_side"], /obj/item/photo)) var/obj/item/photo/P = active1.fields["photo_side"] print_photo(P.picture.picture_image, active1.fields["name"]) - if("mi_crim_add") + if("crim_add") if(istype(active1, /datum/data/record)) - var/t1 = stripped_input(usr, "Please input minor crime names:", "Secure. records", "", null) - var/t2 = stripped_input(usr, "Please input minor crime details:", "Secure. records", "", null) + var/t1 = stripped_input(usr, "Please input crime name:", "Secure. records", "", null) + var/t2 = stripped_input(usr, "Please input crime details:", "Secure. records", "", null) if(!canUseSecurityRecordsConsole(usr, t1, null, a2)) return var/crime = GLOB.data_core.createCrimeEntry(t1, t2, authenticated, station_time_timestamp()) - GLOB.data_core.addMinorCrime(active1.fields["id"], crime) - investigate_log("New Minor Crime: [t1]: [t2] | Added to [active1.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) - if("mi_crim_delete") + GLOB.data_core.addCrime(active1.fields["id"], crime) + investigate_log("New Crime: [t1]: [t2] | Added to [active1.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) + if("crim_delete") if(istype(active1, /datum/data/record)) if(href_list["cdataid"]) if(!canUseSecurityRecordsConsole(usr, "delete", null, a2)) return - GLOB.data_core.removeMinorCrime(active1.fields["id"], href_list["cdataid"]) - if("ma_crim_add") - if(istype(active1, /datum/data/record)) - var/t1 = stripped_input(usr, "Please input major crime names:", "Secure. records", "", null) - var/t2 = stripped_input(usr, "Please input major crime details:", "Secure. records", "", null) - if(!canUseSecurityRecordsConsole(usr, t1, null, a2)) - return - var/crime = GLOB.data_core.createCrimeEntry(t1, t2, authenticated, station_time_timestamp()) - GLOB.data_core.addMajorCrime(active1.fields["id"], crime) - investigate_log("New Major Crime: [t1]: [t2] | Added to [active1.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) - if("ma_crim_delete") + GLOB.data_core.removeCrime(active1.fields["id"], href_list["cdataid"]) + if("add_details") if(istype(active1, /datum/data/record)) if(href_list["cdataid"]) - if(!canUseSecurityRecordsConsole(usr, "delete", null, a2)) + var/t1 = stripped_input(usr, "Please input crime details:", "Secure. records", "", null) + if(!canUseSecurityRecordsConsole(usr, t1, null, a2)) return - GLOB.data_core.removeMajorCrime(active1.fields["id"], href_list["cdataid"]) + GLOB.data_core.addCrimeDetails(active1.fields["id"], href_list["cdataid"], t1) + investigate_log("New Crime details: [t1] | Added to [active1.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) if("citation_add") if(istype(active1, /datum/data/record)) var/maxFine = CONFIG_GET(number/maxfine) @@ -786,7 +918,9 @@ What a mess.*/ temp = "
    Criminal Status:
    " temp += "
      " temp += "
    • None
    • " - temp += "
    • *Arrest*
    • " + temp += "
    • Arrest
    • " + temp += "
    • Search
    • " + temp += "
    • Monitor
    • " temp += "
    • Incarcerated
    • " temp += "
    • Paroled
    • " temp += "
    • Discharged
    • " @@ -819,7 +953,11 @@ What a mess.*/ if("none") active2.fields["criminal"] = "None" if("arrest") - active2.fields["criminal"] = "*Arrest*" + active2.fields["criminal"] = "Arrest" + if("search") + active2.fields["criminal"] = "Search" + if("monitor") + active2.fields["criminal"] = "Monitor" if("incarcerated") active2.fields["criminal"] = "Incarcerated" if("paroled") @@ -838,6 +976,8 @@ What a mess.*/ if("Delete Record (ALL) Execute") if(active1) investigate_log("[key_name(usr)] has deleted all records for [active1.fields["name"]].", INVESTIGATE_RECORDS) + if(isAI(usr) || iscyborg(usr)) + message_admins("[ADMIN_LOOKUPFLW(usr)] has deleted all records for [active1.fields["name"]] as Borg/AI Player.") for(var/datum/data/record/R in GLOB.data_core.medical) if((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"])) qdel(R) @@ -897,7 +1037,7 @@ What a mess.*/ if(3) R.fields["age"] = rand(5, 85) if(4) - R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Paroled", "Discharged") + R.fields["criminal"] = pick("None", "Arrest", "Search", "Monitor", "Incarcerated", "Paroled", "Discharged") if(5) R.fields["p_stat"] = pick("*Unconscious*", "Active", "Physically Unfit") if(6) diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index 7456e1f950776..ad05427011a6f 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -5,9 +5,6 @@ icon_keyboard = "atmos_key" circuit = /obj/item/circuitboard/computer/stationalert - - var/alarms = list("Fire" = list(), "Atmosphere" = list(), "Power" = list()) - light_color = LIGHT_COLOR_CYAN /obj/machinery/computer/station_alert/Initialize() @@ -32,43 +29,61 @@ var/list/data = list() data["alarms"] = list() - for(var/class in alarms) + for(var/class in GLOB.alarms) data["alarms"][class] = list() - for(var/area in alarms[class]) + for(var/area in GLOB.alarms[class]) data["alarms"][class] += area return data -/obj/machinery/computer/station_alert/proc/triggerAlarm(class, area/A, O, obj/source) - if(source.z != z) +/obj/machinery/computer/station_alert/proc/triggerAlarm(class, area/home, cameras, obj/source) + if(source.get_virtual_z_level() != get_virtual_z_level()) return if(stat & (BROKEN)) return - var/list/L = alarms[class] - for(var/I in L) - if (I == A.name) - var/list/alarm = L[I] + var/list/our_sort = GLOB.alarms[class] + for(var/areaname in our_sort) + if (areaname == home.name) + var/list/alarm = our_sort[areaname] var/list/sources = alarm[3] if (!(source in sources)) sources += source - return 1 - var/obj/machinery/camera/C = null - var/list/CL = null - if(O && islist(O)) - CL = O - if (CL.len == 1) - C = CL[1] - else if(O && istype(O, /obj/machinery/camera)) - C = O - L[A.name] = list(A, (C ? C : O), list(source)) - return 1 - + ui_update() + return TRUE + + var/obj/machinery/camera/cam = null + var/list/our_cams = null + if(cameras && islist(cameras)) + our_cams = cameras + if (our_cams.len == 1) + cam = our_cams[1] + else if(cameras && istype(cameras, /obj/machinery/camera)) + cam = cameras + our_sort[home.name] = list(home, (cam ? cam : cameras), list(source)) + ui_update() + return TRUE + +/obj/machinery/computer/station_alert/proc/freeCamera(area/home, obj/machinery/camera/cam) + for(var/class in GLOB.alarms) + var/our_area = GLOB.alarms[class][home.name] + if(!our_area) + continue + var/cams = our_area[2] //Get the cameras + if(!cams) + continue + if(islist(cams)) + cams -= cam + if(length(cams) == 1) + our_area[2] = cams[1] + else + our_area[2] = null + ui_update() /obj/machinery/computer/station_alert/proc/cancelAlarm(class, area/A, obj/origin) if(stat & (BROKEN)) return - var/list/L = alarms[class] + var/list/L = GLOB.alarms[class] var/cleared = 0 for (var/I in L) if (I == A.name) @@ -79,6 +94,7 @@ if (srcs.len == 0) cleared = 1 L -= I + ui_update() return !cleared /obj/machinery/computer/station_alert/update_icon() @@ -86,8 +102,8 @@ if(stat & (NOPOWER|BROKEN)) return var/active_alarms = FALSE - for(var/cat in alarms) - var/list/L = alarms[cat] + for(var/cat in GLOB.alarms) + var/list/L = GLOB.alarms[cat] if(L.len) active_alarms = TRUE if(active_alarms) diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index 3a1904ca3a433..08fb512cd733e 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -11,7 +11,10 @@ var/id var/obj/machinery/teleport/station/power_station var/calibrating - var/turf/target + ///Weakref to the target atom we're pointed at currently + var/datum/weakref/target_ref + + var/target_area_name /obj/machinery/computer/teleporter/Initialize() . = ..() @@ -31,9 +34,20 @@ power_station = locate(/obj/machinery/teleport/station, get_step(src, direction)) if(power_station) break + ui_update() return power_station +/obj/machinery/computer/teleporter/ui_requires_update(mob/user, datum/tgui/ui) + // Using ui_update here so the changes apply to all viewers, since ui_data updates those vars + if(target_ref) + var/atom/target = target_ref.resolve() + if(!target) + ui_update() // Update once if target is gone. There is probably a better way to do this. + else if(target_area_name != "[get_area(target)]") + ui_update() // Update if the area name changed. This should be fine, because autoupdate stringifies area every process anyways. + . = ..() // Call parent proc last so ui_update takes effect immediately + /obj/machinery/computer/teleporter/ui_state(mob/user) return GLOB.default_state @@ -44,14 +58,21 @@ ui.open() /obj/machinery/computer/teleporter/ui_data(mob/user) + var/atom/target + if(target_ref) + target = target_ref.resolve() + if(!target) + target_ref = null var/list/data = list() data["power_station"] = power_station ? TRUE : FALSE data["teleporter_hub"] = power_station?.teleporter_hub ? TRUE : FALSE data["regime_set"] = regime_set - data["target"] = !target ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]" + if(target) + target_area_name = "[get_area(target)]" + data["target"] = !target ? "None" : "[target_area_name] [(regime_set != "Gate") ? "" : "Teleporter"]" data["calibrating"] = calibrating - if(power_station?.teleporter_hub?.calibrated || power_station?.teleporter_hub?.accuracy >= 3) + if(power_station?.teleporter_hub?.calibrated || power_station?.teleporter_hub?.accuracy >= 4) data["calibrated"] = TRUE else data["calibrated"] = FALSE @@ -83,26 +104,29 @@ set_target(usr) . = TRUE if("calibrate") - if(!target) + if(!target_ref) say("Error: No target set to calibrate to.") return - if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accuracy >= 3) + if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accuracy >= 4) say("Hub is already calibrated!") return say("Processing hub calibration to target...") calibrating = TRUE power_station.update_icon() - spawn(50 * (3 - power_station.teleporter_hub.accuracy)) //Better parts mean faster calibration - calibrating = FALSE - if(check_hub_connection()) - power_station.teleporter_hub.calibrated = TRUE - say("Calibration complete.") - else - say("Error: Unable to detect hub.") - power_station.update_icon() + var/calibrationtime = 50 * (3 - power_station.teleporter_hub.accuracy) + addtimer(CALLBACK(src, .proc/calibrate), calibrationtime) . = TRUE +/obj/machinery/computer/teleporter/proc/calibrate() + calibrating = FALSE + if(check_hub_connection()) + power_station.teleporter_hub.calibrated = TRUE + say("Calibration complete.") + else + say("Error: Unable to detect hub.") + power_station.update_icon() + /obj/machinery/computer/teleporter/proc/check_hub_connection() if(!power_station) return FALSE @@ -111,7 +135,7 @@ return TRUE /obj/machinery/computer/teleporter/proc/reset_regime() - target = null + target_ref = null if(regime_set == "Teleporter") regime_set = "Gate" else @@ -141,9 +165,9 @@ L[avoid_assoc_duplicate_keys("[M.real_name] ([get_area(M)])", areaindex)] = I var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in sortList(L) - target = L[desc] - var/turf/T = get_turf(target) - log_game("[key_name(user)] has set the teleporter target to [target] at [AREACOORD(T)]") + target_ref = WEAKREF(L[desc]) + var/turf/T = get_turf(L[desc]) + log_game("[key_name(user)] has set the teleporter target to [L[desc]] at [AREACOORD(T)]") else var/list/S = power_station.linked_stations @@ -160,7 +184,7 @@ return var/turf/T = get_turf(target_station) log_game("[key_name(user)] has set the teleporter target to [target_station] at [AREACOORD(T)]") - target = target_station.teleporter_hub + target_ref = WEAKREF(target_station.teleporter_hub) target_station.linked_stations |= power_station target_station.stat &= ~NOPOWER if(target_station.teleporter_hub) @@ -177,6 +201,6 @@ if(is_centcom_level(T.z) || is_away_level(T.z)) return FALSE var/area/A = get_area(T) - if(!A || A.noteleport) + if(!A || A.teleport_restriction) return FALSE return TRUE diff --git a/code/game/machinery/computer/warrant.dm b/code/game/machinery/computer/warrant.dm index 3e6853d0994d8..22fd18ff72b21 100644 --- a/code/game/machinery/computer/warrant.dm +++ b/code/game/machinery/computer/warrant.dm @@ -19,11 +19,15 @@ var/background var/notice = "" switch(current.fields["criminal"]) - if("*Arrest*") + if("Arrest") background = "background-color:#990000;" notice = "
      **REPORT TO THE BRIG**" if("Incarcerated") background = "background-color:#CD6500;" + if("Search") + background = "'background-color:#9B13EB;'" + if("Monitor") + background = "'background-color:#990000;'" if("Paroled") background = "background-color:#CD6500;" if("Discharged") @@ -67,7 +71,7 @@ dat += "" dat += "" - dat += "
      Minor Crimes:" + dat += "
      Crimes:" dat +={" @@ -75,23 +79,7 @@ "} - for(var/datum/data/crime/c in current.fields["mi_crim"]) - dat += {" - - - - "} - dat += "
      CrimeAuthor Time Added
      [c.crimeName][c.crimeDetails][c.author][c.time]
      " - - dat += "
      Major Crimes:" - dat +={" - - - - - - "} - for(var/datum/data/crime/c in current.fields["ma_crim"]) + for(var/datum/data/crime/c in current.fields["crim"]) dat += {" @@ -113,8 +101,11 @@ var/mob/M = usr switch(href_list["choice"]) if("Login") + if(iscyborg(M)) //cyborgs cannot be set to arrest + return var/obj/item/card/id/scan = M.get_idcard(TRUE) - authenticated = scan.registered_name + if(scan) + authenticated = scan.registered_name if(authenticated) for(var/datum/data/record/R in GLOB.data_core.security) if(R.fields["name"] == authenticated) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 5de5c8df558e3..3fafde5cc6275 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -16,6 +16,7 @@ GLOBAL_LIST_EMPTY(cryopod_computers) icon_state = "cellconsole_1" // circuit = /obj/item/circuitboard/cryopodcontrol density = FALSE + layer = ABOVE_WINDOW_LAYER interaction_flags_machine = INTERACT_MACHINE_OFFLINE req_one_access = list(ACCESS_HEADS, ACCESS_ARMORY) //Heads of staff or the warden can go here to claim recover items from their department that people went were cryodormed with. var/mode = null @@ -150,7 +151,7 @@ GLOBAL_LIST_EMPTY(cryopod_computers) var/time_till_despawn = 5 * 600 // This is reduced to 30 seconds if a player manually enters cryo var/despawn_world_time = null // Used to keep track of the safe period. - var/obj/machinery/computer/cryopod/control_computer + var/datum/weakref/control_computer_weakref var/last_no_computer_message = 0 // These items are preserved when the process() despawn proc occurs. @@ -189,23 +190,28 @@ GLOBAL_LIST_EMPTY(cryopod_computers) update_icon() find_control_computer() -/obj/machinery/cryopod/proc/find_control_computer(urgent = 0) - for(var/M in GLOB.cryopod_computers) - var/obj/machinery/computer/cryopod/C = M - if(get_area(C) == get_area(src)) - control_computer = C +// This is not a good situation +/obj/machinery/cryopod/Destroy() + control_computer_weakref = null + return ..() + +/obj/machinery/cryopod/proc/find_control_computer(urgent = FALSE) + for(var/cryo_console as anything in GLOB.cryopod_computers) + var/obj/machinery/computer/cryopod/console = cryo_console + if(get_area(console) == get_area(src)) + control_computer_weakref = WEAKREF(console) break // Don't send messages unless we *need* the computer, and less than five minutes have passed since last time we messaged - if(!control_computer && urgent && last_no_computer_message + 5*60*10 < world.time) + if(!control_computer_weakref && urgent && last_no_computer_message + 5*60*10 < world.time) log_admin("Cryopod in [get_area(src)] could not find control computer!") message_admins("Cryopod in [get_area(src)] could not find control computer!") last_no_computer_message = world.time - return control_computer != null + return control_computer_weakref != null /obj/machinery/cryopod/close_machine(mob/user) - if(!control_computer) + if(!control_computer_weakref) find_control_computer(TRUE) if((isnull(user) || istype(user)) && state_open && !panel_open) ..(user) @@ -246,7 +252,7 @@ GLOBAL_LIST_EMPTY(cryopod_computers) return if(!mob_occupant.client && mob_occupant.stat < 2) //Occupant is living and has no client. - if(!control_computer) + if(!control_computer_weakref) find_control_computer(urgent = TRUE)//better hope you found it this time despawn_occupant() @@ -254,45 +260,42 @@ GLOBAL_LIST_EMPTY(cryopod_computers) /obj/machinery/cryopod/proc/handle_objectives() var/mob/living/mob_occupant = occupant //Update any existing objectives involving this mob. - for(var/datum/objective/O in GLOB.objectives) + for(var/datum/objective/O as() in GLOB.objectives) + if(O.target != mob_occupant.mind) + continue // We don't want revs to get objectives that aren't for heads of staff. Letting // them win or lose based on cryo is silly so we remove the objective. - if(istype(O,/datum/objective/mutiny) && O.target == mob_occupant.mind) + if(istype(O,/datum/objective/mutiny)) O.team.objectives -= O - qdel(O) - for(var/datum/mind/M in O.team.members) + for(var/datum/mind/M as() in O.team.members) to_chat(M.current, "
      Your target is no longer within reach. Objective removed!") M.announce_objectives() - else if(O.target && istype(O.target, /datum/mind)) - if(O.target == mob_occupant.mind) - var/old_target = O.target - O.target = null - if(!O) - return - O.find_target() - if(!O.target && O.owner) - to_chat(O.owner.current, "
      Your target is no longer within reach. Objective removed!") - for(var/datum/antagonist/A in O.owner.antag_datums) + qdel(O) + else if(istype(O, /datum/objective/contract)) + var/datum/antagonist/traitor/affected_traitor = O.owner.has_antag_datum(/datum/antagonist/traitor) + for(var/datum/syndicate_contract/affected_contract as anything in affected_traitor.contractor_hub.assigned_contracts) + if(affected_contract.contract == O) + affected_contract.generate(affected_traitor.contractor_hub.assigned_targets) + affected_traitor.contractor_hub.assigned_targets.Add(affected_contract.contract.target) + to_chat(O.owner.current, "
      Contract target out of reach. Contract rerolled.") + break + else + O.target = null + O.find_target() + if(!O.target || O.target == mob_occupant.mind) + for(var/datum/mind/own as() in O.get_owners()) + to_chat(own.current, "
      Your target is no longer within reach. Objective removed!") + for(var/datum/antagonist/A as() in own.antag_datums) A.objectives -= O - if (!O.team) - O.update_explanation_text() - O.owner.announce_objectives() - to_chat(O.owner.current, "
      You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated!") - else - var/list/objectivestoupdate - for(var/datum/mind/own in O.get_owners()) - to_chat(own.current, "
      You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated!") - for(var/datum/objective/ob in own.get_all_objectives()) - LAZYADD(objectivestoupdate, ob) - objectivestoupdate += O.team.objectives - for(var/datum/objective/ob in objectivestoupdate) - if(ob.target != old_target || !istype(ob,O.type)) - return - ob.target = O.target - ob.update_explanation_text() - to_chat(O.owner.current, "
      You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated!") - ob.owner.announce_objectives() + own.announce_objectives() + if(O.team) + O.team.objectives -= O qdel(O) + else + O.update_explanation_text() + for(var/datum/mind/own as() in O.get_owners()) + to_chat(own.current, "
      You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated!") + own.announce_objectives() // This function can not be undone; do not call this unless you are sure /obj/machinery/cryopod/proc/despawn_occupant() @@ -309,24 +312,27 @@ GLOBAL_LIST_EMPTY(cryopod_computers) // Delete them from datacore. var/announce_rank = null - for(var/datum/data/record/R in GLOB.data_core.medical) + for(var/datum/data/record/R as() in GLOB.data_core.medical) if((R.fields["name"] == mob_occupant.real_name)) qdel(R) - for(var/datum/data/record/T in GLOB.data_core.security) + for(var/datum/data/record/T as() in GLOB.data_core.security) if((T.fields["name"] == mob_occupant.real_name)) qdel(T) - for(var/datum/data/record/G in GLOB.data_core.general) + for(var/datum/data/record/G as() in GLOB.data_core.general) if((G.fields["name"] == mob_occupant.real_name)) announce_rank = G.fields["rank"] qdel(G) - for(var/obj/machinery/computer/cloning/cloner in world) - for(var/datum/data/record/R in cloner.records) + for(var/obj/machinery/computer/cloning/cloner in GLOB.machines) + for(var/datum/data/record/R as() in cloner.records) if(R.fields["name"] == mob_occupant.real_name) cloner.records.Remove(R) //Make an announcement and log the person entering storage. - if(control_computer) + var/obj/machinery/computer/cryopod/control_computer = control_computer_weakref?.resolve() + if(!control_computer) + control_computer_weakref = null + else control_computer.frozen_crew += "[mob_occupant.real_name]" if(GLOB.announcement_systems.len) @@ -356,14 +362,14 @@ GLOBAL_LIST_EMPTY(cryopod_computers) if(!istype(R)) return R.contents -= R.mmi - qdel(R.mmi) + QDEL_NULL(R.mmi) // Ghost and delete the mob. - if(!mob_occupant.get_ghost(1)) + if(!mob_occupant.get_ghost(TRUE)) if(world.time < 15 * 600)//before the 15 minute mark - mob_occupant.ghostize(0) // Players despawned too early may not re-enter the game + mob_occupant.ghostize(FALSE,SENTIENCE_ERASE) // Players despawned too early may not re-enter the game else - mob_occupant.ghostize(1) + mob_occupant.ghostize(TRUE,SENTIENCE_ERASE) handle_objectives() QDEL_NULL(occupant) open_machine() diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index e0e9f4260e72f..fef7a987dd458 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -123,7 +123,7 @@ playsound(src, 'sound/misc/compiler-failure.ogg', 50, 1) return activate_music() - START_PROCESSING(SSobj, src) + START_PROCESSING(SSmachines, src) updateUsrDialog() else if(active) stop = 0 @@ -145,7 +145,7 @@ /obj/machinery/jukebox/proc/activate_music() active = TRUE update_icon() - START_PROCESSING(SSobj, src) + START_PROCESSING(SSmachines, src) stop = world.time + selection.song_length /obj/machinery/jukebox/disco/activate_music() @@ -436,34 +436,33 @@ if(world.time < stop && active) var/sound/song_played = sound(selection.song_path) - for(var/mob/M in range(10,src)) - if(!M.client || !(M.client.prefs.toggles & SOUND_INSTRUMENTS)) - continue - if(!(M in rangers)) - rangers[M] = TRUE - M.playsound_local(get_turf(M), null, 100, channel = CHANNEL_JUKEBOX, S = song_played) - for(var/mob/L in rangers) + for(var/mob/L as() in rangers) if(get_dist(src,L) > 10) rangers -= L if(!L || !L.client) continue L.stop_sound_channel(CHANNEL_JUKEBOX) + for(var/mob/M as() in hearers(10,src)) + if(!M.client || !(M.client.prefs.toggles & SOUND_INSTRUMENTS)) + continue + if(!(M in rangers)) + rangers += M + M.playsound_local(get_turf(M), null, 100, channel = CHANNEL_JUKEBOX, S = song_played, use_reverb = FALSE) else if(active) active = FALSE - STOP_PROCESSING(SSobj, src) dance_over() playsound(src,'sound/machines/terminal_off.ogg',50,1) update_icon() stop = world.time + 100 + return PROCESS_KILL - -/obj/machinery/jukebox/disco/process() +/obj/machinery/jukebox/disco/process(delta_time) . = ..() if(active) - for(var/mob/M in rangers) - if(prob(5+(allowed(M)*4))) + for(var/mob/M as() in rangers) + if(DT_PROB(5+(allowed(M)*4), delta_time)) if(isliving(M)) var/mob/living/L = M if(!(L.mobility_flags & MOBILITY_MOVE)) continue - dance(M) + dance(L) diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index febf3cb09a6d1..5a95329252e31 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -11,6 +11,8 @@ idle_power_usage = 0 power_channel = AREA_USAGE_EQUIP req_one_access = list(ACCESS_MEDICAL, ACCESS_HEADS, ACCESS_SECURITY) //used to control clamps + processing_flags = NONE + layer = ABOVE_WINDOW_LAYER var/obj/item/defibrillator/defib //this mount's defibrillator var/clamps_locked = FALSE //if true, and a defib is loaded, it can't be removed without unlocking the clamps @@ -21,12 +23,13 @@ /obj/machinery/defibrillator_mount/Destroy() if(defib) QDEL_NULL(defib) + end_processing() . = ..() /obj/machinery/defibrillator_mount/examine(mob/user) . = ..() if(defib) - . += "There is a defib unit hooked up. Alt-click to remove it." + . += "There is a defib unit hooked up. Alt-click to remove it." if(GLOB.security_level >= SEC_LEVEL_RED) . += "Due to a security situation, its locking clamps can be toggled by swiping any ID." else @@ -35,7 +38,7 @@ /obj/machinery/defibrillator_mount/process() if(defib?.cell && defib.cell.charge < defib.cell.maxcharge && is_operational()) use_power(200) - defib.cell.give(180) //90% efficiency, slightly better than the cell charger's 87.5% + defib.cell.give(180) //90% efficiency, a bit worse than the cell charger's 100% update_icon() /obj/machinery/defibrillator_mount/update_icon() @@ -76,6 +79,7 @@ "You press [I] into the mount, and it clicks into place.") playsound(src, 'sound/machines/click.ogg', 50, TRUE) defib = I + begin_processing() update_icon() return else if(defib && I == defib.paddles) @@ -129,6 +133,8 @@ user.visible_message("[user] unhooks [defib] from [src].", \ "You slide out [defib] from [src] and unhook the charging cables.") playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) + // Make sure processing ends before the defib is nulled + end_processing() defib = null update_icon() diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 5067405dad171..99fa9253a644c 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -120,7 +120,7 @@ anchored = FALSE max_integrity = 180 proj_pass_rate = 20 - armor = list("melee" = 10, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 10, "acid" = 0) + armor = list("melee" = 10, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 10, "acid" = 0, "stamina" = 0) var/deploy_time = 40 var/deploy_message = TRUE @@ -167,7 +167,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/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 438130d052682..71071d390693f 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -30,7 +30,9 @@ /obj/machinery/dna_scannernew/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Radiation pulse accuracy increased by factor [precision_coeff**2].
      Radiation pulse damage decreased by factor [damage_coeff**2]." + . += "The status display reads: Radiation pulse accuracy increased by factor [precision_coeff**2].
      Radiation pulse damage decreased by factor [damage_coeff**2].
      " + if(scan_level >= 3) + . += "Scanner has been upgraded to support autoprocessing." /obj/machinery/dna_scannernew/update_icon() @@ -100,12 +102,6 @@ ..(user) - // DNA manipulators cannot operate on severed heads or brains - if(iscarbon(occupant)) - var/obj/machinery/computer/scan_consolenew/console = locate_computer(/obj/machinery/computer/scan_consolenew) - if(console) - console.on_scanner_close() - return TRUE /obj/machinery/dna_scannernew/open_machine() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index fc03bdb374f81..ff9de24d8254e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -41,6 +41,7 @@ name = "airlock" icon = 'icons/obj/doors/airlocks/station/public.dmi' icon_state = "closed" + appearance_flags = TILE_BOUND | LONG_GLIDE | PIXEL_SCALE | KEEP_TOGETHER max_integrity = 300 var/normal_integrity = AIRLOCK_INTEGRITY_N integrity_failure = 70 @@ -51,6 +52,7 @@ normalspeed = 1 explosion_block = 1 hud_possible = list(DIAG_AIRLOCK_HUD) + var/allow_repaint = TRUE //Set to FALSE if the airlock should not be allowed to be repainted. FASTDMM_PROP(\ pinned_vars = list("req_access_txt", "req_one_access_txt", "name")\ @@ -71,7 +73,7 @@ var/obj/machinery/door/airlock/closeOther var/justzap = FALSE var/obj/item/electronics/airlock/electronics - var/shockCooldown = FALSE //Prevents multiple shocks from happening + COOLDOWN_DECLARE(shockCooldown) //Prevents multiple shocks from happening var/obj/item/doorCharge/charge //If applied, causes an explosion upon opening the door var/obj/item/note //Any papers pinned to the airlock var/detonated = FALSE @@ -86,6 +88,15 @@ var/airlock_material //material of inner filling; if its an airlock with glass, this should be set to "glass" var/overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' var/note_overlay_file = 'icons/obj/doors/airlocks/station/overlays.dmi' //Used for papers and photos pinned to the airlock + /* Note mask_file needed some change due to the change from 513 to 514(the behavior of alpha filters seems to have changed) thats the reason why the mask + dmi file for normal airlocks is not 32x32 but 64x64 and for the large airlocks instead of 64x32 its now 96x64 due to the fix to this problem*/ + var/mask_file = 'icons/obj/doors/airlocks/mask_32x32_airlocks.dmi' // because filters aren't allowed to have icon_states :( + var/mask_x = 0 + var/mask_y = 0 + var/anim_parts = "left=-14,0;right=13,0" //format is "airlock_part=open_px,open_py,move_start_time,move_end_time,aperture_angle" + var/list/part_overlays + var/panel_attachment = "right" + var/note_attachment = "left" var/cyclelinkeddir = 0 var/obj/machinery/door/airlock/cyclelinkedairlock @@ -94,10 +105,11 @@ var/prying_so_hard = FALSE var/protected_door = FALSE // Protects the door against any form of power outage, AI control, screwdrivers and welders. - rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE rad_insulation = RAD_MEDIUM_INSULATION + var/electrification_timing // Set to true while electrified_loop is running, to prevent multiple being started + var/static/list/airlock_overlays = list() /obj/machinery/door/airlock/Initialize() @@ -123,6 +135,8 @@ diag_hud.add_to_hud(src) diag_hud_set_electrified() + rebuild_parts() + return INITIALIZE_HINT_LATELOAD /obj/machinery/door/airlock/LateInitialize() @@ -134,7 +148,7 @@ switch(outcome) if(1 to 5) var/turf/here = get_turf(src) - for(var/turf/closed/T in range(2, src)) + for(var/turf/closed/T in spiral_range_turfs(2, here)) here.PlaceOnTop(T.type) qdel(src) return @@ -156,6 +170,35 @@ . = ..() AddComponent(/datum/component/ntnet_interface) +/obj/machinery/door/airlock/proc/rebuild_parts() + if(part_overlays) + vis_contents -= part_overlays + QDEL_LIST(part_overlays) + else + part_overlays = list() + var/list/parts_desc = params2list(anim_parts) + var/list/door_time = list() + for(var/part_id in parts_desc) + var/obj/effect/overlay/airlock_part/P = new + P.side_id = part_id + var/list/open_offset = splittext(parts_desc[part_id], ",") + P.open_px = text2num(open_offset[1]) + P.open_py = text2num(open_offset[2]) + if(open_offset.len >= 3) + P.move_start_time = text2num(open_offset[3]) + if(open_offset.len >= 4) + P.move_end_time = text2num(open_offset[4]) + if(open_offset.len >= 5) + P.aperture_angle = text2num(open_offset[5]) + vis_contents += P + part_overlays += P + P.icon = icon + P.icon_state = part_id + P.name = name + door_time += P.move_end_time + open_speed = max(door_time) //open_speed is max animation time + add_filter("mask_filter", 1, list(type="alpha",icon=mask_file,x=mask_x,y=mask_y)) + /obj/machinery/door/airlock/proc/update_other_id() for(var/obj/machinery/door/airlock/A in GLOB.airlocks) if(A.closeOtherId == closeOtherId && A != src) @@ -198,6 +241,10 @@ if(!hasPower() || !canAIControl()) return + //Check radio signal jamming + if(is_jammed()) + return + // Check packet access level. if(!check_access_ntnet(data)) return @@ -246,18 +293,26 @@ /obj/machinery/door/airlock/proc/bolt() if(locked || protected_door) return - locked = TRUE - playsound(src,boltDown,30,0,3) + set_bolt(TRUE) + playsound(src, boltDown, 30, 0, 3) audible_message("You hear a click from the bottom of the door.", null, 1) update_icon() +/obj/machinery/door/airlock/proc/set_bolt(should_bolt) + if(locked == should_bolt) + return + SEND_SIGNAL(src, COMSIG_AIRLOCK_SET_BOLT, should_bolt) + ui_update() + . = locked + locked = should_bolt + /obj/machinery/door/airlock/unlock() unbolt() /obj/machinery/door/airlock/proc/unbolt() if(!locked) return - locked = FALSE + set_bolt(FALSE) playsound(src,boltUp,30,0,3) audible_message("You hear a click from the bottom of the door.", null, 1) update_icon() @@ -364,6 +419,8 @@ if(G.siemens_coefficient)//not insulated new /datum/hallucination/shock(H) return + if(SEND_SIGNAL(src, COMSIG_AIRLOCK_TOUCHED, user) & COMPONENT_PREVENT_OPEN) + return if (cyclelinkedairlock) if (!shuttledocked && !emergency && !cyclelinkedairlock.shuttledocked && !cyclelinkedairlock.emergency && allowed(user)) if(cyclelinkedairlock.operating) @@ -383,11 +440,15 @@ /obj/machinery/door/airlock/proc/canAIControl(mob/user) if(protected_door) return FALSE + if(is_jammed()) + return FALSE return ((aiControlDisabled != 1) && !isAllPowerCut()) /obj/machinery/door/airlock/proc/canAIHack() if(protected_door) return FALSE + if(is_jammed()) + return FALSE return ((aiControlDisabled==1) && (!hackProof) && (!isAllPowerCut())); /obj/machinery/door/airlock/hasPower() @@ -419,15 +480,13 @@ if(secondsMainPowerLost>0) if(!wires.is_cut(WIRE_POWER1) && !wires.is_cut(WIRE_POWER2)) secondsMainPowerLost -= 1 - updateDialog() cont = TRUE if(secondsBackupPowerLost>0) if(!wires.is_cut(WIRE_BACKUP1) && !wires.is_cut(WIRE_BACKUP2)) secondsBackupPowerLost -= 1 - updateDialog() cont = TRUE spawnPowerRestoreRunning = FALSE - updateDialog() + ui_update() update_icon() /obj/machinery/door/airlock/proc/loseMainPower() @@ -459,19 +518,20 @@ /obj/machinery/door/airlock/proc/shock(mob/user, prb) if(!hasPower()) // unpowered, no shock return FALSE - if(shockCooldown > world.time) + if(!COOLDOWN_FINISHED(src, shockCooldown)) return FALSE //Already shocked someone recently? if(!prob(prb)) return FALSE //you lucked out, no shock for you do_sparks(5, TRUE, src) var/check_range = TRUE if(electrocute_mob(user, get_area(src), src, 1, check_range)) - shockCooldown = world.time + 10 + COOLDOWN_START(src, shockCooldown, 1 SECONDS) return TRUE else return FALSE /obj/machinery/door/airlock/update_icon(state=0, override=0) + cut_overlays() // Needed without it you get like 300 unres indicator overlayers over time if(operating && !override) return switch(state) @@ -487,144 +547,116 @@ icon_state = "nonexistenticonstate" //MADNESS set_airlock_overlays(state) +/obj/machinery/door/airlock/proc/set_side_overlays(obj/effect/overlay/airlock_part/base, show_lights = FALSE) + var/side = base.side_id + base.icon = icon + base.cut_overlays() + if(airlock_material) + base.add_overlay(get_airlock_overlay("[airlock_material]_[side]", overlays_file)) + else + base.add_overlay(get_airlock_overlay("fill_[side]", icon)) + if(panel_open && panel_attachment == side) + if(security_level) + base.add_overlay(get_airlock_overlay("panel_closed_protected", overlays_file)) + else + base.add_overlay(get_airlock_overlay("panel_closed", overlays_file)) + if(show_lights && lights && hasPower()) + base.add_overlay(get_airlock_overlay("lights_[side]", overlays_file)) + + if(note && note_attachment == side) + var/notetype = note_type() + base.add_overlay(get_airlock_overlay(notetype, note_overlay_file)) + /obj/machinery/door/airlock/proc/set_airlock_overlays(state) - var/mutable_appearance/frame_overlay - var/mutable_appearance/filling_overlay - var/mutable_appearance/lights_overlay - var/mutable_appearance/panel_overlay - var/mutable_appearance/weld_overlay - var/mutable_appearance/damag_overlay - var/mutable_appearance/sparks_overlay - var/mutable_appearance/note_overlay - var/notetype = note_type() + for(var/obj/effect/overlay/airlock_part/part as() in part_overlays) + set_side_overlays(part, state == AIRLOCK_CLOSING || state == AIRLOCK_OPENING) + if(part.aperture_angle) + var/matrix/T + if(state == AIRLOCK_OPEN || state == AIRLOCK_OPENING || state == AIRLOCK_CLOSING) + T = matrix() + T.Translate(-part.open_px,-part.open_py) + T.Turn(part.aperture_angle) + T.Translate(part.open_px,part.open_py) + switch(state) + if(AIRLOCK_CLOSED, AIRLOCK_DENY, AIRLOCK_EMAG) + part.transform = matrix() + if(AIRLOCK_OPEN) + part.transform = T + if(AIRLOCK_CLOSING) + part.transform = T + animate(part, transform = T, time = open_speed - part.move_end_time, flags = ANIMATION_LINEAR_TRANSFORM) + animate(transform = matrix(), time = part.move_end_time - part.move_start_time, flags = ANIMATION_LINEAR_TRANSFORM) + if(AIRLOCK_OPENING) + part.transform = matrix() + animate(part, transform = matrix(), time = part.move_start_time, flags = ANIMATION_LINEAR_TRANSFORM) + animate(transform = T, time = part.move_end_time - part.move_start_time, flags = ANIMATION_LINEAR_TRANSFORM) + else + switch(state) + if(AIRLOCK_CLOSED, AIRLOCK_DENY, AIRLOCK_EMAG) + part.pixel_x = 0 + part.pixel_y = 0 + if(AIRLOCK_OPEN) + part.pixel_x = part.open_px + part.pixel_y = part.open_py + if(AIRLOCK_CLOSING) + part.pixel_x = part.open_px + part.pixel_y = part.open_py + animate(part, pixel_x = part.open_px, pixel_y = part.open_py, time = open_speed - part.move_end_time) + animate(pixel_x = 0, pixel_y = 0, time = part.move_end_time - part.move_start_time) + if(AIRLOCK_OPENING) + part.pixel_x = 0 + part.pixel_y = 0 + animate(part, pixel_x = 0, pixel_y = 0, time = part.move_start_time) + animate(pixel_x = part.open_px, pixel_y = part.open_py, time = part.move_end_time - part.move_start_time) + + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + + SSvis_overlays.add_vis_overlay(src, overlays_file, "frame", FLOAT_LAYER, FLOAT_PLANE, dir) switch(state) if(AIRLOCK_CLOSED) - frame_overlay = get_airlock_overlay("closed", icon) - if(airlock_material) - filling_overlay = get_airlock_overlay("[airlock_material]_closed", overlays_file) - else - filling_overlay = get_airlock_overlay("fill_closed", icon) - if(panel_open) - if(security_level) - panel_overlay = get_airlock_overlay("panel_closed_protected", overlays_file) - else - panel_overlay = get_airlock_overlay("panel_closed", overlays_file) - if(welded) - weld_overlay = get_airlock_overlay("welded", overlays_file) - if(obj_integrity " . += "Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts." . += "Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it." @@ -729,6 +765,9 @@ if(detonated) to_chat(user, "Unable to interface. Airlock control panel damaged.") return + if(is_jammed()) + to_chat(user, "Unable to interface. Remote communications not responding.") + return ui_interact(user) @@ -788,7 +827,9 @@ return attack_hand(user) /obj/machinery/door/airlock/attack_hand(mob/user) - if(locked && allowed(user) && aac) + if(SEND_SIGNAL(src, COMSIG_AIRLOCK_TOUCHED, user) & COMPONENT_PREVENT_OPEN) + . = TRUE + else if(locked && allowed(user) && aac) aac.request_from_door(src) . = TRUE else @@ -819,20 +860,27 @@ return ..() /obj/machinery/door/airlock/proc/electrified_loop() + if(electrification_timing) + return // Don't start another timer if one is already running + + electrification_timing = TRUE while (secondsElectrified > MACHINE_NOT_ELECTRIFIED) + secondsElectrified-- + sleep(10) if(QDELETED(src)) return + electrification_timing = FALSE - secondsElectrified-- - updateDialog() // This is to protect against changing to permanent, mid loop. if(secondsElectrified == MACHINE_NOT_ELECTRIFIED) set_electrified(MACHINE_NOT_ELECTRIFIED) else set_electrified(MACHINE_ELECTRIFIED_PERMANENT) - updateDialog() + ui_update() +//This code might be completely unused, but I'm too afraid to touch it. +//That said, commenting it out didn't seem to break anything. /obj/machinery/door/airlock/Topic(href, href_list, var/nowindow = 0) // If you add an if(..()) check you must first remove the var/nowindow parameter. // Otherwise it will runtime with this kind of error: null.Topic() @@ -851,7 +899,6 @@ else updateDialog() - /obj/machinery/door/airlock/attackby(obj/item/C, mob/user, params) if(!issilicon(user) && !IsAdminGhost(user)) if(isElectrified()) @@ -1089,14 +1136,14 @@ else if(locked) to_chat(user, "The airlock's bolts prevent it from being forced!") else if( !welded && !operating) - if(istype(I, /obj/item/twohanded/fireaxe)) //being fireaxe'd - var/obj/item/twohanded/fireaxe/F = I - if(!F.wielded) + if(istype(I, /obj/item/fireaxe)) //being fireaxe'd + var/obj/item/fireaxe/F = I + if(F && !ISWIELDED(F)) to_chat(user, "You need to be wielding the fire axe to do that!") return INVOKE_ASYNC(src, (density ? .proc/open : .proc/close), 2) - if(istype(I, /obj/item/crowbar/power)) + if(HAS_TRAIT(I, TRAIT_DOOR_PRYER)) if(isElectrified()) shock(user,100)//it's like sticking a forck in a power socket return @@ -1160,18 +1207,21 @@ if(!density) return TRUE + ui_update() + SEND_SIGNAL(src, COMSIG_AIRLOCK_OPEN, forced) operating = TRUE update_icon(AIRLOCK_OPENING, 1) sleep(1) set_opacity(0) update_freelook_sight() - sleep(4) + sleep(open_speed - 1) density = FALSE air_update_turf(1) sleep(1) layer = OPEN_DOOR_LAYER update_icon(AIRLOCK_OPEN, 1) operating = FALSE + ui_update() if(delayed_close_requested) delayed_close_requested = FALSE addtimer(CALLBACK(src, .proc/close), 1) @@ -1203,8 +1253,10 @@ var/obj/structure/window/killthis = (locate(/obj/structure/window) in get_turf(src)) if(killthis) - killthis.ex_act(EXPLODE_HEAVY)//Smashin windows + SSexplosions.med_mov_atom += killthis + SEND_SIGNAL(src, COMSIG_AIRLOCK_CLOSE, forced) + ui_update() operating = TRUE update_icon(AIRLOCK_CLOSING, 1) layer = CLOSED_DOOR_LAYER @@ -1215,7 +1267,7 @@ if(!air_tight) density = TRUE air_update_turf(1) - sleep(4) + sleep(open_speed - 1) if(!safe) crush() if(visible && !glass) @@ -1225,8 +1277,10 @@ update_icon(AIRLOCK_CLOSED, 1) operating = FALSE delayed_close_requested = FALSE + ui_update() if(safe) CheckForMobs() + ui_update() return TRUE /obj/machinery/door/airlock/proc/prison_open() @@ -1238,83 +1292,38 @@ return -/obj/machinery/door/airlock/proc/change_paintjob(obj/item/airlock_painter/W, mob/user) - if(!W.can_use(user)) +/obj/machinery/door/airlock/proc/change_paintjob(obj/item/airlock_painter/painter, mob/user) + if(!allow_repaint) + to_chat(user, "The airlock painter does not support this airlock.") return - var/list/optionlist - if(airlock_material == "glass") - optionlist = list("Standard", "Public", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Science", "Virology", "Mining", "Maintenance", "External", "External Maintenance") - else - optionlist = list("Standard", "Public", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Freezer", "Science", "Virology", "Mining", "Maintenance", "External", "External Maintenance") + if((!in_range(src, user) && loc != user) || !painter.can_use(user)) // user should be adjacent to the airlock, and the painter should have a toner cartridge that isn't empty + return + + // reads from the airlock painter's `available paintjob` list. lets the player choose a paint option, or cancel painting + var/current_paintjob = input(user, "Please select a paintjob for this airlock.") as null|anything in sortList(painter.available_paint_jobs) + if(!current_paintjob) // if the user clicked cancel on the popup, return + return - var/paintjob = input(user, "Please select a paintjob for this airlock.") in sortList(optionlist) - if((!in_range(src, usr) && loc != usr) || !W.use_paint(user)) + var/airlock_type = painter.available_paint_jobs["[current_paintjob]"] // get the airlock type path associated with the airlock name the user just chose + var/obj/machinery/door/airlock/airlock = airlock_type // we need to create a new typed variable of the airlock and assembly to read initial values from them + var/obj/structure/door_assembly/assembly = initial(airlock.assemblytype) + if(airlock_material == "glass" && initial(assembly.noglass)) // prevents painting glass airlocks with a paint job that doesn't have a glass version, such as the freezer + to_chat(user, "This paint job can only be applied to non-glass airlocks.") return - switch(paintjob) - if("Standard") - icon = 'icons/obj/doors/airlocks/station/public.dmi' - overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - assemblytype = /obj/structure/door_assembly - if("Public") - icon = 'icons/obj/doors/airlocks/station2/glass.dmi' - overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_public - if("Engineering") - icon = 'icons/obj/doors/airlocks/station/engineering.dmi' - overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_eng - if("Atmospherics") - icon = 'icons/obj/doors/airlocks/station/atmos.dmi' - overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_atmo - if("Security") - icon = 'icons/obj/doors/airlocks/station/security.dmi' - overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_sec - if("Command") - icon = 'icons/obj/doors/airlocks/station/command.dmi' - overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_com - if("Medical") - icon = 'icons/obj/doors/airlocks/station/medical.dmi' - overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_med - if("Research") - icon = 'icons/obj/doors/airlocks/station/research.dmi' - overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_research - if("Freezer") - icon = 'icons/obj/doors/airlocks/station/freezer.dmi' - overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_fre - if("Science") - icon = 'icons/obj/doors/airlocks/station/science.dmi' - overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_science - if("Virology") - icon = 'icons/obj/doors/airlocks/station/virology.dmi' - overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_viro - if("Mining") - icon = 'icons/obj/doors/airlocks/station/mining.dmi' - overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_min - if("Maintenance") - icon = 'icons/obj/doors/airlocks/station/maintenance.dmi' - overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_mai - if("External") - icon = 'icons/obj/doors/airlocks/external/external.dmi' - overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_ext - if("External Maintenance") - icon = 'icons/obj/doors/airlocks/station/maintenanceexternal.dmi' - overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_extmai + // applies the user-chosen airlock's icon, overlays, assemblytype anim_parts, panel_attachement and note_attachment to the src airlock + painter.use_paint(user) + icon = initial(airlock.icon) + overlays_file = initial(airlock.overlays_file) + note_overlay_file = initial(airlock.note_overlay_file) + assemblytype = initial(airlock.assemblytype) + anim_parts = initial(airlock.anim_parts) + panel_attachment = initial(airlock.panel_attachment) + note_attachment = initial(airlock.note_attachment) + rebuild_parts() update_icon() -/obj/machinery/door/airlock/CanAStarPass(obj/item/card/id/ID) +/obj/machinery/door/airlock/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) //Airlock is passable if it is open (!density), bot has access, and is not bolted shut or powered off) return !density || (check_access(ID) && !locked && hasPower()) @@ -1392,6 +1401,7 @@ /obj/machinery/door/airlock/proc/set_electrified(seconds, mob/user) secondsElectrified = seconds diag_hud_set_electrified() + ui_update() if(secondsElectrified > MACHINE_NOT_ELECTRIFIED) INVOKE_ASYNC(src, .proc/electrified_loop) @@ -1413,7 +1423,6 @@ if(obj_integrity < (0.75 * max_integrity)) update_icon() - /obj/machinery/door/airlock/deconstruct(disassembled = TRUE, mob/user) if(!(flags_1 & NODECONSTRUCT_1)) var/obj/structure/door_assembly/A @@ -1482,6 +1491,11 @@ return "photo" +/obj/machinery/door/airlock/ui_requires_update(mob/user, datum/tgui/ui) + . = ..() + if(secondsMainPowerLost || secondsBackupPowerLost || secondsElectrified) + . = TRUE // Autoupdate while counters are counting down + /obj/machinery/door/airlock/ui_state(mob/user) return GLOB.default_state @@ -1627,6 +1641,7 @@ return emergency = !emergency update_icon() + ui_update() /obj/machinery/door/airlock/proc/user_toggle_open(mob/user) if(!user_allowed(user)) diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 3ad80df861ec7..222ae936a0dca 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -2,10 +2,14 @@ name = "airlock electronics" req_access = list(ACCESS_MAINT_TUNNELS) custom_price = 5 - + /// A list of all granted accesses var/list/accesses = list() + /// If the airlock should require ALL or only ONE of the listed accesses var/one_access = 0 - var/unres_sides = 0 //unrestricted sides, or sides of the airlock that will open regardless of access + /// Unrestricted sides, or sides of the airlock that will open regardless of access + var/unres_sides = 0 + /// A holder of the electronics, in case of them working as an integrated part + var/holder /obj/item/electronics/airlock/examine(mob/user) . = ..() @@ -47,7 +51,6 @@ data["accesses"] = accesses data["oneAccess"] = one_access data["unres_direction"] = unres_sides - return data /obj/item/electronics/airlock/ui_act(action, params) @@ -87,3 +90,8 @@ return accesses -= get_region_accesses(region) . = TRUE + +/obj/item/electronics/airlock/ui_host() + if(holder) + return holder + return src diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 36ecd52dde50d..755aaf065d101 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -200,9 +200,9 @@ assemblytype = /obj/structure/door_assembly/door_assembly_uranium var/last_event = 0 -/obj/machinery/door/airlock/uranium/process() +/obj/machinery/door/airlock/uranium/process(delta_time) if(world.time > last_event+20) - if(prob(50)) + if(DT_PROB(50, delta_time)) radiate() last_event = world.time ..() @@ -241,7 +241,7 @@ DA.update_name() qdel(src) -/obj/machinery/door/airlock/plasma/BlockSuperconductivity() //we don't stop the heat~ +/obj/machinery/door/airlock/plasma/BlockThermalConductivity() //we don't stop the heat~ return 0 /obj/machinery/door/airlock/plasma/attackby(obj/item/C, mob/user, params) @@ -291,12 +291,27 @@ icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi' overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi' normal_integrity = 400 + anim_parts = "rightu=11,0;left=-12,0;right=11,0" /obj/machinery/door/airlock/titanium/glass normal_integrity = 350 opacity = 0 glass = TRUE +/obj/machinery/door/airlock/bronze + name = "bronze airlock" + icon = 'icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi' + overlays_file = 'icons/obj/doors/airlocks/clockwork/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_bronze + anim_parts = "left=-13,0;right=13,0" + normal_integrity = 150 + damage_deflection = 5 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) + +/obj/machinery/door/airlock/bronze/seethru + assemblytype = /obj/structure/door_assembly/door_assembly_bronze/seethru + opacity = 0 + glass = TRUE ////////////////////////////////// /* Station2 Airlocks @@ -336,6 +351,9 @@ overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi' note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_ext + anim_parts = "top=0,16;bottom=0,-16" + note_attachment = "bottom" + panel_attachment = "bottom" /obj/machinery/door/airlock/arrivals_external name = "arrivals airlock" @@ -343,6 +361,9 @@ overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi' note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi' protected_door = TRUE + anim_parts = "top=0,16;bottom=0,-16" + note_attachment = "bottom" + panel_attachment = "bottom" /obj/machinery/door/airlock/external/glass opacity = 0 @@ -375,6 +396,7 @@ name = "vault door" icon = 'icons/obj/doors/airlocks/vault/vault.dmi' overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi' + anim_parts = "rightpins=15,0;leftpins=-17,0;rightu=13,0;left=-15,0;right=13,0" assemblytype = /obj/structure/door_assembly/door_assembly_vault explosion_block = 2 normal_integrity = 400 // reverse engieneerd: 400 * 1.5 (sec lvl 6) = 600 = original @@ -391,6 +413,11 @@ overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_hatch + //anim_parts = "ul=-9,9;ur=9,9;dl=-9,-9;dr=9,-9" + anim_parts = "ul=-15,0,0,4,-90;ur=0,15,0,4,-90;dl=0,-15,0,4,-90;dr=15,0,0,4,-90" + note_attachment = "ul" + panel_attachment = "dr" + allow_repaint = FALSE /obj/machinery/door/airlock/maintenance_hatch name = "maintenance hatch" @@ -398,6 +425,11 @@ overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_mhatch + //anim_parts = "ul=-9,9;ur=9,9;dl=-9,-9;dr=9,-9" + anim_parts = "ul=-15,0,0,4,-90;ur=0,15,0,4,-90;dl=0,-15,0,4,-90;dr=15,0,0,4,-90" + note_attachment = "ul" + panel_attachment = "dr" + allow_repaint = FALSE ////////////////////////////////// /* @@ -408,6 +440,7 @@ name = "high tech security airlock" icon = 'icons/obj/doors/airlocks/highsec/highsec.dmi' overlays_file = 'icons/obj/doors/airlocks/highsec/overlays.dmi' + anim_parts = "rightu=14,0;left=-14,0;right=14,0" assemblytype = /obj/structure/door_assembly/door_assembly_highsecurity explosion_block = 2 normal_integrity = 500 @@ -424,6 +457,7 @@ icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi' overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_shuttle + anim_parts = "rightu=11,0;left=-12,0;right=11,0" /obj/machinery/door/airlock/shuttle/glass opacity = 0 @@ -436,12 +470,14 @@ overlays_file = 'icons/obj/doors/airlocks/abductor/overlays.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_abductor note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi' + anim_parts="p1=0,40,0,5;p2=0,24,2,5;p3=0,-36,0.5,5;p4=0,16,3,5;p5=0,-40,0,5;p6=0,32,1,5;p7=0,-24,2,5" // the door has 7 fucking parts. SEVEN. damage_deflection = 30 explosion_block = 3 hackProof = TRUE aiControlDisabled = 1 normal_integrity = 700 security_level = 1 + allow_repaint = FALSE ////////////////////////////////// /* @@ -460,6 +496,7 @@ var/openingoverlaytype = /obj/effect/temp_visual/cult/door var/friendly = FALSE var/stealthy = FALSE + allow_repaint = FALSE /obj/machinery/door/airlock/cult/Initialize() . = ..() @@ -552,7 +589,7 @@ desc = "An airlock hastily corrupted by blood magic, it is unusually brittle in this state." normal_integrity = 150 damage_deflection = 5 - 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, "stamina" = 0) ////////////////////////////////// /* @@ -563,10 +600,14 @@ name = "large glass airlock" icon = 'icons/obj/doors/airlocks/glass_large/glass_large.dmi' overlays_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi' + mask_file = 'icons/obj/doors/airlocks/mask_64x32_airlocks.dmi' + mask_x = 16 // byond is consistent and sane + anim_parts = "left=-21,0;right=21,0;top=0,29" opacity = 0 assemblytype = null glass = TRUE bound_width = 64 // 2x1 + allow_repaint = FALSE /obj/machinery/door/airlock/glass_large/narsie_act() return diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 7f8ab0f3c0338..61023ee9d8fa2 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -2,11 +2,8 @@ #define FONT_SIZE "5pt" #define FONT_COLOR "#09f" #define FONT_STYLE "Small Fonts" -#define MAX_TIMER 9000 -#define PRESET_SHORT 1200 -#define PRESET_MEDIUM 1800 -#define PRESET_LONG 3000 + @@ -25,13 +22,20 @@ desc = "A remote control for a door." req_access = list(ACCESS_SECURITY) density = FALSE + layer = ABOVE_WINDOW_LAYER var/id = null // id of linked machinery/lockers var/activation_time = 0 var/timer_duration = 0 - var/timing = FALSE // boolean, true/1 timer is on, false/0 means it's not timing - var/list/obj/machinery/targets = list() + var/timing = FALSE // boolean, true/1 timer is on, false/0 means it's not timing + ///List of weakrefs to nearby doors + var/list/doors = list() + ///List of weakrefs to nearby flashers + var/list/flashers = list() + ///List of weakrefs to nearby closets + var/list/closets = list() + var/obj/item/radio/Radio //needed to send messages to sec radio maptext_height = 26 @@ -51,17 +55,17 @@ if(id != null) for(var/obj/machinery/door/window/brigdoor/M in urange(20, src)) if (M.id == id) - targets += M + doors += WEAKREF(M) for(var/obj/machinery/flasher/F in urange(20, src)) if(F.id == id) - targets += F + flashers += WEAKREF(F) for(var/obj/structure/closet/secure_closet/brig/C in urange(20, src)) if(C.id == id) - targets += C + closets += WEAKREF(C) - if(!targets.len) + if(!length(doors) && !length(flashers) && length(closets)) stat |= BROKEN update_icon() @@ -92,18 +96,26 @@ activation_time = world.time timing = TRUE - for(var/obj/machinery/door/window/brigdoor/door in targets) + for(var/datum/weakref/door_ref as anything in doors) + var/obj/machinery/door/window/brigdoor/door = door_ref.resolve() + if(!door) + doors -= door_ref + continue if(door.density) continue INVOKE_ASYNC(door, /obj/machinery/door/window/brigdoor.proc/close) - for(var/obj/structure/closet/secure_closet/brig/C in targets) - if(C.broken) + for(var/datum/weakref/closet_ref as anything in closets) + var/obj/structure/closet/secure_closet/brig/closet = closet_ref.resolve() + if(!closet) + closets -= closet_ref continue - if(C.opened && !C.close()) + if(closet.broken) continue - C.locked = TRUE - C.update_icon() + if(closet.opened && !closet.close()) + continue + closet.locked = TRUE + closet.update_icon() return 1 @@ -120,19 +132,28 @@ activation_time = null set_timer(0) update_icon() + ui_update() - for(var/obj/machinery/door/window/brigdoor/door in targets) + for(var/datum/weakref/door_ref as anything in doors) + var/obj/machinery/door/window/brigdoor/door = door_ref.resolve() + if(!door) + doors -= door_ref + continue if(!door.density) continue INVOKE_ASYNC(door, /obj/machinery/door/window/brigdoor.proc/open) - for(var/obj/structure/closet/secure_closet/brig/C in targets) - if(C.broken) + for(var/datum/weakref/closet_ref as anything in closets) + var/obj/structure/closet/secure_closet/brig/closet = closet_ref.resolve() + if(!closet) + closets -= closet_ref + continue + if(closet.broken) continue - if(C.opened) + if(closet.opened) continue - C.locked = FALSE - C.update_icon() + closet.locked = FALSE + closet.update_icon() return 1 @@ -143,11 +164,16 @@ . /= 10 /obj/machinery/door_timer/proc/set_timer(value) - var/new_time = clamp(value,0,MAX_TIMER) + var/new_time = clamp(value,0,CONFIG_GET(number/brig_timer_max) MINUTES) . = new_time == timer_duration //return 1 on no change timer_duration = new_time +/obj/machinery/door_timer/ui_requires_update(mob/user, datum/tgui/ui) + . = ..() + if(timing) + . = TRUE // Autoupdate while timer is counting down + /obj/machinery/door_timer/ui_state(mob/user) return GLOB.default_state @@ -207,8 +233,12 @@ data["minutes"] = round((time_left - data["seconds"]) / 60) data["timing"] = timing data["flash_charging"] = FALSE - for(var/obj/machinery/flasher/F in targets) - if(F.last_flash && (F.last_flash + 150) > world.time) + for(var/datum/weakref/flash_ref as anything in flashers) + var/obj/machinery/flasher/flasher = flash_ref.resolve() + if(!flasher) + flashers -= flash_ref + continue + if(flasher.last_flash && (flasher.last_flash + 15 SECONDS) > world.time) data["flash_charging"] = TRUE break return data @@ -219,6 +249,8 @@ return . = TRUE + var/mob/user = usr + if(!allowed(usr)) to_chat(usr, "Access denied.") return FALSE @@ -227,36 +259,47 @@ if("time") var/value = text2num(params["adjust"]) if(value) - . = set_timer(time_left()+value) + . = !set_timer(time_left()+value) + investigate_log("[key_name(usr)] modified the timer by [value/10] seconds for cell [id], currently [time_left(seconds = TRUE)]", INVESTIGATE_RECORDS) + user.log_message("modified the timer by [value/10] seconds for cell [id], currently [time_left(seconds = TRUE)]", LOG_ATTACK) if("start") timer_start() + investigate_log("[key_name(usr)] has started [id]'s timer of [time_left(seconds = TRUE)] seconds", INVESTIGATE_RECORDS) + user.log_message("has started [id]'s timer of [time_left(seconds = TRUE)] seconds", LOG_ATTACK) if("stop") + investigate_log("[key_name(usr)] has stopped [id]'s timer of [time_left(seconds = TRUE)] seconds", INVESTIGATE_RECORDS) + user.log_message("[key_name(usr)] has stopped [id]'s timer of [time_left(seconds = TRUE)] seconds", LOG_ATTACK) timer_end(forced = TRUE) if("flash") - for(var/obj/machinery/flasher/F in targets) - F.flash() + investigate_log("[key_name(usr)] has flashed cell [id]", INVESTIGATE_RECORDS) + user.log_message("[key_name(usr)] has flashed cell [id]", LOG_ATTACK) + for(var/datum/weakref/flash_ref as anything in flashers) + var/obj/machinery/flasher/flasher = flash_ref.resolve() + if(!flasher) + flashers -= flash_ref + continue + flasher.flash() if("preset") var/preset = params["preset"] var/preset_time = time_left() switch(preset) if("short") - preset_time = PRESET_SHORT + preset_time = CONFIG_GET(number/brig_timer_preset_short) MINUTES if("medium") - preset_time = PRESET_MEDIUM + preset_time = CONFIG_GET(number/brig_timer_preset_med) MINUTES if("long") - preset_time = PRESET_LONG - . = set_timer(preset_time) + preset_time = CONFIG_GET(number/brig_timer_preset_long) MINUTES + . = !set_timer(preset_time) + investigate_log("[key_name(usr)] set cell [id]'s timer to [preset_time/10] seconds", INVESTIGATE_RECORDS) + user.log_message("set cell [id]'s timer to [preset_time/10] seconds", LOG_ATTACK) if(timing) activation_time = world.time else . = FALSE -#undef PRESET_SHORT -#undef PRESET_MEDIUM -#undef PRESET_LONG -#undef MAX_TIMER + #undef FONT_SIZE #undef FONT_COLOR #undef FONT_STYLE diff --git a/code/game/machinery/doors/checkForMultipleDoors.dm b/code/game/machinery/doors/checkForMultipleDoors.dm index 3c1364dfdd9dd..55c0ba82b3620 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 - return 1 \ No newline at end of file + //There are no false wall checks because that would be fucking stupid + return 1 diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index b40b44fcf26d7..e2729c287e4ab 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -9,9 +9,10 @@ layer = OPEN_DOOR_LAYER power_channel = AREA_USAGE_ENVIRON max_integrity = 350 - armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 70) + armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 70, "stamina" = 0) CanAtmosPass = ATMOS_PASS_DENSITY flags_1 = PREVENT_CLICK_UNDER_1 + ricochet_chance_mod = 0.8 damage_deflection = 10 interaction_flags_atom = INTERACT_ATOM_UI_INTERACT @@ -35,7 +36,7 @@ var/datum/effect_system/spark_spread/spark_system var/real_explosion_block //ignore this, just use explosion_block var/red_alert_access = FALSE //if TRUE, this door will always open on red alert - var/poddoor = FALSE + var/poddoor = FALSE var/unres_sides = 0 //Unrestricted sides. A bitflag for which direction (if any) can open the door with no access var/open_speed = 5 @@ -218,7 +219,7 @@ return max_moles - min_moles > 20 /obj/machinery/door/attackby(obj/item/I, mob/user, params) - if(user.a_intent != INTENT_HARM && (I.tool_behaviour == TOOL_CROWBAR || istype(I, /obj/item/twohanded/fireaxe))) + if(user.a_intent != INTENT_HARM && (I.tool_behaviour == TOOL_CROWBAR || istype(I, /obj/item/fireaxe))) try_to_crowbar(I, user) return 1 else if(I.tool_behaviour == TOOL_WELDER) @@ -352,12 +353,16 @@ L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans. L.emote("roar") else if(ishuman(L)) //For humans - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) + var/armour = L.run_armor_check(BODY_ZONE_CHEST, "melee") + var/multiplier = CLAMP(1 - (armour * 0.01), 0, 1) + L.adjustBruteLoss(multiplier * DOOR_CRUSH_DAMAGE) L.emote("scream") - L.Paralyze(100) + if(!L.IsParalyzed()) + L.Paralyze(60) else if(ismonkey(L)) //For monkeys L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - L.Paralyze(100) + if(!L.IsParalyzed()) + L.Paralyze(60) else //for simple_animals & borgs L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) var/turf/location = get_turf(src) @@ -384,7 +389,7 @@ if(!glass && GLOB.cameranet) GLOB.cameranet.updateVisibility(src, 0) -/obj/machinery/door/BlockSuperconductivity() // All non-glass airlocks block heat, this is intended. +/obj/machinery/door/BlockThermalConductivity() // All non-glass airlocks block heat, this is intended. if(opacity || heat_proof) return 1 return 0 diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 0f2ae85a3dc42..b8655cd325a56 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -4,9 +4,11 @@ #define CONSTRUCTION_GUTTED 3 //Wires are removed, circuit ready to remove #define CONSTRUCTION_NOCIRCUIT 4 //Circuit board removed, can safely weld apart +#define RECLOSE_DELAY 5 SECONDS // How long until a firelock tries to shut itself if it's blocking a vacuum. + /obj/machinery/door/firedoor name = "firelock" - desc = "A convenable firelock. Equipt with a manual lever for operating in case of emergency." + desc = "A convenable firelock. Equipped with a manual lever for operating in case of emergency." icon = 'icons/obj/doors/doorfireglass.dmi' icon_state = "door_open" opacity = FALSE @@ -21,7 +23,7 @@ layer = BELOW_OPEN_DOOR_LAYER closingLayer = CLOSED_FIREDOOR_LAYER assemblytype = /obj/structure/firelock_frame - armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 70) + armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 70, "stamina" = 0) interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN air_tight = TRUE open_speed = 2 @@ -71,26 +73,17 @@ return ..() /obj/machinery/door/firedoor/Bumped(atom/movable/AM) - if(panel_open || operating || welded || (stat & NOPOWER)) + if(panel_open || operating) return - if(ismob(AM)) - var/mob/user = AM - if(allow_hand_open(user)) - add_fingerprint(user) - open() - return TRUE - if(ismecha(AM)) - var/obj/mecha/M = AM - if(M.occupant && allow_hand_open(M.occupant)) - open() - return TRUE + if(!density) + return ..() return FALSE /obj/machinery/door/firedoor/power_change() if(powered(power_channel)) stat &= ~NOPOWER - latetoggle() + INVOKE_ASYNC(src, .proc/latetoggle) else stat |= NOPOWER @@ -98,26 +91,10 @@ . = ..() if(.) return - - if (!welded && !operating) - if (stat & NOPOWER) - user.visible_message("[user] tries to open \the [src] manually.", - "You operate the manual lever on \the [src].") - if (!do_after(user, 30, TRUE, src)) - return FALSE - else if (density && !allow_hand_open(user)) - return FALSE - - add_fingerprint(user) - if(density) - emergency_close_timer = world.time + 15 // prevent it from instaclosing again if in space - open() - else - close() - return TRUE + if(operating || !density) return - + user.changeNext_move(CLICK_CD_MELEE) user.visible_message("[user] bangs on \the [src].", @@ -181,7 +158,7 @@ whack_a_mole() if(welded || operating || !density) return // in case things changed during our do_after - emergency_close_timer = world.time + 15 // prevent it from instaclosing again if in space + emergency_close_timer = world.time + RECLOSE_DELAY // prevent it from instaclosing again if in space open() else close() @@ -236,6 +213,8 @@ latetoggle() /obj/machinery/door/firedoor/close() + if(HAS_TRAIT(loc, TRAIT_FIREDOOR_STOP)) + return . = ..() latetoggle() @@ -298,7 +277,6 @@ if(!(flags_1 & NODECONSTRUCT_1)) var/obj/structure/firelock_frame/F = new assemblytype(get_turf(src)) F.dir = src.dir - F.firelock_type = src.type if(disassembled) F.constructionStep = CONSTRUCTION_PANEL_OPEN else @@ -325,6 +303,11 @@ CanAtmosPass = ATMOS_PASS_PROC assemblytype = /obj/structure/firelock_frame/border +/obj/machinery/door/firedoor/border_only/Destroy() + density = FALSE + air_update_turf(1) + return ..() + /obj/machinery/door/firedoor/border_only/closed icon_state = "door_closed" opacity = TRUE @@ -423,6 +406,10 @@ heat_proof = FALSE assemblytype = /obj/structure/firelock_frame/window +/obj/machinery/door/firedoor/window/attack_alien(mob/living/carbon/alien/humanoid/user) + playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) + return attack_generic(user, 60, BRUTE, "melee", 0) + /obj/item/electronics/firelock name = "firelock circuitry" custom_price = 5 @@ -438,7 +425,7 @@ density = TRUE var/constructionStep = CONSTRUCTION_NOCIRCUIT var/reinforced = 0 - var/firelock_type + var/firelock_type = /obj/machinery/door/firedoor /obj/structure/firelock_frame/examine(mob/user) . = ..() @@ -491,12 +478,9 @@ user.visible_message("[user] finishes the firelock.", \ "You finish the firelock.") playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1) - if(reinforced) - new /obj/machinery/door/firedoor/heavy(get_turf(src)) - else - var/obj/machinery/door/firedoor/F = new firelock_type(get_turf(src)) - F.dir = src.dir - F.update_icon() + var/obj/machinery/door/firedoor/F = new firelock_type(get_turf(src)) + F.dir = src.dir + F.update_icon() qdel(src) return if(istype(C, /obj/item/stack/sheet/plasteel)) @@ -517,7 +501,8 @@ "You reinforce [src].") playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1) P.use(2) - reinforced = 1 + reinforced = TRUE + firelock_type = /obj/machinery/door/firedoor/heavy return if(CONSTRUCTION_WIRES_EXPOSED) @@ -591,12 +576,21 @@ if(C.use_tool(src, user, 40, volume=50, amount=1)) if(constructionStep != CONSTRUCTION_NOCIRCUIT) return - user.visible_message("[user] cuts apart [src]!", \ - "You cut [src] into iron.") var/turf/T = get_turf(src) - new /obj/item/stack/sheet/iron(T, 3) - if(reinforced) - new /obj/item/stack/sheet/plasteel(T, 2) + switch(firelock_type) + if(/obj/machinery/door/firedoor/heavy) + user.visible_message("[user] cuts apart [src]!", \ + "You cut [src] into iron and plasteel.") + new /obj/item/stack/sheet/plasteel(T, 2) + new /obj/item/stack/sheet/iron(T, 3) + if(/obj/machinery/door/firedoor/window) + user.visible_message("[user] cuts apart [src]!", \ + "You cut [src] into reinforced glass.") + new /obj/item/stack/sheet/rglass(T,2) + else + user.visible_message("[user] cuts apart [src]!", \ + "You cut [src] into iron.") + new /obj/item/stack/sheet/iron(T, 3) qdel(src) return if(istype(C, /obj/item/electronics/firelock)) @@ -649,11 +643,14 @@ /obj/structure/firelock_frame/heavy name = "heavy firelock frame" reinforced = TRUE + firelock_type = /obj/machinery/door/firedoor/heavy /obj/structure/firelock_frame/border name = "firelock frame" icon = 'icons/obj/doors/edge_Doorfire.dmi' icon_state = "door_frame" + density = FALSE + firelock_type = /obj/machinery/door/firedoor/border_only /obj/structure/firelock_frame/border/ComponentInitialize() . = ..() @@ -672,6 +669,7 @@ name = "window firelock frame" icon = 'icons/obj/doors/doorfirewindow.dmi' icon_state = "door_frame" + firelock_type = /obj/machinery/door/firedoor/window /obj/structure/firelock_frame/window/update_icon() return diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index fcbb214bb66aa..d383e9ecb9d1c 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -6,7 +6,7 @@ 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) + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 0) resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF damage_deflection = 70 var/password = "Swordfish" @@ -20,9 +20,9 @@ /obj/machinery/door/password/Initialize(mapload) . = ..() if(voice_activated) - flags_1 |= HEAR_1 + become_hearing_sensitive() -/obj/machinery/door/password/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/obj/machinery/door/password/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) . = ..() if(!density || !voice_activated || radio_freq) return @@ -70,4 +70,4 @@ return /obj/machinery/door/password/ex_act(severity, target) - return \ No newline at end of file + return diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 5ea8a280fd595..a4969f2e3bebf 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -11,7 +11,7 @@ heat_proof = TRUE safe = FALSE max_integrity = 600 - armor = list("melee" = 50, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 70) + armor = list("melee" = 50, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 70, "stamina" = 0) resistance_flags = FIRE_PROOF damage_deflection = 70 poddoor = TRUE diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index ef2ba11d60774..9ab76e7d75360 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -9,7 +9,7 @@ var/base_state = "left" max_integrity = 150 //If you change this, consider changing ../door/window/brigdoor/ max_integrity at the bottom of this .dm file integrity_failure = 0 - armor = list("melee" = 20, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 70, "acid" = 100) + armor = list("melee" = 20, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 70, "acid" = 100, "stamina" = 0) visible = FALSE flags_1 = ON_BORDER_1 opacity = 0 @@ -42,6 +42,7 @@ /obj/machinery/door/window/Destroy() density = FALSE + air_update_turf(1) QDEL_LIST(debris) if(obj_integrity == 0) playsound(src, "shatter", 70, 1) @@ -316,6 +317,10 @@ if(!hasPower()) return + //Check radio signal jamming + if(is_jammed()) + return + // Check packet access level. if(!check_access_ntnet(data)) return @@ -354,7 +359,7 @@ /obj/machinery/door/window/brigdoor/security/holding name = "holding cell door" - req_one_access = list(ACCESS_SEC_DOORS, ACCESS_LAWYER) //love for the lawyer + req_one_access = list(ACCESS_SEC_DOORS, ACCESS_LAWYER, ACCESS_BRIGPHYS) //love for the lawyer and Brig Phys /obj/machinery/door/window/clockwork name = "brass windoor" @@ -364,7 +369,7 @@ shards = 0 rods = 0 max_integrity = 50 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 70, "acid" = 100) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 70, "acid" = 100, "stamina" = 0) resistance_flags = FIRE_PROOF | ACID_PROOF var/made_glow = FALSE @@ -403,6 +408,9 @@ animate(src, color = previouscolor, time = 8) addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8) +/obj/machinery/door/window/clockwork/ratvar_act() + return FALSE + /obj/machinery/door/window/clockwork/attackby(obj/item/I, mob/living/user, params) if(operating) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 93f338efaa786..9e1339c0453b8 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -1,7 +1,5 @@ #define PRINTER_TIMEOUT 40 -GLOBAL_LIST_EMPTY(doppler_arrays) - /obj/machinery/doppler_array name = "tachyon-doppler array" desc = "A highly precise directional sensor array which measures the release of quants from decaying tachyons. The doppler shifting of the mirror-image formed by these quants can reveal the size, location and temporal affects of energetic disturbances within a large radius ahead of the array.\n" @@ -22,17 +20,13 @@ GLOBAL_LIST_EMPTY(doppler_arrays) /obj/machinery/doppler_array/Initialize() . = ..() - GLOB.doppler_arrays += src + RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, .proc/sense_explosion) printer_ready = world.time + PRINTER_TIMEOUT /obj/machinery/doppler_array/ComponentInitialize() . = ..() AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE,null,null,CALLBACK(src,.proc/rot_message)) -/obj/machinery/doppler_array/Destroy() - GLOB.doppler_arrays -= src - return ..() - /datum/data/tachyon_record name = "Log Recording" var/timestamp @@ -81,13 +75,13 @@ GLOBAL_LIST_EMPTY(doppler_arrays) if(!records || !(record in records)) return records -= record - return TRUE + . = TRUE if("print_record") var/datum/data/tachyon_record/record = locate(params["ref"]) in records if(!records || !(record in records)) return print(usr, record) - return TRUE + . = TRUE /obj/machinery/doppler_array/proc/print(mob/user, datum/data/tachyon_record/record) if(!record) @@ -140,16 +134,18 @@ GLOBAL_LIST_EMPTY(doppler_arrays) to_chat(user, "You adjust [src]'s dish to face to the [dir2text(dir)].") playsound(src, 'sound/items/screwdriver2.ogg', 50, 1) -/obj/machinery/doppler_array/proc/sense_explosion(turf/epicenter,devastation_range,heavy_impact_range,light_impact_range, +/obj/machinery/doppler_array/proc/sense_explosion(datum/source,turf/epicenter,devastation_range,heavy_impact_range,light_impact_range, took,orig_dev_range,orig_heavy_range,orig_light_range) + SIGNAL_HANDLER + if(stat & NOPOWER) return FALSE var/turf/zone = get_turf(src) - if(zone.z != epicenter.z) + if(zone.get_virtual_z_level() != epicenter.get_virtual_z_level()) return FALSE if(next_announce > world.time) - return + return FALSE next_announce = world.time + cooldown var/distance = get_dist(epicenter, zone) @@ -185,6 +181,8 @@ GLOBAL_LIST_EMPTY(doppler_arrays) record_number++ records += R + //Update to viewers + ui_update() return TRUE /obj/machinery/doppler_array/power_change() @@ -210,10 +208,11 @@ GLOBAL_LIST_EMPTY(doppler_arrays) desc = "A specialized tachyon-doppler bomb detection array that uses the results of the highest yield of explosions for research." var/datum/techweb/linked_techweb -/obj/machinery/doppler_array/research/sense_explosion(turf/epicenter, dev, heavy, light, time, orig_dev, orig_heavy, orig_light) //probably needs a way to ignore admin explosives later on +/obj/machinery/doppler_array/research/sense_explosion(datum/source, turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, + took, orig_dev_range, orig_heavy_range, orig_light_range) //probably needs a way to ignore admin explosives later on . = ..() if(!.) - return FALSE + return if(!istype(linked_techweb)) say("Warning: No linked research system!") return @@ -221,11 +220,11 @@ GLOBAL_LIST_EMPTY(doppler_arrays) var/point_gain = 0 /*****The Point Calculator*****/ - if(orig_light < 10) + if(orig_light_range < 10) say("Explosion not large enough for research calculations.") return - else if(orig_light < 4500) - point_gain = (83300 * orig_light) / (orig_light + 3000) + else if(orig_light_range < 4500) + point_gain = (83300 * orig_light_range) / (orig_light_range + 3000) else point_gain = TECHWEB_BOMB_POINTCAP diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index c3f6a9a6cdd59..d29cecdb54f34 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -30,7 +30,7 @@ var/cooldownTime = 1800 //3 minutes var/production_time = 30 //The item the dispenser will create - var/dispense_type = /obj/item/drone_shell + var/dispense_type = /obj/effect/mob_spawn/drone // The maximum number of "idle" drone shells it will make before // ceasing production. Set to 0 for infinite. @@ -61,7 +61,7 @@ /obj/machinery/droneDispenser/syndrone //Please forgive me name = "syndrone shell dispenser" desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with iron and glass. Disgusting." - dispense_type = /obj/item/drone_shell/syndrone + dispense_type = /obj/effect/mob_spawn/drone/syndrone //If we're gonna be a jackass, go the full mile - 10 second recharge timer cooldownTime = 100 end_create_message = "dispenses a suspicious drone shell." @@ -70,14 +70,14 @@ /obj/machinery/droneDispenser/syndrone/badass //Please forgive me name = "badass syndrone shell dispenser" desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with iron and glass. Disgusting. This one seems ominous." - dispense_type = /obj/item/drone_shell/syndrone/badass + dispense_type = /obj/effect/mob_spawn/drone/syndrone/badass end_create_message = "dispenses an ominous suspicious drone shell." // I don't need your forgiveness, this is awesome. /obj/machinery/droneDispenser/snowflake name = "snowflake drone shell dispenser" desc = "A hefty machine that, when supplied with iron and glass, will periodically create a snowflake drone shell. Does not need to be manually operated." - dispense_type = /obj/item/drone_shell/snowflake + dispense_type = /obj/effect/mob_spawn/drone/snowflake end_create_message = "dispenses a snowflake drone shell." // Those holoprojectors aren't cheap iron_cost = 2000 @@ -135,14 +135,9 @@ /obj/machinery/droneDispenser/power_change() ..() - if(powered()) - stat &= ~NOPOWER - else - stat |= NOPOWER update_icon() /obj/machinery/droneDispenser/process() - ..() if((stat & (NOPOWER|BROKEN)) || !anchored) return diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 9d67aa63bf7ba..262586b01f992 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -3,6 +3,10 @@ var/state var/obj/machinery/embedded_controller/master +/datum/computer/file/embedded_program/Destroy() + master = null + . = ..() + /datum/computer/file/embedded_program/proc/post_signal(datum/signal/signal, comm_line) if(master) master.post_signal(signal, comm_line) @@ -25,6 +29,11 @@ var/on = TRUE +/obj/machinery/embedded_controller/Destroy() + if(program) + QDEL_NULL(program) + . = ..() + /obj/machinery/embedded_controller/ui_interact(mob/user) . = ..() user.set_machine(src) @@ -54,9 +63,9 @@ usr.set_machine(src) addtimer(CALLBACK(src, .proc/updateDialog), 5) -/obj/machinery/embedded_controller/process() +/obj/machinery/embedded_controller/process(delta_time) if(program) - program.process() + program.process(delta_time) update_icon() src.updateDialog() diff --git a/code/game/machinery/embedded_controller/simple_vent_controller.dm b/code/game/machinery/embedded_controller/simple_vent_controller.dm index 7679080ea1f95..62fb1ad92663d 100644 --- a/code/game/machinery/embedded_controller/simple_vent_controller.dm +++ b/code/game/machinery/embedded_controller/simple_vent_controller.dm @@ -37,6 +37,7 @@ name = "vent controller" density = FALSE + layer = ABOVE_WINDOW_LAYER frequency = FREQ_ATMOS_CONTROL power_channel = AREA_USAGE_ENVIRON diff --git a/code/game/machinery/exp_cloner.dm b/code/game/machinery/exp_cloner.dm deleted file mode 100644 index e589f3794ea26..0000000000000 --- a/code/game/machinery/exp_cloner.dm +++ /dev/null @@ -1,303 +0,0 @@ -//Experimental cloner; clones a body regardless of the owner's status, letting a ghost control it instead -/obj/machinery/clonepod/experimental - name = "experimental cloning pod" - desc = "An ancient cloning pod. It seems to be an early prototype of the experimental cloners used in Nanotrasen Stations." - icon = 'icons/obj/machines/cloning.dmi' - icon_state = "pod_0" - req_access = null - circuit = /obj/item/circuitboard/machine/clonepod/experimental - internal_radio = FALSE - -//Start growing a human clone in the pod! -/obj/machinery/clonepod/experimental/growclone(clonename, ui, mutation_index, mindref, last_death, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance) - if(panel_open) - return NONE - if(mess || attempting) - return NONE - - attempting = TRUE //One at a time!! - countdown.start() - - var/mob/living/carbon/human/H = new /mob/living/carbon/human(src) - - H.hardset_dna(ui, mutation_index, H.real_name, null, mrace, features) - - if(efficiency > 2) - var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations) - H.dna.remove_mutation_group(unclean_mutations) - if(efficiency > 5 && prob(20)) - H.easy_randmut(POSITIVE) - if(efficiency < 3 && prob(50)) - var/mob/M = H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) - if(ismob(M)) - H = M - - H.silent = 20 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment. - occupant = H - - if(!clonename) //to prevent null names - clonename = "clone ([rand(1,999)])" - H.real_name = clonename - - icon_state = "pod_1" - //Get the clone body ready - maim_clone(H) - ADD_TRAIT(H, TRAIT_STABLEHEART, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_STABLELIVER, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_EMOTEMUTE, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_MUTE, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_NOBREATH, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT) - H.Unconscious(80) - - var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone?", null, null, null, 100, H, POLL_IGNORE_DEFECTIVECLONE) - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) - H.key = C.key - - if(grab_ghost_when == CLONER_FRESH_CLONE) - H.grab_ghost() - to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
      So this is what cloning feels like?
      ") - - if(grab_ghost_when == CLONER_MATURE_CLONE) - H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost - to_chat(H.get_ghost(TRUE), "Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.") - - if(H) - H.faction |= factions - - H.set_cloned_appearance() - - H.set_suicide(FALSE) - attempting = FALSE - return CLONING_DELETE_RECORD | CLONING_SUCCESS //so that we don't spam clones with autoprocess unless we leave a body in the scanner - - -//Prototype cloning console, much more rudimental and lacks modern functions such as saving records, autocloning, or safety checks. -/obj/machinery/computer/prototype_cloning - name = "prototype cloning console" - desc = "Used to operate an experimental cloner." - icon_screen = "dna" - icon_keyboard = "med_key" - circuit = /obj/item/circuitboard/computer/prototype_cloning - var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning. - var/list/pods //Linked experimental cloning pods - var/temp = "Inactive" - var/scantemp = "Ready to Scan" - var/loading = FALSE // Nice loading text - - light_color = LIGHT_COLOR_BLUE - -/obj/machinery/computer/prototype_cloning/Initialize() - . = ..() - updatemodules(TRUE) - -/obj/machinery/computer/prototype_cloning/Destroy() - if(pods) - for(var/P in pods) - DetachCloner(P) - pods = null - return ..() - -/obj/machinery/computer/prototype_cloning/proc/GetAvailablePod(mind = null) - if(pods) - for(var/P in pods) - var/obj/machinery/clonepod/experimental/pod = P - if(pod.is_operational() && !(pod.occupant || pod.mess)) - return pod - -/obj/machinery/computer/prototype_cloning/proc/updatemodules(findfirstcloner) - scanner = findscanner() - if(findfirstcloner && !LAZYLEN(pods)) - findcloner() - -/obj/machinery/computer/prototype_cloning/proc/findscanner() - var/obj/machinery/dna_scannernew/scannerf = null - - // Loop through every direction - for(var/direction in GLOB.cardinals) - // Try to find a scanner in that direction - scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, direction)) - // If found and operational, return the scanner - if (!isnull(scannerf) && scannerf.is_operational()) - return scannerf - - // If no scanner was found, it will return null - return null - -/obj/machinery/computer/prototype_cloning/proc/findcloner() - var/obj/machinery/clonepod/experimental/podf = null - for(var/direction in GLOB.cardinals) - podf = locate(/obj/machinery/clonepod/experimental, get_step(src, direction)) - if (!isnull(podf) && podf.is_operational()) - AttachCloner(podf) - -/obj/machinery/computer/prototype_cloning/proc/AttachCloner(obj/machinery/clonepod/experimental/pod) - if(!pod.connected) - pod.connected = src - LAZYADD(pods, pod) - -/obj/machinery/computer/prototype_cloning/proc/DetachCloner(obj/machinery/clonepod/experimental/pod) - pod.connected = null - LAZYREMOVE(pods, pod) - -/obj/machinery/computer/prototype_cloning/attackby(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_MULTITOOL) - if(!multitool_check_buffer(user, W)) - return - var/obj/item/multitool/P = W - - if(istype(P.buffer, /obj/machinery/clonepod/experimental)) - if(get_area(P.buffer) != get_area(src)) - to_chat(user, "-% Cannot link machines across power zones. Buffer cleared %-") - P.buffer = null - return - to_chat(user, "-% Successfully linked [P.buffer] with [src] %-") - var/obj/machinery/clonepod/experimental/pod = P.buffer - if(pod.connected) - pod.connected.DetachCloner(pod) - AttachCloner(pod) - else - P.buffer = src - to_chat(user, "-% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-") - return - else - return ..() - -/obj/machinery/computer/prototype_cloning/attack_hand(mob/user) - if(..()) - return - interact(user) - -/obj/machinery/computer/prototype_cloning/interact(mob/user) - user.set_machine(src) - add_fingerprint(user) - - if(..()) - return - - updatemodules(TRUE) - - var/dat = "" - dat += "Refresh" - - dat += "

      Cloning Pod Status

      " - dat += "
      [temp] 
      " - - if (isnull(src.scanner) || !LAZYLEN(pods)) - dat += "

      Modules

      " - //dat += "Reload Modules" - if (isnull(src.scanner)) - dat += "ERROR: No Scanner detected!
      " - if (!LAZYLEN(pods)) - dat += "ERROR: No Pod detected
      " - - // Scan-n-Clone - if (!isnull(src.scanner)) - var/mob/living/scanner_occupant = get_mob_or_brainmob(scanner.occupant) - - dat += "

      Cloning

      " - - dat += "
      " - if(!scanner_occupant) - dat += "Scanner Unoccupied" - else if(loading) - dat += "[scanner_occupant] => Scanning..." - else - scantemp = "Ready to Clone" - dat += "[scanner_occupant] => [scantemp]" - dat += "
      " - - if(scanner_occupant) - dat += "Clone" - dat += "
      [src.scanner.locked ? "Unlock Scanner" : "Lock Scanner"]" - else - dat += "Clone" - - var/datum/browser/popup = new(user, "cloning", "Prototype Cloning System Control") - popup.set_content(dat) - popup.open() - -/obj/machinery/computer/prototype_cloning/Topic(href, href_list) - if(..()) - return - - if(loading) - return - - else if ((href_list["clone"]) && !isnull(scanner) && scanner.is_operational()) - scantemp = "" - - loading = TRUE - updateUsrDialog() - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) - say("Initiating scan...") - - spawn(20) - clone_occupant(scanner.occupant) - loading = FALSE - updateUsrDialog() - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) - - //No locking an open scanner. - else if ((href_list["lock"]) && !isnull(scanner) && scanner.is_operational()) - if ((!scanner.locked) && (scanner.occupant)) - scanner.locked = TRUE - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - else - scanner.locked = FALSE - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) - - else if (href_list["refresh"]) - updateUsrDialog() - playsound(src, "terminal_type", 25, 0) - - add_fingerprint(usr) - updateUsrDialog() - return - -/obj/machinery/computer/prototype_cloning/proc/clone_occupant(occupant) - var/mob/living/mob_occupant = get_mob_or_brainmob(occupant) - var/datum/dna/dna - if(ishuman(mob_occupant)) - var/mob/living/carbon/C = mob_occupant - dna = C.has_dna() - if(isbrain(mob_occupant)) - var/mob/living/brain/B = mob_occupant - dna = B.stored_dna - - if(!istype(dna)) - scantemp = "Unable to locate valid genetic data." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - return - if((HAS_TRAIT(mob_occupant, TRAIT_HUSK)) && (src.scanner.scan_level < 2)) - scantemp = "Subject's body is too damaged to scan properly." - playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0) - return - if(HAS_TRAIT(mob_occupant, TRAIT_BADDNA)) - scantemp = "Subject's DNA is damaged beyond any hope of recovery." - playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0) - return - - var/clone_species - if(dna.species) - clone_species = dna.species - else - var/datum/species/rando_race = pick(GLOB.roundstart_races) - clone_species = rando_race.type - - var/obj/machinery/clonepod/pod = GetAvailablePod() - //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. - if(!LAZYLEN(pods)) - temp = "No Clonepods detected." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - else if(!pod) - temp = "No Clonepods available." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - else if(pod.occupant) - temp = "Cloning cycle already in progress." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - else - pod.growclone(mob_occupant.real_name, dna.uni_identity, dna.mutation_index, null, null, clone_species, dna.features, mob_occupant.faction) - temp = "[mob_occupant.real_name] => Cloning data sent to pod." - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) diff --git a/code/game/machinery/fabricators/autolathe.dm b/code/game/machinery/fabricators/autolathe.dm new file mode 100644 index 0000000000000..669e251c6a1e9 --- /dev/null +++ b/code/game/machinery/fabricators/autolathe.dm @@ -0,0 +1,186 @@ +/obj/machinery/modular_fabricator/autolathe + name = "autolathe" + desc = "It produces items using iron, copper, 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/autolathe + + var/shocked = FALSE + var/hack_wire + var/disable_wire + var/shock_wire + + //Security modes + can_be_hacked_or_unlocked = TRUE + var/security_interface_locked = TRUE + var/hacked = FALSE + + categories = list( + "Tools", + "Electronics", + "Construction", + "T-Comm", + "Security", + "Machinery", + "Medical", + "Misc", + "Dinnerware", + "Imported" + ) + + accepts_disks = TRUE + + stored_research_type = /datum/techweb/specialized/autounlocking/autolathe + +/obj/machinery/modular_fabricator/autolathe/Initialize() + . = ..() + wires = new /datum/wires/autolathe(src) + +/obj/machinery/modular_fabricator/autolathe/ui_interact(mob/user, datum/tgui/ui = null) + if(!is_operational()) + return + + if(shocked && !(stat & NOPOWER)) + shock(user,50) + + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ModularFabricator") + ui.open() + ui.set_autoupdate(TRUE) + viewing_mobs += user + +/obj/machinery/modular_fabricator/autolathe/ui_data(mob/user) + var/list/data = ..() + + //Security interface + data["sec_interface_unlock"] = !security_interface_locked + data["hacked"] = hacked + + //Being Build + return data + +/obj/machinery/modular_fabricator/autolathe/ui_act(action, params) + . = ..() + if(.) + return + + switch(action) + if("toggle_safety") + if(security_interface_locked) + return + adjust_hacked(!hacked) + . = TRUE + + if("toggle_lock") + if(obj_flags & EMAGGED) + return + security_interface_locked = TRUE + . = TRUE + +/obj/machinery/modular_fabricator/autolathe/attackby(obj/item/O, mob/user, params) + + if((ACCESS_SECURITY in O.GetAccess()) && !(obj_flags & EMAGGED)) + security_interface_locked = !security_interface_locked + to_chat(user, "You [security_interface_locked?"lock":"unlock"] the security controls of [src].") + return TRUE + + if (busy) + to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.") + return TRUE + + if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O)) + 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] loads \the [O] into \the [src]...", + "You load a design from \the [O]...", + "You hear the chatter of a floppy drive.") + inserted_disk = O + O.forceMove(src) + update_viewer_statics() + return TRUE + + return ..() + +/obj/machinery/modular_fabricator/autolathe/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 + wires.ui_update() + +/obj/machinery/modular_fabricator/autolathe/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/modular_fabricator/autolathe/proc/adjust_hacked(state) + hacked = state + 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(hacked) + stored_research.add_design(D) + else + stored_research.remove_design(D) + update_viewer_statics() + wires.ui_update() + +/obj/machinery/modular_fabricator/autolathe/emag_act(mob/user) + if(obj_flags & EMAGGED) + return + security_interface_locked = FALSE + adjust_hacked(TRUE) + playsound(src, "sparks", 100, 1) + obj_flags |= EMAGGED + +/obj/machinery/modular_fabricator/autolathe/hacked/Initialize() + . = ..() + adjust_hacked(TRUE) + +/obj/machinery/modular_fabricator/autolathe/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted) + . = ..() + switch(id_inserted) + if (/datum/material/iron) + flick("autolathe_o",src)//plays metal insertion animation + if(/datum/material/copper) + flick("autolathe_c",src)//plays metal insertion animation + else + flick("autolathe_r",src)//plays glass insertion animation by default otherwise + +/obj/machinery/modular_fabricator/autolathe/set_default_sprite() + icon_state = "autolathe" + +/obj/machinery/modular_fabricator/autolathe/set_working_sprite() + icon_state = "autolathe_n" diff --git a/code/game/machinery/fabricators/exosuit_fab.dm b/code/game/machinery/fabricators/exosuit_fab.dm new file mode 100644 index 0000000000000..aa1fad5638971 --- /dev/null +++ b/code/game/machinery/fabricators/exosuit_fab.dm @@ -0,0 +1,68 @@ +/obj/machinery/modular_fabricator/exosuit_fab + icon = 'icons/obj/robotics.dmi' + icon_state = "fab-idle" + name = "exosuit fabricator" + desc = "An advanced machine containing many internal robotic arms which fabricate components for robots and exosuits." + density = TRUE + use_power = IDLE_POWER_USE + idle_power_usage = 20 + active_power_usage = 5000 + req_access = list(ACCESS_ROBOTICS) + circuit = /obj/item/circuitboard/machine/mechfab + + output_direction = SOUTH + + remote_materials = TRUE + can_sync = TRUE + can_print_category = TRUE + + categories = list( + "Cyborg", + "Ripley", + "Firefighter", + "Odysseus", + "Gygax", + "Durand", + "H.O.N.K", + "Phazon", + "Exosuit Equipment", + "Cyborg Upgrade Modules", + "IPC Components", + "Cybernetics", + "Implants", + "Control Interfaces", + "Misc" + ) + + stored_research_type = /datum/techweb/specialized/autounlocking/exofab + +/obj/machinery/modular_fabricator/exosuit_fab/screwdriver_act(mob/living/user, obj/item/I) + if(..()) + return TRUE + if(being_built) + to_chat(user, "\The [src] is currently processing! Please wait until completion.") + return FALSE + return default_deconstruction_screwdriver(user, "fab-o", "fab-idle", I) + +/obj/machinery/modular_fabricator/exosuit_fab/crowbar_act(mob/living/user, obj/item/I) + if(..()) + return TRUE + if(being_built) + to_chat(user, "\The [src] is currently processing! Please wait until completion.") + return FALSE + return default_deconstruction_crowbar(I) + +/obj/machinery/modular_fabricator/exosuit_fab/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted) + . = ..() + var/datum/material/M = id_inserted + add_overlay("fab-load-[M.name]") + addtimer(CALLBACK(src, /atom/proc/cut_overlay, "fab-load-[M.name]"), 10) + +/obj/machinery/modular_fabricator/exosuit_fab/set_default_sprite() + cut_overlay("fab-active") + +/obj/machinery/modular_fabricator/exosuit_fab/set_working_sprite() + add_overlay("fab-active") + +/obj/machinery/modular_fabricator/exosuit_fab/maint + auto_link = FALSE diff --git a/code/game/machinery/fabricators/modular_fabricator.dm b/code/game/machinery/fabricators/modular_fabricator.dm new file mode 100644 index 0000000000000..268576a2eb703 --- /dev/null +++ b/code/game/machinery/fabricators/modular_fabricator.dm @@ -0,0 +1,499 @@ +#define MODFAB_MAX_POWER_USE 2000 + +/obj/machinery/modular_fabricator + name = "modular fabricator" + desc = "It produces items using iron, copper, and glass." + icon_state = "autolathe" + density = TRUE + use_power = IDLE_POWER_USE + idle_power_usage = 10 + active_power_usage = 100 + layer = BELOW_OBJ_LAYER + + var/operating = FALSE + var/wants_operate = FALSE + var/disabled = 0 + + var/busy = FALSE + ///the multiplier for how much materials the created object takes from this machines stored materials + var/creation_efficiency = 1.6 + + var/can_sync = FALSE + var/can_be_hacked_or_unlocked = FALSE + var/can_print_category = FALSE + + var/datum/design/being_built + var/process_completion_world_tick = 0 + var/total_build_time = 0 + var/datum/techweb/stored_research + + var/list/categories = list( + "Tools", + "Electronics", + "Construction", + "T-Comm", + "Security", + "Machinery", + "Medical", + "Misc", + "Dinnerware", + "Imported" + ) + + var/output_direction = 0 + var/accepts_disks = FALSE + var/obj/item/disk/design_disk/inserted_disk + + var/remote_materials = FALSE + var/auto_link = FALSE + + //A list of all the printable items + + //Queue items + + //Viewing mobs of the UI to update + var/list/mob/viewing_mobs = list() + //Associative list: item_queue[design_id] = list("amount" = int, "repeating" = bool, "build_mat" = something) + //The items in the item queue + var/list/item_queue = list() + //If true, once an item is processed it will be stuck right back on again + var/queue_repeating = FALSE + //The amount to readd to the queue when processing is done + var/stored_item_amount + //Minimum construction time per component + var/minimum_construction_time = 35 + + var/stored_research_type = /datum/techweb/specialized/autounlocking/autolathe + +/obj/machinery/modular_fabricator/Initialize(mapload) + if(remote_materials) + AddComponent(/datum/component/remote_materials, "modfab", mapload, TRUE, auto_link) + else + AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass, /datum/material/copper, /datum/material/gold, /datum/material/gold, /datum/material/silver, /datum/material/diamond, /datum/material/uranium, /datum/material/plasma, /datum/material/bluespace, /datum/material/bananium, /datum/material/titanium), 0, TRUE, null, null, CALLBACK(src, .proc/AfterMaterialInsert)) + . = ..() + stored_research = new stored_research_type + +/obj/machinery/modular_fabricator/Destroy() + QDEL_NULL(wires) + return ..() + +/obj/machinery/modular_fabricator/proc/get_material_container() + var/datum/component/remote_materials/materials = GetComponent(/datum/component/remote_materials) + if(materials?.mat_container) + return materials.mat_container + var/datum/component/material_container/container = GetComponent(/datum/component/material_container) + return container + +/obj/machinery/modular_fabricator/RefreshParts() + var/mat_capacity = 0 + for(var/obj/item/stock_parts/matter_bin/new_matter_bin in component_parts) + mat_capacity += new_matter_bin.rating*75000 + //Material container + var/datum/component/remote_materials/materials = GetComponent(/datum/component/remote_materials) + if(materials) + materials.set_local_size(mat_capacity) + else + var/datum/component/material_container/container = GetComponent(/datum/component/material_container) + container.max_amount = mat_capacity + + var/efficiency = 1.8 + for(var/obj/item/stock_parts/manipulator/new_manipulator in component_parts) + efficiency -= new_manipulator.rating*0.2 + creation_efficiency = max(1,efficiency) // creation_efficiency goes 1.6 -> 1.4 -> 1.2 -> 1 per level of manipulator efficiency + +/obj/machinery/modular_fabricator/examine(mob/user) + . += ..() + var/datum/component/material_container/materials = get_material_container() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Storing up to [materials.max_amount] material units.
      Material consumption at [creation_efficiency*100]%.
      " + +/obj/machinery/modular_fabricator/ui_state() + return GLOB.default_state + +/obj/machinery/modular_fabricator/ui_interact(mob/user, datum/tgui/ui = null) + if(!is_operational()) + return + + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ModularFabricator") + ui.open() + ui.set_autoupdate(TRUE) + viewing_mobs += user + +/obj/machinery/modular_fabricator/ui_close(mob/user, datum/tgui/tgui) + . = ..() + viewing_mobs -= user + +/obj/machinery/modular_fabricator/ui_static_data(mob/user) + var/list/data = list() + data["acceptsDisk"] = accepts_disks + data["show_unlock_bar"] = can_be_hacked_or_unlocked + data["allow_add_category"] = can_print_category + data["can_sync"] = can_sync + + //Items + data["items"] = list() + var/list/categories_associative = list() + for(var/v in stored_research.researched_designs) + var/datum/design/D = SSresearch.techweb_design_by_id(v) + for(var/cat in D.category) + //Check if printable + if(!(cat in categories)) + continue + if(!islist(categories_associative[cat])) + categories_associative[cat] = list() + + //Calculate cost + var/list/material_cost = list() + for(var/material_id in D.materials) + material_cost += list(list( + "name" = material_id, + "amount" = D.materials[material_id] / MINERAL_MATERIAL_AMOUNT, + )) + + //Add + categories_associative[cat] += list(list( + "name" = D.name, + "design_id" = D.id, + "material_cost" = material_cost, + )) + + //Categories and their items + for(var/category in categories_associative) + data["items"] += list(list( + "category_name" = category, + "category_items" = categories_associative[category], + )) + + //Inserted data disk + data["diskInserted"] = inserted_disk + return data + +/obj/machinery/modular_fabricator/ui_data(mob/user) + var/list/data = list() + //Output direction + data["outputDir"] = output_direction + + //Queue + data["queue"] = list() + + //Real queue at the bottom + for(var/item_design_id in item_queue) + var/datum/design/D = SSresearch.techweb_design_by_id(item_design_id) + var/list/additional_data = item_queue[item_design_id] + data["queue"] += list(list( + "name" = D.name, + "amount" = additional_data["amount"], + "repeat" = additional_data["repeating"], + "design_id" = item_design_id, + )) + + //Materials + data["materials"] = list() + var/datum/component/material_container/materials = get_material_container() + for(var/material in materials.materials) + var/datum/material/M = material + var/mineral_amount = materials.materials[material] / MINERAL_MATERIAL_AMOUNT + data["materials"] += list(list( + "name" = M.name, + "amount" = mineral_amount, + "datum" = M.type + )) + + //Thing being made + if(being_built && total_build_time && process_completion_world_tick) + data["being_build"] = list( + "design_id" = being_built.id, + "name" = being_built.name, + "progress" = 100-(100*((process_completion_world_tick - world.time)/total_build_time)), + ) + else + data["being_build"] = null + + //Being Build + return data + +/obj/machinery/modular_fabricator/ui_act(action, params) + . = ..() + if(.) + return + + switch(action) + + if("resync_rd") + if(!can_sync) + return + resync_research() + . = TRUE + + if("queue_category") + if(!can_print_category) + return + var/category_to_queue = params["category_name"] + for(var/v in stored_research.researched_designs) + var/datum/design/D = SSresearch.techweb_design_by_id(v) + if(category_to_queue in D.category) + add_to_queue(item_queue, v, 1) + + if("output_dir") + output_direction = text2num(params["direction"]) + . = TRUE + + if("upload_disk") + if(!accepts_disks) + return + var/obj/item/disk/design_disk/D = inserted_disk + if(!istype(D)) + return + for(var/B in D.blueprints) + if(B) + stored_research.add_design(B) + update_viewer_statics() + . = TRUE + + if("eject_disk") + if(!inserted_disk || !accepts_disks) + return + var/obj/item/disk/design_disk/disk = inserted_disk + disk.forceMove(get_turf(src)) + inserted_disk = null + update_viewer_statics() + . = TRUE + + if("eject_material") + var/datum/component/material_container/materials = get_material_container() + var/material_datum = params["material_datum"] //Comes out as text + var/amount = text2num(params["amount"]) + if(amount <= 0 || amount > 50) + return + for(var/mat in materials.materials) + var/datum/material/M = mat + if("[M.type]" == material_datum) + materials.retrieve_sheets(amount, M, get_release_turf()) + . = TRUE + break + + if("queue_repeat") + queue_repeating = text2num(params["repeating"]) + . = TRUE + + if("clear_queue") + item_queue.Cut() + . = TRUE + + if("item_repeat") + var/design_id = params["design_id"] + var/repeating_mode = text2num(params["repeating"]) + if(!item_queue["[design_id]"]) + return + item_queue["[design_id]"]["repeating"] = repeating_mode + . = TRUE + + if("clear_item") + var/design_id = params["design_id"] + item_queue -= design_id + . = TRUE + + if("queue_item") + var/design_id = params["design_id"] + var/amount = text2num(params["amount"]) + add_to_queue(item_queue, design_id, amount) + . = TRUE + + if("begin_process") + begin_process() + . = TRUE + +/obj/machinery/modular_fabricator/proc/resync_research() + for(var/obj/machinery/computer/rdconsole/RDC in orange(7, src)) + RDC.stored_research.copy_research_to(stored_research) + update_viewer_statics() + say("Successfully synchronized with R&D server.") + return + +/obj/machinery/modular_fabricator/proc/update_viewer_statics() + for(var/mob/M in viewing_mobs) + if(QDELETED(M) || !(M.client || M.mind)) + continue + update_static_data(M) + +/obj/machinery/modular_fabricator/proc/add_to_queue(queue_list, design_id, amount, repeat=null) + if(queue_list["[design_id]"]) + queue_list["[design_id]"]["amount"] += amount + if(queue_list["[design_id]"]["amount"] <= 0) + queue_list -= "[design_id]" + return + if(amount <= 0) + return + //Check if the item uses custom materials + var/datum/design/requested_item = stored_research.isDesignResearchedID(design_id) + var/datum/material/used_material = repeat + if(!istype(used_material)) + for(var/MAT in requested_item.materials) + used_material = MAT + if(istext(used_material)) //This means its a category + var/datum/component/material_container/materials = get_material_container() + 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 sortList(list_to_show, /proc/cmp_typepaths_asc) + if(!used_material) + return //Didn't pick any material, so you can't build shit either. + + queue_list["[design_id]"] = list( + "amount" = amount, + "repeating" = repeat, + "build_mat" = used_material, + ) + +/obj/machinery/modular_fabricator/proc/get_release_turf() + var/turf/T + if(output_direction) + T = get_step(src, output_direction) + if(is_blocked_turf(T, TRUE)) + T = get_turf(src) + else + T = get_turf(src) + return T + +/obj/machinery/modular_fabricator/on_deconstruction() + var/datum/component/material_container/materials = get_material_container() + materials.retrieve_all() + +/obj/machinery/modular_fabricator/proc/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted) + if(ispath(type_inserted, /obj/item/stack/ore/bluespace_crystal)) + use_power(MINERAL_MATERIAL_AMOUNT / 10) + else + use_power(min(1000, amount_inserted / 100)) + //Begin processing to continue the queue if we had items in the queue + if(wants_operate) + begin_process() + +/obj/machinery/modular_fabricator/proc/begin_process() + if(busy || operating || disabled) + return + var/requested_design_id = null + if(LAZYLEN(item_queue)) + requested_design_id = item_queue[1] + //Queue processing done + if(!requested_design_id) + say("Queue processing completed.") + operating = FALSE + return + operating = TRUE + //Doubles as protection from bad things and makes sure we can still make the item. + being_built = stored_research.isDesignResearchedID(requested_design_id) + if(!being_built) + playsound(src, 'sound/machines/buzz-two.ogg', 50) + say("Unknown design requested, removing from queue.") + item_queue -= requested_design_id + addtimer(CALLBACK(src, .proc/restart_process), 50) + return + + var/multiplier = 1 + var/is_stack = ispath(being_built.build_path, /obj/item/stack) + //Only items that can stack should be build en mass, since we now have queues. + if(is_stack) + multiplier = item_queue[requested_design_id]["amount"] + multiplier = CLAMP(multiplier,1,50) + + ///////////////// + + var/coeff = (is_stack ? 1 : creation_efficiency) //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(MODFAB_MAX_POWER_USE, (total_amount)*multiplier/5) //Change this to use all materials + + var/datum/component/material_container/materials = get_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 + used_material = item_queue[requested_design_id]["build_mat"] + if(!used_material) + item_queue -= requested_design_id + addtimer(CALLBACK(src, .proc/restart_process), 50) + 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) + set_working_sprite() + var/construction_time = max(being_built.construction_time, minimum_construction_time) + var/time = is_stack ? construction_time : (construction_time * coeff * multiplier) ** 0.8 + time *= being_built.lathe_time_factor + //===Repeating mode=== + //Remove from queue + var/list/queue_data = item_queue[requested_design_id] + item_queue[requested_design_id]["amount"] -= multiplier + var/removed = FALSE + if(item_queue[requested_design_id]["amount"] <= 0) + item_queue -= requested_design_id + removed = TRUE + //Requeue if necessary + if(queue_repeating || queue_data["repdeating"]) + stored_item_amount ++ + if(removed) + add_to_queue(item_queue, requested_design_id, stored_item_amount, queue_data["build_mat"]) + stored_item_amount = 0 + //Create item and restart + process_completion_world_tick = world.time + time + total_build_time = time + addtimer(CALLBACK(src, .proc/make_item, power, materials_used, custom_materials, multiplier, coeff, is_stack), time) + addtimer(CALLBACK(src, .proc/restart_process), time + 5) + else + say("Insufficient materials, operation will proceed when sufficient materials are available.") + operating = FALSE + wants_operate = TRUE + +/obj/machinery/modular_fabricator/proc/restart_process() + operating = FALSE + wants_operate = FALSE + if(disabled) + return + begin_process() + +/obj/machinery/modular_fabricator/proc/make_item(power, var/list/materials_used, var/list/picked_materials, multiplier, coeff, is_stack) + if(QDELETED(src)) + return + //Stops the queue + if(disabled) + operating = FALSE + return + var/datum/component/material_container/materials = get_material_container() + var/turf/A = get_release_turf() + 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() + else + for(var/i=1, i<=multiplier, i++) + var/obj/item/new_item = new being_built.build_path(A) + new_item.materials = new_item.materials.Copy() + for(var/mat in materials_used) + new_item.materials[mat] = materials_used[mat] / multiplier + + if(length(picked_materials)) + new_item.set_custom_materials(picked_materials, 1 / multiplier) //Ensure we get the non multiplied amount + being_built = null + set_default_sprite() + busy = FALSE + +/obj/machinery/modular_fabricator/proc/set_default_sprite() + return + +/obj/machinery/modular_fabricator/proc/set_working_sprite() + return diff --git a/code/game/machinery/fat_sucker.dm b/code/game/machinery/fat_sucker.dm index 9cdc2a876d210..87047cb2fc86c 100644 --- a/code/game/machinery/fat_sucker.dm +++ b/code/game/machinery/fat_sucker.dm @@ -12,7 +12,7 @@ var/start_at = NUTRITION_LEVEL_WELL_FED var/stop_at = NUTRITION_LEVEL_STARVING var/free_exit = TRUE //set to false to prevent people from exiting before being completely stripped of fat - var/bite_size = 15 //amount of nutrients we take per process + var/bite_size = 7.5 //amount of nutrients we take per second var/nutrients //amount of nutrients we got build up var/nutrient_to_meat = 90 //one slab of meat gives about 52 nutrition var/datum/looping_sound/microwave/soundloop //100% stolen from microwaves @@ -33,6 +33,10 @@ soundloop = new(list(src), FALSE) update_icon() +/obj/machinery/fat_sucker/Destroy() + QDEL_NULL(soundloop) + return ..() + /obj/machinery/fat_sucker/RefreshParts() ..() var/rating = 0 @@ -46,9 +50,9 @@ /obj/machinery/fat_sucker/examine(mob/user) . = ..() - . += {"Alt-Click to toggle the safety hatch. - Removing [bite_size] nutritional units per operation. - Requires [nutrient_to_meat] nutritional units per meat slab."} + . += "Alt-Click to toggle the safety hatch.\n"+\ + "Removing [bite_size] nutritional units per operation.\n"+\ + "Requires [nutrient_to_meat] nutritional units per meat slab." /obj/machinery/fat_sucker/close_machine(mob/user) if(panel_open) @@ -131,10 +135,10 @@ if(panel_open) overlays += "[icon_state]_panel" -/obj/machinery/fat_sucker/process() +/obj/machinery/fat_sucker/process(delta_time) if(!processing) return - if(!powered() || !occupant || !iscarbon(occupant)) + if(!is_operational() || !occupant || !iscarbon(occupant)) open_machine() return @@ -143,8 +147,8 @@ open_machine() playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, FALSE) return - C.adjust_nutrition(-bite_size) - nutrients += bite_size + C.adjust_nutrition(-bite_size * delta_time) + nutrients += bite_size * delta_time if(next_fact <= 0) next_fact = initial(next_fact) @@ -155,7 +159,7 @@ use_power(500) /obj/machinery/fat_sucker/proc/start_extracting() - if(state_open || !occupant || processing || !powered()) + if(state_open || !occupant || processing || !is_operational()) return if(iscarbon(occupant)) var/mob/living/carbon/C = occupant diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 1e5b2b4f71726..80e1a60977fa6 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -19,12 +19,13 @@ icon_state = "fire0" max_integrity = 250 integrity_failure = 100 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30, "stamina" = 0) use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 6 power_channel = AREA_USAGE_ENVIRON resistance_flags = FIRE_PROOF + layer = ABOVE_WINDOW_LAYER light_power = 0 light_range = 7 @@ -49,6 +50,7 @@ LAZYADD(myarea.firealarms, src) /obj/machinery/firealarm/Destroy() + myarea.firereset(src) LAZYREMOVE(myarea.firealarms, src) return ..() @@ -77,23 +79,28 @@ if(is_station_level(z)) add_overlay("fire_[GLOB.security_level]") - SSvis_overlays.add_vis_overlay(src, icon, "fire_[GLOB.security_level]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "fire_[GLOB.security_level]", layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, "fire_[GLOB.security_level]", layer, EMISSIVE_PLANE, dir) else add_overlay("fire_[SEC_LEVEL_GREEN]") - SSvis_overlays.add_vis_overlay(src, icon, "fire_[SEC_LEVEL_GREEN]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "fire_[SEC_LEVEL_GREEN]", layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, "fire_[SEC_LEVEL_GREEN]", layer, EMISSIVE_PLANE, dir) var/area/A = src.loc A = A.loc if(!detecting || !A.fire) add_overlay("fire_off") - SSvis_overlays.add_vis_overlay(src, icon, "fire_off", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "fire_off", layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, "fire_off", layer, EMISSIVE_PLANE, dir) else if(obj_flags & EMAGGED) add_overlay("fire_emagged") - SSvis_overlays.add_vis_overlay(src, icon, "fire_emagged", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "fire_emagged", layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, "fire_emagged", layer, EMISSIVE_PLANE, dir) else add_overlay("fire_on") - SSvis_overlays.add_vis_overlay(src, icon, "fire_on", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "fire_on", layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, "fire_on", layer, EMISSIVE_PLANE, dir) /obj/machinery/firealarm/emp_act(severity) . = ..() @@ -109,11 +116,16 @@ return obj_flags |= EMAGGED update_icon() - if(user) - user.visible_message("Sparks fly out of [src]!", + user?.visible_message("Sparks fly out of [src]!", "You emag [src], disabling its thermal sensors.") playsound(src, "sparks", 50, 1) +/obj/machinery/firealarm/eminence_act(mob/living/simple_animal/eminence/eminence) + . = ..() + to_chat(usr, "You begin manipulating [src]!") + if(do_after(eminence, 20, target=get_turf(eminence))) + attack_hand(eminence) + /obj/machinery/firealarm/temperature_expose(datum/gas_mixture/air, temperature, volume) if((temperature > T0C + 200 || temperature < BODYTEMP_COLD_DAMAGE_LIMIT) && (last_alarm+FIREALARM_COOLDOWN < world.time) && !(obj_flags & EMAGGED) && detecting && !stat) alarm() @@ -258,6 +270,20 @@ return ..() +/obj/machinery/firealarm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + if((buildstage == 0) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) + return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1) + return FALSE + +/obj/machinery/firealarm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_UPGRADE_SIMPLE_CIRCUITS) + user.visible_message("[user] fabricates a circuit and places it into [src].", \ + "You adapt a fire alarm circuit and slot it into the assembly.") + buildstage = 1 + update_icon() + return TRUE + return FALSE /obj/machinery/firealarm/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) . = ..() diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 80934569f6d5e..e426f799cfe36 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -9,6 +9,7 @@ integrity_failure = 100 light_color = LIGHT_COLOR_WHITE light_power = FLASH_LIGHT_POWER + layer = ABOVE_WINDOW_LAYER var/obj/item/assembly/flash/handheld/bulb var/id = null var/range = 2 //this is roughly the size of brig cell @@ -87,6 +88,13 @@ if (anchored) return flash() +/obj/machinery/flasher/eminence_act(mob/living/simple_animal/eminence/eminence) + . = ..() + to_chat(usr, "You begin manipulating [src]!") + if(do_after(eminence, 20, target=get_turf(eminence))) + if(anchored) + flash() + /obj/machinery/flasher/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == "melee" && damage_amount < 10) //any melee attack below 10 dmg does nothing return 0 @@ -109,10 +117,7 @@ last_flash = world.time use_power(1000) - for (var/mob/living/L in viewers(src, null)) - if (get_dist(src, L) > range) - continue - + for (var/mob/living/L in hearers(range, src)) if(L.flash_act(affect_silicon = 1)) L.Paralyze(strength) diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm index 25ce7acbe75e3..db10532fc753c 100644 --- a/code/game/machinery/gulag_item_reclaimer.dm +++ b/code/game/machinery/gulag_item_reclaimer.dm @@ -26,6 +26,7 @@ return req_access = list() obj_flags |= EMAGGED + ui_update() /obj/machinery/gulag_item_reclaimer/ui_state(mob/user) diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm index f0e66d2a56e8a..da5f324990dea 100644 --- a/code/game/machinery/gulag_teleporter.dm +++ b/code/game/machinery/gulag_teleporter.dm @@ -30,7 +30,7 @@ The console is located at computer/gulag_teleporter.dm /obj/item/clothing/head/helmet/space/plasmaman, /obj/item/tank/internals, /obj/item/clothing/mask/breath, - /obj/item/clothing/mask/gas)) + /obj/item/clothing/mask/gas/old)) //makes more sense to give prisoners older models of masks /obj/machinery/gulag_teleporter/Initialize() . = ..() @@ -147,6 +147,8 @@ The console is located at computer/gulag_teleporter.dm W.forceMove(linked_reclaimer) else W.forceMove(src) + if(linked_reclaimer) + linked_reclaimer.ui_update() /obj/machinery/gulag_teleporter/proc/handle_prisoner(obj/item/id, datum/data/record/R) if(!ishuman(occupant)) diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index 53b8e730596f2..ae5a155cd6099 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -173,6 +173,7 @@ to_chat(user,"[src] is active and can't be opened!") //rip /obj/machinery/harvester/Exited(atom/movable/user) + . = ..() if (!state_open && user == occupant) container_resist(user) @@ -189,4 +190,4 @@ else if(!harvesting) . += "Alt-click [src] to start harvesting." if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Harvest speed at [interval*0.1] seconds per organ." + . += "The status display reads: Harvest speed at [interval*0.1] seconds per organ." diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 5a65e27ba2d8a..2ec60264eeafb 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -33,12 +33,11 @@ Possible to do for anyone motivated enough: icon_state = "holopad0" layer = LOW_OBJ_LAYER plane = FLOOR_PLANE - flags_1 = HEAR_1 use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 100 max_integrity = 300 - armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0) + armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0, "stamina" = 0) circuit = /obj/item/circuitboard/machine/holopad var/list/masters //List of living mobs that use the holopad var/list/holorays //Holoray-mob link. @@ -61,6 +60,10 @@ Possible to do for anyone motivated enough: var/offset = FALSE var/on_network = TRUE +/obj/machinery/holopad/Initialize() + . = ..() + become_hearing_sensitive() + /obj/machinery/holopad/tutorial resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF flags_1 = NODECONSTRUCT_1 @@ -145,7 +148,7 @@ Possible to do for anyone motivated enough: /obj/machinery/holopad/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Current projection range: [holo_range] units." + . += "The status display reads: Current projection range: [holo_range] units." /obj/machinery/holopad/attackby(obj/item/P, mob/user, params) if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", P)) @@ -410,17 +413,19 @@ Possible to do for anyone motivated enough: /*This is the proc for special two-way communication between AI and holopad/people talking near holopad. For the other part of the code, check silicon say.dm. Particularly robot talk.*/ -/obj/machinery/holopad/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) +/obj/machinery/holopad/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) . = ..() if(speaker && LAZYLEN(masters) && !radio_freq)//Master is mostly a safety in case lag hits or something. Radio_freq so AIs dont hear holopad stuff through radios. for(var/mob/living/silicon/ai/master in masters) if(masters[master] && speaker != master) - master.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) + master.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mods) for(var/I in holo_calls) var/datum/holocall/HC = I if(HC.connected_holopad == src && speaker != HC.hologram) - HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) + HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mods) + if(HC.user.should_show_chat_message(speaker, message_language, FALSE, is_heard = TRUE)) + create_chat_message(speaker, message_language, list(HC.user), raw_message, spans, message_mods) if(outgoing_call && speaker == outgoing_call.user) outgoing_call.hologram.say(raw_message) @@ -497,7 +502,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ //Can we display holos there //Area check instead of line of sight check because this is a called a lot if AI wants to move around. /obj/machinery/holopad/proc/validate_location(turf/T,check_los = FALSE) - if(T.z == z && get_dist(T, src) <= holo_range && T.loc == get_area(src)) + if(T.get_virtual_z_level() == get_virtual_z_level() && get_dist(T, src) <= holo_range && T.loc == get_area(src)) return TRUE else return FALSE @@ -674,6 +679,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ Impersonation = null if(!QDELETED(HC)) HC.Disconnect(HC.calling_holopad) + HC = null return ..() /obj/effect/overlay/holo_pad_hologram/Process_Spacemove(movement_dir = 0) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index e2070fd5e8282..5b74d7d13633c 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -8,7 +8,7 @@ idle_power_usage = 2 active_power_usage = 4 max_integrity = 300 - armor = list("melee" = 50, "bullet" = 30, "laser" = 70, "energy" = 50, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70) + armor = list("melee" = 50, "bullet" = 30, "laser" = 70, "energy" = 50, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70, "stamina" = 0) resistance_flags = FIRE_PROOF var/id = null var/on = FALSE @@ -61,6 +61,7 @@ icon = 'icons/obj/stationobjs.dmi' icon_state = "migniter" resistance_flags = FIRE_PROOF + layer = ABOVE_WINDOW_LAYER var/id = null var/disable = 0 var/last_spark = 0 diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index b32fcd57cd73b..91780a7ab82b7 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -14,6 +14,7 @@ var/static/list/drip_containers = typecacheof(list(/obj/item/reagent_containers/blood, /obj/item/reagent_containers/food, /obj/item/reagent_containers/glass)) + var/can_convert = TRUE // If it can be made into an anesthetic machine or not /obj/machinery/iv_drip/Initialize(mapload) . = ..() @@ -114,7 +115,7 @@ new /obj/item/stack/sheet/iron(loc) qdel(src) -/obj/machinery/iv_drip/process() +/obj/machinery/iv_drip/process(delta_time) if(!attached) return PROCESS_KILL @@ -132,8 +133,8 @@ var/transfer_amount = 5 if(istype(beaker, /obj/item/reagent_containers/blood)) // speed up transfer on blood packs - transfer_amount = 10 - var/fraction = min(transfer_amount/beaker.reagents.total_volume, 1) //the fraction that is transfered of the total volume + transfer_amount *= 2 + var/fraction = min(transfer_amount*delta_time/beaker.reagents.total_volume, 1) //the fraction that is transfered of the total volume beaker.reagents.reaction(attached, INJECT, fraction, FALSE) //make reagents reacts, but don't spam messages beaker.reagents.trans_to(attached, transfer_amount) update_icon() @@ -141,7 +142,7 @@ // Take blood else var/amount = beaker.reagents.maximum_volume - beaker.reagents.total_volume - amount = min(amount, 4) + amount = min(amount, 4) * delta_time * 0.5 // If the beaker is full, ping if(!amount) if(prob(5)) @@ -162,7 +163,7 @@ if(!ishuman(user)) return if(attached) - visible_message("[attached] is detached from [src]") + visible_message("[attached] is detached from \the [src].") attached = null update_icon() return @@ -220,11 +221,28 @@ . += "[attached ? attached : "No one"] is attached." +/obj/machinery/iv_drip/screwdriver_act(mob/living/user, obj/item/I) + . = ..() + if(user.is_holding_item_of_type(/obj/item/clothing/mask/breath) && can_convert) + visible_message("[user] attempts to attach the breath mask to [src].", "You attempt to attach the breath mask to [src].") + if(!do_after(user, 100, FALSE, src)) + to_chat(user, "You fail to attach the breath mask to [src]!") + return + var/item = user.is_holding_item_of_type(/obj/item/clothing/mask/breath) + if(!item) // Check after the do_after as well + return + visible_message("[user] attaches the breath mask to [src].", "You attach the breath mask to [src].") + qdel(item) + new /obj/machinery/anesthetic_machine(loc) + qdel(src) + + /obj/machinery/iv_drip/saline name = "saline drip" desc = "An all-you-can-drip saline canister designed to supply a hospital without running out, with a scary looking pump rigged to inject saline into containers, but filling people directly might be a bad idea." icon_state = "saline" density = TRUE + can_convert = FALSE /obj/machinery/iv_drip/saline/Initialize(mapload) . = ..() diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index afe87add691dd..35845c69f8e20 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -25,6 +25,8 @@ E += M.rating range = initial(range) range *= E + //Update to viewers + ui_update() /obj/machinery/launchpad/Initialize() . = ..() @@ -43,7 +45,8 @@ update_indicator() /obj/machinery/launchpad/Destroy() - qdel(hud_list[DIAG_LAUNCHPAD_HUD]) + for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) + diag_hud.remove_from_hud(src) return ..() /obj/machinery/launchpad/examine(mob/user) @@ -257,9 +260,9 @@ /obj/machinery/launchpad/briefcase/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/launchpad_remote)) var/obj/item/launchpad_remote/L = I - if(L.pad == src) //do not attempt to link when already linked + if(L.pad == WEAKREF(src)) //do not attempt to link when already linked return ..() - L.pad = src + L.pad = WEAKREF(src) to_chat(user, "You link [src] to [L].") else return ..() @@ -296,9 +299,9 @@ /obj/item/storage/briefcase/launchpad/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/launchpad_remote)) var/obj/item/launchpad_remote/L = I - if(L.pad == src.pad) //do not attempt to link when already linked + if(L.pad == WEAKREF(src.pad)) //do not attempt to link when already linked return ..() - L.pad = src.pad + L.pad = WEAKREF(src.pad) to_chat(user, "You link [pad] to [L].") else return ..() @@ -310,11 +313,12 @@ icon_state = "folder" w_class = WEIGHT_CLASS_SMALL var/sending = TRUE - var/obj/machinery/launchpad/briefcase/pad + //A weakref to our linked pad + var/datum/weakref/pad /obj/item/launchpad_remote/Initialize(mapload, pad) //remote spawns linked to the briefcase pad . = ..() - src.pad = pad + src.pad = WEAKREF(pad) /obj/item/launchpad_remote/attack_self(mob/user) . = ..() @@ -329,22 +333,22 @@ ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "LaunchpadRemote") //width, height + ui.set_autoupdate(TRUE) // Autoupdate because handling changes to launchpad would be hell unless I figure out and add a bunch of signals ui.open() - ui.set_autoupdate(TRUE) - /obj/item/launchpad_remote/ui_data(mob/user) var/list/data = list() - data["has_pad"] = pad ? TRUE : FALSE - if(pad) - data["pad_closed"] = pad.closed - if(!pad || pad.closed) + var/obj/machinery/launchpad/briefcase/our_pad = pad?.resolve() + data["has_pad"] = our_pad ? TRUE : FALSE + if(our_pad) + data["pad_closed"] = our_pad.closed + if(!our_pad || our_pad.closed) return data - data["pad_name"] = pad.display_name - data["range"] = pad.range - data["x"] = pad.x_offset - data["y"] = pad.y_offset + data["pad_name"] = our_pad.display_name + data["range"] = our_pad.range + data["x"] = our_pad.x_offset + data["y"] = our_pad.y_offset return data /obj/item/launchpad_remote/proc/teleport(mob/user, obj/machinery/launchpad/pad) @@ -359,35 +363,39 @@ /obj/item/launchpad_remote/ui_act(action, params) if(..()) return + var/obj/machinery/launchpad/briefcase/our_pad = pad?.resolve() + if(!our_pad) + pad = null + return TRUE switch(action) if("set_pos") var/new_x = text2num(params["x"]) var/new_y = text2num(params["y"]) - pad.set_offset(new_x, new_y) + our_pad.set_offset(new_x, new_y) . = TRUE if("move_pos") var/plus_x = text2num(params["x"]) var/plus_y = text2num(params["y"]) - pad.set_offset( - x = pad.x_offset + plus_x, - y = pad.y_offset + plus_y + our_pad.set_offset( + x = our_pad.x_offset + plus_x, + y = our_pad.y_offset + plus_y ) . = TRUE if("rename") - . = TRUE var/new_name = params["name"] if(!new_name) return - pad.display_name = new_name + our_pad.display_name = new_name + . = TRUE if("remove") . = TRUE if(usr && alert(usr, "Are you sure?", "Unlink Launchpad", "I'm Sure", "Abort") != "Abort") pad = null if("launch") sending = TRUE - teleport(usr, pad) + teleport(usr, our_pad) . = TRUE if("pull") sending = FALSE - teleport(usr, pad) + teleport(usr, our_pad) . = TRUE diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 47e2ea67ec549..04103fa8754b2 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -5,6 +5,7 @@ icon_state = "light1" desc = "Make dark." power_channel = AREA_USAGE_LIGHT + layer = ABOVE_WINDOW_LAYER /// Set this to a string, path, or area instance to control that area /// instead of the switch's location. var/area/area = null @@ -62,3 +63,9 @@ return if(!(stat & (BROKEN|NOPOWER))) power_change() + +/obj/machinery/light_switch/eminence_act(mob/living/simple_animal/eminence/eminence) + . = ..() + to_chat(usr, "You begin manipulating [src]!") + if(do_after(eminence, 20, target=get_turf(eminence))) + interact(eminence) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 4cbafeb6bc04c..fbf3478b37fe8 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -124,7 +124,7 @@ //Just build whatever it is new buildpath(loc) else - src.visible_message(" Something went very wrong and there isnt enough synthflesh anymore!") + src.visible_message(" Something went very wrong and there isn't enough synthflesh anymore!") busy = FALSE flick("limbgrower_unfill",src) icon_state = "limbgrower_idleoff" @@ -159,7 +159,7 @@ /obj/machinery/limbgrower/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Storing up to [reagents.maximum_volume]u of synthflesh.
      Synthflesh consumption at [prod_coeff*100]%." + . += "The status display reads: Storing up to [reagents.maximum_volume]u of synthflesh.
      Synthflesh consumption at [prod_coeff*100]%.
      " /obj/machinery/limbgrower/proc/main_win(mob/user) var/dat = "

      Limb Grower Menu:


      " diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index e5df2c29d18a1..382014fe3c1e6 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -15,18 +15,18 @@ /obj/machinery/mass_driver/proc/drive(amount) if(stat & (BROKEN|NOPOWER)) return - use_power(500) + use_power(1000) var/O_limit var/atom/target = get_edge_target_turf(src, dir) for(var/atom/movable/O in loc) - if(!O.anchored || ismecha(O)) //Mechs need their launch platforms. + if(!O.anchored || istype(O, /obj/machinery/power/supermatter_crystal) || ismecha(O)) //Mechs need their launch platforms. Oh, and SM cannon SM cannon. if(ismob(O) && !isliving(O)) continue O_limit++ if(O_limit >= 20) audible_message("[src] lets out a screech, it doesn't seem to be able to handle the load.") break - use_power(500) + use_power(1000) O.throw_at(target, drive_range * power, power) flick("mass_driver1", src) diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index f98cf16fb6093..7275aeedee0fd 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -10,7 +10,7 @@ level = 1 // underfloor layer = UNDER_CATWALK max_integrity = 500 - armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 70, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 70, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "stamina" = 0) var/open = FALSE // true if cover is open var/locked = TRUE // true if controls are locked diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 7832e53ce8958..eacb68b51e98e 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -186,9 +186,10 @@ GLOBAL_LIST_EMPTY(allCasters) verb_say = "beeps" verb_ask = "beeps" verb_exclaim = "beeps" - armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) + armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30, "stamina" = 0) max_integrity = 200 integrity_failure = 50 + layer = ABOVE_WINDOW_LAYER var/screen = 0 var/paper_remaining = 15 var/securityCaster = 0 @@ -295,7 +296,7 @@ GLOBAL_LIST_EMPTY(allCasters) dat+="

      The newscaster recognises you as: [scanned_user]" if(1) dat+= "Station Feed Channels
      " - if( isemptylist(GLOB.news_network.network_channels) ) + if(!length(GLOB.news_network.network_channels) ) dat+="No active channels found..." else for(var/datum/newscaster/feed_channel/CHANNEL in GLOB.news_network.network_channels) @@ -375,7 +376,7 @@ GLOBAL_LIST_EMPTY(allCasters) dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
      " dat+="No further feed story additions are allowed while the D-Notice is in effect.

      " else - if( isemptylist(viewing_channel.messages) ) + if( !length(viewing_channel.messages) ) dat+="No feed messages found in channel...
      " else var/i = 0 @@ -403,7 +404,7 @@ GLOBAL_LIST_EMPTY(allCasters) dat+="NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.
      " dat+="Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it.
      " dat+="
      Select Feed channel to get Stories from:
      " - if(isemptylist(GLOB.news_network.network_channels)) + if(!length(GLOB.news_network.network_channels)) dat+="No feed channels found active...
      " else for(var/datum/newscaster/feed_channel/CHANNEL in GLOB.news_network.network_channels) @@ -414,7 +415,7 @@ GLOBAL_LIST_EMPTY(allCasters) dat+="A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station's" dat+="morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed" dat+="stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.
      " - if(isemptylist(GLOB.news_network.network_channels)) + if(!length(GLOB.news_network.network_channels)) dat+="No feed channels found active...
      " else for(var/datum/newscaster/feed_channel/CHANNEL in GLOB.news_network.network_channels) @@ -423,7 +424,7 @@ GLOBAL_LIST_EMPTY(allCasters) if(12) dat+="[viewing_channel.channel_name]: \[ created by: [viewing_channel.returnAuthor(-1)] \]
      " dat+="[(viewing_channel.authorCensor) ? ("Undo Author censorship") : ("Censor channel Author")]
      " - if(isemptylist(viewing_channel.messages)) + if(!length(viewing_channel.messages)) dat+="No feed messages found in channel...
      " else for(var/datum/newscaster/feed_message/MESSAGE in viewing_channel.messages) @@ -440,7 +441,7 @@ GLOBAL_LIST_EMPTY(allCasters) dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
      " dat+="No further feed story additions are allowed while the D-Notice is in effect.

      " else - if(isemptylist(viewing_channel.messages)) + if(!length(viewing_channel.messages)) dat+="No feed messages found in channel...
      " else for(var/datum/newscaster/feed_message/MESSAGE in viewing_channel.messages) @@ -907,7 +908,7 @@ GLOBAL_LIST_EMPTY(allCasters) if(0) //Cover dat+="
      The Griffon
      " dat+="
      Nanotrasen-standard newspaper, for use on Nanotrasen? Space Facilities

      " - if(isemptylist(news_content)) + if(!length(news_content)) if(wantedAuthor) dat+="Contents:
        **Important Security Announcement** \[page [pages+2]\]
      " else @@ -934,7 +935,7 @@ GLOBAL_LIST_EMPTY(allCasters) if(notContent(C.DclassCensorTime)) dat+="This channel was deemed dangerous to the general welfare of the station and therefore marked with a D-Notice. Its contents were not transferred to the newspaper at the time of printing." else - if(isemptylist(C.messages)) + if(!length(C.messages)) dat+="No Feed stories stem from this channel..." else var/i = 0 diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index cc5ac57d9d014..8fd6ab59b112c 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -90,7 +90,7 @@ Buildable meters set name = "Flip Pipe" set src in view(1) - if ( usr.incapacitated() ) + if(usr.incapacitated() || !isliving(usr)) return do_a_flip() diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 468f83977a3f4..879038e2ef389 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -13,11 +13,13 @@ density = TRUE desc = "A covered turret that shoots at its enemies." use_power = IDLE_POWER_USE //this turret uses and requires power - idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power - active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power - req_access = list(ACCESS_SEC_DOORS) + idle_power_usage = 100 //when inactive, this turret takes up constant 50 Equipment power + active_power_usage = 600 //when active, this turret takes up constant 300 Equipment power + req_access = list(ACCESS_SECURITY) power_channel = AREA_USAGE_EQUIP //drains power from the EQUIPMENT channel + var/uses_stored = TRUE //if TRUE this will cause the turret to stop working if the stored_gun var is null in process() + var/base_icon_state = "standard" var/scan_range = 7 var/atom/base = null //for turrets inside other objects @@ -27,7 +29,7 @@ max_integrity = 160 //the turret's health integrity_failure = 80 - armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90, "stamina" = 0) var/locked = TRUE //if the turret's behaviour control access is locked var/controllock = FALSE //if the turret responds to control panels @@ -59,6 +61,7 @@ var/stun_all = 0 //if this is active, the turret shoots everything that isn't security or head of staff var/check_anomalies = 1 //checks if it can shoot at unidentified lifeforms (ie xenos) var/shoot_unloyal = 0 //checks if it can shoot people that aren't loyalty implantd + var/target_cyborgs = 0 //checks if it can shoot cyborgs regardless of faction var/attacked = 0 //if set to 1, the turret gets pissed off and shoots at people nearby (unless they have sec access!) @@ -97,6 +100,25 @@ if(!has_cover) INVOKE_ASYNC(src, .proc/popUp) +/obj/machinery/porta_turret/proc/toggle_on(var/set_to) + var/current = on + if (!isnull(set_to)) + on = set_to + else + on = !on + if (current != on) + check_should_process() + if (!on && !always_up) + popDown() + +/obj/machinery/porta_turret/proc/check_should_process() + if (datum_flags & DF_ISPROCESSING) + if (!on || !anchored || (stat & BROKEN) || !powered()) + end_processing() + else + if (on && anchored && !(stat & BROKEN) && powered()) + begin_processing() + /obj/machinery/porta_turret/update_icon() cut_overlays() if(!anchored) @@ -126,8 +148,10 @@ if(installation && !turret_gun) stored_gun = new installation(src) else if (turret_gun) + turret_gun.forceMove(src) stored_gun = turret_gun + RegisterSignal(stored_gun, COMSIG_PARENT_PREQDELETED, .proc/null_gun) var/list/gun_properties = stored_gun.get_turret_properties() //required properties @@ -146,6 +170,12 @@ update_icon() return gun_properties +///destroys reference to stored_gun to prevent hard deletions +/obj/machinery/porta_turret/proc/null_gun() + SIGNAL_HANDLER + + stored_gun = null + /obj/machinery/porta_turret/Destroy() //deletes its own cover with it QDEL_NULL(cover) @@ -175,6 +205,7 @@ dat += "Neutralize All Non-Security and Non-Command Personnel: [stun_all ? "Yes" : "No"]
      " dat += "Neutralize All Unidentified Life Signs: [check_anomalies ? "Yes" : "No"]
      " dat += "Neutralize All Non-Loyalty Implanted Personnel: [shoot_unloyal ? "Yes" : "No"]
      " + dat += "Neutralize All Cyborgs: [target_cyborgs ? "Yes" : "No"]
      " if(issilicon(user)) if(!manual_control) var/mob/living/silicon/S = user @@ -216,28 +247,19 @@ check_anomalies = !check_anomalies if("checkloyal") shoot_unloyal = !shoot_unloyal + if("checkborg") + target_cyborgs = !target_cyborgs if("manual") if(issilicon(usr) && !manual_control) give_control(usr) interact(usr) /obj/machinery/porta_turret/power_change() - if(!anchored) - update_icon() - remove_control() - return - if(stat & BROKEN) + . = ..() + if(!anchored || (stat & BROKEN) || !powered()) update_icon() remove_control() - else - if( powered() ) - stat &= ~NOPOWER - update_icon() - else - spawn(rand(0, 15)) - stat |= NOPOWER - remove_control() - update_icon() + check_should_process() /obj/machinery/porta_turret/attackby(obj/item/I, mob/user, params) @@ -302,10 +324,10 @@ visible_message("[src] hums oddly...") obj_flags |= EMAGGED controllock = TRUE - on = FALSE //turns off the turret temporarily + toggle_on(FALSE) //turns off the turret temporarily update_icon() sleep(60) //6 seconds for the traitor to gtfo of the area before the turret decides to ruin his shit - on = TRUE //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here + toggle_on(TRUE) //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here /obj/machinery/porta_turret/emp_act(severity) @@ -320,10 +342,10 @@ auth_weapons = pick(0, 1) stun_all = pick(0, 0, 0, 0, 1) //stun_all is a pretty big deal, so it's least likely to get turned on - on = FALSE + toggle_on(FALSE) remove_control() - addtimer(VARSET_CALLBACK(src, on, TRUE), rand(60,600)) + addtimer(CALLBACK(src, .proc/toggle_on, TRUE), rand(60,600)) /obj/machinery/porta_turret/take_damage(damage, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) . = ..() @@ -360,78 +382,92 @@ cover = new /obj/machinery/porta_turret_cover(loc) //if the turret has no cover and is anchored, give it a cover cover.parent_turret = src //assign the cover its parent_turret, which would be this (src) - if(!on || (stat & (NOPOWER|BROKEN)) || manual_control) - return + if(!on || (stat & (NOPOWER|BROKEN))) + return PROCESS_KILL + if(manual_control) + return PROCESS_KILL + if(uses_stored && !stored_gun) + return PROCESS_KILL + + //Turrets can shoot up, but not down. + var/list/valid_turfs = list() + var/turf/temp = get_turf(src) + while(temp && (isspaceturf(temp) || temp == get_turf(src))) + valid_turfs["[temp.z]"] = temp + temp = temp.above() var/list/targets = list() - for(var/mob/A in view(scan_range, base)) - if(A.invisibility > SEE_INVISIBLE_LIVING) - continue - - if(check_anomalies)//if it's set to check for simple animals - if(isanimal(A)) - var/mob/living/simple_animal/SA = A - if(SA.stat || in_faction(SA)) //don't target if dead or in faction - continue - targets += SA + for(var/turf_z as() in valid_turfs) + var/turf/T = valid_turfs[turf_z] + for(var/mob/A as() in hearers(scan_range, T)) + if(A.invisibility > SEE_INVISIBLE_LIVING) continue - if(issilicon(A)) - var/mob/living/silicon/sillycone = A + if(check_anomalies)//if it's set to check for simple animals + if(isanimal(A)) + var/mob/living/simple_animal/SA = A + if(SA.stat || in_faction(SA)) //don't target if dead or in faction + continue + targets += SA + continue - if(ispAI(A)) - continue + if(issilicon(A)) + var/mob/living/silicon/sillycone = A - if(sillycone.stat || in_faction(sillycone)) - continue + if(ispAI(A)) + continue - if(iscyborg(sillycone)) - var/mob/living/silicon/robot/sillyconerobot = A - if(LAZYLEN(faction) && (ROLE_SYNDICATE in faction) && sillyconerobot.emagged == TRUE) + if(target_cyborgs && sillycone.stat != DEAD && iscyborg(sillycone)) + targets += sillycone continue - targets += sillycone - continue + if(sillycone.stat || in_faction(sillycone)) + continue - if(iscarbon(A)) - var/mob/living/carbon/C = A - //If not emagged, only target carbons that can use items - if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || !(C.mobility_flags & MOBILITY_USE))) - continue + if(iscyborg(sillycone)) + var/mob/living/silicon/robot/sillyconerobot = A + if((ROLE_SYNDICATE in faction) && sillyconerobot.emagged == TRUE) + continue - //If emagged, target all but dead carbons - if(mode == TURRET_LETHAL && C.stat == DEAD) - continue + else if(iscarbon(A)) + var/mob/living/carbon/C = A + //If not emagged, only target carbons that can use items + if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || !(C.mobility_flags & MOBILITY_USE))) + continue + + //If emagged, target all but dead carbons + if(mode == TURRET_LETHAL && C.stat == DEAD) + continue - //if the target is a human and not in our faction, analyze threat level - if(ishuman(C) && !in_faction(C)) - if(assess_perp(C) >= 4) - targets += C - - else if(check_anomalies) //non humans who are not simple animals (xenos etc) - if(!in_faction(C)) - targets += C - for(var/A in GLOB.mechas_list) - if((get_dist(A, base) < scan_range) && can_see(base, A, scan_range)) - var/obj/mecha/Mech = A - if(Mech.occupant && !in_faction(Mech.occupant)) //If there is a user and they're not in our faction - if(assess_perp(Mech.occupant) >= 4) - targets += Mech - - if(check_anomalies && GLOB.blobs.len && (mode == TURRET_LETHAL)) - for(var/obj/structure/blob/B in view(scan_range, base)) - targets += B + //if the target is a human and not in our faction, analyze threat level + if(ishuman(C) && !in_faction(C)) + if(assess_perp(C) >= 4) + targets += C + + else if(check_anomalies) //non humans who are not simple animals (xenos etc) + if(!in_faction(C)) + targets += C + for(var/A in GLOB.mechas_list) + if((get_dist(A, T) < scan_range) && can_see(T, A, scan_range)) + var/obj/mecha/Mech = A + if(Mech.occupant && !in_faction(Mech.occupant)) //If there is a user and they're not in our faction + if(assess_perp(Mech.occupant) >= 4) + targets += Mech + + if(check_anomalies && GLOB.blobs.len && (mode == TURRET_LETHAL)) + for(var/obj/structure/blob/B in view(scan_range, T)) + targets += B if(targets.len) - tryToShootAt(targets) + tryToShootAt(targets, valid_turfs) else if(!always_up) popDown() // no valid targets, close the cover -/obj/machinery/porta_turret/proc/tryToShootAt(list/atom/movable/targets) +/obj/machinery/porta_turret/proc/tryToShootAt(list/atom/movable/targets, list/turf/valid_shot_turfs) while(targets.len > 0) var/atom/movable/M = pick(targets) targets -= M - if(target(M)) + if(target(M, valid_shot_turfs["[M.z]"])) return 1 @@ -471,40 +507,27 @@ update_icon() /obj/machinery/porta_turret/proc/assess_perp(mob/living/carbon/human/perp) - var/threatcount = 0 //the integer returned - - if(obj_flags & EMAGGED) - return 10 //if emagged, always return 10. - + //if the turret has been attacked or is angry, target all non-sec people if((stun_all || attacked) && !allowed(perp)) - //if the turret has been attacked or is angry, target all non-sec people if(!allowed(perp)) return 10 - - if(auth_weapons) //check for weapon authorization - if(isnull(perp.wear_id) || istype(perp.wear_id.GetID(), /obj/item/card/id/syndicate)) - - if(allowed(perp)) //if the perp has security access, return 0 - return 0 - - if(perp.is_holding_item_of_type(/obj/item/gun) || perp.is_holding_item_of_type(/obj/item/melee/baton)) - threatcount += 4 - - if(istype(perp.belt, /obj/item/gun) || istype(perp.belt, /obj/item/melee/baton)) - threatcount += 2 - - if(check_records) //if the turret can check the records, check if they are set to *Arrest* on records - var/perpname = perp.get_face_name(perp.get_id_name()) - var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.security) - if(!R || (R.fields["criminal"] == "*Arrest*")) - threatcount += 4 - + //Check for judgement + var/judgement = NONE + if(obj_flags & EMAGGED) + judgement |= JUDGE_EMAGGED + if(auth_weapons) + judgement |= JUDGE_WEAPONCHECK + if(check_records) + judgement |= JUDGE_RECORDCHECK + . = perp.assess_threat(judgement, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) if(shoot_unloyal) - if (!HAS_TRAIT(perp, TRAIT_MINDSHIELD) || istype(perp.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) - threatcount += 4 - - return threatcount + if (!HAS_TRAIT(perp, TRAIT_MINDSHIELD) || istype(perp.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) + . += 4 +/obj/machinery/porta_turret/proc/check_for_weapons(var/obj/item/slot_item) + if(slot_item && (slot_item.item_flags & NEEDS_PERMIT)) + return TRUE + return FALSE /obj/machinery/porta_turret/proc/in_faction(mob/target) for(var/faction1 in faction) @@ -512,15 +535,15 @@ return TRUE return FALSE -/obj/machinery/porta_turret/proc/target(atom/movable/target) +/obj/machinery/porta_turret/proc/target(atom/movable/target, turf/bullet_source) if(target) popUp() //pop the turret up if it's not already up. setDir(get_dir(base, target))//even if you can't shoot, follow the target - shootAt(target) + shootAt(target, bullet_source) return 1 return -/obj/machinery/porta_turret/proc/shootAt(atom/movable/target) +/obj/machinery/porta_turret/proc/shootAt(atom/movable/target, turf/bullet_source) if(!raised) //the turret has to be raised in order to fire - makes sense, right? return @@ -529,7 +552,7 @@ return last_fired = world.time - var/turf/T = get_turf(src) + var/turf/T = bullet_source || get_turf(src) var/turf/U = get_turf(target) if(!istype(T) || !istype(U)) return @@ -564,17 +587,16 @@ //Shooting Code: A.preparePixelProjectile(target, T) A.firer = src - A.fired_from = src + A.fired_from = bullet_source A.fire() return A -/obj/machinery/porta_turret/proc/setState(on, mode) +/obj/machinery/porta_turret/proc/setState(on, mode, shoot_cyborgs) if(controllock) return - src.on = on - if(!on) - popDown() + toggle_on(on) src.mode = mode + src.target_cyborgs = shoot_cyborgs power_change() @@ -587,7 +609,7 @@ var/obj/machinery/porta_turret/P = target if(!istype(P)) return - P.setState(P.on,!P.mode) + P.setState(P.on, !P.mode, P.target_cyborgs) /datum/action/turret_quit name = "Release Control" @@ -630,6 +652,7 @@ always_up = initial(always_up) manual_control = FALSE remote_controller = null + check_should_process() return TRUE /obj/machinery/porta_turret/proc/InterceptClickOn(mob/living/caller, params, atom/A) @@ -644,11 +667,12 @@ /obj/machinery/porta_turret/syndicate installation = null - always_up = 1 + always_up = TRUE use_power = NO_POWER_USE - has_cover = 0 + has_cover = FALSE scan_range = 9 req_access = list(ACCESS_SYNDICATE) + uses_stored = FALSE mode = TURRET_LETHAL stun_projectile = /obj/item/projectile/bullet lethal_projectile = /obj/item/projectile/bullet @@ -712,7 +736,7 @@ lethal_projectile = /obj/item/projectile/bullet/p50/penetrator/shuttle lethal_projectile_sound = 'sound/weapons/gunshot_smg.ogg' stun_projectile_sound = 'sound/weapons/gunshot_smg.ogg' - armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 80, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 80, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90, "stamina" = 0) /obj/machinery/porta_turret/syndicate/shuttle/target(atom/movable/target) if(target) @@ -755,7 +779,7 @@ /obj/machinery/porta_turret/centcom_shuttle installation = null max_integrity = 260 - always_up = 1 + always_up = TRUE use_power = NO_POWER_USE has_cover = 0 scan_range = 9 @@ -809,7 +833,7 @@ var/locked = TRUE /// An area in which linked turrets are located, it can be an area name, path or nothing var/control_area = null - /// AI is unable to use this machine if set to TRUE + /// Silicons are unable to use this machine if set to TRUE var/ailock = FALSE /// Variable dictating if linked turrets will shoot cyborgs var/shoot_cyborgs = FALSE @@ -848,9 +872,9 @@ /obj/machinery/turretid/examine(mob/user) . += ..() - if(issilicon(user) && (!stat & BROKEN)) - . += {"Ctrl-click [src] to [ enabled ? "disable" : "enable"] turrets. - Alt-click [src] to set turrets to [ lethal ? "stun" : "kill"]."} + if(issilicon(user) && !(stat & BROKEN)) + . += "Ctrl-click [src] to [ enabled ? "disable" : "enable"] turrets.\n"+\ + "Alt-click [src] to set turrets to [ lethal ? "stun" : "kill"]." /obj/machinery/turretid/attackby(obj/item/I, mob/user, params) if(stat & BROKEN) @@ -886,6 +910,12 @@ obj_flags |= EMAGGED locked = FALSE +/obj/machinery/turretid/attack_robot(mob/user) + if(!ailock) + return attack_hand(user) + else + to_chat(user, "There seems to be a firewall preventing you from accessing this device.") + /obj/machinery/turretid/attack_ai(mob/user) if(!ailock || IsAdminGhost(user)) return attack_hand(user) @@ -939,22 +969,25 @@ add_hiddenprint(user) log_combat(user, src, "[lethal ? "enabled" : "disabled"] lethals on") updateTurrets() + ui_update() /obj/machinery/turretid/proc/toggle_on(mob/user) enabled = !enabled add_hiddenprint(user) log_combat(user, src, "[enabled ? "enabled" : "disabled"]") updateTurrets() + ui_update() /obj/machinery/turretid/proc/shoot_silicons(mob/user) shoot_cyborgs = !shoot_cyborgs add_hiddenprint(user) log_combat(user, src, "[shoot_cyborgs ? "Shooting Borgs" : "Not Shooting Borgs"]") updateTurrets() + ui_update() /obj/machinery/turretid/proc/updateTurrets() for (var/obj/machinery/porta_turret/aTurret in turrets) - aTurret.setState(enabled, lethal) + aTurret.setState(enabled, lethal, shoot_cyborgs) update_icon() /obj/machinery/turretid/power_change() @@ -1098,9 +1131,9 @@ if(on) if(team_color == "blue") if(istype(P, /obj/item/projectile/beam/lasertag/redtag)) - on = FALSE - addtimer(VARSET_CALLBACK(src, on, TRUE), 10 SECONDS) + toggle_on(FALSE) + addtimer(CALLBACK(src, .proc/toggle_on, TRUE), 10 SECONDS) else if(team_color == "red") if(istype(P, /obj/item/projectile/beam/lasertag/bluetag)) - on = FALSE - addtimer(VARSET_CALLBACK(src, on, TRUE), 10 SECONDS) + toggle_on(FALSE) + addtimer(CALLBACK(src, .proc/toggle_on, TRUE), 10 SECONDS) diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index 0720b64f85eaf..1c9580239f298 100644 --- a/code/game/machinery/porta_turret/portable_turret_construct.dm +++ b/code/game/machinery/porta_turret/portable_turret_construct.dm @@ -187,9 +187,3 @@ /obj/machinery/porta_turret_construct/attack_ai() return - -/obj/machinery/porta_turret_construct/Destroy() - if(installed_gun) - qdel(installed_gun) - installed_gun = null - . = ..() diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm index 4df7001c11d8a..6e40326cd4d67 100644 --- a/code/game/machinery/porta_turret/portable_turret_cover.dm +++ b/code/game/machinery/porta_turret/portable_turret_cover.dm @@ -92,6 +92,5 @@ to_chat(user, "You short out [parent_turret]'s threat assessment circuits.") visible_message("[parent_turret] hums oddly...") parent_turret.obj_flags |= EMAGGED - parent_turret.on = 0 - spawn(40) - parent_turret.on = 1 + parent_turret.on = FALSE + addtimer(VARSET_CALLBACK(parent_turret, on, TRUE), 40) \ No newline at end of file diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index 69b512cd2ac8a..cbeaa689b33d4 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -163,9 +163,9 @@ target_pad.sparks() flick("qpad-beam", src) - playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) + playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff_exponent = 5) flick("qpad-beam", target_pad) - playsound(get_turf(target_pad), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) + playsound(get_turf(target_pad), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff_exponent = 5) for(var/atom/movable/ROI in get_turf(src)) if(QDELETED(ROI)) continue //sleeps in CHECK_TICK diff --git a/code/game/machinery/race_converter.dm b/code/game/machinery/race_converter.dm new file mode 100644 index 0000000000000..45a7c56d7b392 --- /dev/null +++ b/code/game/machinery/race_converter.dm @@ -0,0 +1,148 @@ +/obj/machinery/species_converter + name = "species conversion chamber" + desc = "Safely and efficiently converts the species of the occupant, warranty void if exposed to plasma." + icon = 'icons/obj/machines/fat_sucker.dmi' + icon_state = "fat" + state_open = FALSE + density = TRUE + var/dangerous = FALSE // Can the species coverter turn people into plasma men? + var/brainwash = FALSE + var/processing = FALSE + var/iterations = 0 // how long the user (victim) has been in the chamber for + var/changed = FALSE + var/datum/species/desired_race = /datum/species/human/felinid + var/datum/looping_sound/microwave/soundloop + +/obj/machinery/species_converter/racewar + name = "species hypnosis chamber" + brainwash = TRUE + +/obj/machinery/species_converter/Initialize() + . = ..() + soundloop = new(list(src), FALSE) + update_icon() + +/obj/machinery/species_converter/Destroy() + QDEL_NULL(soundloop) + return ..() + +/obj/machinery/species_converter/can_be_occupant(atom/movable/am) + return ishuman(am) + +/obj/machinery/species_converter/close_machine(mob/user) + if(panel_open) + to_chat(user, "You need to close the maintenance hatch first!") + return + ..() + playsound(src, 'sound/machines/click.ogg', 50) + if(occupant) + to_chat(occupant, "You enter [src]") + addtimer(CALLBACK(src, .proc/begin_conversion), 20, TIMER_OVERRIDE|TIMER_UNIQUE) + update_icon() + +/obj/machinery/species_converter/open_machine(mob/user) + playsound(src, 'sound/machines/click.ogg', 50) + if(processing) + stop() + ..() + +/obj/machinery/species_converter/proc/stop() + processing = FALSE + iterations = 0 + soundloop.stop() + set_light(0, 0) + +/obj/machinery/species_converter/interact(mob/user) + if(state_open) + close_machine() + else if(!processing) + open_machine() + else + to_chat(user, "You can't open the [src] while it's active!") + +/obj/machinery/species_converter/update_overlays() + . = ..() + if(!state_open) + if(processing) + . += "[icon_state]_door_on" + . += "[icon_state]_stack" + . += "[icon_state]_smoke" + . += "[icon_state]_green" + else + . += "[icon_state]_door_off" + if(occupant) + if(powered(AREA_USAGE_EQUIP)) + . += "[icon_state]_stack" + . += "[icon_state]_yellow" + else + . += "[icon_state]_red" + else if(powered(AREA_USAGE_EQUIP)) + . += "[icon_state]_red" + if(panel_open) + . += "[icon_state]_panel" + +/obj/machinery/species_converter/process(delta_time) + if(!processing) + return + if(!is_operational() || !occupant || !iscarbon(occupant)) + open_machine() + return + + var/mob/living/carbon/C = occupant + if(is_species(C, desired_race)) + open_machine() + playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, FALSE) + return + + if(DT_PROB(iterations * 10 + 10, delta_time)) // conversion has some random variation in it + C.set_species(desired_race) + if(brainwash) + to_chat(C, "A new compulsion fills your mind... you feel forced to obey it!") + var/objective = "Convert as many people as possible into a [initial(desired_race.name)]. Racewar!" + brainwash(C, objective) + log_game("[key_name(C)] has been brainwashed with the objective '[objective]' via the species converter.") + + iterations++ + use_power(500) + +/obj/machinery/species_converter/proc/begin_conversion() + if(state_open || !occupant || processing || !is_operational()) + return + if(iscarbon(occupant)) + var/mob/living/carbon/C = occupant + if(!is_species(C, desired_race)) + processing = TRUE + soundloop.start() + update_icon() + set_light(2, 1, "#ff0000") + else + say("Occupant is already the desired race.") + playsound(src, 'sound/machines/buzz-sigh.ogg', 40, FALSE) + open_machine() + +/obj/machinery/species_converter/AltClick(mob/user) + if(!user.canUseTopic(src, BE_CLOSE) || processing) + return + if(user == occupant) + to_chat(user, "You can't reach the controls from inside!") + return + if(brainwash && changed) + to_chat(user, "The species controller is locked!") + return + var/list/allowed = GLOB.roundstart_races + if(!dangerous) + allowed -= "plasmaman" + var/choice = input("Select desired race") as null|anything in allowed + if(choice) + desired_race = GLOB.species_list[choice] + changed = TRUE + to_chat(user, "You change \the [src]'s desired race setting to [initial(desired_race.name)].") + +/obj/machinery/species_converter/emag_act(mob/user) + if(obj_flags & EMAGGED) + return + dangerous = TRUE + brainwash = prob(30) + changed = FALSE + obj_flags |= EMAGGED + to_chat(user, "You quitely disable \the [src]'s safety measures.") diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index cd987a057b083..6a0819c805e94 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -5,11 +5,12 @@ desc = "A charging dock for energy based weaponry." use_power = IDLE_POWER_USE idle_power_usage = 4 - active_power_usage = 250 + active_power_usage = 300 circuit = /obj/item/circuitboard/machine/recharger pass_flags = PASSTABLE var/obj/item/charging = null var/recharge_coeff = 1 + var/using_power = FALSE var/static/list/allowed_devices = typecacheof(list( /obj/item/gun/energy, @@ -28,15 +29,15 @@ return if(charging) - . += {"\The [src] contains: - - \A [charging]."} + . += "\The [src] contains:\n"+\ + "- \A [charging]." if(!(stat & (NOPOWER|BROKEN))) - . += "The status display reads:" - . += "- Recharging [recharge_coeff*10]% cell charge per cycle." + . += "The status display reads:" + . += "- Recharging [recharge_coeff*10]% cell charge per cycle." if(charging) var/obj/item/stock_parts/cell/C = charging.get_cell() - . += "- \The [charging]'s cell is at [C.percent()]%." + . += "- \The [charging]'s cell is at [C.percent()]%." /obj/machinery/recharger/proc/setCharging(new_charging) @@ -115,27 +116,27 @@ charging.forceMove(drop_location()) setCharging(null) -/obj/machinery/recharger/process() +/obj/machinery/recharger/process(delta_time) if(stat & (NOPOWER|BROKEN) || !anchored) return PROCESS_KILL - var/using_power = 0 + using_power = FALSE if(charging) var/obj/item/stock_parts/cell/C = charging.get_cell() if(C) if(C.charge < C.maxcharge) - C.give(C.chargerate * recharge_coeff) - use_power(250 * recharge_coeff) - using_power = 1 - update_icon(using_power) + C.give(C.chargerate * recharge_coeff * delta_time / 2) + use_power(125 * recharge_coeff * delta_time) + using_power = TRUE + update_icon() if(istype(charging, /obj/item/ammo_box/magazine/recharge)) var/obj/item/ammo_box/magazine/recharge/R = charging if(R.stored_ammo.len < R.max_ammo) R.stored_ammo += new R.ammo_type(R) - use_power(200 * recharge_coeff) - using_power = 1 - update_icon(using_power) + use_power(100 * recharge_coeff * delta_time) + using_power = TRUE + update_icon() return else return PROCESS_KILL @@ -160,7 +161,7 @@ B.cell.charge = 0 -/obj/machinery/recharger/update_icon(using_power = 0, scan) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier. +/obj/machinery/recharger/update_icon(scan) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier. if(stat & (NOPOWER|BROKEN) || !anchored) icon_state = "rechargeroff" return diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 4563ab11864a1..77f776f382aa6 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -31,16 +31,15 @@ /obj/machinery/recharge_station/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Recharging [recharge_speed]J per cycle." + . += "The status display reads: Recharging [recharge_speed]J per cycle." if(repairs) - . += "[src] has been upgraded to support automatic repairs." + . += "[src] has been upgraded to support automatic repairs." -/obj/machinery/recharge_station/process() +/obj/machinery/recharge_station/process(delta_time) if(!is_operational()) return - if(occupant) - process_occupant() + process_occupant(delta_time) return 1 /obj/machinery/recharge_station/relaymove(mob/user) @@ -101,10 +100,10 @@ ..() update_icon() -/obj/machinery/recharge_station/proc/process_occupant() +/obj/machinery/recharge_station/proc/process_occupant(delta_time) if(!occupant) return - SEND_SIGNAL(occupant, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, recharge_speed, repairs) + SEND_SIGNAL(occupant, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, recharge_speed * delta_time / 2, repairs) /obj/machinery/recharge_station/proc/restock_modules() if(occupant) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 24f6c51befe58..ebb56d3529053 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -8,6 +8,8 @@ layer = ABOVE_ALL_MOB_LAYER // Overhead density = TRUE circuit = /obj/item/circuitboard/machine/recycler + idle_power_usage = 50 + active_power_usage = 200 var/safety_mode = FALSE // Temporarily stops machine if it detects a mob var/icon_name = "grinder-o" var/blood = 0 @@ -41,10 +43,10 @@ /obj/machinery/recycler/examine(mob/user) . = ..() - . += "Reclaiming [amount_produced]% of materials salvaged." - . += {"The power light is [(stat & NOPOWER) ? "off" : "on"]. - The safety-mode light is [safety_mode ? "on" : "off"]. - The safety-sensors status light is [obj_flags & EMAGGED ? "off" : "on"]."} + . += "Reclaiming [amount_produced]% of materials salvaged." + . += "The power light is [(stat & NOPOWER) ? "off" : "on"].\n"+\ + "The safety-mode light is [safety_mode ? "on" : "off"].\n"+\ + "The safety-sensors status light is [obj_flags & EMAGGED ? "off" : "on"]." /obj/machinery/recycler/power_change() ..() @@ -116,7 +118,7 @@ crush_living(AM) else emergency_stop(AM) - else if(istype(AM, /obj/item)) + else if(istype(AM, /obj/item) && !istype(AM, /obj/item/stack)) recycle_item(AM) items_recycled++ else @@ -127,7 +129,10 @@ playsound(src, item_recycle_sound, 50, 1) /obj/machinery/recycler/proc/recycle_item(obj/item/I) - + if(I.resistance_flags & INDESTRUCTIBLE) //indestructible item check + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) + I.forceMove(loc) + return I.forceMove(loc) var/obj/item/grown/log/L = I if(istype(L)) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 9426ba7d90334..93b2993b2c19c 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -29,6 +29,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) desc = "A console intended to send requests to different departments on the station." icon = 'icons/obj/terminals.dmi' icon_state = "req_comp0" + layer = ABOVE_WINDOW_LAYER 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 //bitflag @@ -66,8 +67,9 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) 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. + var/auth_id = "Unknown" //Will contain the name and and job of the person who verified it max_integrity = 300 - armor = list("melee" = 70, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list("melee" = 70, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90, "stamina" = 0) light_color = LIGHT_COLOR_GREEN light_power = 1.5 @@ -101,6 +103,9 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) /obj/machinery/requests_console/Initialize() . = ..() + if(department == "Unknown") + var/area/AR = get_area(src) + department = AR.name name = "\improper [department] requests console" GLOB.allConsoles += src @@ -269,7 +274,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) if(isliving(usr)) var/mob/living/L = usr message = L.treat_message(message) - minor_announce(message, "[department] Announcement:") + minor_announce(message, "[department] Announcement:", from = auth_id, html_encode = FALSE) GLOB.news_network.SubmitArticle(message, department, "Station Announcements", null) 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)].") @@ -348,7 +353,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) updateUsrDialog() -/obj/machinery/requests_console/say_mod(input, message_mode) +/obj/machinery/requests_console/say_mod(input, list/message_mods = list()) if(spantext_char(input, "!", -3)) return "blares" else @@ -429,7 +434,10 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) return var/obj/item/card/id/ID = O.GetID() + + if(ID) + auth_id = "[ID.registered_name] ([ID.assignment])" if(screen == REQ_SCREEN_AUTHENTICATE) msgVerified = "Verified by [ID.registered_name] ([ID.assignment])" updateUsrDialog() diff --git a/code/game/machinery/scan_gate.dm b/code/game/machinery/scan_gate.dm index 01a34cc7a819a..45406abb4a3fe 100644 --- a/code/game/machinery/scan_gate.dm +++ b/code/game/machinery/scan_gate.dm @@ -33,7 +33,7 @@ var/next_beep = 0 //avoids spam var/locked = FALSE var/scangate_mode = SCANGATE_NONE - var/disease_threshold = DISEASE_SEVERITY_MINOR + var/disease_threshold = DISEASE_MINOR var/nanite_cloud = 1 var/detect_species = SCANGATE_HUMAN var/reverse = FALSE //If true, signals if the scan returns false @@ -73,11 +73,15 @@ locked = FALSE req_access = list() to_chat(user, "You unlock [src].") + //Update to viewers + ui_update() else if(!(obj_flags & EMAGGED)) to_chat(user, "You lock [src] with [W].") var/list/access = W.GetAccess() req_access = access locked = TRUE + //Update to viewers + ui_update() else to_chat(user, "You try to lock [src] with [W], but nothing happens.") else @@ -90,6 +94,8 @@ req_access = list() obj_flags |= EMAGGED to_chat(user, "You fry the ID checking system.") + //Update to viewers + ui_update() /obj/machinery/scanner_gate/proc/perform_scan(mob/living/M) var/beep = FALSE @@ -117,7 +123,7 @@ if(SCANGATE_DISEASE) if(iscarbon(M)) var/mob/living/carbon/C = M - if(get_disease_severity_value(C.check_virus()) >= get_disease_severity_value(disease_threshold)) + if(get_disease_danger_value(C.check_virus()) >= get_disease_danger_value(disease_threshold)) beep = TRUE if(SCANGATE_SPECIES) if(ishuman(M)) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index becbabf2789f0..4a51055b5a74e 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -96,8 +96,8 @@ update_icon() move_resist = INFINITY - for(var/turf/target_tile in range(shield_range, src)) - if(isspaceturf(target_tile) && !(locate(/obj/structure/emergency_shield) in target_tile)) + for(var/turf/open/space/target_tile in RANGE_TURFS(shield_range, src)) + if(!(locate(/obj/structure/emergency_shield) in target_tile)) if(!(stat & BROKEN) || prob(33)) deployed_shields += new /obj/structure/emergency_shield(target_tile) @@ -107,9 +107,9 @@ update_icon() QDEL_LIST(deployed_shields) -/obj/machinery/shieldgen/process() +/obj/machinery/shieldgen/process(delta_time) if((stat & BROKEN) && active) - if(deployed_shields.len && prob(5)) + if(deployed_shields.len && DT_PROB(2.5, delta_time)) qdel(pick(deployed_shields)) diff --git a/code/game/machinery/shuttle/shuttle_engine.dm b/code/game/machinery/shuttle/shuttle_engine.dm index e3cdec77b6e25..b421657e7d104 100644 --- a/code/game/machinery/shuttle/shuttle_engine.dm +++ b/code/game/machinery/shuttle/shuttle_engine.dm @@ -20,6 +20,7 @@ var/bluespace_capable = TRUE var/cooldown = 0 var/thruster_active = FALSE + var/needs_heater = TRUE var/datum/weakref/attached_heater /obj/machinery/shuttle/engine/plasma @@ -47,6 +48,7 @@ thrust = 400 fuel_use = 0 bluespace_capable = TRUE + needs_heater = FALSE cooldown = 90 /obj/machinery/shuttle/engine/Initialize() @@ -73,19 +75,24 @@ 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 + var/obj/machinery/atmospherics/components/unary/shuttle/heater/as_heater = locate() in heater_turf + if(!as_heater) + return + if(as_heater.dir != dir) + return + if(as_heater.panel_open) + return + if(!as_heater.anchored) + return + attached_heater = WEAKREF(as_heater) update_engine() return /obj/machinery/shuttle/engine/proc/update_engine() + if(!needs_heater) + icon_state = icon_state_closed + thruster_active = TRUE + return if(!attached_heater) icon_state = icon_state_off thruster_active = FALSE diff --git a/code/game/machinery/shuttle/shuttle_heater.dm b/code/game/machinery/shuttle/shuttle_heater.dm index b5d3c4e28d759..01964b1fb6a0b 100644 --- a/code/game/machinery/shuttle/shuttle_heater.dm +++ b/code/game/machinery/shuttle/shuttle_heater.dm @@ -22,13 +22,13 @@ 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 30, "stamina" = 0) layer = OBJ_LAYER showpipe = TRUE pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY - var/gas_type = /datum/gas/plasma + var/gas_type = GAS_PLASMA var/efficiency_multiplier = 1 var/gas_capacity = 0 diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 121bf28a450ca..7c689ca8098b2 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -58,12 +58,12 @@ give_payout(balance) return ..() -/obj/machinery/computer/slot_machine/process() +/obj/machinery/computer/slot_machine/process(delta_time) . = ..() //Sanity checks. if(!.) return . - money++ //SPESSH MAJICKS + money += round(delta_time / 2) //SPESSH MAJICKS /obj/machinery/computer/slot_machine/update_icon() if(stat & NOPOWER) @@ -256,7 +256,7 @@ if(reels[1][2] + reels[2][2] + reels[3][2] + reels[4][2] + reels[5][2] == "[SEVEN][SEVEN][SEVEN][SEVEN][SEVEN]") visible_message("[src] says, 'JACKPOT! You win [money] credits!'") - priority_announce("Congratulations to [user ? user.real_name : usrname] for winning the jackpot at the slot machine in [get_area(src)]!") + priority_announce("Congratulations to [user ? user.real_name : usrname] for winning the jackpot at the slot machine in [get_area(src)]!", sound = SSstation.announcer.get_rand_alert_sound()) jackpots += 1 balance += money - give_payout(JACKPOT) money = 0 @@ -319,7 +319,7 @@ amount = dispense(amount, cointype, null, 0) else - var/mob/living/target = locate() in range(2, src) + var/mob/living/target = locate() in hearers(2, src) amount = dispense(amount, cointype, target, 1) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 6276009ee7ede..8e42394aca2dd 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -11,17 +11,15 @@ name = "space heater" desc = "Made by Space Amish using traditional space techniques, this heater/cooler is guaranteed not to set the station on fire. Warranty void if used in engines." max_integrity = 250 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 10) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 10, "stamina" = 0) circuit = /obj/item/circuitboard/machine/space_heater - - var/obj/item/stock_parts/cell/cell var/on = FALSE var/mode = HEATER_MODE_STANDBY var/setMode = "auto" // Anything other than "heat" or "cool" is considered auto. var/targetTemperature = T20C - var/heatingPower = 40000 + var/heatingPower = 20000 var/efficiency = 20000 var/temperatureTolerance = 1 var/settableTemperatureMedian = 30 + T0C @@ -68,7 +66,7 @@ if(panel_open) add_overlay("sheater-open") -/obj/machinery/space_heater/process() +/obj/machinery/space_heater/process_atmos() //TODO figure out delta_time if(!on || !is_operational()) if (on) // If it's broken, turn it off too on = FALSE @@ -124,7 +122,7 @@ for(var/obj/item/stock_parts/capacitor/M in component_parts) cap += M.rating - heatingPower = laser * 40000 + heatingPower = laser * 20000 settableTemperatureRange = cap * 30 efficiency = (cap + 1) * 10000 @@ -176,6 +174,7 @@ ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "SpaceHeater") + ui.set_autoupdate(TRUE) // Displays temperature ui.open() /obj/machinery/space_heater/ui_data() @@ -213,7 +212,7 @@ usr.visible_message("[usr] switches [on ? "on" : "off"] \the [src].", "You switch [on ? "on" : "off"] \the [src].") update_icon() if (on) - START_PROCESSING(SSmachines, src) + SSair.atmos_air_machinery += src . = TRUE if("mode") setMode = params["mode"] diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm index b0a836ab58d27..0ffe8aa21f1e7 100644 --- a/code/game/machinery/stasis.dm +++ b/code/game/machinery/stasis.dm @@ -1,6 +1,6 @@ #define STASIS_TOGGLE_COOLDOWN 50 /obj/machinery/stasis - name = "Lifeform Stasis Unit" + name = "lifeform stasis unit" desc = "A not-so-comfortable looking bed with nozzles on top and bottom. Placing someone here will suspend their vital processes, putting them in stasis until removed." icon = 'icons/obj/machines/stasis.dmi' icon_state = "stasis" @@ -8,8 +8,8 @@ can_buckle = TRUE buckle_lying = 90 circuit = /obj/item/circuitboard/machine/stasis - idle_power_usage = 40 - active_power_usage = 340 + idle_power_usage = 50 + active_power_usage = 500 fair_market_price = 10 payment_department = ACCOUNT_MED var/stasis_enabled = TRUE @@ -22,7 +22,7 @@ /obj/machinery/stasis/Initialize() . = ..() for(var/direction in GLOB.cardinals) - op_computer = locate(/obj/machinery/computer/operating, get_step(src, direction)) + op_computer = locate(/obj/machinery/computer/operating) in get_step(src, direction) if(op_computer) op_computer.sbed = src break @@ -123,12 +123,6 @@ chill_out(L) update_icon() -/obj/machinery/stasis/proc/check_patient() - if(occupant) - return TRUE - else - return FALSE - /obj/machinery/stasis/post_unbuckle_mob(mob/living/L) thaw_them(L) if(L == occupant) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index cc49d465e258e..217b10e294199 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -24,6 +24,7 @@ density = FALSE use_power = IDLE_POWER_USE idle_power_usage = 10 + layer = ABOVE_WINDOW_LAYER maptext_height = 26 maptext_width = 32 @@ -101,7 +102,7 @@ /// Update the display and, if necessary, re-enable processing. /obj/machinery/status_display/proc/update() - if (process() != PROCESS_KILL) + if (process(SSMACHINES_DT) != PROCESS_KILL) START_PROCESSING(SSmachines, src) /obj/machinery/status_display/power_change() diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index c73f76e3f0a6a..b6fae2d6639af 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -40,9 +40,11 @@ * If the hack wire is cut/pulsed. * Modifies effects of cook() * * If FALSE, decontamination sequence will clear radiation for all atoms (and their contents) contained inside the unit, and burn any mobs inside. - * * If TRUE, decontamination sequence will delete all items contained within, and if occupied by a mob, intensifies burn damage delt. All wires will be cut at the end. + * * If TRUE, decontamination sequence will burn and decontaminate all items contained within, and if occupied by a mob, intensifies burn damage delt. All wires will be cut at the end. */ var/uv_super = FALSE + /// For managing the messages sent back when the machine was hacked + var/toasted = FALSE /// How many cycles remain for the decontamination sequence. var/uv_cycles = 6 /// Cooldown for occupant breakout messages via relaymove() @@ -50,7 +52,7 @@ /// How long it takes to break out of the SSU. var/breakout_time = 300 /// How fast it charges cells in a suit - var/charge_rate = 500 + var/charge_rate = 250 /obj/machinery/suit_storage_unit/standard_unit suit_type = /obj/item/clothing/suit/space/eva @@ -93,6 +95,10 @@ suit_type = /obj/item/clothing/suit/space/hardsuit/mining mask_type = /obj/item/clothing/mask/breath +/obj/machinery/suit_storage_unit/exploration + suit_type = /obj/item/clothing/suit/space/hardsuit/exploration + mask_type = /obj/item/clothing/mask/breath + /obj/machinery/suit_storage_unit/cmo suit_type = /obj/item/clothing/suit/space/hardsuit/medical/cmo mask_type = /obj/item/clothing/mask/breath @@ -150,17 +156,14 @@ update_icon() /obj/machinery/suit_storage_unit/Destroy() - QDEL_NULL(suit) - QDEL_NULL(helmet) - QDEL_NULL(mask) - QDEL_NULL(storage) + dump_contents() return ..() /obj/machinery/suit_storage_unit/update_icon() cut_overlays() if(uv) - if(uv_super) + if(uv_super || (obj_flags & EMAGGED)) add_overlay("super") else if(occupant) add_overlay("uvhuman") @@ -195,6 +198,18 @@ storage = null occupant = null +/obj/machinery/suit_storage_unit/emp_act() + . = ..() + uv_super = !uv_super + wires.ui_update() + ui_update() + +/obj/machinery/suit_storage_unit/emag_act(mob/user) + if(obj_flags & EMAGGED) + return + obj_flags |= EMAGGED + to_chat(user, "You reprogram [src]'s decontamination subroutines.") + /obj/machinery/suit_storage_unit/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) open_machine() @@ -219,7 +234,6 @@ if(occupant || helmet || suit || storage) to_chat(user, "It's too cluttered inside to fit in!") return - if(target == user) user.visible_message("[user] starts squeezing into [src]!", "You start working your way into [src]...") else @@ -251,7 +265,7 @@ locked = TRUE update_icon() if(occupant) - if(uv_super) + if(uv_super || (obj_flags & EMAGGED)) mob_occupant.adjustFireLoss(rand(20, 36)) else mob_occupant.adjustFireLoss(rand(10, 16)) @@ -261,47 +275,52 @@ uv_cycles = initial(uv_cycles) uv = FALSE locked = FALSE - if(uv_super) - visible_message("[src]'s door creaks open with a loud whining noise. A cloud of foul black smoke escapes from its chamber.") - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 50, TRUE) - helmet = null - qdel(helmet) - suit = null - qdel(suit) // Delete everything but the occupant. - mask = null - qdel(mask) - storage = null - qdel(storage) - // The wires get damaged too. - wires.cut_all() - else - if(!occupant) - visible_message("[src]'s door slides open. The glowing yellow lights dim to a gentle green.") + if(uv_super || (obj_flags & EMAGGED)) + toasted = TRUE + if(occupant) + visible_message("[src]'s door creaks open with a loud whining noise. A foul stench and a cloud of smoke exit the chamber.") else - visible_message("[src]'s door slides open, barraging you with the nauseating smell of charred flesh.") - mob_occupant.radiation = 0 - playsound(src, 'sound/machines/airlockclose.ogg', 25, TRUE) - var/list/things_to_clear = list() //Done this way since using GetAllContents on the SSU itself would include circuitry and such. - if(suit) - things_to_clear += suit - things_to_clear += suit.GetAllContents() + visible_message("[src]'s door creaks open with a loud whining noise. A cloud of foul black smoke escapes from its chamber.") + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 50, TRUE) if(helmet) - things_to_clear += helmet - things_to_clear += helmet.GetAllContents() + helmet.take_damage(100,BURN,"fire") + if(suit) + suit.take_damage(100,BURN,"fire") if(mask) - things_to_clear += mask - things_to_clear += mask.GetAllContents() + mask.take_damage(100,BURN,"fire") if(storage) - things_to_clear += storage - things_to_clear += storage.GetAllContents() + storage.take_damage(100,BURN,"fire") + // The wires get damaged too. + wires.cut_all() + if(!toasted) //Special toast check to prevent a double finishing message. if(occupant) - things_to_clear += occupant - things_to_clear += occupant.GetAllContents() - for(var/atom/movable/AM in things_to_clear) //Scorches away blood and forensic evidence, although the SSU itself is unaffected - SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG) - var/datum/component/radioactive/contamination = AM.GetComponent(/datum/component/radioactive) - if(contamination) - qdel(contamination) + visible_message("[src]'s door slides open, barraging you with the nauseating smell of charred flesh.") + mob_occupant.radiation = 0 + else + visible_message("[src]'s door slides open. The glowing yellow lights dim to a gentle green.") + toasted = FALSE + playsound(src, 'sound/machines/airlockclose.ogg', 25, TRUE) + var/list/things_to_clear = list() //Done this way since using GetAllContents on the SSU itself would include circuitry and such. + if(suit) + things_to_clear += suit + things_to_clear += suit.GetAllContents() + if(helmet) + things_to_clear += helmet + things_to_clear += helmet.GetAllContents() + if(mask) + things_to_clear += mask + things_to_clear += mask.GetAllContents() + if(storage) + things_to_clear += storage + things_to_clear += storage.GetAllContents() + if(occupant) + things_to_clear += occupant + things_to_clear += occupant.GetAllContents() + for(var/atom/movable/AM in things_to_clear) //Scorches away blood and forensic evidence, although the SSU itself is unaffected + SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG) + var/datum/component/radioactive/contamination = AM.GetComponent(/datum/component/radioactive) + if(contamination) + qdel(contamination) open_machine(FALSE) if(occupant) dump_contents() @@ -389,6 +408,7 @@ visible_message("[user] inserts [I] into [src]", "You load [I] into [src].") update_icon() + ui_update() return if(panel_open && is_wire_tool(I)) @@ -396,6 +416,7 @@ return if(!state_open) if(default_deconstruction_screwdriver(user, "panel", "close", I)) + ui_update() // Wires might've changed availability of decontaminate button return if(default_pry_open(I)) dump_contents() @@ -500,4 +521,6 @@ if(I) I.forceMove(loc) . = TRUE - update_icon() + + if(.) + update_icon() diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 4f0a71127dba0..b378294c3ef8e 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -24,7 +24,7 @@ to_chat(user, "The connected wire doesn't have enough current.") return for(var/obj/singularity/singulo in GLOB.singularities) - if(singulo.z == z) + if(singulo.get_virtual_z_level() == get_virtual_z_level()) singulo.target = src icon_state = "[icontype]1" active = 1 @@ -95,7 +95,7 @@ if(cooldown <= world.time) cooldown = world.time + 80 for(var/obj/singularity/singulo in GLOB.singularities) - if(singulo.z == z) + if(singulo.get_virtual_z_level() == get_virtual_z_level()) say("[singulo] is now [get_dist(src,singulo)] standard lengths away to the [dir2text(get_dir(src,singulo))]") else Deactivate() @@ -152,4 +152,4 @@ /obj/item/sbeacondrop/penetratorturret desc = "A label on it reads: Warning: Activating this device will send a penetrator turret to your location." - droptype = /obj/machinery/porta_turret/syndicate/shuttle \ No newline at end of file + droptype = /obj/machinery/porta_turret/syndicate/shuttle diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index b519f2a33e07b..c759c3df639a5 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -11,7 +11,8 @@ density = FALSE layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS resistance_flags = FIRE_PROOF | ACID_PROOF - speed_process = TRUE + processing_flags = START_PROCESSING_MANUALLY + subsystem_type = /datum/controller/subsystem/processing/fastprocess interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_OFFLINE @@ -48,7 +49,10 @@ /obj/machinery/syndicatebomb/process() if(!active) - STOP_PROCESSING(SSfastprocess, src) + var/datum/component/tracking_beacon/beacon = GetComponent(/datum/component/tracking_beacon) + if(beacon) + qdel(beacon) + end_processing() detonation_timer = null next_beep = null countdown.stop() @@ -75,6 +79,9 @@ next_beep = world.time + 10 if(active && ((detonation_timer <= world.time) || explode_now)) + var/datum/component/tracking_beacon/beacon = GetComponent(/datum/component/tracking_beacon) + if(beacon) + qdel(beacon) active = FALSE timer_set = initial(timer_set) update_icon() @@ -87,12 +94,12 @@ payload = new payload(src) update_icon() countdown = new(src) - STOP_PROCESSING(SSfastprocess, src) + end_processing() /obj/machinery/syndicatebomb/Destroy() QDEL_NULL(wires) QDEL_NULL(countdown) - STOP_PROCESSING(SSfastprocess, src) + end_processing() return ..() /obj/machinery/syndicatebomb/examine(mob/user) @@ -183,7 +190,9 @@ /obj/machinery/syndicatebomb/proc/activate() active = TRUE - START_PROCESSING(SSfastprocess, src) + begin_processing() + //Global teamfinder signal trackable on the synd frequency. + AddComponent(/datum/component/tracking_beacon, "synd", null, null, TRUE, "#ff2b2b", TRUE, TRUE) countdown.start() next_beep = world.time + 10 detonation_timer = world.time + (timer_set * 10) @@ -239,7 +248,7 @@ wires.cut_all() /obj/machinery/syndicatebomb/self_destruct - name = "self destruct device" + name = "self-destruct device" desc = "Do not taunt. Warranty invalid if exposed to high temperature. Not suitable for agents under 3 years of age." payload = /obj/item/bombcore/large can_unanchor = FALSE diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index ebf8935cd8c24..edc885eda86dd 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -102,7 +102,8 @@ atom/movable/virtualspeaker/speaker, // representation of the method's speaker datum/language/language, // the langauge of the message message, // the text content of the message - spans // the list of spans applied to the message + spans, // the list of spans applied to the message + list/message_mods // the list of modification applied to the message. Whispering ect ) src.source = source src.frequency = frequency @@ -115,10 +116,11 @@ "message" = message, "compression" = rand(35, 65), "language" = lang_instance.name, - "spans" = spans + "spans" = spans, + "mods" = message_mods ) var/turf/T = get_turf(source) - levels = list(T.z) + levels = list(T.get_virtual_z_level()) /datum/signal/subspace/vocal/copy() var/datum/signal/subspace/vocal/copy = new(source, frequency, virt, language) @@ -151,7 +153,7 @@ // Syndicate radios can hear all well-known radio channels if (num2text(frequency) in GLOB.reverseradiochannels) for(var/obj/item/radio/R in GLOB.all_radios["[FREQ_SYNDICATE]"]) - if(R.can_receive(FREQ_SYNDICATE, list(R.z))) + if(R.can_receive(FREQ_SYNDICATE, list(R.get_virtual_z_level()))) radios |= R if (TRANSMISSION_RADIO) @@ -182,9 +184,17 @@ // Render the message and have everybody hear it. // Always call this on the virtualspeaker to avoid issues. var/spans = data["spans"] + var/list/message_mods = data["mods"] var/rendered = virt.compose_message(virt, language, message, frequency, spans) + var/list/show_overhead_message_to = list() for(var/atom/movable/hearer in receive) - hearer.Hear(rendered, virt, language, message, frequency, spans) + if(ismob(hearer)) + var/mob/M = hearer + if(M.should_show_chat_message(virt, language, FALSE, is_heard = TRUE)) + show_overhead_message_to += M + hearer.Hear(rendered, virt, language, message, frequency, spans, message_mods) + if(length(show_overhead_message_to)) + create_chat_message(virt, language, show_overhead_message_to, message, spans, message_mods) // This following recording is intended for research and feedback in the use of department radio channels if(length(receive)) diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm index 6b7dbe527a2ab..d4e9eefc58e78 100644 --- a/code/game/machinery/telecomms/computers/logbrowser.dm +++ b/code/game/machinery/telecomms/computers/logbrowser.dm @@ -196,7 +196,7 @@ var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - if(newnet && ((usr in range(1, src)) || issilicon(usr))) + if(newnet && (get_dist(usr, src) <= 1 || issilicon(usr))) if(length(newnet) > 15) temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm index aebef711a9986..6a71acaa48f10 100644 --- a/code/game/machinery/telecomms/computers/telemonitor.dm +++ b/code/game/machinery/telecomms/computers/telemonitor.dm @@ -108,7 +108,7 @@ 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)) || issilicon(usr))) + if(newnet && (get_dist(usr, src) <= 1 || issilicon(usr))) if(length(newnet) > 15) temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 569b6ef534ac7..65e26d450b32f 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -7,6 +7,7 @@ /obj/machinery/telecomms var/temp = "" // output message + var/tempfreq = FREQ_COMMON /obj/machinery/telecomms/attackby(obj/item/P, mob/user, params) @@ -27,74 +28,185 @@ else return ..() -/obj/machinery/telecomms/ui_interact(mob/user) - . = ..() - // You need a multitool to use this, or be silicon - if(!issilicon(user)) - // istype returns false if the value is null - if(!istype(user.get_active_held_item(), /obj/item/multitool)) - return - 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" - - //Show additional options for certain machines. - dat += Options_Menu() - - dat += "
      Linked Network Entities:
        " - - 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 += "
      " - - dat += "
      Filtering Frequencies: " - - 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/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Telecomms") + ui.open() + +/obj/machinery/telecomms/ui_data(mob/user) + var/list/data = list() + + data += add_option() + + data["minfreq"] = MIN_FREE_FREQ + data["maxfreq"] = MAX_FREE_FREQ + data["frequency"] = tempfreq + + var/obj/item/multitool/heldmultitool = get_multitool(user) + data["multitool"] = heldmultitool + + if(heldmultitool) + data["multibuff"] = heldmultitool.buffer + + data["toggled"] = toggled + data["id"] = id + data["network"] = network + data["prefab"] = autolinkers.len ? TRUE : FALSE + + var/list/linked = list() + var/i = 0 + data["linked"] = list() + for(var/obj/machinery/telecomms/machine in links) + if(machine.hide && !hide) + continue + i++ //Original was above the check if machine is hidden, index revealed there are more machines + var/list/entry = list() + entry["index"] = i + entry["name"] = machine.name + entry["id"] = machine.id + linked += list(entry) + data["linked"] = linked + + var/list/frequencies = list() + data["frequencies"] = list() + for(var/x in freq_listening) + frequencies += list(x) + data["frequencies"] = frequencies + + return data + +/obj/machinery/telecomms/ui_act(action, params) + if(..()) + return - dat += "
      \[Add Filter\]" - dat += "
      " + if(!issilicon(usr) && !istype(usr.get_active_held_item(), /obj/item/multitool)) + return - if(P) - var/obj/machinery/telecomms/T = P.buffer - if(istype(T)) - dat += "

      MULTITOOL BUFFER: [T] ([T.id]) \[Link\] \[Flush\]" + var/obj/item/multitool/heldmultitool = get_multitool(usr) + + switch(action) + if("toggle") + toggled = !toggled + update_power() + update_icon_state() + log_game("[key_name(usr)] toggled [toggled ? "On" : "Off"] [src] at [AREACOORD(src)].") + . = TRUE + if("id") + if(params["value"]) + if(length(params["value"]) > 32) + to_chat(usr, "Error: Machine ID too long!") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + return + else + id = params["value"] + log_game("[key_name(usr)] has changed the ID for [src] at [AREACOORD(src)] to [id].") + . = TRUE + if("network") + if(params["value"]) + if(length(params["value"]) > 15) + to_chat(usr, "Error: Network name too long!") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + return + else + for(var/obj/machinery/telecomms/T in links) + T.links.Remove(src) + T.ui_update() + network = params["value"] + links = list() + log_game("[key_name(usr)] has changed the network for [src] at [AREACOORD(src)] to [network].") + . = TRUE + if("tempfreq") + if(params["value"]) + tempfreq = text2num(params["value"]) * 10 + . = TRUE + if("freq") + var/newfreq = tempfreq //* 10 was in original pr here but makes out of tempfreq something like 14590 + if(newfreq == FREQ_SYNDICATE) + to_chat(usr, "Error: Interference preventing filtering frequency: \"[newfreq / 10] GHz\"") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) else - dat += "

      MULTITOOL BUFFER:
      \[Add Machine\]" + if(!(newfreq in freq_listening) && newfreq < 10000) + freq_listening.Add(newfreq) + log_game("[key_name(usr)] added frequency [newfreq] for [src] at [AREACOORD(src)].") + . = TRUE + if("delete") + freq_listening.Remove(params["value"]) + log_game("[key_name(usr)] removed frequency [params["value"]] for [src] at [AREACOORD(src)].") + . = TRUE + if("unlink") + var/obj/machinery/telecomms/T = links[text2num(params["value"])] + if(T) + // Remove link entries from both T and src. + if(T.links) + T.links.Remove(src) + T.ui_update() + links.Remove(T) + log_game("[key_name(usr)] unlinked [src] and [T] at [AREACOORD(src)].") + . = TRUE + if("link") + if(heldmultitool) + var/obj/machinery/telecomms/T = heldmultitool.buffer + if(istype(T) && T != src) + if(!(src in T.links)) + T.links += src + T.ui_update() + if(!(T in links)) + links += T + log_game("[key_name(usr)] linked [src] for [T] at [AREACOORD(src)].") + . = TRUE + if("buffer") + heldmultitool.buffer = src + . = TRUE + if("flush") + heldmultitool.buffer = null + . = TRUE + + if(add_act(action, params)) + . = TRUE + +/obj/machinery/telecomms/proc/add_option() + return - dat += "
      " - temp = "" - user << browse(dat, "window=tcommachine;size=520x500;can_resize=0") - onclose(user, "tcommachine") - return TRUE +/obj/machinery/telecomms/bus/add_option() + var/list/data = list() + data["type"] = "bus" + data["changefrequency"] = change_frequency + return data + +/obj/machinery/telecomms/relay/add_option() + var/list/data = list() + data["type"] = "relay" + data["broadcasting"] = broadcasting + data["receiving"] = receiving + return data + +/obj/machinery/telecomms/proc/add_act(action, params) + +/obj/machinery/telecomms/relay/add_act(action, params) + switch(action) + if("broadcast") + broadcasting = !broadcasting + . = TRUE + if("receive") + receiving = !receiving + . = TRUE + +/obj/machinery/telecomms/bus/add_act(action, params) + switch(action) + if("change_freq") + var/newfreq = text2num(params["value"]) * 10 + if(newfreq) + if(newfreq < 10000) + change_frequency = newfreq + . = TRUE + else + change_frequency = 0 + . = TRUE // 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(!issilicon(user) && istype(user.get_active_held_item(), /obj/item/multitool)) @@ -107,168 +219,6 @@ 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(!issilicon(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(issilicon(user) || in_range(user, src)) return TRUE diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm index 8c69183fd28e6..51c13c9ad3dc8 100644 --- a/code/game/machinery/telecomms/machines/allinone.dm +++ b/code/game/machinery/telecomms/machines/allinone.dm @@ -26,7 +26,7 @@ return if(!on || !is_freq_listening(signal)) // has to be on to receive messages return - if (!intercept && !(z in signal.levels) && !(0 in signal.levels)) // has to be syndicate or on the right level + if (!intercept && !(get_virtual_z_level() in signal.levels) && !(0 in signal.levels)) // has to be syndicate or on the right level return // Decompress the signal and mark it done @@ -42,3 +42,10 @@ /obj/machinery/telecomms/allinone/attackby(obj/item/P, mob/user, params) if(P.tool_behaviour == TOOL_MULTITOOL) return attack_hand(user) + +/obj/machinery/telecomms/allinone/exploration + name = "exploration mainframe" + use_power = IDLE_POWER_USE + idle_power_usage = 50 + freq_listening = list(FREQ_EXPLORATION) + autolinkers = list("exp_relay") diff --git a/code/game/machinery/telecomms/machines/broadcaster.dm b/code/game/machinery/telecomms/machines/broadcaster.dm index 0abe97c72e7d5..3649ef47ccaaf 100644 --- a/code/game/machinery/telecomms/machines/broadcaster.dm +++ b/code/game/machinery/telecomms/machines/broadcaster.dm @@ -34,7 +34,7 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages var/turf/T = get_turf(src) if (T) - signal.levels |= T.z + signal.levels |= T.get_virtual_z_level() var/signal_message = "[signal.frequency]:[signal.data["message"]]:[signal.data["name"]]" if(signal_message in GLOB.recentmessages) @@ -81,3 +81,8 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages /obj/machinery/telecomms/broadcaster/preset_left/birdstation name = "Broadcaster" + +/obj/machinery/telecomms/broadcaster/preset_exploration + id = "Exploration Broadcaster" + network = "exploration" + autolinkers = list("broadcasterExp") diff --git a/code/game/machinery/telecomms/machines/bus.dm b/code/game/machinery/telecomms/machines/bus.dm index 9b73692b62658..1ca870912702a 100644 --- a/code/game/machinery/telecomms/machines/bus.dm +++ b/code/game/machinery/telecomms/machines/bus.dm @@ -80,3 +80,9 @@ name = "Bus" autolinkers = list("processor1", "common", "messaging") freq_listening = list() + +/obj/machinery/telecomms/bus/preset_exploration + id = "Exploration Bus" + network = "exploration" + freq_listening = list(FREQ_EXPLORATION) + autolinkers = list("processorExp", "exploration") diff --git a/code/game/machinery/telecomms/machines/hub.dm b/code/game/machinery/telecomms/machines/hub.dm index dedf7c7f3a773..aabe884af0866 100644 --- a/code/game/machinery/telecomms/machines/hub.dm +++ b/code/game/machinery/telecomms/machines/hub.dm @@ -41,3 +41,7 @@ "supply", "service", "common", "command", "engineering", "security", "receiverA", "receiverB", "broadcasterA", "broadcasterB", "autorelay", "messaging") +/obj/machinery/telecomms/hub/preset/exploration + id = "Exploration Hub" + network = "exploration" + autolinkers = list("exp_relay", "exploration", "receiverExp", "broadcasterExp") diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index 2610b84d3fc8b..5225aaacc808d 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -5,7 +5,7 @@ require the message server. */ -// A decorational representation of SSblackbox, usually placed alongside the message server. +// A decorational representation of SSblackbox, usually placed alongside the message server. Also contains a traitor theft item. /obj/machinery/blackbox_recorder icon = 'icons/obj/stationobjs.dmi' icon_state = "blackbox" @@ -14,8 +14,56 @@ use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 100 - armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70) + armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70, "stamina" = 0) + var/obj/item/stored +/obj/machinery/blackbox_recorder/Initialize() + . = ..() + stored = new /obj/item/blackbox(src) + +/obj/machinery/blackbox_recorder/attack_hand(mob/living/user) + . = ..() + if(stored) + user.put_in_hands(stored) + stored = null + to_chat(user, "You remove the blackbox from [src]. The tapes stop spinning.") + update_icon() + else + to_chat(user, "It seems that the blackbox is missing...") + +/obj/machinery/blackbox_recorder/attackby(obj/item/I, mob/living/user, params) + . = ..() + if(istype(I, /obj/item/blackbox)) + if(HAS_TRAIT(I, TRAIT_NODROP) || !user.transferItemToLoc(I, src)) + to_chat(user, "[I] is stuck to your hand!") + return + user.visible_message("[user] clicks [I] into [src]!", \ + "You press the device into [src], and it clicks into place. The tapes begin spinning again.") + playsound(src, 'sound/machines/click.ogg', 50, TRUE) + stored = I + update_icon() + +/obj/machinery/blackbox_recorder/Destroy() + if(stored) + stored.forceMove(loc) + new /obj/effect/decal/cleanable/oil(loc) + return ..() + +/obj/machinery/blackbox_recorder/update_icon_state() + if(stored) + icon_state = "blackbox" + else + icon_state = "blackbox_b" + +/obj/item/blackbox + name = "the blackbox" + desc = "A strange relic, capable of recording data on extradimensional vertices. It lives inside the blackbox recorder for safe keeping." + icon = 'icons/obj/stationobjs.dmi' + icon_state = "blackcube" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + w_class = WEIGHT_CLASS_BULKY + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF #define MESSAGE_SERVER_FUNCTIONING_MESSAGE "This is an automated message. The messaging system is functioning correctly." @@ -110,7 +158,7 @@ source = init_source data = init_data var/turf/T = get_turf(source) - levels = list(T.z) + levels = list(T.get_virtual_z_level()) if(!("reject" in data)) data["reject"] = TRUE diff --git a/code/game/machinery/telecomms/machines/processor.dm b/code/game/machinery/telecomms/machines/processor.dm index 2362273469a01..29871a76c1b0a 100644 --- a/code/game/machinery/telecomms/machines/processor.dm +++ b/code/game/machinery/telecomms/machines/processor.dm @@ -55,3 +55,8 @@ /obj/machinery/telecomms/processor/preset_one/birdstation name = "Processor" + +/obj/machinery/telecomms/processor/preset_exploration + id = "Exploration Processor" + network = "exploration" + autolinkers = list("processorExp") diff --git a/code/game/machinery/telecomms/machines/receiver.dm b/code/game/machinery/telecomms/machines/receiver.dm index af1dc0820d915..89b016e68acac 100644 --- a/code/game/machinery/telecomms/machines/receiver.dm +++ b/code/game/machinery/telecomms/machines/receiver.dm @@ -28,12 +28,12 @@ relay_information(signal, /obj/machinery/telecomms/bus) /obj/machinery/telecomms/receiver/proc/check_receive_level(datum/signal/subspace/signal) - if (z in signal.levels) + if (get_virtual_z_level() in signal.levels) return TRUE for(var/obj/machinery/telecomms/hub/H in links) for(var/obj/machinery/telecomms/relay/R in H.links) - if(R.can_receive(signal) && (R.z in signal.levels)) + if(R.can_receive(signal) && (R.get_virtual_z_level() in signal.levels)) return TRUE return FALSE @@ -67,49 +67,8 @@ name = "Receiver" freq_listening = list() -//Code for the interceptor circuit -/obj/machinery/telecomms/receiver/Options_Menu() - var/dat = "
      Remote control: [GLOB.remote_control ? "ENABLED" : "DISABLED"]" - dat += "
      Broadcasting signals: " - for(var/i in GLOB.ic_speakers) - var/obj/item/integrated_circuit/I = i - var/obj/item/O = I.get_object() - if(get_area(O)) //if it isn't in nullspace, can happen due to printer newing all possible circuits to fetch list data - dat += "
      [O.name] = [O.x], [O.y], [O.z], [get_area(O)]" - dat += "

      Circuit jammer signals: " - for(var/i in GLOB.ic_jammers) - var/obj/item/integrated_circuit/I = i - var/obj/item/O = I.get_object() - if(get_area(O)) //if it isn't in nullspace, can happen due to printer newing all possible circuits to fetch list data - dat += "
      [O.name] = [O.x], [O.y], [O.z], [get_area(O)]" - return dat - -/obj/machinery/telecomms/receiver/Options_Topic(href, href_list) - if(href_list["toggle_remote_control"]) - GLOB.remote_control = !GLOB.remote_control - -/obj/machinery/telecomms/receiver/receive_signal(datum/signal/signal) - if(LAZYLEN(GLOB.ic_jammers) && GLOB.remote_control) - for(var/i in GLOB.ic_jammers) - var/obj/item/integrated_circuit/input/tcomm_interceptor/T = i - var/obj/item/O = T.get_object() - if(is_station_level(O.z)&& (!istype(get_area(O), /area/space))) - if(!istype(signal.source, /obj/item/radio/headset/integrated)) - signal.data["reject"] = TRUE - break - ..() - -//makeshift receiver used for the circuit, so that we don't -//have to edit radio.dm and other shit -/obj/machinery/telecomms/receiver/circuit - idle_power_usage = 0 - var/obj/item/integrated_circuit/input/tcomm_interceptor/holder - -/obj/machinery/telecomms/receiver/circuit/receive_signal(datum/signal/signal) - if(!holder.get_pin_data(IC_INPUT, 1)) - return - if(!signal) - return - holder.receive_signal(signal) - -// End +/obj/machinery/telecomms/receiver/preset_exploration + id = "Exploration Receiver" + network = "exploration" + autolinkers = list("receiverExp") // link to relay + freq_listening = list(FREQ_EXPLORATION) diff --git a/code/game/machinery/telecomms/machines/relay.dm b/code/game/machinery/telecomms/machines/relay.dm index 8455fe0bfc173..5a6e3be9a85a3 100644 --- a/code/game/machinery/telecomms/machines/relay.dm +++ b/code/game/machinery/telecomms/machines/relay.dm @@ -23,7 +23,7 @@ // Add our level and send it back var/turf/T = get_turf(src) if(can_send(signal) && T) - signal.levels |= T.z + signal.levels |= T.get_virtual_z_level() // Checks to see if it can send/receive. @@ -78,9 +78,13 @@ autolinkers = list("h_relay") icon = 'icons/obj/clockwork_objects.dmi' icon_state = "relay" - broadcasting = FALSE //It only recieves + broadcasting = FALSE //It only receives //Generic preset relay /obj/machinery/telecomms/relay/preset/auto hide = TRUE autolinkers = list("autorelay") + +/obj/machinery/telecomms/relay/preset/exploration + id = "Exploration Relay" + autolinkers = list("exp_relay") diff --git a/code/game/machinery/telecomms/machines/server.dm b/code/game/machinery/telecomms/machines/server.dm index a42b945fe4e14..0a07472a3c954 100644 --- a/code/game/machinery/telecomms/machines/server.dm +++ b/code/game/machinery/telecomms/machines/server.dm @@ -88,6 +88,12 @@ freq_listening = list(FREQ_SUPPLY) autolinkers = list("supply") +/obj/machinery/telecomms/server/presets/exploration + id = "Exploration Server" + network = "exploration" + freq_listening = list(FREQ_EXPLORATION) + autolinkers = list("exploration") + /obj/machinery/telecomms/server/presets/service id = "Service Server" freq_listening = list(FREQ_SERVICE) diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 537873de60d08..d0eff31d5512c 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -20,7 +20,7 @@ GLOBAL_LIST_EMPTY(telecomms_list) light_color = LIGHT_COLOR_CYAN var/list/links = list() // list of machines this machine is linked to var/traffic = 0 // value increases as traffic increases - var/netspeed = 5 // how much traffic to lose per tick (50 gigabytes/second * netspeed) + var/netspeed = 2.5 // how much traffic to lose per second (50 gigabytes/second * netspeed) var/list/autolinkers = list() // list of text/number values to link with var/id = "NULL" // identification string var/network = "NULL" // the network of the machinery @@ -53,7 +53,7 @@ GLOBAL_LIST_EMPTY(telecomms_list) continue if(amount && send_count >= amount) break - if(z != machine.loc.z && !long_range_link && !machine.long_range_link) + if(get_virtual_z_level() != machine.loc.get_virtual_z_level() && !long_range_link && !machine.long_range_link) continue send_count++ @@ -105,7 +105,7 @@ GLOBAL_LIST_EMPTY(telecomms_list) var/turf/T_position = get_turf(T) var/same_zlevel = FALSE if(position && T_position) //Stops a bug with a phantom telecommunications interceptor which is spawned by circuits caching their components into nullspace - if(position.z == T_position.z) + if(position.get_virtual_z_level() == T_position.get_virtual_z_level()) same_zlevel = TRUE if(same_zlevel || (long_range_link && T.long_range_link)) if(src != T) @@ -128,25 +128,29 @@ GLOBAL_LIST_EMPTY(telecomms_list) icon_state = "[initial(icon_state)]_off" /obj/machinery/telecomms/proc/update_power() + var/newState = on if(toggled) if(stat & (BROKEN|NOPOWER|EMPED)) // if powered, on. if not powered, off. if too damaged, off - on = FALSE + newState = FALSE else - on = TRUE + newState = TRUE else - on = FALSE + newState = FALSE - set_light(on) + if(newState != on) + on = newState + ui_update() + set_light(on) -/obj/machinery/telecomms/process() +/obj/machinery/telecomms/process(delta_time) update_power() // Update the icon update_icon() if(traffic > 0) - traffic -= netspeed + traffic -= netspeed * delta_time /obj/machinery/telecomms/emp_act(severity) . = ..() diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index cd1b28a8c7ebe..348578efec1d5 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -9,7 +9,7 @@ icon_state = "tele0" use_power = IDLE_POWER_USE idle_power_usage = 10 - active_power_usage = 2000 + active_power_usage = 3000 circuit = /obj/item/circuitboard/machine/teleporter_hub var/accuracy = 0 var/obj/machinery/teleport/station/power_station @@ -21,6 +21,8 @@ /obj/machinery/teleport/hub/Destroy() if (power_station) + if(power_station.teleporter_console) + power_station.teleporter_console.ui_update() power_station.teleporter_hub = null power_station = null return ..() @@ -34,7 +36,7 @@ /obj/machinery/teleport/hub/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Probability of malfunction decreased by [(accuracy*25)-25]%." + . += "The status display reads: Probability of malfunction decreased by [(accuracy-1)*100/3]%." /obj/machinery/teleport/hub/proc/link_power_station() if(power_station) @@ -66,22 +68,25 @@ var/obj/machinery/computer/teleporter/com = power_station.teleporter_console if (QDELETED(com)) return - if (QDELETED(com.target)) - com.target = null + var/atom/target + if(com.target_ref) + target = com.target_ref.resolve() + if (!target) + com.target_ref = null visible_message("Cannot authenticate locked on coordinates. Please reinstate coordinate matrix.") return if (ismovableatom(M)) - if(do_teleport(M, com.target, channel = TELEPORT_CHANNEL_BLUESPACE)) - use_power(5000) - if(!calibrated && prob(30 - ((accuracy) * 10))) //oh dear a problem - log_game("[M] ([key_name(M)]) was turned into a fly person") + if(do_teleport(M, target, channel = TELEPORT_CHANNEL_BLUESPACE)) + use_power(7500) + if(!calibrated && prob(40 - ((accuracy) * 10))) //oh dear a problem if(ishuman(M))//don't remove people from the round randomly you jerks var/mob/living/carbon/human/human = M - if(human.dna && human.dna.species.id == "human") + if(human.dna && !isflyperson(human) && !HAS_TRAIT(M, TRAIT_RADIMMUNE)) + log_game("[M] ([key_name(M)]) was turned into a fly person") to_chat(M, "You hear a buzzing in your ears.") human.set_species(/datum/species/fly) - human.apply_effect((rand(120 - accuracy * 40, 180 - accuracy * 60)), EFFECT_IRRADIATE, 0) + human.apply_effect((rand(160 - accuracy * 40, 240 - accuracy * 60)), EFFECT_IRRADIATE, 0) calibrated = 0 return @@ -137,7 +142,7 @@ else . += "The linking device is now able to be scanned with a multitool.
      The wiring can be connected to a nearby console and hub with a pair of wirecutters.
      " if(in_range(user, src) || isobserver(user)) - . += "The status display reads: This station can be linked to [efficiency] other station(s)." + . += "The status display reads: This station can be linked to [efficiency] other station(s)." /obj/machinery/teleport/station/proc/link_console_and_hub() for(var/direction in GLOB.cardinals) @@ -149,6 +154,7 @@ teleporter_console = locate(/obj/machinery/computer/teleporter, get_step(src, direction)) if(teleporter_console) teleporter_console.link_power_station() + teleporter_console.ui_update() break return teleporter_hub && teleporter_console @@ -159,6 +165,7 @@ teleporter_hub.update_icon() teleporter_hub = null if (teleporter_console) + teleporter_console.ui_update() teleporter_console.power_station = null teleporter_console = null return ..() @@ -201,7 +208,7 @@ /obj/machinery/teleport/station/proc/toggle(mob/user) if(stat & (BROKEN|NOPOWER) || !teleporter_hub || !teleporter_console ) return - if (teleporter_console.target) + if (teleporter_console.target_ref.resolve()) if(teleporter_hub.panel_open || teleporter_hub.stat & (BROKEN|NOPOWER)) to_chat(user, "The teleporter hub isn't responding.") else @@ -209,6 +216,7 @@ use_power(5000) to_chat(user, "Teleporter [engaged ? "" : "dis"]engaged!") else + teleporter_console.target_ref = null to_chat(user, "No target detected.") engaged = FALSE teleporter_hub.update_icon() diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 271295beae8e6..8f12e38a2749b 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -103,12 +103,12 @@ if(masterAI) R.connected_ai = masterAI R.lawsync() - R.lawupdate = 1 + R.lawupdate = TRUE addtimer(CALLBACK(src, .proc/unlock_new_robot, R), 50) /obj/machinery/transformer/proc/unlock_new_robot(mob/living/silicon/robot/R) playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) sleep(30) if(R) - R.SetLockdown(0) + R.SetLockdown(FALSE) R.notify_ai(NEW_BORG) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 21eaf8bf7a9b3..e5891184ced0a 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -39,24 +39,26 @@ START_PROCESSING(SSfastprocess, src) -/obj/machinery/washing_machine/process() +/obj/machinery/washing_machine/process(delta_time) if(!busy) animate(src, transform=matrix(), time=2) return PROCESS_KILL if(anchored) - if(prob(5)) + if(DT_PROB(2.5, delta_time)) var/matrix/M = new M.Translate(rand(-1, 1), rand(0, 1)) animate(src, transform=M, time=1) animate(transform=matrix(), time=1) else - if(prob(1)) + if(DT_PROB(0.5, delta_time)) step(src, pick(GLOB.cardinals)) var/matrix/M = new M.Translate(rand(-3, 3), rand(-1, 3)) animate(src, transform=M, time=2) /obj/machinery/washing_machine/proc/clean_blood() + SIGNAL_HANDLER + if(!busy) bloody_mess = FALSE update_icon() @@ -302,7 +304,8 @@ update_icon() /obj/machinery/washing_machine/deconstruct(disassembled = TRUE) - new /obj/item/stack/sheet/iron(drop_location(), 2) + if (!(flags_1 & NODECONSTRUCT_1)) + new /obj/item/stack/sheet/iron(drop_location(), 2) qdel(src) /obj/machinery/washing_machine/open_machine(drop = 1) diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index 3dcfd8e82f31f..681beff818652 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -2,11 +2,11 @@ force = 30 internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) internal_damage_threshold = 50 - armor = list("melee" = 30, "bullet" = 30, "laser" = 15, "energy" = 20, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list("melee" = 30, "bullet" = 30, "laser" = 15, "energy" = 20, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "stamina" = 0) mouse_pointer = 'icons/mecha/mecha_mouse.dmi' destruction_sleep_duration = 40 exit_delay = 40 /obj/mecha/combat/restore_equipment() mouse_pointer = 'icons/mecha/mecha_mouse.dmi' - . = ..() \ No newline at end of file + . = ..() diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index d814955ff4459..b4a241a400507 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -6,7 +6,7 @@ dir_in = 1 //Facing North. max_integrity = 400 deflect_chance = 20 - armor = list("melee" = 40, "bullet" = 35, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 35, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 50, "fire" = 100, "acid" = 100, "stamina" = 0) max_temperature = 30000 infra_luminosity = 8 force = 40 @@ -56,6 +56,8 @@ ///Relays the signal from the action button to the shield, and creates a new shield if the old one is MIA. /obj/mecha/combat/durand/proc/relay(datum/source, list/signal_args) + SIGNAL_HANDLER + if(!shield) //if the shield somehow got deleted shield = new/obj/durand_shield shield.chassis = src @@ -66,6 +68,8 @@ //Redirects projectiles to the shield if defense_check decides they should be blocked and returns true. /obj/mecha/combat/durand/proc/prehit(obj/item/projectile/source, list/signal_args) + SIGNAL_HANDLER + if(defense_check(source.loc) && shield) signal_args[2] = shield @@ -91,7 +95,7 @@ Expects a turf. Returns true if the attack should be blocked, false if not.*/ . = TRUE return -obj/mecha/combat/durand/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) +/obj/mecha/combat/durand/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) if(defense_check(user.loc)) log_message("Attack absorbed by defense field. Attacker - [user].", LOG_MECHA, color="orange") shield.attack_generic(user, damage_amount, damage_type, damage_flag, sound_effect, armor_penetration) @@ -156,18 +160,20 @@ and relayed by the mech itself. The "forced" variabe, signal_args[1], will skip the shield is disabled by means other than the action button (like running out of power)*/ /obj/durand_shield/proc/activate(datum/source, var/datum/action/innate/mecha/mech_defense_mode/button, list/signal_args) + SIGNAL_HANDLER + if(!chassis || !chassis.occupant) return if(switching && !signal_args[1]) return if(!chassis.defense_mode && (!chassis.cell || chassis.cell.charge < 100)) //If it's off, and we have less than 100 units of power - chassis.occupant_message("Insufficient power; cannot activate defense mode.") + chassis.balloon_alert(chassis.occupant, "Insufficient power") return switching = TRUE chassis.defense_mode = !chassis.defense_mode chassis.defense_action.button_icon_state = "mech_defense_mode_[chassis.defense_mode ? "on" : "off"]" //This is backwards because we haven't changed the var yet if(!signal_args[1]) - chassis.occupant_message("Defense mode [chassis.defense_mode?"enabled":"disabled"].") + chassis.balloon_alert(chassis.occupant, "Shield [chassis.defense_mode?"enabled":"disabled"]") chassis.log_message("User has toggled defense mode -- now [chassis.defense_mode?"enabled":"disabled"].", LOG_MECHA) else chassis.log_message("defense mode state changed -- now [chassis.defense_mode?"enabled":"disabled"].", LOG_MECHA) @@ -178,12 +184,10 @@ the shield is disabled by means other than the action button (like running out o flick("shield_raise", src) playsound(src, 'sound/mecha/mech_shield_raise.ogg', 50, FALSE) set_light(l_range = MINIMUM_USEFUL_LIGHT_RANGE , l_power = 5, l_color = "#00FFFF") - sleep(3) icon_state = "shield" else flick("shield_drop", src) playsound(src, 'sound/mecha/mech_shield_drop.ogg', 50, FALSE) - sleep(5) set_light(0) icon_state = "shield_null" invisibility = INVISIBILITY_MAXIMUM //no showing on right-click diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 7a2feb3a2e96a..8db19540b71e0 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -6,7 +6,7 @@ dir_in = 1 //Facing North. max_integrity = 250 deflect_chance = 5 - armor = list("melee" = 25, "bullet" = 20, "laser" = 30, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list("melee" = 25, "bullet" = 20, "laser" = 30, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "stamina" = 0) max_temperature = 25000 leg_overload_coeff = 80 infra_luminosity = 6 @@ -22,7 +22,7 @@ icon_state = "darkgygax" max_integrity = 300 deflect_chance = 15 - armor = list("melee" = 40, "bullet" = 40, "laser" = 50, "energy" = 35, "bomb" = 20, "bio" = 0, "rad" =20, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 40, "laser" = 50, "energy" = 35, "bomb" = 20, "bio" = 0, "rad" =20, "fire" = 100, "acid" = 100, "stamina" = 0) max_temperature = 35000 leg_overload_coeff = 70 operation_req_access = list(ACCESS_SYNDICATE) diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm index 1cfdfbfa51bdd..e2bbe8b2ce8a1 100644 --- a/code/game/mecha/combat/honker.dm +++ b/code/game/mecha/combat/honker.dm @@ -6,7 +6,7 @@ max_integrity = 140 deflect_chance = 60 internal_damage_threshold = 60 - armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "stamina" = 0) max_temperature = 25000 infra_luminosity = 5 operation_req_access = list(ACCESS_THEATRE) @@ -29,7 +29,7 @@ [internal_damage&MECHA_INT_TANK_BREACH?"GAS TANK HONK
      ":null] [internal_damage&MECHA_INT_CONTROL_LOST?"HONK-A-DOODLE - Recalibrate
      ":null] IntegriHONK: [integrity]%
      - PowerHONK charge: [isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]
      + PowerHONK charge: [isnull(cell_charge)?"No power cell installed":"[cell.percent()]%"]
      Air source: [use_internal_tank?"Internal Airtank":"Environment"]
      AirHONK pressure: [tank_pressure]kPa
      AirHONK temperature: [tank_temperature]°K|[tank_temperature - T0C]°C
      diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 5b7998ba459d7..963f042af00a3 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -5,7 +5,7 @@ step_in = 5 max_integrity = 500 deflect_chance = 25 - armor = list("melee" = 50, "bullet" = 55, "laser" = 40, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 60, "fire" = 100, "acid" = 100) + armor = list("melee" = 50, "bullet" = 55, "laser" = 40, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 60, "fire" = 100, "acid" = 100, "stamina" = 0) max_temperature = 60000 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF infra_luminosity = 3 diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 95b60eba68d80..10c9e3f894d66 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -7,7 +7,7 @@ step_energy_drain = 3 max_integrity = 200 deflect_chance = 30 - armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 50, "fire" = 100, "acid" = 100, "stamina" = 0) max_temperature = 25000 infra_luminosity = 3 wreckage = /obj/structure/mecha_wreckage/phazon diff --git a/code/game/mecha/combat/reticence.dm b/code/game/mecha/combat/reticence.dm index d1beff7265bef..00c320b220a18 100644 --- a/code/game/mecha/combat/reticence.dm +++ b/code/game/mecha/combat/reticence.dm @@ -6,7 +6,7 @@ dir_in = 1 //Facing North. max_integrity = 100 deflect_chance = 3 - armor = list("melee" = 25, "bullet" = 20, "laser" = 30, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list("melee" = 25, "bullet" = 20, "laser" = 30, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "stamina" = 0) max_temperature = 15000 wreckage = /obj/structure/mecha_wreckage/reticence operation_req_access = list(ACCESS_THEATRE) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 2b3b9e3ef8fd8..0012ed451c08c 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -13,6 +13,8 @@ var/obj/mecha/chassis = null ///Bitflag. Determines the range of the equipment. var/range = MECHA_MELEE + /// Bitflag. Used by exosuit fabricator to assign sub-categories based on which exosuits can equip this. + var/mech_flags = NONE var/salvageable = 1 var/detachable = TRUE // Set to FALSE for built-in equipment that cannot be removed var/selectable = 1 // Set to 0 for passive equipment such as mining scanner or armor plates @@ -46,14 +48,16 @@ return ..() /obj/item/mecha_parts/mecha_equipment/try_attach_part(mob/user, obj/mecha/M) - if(can_attach(M)) - if(!user.temporarilyRemoveItemFromInventory(src)) - return FALSE - attach(M) - user.visible_message("[user] attaches [src] to [M].", "You attach [src] to [M].") - return TRUE - to_chat(user, "You are unable to attach [src] to [M]!") - return FALSE + if(!do_mob(user, M, 15)) + return FALSE + if(!can_attach(M)) + to_chat(user, "You are unable to attach [src] to [M]!") + return FALSE + if(!user.temporarilyRemoveItemFromInventory(src)) + return FALSE + attach(M) + user.visible_message("[user] attaches [src] to [M].", "You attach [src] to [M].") + return TRUE /obj/item/mecha_parts/mecha_equipment/proc/get_equip_info() if(!chassis) diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 9913407d42aa6..2c8a202a8de67 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -1,6 +1,7 @@ // Sleeper, Medical Beam, and Syringe gun /obj/item/mecha_parts/mecha_equipment/medical + mech_flags = EXOSUIT_MODULE_MEDICAL /obj/item/mecha_parts/mecha_equipment/medical/Initialize() . = ..() diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index d99032076a302..0f14d84b274c2 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -17,6 +17,7 @@ toolspeed = 0.9 var/drill_delay = 7 var/drill_level = DRILL_BASIC + mech_flags = EXOSUIT_MODULE_RIPLEY | EXOSUIT_MODULE_COMBAT /obj/item/mecha_parts/mecha_equipment/drill/Initialize() . = ..() @@ -73,14 +74,16 @@ drill.occupant_message("[src] is too durable to drill through.") /turf/closed/mineral/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) - for(var/turf/closed/mineral/M in range(drill.chassis,1)) + var/turf/T = get_turf(drill.chassis) + for(var/turf/closed/mineral/M in RANGE_TURFS(1, T)) if(get_dir(drill.chassis,M)&drill.chassis.dir) M.gets_drilled() drill.log_message("Drilled through [src]", LOG_MECHA) drill.move_ores() /turf/open/floor/plating/asteroid/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) - for(var/turf/open/floor/plating/asteroid/M in range(1, drill.chassis)) + var/turf/T = get_turf(drill.chassis) + for(var/turf/open/floor/plating/asteroid/M in RANGE_TURFS(1, T)) if((get_dir(drill.chassis,M)&drill.chassis.dir) && !M.dug) M.getDug() drill.log_message("Drilled through [src]", LOG_MECHA) @@ -148,16 +151,20 @@ /obj/item/mecha_parts/mecha_equipment/mining_scanner name = "exosuit mining scanner" - desc = "Equipment for engineering and combat exosuits. It will automatically check surrounding rock for useful minerals." + desc = "Equipment for working exosuits. It will automatically check surrounding rock for useful minerals." icon_state = "mecha_analyzer" selectable = 0 equip_cooldown = 15 var/scanning_time = 0 + mech_flags = EXOSUIT_MODULE_RIPLEY /obj/item/mecha_parts/mecha_equipment/mining_scanner/Initialize() . = ..() START_PROCESSING(SSfastprocess, src) +/obj/item/mecha_parts/mecha_equipment/mining_scanner/can_attach(obj/mecha/M as obj) + return (..() && istype(M, /obj/mecha/working)) + /obj/item/mecha_parts/mecha_equipment/mining_scanner/process() if(!loc) STOP_PROCESSING(SSfastprocess, src) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 28ef7cb66420c..cf8ac965c1e7e 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -43,7 +43,7 @@ var/list/L = list() var/turf/pos = get_turf(src) for(var/turf/T in get_area_turfs(thearea.type)) - if(!T.density && pos.z == T.z) + if(!T.density && pos.get_virtual_z_level() == T.get_virtual_z_level()) var/clear = 1 for(var/obj/O in T) if(O.density) @@ -334,7 +334,7 @@ if(isnull(cur_charge) || !chassis.cell) STOP_PROCESSING(SSobj, src) set_ready_state(1) - occupant_message("No powercell detected.") + occupant_message("No power cell detected.") return if(cur_charge < chassis.cell.maxcharge) var/area/A = get_area(chassis) @@ -437,7 +437,7 @@ var/cur_charge = chassis.get_charge() if(isnull(cur_charge)) set_ready_state(1) - occupant_message("No powercell detected.") + occupant_message("No power cell detected.") log_message("Deactivated.", LOG_MECHA) STOP_PROCESSING(SSobj, src) return @@ -541,7 +541,7 @@ /obj/item/mecha_parts/mecha_equipment/thrusters/gas name = "RCS thruster package" - desc = "A set of thrusters that allow for exosuit movement in zero-gravity enviroments, by expelling gas from the internal life support tank." + desc = "A set of thrusters that allow for exosuit movement in zero-gravity environments, by expelling gas from the internal life support tank." effect_type = /obj/effect/particle_effect/smoke var/move_cost = 20 //moles per step @@ -566,7 +566,7 @@ /obj/item/mecha_parts/mecha_equipment/thrusters/ion //for mechs with built-in thrusters, should never really exist un-attached to a mech name = "Ion thruster package" - desc = "A set of thrusters that allow for exosuit movement in zero-gravity enviroments." + desc = "A set of thrusters that allow for exosuit movement in zero-gravity environments." detachable = FALSE salvageable = FALSE effect_type = /obj/effect/particle_effect/ion_trails diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index e4631cd44de2f..027c39866f5b2 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -13,6 +13,7 @@ var/dam_force = 20 var/obj/mecha/working/ripley/cargo_holder harmful = TRUE + mech_flags = EXOSUIT_MODULE_RIPLEY /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/can_attach(obj/mecha/working/ripley/M as obj) if(..()) @@ -52,14 +53,14 @@ cargo_holder.cargo += O O.forceMove(chassis) O.anchored = FALSE - occupant_message("[target] successfully loaded.") + balloon_alert(chassis.occupant, "[target] loaded") log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]", LOG_MECHA) else O.anchored = initial(O.anchored) else - occupant_message("Not enough room in cargo compartment!") + balloon_alert(chassis.occupant, "Not enough room in cargo compartment") else - occupant_message("[target] is firmly secured!") + balloon_alert(chassis.occupant, "[target] is firmly secured") else if(isliving(target)) var/mob/living/M = target @@ -112,14 +113,14 @@ cargo_holder.cargo += O O.forceMove(chassis) O.anchored = FALSE - occupant_message("[target] successfully loaded.") + balloon_alert(chassis.occupant, "[target] loaded") log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]", LOG_MECHA) else O.anchored = initial(O.anchored) else - occupant_message("Not enough room in cargo compartment!") + balloon_alert(chassis.occupant, "Not enough room in cargo compartment") else - occupant_message("[target] is firmly secured!") + balloon_alert(chassis.occupant, "[target] is firmly secured") else if(isliving(target)) var/mob/living/M = target @@ -176,6 +177,7 @@ equip_cooldown = 5 energy_drain = 0 range = MECHA_MELEE|MECHA_RANGED + mech_flags = EXOSUIT_MODULE_RIPLEY /obj/item/mecha_parts/mecha_equipment/extinguisher/Initialize() . = ..() @@ -478,6 +480,7 @@ name = "Ripley MK-II Conversion Kit" desc = "A pressurized canopy attachment kit for an Autonomous Power Loader Unit \"Ripley\" MK-I mecha, to convert it to the slower, but space-worthy MK-II design. This kit cannot be removed, once applied." icon_state = "ripleyupgrade" + mech_flags = EXOSUIT_MODULE_RIPLEY /obj/item/mecha_parts/mecha_equipment/ripleyupgrade/can_attach(obj/mecha/working/ripley/M) if(M.type != /obj/mecha/working/ripley) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 75272e53c88dc..0caa73df11710 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -10,6 +10,7 @@ var/projectile_delay = 0 var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the weapon is fired. var/kickback = TRUE //Will using this weapon in no grav push mecha back. + mech_flags = EXOSUIT_MODULE_COMBAT /obj/item/mecha_parts/mecha_equipment/weapon/can_attach(obj/mecha/M) if(!..()) @@ -152,7 +153,7 @@ fire_sound = 'sound/weapons/plasma_cutter.ogg' harmful = TRUE -/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/can_attach(obj/mecha/working/M) +/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/can_attach(obj/mecha/M) if(..()) //combat mech return 1 else if(M.equipment.len < M.max_equip && istype(M)) @@ -177,6 +178,7 @@ equip_cooldown = 150 range = MECHA_MELEE|MECHA_RANGED kickback = FALSE + mech_flags = EXOSUIT_MODULE_HONK /obj/item/mecha_parts/mecha_equipment/weapon/honker/can_attach(obj/mecha/combat/honker/M) if(..()) @@ -382,6 +384,7 @@ missile_speed = 1.5 projectile_energy_cost = 100 equip_cooldown = 20 + mech_flags = EXOSUIT_MODULE_HONK /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar/can_attach(obj/mecha/combat/honker/M) if(..()) @@ -399,6 +402,7 @@ missile_speed = 1.5 projectile_energy_cost = 100 equip_cooldown = 10 + mech_flags = EXOSUIT_MODULE_HONK /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar/can_attach(obj/mecha/combat/honker/M) if(..()) @@ -424,6 +428,7 @@ projectiles = 10 projectile_energy_cost = 500 diags_first = TRUE + mech_flags = EXOSUIT_MODULE_HONK /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/can_attach(obj/mecha/combat/honker/M) if(..()) diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index 22297826f2652..782deeed33579 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -56,6 +56,7 @@ recharging_mech = locate(/obj/mecha) in recharging_turf if(recharging_mech) recharge_console.update_icon() + recharge_console.ui_update() if(recharging_mech && recharging_mech.cell) if(recharging_mech.cell.charge < recharging_mech.cell.maxcharge) var/delta = min(max_charge, recharging_mech.cell.maxcharge - recharging_mech.cell.charge) @@ -66,6 +67,7 @@ if(recharging_mech.loc != recharging_turf) recharging_mech = null recharge_console.update_icon() + recharge_console.ui_update() /obj/machinery/mech_bay_recharge_port/attackby(obj/item/I, mob/user, params) @@ -91,6 +93,12 @@ var/obj/machinery/mech_bay_recharge_port/recharge_port light_color = LIGHT_COLOR_PINK + var/had_mech = FALSE //Keep track of whether we had a mech last update + +/obj/machinery/computer/mech_bay_power_console/ui_requires_update(mob/user, datum/tgui/ui) + . = ..() + if(recharge_port?.recharging_mech) //Update while there's a mech connected + . = TRUE /obj/machinery/computer/mech_bay_power_console/ui_state(mob/user) return GLOB.default_state diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm deleted file mode 100644 index b4ed847442308..0000000000000 --- a/code/game/mecha/mech_fabricator.dm +++ /dev/null @@ -1,455 +0,0 @@ -/obj/machinery/mecha_part_fabricator - icon = 'icons/obj/robotics.dmi' - icon_state = "fab-idle" - name = "exosuit fabricator" - desc = "Nothing is being built." - density = TRUE - use_power = IDLE_POWER_USE - idle_power_usage = 20 - active_power_usage = 5000 - req_access = list(ACCESS_ROBOTICS) - circuit = /obj/item/circuitboard/machine/mechfab - var/time_coeff = 1 - var/component_coeff = 1 - var/datum/techweb/specialized/autounlocking/exofab/stored_research - var/sync = 0 - var/part_set - var/datum/design/being_built - var/list/queue = list() - var/processing_queue = 0 - var/screen = "main" - var/link_on_init = TRUE - var/temp - var/datum/component/remote_materials/rmat - var/list/part_sets = list( - "Cyborg", - "Ripley", - "Firefighter", - "Odysseus", - "Gygax", - "Durand", - "H.O.N.K", - "Phazon", - "Exosuit Equipment", - "Cyborg Upgrade Modules", - "IPC Components", - "Misc" - ) - -/obj/machinery/mecha_part_fabricator/Initialize(mapload) - stored_research = new - rmat = AddComponent(/datum/component/remote_materials, "mechfab", mapload && link_on_init) - RefreshParts() //Recalculating local material sizes if the fab isn't linked - return ..() - -/obj/machinery/mecha_part_fabricator/RefreshParts() - var/T = 0 - - //maximum stocking amount (default 300000, 600000 at T4) - for(var/obj/item/stock_parts/matter_bin/M in component_parts) - T += M.rating - rmat.set_local_size((200000 + (T*50000))) - - //resources adjustment coefficient (1 -> 0.85 -> 0.7 -> 0.55) - T = 1.15 - for(var/obj/item/stock_parts/micro_laser/Ma in component_parts) - T -= Ma.rating*0.15 - component_coeff = T - - //building time adjustment coefficient (1 -> 0.8 -> 0.6) - T = -1 - 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) - -/obj/machinery/mecha_part_fabricator/examine(mob/user) - . = ..() - if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Storing up to [rmat.local_size] material units.
      Material consumption at [component_coeff*100]%.
      Build time reduced by [100-time_coeff*100]%." - -/obj/machinery/mecha_part_fabricator/emag_act() - if(obj_flags & EMAGGED) - return - obj_flags |= EMAGGED - req_access = list() - say("DB error \[Code 0x00F1\]") - sleep(10) - say("Attempting auto-repair...") - sleep(15) - say("User DB corrupted \[Code 0x00FA\]. Truncating data structure...") - sleep(30) - say("User DB truncated. Please contact your Nanotrasen system operator for future assistance.") - -/obj/machinery/mecha_part_fabricator/proc/output_parts_list(set_name) - var/output = "" - for(var/v in stored_research.researched_designs) - var/datum/design/D = SSresearch.techweb_design_by_id(v) - if(D.build_type & MECHFAB) - if(!(set_name in D.category)) - continue - output += "
      [output_part_info(D)]
      \[" - if(check_resources(D)) - output += "Build | " - output += "Add to queue\]\[?\]
      " - return output - -/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" - return output - -/obj/machinery/mecha_part_fabricator/proc/output_part_cost(datum/design/D) - var/i = 0 - var/output - for(var/c in D.materials) - var/datum/material/M = c - output += "[i?" | ":null][get_resource_cost_w_coeff(D, M)] [M.name]" - i++ - return output - -/obj/machinery/mecha_part_fabricator/proc/output_available_resources() - var/output - var/datum/component/material_container/materials = rmat.mat_container - - if(materials) - for(var/mat_id in materials.materials) - var/datum/material/M = mat_id - var/amount = materials.materials[mat_id] - var/ref = REF(M) - output += "[M.name]: [amount] cm³" - if(amount >= MINERAL_MATERIAL_AMOUNT) - output += "- Remove \[1\]" - if(amount >= (MINERAL_MATERIAL_AMOUNT * 10)) - output += " | \[10\]" - output += " | \[50\]" - output += "
      " - else - output += "No material storage connected, please contact the quartermaster.
      " - return output - -/obj/machinery/mecha_part_fabricator/proc/get_resources_w_coeff(datum/design/D) - var/list/resources = list() - for(var/R in D.materials) - var/datum/material/M = R - resources[M] = get_resource_cost_w_coeff(D, M) - return resources - -/obj/machinery/mecha_part_fabricator/proc/check_resources(datum/design/D) - if(D.reagents_list.len) // No reagents storage - no reagent designs. - return FALSE - var/datum/component/material_container/materials = rmat.mat_container - if(materials.has_materials(get_resources_w_coeff(D))) - return TRUE - return FALSE - -/obj/machinery/mecha_part_fabricator/proc/build_part(datum/design/D) - var/list/res_coef = get_resources_w_coeff(D) - - var/datum/component/material_container/materials = rmat.mat_container - if (!materials) - say("No access to material storage, please contact the quartermaster.") - return FALSE - if (rmat.on_hold()) - say("Mineral access is on hold, please contact the quartermaster.") - return FALSE - if(!check_resources(D)) - say("Not enough resources. Queue processing stopped.") - return FALSE - being_built = D - desc = "It's building \a [initial(D.name)]." - materials.use_materials(res_coef) - rmat.silo_log(src, "built", -1, "[D.name]", res_coef) - - add_overlay("fab-active") - use_power = ACTIVE_POWER_USE - updateUsrDialog() - sleep(get_construction_time_w_coeff(D)) - use_power = IDLE_POWER_USE - cut_overlay("fab-active") - desc = initial(desc) - - var/location = get_step(src,(dir)) - var/obj/item/I = new D.build_path(location) - I.materials = res_coef - say("\The [I] is complete.") - being_built = null - - updateUsrDialog() - return TRUE - -/obj/machinery/mecha_part_fabricator/proc/update_queue_on_page() - send_byjax(usr,"mecha_fabricator.browser","queue",list_queue()) - return - -/obj/machinery/mecha_part_fabricator/proc/add_part_set_to_queue(set_name) - if(set_name in part_sets) - for(var/v in stored_research.researched_designs) - var/datum/design/D = SSresearch.techweb_design_by_id(v) - if(D.build_type & MECHFAB) - if(set_name in D.category) - add_to_queue(D) - -/obj/machinery/mecha_part_fabricator/proc/add_to_queue(D) - if(!istype(queue)) - queue = list() - if(D) - queue[++queue.len] = D - return queue.len - -/obj/machinery/mecha_part_fabricator/proc/remove_from_queue(index) - if(!isnum_safe(index) || !ISINTEGER(index) || !istype(queue) || (index<1 || index>queue.len)) - return FALSE - queue.Cut(index,++index) - return TRUE - -/obj/machinery/mecha_part_fabricator/proc/process_queue() - var/datum/design/D = queue[1] - if(!D) - remove_from_queue(1) - if(queue.len) - return process_queue() - else - return - temp = null - while(D) - if(stat&(NOPOWER|BROKEN)) - return FALSE - if(build_part(D)) - remove_from_queue(1) - else - return FALSE - D = listgetindex(queue, 1) - say("Queue processing finished successfully.") - -/obj/machinery/mecha_part_fabricator/proc/list_queue() - var/output = "Queue contains:" - if(!istype(queue) || !queue.len) - output += "
      Nothing" - else - output += "
        " - var/i = 0 - for(var/datum/design/D in queue) - i++ - var/obj/part = D.build_path - output += "" - output += initial(part.name) + " - " - output += "[i>1?"":null] " - output += "[i↓":null] " - output += "Remove" - - output += "
      " - output += "\[Process queue | Clear queue\]" - return output - -/obj/machinery/mecha_part_fabricator/proc/sync() - temp = "Updating local R&D database..." - updateUsrDialog() - sleep(30) //only sleep if called by user - - for(var/obj/machinery/computer/rdconsole/RDC in oview(7,src)) - RDC.stored_research.copy_research_to(stored_research) - temp = "Processed equipment designs.
      " - //check if the tech coefficients have changed - temp += "Return" - - updateUsrDialog() - say("Successfully synchronized with R&D server.") - return - - temp = "Unable to connect to local R&D Database.
      Please check your connections and try again.
      Return" - updateUsrDialog() - return - -/obj/machinery/mecha_part_fabricator/proc/get_resource_cost_w_coeff(datum/design/D, var/datum/material/resource, roundto = 1) - return round(D.materials[resource]*component_coeff, roundto) - -/obj/machinery/mecha_part_fabricator/proc/get_construction_time_w_coeff(datum/design/D, roundto = 1) //aran - return round(initial(D.construction_time)*time_coeff, roundto) - -/obj/machinery/mecha_part_fabricator/ui_interact(mob/user as mob) - . = ..() - var/dat, left_part - user.set_machine(src) - var/turf/exit = get_step(src,(dir)) - if(exit.density) - say("Error! Part outlet is obstructed.") - return - if(temp) - left_part = temp - else if(being_built) - var/obj/I = being_built.build_path - left_part = {"Building [initial(I.name)].
      - Please wait until completion...
      "} - else - switch(screen) - if("main") - left_part = output_available_resources()+"
      " - left_part += "Sync with R&D servers
      " - for(var/part_set in part_sets) - left_part += "[part_set] - \[Add all parts to queue\]
      " - if("parts") - left_part += output_parts_list(part_set) - left_part += "
      Return" - dat = {" - - - [name] - - - - -
      CrimeDetailsAuthorTime Added
      [c.crimeName] [c.crimeDetails] [c.author]
      - - - - -
      - [left_part] - - [list_queue()] -
      - - "} - user << browse(dat, "window=mecha_fabricator;size=1000x430") - onclose(user, "mecha_fabricator") - return - -/obj/machinery/mecha_part_fabricator/Topic(href, href_list) - if(..()) - return - if(href_list["part_set"]) - var/tpart_set = href_list["part_set"] - if(tpart_set) - if(tpart_set=="clear") - part_set = null - else - part_set = tpart_set - screen = "parts" - if(href_list["part"]) - var/T = href_list["part"] - for(var/v in stored_research.researched_designs) - var/datum/design/D = SSresearch.techweb_design_by_id(v) - if(D.build_type & MECHFAB) - if(D.id == T) - if(!processing_queue) - build_part(D) - else - add_to_queue(D) - break - if(href_list["add_to_queue"]) - var/T = href_list["add_to_queue"] - for(var/v in stored_research.researched_designs) - var/datum/design/D = SSresearch.techweb_design_by_id(v) - if(D.build_type & MECHFAB) - if(D.id == T) - add_to_queue(D) - break - return update_queue_on_page() - if(href_list["remove_from_queue"]) - remove_from_queue(text2num(href_list["remove_from_queue"])) - return update_queue_on_page() - if(href_list["partset_to_queue"]) - add_part_set_to_queue(href_list["partset_to_queue"]) - return update_queue_on_page() - if(href_list["process_queue"]) - spawn(0) - if(processing_queue || being_built) - return FALSE - processing_queue = 1 - process_queue() - processing_queue = 0 - if(href_list["clear_temp"]) - temp = null - if(href_list["screen"]) - screen = href_list["screen"] - if(href_list["queue_move"] && href_list["index"]) - var/index = text2num(href_list["index"]) - var/new_index = index + text2num(href_list["queue_move"]) - if(isnum_safe(index) && isnum_safe(new_index) && ISINTEGER(index) && ISINTEGER(new_index)) - if(ISINRANGE(new_index,1,queue.len)) - queue.Swap(index,new_index) - return update_queue_on_page() - if(href_list["clear_queue"]) - queue = list() - return update_queue_on_page() - if(href_list["sync"]) - sync() - if(href_list["part_desc"]) - var/T = href_list["part_desc"] - for(var/v in stored_research.researched_designs) - var/datum/design/D = SSresearch.techweb_design_by_id(v) - if(D.build_type & MECHFAB) - if(D.id == T) - var/obj/part = D.build_path - temp = {"

      [initial(part.name)] description:

      - [initial(part.desc)]
      - Return - "} - break - - if(href_list["remove_mat"] && href_list["material"]) - var/datum/material/Mat = locate(href_list["material"]) - eject_sheets(Mat, text2num(href_list["remove_mat"])) - - updateUsrDialog() - return - -/obj/machinery/mecha_part_fabricator/proc/do_process_queue() - if(processing_queue || being_built) - return FALSE - processing_queue = 1 - process_queue() - processing_queue = 0 - -/obj/machinery/mecha_part_fabricator/proc/eject_sheets(eject_sheet, eject_amt) - var/datum/component/material_container/mat_container = rmat.mat_container - if (!mat_container) - say("No access to material storage, please contact the quartermaster.") - return 0 - if (rmat.on_hold()) - say("Mineral access is on hold, please contact the quartermaster.") - return 0 - var/count = mat_container.retrieve_sheets(text2num(eject_amt), eject_sheet, drop_location()) - var/list/matlist = list() - matlist[eject_sheet] = text2num(eject_amt) - rmat.silo_log(src, "ejected", -count, "sheets", matlist) - return count - -/obj/machinery/mecha_part_fabricator/proc/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted) - var/datum/material/M = id_inserted - add_overlay("fab-load-[M.name]") - addtimer(CALLBACK(src, /atom/proc/cut_overlay, "fab-load-[M.name]"), 10) - updateUsrDialog() - -/obj/machinery/mecha_part_fabricator/attackby(obj/item/W, mob/user, params) - if(default_deconstruction_screwdriver(user, "fab-o", "fab-idle", W)) - return TRUE - - if(default_deconstruction_crowbar(W)) - return TRUE - - return ..() - - -/obj/machinery/mecha_part_fabricator/proc/is_insertion_ready(mob/user) - if(panel_open) - to_chat(user, "You can't load [src] while it's opened!") - return FALSE - if(being_built) - to_chat(user, "\The [src] is currently processing! Please wait until completion.") - return FALSE - - return TRUE - -/obj/machinery/mecha_part_fabricator/maint - link_on_init = FALSE diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 0744b0c2681f7..3b03dd07f5134 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -10,7 +10,6 @@ layer = BELOW_MOB_LAYER//icon draw layer infra_luminosity = 15 //byond implementation is bugged. force = 5 - flags_1 = HEAR_1 var/ruin_mecha = FALSE //if the mecha starts on a ruin, don't automatically give it a tracking beacon to prevent metagaming. var/can_move = 0 //time of next allowed movement var/mob/living/carbon/occupant = null @@ -22,7 +21,7 @@ var/overload_step_energy_drain_min = 100 max_integrity = 300 //max_integrity is base health var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. - armor = list("melee" = 20, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list("melee" = 20, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "stamina" = 0) var/list/facing_modifiers = list(MECHA_FRONT_ARMOUR = 1.5, MECHA_SIDE_ARMOUR = 1, MECHA_BACK_ARMOUR = 0.5) var/equipment_disabled = 0 //disabled due to EMP var/obj/item/stock_parts/cell/cell ///Keeps track of the mech's cell @@ -79,7 +78,7 @@ var/destruction_sleep_duration = 20 //Time that mech pilot is put to sleep for if mech is destroyed var/enclosed = TRUE //Set to false for open-cockpit mechs var/silicon_icon_state = null //if the mech has a different icon when piloted by an AI or MMI - var/is_currently_ejecting = FALSE //Mech cannot use equiptment when true, set to true if pilot is trying to exit mech + var/is_currently_ejecting = FALSE //Mech cannot use equipment when true, set to true if pilot is trying to exit mech //Action datums var/datum/action/innate/mecha/mech_eject/eject_action = new @@ -145,6 +144,7 @@ diag_hud_set_mechhealth() diag_hud_set_mechcell() diag_hud_set_mechstat() + become_hearing_sensitive(trait_source = ROUNDSTART_TRAIT) /obj/mecha/update_icon() if (silicon_pilot && silicon_icon_state) @@ -188,11 +188,7 @@ scanmod = null capacitor = null internal_tank = null - if(loc) - loc.assume_air(cabin_air) - air_update_turf() - else - qdel(cabin_air) + assume_air(cabin_air) cabin_air = null qdel(spark_system) spark_system = null @@ -268,8 +264,8 @@ cabin_air = new cabin_air.set_temperature(T20C) cabin_air.set_volume(200) - cabin_air.set_moles(/datum/gas/oxygen, O2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) - cabin_air.set_moles(/datum/gas/nitrogen, N2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) + cabin_air.set_moles(GAS_O2, O2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) + cabin_air.set_moles(GAS_N2, N2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) return cabin_air /obj/mecha/proc/add_radio() @@ -346,13 +342,7 @@ if(internal_damage & MECHA_INT_TANK_BREACH) //remove some air from internal tank if(internal_tank) - var/datum/gas_mixture/int_tank_air = internal_tank.return_air() - var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.1) - if(loc) - loc.assume_air(leaked_gas) - air_update_turf() - else - qdel(leaked_gas) + assume_air_ratio(internal_tank.return_air(), 0.1) if(internal_damage & MECHA_INT_SHORT_CIRCUIT) if(get_charge()) @@ -375,8 +365,7 @@ if(pressure_delta > 0) //cabin pressure lower than release pressure if(tank_air.return_temperature() > 0) transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = tank_air.remove(transfer_moles) - cabin_air.merge(removed) + tank_air.transfer_to(cabin_air,transfer_moles) else if(pressure_delta < 0) //cabin pressure higher than release pressure var/datum/gas_mixture/t_air = return_air() pressure_delta = cabin_pressure - release_pressure @@ -384,11 +373,7 @@ pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta) if(pressure_delta > 0) //if location pressure is lower than cabin pressure transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles) - if(t_air) - t_air.merge(removed) - else //just delete the cabin gas, we're in space or some shit - qdel(removed) + cabin_air.transfer_to(t_air, transfer_moles) if(occupant) if(cell) @@ -397,22 +382,22 @@ if(0.75 to INFINITY) occupant.clear_alert("charge") if(0.5 to 0.75) - occupant.throw_alert("charge", /obj/screen/alert/lowcell, 1) + occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 1) if(0.25 to 0.5) - occupant.throw_alert("charge", /obj/screen/alert/lowcell, 2) + occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 2) if(0.01 to 0.25) - occupant.throw_alert("charge", /obj/screen/alert/lowcell, 3) + occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 3) else - occupant.throw_alert("charge", /obj/screen/alert/emptycell) + occupant.throw_alert("charge", /atom/movable/screen/alert/emptycell) var/integrity = obj_integrity/max_integrity*100 switch(integrity) if(30 to 45) - occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 1) + occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 1) if(15 to 35) - occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 2) + occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 2) if(-INFINITY to 15) - occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 3) + occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 3) else occupant.clear_alert("mech damage") var/atom/checking = occupant.loc @@ -454,18 +439,29 @@ /obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits. return -/obj/mecha/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/obj/mecha/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) . = ..() if(speaker == occupant) - if(radio?.broadcasting) - radio.talk_into(speaker, text, , spans, message_language) //flick speech bubble var/list/speech_bubble_recipients = list() - for(var/mob/M in get_hearers_in_view(7,src)) + for(var/mob/M as() in hearers(7,src)) if(M.client) speech_bubble_recipients.Add(M.client) INVOKE_ASYNC(GLOBAL_PROC, /proc/flick_overlay, image('icons/mob/talk.dmi', src, "machine[say_test(raw_message)]",MOB_LAYER+1), speech_bubble_recipients, 30) +/obj/mecha/emag_act(mob/user) + . = ..() + if(obj_flags & EMAGGED) + to_chat(user, "The mech suit's internal controls are damaged beyond repair!") + return + obj_flags |= EMAGGED + playsound(src, "sparks", 100, 1) + to_chat(user, "You short out the mech suit's internal controls.") + dna_lock = null + equipment_disabled = TRUE + log_message("System emagged detected", LOG_MECHA, color="red") + addtimer(CALLBACK(src, /obj/mecha/proc/restore_equipment), 15 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + //////////////////////////// ///// Action processing //// //////////////////////////// @@ -481,7 +477,7 @@ if(is_currently_ejecting) return if(phasing) - occupant_message("Unable to interact with objects while phasing") + occupant_message("Unable to interact with objects while phasing.") return if(user.incapacitated()) return @@ -543,16 +539,19 @@ /obj/mecha/Process_Spacemove(var/movement_dir = 0) . = ..() if(.) - return TRUE + return - var/atom/movable/backup = get_spacemove_backup() - if(backup) - if(istype(backup) && movement_dir && !backup.anchored) - if(backup.newtonian_move(turn(movement_dir, 180))) + var/atom/backup = get_spacemove_backup() + if(backup && movement_dir) + if(isturf(backup)) //get_spacemove_backup() already checks if a returned turf is solid, so we can just go + return TRUE + if(istype(backup, /atom/movable)) + var/atom/movable/movable_backup = backup + if((!movable_backup.anchored) && (movable_backup.newtonian_move(turn(movement_dir, 180)))) step_silent = TRUE if(occupant) - to_chat(occupant, "You push off of [backup] to propel yourself.") - return TRUE + to_chat(occupant, "You push off of [movable_backup] to propel yourself.") + return TRUE if(can_move <= world.time && active_thrusters && movement_dir && active_thrusters.thrust(movement_dir)) step_silent = TRUE @@ -576,7 +575,7 @@ return 0 if(construction_state) if(world.time - last_message > 20) - occupant_message("Maintenance protocols in effect.") + occupant_message("Maintenance protocols are in effect.") last_message = world.time return return domove(direction) @@ -648,8 +647,15 @@ can_move = 0 if(phase_state) flick(phase_state, src) - forceMove(get_step(src,dir)) - use_power(phasing_energy_drain) + var/turf/target = get_step(src, dir) + if(target.flags_1 & NOJAUNT_1) + occupant_message("Phasing anomaly detected, emergency deactivation initiated.") + sleep(step_in*3) + can_move = 1 + phasing = FALSE + return + if(do_teleport(src, get_step(src, dir), no_effects = TRUE)) + use_power(phasing_energy_drain) sleep(step_in*3) can_move = 1 else @@ -679,7 +685,7 @@ /////////////////////////////////// /obj/mecha/proc/check_for_internal_damage(list/possible_int_damage,ignore_threshold=null) - if(!islist(possible_int_damage) || isemptylist(possible_int_damage)) + if(!islist(possible_int_damage) || !length(possible_int_damage)) return if(prob(20)) if(ignore_threshold || obj_integrity*100/max_integrity < internal_damage_threshold) @@ -709,7 +715,7 @@ if(MECHA_INT_TEMP_CONTROL) occupant_message("Life support system reactivated.") if(MECHA_INT_FIRE) - occupant_message("Internal fire extinquished.") + occupant_message("Internal fire extinguished.") if(MECHA_INT_TANK_BREACH) occupant_message("Damaged internal tank has been sealed.") internal_damage &= ~int_dam_flag @@ -739,7 +745,7 @@ var/can_control_mech = 0 for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in trackers) can_control_mech = 1 - to_chat(user, "[icon2html(src, user)] Status of [name]:\n[A.get_mecha_info()]") + to_chat(user, "[icon2html(src, user)] Status of [name]:\n[A.get_mecha_info()].") break if(!can_control_mech) to_chat(user, "You cannot control exosuits without AI control beacons installed.") @@ -858,6 +864,11 @@ return cabin_air.remove(amount) return ..() +/obj/mecha/remove_air_ratio(ratio) + if(use_internal_tank) + return cabin_air.remove_ratio(ratio) + return ..() + /obj/mecha/return_air() if(use_internal_tank) return cabin_air @@ -933,7 +944,7 @@ return /obj/mecha/proc/moved_inside(mob/living/carbon/human/H) - if(H && H.client && (H in range(1))) + if(H?.client && get_dist(H, src) <= 1) occupant = H H.forceMove(src) H.update_mouse_pointer() @@ -1007,15 +1018,16 @@ /obj/mecha/container_resist(mob/living/user) is_currently_ejecting = TRUE - to_chat(occupant, "You begin the ejection procedure. Equipment is disabled during this process. Hold still to finish ejecting.") + to_chat(occupant, "You begin the ejection procedure. Equipment is disabled during this process. Hold still to finish ejecting.") if(do_after(occupant,exit_delay, target = src)) - to_chat(occupant, "You exit the mech.") + to_chat(occupant, "You exit the mech.") go_out() else - to_chat(occupant, "You stop exiting the mech. Weapons are enabled again.") + to_chat(occupant, "You stop exiting the mech. Weapons are enabled again.") is_currently_ejecting = FALSE /obj/mecha/Exited(atom/movable/M, atom/newloc) + . = ..() if(occupant && occupant == M) // The occupant exited the mech without calling go_out() go_out(TRUE, newloc) @@ -1152,3 +1164,12 @@ GLOBAL_VAR_INIT(year_integer, text2num(year)) // = 2013??? /obj/mecha/rust_heretic_act() take_damage(500, BRUTE) + +/obj/mecha/lighteater_act(obj/item/light_eater/light_eater) + if(!lights_power) + return + lights = FALSE + lights_power = 0 + set_light(0) + visible_message(src, "The lights on [src] short out!") + playsound(src, 'sound/items/welder.ogg', 50, 1) diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm index 6ca058734fe58..e555421c49f5f 100644 --- a/code/game/mecha/mecha_actions.dm +++ b/code/game/mecha/mecha_actions.dm @@ -55,7 +55,7 @@ return chassis.use_internal_tank = !chassis.use_internal_tank button_icon_state = "mech_internals_[chassis.use_internal_tank ? "on" : "off"]" - chassis.occupant_message("Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].") + chassis.balloon_alert(owner, "Taking air from [chassis.use_internal_tank ? "internal airtank" : "environment"]") chassis.log_message("Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].", LOG_MECHA) UpdateButtonIcon() @@ -73,11 +73,11 @@ available_equipment += M if(available_equipment.len == 0) - chassis.occupant_message("No equipment available.") + chassis.balloon_alert(owner, "No equipment available") return if(!chassis.selected) chassis.selected = available_equipment[1] - chassis.occupant_message("You select [chassis.selected]") + chassis.balloon_alert(owner, "[chassis.selected] selected") send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list()) button_icon_state = "mech_cycle_equip_on" UpdateButtonIcon() @@ -88,11 +88,11 @@ if(A == chassis.selected) if(available_equipment.len == number) chassis.selected = null - chassis.occupant_message("You switch to no equipment") + chassis.balloon_alert(owner, "Switched to no equipment") button_icon_state = "mech_cycle_equip_off" else chassis.selected = available_equipment[number+1] - chassis.occupant_message("You switch to [chassis.selected]") + chassis.balloon_alert(owner, "Switched to [chassis.selected]") button_icon_state = "mech_cycle_equip_on" send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list()) UpdateButtonIcon() @@ -113,7 +113,7 @@ else chassis.set_light(-chassis.lights_power) button_icon_state = "mech_lights_off" - chassis.occupant_message("Toggled lights [chassis.lights?"on":"off"].") + chassis.balloon_alert(owner, "Toggled lights [chassis.lights?"on":"off"]") chassis.log_message("Toggled lights [chassis.lights?"on":"off"].", LOG_MECHA) UpdateButtonIcon() @@ -176,12 +176,12 @@ chassis.leg_overload_mode = 1 chassis.step_in = min(1, round(chassis.step_in/2)) chassis.step_energy_drain = max(chassis.overload_step_energy_drain_min,chassis.step_energy_drain*chassis.leg_overload_coeff) - chassis.occupant_message("You enable leg actuators overload.") + chassis.balloon_alert(owner,"Leg actuators overloaded") else chassis.leg_overload_mode = 0 chassis.step_in = initial(chassis.step_in) chassis.step_energy_drain = chassis.normal_step_energy_drain - chassis.occupant_message("You disable leg actuators overload.") + chassis.balloon_alert(owner, "Leg actuators reset") UpdateButtonIcon() /datum/action/innate/mecha/mech_smoke @@ -209,7 +209,7 @@ chassis.zoom_mode = !chassis.zoom_mode button_icon_state = "mech_zoom_[chassis.zoom_mode ? "on" : "off"]" chassis.log_message("Toggled zoom mode.", LOG_MECHA) - chassis.occupant_message("Zoom mode [chassis.zoom_mode?"en":"dis"]abled.") + chassis.balloon_alert(owner, "Zoom mode [chassis.zoom_mode?"enabled":"disabled"]") if(chassis.zoom_mode) owner.client.view_size.setTo(4.5) SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg',volume=50)) @@ -228,13 +228,13 @@ switch(chassis.damtype) if("tox") new_damtype = "brute" - chassis.occupant_message("Your exosuit's hands form into fists.") + chassis.balloon_alert(owner, "Your punches will now deal brute damage") if("brute") new_damtype = "fire" - chassis.occupant_message("A torch tip extends from your exosuit's hand, glowing red.") + chassis.balloon_alert(owner, "Your punches will now deal burn damage") if("fire") new_damtype = "tox" - chassis.occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.") + chassis.balloon_alert(owner,"Your punches will now deal toxin damage") chassis.damtype = new_damtype button_icon_state = "mech_damtype_[new_damtype]" playsound(src, 'sound/mecha/mechmove01.ogg', 50, 1) @@ -249,5 +249,5 @@ return chassis.phasing = !chassis.phasing button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]" - chassis.occupant_message("En":"#f00\">Dis"]abled phasing.") + chassis.balloon_alert(owner, "[chassis.phasing ? "Enabled" : "Disabled"] phasing") UpdateButtonIcon() diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index ede5bed380f7a..591e5b0837c1e 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -421,7 +421,7 @@ outer_plating_amount=1 /datum/component/construction/mecha/gygax/action(datum/source, atom/used_atom, mob/user) - return check_step(used_atom,user) + return INVOKE_ASYNC(src, .proc/check_step, used_atom,user) /datum/component/construction/mecha/gygax/custom_action(obj/item/I, mob/living/user, diff) if(!..()) diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 91f042be872e9..fd27d2c81891f 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -16,6 +16,7 @@ ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "ExosuitControlConsole") + ui.set_autoupdate(TRUE) // Live tracking of exosuit information ui.open() /obj/machinery/computer/mecha/ui_data(mob/user) @@ -124,6 +125,8 @@ return ..() /obj/item/mecha_parts/mecha_tracking/try_attach_part(mob/user, obj/mecha/M) + if(!do_mob(user, M, 15)) + return if(!..()) return M.trackers += src diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 175ca511fab5c..bbc0a124f1002 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -1,12 +1,10 @@ /obj/mecha/proc/get_armour_facing(relative_dir) - switch(relative_dir) - if(0) // BACKSTAB! + switch(abs(relative_dir)) + if(180) // BACKSTAB! return facing_modifiers[MECHA_BACK_ARMOUR] - if(45, 90, 270, 315) - return facing_modifiers[MECHA_SIDE_ARMOUR] - if(225, 180, 135) + if(0, 45) return facing_modifiers[MECHA_FRONT_ARMOUR] - return 1 //always return non-0 + return facing_modifiers[MECHA_SIDE_ARMOUR] //always return non-0 /obj/mecha/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) . = ..() @@ -21,7 +19,7 @@ check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT)) if(. >= 5 || prob(33)) occupant_message("Taking damage!") - log_message("Took [damage_amount] points of damage. Damage type: [damage_type]", LOG_MECHA) + log_message("Took [damage_amount] points of damage. Damage type: [damage_type].", LOG_MECHA) /obj/mecha/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) . = ..() @@ -43,7 +41,7 @@ break if(attack_dir) - var/facing_modifier = get_armour_facing(dir2angle(attack_dir) - dir2angle(src)) + var/facing_modifier = get_armour_facing(dir2angle(attack_dir) - dir2angle(dir)) booster_damage_modifier /= facing_modifier booster_deflection_modifier *= facing_modifier if(prob(deflect_chance * booster_deflection_modifier)) @@ -131,10 +129,22 @@ severity++ for(var/X in equipment) var/obj/item/mecha_parts/mecha_equipment/ME = X - ME.ex_act(severity,target) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += ME + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += ME + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += ME for(var/Y in trackers) var/obj/item/mecha_parts/mecha_tracking/MT = Y - MT.ex_act(severity, target) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += MT + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += MT + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += MT if(occupant) occupant.ex_act(severity,target) @@ -200,7 +210,7 @@ to_chat(user, "You install the power cell.") playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) cell = C - log_message("Powercell installed", LOG_MECHA) + log_message("Power cell installed", LOG_MECHA) else to_chat(user, "There's already a power cell installed.") return @@ -372,4 +382,4 @@ WR.crowbar_salvage += internal_tank internal_tank.forceMove(WR) cell = null - . = ..() \ No newline at end of file + . = ..() diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 463a0f48a2498..a3374b60ccc36 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -65,12 +65,12 @@ tank_temperature = internal_tank ? int_tank_air.return_temperature() : "Unknown" cabin_pressure = round(return_pressure(),0.01) . = {"[report_internal_damage()] - [integrity<30?"DAMAGE LEVEL CRITICAL
      ":null] + [integrity<30?"DAMAGE LEVEL CRITICAL!
      ":null] Integrity: [integrity]%
      - Powercell charge: [isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]
      + Power cell charge: [isnull(cell_charge)?"No power cell installed.":"[cell.percent()]%"]
      Air source: [internal_tank?"[use_internal_tank?"Internal Airtank":"Environment"]":"Environment"]
      - Airtank pressure: [internal_tank?"[tank_pressure]kPa":"N/A"]
      - Airtank temperature: [internal_tank?"[tank_temperature]°K|[tank_temperature - T0C]°C":"N/A"]
      + Air tank pressure: [internal_tank?"[tank_pressure]kPa":"N/A"]
      + Air tank temperature: [internal_tank?"[tank_temperature]°K|[tank_temperature - T0C]°C":"N/A"]
      Cabin pressure: [internal_tank?"[cabin_pressure>WARNING_HIGH_PRESSURE ? "[cabin_pressure]": cabin_pressure]kPa":"N/A"]
      Cabin temperature: [internal_tank?"[return_temperature()]°K|[return_temperature() - T0C]°C":"N/A"]
      [dna_lock?"DNA-locked:
      [dna_lock] \[Reset\]
      ":""]
      "} @@ -79,22 +79,22 @@ ///Returns HTML for mech actions. Ideally, this proc would be empty for the base mecha. Segmented for easy refactoring. /obj/mecha/proc/get_actions() . = "" - . += "[defense_action.owner ? "Defense Mode: [defense_mode ? "Enabled" : "Disabled"]
      " : ""]" - . += "[overload_action.owner ? "Leg Actuators Overload: [leg_overload_mode ? "Enabled" : "Disabled"]
      " : ""]" - . += "[smoke_action.owner ? "Smoke: [smoke]
      " : ""]" - . += "[zoom_action.owner ? "Zoom: [zoom_mode ? "Enabled" : "Disabled"]
      " : ""]" - . += "[switch_damtype_action.owner ? "Damtype: [damtype]
      " : ""]" - . += "[phasing_action.owner ? "Phase Modulator: [phasing ? "Enabled" : "Disabled"]
      " : ""]" + . += "[defense_action.owner ? "Defense Mode: [defense_mode ? "Enabled" : "Disabled"].
      " : ""]" + . += "[overload_action.owner ? "Leg Actuators Overload: [leg_overload_mode ? "Enabled" : "Disabled"].
      " : ""]" + . += "[smoke_action.owner ? "Smoke: [smoke].
      " : ""]" + . += "[zoom_action.owner ? "Zoom: [zoom_mode ? "Enabled" : "Disabled"].
      " : ""]" + . += "[switch_damtype_action.owner ? "Damtype: [damtype].
      " : ""]" + . += "[phasing_action.owner ? "Phase Modulator: [phasing ? "Enabled" : "Disabled"].
      " : ""]" ///HTML for internal damage. /obj/mecha/proc/report_internal_damage() . = "" - var/static/list/dam_reports = list( - "[MECHA_INT_FIRE]" = "INTERNAL FIRE", - "[MECHA_INT_TEMP_CONTROL]" = "LIFE SUPPORT SYSTEM MALFUNCTION", - "[MECHA_INT_TANK_BREACH]" = "GAS TANK BREACH", - "[MECHA_INT_CONTROL_LOST]" = "COORDINATION SYSTEM CALIBRATION FAILURE - Recalibrate", - "[MECHA_INT_SHORT_CIRCUIT]" = "SHORT CIRCUIT" + var/list/dam_reports = list( + "[MECHA_INT_FIRE]" = "INTERNAL FIRE.", + "[MECHA_INT_TEMP_CONTROL]" = "LIFE SUPPORT SYSTEM MALFUNCTION.", + "[MECHA_INT_TANK_BREACH]" = "GAS TANK BREACH.", + "[MECHA_INT_CONTROL_LOST]" = "COORDINATION SYSTEM CALIBRATION FAILURE. - Recalibrate", + "[MECHA_INT_SHORT_CIRCUIT]" = "SHORT CIRCUIT." ) for(var/tflag in dam_reports) var/intdamflag = text2num(tflag) @@ -102,7 +102,7 @@ . += dam_reports[tflag] . += "
      " if(return_pressure() > WARNING_HIGH_PRESSURE) - . += "DANGEROUSLY HIGH CABIN PRESSURE
      " + . += "DANGEROUSLY HIGH CABIN PRESSURE.
      " /obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html if(!equipment.len) @@ -171,7 +171,7 @@ -

      Following keycodes are present in this system:

      "} +

      Keycodes present in this system:

      "} for(var/a in operation_req_access) . += "[get_access_desc(a)] - Delete
      " . += "

      Following keycodes were detected on portable device:

      " @@ -322,8 +322,8 @@ if(!equip || !equip.selectable) return selected = equip - occupant_message("You switch to [equip]") - visible_message("[src] raises [equip]") + occupant_message("You switch to [equip].") + visible_message("[src] raises [equip].") send_byjax(usr, "exosuit.browser", "eq_list", get_equipment_list()) return @@ -391,11 +391,14 @@ //Turns on the DNA lock if(href_list["dna_lock"]) + if(obj_flags & EMAGGED) + occupant_message("The control console lights up red, failing to bind to your DNA.") + return if(!iscarbon(occupant) || !occupant.dna) - occupant_message("You feel a prick as the needle takes your DNA sample.") + occupant_message("The controls console flashes brightly, binding to your DNA.") return dna_lock = occupant.dna.unique_enzymes - occupant_message("You feel a prick as the needle takes your DNA sample.") + occupant_message("The controls console flashes brightly, binding to your DNA.") return //Resets the DNA lock @@ -405,7 +408,7 @@ //Repairs internal damage if(href_list["repair_int_control_lost"]) - occupant_message("Recalibrating coordination system...") + occupant_message("Recalibrating coordination system.") log_message("Recalibration of coordination system started.", LOG_MECHA) addtimer(CALLBACK(src, .proc/stationary_repair, loc), 100, TIMER_UNIQUE) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 41728ab0b47ee..24898513583ec 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -10,7 +10,7 @@ max_integrity = 200 lights_power = 7 deflect_chance = 15 - armor = list("melee" = 40, "bullet" = 20, "laser" = 10, "energy" = 20, "bomb" = 40, "bio" = 0, "rad" = 20, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 20, "laser" = 10, "energy" = 20, "bomb" = 40, "bio" = 0, "rad" = 20, "fire" = 100, "acid" = 100, "stamina" = 0) max_equip = 6 wreckage = /obj/structure/mecha_wreckage/ripley internals_req_access = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_MINING) @@ -79,7 +79,7 @@ fast_pressure_step_in = 2 //step_in while in low pressure conditions slow_pressure_step_in = 4 //step_in while in normal pressure conditions step_in = 4 - armor = list("melee" = 40, "bullet" = 20, "laser" = 10, "energy" = 20, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 20, "laser" = 10, "energy" = 20, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "stamina" = 0) wreckage = /obj/structure/mecha_wreckage/ripley/mkii enclosed = TRUE enter_delay = 40 @@ -87,7 +87,7 @@ opacity = TRUE /obj/mecha/working/ripley/firefighter - desc = "Autonomous Power Loader Unit MK-III. This model is refitted with a pressurized cabin and additional thermal protection." + desc = "Autonomous Power Loader Unit MK-III. This model is refitted with a pressurized cabin and additional hazard protection." name = "\improper APLU MK-III \"Firefighter\"" icon_state = "firefighter" max_temperature = 65000 @@ -96,8 +96,9 @@ slow_pressure_step_in = 4 //step_in while in normal pressure conditions step_in = 4 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + rad_flags = RAD_PROTECT_CONTENTS lights_power = 7 - armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 60, "bio" = 0, "rad" = 70, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 60, "bio" = 0, "rad" = 70, "fire" = 100, "acid" = 100, "stamina" = 0) max_equip = 5 // More armor, less tools wreckage = /obj/structure/mecha_wreckage/ripley/firefighter enclosed = TRUE diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 1237d6b2a9070..81b0e89e14a9a 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -20,13 +20,25 @@ if(user_unbuckle_mob(buckled_mobs[1],user)) return 1 +/atom/movable/attackby(obj/item/W, mob/user, params) + if(!can_buckle || !istype(W, /obj/item/riding_offhand) || !user.Adjacent(src)) + return ..() + + var/obj/item/riding_offhand/riding_item = W + var/mob/living/carried_mob = riding_item.rider + if(carried_mob == user) //Piggyback user. + return + user.unbuckle_mob(carried_mob) + carried_mob.forceMove(get_turf(src)) + return mouse_buckle_handling(carried_mob, user) + /atom/movable/MouseDrop_T(mob/living/M, mob/living/user) . = ..() return mouse_buckle_handling(M, user) - + /atom/movable/proc/mouse_buckle_handling(mob/living/M, mob/living/user) if(can_buckle && istype(M) && istype(user)) - if(user_buckle_mob(M, user)) + if(user_buckle_mob(M, user, check_loc = FALSE)) return TRUE /atom/movable/proc/has_buckled_mobs() @@ -40,14 +52,9 @@ if(!buckled_mobs) buckled_mobs = list() - if(!istype(M)) + if(!is_buckle_possible(M, force, check_loc)) return FALSE - if(check_loc && M.loc != loc) - return FALSE - - if((!can_buckle && !force) || M.buckled || (buckled_mobs.len >= max_buckled_mobs) || (buckle_requires_restraints && !M.restrained()) || M == src) - return FALSE M.buckling = src if(!M.can_buckle() && !force) if(M == usr) @@ -72,7 +79,7 @@ M.setDir(dir) buckled_mobs |= M M.update_mobility() - M.throw_alert("buckled", /obj/screen/alert/restrained/buckled) + M.throw_alert("buckled", /atom/movable/screen/alert/restrained/buckled) post_buckle_mob(M) SEND_SIGNAL(src, COMSIG_MOVABLE_BUCKLE, M, force) @@ -110,12 +117,94 @@ //same but for unbuckle /atom/movable/proc/post_unbuckle_mob(mob/living/M) +/** + * Simple helper proc that runs a suite of checks to test whether it is possible or not to buckle the target mob to src. + * + * Returns FALSE if any conditions that should prevent buckling are satisfied. Returns TRUE otherwise. + * Arguments: + * * target - Target mob to check against buckling to src. + * * force - Whether or not the buckle should be forced. If TRUE, ignores src's can_buckle var. + * * check_loc - Whether to do a proximity check or not. The proximity check looks for target.loc == src.loc. + */ +/atom/movable/proc/is_buckle_possible(mob/living/target, force = FALSE, check_loc = TRUE) + // Make sure target is mob/living + if(!istype(target)) + return FALSE + + // No bucking you to yourself. + if(target == src) + return FALSE + + // Check if this atom can have things buckled to it. + if(!can_buckle && !force) + return FALSE + + // If we're checking the loc, make sure the target is on the thing we're bucking them to. + if(check_loc && target.loc != loc) + return FALSE + + // Make sure the target isn't already buckled to something. + if(target.buckled) + return FALSE + + // Make sure this atom can still have more things buckled to it. + if(LAZYLEN(buckled_mobs) >= max_buckled_mobs) + return FALSE + + // If the buckle requires restraints, make sure the target is actually restrained while ignoring grab restraint. + if(buckle_requires_restraints && !target.restrained(TRUE)) + return FALSE + + return TRUE + +/** + * Simple helper proc that runs a suite of checks to test whether it is possible or not for user to buckle target mob to src. + * + * Returns FALSE if any conditions that should prevent buckling are satisfied. Returns TRUE otherwise. + * Arguments: + * * target - Target mob to check against buckling to src. + * * user - The mob who is attempting to buckle the target to src. + * * check_loc - Whether to do a proximity check or not when calling is_buckle_possible(). + */ +/atom/movable/proc/is_user_buckle_possible(mob/living/target, mob/user, check_loc = TRUE) + // Standard adjacency and other checks. + if(!Adjacent(user) || !Adjacent(target) || !isturf(user.loc) || user.incapacitated() || target.anchored) + return FALSE + + // In buckling even possible in the first place? + if(!is_buckle_possible(target, FALSE, check_loc)) + return FALSE + + // If the person attempting to buckle is stood on this atom's turf and they're not buckling themselves, + // buckling shouldn't be possible as they're blocking it. + if((target != user) && (get_turf(user) == get_turf(src))) + to_chat(target, "You are unable to buckle [target] to [src] while it is blocked!") + return FALSE + + return TRUE + //Wrapper procs that handle sanity and user feedback /atom/movable/proc/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE) - if(!in_range(user, src) || !isturf(user.loc) || user.incapacitated() || M.anchored) + // Is buckling even possible? Do a full suite of checks. + if(!is_user_buckle_possible(M, user, check_loc)) return FALSE add_fingerprint(user) + + // If the mob we're attempting to buckle is not stood on this atom's turf and it isn't the user buckling themselves, + // we'll try it with a 2 second do_after delay. + if(M != user && (get_turf(M) != get_turf(src))) + M.visible_message("[user] starts buckling [M] to [src]!",\ + "[user] starts buckling you to [src]!",\ + "You hear metal clanking.") + if(!do_after(user, 2 SECONDS, TRUE, M)) + return FALSE + + // Sanity check before we attempt to buckle. Is everything still in a kosher state for buckling after the 3 seconds have elapsed? + // Covers situations where, for example, the chair was moved or there's some other issue. + if(!is_user_buckle_possible(M, user, check_loc)) + return FALSE + . = buckle_mob(M, check_loc = check_loc) if(.) if(M == user) @@ -124,10 +213,9 @@ "You buckle yourself to [src].",\ "You hear metal clanking.") else - M.visible_message(\ - "[user] buckles [M] to [src]!",\ + M.visible_message("[user] buckles [M] to [src]!",\ "[user] buckles you to [src]!",\ - "You hear metal clanking.") + "You hear metal clanking.") /atom/movable/proc/user_unbuckle_mob(mob/living/buckled_mob, mob/user) var/mob/living/M = unbuckle_mob(buckled_mob) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index b068255f7a0dc..c310aa00c5423 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -1,5 +1,8 @@ //Anomalies, used for events. Note that these DO NOT work by themselves; their procs are called by the event datum. +/// Chance of taking a step per second +#define ANOMALY_MOVECHANCE 45 + /obj/effect/anomaly name = "anomaly" desc = "A mysterious anomaly, seen commonly only in the region of space that the station orbits..." @@ -7,8 +10,8 @@ density = FALSE anchored = TRUE light_range = 3 - var/movechance = 70 - var/obj/item/assembly/signaler/anomaly/aSignal + + var/obj/item/assembly/signaler/anomaly/aSignal = /obj/item/assembly/signaler/anomaly var/area/impact_area var/lifespan = 990 @@ -41,8 +44,8 @@ countdown.color = countdown_colour countdown.start() -/obj/effect/anomaly/process() - anomalyEffect() +/obj/effect/anomaly/process(delta_time) + anomalyEffect(delta_time) if(death_time < world.time) if(loc) detonate() @@ -51,11 +54,11 @@ /obj/effect/anomaly/Destroy() GLOB.poi_list.Remove(src) STOP_PROCESSING(SSobj, src) - qdel(countdown) + QDEL_NULL(countdown) return ..() -/obj/effect/anomaly/proc/anomalyEffect() - if(prob(movechance)) +/obj/effect/anomaly/proc/anomalyEffect(delta_time) + if(DT_PROB(ANOMALY_MOVECHANCE, delta_time)) step(src,pick(GLOB.alldirs)) /obj/effect/anomaly/proc/detonate() @@ -92,14 +95,14 @@ for(var/obj/O in orange(4, src)) if(!O.anchored) step_towards(O,src) - for(var/mob/living/M in range(0, src)) + for(var/mob/living/M in get_turf(src)) gravShock(M) - for(var/mob/living/M in orange(4, src)) + for(var/mob/living/M in orange(4, get_turf(src))) if(!M.mob_negates_gravity()) step_towards(M,src) - for(var/obj/O in range(0,src)) + for(var/obj/O in get_turf(src)) if(!O.anchored) - var/mob/living/target = locate() in view(4,src) + var/mob/living/target = locate() in hearers(4,src) if(target && !target.stat) O.throw_at(target, 5, 10) @@ -146,7 +149,7 @@ /obj/effect/anomaly/flux/anomalyEffect() ..() canshock = 1 - for(var/mob/living/M in range(0, src)) + for(var/mob/living/M in get_turf(src)) mobShock(M) /obj/effect/anomaly/flux/Crossed(mob/living/M) @@ -192,7 +195,7 @@ /obj/effect/anomaly/bluespace/anomalyEffect() ..() - for(var/mob/living/M in range(1,src)) + for(var/mob/living/M in hearers(1,src)) do_teleport(M, locate(M.x, M.y, M.z), 4, channel = TELEPORT_CHANNEL_BLUESPACE) /obj/effect/anomaly/bluespace/Bumped(atom/movable/AM) @@ -218,10 +221,10 @@ var/turf/TO = get_turf(chosen) // the turf of origin we're travelling TO playsound(TO, 'sound/effects/phasein.ogg', 100, 1) - priority_announce("Massive bluespace translocation detected.", "Anomaly Alert") + priority_announce("Massive bluespace translocation detected.", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) var/list/flashers = list() - for(var/mob/living/carbon/C in viewers(TO, null)) + for(var/mob/living/carbon/C in viewers(TO)) if(C.flash_act()) flashers += C @@ -258,15 +261,18 @@ /obj/effect/anomaly/pyro name = "pyroclastic anomaly" icon_state = "mustard" - var/ticks = 4 + var/ticks = 0 + /// How many seconds between each gas release + var/releasedelay = 10 + aSignal = /obj/item/assembly/signaler/anomaly/pyro -/obj/effect/anomaly/pyro/anomalyEffect() +/obj/effect/anomaly/pyro/anomalyEffect(delta_time) ..() - ticks++ - if(ticks < 5) + ticks += delta_time + if(ticks < releasedelay) return else - ticks = 0 + ticks -= releasedelay var/turf/open/T = get_turf(src) if(istype(T)) T.atmos_spawn_air("o2=5;plasma=5;TEMP=1000") @@ -285,11 +291,8 @@ S.rabid = TRUE S.amount_grown = SLIME_EVOLUTION_THRESHOLD S.Evolve() - - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a pyroclastic anomaly slime?", ROLE_PAI, null, null, 100, S, POLL_IGNORE_PYROSLIME) - if(LAZYLEN(candidates)) - var/mob/dead/observer/chosen = pick(candidates) - S.key = chosen.key + S.flavor_text = FLAVOR_TEXT_EVIL + S.set_playable() ///////////////////// @@ -307,15 +310,13 @@ grav(rand(0,3), rand(2,3), 50, 25) //Throwing stuff around! - for(var/obj/O in range(2,src)) - if(O == src) - return //DON'T DELETE YOURSELF GOD DAMN + for(var/obj/O in orange(2,src)) if(!O.anchored) - var/mob/living/target = locate() in view(4,src) + var/mob/living/target = locate() in hearers(4,src) if(target && !target.stat) O.throw_at(target, 7, 5) else - O.ex_act(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += O /obj/effect/anomaly/bhole/proc/grav(r, ex_act_force, pull_chance, turf_removal_chance) for(var/t = -r, t < r, t++) @@ -334,7 +335,13 @@ if(prob(pull_chance)) for(var/obj/O in T.contents) if(O.anchored) - O.ex_act(ex_act_force) + switch(ex_act_force) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += O + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += O + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += O else step_towards(O,src) for(var/mob/living/M in T.contents) @@ -342,4 +349,10 @@ //Damaging the turf if( T && prob(turf_removal_chance) ) - T.ex_act(ex_act_force) + switch(ex_act_force) + if(EXPLODE_DEVASTATE) + SSexplosions.highturf += T + if(EXPLODE_HEAVY) + SSexplosions.medturf += T + if(EXPLODE_LIGHT) + SSexplosions.lowturf += T diff --git a/code/game/objects/effects/blessing.dm b/code/game/objects/effects/blessing.dm index 8328786d42da9..2bb45924dfdd0 100644 --- a/code/game/objects/effects/blessing.dm +++ b/code/game/objects/effects/blessing.dm @@ -18,10 +18,12 @@ add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/blessedAware, "blessing", I) RegisterSignal(loc, COMSIG_ATOM_INTERCEPT_TELEPORT, .proc/block_cult_teleport) -/obj/effect/blessing/Destroy() +/obj/effect/blessing/Destroy() UnregisterSignal(loc, COMSIG_ATOM_INTERCEPT_TELEPORT) return ..() - + /obj/effect/blessing/proc/block_cult_teleport(datum/source, channel, turf/origin, turf/destination) + SIGNAL_HANDLER + if(channel == TELEPORT_CHANNEL_CULT) return COMPONENT_BLOCK_TELEPORT diff --git a/code/game/objects/effects/bump_teleporter.dm b/code/game/objects/effects/bump_teleporter.dm index 0337b076ff7ec..c3b6169be5b15 100644 --- a/code/game/objects/effects/bump_teleporter.dm +++ b/code/game/objects/effects/bump_teleporter.dm @@ -34,4 +34,4 @@ for(var/obj/effect/bump_teleporter/BT in AllTeleporters) if(BT.id == src.id_target) - AM.forceMove(BT.loc) //Teleport to location with correct id. + do_teleport(AM, BT.loc, no_effects = TRUE, channel = TELEPORT_CHANNEL_FREE) diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 3729a8e5d6227..76705ee6a836a 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -49,6 +49,7 @@ var/original_name desc = "A large piece of space-resistant printed paper." icon = 'icons/obj/contraband.dmi' + layer = ABOVE_WINDOW_LAYER anchored = TRUE var/ruined = FALSE var/random_basetype @@ -437,7 +438,7 @@ icon_state = "poster1_legit" /obj/structure/sign/poster/official/nanotrasen_logo - name = "Nanotrasen Logo" + name = "\improper Nanotrasen logo" desc = "A poster depicting the Nanotrasen logo." icon_state = "poster2_legit" @@ -628,7 +629,7 @@ /obj/structure/sign/poster/official/moth5 name = "Safety Moth - Piping" - desc = "This informational poster uses Safety Moth(TM) to tell atmospheric technicians correct types of piping to be used. Proper pipe placement prevents poor preformance! It's signed by 'AspEv'." + desc = "This informational poster uses Safety Moth(TM) to tell atmospheric technicians correct types of piping to be used. Proper pipe placement prevents poor performance! It's signed by 'AspEv'." icon_state = "poster40_legit" /obj/structure/sign/poster/official/moth6 diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index 72af19ccf1982..a78f612ab3848 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -53,7 +53,7 @@ displayed_text = new_val if(displayed_text) - maptext = "[displayed_text]" + maptext = MAPTEXT("[displayed_text]") else maptext = null @@ -160,20 +160,6 @@ var/time_left = max(0, (H.finish_time - world.time) / 10) return round(time_left) -/obj/effect/countdown/dominator - name = "dominator countdown" - text_size = 1 - color = "#ff00ff" // Overwritten when the dominator starts - -/obj/effect/countdown/dominator/get_value() - var/obj/machinery/dominator/D = attached_to - if(!istype(D)) - return - else if(D.gang && D.gang.domination_time != NOT_DOMINATING) - return D.gang.domination_time_remaining() - else - return "OFFLINE" - /obj/effect/countdown/arena invisibility = 0 name = "arena countdown" diff --git a/code/game/objects/effects/decals/cleanable/food.dm b/code/game/objects/effects/decals/cleanable/food.dm index d45de2bf4b945..89e9251ebb213 100644 --- a/code/game/objects/effects/decals/cleanable/food.dm +++ b/code/game/objects/effects/decals/cleanable/food.dm @@ -32,10 +32,8 @@ /obj/effect/decal/cleanable/food/salt/Crossed(mob/living/L) if(is_species(L, /datum/species/snail) || is_species(L, /datum/species/squid)) - while(L.loc == src.loc) - L.adjustFireLoss(2, TRUE) - to_chat(L, "The salt! It burns!") - sleep(20) + L.adjustFireLoss(10, TRUE) + to_chat(L, "The salt! It burns!") /obj/effect/decal/cleanable/food/flour name = "flour" diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 2e720d9fe331d..bc819abad28be 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -25,8 +25,8 @@ add_blood_DNA(list("Non-human DNA" = random_blood_type())) // Needs to happen before ..() . = ..() icon_state = "[icon_state]-old" //change from the normal blood icon selected from random_icon_states in the parent's Initialize to the old dried up blood. - if(prob(40)) - var/datum/disease/advance/R = new /datum/disease/advance/random(rand(1, 4), rand(4, 9)) + if(prob(75)) + var/datum/disease/advance/R = new /datum/disease/advance/random(rand(3, 6), 9, 4) disease += R /obj/effect/decal/cleanable/blood/old/extrapolator_act(mob/user, var/obj/item/extrapolator/E, scan = TRUE) @@ -65,6 +65,7 @@ layer = LOW_OBJ_LAYER random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") mergeable_decal = FALSE + turf_loc_check = FALSE var/already_rotting = FALSE @@ -82,6 +83,9 @@ desc += " They smell terrible." AddComponent(/datum/component/rot/gibs) +/obj/effect/decal/cleanable/blood/gibs/replace_decal(obj/effect/decal/cleanable/C) + return FALSE //Never fail to place us + /obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target) return @@ -138,8 +142,8 @@ setDir(pick(1,2,4,8)) icon_state += "-old" add_blood_DNA(list("Non-human DNA" = random_blood_type())) - if(prob(50)) - var/datum/disease/advance/R = new /datum/disease/advance/random(rand(1, 6), rand(5, 9)) + if(prob(80)) + var/datum/disease/advance/R = new /datum/disease/advance/random(rand(3, 6), 9, 4) disease += R /obj/effect/decal/cleanable/blood/gibs/old/extrapolator_act(mob/user, var/obj/item/extrapolator/E, scan = TRUE) diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index f3b30e45fe80d..45cd43bd1a7f6 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -149,8 +149,8 @@ /obj/effect/decal/cleanable/vomit/old/Initialize(mapload, list/datum/disease/diseases) . = ..() icon_state += "-old" - if(prob(90))//vomit is much more likely to be diseased than blood is - var/datum/disease/advance/R = new /datum/disease/advance/random(rand(2, 6), 6+(rand(1, 3))) + if(prob(95))//vomit is much more likely to be diseased than blood is + var/datum/disease/advance/R = new /datum/disease/advance/random(rand(3, 6), 9, 4, infected = src) disease += R /obj/effect/decal/cleanable/vomit/old/extrapolator_act(mob/user, var/obj/item/extrapolator/E, scan = TRUE) diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index b75f275d1e77f..5e7e025fbcbd9 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -37,31 +37,3 @@ /obj/effect/decal/cleanable/crayon/NeverShouldHaveComeHere(turf/T) return isgroundlessturf(T) - - -/obj/effect/decal/cleanable/crayon/gang - icon = 'icons/effects/crayondecal.dmi' - layer = ABOVE_NORMAL_TURF_LAYER //Harder to hide - plane = GAME_PLANE - do_icon_rotate = FALSE //These are designed to always face south, so no rotation please. - var/datum/team/gang/gang - -/obj/effect/decal/cleanable/crayon/gang/Initialize(mapload, datum/team/gang/G, e_name = "gang tag", rotation = 0, mob/user) - if(!G) - qdel(src) - return - gang = G - var/newcolor = G.color - var/area/territory = get_area(src) - icon_state = G.name - G.new_territories |= list(territory.type = territory.name) - //If this isn't tagged by a specific gangster there's no bonus income. - ..(mapload, newcolor, icon_state, e_name, rotation) - -/obj/effect/decal/cleanable/crayon/gang/Destroy() - if(gang) - var/area/territory = get_area(src) - gang.territories -= territory.type - gang.new_territories -= territory.type - gang.lost_territories |= list(territory.type = territory.name) - return ..() diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index 803b7250801fa..6f33cf98fa8a4 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -45,4 +45,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_NEVER, color, null, null, alpha) + T.AddElement(/datum/element/decal, icon, icon_state, dir, FALSE, color, TURF_LAYER + (layer - TURF_DECAL_LOWEST_LAYER), null, alpha, FALSE) diff --git a/code/game/objects/effects/decals/turfdecal/markings.dm b/code/game/objects/effects/decals/turfdecal/markings.dm index 6f7c73eb29d55..0045be65804e7 100644 --- a/code/game/objects/effects/decals/turfdecal/markings.dm +++ b/code/game/objects/effects/decals/turfdecal/markings.dm @@ -1,3 +1,6 @@ +/obj/effect/turf_decal/stripes + layer = TURF_DECAL_STRIPE_LAYER + /obj/effect/turf_decal/stripes/line icon_state = "warningline" diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index e119295988408..c28548940d9c1 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -39,8 +39,8 @@ if(hotspot && istype(T) && T.air) qdel(hotspot) var/datum/gas_mixture/G = T.air - var/plas_amt = min(30,G.get_moles(/datum/gas/plasma)) //Absorb some plasma - G.adjust_moles(/datum/gas/plasma, -plas_amt) + var/plas_amt = min(30,G.get_moles(GAS_PLASMA)) //Absorb some plasma + G.adjust_moles(GAS_PLASMA, -plas_amt) absorbed_plasma += plas_amt if(G.return_temperature() > T20C) G.set_temperature(max(G.return_temperature()/2,T20C)) @@ -146,7 +146,7 @@ if(lifetime % reagent_divisor) reagents.reaction(O, VAPOR, fraction) var/hit = 0 - for(var/mob/living/L in range(0,src)) + for(var/mob/living/L in get_turf(src)) hit += foam_mob(L) if(hit) lifetime++ //this is so the decrease from mobs hit and the natural decrease don't cumulate. @@ -318,7 +318,7 @@ for(var/obj/effect/hotspot/H in O) qdel(H) for(var/I in G.get_gases()) - if(I == /datum/gas/oxygen || I == /datum/gas/nitrogen) + if(I == GAS_O2 || I == GAS_N2) continue G.set_moles(I, 0) O.air_update_turf() diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 4bc0d0ec3c2f0..b789f44a06598 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -50,7 +50,7 @@ if(lifetime < 1) kill_smoke() return 0 - for(var/mob/living/L in range(0,src)) + for(var/mob/living/L in get_turf(src)) smoke_mob(L) return 1 @@ -160,29 +160,29 @@ var/weldvents = TRUE var/distcheck = TRUE -/datum/effect_system/smoke_spread/freezing/proc/Chilled(atom/A) - if(isopenturf(A)) - var/turf/open/T = A - if(T.air) - var/datum/gas_mixture/G = T.air - if(!distcheck || get_dist(T, location) < blast) // Otherwise we'll get silliness like people using Nanofrost to kill people through walls with cold air - G.set_temperature(temperature) - T.air_update_turf() - for(var/obj/effect/hotspot/H in T) - qdel(H) - if(G.get_moles(/datum/gas/plasma)) - G.adjust_moles(/datum/gas/nitrogen, G.get_moles(/datum/gas/plasma)) - G.set_moles(/datum/gas/plasma, 0) - if (weldvents) - for(var/obj/machinery/atmospherics/components/unary/U in T) - if(!isnull(U.welded) && !U.welded) //must be an unwelded vent pump or vent scrubber. - U.welded = TRUE - U.update_icon() - U.visible_message("[U] was frozen shut!") - for(var/mob/living/L in T) - L.ExtinguishMob() - for(var/obj/item/Item in T) - Item.extinguish() +/datum/effect_system/smoke_spread/freezing/proc/Chilled(turf/open/T) + if(!istype(T)) + return + if(T.air) + var/datum/gas_mixture/G = T.air + if(!distcheck || get_dist(T, location) < blast) // Otherwise we'll get silliness like people using Nanofrost to kill people through walls with cold air + G.set_temperature(temperature) + T.air_update_turf() + for(var/obj/effect/hotspot/H in T) + qdel(H) + if(G.get_moles(GAS_PLASMA)) + G.adjust_moles(GAS_N2, G.get_moles(GAS_PLASMA)) + G.set_moles(GAS_PLASMA, 0) + if (weldvents) + for(var/obj/machinery/atmospherics/components/unary/U in T) + if(!isnull(U.welded) && !U.welded) //must be an unwelded vent pump or vent scrubber. + U.welded = TRUE + U.update_icon() + U.visible_message("[U] was frozen shut!") + for(var/mob/living/L in T) + L.ExtinguishMob() + for(var/obj/item/Item in T) + Item.extinguish() /datum/effect_system/smoke_spread/freezing/set_up(radius = 5, loca, blast_radius = 0) ..() @@ -190,7 +190,7 @@ /datum/effect_system/smoke_spread/freezing/start() if(blast) - for(var/turf/T in RANGE_TURFS(blast, location)) + for(var/turf/open/T in RANGE_TURFS(blast, location)) Chilled(T) ..() @@ -250,6 +250,9 @@ var/fraction = 1/initial(lifetime) reagents.copy_to(C, fraction*reagents.total_volume) reagents.reaction(M, INGEST, fraction) + if(isapid(C)) + C.SetSleeping(50) // Bees sleep when smoked + M.log_message("breathed in some smoke with reagents [english_list(reagents.reagent_list)]", LOG_ATTACK, null, FALSE) // Do not log globally b/c spam return 1 @@ -287,7 +290,7 @@ var/where = "[AREACOORD(location)]" if(carry.my_atom.fingerprintslast) - var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast) + var/mob/M = get_mob_by_ckey(carry.my_atom.fingerprintslast) var/more = "" if(M) more = "[ADMIN_LOOKUPFLW(M)] " diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index e02dc0e81eed3..2c0e7815958a1 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -7,6 +7,7 @@ move_resist = INFINITY obj_flags = 0 vis_flags = VIS_INHERIT_PLANE + var/forensic_protected = FALSE /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/forcefields.dm b/code/game/objects/effects/forcefields.dm index 384cf73c89e6c..1b13589572de4 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -8,8 +8,10 @@ CanAtmosPass = ATMOS_PASS_DENSITY var/timeleft = 300 //Set to 0 for permanent forcefields (ugh) -/obj/effect/forcefield/Initialize() +/obj/effect/forcefield/Initialize(mapload, ntimeleft) . = ..() + if(isnum_safe(ntimeleft)) + timeleft = ntimeleft if(timeleft) QDEL_IN(src, timeleft) diff --git a/code/game/objects/effects/info.dm b/code/game/objects/effects/info.dm new file mode 100644 index 0000000000000..23f341c8a3c78 --- /dev/null +++ b/code/game/objects/effects/info.dm @@ -0,0 +1,26 @@ +/// An info button that, when clicked, puts some text in the user's chat +/obj/effect/abstract/info + name = "info" + icon = 'icons/effects/effects.dmi' + icon_state = "info" + + /// What should the info button display when clicked? + var/info_text + +/obj/effect/abstract/info/Initialize(mapload, info_text) + . = ..() + + if (!isnull(info_text)) + src.info_text = info_text + +/obj/effect/abstract/info/Click() + . = ..() + to_chat(usr, info_text) + +/obj/effect/abstract/info/MouseEntered() + . = ..() + icon_state = "info_hovered" + +/obj/effect/abstract/info/MouseExited() + . = ..() + icon_state = initial(icon_state) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 343c3d1b384a1..ddd6415810c39 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -41,20 +41,18 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) if(delete_after_roundstart) qdel(src) -/obj/effect/landmark/start/New() +/obj/effect/landmark/start/Initialize() + . = ..() GLOB.start_landmarks_list += src if(jobspawn_override) - if(!GLOB.jobspawn_overrides[name]) - GLOB.jobspawn_overrides[name] = list() - GLOB.jobspawn_overrides[name] += src - ..() + LAZYADDASSOC(GLOB.jobspawn_overrides, name, src) if(name != "start") tag = "start*[name]" /obj/effect/landmark/start/Destroy() GLOB.start_landmarks_list -= src if(jobspawn_override) - GLOB.jobspawn_overrides[name] -= src + LAZYREMOVEASSOC(GLOB.jobspawn_overrides, name, src) return ..() // START LANDMARKS FOLLOW. Don't change the names unless @@ -103,6 +101,10 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) name = "Shaft Miner" icon_state = "Shaft Miner" +/obj/effect/landmark/start/exploration + name = "Exploration Crew" + icon_state = "Exploration Crew" + /obj/effect/landmark/start/security_officer name = "Security Officer" icon_state = "Security Officer" @@ -214,8 +216,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) /obj/effect/landmark/start/randommaint name = "maintjobstart" - icon_state = "x3" - var/job = "Gimmick" //put the title of the job here. + icon_state = "x3" + var/job = "Gimmick" //put the title of the job here. /obj/effect/landmark/start/randommaint/New() //automatically opens up a job slot when the job's spawner loads in ..() @@ -234,7 +236,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) /obj/effect/landmark/start/randommaint/hobo name = "Debtor" job = "Debtor" - + /obj/effect/landmark/start/randommaint/shrink name = "Psychiatrist" job = "Psychiatrist" @@ -341,7 +343,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) GLOB.xeno_spawn += loc return INITIALIZE_HINT_QDEL -//objects with the stationloving component (nuke disk) respawn here. +//objects with the stationloving component (nuke disk) respawn here. //also blobs that have their spawn forcemoved (running out of time when picking their spawn spot), santa and respawning devils /obj/effect/landmark/blobstart name = "blobstart" diff --git a/code/game/objects/effects/mainttraps.dm b/code/game/objects/effects/mainttraps.dm index 483e67d0e617e..ed9b0aec06011 100644 --- a/code/game/objects/effects/mainttraps.dm +++ b/code/game/objects/effects/mainttraps.dm @@ -9,7 +9,7 @@ icon_state = "gavelblock" invisibility = INVISIBILITY_MAXIMUM //sorry ghosts and curators, my tricks will remain hidden var/reusable = FALSE //can it trigger more than once - var/inuse = FALSE //used to make sure it dont get used when it shouldnt + var/inuse = FALSE //used to make sure it dont get used when it shouldn't /obj/effect/trap/proc/TrapEffect(AM) return TRUE @@ -20,7 +20,6 @@ var/grounded = FALSE //does it ignore fliers var/pick_style = PICK_STYLE_ORDERED var/requirehuman = TRUE - var/list/possibletraps = list() /obj/effect/trap/trigger/Crossed(AM as mob|obj) if(isturf(loc)) @@ -44,14 +43,14 @@ /obj/effect/trap/trigger/TrapEffect(AM) if(inuse) return FALSE - else + else inuse = TRUE + var/list/possibletraps = list() + for(var/obj/effect/trap/nexus/payload in view(10, src)) + possibletraps += payload if(!LAZYLEN(possibletraps)) - for(var/obj/effect/trap/nexus/payload in view(10, src)) - possibletraps += payload - if(!LAZYLEN(possibletraps)) - qdel(src) - return FALSE + qdel(src) + return FALSE switch(pick_style) if(PICK_STYLE_RANDOM) var/obj/effect/trap/nexus/chosen = pick(possibletraps) @@ -98,7 +97,7 @@ pick_style = PICK_STYLE_RANDOM /obj/effect/trap/nexus //this trap is triggered by pressurepads. doesnt do anything alone - icon_state = "madeyoulook" + icon_state = "madeyoulook" /obj/effect/trap/nexus/doorbolt //a nasty little trap to put in a room with a simplemob name = "door bolter" @@ -108,7 +107,7 @@ /obj/effect/trap/nexus/doorbolt/TrapEffect(AM) if(inuse) return FALSE - else + else inuse = TRUE var/list/airlocks = list() for(var/obj/machinery/door/airlock/airlock in view(10, src)) @@ -138,6 +137,8 @@ FC.force_target(C) FC.dontkill = TRUE FC.delete_after_target_killed = TRUE //it only affects the one to walk on the rune. when he dies, the rune is no longer usable + message_admins("A hugbox floor cluwne has been spawned at [COORD(T)][ADMIN_JMP(T)] following [ADMIN_LOOKUPFLW(C)]") + log_game("A hugbox floor cluwne has been spawned at [COORD(T)]") playsound(C,'sound/misc/honk_echo_distant.ogg', 30, 1) return TRUE return FALSE @@ -175,25 +176,19 @@ var/list/mobss = list() var/list/validturfs = list() var/turf/T = get_turf(src) - for(var/atom/I in view(7, src)) - if(isopenturf(I)) - turfs += I - continue - if(isliving(I)) - var/mob/living/L = I - if(L.mind) - mobss += L - continue - for(var/turf/turf in turfs) + for(var/turf/open/O in view(7, src)) + if(!isspaceturf(O)) + turfs += O + for(var/mob/living/L in view(7, src)) + if(L.mind) + mobss += L + for(var/turf/turf as() in turfs) var/visible = FALSE - if(isspaceturf(turf)) - continue - for(var/mob/living/L in mobss) + for(var/mob/living/L as() in mobss) if(can_see(L, turf)) visible = TRUE - if(visible) - continue - validturfs += T + if(!visible) + validturfs += T if(validturfs.len) T = pick(validturfs) if(mobs) @@ -201,7 +196,7 @@ spawninstance.target = AM if(istype(spawninstance, /mob/living/simple_animal/hostile/retaliate)) var/mob/living/simple_animal/hostile/retaliate/R = spawninstance - R.enemies += AM + R.enemies += AM mobs-- crossattempts = rand(1, 5) if(!mobs) @@ -213,7 +208,7 @@ spawned = /mob/living/simple_animal/hostile/cat_butcherer/hugbox /obj/effect/trap/nexus/trickyspawner/faithless - spawned = /mob/living/simple_animal/hostile/faithless + spawned = /mob/living/simple_animal/hostile/faithless /obj/effect/trap/nexus/trickyspawner/shitsec spawned = /mob/living/simple_animal/hostile/nanotrasen/hugbox @@ -231,7 +226,7 @@ spawned = /mob/living/simple_animal/hostile/alien/hugbox /obj/effect/trap/nexus/trickyspawner/honkling - mobs = 5 //honklings are annoying, but nearly harmless. + mobs = 5 //honklings are annoying, but nearly harmless. spawned = /mob/living/simple_animal/hostile/retaliate/clown/honkling /obj/effect/trap/nexus/trickyspawner/clownmutant @@ -248,19 +243,26 @@ /mob/living/simple_animal/hostile/nanotrasen/hugbox loot = list(/obj/effect/gibspawner/human)//no gamer gear, sorry! + mobchatspan = "headofsecurity" + del_on_death = TRUE /mob/living/simple_animal/hostile/zombie/hugbox melee_damage = 12 //zombies have a base of 21, a bit much stat_attack = CONSCIOUS + mobchatspan = "chaplain" + discovery_points = 1000 /mob/living/simple_animal/hostile/alien/hugbox health = 60 //they go down easy, to lull the player into a sense of false security - maxHealth = 60 + maxHealth = 60 + mobchatspan = "researchdirector" + discovery_points = 1000 /mob/living/simple_animal/hostile/cat_butcherer/hugbox //a cat butcher without a melee speed buff or a syringe gun. he's not too hard to take down, but can still go on catification rampages ranged = FALSE rapid_melee = 1 loot = list(/obj/effect/mob_spawn/human/corpse/cat_butcher, /obj/item/circular_saw) + mobchatspan = "medicaldoctor" //this abomination goes in here because it doesnt really belong with normal cult runes /obj/effect/rune/cluwne @@ -269,7 +271,7 @@ cultist_name = "Invocation rune" cultist_desc = "tears apart dimensional barriers, allowing a powerful elder being to exert its will upon the world. Requires at least nine invokers" //only shown to cultists, it does not actually require nine invokers if not used by cultists invocation = "HONK!!" - req_cultists = 9//if a cultist invokes this, it acts like an invocation rune by asking them to check this. + req_cultists = 9//if a cultist invokes this, it acts like an invocation rune by asking them to check this. icon = 'icons/effects/96x96.dmi' icon_state = "Cluwne" color = RUNE_COLOR_SUMMON @@ -281,7 +283,7 @@ if(istype(I, /obj/item/melee/cultblade/dagger) && iscultist(user)) SEND_SOUND(user,'sound/items/sheath.ogg') if(do_after(user, 15, target = src)) - to_chat(user, "It's not within your power to erase the [lowertext(cultist_name)].") + to_chat(user, "It's not within your power to erase the [lowertext(cultist_name)].") else if(istype(I, /obj/item/nullrod)) user.say("BEGONE FOUL MAGIKS!!", forced = "nullrod") to_chat(user, "You try to disrupt the magic of [src] with the [I], and nothing happens to the crude crayon markings. You feel foolish.") @@ -290,9 +292,8 @@ var/cluwne = FALSE if(rune_in_use) return - for(var/mob/living/simple_animal/hostile/floor_cluwne/clown in range(5, src)) + if(locate(/mob/living/simple_animal/hostile/floor_cluwne) in range(5, src)) cluwne = TRUE - break if(!cluwne && !iscultist(user)) if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -330,9 +331,8 @@ return if(istype(M, /mob/living/simple_animal/cluwne) || istype(M, /mob/living/simple_animal/hostile/retaliate/clown)) var/cluwne = FALSE - for(var/mob/living/simple_animal/hostile/floor_cluwne/clown in range(5, src)) + if(locate(/mob/living/simple_animal/hostile/floor_cluwne) in range(5, src)) cluwne = TRUE - break if(!cluwne) to_chat(M, "We need a connection! One of the honkmother's manifested forms!") else @@ -342,11 +342,8 @@ /obj/effect/rune/cluwne/can_invoke(user) //this is actually used to get "sacrifices", which can include the user var/list/invokers = list() //people eligible to invoke the rune - var/list/things_in_range = range(1, src) - for(var/mob/living/carbon/human/L in things_in_range) - if(!L.mind) - continue - if(L.stat) + for(var/mob/living/carbon/human/L in range(1, src)) + if(!L.mind || L.stat) continue invokers += L return invokers @@ -354,14 +351,16 @@ /obj/effect/rune/cluwne/invoke(var/list/invokers) ..() rune_in_use = TRUE - for(var/mob/living/simple_animal/hostile/floor_cluwne/FC in range(5, src)) //we unleash the floor cluwne + for(var/mob/living/simple_animal/hostile/floor_cluwne/FC in range(5, src)) //we unleash the floor cluwne FC.dontkill = FALSE FC.delete_after_target_killed = FALSE FC.interest = 300 color = RUNE_COLOR_SUMMON - for(var/mob/living/carbon/C in view(10, src)) + for(var/mob/living/carbon/C in hearers(10, src)) C.Stun(350, ignore_canstun = TRUE) - priority_announce("Figments of an elder god have been detected in your sector. Exercise extreme caution, and abide by the 'buddy system' at all times.","Central Command Higher Dimensional Affairs", 'sound/ai/spanomalies.ogg') + priority_announce("Figments of an elder god have been detected in your sector. Exercise extreme caution, and abide by the 'buddy system' at all times.","Central Command Higher Dimensional Affairs", ANNOUNCER_SPANOMALIES) + message_admins("A dangerous cluwne rune was invoked at [AREACOORD(src)][ADMIN_COORDJMP(src)]") + log_game("A dangerous cluwne rune was invoked at [AREACOORD(src)][ADMIN_COORDJMP(src)]") stoplag(315) for(var/mob/living/carbon/human/H in invokers) if(H.stat == DEAD) @@ -373,17 +372,26 @@ cluwne.stage = 4 if(prob(75)) cluwne.delete_after_target_killed = TRUE - to_chat(H, "YOU'RE MINE!") + to_chat(H, "YOU'RE MINE!") + message_admins("A floor cluwne has been spawned by rune at [AREACOORD(src)][ADMIN_COORDJMP(src)] following [ADMIN_LOOKUPFLW(H)]. It [cluwne.delete_after_target_killed ? "will" : "will not"] kill additional people") + log_game("A floor cluwne has been spawned by rune at [AREACOORD(src)] following [ADMIN_LOOKUP(H)]. It [cluwne.delete_after_target_killed ? "will" : "will not"] kill additional people") + H.log_message("was targetted by cluwne from rune", LOG_ATTACK) + else if(prob(20)) var/mob/living/simple_animal/hostile/floor_cluwne/cluwne = new(src.loc) cluwne.force_target(H) if(prob(75)) cluwne.delete_after_target_killed = TRUE - to_chat(H, "Do you want to play a game?") + to_chat(H, "Do you want to play a game?") + message_admins("A floor cluwne has been spawned by rune at [AREACOORD(src)][ADMIN_COORDJMP(src)] following [ADMIN_LOOKUPFLW(H)]. It [cluwne.delete_after_target_killed ? "will" : "will not"] kill additional people") + log_game("A floor cluwne has been spawned by rune at [AREACOORD(src)] following [ADMIN_LOOKUP(H)]. It [cluwne.delete_after_target_killed ? "will" : "will not"] kill additional people") + H.log_message("was targetted by cluwne from rune", LOG_ATTACK) else if(prob(60)) H.cluwneify() - to_chat(H, "Join us!") + H.log_message("was cluwned by rune", LOG_ATTACK) + + to_chat(H, "Join us!") else - to_chat(H, "You bore me.") + to_chat(H, "You bore me.") sound_to_playing_players('sound/misc/honk_echo_distant.ogg') - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 713e25c4e339d..eee617229726a 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -32,7 +32,7 @@ /obj/item/deployablemine/honk name = "deployable honkblaster 1000" - desc = "An advanced pranking landmine for clowns, honk! Delivers an extra loud HONK to the head when triggered. It can be planted to arm it, or have its sound customised with a sound synthesiser." + desc = "An advanced pranking landmine for clowns, honk! Delivers an extra loud HONK to the head when triggered. It can be planted to arm it, or have its sound customised with a sound synthesiser." mine_type = /obj/effect/mine/sound /obj/item/deployablemine/traitor @@ -92,7 +92,7 @@ anchored = TRUE icon = 'icons/obj/items_and_weapons.dmi' icon_state = "uglymine" - var/triggered = 0 + var/triggered = FALSE var/smartmine = 0 var/disarm_time = 200 var/disarm_product = /obj/item/deployablemine // ie what drops when the mine is disarmed @@ -108,20 +108,20 @@ /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)) - checksmartmine(AM) - else - triggermine(AM) +/obj/effect/mine/Crossed(atom/movable/AM as mob|obj) + if(!isturf(loc) || AM.throwing || (AM.movement_type & (FLYING | FLOATING)) || !AM.has_gravity()) + return + . = ..() + if(ismob(AM)) + checksmartmine(AM) + else + triggermine(AM) /obj/effect/mine/proc/checksmartmine(mob/target) if(target) if(!(target && HAS_TRAIT(target, TRAIT_MINDSHIELD))) triggermine(target) - if(smartmine == 0 || istype(target.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) //tinfoil hat prevents detection of implants + if(smartmine == 0 || istype(target.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) //tinfoil hat prevents detection of implants triggermine(target) /obj/effect/mine/proc/triggermine(mob/victim) @@ -131,10 +131,14 @@ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(3, 1, src) s.start() - mineEffect(victim) triggered = 1 + mineEffect(victim) + SEND_SIGNAL(src, COMSIG_MINE_TRIGGERED, victim) 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" @@ -196,11 +200,24 @@ disarm_product = /obj/item/deployablemine/heavy + /obj/effect/mine/stun/mineEffect(mob/living/victim) if(isliving(victim)) victim.adjustStaminaLoss(stun_time) victim.adjustBruteLoss(damage) +/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" @@ -245,7 +262,7 @@ if(istype(J, /obj/item/soundsynth)) to_chat(user, "You change the sound settings of the [src].") sound = J.selected_sound - + /obj/effect/mine/sound/bwoink name = "bwoink mine" @@ -277,38 +294,41 @@ desc = "You feel angry just looking at it." duration = 1200 //2min color = "#FF0000" + var/mob/living/doomslayer + var/obj/item/chainsaw/doomslayer/chainsaw /obj/effect/mine/pickup/bloodbath/mineEffect(mob/living/carbon/victim) if(!victim.client || !istype(victim)) return to_chat(victim, "RIP AND TEAR") - var/old_color = victim.client.color - var/static/list/red_splash = list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0) - var/static/list/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0) spawn(0) new /datum/hallucination/delusion(victim, TRUE, "demon",duration,0) - var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc) + chainsaw = new(victim.loc) victim.log_message("entered a blood frenzy", LOG_ATTACK) ADD_TRAIT(chainsaw, TRAIT_NODROP, CHAINSAW_FRENZY_TRAIT) victim.drop_all_held_items() victim.put_in_hands(chainsaw, forced = TRUE) chainsaw.attack_self(victim) - chainsaw.wield(victim) victim.reagents.add_reagent(/datum/reagent/medicine/adminordrazine,25) to_chat(victim, "KILL, KILL, KILL! YOU HAVE NO ALLIES ANYMORE, KILL THEM ALL!") - victim.client.color = pure_red - animate(victim.client,color = red_splash, time = 10, easing = SINE_EASING|EASE_OUT) - sleep(10) - animate(victim.client,color = old_color, time = duration)//, easing = SINE_EASING|EASE_OUT) - sleep(duration) - to_chat(victim, "Your bloodlust seeps back into the bog of your subconscious and you regain self control.") - qdel(chainsaw) - victim.log_message("exited a blood frenzy", LOG_ATTACK) - qdel(src) + var/datum/client_colour/colour = victim.add_client_colour(/datum/client_colour/bloodlust) + QDEL_IN(colour, 11) + doomslayer = victim + RegisterSignal(src, COMSIG_PARENT_QDELETING, .proc/end_blood_frenzy) + QDEL_IN(WEAKREF(src), duration) + +/obj/effect/mine/pickup/bloodbath/proc/end_blood_frenzy() + SIGNAL_HANDLER + + if(doomslayer) + to_chat(doomslayer, "Your bloodlust seeps back into the bog of your subconscious and you regain self control.") + doomslayer.log_message("exited a blood frenzy", LOG_ATTACK) + if(chainsaw) + qdel(chainsaw) /obj/effect/mine/pickup/healing name = "Blue Orb" diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index b7ded01d5a21a..3bd43e44fb37d 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -40,10 +40,6 @@ density = TRUE layer = FLY_LAYER -/obj/effect/supplypod_selector - icon_state = "supplypod_selector" - layer = FLY_LAYER - //Makes a tile fully lit no matter what /obj/effect/fullbright icon = 'icons/effects/alphacolors.dmi' diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 1caad4b499d42..892bb73706dbe 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -52,6 +52,19 @@ 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 + vis_flags = VIS_INHERIT_ID + +/obj/effect/overlay/airlock_part + anchored = TRUE + plane = FLOAT_PLANE + layer = FLOAT_LAYER - 1 + vis_flags = VIS_INHERIT_ID + var/side_id + var/open_px = 0 + var/open_py = 0 + var/move_start_time = 0 // for opening; closing uses reversed. + var/move_end_time = 3.5 + var/aperture_angle = 0 /obj/effect/overlay/timer name = "timer overlay" diff --git a/code/game/objects/effects/proximity.dm b/code/game/objects/effects/proximity.dm index 607921d5625d6..5675e592bec6c 100644 --- a/code/game/objects/effects/proximity.dm +++ b/code/game/objects/effects/proximity.dm @@ -36,6 +36,8 @@ return ..() /datum/proximity_monitor/proc/HandleMove() + SIGNAL_HANDLER + var/atom/_host = host var/atom/new_host_loc = _host.loc if(last_host_loc != new_host_loc) @@ -107,6 +109,8 @@ return INITIALIZE_HINT_QDEL /obj/effect/abstract/proximity_checker/Destroy() + if(monitor.checkers) + monitor.checkers -= src monitor = null return ..() diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm index c520c27d0e97b..fb92e31f1e9ac 100644 --- a/code/game/objects/effects/spawners/bombspawner.dm +++ b/code/game/objects/effects/spawners/bombspawner.dm @@ -1,6 +1,6 @@ #define CELSIUS_TO_KELVIN(T_K) ((T_K) + T0C) -#define OPTIMAL_TEMP_K_PLA_BURN_SCALE(PRESSURE_P,PRESSURE_O,TEMP_O) (((PRESSURE_P) * GLOB.meta_gas_info[/datum/gas/plasma][META_GAS_SPECIFIC_HEAT]) / (((PRESSURE_P) * GLOB.meta_gas_info[/datum/gas/plasma][META_GAS_SPECIFIC_HEAT] + (PRESSURE_O) * GLOB.meta_gas_info[/datum/gas/oxygen][META_GAS_SPECIFIC_HEAT]) / PLASMA_UPPER_TEMPERATURE - (PRESSURE_O) * GLOB.meta_gas_info[/datum/gas/oxygen][META_GAS_SPECIFIC_HEAT] / CELSIUS_TO_KELVIN(TEMP_O))) +#define OPTIMAL_TEMP_K_PLA_BURN_SCALE(PRESSURE_P,PRESSURE_O,TEMP_O) (((PRESSURE_P) * GLOB.gas_data.specific_heats[GAS_PLASMA]) / (((PRESSURE_P) * GLOB.gas_data.specific_heats[GAS_PLASMA] + (PRESSURE_O) * GLOB.gas_data.specific_heats[GAS_O2]) / PLASMA_UPPER_TEMPERATURE - (PRESSURE_O) * GLOB.gas_data.specific_heats[GAS_O2] / CELSIUS_TO_KELVIN(TEMP_O))) #define OPTIMAL_TEMP_K_PLA_BURN_RATIO(PRESSURE_P,PRESSURE_O,TEMP_O) (CELSIUS_TO_KELVIN(TEMP_O) * PLASMA_OXYGEN_FULLBURN * (PRESSURE_P) / (PRESSURE_O)) /obj/effect/spawner/newbomb @@ -19,10 +19,10 @@ var/obj/item/tank/internals/plasma/PT = new(V) var/obj/item/tank/internals/oxygen/OT = new(V) - PT.air_contents.set_moles(/datum/gas/plasma, pressure_p*PT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_p))) + PT.air_contents.set_moles(GAS_PLASMA, pressure_p*PT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_p))) PT.air_contents.set_temperature(CELSIUS_TO_KELVIN(temp_p)) - OT.air_contents.set_moles(/datum/gas/oxygen, pressure_o*OT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_o))) + OT.air_contents.set_moles(GAS_O2, pressure_o*OT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_o))) OT.air_contents.set_temperature(CELSIUS_TO_KELVIN(temp_o)) V.tank_one = PT diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index 35a1bb0c7b513..b6809d945f7e0 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -19,7 +19,7 @@ stack_trace("Gib list dir length mismatch!") return - var/obj/effect/decal/cleanable/blood/gibs/gib = null + var/obj/effect/decal/cleanable/blood/gib = null if(sound_to_play && isnum_safe(sound_vol)) playsound(src, sound_to_play, sound_vol, TRUE) @@ -31,7 +31,7 @@ var/list/dna_to_add //find the dna to pass to the spawned gibs. do note this can be null if the mob doesn't have blood. add_blood_DNA() has built in null handling. - if(source_mob) + if(source_mob && ismob(source_mob)) //probably a good idea to check if IT IS a mob. dna_to_add = source_mob.get_blood_dna_list() //ez pz else if(gib_mob_type) var/mob/living/temp_mob = new gib_mob_type(src) //generate a fake mob so that we pull the right type of DNA for the gibs. @@ -52,7 +52,15 @@ var/list/directions = gibdirections[i] if(isturf(loc)) if(directions.len) - gib.streak(directions) + if(istype(gib, /obj/effect/decal/cleanable/blood/gibs)) + var/obj/effect/decal/cleanable/blood/gibs/G = gib + G.streak(directions) + else if(istype(gib, /obj/effect/decal/cleanable/xenoblood/xgibs)) + var/obj/effect/decal/cleanable/xenoblood/xgibs/G = gib + G.streak(directions) + else if(istype(gib, /obj/effect/decal/cleanable/robot_debris)) + var/obj/effect/decal/cleanable/xenoblood/xgibs/G = gib + G.streak(directions) return INITIALIZE_HINT_QDEL @@ -67,6 +75,9 @@ gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list()) return ..() +/obj/effect/gibspawner/generic/bloodtomato + gibtypes = list(/obj/effect/decal/cleanable/blood/splatter, /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/blood/gibs) + /obj/effect/gibspawner/generic/animal gib_mob_type = /mob/living/simple_animal/pet diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 0b7dbbf50dee1..92a004f583dce 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -49,7 +49,7 @@ lootdoubles = FALSE loot = list( - /obj/item/gun/ballistic/automatic/pistol = 8, + /obj/item/gun/ballistic/automatic/pistol/locker = 8, /obj/item/gun/ballistic/shotgun/automatic/combat = 3, /obj/item/gun/ballistic/revolver/mateba, /obj/item/gun/ballistic/automatic/pistol/deagle, @@ -115,6 +115,13 @@ /obj/effect/spawner/lootdrop/maintenance/Initialize(mapload) loot = GLOB.maintenance_loot + + if(HAS_TRAIT(SSstation, STATION_TRAIT_FILLED_MAINT)) + lootcount = FLOOR(lootcount * 1.5, 1) + + else if(HAS_TRAIT(SSstation, STATION_TRAIT_EMPTY_MAINT)) + lootcount = FLOOR(lootcount * 0.5, 1) + . = ..() /obj/effect/spawner/lootdrop/maintenance/two @@ -192,7 +199,7 @@ /obj/item/organ/tongue/snail = 1, /obj/item/organ/appendix = 5, /obj/effect/gibspawner/human = 1, - /obj/item/organ/wings = 1, + /obj/item/organ/wings = 1, /obj/item/organ/wings/moth = 1, /obj/item/organ/wings/bee = 1, /obj/item/organ/wings/dragon/fake = 1) @@ -216,10 +223,38 @@ /obj/item/organ/vocal_cords/adamantine = 1, /obj/effect/gibspawner/xeno = 1, /obj/effect/mob_spawn/human/corpse/assistant = 1, - /obj/effect/mob_spawn/teratomamonkey = 5, + /obj/effect/mob_spawn/teratomamonkey = 1, /obj/item/organ/wings/moth/robust = 1, /obj/item/organ/wings/dragon = 1) +/obj/effect/spawner/lootdrop/teratoma/robot + name = "robotic teratoma spawner" + loot = list( + /obj/item/organ/ears/robot = 5, + /obj/item/organ/eyes/robotic = 5, + /obj/item/organ/eyes/robotic/flashlight = 1, + /obj/item/organ/eyes/night_vision = 1, + /obj/item/organ/liver/cybernetic = 4, + /obj/item/organ/liver/cybernetic/upgraded/ipc = 3, + /obj/item/organ/lungs/cybernetic = 4, + /obj/item/organ/lungs/cybernetic/upgraded= 2, + /obj/item/organ/stomach/battery/ipc = 4, + /obj/item/organ/heart/clockwork = 6, + /obj/item/organ/stomach/clockwork = 6, + /obj/item/organ/liver/clockwork = 6, + /obj/item/organ/lungs/clockwork = 6, + /obj/item/organ/tail/clockwork = 6, + /obj/item/organ/adamantine_resonator = 1, + /obj/item/organ/eyes/robotic/thermals = 2, + /obj/item/organ/heart/gland/viral = 1, + /obj/item/organ/eyes/robotic/shield = 2, + /obj/item/organ/eyes/robotic/glow = 2, + /obj/item/organ/heart/cybernetic = 2, + /obj/item/organ/wings/cybernetic = 2, + /obj/item/organ/tongue/robot/clockwork/better = 2, + /obj/effect/gibspawner/robot = 4, + /obj/item/drone_shell = 1) + /obj/effect/spawner/lootdrop/teratoma/major/clown name = "funny teratoma spawner" loot = list( @@ -232,13 +267,23 @@ /obj/item/bikehorn = 5, /obj/item/reagent_containers/food/snacks/pie/cream = 3) - /obj/effect/spawner/lootdrop/two_percent_xeno_egg_spawner name = "2% chance xeno egg spawner" loot = list( /obj/effect/decal/remains/xeno = 49, /obj/effect/spawner/xeno_egg_delivery = 1) +/obj/effect/spawner/lootdrop/two_percent_xeno_egg_spawner/Initialize() + if(prob(40) && SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) + loot = list(/obj/effect/spawner/xeno_egg_delivery_troll = 1) + . = ..() + +/obj/effect/spawner/lootdrop/ten_percent_girlfriend_spawner + name = "10% chance girlfriend spawner" + loot = list( + /mob/living/simple_animal/pet/dog/corgi = 9, + /mob/living/simple_animal/pet/dog/corgi/Lisa = 1) + /obj/effect/spawner/lootdrop/sanitarium name = "patient spawner" loot = list( @@ -255,7 +300,7 @@ /mob/living/simple_animal/hostile/retaliate/spaceman = 2, /obj/effect/mob_spawn/human/corpse/assistant/brainrot_infection = 1, /mob/living/simple_animal/hostile/retaliate/frog = 2) - + /obj/effect/spawner/lootdrop/costume name = "random costume spawner" @@ -456,3 +501,18 @@ /obj/effect/trap/nexus/trickyspawner/clownmutant = 2, /obj/effect/trap/nexus/trickyspawner/honkling = 3, /obj/effect/trap/nexus/cluwnecurse = 1) + +/obj/effect/spawner/lootdrop/megafaunaore + name = "megafauna ore drop" + lootcount = 100 + lootdoubles = TRUE + loot = list( + /obj/item/stack/ore/iron = 5, + /obj/item/stack/ore/glass/basalt = 5, + /obj/item/stack/ore/plasma = 3, + /obj/item/stack/ore/silver = 3, + /obj/item/stack/ore/gold = 3, + /obj/item/stack/ore/copper = 3, + /obj/item/stack/ore/titanium = 2, + /obj/item/stack/ore/uranium = 2, + /obj/item/stack/ore/diamond = 2) diff --git a/code/game/objects/effects/spawners/xeno_egg_delivery.dm b/code/game/objects/effects/spawners/xeno_egg_delivery.dm index 9be52dab5295a..c619504937c0d 100644 --- a/code/game/objects/effects/spawners/xeno_egg_delivery.dm +++ b/code/game/objects/effects/spawners/xeno_egg_delivery.dm @@ -15,5 +15,23 @@ message_admins("An alien egg has been delivered to [ADMIN_VERBOSEJMP(T)].") log_game("An alien egg has been delivered to [AREACOORD(T)]") var/message = "Attention [station_name()], we have entrusted you with a research specimen in [get_area_name(T, TRUE)]. Remember to follow all safety precautions when dealing with the specimen." - SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/addtimer, CALLBACK(GLOBAL_PROC, /proc/print_command_report, message), announcement_time)) + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/_addtimer, CALLBACK(GLOBAL_PROC, /proc/print_command_report, message), announcement_time)) + return INITIALIZE_HINT_QDEL + +/obj/effect/spawner/xeno_egg_delivery_troll //We're doing big amount of trolling + name = "\"xeno egg\" delivery" + icon = 'icons/mob/mask.dmi' + icon_state = "clown" + var/announcement_time = 1000 + +/obj/effect/spawner/xeno_egg_delivery_troll/Initialize(mapload) + ..() + var/turf/T = get_turf(src) + new /obj/structure/alien/egg/troll(T) + playsound(T, 'sound/items/bikehorn.ogg', 60, 0, 0) + + message_admins("\"A joke\" has been delivered to [ADMIN_VERBOSEJMP(T)].") + log_game("\"A joke\" has been delivered to [AREACOORD(T)]") + var/message = "Attention [station_name()], we have entrusted you with a research specimen in [get_area_name(T, TRUE)]. Remember to follow all safety precautions when dealing with the specimen." + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/_addtimer, CALLBACK(GLOBAL_PROC, /proc/print_command_report, message), announcement_time)) return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index fbbfcab41c32c..53209907c7c16 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -65,10 +65,10 @@ START_PROCESSING(SSobj, src) . = ..() -/obj/structure/spider/eggcluster/process() - amount_grown += rand(0,2) +/obj/structure/spider/eggcluster/process(delta_time) + amount_grown += rand(0,1) * delta_time if(amount_grown >= 100) - var/num = rand(3,12) + var/num = round(rand(1.5, 6) * delta_time) for(var/i=0, i\The [src] skitters[pick(" away"," around","")].
      ") @@ -194,8 +193,8 @@ S.faction = faction.Copy() S.directive = directive if(player_spiders) - S.playable_spider = TRUE - notify_ghosts("Spider [S.name] can be controlled", null, enter_link="(Click to play)", source=S, action=NOTIFY_ATTACK, ignore_key = POLL_IGNORE_SPIDER) + S.set_playable() + S.flavor_text = FLAVOR_TEXT_GOAL_ANTAG qdel(src) diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index 18b2e61c97767..019dd883be17b 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -71,7 +71,7 @@ if(tiles) if(curtiles >= tiles) break - if(AM.z != src.z) + if(AM.get_virtual_z_level() != src.get_virtual_z_level()) break curtiles++ diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 4e7faa18dac5f..7328959094c2c 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -545,17 +545,6 @@ icon_state = "shield-flash" duration = 5 -/obj/effect/temp_visual/dir_setting/space_wind - icon = 'icons/effects/atmospherics.dmi' - icon_state = "space_wind" - layer = FLY_LAYER - duration = 20 - mouse_opacity = 0 - -/obj/effect/temp_visual/dir_setting/space_wind/Initialize(mapload, set_dir, set_alpha = 255) - . = ..() - alpha = set_alpha - /obj/effect/temp_visual/vent_wind icon = 'icons/effects/atmospherics.dmi' icon_state = "vent_wind" diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index afc70a0eeaed8..b14cb4e09e980 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -6,7 +6,7 @@ epicenter = get_turf(epicenter.loc) if(log) - message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") + message_admins("EMP with size ([heavy_range], [light_range]) in [ADMIN_VERBOSEJMP(epicenter)] ") log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") if(heavy_range > 1) @@ -15,18 +15,17 @@ if(heavy_range > light_range) light_range = heavy_range - for(var/A in spiral_range(light_range, epicenter)) - var/atom/T = A - var/distance = get_dist(epicenter, T) + for(var/atom/A as() in spiral_range(light_range, epicenter)) + var/distance = get_dist(epicenter, A) if(distance < 0) distance = 0 if(distance < heavy_range) - T.emp_act(EMP_HEAVY) + A.emp_act(EMP_HEAVY) else if(distance == heavy_range) if(prob(50)) - T.emp_act(EMP_HEAVY) + A.emp_act(EMP_HEAVY) else - T.emp_act(EMP_LIGHT) + A.emp_act(EMP_LIGHT) else if(distance <= light_range) - T.emp_act(EMP_LIGHT) - return 1 \ No newline at end of file + A.emp_act(EMP_LIGHT) + return 1 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 5d5dec234f93e..cbe1625bc92aa 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1,3 +1,7 @@ +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 + GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/effects/fire.dmi', "fire")) GLOBAL_VAR_INIT(rpg_loot_items, FALSE) @@ -7,7 +11,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /obj/item name = "item" icon = 'icons/obj/items_and_weapons.dmi' - + blocks_emissive = EMISSIVE_BLOCK_GENERIC /// The icon state for the icons that appear in the players hand while holding it. Gotten from /client/var/lefthand_file and /client/var/righthand_file var/item_state = null /// The icon for holding in hand icon states for the left hand. @@ -115,13 +119,17 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/list/attack_verb /// list() of species types, if a species cannot put items in a certain slot, but species type is in list, it will be able to wear that item var/list/species_exception = null - - var/mob/thrownby = null + ///A bitfield of a species to use as an alternative sprite for any given item. DMIs are stored in the species datum and called via proc in update_icons. + var/sprite_sheets = null + ///A bitfield of species that the item cannot be worn by. + var/species_restricted = null + ///A weakref to the mob who threw the item + var/datum/weakref/thrownby = null mouse_drag_pointer = MOUSE_ACTIVE_POINTER //the icon to indicate this object is being dragged /// Used for when things get stuck in you and need to be surgically removed. See [/datum/embedding_behavior] - var/datum/embedding_behavior/embedding + var/list/embedding = NONE /// For flags such as GLASSESCOVERSEYES to show which slots this item can cover. See _DEFINES/inventory.dm var/flags_cover = 0 @@ -181,8 +189,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /// A reagent list containing the reagents this item produces when JUICED in a grinder! var/list/juice_results - //the outline filter on hover - var/outline_filter /obj/item/Initialize() @@ -204,9 +210,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) new path(src) actions_types = null - if(GLOB.rpg_loot_items) - rpg_loot = new(src) - if(force_string) item_flags |= FORCE_STRING_OVERRIDE @@ -222,12 +225,8 @@ 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(LAZYLEN(embedding)) + updateEmbedding() /obj/item/Destroy() item_flags &= ~DROPDEL //prevent reqdels @@ -249,6 +248,22 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(B && B.loc == loc) qdel(src) +/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(sharpness) //give sharp objects butchering functionality, for consistency + AddComponent(/datum/component/butchering, 80 * toolspeed) + //user: The mob that is suiciding //damagetype: The type of damage the item will inflict on the user //BRUTELOSS = 1 @@ -474,12 +489,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(!blockhand) return 0 if(blockhand.is_disabled()) - to_chat(owner, "You're too exausted to block the attack") + to_chat(owner, "You're too exausted to block the attack!
      ") return 0 else if(HAS_TRAIT(owner, TRAIT_NOLIMBDISABLE) && owner.getStaminaLoss() >= 30) - to_chat(owner, "You're too exausted to block the attack") + to_chat(owner, "You're too exausted to block the attack!
      ") return 0 - if(owner.a_intent == INTENT_HARM) //you can choose not to block an attack + if(owner.a_intent == INTENT_HELP) //you can choose not to block an attack return 0 if(block_flags & BLOCKING_ACTIVE && owner.get_active_held_item() != src) //you can still parry with the offhand return 0 @@ -535,7 +550,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) else if(isitem(hitby)) var/obj/item/I = hitby attackforce = damage - if(I.sharpness) + if(I.is_sharp()) attackforce = (attackforce / 2)//sharp weapons get much of their force by virtue of being sharp, not physical power if(!I.damtype == BRUTE) attackforce = (attackforce / 2)//as above, burning weapons, or weapons that deal other damage type probably dont get force from physical power @@ -564,7 +579,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) owner.blockbreak() return TRUE -/obj/item/proc/talk_into(mob/M, input, channel, spans, datum/language/language) +/obj/item/proc/talk_into(mob/M, input, channel, spans, datum/language/language, list/message_mods) return ITALICS | REDUCE_RANGE /obj/item/proc/dropped(mob/user) @@ -578,11 +593,15 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(item_flags & SLOWS_WHILE_IN_HAND) user.update_equipment_speed_mods() remove_outline() + if(verbs && user.client) + user.client.remove_verbs(verbs) // called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user) item_flags |= IN_INVENTORY + if(verbs && user.client) + user.client.add_verbs(verbs) // called when "found" in pockets and storage items. Returns 1 if the search should end. /obj/item/proc/on_found(mob/finder) @@ -605,7 +624,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) //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) - if(slot == SLOT_IN_BACKPACK || slot == SLOT_LEGCUFFED) //these aren't true slots, so avoid granting actions there + if(slot == ITEM_SLOT_BACKPACK || slot == ITEM_SLOT_LEGCUFFED) //these aren't true slots, so avoid granting actions there return FALSE return TRUE @@ -725,11 +744,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) itempush = 0 //too light to push anything 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) - thrownby = thrower +/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, quickstart = TRUE) + if(HAS_TRAIT(src, TRAIT_NODROP)) + return + thrownby = WEAKREF(thrower) callback = CALLBACK(src, .proc/after_throw, callback) //replace their callback with our own - . = ..(target, range, speed, thrower, spin, diagonals_first, callback, force) - + . = ..(target, range, speed, thrower, spin, diagonals_first, callback, force, quickstart = quickstart) /obj/item/proc/after_throw(datum/callback/callback) if (callback) //call the original callback @@ -786,14 +806,14 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(damtype == BURN) . = 'sound/weapons/sear.ogg' else - . = pick('sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg') + . = pick('sound/misc/desecration-01.ogg', 'sound/misc/desecration-02.ogg', 'sound/misc/desecration-03.ogg') /obj/item/proc/open_flame(flame_heat=700) var/turf/location = loc if(ismob(location)) var/mob/M = location var/success = FALSE - if(src == M.get_item_by_slot(SLOT_WEAR_MASK)) + if(src == M.get_item_by_slot(ITEM_SLOT_MASK)) success = TRUE if(success) location = get_turf(M) @@ -807,7 +827,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) . = "" /obj/item/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) - return + return SEND_SIGNAL(src, COMSIG_ATOM_HITBY, AM, skipcatch, hitpush, blocked, throwingdatum) /obj/item/attack_hulk(mob/living/carbon/human/user) return 0 @@ -913,15 +933,10 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) colour = COLOR_BLUE_GRAY else colour = COLOR_BLUE_GRAY - if(outline_filter) - filters -= outline_filter - outline_filter = filter(type="outline", size=1, color=colour) - filters += outline_filter + add_filter("item_outline", 1, list(type="outline", size=1, color=colour)) /obj/item/proc/remove_outline() - if(outline_filter) - filters -= outline_filter - outline_filter = null + remove_filter("item_outline") // Called when a mob tries to use the item as a tool. // Handles most checks. @@ -1010,10 +1025,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) dropped(M) return ..() -/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback) - if(HAS_TRAIT(src, TRAIT_NODROP)) - return - return ..() +/obj/item/proc/embedded(atom/embedded_target) + +/obj/item/proc/unembedded() + if(item_flags & DROPDEL) + QDEL_NULL(src) + return TRUE /obj/item/proc/canStrip(mob/stripper, mob/owner) return !HAS_TRAIT(src, TRAIT_NODROP) @@ -1037,3 +1054,61 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) take_damage(75, BRUTE, "bomb", 0) if(3) take_damage(20, BRUTE, "bomb", 0) + +/obj/item/proc/get_armor_rating(d_type, mob/wearer) + return armor.getRating(d_type) + +///Does the current embedding var meet the criteria for being harmless? Namely, does it have a pain multiplier and jostle pain mult of 0? If so, return true. +/obj/item/proc/isEmbedHarmless() + if(embedding) + return (!embedding["pain_mult"] && !embedding["jostle_pain_mult"]) + +///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 or a carbon. 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)) + 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),\ + max_damage_mult = (!isnull(embedding["max_damage_mult"]) ? embedding["max_damage_mult"] : EMBEDDED_MAX_DAMAGE_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),\ + 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),\ + armour_block = (!isnull(embedding["armour_block"]) ? embedding["armour_block"] : EMBEDDED_ARMOUR_BLOCK)) + return TRUE diff --git a/code/game/objects/items/AI_modules.dm b/code/game/objects/items/AI_modules.dm index 331974729351b..cd3f81dc908fc 100644 --- a/code/game/objects/items/AI_modules.dm +++ b/code/game/objects/items/AI_modules.dm @@ -56,6 +56,7 @@ AI MODULES if(tot_laws > CONFIG_GET(number/silicon_max_law_amount) && !bypass_law_amt_check)//allows certain boards to avoid this check, eg: reset to_chat(user, "Not enough memory allocated to [law_datum.owner ? law_datum.owner : "the AI core"]'s law processor to handle this amount of laws.") message_admins("[ADMIN_LOOKUPFLW(user)] tried to upload laws to [law_datum.owner ? ADMIN_LOOKUPFLW(law_datum.owner) : "an AI core"] that would exceed the law cap.") + log_game("[ADMIN_LOOKUP(user)] tried to upload laws to [law_datum.owner ? ADMIN_LOOKUP(law_datum.owner) : "an AI core"] that would exceed the law cap.") overflow = TRUE var/law2log = transmitInstructions(law_datum, user, overflow) //Freeforms return something extra we need to log @@ -73,9 +74,22 @@ AI MODULES var/time = time2text(world.realtime,"hh:mm:ss") var/ainame = law_datum.owner ? law_datum.owner.name : "empty AI core" var/aikey = law_datum.owner ? law_datum.owner.ckey : "null" - GLOB.lawchanges.Add("[time] : [user.name]([user.key]) used [src.name] on [ainame]([aikey]).[law2log ? " The law specified [law2log]" : ""]") - log_law("[user.key]/[user.name] used [src.name] on [aikey]/([ainame]) from [AREACOORD(user)].[law2log ? " The law specified [law2log]" : ""]") - message_admins("[ADMIN_LOOKUPFLW(user)] used [src.name] on [ADMIN_LOOKUPFLW(law_datum.owner)] from [AREACOORD(user)].[law2log ? " The law specified [law2log]" : ""]") + + //affected cyborgs are cyborgs linked to the AI with lawsync enabled + var/affected_cyborgs = list() + var/borg_txt = "" + var/borg_flw = "" + if(isAI(law_datum.owner)) + var/mob/living/silicon/ai/owner = law_datum.owner + for(var/mob/living/silicon/robot/owned_borg in owner.connected_robots) + if(owned_borg.connected_ai && owned_borg.lawupdate) + affected_cyborgs += owned_borg + borg_flw += "[ADMIN_LOOKUPFLW(owned_borg)], " + borg_txt += "[ADMIN_LOOKUP(owned_borg)], " + + GLOB.lawchanges.Add("[time] : [user.name]([user.key]) used [src.name] on [ainame]([aikey]).[law2log ? " The law specified [law2log]" : ""], [length(affected_cyborgs) ? ", impacting synced borgs [borg_txt]" : "FALSE"]") + log_law("[user.key]/[user.name] used [src.name] on [aikey]/([ainame]) from [AREACOORD(user)].[law2log ? " The law specified [law2log]" : ""] , [length(affected_cyborgs) ? ", impacting synced borgs [borg_txt]" : "FALSE"]") + message_admins("[ADMIN_LOOKUPFLW(user)] used [src.name] on [ADMIN_LOOKUPFLW(law_datum.owner)] from [AREACOORD(user)].[law2log ? " The law specified [law2log]" : ""] , [length(affected_cyborgs) ? ", impacting synced borgs [borg_flw]" : "FALSE"]") if(law_datum.owner) deadchat_broadcast("[user.name] changed [ainame]'s laws at [get_area_name(user, TRUE)].", "[user]", follow_target=user, message_type=DEADCHAT_LAWCHANGE) @@ -122,7 +136,7 @@ AI MODULES to_chat(law_datum.owner, "It would be in your best interest to play along with [sender.real_name] that:") for(var/failedlaw in laws) to_chat(law_datum.owner, "[failedlaw]") - return 1 + return TRUE for(var/templaw in laws) if(law_datum.owner) @@ -195,7 +209,7 @@ AI MODULES /obj/item/aiModule/zeroth/oneHuman/install(datum/ai_laws/law_datum, mob/user) if(!targetName) to_chat(user, "No name detected on module, please enter one.") - return 0 + return FALSE ..() /obj/item/aiModule/zeroth/oneHuman/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) @@ -610,6 +624,11 @@ AI MODULES /obj/item/aiModule/core/full/peacekeeper name = "'Peacekeeper' Core AI Module" law_id = "peacekeeper" +/****************** Dadbot *******************/ + +/obj/item/aiModule/core/full/dadbot + name = "DadBot Core AI Module" + law_id = "paternalai" // Bad times ahead @@ -636,3 +655,15 @@ AI MODULES /obj/item/aiModule/core/full/overlord name = "'Overlord' Core AI Module" law_id = "overlord" + +/******************** ERT Override ******************/ +/obj/item/aiModule/core/full/ert // Applies ERT laws + name = "ERT override AI module" + desc = "An ERT override AI module: 'Reconfigures the AI's core laws.'" + law_id = "ert" + +/******************** Deathsquad Override ******************/ +/obj/item/aiModule/core/full/deathsquad // Applies Deathsquad laws + name = "Deathsquad override AI module" + desc = "A Deathsquad override AI module: 'Reconfigures the AI's core laws.'" + law_id = "ds" diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 9e73f5388e0e2..ed4fd2a895ab9 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -24,7 +24,7 @@ RLD w_class = WEIGHT_CLASS_NORMAL materials = list(/datum/material/iron=100000) req_access_txt = "11" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "stamina" = 0) resistance_flags = FIRE_PROOF var/datum/effect_system/spark_spread/spark_system var/matter = 0 @@ -53,7 +53,7 @@ RLD . += "\A [src]. It currently holds [matter]/[max_matter] matter-units." if(upgrade & RCD_UPGRADE_SILO_LINK) . += "\A [src]. Remote storage link state: [silo_link ? "[silo_mats.on_hold() ? "ON HOLD" : "ON"]" : "OFF"]." - if(silo_link && !silo_mats.on_hold()) + if(silo_link && !silo_mats.on_hold() && silo_mats.mat_container) . += "\A [src]. Remote connection have iron in equivalent to [silo_mats.mat_container.get_material_amount(/datum/material/iron)/500] rcd units." // 1 matter for 1 floortile, as 4 tiles are produced from 1 iron /obj/item/construction/Destroy() @@ -133,17 +133,18 @@ RLD update_icon() return TRUE else + var/list/matlist = list(getmaterialref(/datum/material/iron) = 500) if(silo_mats.on_hold()) if(user) to_chat(user, "Mineral access is on hold, please contact the quartermaster.") return FALSE - if(!silo_mats.mat_container.has_materials(list(/datum/material/iron = 500), amount)) + if(!silo_mats.mat_container?.has_materials(matlist, amount)) if(user) to_chat(user, no_ammo_message) return FALSE - silo_mats.mat_container.use_materials(list(/datum/material/iron = 500), amount) - silo_mats.silo_log(src, "consume", -amount, "build", list(/datum/material/iron = 500)) + silo_mats.mat_container.use_materials(matlist, amount) + silo_mats.silo_log(src, "consume", -amount, "build", matlist) return TRUE /obj/item/construction/proc/checkResource(amount, mob/user) @@ -154,7 +155,7 @@ RLD if(user) to_chat(user, "Mineral access is on hold, please contact the quartermaster.") return FALSE - . = silo_mats.mat_container.has_materials(list(/datum/material/iron = 500), amount) + . = silo_mats.mat_container?.has_materials(list(getmaterialref(/datum/material/iron) = 500), amount) if(!. && user) to_chat(user, no_ammo_message) if(has_ammobar) @@ -162,7 +163,7 @@ RLD return . /obj/item/construction/proc/range_check(atom/A, mob/user) - if(!(A in view(7, get_turf(user)))) + if(!(user in viewers(7, get_turf(A)))) to_chat(user, "The \'Out of Range\' light on [src] blinks red.") return FALSE else @@ -199,10 +200,10 @@ RLD var/airlock_glass = FALSE // So the floor's rcd_act knows how much ammo to use var/window_type = /obj/structure/window/fulltile var/advanced_airlock_setting = 1 //Set to 1 if you want more paintjobs available - var/list/conf_access = null - var/use_one_access = 0 //If the airlock should require ALL or only ONE of the listed accesses. var/delay_mod = 1 var/canRturf = FALSE //Variable for R walls to deconstruct them + /// Integrated airlock electronics for setting access to a newly built airlocks + var/obj/item/electronics/airlock/airlock_electronics /obj/item/construction/rcd/suicide_act(mob/user) user.visible_message("[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide..") @@ -236,77 +237,6 @@ RLD else to_chat(user, "\the [src] dont have remote storage connection.") - -/obj/item/construction/rcd/proc/change_airlock_access(mob/user) - if (!ishuman(user) && !user.has_unlimited_silicon_privilege) - return - - var/t1 = "" - - if(use_one_access) - t1 += "Restriction Type: At least one access required
      " - else - t1 += "Restriction Type: All accesses required
      " - - t1 += "Remove All
      " - - var/accesses = "" - accesses += "
      Access
      " - accesses += "" - accesses += "" - for(var/i = 1; i <= 7; i++) - accesses += "" - accesses += "" - for(var/i = 1; i <= 7; i++) - accesses += "" - accesses += "
      [get_region_accesses_name(i)]:
      " - for(var/A in get_region_accesses(i)) - if(A in conf_access) - accesses += "[replacetext(get_access_desc(A), " ", " ")] " - else - accesses += "[replacetext(get_access_desc(A), " ", " ")] " - accesses += "
      " - accesses += "
      " - t1 += "[accesses]" - - t1 += "

      Close

      \n" - - var/datum/browser/popup = new(user, "rcd_access", "Access Control", 900, 500) - popup.set_content(t1) - popup.open() - onclose(user, "rcd_access") - -/obj/item/construction/rcd/Topic(href, href_list) - ..() - if (usr.stat || usr.restrained()) - return - - if (href_list["close"]) - usr << browse(null, "window=rcd_access") - return - - if (href_list["access"]) - toggle_access(href_list["access"]) - change_airlock_access(usr) - -/obj/item/construction/rcd/proc/toggle_access(acc) - if (acc == "all") - conf_access = null - else if(acc == "one") - use_one_access = !use_one_access - else - var/req = text2num(acc) - - if (conf_access == null) - conf_access = list() - - if (!(req in conf_access)) - conf_access += req - else - conf_access -= req - if (!conf_access.len) - conf_access = null - /obj/item/construction/rcd/proc/get_airlock_image(airlock_type) var/obj/machinery/door/airlock/proto = airlock_type var/ic = initial(proto.icon) @@ -494,9 +424,13 @@ RLD /obj/item/construction/rcd/Initialize() . = ..() + airlock_electronics = new(src) + airlock_electronics.name = "Access Control" + airlock_electronics.holder = src GLOB.rcd_list += src /obj/item/construction/rcd/Destroy() + QDEL_NULL(airlock_electronics) GLOB.rcd_list -= src . = ..() @@ -548,7 +482,7 @@ RLD mode = RCD_LADDER return if("Change Access") - change_airlock_access(user) + airlock_electronics.ui_interact(user) return if("Change Airlock Type") change_airlock_setting(user) @@ -669,7 +603,7 @@ RLD max_matter = INFINITY matter = INFINITY delay_mod = 0.1 - upgrade = 1 + upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS // Ranged RCD diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index 05dc783d2a1e5..daaf4b679b998 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -1,6 +1,6 @@ -/obj/item/twohanded/rcl +/obj/item/rcl name = "rapid cable layer" - desc = "A device used to rapidly deploy cables. It has screws on the side which can be removed to slide off the cables. Do not use without insulation!" + desc = "A device used to rapidly deploy cable. It has screws on the side which can be removed to slide off the cables. Do not use without insulation!" icon = 'icons/obj/tools.dmi' icon_state = "rcl-0" item_state = "rcl-0" @@ -23,7 +23,28 @@ var/datum/radial_menu/persistent/wiring_gui_menu var/mob/listeningTo -/obj/item/twohanded/rcl/attackby(obj/item/W, mob/user) +/obj/item/rcl/Initialize() + . = ..() + RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) + RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) + +/obj/item/rcl/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed) + +/// triggered on wield of two handed item +/obj/item/rcl/proc/on_wield(obj/item/source, mob/user) + SIGNAL_HANDLER + + active = TRUE + +/// triggered on unwield of two handed item +/obj/item/rcl/proc/on_unwield(obj/item/source, mob/user) + SIGNAL_HANDLER + + active = FALSE + +/obj/item/rcl/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = W @@ -78,19 +99,19 @@ else ..() -/obj/item/twohanded/rcl/examine(mob/user) +/obj/item/rcl/examine(mob/user) . = ..() if(loaded) . += "It contains [loaded.amount]/[max_amount] cables." -/obj/item/twohanded/rcl/Destroy() +/obj/item/rcl/Destroy() QDEL_NULL(loaded) last = null listeningTo = null QDEL_NULL(wiring_gui_menu) return ..() -/obj/item/twohanded/rcl/update_icon() +/obj/item/rcl/update_icon() if(!loaded) icon_state = "rcl-0" item_state = "rcl-0" @@ -109,7 +130,7 @@ icon_state = "rcl-0" item_state = "rcl-0" -/obj/item/twohanded/rcl/proc/is_empty(mob/user, loud = 1) +/obj/item/rcl/proc/is_empty(mob/user, loud = 1) update_icon() if(!loaded || !loaded.amount) if(loud) @@ -118,26 +139,23 @@ QDEL_NULL(loaded) loaded = null QDEL_NULL(wiring_gui_menu) - unwield(user) - active = wielded return TRUE return FALSE -/obj/item/twohanded/rcl/pickup(mob/user) +/obj/item/rcl/pickup(mob/user) ..() getMobhook(user) -/obj/item/twohanded/rcl/dropped(mob/wearer) +/obj/item/rcl/dropped(mob/wearer) ..() UnregisterSignal(wearer, COMSIG_MOVABLE_MOVED) listeningTo = null last = null QDEL_NULL(wiring_gui_menu) -/obj/item/twohanded/rcl/attack_self(mob/user) +/obj/item/rcl/attack_self(mob/user) ..() - active = wielded if(!active) last = null else if(!last) @@ -146,15 +164,17 @@ last = C break -/obj/item/twohanded/rcl/proc/getMobhook(mob/to_hook) +/obj/item/rcl/proc/getMobhook(mob/to_hook) if(listeningTo == to_hook) return if(listeningTo) UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) - RegisterSignal(listeningTo, COMSIG_MOVABLE_MOVED, .proc/trigger) + RegisterSignal(to_hook, COMSIG_MOVABLE_MOVED, .proc/trigger) listeningTo = to_hook -/obj/item/twohanded/rcl/proc/trigger(mob/user) +/obj/item/rcl/proc/trigger(mob/user) + SIGNAL_HANDLER + if(active) layCable(user) if(wiring_gui_menu) //update the wire options as you move @@ -162,7 +182,7 @@ //previous contents of trigger(), lays cable each time the player moves -/obj/item/twohanded/rcl/proc/layCable(mob/user) +/obj/item/rcl/proc/layCable(mob/user) if(!isturf(user.loc)) return if(is_empty(user, 0)) @@ -196,7 +216,7 @@ //searches the current tile for a stub cable of the same colour -/obj/item/twohanded/rcl/proc/findLinkingCable(mob/user) +/obj/item/rcl/proc/findLinkingCable(mob/user) var/turf/T if(!isturf(user.loc)) return @@ -212,10 +232,8 @@ continue if(C.d1 == 0) return C - return - -/obj/item/twohanded/rcl/proc/wiringGuiGenerateChoices(mob/user) +/obj/item/rcl/proc/wiringGuiGenerateChoices(mob/user) var/fromdir = 0 var/obj/structure/cable/linkingCable = findLinkingCable(user) if(linkingCable) @@ -232,12 +250,12 @@ wiredirs[icondir] = img return wiredirs -/obj/item/twohanded/rcl/proc/showWiringGui(mob/user) +/obj/item/rcl/proc/showWiringGui(mob/user) var/list/choices = wiringGuiGenerateChoices(user) wiring_gui_menu = show_radial_menu_persistent(user, src , choices, select_proc = CALLBACK(src, .proc/wiringGuiReact, user), radius = 42) -/obj/item/twohanded/rcl/proc/wiringGuiUpdate(mob/user) +/obj/item/rcl/proc/wiringGuiUpdate(mob/user) if(!wiring_gui_menu) return @@ -246,9 +264,8 @@ wiring_gui_menu.change_choices(choices,FALSE) - //Callback used to respond to interactions with the wiring menu -/obj/item/twohanded/rcl/proc/wiringGuiReact(mob/living/user,choice) +/obj/item/rcl/proc/wiringGuiReact(mob/living/user,choice) if(!choice) //close on a null choice (the center button) QDEL_NULL(wiring_gui_menu) return @@ -279,19 +296,18 @@ wiringGuiUpdate(user) - -/obj/item/twohanded/rcl/pre_loaded/Initialize() //Comes preloaded with cable, for testing stuff +/obj/item/rcl/pre_loaded/Initialize() //Comes preloaded with cable, for testing stuff . = ..() loaded = new() loaded.max_amount = max_amount loaded.amount = max_amount update_icon() -/obj/item/twohanded/rcl/Initialize() +/obj/item/rcl/Initialize() . = ..() update_icon() -/obj/item/twohanded/rcl/ui_action_click(mob/user, action) +/obj/item/rcl/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/rcl_col)) current_color_index++; if (current_color_index > colors.len) @@ -308,13 +324,13 @@ else //open the menu showWiringGui(user) -/obj/item/twohanded/rcl/ghetto +/obj/item/rcl/ghetto actions_types = list() max_amount = 30 name = "makeshift rapid cable layer" ghetto = TRUE -/obj/item/twohanded/rcl/ghetto/update_icon() +/obj/item/rcl/ghetto/update_icon() if(!loaded) icon_state = "rclg-0" item_state = "rclg-0" diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index 606e604207269..e3dc337f22189 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -35,6 +35,9 @@ GLOBAL_LIST_INIT(atmos_pipe_recipes, list( new /datum/pipe_info/meter("Meter"), new /datum/pipe_info/pipe("Gas Filter", /obj/machinery/atmospherics/components/trinary/filter), new /datum/pipe_info/pipe("Gas Mixer", /obj/machinery/atmospherics/components/trinary/mixer), + new /datum/pipe_info/pipe("Pressure Valve", /obj/machinery/atmospherics/components/binary/pressure_valve), + new /datum/pipe_info/pipe("Temperature Gate", /obj/machinery/atmospherics/components/binary/temperature_gate), + new /datum/pipe_info/pipe("Temperature Pump", /obj/machinery/atmospherics/components/binary/temperature_pump), ), "Heat Exchange" = list( new /datum/pipe_info/pipe("Pipe", /obj/machinery/atmospherics/pipe/heat_exchanging/simple), @@ -203,7 +206,7 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( w_class = WEIGHT_CLASS_NORMAL slot_flags = ITEM_SLOT_BELT materials = list(/datum/material/iron=75000, /datum/material/glass=37500) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "stamina" = 0) resistance_flags = FIRE_PROOF var/datum/effect_system/spark_spread/spark_system var/working = 0 @@ -306,12 +309,11 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( /obj/item/pipe_dispenser/ui_act(action, params) if(..()) return - if(!usr.canUseTopic(src, BE_CLOSE)) - return var/playeffect = TRUE switch(action) if("color") paint_color = params["paint_color"] + . = TRUE if("category") category = text2num(params["category"]) switch(category) @@ -325,32 +327,37 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( recipe = first_plumbing p_dir = NORTH playeffect = FALSE + . = TRUE if("piping_layer") piping_layer = text2num(params["piping_layer"]) playeffect = FALSE + . = TRUE if("ducting_layer") ducting_layer = text2num(params["ducting_layer"]) playeffect = FALSE + . = TRUE if("pipe_type") var/static/list/recipes if(!recipes) recipes = GLOB.disposal_pipe_recipes + GLOB.atmos_pipe_recipes + GLOB.transit_tube_recipes + GLOB.fluid_duct_recipes recipe = recipes[params["category"]][text2num(params["pipe_type"])] p_dir = NORTH + . = TRUE if("setdir") p_dir = text2dir(params["dir"]) p_flipped = text2num(params["flipped"]) playeffect = FALSE + . = TRUE if("mode") var/n = text2num(params["mode"]) + . = TRUE if(mode & n) mode &= ~n else mode |= n - if(playeffect) + if(playeffect && .) spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, FALSE) - return TRUE /obj/item/pipe_dispenser/pre_attack(atom/A, mob/user) if(!user.IsAdvancedToolUser() || istype(A, /turf/open/space/transit)) diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm index 6f249ae3dafe2..11be8365b2adf 100644 --- a/code/game/objects/items/RSF.dm +++ b/code/game/objects/items/RSF.dm @@ -14,7 +14,7 @@ RSF density = FALSE anchored = FALSE item_flags = NOBLUDGEON - 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, "stamina" = 0) var/matter = 0 var/mode = 1 w_class = WEIGHT_CLASS_NORMAL @@ -162,7 +162,7 @@ RSF toxin = 0 to_chat(user, "Cookie Synthesizer Reset") -/obj/item/cookiesynth/process() +/obj/item/cookiesynth/process(delta_time) if(matter < 10) matter++ diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index 00042a51394d8..bf58b76f42d2a 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -16,6 +16,25 @@ var/obj/item/toner/ink = null + /// Associate list of all paint jobs the airlock painter can apply. The key is the name of the airlock the user will see. The value is the type path of the airlock + var/list/available_paint_jobs = list( + "Public" = /obj/machinery/door/airlock/public, + "Engineering" = /obj/machinery/door/airlock/engineering, + "Atmospherics" = /obj/machinery/door/airlock/atmos, + "Security" = /obj/machinery/door/airlock/security, + "Command" = /obj/machinery/door/airlock/command, + "Medical" = /obj/machinery/door/airlock/medical, + "Research" = /obj/machinery/door/airlock/research, + "Freezer" = /obj/machinery/door/airlock/freezer, + "Science" = /obj/machinery/door/airlock/science, + "Mining" = /obj/machinery/door/airlock/mining, + "Maintenance" = /obj/machinery/door/airlock/maintenance, + "External" = /obj/machinery/door/airlock/external, + "External Maintenance"= /obj/machinery/door/airlock/maintenance/external, + "Virology" = /obj/machinery/door/airlock/virology, + "Standard" = /obj/machinery/door/airlock + ) + /obj/item/airlock_painter/Initialize() . = ..() ink = new /obj/item/toner(src) @@ -26,9 +45,9 @@ if(can_use(user)) ink.charges-- playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1) - return 1 + return TRUE else - return 0 + return FALSE //This proc only checks if the painter can be used. //Call this if you don't want the painter to be used right after this check, for example @@ -36,12 +55,12 @@ /obj/item/airlock_painter/proc/can_use(mob/user) if(!ink) to_chat(user, "There is no toner cartridge installed in [src]!") - return 0 + return FALSE else if(ink.charges < 1) to_chat(user, "[src] is out of ink!") - return 0 + return FALSE else - return 1 + return TRUE /obj/item/airlock_painter/suicide_act(mob/user) var/obj/item/organ/lungs/L = user.getorganslot(ORGAN_SLOT_LUNGS) @@ -126,3 +145,106 @@ 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=50, /datum/material/glass=50) + var/stored_dir = SOUTH + var/stored_color = "" + var/stored_decal = "warningline" + var/stored_decal_total = "warningline" + var/color_list = list("","red","white") + var/dir_list = list(NORTH,SOUTH,EAST,WEST) + 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) + . = ..() + if(!proximity) + to_chat(user, "You need to get closer!") + return + if(use_paint(user) && isturf(target)) + var/turf/open/floor/F = target + F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, null, null, alpha, color, null, TRUE, null) + +/obj/item/airlock_painter/decal/AltClick(mob/user) + . = ..() + ui_interact(user) + +/obj/item/airlock_painter/decal/Initialize(mapload) + . = ..() + 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, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "DecalPainter", name) + 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(mapload) + . = ..() + ink = new /obj/item/toner/extreme(src) \ No newline at end of file diff --git a/code/game/objects/items/binoculars.dm b/code/game/objects/items/binoculars.dm new file mode 100644 index 0000000000000..dcf60e2f47eeb --- /dev/null +++ b/code/game/objects/items/binoculars.dm @@ -0,0 +1,70 @@ +/obj/item/binoculars + name = "binoculars" + desc = "Used for long-distance surveillance." + item_state = "binoculars" + icon_state = "binoculars" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + slot_flags = ITEM_SLOT_BELT + w_class = WEIGHT_CLASS_SMALL + var/mob/listeningTo + var/zoom_out_amt = 6 + var/zoom_amt = 10 + +/obj/item/binoculars/Initialize() + . = ..() + RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) + RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) + +/obj/item/binoculars/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed) + +/obj/item/binoculars/Destroy() + listeningTo = null + return ..() + +/obj/item/binoculars/proc/on_wield(obj/item/source, mob/user) + SIGNAL_HANDLER + + RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/unwield) + listeningTo = user + user.visible_message("[user] holds [src] up to [user.p_their()] eyes.", "You hold [src] up to your eyes.") + item_state = "binoculars_wielded" + user.regenerate_icons() + if(!user?.client) + return + var/client/C = user.client + var/_x = 0 + var/_y = 0 + switch(user.dir) + if(NORTH) + _y = zoom_amt + if(EAST) + _x = zoom_amt + if(SOUTH) + _y = -zoom_amt + if(WEST) + _x = -zoom_amt + C.change_view(get_zoomed_view(world.view, zoom_out_amt)) + C.pixel_x = world.icon_size*_x + C.pixel_y = world.icon_size*_y + +/obj/item/binoculars/proc/on_unwield(obj/item/source, mob/user) + SIGNAL_HANDLER + + unwield(user) + +/obj/item/binoculars/proc/unwield(mob/user) + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + listeningTo = null + user.visible_message("[user] lowers [src].", "You lower [src].") + item_state = "binoculars" + user.regenerate_icons() + if(user && user.client) + user.regenerate_icons() + var/client/C = user.client + C.change_view(CONFIG_GET(string/default_view)) + user.client.pixel_x = 0 + user.client.pixel_y = 0 diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 75e22f0f31dca..ecd7e0c83c733 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -59,7 +59,7 @@ /obj/item/areaeditor/blueprints/attack_self(mob/user) . = ..() if(!legend) - var/area/A = get_area() + var/area/A = get_area(user) if(get_area_type() == AREA_STATION) . += "

      According to \the [src], you are now in \"[html_encode(A.name)]\".

      " . += "

      Change area name

      " @@ -140,12 +140,9 @@ legend = FALSE -/obj/item/areaeditor/proc/get_area() - var/turf/T = get_turf(usr) - var/area/A = T.loc - return A - -/obj/item/areaeditor/proc/get_area_type(area/A = get_area()) +/obj/item/areaeditor/proc/get_area_type(area/A) + if (!A) + A = get_area(usr) if(A.outdoors) return AREA_SPACE var/list/SPECIALS = list( @@ -183,7 +180,7 @@ return "" /obj/item/areaeditor/proc/edit_area() - var/area/A = get_area() + var/area/A = get_area(usr) var/prevname = "[A.name]" var/str = stripped_input(usr,"New area name:", "Area Creation", "", MAX_NAME_LEN) if(!str || !length(str) || str==prevname) //cancel diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index f3dc980355d3c..3d9d39c4c20e2 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -63,6 +63,8 @@ return ..() /obj/item/bodybag/bluespace/proc/CanReachReact(atom/movable/source, list/next) + SIGNAL_HANDLER + return COMPONENT_BLOCK_REACH /obj/item/bodybag/bluespace/deploy_bodybag(mob/user, atom/location) diff --git a/code/game/objects/items/broom.dm b/code/game/objects/items/broom.dm new file mode 100644 index 0000000000000..f8913c878b9ce --- /dev/null +++ b/code/game/objects/items/broom.dm @@ -0,0 +1,85 @@ +/obj/item/pushbroom + name = "broom" + desc = "This is my BROOMSTICK! It can be used manually or braced with two hands to sweep items as you move. It has a telescopic handle for compact storage." + icon = 'icons/obj/janitor.dmi' + icon_state = "broom0" + lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' + force = 8 + throwforce = 10 + throw_speed = 3 + throw_range = 7 + w_class = WEIGHT_CLASS_NORMAL + attack_verb = list("swept", "brushed off", "bludgeoned", "whacked") + resistance_flags = FLAMMABLE + +/obj/item/pushbroom/Initialize() + . = ..() + RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) + RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) + +/obj/item/pushbroom/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_unwielded=8, force_wielded=12, icon_wielded="broom1") + +/obj/item/pushbroom/update_icon_state() + icon_state = "broom0" + ..() + +/// triggered on wield of two handed item +/obj/item/pushbroom/proc/on_wield(obj/item/source, mob/user) + SIGNAL_HANDLER + + to_chat(user, "You brace the [src] against the ground in a firm sweeping stance.") + RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/sweep) + +/// triggered on unwield of two handed item +/obj/item/pushbroom/proc/on_unwield(obj/item/source, mob/user) + SIGNAL_HANDLER + + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + +/obj/item/pushbroom/afterattack(atom/A, mob/user, proximity) + . = ..() + if(!proximity) + return + if(ISWIELDED(src)) + sweep(user, A, FALSE) + else + to_chat(user, "You need to wield \the [src] in both hands to sweep!") + +/obj/item/pushbroom/proc/sweep(mob/user, atom/A, moving = TRUE) + SIGNAL_HANDLER + + var/turf/target + if (!moving) + if (isturf(A)) + target = A + else + target = get_turf(A) + else + target = get_turf(user) + if (locate(/obj/structure/table) in target.contents) + return + var/i = 0 + var/turf/target_turf = get_step(target, user.dir) + var/obj/machinery/disposal/bin/target_bin = locate(/obj/machinery/disposal/bin) in target_turf.contents + for(var/obj/item/garbage in target.contents) + if(!garbage.anchored) + if (target_bin) + garbage.forceMove(target_bin) + else + garbage.Move(target_turf, user.dir) + i++ + if(i > 19) + break + if(i > 0) + if (target_bin) + target_bin.update_icon() + to_chat(user, "You sweep the pile of garbage into [target_bin].") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 30, TRUE, -1) + +/obj/item/pushbroom/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) //bless you whoever fixes this copypasta + J.put_in_cart(src, user) + J.mybroom=src + J.update_icon() diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 5a2b457ff21f1..5dd0b75e16ea0 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -9,7 +9,8 @@ w_class = WEIGHT_CLASS_TINY light_color = LIGHT_COLOR_FIRE heat = 1000 - var/wax = 1000 + /// How many seconds it burns for + var/wax = 2000 var/lit = FALSE var/infinite = FALSE var/start_lit = FALSE @@ -20,7 +21,7 @@ light() /obj/item/candle/update_icon() - icon_state = "candle[(wax > 400) ? ((wax > 750) ? 1 : 2) : 3][lit ? "_lit" : ""]" + icon_state = "candle[(wax > 800) ? ((wax > 1500) ? 1 : 2) : 3][lit ? "_lit" : ""]" /obj/item/candle/attackby(obj/item/W, mob/user, params) var/msg = W.ignition_effect(src, user) @@ -58,12 +59,12 @@ put_out_candle() return ..() -/obj/item/candle/process() +/obj/item/candle/process(delta_time) if(!lit) return PROCESS_KILL if(!infinite) - wax-- - if(!wax) + wax -= delta_time + if(wax <= 0) new /obj/item/trash/candle(loc) qdel(src) update_icon() diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index 7de1e0b876f49..44dad907fd9be 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -185,3 +185,63 @@ /obj/item/cardboard_cutout/adaptive //Purchased by Syndicate agents, these cutouts are indistinguishable from normal cutouts but aren't discolored when their appearance is changed deceptive = TRUE + +// --- CHESS PIECES --- + +// WHITE + +/obj/item/cardboard_cutout/adaptive/chess + desc = "A large cardboard cutout resembling a chess piece." + +/obj/item/cardboard_cutout/adaptive/chess/king + name = "White King" + icon_state = "cutout_ian"; + +/obj/item/cardboard_cutout/adaptive/chess/queen + name = "White Queen" + icon_state = "cutout_clown"; + +/obj/item/cardboard_cutout/adaptive/chess/rook + name = "White Rook" + icon_state = "cutout_deathsquad"; + +/obj/item/cardboard_cutout/adaptive/chess/knight + name = "White Knight" + icon_state = "cutout_lusty"; + +/obj/item/cardboard_cutout/adaptive/chess/bishop + name = "White Bishop" + icon_state = "cutout_ntsec"; + +/obj/item/cardboard_cutout/adaptive/chess/pawn + name = "White Pawn" + icon_state = "cutout_greytide"; + +// BLACK + +/obj/item/cardboard_cutout/adaptive/chess/black + color = "#9999BB"; + +/obj/item/cardboard_cutout/adaptive/chess/black/king + name = "Black King" + icon_state = "cutout_wizard"; + +/obj/item/cardboard_cutout/adaptive/chess/black/queen + name = "Black Queen" + icon_state = "cutout_traitor"; + +/obj/item/cardboard_cutout/adaptive/chess/black/rook + name = "Black Rook" + icon_state = "cutout_cultist"; + +/obj/item/cardboard_cutout/adaptive/chess/black/knight + name = "Black Knight" + icon_state = "cutout_fukken_xeno"; + +/obj/item/cardboard_cutout/adaptive/chess/black/bishop + name = "Black Bishop" + icon_state = "cutout_fluke"; + +/obj/item/cardboard_cutout/adaptive/chess/black/pawn + name = "Black Pawn" + icon_state = "cutout_shadowling"; \ No newline at end of file diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 98d30612f75b5..0204aa4bb614d 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -111,7 +111,7 @@ lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "stamina" = 0) resistance_flags = FIRE_PROOF | ACID_PROOF var/mining_points = 0 //For redeeming at mining equipment vendors var/list/access = list() @@ -466,6 +466,19 @@ update_label("John Doe", "Clowny") assignment = "Syndicate Officer" access = list(ACCESS_SYNDICATE) +/obj/item/card/id/syndicate/debug + name = "\improper Debug ID" + desc = "A shimmering ID card with the ability to open anything." + icon_state = "centcom" + registered_name = "Central Command" + assignment = "Admiral" + anyone = TRUE + +/obj/item/card/id/syndicate/debug/Initialize() + access = get_every_access() + registered_account = SSeconomy.get_dep_account(ACCOUNT_CAR) + . = ..() + /obj/item/card/id/captains_spare name = "captain's spare ID" desc = "The spare ID of the High Lord himself." @@ -548,6 +561,15 @@ update_label("John Doe", "Clowny") access = get_all_accesses() . = ..() +/obj/item/card/id/ert/kudzu + registered_name = "Weed Whacker" + assignment = "Weed Whacker" + icon_state = "ert" + +/obj/item/card/id/ert/kudzu/Initialize() + access = get_all_accesses() + . = ..() + /obj/item/card/id/prisoner name = "prisoner ID card" desc = "You are a number, you are not a free man." @@ -643,11 +665,12 @@ update_label("John Doe", "Clowny") ///Department Budget Cards/// /obj/item/card/id/departmental_budget - name = "departmental card (FUCK)" + name = "departmental card (budget)" desc = "Provides access to the departmental budget." icon_state = "budget" var/department_ID = ACCOUNT_CIV var/department_name = ACCOUNT_CIV_NAME + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF /obj/item/card/id/departmental_budget/Initialize() . = ..() @@ -746,6 +769,9 @@ update_label("John Doe", "Clowny") /obj/item/card/id/job/miner icon_state = "miner" +/obj/item/card/id/job/exploration + icon_state = "exploration" + /obj/item/card/id/job/cargo icon_state = "cargo" @@ -757,3 +783,26 @@ update_label("John Doe", "Clowny") /obj/item/card/id/job/lawyer icon_state = "lawyer" + +/obj/item/card/id/pass + name = "promotion pass" + desc = "A card that, when swiped on your ID card, will grant you all the access. Should not substitute your actual ID card." + icon_state = "data_1" + registered_name = "Unregistered ID" + assignment = "Access Pass" + +/obj/item/card/id/pass/afterattack(atom/target, mob/user, proximity) + . = ..() + if (!proximity) + return . + var/obj/item/card/id/idcard = target + if(istype(idcard)) + for(var/give_access in access) + idcard.access |= give_access + if(assignment!=initial(assignment)) + idcard.assignment = assignment + if(name!=initial(name)) + idcard.name = name + to_chat(user, "You upgrade your [idcard] with the [name].") + log_id("[key_name(user)] added access to '[idcard]' using [src] at [AREACOORD(user)].") + qdel(src) diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm new file mode 100644 index 0000000000000..f060eb90e16c2 --- /dev/null +++ b/code/game/objects/items/chainsaw.dm @@ -0,0 +1,140 @@ + +// CHAINSAW +/obj/item/chainsaw + name = "chainsaw" + desc = "A versatile power tool. Useful for limbing trees and delimbing humans." + icon_state = "chainsaw_off" + lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' + flags_1 = CONDUCT_1 + force = 13 + block_power = 20 + block_upgrade_walk = 2 + block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY + attack_weight = 2 + var/force_on = 24 + w_class = WEIGHT_CLASS_HUGE + throwforce = 13 + throw_speed = 2 + throw_range = 4 + materials = list(/datum/material/iron=13000) + attack_verb = list("sawed", "tore", "cut", "chopped", "diced") + hitsound = "swing_hit" + sharpness = IS_SHARP + actions_types = list(/datum/action/item_action/startchainsaw) + var/on = FALSE + tool_behaviour = TOOL_SAW + toolspeed = 0.5 + +/obj/item/chainsaw/Initialize() + . = ..() + +/obj/item/chainsaw/ComponentInitialize() + . = ..() + AddComponent(/datum/component/butchering, 30, 100, 0, 'sound/weapons/chainsawhit.ogg', TRUE) + AddComponent(/datum/component/two_handed, require_twohands=TRUE, block_power_unwielded=block_power, block_power_wielded=block_power) + +/obj/item/chainsaw/suicide_act(mob/living/carbon/user) + if(on) + user.visible_message("[user] begins to tear [user.p_their()] head off with [src]! It looks like [user.p_theyre()] trying to commit suicide!") + playsound(src, 'sound/weapons/chainsawhit.ogg', 100, TRUE) + var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD) + if(myhead) + myhead.dismember() + else + user.visible_message("[user] smashes [src] into [user.p_their()] neck, destroying [user.p_their()] esophagus! It looks like [user.p_theyre()] trying to commit suicide!") + playsound(src, 'sound/weapons/genhit1.ogg', 100, TRUE) + return(BRUTELOSS) + +/obj/item/chainsaw/attack_self(mob/user) + on = !on + to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr." : "the chain stops moving."]") + force = on ? force_on : initial(force) + throwforce = on ? force_on : initial(force) + icon_state = "chainsaw_[on ? "on" : "off"]" + var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) + butchering.butchering_enabled = on + + if(on) + hitsound = 'sound/weapons/chainsawhit.ogg' + else + hitsound = "swing_hit" + + if(src == user.get_active_held_item()) //update inhands + user.update_inv_hands() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +// DOOMGUY CHAINSAW +/obj/item/chainsaw/doomslayer + name = "THE GREAT COMMUNICATOR" + desc = "VRRRRRRR!!!" + armour_penetration = 100 + force_on = 30 + +/obj/item/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) + 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, TRUE) + return 1 + return 0 + +// ENERGY CHAINSAW +/obj/item/chainsaw/energy + name = "energy chainsaw" + desc = "Become Leatherspace." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "echainsaw_off" + lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' + force_on = 40 + w_class = WEIGHT_CLASS_HUGE + attack_verb = list("sawed", "shred", "rended", "gutted", "eviscerated") + actions_types = list(/datum/action/item_action/startchainsaw) + block_power = 50 + armour_penetration = 50 + light_color = "#ff0000" + var/onsound + var/offsound + onsound = 'sound/weapons/echainsawon.ogg' + offsound = 'sound/weapons/echainsawoff.ogg' + on = FALSE + var/brightness_on = 3 + +/obj/item/chainsaw/energy/attack_self(mob/user) + on = !on + to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr intimidatingly." : "the plasma microblades stop moving."]") + force = on ? force_on : initial(force) + playsound(user, on ? onsound : offsound , 50, 1) + set_light(on ? brightness_on : 0) + throwforce = on ? force_on : initial(force) + icon_state = "echainsaw_[on ? "on" : "off"]" + + if(hitsound == "swing_hit") + hitsound = pick('sound/weapons/echainsawhit1.ogg','sound/weapons/echainsawhit2.ogg') + else + hitsound = "swing_hit" + + if(src == user.get_active_held_item()) + user.update_inv_hands() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +// DOOMGUY ENERGY CHAINSAW +/obj/item/chainsaw/energy/doom + name = "super energy chainsaw" + desc = "The chainsaw you want when you need to kill every damn thing in the room." + force_on = 60 + w_class = WEIGHT_CLASS_NORMAL + block_power = 75 + block_level = 1 + attack_weight = 3 //fear him + armour_penetration = 75 + var/knockdown = 1 + brightness_on = 6 + +/obj/item/chainsaw/energy/doom/attack(mob/living/target) + ..() + target.Knockdown(4) \ No newline at end of file diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm index 337092108e52f..ecbb9cafa15d7 100644 --- a/code/game/objects/items/charter.dm +++ b/code/game/objects/items/charter.dm @@ -100,7 +100,7 @@ /obj/item/station_charter/flag - name = "nanotrasen banner" + name = "\improper Nanotrasen banner" icon = 'icons/obj/banner.dmi' name_type = "planet" icon_state = "banner" diff --git a/code/game/objects/items/chromosome.dm b/code/game/objects/items/chromosome.dm index 1340e7f35b44c..8330a8e202349 100644 --- a/code/game/objects/items/chromosome.dm +++ b/code/game/objects/items/chromosome.dm @@ -53,32 +53,32 @@ /obj/item/chromosome/stabilizer name = "stabilizer chromosome" - desc = "A chromosome that adjusts to the body to reduce genetic damage by 20%." + desc = "A chromosome that reduces mutation instability by 20%." icon_state = "stabilizer" stabilizer_coeff = 0.8 weight = 1 /obj/item/chromosome/synchronizer name = "synchronizer chromosome" - desc = "A chromosome that gives the mind more controle over the mutation, reducing knockback and downsides by 50%." + desc = "A chromosome that reduces mutation knockback and downsides by 50%." icon_state = "synchronizer" synchronizer_coeff = 0.5 /obj/item/chromosome/power name = "power chromosome" - desc = "A power chromosome for boosting certain mutation's power by 50%." + desc = "A chromosome that increases mutation power by 50%." icon_state = "power" power_coeff = 1.5 /obj/item/chromosome/energy name = "energetic chromosome" - desc = "A chromosome that reduces cooldown on action based mutations by 50%." + desc = "A chromosome that reduces action based mutation cooldowns by by 50%." icon_state = "energy" energy_coeff = 0.5 /obj/item/chromosome/reinforcer name = "reinforcement chromosome" - desc = "Renders the mutation immune to mutadone." + desc = "A chromosome that renders mutations immune to mutadone." icon_state = "reinforcer" weight = 3 diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index 04caab6593d6a..154215e098086 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -38,7 +38,7 @@ user.put_in_hands(PA) /obj/item/chrono_eraser/item_action_slot_check(slot, mob/user) - if(slot == SLOT_BACK) + if(slot == ITEM_SLOT_BACK) return 1 /obj/item/gun/energy/chrono_gun @@ -133,6 +133,10 @@ if(istype(C)) gun = C.gun +/obj/item/projectile/energy/chrono_beam/Destroy() + gun = null + return ..() + /obj/item/projectile/energy/chrono_beam/on_hit(atom/target) if(target && gun && isliving(target)) var/obj/structure/chrono_field/F = new(target.loc, target, gun) @@ -151,7 +155,9 @@ gun = loc . = ..() - +/obj/item/ammo_casing/energy/chrono_beam/Destroy() + gun = null + return ..() @@ -167,7 +173,7 @@ interaction_flags_atom = NONE var/mob/living/captured = null var/obj/item/gun/energy/chrono_gun/gun = null - var/tickstokill = 15 + var/timetokill = 30 var/mutable_appearance/mob_underlay var/preloaded = 0 var/RPpos = null @@ -198,7 +204,7 @@ return ..() /obj/structure/chrono_field/update_icon() - var/ttk_frame = 1 - (tickstokill / initial(tickstokill)) + var/ttk_frame = 1 - (timetokill / initial(timetokill)) ttk_frame = CLAMP(CEILING(ttk_frame * CHRONO_FRAME_COUNT, 1), 1, CHRONO_FRAME_COUNT) if(ttk_frame != RPpos) RPpos = ttk_frame @@ -206,15 +212,15 @@ underlays = list() //hack: BYOND refuses to update the underlay to match the icon_state otherwise underlays += mob_underlay -/obj/structure/chrono_field/process() +/obj/structure/chrono_field/process(delta_time) if(captured) - if(tickstokill > initial(tickstokill)) + if(timetokill > initial(timetokill)) for(var/atom/movable/AM in contents) AM.forceMove(drop_location()) qdel(src) - else if(tickstokill <= 0) + else if(timetokill <= 0) to_chat(captured, "As the last essence of your being is erased from time, you are taken back to your most enjoyable memory. You feel happy...") - var/mob/dead/observer/ghost = captured.ghostize(1) + var/mob/dead/observer/ghost = captured.ghostize(TRUE,SENTIENCE_ERASE) if(captured.mind) if(ghost) ghost.mind = null @@ -229,12 +235,12 @@ update_icon() if(gun) if(gun.field_check(src)) - tickstokill-- + timetokill -= delta_time else gun = null return .() else - tickstokill++ + timetokill += delta_time else qdel(src) @@ -248,12 +254,18 @@ return BULLET_ACT_HIT /obj/structure/chrono_field/assume_air() - return 0 + return null + +/obj/effect/chrono_field/assume_air_moles() + return null + +/obj/effect/chrono_field/assume_air_ratio() + return null /obj/structure/chrono_field/return_air() //we always have nominal air and temperature var/datum/gas_mixture/GM = new - GM.set_moles(/datum/gas/oxygen, MOLES_O2STANDARD) - GM.set_moles(/datum/gas/nitrogen, MOLES_N2STANDARD) + GM.set_moles(GAS_O2, MOLES_O2STANDARD) + GM.set_moles(GAS_N2, MOLES_N2STANDARD) GM.set_temperature(T20C) return GM diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 62b63fdaa4fca..1e29de9537a4f 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -22,14 +22,15 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_state = "match_unlit" var/lit = FALSE var/burnt = FALSE - var/smoketime = 5 // 10 seconds + /// How long the match lasts in seconds + var/smoketime = 10 w_class = WEIGHT_CLASS_TINY heat = 1000 grind_results = list(/datum/reagent/phosphorus = 2) -/obj/item/match/process() - smoketime-- - if(smoketime < 1) +/obj/item/match/process(delta_time) + smoketime -= delta_time + if(smoketime <= 0) matchburnout() else open_flame(heat) @@ -90,7 +91,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM ..() /obj/item/proc/help_light_cig(mob/living/M) - var/mask_item = M.get_item_by_slot(SLOT_WEAR_MASK) + var/mask_item = M.get_item_by_slot(ITEM_SLOT_MASK) if(istype(mask_item, /obj/item/clothing/mask/cigarette)) return mask_item @@ -100,7 +101,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/match/firebrand name = "firebrand" desc = "An unlit firebrand. It makes you wonder why it's not just called a stick." - smoketime = 20 //40 seconds + smoketime = 40 grind_results = list(/datum/reagent/carbon = 2) /obj/item/match/firebrand/Initialize() @@ -120,7 +121,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM body_parts_covered = null grind_results = list() heat = 1000 - var/dragtime = 100 + var/dragtime = 10 var/nextdragtime = 0 var/lit = FALSE var/starts_lit = FALSE @@ -128,7 +129,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/icon_off = "cigoff" var/type_butt = /obj/item/cigbutt var/lastHolder = null - var/smoketime = 180 // 1 is 2 seconds, so a single cigarette will last 6 minutes. + /// How long the cigarette lasts in seconds + var/smoketime = 360 var/chem_volume = 30 var/smoke_all = FALSE /// Should we smoke all of the chems in the cig before it runs out. Splits each puff to take a portion of the overall chems so by the end you'll always have consumed all of the chems inside. var/list/list_reagents = list(/datum/reagent/drug/nicotine = 15) @@ -144,7 +146,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM reagents.add_reagent_list(list_reagents) if(starts_lit) light() - AddComponent(/datum/component/knockoff,90,list(BODY_ZONE_PRECISE_MOUTH),list(SLOT_WEAR_MASK))//90% to knock off when wearing a mask + AddComponent(/datum/component/knockoff,90,list(BODY_ZONE_PRECISE_MOUTH),list(ITEM_SLOT_MASK))//90% to knock off when wearing a mask /obj/item/clothing/mask/cigarette/Destroy() STOP_PROCESSING(SSobj, src) @@ -247,7 +249,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM * of chems to give them each time so they'll have smoked it all by the end */ if (smoke_all) - to_smoke = reagents.total_volume/((smoketime * 2) / (dragtime / 10)) + to_smoke = reagents.total_volume / (smoketime / dragtime) reagents.reaction(C, INGEST, fraction) if(!reagents.trans_to(C, to_smoke)) @@ -255,13 +257,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM return reagents.remove_any(to_smoke) -/obj/item/clothing/mask/cigarette/process() +/obj/item/clothing/mask/cigarette/process(delta_time) var/turf/location = get_turf(src) var/mob/living/M = loc if(isliving(loc)) M.IgniteMob() - smoketime-- - if(smoketime < 1) + smoketime -= delta_time + if(smoketime <= 0) new type_butt(location) if(ismob(loc)) to_chat(M, "Your [name] goes out.") @@ -270,7 +272,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM return open_flame() if((reagents && reagents.total_volume) && (nextdragtime <= world.time)) - nextdragtime = world.time + dragtime + nextdragtime = world.time + dragtime SECONDS handle_reagents() /obj/item/clothing/mask/cigarette/attack_self(mob/user) @@ -326,14 +328,14 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/cigarette/carp desc = "A Carp Classic brand cigarette." - + /obj/item/clothing/mask/cigarette/plasma - list_reagents = list(/datum/reagent/toxin/plasma = 5) + list_reagents = list(/datum/reagent/toxin/plasma = 5) /obj/item/clothing/mask/cigarette/syndicate desc = "An unknown brand cigarette." chem_volume = 60 - smoketime = 60 + smoketime = 2 * 60 smoke_all = TRUE list_reagents = list(/datum/reagent/drug/nicotine = 10, /datum/reagent/medicine/omnizine = 15) @@ -356,7 +358,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM type_butt = /obj/item/cigbutt/roach throw_speed = 0.5 item_state = "spliffoff" - smoketime = 120 // four minutes + smoketime = 4 * 60 chem_volume = 50 list_reagents = null @@ -401,7 +403,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM type_butt = /obj/item/cigbutt/cigarbutt throw_speed = 0.5 item_state = "cigaroff" - smoketime = 300 // 11 minutes + smoketime = 11 * 60 chem_volume = 40 list_reagents = list(/datum/reagent/drug/nicotine = 25) @@ -411,7 +413,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_state = "cigar2off" icon_on = "cigar2on" icon_off = "cigar2off" - smoketime = 600 // 20 minutes + smoketime = 20 * 60 chem_volume = 80 list_reagents =list(/datum/reagent/drug/nicotine = 40) @@ -421,7 +423,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_state = "cigar2off" icon_on = "cigar2on" icon_off = "cigar2off" - smoketime = 900 // 30 minutes + smoketime = 30 * 60 chem_volume = 50 list_reagents =list(/datum/reagent/drug/nicotine = 15) @@ -462,10 +464,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM STOP_PROCESSING(SSobj, src) . = ..() -/obj/item/clothing/mask/cigarette/pipe/process() +/obj/item/clothing/mask/cigarette/pipe/process(delta_time) var/turf/location = get_turf(src) - smoketime-- - if(smoketime < 1) + smoketime -= delta_time + if(smoketime <= 0) new /obj/effect/decal/cleanable/ash(location) if(ismob(loc)) var/mob/living/M = loc @@ -489,8 +491,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(!packeditem) if(G.dry == 1) to_chat(user, "You stuff [O] into [src].") - smoketime = 400 - packeditem = 1 + smoketime = 13 * 60 + packeditem = TRUE name = "[O.name]-packed [initial(name)]" if(O.reagents) O.reagents.trans_to(src, O.reagents.total_volume, transfered_by = user) @@ -775,8 +777,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM w_class = WEIGHT_CLASS_TINY var/chem_volume = 100 var/vapetime = 0 //this so it won't puff out clouds every tick - var/screw = 0 // kinky - var/super = 0 //for the fattest vapes dude. + /// How often we take a drag in seconds + var/vapedelay = 8 + var/screw = FALSE // kinky + var/super = FALSE //for the fattest vapes dude. /obj/item/clothing/mask/vape/suicide_act(mob/user) user.visible_message("[user] is puffin hard on dat vape, [user.p_they()] trying to join the vape life on a whole notha plane!")//it doesn't give you cancer, it is cancer @@ -852,7 +856,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM reagents.clear_reagents() /obj/item/clothing/mask/vape/equipped(mob/user, slot) - if(slot == SLOT_WEAR_MASK) + if(slot == ITEM_SLOT_MASK) if(!screw) to_chat(user, "You start puffing on the vape.") DISABLE_BITFIELD(reagents.flags, NO_REACT) @@ -861,8 +865,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) + if(user.get_item_by_slot(ITEM_SLOT_MASK) == src) ENABLE_BITFIELD(reagents.flags, NO_REACT) STOP_PROCESSING(SSobj, src) @@ -888,13 +891,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM return reagents.remove_any(REAGENTS_METABOLISM) -/obj/item/clothing/mask/vape/process() +/obj/item/clothing/mask/vape/process(delta_time) var/mob/living/M = loc if(isliving(loc)) M.IgniteMob() - vapetime++ + vapetime += delta_time if(!reagents.total_volume) if(ismob(loc)) @@ -904,17 +907,17 @@ CIGARETTE PACKETS ARE IN FANCY.DM return //open flame removed because vapes are a closed system, they wont light anything on fire - if(super && vapetime > 3)//Time to start puffing those fat vapes, yo. + if(super && vapetime >= vapedelay)//Time to start puffing those fat vapes, yo. var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new s.set_up(reagents, 1, 24, loc) s.start() - vapetime = 0 + vapetime -= vapedelay - if((obj_flags & EMAGGED) && vapetime > 3) + if((obj_flags & EMAGGED) && vapetime >= vapedelay) var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new s.set_up(reagents, 4, 24, loc) s.start() - vapetime = 0 + vapetime -= vapedelay if(prob(5))//small chance for the vape to break and deal damage if it's emagged playsound(get_turf(src), 'sound/effects/pop_expl.ogg', 50, 0) M.apply_damage(20, BURN, BODY_ZONE_HEAD) diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index e4c7c58a64ca6..a7282e9e2928e 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -2,32 +2,32 @@ /obj/item/circuitboard/computer/aiupload - name = "AI Upload (Computer Board)" + name = "AI upload (Computer Board)" icon_state = "command" build_path = /obj/machinery/computer/upload/ai /obj/item/circuitboard/computer/borgupload - name = "Cyborg Upload (Computer Board)" + name = "cyborg upload (Computer Board)" icon_state = "command" build_path = /obj/machinery/computer/upload/borg /obj/item/circuitboard/computer/bsa_control - name = "Bluespace Artillery Controls (Computer Board)" + name = "bluespace artillery controls (Computer Board)" icon_state = "command" build_path = /obj/machinery/computer/bsa_control /obj/item/circuitboard/computer/card - name = "ID Console (Computer Board)" + name = "ID console (Computer Board)" icon_state = "command" build_path = /obj/machinery/computer/card /obj/item/circuitboard/computer/card/centcom - name = "CentCom ID Console (Computer Board)" + name = "CentCom ID console (Computer Board)" icon_state = "command" build_path = /obj/machinery/computer/card/centcom /obj/item/circuitboard/computer/card/minor - name = "Department Management Console (Computer Board)" + name = "department management console (Computer Board)" icon_state = "command" build_path = /obj/machinery/computer/card/minor var/target_dept = 1 @@ -45,10 +45,24 @@ . += "Currently set to \"[dept_list[target_dept]]\"." /obj/item/circuitboard/computer/communications - name = "Communications (Computer Board)" + name = "communications console (Computer Board)" icon_state = "command" + desc = "Can be modified using a screwdriver." build_path = /obj/machinery/computer/communications var/lastTimeUsed = 0 + var/insecure = FALSE // Forbids shuttles that are set as illegal. + +/obj/item/circuitboard/computer/communications/attackby(obj/item/I, mob/user, params) + if(I.tool_behaviour == TOOL_SCREWDRIVER) + insecure = !insecure + if(insecure) + desc = "Tampering has removed some safety features from this circuit board. A screwdriver can undo this." + to_chat(user, "You disable the shuttle safety features of the board.") + else + desc = "Can be modified using a screwdriver." + to_chat(user, "You re-enable the shuttle safety features of the board.") + else + return ..() //obj/item/circuitboard/computer/shield // name = "Shield Control (Computer Board)" @@ -59,117 +73,117 @@ /obj/item/circuitboard/computer/apc_control - name = "\improper Power Flow Control Console (Computer Board)" + name = "power flow control console (Computer Board)" icon_state = "engineering" build_path = /obj/machinery/computer/apc_control /obj/item/circuitboard/computer/atmos_alert - name = "Atmospheric Alert (Computer Board)" + name = "atmospheric alert console (Computer Board)" icon_state = "engineering" build_path = /obj/machinery/computer/atmos_alert /obj/item/circuitboard/computer/atmos_control - name = "Atmospheric Monitor (Computer Board)" + name = "atmospheric monitor console (Computer Board)" icon_state = "engineering" build_path = /obj/machinery/computer/atmos_control /obj/item/circuitboard/computer/atmos_control/tank - name = "Tank Control (Computer Board)" + name = "tank control console (Computer Board)" build_path = /obj/machinery/computer/atmos_control/tank /obj/item/circuitboard/computer/atmos_control/tank/oxygen_tank - name = "Oxygen Supply Control (Computer Board)" + name = "oxygen supply control (Computer Board)" build_path = /obj/machinery/computer/atmos_control/tank/oxygen_tank /obj/item/circuitboard/computer/atmos_control/tank/toxin_tank - name = "Plasma Supply Control (Computer Board)" + name = "plasma supply control (Computer Board)" build_path = /obj/machinery/computer/atmos_control/tank/toxin_tank /obj/item/circuitboard/computer/atmos_control/tank/air_tank - name = "Mixed Air Supply Control (Computer Board)" + name = "mixed air supply control (Computer Board)" build_path = /obj/machinery/computer/atmos_control/tank/air_tank /obj/item/circuitboard/computer/atmos_control/tank/mix_tank - name = "Gas Mix Supply Control (Computer Board)" + name = "gas mix supply control (Computer Board)" build_path = /obj/machinery/computer/atmos_control/tank/mix_tank /obj/item/circuitboard/computer/atmos_control/tank/nitrous_tank - name = "Nitrous Oxide Supply Control (Computer Board)" + name = "nitrous oxide supply control (Computer Board)" build_path = /obj/machinery/computer/atmos_control/tank/nitrous_tank /obj/item/circuitboard/computer/atmos_control/tank/nitrogen_tank - name = "Nitrogen Supply Control (Computer Board)" + name = "nitrogen supply control (Computer Board)" build_path = /obj/machinery/computer/atmos_control/tank/nitrogen_tank /obj/item/circuitboard/computer/atmos_control/tank/carbon_tank - name = "Carbon Dioxide Supply Control (Computer Board)" + name = "carbon dioxide supply control (Computer Board)" build_path = /obj/machinery/computer/atmos_control/tank/carbon_tank /obj/item/circuitboard/computer/atmos_control/tank/incinerator - name = "Incinerator Air Control (Computer Board)" + name = "incinerator air control (Computer Board)" build_path = /obj/machinery/computer/atmos_control/tank/incinerator /obj/item/circuitboard/computer/auxillary_base - name = "Auxillary Base Management Console (Computer Board)" + name = "auxillary base management console (Computer Board)" icon_state = "engineering" build_path = /obj/machinery/computer/auxillary_base /obj/item/circuitboard/computer/base_construction - name = "circuit board (Aux Mining Base Construction Console)" + name = "aux mining base construction console (Computer Board)" icon_state = "engineering" build_path = /obj/machinery/computer/camera_advanced/base_construction /obj/item/circuitboard/computer/comm_monitor - name = "Telecommunications Monitor (Computer Board)" + name = "telecommunications monitor (Computer Board)" icon_state = "engineering" build_path = /obj/machinery/computer/telecomms/monitor /obj/item/circuitboard/computer/comm_server - name = "Telecommunications Server Monitor (Computer Board)" + name = "telecommunications server monitor (Computer Board)" icon_state = "engineering" build_path = /obj/machinery/computer/telecomms/server /obj/item/circuitboard/computer/message_monitor - name = "Message Monitor (Computer Board)" + name = "message monitor (Computer Board)" icon_state = "engineering" build_path = /obj/machinery/computer/message_monitor /obj/item/circuitboard/computer/powermonitor - name = "Power Monitor (Computer Board)" //name fixed 250810 + name = "power monitor (Computer Board)" //name fixed 250810 icon_state = "engineering" build_path = /obj/machinery/computer/monitor /obj/item/circuitboard/computer/powermonitor/secret - name = "Outdated Power Monitor (Computer Board)" //Variant used on ruins to prevent them from showing up on PDA's. + name = "outdated power monitor (Computer Board)" //Variant used on ruins to prevent them from showing up on PDA's. build_path = /obj/machinery/computer/monitor/secret /obj/item/circuitboard/computer/sat_control - name = "Satellite Network Control (Computer Board)" + name = "satellite network control (Computer Board)" icon_state = "engineering" build_path = /obj/machinery/computer/sat_control /obj/item/circuitboard/computer/solar_control - name = "Solar Control (Computer Board)" //name fixed 250810 + name = "solar control (Computer Board)" //name fixed 250810 icon_state = "engineering" build_path = /obj/machinery/power/solar_control /obj/item/circuitboard/computer/stationalert - name = "Station Alerts (Computer Board)" + name = "station alerts console (Computer Board)" icon_state = "engineering" build_path = /obj/machinery/computer/station_alert /obj/item/circuitboard/computer/teleporter - name = "Teleporter (Computer Board)" + name = "teleporter console (Computer Board)" icon_state = "engineering" build_path = /obj/machinery/computer/teleporter /obj/item/circuitboard/computer/turbine_computer - name = "Turbine Computer (Computer Board)" + name = "turbine computer (Computer Board)" icon_state = "engineering" build_path = /obj/machinery/computer/turbine_computer /obj/item/circuitboard/computer/turbine_control - name = "Turbine control (Computer Board)" + name = "turbine control (Computer Board)" icon_state = "engineering" build_path = /obj/machinery/computer/turbine_computer @@ -178,7 +192,7 @@ /obj/item/circuitboard/computer/advanced_camera - name = "Advanced Camera Console (Computer Board)" + name = "advanced camera console (Computer Board)" icon_state = "generic" build_path = /obj/machinery/computer/camera_advanced/syndie @@ -188,7 +202,7 @@ build_path = /obj/machinery/computer/arcade/amputation /obj/item/circuitboard/computer/arcade/battle - name = "Arcade Battle (Computer Board)" + name = "arcade battle (Computer Board)" icon_state = "generic" build_path = /obj/machinery/computer/arcade/battle @@ -198,12 +212,12 @@ build_path = /obj/machinery/computer/arcade/orion_trail /obj/item/circuitboard/computer/holodeck// Not going to let people get this, but it's just here for future - name = "Holodeck Control (Computer Board)" + name = "holodeck control (Computer Board)" icon_state = "generic" build_path = /obj/machinery/computer/holodeck /obj/item/circuitboard/computer/libraryconsole - name = "Library Visitor Console (Computer Board)" + name = "library visitor console (Computer Board)" icon_state = "generic" build_path = /obj/machinery/computer/libraryconsole @@ -221,9 +235,9 @@ return ..() /obj/item/circuitboard/computer/monastery_shuttle - name = "Monastery Shuttle (Computer Board)" + name = "monastery shuttle console (Computer Board)" icon_state = "generic" - build_path = /obj/machinery/computer/shuttle/monastery_shuttle + build_path = /obj/machinery/computer/shuttle_flight/monastery_shuttle /obj/item/circuitboard/computer/olddoor name = "DoorMex (Computer Board)" @@ -231,12 +245,12 @@ build_path = /obj/machinery/computer/pod/old /obj/item/circuitboard/computer/pod - name = "Massdriver control (Computer Board)" + name = "mass driver launch control (Computer Board)" icon_state = "generic" build_path = /obj/machinery/computer/pod /obj/item/circuitboard/computer/slot_machine - name = "Slot Machine (Computer Board)" + name = "slot machine (Computer Board)" icon_state = "generic" build_path = /obj/machinery/computer/slot_machine @@ -246,9 +260,9 @@ build_path = /obj/machinery/computer/pod/old/swf /obj/item/circuitboard/computer/syndicate_shuttle - name = "Syndicate Shuttle (Computer Board)" + name = "syndicate shuttle console (Computer Board)" icon_state = "generic" - build_path = /obj/machinery/computer/shuttle/syndicate + build_path = /obj/machinery/computer/shuttle_flight/syndicate var/challenge = FALSE var/moved = FALSE @@ -266,48 +280,43 @@ build_path = /obj/machinery/computer/pod/old/syndicate /obj/item/circuitboard/computer/white_ship - name = "White Ship (Computer Board)" + name = "white ship control (Computer Board)" icon_state = "generic" - build_path = /obj/machinery/computer/shuttle/white_ship + build_path = /obj/machinery/computer/shuttle_flight/white_ship /obj/item/circuitboard/computer/white_ship/pod - name = "Salvage Pod (Computer Board)" - build_path = /obj/machinery/computer/shuttle/white_ship/pod + name = "salvage pod control (Computer Board)" + build_path = /obj/machinery/computer/shuttle_flight/white_ship/pod /obj/item/circuitboard/computer/white_ship/pod/recall - name = "Salvage Pod Recall (Computer Board)" - build_path = /obj/machinery/computer/shuttle/white_ship/pod/recall + name = "salvage pod recall control (Computer Board)" + build_path = /obj/machinery/computer/shuttle_flight/white_ship/pod/recall /obj/item/circuitboard/computer/shuttle/flight_control - name = "Shuttle Flight Control (Computer Board)" + name = "shuttle flight control (Computer Board)" icon_state = "generic" - build_path = /obj/machinery/computer/custom_shuttle - -/obj/item/circuitboard/computer/shuttle/docker - name = "Shuttle Navigation Computer (Computer Board)" - icon_state = "generic" - build_path = /obj/machinery/computer/camera_advanced/shuttle_docker/custom - + build_path = /obj/machinery/computer/shuttle_flight/custom_shuttle //Medical /obj/item/circuitboard/computer/cloning - name = "Cloning (Computer Board)" + name = "cloning console (Computer Board)" icon_state = "medical" build_path = /obj/machinery/computer/cloning + var/list/records = list() /obj/item/circuitboard/computer/crew - name = "Crew Monitoring Console (Computer Board)" + name = "crew monitoring console (Computer Board)" icon_state = "medical" build_path = /obj/machinery/computer/crew /obj/item/circuitboard/computer/med_data - name = "Medical Records Console (Computer Board)" + name = "medical records console (Computer Board)" icon_state = "medical" build_path = /obj/machinery/computer/med_data /obj/item/circuitboard/computer/operating - name = "Operating Computer (Computer Board)" + name = "operating computer (Computer Board)" icon_state = "medical" build_path = /obj/machinery/computer/operating @@ -316,13 +325,13 @@ icon_state = "medical" build_path = /obj/machinery/computer/pandemic -/obj/item/circuitboard/computer/prototype_cloning - name = "Prototype Cloning (Computer Board)" +/obj/item/circuitboard/computer/cloning/prototype + name = "prototype cloning console (Computer Board)" icon_state = "medical" - build_path = /obj/machinery/computer/prototype_cloning + build_path = /obj/machinery/computer/cloning/prototype /obj/item/circuitboard/computer/scan_consolenew - name = "DNA Machine (Computer Board)" + name = "DNA machine (Computer Board)" icon_state = "medical" build_path = /obj/machinery/computer/scan_consolenew @@ -331,42 +340,42 @@ /obj/item/circuitboard/computer/aifixer - name = "AI Integrity Restorer (Computer Board)" + name = "AI integrity restorer console (Computer Board)" icon_state = "science" build_path = /obj/machinery/computer/aifixer /obj/item/circuitboard/computer/launchpad_console - name = "Launchpad Control Console (Computer Board)" + name = "launchpad control console (Computer Board)" icon_state = "science" build_path = /obj/machinery/computer/launchpad /obj/item/circuitboard/computer/mech_bay_power_console - name = "Mech Bay Power Control Console (Computer Board)" + name = "mech bay power control console (Computer Board)" icon_state = "science" build_path = /obj/machinery/computer/mech_bay_power_console /obj/item/circuitboard/computer/mecha_control - name = "Exosuit Control Console (Computer Board)" + name = "exosuit control console (Computer Board)" icon_state = "science" build_path = /obj/machinery/computer/mecha /obj/item/circuitboard/computer/nanite_chamber_control - name = "Nanite Chamber Control (Computer Board)" + name = "nanite chamber control (Computer Board)" icon_state = "science" build_path = /obj/machinery/computer/nanite_chamber_control /obj/item/circuitboard/computer/nanite_cloud_controller - name = "Nanite Cloud Control (Computer Board)" + name = "nanite cloud control (Computer Board)" icon_state = "science" build_path = /obj/machinery/computer/nanite_cloud_controller /obj/item/circuitboard/computer/rdconsole - name = "R&D Console (Computer Board)" + name = "R&D console (Computer Board)" icon_state = "science" build_path = /obj/machinery/computer/rdconsole/core /obj/item/circuitboard/computer/rdconsole/production - name = "R&D Console Production Only (Computer Board)" + name = "R&D console - production only (Computer Board)" build_path = /obj/machinery/computer/rdconsole/production /obj/item/circuitboard/computer/rdconsole/attackby(obj/item/I, mob/user, params) @@ -383,22 +392,22 @@ return ..() /obj/item/circuitboard/computer/rdservercontrol - name = "R&D Server Control (Computer Board)" + name = "R&D server control (Computer Board)" icon_state = "science" build_path = /obj/machinery/computer/rdservercontrol /obj/item/circuitboard/computer/research - name = "Research Monitor (Computer Board)" + name = "research monitor (Computer Board)" icon_state = "science" build_path = /obj/machinery/computer/security/research /obj/item/circuitboard/computer/robotics - name = "Robotics Control (Computer Board)" + name = "robotics control (Computer Board)" icon_state = "science" build_path = /obj/machinery/computer/robotics /obj/item/circuitboard/computer/xenobiology - name = "circuit board (Xenobiology Console)" + name = "xenobiology console (Computer Board)" icon_state = "science" build_path = /obj/machinery/computer/camera_advanced/xenobio @@ -407,36 +416,36 @@ /obj/item/circuitboard/computer/labor_shuttle - name = "Labor Shuttle (Computer Board)" + name = "labor shuttle console (Computer Board)" icon_state = "security" - build_path = /obj/machinery/computer/shuttle/labor + build_path = /obj/machinery/computer/shuttle_flight/labor /obj/item/circuitboard/computer/labor_shuttle/one_way - name = "Prisoner Shuttle Console (Computer Board)" - build_path = /obj/machinery/computer/shuttle/labor/one_way + name = "prisoner shuttle console (Computer Board)" + build_path = /obj/machinery/computer/shuttle_flight/labor/one_way /obj/item/circuitboard/computer/gulag_teleporter_console - name = "Labor Camp teleporter console (Computer Board)" + name = "labor camp teleporter console (Computer Board)" icon_state = "security" build_path = /obj/machinery/computer/prisoner/gulag_teleporter_computer /obj/item/circuitboard/computer/prisoner - name = "Prisoner Management Console (Computer Board)" + name = "prisoner management console (Computer Board)" icon_state = "security" build_path = /obj/machinery/computer/prisoner /obj/item/circuitboard/computer/secure_data - name = "Security Records Console (Computer Board)" + name = "security records console (Computer Board)" icon_state = "security" build_path = /obj/machinery/computer/secure_data /obj/item/circuitboard/computer/security - name = "Security Cameras (Computer Board)" + name = "security camera console (Computer Board)" icon_state = "security" build_path = /obj/machinery/computer/security /obj/item/circuitboard/computer/warrant - name = "Security Warrant Viewer (Computer Board)" + name = "security warrant console (Computer Board)" icon_state = "security" build_path = /obj/machinery/computer/warrant @@ -445,14 +454,18 @@ //Supply +/obj/item/circuitboard/computer/objective + name = "Nanotrasen objective console (Computer Board)" + icon_state = "supply" + build_path = /obj/machinery/computer/objective /obj/item/circuitboard/computer/bounty - name = "Nanotrasen Bounty Console (Computer Board)" + name = "Nanotrasen bounty console (Computer Board)" icon_state = "supply" build_path = /obj/machinery/computer/bounty /obj/item/circuitboard/computer/cargo - name = "Supply Console (Computer Board)" + name = "supply console (Computer Board)" icon_state = "supply" build_path = /obj/machinery/computer/cargo var/contraband = FALSE @@ -471,7 +484,7 @@ to_chat(user, "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.") /obj/item/circuitboard/computer/cargo/express - name = "Express Supply Console (Computer Board)" + name = "express supply console (Computer Board)" icon_state = "supply" build_path = /obj/machinery/computer/cargo/express @@ -487,29 +500,33 @@ obj_flags |= EMAGGED /obj/item/circuitboard/computer/cargo/request - name = "Supply Request Console (Computer Board)" + name = "supply request console (Computer Board)" icon_state = "supply" build_path = /obj/machinery/computer/cargo/request /obj/item/circuitboard/computer/ferry - name = "Transport Ferry (Computer Board)" + name = "transport ferry control (Computer Board)" icon_state = "supply" - build_path = /obj/machinery/computer/shuttle/ferry + build_path = /obj/machinery/computer/shuttle_flight/ferry /obj/item/circuitboard/computer/ferry/request - name = "Transport Ferry Console (Computer Board)" - build_path = /obj/machinery/computer/shuttle/ferry/request + name = "transport ferry console (Computer Board)" + build_path = /obj/machinery/computer/shuttle_flight/ferry/request /obj/item/circuitboard/computer/mining - name = "Outpost Status Display (Computer Board)" + name = "outpost status display (Computer Board)" icon_state = "supply" build_path = /obj/machinery/computer/security/mining /obj/item/circuitboard/computer/mining_shuttle - name = "Mining Shuttle (Computer Board)" + name = "mining shuttle console (Computer Board)" icon_state = "supply" - build_path = /obj/machinery/computer/shuttle/mining + build_path = /obj/machinery/computer/shuttle_flight/mining /obj/item/circuitboard/computer/science_shuttle - name = "Science Shuttle (Computer Board)" - build_path = /obj/machinery/computer/shuttle/science + name = "science shuttle console (Computer Board)" + build_path = /obj/machinery/computer/shuttle_flight/science + +/obj/item/circuitboard/computer/exploration_shuttle + name = "exploration shuttle console (Computer Board)" + build_path = /obj/machinery/computer/shuttle_flight/custom_shuttle/exploration diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 9cef0bf3ed95f..7f4049fbad308 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -2,7 +2,7 @@ /obj/item/circuitboard/machine/bsa/back - name = "Bluespace Artillery Generator (Machine Board)" + name = "bluespace artillery generator (Machine Board)" icon_state = "command" build_path = /obj/machinery/bsa/back //No freebies! req_components = list( @@ -10,7 +10,7 @@ /obj/item/stack/cable_coil = 2) /obj/item/circuitboard/machine/bsa/middle - name = "Bluespace Artillery Fusor (Machine Board)" + name = "bluespace artillery fusor (Machine Board)" icon_state = "command" build_path = /obj/machinery/bsa/middle req_components = list( @@ -18,7 +18,7 @@ /obj/item/stack/cable_coil = 2) /obj/item/circuitboard/machine/bsa/front - name = "Bluespace Artillery Bore (Machine Board)" + name = "bluespace artillery bore (Machine Board)" icon_state = "command" build_path = /obj/machinery/bsa/front req_components = list( @@ -26,7 +26,7 @@ /obj/item/stack/cable_coil = 2) /obj/item/circuitboard/machine/dna_vault - name = "DNA Vault (Machine Board)" + name = "DNA vault (Machine Board)" icon_state = "command" build_path = /obj/machinery/dna_vault //No freebies! req_components = list( @@ -39,7 +39,7 @@ /obj/item/circuitboard/machine/announcement_system - name = "Announcement System (Machine Board)" + name = "announcement system (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/announcement_system req_components = list( @@ -47,23 +47,23 @@ /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/machine/autolathe - name = "Autolathe (Machine Board)" + name = "autolathe (Machine Board)" icon_state = "engineering" - build_path = /obj/machinery/autolathe + build_path = /obj/machinery/modular_fabricator/autolathe 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/grounding_rod - name = "Grounding Rod (Machine Board)" + name = "grounding rod (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/power/grounding_rod req_components = list(/obj/item/stock_parts/capacitor = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/telecomms/broadcaster - name = "Subspace Broadcaster (Machine Board)" + name = "subspace broadcaster (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/telecomms/broadcaster req_components = list( @@ -74,7 +74,7 @@ /obj/item/stock_parts/micro_laser = 2) /obj/item/circuitboard/machine/telecomms/bus - name = "Bus Mainframe (Machine Board)" + name = "bus mainframe (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/telecomms/bus req_components = list( @@ -83,7 +83,7 @@ /obj/item/stock_parts/subspace/filter = 1) /obj/item/circuitboard/machine/telecomms/hub - name = "Hub Mainframe (Machine Board)" + name = "hub mainframe (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/telecomms/hub req_components = list( @@ -92,7 +92,7 @@ /obj/item/stock_parts/subspace/filter = 2) /obj/item/circuitboard/machine/telecomms/processor - name = "Processor Unit (Machine Board)" + name = "processor unit (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/telecomms/processor req_components = list( @@ -104,7 +104,7 @@ /obj/item/stock_parts/subspace/amplifier = 1) /obj/item/circuitboard/machine/telecomms/receiver - name = "Subspace Receiver (Machine Board)" + name = "subspace receiver (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/telecomms/receiver req_components = list( @@ -114,7 +114,7 @@ /obj/item/stock_parts/micro_laser = 1) /obj/item/circuitboard/machine/telecomms/relay - name = "Relay Mainframe (Machine Board)" + name = "relay mainframe (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/telecomms/relay req_components = list( @@ -123,7 +123,7 @@ /obj/item/stock_parts/subspace/filter = 2) /obj/item/circuitboard/machine/telecomms/server - name = "Telecommunication Server (Machine Board)" + name = "telecommunication server (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/telecomms/server req_components = list( @@ -132,7 +132,7 @@ /obj/item/stock_parts/subspace/filter = 1) /obj/item/circuitboard/machine/telecomms/message_server - name = "Messaging Server (Machine Board)" + name = "messaging server (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/telecomms/message_server req_components = list( @@ -141,7 +141,7 @@ /obj/item/stock_parts/subspace/filter = 3) /obj/item/circuitboard/machine/tesla_coil - name = "Tesla Controller (Machine Board)" + name = "tesla controller (Machine Board)" icon_state = "engineering" desc = "You can use a screwdriver to switch between Research and Power Generation." build_path = /obj/machinery/power/tesla_coil @@ -175,11 +175,11 @@ return ..() /obj/item/circuitboard/machine/tesla_coil/power - name = "Tesla Coil (Machine Board)" + name = "tesla coil (Machine Board)" build_path = PATH_POWERCOIL /obj/item/circuitboard/machine/tesla_coil/research - name = "Tesla Corona Researcher (Machine Board)" + name = "tesla corona researcher (Machine Board)" build_path = PATH_RPCOIL #undef PATH_POWERCOIL @@ -187,20 +187,20 @@ /obj/item/circuitboard/machine/cell_charger - name = "Cell Charger (Machine Board)" + name = "cell charger (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/cell_charger req_components = list(/obj/item/stock_parts/capacitor = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/circulator - name = "Circulator/Heat Exchanger (Machine Board)" + name = "circulator/heat exchanger (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/atmospherics/components/binary/circulator req_components = list() /obj/item/circuitboard/machine/emitter - name = "Emitter (Machine Board)" + name = "emitter (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/power/emitter req_components = list( @@ -209,13 +209,13 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/generator - name = "Thermo-Electric Generator (Machine Board)" + name = "thermo-electric generator (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/power/generator req_components = list() /obj/item/circuitboard/machine/ntnet_relay - name = "NTNet Relay (Machine Board)" + name = "NTNet relay (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/ntnet_relay req_components = list( @@ -223,7 +223,7 @@ /obj/item/stock_parts/subspace/filter = 1) /obj/item/circuitboard/machine/pacman - name = "PACMAN-type Generator (Machine Board)" + name = "PACMAN-type generator (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/power/port_gen/pacman req_components = list( @@ -234,15 +234,15 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/pacman/super - name = "SUPERPACMAN-type Generator (Machine Board)" + name = "SUPERPACMAN-type generator (Machine Board)" build_path = /obj/machinery/power/port_gen/pacman/super /obj/item/circuitboard/machine/pacman/mrs - name = "MRSPACMAN-type Generator (Machine Board)" + name = "MRSPACMAN-type generator (Machine Board)" build_path = /obj/machinery/power/port_gen/pacman/mrs /obj/item/circuitboard/machine/power_compressor - name = "Power Compressor (Machine Board)" + name = "power compressor (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/power/compressor req_components = list( @@ -250,7 +250,7 @@ /obj/item/stock_parts/manipulator = 6) /obj/item/circuitboard/machine/power_turbine - name = "Power Turbine (Machine Board)" + name = "power turbine (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/power/turbine req_components = list( @@ -258,12 +258,12 @@ /obj/item/stock_parts/capacitor = 6) /obj/item/circuitboard/machine/protolathe/department/engineering - name = "Departmental Protolathe (Machine Board) - Engineering" + name = "departmental protolathe - engineering (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/rnd/production/protolathe/department/engineering /obj/item/circuitboard/machine/rad_collector - name = "Radiation Collector (Machine Board)" + name = "radiation collector (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/power/rad_collector req_components = list( @@ -284,7 +284,7 @@ /obj/item/stack/sheet/mineral/uranium = 10) // We have no Pu-238, and this is the closest thing to it. /obj/item/circuitboard/machine/rtg/advanced - name = "Advanced RTG (Machine Board)" + name = "advanced RTG (Machine Board)" build_path = /obj/machinery/power/rtg/advanced req_components = list( /obj/item/stack/cable_coil = 5, @@ -294,33 +294,33 @@ /obj/item/stack/sheet/mineral/plasma = 5) /obj/item/circuitboard/machine/shuttle/engine - name = "Thruster (Machine Board)" + name = "thruster (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/shuttle/engine req_components = list() /obj/item/circuitboard/machine/shuttle/engine/plasma - name = "Plasma Thruster (Machine Board)" + 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)" + 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)" + 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) /obj/item/circuitboard/machine/scanner_gate - name = "Scanner Gate (Machine Board)" + name = "scanner gate (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/scanner_gate req_components = list( @@ -337,12 +337,12 @@ def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high/empty) /obj/item/circuitboard/machine/techfab/department/engineering - name = "\improper Departmental Techfab (Machine Board) - Engineering" + name = "departmental techfab - engineering (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/rnd/production/techfab/department/engineering /obj/item/circuitboard/machine/teleporter_hub - name = "Teleporter Hub (Machine Board)" + name = "teleporter hub (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/teleport/hub req_components = list( @@ -351,7 +351,7 @@ def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) /obj/item/circuitboard/machine/teleporter_station - name = "Teleporter Station (Machine Board)" + name = "teleporter station (Machine Board)" icon_state = "engineering" build_path = /obj/machinery/teleport/station req_components = list( @@ -361,9 +361,9 @@ def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) /obj/item/circuitboard/machine/thermomachine - name = "Thermomachine (Machine Board)" + name = "thermomachine (Machine Board)" icon_state = "engineering" - desc = "You can use a screwdriver to switch between heater and freezer." + build_path = /obj/machinery/atmospherics/components/unary/thermomachine/freezer var/pipe_layer = PIPING_LAYER_DEFAULT req_components = list( /obj/item/stock_parts/matter_bin = 2, @@ -371,64 +371,21 @@ /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/glass = 1) -#define PATH_FREEZER /obj/machinery/atmospherics/components/unary/thermomachine/freezer -#define PATH_HEATER /obj/machinery/atmospherics/components/unary/thermomachine/heater - -/obj/item/circuitboard/machine/thermomachine/Initialize() +/obj/item/circuitboard/machine/thermomachine/multitool_act(mob/living/user, obj/item/multitool/I) . = ..() - if(!build_path) - if(prob(50)) - name = "Freezer (Machine Board)" - build_path = PATH_FREEZER - else - name = "Heater (Machine Board)" - build_path = PATH_HEATER - -/obj/item/circuitboard/machine/thermomachine/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_SCREWDRIVER) - var/obj/item/circuitboard/new_type - var/new_setting - switch(build_path) - if(PATH_FREEZER) - new_type = /obj/item/circuitboard/machine/thermomachine/heater - new_setting = "Heater" - if(PATH_HEATER) - new_type = /obj/item/circuitboard/machine/thermomachine/freezer - new_setting = "Freezer" - name = initial(new_type.name) - build_path = initial(new_type.build_path) - I.play_tool_sound(src) - to_chat(user, "You change the circuitboard setting to \"[new_setting]\".") - return - - if(I.tool_behaviour == TOOL_MULTITOOL) + if(istype(I)) pipe_layer = (pipe_layer >= PIPING_LAYER_MAX) ? PIPING_LAYER_MIN : (pipe_layer + 1) to_chat(user, "You change the circuitboard to layer [pipe_layer].") - return - - . = ..() /obj/item/circuitboard/machine/thermomachine/examine() . = ..() . += "It is set to layer [pipe_layer]." -/obj/item/circuitboard/machine/thermomachine/heater - name = "Heater (Machine Board)" - build_path = PATH_HEATER - -/obj/item/circuitboard/machine/thermomachine/freezer - name = "Freezer (Machine Board)" - build_path = PATH_FREEZER - -#undef PATH_FREEZER -#undef PATH_HEATER - - //Generic /obj/item/circuitboard/machine/circuit_imprinter - name = "Circuit Imprinter (Machine Board)" + name = "circuit imprinter (Machine Board)" icon_state = "generic" build_path = /obj/machinery/rnd/production/circuit_imprinter req_components = list( @@ -437,18 +394,18 @@ /obj/item/reagent_containers/glass/beaker = 2) /obj/item/circuitboard/machine/circuit_imprinter/department - name = "Departmental Circuit Imprinter (Machine Board)" + name = "departmental circuit imprinter (Machine Board)" build_path = /obj/machinery/rnd/production/circuit_imprinter/department /obj/item/circuitboard/machine/holopad - name = "AI Holopad (Machine Board)" + name = "AI holopad (Machine Board)" icon_state = "generic" build_path = /obj/machinery/holopad req_components = list(/obj/item/stock_parts/capacitor = 1) needs_anchored = FALSE //wew lad /obj/item/circuitboard/machine/launchpad - name = "Bluespace Launchpad (Machine Board)" + name = "bluespace launchpad (Machine Board)" icon_state = "generic" build_path = /obj/machinery/launchpad req_components = list( @@ -457,13 +414,13 @@ def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) /obj/item/circuitboard/machine/paystand - name = "Pay Stand (Machine Board)" + name = "pay stand (Machine Board)" icon_state = "generic" build_path = /obj/machinery/paystand req_components = list() /obj/item/circuitboard/machine/protolathe - name = "Protolathe (Machine Board)" + name = "protolathe (Machine Board)" icon_state = "generic" build_path = /obj/machinery/rnd/production/protolathe req_components = list( @@ -472,11 +429,11 @@ /obj/item/reagent_containers/glass/beaker = 2) /obj/item/circuitboard/machine/protolathe/department - name = "Departmental Protolathe (Machine Board)" + name = "departmental protolathe (Machine Board)" build_path = /obj/machinery/rnd/production/protolathe/department /obj/item/circuitboard/machine/reagentgrinder - name = "Machine Design (All-In-One Grinder)" + name = "all-in-one grinder (Machine Board)" icon_state = "generic" build_path = /obj/machinery/reagentgrinder/constructed req_components = list( @@ -484,7 +441,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/smartfridge - name = "Smartfridge (Machine Board)" + name = "smartfridge (Machine Board)" icon_state = "generic" build_path = /obj/machinery/smartfridge req_components = list(/obj/item/stock_parts/matter_bin = 1) @@ -518,7 +475,7 @@ /obj/item/circuitboard/machine/space_heater - name = "Space Heater (Machine Board)" + name = "space heater (Machine Board)" icon_state = "generic" build_path = /obj/machinery/space_heater req_components = list( @@ -528,7 +485,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/techfab - name = "\improper Techfab (Machine Board)" + name = "techfab (Machine Board)" icon_state = "generic" build_path = /obj/machinery/rnd/production/techfab req_components = list( @@ -537,11 +494,11 @@ /obj/item/reagent_containers/glass/beaker = 2) /obj/item/circuitboard/machine/techfab/department - name = "\improper Departmental Techfab (Machine Board)" + name = "departmental techfab (Machine Board)" build_path = /obj/machinery/rnd/production/techfab/department /obj/item/circuitboard/machine/vendor - name = "Custom Vendor (Machine Board)" + name = "custom vendor (Machine Board)" icon_state = "generic" desc = "You can turn the \"brand selection\" dial using a screwdriver." custom_premium_price = 30 @@ -557,6 +514,7 @@ /obj/machinery/vending/games = "\improper Good Clean Fun", /obj/machinery/vending/autodrobe = "AutoDrobe", /obj/machinery/vending/wardrobe/sec_wardrobe = "SecDrobe", + /obj/machinery/vending/wardrobe/det_wardrobe = "DetDrobe", /obj/machinery/vending/wardrobe/medi_wardrobe = "MediDrobe", /obj/machinery/vending/wardrobe/engi_wardrobe = "EngiDrobe", /obj/machinery/vending/wardrobe/atmos_wardrobe = "AtmosDrobe", @@ -617,7 +575,7 @@ /obj/item/circuitboard/machine/vending/donksofttoyvendor - name = "Donksoft Toy Vendor (Machine Board)" + name = "Donksoft toy vendor (Machine Board)" icon_state = "generic" build_path = /obj/machinery/vending/donksofttoyvendor req_components = list( @@ -625,7 +583,7 @@ /obj/item/vending_refill/donksoft = 1) /obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor - name = "Syndicate Donksoft Toy Vendor (Machine Board)" + name = "Syndicate Donksoft toy vendor (Machine Board)" icon_state = "generic" build_path = /obj/machinery/vending/toyliberationstation req_components = list( @@ -636,19 +594,8 @@ //Medical -/obj/item/circuitboard/machine/autodoc - name = "Autodoc (Machine Board)" - icon_state = "medical" - build_path = /obj/machinery/autodoc - req_components = list(/obj/item/scalpel/advanced = 1, - /obj/item/retractor/advanced = 1, - /obj/item/surgicaldrill/advanced = 1, - /obj/item/stock_parts/manipulator = 1, - /obj/item/stock_parts/micro_laser = 3, - /obj/item/stock_parts/matter_bin = 1) - /obj/item/circuitboard/machine/chem_dispenser - name = "Chem Dispenser (Machine Board)" + name = "chem dispenser (Machine Board)" icon_state = "medical" build_path = /obj/machinery/chem_dispenser req_components = list( @@ -661,7 +608,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/chem_dispenser/botany //probably should be generic but who cares - name = "Minor Botanical Chem Dispenser (Machine Board)" + name = "minor botanical chem dispenser (Machine Board)" build_path = /obj/machinery/chem_dispenser/mutagensaltpetersmall req_components = list( /obj/item/stock_parts/matter_bin = 2, @@ -672,8 +619,41 @@ def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high) needs_anchored = FALSE +/obj/item/circuitboard/machine/chem_dispenser/fullupgrade + build_path = /obj/machinery/chem_dispenser/fullupgrade + req_components = list( + /obj/item/stock_parts/matter_bin/bluespace = 2, + /obj/item/stock_parts/capacitor/quadratic = 2, + /obj/item/stock_parts/manipulator/femto = 2, + /obj/item/stack/sheet/glass = 1, + /obj/item/stock_parts/cell/bluespace = 1, + ) + +/obj/item/circuitboard/machine/chem_dispenser/mutagensaltpeter + build_path = /obj/machinery/chem_dispenser/mutagensaltpeter + req_components = list( + /obj/item/stock_parts/matter_bin/bluespace = 2, + /obj/item/stock_parts/capacitor/quadratic = 2, + /obj/item/stock_parts/manipulator/femto = 2, + /obj/item/stack/sheet/glass = 1, + /obj/item/stock_parts/cell/bluespace = 1, + ) + +/obj/item/circuitboard/machine/chem_dispenser/abductor + name = "Reagent Synthesizer (Abductor Machine Board)" + icon_state = "abductor_mod" + build_path = /obj/machinery/chem_dispenser/abductor + req_components = list( + /obj/item/stock_parts/matter_bin/bluespace = 2, + /obj/item/stock_parts/capacitor/quadratic = 2, + /obj/item/stock_parts/manipulator/femto = 2, + /obj/item/stack/sheet/glass = 1, + /obj/item/stock_parts/cell/bluespace = 1, + ) + needs_anchored = FALSE + /obj/item/circuitboard/machine/chem_heater - name = "Chemical Heater (Machine Board)" + name = "chemical heater (Machine Board)" icon_state = "medical" build_path = /obj/machinery/chem_heater req_components = list( @@ -707,7 +687,7 @@ return ..() /obj/item/circuitboard/machine/clonepod - name = "Clone Pod (Machine Board)" + name = "clone pod (Machine Board)" icon_state = "medical" build_path = /obj/machinery/clonepod req_components = list( @@ -718,11 +698,11 @@ /obj/item/reagent_containers/glass/beaker = 2) /obj/item/circuitboard/machine/clonepod/experimental - name = "Experimental Clone Pod (Machine Board)" + name = "experimental clone pod (Machine Board)" build_path = /obj/machinery/clonepod/experimental /obj/item/circuitboard/machine/clonescanner - name = "Cloning Scanner (Machine Board)" + name = "cloning scanner (Machine Board)" icon_state = "medical" build_path = /obj/machinery/dna_scannernew req_components = list( @@ -733,7 +713,7 @@ /obj/item/stack/cable_coil = 2) /obj/item/circuitboard/machine/cryo_tube - name = "Cryotube (Machine Board)" + name = "cryotube (Machine Board)" icon_state = "medical" build_path = /obj/machinery/atmospherics/components/unary/cryo_cell req_components = list( @@ -742,7 +722,7 @@ /obj/item/stack/sheet/glass = 4) /obj/item/circuitboard/machine/fat_sucker - name = "Lipid Extractor (Machine Board)" + name = "lipid extractor (Machine Board)" icon_state = "medical" build_path = /obj/machinery/fat_sucker req_components = list(/obj/item/stock_parts/micro_laser = 2, @@ -751,13 +731,13 @@ /obj/item/scalpel = 1) /obj/item/circuitboard/machine/harvester - name = "Harvester (Machine Board)" + name = "harvester (Machine Board)" icon_state = "medical" build_path = /obj/machinery/harvester req_components = list(/obj/item/stock_parts/micro_laser = 4) /obj/item/circuitboard/machine/limbgrower - name = "Limb Grower (Machine Board)" + name = "limb grower (Machine Board)" icon_state = "medical" build_path = /obj/machinery/limbgrower req_components = list( @@ -766,12 +746,12 @@ /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/machine/protolathe/department/medical - name = "Departmental Protolathe (Machine Board) - Medical" + name = "departmental protolathe - medical (Machine Board)" icon_state = "medical" build_path = /obj/machinery/rnd/production/protolathe/department/medical /obj/item/circuitboard/machine/sleeper - name = "Sleeper (Machine Board)" + name = "sleeper (Machine Board)" icon_state = "medical" build_path = /obj/machinery/sleeper req_components = list( @@ -780,8 +760,18 @@ /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/glass = 2) +/obj/item/circuitboard/machine/sleeper/fullupgrade + name = "Sleeper (Machine Board)" + icon_state = "medical" + build_path = /obj/machinery/sleeper/syndie/fullupgrade + req_components = list( + /obj/item/stock_parts/matter_bin/bluespace = 1, + /obj/item/stock_parts/manipulator/femto = 1, + /obj/item/stack/cable_coil = 1, + /obj/item/stack/sheet/glass = 2) + /obj/item/circuitboard/machine/smoke_machine - name = "Smoke Machine (Machine Board)" + name = "smoke machine (Machine Board)" icon_state = "medical" build_path = /obj/machinery/smoke_machine req_components = list( @@ -793,7 +783,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/stasis - name = "Lifeform Stasis Unit (Machine Board)" + name = "lifeform stasis unit (Machine Board)" icon_state = "medical" build_path = /obj/machinery/stasis req_components = list( @@ -802,32 +792,20 @@ /obj/item/stock_parts/capacitor = 1) /obj/item/circuitboard/machine/techfab/department/medical - name = "\improper Departmental Techfab (Machine Board) - Medical" + name = "departmental techfab - medical (Machine Board) " icon_state = "medical" build_path = /obj/machinery/rnd/production/techfab/department/medical //Science -/obj/item/circuitboard/machine/bluespace_miner - name = "Bluespace Miner (Machine Board)" - icon_state = "science" - build_path = /obj/machinery/mineral/bluespace_miner - req_components = list( - /obj/item/stock_parts/matter_bin = 3, - /obj/item/stock_parts/micro_laser = 1, - /obj/item/stock_parts/manipulator = 3, - /obj/item/stock_parts/scanning_module = 1, - /obj/item/stack/ore/bluespace_crystal = 3) - needs_anchored = FALSE - /obj/item/circuitboard/machine/circuit_imprinter/department/science - name = "Departmental Circuit Imprinter - Science (Machine Board)" + name = "departmental circuit imprinter - science (Machine Board)" icon_state = "science" build_path = /obj/machinery/rnd/production/circuit_imprinter/department/science /obj/item/circuitboard/machine/cyborgrecharger - name = "Cyborg Recharger (Machine Board)" + name = "cyborg recharger (Machine Board)" icon_state = "science" build_path = /obj/machinery/recharge_station req_components = list( @@ -837,7 +815,7 @@ def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high) /obj/item/circuitboard/machine/destructive_analyzer - name = "Destructive Analyzer (Machine Board)" + name = "destructive analyzer (Machine Board)" icon_state = "science" build_path = /obj/machinery/rnd/destructive_analyzer req_components = list( @@ -855,7 +833,7 @@ /obj/item/stock_parts/micro_laser = 2) /obj/item/circuitboard/machine/mech_recharger - name = "Mechbay Recharger (Machine Board)" + name = "mechbay recharger (Machine Board)" icon_state = "science" build_path = /obj/machinery/mech_bay_recharge_port req_components = list( @@ -863,9 +841,9 @@ /obj/item/stock_parts/capacitor = 5) /obj/item/circuitboard/machine/mechfab - name = "Exosuit Fabricator (Machine Board)" + name = "exosuit fabricator (Machine Board)" icon_state = "science" - build_path = /obj/machinery/mecha_part_fabricator + build_path = /obj/machinery/modular_fabricator/exosuit_fab req_components = list( /obj/item/stock_parts/matter_bin = 2, /obj/item/stock_parts/manipulator = 1, @@ -873,7 +851,7 @@ /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/machine/monkey_recycler - name = "Monkey Recycler (Machine Board)" + name = "monkey recycler (Machine Board)" icon_state = "science" build_path = /obj/machinery/monkey_recycler req_components = list( @@ -882,7 +860,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/nanite_chamber - name = "Nanite Chamber (Machine Board)" + name = "nanite chamber (Machine Board)" icon_state = "science" build_path = /obj/machinery/nanite_chamber req_components = list( @@ -891,7 +869,7 @@ /obj/item/stock_parts/manipulator = 1) /obj/item/circuitboard/machine/nanite_program_hub - name = "Nanite Program Hub (Machine Board)" + name = "nanite program hub (Machine Board)" icon_state = "science" build_path = /obj/machinery/nanite_program_hub req_components = list( @@ -899,7 +877,7 @@ /obj/item/stock_parts/manipulator = 1) /obj/item/circuitboard/machine/nanite_programmer - name = "Nanite Programmer (Machine Board)" + name = "nanite programmer (Machine Board)" icon_state = "science" build_path = /obj/machinery/nanite_programmer req_components = list( @@ -908,17 +886,17 @@ /obj/item/stock_parts/scanning_module = 1) /obj/item/circuitboard/machine/processor/slime - name = "Slime Processor (Machine Board)" + name = "slime processor (Machine Board)" icon_state = "science" build_path = /obj/machinery/processor/slime /obj/item/circuitboard/machine/protolathe/department/science - name = "Departmental Protolathe (Machine Board) - Science" + name = "departmental protolathe - science (Machine Board)" icon_state = "science" build_path = /obj/machinery/rnd/production/protolathe/department/science /obj/item/circuitboard/machine/public_nanite_chamber - name = "Public Nanite Chamber (Machine Board)" + name = "public nanite chamber (Machine Board)" icon_state = "science" build_path = /obj/machinery/public_nanite_chamber var/cloud_id = 1 @@ -938,7 +916,7 @@ /obj/item/circuitboard/machine/quantumpad - name = "Quantum Pad (Machine Board)" + name = "quantum pad (Machine Board)" icon_state = "science" build_path = /obj/machinery/quantumpad req_components = list( @@ -949,7 +927,7 @@ def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) /obj/item/circuitboard/machine/rdserver - name = "R&D Server (Machine Board)" + name = "R&D server (Machine Board)" icon_state = "science" build_path = /obj/machinery/rnd/server req_components = list( @@ -957,7 +935,7 @@ /obj/item/stock_parts/scanning_module = 1) /obj/item/circuitboard/machine/techfab/department/science - name = "\improper Departmental Techfab (Machine Board) - Science" + name = "departmental techfab - science (Machine Board)" icon_state = "science" build_path = /obj/machinery/rnd/production/techfab/department/science @@ -966,19 +944,19 @@ /obj/item/circuitboard/machine/protolathe/department/security - name = "Departmental Protolathe (Machine Board) - Security" + name = "departmental protolathe - security (Machine Board)" icon_state = "security" build_path = /obj/machinery/rnd/production/protolathe/department/security /obj/item/circuitboard/machine/recharger - name = "Weapon Recharger (Machine Board)" + name = "weapon recharger (Machine Board)" icon_state = "security" build_path = /obj/machinery/recharger req_components = list(/obj/item/stock_parts/capacitor = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/techfab/department/security - name = "\improper Departmental Techfab (Machine Board) - Security" + name = "departmental techfab - security (Machine Board)" icon_state = "security" build_path = /obj/machinery/rnd/production/techfab/department/security @@ -987,7 +965,7 @@ /obj/item/circuitboard/machine/biogenerator - name = "Biogenerator (Machine Board)" + name = "biogenerator (Machine Board)" icon_state = "service" build_path = /obj/machinery/biogenerator req_components = list( @@ -997,29 +975,49 @@ /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/machine/chem_dispenser/drinks - name = "Soda Dispenser (Machine Board)" + name = "soda dispenser (Machine Board)" icon_state = "service" build_path = /obj/machinery/chem_dispenser/drinks +/obj/item/circuitboard/machine/chem_dispenser/drinks/fullupgrade + build_path = /obj/machinery/chem_dispenser/drinks/fullupgrade + req_components = list( + /obj/item/stock_parts/matter_bin/bluespace = 2, + /obj/item/stock_parts/capacitor/quadratic = 2, + /obj/item/stock_parts/manipulator/femto = 2, + /obj/item/stack/sheet/glass = 1, + /obj/item/stock_parts/cell/bluespace = 1, + ) + /obj/item/circuitboard/machine/chem_dispenser/drinks/beer - name = "Booze Dispenser (Machine Board)" + name = "booze dispenser (Machine Board)" icon_state = "service" build_path = /obj/machinery/chem_dispenser/drinks/beer +/obj/item/circuitboard/machine/chem_dispenser/drinks/beer/fullupgrade + build_path = /obj/machinery/chem_dispenser/drinks/beer/fullupgrade + req_components = list( + /obj/item/stock_parts/matter_bin/bluespace = 2, + /obj/item/stock_parts/capacitor/quadratic = 2, + /obj/item/stock_parts/manipulator/femto = 2, + /obj/item/stack/sheet/glass = 1, + /obj/item/stock_parts/cell/bluespace = 1, + ) + /obj/item/circuitboard/machine/chem_master/condi name = "CondiMaster 3000 (Machine Board)" icon_state = "service" build_path = /obj/machinery/chem_master/condimaster /obj/item/circuitboard/machine/deep_fryer - name = "circuit board (Deep Fryer)" + name = "deep fryer (Machine Board)" icon_state = "service" build_path = /obj/machinery/deepfryer req_components = list(/obj/item/stock_parts/micro_laser = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/dish_drive - name = "Dish Drive (Machine Board)" + name = "dish drive (Machine Board)" icon_state = "service" build_path = /obj/machinery/dish_drive req_components = list( @@ -1032,8 +1030,8 @@ /obj/item/circuitboard/machine/dish_drive/examine(mob/user) . = ..() - . += {"Its suction function is [suction ? "enabled" : "disabled"]. Use it in-hand to switch.\n - Its disposal auto-transmit function is [transmit ? "enabled" : "disabled"]. Alt-click it to switch."} + . += "Its suction function is [suction ? "enabled" : "disabled"]. Use it in-hand to switch.\n"+\ + "Its disposal auto-transmit function is [transmit ? "enabled" : "disabled"]. Alt-click it to switch." /obj/item/circuitboard/machine/dish_drive/attack_self(mob/living/user) suction = !suction @@ -1047,7 +1045,7 @@ /obj/item/circuitboard/machine/gibber - name = "Gibber (Machine Board)" + name = "gibber (Machine Board)" icon_state = "service" build_path = /obj/machinery/gibber req_components = list( @@ -1056,7 +1054,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/hydroponics - name = "Hydroponics Tray (Machine Board)" + name = "hydroponics tray (Machine Board)" icon_state = "service" build_path = /obj/machinery/hydroponics/constructable req_components = list( @@ -1066,7 +1064,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/microwave - name = "Microwave (Machine Board)" + name = "microwave (Machine Board)" icon_state = "service" build_path = /obj/machinery/microwave req_components = list( @@ -1077,7 +1075,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/plantgenes - name = "Plant DNA Manipulator (Machine Board)" + name = "plant DNA manipulator (Machine Board)" icon_state = "service" build_path = /obj/machinery/plantgenes req_components = list( @@ -1087,7 +1085,7 @@ /obj/item/stock_parts/scanning_module = 1) /obj/item/circuitboard/machine/processor - name = "Food Processor (Machine Board)" + name = "food processor (Machine Board)" icon_state = "service" build_path = /obj/machinery/processor req_components = list( @@ -1109,12 +1107,12 @@ return ..() /obj/item/circuitboard/machine/protolathe/department/service - name = "Departmental Protolathe - Service (Machine Board)" + name = "departmental protolathe - service (Machine Board)" icon_state = "service" build_path = /obj/machinery/rnd/production/protolathe/department/service /obj/item/circuitboard/machine/recycler - name = "Recycler (Machine Board)" + name = "recycler (Machine Board)" icon_state = "service" build_path = /obj/machinery/recycler req_components = list( @@ -1123,7 +1121,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/seed_extractor - name = "Seed Extractor (Machine Board)" + name = "seed extractor (Machine Board)" icon_state = "service" build_path = /obj/machinery/seed_extractor req_components = list( @@ -1132,7 +1130,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/techfab/department/service - name = "\improper Departmental Techfab - Service (Machine Board)" + name = "departmental techfab - service (Machine Board)" icon_state = "service" build_path = /obj/machinery/rnd/production/techfab/department/service @@ -1141,24 +1139,33 @@ /obj/item/circuitboard/machine/techfab/department/cargo - name = "\improper Departmental Techfab (Machine Board) - Cargo" + name = "departmental techfab - cargo (Machine Board)" icon_state = "supply" build_path = /obj/machinery/rnd/production/techfab/department/cargo /obj/item/circuitboard/machine/mining_equipment_vendor - name = "Mining Equipment Vendor (Machine Board)" + name = "mining equipment vendor (Machine Board)" + icon_state = "supply" + build_path = /obj/machinery/vendor/mining + req_components = list( + /obj/item/stack/sheet/glass = 1, + /obj/item/stock_parts/matter_bin = 3) + +/obj/item/circuitboard/machine/exploration_equipment_vendor + name = "exploration equipment vendor (Machine Board)" icon_state = "supply" - build_path = /obj/machinery/mineral/equipment_vendor + build_path = /obj/machinery/vendor/exploration req_components = list( /obj/item/stack/sheet/glass = 1, /obj/item/stock_parts/matter_bin = 3) + /obj/item/circuitboard/machine/mining_equipment_vendor/golem - name = "Golem Ship Equipment Vendor (Machine Board)" - build_path = /obj/machinery/mineral/equipment_vendor/golem + name = "golem ship equipment vendor (Machine Board)" + build_path = /obj/machinery/vendor/mining/golem /obj/item/circuitboard/machine/pump - name = "Portable Liquid Pump (Machine Board)" + name = "portable liquid pump (Machine Board)" icon_state = "supply" build_path = /obj/machinery/power/liquid_pump needs_anchored = FALSE @@ -1167,7 +1174,7 @@ /obj/item/stock_parts/matter_bin = 2) /obj/item/circuitboard/machine/ore_redemption - name = "Ore Redemption (Machine Board)" + name = "ore redemption (Machine Board)" icon_state = "supply" build_path = /obj/machinery/mineral/ore_redemption req_components = list( @@ -1179,18 +1186,18 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/ore_silo - name = "Ore Silo (Machine Board)" + name = "ore silo (Machine Board)" icon_state = "supply" build_path = /obj/machinery/ore_silo req_components = list() /obj/item/circuitboard/machine/protolathe/department/cargo - name = "Departmental Protolathe (Machine Board) - Cargo" + name = "departmental protolathe - cargo (Machine Board)" icon_state = "supply" build_path = /obj/machinery/rnd/production/protolathe/department/cargo /obj/item/circuitboard/machine/stacking_machine - name = "Stacking Machine (Machine Board)" + name = "stacking machine (Machine Board)" icon_state = "supply" build_path = /obj/machinery/mineral/stacking_machine req_components = list( @@ -1198,7 +1205,7 @@ /obj/item/stock_parts/matter_bin = 2) /obj/item/circuitboard/machine/stacking_unit_console - name = "Stacking Machine Console (Machine Board)" + name = "stacking machine console (Machine Board)" icon_state = "supply" build_path = /obj/machinery/mineral/stacking_unit_console req_components = list( @@ -1225,14 +1232,14 @@ /obj/item/stock_parts/micro_laser = /obj/item/stock_parts/micro_laser/quadultra) /obj/item/circuitboard/machine/chem_dispenser/abductor - name = "Reagent Synthesizer (Abductor Machine Board)" + name = "reagent synthesizer (Abductor Machine Board)" icon_state = "abductor_mod" build_path = /obj/machinery/chem_dispenser/abductor def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high) needs_anchored = FALSE /obj/item/circuitboard/machine/plantgenes/vault - name = "alien board (Plant DNA Manipulator)" + name = "Plant DNA manipulator (Abductor Machine Board)" icon_state = "abductor_mod" // It wasn't made by actual abductors race, so no abductor tech here. def_components = list( diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index d9357ef07d2c3..7982ea193f448 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -123,7 +123,7 @@ user.visible_message("[user] begins to clean \the [target.name] with [src]...", "You begin to clean \the [target.name] with [src]...") if(do_after(user, src.cleanspeed, target = target)) to_chat(user, "You clean \the [target.name].") - if(istype(target, /obj/item/clothing) && HAS_TRAIT(target, TRAIT_SPRAYPAINTED)) + if(isclothing(target) && HAS_TRAIT(target, TRAIT_SPRAYPAINTED)) var/obj/item/clothing/C = target var/mob/living/carbon/human/H = user C.flash_protect -= 1 @@ -201,8 +201,7 @@ ..() /obj/item/bikehorn/golden/proc/flip_mobs(mob/living/carbon/M, mob/user) - var/turf/T = get_turf(src) - for(M in ohearers(7, T)) + for(M in ohearers(7, get_turf(src))) if(ishuman(M) && M.can_hear()) var/mob/living/carbon/human/H = M if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index be39bb697344f..129cd18cc3f49 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -28,7 +28,7 @@ mode = WAND_EMERGENCY if(WAND_EMERGENCY) mode = WAND_OPEN - to_chat(user, "Now in mode: [mode].") + balloon_alert(user, "Mode set to [mode]") // Airlock remote works by sending NTNet packets to whatever it's pointed at. /obj/item/door_remote/afterattack(atom/A, mob/user) diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm index cf1551d1cd8a7..3b3c3c8a4be3d 100644 --- a/code/game/objects/items/cosmetics.dm +++ b/code/game/objects/items/cosmetics.dm @@ -137,24 +137,10 @@ if(location == BODY_ZONE_PRECISE_MOUTH) if(user.a_intent == INTENT_HELP) if(H.gender == MALE) - if(H == user && !mirror) - to_chat(user, "You need a mirror to properly style your own facial hair!") - return - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return - var/new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in GLOB.facial_hair_styles_list - if(!get_location_accessible(H, location)) - to_chat(user, "The mask is in the way!") - return - user.visible_message("[user] tries to change [H]'s facial hair style using [src].", "You try to change [H]'s facial hair style using [src].") - if(new_style && do_after(user, 60, target = H)) - user.visible_message("[user] successfully changes [H]'s facial hair style using [src].", "You successfully change [H]'s facial hair style using [src].") - H.facial_hair_style = new_style - H.update_hair() - return + INVOKE_ASYNC(src, .proc/new_facial_hairstyle, H, user, mirror) + return else return - else if(!(FACEHAIR in H.dna.species.species_traits)) to_chat(user, "There is no facial hair to shave!") @@ -183,22 +169,8 @@ else if(location == BODY_ZONE_HEAD) if(user.a_intent == INTENT_HELP) - if (H == user && !mirror) - to_chat(user, "You need a mirror to properly style your own hair!") - return - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return - var/new_style = input(user, "Select a hair style", "Grooming") as null|anything in GLOB.hair_styles_list - if(!get_location_accessible(H, location)) - to_chat(user, "The headgear is in the way!") - return - user.visible_message("[user] tries to change [H]'s hairstyle using [src].", "You try to change [H]'s hairstyle using [src].") - if(new_style && do_after(user, 60, target = H)) - user.visible_message("[user] successfully changes [H]'s hairstyle using [src].", "You successfully change [H]'s hairstyle using [src].") - H.hair_style = new_style - H.update_hair() - return - + INVOKE_ASYNC(src, .proc/new_hairstyle, H, user) + return else if(!(HAIR in H.dna.species.species_traits)) to_chat(user, "There is no hair to shave!") @@ -231,6 +203,40 @@ else ..() +/obj/item/razor/proc/new_hairstyle(mob/living/carbon/human/H, mob/user, mirror) + var/location = user.zone_selected + if (H == user && !mirror) + to_chat(user, "You need a mirror to properly style your own hair!") + return + if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + var/new_style = input(user, "Select a hair style", "Grooming") as null|anything in GLOB.hair_styles_list + if(!get_location_accessible(H, location)) + to_chat(user, "The headgear is in the way!") + return + user.visible_message("[user] tries to change [H]'s hairstyle using [src].", "You try to change [H]'s hairstyle using [src].") + if(new_style && do_after(user, 60, target = H)) + user.visible_message("[user] successfully changes [H]'s hairstyle using [src].", "You successfully change [H]'s hairstyle using [src].") + H.hair_style = new_style + H.update_hair() + +/obj/item/razor/proc/new_facial_hairstyle(mob/living/carbon/human/H, mob/user, var/mirror) + var/location = user.zone_selected + if(H == user && !mirror) + to_chat(user, "You need a mirror to properly style your own facial hair!") + return + if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + var/new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in GLOB.facial_hair_styles_list + if(!get_location_accessible(H, location)) + to_chat(user, "The mask is in the way!") + return + user.visible_message("[user] tries to change [H]'s facial hair style using [src].", "You try to change [H]'s facial hair style using [src].") + if(new_style && do_after(user, 60, target = H)) + user.visible_message("[user] successfully changes [H]'s facial hair style using [src].", "You successfully change [H]'s facial hair style using [src].") + H.facial_hair_style = new_style + H.update_hair() + /obj/item/razor/straightrazor name = "straight razor" icon_state = "straightrazor" @@ -298,4 +304,4 @@ ADD_TRAIT(user, TRAIT_SELF_AWARE, "mirror_trait") to_chat(user, "You look into the mirror") sleep(150) - REMOVE_TRAIT(user, TRAIT_SELF_AWARE, "mirror_trait") \ No newline at end of file + REMOVE_TRAIT(user, TRAIT_SELF_AWARE, "mirror_trait") diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm index b38aa06f8ee19..8ff5a36c9dbfe 100644 --- a/code/game/objects/items/crab17.dm +++ b/code/game/objects/items/crab17.dm @@ -17,19 +17,19 @@ 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() + var/turf/targetturf = get_safe_random_station_turfs() if (!targetturf) return FALSE new /obj/effect/dumpeetTarget(targetturf, user) dumped = TRUE /obj/structure/checkoutmachine - name = "Nanotrasen Space-Coin Market" + name = "\improper Nanotrasen Space-Coin Market" desc = "This is good for spacecoin because" icon = 'icons/obj/money_machine.dmi' icon_state = "bogdanoff" layer = TABLE_LAYER //So that the crate inside doesn't appear underneath - armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80) + armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80, "stamina" = 0) density = TRUE pixel_z = -8 layer = LARGE_MOB_LAYER @@ -80,7 +80,7 @@ add_overlay("hatch") add_overlay("legs_retracted") addtimer(CALLBACK(src, .proc/startUp), 50) - QDEL_IN(src, 8 MINUTES) //Self destruct after 8 min + QDEL_IN(WEAKREF(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. @@ -149,7 +149,7 @@ /obj/structure/checkoutmachine/Destroy() stop_dumping() STOP_PROCESSING(SSfastprocess, src) - priority_announce("The credit deposit machine at [get_area(src).name] has been destroyed. Station funds have stopped draining!", sender_override = "CRAB-17 Protocol") + priority_announce("The credit deposit machine at [get_area(src)] has been destroyed. Station funds have stopped draining!", sound = SSstation.announcer.get_rand_alert_sound(), sender_override = "CRAB-17 Protocol", ) explosion(src, 0,0,1, flame_range = 2) return ..() @@ -171,7 +171,7 @@ 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).name].") + 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() @@ -189,7 +189,7 @@ 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! + layer = FLY_LAYER//that wasn't flying, that was falling with style! icon_state = "missile_blur" /obj/effect/dumpeetTarget @@ -216,7 +216,7 @@ /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).name] and cash out before you lose all of your funds!", sender_override = "CRAB-17 Protocol") + 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!", sound = SSstation.announcer.get_rand_alert_sound(), sender_override = "CRAB-17 Protocol") animate(DF, pixel_z = -8, time = 5, , easing = LINEAR_EASING) playsound(src, 'sound/weapons/mortar_whistle.ogg', 70, 1, 6) addtimer(CALLBACK(src, .proc/endLaunch), 5, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index ca05bcf7a655e..8441e642b6038 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -157,6 +157,7 @@ is_capped = !is_capped to_chat(user, "The cap on [src] is now [is_capped ? "on" : "off"].") update_icon() + ui_update() /obj/item/toy/crayon/proc/staticDrawables() @@ -250,7 +251,9 @@ . = TRUE paint_mode = PAINT_NORMAL drawtype = "a" - update_icon() + + if(.) + update_icon() /obj/item/toy/crayon/proc/crayon_text_strip(text) var/static/regex/crayon_r = new /regex(@"[^\w!?,.=%#&+\/\-]") @@ -272,14 +275,8 @@ var/mob/living/carbon/human/H = user if (HAS_TRAIT(H, TRAIT_TAGGER)) cost *= 0.5 - /* hippie start -- moved to the end of the proc, after the crayon is actually used. - var/charges_used = use_charges(user, cost) - if(!charges_used) - return - . = charges_used - hippie end */ - if(istype(target, /obj/effect/decal/cleanable)) + if(istype(target, /obj/effect/decal)) target = target.loc if(!isValidSurface(target)) @@ -321,8 +318,7 @@ else if(drawing in graffiti|oriented) temp = "graffiti" var/gang_check = hippie_gang_check(user,target) // hippie start -- gang check and temp setting - if(!gang_check) return - else if(gang_check == "gang graffiti") temp = gang_check // hippie end + if(!gang_check) return // hippie end var/graf_rot if(drawing in oriented) @@ -344,9 +340,6 @@ 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]...") // hippie -- removed a weird tab that had no reason to be here - if(pre_noise) audible_message("You hear spraying.") playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) @@ -354,9 +347,13 @@ var/wait_time = 50 if(paint_mode == PAINT_LARGE_HORIZONTAL) wait_time *= 3 - if(gang) instant = FALSE // hippie -- gang spraying must not be instant, balance reasons + if(gang) + wait_time = 1 SECONDS + if (territory_claimed(get_area(target), user)) + wait_time = 20 SECONDS if(!instant) - if(!do_after(user, 50, target = target)) + to_chat(user, "You start drawing a [temp] on the [target.name]...") // hippie -- removed a weird tab that had no reason to be here + if(!do_after(user, wait_time, target = target)) return if(length(text_buffer)) @@ -546,6 +543,19 @@ return return ..() +/obj/item/storage/crayons/attack_self(mob/user) + . = ..() + if(contents.len > 0) + to_chat(user, "You can't fold down [src] with crayons inside!") + return + if(flags_1 & HOLOGRAM_1) + return + + var/obj/item/stack/sheet/cardboard/cardboard = new /obj/item/stack/sheet/cardboard(user.drop_location()) + to_chat(user, "You fold the [src] into cardboard.") + user.put_in_active_hand(cardboard) + qdel(src) + //Spraycan stuff /obj/item/toy/crayon/spraycan @@ -626,8 +636,11 @@ return if(is_capped) - to_chat(user, "Take the cap off first!") - return + if(istype(target, /obj/machinery/modular_fabricator/autolathe)) + return ..() + else + to_chat(user, "Take the cap off first!") + return if(check_empty(user)) return @@ -643,7 +656,7 @@ if(C.client) C.blur_eyes(3) C.blind_eyes(1) - if(C.get_eye_protection() <= 0) // no eye protection? ARGH IT BURNS. + if(!C.is_eyes_covered()) // no eye protection? ARGH IT BURNS. C.confused = max(C.confused, 3) C.Paralyze(60) if(ishuman(C) && actually_paints) @@ -658,10 +671,10 @@ return - if(isobj(target)) + if(isobj(target) && !(target.flags_1 & UNPAINTABLE_1)) if(actually_paints) if(color_hex2num(paint_color) < 350 && !istype(target, /obj/structure/window)) //Colors too dark are rejected - if(istype(target, /obj/item/clothing)) + if(isclothing(target)) var/obj/item/clothing/C = target if(((C.flags_cover & HEADCOVERSEYES) || (C.flags_cover & MASKCOVERSEYES) || (C.flags_cover & GLASSESCOVERSEYES)) && !HAS_TRAIT(C, TRAIT_SPRAYPAINTED)) C.flash_protect += 1 @@ -786,34 +799,35 @@ to_chat(user, "This spraycan's color isn't your gang's one! You cannot use it.") return FALSE gang_mode = TRUE - instant = FALSE . = "graffiti" // discontinue if we're not in gang modethe area isn't valid for tagging because gang "honour" - if(gang_mode && (!can_claim_for_gang(user, target))) + if(gang_mode && (!can_claim_for_gang(user, target, TRUE))) return FALSE return TRUE /obj/item/toy/crayon/proc/gang_final(mob/user, atom/target, list/affected_turfs) // hooked into afterattack // Double check it wasn't tagged in the meanwhile - if(!can_claim_for_gang(user, target)) + if(!can_claim_for_gang(user, target, FALSE)) return TRUE tag_for_gang(user, target) affected_turfs += target -/obj/item/toy/crayon/proc/can_claim_for_gang(mob/user, atom/target) +/obj/item/toy/crayon/proc/can_claim_for_gang(mob/user, atom/target, alert) // Check area validity. // Reject space, player-created areas, and non-station z-levels. var/area/A = get_area(target) - if(!A || (!is_station_level(A.z)) || !A.valid_territory) + if(!A || (!is_station_level(A.z)) || !(A.area_flags & VALID_TERRITORY)) to_chat(user, "[A] is unsuitable for tagging.") return FALSE var/spraying_over = FALSE - for(var/G in target) - var/obj/effect/decal/cleanable/crayon/gang/gangtag = G + for(var/obj/effect/decal/gang/gangtag in target) if(istype(gangtag)) var/datum/antagonist/gang/GA = user.mind.has_antag_datum(/datum/antagonist/gang) if(gangtag.gang != GA.gang) + if (alert) + to_chat(user, "[gangtag.gang] has been alerted of this takeover!") + gangtag.gang.message_gangtools("[get_area(target)] is under attack by an enemy gang!") spraying_over = TRUE break @@ -839,16 +853,19 @@ //Delete any old markings on this tile, including other gang tags for(var/obj/effect/decal/cleanable/crayon/old_marking in target) qdel(old_marking) + for(var/obj/effect/decal/gang/old_gang in target) + qdel(old_gang) var/datum/antagonist/gang/G = user.mind.has_antag_datum(/datum/antagonist/gang) var/area/territory = get_area(target) - new /obj/effect/decal/cleanable/crayon/gang(target,G.gang,"graffiti",0,user) + new /obj/effect/decal/gang(target,G.gang,"graffiti",0,user) to_chat(user, "You tagged [territory] for your gang!") /obj/item/toy/crayon/spraycan/gang //desc = "A modified container containing suspicious paint." charges = 20 gang = TRUE + instant = FALSE pre_noise = FALSE post_noise = TRUE diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm index 0223904b4fc30..0acb225772b64 100644 --- a/code/game/objects/items/credit_holochip.dm +++ b/code/game/objects/items/credit_holochip.dm @@ -15,8 +15,8 @@ /obj/item/holochip/examine(mob/user) . = ..() - . += {"It's loaded with [credits] credit[( credits > 1 ) ? "s" : ""]\n - Alt-Click to split."} + . += "It's loaded with [credits] credit[( credits > 1 ) ? "s" : ""]\n"+\ + "Alt-Click to split." /obj/item/holochip/get_item_credit_value() return credits diff --git a/code/game/objects/items/cursed_necklace.dm b/code/game/objects/items/cursed_necklace.dm index 18c00bee3f4d4..2745644f91497 100644 --- a/code/game/objects/items/cursed_necklace.dm +++ b/code/game/objects/items/cursed_necklace.dm @@ -14,10 +14,10 @@ /obj/item/clothing/neck/necklace/dope/cursed/equipped(mob/user, slot) . = ..() - if(slot == SLOT_NECK && linked_ckey && user.ckey != linked_ckey) + if(slot == ITEM_SLOT_NECK && linked_ckey && user.ckey != linked_ckey) if(user.ckey && user.ckey == linked_ckey) hostage_ckey = user.ckey - user.ghostize(0) + user.ghostize(FALSE,SENTIENCE_ERASE) user.ckey = linked_ckey current_body = user @@ -25,6 +25,6 @@ . = ..() if(hostage_ckey) if(user.ckey) - user.ghostize(0) + user.ghostize(FALSE,SENTIENCE_ERASE) user.ckey = hostage_ckey current_body = null \ No newline at end of file diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 7af94fb155d67..4cf1f5aa6b4d6 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -14,12 +14,13 @@ throwforce = 6 w_class = WEIGHT_CLASS_BULKY actions_types = list(/datum/action/item_action/toggle_paddles) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 0) + var/obj/item/shockpaddles/paddle_type = /obj/item/shockpaddles var/on = FALSE //if the paddles are equipped (1) or on the defib (0) var/safety = TRUE //if you can zap people with the defibs on harm mode var/powered = FALSE //if there's a cell in the defib with enough power for a revive, blocks paddles from reviving otherwise - var/obj/item/twohanded/shockpaddles/paddles + var/obj/item/shockpaddles/paddles var/obj/item/stock_parts/cell/high/cell var/combat = FALSE //if true, revive through hardsuits, allow for combat shocking, and tint paddles syndicate colors var/grab_ghost = TRUE // Do we pull the ghost back into their body? @@ -51,12 +52,9 @@ if(paddles?.loc == src) paddles.extinguish() -/obj/item/defibrillator/update_icon() - update_power() - update_overlays() - update_charge() +/obj/item/defibrillator/update_overlays() + . = ..() -/obj/item/defibrillator/proc/update_power() if(!QDELETED(cell)) if(QDELETED(paddles) || cell.charge < paddles.revivecost) powered = FALSE @@ -65,23 +63,17 @@ else powered = FALSE -/obj/item/defibrillator/proc/update_overlays() - cut_overlays() if(!on) - add_overlay("[initial(icon_state)]-paddles") + . += "[initial(icon_state)]-paddles" if(powered) - add_overlay("[initial(icon_state)]-powered") + . += "[initial(icon_state)]-powered" + var/ratio = cell.charge / cell.maxcharge + ratio = CEILING(ratio*4, 1) * 25 + . += "[initial(icon_state)]-charge[ratio]" if(!cell) - add_overlay("[initial(icon_state)]-nocell") + . += "[initial(icon_state)]-nocell" if(!safety) - add_overlay("[initial(icon_state)]-emagged") - -/obj/item/defibrillator/proc/update_charge() - if(powered) //so it doesn't show charge if it's unpowered - if(!QDELETED(cell)) - var/ratio = cell.charge / cell.maxcharge - ratio = CEILING(ratio*4, 1) * 25 - add_overlay("[initial(icon_state)]-charge[ratio]") + . += "[initial(icon_state)]-emagged" /obj/item/defibrillator/CheckParts(list/parts_list) ..() @@ -95,13 +87,13 @@ /obj/item/defibrillator/attack_hand(mob/user) if(loc == user) if(slot_flags == ITEM_SLOT_BACK) - if(user.get_item_by_slot(SLOT_BACK) == src) + if(user.get_item_by_slot(ITEM_SLOT_BACK) == src) ui_action_click() else to_chat(user, "Put the defibrillator on your back first!") else if(slot_flags == ITEM_SLOT_BELT) - if(user.get_item_by_slot(SLOT_BELT) == src) + if(user.get_item_by_slot(ITEM_SLOT_BELT) == src) ui_action_click() else to_chat(user, "Strap the defibrillator's belt on first!") @@ -114,13 +106,12 @@ . = ..() if(ismob(loc)) var/mob/M = loc - if(!M.incapacitated() && istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + if(!M.incapacitated() && istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) /obj/item/defibrillator/attackby(obj/item/W, mob/user, params) if(W == paddles) - paddles.unwield() toggle_paddles() else if(istype(W, /obj/item/stock_parts/cell)) var/obj/item/stock_parts/cell/C = W @@ -185,7 +176,6 @@ return else //Remove from their hands and back onto the defib unit - paddles.unwield() remove_paddles(user) update_icon() @@ -194,11 +184,11 @@ A.UpdateButtonIcon() /obj/item/defibrillator/proc/make_paddles() - return new /obj/item/twohanded/shockpaddles(src) + return new paddle_type(src) /obj/item/defibrillator/equipped(mob/user, slot) ..() - if((slot_flags == ITEM_SLOT_BACK && slot != SLOT_BACK) || (slot_flags == ITEM_SLOT_BELT && slot != SLOT_BELT)) + if((slot_flags == ITEM_SLOT_BACK && slot != ITEM_SLOT_BACK) || (slot_flags == ITEM_SLOT_BELT && slot != ITEM_SLOT_BELT)) remove_paddles(user) update_icon() @@ -272,6 +262,7 @@ combat = TRUE safety = FALSE cooldown_duration = 2.5 SECONDS + paddle_type = /obj/item/shockpaddles/syndicate /obj/item/defibrillator/compact/combat/loaded/Initialize() . = ..() @@ -281,14 +272,18 @@ /obj/item/defibrillator/compact/combat/loaded/attackby(obj/item/W, mob/user, params) if(W == paddles) - paddles.unwield() toggle_paddles() update_icon() return //paddles -/obj/item/twohanded/shockpaddles +///What caused the paddles to snap back? +#define SNAP_DROP 0 +#define SNAP_OVEREXTEND 1 +#define SNAP_INTERACT 2 + +/obj/item/shockpaddles name = "defibrillator paddles" desc = "A pair of plastic-gripped paddles with flat metal surfaces that are used to deliver powerful electric shocks." icon = 'icons/obj/defib.dmi' @@ -313,38 +308,50 @@ var/mob/listeningTo -/obj/item/twohanded/shockpaddles/equipped(mob/user, slot) + var/base_icon_state = "defibpaddles" + +/obj/item/shockpaddles/ComponentInitialize() . = ..() - if(!req_defib || listeningTo == user) + AddComponent(/datum/component/two_handed, force_unwielded=8, force_wielded=12) + +/obj/item/shockpaddles/Destroy() + defib = null + listeningTo = null + return ..() + +/obj/item/shockpaddles/equipped(mob/user, slot) + . = ..() + if(!req_defib) return - if(listeningTo) + if(listeningTo && listeningTo != user) UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/check_range) listeningTo = user - -/obj/item/twohanded/shockpaddles/Moved() - . = ..() check_range() +/obj/item/shockpaddles/Moved() + . = ..() + if(!istype(loc, /mob/living)) + check_range() -/obj/item/twohanded/shockpaddles/fire_act(exposed_temperature, exposed_volume) +/obj/item/shockpaddles/fire_act(exposed_temperature, exposed_volume) . = ..() if((req_defib && defib) && loc != defib) defib.fire_act(exposed_temperature, exposed_volume) -/obj/item/twohanded/shockpaddles/proc/check_range() - if(!req_defib) +/obj/item/shockpaddles/proc/check_range() + SIGNAL_HANDLER + + if(!req_defib || !defib) return if(!in_range(src,defib)) var/mob/living/L = loc if(istype(L)) - to_chat(L, "[defib]'s paddles overextend and come out of your hands!") - L.temporarilyRemoveItemFromInventory(src,TRUE) + snap_back(cause=SNAP_OVEREXTEND) else - visible_message("[src] snap back into [defib].") snap_back() -/obj/item/twohanded/shockpaddles/proc/recharge(var/time) +/obj/item/shockpaddles/proc/recharge(var/time) if(req_defib || !time) return cooldown = TRUE @@ -356,15 +363,19 @@ cooldown = FALSE update_icon() -/obj/item/twohanded/shockpaddles/New(mainunit) - ..() - if(check_defib_exists(mainunit, src) && req_defib) - defib = mainunit - forceMove(defib) - busy = FALSE - update_icon() +/obj/item/shockpaddles/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NO_STORAGE_INSERT, GENERIC_ITEM_TRAIT) //stops shockpaddles from being inserted in BoH + if(!req_defib) + return //If it doesn't need a defib, just say it exists + if (!loc || !istype(loc, /obj/item/defibrillator)) //To avoid weird issues from admin spawns + return INITIALIZE_HINT_QDEL + defib = loc + busy = FALSE + update_icon() -/obj/item/twohanded/shockpaddles/update_icon() +/obj/item/shockpaddles/update_icon() + var/wielded = ISWIELDED(src) icon_state = "defibpaddles[wielded]" item_state = "defibpaddles[wielded]" if(cooldown) @@ -373,51 +384,56 @@ var/mob/living/carbon/C = loc C.update_inv_hands() -/obj/item/twohanded/shockpaddles/suicide_act(mob/user) +/obj/item/shockpaddles/suicide_act(mob/user) user.visible_message("[user] is putting the live paddles on [user.p_their()] chest! It looks like [user.p_theyre()] trying to commit suicide!") if(req_defib) defib.deductcharge(revivecost) playsound(src, 'sound/machines/defib_zap.ogg', 50, 1, -1) return (OXYLOSS) -/obj/item/twohanded/shockpaddles/dropped(mob/user) +/obj/item/shockpaddles/dropped(mob/user) if(!req_defib) return ..() if(listeningTo) UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) if(user) - var/obj/item/twohanded/offhand/O = user.get_inactive_held_item() - if(istype(O)) - O.unwield() - to_chat(user, "The paddles snap back into the main unit.") - snap_back() - return unwield(user) - -/obj/item/twohanded/shockpaddles/proc/snap_back() + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + if(!ismob(loc)) + snap_back() + return + +/obj/item/shockpaddles/proc/snap_back(cause=SNAP_DROP, silent=FALSE) if(!defib) return - defib.on = FALSE - forceMove(defib) - defib.update_icon() -/obj/item/twohanded/shockpaddles/proc/check_defib_exists(mainunit, mob/living/carbon/M, obj/O) - if(!req_defib) - return TRUE //If it doesn't need a defib, just say it exists - if (!mainunit || !istype(mainunit, /obj/item/defibrillator)) //To avoid weird issues from admin spawns - qdel(O) - return FALSE + if(ismob(loc)) + var/mob/M = loc + M.transferItemToLoc(src, defib) + if(!silent) + switch(cause) + if(SNAP_DROP) + to_chat(M, "The paddles snap back into the main unit.") + if(SNAP_OVEREXTEND) + to_chat(M, "[defib]'s paddles overextend and come out of your hands!") + if(SNAP_INTERACT) + to_chat(M, "You put back [src] into [defib]") else - return TRUE + if(!silent) + visible_message("[src] snaps back into [defib].") + forceMove(defib) -/obj/item/twohanded/shockpaddles/attack(mob/M, mob/user) + defib.on = FALSE + listeningTo = null + defib.update_icon() +/obj/item/shockpaddles/attack(mob/M, mob/user) if(busy) return if(req_defib && !defib.powered) user.visible_message("[defib] beeps: Unit is unpowered.") playsound(src, 'sound/machines/defib_failed.ogg', 50, 0) return - if(!wielded) + if(!ISWIELDED(src)) if(iscyborg(user)) to_chat(user, "You must activate the paddles in your active module before you can use them on someone!") else @@ -459,7 +475,7 @@ do_help(H, user) -/obj/item/twohanded/shockpaddles/proc/can_defib(mob/living/carbon/H) +/obj/item/shockpaddles/proc/can_defib(mob/living/carbon/H) var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart) if(H.suiciding || H.hellbound || HAS_TRAIT(H, TRAIT_HUSK)) return @@ -474,14 +490,14 @@ return return TRUE -/obj/item/twohanded/shockpaddles/proc/shock_touching(dmg, mob/H) +/obj/item/shockpaddles/proc/shock_touching(dmg, mob/H) if(isliving(H.pulledby)) //CLEAR! var/mob/living/M = H.pulledby if(M.electrocute_act(30, H)) M.visible_message("[M] is electrocuted by [M.p_their()] contact with [H]!") M.emote("scream") -/obj/item/twohanded/shockpaddles/proc/do_disarm(mob/living/M, mob/living/user) +/obj/item/shockpaddles/proc/do_disarm(mob/living/M, mob/living/user) if(req_defib && defib.safety) return if(!req_defib && !combat) @@ -507,7 +523,7 @@ else recharge(60) -/obj/item/twohanded/shockpaddles/proc/do_harm(mob/living/carbon/H, mob/living/user) +/obj/item/shockpaddles/proc/do_harm(mob/living/carbon/H, mob/living/user) if(req_defib && defib.safety) return if(!req_defib && !combat) @@ -562,7 +578,7 @@ busy = FALSE update_icon() -/obj/item/twohanded/shockpaddles/proc/do_help(mob/living/carbon/H, mob/living/user) +/obj/item/shockpaddles/proc/do_help(mob/living/carbon/H, mob/living/user) user.visible_message("[user] begins to place [src] on [H]'s chest.", "You begin to place [src] on [H]'s chest...") busy = TRUE update_icon() @@ -665,14 +681,14 @@ busy = FALSE update_icon() -/obj/item/twohanded/shockpaddles/cyborg +/obj/item/shockpaddles/cyborg name = "cyborg defibrillator paddles" icon = 'icons/obj/defib.dmi' icon_state = "defibpaddles0" item_state = "defibpaddles0" req_defib = FALSE -/obj/item/twohanded/shockpaddles/cyborg/attack(mob/M, mob/user) +/obj/item/shockpaddles/cyborg/attack(mob/M, mob/user) if(iscyborg(user)) var/mob/living/silicon/robot/R = user if(R.emagged) @@ -684,7 +700,7 @@ . = ..() -/obj/item/twohanded/shockpaddles/syndicate +/obj/item/shockpaddles/syndicate name = "syndicate defibrillator paddles" desc = "A pair of paddles used to revive deceased operatives. They possess both the ability to penetrate armor and to deliver powerful or disabling shocks offensively." combat = TRUE @@ -692,7 +708,11 @@ icon_state = "defibpaddles0" item_state = "defibpaddles0" -/obj/item/twohanded/shockpaddles/syndicate/cyborg +/obj/item/shockpaddles/syndicate/cyborg req_defib = FALSE +#undef SNAP_DROP +#undef SNAP_OVEREXTEND +#undef SNAP_INTERACT + #undef HALFWAYCRITDEATH diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index f7d5b5e82f99b..1abb372c34ab6 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -23,7 +23,7 @@ GLOBAL_LIST_EMPTY(PDAs) w_class = WEIGHT_CLASS_TINY slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT actions_types = list(/datum/action/item_action/toggle_light) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "stamina" = 0) resistance_flags = FIRE_PROOF | ACID_PROOF @@ -49,6 +49,7 @@ GLOBAL_LIST_EMPTY(PDAs) //Secondary variables var/scanmode = PDA_SCANNER_NONE var/fon = FALSE //Is the flashlight function on? + var/shorted = FALSE //Is the flashlight shorted out? var/f_lum = 2.3 //Luminosity for the flashlight function var/silent = FALSE //To beep or not to beep, that is the question var/toff = FALSE //If TRUE, messenger disabled @@ -76,7 +77,7 @@ GLOBAL_LIST_EMPTY(PDAs) var/datum/picture/picture //Scanned photo - var/list/contained_item = list(/obj/item/pen, /obj/item/toy/crayon, /obj/item/lipstick, /obj/item/flashlight/pen, /obj/item/clothing/mask/cigarette, /obj/item/electronic_assembly/small) + var/list/contained_item = list(/obj/item/pen, /obj/item/toy/crayon, /obj/item/lipstick, /obj/item/flashlight/pen, /obj/item/clothing/mask/cigarette) var/obj/item/inserted_item //Used for pen, crayon, and lipstick insertion or removal. Same as above. var/overlays_x_offset = 0 //x offset to use for certain overlays @@ -279,8 +280,6 @@ GLOBAL_LIST_EMPTY(PDAs) if (cartridge) if(cartridge.bot_access_flags) dat += "
    • [PDAIMG(medbot)]Bots Access
    • " - if (cartridge.access & CART_JANITOR) - dat += "
    • [PDAIMG(bucket)]Custodial Locator
    • " if(cartridge.access & CART_MIME) dat += "
    • [PDAIMG(emoji)]Emoji Guidebook
    • " if (istype(cartridge.radio)) @@ -373,7 +372,7 @@ GLOBAL_LIST_EMPTY(PDAs) for(var/id in environment.get_gases()) var/gas_level = environment.get_moles(id)/total_moles if(gas_level > 0) - dat += "[GLOB.meta_gas_info[id][META_GAS_NAME]]: [round(gas_level*100, 0.01)]%
      " + dat += "[GLOB.gas_data.names[id]]: [round(gas_level*100, 0.01)]%
      " dat += "Temperature: [round(environment.return_temperature()-T0C)]°C
      " dat += "
      " @@ -404,7 +403,8 @@ GLOBAL_LIST_EMPTY(PDAs) //BASIC FUNCTIONS=================================== if("Refresh")//Refresh, goes to the end of the proc. - + if(!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) if ("Toggle_Font") //CODE REVISION 2 font_index = (font_index + 1) % 4 @@ -418,13 +418,16 @@ GLOBAL_LIST_EMPTY(PDAs) font_mode = FONT_ORBITRON if (MODE_VT) font_mode = FONT_VT + if(!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) if ("Change_Color") var/new_color = input("Please enter a color name or hex value (Default is \'#808000\').",background_color)as color background_color = new_color if ("Toggle_Underline") underline_flag = !underline_flag - + if(!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) if("Return")//Return if(mode<=9) mode = 0 @@ -432,6 +435,8 @@ GLOBAL_LIST_EMPTY(PDAs) mode = round(mode/10) if(mode==4 || mode == 5)//Fix for cartridges. Redirects to hub. mode = 0 + if(!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) if ("Authenticate")//Checks for ID id_check(U) if("UpdateInfo") @@ -439,34 +444,57 @@ GLOBAL_LIST_EMPTY(PDAs) if(istype(id, /obj/item/card/id/syndicate)) owner = id.registered_name update_label() + if(!silent) + playsound(src, 'sound/machines/terminal_processing.ogg', 15, TRUE) + addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/machines/terminal_success.ogg', 15, TRUE), 1.3 SECONDS) if("Eject")//Ejects the cart, only done from hub. eject_cart(U) + if(!silent) + playsound(src, 'sound/machines/terminal_eject.ogg', 50, TRUE) //MENU FUNCTIONS=================================== if("0")//Hub mode = 0 + if(!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) if("1")//Notes mode = 1 + if(!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) if("2")//Messenger mode = 2 + if(!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) if("21")//Read messeges mode = 21 + if(!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) if("3")//Atmos scan mode = 3 + if(!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) if("4")//Redirects to hub mode = 0 + if(!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) + + //MAIN FUNCTIONS=================================== if("Light") toggle_light(U) + if(!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) if("Medical Scan") if(scanmode == PDA_SCANNER_MEDICAL) scanmode = PDA_SCANNER_NONE else if((!isnull(cartridge)) && (cartridge.access & CART_MEDICAL)) scanmode = PDA_SCANNER_MEDICAL + if(!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) if("Reagent Scan") if(scanmode == PDA_SCANNER_REAGENT) scanmode = PDA_SCANNER_NONE @@ -477,6 +505,8 @@ GLOBAL_LIST_EMPTY(PDAs) scanmode = PDA_SCANNER_NONE else if((!isnull(cartridge)) && (cartridge.access & CART_ENGINE)) scanmode = PDA_SCANNER_HALOGEN + if(!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) if("Honk") if ( !(last_noise && world.time < last_noise + 20) ) playsound(src, 'sound/items/bikehorn.ogg', 50, 1) @@ -490,6 +520,8 @@ GLOBAL_LIST_EMPTY(PDAs) scanmode = PDA_SCANNER_NONE else if((!isnull(cartridge)) && (cartridge.access & CART_ATMOS)) scanmode = PDA_SCANNER_GAS + if(!silent) + playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) if("Drone Phone") var/alert_s = input(U,"Alert severity level","Ping Drones",null) as null|anything in list("Low","Medium","High","Critical") var/area/A = get_area(U) @@ -497,6 +529,8 @@ GLOBAL_LIST_EMPTY(PDAs) var/msg = "NON-DRONE PING: [U.name]: [alert_s] priority alert in [A.name]!" _alert_drones(msg, TRUE, U) to_chat(U, msg) + if(!silent) + playsound(src, 'sound/machines/terminal_success.ogg', 15, TRUE) //NOTEKEEPER FUNCTIONS=================================== @@ -538,7 +572,8 @@ GLOBAL_LIST_EMPTY(PDAs) sort_by_job = !sort_by_job if("MessageAll") - send_to_all(U) + if(cartridge?.spam_enabled) + send_to_all(U) if("cart") if(cartridge) @@ -602,6 +637,7 @@ GLOBAL_LIST_EMPTY(PDAs) to_chat(usr, "You remove the ID from the [name].") id = null update_icon() + playsound(src, 'sound/machines/terminal_eject.ogg', 50, TRUE) if(ishuman(loc)) var/mob/living/carbon/human/H = loc if(H.wear_id == src) @@ -677,6 +713,8 @@ GLOBAL_LIST_EMPTY(PDAs) // If it didn't reach, note that fact if (!signal.data["done"]) to_chat(user, "ERROR: Server isn't responding.") + if(!silent) + playsound(src, 'sound/machines/terminal_error.ogg', 15, TRUE) return var/target_text = signal.format_target() @@ -694,6 +732,11 @@ GLOBAL_LIST_EMPTY(PDAs) // Log in the talk log user.log_talk(message, LOG_PDA, tag="PDA: [initial(name)] to [target_text]") to_chat(user, "PDA message sent to [target_text]: \"[message]\"") + if(!silent) + if(HAS_TRAIT(SSstation, STATION_TRAIT_PDA_GLITCHED)) + playsound(src, pick('sound/machines/twobeep_voice1.ogg', 'sound/machines/twobeep_voice2.ogg'), 50, TRUE) + else + playsound(src, 'sound/machines/terminal_success.ogg', 15, TRUE) // Reset the photo picture = null last_text = world.time @@ -704,7 +747,10 @@ GLOBAL_LIST_EMPTY(PDAs) tnote += "← From [signal.data["name"]] ([signal.data["job"]]):
      [signal.format_message()]
      " if (!silent) - playsound(src, 'sound/machines/twobeep_high.ogg', 50, 1) + if(HAS_TRAIT(SSstation, STATION_TRAIT_PDA_GLITCHED)) + playsound(src, pick('sound/machines/twobeep_voice1.ogg', 'sound/machines/twobeep_voice2.ogg'), 50, TRUE) + else + playsound(src, 'sound/machines/twobeep_high.ogg', 50, TRUE) audible_message("[icon2html(src, hearers(src))] *[ttone]*", null, 3) //Search for holder of the PDA. var/mob/living/L = null @@ -744,8 +790,6 @@ GLOBAL_LIST_EMPTY(PDAs) send_message(U,list(P)) /obj/item/pda/AltClick(mob/user) - ..() - if(id) remove_id(user) else @@ -795,18 +839,17 @@ GLOBAL_LIST_EMPTY(PDAs) eject_cart(usr) /obj/item/pda/proc/toggle_light(mob/user) - if(issilicon(user) || !user.canUseTopic(src, BE_CLOSE)) - return - if(fon) - fon = FALSE - set_light(0) - else if(f_lum) - fon = TRUE - set_light(f_lum) - update_icon() - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() + if(issilicon(user) || !user.canUseTopic(src, BE_CLOSE)) + return + if(shorted) + to_chat(user, "[src]'s light is not turning on!") + return + fon = !fon + set_light(fon ? f_lum : 0) + update_icon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/pda/proc/remove_pen(mob/user) @@ -818,6 +861,7 @@ GLOBAL_LIST_EMPTY(PDAs) to_chat(user, "You remove [inserted_item] from [src].") inserted_item = null update_icon() + playsound(src, 'sound/machines/pda_button2.ogg', 50, TRUE) else to_chat(user, "This PDA does not have a pen in it!") @@ -856,6 +900,35 @@ GLOBAL_LIST_EMPTY(PDAs) if(old_id) user.put_in_hands(old_id) update_icon() + playsound(src, 'sound/machines/pda_button1.ogg', 50, TRUE) + return TRUE + +/obj/item/pda/pre_attack(obj/target, mob/living/user, params) + if(!ismachinery(target)) + return ..() + var/obj/machinery/target_machine = target + if(!target_machine.panel_open && !istype(target, /obj/machinery/computer)) + return ..() + if(!istype(cartridge, /obj/item/cartridge/virus/clown)) + return ..() + var/obj/item/cartridge/virus/installed_cartridge = cartridge + + if(installed_cartridge.charges <=0) + balloon_alert(user, "Out of charges") + return ..() + + if(target.GetComponent(/datum/component/sound_player)) + balloon_alert(user, "This is already hacked") + return + + balloon_alert(user, "Virus uploaded") + var/list/sig_list = list() + if(istype(target, /obj/machinery/door/airlock)) + sig_list += list(COMSIG_AIRLOCK_OPEN, COMSIG_AIRLOCK_CLOSE) + else + sig_list += list(COMSIG_ATOM_ATTACK_HAND) + installed_cartridge.charges-- + target.AddComponent(/datum/component/sound_player, amount = (rand(30,50)), signal_or_sig_list = sig_list) return TRUE // access to status display signals @@ -869,17 +942,25 @@ GLOBAL_LIST_EMPTY(PDAs) to_chat(user, "You insert [cartridge] into [src].") updateSelfDialog() update_icon() + if(HAS_TRAIT(SSstation, STATION_TRAIT_PDA_GLITCHED)) + playsound(src, pick('sound/machines/twobeep_voice1.ogg', 'sound/machines/twobeep_voice2.ogg'), 50, TRUE) + else + playsound(src, 'sound/machines/pda_button1.ogg', 50, TRUE) else if(istype(C, /obj/item/card/id)) var/obj/item/card/id/idcard = C if(!idcard.registered_name) to_chat(user, "\The [src] rejects the ID!") + if(!silent) + playsound(src, 'sound/machines/terminal_error.ogg', 50, TRUE) return if(!owner) owner = idcard.registered_name ownjob = idcard.assignment update_label() to_chat(user, "Card scanned.") + if(!silent) + playsound(src, 'sound/machines/terminal_success.ogg', 50, TRUE) else if(!id_check(user, idcard)) return @@ -904,6 +985,7 @@ GLOBAL_LIST_EMPTY(PDAs) to_chat(user, "You slide \the [C] into \the [src].") inserted_item = C update_icon() + playsound(src, 'sound/machines/pda_button1.ogg', 50, TRUE) else if(istype(C, /obj/item/photo)) var/obj/item/photo/P = C picture = P.picture @@ -935,16 +1017,19 @@ GLOBAL_LIST_EMPTY(PDAs) return switch(scanmode) if(PDA_SCANNER_REAGENT) - if(!isnull(A.reagents)) - if(A.reagents.reagent_list.len > 0) - var/reagents_length = A.reagents.reagent_list.len - to_chat(user, "[reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found.") - for (var/re in A.reagents.reagent_list) - to_chat(user, "\t [re]") + if(!istype(A, /obj/item/reagent_containers/pill/floorpill)) + if(!isnull(A.reagents)) + if(A.reagents.reagent_list.len > 0) + var/reagents_length = A.reagents.reagent_list.len + to_chat(user, "[reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found.") + for (var/re in A.reagents.reagent_list) + to_chat(user, "\t [re]") + else + to_chat(user, "No active chemical agents found in [A].") else - to_chat(user, "No active chemical agents found in [A].") + to_chat(user, "No significant chemical agents found in [A].") else - to_chat(user, "No significant chemical agents found in [A].") + to_chat(user, "You can't scan [A].") if(PDA_SCANNER_GAS) A.analyzer_act(user, src) @@ -971,7 +1056,7 @@ GLOBAL_LIST_EMPTY(PDAs) if (ismob(loc)) var/mob/M = loc - M.show_message("Your [src] explodes!", 1) + M.show_message("Your [src] explodes!", MSG_VISUAL, "You hear a loud *pop*!", MSG_AUDIBLE) else visible_message("[src] explodes!", "You hear a loud *pop*!") @@ -1069,13 +1154,16 @@ GLOBAL_LIST_EMPTY(PDAs) // Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP /obj/item/pda/emp_act(severity) . = ..() - if (!(. & EMP_PROTECT_CONTENTS)) + if(!(. & EMP_PROTECT_CONTENTS)) for(var/atom/A in src) A.emp_act(severity) - if (!(. & EMP_PROTECT_SELF)) + if(!(. & EMP_PROTECT_SELF)) emped += 1 - spawn(200 * severity) - emped -= 1 + var/emptime = 200 * severity + addtimer(CALLBACK(src, .proc/decrease_emp_level), emptime) + +/obj/item/pda/proc/decrease_emp_level() + emped -= 1 /proc/get_viewable_pdas(sort_by_job = FALSE) . = list() diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm index 911b19ca3b73f..85add56b0218e 100644 --- a/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/code/game/objects/items/devices/PDA/PDA_types.dm @@ -18,6 +18,7 @@ var/obj/item/cartridge/virus/clown/cart = cartridge if(istype(cart) && cart.charges < 5) cart.charges++ + playsound(src,'sound/machines/ping.ogg', 30, TRUE) //Mime PDA sends "silent" messages. /obj/item/pda/mime @@ -153,6 +154,10 @@ name = "shaft miner PDA" icon_state = "pda-miner" +/obj/item/pda/exploration + name = "exploration PDA" + icon_state = "pda-exploration" + /obj/item/pda/syndicate default_cartridge = /obj/item/cartridge/virus/syndicate icon_state = "pda-syndi" @@ -228,6 +233,7 @@ desc = "A shitty knockoff of a portable microcomputer by Thinktronic Systems, LTD. Complete with a cracked operating system." note = "Error: Unlicensed OS. Please contact your supervisor." icon_state = "pda-knockoff" + inserted_item = /obj/item/pen/charcoal /obj/item/pda/celebrity name = "fancy PDA" diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 5f815eb551e40..2de3276a7cf62 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -6,14 +6,13 @@ #define CART_MANIFEST (1<<4) #define CART_CLOWN (1<<5) #define CART_MIME (1<<6) -#define CART_JANITOR (1<<7) -#define CART_REAGENT_SCANNER (1<<8) -#define CART_NEWSCASTER (1<<9) -#define CART_REMOTE_DOOR (1<<10) -#define CART_STATUS_DISPLAY (1<<11) -#define CART_QUARTERMASTER (1<<12) -#define CART_HYDROPONICS (1<<13) -#define CART_DRONEPHONE (1<<14) +#define CART_REAGENT_SCANNER (1<<7) +#define CART_NEWSCASTER (1<<8) +#define CART_REMOTE_DOOR (1<<9) +#define CART_STATUS_DISPLAY (1<<10) +#define CART_QUARTERMASTER (1<<11) +#define CART_HYDROPONICS (1<<12) +#define CART_DRONEPHONE (1<<13) /obj/item/cartridge @@ -96,7 +95,7 @@ name = "\improper CustodiPRO cartridge" desc = "The ultimate in clean-room design." icon_state = "cart-j" - access = CART_JANITOR | CART_DRONEPHONE + access = CART_DRONEPHONE bot_access_flags = CLEAN_BOT /obj/item/cartridge/lawyer @@ -147,7 +146,7 @@ /obj/item/cartridge/hop name = "\improper HumanResources9001 cartridge" icon_state = "cart-h" - access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_JANITOR | CART_SECURITY | CART_NEWSCASTER | CART_QUARTERMASTER | CART_DRONEPHONE + access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_SECURITY | CART_NEWSCASTER | CART_QUARTERMASTER | CART_DRONEPHONE bot_access_flags = MULE_BOT | CLEAN_BOT /obj/item/cartridge/hos @@ -264,7 +263,7 @@ Code: for(var/obj/machinery/computer/monitor/pMon in GLOB.machines) if(pMon.stat & (NOPOWER | BROKEN)) //check to make sure the computer is functional continue - if(pda_turf.z != pMon.z) //and that we're on the same zlevel as the computer (lore: limited signal strength) + if(pda_turf.get_virtual_z_level() != pMon.get_virtual_z_level()) //and that we're on the same zlevel as the computer (lore: limited signal strength) continue if(pMon.is_secret_monitor) //make sure it isn't a secret one (ie located on a ruin), allowing people to metagame that the location exists continue @@ -312,7 +311,10 @@ Code: //would be to use [A.area.name] for(var/obj/machinery/power/apc/A in L) menu += copytext_char(add_trailing(A.area.name, 30, " "), 1, 30) - menu += " [S[A.equipment+1]] [S[A.lighting+1]] [S[A.environ+1]] [add_leading(DisplayPower(A.lastused_total), 6, " ")] [A.cell ? "[add_leading(round(A.cell.percent()), 3, " ")]% [chg[A.charging+1]]" : " N/C"]
      " + if(A.integration_cog) + menu += " [S[A.equipment+1]] [S[A.lighting+1]] [S[A.environ+1]] [add_leading(DisplayPower(A.lastused_total), 6, " ")] 100% F
      " + else + menu += " [S[A.equipment+1]] [S[A.lighting+1]] [S[A.environ+1]] [add_leading(DisplayPower(A.lastused_total), 6, " ")] [A.cell ? "[add_leading("[round(A.cell.percent())]", 3, " ")]% [chg[A.charging+1]]" : " N/C"]
      " menu += "" @@ -386,24 +388,7 @@ Code: if(active3 in GLOB.data_core.security) menu += "Criminal Status: [active3.fields["criminal"]]
      " - menu += text("
      \nMinor Crimes:") - - menu +={" - - - - - -"} - for(var/datum/data/crime/c in active3.fields["mi_crim"]) - menu += "" - menu += "" - menu += "" - menu += "" - menu += "" - menu += "
      CrimeDetailsAuthorTime Added
      [c.crimeName][c.crimeDetails][c.author][c.time]
      " - - menu += text("
      \nMajor Crimes:") + menu += text("
      \nCrimes:") menu +={" @@ -412,7 +397,7 @@ Code: "} - for(var/datum/data/crime/c in active3.fields["ma_crim"]) + for(var/datum/data/crime/c in active3.fields["crim"]) menu += "" menu += "" menu += "" @@ -476,68 +461,6 @@ Code: menu += "No ore silo detected!" menu = jointext(menu, "") - if (49) //janitorial locator - menu = "

      [PDAIMG(bucket)] Persistent Custodial Object Locator

      " - - var/turf/cl = get_turf(src) - if (cl) - menu += "Current Orbital Location: \[[cl.x],[cl.y]\]" - - menu += "

      Located Mops:

      " - - var/ldat - for (var/obj/item/mop/M in world) - var/turf/ml = get_turf(M) - - if(ml) - if (ml.z != cl.z) - continue - var/direction = get_dir(src, M) - ldat += "Mop - \[[ml.x],[ml.y] ([uppertext(dir2text(direction))])\] - [M.reagents.total_volume ? "Wet" : "Dry"]
      " - - if (!ldat) - menu += "None" - else - menu += "[ldat]" - - menu += "

      Located Janitorial Cart:

      " - - ldat = null - for (var/obj/structure/janitorialcart/B in world) - var/turf/bl = get_turf(B) - - if(bl) - if (bl.z != cl.z) - continue - var/direction = get_dir(src, B) - ldat += "Cart - \[[bl.x],[bl.y] ([uppertext(dir2text(direction))])\] - Water level: [B.reagents.total_volume]/100
      " - - if (!ldat) - menu += "None" - else - menu += "[ldat]" - - menu += "

      Located Cleanbots:

      " - - ldat = null - for (var/mob/living/simple_animal/bot/cleanbot/B in GLOB.alive_mob_list) - var/turf/bl = get_turf(B) - - if(bl) - if (bl.z != cl.z) - continue - var/direction = get_dir(src, B) - ldat += "Cleanbot - \[[bl.x],[bl.y] ([uppertext(dir2text(direction))])\] - [B.on ? "Online" : "Offline"]
      " - - if (!ldat) - menu += "None" - else - menu += "[ldat]" - - else - menu += "ERROR: Unable to determine current location." - menu += "

      Refresh GPS Locator" - if (53) // Newscaster menu = "

      [PDAIMG(notes)] Newscaster Access

      " menu += "
      Current Newsfeed: [current_channel ? current_channel : "None"]
      " @@ -738,11 +661,11 @@ Code: else menu += "
      [PDAIMG(refresh)]Scan for active bots

      " var/turf/current_turf = get_turf(src) - var/zlevel = current_turf.z + var/zlevel = current_turf.get_virtual_z_level() var/botcount = 0 for(var/B in GLOB.bots_list) //Git da botz var/mob/living/simple_animal/bot/Bot = B - if(!Bot.on || Bot.z != zlevel || Bot.remote_disabled || !(bot_access_flags & Bot.bot_type)) //Only non-emagged bots on the same Z-level are detected! + if(!Bot.on || Bot.get_virtual_z_level() != zlevel || Bot.remote_disabled || !(bot_access_flags & Bot.bot_type)) //Only non-emagged bots on the same Z-level are detected! continue //Also, the PDA must have access to the bot type. menu += "[Bot.name] ([Bot.get_mode()])
      " botcount++ diff --git a/code/game/objects/items/devices/PDA/virus_cart.dm b/code/game/objects/items/devices/PDA/virus_cart.dm index d26609bbefe92..4ed73e1887e55 100644 --- a/code/game/objects/items/devices/PDA/virus_cart.dm +++ b/code/game/objects/items/devices/PDA/virus_cart.dm @@ -66,17 +66,17 @@ charges-- var/difficulty = 0 if(target.cartridge) - difficulty += BitCount(target.cartridge.access&(CART_MEDICAL | CART_SECURITY | CART_ENGINE | CART_CLOWN | CART_JANITOR | CART_MANIFEST)) + difficulty += BitCount(target.cartridge.access&(CART_MEDICAL | CART_SECURITY | CART_ENGINE | CART_CLOWN | CART_MANIFEST)) if(target.cartridge.access & CART_MANIFEST) difficulty++ //if cartridge has manifest access it has extra snowflake difficulty else difficulty += 2 var/datum/component/uplink/hidden_uplink = target.GetComponent(/datum/component/uplink) if(!target.detonatable || prob(difficulty * 15) || (hidden_uplink)) - U.show_message("An error flashes on your [src].", 1) + U.show_message("An error flashes on your [src].", MSG_VISUAL) else log_bomber(U, "triggered a PDA explosion on", target, "[!is_special_character(U) ? "(TRIGGED BY NON-ANTAG)" : ""]") - U.show_message("Success!", 1) + U.show_message("Success!", MSG_VISUAL) target.explode() else to_chat(U, "PDA not found.") diff --git a/code/game/objects/items/devices/antivirus.dm b/code/game/objects/items/devices/antivirus.dm index a3f3a7a03fe77..17d9d39f7c9b9 100644 --- a/code/game/objects/items/devices/antivirus.dm +++ b/code/game/objects/items/devices/antivirus.dm @@ -9,32 +9,32 @@ var/mob/living/carbon/human/H = M var/cured = 0 if(MOB_ROBOTIC in H.mob_biotypes) - H.say("Installing [src]. Please do not turn your [H.dna.species] unit off or otherwise disturb it during the installation process") + H.say("Installing [src]. Please do not turn your [H.dna.species] unit off or otherwise disturb it during the installation process", forced = "antivirus") if(do_mob(user, H, 450)) //it has unlimited uses, but that's balanced by being very slow - H.say("[src] succesfully installed. Initiating scan.") + H.say("[src] succesfully installed. Initiating scan.", forced = "antivirus") for(var/thing in H.diseases) var/datum/disease/D = thing if(istype(D, /datum/disease/advance)) var/datum/disease/advance/A = D - if(A.properties["resistance"] >= resistcap) - if(A.properties["stealth"] <= 4) - H.say("Failed to delete [D].exe") + if(A.resistance >= resistcap) + if(A.stealth <= 4) + H.say("Failed to delete [D].exe", forced = "antivirus") continue else if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) - H.say("Failed to delete [D].exe") + H.say("Failed to delete [D].exe", forced = "antivirus") continue cured += 1 - H.say("[D].exe deleted...") + H.say("[D].exe deleted...", forced = "antivirus") D.cure(TRUE) stoplag(5 - cured) if(cured) - H.forcesay("[cured] malicious files were deleted. Thank you for using [src]") - else - H.forcesay("No malicious files detected!") + H.say("[cured] malicious files were deleted. Thank you for using [src].", forced = "antivirus") + else + H.say("No malicious files detected!", forced = "antivirus") return else return ..() - + /obj/item/disk/antivirus/tier2 name = "Ahoy" diff --git a/code/game/objects/items/devices/beacon.dm b/code/game/objects/items/devices/beacon.dm index 03b3a468ed67c..d8555525e619c 100644 --- a/code/game/objects/items/devices/beacon.dm +++ b/code/game/objects/items/devices/beacon.dm @@ -18,7 +18,7 @@ icon_state = "beacon-off" /obj/item/beacon/Destroy() - GLOB.teleportbeacons.Remove(src) + GLOB.teleportbeacons -= src return ..() /obj/item/beacon/attack_self(mob/user) @@ -28,7 +28,7 @@ GLOB.teleportbeacons += src else icon_state = "beacon-off" - GLOB.teleportbeacons.Remove(src) + GLOB.teleportbeacons -= src to_chat(user, "You [enabled ? "enable" : "disable"] the beacon.") return diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 4ef579bc0037f..b6085cd9293a1 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -38,7 +38,8 @@ /obj/item/camera_bug/Destroy() get_cameras() for(var/cam_tag in bugged_cameras) - var/obj/machinery/camera/camera = bugged_cameras[cam_tag] + var/datum/weakref/camera_ref = bugged_cameras[cam_tag] + var/obj/machinery/camera/camera = camera_ref.resolve() if(camera && camera.bug == src) camera.bug = null bugged_cameras = list() @@ -65,7 +66,7 @@ return 0 var/turf/T_user = get_turf(user.loc) var/turf/T_current = get_turf(current) - if(T_user.z != T_current.z || !current.can_use()) + if(T_user.get_virtual_z_level() != T_current.get_virtual_z_level() || !current.can_use()) to_chat(user, "[src] has lost the signal.") current = null user.unset_machine() @@ -80,8 +81,11 @@ for(var/obj/machinery/camera/camera in GLOB.cameranet.cameras) if(camera.stat || !camera.can_use()) continue - if(length(list("ss13","mine", "rd", "labor", "toxins", "minisat")&camera.network)) - bugged_cameras[camera.c_tag] = camera + if(length(list("ss13","mine", "rd", "labor", "toxins", "minisat") & camera.network)) + var/datum/weakref/camera_ref = WEAKREF(camera) + if(!camera_ref || !camera.c_tag) + continue + bugged_cameras[camera.c_tag] = camera_ref return sortList(bugged_cameras) @@ -94,15 +98,17 @@ if(BUGMODE_LIST) html = "

      Select a camera:

      \[Cancel camera view\]
      Author Time Added
      [c.crimeName][c.crimeDetails][c.author]
      " for(var/entry in cameras) - var/obj/machinery/camera/C = cameras[entry] - if(QDELETED(C)) + var/datum/weakref/camera_ref = cameras[entry] + var/obj/machinery/camera/camera = camera_ref.resolve() + if(!camera) + cameras -= camera_ref continue var/functions = "" - if(C.bug == src) - functions = " - \[Monitor\]\[Disable\]" + if(camera.bug == src) + functions = " - \[Monitor\]\[Disable\]" else - functions = " - \[Monitor\]" - html += "" + functions = " - \[Monitor\]" + html += "" if(BUGMODE_MONITOR) if(current) @@ -116,10 +122,11 @@ html = "Tracking '[tracked_name]' \[Cancel Tracking\]\[Cancel camera view\]
      " if(last_found) var/time_diff = round((world.time - last_seen) / 150) - var/obj/machinery/camera/C = bugged_cameras[last_found] + var/datum/weakref/camera_ref = bugged_cameras[last_found] + var/obj/machinery/camera/camera = camera_ref.resolve() var/outstring - if(C) - outstring = "[last_found]" + if(camera) + outstring = "[last_found]" else outstring = last_found if(!time_diff) @@ -131,8 +138,8 @@ if(!s) s = "00" html += "Last seen near [outstring] ([m]:[s] minute\s ago)
      " - if( C && (C.bug == src)) //Checks to see if the camera has a bug - html += "\[Disable\]" + if(camera && (camera.bug == src)) //Checks to see if the camera has a bug + html += "\[Disable\]" else html += "Not yet seen." @@ -203,12 +210,13 @@ if("monitor" in href_list) //You can't locate on a list with keys var/list/cameras = flatten_list(bugged_cameras) - var/obj/machinery/camera/C = locate(href_list["monitor"]) in cameras - if(C && istype(C)) - if(!same_z_level(C)) + var/datum/weakref/camera_ref = locate(href_list["monitor"]) in cameras + var/obj/machinery/camera/camera = camera_ref.resolve() + if(camera && istype(camera)) + if(!same_z_level(camera)) return track_mode = BUGMODE_MONITOR - current = C + current = camera usr.reset_perspective(null) interact() if("track" in href_list) @@ -224,13 +232,14 @@ if("emp" in href_list) //You can't locate on a list with keys var/list/cameras = flatten_list(bugged_cameras) - var/obj/machinery/camera/C = locate(href_list["emp"]) in cameras - if(C && istype(C) && C.bug == src) - if(!same_z_level(C)) + var/datum/weakref/camera_ref = locate(href_list["emp"]) in cameras + var/obj/machinery/camera/camera = camera_ref.resolve() + if(camera && istype(camera) && camera.bug == src) + if(!same_z_level(camera)) return - C.emp_act(EMP_HEAVY) - C.bug = null - bugged_cameras -= C.c_tag + camera.emp_act(EMP_HEAVY) + camera.bug = null + bugged_cameras -= camera.c_tag interact() return if("close" in href_list) @@ -240,17 +249,18 @@ if("view" in href_list) //You can't locate on a list with keys var/list/cameras = flatten_list(bugged_cameras) - var/obj/machinery/camera/C = locate(href_list["view"]) in cameras - if(C && istype(C)) - if(!same_z_level(C)) + var/datum/weakref/camera_ref = locate(href_list["view"]) in cameras + var/obj/machinery/camera/camera = camera_ref.resolve() + if(camera && istype(camera)) + if(!same_z_level(camera)) return - if(!C.can_use()) + if(!camera.can_use()) to_chat(usr, "Something's wrong with that camera! You can't get a feed.") return - current = C + current = camera spawn(6) if(src.check_eye(usr)) - usr.reset_perspective(C) + usr.reset_perspective(camera) interact() else usr.unset_machine() @@ -301,7 +311,7 @@ /obj/item/camera_bug/proc/same_z_level(var/obj/machinery/camera/C) var/turf/T_cam = get_turf(C) var/turf/T_bug = get_turf(loc) - if(!T_bug || T_cam.z != T_bug.z) + if(!T_bug || T_cam.get_virtual_z_level() != T_bug.get_virtual_z_level()) to_chat(usr, "You can't get a signal!") return FALSE return TRUE diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 23abd97d472fa..203d327fac3f0 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -15,6 +15,7 @@ var/can_use = 1 var/obj/effect/dummy/chameleon/active_dummy = null var/saved_appearance = null + var/list/vis_overlay_data = list() /obj/item/chameleon/Initialize() . = ..() @@ -60,6 +61,14 @@ temp.plane = initial(target.plane) saved_appearance = temp.appearance + if(istype(target, /atom/movable)) //Record vis_overlays data + var/atom/movable/M = target + var/count = 0 + vis_overlay_data = list() + for(var/obj/effect/overlay/vis/overlay in M.vis_contents) + count++ + vis_overlay_data["[count]"] = list("icon" = overlay.icon, "icon_state" = overlay.icon_state, "layer" = overlay.layer, "plane" = overlay.plane, "alpha" = overlay.alpha, "appearance_flags" = overlay.appearance_flags) + /obj/item/chameleon/proc/check_sprite(atom/target) if(target.icon_state in icon_states(target.icon)) return TRUE @@ -78,6 +87,9 @@ else playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) var/obj/effect/dummy/chameleon/C = new/obj/effect/dummy/chameleon(user.drop_location()) + for(var/overlay_index in vis_overlay_data) + var/list/overlay_data = vis_overlay_data[overlay_index] + SSvis_overlays.add_vis_overlay(C, overlay_data["icon"], overlay_data["icon_state"], overlay_data["layer"], overlay_data["plane"], C.dir, alpha = overlay_data["alpha"], add_appearance_flags = overlay_data["appearance_flags"]) C.activate(user, saved_appearance, src) to_chat(user, "You activate \the [src].") new /obj/effect/temp_visual/emp/pulse(get_turf(src)) diff --git a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm index e87ea386c2787..792ab9beae65c 100644 --- a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm +++ b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm @@ -7,20 +7,23 @@ w_class = WEIGHT_CLASS_TINY materials = list(/datum/material/iron = 50, /datum/material/glass = 300) var/recharging = FALSE + var/obj/item/electronics/airlock/electronics = null var/circuits = 5 //How many circuits the pseudocircuit has left var/static/recycleable_circuits = typecacheof(list(/obj/item/electronics/firelock, /obj/item/electronics/airalarm, /obj/item/electronics/firealarm, \ - /obj/item/electronics/apc, /obj/item/electronics/advanced_airlock_controller))//A typecache of circuits consumable for material + /obj/item/electronics/apc, /obj/item/electronics/advanced_airlock_controller, /obj/item/electronics/airlock))//A typecache of circuits consumable for material /obj/item/electroadaptive_pseudocircuit/Initialize() . = ..() - maptext = "[circuits]" + maptext = MAPTEXT("[circuits]") + electronics = new/obj/item/electronics/airlock(src) + electronics.holder = src /obj/item/electroadaptive_pseudocircuit/examine(mob/user) . = ..() if(iscyborg(user)) - . += {"It has material for [circuits] circuit[circuits == 1 ? "" : "s"]. Use the pseudocircuit on existing circuits to gain material.\n - Serves as a substitute for fire/air alarm, firelock, and APC electronics.\n - It can also be used on an APC with no power cell to fabricate a low-capacity cell at a high power cost."} + . += "It has material for [circuits] circuit[circuits == 1 ? "" : "s"]. Use the pseudocircuit on existing circuits to gain material.\n"+\ + "Serves as a substitute for fire/air alarm, firelock, and APC electronics.\n"+\ + "It can also be used on an APC with no power cell to fabricate a low-capacity cell at a high power cost." /obj/item/electroadaptive_pseudocircuit/proc/adapt_circuit(mob/living/silicon/robot/R, circuit_cost = 0) if(QDELETED(R) || !istype(R)) @@ -40,7 +43,7 @@ playsound(R, 'sound/items/rped.ogg', 50, TRUE) recharging = TRUE circuits-- - maptext = "[circuits]" + maptext = MAPTEXT("[circuits]") icon_state = "[initial(icon_state)]_recharging" var/recharge_time = min(600, circuit_cost * 5) //40W of cost for one fabrication = 20 seconds of recharge time; this is to prevent spamming addtimer(CALLBACK(src, .proc/recharge), recharge_time) @@ -53,7 +56,7 @@ if(!is_type_in_typecache(target, recycleable_circuits)) return circuits++ - maptext = "[circuits]" + maptext = MAPTEXT("[circuits]") user.visible_message("User breaks down [target] with [src].", \ "You recycle [target] into [src]. It now has material for [circuits] circuits.") playsound(user, 'sound/items/deconstruct.ogg', 50, TRUE) @@ -63,3 +66,12 @@ playsound(src, 'sound/machines/chime.ogg', 25, TRUE) recharging = FALSE icon_state = initial(icon_state) + +/obj/item/electroadaptive_pseudocircuit/attack_self(mob/user) + . = ..() + electronics.ui_interact(user) + +/obj/item/electroadaptive_pseudocircuit/Destroy() + QDEL_NULL(electronics) + . = ..() + \ No newline at end of file diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 66ef2dc2a85c2..3cafdae575722 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -258,6 +258,7 @@ icon_state = "flare" item_state = "flare" actions_types = list() + /// How many seconds of fuel we have left var/fuel = 0 var/on_damage = 7 var/produce_heat = 1500 @@ -267,12 +268,12 @@ /obj/item/flashlight/flare/Initialize() . = ..() - fuel = rand(800, 1000) // Sorry for changing this so much but I keep under-estimating how long X number of ticks last in seconds. + fuel = rand(1600, 2000) -/obj/item/flashlight/flare/process() +/obj/item/flashlight/flare/process(delta_time) open_flame(heat) - fuel = max(fuel - 1, 0) - if(!fuel || !on) + fuel = max(fuel -= delta_time, 0) + if(fuel <= 0 || !on) turn_off() if(!fuel) icon_state = "[initial(icon_state)]-empty" @@ -305,7 +306,7 @@ /obj/item/flashlight/flare/attack_self(mob/user) // Usual checks - if(!fuel) + if(fuel <= 0) to_chat(user, "[src] is out of fuel!") return if(on) @@ -372,7 +373,9 @@ /obj/item/flashlight/emp var/emp_max_charges = 4 var/emp_cur_charges = 4 - var/charge_tick = 0 + var/charge_timer = 0 + /// How many seconds between each recharge + var/charge_delay = 20 /obj/item/flashlight/emp/New() ..() @@ -382,11 +385,11 @@ STOP_PROCESSING(SSobj, src) . = ..() -/obj/item/flashlight/emp/process() - charge_tick++ - if(charge_tick < 10) +/obj/item/flashlight/emp/process(delta_time) + charge_timer += delta_time + if(charge_timer < charge_delay) return FALSE - charge_tick = 0 + charge_timer -= charge_delay emp_cur_charges = min(emp_cur_charges+1, emp_max_charges) return TRUE @@ -433,10 +436,11 @@ icon_state = "glowstick" item_state = "glowstick" grind_results = list(/datum/reagent/phenol = 15, /datum/reagent/hydrogen = 10, /datum/reagent/oxygen = 5) //Meth-in-a-stick - var/fuel = 0 + var/burn_pickup = FALSE //If true, fuel will only decrease after being picked up or used in hand (Useful for mapping) + var/fuel = 0 // How many seconds of fuel we have left /obj/item/flashlight/glowstick/Initialize() - fuel = rand(1600, 2000) + fuel = rand(3200, 4000) light_color = color . = ..() @@ -444,9 +448,9 @@ STOP_PROCESSING(SSobj, src) . = ..() -/obj/item/flashlight/glowstick/process() - fuel = max(fuel - 1, 0) - if(!fuel) +/obj/item/flashlight/glowstick/process(delta_time) + fuel = max(fuel - delta_time, 0) + if(fuel <= 0) turn_off() STOP_PROCESSING(SSobj, src) update_icon() @@ -458,7 +462,7 @@ /obj/item/flashlight/glowstick/update_icon() item_state = "glowstick" cut_overlays() - if(!fuel) + if(fuel <= 0) icon_state = "glowstick-empty" cut_overlays() set_light(0) @@ -472,8 +476,14 @@ icon_state = "glowstick" cut_overlays() +/obj/item/flashlight/glowstick/pickup(mob/user) + . = ..() + if(burn_pickup && on) + burn_pickup = FALSE + START_PROCESSING(SSobj, src) + /obj/item/flashlight/glowstick/attack_self(mob/user) - if(!fuel) + if(fuel <= 0) to_chat(user, "[src] is spent.") return if(on) @@ -484,6 +494,7 @@ if(.) user.visible_message("[user] cracks and shakes [src].", "You crack and shake [src], turning it on!") START_PROCESSING(SSobj, src) + burn_pickup = FALSE /obj/item/flashlight/glowstick/suicide_act(mob/living/carbon/human/user) if(!fuel) @@ -530,6 +541,22 @@ loot = typesof(/obj/item/flashlight/glowstick) . = ..() +/obj/effect/spawner/lootdrop/glowstick/lit/Initialize() + . = ..() + var/obj/item/flashlight/glowstick/found = locate() in get_turf(src) + if(!found) + return + found.on = TRUE + found.icon_state = "[initial(found.icon_state)]-on" + if(found.flashlight_power) + found.set_light(l_range = found.brightness_on, l_power = found.flashlight_power) + else + found.set_light(found.brightness_on) + for(var/X in found.actions) + var/datum/action/A = X + A.UpdateButtonIcon() + found.burn_pickup = TRUE + /obj/item/flashlight/spotlight //invisible lighting source name = "disco light" desc = "Groovy..." diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index a35d26437e521..cc160a1cae786 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -64,11 +64,11 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/forcefield_projector/process() +/obj/item/forcefield_projector/process(delta_time) if(!LAZYLEN(current_fields)) - shield_integrity = min(shield_integrity + 4, max_shield_integrity) + shield_integrity = min(shield_integrity + delta_time * 2, max_shield_integrity) else - shield_integrity = max(shield_integrity - LAZYLEN(current_fields), 0) //fields degrade slowly over time + shield_integrity = max(shield_integrity - LAZYLEN(current_fields) * delta_time * 0.5, 0) //fields degrade slowly over time for(var/obj/structure/projected_forcefield/F in current_fields) if(shield_integrity <= 0 || get_dist(F,src) > field_distance_limit) qdel(F) @@ -84,7 +84,7 @@ mouse_opacity = MOUSE_OPACITY_OPAQUE resistance_flags = INDESTRUCTIBLE CanAtmosPass = ATMOS_PASS_DENSITY - armor = list("melee" = 0, "bullet" = 25, "laser" = 50, "energy" = 50, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 0, "bullet" = 25, "laser" = 50, "energy" = 50, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 0) var/obj/item/forcefield_projector/generator /obj/structure/projected_forcefield/Initialize(mapload, obj/item/forcefield_projector/origin) diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index fb5db099a58ea..3931c8fcc3c93 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -4,10 +4,6 @@ #define RAD_LEVEL_VERY_HIGH 800 #define RAD_LEVEL_CRITICAL 1500 -#define RAD_MEASURE_SMOOTHING 5 - -#define RAD_GRACE_PERIOD 2 - /obj/item/geiger_counter //DISCLAIMER: I know nothing about how real-life Geiger counters work. This will not be realistic. ~Xhuis name = "\improper Geiger counter" desc = "A handheld device used for detecting and measuring radiation pulses." @@ -20,7 +16,7 @@ slot_flags = ITEM_SLOT_BELT materials = list(/datum/material/iron = 150, /datum/material/glass = 150) - var/grace = RAD_GRACE_PERIOD + var/grace = RAD_GEIGER_GRACE_PERIOD var/datum/looping_sound/geiger/soundloop var/scanning = FALSE @@ -37,31 +33,28 @@ soundloop = new(list(src), FALSE) /obj/item/geiger_counter/Destroy() + QDEL_NULL(soundloop) STOP_PROCESSING(SSobj, src) return ..() -/obj/item/geiger_counter/process() - update_icon() - update_sound() - - if(!scanning) - current_tick_amount = 0 - return - - radiation_count -= radiation_count/RAD_MEASURE_SMOOTHING - radiation_count += current_tick_amount/RAD_MEASURE_SMOOTHING +/obj/item/geiger_counter/process(delta_time) + if(scanning) + radiation_count = LPFILTER(radiation_count, current_tick_amount, delta_time, RAD_GEIGER_RC) - if(current_tick_amount) - grace = RAD_GRACE_PERIOD - last_tick_amount = current_tick_amount + if(current_tick_amount) + grace = RAD_GEIGER_GRACE_PERIOD + last_tick_amount = current_tick_amount - else if(!(obj_flags & EMAGGED)) - grace-- - if(grace <= 0) - radiation_count = 0 + else if(!(obj_flags & EMAGGED)) + grace -= delta_time + if(grace <= 0) + radiation_count = 0 current_tick_amount = 0 + update_icon() + update_sound() + /obj/item/geiger_counter/examine(mob/user) . = ..() if(!scanning) @@ -221,6 +214,8 @@ listeningTo = user /obj/item/geiger_counter/cyborg/proc/redirect_rad_act(datum/source, amount) + SIGNAL_HANDLER + rad_act(amount) /obj/item/geiger_counter/cyborg/dropped() diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 77d0f82baa101..fad6e4129cc8d 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -26,6 +26,10 @@ gpstag = "MINE0" desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life." +/obj/item/gps/mining/exploration + gpstag = "EXP0" + desc = "A positioning system used for long-ranged tracking of important beacons." + /obj/item/gps/cyborg icon_state = "gps-b" gpstag = "BORG0" @@ -59,7 +63,7 @@ // I assume it's faster to color,tag and OR the turf in, rather // then checking if its there T.color = RANDOM_COLOUR - T.maptext = "[T.x],[T.y],[T.z]" + T.maptext = MAPTEXT("[T.x],[T.y],[T.get_virtual_z_level()]") tagged |= T /obj/item/gps/visible_debug/proc/clear() diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm deleted file mode 100644 index c5004e31d3295..0000000000000 --- a/code/game/objects/items/devices/instruments.dm +++ /dev/null @@ -1,275 +0,0 @@ -//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 - 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" - block_upgrade_walk = 1 - -/obj/item/instrument/Initialize() - . = ..() - song = new(instrumentId, src, instrumentExt) - -/obj/item/instrument/Destroy() - QDEL_NULL(song) - . = ..() - -/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/Initialize(mapload) - . = ..() - if(mapload) - song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded - -/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/interact(mob/user) - ui_interact(user) - -/obj/item/instrument/ui_interact(mob/living/user) - if(!isliving(user) || user.stat || user.restrained() || !(user.mobility_flags & MOBILITY_STAND)) - return - - user.set_machine(src) - song.interact(user) - -/obj/item/instrument/violin - name = "space violin" - desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" - icon_state = "violin" - item_state = "violin" - hitsound = "swing_hit" - instrumentId = "violin" - -/obj/item/instrument/violin/golden - name = "golden violin" - desc = "A golden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" - icon_state = "golden_violin" - item_state = "golden_violin" - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - -/obj/item/instrument/piano_synth - name = "synthesizer" - 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) - -/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 sortList(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/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" - -/obj/item/instrument/eguitar - name = "electric guitar" - desc = "Makes all your shredding needs possible." - icon_state = "eguitar" - item_state = "eguitar" - force = 12 - attack_verb = list("played metal on", "shredded", "crashed", "smashed") - hitsound = 'sound/weapons/stringsmash.ogg' - instrumentId = "eguitar" - instrumentExt = "ogg" - -/obj/item/instrument/glockenspiel - name = "glockenspiel" - desc = "Smooth metal bars perfect for any marching band." - icon_state = "glockenspiel" - item_state = "glockenspiel" - instrumentId = "glockenspiel" - -/obj/item/instrument/accordion - name = "accordion" - desc = "Pun-Pun not included." - icon_state = "accordion" - item_state = "accordion" - instrumentId = "accordion" - -/obj/item/instrument/trumpet - name = "trumpet" - desc = "To announce the arrival of the king!" - icon_state = "trumpet" - item_state = "trombone" - instrumentId = "trombone" - -/obj/item/instrument/trumpet/spectral - name = "spectral trumpet" - desc = "Things are about to get spooky!" - 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() - . = ..() - AddComponent(/datum/component/spooky) - -/obj/item/instrument/trumpet/spectral/attack(mob/living/carbon/C, mob/user) - playsound (loc, 'sound/instruments/trombone/En4.mid', 100,1,-1) - ..() - -/obj/item/instrument/saxophone - name = "saxophone" - desc = "This soothing sound will be sure to leave your audience in tears." - icon_state = "saxophone" - item_state = "saxophone" - instrumentId = "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") - -/obj/item/instrument/saxophone/spectral/Initialize() - . = ..() - 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) - ..() - -/obj/item/instrument/trombone - name = "trombone" - desc = "How can any pool table ever hope to compete?" - icon_state = "trombone" - item_state = "trombone" - instrumentId = "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 - attack_verb = list("played","jazzed","tromboned","mourned","dooted","spooked") - -/obj/item/instrument/trombone/spectral/Initialize() - . = ..() - AddComponent(/datum/component/spooky) - -/obj/item/instrument/trombone/spectral/attack(mob/living/carbon/C, mob/user) - playsound (loc, 'sound/instruments/trombone/Cn4.mid', 100,1,-1) - ..() - -/obj/item/instrument/recorder - name = "recorder" - desc = "Just like in school, playing ability and all." - force = 5 - icon_state = "recorder" - item_state = "recorder" - instrumentId = "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" - slot_flags = ITEM_SLOT_MASK - force = 5 - w_class = WEIGHT_CLASS_SMALL - actions_types = list(/datum/action/item_action/instrument) - -/obj/item/instrument/harmonica/proc/handle_speech(datum/source, list/speech_args) - if(song.playing && ismob(loc)) - to_chat(loc, "You stop playing the harmonica to talk...") - song.playing = FALSE - -/obj/item/instrument/harmonica/equipped(mob/M, slot) - . = ..() - RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) - -/obj/item/instrument/harmonica/dropped(mob/M) - . = ..() - UnregisterSignal(M, COMSIG_MOB_SAY) - -/obj/item/instrument/bikehorn - name = "gilded bike horn" - desc = "An exquisitely decorated bike horn, capable of honking in a variety of notes." - icon_state = "bike_horn" - item_state = "bike_horn" - 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" - w_class = WEIGHT_CLASS_TINY - force = 0 - throw_speed = 3 - throw_range = 15 - hitsound = 'sound/items/bikehorn.ogg' - -/// - -/obj/item/choice_beacon/music - name = "instrument delivery beacon" - desc = "Summon your tool of art." - icon_state = "gangtool-red" - -/obj/item/choice_beacon/music/generate_display_names() - var/static/list/instruments - if(!instruments) - instruments = list() - var/list/templist = list(/obj/item/instrument/violin, - /obj/item/instrument/piano_synth, - /obj/item/instrument/banjo, - /obj/item/instrument/guitar, - /obj/item/instrument/eguitar, - /obj/item/instrument/glockenspiel, - /obj/item/instrument/accordion, - /obj/item/instrument/trumpet, - /obj/item/instrument/saxophone, - /obj/item/instrument/trombone, - /obj/item/instrument/recorder, - /obj/item/instrument/harmonica - ) - for(var/V in templist) - var/atom/A = V - instruments[initial(A.name)] = A - return instruments diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 16b6c27a1e932..5341d39d9faad 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -60,9 +60,9 @@ . = ..() if(in_range(user, src) || isobserver(user)) if(!diode) - . += "The diode is missing." + . += "The diode is missing." else - . += "A class [diode.rating] laser diode is installed. It is screwed in place." + . += "A class [diode.rating] laser diode is installed. It is screwed in place." /obj/item/laser_pointer/afterattack(atom/target, mob/living/user, flag, params) . = ..() @@ -137,29 +137,30 @@ else outmsg = "You miss the lens of [C] with [src]!" - //catpeople - for(var/mob/living/carbon/human/H in view(1,targloc)) - if(!iscatperson(H) || H.incapacitated() || H.eye_blind ) - continue - if(user.mobility_flags & MOBILITY_STAND) - H.setDir(get_dir(H,targloc)) // kitty always looks at the light - if(prob(effectchance)) - H.visible_message("[H] makes a grab for the light!","LIGHT!") - H.Move(targloc) - log_combat(user, H, "moved with a laser pointer",src) + // For luring whatever mobs that are "interested" in laser pointers + for(var/mob/M as() in viewers(1,targloc)) + if(M.incapacitated()) + return + var/mob/living/carbon/human/H = M + if(iscatperson(H) && !H.eye_blind) //catpeople! + if(user.mobility_flags & MOBILITY_STAND) + H.setDir(get_dir(H,targloc)) // kitty always looks at the light + if(prob(effectchance)) + H.visible_message("[H] makes a grab for the light!","LIGHT!") + H.Move(targloc) + log_combat(user, H, "moved with a laser pointer",src) + else + H.visible_message("[H] looks briefly distracted by the light."," You're briefly tempted by the shiny light... ") else - H.visible_message("[H] looks briefly distracted by the light."," You're briefly tempted by the shiny light... ") - else - 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)) - if(prob(50)) - C.visible_message("[C] pounces on the light!","LIGHT!") - C.Move(targloc) - C.set_resting(TRUE, FALSE) - else - C.visible_message("[C] looks uninterested in your games.","You spot [user] shining [src] at you. How insulting!") + M.visible_message("[M] stares at the light"," You stare at the light... ") + else if(iscat(M)) //cats! + var/mob/living/simple_animal/pet/cat/C = M + if(prob(50)) + C.visible_message("[C] pounces on the light!","LIGHT!") + C.Move(targloc) + C.set_resting(TRUE, FALSE) + else + C.visible_message("[C] looks uninterested in your games.","You spot [user] shining [src] at you. How insulting!") //laser pointer image icon_state = "pointer_[pointer_icon_state]" @@ -191,8 +192,11 @@ flick_overlay_view(I, targloc, 10) icon_state = "pointer" -/obj/item/laser_pointer/process() - if(prob(20 - recharge_locked*5)) +/obj/item/laser_pointer/process(delta_time) + if(!diode) + recharging = FALSE + return PROCESS_KILL + if(DT_PROB(10 + diode.rating*10 - recharge_locked*1, delta_time)) //t1 is 20, 2 40 energy += 1 if(energy >= max_energy) energy = max_energy diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 542fec537409f..61d55f3a3529c 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -59,7 +59,6 @@ var/increment = 5 // How much to take from the glass? var/decrement = 1 - var/charge = 1 // Eating used bulbs gives us bulb shards var/bulb_shards = 0 @@ -179,10 +178,7 @@ return new_bulbs /obj/item/lightreplacer/proc/Charge(var/mob/user) - charge += 1 - if(charge > 3) - AddUses(1) - charge = 1 + AddUses(1) /obj/item/lightreplacer/proc/ReplaceLight(obj/machinery/light/target, mob/living/U) diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 93516b4eae5be..651773b0fcd1e 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -9,7 +9,7 @@ w_class = WEIGHT_CLASS_SMALL siemens_coefficient = 1 var/spamcheck = 0 - var/list/voicespan = list(SPAN_COMMAND) + var/list/voicespan = list(SPAN_MEGAPHONE) /obj/item/megaphone/suicide_act(mob/living/carbon/user) user.visible_message("[user] is uttering [user.p_their()] last words into \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -19,7 +19,7 @@ /obj/item/megaphone/equipped(mob/M, slot) . = ..() - if (slot == SLOT_HANDS) + if (slot == ITEM_SLOT_HANDS) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else UnregisterSignal(M, COMSIG_MOB_SAY) @@ -29,6 +29,8 @@ UnregisterSignal(M, COMSIG_MOB_SAY) /obj/item/megaphone/proc/handle_speech(mob/living/carbon/user, list/speech_args) + SIGNAL_HANDLER + if (user.get_active_held_item() == src) if(spamcheck > world.time) to_chat(user, "\The [src] needs to recharge!") diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 29800dbf029d7..613730dc07def 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -30,79 +30,24 @@ usesound = 'sound/weapons/empty.ogg' var/mode = 0 +/obj/item/multitool/Initialize() + RegisterSignal(src, COMSIG_PARENT_EXAMINE, .proc/on_examine) + return ..() + +/obj/item/multitool/Destroy() + UnregisterSignal(src, COMSIG_PARENT_EXAMINE) + return ..() + /obj/item/multitool/suicide_act(mob/living/carbon/user) user.visible_message("[user] puts the [src] to [user.p_their()] chest. It looks like [user.p_theyre()] trying to pulse [user.p_their()] heart off!") - return OXYLOSS//theres a reason it wasnt recommended by doctors - + return OXYLOSS//theres a reason it wasn't recommended by doctors -// circuit shit begin -/obj/item/multitool/var/datum/integrated_io/selected_io = null //functional for integrated circuits. +/obj/item/multitool/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER -//I know copypasting it and overwriting the old procs is a pretty rough thing to do, but hey, it's the simplest and most effective -/obj/item/multitool/examine(mob/user) - . = ..() - if(selected_io) - . += "Activate [src] to detach the data wire." if(buffer) - . += "Its buffer contains [buffer]." - -/obj/item/multitool/attack_self(mob/user) - if(selected_io) - selected_io = null - to_chat(user, "You clear the wired connection from the multitool.") - update_icon() - -/obj/item/multitool/update_icon() - if(selected_io) - icon_state = "multitool_red" - else - icon_state = "multitool" - -/obj/item/multitool/proc/wire(var/datum/integrated_io/io, mob/user) - if(!io.holder.assembly) - to_chat(user, "\The [io.holder] needs to be secured inside an assembly first.") - return - - if(selected_io) - if(io == selected_io) - to_chat(user, "Wiring \the [selected_io.holder]'s [selected_io.name] into itself is rather pointless.") - return - if(io.io_type != selected_io.io_type) - to_chat(user, "Those two types of channels are incompatible. The first is a [selected_io.io_type], \ - while the second is a [io.io_type].") - return - if(io.holder.assembly && io.holder.assembly != selected_io.holder.assembly) - to_chat(user, "Both \the [io.holder] and \the [selected_io.holder] need to be inside the same assembly.") - return - io.connect_pin(selected_io) - - to_chat(user, "You connect \the [selected_io.holder]'s [selected_io.name] to \the [io.holder]'s [io.name].") - selected_io.holder.interact(user) // This is to update the UI. - selected_io = null - - else - selected_io = io - to_chat(user, "You link \the multitool to \the [selected_io.holder]'s [selected_io.name] data channel.") - - update_icon() - - -/obj/item/multitool/proc/unwire(var/datum/integrated_io/io1, var/datum/integrated_io/io2, mob/user) - if(!io1.linked.len || !io2.linked.len) - to_chat(user, "There is nothing connected to the data channel.") - return - - if(!(io1 in io2.linked) || !(io2 in io1.linked) ) - to_chat(user, "These data pins aren't connected!") - return - else - io1.disconnect_pin(io2) - to_chat(user, "You clip the data connection between the [io1.holder.displayed_name]'s \ - [io1.name] and the [io2.holder.displayed_name]'s [io2.name].") - io1.holder.interact(user) // This is to update the UI. - update_icon() + examine_list += "Its buffer contains [buffer]." -// circuit shit end // Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby. /obj/item/multitool/ai_detect var/track_cooldown = 0 @@ -112,13 +57,13 @@ var/rangewarning = 20 //Glows yellow when inside var/hud_type = DATA_HUD_AI_DETECT var/hud_on = FALSE - var/mob/camera/aiEye/remote/ai_detector/eye + var/mob/camera/ai_eye/remote/ai_detector/eye var/datum/action/item_action/toggle_multitool/toggle_action /obj/item/multitool/ai_detect/Initialize() . = ..() START_PROCESSING(SSobj, src) - eye = new /mob/camera/aiEye/remote/ai_detector() + eye = new /mob/camera/ai_eye/remote/ai_detector() toggle_action = new /datum/action/item_action/toggle_multitool(src) /obj/item/multitool/ai_detect/Destroy() @@ -163,7 +108,7 @@ /obj/item/multitool/ai_detect/proc/show_hud(mob/user) if(user && hud_type) - var/obj/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"] + var/atom/movable/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"] PM.alpha = 150 var/datum/atom_hud/H = GLOB.huds[hud_type] if(!H.hudusers[user]) @@ -173,7 +118,7 @@ /obj/item/multitool/ai_detect/proc/remove_hud(mob/user) if(user && hud_type) - var/obj/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"] + var/atom/movable/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"] PM.alpha = 255 var/datum/atom_hud/H = GLOB.huds[hud_type] H.remove_hud_from(user) @@ -192,7 +137,7 @@ return var/datum/camerachunk/chunk = GLOB.cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z) if(chunk && chunk.seenby.len) - for(var/mob/camera/aiEye/A in chunk.seenby) + for(var/mob/camera/ai_eye/A in chunk.seenby) if(!A.ai_detector_visible) continue var/turf/detect_turf = get_turf(A) @@ -203,7 +148,7 @@ detect_state = PROXIMITY_NEAR break -/mob/camera/aiEye/remote/ai_detector +/mob/camera/ai_eye/remote/ai_detector name = "AI detector eye" ai_detector_visible = FALSE use_static = USE_STATIC_TRANSPARENT diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index ff46b109ab7c4..39c1a9c4d4cf9 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -35,7 +35,11 @@ if(!pai.master_dna || !pai.master) dat += "Imprint Master DNA
      " dat += "Installed Personality: [pai.name]
      " - dat += "Prime directive:
      [pai.laws.zeroth]
      " + dat += "Prime directive:
      " + if(pai.laws.zeroth) + dat +="[pai.laws.zeroth]
      " + else + dat +="None
      " for(var/slaws in pai.laws.supplied) dat += "Additional directives:
      [slaws]
      " dat += "Configure Directives
      " @@ -52,6 +56,7 @@ var/mob/living/carbon/human/H = user if(H.real_name == pai.master || H.dna.unique_enzymes == pai.master_dna) dat += "\[[pai.canholo? "Disable" : "Enable"] holomatrix projectors\]
      " + dat += "\[Remove Prime directive\]
      " dat += "\[Wipe current pAI personality\]
      " else dat += "No personality installed.
      " @@ -82,6 +87,7 @@ pai.master = M.real_name pai.master_dna = M.dna.unique_enzymes to_chat(pai, "You have been bound to a new master.") + pai.laws.set_zeroth_law("Serve your master.") pai.emittersemicd = FALSE if(href_list["wipe"]) var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No") @@ -92,6 +98,10 @@ to_chat(pai, "Your mental faculties leave you.") to_chat(pai, "oblivion... ") qdel(pai) + if(href_list["clear_zero"]) + if((input("Are you CERTAIN you wish to remove this pAI's Prime directive? This action cannot be undone.", "Clear Directive") in list("Yes", "No")) == "Yes") + if(pai) + pai.laws.clear_zeroth_law() if(href_list["toggle_transmit"] || href_list["toggle_receive"]) var/transmitting = href_list["toggle_transmit"] //it can't be both so if we know it's not transmitting it must be receiving. var/transmit_holder = (transmitting ? WIRE_TX : WIRE_RX) @@ -166,4 +176,3 @@ return if(pai && !pai.holoform) pai.emp_act(severity) - diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index e897137dedc2d..3b73a5bbe7f0a 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -82,7 +82,7 @@ /obj/item/encryptionkey/heads/captain name = "\proper the captain's encryption key" icon_state = "cap_cypherkey" - channels = list(RADIO_CHANNEL_COMMAND = 1, RADIO_CHANNEL_SECURITY = 1, RADIO_CHANNEL_ENGINEERING = 0, RADIO_CHANNEL_SCIENCE = 0, RADIO_CHANNEL_MEDICAL = 0, RADIO_CHANNEL_SUPPLY = 0, RADIO_CHANNEL_SERVICE = 0) + channels = list(RADIO_CHANNEL_COMMAND = 1, RADIO_CHANNEL_SECURITY = 1, RADIO_CHANNEL_ENGINEERING = 0, RADIO_CHANNEL_SCIENCE = 0, RADIO_CHANNEL_MEDICAL = 0, RADIO_CHANNEL_SUPPLY = 0, RADIO_CHANNEL_SERVICE = 0, RADIO_CHANNEL_EXPLORATION = 0) /obj/item/encryptionkey/heads/rd name = "\proper the research director's encryption key" @@ -119,11 +119,26 @@ icon_state = "cargo_cypherkey" channels = list(RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SCIENCE = 1) +/obj/item/encryptionkey/headset_exp + name = "exploration encryption key" + icon_state = "exp_cypherkey" + channels = list(RADIO_CHANNEL_EXPLORATION = 1) + +/obj/item/encryptionkey/headset_expteam + name = "exploration team encryption key" + icon_state = "expteam_cypherkey" + channels = list(RADIO_CHANNEL_EXPLORATION = 1, RADIO_CHANNEL_SCIENCE = 1) + /obj/item/encryptionkey/headset_service name = "service radio encryption key" icon_state = "srv_cypherkey" channels = list(RADIO_CHANNEL_SERVICE = 1) +/obj/item/encryptionkey/headset_curator + name = "curator radio encryption key" + icon_state = "srv_cypherkey" + channels = list(RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_EXPLORATION = 1) + /obj/item/encryptionkey/headset_cent name = "\improper CentCom radio encryption key" icon_state = "cent_cypherkey" @@ -131,7 +146,7 @@ channels = list(RADIO_CHANNEL_CENTCOM = 1) /obj/item/encryptionkey/ai //ported from NT, this goes 'inside' the AI. - channels = list(RADIO_CHANNEL_COMMAND = 1, RADIO_CHANNEL_SECURITY = 1, RADIO_CHANNEL_ENGINEERING = 1, RADIO_CHANNEL_SCIENCE = 1, RADIO_CHANNEL_MEDICAL = 1, RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_AI_PRIVATE = 1) + channels = list(RADIO_CHANNEL_COMMAND = 1, RADIO_CHANNEL_SECURITY = 1, RADIO_CHANNEL_ENGINEERING = 1, RADIO_CHANNEL_SCIENCE = 1, RADIO_CHANNEL_MEDICAL = 1, RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_EXPLORATION = 1, RADIO_CHANNEL_AI_PRIVATE = 1) /obj/item/encryptionkey/secbot channels = list(RADIO_CHANNEL_AI_PRIVATE = 1, RADIO_CHANNEL_SECURITY = 1) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 08503c3352d81..aacfa105fd8ef 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -9,6 +9,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( RADIO_CHANNEL_CENTCOM = RADIO_TOKEN_CENTCOM, RADIO_CHANNEL_SYNDICATE = RADIO_TOKEN_SYNDICATE, RADIO_CHANNEL_SUPPLY = RADIO_TOKEN_SUPPLY, + RADIO_CHANNEL_EXPLORATION = RADIO_TOKEN_EXPLORATION, RADIO_CHANNEL_SERVICE = RADIO_TOKEN_SERVICE, MODE_BINARY = MODE_TOKEN_BINARY, RADIO_CHANNEL_AI_PRIVATE = RADIO_TOKEN_AI_PRIVATE @@ -21,6 +22,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( item_state = "headset" materials = list(/datum/material/iron=75) subspace_transmission = TRUE + headset = TRUE canhear_range = 0 // can't hear headsets from very far away var/bang_protect = 0 //this isn't technically clothing so it needs its own bang_protect var @@ -61,7 +63,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( QDEL_NULL(keyslot2) return ..() -/obj/item/radio/headset/talk_into(mob/living/M, message, channel, list/spans,datum/language/language) +/obj/item/radio/headset/talk_into(mob/living/M, message, channel, list/spans, datum/language/language, list/message_mods) if (!listening) return ITALICS | REDUCE_RANGE return ..() @@ -219,10 +221,22 @@ GLOBAL_LIST_INIT(channel_tokens, list( /obj/item/radio/headset/headset_cargo name = "supply radio headset" - desc = "A headset used by the QM and his slaves." + desc = "A headset used by the QM's slaves." icon_state = "cargo_headset" keyslot = new /obj/item/encryptionkey/headset_cargo +/obj/item/radio/headset/headset_quartermaster + name = "quartermaster radio headset" + desc = "A headset used by the QM." + icon_state = "cargo_headset" + keyslot = new /obj/item/encryptionkey/headset_cargo + +/obj/item/radio/headset/headset_exploration + name = "exploration radio headset" + desc = "A headset used by exploration teams." + icon_state = "exploration_headset" + keyslot = new /obj/item/encryptionkey/headset_expteam + /obj/item/radio/headset/headset_cargo/mining name = "mining radio headset" desc = "Headset used by shaft miners." @@ -235,6 +249,12 @@ GLOBAL_LIST_INIT(channel_tokens, list( icon_state = "srv_headset" keyslot = new /obj/item/encryptionkey/headset_service +/obj/item/radio/headset/headset_curator + name = "curator radio headset" + desc = "Headset used by the curator, which allows for communication with the exploration team." + icon_state = "srv_headset" + keyslot = new /obj/item/encryptionkey/headset_curator + /obj/item/radio/headset/headset_cent name = "\improper CentCom headset" desc = "A headset used by the upper echelons of Nanotrasen." @@ -287,6 +307,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( keyslot2 = null recalculateChannels() + ui_update() to_chat(user, "You pop out the encryption keys in the headset.") else @@ -309,6 +330,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( recalculateChannels() + ui_update() else return ..() diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 341ee5c86fb2b..49c7c9cdd4535 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -7,6 +7,7 @@ canhear_range = 2 dog_fashion = null unscrewed = FALSE + layer = ABOVE_WINDOW_LAYER /obj/item/radio/intercom/unscrewed unscrewed = TRUE @@ -58,6 +59,9 @@ /obj/item/radio/intercom/attack_ai(mob/user) interact(user) +/obj/item/radio/intercom/attack_paw(mob/user) + return attack_hand(user) + /obj/item/radio/intercom/attack_hand(mob/user) . = ..() if(.) @@ -69,7 +73,10 @@ ui_interact(user) /obj/item/radio/intercom/ui_state(mob/user) - return GLOB.default_state + if(issilicon(user)) // Silicons can't use physical state remotely + return GLOB.default_state + + return GLOB.physical_state // But monkeys can't use default state, and they can already use hotkeys /obj/item/radio/intercom/can_receive(freq, level) if(!on) @@ -78,7 +85,7 @@ return FALSE if(!(0 in level)) var/turf/position = get_turf(src) - if(isnull(position) || !(position.z in level)) + if(isnull(position) || !(position.get_virtual_z_level() in level)) return FALSE if(!listening) return FALSE @@ -89,8 +96,8 @@ return TRUE -/obj/item/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode) - if(message_mode == MODE_INTERCOM) +/obj/item/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, list/message_mods = list()) + if(message_mods[RADIO_EXTENSION] == MODE_INTERCOM) return // Avoid hearing the same thing twice return ..() @@ -112,11 +119,13 @@ /** * Proc called whenever the intercom's area loses or gains power. Responsible for setting the `on` variable and calling `update_icon()`. * - * Normally called after the intercom's area recieves the `COMSIG_AREA_POWER_CHANGE` signal, but it can also be called directly. + * Normally called after the intercom's area receives the `COMSIG_AREA_POWER_CHANGE` signal, but it can also be called directly. * Arguments: * * source - the area that just had a power change. */ /obj/item/radio/intercom/proc/AreaPowerCheck(datum/source) + SIGNAL_HANDLER + var/area/current_area = get_area(src) if(!current_area) on = FALSE @@ -136,3 +145,9 @@ pixel_shift = 29 inverse = TRUE materials = list(/datum/material/iron = 75, /datum/material/glass = 25) + +/obj/item/radio/intercom/chapel + name = "Confessional intercom" + anonymize = TRUE + frequency = 1481 + broadcasting = TRUE diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 71a8ca6596915..acaf3c7e715cd 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -8,7 +8,7 @@ desc = "A basic handheld radio that communicates with local telecommunication networks." dog_fashion = /datum/dog_fashion/back - flags_1 = CONDUCT_1 | HEAR_1 + flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT throw_speed = 3 throw_range = 7 @@ -20,6 +20,7 @@ var/frequency = FREQ_COMMON var/canhear_range = 3 // The range around the radio in which mobs can hear what it receives. var/emped = 0 // Tracks the number of EMPs currently stacked. + var/headset = FALSE var/broadcasting = FALSE // Whether the radio will transmit dialogue it hears nearby. var/listening = TRUE // Whether the radio is currently receiving. @@ -32,6 +33,9 @@ var/use_command = FALSE // If true, broadcasts will be large and BOLD. var/command = FALSE // If true, use_command can be toggled at will. + ///makes anyone who is talking through this anonymous. + var/anonymize = FALSE + // Encryption key handling var/obj/item/encryptionkey/keyslot var/translate_binary = FALSE // If true, can hear the special binary channel. @@ -39,6 +43,7 @@ var/syndie = FALSE // If true, hears all well-known channels automatically, and can say/hear on the Syndicate channel. var/list/channels = list() // Map from name (see communications.dm) to on/off. First entry is current department (:h). var/list/secure_radio_connections + var/radio_silent = FALSE // If true, radio doesn't make sound effects (ie for Syndicate internal radio implants) /obj/item/radio/suicide_act(mob/living/user) user.visible_message("[user] starts bouncing [src] off [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!") @@ -75,6 +80,7 @@ keyslot = new /obj/item/encryptionkey/syndicate syndie = 1 recalculateChannels() + ui_update() /obj/item/radio/Destroy() remove_radio_all(src) //Just to be sure @@ -94,10 +100,28 @@ for(var/ch_name in channels) secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name]) + become_hearing_sensitive(ROUNDSTART_TRAIT) + /obj/item/radio/ComponentInitialize() . = ..() AddComponent(/datum/component/empprotection, EMP_PROTECT_WIRES) +/obj/item/radio/AltClick(mob/user) + if(headset) + . = ..() + else if(user.canUseTopic(src, !issilicon(user), TRUE, FALSE)) + broadcasting = !broadcasting + to_chat(user, "You toggle broadcasting [broadcasting ? "on" : "off"].") + ui_update() + +/obj/item/radio/CtrlShiftClick(mob/user) + if(headset) + . = ..() + else if(user.canUseTopic(src, !issilicon(user), TRUE, FALSE)) + listening = !listening + to_chat(user, "You toggle speaker [listening ? "on" : "off"].") + ui_update() + /obj/item/radio/interact(mob/user) if(unscrewed && !isAI(user)) wires.interact(user) @@ -105,7 +129,6 @@ else ..() - /obj/item/radio/ui_state(mob/user) return GLOB.inventory_state @@ -189,15 +212,15 @@ recalculateChannels() . = TRUE -/obj/item/radio/talk_into(atom/movable/M, message, channel, list/spans, datum/language/language) +/obj/item/radio/talk_into(atom/movable/M, message, channel, list/spans, datum/language/language, list/message_mods) if(!spans) spans = list(M.speech_span) if(!language) language = M.get_selected_language() - INVOKE_ASYNC(src, .proc/talk_into_impl, M, message, channel, spans.Copy(), language) + INVOKE_ASYNC(src, .proc/talk_into_impl, M, message, channel, spans.Copy(), language, message_mods) return ITALICS | REDUCE_RANGE -/obj/item/radio/proc/talk_into_impl(atom/movable/M, message, channel, list/spans, datum/language/language) +/obj/item/radio/proc/talk_into_impl(atom/movable/M, message, channel, list/spans, datum/language/language, list/message_mods) if(!on) return // the device has to be on if(!M || !message) @@ -207,6 +230,13 @@ if(!M.IsVocal()) return + if(!radio_silent)//Radios make small static noises now + var/mob/sender = loc + if(istype(sender) && sender.hears_radio()) + var/sound/radio_sound = sound(pick("sound/effects/radio1.ogg", "sound/effects/radio2.ogg"), volume = 50) + radio_sound.frequency = get_rand_frequency() + SEND_SOUND(sender, radio_sound) + if(use_command) spans |= SPAN_COMMAND @@ -233,17 +263,14 @@ channel = null // Nearby active jammers prevent the message from transmitting - var/turf/position = get_turf(src) - for(var/obj/item/jammer/jammer in GLOB.active_jammers) - var/turf/jammer_turf = get_turf(jammer) - if(position.z == jammer_turf.z && (get_dist(position, jammer_turf) <= jammer.range)) - return + if(is_jammed()) + return // Determine the identity information which will be attached to the signal. var/atom/movable/virtualspeaker/speaker = new(null, M, src) // Construct the signal - var/datum/signal/subspace/vocal/signal = new(src, freq, speaker, language, message, spans) + var/datum/signal/subspace/vocal/signal = new(src, freq, speaker, language, message, spans, message_mods) // Independent radios, on the CentCom frequency, reach all independent radios if (independent && (freq == FREQ_CENTCOM || freq == FREQ_CTF_RED || freq == FREQ_CTF_BLUE)) @@ -266,30 +293,27 @@ /obj/item/radio/proc/backup_transmission(datum/signal/subspace/vocal/signal) var/turf/T = get_turf(src) - if (signal.data["done"] && (T.z in signal.levels)) + if (signal.data["done"] && (T.get_virtual_z_level() in signal.levels)) return // Okay, the signal was never processed, send a mundane broadcast. signal.data["compression"] = 0 signal.transmission_method = TRANSMISSION_RADIO - signal.levels = list(T.z) + signal.levels = list(T.get_virtual_z_level()) signal.broadcast() -/obj/item/radio/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/obj/item/radio/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) . = ..() if(radio_freq || !broadcasting || get_dist(src, speaker) > canhear_range) return - if(message_mode == MODE_WHISPER || message_mode == MODE_WHISPER_CRIT) - // radios don't pick up whispers very well - raw_message = stars(raw_message) - else if(message_mode == MODE_L_HAND || message_mode == MODE_R_HAND) + if(message_mods[RADIO_EXTENSION] == MODE_L_HAND || message_mods[RADIO_EXTENSION] == MODE_R_HAND) // try to avoid being heard double if (loc == speaker && ismob(speaker)) var/mob/M = speaker var/idx = M.get_held_index_of_item(src) // left hands are odd slots - if (idx && (idx % 2) == (message_mode == MODE_L_HAND)) + if (idx && (idx % 2) == (message_mods[RADIO_EXTENSION] == MODE_L_HAND)) return talk_into(speaker, raw_message, , spans, language=message_language) @@ -305,7 +329,7 @@ return independent // hard-ignores the z-level check if (!(0 in level)) var/turf/position = get_turf(src) - if(!position || !(position.z in level)) + if(!position || !(position.get_virtual_z_level() in level)) return FALSE // allow checks: are we listening on that frequency? @@ -327,6 +351,8 @@ . += "It can be attached and modified." else . += "It cannot be modified or attached." + if (in_range(src, user) && !headset) + . += "Ctrl-Shift-click on the [name] to toggle speaker.
      Alt-click on the [name] to toggle broadcasting.
      " /obj/item/radio/attackby(obj/item/W, mob/user, params) add_fingerprint(user) @@ -398,6 +424,7 @@ keyslot = null recalculateChannels() + ui_update() to_chat(user, "You pop out the encryption key in the radio.") else @@ -414,6 +441,7 @@ keyslot = W recalculateChannels() + ui_update() /obj/item/radio/off // Station bounced radios, their only difference is spawning with the speakers off, this was made to help the lag. diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm index 282ce9a39fc1e..f3d900e4fe560 100644 --- a/code/game/objects/items/devices/reverse_bear_trap.dm +++ b/code/game/objects/items/devices/reverse_bear_trap.dm @@ -33,12 +33,12 @@ STOP_PROCESSING(SSprocessing, src) return ..() -/obj/item/reverse_bear_trap/process() +/obj/item/reverse_bear_trap/process(delta_time) if(!ticking) return - time_left-- + time_left -= delta_time soundloop2.mid_length = max(0.5, time_left - 5) //beepbeepbeepbeepbeep - if(!time_left || !isliving(loc)) + if(time_left <= 0 || !isliving(loc)) playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, FALSE) soundloop.stop() soundloop2.stop() @@ -48,7 +48,7 @@ /obj/item/reverse_bear_trap/attack_hand(mob/user) if(iscarbon(user)) var/mob/living/carbon/C = user - if(C.get_item_by_slot(SLOT_HEAD) == src) + if(C.get_item_by_slot(ITEM_SLOT_HEAD) == src) if(HAS_TRAIT_FROM(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT) && !struggling) struggling = TRUE var/fear_string @@ -82,26 +82,26 @@ ..() /obj/item/reverse_bear_trap/attack(mob/living/target, mob/living/user) - if(target.get_item_by_slot(SLOT_HEAD)) + if(target.get_item_by_slot(ITEM_SLOT_HEAD)) to_chat(user, "Remove [target.p_their()] headgear first!") return target.visible_message("[user] starts forcing [src] onto [target]'s head!", \ "[target] starts forcing [src] onto your head!", "You hear clanking.") to_chat(user, "You start forcing [src] onto [target]'s head...") - if(!do_after(user, 30, target = target) || target.get_item_by_slot(SLOT_HEAD)) + if(!do_after(user, 30, target = target) || target.get_item_by_slot(ITEM_SLOT_HEAD)) return target.visible_message("[user] forces and locks [src] onto [target]'s head!", \ "[target] locks [src] onto your head!", "You hear a click, and then a timer ticking down.") to_chat(user, "You force [src] onto [target]'s head and click the padlock shut.") user.dropItemToGround(src) - target.equip_to_slot_if_possible(src, SLOT_HEAD) + target.equip_to_slot_if_possible(src, ITEM_SLOT_HEAD) arm() notify_ghosts("[user] put a reverse bear trap on [target]!", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE, ghost_sound = 'sound/machines/beep.ogg', notify_volume = 75, header = "Reverse bear trap armed") /obj/item/reverse_bear_trap/proc/snap() reset() var/mob/living/carbon/human/H = loc - if(!istype(H) || H.get_item_by_slot(SLOT_HEAD) != src) + if(!istype(H) || H.get_item_by_slot(ITEM_SLOT_HEAD) != src) visible_message("[src]'s jaws snap open with an ear-piercing crack!") playsound(src, 'sound/effects/snap.ogg', 75, TRUE) else diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 47b1ec69ca636..8620214b31a6e 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -87,7 +87,6 @@ GENE SCANNER throw_speed = 3 throw_range = 7 materials = list(/datum/material/iron=200) - var/mode = 1 var/scanmode = 0 var/advanced = FALSE @@ -108,7 +107,7 @@ GENE SCANNER // Clumsiness/brain damage check - if ((HAS_TRAIT(user, TRAIT_CLUMSY) || HAS_TRAIT(user, TRAIT_DUMB)) && prob(50)) + if((HAS_TRAIT(user, TRAIT_CLUMSY) || HAS_TRAIT(user, TRAIT_DUMB)) && prob(50)) user.visible_message("[user] analyzes the floor's vitals!", \ "You stupidly try to analyze the floor's vitals!") to_chat(user, "Analyzing results for The floor:\n\tOverall status: Healthy") @@ -121,7 +120,7 @@ GENE SCANNER "You analyze [M]'s vitals.") if(scanmode == 0) - healthscan(user, M, mode, advanced) + healthscan(user, M, advanced=advanced) else if(scanmode == 1) chemscan(user, M) @@ -163,11 +162,11 @@ GENE SCANNER to_chat(user, "\tSubject appears to be suffering from fatigue.") if(advanced) to_chat(user, "\tFatigue Level: [M.getStaminaLoss()]%.") - if (M.getCloneLoss()) + if(M.getCloneLoss()) to_chat(user, "\tSubject appears to have [M.getCloneLoss() > 30 ? "Severe" : "Minor"] cellular damage.") if(advanced) to_chat(user, "\tCellular Damage Level: [M.getCloneLoss()].") - if (!M.getorgan(/obj/item/organ/brain)) + if(!M.getorgan(/obj/item/organ/brain)) to_chat(user, "\tSubject lacks a brain.") if(iscarbon(M)) var/mob/living/carbon/C = M @@ -190,7 +189,7 @@ GENE SCANNER if(advanced) to_chat(user, "\tBrain Activity Level: [(200 - M.getOrganLoss(ORGAN_SLOT_BRAIN))/2]%.") - if (M.radiation) + if(M.radiation) to_chat(user, "\tSubject is irradiated.") if(advanced) to_chat(user, "\tRadiation Level: [M.radiation]%.") @@ -249,7 +248,7 @@ GENE SCANNER // Body part damage report - if(iscarbon(M) && mode == 1) + if(iscarbon(M)) var/mob/living/carbon/C = M var/list/damaged = C.get_damaged_bodyparts(1,1) if(length(damaged)>0 || oxy_loss>0 || tox_loss>0 || fire_loss>0) @@ -337,27 +336,27 @@ GENE SCANNER var/mob/living/carbon/human/H = M var/datum/species/S = H.dna.species var/mutant = FALSE - if (H.dna.check_mutation(HULK)) + if(H.dna.check_mutation(HULK)) mutant = TRUE - else if (S.mutantlungs != initial(S.mutantlungs)) + else if(S.mutantlungs != initial(S.mutantlungs)) mutant = TRUE - else if (S.mutant_brain != initial(S.mutant_brain)) + else if(S.mutant_brain != initial(S.mutant_brain)) mutant = TRUE - else if (S.mutant_heart != initial(S.mutant_heart)) + else if(S.mutant_heart != initial(S.mutant_heart)) mutant = TRUE - else if (S.mutanteyes != initial(S.mutanteyes)) + else if(S.mutanteyes != initial(S.mutanteyes)) mutant = TRUE - else if (S.mutantears != initial(S.mutantears)) + else if(S.mutantears != initial(S.mutantears)) mutant = TRUE - else if (S.mutanthands != initial(S.mutanthands)) + else if(S.mutanthands != initial(S.mutanthands)) mutant = TRUE - else if (S.mutanttongue != initial(S.mutanttongue)) + else if(S.mutanttongue != initial(S.mutanttongue)) mutant = TRUE - else if (S.mutanttail != initial(S.mutanttail)) + else if(S.mutanttail != initial(S.mutanttail)) mutant = TRUE - else if (S.mutantliver != initial(S.mutantliver)) + else if(S.mutantliver != initial(S.mutantliver)) mutant = TRUE - else if (S.mutantstomach != initial(S.mutantstomach)) + else if(S.mutantstomach != initial(S.mutantstomach)) mutant = TRUE to_chat(user, "Species: [S.name][mutant ? "-derived mutant" : ""]") @@ -399,13 +398,14 @@ GENE SCANNER else to_chat(user, "Blood level: [blood_percent] %, [C.blood_volume] cl, type: [blood_type]") - var/cyberimp_detect + var/list/cyberimp_detect = list() for(var/obj/item/organ/cyberimp/CI in C.internal_organs) if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant) - cyberimp_detect += "[C.name] is modified with a [CI.name].
      " - if(cyberimp_detect) + cyberimp_detect += CI.name + if(length(cyberimp_detect)) to_chat(user, "Detected cybernetic modifications:") - to_chat(user, "[cyberimp_detect]") + for(var/name in cyberimp_detect) + to_chat(user, "[name]") SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, FALSE) /proc/chemscan(mob/living/user, mob/living/M) @@ -424,20 +424,6 @@ GENE SCANNER else to_chat(user, "Subject is not addicted to any reagents.") -/obj/item/healthanalyzer/verb/toggle_mode() - set name = "Switch Verbosity" - set category = "Object" - - if(usr.incapacitated()) - return - - mode = !mode - switch (mode) - if(1) - to_chat(usr, "The scanner now shows specific limb damage.") - if(0) - to_chat(usr, "The scanner no longer shows limb damage.") - /obj/item/healthanalyzer/advanced name = "advanced health analyzer" icon_state = "health_adv" @@ -487,58 +473,18 @@ GENE SCANNER /obj/item/analyzer/attack_self(mob/user) add_fingerprint(user) - if (user.stat || user.eye_blind) + if(user.stat || user.eye_blind) return - var/turf/location = user.loc + //Functionality moved down to proc/scan_turf() + var/turf/location = get_turf(user) + 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.01)] kPa") - else - to_chat(user, "Pressure: [round(pressure, 0.01)] kPa") - if(total_moles) - var/o2_concentration = environment.get_moles(/datum/gas/oxygen)/total_moles - var/n2_concentration = environment.get_moles(/datum/gas/nitrogen)/total_moles - var/co2_concentration = environment.get_moles(/datum/gas/carbon_dioxide)/total_moles - var/plasma_concentration = environment.get_moles(/datum/gas/plasma)/total_moles - - if(abs(n2_concentration - N2STANDARD) < 20) - to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/nitrogen), 0.01)] mol)") - else - to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/nitrogen), 0.01)] mol)") - - if(abs(o2_concentration - O2STANDARD) < 2) - to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/oxygen), 0.01)] mol)") - else - to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/oxygen), 0.01)] mol)") - - if(co2_concentration > 0.01) - to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/carbon_dioxide), 0.01)] mol)") - else - to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/carbon_dioxide), 0.01)] mol)") - - if(plasma_concentration > 0.005) - to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/plasma), 0.01)] mol)") - else - to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/plasma), 0.01)] mol)") - - for(var/id in environment.get_gases()) - if(id in GLOB.hardcoded_gases) - continue - var/gas_concentration = environment.get_moles(id)/total_moles - to_chat(user, "[GLOB.meta_gas_info[id][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] % ([round(environment.get_moles(id), 0.01)] mol)") - to_chat(user, "Temperature: [round(environment.return_temperature()-T0C, 0.01)] °C ([round(environment.return_temperature(), 0.01)] K)") + scan_turf(user, location) /obj/item/analyzer/AltClick(mob/user) //Barometer output for measuring when the next storm happens - ..() if(user.canUseTopic(src, BE_CLOSE)) @@ -629,7 +575,7 @@ GENE SCANNER for(var/id in air_contents.get_gases()) var/gas_concentration = air_contents.get_moles(id)/total_moles - to_chat(user, "[GLOB.meta_gas_info[id][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] % ([round(air_contents.get_moles(id), 0.01)] mol)") + to_chat(user, "[GLOB.gas_data.names[id]]: [round(gas_concentration*100, 0.01)] % ([round(air_contents.get_moles(id), 0.01)] mol)") to_chat(user, "Temperature: [round(temperature - T0C,0.01)] °C ([round(temperature, 0.01)] K)") else @@ -644,6 +590,64 @@ GENE SCANNER to_chat(user, "Instability of the last fusion reaction: [instability].") return TRUE +/obj/item/analyzer/proc/scan_turf(mob/user, turf/location) + 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.01)] kPa") + else + to_chat(user, "Pressure: [round(pressure, 0.01)] kPa") + if(total_moles) + var/o2_concentration = environment.get_moles(GAS_O2)/total_moles + var/n2_concentration = environment.get_moles(GAS_N2)/total_moles + var/co2_concentration = environment.get_moles(GAS_CO2)/total_moles + var/plasma_concentration = environment.get_moles(GAS_PLASMA)/total_moles + + if(abs(n2_concentration - N2STANDARD) < 20) + to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_N2), 0.01)] mol)") + else + to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_N2), 0.01)] mol)") + + if(abs(o2_concentration - O2STANDARD) < 2) + to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_O2), 0.01)] mol)") + else + to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_O2), 0.01)] mol)") + + if(co2_concentration > 0.01) + to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_CO2), 0.01)] mol)") + else + to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_CO2), 0.01)] mol)") + + if(plasma_concentration > 0.005) + to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_PLASMA), 0.01)] mol)") + else + to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_PLASMA), 0.01)] mol)") + + for(var/id in environment.get_gases()) + if(id in GLOB.hardcoded_gases) + continue + var/gas_concentration = environment.get_moles(id)/total_moles + to_chat(user, "[GLOB.gas_data.names[id]]: [round(gas_concentration*100, 0.01)] % ([round(environment.get_moles(id), 0.01)] mol)") + to_chat(user, "Temperature: [round(environment.return_temperature()-T0C, 0.01)] °C ([round(environment.return_temperature(), 0.01)] K)") + +/obj/item/analyzer/ranged + desc = "A hand-held scanner which uses advanced spectroscopy and infrared readings to analyze gases as a distance. Alt-Click to use the built in barometer function." + name = "long-range analyzer" + icon = 'icons/obj/device.dmi' + icon_state = "ranged_analyzer" + +/obj/item/analyzer/ranged/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(target.tool_act(user, src, tool_behaviour)) + return + // Tool act didn't scan it, so let's get it's turf. + var/turf/location = get_turf(target) + scan_turf(user, location) + //slime scanner /obj/item/slime_scanner @@ -664,7 +668,7 @@ GENE SCANNER /obj/item/slime_scanner/attack(mob/living/M, mob/living/user) if(user.stat || user.eye_blind) return - if (!isslime(M)) + if(!isslime(M)) to_chat(user, "This device can only scan slimes!") return var/mob/living/simple_animal/slime/T = M @@ -675,17 +679,17 @@ GENE SCANNER to_chat(user, "Slime scan results:") to_chat(user, "[T.colour] [T.is_adult ? "adult" : "baby"] slime") to_chat(user, "Nutrition: [T.nutrition]/[T.get_max_nutrition()]") - if (T.nutrition < T.get_starve_nutrition()) + if(T.nutrition < T.get_starve_nutrition()) to_chat(user, "Warning: slime is starving!") - else if (T.nutrition < T.get_hunger_nutrition()) + else if(T.nutrition < T.get_hunger_nutrition()) to_chat(user, "Warning: slime is hungry") to_chat(user, "Electric change strength: [T.powerlevel]") to_chat(user, "Health: [round(T.health/T.maxHealth,0.01)*100]%") - if (T.slime_mutation[4] == T.colour) + if(T.slime_mutation[4] == T.colour) to_chat(user, "This slime does not evolve any further.") else - if (T.slime_mutation[3] == T.slime_mutation[4]) - if (T.slime_mutation[2] == T.slime_mutation[1]) + if(T.slime_mutation[3] == T.slime_mutation[4]) + if(T.slime_mutation[2] == T.slime_mutation[1]) to_chat(user, "Possible mutation: [T.slime_mutation[3]]") to_chat(user, "Genetic destability: [T.mutation_chance/2] % chance of mutation on splitting") else @@ -694,12 +698,59 @@ GENE SCANNER else to_chat(user, "Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]") to_chat(user, "Genetic destability: [T.mutation_chance] % chance of mutation on splitting") - if (T.cores > 1) + if(T.cores > 1) to_chat(user, "Multiple cores detected") to_chat(user, "Growth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]") if(T.effectmod) to_chat(user, "Core mutation in progress: [T.effectmod]") to_chat(user, "Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]") + if(T.transformeffects != SLIME_EFFECT_DEFAULT) + var/slimeeffect = "\nTransformative extract effect detected: " + if(T.transformeffects & SLIME_EFFECT_GREY) + slimeeffect += "grey" + if(T.transformeffects & SLIME_EFFECT_ORANGE) + slimeeffect += "orange" + if(T.transformeffects & SLIME_EFFECT_PURPLE) + slimeeffect += "purple" + if(T.transformeffects & SLIME_EFFECT_BLUE) + slimeeffect += "blue" + if(T.transformeffects & SLIME_EFFECT_METAL) + slimeeffect += "metal" + if(T.transformeffects & SLIME_EFFECT_YELLOW) + slimeeffect += "yellow" + if(T.transformeffects & SLIME_EFFECT_DARK_PURPLE) + slimeeffect += "dark purple" + if(T.transformeffects & SLIME_EFFECT_DARK_BLUE) + slimeeffect += "dark blue" + if(T.transformeffects & SLIME_EFFECT_SILVER) + slimeeffect += "silver" + if(T.transformeffects & SLIME_EFFECT_BLUESPACE) + slimeeffect += "bluespace" + if(T.transformeffects & SLIME_EFFECT_SEPIA) + slimeeffect += "sepia" + if(T.transformeffects & SLIME_EFFECT_CERULEAN) + slimeeffect += "cerulean" + if(T.transformeffects & SLIME_EFFECT_PYRITE) + slimeeffect += "pyrite" + if(T.transformeffects & SLIME_EFFECT_RED) + slimeeffect += "red" + if(T.transformeffects & SLIME_EFFECT_GREEN) + slimeeffect += "green" + if(T.transformeffects & SLIME_EFFECT_PINK) + slimeeffect += "pink" + if(T.transformeffects & SLIME_EFFECT_GOLD) + slimeeffect += "gold" + if(T.transformeffects & SLIME_EFFECT_OIL) + slimeeffect += "oil" + if(T.transformeffects & SLIME_EFFECT_BLACK) + slimeeffect += "black" + if(T.transformeffects & SLIME_EFFECT_LIGHT_PINK) + slimeeffect += "light pink" + if(T.transformeffects & SLIME_EFFECT_ADAMANTINE) + slimeeffect += "adamantine" + if(T.transformeffects & SLIME_EFFECT_RAINBOW) + slimeeffect += "rainbow" + to_chat(user, "[slimeeffect].") to_chat(user, "========================") @@ -753,7 +804,7 @@ GENE SCANNER /obj/item/sequence_scanner/attack(mob/living/M, mob/living/carbon/human/user) add_fingerprint(user) - if (!HAS_TRAIT(M, TRAIT_RADIMMUNE) && !HAS_TRAIT(M, TRAIT_BADDNA)) //no scanning if its a husk or DNA-less Species + if(!HAS_TRAIT(M, TRAIT_RADIMMUNE) && !HAS_TRAIT(M, TRAIT_BADDNA)) //no scanning if its a husk or DNA-less Species user.visible_message("[user] analyzes [M]'s genetic sequence.", \ "You analyze [M]'s genetic sequence.") gene_scan(M, user) @@ -840,7 +891,7 @@ GENE SCANNER slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_NORMAL var/scan = TRUE - var/cooldown = -1200 //so it's charged roundstart + var/cooldown = -1000 //so it's charged roundstart var/obj/item/stock_parts/scanning_module/scanner //used for upgrading! /obj/item/extrapolator/Initialize() @@ -881,9 +932,9 @@ GENE SCANNER . = ..() if(in_range(user, src) || isobserver(user)) if(!scanner) - . += "The scanner is missing." + . += "The scanner is missing." else - . += "A class [scanner.rating] scanning module is installed. It is screwed in place." + . += "A class [scanner.rating] scanning module is installed. It is screwed in place." if(cooldown > world.time - (1200 / scanner.rating)) . += "The extrapolator is still recharging!" else @@ -895,6 +946,8 @@ GENE SCANNER /obj/item/extrapolator/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() + if(!proximity_flag) + return if(scanner) if(!target.extrapolator_act(user, src, scan)) if(locate(/datum/component/infective) in target.datum_components) @@ -911,7 +964,7 @@ GENE SCANNER for(var/datum/disease/D in diseases) if(istype(D, /datum/disease/advance)) var/datum/disease/advance/A = D - if(A.properties["stealth"] >= (2 + scanner.rating)) //the extrapolator can detect diseases of higher stealth than a normal scanner + if(A.stealth >= (2 + scanner.rating)) //the extrapolator can detect diseases of higher stealth than a normal scanner continue to_chat(user, "[A.name], stage [A.stage]/5") to_chat(user, "[A] has the following symptoms:") @@ -923,7 +976,7 @@ GENE SCANNER /obj/item/extrapolator/proc/extrapolate(atom/AM, var/list/diseases = list(), mob/user, isolate = FALSE, timer = 200) var/list/advancediseases = list() var/list/symptoms = list() - if(cooldown > world.time - (1200 / scanner.rating)) + if(cooldown > world.time - (1000 / scanner.rating)) to_chat(user, "The extrapolator is still recharging!") return for(var/datum/disease/advance/cantidate in diseases) @@ -965,4 +1018,3 @@ GENE SCANNER user.put_in_hands(B) playsound(src, 'sound/machines/ping.ogg', 30, TRUE) return TRUE - diff --git a/code/game/objects/items/devices/sound_synth.dm b/code/game/objects/items/devices/sound_synth.dm index 4c77f082acca7..b2a179808b82f 100644 --- a/code/game/objects/items/devices/sound_synth.dm +++ b/code/game/objects/items/devices/sound_synth.dm @@ -34,7 +34,7 @@ "Bwoink" = "selected_sound=sound/effects/adminhelp.ogg&shiftpitch=1&volume=50", "Double Beep" = "selected_sound=sound/machines/twobeep.ogg&shiftpitch=1&volume=50", "Flush" = "selected_sound=sound/machines/disposalflush.ogg&shiftpitch=1&volume=40", - "Kawaii" = "selected_sound=sound/AI/animes.ogg&shiftpitch=0&volume=60", + "Kawaii" = "selected_sound=sound/ai/default/animes.ogg&shiftpitch=0&volume=60", "Startup" = "selected_sound=sound/mecha/nominal.ogg&shiftpitch=0&volume=50", "Welding Noises" = "selected_sound=sound/items/welder.ogg&shiftpitch=1&volume=55", "Short Slide Whistle" = "selected_sound=sound/effects/slide_whistle_short.ogg&shiftpitch=1&volume=50", @@ -66,7 +66,6 @@ spam_flag = world.timeofday /obj/item/soundsynth/AltClick(mob/living/carbon/user) - . = ..() pick_sound() /obj/item/soundsynth/attack(mob/living/M as mob, mob/living/user as mob, def_zone) diff --git a/code/game/objects/items/devices/spyglasses.dm b/code/game/objects/items/devices/spyglasses.dm new file mode 100644 index 0000000000000..e23b6e6fdadc0 --- /dev/null +++ b/code/game/objects/items/devices/spyglasses.dm @@ -0,0 +1,110 @@ +//detective spyglasses. meant to be an example for map_popups.dm +/obj/item/clothing/glasses/sunglasses/spy + desc = "Made by Nerd. Co's infiltration and surveillance department. Upon closer inspection, there's a small screen in each lens." + actions_types = list(/datum/action/item_action/activate_remote_view) + var/obj/item/clothing/accessory/spy_bug/linked_bug + +/obj/item/clothing/glasses/sunglasses/spy/proc/show_to_user(mob/user)//this is the meat of it. most of the map_popup usage is in this. + if(!user?.client) + return + if(!linked_bug) + user.audible_message("[src] lets off a shrill beep!") + if("spypopup_map" in user.client.screen_maps) //alright, the popup this object uses is already IN use, so the window is open. no point in doing any other work here, so we're good. + return + user.client.setup_popup("spypopup", 3, 3, 2) + user.client.register_map_obj(linked_bug.cam_screen) + for(var/plane in linked_bug.cam_plane_masters) + user.client.register_map_obj(plane) + linked_bug.update_view() + +/obj/item/clothing/glasses/sunglasses/spy/equipped(mob/user, slot) + . = ..() + if(!(slot & ITEM_SLOT_EYES)) + user.client.close_popup("spypopup") + +/obj/item/clothing/glasses/sunglasses/spy/dropped(mob/user) + . = ..() + user.client.close_popup("spypopup") + +/obj/item/clothing/glasses/sunglasses/spy/ui_action_click(mob/user) + show_to_user(user) + +/obj/item/clothing/glasses/sunglasses/spy/item_action_slot_check(slot) + return slot & ITEM_SLOT_EYES + +/obj/item/clothing/glasses/sunglasses/spy/Destroy() + if(linked_bug) + linked_bug.linked_glasses = null + return ..() + + +/obj/item/clothing/accessory/spy_bug + name = "pocket protector" + icon = 'icons/obj/clothing/accessories.dmi' + icon_state = "pocketprotector" + desc = "An advanced piece of espionage equipment in the shape of a pocket protector. It has a built in 360 degree camera for all your \"admirable\" needs. Microphone not included." + var/obj/item/clothing/glasses/sunglasses/spy/linked_glasses + var/atom/movable/screen/map_view/cam_screen + var/list/cam_plane_masters + // Ranges higher than one can be used to see through walls. + var/cam_range = 1 + var/datum/movement_detector/tracker + +/obj/item/clothing/accessory/spy_bug/Initialize() + . = ..() + tracker = new /datum/movement_detector(src, CALLBACK(src, .proc/update_view)) + + cam_screen = new + cam_screen.name = "screen" + cam_screen.assigned_map = "spypopup_map" + cam_screen.del_on_map_removal = FALSE + cam_screen.set_position(1, 1) + + // We need to add planesmasters to the popup, otherwise + // blending fucks up massively. Any planesmaster on the main screen does + // NOT apply to map popups. If there's ever a way to make planesmasters + // omnipresent, then this wouldn't be needed. + cam_plane_masters = list() + for(var/plane in subtypesof(/atom/movable/screen/plane_master)) + var/atom/movable/screen/instance = new plane() + instance.assigned_map = "spypopup_map" + instance.del_on_map_removal = FALSE + instance.screen_loc = "spypopup_map:CENTER" + cam_plane_masters += instance + +/obj/item/clothing/accessory/spy_bug/Destroy() + if(linked_glasses) + linked_glasses.linked_bug = null + qdel(cam_screen) + QDEL_LIST(cam_plane_masters) + qdel(tracker) + return ..() + +/obj/item/clothing/accessory/spy_bug/proc/update_view()//this doesn't do anything too crazy, just updates the vis_contents of its screen obj + cam_screen.vis_contents.Cut() + for(var/turf/visible_turf in view(1,get_turf(src)))//fuck you usr + cam_screen.vis_contents += visible_turf + +//it needs to be linked, hence a kit. +/obj/item/storage/box/rxglasses/spyglasskit + name = "spyglass kit" + desc = "this box contains cool nerd glasses; with built-in displays to view a linked camera." + +/obj/item/paper/fluff/nerddocs + name = "Espionage For Dummies" + color = "#FFFF00" + desc = "An eye gougingly yellow pamphlet with a badly designed image of a detective on it. the subtext says \" The Latest Way To Violate Privacy Guidelines!\" " + info = @{" +Thank you for your purchase of the Nerd Co SpySpeks tm, this paper will be your quick-start guide to violating the privacy of your crewmates in three easy steps!

      Step One: Nerd Co SpySpeks tm upon your face.
      +Step Two: Place the included "ProfitProtektor tm" camera assembly in a place of your choosing - make sure to make heavy use of it's inconspicous design! +Step Three: Press the "Activate Remote View" Button on the side of your SpySpeks tm to open a movable camera display in the corner of your vision, it's just that easy!


      TROUBLESHOOTING
      +My SpySpeks tm Make a shrill beep while attempting to use! +A shrill beep coming from your SpySpeks means that they can't connect to the included ProfitProtektor tm, please make sure your ProfitProtektor is still active, and functional! + "} + +/obj/item/storage/box/rxglasses/spyglasskit/PopulateContents() + var/obj/item/clothing/accessory/spy_bug/newbug = new(src) + var/obj/item/clothing/glasses/sunglasses/spy/newglasses = new(src) + newbug.linked_glasses = newglasses + newglasses.linked_bug = newbug + new /obj/item/paper/fluff/nerddocs(src) diff --git a/code/game/objects/items/devices/swapper.dm b/code/game/objects/items/devices/swapper.dm index 67501e527b691..894dba5b6ecaa 100644 --- a/code/game/objects/items/devices/swapper.dm +++ b/code/game/objects/items/devices/swapper.dm @@ -112,3 +112,5 @@ if(ismob(B)) var/mob/M = B to_chat(M, "[linked_swapper] activates, and you find yourself somewhere else.") + log_combat(user, B, "swapped to [AREACOORD(B)]") + log_game("[key_name(B)] has been swapped to [AREACOORD(B)]! Quantum Spin Inverter activated by [key_name(user)].") diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 006792fe8d153..59281fbf9333c 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -7,7 +7,6 @@ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' w_class = WEIGHT_CLASS_SMALL - flags_1 = HEAR_1 slot_flags = ITEM_SLOT_BELT materials = list(/datum/material/iron=60, /datum/material/glass=30) force = 2 @@ -26,7 +25,11 @@ if(starting_tape_type) mytape = new starting_tape_type(src) update_icon() + become_hearing_sensitive() +/obj/item/taperecorder/Destroy() + QDEL_NULL(mytape) + return ..() /obj/item/taperecorder/examine(mob/user) . = ..() @@ -94,7 +97,7 @@ icon_state = "taperecorder_idle" -/obj/item/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) +/obj/item/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, list/message_mods = list()) . = ..() if(mytape && recording) mytape.timestamp += mytape.used_capacity diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 2d9cb34e43422..3ba4e0b70db60 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -87,6 +87,7 @@ effective or pretty fucking useless. log_combat(user, M, "irradiated", src) var/cooldown = get_cooldown() used = TRUE + SStgui.update_uis(src) // Update immediately, since it's not spammable icon_state = "health1" handle_cooldown(cooldown) // splits off to handle the cooldown while handling wavelength to_chat(user, "Successfully irradiated [M].") @@ -102,6 +103,7 @@ effective or pretty fucking useless. spawn(cooldown) used = FALSE icon_state = "health" + SStgui.update_uis(src) // Update immediately, since it's not spammable /obj/item/healthanalyzer/rad_laser/proc/get_cooldown() return round(max(10, (stealth*30 + intensity*5 - wavelength/4))) @@ -193,7 +195,6 @@ effective or pretty fucking useless. slot_flags = ITEM_SLOT_BELT attack_verb = list("whipped", "lashed", "disciplined") - var/equipslot = SLOT_BELT var/mob/living/carbon/human/user = null var/charge = 300 var/max_charge = 300 @@ -202,7 +203,7 @@ effective or pretty fucking useless. actions_types = list(/datum/action/item_action/toggle) /obj/item/shadowcloak/ui_action_click(mob/user) - if(user.get_item_by_slot(equipslot) == src) + if(user.get_item_by_slot(slot_flags) == src) if(!on) Activate(usr) else @@ -210,8 +211,8 @@ effective or pretty fucking useless. return /obj/item/shadowcloak/item_action_slot_check(slot, mob/user) - if(slot == equipslot) - return 1 + if(slot == slot_flags) + return TRUE /obj/item/shadowcloak/proc/Activate(mob/living/carbon/human/user) if(!user) @@ -232,30 +233,32 @@ effective or pretty fucking useless. /obj/item/shadowcloak/dropped(mob/user) ..() - if(user && user.get_item_by_slot(equipslot) != src) + if(user && user.get_item_by_slot(slot_flags) != src) Deactivate() -/obj/item/shadowcloak/process() - if(user.get_item_by_slot(equipslot) != src) +/obj/item/shadowcloak/process(delta_time) + if(user.get_item_by_slot(slot_flags) != src) Deactivate() return var/turf/T = get_turf(src) if(on) var/lumcount = T.get_lumcount() if(lumcount > 0.3) - charge = max(0,charge - 25)//Quick decrease in light + charge = max(0, charge - 12.5 * delta_time)//Quick decrease in light else - charge = min(max_charge,charge + 50) //Charge in the dark + charge = min(max_charge,charge + 25 * delta_time) //Charge in the dark animate(user,alpha = CLAMP(255 - charge,0,255),time = 10) /obj/item/shadowcloak/magician name = "magician's cape" desc = "A magician never reveals his secrets." icon = 'icons/obj/bedsheets.dmi' + lefthand_file = 'icons/mob/inhands/misc/bedsheet_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/bedsheet_righthand.dmi' icon_state = "sheetmagician" + item_state = "sheetmagician" slot_flags = ITEM_SLOT_NECK layer = MOB_LAYER - equipslot = SLOT_NECK attack_verb = null /obj/item/shadowcloak/magician/attackby(obj/item/W, mob/user, params) @@ -270,8 +273,8 @@ effective or pretty fucking useless. playsound(user, 'sound/weapons/emitter2.ogg', 25, 1, -1) /obj/item/jammer - name = "radio jammer" - desc = "Device used to disrupt nearby radio communication." + name = "signal jammer" + desc = "Device used to disrupt nearby wireless communication." icon = 'icons/obj/device.dmi' icon_state = "jammer" var/active = FALSE @@ -285,3 +288,11 @@ effective or pretty fucking useless. else GLOB.active_jammers -= src update_icon() + +/atom/proc/is_jammed() + var/turf/position = get_turf(src) + for(var/obj/item/jammer/jammer in GLOB.active_jammers) + var/turf/jammer_turf = get_turf(jammer) + if(position?.get_virtual_z_level() == jammer_turf.get_virtual_z_level() && (get_dist(position, jammer_turf) <= jammer.range)) + return TRUE + return FALSE diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index fae14154e294e..41e5966f63e0d 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -16,6 +16,10 @@ var/valve_open = FALSE var/toggle = TRUE +/obj/item/transfer_valve/Destroy() + attached_device = null + return ..() + /obj/item/transfer_valve/IsAssemblyHolder() return TRUE @@ -128,7 +132,7 @@ attached_device = null update_icon() if(href_list["device"]) - attached_device.attack_self(usr) + attached_device.ui_interact(usr) attack_self(usr) add_fingerprint(usr) @@ -177,20 +181,15 @@ if(!target_self) target.set_volume(target.return_volume() + tank_two.air_contents.return_volume()) target.set_volume(target.return_volume() + tank_one.air_contents.return_volume()) - var/datum/gas_mixture/temp - temp = tank_one.air_contents.remove_ratio(1) - target.merge(temp) + tank_one.air_contents.transfer_ratio_to(target, 1) if(!target_self) - temp = tank_two.air_contents.remove_ratio(1) - target.merge(temp) + tank_two.air_contents.transfer_ratio_to(target, 1) /obj/item/transfer_valve/proc/split_gases() if (!valve_open || !tank_one || !tank_two) return var/ratio1 = tank_one.air_contents.return_volume()/tank_two.air_contents.return_volume() - var/datum/gas_mixture/temp - temp = tank_two.air_contents.remove_ratio(ratio1) - tank_one.air_contents.merge(temp) + tank_two.air_contents.transfer_ratio_to(tank_one.air_contents, ratio1) tank_two.air_contents.set_volume(tank_two.air_contents.return_volume() - tank_one.air_contents.return_volume()) /* @@ -216,7 +215,7 @@ admin_attachment_message = " with [attachment] attached by [attacher ? ADMIN_LOOKUPFLW(attacher) : "Unknown"]" attachment_message = " with [attachment] attached by [attacher ? key_name_admin(attacher) : "Unknown"]" - var/mob/bomber = get_mob_by_key(fingerprintslast) + var/mob/bomber = get_mob_by_ckey(fingerprintslast) var/admin_bomber_message var/bomber_message if(bomber) @@ -292,4 +291,5 @@ attached_device = null . = TRUE + ui_update() update_icon() diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 756f69bed2652..7043741244d31 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -3,6 +3,7 @@ desc = "Contains all the luck you'll ever need." icon = 'icons/obj/dice.dmi' icon_state = "dicebag" + pill_variance = 0 /obj/item/storage/pill_bottle/dice/Initialize() . = ..() @@ -39,6 +40,7 @@ desc = "For rolling several dice at once. A favorite of street urchins." icon = 'icons/obj/dice.dmi' icon_state = "dicecup" + pill_variance = 0 /obj/item/storage/pill_bottle/dice_cup/attack_self(mob/user) var/turf/throw_target = get_step(loc,user.dir) //with telekinesis, throws the direction the user is facing @@ -180,8 +182,10 @@ diceroll(user) /obj/item/dice/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - diceroll(thrownby) - . = ..() + var/mob/thrown_by = thrownby?.resolve() + if(thrown_by) + diceroll(thrown_by) + return ..() /obj/item/dice/proc/diceroll(mob/user) result = roll(sides) diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index fd552ea70f388..274e544ce3c36 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -370,12 +370,12 @@ name = "\improper DNA injector (Anti-Shock Touch)" remove_mutations = list(SHOCKTOUCH) -/obj/item/dnainjector/spacialinstability - name = "\improper DNA injector (Spacial Instability)" +/obj/item/dnainjector/spatialinstability + name = "\improper DNA injector (Spatial Instability)" add_mutations = list(BADBLINK) -/obj/item/dnainjector/antispacialinstability - name = "\improper DNA injector (Anti-Spacial Instability)" +/obj/item/dnainjector/antispatialinstability + name = "\improper DNA injector (Anti-Spatial Instability)" remove_mutations = list(BADBLINK) /obj/item/dnainjector/acidflesh diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm new file mode 100644 index 0000000000000..a3638efff0b94 --- /dev/null +++ b/code/game/objects/items/dualsaber.dm @@ -0,0 +1,200 @@ +/* + * Double-Bladed Energy Swords - Cheridan + */ +/obj/item/dualsaber + icon = 'icons/obj/transforming_energy.dmi' + icon_state = "dualsaber0" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + name = "double-bladed energy sword" + desc = "Handle with care." + force = 3 + throwforce = 5 + throw_speed = 3 + throw_range = 5 + w_class = WEIGHT_CLASS_SMALL + var/w_class_on = WEIGHT_CLASS_BULKY + hitsound = "swing_hit" + armour_penetration = 35 + item_color = "green" + light_color = "#00ff00"//green + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + block_level = 2 + block_upgrade_walk = 1 + block_power = 70 + block_sound = 'sound/weapons/egloves.ogg' + block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY | BLOCKING_PROJECTILE + max_integrity = 200 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70, "stamina" = 0) + resistance_flags = FIRE_PROOF + var/twohand_force = 34 + var/hacked = FALSE + var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD + var/list/possible_colors = list("red", "blue", "green", "purple") + +/obj/item/dualsaber/Initialize() + . = ..() + RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) + RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) + if(LAZYLEN(possible_colors)) + item_color = pick(possible_colors) + switch(item_color) + if("red") + light_color = LIGHT_COLOR_RED + if("green") + light_color = LIGHT_COLOR_GREEN + if("blue") + light_color = LIGHT_COLOR_LIGHT_CYAN + if("purple") + light_color = LIGHT_COLOR_LAVENDER + +/obj/item/dualsaber/Destroy() + STOP_PROCESSING(SSobj, src) + . = ..() + +/obj/item/dualsaber/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_unwielded=force, force_wielded=twohand_force, block_power_unwielded=70, block_power_wielded=75, \ + wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg', icon_wielded="dualsaber[item_color]1") + +/// Triggered on wield of two handed item +/// Specific hulk checks due to reflection chance for balance issues and switches hitsounds. +/obj/item/dualsaber/proc/on_wield(obj/item/source, mob/living/carbon/user) + SIGNAL_HANDLER + + if(user && user.has_dna()) + if(user.dna.check_mutation(HULK)) + to_chat(user, "You lack the grace to wield this!") + return COMPONENT_TWOHANDED_BLOCK_WIELD + sharpness = IS_SHARP + w_class = w_class_on + hitsound = 'sound/weapons/blade1.ogg' + START_PROCESSING(SSobj, src) + set_light(brightness_on) + +/// Triggered on unwield of two handed item +/// switch hitsounds +/obj/item/dualsaber/proc/on_unwield(obj/item/source, mob/living/carbon/user) + SIGNAL_HANDLER + + sharpness = initial(sharpness) + w_class = initial(w_class) + hitsound = "swing_hit" + STOP_PROCESSING(SSobj, src) + set_light(0) + +/obj/item/dualsaber/update_icon() + icon_state = "dualsaber0" + SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + ..() + +/obj/item/dualsaber/suicide_act(mob/living/carbon/user) + if(ISWIELDED(src)) + user.visible_message("[user] begins spinning way too fast! It looks like [user.p_theyre()] trying to commit suicide!") + + var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)//stole from chainsaw code + var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN) + B.organ_flags &= ~ORGAN_VITAL //this cant possibly be a good idea + var/randdir + for(var/i in 1 to 24)//like a headless chicken! + if(user.is_holding(src)) + randdir = pick(GLOB.alldirs) + user.Move(get_step(user, randdir),randdir) + user.emote("spin") + if (i == 3 && myhead) + myhead.drop_limb() + sleep(3) + else + user.visible_message("[user] panics and starts choking to death!") + return OXYLOSS + + else + user.visible_message("[user] begins beating [user.p_them()]self to death with \the [src]'s handle! It probably would've been cooler if [user.p_they()] turned it on first!") + return BRUTELOSS + +/obj/item/dualsaber/attack(mob/target, mob/living/carbon/human/user) + var/wielded = ISWIELDED(src) + if(user.has_dna()) + if(user.dna.check_mutation(HULK)) + to_chat(user, "You grip the blade too hard and accidentally drop it!") + if(wielded) + user.dropItemToGround(src, force=TRUE) + return + ..() + if(wielded && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40)) + impale(user) + return + if(wielded && prob(50)) + INVOKE_ASYNC(src, .proc/jedi_spin, user) + +/obj/item/dualsaber/proc/jedi_spin(mob/living/user) //rip complex code, but this fucked up blocking + user.emote("flip") + +/obj/item/dualsaber/proc/impale(mob/living/user) + to_chat(user, "You twirl around a bit before losing your balance and impaling yourself on [src].") + if(ISWIELDED(src)) + user.take_bodypart_damage(20,25,check_armor = TRUE) + else + user.adjustStaminaLoss(25) + +/obj/item/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(ISWIELDED(src)) + return ..() + return 0 + +/obj/item/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(ISWIELDED(src)) + to_chat(user, "You can't pick up such dangerous item with your meaty hands without losing fingers, better not to!") + return 1 + +/obj/item/dualsaber/process() + if(ISWIELDED(src)) + if(hacked) + light_color = pick(LIGHT_COLOR_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER) + open_flame() + else + STOP_PROCESSING(SSobj, src) + +/obj/item/dualsaber/IsReflect() + if(ISWIELDED(src)) + return 1 + +/obj/item/dualsaber/ignition_effect(atom/A, mob/user) + // same as /obj/item/melee/transforming/energy, mostly + if(!ISWIELDED(src)) + return "" + var/in_mouth = "" + if(iscarbon(user)) + var/mob/living/carbon/C = user + if(C.wear_mask) + in_mouth = ", barely missing [user.p_their()] nose" + . = "[user] swings [user.p_their()] [name][in_mouth]. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [A.name] in the process." + playsound(loc, hitsound, get_clamped_volume(), TRUE, -1) + add_fingerprint(user) + // Light your candles while spinning around the room + INVOKE_ASYNC(src, .proc/jedi_spin, user) + +/obj/item/dualsaber/green + possible_colors = list("green") + +/obj/item/dualsaber/red + possible_colors = list("red") + +/obj/item/dualsaber/blue + possible_colors = list("blue") + +/obj/item/dualsaber/purple + possible_colors = list("purple") + +/obj/item/dualsaber/attackby(obj/item/W, mob/user, params) + if(W.tool_behaviour == TOOL_MULTITOOL) + if(!hacked) + hacked = TRUE + to_chat(user, "2XRNBW_ENGAGE") + item_color = "rainbow" + AddComponent(/datum/component/two_handed, icon_wielded="dualsaber[item_color]1") + update_icon() + else + to_chat(user, "It's starting to look like a triple rainbow - no, nevermind.") + else + return ..() diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm index cb5545ba16668..12bdf7a09f172 100644 --- a/code/game/objects/items/eightball.dm +++ b/code/game/objects/items/eightball.dm @@ -97,13 +97,13 @@ /obj/item/toy/eightball/haunted shake_time = 150 cooldown_time = 1800 - flags_1 = HEAR_1 var/last_message var/selected_message var/list/votes /obj/item/toy/eightball/haunted/Initialize(mapload) . = ..() + become_hearing_sensitive() votes = list() GLOB.poi_list |= src @@ -122,13 +122,14 @@ interact(user) return ..() -/obj/item/toy/eightball/haunted/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) +/obj/item/toy/eightball/haunted/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, list/message_mods = list()) . = ..() last_message = raw_message /obj/item/toy/eightball/haunted/start_shaking(mob/user) // notify ghosts that someone's shaking a haunted eightball // and inform them of the message, (hopefully a yes/no question) + votes = list() //need to reset the votes everytime someone shakes it selected_message = last_message notify_ghosts("[user] is shaking [src], hoping to get an answer to \"[selected_message]\"", source=src, enter_link="(Click to help)", action=NOTIFY_ATTACK, header = "Magic eightball") diff --git a/code/game/objects/items/etherealdiscoball.dm b/code/game/objects/items/etherealdiscoball.dm index 685e83b8940ee..ec37dd9b4f85f 100644 --- a/code/game/objects/items/etherealdiscoball.dm +++ b/code/game/objects/items/etherealdiscoball.dm @@ -37,7 +37,6 @@ to_chat(user, "You turn the disco ball on!") /obj/structure/etherealball/AltClick(mob/living/carbon/human/user) - . = ..() if(anchored) to_chat(user, "You unlock the disco ball.") anchored = FALSE diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index dee4546f11b79..31037190b83b7 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -55,7 +55,7 @@ name = "advanced fire extinguisher" desc = "Used to stop thermonuclear fires from spreading inside your engine." icon_state = "foam_extinguisher0" - //item_state = "foam_extinguisher" needs sprite + item_state = "foam_extinguisher" dog_fashion = null chem = /datum/reagent/firefighting_foam tanktype = /obj/structure/reagent_dispensers/foamtank diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm new file mode 100644 index 0000000000000..c9208ec52deae --- /dev/null +++ b/code/game/objects/items/fireaxe.dm @@ -0,0 +1,63 @@ +/* + * Fireaxe + */ +/obj/item/fireaxe // DEM AXES MAN, marker -Agouri + icon_state = "fireaxe0" + lefthand_file = 'icons/mob/inhands/weapons/axes_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/axes_righthand.dmi' + name = "fire axe" + desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?" + attack_weight = 3 + block_upgrade_walk = 1 + force = 5 + throwforce = 15 + w_class = WEIGHT_CLASS_BULKY + slot_flags = ITEM_SLOT_BACK + attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") + hitsound = 'sound/weapons/bladeslice.ogg' + sharpness = IS_SHARP + max_integrity = 200 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30, "stamina" = 0) + resistance_flags = FIRE_PROOF + var/icon_prefix = "fireaxe" + +/obj/item/fireaxe/Initialize() + . = ..() + +/obj/item/fireaxe/ComponentInitialize() + . = ..() + AddComponent(/datum/component/butchering, 100, 80, 0 , hitsound) //axes are not known for being precision butchering tools + AddComponent(/datum/component/two_handed, force_unwielded=5, force_wielded=24, block_power_wielded=25, icon_wielded="[icon_prefix]1") + +/obj/item/fireaxe/update_icon() + icon_state = "[icon_prefix]0" + ..() + +/obj/item/fireaxe/suicide_act(mob/user) + user.visible_message("[user] axes [user.p_them()]self from head to toe! It looks like [user.p_theyre()] trying to commit suicide!") + return (BRUTELOSS) + +/obj/item/fireaxe/afterattack(atom/A, mob/user, proximity) + . = ..() + if(!proximity) + return + if(ISWIELDED(src)) //destroys windows and grilles in one hit + if(istype(A, /obj/structure/window)) + var/obj/structure/window/W = A + W.take_damage(200, BRUTE, "melee", 0) + else if(istype(A, /obj/structure/grille)) + var/obj/structure/grille/G = A + G.take_damage(40, BRUTE, "melee", 0) + +/* + * Bone Axe + */ +/obj/item/fireaxe/boneaxe // Blatant imitation of the fireaxe, but made out of bone. + name = "bone axe" + desc = "A large, vicious axe crafted out of several sharpened bone plates and crudely tied together. Made of monsters, by killing monsters, for killing monsters." + icon_prefix = "bone_axe" + icon_state = "bone_axe0" + +/obj/item/fireaxe/boneaxe/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_unwielded=5, force_wielded=23, icon_wielded="[icon_prefix]1") diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index f50d6bac85eb2..e99e855c5af8d 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -10,6 +10,8 @@ force = 3 throwforce = 10 block_upgrade_walk = 1 + var/acti_sound = 'sound/items/welderactivate.ogg' + var/deac_sound = 'sound/items/welderdeactivate.ogg' throw_speed = 1 throw_range = 5 w_class = WEIGHT_CLASS_NORMAL @@ -17,6 +19,7 @@ resistance_flags = FIRE_PROOF var/status = FALSE var/lit = FALSE //on or off + light_color = LIGHT_COLOR_FIRE var/operating = FALSE//cooldown var/obj/item/weldingtool/weldtool = null var/obj/item/assembly/igniter/igniter = null @@ -161,11 +164,15 @@ to_chat(user, "You [lit ? "extinguish" : "ignite"] [src]!") lit = !lit if(lit) + set_light(1) + playsound(loc, acti_sound, 50, TRUE) START_PROCESSING(SSobj, src) if(!warned_admins) message_admins("[ADMIN_LOOKUPFLW(user)] has lit a flamethrower.") warned_admins = TRUE else + set_light(0) + playsound(loc, deac_sound, 50, TRUE) STOP_PROCESSING(SSobj,src) update_icon() @@ -197,7 +204,7 @@ sleep(1) previousturf = T operating = FALSE - for(var/mob/M in viewers(1, loc)) + for(var/mob/M as() in viewers(1, loc)) if((M.client && M.machine == src)) attack_self(M) @@ -206,12 +213,11 @@ //TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this... //Transfer 5% of current tank air contents to turf var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(release_amount) - air_transfer.set_moles(/datum/gas/plasma, air_transfer.get_moles(/datum/gas/plasma) * 5) + air_transfer.set_moles(GAS_PLASMA, air_transfer.get_moles(GAS_PLASMA) * 5) target.assume_air(air_transfer) //Burn it based on transfered gas target.hotspot_expose((ptank.air_contents.return_temperature()*2) + 380,500) //location.hotspot_expose(1000,500,1) - SSair.add_to_active(target, 0) /obj/item/flamethrower/Initialize(mapload) @@ -237,7 +243,7 @@ /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!") + owner.visible_message("\The [attack_text] hits the fuel tank on [owner]'s [name], rupturing it! What a shot!") var/turf/target_turf = get_turf(owner) log_game("A projectile ([hitby]) detonated a flamethrower tank held by [key_name(owner)] at [COORD(target_turf)]") igniter.ignite_turf(src,target_turf, release_amount = 100) diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 6ee964e4fb644..926711b557ac5 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -188,11 +188,11 @@ user.set_nutrition(0) /obj/item/book/granter/spell/blind - spell = /obj/effect/proc_holder/spell/pointed/trigger/blind + spell = /obj/effect/proc_holder/spell/targeted/blind spellname = "blind" icon_state ="bookblind" desc = "This book looks blurry, no matter how you look at it." - remarks = list("Well I can't learn anything if I can't read the damn thing!", "Why would you use a dark font on a dark background...", "Ah, I can't see an Oh, I'm fine...", "I can't see my hand...!", "I'm manually blinking, damn you book...", "I can't read this page, but somehow I feel like I learned something from it...", "Hey, who turned off the lights?") + remarks = list("Well I can't learn anything if I can't read the damn thing!", "Why would you use a dark font on a dark background...", "Ah, I can't see an- Oh, I'm fine...", "I can't see my hand...!", "I'm manually blinking, damn you book...", "I can't read this page, but somehow I feel like I learned something from it...", "Hey, who turned off the lights?") /obj/item/book/granter/spell/blind/recoil(mob/user) ..() @@ -244,7 +244,7 @@ ..() to_chat(user,"You suddenly feel very solid!") user.Stun(40, ignore_canstun = TRUE) - user.petrify(30) + user.petrify(60) /obj/item/book/granter/spell/knock spell = /obj/effect/proc_holder/spell/aoe_turf/knock @@ -271,7 +271,7 @@ var/obj/item/clothing/magichead = new /obj/item/clothing/mask/horsehead/cursed(user.drop_location()) if(!user.dropItemToGround(user.wear_mask)) qdel(user.wear_mask) - user.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, TRUE, TRUE) + user.equip_to_slot_if_possible(magichead, ITEM_SLOT_MASK, TRUE, TRUE) qdel(src) else to_chat(user,"I say thee neigh") //It still lives here @@ -377,6 +377,32 @@ name = "empty scroll" icon_state = "blankscroll" +/obj/item/book/granter/martial/tribal_claw + martial = /datum/martial_art/tribal_claw + name = "old scroll" + martialname = "tribal claw" + desc = "A scroll filled with ancient draconic markings." + greet = "You have learned the ancient martial art of the Tribal Claw! You are now able to use your tail and claws in a fight much better than before. \ + Check the combos you are now able to perform using the Recall Teachings verb in the Tribal Claw tab" + icon = 'icons/obj/wizard.dmi' + icon_state = "scroll2" + remarks = list("I must prove myself worthy to the masters of the Knoises clan...", "Use your tail to surprise any enemy...", "Your sharp claws can disorient them...", "I don't think this would combine with other martial arts...", "Ooga Booga...") + +/obj/item/book/granter/martial/tribal_claw/onlearned(mob/living/carbon/user) + ..() + if(!oneuse) + return + desc = "It's completely blank." + name = "empty scroll" + icon_state = "blankscroll" + +/obj/item/book/granter/martial/tribal_claw/already_known(mob/user) + if(islizard(user)) + return FALSE + else + to_chat(user, "You try to read the scroll but can't comprehend any of it.") + return TRUE + /obj/item/book/granter/martial/plasma_fist martial = /datum/martial_art/plasma_fist name = "frayed scroll" diff --git a/code/game/objects/items/grenades/antigravity.dm b/code/game/objects/items/grenades/antigravity.dm index 43b2f949867cb..4a28ddf86fb0a 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) - + qdel(src) diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index 3378be997e450..83517420746aa 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -174,10 +174,12 @@ active = TRUE addtimer(CALLBACK(src, .proc/prime), isnull(delayoverride)? det_time : delayoverride) -/obj/item/grenade/chem_grenade/prime() +/obj/item/grenade/chem_grenade/prime(mob/living/lanced_by) if(stage != GRENADE_READY) return + . = ..() + var/list/datum/reagents/reactants = list() for(var/obj/item/reagent_containers/glass/G in beakers) reactants += G.reagents @@ -212,7 +214,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 != GRENADE_READY) return @@ -281,7 +283,7 @@ return ..() -/obj/item/grenade/chem_grenade/adv_release/prime() +/obj/item/grenade/chem_grenade/adv_release/prime(mob/living/lanced_by) if(stage != GRENADE_READY) return @@ -600,4 +602,4 @@ B2.reagents.add_reagent(/datum/reagent/consumable/sodiumchloride, 50) beakers += B1 - beakers += B2 \ No newline at end of file + beakers += B2 diff --git a/code/game/objects/items/grenades/clusterbuster.dm b/code/game/objects/items/grenades/clusterbuster.dm index 920640145d790..cd64cdc245b4d 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 @@ -28,7 +29,7 @@ new /obj/item/grenade/clusterbuster/segment(drop_location(), src)//Creates 'segments' that launches a few more payloads new payload_spawner(drop_location(), payload, numspawned)//Launches payload - playsound(src, prime_sound, 75, 1, -3) + playsound(src, prime_sound, 75, TRUE, -3) qdel(src) ////////////////////// @@ -59,9 +60,9 @@ 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) + playsound(src, prime_sound, 75, TRUE, -3) qdel(src) ////////////////////////////////// diff --git a/code/game/objects/items/grenades/discogrenade.dm b/code/game/objects/items/grenades/discogrenade.dm index d5da0386ff38a..15f9885052080 100644 --- a/code/game/objects/items/grenades/discogrenade.dm +++ b/code/game/objects/items/grenades/discogrenade.dm @@ -1,6 +1,6 @@ //Ethereal Disco Grenade for Ethereal traitors //Does not affect ethereals. -//Some basic code peices taken from flashbang, spawner grenade and ethereal disco ball for functionality (basically a combination of the 3). +//Some basic code pieces taken from flashbang, spawner grenade and ethereal disco ball for functionality (basically a combination of the 3). ////////////////////// // Primary grenade // @@ -16,7 +16,8 @@ var/list/messages = list("This party is great!", "Wooo!!!", "Party!", "Check out these moves!", "Hey, want to dance with me?") var/list/message_social_anxiety = list("I want to go home...", "Where are the toilets?", "I don't like this song.") -/obj/item/grenade/discogrenade/prime() +/obj/item/grenade/discogrenade/prime(mob/living/lanced_by) + . = ..() update_mob() var/current_turf = get_turf(src) if(!current_turf) @@ -57,7 +58,7 @@ addtimer(CALLBACK(src, .proc/prime), rand(10, 60)) randomiseLightColor() -/obj/item/grenade/discogrenade/subgrenade/prime() +/obj/item/grenade/discogrenade/subgrenade/prime(mob/living/lanced_by) update_mob() var/current_turf = get_turf(src) if(!current_turf) @@ -73,7 +74,7 @@ //Create the lights new /obj/effect/dummy/lighting_obj (current_turf, rand_hex_color(), 4, 1, 10) - for(var/mob/living/carbon/human/M in view(4, src)) + for(var/mob/living/carbon/human/M in hearers(4, src)) forcedance(get_turf(M), M) qdel(src) @@ -108,7 +109,7 @@ M.show_message("You resist your inner urges to break out your best moves.", 2) M.set_drugginess(5) return - if(istype(M.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(istype(M.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) to_chat(M, "THOSE GLOW-IN-THE-DARK NANOTRASEN LIGHTBULBS WON'T CORRUPT ME WITH THEIR AGENDA!") M.emote("scream") return diff --git a/code/game/objects/items/grenades/emgrenade.dm b/code/game/objects/items/grenades/emgrenade.dm index 9b4ad05bca61d..c2e903e48a516 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() for(var/obj/machinery/light/L in range(10, src)) L.on = 1 diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index a521fc56582fb..59bf6cca1d173 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) @@ -14,23 +15,137 @@ do_sparks(rand(5, 9), FALSE, src) playsound(flashbang_turf, 'sound/weapons/flashbang.ogg', 100, TRUE, 8, 0.9) new /obj/effect/dummy/lighting_obj (flashbang_turf, LIGHT_COLOR_WHITE, (flashbang_range + 2), 4, 2) - for(var/mob/living/M in get_hearers_in_view(flashbang_range, flashbang_turf)) + for(var/mob/living/M in viewers(flashbang_range, flashbang_turf)) + flash(get_turf(M), M) + for(var/mob/living/M in hearers(flashbang_range, flashbang_turf)) bang(get_turf(M), M) qdel(src) -/obj/item/grenade/flashbang/proc/bang(turf/T , mob/living/M) +//Flash +/obj/item/grenade/flashbang/proc/flash(turf/T, mob/living/M) if(M.stat == DEAD) //They're dead! return - M.show_message("BANG", 2) var/distance = max(0,get_dist(get_turf(src),T)) + //When distance is 0, will be 1 + //When distance is 7, will be 0 + //Can be less than 0 due to hearers being a circular radius. + var/distance_proportion = max(1 - (distance / flashbang_range), 0) + + if(M.flash_act(intensity = 1, affect_silicon = 1)) + if(distance_proportion) + M.Paralyze(20 * distance_proportion) + M.Knockdown(200 * distance_proportion) + else + M.flash_act(intensity = 2) -//Flash - if(M.flash_act(affect_silicon = 1)) - M.confused += (max(20/max(1,distance), 6)) //Bang +/obj/item/grenade/flashbang/proc/bang(turf/T, mob/living/M) + if(M.stat == DEAD) + return + var/distance = max(0,get_dist(get_turf(src),T)) + M.show_message("BANG", MSG_AUDIBLE) if(!distance || loc == M || loc == M.loc) //Stop allahu akbarring rooms with this. - var/protection = max(1, M.get_ear_protection()) - M.adjustEarDamage(15/protection, 30/protection) + M.Paralyze(20) + M.Knockdown(200) M.soundbang_act(1, 200, 10, 15) else - M.soundbang_act(1, max(200/max(1,distance), 60), rand(3)) + if(distance <= 1) + M.Paralyze(5) + M.Knockdown(30) + + var/distance_proportion = max(1 - (distance / flashbang_range), 0) + if(distance_proportion) + M.soundbang_act(1, 200 * distance_proportion, rand(0, 5)) + +/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) + forceMove(get_turf(C)) + 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) + +//Flash +/obj/item/grenade/stingbang/proc/flash(turf/T, mob/living/M) + if(M.stat == DEAD) + return + var/distance = max(0,get_dist(get_turf(src),T)) + if(M.flash_act(affect_silicon = 1)) + M.Paralyze(max(10/max(1,distance), 5)) + M.Knockdown(max(100/max(1,distance), 60)) + +//Pop +/obj/item/grenade/stingbang/proc/pop(turf/T , mob/living/M) + if(M.stat == DEAD) //They're dead! + return + M.show_message("POP") + var/distance = max(0,get_dist(get_turf(src),T)) + if(!distance || loc == M || loc == M.loc) //Stop allahu akbarring rooms with this. + 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 1725d84dccf07..3553d79faf93b 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 dc5100b420d75..5d6d36f8bd8e6 100644 --- a/code/game/objects/items/grenades/grenade.dm +++ b/code/game/objects/items/grenades/grenade.dm @@ -17,6 +17,23 @@ 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!") @@ -32,18 +49,20 @@ 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 && (clumsy_check == GRENADE_CLUMSY_FUMBLE)) if(prob(50)) to_chat(user, "Huh? How does this thing work?") preprime(user, 5, FALSE) - return FALSE + return TRUE else if(!clumsy && (clumsy_check == GRENADE_NONCLUMSY_FUMBLE)) - to_chat(user, "You pull the pin on [src]. Attached to it is a pink ribbon that says, \"HONK\"") + 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 +75,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)) preprime(user) /obj/item/grenade/proc/log_grenade(mob/user, turf/T) @@ -70,12 +97,23 @@ add_fingerprint(user) if(msg) to_chat(user, "You prime [src]! [DisplayTimeText(det_time)]!") + if(shrapnel_type && shrapnel_radius) + shrapnel_initialized = TRUE + AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_radius) playsound(src, 'sound/weapons/armbomb.ogg', volume, 1) active = TRUE icon_state = initial(icon_state) + "_active" + SEND_SIGNAL(src, COMSIG_GRENADE_ARMED, det_time, delayoverride) addtimer(CALLBACK(src, .proc/prime), isnull(delayoverride)? det_time : delayoverride) -/obj/item/grenade/proc/prime() +/obj/item/grenade/proc/prime(mob/living/lanced_by) + 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)) diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index d074076efa6f1..340ae55ccf318 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -55,18 +55,21 @@ return ..() -/obj/item/grenade/plastic/prime() +/obj/item/grenade/plastic/prime(mob/living/lanced_by) + . = ..() var/turf/location + var/density_check = FALSE if(target) if(!QDELETED(target)) location = get_turf(target) + density_check = target.density //since turfs getting exploded makes this a bit fucky wucky we need to assert whether we should go directional before that part target.cut_overlay(plastic_overlay, TRUE) if(!ismob(target) || full_damage_on_mobs) target.ex_act(EXPLODE_HEAVY, target) else location = get_turf(src) if(location) - if(directional && target && target.density) + if(directional && target && density_check) var/turf/T = get_step(location, aim_dir) explosion(get_step(T, aim_dir), boom_sizes[1], boom_sizes[2], boom_sizes[3]) else @@ -124,7 +127,11 @@ 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() + else if(istype(AM, /mob/living)) + plastic_overlay.layer = FLOAT_LAYER target.add_overlay(plastic_overlay, TRUE) if(!nadeassembly) @@ -204,9 +211,11 @@ 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 40f6dfed3c448..d970b68191190 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, '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 fb83da5ed9218..3562fd367d4ee 100644 --- a/code/game/objects/items/grenades/spawnergrenade.dm +++ b/code/game/objects/items/grenades/spawnergrenade.dm @@ -7,13 +7,14 @@ 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 var/turf/T = get_turf(src) playsound(T, 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/C in viewers(T, null)) + for(var/mob/living/carbon/C in viewers(T)) C.flash_act() // Spawn some hostile syndicate critters and spread them out diff --git a/code/game/objects/items/grenades/syndieminibomb.dm b/code/game/objects/items/grenades/syndieminibomb.dm index 35e9abd9828ef..fb73701f85f17 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 = "\improper 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,15 +54,14 @@ 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) - for(var/turf/T in view(freeze_range,loc)) - if(isfloorturf(T)) - var/turf/open/floor/F = T - F.MakeSlippery(TURF_WET_PERMAFROST, 6 MINUTES) - for(var/mob/living/carbon/L in T) - L.adjustStaminaLoss(stamina_damage) - L.adjust_bodytemperature(-230) + for(var/turf/open/floor/F in view(freeze_range,loc)) + F.MakeSlippery(TURF_WET_PERMAFROST, 6 MINUTES) + for(var/mob/living/carbon/L in F) + L.adjustStaminaLoss(stamina_damage) + L.adjust_bodytemperature(-230) qdel(src) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 490b754140355..35306742a8510 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -36,7 +36,7 @@ throw_range = 5 materials = list(/datum/material/iron=500) breakouttime = 1 MINUTES - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 0) var/cuffsound = 'sound/weapons/handcuffs.ogg' var/trashtype = null //for disposable cuffs @@ -44,24 +44,20 @@ if(!istype(C)) return + SEND_SIGNAL(C, COMSIG_CARBON_CUFF_ATTEMPTED, user) + if(iscarbon(user) && (HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))) to_chat(user, "Uh... how do those things work?!") apply_cuffs(user,user) return - // chance of monkey retaliation - if(ismonkey(C) && prob(MONKEY_CUFF_RETALIATION_PROB)) - var/mob/living/carbon/monkey/M - M = C - M.retaliate(user) - if(!C.handcuffed) if(C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore()) C.visible_message("[user] is trying to put [src.name] on [C]!", \ "[user] is trying to put [src.name] on you!") playsound(loc, cuffsound, 30, 1, -2) - if(do_mob(user, C, 30) && (C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore())) + if(do_mob(user, C, 40) && (C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore())) if(iscyborg(user)) apply_cuffs(C, user, TRUE) else @@ -340,11 +336,11 @@ item_state = "bola" lefthand_file = 'icons/mob/inhands/weapons/thrown_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/thrown_righthand.dmi' - breakouttime = 35//easy to apply, easy to break out of + breakouttime = 20//easy to apply, easy to break out of gender = NEUTER var/knockdown = 0 -/obj/item/restraints/legcuffs/bola/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) +/obj/item/restraints/legcuffs/bola/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, quickstart = TRUE) if(!..()) return playsound(src.loc,'sound/weapons/bolathrow.ogg', 75, 1) @@ -368,7 +364,8 @@ C.update_inv_legcuffed() SSblackbox.record_feedback("tally", "handcuffs", 1, type) to_chat(C, "\The [src] ensnares you!") - C.Paralyze(knockdown) + if(knockdown) + C.Paralyze(knockdown) playsound(src, 'sound/effects/snap.ogg', 50, TRUE) /obj/item/restraints/legcuffs/bola/tactical//traitor variant @@ -395,12 +392,10 @@ w_class = WEIGHT_CLASS_SMALL breakouttime = 60 -/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - if(iscarbon(hit_atom)) - var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom)) - B.Crossed(hit_atom) - qdel(src) - ..() +/obj/item/restraints/legcuffs/bola/energy/ensnare(mob/living/carbon/C) + var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(C)) + B.Crossed(C) + qdel(src) /obj/item/restraints/legcuffs/bola/gonbola name = "gonbola" @@ -411,11 +406,9 @@ slowdown = 0 var/datum/status_effect/gonbolaPacify/effectReference -/obj/item/restraints/legcuffs/bola/gonbola/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) +/obj/item/restraints/legcuffs/bola/gonbola/ensnare(mob/living/carbon/C) . = ..() - if(iscarbon(hit_atom)) - var/mob/living/carbon/C = hit_atom - effectReference = C.apply_status_effect(STATUS_EFFECT_GONBOLAPACIFY) + effectReference = C.apply_status_effect(STATUS_EFFECT_GONBOLAPACIFY) /obj/item/restraints/legcuffs/bola/gonbola/dropped(mob/user) . = ..() diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index 5288c329d6eab..9ec6fb3d92eeb 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -49,8 +49,8 @@ else ..() -/obj/item/his_grace/CtrlClick(mob/user) //you can't pull his grace - return +/obj/item/his_grace/can_be_pulled(user, grab_state, force) + return FALSE /obj/item/his_grace/examine(mob/user) . = ..() @@ -76,14 +76,14 @@ user.forceMove(get_turf(src)) user.visible_message("[user] scrambles out of [src]!", "You climb out of [src]!") -/obj/item/his_grace/process() +/obj/item/his_grace/process(delta_time) if(!bloodthirst) drowse() return if(bloodthirst < HIS_GRACE_CONSUME_OWNER && !ascended) - adjust_bloodthirst(1 + FLOOR(LAZYLEN(contents) * 0.5, 1)) //Maybe adjust this? + adjust_bloodthirst((1 + FLOOR(LAZYLEN(contents) * 0.5, 1)) * delta_time) //Maybe adjust this? else - adjust_bloodthirst(1) //don't cool off rapidly once we're at the point where His Grace consumes all. + adjust_bloodthirst(1 * delta_time) //don't cool off rapidly once we're at the point where His Grace consumes all. var/mob/living/master = get_atom_on_turf(src, /mob/living) if(istype(master) && (src in master.held_items)) switch(bloodthirst) @@ -117,7 +117,7 @@ L.visible_message("[src] lunges at [L]!", "[src] lunges at you!") do_attack_animation(L, null, src) playsound(L, 'sound/weapons/smash.ogg', 50, 1) - playsound(L, 'sound/misc/desceration-01.ogg', 50, 1) + playsound(L, 'sound/misc/desecration-01.ogg', 50, 1) L.adjustBruteLoss(force) adjust_bloodthirst(-5) //Don't stop attacking they're right there! else @@ -138,6 +138,8 @@ move_gracefully() /obj/item/his_grace/proc/move_gracefully() + SIGNAL_HANDLER + if(!awakened) return var/static/list/transforms @@ -179,7 +181,7 @@ var/victims = 0 meal.visible_message("[src] swings open and devours [meal]!", "[src] consumes you!") meal.adjustBruteLoss(200) - playsound(meal, 'sound/misc/desceration-02.ogg', 75, 1) + playsound(meal, 'sound/misc/desecration-02.ogg', 75, 1) playsound(src, 'sound/items/eatfood.ogg', 100, 1) meal.forceMove(src) force_bonus += HIS_GRACE_FORCE_BONUS diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 72068e57a3473..b4b8f1a6b4141 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -13,7 +13,7 @@ desc = "Deus Vult." icon_state = "knight_templar" item_state = "knight_templar" - armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "stamina" = 40) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH strip_delay = 80 @@ -27,13 +27,14 @@ 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, /obj/item/tank/internals/plasmaman) slowdown = 0 blocks_shove_knockdown = FALSE + move_sound = null /obj/item/choice_beacon/holy name = "armaments beacon" desc = "Contains a set of armaments for the chaplain that have been reinforced with a silver and beryllium-bronze alloy, providing immunity to magic and its influences." /obj/item/choice_beacon/holy/canUseBeacon(mob/living/user) - if(user.mind?.isholy) + if(user.mind?.holy_role) return ..() else playsound(src, 'sound/machines/buzz-sigh.ogg', 40, 1) @@ -117,6 +118,7 @@ /obj/item/storage/box/holy/witchhunter/PopulateContents() new /obj/item/clothing/suit/armor/riot/chaplain/witchhunter(src) new /obj/item/clothing/head/helmet/chaplain/witchunter_hat(src) + new /obj/item/clothing/neck/crucifix(src) /obj/item/clothing/suit/armor/riot/chaplain/witchhunter name = "witchunter garb" @@ -132,6 +134,49 @@ item_state = "witchhunterhat" flags_cover = HEADCOVERSEYES +/obj/item/storage/box/holy/graverobber + name = "Grave Robber Kit" + +/obj/item/storage/box/holy/graverobber/PopulateContents() + new /obj/item/clothing/suit/armor/riot/chaplain/graverobber_coat(src) + new /obj/item/clothing/under/rank/civilian/graverobber_under(src) + new /obj/item/clothing/head/chaplain/graverobber_hat(src) + new /obj/item/clothing/gloves/graverobber_gloves(src) + +/obj/item/clothing/suit/armor/riot/chaplain/graverobber_coat + name = "grave robber coat" + desc = "To those with a keen eye, gold gleams like a dagger's point." + icon_state = "graverobber_coat" + item_state = "graverobber_coat" + body_parts_covered = CHEST|GROIN|LEGS|ARMS + +/obj/item/clothing/head/chaplain/graverobber_hat + name = "grave robber hat" + desc = "A tattered leather hat. It reeks of death." + icon_state = "graverobber_hat" + item_state = "graverobber_hat" + flags_cover = HEADCOVERSEYES + +/obj/item/clothing/gloves/graverobber_gloves + name = "grave robber gloves" + desc = "A pair of leather gloves in poor condition." + icon_state = "graverobber-gloves" + item_state = "graverobber-gloves" + permeability_coefficient = 0.9 + 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 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 20, "stamina" = 0) + +/obj/item/clothing/under/rank/civilian/graverobber_under + name = "grave robber uniform" + desc = "A shirt and some leather pants in poor condition." + icon_state = "graverobber_under" + item_state = "graverobber_under" + item_color = "graverobber_under" + /obj/item/storage/box/holy/adept name = "Divine Adept Kit" @@ -219,7 +264,7 @@ return (BRUTELOSS|FIRELOSS) /obj/item/nullrod/attack_self(mob/user) - if(user.mind && (user.mind.isholy) && !reskinned) + if(user.mind && (user.mind.holy_role) && !reskinned) reskin_holy_weapon(user) /obj/item/nullrod/proc/reskin_holy_weapon(mob/M) @@ -432,20 +477,6 @@ attack_verb = list("chopped", "sliced", "cut", "zandatsu'd") hitsound = 'sound/weapons/rapierhit.ogg' -/obj/item/nullrod/Hypertool - icon = 'icons/obj/device.dmi' - icon_state = "hypertool" - item_state = "hypertool" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - slot_flags = ITEM_SLOT_BELT - name = "hypertool" - desc = "A tool so powerful even you cannot perfectly use it." - armour_penetration = 35 - damtype = BRAIN - attack_verb = list("pulsed", "mended", "cut") - hitsound = 'sound/effects/sparks4.ogg' - /obj/item/nullrod/scythe/spellblade icon_state = "spellblade" item_state = "spellblade" @@ -473,6 +504,9 @@ /obj/item/nullrod/scythe/talking/attack_self(mob/living/user) if(possessed) return + if(!(GLOB.ghost_role_flags & GHOSTROLE_STATION_SENTIENCE)) + to_chat(user, "Anomalous otherworldly energies block you from awakening the blade!") + return to_chat(user, "You attempt to wake the spirit of the blade...") @@ -517,7 +551,6 @@ tool_behaviour = TOOL_SAW toolspeed = 0.5 //faster than normal saw - /obj/item/nullrod/hammmer icon_state = "hammeron" item_state = "hammeron" @@ -647,7 +680,7 @@ /obj/item/nullrod/carp/attack_self(mob/living/user) if(used_blessing) - else if(user.mind && (user.mind.isholy)) + else if(user.mind && (user.mind.holy_role)) to_chat(user, "You are blessed by Carp-Sie. Wild space carp will no longer attack you.") user.faction |= "carp" used_blessing = TRUE @@ -719,3 +752,32 @@ righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' w_class = WEIGHT_CLASS_NORMAL attack_verb = list("bashes", "smacks", "whacks") + +/obj/item/nullrod/hypertool + icon = 'icons/obj/device.dmi' + icon_state = "hypertool" + item_state = "hypertool" + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + slot_flags = ITEM_SLOT_BELT + name = "hypertool" + desc = "A tool so powerful even you cannot perfectly use it." + armour_penetration = 35 + damtype = BRAIN + attack_verb = list("pulsed", "mended", "cut") + hitsound = 'sound/effects/sparks4.ogg' + +/obj/item/nullrod/spear + name = "ancient spear" + desc = "An ancient spear made of brass, I mean gold, I mean bronze. It looks highly mechanical." + icon_state = "ratvarian_spear" + item_state = "ratvarian_spear" + lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi' + righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi' + icon = 'icons/obj/clockwork_objects.dmi' + slot_flags = ITEM_SLOT_BELT + armour_penetration = 10 + sharpness = IS_SHARP_ACCURATE + w_class = WEIGHT_CLASS_BULKY + attack_verb = list("stabbed", "poked", "slashed", "clocked") + hitsound = 'sound/weapons/bladeslice.ogg' diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm index 417ef03d2d4ce..b00602df9f004 100644 --- a/code/game/objects/items/implants/implant.dm +++ b/code/game/objects/items/implants/implant.dm @@ -88,6 +88,7 @@ if(user) log_combat(user, target, "implanted", "\a [name]") + SEND_SIGNAL(src, COMSIG_IMPLANT_IMPLANTED, target, user, silent, force) return TRUE /obj/item/implant/proc/removed(mob/living/source, silent = FALSE, special = 0) @@ -101,7 +102,8 @@ var/mob/living/carbon/human/H = source H.sec_hud_set_implants() - return 1 + SEND_SIGNAL(src, COMSIG_IMPLANT_REMOVED, source, silent, special) + return TRUE /obj/item/implant/Destroy() if(imp_in) @@ -112,5 +114,5 @@ return "No information available" /obj/item/implant/dropped(mob/user) - . = 1 + . = TRUE ..() diff --git a/code/game/objects/items/implants/implant_abductor.dm b/code/game/objects/items/implants/implant_abductor.dm index 2a12868e3a69f..b551e06e56d69 100644 --- a/code/game/objects/items/implants/implant_abductor.dm +++ b/code/game/objects/items/implants/implant_abductor.dm @@ -5,28 +5,22 @@ icon_state = "implant" activated = 1 var/obj/machinery/abductor/pad/home - var/cooldown = 30 + COOLDOWN_DECLARE(abductor_implant_cooldown) /obj/item/implant/abductor/activate() . = ..() - if(cooldown == initial(cooldown)) - home.Retrieve(imp_in,1) - cooldown = 0 - START_PROCESSING(SSobj, src) - else - to_chat(imp_in, "You must wait [30 - cooldown] seconds to use [src] again!") + if(!COOLDOWN_FINISHED(src, abductor_implant_cooldown)) + to_chat(imp_in, "You must wait [COOLDOWN_TIMELEFT(src, abductor_implant_cooldown)*0.1] seconds to use [src] again!") + return -/obj/item/implant/abductor/process() - if(cooldown < initial(cooldown)) - cooldown++ - if(cooldown == initial(cooldown)) - STOP_PROCESSING(SSobj, src) + home.Retrieve(imp_in,1) + COOLDOWN_START(src, abductor_implant_cooldown, 60 SECONDS) /obj/item/implant/abductor/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) if(..()) var/obj/machinery/abductor/console/console if(ishuman(target)) - var/datum/antagonist/abductor/A = target.mind.has_antag_datum(/datum/antagonist/abductor) + 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 diff --git a/code/game/objects/items/implants/implant_bb.dm b/code/game/objects/items/implants/implant_bb.dm new file mode 100644 index 0000000000000..bc873a09e2fcb --- /dev/null +++ b/code/game/objects/items/implants/implant_bb.dm @@ -0,0 +1,66 @@ +/obj/item/implant/bloodbrother + name = "communication implant" + desc = "Use this to communicate with your fellow blood brother(s)." + icon = 'icons/obj/radio.dmi' + icon_state = "headset" + item_color = "r" + var/implant_colour = "#ff0000" + var/list/linked_implants // All other implants that this communicates to + +/obj/item/implant/bloodbrother/Initialize() + . = ..() + linked_implants = list() + +/obj/item/implant/bloodbrother/activate() + . = ..() + if(linked_implants.len) + var/input = stripped_input(imp_in, "Enter a message to communicate to your blood brother(s).", "Radio Implant", "") + if(!input || imp_in.stat == DEAD) + return + if(CHAT_FILTER_CHECK(input)) + to_chat(imp_in, "The message contains prohibited words!") + return + + var/my_message = "[imp_in]: [input]" //add sender, color source with syndie color + var/ghost_message = "[imp_in] -> Blood Brothers: [input]" + + to_chat(imp_in, my_message) // Sends message to the user + for(var/obj/item/implant/bloodbrother/i in linked_implants) // Sends message to all linked implnats + var/M = i.imp_in + to_chat(M, my_message) + for(var/M in GLOB.dead_mob_list) // Sends message to ghosts + var/link = FOLLOW_LINK(M, imp_in) + to_chat(M, "[link] [ghost_message]") + + imp_in.log_talk(input, LOG_SAY, tag="Blood Brother Implant") + else + to_chat(imp_in, "There are no linked implants!") + +/obj/item/implant/bloodbrother/Destroy() + . = ..() + for(var/obj/item/implant/bloodbrother/i in linked_implants) // Removes this implant from the list of implants + i.linked_implants -= src + +/obj/item/implant/bloodbrother/proc/link_implant(var/obj/item/implant/bloodbrother/BB) + if(BB) + if(BB == src) // Don't want to put this implant into itself + return + linked_implants |= BB + BB.linked_implants |= src + +/obj/item/implant/bloodbrother/get_data() + var/dat = {"Implant Specifications:
      + Name: Donk Corp(tm) Initiate Communication Implant
      + Life: Indefinite.
      + Important Notes: Illegal
      +
      + Implant Details:
      + Function: Contains a small, directly linked radio device along with a small speaker and microphone. Allows communication between two similar implants.
      "} + return dat + +/obj/item/implanter/bloodbrother + name = "implanter (communication)" + imp_type = /obj/item/implant/bloodbrother + + + diff --git a/code/game/objects/items/implants/implant_camera.dm b/code/game/objects/items/implants/implant_camera.dm new file mode 100644 index 0000000000000..503ccee06baf6 --- /dev/null +++ b/code/game/objects/items/implants/implant_camera.dm @@ -0,0 +1,35 @@ +/obj/item/implant/camera + name = "camera implant" + desc = "Watchful eye inside you." + activated = FALSE + var/obj/machinery/camera/camera + +/obj/item/implant/camera/get_data() + var/dat = {"Implant Specifications:
      + Name: Camera Implant
      + Life: 24 hours after death of host
      + Implant Details:
      + Function: Remote surveillance of implanted subject."} + return dat + +/obj/item/implant/camera/on_implanted(mob/user) + camera = new (user) //Insert the camera directly into the mob so the camera actually shows what it sees + camera.c_tag = "IMPLANT #[rand(1, 999)]" + camera.network = list("ss13") + camera.internal_light = FALSE //No AI camera light + +/obj/item/implant/camera/removed(mob/living/source, silent, special) + . = ..() + if(.) + QDEL_NULL(camera) + return TRUE + return FALSE + +/obj/item/implanter/camera + name = "implanter (camera)" + imp_type = /obj/item/implant/camera + +/obj/item/implantcase/camera + name = "implant case - 'Camera'" + desc = "A glass case containing a camera implant." + imp_type = /obj/item/implant/camera diff --git a/code/game/objects/items/implants/implant_deathrattle.dm b/code/game/objects/items/implants/implant_deathrattle.dm new file mode 100644 index 0000000000000..8ba61bbc5bbb5 --- /dev/null +++ b/code/game/objects/items/implants/implant_deathrattle.dm @@ -0,0 +1,79 @@ +/datum/deathrattle_group + var/name + var/list/implants = list() + +/datum/deathrattle_group/New(name) + if(name) + src.name = name + else + // Give the group a unique name for debugging, and possible future + // use for making custom linked groups. + src.name = "[rand(100,999)] [pick(GLOB.phonetic_alphabet)]" + +/* + * Proc called by new implant being added to the group. Listens for the + * implant being implanted, removed and destroyed. + * + * If implant is already implanted in a person, then trigger the implantation + * code. + */ +/datum/deathrattle_group/proc/register(obj/item/implant/deathrattle/implant) + if(implant in implants) + return + RegisterSignal(implant, COMSIG_IMPLANT_IMPLANTED, .proc/on_implant_implantation) + RegisterSignal(implant, COMSIG_IMPLANT_REMOVED, .proc/on_implant_removal) + RegisterSignal(implant, COMSIG_PARENT_QDELETING, .proc/on_implant_destruction) + + implants += implant + + if(implant.imp_in) + on_implant_implantation(implant.imp_in) + +/datum/deathrattle_group/proc/on_implant_implantation(obj/item/implant/implant, mob/living/target, mob/user, silent = FALSE, force = FALSE) + SIGNAL_HANDLER + + RegisterSignal(target, COMSIG_MOB_STATCHANGE, .proc/on_user_statchange) + +/datum/deathrattle_group/proc/on_implant_removal(obj/item/implant/implant, mob/living/source, silent = FALSE, special = 0) + SIGNAL_HANDLER + + UnregisterSignal(source, COMSIG_MOB_STATCHANGE) + +/datum/deathrattle_group/proc/on_implant_destruction(obj/item/implant/implant) + SIGNAL_HANDLER + + implants -= implant + +/datum/deathrattle_group/proc/on_user_statchange(mob/living/owner, new_stat) + SIGNAL_HANDLER + + if(new_stat != DEAD) + return + + var/name = owner.mind ? owner.mind.name : owner.real_name + var/area = get_area_name(get_turf(owner)) + + for(var/_implant in implants) + var/obj/item/implant/deathrattle/implant = _implant + + // Skip the unfortunate soul, and any unimplanted implants + if(implant.imp_in == owner || !implant.imp_in) + continue + + // Deliberately the same message framing as nanite message + ghost deathrattle + to_chat(implant.imp_in, "You hear a strange, robotic voice in your head... \"[name] has died at [area].\"") + +/obj/item/implant/deathrattle + name = "deathrattle implant" + desc = "Hope no one else dies, prepare for when they do." + + activated = FALSE + +/obj/item/implant/deathrattle/can_be_implanted_in(mob/living/target) + // Can be implanted in anything that's a mob. Syndicate cyborgs, talking fish, humans... + return TRUE + +/obj/item/implantcase/deathrattle + name = "implant case - 'Deathrattle'" + desc = "A glass case containing a deathrattle implant." + imp_type = /obj/item/implant/deathrattle diff --git a/code/game/objects/items/implants/implant_exile.dm b/code/game/objects/items/implants/implant_exile.dm index 9cdcac16fdf0f..5a526a31b1040 100644 --- a/code/game/objects/items/implants/implant_exile.dm +++ b/code/game/objects/items/implants/implant_exile.dm @@ -42,22 +42,22 @@ if(SSticker.current_state <= GAME_STATE_PREGAME) return TRUE var/turf/T = get_turf(parent) - if (!T) + if(!T) return FALSE - if (is_station_level(T.z)) // Are they on the station Z-level? If so trigger relocate() + if(is_station_level(T.z)) // Are they on the station Z-level? If so trigger relocate() return FALSE return TRUE //Override to plop the disk back to a syndie crew spawn rather than somewhere on the station. /datum/component/stationloving/hotelloving/relocate() - var/mob/Hotelstaff = parent - if(ismob(Hotelstaff)) + var/mob/hotelstaff = parent + if(ismob(hotelstaff)) if(!QDELETED(src)) // if you don't do this the body gets continuously dusted forever. While this is funny, an infinitely large pile of remains that crashes clients on right click isn't. qdel(src) - to_chat(Hotelstaff,"The implant's anti-escape mechanisms activate!") - Hotelstaff.dust() // Nice try hotel staff - message_admins("[ADMIN_LOOKUPFLW(Hotelstaff)] tried to enter the station as hotel staff and was dusted.") + to_chat(hotelstaff,"The implant's anti-escape mechanisms activate!") + hotelstaff.dust() // Nice try hotel staff + message_admins("[ADMIN_LOOKUPFLW(hotelstaff)] tried to enter the station as hotel staff and was dusted.") else qdel(src) // This should only ever be applied to mobs diff --git a/code/game/objects/items/implants/implant_gang.dm b/code/game/objects/items/implants/implant_gang.dm deleted file mode 100644 index 02b4744e14b38..0000000000000 --- a/code/game/objects/items/implants/implant_gang.dm +++ /dev/null @@ -1,75 +0,0 @@ -/obj/item/implant/gang - name = "gang implant" - desc = "Makes you a gangster or such." - activated = 0 - var/datum/team/gang/gang - -/obj/item/implant/gang/Initialize(loc, setgang) - ..() - gang = setgang - -/obj/item/implant/gang/get_data() - var/dat = {"Implant Specifications:
      - Name: Criminal brainwash implant
      - Life: A few seconds after injection.
      - Important Notes: Illegal
      -
      - Implant Details:
      - Function: Contains a small pod of nanobots that change the host's brain to be loyal to a certain organization.
      - Special Features: This device will also emit a small EMP pulse, destroying any other implants within the host's brain.
      - Integrity: Implant's EMP function will destroy itself in the process."} - return dat - -/obj/item/implant/gang/implant(mob/living/target, mob/user, silent = 0) - if(!target || !target.mind || target.stat == DEAD) - return 0 - var/datum/antagonist/gang/G = target.mind.has_antag_datum(/datum/antagonist/gang) - if(G && G.gang == G) - return 0 // it's pointless - if(..()) - for(var/obj/item/implant/I in target.implants) - if(I != src) - qdel(I) - - if(ishuman(target)) - var/success - if(G) - if(!istype(G, /datum/antagonist/gang/boss)) - success = TRUE //Was not a gang boss, convert as usual - target.mind.remove_antag_datum(/datum/antagonist/gang) - else - success = TRUE - if(!success) - target.visible_message("[target] seems to resist the implant!", "You feel the influence of your enemies try to invade your mind!") - return FALSE - target.mind.add_antag_datum(/datum/antagonist/gang, gang) - qdel(src) - return TRUE - -/obj/item/implanter/gang - name = "implanter (gang)" - -/obj/item/implanter/gang/Initialize(loc, gang) - if(!gang) - qdel(src) - return - imp = new /obj/item/implant/gang(src,gang) - ..() - - - -/obj/item/implant/mindshield/implant(mob/living/target, mob/user, silent = FALSE) //putting this here, pls no bulli. - qwerty - if(..()) - if(!target.mind) - return TRUE - if(target.mind.has_antag_datum(/datum/antagonist/gang/boss)) - if(!silent) - target.visible_message("[target] seems to resist the implant!", "You feel something interfering with your mental conditioning, but you resist it!") - removed(target, 1) - qdel(src) - return FALSE - target.mind.remove_antag_datum(/datum/antagonist/gang) - if(!silent) - to_chat(target, "You feel a sense of peace and security. You are now protected from brainwashing.") - return TRUE - return FALSE diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index 72aba65050525..1e61bc136443d 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -78,17 +78,28 @@ name = "health implant" activated = 0 var/healthstring = "" + var/list/raw_data = list() -/obj/item/implant/health/proc/sensehealth() +/obj/item/implant/health/proc/sensehealth(get_list = FALSE) if (!imp_in) return "ERROR" else if(isliving(imp_in)) var/mob/living/L = imp_in healthstring = "Oxygen Deprivation Damage => [round(L.getOxyLoss())]
      Fire Damage => [round(L.getFireLoss())]
      Toxin Damage => [round(L.getToxLoss())]
      Brute Force Damage => [round(L.getBruteLoss())]
      " - if (!healthstring) + raw_data = list() //Reset list + raw_data["oxy"] = list("[round(L.getOxyLoss())]") //Suffocation + raw_data["burn"] = list("[round(L.getFireLoss())]") //Burn + raw_data["tox"] = list("[round(L.getToxLoss())]") //Tox + raw_data["brute"] = list("[round(L.getBruteLoss())]") //Brute + if(!healthstring) //I have no idea who made it go this order but okay. healthstring = "ERROR" - return healthstring + if(!length(raw_data)) + raw_data = list("ERROR") + if(!get_list) + return healthstring + else + return raw_data /obj/item/implant/radio name = "internal radio implant" @@ -96,6 +107,7 @@ var/obj/item/radio/radio var/radio_key var/subspace_transmission = FALSE + var/radio_silent = TRUE icon = 'icons/obj/radio.dmi' icon_state = "walkietalkie" @@ -113,10 +125,15 @@ radio.name = "internal radio" radio.subspace_transmission = subspace_transmission radio.canhear_range = -1 + radio.radio_silent = radio_silent if(radio_key) radio.keyslot = new radio_key radio.recalculateChannels() +/obj/item/implant/radio/Destroy() + QDEL_NULL(radio) + return ..() + /obj/item/implant/radio/mining radio_key = /obj/item/encryptionkey/headset_cargo @@ -146,16 +163,6 @@ if(!user.mind.has_antag_datum(/datum/antagonist/incursion)) user.visible_message("[imp_in] starts beeping ominously!", "You have a sudden feeling of dread. The implant is rigged to explode!") playsound(user, 'sound/items/timer.ogg', 30, 0) - sleep(50) - playsound(user, 'sound/items/timer.ogg', 30, 0) - sleep(40) - playsound(user, 'sound/items/timer.ogg', 30, 0) - sleep(30) - playsound(user, 'sound/items/timer.ogg', 30, 0) - sleep(20) - playsound(user, 'sound/items/timer.ogg', 30, 0) - sleep(10) - playsound(user, 'sound/items/timer.ogg', 30, 0) explosion(src,0,0,2,2, flame_range = 2) user.gib(1) qdel(src) diff --git a/code/game/objects/items/implants/implant_track.dm b/code/game/objects/items/implants/implant_track.dm index d0455905eb9bf..4370bf908b21f 100644 --- a/code/game/objects/items/implants/implant_track.dm +++ b/code/game/objects/items/implants/implant_track.dm @@ -2,8 +2,12 @@ name = "tracking implant" desc = "Track with this." activated = FALSE - var/lifespan_postmortem = 6000 //for how many deciseconds after user death will the implant work? - var/allow_teleport = TRUE //will people implanted with this act as teleporter beacons? + ///for how many deciseconds after user death will the implant work? + var/lifespan_postmortem = 6000 + ///will people implanted with this act as teleporter beacons? + var/allow_teleport = TRUE + ///The id of the timer that's qdeleting us + var/timerid /obj/item/implant/tracking/c38 name = "TRAC implant" @@ -13,7 +17,11 @@ /obj/item/implant/tracking/c38/Initialize() . = ..() - QDEL_IN(src, lifespan) + timerid = QDEL_IN(src, lifespan) + +/obj/item/implant/tracking/c38/Destroy() + deltimer(timerid) + return ..() /obj/item/implant/tracking/New() ..() diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm index e7375a7dcad03..cab3cf9d4a901 100644 --- a/code/game/objects/items/implants/implantchair.dm +++ b/code/game/objects/items/implants/implantchair.dm @@ -36,7 +36,7 @@ if(!ui) ui = new(user, src, "implantchair") ui.open() - + ui.set_autoupdate(TRUE) /obj/machinery/implantchair/ui_data() var/list/data = list() @@ -197,7 +197,7 @@ return FALSE if(ishuman(C)) var/mob/living/carbon/human/H = C - if(istype(H.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(istype(H.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) to_chat(H, "Your trusty tinfoil hat shorts out the implant as it plunges into your skull!") H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 75) H.emote("scream") diff --git a/code/game/objects/items/implants/implantpad.dm b/code/game/objects/items/implants/implantpad.dm index 7bcf3c8638ae6..82fdf8131cb98 100644 --- a/code/game/objects/items/implants/implantpad.dm +++ b/code/game/objects/items/implants/implantpad.dm @@ -32,7 +32,6 @@ . = ..() /obj/item/implantpad/AltClick(mob/user) - ..() if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return if(!case) diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index a3d000c1d220c..57297f93dbc7b 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -27,7 +27,7 @@ flags_1 = CONDUCT_1 attack_verb = list("attacked", "stabbed", "poked") hitsound = 'sound/weapons/bladeslice.ogg' - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30, "stamina" = 0) var/datum/reagent/forkload //used to eat omelette /obj/item/kitchen/fork/suicide_act(mob/living/carbon/user) @@ -56,36 +56,6 @@ else return ..() -/obj/item/kitchen/knife/poison - name = "venom knife" - icon_state = "poisonknife" - force = 12 - throwforce = 15 - throw_speed = 5 - throw_range = 7 - var/amount_per_transfer_from_this = 5 - var/list/possible_transfer_amounts - desc = "An infamous knife of syndicate design, it has a tiny hole going through the blade to the handle which stores toxins." - materials = null - -/obj/item/kitchen/knife/poison/Initialize() - . = ..() - create_reagents(40,OPENCONTAINER) - possible_transfer_amounts = list(3,5) - -/obj/item/kitchen/knife/poison/attack_self(mob/user) - if(possible_transfer_amounts.len) - var/i=0 - for(var/A in possible_transfer_amounts) - i++ - if(A == amount_per_transfer_from_this) - if(i[src]'s transfer amount is now [amount_per_transfer_from_this] units.
      ") - return - /obj/item/kitchen/knife/poison/attack(mob/living/M, mob/user) if (!istype(M)) return @@ -116,7 +86,7 @@ materials = list(/datum/material/iron=12000) attack_verb = list("slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") sharpness = IS_SHARP_ACCURATE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 0) var/bayonet = FALSE //Can this be attached to a gun? custom_price = 30 @@ -160,11 +130,41 @@ w_class = WEIGHT_CLASS_NORMAL custom_price = 60 +/obj/item/kitchen/knife/poison + name = "venom knife" + icon_state = "poisonknife" + force = 12 + throwforce = 15 + throw_speed = 5 + throw_range = 7 + var/amount_per_transfer_from_this = 5 + var/list/possible_transfer_amounts + desc = "An infamous knife of syndicate design, it has a tiny hole going through the blade to the handle which stores toxins." + materials = null + +/obj/item/kitchen/knife/poison/Initialize() + . = ..() + create_reagents(40,OPENCONTAINER) + possible_transfer_amounts = list(3,5) + +/obj/item/kitchen/knife/poison/attack_self(mob/user) + if(possible_transfer_amounts.len) + var/i=0 + for(var/A in possible_transfer_amounts) + i++ + if(A == amount_per_transfer_from_this) + if(i[src]'s transfer amount is now [amount_per_transfer_from_this] units.
      ") + return + /obj/item/kitchen/knife/combat name = "combat knife" icon_state = "buckknife" desc = "A military combat utility survival knife." - embedding = list("embedded_pain_multiplier" = 4, "embed_chance" = 65, "embedded_fall_chance" = 10, "embedded_ignore_throwspeed_threshold" = TRUE) + embedding = list("pain_mult" = 4, "embed_chance" = 65, "fall_chance" = 10, "ignore_throwspeed_threshold" = TRUE, "armour_block" = 60) force = 20 throwforce = 20 attack_verb = list("slashed", "stabbed", "sliced", "tore", "ripped", "cut") @@ -173,7 +173,7 @@ /obj/item/kitchen/knife/combat/survival name = "survival knife" icon_state = "survivalknife" - embedding = list("embedded_pain_multiplier" = 4, "embed_chance" = 35, "embedded_fall_chance" = 10) + embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10, "armour_block" = 40) desc = "A hunting grade survival knife." force = 15 throwforce = 15 @@ -186,7 +186,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("embedded_pain_multiplier" = 4, "embed_chance" = 35, "embedded_fall_chance" = 10) + embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10, "armour_block" = 40) force = 15 throwforce = 15 materials = list() @@ -208,7 +208,27 @@ throwforce = 12//fuck git materials = list() attack_verb = list("shanked", "shivved") - 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, "stamina" = 0) + +// Shank - Makeshift weapon that can embed on throw +/obj/item/kitchen/knife/shank + name = "Shank" + desc = "A crude knife fashioned by wrapping some cable around a glass shard. It looks like it could be thrown with some force.. and stick. Good to throw at someone chasing you" + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "shank" + item_state = "shank" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + force = 8 // 3 more than base glass shard + throwforce = 8 + throw_speed = 5 //yeets + armour_penetration = 10 //spear has 10 armour pen, I think its fitting another glass tipped item should have it too + embedding = list("embedded_pain_multiplier" = 6, "embed_chance" = 40, "embedded_fall_chance" = 5, "armour_block" = 30) // Incentive to disengage/stop chasing when stuck + attack_verb = list("stuck", "shanked") + +/obj/item/kitchen/knife/shank/suicide_act(mob/user) + user.visible_message("[user] is slitting [user.p_their()] [pick("wrists", "throat")] with the shank! It looks like [user.p_theyre()] trying to commit suicide.") + return (BRUTELOSS) /obj/item/kitchen/rollingpin name = "rolling pin" @@ -225,4 +245,3 @@ /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!") return BRUTELOSS -/* Trays moved to /obj/item/storage/bag */ diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index 40127f2a28b42..c95a9edda097b 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -73,47 +73,47 @@
    • Width: 1.8m
    • Top speed: 5km/hour
    • Operation in vacuum/hostile environment: Possible -
    • Airtank Volume: 500liters
    • +
    • Airtank Volume: 500 liters
    • Devices:
      • Hydraulic Clamp
      • High-speed Drill
    • -
    • Propulsion Device: Powercell-powered electro-hydraulic system.
    • -
    • Powercell capacity: Varies.
    • +
    • Propulsion Device: Electro-hydraulic system.
    • +
    • Power cell capacity: Varies.
    • Construction:

        -
      1. Connect all exosuit parts to the chassis frame
      2. -
      3. Connect all hydraulic fittings and tighten them up with a wrench
      4. -
      5. Adjust the servohydraulics with a screwdriver
      6. -
      7. Wire the chassis. (Cable is not included.)
      8. +
      9. Connect all exosuit parts to the chassis frame.
      10. +
      11. Connect all hydraulic fittings and tighten them up with a wrench.
      12. +
      13. Adjust the servohydraulics with a screwdriver.
      14. +
      15. Wire the chassis (cable is not included).
      16. Use the wirecutters to remove the excess cable if needed.
      17. -
      18. Install the central control module (Not included. Use supplied datadisk to create one).
      19. +
      20. Install the central control module (not included. Use supplied datadisk to create one).
      21. Secure the mainboard with a screwdriver.
      22. -
      23. Install the peripherals control module (Not included. Use supplied datadisk to create one).
      24. -
      25. Secure the peripherals control module with a screwdriver
      26. -
      27. Install the internal armor plating (Not included due to Nanotrasen regulations. Can be made using 5 iron sheets.)
      28. -
      29. Secure the internal armor plating with a wrench
      30. -
      31. Weld the internal armor plating to the chassis
      32. -
      33. Install the external reinforced armor plating (Not included due to Nanotrasen regulations. Can be made using 5 reinforced iron sheets.)
      34. -
      35. Secure the external reinforced armor plating with a wrench
      36. -
      37. Weld the external reinforced armor plating to the chassis
      38. +
      39. Install the peripherals control module (not included. Use supplied datadisk to create one).
      40. +
      41. Secure the peripherals control module with a screwdriver.
      42. +
      43. Install the internal armor plating (not included due to Nanotrasen regulations. Can be made using 5 iron sheets).
      44. +
      45. Secure the internal armor plating with a wrench.
      46. +
      47. Weld the internal armor plating to the chassis.
      48. +
      49. Install the external reinforced armor plating (not included due to Nanotrasen regulations. Can be made using 5 reinforced iron sheets).
      50. +
      51. Secure the external reinforced armor plating with a wrench.
      52. +
      53. Weld the external reinforced armor plating to the chassis.
      54. Additional Information:
      55. The firefighting variation is made in a similar fashion.
      56. A firesuit must be connected to the Firefighter chassis for heat shielding.
      57. Internal armor is plasteel for additional strength.
      58. External armor must be installed in 2 parts, totaling 10 sheets.
      59. -
      60. Completed mech is more resiliant against fire, and is a bit more durable overall
      61. +
      62. Completed mech is more resiliant against fire, and is a bit more durable overall.
      63. Nanotrasen is determined to the safety of its investments employees.
      -

      Operation

      +

      Operation:

      Please consult the Nanotrasen compendium "Robotics for Dummies". "} diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 2ea6afc21809f..37adc1f8a3bc1 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -3,7 +3,7 @@ hitsound_on = 'sound/weapons/blade1.ogg' heat = 3500 max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30, "stamina" = 0) resistance_flags = FIRE_PROOF var/brightness_on = 3 @@ -93,12 +93,13 @@ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' force = 3 throwforce = 5 + throwforce_on = 35 //Does a lot of damage on throw, but will embed hitsound = "swing_hit" //it starts deactivated attack_verb_off = list("tapped", "poked") throw_speed = 3 throw_range = 5 sharpness = IS_SHARP - embedding = list("embed_chance" = 75, "embedded_impact_pain_multiplier" = 10) + embedding = list("embed_chance" = 200, "armour_block" = 60, "max_pain_mult" = 15) armour_penetration = 35 block_level = 1 block_upgrade_walk = 1 @@ -123,8 +124,8 @@ force = 18 //About as much as a spear hitsound = 'sound/weapons/circsawhit.ogg' icon = 'icons/obj/surgery.dmi' - icon_state = "saw" - icon_state_on = "saw" + icon_state = "esaw_0" + icon_state_on = "esaw_1" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' item_color = null //stops icon from breaking when turned on. @@ -142,7 +143,7 @@ var/obj/item/stock_parts/cell/C = R.cell if(active && !(C.use(hitcost))) attack_self(R) - to_chat(R, "It's out of charge!") + balloon_alert(R, "Out of charge") return return ..() @@ -215,13 +216,13 @@ if(!hacked) hacked = TRUE item_color = "rainbow" - to_chat(user, "RNBW_ENGAGE") + balloon_alert(user, "RNBW_ENGAGE") if(active) icon_state = "swordrainbow" user.update_inv_hands() else - to_chat(user, "It's already fabulous!") + balloon_alert(user, "It's already fabulous!") else return ..() @@ -267,6 +268,10 @@ spark_system.set_up(5, 0, src) spark_system.attach(src) +/obj/item/melee/transforming/energy/blade/Destroy() + QDEL_NULL(spark_system) + return ..() + /obj/item/melee/transforming/energy/blade/transform_weapon(mob/living/user, supress_message_text) return diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 0b3a5edb3ffdc..1805f2d146e93 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -136,6 +136,27 @@ user.death(FALSE) REMOVE_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT) +/obj/item/melee/sabre/mime + name = "Bread Blade" + desc = "An elegant weapon, it has an inscription on it that says: \"La Gluten Gutter\"." + force = 18 + icon_state = "rapier" + item_state = "rapier" + lefthand_file = null + righthand_file = null + block_power = 60 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + +/obj/item/melee/sabre/mime/on_exit_storage(datum/component/storage/concrete/R) + var/obj/item/storage/belt/sabre/mime/M = R.real_location() + if(istype(M)) + playsound(M, 'sound/items/unsheath.ogg', 25, TRUE) + +/obj/item/melee/sabre/on_enter_storage(datum/component/storage/concrete/R) + var/obj/item/storage/belt/sabre/mime/M = R.real_location() + if(istype(M)) + playsound(M, 'sound/items/sheath.ogg', 25, TRUE) + /obj/item/melee/classic_baton name = "classic baton" desc = "A wooden truncheon for beating criminal scum." @@ -185,7 +206,7 @@ . = list() .["visibletrip"] = "[user] has knocked [target]'s legs out from under them with [src]!" - .["localtrip"] = "[user] has knocked your legs out from under you [src]!" + .["localtrip"] = "[user] has knocked your legs out from under you [src]!" .["visibledisarm"] = "[user] has disarmed [target] with [src]!" .["localdisarm"] = "[user] whacks your arm with [src], causing a coursing pain!" .["visiblestun"] = "[user] beat [target] with [src]!" @@ -295,7 +316,7 @@ if(!iscarbon(user)) target.LAssailant = null else - target.LAssailant = user + target.LAssailant = WEAKREF(user) cooldown_check = world.time + cooldown else var/wait_desc = get_wait_description() @@ -380,7 +401,7 @@ //Contractor Baton /obj/item/melee/classic_baton/contractor_baton name = "contractor baton" - desc = "A compact, specialised baton assigned to Syndicate contractors. Applies light electrical shocks to targets." + desc = "A compact, specialised baton assigned to Syndicate contractors. Applies light electric shocks that can resonate with a specific targets brain frequency causing significant stunning effects." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "contractor_baton_0" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' @@ -393,6 +414,9 @@ force = 5 on = FALSE var/knockdown_time_carbon = (1.5 SECONDS) // Knockdown length for carbons. + var/stamina_damage_non_target = 55 + var/stamina_damage_target = 85 + var/target_confusion = 4 SECONDS stamina_damage = 85 affect_silicon = TRUE @@ -407,7 +431,7 @@ force_off = 5 weight_class_on = WEIGHT_CLASS_NORMAL - + var/datum/antagonist/traitor/owner_data = null /obj/item/melee/classic_baton/contractor_baton/get_wait_description() return "The baton is still charging!" @@ -443,6 +467,11 @@ if(!on) return ..() + if(!owner_data || owner_data?.owner?.current != user) + return ..() + + var/is_target = owner_data.contractor_hub?.current_contract?.contract?.target == target.mind + add_fingerprint(user) if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50)) to_chat(user, "You hit yourself over the head.") @@ -499,9 +528,15 @@ user.do_attack_animation(target) playsound(get_turf(src), on_stun_sound, 75, 1, -1) - target.Knockdown(knockdown_time_carbon) - target.drop_all_held_items() - target.adjustStaminaLoss(stamina_damage) + if(is_target) + target.Knockdown(knockdown_time_carbon) + target.drop_all_held_items() + target.adjustStaminaLoss(stamina_damage) + if(target.confused < 6 SECONDS) + target.confused = min(target.confused + target_confusion, 6 SECONDS) + else + target.Knockdown(knockdown_time_carbon) + target.adjustStaminaLoss(stamina_damage_non_target) additional_effects_carbon(target, user) log_combat(user, target, "stunned", src) @@ -519,6 +554,14 @@ if (wait_desc) to_chat(user, wait_desc) +/obj/item/melee/classic_baton/contractor_baton/pickup(mob/user) + . = ..() + if(!owner_data) + var/datum/antagonist/traitor/traitor_data = user.mind.has_antag_datum(/datum/antagonist/traitor) + if(traitor_data) + owner_data = traitor_data + to_chat(user, "[src] scans your genetic data as you pick it up, creating an uplink with the syndicate database. Attacking your current target will stun and mute them, however the baton is weak against non-targets.") + // Supermatter Sword /obj/item/melee/supermatter_sword name = "supermatter sword" @@ -634,7 +677,7 @@ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' slot_flags = ITEM_SLOT_BELT - force = 0.001 + force = 0.001 //"Some attack noises shit" reach = 3 w_class = WEIGHT_CLASS_NORMAL attack_verb = list("flogged", "whipped", "lashed", "disciplined") @@ -642,47 +685,43 @@ /obj/item/melee/curator_whip/attack(mob/living/target, mob/living/user) . = ..() - var/mob/living/carbon/human/H = target - var/mob/living/carbon/human/U = user - if(ishuman(target)) - if((user.zone_selected == BODY_ZONE_CHEST) || (user.zone_selected == BODY_ZONE_HEAD) || (user.zone_selected == BODY_ZONE_PRECISE_GROIN)) - if(H.getarmor(type = "melee") < 16) - H.emote("scream") - H.visible_message("[U] whips [H]!", "[U] whips you! It stings!") - if((user.zone_selected == BODY_ZONE_R_LEG) || (user.zone_selected == BODY_ZONE_L_LEG)) - var/dist = get_dist(H, U) - if(dist < 2) - to_chat(user, "[H] is too close to trip with the whip!") - return - else - target.Knockdown(30) - log_combat(user, target, "tripped", src) - H.visible_message("[U] trips [H]!", "[U] whips your legs out from under you!") - return - if(user.zone_selected == BODY_ZONE_L_ARM) - var/obj/item/I = H.get_held_items_for_side("left") - if(I) - if(H.dropItemToGround(I)) - H.visible_message("[I] is yanked off [H]'s hand by [src]!","[U] grabs [I] with [src]!") - if(!user.get_inactive_held_item()) - U.throw_mode_on() - U.swap_hand() - I.throw_at(user, 10, 2) - to_chat(user, "You pull [I] towards yourself.") - log_combat(user, target, "disarmed", src) - H.visible_message("[U] disarms [H]!", "[U] disarmed you!") - if(user.zone_selected == BODY_ZONE_R_ARM) - var/obj/item/I = H.get_held_items_for_side("right") - if(I) - if(H.dropItemToGround(I)) - H.visible_message("[I] is yanked off [H]'s hand by [src]!","[U] grabs [I] with [src]!") - to_chat(user, "You pull [I] towards yourself.") - if(!user.get_inactive_held_item()) - U.throw_mode_on() - U.swap_hand() - I.throw_at(user, 10, 2) + if(!ishuman(target)) + return + + switch(user.zone_selected) + if(BODY_ZONE_L_ARM) + whip_disarm(user, target, "left") + if(BODY_ZONE_R_ARM) + whip_disarm(user, target, "right") + if(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) + whip_trip(user, target) + else + whip_lash(user, target) + +/obj/item/melee/curator_whip/proc/whip_disarm(mob/living/carbon/user, mob/living/target, side) + var/obj/item/I = target.get_held_items_for_side(side) + if(I) + if(target.dropItemToGround(I)) + target.visible_message("[I] is yanked out of [target]'s hands by [src]!","[user] grabs [I] out of your hands with [src]!") + to_chat(user, "You yank [I] towards yourself.") log_combat(user, target, "disarmed", src) - H.visible_message("[user] disarms [H]!", "[U] disarmed you!") + if(!user.get_inactive_held_item()) + user.throw_mode_on() + user.swap_hand() + I.throw_at(user, 10, 2) + +/obj/item/melee/curator_whip/proc/whip_trip(mob/living/user, mob/living/target) //this is bad and ugly but not as bad and ugly as the original code + if(get_dist(user, target) < 2) + to_chat(user, "[target] is too close to trip with the whip!") + return + target.Knockdown(3 SECONDS) + log_combat(user, target, "tripped", src) + target.visible_message("[user] knocks [target] off [target.p_their()] feet!", "[user] yanks your legs out from under you!") + +/obj/item/melee/curator_whip/proc/whip_lash(mob/living/user, mob/living/target) + if(target.getarmor(type = "melee") < 16) + target.emote("scream") + target.visible_message("[user] whips [target]!", "[user] whips you! It stings!") /obj/item/melee/roastingstick name = "advanced roasting stick" diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm index 21cce03275051..5a9ce7a1c1f35 100644 --- a/code/game/objects/items/melee/transforming.dm +++ b/code/game/objects/items/melee/transforming.dm @@ -18,7 +18,7 @@ if(active) return ..() return 0 - + /obj/item/melee/transforming/Initialize() . = ..() @@ -28,6 +28,8 @@ else if(attack_verb_off.len) attack_verb = attack_verb_off + if(embedding) + updateEmbedding() if(is_sharp()) AddComponent(/datum/component/butchering, 50, 100, 0, hitsound, !active) @@ -59,6 +61,8 @@ attack_verb = attack_verb_on icon_state = icon_state_on w_class = w_class_on + if(embedding) + updateEmbedding() else force = initial(force) throwforce = initial(throwforce) @@ -68,6 +72,8 @@ attack_verb = attack_verb_off icon_state = initial(icon_state) w_class = initial(w_class) + if(embedding) + disableEmbedding() if(is_sharp()) var/datum/component/butchering/BT = LoadComponent(/datum/component/butchering) BT.butchering_enabled = TRUE @@ -85,7 +91,7 @@ /obj/item/melee/transforming/proc/transform_messages(mob/living/user, supress_message_text) playsound(user, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, 1) //changed it from 50% volume to 35% because deafness if(!supress_message_text) - to_chat(user, "[src] [active ? "is now active":"can now be concealed"].") + balloon_alert(user, "[src] [active ? "is now active":"can now be concealed"]") /obj/item/melee/transforming/proc/clumsy_transform_effect(mob/living/user) if(clumsy_check && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index 0ca51831c1373..06f375375e33d 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -14,7 +14,7 @@ /obj/item/choice_beacon name = "choice beacon" - desc = "Hey, why are you viewing this?!! Please let Centcom know about this odd occurance." + desc = "Hey, why are you viewing this?!! Please let CentCom know about this odd occurrence." icon = 'icons/obj/device.dmi' icon_state = "gangtool-blue" item_state = "radio" @@ -61,7 +61,7 @@ msg = "You hear something crackle in your ears for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows: Item request received. Your package is inbound, please stand back from the landing site. Message ends.\"" to_chat(M, msg) - new /obj/effect/DPtarget(get_turf(src), pod) + new /obj/effect/pod_landingzone(get_turf(src), pod) /obj/item/choice_beacon/hero name = "heroic beacon" @@ -77,7 +77,6 @@ hero_item_list[initial(A.name)] = A return hero_item_list - /obj/item/storage/box/hero name = "Courageous Tomb Raider - 1940's." @@ -111,7 +110,7 @@ /obj/item/storage/box/hero/ghostbuster/PopulateContents() new /obj/item/clothing/glasses/welding/ghostbuster(src) - new /obj/item/storage/belt/fannypack/bustin(src) + new /obj/item/storage/belt/fannypack/bustin(src) new /obj/item/clothing/gloves/color/black(src) new /obj/item/clothing/shoes/jackboots(src) new /obj/item/clothing/under/color/khaki/buster(src) @@ -193,7 +192,7 @@ maximum_size = 4 to_chat(user, "You upgrade the [src] with the [wand].
      ") playsound(user, 'sound/weapons/emitter2.ogg', 25, 1, -1) - + /obj/item/clothing/head/that/bluespace/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() if(!proximity_flag) @@ -306,3 +305,79 @@ item_state = "wand" w_class = WEIGHT_CLASS_SMALL var/used = FALSE + +/obj/item/choice_beacon/pet + name = "animal delivery beacon" + desc = "There are no faster ways, only more humane." + var/default_name = "Bacon" + var/mob_choice = /mob/living/simple_animal/pet/dog/corgi/exoticcorgi + +/obj/item/choice_beacon/pet/generate_options(mob/living/M) + var/input_name = stripped_input(M, "What would you like your new pet to be named?", "New Pet Name", default_name, MAX_NAME_LEN) + if(!input_name) + return + spawn_mob(M,input_name) + uses-- + if(!uses) + qdel(src) + else + to_chat(M, "[uses] use[uses > 1 ? "s" : ""] remaining on the [src].") + +/obj/item/choice_beacon/pet/proc/spawn_mob(mob/living/M,name) + var/obj/structure/closet/supplypod/bluespacepod/pod = new() + var/mob/your_pet = new mob_choice(pod) + pod.explosionSize = list(0,0,0,0) + your_pet.name = name + your_pet.real_name = name + var/msg = "After making your selection, you notice a strange target on the ground. It might be best to step back!" + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(istype(H.ears, /obj/item/radio/headset)) + msg = "You hear something crackle in your ears for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows: One pet delivery straight from Central Command. Stand clear! Message ends.\"" + to_chat(M, msg) + new /obj/effect/pod_landingzone(get_turf(src), pod) + +/obj/item/choice_beacon/pet/cat + name = "cat delivery beacon" + default_name = "Tom" + mob_choice = /mob/living/simple_animal/pet/cat + +/obj/item/choice_beacon/pet/mouse + name = "mouse delivery beacon" + default_name = "Jerry" + mob_choice = /mob/living/simple_animal/mouse + +/obj/item/choice_beacon/pet/corgi + name = "corgi delivery beacon" + default_name = "Tosha" + mob_choice = /mob/living/simple_animal/pet/dog/corgi + +/obj/item/choice_beacon/pet/hamster + name = "hamster delivery beacon" + default_name = "Doctor" + mob_choice = /mob/living/simple_animal/pet/hamster + +/obj/item/choice_beacon/pet/pug + name = "pug delivery beacon" + default_name = "Silvestro" + mob_choice = /mob/living/simple_animal/pet/dog/pug + +/obj/item/choice_beacon/pet/ems + name = "emotional support animal delivery beacon" + default_name = "Hugsie" + mob_choice = /mob/living/simple_animal/pet/cat/kitten + +/obj/item/choice_beacon/pet/pingu + name = "penguin delivery beacon" + default_name = "Pingu" + mob_choice = /mob/living/simple_animal/pet/penguin/baby + +/obj/item/choice_beacon/pet/clown + name = "living lube delivery beacon" + default_name = "Offensive" + mob_choice = /mob/living/simple_animal/hostile/retaliate/clown/lube + +/obj/item/choice_beacon/pet/goat + name = "goat delivery beacon" + default_name = "Billy" + mob_choice = /mob/living/simple_animal/hostile/retaliate/goat diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 4b8da3a8cf477..145eec0563ef3 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -7,7 +7,7 @@ righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' force = 8 throwforce = 10 - block_upgrade_walk = 1 + block_upgrade_walk = 1 block_level = 1 block_power = 20 throw_speed = 3 @@ -90,7 +90,8 @@ throw_range = 4 mopspeed = 8 var/refill_enabled = TRUE //Self-refill toggle for when a janitor decides to mop with something other than water. - var/refill_rate = 1 //Rate per process() tick mop refills itself + /// Amount of reagent to refill per second + var/refill_rate = 0.5 var/refill_reagent = /datum/reagent/water //Determins what reagent to use for refilling, just in case someone wanted to make a HOLY MOP OF PURGING /obj/item/mop/advanced/New() @@ -106,10 +107,10 @@ to_chat(user, "You set the condenser switch to the '[refill_enabled ? "ON" : "OFF"]' position.") playsound(user, 'sound/machines/click.ogg', 30, 1) -/obj/item/mop/advanced/process() - - if(reagents.total_volume < mopcap) - reagents.add_reagent(refill_reagent, refill_rate) +/obj/item/mop/advanced/process(delta_time) + var/amadd = min(mopcap - reagents.total_volume, refill_rate * delta_time) + if(amadd > 0) + reagents.add_reagent(refill_reagent, amadd) /obj/item/mop/advanced/examine(mob/user) . = ..() @@ -127,8 +128,8 @@ desc = "A mop with a sharpened handle. Careful!" name = "sharpened mop" force = 10 - throwforce = 15 + throwforce = 18 throw_speed = 4 attack_verb = list("mopped", "stabbed", "shanked", "jousted") sharpness = IS_SHARP - embedding = list("embedded_impact_pain_multiplier" = 3) \ No newline at end of file + embedding = list("armour_block" = 40) diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index 464721cec1ff4..37dff990631aa 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -30,6 +30,7 @@ return ..() /obj/item/pet_carrier/Exited(atom/movable/occupant) + . = ..() if(occupant in occupants && isliving(occupant)) var/mob/living/L = occupant occupants -= occupant diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index ca86767d92c18..f20ddfeebc697 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -68,8 +68,8 @@ var/turf/here = get_turf(src) var/turf/there = get_turf(target) - if(here.z != there.z) - if(here.z > there.z) + if(here.get_virtual_z_level() != there.get_virtual_z_level()) + if(here.get_virtual_z_level() > there.get_virtual_z_level()) add_overlay("pinon_below[icon_suffix]") else add_overlay("pinon_above[icon_suffix]") @@ -94,17 +94,27 @@ var/has_owner = FALSE var/pinpointer_owner = null +/obj/item/pinpointer/crew/examine(mob/user) + . = ..() + if(!active || !target) + return + . += "It is currently tracking [target]." + /obj/item/pinpointer/crew/proc/trackable(mob/living/carbon/human/H) var/turf/here = get_turf(src) - if((H.z == 0 || H.z == here.z || (is_station_level(here.z) && is_station_level(H.z))) && istype(H.w_uniform, /obj/item/clothing/under)) + if((H.z == 0 || H.get_virtual_z_level() == here.get_virtual_z_level() || (is_station_level(here.z) && is_station_level(H.z))) && istype(H.w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = H.w_uniform + //Suit sensors radio transmitter must not be jammed. + if(U.is_jammed()) + return FALSE + // Suit sensors must be on maximum. if(!U.has_sensor || (U.sensor_mode < SENSOR_COORDS && !ignore_suit_sensor_level)) return FALSE var/turf/there = get_turf(H) - return (H.z != 0 || (there && ((there.z == here.z) || (is_station_level(there.z) && is_station_level(here.z))))) + return (H.z != 0 || (there && ((there.get_virtual_z_level() == here.get_virtual_z_level()) || (is_station_level(there.z) && is_station_level(here.z))))) return FALSE diff --git a/code/game/objects/items/pitchfork.dm b/code/game/objects/items/pitchfork.dm new file mode 100644 index 0000000000000..15509e3996bf3 --- /dev/null +++ b/code/game/objects/items/pitchfork.dm @@ -0,0 +1,88 @@ +/obj/item/pitchfork + icon_state = "pitchfork0" + lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' + name = "pitchfork" + desc = "A simple tool used for moving hay." + force = 7 + throwforce = 15 + block_level = 1 + block_upgrade_walk = 1 + w_class = WEIGHT_CLASS_BULKY + attack_verb = list("attacked", "impaled", "pierced") + hitsound = 'sound/weapons/bladeslice.ogg' + sharpness = IS_SHARP + max_integrity = 200 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30, "stamina" = 0) + resistance_flags = FIRE_PROOF + +/obj/item/pitchfork/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_unwielded=7, force_wielded=15, block_power_wielded=25, icon_wielded="pitchfork1") + +/obj/item/pitchfork/update_icon() + icon_state = "pitchfork0" + ..() + +/obj/item/pitchfork/demonic + name = "demonic pitchfork" + desc = "A red pitchfork, it looks like the work of the devil." + force = 19 + throwforce = 24 + +/obj/item/pitchfork/demonic/Initialize() + . = ..() + set_light(3,6,LIGHT_COLOR_RED) + +/obj/item/pitchfork/demonic/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_unwielded=19, force_wielded=25, block_power_wielded=25) + +/obj/item/pitchfork/demonic/greater + force = 24 + throwforce = 50 + +/obj/item/pitchfork/demonic/greater/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_unwielded=24, force_wielded=34, block_power_wielded=25) + +/obj/item/pitchfork/demonic/ascended + force = 100 + throwforce = 100 + +/obj/item/pitchfork/demonic/ascended/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_unwielded=100, force_wielded=500000) // Kills you DEAD + +/obj/item/pitchfork/suicide_act(mob/user) + user.visible_message("[user] impales [user.p_them()]self in [user.p_their()] abdomen with [src]! It looks like [user.p_theyre()] trying to commit suicide!") + return (BRUTELOSS) + +/obj/item/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.", \ + "\"As you pick up [src] your arms ignite, reminding you of all your past sins.\"") + if(ishuman(U)) + var/mob/living/carbon/human/H = U + H.apply_damage(rand(force/2, force), BURN, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + else + U.adjustFireLoss(rand(force/2,force)) + +/obj/item/pitchfork/demonic/attack(mob/target, mob/living/carbon/human/user) + if(user.mind && user.owns_soul() && !is_devil(user)) + to_chat(user, "[src] burns in your hands.") + user.apply_damage(rand(force/2, force), BURN, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + ..() + +/obj/item/pitchfork/demonic/ascended/afterattack(atom/target, mob/user, proximity) + . = ..() + if(!proximity || !ISWIELDED(src)) + return + if(iswallturf(target)) + var/turf/closed/wall/W = target + user.visible_message("[user] blasts \the [target] with \the [src]!") + playsound(target, 'sound/magic/disintegrate.ogg', 100, TRUE) + W.break_wall() + W.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) + return diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index b7fa326a3c161..7ba64dd56f8d7 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -36,6 +36,7 @@ /obj/item/toy/plush/Initialize() . = ..() AddComponent(/datum/component/squeak, squeak_override) + AddElement(/datum/element/bed_tuckable, 6, -5, 90) //have we decided if Pinocchio goes in the blue or pink aisle yet? if(gender == NEUTER) @@ -159,19 +160,19 @@ //we are not catholic if(young == TRUE || Kisser.young == TRUE) - user.show_message("[src] plays tag with [Kisser].", 1, - "They're happy.", 0) + user.show_message("[src] plays tag with [Kisser].", MSG_VISUAL, + "They're happy.", NONE) Kisser.cheer_up() cheer_up() //never again else if(Kisser in scorned) //message, visible, alternate message, neither visible nor audible - user.show_message("[src] rejects the advances of [Kisser]!", 1, - "That didn't feel like it worked.", 0) + user.show_message("[src] rejects the advances of [Kisser]!", MSG_VISUAL, + "That didn't feel like it worked.", NONE) else if(src in Kisser.scorned) - user.show_message("[Kisser] realises who [src] is and turns away.", 1, - "That didn't feel like it worked.", 0) + user.show_message("[Kisser] realises who [src] is and turns away.", MSG_VISUAL, + "That didn't feel like it worked.", NONE) //first comes love else if(Kisser.lover != src && Kisser.partner != src) //cannot be lovers or married @@ -191,8 +192,8 @@ new_lover(Kisser) Kisser.new_lover(src) else - user.show_message("[src] rejects the advances of [Kisser], maybe next time?", 1, - "That didn't feel like it worked, this time.", 0) + user.show_message("[src] rejects the advances of [Kisser], maybe next time?", MSG_VISUAL, + "That didn't feel like it worked, this time.", NONE) //then comes marriage else if(Kisser.lover == src && Kisser.partner != src) //need to be lovers (assumes loving is a two way street) but not married (also assumes similar) @@ -216,7 +217,7 @@ //then oh fuck something unexpected happened else - user.show_message("[Kisser] and [src] don't know what to do with one another.", 0) + user.show_message("[Kisser] and [src] don't know what to do with one another.", NONE) /obj/item/toy/plush/proc/heartbreak(obj/item/toy/plush/Brutus) if(lover != Brutus) @@ -538,6 +539,14 @@ gender = FEMALE squeak_override = list('sound/voice/moth/scream_moth.ogg'=1) +/obj/item/toy/plush/rouny + name = "runner plushie" + desc = "A plushie depicting a xenomorph runner, made to commemorate the centenary of the Battle of LV-426. Much cuddlier than the real thing." + icon_state = "rouny" + icon_state = "rouny" + attack_verb = list("slashes", "bites", "charges") + squeak_override = list('sound/weapons/bite.ogg' = 1) + /obj/item/toy/plush/moth name = "moth plushie" desc = "An adorable mothperson plushy. It's a huggable bug!" @@ -564,3 +573,27 @@ forceMove(random_open_spot) user.dust(just_ash = FALSE, drop_items = TRUE) return MANUAL_SUICIDE + +///////////////// +//DONATOR ITEMS// +///////////////// + +/obj/item/toy/plush/ian + name = "ian plushie" + desc = "Keep him by your side." + icon_state = "ianplush" + +/obj/item/toy/plush/lisa + name = "lisa plushie" + desc = "Keep her by your side." + icon_state = "lisaplush" + +/obj/item/toy/plush/renault + name = "renault plushie" + desc = "AWOOOO!" + icon_state = "renaultplush" + +/obj/item/toy/plush/opa + name = "metal upa" + desc = "You feel like this could have prevented World War 3 in a pararel timeline." + icon_state = "upaplush" diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index ee4b778a6777e..3b1b89a82085d 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -14,7 +14,7 @@ item_state = "bulldog" lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50, "stamina" = 0) var/maxWeightClass = 20 //The max weight of items that can fit into the cannon var/loadedWeightClass = 0 //The weight of items currently in the cannon var/obj/item/tank/internals/tank = null //The gas tank that is drawn from to fire things @@ -160,8 +160,7 @@ if(prob(10)) target = get_turf(user) else - var/list/possible_targets = range(3,src) - target = pick(possible_targets) + target = pick(RANGE_TURFS(3,src)) discharge = 1 if(!discharge) user.visible_message("[user] fires \the [src]!", \ @@ -316,7 +315,7 @@ throw_amount = 1 maxWeightClass = 4 //a single magspear or spear spin_item = FALSE - var/static/list/magspear_typecache = typecacheof(list(/obj/item/throwing_star/magspear, /obj/item/twohanded/spear, /obj/item/stack/rods/fifty, /obj/item/stack/rods, /obj/item/stack/rods/twentyfive, /obj/item/stack/rods/ten, /obj/item/katana, /obj/item/katana/cursed, /obj/item/toy/katana, /obj/item/twohanded/spear/explosive, /obj/item/twohanded/clockwork/brass_spear)) + var/static/list/magspear_typecache = typecacheof(list(/obj/item/throwing_star/magspear, /obj/item/spear, /obj/item/stack/rods/fifty, /obj/item/stack/rods, /obj/item/stack/rods/twentyfive, /obj/item/stack/rods/ten, /obj/item/katana, /obj/item/katana/cursed, /obj/item/toy/katana, /obj/item/spear/explosive, /obj/item/clockwork/weapon/brass_spear)) /obj/item/pneumatic_cannon/speargun/Initialize() . = ..() diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index 281e3085c3d2c..a7b5c858ba734 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -12,7 +12,7 @@ throwforce = 10 throw_range = 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 40, "stamina" = 0) resistance_flags = FIRE_PROOF var/click_delay = 1.5 var/fisto_setting = 1 diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index 11f95f2ef56b4..1e90e3160f547 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -40,7 +40,7 @@ var/has_job_loyalties = LAZYLEN(job_loyalties) var/has_role_loyalties = LAZYLEN(role_loyalties) inspired += user //The user is always inspired, regardless of loyalties - for(var/mob/living/carbon/human/H in range(4, get_turf(src))) + for(var/mob/living/carbon/human/H in viewers(4, get_turf(src))) if(H.stat == DEAD || H == user) continue if(H.mind && (has_job_loyalties || has_role_loyalties)) @@ -120,7 +120,7 @@ category = CAT_MISC /obj/item/banner/medical/special_inspiration(mob/living/carbon/human/H) - H.adjustToxLoss(-15) + H.adjustToxLoss(-15, FALSE, TRUE) H.setOxyLoss(0) H.reagents.add_reagent(/datum/reagent/medicine/inaprovaline, 5) @@ -254,7 +254,7 @@ w_class = WEIGHT_CLASS_BULKY 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) + armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60, "stamina" = 50) /obj/item/clothing/suit/armor/plate/crusader/red icon_state = "crusader-red" @@ -268,7 +268,7 @@ icon_state = "crusader" w_class = WEIGHT_CLASS_NORMAL flags_inv = HIDEHAIR|HIDEEARS|HIDEFACE - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) + armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60, "stamina" = 50) /obj/item/clothing/head/helmet/plate/crusader/blue icon_state = "crusader-blue" @@ -282,7 +282,7 @@ desc = "A religious-looking hat." alternate_worn_icon = 'icons/mob/large-worn-icons/64x64/head.dmi' flags_1 = 0 - 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. + armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 50, "bomb" = 70, "bio" = 50, "rad" = 50, "fire" = 60, "acid" = 60, "stamina" = 60) //religion protects you from disease and radiation, honk. worn_x_dimension = 64 worn_y_dimension = 64 @@ -342,7 +342,7 @@ desc = "Metal boots, they look heavy." icon_state = "crusader" w_class = WEIGHT_CLASS_NORMAL - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //does this even do anything on boots? + armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60, "stamina" = 30) //does this even do anything on boots? clothing_flags = NOSLIP cold_protection = FEET min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index d2da063de5d18..902cbac388106 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -325,7 +325,7 @@ user.visible_message("[user] blares out a near-deafening siren from its speakers!", \ "The siren pierces your hearing and confuses you!", \ "The siren pierces your hearing!") - for(var/mob/living/carbon/M in get_hearers_in_view(9, user)) + for(var/mob/living/carbon/M in hearers(9, user)) if(M.get_ear_protection() == FALSE) M.confused += 6 audible_message("HUMAN HARM") @@ -340,7 +340,7 @@ if(safety == FALSE) user.audible_message("BZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZT") - for(var/mob/living/carbon/C in get_hearers_in_view(9, user)) + for(var/mob/living/carbon/C in hearers(9, user)) var/bang_effect = C.soundbang_act(2, 0, 0, 5) switch(bang_effect) if(1) @@ -446,7 +446,7 @@ A.BB.nodamage = FALSE A.BB.speed = 0.5 playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - A.fire_casing(target, user, params, 0, 0, null, 0, src) + A.fire_casing(target, user, params, 0, 0, null, 0, 1, src) user.visible_message("[user] blasts a flying lollipop at [target]!") check_amount() @@ -462,7 +462,7 @@ A.BB.speed = 0.5 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) + A.fire_casing(target, user, params, 0, 0, null, 0, 1, src) user.visible_message("[user] shoots a high-velocity gumball at [target]!") check_amount() @@ -566,15 +566,17 @@ icon_state = "shield" var/maxenergy = 1500 var/energy = 1500 - var/energy_recharge = 7.5 + /// Recharging rate in energy per second + var/energy_recharge = 37.5 var/energy_recharge_cyborg_drain_coefficient = 0.4 var/cyborg_cell_critical_percentage = 0.05 var/mob/living/silicon/robot/host = null var/datum/proximity_monitor/advanced/dampening_field var/projectile_damage_coefficient = 0.5 - var/projectile_damage_tick_ecost_coefficient = 2 //Lasers get half their damage chopped off, drains 50 power/tick. Note that fields are processed 5 times per second. + /// Energy cost per tracked projectile damage amount per second + var/projectile_damage_tick_ecost_coefficient = 10 var/projectile_speed_coefficient = 1.5 //Higher the coefficient slower the projectile. - var/projectile_tick_speed_ecost = 15 + var/projectile_tick_speed_ecost = 75 var/list/obj/item/projectile/tracked var/image/projectile_effect var/field_radius = 3 @@ -656,38 +658,38 @@ deactivate_field() . = ..() -/obj/item/borg/projectile_dampen/process() - process_recharge() - process_usage() +/obj/item/borg/projectile_dampen/process(delta_time) + process_recharge(delta_time) + process_usage(delta_time) update_location() /obj/item/borg/projectile_dampen/proc/update_location() if(dampening_field) dampening_field.HandleMove() -/obj/item/borg/projectile_dampen/proc/process_usage() +/obj/item/borg/projectile_dampen/proc/process_usage(delta_time) var/usage = 0 for(var/I in tracked) var/obj/item/projectile/P = I if(!P.stun && P.nodamage) //No damage continue - usage += projectile_tick_speed_ecost - usage += (tracked[I] * projectile_damage_tick_ecost_coefficient) + usage += projectile_tick_speed_ecost * delta_time + usage += (tracked[I] * projectile_damage_tick_ecost_coefficient * delta_time) energy = CLAMP(energy - usage, 0, maxenergy) if(energy <= 0) deactivate_field() visible_message("[src] blinks \"ENERGY DEPLETED\".") -/obj/item/borg/projectile_dampen/proc/process_recharge() +/obj/item/borg/projectile_dampen/proc/process_recharge(delta_time) if(!istype(host)) if(iscyborg(host.loc)) host = host.loc else - energy = CLAMP(energy + energy_recharge, 0, maxenergy) + energy = CLAMP(energy + energy_recharge * delta_time, 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) - energy += energy_recharge + host.cell.use(energy_recharge * delta_time * energy_recharge_cyborg_drain_coefficient) + energy += energy_recharge * delta_time /obj/item/borg/projectile_dampen/proc/dampen_projectile(obj/item/projectile/P, track_projectile = TRUE) if(tracked[P]) @@ -784,6 +786,8 @@ ///If we're safely deconstructed, we put the item neatly onto the ground, rather than deleting it. /obj/item/borg/apparatus/proc/safedecon() + SIGNAL_HANDLER + if(stored) stored.forceMove(get_turf(src)) stored = null @@ -808,11 +812,14 @@ /obj/item/borg/apparatus/attack_self(mob/living/silicon/robot/user) if(!stored) return ..() - if(user.client?.keys_held["Alt"]) - stored.forceMove(get_turf(user)) - return stored.attack_self(user) +//Alt click drops stored item +/obj/item/borg/apparatus/AltClick(mob/living/silicon/robot/user) + if(!stored) + return ..() + stored.forceMove(get_turf(user)) + /obj/item/borg/apparatus/pre_attack(atom/A, mob/living/user, params) if(!stored) var/itemcheck = FALSE @@ -844,7 +851,7 @@ /obj/item/borg/apparatus/beaker name = "beaker storage apparatus" - desc = "A special apparatus for carrying beakers without spilling the contents. Alt-Z or right-click to drop the beaker." + desc = "A special apparatus for carrying beakers without spilling the contents." icon_state = "borg_beaker_apparatus" storable = list(/obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle) @@ -859,7 +866,7 @@ if(stored) var/obj/item/reagent_containers/C = stored C.SplashReagents(get_turf(src)) - qdel(stored) + QDEL_NULL(stored) . = ..() /obj/item/borg/apparatus/beaker/examine() @@ -872,6 +879,7 @@ . += "[R.volume] units of [R.name]" else . += "Nothing." + . += "Alt-click will drop the currently stored [stored]." /obj/item/borg/apparatus/beaker/update_icon() cut_overlays() @@ -909,7 +917,7 @@ /obj/item/borg/apparatus/circuit name = "circuit manipulation apparatus" - desc = "A special apparatus for carrying and manipulating circuit boards. Alt-Z or right-click to drop the stored object." + desc = "A special apparatus for carrying and manipulating circuit boards." icon_state = "borg_hardware_apparatus" storable = list(/obj/item/circuitboard, /obj/item/electronics) @@ -941,19 +949,20 @@ . = ..() if(stored) . += "The apparatus currently has [stored] secured." + . += "Alt-click will drop the currently stored [stored]." /obj/item/borg/apparatus/circuit/pre_attack(atom/A, mob/living/user, params) . = ..() if(istype(A, /obj/item/aiModule) && !stored) //If an admin wants a borg to upload laws, who am I to stop them? Otherwise, we can hint that it fails to_chat(user, "This circuit board doesn't seem to have standard robot apparatus pin holes. You're unable to pick it up.") - + //////////////////// //versatile service holder// //////////////////// /obj/item/borg/apparatus/beaker/service name = "versatile service grasper" - desc = "Specially designed for carrying glasses, food and seeds. Alt-Z or right-click to drop the stored object." + desc = "Specially designed for carrying glasses, food and seeds." storable = list(/obj/item/reagent_containers/food, /obj/item/seeds, /obj/item/storage/fancy/donut_box, @@ -969,3 +978,4 @@ . = ..() if(stored) . += "You are currently holding [stored]." + . += "Alt-click will drop the currently stored [stored]." \ No newline at end of file diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 56f3a4f0c88b5..2550ddbae6187 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -293,7 +293,7 @@ if(forced_ai) O.connected_ai = forced_ai if(!lawsync) - O.lawupdate = 0 + O.lawupdate = FALSE if(M.laws.id == DEFAULT_AI_LAWID) O.make_laws() @@ -333,6 +333,9 @@ else if(istype(W, /obj/item/borg/upgrade/ai)) var/obj/item/borg/upgrade/ai/M = W if(check_completion()) + if(!chest.cell) + to_chat(user, "The endoskeleton still needs a power cell!") + return if(!isturf(loc)) to_chat(user, "You cannot install[M], the frame has to be standing on the ground to be perfectly precise!") return diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 40665c09491e3..1b7aed3c1d549 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -9,7 +9,9 @@ var/locked = FALSE var/installed = 0 var/require_module = 0 - var/module_type = null + var/list/module_type = null + /// Bitflags listing module compatibility. Used in the exosuit fabricator for creating sub-categories. + var/list/module_flags = NONE // if true, is not stored in the robot to be ejected // if module is reset var/one_use = FALSE @@ -18,7 +20,7 @@ if(R.stat == DEAD) to_chat(user, "[src] will not function on a deceased cyborg.") return FALSE - if(module_type && !istype(R.module, module_type)) + if(module_type && !is_type_in_list(R.module, module_type)) to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") to_chat(user, "There's no mounting point for the module!") return FALSE @@ -94,7 +96,8 @@ desc = "Used to cool a mounted disabler, increasing the potential current in it and thus its recharge rate." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/security + module_type = list(/obj/item/robot_module/security) + module_flags = BORG_MODULE_SECURITY /obj/item/borg/upgrade/disablercooler/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -142,7 +145,8 @@ desc = "A diamond drill replacement for the mining module's standard drill." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/miner + module_type = list(/obj/item/robot_module/miner) + module_flags = BORG_MODULE_MINER /obj/item/borg/upgrade/ddrill/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -174,7 +178,8 @@ desc = "A satchel of holding replacement for mining cyborg's ore satchel module." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/miner + module_type = list(/obj/item/robot_module/miner) + module_flags = BORG_MODULE_MINER /obj/item/borg/upgrade/soh/action(mob/living/silicon/robot/R) . = ..() @@ -201,7 +206,7 @@ desc = "An upgrade to the mining module granting a self-recharging plasma cutter." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/miner + module_type = list(/obj/item/robot_module/miner) /obj/item/borg/upgrade/cutter/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -221,7 +226,8 @@ desc = "A trash bag of holding replacement for the janiborg's standard trash bag." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/janitor + module_type = list(/obj/item/robot_module/janitor) + module_flags = BORG_MODULE_JANITOR /obj/item/borg/upgrade/tboh/action(mob/living/silicon/robot/R) . = ..() @@ -248,7 +254,8 @@ desc = "An advanced mop replacement for the janiborg's standard mop." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/janitor + module_type = list(/obj/item/robot_module/janitor) + module_flags = BORG_MODULE_JANITOR /obj/item/borg/upgrade/amop/action(mob/living/silicon/robot/R) . = ..() @@ -297,7 +304,8 @@ icon_state = "ash_plating" resistance_flags = LAVA_PROOF | FIRE_PROOF require_module = 1 - module_type = /obj/item/robot_module/miner + module_type = list(/obj/item/robot_module/miner) + module_flags = BORG_MODULE_MINER /obj/item/borg/upgrade/lavaproof/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -315,7 +323,10 @@ icon_state = "cyborg_upgrade5" require_module = 1 var/repair_amount = -1 - var/repair_tick = 1 + /// world.time of next repair + var/next_repair = 0 + /// Minimum time between repairs in seconds + var/repair_cooldown = 4 var/msg_cooldown = 0 var/on = FALSE var/powercost = 10 @@ -338,8 +349,8 @@ /obj/item/borg/upgrade/selfrepair/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() if (.) - toggle_action.Remove(cyborg) - QDEL_NULL(toggle_action) + if(toggle_action) + QDEL_NULL(toggle_action) cyborg = null deactivate_sr() @@ -349,8 +360,8 @@ /obj/item/borg/upgrade/selfrepair/proc/check_dropped() if(loc != cyborg) - toggle_action.Remove(cyborg) - QDEL_NULL(toggle_action) + if(toggle_action) + QDEL_NULL(toggle_action) cyborg = null deactivate_sr() @@ -379,8 +390,7 @@ update_icon() /obj/item/borg/upgrade/selfrepair/process() - if(!repair_tick) - repair_tick = 1 + if(world.time < next_repair) return if(cyborg && (cyborg.stat != DEAD) && on) @@ -407,16 +417,16 @@ cyborg.cell.use(powercost) else cyborg.cell.use(5) - repair_tick = 0 + next_repair = world.time + repair_cooldown * 10 // Multiply by 10 since world.time is in deciseconds - if((world.time - 2000) > msg_cooldown ) + if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_BORG_SELF_REPAIR)) + TIMER_COOLDOWN_START(src, COOLDOWN_BORG_SELF_REPAIR, 200 SECONDS) var/msgmode = "standby" if(cyborg.health < 0) msgmode = "critical" else if(cyborg.health < cyborg.maxHealth) msgmode = "normal" to_chat(cyborg, "Self-repair is active in [msgmode] mode.") - msg_cooldown = world.time else deactivate_sr() @@ -426,7 +436,8 @@ to produce more advanced and complex medical reagents." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/medical + module_type = list(/obj/item/robot_module/medical) + module_flags = BORG_MODULE_MEDICAL var/list/additional_reagents = list() /obj/item/borg/upgrade/hypospray/action(mob/living/silicon/robot/R, user = usr) @@ -482,21 +493,23 @@ defibrillator, for on the scene revival." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/medical + module_type = list(/obj/item/robot_module/medical) + module_flags = BORG_MODULE_MEDICAL /obj/item/borg/upgrade/defib/action(mob/living/silicon/robot/R, user = usr) . = ..() if(.) - var/obj/item/twohanded/shockpaddles/cyborg/S = new(R.module) + var/obj/item/shockpaddles/cyborg/S = new(R.module) R.module.basic_modules += S R.module.add_module(S, FALSE, TRUE) /obj/item/borg/upgrade/defib/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() if (.) - var/obj/item/twohanded/shockpaddles/cyborg/S = locate() in R.module + var/obj/item/shockpaddles/cyborg/S = locate() in R.module R.module.remove_module(S, TRUE) + /obj/item/borg/upgrade/processor name = "medical cyborg surgical processor" desc = "An upgrade to the Medical module, installing a processor \ @@ -504,7 +517,8 @@ out procedures" icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/medical + module_type = list(/obj/item/robot_module/medical, /obj/item/robot_module/syndicate_medical) + module_flags = BORG_MODULE_MEDICAL /obj/item/borg/upgrade/processor/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -558,17 +572,17 @@ R.notransform = TRUE var/prev_lockcharge = R.lockcharge - R.SetLockdown(1) + R.SetLockdown(TRUE) R.anchored = TRUE var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(1, R.loc) + smoke.set_up(TRUE, R.loc) smoke.start() sleep(2) for(var/i in 1 to 4) playsound(R, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, 1, -1) sleep(12) if(!prev_lockcharge) - R.SetLockdown(0) + R.SetLockdown(FALSE) R.anchored = FALSE R.notransform = FALSE R.resize = 2 @@ -589,7 +603,8 @@ icon = 'icons/obj/storage.dmi' icon_state = "borgrped" require_module = TRUE - module_type = /obj/item/robot_module/engineering + module_type = list(/obj/item/robot_module/engineering, /obj/item/robot_module/saboteur) + module_flags = BORG_MODULE_ENGINEERING /obj/item/borg/upgrade/rped/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -617,7 +632,8 @@ icon = 'icons/obj/device.dmi' icon_state = "pinpointer_crew" require_module = TRUE - module_type = /obj/item/robot_module/medical + module_type = list(/obj/item/robot_module/medical, /obj/item/robot_module/syndicate_medical) + module_flags = BORG_MODULE_MEDICAL var/datum/action/crew_monitor /obj/item/borg/upgrade/pinpointer/action(mob/living/silicon/robot/R, user = usr) @@ -670,12 +686,26 @@ icon_state = "cyborg_upgrade3" new_module = /obj/item/robot_module/clown +/obj/item/borg/upgrade/transform/security + name = "borg module picker (Security)" + desc = "Allows you to turn a cyborg into a hunter, HALT!" + icon_state = "cyborg_upgrade3" + new_module = /obj/item/robot_module/security + module_flags = BORG_MODULE_SECURITY + +/obj/item/borg/upgrade/transform/security/action(mob/living/silicon/robot/R, user = usr) + if(CONFIG_GET(flag/disable_secborg)) + to_chat(user, "Nanotrasen policy disallows the use of weapons of mass destruction.") + return FALSE + return ..() + /obj/item/borg/upgrade/circuit_app name = "circuit manipulation apparatus" desc = "An engineering cyborg upgrade allowing for manipulation of circuit boards." icon_state = "cyborg_upgrade3" require_module = TRUE - module_type = /obj/item/robot_module/engineering + module_type = list(/obj/item/robot_module/engineering, /obj/item/robot_module/saboteur) + module_flags = BORG_MODULE_ENGINEERING /obj/item/borg/upgrade/circuit_app/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -701,7 +731,8 @@ desc = "A supplementary beaker storage apparatus for medical cyborgs." icon_state = "cyborg_upgrade3" require_module = TRUE - module_type = /obj/item/robot_module/medical + module_type = list(/obj/item/robot_module/medical) + module_flags = BORG_MODULE_MEDICAL /obj/item/borg/upgrade/beaker_app/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -721,3 +752,102 @@ var/obj/item/borg/apparatus/beaker/extra/E = locate() in R.module.modules if (E) R.module.remove_module(E, TRUE) + + +/obj/item/borg/upgrade/speciality + name = "Speciality Module" + icon_state = "cyborg_upgrade3" + require_module = TRUE + module_type = list(/obj/item/robot_module/butler) + var/obj/item/hat + var/addmodules = list() + var/list/additional_reagents = list() + module_flags = BORG_MODULE_SPECIALITY + +/obj/item/borg/upgrade/speciality/action(mob/living/silicon/robot/R, user = usr) + . = ..() + if(.) + for(var/obj/item/borg/upgrade/SPEC in R.upgrades) + if (istype(SPEC,/obj/item/borg/upgrade/speciality) && SPEC != src) + SPEC.deactivate(R) + R.upgrades -= SPEC + qdel(SPEC) + + + for(var/module in src.addmodules) + var/obj/item/nmodule = locate(module) in R + if (!nmodule) + nmodule = new module(R.module) + R.module.basic_modules += nmodule + R.module.add_module(nmodule, FALSE, TRUE) + + for(var/obj/item/reagent_containers/borghypo/borgshaker/H in R.module.modules) + for(var/re in additional_reagents) + H.add_reagent(re) + + if(hat && R.hat_offset != INFINITY && !R.hat) + var/obj/item/equipt = new hat(src) + if (equipt ) + R.place_on_head(equipt) + +/obj/item/borg/upgrade/speciality/deactivate(mob/living/silicon/robot/R, user = usr) + . = ..() + if (.) + //Remove existing modules indiscriminately + for(var/module in src.addmodules) + var/dmod = locate(module) in R.module.modules + if (dmod) + R.module.remove_module(dmod, TRUE) + for(var/obj/item/reagent_containers/borghypo/borgshaker/H in R.module.modules) + for(var/re in additional_reagents) + H.del_reagent(re) + +/obj/item/borg/upgrade/speciality/kitchen + name = "Cook Speciality" + desc = "A service cyborg upgrade allowing for basic food handling." + hat = /obj/item/clothing/head/chefhat + addmodules = list ( + /obj/item/kitchen/knife, + /obj/item/kitchen/rollingpin, + ) + additional_reagents = list( + /datum/reagent/consumable/enzyme, + /datum/reagent/consumable/sugar, + /datum/reagent/consumable/flour, + /datum/reagent/water, + ) + +/obj/item/borg/upgrade/speciality/botany + name = "Botany Speciality" + desc = "A service cyborg upgrade allowing for plant tending and manipulation." + hat = /obj/item/clothing/head/rice_hat + addmodules = list ( + /obj/item/storage/bag/plants/portaseeder, + /obj/item/cultivator, + /obj/item/plant_analyzer, + /obj/item/shovel/spade, + ) + additional_reagents = list( + /datum/reagent/water, + ) + + +/obj/item/borg/upgrade/speciality/casino + name = "Gambler Speciality" + desc = "It's not crew harm if they do it themselves!" + hat = /obj/item/clothing/head/rabbitears + addmodules = list ( + /obj/item/gobbler, + /obj/item/storage/pill_bottle/dice_cup/cyborg, + /obj/item/toy/cards/deck/cyborg, + ) + +/obj/item/borg/upgrade/speciality/party + name = "Party Speciality" + desc = "The night's still young..." + hat = /obj/item/clothing/head/beanie/rasta + addmodules = list ( + /obj/item/stack/tile/light/cyborg, + /obj/item/crowbar/cyborg, + /obj/item/dance_trance, + ) diff --git a/code/game/objects/items/sharpener.dm b/code/game/objects/items/sharpener.dm index b90a5b155a69e..daed28fd27ce5 100644 --- a/code/game/objects/items/sharpener.dm +++ b/code/game/objects/items/sharpener.dm @@ -18,32 +18,29 @@ if(I.force >= max || I.throwforce >= max)//no esword sharpening to_chat(user, "[I] is much too powerful to sharpen further!") return - if(requires_sharpness && !I.sharpness) + if(requires_sharpness && !I.is_sharp()) to_chat(user, "You can only sharpen items that are already sharp, such as knives!") return if(istype(I, /obj/item/melee/transforming/energy)) to_chat(user, "You don't think \the [I] will be the thing getting modified if you use it on \the [src]!") return - if(istype(I, /obj/item/twohanded))//some twohanded items should still be sharpenable, but handle force differently. therefore i need this stuff - var/obj/item/twohanded/TH = I - if(TH.force_wielded >= max) - to_chat(user, "[TH] is much too powerful to sharpen further!") - return - if(TH.wielded) - to_chat(user, "[TH] must be unwielded before it can be sharpened!") - return - 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 - if(I.force > initial(I.force)) + + var/signal_out = SEND_SIGNAL(I, COMSIG_ITEM_SHARPEN_ACT, increment, max) + if(signal_out & COMPONENT_BLOCK_SHARPEN_MAXED) + to_chat(user, "[I] is much too powerful to sharpen further!") + return + if(signal_out & COMPONENT_BLOCK_SHARPEN_BLOCKED) + to_chat(user, "[I] is not able to be sharpened right now!") + return + if((signal_out & COMPONENT_BLOCK_SHARPEN_ALREADY) || (I.force > initial(I.force) && !signal_out)) to_chat(user, "[I] has already been refined before. It cannot be sharpened further!") return + if(!(signal_out & COMPONENT_BLOCK_SHARPEN_APPLIED)) + I.force = clamp(I.force + increment, 0, max) user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.") playsound(src, 'sound/items/unsheath.ogg', 25, 1) I.sharpness = IS_SHARP_ACCURATE - I.force = CLAMP(I.force + increment, 0, max) - I.throwforce = CLAMP(I.throwforce + 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 ed5f1736bb989..ec9cb8f721ee8 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/shields.dmi' block_level = 1 block_upgrade_walk = 1 - block_flags = BLOCKING_PROJECTILE + block_flags = null block_power = 50 max_integrity = 75 var/transparent = FALSE // makes beam projectiles pass through the shield @@ -21,7 +21,7 @@ var/obj/item/projectile/P = hitby if(P.damage_type != STAMINA)// disablers dont do shit to shields attackforce = (P.damage / 2) - if(isitem(hitby)) + else if(isitem(hitby)) var/obj/item/I = hitby attackforce = damage if(!I.damtype == BRUTE) @@ -255,6 +255,7 @@ throw_speed = 3 max_integrity = 50 block_sound = 'sound/weapons/egloves.ogg' + block_flags = BLOCKING_PROJECTILE 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 diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm new file mode 100644 index 0000000000000..11ae13ed473b4 --- /dev/null +++ b/code/game/objects/items/shrapnel.dm @@ -0,0 +1,68 @@ +/obj/item/shrapnel // frag grenades + name = "shrapnel shard" + embedding = list(embed_chance=70, ignore_throwspeed_threshold=TRUE, fall_chance=4) + 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) + 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) + +/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 + hit_stunned_targets = TRUE + +/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 + +/obj/item/projectile/bullet/pellet/stingball/on_ricochet(atom/A) + hit_stunned_targets = TRUE // ducking will save you from the first wave, but not the rebounds diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index f1a6e02241db8..500b462015d76 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -1,7 +1,7 @@ -/obj/item/twohanded/singularityhammer +/obj/item/singularityhammer name = "singularity hammer" desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows." - icon_state = "mjollnir0" + icon_state = "singularity_hammer0" lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi' flags_1 = CONDUCT_1 @@ -9,60 +9,66 @@ force = 5 attack_weight = 3 block_upgrade_walk = 1 - force_unwielded = 5 - force_wielded = 20 throwforce = 15 throw_range = 1 w_class = WEIGHT_CLASS_HUGE - var/charged = 5 - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "stamina" = 0) resistance_flags = FIRE_PROOF | ACID_PROOF force_string = "LORD SINGULOTH HIMSELF" + var/charged = 5 -/obj/item/twohanded/singularityhammer/New() - ..() +/obj/item/singularityhammer/Initialize() + . = ..() START_PROCESSING(SSobj, src) -/obj/item/twohanded/singularityhammer/Destroy() +/obj/item/singularityhammer/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_multiplier=4, icon_wielded="singularity_hammer1") + +/obj/item/singularityhammer/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/singularityhammer/update_icon_state() + icon_state = "mjollnir0" + ..() + +/obj/item/singularityhammer/Destroy() STOP_PROCESSING(SSobj, src) return ..() -/obj/item/twohanded/singularityhammer/process() +/obj/item/singularityhammer/process() if(charged < 5) charged++ - return -/obj/item/twohanded/singularityhammer/update_icon() //Currently only here to fuck with the on-mob icons. - icon_state = "mjollnir[wielded]" - return +/obj/item/singularityhammer/update_icon() //Currently only here to fuck with the on-mob icons. + icon_state = "singularity_hammer0" -/obj/item/twohanded/singularityhammer/proc/vortex(turf/pull, mob/wielder) - for(var/atom/X in orange(5,pull)) - if(ismovableatom(X)) - var/atom/movable/A = X - if(A == wielder) - continue - if(A && !A.anchored && !ishuman(X)) - step_towards(A,pull) - step_towards(A,pull) - step_towards(A,pull) - else if(ishuman(X)) - var/mob/living/carbon/human/H = X - if(istype(H.shoes, /obj/item/clothing/shoes/magboots)) - var/obj/item/clothing/shoes/magboots/M = H.shoes - if(M.magpulse) - continue - H.apply_effect(20, EFFECT_PARALYZE, 0) - step_towards(H,pull) - step_towards(H,pull) - step_towards(H,pull) +/obj/item/singularityhammer/proc/vortex(turf/pull, mob/wielder) + for(var/atom/movable/A as mob|obj in orange(5,pull)) + if(A == wielder) + continue + if(A && !A.anchored && !ishuman(A)) + step_towards(A,pull) + step_towards(A,pull) + step_towards(A,pull) + else if(ishuman(A)) + var/mob/living/carbon/human/H = A + if(istype(H.shoes, /obj/item/clothing/shoes/magboots)) + var/obj/item/clothing/shoes/magboots/M = H.shoes + if(M.magpulse) + continue + H.apply_effect(20, EFFECT_PARALYZE, 0) + step_towards(H,pull) + step_towards(H,pull) + step_towards(H,pull) return -/obj/item/twohanded/singularityhammer/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity) +/obj/item/singularityhammer/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity) . = ..() if(!proximity) return - if(wielded) + if(ISWIELDED(src)) if(charged == 5) charged = 0 if(istype(A, /mob/living/)) @@ -72,7 +78,7 @@ var/turf/target = get_turf(A) vortex(target,user) -/obj/item/twohanded/mjollnir +/obj/item/mjollnir name = "Mjolnir" desc = "A weapon worthy of a god, able to strike with the force of a lightning bolt. It crackles with barely contained energy." icon_state = "mjollnir0" @@ -81,15 +87,23 @@ flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK force = 5 - force_unwielded = 5 - force_wielded = 25 throwforce = 30 throw_range = 7 block_upgrade_walk = 1 attack_weight = 3 w_class = WEIGHT_CLASS_HUGE -/obj/item/twohanded/mjollnir/proc/shock(mob/living/target) +/obj/item/mjollnir/Initialize() + . = ..() + +/obj/item/mjollnir/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_multiplier=5, icon_wielded="mjollnir1", attacksound="sparks") + +/obj/item/mjollnir/update_icon_state() + icon_state = "mjollnir0" + +/obj/item/mjollnir/proc/shock(mob/living/target) target.Stun(60) var/datum/effect_system/lightning_spread/s = new /datum/effect_system/lightning_spread s.set_up(5, 1, target.loc) @@ -101,17 +115,17 @@ target.throw_at(throw_target, 200, 4) return -/obj/item/twohanded/mjollnir/attack(mob/living/M, mob/user) +/obj/item/mjollnir/attack(mob/living/M, mob/user) ..() - if(wielded) + if(ISWIELDED(src)) playsound(src.loc, "sparks", 50, 1) shock(M) -/obj/item/twohanded/mjollnir/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) +/obj/item/mjollnir/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(isliving(hit_atom)) shock(hit_atom) -/obj/item/twohanded/mjollnir/update_icon() //Currently only here to fuck with the on-mob icons. - icon_state = "mjollnir[wielded]" - return +/obj/item/mjollnir/update_icon() //Currently only here to fuck with the on-mob icons. + icon_state = "mjollnir0" + ..() diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm new file mode 100644 index 0000000000000..2d02e5d8b1f5b --- /dev/null +++ b/code/game/objects/items/spear.dm @@ -0,0 +1,198 @@ +//spears +/obj/item/spear + icon_state = "spearglass0" + lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' + name = "spear" + desc = "A haphazardly-constructed yet still deadly weapon of ancient design." + force = 10 + w_class = WEIGHT_CLASS_BULKY + slot_flags = ITEM_SLOT_BACK + block_upgrade_walk = 1 + throwforce = 20 + throw_speed = 4 + embedding = list("armour_block" = 60) + armour_penetration = 10 + materials = list(/datum/material/iron=1150, /datum/material/glass=2075) + hitsound = 'sound/weapons/bladeslice.ogg' + attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") + sharpness = IS_SHARP + max_integrity = 200 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30, "stamina" = 0) + var/war_cry = "AAAAARGH!!!" + var/icon_prefix = "spearglass" + +/obj/item/spear/ComponentInitialize() + . = ..() + AddComponent(/datum/component/butchering, 100, 70) //decent in a pinch, but pretty bad. + AddComponent(/datum/component/jousting) + AddComponent(/datum/component/two_handed, force_unwielded=10, force_wielded=18, block_power_wielded=25, icon_wielded="[icon_prefix]1") + +/obj/item/spear/update_icon() + icon_state = "[icon_prefix]0" + ..() + +/obj/item/spear/suicide_act(mob/living/carbon/user) + user.visible_message("[user] begins to sword-swallow \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") + return BRUTELOSS + +/obj/item/spear/CheckParts(list/parts_list) + var/obj/item/shard/tip = locate() in parts_list + if(tip) + if (istype(tip, /obj/item/shard/plasma)) + throwforce = 21 + icon_prefix = "spearplasma" + AddComponent(/datum/component/two_handed, force_unwielded=11, force_wielded=19, icon_wielded="[icon_prefix]1") + update_icon() + parts_list -= tip + qdel(tip) + var/obj/item/grenade/G = locate() in parts_list + if(G) + var/obj/item/spear/explosive/lance = new /obj/item/spear/explosive(src.loc, G) + lance.TakeComponent(GetComponent(/datum/component/two_handed)) + lance.throwforce = throwforce + lance.icon_prefix = icon_prefix + parts_list -= G + qdel(src) + return ..() + +/obj/item/spear/explosive + name = "explosive lance" + icon_prefix = "spearbomb" + icon_state = "spearbomb0" + var/obj/item/grenade/explosive = null + +/obj/item/spear/explosive/Initialize(mapload, obj/item/grenade/G) + . = ..() + set_explosive(G) + +/obj/item/spear/explosive/suicide_act(mob/living/carbon/user) + user.visible_message("[user] begins to sword-swallow \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") + user.say("[war_cry]", forced="spear warcry") + explosive.forceMove(user) + explosive.prime() + user.gib() + qdel(src) + return BRUTELOSS + +/obj/item/spear/explosive/proc/set_explosive(obj/item/grenade/G) + if (!G) + G = new /obj/item/grenade/iedcasing() //For admin-spawned explosive lances + G.forceMove(src) + explosive = G + desc = "A makeshift spear with [G] attached to it" + update_icon() + +/obj/item/spear/explosive/CheckParts(list/parts_list) + var/obj/item/grenade/G = locate() in parts_list + if(G) + var/obj/item/spear/lancePart = locate() in parts_list + var/datum/component/two_handed/comp_twohand = lancePart.GetComponent(/datum/component/two_handed) + if(comp_twohand) + var/lance_wielded = comp_twohand.force_wielded + var/lance_unwielded = comp_twohand.force_unwielded + AddComponent(/datum/component/two_handed, force_unwielded=lance_unwielded, force_wielded=lance_wielded) + throwforce = lancePart.throwforce + icon_prefix = lancePart.icon_prefix + parts_list -= G + parts_list -= lancePart + set_explosive(G) + qdel(lancePart) + ..() + +/obj/item/spear/explosive/suicide_act(mob/living/carbon/user) + user.visible_message("[user] begins to sword-swallow \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") + user.say("[war_cry]", forced="spear warcry") + explosive.forceMove(user) + explosive.prime() + user.gib() + qdel(src) + return BRUTELOSS + +/obj/item/spear/explosive/examine(mob/user) + . = ..() + . += "Alt-click to set your war cry." + +/obj/item/spear/explosive/AltClick(mob/user) + if(user.canUseTopic(src, BE_CLOSE)) + ..() + if(istype(user) && loc == user) + var/input = stripped_input(user,"What do you want your war cry to be? You will shout it when you hit someone in melee.", ,"", 50) + if(input) + src.war_cry = input + +/obj/item/spear/explosive/afterattack(atom/movable/AM, mob/user, proximity) + . = ..() + if(!proximity) + return + if(ISWIELDED(src)) + user.say("[war_cry]", forced="spear warcry") + explosive.forceMove(AM) + explosive.prime(lanced_by=user) + qdel(src) + +//GREY TIDE +/obj/item/spear/grey_tide + name = "\improper Grey Tide" + desc = "Recovered from the aftermath of a revolt aboard Defense Outpost Theta Aegis, in which a seemingly endless tide of Assistants caused heavy casualities among Nanotrasen military forces." + attack_verb = list("gored") + force=15 + +/obj/item/spear/grey_tide/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_unwielded=15, force_wielded=25, block_power_wielded=25, icon_wielded="[icon_prefix]1") + +/obj/item/spear/grey_tide/afterattack(atom/movable/AM, mob/living/user, proximity) + . = ..() + if(!proximity) + return + user.faction |= "greytide([REF(user)])" + if(isliving(AM)) + var/mob/living/L = AM + if(istype (L, /mob/living/simple_animal/hostile/illusion)) + return + if(!L.stat && prob(50)) + var/mob/living/simple_animal/hostile/illusion/M = new(user.loc) + M.faction = user.faction.Copy() + M.Copy_Parent(user, 100, user.health/2.5, 12, 30) + M.GiveTarget(L) + +/* + * Bone Spear + */ +/obj/item/spear/bonespear //Blatant imitation of spear, but made out of bone. Not valid for explosive modification. + icon_prefix = "bone_spear" + icon_state = "bone_spear0" + name = "bone spear" + desc = "A haphazardly-constructed yet still deadly weapon. The pinnacle of modern technology." + force = 12 + throwforce = 22 + armour_penetration = 15 //Enhanced armor piercing + +/obj/item/spear/bonespear/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_unwielded=12, force_wielded=20, block_power_wielded=25, icon_wielded="[icon_prefix]1") + +/obj/item/spear/bamboospear + icon_prefix = "bamboo_spear" + icon_state = "bamboo_spear0" + lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' + name = "bamboo spear" + desc = "A haphazardly-constructed bamboo stick with a sharpened tip, ready to poke holes into unsuspecting people." + force = 10 + w_class = WEIGHT_CLASS_BULKY + slot_flags = ITEM_SLOT_BACK + block_upgrade_walk = 1 + throwforce = 22 + throw_speed = 4 + embedding = list("armour_block" = 30) + armour_penetration = 10 + hitsound = 'sound/weapons/bladeslice.ogg' + attack_verb = list("attacked", "poked", "jabbed", "tore", "gored") + sharpness = IS_SHARP + +/obj/item/spear/bamboospear/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_unwielded=10, force_wielded=18, \ + block_power_wielded=25, icon_wielded="[icon_prefix]1") diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 06798404d0be0..25c74bd8fda39 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -11,6 +11,7 @@ var/blink_range = 8 // The teleport range when crushed/thrown at someone. refined_type = /obj/item/stack/sheet/bluespace_crystal grind_results = list(/datum/reagent/bluespace = 20) + scan_state = "rock_BScrystal" /obj/item/stack/ore/bluespace_crystal/refined name = "refined bluespace crystal" @@ -68,8 +69,18 @@ novariants = TRUE grind_results = list(/datum/reagent/bluespace = 20) point_value = 30 + merge_type = /obj/item/stack/sheet/bluespace_crystal var/crystal_type = /obj/item/stack/ore/bluespace_crystal/refined +/obj/item/stack/sheet/bluespace_crystal/fifty + amount = 50 + +/obj/item/stack/sheet/bluespace_crystal/twenty + amount = 20 + +/obj/item/stack/sheet/bluespace_crystal/five + amount = 5 + /obj/item/stack/sheet/bluespace_crystal/attack_self(mob/user)// to prevent the construction menu from ever happening to_chat(user, "You cannot crush the polycrystal in-hand, try breaking one off.") diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm index a06b96ad9c90e..7976bca9de4db 100644 --- a/code/game/objects/items/stacks/cash.dm +++ b/code/game/objects/items/stacks/cash.dm @@ -19,7 +19,7 @@ /obj/item/stack/spacecash/proc/update_desc() var/total_worth = get_item_credit_value() - desc = "It's worth [total_worth] credit[( total_worth > 1 ) ? "s" : ""]" + desc = "It's worth [total_worth] credit[( total_worth > 1 ) ? "s" : ""]." /obj/item/stack/spacecash/get_item_credit_value() return (amount*value) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 53b9823964fdf..1a53a6ec50ca3 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -21,8 +21,10 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ throw_range = 7 materials = list(/datum/material/iron=1000) max_amount = 50 + merge_type = /obj/item/stack/rods attack_verb = list("hit", "bludgeoned", "whacked") hitsound = 'sound/weapons/grenadelaunch.ogg' + embedding = list() novariants = TRUE block_upgrade_walk = 1 diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index dfa938658463f..dba9d6c4590b9 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -9,6 +9,7 @@ * Glass sheets */ GLOBAL_LIST_INIT(glass_recipes, list ( \ + new/datum/stack_recipe("glass shard", /obj/item/shard, time = 0, on_floor = FALSE), \ new/datum/stack_recipe("directional window", /obj/structure/window/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ new/datum/stack_recipe("fulltile window", /obj/structure/window/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ )) @@ -20,7 +21,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ icon_state = "sheet-glass" item_state = "sheet-glass" materials = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100, "stamina" = 0) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/glass grind_results = list(/datum/reagent/silicon = 20) @@ -59,11 +60,12 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ var/obj/item/stack/rods/V = W if (V.get_amount() >= 1 && get_amount() >= 1) var/obj/item/stack/sheet/rglass/RG = new (get_turf(user)) - RG.add_fingerprint(user) + if(!QDELETED(RG)) + RG.add_fingerprint(user) var/replace = user.get_inactive_held_item()==src V.use(1) use(1) - if(QDELETED(src) && replace) + if(QDELETED(src) && replace && !QDELETED(RG)) user.put_in_hands(RG) else to_chat(user, "You need one rod and one sheet of glass to make reinforced glass!") @@ -85,11 +87,12 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ icon_state = "sheet-pglass" item_state = "sheet-pglass" materials = list(/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" = 75, "acid" = 100) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 100, "stamina" = 0) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmaglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10) - + tableVariant = /obj/structure/table/glass/plasma + /obj/item/stack/sheet/plasmaglass/fifty amount = 50 @@ -125,7 +128,8 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ new/datum/stack_recipe("windoor frame", /obj/structure/windoor_assembly, 5, time = 0, on_floor = TRUE, window_checks = TRUE), \ null, \ new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe("window firelock frame", /obj/structure/firelock_frame/window, 2, time = 50, one_per_turf = TRUE, on_floor = TRUE, window_checks = FALSE) \ )) @@ -136,7 +140,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ icon_state = "sheet-rglass" item_state = "sheet-rglass" materials = list(/datum/material/iron=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" = 70, "acid" = 100) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100, "stamina" = 0) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/rglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10) @@ -179,7 +183,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ icon_state = "sheet-prglass" item_state = "sheet-prglass" 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) + armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100, "stamina" = 0) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmarglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10, /datum/reagent/iron = 10) @@ -200,7 +204,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list( icon_state = "sheet-titaniumglass" item_state = "sheet-titaniumglass" materials = list(/datum/material/titanium=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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100, "stamina" = 0) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/titaniumglass @@ -219,7 +223,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( icon_state = "sheet-plastitaniumglass" item_state = "sheet-plastitaniumglass" 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100, "stamina" = 0) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plastitaniumglass @@ -242,10 +246,11 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( attack_verb = list("stabbed", "slashed", "sliced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' resistance_flags = ACID_PROOF - armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100) + armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100, "stamina" = 0) 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/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 3792d5624689e..f42661668e1ee 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -121,6 +121,15 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ recipes = GLOB.diamond_recipes . = ..() +/obj/item/stack/sheet/mineral/diamond/fifty + amount = 50 + +/obj/item/stack/sheet/mineral/diamond/twenty + amount = 20 + +/obj/item/stack/sheet/mineral/diamond/five + amount = 5 + /* * Uranium */ @@ -147,6 +156,15 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \ recipes = GLOB.uranium_recipes . = ..() +/obj/item/stack/sheet/mineral/uranium/fifty + amount = 50 + +/obj/item/stack/sheet/mineral/uranium/twenty + amount = 20 + +/obj/item/stack/sheet/mineral/uranium/five + amount = 5 + /* * Plasma */ @@ -190,6 +208,15 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ atmos_spawn_air("plasma=[amount*10];TEMP=[exposed_temperature]") qdel(src) +/obj/item/stack/sheet/mineral/plasma/fifty + amount = 50 + +/obj/item/stack/sheet/mineral/plasma/twenty + amount = 20 + +/obj/item/stack/sheet/mineral/plasma/five + amount = 5 + /* * Gold */ @@ -219,6 +246,15 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ recipes = GLOB.gold_recipes . = ..() +/obj/item/stack/sheet/mineral/gold/fifty + amount = 50 + +/obj/item/stack/sheet/mineral/gold/twenty + amount = 20 + +/obj/item/stack/sheet/mineral/gold/five + amount = 5 + /* * Silver */ @@ -248,6 +284,15 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ recipes = GLOB.silver_recipes . = ..() +/obj/item/stack/sheet/mineral/silver/fifty + amount = 50 + +/obj/item/stack/sheet/mineral/silver/twenty + amount = 20 + +/obj/item/stack/sheet/mineral/silver/five + amount = 5 + /* * Copper */ @@ -272,6 +317,15 @@ GLOBAL_LIST_INIT(copper_recipes, list ( \ recipes = GLOB.copper_recipes . = ..() +/obj/item/stack/sheet/mineral/copper/fifty + amount = 50 + +/obj/item/stack/sheet/mineral/copper/twenty + amount = 20 + +/obj/item/stack/sheet/mineral/copper/five + amount = 5 + /* * Clown */ @@ -296,6 +350,9 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \ recipes = GLOB.bananium_recipes . = ..() +/obj/item/stack/sheet/mineral/bananium/five + amount = 5 + /* * Titanium */ @@ -325,6 +382,12 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ /obj/item/stack/sheet/mineral/titanium/fifty amount = 50 +/obj/item/stack/sheet/mineral/titanium/twenty + amount = 20 + +/obj/item/stack/sheet/mineral/titanium/five + amount = 5 + /* * Plastitanium @@ -466,3 +529,22 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \ /obj/item/stack/sheet/mineral/coal/ten amount = 10 + +/* + * Wax + */ +/obj/item/stack/sheet/mineral/wax + name = "wax" + icon_state = "sheet-wax" + item_state = "sheet-wax" + singular_name = "wax block" + force = 1 + throwforce = 2 + grind_results = list(/datum/reagent/consumable/honey = 20) + merge_type = /obj/item/stack/sheet/mineral/wax + +GLOBAL_LIST_INIT(wax_recipes, list (new/datum/stack_recipe("Wax tile", /obj/item/stack/tile/mineral/wax, 1, 4, 20))) + +/obj/item/stack/sheet/mineral/wax/Initialize(mapload, new_amount, merge = TRUE) + recipes = GLOB.wax_recipes + . = ..() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 8ab852b0a48c5..e565b3f1e560b 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -20,6 +20,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("chair", /obj/structure/chair, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("shuttle seat", /obj/structure/chair/comfy/shuttle, 2, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \ null, \ new/datum/stack_recipe_list("office chairs", list( \ @@ -38,6 +39,12 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, 1, one_per_turf = TRUE, on_floor = TRUE), new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, 1, one_per_turf = TRUE, on_floor = TRUE), new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, 1, one_per_turf = TRUE, on_floor = TRUE) + )), \ + new/datum/stack_recipe_list("corporate sofas", list( \ + new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa/corp, one_per_turf = TRUE, on_floor = TRUE), \ + new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/corp/left, one_per_turf = TRUE, on_floor = TRUE), \ + new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/corp/right, one_per_turf = TRUE, on_floor = TRUE), \ + new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corp/corner, one_per_turf = TRUE, on_floor = TRUE), \ )), null, \ new/datum/stack_recipe("rack parts", /obj/item/rack_parts), \ @@ -75,6 +82,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ )), \ null, \ new/datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("directional firelock frame", /obj/structure/firelock_frame/border, 3, time = 50, one_per_turf = FALSE, on_floor = TRUE), \ new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ @@ -93,6 +101,8 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ null, \ new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("shower frame", /obj/structure/showerframe, 2, time = 2 SECONDS), \ + new/datum/stack_recipe("sink frame", /obj/structure/sinkframe, 2, time = 2 SECONDS), \ )) /obj/item/stack/sheet/iron @@ -165,7 +175,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ materials = list(/datum/material/iron=2000, /datum/material/plasma=2000) throwforce = 10 flags_1 = CONDUCT_1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80, "stamina" = 0) resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/plasteel grind_results = list(/datum/reagent/iron = 20, /datum/reagent/toxin/plasma = 20) @@ -201,7 +211,9 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new/datum/stack_recipe("dog bed", /obj/structure/bed/dogbed, 10, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("dresser", /obj/structure/dresser, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ 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("display case chassis", /obj/structure/displaycase_chassis, 5, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("easel", /obj/structure/easel, 5, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \ new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\ new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2), \ @@ -229,7 +241,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ item_state = "sheet-wood" icon = 'icons/obj/stack_objects.dmi' sheettype = "wood" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0, "stamina" = 0) resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/mineral/wood novariants = TRUE @@ -271,6 +283,8 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("mining satchel", /obj/item/storage/bag/ore, 4), \ new/datum/stack_recipe("chemistry bag", /obj/item/storage/bag/chemistry, 4), \ new/datum/stack_recipe("bio bag", /obj/item/storage/bag/bio, 4), \ + new/datum/stack_recipe("construction bag", /obj/item/storage/bag/construction, 4), \ + new/datum/stack_recipe("sheet snatcher", /obj/item/storage/bag/sheetsnatcher, 6), \ null, \ new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6), \ new/datum/stack_recipe("rag", /obj/item/reagent_containers/glass/rag, 1), \ @@ -283,6 +297,10 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("white beanie", /obj/item/clothing/head/beanie, 2), \ null, \ new/datum/stack_recipe("blindfold", /obj/item/clothing/glasses/blindfold, 2), \ + null, \ + new/datum/stack_recipe("19x19 canvas", /obj/item/canvas/nineteen_nineteen, 3), \ + new/datum/stack_recipe("23x19 canvas", /obj/item/canvas/twentythree_nineteen, 4), \ + new/datum/stack_recipe("23x23 canvas", /obj/item/canvas/twentythree_twentythree, 5), \ )) /obj/item/stack/sheet/cotton/cloth @@ -367,7 +385,7 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \ GLOBAL_LIST_INIT(bamboo_recipes, list ( \ new/datum/stack_recipe("punji sticks trap", /obj/structure/punji_sticks, 5, time = 30, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("blow gun", /obj/item/gun/syringe/blowgun, 10, time = 70), \ - new/datum/stack_recipe("bamboo spear", /obj/item/twohanded/bamboospear, 25, time = 90), \ + new/datum/stack_recipe("bamboo spear", /obj/item/spear/bamboospear, 25, time = 90), \ new/datum/stack_recipe("crude syringe", /obj/item/reagent_containers/syringe/crude, 5, time = 10), \ )) @@ -381,7 +399,7 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \ sheettype = "bamboo" force = 10 throwforce = 10 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0, "stamina" = 0) resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/mineral/bamboo grind_results = list("carbon" = 5) @@ -390,6 +408,14 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \ recipes = GLOB.bamboo_recipes return ..() +/obj/item/stack/sheet/mineral/bamboo/Topic(href, href_list) + . = ..() + if(href_list["make"]) + var/list/recipes_list = recipes + var/datum/stack_recipe/R = recipes_list[text2num(href_list["make"])] + if(R.result_type == /obj/structure/punji_sticks) + var/turf/T = get_turf(src) + usr.investigate_log("has placed punji sticks trap at [AREACOORD(T)].", INVESTIGATE_BOTANY) /* * Cardboard @@ -515,7 +541,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \ return var/turf/T = get_turf(user) //we may have moved. adjust as needed... var/area/A = get_area(user) - if((!is_station_level(T.z) && !is_mining_level(T.z)) || (A && !A.blob_allowed)) + if((!is_station_level(T.z) && !is_mining_level(T.z)) || (A && !(A.area_flags & BLOBS_ALLOWED))) to_chat(user, "The veil is not weak enough here.") return FALSE return ..() @@ -608,6 +634,10 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ GLOBAL_LIST_INIT(bronze_recipes, list ( \ new/datum/stack_recipe("wall gear", /obj/structure/girder/bronze, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ null, + new/datum/stack_recipe("directional bronze window", /obj/structure/window/bronze/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe("fulltile bronze window", /obj/structure/window/bronze/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe("pinion airlock assembly", /obj/structure/door_assembly/door_assembly_bronze, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("bronze pinion airlock assembly", /obj/structure/door_assembly/door_assembly_bronze/seethru, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bronze hat", /obj/item/clothing/head/bronze), \ new/datum/stack_recipe("bronze suit", /obj/item/clothing/suit/bronze), \ new/datum/stack_recipe("bronze boots", /obj/item/clothing/shoes/bronze), \ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 637e873c06866..ec5520b6aa6ad 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -8,6 +8,7 @@ /* * Stacks */ + /obj/item/stack icon = 'icons/obj/stack_objects.dmi' gender = PLURAL @@ -38,9 +39,7 @@ . = ..() if(new_amount != null) amount = new_amount - while(amount > max_amount) - amount -= max_amount - new type(loc, max_amount, FALSE) + check_max_amount() if(!merge_type) merge_type = type if(merge) @@ -50,6 +49,12 @@ update_weight() update_icon() +/obj/item/stack/proc/check_max_amount() + while(amount > max_amount) + amount -= max_amount + ui_update() + new type(loc, max_amount, FALSE) + /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) @@ -69,12 +74,6 @@ icon_state = "[initial(icon_state)]_3" ..() - -/obj/item/stack/Destroy() - if (usr && usr.machine==src) - usr << browse(null, "window=stack") - . = ..() - /obj/item/stack/examine(mob/user) . = ..() if (is_cyborg) @@ -96,139 +95,157 @@ /obj/item/stack/proc/get_amount() if(is_cyborg) - . = round(source.energy / cost) + . = round(source?.energy / cost) else . = (amount) -/obj/item/stack/attack_self(mob/user) - interact(user) +/** + * Builds all recipes in a given recipe list and returns an association list containing them + * + * Arguments: + * * recipe_to_iterate - The list of recipes we are using to build recipes + */ +/obj/item/stack/proc/recursively_build_recipes(list/recipe_to_iterate) + var/list/L = list() + for(var/recipe in recipe_to_iterate) + if(isnull(recipe)) + L += list(list( + "spacer" = TRUE + )) + if(istype(recipe, /datum/stack_recipe_list)) + var/datum/stack_recipe_list/R = recipe + L += list(list( + "title" = R.title, + "sub_recipes" = recursively_build_recipes(R.recipes), + )) + if(istype(recipe, /datum/stack_recipe)) + var/datum/stack_recipe/R = recipe + L += list(build_recipe(R)) + return L + +/** + * Returns a list of properties of a given recipe + * + * Arguments: + * * R - The stack recipe we are using to get a list of properties + */ +/obj/item/stack/proc/build_recipe(datum/stack_recipe/R) + return list( + "title" = R.title, + "res_amount" = R.res_amount, + "max_res_amount" = R.max_res_amount, + "req_amount" = R.req_amount, + "ref" = "\ref[R]", + ) + +/** + * Checks if the recipe is valid to be used + * + * Arguments: + * * R - The stack recipe we are checking if it is valid + * * recipe_list - The list of recipes we are using to check the given recipe + */ +/obj/item/stack/proc/is_valid_recipe(datum/stack_recipe/R, list/recipe_list) + for(var/S in recipe_list) + if(S == R) + return TRUE + if(istype(S, /datum/stack_recipe_list)) + var/datum/stack_recipe_list/L = S + if(is_valid_recipe(R, L.recipes)) + return TRUE + return FALSE + +/obj/item/stack/ui_state(mob/user) + return GLOB.hands_state + +/obj/item/stack/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Stack", name) + ui.open() -/obj/item/stack/interact(mob/user, sublist) - ui_interact(user, sublist) +/obj/item/stack/ui_data(mob/user) + var/list/data = list() + data["amount"] = get_amount() + return data -/obj/item/stack/ui_interact(mob/user, recipes_sublist) +/obj/item/stack/ui_static_data(mob/user) + var/list/data = list() + data["recipes"] = recursively_build_recipes(recipes) + return data + +/obj/item/stack/ui_act(action, params) . = ..() - if (!recipes) - return - if (!src || get_amount() <= 0) - user << browse(null, "window=stack") - user.set_machine(src) //for correct work of onclose - var/list/recipe_list = recipes - if (recipes_sublist && recipe_list[recipes_sublist] && istype(recipe_list[recipes_sublist], /datum/stack_recipe_list)) - var/datum/stack_recipe_list/srl = recipe_list[recipes_sublist] - recipe_list = srl.recipes - var/t1 = "Amount Left: [get_amount()]
      " - for(var/i in 1 to length(recipe_list)) - var/E = recipe_list[i] - if (isnull(E)) - t1 += "
      " - continue - if (i>1 && !isnull(recipe_list[i-1])) - t1+="
      " - - if (istype(E, /datum/stack_recipe_list)) - var/datum/stack_recipe_list/srl = E - t1 += "[srl.title]" - - if (istype(E, /datum/stack_recipe)) - var/datum/stack_recipe/R = E - var/max_multiplier = round(get_amount() / R.req_amount) - var/title - var/can_build = 1 - can_build = can_build && (max_multiplier>0) - - if (R.res_amount>1) - title+= "[R.res_amount]x [R.title]\s" - else - title+= "[R.title]" - title+= " ([R.req_amount] [singular_name]\s)" - if (can_build) - t1 += text("[title] ") - else - t1 += text("[]", title) - continue - if (R.max_res_amount>1 && max_multiplier>1) - max_multiplier = min(max_multiplier, round(R.max_res_amount/R.res_amount)) - t1 += " |" - var/list/multipliers = list(5,10,25) - for (var/n in multipliers) - if (max_multiplier>=n) - t1 += " [n*R.res_amount]x" - if (!(max_multiplier in multipliers)) - t1 += " [max_multiplier*R.res_amount]x" - - var/datum/browser/popup = new(user, "stack", name, 400, 400) - popup.set_content(t1) - popup.open(FALSE) - onclose(user, "stack") - -/obj/item/stack/Topic(href, href_list) - ..() - if (usr.restrained() || usr.stat || usr.get_active_held_item() != src) + if(.) return - if (href_list["sublist"] && !href_list["make"]) - interact(usr, text2num(href_list["sublist"])) - if (href_list["make"]) - if (get_amount() < 1 && !is_cyborg) - qdel(src) - - var/list/recipes_list = recipes - if (href_list["sublist"]) - var/datum/stack_recipe_list/srl = recipes_list[text2num(href_list["sublist"])] - recipes_list = srl.recipes - var/datum/stack_recipe/R = recipes_list[text2num(href_list["make"])] - var/multiplier = text2num(href_list["multiplier"]) - if (!isnum_safe(multiplier) || (multiplier <= 0)) //href protection - return - if(!building_checks(R, multiplier)) - return - if (R.time) - usr.visible_message("[usr] starts building \a [R.title].", "You start building \a [R.title]...") - if (!do_after(usr, R.time, target = usr)) + + switch(action) + if("make") + if(get_amount() < 1 && !is_cyborg) + qdel(src) return - if(!building_checks(R, multiplier)) + var/datum/stack_recipe/R = locate(params["ref"]) + if(!is_valid_recipe(R, recipes)) //href exploit protection return - - var/obj/O - if(R.max_res_amount > 1) //Is it a stack? - O = new R.result_type(usr.drop_location(), R.res_amount * multiplier) - else if(ispath(R.result_type, /turf)) - var/turf/T = usr.drop_location() - if(!isturf(T)) + var/multiplier = text2num(params["multiplier"]) + if(!isnum_safe(multiplier) || (multiplier <= 0)) //href exploit protection return - T.PlaceOnTop(R.result_type, flags = CHANGETURF_INHERIT_AIR) - else - O = new R.result_type(usr.drop_location()) - if(O) - O.setDir(usr.dir) - use(R.req_amount * multiplier) - - //START: oh fuck i'm so sorry - if(istype(O, /obj/structure/windoor_assembly)) - var/obj/structure/windoor_assembly/W = O - W.ini_dir = W.dir - else if(istype(O, /obj/structure/window)) - var/obj/structure/window/W = O - W.ini_dir = W.dir - //END: oh fuck i'm so sorry - - else if(istype(O, /obj/item/restraints/handcuffs/cable)) - var/obj/item/cuffs = O - cuffs.item_color = item_color - cuffs.update_icon() - - if (QDELETED(O)) - return //It's a stack and has already been merged - - if (isitem(O)) - usr.put_in_hands(O) - O.add_fingerprint(usr) - - //BubbleWrap - so newly formed boxes are empty - if ( istype(O, /obj/item/storage) ) - for (var/obj/item/I in O) - qdel(I) - //BubbleWrap END + if(!building_checks(R, multiplier)) + return + if(R.time) + usr.visible_message("[usr] starts building \a [R.title].", "You start building \a [R.title]...") + if (!do_after(usr, R.time, target = usr)) + return + if(!building_checks(R, multiplier)) + return + + var/obj/O + if(R.max_res_amount > 1) //Is it a stack? + O = new R.result_type(usr.drop_location(), R.res_amount * multiplier) + else if(ispath(R.result_type, /turf)) + var/turf/T = usr.drop_location() + if(!isturf(T)) + return + T.PlaceOnTop(R.result_type, flags = CHANGETURF_INHERIT_AIR) + else + O = new R.result_type(usr.drop_location()) + if(O) + O.setDir(usr.dir) + use(R.req_amount * multiplier) + + /* // We don't have R.applies_mats, leaving this in here for convenience in case we get it + if(R.applies_mats && custom_materials && custom_materials.len) + var/list/used_materials = list() + for(var/i in custom_materials) + used_materials[SSmaterials.GetMaterialRef(i)] = R.req_amount / R.res_amount * (MINERAL_MATERIAL_AMOUNT / custom_materials.len) + O.set_custom_materials(used_materials) + */ + + if(istype(O, /obj/structure/windoor_assembly)) + var/obj/structure/windoor_assembly/W = O + W.ini_dir = W.dir + else if(istype(O, /obj/structure/window)) + var/obj/structure/window/W = O + W.ini_dir = W.dir + + else if(istype(O, /obj/item/restraints/handcuffs/cable)) + var/obj/item/cuffs = O + cuffs.item_color = item_color + cuffs.update_icon() + + if(QDELETED(O)) + return //It's a stack and has already been merged + + if(isitem(O)) + usr.put_in_hands(O) + O.add_fingerprint(usr) + + //BubbleWrap - so newly formed boxes are empty + if(istype(O, /obj/item/storage)) + for (var/obj/item/I in O) + qdel(I) + //BubbleWrap END + return TRUE /obj/item/stack/proc/building_checks(datum/stack_recipe/R, multiplier) if (get_amount() < R.req_amount*multiplier) @@ -288,6 +305,7 @@ if(check) zero_amount() update_icon() + ui_update() update_weight() return TRUE @@ -318,8 +336,10 @@ source.add_charge(amount * cost) else src.amount += amount + check_max_amount() update_icon() update_weight() + ui_update() /obj/item/stack/proc/merge(obj/item/stack/S) //Merge src into S, as much as possible if(QDELETED(S) || QDELETED(src) || S == src) //amusingly this can cause a stack to consume itself, let's not allow that. diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm new file mode 100644 index 0000000000000..dc668431d989f --- /dev/null +++ b/code/game/objects/items/stacks/tape.dm @@ -0,0 +1,60 @@ + + +/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 + + 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 == 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 diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index f5ab08468a7df..1d45f8b640b56 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -7,6 +7,7 @@ w_class = WEIGHT_CLASS_TINY max_amount = 50 item_flags = NOBLUDGEON + merge_type = /obj/item/stack/telecrystal /obj/item/stack/telecrystal/attack(mob/target, mob/user) if(target == user) //You can't go around smacking people with crystals to find out if they have an uplink or not. diff --git a/code/game/objects/items/stacks/tiles/light.dm b/code/game/objects/items/stacks/tiles/light.dm index 428e8d621c024..71f9901506a4c 100644 --- a/code/game/objects/items/stacks/tiles/light.dm +++ b/code/game/objects/items/stacks/tiles/light.dm @@ -28,3 +28,11 @@ qdel(src) else return ..() + +/obj/item/stack/tile/light/cyborg + materials = list() + is_cyborg = 1 + cost = 125 + +/obj/item/stack/tile/light/cyborg/attackby(obj/item/O, mob/user, params) + return diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm index 4a7dca8f3bb48..3267a53961d1c 100644 --- a/code/game/objects/items/stacks/tiles/tile_mineral.dm +++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm @@ -105,3 +105,12 @@ item_state = "tile-silver" turf_type = /turf/open/floor/grass/snow/safe mineralType = "snow" + +/obj/item/stack/tile/mineral/wax + name = "wax tile" + singular_name = "wax tile" + desc = "A large, flat sheet of wax." + icon_state = "tile_wax" + item_state = "tile-wax" + turf_type = /turf/open/floor/wax + mineralType = "wax" diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 7d2e68b2dc79c..ccb44c314864b 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -76,6 +76,76 @@ turf_type = /turf/open/floor/grass resistance_flags = FLAMMABLE +/obj/item/stack/tile/grass/attackby(obj/item/W, mob/user, params) + if((W.tool_behaviour == TOOL_SHOVEL) && params) + to_chat(user, "You start digging up [src].") + playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) + if(do_after(user, 2 * get_amount(), target = src)) + new /obj/item/stack/ore/glass(get_turf(src), 2 * get_amount()) + user.visible_message("[user] digs up [src].", "You uproot [src].") + playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) + qdel(src) + else + return ..() + +//Fairygrass +/obj/item/stack/tile/fairygrass + name = "fairygrass tile" + singular_name = "fairygrass floor tile" + desc = "A patch of odd, glowing blue grass." + icon_state = "tile_fairygrass" + item_state = "tile-fairygrass" + turf_type = /turf/open/floor/grass/fairy + resistance_flags = FLAMMABLE + color = "#33CCFF" + +/obj/item/stack/tile/fairygrass/white + name = "white fairygrass tile" + singular_name = "white fairygrass floor tile" + desc = "A patch of odd, glowing white grass." + turf_type = /turf/open/floor/grass/fairy/white + color = "#FFFFFF" + +/obj/item/stack/tile/fairygrass/red + name = "red fairygrass tile" + singular_name = "red fairygrass floor tile" + desc = "A patch of odd, glowing red grass." + turf_type = /turf/open/floor/grass/fairy/red + color = "#FF3333" + +/obj/item/stack/tile/fairygrass/yellow + name = "yellow fairygrass tile" + singular_name = "yellow fairygrass floor tile" + desc = "A patch of odd, glowing yellow grass." + turf_type = /turf/open/floor/grass/fairy/yellow + color = "#FFFF66" + +/obj/item/stack/tile/fairygrass/green + name = "green fairygrass tile" + singular_name = "green fairygrass floor tile" + desc = "A patch of odd, glowing green grass." + turf_type = /turf/open/floor/grass/fairy/green + color = "#99FF99" + +/obj/item/stack/tile/fairygrass/blue + name = "blue fairygrass tile" + singular_name = "blue fairygrass floor tile" + desc = "A patch of odd, glowing blue grass." + turf_type = /turf/open/floor/grass/fairy/blue + +/obj/item/stack/tile/fairygrass/purple + name = "purple fairygrass tile" + singular_name = "purple fairygrass floor tile" + desc = "A patch of odd, glowing purple grass." + turf_type = /turf/open/floor/grass/fairy/purple + color = "#D966FF" + +/obj/item/stack/tile/fairygrass/pink + name = "pink fairygrass tile" + singular_name = "pink fairygrass floor tile" + desc = "A patch of odd, glowing pink grass." + turf_type = /turf/open/floor/grass/fairy/pink + color = "#FFB3DA" //Wood /obj/item/stack/tile/wood @@ -111,28 +181,37 @@ name = "black carpet" icon_state = "tile-carpet-black" item_state = "tile-carpet-black" + merge_type = /obj/item/stack/tile/carpet/black turf_type = /turf/open/floor/carpet/black - tableVariant = /obj/structure/table/wood/fancy/black /obj/item/stack/tile/carpet/blue name = "blue carpet" icon_state = "tile-carpet-blue" item_state = "tile-carpet-blue" + merge_type = /obj/item/stack/tile/carpet/blue turf_type = /turf/open/floor/carpet/blue tableVariant = /obj/structure/table/wood/fancy/blue +/obj/item/stack/tile/carpet/blue/thirtytwo + amount = 32 + /obj/item/stack/tile/carpet/cyan name = "cyan carpet" icon_state = "tile-carpet-cyan" item_state = "tile-carpet-cyan" + merge_type = /obj/item/stack/tile/carpet/cyan turf_type = /turf/open/floor/carpet/cyan tableVariant = /obj/structure/table/wood/fancy/cyan +/obj/item/stack/tile/carpet/cyan/thirtytwo + amount = 32 + /obj/item/stack/tile/carpet/green name = "green carpet" icon_state = "tile-carpet-green" item_state = "tile-carpet-green" + merge_type = /obj/item/stack/tile/carpet/green turf_type = /turf/open/floor/carpet/green tableVariant = /obj/structure/table/wood/fancy/green @@ -140,6 +219,7 @@ name = "orange carpet" icon_state = "tile-carpet-orange" item_state = "tile-carpet-orange" + merge_type = /obj/item/stack/tile/carpet/orange turf_type = /turf/open/floor/carpet/orange tableVariant = /obj/structure/table/wood/fancy/orange @@ -147,6 +227,7 @@ name = "purple carpet" icon_state = "tile-carpet-purple" item_state = "tile-carpet-purple" + merge_type = /obj/item/stack/tile/carpet/purple turf_type = /turf/open/floor/carpet/purple tableVariant = /obj/structure/table/wood/fancy/purple @@ -154,6 +235,7 @@ name = "red carpet" icon_state = "tile-carpet-red" item_state = "tile-carpet-red" + merge_type = /obj/item/stack/tile/carpet/red turf_type = /turf/open/floor/carpet/red tableVariant = /obj/structure/table/wood/fancy/red @@ -161,6 +243,7 @@ name = "royal black carpet" icon_state = "tile-carpet-royalblack" item_state = "tile-carpet-royalblack" + merge_type = /obj/item/stack/tile/carpet/royalblack turf_type = /turf/open/floor/carpet/royalblack tableVariant = /obj/structure/table/wood/fancy/royalblack @@ -168,6 +251,7 @@ name = "royal blue carpet" icon_state = "tile-carpet-royalblue" item_state = "tile-carpet-royalblue" + merge_type = /obj/item/stack/tile/carpet/royalblue turf_type = /turf/open/floor/carpet/royalblue tableVariant = /obj/structure/table/wood/fancy/royalblue @@ -176,6 +260,7 @@ singular_name = "retro floor tile" desc = "A stack of floor tiles that remind you of simpler times.." icon_state = "tile_eighties" + merge_type = /obj/item/stack/tile/eighties turf_type = /turf/open/floor/eighties /obj/item/stack/tile/carpet/fifty @@ -211,6 +296,9 @@ /obj/item/stack/tile/eighties/fifty amount = 50 +/obj/item/stack/tile/eighties/loaded + amount = 30 + /obj/item/stack/tile/fakespace name = "astral carpet" singular_name = "astral carpet" @@ -253,7 +341,7 @@ desc = "A high-traction floor tile. It feels rubbery in your hand." icon_state = "tile_noslip_standard" turf_type = /turf/open/floor/noslip/standard - merge_type = /obj/item/stack/tile/noslip + merge_type = /obj/item/stack/tile/noslip/standard /obj/item/stack/tile/noslip/white name = "high-traction floor tile" @@ -261,7 +349,7 @@ desc = "A high-traction floor tile. It feels rubbery in your hand." icon_state = "tile_noslip_white" turf_type = /turf/open/floor/noslip/white - merge_type = /obj/item/stack/tile/noslip + merge_type = /obj/item/stack/tile/noslip/white /obj/item/stack/tile/noslip/blue name = "high-traction floor tile" @@ -269,7 +357,7 @@ desc = "A high-traction floor tile. It feels rubbery in your hand." icon_state = "tile_noslip_blue" turf_type = /turf/open/floor/noslip/blue - merge_type = /obj/item/stack/tile/noslip + merge_type = /obj/item/stack/tile/noslip/blue /obj/item/stack/tile/noslip/darkblue name = "high-traction floor tile" @@ -277,7 +365,7 @@ desc = "A high-traction floor tile. It feels rubbery in your hand." icon_state = "tile_noslip_darkblue" turf_type = /turf/open/floor/noslip/darkblue - merge_type = /obj/item/stack/tile/noslip + merge_type = /obj/item/stack/tile/noslip/darkblue /obj/item/stack/tile/noslip/dark name = "high-traction floor tile" @@ -285,7 +373,7 @@ desc = "A high-traction floor tile. It feels rubbery in your hand." icon_state = "tile_noslip_dark" turf_type = /turf/open/floor/noslip/dark - merge_type = /obj/item/stack/tile/noslip + merge_type = /obj/item/stack/tile/noslip/dark /obj/item/stack/tile/noslip/vaporwave name = "high-traction floor tile" @@ -293,7 +381,7 @@ desc = "A high-traction floor tile. It feels rubbery in your hand." icon_state = "tile_noslip_pinkblack" turf_type = /turf/open/floor/noslip/vaporwave - merge_type = /obj/item/stack/tile/noslip + merge_type = /obj/item/stack/tile/noslip/vaporwave /obj/item/stack/tile/noslip/thirty amount = 30 @@ -365,7 +453,7 @@ flags_1 = CONDUCT_1 turf_type = /turf/open/floor/plasteel mineralType = "iron" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70, "stamina" = 0) resistance_flags = FIRE_PROOF /obj/item/stack/tile/plasteel/cyborg diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 885fd8b89a324..9a9007dc39936 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -44,7 +44,7 @@ item_state = "holdingpack" resistance_flags = FIRE_PROOF item_flags = NO_MAT_REDEMPTION - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50, "stamina" = 0) component_type = /datum/component/storage/concrete/bluespace/bag_of_holding /obj/item/storage/backpack/holding/clown @@ -78,7 +78,7 @@ icon_state = "hammerspace" resistance_flags = FIRE_PROOF item_flags = NO_MAT_REDEMPTION - armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 0) component_type = /datum/component/storage/concrete/bluespace/bag_of_holding /obj/item/storage/backpack/hammerspace/ComponentInitialize() @@ -231,6 +231,40 @@ desc = "A spacious backpack with lots of pockets, worn by Engineers of an Emergency Response Team." icon_state = "ert_engineering" +///////////////// +//DONATOR ITEMS// +///////////////// + +/obj/item/storage/backpack/cak + name = "cak backpack" + desc = "A cute backpack resembling Cak." + icon_state = "cakpack" + item_state = "cakpack" + +/obj/item/storage/backpack/ian + name = "ian backpack" + desc = "A cute backpack resembling Ian." + icon_state = "ianpack" + item_state = "ianpack" + +/obj/item/storage/backpack/lisa + name = "lisa backpack" + desc = "A cute backpack resembling Lisa." + icon_state = "lisapack" + item_state = "lisapack" + +/obj/item/storage/backpack/renault + name = "renault backpack" + desc = "A cute backpack resembling Renault." + icon_state = "renaultpack" + item_state = "renaultpack" + +/obj/item/storage/backpack/runtime + name = "runtime backpack" + desc = "A cute backpack resembling Runtime." + icon_state = "runtimepack" + item_state = "runtimepack" + /* * Satchel Types */ diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 9aa72bf756adb..96dc9d9265c1f 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -88,20 +88,21 @@ STR.max_combined_w_class = 60 STR.max_items = 60 + /obj/item/storage/bag/trash/bluespace/hammerspace name = "hammerspace belt" desc = "A belt that opens into a near infinite pocket of bluespace." icon_state = "hammerspace" w_class = WEIGHT_CLASS_GIGANTIC -/obj/item/storage/bag/trash/bluespace/ComponentInitialize() +/obj/item/storage/bag/trash/bluespace/hammerspace/ComponentInitialize() . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = 1000 STR.max_items = 300 STR.max_w_class = WEIGHT_CLASS_GIGANTIC -/obj/item/storage/bag/trash/bluespace/update_icon() +/obj/item/storage/bag/trash/bluespace/hammerspace/update_icon() if(contents.len == 0) icon_state = "[initial(icon_state)]" else icon_state = "[initial(icon_state)]" @@ -120,7 +121,7 @@ desc = "This little bugger can be used to store and transport ores." icon = 'icons/obj/mining.dmi' icon_state = "satchel" - slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKET + slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKETS w_class = WEIGHT_CLASS_NORMAL component_type = /datum/component/storage/concrete/stack var/spam_protection = FALSE //If this is TRUE, the holder won't receive any messages when they fail to pick up ore through crossing it @@ -145,10 +146,13 @@ /obj/item/storage/bag/ore/dropped() . = ..() - UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) - listeningTo = null + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + listeningTo = null /obj/item/storage/bag/ore/proc/Pickup_ores(mob/living/user) + SIGNAL_HANDLER + var/show_message = FALSE var/obj/structure/ore_box/box var/turf/tile = user.loc @@ -163,6 +167,7 @@ continue if (box) user.transferItemToLoc(A, box) + box.ui_update() show_message = TRUE else if(SEND_SIGNAL(src, COMSIG_TRY_STORAGE_INSERT, A, user, TRUE)) show_message = TRUE @@ -231,6 +236,19 @@ for(var/obj/item/O in contents) seedify(O, 1) +/obj/item/storage/bag/plants/portaseeder/compact + name = "compact portable seed extractor" + desc = "Create seeds for your plants in your arm." + icon_state = "compactseeder" + +/obj/item/storage/bag/plants/portaseeder/compact/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_w_class = WEIGHT_CLASS_NORMAL + STR.max_combined_w_class = 10 + STR.max_items = 3 + STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/grown, /obj/item/seeds, /obj/item/grown)) + // ----------------------------- // Sheet Snatcher // ----------------------------- @@ -243,7 +261,7 @@ icon = 'icons/obj/mining.dmi' icon_state = "sheetsnatcher" - var/capacity = 300; //the number of sheets it can carry. + var/capacity = 150 //the number of sheets it can carry. w_class = WEIGHT_CLASS_NORMAL component_type = /datum/component/storage/concrete/stack @@ -252,8 +270,7 @@ var/datum/component/storage/concrete/stack/STR = GetComponent(/datum/component/storage/concrete/stack) STR.allow_quick_empty = TRUE STR.can_hold = typecacheof(list(/obj/item/stack/sheet)) - STR.cant_hold = typecacheof(list(/obj/item/stack/sheet/mineral/sandstone, /obj/item/stack/sheet/mineral/wood)) - STR.max_combined_stack_amount = 300 + STR.max_combined_stack_amount = 150 // ----------------------------- // Sheet Snatcher (Cyborg) @@ -268,6 +285,7 @@ . = ..() var/datum/component/storage/concrete/stack/STR = GetComponent(/datum/component/storage/concrete/stack) STR.max_combined_stack_amount = 500 + STR.max_combined_w_class = 30 // ----------------------------- // Book bag @@ -386,3 +404,20 @@ 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/dropper, /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/bodypart)) + +/obj/item/storage/bag/construction + name = "construction bag" + icon = 'icons/obj/tools.dmi' + icon_state = "construction_bag" + desc = "A bag for storing small construction components." + w_class = WEIGHT_CLASS_TINY + resistance_flags = FLAMMABLE + +/obj/item/storage/bag/construction/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_combined_w_class = 100 + STR.max_items = 50 + STR.max_w_class = WEIGHT_CLASS_SMALL + STR.insert_preposition = "in" + STR.can_hold = typecacheof(list(/obj/item/stack/ore/bluespace_crystal, /obj/item/assembly, /obj/item/stock_parts, /obj/item/reagent_containers/glass/beaker, /obj/item/stack/cable_coil, /obj/item/circuitboard, /obj/item/electronics)) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index b2890b7780a2a..5b76238fe3d31 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -42,6 +42,7 @@ STR.max_combined_w_class = 21 var/static/list/can_hold = typecacheof(list( /obj/item/crowbar, + /obj/item/powertool, /obj/item/screwdriver, /obj/item/weldingtool, /obj/item/wirecutters, @@ -74,13 +75,13 @@ item_state = "utility_ce" /obj/item/storage/belt/utility/chief/full/PopulateContents() - new /obj/item/screwdriver/power(src) - new /obj/item/crowbar/power(src) + new /obj/item/powertool/hand_drill(src) + new /obj/item/powertool/jaws_of_life(src) new /obj/item/weldingtool/experimental(src)//This can be changed if this is too much new /obj/item/multitool(src) - new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange")) + new /obj/item/stack/cable_coil(src,MAXCOIL,pick("red","yellow","orange")) new /obj/item/extinguisher/mini(src) - new /obj/item/analyzer(src) + new /obj/item/analyzer/ranged(src) //much roomier now that we've managed to remove two tools /obj/item/storage/belt/utility/full/PopulateContents() @@ -90,7 +91,7 @@ new /obj/item/crowbar(src) new /obj/item/wirecutters(src) new /obj/item/multitool(src) - new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange")) + new /obj/item/stack/cable_coil(src,MAXCOIL,pick("red","yellow","orange")) /obj/item/storage/belt/utility/full/engi/PopulateContents() new /obj/item/screwdriver(src) @@ -99,7 +100,7 @@ new /obj/item/crowbar(src) new /obj/item/wirecutters(src) new /obj/item/multitool(src) - new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange")) + new /obj/item/stack/cable_coil(src,MAXCOIL,pick("red","yellow","orange")) /obj/item/storage/belt/utility/atmostech/PopulateContents() @@ -126,6 +127,7 @@ STR.max_items = 7 var/static/list/can_hold = typecacheof(list( /obj/item/crowbar, + /obj/item/powertool, /obj/item/screwdriver, /obj/item/weldingtool, /obj/item/wirecutters, @@ -243,7 +245,7 @@ /obj/item/storage/belt/security/ComponentInitialize() . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_items = 6 + STR.max_items = 5 STR.max_combined_w_class = 18 STR.max_w_class = WEIGHT_CLASS_NORMAL STR.can_hold = typecacheof(list( @@ -274,7 +276,6 @@ new /obj/item/grenade/flashbang(src) new /obj/item/assembly/flash/handheld(src) new /obj/item/melee/baton/loaded(src) - new /obj/item/club(src) update_icon() /obj/item/storage/belt/security/deputy @@ -299,7 +300,7 @@ /obj/item/storage/belt/security/webbing/ComponentInitialize() . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_items = 7 + STR.max_items = 6 STR.max_combined_w_class = 21 /obj/item/storage/belt/mining @@ -317,6 +318,7 @@ STR.max_combined_w_class = 20 STR.can_hold = typecacheof(list( /obj/item/crowbar, + /obj/item/powertool, /obj/item/screwdriver, /obj/item/weldingtool, /obj/item/wirecutters, @@ -353,7 +355,13 @@ /obj/item/storage/bag/plants, /obj/item/stack/marker_beacon, /obj/item/restraints/legcuffs/bola/watcher, - /obj/item/claymore/bone + /obj/item/claymore/bone, + /obj/item/skeleton_key, + /obj/item/discovery_scanner, + /obj/item/gun/energy/e_gun/mini/exploration, + /obj/item/grenade/exploration, + /obj/item/exploration_detonator, + /obj/item/research_disk_pinpointer )) @@ -489,7 +497,7 @@ new /obj/item/crowbar/abductor(src) new /obj/item/wirecutters/abductor(src) new /obj/item/multitool/abductor(src) - new /obj/item/stack/cable_coil(src,30,"white") + new /obj/item/stack/cable_coil/white(src) /obj/item/storage/belt/military/army name = "army belt" @@ -538,7 +546,7 @@ /obj/item/grenade/smokebomb = 4, /obj/item/grenade/empgrenade = 1, /obj/item/grenade/empgrenade = 1, - /obj/item/grenade/syndieminibomb/concussion/frag = 10, + /obj/item/grenade/frag = 10, /obj/item/grenade/gluon = 4, /obj/item/grenade/chem_grenade/incendiary = 2, /obj/item/grenade/chem_grenade/facid = 1, @@ -603,7 +611,7 @@ /obj/item/melee/flyswatter, /obj/item/assembly/mousetrap, /obj/item/paint/paint_remover, - /obj/item/twohanded/pushbroom + /obj/item/pushbroom )) /obj/item/storage/belt/janitor/full/PopulateContents() @@ -774,3 +782,30 @@ /obj/item/storage/belt/sabre/PopulateContents() new /obj/item/melee/sabre(src) update_icon() + +/obj/item/storage/belt/sabre/mime + name = "Baguette" + desc = "Bon appetit!" + icon = 'icons/obj/food/burgerbread.dmi' + icon_state = "baguette" + item_state = "baguette" + w_class = WEIGHT_CLASS_BULKY + slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT + +/obj/item/storage/belt/sabre/mime/update_icon() + icon_state = "baguette" + item_state = "baguette" + +/obj/item/storage/belt/sabre/mime/ComponentInitialize() + . = ..() + var/datum/component/storage/MTR = GetComponent(/datum/component/storage) + MTR.max_items = 1 + MTR.rustle_sound = FALSE + MTR.max_w_class = WEIGHT_CLASS_BULKY + MTR.can_hold = typecacheof(list( + /obj/item/melee/sabre/mime + )) + +/obj/item/storage/belt/sabre/mime/PopulateContents() + new /obj/item/melee/sabre/mime(src) + update_icon() diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index 025b8125a6b79..85bbea1ff1791 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -56,7 +56,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", if(!H.can_read(src)) return FALSE // If H is the Chaplain, we can set the icon_state of the bible (but only once!) - if(!GLOB.bible_icon_state && H.job == "Chaplain") + if(!GLOB.bible_icon_state && H.mind.holy_role == HOLY_ROLE_HIGHPRIEST) var/dat = "Pick Bible Style

      Pick a bible style

      [entry][functions]
      [entry][functions]
      " for(var/i in 1 to GLOB.biblestates.len) var/icon/bibleicon = icon('icons/obj/storage.dmi', GLOB.biblestates[i]) @@ -78,15 +78,21 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", if(icon_state == "honk1" || icon_state == "honk2") var/mob/living/carbon/human/H = usr H.dna.add_mutation(CLOWNMUT) - H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), SLOT_WEAR_MASK) - + H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), ITEM_SLOT_MASK) GLOB.bible_icon_state = icon_state GLOB.bible_item_state = item_state SSblackbox.record_feedback("text", "religion_book", 1, "[biblename]") usr << browse(null, "window=editicon") -/obj/item/storage/book/bible/proc/bless(mob/living/carbon/human/H, mob/living/user) +/obj/item/storage/book/bible/proc/bless(mob/living/L, mob/living/user) + if(GLOB.religious_sect) + return GLOB.religious_sect.sect_bless(L,user) + if(!ishuman(L)) + return + + var/mob/living/carbon/human/H = L + for(var/X in H.bodyparts) var/obj/item/bodypart/BP = X if(BP.status == BODYPART_ROBOTIC) @@ -120,7 +126,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", return var/chaplain = 0 - if(user.mind && (user.mind.isholy)) + if(user?.mind?.holy_role) chaplain = 1 if(!chaplain) @@ -138,7 +144,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", to_chat(user, "You can't heal yourself!") return - if(ishuman(M) && prob(60) && bless(M, user)) + if(prob(60) && bless(M, user)) smack = 0 else if(iscarbon(M)) var/mob/living/carbon/C = M @@ -162,10 +168,10 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", return if(isfloorturf(A)) to_chat(user, "You hit the floor with the bible.") - if(user.mind && (user.mind.isholy)) + if(user?.mind?.holy_role) for(var/obj/effect/rune/R in orange(2,user)) R.invisibility = 0 - if(user.mind && (user.mind.isholy)) + if(user?.mind?.holy_role) if(A.reagents && A.reagents.has_reagent(/datum/reagent/water)) // blesses all the water in the holder to_chat(user, "You bless [A].") var/water2holy = A.reagents.get_reagent_amount(/datum/reagent/water) @@ -182,8 +188,8 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", B.name = name B.icon_state = icon_state B.item_state = item_state - if(istype(A, /obj/item/twohanded/required/cult_bastard) && !iscultist(user)) - var/obj/item/twohanded/required/cult_bastard/sword = A + if(istype(A, /obj/item/cult_bastard) && !iscultist(user)) + var/obj/item/cult_bastard/sword = A to_chat(user, "You begin to exorcise [sword].") playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,1) if(do_after(user, 40, target = sword)) @@ -242,7 +248,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", /obj/item/storage/book/bible/syndicate/attack_self(mob/living/carbon/human/H) if (uses) - H.mind.isholy = TRUE + H.mind.holy_role = HOLY_ROLE_PRIEST uses -= 1 to_chat(H, "You try to open the book AND IT BITES YOU!") playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index de471ffa592e0..3fdda8757a29e 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1,4 +1,4 @@ - /* +/* * Everything derived from the common cardboard box. * Basically everything except the original is a kit (starts full). * @@ -42,7 +42,7 @@ user.visible_message("[user] puts [user.p_their()] head into \the [src], and begins closing it! It looks like [user.p_theyre()] trying to commit suicide!") myhead.dismember() myhead.forceMove(src)//force your enemies to kill themselves with your head collection box! - playsound(user,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1) + playsound(user,pick('sound/misc/desecration-01.ogg','sound/misc/desecration-02.ogg','sound/misc/desecration-01.ogg') ,50, 1, -1) return BRUTELOSS user.visible_message("[user] beating [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") return BRUTELOSS @@ -56,7 +56,7 @@ /obj/item/storage/box/attack_self(mob/user) ..() - if(!foldable) + if(!foldable || (flags_1 & HOLOGRAM_1)) return if(contents.len) to_chat(user, "You can't fold this box with items still inside!") @@ -125,14 +125,16 @@ /obj/item/storage/box/survival/PopulateContents() new /obj/item/clothing/mask/breath(src) new /obj/item/reagent_containers/hypospray/medipen(src) - new /obj/item/clothing/head/helmet/space/skinsuit(src) - new /obj/item/clothing/suit/space/skinsuit(src) if(!isplasmaman(loc)) new /obj/item/tank/internals/emergency_oxygen(src) else new /obj/item/tank/internals/plasmaman/belt(src) + if(HAS_TRAIT(SSstation, STATION_TRAIT_PREMIUM_INTERNALS)) + new /obj/item/flashlight/flare(src) + new /obj/item/radio/off(src) + /obj/item/storage/box/survival/radio/PopulateContents() ..() // we want the survival stuff too. new /obj/item/radio/off(src) @@ -142,8 +144,6 @@ new /obj/item/clothing/mask/gas/explorer(src) new /obj/item/crowbar/red(src) new /obj/item/reagent_containers/hypospray/medipen(src) - new /obj/item/clothing/head/helmet/space/skinsuit(src) - new /obj/item/clothing/suit/space/skinsuit(src) if(!isplasmaman(loc)) new /obj/item/tank/internals/emergency_oxygen(src) @@ -154,8 +154,6 @@ /obj/item/storage/box/engineer/PopulateContents() new /obj/item/clothing/mask/breath(src) new /obj/item/reagent_containers/hypospray/medipen(src) - new /obj/item/clothing/head/helmet/space/skinsuit(src) - new /obj/item/clothing/suit/space/skinsuit(src) if(!isplasmaman(loc)) new /obj/item/tank/internals/emergency_oxygen/engi(src) @@ -179,8 +177,6 @@ /obj/item/storage/box/security/PopulateContents() new /obj/item/clothing/mask/gas/sechailer(src) new /obj/item/reagent_containers/hypospray/medipen(src) - new /obj/item/clothing/head/helmet/space/skinsuit(src) - new /obj/item/clothing/suit/space/skinsuit(src) if(!isplasmaman(loc)) new /obj/item/tank/internals/emergency_oxygen(src) @@ -224,7 +220,7 @@ /obj/item/storage/box/syringes/variety/PopulateContents() new /obj/item/reagent_containers/syringe(src) new /obj/item/reagent_containers/syringe/lethal(src) - new /obj/item/reagent_containers/syringe/noreact(src) + new /obj/item/reagent_containers/syringe/cryo(src) new /obj/item/reagent_containers/syringe/piercing(src) new /obj/item/reagent_containers/syringe/bluespace(src) @@ -257,7 +253,7 @@ /obj/item/storage/box/beakers/bluespace name = "box of bluespace beakers" - illustration = "beaker" + illustration = "bbeaker" /obj/item/storage/box/beakers/bluespace/PopulateContents() for(var/i in 1 to 7) @@ -285,6 +281,7 @@ /obj/item/storage/box/injectors name = "box of DNA injectors" desc = "This box contains injectors, it seems." + illustration = "dna" /obj/item/storage/box/injectors/PopulateContents() var/static/items_inside = list( @@ -306,7 +303,7 @@ name = "box of flashbulbs" desc = "WARNING: Flashes can cause serious eye damage, protective eyewear is required." icon_state = "secbox" - illustration = "flashbang" + illustration = "flash" /obj/item/storage/box/flashes/PopulateContents() for(var/i in 1 to 2) @@ -314,10 +311,21 @@ for(var/i in 1 to 6) new /obj/item/flashbulb(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/wall_flash name = "wall-mounted flash kit" desc = "This box contains everything necessary to build a wall-mounted flash. WARNING: Flashes can cause serious eye damage, protective eyewear is required." - illustration = "flashbang" + icon_state = "secbox" + illustration = "flash" /obj/item/storage/box/wall_flash/PopulateContents() var/id = rand(1000, 9999) @@ -336,7 +344,8 @@ /obj/item/storage/box/teargas name = "box of tear gas grenades (WARNING)" desc = "WARNING: These devices are extremely dangerous and can cause blindness and skin irritation." - illustration = "flashbang" + icon_state = "secbox" + illustration = "grenade" /obj/item/storage/box/teargas/PopulateContents() for(var/i in 1 to 7) @@ -345,7 +354,7 @@ /obj/item/storage/box/emps name = "box of emp grenades" desc = "A box with 5 emp grenades." - illustration = "flashbang" + illustration = "emp" /obj/item/storage/box/emps/PopulateContents() for(var/i in 1 to 5) @@ -354,6 +363,7 @@ /obj/item/storage/box/trackimp name = "boxed tracking implant kit" desc = "Box full of scum-bag tracking utensils." + icon_state = "secbox" illustration = "implant" /obj/item/storage/box/trackimp/PopulateContents() @@ -422,6 +432,7 @@ /obj/item/storage/box/drinkingglasses name = "box of drinking glasses" desc = "It has a picture of drinking glasses on it." + illustration = "drinkglass" /obj/item/storage/box/drinkingglasses/PopulateContents() for(var/i in 1 to 6) @@ -430,6 +441,7 @@ /obj/item/storage/box/condimentbottles name = "box of condiment bottles" desc = "It has a large ketchup smear on it." + illustration = "condiment" /obj/item/storage/box/condimentbottles/PopulateContents() for(var/i in 1 to 6) @@ -438,6 +450,7 @@ /obj/item/storage/box/cups name = "box of paper cups" desc = "It has pictures of paper cups on the front." + illustration = "cup" /obj/item/storage/box/cups/PopulateContents() for(var/i in 1 to 7) @@ -568,6 +581,7 @@ /obj/item/storage/box/prisoner name = "box of prisoner IDs" desc = "Take away their last shred of dignity, their name." + icon_state = "secbox" illustration = "id" /obj/item/storage/box/prisoner/PopulateContents() @@ -583,6 +597,7 @@ /obj/item/storage/box/seccarts name = "box of PDA security cartridges" desc = "A box full of PDA cartridges used by Security." + icon_state = "secbox" illustration = "pda" /obj/item/storage/box/seccarts/PopulateContents() @@ -593,7 +608,8 @@ /obj/item/storage/box/firingpins name = "box of standard firing pins" desc = "A box full of standard firing pins, to allow newly-developed firearms to operate." - illustration = "id" + icon_state = "secbox" + illustration = "firingpin" /obj/item/storage/box/firingpins/PopulateContents() for(var/i in 1 to 5) @@ -602,7 +618,7 @@ /obj/item/storage/box/firingpins/paywall name = "box of paywall firing pins" desc = "A box full of paywall firing pins, to allow newly-developed firearms to operate behind a custom-set paywall." - illustration = "id" + illustration = "firingpin" /obj/item/storage/box/firingpins/paywall/PopulateContents() for(var/i in 1 to 5) @@ -611,7 +627,7 @@ /obj/item/storage/box/lasertagpins name = "box of laser tag firing pins" desc = "A box full of laser tag firing pins, to allow newly-developed firearms to require wearing brightly coloured plastic armor before being able to be used." - illustration = "id" + illustration = "firingpin" /obj/item/storage/box/lasertagpins/PopulateContents() for(var/i in 1 to 3) @@ -652,6 +668,7 @@ name = "boxed space suit and helmet" desc = "A sleek, sturdy box used to hold replica spacesuits." icon_state = "syndiebox" + illustration = "syndiesuit" /obj/item/storage/box/fakesyndiesuit/PopulateContents() new /obj/item/clothing/head/syndicatefake(src) @@ -753,20 +770,10 @@ for(var/i in 1 to 7) new /obj/item/light/bulb(src) - -/obj/item/storage/box/deputy - name = "box of deputy armbands" - desc = "To be issued to those authorized to act as deputy of security." - -/obj/item/storage/box/deputy/PopulateContents() - for(var/i in 1 to 4) //not too many - new /obj/item/clothing/accessory/armband/deputy(src) - new /obj/item/card/deputy_access_card(src) - /obj/item/storage/box/metalfoam name = "box of metal foam grenades" desc = "To be used to rapidly seal hull breaches." - illustration = "flashbang" + illustration = "grenade" /obj/item/storage/box/metalfoam/PopulateContents() for(var/i in 1 to 7) @@ -775,7 +782,7 @@ /obj/item/storage/box/smart_metal_foam name = "box of smart metal foam grenades" desc = "Used to rapidly seal hull breaches. This variety conforms to the walls of its area." - illustration = "flashbang" + illustration = "grenade" /obj/item/storage/box/smart_metal_foam/PopulateContents() for(var/i in 1 to 7) @@ -831,10 +838,14 @@ new /obj/item/reagent_containers/hypospray/medipen(src) if(!isplasmaman(loc)) - new /obj/item/tank/internals/emergency_oxygen(src) + new /obj/item/tank/internals/emergency_oxygen/clown(src) else new /obj/item/tank/internals/plasmaman/belt(src) + if(HAS_TRAIT(SSstation, STATION_TRAIT_PREMIUM_INTERNALS)) + new /obj/item/flashlight/flare(src) + new /obj/item/radio/off(src) + /obj/item/storage/box/rubbershot name = "box of rubber shots" desc = "A box full of rubber shots, designed for riot shotguns." @@ -938,12 +949,12 @@ else if(W.is_sharp()) if(!contents.len) if(item_state == "paperbag_None") - user.show_message("You cut eyeholes into [src].", 1) + user.show_message("You cut eyeholes into [src].", MSG_VISUAL) new /obj/item/clothing/head/papersack(user.loc) qdel(src) return 0 else if(item_state == "paperbag_SmileyFace") - user.show_message("You cut eyeholes into [src] and modify the design.", 1) + 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 @@ -1097,6 +1108,7 @@ /obj/item/storage/box/emptysandbags name = "box of empty sandbags" + illustration = "sandbag" /obj/item/storage/box/emptysandbags/PopulateContents() for(var/i in 1 to 7) @@ -1105,6 +1117,7 @@ /obj/item/storage/box/rndboards name = "\proper the liberator's legacy" desc = "A box containing a gift for worthy golems." + illustration = "scicircuit" /obj/item/storage/box/rndboards/PopulateContents() new /obj/item/circuitboard/machine/protolathe(src) @@ -1115,6 +1128,7 @@ /obj/item/storage/box/silver_sulf name = "box of silver sulfadiazine patches" desc = "Contains patches used to treat burns." + illustration = "firepatch" /obj/item/storage/box/silver_sulf/PopulateContents() for(var/i in 1 to 7) @@ -1122,6 +1136,7 @@ /obj/item/storage/box/fountainpens name = "box of fountain pens" + illustration = "fpen" /obj/item/storage/box/fountainpens/PopulateContents() for(var/i in 1 to 7) @@ -1130,7 +1145,7 @@ /obj/item/storage/box/holy_grenades name = "box of holy hand grenades" desc = "Contains several grenades used to rapidly purge heresy." - illustration = "flashbang" + illustration = "grenade" /obj/item/storage/box/holy_grenades/PopulateContents() for(var/i in 1 to 7) @@ -1183,12 +1198,22 @@ name = "box of materials" illustration = "implant" +/obj/item/storage/box/material/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_combined_w_class = 1000 + STR.max_w_class = WEIGHT_CLASS_GIGANTIC + STR.max_items = 1000 + STR.allow_big_nesting = TRUE + /obj/item/storage/box/material/PopulateContents() var/static/items_inside = list( /obj/item/stack/sheet/iron/fifty=1, \ /obj/item/stack/sheet/glass/fifty=1,\ /obj/item/stack/sheet/rglass=50,\ + /obj/item/stack/sheet/mineral/copper/fifty=1,\ /obj/item/stack/sheet/plasmaglass=50,\ + /obj/item/stack/sheet/plasmarglass=50,\ /obj/item/stack/sheet/titaniumglass=50,\ /obj/item/stack/sheet/plastitaniumglass=50,\ /obj/item/stack/sheet/plasteel=50,\ @@ -1201,9 +1226,18 @@ /obj/item/stack/sheet/mineral/diamond=50,\ /obj/item/stack/sheet/bluespace_crystal=50,\ /obj/item/stack/sheet/mineral/bananium=50,\ - /obj/item/stack/sheet/mineral/wood=50,\ /obj/item/stack/sheet/plastic/fifty=1,\ - /obj/item/stack/sheet/runed_metal/fifty=1 + /obj/item/stack/sheet/runed_metal/fifty=1,\ + /obj/item/stack/tile/brass/fifty=1,\ + /obj/item/stack/sheet/mineral/abductor=50,\ + /obj/item/stack/sheet/mineral/adamantine=50,\ + /obj/item/stack/sheet/mineral/wood=50,\ + /obj/item/stack/sheet/cotton/cloth=50,\ + /obj/item/stack/sheet/leather=50,\ + /obj/item/stack/sheet/bone=12,\ + /obj/item/stack/sheet/cardboard/fifty=1,\ + /obj/item/stack/sheet/mineral/sandstone=50,\ + /obj/item/stack/sheet/mineral/snow=50 ) generate_items_inside(items_inside,src) @@ -1211,27 +1245,48 @@ name = "box of debug tools" icon_state = "syndiebox" +/obj/item/storage/box/debugtools/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_combined_w_class = 1000 + STR.max_w_class = WEIGHT_CLASS_GIGANTIC + STR.max_items = 1000 + STR.allow_big_nesting = TRUE + /obj/item/storage/box/debugtools/PopulateContents() var/static/items_inside = list( /obj/item/flashlight/emp/debug=1,\ /obj/item/pda=1,\ /obj/item/modular_computer/tablet/preset/advanced=1,\ + /obj/item/storage/belt/military/abductor/full=1,\ /obj/item/geiger_counter=1,\ + /obj/item/holosign_creator/atmos=1,\ /obj/item/pipe_dispenser=1,\ /obj/item/construction/rcd/combat/admin=1,\ + /obj/item/areaeditor/blueprints=1,\ /obj/item/card/emag=1,\ - /obj/item/card/id/syndicate/nuke_leader=1,\ - /obj/item/card/id/departmental_budget/car=1,\ /obj/item/stack/spacecash/c1000=50,\ /obj/item/healthanalyzer/advanced=1,\ /obj/item/disk/tech_disk/debug=1,\ /obj/item/disk/surgery/debug=1,\ + /obj/item/disk/data/debug=1,\ /obj/item/uplink/debug=1,\ /obj/item/uplink/nuclear/debug=1,\ + /obj/item/spellbook=1,\ /obj/item/storage/box/beakers/bluespace=1,\ /obj/item/storage/box/beakers/variety=1,\ - /obj/item/storage/box/material=1,\ - /obj/item/storage/box/beakers/bluespace=1,\ - /obj/item/storage/box/beakers/variety=1 + /obj/item/storage/box/material=1 ) generate_items_inside(items_inside,src) + +/obj/item/storage/box/deputy + name = "box of deputy armbands" + desc = "To be issued to those authorized to act as deputy of security." + icon_state = "secbox" + illustration = "depband" + +/obj/item/storage/box/deputy/PopulateContents() + for(var/i in 1 to 4) + new /obj/item/clothing/accessory/armband/deputy(src) + new /obj/item/card/id/pass/deputy(src) + diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 5bbabc4e2600d..d43f8f6f4e3a6 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -150,14 +150,14 @@ /obj/item/storage/fancy/cigarettes/AltClick(mob/living/carbon/user) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return - var/obj/item/clothing/mask/cigarette/W = locate(/obj/item/clothing/mask/cigarette) in contents - if(W && contents.len > 0) - SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, user) - user.put_in_hands(W) - contents -= W - to_chat(user, "You take \a [W] out of the pack.") + var/obj/item/I = locate(/obj/item) in contents + if(I && contents.len > 0) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, I, user) + user.put_in_hands(I) + contents -= I + to_chat(user, "You take \a [I] out of the pack.") else - to_chat(user, "There are no [icon_type]s left in the pack.") + to_chat(user, "There is nothing left in the pack.") /obj/item/storage/fancy/cigarettes/update_icon() if(fancy_open || !contents.len) @@ -187,18 +187,15 @@ /obj/item/storage/fancy/cigarettes/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!ismob(M)) return - var/obj/item/clothing/mask/cigarette/cig = locate(/obj/item/clothing/mask/cigarette) in contents - if(cig) - if(M == user && contents.len > 0 && !user.wear_mask) - var/obj/item/clothing/mask/cigarette/W = cig - SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, M) - M.equip_to_slot_if_possible(W, SLOT_WEAR_MASK) - contents -= W - to_chat(user, "You take \a [W] out of the pack.") - else - ..() - else - to_chat(user, "There are no [icon_type]s left in the pack.") + + var/obj/item/clothing/mask/cigarette/W = locate(/obj/item/clothing/mask/cigarette) in contents + if(!W) + return ..() + if(M == user && contents.len > 0 && !user.wear_mask) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, M) + M.equip_to_slot_if_possible(W, ITEM_SLOT_MASK) + contents -= W + to_chat(user, "You take \a [W] out of the pack.") /obj/item/storage/fancy/cigarettes/dromedaryco name = "\improper DromedaryCo packet" diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index f194f1219db68..2a0eb398519d5 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -147,8 +147,8 @@ if(empty) return var/static/items_inside = list( - /obj/item/reagent_containers/pill/patch/silver_sulf = 3, - /obj/item/reagent_containers/pill/oxandrolone = 2, + /obj/item/reagent_containers/pill/patch/silver_sulf = 4, + /obj/item/storage/pill_bottle/kelotane = 1, /obj/item/reagent_containers/hypospray/medipen = 1, /obj/item/healthanalyzer = 1) generate_items_inside(items_inside,src) @@ -166,16 +166,16 @@ /obj/item/storage/firstaid/toxin/Initialize(mapload) . = ..() - icon_state = pick("antitoxin","antitoxfirstaid","antitoxfirstaid2","antitoxfirstaid3") + icon_state = pick("antitoxin","antitoxin2") /obj/item/storage/firstaid/toxin/PopulateContents() if(empty) return var/static/items_inside = list( - /obj/item/reagent_containers/syringe/antitoxin = 2, + /obj/item/reagent_containers/syringe/antitoxin = 3, /obj/item/reagent_containers/syringe/calomel = 1, /obj/item/reagent_containers/syringe/diphenhydramine = 1, - /obj/item/storage/pill_bottle/charcoal = 2, + /obj/item/storage/pill_bottle/charcoal = 1, /obj/item/healthanalyzer = 1) generate_items_inside(items_inside,src) @@ -207,7 +207,7 @@ /obj/item/storage/firstaid/o2 name = "oxygen deprivation treatment kit" desc = "A box full of oxygen goodies." - icon_state = "o2" + icon_state = "o2firstaid" item_state = "firstaid-o2" damagetype_healed = OXY @@ -241,6 +241,7 @@ return var/static/items_inside = list( /obj/item/reagent_containers/pill/patch/styptic = 4, + /obj/item/storage/pill_bottle/bicaridine = 1, /obj/item/stack/medical/gauze = 2, /obj/item/healthanalyzer = 1) generate_items_inside(items_inside,src) @@ -248,8 +249,8 @@ /obj/item/storage/firstaid/advanced name = "advanced first aid kit" desc = "An advanced kit to help deal with advanced wounds." - icon_state = "radfirstaid" - item_state = "firstaid-rad" + icon_state = "advfirstaid" + item_state = "firstaid-adv" custom_premium_price = 600 /obj/item/storage/firstaid/advanced/PopulateContents() @@ -265,7 +266,11 @@ /obj/item/storage/firstaid/tactical name = "combat medical kit" desc = "I hope you've got insurance." - icon_state = "bezerk" + item_state = "firstaid-combat" + +/obj/item/storage/firstaid/tactical/Initialize(mapload) + . = ..() + icon_state = pick("combatfirstaid","combatfirstaid2") /obj/item/storage/firstaid/tactical/ComponentInitialize() . = ..() @@ -317,12 +322,19 @@ /obj/item/storage/pill_bottle name = "pill bottle" desc = "It's an airtight container for storing medication." - icon_state = "pill_canister" + icon_state = "pill_canister_0" icon = 'icons/obj/chemical.dmi' item_state = "contsolid" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' w_class = WEIGHT_CLASS_SMALL + var/pill_variance = 100 //probability pill_bottle has a different icon state. Put at 0 for no variance + var/pill_type = "pill_canister_" + +/obj/item/storage/pill_bottle/Initialize() + . = ..() + if(prob(pill_variance)) + icon_state = "[pill_type][rand(0,6)]" /obj/item/storage/pill_bottle/ComponentInitialize() . = ..() @@ -343,6 +355,22 @@ for(var/i in 1 to 7) new /obj/item/reagent_containers/pill/charcoal(src) +/obj/item/storage/pill_bottle/bicaridine + name = "bottle of bicaridine pills" + desc = "Contains pills used to treat moderate to small brute injuries." + +/obj/item/storage/pill_bottle/bicaridine/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/pill/bicaridine(src) + +/obj/item/storage/pill_bottle/kelotane + name = "bottle of kelotane pills" + desc = "Contains pills used to treat moderate to small burns." + +/obj/item/storage/pill_bottle/kelotane/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/pill/kelotane(src) + /obj/item/storage/pill_bottle/antirad name = "bottle of anti-radiation pills" desc = "Contains pills used to treat the effects of minor radiation." @@ -375,6 +403,13 @@ for(var/i in 1 to 7) new /obj/item/reagent_containers/pill/mannitol(src) +/obj/item/storage/pill_bottle/mannitol/braintumor //For the brain tumor quirk + desc = "Generously supplied by your Nanotrasen health insurance to treat that pesky tumor in your brain." + +/obj/item/storage/pill_bottle/mannitol/braintumor/PopulateContents() + for(var/i in 1 to 3) + new /obj/item/reagent_containers/pill/mannitol/braintumor(src) + /obj/item/storage/pill_bottle/stimulant name = "bottle of stimulant pills" desc = "Guaranteed to give you that extra burst of energy during a long shift!" diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 1c4981ab81048..52257ab333cae 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -115,7 +115,6 @@ if(!SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)) open = (open ? FALSE : TRUE) update_icon() - ..() /obj/item/storage/lockbox/medal/PopulateContents() new /obj/item/clothing/accessory/medal/gold/captain(src) @@ -176,7 +175,7 @@ /obj/item/storage/lockbox/medal/service/PopulateContents() new /obj/item/clothing/accessory/medal/silver/excellence(src) - + /obj/item/storage/lockbox/medal/sci name = "science medal box" desc = "A locked box used to store medals to be given to members of the science department." diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index 776e585b60983..ba7b05c3e2149 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -21,6 +21,7 @@ var/l_setshort = 0 var/l_hacking = 0 var/open = FALSE + var/can_hack_open = TRUE w_class = WEIGHT_CLASS_NORMAL desc = "This shouldn't exist. If it does, create an issue report." @@ -32,33 +33,34 @@ /obj/item/storage/secure/examine(mob/user) . = ..() - . += "The service panel is currently [open ? "unscrewed" : "screwed shut"]." + if(can_hack_open) + . += "The service panel is currently [open ? "unscrewed" : "screwed shut"]." /obj/item/storage/secure/attackby(obj/item/W, mob/user, params) - if(SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)) + if(can_hack_open && SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)) if (W.tool_behaviour == TOOL_SCREWDRIVER) if (W.use_tool(src, user, 20)) - open =! open + open = !open to_chat(user, "You [open ? "open" : "close"] the service panel.") return if (W.tool_behaviour == TOOL_WIRECUTTER) to_chat(user, "[src] is protected from this sort of tampering, yet it appears the internal memory wires can still be pulsed.") - if ((W.tool_behaviour == TOOL_MULTITOOL) && (!l_hacking)) - if(open == 1) + return + if ((W.tool_behaviour == TOOL_MULTITOOL)) + if(l_hacking) + to_chat(user, "This safe is already being hacked.") + return + if(open) to_chat(user, "Now attempting to reset internal memory, please hold.") - l_hacking = 1 + l_hacking = TRUE if (W.use_tool(src, user, 400)) to_chat(user, "Internal memory reset - lock has been disengaged.") - l_set = 0 - l_hacking = 0 - else - l_hacking = 0 - else - to_chat(user, "You must unscrew the service panel before you can pulse the wiring.") + l_set = FALSE + + l_hacking = FALSE + return + to_chat(user, "You must unscrew the service panel before you can pulse the wiring.") return - //At this point you have exhausted all the special things to do when locked - // ... but it's still locked. - return // -> storage/attackby() what with handle insertion, etc return ..() @@ -105,7 +107,7 @@ if (length(code) > 5) code = "ERROR" add_fingerprint(usr) - for(var/mob/M in viewers(1, loc)) + for(var/mob/M as() in viewers(1, get_turf(src))) if ((M.client && M.machine == src)) attack_self(M) return @@ -165,6 +167,7 @@ icon_sparking = "safespark" desc = "Excellent for securing things away from grubby hands." force = 8 + layer = ABOVE_WINDOW_LAYER w_class = WEIGHT_CLASS_GIGANTIC anchored = TRUE density = FALSE @@ -187,3 +190,34 @@ /obj/item/storage/secure/safe/HoS name = "head of security's safe" + +/** + * This safe is meant to be damn robust. To break in, you're supposed to get creative, or use acid or an explosion. + * + * This makes the safe still possible to break in for someone who is prepared and capable enough, either through + * chemistry, botany or whatever else. + * + * The safe is also weak to explosions, so spending some early TC could allow an antag to blow it upen if they can + * get access to it. + */ +/obj/item/storage/secure/safe/caps_spare + name = "captain's spare ID safe" + desc = "In case of emergency, do not break glass. All Captains and Acting Captains are provided with codes to access this safe. \ +It is made out of the same material as the station's Black Box and is designed to resist all conventional weaponry. \ +There appears to be a small amount of surface corrosion. It doesn't look like it could withstand much of an explosion." + can_hack_open = FALSE + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 70, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 70); + max_integrity = 300 + color = "#ffdd33" + +/obj/item/storage/secure/safe/caps_spare/Initialize() + . = ..() + l_code = SSjob.spare_id_safe_code + l_set = TRUE + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) + +/obj/item/storage/secure/safe/caps_spare/PopulateContents() + new /obj/item/card/id/captains_spare(src) + +/obj/item/storage/secure/safe/caps_spare/rust_heretic_act() + take_damage(damage_amount = 100, damage_type = BRUTE, damage_flag = "melee", armour_penetration = 100) diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index 498baa9f0ffed..4688b33caa89e 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -19,9 +19,14 @@ return FALSE /obj/item/storage/contents_explosion(severity, target) - for(var/atom/A in contents) - A.ex_act(severity, target) - CHECK_TICK + for(var/thing in contents) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += thing + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += thing + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += thing /obj/item/storage/canStrip(mob/who) . = ..() diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 9cd38bc4c10dd..d56227a351b23 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -138,12 +138,12 @@ new /obj/item/wirecutters(src) new /obj/item/t_scanner(src) new /obj/item/crowbar(src) - new /obj/item/stack/cable_coil(src,30,pickedcolor) - new /obj/item/stack/cable_coil(src,30,pickedcolor) + new /obj/item/stack/cable_coil(src,MAXCOIL,pickedcolor) + new /obj/item/stack/cable_coil(src,MAXCOIL,pickedcolor) if(prob(5)) new /obj/item/clothing/gloves/color/yellow(src) else - new /obj/item/stack/cable_coil(src,30,pickedcolor) + new /obj/item/stack/cable_coil(src,MAXCOIL,pickedcolor) /obj/item/storage/toolbox/syndicate name = "suspicious looking toolbox" @@ -179,7 +179,7 @@ new /obj/item/wrench(src) new /obj/item/weldingtool(src) new /obj/item/crowbar(src) - new /obj/item/stack/cable_coil(src,30,pickedcolor) + new /obj/item/stack/cable_coil(src,MAXCOIL,pickedcolor) new /obj/item/wirecutters(src) new /obj/item/multitool(src) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 98215dc072009..34e5f61ad20d5 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -1,20 +1,23 @@ +/obj/item/storage/box/syndie_kit + name = "box" + desc = "A sleek, sturdy box." + icon_state = "syndiebox" + illustration = "writing_syndie" -/obj/item/storage/box/syndicate - -/obj/item/storage/box/syndicate/bundle_A/PopulateContents() +/obj/item/storage/box/syndie_kit/bundle_A/PopulateContents() switch (pickweight(list("recon" = 2, "bloodyspai" = 3, "stealth" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "implant" = 1, "hacker" = 3, "sniper" = 1, "metaops" = 1))) - if("recon") + if("recon") new /obj/item/clothing/glasses/thermal/xray(src) // ~8 tc? new /obj/item/storage/briefcase/launchpad(src) //6 tc - new /obj/item/twohanded/binoculars(src) // 2 tc? + new /obj/item/binoculars(src) // 2 tc? new /obj/item/encryptionkey/syndicate(src) // 2 tc new /obj/item/storage/box/syndie_kit/space(src) //4 tc - new /obj/item/grenade/syndieminibomb/concussion/frag(src) // ~2 tc each? - new /obj/item/grenade/syndieminibomb/concussion/frag(src) + new /obj/item/grenade/frag(src) // ~2 tc each? + new /obj/item/grenade/frag(src) new /obj/item/flashlight/emp(src) new /obj/item/book/granter/martial/karate(src) - if("bloodyspai") + if("bloodyspai") new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set new /obj/item/clothing/mask/chameleon(src) // Goes with above new /obj/item/card/id/syndicate(src) // 2 tc @@ -28,7 +31,7 @@ new /obj/item/flashlight/emp(src) // 2 tc new /obj/item/chameleon(src) // 7 tc - if("stealth") + if("stealth") new /obj/item/gun/energy/kinetic_accelerator/crossbow(src) new /obj/item/pen/sleepy(src) new /obj/item/healthanalyzer/rad_laser(src) @@ -38,7 +41,7 @@ new /obj/item/flashlight/emp(src) new /obj/item/jammer(src) - if("guns") + if("guns") new /obj/item/gun/ballistic/revolver(src) new /obj/item/ammo_box/a357(src) new /obj/item/ammo_box/a357(src) @@ -48,7 +51,7 @@ new /obj/item/clothing/mask/gas/clown_hat(src) new /obj/item/clothing/under/suit/black_really(src) - if("screwed") + if("screwed") new /obj/item/sbeacondrop/bomb(src) new /obj/item/grenade/syndieminibomb(src) new /obj/item/sbeacondrop/powersink(src) @@ -57,7 +60,7 @@ new /obj/item/encryptionkey/syndicate(src) new /obj/item/pen/edagger(src) - if("murder") + if("murder") new /obj/item/melee/transforming/energy/sword/saber(src) new /obj/item/clothing/glasses/thermal/syndi(src) new /obj/item/card/emag(src) @@ -65,7 +68,7 @@ new /obj/item/encryptionkey/syndicate(src) new /obj/item/grenade/syndieminibomb(src) - if("implant") + if("implant") new /obj/item/implanter/freedom(src) new /obj/item/implanter/uplink/precharged(src) new /obj/item/implanter/emp(src) @@ -73,7 +76,7 @@ new /obj/item/implanter/explosive(src) new /obj/item/implanter/storage(src) - if("hacker") + if("hacker") new /obj/item/aiModule/syndicate(src) new /obj/item/card/emag(src) new /obj/item/encryptionkey/binary(src) @@ -85,7 +88,7 @@ new /obj/item/card/id/syndicate(src) new /obj/item/pen/edagger(src) - if("lordsingulo") + if("lordsingulo") new /obj/item/sbeacondrop(src) new /obj/item/clothing/suit/space/syndicate/black/red(src) new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) @@ -93,7 +96,7 @@ new /obj/item/storage/toolbox/syndicate(src) new /obj/item/pen/edagger(src) - if("sabotage") + if("sabotage") new /obj/item/grenade/plastic/c4 (src) new /obj/item/grenade/plastic/c4 (src) new /obj/item/doorCharge(src) @@ -113,7 +116,7 @@ new /obj/item/clothing/mask/gas/clown_hat(src) new /obj/item/clothing/under/suit/black_really(src) - if("metaops") + if("metaops") new /obj/item/clothing/suit/space/hardsuit/syndi(src) // 8 tc new /obj/item/gun/ballistic/shotgun/bulldog/unrestricted(src) // 8 tc new /obj/item/implanter/explosive(src) // 2 tc @@ -122,10 +125,10 @@ new /obj/item/grenade/plastic/c4 (src) // 1 tc new /obj/item/grenade/plastic/c4 (src) // 1 tc new /obj/item/card/emag(src) // 6 tc - -/obj/item/storage/box/syndicate/bundle_B/PopulateContents() + +/obj/item/storage/box/syndie_kit/bundle_B/PopulateContents() switch (pickweight(list( "bond" = 2, "ninja" = 1, "darklord" = 1, "white_whale_holy_grail" = 2, "mad_scientist" = 2, "bee" = 2, "mr_freeze" = 2))) - if("bond") + if("bond") new /obj/item/gun/ballistic/automatic/pistol(src) new /obj/item/suppressor(src) new /obj/item/ammo_box/magazine/m10mm(src) @@ -136,8 +139,8 @@ new /obj/item/reagent_containers/hypospray/medipen/pumpup(src) new /obj/item/reagent_containers/glass/rag(src) new /obj/item/encryptionkey/syndicate(src) - - if("ninja") + + if("ninja") new /obj/item/katana(src) // Unique , hard to tell how much tc this is worth. 8 tc? new /obj/item/implanter/adrenalin(src) // 8 tc for(var/i in 1 to 6) @@ -146,14 +149,14 @@ new /obj/item/card/id/syndicate(src) // 2 tc new /obj/item/chameleon(src) // 7 tc - if("darklord") - new /obj/item/twohanded/dualsaber(src) + if("darklord") + new /obj/item/dualsaber(src) new /obj/item/dnainjector/telemut/darkbundle(src) new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) new /obj/item/card/id/syndicate(src) new /obj/item/clothing/shoes/chameleon/noslip(src) //because slipping while being a dark lord sucks new /obj/item/book/granter/spell/summonitem(src) - + if("white_whale_holy_grail") //Unique items that don't appear anywhere else new /obj/item/pneumatic_cannon/speargun(src) new /obj/item/storage/backpack/magspear_quiver(src) @@ -178,8 +181,8 @@ new /obj/item/pen/edagger(src) new /obj/item/gun/energy/wormhole_projector(src) //mooorttyyyy new /obj/item/gun/energy/decloner/unrestricted(src) - - if("bee") + + if("bee") new /obj/item/paper/fluff/bee_objectives(src) // 0 tc (motivation) new /obj/item/clothing/suit/hooded/bee_costume/syndie(src) // 0 tc new /obj/item/clothing/mask/rat/bee(src) // 0 tc @@ -187,7 +190,7 @@ new /obj/item/storage/box/syndie_kit/bee_grenades(src) // 15 tc new /obj/item/reagent_containers/glass/bottle/beesease(src) // 10 tc? new /obj/item/gun/chem/bee(src) //priceless - + if("mr_freeze") new /obj/item/clothing/glasses/cold(src) new /obj/item/clothing/gloves/color/black(src) @@ -200,33 +203,29 @@ new /obj/item/grenade/gluon(src) new /obj/item/dnainjector/geladikinesis(src) new /obj/item/dnainjector/cryokinesis(src) - new /obj/item/gun/energy/temperature/security(src) + new /obj/item/gun/energy/temperature/pin(src) new /obj/item/melee/transforming/energy/sword/saber/blue(src) //see see it fits the theme bc its blue and ice is blue -/obj/item/storage/box/syndicate/contract_kit +/obj/item/storage/box/syndie_kit/contract_kit name = "Contract Kit" desc = "Supplied to Syndicate contractors." - icon_state = "syndiebox" - illustration = "writing_syndie" -/obj/item/storage/box/syndicate/contractor_loadout +/obj/item/storage/box/syndie_kit/contractor_loadout name = "Standard Loadout" desc = "Supplied to Syndicate contractors, providing their specialised space suit and chameleon uniform." - icon_state = "syndiebox" - illustration = "writing_syndie" /obj/item/paper/contractor_guide name = "Contractor Guide" /obj/item/paper/contractor_guide/Initialize() - info = {"

      Welcome agent, congratulations on your new position as contractor. On top of your already assigned objectives, + info = {"

      Welcome agent, congratulations on your new position as contractor. On top of your already assigned objectives, this kit will provide you contracts to take on for TC payments.

      -

      Provided within, we give your specialist contractor space suit. It's even more compact, being able to fit into a pocket, and faster than the - Syndicate space suit available to you on the uplink. We also provide your chameleon jumpsuit and mask, both of which can be changed +

      Provided within, we give your specialist contractor space suit. It's even more compact, being able to fit into a pocket, and faster than the + Syndicate space suit available to you on the uplink. We also provide your chameleon jumpsuit and mask, both of which can be changed to any form you need for the moment. The cigarettes are a special blend - it'll heal your injuries slowly overtime.

      -

      Your standard issue contractor baton hits harder than the ones you might be used to, and likely be your go to weapon for kidnapping your +

      Your standard issue contractor baton hits harder than the ones you might be used to, and likely be your go to weapon for kidnapping your targets. The three additional items have been randomly selected from what we had available. We hope they're useful to you for your mission.

      The contractor hub, available at the top right of the uplink, will provide you unique items and abilities. These are bought using Contractor Rep, @@ -236,13 +235,13 @@

      1. Open the Syndicate Contract Uplink program.
      2. Here, you can accept a contract, and redeem your TC payments from completed contracts.
      3. -
      4. The payment number shown in brackets is the bonus you'll recieve when bringing your target alive. You recieve the +
      5. The payment number shown in brackets is the bonus you'll receive when bringing your target alive. You receive the other number regardless of if they were alive or dead.
      6. Contracts are completed by bringing the target to designated dropoff, calling for extraction, and putting them inside the pod.
      -

      Be careful when accepting a contract. While you'll be able to see the location of the dropoff point, cancelling will make it +

      Be careful when accepting a contract. While you'll be able to see the location of the dropoff point, cancelling will make it unavailable to take on again.

      The tablet can also be recharged at any cell charger.

      Extracting

      @@ -253,15 +252,15 @@
    • Grab your target, and drag them into the pod.
    • Ransoms

      -

      We need your target for our own reasons, but we ransom them back to your mission area once their use is served. They will return back - from where you sent them off from in several minutes time. Don't worry, we give you a cut of what we get paid. We pay this into whatever +

      We need your target for our own reasons, but we ransom them back to your mission area once their use is served. They will return back + from where you sent them off from in several minutes time. Don't worry, we give you a cut of what we get paid. We pay this into whatever ID card you have equipped, on top of the TC payment we give.

      - +

      Good luck agent. You can burn this document with the supplied lighter.

      "} return ..() -/obj/item/storage/box/syndicate/contractor_loadout/PopulateContents() +/obj/item/storage/box/syndie_kit/contractor_loadout/PopulateContents() new /obj/item/clothing/head/helmet/space/syndicate/contract(src) new /obj/item/clothing/suit/space/syndicate/contract(src) new /obj/item/clothing/under/chameleon(src) @@ -269,31 +268,30 @@ new /obj/item/card/id/syndicate(src) new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src) new /obj/item/lighter(src) + new /obj/item/jammer(src) -/obj/item/storage/box/syndicate/contract_kit/PopulateContents() +/obj/item/storage/box/syndie_kit/contract_kit/PopulateContents() new /obj/item/modular_computer/tablet/syndicate_contract_uplink/preset/uplink(src) - new /obj/item/storage/box/syndicate/contractor_loadout(src) + new /obj/item/storage/box/syndie_kit/contractor_loadout(src) new /obj/item/melee/classic_baton/contractor_baton(src) // All about 4 TC or less - some nukeops only items, but fit nicely to the theme. var/list/item_list = list( /obj/item/storage/backpack/duffelbag/syndie/x4, /obj/item/storage/box/syndie_kit/throwing_weapons, - /obj/item/pen/edagger, /obj/item/pen/sleepy, /obj/item/storage/box/syndie_kit/emp, /obj/item/clothing/shoes/chameleon/noslip, /obj/item/storage/firstaid/tactical, - /obj/item/encryptionkey/binary, /obj/item/clothing/glasses/thermal/syndi, - /obj/item/slimepotion/slime/sentience/nuclear, /obj/item/storage/box/syndie_kit/imp_radio, /obj/item/clothing/gloves/krav_maga/combatglovesplus, /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/riot, /obj/item/reagent_containers/hypospray/medipen/pumpup, /obj/item/compressionkit, - /obj/item/book/granter/martial/karate, - /obj/item/storage/box/syndie_kit/imp_freedom + /obj/item/storage/box/syndie_kit/imp_freedom, + /obj/item/storage/box/syndie_kit/chameleon, + /obj/item/healthanalyzer/rad_laser ) var/obj/item1 = pick_n_take(item_list) @@ -308,12 +306,6 @@ // Paper guide new /obj/item/paper/contractor_guide(src) -/obj/item/storage/box/syndie_kit - name = "box" - desc = "A sleek, sturdy box." - icon_state = "syndiebox" - illustration = "writing_syndie" - /obj/item/storage/box/syndie_kit/origami_bundle name = "origami kit" desc = "A box full of a number of rather masterfully engineered paper planes and a manual on \"The Art of Origami\"." @@ -393,7 +385,7 @@ if(prob(50)) new /obj/item/clothing/suit/space/syndicate/black/red(src) // Black and red is so in right now new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) - + else new /obj/item/clothing/head/helmet/space/syndicate(src) new /obj/item/clothing/suit/space/syndicate(src) @@ -565,3 +557,29 @@ new /obj/item/storage/belt/soulstone/full/purified(src) new /obj/item/sbeacondrop/constructshell(src) new /obj/item/sbeacondrop/constructshell(src) + +/obj/item/storage/box/syndie_kit/mimesabrekit + name = "Baguette blade bundle" + desc = "Provides you with a hardly noticable blade hidden inside a baguette disguise." + +/obj/item/storage/box/syndie_kit/mimesabrekit/PopulateContents() + new /obj/item/storage/belt/sabre/mime(src) + +/obj/item/storage/box/syndie_kit/imp_deathrattle + name = "deathrattle implant box" + desc = "Contains eight linked deathrattle implants." + +/obj/item/storage/box/syndie_kit/imp_deathrattle/PopulateContents() + new /obj/item/implanter(src) + + var/datum/deathrattle_group/group = new + + var/implants = list() + for(var/j in 1 to 8) + var/obj/item/implantcase/deathrattle/case = new (src) + implants += case.imp + + for(var/i in implants) + group.register(i) + desc += " The implants are registered to the \"[group.name]\" group." + diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm index 33a7478db4322..e1fa7b42b6e0b 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -13,7 +13,6 @@ . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 4 - STR.cant_hold = typecacheof(list(/obj/item/screwdriver/power)) //Must be specifically called out since normal screwdrivers can fit but not the wrench form of the drill STR.can_hold = typecacheof(list( /obj/item/stack/spacecash, /obj/item/holochip, diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 0d9e6c75563b0..afd649e36a2eb 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -8,11 +8,9 @@ slot_flags = ITEM_SLOT_BELT force = 5 throwforce = 7 - block_upgrade_walk = 1 - block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY w_class = WEIGHT_CLASS_NORMAL attack_verb = list("enforced the law upon") - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "stamina" = 0) var/stunforce = 75 var/turned_on = FALSE @@ -91,15 +89,15 @@ if(istype(W, /obj/item/stock_parts/cell)) var/obj/item/stock_parts/cell/C = W if(cell) - to_chat(user, "[src] already has a cell.") + balloon_alert(user, "[src] already has a cell") else if(C.maxcharge < hitcost) - to_chat(user, "[src] requires a higher capacity cell.") + balloon_alert(user, "[src] requires a higher capacity cell") return if(!user.transferItemToLoc(W, src)) return cell = W - to_chat(user, "You install a cell in [src].") + balloon_alert(user, "Cell installed") update_icon() else if(W.tool_behaviour == TOOL_SCREWDRIVER) @@ -107,7 +105,7 @@ cell.update_icon() cell.forceMove(get_turf(src)) cell = null - to_chat(user, "You remove the cell from [src].") + balloon_alert(user, "Cell removed") turned_on = FALSE update_icon() else @@ -116,14 +114,14 @@ /obj/item/melee/baton/attack_self(mob/user) if(cell && cell.charge > hitcost) turned_on = !turned_on - to_chat(user, "[src] is now [turned_on ? "on" : "off"].") + balloon_alert(user, "[src] [turned_on ? "on" : "off"]") playsound(src, "sparks", 75, TRUE, -1) else turned_on = FALSE if(!cell) - to_chat(user, "[src] does not have a power source!") + balloon_alert(user, "No power source") else - to_chat(user, "[src] is out of charge.") + balloon_alert(user, "Out of charge") update_icon() add_fingerprint(user) @@ -173,7 +171,7 @@ return FALSE var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(user.zone_selected)) - var/armor_block = target.run_armor_check(affecting, "energy") + var/armor_block = target.run_armor_check(affecting, "stamina") // L.adjustStaminaLoss(stunforce) target.apply_damage(stunforce, STAMINA, affecting, armor_block) target.apply_effect(EFFECT_STUTTER, stunforce) @@ -228,4 +226,3 @@ if(sparkler) QDEL_NULL(sparkler) return ..() - diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 9f3d18f0f89e2..9fa0357c4707b 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -8,7 +8,7 @@ w_class = WEIGHT_CLASS_BULKY distribute_pressure = ONE_ATMOSPHERE * O2STANDARD actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization) - var/gas_type = /datum/gas/oxygen + var/gas_type = GAS_O2 var/on = FALSE var/stabilizers = FALSE var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not @@ -19,6 +19,10 @@ ion_trail = new ion_trail.set_up(src) +/obj/item/tank/jetpack/Destroy() + QDEL_NULL(ion_trail) + return ..() + /obj/item/tank/jetpack/populate_gas() if(gas_type) air_contents.set_moles(gas_type, ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C))) @@ -66,6 +70,8 @@ user.remove_movespeed_modifier(MOVESPEED_ID_JETPACK) /obj/item/tank/jetpack/proc/move_react(mob/user) + SIGNAL_HANDLER + allow_thrust(0.01, user) /obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user) @@ -75,13 +81,7 @@ turn_off(user) return - var/datum/gas_mixture/removed = air_contents.remove(num) - if(removed.total_moles() < 0.005) - turn_off(user) - return - - var/turf/T = get_turf(user) - T.assume_air(removed) + assume_air_moles(air_contents, num) return TRUE @@ -114,13 +114,7 @@ turn_off(user) return - var/datum/gas_mixture/removed = air_contents.remove(num) - if(removed.total_moles() < 0.005) - turn_off(user) - return - - var/turf/T = get_turf(user) - T.assume_air(removed) + assume_air_moles(air_contents, num) return TRUE @@ -168,7 +162,7 @@ icon_state = "jetpack-black" item_state = "jetpack-black" distribute_pressure = 0 - gas_type = /datum/gas/carbon_dioxide + gas_type = GAS_CO2 /obj/item/tank/jetpack/suit diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index d287a570ec782..d56e84a3af417 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -20,7 +20,7 @@ /obj/item/tank/internals/oxygen/populate_gas() - air_contents.set_moles(/datum/gas/oxygen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_O2, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/oxygen/yellow desc = "A tank of oxygen, this one is yellow." @@ -46,8 +46,8 @@ force = 10 /obj/item/tank/internals/anesthetic/populate_gas() - air_contents.set_moles(/datum/gas/oxygen, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) - air_contents.set_moles(/datum/gas/nitrous_oxide, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) + air_contents.set_moles(GAS_O2, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) + air_contents.set_moles(GAS_NITROUS, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) /* * Air @@ -61,8 +61,8 @@ dog_fashion = /datum/dog_fashion/back /obj/item/tank/internals/air/populate_gas() - air_contents.set_moles(/datum/gas/oxygen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) - air_contents.set_moles(/datum/gas/nitrogen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) + air_contents.set_moles(GAS_O2, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) + air_contents.set_moles(GAS_N2, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) /* * Plasma @@ -77,7 +77,7 @@ /obj/item/tank/internals/plasma/populate_gas() - air_contents.set_moles(/datum/gas/plasma, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_PLASMA, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/flamethrower)) @@ -93,7 +93,7 @@ return ..() /obj/item/tank/internals/plasma/full/populate_gas() - air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasma/empty/populate_gas() return @@ -111,10 +111,10 @@ distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE /obj/item/tank/internals/plasmaman/populate_gas() - air_contents.set_moles(/datum/gas/plasma, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_PLASMA, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasmaman/full/populate_gas() - air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasmaman/empty/populate_gas() return @@ -130,7 +130,7 @@ w_class = WEIGHT_CLASS_SMALL //thanks i forgot this /obj/item/tank/internals/plasmaman/belt/full/populate_gas() - air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasmaman/belt/empty/populate_gas() return @@ -153,7 +153,7 @@ /obj/item/tank/internals/emergency_oxygen/populate_gas() - air_contents.set_moles(/datum/gas/oxygen, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_O2, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/emergency_oxygen/empty/populate_gas() return @@ -181,3 +181,18 @@ /obj/item/tank/internals/emergency_oxygen/double/empty/populate_gas() return + +/obj/item/tank/internals/emergency_oxygen/clown + name = "emergency prank tank" + desc = "Used for pranking in emergencies! Has a smidge of a mystery ingredient for 200% FUN!" + icon_state = "clown" + flags_1 = CONDUCT_1 + slot_flags = ITEM_SLOT_BELT + w_class = WEIGHT_CLASS_SMALL + force = 4 + distribute_pressure = 24 + volume = 1 + +/obj/item/tank/internals/emergency_oxygen/clown/populate_gas() + air_contents.set_moles(GAS_O2, (9.99*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_NITROUS, (0.01*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index b28e7988366e9..145574c3d49d9 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -13,7 +13,7 @@ throw_range = 4 materials = list(/datum/material/iron = 500) actions_types = list(/datum/action/item_action/set_internals) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 30, "stamina" = 0) var/datum/gas_mixture/air_contents = null var/distribute_pressure = ONE_ATMOSPHERE var/integrity = 3 @@ -66,7 +66,7 @@ /obj/item/tank/Destroy() if(air_contents) - qdel(air_contents) + QDEL_NULL(air_contents) STOP_PROCESSING(SSobj, src) . = ..() @@ -157,6 +157,7 @@ if(!ui) ui = new(user, src, "Tank") ui.open() + ui.set_autoupdate(TRUE) /obj/item/tank/ui_data(mob/user) var/list/data = list() @@ -205,6 +206,9 @@ /obj/item/tank/remove_air(amount) return air_contents.remove(amount) +/obj/item/tank/remove_air_ratio(ratio) + return air_contents.remove_ratio(ratio) + /obj/item/tank/return_air() return air_contents @@ -217,6 +221,18 @@ check_status() return 1 +/obj/item/tank/assume_air_moles(datum/gas_mixture/giver, moles) + giver.transfer_to(air_contents, moles) + + check_status() + return 1 + +/obj/item/tank/assume_air_ratio(datum/gas_mixture/giver, ratio) + giver.transfer_ratio_to(air_contents, ratio) + + check_status() + return 1 + /obj/item/tank/proc/remove_air_volume(volume_to_return) if(!air_contents) return null @@ -231,7 +247,7 @@ /obj/item/tank/process() //Allow for reactions - air_contents.react() + air_contents.react(src) check_status() /obj/item/tank/proc/check_status() @@ -245,7 +261,7 @@ if(pressure > TANK_FRAGMENT_PRESSURE) if(!istype(src.loc, /obj/item/transfer_valve)) - log_bomber(get_mob_by_key(fingerprintslast), "was last key to touch", src, "which ruptured explosively") + log_bomber(get_mob_by_ckey(fingerprintslast), "was last key to touch", src, "which ruptured explosively") //Give the gas a chance to build up more pressure through reacting air_contents.react(src) air_contents.react(src) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 028bb874af43e..82a73d82f21d9 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -12,7 +12,7 @@ slowdown = 1 actions_types = list(/datum/action/item_action/toggle_mister) max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30, "stamina" = 0) resistance_flags = FIRE_PROOF var/obj/item/noz @@ -60,7 +60,7 @@ /obj/item/watertank/equipped(mob/user, slot) ..() - if(slot != SLOT_BACK) + if(slot != ITEM_SLOT_BACK) remove_noz() /obj/item/watertank/proc/remove_noz() @@ -82,8 +82,8 @@ /obj/item/watertank/MouseDrop(obj/over_object) var/mob/M = loc - if(istype(M) && istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + if(istype(M) && istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) return ..() @@ -281,9 +281,7 @@ step_towards(A, target) sleep(2) A.Smoke() - spawn(100) - if(src) - resin_cooldown = FALSE + addtimer(VARSET_CALLBACK(src, resin_cooldown, FALSE), 10 SECONDS) return if(nozzle_mode == RESIN_FOAM) if(!Adj|| !isturf(target)) @@ -296,12 +294,14 @@ var/obj/effect/particle_effect/foam/metal/resin/F = new (get_turf(target)) F.amount = 0 metal_synthesis_cooldown++ - spawn(100) - metal_synthesis_cooldown-- + addtimer(CALLBACK(src, .proc/reduce_metal_synth_cooldown), 10 SECONDS) else to_chat(user, "Resin foam mix is still being synthesized...") return +/obj/item/extinguisher/mini/nozzle/proc/reduce_metal_synth_cooldown() + metal_synthesis_cooldown-- + /obj/effect/resin_container name = "resin container" desc = "A compacted ball of expansive resin, used to repair the atmosphere in a room, or seal off breaches." @@ -337,7 +337,8 @@ var/on = FALSE volume = 300 var/usage_ratio = 5 //5 unit added per 1 removed - var/injection_amount = 1 + /// How much to inject per second + var/injection_amount = 0.5 amount_per_transfer_from_this = 5 reagent_flags = OPENCONTAINER spillable = FALSE @@ -349,14 +350,14 @@ toggle_injection() /obj/item/reagent_containers/chemtank/item_action_slot_check(slot, mob/user) - if(slot == SLOT_BACK) + if(slot == ITEM_SLOT_BACK) return 1 /obj/item/reagent_containers/chemtank/proc/toggle_injection() var/mob/living/carbon/human/user = usr if(!istype(user)) return - if (user.get_item_by_slot(SLOT_BACK) != src) + if (user.get_item_by_slot(ITEM_SLOT_BACK) != src) to_chat(user, "The chemtank needs to be on your back before you can activate it!") return if(on) @@ -395,7 +396,7 @@ if(ismob(loc)) to_chat(loc, "[src] turns off.") -/obj/item/reagent_containers/chemtank/process() +/obj/item/reagent_containers/chemtank/process(delta_time) if(!ishuman(loc)) turn_off() return @@ -407,7 +408,7 @@ turn_off() return - var/used_amount = injection_amount/usage_ratio + var/used_amount = (injection_amount * delta_time) /usage_ratio reagents.reaction(user, INJECT,injection_amount,0) reagents.trans_to(user,used_amount,multiplier=usage_ratio) update_icon() diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index 044f1048afdf2..3fe7e32c8ef55 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -6,6 +6,7 @@ * Contains: * Locator * Hand-tele + * Syndicate Teleporter */ /* @@ -59,7 +60,7 @@ if (!W.renamed) continue var/turf/tr = get_turf(W) - if (tr.z == sr.z && tr) + if (tr.get_virtual_z_level() == sr.get_virtual_z_level() && tr) var/direct = max(abs(tr.x - sr.x), abs(tr.y - sr.y)) if (direct < 5) direct = "very strong" @@ -84,7 +85,7 @@ continue var/turf/tr = get_turf(W) - if (tr.z == sr.z && tr) + if (tr.get_virtual_z_level() == sr.get_virtual_z_level() && tr) var/direct = max(abs(tr.x - sr.x), abs(tr.y - sr.y)) if (direct < 20) if (direct < 5) @@ -105,8 +106,8 @@ if (ismob(src.loc)) attack_self(src.loc) else - for(var/mob/M in viewers(1, src)) - if (M.client) + for(var/mob/M as() in viewers(1, src)) + if(M.client) src.attack_self(M) return @@ -127,7 +128,7 @@ throw_speed = 3 throw_range = 5 materials = list(/datum/material/iron=10000) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "stamina" = 0) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF var/list/active_portal_pairs var/max_portal_pairs = 3 @@ -156,27 +157,30 @@ /obj/item/hand_tele/attack_self(mob/user) var/turf/current_location = get_turf(user)//What turf is the user on? var/area/current_area = current_location.loc - if(!current_location || current_area.noteleport || is_away_level(current_location.z) || is_centcom_level(current_location.z) || !isturf(user.loc))//If turf was not found or they're on z level 2 or >7 which does not currently exist. or if user is not located on a turf + if(!current_location || current_area.teleport_restriction || is_away_level(current_location.z) || is_centcom_level(current_location.z) || !isturf(user.loc))//If turf was not found or they're on z level 2 or >7 which does not currently exist. or if user is not located on a turf to_chat(user, "\The [src] is malfunctioning.") return - var/list/L = list( ) + var/list/L = list() for(var/obj/machinery/computer/teleporter/com in GLOB.machines) - if(com.target) - var/area/A = get_area(com.target) - if(!A || A.noteleport) - continue - if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged) - L["[get_area(com.target)] (Active)"] = com.target - else - L["[get_area(com.target)] (Inactive)"] = com.target - var/list/turfs = list( ) - for(var/turf/T in urange(10, orange=1)) + var/atom/target = com.target_ref?.resolve() + if(!target) + com.target_ref = null + continue + var/area/A = get_area(target) + if(!A || A.teleport_restriction) + continue + if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged) + L["[get_area(target)] (Active)"] = target + else + L["[get_area(target)] (Inactive)"] = target + var/list/turfs = list() + for(var/turf/T as() in (RANGE_TURFS(10, user) - get_turf(user))) if(T.x>world.maxx-8 || T.x<8) continue //putting them at the edge is dumb if(T.y>world.maxy-8 || T.y<8) continue var/area/A = T.loc - if(A.noteleport) + if(A.teleport_restriction) continue turfs += T if(turfs.len) @@ -189,15 +193,15 @@ return var/atom/T = L[t1] var/area/A = get_area(T) - if(A.noteleport) + if(A.teleport_restriction) to_chat(user, "\The [src] is malfunctioning.") return current_location = get_turf(user) //Recheck. current_area = current_location.loc - if(!current_location || current_area.noteleport || is_away_level(current_location.z) || is_centcom_level(current_location.z) || !isturf(user.loc))//If turf was not found or they're on z level 2 or >7 which does not currently exist. or if user is not located on a turf + if(!current_location || current_area.teleport_restriction || is_away_level(current_location.z) || is_centcom_level(current_location.z) || !isturf(user.loc))//If turf was not found or they're on z level 2 or >7 which does not currently exist. or if user is not located on a turf to_chat(user, "\The [src] is malfunctioning.") return - user.show_message("Locked In.", 2) + user.show_message("Locked In.", MSG_AUDIBLE) var/list/obj/effect/portal/created = create_portal_pair(current_location, get_teleport_turf(get_turf(T)), src, 300, 1, null, atmos_link_override) if(!(LAZYLEN(created) == 2)) return @@ -228,9 +232,167 @@ var/obj/item/bodypart/head/head = itemUser.get_bodypart(BODY_ZONE_HEAD) if(head) head.drop_limb() - var/list/safeLevels = SSmapping.levels_by_any_trait(list(ZTRAIT_SPACE_RUINS, ZTRAIT_LAVA_RUINS, ZTRAIT_STATION, ZTRAIT_MINING)) + var/list/safeLevels = SSmapping.levels_by_any_trait(list(ZTRAIT_DYNAMIC_LEVEL, ZTRAIT_LAVA_RUINS, ZTRAIT_STATION, ZTRAIT_MINING)) head.forceMove(locate(rand(1, world.maxx), rand(1, world.maxy), pick(safeLevels))) itemUser.visible_message("The portal snaps closed taking [user]'s head with it!") else itemUser.visible_message("[user] looks even further depressed as they realize they do not have a head...and suddenly dies of shame!") return (BRUTELOSS) + +/* + * Syndicate Teleporter + */ + +/obj/item/teleporter + name = "syndicate teleporter" + desc = "A Syndicate reverse-engineered version of the Nanotrasen portable handheld teleporter. It uses bluespace technology to translocate users, but lacks the advanced safety features of its counterpart. Warranty voided if exposed to an electromagnetic pulse." + icon = 'icons/obj/device.dmi' + icon_state = "syndi_tele" + item_state = "electronic" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + throwforce = 5 + w_class = WEIGHT_CLASS_SMALL + throw_speed = 4 + throw_range = 10 + + //Uses of the device left + var/charges = 4 + //The maximum number of stored uses + var/max_charges = 4 + var/minimum_teleport_distance = 4 + var/maximum_teleport_distance = 8 + //How far the emergency teleport checks for a safe position + var/parallel_teleport_distance = 3 + //How long it takes to replenish a charge + var/recharge_time = 15 SECONDS + //If the device is recharging, prevents timers stacking + var/recharging = FALSE + //stores the recharge timer id + var/recharge_timer + +/obj/item/teleporter/examine(mob/user) + . = ..() + . += "[src] has [charges] out of [max_charges] charges left." + if(recharging) + . += "A small display on the back reads:" + var/timeleft = timeleft(recharge_timer) + var/loadingbar = num2loadingbar(timeleft/recharge_time, reverse=TRUE) + . += "CHARGING: [loadingbar] ([timeleft*0.1]s)" + +/obj/item/teleporter/attack_self(mob/user) + ..() + attempt_teleport(user, FALSE) + +/obj/item/teleporter/proc/check_charges() + if(recharging) + return + if(charges < max_charges) + recharge_timer = addtimer(CALLBACK(src, .proc/recharge), recharge_time, TIMER_STOPPABLE) + recharging = TRUE + +/obj/item/teleporter/proc/recharge() + charges++ + playsound(src,'sound/machines/twobeep.ogg',10,TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) + recharging = FALSE + check_charges() + +/obj/item/teleporter/emp_act(severity) + if(prob(50 / severity)) + if(istype(loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/user = loc + to_chat(user, "[src] buzzes and activates!") + attempt_teleport(user, TRUE) //EMP Activates a teleport with no safety. + else + visible_message("[src] activates and blinks out of existence!") + do_sparks(2, 1, src) + qdel(src) + +/obj/item/teleporter/proc/attempt_teleport(mob/user, EMP_D = FALSE) + if(!charges) + to_chat(user, "[src] is still recharging.") + return + + var/turf/current_location = get_turf(user) + var/area/current_area = current_location.loc + if(!current_location || current_area.teleport_restriction || is_away_level(current_location.z) || is_centcom_level(current_location.z) || !isturf(user.loc))//If turf was not found or they're on z level 2 or >7 which does not currently exist. or if user is not located on a turf + to_chat(user, "\The [src] is malfunctioning.") + return + + var/mob/living/carbon/C = user + var/teleport_distance = rand(minimum_teleport_distance,maximum_teleport_distance) + var/turf/destination = get_teleport_loc(current_location,C,teleport_distance,0,0,0,0,0,0) + var/list/bagholding = user.GetAllContents(/obj/item/storage/backpack/holding) + + if(isclosedturf(destination)) + if(!EMP_D && !(bagholding.len)) + panic_teleport(user, destination) //We're in a wall, engage emergency parallel teleport. + else + get_fragged(user, destination) //EMP teleported you into a wall? Wearing a BoH? You're dead. + else + telefrag(destination, user) + do_teleport(C, destination, channel = TELEPORT_CHANNEL_FREE) + charges-- + check_charges() + new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(current_location) + new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(destination) + playsound(destination, 'sound/effects/phasein.ogg', 25, 1) + playsound(destination, "sparks", 50, 1) + +/obj/item/teleporter/proc/panic_teleport(mob/user, turf/destination) + var/mob/living/carbon/C = user + var/turf/mobloc = get_turf(C) + var/turf/emergency_destination = get_teleport_loc(destination,C,0,0,1,parallel_teleport_distance,0,0,0) + + if(emergency_destination) + telefrag(emergency_destination, user) + do_teleport(C, emergency_destination, channel = TELEPORT_CHANNEL_FREE) + charges-- + check_charges() + new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(mobloc) + new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(emergency_destination) + playsound(emergency_destination, 'sound/effects/phasein.ogg', 25, 1) + playsound(emergency_destination, "sparks", 50, 1) + else //We tried to save. We failed. Death time. + get_fragged(user, destination) + +/obj/item/teleporter/proc/get_fragged(mob/user, turf/destination) + var/turf/mobloc = get_turf(user) + if(do_teleport(user, destination, channel = TELEPORT_CHANNEL_FREE, no_effects = TRUE)) + playsound(mobloc, "sparks", 50, TRUE) + new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(mobloc) + new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(destination) + playsound(destination, "sparks", 50, TRUE) + playsound(destination, "sound/magic/disintegrate.ogg", 50, TRUE) + to_chat(user, "You teleport into the wall, the teleporter tries to save you, but-") + destination.ex_act(2) //Destroy the wall + user.gib() + +/obj/item/teleporter/proc/telefrag(turf/fragging_location, mob/user) + for(var/mob/living/M in fragging_location)//Hit everything in the turf + M.apply_damage(20, BRUTE) + M.Paralyze(30) + to_chat(M, "[user] teleports into you, knocking you to the floor with the bluespace wave!") + +/obj/item/paper/teleporter + name = "Teleporter Guide" + icon_state = "paper" + info = {"Instructions on your new prototype syndicate teleporter:
      +
      + This experimental teleporter will teleport the user 4-8 meters in the direction they are facing. Anything you are pulling will not be teleported with you.
      +
      + It has 4 charges, and will recharge over time. No, sticking the teleporter into the tesla, an APC, a microwave, or an electrified door will not make it charge faster.
      +
      + Warning: Teleporting into walls will activate a failsafe teleport parallel up to 3 meters, but the user will be ripped apart and gibbed in the wall if it fails to find a safe location.
      +
      + Do not expose the teleporter to electromagnetic pulses, or possess a bag of holding while operating it. Unwanted malfunctions may occur. +"} +/obj/item/storage/box/syndie_kit/teleporter + name = "syndicate teleporter kit" + +/obj/item/storage/box/syndie_kit/teleporter/PopulateContents() + new /obj/item/teleporter(src) + new /obj/item/paper/teleporter(src) + +/obj/effect/temp_visual/teleport_abductor/syndi_teleporter + duration = 5 diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index bc0878074d1b8..cc57661bea739 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -17,7 +17,7 @@ attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") tool_behaviour = TOOL_CROWBAR toolspeed = 1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30, "stamina" = 0) /obj/item/crowbar/suicide_act(mob/user) user.visible_message("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -56,31 +56,6 @@ item_state = "crowbar" toolspeed = 0.7 -/obj/item/crowbar/power - name = "jaws of life" - desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a prying head." - icon_state = "jaws_pry" - item_state = "jawsoflife" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - materials = list(/datum/material/iron=150,/datum/material/silver=50,/datum/material/titanium=25) - - usesound = 'sound/items/jaws_pry.ogg' - force = 15 - toolspeed = 0.7 - -/obj/item/crowbar/power/suicide_act(mob/user) - user.visible_message("[user] is putting [user.p_their()] head in [src], it looks like [user.p_theyre()] trying to commit suicide!") - playsound(loc, 'sound/items/jaws_pry.ogg', 50, 1, -1) - return (BRUTELOSS) - -/obj/item/crowbar/power/attack_self(mob/user) - playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1) - var/obj/item/wirecutters/power/cutjaws = new /obj/item/wirecutters/power(drop_location()) - to_chat(user, "You attach the cutting jaws to [src].") - qdel(src) - user.put_in_active_hand(cutjaws) - /obj/item/crowbar/cyborg name = "hydraulic crowbar" desc = "A hydraulic prying tool, simple but powerful." @@ -88,4 +63,4 @@ icon_state = "crowbar_cyborg" usesound = 'sound/items/jaws_pry.ogg' force = 10 - toolspeed = 0.5 \ No newline at end of file + toolspeed = 0.5 diff --git a/code/game/objects/items/tools/powertools.dm b/code/game/objects/items/tools/powertools.dm new file mode 100644 index 0000000000000..e4a5002da6b88 --- /dev/null +++ b/code/game/objects/items/tools/powertools.dm @@ -0,0 +1,158 @@ +/obj/item/powertool + name = "Power tool" + desc = "A basic powertool that does nothing." + icon = 'icons/obj/tools.dmi' + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + w_class = WEIGHT_CLASS_SMALL + materials = list(/datum/material/iron=150,/datum/material/silver=50,/datum/material/titanium=25) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30, "stamina" = 0) + flags_1 = CONDUCT_1 + slot_flags = ITEM_SLOT_BELT + toolspeed = 0.7 + +/obj/item/powertool/attack_self(mob/user) + toggle_mode(user) + +/obj/item/powertool/proc/toggle_mode(mob/user) + return + +//Hand Drill + +/obj/item/powertool/hand_drill + name = "hand drill" + desc = "A simple powered hand drill. It's fitted with a screw bit." + icon_state = "drill_screw" + item_state = "drill" + + force = 8 //might or might not be too high, subject to change + throwforce = 8 + throw_speed = 2 + throw_range = 3//it's heavier than a screw driver/wrench, so it does more damage, but can't be thrown as far + + hitsound = 'sound/items/drill_hit.ogg' + + tool_behaviour = TOOL_SCREWDRIVER + usesound = 'sound/items/drill_use.ogg' + +/obj/item/powertool/hand_drill/toggle_mode(mob/user) + playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, 1) + if(tool_behaviour == TOOL_SCREWDRIVER) + balloon_alert(user, "Bolt driver bit attached") + become_wrench() + else + balloon_alert(user, "Screw driver bit attached") + become_screwdriver() + +/obj/item/powertool/hand_drill/proc/become_wrench() + icon_state = "drill_bolt" + tool_behaviour = TOOL_WRENCH + + hitsound = null + + attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") + throw_range = 7 + +/obj/item/powertool/hand_drill/proc/become_screwdriver() + icon_state = "drill_screw" + tool_behaviour = TOOL_SCREWDRIVER + + hitsound = 'sound/items/drill_hit.ogg' + + attack_verb = list("drilled", "screwed", "jabbed") + throw_range = 3 + +/obj/item/powertool/hand_drill/suicide_act(mob/user) + if(tool_behaviour == TOOL_SCREWDRIVER) + user.visible_message("[user] is putting [src] to [user.p_their()] temple. It looks like [user.p_theyre()] trying to commit suicide!") + else + user.visible_message("[user] is pressing [src] against [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!") + return BRUTELOSS + +/obj/item/powertool/hand_drill/attack(mob/living/M, mob/living/user) + if(!istype(M) || tool_behaviour != TOOL_SCREWDRIVER) + return ..() + if(user.zone_selected != BODY_ZONE_PRECISE_EYES && user.zone_selected != BODY_ZONE_HEAD) + return ..() + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + to_chat(user, "You don't want to harm [M]!") + return + if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) + M = user + return eyestab(M,user) + +//Jaws of life + +/obj/item/powertool/jaws_of_life + name = "jaws of life" + desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a prying head." + usesound = 'sound/items/jaws_pry.ogg' + icon_state = "jaws_pry" + item_state = "jawsoflife" + + tool_behaviour = TOOL_CROWBAR + + force = 15 + throwforce = 7 + attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") + +/obj/item/powertool/jaws_of_life/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_DOOR_PRYER, TRAIT_JAWS_OF_LIFE) + +/obj/item/powertool/jaws_of_life/toggle_mode(mob/user) + playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1) + if(tool_behaviour == TOOL_CROWBAR) + balloon_alert(user, "Cutting jaws attached") + become_wirecutters() + else + balloon_alert(user, "Prying jaws attached") + become_crowbar() + +/obj/item/powertool/jaws_of_life/proc/become_wirecutters() + icon_state = "jaws_cutter" + tool_behaviour = TOOL_WIRECUTTER + + usesound = 'sound/items/jaws_cut.ogg' + + attack_verb = list("pinched", "nipped") + force = 6 + throw_speed = 3 + + REMOVE_TRAIT(src, TRAIT_DOOR_PRYER, TRAIT_JAWS_OF_LIFE) + +/obj/item/powertool/jaws_of_life/proc/become_crowbar() + icon_state = "jaws_pry" + tool_behaviour = TOOL_CROWBAR + + usesound = 'sound/items/jaws_pry.ogg' + + attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") + force = 15 + throw_speed = 2 + + ADD_TRAIT(src, TRAIT_DOOR_PRYER, TRAIT_JAWS_OF_LIFE) + +/obj/item/powertool/jaws_of_life/suicide_act(mob/user) + if(tool_behaviour == TOOL_CROWBAR) + user.visible_message("[user] is putting [user.p_their()] head in [src], it looks like [user.p_theyre()] trying to commit suicide!") + playsound(loc, 'sound/items/jaws_pry.ogg', 50, 1, -1) + else + user.visible_message("[user] is wrapping \the [src] around [user.p_their()] neck. It looks like [user.p_theyre()] trying to rip [user.p_their()] head off!") + playsound(loc, 'sound/items/jaws_cut.ogg', 50, 1, -1) + if(iscarbon(user)) + var/mob/living/carbon/C = user + var/obj/item/bodypart/BP = C.get_bodypart(BODY_ZONE_HEAD) + if(BP) + BP.drop_limb() + playsound(loc,pick('sound/misc/desecration-01.ogg','sound/misc/desecration-02.ogg','sound/misc/desecration-01.ogg') ,50, 1, -1) + return BRUTELOSS + +/obj/item/powertool/jaws_of_life/attack(mob/living/carbon/C, mob/living/user) + if(tool_behaviour == TOOL_WIRECUTTER && istype(C) && C.handcuffed) + user.visible_message("[user] cuts [C]'s restraints with [src]!") + log_combat(user, C, "cut handcuffs from") + qdel(C.handcuffed) + return + else + ..() diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index b227e78888477..a69f47b9d3be8 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -19,7 +19,7 @@ usesound = list('sound/items/screwdriver.ogg', 'sound/items/screwdriver2.ogg') tool_behaviour = TOOL_SCREWDRIVER toolspeed = 1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30, "stamina" = 0) var/random_color = TRUE //if the screwdriver uses random coloring var/static/list/screwdriver_colors = list( "blue" = rgb(24, 97, 213), @@ -104,36 +104,6 @@ /obj/item/screwdriver/abductor/get_belt_overlay() return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "screwdriver_nuke") -/obj/item/screwdriver/power - name = "hand drill" - desc = "A simple powered hand drill. It's fitted with a screw bit." - icon_state = "drill_screw" - item_state = "drill" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - materials = list(/datum/material/iron=150,/datum/material/silver=50,/datum/material/titanium=25) //done for balance reasons, making them high value for research, but harder to get - force = 8 //might or might not be too high, subject to change - w_class = WEIGHT_CLASS_SMALL - throwforce = 8 - throw_speed = 2 - throw_range = 3//it's heavier than a screw driver/wrench, so it does more damage, but can't be thrown as far - attack_verb = list("drilled", "screwed", "jabbed","whacked") - hitsound = 'sound/items/drill_hit.ogg' - usesound = 'sound/items/drill_use.ogg' - toolspeed = 0.7 - random_color = FALSE - -/obj/item/screwdriver/power/suicide_act(mob/user) - user.visible_message("[user] is putting [src] to [user.p_their()] temple. It looks like [user.p_theyre()] trying to commit suicide!") - return(BRUTELOSS) - -/obj/item/screwdriver/power/attack_self(mob/user) - playsound(get_turf(user),'sound/items/change_drill.ogg',50,1) - var/obj/item/wrench/power/b_drill = new /obj/item/wrench/power(drop_location()) - to_chat(user, "You attach the bolt driver bit to [src].") - qdel(src) - user.put_in_active_hand(b_drill) - /obj/item/screwdriver/cyborg name = "automated screwdriver" desc = "A powerful automated screwdriver, designed to be both precise and quick." @@ -142,4 +112,4 @@ hitsound = 'sound/items/drill_hit.ogg' usesound = 'sound/items/drill_use.ogg' toolspeed = 0.5 - random_color = FALSE \ No newline at end of file + random_color = FALSE diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index ffc9ea66beadd..b6516c2fef237 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -1,4 +1,5 @@ -#define WELDER_FUEL_BURN_INTERVAL 13 +/// How many seconds between each fuel depletion tick ("use" proc) +#define WELDER_FUEL_BURN_INTERVAL 9 /obj/item/weldingtool name = "welding tool" desc = "A standard edition welder provided by Nanotrasen." @@ -18,7 +19,7 @@ throw_speed = 3 throw_range = 5 w_class = WEIGHT_CLASS_SMALL - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30, "stamina" = 0) resistance_flags = FIRE_PROOF materials = list(/datum/material/iron=70, /datum/material/glass=30) @@ -60,7 +61,7 @@ return -/obj/item/weldingtool/process() +/obj/item/weldingtool/process(delta_time) switch(welding) if(0) force = 3 @@ -73,7 +74,7 @@ if(1) force = 15 damtype = "fire" - ++burned_fuel_for + burned_fuel_for += delta_time if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL) use(1) update_icon() @@ -126,7 +127,7 @@ return if(!status && O.is_refillable()) reagents.trans_to(O, reagents.total_volume, transfered_by = user) - to_chat(user, "You empty [src]'s fuel tank into [O].") + balloon_alert(user, "Fuel tank emptied") update_icon() if(isOn()) use(1) @@ -163,8 +164,9 @@ if(!isOn() || !check_fuel()) return FALSE - if(used) + if(used > 0) burned_fuel_for = 0 + if(get_fuel() >= used) reagents.remove_reagent(/datum/reagent/fuel, used) check_fuel() @@ -189,12 +191,12 @@ //Switches the welder on /obj/item/weldingtool/proc/switched_on(mob/user) if(!status) - to_chat(user, "[src] can't be turned on while unsecured!") + balloon_alert(user, "It can't be turned on while unsecured") return welding = !welding if(welding) if(get_fuel() >= 1) - to_chat(user, "You switch [src] on.") + balloon_alert(user, "[src] turned on") playsound(loc, acti_sound, 50, 1) force = 15 damtype = "fire" @@ -202,10 +204,10 @@ update_icon() START_PROCESSING(SSobj, src) else - to_chat(user, "You need more fuel!") + balloon_alert(user, "No fuel") switched_off(user) else - to_chat(user, "You switch [src] off.") + balloon_alert(user, "[src] turned off") playsound(loc, deac_sound, 50, 1) switched_off(user) @@ -250,26 +252,26 @@ // If welding tool ran out of fuel during a construction task, construction fails. /obj/item/weldingtool/tool_use_check(mob/living/user, amount) if(!isOn() || !check_fuel()) - to_chat(user, "[src] has to be on to complete this task!") + balloon_alert(user, "[src] has to be on") return FALSE if(get_fuel() >= amount) return TRUE else - to_chat(user, "You need more welding fuel to complete this task!") + balloon_alert(user, "Not enough fuel to complete this task") return FALSE /obj/item/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user) if(welding) - to_chat(user, "Turn it off first!") + balloon_alert(user, "[src] should be turned off") return status = !status if(status) - to_chat(user, "You resecure [src] and close the fuel tank.") + balloon_alert(user, "[src] secured and fuel tank closed") DISABLE_BITFIELD(reagents.flags, OPENCONTAINER) else - to_chat(user, "[src] can now be attached, modified, and refuelled.") + balloon_alert(user, "[src] can now be attached, modified, and refuelled") ENABLE_BITFIELD(reagents.flags, OPENCONTAINER) add_fingerprint(user) @@ -282,10 +284,10 @@ user.transferItemToLoc(src, F, TRUE) F.weldtool = src add_fingerprint(user) - to_chat(user, "You add a rod to a welder, starting to build a flamethrower.") + balloon_alert(user, "You start bulding flamethrower") user.put_in_hands(F) else - to_chat(user, "You need one rod to start building a flamethrower!") + balloon_alert(user, "You need one rod to build flamethrower") /obj/item/weldingtool/ignition_effect(atom/A, mob/user) if(use_tool(A, user, 0, amount=1)) @@ -301,7 +303,7 @@ materials = list(/datum/material/glass=60) /obj/item/weldingtool/largetank/flamethrower_screwdriver() - return + return /obj/item/weldingtool/largetank/cyborg name = "integrated welding tool" @@ -371,10 +373,10 @@ item_state = "brasswelder" -/obj/item/weldingtool/experimental/process() +/obj/item/weldingtool/experimental/process(delta_time) ..() if(get_fuel() < max_fuel && nextrefueltick < world.time) nextrefueltick = world.time + 10 - reagents.add_reagent(/datum/reagent/fuel, 1) + reagents.add_reagent(/datum/reagent/fuel, 0.5*delta_time) -#undef WELDER_FUEL_BURN_INTERVAL \ No newline at end of file +#undef WELDER_FUEL_BURN_INTERVAL diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index 9a1d10cb7a272..9ce9820e3594d 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -19,7 +19,7 @@ tool_behaviour = TOOL_WIRECUTTER toolspeed = 1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30, "stamina" = 0) var/random_color = TRUE var/static/list/wirecutter_colors = list( "blue" = "#1861d5", @@ -83,47 +83,10 @@ random_color = FALSE -/obj/item/wirecutters/power - name = "jaws of life" - desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a cutting head." - icon_state = "jaws_cutter" - item_state = "jawsoflife" - - materials = list(/datum/material/iron=150,/datum/material/silver=50,/datum/material/titanium=25) - usesound = 'sound/items/jaws_cut.ogg' - toolspeed = 0.7 - random_color = FALSE - -/obj/item/wirecutters/power/suicide_act(mob/user) - user.visible_message("[user] is wrapping \the [src] around [user.p_their()] neck. It looks like [user.p_theyre()] trying to rip [user.p_their()] head off!") - playsound(loc, 'sound/items/jaws_cut.ogg', 50, 1, -1) - if(iscarbon(user)) - var/mob/living/carbon/C = user - var/obj/item/bodypart/BP = C.get_bodypart(BODY_ZONE_HEAD) - if(BP) - BP.drop_limb() - playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1) - return (BRUTELOSS) - -/obj/item/wirecutters/power/attack_self(mob/user) - playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1) - var/obj/item/crowbar/power/pryjaws = new /obj/item/crowbar/power(drop_location()) - to_chat(user, "You attach the pry jaws to [src].") - qdel(src) - user.put_in_active_hand(pryjaws) - -/obj/item/wirecutters/power/attack(mob/living/carbon/C, mob/user) - if(istype(C) && C.handcuffed) - user.visible_message("[user] cuts [C]'s restraints with [src]!") - qdel(C.handcuffed) - return - else - ..() - /obj/item/wirecutters/cyborg name = "powered wirecutters" desc = "Cuts wires with the power of ELECTRICITY. Faster than normal wirecutters." icon = 'icons/obj/items_cyborg.dmi' icon_state = "wirecutters_cyborg" toolspeed = 0.5 - random_color = FALSE \ No newline at end of file + random_color = FALSE diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index 470c2b5d6fccc..6b696ba8f3687 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -17,7 +17,7 @@ attack_verb = list("bashed", "battered", "bludgeoned", "whacked") tool_behaviour = TOOL_WRENCH toolspeed = 1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30, "stamina" = 0) /obj/item/wrench/suicide_act(mob/user) user.visible_message("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -39,34 +39,6 @@ usesound = 'sound/effects/empulse.ogg' toolspeed = 0.1 - -/obj/item/wrench/power - name = "hand drill" - desc = "A simple powered hand drill. It's fitted with a bolt bit." - icon_state = "drill_bolt" - item_state = "drill" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - usesound = 'sound/items/drill_use.ogg' - materials = list(/datum/material/iron=150,/datum/material/silver=50,/datum/material/titanium=25) - //done for balance reasons, making them high value for research, but harder to get - force = 8 //might or might not be too high, subject to change - w_class = WEIGHT_CLASS_SMALL - throwforce = 8 - attack_verb = list("drilled", "screwed", "jabbed") - toolspeed = 0.7 - -/obj/item/wrench/power/attack_self(mob/user) - playsound(get_turf(user),'sound/items/change_drill.ogg',50,1) - var/obj/item/wirecutters/power/s_drill = new /obj/item/screwdriver/power(drop_location()) - to_chat(user, "You attach the screw driver bit to [src].") - qdel(src) - user.put_in_active_hand(s_drill) - -/obj/item/wrench/power/suicide_act(mob/user) - user.visible_message("[user] is pressing [src] against [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!") - return (BRUTELOSS) - /obj/item/wrench/medical name = "medical wrench" desc = "A medical wrench with common(medical?) uses. Can be found in your hand." @@ -107,4 +79,4 @@ desc = "An advanced robotic wrench, powered by internal hydraulics. Twice as fast as the handheld version." icon = 'icons/obj/items_cyborg.dmi' icon_state = "wrench_cyborg" - toolspeed = 0.5 \ No newline at end of file + toolspeed = 0.5 diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index ccb616335f520..6114c53084c43 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -152,7 +152,7 @@ icon_state = "singularity_s1" /* - * Toy gun: Why isnt this an /obj/item/gun? + * Toy gun: Why isn't this an /obj/item/gun? */ /obj/item/toy/gun name = "cap gun" @@ -204,7 +204,7 @@ return src.add_fingerprint(user) if (src.bullets < 1) - user.show_message("*click*", 2) + user.show_message("*click*", MSG_AUDIBLE) playsound(src, 'sound/weapons/gun_dry_fire.ogg', 30, TRUE) return playsound(user, 'sound/weapons/gunshot.ogg', 100, 1) @@ -275,7 +275,7 @@ return else to_chat(user, "You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool.") - var/obj/item/twohanded/dualsaber/toy/newSaber = new /obj/item/twohanded/dualsaber/toy(user.loc) + var/obj/item/dualsaber/toy/newSaber = new /obj/item/dualsaber/toy(user.loc) if(hacked) // That's right, we'll only check the "original" "sword". newSaber.hacked = TRUE newSaber.item_color = "rainbow" @@ -361,29 +361,28 @@ /* * Subtype of Double-Bladed Energy Swords */ -/obj/item/twohanded/dualsaber/toy +/obj/item/dualsaber/toy name = "double-bladed toy sword" desc = "A cheap, plastic replica of TWO energy swords. Double the fun!" force = 0 throwforce = 0 throw_speed = 3 throw_range = 5 - force_unwielded = 0 - force_wielded = 0 + twohand_force = 0 attack_verb = list("attacked", "struck", "hit") block_upgrade_walk = 1 block_power = -100 -/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) +/obj/item/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 0 -/obj/item/twohanded/dualsaber/toy/IsReflect()//Stops Toy Dualsabers from reflecting energy projectiles +/obj/item/dualsaber/toy/IsReflect() //Stops Toy Dualsabers from reflecting energy projectiles return 0 -/obj/item/twohanded/dualsaber/toy/impale(mob/living/user)//Stops Toy Dualsabers from injuring clowns +/obj/item/dualsaber/toy/impale(mob/living/user)//Stops Toy Dualsabers from injuring clowns to_chat(user, "You twirl around a bit before losing your balance and impaling yourself on [src].") user.adjustStaminaLoss(25) - + /obj/item/toy/katana name = "replica katana" desc = "Woefully underpowered in D20." @@ -662,7 +661,6 @@ var/card_throw_range = 7 var/list/card_attack_verb = list("attacked") var/card_sharpness - var/card_embed_chance = 0 /obj/item/toy/cards/suicide_act(mob/living/carbon/user) user.visible_message("[user] is slitting [user.p_their()] wrists with \the [src]! It looks like [user.p_they()] [user.p_have()] a crummy hand!") @@ -724,7 +722,7 @@ if(!(L.mobility_flags & MOBILITY_PICKUP)) return var/choice = null - if(cards.len == 0) + if(!LAZYLEN(cards)) to_chat(user, "There are no more cards to draw!") return var/obj/item/toy/cards/singlecard/H = new/obj/item/toy/cards/singlecard(user.loc) @@ -735,27 +733,27 @@ H.parentdeck = src var/O = src H.apply_card_vars(H,O) - src.cards.Cut(1,2) //Removes the top card from the list + cards.Cut(1,2) //Removes the top card from the list H.pickup(user) user.put_in_hands(H) - user.visible_message("[user] draws a card from the deck.", "You draw a card from the deck.") + user.visible_message("[user] draws a card from the deck.", "You draw a card from the deck.") update_icon() /obj/item/toy/cards/deck/update_icon() - if(cards.len > original_size/2) + if(LAZYLEN(cards) > original_size/2) icon_state = "deck_[deckstyle]_full" - else if(cards.len > original_size/4) + else if(LAZYLEN(cards) > original_size/4) icon_state = "deck_[deckstyle]_half" - else if(cards.len > 0) + else if(LAZYLEN(cards)) icon_state = "deck_[deckstyle]_low" - else if(cards.len == 0) + else if(!LAZYLEN(cards)) icon_state = "deck_[deckstyle]_empty" /obj/item/toy/cards/deck/attack_self(mob/user) if(cooldown < world.time - 50) cards = shuffle(cards) playsound(src, 'sound/items/cardshuffle.ogg', 50, 1) - user.visible_message("[user] shuffles the deck.", "You shuffle the deck.") + user.visible_message("[user] shuffles the deck.", "You shuffle the deck.") cooldown = world.time /obj/item/toy/cards/deck/attackby(obj/item/I, mob/living/user, params) @@ -766,7 +764,7 @@ to_chat(user, "The card is stuck to your hand, you can't add it to the deck!") return cards += SC.cardname - user.visible_message("[user] adds a card to the bottom of the deck.","You add the card to the bottom of the deck.") + user.visible_message("[user] adds a card to the bottom of the deck.","You add the card to the bottom of the deck.") qdel(SC) else to_chat(user, "You can't mix cards from other decks!") @@ -778,7 +776,7 @@ to_chat(user, "The hand of cards is stuck to your hand, you can't add it to the deck!") return cards += CH.currenthand - user.visible_message("[user] puts [user.p_their()] hand of cards in the deck.", "You put the hand of cards in the deck.") + user.visible_message("[user] puts [user.p_their()] hand of cards in the deck.", "You put the hand of cards in the deck.") qdel(CH) else to_chat(user, "You can't mix cards from other decks!") @@ -796,8 +794,8 @@ M.put_in_hands(src) to_chat(usr, "You pick up the deck.") - else if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + else if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object if(M.putItemFromInventoryInHandIfPossible(src, H.held_index)) to_chat(usr, "You pick up the deck.") @@ -869,7 +867,7 @@ 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) update_sprite() @@ -911,17 +909,17 @@ /obj/item/toy/cards/singlecard/apply_card_vars(obj/item/toy/cards/singlecard/newobj,obj/item/toy/cards/sourceobj) ..() - newobj.card_embed_chance = sourceobj.card_embed_chance - newobj.embedding = newobj.embedding.setRating(embed_chance = card_embed_chance) + newobj.embedding = sourceobj.embedding newobj.card_sharpness = sourceobj.card_sharpness - newobj.sharpness = newobj.card_sharpness + newobj.sharpness = sourceobj.card_sharpness + newobj.updateEmbedding() /obj/item/toy/cards/singlecard/examine(mob/user) . = ..() if(ishuman(user)) var/mob/living/carbon/human/cardUser = user if(cardUser.is_holding(src)) - cardUser.visible_message("[cardUser] checks [cardUser.p_their()] card.", "The card reads: [cardname].") + cardUser.visible_message("[cardUser] checks [cardUser.p_their()] card.", "The card reads: [cardname].") else . += "You need to have the card in your hand to check it!" @@ -968,7 +966,7 @@ var/obj/item/toy/cards/cardhand/H = I if(H.parentdeck == parentdeck) H.currenthand += cardname - user.visible_message("[user] adds a card to [user.p_their()] hand.", "You add the [cardname] to your hand.") + user.visible_message("[user] adds a card to [user.p_their()] hand.", "You add the [cardname] to your hand.") qdel(src) H.interact(user) H.update_sprite() @@ -1013,7 +1011,7 @@ card_force = 5 card_throwforce = 12 card_throw_speed = 6 - card_embed_chance = 80 + embedding = list("pain_mult" = 1, "embed_chance" = 80, "max_damage_mult" = 8, "fall_chance" = 0, "embed_chance_turf_mod" = 15, "armour_block" = 60) //less painful than throwing stars card_sharpness = IS_SHARP card_throw_range = 7 card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut") @@ -1181,9 +1179,7 @@ var/list/possible_sounds = list('sound/voice/hiss1.ogg', 'sound/voice/hiss2.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss4.ogg') var/chosen_sound = pick(possible_sounds) playsound(get_turf(src), chosen_sound, 50, 1) - spawn(45) - if(src) - icon_state = "[initial(icon_state)]" + addtimer(VARSET_CALLBACK(src, icon_state, initial(icon_state)), 45) else to_chat(user, "The string on [src] hasn't rewound all the way!") return @@ -1429,7 +1425,7 @@ to_chat(user, "You name the dummy as \"[doll_name]\"") name = "[initial(name)] - [doll_name]" -/obj/item/toy/dummy/talk_into(atom/movable/A, message, channel, list/spans, datum/language/language) +/obj/item/toy/dummy/talk_into(atom/movable/A, message, channel, list/spans, datum/language/language, list/message_mods) var/mob/M = A if (istype(M)) M.log_talk(message, LOG_SAY, tag="dummy toy") @@ -1439,7 +1435,7 @@ /obj/item/toy/dummy/GetVoice() return doll_name - + /* * Eldrich Toys */ @@ -1452,18 +1448,18 @@ w_class = WEIGHT_CLASS_SMALL attack_verb = list("sacrificed", "transmuted", "grasped", "cursed") var/open = FALSE - + /obj/item/toy/eldrich_book/attack_self(mob/user) open = !open update_icon() /obj/item/toy/eldrich_book/update_icon() icon_state = open ? "book_open" : "book" - + /* * Fake tear */ - + /obj/item/toy/reality_pierce name = "Pierced reality" desc = "Hah. You thought it was the real deal!" @@ -1476,4 +1472,201 @@ /obj/item/storage/box/heretic_asshole/PopulateContents() for(var/i in 1 to rand(1,4)) - new /obj/item/toy/reality_pierce(src) \ No newline at end of file + new /obj/item/toy/reality_pierce(src) + +// Serviceborg items + +/* +|| Cyborg playing cards module. || +*/ + +/obj/item/toy/cards/deck/cyborg + name = "dealer module" + desc = "A module for handling, fabricating cards and tricking suckers into gambling awaya their money. Ctrl Click to fabricate a new set of cards." + +/obj/item/toy/cards/deck/cyborg/update_icon() + icon_state = "deck_[deckstyle]_full" + +/obj/item/toy/cards/deck/cyborg/CtrlClick(mob/user) + ..() + if(iscyborg(user)) + var/mob/living/silicon/robot/R = user + if(R.cell?.use(300)) + populate_deck() + to_chat(user, "You fabricate a new set of cards.") + +/obj/item/toy/cards/deck/cyborg/afterattack(atom/A, mob/user, proximity) + . = ..() + if (istype(A, /obj/item/toy/cards/singlecard)) + var/obj/item/toy/cards/singlecard/SC = A + if(SC.parentdeck == src) + if(!user.temporarilyRemoveItemFromInventory(SC)) + to_chat(user, "The card is stuck to your hand, you can't add it to the deck!") + return + cards += SC.cardname + user.visible_message("[user] adds a card to the bottom of the deck.","You add the card to the bottom of the deck.") + qdel(SC) + else + to_chat(user, "You can't mix cards from other decks!") + update_icon() + else if (istype(A, /obj/item/toy/cards/cardhand)) + var/obj/item/toy/cards/cardhand/CH = A + if(CH.parentdeck == src) + cards += CH.currenthand + user.visible_message("[user] puts [user.p_their()] hand of cards in the deck.", "You put the hand of cards in the deck.") + qdel(CH) + else + to_chat(user, "You can't mix cards from other decks!") + update_icon() + + var/choice = null + if(!LAZYLEN(cards)) + to_chat(user, "There are no more cards to draw!") + return + + choice = cards[1] + var/obj/item/toy/cards/singlecard/H = new/obj/item/toy/cards/singlecard(get_turf(A)) + H.cardname = choice + H.parentdeck = src + var/O = src + H.apply_card_vars(H,O) + cards.Cut(1,2) //Removes the top card from the list + + if(!proximity) + H.forceMove(get_turf(src)) + H.throw_at(get_turf(A), 10 , 1 , user) + +//////////////////// +//money eater/maker// +//////////////////// + +/obj/item/gobbler + name = "Coin Gobbler" + desc = "Feed it credits, and activate it, with a chance to spit out DOUBLE the amount!" + icon = 'icons/obj/plushes.dmi' + icon_state = "debug" + var/money = 0 + var/moneyeaten = 0 + var/cooldown = 0 + var/cooldowndelay = 20 + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/gobbler/examine(mob/user) + . = ..() + . += "The Coin Gobbler holds [money] credits." + +/obj/item/gobbler/attackby() + return + +/obj/item/gobbler/attack_self(mob/user) + if(cooldown > world.time) + return + cooldown = world.time + cooldowndelay + if (money<=0) + to_chat(user, "The [src] has no money stored.") + return + + playsound(src.loc, 'sound/creatures/rattle.ogg', 10, 1) + user.visible_message("[src]'s eyes start spinning! What will happen?", \ + "You activate [src].") + sleep(10) + + if(prob(33*(777+moneyeaten-money)/777)) + playsound(src.loc, 'sound/arcade/win.ogg', 10, 1) + user.visible_message("[src] cashes out! [user] starts spitting credits!", \ + "[src] cashes out!") + var/obj/item/holochip/payout = new (user.drop_location(), money*2) + payout.throw_at( get_step(loc,user.dir) ,3,1,user) + moneyeaten-=money + money=0 + else + user.visible_message("[src] gobbles up all the money!", \ + "[src] gobbles up all the money!") + moneyeaten+=money + money=0 + playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 10, 1) + +/obj/item/gobbler/afterattack(atom/A, mob/user, proximity) + . = ..() + if(!proximity) + return + var/cash_money = 0 + + if(istype(A, /obj/item/holochip)) + var/obj/item/holochip/HC = A + cash_money = HC.get_item_credit_value() + else if(istype(A, /obj/item/stack/spacecash)) + var/obj/item/stack/spacecash/SC = A + cash_money = SC.get_item_credit_value() + else if(istype(A, /obj/item/coin)) + var/obj/item/coin/CN = A + cash_money = CN.get_item_credit_value() + + if (!cash_money) + to_chat(user, "[src] spits out [A] as it is not worth anything!") + return + money+=cash_money + to_chat(user, "[src] quicky gobbles up [A], and the value goes up by [cash_money].") + qdel(A) + +/obj/item/dance_trance + name = "Dance Fever" + desc = "Makes everyone dance!" + icon = 'icons/obj/grenade.dmi' + icon_state = "disco_active" + var/flip_cooldown = 0 + +/obj/item/dance_trance/attack() + if(flip_cooldown < world.time) + flip_mobs() + return ..() + +/obj/item/dance_trance/attack_self(mob/user) + if(flip_cooldown < world.time) + flip_mobs() + ..() + +/obj/item/dance_trance/proc/flip_mobs(mob/living/carbon/M, mob/user) + for(M in ohearers(7, get_turf(src))) + if(ishuman(M) && M.can_hear()) + var/mob/living/carbon/human/H = M + if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) + continue + switch (rand(1,3)) + if (1) + M.emote("flip") + M.emote("spin") + if (2) + M.emote("flip") + if (3) + M.emote("spin") + flip_cooldown = world.time + 20 + + +/obj/item/storage/pill_bottle/dice_cup/cyborg + desc = "The house always wins..." +/obj/item/storage/pill_bottle/dice_cup/cyborg/Initialize() + . = ..() + new /obj/item/dice/d6(src) + new /obj/item/dice/d6(src) + + +/obj/item/storage/box/yatzy + name = "Game of Yatzy" + desc = "Contains all the pieces required to play a game of Yatzy with up to 4 friends!" + +/obj/item/storage/box/yatzy/PopulateContents() + new /obj/item/storage/pill_bottle/dice_cup/yatzy(src) + new /obj/item/paper/yatzy(src) + new /obj/item/paper/yatzy(src) + new /obj/item/paper/yatzy(src) + new /obj/item/paper/yatzy(src) + +/obj/item/storage/pill_bottle/dice_cup/yatzy/Initialize() + . = ..() + for(var/dice in 1 to 5) + new /obj/item/dice/d6(src) + +/obj/item/paper/yatzy + name = "paper - Yatzy Table" + info = "
      UpperGame 1Game 2Game 3
      Aces\[___\]\[___\]\[___\]
      Twos\[___\]\[___\]\[___\]
      Threes\[___\]\[___\]\[___\]
      Fours\[___\]\[___\]\[___\]
      Fives\[___\]\[___\]\[___\]
      Sixes\[___\]\[___\]\[___\]
      Total\[___\]\[___\]\[___\]
      Upper Total\[___\]\[___\]\[___\]
      Bonus\[___\]\[___\]\[___\]
      1 Pair\[___\]\[___\]\[___\]
      2 Pairs\[___\]\[___\]\[___\]3 of a Kind\[___\]\[___\]\[___\]4 of a Kind\[___\]\[___\]\[___\]
      Full House\[___\]\[___\]\[___\]
      Sm. Straight\[___\]\[___\]\[___\]
      Lg. Straight\[___\]\[___\]\[___\]
      Yatzy\[___\]\[___\]\[___\]
      Chance\[___\]\[___\]\[___\]
      Lower Total\[___\]\[___\]\[___\]
      Grand Total\[___\]\[___\]\[___\]
      " diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index ba6c51e744cdd..24c9ed862406f 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -86,6 +86,11 @@ name = "Maintenance Peaches" icon_state = "peachcanmaint_empty" +/obj/item/trash/can/food/beefbroth + name = "canned beef broth" + icon = 'icons/obj/food/food.dmi' + icon_state = "beefcan_empty" + /obj/item/trash/can/food/beans name = "tin of beans" icon = 'icons/obj/food/food.dmi' diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm deleted file mode 100644 index 70f2f1f3824fe..0000000000000 --- a/code/game/objects/items/twohanded.dm +++ /dev/null @@ -1,1046 +0,0 @@ -/* Two-handed Weapons - * Contains: - * Twohanded - * Fireaxe - * Double-Bladed Energy Swords - * Spears - * CHAINSAWS - * Bone Axe and Spear - */ - -/*################################################################## -##################### TWO HANDED WEAPONS BE HERE~ -Agouri :3 ######## -####################################################################*/ - -//Rewrote TwoHanded weapons stuff and put it all here. Just copypasta fireaxe to make new ones ~Carn -//This rewrite means we don't have two variables for EVERY item which are used only by a few weapons. -//It also tidies stuff up elsewhere. - - - - -/* - * Twohanded - */ -/obj/item/twohanded - var/wielded = 0 - var/force_unwielded = 0 - var/force_wielded = 0 - var/block_power_wielded = 0 - var/block_power_unwielded = 0 - var/wieldsound = null - var/unwieldsound = null - -/obj/item/twohanded/proc/unwield(mob/living/carbon/user, show_message = TRUE) - if(!wielded || !user) - return - wielded = 0 - - if(!isnull(force_unwielded)) - force = force_unwielded - - if(!isnull(block_power_unwielded)) - block_power = block_power_unwielded - - var/sf = findtext(name, " (Wielded)", -10)//10 == length(" (Wielded)") - if(sf) - name = copytext(name, 1, sf) - else //something wrong - name = "[initial(name)]" - update_icon() - if(user.get_item_by_slot(SLOT_BACK) == src) - user.update_inv_back() - else - user.update_inv_hands() - if(show_message) - if(iscyborg(user)) - to_chat(user, "You free up your module.") - else - to_chat(user, "You are now carrying [src] with one hand.") - if(unwieldsound) - playsound(loc, unwieldsound, 50, 1) - var/obj/item/twohanded/offhand/O = user.get_inactive_held_item() - if(O && istype(O)) - O.unwield() - return - -/obj/item/twohanded/proc/wield(mob/living/carbon/user) - if(wielded) - return - if(ismonkey(user)) - to_chat(user, "It's too heavy for you to wield fully.") - return - if(user.get_inactive_held_item()) - to_chat(user, "You need your other hand to be empty!") - return - if(user.get_num_arms() < 2) - to_chat(user, "You don't have enough intact hands.") - return - wielded = 1 - if(force_wielded) - force = force_wielded - if(block_power_wielded) - block_power = block_power_wielded - name = "[name] (Wielded)" - update_icon() - if(iscyborg(user)) - to_chat(user, "You dedicate your module to [src].") - else - to_chat(user, "You grab [src] with both hands.") - if (wieldsound) - playsound(loc, wieldsound, 50, 1) - var/obj/item/twohanded/offhand/O = new(user) ////Let's reserve his other hand~ - O.name = "[name] - offhand" - O.desc = "Your second grip on [src]." - O.wielded = TRUE - user.put_in_inactive_hand(O) - return - -/obj/item/twohanded/dropped(mob/user) - . = ..() - //handles unwielding a twohanded weapon when dropped as well as clearing up the offhand - if(!wielded) - return - unwield(user) - -/obj/item/twohanded/update_icon() - return - -/obj/item/twohanded/attack_self(mob/user) - . = ..() - if(wielded) //Trying to unwield it - unwield(user) - else //Trying to wield it - wield(user) - -/obj/item/twohanded/equip_to_best_slot(mob/M) - if(..()) - if(istype(src, /obj/item/twohanded/required)) - return // unwield forces twohanded-required items to be dropped. - unwield(M) - return - -/obj/item/twohanded/equipped(mob/user, slot) - ..() - if(!user.is_holding(src) && wielded && !istype(src, /obj/item/twohanded/required)) - unwield(user) - -///////////OFFHAND/////////////// -/obj/item/twohanded/offhand - name = "offhand" - icon_state = "offhand" - w_class = WEIGHT_CLASS_HUGE - item_flags = ABSTRACT - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - -/obj/item/twohanded/offhand/Destroy() - wielded = FALSE - 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 - thw.unwield(user, show_message) - if(istype(thw, /obj/item/twohanded/required)) - user.dropItemToGround(thw) - if(!QDELETED(src)) - qdel(src) - -/obj/item/twohanded/offhand/unwield() - if(wielded)//Only delete if we're wielded - wielded = FALSE - qdel(src) - -/obj/item/twohanded/offhand/wield() - if(wielded)//Only delete if we're wielded - wielded = FALSE - qdel(src) - -/obj/item/twohanded/offhand/attack_self(mob/living/carbon/user) //You should never be able to do this in standard use of two handed items. This is a backup for lingering offhands. - var/obj/item/twohanded/O = user.get_inactive_held_item() - if (istype(O) && !istype(O, /obj/item/twohanded/offhand/)) //If you have a proper item in your other hand that the offhand is for, do nothing. This should never happen. - return - if (QDELETED(src)) - return - qdel(src) //If it's another offhand, or literally anything else, qdel. If I knew how to add logging messages I'd put one here. - -///////////Two hand required objects/////////////// -//This is for objects that require two hands to even pick up -/obj/item/twohanded/required - w_class = WEIGHT_CLASS_HUGE - -/obj/item/twohanded/required/attack_self() - return - -/obj/item/twohanded/required/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0) - if(wielded && !slot_flags) - if(!disable_warning) - to_chat(M, "[src] is too cumbersome to carry with anything but your hands!") - return 0 - return ..() - -/obj/item/twohanded/required/attack_hand(mob/user)//Can't even pick it up without both hands empty - var/obj/item/twohanded/required/H = user.get_inactive_held_item() - if(get_dist(src,user) > 1) - return - if(H != null) - to_chat(user, "[src] is too cumbersome to carry in one hand!") - return - if(loc != user) - wield(user) - . = ..() - -/obj/item/twohanded/required/equipped(mob/user, slot) - ..() - var/slotbit = slotdefine2slotbit(slot) - if(slot_flags & slotbit) - var/datum/O = user.is_holding_item_of_type(/obj/item/twohanded/offhand) - if(!O || QDELETED(O)) - return - qdel(O) - return - if(slot == SLOT_HANDS) - wield(user) - else - unwield(user) - -/obj/item/twohanded/required/dropped(mob/living/user, show_message = TRUE) - unwield(user, show_message) - ..() - -/obj/item/twohanded/required/wield(mob/living/carbon/user) - ..() - if(!wielded) - user.dropItemToGround(src) - -/obj/item/twohanded/required/unwield(mob/living/carbon/user, show_message = TRUE) - if(!wielded) - return - if(show_message) - to_chat(user, "You drop [src].") - ..(user, FALSE) - -/* - * Fireaxe - */ -/obj/item/twohanded/fireaxe // DEM AXES MAN, marker -Agouri - icon_state = "fireaxe0" - lefthand_file = 'icons/mob/inhands/weapons/axes_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/axes_righthand.dmi' - name = "fire axe" - desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?" - attack_weight = 3 - block_power_wielded = 25 - block_upgrade_walk = 1 - force = 5 - throwforce = 15 - w_class = WEIGHT_CLASS_BULKY - slot_flags = ITEM_SLOT_BACK - force_unwielded = 5 - force_wielded = 24 - attack_verb = list("attacked", "chopped", "cleaved", "tore", "cut") - hitsound = 'sound/weapons/bladeslice.ogg' - sharpness = IS_SHARP - max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) - resistance_flags = FIRE_PROOF - -/obj/item/twohanded/fireaxe/Initialize() - . = ..() - AddComponent(/datum/component/butchering, 100, 80, 0 , hitsound) //axes are not known for being precision butchering tools - -/obj/item/twohanded/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons. - icon_state = "fireaxe[wielded]" - return - -/obj/item/twohanded/fireaxe/suicide_act(mob/user) - user.visible_message("[user] axes [user.p_them()]self from head to toe! It looks like [user.p_theyre()] trying to commit suicide!") - return (BRUTELOSS) - -/obj/item/twohanded/fireaxe/afterattack(atom/A, mob/user, proximity) - . = ..() - if(!proximity) - return - if(wielded) //destroys windows and grilles in one hit - if(istype(A, /obj/structure/window)) - var/obj/structure/window/W = A - W.take_damage(200, BRUTE, "melee", 0) - else if(istype(A, /obj/structure/grille)) - var/obj/structure/grille/G = A - G.take_damage(40, BRUTE, "melee", 0) - - -/* - * Double-Bladed Energy Swords - Cheridan - */ -/obj/item/twohanded/dualsaber - icon = 'icons/obj/transforming_energy.dmi' - icon_state = "dualsaber0" - lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - name = "double-bladed energy sword" - desc = "Handle with care." - force = 3 - throwforce = 5 - throw_speed = 3 - throw_range = 5 - w_class = WEIGHT_CLASS_SMALL - var/w_class_on = WEIGHT_CLASS_BULKY - force_unwielded = 3 - force_wielded = 34 - block_power_wielded = 75 - wieldsound = 'sound/weapons/saberon.ogg' - unwieldsound = 'sound/weapons/saberoff.ogg' - hitsound = "swing_hit" - armour_penetration = 35 - item_color = "green" - light_color = "#00ff00"//green - attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") - block_level = 2 - block_upgrade_walk = 1 - block_power = 70 - block_sound = 'sound/weapons/egloves.ogg' - block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY | BLOCKING_PROJECTILE - 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 - var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD - var/list/possible_colors = list("red", "blue", "green", "purple") - -/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!") - - var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)//stole from chainsaw code - var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN) - B.organ_flags &= ~ORGAN_VITAL //this cant possibly be a good idea - var/randdir - for(var/i in 1 to 24)//like a headless chicken! - if(user.is_holding(src)) - randdir = pick(GLOB.alldirs) - user.Move(get_step(user, randdir),randdir) - user.emote("spin") - if (i == 3 && myhead) - myhead.drop_limb() - sleep(3) - else - user.visible_message("[user] panics and starts choking to death!") - return OXYLOSS - - - else - user.visible_message("[user] begins beating [user.p_them()]self to death with \the [src]'s handle! It probably would've been cooler if [user.p_they()] turned it on first!") - return BRUTELOSS - -/obj/item/twohanded/dualsaber/Initialize() - . = ..() - if(LAZYLEN(possible_colors)) - item_color = pick(possible_colors) - switch(item_color) - if("red") - light_color = LIGHT_COLOR_RED - if("green") - light_color = LIGHT_COLOR_GREEN - if("blue") - light_color = LIGHT_COLOR_LIGHT_CYAN - if("purple") - light_color = LIGHT_COLOR_LAVENDER - -/obj/item/twohanded/dualsaber/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/item/twohanded/dualsaber/update_icon() - if(wielded) - icon_state = "dualsaber[item_color][wielded]" - else - icon_state = "dualsaber0" - SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - -/obj/item/twohanded/dualsaber/attack(mob/target, mob/living/carbon/human/user) - if(user.has_dna()) - if(user.dna.check_mutation(HULK)) - to_chat(user, "You grip the blade too hard and accidentally close it!") - unwield() - return - ..() - if(HAS_TRAIT(user, TRAIT_CLUMSY) && (wielded) && prob(40)) - impale(user) - return - if((wielded) && prob(50)) - INVOKE_ASYNC(src, .proc/jedi_spin, user) - -/obj/item/twohanded/dualsaber/proc/jedi_spin(mob/living/user) //rip complex code, but this fucked up blocking - user.emote("flip") - -/obj/item/twohanded/dualsaber/proc/impale(mob/living/user) - to_chat(user, "You twirl around a bit before losing your balance and impaling yourself on [src].") - if (force_wielded) - user.take_bodypart_damage(20,25,check_armor = TRUE) - 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 0 - 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) - to_chat(user, "You can't pick up such dangerous item with your meaty hands without losing fingers, better not to!") - return 1 - -/obj/item/twohanded/dualsaber/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds. - if(M.has_dna()) - if(M.dna.check_mutation(HULK)) - to_chat(M, "You lack the grace to wield this!") - return - ..() - if(wielded) - sharpness = IS_SHARP - w_class = w_class_on - hitsound = 'sound/weapons/blade1.ogg' - START_PROCESSING(SSobj, src) - set_light(brightness_on) - -/obj/item/twohanded/dualsaber/unwield() //Specific unwield () to switch hitsounds. - sharpness = initial(sharpness) - w_class = initial(w_class) - ..() - hitsound = "swing_hit" - STOP_PROCESSING(SSobj, src) - set_light(0) - -/obj/item/twohanded/dualsaber/process() - if(wielded) - if(hacked) - light_color = pick(LIGHT_COLOR_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER) - open_flame() - else - STOP_PROCESSING(SSobj, src) - -/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) - return "" - var/in_mouth = "" - if(iscarbon(user)) - var/mob/living/carbon/C = user - if(C.wear_mask) - in_mouth = ", barely missing [user.p_their()] nose" - . = "[user] swings [user.p_their()] [name][in_mouth]. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [A.name] in the process." - playsound(loc, hitsound, get_clamped_volume(), 1, -1) - add_fingerprint(user) - // Light your candles while spinning around the room - INVOKE_ASYNC(src, .proc/jedi_spin, user) - -/obj/item/twohanded/dualsaber/green - possible_colors = list("green") - -/obj/item/twohanded/dualsaber/red - possible_colors = list("red") - -/obj/item/twohanded/dualsaber/blue - possible_colors = list("blue") - -/obj/item/twohanded/dualsaber/purple - possible_colors = list("purple") - -/obj/item/twohanded/dualsaber/attackby(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_MULTITOOL) - if(!hacked) - hacked = TRUE - to_chat(user, "2XRNBW_ENGAGE") - item_color = "rainbow" - update_icon() - else - to_chat(user, "It's starting to look like a triple rainbow - no, nevermind.") - else - return ..() - -//spears -/obj/item/twohanded/spear - icon_state = "spearglass0" - lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' - name = "spear" - desc = "A haphazardly-constructed yet still deadly weapon of ancient design." - force = 10 - w_class = WEIGHT_CLASS_BULKY - slot_flags = ITEM_SLOT_BACK - force_unwielded = 10 - force_wielded = 18 - block_power_wielded = 25 - block_upgrade_walk = 1 - throwforce = 20 - throw_speed = 4 - embedding = list("embedded_impact_pain_multiplier" = 3) - armour_penetration = 10 - materials = list(/datum/material/iron=1150, /datum/material/glass=2075) - hitsound = 'sound/weapons/bladeslice.ogg' - attack_verb = list("attacked", "poked", "jabbed", "tore", "gored") - sharpness = IS_SHARP - max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) - var/war_cry = "AAAAARGH!!!" - var/icon_prefix = "spearglass" - -/obj/item/twohanded/spear/Initialize() - . = ..() - AddComponent(/datum/component/butchering, 100, 70) //decent in a pinch, but pretty bad. - -/obj/item/twohanded/spear/suicide_act(mob/living/carbon/user) - user.visible_message("[user] begins to sword-swallow \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") - return BRUTELOSS - -/obj/item/twohanded/spear/Initialize() - . = ..() - AddComponent(/datum/component/jousting) - -/obj/item/twohanded/spear/update_icon() - icon_state = "[icon_prefix][wielded]" - -/obj/item/twohanded/spear/CheckParts(list/parts_list) - var/obj/item/shard/tip = locate() in parts_list - if (istype(tip, /obj/item/shard/plasma)) - force_wielded = 19 - force_unwielded = 11 - throwforce = 21 - icon_prefix = "spearplasma" - update_icon() - qdel(tip) - var/obj/item/grenade/G = locate() in parts_list - if(G) - var/obj/item/twohanded/spear/explosive/lance = new /obj/item/twohanded/spear/explosive(src.loc, G) - lance.force_wielded = force_wielded - lance.force_unwielded = force_unwielded - lance.throwforce = throwforce - lance.icon_prefix = icon_prefix - parts_list -= G - qdel(src) - ..() - - -/obj/item/twohanded/spear/explosive - name = "explosive lance" - var/obj/item/grenade/explosive = null - -/obj/item/twohanded/spear/explosive/Initialize(mapload, obj/item/grenade/G) - . = ..() - if (!G) - G = new /obj/item/grenade/iedcasing() //For admin-spawned explosive lances - G.forceMove(src) - explosive = G - desc = "A makeshift spear with [G] attached to it" - update_icon() - -/obj/item/twohanded/spear/explosive/suicide_act(mob/living/carbon/user) - user.visible_message("[user] begins to sword-swallow \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") - user.say("[war_cry]", forced="spear warcry") - explosive.forceMove(user) - explosive.prime() - user.gib() - qdel(src) - return BRUTELOSS - -/obj/item/twohanded/spear/explosive/examine(mob/user) - . = ..() - . += "Alt-click to set your war cry." - -/obj/item/twohanded/spear/explosive/update_icon() - icon_state = "spearbomb[wielded]" - -/obj/item/twohanded/spear/explosive/AltClick(mob/user) - if(user.canUseTopic(src, BE_CLOSE)) - ..() - if(istype(user) && loc == user) - var/input = stripped_input(user,"What do you want your war cry to be? You will shout it when you hit someone in melee.", ,"", 50) - if(input) - src.war_cry = input - -/obj/item/twohanded/spear/explosive/afterattack(atom/movable/AM, mob/user, proximity) - . = ..() - if(!proximity) - return - if(wielded) - user.say("[war_cry]", forced="spear warcry") - explosive.forceMove(AM) - explosive.prime() - qdel(src) - -// CHAINSAW -/obj/item/twohanded/required/chainsaw - name = "chainsaw" - desc = "A versatile power tool. Useful for limbing trees and delimbing humans." - icon_state = "chainsaw_off" - lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' - flags_1 = CONDUCT_1 - force = 13 - block_power = 20 - block_upgrade_walk = 2 - block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY - attack_weight = 2 - var/force_on = 24 - w_class = WEIGHT_CLASS_HUGE - throwforce = 13 - throw_speed = 2 - throw_range = 4 - materials = list(/datum/material/iron=13000) - attack_verb = list("sawed", "tore", "cut", "chopped", "diced") - hitsound = "swing_hit" - sharpness = IS_SHARP - actions_types = list(/datum/action/item_action/startchainsaw) - var/on = FALSE - tool_behaviour = TOOL_SAW - toolspeed = 0.5 - -/obj/item/twohanded/required/chainsaw/Initialize() - . = ..() - AddComponent(/datum/component/butchering, 30, 100, 0, 'sound/weapons/chainsawhit.ogg', TRUE) - -/obj/item/twohanded/required/chainsaw/suicide_act(mob/living/carbon/user) - if(on) - user.visible_message("[user] begins to tear [user.p_their()] head off with [src]! It looks like [user.p_theyre()] trying to commit suicide!") - playsound(src, 'sound/weapons/chainsawhit.ogg', 100, 1) - var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD) - if(myhead) - myhead.dismember() - else - user.visible_message("[user] smashes [src] into [user.p_their()] neck, destroying [user.p_their()] esophagus! It looks like [user.p_theyre()] trying to commit suicide!") - playsound(src, 'sound/weapons/genhit1.ogg', 100, 1) - return(BRUTELOSS) - -/obj/item/twohanded/required/chainsaw/attack_self(mob/user) - on = !on - to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr." : "the chain stops moving."]") - force = on ? force_on : initial(force) - throwforce = on ? force_on : initial(force) - icon_state = "chainsaw_[on ? "on" : "off"]" - var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) - butchering.butchering_enabled = on - - if(on) - hitsound = 'sound/weapons/chainsawhit.ogg' - else - hitsound = "swing_hit" - - if(src == user.get_active_held_item()) //update inhands - user.update_inv_hands() - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() - -/obj/item/twohanded/required/chainsaw/doomslayer - name = "THE GREAT COMMUNICATOR" - desc = "VRRRRRRR!!!" - 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) - 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 - -// ENERGY CHAINSAW -/obj/item/twohanded/required/chainsaw/energy - name = "energy chainsaw" - desc = "Become Leatherspace." - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "echainsaw_off" - lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' - force_on = 40 - w_class = WEIGHT_CLASS_HUGE - attack_verb = list("sawed", "shred", "rended", "gutted", "eviscerated") - actions_types = list(/datum/action/item_action/startchainsaw) - block_power = 50 - armour_penetration = 50 - light_color = "#ff0000" - var/onsound - var/offsound - var/wield_cooldown = 0 - onsound = 'sound/weapons/echainsawon.ogg' - offsound = 'sound/weapons/echainsawoff.ogg' - on = FALSE - var/brightness_on = 3 - -/obj/item/twohanded/required/chainsaw/energy/attack_self(mob/user) - on = !on - to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr intimidatingly." : "the plasma microblades stop moving."]") - force = on ? force_on : initial(force) - playsound(user, on ? onsound : offsound , 50, 1) - set_light(on ? brightness_on : 0) - throwforce = on ? force_on : initial(force) - icon_state = "echainsaw_[on ? "on" : "off"]" - - if(hitsound == "swing_hit") - hitsound = pick('sound/weapons/echainsawhit1.ogg','sound/weapons/echainsawhit2.ogg') - else - hitsound = "swing_hit" - - if(src == user.get_active_held_item()) - user.update_inv_hands() - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() - -// DOOMGUY ENERGY CHAINSAW -/obj/item/twohanded/required/chainsaw/energy/doom - name = "super energy chainsaw" - desc = "The chainsaw you want when you need to kill every damn thing in the room." - force_on = 60 - w_class = WEIGHT_CLASS_NORMAL - block_power = 75 - block_level = 1 - attack_weight = 3 //fear him - armour_penetration = 75 - var/knockdown = 1 - brightness_on = 6 - -/obj/item/twohanded/required/chainsaw/energy/doom/attack(mob/living/target) - ..() - target.Knockdown(4) - - -//GREY TIDE -/obj/item/twohanded/spear/grey_tide - icon_state = "spearglass0" - name = "\improper Grey Tide" - desc = "Recovered from the aftermath of a revolt aboard Defense Outpost Theta Aegis, in which a seemingly endless tide of Assistants caused heavy casualities among Nanotrasen military forces." - force_unwielded = 15 - force_wielded = 25 - block_level = 1 - throwforce = 20 - throw_speed = 4 - attack_verb = list("gored") - -/obj/item/twohanded/spear/grey_tide/afterattack(atom/movable/AM, mob/living/user, proximity) - . = ..() - if(!proximity) - return - user.faction |= "greytide([REF(user)])" - if(isliving(AM)) - var/mob/living/L = AM - if(istype (L, /mob/living/simple_animal/hostile/illusion)) - return - if(!L.stat && prob(50)) - var/mob/living/simple_animal/hostile/illusion/M = new(user.loc) - M.faction = user.faction.Copy() - M.Copy_Parent(user, 100, user.health/2.5, 12, 30) - M.GiveTarget(L) - -/obj/item/twohanded/pitchfork - icon_state = "pitchfork0" - lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' - name = "pitchfork" - desc = "A simple tool used for moving hay." - force = 7 - throwforce = 15 - block_power_wielded = 25 - block_level = 1 - block_upgrade_walk = 1 - w_class = WEIGHT_CLASS_BULKY - force_unwielded = 7 - force_wielded = 15 - attack_verb = list("attacked", "impaled", "pierced") - hitsound = 'sound/weapons/bladeslice.ogg' - sharpness = IS_SHARP - max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) - resistance_flags = FIRE_PROOF - -/obj/item/twohanded/pitchfork/demonic - name = "demonic pitchfork" - desc = "A red pitchfork, it looks like the work of the devil." - force = 19 - throwforce = 24 - force_unwielded = 19 - force_wielded = 25 - -/obj/item/twohanded/pitchfork/demonic/Initialize() - . = ..() - set_light(3,6,LIGHT_COLOR_RED) - -/obj/item/twohanded/pitchfork/demonic/greater - force = 24 - throwforce = 50 - force_unwielded = 24 - force_wielded = 34 - -/obj/item/twohanded/pitchfork/demonic/ascended - force = 100 - throwforce = 100 - force_unwielded = 100 - force_wielded = 500000 // Kills you DEAD. - -/obj/item/twohanded/pitchfork/update_icon() - icon_state = "pitchfork[wielded]" - -/obj/item/twohanded/pitchfork/suicide_act(mob/user) - user.visible_message("[user] impales [user.p_them()]self in [user.p_their()] abdomen with [src]! It looks like [user.p_theyre()] trying to commit suicide!") - 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.", \ - "\"As you pick up [src] your arms ignite, reminding you of all your past sins.\"") - if(ishuman(U)) - var/mob/living/carbon/human/H = U - H.apply_damage(rand(force/2, force), BURN, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) - else - U.adjustFireLoss(rand(force/2,force)) - -/obj/item/twohanded/pitchfork/demonic/attack(mob/target, mob/living/carbon/human/user) - if(user.mind && user.owns_soul() && !is_devil(user)) - to_chat(user, "[src] burns in your hands.") - user.apply_damage(rand(force/2, force), BURN, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) - ..() - -/obj/item/twohanded/pitchfork/demonic/ascended/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity || !wielded) - return - if(iswallturf(target)) - var/turf/closed/wall/W = target - user.visible_message("[user] blasts \the [target] with \the [src]!") - playsound(target, 'sound/magic/disintegrate.ogg', 100, 1) - W.break_wall() - W.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) - return - -//HF blade - -/obj/item/twohanded/vibro_weapon - icon_state = "hfrequency0" - lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - name = "vibro sword" - desc = "A potent weapon capable of cutting through nearly anything. Wielding it in two hands will allow you to deflect gunfire." - force_unwielded = 20 - force_wielded = 40 - armour_penetration = 100 - block_power_wielded = 40 - block_level = 1 - block_upgrade_walk = 2 - block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY | BLOCKING_PROJECTILE - block_sound = 'sound/weapons/genhit.ogg' - throwforce = 20 - throw_speed = 4 - sharpness = IS_SHARP - attack_verb = list("cut", "sliced", "diced") - w_class = WEIGHT_CLASS_BULKY - slot_flags = ITEM_SLOT_BACK - hitsound = 'sound/weapons/bladeslice.ogg' - -/obj/item/twohanded/vibro_weapon/Initialize() - . = ..() - AddComponent(/datum/component/butchering, 20, 105) - -/obj/item/twohanded/vibro_weapon/update_icon() - icon_state = "hfrequency[wielded]" - -/* - * Bone Axe - */ -/obj/item/twohanded/fireaxe/boneaxe // Blatant imitation of the fireaxe, but made out of bone. - icon_state = "bone_axe0" - name = "bone axe" - desc = "A large, vicious axe crafted out of several sharpened bone plates and crudely tied together. Made of monsters, by killing monsters, for killing monsters." - force_wielded = 23 - -/obj/item/twohanded/fireaxe/boneaxe/update_icon() - icon_state = "bone_axe[wielded]" - -/* - * Bone Spear - */ -/obj/item/twohanded/bonespear //Blatant imitation of spear, but made out of bone. Not valid for explosive modification. - icon_state = "bone_spear0" - lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' - name = "bone spear" - desc = "A haphazardly-constructed yet still deadly weapon. The pinnacle of modern technology." - force = 11 - w_class = WEIGHT_CLASS_BULKY - slot_flags = ITEM_SLOT_BACK - block_power_wielded = 25 - block_upgrade_walk = 1 - force_unwielded = 11 - force_wielded = 20 //I have no idea how to balance - throwforce = 22 - throw_speed = 4 - embedding = list("embedded_impact_pain_multiplier" = 3) - armour_penetration = 15 //Enhanced armor piercing - hitsound = 'sound/weapons/bladeslice.ogg' - attack_verb = list("attacked", "poked", "jabbed", "tore", "gored") - sharpness = IS_SHARP - -/obj/item/twohanded/bonespear/update_icon() - icon_state = "bone_spear[wielded]" - -/obj/item/twohanded/binoculars - name = "binoculars" - desc = "Used for long-distance surveillance." - item_state = "binoculars" - icon_state = "binoculars" - lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' - righthand_file = 'icons/mob/inhands/items_righthand.dmi' - slot_flags = ITEM_SLOT_BELT - w_class = WEIGHT_CLASS_SMALL - var/mob/listeningTo - var/zoom_out_amt = 6 - var/zoom_amt = 10 - -/obj/item/twohanded/binoculars/Destroy() - listeningTo = null - return ..() - -/obj/item/twohanded/binoculars/wield(mob/user) - . = ..() - if(!wielded) - return - RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/unwield) - listeningTo = user - user.visible_message("[user] holds [src] up to [user.p_their()] eyes.","You hold [src] up to your eyes.") - item_state = "binoculars_wielded" - user.regenerate_icons() - if(!user?.client) - return - var/client/C = user.client - var/_x = 0 - var/_y = 0 - switch(user.dir) - if(NORTH) - _y = zoom_amt - if(EAST) - _x = zoom_amt - if(SOUTH) - _y = -zoom_amt - if(WEST) - _x = -zoom_amt - C.change_view(get_zoomed_view(world.view, zoom_out_amt)) - C.pixel_x = world.icon_size*_x - C.pixel_y = world.icon_size*_y - -/obj/item/twohanded/binoculars/unwield(mob/user) - . = ..() - UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) - listeningTo = null - user.visible_message("[user] lowers [src].","You lower [src].") - item_state = "binoculars" - user.regenerate_icons() - if(user?.client) - user.regenerate_icons() - var/client/C = user.client - C.change_view(CONFIG_GET(string/default_view)) - user.client.pixel_x = 0 - user.client.pixel_y = 0 - -/obj/item/twohanded/bamboospear - icon_state = "bamboo_spear0" - lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' - name = "bamboo spear" - desc = "A haphazardly-constructed bamboo stick with a sharpened tip, ready to poke holes into unsuspecting people." - force = 10 - w_class = WEIGHT_CLASS_BULKY - slot_flags = ITEM_SLOT_BACK - block_power_wielded = 25 - block_upgrade_walk = 1 - force_unwielded = 10 - force_wielded = 18 - throwforce = 22 - throw_speed = 4 - embedding = list("embedded_impact_pain_multiplier" = 2) - armour_penetration = 10 - hitsound = 'sound/weapons/bladeslice.ogg' - attack_verb = list("attacked", "poked", "jabbed", "tore", "gored") - sharpness = IS_SHARP - -/obj/item/twohanded/bamboospear/update_icon() - icon_state = "bamboo_spear[wielded]" - -/obj/item/twohanded/pushbroom - name = "push broom" - desc = "This is my BROOMSTICK! It can be used manually or braced with two hands to sweep items as you move. It has a telescopic handle for compact storage." - icon = 'icons/obj/janitor.dmi' - icon_state = "broom0" - lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' - force = 8 - throwforce = 10 - throw_speed = 3 - throw_range = 7 - w_class = WEIGHT_CLASS_NORMAL - force_unwielded = 8 - force_wielded = 12 - attack_verb = list("swept", "brushed off", "bludgeoned", "whacked") - resistance_flags = FLAMMABLE - -/obj/item/twohanded/pushbroom/update_icon_state() - icon_state = "broom[wielded]" - -/obj/item/twohanded/pushbroom/wield(mob/user) - . = ..() - if(!wielded) - return - to_chat(user, "You brace the [src] against the ground in a firm sweeping stance.") - RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/sweep) - -/obj/item/twohanded/pushbroom/unwield(mob/user) - . = ..() - UnregisterSignal(user, COMSIG_MOVABLE_MOVED) - -/obj/item/twohanded/pushbroom/afterattack(atom/A, mob/user, proximity) - . = ..() - if(!proximity) - return - if(wielded) - sweep(user, A, FALSE) - else - to_chat(user, "You need to wield \the [src] in both hands to sweep!") - -/obj/item/twohanded/pushbroom/proc/sweep(mob/user, atom/A, moving = TRUE) - var/turf/target - if (!moving) - if (isturf(A)) - target = A - else - target = get_turf(A) - else - target = get_turf(user) - if (locate(/obj/structure/table) in target.contents) - return - var/i = 0 - var/turf/target_turf = get_step(target, user.dir) - var/obj/machinery/disposal/bin/target_bin = locate(/obj/machinery/disposal/bin) in target_turf.contents - for(var/obj/item/garbage in target.contents) - if(!garbage.anchored) - if (target_bin) - garbage.forceMove(target_bin) - else - garbage.Move(target_turf, user.dir) - i++ - if(i > 19) - break - if(i > 0) - if (target_bin) - target_bin.update_icon() - to_chat(user, "You sweep the pile of garbage into [target_bin].") - playsound(loc, 'sound/weapons/thudswoosh.ogg', 30, TRUE, -1) - -/obj/item/twohanded/pushbroom/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) - J.put_in_cart(src, user) - J.mybroom=src - J.update_icon() diff --git a/code/game/objects/items/vending_items.dm b/code/game/objects/items/vending_items.dm index 2964d31259d9f..d1a0e666114c3 100644 --- a/code/game/objects/items/vending_items.dm +++ b/code/game/objects/items/vending_items.dm @@ -17,7 +17,7 @@ throw_speed = 1 throw_range = 7 w_class = WEIGHT_CLASS_BULKY - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 30, "stamina" = 0) // Built automatically from the corresponding vending machine. // If null, considered to be full. Otherwise, is list(/typepath = amount). diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index b9be1f980b17d..328c3060b50bd 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -11,7 +11,7 @@ throw_range = 7 attack_verb = list("banned") max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70, "stamina" = 0) resistance_flags = FIRE_PROOF /obj/item/banhammer/suicide_act(mob/user) @@ -81,7 +81,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY sharpness = IS_SHARP max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "stamina" = 0) resistance_flags = FIRE_PROOF /obj/item/claymore/Initialize() @@ -232,7 +232,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") block_level = 0 block_power = 30 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "stamina" = 0) /obj/item/katana name = "katana" @@ -254,7 +254,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY | BLOCKING_PROJECTILE sharpness = IS_SHARP max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "stamina" = 0) resistance_flags = FIRE_PROOF /obj/item/katana/cursed @@ -279,7 +279,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/wirerod/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/shard)) - var/obj/item/twohanded/spear/S = new /obj/item/twohanded/spear + var/obj/item/spear/S = new /obj/item/spear remove_item_from_storage(user) if (!user.transferItemToLoc(I, S)) @@ -313,27 +313,42 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' force = 2 - throwforce = 20 //20 + 2 (WEIGHT_CLASS_SMALL) * 4 (EMBEDDED_IMPACT_PAIN_MULTIPLIER) = 28 damage on hit due to guaranteed embedding + throwforce = 24 throw_speed = 4 - embedding = list("embedded_pain_multiplier" = 4, "embed_chance" = 100, "embedded_fall_chance" = 0) + embedding = list("pain_mult" = 4, "embed_chance" = 300, "fall_chance" = 0, "armour_block" = 70) + armour_penetration = 40 w_class = WEIGHT_CLASS_SMALL hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP 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" = 300, "fall_chance" = 0, "jostle_chance" = 10, "pain_stam_pct" = 0.8, "jostle_pain_mult" = 3, "armour_block" = 70) + +/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" = 300, "fall_chance" = 0, "armour_block" = 70) + /obj/item/throwing_star/magspear name = "magnetic spear" desc = "A reusable spear that is typically loaded into kinetic spearguns." icon = 'icons/obj/ammo.dmi' icon_state = "magspear" - throwforce = 25 //kills regular carps in one hit + throwforce = 40 force = 15 //can be used in melee- a speargun user may be beat to death with their own spear w_class = WEIGHT_CLASS_BULKY hitsound = 'sound/weapons/bladeslice.ogg' throw_range = 0 //throwing these invalidates the speargun attack_verb = list("stabbed", "ripped", "gored", "impaled") - embedding = list("embedded_pain_multiplier" = 8, "embed_chance" = 100, "embedded_fall_chance" = 0, "embedded_impact_pain_multiplier" = 15) //55 damage+embed on hit + embedding = list("pain_mult" = 8, "embed_chance" = 1000, "fall_chance" = 0, "armour_block" = 100) /obj/item/switchblade name = "long switchblade" @@ -521,7 +536,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/mounted_chainsaw/normal/Destroy() var/obj/item/bodypart/part - new /obj/item/twohanded/required/chainsaw(get_turf(src)) + new /obj/item/chainsaw(get_turf(src)) if(iscarbon(loc)) var/mob/living/carbon/holder = loc var/index = holder.get_held_index_of_item(src) @@ -540,7 +555,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/mounted_chainsaw/energy/Destroy() var/obj/item/bodypart/part - new /obj/item/twohanded/required/chainsaw/energy(get_turf(src)) + new /obj/item/chainsaw/energy(get_turf(src)) if(iscarbon(loc)) var/mob/living/carbon/holder = loc var/index = holder.get_held_index_of_item(src) @@ -559,7 +574,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/mounted_chainsaw/super/Destroy() var/obj/item/bodypart/part - new /obj/item/twohanded/required/chainsaw/energy/doom(get_turf(src)) + new /obj/item/chainsaw/energy/doom(get_turf(src)) if(iscarbon(loc)) var/mob/living/carbon/holder = loc var/index = holder.get_held_index_of_item(src) @@ -616,7 +631,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 var/board_item_type = /obj/vehicle/ridden/scooter/skateboard /obj/item/melee/skateboard/attack_self(mob/user) - var/obj/vehicle/ridden/scooter/skateboard/S = new board_item_type(get_turf(user))//this probably has fucky interactions with telekinesis but for the record it wasnt my fault + var/obj/vehicle/ridden/scooter/skateboard/S = new board_item_type(get_turf(user))//this probably has fucky interactions with telekinesis but for the record it wasn't my fault S.buckle_mob(user) qdel(src) @@ -687,12 +702,12 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 if(homerun_ready) user.visible_message("It's a home run!") target.throw_at(throw_target, rand(8,10), 14, user) - target.ex_act(EXPLODE_HEAVY) + SSexplosions.medturf += throw_target playsound(get_turf(src), 'sound/weapons/homerun.ogg', 100, 1) homerun_ready = 0 return else if(!target.anchored) - target.throw_at(throw_target, rand(1,2), 7, user) + target.throw_at(throw_target, rand(1,2), 7, user, force = MOVE_FORCE_WEAK) user.changeNext_move(CLICK_CD_MELEE * click_delay) return @@ -814,29 +829,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 M.attack_hand(user) -// Shank - Makeshift weapon that can embed on throw -/obj/item/melee/shank - name = "Shank" - desc = "A crude knife fashioned by wrapping some cable around a glass shard. It looks like it could be thrown with some force.. and stick. Good to throw at someone chasing you" - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "shank" - item_state = "shank" //Kind of a placeholder, but im ass with sprites and I doubt someone will notice its a recoloured switchblade :') - lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - force = 8 // 3 more than base glass shard - throwforce = 8 - throw_speed = 5 //yeets - armour_penetration = 10 //spear has 10 armour pen, I think its fitting another glass tipped item should have it too - embedding = list("embedded_pain_multiplier" = 6, "embed_chance" = 40, "embedded_fall_chance" = 5) // Incentive to disengage/stop chasing when stuck - attack_verb = list("stuck", "shanked") - w_class = WEIGHT_CLASS_SMALL - hitsound = 'sound/weapons/bladeslice.ogg' - sharpness = IS_SHARP - -/obj/item/melee/shank/suicide_act(mob/user) - user.visible_message("[user] is slitting [user.p_their()] [pick("wrists", "throat")] with the shank! It looks like [user.p_theyre()] trying to commit suicide.") - return (BRUTELOSS) - /obj/item/highfive name = "raised hand" desc = "Slap my hand." @@ -915,3 +907,33 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 sharpness = IS_SHARP attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' + +//HF blade +/obj/item/vibro_weapon + icon_state = "hfrequency0" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + name = "vibro sword" + desc = "A potent weapon capable of cutting through nearly anything. Wielding it in two hands will allow you to deflect gunfire." + armour_penetration = 100 + block_level = 1 + block_upgrade_walk = 2 + block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY | BLOCKING_PROJECTILE + block_sound = 'sound/weapons/genhit.ogg' + force = 20 + throwforce = 20 + throw_speed = 4 + sharpness = IS_SHARP + attack_verb = list("cut", "sliced", "diced") + w_class = WEIGHT_CLASS_BULKY + slot_flags = ITEM_SLOT_BACK + hitsound = 'sound/weapons/bladeslice.ogg' + +/obj/item/vibro_weapon/ComponentInitialize() + . = ..() + AddComponent(/datum/component/butchering, 20, 105) + AddComponent(/datum/component/two_handed, force_multiplier=2, block_power_wielded=40, icon_wielded="hfrequency1") + +/obj/item/vibro_weapon/update_icon() + icon_state = "hfrequency0" + ..() \ No newline at end of file diff --git a/code/game/objects/noose.dm b/code/game/objects/noose.dm index e8d657fd052fa..ae19b5e7f86b0 100644 --- a/code/game/objects/noose.dm +++ b/code/game/objects/noose.dm @@ -15,12 +15,12 @@ var/mutable_appearance/overlay /obj/structure/chair/noose/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wirecutters)) + if(W.tool_behaviour == TOOL_WIRECUTTER) user.visible_message("[user] cuts the noose.", "You cut the noose.") if(has_buckled_mobs()) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m - if(buckled_mob.mob_has_gravity()) + if(buckled_mob.has_gravity()) buckled_mob.visible_message("[buckled_mob] falls over and hits the ground!") to_chat(buckled_mob, "You fall over and hit the ground!") buckled_mob.adjustBruteLoss(10) @@ -83,7 +83,7 @@ pixel_x = initial(pixel_x) add_fingerprint(user) -/obj/structure/chair/noose/user_buckle_mob(mob/living/carbon/human/M, mob/user) +/obj/structure/chair/noose/user_buckle_mob(mob/living/carbon/human/M, mob/user, check_loc = TRUE) if(!in_range(user, src) || user.stat || user.restrained() || !iscarbon(M)) return FALSE @@ -126,7 +126,7 @@ else animate(src, pixel_x = 3, time = 45, easing = ELASTIC_EASING) animate(m, pixel_x = 3, time = 45, easing = ELASTIC_EASING) - if(buckled_mob.mob_has_gravity()) + if(buckled_mob.has_gravity()) if(buckled_mob.get_bodypart("head")) if(buckled_mob.stat != DEAD) if(!HAS_TRAIT(buckled_mob, TRAIT_NOBREATH)) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index b0ce0e2057008..f68b769535c12 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -6,20 +6,21 @@ return if(sound_effect) play_attack_sound(damage_amount, damage_type, damage_flag) - if(!(resistance_flags & INDESTRUCTIBLE) && obj_integrity > 0) - damage_amount = run_obj_armor(damage_amount, damage_type, damage_flag, attack_dir, armour_penetration) - if(damage_amount >= DAMAGE_PRECISION) - . = damage_amount - var/old_integ = obj_integrity - obj_integrity = max(old_integ - damage_amount, 0) - if(obj_integrity <= 0) - var/int_fail = integrity_failure - if(int_fail && old_integ > int_fail) - obj_break(damage_flag) - obj_destruction(damage_flag) - else if(integrity_failure) - if(obj_integrity <= integrity_failure) - obj_break(damage_flag) + if((resistance_flags & INDESTRUCTIBLE) || obj_integrity <= 0) + return + damage_amount = run_obj_armor(damage_amount, damage_type, damage_flag, attack_dir, armour_penetration) + if(damage_amount <= DAMAGE_PRECISION) + return + . = damage_amount + var/old_integ = obj_integrity + obj_integrity = max(old_integ - damage_amount, 0) + //BREAKING FIRST + if(integrity_failure && obj_integrity <= integrity_failure) + obj_break(damage_flag) + + //DESTROYING SECOND + if(obj_integrity <= 0) + obj_destruction(damage_flag) //returns the damage value of the attack after processing the obj's various armor protections /obj/proc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penetration = 0) @@ -70,7 +71,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) @@ -108,7 +110,7 @@ /obj/attack_animal(mob/living/simple_animal/M) if(!M.melee_damage && !M.obj_damage) - M.emote("custom", message = "[M.friendly] [src].") + INVOKE_ASYNC(M, /mob.proc/emote, "custom", null, "[M.friendly] [src].") return 0 else var/play_soundeffect = 1 @@ -132,10 +134,13 @@ var/amt = max(0, ((force - (move_resist * MOVE_FORCE_CRUSH_RATIO)) / (move_resist * MOVE_FORCE_CRUSH_RATIO)) * 10) take_damage(amt, BRUTE) -/obj/attack_slime(mob/living/simple_animal/slime/user) - if(!user.is_adult) +/obj/attack_slime(mob/living/simple_animal/slime/M) + if(!M.is_adult) return - attack_generic(user, rand(15), "melee", 1) + var/damage = rand(15) + if(M.transformeffects & SLIME_EFFECT_RED) + damage *= 1.1 + attack_generic(M, damage, "melee", 1) /obj/mech_melee_attack(obj/mecha/M) M.do_attack_animation(src) @@ -159,7 +164,7 @@ return take_damage(M.force*3, mech_damtype, "melee", play_soundeffect, get_dir(src, M)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs. /obj/singularity_act() - ex_act(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += src if(src && !QDELETED(src)) qdel(src) return 2 diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index bcdb227cb7c64..2795ce9221bf7 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -1,4 +1,3 @@ - /obj animate_movement = SLIDE_STEPS speech_span = SPAN_ROBOT @@ -78,13 +77,14 @@ obj_flags &= ~string_to_objflag[flag] else obj_flags |= string_to_objflag[flag] + if((obj_flags & ON_BLUEPRINTS) && isturf(loc)) var/turf/T = loc T.add_blueprints_preround(src) /obj/Destroy(force=FALSE) - if(!ismachinery(src)) - STOP_PROCESSING(SSobj, src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists + if(!ismachinery(src) && (datum_flags & DF_ISPROCESSING)) + STOP_PROCESSING(SSobj, src) SStgui.close_uis(src) . = ..() @@ -92,7 +92,7 @@ SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue) anchored = anchorvalue -/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force) +/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, quickstart = TRUE) ..() if(obj_flags & FROZEN) visible_message("[src] shatters into a million pieces!") @@ -105,12 +105,42 @@ else return null +/obj/assume_air_moles(datum/gas_mixture/giver, moles) + if(loc) + return loc.assume_air_moles(giver, moles) + else + return null + +/obj/assume_air_ratio(datum/gas_mixture/giver, ratio) + if(loc) + return loc.assume_air_ratio(giver, ratio) + else + return null + +/obj/transfer_air(datum/gas_mixture/taker, moles) + if(loc) + return loc.transfer_air(taker, moles) + else + return null + +/obj/transfer_air_ratio(datum/gas_mixture/taker, ratio) + if(loc) + return loc.transfer_air_ratio(taker, ratio) + else + return null + /obj/remove_air(amount) if(loc) return loc.remove_air(amount) else return null +/obj/remove_air_ratio(ratio) + if(loc) + return loc.remove_air_ratio(ratio) + else + return null + /obj/return_air() if(loc) return loc.return_air() @@ -125,8 +155,7 @@ if(breath_request>0) var/datum/gas_mixture/environment = return_air() - var/breath_percentage = BREATH_VOLUME / environment.return_volume() - return remove_air(environment.total_moles() * breath_percentage) + return remove_air_ratio(BREATH_VOLUME / environment.return_volume()) else return null @@ -134,7 +163,7 @@ if((obj_flags & IN_USE) && !(obj_flags & USES_TGUI)) var/is_in_use = FALSE var/list/nearby = viewers(1, src) - for(var/mob/M in nearby) + for(var/mob/M as() in nearby) if ((M.client && M.machine == src)) is_in_use = TRUE ui_interact(M) @@ -163,7 +192,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 as() in viewers(1, src)) if ((M.client && M.machine == src)) is_in_use = TRUE src.interact(M) @@ -182,22 +211,24 @@ return ui_interact(user) -/obj/proc/container_resist(mob/living/user) - return - /mob/proc/unset_machine() - if(machine) - machine.on_unset_machine(src) - machine = null + SIGNAL_HANDLER + + if(!machine) + return + UnregisterSignal(machine, COMSIG_PARENT_QDELETING) + machine.on_unset_machine(src) + machine = null //called when the user unsets the machine. /atom/movable/proc/on_unset_machine(mob/user) return /mob/proc/set_machine(obj/O) - if(src.machine) + if(machine) unset_machine() - src.machine = O + machine = O + RegisterSignal(O, COMSIG_PARENT_QDELETING, .proc/unset_machine) if(istype(O)) O.obj_flags |= IN_USE @@ -217,7 +248,18 @@ /obj/get_dumping_location(datum/component/storage/source,mob/user) return get_turf(src) -/obj/proc/CanAStarPass() +/** + * This proc is used for telling whether something can pass by this object in a given direction, for use by the pathfinding system. + * + * Trying to generate one long path across the station will call this proc on every single object on every single tile that we're seeing if we can move through, likely + * multiple times per tile since we're likely checking if we can access said tile from multiple directions, so keep these as lightweight as possible. + * + * Arguments: + * * ID- An ID card representing what access we have (and thus if we can open things like airlocks or windows to pass through them). The ID card's physical location does not matter, just the reference + * * to_dir- What direction we're trying to move in, relevant for things like directional windows that only block movement in certain directions + * * caller- The movable we're checking pass flags for, if we're making any such checks + **/ +/obj/proc/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) . = !density /obj/proc/check_uplink_validity() @@ -363,3 +405,8 @@ //generate_tgm_metadata(thing) handles everything inside the {} for you /obj/proc/on_object_saved(var/depth = 0) 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 dafc935c0e13b..c3b803760be2e 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -11,9 +11,12 @@ var/mob/living/structureclimber var/broken = 0 //similar to machinery's stat BROKEN + flags_ricochet = RICOCHET_HARD + ricochet_chance_mod = 0.5 + /obj/structure/Initialize() if (!armor) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 0) . = ..() if(smooth) queue_smooth(src) diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index c376a453a0437..ac7b7633f677a 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -62,7 +62,7 @@ return FALSE var/turf/T = get_turf(src) var/area/A = get_area(src) - if(!A.blob_allowed) + if(!(A.area_flags & BLOBS_ALLOWED)) return FALSE if(!A.power_equip) return FALSE diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 9c0158d6195da..783c213c27488 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -81,7 +81,7 @@ resintype = "wall" canSmoothWith = list(/obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane) -/obj/structure/alien/resin/wall/BlockSuperconductivity() +/obj/structure/alien/resin/wall/BlockThermalConductivity() return 1 /obj/structure/alien/resin/membrane @@ -154,7 +154,7 @@ return FALSE for(var/turf/T in U.GetAtmosAdjacentTurfs()) - if((locate(/obj/structure/alien/flesh) in T) || (locate(/obj/structure/alien/weeds) in T)) + if((locate(/obj/structure/alien/weeds) in T)) continue if(is_type_in_typecache(T, blacklisted_turfs)) @@ -295,9 +295,9 @@ if(kill) child.Die() else - for(var/mob/M in range(1,src)) - if(CanHug(M)) - child.Leap(M) + for(var/mob/living/carbon/C in ohearers(1,src)) + if(CanHug(C)) + child.Leap(C) break /obj/structure/alien/egg/obj_break(damage_flag) @@ -329,6 +329,12 @@ status = BURST icon_state = "egg_hatched" +/obj/structure/alien/egg/troll + +/obj/structure/alien/egg/troll/finish_bursting(kill = TRUE) + qdel(child) + new /obj/item/paper/troll(get_turf(src)) + #undef BURST #undef GROWING #undef GROWN diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index b8320c80fbd2e..fa15eadb666ae 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -16,12 +16,12 @@ //Adding canvases /obj/structure/easel/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/canvas)) - var/obj/item/canvas/C = I - user.dropItemToGround(C) - painting = C - C.forceMove(get_turf(src)) - C.layer = layer+0.1 - user.visible_message("[user] puts \the [C] on \the [src].","You place \the [C] on \the [src].") + var/obj/item/canvas/canvas = I + user.dropItemToGround(canvas) + painting = canvas + canvas.forceMove(get_turf(src)) + canvas.layer = layer+0.1 + user.visible_message("[user] puts \the [canvas] on \the [src].", "You place \the [canvas] on \the [src].") else return ..() @@ -35,101 +35,415 @@ 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 + flags_1 = UNPAINTABLE_1 + var/width = 11 + var/height = 11 + var/list/grid + var/canvas_color = "#ffffff" //empty canvas color + var/used = FALSE + var/painting_name = "Untitled Artwork" //Painting name, this is set after framing. + var/finalized = FALSE //Blocks edits + var/author_ckey + var/icon_generated = FALSE + var/icon/generated_icon + ///boolean that blocks persistence from saving it. enabled from printing copies, because we do not want to save copies. + var/no_save = FALSE -/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 - -//Find the right size blank canvas -/obj/item/canvas/proc/getGlobalBackup() - . = null - if(GLOB.globalBlankCanvases[whichGlobalBackup]) - . = GLOB.globalBlankCanvases[whichGlobalBackup] + . = ..() + reset_grid() + +/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_state(mob/user) + if(finalized) + return GLOB.physical_obscured_state else - var/icon/I = icon(initial(icon),initial(icon_state)) - GLOB.globalBlankCanvases[whichGlobalBackup] = I - . = I + return GLOB.default_state + +/obj/item/canvas/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Canvas", name) + ui.set_autoupdate(FALSE) + ui.open() + +/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 + +/obj/item/canvas/examine(mob/user) + . = ..() + ui_interact(user) +/obj/item/canvas/ui_act(action, params) + . = ..() + if(. || finalized) + return + 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) -//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"]) +/obj/item/canvas/proc/finalize(mob/user) + finalized = TRUE + author_ckey = user.ckey + generate_proper_overlay() + try_rename(user) - //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"]) +/obj/item/canvas/update_overlays() + . = ..() + if(icon_generated) + var/mutable_appearance/detail = mutable_appearance(generated_icon) + detail.pixel_x = 1 + detail.pixel_y = 1 + . += detail + return + if(!used) return - //Cleaning one pixel with a soap or rag - if(istype(I, /obj/item/soap) || istype(I, /obj/item/reagent_containers/glass/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/mutable_appearance/detail = mutable_appearance(icon, "[icon_state]wip") + detail.pixel_x = 1 + detail.pixel_y = 1 + . += detail - var/theOriginalPix = Ico.GetPixel(pixX,pixY) - if(thePix != theOriginalPix) //colour changed - DrawPixelOn(theOriginalPix,pixX,pixY) - qdel(masterpiece) +/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/crayon = I + return crayon.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/glass/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(new_name != painting_name && new_name && user.canUseTopic(src,BE_CLOSE)) + painting_name = new_name + SStgui.update_uis(src) + +/obj/item/canvas/nineteen_nineteen + icon_state = "19x19" + width = 19 + height = 19 + pixel_x = 6 + pixel_y = 9 + framed_offset_x = 8 + framed_offset_y = 9 + +/obj/item/canvas/twentythree_nineteen + icon_state = "23x19" + width = 23 + height = 19 + pixel_x = 4 + pixel_y = 10 + framed_offset_x = 6 + framed_offset_y = 8 - //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/twentythree_twentythree + icon_state = "23x23" + width = 23 + height = 23 + pixel_x = 5 + pixel_y = 9 + framed_offset_x = 5 + framed_offset_y = 6 + +/obj/item/canvas/twentyfour_twentyfour + name = "ai universal standard canvas" + desc = "Besides being very large, the AI can accept these as a display from their internal database after you've hung it up." + icon_state = "24x24" + width = 24 + height = 24 + pixel_x = 2 + pixel_y = 1 + framed_offset_x = 4 + framed_offset_y = 5 + +/obj/item/wallframe/painting + name = "painting frame" + desc = "The perfect showcase for your favorite deathtrap memories." + icon = 'icons/obj/decals.dmi' + flags_1 = NONE + 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" + var/base_icon_state = "frame" //temporal replacement before the update_appearance() port + buildable_sign = FALSE + ///Canvas we're currently displaying. + var/obj/item/canvas/current_canvas + ///Description set when canvas is added. + var/desc_with_canvas + var/persistence_id + +/obj/structure/sign/painting/Initialize(mapload, dir, building) + . = ..() + SSpersistence.painting_frames += src + 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(!current_canvas && istype(I, /obj/item/canvas)) + frame_canvas(user,I) + else if(current_canvas && current_canvas.painting_name == initial(current_canvas.painting_name) && istype(I,/obj/item/pen)) + try_rename(user) else return ..() +/obj/structure/sign/painting/examine(mob/user) + . = ..() + if(persistence_id) + . += "Any painting placed here will be archived at the end of the shift." + if(current_canvas) + current_canvas.ui_interact(user) + . += "Use wirecutters to remove the painting." -//Clean the whole canvas -/obj/item/canvas/attack_self(mob/user) - if(!user) +/obj/structure/sign/painting/wirecutter_act(mob/living/user, obj/item/I) + . = ..() + if(current_canvas) + current_canvas.forceMove(drop_location()) + current_canvas = null + to_chat(user, "You remove the painting from the frame.") + update_painting_stuff() + return TRUE + +/obj/structure/sign/painting/proc/frame_canvas(mob/user,obj/item/canvas/new_canvas) + if(user.transferItemToLoc(new_canvas,src)) + current_canvas = new_canvas + if(!current_canvas.finalized) + current_canvas.finalize(user) + to_chat(user,"You frame [current_canvas].") + update_painting_stuff() + +/obj/structure/sign/painting/proc/try_rename(mob/user) + if(current_canvas.painting_name == initial(current_canvas.painting_name)) + current_canvas.try_rename(user) + +/obj/structure/sign/painting/proc/update_painting_stuff() + name = current_canvas ? "painting - [current_canvas.painting_name]" : initial(name) + desc = current_canvas ? desc_with_canvas : initial(desc) + update_icon() + update_icon_state() + update_overlays() + +/obj/structure/sign/painting/update_icon_state() + icon_state = "[base_icon_state]-[current_canvas?.generated_icon ? "overlay" : "empty"]" + return ..() + +/obj/structure/sign/painting/update_overlays() + . = ..() + if(!current_canvas?.generated_icon) + return + + var/mutable_appearance/MA = mutable_appearance(current_canvas.generated_icon) + MA.pixel_x = current_canvas.framed_offset_x + MA.pixel_y = current_canvas.framed_offset_y + . += MA + var/mutable_appearance/frame = mutable_appearance(current_canvas.icon,"[current_canvas.icon_state]frame") + frame.pixel_x = current_canvas.framed_offset_x - 1 + frame.pixel_y = current_canvas.framed_offset_y - 1 + . += frame + +/** + * Loads a painting from SSpersistence. Called globally by said subsystem when it inits + * + * Deleting paintings leaves their json, so this proc will remove the json and try again if it finds one of those. + */ +/obj/structure/sign/painting/proc/load_persistent() + if(!persistence_id || !SSpersistence.paintings || !SSpersistence.paintings[persistence_id]) 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/list/painting_category = SSpersistence.paintings[persistence_id] + var/list/painting + while(!painting) + if(!length(SSpersistence.paintings[persistence_id])) + return //aborts loading anything this category has no usable paintings + var/list/chosen = pick(painting_category) + if(!fexists("data/paintings/[persistence_id]/[chosen["md5"]].png")) //shitmin deleted this art, lets remove json entry to avoid errors + painting_category -= list(chosen) + continue //and try again + painting = chosen + var/title = painting["title"] + var/author = painting["ckey"] + var/png = "data/paintings/[persistence_id]/[painting["md5"]].png" + if(!title) + title = "Untitled Artwork" //legacy artwork allowed null names which was bad for the json, lets fix that + painting["title"] = title + 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 + new_canvas.name = "painting - [title]" + current_canvas = new_canvas + update_painting_stuff() + +/obj/structure/sign/painting/proc/save_persistent() + if(!persistence_id || !current_canvas || current_canvas.no_save) + return + if(sanitize_filename(persistence_id) != persistence_id) + stack_trace("Invalid persistence_id - [persistence_id]") + return + if(!current_canvas.painting_name) + current_canvas.painting_name = "Untitled Artwork" + var/data = current_canvas.get_data_string() + var/md5 = md5(lowertext(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,"[current_canvas.width]","[current_canvas.height]",data) + if(result) + CRASH("Error saving persistent painting: [result]") + current += list(list("title" = current_canvas.painting_name , "md5" = md5, "ckey" = current_canvas.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) -#undef AMT_OF_CANVASES +//Presets for art gallery mapping, for paintings to be shared across stations +/obj/structure/sign/painting/library + name = "\improper Public Painting Exhibit mounting" + desc = "For art pieces hung by the public." + desc_with_canvas = "A piece of art (or \"art\"). Anyone could've hung it." + persistence_id = "library" + +/obj/structure/sign/painting/library_secure + name = "\improper Curated Painting Exhibit mounting" + desc = "For masterpieces hand-picked by the curator." + desc_with_canvas = "A masterpiece hand-picked by the curator, supposedly." + persistence_id = "library_secure" + +/obj/structure/sign/painting/library_private // keep your smut away from prying eyes, or non-librarians at least + name = "\improper Private Painting Exhibit mounting" + desc = "For art pieces deemed too subversive or too illegal to be shared outside of curators." + desc_with_canvas = "A painting hung away from lesser minds." + 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 || !current_canvas) + to_chat(user,"This is not a persistent painting.") + return + var/md5 = md5(lowertext(current_canvas.get_data_string())) + var/author = current_canvas.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.current_canvas && md5(P.current_canvas.get_data_string()) == md5) + QDEL_NULL(P.current_canvas) + P.update_painting_stuff() + 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 cb40f3c12d291..5328175a2ad76 100644 --- a/code/game/objects/structures/barsigns.dm +++ b/code/game/objects/structures/barsigns.dm @@ -6,7 +6,7 @@ req_access = list(ACCESS_BAR) max_integrity = 500 integrity_failure = 250 - armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 0) buildable_sign = 0 var/panel_open = FALSE @@ -312,4 +312,4 @@ name = null icon = "empty" desc = "This sign doesn't seem to be on." - rename_area = FALSE \ No newline at end of file + rename_area = FALSE diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index e2bb991e71679..6686f04d83eed 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -48,8 +48,8 @@ unbuckle_mob(M) add_fingerprint(user) -/obj/structure/bed/nest/user_buckle_mob(mob/living/M, mob/living/user) - if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.incapacitated() || M.buckled ) +/obj/structure/bed/nest/user_buckle_mob(mob/living/M, mob/living/user, check_loc = TRUE) + if(!ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.incapacitated() || M.buckled) return if(M.getorgan(/obj/item/organ/alien/plasmavessel)) diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 8534d8cabaa14..7407b06521526 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -168,7 +168,7 @@ anchored = FALSE buildstacktype = /obj/item/stack/sheet/mineral/wood buildstackamount = 10 - var/mob/living/owner = null + var/owned = FALSE /obj/structure/bed/dogbed/ian desc = "Ian's bed! Looks comfy." @@ -200,10 +200,14 @@ name = "Walter's bed" anchored = TRUE +///Used to set the owner of a dogbed, returns FALSE if called on an owned bed or an invalid one, TRUE if the possesion succeeds /obj/structure/bed/dogbed/proc/update_owner(mob/living/M) - owner = M + if(owned || type != /obj/structure/bed/dogbed) //Only marked beds work, this is hacky but I'm a hacky man + return FALSE //Failed + owned = TRUE name = "[M]'s bed" desc = "[M]'s bed! Looks comfy." + return TRUE //Let any callers know that this bed is ours now /obj/structure/bed/dogbed/buckle_mob(mob/living/M, force, check_loc) . = ..() diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index ded6eb02b1ccc..1f17b91a6bc49 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -65,6 +65,11 @@ W.setDir(dir) qdel(src) +/obj/structure/chair/ratvar_act() + var/obj/structure/chair/brass/B = new(get_turf(src)) + B.setDir(dir) + qdel(src) + /obj/structure/chair/attackby(obj/item/W, mob/user, params) if(W.tool_behaviour == TOOL_WRENCH && !(flags_1&NODECONSTRUCT_1)) W.play_tool_sound(src) @@ -385,6 +390,9 @@ playsound(src, 'sound/effects/servostep.ogg', 50, FALSE) return FALSE +/obj/structure/chair/brass/ratvar_act() + return + /obj/structure/chair/brass/AltClick(mob/living/user) turns = 0 if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) diff --git a/code/game/objects/structures/beds_chairs/sofa.dm b/code/game/objects/structures/beds_chairs/sofa.dm index 473374f86ff8f..c292772cade41 100644 --- a/code/game/objects/structures/beds_chairs/sofa.dm +++ b/code/game/objects/structures/beds_chairs/sofa.dm @@ -3,6 +3,28 @@ icon_state = "sofamiddle" icon = 'icons/obj/sofa.dmi' buildstackamount = 1 + item_chair = null + var/mutable_appearance/armrest + +/obj/structure/chair/sofa/Initialize() + armrest = mutable_appearance(icon, "[icon_state]_armrest", ABOVE_MOB_LAYER) + return ..() +/obj/structure/chair/sofa/post_buckle_mob(mob/living/M) + . = ..() + update_armrest() + +/obj/structure/chair/sofa/proc/update_armrest() + if(has_buckled_mobs()) + add_overlay(armrest) + else + cut_overlay(armrest) + +/obj/structure/chair/sofa/post_unbuckle_mob() + . = ..() + update_armrest() + +/obj/structure/chair/sofa/corner/handle_layer() //only the armrest/back of this chair should cover the mob. + return /obj/structure/chair/sofa/left icon_state = "sofaend_left" @@ -11,4 +33,19 @@ icon_state = "sofaend_right" /obj/structure/chair/sofa/corner - icon_state = "sofacorner" \ No newline at end of file + icon_state = "sofacorner" + +// Original icon ported from Eris(?) and updated to work here. +/obj/structure/chair/sofa/corp + name = "sofa" + desc = "Soft and cushy." + icon_state = "corp_sofamiddle" + +/obj/structure/chair/sofa/corp/left + icon_state = "corp_sofaend_left" + +/obj/structure/chair/sofa/corp/right + icon_state = "corp_sofaend_right" + +/obj/structure/chair/sofa/corp/corner + icon_state = "corp_sofacorner" \ No newline at end of file diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 32e86c5d58098..819855c14b279 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -8,8 +8,10 @@ LINEN BINS name = "bedsheet" desc = "A surprisingly soft linen bedsheet." icon = 'icons/obj/bedsheets.dmi' + lefthand_file = 'icons/mob/inhands/misc/bedsheet_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/bedsheet_righthand.dmi' icon_state = "sheetwhite" - item_state = "bedsheet" + item_state = "sheetwhite" slot_flags = ITEM_SLOT_NECK layer = MOB_LAYER throwforce = 0 @@ -22,6 +24,10 @@ LINEN BINS dog_fashion = /datum/dog_fashion/head/ghost var/list/dream_messages = list("white") +/obj/item/bedsheet/Initialize(mapload) + . = ..() + AddElement(/datum/element/bed_tuckable, 0, 0, 0) + /obj/item/bedsheet/attack(mob/living/M, mob/user) if(!attempt_initiate_surgery(src, M, user)) ..() @@ -52,26 +58,31 @@ LINEN BINS /obj/item/bedsheet/blue icon_state = "sheetblue" + item_state = "sheetblue" item_color = "blue" dream_messages = list("blue") /obj/item/bedsheet/green icon_state = "sheetgreen" + item_state = "sheetgreen" item_color = "green" dream_messages = list("green") /obj/item/bedsheet/grey icon_state = "sheetgrey" + item_state = "sheetgrey" item_color = "grey" dream_messages = list("grey") /obj/item/bedsheet/orange icon_state = "sheetorange" + item_state = "sheetorange" item_color = "orange" dream_messages = list("orange") /obj/item/bedsheet/purple icon_state = "sheetpurple" + item_state = "sheetpurple" item_color = "purple" dream_messages = list("purple") @@ -79,6 +90,7 @@ LINEN BINS name = "patriotic bedsheet" desc = "You've never felt more free than when sleeping on this." icon_state = "sheetUSA" + item_state = "sheetUSA" item_color = "sheetUSA" dream_messages = list("America", "freedom", "fireworks", "bald eagles") @@ -86,16 +98,19 @@ LINEN BINS name = "rainbow bedsheet" desc = "A multicolored blanket. It's actually several different sheets cut up and sewn together." icon_state = "sheetrainbow" + item_state = "sheetrainbow" item_color = "rainbow" dream_messages = list("red", "orange", "yellow", "green", "blue", "purple", "a rainbow") /obj/item/bedsheet/red icon_state = "sheetred" + item_state = "sheetred" item_color = "red" dream_messages = list("red") /obj/item/bedsheet/yellow icon_state = "sheetyellow" + item_state = "sheetyellow" item_color = "yellow" dream_messages = list("yellow") @@ -103,6 +118,7 @@ LINEN BINS 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_state = "sheetmime" item_color = "mime" dream_messages = list("silence", "gestures", "a pale face", "a gaping mouth", "the mime") @@ -110,6 +126,7 @@ LINEN BINS name = "clown's blanket" desc = "A rainbow blanket with a clown mask woven in. It smells faintly of bananas." icon_state = "sheetclown" + item_state = "sheetrainbow" item_color = "clown" dream_messages = list("honk", "laughter", "a prank", "a joke", "a smiling face", "the clown") @@ -117,6 +134,7 @@ LINEN BINS 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_state = "sheetcaptain" item_color = "captain" dream_messages = list("authority", "a golden ID", "sunglasses", "a green disc", "an antique gun", "the captain") @@ -124,6 +142,7 @@ LINEN BINS 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_state = "sheetrd" item_color = "director" dream_messages = list("authority", "a silvery ID", "a bomb", "a mech", "a facehugger", "maniacal laughter", "the research director") @@ -137,6 +156,7 @@ 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_state = "sheetmedical" item_color = "medical" dream_messages = list("healing", "life", "surgery", "a doctor") @@ -144,6 +164,7 @@ LINEN BINS 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_state = "sheetcmo" item_color = "cmo" dream_messages = list("authority", "a silvery ID", "healing", "life", "surgery", "a cat", "the chief medical officer") @@ -151,6 +172,7 @@ LINEN BINS 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_state = "sheethos" item_color = "hosred" dream_messages = list("authority", "a silvery ID", "handcuffs", "a baton", "a flashbang", "sunglasses", "the head of security") @@ -158,6 +180,7 @@ LINEN BINS 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_state = "sheethop" item_color = "hop" dream_messages = list("authority", "a silvery ID", "obligation", "a computer", "an ID", "a corgi", "the head of personnel") @@ -165,6 +188,7 @@ LINEN BINS 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_state = "sheetce" item_color = "chief" dream_messages = list("authority", "a silvery ID", "the engine", "power tools", "an APC", "a parrot", "the chief engineer") @@ -172,6 +196,7 @@ LINEN BINS 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_state = "sheetqm" item_color = "qm" dream_messages = list("a grey ID", "a shuttle", "a crate", "a sloth", "the quartermaster") @@ -179,16 +204,19 @@ LINEN BINS name = "magician's cape" desc = "A magician never reveals his secrets." icon_state = "sheetmagician" + item_state = "sheetmagician" item_color = "magician" dream_messages = list("trickery", "crime", "a gullible mark", "an angry wizard", "pixie dust") /obj/item/bedsheet/brown icon_state = "sheetbrown" + item_state = "sheetbrown" item_color = "cargo" dream_messages = list("brown") /obj/item/bedsheet/black icon_state = "sheetblack" + item_state = "sheetblack" item_color = "black" dream_messages = list("black") @@ -196,6 +224,7 @@ LINEN BINS 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_state = "sheetcentcom" item_color = "centcom" dream_messages = list("a unique ID", "authority", "artillery", "an ending") @@ -203,6 +232,7 @@ LINEN BINS name = "syndicate bedsheet" desc = "It has a syndicate emblem and it has an aura of evil." icon_state = "sheetsyndie" + item_state = "sheetsyndie" item_color = "syndie" dream_messages = list("a green disc", "a red crystal", "a glowing blade", "a wire-covered ID") @@ -210,6 +240,7 @@ LINEN BINS 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_state = "sheetcult" item_color = "cult" dream_messages = list("a tome", "a floating red crystal", "a glowing sword", "a bloody symbol", "a massive humanoid figure") @@ -217,18 +248,21 @@ LINEN BINS 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_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" + name = "\improper Nanotrasen bedsheet" desc = "It has the Nanotrasen logo on it and has an aura of duty." icon_state = "sheetNT" + item_state = "sheetNT" item_color = "nanotrasen" dream_messages = list("authority", "an ending") /obj/item/bedsheet/ian icon_state = "sheetian" + item_state = "sheetian" item_color = "ian" dream_messages = list("a dog", "a corgi", "woof", "bark", "arf") @@ -236,6 +270,7 @@ LINEN BINS name = "cosmic space bedsheet" desc = "Made from the dreams of those who wonder at the stars." icon_state = "sheetcosmos" + item_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 diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index bc36ab7476b94..245a3edef4720 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -7,6 +7,11 @@ smooth = SMOOTH_TRUE canSmoothWith = null obj_flags = CAN_BE_HIT | BLOCK_Z_FALL + //Negates the effect of space and openspace. + //Shouldn't be placed above anything else. + FASTDMM_PROP(\ + pipe_astar_cost = -98.5\ + ) /obj/structure/lattice/catwalk/over layer = CATWALK_LAYER @@ -22,9 +27,9 @@ if(C.tool_behaviour == TOOL_WELDER) if(!C.tool_start_check(user, amount=0)) return FALSE - to_chat(user, "You begin slicing through the outer plating...") + balloon_alert(user, "You start slicing through outer plating") if(C.use_tool(src, user, 25, volume=100)) - to_chat(user, "You slice off [src]") + balloon_alert(user, "[src] sliced off") deconstruct() return TRUE diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 9b9dc40d20151..d287306131d2a 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -7,7 +7,7 @@ drag_slowdown = 1.5 // Same as a prone mob max_integrity = 200 integrity_failure = 50 - armor = list("melee" = 20, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 60) + armor = list("melee" = 20, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 60, "stamina" = 0) var/icon_door = null var/icon_door_override = FALSE //override to have open overlay use icon different to its base's var/secure = FALSE //secure locker or not, also used if overriding a non-secure locker with a secure door overlay to add fancy lights @@ -26,7 +26,7 @@ var/max_mob_size = MOB_SIZE_HUMAN //Biggest mob_size accepted by the container var/mob_storage_capacity = 3 // how many human sized mob/living can fit together inside a closet. var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate then open it in a populated area to crash clients. - var/cutting_tool = /obj/item/weldingtool + var/cutting_tool = TOOL_WELDER var/open_sound = 'sound/machines/closet_open.ogg' var/close_sound = 'sound/machines/closet_close.ogg' var/open_sound_volume = 35 @@ -40,7 +40,7 @@ var/is_animating_door = FALSE var/door_anim_squish = 0.30 var/door_anim_angle = 136 - var/door_hinge_x = -6.5 + var/door_hinge = -6.5 var/door_anim_time = 2.0 // set to 0 to make the door not animate at all /obj/structure/closet/Initialize(mapload) if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents @@ -58,6 +58,8 @@ return ..() /obj/structure/closet/update_icon() + if(istype(src, /obj/structure/closet/supplypod)) + return . = ..() cut_overlays() if(!opened) layer = OBJ_LAYER @@ -115,9 +117,9 @@ /obj/structure/closet/proc/get_door_transform(angle) var/matrix/M = matrix() - M.Translate(-door_hinge_x, 0) + M.Translate(-door_hinge, 0) M.Multiply(matrix(cos(angle), 0, 0, -sin(angle) * door_anim_squish, 1, 0)) - M.Translate(door_hinge_x, 0) + M.Translate(door_hinge, 0) return M /obj/structure/closet/examine(mob/user) @@ -267,11 +269,11 @@ else return ..() -/obj/structure/closet/proc/tool_interact(obj/item/W, mob/user)//returns TRUE if attackBy call shouldnt be continued (because tool was used/closet was of wrong type), FALSE if otherwise +/obj/structure/closet/proc/tool_interact(obj/item/W, mob/user)//returns TRUE if attackBy call shouldn't be continued (because tool was used/closet was of wrong type), FALSE if otherwise . = TRUE if(opened) - if(istype(W, cutting_tool)) - if(W.tool_behaviour == TOOL_WELDER) + if(W.tool_behaviour == cutting_tool) + if(cutting_tool == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return @@ -326,7 +328,7 @@ return /obj/structure/closet/MouseDrop_T(atom/movable/O, mob/living/user) - if(!istype(O) || O.anchored || istype(O, /obj/screen)) + if(!istype(O) || O.anchored || istype(O, /atom/movable/screen)) return if(!istype(user) || user.incapacitated() || !(user.mobility_flags & MOBILITY_STAND)) return @@ -358,8 +360,11 @@ var/mob/living/L = O if(!issilicon(L)) L.Paralyze(40) - O.forceMove(T) - close() + if(istype(src, /obj/structure/closet/supplypod/extractionpod)) + O.forceMove(src) + else + O.forceMove(T) + close() else O.forceMove(T) return 1 @@ -454,7 +459,6 @@ open() /obj/structure/closet/AltClick(mob/user) - ..() if(!user.canUseTopic(src, BE_CLOSE) || !isturf(loc)) return if(opened || !secure) @@ -479,13 +483,13 @@ "You [locked ? null : "un"]lock [src].") update_icon() else if(!silent) - to_chat(user, "Access Denied") + to_chat(user, "Access Denied.") else if(secure && broken) to_chat(user, "\The [src] is broken!") /obj/structure/closet/emag_act(mob/user) if(secure && !broken) - user.visible_message("Sparks fly from [src]!", + user?.visible_message("Sparks fly from [src]!", "You scramble [src]'s lock, breaking it open!", "You hear a faint electrical spark.") playsound(src, "sparks", 50, 1) @@ -495,7 +499,7 @@ /obj/structure/closet/get_remote_view_fullscreens(mob/user) if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS))) - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1) /obj/structure/closet/emp_act(severity) . = ..() @@ -516,9 +520,14 @@ req_access += pick(get_all_accesses()) /obj/structure/closet/contents_explosion(severity, target) - for(var/atom/A in contents) - A.ex_act(severity, target) - CHECK_TICK + for(var/thing in contents) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += thing + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += thing + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += thing /obj/structure/closet/singularity_act() dump_contents() diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 77fa687182134..339588fd17736 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -8,7 +8,7 @@ max_integrity = 70 integrity_failure = 0 can_weld_shut = 0 - cutting_tool = /obj/item/wirecutters + cutting_tool = TOOL_WIRECUTTER open_sound = "rustle" material_drop = /obj/item/stack/sheet/cardboard delivery_icon = "deliverybox" @@ -70,7 +70,7 @@ mob_storage_capacity = 5 resistance_flags = NONE move_speed_multiplier = 2 - cutting_tool = /obj/item/weldingtool + cutting_tool = TOOL_WELDER open_sound = 'sound/machines/crate_open.ogg' close_sound = 'sound/machines/crate_close.ogg' open_sound_volume = 35 diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index e1836e6dec707..2d276d496adde 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -14,7 +14,6 @@ name = "strange closet" desc = "It looks alien!" icon_state = "alien" - door_anim_time = 0 // no animation /obj/structure/closet/gimmick diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index cf6e39481cfa1..90da208bacb0f 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -137,6 +137,7 @@ var/static/items_inside = list( /obj/item/clothing/suit/hooded/wintercoat/cargo = 1, /obj/item/clothing/under/rank/cargo/tech = 3, + /obj/item/clothing/under/rank/cargo/tech/skirt = 3, /obj/item/clothing/shoes/sneakers/black = 3, /obj/item/clothing/gloves/fingerless = 3, /obj/item/clothing/head/soft = 3, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index c6cd9426c20ab..6532ff7c07489 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -8,8 +8,9 @@ new /obj/item/clothing/neck/cloak/qm(src) new /obj/item/storage/lockbox/medal/cargo(src) new /obj/item/clothing/under/rank/cargo/qm(src) + new /obj/item/clothing/under/rank/cargo/qm/skirt(src) new /obj/item/clothing/shoes/sneakers/brown(src) - new /obj/item/radio/headset/headset_cargo(src) + new /obj/item/radio/headset/headset_quartermaster(src) new /obj/item/clothing/suit/fire/firefighter(src) new /obj/item/clothing/gloves/fingerless(src) new /obj/item/megaphone/cargo(src) @@ -21,4 +22,4 @@ new /obj/item/circuitboard/machine/techfab/department/cargo(src) new /obj/item/storage/photo_album/QM(src) new /obj/item/circuitboard/machine/ore_silo(src) - new /obj/item/card/id/departmental_budget/car(src) \ No newline at end of file + new /obj/item/card/id/departmental_budget/car(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 1767fc42aedda..66a2fd8d141b7 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -22,6 +22,7 @@ new /obj/item/areaeditor/blueprints(src) new /obj/item/airlock_painter(src) new /obj/item/holosign_creator/engineering(src) + new /obj/item/holosign_creator/atmos(src) new /obj/item/clothing/mask/gas(src) new /obj/item/multitool(src) new /obj/item/assembly/flash/handheld(src) @@ -33,6 +34,7 @@ new /obj/item/extinguisher/advanced(src) new /obj/item/storage/photo_album/CE(src) new /obj/item/card/id/departmental_budget/eng(src) + new /obj/item/storage/bag/construction(src) /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" @@ -79,7 +81,6 @@ new /obj/item/clothing/glasses/meson/engine(src) new /obj/item/storage/box/emptysandbags(src) - /obj/structure/closet/secure_closet/atmospherics name = "\proper atmospheric technician's locker" req_access = list(ACCESS_ATMOSPHERICS) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index e9f9900aa81a2..88a1b06f8614b 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -86,6 +86,7 @@ new /obj/item/clothing/head/bio_hood/cmo(src) new /obj/item/clothing/suit/toggle/labcoat/cmo(src) new /obj/item/clothing/under/rank/medical/chief_medical_officer(src) + new /obj/item/clothing/under/rank/medical/chief_medical_officer/skirt(src) new /obj/item/clothing/shoes/sneakers/brown (src) new /obj/item/cartridge/cmo(src) new /obj/item/radio/headset/heads/cmo(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm old mode 100755 new mode 100644 index 93e8a28bf64a3..49843419506b1 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -11,9 +11,12 @@ new /obj/item/clothing/head/bio_hood/scientist(src) new /obj/item/clothing/suit/toggle/labcoat/rd(src) new /obj/item/clothing/under/rank/rnd/research_director(src) + new /obj/item/clothing/under/rank/rnd/research_director/skirt(src) new /obj/item/clothing/under/rank/rnd/research_director/alt(src) - new /obj/item/clothing/under/rank/rnd/research_director/hazard(src) + new /obj/item/clothing/under/rank/rnd/research_director/alt/skirt(src) + new /obj/item/clothing/under/rank/rnd/research_director/vest(src) new /obj/item/clothing/under/rank/rnd/research_director/turtleneck(src) + new /obj/item/clothing/under/rank/rnd/research_director/turtleneck/skirt(src) new /obj/item/clothing/shoes/sneakers/brown(src) new /obj/item/cartridge/rd(src) new /obj/item/clothing/gloves/color/latex(src) @@ -28,4 +31,4 @@ new /obj/item/door_remote/research_director(src) new /obj/item/circuitboard/machine/techfab/department/science(src) new /obj/item/storage/photo_album/RD(src) - new /obj/item/card/id/departmental_budget/sci(src) + new /obj/item/card/id/departmental_budget/sci(src) \ No newline at end of file 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 57520f6f407bd..51e7d0f1896fb 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 @@ -4,10 +4,10 @@ locked = TRUE icon_state = "secure" max_integrity = 250 - armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "stamina" = 0) secure = TRUE /obj/structure/closet/secure_closet/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == "melee" && damage_amount < 20) return 0 - . = ..() \ No newline at end of file + . = ..() 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 83e95242e3943..2f7b277ac8708 100755 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -33,7 +33,6 @@ new /obj/item/storage/belt/sabre(src) new /obj/item/gun/energy/e_gun(src) new /obj/item/door_remote/captain(src) - new /obj/item/card/id/captains_spare(src) new /obj/item/storage/photo_album/Captain(src) new /obj/item/card/id/departmental_budget/civ(src) @@ -47,6 +46,7 @@ new /obj/item/clothing/neck/cloak/hop(src) new /obj/item/storage/lockbox/medal/service(src) new /obj/item/clothing/under/rank/civilian/head_of_personnel(src) + new /obj/item/clothing/under/rank/civilian/head_of_personnel/skirt(src) new /obj/item/clothing/head/hopcap(src) new /obj/item/cartridge/hop(src) new /obj/item/radio/headset/heads/hop(src) @@ -68,7 +68,7 @@ /obj/structure/closet/secure_closet/brig_phys name = "\proper brig physician's locker" - req_access = list(ACCESS_BRIG) + req_access = list(ACCESS_BRIGPHYS) icon_state = "brig_phys" /obj/structure/closet/secure_closet/brig_phys/PopulateContents() @@ -82,11 +82,9 @@ new /obj/item/storage/firstaid/o2(src) new /obj/item/storage/firstaid/brute(src) new /obj/item/storage/belt/medical(src) - new /obj/item/storage/belt/security/deputy(src) - new /obj/item/reagent_containers/spray/pepper(src) - new /obj/item/assembly/flash/handheld(src) - new /obj/item/restraints/handcuffs(src) new /obj/item/clothing/gloves/color/latex/nitrile(src) + new /obj/item/clothing/under/rank/brig_phys(src) + new /obj/item/clothing/under/rank/brig_phys/skirt(src) /obj/structure/closet/secure_closet/hos name = "\proper head of security's locker" @@ -105,14 +103,16 @@ new /obj/item/clothing/suit/armor/vest/leather(src) new /obj/item/clothing/suit/armor/hos/trenchcoat(src) new /obj/item/clothing/suit/armor/hos(src) + new /obj/item/clothing/under/rank/security/head_of_security(src) + new /obj/item/clothing/under/rank/security/head_of_security/skirt(src) new /obj/item/clothing/under/rank/security/head_of_security/alt(src) + new /obj/item/clothing/under/rank/security/head_of_security/alt/skirt(src) new /obj/item/clothing/head/HoS(src) new /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch(src) new /obj/item/clothing/glasses/hud/security/sunglasses/gars/supergars(src) new /obj/item/clothing/under/rank/security/head_of_security/white(src) new /obj/item/storage/lockbox/medal/sec(src) new /obj/item/megaphone/sec(src) - new /obj/item/holosign_creator/security(src) new /obj/item/storage/lockbox/loyalty(src) new /obj/item/clothing/mask/gas/sechailer/swat(src) new /obj/item/storage/box/flashbangs(src) @@ -140,8 +140,9 @@ new /obj/item/clothing/head/beret/corpwarden(src) new /obj/item/clothing/suit/armor/vest/warden/alt(src) new /obj/item/clothing/under/rank/security/warden/formal(src) + new /obj/item/clothing/under/rank/security/warden(src) + new /obj/item/clothing/under/rank/security/warden/skirt(src) new /obj/item/clothing/glasses/hud/security/sunglasses(src) - new /obj/item/holosign_creator/security(src) new /obj/item/clothing/mask/gas/sechailer(src) new /obj/item/storage/box/zipties(src) new /obj/item/storage/box/flashbangs(src) @@ -213,29 +214,19 @@ /obj/structure/closet/secure_closet/detective/PopulateContents() ..() - new /obj/item/clothing/under/rank/security/detective(src) - new /obj/item/clothing/suit/det_suit(src) - new /obj/item/clothing/head/fedora/det_hat(src) - new /obj/item/clothing/gloves/color/black(src) - new /obj/item/clothing/under/rank/security/detective/grey(src) - new /obj/item/clothing/accessory/waistcoat(src) - new /obj/item/clothing/suit/det_suit/grey(src) - new /obj/item/clothing/suit/det_suit/noir(src) - new /obj/item/clothing/head/fedora(src) - new /obj/item/clothing/shoes/laceup(src) new /obj/item/storage/box/evidence(src) new /obj/item/radio/headset/headset_sec(src) new /obj/item/detective_scanner(src) new /obj/item/flashlight/seclite(src) - new /obj/item/holosign_creator/security(src) new /obj/item/reagent_containers/spray/pepper(src) new /obj/item/clothing/suit/armor/vest/det_suit(src) new /obj/item/clothing/accessory/holster/detective(src) new /obj/item/pinpointer/crew(src) - new /obj/item/twohanded/binoculars(src) + new /obj/item/binoculars(src) new /obj/item/clothing/neck/tie/red(src) new /obj/item/clothing/neck/tie/black(src) new /obj/item/clothing/neck/tie/detective(src) + new /obj/item/storage/box/rxglasses/spyglasskit(src) /obj/structure/closet/secure_closet/deputy name = "deputy's locker" @@ -280,7 +271,7 @@ ..() new /obj/item/clothing/shoes/sneakers/brown(src) for(var/i in 1 to 3) - new /obj/item/paper/fluff/jobs/security/court_judgement (src) + new /obj/item/paper/fluff/jobs/security/court_judgment (src) new /obj/item/pen (src) new /obj/item/clothing/suit/judgerobe (src) new /obj/item/clothing/head/powdered_wig (src) 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 1d19c551bf718..234dc483814df 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -32,22 +32,26 @@ new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/clothing/mask/breath(src) new /obj/item/clothing/mask/breath(src) + for(var/i in 1 to rand(1,3)) + new /obj/item/clothing/suit/space/hardsuit/skinsuit(src) if ("aid") new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/storage/firstaid/o2(src) new /obj/item/clothing/mask/breath(src) + for(var/i in 1 to rand(1,3)) + new /obj/item/clothing/suit/space/hardsuit/skinsuit(src) if ("tank") new /obj/item/tank/internals/air(src) new /obj/item/clothing/mask/breath(src) + for(var/i in 1 to rand(1,3)) + new /obj/item/clothing/suit/space/hardsuit/skinsuit(src) if ("both") new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/clothing/mask/breath(src) - - if ("nothing") - // doot + new /obj/item/clothing/suit/space/hardsuit/skinsuit(src) // teehee if ("delete") diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 596ba4b0028fd..76ae5fa9ef126 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -7,6 +7,8 @@ ..() for(var/i in 1 to 3) new /obj/item/clothing/under/color/blue(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/skirt/color/blue(src) for(var/i in 1 to 3) new /obj/item/clothing/shoes/sneakers/brown(src) return @@ -18,6 +20,8 @@ /obj/structure/closet/wardrobe/pink/PopulateContents() for(var/i in 1 to 3) new /obj/item/clothing/under/color/pink(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/skirt/color/pink(src) for(var/i in 1 to 3) new /obj/item/clothing/shoes/sneakers/brown(src) return @@ -29,6 +33,8 @@ /obj/structure/closet/wardrobe/black/PopulateContents() for(var/i in 1 to 3) new /obj/item/clothing/under/color/black(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/skirt/color/black(src) if(prob(25)) new /obj/item/clothing/suit/jacket/leather(src) if(prob(20)) @@ -53,6 +59,8 @@ /obj/structure/closet/wardrobe/green/PopulateContents() for(var/i in 1 to 3) new /obj/item/clothing/under/color/green(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/skirt/color/green(src) for(var/i in 1 to 3) new /obj/item/clothing/shoes/sneakers/black(src) new /obj/item/clothing/mask/bandana/green(src) @@ -80,6 +88,8 @@ /obj/structure/closet/wardrobe/yellow/PopulateContents() for(var/i in 1 to 3) new /obj/item/clothing/under/color/yellow(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/skirt/color/yellow(src) for(var/i in 1 to 3) new /obj/item/clothing/shoes/sneakers/orange(src) new /obj/item/clothing/mask/bandana/gold(src) @@ -94,6 +104,8 @@ /obj/structure/closet/wardrobe/white/PopulateContents() for(var/i in 1 to 3) new /obj/item/clothing/under/color/white(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/skirt/color/white(src) for(var/i in 1 to 3) new /obj/item/clothing/shoes/sneakers/white(src) for(var/i in 1 to 3) @@ -121,6 +133,8 @@ /obj/structure/closet/wardrobe/grey/PopulateContents() for(var/i in 1 to 3) new /obj/item/clothing/under/color/grey(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/skirt/color/grey(src) for(var/i in 1 to 3) new /obj/item/clothing/shoes/sneakers/black(src) for(var/i in 1 to 3) @@ -152,16 +166,27 @@ if(prob(40)) new /obj/item/clothing/suit/jacket(src) new /obj/item/clothing/under/color/white(src) + new /obj/item/clothing/under/skirt/color/white(src) new /obj/item/clothing/under/color/blue(src) + new /obj/item/clothing/under/skirt/color/blue(src) new /obj/item/clothing/under/color/yellow(src) + new /obj/item/clothing/under/skirt/color/yellow(src) new /obj/item/clothing/under/color/green(src) + new /obj/item/clothing/under/skirt/color/green(src) new /obj/item/clothing/under/color/orange(src) + new /obj/item/clothing/under/skirt/color/orange(src) new /obj/item/clothing/under/color/pink(src) + new /obj/item/clothing/under/skirt/color/pink(src) new /obj/item/clothing/under/color/red(src) + new /obj/item/clothing/under/skirt/color/red(src) new /obj/item/clothing/under/color/darkblue(src) + new /obj/item/clothing/under/skirt/color/darkblue(src) new /obj/item/clothing/under/color/teal(src) + new /obj/item/clothing/under/skirt/color/teal(src) new /obj/item/clothing/under/color/lightpurple(src) + new /obj/item/clothing/under/skirt/color/lightpurple(src) new /obj/item/clothing/under/color/green(src) + new /obj/item/clothing/under/skirt/color/green(src) new /obj/item/clothing/mask/bandana/red(src) new /obj/item/clothing/mask/bandana/red(src) new /obj/item/clothing/mask/bandana/blue(src) @@ -174,4 +199,6 @@ if(prob(30)) new /obj/item/clothing/suit/hooded/wintercoat(src) new /obj/item/clothing/shoes/winterboots(src) + if(prob(40)) + new /obj/item/clothing/suit/toggle/softshell(src) return diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index f9f7174dcaef5..fe98dae5dd70b 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -13,19 +13,25 @@ climb_time = 10 //real fast, because let's be honest stepping into or onto a crate is easy climb_stun = 0 //climbing onto crates isn't hard, guys delivery_icon = "deliverycrate" - door_anim_time = 0 // no animation + door_anim_time = 3 + door_anim_angle = 180 + door_hinge = 3.5 open_sound = 'sound/machines/crate_open.ogg' close_sound = 'sound/machines/crate_close.ogg' open_sound_volume = 35 close_sound_volume = 50 drag_slowdown = 0 + var/azimuth_angle_2 = 138 //in this context the azimuth angle for over 90 degree var/obj/item/paper/fluff/jobs/cargo/manifest/manifest + var/radius_2 = 1.35 + var/static/list/animation_math //assoc list with pre calculated values /obj/structure/closet/crate/Initialize() . = ..() - if(icon_state == "[initial(icon_state)]open") - opened = TRUE - update_icon() + if(animation_math == null) //checks if there is already a list for animation_math if not creates one to avoid runtimes + animation_math = new/list() + if(!door_anim_time == 0 && !animation_math["[door_anim_time]-[door_anim_angle]-[azimuth_angle_2]-[radius_2]-[door_hinge]"]) + animation_list() /obj/structure/closet/crate/CanPass(atom/movable/mover, turf/target) if(!istype(mover, /obj/structure/closet)) @@ -38,11 +44,70 @@ return !density /obj/structure/closet/crate/update_icon() - icon_state = "[initial(icon_state)][opened ? "open" : ""]" - cut_overlays() - if(manifest) - add_overlay("manifest") + if(!opened) + layer = OBJ_LAYER + if(!is_animating_door) + if(icon_door) + add_overlay("[icon_door]_door") + else + add_overlay("[icon_state]_door") + else + layer = BELOW_OBJ_LAYER + if(!is_animating_door) + if(icon_door_override) + add_overlay("[icon_door]_open") + else + add_overlay("[icon_state]_open") + +/obj/structure/closet/crate/animate_door(var/closing = FALSE) + if(!door_anim_time) + return + if(!door_obj) door_obj = new + vis_contents |= door_obj + door_obj.icon = icon + door_obj.icon_state = "[icon_door || icon_state]_door" + is_animating_door = TRUE + var/num_steps = door_anim_time / world.tick_lag + var/list/animation_math_list = animation_math["[door_anim_time]-[door_anim_angle]-[azimuth_angle_2]-[radius_2]-[door_hinge]"] + for(var/I in 0 to num_steps) + var/door_state = I == (closing ? num_steps : 0) ? "[icon_door || icon_state]_door" : animation_math_list[closing ? 2 * num_steps - I : num_steps + I] <= 0 ? "[icon_door_override ? icon_door : icon_state]_back" : "[icon_door || icon_state]_door" + var/door_layer = I == (closing ? num_steps : 0) ? ABOVE_MOB_LAYER : animation_math_list[closing ? 2 * num_steps - I : num_steps + I] <= 0 ? FLOAT_LAYER : ABOVE_MOB_LAYER + var/matrix/M = get_door_transform(I == (closing ? num_steps : 0) ? 0 : animation_math_list[closing ? num_steps - I : I], I == (closing ? num_steps : 0) ? 1 : animation_math_list[closing ? 2 * num_steps - I : num_steps + I]) + if(I == 0) + door_obj.transform = M + door_obj.icon_state = door_state + door_obj.layer = door_layer + else if(I == 1) + animate(door_obj, transform = M, icon_state = door_state, layer = door_layer, time = world.tick_lag, flags = ANIMATION_END_NOW) + else + animate(transform = M, icon_state = door_state, layer = door_layer, time = world.tick_lag) + addtimer(CALLBACK(src,.proc/end_door_animation),door_anim_time,TIMER_UNIQUE|TIMER_OVERRIDE) + +/obj/structure/closet/crate/end_door_animation() + is_animating_door = FALSE + vis_contents -= door_obj + update_icon() + COMPILE_OVERLAYS(src) + +/obj/structure/closet/crate/get_door_transform(crateanim_1, crateanim_2) + var/matrix/M = matrix() + M.Translate(0, -door_hinge) + M.Multiply(matrix(1, crateanim_1, 0, 0, crateanim_2, 0)) + M.Translate(0, door_hinge) + return M + +/obj/structure/closet/crate/proc/animation_list() //pre calculates a list of values for the crate animation cause byond not like math + var/num_steps_1 = door_anim_time / world.tick_lag + var/list/new_animation_math_sublist[num_steps_1 * 2] + for(var/I in 1 to num_steps_1) //loop to save the animation values into the lists + var/angle_1 = door_anim_angle * (I / num_steps_1) + var/polar_angle = abs(arcsin(cos(angle_1))) + var/azimuth_angle = angle_1 >= 90 ? azimuth_angle_2 : 0 + var/radius_cr = angle_1 >= 90 ? radius_2 : 1 + new_animation_math_sublist[I] = -sin(polar_angle) * sin(azimuth_angle) * radius_cr + new_animation_math_sublist[num_steps_1 + I] = cos(azimuth_angle) * sin(polar_angle) * radius_cr + animation_math["[door_anim_time]-[door_anim_angle]-[azimuth_angle_2]-[radius_2]-[door_hinge]"] = new_animation_math_sublist /obj/structure/closet/crate/attack_hand(mob/user) . = ..() @@ -82,26 +147,34 @@ close_sound = 'sound/machines/wooden_closet_close.ogg' open_sound_volume = 25 close_sound_volume = 50 + door_anim_angle = 140 + azimuth_angle_2 = 180 + door_anim_time = 5 + door_hinge = 5 /obj/structure/closet/crate/internals desc = "An internals crate." name = "internals crate" - icon_state = "o2crate" + icon_state = "o2_crate" /obj/structure/closet/crate/trashcart desc = "A heavy, metal trashcart with wheels." name = "trash cart" icon_state = "trashcart" + door_anim_time = 0 /obj/structure/closet/crate/medical desc = "A medical crate." name = "medical crate" - icon_state = "medicalcrate" + icon_state = "medical_crate" /obj/structure/closet/crate/freezer desc = "A freezer." name = "freezer" icon_state = "freezer" + door_hinge = 5 + door_anim_angle = 165 + azimuth_angle_2 = 145 //Snowflake organ freezer code //Order is important, since we check source, we need to do the check whenever we have all the organs in the crate @@ -116,7 +189,7 @@ /obj/structure/closet/crate/freezer/Destroy() recursive_organ_check(src) - ..() + return ..() /obj/structure/closet/crate/freezer/Initialize() ..() @@ -139,6 +212,7 @@ new /obj/item/reagent_containers/blood/OPlus(src) new /obj/item/reagent_containers/blood/lizard(src) new /obj/item/reagent_containers/blood/ethereal(src) + new /obj/item/reagent_containers/blood/oozeling(src) for(var/i in 1 to 3) new /obj/item/reagent_containers/blood/random(src) @@ -160,12 +234,12 @@ /obj/structure/closet/crate/radiation desc = "A crate with a radiation sign on it." name = "radiation crate" - icon_state = "radiation" + icon_state = "radiation_crate" /obj/structure/closet/crate/hydroponics name = "hydroponics crate" desc = "All you need to destroy those pesky weeds and pests." - icon_state = "hydrocrate" + icon_state = "hydro_crate" /obj/structure/closet/crate/engineering name = "engineering crate" @@ -173,6 +247,7 @@ /obj/structure/closet/crate/engineering/electrical icon_state = "engi_e_crate" + icon_door = "engi_crate" /obj/structure/closet/crate/rcd desc = "A crate for the storage of an RCD." @@ -188,7 +263,7 @@ /obj/structure/closet/crate/science name = "science crate" desc = "A science crate." - icon_state = "scicrate" + icon_state = "sci_crate" /obj/structure/closet/crate/solarpanel_small name = "budget solar panel crate" diff --git a/code/game/objects/structures/crates_lockers/crates/bins.dm b/code/game/objects/structures/crates_lockers/crates/bins.dm index 364d83b90dc41..16c7bd229300d 100644 --- a/code/game/objects/structures/crates_lockers/crates/bins.dm +++ b/code/game/objects/structures/crates_lockers/crates/bins.dm @@ -7,13 +7,17 @@ anchored = TRUE horizontal = FALSE delivery_icon = null + door_anim_time = 0 /obj/structure/closet/crate/bin/Initialize() . = ..() + if(icon_state == "[initial(icon_state)]open") + opened = TRUE update_icon() /obj/structure/closet/crate/bin/update_icon() - ..() + icon_state = "[initial(icon_state)][opened ? "open" : ""]" + cut_overlays() if(contents.len == 0) add_overlay("largebing") @@ -37,6 +41,4 @@ /obj/structure/closet/crate/bin/proc/do_animate() playsound(loc, open_sound, 15, 1, -3) flick("animate_largebins", src) - spawn(13) - playsound(loc, close_sound, 15, 1, -3) - update_icon() + addtimer(CALLBACK(src, .proc/close), 13) diff --git a/code/game/objects/structures/crates_lockers/crates/critter.dm b/code/game/objects/structures/crates_lockers/crates/critter.dm index 19d2ad460dba0..a114b8d94d648 100644 --- a/code/game/objects/structures/crates_lockers/crates/critter.dm +++ b/code/game/objects/structures/crates_lockers/crates/critter.dm @@ -1,7 +1,7 @@ /obj/structure/closet/crate/critter name = "critter crate" desc = "A crate designed for safe transport of animals. It has an oxygen tank for safe transport in space." - icon_state = "crittercrate" + icon_state = "critter_crate" horizontal = FALSE allow_objects = FALSE breakout_time = 600 @@ -13,6 +13,9 @@ open_sound_volume = 25 close_sound_volume = 50 var/obj/item/tank/internals/emergency_oxygen/tank + door_hinge = 5.5 + door_anim_angle = 90 + azimuth_angle_2 = 0.35 /obj/structure/closet/crate/critter/Initialize() . = ..() @@ -27,13 +30,41 @@ return ..() /obj/structure/closet/crate/critter/update_icon() - cut_overlays() - if(opened) - add_overlay("crittercrate_door_open") - else - add_overlay("crittercrate_door") - if(manifest) - add_overlay("manifest") + . = ..() + +/obj/structure/closet/crate/critter/animate_door(var/closing = FALSE) + if(!door_anim_time) + return + if(!door_obj) door_obj = new + vis_contents |= door_obj + door_obj.icon = icon + door_obj.icon_state = "[icon_door || icon_state]_door" + is_animating_door = TRUE + var/num_steps = door_anim_time / world.tick_lag + var/list/animation_math_list = animation_math["[door_anim_time]-[door_anim_angle]-[azimuth_angle_2]-[radius_2]-[door_hinge]"] + for(var/I in 0 to num_steps) + var/matrix/M = get_door_transform(I == (closing ? num_steps : 0) ? 1 : animation_math_list[closing ? num_steps - I : I], I == (closing ? num_steps : 0) ? 0 : animation_math_list[closing ? 2 * num_steps - I : num_steps + I]) + + if(I == 0) + door_obj.transform = M + else if(I == 1) + animate(door_obj, transform = M, time = world.tick_lag, flags = ANIMATION_END_NOW) + else + animate(transform = M, time = world.tick_lag) + addtimer(CALLBACK(src,.proc/end_door_animation),door_anim_time,TIMER_UNIQUE|TIMER_OVERRIDE) + +/obj/structure/closet/crate/critter/end_door_animation() + is_animating_door = FALSE + vis_contents -= door_obj + update_icon() + COMPILE_OVERLAYS(src) + +/obj/structure/closet/crate/critter/get_door_transform(crateanim_1, crateanim_2) + var/matrix/M = matrix() + M.Translate(-door_hinge, 0) + M.Multiply(matrix(crateanim_1, 0, 0, crateanim_2, 1, 0)) + M.Translate(door_hinge, 0) + return M /obj/structure/closet/crate/critter/return_air() if(tank) @@ -45,4 +76,13 @@ if(tank) return tank.return_analyzable_air() else - return null \ No newline at end of file + return null + +/obj/structure/closet/crate/critter/animation_list() + var/num_steps_1 = door_anim_time / world.tick_lag + var/list/new_animation_math_sublist[num_steps_1 * 2] + for(var/I in 1 to num_steps_1) //loop to save the animation values into the lists + var/angle_1 = door_anim_angle * (I / num_steps_1) + new_animation_math_sublist[I] = cos(angle_1) + new_animation_math_sublist[num_steps_1+I] = sin(angle_1) * azimuth_angle_2 + animation_math["[door_anim_time]-[door_anim_angle]-[azimuth_angle_2]-[radius_2]-[door_hinge]"] = new_animation_math_sublist diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm index 72909f43f181e..512cb6ed3d721 100644 --- a/code/game/objects/structures/crates_lockers/crates/large.dm +++ b/code/game/objects/structures/crates_lockers/crates/large.dm @@ -1,7 +1,7 @@ /obj/structure/closet/crate/large name = "large crate" desc = "A hefty wooden crate. You'll need a crowbar to get it open." - icon_state = "largecrate" + icon_state = "large_crate" density = TRUE material_drop = /obj/item/stack/sheet/mineral/wood material_drop_amount = 4 @@ -11,6 +11,7 @@ close_sound = 'sound/machines/wooden_closet_close.ogg' open_sound_volume = 25 close_sound_volume = 50 + door_anim_time = 0 /obj/structure/closet/crate/large/attack_hand(mob/user) add_fingerprint(user) @@ -44,4 +45,4 @@ else to_chat(user, "You need a crowbar to pry this open!") return FALSE //Just stop. Do nothing. Don't turn into an invisible sprite. Don't open like a locker. - //The large crate has no non-attack interactions other than the crowbar, anyway. \ No newline at end of file + //The large crate has no non-attack interactions other than the crowbar, anyway. diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm index e5356b613ee36..08664dd08c521 100644 --- a/code/game/objects/structures/crates_lockers/crates/secure.dm +++ b/code/game/objects/structures/crates_lockers/crates/secure.dm @@ -1,12 +1,14 @@ /obj/structure/closet/crate/secure desc = "A secure crate." name = "secure crate" - icon_state = "securecrate" + icon_state = "secure_crate" secure = TRUE locked = TRUE max_integrity = 500 - armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "stamina" = 0) var/tamperproof = 0 + icon_door = "crate" + icon_door_override = TRUE /obj/structure/closet/crate/secure/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == "melee" && damage_amount < 25) @@ -41,43 +43,55 @@ /obj/structure/closet/crate/secure/weapon desc = "A secure weapons crate." name = "weapons crate" - icon_state = "weaponcrate" + icon_state = "weapon_crate" + icon_door = null + icon_door_override = FALSE /obj/structure/closet/crate/secure/plasma desc = "A secure plasma crate." name = "plasma crate" - icon_state = "plasmacrate" + icon_state = "plasma_crate" + icon_door = null + icon_door_override = FALSE /obj/structure/closet/crate/secure/gear desc = "A secure gear crate." name = "gear crate" - icon_state = "secgearcrate" + icon_state = "secgear_crate" + icon_door = null + icon_door_override = FALSE /obj/structure/closet/crate/secure/hydroponics desc = "A crate with a lock on it, painted in the scheme of the station's botanists." name = "secure hydroponics crate" - icon_state = "hydrosecurecrate" + icon_state = "hydro_secure_crate" + icon_door = null + icon_door_override = FALSE /obj/structure/closet/crate/secure/engineering desc = "A crate with a lock on it, painted in the scheme of the station's engineers." name = "secure engineering crate" icon_state = "engi_secure_crate" + icon_door = "engi_crate" /obj/structure/closet/crate/secure/science name = "secure science crate" desc = "A crate with a lock on it, painted in the scheme of the station's scientists." - icon_state = "scisecurecrate" + icon_state = "sci_secure_crate" + icon_door = "sci_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" + icon_state = "private_crate" + icon_door = null + icon_door_override = FALSE var/datum/bank_account/buyer_account var/privacy_lock = TRUE /obj/structure/closet/crate/secure/owned/examine(mob/user) . = ..() - . += "It's locked with a privacy lock, and can only be unlocked by the buyer's ID." + . += "It's locked with a privacy lock, and can only be unlocked by the buyer's ID with required access." /obj/structure/closet/crate/secure/owned/Initialize(mapload, datum/bank_account/_buyer_account) . = ..() @@ -90,13 +104,16 @@ 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() + if(allowed(user)) + 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, "Access Denied, insufficient access on ID card.") else if(!silent) to_chat(user, "Bank account does not match with buyer!") else if(!silent) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 5d136c4c99cad..9c908942ca223 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -1,22 +1,25 @@ /obj/structure/displaycase name = "display case" icon = 'icons/obj/stationobjs.dmi' - icon_state = "glassbox0" + icon_state = "glassbox" desc = "A display case for prized possessions." density = TRUE anchored = TRUE resistance_flags = ACID_PROOF - armor = list("melee" = 30, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100) + armor = list("melee" = 30, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100, "stamina" = 0) max_integrity = 200 - integrity_failure = 50 + integrity_failure = 25 var/obj/item/showpiece = null + var/obj/item/showpiece_type = null //This allows for showpieces that can only hold items if they're the same istype as this. var/alert = TRUE var/open = FALSE var/openable = TRUE + var/custom_glass_overlay = FALSE ///If we have a custom glass overlay to use. var/obj/item/electronics/airlock/electronics var/start_showpiece_type = null //add type for items on display var/list/start_showpieces = list() //Takes sublists in the form of list("type" = /obj/item/bikehorn, "trophy_message" = "henk") var/trophy_message = "" + var/glass_fix = TRUE /obj/structure/displaycase/Initialize() . = ..() @@ -30,11 +33,22 @@ showpiece = new start_showpiece_type (src) update_icon() +/obj/structure/displaycase/vv_edit_var(vname, vval) + . = ..() + if(vname in list(NAMEOF(src, open), NAMEOF(src, showpiece), NAMEOF(src, custom_glass_overlay))) + update_icon() + +/obj/structure/displaycase/handle_atom_del(atom/A) + if(A == electronics) + electronics = null + if(A == showpiece) + showpiece = null + update_icon() + return ..() + /obj/structure/displaycase/Destroy() - if(electronics) - QDEL_NULL(electronics) - if(showpiece) - QDEL_NULL(showpiece) + QDEL_NULL(electronics) + QDEL_NULL(showpiece) return ..() /obj/structure/displaycase/examine(mob/user) @@ -42,61 +56,63 @@ if(alert) . += "Hooked up with an anti-theft system." if(showpiece) - . += "There's [showpiece] inside." + . += "There's \a [showpiece] inside." if(trophy_message) . += "The plaque reads:\n [trophy_message]" /obj/structure/displaycase/proc/dump() - if (showpiece) - showpiece.forceMove(loc) - showpiece = null + if(QDELETED(showpiece)) + return + showpiece.forceMove(drop_location()) + showpiece = null + update_icon() /obj/structure/displaycase/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) if(BRUTE) - playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1) + playsound(src, 'sound/effects/glasshit.ogg', 75, 1) if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, 1) + playsound(src, 'sound/items/welder.ogg', 100, 1) /obj/structure/displaycase/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) dump() if(!disassembled) - new /obj/item/shard( src.loc ) + new /obj/item/shard(drop_location()) trigger_alarm() qdel(src) /obj/structure/displaycase/obj_break(damage_flag) if(!broken && !(flags_1 & NODECONSTRUCT_1)) density = FALSE - broken = 1 - new /obj/item/shard( src.loc ) - playsound(src, "shatter", 70, 1) + broken = TRUE + new /obj/item/shard(drop_location()) + playsound(src, "shatter", 70, TRUE) update_icon() trigger_alarm() +///Anti-theft alarm triggered when broken. /obj/structure/displaycase/proc/trigger_alarm() - //Activate Anti-theft - if(alert) - var/area/alarmed = get_area(src) - alarmed.burglaralert(src) - playsound(src, 'sound/effects/alert.ogg', 50, 1) - -/obj/structure/displaycase/update_icon() - var/icon/I - if(open) - I = icon('icons/obj/stationobjs.dmi',"glassbox_open") - else - I = icon('icons/obj/stationobjs.dmi',"glassbox0") - if(broken) - I = icon('icons/obj/stationobjs.dmi',"glassboxb0") + if(!alert) + return + var/area/alarmed = get_area(src) + alarmed.burglaralert(src) + playsound(src, 'sound/effects/alert.ogg', 50, TRUE) + +/obj/structure/displaycase/update_overlays() + . = ..() if(showpiece) - var/icon/S = getFlatIcon(showpiece) - S.Scale(17,17) - I.Blend(S,ICON_UNDERLAY,8,8) - src.icon = I - return + var/mutable_appearance/showpiece_overlay = mutable_appearance(showpiece.icon, showpiece.icon_state) + showpiece_overlay.copy_overlays(showpiece) + showpiece_overlay.transform *= 0.6 + . += showpiece_overlay + if(custom_glass_overlay) + return + if(broken) + . += "[initial(icon_state)]_broken" + else if(!open) + . += "[initial(icon_state)]_closed" /obj/structure/displaycase/attackby(obj/item/W, mob/user, params) if(W.GetID() && !broken && openable) @@ -104,13 +120,13 @@ to_chat(user, "You [open ? "close":"open"] [src].") toggle_lock(user) else - to_chat(user, "Access denied.") + to_chat(user, "Access denied.") else if(W.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP && !broken) if(obj_integrity < max_integrity) if(!W.tool_start_check(user, amount=5)) return - to_chat(user, "You begin repairing [src].") + to_chat(user, "You begin repairing [src]...") if(W.use_tool(src, user, 40, amount=5, volume=50)) obj_integrity = max_integrity update_icon() @@ -121,21 +137,24 @@ else if(!alert && W.tool_behaviour == TOOL_CROWBAR && openable) //Only applies to the lab cage and player made display cases if(broken) if(showpiece) - to_chat(user, "Remove the displayed object first.") + to_chat(user, "Remove the displayed object first!") else - to_chat(user, "You remove the destroyed case") + to_chat(user, "You remove the destroyed case.") qdel(src) else - to_chat(user, "You start to [open ? "close":"open"] [src].") + to_chat(user, "You start to [open ? "close":"open"] [src]...") if(W.use_tool(src, user, 20)) to_chat(user, "You [open ? "close":"open"] [src].") toggle_lock(user) else if(open && !showpiece) + if(showpiece_type && !istype(W, showpiece_type)) + to_chat(user, "This doesn't belong in this kind of display.") + return TRUE if(user.transferItemToLoc(W, src)) showpiece = W - to_chat(user, "You put [W] on display") + to_chat(user, "You put [W] on display.") update_icon() - else if(istype(W, /obj/item/stack/sheet/glass) && broken) + else if(glass_fix && broken && istype(W, /obj/item/stack/sheet/glass)) var/obj/item/stack/sheet/glass/G = W if(G.get_amount() < 2) to_chat(user, "You need two glass sheets to fix the case!") @@ -143,7 +162,7 @@ to_chat(user, "You start fixing [src]...") if(do_after(user, 20, target = src)) G.use(2) - broken = 0 + broken = FALSE obj_integrity = max_integrity update_icon() else @@ -165,13 +184,15 @@ to_chat(user, "You deactivate the hover field built into the case.") log_combat(user, src, "deactivates the hover field of") dump() - src.add_fingerprint(user) - update_icon() + add_fingerprint(user) return else //prevents remote "kicks" with TK if (!Adjacent(user)) return + if (user.a_intent == INTENT_HELP) + user.examinate(src) + return user.visible_message("[user] kicks the display case.", null, null, COMBAT_MESSAGE_RANGE) log_combat(user, src, "kicks") user.do_attack_animation(src, ATTACK_EFFECT_KICK) @@ -203,6 +224,21 @@ electronics = I to_chat(user, "You install the airlock electronics.") + else if(istype(I, /obj/item/stock_parts/manipulator)) + var/obj/item/stock_parts/manipulator/M = I + to_chat(user, "You start adding [M] to [src]...") + if(do_after(user, 20, target = src)) + var/obj/structure/displaycase/forsale/sale = new(src.loc) + if(electronics) + electronics.forceMove(sale) + sale.electronics = electronics + if(electronics.one_access) + sale.req_one_access = electronics.accesses + else + sale.req_access = electronics.accesses + qdel(src) + qdel(M) + else if(istype(I, /obj/item/stack/sheet/glass)) var/obj/item/stack/sheet/glass/G = I if(G.get_amount() < 10) @@ -242,8 +278,6 @@ var/placer_key = "" var/added_roundstart = TRUE var/is_locked = TRUE - - alert = TRUE integrity_failure = 0 openable = FALSE @@ -255,45 +289,47 @@ GLOB.trophy_cases -= src return ..() -/obj/structure/displaycase/trophy/attackby(obj/item/W, mob/user, params) +/obj/structure/displaycase/trophy/attackby(obj/item/W, mob/living/user, params) if(!user.Adjacent(src)) //no TK museology return if(user.a_intent == INTENT_HARM) return ..() + if(W.tool_behaviour == TOOL_WELDER && !broken) + return ..() if(user.is_holding_item_of_type(/obj/item/key/displaycase)) if(added_roundstart) is_locked = !is_locked - to_chat(user, "You [!is_locked ? "un" : ""]lock the case.") + to_chat(user, "You [!is_locked ? "un" : ""]lock the case.") else - to_chat(user, "The lock is stuck shut!") + to_chat(user, "The lock is stuck shut!") return if(is_locked) - to_chat(user, "The case is shut tight with an old fashioned physical lock. Maybe you should ask the curator for the key?") + to_chat(user, "The case is shut tight with an old-fashioned physical lock. Maybe you should ask the curator for the key?") return if(!added_roundstart) - to_chat(user, "You've already put something new in this case.") + to_chat(user, "You've already put something new in this case!") return if(is_type_in_typecache(W, GLOB.blacklisted_cargo_types)) - to_chat(user, "The case rejects the [W].") + to_chat(user, "The case rejects the [W]!") return for(var/a in W.GetAllContents()) if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types)) - to_chat(user, "The case rejects the [W].") + to_chat(user, "The case rejects the [W]!") return if(user.transferItemToLoc(W, src)) if(showpiece) - to_chat(user, "You press a button, and [showpiece] descends into the floor of the case.") + to_chat(user, "You press a button, and [showpiece] descends into the floor of the case.") QDEL_NULL(showpiece) - to_chat(user, "You insert [W] into the case.") + to_chat(user, "You insert [W] into the case.") showpiece = W added_roundstart = FALSE update_icon() @@ -306,9 +342,9 @@ if(chosen_plaque) if(user.Adjacent(src)) trophy_message = chosen_plaque - to_chat(user, "You set the plaque's text.") + to_chat(user, "You set the plaque's text.") else - to_chat(user, "You are too far to set the plaque's text.") + to_chat(user, "You are too far to set the plaque's text!") SSpersistence.SaveTrophy(src) return TRUE @@ -325,7 +361,7 @@ new /obj/effect/decal/cleanable/ash(loc) QDEL_NULL(showpiece) else - ..() + return ..() /obj/item/key/displaycase name = "display case key" @@ -340,3 +376,209 @@ name = initial(I.name) icon = initial(I.icon) icon_state = initial(I.icon_state) + +/obj/structure/displaycase/forsale + name = "vend-a-tray" + icon_state = "laserbox" + custom_glass_overlay = TRUE + desc = "A display case with an ID-card swiper. Use your ID to purchase the contents." + density = FALSE + max_integrity = 100 + req_access = null + alert = FALSE //No, we're not calling the fire department because someone stole your cookie. + glass_fix = FALSE //Fixable with tools instead. + pass_flags = PASSTABLE ///Can be placed and moved onto a table. + ///The price of the item being sold. Altered by grab intent ID use. + var/sale_price = 20 + ///The Account which will receive payment for purchases. Set by the first ID to swipe the tray. + var/datum/bank_account/payments_acc = null + +/obj/structure/displaycase/forsale/update_icon_state() + icon_state = "[initial(icon_state)][broken ? "_broken" : (open ? "_open" : (!showpiece ? "_empty" : null))]" + return ..() + +/obj/structure/displaycase/forsale/update_overlays() + . = ..() + if(!broken && !open) + . += "[initial(icon_state)]_overlay" + +/obj/structure/displaycase/forsale/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Vendatray", name) + ui.set_autoupdate(FALSE) + ui.open() + +/obj/structure/displaycase/forsale/ui_data(mob/user) + var/list/data = list() + var/register = FALSE + data["owner_name"] = null + if(payments_acc) + register = TRUE + data["owner_name"] = payments_acc.account_holder + data["product_name"] = null + data["product_icon"] = null + if(showpiece) + data["product_name"] = capitalize(showpiece.name) + var/base64 = icon2base64(icon(showpiece.icon, showpiece.icon_state)) + data["product_icon"] = base64 + data["registered"] = register + data["product_cost"] = sale_price + data["tray_open"] = open + return data + +/obj/structure/displaycase/forsale/ui_act(action, params) + . = ..() + if(.) + return + var/obj/item/card/id/potential_acc + if(isliving(usr)) + var/mob/living/L = usr + potential_acc = L.get_idcard(hand_first = TRUE) + switch(action) + if("Buy") + if(!showpiece) + to_chat(usr, "There's nothing for sale.") + return + if(broken) + to_chat(usr, "[src] appears to be broken.") + return + if(!payments_acc) + to_chat(usr, "[src] hasn't been registered yet.") + return + if(!usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + if(!potential_acc) + to_chat(usr, "No ID card detected.") + return + var/datum/bank_account/account = potential_acc.registered_account + if(!account) + to_chat(usr, "[potential_acc] has no account registered!") + return + if(!account.has_money(sale_price)) + to_chat(usr, "You do not possess the funds to purchase this.") + return + else + account.adjust_money(-sale_price) + if(payments_acc) + payments_acc.adjust_money(sale_price) + usr.put_in_hands(showpiece) + to_chat(usr, "You purchase [showpiece] for [sale_price] credits.") + playsound(src, 'sound/effects/cashregister.ogg', 40, TRUE) + flick("[initial(icon_state)]_vend", src) + showpiece = null + update_icon() + . = TRUE + if("Open") + if(!payments_acc) + to_chat(usr, "[src] hasn't been registered yet.") + return + if(!potential_acc || !potential_acc.registered_account) + return + if(!check_access(potential_acc)) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + return + toggle_lock() + . = TRUE + if("Register") + if(payments_acc) + return + if(!potential_acc || !potential_acc.registered_account) + return + if(!check_access(potential_acc)) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + return + payments_acc = potential_acc.registered_account + playsound(src, 'sound/machines/click.ogg', 20, TRUE) + . = TRUE + if("Adjust") + if(!check_access(potential_acc) || potential_acc.registered_account != payments_acc) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + return + + var/new_price_input = input(usr,"Set the sale price for this vend-a-tray.","new price",0) as num|null + if(isnull(new_price_input) || (payments_acc != potential_acc.registered_account)) + to_chat(usr, "[src] rejects your new price.") + return + if(!usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK) ) + to_chat(usr, "You need to get closer!") + return + new_price_input = clamp(round(new_price_input, 1), 10, 1000) + sale_price = new_price_input + to_chat(usr, "The cost is now set to [sale_price].") + . = TRUE + +/obj/structure/displaycase/forsale/attackby(obj/item/I, mob/living/user, params) + if(isidcard(I)) + //Card Registration + var/obj/item/card/id/potential_acc = I + if(!potential_acc.registered_account) + to_chat(user, "This ID card has no account registered!") + return + if(payments_acc == potential_acc.registered_account) + playsound(src, 'sound/machines/click.ogg', 20, TRUE) + toggle_lock() + return + if(istype(I, /obj/item/pda)) + return TRUE + ui_update() + . = ..() + + +/obj/structure/displaycase/forsale/multitool_act(mob/living/user, obj/item/I) + . = ..() + if(obj_integrity <= (integrity_failure * max_integrity)) + to_chat(user, "You start recalibrating [src]'s hover field...") + if(do_after(user, 20, target = src)) + broken = FALSE + obj_integrity = max_integrity + update_icon() + ui_update() + return TRUE + +/obj/structure/displaycase/forsale/wrench_act(mob/living/user, obj/item/I) + . = ..() + if(open && user.a_intent == INTENT_HELP ) + if(anchored) + to_chat(user, "You start unsecuring [src]...") + else + to_chat(user, "You start securing [src]...") + if(I.use_tool(src, user, 16, volume=50)) + if(QDELETED(I)) + return + if(anchored) + to_chat(user, "You unsecure [src].") + else + to_chat(user, "You secure [src].") + anchored = !anchored + return TRUE + else if(!open && user.a_intent == INTENT_HELP) + to_chat(user, "[src] must be open to move it.") + return + +/obj/structure/displaycase/forsale/emag_act(mob/user) + . = ..() + payments_acc = null + req_access = list() + to_chat(user, "[src]'s card reader fizzles and smokes, and the account owner is reset.") + ui_update() + +/obj/structure/displaycase/forsale/examine(mob/user) + . = ..() + if(showpiece && !open) + . += "[showpiece] is for sale for [sale_price] credits." + if(broken) + . += "[src] is sparking and the hover field generator seems to be overloaded. Use a multitool to fix it." + +/obj/structure/displaycase/forsale/obj_break(damage_flag) + . = ..() + if(!broken && !(flags_1 & NODECONSTRUCT_1)) + broken = TRUE + playsound(src, "shatter", 70, TRUE) + update_icon() + trigger_alarm() //In case it's given an alarm anyway. + ui_update() + +/obj/structure/displaycase/forsale/kitchen + desc = "A display case with an ID-card swiper. Use your ID to purchase the contents. Meant for the bartender and chef." + req_one_access = list(ACCESS_KITCHEN, ACCESS_BAR) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 2bbc951efb4fa..e4f9c5b4b3226 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -161,6 +161,31 @@ name = "near finished airlock assembly" electronics = W + else if(istype(W, /obj/item/electroadaptive_pseudocircuit) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) + var/obj/item/electroadaptive_pseudocircuit/EP = W + if(EP.adapt_circuit(user, 25)) + var/obj/item/electronics/airlock/AE = new(src) + AE.accesses = EP.electronics.accesses + AE.one_access = EP.electronics.one_access + AE.unres_sides = EP.electronics.unres_sides + AE.play_tool_sound(src, 100) + user.visible_message("[user] installs the electronics into the airlock assembly.", \ + "You start to install electronics into the airlock assembly...") + if(do_after(user, 40, target = src)) + if( state != AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) + qdel(AE) + return + if(!user.transferItemToLoc(AE, src)) + qdel(AE) + return + + to_chat(user, "You install the electroadaptive pseudocircuit.") + state = AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER + name = "near finished airlock assembly" + electronics = AE + else + qdel(AE) + else if((W.tool_behaviour == TOOL_CROWBAR) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) user.visible_message("[user] removes the electronics from the airlock assembly.", \ diff --git a/code/game/objects/structures/door_assembly_types.dm b/code/game/objects/structures/door_assembly_types.dm index a5457d016e647..bf21f60df61f4 100644 --- a/code/game/objects/structures/door_assembly_types.dm +++ b/code/game/objects/structures/door_assembly_types.dm @@ -248,3 +248,15 @@ airlock_type = /obj/machinery/door/airlock/wood mineral = "wood" glass_type = /obj/machinery/door/airlock/wood/glass + +/obj/structure/door_assembly/door_assembly_bronze + name = "bronze airlock assembly" + icon = 'icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi' + base_name = "bronze airlock" + airlock_type = /obj/machinery/door/airlock/bronze + noglass = TRUE + material_type = /obj/item/stack/tile/bronze + +/obj/structure/door_assembly/door_assembly_bronze/seethru + name = "bronze pinion airlock assembly" + airlock_type = /obj/machinery/door/airlock/bronze/seethru diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index b5e618cc1f5ed..517b8cbaeb856 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -7,6 +7,7 @@ density = FALSE max_integrity = 200 integrity_failure = 50 + layer = ABOVE_WINDOW_LAYER var/obj/item/extinguisher/stored_extinguisher var/opened = FALSE @@ -33,7 +34,13 @@ /obj/structure/extinguisher_cabinet/contents_explosion(severity, target) if(stored_extinguisher) - stored_extinguisher.ex_act(severity, target) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += stored_extinguisher + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += stored_extinguisher + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += stored_extinguisher /obj/structure/extinguisher_cabinet/handle_atom_del(atom/A) if(A == stored_extinguisher) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index b11e7a5d128da..dfdd08b7b3384 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -189,7 +189,7 @@ if(world.time > last_event+15) active = 1 radiation_pulse(src, 150) - for(var/turf/closed/wall/mineral/uranium/T in orange(1,src)) + for(var/turf/closed/wall/mineral/uranium/T in (RANGE_TURFS(1,src)-src)) T.radiate() last_event = world.time active = null diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index cbcc871d27408..9bec725ad2896 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -5,12 +5,13 @@ icon_state = "fireaxe" anchored = TRUE density = FALSE - armor = list("melee" = 50, "bullet" = 20, "laser" = 0, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50) + armor = list("melee" = 50, "bullet" = 20, "laser" = 0, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50, "stamina" = 0) max_integrity = 150 integrity_failure = 50 + layer = ABOVE_WINDOW_LAYER var/locked = TRUE var/open = FALSE - var/obj/item/twohanded/fireaxe/fireaxe + var/obj/item/fireaxe/fireaxe /obj/structure/fireaxecabinet/Initialize() . = ..() @@ -49,9 +50,9 @@ obj_integrity = max_integrity update_icon() else if(open || broken) - if(istype(I, /obj/item/twohanded/fireaxe) && !fireaxe) - var/obj/item/twohanded/fireaxe/F = I - if(F.wielded) + if(istype(I, /obj/item/fireaxe) && !fireaxe) + var/obj/item/fireaxe/F = I + if(F && ISWIELDED(F)) to_chat(user, "Unwield the [F.name] first.") return if(!user.transferItemToLoc(F, src)) diff --git a/code/game/objects/structures/fireplace.dm b/code/game/objects/structures/fireplace.dm index 2735bd7e81ac1..5b85b27cf8405 100644 --- a/code/game/objects/structures/fireplace.dm +++ b/code/game/objects/structures/fireplace.dm @@ -102,7 +102,7 @@ if(2000 to MAXIMUM_BURN_TIMER) set_light(6) -/obj/structure/fireplace/process() +/obj/structure/fireplace/process(delta_time) if(!lit) return if(world.time > flame_expiry_timer) @@ -111,7 +111,7 @@ playsound(src, 'sound/effects/comfyfire.ogg',50,0, 0, 1) var/turf/T = get_turf(src) - T.hotspot_expose(700, 5) + T.hotspot_expose(700, 2.5 * delta_time) update_icon() adjust_light() diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index e68173928ab44..c84f0a1b3109f 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -14,7 +14,7 @@ /obj/structure/flora/tree/attackby(obj/item/W, mob/user, params) if(log_amount && (!(flags_1 & NODECONSTRUCT_1))) - if(W.sharpness && W.force > 0) + if(W.is_sharp() && W.force > 0) if(W.hitsound) playsound(get_turf(src), W.hitsound, 100, 0, 0) user.visible_message("[user] begins to cut down [src] with [W].","You begin to cut down [src] with [W].", "You hear the sound of sawing.") @@ -301,7 +301,7 @@ icon_state = "fullgrass_[rand(1, 3)]" . = ..() -/obj/item/twohanded/required/kirbyplants +/obj/item/kirbyplants name = "potted plant" icon = 'icons/obj/flora/plants.dmi' icon_state = "plant-01" @@ -310,13 +310,13 @@ w_class = WEIGHT_CLASS_HUGE force = 10 attack_weight = 2 - force_wielded = 10 throwforce = 13 throw_speed = 2 throw_range = 4 -/obj/item/twohanded/required/kirbyplants/Initialize() +/obj/item/kirbyplants/ComponentInitialize() . = ..() + AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_unwielded=10, force_wielded=10) AddComponent(/datum/component/storage/concrete/kirbyplants) /datum/component/storage/concrete/kirbyplants @@ -324,7 +324,7 @@ max_w_class = WEIGHT_CLASS_NORMAL insert_while_closed = FALSE // We don't want clicking plants with items to insert it, you have to alt click then click the slots -/obj/item/twohanded/required/kirbyplants/equipped(mob/living/user) +/obj/item/kirbyplants/equipped(mob/living/user) var/image/I = image(icon = 'icons/obj/flora/plants.dmi' , icon_state = src.icon_state, loc = user) I.copy_overlays(src) I.override = 1 @@ -332,23 +332,23 @@ I.layer = ABOVE_MOB_LAYER ..() -/obj/item/twohanded/required/kirbyplants/dropped(mob/living/user) +/obj/item/kirbyplants/dropped(mob/living/user) ..() user.remove_alt_appearance("sneaking_mission") -/obj/item/twohanded/required/kirbyplants/random +/obj/item/kirbyplants/random icon = 'icons/obj/flora/_flora.dmi' icon_state = "random_plant" var/list/static/states -/obj/item/twohanded/required/kirbyplants/random/Initialize() +/obj/item/kirbyplants/random/Initialize() . = ..() icon = 'icons/obj/flora/plants.dmi' if(!states) generate_states() icon_state = pick(states) -/obj/item/twohanded/required/kirbyplants/random/proc/generate_states() +/obj/item/kirbyplants/random/proc/generate_states() states = list() for(var/i in 1 to 34) var/number @@ -360,12 +360,12 @@ states += "applebush" -/obj/item/twohanded/required/kirbyplants/dead +/obj/item/kirbyplants/dead name = "RD's potted plant" desc = "A gift from the botanical staff, presented after the RD's reassignment. There's a tag on it that says \"Y'all come back now, y'hear?\"\nIt doesn't look very healthy..." icon_state = "plant-25" -/obj/item/twohanded/required/kirbyplants/photosynthetic +/obj/item/kirbyplants/photosynthetic name = "photosynthetic potted plant" desc = "A bioluminescent plant." icon_state = "plant-09" @@ -390,6 +390,7 @@ /obj/structure/flora/rock/pile icon_state = "lavarocks" desc = "A pile of rocks." + density = FALSE //Jungle grass diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 4b1294e154a40..6751c3dab091e 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -31,12 +31,13 @@ add_fingerprint(user) if(istype(W, /obj/item/gun/energy/plasmacutter)) - to_chat(user, "You start slicing apart the girder...") + balloon_alert(user, "You start slicing apart the girder") if(W.use_tool(src, user, 40, volume=100)) - to_chat(user, "You slice apart the girder.") + balloon_alert(user, "Girder sliced apart") var/obj/item/stack/sheet/iron/M = new (loc, 2) M.add_fingerprint(user) qdel(src) + return else if(istype(W, /obj/item/pickaxe/drill/jackhammer)) to_chat(user, "You smash through the girder!") @@ -47,13 +48,13 @@ else if(istype(W, /obj/item/stack)) if(iswallturf(loc)) - to_chat(user, "There is already a wall present!") + balloon_alert(user, "Wall already present") return if(!isfloorturf(src.loc)) - to_chat(user, "A floor must be present to build a false wall!") + balloon_alert(user, "Floor is missing") return if (locate(/obj/structure/falsewall) in src.loc.contents) - to_chat(user, "There is already a false wall present!") + balloon_alert(user, "There already is a false wall") return if(istype(W, /obj/item/stack/rods)) @@ -62,25 +63,26 @@ if(S.get_amount() < 2) 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...") + balloon_alert(user, "You start building a reinforced false wall") if(do_after(user, 20, target = src)) if(S.get_amount() < 2) return S.use(2) - to_chat(user, "You create a false wall. Push on it to open or close the passage.") + balloon_alert(user, "False wall created") var/obj/structure/falsewall/iron/FW = new (loc) transfer_fingerprints_to(FW) qdel(src) + return else if(S.get_amount() < 5) to_chat(user, "You need at least five rods to add plating!") return - to_chat(user, "You start adding plating...") + balloon_alert(user, "You start adding plating") if(do_after(user, 40, target = src)) if(S.get_amount() < 5) return S.use(5) - to_chat(user, "You add the plating.") + balloon_alert(user, "Plating added") var/turf/T = get_turf(src) T.PlaceOnTop(/turf/closed/wall/mineral/iron) transfer_fingerprints_to(T) @@ -96,25 +98,26 @@ if(S.get_amount() < 2) to_chat(user, "You need two sheets of iron to create a false wall!") return - to_chat(user, "You start building a false wall...") + balloon_alert(user, "You start building false wall") if(do_after(user, 20, target = src)) if(S.get_amount() < 2) return S.use(2) - to_chat(user, "You create a false wall. Push on it to open or close the passage.") + balloon_alert(user, "False wall created") var/obj/structure/falsewall/F = new (loc) transfer_fingerprints_to(F) qdel(src) + return else if(S.get_amount() < 2) to_chat(user, "You need two sheets of iron to finish a wall!") return - to_chat(user, "You start adding plating...") + balloon_alert(user, "You start adding plating") if (do_after(user, 40, target = src)) if(S.get_amount() < 2) return S.use(2) - to_chat(user, "You add the plating.") + balloon_alert(user, "Plating alert") var/turf/T = get_turf(src) T.PlaceOnTop(/turf/closed/wall) transfer_fingerprints_to(T) @@ -126,25 +129,26 @@ if(S.get_amount() < 2) 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...") + balloon_alert(user, "You start building reinforced false wall") if(do_after(user, 20, target = src)) if(S.get_amount() < 2) return S.use(2) - to_chat(user, "You create a reinforced false wall. Push on it to open or close the passage.") + balloon_alert(user, "Reinforced false wall created") var/obj/structure/falsewall/reinforced/FW = new (loc) transfer_fingerprints_to(FW) qdel(src) + return else if(state == GIRDER_REINF) if(S.get_amount() < 1) return - to_chat(user, "You start finalizing the reinforced wall...") + balloon_alert(user, "You start finilizing reinforced wall") if(do_after(user, 50, target = src)) if(S.get_amount() < 1) return S.use(1) - to_chat(user, "You fully reinforce the wall.") + balloon_alert(user, "Wall fully reinforced") var/turf/T = get_turf(src) T.PlaceOnTop(/turf/closed/wall/r_wall) transfer_fingerprints_to(T) @@ -153,12 +157,12 @@ else if(S.get_amount() < 1) return - to_chat(user, "You start reinforcing the girder...") + balloon_alert(user, "You start reinforcing girder") if(do_after(user, 60, target = src)) if(S.get_amount() < 1) return S.use(1) - to_chat(user, "You reinforce the girder.") + balloon_alert(user, "Girder reinforced") var/obj/structure/girder/reinforced/R = new (loc) transfer_fingerprints_to(R) qdel(src) @@ -174,21 +178,22 @@ if(S.get_amount() < 2) return S.use(2) - to_chat(user, "You create a false wall. Push on it to open or close the passage.") + balloon_alert(user, "False wall created") var/F = text2path("/obj/structure/falsewall/[M]") var/obj/structure/FW = new F (loc) transfer_fingerprints_to(FW) qdel(src) + return else if(S.get_amount() < 2) to_chat(user, "You need at least two sheets to add plating!") return - to_chat(user, "You start adding plating...") + balloon_alert(user, "You start adding plating") if (do_after(user, 40, target = src)) if(S.get_amount() < 2) return S.use(2) - to_chat(user, "You add the plating.") + balloon_alert(user, "Plating added") var/turf/T = get_turf(src) T.PlaceOnTop(text2path("/turf/closed/wall/mineral/[M]")) transfer_fingerprints_to(T) @@ -202,7 +207,7 @@ if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds. if(!user.transferItemToLoc(P, drop_location())) return - to_chat(user, "You fit the pipe into \the [src].") + balloon_alert(user, "You fit the pipe into [src]") else return ..() @@ -220,27 +225,27 @@ if(state != GIRDER_DISPLACED) return state = GIRDER_DISASSEMBLED - to_chat(user, "You disassemble the girder.") + balloon_alert(user, "Girder disassembled") var/obj/item/stack/sheet/iron/M = new (loc, 2) M.add_fingerprint(user) qdel(src) return TRUE else if(state == GIRDER_REINF) - to_chat(user, "You start unsecuring support struts...") + balloon_alert(user, "You start unsecuring support struts") if(tool.use_tool(src, user, 40, volume=100)) if(state != GIRDER_REINF) return - to_chat(user, "You unsecure the support struts.") + balloon_alert(user, "Support struts unsecured") state = GIRDER_REINF_STRUTS return TRUE else if(state == GIRDER_REINF_STRUTS) - to_chat(user, "You start securing support struts...") + balloon_alert(user, "You start securing support struts") if(tool.use_tool(src, user, 40, volume=100)) if(state != GIRDER_REINF_STRUTS) return - to_chat(user, "You secure the support struts.") + balloon_alert(user, "Support struts secured") state = GIRDER_REINF return TRUE @@ -248,9 +253,9 @@ /obj/structure/girder/wirecutter_act(mob/user, obj/item/tool) . = FALSE if(state == GIRDER_REINF_STRUTS) - to_chat(user, "You start removing the inner grille...") + balloon_alert(user, "You start removing the inner grille") if(tool.use_tool(src, user, 40, volume=100)) - to_chat(user, "You remove the inner grille.") + balloon_alert(user, "Inner grille removed") new /obj/item/stack/sheet/plasteel(get_turf(src)) var/obj/structure/girder/G = new (loc) transfer_fingerprints_to(G) @@ -261,19 +266,19 @@ . = FALSE if(state == GIRDER_DISPLACED) if(!isfloorturf(loc)) - to_chat(user, "A floor must be present to secure the girder!") + balloon_alert(user, "Floor is missing") - to_chat(user, "You start securing the girder...") + balloon_alert(user, "You start securing girder") if(tool.use_tool(src, user, 40, volume=100)) - to_chat(user, "You secure the girder.") + balloon_alert(user, "Girder secured") var/obj/structure/girder/G = new (loc) transfer_fingerprints_to(G) qdel(src) return TRUE else if(state == GIRDER_NORMAL && can_displace) - to_chat(user, "You start unsecuring the girder...") + balloon_alert(user, "You start unsecuring girder") if(tool.use_tool(src, user, 40, volume=100)) - to_chat(user, "You unsecure the girder.") + balloon_alert(user, "Girder unsecured") var/obj/structure/girder/displaced/D = new (loc) transfer_fingerprints_to(D) qdel(src) @@ -288,11 +293,10 @@ else return 0 -/obj/structure/girder/CanAStarPass(ID, dir, caller) +/obj/structure/girder/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) . = !density - if(ismovableatom(caller)) - var/atom/movable/mover = caller - . = . || (mover.pass_flags & PASSGRILLE) + if(istype(caller)) + . = . || (caller.pass_flags & PASSGRILLE) /obj/structure/girder/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) @@ -341,9 +345,9 @@ if(!W.tool_start_check(user, amount=0)) return - to_chat(user, "You start slicing apart the girder...") + balloon_alert(user, "You start slicing apart the girder") if(W.use_tool(src, user, 40, volume=50)) - to_chat(user, "You slice apart the girder.") + balloon_alert(user, "Girder sliced apart") var/obj/item/stack/sheet/runed_metal/R = new(drop_location(), 1) transfer_fingerprints_to(R) qdel(src) @@ -393,12 +397,12 @@ var/turf/T = get_turf(src) switch(passed_mode) if(RCD_FLOORWALL) - to_chat(user, "You finish a wall.") + balloon_alert(user, "Wall finished") T.PlaceOnTop(/turf/closed/wall) qdel(src) return TRUE if(RCD_DECONSTRUCT) - to_chat(user, "You deconstruct the girder.") + balloon_alert(user, "Girder deconstructed") qdel(src) return TRUE return FALSE @@ -415,9 +419,9 @@ if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount = 0)) return - to_chat(user, "You start slicing apart [src]...") + balloon_alert(user, "You start slicing apart [src]") if(W.use_tool(src, user, 40, volume=50)) - to_chat(user, "You slice apart [src].") + balloon_alert(user, "[src] sliced apart") var/obj/item/stack/tile/bronze/B = new(drop_location(), 2) transfer_fingerprints_to(B) qdel(src) @@ -433,7 +437,7 @@ var/obj/item/stack/tile/bronze/B = W if(B.get_amount() < 2) to_chat(user, "You need at least two bronze sheets to build a bronze wall!") - return 0 + return FALSE user.visible_message("[user] begins plating [src] with bronze...", "You begin constructing a bronze wall...") if(do_after(user, 50, target = src)) if(B.get_amount() < 2) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 9c956e91e45d8..6dff64e594b5d 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -8,7 +8,7 @@ flags_1 = CONDUCT_1 pressure_resistance = 5*ONE_ATMOSPHERE layer = BELOW_OBJ_LAYER - armor = list("melee" = 50, "bullet" = 70, "laser" = 70, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0) + armor = list("melee" = 50, "bullet" = 70, "laser" = 70, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0, "stamina" = 0) max_integrity = 50 integrity_failure = 20 var/rods_type = /obj/item/stack/rods @@ -84,6 +84,8 @@ return var/mob/M = AM shock(M, 70) + if(prob(50)) + take_damage(1, BRUTE, "melee", FALSE) /obj/structure/grille/attack_animal(mob/user) . = ..() @@ -132,11 +134,10 @@ else return !density -/obj/structure/grille/CanAStarPass(ID, dir, caller) +/obj/structure/grille/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) . = !density - if(ismovableatom(caller)) - var/atom/movable/mover = caller - . = . || (mover.pass_flags & PASSGRILLE) + if(istype(caller)) + . = . || (caller.pass_flags & PASSGRILLE) /obj/structure/grille/attackby(obj/item/W, mob/user, params) user.changeNext_move(CLICK_CD_MELEE) diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm index e41715ddd06b0..4e793fa25ffb6 100644 --- a/code/game/objects/structures/guillotine.dm +++ b/code/game/objects/structures/guillotine.dm @@ -132,11 +132,9 @@ // 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)) - var/mob/living/carbon/human/C = M - if (ishuman(M)) - addtimer(CALLBACK(C, /mob/.proc/emote, "clap"), delay_offset * 0.3) - delay_offset++ + for(var/mob/living/carbon/human/C in viewers(7, src)) + addtimer(CALLBACK(C, /mob/.proc/emote, "clap"), delay_offset * 0.3) + delay_offset++ else H.apply_damage(15 * blade_sharpness, BRUTE, head) log_combat(user, H, "dropped the blade on", src, " non-fatally") @@ -176,7 +174,7 @@ else return ..() -/obj/structure/guillotine/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE) +/obj/structure/guillotine/buckle_mob(mob/living/M, mob/user, check_loc = TRUE) if (!anchored) to_chat(usr, "The [src] needs to be wrenched to the floor!") return FALSE @@ -189,7 +187,7 @@ to_chat(usr, "You need to raise the blade before buckling someone in!") return FALSE - return ..(M, force, FALSE) + return ..(M, user, FALSE) /obj/structure/guillotine/post_buckle_mob(mob/living/M) if (!istype(M, /mob/living/carbon/human)) diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm index 73bbe5087a11c..75d229e1ac167 100644 --- a/code/game/objects/structures/guncase.dm +++ b/code/game/objects/structures/guncase.dm @@ -95,9 +95,14 @@ update_icon() /obj/structure/guncase/contents_explosion(severity, target) - for(var/atom/A in contents) - A.ex_act(severity++, target) - CHECK_TICK + for(var/thing in contents) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += thing + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += thing + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += thing /obj/structure/guncase/shotgun name = "shotgun locker" diff --git a/code/game/objects/structures/headpike.dm b/code/game/objects/structures/headpike.dm index c7a3940336258..6217c306919a5 100644 --- a/code/game/objects/structures/headpike.dm +++ b/code/game/objects/structures/headpike.dm @@ -6,7 +6,7 @@ density = FALSE anchored = TRUE var/bonespear = FALSE - var/obj/item/twohanded/spear/spear + var/obj/item/spear/spear var/obj/item/bodypart/head/victim /obj/structure/headpike/bone //for bone spears @@ -19,9 +19,9 @@ name = "[victim.name] on a spear" update_icon() if(bonespear) - spear = locate(/obj/item/twohanded/bonespear) in parts_list + spear = locate(/obj/item/spear/bonespear) in parts_list else - spear = locate(/obj/item/twohanded/spear) in parts_list + spear = locate(/obj/item/spear) in parts_list /obj/structure/headpike/Initialize() . = ..() diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index f6979f5880834..77dcd60b70155 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -6,10 +6,13 @@ icon = 'icons/effects/effects.dmi' anchored = TRUE max_integrity = 1 - armor = list("melee" = 0, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20) + armor = list("melee" = 0, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20, "stamina" = 0) layer = BELOW_OBJ_LAYER var/obj/item/holosign_creator/projector +/obj/structure/holosign/emp_act(severity) + take_damage(max_integrity/severity, BRUTE, "melee", 1) + /obj/structure/holosign/New(loc, source_projector) if(source_projector) projector = source_projector @@ -96,8 +99,20 @@ /obj/structure/holosign/barrier/atmos/Initialize() . = ..() + var/turf/local = get_turf(loc) + ADD_TRAIT(local, TRAIT_FIREDOOR_STOP, TRAIT_GENERIC) air_update_turf(TRUE) +/obj/structure/holosign/barrier/atmos/Destroy() + var/turf/local = get_turf(loc) + REMOVE_TRAIT(local, TRAIT_FIREDOOR_STOP, TRAIT_GENERIC) + return ..() + +/obj/structure/holosign/barrier/atmos/Move(atom/newloc, direct) + var/turf/local = get_turf(loc) + REMOVE_TRAIT(local, TRAIT_FIREDOOR_STOP, TRAIT_GENERIC) + return ..() + /obj/structure/holosign/barrier/cyborg name = "Energy Field" desc = "A fragile energy field that blocks movement. Excels at blocking lethal projectiles." @@ -132,7 +147,7 @@ if(ishuman(mover)) var/mob/living/carbon/human/sickboi = mover var/threat = sickboi.check_virus() - if(get_disease_severity_value(threat) > get_disease_severity_value(DISEASE_SEVERITY_MINOR)) + if(get_disease_danger_value(threat) > get_disease_danger_value(DISEASE_MINOR)) if(buzzcd < world.time) playsound(get_turf(src),'sound/machines/buzz-sigh.ogg',65,1,4) buzzcd = (world.time + 60) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 6aa9e499ab5ec..c98f1fad3e4ca 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -9,7 +9,7 @@ var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite var/obj/item/storage/bag/trash/mybag var/obj/item/mop/mymop - var/obj/item/twohanded/pushbroom/mybroom + var/obj/item/pushbroom/mybroom var/obj/item/reagent_containers/spray/cleaner/myspray var/obj/item/lightreplacer/myreplacer var/signs = 0 @@ -51,9 +51,9 @@ m.janicart_insert(user, src) else to_chat(user, fail_msg) - else if(istype(I, /obj/item/twohanded/pushbroom)) + else if(istype(I, /obj/item/pushbroom)) if(!mybroom) - var/obj/item/twohanded/pushbroom/b=I + var/obj/item/pushbroom/b=I b.janicart_insert(user,src) else to_chat(user, fail_msg) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 9d2c673ffdabc..527c64d19017c 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -91,7 +91,7 @@ -/obj/structure/kitchenspike/user_buckle_mob(mob/living/M, mob/living/user) //Don't want them getting put on the rack other than by spiking +/obj/structure/kitchenspike/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE) //Don't want them getting put on the rack other than by spiking return /obj/structure/kitchenspike/user_unbuckle_mob(mob/living/buckled_mob, mob/living/carbon/human/user) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 8a50bc6f033e2..6ecb920fb8986 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -5,7 +5,7 @@ icon_state = "lattice" density = FALSE anchored = TRUE - armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) + armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50, "stamina" = 0) max_integrity = 50 layer = LATTICE_LAYER //under pipes plane = FLOOR_PLANE diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index 6d525570bc238..d89bad89d5bf6 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -35,7 +35,7 @@ to_chat(user, "The [P.name] isn't strong enough!") return if(activated) - to_chat(user, "The [name] is already active!") + to_chat(user, "The [name] is already active!") return to_chat(user, "You start vigorously plunging [src]!") diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm index 0b710efb5f42e..5cd581fedae36 100644 --- a/code/game/objects/structures/lavaland/necropolis_tendril.dm +++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm @@ -30,16 +30,14 @@ GLOBAL_LIST_INIT(tendrils, list()) /obj/structure/spawner/lavaland/Initialize() . = ..() emitted_light = new(loc) - for(var/F in RANGE_TURFS(1, src)) - if(ismineralturf(F)) - var/turf/closed/mineral/M = F - M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) + for(var/turf/closed/mineral/M in RANGE_TURFS(1, src)) + M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) AddComponent(/datum/component/gps, "Eerie Signal") GLOB.tendrils += src var/datum/disease/advance/random/necropolis/R = new necroseed += R -/obj/structure/spawner/lavaland/extrapolator_act(mob/user, var/obj/item/extrapolator/E, scan = TRUE) +/obj/structure/spawner/lavaland/extrapolator_act(mob/user, obj/item/extrapolator/E, scan = TRUE) if(!necroseed.len) return FALSE if(scan) @@ -61,7 +59,7 @@ GLOBAL_LIST_INIT(tendrils, list()) if(last_tendril && !(flags_1 & ADMIN_SPAWNED_1)) if(SSmedals.hub_enabled) - for(var/mob/living/L in view(7,src)) + for(var/mob/living/L in hearers(7,src)) if(L.stat || !L.client) continue SSmedals.UnlockMedal("[BOSS_MEDAL_TENDRIL] [ALL_KILL_MEDAL]", L.client) @@ -103,7 +101,7 @@ GLOBAL_LIST_INIT(tendrils, list()) shake_camera(M, 15, 1) playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, 1) visible_message("The tendril falls inward, the ground around it widening into a yawning chasm!") - for(var/turf/T in range(2,src)) + for(var/turf/T as() in RANGE_TURFS(2,src)) if(!T.density) T.TerraformTurf(/turf/open/chasm/lavaland, /turf/open/chasm/lavaland, flags = CHANGETURF_INHERIT_AIR) qdel(src) diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm index de7a7f76269eb..28ff5a8de732f 100644 --- a/code/game/objects/structures/loom.dm +++ b/code/game/objects/structures/loom.dm @@ -25,17 +25,17 @@ if(!istype(W)) return FALSE if(!anchored) - user.show_message("The loom needs to be wrenched down.", 1) + user.show_message("The loom needs to be wrenched down.", MSG_VISUAL) return FALSE if(W.amount < FABRIC_PER_SHEET) - user.show_message("You need at least [FABRIC_PER_SHEET] units of fabric before using this.", 1) + 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 [W.name] through the loom..", 1) + 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.", 1) + user.show_message("You weave \the [W.name] into a workable fabric.", MSG_VISUAL) return TRUE #undef FABRIC_PER_SHEET diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index 3f02bf8808f3c..f6a2a8f3861dc 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -42,8 +42,9 @@ anchored = FALSE . = ..() STOP_PROCESSING(SSfastprocess, src) + LAZYREMOVE(buckled_mob, src) -/obj/machinery/manned_turret/user_buckle_mob(mob/living/M, mob/living/carbon/user) +/obj/machinery/manned_turret/user_buckle_mob(mob/living/M, mob/living/carbon/user, check_loc = TRUE) if(user.incapacitated() || !istype(user)) return M.forceMove(get_turf(src)) @@ -72,7 +73,7 @@ if (!update_positioning()) return PROCESS_KILL -/obj/machinery/manned_turret/proc/update_positioning() +/obj/machinery/manned_turret/proc/update_positioning(mouseObject, params) if (!LAZYLEN(buckled_mobs)) return FALSE var/mob/living/controller = buckled_mobs[1] @@ -80,11 +81,11 @@ return FALSE var/client/C = controller.client if(C) - var/atom/A = C.mouseObject + var/atom/A = mouseObject var/turf/T = get_turf(A) if(istype(T)) //They're hovering over something in the map. direction_track(controller, T) - calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(controller, C.mouseParams) + calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(controller, params) /obj/machinery/manned_turret/proc/direction_track(mob/user, atom/targeted) if(user.incapacitated()) @@ -147,7 +148,7 @@ /obj/machinery/manned_turret/proc/fire_helper(mob/user) if(user.incapacitated() || !(user in buckled_mobs)) return - update_positioning() //REFRESH MOUSE TRACKING!! + update_positioning() var/turf/targets_from = get_turf(src) if(QDELETED(target)) target = target_turf diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 3af35ea1de73a..a24bccf86ee34 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -10,7 +10,7 @@ icon = 'icons/obj/doors/mineral_doors.dmi' icon_state = "metal" max_integrity = 200 - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 50, "acid" = 50) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 50, "acid" = 50, "stamina" = 0) CanAtmosPass = ATMOS_PASS_DENSITY rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE rad_insulation = RAD_MEDIUM_INSULATION diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index c4fa5b4a6b46e..2b26b8c571e98 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -8,6 +8,8 @@ anchored = TRUE max_integrity = 200 integrity_failure = 100 + flags_ricochet = RICOCHET_SHINY + layer = ABOVE_WINDOW_LAYER /obj/structure/mirror/Initialize(mapload) . = ..() @@ -243,3 +245,25 @@ /obj/structure/mirror/magic/proc/curse(mob/living/user) return + + +//basically stolen from human_defense.dm +/obj/structure/mirror/bullet_act(obj/item/projectile/P) + if(P.reflectable & REFLECT_NORMAL) + 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 + 180 + while(new_angle_s > 180) // Translate to regular projectile degrees + new_angle_s -= 360 + P.setAngle(new_angle_s) + + return BULLET_ACT_FORCE_PIERCE // complete projectile permutation diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 8bdbbb111209c..82140e15beb1c 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -101,7 +101,8 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an return ..() /obj/structure/bodycontainer/deconstruct(disassembled = TRUE) - new /obj/item/stack/sheet/iron (loc, 5) + if (!(flags_1 & NODECONSTRUCT_1)) + new /obj/item/stack/sheet/iron (loc, 5) recursive_organ_check(src) qdel(src) @@ -126,7 +127,8 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) playsound(src, 'sound/effects/roll.ogg', 5, 1) var/turf/T = get_step(src, dir) - connected.setDir(dir) + if(connected) + connected.setDir(dir) for(var/atom/movable/AM in src) AM.forceMove(T) update_icon() @@ -144,7 +146,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an /obj/structure/bodycontainer/get_remote_view_fullscreens(mob/user) if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS))) - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2) /* * Morgue */ @@ -167,7 +169,6 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an . += "The speaker is [beeper ? "enabled" : "disabled"]. Alt-click to toggle it." /obj/structure/bodycontainer/morgue/AltClick(mob/user) - ..() if(!user.canUseTopic(src, !issilicon(user))) return beeper = !beeper @@ -260,6 +261,11 @@ GLOBAL_LIST_EMPTY(crematoriums) locked = TRUE update_icon() + for(var/obj/O in conts) + if(O.resistance_flags & INDESTRUCTIBLE) + O.forceMove(src) // in case an item in container should be spared + conts -= O + for(var/mob/living/M in conts) if (M.stat != DEAD) M.emote("scream") @@ -267,7 +273,6 @@ GLOBAL_LIST_EMPTY(crematoriums) log_combat(user, M, "cremated") else M.log_message("was cremated", LOG_ATTACK) - M.death(1) if(M) //some animals get automatically deleted on death. M.ghostize() @@ -343,6 +348,17 @@ GLOBAL_LIST_EMPTY(crematoriums) else to_chat(user, "That's not connected to anything!") +/obj/structure/tray/attackby(obj/P, mob/user, params) + if(!istype(P, /obj/item/riding_offhand)) + return ..() + + var/obj/item/riding_offhand/riding_item = P + var/mob/living/carried_mob = riding_item.rider + if(carried_mob == user) //Piggyback user. + return + user.unbuckle_mob(carried_mob) + MouseDrop_T(carried_mob, user) + /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) return diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm deleted file mode 100644 index 23b8da75575c3..0000000000000 --- a/code/game/objects/structures/musician.dm +++ /dev/null @@ -1,386 +0,0 @@ - -#define MUSICIAN_HEARCHECK_MINDELAY 4 -#define MUSIC_MAXLINES 300 -#define MUSIC_MAXLINECHARS 50 - -/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(mob/user, 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)) - LAZYADD(hearing_mobs, M) - last_hearcheck = world.time - - var/sound/music_played = sound(soundfile) - for(var/i in hearing_mobs) - var/mob/M = i - if(HAS_TRAIT(user, TRAIT_MUSICIAN) && isliving(M)) - var/mob/living/L = M - L.apply_status_effect(STATUS_EFFECT_GOOD_MUSIC) - if(!M.client || !(M.client.prefs.toggles & SOUND_INSTRUMENTS)) - continue - 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, BE_CLOSE, FALSE, NO_TK)) - 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(user, 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.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)) - tempo = sanitize_tempo(600 / text2num(copytext(lines[1], length(bpm_string) + 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, BE_CLOSE, FALSE, NO_TK)) - 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 = stripped_multiline_input(usr, "Please paste the entire song, formatted:", text("[]", name), t, MUSIC_MAXLINES*MUSIC_MAXLINECHARS) - if(!usr.canUseTopic(instrumentObj, BE_CLOSE, FALSE, NO_TK)) - return - - if(length(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(!usr.canUseTopic(instrumentObj, BE_CLOSE, FALSE, NO_TK)) - return - if(cont == "no") - break - while(length(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 = stripped_input(usr, "Enter your line: ", instrumentObj.name, max_length=MUSIC_MAXLINECHARS) - if(!newline || !usr.canUseTopic(instrumentObj, BE_CLOSE, FALSE, NO_TK)) - return - if(lines.len > MUSIC_MAXLINES) - return - if(length_char(newline) > MUSIC_MAXLINECHARS) - newline = copytext_char(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], max_length=MUSIC_MAXLINECHARS) - if(!content || !usr.canUseTopic(instrumentObj, BE_CLOSE, FALSE, NO_TK)) - 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/Initialize() - . = ..() - 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 7e8bf6819a0d4..e64dc19f77d69 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -1,11 +1,15 @@ +#define MAX_NOTICES 5 + /obj/structure/noticeboard name = "notice board" desc = "A board for pinning important notices upon." icon = 'icons/obj/stationobjs.dmi' icon_state = "nboard00" + layer = ABOVE_WINDOW_LAYER density = FALSE anchored = TRUE max_integrity = 150 + // Current number of a pinned notices var/notices = 0 /obj/structure/noticeboard/Initialize(mapload) @@ -15,7 +19,7 @@ return for(var/obj/item/I in loc) - if(notices > 4) + if(notices >= MAX_NOTICES) break if(istype(I, /obj/item/paper)) I.forceMove(src) @@ -28,7 +32,7 @@ if(!allowed(user)) to_chat(user, "You are not authorized to add notices") return - if(notices < 5) + if(notices < MAX_NOTICES) if(!user.transferItemToLoc(O, src)) return notices++ @@ -39,54 +43,71 @@ else return ..() -/obj/structure/noticeboard/interact(mob/user) - ui_interact(user) - -/obj/structure/noticeboard/ui_interact(mob/user) +/obj/structure/noticeboard/ui_state(mob/user) + return GLOB.physical_state + +/obj/structure/noticeboard/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "NoticeBoard", name) + ui.open() + +/obj/structure/noticeboard/ui_data(mob/user) + var/list/data = list() + data["allowed"] = allowed(user) + data["items"] = list() + for(var/obj/item/content in contents) + var/list/content_data = list( + name = content.name, + ref = REF(content) + ) + data["items"] += list(content_data) + return data + +/obj/structure/noticeboard/ui_act(action, params) . = ..() - var/auth = allowed(user) - var/dat = "[name]
      " - for(var/obj/item/P in src) - if(istype(P, /obj/item/paper)) - dat += "[P.name] [auth ? "Write Remove" : ""]
      " - else - dat += "[P.name] [auth ? "Remove" : ""]
      " - user << browse("Notices[dat]","window=noticeboard") - onclose(user, "noticeboard") - -/obj/structure/noticeboard/Topic(href, href_list) - ..() - usr.set_machine(src) - if(href_list["remove"]) - if((usr.stat || usr.restrained())) //For when a player is handcuffed while they have the notice window open - return - var/obj/item/I = locate(href_list["remove"]) in contents - if(istype(I) && I.loc == src) - I.forceMove(usr.loc) - usr.put_in_hands(I) - notices-- - icon_state = "nboard0[notices]" + if(.) + return - if(href_list["write"]) - if((usr.stat || usr.restrained())) //For when a player is handcuffed while they have the notice window open - return - var/obj/item/P = locate(href_list["write"]) in contents - if(istype(P) && P.loc == src) - var/obj/item/I = usr.is_holding_item_of_type(/obj/item/pen) - if(I) - add_fingerprint(usr) - P.attackby(I, usr) - else - to_chat(usr, "You'll need something to write with!") + var/obj/item/item = locate(params["ref"]) in contents + if(!istype(item) || item.loc != src) + return - if(href_list["read"]) - var/obj/item/I = locate(href_list["read"]) in contents - if(istype(I) && I.loc == src) - usr.examinate(I) + var/mob/user = usr + + switch(action) + if("examine") + if(istype(item, /obj/item/paper)) + item.ui_interact(user) + else + user.examinate(item) + return TRUE + if("remove") + if(!allowed(user)) + return + remove_item(item, user) + return TRUE + +/** + * Removes an item from the notice board + * + * Arguments: + * * item - The item that is to be removed + * * user - The mob that is trying to get the item removed, if there is one + */ +/obj/structure/noticeboard/proc/remove_item(obj/item/item, mob/user) + item.forceMove(drop_location()) + if(user) + user.put_in_hands(item) + balloon_alert(user, "removed from board") + notices-- + icon_state = "nboard0[notices]" /obj/structure/noticeboard/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) new /obj/item/stack/sheet/iron (loc, 1) + for(var/obj/item/content in contents) + remove_item(content) qdel(src) // Notice boards for the heads of staff (plus the qm) @@ -130,3 +151,5 @@ name = "Staff Notice Board" desc = "Important notices from the heads of staff." req_access = list(ACCESS_HEADS) + +#undef MAX_NOTICES diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index bbe45c136b33a..ab147fa0fa3f3 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -5,7 +5,7 @@ density = TRUE anchored = TRUE max_integrity = 200 - var/timer = 240 //eventually the person will be freed + var/timer = 480 //eventually the person will be freed var/mob/living/petrified_mob /obj/structure/statue/petrified/New(loc, mob/living/L, statue_timer) @@ -25,10 +25,10 @@ START_PROCESSING(SSobj, src) ..() -/obj/structure/statue/petrified/process() +/obj/structure/statue/petrified/process(delta_time) if(!petrified_mob) STOP_PROCESSING(SSobj, src) - timer-- + timer -= delta_time petrified_mob.Stun(40) //So they can't do anything while petrified if(timer <= 0) STOP_PROCESSING(SSobj, src) diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index e02c01b055b8f..2afa9481ffc50 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -3,7 +3,7 @@ desc = "Heavy duty, airtight, plastic flaps. Definitely can't get past those. No way." icon = 'icons/obj/stationobjs.dmi' icon_state = "plasticflaps" - armor = list("melee" = 100, "bullet" = 80, "laser" = 80, "energy" = 100, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 50, "acid" = 50) + armor = list("melee" = 100, "bullet" = 80, "laser" = 80, "energy" = 100, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 50, "acid" = 50, "stamina" = 0) density = FALSE anchored = TRUE layer = BELOW_OBJ_LAYER @@ -57,17 +57,17 @@ return FALSE return TRUE -/obj/structure/plasticflaps/CanAStarPass(ID, to_dir, caller) +/obj/structure/plasticflaps/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) if(isliving(caller)) if(isbot(caller)) return TRUE - var/mob/living/M = caller - if(!M.ventcrawler && M.mob_size != MOB_SIZE_TINY) + var/mob/living/living_caller = caller + if(!living_caller.ventcrawler && living_caller.mob_size != MOB_SIZE_TINY) return FALSE - var/atom/movable/M = caller - if(M?.pulling) - return CanAStarPass(ID, to_dir, M.pulling) + + if(caller?.pulling) + return CanAStarPass(ID, to_dir, caller.pulling) return TRUE //diseases, stings, etc can pass /obj/structure/plasticflaps/CanPass(atom/movable/A, turf/T) diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index c4255bdc87324..1a5b73c0481a9 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -66,20 +66,22 @@ return TRUE /obj/structure/railing/CanPass(atom/movable/mover, turf/target) - ..() + . = ..() if(get_dir(loc, target) & dir) - return !density + var/checking = FLYING | FLOATING + return . || mover.movement_type & checking return TRUE /obj/structure/railing/corner/CanPass() ..() return TRUE -/obj/structure/railing/CheckExit(atom/movable/O, turf/target) +/obj/structure/railing/CheckExit(atom/movable/mover, turf/target) ..() if(get_dir(loc, target) & dir) - return 0 - return 1 + var/checking = UNSTOPPABLE | FLYING | FLOATING + return !density || mover.movement_type & checking || mover.move_force >= MOVE_FORCE_EXTREMELY_STRONG + return TRUE /obj/structure/railing/corner/CheckExit() return 1 diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm index f42514e4e46f0..3b26c402b3e12 100644 --- a/code/game/objects/structures/showcase.dm +++ b/code/game/objects/structures/showcase.dm @@ -69,13 +69,13 @@ icon_state = "firefighter" /obj/structure/showcase/machinery/implanter - name = "Nanotrasen automated mindshield implanter exhibit" + name = "\improper Nanotrasen automated mindshield implanter exhibit" desc = "A flimsy model of a standard Nanotrasen automated mindshield implant machine. With secure positioning harnesses and a robotic surgical injector, brain damage and other serious medical anomalies are now up to 60% less likely!" icon = 'icons/obj/machines/implantchair.dmi' icon_state = "implantchair" /obj/structure/showcase/machinery/microwave - name = "Nanotrasen-brand microwave" + name = "\improper Nanotrasen-brand microwave" desc = "The famous Nanotrasen-brand microwave, the multi-purpose cooking appliance every station needs! This one appears to be drawn onto a cardboard box." icon = 'icons/obj/kitchen.dmi' icon_state = "mw" @@ -91,7 +91,7 @@ desc = "A stand with a model of the perfect Nanotrasen Employee bolted to it. Signs indicate it is robustly genetically engineered, as well as being ruthlessly loyal." /obj/structure/showcase/machinery/tv - name = "Nanotrasen corporate newsfeed" + name = "\improper Nanotrasen corporate newsfeed" desc = "A slightly battered looking TV. Various Nanotrasen infomercials play on a loop, accompanied by a jaunty tune." icon = 'icons/obj/computer.dmi' icon_state = "television" diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm index 370f17888ee2e..9f00194827eb7 100644 --- a/code/game/objects/structures/shower.dm +++ b/code/game/objects/structures/shower.dm @@ -15,6 +15,34 @@ var/reagent_id = /datum/reagent/water var/reaction_volume = 200 +/obj/structure/showerframe + name = "shower frame" + icon = 'icons/obj/watercloset.dmi' + icon_state = "shower_frame" + desc = "A shower frame, that needs 2 plastic sheets to finish construction." + anchored = FALSE + +/obj/structure/showerframe/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/stack/sheet/plastic)) + balloon_alert(user, "You start constructing the shower") + if(do_after(user, 4 SECONDS, target = src)) + I.use(1) + balloon_alert(user, "Shower created") + var/obj/machinery/shower/new_shower = new /obj/machinery/shower(loc) + new_shower.setDir(dir) + qdel(src) + return + return ..() + +/obj/structure/showerframe/Initialize() + . = ..() + AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated)) + +/obj/structure/showerframe/proc/can_be_rotated(mob/user, rotation_type) + if(anchored) + to_chat(user, "It is fastened to the floor!") + return !anchored + /obj/machinery/shower/Initialize() . = ..() create_reagents(reaction_volume) @@ -34,7 +62,7 @@ add_fingerprint(M) if(on) START_PROCESSING(SSmachines, src) - process() + process(SSMACHINES_DT) soundloop.start() else soundloop.stop() @@ -143,16 +171,16 @@ if(M.head && wash_obj(M.head)) M.update_inv_head() - if(M.glasses && !(SLOT_GLASSES in obscured) && wash_obj(M.glasses)) + if(M.glasses && !(ITEM_SLOT_EYES in obscured) && wash_obj(M.glasses)) M.update_inv_glasses() - if(M.wear_mask && !(SLOT_WEAR_MASK in obscured) && wash_obj(M.wear_mask)) + if(M.wear_mask && !(ITEM_SLOT_MASK in obscured) && wash_obj(M.wear_mask)) M.update_inv_wear_mask() if(M.ears && !(HIDEEARS in obscured) && wash_obj(M.ears)) M.update_inv_ears() - if(M.wear_neck && !(SLOT_NECK in obscured) && wash_obj(M.wear_neck)) + if(M.wear_neck && !(ITEM_SLOT_NECK in obscured) && wash_obj(M.wear_neck)) M.update_inv_neck() if(M.shoes && !(HIDESHOES in obscured) && wash_obj(M.shoes)) diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index bd04e6c1dba48..b9e546ec71bf4 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -5,7 +5,7 @@ density = FALSE 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) + armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 0) var/buildable_sign = 1 //unwrenchable and modifiable rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE @@ -121,11 +121,11 @@ setDir(turn(dir, 90)) /obj/structure/sign/nanotrasen - name = "\improper Nanotrasen Logo" - desc = "A sign with the Nanotrasen Logo on it. Glory to Nanotrasen!" + name = "\improper Nanotrasen logo" + desc = "A sign with the Nanotrasen logo on it. Glory to Nanotrasen!" icon_state = "nanotrasen" /obj/structure/sign/logo - name = "nanotrasen logo" + name = "\improper Nanotrasen logo" desc = "The Nanotrasen corporate logo." icon_state = "nanotrasen_sign1" diff --git a/code/game/objects/structures/signs/signs_plaques.dm b/code/game/objects/structures/signs/signs_plaques.dm index 317f556e8d704..24df1c43d27f9 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 have an intellectual disability. Beneath the image, someone has scratched the word \"PACKETS\"." icon_state = "kiddieplaque" /obj/structure/sign/plaques/kiddie/badger diff --git a/code/game/objects/structures/spirit_board.dm b/code/game/objects/structures/spirit_board.dm index 095c696640e27..f6e68fc31aa99 100644 --- a/code/game/objects/structures/spirit_board.dm +++ b/code/game/objects/structures/spirit_board.dm @@ -65,7 +65,7 @@ //mobs in range check var/users_in_range = 0 - for(var/mob/living/L in orange(1,src)) + for(var/mob/living/L in oviewers(1,src)) if(L.ckey && L.client) if((world.time - L.client.inactivity) < (world.time - 300) || L.stat != CONSCIOUS || L.restrained())//no playing with braindeads or corpses or handcuffed dudes. to_chat(M, "[L] doesn't seem to be paying attention...") diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm index f2c4e628e0347..2d64134829fd6 100644 --- a/code/game/objects/structures/stairs.dm +++ b/code/game/objects/structures/stairs.dm @@ -2,8 +2,8 @@ #define STAIR_TERMINATOR_NO 1 #define STAIR_TERMINATOR_YES 2 -// dir determines the direction of travel to go upwards (due to lack of sprites, currently only 1 and 2 make sense) -// stairs require /turf/open/openspace as the tile above them to work +// dir determines the direction of travel to go upwards +// stairs require /turf/open/openspace as the tile above them to work, unless your stairs have 'force_open_above' set to TRUE // multiple stair objects can be chained together; the Z level transition will happen on the final stair object in the chain /obj/structure/stairs @@ -16,6 +16,7 @@ var/terminator_mode = STAIR_TERMINATOR_AUTOMATIC var/turf/listeningTo + /obj/structure/stairs/Initialize(mapload) if(force_open_above) force_open_above() @@ -105,6 +106,8 @@ T.ChangeTurf(/turf/open/openspace, flags = CHANGETURF_INHERIT_AIR) /obj/structure/stairs/proc/on_multiz_new(turf/source, dir) + SIGNAL_HANDLER + if(dir == UP) var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) if(T && !istype(T)) @@ -128,3 +131,6 @@ if(S.dir == dir) return FALSE return TRUE + +/obj/structure/stairs/attack_ghost(mob/user) + stair_ascend(user) diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 33445d8ae0945..d4e86ddcd148c 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -10,7 +10,6 @@ var/material_drop_type = /obj/item/stack/sheet/iron CanAtmosPass = ATMOS_PASS_DENSITY - /obj/structure/statue/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) user.changeNext_move(CLICK_CD_MELEE) @@ -224,7 +223,7 @@ max_integrity = 300 material_drop_type = /obj/item/stack/sheet/mineral/bananium desc = "A bananium statue with a small engraving:'HOOOOOOONK'." - var/spam_flag = 0 + var/spam_flag = FALSE /obj/structure/statue/bananium/clown name = "statue of a clown" @@ -248,10 +247,9 @@ /obj/structure/statue/bananium/proc/honk() if(!spam_flag) - spam_flag = 1 + spam_flag = TRUE playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1) - spawn(20) - spam_flag = 0 + addtimer(VARSET_CALLBACK(src, spam_flag, FALSE), 2 SECONDS) /////////////////////sandstone///////////////////////////////////////// diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 5f268654c7159..c58e2a5adb051 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -2,6 +2,7 @@ * Contains: * Tables * Glass Tables + * Plasmaglass Tables * Wooden Tables * Reinforced Tables * Racks @@ -40,18 +41,11 @@ if(!istype(H)) return var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET)) - if(H.shoes || feetCover || !(H.mobility_flags & MOBILITY_STAND) || HAS_TRAIT(H, TRAIT_PIERCEIMMUNE) || H.m_intent == MOVE_INTENT_WALK) + if(!HAS_TRAIT(H, TRAIT_ALWAYS_STUBS) && (H.shoes || feetCover || !(H.mobility_flags & MOBILITY_STAND) || HAS_TRAIT(H, TRAIT_PIERCEIMMUNE) || H.m_intent == MOVE_INTENT_WALK)) return - if((world.time >= last_bump + 100) && prob(5)) + if(HAS_TRAIT(H, TRAIT_ALWAYS_STUBS) || ((world.time >= last_bump + 100) && prob(5))) to_chat(H, "You stub your toe on the [name]!") - var/power = 2 - if(HAS_TRAIT(H, TRAIT_LIGHT_STEP)) - power = 1 - H.emote("gasp") - else - H.emote("scream") - H.apply_damage(power, BRUTE, def_zone = pick(BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT)) - H.Paralyze(10 * power) + H.stub_toe(2) last_bump = world.time //do the cooldown here so walking into a table only checks toestubs once /obj/structure/table/examine(mob/user) @@ -71,6 +65,11 @@ qdel(src) new /obj/structure/table/wood(A) +/obj/structure/table/ratvar_act() + var/atom/A = loc + qdel(src) + new /obj/structure/table/brass(A) + /obj/structure/table/attack_paw(mob/user) return attack_hand(user) @@ -118,15 +117,15 @@ else return !density -/obj/structure/table/CanAStarPass(ID, dir, caller) +/obj/structure/table/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) . = !density - if(ismovableatom(caller)) - var/atom/movable/mover = caller - . = . || (mover.pass_flags & PASSTABLE) + if(istype(caller)) + . = . || (caller.pass_flags & PASSTABLE) /obj/structure/table/proc/tableplace(mob/living/user, mob/living/pushed_mob) pushed_mob.forceMove(loc) - pushed_mob.set_resting(TRUE, TRUE) + if(!isanimal(pushed_mob) || iscat(pushed_mob)) + pushed_mob.set_resting(TRUE, TRUE) pushed_mob.visible_message("[user] places [pushed_mob] onto [src].", \ "[user] places [pushed_mob] onto [src].") log_combat(user, pushed_mob, "places", null, "onto [src]") @@ -136,7 +135,7 @@ to_chat(user, "Throwing [pushed_mob] onto the table might hurt them!") return var/added_passtable = FALSE - if(!pushed_mob.pass_flags & PASSTABLE) + if(!(pushed_mob.pass_flags & PASSTABLE)) added_passtable = TRUE pushed_mob.pass_flags |= PASSTABLE pushed_mob.Move(src.loc) @@ -169,13 +168,13 @@ /obj/structure/table/attackby(obj/item/I, mob/user, params) if(!(flags_1 & NODECONSTRUCT_1)) - if(I.tool_behaviour == TOOL_SCREWDRIVER && deconstruction_ready) + if(I.tool_behaviour == TOOL_SCREWDRIVER && deconstruction_ready && user.a_intent != INTENT_HELP) to_chat(user, "You start disassembling [src]...") if(I.use_tool(src, user, 20, volume=50)) deconstruct(TRUE) return - if(I.tool_behaviour == TOOL_WRENCH && deconstruction_ready) + if(I.tool_behaviour == TOOL_WRENCH && deconstruction_ready && user.a_intent != INTENT_HELP) to_chat(user, "You start deconstructing [src]...") if(I.use_tool(src, user, 40, volume=50)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) @@ -190,6 +189,34 @@ return // If the tray IS empty, continue on (tray will be placed on the table like other items) + if(istype(I, /obj/item/riding_offhand)) + var/obj/item/riding_offhand/riding_item = I + var/mob/living/carried_mob = riding_item.rider + if(carried_mob == user) //Piggyback user. + return + switch(user.a_intent) + if(INTENT_HARM) + user.unbuckle_mob(carried_mob) + tableheadsmash(user, carried_mob) + if(INTENT_HELP) + var/tableplace_delay = 3.5 SECONDS + var/skills_space = "" + if(HAS_TRAIT(user, TRAIT_QUICKER_CARRY)) + tableplace_delay = 2 SECONDS + skills_space = " expertly" + else if(HAS_TRAIT(user, TRAIT_QUICK_CARRY)) + tableplace_delay = 2.75 SECONDS + skills_space = " quickly" + carried_mob.visible_message("[user] begins to[skills_space] place [carried_mob] onto [src]...", + "[user] begins to[skills_space] place [carried_mob] onto [src]...") + if(do_after(user, tableplace_delay, target = carried_mob)) + user.unbuckle_mob(carried_mob) + tableplace(user, carried_mob) + else + user.unbuckle_mob(carried_mob) + tablepush(user, carried_mob) + return TRUE + if(user.a_intent != INTENT_HARM && !(I.item_flags & ABSTRACT)) if(user.transferItemToLoc(I, drop_location())) var/list/click_params = params2list(params) @@ -197,8 +224,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) - 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) + 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 else return ..() @@ -227,7 +254,7 @@ canSmoothWith = null max_integrity = 70 resistance_flags = ACID_PROOF - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100, "stamina" = 0) var/list/debris = list() /obj/structure/table/glass/Initialize() @@ -292,6 +319,25 @@ for(var/obj/item/shard/S in debris) S.color = NARSIE_WINDOW_COLOUR +/* + * Plasmaglass tables + */ +/obj/structure/table/glass/plasma + name = "plasmaglass table" + desc = "A glass table, but it's pink and more sturdy. What will Nanotrasen design next with plasma?" + icon = 'icons/obj/smooth_structures/plasmaglass_table.dmi' + icon_state = "plasmaglass_table" + buildstack = /obj/item/stack/sheet/plasmaglass + max_integrity = 270 + armor = list("melee" = 10, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) + +/obj/structure/table/glass/plasma/Initialize() + . = ..() + debris += new /obj/item/shard/plasma + +/obj/structure/table/glass/plasma/check_break(mob/living/M) + return + /* * Wooden tables */ @@ -410,7 +456,7 @@ canSmoothWith = list(/obj/structure/table/reinforced, /obj/structure/table) max_integrity = 200 integrity_failure = 50 - armor = list("melee" = 10, "bullet" = 30, "laser" = 30, "energy" = 100, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) + armor = list("melee" = 10, "bullet" = 30, "laser" = 30, "energy" = 100, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70, "stamina" = 0) /obj/structure/table/reinforced/deconstruction_hints(mob/user) if(deconstruction_ready) @@ -449,6 +495,9 @@ buildstackamount = 1 canSmoothWith = list(/obj/structure/table/brass, /obj/structure/table/bronze) +/obj/structure/table/brass/ratvar_act() + return + /obj/structure/table/brass/tablepush(mob/living/user, mob/living/pushed_mob) . = ..() playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE) @@ -494,7 +543,7 @@ /obj/structure/table/optable/Initialize() . = ..() for(var/direction in GLOB.cardinals) - computer = locate(/obj/machinery/computer/operating, get_step(src, direction)) + computer = locate(/obj/machinery/computer/operating) in get_step(src, direction) if(computer) computer.table = src break @@ -506,19 +555,37 @@ /obj/structure/table/optable/tablepush(mob/living/user, mob/living/pushed_mob) pushed_mob.forceMove(loc) - pushed_mob.set_resting(TRUE, TRUE) + if(!isanimal(pushed_mob) || iscat(pushed_mob)) + pushed_mob.set_resting(TRUE, TRUE) visible_message("[user] has laid [pushed_mob] on [src].") - check_patient() + get_patient() -/obj/structure/table/optable/proc/check_patient() - var/mob/living/carbon/human/M = locate(/mob/living/carbon/human, loc) +/obj/structure/table/optable/proc/get_patient() + var/mob/living/carbon/M = locate(/mob/living/carbon) in loc if(M) if(M.resting) - patient = M - return TRUE + set_patient(M) else - patient = null + set_patient(null) + +/obj/structure/table/optable/proc/set_patient(new_patient) + if(patient) + UnregisterSignal(patient, COMSIG_PARENT_QDELETING) + patient = new_patient + if(patient) + RegisterSignal(patient, COMSIG_PARENT_QDELETING, .proc/patient_deleted) + +/obj/structure/table/optable/proc/patient_deleted(datum/source) + SIGNAL_HANDLER + set_patient(null) + +/obj/structure/table/optable/proc/check_eligible_patient() + get_patient() + if(!patient) return FALSE + if(ishuman(patient) || ismonkey(patient)) + return TRUE + return FALSE /* * Racks @@ -562,7 +629,7 @@ step(O, get_dir(O, src)) /obj/structure/rack/attackby(obj/item/W, mob/user, params) - if (W.tool_behaviour == TOOL_WRENCH && !(flags_1&NODECONSTRUCT_1)) + if (W.tool_behaviour == TOOL_WRENCH && !(flags_1&NODECONSTRUCT_1) && user.a_intent != INTENT_HELP) W.play_tool_sound(src) deconstruct(TRUE) return diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 163b9daae0cce..3e6d716bc3624 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -63,9 +63,14 @@ return if(!user.transferItemToLoc(I, src)) + if(istype(I, /obj/item/tank/internals/plasma)) + plasmatanks-- + else if(istype(I, /obj/item/tank/internals/oxygen)) + oxygentanks-- return to_chat(user, "You put [I] in [src].") update_icon() + ui_update() /obj/structure/tank_dispenser/ui_state(mob/user) @@ -100,6 +105,7 @@ usr.put_in_hands(tank) oxygentanks-- . = TRUE + ui_update() update_icon() diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 4730e4fd2dbe2..71e09245b0231 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -153,9 +153,7 @@ pod_moving = 0 if(!QDELETED(pod)) var/datum/gas_mixture/floor_mixture = loc.return_air() - floor_mixture.archive() - pod.air_contents.archive() - pod.air_contents.share(floor_mixture, 1) //mix the pod's gas mixture with the tile it's on + equalize_all_gases_in_list(list(pod.air_contents,floor_mixture)) air_update_turf() /obj/structure/transit_tube/station/init_tube_dirs() diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index 454e7cca095ea..b2ca37c79b995 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -128,5 +128,6 @@ name = "unattached transit tube pod" icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' icon_state = "pod" + desc = "Could probably be dragged into an open Transit Tube." anchored = FALSE density = FALSE diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index 51889077cad94..c99a1d7c85218 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -11,8 +11,8 @@ /obj/structure/transit_tube_pod/Initialize() . = ..() - air_contents.set_moles(/datum/gas/oxygen, MOLES_O2STANDARD) - air_contents.set_moles(/datum/gas/nitrogen, MOLES_N2STANDARD) + air_contents.set_moles(GAS_O2, MOLES_O2STANDARD) + air_contents.set_moles(GAS_N2, MOLES_N2STANDARD) air_contents.set_temperature(T20C) @@ -57,8 +57,14 @@ empty_pod() /obj/structure/transit_tube_pod/contents_explosion(severity, target) - for(var/atom/movable/AM in contents) - AM.ex_act(severity, target) + for(var/thing in contents) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += thing + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += thing + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += thing /obj/structure/transit_tube_pod/singularity_pull(S, current_size) ..() @@ -158,9 +164,24 @@ /obj/structure/transit_tube_pod/assume_air(datum/gas_mixture/giver) return air_contents.merge(giver) +/obj/structure/transit_tube_pod/assume_air_moles(datum/gas_mixture/giver, moles) + return giver.transfer_to(air_contents, moles) + +/obj/structure/transit_tube_pod/assume_air_ratio(datum/gas_mixture/giver, ratio) + return giver.transfer_ratio_to(air_contents, ratio) + /obj/structure/transit_tube_pod/remove_air(amount) return air_contents.remove(amount) +/obj/structure/transit_tube_pod/remove_air_ratio(ratio) + return air_contents.remove_ratio(ratio) + +/obj/structure/transit_tube_pod/transfer_air(datum/gas_mixture/taker, moles) + return air_contents.transfer_to(taker, moles) + +/obj/structure/transit_tube_pod/transfer_air_ratio(datum/gas_mixture/taker, ratio) + return air_contents.transfer_ratio_to(taker, ratio) + /obj/structure/transit_tube_pod/relaymove(mob/mob, direction) if(istype(mob) && mob.client) if(!moving) diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index 2c209ead993f8..18b795196bf85 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -108,6 +108,12 @@ time_between_triggers = 10 flare_message = "[src] snaps shut!" +/obj/structure/trap/stun/hunter/Destroy() + if(!QDELETED(stored_item)) + qdel(stored_item) + stored_item = null + return ..() + /obj/structure/trap/stun/hunter/Crossed(atom/movable/AM) if(isliving(AM)) var/mob/living/L = AM @@ -161,7 +167,9 @@ forceMove(stored_trap)//moves item into trap /obj/item/bountytrap/Destroy() - qdel(stored_trap) + if(!QDELETED(stored_trap)) + qdel(stored_trap) + stored_trap = null QDEL_NULL(radio) QDEL_NULL(spark_system) . = ..() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 1bfae8d04dced..206642bf35def 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -107,19 +107,12 @@ return ..() /obj/structure/toilet/secret - var/obj/item/secret var/secret_type = null -/obj/structure/toilet/secret/Initialize(mapload) +/obj/structure/toilet/secret/Initialize() . = ..() if (secret_type) - secret = new secret_type(src) - secret.desc += " It's a secret!" - w_items += secret.w_class - contents += secret - - - + new secret_type(src) /obj/structure/urinal name = "urinal" @@ -224,6 +217,35 @@ var/busy = FALSE //Something's being washed at the moment var/dispensedreagent = /datum/reagent/water // for whenever plumbing happens + +/obj/structure/sinkframe + name = "sink frame" + icon = 'icons/obj/watercloset.dmi' + icon_state = "sink_frame" + desc = "A sink frame, that needs 2 plastic sheets to finish construction." + anchored = FALSE + +/obj/structure/sinkframe/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/stack/sheet/plastic)) + balloon_alert(user, "You start constructing the sink") + if(do_after(user, 4 SECONDS, target = src)) + I.use(1) + balloon_alert(user, "Sink created") + var/obj/structure/sink/new_sink = new /obj/structure/sink(loc) + new_sink.setDir(dir) + qdel(src) + return + return ..() + +/obj/structure/sinkframe/Initialize() + . = ..() + AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated)) + +/obj/structure/sinkframe/proc/can_be_rotated(mob/user, rotation_type) + if(anchored) + to_chat(user, "It is fastened to the floor!") + return !anchored + /obj/structure/sink/attack_hand(mob/living/user) . = ..() if(.) @@ -339,7 +361,6 @@ qdel(src) - /obj/structure/sink/kitchen name = "kitchen sink" icon_state = "sink_alt" diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 6c0bc7ee89315..68a4eae86d836 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -218,6 +218,31 @@ else W.forceMove(drop_location()) + //Adding an electroadaptive pseudocircuit for access. Step 6 complete. + else if(istype(W, /obj/item/electroadaptive_pseudocircuit)) + var/obj/item/electroadaptive_pseudocircuit/EP = W + if(EP.adapt_circuit(user, 25)) + var/obj/item/electronics/airlock/AE = new(src) + AE.accesses = EP.electronics.accesses + AE.one_access = EP.electronics.one_access + AE.unres_sides = EP.electronics.unres_sides + if(!user.transferItemToLoc(AE, src)) + qdel(AE) + return + AE.play_tool_sound(src, 100) + user.visible_message("[user] installs the electronics into the airlock assembly.", + "You start to install electronics into the airlock assembly...") + + if(do_after(user, 40, target = src)) + if(!src || electronics) + qdel(AE) + return + to_chat(user, "You install the electroadaptive pseudocircuit.") + name = "near finished windoor assembly" + electronics = AE + else + qdel(AE) + //Screwdriver to remove airlock electronics. Step 6 undone. else if(W.tool_behaviour == TOOL_SCREWDRIVER) if(!electronics) @@ -243,8 +268,6 @@ created_name = t return - - //Crowbar to complete the assembly, Step 7 complete. else if(W.tool_behaviour == TOOL_CROWBAR) if(!electronics) @@ -315,13 +338,8 @@ /obj/structure/windoor_assembly/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) - ) + var/static/rotation_flags = ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS + AddComponent(/datum/component/simple_rotation, rotation_flags, can_be_rotated=CALLBACK(src, .proc/can_be_rotated), after_rotation=CALLBACK(src,.proc/after_rotation)) /obj/structure/windoor_assembly/proc/can_be_rotated(mob/user,rotation_type) if(anchored) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index d20c7e9770a01..16f390f10d1a7 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -7,10 +7,10 @@ pressure_resistance = 4*ONE_ATMOSPHERE anchored = TRUE //initially is 0 for tile smoothing flags_1 = ON_BORDER_1 - max_integrity = 100 + max_integrity = 50 can_be_unanchored = TRUE resistance_flags = ACID_PROOF - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100, "stamina" = 0) CanAtmosPass = ATMOS_PASS_PROC rad_insulation = RAD_VERY_LIGHT_INSULATION rad_flags = RAD_PROTECT_CONTENTS @@ -27,6 +27,8 @@ var/real_explosion_block //ignore this, just use explosion_block var/breaksound = "shatter" var/hitsound = 'sound/effects/Glasshit.ogg' + flags_ricochet = RICOCHET_HARD + ricochet_chance_mod = 0.4 /obj/structure/window/examine(mob/user) @@ -84,6 +86,13 @@ /obj/structure/window/narsie_act() add_atom_colour(NARSIE_WINDOW_COLOUR, FIXED_COLOUR_PRIORITY) +/obj/structure/window/ratvar_act() + if(!fulltile) + new/obj/structure/window/reinforced/clockwork(get_turf(src), dir) + else + new/obj/structure/window/reinforced/clockwork/fulltile(get_turf(src)) + qdel(src) + /obj/structure/window/singularity_pull(S, current_size) ..() if(current_size >= STAGE_FIVE) @@ -347,7 +356,7 @@ /obj/structure/window/get_dumping_location(obj/item/storage/source,mob/user) return null -/obj/structure/window/CanAStarPass(ID, to_dir) +/obj/structure/window/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) if(!density) return 1 if((dir == FULLTILE_WINDOW_DIR) || (dir == to_dir)) @@ -376,11 +385,12 @@ icon_state = "rwindow" reinf = TRUE heat_resistance = 1600 - armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) - max_integrity = 200 + armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100, "stamina" = 0) + max_integrity = 100 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 @@ -400,8 +410,8 @@ icon_state = "plasmawindow" reinf = FALSE heat_resistance = 25000 - armor = list("melee" = 75, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 45, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100) - max_integrity = 600 + armor = list("melee" = 75, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 45, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100, "stamina" = 0) + max_integrity = 300 glass_type = /obj/item/stack/sheet/plasmaglass rad_insulation = RAD_NO_INSULATION @@ -432,8 +442,8 @@ icon_state = "plasmarwindow" reinf = TRUE heat_resistance = 50000 - armor = list("melee" = 85, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100) - max_integrity = 1000 + armor = list("melee" = 85, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100, "stamina" = 0) + max_integrity = 500 explosion_block = 2 glass_type = /obj/item/stack/sheet/plasmarglass @@ -463,7 +473,7 @@ icon = 'icons/obj/smooth_structures/window.dmi' icon_state = "window" dir = FULLTILE_WINDOW_DIR - max_integrity = 200 + max_integrity = 100 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 smooth = SMOOTH_TRUE @@ -477,7 +487,7 @@ icon = 'icons/obj/smooth_structures/plasma_window.dmi' icon_state = "plasmawindow" dir = FULLTILE_WINDOW_DIR - max_integrity = 1200 + max_integrity = 600 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 smooth = SMOOTH_TRUE @@ -504,7 +514,7 @@ icon = 'icons/obj/smooth_structures/reinforced_window.dmi' icon_state = "r_window" dir = FULLTILE_WINDOW_DIR - max_integrity = 400 + max_integrity = 200 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 smooth = SMOOTH_TRUE @@ -546,13 +556,14 @@ flags_1 = PREVENT_CLICK_UNDER_1 reinf = TRUE heat_resistance = 1600 - armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) + armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100, "stamina" = 0) smooth = SMOOTH_TRUE canSmoothWith = null explosion_block = 3 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) @@ -569,13 +580,13 @@ icon = 'icons/obj/smooth_structures/plastitanium_window.dmi' icon_state = "plastitanium_window" dir = FULLTILE_WINDOW_DIR - max_integrity = 400 + max_integrity = 200 wtype = "shuttle" fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 reinf = TRUE heat_resistance = 1600 - armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) + armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100, "stamina" = 0) smooth = SMOOTH_TRUE canSmoothWith = null explosion_block = 3 @@ -604,7 +615,7 @@ decon_speed = 10 CanAtmosPass = ATMOS_PASS_YES resistance_flags = FLAMMABLE - 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, "stamina" = 0) breaksound = 'sound/items/poster_ripped.ogg' hitsound = 'sound/weapons/slashmiss.ogg' var/static/mutable_appearance/torn = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "torn", layer = ABOVE_OBJ_LAYER - 0.1) @@ -669,3 +680,26 @@ return ..() update_icon() + +/obj/structure/window/bronze + name = "brass window" + desc = "A paper-thin pane of translucent yet reinforced brass. Nevermind, this is just weak bronze!" + icon = 'icons/obj/smooth_structures/clockwork_window.dmi' + icon_state = "clockwork_window_single" + glass_type = /obj/item/stack/tile/bronze + +/obj/structure/window/bronze/unanchored + anchored = FALSE + +/obj/structure/window/bronze/fulltile + icon_state = "clockwork_window" + smooth = SMOOTH_TRUE + canSmoothWith = null + fulltile = TRUE + flags_1 = PREVENT_CLICK_UNDER_1 + dir = FULLTILE_WINDOW_DIR + max_integrity = 50 + glass_amount = 2 + +/obj/structure/window/bronze/fulltile/unanchored + anchored = FALSE diff --git a/code/game/say.dm b/code/game/say.dm index 90c984e0f83f9..6d65a40ca052a 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -8,6 +8,7 @@ GLOBAL_LIST_INIT(freqtospan, list( "[FREQ_MEDICAL]" = "medradio", "[FREQ_ENGINEERING]" = "engradio", "[FREQ_SUPPLY]" = "suppradio", + "[FREQ_EXPLORATION]" = "explradio", "[FREQ_SERVICE]" = "servradio", "[FREQ_SECURITY]" = "secradio", "[FREQ_COMMAND]" = "comradio", @@ -28,19 +29,25 @@ GLOBAL_LIST_INIT(freqtospan, list( 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) - SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, message, speaker, message_language, raw_message, radio_freq, spans, message_mode) +/atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) + SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) /atom/movable/proc/can_speak() - return 1 - -/atom/movable/proc/send_speech(message, range = 7, obj/source = src, bubble_type, list/spans, datum/language/message_language = null, message_mode) - var/rendered = compose_message(src, message_language, message, , spans, message_mode) - for(var/_AM in get_hearers_in_view(range, source)) - var/atom/movable/AM = _AM - AM.Hear(rendered, src, message_language, message, , spans, message_mode) - -/atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, face_name = FALSE) + return TRUE + +/atom/movable/proc/send_speech(message, range = 7, obj/source = src, bubble_type, list/spans, datum/language/message_language = null, list/message_mods = list()) + var/rendered = compose_message(src, message_language, message, , spans, message_mods) + var/list/show_overhead_message_to = list() + for(var/atom/movable/AM as() in get_hearers_in_view(range, source)) + if(ismob(AM)) + var/mob/M = AM + if(M.should_show_chat_message(source, message_language, FALSE, is_heard = TRUE)) + show_overhead_message_to += M + AM.Hear(rendered, src, message_language, message, , spans, message_mods) + if(length(show_overhead_message_to)) + create_chat_message(src, message_language, show_overhead_message_to, message, spans, message_mods) + +/atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), face_name = FALSE) //This proc uses text() because it is faster than appending strings. Thanks BYOND. //Basic span var/spanpart1 = "" @@ -50,14 +57,37 @@ GLOBAL_LIST_INIT(freqtospan, list( var/freqpart = radio_freq ? "\[[get_radio_name(radio_freq)]\] " : "" //Speaker name var/namepart = "[speaker.GetVoice()][speaker.get_alt_name()]" - if(face_name && ishuman(speaker)) + if(ishuman(speaker)) var/mob/living/carbon/human/H = speaker - namepart = "[H.get_face_name()]" //So "fake" speaking like in hallucinations does not give the speaker away if disguised + if(face_name) + namepart = "[H.get_face_name()]" //So "fake" speaking like in hallucinations does not give the speaker away if disguised + if(!radio_freq) + if(H.wear_id) + var/datum/job/wearer_job = SSjob.GetJob(H.wear_id.GetJobName()) + var/wearer_say_span + if(wearer_job) + wearer_say_span = wearer_job.say_span + else + switch(H.wear_id.GetJobName()) + if("CentCom") + wearer_say_span = "centcom" + if("Prisoner") + wearer_say_span = "prisoner" + else + wearer_say_span = "unknown" + if(wearer_say_span) + spanpart2 = "" + else + spanpart2 = "" + else if(isliving(speaker) && !radio_freq) + var/mob/living/L = speaker + spanpart2 = "" + //End name span. var/endspanpart = "" //Message - var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans, message_mode)]" + var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans, message_mods)]" var/languageicon = "" var/datum/language/D = GLOB.language_datum_instances[message_language] @@ -72,7 +102,7 @@ GLOBAL_LIST_INIT(freqtospan, list( /atom/movable/proc/compose_job(atom/movable/speaker, message_langs, raw_message, radio_freq) return "" -/atom/movable/proc/say_mod(input, message_mode) +/atom/movable/proc/say_mod(input, list/message_mods = list()) var/ending = copytext_char(input, -1) if(copytext_char(input, -2) == "!!") return verb_yell @@ -83,7 +113,7 @@ GLOBAL_LIST_INIT(freqtospan, list( else return verb_say -/atom/movable/proc/say_quote(input, list/spans=list(speech_span), message_mode) +/atom/movable/proc/say_quote(input, list/spans=list(speech_span), list/message_mods = list()) if(!input) input = "..." @@ -91,23 +121,23 @@ GLOBAL_LIST_INIT(freqtospan, list( spans |= SPAN_YELL var/spanned = attach_spans(input, spans) - return "[say_mod(input, message_mode)], \"[spanned]\"" + return "[say_mod(input, message_mods)], \"[spanned]\"" -/atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, message_mode) +/atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, list/message_mods = list(), 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 ? raw_message : AM.say_quote(raw_message, spans, message_mods) else - return speaker.say_quote(raw_message, spans, message_mode) + return no_quote ? raw_message : speaker.say_quote(raw_message, spans, message_mods) 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 ? raw_message : AM.say_quote(raw_message, spans, message_mods) else - return speaker.say_quote(raw_message, spans, message_mode) + return no_quote ? raw_message : speaker.say_quote(raw_message, spans, message_mods) else return "makes a strange sound." @@ -165,12 +195,12 @@ GLOBAL_LIST_INIT(freqtospan, list( var/obj/item/radio/radio INITIALIZE_IMMEDIATE(/atom/movable/virtualspeaker) -/atom/movable/virtualspeaker/Initialize(mapload, atom/movable/M, radio) +/atom/movable/virtualspeaker/Initialize(mapload, atom/movable/M, _radio) . = ..() - radio = radio + radio = _radio source = M - if (istype(M)) - name = M.GetVoice() + if(istype(M)) + name = radio.anonymize ? "Unknown" : M.GetVoice() verb_say = M.verb_say verb_ask = M.verb_ask verb_exclaim = M.verb_exclaim diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index e5d58c3e1bfeb..40f90ae08f64f 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -8,7 +8,7 @@ icon = 'icons/turf/shuttle.dmi' resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF max_integrity = 500 - armor = list("melee" = 100, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70) //default + ignores melee + armor = list("melee" = 100, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70, "stamina" = 0) //default + ignores melee /obj/structure/shuttle/engine name = "engine" diff --git a/code/game/sound.dm b/code/game/sound.dm index fd520d61165aa..1e5bde8694aa7 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -1,4 +1,47 @@ -/proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE) + +///Default override for echo +/sound + echo = list( + 0, // Direct + 0, // DirectHF + -10000, // Room, -10000 means no low frequency sound reverb + -10000, // RoomHF, -10000 means no high frequency sound reverb + 0, // Obstruction + 0, // ObstructionLFRatio + 0, // Occlusion + 0.25, // OcclusionLFRatio + 1.5, // OcclusionRoomRatio + 1.0, // OcclusionDirectRatio + 0, // Exclusion + 1.0, // ExclusionLFRatio + 0, // OutsideVolumeHF + 0, // DopplerFactor + 0, // RolloffFactor + 0, // RoomRolloffFactor + 1.0, // AirAbsorptionFactor + 0, // Flags (1 = Auto Direct, 2 = Auto Room, 4 = Auto RoomHF) + ) + environment = SOUND_ENVIRONMENT_NONE //Default to none so sounds without overrides dont get reverb + +/*! playsound + +playsound is a proc used to play a 3D sound in a specific range. This uses SOUND_RANGE + extra_range to determine that. + +source - Origin of sound +soundin - Either a file, or a string that can be used to get an SFX +vol - The volume of the sound, excluding falloff and pressure affection. +vary - bool that determines if the sound changes pitch every time it plays +extrarange - modifier for sound range. This gets added on top of SOUND_RANGE +falloff_exponent - Rate of falloff for the audio. Higher means quicker drop to low volume. Should generally be over 1 to indicate a quick dive to 0 rather than a slow dive. +frequency - playback speed of audio +channel - The channel the sound is played at +pressure_affected - Whether or not difference in pressure affects the sound (E.g. if you can hear in space) +ignore_walls - Whether or not the sound can pass through walls. +falloff_distance - Distance at which falloff begins. Sound is at peak volume (in regards to falloff) aslong as it is in this range. + +*/ + +/proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff_exponent = SOUND_FALLOFF_EXPONENT, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE, falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, use_reverb = TRUE) if(isarea(source)) CRASH("playsound(): source is an area") @@ -7,26 +50,50 @@ if (!turf_source) return + var/maxdistance = (SOUND_RANGE + extrarange) + var/max_z_range = maxdistance / (MULTI_Z_DISTANCE + 1) + + var/list/z_list = get_zs_in_range(turf_source.z, max_z_range) + //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)) - var/maxdistance = (getviewsize(world.view)[1] + extrarange) - var/z = turf_source.z - var/list/listeners = SSmobs.clients_by_zlevel[z] + var/list/listeners = list() + var/list/dead_listeners = list() + for(var/z in z_list) + listeners += SSmobs.clients_by_zlevel[z] + dead_listeners += SSmobs.dead_players_by_zlevel[z] if(!ignore_walls) //these sounds don't carry through walls listeners = listeners & hearers(maxdistance,turf_source) - for(var/P in listeners) - var/mob/M = P + for(var/mob/M as() in listeners) if(get_dist(M, turf_source) <= maxdistance) - M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S) - for(var/P in SSmobs.dead_players_by_zlevel[z]) - var/mob/M = P + M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, 1, use_reverb) + for(var/mob/M as() in dead_listeners) if(get_dist(M, turf_source) <= maxdistance) - M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S) + M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, 1, use_reverb) + +/*! playsound + +playsound_local is a proc used to play a sound directly on a mob from a specific turf. +This is called by playsound to send sounds to players, in which case it also gets the max_distance of that sound. + +turf_source - Origin of sound +soundin - Either a file, or a string that can be used to get an SFX +vol - The volume of the sound, excluding falloff +vary - bool that determines if the sound changes pitch every time it plays +frequency - playback speed of audio +falloff_exponent - Rate of falloff for the audio. Higher means quicker drop to low volume. Should generally be over 1 to indicate a quick dive to 0 rather than a slow dive. +channel - The channel the sound is played at +pressure_affected - Whether or not difference in pressure affects the sound (E.g. if you can hear in space) +max_distance - The peak distance of the sound, if this is a 3D sound +falloff_distance - Distance at which falloff begins, if this is a 3D sound +distance_multiplier - Can be used to multiply the distance at which the sound is heard + +*/ -/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, channel = 0, pressure_affected = TRUE, sound/S) +/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff_exponent = SOUND_FALLOFF_EXPONENT, channel = 0, pressure_affected = TRUE, sound/S, max_distance, falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, distance_multiplier = 1, use_reverb = TRUE) if(!client || !can_hear()) return @@ -34,7 +101,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 if(vary) @@ -49,7 +116,20 @@ //sound volume falloff with distance var/distance = get_dist(T, turf_source) - S.volume -= max(distance - getviewsize(world.view)[1], 0) * 2 //multiplicative falloff to add on top of natural audio falloff. + var/z_change = turf_source.z - T.z + var/z_dist = abs(z_change) * MULTI_Z_DISTANCE + + distance *= distance_multiplier + z_dist *= distance_multiplier + + distance += z_dist + + if(max_distance && distance > max_distance) + return + + if(max_distance) //If theres no max_distance we're not a 3D sound, so no falloff. + S.volume -= (max(distance - falloff_distance, 0) ** (1 / falloff_exponent)) / ((max(max_distance, distance) - falloff_distance) ** (1 / falloff_exponent)) * S.volume + //https://www.desmos.com/calculator/sqdfl8ipgf if(pressure_affected) //Atmosphere affects sound @@ -74,32 +154,75 @@ return //No sound var/dx = turf_source.x - T.x // Hearing from the right/left - S.x = dx + S.x = dx * distance_multiplier var/dz = turf_source.y - T.y // Hearing from infront/behind - 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) + S.y = z_change + 1 + S.falloff = max_distance || 1 //use max_distance, else just use 1 as we are a direct sound so falloff isnt relevant. + + // Sounds can't have their own environment. A sound's environment will be: + // 1. the mob's + // 2. the area's (defaults to SOUND_ENVRIONMENT_NONE) + if(sound_environment_override != SOUND_ENVIRONMENT_NONE) + S.environment = sound_environment_override + else + var/area/A = get_area(src) + S.environment = A.sound_environment + + if(use_reverb && S.environment != SOUND_ENVIRONMENT_NONE) //We have reverb, reset our echo setting + S.echo[3] = 0 //Room setting, 0 means normal reverb + S.echo[4] = 0 //RoomHF setting, 0 means normal reverb. SEND_SOUND(src, S) -/proc/sound_to_playing_players(soundin, volume = 100, vary = FALSE, frequency = 0, falloff = FALSE, channel = 0, pressure_affected = FALSE, sound/S) +/proc/sound_to_playing_players(soundin, volume = 100, vary = FALSE, frequency = 0, channel = 0, pressure_affected = FALSE, sound/S) if(!S) S = sound(get_sfx(soundin)) for(var/m in GLOB.player_list) if(ismob(m) && !isnewplayer(m)) var/mob/M = m - M.playsound_local(M, null, volume, vary, frequency, falloff, channel, pressure_affected, S) + M.playsound_local(M, null, volume, vary, frequency, null, 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 +/proc/play_soundtrack_music(var/datum/soundtrack_song/song, list/hearers = null, volume = 80, ignore_prefs = FALSE, play_to_lobby = FALSE, allow_deaf = TRUE, only_station = FALSE) + var/sound/S = sound(initial(song.file), volume=volume, wait=0, channel=CHANNEL_AMBIENT_MUSIC) + . = S + + if(!hearers) + hearers = GLOB.player_list + + for(var/mob/M as() in hearers) + if (!ismob(M)) + continue + + if (!ignore_prefs && !(M.client?.prefs?.toggles & SOUND_AMBIENCE)) + continue + + if (!play_to_lobby && isnewplayer(M)) + continue + + if (!allow_deaf && !M.can_hear()) + continue + + if (only_station && !is_station_level(M.z)) + continue + + SEND_SOUND(M, S) + + GLOB.soundtrack_this_round |= song + +/proc/stop_soundtrack_music() + for(var/mob/M as() in GLOB.player_list) + M?.stop_sound_channel(CHANNEL_AMBIENT_MUSIC) /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 @@ -145,8 +268,8 @@ soundin = pick('sound/machines/terminal_button01.ogg', 'sound/machines/terminal_button02.ogg', 'sound/machines/terminal_button03.ogg', \ 'sound/machines/terminal_button04.ogg', 'sound/machines/terminal_button05.ogg', 'sound/machines/terminal_button06.ogg', \ 'sound/machines/terminal_button07.ogg', 'sound/machines/terminal_button08.ogg') - if ("desceration") - soundin = pick('sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg') + if ("desecration") + soundin = pick('sound/misc/desecration-01.ogg', 'sound/misc/desecration-02.ogg', 'sound/misc/desecration-03.ogg') if ("im_here") soundin = pick('sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg') if ("can_open") @@ -175,7 +298,6 @@ soundin = pick('sound/machines/sm/accent/delam/1.ogg', 'sound/machines/sm/accent/normal/2.ogg', 'sound/machines/sm/accent/normal/3.ogg', 'sound/machines/sm/accent/normal/4.ogg', 'sound/machines/sm/accent/normal/5.ogg', 'sound/machines/sm/accent/normal/6.ogg', 'sound/machines/sm/accent/normal/7.ogg', 'sound/machines/sm/accent/normal/8.ogg', 'sound/machines/sm/accent/normal/9.ogg', 'sound/machines/sm/accent/normal/10.ogg', 'sound/machines/sm/accent/normal/11.ogg', 'sound/machines/sm/accent/normal/12.ogg', 'sound/machines/sm/accent/normal/13.ogg', 'sound/machines/sm/accent/normal/14.ogg', 'sound/machines/sm/accent/normal/15.ogg', 'sound/machines/sm/accent/normal/16.ogg', 'sound/machines/sm/accent/normal/17.ogg', 'sound/machines/sm/accent/normal/18.ogg', 'sound/machines/sm/accent/normal/19.ogg', 'sound/machines/sm/accent/normal/20.ogg', 'sound/machines/sm/accent/normal/21.ogg', 'sound/machines/sm/accent/normal/22.ogg', 'sound/machines/sm/accent/normal/23.ogg', 'sound/machines/sm/accent/normal/24.ogg', 'sound/machines/sm/accent/normal/25.ogg', 'sound/machines/sm/accent/normal/26.ogg', 'sound/machines/sm/accent/normal/27.ogg', 'sound/machines/sm/accent/normal/28.ogg', 'sound/machines/sm/accent/normal/29.ogg', 'sound/machines/sm/accent/normal/30.ogg', 'sound/machines/sm/accent/normal/31.ogg', 'sound/machines/sm/accent/normal/32.ogg', 'sound/machines/sm/accent/normal/33.ogg') return soundin - /client/proc/channel_in_use(channel) for (var/sound/S in src.SoundQuery()) if (S.channel == channel) diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index b86069189cb45..6cd9266133d27 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -15,9 +15,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(turf_type) var/turf/newT = ChangeTurf(turf_type, baseturf_type, flags) - SSair.remove_from_active(newT) CALCULATE_ADJACENT_TURFS(newT) - SSair.add_to_active(newT,1) /turf/proc/copyTurf(turf/T) if(T.type != type) @@ -54,6 +52,14 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( /turf/proc/TerraformTurf(path, new_baseturf, flags) return ChangeTurf(path, new_baseturf, flags) +/turf/proc/get_z_base_turf() + . = SSmapping.level_trait(z, ZTRAIT_BASETURF) || /turf/open/space + if (!ispath(.)) + . = text2path(.) + if (!ispath(.)) + warning("Z-level [z] has invalid baseturf '[SSmapping.level_trait(z, ZTRAIT_BASETURF)]'") + . = /turf/open/space + // Creates a new turf // new_baseturfs can be either a single type or list of types, formated the same as baseturfs. see turf.dm /turf/proc/ChangeTurf(path, list/new_baseturfs, flags) @@ -61,13 +67,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(null) return if(/turf/baseturf_bottom) - path = SSmapping.level_trait(z, ZTRAIT_BASETURF) - if (!ispath(path)) - var/turf/T = below() - if(T && !istype(T, /turf/open/space)) - path = /turf/open/openspace - else - path = /turf/open/space + path = get_z_base_turf() if(/turf/open/space/basic) // basic doesn't initialize and this will cause issues // no warning though because this can happen naturaly as a result of it being built on top of @@ -138,7 +138,6 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( /turf/open/ChangeTurf(path, list/new_baseturfs, flags) if ((flags & CHANGETURF_INHERIT_AIR) && ispath(path, /turf/open)) - SSair.remove_from_active(src) var/datum/gas_mixture/stashed_air = new() stashed_air.copy_from(air) . = ..() @@ -147,13 +146,17 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( return var/turf/open/newTurf = . newTurf.air.copy_from(stashed_air) + update_air_ref(planetary_atmos ? 1 : 2) QDEL_NULL(stashed_air) - update_air_ref() - SSair.add_to_active(newTurf) else if(ispath(path,/turf/closed)) flags |= CHANGETURF_RECALC_ADJACENT - return ..() + update_air_ref(-1) + . = ..() + else + . = ..() + if(!istype(air,/datum/gas_mixture)) + Initalize_Atmos(0) /turf/closed/ChangeTurf(path, list/new_baseturfs, flags) if(ispath(path,/turf/open)) @@ -170,7 +173,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( while(ispath(turf_type, /turf/baseturf_skipover)) amount++ if(amount > new_baseturfs.len) - CRASH("The bottomost baseturf of a turf is a skipover [src]([type])") + CRASH("The bottommost baseturf of a turf is a skipover [src]([type])") turf_type = new_baseturfs[max(1, new_baseturfs.len - amount + 1)] new_baseturfs.len -= min(amount, new_baseturfs.len - 1) // No removing the very bottom if(new_baseturfs.len == 1) @@ -318,7 +321,6 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( total.merge(S.air) air.copy_from(total.remove_ratio(1/turf_count)) - SSair.add_to_active(src) /turf/proc/ReplaceWithLattice() ScrapeAway(flags = CHANGETURF_INHERIT_AIR) diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index 2cf04297a40e9..ccce019a70e10 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -8,12 +8,10 @@ /turf/closed/Initialize() . = ..() - update_air_ref() /turf/closed/AfterChange() . = ..() SSair.high_pressure_delta -= src - update_air_ref() /turf/closed/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) return FALSE diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index a399b5dbea31d..7be3a05b271a0 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -12,13 +12,11 @@ opacity = 1 density = TRUE layer = EDGED_TURF_LAYER - temperature = TCMB + initial_temperature = 293.15 var/environment_type = "asteroid" var/turf/open/floor/plating/turf_type = /turf/open/floor/plating/asteroid/airless - var/mineralType = null + var/obj/item/stack/ore/mineralType = null var/mineralAmt = 3 - var/spread = 0 //will the seam spread? - var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles var/last_act = 0 var/scan_state = "" //Holder for the image we display when we're pinged by a mining scanner var/defer_change = 0 @@ -31,12 +29,24 @@ transform = M icon = smooth_icon . = ..() - if (mineralType && mineralAmt && spread && spreadChance) + +/turf/closed/mineral/proc/Spread_Vein() + var/spreadChance = initial(mineralType.spreadChance) + if(spreadChance) for(var/dir in GLOB.cardinals) if(prob(spreadChance)) var/turf/T = get_step(src, dir) - if(istype(T, /turf/closed/mineral/random)) - Spread(T) + var/turf/closed/mineral/random/M = T + if(istype(M) && !M.mineralType) + M.Change_Ore(mineralType) + +/turf/closed/mineral/proc/Change_Ore(var/ore_type, random = 0) + if(random) + mineralAmt = rand(1, 5) + if(ispath(ore_type, /obj/item/stack/ore)) //If it has a scan_state, switch to it + var/obj/item/stack/ore/the_ore = ore_type + scan_state = initial(the_ore.scan_state) // I SAID. SWITCH. TO. IT. + mineralType = ore_type // Everything else assumes that this is typed correctly so don't set it to non-ores thanks. /turf/closed/mineral/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) if(turf_type) @@ -126,45 +136,46 @@ gets_drilled(null, 1) return -/turf/closed/mineral/Spread(turf/T) - T.ChangeTurf(type) - /turf/closed/mineral/random - var/list/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 = 2, /turf/closed/mineral/bscrystal = 1, - /turf/closed/mineral/copper = 15) + var/list/mineralSpawnChanceList = list(/obj/item/stack/ore/uranium = 5, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 10, + /obj/item/stack/ore/silver = 12, /obj/item/stack/ore/plasma = 20, /obj/item/stack/ore/iron = 40, /obj/item/stack/ore/titanium = 11, + /turf/closed/mineral/gibtonite = 4, /obj/item/stack/ore/bluespace_crystal = 1, + /obj/item/stack/ore/copper = 15) //Currently, Adamantine won't spawn as it has no uses. -Durandan var/mineralChance = 13 - var/display_icon_state = "rock" /turf/closed/mineral/random/Initialize() mineralSpawnChanceList = typelist("mineralSpawnChanceList", mineralSpawnChanceList) - if (display_icon_state) - icon_state = display_icon_state . = ..() if (prob(mineralChance)) var/path = pickweight(mineralSpawnChanceList) - var/turf/T = ChangeTurf(path,null,CHANGETURF_IGNORE_AIR) - - if(T && ismineralturf(T)) - var/turf/closed/mineral/M = T - M.mineralAmt = rand(1, 5) - M.environment_type = src.environment_type - M.turf_type = src.turf_type - M.baseturfs = src.baseturfs - src = M - M.levelupdate() + if(ispath(path, /turf)) + var/turf/T = ChangeTurf(path,null,CHANGETURF_IGNORE_AIR) + + T.baseturfs = src.baseturfs + if(ismineralturf(T)) + var/turf/closed/mineral/M = T + M.turf_type = src.turf_type + M.mineralAmt = rand(1, 5) + M.environment_type = src.environment_type + src = M + M.levelupdate() + else + src = T + T.levelupdate() + else + Change_Ore(path, 1) + Spread_Vein(path) /turf/closed/mineral/random/high_chance icon_state = "rock_highchance" mineralChance = 25 mineralSpawnChanceList = list( - /turf/closed/mineral/uranium = 35, /turf/closed/mineral/diamond = 30, /turf/closed/mineral/gold = 45, /turf/closed/mineral/titanium = 45, - /turf/closed/mineral/silver = 50, /turf/closed/mineral/copper = 50,/turf/closed/mineral/plasma = 50, /turf/closed/mineral/bscrystal = 20) + /obj/item/stack/ore/uranium = 35, /obj/item/stack/ore/diamond = 30, /obj/item/stack/ore/gold = 45, /obj/item/stack/ore/titanium = 45, + /obj/item/stack/ore/silver = 50, /obj/item/stack/ore/copper = 50, /obj/item/stack/ore/plasma = 50, /obj/item/stack/ore/bluespace_crystal = 20) /turf/closed/mineral/random/high_chance/volcanic environment_type = "basalt" @@ -173,18 +184,17 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 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/copper/volcanic = 50, /turf/closed/mineral/plasma/volcanic = 50, /turf/closed/mineral/bscrystal/volcanic = 20) - + /obj/item/stack/ore/uranium = 35, /obj/item/stack/ore/diamond = 30, /obj/item/stack/ore/gold = 45, /obj/item/stack/ore/titanium = 45, + /obj/item/stack/ore/silver = 50, /obj/item/stack/ore/copper = 50, /obj/item/stack/ore/plasma = 50, /obj/item/stack/ore/bluespace_crystal) /turf/closed/mineral/random/low_chance icon_state = "rock_lowchance" mineralChance = 6 mineralSpawnChanceList = list( - /turf/closed/mineral/uranium = 2, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 4, /turf/closed/mineral/titanium = 4, - /turf/closed/mineral/silver = 6, /turf/closed/mineral/copper = 6, /turf/closed/mineral/plasma = 15, /turf/closed/mineral/iron = 40, - /turf/closed/mineral/gibtonite = 2, /turf/closed/mineral/bscrystal = 1) + /obj/item/stack/ore/uranium = 2, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 4, /obj/item/stack/ore/titanium = 4, + /obj/item/stack/ore/silver = 6, /obj/item/stack/ore/copper = 6, /obj/item/stack/ore/plasma = 15, /obj/item/stack/ore/iron = 40, + /turf/closed/mineral/gibtonite = 2, /obj/item/stack/ore/bluespace_crystal = 1) /turf/closed/mineral/random/volcanic @@ -196,15 +206,15 @@ mineralChance = 10 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/copper/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) + /obj/item/stack/ore/uranium = 5, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 10, /obj/item/stack/ore/titanium = 11, + /obj/item/stack/ore/silver = 12, /obj/item/stack/ore/copper = 12, /obj/item/stack/ore/plasma = 20, /obj/item/stack/ore/iron = 40, + /turf/closed/mineral/gibtonite/volcanic = 4, /obj/item/stack/ore/bluespace_crystal = 1) /turf/closed/mineral/random/labormineral mineralSpawnChanceList = list( - /turf/closed/mineral/uranium = 3, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 8, /turf/closed/mineral/titanium = 8, - /turf/closed/mineral/silver = 20, /turf/closed/mineral/copper = 20, /turf/closed/mineral/plasma = 30, /turf/closed/mineral/iron = 95, + /obj/item/stack/ore/uranium = 3, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 8, /obj/item/stack/ore/titanium = 8, + /obj/item/stack/ore/silver = 20, /obj/item/stack/ore/copper = 20, /obj/item/stack/ore/plasma = 30, /obj/item/stack/ore/iron = 95, /turf/closed/mineral/gibtonite = 2) icon_state = "rock_labor" @@ -216,25 +226,16 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 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/copper/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) - + /obj/item/stack/ore/uranium = 3, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 8, /obj/item/stack/ore/titanium = 8, + /obj/item/stack/ore/silver = 20, /obj/item/stack/ore/copper = 20, /obj/item/stack/ore/plasma = 30, /obj/item/stack/ore/bluespace_crystal = 1, /turf/closed/mineral/gibtonite/volcanic = 2, + /obj/item/stack/ore/iron = 95) +// Subtypes for mappers placing ores manually. /turf/closed/mineral/iron mineralType = /obj/item/stack/ore/iron - spreadChance = 20 - spread = 1 scan_state = "rock_Iron" -/turf/closed/mineral/iron/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 - /turf/closed/mineral/iron/ice environment_type = "snow_cavern" icon_state = "icerock_iron" @@ -244,11 +245,8 @@ initial_gas_mix = FROZEN_ATMOS defer_change = TRUE - /turf/closed/mineral/uranium mineralType = /obj/item/stack/ore/uranium - spreadChance = 5 - spread = 1 scan_state = "rock_Uranium" /turf/closed/mineral/uranium/volcanic @@ -261,8 +259,6 @@ /turf/closed/mineral/diamond mineralType = /obj/item/stack/ore/diamond - spreadChance = 0 - spread = 1 scan_state = "rock_Diamond" /turf/closed/mineral/diamond/volcanic @@ -274,18 +270,15 @@ /turf/closed/mineral/diamond/ice environment_type = "snow_cavern" - icon_state = "icerock_diamond" + icon_state = "icerock_iron" 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 mineralType = /obj/item/stack/ore/gold - spreadChance = 5 - spread = 1 scan_state = "rock_Gold" /turf/closed/mineral/gold/volcanic @@ -298,8 +291,6 @@ /turf/closed/mineral/silver mineralType = /obj/item/stack/ore/silver - spreadChance = 5 - spread = 1 scan_state = "rock_Silver" /turf/closed/mineral/silver/volcanic @@ -311,8 +302,6 @@ /turf/closed/mineral/copper mineralType = /obj/item/stack/ore/copper - spreadChance = 5 - spread = 1 scan_state = "rock_Copper" /turf/closed/mineral/copper/volcanic @@ -324,8 +313,6 @@ /turf/closed/mineral/titanium mineralType = /obj/item/stack/ore/titanium - spreadChance = 5 - spread = 1 scan_state = "rock_Titanium" /turf/closed/mineral/titanium/volcanic @@ -338,8 +325,6 @@ /turf/closed/mineral/plasma mineralType = /obj/item/stack/ore/plasma - spreadChance = 8 - spread = 1 scan_state = "rock_Plasma" /turf/closed/mineral/plasma/volcanic @@ -363,16 +348,11 @@ /turf/closed/mineral/bananium mineralType = /obj/item/stack/ore/bananium mineralAmt = 3 - spreadChance = 0 - spread = 0 scan_state = "rock_Bananium" - /turf/closed/mineral/bscrystal mineralType = /obj/item/stack/ore/bluespace_crystal mineralAmt = 1 - spreadChance = 0 - spread = 0 scan_state = "rock_BScrystal" /turf/closed/mineral/bscrystal/volcanic @@ -436,8 +416,6 @@ /turf/closed/mineral/gibtonite mineralAmt = 1 - spreadChance = 0 - spread = 0 scan_state = "rock_Gibtonite" var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it var/stage = GIBTONITE_UNSTRUCK //How far into the lifecycle of gibtonite we are @@ -509,7 +487,7 @@ stage = GIBTONITE_DETONATE explosion(bombturf,1,2,5, adminlog = 0) if(stage == GIBTONITE_STABLE) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore. - var/obj/item/twohanded/required/gibtonite/G = new (src) + var/obj/item/gibtonite/G = new (src) if(det_time <= 0) G.quality = 3 G.icon_state = "Gibtonite ore 3" diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index 0e5dbce952bd8..6b77928d41168 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -73,7 +73,7 @@ if(world.time > last_event+15) active = 1 radiation_pulse(src, 40) - for(var/turf/closed/wall/mineral/uranium/T in orange(1,src)) + for(var/turf/closed/wall/mineral/uranium/T in (RANGE_TURFS(1,src)-src)) T.radiate() last_event = world.time active = null @@ -141,9 +141,9 @@ canSmoothWith = list(/turf/closed/wall/mineral/wood, /obj/structure/falsewall/wood, /turf/closed/wall/mineral/wood/nonmetal) /turf/closed/wall/mineral/wood/attackby(obj/item/W, mob/user) - if(W.sharpness && W.force) + if(W.is_sharp() && W.force) var/duration = (48/W.force) * 2 //In seconds, for now. - if(istype(W, /obj/item/hatchet) || istype(W, /obj/item/twohanded/fireaxe)) + if(istype(W, /obj/item/hatchet) || istype(W, /obj/item/fireaxe)) duration /= 4 //Much better with hatchets and axes. if(do_after(user, duration*10, target=src)) //Into deciseconds. dismantle_wall(FALSE,FALSE) @@ -197,7 +197,8 @@ 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 + flags_ricochet = RICOCHET_SHINY | RICOCHET_HARD 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) @@ -264,6 +265,9 @@ smooth = SMOOTH_MORE|SMOOTH_DIAGONAL canSmoothWith = list(/turf/closed/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plastitanium, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) +/turf/closed/wall/mineral/plastitanium/try_destroy(obj/item/I, mob/user, turf/T) + return FALSE + /turf/closed/wall/mineral/plastitanium/nodiagonal smooth = SMOOTH_MORE icon_state = "map-shuttle_nd" @@ -278,14 +282,8 @@ fixed_underlay = list("space"=1) /turf/closed/wall/mineral/plastitanium/explosive/ex_act(severity) - var/datum/explosion/acted_explosion = null - for(var/datum/explosion/E in GLOB.explosions) - if(E.explosion_id == explosion_id) - acted_explosion = E - break - if(acted_explosion && istype(acted_explosion.explosion_source, /obj/item/bombcore)) - var/obj/item/bombcore/large/bombcore = new(get_turf(src)) - bombcore.detonate() + var/obj/item/bombcore/large/bombcore = new(get_turf(src)) + bombcore.detonate() ..() //have to copypaste this code diff --git a/code/game/turfs/closed/wall/misc_walls.dm b/code/game/turfs/closed/wall/misc_walls.dm index f21f8be704a03..f2806be5fffc8 100644 --- a/code/game/turfs/closed/wall/misc_walls.dm +++ b/code/game/turfs/closed/wall/misc_walls.dm @@ -16,6 +16,9 @@ /turf/closed/wall/mineral/cult/devastate_wall() new sheet_type(get_turf(src), sheet_amount) +/turf/closed/wall/mineral/cult/try_destroy(obj/item/I, mob/user, turf/T) + return FALSE + /turf/closed/wall/mineral/cult/Exited(atom/movable/AM, atom/newloc) . = ..() if(istype(AM, /mob/living/simple_animal/hostile/construct/harvester)) //harvesters can go through cult walls, dragging something with @@ -83,3 +86,25 @@ sheet_amount = 2 girder_type = /obj/structure/girder/bronze + +/turf/closed/indestructible/cordon + name = "cordon" + desc = "The final word in problem solving." + icon_state = "cordon" + +//Will this look good? No. Will it work? Probably. + +/turf/closed/indestructible/cordon/Entered(atom/movable/AM) + . = ..() + if(isobserver(AM)) + return + if(ismob(AM)) + var/mob/interloper = AM + interloper.death() + if(ismecha(AM)) + var/obj/mecha/fuckphazons = AM + var/mob/living/carbon/interloper = fuckphazons.occupant + interloper?.death() + qdel(interloper) + + qdel(AM) diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm index 27bb5f8233974..78dd5e0c1a8c3 100644 --- a/code/game/turfs/closed/wall/reinf_walls.dm +++ b/code/game/turfs/closed/wall/reinf_walls.dm @@ -51,15 +51,6 @@ to_chat(M, "This wall is far too strong for you to destroy.") /turf/closed/wall/r_wall/try_destroy(obj/item/I, mob/user, turf/T) - if(istype(I, /obj/item/pickaxe/drill/jackhammer)) - to_chat(user, "You begin to smash though [src]...") - if(do_after(user, 50, target = src)) - if(!istype(src, /turf/closed/wall/r_wall)) - return TRUE - I.play_tool_sound(src) - visible_message("[user] smashes through [src] with [I]!", "You hear the grinding of metal.") - dismantle_wall() - return TRUE return FALSE /turf/closed/wall/r_wall/try_decon(obj/item/W, mob/user, turf/T) @@ -70,140 +61,140 @@ W.play_tool_sound(src, 100) d_state = SUPPORT_LINES update_icon() - to_chat(user, "You cut the outer grille.") - return 1 + balloon_alert(user, "Outer grille cut") + return TRUE if(SUPPORT_LINES) if(W.tool_behaviour == TOOL_SCREWDRIVER) - to_chat(user, "You begin unsecuring the support lines...") + balloon_alert(user, "You begin unsecuring the support lines") if(W.use_tool(src, user, 40, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != SUPPORT_LINES) - return 1 + return TRUE d_state = COVER update_icon() - to_chat(user, "You unsecure the support lines.") - return 1 + balloon_alert(user, "Support lines unsecured") + return TRUE else if(W.tool_behaviour == TOOL_WIRECUTTER) W.play_tool_sound(src, 100) d_state = INTACT update_icon() - to_chat(user, "You repair the outer grille.") - return 1 + balloon_alert(user, "Outer grille repaired") + return TRUE if(COVER) if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return - to_chat(user, "You begin slicing through the metal cover...") + balloon_alert(user, "You begin slicing through the metal cover") if(W.use_tool(src, user, 60, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != COVER) - return 1 + return TRUE d_state = CUT_COVER update_icon() - to_chat(user, "You press firmly on the cover, dislodging it.") - return 1 + balloon_alert(user, "Metal cover removed") + return TRUE if(W.tool_behaviour == TOOL_SCREWDRIVER) - to_chat(user, "You begin securing the support lines...") + balloon_alert(user, "You begin securing the support lines") if(W.use_tool(src, user, 40, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != COVER) - return 1 + return TRUE d_state = SUPPORT_LINES update_icon() - to_chat(user, "The support lines have been secured.") - return 1 + balloon_alert(user, "Support lines have been secured") + return TRUE if(CUT_COVER) if(W.tool_behaviour == TOOL_CROWBAR) - to_chat(user, "You struggle to pry off the cover...") + balloon_alert(user, "You struggle to pry off the cover") if(W.use_tool(src, user, 100, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != CUT_COVER) - return 1 + return TRUE d_state = ANCHOR_BOLTS update_icon() - to_chat(user, "You pry off the cover.") - return 1 + balloon_alert(user, "Cover pried off") + return TRUE if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return - to_chat(user, "You begin welding the metal cover back to the frame...") + balloon_alert(user, "You begin welding the metal cover back to the frame") if(W.use_tool(src, user, 60, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != CUT_COVER) return TRUE d_state = COVER update_icon() - to_chat(user, "The metal cover has been welded securely to the frame.") - return 1 + balloon_alert(user, "Metal cover welded to the frame") + return TRUE if(ANCHOR_BOLTS) if(W.tool_behaviour == TOOL_WRENCH) - to_chat(user, "You start loosening the anchoring bolts which secure the support rods to their frame...") + balloon_alert(user, "You start loosening the anchoring bolts which secure the support rods to their frame") if(W.use_tool(src, user, 40, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != ANCHOR_BOLTS) - return 1 + return TRUE d_state = SUPPORT_RODS update_icon() - to_chat(user, "You remove the bolts anchoring the support rods.") - return 1 + balloon_alert(user, "Bolts removed") + return TRUE if(W.tool_behaviour == TOOL_CROWBAR) - to_chat(user, "You start to pry the cover back into place...") + balloon_alert(user, "You start to pry the cover back into place") if(W.use_tool(src, user, 20, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != ANCHOR_BOLTS) - return 1 + return TRUE d_state = CUT_COVER update_icon() - to_chat(user, "The metal cover has been pried back into place.") - return 1 + balloon_alert(user, "The metal cover pried back into place") + return TRUE if(SUPPORT_RODS) if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return - to_chat(user, "You begin slicing through the support rods...") + balloon_alert(user, "You start slicing through the support rods") if(W.use_tool(src, user, 100, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != SUPPORT_RODS) - return 1 + return TRUE d_state = SHEATH update_icon() - to_chat(user, "You slice through the support rods.") - return 1 + balloon_alert(user, "Support rods sliced through") + return TRUE if(W.tool_behaviour == TOOL_WRENCH) - to_chat(user, "You start tightening the bolts which secure the support rods to their frame...") + balloon_alert(user, "You start tightening the bolts securing support rods") W.play_tool_sound(src, 100) if(W.use_tool(src, user, 40)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != SUPPORT_RODS) - return 1 + return TRUE d_state = ANCHOR_BOLTS update_icon() - to_chat(user, "You tighten the bolts anchoring the support rods.") - return 1 + balloon_alert(user, "Bolts tightened") + return TRUE if(SHEATH) if(W.tool_behaviour == TOOL_CROWBAR) - to_chat(user, "You struggle to pry off the outer sheath...") + balloon_alert(user, "You start prying off the outer sheath") if(W.use_tool(src, user, 100, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != SHEATH) - return 1 - to_chat(user, "You pry off the outer sheath.") + return TRUE + balloon_alert(user, "Outer sheath pried off") dismantle_wall() - return 1 + return TRUE if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return - to_chat(user, "You begin welding the support rods back together...") + balloon_alert(user, "You start welding the support rods back together") if(W.use_tool(src, user, 100, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != SHEATH) return TRUE d_state = SUPPORT_RODS update_icon() - to_chat(user, "You weld the support rods back together.") - return 1 - return 0 + balloon_alert(user, "Support rods welded back together") + return TRUE + return FALSE /turf/closed/wall/r_wall/update_icon() . = ..() diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index 978a7cded7e1b..2b7d523d96c76 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -12,6 +12,8 @@ baseturfs = /turf/open/floor/plating + flags_ricochet = RICOCHET_HARD + FASTDMM_PROP(\ pipe_astar_cost = 35\ ) @@ -35,6 +37,16 @@ var/list/dent_decals +/turf/closed/wall/Initialize(mapload) + . = ..() + if(is_station_level(z)) + GLOB.station_turfs += src + +/turf/closed/wall/Destroy() + if(is_station_level(z)) + GLOB.station_turfs -= src + return ..() + /turf/closed/wall/examine(mob/user) . += ..() . += deconstruction_hints(user) @@ -45,17 +57,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() @@ -192,10 +193,10 @@ if(!W.tool_start_check(user, amount=0)) return FALSE - to_chat(user, "You begin fixing dents on the wall...") + balloon_alert(user, "You begin fixing dents on the wall") if(W.use_tool(src, user, 0, volume=100)) if(iswallturf(src) && LAZYLEN(dent_decals)) - to_chat(user, "You fix some dents on the wall.") + balloon_alert(user, "Some dents on the wall were fixed") cut_overlay(dent_decals) dent_decals.Cut() return TRUE @@ -213,10 +214,6 @@ else if(istype(W, /obj/item/poster)) place_poster(W,user) return TRUE - else if(istype(W, /obj/item/electronic_assembly/wallmount)) // circuit wallmount - var/obj/item/electronic_assembly/wallmount/A = W - A.mount_assembly(src, user) - return TRUE return FALSE @@ -225,10 +222,10 @@ if(!I.tool_start_check(user, amount=0)) return FALSE - to_chat(user, "You begin slicing through the outer plating...") + balloon_alert(user, "You start slicing through outer plating") if(I.use_tool(src, user, slicing_duration, volume=100)) if(iswallturf(src)) - to_chat(user, "You remove the outer plating.") + balloon_alert(user, "Outer plating removed") dismantle_wall() return TRUE diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index a2463bae1b464..c9b86102a443d 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -126,10 +126,11 @@ CanAtmosPass = ATMOS_PASS_NO baseturfs = /turf/open/indestructible/binary icon_state = "binary" - footstep = null + footstep = FOOTSTEP_PLATING barefootstep = null clawfootstep = null heavyfootstep = null + slowdown = 3 /turf/open/indestructible/airblock icon_state = "bluespace" @@ -137,18 +138,16 @@ baseturfs = /turf/open/indestructible/airblock /turf/open/Initalize_Atmos(times_fired) - set_excited(FALSE) + if(!blocks_air) + if(!istype(air,/datum/gas_mixture/turf)) + air = new(2500,src) + air.copy_from_turf(src) + update_air_ref(planetary_atmos ? 1 : 2) + update_visuals() - current_cycle = times_fired ImmediateCalculateAdjacentTurfs() - for(var/i in atmos_adjacent_turfs) - var/turf/open/enemy_tile = i - var/datum/gas_mixture/enemy_air = enemy_tile.return_air() - if(!get_excited() && air.compare(enemy_air)) - //testing("Active turf found. Return value of compare(): [is_active]") - set_excited(TRUE) - SSair.active_turfs |= src + /turf/open/proc/GetHeatCapacity() . = air.heat_capacity() @@ -194,7 +193,7 @@ if(!(lube&GALOSHES_DONT_HELP)) //can't slip while buckled unless it's lube. return 0 else - if(!(C.mobility_flags & MOBILITY_STAND) || !(C.status_flags & CANKNOCKDOWN)) // can't slip unbuckled mob if they're lying or can't fall. + if(!(lube & SLIP_WHEN_CRAWLING) && (!(C.mobility_flags & MOBILITY_STAND) || !(C.status_flags & CANKNOCKDOWN))) // can't slip unbuckled mob if they're lying or can't fall. return 0 if(C.m_intent == MOVE_INTENT_WALK && (lube&NO_SLIP_WHEN_WALKING)) return 0 @@ -244,8 +243,8 @@ /turf/open/rad_act(pulse_strength) . = ..() - if (air.get_moles(/datum/gas/carbon_dioxide) && air.get_moles(/datum/gas/oxygen)) - pulse_strength = min(pulse_strength,air.get_moles(/datum/gas/carbon_dioxide)*1000,air.get_moles(/datum/gas/oxygen)*2000) //Ensures matter is conserved properly - air.set_moles(/datum/gas/carbon_dioxide, max(air.get_moles(/datum/gas/carbon_dioxide)-(pulse_strength/1000),0)) - air.set_moles(/datum/gas/oxygen, max(air.get_moles(/datum/gas/oxygen)-(pulse_strength/2000),0)) - air.adjust_moles(/datum/gas/pluoxium, pulse_strength/4000) + if (air.get_moles(GAS_CO2) && air.get_moles(GAS_O2)) + pulse_strength = min(pulse_strength,air.get_moles(GAS_CO2)*1000,air.get_moles(GAS_O2)*2000) //Ensures matter is conserved properly + air.set_moles(GAS_CO2, max(air.get_moles(GAS_CO2)-(pulse_strength/1000),0)) + air.set_moles(GAS_O2, max(air.get_moles(GAS_O2)-(pulse_strength/2000),0)) + air.adjust_moles(GAS_PLUOXIUM, pulse_strength/4000) diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index 5b523e1ff6c25..264079ad9afe5 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -13,7 +13,7 @@ var/icon_regular_floor = "floor" //used to remember what icon the tile should have by default var/icon_plating = "plating" - thermal_conductivity = 0.040 + thermal_conductivity = 0.04 heat_capacity = 10000 intact = 1 var/broken = 0 @@ -56,6 +56,13 @@ icon_regular_floor = icon_state if(mapload && prob(33)) MakeDirty() + if(is_station_level(z)) + GLOB.station_turfs += src + +/turf/open/floor/Destroy() + if(is_station_level(z)) + GLOB.station_turfs -= src + return ..() /turf/open/floor/ex_act(severity, target) var/shielded = is_shielded() @@ -166,7 +173,7 @@ /turf/open/floor/proc/try_replace_tile(obj/item/stack/tile/T, mob/user, params) if(T.turf_type == type) return - var/obj/item/crowbar/CB = user.is_holding_item_of_type(/obj/item/crowbar) + var/obj/item/CB = user.is_holding_tool_quality(TOOL_CROWBAR) if(!CB) return var/turf/open/floor/plating/P = pry_tile(CB, user, TRUE) @@ -261,18 +268,19 @@ return FALSE to_chat(user, "You build an airlock.") var/obj/machinery/door/airlock/A = new the_rcd.airlock_type(src) - - A.electronics = new/obj/item/electronics/airlock(A) - - if(the_rcd.conf_access) - A.electronics.accesses = the_rcd.conf_access.Copy() - A.electronics.one_access = the_rcd.use_one_access - + A.electronics = new /obj/item/electronics/airlock(A) + if(the_rcd.airlock_electronics) + A.electronics.accesses = the_rcd.airlock_electronics.accesses.Copy() + A.electronics.one_access = the_rcd.airlock_electronics.one_access + A.electronics.unres_sides = the_rcd.airlock_electronics.unres_sides if(A.electronics.one_access) A.req_one_access = A.electronics.accesses else A.req_access = A.electronics.accesses + if(A.electronics.unres_sides) + A.unres_sides = A.electronics.unres_sides A.autoclose = TRUE + A.update_icon() return TRUE if(RCD_DECONSTRUCT) if(ScrapeAway(flags = CHANGETURF_INHERIT_AIR) == src) diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index 259412b26d36b..81812a344527d 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -30,9 +30,9 @@ /turf/open/floor/wood/try_replace_tile(obj/item/stack/tile/T, mob/user, params) if(T.turf_type == type) return - var/obj/item/tool = user.is_holding_item_of_type(/obj/item/screwdriver) + var/obj/item/tool = user.is_holding_tool_quality(TOOL_SCREWDRIVER) if(!tool) - tool = user.is_holding_item_of_type(/obj/item/crowbar) + tool = user.is_holding_tool_quality(TOOL_CROWBAR) if(!tool) return var/turf/open/floor/plating/P = pry_tile(tool, user, TRUE) @@ -62,7 +62,7 @@ return make_plating() /turf/open/floor/wood/cold - temperature = 255.37 + initial_temperature = 255.37 /turf/open/floor/wood/airless initial_gas_mix = AIRLESS_ATMOS @@ -96,6 +96,56 @@ if(..()) return +/turf/open/floor/grass/fairy //like grass but fae-er + name = "fairygrass patch" + desc = "Something about this grass makes you want to frolic. Or get high." + icon_state = "fairygrass" + floor_tile = /obj/item/stack/tile/fairygrass + light_range = 2 + light_power = 0.80 + light_color = "#33CCFF" + color = "#33CCFF" + +/turf/open/floor/grass/fairy/white + name = "white fairygrass patch" + floor_tile = /obj/item/stack/tile/fairygrass/white + light_color = "#FFFFFF" + color = "#FFFFFF" + +/turf/open/floor/grass/fairy/red + name = "red fairygrass patch" + floor_tile = /obj/item/stack/tile/fairygrass/red + light_color = "#FF3333" + color = "#FF3333" + +/turf/open/floor/grass/fairy/yellow + name = "yellow fairygrass patch" + floor_tile = /obj/item/stack/tile/fairygrass/yellow + light_color = "#FFFF66" + color = "#FFFF66" + +/turf/open/floor/grass/fairy/green + name = "green fairygrass patch" + floor_tile = /obj/item/stack/tile/fairygrass/green + light_color = "#99FF99" + color = "#99FF99" + +/turf/open/floor/grass/fairy/blue + floor_tile = /obj/item/stack/tile/fairygrass/blue + name = "blue fairygrass patch" + +/turf/open/floor/grass/fairy/purple + name = "purple fairygrass patch" + floor_tile = /obj/item/stack/tile/fairygrass/purple + light_color = "#D966FF" + color = "#D966FF" + +/turf/open/floor/grass/fairy/pink + name = "pink fairygrass patch" + floor_tile = /obj/item/stack/tile/fairygrass/pink + light_color = "#FFB3DA" + color = "#FFB3DA" + /turf/open/floor/grass/snow gender = PLURAL name = "snow" @@ -300,3 +350,16 @@ underlay_appearance.plane = PLANE_SPACE return TRUE +/turf/open/floor/wax + name = "wax" + icon_state = "honeyfloor" + desc = "Hard wax. Makes you feel like part of a hive." + floor_tile = /obj/item/stack/tile/mineral/wax + footstep = FOOTSTEP_WOOD + barefootstep = FOOTSTEP_WOOD_BAREFOOT + clawfootstep = FOOTSTEP_WOOD_CLAW + heavyfootstep = FOOTSTEP_GENERIC_HEAVY + tiled_dirt = FALSE + +/turf/open/floor/wax/airless + initial_gas_mix = AIRLESS_ATMOS \ No newline at end of file diff --git a/code/game/turfs/open/floor/mineral_floor.dm b/code/game/turfs/open/floor/mineral_floor.dm index df5dd1bd8032c..df2813221bceb 100644 --- a/code/game/turfs/open/floor/mineral_floor.dm +++ b/code/game/turfs/open/floor/mineral_floor.dm @@ -226,7 +226,7 @@ if(world.time > last_event+15) active = 1 radiation_pulse(src, 10) - for(var/turf/open/floor/mineral/uranium/T in orange(1,src)) + for(var/turf/open/floor/mineral/uranium/T in (RANGE_TURFS(1,src)-src)) T.radiate() last_event = world.time active = 0 diff --git a/code/game/turfs/open/floor/plasteel_floor.dm b/code/game/turfs/open/floor/plasteel_floor.dm index 465f3a60bb24a..ec18886b6083d 100644 --- a/code/game/turfs/open/floor/plasteel_floor.dm +++ b/code/game/turfs/open/floor/plasteel_floor.dm @@ -88,14 +88,6 @@ initial_gas_mix = AIRLESS_ATMOS -/turf/open/floor/plasteel/kitchen_coldroom - name = "cold room floor" - initial_gas_mix = KITCHEN_COLDROOM_ATMOS - -/turf/open/floor/plasteel/kitchen_coldroom/freezerfloor - icon_state = "freezerfloor" - - /turf/open/floor/plasteel/grimy icon_state = "grimy" tiled_dirt = FALSE diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index de6b47d7dd304..ac26c75de5e71 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -28,7 +28,7 @@ . += "It looks like the dents could be welded smooth." return if(attachment_holes) - . += "There are a few attachment holes for a new tile or reinforcement rods." + . += "There are a few attachment holes for a new tile, reinforcement sheets or catwalk rods." else . += "You might be able to build ontop of it with some tiles..." diff --git a/code/game/turfs/open/floor/plating/asteroid.dm b/code/game/turfs/open/floor/plating/asteroid.dm index 7452f168caa0b..ca1bdf8d1e0c0 100644 --- a/code/game/turfs/open/floor/plating/asteroid.dm +++ b/code/game/turfs/open/floor/plating/asteroid.dm @@ -129,180 +129,9 @@ baseturfs = /turf/open/floor/plating/asteroid/airless turf_type = /turf/open/floor/plating/asteroid/airless - -#define SPAWN_MEGAFAUNA "bluh bluh huge boss" -#define SPAWN_BUBBLEGUM 6 - -/turf/open/floor/plating/asteroid/airless/cave - var/length = 100 - var/list/mob_spawn_list - var/list/megafauna_spawn_list - var/list/flora_spawn_list - var/list/terrain_spawn_list - var/sanity = 1 - var/forward_cave_dir = 1 - var/backward_cave_dir = 2 - var/going_backwards = TRUE - var/has_data = FALSE - var/data_having_type = /turf/open/floor/plating/asteroid/airless/cave/has_data - 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 - has_data = TRUE - -/turf/open/floor/plating/asteroid/airless/cave/volcanic - mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /obj/structure/spawner/lavaland/goliath = 3, \ - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40, /obj/structure/spawner/lavaland = 2, \ - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, /obj/structure/spawner/lavaland/legion = 3, \ - SPAWN_MEGAFAUNA = 6, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10, ) - - data_having_type = /turf/open/floor/plating/asteroid/airless/cave/volcanic/has_data - turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface - initial_gas_mix = LAVALAND_DEFAULT_ATMOS - -/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/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) - if (!megafauna_spawn_list) - megafauna_spawn_list = list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = SPAWN_BUBBLEGUM) - if (!flora_spawn_list) - flora_spawn_list = list(/obj/structure/flora/ash/leaf_shroom = 2 , /obj/structure/flora/ash/cap_shroom = 2 , /obj/structure/flora/ash/stem_shroom = 2 , /obj/structure/flora/ash/cacti = 1, /obj/structure/flora/ash/tall_shroom = 2) - if(!terrain_spawn_list) - terrain_spawn_list = list(/obj/structure/geyser/random = 1) - . = ..() - if(!has_data) - produce_tunnel_from_data() - -/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) - length = rand(25, 50) - else - length = set_length - - // Get our directiosn - forward_cave_dir = pick(GLOB.alldirs - exclude_dir) - // Get the opposite direction of our facing direction - backward_cave_dir = angle2dir(dir2angle(forward_cave_dir) + 180) - -/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 - make_tunnel(forward_cave_dir) - if(going_backwards) - make_tunnel(backward_cave_dir) - // Kill ourselves by replacing ourselves with a normal floor. - SpawnFloor(src) - -/turf/open/floor/plating/asteroid/airless/cave/proc/make_tunnel(dir) - var/turf/closed/mineral/tunnel = src - var/next_angle = pick(45, -45) - - for(var/i = 0; i < length; i++) - if(!sanity) - break - - var/list/L = list(45) - if(ISODD(dir2angle(dir))) // We're going at an angle and we want thick angled tunnels. - L += -45 - - // 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) - - if(!sanity) - break - - // Move our tunnel forward - tunnel = get_step(tunnel, dir) - - 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 - 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) - else - SpawnFloor(tunnel) - else //if(!istype(tunnel, parent)) // We hit space/normal/wall, stop our tunnel. - break - - // Chance to change our direction left or right. - if(i > 2 && prob(33)) - // We can't go a full loop though - next_angle = -next_angle - setDir(angle2dir(dir2angle(dir) )+ next_angle) - - -/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) - return - SpawnFlora(T) - // SpawnTerrain(T) - SpawnMonster(T) - T.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR) - -/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T) - if(prob(30)) - if(istype(loc, /area/mine/explored) || !istype(loc, /area/lavaland/surface/outdoors/unexplored)) - return - var/randumb = pickweight(mob_spawn_list) - while(randumb == SPAWN_MEGAFAUNA) - if(istype(loc, /area/lavaland/surface/outdoors/unexplored/danger)) //this is danger. it's boss time. - var/maybe_boss = pickweight(megafauna_spawn_list) - if(megafauna_spawn_list[maybe_boss]) - randumb = maybe_boss - if(ispath(maybe_boss, /mob/living/simple_animal/hostile/megafauna/bubblegum)) //there can be only one bubblegum, so don't waste spawns on it - megafauna_spawn_list[maybe_boss] = 0 - else //this is not danger, don't spawn a boss, spawn something else - randumb = pickweight(mob_spawn_list) - - for(var/mob/living/simple_animal/hostile/H in urange(12,T)) //prevents mob clumps - if((ispath(randumb, /mob/living/simple_animal/hostile/megafauna) || ismegafauna(H)) && get_dist(src, H) <= 7) - return //if there's a megafauna within standard view don't spawn anything at all - if(ispath(randumb, /mob/living/simple_animal/hostile/asteroid) || istype(H, /mob/living/simple_animal/hostile/asteroid)) - return //if the random is a standard mob, avoid spawning if there's another one within 12 tiles - if((ispath(randumb, /obj/structure/spawner/lavaland) || istype(H, /obj/structure/spawner/lavaland)) && get_dist(src, H) <= 2) - return //prevents tendrils spawning in each other's collapse range - - new randumb(T) - return - -#undef SPAWN_MEGAFAUNA -#undef SPAWN_BUBBLEGUM - -/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 - 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(!istype(F, randumb)) - return - new randumb(T) - -/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnTerrain(turf/T) - if(prob(2)) - if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored)) - return - var/randumb = pickweight(terrain_spawn_list) - for(var/obj/structure/geyser/F in range(7, T)) - if(istype(F, randumb)) - return - new randumb(T) +// / Breathing types. Lungs can access either by these or by a string, which will be considered a gas ID. +#define BREATH_OXY /datum/breathing_class/oxygen +#define BREATH_PLASMA /datum/breathing_class/plasma /turf/open/floor/plating/asteroid/snow gender = PLURAL @@ -335,7 +164,7 @@ name = "icy snow" desc = "Looks colder." baseturfs = /turf/open/floor/plating/asteroid/snow/ice - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120" + initial_gas_mix = "n2=82;plasma=24;TEMP=120" floor_variance = 0 icon_state = "snow-ice" icon_plating = "snow-ice" diff --git a/code/game/turfs/open/floor/plating/dirt.dm b/code/game/turfs/open/floor/plating/dirt.dm deleted file mode 100644 index 9cfbe8433b3f7..0000000000000 --- a/code/game/turfs/open/floor/plating/dirt.dm +++ /dev/null @@ -1,21 +0,0 @@ -/turf/open/floor/plating/dirt - gender = PLURAL - name = "dirt" - desc = "Upon closer examination, it's still dirt." - icon = 'icons/turf/floors.dmi' - icon_state = "dirt" - baseturfs = /turf/open/chasm/jungle - initial_gas_mix = OPENTURF_LOW_PRESSURE - planetary_atmos = TRUE - attachment_holes = FALSE - footstep = FOOTSTEP_SAND - barefootstep = FOOTSTEP_SAND - clawfootstep = FOOTSTEP_SAND - heavyfootstep = FOOTSTEP_GENERIC_HEAVY - tiled_dirt = FALSE - -/turf/open/floor/plating/dirt/dark - icon_state = "greenerdirt" - -/turf/open/floor/plating/dirt/try_replace_tile(obj/item/stack/tile/T, mob/user, params) - return diff --git a/code/game/turfs/open/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm index 85029c9ac3da2..e1025feb7e13d 100644 --- a/code/game/turfs/open/floor/plating/misc_plating.dm +++ b/code/game/turfs/open/floor/plating/misc_plating.dm @@ -3,6 +3,10 @@ icon_state = "plating" initial_gas_mix = AIRLESS_ATMOS +/turf/open/floor/plating/lavaland + icon_state = "plating" + initial_gas_mix = LAVALAND_DEFAULT_ATMOS + /turf/open/floor/plating/abductor name = "alien floor" icon_state = "alienpod1" @@ -27,13 +31,6 @@ /turf/open/floor/plating/abductor2/try_replace_tile(obj/item/stack/tile/T, mob/user, params) return -/turf/open/floor/plating/astplate - icon_state = "asteroidplating" - -/turf/open/floor/plating/airless/astplate - icon_state = "asteroidplating" - - /turf/open/floor/plating/ashplanet icon = 'icons/turf/mining.dmi' gender = PLURAL @@ -173,7 +170,7 @@ icon = 'icons/turf/floors/ice_turf.dmi' icon_state = "unsmooth" initial_gas_mix = FROZEN_ATMOS - temperature = 180 + initial_temperature = 180 planetary_atmos = TRUE baseturfs = /turf/open/floor/plating/ice slowdown = 1 @@ -197,10 +194,10 @@ 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 + initial_temperature = 140 /turf/open/floor/plating/ice/temperate - temperature = 255.37 + initial_temperature = 255.37 /turf/open/floor/plating/ice/break_tile() return @@ -215,7 +212,7 @@ icon = 'icons/turf/snow.dmi' icon_state = "snowplating" initial_gas_mix = FROZEN_ATMOS - temperature = 180 + initial_temperature = 180 attachment_holes = FALSE planetary_atmos = TRUE footstep = FOOTSTEP_SAND @@ -224,7 +221,7 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY /turf/open/floor/plating/snowed/cavern - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120" + initial_gas_mix = "n2=82;plasma=24;TEMP=120" /turf/open/floor/plating/snowed/smoothed smooth = SMOOTH_MORE | SMOOTH_BORDER @@ -234,8 +231,8 @@ icon_state = "smooth" /turf/open/floor/plating/snowed/colder - temperature = 140 + initial_temperature = 140 /turf/open/floor/plating/snowed/temperatre - temperature = 255.37 + initial_temperature = 255.37 diff --git a/code/game/turfs/open/floor/plating/planet.dm b/code/game/turfs/open/floor/plating/planet.dm new file mode 100644 index 0000000000000..9f6c54a029f79 --- /dev/null +++ b/code/game/turfs/open/floor/plating/planet.dm @@ -0,0 +1,59 @@ +/turf/open/floor/plating/dirt + gender = PLURAL + name = "dirt" + desc = "Upon closer examination, it's still dirt." + icon = 'icons/turf/floors.dmi' + icon_state = "dirt" + baseturfs = /turf/open/chasm/jungle + initial_gas_mix = OPENTURF_LOW_PRESSURE + planetary_atmos = TRUE + attachment_holes = FALSE + footstep = FOOTSTEP_SAND + barefootstep = FOOTSTEP_SAND + clawfootstep = FOOTSTEP_SAND + heavyfootstep = FOOTSTEP_GENERIC_HEAVY + tiled_dirt = FALSE + +/turf/open/floor/plating/dirt/dark + icon_state = "greenerdirt" + +/turf/open/floor/plating/dirt/try_replace_tile(obj/item/stack/tile/T, mob/user, params) + return + +/turf/open/floor/plating/dirt/jungle + slowdown = 0.5 + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + +/turf/open/floor/plating/dirt/jungle/dark + icon_state = "greenerdirt" + +/turf/open/floor/plating/dirt/jungle/wasteland //Like a more fun version of living in Arizona. + name = "cracked earth" + desc = "Looks a bit dry." + icon = 'icons/turf/floors.dmi' + icon_state = "wasteland" + slowdown = 1 + var/floor_variance = 15 + +/turf/open/floor/plating/dirt/jungle/wasteland/Initialize() + .=..() + if(prob(floor_variance)) + icon_state = "[initial(icon_state)][rand(0,12)]" + +/turf/open/floor/plating/grass/jungle + name = "jungle grass" + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + planetary_atmos = TRUE + desc = "Greener on the other side." + icon = 'icons/turf/floors.dmi' + icon_state = "junglegrass" + +/turf/open/floor/plating/grass/jungle/Initialize() + .=..() + icon_state = "[initial(icon_state)][rand(1,3)]" + +/turf/closed/mineral/random/jungle + mineralSpawnChanceList = list(/obj/item/stack/ore/uranium = 5, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 10, + /obj/item/stack/ore/silver = 12, /obj/item/stack/ore/plasma = 20, /obj/item/stack/ore/iron = 40, /obj/item/stack/ore/titanium = 11, + /obj/item/stack/ore/bluespace_crystal = 1) + baseturfs = /turf/open/floor/plating/dirt/dark diff --git a/code/game/turfs/open/floor/reinf_floor.dm b/code/game/turfs/open/floor/reinf_floor.dm index ce89591291fcb..d73bf2fd3b8cc 100644 --- a/code/game/turfs/open/floor/reinf_floor.dm +++ b/code/game/turfs/open/floor/reinf_floor.dm @@ -3,6 +3,7 @@ name = "reinforced floor" desc = "Extremely sturdy." icon_state = "engine" + holodeck_compatible = TRUE thermal_conductivity = 0.025 heat_capacity = INFINITY floor_tile = /obj/item/stack/sheet/iron @@ -11,10 +12,14 @@ clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY tiled_dirt = FALSE + FASTDMM_PROP(\ + pipe_astar_cost = 15\ + ) + /turf/open/floor/engine/examine(mob/user) - ..() - to_chat(user, "The reinforcement plates are wrenched firmly in place.") + . = ..() + . += "The reinforcement plates are wrenched firmly in place." /turf/open/floor/engine/light icon_state = "engine_light" @@ -153,6 +158,8 @@ icon_state = "plating" floor_tile = null var/obj/effect/clockwork/overlay/floor/bloodcult/realappearance + CanAtmosPass = ATMOS_PASS_NO + CanAtmosPassVertical = ATMOS_PASS_NO /turf/open/floor/engine/cult/Initialize() diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 8fbcf884cd8be..7568e38164781 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -37,6 +37,7 @@ initial_gas_mix = AIRLESS_ATMOS /turf/open/lava/Entered(atom/movable/AM) + . = ..() if(burn_stuff(AM)) START_PROCESSING(SSobj, src) @@ -51,8 +52,8 @@ if(burn_stuff(AM)) START_PROCESSING(SSobj, src) -/turf/open/lava/process() - if(!burn_stuff()) +/turf/open/lava/process(delta_time) + if(!burn_stuff(null, delta_time)) STOP_PROCESSING(SSobj, src) /turf/open/lava/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) @@ -99,7 +100,7 @@ return LAZYLEN(found_safeties) -/turf/open/lava/proc/burn_stuff(AM) +/turf/open/lava/proc/burn_stuff(AM, delta_time = 1) . = 0 if(is_safe()) @@ -122,8 +123,11 @@ O.resistance_flags &= ~FIRE_PROOF if(O.armor.fire > 50) //obj with 100% fire armor still get slowly burned away. O.armor = O.armor.setRating(fire = 50) - O.fire_act(10000, 1000) - + O.fire_act(10000, 1000 * delta_time) + if(istype(O, /obj/structure/closet)) + var/obj/structure/closet/C = O + for(var/I in C.contents) + burn_stuff(I) else if (isliving(thing)) . = 1 var/mob/living/L = thing @@ -146,18 +150,17 @@ if(iscarbon(L)) var/mob/living/carbon/C = L - var/obj/item/clothing/S = C.get_item_by_slot(SLOT_WEAR_SUIT) - var/obj/item/clothing/H = C.get_item_by_slot(SLOT_HEAD) + var/obj/item/clothing/S = C.get_item_by_slot(ITEM_SLOT_OCLOTHING) + var/obj/item/clothing/H = C.get_item_by_slot(ITEM_SLOT_HEAD) if(S && H && S.clothing_flags & LAVAPROTECT && H.clothing_flags & LAVAPROTECT) return if("lava" in L.weather_immunities) continue - - L.adjustFireLoss(20) + L.adjustFireLoss(20 * delta_time) if(L) //mobs turning into object corpses could get deleted here. - L.adjust_fire_stacks(20) + L.adjust_fire_stacks(20 * delta_time) L.IgniteMob() /turf/open/lava/smooth diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index 0b440cd9b3a32..16b2e63da0883 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -17,6 +17,12 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr icon_state = "transparent" baseturfs = /turf/open/openspace CanAtmosPassVertical = ATMOS_PASS_YES + allow_z_travel = TRUE + + FASTDMM_PROP(\ + pipe_astar_cost = 100\ + ) + //mouse_opacity = MOUSE_OPACITY_TRANSPARENT var/can_cover_up = TRUE var/can_build_on = TRUE @@ -82,6 +88,9 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr return TRUE /turf/open/openspace/zPassOut(atom/movable/A, direction, turf/destination) + //Check if our fall location has gravity + if(!A.has_gravity(destination)) + return FALSE if(A.anchored) return FALSE for(var/obj/O in contents) @@ -157,3 +166,12 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE + +//Returns FALSE if gravity is force disabled. True if grav is possible +/turf/open/openspace/check_gravity() + var/turf/T = below() + if(!T) + return TRUE + if(isspaceturf(T)) + return FALSE + return TRUE diff --git a/code/game/turfs/open/reebe_void.dm b/code/game/turfs/open/reebe_void.dm index 14aa02065d546..7db6f36b7d70a 100644 --- a/code/game/turfs/open/reebe_void.dm +++ b/code/game/turfs/open/reebe_void.dm @@ -6,6 +6,7 @@ planetary_atmos = TRUE bullet_bounce_sound = null //forever falling tiled_dirt = FALSE + flags_1 = NOJAUNT_1 /turf/open/indestructible/reebe_void/Initialize(mapload) . = ..() diff --git a/code/game/turfs/open/river.dm b/code/game/turfs/open/river.dm index adc6b57960de8..f7a38e2168e25 100644 --- a/code/game/turfs/open/river.dm +++ b/code/game/turfs/open/river.dm @@ -72,8 +72,7 @@ var/list/cardinal_turfs = list() var/list/diagonal_turfs = list() var/logged_turf_type - for(var/F in RANGE_TURFS(1, src) - src) - var/turf/T = F + for(var/turf/T as() in RANGE_TURFS(1, src) - src) var/area/new_area = get_area(T) if(!T || (T.density && !ismineralturf(T)) || istype(T, /turf/open/indestructible) || (whitelisted_area && !istype(new_area, whitelisted_area)) || (T.flags_1 & NO_LAVA_GEN_1) ) continue @@ -82,18 +81,16 @@ var/turf/closed/mineral/M = T logged_turf_type = M.turf_type - if(get_dir(src, F) in GLOB.cardinals) - cardinal_turfs += F + if(get_dir(src, T) in GLOB.cardinals) + cardinal_turfs += T else - diagonal_turfs += F + diagonal_turfs += T - for(var/F in cardinal_turfs) //cardinal turfs are always changed but don't always spread - var/turf/T = F + for(var/turf/T as() in cardinal_turfs) //cardinal turfs are always changed but don't always spread if(!istype(T, logged_turf_type) && T.ChangeTurf(type, baseturfs, CHANGETURF_IGNORE_AIR) && prob(probability)) T.Spread(probability - prob_loss, prob_loss, whitelisted_area) - for(var/F in diagonal_turfs) //diagonal turfs only sometimes change, but will always spread if changed - var/turf/T = F + for(var/turf/T as() in diagonal_turfs) //diagonal turfs only sometimes change, but will always spread if changed if(!istype(T, logged_turf_type) && prob(probability) && T.ChangeTurf(type, baseturfs, CHANGETURF_IGNORE_AIR)) T.Spread(probability - prob_loss, prob_loss, whitelisted_area) else if(ismineralturf(T)) diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index d43716b948532..c259b96f3bc68 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -5,18 +5,20 @@ intact = 0 FASTDMM_PROP(\ - pipe_astar_cost = 4\ + pipe_astar_cost = 100\ ) - temperature = TCMB - thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT + allow_z_travel = TRUE + + initial_temperature = TCMB + thermal_conductivity = 0 heat_capacity = 700000 var/destination_z var/destination_x var/destination_y - var/static/datum/gas_mixture/immutable/space/space_gas = new + var/static/datum/gas_mixture/immutable/space/space_gas plane = PLANE_SPACE layer = SPACE_LAYER light_power = 0.25 @@ -31,8 +33,10 @@ /turf/open/space/Initialize() icon_state = SPACE_ICON_STATE + if(!space_gas) + space_gas = new air = space_gas - update_air_ref() + update_air_ref(0) vis_contents.Cut() //removes inherited overlays visibilityChanged() @@ -44,9 +48,6 @@ if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A)) add_overlay(/obj/effect/fullbright) - if(requires_activation) - SSair.add_to_active(src) - if (light_power && light_range) update_light() @@ -78,6 +79,13 @@ /turf/open/space/Assimilate_Air() return +//IT SHOULD RETURN NULL YOU MONKEY, WHY IN TARNATION WHAT THE FUCKING FUCK +/turf/open/space/remove_air(amount) + return null + +/turf/open/space/remove_air_ratio(amount) + return null + /turf/open/space/proc/update_starlight() if(CONFIG_GET(flag/starlight)) for(var/t in RANGE_TURFS(1,src)) //RANGE_TURFS is in code\__HELPERS\game.dm @@ -173,6 +181,7 @@ //now we're on the new z_level, proceed the space drifting stoplag()//Let a diagonal move finish, if necessary A.newtonian_move(A.inertia_dir) + A.inertia_moving = TRUE /turf/open/space/MakeSlippery(wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent) @@ -230,3 +239,10 @@ destination_x = dest_x destination_y = dest_y destination_z = dest_z + +//If someone is floating above space in 0 gravity, don't fall. +/turf/open/space/zPassIn(atom/movable/A, direction, turf/source) + return A.has_gravity(src) + +/turf/open/space/check_gravity() + return FALSE diff --git a/code/game/turfs/open/space/transit.dm b/code/game/turfs/open/space/transit.dm index 1deb5303d3080..7ede8d0d1a963 100644 --- a/code/game/turfs/open/space/transit.dm +++ b/code/game/turfs/open/space/transit.dm @@ -29,23 +29,55 @@ /turf/open/space/transit/Entered(atom/movable/AM, atom/OldLoc) ..() if(!locate(/obj/structure/lattice) in src) - throw_atom(AM) + throw_atom(AM, OldLoc) -/turf/open/space/transit/proc/throw_atom(atom/movable/AM) +/turf/open/space/transit/proc/throw_atom(atom/movable/AM, atom/OldLoc) set waitfor = FALSE if(!AM || istype(AM, /obj/docking_port)) return if(AM.loc != src) // Multi-tile objects are "in" multiple locs but its loc is it's true placement. - return // Don't move multi tile objects if their origin isnt in transit + return // Don't move multi tile objects if their origin isn't in transit var/max = world.maxx-TRANSITIONEDGE var/min = 1+TRANSITIONEDGE - var/list/possible_transtitons = list() - for(var/A in SSmapping.z_list) - var/datum/space_level/D = A - if (D.linkage == CROSSLINKED) - possible_transtitons += D.z_value - var/_z = pick(possible_transtitons) + //Find our location + var/_z = 2 + + var/should_make_level = ismob(AM) + if(!should_make_level && isobj(AM)) + var/obj/O = AM + if(O.resistance_flags & INDESTRUCTIBLE) + should_make_level = TRUE + + if(should_make_level) + //Check if we are on a shuttle + var/turf/oldTurf = get_turf(OldLoc) + var/area/shuttle/shuttleArea = get_area(oldTurf) + if(istype(shuttleArea)) + var/shuttleId = shuttleArea.mobile_port?.id || "null" + //Find the shuttle object + var/datum/orbital_object/shuttle/shuttleObj = SSorbits.assoc_shuttles[shuttleId] + if(shuttleObj) + if(length(shuttleObj.can_dock_with?.linked_z_level)) + _z = shuttleObj.can_dock_with.linked_z_level[1].z_value + else if(length(shuttleObj.docking_target?.linked_z_level)) + _z = shuttleObj.docking_target.linked_z_level[1].z_value + else + //Interdiction (Its an empty z-level) + var/datum/orbital_object/z_linked/beacon/ruin/z_linked = new /datum/orbital_object/z_linked/beacon/ruin/interdiction( + new /datum/orbital_vector(shuttleObj.position.x, shuttleObj.position.y) + ) + z_linked.name = "Stranded [AM]" + z_linked.assign_z_level() + if(length(z_linked.linked_z_level)) + _z = z_linked.linked_z_level[1].z_value + if(_z == 2) + //Chuck them at the space level + for(var/A in SSmapping.z_list) + var/datum/space_level/D = A + if (D.linkage == CROSSLINKED) + _z = D.z_value + break //now select coordinates for a border turf var/_x @@ -76,7 +108,7 @@ . = ..() update_icon() for(var/atom/movable/AM in src) - throw_atom(AM) + throw_atom(AM, src) /turf/open/space/transit/update_icon() . = ..() diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm index 957fb3df19bdd..b76f07c41a2bd 100644 --- a/code/game/turfs/open/water.dm +++ b/code/game/turfs/open/water.dm @@ -15,3 +15,10 @@ barefootstep = FOOTSTEP_WATER clawfootstep = FOOTSTEP_WATER heavyfootstep = FOOTSTEP_WATER + +/turf/open/water/air + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + planetary_atmos = FALSE + +/turf/open/water/jungle + initial_gas_mix = OPENTURF_DEFAULT_ATMOS diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index cf79aa4109781..6d179eee686c3 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -1,3 +1,4 @@ +GLOBAL_LIST_EMPTY(station_turfs) /turf icon = 'icons/turf/floors.dmi' level = 1 @@ -16,12 +17,15 @@ var/list/baseturfs = /turf/baseturf_bottom /// How hot the turf is, in kelvin - var/temperature = T20C + var/initial_temperature = T20C /// Used for fire, if a melting temperature was reached, it will be destroyed var/to_be_destroyed = 0 var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to + //If true, turf will allow users to float up and down in 0 grav. + var/allow_z_travel = FALSE + /// Whether the turf blocks atmos from passing through it or not var/blocks_air = FALSE @@ -32,6 +36,7 @@ var/explosion_level = 0 //for preventing explosion dodging var/explosion_id = 0 + var/list/explosion_throw_details var/requires_activation //add to air processing after initialize? var/changing_turf = FALSE @@ -46,6 +51,9 @@ vis_flags = VIS_INHERIT_PLANE|VIS_INHERIT_ID //when this be added to vis_contents of something it inherit something.plane and be associated with something on clicking, important for visualisation of turf in openspace and interraction with openspace that show you turf. + ///the holodeck can load onto this turf if TRUE + var/holodeck_compatible = FALSE + /turf/vv_edit_var(var_name, new_value) var/static/list/banned_edits = list("x", "y", "z") if(var_name in banned_edits) @@ -76,8 +84,10 @@ if(requires_activation) CALCULATE_ADJACENT_TURFS(src) - SSair.add_to_active(src) + if(color) + add_atom_colour(color, FIXED_COLOUR_PRIORITY) + if (light_power && light_range) update_light() @@ -94,9 +104,21 @@ has_opaque_atom = TRUE ComponentInitialize() + if(isopenturf(src)) + var/turf/open/O = src + __auxtools_update_turf_temp_info(isspaceturf(get_z_base_turf()) && !O.planetary_atmos) + else + update_air_ref(-1) + __auxtools_update_turf_temp_info(isspaceturf(get_z_base_turf())) return INITIALIZE_HINT_NORMAL +/turf/proc/__auxtools_update_turf_temp_info() + +/turf/return_temperature() + +/turf/proc/set_temperature() + /turf/proc/Initalize_Atmos(times_fired) CALCULATE_ADJACENT_TURFS(src) @@ -120,19 +142,75 @@ for(var/I in B.vars) B.vars[I] = null return - SSair.remove_from_active(src) visibilityChanged() QDEL_LIST(blueprint_data) flags_1 &= ~INITIALIZED_1 requires_activation = FALSE ..() + vis_contents.Cut() + /turf/attack_hand(mob/user) + //Must have no gravity. + if(allow_z_travel && get_turf(user) == src) + if(!user.has_gravity(src) || (user.movement_type & FLYING)) + check_z_travel(user) + return + else + to_chat(user, "You can't float up and down when there is gravity!") . = ..() + if(SEND_SIGNAL(user, COMSIG_MOB_ATTACK_HAND_TURF, src) & COMPONENT_NO_ATTACK_HAND) + . = TRUE if(.) return user.Move_Pulled(src) +/turf/proc/check_z_travel(mob/user) + if(get_turf(user) != src) + return + var/list/tool_list = list() + var/turf/above = above() + if(above) + tool_list["Up"] = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH) + var/turf/below = below() + if(below) + tool_list["Down"] = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH) + + if(!length(tool_list)) + return + + var/result = show_radial_menu(user, user, tool_list, require_near = TRUE, tooltips = TRUE) + if(get_turf(user) != src) + return + switch(result) + if("Cancel") + return + if("Up") + travel_z(user, above, TRUE) + if("Down") + travel_z(user, below, FALSE) + +/turf/proc/travel_z(mob/user, turf/target, upwards = TRUE) + user.visible_message("[user] begins floating upwards!", "You begin floating upwards.") + var/matrix/M = user.transform + //Animation is inverted due to immediately resetting user vars. + animate(user, 30, pixel_y = upwards ? -64 : 64, transform = matrix() * (upwards ? 0.7 : 1.3)) + user.pixel_y = 0 + user.transform = M + if(!do_after(user, 30, FALSE, get_turf(user))) + animate(user, 0, flags = ANIMATION_END_NOW) + return + if(!istype(target, /turf/open/space) && !istype(target, /turf/open/openspace)) + to_chat(user, "Something is blocking you!") + return + var/atom/movable/AM + if(user.pulling) + AM = user.pulling + AM.forceMove(target) + user.forceMove(target) + if(AM) + user.start_pulling(AM) + /turf/proc/multiz_turf_del(turf/T, dir) /turf/proc/multiz_turf_new(turf/T, dir) @@ -182,12 +260,20 @@ if(!force && (!can_zFall(A, levels, target) || !A.can_zFall(src, levels, target, DOWN))) return FALSE A.zfalling = TRUE + var/atom/movable/pulling = A.pulling A.forceMove(target) A.zfalling = FALSE + if(pulling) + //Things you are pulling fall with you + pulling.zfalling = TRUE + pulling.forceMove(target) + A.start_pulling(pulling) + pulling.zfalling = FALSE + target.zImpact(pulling, levels, src) target.zImpact(A, levels, src) return TRUE -/turf/proc/handleRCL(obj/item/twohanded/rcl/C, mob/user) +/turf/proc/handleRCL(obj/item/rcl/C, mob/user) if(C.loaded) for(var/obj/structure/cable/LC in src) if(!LC.d1 || !LC.d2) @@ -210,7 +296,7 @@ coil.place_turf(src, user) return TRUE - else if(istype(C, /obj/item/twohanded/rcl)) + else if(istype(C, /obj/item/rcl)) handleRCL(C, user) return FALSE @@ -276,9 +362,6 @@ /turf/Entered(atom/movable/AM) ..() - if(explosion_level && AM.ex_check(explosion_id)) - AM.ex_act(explosion_level) - // If an opaque movable atom moves around we need to potentially update visibility. if (AM.opacity) has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case. @@ -380,7 +463,7 @@ if(.) return if(length(src_object.contents())) - to_chat(usr, "You start dumping out the contents...") + balloon_alert(usr, "You dump out the contents") if(!do_after(usr,20,target=src_object.parent)) return FALSE @@ -452,15 +535,20 @@ else affecting_level = 1 - for(var/V in contents) - var/atom/A = V - if(!QDELETED(A) && A.level >= affecting_level) - if(ismovableatom(A)) - var/atom/movable/AM = A - if(!AM.ex_check(explosion_id)) + for(var/thing in contents) + var/atom/atom_thing = thing + if(!QDELETED(atom_thing) && atom_thing.level >= affecting_level) + if(ismovableatom(atom_thing)) + var/atom/movable/movable_thing = atom_thing + if(!movable_thing.ex_check(explosion_id)) continue - A.ex_act(severity, target) - CHECK_TICK + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += movable_thing + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += movable_thing + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += movable_thing /turf/narsie_act(force, ignore_mobs, probability = 20) . = (prob(probability) || force) @@ -498,7 +586,7 @@ /turf/proc/add_blueprints_preround(atom/movable/AM) - if(!SSticker.HasRoundStarted()) + if(!SSicon_smooth.initialized) add_blueprints(AM) /turf/proc/is_transition_turf() @@ -584,3 +672,26 @@ . = ..() if(. != BULLET_ACT_FORCE_PIERCE) . = BULLET_ACT_TURF + +/turf/proc/check_gravity() + return TRUE + +/** + * Returns adjacent turfs to this turf that are reachable, in all cardinal directions + * + * Arguments: + * * caller: The movable, if one exists, being used for mobility checks to see what tiles it can reach + * * ID: An ID card that decides if we can gain access to doors that would otherwise block a turf + * * simulated_only: Do we only worry about turfs with simulated atmos, most notably things that aren't space? +*/ +/turf/proc/reachableAdjacentTurfs(caller, ID, simulated_only) + var/static/space_type_cache = typecacheof(/turf/open/space) + . = list() + + for(var/iter_dir in GLOB.cardinals) + var/turf/turf_to_check = get_step(src,iter_dir) + if(!turf_to_check || (simulated_only && space_type_cache[turf_to_check.type])) + continue + if(turf_to_check.density || LinkBlockedWithAccess(turf_to_check, caller, ID)) + continue + . += turf_to_check diff --git a/code/game/verbs.dm b/code/game/verbs.dm new file mode 100644 index 0000000000000..068cad2c16a3f --- /dev/null +++ b/code/game/verbs.dm @@ -0,0 +1,178 @@ +/* + * BYOND moment + * Byond has verbs stored on /client and /atom, but they are a different variable, + * So we have to make an override for /atom and /client that do exactly the same thing but affect a different variable. + * Seriously, why wouldn't they all just be on client? + * + * Update: + * Apparently client.verbs is always empty, but adding and removing from it still works? + * Just going to use winset instead, since that seems to work. + */ + +/datum + var/list/stat_tabs + var/list/sorted_verbs + +/datum/proc/add_verb(new_verbs) + //Nooooo!!!!! + if(IsAdminAdvancedProcCall()) + message_admins("[key_name(usr)] attempted to edit their verbs.") + log_game("[key_name(usr)] attempted to edit their verbs.") + return + if(!islist(new_verbs)) + new_verbs = list(new_verbs) + //To use less memory + if(!islist(sorted_verbs)) + sorted_verbs = list() + if(!islist(stat_tabs)) + stat_tabs = list() + for(var/verb_in_list in new_verbs) + var/procpath/V = verb_in_list + if(V.category) + if(V.category in sorted_verbs) + if(V in sorted_verbs[V.category]) + continue + //Binary insert at the correct position + var/list/verbs = sorted_verbs["[V.category]"] + BINARY_INSERT_TEXT(V, verbs, procpath, name) + sorted_verbs["[V.category]"] = verbs + else + //Add category with verb + stat_tabs += V.category + sorted_verbs["[V.category]"] = list(V) + sortList(sorted_verbs) + +/datum/proc/remove_verb(old_verbs) + if(IsAdminAdvancedProcCall()) + message_admins("[key_name(usr)] attempted to edit their verbs.") + log_game("[key_name(usr)] attempted to edit their verbs.") + return + if(!sorted_verbs) + return + if(!islist(old_verbs)) + old_verbs = list(old_verbs) + for(var/verb_in_list in old_verbs) + var/procpath/V = verb_in_list + //Find our category + if("[V.category]" in sorted_verbs) + //Remove the verb + sorted_verbs["[V.category]"] -= V + //Remove the category if necessary + if(!LAZYLEN(sorted_verbs["[V.category]"])) + sorted_verbs.Remove("[V.category]") + stat_tabs -= V.category + +/atom/add_verb(new_verbs, tgui_only = FALSE) + if(IsAdminAdvancedProcCall()) + message_admins("[key_name(usr)] attempted to edit their verbs.") + log_game("[key_name(usr)] attempted to edit their verbs.") + return + if(!tgui_only) + verbs += new_verbs + return ..(new_verbs) + +/atom/remove_verb(old_verbs, tgui_only = FALSE) + if(IsAdminAdvancedProcCall()) + message_admins("[key_name(usr)] attempted to edit their verbs.") + log_game("[key_name(usr)] attempted to edit their verbs.") + return + if(!tgui_only) + verbs -= old_verbs + return ..(old_verbs) + +/obj/item/remove_verb(new_verbs, tgui_only = FALSE) + if(IsAdminAdvancedProcCall()) + message_admins("[key_name(usr)] attempted to edit their verbs.") + log_game("[key_name(usr)] attempted to edit their verbs.") + return + //If we lose an old verb while in someone's inventory, remove it frmo their panel. + if(item_flags & IN_INVENTORY) + var/mob/living/L = loc + if(istype(L) && L.client) + L.client.remove_verbs(new_verbs) + return ..(new_verbs) + +/obj/item/add_verb(new_verbs, tgui_only = FALSE) + if(IsAdminAdvancedProcCall()) + message_admins("[key_name(usr)] attempted to edit their verbs.") + log_game("[key_name(usr)] attempted to edit their verbs.") + return + //If we get a new verb while in someone's inventory, add it to their panel. + if(item_flags & IN_INVENTORY) + var/mob/living/L = loc + if(istype(L) && L.client) + L.client.add_verbs(new_verbs) + return ..(new_verbs) + +/client/add_verb(new_verbs, tgui_only = FALSE) + if(IsAdminAdvancedProcCall()) + message_admins("[key_name(usr)] attempted to edit their verbs.") + log_game("[key_name(usr)] attempted to edit their verbs.") + return + if(!tgui_only) + verbs += new_verbs + add_verbs(new_verbs) + return ..(new_verbs) + +/client/remove_verb(old_verbs, tgui_only = FALSE) + if(IsAdminAdvancedProcCall()) + message_admins("[key_name(usr)] attempted to edit their verbs.") + log_game("[key_name(usr)] attempted to edit their verbs.") + return + if(!tgui_only) + verbs -= old_verbs + remove_verbs(old_verbs) + return ..(old_verbs) + +/mob/remove_verb(old_verbs, tgui_only = FALSE) + if(IsAdminAdvancedProcCall()) + message_admins("[key_name(usr)] attempted to edit their verbs.") + log_game("[key_name(usr)] attempted to edit their verbs.") + return + if(client) + client.remove_verbs(old_verbs) + return ..() + +/mob/add_verb(new_verbs, tgui_only) + if(IsAdminAdvancedProcCall()) + message_admins("[key_name(usr)] attempted to edit their verbs.") + log_game("[key_name(usr)] attempted to edit their verbs.") + return + if(client) + client.add_verbs(new_verbs) + return ..() + +/client/proc/remove_verbs(old_verbs) + if(!islist(old_verbs)) + old_verbs = list(old_verbs) + var/list/removed_verbs = list() + for(var/pp in old_verbs) + var/procpath/P = pp + if(!P) + continue + if(!islist(removed_verbs[P.category])) + removed_verbs[P.category] = list() + removed_verbs[P.category] += "[P.name]" + tgui_panel.remove_verbs(removed_verbs) + +/client/proc/add_verbs(new_verbs) + if(!islist(new_verbs)) + new_verbs = list(new_verbs) + var/list/added_verbs = list() + for(var/pp in new_verbs) + var/procpath/P = pp + if(!P) + continue + if((!mob && P.invisibility) || (mob && P.invisibility > mob.see_invisible)) + continue + if(!islist(added_verbs[P.category])) + added_verbs[P.category] = list() + added_verbs[P.category]["[P.name]"] = list( + action = "verb", + params = list("verb" = P.name), + type = STAT_VERB, + ) + tgui_panel.add_verbs(added_verbs) + +/proc/cmp_verb_des(procpath/a,procpath/b) + return sorttext(b.name, a.name) diff --git a/code/game/world.dm b/code/game/world.dm index 0e5a3bec102f9..e9c99adc0c50f 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -5,27 +5,29 @@ GLOBAL_VAR(restart_counter) //This happens after the Master subsystem new(s) (it's a global datum) //So subsystems globals exist, but are not initialised /world/New() - if (fexists(EXTOOLS)) - call(EXTOOLS, "debug_initialize")() - call(EXTOOLS, "maptick_initialize")() + //Keep the auxtools stuff at the top + AUXTOOLS_CHECK(AUXMOS) - //Early profile for auto-profiler - will be stopped on profiler init if necessary. - world.Profile(PROFILE_START) + enable_debugger() log_world("World loaded at [time_stamp()]!") - - GLOB.config_error_log = GLOB.world_manifest_log = GLOB.world_pda_log = GLOB.world_job_debug_log = GLOB.sql_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = "data/logs/config_error.[GUID()].log" //temporary file used to record errors with loading config, moved to log directory once logging is set bl + SSmetrics.world_init_time = REALTIMEOFDAY // Important 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.config_error_log = GLOB.world_manifest_log = GLOB.world_pda_log = GLOB.world_job_debug_log = GLOB.sql_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = "data/logs/config_error.[GUID()].log" //temporary file used to record errors with loading config, moved to log directory once logging is set bl + + config.Load(params[OVERRIDE_CONFIG_DIRECTORY_PARAMETER]) GLOB.revdata = new - config.Load(params[OVERRIDE_CONFIG_DIRECTORY_PARAMETER]) + InitTgs() + + config.LoadMOTD() load_admins() load_mentors() + load_badge_ranks() //SetupLogs depends on the RoundID, so lets check //DB schema and set RoundID if we can @@ -42,12 +44,9 @@ GLOBAL_VAR(restart_counter) 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 - LoadVerbs(/datum/verbs/menu) if(CONFIG_GET(flag/usewhitelist)) load_whitelist() - GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 - if(fexists(RESTART_COUNTER_PATH)) GLOB.restart_counter = text2num(trim(rustg_file_read(RESTART_COUNTER_PATH))) fdel(RESTART_COUNTER_PATH) @@ -57,8 +56,13 @@ GLOBAL_VAR(restart_counter) Master.Initialize(10, FALSE, TRUE) - if(TEST_RUN_PARAMETER in params) - HandleTestRun() + #ifdef UNIT_TESTS + HandleTestRun() + #endif + +/world/proc/InitTgs() + TgsNew(new /datum/tgs_event_handler/impl, TGS_SECURITY_TRUSTED) + GLOB.revdata.load_tgs_info() /world/proc/HandleTestRun() //trigger things to run the whole process @@ -71,7 +75,7 @@ GLOBAL_VAR(restart_counter) #else cb = VARSET_CALLBACK(SSticker, force_ending, TRUE) #endif - SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/addtimer, cb, 10 SECONDS)) + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/_addtimer, cb, 10 SECONDS)) /world/proc/SetupLogs() var/override_dir = params[OVERRIDE_LOG_DIRECTORY_PARAMETER] @@ -150,33 +154,60 @@ GLOBAL_VAR(restart_counter) var/list/response[] = list() - if (SSfail2topic?.IsRateLimited(addr)) - response["statuscode"] = 429 - response["response"] = "Rate limited." - return json_encode(response) if (length(T) > CONFIG_GET(number/topic_max_size)) response["statuscode"] = 413 - response["response"] = "Payload too large." + response["response"] = "Payload too large" return json_encode(response) - var/static/list/topic_handlers = TopicHandlers() + if (SSfail2topic?.IsRateLimited(addr)) + response["statuscode"] = 429 + response["response"] = "Rate limited" + return json_encode(response) - var/list/input = params2list(T) - var/datum/world_topic/handler - for(var/I in topic_handlers) - if(I in input) - handler = topic_handlers[I] - break + var/list/params[] = json_decode(rustg_url_decode(T)) + params["addr"] = addr + var/query = params["query"] + var/auth = params["auth"] + var/source = params["source"] - if((!handler || initial(handler.log)) && config && CONFIG_GET(flag/log_world_topic)) - log_topic("\"[T]\", from:[addr], master:[master], key:[key]") + if(CONFIG_GET(flag/log_world_topic)) + var/list/censored_params = params.Copy() + censored_params["auth"] = "***[copytext(params["auth"], -4)]" + log_topic("\"[json_encode(censored_params)]\", from:[addr], master:[master], auth:[censored_params["auth"]], key:[key], source:[source]") - if(!handler) - return + if(!source) + response["statuscode"] = 400 + response["response"] = "Bad Request - No source specified" + return json_encode(response) - handler = new handler() - return handler.TryRun(input, addr) + if(!query) + response["statuscode"] = 400 + response["response"] = "Bad Request - No endpoint specified" + return json_encode(response) + + if(!LAZYACCESS(GLOB.topic_tokens[auth], query)) + response["statuscode"] = 401 + response["response"] = "Unauthorized - Bad auth" + return json_encode(response) + + var/datum/world_topic/command = GLOB.topic_commands[query] + if(!command) + response["statuscode"] = 501 + response["response"] = "Not Implemented" + return json_encode(response) + + if(command.CheckParams(params)) + response["statuscode"] = command.statuscode + response["response"] = command.response + response["data"] = command.data + return json_encode(response) + else + command.Run(params) + response["statuscode"] = command.statuscode + response["response"] = command.response + response["data"] = command.data + return json_encode(response) /world/proc/AnnouncePR(announcement, list/payload) var/static/list/PRcounts = list() //PR id -> number of times announced this round @@ -215,6 +246,7 @@ GLOBAL_VAR(restart_counter) /world/Reboot(reason = 0, fast_track = FALSE) if (reason || fast_track) //special reboot, do none of the normal stuff + SSdbcore.Disconnect() 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") @@ -225,9 +257,10 @@ GLOBAL_VAR(restart_counter) TgsReboot() - if(TEST_RUN_PARAMETER in params) - FinishTestRun() - return + #ifdef UNIT_TESTS + FinishTestRun() + return + #endif if(TgsAvailable()) var/do_hard_reboot @@ -252,17 +285,15 @@ GLOBAL_VAR(restart_counter) log_world("World rebooted at [time_stamp()]") shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss. + AUXTOOLS_SHUTDOWN(AUXMOS) ..() /world/Del() - // memory leaks bad - var/num_deleted = 0 - for(var/datum/gas_mixture/GM) - GM.__gasmixture_unregister() - num_deleted++ - log_world("Deallocated [num_deleted] gas mixtures") - if(fexists(EXTOOLS)) - call(EXTOOLS, "cleanup")() + shutdown_logging() // makes sure the thread is closed before end, else we terminate + AUXTOOLS_SHUTDOWN(AUXMOS) + var/debug_server = world.GetConfig("env", "AUXTOOLS_DEBUG_DLL") + if (debug_server) + call(debug_server, "auxtools_shutdown")() ..() /world/proc/update_status() diff --git a/code/modules/NTNet/netdata.dm b/code/modules/NTNet/netdata.dm index 22bebf9704d89..2a3a85f70643d 100644 --- a/code/modules/NTNet/netdata.dm +++ b/code/modules/NTNet/netdata.dm @@ -42,26 +42,3 @@ /datum/netdata/proc/generate_netlog() return "[json_encode(json_list_generation_netlog())]" - -// Circuit stuff -// Process data before sending it -/datum/netdata/proc/pre_send(datum/component/ntnet_interface/interface) - // Decrypt the passkey. - if(autopasskey) - if(data["encrypted_passkey"] && !passkey) - var/result = XorEncrypt(hextostr(data["encrypted_passkey"], TRUE), SScircuit.cipherkey) - if(length(result) > 1) - passkey = json_decode(XorEncrypt(hextostr(data["encrypted_passkey"], TRUE), SScircuit.cipherkey)) - - // Encrypt the passkey. - if(!data["encrypted_passkey"] && passkey) - data["encrypted_passkey"] = strtohex(XorEncrypt(json_encode(passkey), SScircuit.cipherkey)) - - // If there is no sender ID, set the default one. - if(!sender_id && interface) - sender_id = interface.hardware_id - -/datum/component/ntnet_interface/__network_send(datum/netdata/data, netid) - // Process data before sending it - data.pre_send(src) - return(..(data,netid)) diff --git a/code/modules/NTNet/relays.dm b/code/modules/NTNet/relays.dm index 9abd79ebfb676..22738ccb47e08 100644 --- a/code/modules/NTNet/relays.dm +++ b/code/modules/NTNet/relays.dm @@ -22,7 +22,7 @@ // Denial of Service attack variables var/dos_overload = 0 // Amount of DoS "packets" in this relay's buffer var/dos_capacity = 500 // Amount of DoS "packets" in buffer required to crash the relay - var/dos_dissipate = 1 // Amount of DoS "packets" dissipated over time. + var/dos_dissipate = 0.5 // Amount of DoS "packets" dissipated over time. // TODO: Implement more logic here. For now it's only a placeholder. @@ -41,7 +41,7 @@ else icon_state = "bus_off" -/obj/machinery/ntnet_relay/process() +/obj/machinery/ntnet_relay/process(delta_time) if(is_operational()) use_power = ACTIVE_POWER_USE else @@ -49,17 +49,19 @@ update_icon() - if(dos_overload) - dos_overload = max(0, dos_overload - dos_dissipate) + if(dos_overload > 0) + dos_overload = max(0, dos_overload - dos_dissipate * delta_time) // If DoS traffic exceeded capacity, crash. if((dos_overload > dos_capacity) && !dos_failure) dos_failure = 1 + ui_update() update_icon() SSnetworks.station_network.add_log("Quantum relay switched from normal operation mode to overload recovery mode.") // If the DoS buffer reaches 0 again, restart. if((dos_overload == 0) && dos_failure) dos_failure = 0 + ui_update() update_icon() SSnetworks.station_network.add_log("Quantum relay switched from overload recovery mode to normal operation mode.") ..() diff --git a/code/modules/VR/vr_human.dm b/code/modules/VR/vr_human.dm deleted file mode 100644 index 524610c7632dc..0000000000000 --- a/code/modules/VR/vr_human.dm +++ /dev/null @@ -1,86 +0,0 @@ -/mob/living/carbon/human/virtual_reality - var/datum/mind/real_mind // where is my mind t. pixies - var/obj/machinery/vr_sleeper/vr_sleeper - var/datum/action/quit_vr/quit_action - -/mob/living/carbon/human/virtual_reality/Initialize() - . = ..() - quit_action = new() - quit_action.Grant(src) - check_area() - -/mob/living/carbon/human/virtual_reality/Moved() - . = ..() - check_area() - -/mob/living/carbon/human/virtual_reality/death() - revert_to_reality() - . = ..() - -/mob/living/carbon/human/virtual_reality/Destroy() - revert_to_reality() - return ..() - -/mob/living/carbon/human/virtual_reality/Life() - . = ..() - if(real_mind) - var/mob/living/real_me = real_mind.current - if (real_me?.stat == CONSCIOUS) - return - revert_to_reality(FALSE) - -/mob/living/carbon/human/virtual_reality/ghostize() - if(!real_mind && !vr_sleeper) - return ..() - stack_trace("Ghostize was called on a virtual reality mob") - -/mob/living/carbon/human/virtual_reality/ghost() - set category = "OOC" - set name = "Ghost" - set desc = "Relinquish your life and enter the land of the dead." - revert_to_reality(FALSE) - -/mob/living/carbon/human/virtual_reality/proc/check_area() - var/area/check = get_area(src) - if(!check || !istype(check, /area/awaymission/vr)) - return - var/area/awaymission/vr/A = check - if(A.death) - to_chat(src, "It is unwise to attempt to break Virtual Reality.") - playsound(src, 'sound/effects/supermatter.ogg', 50, 1) - dust() - return - if(A.pacifist && !HAS_TRAIT_FROM(src, TRAIT_PACIFISM, VR_ZONE_TRAIT)) - ADD_TRAIT(src, TRAIT_PACIFISM, VR_ZONE_TRAIT) - to_chat(src, "You feel like your ability to fight other living beings is being suppressed.") - else if(!A.pacifist && HAS_TRAIT_FROM(src, TRAIT_PACIFISM, VR_ZONE_TRAIT)) - REMOVE_TRAIT(src, TRAIT_PACIFISM, VR_ZONE_TRAIT) - to_chat(src, "You feel that your ability to fight is no longer being suppressed.") - -/mob/living/carbon/human/virtual_reality/proc/revert_to_reality(deathchecks = TRUE) - if(real_mind && mind) - real_mind.current.ckey = ckey - real_mind.current.stop_sound_channel(CHANNEL_HEARTBEAT) - if(deathchecks && vr_sleeper) - if(vr_sleeper.you_die_in_the_game_you_die_for_real) - to_chat(real_mind, "You feel everything fading away...") - real_mind.current.death(0) - if(deathchecks && vr_sleeper) - vr_sleeper.vr_human = null - vr_sleeper = null - if(!real_mind && !vr_sleeper) - ghostize() - real_mind = null - -/datum/action/quit_vr - name = "Quit Virtual Reality" - icon_icon = 'icons/mob/actions/actions_vr.dmi' - button_icon_state = "logout" - -/datum/action/quit_vr/Trigger() - if(..()) - if(istype(owner, /mob/living/carbon/human/virtual_reality)) - var/mob/living/carbon/human/virtual_reality/VR = owner - VR.revert_to_reality(FALSE) - else - Remove(owner) diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm deleted file mode 100644 index 4876cf85edede..0000000000000 --- a/code/modules/VR/vr_sleeper.dm +++ /dev/null @@ -1,244 +0,0 @@ - - -//Glorified teleporter that puts you in a new human body. -// it's """VR""" -/obj/machinery/vr_sleeper - name = "virtual reality sleeper" - desc = "A sleeper modified to alter the subconscious state of the user, allowing them to visit virtual worlds." - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - state_open = TRUE - occupant_typecache = list(/mob/living/carbon/human) // turned into typecache in Initialize - circuit = /obj/item/circuitboard/machine/vr_sleeper - var/you_die_in_the_game_you_die_for_real = FALSE - var/datum/effect_system/spark_spread/sparks - var/mob/living/carbon/human/virtual_reality/vr_human - var/vr_category = "default" //Specific category of spawn points to pick from - var/allow_creating_vr_humans = TRUE //So you can have vr_sleepers that always spawn you as a specific person or 1 life/chance vr games - var/only_current_user_can_interact = FALSE - -/obj/machinery/vr_sleeper/Initialize() - . = ..() - sparks = new /datum/effect_system/spark_spread() - sparks.set_up(2,0) - sparks.attach(src) - update_icon() - -/obj/machinery/vr_sleeper/attackby(obj/item/I, mob/user, params) - if(!state_open && !occupant) - if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I)) - return - if(default_change_direction_wrench(user, I)) - return - if(default_pry_open(I)) - return - if(default_deconstruction_crowbar(I)) - return - return ..() - -/obj/machinery/vr_sleeper/relaymove(mob/user) - open_machine() - -/obj/machinery/vr_sleeper/container_resist(mob/living/user) - open_machine() - -/obj/machinery/vr_sleeper/Destroy() - open_machine() - cleanup_vr_human() - QDEL_NULL(sparks) - return ..() - -/obj/machinery/vr_sleeper/hugbox - desc = "A sleeper modified to alter the subconscious state of the user, allowing them to visit virtual worlds. Seems slightly more secure." - flags_1 = NODECONSTRUCT_1 - only_current_user_can_interact = TRUE - -/obj/machinery/vr_sleeper/hugbox/emag_act(mob/user) - return - -/obj/machinery/vr_sleeper/emag_act(mob/user) - you_die_in_the_game_you_die_for_real = TRUE - sparks.start() - addtimer(CALLBACK(src, .proc/emagNotify), 150) - -/obj/machinery/vr_sleeper/update_icon() - icon_state = "[initial(icon_state)][state_open ? "-open" : ""]" - -/obj/machinery/vr_sleeper/open_machine() - if(!state_open) - if(vr_human) - vr_human.revert_to_reality(FALSE) - if(occupant) - SStgui.close_user_uis(occupant, src) - ..() - -/obj/machinery/vr_sleeper/MouseDrop_T(mob/target, mob/living/user) - if(!istype(user)) - return - if(user.stat || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser()) - return - if(isliving(user)) - var/mob/living/L = user - if(!(L.mobility_flags & MOBILITY_STAND)) - return - close_machine(target) - - -/obj/machinery/vr_sleeper/ui_state(mob/user) - return GLOB.default_state - -/obj/machinery/vr_sleeper/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "vr_sleeper") - ui.open() - -/obj/machinery/vr_sleeper/ui_act(action, params) - if(..()) - return - switch(action) - if("vr_connect") - var/mob/living/carbon/human/human_occupant = occupant - if(human_occupant?.mind && usr == occupant) - to_chat(occupant, "Transferring to virtual reality...") - if(vr_human && vr_human.stat == CONSCIOUS && !vr_human.real_mind) - SStgui.close_user_uis(occupant, src) - if(istype(human_occupant, /mob/living/carbon/human/virtual_reality)) - var/mob/living/carbon/human/virtual_reality/vr_human_occupant = human_occupant - vr_human.real_mind = vr_human_occupant.real_mind - else - vr_human.real_mind = human_occupant.mind - vr_human.ckey = human_occupant.ckey - to_chat(vr_human, "Transfer successful! You are now playing as [vr_human] in VR!") - else - if(allow_creating_vr_humans) - to_chat(occupant, "Virtual avatar not found, attempting to create one...") - var/obj/effect/landmark/vr_spawn/V = get_vr_spawnpoint() - var/turf/T = get_turf(V) - if(T) - SStgui.close_user_uis(occupant, src) - build_virtual_human(occupant, T, V.vr_outfit) - to_chat(vr_human, "Transfer successful! You are now playing as [vr_human] in VR!") - else - to_chat(occupant, "Virtual world misconfigured, aborting transfer.") - else - to_chat(occupant, "The virtual world does not support the creation of new virtual avatars, aborting transfer.") - return TRUE - if("delete_avatar") - if(!occupant || usr == occupant) - if(vr_human) - cleanup_vr_human() - else - to_chat(usr, "The VR Sleeper's safeties prevent you from doing that.") - return TRUE - if("toggle_open") - if(state_open) - close_machine() - else if ((!occupant || usr == occupant) || !only_current_user_can_interact) - open_machine() - return TRUE - -/obj/machinery/vr_sleeper/ui_data(mob/user) - var/list/data = list() - if(vr_human && !QDELETED(vr_human)) - data["can_delete_avatar"] = TRUE - var/status - switch(vr_human.stat) - if(CONSCIOUS) - status = "Conscious" - if(DEAD) - status = "Dead" - if(UNCONSCIOUS) - status = "Unconscious" - if(SOFT_CRIT) - status = "Barely Conscious" - data["vr_avatar"] = list("name" = vr_human.name, "status" = status, "health" = vr_human.health, "maxhealth" = vr_human.maxHealth) - data["toggle_open"] = state_open - data["emagged"] = you_die_in_the_game_you_die_for_real - data["isoccupant"] = (user == occupant) - return data - -/obj/machinery/vr_sleeper/proc/get_vr_spawnpoint() //proc so it can be overridden for team games or something - return safepick(GLOB.vr_spawnpoints[vr_category]) - -/obj/machinery/vr_sleeper/proc/build_spawnpoints() // used to rebuild the list for admins if need be - GLOB.vr_spawnpoints = list() - for(var/obj/effect/landmark/vr_spawn/V in GLOB.landmarks_list) - GLOB.vr_spawnpoints[V.vr_category] = V - -/obj/machinery/vr_sleeper/proc/build_virtual_human(mob/living/carbon/human/H, location, var/datum/outfit/outfit, transfer = TRUE) - if(H) - cleanup_vr_human() - vr_human = new /mob/living/carbon/human/virtual_reality(location) - vr_human.mind_initialize() - vr_human.vr_sleeper = src - vr_human.real_mind = H.mind - H.dna.transfer_identity(vr_human) - vr_human.name = H.name - vr_human.real_name = H.real_name - vr_human.socks = H.socks - vr_human.undershirt = H.undershirt - vr_human.underwear = H.underwear - vr_human.updateappearance(TRUE, TRUE, TRUE) - if(outfit) - var/datum/outfit/O = new outfit() - O.equip(vr_human) - if(transfer && H.mind) - SStgui.close_user_uis(H, src) - vr_human.ckey = H.ckey - -/obj/machinery/vr_sleeper/proc/cleanup_vr_human() - if(vr_human) - vr_human.vr_sleeper = null // Prevents race condition where a new human could get created out of order and set to null. - QDEL_NULL(vr_human) - -/obj/machinery/vr_sleeper/proc/emagNotify() - if(vr_human) - vr_human.Dizzy(10) - -/obj/effect/landmark/vr_spawn //places you can spawn in VR, auto selected by the vr_sleeper during get_vr_spawnpoint() - var/vr_category = "default" //So we can have specific sleepers, eg: "Basketball VR Sleeper", etc. - var/vr_outfit = /datum/outfit/vr - -/obj/effect/landmark/vr_spawn/Initialize() - . = ..() - LAZYADD(GLOB.vr_spawnpoints[vr_category], src) - -/obj/effect/landmark/vr_spawn/Destroy() - LAZYREMOVE(GLOB.vr_spawnpoints[vr_category], src) - return ..() - -/obj/effect/landmark/vr_spawn/team_1 - vr_category = "team_1" - -/obj/effect/landmark/vr_spawn/team_2 - vr_category = "team_2" - -/obj/effect/landmark/vr_spawn/admin - vr_category = "event" - -/obj/effect/landmark/vr_spawn/syndicate // Multiple missions will use syndicate gear - vr_outfit = /datum/outfit/vr/syndicate - -/obj/effect/vr_clean_master // Will keep VR areas that have this relatively clean. - icon = 'icons/mob/screen_gen.dmi' - icon_state = "x2" - color = "#00FF00" - invisibility = INVISIBILITY_ABSTRACT - var/area/vr_area - -/obj/effect/vr_clean_master/Initialize() - . = ..() - vr_area = get_area(src) - addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES) - -/obj/effect/vr_clean_master/proc/clean_up() - if (vr_area) - for (var/obj/item/ammo_casing/casing in vr_area) - qdel(casing) - for(var/obj/effect/decal/cleanable/C in vr_area) - qdel(C) - for (var/mob/living/carbon/human/virtual_reality/H in vr_area) - if (H.stat == DEAD && !H.vr_sleeper && !H.real_mind) - qdel(H) - addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES) diff --git a/code/modules/actionspeed/_actionspeed_modifier.dm b/code/modules/actionspeed/_actionspeed_modifier.dm new file mode 100644 index 0000000000000..a2870be6f461f --- /dev/null +++ b/code/modules/actionspeed/_actionspeed_modifier.dm @@ -0,0 +1,175 @@ +/*! Actionspeed modification datums. + + How action speed for mobs works + +Action 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 actionspeed, 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 action speed was a shot in the dark that usually meant mobs got stuck going faster or slower + +Actionspeed 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 actionspeed 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 + +*/ + +/datum/actionspeed_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 + + /// Other modification datums this conflicts with. + var/conflicts_with + +/datum/actionspeed_modifier/New() + . = ..() + if(!id) + id = "[type]" //We turn the path into a string. + +GLOBAL_LIST_EMPTY(actionspeed_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_actionspeed_modifier(modtype) + if(!ispath(modtype, /datum/actionspeed_modifier)) + CRASH("[modtype] is not a actionspeed modification typepath.") + var/datum/actionspeed_modifier/actionspeed_mod = modtype + if(initial(actionspeed_mod.variable)) + CRASH("[modtype] is a variable modifier, and can never be cached.") + actionspeed_mod = GLOB.actionspeed_modification_cache[modtype] + if(!actionspeed_mod) + actionspeed_mod = GLOB.actionspeed_modification_cache[modtype] = new modtype + return actionspeed_mod + +///Add a action 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_actionspeed_modifier(datum/actionspeed_modifier/type_or_datum, update = TRUE) + if(ispath(type_or_datum)) + if(!initial(type_or_datum.variable)) + type_or_datum = get_cached_actionspeed_modifier(type_or_datum) + else + type_or_datum = new type_or_datum + var/datum/actionspeed_modifier/existing = LAZYACCESS(actionspeed_modification, type_or_datum.id) + if(existing) + if(existing == type_or_datum) //same thing don't need to touch + return TRUE + remove_actionspeed_modifier(existing, FALSE) + if(length(actionspeed_modification)) + BINARY_INSERT(type_or_datum.id, actionspeed_modification, /datum/actionspeed_modifier, type_or_datum, priority, COMPARE_VALUE) + LAZYSET(actionspeed_modification, type_or_datum.id, type_or_datum) + if(update) + update_actionspeed() + return TRUE + +/// Remove a action speed modifier from a mob, whether static or variable. +/mob/proc/remove_actionspeed_modifier(datum/actionspeed_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(actionspeed_modification, key)) + return FALSE + LAZYREMOVE(actionspeed_modification, key) + if(update) + update_actionspeed(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_actionspeed_modifier(datum/actionspeed_modifier/type_id_datum, update = TRUE, multiplicative_slowdown) + var/modified = FALSE + var/inject = FALSE + var/datum/actionspeed_modifier/final + if(istext(type_id_datum)) + final = LAZYACCESS(actionspeed_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(actionspeed_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(actionspeed_modification, final.id)) + inject = TRUE + modified = TRUE + if(!isnull(multiplicative_slowdown)) + final.multiplicative_slowdown = multiplicative_slowdown + modified = TRUE + if(inject) + add_actionspeed_modifier(final, FALSE) + if(update && modified) + update_actionspeed(TRUE) + return final + +///Is there a actionspeed modifier for this mob +/mob/proc/has_actionspeed_modifier(datum/actionspeed_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(actionspeed_modification, key) + +/// Go through the list of actionspeed modifiers and calculate a final actionspeed. ANY ADD/REMOVE DONE IN UPDATE_actionspeed MUST HAVE THE UPDATE ARGUMENT SET AS FALSE! +/mob/proc/update_actionspeed() + . = 0 + var/list/conflict_tracker = list() + for(var/key in get_actionspeed_modifiers()) + var/datum/actionspeed_modifier/M = actionspeed_modification[key] + 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_actions_slowdown = . + +///Adds a default action speed +/mob/proc/initialize_actionspeed() + add_or_update_variable_actionspeed_modifier(/datum/actionspeed_modifier/base, multiplicative_slowdown = 1) + +/// Get the action speed modifiers list of the mob +/mob/proc/get_actionspeed_modifiers() + . = LAZYCOPY(actionspeed_modification) + for(var/id in actionspeed_mod_immunities) + . -= id + +/// Checks if a action speed modifier is valid and not missing any data +/proc/actionspeed_data_null_check(datum/actionspeed_modifier/M) //Determines if a data list is not meaningful and should be discarded. + . = !(M.multiplicative_slowdown) diff --git a/code/modules/actionspeed/modifiers/base.dm b/code/modules/actionspeed/modifiers/base.dm new file mode 100644 index 0000000000000..97c5124c3bc61 --- /dev/null +++ b/code/modules/actionspeed/modifiers/base.dm @@ -0,0 +1,2 @@ +/datum/actionspeed_modifier/base + variable = TRUE diff --git a/code/modules/actionspeed/modifiers/mood.dm b/code/modules/actionspeed/modifiers/mood.dm new file mode 100644 index 0000000000000..d8ed005d42b35 --- /dev/null +++ b/code/modules/actionspeed/modifiers/mood.dm @@ -0,0 +1,7 @@ +/datum/actionspeed_modifier/low_sanity + multiplicative_slowdown = 0.25 + id = ACTIONSPEED_ID_SANITY + +/datum/actionspeed_modifier/high_sanity + multiplicative_slowdown = -0.1 + id = ACTIONSPEED_ID_SANITY diff --git a/code/modules/actionspeed/modifiers/race.dm b/code/modules/actionspeed/modifiers/race.dm new file mode 100644 index 0000000000000..2e34c7bfe9f26 --- /dev/null +++ b/code/modules/actionspeed/modifiers/race.dm @@ -0,0 +1,2 @@ +/datum/actionspeed_modifier/cogscarab + multiplicative_slowdown = 0.6 diff --git a/code/modules/actionspeed/modifiers/status_effects.dm b/code/modules/actionspeed/modifiers/status_effects.dm new file mode 100644 index 0000000000000..74846303d6e31 --- /dev/null +++ b/code/modules/actionspeed/modifiers/status_effects.dm @@ -0,0 +1,2 @@ +/datum/actionspeed_modifier/timecookie + multiplicative_slowdown = -0.05 diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 5c2ea87602247..a56fe949f1e20 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -9,7 +9,7 @@ GLOBAL_LIST_EMPTY(ckey_redirects) /world/IsBanned(key, address, computer_id, type, real_bans_only=FALSE) - debug_world_log("isbanned(): '[args.Join("', '")]'") + debug_world_log("isbanned(): SRC:'[src]', USR:'[usr]' ARGS:'[args.Join("', '")]'") if (!key || (!real_bans_only && (!address || !computer_id))) if(real_bans_only) return FALSE diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index e8b196b5149ec..dcce6a141af72 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1,4 +1,3 @@ - //////////////////////////////// /proc/message_admins(msg) msg = "ADMIN LOG: [msg]" @@ -43,6 +42,12 @@ if(M.client) body += "

      First Seen: [M.client.player_join_date]
      Byond account registered on: [M.client.account_join_date]" + + if(M.client?.tgui_panel) + body += M.client.tgui_panel.show_notices() //The datum holds a reference to the client already, no need to pass it. + else //This should never happen in practice. + body += "
      Telemetry Status: USER CHAT NOT LOADED, CALL A CODER MAYBE?" + body += "

      CentCom Galactic Ban DB: " if(CONFIG_GET(string/centcom_ban_db)) body += "Search" @@ -254,7 +259,7 @@ dat+="

      The newscaster recognises you as:
      [src.admin_signature]
      " if(1) dat+= "Station Feed Channels
      " - if( isemptylist(GLOB.news_network.network_channels) ) + if( !length(GLOB.news_network.network_channels) ) dat+="No active channels found..." else for(var/datum/newscaster/feed_channel/CHANNEL in GLOB.news_network.network_channels) @@ -307,7 +312,7 @@ dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
      " dat+="No further feed story additions are allowed while the D-Notice is in effect.

      " else - if( isemptylist(src.admincaster_feed_channel.messages) ) + if( !length(src.admincaster_feed_channel.messages) ) dat+="No feed messages found in channel...
      " else var/i = 0 @@ -329,7 +334,7 @@ dat+="NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.
      " dat+="Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it.
      " dat+="
      Select Feed channel to get Stories from:
      " - if(isemptylist(GLOB.news_network.network_channels)) + if(!length(GLOB.news_network.network_channels)) dat+="No feed channels found active...
      " else for(var/datum/newscaster/feed_channel/CHANNEL in GLOB.news_network.network_channels) @@ -340,7 +345,7 @@ dat+="A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station's" dat+="morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed" dat+="stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.
      " - if(isemptylist(GLOB.news_network.network_channels)) + if(!length(GLOB.news_network.network_channels)) dat+="No feed channels found active...
      " else for(var/datum/newscaster/feed_channel/CHANNEL in GLOB.news_network.network_channels) @@ -351,7 +356,7 @@ dat+="[src.admincaster_feed_channel.channel_name]: \[ created by: [src.admincaster_feed_channel.returnAuthor(-1)] \]
      " dat+="[(src.admincaster_feed_channel.authorCensor) ? ("Undo Author censorship") : ("Censor channel Author")]
      " - if( isemptylist(src.admincaster_feed_channel.messages) ) + if( !length(src.admincaster_feed_channel.messages) ) dat+="No feed messages found in channel...
      " else for(var/datum/newscaster/feed_message/MESSAGE in src.admincaster_feed_channel.messages) @@ -368,7 +373,7 @@ dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
      " dat+="No further feed story additions are allowed while the D-Notice is in effect.

      " else - if( isemptylist(src.admincaster_feed_channel.messages) ) + if( !length(src.admincaster_feed_channel.messages) ) dat+="No feed messages found in channel...
      " else for(var/datum/newscaster/feed_message/MESSAGE in src.admincaster_feed_channel.messages) @@ -438,8 +443,7 @@ "} if(GLOB.master_mode == "secret") dat += "(Force Secret Mode)
      " - - if(GLOB.master_mode == "dynamic") + if(SSticker.is_mode("dynamic")) if(SSticker.current_state <= GAME_STATE_PREGAME) dat += "(Force Roundstart Rulesets)
      " if (GLOB.dynamic_forced_roundstart_ruleset.len > 0) @@ -543,27 +547,12 @@ No stacking: - Option is [GLOB.dynamic_no_stacking ? "ON" : "OFF"].
      Unless the threat goes above [GLOB.dynamic_stacking_limit], only one "round-ender" ruleset will be drafted.

      - Classic secret mode: - Option is [GLOB.dynamic_classic_secret ? "ON" : "OFF"]. -
      Only one roundstart ruleset will be drafted. Only traitors and minor roles will latespawn.
      -
      -
      Forced threat level: Current value : [GLOB.dynamic_forced_threat_level].
      The value threat is set to if it is higher than -1.

      - High population limit: Current value : [GLOB.dynamic_high_pop_limit]. -
      The threshold at which "high population override" will be in effect.

      Stacking threeshold: Current value : [GLOB.dynamic_stacking_limit].
      The threshold at which "round-ender" rulesets will stack. A value higher than 100 ensure this never happens.
      -

      Advanced parameters

      - Curve centre: -> [GLOB.dynamic_curve_centre] <-
      - Curve width: -> [GLOB.dynamic_curve_width] <-
      - Latejoin injection delay:
      - Minimum: -> [GLOB.dynamic_latejoin_delay_min / 60 / 10] <- Minutes
      - Maximum: -> [GLOB.dynamic_latejoin_delay_max / 60 / 10] <- Minutes
      - Midround injection delay:
      - Minimum: -> [GLOB.dynamic_midround_delay_min / 60 / 10] <- Minutes
      - Maximum: -> [GLOB.dynamic_midround_delay_max / 60 / 10] <- Minutes
      "} user << browse(dat, "window=dyn_mode_options;size=900x650") @@ -704,7 +693,7 @@ log_admin("[key_name(usr)] delayed the round start.") else to_chat(world, "The game will start in [DisplayTimeText(newtime)].") - SEND_SOUND(world, sound('sound/ai/attention.ogg')) + SEND_SOUND(world, sound('sound/ai/default/attention.ogg')) log_admin("[key_name(usr)] set the pre-game delay to [DisplayTimeText(newtime)].") SSblackbox.record_feedback("tally", "admin_verb", 1, "Delay Game Start") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -716,6 +705,9 @@ SSticker.admin_delay_notice = input(usr, "Enter a reason for delaying the round end", "Round Delay Reason") as null|text if(isnull(SSticker.admin_delay_notice)) return + for(var/client/admin in GLOB.admins) + if(check_rights(R_FUN) && !GLOB.battle_royale && admin.tgui_panel && SSticker.current_state == GAME_STATE_FINISHED) + admin.tgui_panel.give_br_popup() else if(alert(usr, "Really cancel current round end delay? The reason for the current delay is: \"[SSticker.admin_delay_notice]\"", "Undelay round end", "Yes", "No") != "Yes") return @@ -783,7 +775,7 @@ var/obj/structure/closet/supplypod/centcompod/pod = new() var/atom/A = new chosen(pod) A.flags_1 |= ADMIN_SPAWNED_1 - new /obj/effect/DPtarget(T, pod) + new /obj/effect/pod_landingzone(T, pod) log_admin("[key_name(usr)] pod-spawned [chosen] at [AREACOORD(usr)]") SSblackbox.record_feedback("tally", "admin_verb", 1, "Podspawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -855,20 +847,26 @@ for(var/i in GLOB.silicon_mobs) var/mob/living/silicon/S = i ai_number++ + var/message = "" if(isAI(S)) - to_chat(usr, "AI [key_name(S, usr)]'s laws:") + message += "AI [key_name(S, usr)]'s laws:" else if(iscyborg(S)) var/mob/living/silicon/robot/R = S - to_chat(usr, "CYBORG [key_name(S, usr)] [R.connected_ai?"(Slaved to: [key_name(R.connected_ai)])":"(Independent)"]: laws:") + message += "CYBORG [key_name(S, usr)] [R.connected_ai?"(Slaved to: [key_name(R.connected_ai)])":"(Independent)"]: laws:" else if (ispAI(S)) - to_chat(usr, "pAI [key_name(S, usr)]'s laws:") + message += "pAI [key_name(S, usr)]'s laws:" else - to_chat(usr, "SOMETHING SILICON [key_name(S, usr)]'s laws:") + message += "SOMETHING SILICON [key_name(S, usr)]'s laws:" + + message += "
      " if (S.laws == null) - to_chat(usr, "[key_name(S, usr)]'s laws are null?? Contact a coder.") + message += "[key_name(S, usr)]'s laws are null?? Contact a coder." else - S.laws.show_laws(usr) + message += jointext(S.laws.get_law_list(include_zeroth = TRUE), "
      ") + + to_chat(usr, message) + if(!ai_number) to_chat(usr, "No AIs located" ) @@ -979,7 +977,7 @@ if (!frommob || !tomob) //make sure the mobs don't go away while we waited for a response return 1 - tomob.ghostize(0) + tomob.ghostize(FALSE) message_admins("[key_name_admin(usr)] has put [frommob.key] in control of [tomob.name].") log_admin("[key_name(usr)] stuffed [frommob.key] into [tomob.name].") diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index c6a4850f4677f..0fbc143c21639 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -1,5 +1,5 @@ /atom/proc/investigate_log(message, subject) - if(!message || !subject) + if(!message || !subject || SSticker.current_state == GAME_STATE_FINISHED) return var/F = file("[GLOB.log_directory]/[subject].html") WRITE_FILE(F, "[time_stamp()] [REF(src)] ([x],[y],[z]) || [src] [message]
      ") @@ -10,7 +10,7 @@ if(!holder) return - var/list/investigates = list(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_NANITES, INVESTIGATE_PRESENTS, INVESTIGATE_CIRCUIT) + var/list/investigates = list(INVESTIGATE_RESEARCH, INVESTIGATE_EXONET, INVESTIGATE_PORTAL, INVESTIGATE_ENGINES, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS, INVESTIGATE_RADIATION, INVESTIGATE_NANITES, INVESTIGATE_PRESENTS) var/list/logs_present = list("notes, memos, watchlist") var/list/logs_missing = list("---") diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 3e31b85456999..e4d0de3140455 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -10,6 +10,7 @@ GLOBAL_PROTECT(protected_ranks) var/exclude_rights = 0 var/include_rights = 0 var/can_edit_rights = 0 + var/badge_icon /datum/admin_rank/New(init_name, init_rights, init_exclude_rights, init_edit_rights) if(IsAdminAdvancedProcCall()) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 11d86ba64f833..9ff7bee9da21d 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -18,7 +18,8 @@ GLOBAL_PROTECT(admin_verbs_default) /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/ /client/proc/cmd_admin_pm_panel, /*admin-pm list*/ /client/proc/stop_sounds, - /client/proc/mark_datum_mapview + /client/proc/mark_datum_mapview, + /client/proc/requests ) GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin()) GLOBAL_PROTECT(admin_verbs_admin) @@ -27,9 +28,10 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/invisimin, /*allows our mob to go invisible/visible*/ // /datum/admins/proc/show_traitor_panel, /*interface which shows a mob's mind*/ -Removed due to rare practical use. Moved to debug verbs ~Errorage /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/ - /datum/verbs/menu/Admin/verb/playerpanel, + /client/proc/playerpanel, /client/proc/game_panel, /*game panel, allows to change game-mode etc*/ /client/proc/check_ai_laws, /*shows AI and borg laws*/ + /client/proc/ghost_pool_protection, /*opens a menu for toggling ghost roles*/ /datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/ /datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/ /datum/admins/proc/toggleenter, /*toggles whether people can join the current game*/ @@ -77,7 +79,8 @@ GLOBAL_PROTECT(admin_verbs_admin) /datum/admins/proc/open_borgopanel, /client/proc/fix_say, /client/proc/stabilize_atmos, - /client/proc/openTicketManager + /client/proc/openTicketManager, + /client/proc/battle_royale ) GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/ban_panel, /client/proc/stickybanpanel)) GLOBAL_PROTECT(admin_verbs_ban) @@ -149,6 +152,7 @@ GLOBAL_PROTECT(admin_verbs_debug) /client/proc/enable_debug_verbs, /client/proc/callproc, /client/proc/callproc_datum, + /client/proc/forcemapconfig, /client/proc/SDQL2_query, /client/proc/test_movable_UI, /client/proc/test_snap_UI, @@ -166,6 +170,7 @@ GLOBAL_PROTECT(admin_verbs_debug) /client/proc/map_template_load, /client/proc/map_template_upload, /client/proc/jump_to_ruin, + /client/proc/generate_ruin, /client/proc/clear_dynamic_transit, /client/proc/fucky_wucky, /client/proc/toggle_medal_disable, @@ -174,8 +179,18 @@ GLOBAL_PROTECT(admin_verbs_debug) /client/proc/cmd_display_init_log, /client/proc/cmd_display_overlay_log, /client/proc/reload_configuration, + /client/proc/give_all_spells, /datum/admins/proc/create_or_modify_area, - /client/proc/toggle_cdn + /datum/admins/proc/fixcorruption, + #ifdef TESTING + /client/proc/export_dynamic_json, + /client/proc/run_dynamic_simulations, + #endif + #ifdef SENDMAPS_PROFILE + /client/proc/display_sendmaps, + #endif + /client/proc/toggle_cdn, + /client/proc/check_timer_sources ) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release)) @@ -257,36 +272,38 @@ GLOBAL_PROTECT(admin_verbs_hideable) control_freak = CONTROL_FREAK_SKIN | CONTROL_FREAK_MACROS var/rights = holder.rank.rights - verbs += GLOB.admin_verbs_default + add_verb(GLOB.admin_verbs_default) if(rights & R_BUILD) - verbs += /client/proc/togglebuildmodeself + add_verb(/client/proc/togglebuildmodeself) if(rights & R_ADMIN) - verbs += GLOB.admin_verbs_admin + add_verb(GLOB.admin_verbs_admin) if(rights & R_BAN) - verbs += GLOB.admin_verbs_ban + add_verb(GLOB.admin_verbs_ban) if(rights & R_FUN) - verbs += GLOB.admin_verbs_fun + add_verb(GLOB.admin_verbs_fun) if(rights & R_SERVER) - verbs += GLOB.admin_verbs_server + add_verb(GLOB.admin_verbs_server) if(rights & R_DEBUG) - verbs += GLOB.admin_verbs_debug + add_verb(GLOB.admin_verbs_debug) if(rights & R_POSSESS) - verbs += GLOB.admin_verbs_possess + add_verb(GLOB.admin_verbs_possess) if(rights & R_PERMISSIONS) - verbs += GLOB.admin_verbs_permissions + add_verb(GLOB.admin_verbs_permissions) if(rights & R_STEALTH) - verbs += /client/proc/stealth + add_verb(/client/proc/stealth) if(rights & R_ADMIN) - verbs += GLOB.admin_verbs_poll + add_verb(GLOB.admin_verbs_poll) if(rights & R_SOUND) - verbs += GLOB.admin_verbs_sounds + add_verb(GLOB.admin_verbs_sounds) if(CONFIG_GET(string/invoke_youtubedl)) - verbs += /client/proc/play_web_sound + add_verb(/client/proc/play_web_sound) if(rights & R_SPAWN) - verbs += GLOB.admin_verbs_spawn + add_verb(GLOB.admin_verbs_spawn) + reset_badges() /client/proc/remove_admin_verbs() - verbs.Remove( + var/list/verb_list = list() + verb_list.Add( GLOB.admin_verbs_default, /client/proc/togglebuildmodeself, GLOB.admin_verbs_admin, @@ -307,13 +324,15 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/readmin, /client/proc/fix_say ) + remove_verb(verb_list) + reset_badges() /client/proc/hide_most_verbs()//Allows you to keep some functionality while hiding some verbs set name = "Adminverbs - Hide Most" set category = "Admin" - verbs.Remove(/client/proc/hide_most_verbs, GLOB.admin_verbs_hideable) - verbs += /client/proc/show_verbs + remove_verb(list(/client/proc/hide_most_verbs) + GLOB.admin_verbs_hideable) + add_verb(/client/proc/show_verbs) to_chat(src, "Most of your adminverbs have been hidden.") SSblackbox.record_feedback("tally", "admin_verb", 1, "Hide Most Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -324,7 +343,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) set category = "Admin" remove_admin_verbs() - verbs += /client/proc/show_verbs + add_verb(/client/proc/show_verbs) to_chat(src, "Almost all of your adminverbs have been hidden.") SSblackbox.record_feedback("tally", "admin_verb", 1, "Hide All Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -334,7 +353,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) set name = "Adminverbs - Show" set category = "Admin" - verbs -= /client/proc/show_verbs + remove_verb(/client/proc/show_verbs) add_admin_verbs() to_chat(src, "All of your adminverbs are now visible.") @@ -368,7 +387,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(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! @@ -476,6 +495,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) if(holder) if(holder.fakekey) holder.fakekey = null + reset_badges() if(isobserver(mob)) mob.invisibility = initial(mob.invisibility) mob.alpha = initial(mob.alpha) @@ -486,6 +506,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) if(!new_key) return holder.fakekey = new_key + reset_badges() createStealthKey() if(isobserver(mob)) mob.invisibility = INVISIBILITY_MAXIMUM //JUST IN CASE @@ -648,6 +669,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) log_admin("[key_name(usr)] made [O] at [AREACOORD(O)] say \"[message]\"") message_admins("[key_name_admin(usr)] made [O] at [AREACOORD(O)]. say \"[message]\"") SSblackbox.record_feedback("tally", "admin_verb", 1, "Object Say") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /client/proc/togglebuildmodeself() set name = "Toggle Build Mode Self" set category = "Adminbus" @@ -711,34 +733,34 @@ GLOBAL_PROTECT(admin_verbs_hideable) set category = "Debug" set desc = "(\"Amount of mobs to create\") Populate the world with test mobs." - if (amount > 0) + if(amount > 0) var/area/area var/list/candidates var/turf/open/floor/tile var/j,k - for (var/i = 1 to amount) + for(var/i = 1 to amount) j = 100 do area = pick(GLOB.the_station_areas) - if (area) + if(area) candidates = get_area_turfs(area) - if (candidates.len) + if(candidates.len) k = 100 do tile = pick(candidates) while ((!tile || !istype(tile)) && --k > 0) - if (tile) + if(tile) var/mob/living/carbon/human/hooman = new(tile) hooman.equipOutfit(pick(subtypesof(/datum/outfit))) testing("Spawned test mob at [COORD(tile)]") - while (!area && --j > 0) + while(!area && --j > 0) /client/proc/toggle_AI_interact() set name = "Toggle Admin AI Interact" @@ -779,7 +801,10 @@ GLOBAL_PROTECT(admin_verbs_hideable) can.valve_open = FALSE can.update_icon() +#ifdef SENDMAPS_PROFILE +/client/proc/display_sendmaps() + set name = "Send Maps Profile" + set category = "Debug" - - - + src << link("?debug=profile&type=sendmaps&window=test") +#endif diff --git a/code/modules/admin/adminmenu.dm b/code/modules/admin/adminmenu.dm index 64ce5987cfd5d..0378ac39f3c62 100644 --- a/code/modules/admin/adminmenu.dm +++ b/code/modules/admin/adminmenu.dm @@ -1,11 +1,7 @@ -/datum/verbs/menu/Admin/Generate_list(client/C) - if (C.holder) - . = ..() - -/datum/verbs/menu/Admin/verb/playerpanel() +/client/proc/playerpanel() set name = "Player Panel" set desc = "Player Panel" set category = "Admin" - if(usr.client.holder) - usr.client.holder.player_panel_new() + if(holder) + holder.player_panel_new() SSblackbox.record_feedback("tally", "admin_verb", 1, "Player Panel New") //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 1672310567794..2c98483461b4f 100644 --- a/code/modules/admin/antag_panel.dm +++ b/code/modules/admin/antag_panel.dm @@ -47,7 +47,7 @@ GLOBAL_VAR(antag_prototypes) else var/obj_count = 1 for(var/datum/objective/objective in objectives) - result += "[obj_count]: [objective.explanation_text] Edit Delete [objective.completed ? "Mark as incomplete" : "Mark as complete"]
      " + result += "[obj_count]: [objective.explanation_text] Edit Delete [objective.completed ? "Mark as incomplete" : "Mark as complete"]
      " obj_count++ result += "Add objective
      " result += "Announce objectives
      " @@ -77,7 +77,7 @@ GLOBAL_VAR(antag_prototypes) return common_commands /datum/mind/proc/get_special_statuses() - var/list/result = list() + var/list/result = LAZYCOPY(special_statuses) if(!current) result += "No body!" if(current && HAS_TRAIT(current, TRAIT_MINDSHIELD)) @@ -128,7 +128,7 @@ GLOBAL_VAR(antag_prototypes) var/list/possible_admin_antags = list() for(var/datum/antagonist/prototype in GLOB.antag_prototypes[antag_category]) - var/datum/antagonist/A = has_antag_datum(prototype.type) + var/datum/antagonist/A = has_antag_datum(prototype.type, FALSE) if(A) //We got the antag if(!current_antag) @@ -166,7 +166,10 @@ GLOBAL_VAR(antag_prototypes) pref_source = prototype break if(pref_source.job_rank) - antag_header_parts += pref_source.enabled_in_preferences(src) ? "Enabled in Prefs" : "Disabled in Prefs" + if(!is_banned_from(src.key, pref_source.job_rank)) + antag_header_parts += pref_source.enabled_in_preferences(src) ? "Enabled in Prefs" : "Disabled in Prefs" + else + antag_header_parts += "\[BANNED\]" //Traitor : None | Traitor | IAA // Command1 | Command2 | Command3 @@ -214,4 +217,4 @@ GLOBAL_VAR(antag_prototypes) var/datum/browser/panel = new(usr, "traitorpanel", "", 600, 600) panel.set_content(out) panel.open() - return \ No newline at end of file + return diff --git a/code/modules/admin/battle_royale.dm b/code/modules/admin/battle_royale.dm new file mode 100644 index 0000000000000..5cc22e8c18369 --- /dev/null +++ b/code/modules/admin/battle_royale.dm @@ -0,0 +1,447 @@ +//Global lists so they can be editted by admins +GLOBAL_LIST_INIT(battle_royale_basic_loot, list( + /obj/item/soap, + /obj/item/kitchen/knife, + /obj/item/kitchen/knife/combat, + /obj/item/kitchen/knife/poison, + /obj/item/throwing_star, + /obj/item/syndie_glue, + /obj/item/book_of_babel, + /obj/item/card/emag, + /obj/item/storage/box/emps, + /obj/item/storage/box/lethalshot, + /obj/item/storage/box/gorillacubes, + /obj/item/storage/box/teargas, + /obj/item/storage/box/security/radio, + /obj/item/storage/box/medsprays, + /obj/item/storage/toolbox/syndicate, + /obj/item/storage/box/syndie_kit/bee_grenades, + /obj/item/storage/box/syndie_kit/centcom_costume, + /obj/item/storage/box/syndie_kit/chameleon, + /obj/item/storage/box/syndie_kit/chemical, + /obj/item/storage/box/syndie_kit/emp, + /obj/item/storage/box/syndie_kit/imp_adrenal, + /obj/item/storage/box/syndie_kit/imp_freedom, + /obj/item/storage/box/syndie_kit/imp_radio, + /obj/item/storage/box/syndie_kit/imp_stealth, + /obj/item/storage/box/syndie_kit/imp_storage, + /obj/item/storage/box/syndie_kit/imp_uplink, + /obj/item/storage/box/syndie_kit/origami_bundle, + /obj/item/storage/box/syndie_kit/throwing_weapons, + /obj/item/storage/box/syndie_kit/bundle_A, + /obj/item/storage/box/syndie_kit/bundle_B, + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/gun/energy/disabler, + /obj/item/construction/rcd, + /obj/item/clothing/glasses/chameleon/flashproof, + /obj/item/book/granter/spell/knock, + /obj/item/clothing/glasses/sunglasses/advanced, + /obj/item/clothing/glasses/thermal/eyepatch, + /obj/item/clothing/glasses/thermal/syndi, + /obj/item/clothing/suit/space, + /obj/item/clothing/suit/armor/riot, + /obj/item/clothing/suit/armor/vest, + /obj/item/clothing/suit/armor/vest/russian_coat, + /obj/item/clothing/suit/armor/hos/trenchcoat, + /obj/item/clothing/mask/chameleon, + /obj/item/clothing/head/centhat, + /obj/item/clothing/head/crown, + /obj/item/clothing/head/HoS/syndicate, + /obj/item/clothing/head/helmet, + /obj/item/clothing/head/helmet/clockcult, + /obj/item/clothing/head/helmet/space, + /obj/item/clothing/head/helmet/sec, + /obj/item/clothing/under/syndicate, + /obj/item/clothing/gloves/combat, + /obj/item/deployablemine/stun, + /obj/item/switchblade, + /obj/item/club/tailclub, + /obj/item/nullrod/tribal_knife, + /obj/item/nullrod/fedora, + /obj/item/nullrod/godhand, + /obj/item/melee/baton/loaded, + /obj/item/melee/chainofcommand/tailwhip/kitty, + /obj/item/melee/classic_baton, + /obj/item/melee/ghost_sword, + /obj/item/melee/powerfist, + /obj/item/storage/firstaid/advanced, + /obj/item/storage/firstaid/brute, + /obj/item/storage/firstaid/fire, + /obj/item/storage/firstaid/medical, + /obj/item/storage/firstaid/tactical, + /obj/item/gun/energy/ionrifle, + /obj/item/organ/regenerative_core/battle_royale + )) + +GLOBAL_LIST_INIT(battle_royale_good_loot, list( + /obj/item/hand_tele, + /obj/item/gun/ballistic/bow/clockbolt, + /obj/item/gun/ballistic/rifle/boltaction, + /obj/item/gun/ballistic/shotgun/doublebarrel, + /obj/item/gun/energy/laser/captain, + /obj/item/gun/ballistic/revolver/mateba, + /obj/item/gun/ballistic/automatic/c20r, + /obj/item/ammo_box/magazine/smgm45, + /obj/item/ammo_box/magazine/pistolm9mm, + /obj/item/katana, + /obj/item/melee/transforming/energy/sword, + /obj/item/dualsaber, + /obj/item/fireaxe, + /obj/item/stack/telecrystal/five, + /obj/item/stack/telecrystal/twenty, + /obj/item/clothing/suit/space/hardsuit/syndi + )) + +GLOBAL_LIST_INIT(battle_royale_insane_loot, list( + /obj/item/gun/ballistic/automatic/l6_saw/unrestricted, + /obj/item/energy_katana, + /obj/item/clothing/suit/space/hardsuit/shielded/syndi, + /obj/item/his_grace, + /obj/mecha/combat/marauder/mauler/loaded, + /obj/item/guardiancreator/tech, + /obj/item/mjollnir, + /obj/item/pneumatic_cannon/pie/selfcharge, + /obj/item/uplink/nuclear + )) + +GLOBAL_DATUM(battle_royale, /datum/battle_royale_controller) + +#define BATTLE_ROYALE_AVERBS list(\ + /client/proc/battle_royale_speed,\ + /client/proc/battle_royale_varedit,\ + /client/proc/battle_royale_spawn_loot,\ + /client/proc/battle_royale_spawn_loot_good\ +) + +/client/proc/battle_royale() + set name = "Battle Royale" + set category = "Adminbus" + if(!(check_rights(R_FUN) || (check_rights(R_ADMIN) && SSticker.current_state == GAME_STATE_FINISHED))) + to_chat(src, "You do not have permission to do that! (If you don't have +FUN, wait until the round is over then you can trigger it.)") + return + if(GLOB.battle_royale) + to_chat(src, "A game is already in progress!") + return + if(alert(src, "ARE YOU SURE YOU ARE SURE YOU WANT TO START BATTLE ROYALE?",,"Yes","No") != "Yes") + to_chat(src, "oh.. ok then.. I see how it is.. :(") + return + log_admin("[key_name(usr)] HAS TRIGGERED BATTLE ROYALE") + message_admins("[key_name(usr)] HAS TRIGGERED BATTLE ROYALE") + + for(var/client/admin in GLOB.admins) + if(check_rights(R_ADMIN) && !GLOB.battle_royale && admin.tgui_panel) + admin.tgui_panel.clear_br_popup() + + GLOB.battle_royale = new() + GLOB.battle_royale.start() + +/client/proc/battle_royale_speed() + set name = "Battle Royale - Change wall speed" + set category = "Event" + if(!check_rights(R_ADMIN)) + to_chat(src, "You do not have permission to do that!") + return + if(!GLOB.battle_royale) + to_chat(src, "No game is in progress.") + return + var/new_speed = input(src, "New wall delay (seconds)") as num + if(new_speed > 0) + GLOB.battle_royale.field_delay = new_speed + log_admin("[key_name(usr)] has changed the field delay to [new_speed] seconds") + message_admins("[key_name(usr)] has changed the field delay to [new_speed] seconds") + +/client/proc/battle_royale_varedit() + set name = "Battle Royale - Variable Edit" + set category = "Event" + if(!check_rights(R_FUN)) + to_chat(src, "You do not have permission to do that!") + return + if(!GLOB.battle_royale) + to_chat(src, "No game is in progress.") + return + debug_variables(GLOB.battle_royale) + +/client/proc/battle_royale_spawn_loot() + set name = "Battle Royale - Spawn Loot Drop (Minor)" + set category = "Event" + if(!check_rights(R_FUN)) + to_chat(src, "You do not have permission to do that!") + return + if(!GLOB.battle_royale) + to_chat(src, "No game is in progress.") + return + GLOB.battle_royale.generate_good_drop() + log_admin("[key_name(usr)] generated a battle royale drop.") + message_admins("[key_name(usr)] generated a battle royale drop.") + +/client/proc/battle_royale_spawn_loot_good() + set name = "Battle Royale - Spawn Loot Drop (Major)" + set category = "Event" + if(!check_rights(R_FUN)) + to_chat(src, "You do not have permission to do that!") + return + if(!GLOB.battle_royale) + to_chat(src, "No game is in progress.") + return + GLOB.battle_royale.generate_endgame_drop() + log_admin("[key_name(usr)] generated a good battle royale drop.") + message_admins("[key_name(usr)] generated a good battle royale drop.") + +/datum/battle_royale_controller + var/list/players + var/datum/proximity_monitor/advanced/battle_royale/field_wall + var/radius = 118 + var/process_num = 0 + var/list/death_wall + var/field_delay = 15 + var/debug_mode = FALSE + +/datum/battle_royale_controller/Destroy(force, ...) + QDEL_LIST(death_wall) + for(var/client/C in GLOB.admins) + C.remove_verb(BATTLE_ROYALE_AVERBS) + . = ..() + GLOB.enter_allowed = TRUE + world.update_status() + GLOB.battle_royale = null + +//Trigger random events and shit, update the world border +/datum/battle_royale_controller/process() + process_num++ + //Once every 25 seconds + if(prob(4)) + generate_basic_loot(5) + //Once every 50 seconds. + if(prob(2)) + generate_good_drop() + var/living_victims = 0 + var/mob/winner + for(var/mob/living/M as() in players) + if(QDELETED(M)) + players -= M + continue + if(M.stat == DEAD) //We aren't going to remove them from the list in case they somehow revive. + continue + var/turf/T = get_turf(M) + if(T.x > 128 + radius || T.x < 128 - radius || T.y > 128 + radius || T.y < 128 - radius) + to_chat(M, "You have left the zone!") + M.gib() + if(!SSmapping.level_trait(T.z, ZTRAIT_STATION) && !SSmapping.level_trait(T.z, ZTRAIT_RESERVED)) + to_chat(M, "You have left the z-level!") + M.gib() + living_victims++ + winner = M + CHECK_TICK + if(living_victims <= 1 && !debug_mode) + to_chat(world, "VICTORY ROYALE!!") + if(winner) + winner.client?.process_greentext() + to_chat(world, "[key_name(winner)] is the winner!") + new /obj/item/melee/supermatter_sword(get_turf(winner)) + qdel(src) + return + //Once every 15 seconsd + // 1,920 seconds (about 32 minutes per game) + if(process_num % (field_delay) == 0) + for(var/obj/effect/death_wall/wall as() in death_wall) + wall.decrease_size() + if(QDELETED(wall)) + death_wall -= wall + CHECK_TICK + radius-- + if(radius < 70 && prob(1)) + generate_endgame_drop() + +//================================== +// INITIALIZATION +//================================== + +/datum/battle_royale_controller/proc/start() + //Give Verbs to admins + for(var/client/C in GLOB.admins) + if(check_rights_for(C, R_ADMIN)) + C.add_verb(BATTLE_ROYALE_AVERBS) + toggle_ooc(FALSE) + to_chat(world, "Battle Royale will begin soon...
      ") + //Stop new player joining + GLOB.enter_allowed = FALSE + world.update_status() + if(SSticker.current_state < GAME_STATE_PREGAME) + to_chat(world, "Battle Royale: Waiting for server to be ready...") + SSticker.start_immediately = FALSE + UNTIL(SSticker.current_state >= GAME_STATE_PREGAME) + to_chat(world, "Battle Royale: Done!") + //Delay pre-game if we are in it. + if(SSticker.current_state == GAME_STATE_PREGAME) + //Force people to be not ready and start the game + for(var/mob/dead/new_player/player in GLOB.player_list) + to_chat(player, "You have been forced as an observer. When the prompt to join battle royale comes up, press yes. This is normal and you are still in queue to play.") + player.ready = FALSE + player.make_me_an_observer(TRUE) + to_chat(world, "Battle Royale: Force-starting game.") + SSticker.start_immediately = TRUE + SEND_SOUND(world, sound('sound/misc/server-ready.ogg')) + sleep(50) + //Clear client mobs + to_chat(world, "Battle Royale: Clearing world mobs.") + for(var/mob/M as() in GLOB.player_list) + if(isliving(M)) + qdel(M) + CHECK_TICK + sleep(50) + to_chat(world, "Battle Royale: STARTING IN 30 SECONDS.") + to_chat(world, "If you are on the main menu, observe immediately to sign up. (You will be prompted in 30 seconds.)") + toggle_ooc(TRUE) + sleep(300) + toggle_ooc(FALSE) + to_chat(world, "Battle Royale: STARTING IN 5 SECONDS.") + to_chat(world, "Make sure to hit yes to the sign up message given to all observing players.") + sleep(50) + to_chat(world, "Battle Royale: Starting game.") + titanfall() + death_wall = list() + var/z_level = SSmapping.station_start + var/turf/center = SSmapping.get_station_center() + var/list/edge_turfs = list() + edge_turfs += block(locate(12, 12, z_level), locate(244, 12, z_level)) //BOTTOM + edge_turfs += block(locate(12, 244, z_level), locate(244, 244, z_level)) //TOP + edge_turfs |= block(locate(12, 12, z_level), locate(12, 244, z_level)) //LEFT + edge_turfs |= block(locate(244, 12, z_level), locate(244, 244, z_level)) //RIGHT + for(var/turf/T in edge_turfs) + var/obj/effect/death_wall/DW = new(T) + DW.set_center(center) + death_wall += DW + CHECK_TICK + START_PROCESSING(SSprocessing, src) + +/datum/battle_royale_controller/proc/titanfall() + var/list/participants = pollGhostCandidates("Would you like to partake in BATTLE ROYALE?") + var/turf/spawn_turf = get_safe_random_station_turfs() + var/obj/structure/closet/supplypod/centcompod/pod = new() + pod.setStyle() + players = list() + for(var/mob/M in participants) + var/key = M.key + //Create a mob and transfer their mind to it. + CHECK_TICK + var/mob/living/carbon/human/H = new(pod) + ADD_TRAIT(H, TRAIT_PACIFISM, BATTLE_ROYALE_TRAIT) + H.status_flags |= GODMODE + //Assistant gang + H.equipOutfit(/datum/outfit/job/assistant) + //Give them a spell + H.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock) + H.key = key + //Give weapons key + var/obj/item/implant/weapons_auth/W = new + W.implant(H) + players += H + to_chat(M, "You have been given knock and pacafism for 30 seconds.") + new /obj/effect/pod_landingzone(spawn_turf, pod) + SEND_SOUND(world, sound('sound/misc/airraid.ogg')) + to_chat(world, "A 30 second grace period has been established. Good luck.") + to_chat(world, "WARNING: YOU WILL BE GIBBED IF YOU LEAVE THE STATION Z-LEVEL!") + to_chat(world, "[players.len] people remain...") + //Start processing our world events + addtimer(CALLBACK(src, .proc/end_grace), 300) + generate_basic_loot(150) + +/datum/battle_royale_controller/proc/end_grace() + for(var/mob/M in GLOB.player_list) + M.RemoveSpell(/obj/effect/proc_holder/spell/aoe_turf/knock) + M.status_flags -= GODMODE + REMOVE_TRAIT(M, TRAIT_PACIFISM, BATTLE_ROYALE_TRAIT) + to_chat(M, "You are no longer a pacifist. Be the last [M.gender == MALE ? "man" : "woman"] standing.") + +//================================== +// EVENTS / DROPS +//================================== + +/datum/battle_royale_controller/proc/generate_basic_loot(amount=1) + for(var/i in 1 to amount) + send_item(pick(GLOB.battle_royale_basic_loot)) + stoplag() + +/datum/battle_royale_controller/proc/generate_good_drop() + var/list/good_drops = list() + for(var/i in 1 to rand(1,3)) + good_drops += pick(GLOB.battle_royale_good_loot) + send_item(good_drops, announce = "Incoming extended supply materials.", force_time = 150) + +/datum/battle_royale_controller/proc/generate_endgame_drop() + var/obj/item = pick(GLOB.battle_royale_insane_loot) + send_item(item, announce = "We found a weird looking package in the back of our warehouse. We have no idea what is in it, but it is marked as incredibily dangerous and could be a superweapon.", force_time = 600) + +/datum/battle_royale_controller/proc/send_item(item_path, style = STYLE_BOX, announce=FALSE, force_time = 0) + if(!item_path) + return + var/turf/target = get_safe_random_station_turfs() + var/obj/structure/closet/supplypod/battleroyale/pod = new() + if(islist(item_path)) + for(var/thing in item_path) + new thing(pod) + else + new item_path(pod) + if(force_time) + pod.delays[POD_FALLING]= force_time + new /obj/effect/pod_landingzone(target, pod) + if(announce) + priority_announce("[announce] \nExpected Drop Location: [get_area(target)]\n ETA: [force_time/10] Seconds.", "High Command Supply Control", SSstation.announcer.get_rand_alert_sound()) + +//================================== +// WORLD BORDER +//================================== + +/obj/effect/death_wall + var/current_radius = 118 + var/turf/center_turf + icon = 'icons/effects/fields.dmi' + icon_state = "projectile_dampen_generic" + +/obj/effect/death_wall/Crossed(atom/movable/AM, oldloc) + . = ..() + //lol u died + if(isliving(AM)) + var/mob/living/M = AM + M.gib() + to_chat(M, "You left the zone!") + +/obj/effect/death_wall/Moved(atom/OldLoc, Dir) + . = ..() + for(var/mob/living/M in get_turf(src)) + M.gib() + to_chat(M, "You left the zone!") + +/obj/effect/death_wall/proc/set_center(turf/center) + center_turf = center + +/obj/effect/death_wall/proc/decrease_size() + var/minx = CLAMP(center_turf.x - current_radius, 1, 255) + var/maxx = CLAMP(center_turf.x + current_radius, 1, 255) + var/miny = CLAMP(center_turf.y - current_radius, 1, 255) + var/maxy = CLAMP(center_turf.y + current_radius, 1, 255) + if(y == maxy || y == miny) + //We have nowhere to move to so are deleted + if(x == minx || x == minx + 1 || x == maxx || x == maxx - 1) + qdel(src) + return + //Where do we go to? + var/top = y == maxy + var/bottom = y == miny + var/left = x == minx + var/right = x == maxx + if(left) + forceMove(get_step(get_turf(src), EAST)) + else if(right) + forceMove(get_step(get_turf(src), WEST)) + else if(bottom) + forceMove(get_step(get_turf(src), NORTH)) + else if(top) + forceMove(get_step(get_turf(src), SOUTH)) + current_radius-- + +//===== +// Heal +// ===== +/obj/item/organ/regenerative_core/battle_royale + preserved = TRUE diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm index ea567b5296c19..99bca8f05c7fd 100644 --- a/code/modules/admin/callproc/callproc.dm +++ b/code/modules/admin/callproc/callproc.dm @@ -15,7 +15,7 @@ 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)) + var/list/value = vv_get_value(default_class = VV_ATOM_REFERENCE, classes = list(VV_ATOM_REFERENCE, VV_DATUM_REFERENCE, VV_MOB_REFERENCE, VV_MARKED_DATUM, VV_TEXT_LOCATE, VV_PROCCALL_RETVAL)) if (!value["class"] || !value["value"]) return target = value["value"] @@ -83,8 +83,6 @@ 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 && procname == "Del") @@ -98,15 +96,11 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) 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) + to_chat(usr, "Another set of admin called procs are still running. Try again later.") + return + GLOB.LastAdminCalledProc = procname if(target != GLOBAL_PROC) GLOB.LastAdminCalledTargetRef = REF(target) @@ -119,7 +113,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) //adv proc call this, ya nerds /world/proc/WrapAdminProcCall(datum/target, procname, list/arguments) if(target == GLOBAL_PROC) - return call(procname)(arglist(arguments)) + return call("/proc/[procname]")(arglist(arguments)) else if(target != world) return call(target, procname)(arglist(arguments)) else diff --git a/code/modules/admin/chat_commands.dm b/code/modules/admin/chat_commands.dm index 73450f9883458..86f0a312dbe39 100644 --- a/code/modules/admin/chat_commands.dm +++ b/code/modules/admin/chat_commands.dm @@ -30,6 +30,7 @@ var/server = CONFIG_GET(string/server) return "[GLOB.round_id ? "Round #[GLOB.round_id]: " : ""][GLOB.clients.len] players on [SSmapping.config.map_name], Mode: [GLOB.master_mode]; Round [SSticker.HasRoundStarted() ? (SSticker.IsRoundInProgress() ? "Active" : "Finishing") : "Starting"] -- [server ? server : "[world.internet_address]:[world.port]"]" +/** -- Not for use within BeeStation /datum/tgs_chat_command/ahelp name = "ahelp" help_text = " |list>>" @@ -51,6 +52,7 @@ var/res = IrcPm(target, all_params.Join(" "), sender.friendly_name) if(res != "Message Successful") return res +**/ /datum/tgs_chat_command/namecheck name = "namecheck" @@ -71,7 +73,7 @@ admin_only = TRUE /datum/tgs_chat_command/adminwho/Run(datum/tgs_chat_user/sender, params) - return ircadminwho() + return tgsadminwho() GLOBAL_LIST(round_end_notifiees) @@ -87,6 +89,7 @@ GLOBAL_LIST(round_end_notifiees) GLOB.round_end_notifiees[sender.mention] = TRUE return "I will notify [sender.mention] when the round ends." +/** -- Not for use within BeeStation /datum/tgs_chat_command/sdql name = "sdql" help_text = "Runs an SDQL query" @@ -103,7 +106,7 @@ GLOBAL_LIST(round_end_notifiees) var/list/text_res = results.Copy(1, 3) var/list/refs = results.len > 3 ? results.Copy(4) : null . = "[text_res.Join("\n")][refs ? "\nRefs: [refs.Join(" ")]" : ""]" - + /datum/tgs_chat_command/reload_admins name = "reload_admins" help_text = "Forces the server to reload admins." @@ -117,3 +120,4 @@ GLOBAL_LIST(round_end_notifiees) /datum/tgs_chat_command/reload_admins/proc/ReloadAsync() set waitfor = FALSE load_admins() +**/ diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 6a10706d5a0f2..fd1dd17c62dc1 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -49,7 +49,7 @@ /obj/effect/fun_balloon/sentience/effect() var/list/bodies = list() - for(var/mob/living/M in range(effect_range, get_turf(src))) + for(var/mob/living/M in viewers(effect_range, get_turf(src))) bodies += M var/question = "Would you like to be [group_name]?" @@ -79,7 +79,7 @@ var/effect_range = 5 /obj/effect/fun_balloon/scatter/effect() - for(var/mob/living/M in range(effect_range, get_turf(src))) + for(var/mob/living/M in hearers(effect_range, get_turf(src))) var/turf/T = find_safe_turf() new /obj/effect/temp_visual/gravpush(get_turf(M)) M.forceMove(T) @@ -108,7 +108,7 @@ /obj/effect/forcefield/arena_shuttle name = "portal" timeleft = 0 - var/list/warp_points + var/list/warp_points = list() /obj/effect/forcefield/arena_shuttle/Initialize() . = ..() @@ -127,7 +127,7 @@ L.forceMove(LA) L.hallucination = 0 to_chat(L, "The battle is won. Your bloodlust subsides.") - for(var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw in L) + for(var/obj/item/chainsaw/doomslayer/chainsaw in L) qdel(chainsaw) else to_chat(L, "You are not yet worthy of passing. Drag a severed head to the barrier to be allowed entry to the hall of champions.") diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 23f139a3787fe..694b60c13d50e 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -31,6 +31,8 @@ GLOBAL_PROTECT(href_token) //Admin help manager var/datum/admin_help_ui/admin_interface + var/datum/filter_editor/filteriffic + /datum/admins/New(datum/admin_rank/R, ckey, force_active = FALSE, protected) if(IsAdminAdvancedProcCall()) var/msg = " has tried to elevate permissions!" @@ -94,7 +96,7 @@ GLOBAL_PROTECT(href_token) var/client/C if ((C = owner) || (C = GLOB.directory[target])) disassociate() - C.verbs += /client/proc/readmin + C.add_verb(/client/proc/readmin) /datum/admins/proc/associate(client/C) if(IsAdminAdvancedProcCall()) @@ -114,7 +116,7 @@ GLOBAL_PROTECT(href_token) owner = C owner.holder = src owner.add_admin_verbs() //TODO <--- todo what? the proc clearly exists and works since its the backbone to our entire admin system - owner.verbs -= /client/proc/readmin + owner.remove_verb(/client/proc/readmin) GLOB.admins |= C /datum/admins/proc/disassociate() diff --git a/code/modules/admin/outfits.dm b/code/modules/admin/outfits.dm index 4573e2d22bec0..6d3724206305a 100644 --- a/code/modules/admin/outfits.dm +++ b/code/modules/admin/outfits.dm @@ -35,7 +35,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits var/outfit_file = input("Pick outfit json file:", "File") as null|file if(!outfit_file) return - var/filedata = rustg_file_read(outfit_file) + var/filedata = file2text(outfit_file) var/json = json_decode(filedata) if(!json) to_chat(admin,"JSON decode error.") @@ -240,4 +240,5 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits O.ears = text2path(href_list["outfit_ears"]) GLOB.custom_outfits.Add(O) - message_admins("[key_name(usr)] created \"[O.name]\" outfit!") \ No newline at end of file + message_admins("[key_name(usr)] created \"[O.name]\" outfit!") + diff --git a/code/modules/admin/permissionedit.dm b/code/modules/admin/permissionedit.dm index 8ca949f0bc46c..f7d252fdd94bb 100644 --- a/code/modules/admin/permissionedit.dm +++ b/code/modules/admin/permissionedit.dm @@ -140,7 +140,7 @@ to_chat(usr, "Admin Edit blocked: Advanced ProcCall detected.") return var/datum/asset/permissions_assets = get_asset_datum(/datum/asset/simple/namespaced/common) - permissions_assets.send(src) + permissions_assets.send(owner) var/admin_key = href_list["key"] var/admin_ckey = ckey(admin_key) var/datum/admins/D = GLOB.admin_datums[admin_ckey] @@ -207,6 +207,10 @@ edit_admin_permissions() /datum/admins/proc/add_admin(admin_ckey, admin_key, use_db) + if(!check_rights(R_PERMISSIONS)) + message_admins("[key_name_admin(usr)] attempted to add an admin without sufficient rights.") + log_admin("[key_name(usr)] attempted to add an admin without sufficient rights.") + return if(admin_ckey) . = admin_ckey else @@ -249,6 +253,10 @@ qdel(query_add_admin_log) /datum/admins/proc/remove_admin(admin_ckey, admin_key, use_db, datum/admins/D) + if(!check_rights(R_PERMISSIONS)) + message_admins("[key_name_admin(usr)] attempted to remove an admin without sufficient rights.") + log_admin("[key_name(usr)] attempted to remove an admin without sufficient rights.") + return if(alert("Are you sure you want to remove [admin_ckey]?","Confirm Removal","Do it","Cancel") == "Do it") GLOB.admin_datums -= admin_ckey GLOB.deadmins -= admin_ckey @@ -300,6 +308,10 @@ return TRUE /datum/admins/proc/change_admin_rank(admin_ckey, admin_key, use_db, datum/admins/D, legacy_only) + if(!check_rights(R_PERMISSIONS)) + message_admins("[key_name_admin(usr)] attempted to change an admin's rank without sufficient rights.") + log_admin("[key_name(usr)] attempted to change an admin's rank without sufficient rights.") + return var/datum/admin_rank/R var/list/rank_names = list() if(!use_db || (use_db && !legacy_only)) @@ -391,6 +403,10 @@ log_admin(m2) /datum/admins/proc/change_admin_flags(admin_ckey, admin_key, use_db, datum/admins/D, legacy_only) + if(!check_rights(R_PERMISSIONS)) + message_admins("[key_name_admin(usr)] attempted to edit admin flags without sufficient rights.") + log_admin("[key_name(usr)] attempted to edit admin flags without sufficient rights.") + return var/new_flags = input_bitfield(usr, "Include permission flags
      [use_db ? "This will affect ALL admins with this rank." : "This will affect only the current admin [admin_key]"]", "admin_flags", D.rank.include_rights, 350, 590, allowed_edit_list = usr.client.holder.rank.can_edit_rights) if(isnull(new_flags)) return @@ -402,7 +418,7 @@ return var/m1 = "[key_name_admin(usr)] edited the permissions of [use_db ? " rank [D.rank.name] permanently" : "[admin_key] temporarily"]" var/m2 = "[key_name(usr)] edited the permissions of [use_db ? " rank [D.rank.name] permanently" : "[admin_key] temporarily"]" - if(use_db || legacy_only) + if(use_db && !legacy_only) var/rank_name = D.rank.name var/old_flags var/old_exclude_flags @@ -470,6 +486,10 @@ log_admin(m2) /datum/admins/proc/remove_rank(admin_rank) + if(!check_rights(R_PERMISSIONS)) + message_admins("[key_name_admin(usr)] attempted to remove an admin's rank without sufficient rights.") + log_admin("[key_name(usr)] attempted to remove an admin's rank without sufficient rights.") + return if(!admin_rank) return for(var/datum/admin_rank/R in GLOB.admin_ranks) diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index 5b05339de8586..beb2876c45173 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -15,7 +15,7 @@ GLOBAL_DATUM_INIT(admin_secrets, /datum/admin_secrets, new) ui = new(user, src, "AdminSecretsPanel", "Secrets Panel") ui.open() -/datum/admin_secrets/ui_data(mob/user) +/datum/admin_secrets/ui_static_data(mob/user) /* Each command is a list that will be read like [Name, Action(see ui_act)] "omg but you could have done it like X" @@ -73,7 +73,7 @@ GLOBAL_DATUM_INIT(admin_secrets, /datum/admin_secrets, new) list("Summon Events (Toggle)", "events"), list("There can only be one!", "onlyone"), list("There can only be one! (40-second delay)", "delayed_onlyone"), - list("Make all players retarded", "retardify"), + list("Make all players intellectually disabled", "dumbify"), list("Make all players Australian", "aussify"), list("Egalitarian Station Mode", "eagles"), list("Anarcho-Capitalist Station Mode", "ancap"), @@ -89,7 +89,8 @@ GLOBAL_DATUM_INIT(admin_secrets, /datum/admin_secrets, new) list("Mass Purrbation", "masspurrbation"), list("Mass Remove Purrbation", "massremovepurrbation"), list("Fully Immerse Everyone", "massimmerse"), - list("Un-Fully Immerse Everyone", "unmassimmerse") + list("Un-Fully Immerse Everyone", "unmassimmerse"), + list("Make All Animals Playable", "animalsentience") ) if(check_rights(R_DEBUG,0)) @@ -144,7 +145,7 @@ GLOBAL_DATUM_INIT(admin_secrets, /datum/admin_secrets, new) for(var/mob/living/mob in thunderdome) qdel(mob) //Clear mobs for(var/obj/obj in thunderdome) - if(!istype(obj, /obj/machinery/camera) && !istype(obj, /obj/effect/abstract/proximity_checker)) + if(!istype(obj, /obj/machinery/camera) && !istype(obj, /obj/effect/abstract/proximity_checker) && !istype(obj, /obj/effect/landmark/arena)) qdel(obj) //Clear objects var/area/template = GLOB.areas_by_type[/area/tdome/arena_source] @@ -174,7 +175,7 @@ GLOBAL_DATUM_INIT(admin_secrets, /datum/admin_secrets, new) set_station_name(new_name) log_admin("[key_name(usr)] renamed the station to \"[new_name]\".") message_admins("[key_name_admin(usr)] renamed the station to: [new_name].") - priority_announce("[command_name()] has renamed the station to \"[new_name]\".") + priority_announce("[command_name()] has renamed the station to \"[new_name]\".", sound = SSstation.announcer.get_rand_alert_sound()) if("night_shift_set") if(!check_rights(R_ADMIN)) return @@ -200,7 +201,7 @@ GLOBAL_DATUM_INIT(admin_secrets, /datum/admin_secrets, new) set_station_name(new_name) log_admin("[key_name(usr)] reset the station name.") message_admins("[key_name_admin(usr)] reset the station name.") - priority_announce("[command_name()] has renamed the station to \"[new_name]\".") + priority_announce("[command_name()] has renamed the station to \"[new_name]\".", sound = SSstation.announcer.get_rand_alert_sound()) if("list_bombers") if(!check_rights(R_ADMIN)) @@ -458,7 +459,7 @@ GLOBAL_DATUM_INIT(admin_secrets, /datum/admin_secrets, new) SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Chinese Cartoons")) message_admins("[key_name_admin(usr)] made everything kawaii.") for(var/mob/living/carbon/human/H in GLOB.carbon_list) - SEND_SOUND(H, sound('sound/ai/animes.ogg')) + SEND_SOUND(H, sound(SSstation.announcer.event_sounds[ANNOUNCER_ANIMES])) if(H.dna.species.id == "human") if(H.dna.features["tail_human"] == "None" || H.dna.features["ears"] == "None") @@ -477,7 +478,7 @@ GLOBAL_DATUM_INIT(admin_secrets, /datum/admin_secrets, new) var/obj/item/clothing/under/costume/schoolgirl/I = new seifuku var/olduniform = H.w_uniform H.temporarilyRemoveItemFromInventory(H.w_uniform, TRUE, FALSE) - H.equip_to_slot_or_del(I, SLOT_W_UNIFORM) + H.equip_to_slot_or_del(I, ITEM_SLOT_ICLOTHING) qdel(olduniform) if(droptype == "Yes") ADD_TRAIT(I, TRAIT_NODROP, ADMIN_TRAIT) @@ -510,14 +511,14 @@ GLOBAL_DATUM_INIT(admin_secrets, /datum/admin_secrets, new) var/datum/round_event/disease_outbreak/DO = E DO.virus_type = virus - if("retardify") + if("dumbify") 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)] gave everybody intellectual disability") if("aussify") //for rimjobtide if(!check_rights(R_FUN)) @@ -539,7 +540,7 @@ GLOBAL_DATUM_INIT(admin_secrets, /datum/admin_secrets, new) if(is_station_level(W.z) && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison)) W.req_access = list() message_admins("[key_name_admin(usr)] activated Egalitarian Station mode") - priority_announce("CentCom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, 'sound/ai/commandreport.ogg') + priority_announce("CentCom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, SSstation.announcer.get_rand_report_sound()) if("ancap") if(!check_rights(R_FUN)) @@ -548,9 +549,9 @@ GLOBAL_DATUM_INIT(admin_secrets, /datum/admin_secrets, new) 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, 'sound/ai/commandreport.ogg') + priority_announce("The NAP is now in full effect.", null, SSstation.announcer.get_rand_report_sound()) else - priority_announce("The NAP has been revoked.", null, 'sound/ai/commandreport.ogg') + priority_announce("The NAP has been revoked.", null, SSstation.announcer.get_rand_report_sound()) @@ -682,6 +683,14 @@ GLOBAL_DATUM_INIT(admin_secrets, /datum/admin_secrets, new) message_admins("[key_name_admin(usr)] has Un-Fully Immersed \ everyone!") log_admin("[key_name(usr)] has Un-Fully Immersed everyone.") + if("animalsentience") + for(var/mob/living/simple_animal/L in GLOB.alive_mob_list) + var/turf/T = get_turf(L) + if(!T || !is_station_level(T.z)) + continue + if((L in GLOB.player_list) || L.mind || (L.flags_1 & HOLOGRAM_1)) + continue + L.set_playable() if("flipmovement") if(!check_rights(R_FUN)) @@ -824,7 +833,7 @@ GLOBAL_DATUM_INIT(admin_secrets, /datum/admin_secrets, new) if (playlightning) sound_to_playing_players('sound/magic/lightning_chargeup.ogg') sleep(80) - priority_announce(replacetext(announcement, "%STATION%", station_name())) + priority_announce(replacetext(announcement, "%STATION%", station_name()), sound = SSstation.announcer.get_rand_alert_sound()) if (playlightning) sleep(20) sound_to_playing_players('sound/magic/lightningbolt.ogg') diff --git a/code/modules/admin/sound_emitter.dm b/code/modules/admin/sound_emitter.dm index 64ce709dfab10..3944492d9bada 100644 --- a/code/modules/admin/sound_emitter.dm +++ b/code/modules/admin/sound_emitter.dm @@ -81,7 +81,7 @@ var/new_label = stripped_input(user, "Choose a new label.", "Sound Emitter") if(!new_label) return - maptext = new_label + maptext = MAPTEXT(new_label) to_chat(user, "Label set to [maptext].") if(href_list["edit_sound_file"]) var/new_file = input(user, "Choose a sound file.", "Sound Emitter") as null|sound @@ -135,7 +135,7 @@ hearing_mobs += M if(SOUND_EMITTER_ZLEVEL) for(var/mob/M in GLOB.player_list) - if(M.z == z) + if(M.get_virtual_z_level() == get_virtual_z_level()) hearing_mobs += M if(SOUND_EMITTER_GLOBAL) hearing_mobs = GLOB.player_list.Copy() diff --git a/code/modules/admin/sql_ban_system.dm b/code/modules/admin/sql_ban_system.dm index d23795425be0e..fbf7f7ddecb26 100644 --- a/code/modules/admin/sql_ban_system.dm +++ b/code/modules/admin/sql_ban_system.dm @@ -125,7 +125,10 @@ C.ban_cache[query_build_ban_cache.item[1]] = TRUE qdel(query_build_ban_cache) -/datum/admins/proc/ban_panel(player_key, player_ip, player_cid, role, duration = 1440, applies_to_admins, reason, edit_id, page, admin_key, global_ban) +/datum/admins/proc/ban_panel(player_key, player_ip, player_cid, role, duration = 1440, applies_to_admins, reason, edit_id, page, admin_key, global_ban = TRUE) + var/suppressor + if(check_rights(R_SUPPRESS)) + suppressor = TRUE var/panel_height = 620 if(edit_id) panel_height = 240 @@ -149,12 +152,17 @@
      + [(suppressor && !edit_id) ? "" : ""]

      @@ -186,39 +194,39 @@ Ban type

    Severity

    Location

    @@ -317,16 +325,16 @@ "} break_counter++ output += "
    " - var/list/long_job_lists = list("Civilian" = GLOB.civilian_positions, + var/list/long_job_lists = list(("Civilian" = GLOB.civilian_positions | "Gimmick"), "Ghost and Other Roles" = list(ROLE_BRAINWASHED, ROLE_DEATHSQUAD, ROLE_DRONE, ROLE_LAVALAND, ROLE_MIND_TRANSFER, ROLE_POSIBRAIN, ROLE_SENTIENCE), "Antagonist Positions" = list(ROLE_ABDUCTOR, ROLE_ALIEN, ROLE_BLOB, - ROLE_BROTHER, ROLE_CHANGELING, ROLE_CULTIST, + ROLE_BROTHER, ROLE_CHANGELING, ROLE_CULTIST, ROLE_HERETIC, ROLE_DEVIL, ROLE_INTERNAL_AFFAIRS, ROLE_MALF, ROLE_MONKEY, ROLE_NINJA, ROLE_OPERATIVE, ROLE_SERVANT_OF_RATVAR, ROLE_OVERTHROW, ROLE_REV, ROLE_REVENANT, ROLE_REV_HEAD, ROLE_SYNDICATE, - ROLE_TRAITOR, ROLE_WIZARD, ROLE_HIVE, ROLE_GANG)) //ROLE_REV_HEAD is excluded from this because rev jobbans are handled by ROLE_REV + ROLE_TRAITOR, ROLE_WIZARD, ROLE_HIVE, ROLE_GANG, ROLE_TERATOMA)) //ROLE_REV_HEAD is excluded from this because rev jobbans are handled by ROLE_REV for(var/department in long_job_lists) output += "
    " break_counter = 0 @@ -358,7 +366,7 @@ var/player_cid var/use_last_connection = FALSE var/applies_to_admins = FALSE - var/global_ban = FALSE + var/global_ban = TRUE var/duration var/interval var/severity @@ -372,8 +380,18 @@ var/old_globalban var/page var/admin_key + var/redact var/list/changes = list() var/list/roles_to_ban = list() + if(href_list["redactioncheck"]) + if(check_rights(R_SUPPRESS)) + if(!edit_id) + redact = TRUE + else + error_state += "Bans may not have their suppression flag edited. If a ban requiring suppression was accidently issued without it, contact [CONFIG_GET(string/hostedby)] immediately." + else + error_state += "You have attempted to issue a suppressed ban without permission, This incident has been logged." + log_admin_private("SUPPRESS: [key_name(usr)] ATTEMPTED TO ISSUE A SUPPRESSED BAN WITHOUT THE REQUISITE RIGHT!") if(href_list["keycheck"]) player_key = href_list["keytext"] if(!player_key) @@ -399,10 +417,14 @@ if(use_last_connection && !ip_check && !cid_check) error_state += "Use last connection was ticked, but neither IP nor CID was." if(href_list["applyadmins"]) + if(redact) + error_state += "Admin bans can not be suppressed." applies_to_admins = TRUE switch(href_list["radioservban"]) if("local") global_ban = FALSE + if(redact) + error_state += "Suppressed bans must be global." if("global") global_ban = TRUE switch(href_list["radioduration"]) @@ -463,20 +485,33 @@ roles_to_ban |= key else error_state += "No ban type was selected." + if((href_list["radioban"] != "server") && redact) + error_state += "Suppression may only be applied to server bans." if(error_state.len) to_chat(usr, "Ban not [edit_id ? "edited" : "created"] because the following errors were present:\n[error_state.Join("\n")]") return if(edit_id) edit_ban(edit_id, player_key, ip_check, player_ip, cid_check, player_cid, use_last_connection, applies_to_admins, duration, interval, reason, global_ban, mirror_edit, old_key, old_ip, old_cid, old_applies, old_globalban, page, admin_key, changes) else - create_ban(player_key, ip_check, player_ip, cid_check, player_cid, use_last_connection, applies_to_admins, duration, interval, severity, reason, global_ban, roles_to_ban) + create_ban(player_key, ip_check, player_ip, cid_check, player_cid, use_last_connection, applies_to_admins, duration, interval, severity, reason, global_ban, roles_to_ban, redact) -/datum/admins/proc/create_ban(player_key, ip_check, player_ip, cid_check, player_cid, use_last_connection, applies_to_admins, duration, interval, severity, reason, global_ban, list/roles_to_ban) +/datum/admins/proc/create_ban(player_key, ip_check, player_ip, cid_check, player_cid, use_last_connection, applies_to_admins, duration, interval, severity, reason, global_ban, list/roles_to_ban, redact = 0) if(!check_rights(R_BAN)) return if(!SSdbcore.Connect()) to_chat(usr, "Failed to establish database connection.") return + + if(cid_check && config.protected_cids.Find(player_cid)) + if(alert(usr, "CID [player_cid] is listed as protected for the following reason: [config.protected_cids[player_cid]], Are you sure you want to restrict this CID? THIS WILL PROBABLY CATCH LEGITIMATE PLAYERS.", "Protected CID", "Yes", "No", "Cancel") != "Yes") + return + var/kn = key_name(usr) + //Log the shit out of this and scream bloody murder to anyone who will listen. + send2tgs("CID PROTECTION BYPASS", "[kn] Has overridden CID protection for a ban on CID [player_cid]!") + message_admins("[kn] Has overridden CID protection for a ban on CID [player_cid]!") + log_admin_private("[kn] Has overridden CID protection for a ban on CID [player_cid]!") + if(redact && alert(usr, "You are about to issue a Suppressed ban, This will require direct database editing to revoke, ARE YOU SURE?", "Protected CID", "Yes", "No", "Cancel") != "Yes") + return var/player_ckey = ckey(player_key) if(player_ckey) var/datum/DBQuery/query_create_ban_get_player = SSdbcore.NewQuery({" @@ -553,6 +588,20 @@ "expiration_time" = "IF(? IS NULL, NULL, NOW() + INTERVAL ? [interval])" ) var/sql_ban = list() + //I'm going to crosscheck this one last time because this is playing with fire. + if(redact) + if(!check_rights(R_SUPPRESS)) + to_chat(usr, "You have attempted to register a suppressed ban without the correct access, this incident has been logged, and the ban has been aborted.") + log_admin_private("SUPPRESS: [key_name(usr)] ATTEMPTED TO ISSUE A SUPPRESSED BAN WITHOUT THE REQUISITE RIGHT!") + return + if(roles_to_ban[1] != "Server") //This should never happen. Still checking it. + to_chat(usr, "You have attempted to directly register a suppressed ban that is not a server ban, this incident has been logged, and the ban has been aborted.") + log_admin_private("SUPPRESS: [key_name(usr)] ATTEMPTED TO MANUALLY ISSUE A SUPPRESSED NON-SERVER BAN!") + return + if(applies_to_admins) + to_chat(usr, "You have attempted to directly register a suppressed ban that affects admins, this incident has been logged, and the ban has been aborted.") + log_admin_private("SUPPRESS: [key_name(usr)] ATTEMPTED TO MANUALLY ISSUE A SUPPRESSED ADMIN BAN!") + return for(var/role in roles_to_ban) sql_ban += list(list( "server_name" = CONFIG_GET(string/serversqlname), @@ -571,26 +620,36 @@ "a_computerid" = admin_cid, "who" = who, "adminwho" = adminwho, - "global_ban" = global_ban + "global_ban" = global_ban, + "hidden" = redact )) if(!SSdbcore.MassInsert(format_table_name("ban"), sql_ban, warn = TRUE, special_columns = special_columns)) return var/target = ban_target_string(player_key, player_ip, player_cid) var/msg = "has created a [global_ban ? "global" : "local"] [isnull(duration) ? "permanent" : "temporary [time_message]"] [applies_to_admins ? "admin " : ""][roles_to_ban[1] == "Server" ? "server ban" : "role ban from [roles_to_ban.len] roles"] for [target]." - log_admin_private("[kn] [msg][roles_to_ban[1] == "Server" ? "" : " Roles: [roles_to_ban.Join(", ")]"] Reason: [reason]") - message_admins("[kna] [msg][roles_to_ban[1] == "Server" ? "" : " Roles: [roles_to_ban.Join("\n")]"]\nReason: [reason]") - if(applies_to_admins) - send2irc("BAN ALERT","[kn] [msg]") - if(player_ckey) - create_message("note", player_ckey, admin_ckey, note_reason, null, null, 0, 0, null, 0, severity) + if(!redact) + log_admin_private("[kn] [msg][roles_to_ban[1] == "Server" ? "" : " Roles: [roles_to_ban.Join(", ")]"] Reason: [reason]") + message_admins("[kna] [msg][roles_to_ban[1] == "Server" ? "" : " Roles: [roles_to_ban.Join("\n")]"]\nReason: [reason]") + else + log_admin_private("SUPPRESS: [kn] has created a suppressed ban.") + to_chat(usr, "Ban issued successfuly, This has not been announced to other admins.") + if(applies_to_admins && !redact) //Should never happen. + send2tgs("BAN ALERT","[kn] [msg]") + if(player_ckey && !redact) + create_message("note", player_ckey, admin_ckey, note_reason, null, null, 0, 0, null, -1, severity) var/client/C = GLOB.directory[player_ckey] var/datum/admin_help/AH = admin_ticket_log(player_ckey, msg) var/appeal_url = "No ban appeal url set!" appeal_url = CONFIG_GET(string/banappeals) var/is_admin = FALSE + var/special_prefix = "" + if(redact) + special_prefix = "hard " + if(applies_to_admins) + special_prefix = "admin " if(C) build_ban_cache(C) - to_chat(C, "You have been [applies_to_admins ? "admin " : ""]banned by [usr.client.key] from [roles_to_ban[1] == "Server" ? "the server" : " Roles: [roles_to_ban.Join(", ")]"].\nReason: [reason]
    This ban is [isnull(duration) ? "permanent." : "temporary, it will be removed in [time_message]."] [global_ban ? "This ban applies to all of our servers." : "This is a single-server ban, and only applies to this server."] The round ID is [GLOB.round_id].
    To appeal this ban go to [appeal_url]") + to_chat(C, "You have been [special_prefix]banned by [usr.client.key] from [roles_to_ban[1] == "Server" ? "the server" : " Roles: [roles_to_ban.Join(", ")]"].\nReason: [reason]
    This ban is [isnull(duration) ? "permanent." : "temporary, it will be removed in [time_message]."] [global_ban ? "This ban applies to all of our servers." : "This is a single-server ban, and only applies to this server."] The round ID is [GLOB.round_id].
    [redact ? "This ban may not be appealed." : "To appeal this ban go to [appeal_url]"]") if(GLOB.admin_datums[C.ckey] || GLOB.deadmins[C.ckey]) is_admin = TRUE if(roles_to_ban[1] == "Server" && (!is_admin || (is_admin && applies_to_admins))) @@ -600,7 +659,7 @@ for(var/client/i in GLOB.clients - C) if(i.address == player_ip || i.computer_id == player_cid) build_ban_cache(i) - to_chat(i, "You have been [applies_to_admins ? "admin " : ""]banned by [usr.client.key] from [roles_to_ban[1] == "Server" ? "the server" : " Roles: [roles_to_ban.Join(", ")]"].\nReason: [reason]
    This ban is [isnull(duration) ? "permanent." : "temporary, it will be removed in [time_message]."] [global_ban ? "This ban applies to all of our servers." : "This is a single-server ban, and only applies to this server."] The round ID is [GLOB.round_id].
    To appeal this ban go to [appeal_url]") + to_chat(i, "You have been [special_prefix]banned by [usr.client.key] from [roles_to_ban[1] == "Server" ? "the server" : " Roles: [roles_to_ban.Join(", ")]"].\nReason: [reason]
    This ban is [isnull(duration) ? "permanent." : "temporary, it will be removed in [time_message]."] [global_ban ? "This ban applies to all of our servers." : "This is a single-server ban, and only applies to this server."] The round ID is [GLOB.round_id].
    To appeal this ban go to [appeal_url]") if(GLOB.admin_datums[i.ckey] || GLOB.deadmins[i.ckey]) is_admin = TRUE if(roles_to_ban[1] == "Server" && (!is_admin || (is_admin && applies_to_admins))) @@ -741,8 +800,7 @@ if(unban_datetime) output += "
    Unbanned by [unban_key] on [unban_datetime] during round #[unban_round_id]." output += "
    [reason]
    " - if(!expired && !unban_datetime) - output += "Edit
    [unban_href]" + output += "Edit
    [unban_href]" if(edits) output += "
    Edit log" output += "
    " @@ -793,6 +851,16 @@ if(!SSdbcore.Connect()) to_chat(usr, "Failed to establish database connection.") return + + if(cid_check && config.protected_cids.Find(player_cid)) + if(alert(usr, "CID [player_cid] is listed as protected for the following reason: [config.protected_cids[player_cid]], Are you sure you want to restrict this CID? THIS WILL PROBABLY CATCH LEGITIMATE PLAYERS.", "Protected CID", "Yes", "No", "Cancel") != "Yes") + return + var/kn = key_name(usr) + //Log the shit out of this and scream bloody murder to anyone who will listen. + send2tgs("CID PROTECTION BYPASS", "[kn] Has overridden CID protection for a ban on CID [player_cid]!") + message_admins("[kn] Has overridden CID protection for a ban on CID [player_cid]!") + log_admin_private("[kn] Has overridden CID protection for a ban on CID [player_cid]!") + var/player_ckey = ckey(player_key) var/bantime if(player_ckey) @@ -910,7 +978,7 @@ log_admin_private("[kn] has edited the [changes_keys_text] of a ban for [old_key ? "[old_key]" : "[old_ip]-[old_cid]"].") //if a ban doesn't have a key it must have an ip and/or a cid to have reached this point normally message_admins("[kna] has edited the [changes_keys_text] of a ban for [old_key ? "[old_key]" : "[old_ip]-[old_cid]"].") if(changes["Applies to admins"]) - send2irc("BAN ALERT","[kn] has edited a ban for [old_key ? "[old_key]" : "[old_ip]-[old_cid]"] to [applies_to_admins ? "" : "not"]affect admins") + send2tgs("BAN ALERT","[kn] has edited a ban for [old_key ? "[old_key]" : "[old_ip]-[old_cid]"] to [applies_to_admins ? "" : "not"]affect admins") var/client/C = GLOB.directory[old_key] if(C) build_ban_cache(C) diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm index 309c38b3177fb..bffad896c0069 100644 --- a/code/modules/admin/sql_message_system.dm +++ b/code/modules/admin/sql_message_system.dm @@ -73,6 +73,8 @@ return expiry = query_validate_expire_time.item[1] qdel(query_validate_expire_time) + if(expiry == -1) + expiry = null //This is so garbage and hacky. if(type == "note" && isnull(note_severity)) note_severity = input("Set the severity of the note.", "Severity", null, null) as null|anything in list("High", "Medium", "Minor", "None") if(!note_severity) @@ -503,7 +505,7 @@ alphatext = "filter: alpha(opacity=[alpha]); opacity: [alpha/100];" var/list/data = list("

    ") if(severity) - data += " " + data += " " data += "[timestamp] | [server_name] | [admin_key][secret ? " | - Secret" : ""]" if(expire_timestamp) data += " | Expires [expire_timestamp]" @@ -661,7 +663,7 @@ qdel(query_message_read) if("watchlist entry") message_admins("Notice: [key_name_admin(target_ckey)] has been on the watchlist since [timestamp] and has just connected - Reason: [text]") - send2irc_adminless_only("Watchlist", "[key_name(target_ckey)] is on the watchlist and has just connected - Reason: [text]") + send2tgs_adminless_only("Watchlist", "[key_name(target_ckey)] is on the watchlist and has just connected - Reason: [text]") if("memo") output += "Memo by [admin_key] on [timestamp]" if(editor_key) diff --git a/code/modules/admin/team_panel.dm b/code/modules/admin/team_panel.dm index 139785f72e041..ce3aa031bfd34 100644 --- a/code/modules/admin/team_panel.dm +++ b/code/modules/admin/team_panel.dm @@ -147,11 +147,12 @@ //qdel maybe /datum/team/proc/admin_add_member(mob/user) - var/list/minds = list() - for(var/mob/M in GLOB.mob_list) - if(M.mind) - minds |= M.mind - var/datum/mind/value = input("Select new member:", "New team member", null) as null|anything in sortNames(minds) + var/list/candidates = list() + for(var/mob/M in GLOB.player_list) + if(M.mind?.special_role) + continue + candidates += M.mind + var/datum/mind/value = input("Select new member:", "New team member", null) as null|anything in sortNames(candidates) if (!value) return diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 3cac98d0ddb70..ce4d452ca7541 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -65,33 +65,37 @@ return switch(href_list["makeAntag"]) if("traitors") - if(src.makeTraitors()) - message_admins("[key_name_admin(usr)] created traitors.") - log_admin("[key_name(usr)] created traitors.") + var/maxCount = input("Set number of Traitors","Set Traitor Count (max)",1) as num|null + if(src.makeTraitors(maxCount)) + message_admins("[key_name_admin(usr)] created [maxCount] traitor(s).") + log_admin("[key_name(usr)] created [maxCount] traitor(s).") else - message_admins("[key_name_admin(usr)] tried to create traitors. Unfortunately, there were no candidates available.") - log_admin("[key_name(usr)] failed to create traitors.") + message_admins("[key_name_admin(usr)] tried to create [maxCount] traitor(s). Unfortunately, there were no candidates available.") + log_admin("[key_name(usr)] failed to create [maxCount] traitor(s).") if("changelings") - if(src.makeChangelings()) - message_admins("[key_name(usr)] created changelings.") - log_admin("[key_name(usr)] created changelings.") + var/maxCount = input("Set number of Changelings","Set Changeling Count (max)",1) as num|null + if(src.makeChangelings(maxCount)) + message_admins("[key_name(usr)] created [maxCount] changelings.") + log_admin("[key_name(usr)] created [maxCount] changelings.") else - message_admins("[key_name_admin(usr)] tried to create changelings. Unfortunately, there were no candidates available.") - log_admin("[key_name(usr)] failed to create changelings.") + message_admins("[key_name_admin(usr)] tried to create [maxCount] changelings. Unfortunately, there were no candidates available.") + log_admin("[key_name(usr)] failed to create [maxCount] changelings.") if("revs") - if(src.makeRevs()) - message_admins("[key_name(usr)] started a revolution.") - log_admin("[key_name(usr)] started a revolution.") + var/maxCount = input("Set number of Revolutionaries","Set Revolutionaries Count (max)",1) as num|null + if(src.makeRevs(maxCount)) + message_admins("[key_name(usr)] started a revolution with [maxCount] freedom fighters.") + log_admin("[key_name(usr)] started a [maxCount] freedom fighters.") else - message_admins("[key_name_admin(usr)] tried to start a revolution. Unfortunately, there were no candidates available.") - log_admin("[key_name(usr)] failed to start a revolution.") + message_admins("[key_name_admin(usr)] tried to start a revolution with [maxCount] freedom fighters. Unfortunately, there were no candidates available.") + log_admin("[key_name(usr)] failed to start a revolution with [maxCount] freedom fighters.") if("cult") - if(src.makeCult()) - message_admins("[key_name(usr)] started a cult.") - log_admin("[key_name(usr)] started a cult.") + var/maxCount = input("Set number of Cultists","Set Cultist Count (max)",1) as num|null + if(src.makeCult(maxCount)) + message_admins("[key_name(usr)] started a cult with [maxCount] cultists.") + log_admin("[key_name(usr)] started a cult with [maxCount] cultists.") else - message_admins("[key_name_admin(usr)] tried to start a cult. Unfortunately, there were no candidates available.") - log_admin("[key_name(usr)] failed to start a cult.") + message_admins("[key_name_admin(usr)] tried to start a cult with [maxCount] cultists. Unfortunately, there were no candidates available.") + log_admin("[key_name(usr)] failed to start a cult with [maxCount] cultists.") if("wizard") message_admins("[key_name(usr)] is creating a wizard...") if(src.makeWizard()) @@ -102,12 +106,13 @@ log_admin("[key_name(usr)] failed to create a wizard.") if("nukeops") message_admins("[key_name(usr)] is creating a nuke team...") - if(src.makeNukeTeam()) - message_admins("[key_name(usr)] created a nuke team.") - log_admin("[key_name(usr)] created a nuke team.") + var/maxCount = input("Set number of Nuke OPs","Set Nuke OP Count (max)",5) as num|null + if(src.makeNukeTeam(maxCount)) + message_admins("[key_name(usr)] created a nuke team with [maxCount] operatives") + log_admin("[key_name(usr)] created a nuke team with [maxCount] operatives") else - message_admins("[key_name_admin(usr)] tried to create a nuke team. Unfortunately, there were not enough candidates available.") - log_admin("[key_name(usr)] failed to create a nuke team.") + message_admins("[key_name_admin(usr)] tried to create a nuke team with [maxCount] operatives Unfortunately, there were not enough candidates available.") + log_admin("[key_name(usr)] failed to create a nuke team with [maxCount] operatives.") if("ninja") message_admins("[key_name(usr)] spawned a ninja.") log_admin("[key_name(usr)] spawned a ninja.") @@ -145,7 +150,7 @@ message_admins("[key_name(usr)] created an abductor team.") log_admin("[key_name(usr)] created an abductor team.") else - message_admins("[key_name_admin(usr)] tried to create an abductor team. Unfortunatly there were not enough candidates available.") + message_admins("[key_name_admin(usr)] tried to create an abductor team. Unfortunately there were not enough candidates available.") log_admin("[key_name(usr)] failed to create an abductor team.") if("revenant") if(src.makeRevenant()) @@ -173,6 +178,7 @@ return if("No") event.announceChance = 0 + event.on_admin_trigger() event.processing = TRUE message_admins("[key_name_admin(usr)] has triggered an event. ([E.name])") log_admin("[key_name(usr)] has triggered an event. ([E.name])") @@ -206,7 +212,7 @@ return if(SSticker && SSticker.mode) return alert(usr, "The game has already started.", null, null, null, null) - if(GLOB.master_mode != "dynamic") + if(!SSticker.is_mode("dynamic")) return alert(usr, "The game mode has to be dynamic mode.", null, null, null, null) var/roundstart_rules = list() for (var/rule in subtypesof(/datum/dynamic_ruleset/roundstart)) @@ -241,15 +247,16 @@ return if(!SSticker || !SSticker.mode) return alert(usr, "The game must start first.", null, null, null, null) - if(GLOB.master_mode != "dynamic") + if(!SSticker.is_mode("dynamic")) return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null) var/latejoin_rules = list() + var/datum/game_mode/dynamic/mode = SSticker.mode for (var/rule in subtypesof(/datum/dynamic_ruleset/latejoin)) var/datum/dynamic_ruleset/latejoin/newrule = new rule() + mode.configure_ruleset(newrule) latejoin_rules[newrule.name] = newrule var/added_rule = input(usr,"What ruleset do you want to force upon the next latejoiner? This will bypass threat level and population restrictions.", "Rigging Latejoin", null) as null|anything in latejoin_rules if (added_rule) - var/datum/game_mode/dynamic/mode = SSticker.mode mode.forced_latejoin_rule = latejoin_rules[added_rule] log_admin("[key_name(usr)] set [added_rule] to proc on the next latejoin.") message_admins("[key_name(usr)] set [added_rule] to proc on the next latejoin.", 1) @@ -270,15 +277,16 @@ return if(!SSticker || !SSticker.mode) return alert(usr, "The game must start first.", null, null, null, null) - if(GLOB.master_mode != "dynamic") + if(!SSticker.is_mode("dynamic")) return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null) var/midround_rules = list() + var/datum/game_mode/dynamic/mode = SSticker.mode for (var/rule in subtypesof(/datum/dynamic_ruleset/midround)) var/datum/dynamic_ruleset/midround/newrule = new rule() + mode.configure_ruleset(newrule) midround_rules[newrule.name] = rule var/added_rule = input(usr,"What ruleset do you want to force right now? This will bypass threat level and population restrictions.", "Execute Ruleset", null) as null|anything in midround_rules if (added_rule) - var/datum/game_mode/dynamic/mode = SSticker.mode log_admin("[key_name(usr)] executed the [added_rule] ruleset.") message_admins("[key_name(usr)] executed the [added_rule] ruleset.", 1) mode.picking_specific_rule(midround_rules[added_rule],1) @@ -289,122 +297,16 @@ 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) - - dynamic_mode_options(usr) - - else if(href_list["f_dynamic_roundstart_centre"]) - 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/new_centre = input(usr,"Change the centre of the dynamic mode threat curve. A negative value will give a more peaceful round ; a positive value, a round with higher threat. Any number between -5 and +5 is allowed.", "Change curve centre", null) as num - if (new_centre < -5 || new_centre > 5) - return alert(usr, "Only values between -5 and +5 are allowed.", null, null, null, null) - - log_admin("[key_name(usr)] changed the distribution curve center to [new_centre].") - message_admins("[key_name(usr)] changed the distribution curve center to [new_centre]", 1) - GLOB.dynamic_curve_centre = new_centre - dynamic_mode_options(usr) - - else if(href_list["f_dynamic_roundstart_width"]) - 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/new_width = input(usr,"Change the width of the dynamic mode threat curve. A higher value will favour extreme rounds ; a lower value, a round closer to the average. Any Number between 0.5 and 4 are allowed.", "Change curve width", null) as num - if (new_width < 0.5 || new_width > 4) - return alert(usr, "Only values between 0.5 and +2.5 are allowed.", null, null, null, null) - - log_admin("[key_name(usr)] changed the distribution curve width to [new_width].") - message_admins("[key_name(usr)] changed the distribution curve width to [new_width]", 1) - GLOB.dynamic_curve_width = new_width - dynamic_mode_options(usr) - - else if(href_list["f_dynamic_roundstart_latejoin_min"]) - 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/new_min = input(usr,"Change the minimum delay of latejoin injection in minutes.", "Change latejoin injection delay minimum", null) as num - if(new_min <= 0) - return alert(usr, "The minimum can't be zero or lower.", null, null, null, null) - if((new_min MINUTES) > GLOB.dynamic_latejoin_delay_max) - return alert(usr, "The minimum must be lower than the maximum.", null, null, null, null) - - log_admin("[key_name(usr)] changed the latejoin injection minimum delay to [new_min] minutes.") - message_admins("[key_name(usr)] changed the latejoin injection minimum delay to [new_min] minutes", 1) - GLOB.dynamic_latejoin_delay_min = (new_min MINUTES) - dynamic_mode_options(usr) - - else if(href_list["f_dynamic_roundstart_latejoin_max"]) - 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/new_max = input(usr,"Change the maximum delay of latejoin injection in minutes.", "Change latejoin injection delay maximum", null) as num - if(new_max <= 0) - return alert(usr, "The maximum can't be zero or lower.", null, null, null, null) - if((new_max MINUTES) < GLOB.dynamic_latejoin_delay_min) - return alert(usr, "The maximum must be higher than the minimum.", null, null, null, null) - - log_admin("[key_name(usr)] changed the latejoin injection maximum delay to [new_max] minutes.") - message_admins("[key_name(usr)] changed the latejoin injection maximum delay to [new_max] minutes", 1) - GLOB.dynamic_latejoin_delay_max = (new_max MINUTES) - dynamic_mode_options(usr) - - else if(href_list["f_dynamic_roundstart_midround_min"]) - 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") + if(!SSticker.is_mode("dynamic")) return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null) - var/new_min = input(usr,"Change the minimum delay of midround injection in minutes.", "Change midround injection delay minimum", null) as num - if(new_min <= 0) - return alert(usr, "The minimum can't be zero or lower.", null, null, null, null) - if((new_min MINUTES) > GLOB.dynamic_midround_delay_max) - return alert(usr, "The minimum must be lower than the maximum.", null, null, null, null) - - log_admin("[key_name(usr)] changed the midround injection minimum delay to [new_min] minutes.") - message_admins("[key_name(usr)] changed the midround injection minimum delay to [new_min] minutes", 1) - GLOB.dynamic_midround_delay_min = (new_min MINUTES) - dynamic_mode_options(usr) - else if(href_list["f_dynamic_roundstart_midround_max"]) - 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/new_max = input(usr,"Change the maximum delay of midround injection in minutes.", "Change midround injection delay maximum", null) as num - if(new_max <= 0) - return alert(usr, "The maximum can't be zero or lower.", null, null, null, null) - if((new_max MINUTES) > GLOB.dynamic_midround_delay_max) - return alert(usr, "The maximum must be higher than the minimum.", null, null, null, null) - - log_admin("[key_name(usr)] changed the midround injection maximum delay to [new_max] minutes.") - message_admins("[key_name(usr)] changed the midround injection maximum delay to [new_max] minutes", 1) - GLOB.dynamic_midround_delay_max = (new_max MINUTES) dynamic_mode_options(usr) else if(href_list["f_dynamic_force_extended"]) if(!check_rights(R_ADMIN)) return - if(GLOB.master_mode != "dynamic") + if(!SSticker.is_mode("dynamic")) return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null) GLOB.dynamic_forced_extended = !GLOB.dynamic_forced_extended @@ -416,7 +318,7 @@ if(!check_rights(R_ADMIN)) return - if(GLOB.master_mode != "dynamic") + if(!SSticker.is_mode("dynamic")) return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null) GLOB.dynamic_no_stacking = !GLOB.dynamic_no_stacking @@ -424,23 +326,11 @@ message_admins("[key_name(usr)] set 'no_stacking' to [GLOB.dynamic_no_stacking].") dynamic_mode_options(usr) - else if(href_list["f_dynamic_classic_secret"]) - if(!check_rights(R_ADMIN)) - return - - if(GLOB.master_mode != "dynamic") - return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null) - - GLOB.dynamic_classic_secret = !GLOB.dynamic_classic_secret - log_admin("[key_name(usr)] set 'classic_secret' to [GLOB.dynamic_classic_secret].") - message_admins("[key_name(usr)] set 'classic_secret' to [GLOB.dynamic_classic_secret].") - dynamic_mode_options(usr) - else if(href_list["f_dynamic_stacking_limit"]) if(!check_rights(R_ADMIN)) return - if(GLOB.master_mode != "dynamic") + if(!SSticker.is_mode("dynamic")) return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null) 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 @@ -448,25 +338,6 @@ message_admins("[key_name(usr)] set 'stacking_limit' to [GLOB.dynamic_stacking_limit].") dynamic_mode_options(usr) - else if(href_list["f_dynamic_high_pop_limit"]) - 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/new_value = input(usr, "Enter the high-pop override threshold for dynamic mode.", "High pop override") as num - if (new_value < 0) - return alert(usr, "Only positive values allowed!", null, null, null, null) - GLOB.dynamic_high_pop_limit = new_value - - log_admin("[key_name(usr)] set 'high_pop_limit' to [GLOB.dynamic_high_pop_limit].") - message_admins("[key_name(usr)] set 'high_pop_limit' to [GLOB.dynamic_high_pop_limit].") - dynamic_mode_options(usr) - else if(href_list["f_dynamic_forced_threat"]) if(!check_rights(R_ADMIN)) return @@ -474,7 +345,7 @@ if(SSticker && SSticker.mode) return alert(usr, "The game has already started.", null, null, null, null) - if(GLOB.master_mode != "dynamic") + if(!SSticker.is_mode("dynamic")) return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null) var/new_value = input(usr, "Enter the forced threat level for dynamic mode.", "Forced threat level") as num @@ -876,17 +747,20 @@ return if (SSticker.HasRoundStarted()) - if (askuser(usr, "The game has already started. Would you like to save this as the default mode effective next round?", "Save mode", "Yes", "Cancel", Timeout = null) == 1) - SSticker.save_mode(href_list["c_mode2"]) + alert("The round has already started.") + HandleCMode() + return + if(SSticker.gamemode_hotswap_disabled) + alert("A gamemode has already loaded maps and cannot be changed!") HandleCMode() return GLOB.master_mode = href_list["c_mode2"] + //Disable presetup so their gamemode gets loaded. + SSticker.pre_setup_completed = FALSE log_admin("[key_name(usr)] set the mode as [GLOB.master_mode].") message_admins("[key_name_admin(usr)] set the mode as [GLOB.master_mode].") to_chat(world, "The mode is now: [GLOB.master_mode]") Game() // updates the main game menu - if (askuser(usr, "Would you like to save this as the default mode for the server?", "Save mode", "Yes", "No", Timeout = null) == 1) - SSticker.save_mode(GLOB.master_mode) HandleCMode() else if(href_list["f_secret2"]) @@ -1103,8 +977,8 @@ if(ishuman(L)) var/mob/living/carbon/human/observer = L - observer.equip_to_slot_or_del(new /obj/item/clothing/under/suit/black(observer), SLOT_W_UNIFORM) - observer.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(observer), SLOT_SHOES) + observer.equip_to_slot_or_del(new /obj/item/clothing/under/suit/black(observer), ITEM_SLOT_ICLOTHING) + observer.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(observer), ITEM_SLOT_FEET) L.Unconscious(100) sleep(5) L.forceMove(pick(GLOB.tdomeobserve)) @@ -1613,16 +1487,18 @@ R.activate_module(I) if(pod) - new /obj/effect/DPtarget(target, pod) + new /obj/effect/pod_landingzone(target, pod) + + var/turf/T = get_turf(usr.loc) // get admin's LOC as a turf if (number == 1) - log_admin("[key_name(usr)] created a [english_list(paths)]") + log_admin("[key_name(usr)] created a [english_list(paths)] at [AREACOORD(T)]") for(var/path in paths) if(ispath(path, /mob)) message_admins("[key_name_admin(usr)] created a [english_list(paths)]") break else - log_admin("[key_name(usr)] created [number]ea [english_list(paths)]") + log_admin("[key_name(usr)] created [number]ea [english_list(paths)] at [AREACOORD(T)]") for(var/path in paths) if(ispath(path, /mob)) message_admins("[key_name_admin(usr)] created [number]ea [english_list(paths)]") @@ -1981,7 +1857,7 @@ return if(!CONFIG_GET(string/centcom_ban_db)) - to_chat(usr, "Centcom Galactic Ban DB is disabled!") + to_chat(usr, "CentCom Galactic Ban DB is disabled!") return var/ckey = href_list["centcomlookup"] @@ -2024,7 +1900,7 @@ dat += sanitize(jobs.Join(", ")) dat += "
    " dat += "


    " - + var/datum/browser/popup = new(usr, "centcomlookup-[ckey]", "
    Central Command Galactic Ban Database
    ", 700, 600) popup.set_content(dat.Join()) popup.open(FALSE) @@ -2193,7 +2069,7 @@ return var/turf/T = get_turf(tear.old_loc) message_admins("The items consumed by the BoH tear at [ADMIN_VERBOSEJMP(T)] were retrieved by [key_name_admin(usr)].") - tear.investigate_log("Items consumed at [AREACOORD(T)] retrieved by [key_name(usr)].", INVESTIGATE_SINGULO) + tear.investigate_log("Items consumed at [AREACOORD(T)] retrieved by [key_name(usr)].", INVESTIGATE_ENGINES) tear.retrieve_consumed_items() else if(href_list["beakerpanel"]) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index c93ee5bd0e841..a1c27a7a7973c 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -276,7 +276,6 @@ "SDQL combined querys took [DisplayTimeText(end_time_total)] to complete.") + combined_refs GLOBAL_LIST_INIT(sdql2_queries, GLOB.sdql2_queries || list()) -GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null, "VIEW VARIABLES (all)", null)) /datum/SDQL2_query var/list/query_tree @@ -305,10 +304,6 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null var/list/obj_count_eligible var/obj_count_finished - //Statclick - var/obj/effect/statclick/SDQL2_delete/delete_click - var/obj/effect/statclick/SDQL2_action/action_click - /datum/SDQL2_query/New(list/tree, SU = FALSE, admin_interact = TRUE, _options = SDQL2_OPTIONS_DEFAULT, finished_qdel = FALSE) if(IsAdminAdvancedProcCall() || !LAZYLEN(tree)) qdel(src) @@ -391,17 +386,29 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null return "##HALTING" /datum/SDQL2_query/proc/generate_stat() + var/list/tab_data = list() if(!allow_admin_interact) return - if(!delete_click) - delete_click = new(null, "INITIALIZING", src) - if(!action_click) - action_click = new(null, "INITIALIZNG", src) - stat("[id] ", delete_click.update("DELETE QUERY | STATE : [text_state()] | ALL/ELIG/FIN \ - [islist(obj_count_all)? length(obj_count_all) : (isnull(obj_count_all)? "0" : obj_count_all)]/\ - [islist(obj_count_eligible)? length(obj_count_eligible) : (isnull(obj_count_eligible)? "0" : obj_count_eligible)]/\ - [islist(obj_count_finished)? length(obj_count_finished) : (isnull(obj_count_finished)? "0" : obj_count_finished)] - [get_query_text()]")) - stat(" ", action_click.update("[SDQL2_IS_RUNNING? "HALT" : "RUN"]")) + tab_data["Delete Query [id]"] = list( + text = "DELETE QUERY | STATE : [text_state()] | ALL/ELIG/FIN \ + [islist(obj_count_all)? length(obj_count_all) : (isnull(obj_count_all)? "0" : obj_count_all)]/\ + [islist(obj_count_eligible)? length(obj_count_eligible) : (isnull(obj_count_eligible)? "0" : obj_count_eligible)]/\ + [islist(obj_count_finished)? length(obj_count_finished) : (isnull(obj_count_finished)? "0" : obj_count_finished)] - [get_query_text()]", + action = "sdql2delete", + params = list( + qid = id, + ), + type = STAT_BUTTON, + ) + tab_data["Toggle Query [id]"] = list( + text = "[SDQL2_IS_RUNNING? "HALT" : "RUN"]", + action = "sdql2toggle", + params = list( + qid = id, + ), + type = STAT_BUTTON, + ) + return tab_data /datum/SDQL2_query/proc/delete_click() admin_del(usr) @@ -762,7 +769,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null 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("/proc/[procname]")(new_args)) : (WrapAdminProcCall(GLOBAL_PROC, procname, new_args)) return superuser? (call(object, procname)(new_args)) : (WrapAdminProcCall(object, procname, new_args)) /datum/SDQL2_query/proc/SDQL_function_async(datum/object, procname, list/arguments, source) @@ -968,13 +975,13 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null //Staying as a world proc as this is called too often for changes to offset the potential IsAdminAdvancedProcCall checking overhead. /world/proc/SDQL_var(object, list/expression, start = 1, source, superuser, datum/SDQL2_query/query) var/v - var/static/list/exclude = list("usr", "src", "marked", "global") + var/static/list/exclude = list("usr", "src", "marked", "global", "MC", "FS", "CFG") var/long = start < expression.len var/datum/D if(is_proper_datum(object)) D = object - if (object == world && (!long || expression[start + 1] == ".") && !(expression[start] in exclude)) + if (object == world && (!long || expression[start + 1] == ".") && !(expression[start] in exclude) && copytext(expression[start], 1, 3) != "SS") to_chat(usr, "World variables are not allowed to be accessed. Use global.") return null @@ -1020,46 +1027,22 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null v = Failsafe if("CFG") v = config - //Subsystem switches - if("SSgarbage") - v = SSgarbage - if("SSmachines") - v = SSmachines - if("SSobj") - v = SSobj - if("SSresearch") - v = SSresearch - if("SSprojectiles") - v = SSprojectiles - if("SSfastprocess") - v = SSfastprocess - if("SSticker") - v = SSticker - if("SStimer") - v = SStimer - if("SSradiation") - v = SSradiation - if("SSnpcpool") - v = SSnpcpool - if("SSmobs") - v = SSmobs - if("SSmood") - v = SSmood - if("SSquirks") - v = SSquirks - if("SSwet_floors") - v = SSwet_floors - if("SSshuttle") - v = SSshuttle - if("SSmapping") - v = SSmapping - if("SSevents") - v = SSevents - if("SSeconomy") - v = SSeconomy - //End else - return null + if(copytext(expression[start], 1, 3) == "SS") //Subsystem + var/SSname = copytext(expression[start], 3) + var/SSlength = length(SSname) + var/datum/controller/subsystem/SS + var/SSmatch + for(var/_SS in Master.subsystems) + SS = _SS + if(copytext("[SS.type]", -SSlength) == SSname) + SSmatch = SS + break + if(!SSmatch) + return null + v = SSmatch + else + return null else if(object == GLOB) // Shitty ass hack kill me. v = expression[start] if(long) @@ -1187,16 +1170,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null /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() - -/obj/effect/statclick/SDQL2_action/Click() - var/datum/SDQL2_query/Q = target - Q.action_click() - -/obj/effect/statclick/SDQL2_VV_all - name = "VIEW VARIABLES" - -/obj/effect/statclick/SDQL2_VV_all/Click() - usr.client.debug_variables(GLOB.sdql2_queries) +/proc/sdqlQueryByID(id) + for(var/datum/SDQL2_query/query as anything in GLOB.sdql2_queries) + if(query.id == id) + return query diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm index aee395d9aa2a2..254821ec0e66d 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm @@ -27,15 +27,15 @@ // assignment : '=' expression // variable : | variable '.' variable | variable '[' ']' | '{' '}' | '(' expression ')' | call_function // -// bool_expression : expression comparitor expression [bool_operator bool_expression] +// bool_expression : expression comparator expression [bool_operator bool_expression] // expression : ( unary_expression | '(' expression ')' | value ) [binary_operator expression] // expression_list : expression [',' expression_list] // unary_expression : unary_operator ( unary_expression | value ) // -// comparitor : '=' | '==' | '!=' | '<>' | '<' | '<=' | '>' | '>=' +// comparator : '=' | '==' | '!=' | '<>' | '<' | '<=' | '>' | '>=' // value : variable | string | number | 'null' | object_type | array | selectors_array // unary_operator : '!' | '-' | '~' -// binary_operator : comparitor | '+' | '-' | '/' | '*' | '&' | '|' | '^' | '%' +// binary_operator : comparator | '+' | '-' | '/' | '*' | '&' | '|' | '^' | '%' // bool_operator : 'AND' | '&&' | 'OR' | '||' // // array : '[' expression_list ']' @@ -56,7 +56,7 @@ var/list/boolean_operators = list("and", "or", "&&", "||") var/list/unary_operators = list("!", "-", "~") var/list/binary_operators = list("+", "-", "/", "*", "&", "|", "^", "%") - var/list/comparitors = list("=", "==", "!=", "<>", "<", "<=", ">", ">=") + var/list/comparators = list("=", "==", "!=", "<>", "<", "<=", ">", ">=") /datum/SDQL_parser/New(query_list) query = query_list @@ -109,7 +109,7 @@ parse_error("Invalid option assignment symbol: [token(i + 1)]") var/val = tokenl(i + 2) if(!(val in SDQL2_VALID_OPTION_VALUES)) - parse_error("Invalid optoin value: [val]") + parse_error("Invalid option value: [val]") assignment_list[type] = val return (i + 3) @@ -396,21 +396,21 @@ var/path = text2path(token(i)) if (path == null) - return parse_error("Nonexistant type path: [token(i)]") + return parse_error("Nonexistent type path: [token(i)]") node += path return i + 1 -//comparitor: '=' | '==' | '!=' | '<>' | '<' | '<=' | '>' | '>=' -/datum/SDQL_parser/proc/comparitor(i, list/node) +//comparator: '=' | '==' | '!=' | '<>' | '<' | '<=' | '>' | '>=' +/datum/SDQL_parser/proc/comparator(i, list/node) if(token(i) in list("=", "==", "!=", "<>", "<", "<=", ">", ">=")) node += token(i) else - parse_error("Unknown comparitor [token(i)]") + parse_error("Unknown comparator [token(i)]") return i + 1 @@ -422,7 +422,7 @@ node += token(i) else - parse_error("Unknown comparitor [token(i)]") + parse_error("Unknown comparator [token(i)]") return i + 1 @@ -551,7 +551,7 @@ i = binary_operator(i, node) i = expression(i, node) - else if(token(i) in comparitors) + else if(token(i) in comparators) i = binary_operator(i, node) var/list/rhs = list() @@ -587,10 +587,10 @@ return i -//binary_operator: comparitor | '+' | '-' | '/' | '*' | '&' | '|' | '^' | '%' +//binary_operator: comparator | '+' | '-' | '/' | '*' | '&' | '|' | '^' | '%' /datum/SDQL_parser/proc/binary_operator(i, list/node) - if(token(i) in (binary_operators + comparitors)) + if(token(i) in (binary_operators + comparators)) node += token(i) else diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 857704c374dc8..d1dc12930a020 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -30,22 +30,11 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) var/list/closed_tickets = list() var/list/resolved_tickets = list() - var/obj/effect/statclick/ticket_list/browse_statclick = new(null, null, null) - var/obj/effect/statclick/ticket_list/ustatclick = new(null, null, AHELP_UNCLAIMED) - var/obj/effect/statclick/ticket_list/astatclick = new(null, null, AHELP_ACTIVE) - var/obj/effect/statclick/ticket_list/cstatclick = new(null, null, AHELP_CLOSED) - var/obj/effect/statclick/ticket_list/rstatclick = new(null, null, AHELP_RESOLVED) - /datum/admin_help_tickets/Destroy() QDEL_LIST(unclaimed_tickets) QDEL_LIST(active_tickets) QDEL_LIST(closed_tickets) QDEL_LIST(resolved_tickets) - QDEL_NULL(browse_statclick) - QDEL_NULL(ustatclick) - QDEL_NULL(astatclick) - QDEL_NULL(cstatclick) - QDEL_NULL(rstatclick) return ..() /datum/admin_help_tickets/proc/TicketByID(id) @@ -204,20 +193,47 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) //Tickets statpanel /datum/admin_help_tickets/proc/stat_entry() + var/list/tab_data = list() + tab_data["Tickets"] = list( + text = "Open Ticket Browser", + type = STAT_BUTTON, + action = "browsetickets", + ) + tab_data["Active Tickets"] = list( + text = "[active_tickets.len]", + type = STAT_BUTTON, + action = "browsetickets", + ) var/num_disconnected = 0 - stat("", browse_statclick.update("Open Ticket Browser")) - stat("Active Tickets:", astatclick.update("[active_tickets.len]")) for(var/l in list(active_tickets, unclaimed_tickets)) for(var/I in l) var/datum/admin_help/AH = I if(AH.initiator) - stat("#[AH.id]. [AH.initiator_key_name]:", AH.statclick.update()) + tab_data["#[AH.id]. [AH.initiator_key_name]"] = list( + text = AH.name, + type = STAT_BUTTON, + action = "open_ticket", + params = list("id" = AH.id), + ) else ++num_disconnected if(num_disconnected) - stat("Disconnected:", astatclick.update("[num_disconnected]")) - stat("Closed Tickets:", cstatclick.update("[closed_tickets.len]")) - stat("Resolved Tickets:", rstatclick.update("[resolved_tickets.len]")) + tab_data["Disconnected"] = list( + text = "[num_disconnected]", + type = STAT_BUTTON, + action = "browsetickets", + ) + tab_data["Closed Tickets"] = list( + text = "[closed_tickets.len]", + type = STAT_BUTTON, + action = "browsetickets", + ) + tab_data["Resolved Tickets"] = list( + text = "[resolved_tickets.len]", + type = STAT_BUTTON, + action = "browsetickets", + ) + return tab_data //Reassociate still open ticket if one exists /datum/admin_help_tickets/proc/ClientLogin(client/C) @@ -241,20 +257,6 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(AH.initiator_ckey == ckey) return AH -// -//TICKET LIST STATCLICK -// - -/obj/effect/statclick/ticket_list - var/current_state - -/obj/effect/statclick/ticket_list/New(loc, name, state) - current_state = state - ..() - -/obj/effect/statclick/ticket_list/Click() - GLOB.ahelp_tickets.BrowseTickets(usr) - // // Ticket interaction // @@ -265,6 +267,8 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) var/from_user = "" var/to_user = "" var/message = "" + var/from_user_safe + var/to_user_safe /datum/ticket_interaction/New() . = ..() @@ -292,8 +296,6 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) var/list/_interactions //use AddInteraction() or, preferably, admin_ticket_log() - var/obj/effect/statclick/ahelp/statclick - var/static/ticket_counter = 0 var/bwoink // is the ahelp player to admin (not bwoink) or admin to player (bwoink) @@ -311,7 +313,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) id = ++ticket_counter opened_at = world.time - name = msg + name = copytext_char(msg, 1, 100) initiator = C initiator_ckey = initiator.ckey @@ -324,23 +326,22 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) TimeoutVerb() - statclick = new(null, src) _interactions = list() GLOB.ahelp_tickets.unclaimed_tickets += src if(is_bwoink) - AddInteraction("blue", name, usr.ckey, initiator_key_name) + AddInteraction("blue", name, usr.ckey, initiator_key_name, "Administrator", "You") message_admins("Ticket [TicketHref("#[id]")] created") Claim() //Auto claim bwoinks else MessageNoRecipient(msg) - //send it to irc if nobody is on and tell us how many were on - var/admin_number_present = send2irc_adminless_only(initiator_ckey, "Ticket #[id]: [name]") + //send it to tgs if nobody is on and tell us how many were on + var/admin_number_present = send2tgs_adminless_only(initiator_ckey, "Ticket #[id]: [msg]") log_admin_private("Ticket #[id]: [key_name(initiator)]: [name] - heard by [admin_number_present] non-AFK admins who have +BAN.") if(admin_number_present <= 0) - to_chat(C, "No active admins are online, your adminhelp was sent to the admin irc.") + to_chat(C, "No active admins are online, your adminhelp was sent through TGS to admins who are available. This may use IRC or Discord.") heard_by_no_admins = TRUE bwoink = is_bwoink @@ -353,20 +354,22 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) GLOB.ahelp_tickets.resolved_tickets -= src return ..() -/datum/admin_help/proc/AddInteraction(msg_color, message, name_from, name_to) +/datum/admin_help/proc/AddInteraction(msg_color, message, name_from, name_to, safe_from, safe_to) if(heard_by_no_admins && usr && usr.ckey != initiator_ckey) heard_by_no_admins = FALSE - send2irc(initiator_ckey, "Ticket #[id]: Answered by [key_name(usr)]") + send2tgs(initiator_ckey, "Ticket #[id]: Answered by [key_name(usr)]") var/datum/ticket_interaction/interaction_message = new /datum/ticket_interaction interaction_message.message_color = msg_color interaction_message.message = message interaction_message.from_user = name_from interaction_message.to_user = name_to + interaction_message.from_user_safe = safe_from + interaction_message.to_user_safe = safe_to _interactions += interaction_message SStgui.update_uis(src) /datum/admin_help/proc/TimeoutVerb() - initiator.verbs -= /client/verb/adminhelp + initiator.remove_verb(/client/verb/adminhelp) initiator.adminhelptimerid = addtimer(CALLBACK(initiator, /client/proc/giveadminhelpverb), 1200, TIMER_STOPPABLE) //private @@ -510,7 +513,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) //Message to be sent to all admins var/admin_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [keywords_lookup(msg)]" - AddInteraction("red", msg, initiator_key_name, claimed_admin_key_name) + AddInteraction("red", msg, initiator_key_name, claimed_admin_key_name, "You", "Administrator") log_admin_private("Ticket #[id]: [key_name(initiator)]: [msg]") //send this msg to all admins @@ -537,7 +540,6 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) to_chat(usr, "This user already has an active ticket, cannot reopen this one.") return - statclick = new(null, src) GLOB.ahelp_tickets.active_tickets += src GLOB.ahelp_tickets.closed_tickets -= src GLOB.ahelp_tickets.resolved_tickets -= src @@ -563,7 +565,6 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(state > AHELP_ACTIVE) return closed_at = world.time - QDEL_NULL(statclick) if(state == AHELP_ACTIVE) GLOB.ahelp_tickets.active_tickets -= src else @@ -733,27 +734,6 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if("mhelp") MHelpThis() -// -// TICKET STATCLICK -// - -/obj/effect/statclick/ahelp - var/datum/admin_help/ahelp_datum - -/obj/effect/statclick/ahelp/Initialize(mapload, datum/admin_help/AH) - ahelp_datum = AH - . = ..() - -/obj/effect/statclick/ahelp/update() - return ..(ahelp_datum.name) - -/obj/effect/statclick/ahelp/Click() - ahelp_datum.TicketPanel() - -/obj/effect/statclick/ahelp/Destroy() - ahelp_datum = null - return ..() - // //CLIENT PROCS // @@ -761,16 +741,16 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) /client/proc/giveadminhelpverb() if(!src) return - src.verbs |= /client/verb/adminhelp + src.add_verb(/client/verb/adminhelp) deltimer(adminhelptimerid) adminhelptimerid = 0 // Used for methods where input via arg doesn't work /client/proc/get_adminhelp() - var/msg = capped_input(src, "Please describe your problem concisely and an admin will help as soon as they're able. Include the names of the people you are ahelping against if applicable.", "Adminhelp contents") + var/msg = capped_multiline_input(src, "Please describe your problem concisely and an admin will help as soon as they're able. Include the names of the people you are ahelping against if applicable.", "Adminhelp contents") adminhelp(msg) -/client/verb/adminhelp(msg as text) +/client/verb/adminhelp(msg as message) set category = "Admin" set name = "Adminhelp" @@ -811,7 +791,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) //Use this proc when an admin takes action that may be related to an open ticket on what //what can be a client, ckey, or mob -/proc/admin_ticket_log(what, message, whofrom = "", whoto = "", color = "white") +/proc/admin_ticket_log(what, message, whofrom = "", whoto = "", color = "white", isSenderAdmin = FALSE, safeSenderLogged = FALSE) var/client/C var/mob/Mob = what if(istype(Mob)) @@ -819,12 +799,18 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) else C = what if(istype(C) && C.current_ticket) - C.current_ticket.AddInteraction(color, message, whofrom, whoto) + if(safeSenderLogged) + C.current_ticket.AddInteraction(color, message, whofrom, whoto, isSenderAdmin ? "Administrator" : "You", isSenderAdmin ? "You" : "Administrator") + else + C.current_ticket.AddInteraction(color, message, whofrom, whoto) return C.current_ticket if(istext(what)) //ckey var/datum/admin_help/AH = GLOB.ahelp_tickets.CKey2ActiveTicket(what) if(AH) - AH.AddInteraction(color, message, whofrom, whoto) + if(safeSenderLogged) + AH.AddInteraction(color, message, whofrom, whoto, isSenderAdmin ? "Administrator" : "You", isSenderAdmin ? "You" : "Administrator") + else + AH.AddInteraction(color, message, whofrom, whoto) return AH @@ -845,7 +831,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) else .["present"] += X -/proc/send2irc_adminless_only(source, msg, requiredflags = R_BAN) +/proc/send2tgs_adminless_only(source, msg, requiredflags = R_BAN) var/list/adm = get_admin_counts(requiredflags) var/list/activemins = adm["present"] . = activemins.len @@ -859,32 +845,16 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) final = "[msg] - No admins online" else final = "[msg] - All admins stealthed\[[english_list(stealthmins)]\], AFK\[[english_list(afkmins)]\], or lacks +BAN\[[english_list(powerlessmins)]\]! Total: [allmins.len] " - send2irc(source,final) - send2otherserver(source,final) + send2tgs(source,final) + SStopic.crosscomms_send("ahelp", final, source) -/proc/send2irc(msg,msg2) +/proc/send2tgs(msg,msg2) msg = replacetext(replacetext(msg, "\proper", ""), "\improper", "") msg2 = replacetext(replacetext(msg2, "\proper", ""), "\improper", "") world.TgsTargetedChatBroadcast("[msg] | [msg2]", TRUE) -/proc/send2otherserver(source,msg,type = "Ahelp") - var/comms_key = CONFIG_GET(string/comms_key) - if(!comms_key) - return - var/list/message = list() - message["message_sender"] = source - message["message"] = msg - message["source"] = "([CONFIG_GET(string/cross_comms_name)])" - message["key"] = comms_key - message += type - - var/list/servers = CONFIG_GET(keyed_list/cross_server) - for(var/I in servers) - world.Export("[servers[I]]?[list2params(message)]") - - -/proc/ircadminwho() +/proc/tgsadminwho() var/list/message = list("Admins: ") var/list/admin_keys = list() for(var/adm in GLOB.admins) @@ -899,7 +869,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) return jointext(message, "") -/proc/keywords_lookup(msg,irc) +/proc/keywords_lookup(msg,external) //This is a list of words which are ignored by the parser when comparing message contents for names. MUST BE IN LOWER CASE! var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as", "i") @@ -911,8 +881,11 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) var/list/surnames = list() var/list/forenames = list() var/list/ckeys = list() - var/founds = "" + var/list/founds = list() for(var/mob/M in GLOB.mob_list) + if(istype(M, /mob/living/carbon/human/dummy)) + continue + var/list/indexing = list(M.real_name, M.name) if(M.mind) indexing += M.mind.name @@ -958,15 +931,16 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) var/is_antag = 0 if(found.mind?.special_role) is_antag = 1 - founds += "Name: [found.name]([found.real_name]) Key: [found.key] Ckey: [found.ckey] [is_antag ? "(Antag)" : null] " + founds[++founds.len] = list("name" = found.name, + "real_name" = found.real_name, + "ckey" = found.ckey, + "key" = found.key, + "antag" = is_antag) msg += "[original_word](?|F) " continue msg += "[original_word] " - if(irc) - if(founds == "") - return "Search Failed" - else - return founds + if(external) + return founds return msg diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 02c41581744c5..1709f27b47b9e 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -1,4 +1,4 @@ -#define IRCREPLYCOUNT 2 +#define EXTERNALREPLYCOUNT 2 //allows right clicking mobs to send an admin PM to their client, forwards the selected mob's client to cmd_admin_pm @@ -95,20 +95,20 @@ return var/client/recipient - var/irc = 0 + var/external = 0 if(istext(whom)) if(whom[1] == "@") whom = findStealthKey(whom) if(whom == "IRCKEY") - irc = 1 + external = 1 else recipient = GLOB.directory[whom] else if(istype(whom, /client)) recipient = whom - if(irc) - if(!ircreplyamount) //to prevent people from spamming irc + if(external) + if(!externalreplyamount) //to prevent people from spamming irc/discord return if(!msg) msg = stripped_multiline_input(src,"Message:", "Private message to Administrator") @@ -116,7 +116,7 @@ if(!msg) return if(holder) - to_chat(src, "Error: Use the admin IRC channel, nerd.", type = MESSAGE_TYPE_ADMINPM) + to_chat(src, "Error: Use the admin IRC/Discord channel, nerd.", type = MESSAGE_TYPE_ADMINPM) return @@ -153,7 +153,7 @@ return //clean the message if it's not sent by a high-rank admin - if(!check_rights(R_SERVER|R_DEBUG,0)||irc)//no sending html to the poor bots + if(!check_rights(R_SERVER|R_DEBUG,0)||external)//no sending html to the poor bots msg = trim(sanitize(msg), MAX_MESSAGE_LEN) if(!msg) return @@ -165,11 +165,11 @@ var/keywordparsedmsg = keywords_lookup(msg) - if(irc) + if(external) to_chat(src, "PM to-Admins: [rawmsg]", type = MESSAGE_TYPE_ADMINPM) - var/datum/admin_help/AH = admin_ticket_log(src, "Reply PM from-[key_name(src, TRUE, TRUE)] to IRC: [keywordparsedmsg]") - ircreplyamount-- - send2irc("[AH ? "#[AH.id] " : ""]Reply: [ckey]", rawmsg) + var/datum/admin_help/AH = admin_ticket_log(src, "Reply PM from-[key_name(src, TRUE, TRUE)] to External: [keywordparsedmsg]") + externalreplyamount-- + send2tgs("[AH ? "#[AH.id] " : ""]Reply: [ckey]", rawmsg) else if(recipient.holder) if(holder) //both are admins @@ -177,13 +177,13 @@ to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [keywordparsedmsg]", type = MESSAGE_TYPE_ADMINPM) //omg this is dumb, just fill in both their tickets - admin_ticket_log(src, keywordparsedmsg, key_name(src, recipient, 1), key_name(recipient, src, 1), color="teal") + admin_ticket_log(src, keywordparsedmsg, key_name(src, recipient, 1), key_name(recipient, src, 1), color="teal", isSenderAdmin = TRUE, safeSenderLogged = TRUE) if(recipient != src) //reeee - admin_ticket_log(recipient, keywordparsedmsg, key_name(src, recipient, 1), key_name(recipient, src, 1), color="teal") + admin_ticket_log(recipient, keywordparsedmsg, key_name(src, recipient, 1), key_name(recipient, src, 1), color="teal", isSenderAdmin = TRUE, safeSenderLogged = TRUE) else //recipient is an admin but sender is not var/replymsg = "Reply PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]" - admin_ticket_log(src, keywordparsedmsg, key_name(src, recipient, 1), null, "white") + admin_ticket_log(src, keywordparsedmsg, key_name(src, recipient, 1), null, "white", isSenderAdmin = TRUE, safeSenderLogged = TRUE) to_chat(recipient, "[replymsg]", type = MESSAGE_TYPE_ADMINPM) to_chat(src, "PM to-Admins: [msg]", type = MESSAGE_TYPE_ADMINPM) @@ -201,7 +201,7 @@ to_chat(recipient, "Click on the administrator's name to reply.", type = MESSAGE_TYPE_ADMINPM) to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [msg]", type = MESSAGE_TYPE_ADMINPM) - admin_ticket_log(recipient, keywordparsedmsg, key_name_admin(src), null, "purple") + admin_ticket_log(recipient, keywordparsedmsg, key_name_admin(src), null, "purple", safeSenderLogged = TRUE) //always play non-admin recipients the adminhelp sound SEND_SOUND(recipient, sound('sound/effects/adminhelp.ogg')) @@ -227,10 +227,10 @@ to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.", type = MESSAGE_TYPE_ADMINPM) return - if(irc) - log_admin_private("PM: [key_name(src)]->IRC: [rawmsg]") + if(external) + log_admin_private("PM: [key_name(src)]->External: [rawmsg]") for(var/client/X in GLOB.admins) - to_chat(X, "PM: [key_name(src, X, 0)]->IRC: [keywordparsedmsg]") + to_chat(X, "PM: [key_name(src, X, 0)]->External: [keywordparsedmsg]") else window_flash(recipient, ignorepref = TRUE) log_admin_private("PM: [key_name(src)]->[key_name(recipient)]: [rawmsg]") @@ -241,34 +241,34 @@ -#define IRC_AHELP_USAGE "Usage: ticket " -/proc/IrcPm(target,msg,sender) +#define TGS_AHELP_USAGE "Usage: ticket " +/proc/TgsPm(target,msg,sender) target = ckey(target) var/client/C = GLOB.directory[target] var/datum/admin_help/ticket = C ? C.current_ticket : GLOB.ahelp_tickets.CKey2ActiveTicket(target) var/compliant_msg = trim(lowertext(msg)) - var/irc_tagged = "[sender](IRC)" + var/tgs_tagged = "[sender](TGS/External)" var/list/splits = splittext(compliant_msg, " ") if(splits.len && splits[1] == "ticket") if(splits.len < 2) - return IRC_AHELP_USAGE + return TGS_AHELP_USAGE switch(splits[2]) if("close") if(ticket) - ticket.Close(irc_tagged) + ticket.Close(tgs_tagged) return "Ticket #[ticket.id] successfully closed" if("resolve") if(ticket) - ticket.Resolve(irc_tagged) + ticket.Resolve(tgs_tagged) return "Ticket #[ticket.id] successfully resolved" if("icissue") if(ticket) - ticket.ICIssue(irc_tagged) + ticket.ICIssue(tgs_tagged) return "Ticket #[ticket.id] successfully marked as IC issue" if("reject") if(ticket) - ticket.Reject(irc_tagged) + ticket.Reject(tgs_tagged) return "Ticket #[ticket.id] successfully rejected" if("reopen") if(ticket) @@ -277,7 +277,7 @@ if(!isnull(fail)) fail = text2num(splits[3]) if(isnull(fail)) - return "Error: No/Invalid ticket id specified. [IRC_AHELP_USAGE]" + return "Error: No/Invalid ticket id specified. [TGS_AHELP_USAGE]" var/datum/admin_help/AH = GLOB.ahelp_tickets.TicketByID(fail) if(!AH) return "Error: Ticket #[fail] not found" @@ -299,41 +299,41 @@ . += "#[AH.id]" return else - return IRC_AHELP_USAGE + return TGS_AHELP_USAGE return "Error: Ticket could not be found" var/static/stealthkey - var/adminname = CONFIG_GET(flag/show_irc_name) ? irc_tagged : "Administrator" + var/adminname = CONFIG_GET(flag/show_irc_name) ? tgs_tagged : "Administrator" if(!C) return "Error: No client" if(!stealthkey) - stealthkey = GenIrcStealthKey() + stealthkey = GenTgsStealthKey() msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN)) if(!msg) return "Error: No message" - message_admins("IRC message from [sender] to [key_name_admin(C)] : [msg]") - log_admin_private("IRC PM: [sender] -> [key_name(C)] : [msg]") + message_admins("External message from [sender] to [key_name_admin(C)] : [msg]") + log_admin_private("External PM: [sender] -> [key_name(C)] : [msg]") msg = emoji_parse(msg) to_chat(C, "-- Administrator private message --", type = MESSAGE_TYPE_ADMINPM) - to_chat(C, "Admin PM from-[adminname]: [msg]", type = MESSAGE_TYPE_ADMINPM) + to_chat(C, "Admin PM from-[adminname]: [msg]", allow_linkify = TRUE, type = MESSAGE_TYPE_ADMINPM) to_chat(C, "Click on the administrator's name to reply.", type = MESSAGE_TYPE_ADMINPM) - admin_ticket_log(C, msg, adminname, null, "cyan") + admin_ticket_log(C, msg, adminname, null, "cyan", isSenderAdmin = TRUE, safeSenderLogged = TRUE) window_flash(C, ignorepref = TRUE) //always play non-admin recipients the adminhelp sound SEND_SOUND(C, 'sound/effects/adminhelp.ogg') - C.ircreplyamount = IRCREPLYCOUNT + C.externalreplyamount = EXTERNALREPLYCOUNT return "Message Successful" -/proc/GenIrcStealthKey() +/proc/GenTgsStealthKey() var/num = (rand(0,1000)) var/i = 0 while(i == 0) @@ -346,4 +346,4 @@ GLOB.stealthminID["IRCKEY"] = stealth return stealth -#undef IRCREPLYCOUNT +#undef EXTERNALREPLYCOUNT diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 38679d7d34215..19c4ec47db8e9 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -17,6 +17,6 @@ msg = keywords_lookup(msg) var/custom_asay_color = (CONFIG_GET(flag/allow_admin_asaycolor) && prefs.asaycolor) ? "" : "" msg = "ADMIN: [key_name(usr, 1)] [ADMIN_FLW(mob)]: [custom_asay_color][msg][custom_asay_color ? "":null]" - to_chat(GLOB.admins, msg, type = MESSAGE_TYPE_ADMINCHAT) + to_chat(GLOB.admins, msg, allow_linkify = TRUE, type = MESSAGE_TYPE_ADMINCHAT) SSblackbox.record_feedback("tally", "admin_verb", 1, "Asay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index 48434dba49ee4..0a4abfd033111 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -21,6 +21,13 @@ if(pipe.z && (!pipe.nodes || !pipe.nodes.len || (null in pipe.nodes))) to_chat(usr, "Unconnected [pipe.name] located at [ADMIN_VERBOSEJMP(pipe)]") + //Erroneous Connections, e.g. duplicate pipes + //This uses pipeline_expansion(), so you can detect some atmos machineries causing problems at pipenet code. + for (var/obj/machinery/atmospherics/AM in GLOB.machines) + for (var/obj/machinery/atmospherics/AMT in AM.pipeline_expansion()) + if (!(AM in AMT.pipeline_expansion())) + to_chat(usr, "Errorneous connections around [AM.name]. Duplicate or rogue pipes suspected at or around [ADMIN_VERBOSEJMP(AM)]") + /client/proc/powerdebug() set category = "Mapping" set name = "Check Power" diff --git a/code/modules/admin/verbs/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm index 1e3f24e67a746..fcbbca7324051 100644 --- a/code/modules/admin/verbs/borgpanel.dm +++ b/code/modules/admin/verbs/borgpanel.dm @@ -41,6 +41,7 @@ if(!ui) ui = new(user, src, "BorgPanel", "Borging Panel") ui.open() + ui.set_autoupdate(TRUE) /datum/borgpanel/ui_data(mob/user) . = list() @@ -56,7 +57,7 @@ .["upgrades"] = list() for (var/upgradetype in subtypesof(/obj/item/borg/upgrade)-/obj/item/borg/upgrade/hypospray) //hypospray is a dummy parent for hypospray upgrades var/obj/item/borg/upgrade/upgrade = upgradetype - if (initial(upgrade.module_type) && !istype(borg.module, initial(upgrade.module_type))) // Upgrade requires a different module + if (initial(upgrade.module_type) && !is_type_in_list(borg.module, initial(upgrade.module_type))) // Upgrade requires a different module continue var/installed = FALSE if (locate(upgradetype) in borg) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 995620cc4a994..054e9c229734c 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -214,7 +214,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that id.forceMove(W) W.update_icon() else - H.equip_to_slot(id,SLOT_WEAR_ID) + H.equip_to_slot(id,ITEM_SLOT_ID) else alert("Invalid mob") @@ -521,21 +521,23 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that message_admins("[key_name_admin(usr)] changed the equipment of [ADMIN_LOOKUPFLW(H)] to [dresscode].") /client/proc/robust_dress_shop() - var/list/outfits = list("Naked","Custom","As Job...") - var/list/paths = subtypesof(/datum/outfit) - typesof(/datum/outfit/job) + var/list/outfits = list("Naked","Custom","As Job...","As Job(Plasmaman)...", "Debug") + var/list/paths = subtypesof(/datum/outfit) - typesof(/datum/outfit/job) - typesof(/datum/outfit/plasmaman) - typesof(/datum/outfit/debug) for(var/path in paths) var/datum/outfit/O = path //not much to initalize here but whatever if(initial(O.can_be_admin_equipped)) outfits[initial(O.name)] = path var/dresscode = input("Select outfit", "Robust quick dress shop") as null|anything in outfits - if (isnull(dresscode)) + if(isnull(dresscode)) return - if (outfits[dresscode]) + if(outfits[dresscode]) dresscode = outfits[dresscode] - if (dresscode == "As Job...") + + + if(dresscode == "As Job...") var/list/job_paths = subtypesof(/datum/outfit/job) var/list/job_outfits = list() for(var/path in job_paths) @@ -548,7 +550,25 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(isnull(dresscode)) return - if (dresscode == "Custom") + if(dresscode == "As Job(Plasmaman)...") + var/list/job_paths = subtypesof(/datum/outfit/plasmaman) + var/list/job_outfits = list() + for(var/path in job_paths) + var/datum/outfit/O = path + if(initial(O.can_be_admin_equipped)) + job_outfits[initial(O.name)] = path + + dresscode = input("Select plasmaman equipment", "Robust quick dress shop") as null|anything in sortList(job_outfits) + dresscode = job_outfits[dresscode] + if(isnull(dresscode)) + return + + if(dresscode == "Debug") + dresscode = /datum/outfit/debug + if(isnull(dresscode)) + return + + if(dresscode == "Custom") var/list/custom_names = list() for(var/datum/outfit/D in GLOB.custom_outfits) custom_names[D.name] = D @@ -604,7 +624,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(Rad.anchored) if(!Rad.loaded_tank) var/obj/item/tank/internals/plasma/Plasma = new/obj/item/tank/internals/plasma(Rad) - Plasma.air_contents.set_moles(/datum/gas/plasma, 70) + Plasma.air_contents.set_moles(GAS_PLASMA, 70) Rad.drainratio = 0 Rad.loaded_tank = Plasma Plasma.forceMove(Rad) @@ -734,9 +754,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that exists[L.ruin_template] = landmark var/list/names = list() - names += "---- Space Ruins ----" + names += "---- Dynamic Levels ----" 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_DYNAMIC_LEVEL, /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) @@ -765,6 +785,22 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that else to_chat(src, "Failed to place [template.name].") +/client/proc/generate_ruin() + set category = "Debug" + set name = "Generate Ruin" + set desc = "Randomly generate a space ruin." + if (!holder) + return + var/ruin_size = input(src, "Ruin size (NxN) (Between 10 and 200)", "Ruin Size", 0) as num + if(ruin_size < 10 || ruin_size >= 200) + return + var/response = alert(src, "This will place the ruin at your current location.", "Spawn Ruin", "Spawn Ruin", "Cancel") + if (response == "Cancel") + return + var/border_size = (world.maxx - ruin_size) / 2 + generate_space_ruin(mob.x, mob.y, mob.z, border_size, border_size) + log_admin("[key_name(src)] randomly generated a space ruin at [COORD(mob)].") + /client/proc/clear_dynamic_transit() set category = "Debug" set name = "Clear Dynamic Turf Reservations" @@ -786,7 +822,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_DEBUG)) return - verbs -= /client/proc/fucky_wucky + remove_verb(/client/proc/fucky_wucky) message_admins("[key_name_admin(src)] did a fucky wucky.") log_admin("[key_name(src)] did a fucky wucky.") for(var/m in GLOB.player_list) @@ -798,7 +834,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that addtimer(CALLBACK(src, .proc/restore_fucky_wucky), 600) /client/proc/restore_fucky_wucky() - verbs += /client/proc/fucky_wucky + add_verb(/client/proc/fucky_wucky) /client/proc/toggle_medal_disable() set category = "Debug" @@ -882,13 +918,16 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_DEBUG)) return if(alert(usr, "Are you absolutely sure you want to reload the configuration from the default path on the disk, wiping any in-round modificatoins?", "Really reset?", "No", "Yes") == "Yes") + //Reload the config config.admin_reload() + //Reload badges + load_badge_ranks() /client/proc/modify_canister_gas(obj/machinery/portable_atmospherics/canister/C) if(!check_rights(R_DEBUG) || !C) return - var/gas_to_add = input(usr, "Choose a gas to modify.", "Choose a gas.") as null|anything in (subtypesof(/datum/gas) - /datum/gas/unobtanium) //nice try + var/gas_to_add = input(usr, "Choose a gas to modify.", "Choose a gas.") as null|anything in GLOB.gas_data.ids var/amount = input(usr, "Choose the amount of moles.", "Choose the amount.", 0) as num var/temp = input(usr, "Choose the temperature (Kelvin).", "Choose the temp (K).", 0) as num @@ -900,3 +939,71 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that message_admins("[key_name_admin(src)] modified \the [C.name] at [AREACOORD(C)] - Gas: [gas_to_add], Moles: [amount], Temp: [temp].") log_admin("[key_name_admin(src)] modified \the [C.name] at [AREACOORD(C)] - Gas: [gas_to_add], Moles: [amount], Temp: [temp].") +/client/proc/give_all_spells() + set category = "Debug" + set name = "Give all spells" + if(!check_rights(R_DEBUG)) + return + for(var/type in GLOB.spells) + var/obj/effect/proc_holder/spell/spell = new type + mob.AddSpell(spell) + +/// A debug verb to check the sources of currently running timers +/client/proc/check_timer_sources() + set category = "Debug" + set name = "Check Timer Sources" + set desc = "Checks the sources of the running timers" + if (!check_rights(R_DEBUG)) + return + + var/bucket_list_output = generate_timer_source_output(SStimer.bucket_list) + var/second_queue = generate_timer_source_output(SStimer.second_queue) + + usr << browse({" +

    bucket_list

    + [bucket_list_output] + +

    second_queue

    + [second_queue] + "}, "window=check_timer_sources;size=700x700") + +/proc/generate_timer_source_output(list/datum/timedevent/events) + var/list/per_source = list() + + // Collate all events and figure out what sources are creating the most + for (var/_event in events) + if (!_event) + continue + var/datum/timedevent/event = _event + + do + if (event.source) + if (per_source[event.source] == null) + per_source[event.source] = 1 + else + per_source[event.source] += 1 + event = event.next + while (event && event != _event) + + // Now, sort them in order + var/list/sorted = list() + for (var/source in per_source) + sorted += list(list("source" = source, "count" = per_source[source])) + sorted = sortTim(sorted, .proc/cmp_timer_data) + + // Now that everything is sorted, compile them into an HTML output + var/output = "" + + for (var/_timer_data in sorted) + var/list/timer_data = _timer_data + output += {" + + + "} + + output += "
    [timer_data["source"]][timer_data["count"]]
    " + + return output + +/proc/cmp_timer_data(list/a, list/b) + return b["count"] - a["count"] diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index fd4374a7724d6..7c65da13d5acb 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -14,9 +14,7 @@ var/largest_click_time = 0 var/mob/largest_move_mob = null var/mob/largest_click_mob = null - for(var/mob/M in world) - if(!M.client) - continue + for(var/mob/M in GLOB.player_list) if(M.next_move >= largest_move_time) largest_move_mob = M if(M.next_move > world.time) @@ -32,6 +30,7 @@ log_admin("DEBUG: [key_name(M)] next_move = [M.next_move] lastDblClick = [M.next_click] world.time = [world.time]") M.next_move = 1 M.next_click = 0 + message_admins("[ADMIN_LOOKUPFLW(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [DisplayTimeText(largest_move_time)]!") message_admins("[ADMIN_LOOKUPFLW(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [DisplayTimeText(largest_click_time)]!") message_admins("world.time = [world.time]") @@ -50,12 +49,16 @@ output += "  ERROR
    " continue for (var/filter in fqs.devices) - var/list/f = fqs.devices[filter] - if (!f) + var/list/filtered = fqs.devices[filter] + if (!filtered) output += "  [filter]: ERROR
    " continue - output += "  [filter]: [f.len]
    " - for (var/device in f) + output += "  [filter]: [filtered.len]
    " + for(var/datum/weakref/device_ref as anything in filtered) + var/atom/device = device_ref.resolve() + if(!device) + filtered -= device_ref + continue if (istype(device, /atom)) var/atom/A = device output += "    [device] ([AREACOORD(A)])
    " diff --git a/code/modules/admin/verbs/ghost_pool_protection.dm b/code/modules/admin/verbs/ghost_pool_protection.dm new file mode 100644 index 0000000000000..aa4724d1cfdf8 --- /dev/null +++ b/code/modules/admin/verbs/ghost_pool_protection.dm @@ -0,0 +1,93 @@ +//very similar to centcom_podlauncher in terms of how this is coded, so i kept a lot of comments from it + +/client/proc/ghost_pool_protection() //Creates a verb for admins to open up the ui + set name = "Ghost Pool Protection" + set desc = "Choose which ways people can get into the round, or just clear it out completely for admin events." + set category = "Adminbus" + var/datum/ghost_pool_menu/tgui = new(usr)//create the datum + tgui.ui_interact(usr)//datum has a tgui component, here we open the window + +/datum/ghost_pool_menu + var/client/holder //client of whoever is using this datum + + //when submitted, what the pool flags will be set to + var/new_role_flags = ALL + + //EVERY TYPE OF WAY SOMEONE IS GETTING BACK INTO THE ROUND! + //these are the same comments as the ones in admin.dm defines, please update those if you change them here + /* + var/events_or_midrounds = TRUE //ie fugitives, space dragon, etc. also includes dynamic midrounds as it's the same deal + var/spawners = TRUE //ie ashwalkers, free golems, beach bums + var/station_sentience = TRUE //ie posibrains, mind monkeys, sentience potion, etc. + var/minigames = TRUE //ie mafia, ctf + var/misc = TRUE //oddities like split personality and any animal ones like spiders, xenos + */ + +/datum/ghost_pool_menu/New(user)//user can either be a client or a mob due to byondcode(tm) + if (istype(user, /client)) + var/client/user_client = user + holder = user_client //if its a client, assign it to holder + else + var/mob/user_mob = user + holder = user_mob.client //if its a mob, assign the mob's client to holder + new_role_flags = GLOB.ghost_role_flags + +/datum/ghost_pool_menu/ui_state(mob/user) + return GLOB.admin_state + +/datum/ghost_pool_menu/ui_close() + qdel(src) + +/datum/ghost_pool_menu/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "GhostPoolProtection") + ui.open() + +/datum/ghost_pool_menu/ui_data(mob/user) + var/list/data = list() + data["events_or_midrounds"] = (new_role_flags & GHOSTROLE_MIDROUND_EVENT) + data["spawners"] = (new_role_flags & GHOSTROLE_SPAWNER) + data["station_sentience"] = (new_role_flags & GHOSTROLE_STATION_SENTIENCE) + data["silicons"] = (new_role_flags & GHOSTROLE_SILICONS) + data["minigames"] = (new_role_flags & GHOSTROLE_MINIGAME) + return data + +/datum/ghost_pool_menu/ui_act(action, params) + . = ..() + if(.) + return + switch(action) + if("toggle_events_or_midrounds") + new_role_flags ^= GHOSTROLE_MIDROUND_EVENT + . = TRUE + if("toggle_spawners") + new_role_flags ^= GHOSTROLE_SPAWNER + . = TRUE + if("toggle_station_sentience") + new_role_flags ^= GHOSTROLE_STATION_SENTIENCE + . = TRUE + if("toggle_silicons") + new_role_flags ^= GHOSTROLE_SILICONS + . = TRUE + if("toggle_minigames") + new_role_flags ^= GHOSTROLE_MINIGAME + . = TRUE + if("all_roles") + new_role_flags = ALL + . = TRUE + if("no_roles") + new_role_flags = NONE + . = TRUE + if("apply_settings") + to_chat(usr, "Settings Applied!") + var/msg + switch(new_role_flags) + if(ALL) + msg = "enabled all of" + if(NONE) + msg = "disabled all of" + else + msg = "modified" + message_admins("[key_name_admin(holder)] has [msg] this round's allowed ghost roles.") + GLOB.ghost_role_flags = new_role_flags diff --git a/code/modules/admin/verbs/individual_logging.dm b/code/modules/admin/verbs/individual_logging.dm index 954b5ccee6058..9ad07ac1b2573 100644 --- a/code/modules/admin/verbs/individual_logging.dm +++ b/code/modules/admin/verbs/individual_logging.dm @@ -5,7 +5,7 @@ var/ntype = text2num(type) //Add client links - var/dat = "" + var/list/dat = list() if(M.client) dat += "

    Client

    " dat += "
    " @@ -46,22 +46,27 @@ var/log_source = M.logging; if(source == LOGSRC_CLIENT && M.client) //if client doesn't exist just fall back to the mob log log_source = M.client.player_details.logging //should exist, if it doesn't that's a bug, don't check for it not existing - + var/list/concatenated_logs = list() for(var/log_type in log_source) var/nlog_type = text2num(log_type) if(nlog_type & ntype) - var/list/reversed = log_source[log_type] - if(islist(reversed)) - reversed = reverseRange(reversed.Copy()) - for(var/entry in reversed) - dat += "[entry]
    [reversed[entry]]

    " - dat += "
    " + var/list/all_the_entrys = log_source[log_type] + for(var/entry in all_the_entrys) + concatenated_logs += "[entry]
    [all_the_entrys[entry]]" + if(length(concatenated_logs)) + sortTim(concatenated_logs, cmp = /proc/cmp_text_dsc) //Sort by timestamp. + dat += "" + dat += concatenated_logs.Join("
    ") + dat += "
    " - usr << browse(dat, "window=invidual_logging_[key_name(M)];size=600x480") + var/datum/browser/popup = new(usr, "invidual_logging_[key_name(M)]", "Individual Logs", 600, 600) + popup.set_content(dat.Join()) + popup.open() /proc/individual_logging_panel_link(mob/M, log_type, log_src, label, selected_src, selected_type) var/slabel = label if(selected_type == log_type && selected_src == log_src) slabel = "\[[label]\]" - + //This is necessary because num2text drops digits and rounds on big numbers. If more defines get added in the future it could break again. + log_type = num2text(log_type, MAX_BITFLAG_DIGITS) return "[slabel]" diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm index 0e687c8b045ea..82db4dc885ad7 100644 --- a/code/modules/admin/verbs/map_template_loadverb.dm +++ b/code/modules/admin/verbs/map_template_loadverb.dm @@ -37,11 +37,14 @@ to_chat(src, "Filename must end in '.dmm': [map]") return var/datum/map_template/M + var/type switch(alert(src, "What kind of map is this?", "Map type", "Normal", "Shuttle", "Cancel")) if("Normal") - M = new /datum/map_template(map, "[map]", TRUE) + type = "Normal" + M = new /datum/map_template(map, "[map] - Uploaded by [ckey] at [time2text(world.timeofday,"YYYY-MM-DD hh:mm:ss")]", TRUE) if("Shuttle") - M = new /datum/map_template/shuttle(map, "[map]", TRUE) + type = "Shuttle" + M = new /datum/map_template/shuttle(map, "[map] - Uploaded by [ckey] at [time2text(world.timeofday,"YYYY-MM-DD hh:mm:ss")]", TRUE, copytext("[map]",1, -4)) else return if(!M.cached_map) @@ -61,7 +64,11 @@ else alert(src, "The map failed validation and cannot be loaded.", "Map Errors", "Oh Darn") return - - SSmapping.map_templates[M.name] = M - message_admins("[key_name_admin(src)] has uploaded a map template '[map]' ([M.width]x[M.height])[report_link].") + switch(type) + if("Normal") + SSmapping.map_templates[M.name] = M + if("Shuttle") + var/datum/map_template/shuttle/S = M + SSmapping.shuttle_templates[S.shuttle_id] = S + message_admins("[key_name_admin(src)] has uploaded a [type] map template '[map]' ([M.width]x[M.height])[report_link].") to_chat(src, "Map template '[map]' ready to place ([M.width]x[M.height])") diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index a5c164a736d56..ad172f4e76774 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -84,9 +84,8 @@ GLOBAL_PROTECT(admin_verbs_debug_mapping) for(var/turf/T in C.can_see()) seen[T]++ for(var/turf/T in seen) - T.maptext = "[seen[T]]" + T.maptext = MAPTEXT("[seen[T]]") SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Camera Range") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Camera Range") #ifdef TESTING GLOBAL_LIST_EMPTY(dirty_vars) @@ -157,7 +156,7 @@ GLOBAL_LIST_EMPTY(dirty_vars) if(intercom_range_display_status) for(var/obj/item/radio/intercom/I in world) - for(var/turf/T in orange(7,I)) + for(var/turf/T as() in RANGE_TURFS(7,I)) var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T) if (!(F in view(7,I.loc))) qdel(F) @@ -205,15 +204,15 @@ GLOBAL_LIST_EMPTY(dirty_vars) set name = "Debug verbs - Enable" if(!check_rights(R_DEBUG)) return - verbs -= /client/proc/enable_debug_verbs - verbs.Add(/client/proc/disable_debug_verbs, GLOB.admin_verbs_debug_mapping) + remove_verb(/client/proc/enable_debug_verbs) + add_verb(list(/client/proc/disable_debug_verbs) + GLOB.admin_verbs_debug_mapping) SSblackbox.record_feedback("tally", "admin_verb", 1, "Enable Debug Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/disable_debug_verbs() set category = "Debug" set name = "Debug verbs - Disable" - verbs.Remove(/client/proc/disable_debug_verbs, GLOB.admin_verbs_debug_mapping) - verbs += /client/proc/enable_debug_verbs + remove_verb(list(/client/proc/disable_debug_verbs) + GLOB.admin_verbs_debug_mapping) + add_verb(/client/proc/enable_debug_verbs) SSblackbox.record_feedback("tally", "admin_verb", 1, "Disable Debug Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/count_objects_on_z_level() @@ -239,18 +238,19 @@ GLOBAL_LIST_EMPTY(dirty_vars) var/list/atom/atom_list = list() - for(var/atom/A in world) - if(istype(A,type_path)) - var/atom/B = A - while(!(isturf(B.loc))) + for(var/area/T as() in get_areas(/area, num_level)) + for(var/atom/A in T) + if(istype(A, type_path)) + var/atom/B = A + while(!(isturf(B.loc))) if(B?.loc) B = B.loc else break - if(B) - if(B.z == num_level) + if(B) count++ atom_list += A + CHECK_TICK to_chat(world, "There are [count] objects of type [type_path] on z-level [num_level]") SSblackbox.record_feedback("tally", "admin_verb", 1, "Count Objects Zlevel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/maprotation.dm b/code/modules/admin/verbs/maprotation.dm index 91e7045b9fa7d..19c509857930d 100644 --- a/code/modules/admin/verbs/maprotation.dm +++ b/code/modules/admin/verbs/maprotation.dm @@ -12,7 +12,7 @@ /client/proc/adminchangemap() set category = "Server" set name = "Change Map" - + var/list/maprotatechoices = list() for (var/map in config.maplist) var/datum/map_config/VM = config.maplist[map] @@ -43,3 +43,28 @@ log_admin("[key_name(usr)] is changing the map to [VM.map_name]") if (SSmapping.changemap(VM) == 0) message_admins("[key_name_admin(usr)] has changed the map to [VM.map_name]") + +/client/proc/forcemapconfig() + set category = "Debug" + set name = "Debug Force Map" + + //Locked behind permissions since it needs serious protection. + if(!check_rights(R_DEBUG) || !check_rights(R_SERVER) || !check_rights(R_PERMISSIONS)) + to_chat(src, "Insufficient rights (Requires debug, server and permissions).") + return + + var/json_settings = input(usr, "Enter map json name:", "Map Json Name", "") as text|null + + if(!json_settings) + return + + var/datum/map_config/config = new + if(!config.LoadConfig("_maps/[json_settings].json", TRUE)) + qdel(config) + to_chat(usr, "Map json failed to load!") + return + SSticker.maprotatechecked = 1 + message_admins("[key_name_admin(usr)] is changing the map to [config.map_name]") + log_admin("[key_name(usr)] is changing the map to [config.map_name]") + if (SSmapping.changemap(config) == 0) + message_admins("[key_name_admin(usr)] has changed the map to [config.map_name]") diff --git a/code/modules/admin/verbs/mentors_edit.dm b/code/modules/admin/verbs/mentors_edit.dm index 316ab40d55c09..43da6121095b4 100644 --- a/code/modules/admin/verbs/mentors_edit.dm +++ b/code/modules/admin/verbs/mentors_edit.dm @@ -4,68 +4,70 @@ also probably less secure, but honestly dude its mentors, not actual dangerous perms ******************************************/ /client/proc/edit_mentors() - set category = "Admin" - set name = "Mentor Panel" - set desc = "Edit mentors" + set category = "Admin" + set name = "Mentor Panel" + set desc = "Edit mentors" - if(!check_rights(R_PERMISSIONS)) - return - if(!SSdbcore.IsConnected()) - to_chat(src, "Failed to establish database connection.") - return + if(!check_rights(R_PERMISSIONS)) + return + if(!SSdbcore.IsConnected()) + to_chat(src, "Failed to establish database connection.") + return - var/html = "

    Mentor Panel

    \n" - html += "Add a Mentor\n" - html += "\n" - html += "\n" + var/html = "

    Mentor Panel

    \n" + html += "Add a Mentor\n" + html += "
    Mentor CkeyRemove
    \n" + html += "\n" - var/datum/DBQuery/query_mentor_list = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("mentor")]") - if(!query_mentor_list.warn_execute()) - to_chat(src, "Unable to pull the mentor list from the database.") - qdel(query_mentor_list) - query_mentor_list.Execute() - while(query_mentor_list.NextRow()) - html += "\n" + var/datum/DBQuery/query_mentor_list = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("mentor")]") + if(!query_mentor_list.warn_execute()) + to_chat(src, "Unable to pull the mentor list from the database.") + qdel(query_mentor_list) + query_mentor_list.Execute() + while(query_mentor_list.NextRow()) + html += "\n" - html += "
    Mentor CkeyRemove
    [query_mentor_list.item[1]]X
    [query_mentor_list.item[1]]X
    " + html += "" - usr << browse("[html]","window=editmentors;size=1000x650") - qdel(query_mentor_list) + usr << browse("[html]","window=editmentors;size=1000x650") + qdel(query_mentor_list) /client/Topic(href, href_list) - ..() - if(href_list["mentor_edit"]) - if(!check_rights(R_PERMISSIONS)) - message_admins("[key_name_admin(usr)] attempted to edit mentor permissions without sufficient rights.") - log_admin("[key_name(usr)] attempted to edit mentor permissions without sufficient rights.") - return - if(IsAdminAdvancedProcCall()) - to_chat(usr, "Mentor Edit blocked: Advanced ProcCall detected.") - return + ..() + if(href_list["mentor_edit"]) + if(!check_rights(R_PERMISSIONS)) + message_admins("[key_name_admin(usr)] attempted to edit mentor permissions without sufficient rights.") + log_admin("[key_name(usr)] attempted to edit mentor permissions without sufficient rights.") + return + if(IsAdminAdvancedProcCall()) + to_chat(usr, "Mentor Edit blocked: Advanced ProcCall detected.") + return - if(href_list["mentor_edit"] == "add") - var/newguy = input("Enter the key of the mentor you wish to add.", "") - var/datum/DBQuery/query_add_mentor = SSdbcore.NewQuery( - "INSERT INTO [format_table_name("mentor")] (ckey) VALUES (:newguy)", - list("newguy" = newguy) - ) - if(!query_add_mentor.warn_execute()) - qdel(query_add_mentor) - return - message_admins("[key_name(usr)] made [newguy] a mentor.") - log_admin("[key_name(usr)] made [newguy] a mentor.") - qdel(query_add_mentor) - return + if(href_list["mentor_edit"] == "add") + var/newguy = input("Enter the key of the mentor you wish to add.", "") + var/datum/DBQuery/query_add_mentor = SSdbcore.NewQuery( + "INSERT INTO [format_table_name("mentor")] (ckey) VALUES (:newguy)", + list("newguy" = newguy) + ) + if(!query_add_mentor.warn_execute()) + qdel(query_add_mentor) + return + message_admins("[key_name(usr)] made [newguy] a mentor.") + log_admin("[key_name(usr)] made [newguy] a mentor.") + qdel(query_add_mentor) + load_mentors() + return - if(href_list["mentor_edit"] == "remove") - var/removed_mentor = href_list["mentor_ckey"] - var/datum/DBQuery/query_remove_mentor = SSdbcore.NewQuery( - "DELETE FROM [format_table_name("mentor")] WHERE ckey = :removed_mentor", - list("removed_mentor" = removed_mentor) - ) - if(!query_remove_mentor.warn_execute()) - qdel(query_remove_mentor) - return - message_admins("[key_name(usr)] de-mentored [href_list["mentor_ckey"]]") - log_admin("[key_name(usr)] de-mentored [href_list["mentor_ckey"]]") - qdel(query_remove_mentor) + if(href_list["mentor_edit"] == "remove") + var/removed_mentor = href_list["mentor_ckey"] + var/datum/DBQuery/query_remove_mentor = SSdbcore.NewQuery( + "DELETE FROM [format_table_name("mentor")] WHERE ckey = :removed_mentor", + list("removed_mentor" = removed_mentor) + ) + if(!query_remove_mentor.warn_execute()) + qdel(query_remove_mentor) + return + message_admins("[key_name(usr)] de-mentored [href_list["mentor_ckey"]]") + log_admin("[key_name(usr)] de-mentored [href_list["mentor_ckey"]]") + qdel(query_remove_mentor) + load_mentors() diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 2f68988ce015b..089a3f97095f2 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -43,7 +43,7 @@ return !is_banned_from(applicant.ckey, list(targetrole, ROLE_SYNDICATE)) -/datum/admins/proc/makeTraitors() +/datum/admins/proc/makeTraitors(maxCount = 3) var/datum/game_mode/traitor/temp = new if(CONFIG_GET(flag/protect_roles_from_antagonist)) @@ -65,20 +65,20 @@ candidates += applicant if(candidates.len) - var/numTraitors = min(candidates.len, 3) + var/numTraitors = min(candidates.len, maxCount) for(var/i = 0, iFor youtube-dl shortcuts like ytsearch: please use the appropriate full url from the website.") return var/shell_scrubbed_input = shell_url_scrub(web_sound_input) - var/list/output = world.shelleo("[ytdl] --format \"bestaudio\[ext=mp3]/best\[ext=mp4]\[height<=360]/bestaudio\[ext=m4a]/bestaudio\[ext=aac]\" --dump-single-json --no-playlist -- \"[shell_scrubbed_input]\"") + var/list/output = world.shelleo("[ytdl] --geo-bypass --format \"bestaudio\[ext=mp3]/best\[ext=mp4]\[height<=360]/bestaudio\[ext=m4a]/bestaudio\[ext=aac]\" --dump-single-json --no-playlist -- \"[shell_scrubbed_input]\"") var/errorlevel = output[SHELLEO_ERRORLEVEL] var/stdout = output[SHELLEO_STDOUT] var/stderr = output[SHELLEO_STDERR] @@ -95,12 +95,12 @@ webpage_url = "[title]" music_extra_data["start"] = data["start_time"] music_extra_data["end"] = data["end_time"] - music_extra_data["link"] = data["webpage_url"] - music_extra_data["title"] = data["title"] var/res = alert(usr, "Show the title of and link to this song to the players?\n[title]",, "No", "Yes", "Cancel") switch(res) if("Yes") + music_extra_data["title"] = data["title"] + music_extra_data["link"] = data["webpage_url"] to_chat(world, "An admin played: [webpage_url]") if("Cancel") return diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index 445de4c40f3b5..c334fe6ec880b 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -29,6 +29,10 @@ set name = "Release Obj" set category = "Object" //usr.loc = get_turf(usr) + + if(isnull(usr.control_object)) + to_chat(usr, "You do not seem to be possessing an object!") + return if(usr.control_object && usr.name_archive) //if you have a name archived and if you are actually relassing an object usr.real_name = usr.name_archive @@ -48,6 +52,6 @@ set desc = "Give this guy possess/release verbs" set category = "Debug" set name = "Give Possessing Verbs" - M.verbs += /proc/possess - M.verbs += /proc/release + M.add_verb(/proc/possess) + M.add_verb(/proc/release) SSblackbox.record_feedback("tally", "admin_verb", 1, "Give Possessing Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index f3da1954a9f87..f968f38c58d77 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -40,21 +40,18 @@ prayer_type = "SPIRITUAL PRAYER" var/msg_tmp = msg + GLOB.requests.pray(usr.client, msg, usr.job == "Chaplain") msg = "[icon2html(cross, GLOB.admins)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [msg]" - for(var/client/C in GLOB.admins) if(C.prefs.chat_toggles & CHAT_PRAYER) to_chat(C, msg) - if(C.prefs.toggles & SOUND_PRAYERS) - if(usr.job == "Chaplain") - SEND_SOUND(C, sound('sound/effects/pray.ogg')) to_chat(usr, "You pray to the gods: \"[msg_tmp]\"") SSblackbox.record_feedback("tally", "admin_verb", 1, "Prayer") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - //log_admin("HELP: [key_name(src)]: [msg]") /proc/CentCom_announce(text , mob/Sender) var/msg = copytext_char(sanitize(text), 1, MAX_MESSAGE_LEN) + GLOB.requests.message_centcom(Sender.client, msg) msg = "CENTCOM:[ADMIN_FULLMONTY(Sender)] [ADMIN_CENTCOM_REPLY(Sender)]: [msg]" to_chat(GLOB.admins, msg) for(var/obj/machinery/computer/communications/C in GLOB.machines) @@ -62,6 +59,7 @@ /proc/Syndicate_announce(text , mob/Sender) var/msg = copytext_char(sanitize(text), 1, MAX_MESSAGE_LEN) + GLOB.requests.message_syndicate(Sender.client, msg) msg = "SYNDICATE:[ADMIN_FULLMONTY(Sender)] [ADMIN_SYNDICATE_REPLY(Sender)]: [msg]" to_chat(GLOB.admins, msg) for(var/obj/machinery/computer/communications/C in GLOB.machines) @@ -69,6 +67,7 @@ /proc/Nuke_request(text , mob/Sender) var/msg = copytext_char(sanitize(text), 1, MAX_MESSAGE_LEN) + GLOB.requests.nuke_request(Sender.client, msg) msg = "NUKE CODE REQUEST:[ADMIN_FULLMONTY(Sender)] [ADMIN_CENTCOM_REPLY(Sender)] [ADMIN_SET_SD_CODE]: [msg]" to_chat(GLOB.admins, msg) for(var/obj/machinery/computer/communications/C in GLOB.machines) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index aa8628ef5372b..212d37bcb50c4 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -182,7 +182,7 @@ var/msg = capped_input(usr, "Message:", "Enter the text you wish to appear to everyone within view:") if (!msg) return - for(var/mob/M in view(range,A)) + for(var/mob/M as() in hearers(range,A)) to_chat(M, msg) log_admin("LocalNarrate: [key_name(usr)] at [AREACOORD(A)]: [msg]") @@ -424,7 +424,7 @@ Traitors and the like can also be revived with the previous role mostly intact. new_character.real_name = record_found.fields["name"] new_character.gender = record_found.fields["sex"] new_character.age = record_found.fields["age"] - new_character.hardset_dna(record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], new record_found.fields["species"], record_found.fields["features"]) + new_character.hardset_dna(record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], new record_found.fields["species"], record_found.fields["features"], null) else var/datum/preferences/A = new() A.copy_to(new_character) @@ -564,7 +564,7 @@ Traitors and the like can also be revived with the previous role mostly intact. var/announce_command_report = TRUE switch(confirm) if("Yes") - priority_announce(input, null, 'sound/ai/commandreport.ogg') + priority_announce(input, null, SSstation.announcer.get_rand_report_sound(), has_important_message = TRUE) announce_command_report = FALSE if("Cancel") return @@ -740,9 +740,13 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!check_rights(R_ADMIN)) return - var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No") - if(confirm != "Yes") - return + var/confirm = alert(src, "You sure?", "Confirm", "Yes", "Yes (No Recall)", "No") + switch(confirm) + if(null, "No") + return + if("Yes (No Recall)") + SSshuttle.adminEmergencyNoRecall = TRUE + SSshuttle.emergency.mode = SHUTTLE_IDLE SSshuttle.emergency.request() SSblackbox.record_feedback("tally", "admin_verb", 1, "Call Shuttle") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -761,6 +765,9 @@ Traitors and the like can also be revived with the previous role mostly intact. if(EMERGENCY_AT_LEAST_DOCKED) return + if(SSshuttle.adminEmergencyNoRecall) + SSshuttle.adminEmergencyNoRecall = FALSE + SSshuttle.emergency.cancel() SSblackbox.record_feedback("tally", "admin_verb", 1, "Cancel Shuttle") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] admin-recalled the emergency shuttle.") @@ -795,7 +802,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(notifyplayers == "Yes") to_chat(world, "Admin [usr.key] has forced the players to have completely random identities!") - to_chat(usr, "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet.") + to_chat(usr, "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet..") CONFIG_SET(flag/force_random_names, TRUE) SSblackbox.record_feedback("tally", "admin_verb", 1, "Make Everyone Random") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -808,10 +815,10 @@ Traitors and the like can also be revived with the previous role mostly intact. var/new_are = !CONFIG_GET(flag/allow_random_events) CONFIG_SET(flag/allow_random_events, new_are) if(new_are) - to_chat(usr, "Random events enabled") + to_chat(usr, "Random events enabled.") message_admins("Admin [key_name_admin(usr)] has enabled random events.") else - to_chat(usr, "Random events disabled") + to_chat(usr, "Random events disabled.") message_admins("Admin [key_name_admin(usr)] has disabled random events.") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Random Events", "[new_are ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -1065,7 +1072,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!check_rights(R_ADMIN) || !check_rights(R_FUN)) return - var/list/punishment_list = list(ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_ROD, ADMIN_PUNISHMENT_SUPPLYPOD_QUICK, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_FLOORCLUWNE, ADMIN_PUNISHMENT_CLUWNE, ADMIN_PUNISHMENT_IMMERSE) + var/list/punishment_list = list(ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_ROD, ADMIN_PUNISHMENT_SUPPLYPOD_QUICK, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_FLOORCLUWNE, ADMIN_PUNISHMENT_CLUWNE, ADMIN_PUNISHMENT_IMMERSE, ADMIN_PUNISHMENT_GHOST, ADMIN_PUNISHMENT_DEMOCRACY, ADMIN_PUNISHMENT_ANARCHY, ADMIN_PUNISHMENT_TOE, ADMIN_PUNISHMENT_TOEPLUS) if(istype(target, /mob/living/carbon)) punishment_list += ADMIN_PUNISHMENT_NUGGET var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in sortList(punishment_list) @@ -1112,7 +1119,7 @@ Traitors and the like can also be revived with the previous role mostly intact. alert("ERROR: Incorrect / improper path given.") return new delivery(pod) - new /obj/effect/DPtarget(get_turf(target), pod) + new /obj/effect/pod_landingzone(get_turf(target), pod) if(ADMIN_PUNISHMENT_SUPPLYPOD) var/datum/centcom_podlauncher/plaunch = new(usr) if(!holder) @@ -1124,7 +1131,6 @@ Traitors and the like can also be revived with the previous role mostly intact. plaunch.temp_pod.damage = 40//bring the mother fuckin ruckus plaunch.temp_pod.explosionSize = list(0,0,0,2) plaunch.temp_pod.effectStun = TRUE - plaunch.ui_interact(usr) return //We return here because punish_log() is handled by the centcom_podlauncher datum if(ADMIN_PUNISHMENT_MAZING) @@ -1159,6 +1165,38 @@ Traitors and the like can also be revived with the previous role mostly intact. if(ADMIN_PUNISHMENT_IMMERSE) immerse_player(target) + if(ADMIN_PUNISHMENT_GHOST) + if (target.key) + target.ghostize(FALSE,SENTIENCE_FORCE) + else + target.set_playable() + if(ADMIN_PUNISHMENT_TOE) + if(!ishuman(target)) + to_chat(usr, "Only humanoids can stub their toes!") + return + var/mob/living/carbon/human/H = target + to_chat(H, "You stub your toe on an invisible table!") + H.stub_toe(5) + if(ADMIN_PUNISHMENT_TOEPLUS) + if(!ishuman(target)) + to_chat(usr, "Only humanoids can stub their toes!") + return + ADD_TRAIT(target, TRAIT_ALWAYS_STUBS, "adminabuse") + + if(ADMIN_PUNISHMENT_DEMOCRACY) + target._AddComponent(list(/datum/component/deadchat_control, DEMOCRACY_MODE, list( + "up" = CALLBACK(GLOBAL_PROC, .proc/_step, target, NORTH), + "down" = CALLBACK(GLOBAL_PROC, .proc/_step, target, SOUTH), + "left" = CALLBACK(GLOBAL_PROC, .proc/_step, target, WEST), + "right" = CALLBACK(GLOBAL_PROC, .proc/_step, target, EAST)), 40)) + + if(ADMIN_PUNISHMENT_ANARCHY) + target._AddComponent(list(/datum/component/deadchat_control, ANARCHY_MODE, list( + "up" = CALLBACK(GLOBAL_PROC, .proc/_step, target, NORTH), + "down" = CALLBACK(GLOBAL_PROC, .proc/_step, target, SOUTH), + "left" = CALLBACK(GLOBAL_PROC, .proc/_step, target, WEST), + "right" = CALLBACK(GLOBAL_PROC, .proc/_step, target, EAST)), 10)) + punish_log(target, punishment) /client/proc/punish_log(var/whom, var/punishment) @@ -1197,22 +1235,17 @@ Traitors and the like can also be revived with the previous role mostly intact. msg += "
" src << browse(msg.Join(), "window=Player_playtime_check") -/datum/admins/proc/cmd_show_exp_panel(client/C) +/datum/admins/proc/cmd_show_exp_panel(client/client_to_check) if(!check_rights(R_ADMIN)) return - if(!C) + if(!client_to_check) to_chat(usr, "ERROR: Client not found.") return if(!CONFIG_GET(flag/use_exp_tracking)) to_chat(usr, "Tracking is disabled in the server configuration file.") return - var/list/body = list() - body += "Playtime for [C.key]
Playtime:" - body += C.get_exp_report() - body += "Toggle Exempt status" - body += "" - usr << browse(body.Join(), "window=playerplaytime[C.ckey];size=550x615") + new /datum/job_report_menu(client_to_check, usr) /datum/admins/proc/toggle_exempt_status(client/C) if(!check_rights(R_ADMIN)) @@ -1239,6 +1272,50 @@ Traitors and the like can also be revived with the previous role mostly intact. 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/available_traits = list() + + switch(add_or_remove) + if("Add") + for(var/key in GLOB.traits_by_type) + if(istype(D,key)) + available_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 + available_traits[name] = trait + + var/chosen_trait = input("Select trait to modify", "Trait") as null|anything in available_traits + if(!chosen_trait) + return + chosen_trait = available_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 D.status_traits[chosen_trait] + if(!source) + return + REMOVE_TRAIT(D,chosen_trait,source) + /client/proc/spawnhuman() set name = "Spawn human" set desc = "Spawns a mindless human" diff --git a/code/modules/admin/verbs/requests.dm b/code/modules/admin/verbs/requests.dm new file mode 100644 index 0000000000000..80894c2398be7 --- /dev/null +++ b/code/modules/admin/verbs/requests.dm @@ -0,0 +1,7 @@ +/// Verb for opening the requests manager panel +/client/proc/requests() + set name = "Requests Manager" + set desc = "Open the request manager panel to view all requests during this round" + set category = "Admin" + SSblackbox.record_feedback("tally", "admin_verb", 1, "Request Manager") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + GLOB.requests.ui_interact(usr) \ No newline at end of file diff --git a/code/modules/admin/verbs/shuttlepanel.dm b/code/modules/admin/verbs/shuttlepanel.dm index f6ced5da13e74..0eb086c653c7f 100644 --- a/code/modules/admin/verbs/shuttlepanel.dm +++ b/code/modules/admin/verbs/shuttlepanel.dm @@ -48,6 +48,11 @@ if(options[selection]) request(options[selection]) + //Remove shuttle object + if(SSorbits.assoc_shuttles.Find(options[selection])) + //Removing from the list is handled by deleting the shuttle + qdel(SSorbits.assoc_shuttles[options[selection]]) + /obj/docking_port/mobile/emergency/admin_fly_shuttle(mob/user) return // use the existing verbs for this diff --git a/code/modules/admin/view_variables/filterrific.dm b/code/modules/admin/view_variables/filterrific.dm new file mode 100644 index 0000000000000..9d6b4834e5332 --- /dev/null +++ b/code/modules/admin/view_variables/filterrific.dm @@ -0,0 +1,98 @@ +/datum/filter_editor + var/atom/target + +/datum/filter_editor/New(atom/target) + src.target = target + +/datum/filter_editor/ui_state(mob/user) + return GLOB.admin_state + +/datum/filter_editor/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Filteriffic") + ui.open() + +/datum/filter_editor/ui_static_data(mob/user) + var/list/data = list() + data["filter_info"] = GLOB.master_filter_info + return data + +/datum/filter_editor/ui_data() + var/list/data = list() + data["target_name"] = target.name + data["target_filter_data"] = target.filter_data + return data + +/datum/filter_editor/ui_act(action, list/params) + . = ..() + if(.) + return + + switch(action) + if("add_filter") + var/target_name = params["name"] + while(target.filter_data && target.filter_data[target_name]) + target_name = "[target_name]-dupe" + target.add_filter(target_name, params["priority"], list("type" = params["type"])) + . = TRUE + if("remove_filter") + target.remove_filter(params["name"]) + . = TRUE + if("rename_filter") + var/list/filter_data = target.filter_data[params["name"]] + target.remove_filter(params["name"]) + target.add_filter(params["new_name"], filter_data["priority"], filter_data) + . = TRUE + if("edit_filter") + target.remove_filter(params["name"]) + target.add_filter(params["name"], params["priority"], params["new_filter"]) + . = TRUE + if("change_priority") + var/new_priority = params["new_priority"] + target.change_filter_priority(params["name"], new_priority) + . = TRUE + if("transition_filter_value") + target.transition_filter(params["name"], 4, params["new_data"]) + . = TRUE + if("modify_filter_value") + var/list/old_filter_data = target.filter_data[params["name"]] + var/list/new_filter_data = old_filter_data.Copy() + for(var/entry in params["new_data"]) + new_filter_data[entry] = params["new_data"][entry] + for(var/entry in new_filter_data) + if(entry == GLOB.master_filter_info[old_filter_data["type"]]["defaults"][entry]) + new_filter_data.Remove(entry) + target.remove_filter(params["name"]) + target.add_filter(params["name"], old_filter_data["priority"], new_filter_data) + . = TRUE + if("modify_color_value") + var/new_color = input(usr, "Pick new filter color", "Filteriffic Colors!") as color|null + if(new_color) + target.transition_filter(params["name"], 4, list("color" = new_color)) + . = TRUE + if("modify_icon_value") + var/icon/new_icon = input("Pick icon:", "Icon") as null|icon + if(new_icon) + target.filter_data[params["name"]]["icon"] = new_icon + target.update_filters() + . = TRUE + if("mass_apply") + if(!check_rights_for(usr.client, R_FUN)) + to_chat(usr, "Error") + popup.set_content("Reference tracking not enabled") + popup.open(FALSE) + return + + var/list/frontrefs = get_forward_references(D) + var/list/dat = list() + dat += "

References of \ref[D] - [D]


\[Refresh\]
" + dat += "

Back references - these things hold references to this object.

" + dat += "" + dat += "" + for(var/ref in backrefs) + var/datum/backreference = ref + if(isnull(backreference)) + dat += "" + if(istype(backreference)) + dat += "" + else if(islist(backreference)) + dat += "" + else + dat += "" + dat += "
RefTypeVariable NameFollow
GC'd Reference
[REF(backreference)][backreference.type][backrefs[backreference]]\[Follow\]
[REF(backreference)]list[backrefs[backreference]]\[Follow\]
Weird reference type. Add more debugging checks.

" + dat += "

Forward references - this object is referencing those things.

" + dat += "" + dat += "" + for(var/ref in frontrefs) + var/datum/backreference = frontrefs[ref] + dat += "" + dat += "
Variable nameRefTypeFollow
[ref][REF(backreference)][backreference.type]\[Follow\]

" + dat = dat.Join() + + var/datum/browser/popup = new(usr, "ref_view", "
References of \ref[D]
") + popup.set_content(dat) + popup.open(FALSE) + + +/datum/admins/proc/view_del_failures() + set category = "Debug" + set name = "View Deletion Failures" + + if(!check_rights(R_DEBUG)) + return + + var/list/dat = list("") + for(var/t in GLOB.deletion_failures) + if(isnull(t)) + dat += "" + continue + var/datum/thing = t + dat += "" + dat += "
GC'd Reference | Clear Nulls
\ref[thing] | [thing.type][thing.gc_destroyed ? " (destroyed)" : ""] [ADMIN_VV(thing)]

" + dat = dat.Join() + + var/datum/browser/popup = new(usr, "del_failures", "
Deletion Failures
") + popup.set_content(dat) + popup.open(FALSE) + + +/datum/proc/find_references() + testing("Beginning search for references to a [type].") + var/list/backrefs = get_back_references(src) + for(var/ref in backrefs) + if(isnull(ref)) + log_world("## TESTING: Datum reference found, but gone now.") + continue + if(islist(ref)) + log_world("## TESTING: Found [type] \ref[src] in list.") + continue + var/datum/datum_ref = ref + if(!istype(datum_ref)) + log_world("## TESTING: Found [type] \ref[src] in unknown type reference: [datum_ref].") + return + log_world("## TESTING: Found [type] \ref[src] in [datum_ref.type][datum_ref.gc_destroyed ? " (destroyed)" : ""]") + message_admins("Found [type] \ref[src] [ADMIN_VV(src)] in [datum_ref.type][datum_ref.gc_destroyed ? " (destroyed)" : ""] [ADMIN_VV(datum_ref)]") + testing("Completed search for references to a [type].") + +#endif + +#ifdef LEGACY_REFERENCE_TRACKING + +/datum/verb/legacy_find_refs() + set category = "Debug" + set name = "Find References" + set src in world + + find_references_legacy(FALSE) + + +/datum/proc/find_references_legacy(skip_alert) + running_find_references = type + if(usr?.client) + if(usr.client.running_find_references) + testing("CANCELLED search for references to a [usr.client.running_find_references].") + usr.client.running_find_references = null + running_find_references = null + //restart the garbage collector + SSgarbage.can_fire = TRUE + SSgarbage.next_fire = world.time + world.tick_lag + return + + if(!skip_alert && alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") != "Yes") + running_find_references = null + return + + //this keeps the garbage collector from failing to collect objects being searched for in here + SSgarbage.can_fire = FALSE + + if(usr?.client) + usr.client.running_find_references = type + + testing("Beginning search for references to a [type].") + last_find_references = world.time + + DoSearchVar(GLOB) //globals + for(var/datum/thing in world) //atoms (don't beleive its lies) + DoSearchVar(thing, "World -> [thing]") + + for(var/datum/thing) //datums + DoSearchVar(thing, "World -> [thing]") + + for(var/client/thing) //clients + DoSearchVar(thing, "World -> [thing]") + + testing("Completed search for references to a [type].") + if(usr?.client) + usr.client.running_find_references = null + running_find_references = null + + //restart the garbage collector + SSgarbage.can_fire = TRUE + SSgarbage.next_fire = world.time + world.tick_lag + + +/datum/verb/qdel_then_find_references() + set category = "Debug" + set name = "qdel() then Find References" + set src in world + + qdel(src, TRUE) //force a qdel + if(!running_find_references) + find_references_legacy(TRUE) + + +/datum/verb/qdel_then_if_fail_find_references() + set category = "Debug" + set name = "qdel() then Find References if GC failure" + set src in world + + qdel_and_find_ref_if_fail(src, TRUE) + + +/datum/proc/DoSearchVar(potential_container, container_name, recursive_limit = 64) + if(usr?.client && !usr.client.running_find_references) + return + + if(!recursive_limit) + return + + if(istype(potential_container, /datum)) + var/datum/datum_container = potential_container + if(datum_container.last_find_references == last_find_references) + return + + datum_container.last_find_references = last_find_references + var/list/vars_list = datum_container.vars + + for(var/varname in vars_list) + if (varname == "vars") + continue + var/variable = vars_list[varname] + + if(variable == src) + testing("Found [type] \ref[src] in [datum_container.type]'s [varname] var. [container_name]") + + else if(islist(variable)) + DoSearchVar(variable, "[container_name] -> list", recursive_limit - 1) + + else if(islist(potential_container)) + var/normal = IS_NORMAL_LIST(potential_container) + for(var/element_in_list in potential_container) + if(element_in_list == src) + testing("Found [type] \ref[src] in list [container_name].") + + else if(element_in_list && !isnum(element_in_list) && normal && potential_container[element_in_list] == src) + testing("Found [type] \ref[src] in list [container_name]\[[element_in_list]\]") + + else if(islist(element_in_list)) + DoSearchVar(element_in_list, "[container_name] -> list", recursive_limit - 1) + + #ifndef FIND_REF_NO_CHECK_TICK + CHECK_TICK + #endif + + +/proc/qdel_and_find_ref_if_fail(datum/thing_to_del, force = FALSE) + SSgarbage.reference_find_on_fail[REF(thing_to_del)] = TRUE + qdel(thing_to_del, force) + +#endif diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 3fc8e6b11bdca..9a0956174b0a2 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -89,10 +89,10 @@ var/newamt switch(Text) if("brute") - L.adjustBruteLoss(amount) + L.adjustBruteLoss(amount,TRUE,TRUE) newamt = L.getBruteLoss() if("fire") - L.adjustFireLoss(amount) + L.adjustFireLoss(amount,TRUE,TRUE) newamt = L.getFireLoss() if("toxin") L.adjustToxLoss(amount) diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm index 2a0f3d7302f23..912b694061288 100644 --- a/code/modules/admin/view_variables/topic_basic.dm +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -45,7 +45,48 @@ usr.client.admin_delete(target) if (isturf(src)) // show the turf that took its place usr.client.debug_variables(src) + return + + #ifdef REFERENCE_TRACKING + if(href_list[VV_HK_VIEW_REFERENCES]) + var/datum/D = locate(href_list[VV_HK_TARGET]) + if(!D) + to_chat(usr, "Unable to locate item.") + return + usr.client.holder.view_refs(target) + return + #endif + 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 = sortList(subtypesof(/datum/component), /proc/cmp_typepaths_asc) + names += "---Components---" + names += componentsubtypes + names += "---Elements---" + names += sortList(subtypesof(/datum/element), /proc/cmp_typepaths_asc) + 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/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index b8b9faed1c519..a48d1ee429668 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -27,8 +27,9 @@ if(istype(D, /atom)) sprite = getFlatIcon(D) - hash = md5(sprite) - src << browse_rsc(sprite, "vv[hash].png") + hash = md5(icon2base64(sprite)) + if(hash) //Fixes VV shitting it's pants if the icon isn't valid + src << browse_rsc(sprite, "vv[hash].png") title = "[D] ([REF(D)]) = [type]" var/formatted_type = replacetext("[type]", "/", "/") @@ -58,6 +59,9 @@ "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), + #ifdef REFERENCE_TRACKING + "View References" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_VIEW_REFERENCES), + #endif "---" ) for(var/i in 1 to length(dropdownoptions)) diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 8d36fd1898c7f..2f005a8fe81da 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -16,10 +16,13 @@ GLOBAL_LIST(admin_antag_list) var/give_objectives = TRUE //Should the default objectives be generated? var/replace_banned = TRUE //Should replace jobbanned player with ghosts if granted. var/list/objectives = list() + var/delay_roundend = TRUE var/antag_memory = ""//These will be removed with antag datum var/antag_moodlet //typepath of moodlet that the mob will gain with their status - var/can_hijack = HIJACK_NEUTRAL //If these antags are alone on shuttle hijack happens. - var/delay_roundend = TRUE + + var/can_elimination_hijack = ELIMINATION_NEUTRAL //If these antags are alone when a shuttle elimination happens. + /// If above 0, this is the multiplier for the speed at which we hijack the shuttle. Do not directly read, use hijack_speed(). + var/hijack_speed = 0 //Antag panel properties var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind @@ -27,7 +30,7 @@ GLOBAL_LIST(admin_antag_list) var/show_name_in_check_antagonists = FALSE //Will append antagonist name in admin listings - use for categories that share more than one antag type var/show_to_ghosts = FALSE // Should this antagonist be shown as antag to ghosts? Shouldn't be used for stealthy antagonists like traitors -/datum/antagonist/proc/show_tips(file) +/datum/antagonist/proc/show_tips(fileid) if(!owner || !owner.current || !owner.current.client) return var/datum/asset/stuff = get_asset_datum(/datum/asset/simple/bee_antags) @@ -35,7 +38,7 @@ GLOBAL_LIST(admin_antag_list) var/datum/browser/popup = new(owner.current, "antagTips", null, 600, 400) popup.set_window_options("titlebar=1;can_minimize=0;can_resize=0") //Replaces traitor.png with the appropriate hashed url - popup.set_content(replacetext(rustg_file_read(file), regex("\\w*.png", "gm"), /datum/antagonist/proc/get_asset_url_from)) + popup.set_content(replacetext(rustg_file_read("html/antagtips/[html_encode(fileid)].html"), regex("\\w*.png", "gm"), /datum/antagonist/proc/get_asset_url_from)) popup.open(FALSE) /datum/antagonist/proc/get_asset_url_from(match) @@ -67,9 +70,15 @@ GLOBAL_LIST(admin_antag_list) /datum/antagonist/proc/specialization(datum/mind/new_owner) return src +///Called by the transfer_to() mind proc after the mind (mind.current and new_character.mind) has moved but before the player (key and client) is transfered. /datum/antagonist/proc/on_body_transfer(mob/living/old_body, mob/living/new_body) + SHOULD_CALL_PARENT(TRUE) remove_innate_effects(old_body) + if(old_body.stat != DEAD && !LAZYLEN(old_body.mind?.antag_datums)) + old_body.remove_from_current_living_antags() apply_innate_effects(new_body) + if(new_body.stat != DEAD) + new_body.add_to_current_living_antags() //This handles the application of antag huds/special abilities /datum/antagonist/proc/apply_innate_effects(mob/living/mob_override) @@ -83,18 +92,24 @@ GLOBAL_LIST(admin_antag_list) /datum/antagonist/proc/create_team(datum/team/team) return -//Proc called when the datum is given to a mind. +///Called by the add_antag_datum() mind proc after the instanced datum is added to the mind's antag_datums list. /datum/antagonist/proc/on_gain() - if(owner?.current) - if(!silent && tips) - show_tips(tips) - greet() - apply_innate_effects() - give_antag_moodies() - if(is_banned(owner.current) && replace_banned) - replace_banned_player() - else if(owner.current.client?.holder && (CONFIG_GET(flag/auto_deadmin_antagonists) || owner.current.client.prefs?.toggles & DEADMIN_ANTAGONIST)) - owner.current.client.holder.auto_deadmin() + SHOULD_CALL_PARENT(TRUE) + if(!owner) + CRASH("[src] ran on_gain() without a mind") + if(!owner.current) + CRASH("[src] ran on_gain() on a mind without a mob") + if(!silent && tips) + show_tips(tips) + greet() + apply_innate_effects() + give_antag_moodies() + if(is_banned(owner.current) && replace_banned) + replace_banned_player() + else if(owner.current.client?.holder && (CONFIG_GET(flag/auto_deadmin_antagonists) || owner.current.client.prefs?.toggles & DEADMIN_ANTAGONIST)) + owner.current.client.holder.auto_deadmin() + if(owner.current.stat != DEAD) + owner.current.add_to_current_living_antags() /datum/antagonist/proc/is_banned(mob/M) if(!M) @@ -109,14 +124,20 @@ GLOBAL_LIST(admin_antag_list) var/mob/dead/observer/C = pick(candidates) to_chat(owner, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(owner)]) to replace a jobbanned player.") - owner.current.ghostize(0) + owner.current.ghostize(FALSE) owner.current.key = C.key + else + owner.current.ghostize(FALSE,SENTIENCE_FORCE) +///Called by the remove_antag_datum() and remove_all_antag_datums() mind procs for the antag datum to handle its own removal and deletion. /datum/antagonist/proc/on_removal() + SHOULD_CALL_PARENT(TRUE) remove_innate_effects() clear_antag_moodies() if(owner) LAZYREMOVE(owner.antag_datums, src) + if(!LAZYLEN(owner.antag_datums)) + owner.current.remove_from_current_living_antags() if(!silent && owner.current) farewell() var/datum/team/team = get_team() @@ -238,13 +259,18 @@ GLOBAL_LIST(admin_antag_list) return antag_memory = new_memo +/// Gets how fast we can hijack the shuttle, return 0 for can not hijack. Defaults to hijack_speed var, override for custom stuff like buffing hijack speed for hijack objectives or something. +/datum/antagonist/proc/hijack_speed() + var/datum/objective/hijack/H = locate() in objectives + return H?.hijack_speed_override || hijack_speed + //This one is created by admin tools for custom objectives /datum/antagonist/custom antagpanel_category = "Custom" show_name_in_check_antagonists = TRUE //They're all different var/datum/team/custom_team -datum/antagonist/custom/create_team(datum/team/team) +/datum/antagonist/custom/create_team(datum/team/team) custom_team = team /datum/antagonist/custom/get_team() diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index bc01e49026f99..8aee94711f905 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -275,3 +275,53 @@ veil_msg = "You sense an adorable presence lurking just beyond the veil..." demon_type = /mob/living/simple_animal/slaughter/laughter antag_type = /datum/antagonist/slaughter/laughter + +///////////GANGSTER REINFORCEMENT SPAWNER + +/obj/item/antag_spawner/gangster + name = "crook spawner" + desc = "Have headquarters deliver you a crook that just dropped out of high-school and is ready for the front-line. He comes dressed with your gang's outfit and a spray can in hand." + icon = 'icons/obj/device.dmi' + icon_state = "locator" + + +/obj/item/antag_spawner/gangster/attack_self(mob/user) + if(!(check_usability(user))) + return + + to_chat(user, "You activate [src] and wait for confirmation.") + var/list/candidates = pollGhostCandidates("Do you want to play as a gangster reinforcements?", ROLE_GANG, null, ROLE_GANG, 150) + if(LAZYLEN(candidates)) + if(QDELETED(src) || !check_usability(user)) + return + used = TRUE + var/mob/dead/observer/G = pick(candidates) + spawn_antag(G.client, get_turf(src), user.mind) + qdel(src) + else + to_chat(user, "No response from headquarters. Please wait and try again later.") + +/obj/item/antag_spawner/gangster/proc/check_usability(mob/user) + if(used) + to_chat(user, "[src] is out of power!") + return FALSE + if(!user.mind.has_antag_datum(/datum/antagonist/gang,TRUE)) + to_chat(user, "AUTHENTICATION FAILURE. ACCESS DENIED.") + return FALSE + return TRUE + +/obj/item/antag_spawner/gangster/spawn_antag(client/C, turf/T, datum/mind/user) + var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) + if (C) + C.prefs.copy_to(M) + M.key = C.key + + var/datum/antagonist/gang/alignment = user.has_antag_datum(/datum/antagonist/gang,TRUE) + if(alignment) + M.mind.add_antag_datum(/datum/antagonist/gang, alignment) + M.equip_to_slot_or_del(new alignment.gang.outfit(M),ITEM_SLOT_ICLOTHING) + M.equip_to_slot_or_del(new alignment.gang.suit(M),ITEM_SLOT_OCLOTHING) + M.equip_to_slot_or_del(new alignment.gang.hat(M),ITEM_SLOT_HEAD) + + M.mind.special_role = "Gangster" + M.equipOutfit(/datum/outfit/crook) \ No newline at end of file diff --git a/code/modules/antagonists/_common/tips.dm b/code/modules/antagonists/_common/tips.dm index c75dd150b808a..9a9627fab9618 100644 --- a/code/modules/antagonists/_common/tips.dm +++ b/code/modules/antagonists/_common/tips.dm @@ -1,20 +1,20 @@ /datum/antagonist/wizard - tips = 'html/antagtips/wizard.html' + tips = "wizard" /datum/antagonist/nukeop - tips = 'html/antagtips/nukie.html' + tips = "nukie" /datum/antagonist/abductor - tips = 'html/antagtips/abductor.html' - + tips = "abductor" + /datum/antagonist/cult - tips = 'html/antagtips/cult.html' - + tips = "cult" + /datum/antagonist/xeno - tips = 'html/antagtips/xeno.html' - + tips = "xeno" + /datum/antagonist/blob - tips = 'html/antagtips/blob.html' - + tips = "blob" + /datum/antagonist/changeling - tips = 'html/antagtips/changeling.html' \ No newline at end of file + tips = "changeling" diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm index 9ab197c4066d1..d9e9958327cd3 100644 --- a/code/modules/antagonists/abductor/abductor.dm +++ b/code/modules/antagonists/abductor/abductor.dm @@ -34,6 +34,10 @@ name = "Abductor Solo" outfit = /datum/outfit/abductor/scientist/onemanteam +/datum/antagonist/abductor/scientist/onemanteam + name = "Abductor Solo" + outfit = /datum/outfit/abductor/scientist/onemanteam + /datum/antagonist/abductor/create_team(datum/team/abductor_team/new_team) if(!new_team) return @@ -68,6 +72,8 @@ to_chat(owner.current, "Choose a worthy disguise and plan your targets carefully! Humans will kill you on sight.") to_chat(owner.current, "[greet_text]") owner.announce_objectives() + owner.current.client?.tgui_panel?.give_antagonist_popup("Abductor", + "Capture and experiment on members of the crew, without being spotted.") /datum/antagonist/abductor/proc/finalize_abductor() //Equip @@ -182,6 +188,10 @@ to_chat(owner, "Your mind snaps!") to_chat(owner, "You can't remember how you got here...") owner.announce_objectives() + var/datum/objective/first_objective = objectives[1] + owner.current.client?.tgui_panel?.give_antagonist_popup("Abductee", + "Something isn't right with your brain, you feel like there is something you have to do no matter what...\n\ + [LAZYLEN(objectives)?"Objective: [first_objective.explanation_text]": "Nevermind..."]") /datum/antagonist/abductee/proc/give_objective() var/mob/living/carbon/human/H = owner.current diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 488db253c58a2..28439fc08a1c4 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -13,7 +13,7 @@ icon_state = "vest_stealth" item_state = "armor" blood_overlay_type = "armor" - armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70) + armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70, "stamina" = 30) actions_types = list(/datum/action/item_action/hands_free/activate) allowed = list( /obj/item/abductor, @@ -23,11 +23,12 @@ /obj/item/restraints/handcuffs ) var/mode = VEST_STEALTH - var/stealth_active = 0 - var/combat_cooldown = 10 + var/stealth_active = FALSE + /// Cooldown in seconds + var/combat_cooldown = 20 var/datum/icon_snapshot/disguise - var/stealth_armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70) - var/combat_armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90) + var/stealth_armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70, "stamina" = 30) + var/combat_armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90, "stamina" = 60) /obj/item/clothing/suit/armor/abductor/vest/Initialize() . = ..() @@ -61,7 +62,7 @@ A.UpdateButtonIcon() /obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user) - if(slot == SLOT_WEAR_SUIT) //we only give the mob the ability to activate the vest if he's actually wearing it. + if(slot == ITEM_SLOT_OCLOTHING) //we only give the mob the ability to activate the vest if he's actually wearing it. return TRUE /obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(datum/icon_snapshot/entry) @@ -110,7 +111,7 @@ /obj/item/clothing/suit/armor/abductor/vest/proc/Adrenaline() if(ishuman(loc)) - if(combat_cooldown != initial(combat_cooldown)) + if(combat_cooldown < initial(combat_cooldown)) to_chat(loc, "Combat injection is still recharging.") return var/mob/living/carbon/human/M = loc @@ -123,9 +124,9 @@ combat_cooldown = 0 START_PROCESSING(SSobj, src) -/obj/item/clothing/suit/armor/abductor/vest/process() - combat_cooldown++ - if(combat_cooldown==initial(combat_cooldown)) +/obj/item/clothing/suit/armor/abductor/vest/process(delta_time) + combat_cooldown += delta_time + if(combat_cooldown >= initial(combat_cooldown)) STOP_PROCESSING(SSobj, src) /obj/item/clothing/suit/armor/abductor/Destroy() @@ -270,13 +271,12 @@ radio_off(target, user) /obj/item/abductor/silencer/proc/radio_off(atom/target, mob/living/user) - if( !(user in (viewers(7,target))) ) + if(!(user in (viewers(7, target)))) return var/turf/targloc = get_turf(target) - var/mob/living/carbon/human/M - for(M in view(2,targloc)) + for(var/mob/living/carbon/human/M in hearers(2,targloc)) if(M == user) continue to_chat(user, "You silence [M]'s radio devices.") @@ -349,7 +349,7 @@ if(QDELETED(G)) return - if(istype(C.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(istype(C.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) to_chat(user, "Your target seems to have some sort of protective headgear on, blocking the message from being sent!") return @@ -508,7 +508,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} L.lastattacker = user.real_name L.lastattackerckey = user.ckey - if(istype(L.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(istype(L.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) to_chat(user, "The specimen's protective headgear is interfering with the baton's stun function!") L.visible_message("[user] tried to stun [L] with [src], but [L.p_their()] headgear protected [L.p_them()]!", \ "You feel a slight tickle where [src] touches you!") @@ -529,7 +529,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} /obj/item/abductor/baton/proc/SleepAttack(mob/living/L,mob/living/user) if(L.incapacitated(TRUE, TRUE)) - if(istype(L.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(istype(L.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) to_chat(user, "The specimen's protective headgear is interfering with the sleep inducement!") L.visible_message("[user] tried to induced sleep in [L] with [src], but [L.p_their()] headgear protected [L.p_them()]!", \ "You feel a strange wave of heavy drowsiness wash over you, but your headgear deflects most of it!") @@ -541,7 +541,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} L.Sleeping(1200) log_combat(user, L, "put to sleep") else - if(istype(L.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(istype(L.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) to_chat(user, "The specimen's protective headgear is completely blocking our sleep inducement methods!") L.visible_message("[user] tried to induce sleep in [L] with [src], but [L.p_their()] headgear completely protected [L.p_them()]!", \ "Any sense of drowsiness is quickly diminished as your headgear deflects the effects!") @@ -680,7 +680,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} /obj/item/abductor_machine_beacon/chem_dispenser name = "beacon - Reagent Synthesizer" spawned_machine = /obj/machinery/chem_dispenser/abductor - + /obj/item/scalpel/alien name = "alien scalpel" desc = "It's a gleaming sharp knife made out of silvery-green metal." @@ -798,6 +798,8 @@ Congratulations! You are now trained for invasive xenobiology research!"} icon = 'icons/obj/abductor.dmi' icon_state = "bed" can_buckle = 1 + /// Amount to inject per second + var/inject_am = 0.5 var/static/list/injected_reagents = list(/datum/reagent/medicine/corazone) @@ -807,13 +809,13 @@ Congratulations! You are now trained for invasive xenobiology research!"} START_PROCESSING(SSobj, src) to_chat(AM, "You feel a series of tiny pricks!") -/obj/structure/table/optable/abductor/process() +/obj/structure/table/optable/abductor/process(delta_time) . = PROCESS_KILL for(var/mob/living/carbon/C in get_turf(src)) . = TRUE for(var/chemical in injected_reagents) - if(C.reagents.get_reagent_amount(chemical) < 1) - C.reagents.add_reagent(chemical, 1) + if(C.reagents.get_reagent_amount(chemical) < inject_am * delta_time) + C.reagents.add_reagent(chemical, inject_am * delta_time) /obj/structure/table/optable/abductor/Destroy() STOP_PROCESSING(SSobj, src) @@ -826,6 +828,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} icon_door = "abductor" can_weld_shut = FALSE material_drop = /obj/item/stack/sheet/mineral/abductor + door_anim_time = 0 // no animation /obj/structure/door_assembly/door_assembly_abductor name = "alien airlock assembly" @@ -841,5 +844,5 @@ Congratulations! You are now trained for invasive xenobiology research!"} name = "alien jumpsuit" icon_state = "abductor-suit" item_state = "bl_suit" - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 0, stamina = 0) can_adjust = 0 diff --git a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm index 42e9fa19a3254..09b7f36a7b304 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm @@ -4,8 +4,11 @@ shoes = /obj/item/clothing/shoes/combat back = /obj/item/storage/backpack ears = /obj/item/radio/headset/abductor + id = /obj/item/card/id/syndicate /datum/outfit/abductor/proc/link_to_console(mob/living/carbon/human/H, team_number) + if(!H.mind) + return var/datum/antagonist/abductor/A = H.mind.has_antag_datum(/datum/antagonist/abductor) if(!team_number && A) team_number = A.team.team_number diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index 029a30e925bfb..cbda71982811f 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -59,7 +59,7 @@ active_mind_control = TRUE log_admin("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]") update_gland_hud() - var/obj/screen/alert/mind_control/mind_alert = owner.throw_alert("mind_control", /obj/screen/alert/mind_control) + var/atom/movable/screen/alert/mind_control/mind_alert = owner.throw_alert("mind_control", /atom/movable/screen/alert/mind_control) mind_alert.command = command addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration) @@ -145,8 +145,8 @@ owner.vomit(20) var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey") - Slime.Friends = list(owner) - Slime.Leader = owner + Slime.set_friends(list(owner)) + Slime.set_leader(owner) /obj/item/organ/heart/gland/mindshock true_name = "neural crosstalk uninhibitor" diff --git a/code/modules/antagonists/abductor/equipment/orderable_gear.dm b/code/modules/antagonists/abductor/equipment/orderable_gear.dm new file mode 100644 index 0000000000000..f2f4a4b56c052 --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/orderable_gear.dm @@ -0,0 +1,76 @@ +GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear)) + +/datum/abductor_gear + /// Name of the gear + var/name = "Generic Abductor Gear" + /// Description of the gear + var/description = "Generic description." + /// Unique ID of the gear + var/id = "abductor_generic" + /// Credit cost of the gear + var/cost = 1 + /// Build path of the gear itself + var/build_path = null + /// Category of the gear + var/category = "Basic Gear" + +/datum/abductor_gear/agent_helmet + name = "Agent Helmet" + description = "Abduct with style - spiky style. Prevents digital tracking." + id = "agent_helmet" + build_path = /obj/item/clothing/head/helmet/abductor + +/datum/abductor_gear/agent_vest + name = "Agent Vest" + description = "A vest outfitted with advanced stealth technology. It has two modes - combat and stealth." + id = "agent_vest" + build_path = /obj/item/clothing/suit/armor/abductor/vest + +/datum/abductor_gear/radio_silencer + name = "Radio Silencer" + description = "A compact device used to shut down communications equipment." + id = "radio_silencer" + build_path = /obj/item/abductor/silencer + +/datum/abductor_gear/science_tool + name = "Science Tool" + description = "A dual-mode tool for retrieving specimens and scanning appearances. Scanning can be done through cameras." + id = "science_tool" + build_path = /obj/item/abductor/gizmo + +/datum/abductor_gear/advanced_baton + name = "Advanced Baton" + description = "A quad-mode baton used for incapacitation and restraining of specimens." + id = "advanced_baton" + cost = 2 + build_path = /obj/item/abductor/baton + +/datum/abductor_gear/agent_id + name = "Agent ID" + description = "An agent id to copy the access of specimens id cards." + id = "agent_id" + build_path = /obj/item/card/id/syndicate + +/datum/abductor_gear/superlingual_matrix + name = "Superlingual Matrix" + description = "A mysterious structure that allows for instant communication between users. Pretty impressive until you need to eat something." + id = "superlingual_matrix" + build_path = /obj/item/organ/tongue/abductor + category = "Advanced Gear" + +/datum/abductor_gear/mental_interface + name = "Mental Interface Device" + description = "A dual-mode tool for directly communicating with sentient brains. It can be used to send a direct message to a target, \ + or to send a command to a test subject with a charged gland." + id = "mental_interface" + cost = 2 + build_path = /obj/item/abductor/mind_device + category = "Advanced Gear" + +/datum/abductor_gear/reagent_synthesizer + name = "Reagent Synthesizer" + description = "Synthesizes a variety of reagents using proto-matter." + id = "reagent_synthesizer" + cost = 2 + build_path = /obj/item/abductor_machine_beacon/chem_dispenser + category = "Advanced Gear" diff --git a/code/modules/antagonists/abductor/machinery/camera.dm b/code/modules/antagonists/abductor/machinery/camera.dm index 5c0878017d287..47cfaea4299d1 100644 --- a/code/modules/antagonists/abductor/machinery/camera.dm +++ b/code/modules/antagonists/abductor/machinery/camera.dm @@ -67,8 +67,13 @@ if(!target || !iscarbon(owner)) return var/mob/living/carbon/human/C = owner - var/mob/camera/aiEye/remote/remote_eye = C.remote_control + var/mob/camera/ai_eye/remote/remote_eye = C.remote_control var/obj/machinery/abductor/pad/P = target + var/target_loc = get_turf(remote_eye) + + if(istype(get_area(target_loc), /area/ai_monitored)) + to_chat(owner, "Due to significant interference, this area cannot be warped to!") + return if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) P.PadToLoc(remote_eye.loc) @@ -94,8 +99,13 @@ if(!target || !iscarbon(owner)) return var/mob/living/carbon/human/C = owner - var/mob/camera/aiEye/remote/remote_eye = C.remote_control + var/mob/camera/ai_eye/remote/remote_eye = C.remote_control var/obj/machinery/abductor/pad/P = target + var/target_loc = get_turf(remote_eye) + + if(istype(get_area(target_loc), /area/ai_monitored)) + to_chat(owner, "Due to significant interference, this area cannot be warped to!") + return if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) P.MobToLoc(remote_eye.loc,C) @@ -133,7 +143,7 @@ return var/mob/living/carbon/human/C = owner - var/mob/camera/aiEye/remote/remote_eye = C.remote_control + var/mob/camera/ai_eye/remote/remote_eye = C.remote_control var/obj/machinery/abductor/console/console = target console.SetDroppoint(remote_eye.loc,owner) diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm index 1586e3ddf6154..e56a20a22cee3 100644 --- a/code/modules/antagonists/abductor/machinery/console.dm +++ b/code/modules/antagonists/abductor/machinery/console.dm @@ -23,6 +23,28 @@ var/obj/machinery/abductor/pad/pad var/obj/machinery/computer/camera_advanced/abductor/camera var/list/datum/icon_snapshot/disguises = list() + /// Currently selected gear category + var/selected_cat + /// Dictates if the compact mode of the interface is on or off + var/compact_mode = FALSE + /// Possible gear to be dispensed + var/list/possible_gear + +/obj/machinery/abductor/console/Initialize(mapload) + . = ..() + possible_gear = get_abductor_gear() + +/** + * get_abductor_gear: Returns a list of a filtered abductor gear sorted by categories + */ +/obj/machinery/abductor/console/proc/get_abductor_gear() + var/list/filtered_modules = list() + for(var/path in GLOB.abductor_gear) + var/datum/abductor_gear/AG = new path + if(!filtered_modules[AG.category]) + filtered_modules[AG.category] = list() + filtered_modules[AG.category][AG] = AG + return filtered_modules /obj/machinery/abductor/console/attack_hand(mob/user) . = ..() @@ -32,96 +54,97 @@ to_chat(user, "You start mashing alien buttons at random!") if(do_after(user,100, target = src)) TeleporterSend() - return - user.set_machine(src) - var/dat = "" - dat += "

Abductsoft 3000

" +/obj/machinery/abductor/console/ui_status(mob/user) + if((!HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING) && !HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING)) && !isobserver(user)) + return UI_CLOSE + return ..() + +/obj/machinery/abductor/console/ui_state(mob/user) + return GLOB.physical_state + +/obj/machinery/abductor/console/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AbductorConsole", name) + ui.open() + ui.set_autoupdate(TRUE) + +/obj/machinery/abductor/console/ui_static_data(mob/user) + var/list/data = list() + data["categories"] = list() + for(var/category in possible_gear) + var/list/cat = list( + "name" = category, + "items" = (category == selected_cat ? list() : null)) + for(var/gear in possible_gear[category]) + var/datum/abductor_gear/AG = possible_gear[category][gear] + cat["items"] += list(list( + "name" = AG.name, + "cost" = AG.cost, + "desc" = AG.description, + )) + data["categories"] += list(cat) + return data + +/obj/machinery/abductor/console/ui_data(mob/user) + var/list/data = list() + data["compactMode"] = compact_mode + data["experiment"] = experiment ? TRUE : FALSE if(experiment) - var/points = experiment.points - var/credits = experiment.credits - dat += "Collected Samples : [points]
" - dat += "Gear Credits: [credits]
" - dat += "Transfer data in exchange for supplies:
" - dat += "Advanced Baton (2 Credits)
" - dat += "Mental Interface Device (2 Credits)
" - dat += "Reagent Synthesizer (2 Credits)
" - dat += "Agent Helmet
" - dat += "Agent Vest
" - dat += "Radio Silencer
" - dat += "Science Tool
" - dat += "Superlingual Matrix
" - else - dat += "NO EXPERIMENT MACHINE DETECTED
" - + data["points"] = experiment.points + data["credits"] = experiment.credits + data["pad"] = pad ? TRUE : FALSE if(pad) - dat += "Emergency Teleporter System." - dat += "Consider using primary observation console first." - dat += "Activate Teleporter
" - if(gizmo?.marked) - dat += "Retrieve Mark
" - else - dat += "Retrieve Mark
" - else - dat += "NO TELEPAD DETECTED
" - + data["gizmo"] = gizmo && gizmo.marked ? TRUE : FALSE + data["vest"] = vest ? TRUE : FALSE if(vest) - dat += "

Agent Vest Mode


" - var/mode = vest.mode - if(mode == VEST_STEALTH) - dat += "Combat" - dat += "Stealth" - else - dat += "Combat" - dat += "Stealth" - - dat+="
" - dat += "Select Agent Vest Disguise
" - dat += "[HAS_TRAIT_FROM(vest, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "Unlock" : "Lock"] Vest
" - else - dat += "NO AGENT VEST DETECTED" - var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500) - popup.set_content(dat) - popup.open() + data["vest_mode"] = vest.mode + data["vest_lock"] = HAS_TRAIT_FROM(vest, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) + return data -/obj/machinery/abductor/console/Topic(href, href_list) - if(..()) +/obj/machinery/abductor/console/ui_act(action, list/params) + . = ..() + if(.) return - usr.set_machine(src) - if(href_list["teleporter_send"]) - TeleporterSend() - else if(href_list["teleporter_retrieve"]) - TeleporterRetrieve() - else if(href_list["flip_vest"]) - FlipVest() - else if(href_list["toggle_vest"]) - if(vest) + switch(action) + if("buy") + var/item_name = params["name"] + var/list/buyable_items = list() + for(var/category in possible_gear) + buyable_items += possible_gear[category] + for(var/key in buyable_items) + var/datum/abductor_gear/AG = buyable_items[key] + if(AG.name == item_name) + Dispense(AG.build_path, AG.cost) + return TRUE + if("teleporter_send") + TeleporterSend() + return TRUE + if("teleporter_retrieve") + TeleporterRetrieve() + return TRUE + if("flip_vest") + FlipVest() + return TRUE + if("toggle_vest") + if(!vest) + return vest.toggle_nodrop() - else if(href_list["select_disguise"]) - SelectDisguise() - else if(href_list["dispense"]) - switch(href_list["dispense"]) - if("baton") - Dispense(/obj/item/abductor/baton,cost=2) - if("helmet") - Dispense(/obj/item/clothing/head/helmet/abductor) - if("silencer") - Dispense(/obj/item/abductor/silencer) - if("tool") - Dispense(/obj/item/abductor/gizmo) - if("vest") - Dispense(/obj/item/clothing/suit/armor/abductor/vest) - if("mind_device") - Dispense(/obj/item/abductor/mind_device,cost=2) - if("chem_dispenser") - Dispense(/obj/item/abductor_machine_beacon/chem_dispenser,cost=2) - if("tongue") - Dispense(/obj/item/organ/tongue/abductor) - updateUsrDialog() + return TRUE + if("select_disguise") + SelectDisguise() + return TRUE + if("select") + selected_cat = params["category"] + return TRUE + if("compact_toggle") + compact_mode = !compact_mode + return TRUE /obj/machinery/abductor/console/proc/TeleporterRetrieve() - if(pad && gizmo && gizmo.marked) + if(pad && gizmo?.marked) pad.Retrieve(gizmo.marked) /obj/machinery/abductor/console/proc/TeleporterSend() @@ -159,7 +182,6 @@ pad.teleport_target = location to_chat(user, "Location marked as test subject release point.") - /obj/machinery/abductor/console/Initialize(mapload) ..() return INITIALIZE_HINT_LATELOAD @@ -184,7 +206,7 @@ c.console = src /obj/machinery/abductor/console/proc/AddSnapshot(mob/living/carbon/human/target) - if(istype(target.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(istype(target.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) say("Subject wearing specialized protective headgear, unable to get a proper scan!") return var/datum/icon_snapshot/entry = new @@ -229,8 +251,6 @@ else return ..() - - /obj/machinery/abductor/console/proc/Dispense(item,cost=1) if(experiment && experiment.credits >= cost) experiment.credits -=cost diff --git a/code/modules/antagonists/abductor/machinery/dispenser.dm b/code/modules/antagonists/abductor/machinery/dispenser.dm index 17fa311c8f6d0..9aca27b60eb83 100644 --- a/code/modules/antagonists/abductor/machinery/dispenser.dm +++ b/code/modules/antagonists/abductor/machinery/dispenser.dm @@ -22,41 +22,44 @@ gland_colors[i] = random_color() amounts[i] = rand(1,5) -/obj/machinery/abductor/gland_dispenser/attack_hand(mob/user) +/obj/machinery/abductor/gland_dispenser/ui_status(mob/user) + if(!isabductor(user) && !isobserver(user)) + return UI_CLOSE + return ..() + +/obj/machinery/abductor/gland_dispenser/ui_state(mob/user) + return GLOB.physical_state + +/obj/machinery/abductor/gland_dispenser/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "GlandDispenser", name) + ui.open() + +/obj/machinery/abductor/gland_dispenser/ui_data(mob/user) + var/list/data = list() + data["glands"] = list() + for(var/gland_number=1,gland_number<=gland_colors.len,gland_number++) + var/list/gland_information = list( + "color" = gland_colors[gland_number], + "amount" = amounts[gland_number], + "id" = gland_number, + ) + data["glands"] += list(gland_information) + return data + +/obj/machinery/abductor/gland_dispenser/ui_act(action, list/params) . = ..() if(.) return - if(!isabductor(user)) - return - user.set_machine(src) - var/box_css = {" - "} - var/dat = "" - var/item_count = 0 - for(var/i=1,i<=gland_colors.len,i++) - item_count++ - var/g_color = gland_colors[i] - var/amount = amounts[i] - dat += "[amount]" - if(item_count == 4) // Four boxes per line - dat +="

" - item_count = 0 - var/datum/browser/popup = new(user, "glands", "Gland Dispenser", 200, 200) - popup.add_head_content(box_css) - popup.set_content(dat) - popup.open() - return + + switch(action) + if("dispense") + var/gland_id = text2num(params["gland_id"]) + if(!gland_id) + return + Dispense(gland_id) + return TRUE /obj/machinery/abductor/gland_dispenser/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/organ/heart/gland)) @@ -65,20 +68,13 @@ for(var/i=1,i<=gland_colors.len,i++) if(gland_types[i] == W.type) amounts[i]++ + ui_update() else return ..() -/obj/machinery/abductor/gland_dispenser/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - - if(href_list["dispense"]) - Dispense(text2num(href_list["dispense"])) - updateUsrDialog() - /obj/machinery/abductor/gland_dispenser/proc/Dispense(count) if(amounts[count]>0) amounts[count]-- var/T = gland_types[count] new T(get_turf(src)) + ui_update() diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm index b972f6c942e25..c41c86c15bbf9 100644 --- a/code/modules/antagonists/abductor/machinery/experiment.dm +++ b/code/modules/antagonists/abductor/machinery/experiment.dm @@ -9,7 +9,8 @@ var/credits = 0 var/list/history var/list/abductee_minds - var/flash = " - || - " + /// Machine feedback message + var/flash = "Awaiting subject." var/obj/machinery/abductor/console/console var/message_cooldown = 0 var/breakout_time = 450 @@ -22,13 +23,6 @@ return close_machine(target) -/obj/machinery/abductor/experiment/attack_hand(mob/user) - . = ..() - if(.) - return - - experimentUI(user) - /obj/machinery/abductor/experiment/open_machine() if(!state_open && !panel_open) ..() @@ -40,7 +34,7 @@ if(state_open && !panel_open) ..(target) -/obj/machinery/abductor/experiment/relaymove(mob/user) +/obj/machinery/abductor/experiment/relaymove(mob/living/user, direction) if(user.stat != CONSCIOUS) return if(message_cooldown <= world.time) @@ -60,120 +54,84 @@ "You successfully break out of [src]!") open_machine() -/obj/machinery/abductor/experiment/proc/dissection_icon(mob/living/carbon/human/H) - var/icon/photo = null - var/g = (H.gender == FEMALE) ? "f" : "m" - if(H.dna.species.use_skintones) - photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]") - else - photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]") - photo.Blend("#[H.dna.features["mcolor"]]", ICON_MULTIPLY) - - var/icon/eyes - if(EYECOLOR in H.dna.species.species_traits) - eyes = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes") - eyes.Blend("#[H.eye_color]", ICON_MULTIPLY) - - var/datum/sprite_accessory/S - S = GLOB.hair_styles_list[H.hair_style] - if(S && (HAIR in H.dna.species.species_traits)) - var/icon/hair = icon("icon" = S.icon, "icon_state" = "[S.icon_state]") - hair.Blend("#[H.hair_color]", ICON_MULTIPLY) - eyes.Blend(hair, ICON_OVERLAY) - - S = GLOB.facial_hair_styles_list[H.facial_hair_style] - if(S && (FACEHAIR in H.dna.species.species_traits)) - var/icon/facial = icon("icon" = S.icon, "icon_state" = "[S.icon_state]") - facial.Blend("#[H.facial_hair_color]", ICON_MULTIPLY) - eyes.Blend(facial, ICON_OVERLAY) - - if(eyes) - photo.Blend(eyes, ICON_OVERLAY) - - var/icon/splat = icon("icon" = 'icons/mob/dam_mob.dmi',"icon_state" = "chest30") - photo.Blend(splat,ICON_OVERLAY) - - return photo - -/obj/machinery/abductor/experiment/proc/experimentUI(mob/user) - var/dat - dat += "

Experiment

" +/obj/machinery/abductor/experiment/ui_status(mob/user) + if(user == occupant) + return UI_CLOSE + return ..() + +/obj/machinery/abductor/experiment/ui_state(mob/user) + return GLOB.physical_state + +/obj/machinery/abductor/experiment/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ProbingConsole", name) + ui.open() + ui.set_autoupdate(TRUE) + +/obj/machinery/abductor/experiment/ui_data(mob/user) + var/list/data = list() + data["open"] = state_open + data["feedback"] = flash + data["occupant"] = occupant ? TRUE : FALSE + data["occupant_name"] = null + data["occupant_status"] = null if(occupant) - var/obj/item/photo/P = new - P.picture = new - P.picture.picture_image = icon(dissection_icon(occupant), dir = SOUTH) - user << browse_rsc(P.picture.picture_image, "dissection_img") - dat += "
" - dat += "" //Avert your eyes - dat += "" - dat += "Probe
" - dat += "Dissect
" - dat += "Analyze
" - dat += "
" - else - dat += "Experiment " - - if(!occupant) - dat += "

Machine Unoccupied

" - else - dat += "

Subject Status :

" - dat += "[occupant.name] => " var/mob/living/mob_occupant = occupant - switch(mob_occupant.stat) - if(CONSCIOUS) - dat += "Conscious" - if(UNCONSCIOUS) - dat += "Unconscious" - else // DEAD - dat += "Deceased" - dat += "
" - dat += "[flash]" - dat += "
" - dat += "Scan" - dat += "Close" : "open=1'>Open"]" - var/datum/browser/popup = new(user, "experiment", "Probing Console", 300, 300) - popup.set_content(dat) - popup.open() - -/obj/machinery/abductor/experiment/Topic(href, href_list) - if(..() || usr == occupant) - return - usr.set_machine(src) - if(href_list["refresh"]) - updateUsrDialog() - return - if(href_list["open"]) - open_machine() - return - if(href_list["close"]) - close_machine() + data["occupant_name"] = mob_occupant.name + data["occupant_status"] = mob_occupant.stat + return data + +/obj/machinery/abductor/experiment/ui_act(action, list/params) + . = ..() + if(.) return - if(occupant) - var/mob/living/mob_occupant = occupant - if(mob_occupant.stat != DEAD) - if(href_list["experiment"]) - flash = Experiment(occupant,href_list["experiment"],usr) - updateUsrDialog() - add_fingerprint(usr) -/obj/machinery/abductor/experiment/proc/Experiment(mob/occupant,type,mob/user) + switch(action) + if("door") + if(state_open) + close_machine() + return TRUE + else + open_machine() + return TRUE + if("experiment") + if(!occupant) + return + var/mob/living/mob_occupant = occupant + if(mob_occupant.stat == DEAD) + return + flash = experiment(mob_occupant, params["experiment_type"], usr) + return TRUE + +/** + * experiment: Performs selected experiment on occupant mob, resulting in a point reward on success + * + * Arguments: + * * occupant The mob inside the machine + * * type The type of experiment to be performed + * * user The mob starting the experiment + */ +/obj/machinery/abductor/experiment/proc/experiment(mob/occupant, type, mob/user) LAZYINITLIST(history) var/mob/living/carbon/human/H = occupant var/datum/antagonist/abductor/user_abductor = user.mind.has_antag_datum(/datum/antagonist/abductor) if(!user_abductor) - return "Authorization failure. Contact mothership immidiately." + return "Authorization failure. Contact mothership immediately." var/point_reward = 0 + if(!H) + return "Invalid or missing specimen." if(H in history) - return "Specimen already in database." + return "Specimen already in database." if(H.stat == DEAD) say("Specimen deceased - please provide fresh sample.") - return "Specimen deceased." + return "Specimen deceased." var/obj/item/organ/heart/gland/GlandTest = locate() in H.internal_organs if(!GlandTest) say("Experimental dissection not detected!") - return "No glands detected!" + return "No glands detected!" if(H.mind != null && H.ckey != null) LAZYINITLIST(abductee_minds) LAZYADD(history, H) @@ -196,33 +154,37 @@ point_reward++ if(point_reward > 0) open_machine() - SendBack(H) + send_back(H) playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) points += point_reward credits += point_reward - return "Experiment successful! [point_reward] new data-points collected." + return "Experiment successful! [point_reward] new data-points collected." else playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 1) - return "Experiment failed! No replacement organ detected." + return "Experiment failed! No replacement organ detected." else say("Brain activity nonexistent - disposing sample...") open_machine() - SendBack(H) - return "Specimen braindead - disposed." - - -/obj/machinery/abductor/experiment/proc/SendBack(mob/living/carbon/human/H) + send_back(H) + return "Specimen braindead - disposed." + +/** + * send_back: Sends a mob back to a selected teleport location if safe + * + * Arguments: + * * H The human mob to be sent back + */ +/obj/machinery/abductor/experiment/proc/send_back(mob/living/carbon/human/H) H.Sleeping(160) H.uncuff() - if(console?.pad?.teleport_target) - H.forceMove(console.pad.teleport_target) + if(console && console.pad && console.pad.teleport_target) + do_teleport(H, console.pad.teleport_target, channel = TELEPORT_CHANNEL_FREE, no_effects = TRUE, teleport_mode = TELEPORT_MODE_ABDUCTORS) return //Area not chosen / It's not safe area - teleport to arrivals SSjob.SendToLateJoin(H, FALSE) return - -/obj/machinery/abductor/experiment/update_icon() +/obj/machinery/abductor/experiment/update_icon_state() if(state_open) icon_state = "experiment-open" else diff --git a/code/modules/antagonists/abductor/machinery/pad.dm b/code/modules/antagonists/abductor/machinery/pad.dm index ab636f7d0e8ea..15df1f40553ba 100644 --- a/code/modules/antagonists/abductor/machinery/pad.dm +++ b/code/modules/antagonists/abductor/machinery/pad.dm @@ -7,14 +7,14 @@ /obj/machinery/abductor/pad/proc/Warp(mob/living/target) if(!target.buckled) - target.forceMove(get_turf(src)) + do_teleport(target, get_turf(src), no_effects = TRUE, channel = TELEPORT_CHANNEL_FREE, teleport_mode = TELEPORT_MODE_ABDUCTORS) /obj/machinery/abductor/pad/proc/Send() if(teleport_target == null) teleport_target = GLOB.teleportlocs[pick(GLOB.teleportlocs)] flick("alien-pad", src) for(var/mob/living/target in loc) - target.forceMove(teleport_target) + do_teleport(target, teleport_target, no_effects = TRUE, channel = TELEPORT_CHANNEL_FREE, teleport_mode = TELEPORT_MODE_ABDUCTORS) new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir) to_chat(target, "The instability of the warp leaves you disoriented!") target.Stun(60) @@ -26,7 +26,7 @@ /obj/machinery/abductor/pad/proc/doMobToLoc(place, atom/movable/target) flick("alien-pad", src) - target.forceMove(place) + do_teleport(target, place, no_effects = TRUE, channel = TELEPORT_CHANNEL_FREE, teleport_mode = TELEPORT_MODE_ABDUCTORS) new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir) /obj/machinery/abductor/pad/proc/MobToLoc(place,mob/living/target) @@ -36,7 +36,7 @@ /obj/machinery/abductor/pad/proc/doPadToLoc(place) flick("alien-pad", src) for(var/mob/living/target in get_turf(src)) - target.forceMove(place) + do_teleport(target, place, no_effects = TRUE, channel = TELEPORT_CHANNEL_FREE, teleport_mode = TELEPORT_MODE_ABDUCTORS) new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir) /obj/machinery/abductor/pad/proc/PadToLoc(place) diff --git a/code/modules/antagonists/ashwalker/ashwalker.dm b/code/modules/antagonists/ashwalker/ashwalker.dm index 200866bac9e46..2e4d8b42669a2 100644 --- a/code/modules/antagonists/ashwalker/ashwalker.dm +++ b/code/modules/antagonists/ashwalker/ashwalker.dm @@ -23,15 +23,21 @@ return ashie_team /datum/antagonist/ashwalker/on_body_transfer(mob/living/old_body, mob/living/new_body) + . = ..() UnregisterSignal(old_body, COMSIG_MOB_EXAMINATE) RegisterSignal(new_body, COMSIG_MOB_EXAMINATE, .proc/on_examinate) /datum/antagonist/ashwalker/on_gain() + . = ..() RegisterSignal(owner.current, COMSIG_MOB_EXAMINATE, .proc/on_examinate) + owner.teach_crafting_recipe(/datum/crafting_recipe/skeleton_key) /datum/antagonist/ashwalker/on_removal() + . = ..() UnregisterSignal(owner.current, COMSIG_MOB_EXAMINATE) /datum/antagonist/ashwalker/proc/on_examinate(datum/source, atom/A) + SIGNAL_HANDLER + if(istype(A, /obj/structure/headpike)) SEND_SIGNAL(owner.current, COMSIG_ADD_MOOD_EVENT, "oogabooga", /datum/mood_event/sacrifice_good) diff --git a/code/modules/antagonists/blob/blob.dm b/code/modules/antagonists/blob/blob.dm index 1045258288ec7..9c58e95630bb8 100644 --- a/code/modules/antagonists/blob/blob.dm +++ b/code/modules/antagonists/blob/blob.dm @@ -22,6 +22,11 @@ /datum/antagonist/blob/greet() if(!isovermind(owner.current)) to_chat(owner,"You feel bloated.") + else + owner.current.client?.tgui_panel?.give_antagonist_popup("Blob", + "Place your core by using the place core button.\n\ + Expand and manage your resources carefully, the crew will know about your existence soon \ + and will work together to destroy you.") /datum/antagonist/blob/on_gain() create_objectives() diff --git a/code/modules/antagonists/blob/blob_mobs.dm b/code/modules/antagonists/blob/blob_mobs.dm index f0dc38b2c2a16..5913b0917fe9b 100644 --- a/code/modules/antagonists/blob/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob_mobs.dm @@ -15,8 +15,14 @@ maxbodytemp = 360 unique_name = 1 a_intent = INTENT_HARM + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + initial_language_holder = /datum/language_holder/empty var/mob/camera/blob/overmind = null var/obj/structure/blob/factory/factory = null + var/independent = FALSE + mobchatspan = "blob" + discovery_points = 1000 /mob/living/simple_animal/hostile/blob/update_icons() if(overmind) @@ -24,6 +30,13 @@ else remove_atom_colour(FIXED_COLOUR_PRIORITY) +/mob/living/simple_animal/hostile/blob/Initialize() + . = ..() + if(!independent) //no pulling people deep into the blob + remove_verb(/mob/living/verb/pulled) + else + pass_flags &= ~PASSBLOB + /mob/living/simple_animal/hostile/blob/Destroy() if(overmind) overmind.blob_mobs -= src @@ -56,8 +69,10 @@ return 1 return ..() -/mob/living/simple_animal/hostile/blob/proc/blob_chat(msg) - var/spanned_message = say_quote(msg) +/mob/living/simple_animal/hostile/blob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) + if(!overmind) + return ..() + var/spanned_message = say_quote(message) var/rendered = "\[Blob Telepathy\] [real_name] [spanned_message]" for(var/M in GLOB.mob_list) if(isovermind(M) || istype(M, /mob/living/simple_animal/hostile/blob)) @@ -87,13 +102,14 @@ attacktext = "hits" attack_sound = 'sound/weapons/genhit1.ogg' movement_type = FLYING - del_on_death = 1 + del_on_death = TRUE deathmessage = "explodes into a cloud of gas!" + gold_core_spawnable = HOSTILE_SPAWN var/death_cloud_size = 1 //size of cloud produced from a dying spore var/mob/living/carbon/human/oldguy - var/is_zombie = 0 - gold_core_spawnable = HOSTILE_SPAWN + var/is_zombie = FALSE var/list/disease = list() + flavor_text = FLAVOR_TEXT_GOAL_ANTAG /mob/living/simple_animal/hostile/blob/blobspore/Initialize(mapload, var/obj/structure/blob/factory/linked_node) if(istype(linked_node)) @@ -115,7 +131,7 @@ /mob/living/simple_animal/hostile/blob/blobspore/Life() 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 + for(var/mob/living/carbon/human/H in hearers(1, src)) //Only for corpse right next to/on same tile if(H.stat == DEAD) Zombify(H) break @@ -144,6 +160,8 @@ oldguy = H update_icons() visible_message("The corpse of [H.name] suddenly rises!") + if(!key) + set_playable() /mob/living/simple_animal/hostile/blob/blobspore/death(gibbed) // On death, create a small smoke of harmful gas (s-Acid) @@ -222,17 +240,9 @@ force_threshold = 10 pressure_resistance = 50 mob_size = MOB_SIZE_LARGE - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE hud_type = /datum/hud/blobbernaut - var/independent = FALSE - -/mob/living/simple_animal/hostile/blob/blobbernaut/Initialize() - . = ..() - if(!independent) //no pulling people deep into the blob - verbs -= /mob/living/verb/pulled - else - pass_flags &= ~PASSBLOB + flavor_text = FLAVOR_TEXT_GOAL_ANTAG + move_resist = MOVE_FORCE_STRONG /mob/living/simple_animal/hostile/blob/blobbernaut/Life() if(..()) @@ -275,7 +285,7 @@ /mob/living/simple_animal/hostile/blob/blobbernaut/update_health_hud() if(hud_used) - hud_used.healths.maptext = "
[round((health / maxHealth) * 100, 0.5)]%
" + hud_used.healths.maptext = MAPTEXT("
[round((health / maxHealth) * 100, 0.5)]%
") /mob/living/simple_animal/hostile/blob/blobbernaut/AttackingTarget() . = ..() diff --git a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm index 8b6f4bd687e88..34b82011cd1e7 100644 --- a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm +++ b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm @@ -8,7 +8,7 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ var/shortdesc = null //just damage and on_mob effects, doesn't include special, blob-tile only effects var/effectdesc = null //any long, blob-tile specific effects var/analyzerdescdamage = "Unknown. Report this bug to a coder, or just adminhelp." - var/analyzerdesceffect = "N/A" + var/analyzerdesceffect var/blobbernaut_message = "slams" //blobbernaut attack verb var/message = "The blob strikes you" //message sent to any mob hit by the blob var/message_living = null //extension to first mob sent to only living mobs i.e. silicons have no skin to be burnt @@ -22,6 +22,10 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ stack_trace("blobstrain created without overmind") overmind = new_overmind +/datum/blobstrain/Destroy() + overmind = null + return ..() + /datum/blobstrain/proc/on_gain() overmind.color = complementary_color for(var/BL in GLOB.blobs) @@ -72,3 +76,6 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ /datum/blobstrain/proc/emp_reaction(obj/structure/blob/B, severity, coefficient = 1) //when the blob is hit with an emp, do this return + +/datum/blobstrain/proc/examine(mob/user) + return list("Progress to Critical Mass: [overmind.blobs_legit.len]/[overmind.blobwincount].") diff --git a/code/modules/antagonists/blob/blobstrains/blazing_oil.dm b/code/modules/antagonists/blob/blobstrains/blazing_oil.dm index 97b974e28fd54..6b308a57e2c30 100644 --- a/code/modules/antagonists/blob/blobstrains/blazing_oil.dm +++ b/code/modules/antagonists/blob/blobstrains/blazing_oil.dm @@ -18,9 +18,9 @@ /datum/blobstrain/reagent/blazing_oil/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) if(damage_type == BURN && damage_flag != "energy") - for(var/turf/open/T in range(1, B)) + for(var/turf/open/T in RANGE_TURFS(1, B)) var/obj/structure/blob/C = locate() in T - if(!(C && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) && prob(80)) + if(!(C?.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) && prob(80)) new /obj/effect/hotspot(T) if(damage_flag == "fire") return 0 diff --git a/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm b/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm index f8fd2e2f0df58..39b25df18f19a 100644 --- a/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm +++ b/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm @@ -29,7 +29,7 @@ if(reac_volume >= 10) //if it's not a spore cloud, bad time incoming var/obj/effect/temp_visual/explosion/fast/E = new /obj/effect/temp_visual/explosion/fast(get_turf(M)) E.alpha = 150 - for(var/mob/living/L in orange(get_turf(M), 1)) + for(var/mob/living/L in ohearers(1, get_turf(M))) if(ROLE_BLOB in L.faction) //no friendly fire continue var/aoe_volume = ..(L, TOUCH, initial_volume, 0, L.get_permeability_protection(), O) diff --git a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm index e575432997944..7129ef6aff0c4 100644 --- a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm +++ b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm @@ -23,7 +23,7 @@ extinguisharea(B, 50) /datum/blobstrain/reagent/pressurized_slime/proc/extinguisharea(obj/structure/blob/B, probchance) - for(var/turf/open/T in range(1, B)) + for(var/turf/open/T in RANGE_TURFS(1, B)) if(prob(probchance)) T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS) for(var/obj/O in T) diff --git a/code/modules/antagonists/blob/blobstrains/reactive_spines.dm b/code/modules/antagonists/blob/blobstrains/reactive_spines.dm index fca56d140229a..8ec9ab6d26b6b 100644 --- a/code/modules/antagonists/blob/blobstrains/reactive_spines.dm +++ b/code/modules/antagonists/blob/blobstrains/reactive_spines.dm @@ -15,7 +15,7 @@ if(damage && damage_type == BRUTE && B.obj_integrity - damage > 0) //is there any damage, is it brute, and will we be alive if(damage_flag == "melee") B.visible_message("The blob retaliates, lashing out!") - for(var/atom/A in range(1, B)) + for(var/atom/A as() in range(1, B)) A.blob_act(B) return ..() diff --git a/code/modules/antagonists/blob/overmind.dm b/code/modules/antagonists/blob/overmind.dm index 5be77807abd1e..d859f38517e90 100644 --- a/code/modules/antagonists/blob/overmind.dm +++ b/code/modules/antagonists/blob/overmind.dm @@ -39,6 +39,12 @@ GLOBAL_LIST_EMPTY(blob_nodes) var/blobwincount = 400 var/victory_in_progress = FALSE var/rerolling = FALSE + var/announcement_size = 75 + var/announcement_time + var/has_announced = FALSE + + /// The list of strains the blob can reroll for. + var/list/strain_choices /mob/camera/blob/Initialize(mapload, starting_points = 60) validate_location() @@ -56,6 +62,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) if(blob_core) blob_core.update_icon() SSshuttle.registerHostileEnvironment(src) + announcement_time = world.time + 6000 . = ..() START_PROCESSING(SSobj, src) @@ -89,7 +96,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) /mob/camera/blob/proc/is_valid_turf(turf/T) var/area/A = get_area(T) - if((A && !A.blob_allowed) || !T || !is_station_level(T.z) || isspaceturf(T)) + if((A && !(A.area_flags & BLOBS_ALLOWED)) || !T || !is_station_level(T.z) || isspaceturf(T)) return FALSE return TRUE @@ -106,7 +113,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) qdel(src) else if(!victory_in_progress && (blobs_legit.len >= blobwincount)) victory_in_progress = TRUE - priority_announce("Biohazard has reached critical mass. Station loss is imminent.", "Biohazard Alert") + priority_announce("Biohazard has reached critical mass. Station loss is imminent.", "Biohazard Alert", SSstation.announcer.get_rand_alert_sound()) set_security_level("delta") max_blob_points = INFINITY blob_points = INFINITY @@ -118,6 +125,9 @@ GLOBAL_LIST_EMPTY(blob_nodes) if(!victory_in_progress && max_count < blobs_legit.len) max_count = blobs_legit.len + if(!has_announced && (world.time >= announcement_time || blobs_legit.len >= announcement_size)) + priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", ANNOUNCER_OUTBREAK5) + has_announced = TRUE /mob/camera/blob/proc/victory() sound_to_playing_players('sound/machines/alarm.ogg') sleep(100) @@ -132,7 +142,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) var/area/Ablob = get_area(T) - if(!Ablob.blob_allowed) + if(!(Ablob.area_flags & BLOBS_ALLOWED)) continue if(!(ROLE_BLOB in L.faction)) @@ -145,7 +155,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) for(var/area/A in GLOB.sortedAreas) if(!(A.type in GLOB.the_station_areas)) continue - if(!A.blob_allowed) + if(!(A.area_flags & BLOBS_ALLOWED)) continue A.color = blobstrain.color A.name = "blob" @@ -164,6 +174,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) SSticker.force_ending = 1 /mob/camera/blob/Destroy() + QDEL_NULL(blobstrain) for(var/BL in GLOB.blobs) var/obj/structure/blob/B = BL if(B && B.overmind == src) @@ -175,6 +186,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) BM.overmind = null BM.update_icons() GLOB.overminds -= src + QDEL_LIST_ASSOC_VAL(strain_choices) SSshuttle.clearHostileEnvironment(src) STOP_PROCESSING(SSobj, src) @@ -192,17 +204,18 @@ GLOBAL_LIST_EMPTY(blob_nodes) . = ..() if(blobstrain) . += "Its strain is [blobstrain.name]." + . += "It currently consists of [blobs_legit.len] nodes, out of the [blobwincount] nodes needed to achieve critical mass." /mob/camera/blob/update_health_hud() if(blob_core) - hud_used.healths.maptext = "
[round(blob_core.obj_integrity)]
" + hud_used.healths.maptext = MAPTEXT("
[round(blob_core.obj_integrity)]
") for(var/mob/living/simple_animal/hostile/blob/blobbernaut/B in blob_mobs) if(B.hud_used?.blobpwrdisplay) - B.hud_used.blobpwrdisplay.maptext = "
[round(blob_core.obj_integrity)]
" + B.hud_used.blobpwrdisplay.maptext = MAPTEXT("
[round(blob_core.obj_integrity)]
") /mob/camera/blob/proc/add_points(points) blob_points = CLAMP(blob_points + points, 0, max_blob_points) - hud_used.blobpwrdisplay.maptext = "
[round(blob_points)]
" + hud_used.blobpwrdisplay.maptext = 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) if (!message) @@ -242,19 +255,19 @@ GLOBAL_LIST_EMPTY(blob_nodes) /mob/camera/blob/blob_act(obj/structure/blob/B) return -/mob/camera/blob/Stat() - ..() - if(statpanel("Status")) - if(blob_core) - stat(null, "Core Health: [blob_core.obj_integrity]") - stat(null, "Power Stored: [blob_points]/[max_blob_points]") - stat(null, "Blobs to Win: [blobs_legit.len]/[blobwincount]") - if(free_strain_rerolls) - stat(null, "You have [free_strain_rerolls] Free Strain Reroll\s Remaining") - if(!placed) - if(manualplace_min_time) - stat(null, "Time Before Manual Placement: [max(round((manualplace_min_time - world.time)*0.1, 0.1), 0)]") - stat(null, "Time Before Automatic Placement: [max(round((autoplace_max_time - world.time)*0.1, 0.1), 0)]") +/mob/camera/blob/get_stat_tab_status() + var/list/tab_data = ..() + if(blob_core) + tab_data["Core Health"] = GENERATE_STAT_TEXT("[blob_core.obj_integrity]") + tab_data["Power Stored"] = GENERATE_STAT_TEXT("[blob_points]/[max_blob_points]") + tab_data["Blobs to Win"] = GENERATE_STAT_TEXT("[blobs_legit.len]/[blobwincount]") + if(free_strain_rerolls) + tab_data["Strain Reroll"] = GENERATE_STAT_TEXT("You have [free_strain_rerolls] Free Strain Reroll\s Remaining") + if(!placed) + if(manualplace_min_time) + tab_data["Time Before Manual Placement"] = GENERATE_STAT_TEXT("[max(round((manualplace_min_time - world.time)*0.1, 0.1), 0)]") + tab_data["Time Before Automatic Placement"] = GENERATE_STAT_TEXT("[max(round((autoplace_max_time - world.time)*0.1, 0.1), 0)]") + return tab_data /mob/camera/blob/Move(NewLoc, Dir = 0) if(placed) diff --git a/code/modules/antagonists/blob/powers.dm b/code/modules/antagonists/blob/powers.dm index adef1ab86c56c..a501da43c6133 100644 --- a/code/modules/antagonists/blob/powers.dm +++ b/code/modules/antagonists/blob/powers.dm @@ -1,3 +1,6 @@ +#define BLOB_REROLL_CHOICES 6 +#define BLOB_REROLL_RADIUS 60 + /mob/camera/blob/proc/can_buy(cost = 15) if(blob_points < cost) to_chat(src, "You cannot afford this, you need at least [cost] resources!") @@ -18,7 +21,7 @@ if(M.client) to_chat(src, "There is someone too close to place your blob core!") return 0 - for(var/mob/living/M in view(13, src)) + for(var/mob/living/M in hearers(13, src)) if(ROLE_BLOB in M.faction) continue if(M.client) @@ -211,7 +214,7 @@ to_chat(src, "You have no core and are about to die! May you rest in peace.") return var/area/A = get_area(T) - if(isspaceturf(T) || A && !A.blob_allowed) + if(isspaceturf(T) || A && !(A.area_flags & BLOBS_ALLOWED)) to_chat(src, "You cannot relocate your core here!") return if(!can_buy(80)) @@ -257,7 +260,7 @@ if(world.time < last_attack) return var/list/possibleblobs = list() - for(var/obj/structure/blob/AB in range(T, 1)) + for(var/obj/structure/blob/AB in range(1, T)) possibleblobs += AB if(!possibleblobs.len) to_chat(src, "There is no blob adjacent to the target tile!") @@ -318,7 +321,7 @@ if(!surrounding_turfs.len) return for(var/mob/living/simple_animal/hostile/blob/blobspore/BS in blob_mobs) - if(isturf(BS.loc) && get_dist(BS, T) <= 35) + if(!BS.key && isturf(BS.loc) && get_dist(BS, T) <= 35) BS.LoseTarget() BS.Goto(pick(surrounding_turfs), BS.move_to_delay) @@ -340,25 +343,54 @@ set category = "Blob" set name = "Reactive Strain Adaptation (40)" set desc = "Replaces your strain with a random, different one." - if(!rerolling && (free_strain_rerolls || can_buy(40))) - rerolling = TRUE - reroll_strain() - rerolling = FALSE - if(free_strain_rerolls) - free_strain_rerolls-- - last_reroll_time = world.time - -/mob/camera/blob/proc/reroll_strain() - var/list/choices = list() - while (length(choices) < 4) - var/datum/blobstrain/bs = pick((GLOB.valid_blobstrains)) - choices[initial(bs.name)] = bs - - var/choice = input(usr, "Please choose a new strain","Strain") as anything in sortList(choices, /proc/cmp_typepaths_asc) - if (choice && choices[choice] && !QDELETED(src)) - var/datum/blobstrain/bs = choices[choice] - set_strain(bs) + if (!free_strain_rerolls && blob_points < BLOB_REROLL_COST) + to_chat(src, "You need at least [BLOB_REROLL_COST] resources to reroll your strain again!") + return + + open_reroll_menu() + +/// Open the menu to reroll strains +/mob/camera/blob/proc/open_reroll_menu() + if (!strain_choices) + strain_choices = list() + + var/list/new_strains = GLOB.valid_blobstrains.Copy() + for (var/_ in 1 to BLOB_REROLL_CHOICES) + var/datum/blobstrain/strain = pick_n_take(new_strains) + + var/image/strain_icon = image('icons/mob/blob.dmi', "blob_core") + strain_icon.color = initial(strain.color) + + var/info_text = "[initial(strain.name)]" + info_text += "
[initial(strain.analyzerdescdamage)]" + if (!isnull(initial(strain.analyzerdesceffect))) + info_text += "
[initial(strain.analyzerdesceffect)]" + + var/datum/radial_menu_choice/choice = new + choice.image = strain_icon + choice.info = info_text + + strain_choices[initial(strain.name)] = choice + + var/strain_result = show_radial_menu(src, src, strain_choices, radius = BLOB_REROLL_RADIUS, tooltips = TRUE) + if (isnull(strain_result)) + return + + if (!free_strain_rerolls && !can_buy(BLOB_REROLL_COST)) + return + + for (var/_other_strain in GLOB.valid_blobstrains) + var/datum/blobstrain/other_strain = _other_strain + if (initial(other_strain.name) == strain_result) + set_strain(other_strain) + + if (free_strain_rerolls) + free_strain_rerolls -= 1 + + last_reroll_time = world.time + + return /mob/camera/blob/verb/blob_help() set category = "Blob" @@ -383,3 +415,6 @@ if(!placed && autoplace_max_time <= world.time) to_chat(src, "You will automatically place your blob core in [DisplayTimeText(autoplace_max_time - world.time)].") to_chat(src, "You [manualplace_min_time ? "will be able to":"can"] manually place your blob core by pressing the Place Blob Core button in the bottom right corner of the screen.") + +#undef BLOB_REROLL_CHOICES +#undef BLOB_REROLL_RADIUS diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 5f9ad75487457..3c2642fd9294e 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -11,7 +11,7 @@ CanAtmosPass = ATMOS_PASS_PROC var/point_return = 0 //How many points the blob gets back when it removes a blob of that type. If less than 0, blob cannot be removed. max_integrity = 30 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70, "stamina" = 0) var/health_regen = 2 //how much health this blob regens when pulsed var/pulse_timestamp = 0 //we got pulsed when? var/heal_timestamp = 0 //we got healed when? @@ -25,7 +25,7 @@ if(owner_overmind) overmind = owner_overmind var/area/Ablob = get_area(src) - if(Ablob.blob_allowed) //Is this area allowed for winning as blob? + if(Ablob.area_flags & BLOBS_ALLOWED) //Is this area allowed for winning as blob? overmind.blobs_legit += src GLOB.blobs += src //Keep track of the blob in the normal list either way setDir(pick(GLOB.cardinals)) @@ -64,7 +64,7 @@ result++ . -= result - 1 -/obj/structure/blob/BlockSuperconductivity() +/obj/structure/blob/BlockThermalConductivity() return atmosblock /obj/structure/blob/CanPass(atom/movable/mover, turf/target) @@ -241,17 +241,17 @@ RETURN_TYPE(/list) . = list() if(overmind) - . += {"Material: [overmind.blobstrain.name].\n - Material Effects: [overmind.blobstrain.analyzerdescdamage]\n - Material Properties: [overmind.blobstrain.analyzerdesceffect]"} + . += list("Material: [overmind.blobstrain.name].", + "Material Effects: [overmind.blobstrain.analyzerdescdamage]", + "Material Properties: [overmind.blobstrain.analyzerdesceffect || "N/A"]") else - . += "No Material Detected!
" + . += "No Material Detected!" /obj/structure/blob/proc/typereport(mob/user) RETURN_TYPE(/list) - return list({"Blob Type: [uppertext(initial(name))]\n - Health: [obj_integrity]/[max_integrity]\n - Effects: [scannerreport()]"}) + return list("Blob Type: [uppertext(initial(name))]", + "Health: [obj_integrity]/[max_integrity]", + "Effects: [scannerreport()]") /obj/structure/blob/attack_animal(mob/living/simple_animal/M) @@ -312,14 +312,14 @@ if(user.research_scanner || hud_to_check.hudusers[user]) . += "Your HUD displays an extensive report...
" if(overmind) - . += "Progress to Critical Mass: [overmind.blobs_legit.len]/[overmind.blobwincount]." + . += overmind.blobstrain.examine(user) else . += "Core neutralized. Critical mass no longer attainable." . += chemeffectreport(user) . += typereport(user) else - if(isobserver(user) && overmind) - . += "Progress to Critical Mass: [overmind.blobs_legit.len]/[overmind.blobwincount]." + if((user == overmind || isobserver(user)) && overmind) + . += overmind.blobstrain.examine(user) . += "It seems to be made of [get_chem_name()]." /obj/structure/blob/proc/scannerreport() diff --git a/code/modules/antagonists/blob/structures/core.dm b/code/modules/antagonists/blob/structures/core.dm index c2ae02c5ce39a..b14f055f139ce 100644 --- a/code/modules/antagonists/blob/structures/core.dm +++ b/code/modules/antagonists/blob/structures/core.dm @@ -4,10 +4,11 @@ icon_state = "blank_blob" desc = "A huge, pulsating yellow mass." max_integrity = 400 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 90) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 90, "stamina" = 0) explosion_block = 6 point_return = -1 health_regen = 0 //we regen in Life() instead of when pulsed + resistance_flags = LAVA_PROOF /obj/structure/blob/core/Initialize(mapload, client/new_overmind = null, placed = 0) GLOB.blob_cores += src @@ -18,12 +19,8 @@ return INITIALIZE_HINT_QDEL if(overmind) update_icon() - addtimer(CALLBACK(src, .proc/generate_announcement), 1800) . = ..() -/obj/structure/blob/core/proc/generate_announcement() - priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/ai/outbreak5.ogg') - /obj/structure/blob/core/scannerreport() return "Directs the blob's expansion, gradually expands, and sustains nearby blob spores and blobbernauts." @@ -55,7 +52,7 @@ if(overmind) //we should have an overmind, but... overmind.update_health_hud() -/obj/structure/blob/core/process() +/obj/structure/blob/core/process(delta_time) if(QDELETED(src)) return if(!overmind) @@ -65,7 +62,7 @@ overmind.update_health_hud() Pulse_Area(overmind, 12, 4, 3) for(var/obj/structure/blob/normal/B in range(1, src)) - if(prob(5)) + if(DT_PROB(2.5, delta_time)) B.change_to(/obj/structure/blob/shield/core, overmind) ..() diff --git a/code/modules/antagonists/blob/structures/factory.dm b/code/modules/antagonists/blob/structures/factory.dm index c0c365edddc39..4ec65fe4fe9b7 100644 --- a/code/modules/antagonists/blob/structures/factory.dm +++ b/code/modules/antagonists/blob/structures/factory.dm @@ -6,6 +6,7 @@ max_integrity = 200 health_regen = 1 point_return = 25 + resistance_flags = LAVA_PROOF var/list/spores = list() var/mob/living/simple_animal/hostile/blob/blobbernaut/naut = null var/max_spores = 3 @@ -25,7 +26,7 @@ if(naut) naut.factory = null to_chat(naut, "Your factory was destroyed! You feel yourself dying!") - naut.throw_alert("nofactory", /obj/screen/alert/nofactory) + naut.throw_alert("nofactory", /atom/movable/screen/alert/nofactory) spores = null return ..() diff --git a/code/modules/antagonists/blob/structures/node.dm b/code/modules/antagonists/blob/structures/node.dm index c2febdbf6f2dc..f04b2d8f092e5 100644 --- a/code/modules/antagonists/blob/structures/node.dm +++ b/code/modules/antagonists/blob/structures/node.dm @@ -4,10 +4,10 @@ icon_state = "blank_blob" desc = "A large, pulsating yellow mass." max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 65, "acid" = 90) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 65, "acid" = 90, "stamina" = 0) health_regen = 3 point_return = 25 - + resistance_flags = LAVA_PROOF /obj/structure/blob/node/Initialize() GLOB.blob_nodes += src diff --git a/code/modules/antagonists/blob/structures/resource.dm b/code/modules/antagonists/blob/structures/resource.dm index 5024d0984c1e9..81eda7f4edde5 100644 --- a/code/modules/antagonists/blob/structures/resource.dm +++ b/code/modules/antagonists/blob/structures/resource.dm @@ -5,6 +5,7 @@ desc = "A thin spire of slightly swaying tendrils." max_integrity = 60 point_return = 15 + resistance_flags = LAVA_PROOF var/resource_delay = 0 /obj/structure/blob/resource/scannerreport() diff --git a/code/modules/antagonists/blob/structures/shield.dm b/code/modules/antagonists/blob/structures/shield.dm index 4741e8749cdfa..cb773d5348007 100644 --- a/code/modules/antagonists/blob/structures/shield.dm +++ b/code/modules/antagonists/blob/structures/shield.dm @@ -9,7 +9,7 @@ explosion_block = 3 point_return = 4 atmosblock = TRUE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90, "stamina" = 0) /obj/structure/blob/shield/scannerreport() if(atmosblock) @@ -38,22 +38,8 @@ 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 + flags_ricochet = RICOCHET_SHINY point_return = 8 max_integrity = 100 brute_resist = 0.5 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) - if(!(P.reflectable & REFLECT_FAKEPROJECTILE)) - visible_message("[P] reflects off [src]!") - return TRUE - diff --git a/code/modules/antagonists/blood_contract/blood_contract.dm b/code/modules/antagonists/blood_contract/blood_contract.dm index 3feb71fe6c7ec..27810bb041082 100644 --- a/code/modules/antagonists/blood_contract/blood_contract.dm +++ b/code/modules/antagonists/blood_contract/blood_contract.dm @@ -19,6 +19,8 @@ /datum/antagonist/blood_contract/greet() . = ..() to_chat(owner, "You've been marked for death! Don't let the demons get you! KILL THEM ALL!") + owner.current.client?.tgui_panel?.give_antagonist_popup("Blood Contract", + "You have been marked for death, the demons thirst for your blood. KILL THEM ALL.") /datum/antagonist/blood_contract/proc/start_the_hunt() var/mob/living/carbon/human/H = owner.current diff --git a/code/modules/antagonists/brainwashing/brainwashing.dm b/code/modules/antagonists/brainwashing/brainwashing.dm index 40b8d05b07271..1ce2fd0fdbaa1 100644 --- a/code/modules/antagonists/brainwashing/brainwashing.dm +++ b/code/modules/antagonists/brainwashing/brainwashing.dm @@ -41,6 +41,9 @@ var/datum/objective/O = X to_chat(owner, "[i]. [O.explanation_text]") i++ + owner.current.client?.tgui_panel?.give_antagonist_popup("Brainwashed", + "You have been brainwashed!\n\ + Ensure you follow your directive, no matter the cost.") /datum/antagonist/brainwashed/farewell() to_chat(owner, "Your mind suddenly clears...") diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index 77221096f25ad..efdea65970499 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -3,9 +3,9 @@ antagpanel_category = "Brother" job_rank = ROLE_BROTHER var/special_role = ROLE_BROTHER + hijack_speed = 0.5 var/datum/team/brother_team/team antag_moodlet = /datum/mood_event/focused - can_hijack = HIJACK_HIJACKER /datum/antagonist/brother/create_team(datum/team/brother_team/new_team) if(!new_team) @@ -34,7 +34,7 @@ return ..() /datum/antagonist/brother/antag_panel_data() - return "Conspirators : [get_brother_names()]]" + return "Conspirators : [get_brother_names()]" /datum/antagonist/brother/proc/get_brother_names() var/list/brothers = team.members - owner @@ -57,26 +57,34 @@ /datum/antagonist/brother/greet() var/brother_text = get_brother_names() to_chat(owner.current, "You are the [owner.special_role] of [brother_text].") - to_chat(owner.current, "The Syndicate only accepts those that have proven themselves. Prove yourself and prove your [team.member_name]s by completing your objectives together!") + to_chat(owner.current, "The Syndicate only accepts those that have proven themselves. Prove yourself and prove your [team.member_name]s by completing your objectives together! You and your team are outfitted with communication implants allowing for direct, encrypted communication.") owner.announce_objectives() give_meeting_area() + owner.current.client?.tgui_panel?.give_antagonist_popup("Blood Brother", + "The Syndicate only accepts those that have proven themselves. Prove yourself and prove your [team.member_name]s by completing your objectives together!") /datum/antagonist/brother/proc/finalize_brother() + var/obj/item/implant/bloodbrother/I = new /obj/item/implant/bloodbrother() + I.implant(owner.current, null, TRUE, TRUE) + I.implant_colour = team.team_id <= 9 ? COLOR_LIST_BLOOD_BROTHERS[team.team_id] : "#ff0000" + for(var/datum/mind/M in team.members) // Link the implants of all team members + var/obj/item/implant/bloodbrother/T = locate() in M.current.implants + I.link_implant(T) SSticker.mode.update_brother_icons_added(owner) - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/tatoralert.ogg', 100, FALSE, pressure_affected = FALSE) + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/tatoralert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) /datum/antagonist/brother/admin_add(datum/mind/new_owner,mob/admin) //show list of possible brothers var/list/candidates = list() - for(var/mob/living/L in GLOB.alive_mob_list) + for(var/mob/living/L in GLOB.player_list) if(!L.mind || L.mind == new_owner || !can_be_owned(L.mind)) continue - candidates[L.mind.name] = L.mind + candidates += L.mind var/choice = input(admin,"Choose the blood brother.", "Brother") as null|anything in sortNames(candidates) if(!choice) return - var/datum/mind/bro = candidates[choice] + var/datum/mind/bro = choice var/datum/team/brother_team/T = new T.add_member(new_owner) T.add_member(bro) @@ -91,9 +99,15 @@ /datum/team/brother_team name = "brotherhood" member_name = "blood brother" + var/team_id var/meeting_area var/static/meeting_areas = list("The Bar", "Dorms", "Escape Dock", "Arrivals", "Holodeck", "Primary Tool Storage", "Recreation Area", "Chapel", "Library") +/datum/team/brother_team/New(starting_members) + . = ..() + var/static/blood_teams + team_id = ++blood_teams + /datum/team/brother_team/is_solo() return FALSE diff --git a/code/modules/antagonists/changeling/cellular_emporium.dm b/code/modules/antagonists/changeling/cellular_emporium.dm index c6b8be0c2c5cb..1c31d342fcf6d 100644 --- a/code/modules/antagonists/changeling/cellular_emporium.dm +++ b/code/modules/antagonists/changeling/cellular_emporium.dm @@ -68,9 +68,11 @@ if("readapt") if(changeling.canrespec) changeling.readapt() + . = TRUE if("evolve") var/sting_name = params["name"] changeling.purchase_power(sting_name) + . = TRUE /datum/action/innate/cellular_emporium name = "Cellular Emporium" diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 521f70edcb1e3..644f0b6e2e27e 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -8,7 +8,7 @@ antagpanel_category = "Changeling" job_rank = ROLE_CHANGELING antag_moodlet = /datum/mood_event/focused - + hijack_speed = 0.5 var/you_are_greet = TRUE var/team_mode = FALSE //Should assign team objectives ? var/competitive_objectives = FALSE //Should we assign objectives in competition with other lings? @@ -192,6 +192,9 @@ if(!ishuman(owner.current)) to_chat(owner.current, "We can't remove our evolutions in this form!") return + if(isabsorbing) + to_chat(owner.current, "We cannot readapt right now!") + return if(canrespec) to_chat(owner.current, "We have removed our evolutions from this form, and are now ready to readapt.") reset_powers() @@ -275,6 +278,9 @@ prof.undershirt = H.undershirt prof.socks = H.socks + if(H.wear_id?.GetID()) + prof.id_icon = "hud[ckey(H.wear_id.GetJobName())]" + var/list/slots = list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store") for(var/slot in slots) if(slot in H.vars) @@ -358,9 +364,11 @@ to_chat(owner.current, "You are [changelingID], a changeling! You have absorbed and taken the form of a human.") to_chat(owner.current, "Use say \"[MODE_TOKEN_CHANGELING] message\" to communicate with your fellow changelings.") to_chat(owner.current, "You must complete the following tasks:") - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ling_aler.ogg', 100, FALSE, pressure_affected = FALSE) + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ling_aler.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) owner.announce_objectives() + owner.current.client?.tgui_panel?.give_antagonist_popup("Changeling", + "You have absorbed the form of [owner.current] and have infiltrated the station. Use your changeling powers to complete your objectives.") /datum/antagonist/changeling/farewell() to_chat(owner.current, "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!") @@ -499,6 +507,9 @@ var/undershirt var/socks + /// ID HUD icon associated with the profile + var/id_icon + /datum/changelingprofile/Destroy() qdel(dna) . = ..() @@ -517,7 +528,7 @@ newprofile.underwear = underwear newprofile.undershirt = undershirt newprofile.socks = socks - + newprofile.id_icon = id_icon /datum/antagonist/changeling/xenobio name = "Xenobio Changeling" diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm index dc886cb531b0b..4cdf3e9c94aa8 100644 --- a/code/modules/antagonists/changeling/changeling_power.dm +++ b/code/modules/antagonists/changeling/changeling_power.dm @@ -67,6 +67,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p return 0 if(c.trueabsorbs < req_absorbs) to_chat(user, "We require at least [req_absorbs] sample\s of DNA gained through our Absorb ability.") + return 0 if(req_stat < user.stat) to_chat(user, "We are incapacitated.") return 0 diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index da59421668048..71138e5a7da22 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -11,15 +11,16 @@ return var/mob/living/carbon/target = user.pulling var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + if(!target || !iscarbon(target)) + to_chat(user, "We must be grabbing a creature to absorb them!") + changeling.isabsorbing = FALSE + return if(changeling.isabsorbing) to_chat(user, "We are already absorbing!") return if(HAS_TRAIT(target, TRAIT_NODEATH)) to_chat(user, "We can't absorb this creature.") return - if(!user.pulling || !iscarbon(user.pulling)) - to_chat(user, "We must be grabbing a creature to absorb them!") - return if(user.grab_state <= GRAB_NECK) to_chat(user, "We must have a tighter grip to absorb this creature!") return @@ -123,9 +124,11 @@ if(target_ling)//If the target was a changeling, suck out their extra juice and objective points! to_chat(user, "[target] was one of us. We have absorbed their power.") target_ling.remove_changeling_powers() - changeling.geneticpoints += 2 + changeling.geneticpoints += round(target_ling.geneticpoints/2) target_ling.geneticpoints = 0 target_ling.canrespec = 0 + changeling.chem_storage += round(target_ling.chem_storage/2) + changeling.chem_charges += min(target_ling.chem_charges, changeling.chem_storage) target_ling.chem_charges = 0 target_ling.chem_storage = 0 changeling.absorbedcount += (target_ling.absorbedcount) diff --git a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm index eba49a665698f..521bb440c32b3 100644 --- a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm +++ b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm @@ -3,13 +3,22 @@ /datum/action/changeling/augmented_eyesight name = "Augmented Eyesight" - desc = "Creates more light sensing rods in our eyes, allowing our vision to penetrate most blocking objects." - helptext = "Grants us x-ray vision. We will become a lot more vulnerable to flash-based devices while x-ray vision is active." + desc = "Creates more light sensing rods in our eyes, allowing our vision to penetrate most blocking objects. Protects our vision from flashes while inactive." + helptext = "Grants us x-ray vision or flash protection. We will become a lot more vulnerable to flash-based devices while x-ray vision is active." button_icon_state = "augmented_eyesight" chemical_cost = 0 dna_cost = 2 //Would be 1 without thermal vision active = FALSE +/datum/action/changeling/augmented_eyesight/on_purchase(mob/user) //The ability starts inactive, so we should be protected from flashes. + ..() + var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) + if (E) + E.flash_protect = 2 //Adjust the user's eyes' flash protection. + to_chat(user, "We adjust our eyes to protect them from bright lights.") + else + to_chat(user, "We can't adjust our eyes if we don't have any!") + /datum/action/changeling/augmented_eyesight/sting_action(mob/living/carbon/human/user) if(!istype(user)) return @@ -23,8 +32,8 @@ 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 + E.flash_protect = 2 //Adjust the user's eyes' flash protection to_chat(user, "We adjust our eyes to protect them from bright lights.") - E.flash_protect = 0 active = FALSE user.update_sight() else diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index b5c4075830ab3..39378d9fbf4cd 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -4,8 +4,8 @@ helptext = "This is obvious to nearby people, and can destroy standard restraints and closets." button_icon_state = "biodegrade" chemical_cost = 30 //High cost to prevent spam - dna_cost = 2 - req_human = 1 + dna_cost = 1 + req_human = TRUE /datum/action/changeling/biodegrade/sting_action(mob/living/carbon/human/user) var/used = FALSE // only one form of shackles removed per use @@ -14,7 +14,7 @@ return 0 if(user.handcuffed) - var/obj/O = user.get_item_by_slot(SLOT_HANDCUFFED) + var/obj/O = user.get_item_by_slot(ITEM_SLOT_HANDCUFFED) if(!istype(O)) return 0 user.visible_message("[user] vomits a glob of acid on [user.p_their()] [O]!", \ @@ -24,7 +24,7 @@ used = TRUE if(user.wear_suit && user.wear_suit.breakouttime && !used) - var/obj/item/clothing/suit/S = user.get_item_by_slot(SLOT_WEAR_SUIT) + var/obj/item/clothing/suit/S = user.get_item_by_slot(ITEM_SLOT_OCLOTHING) if(!istype(S)) return 0 user.visible_message("[user] vomits a glob of acid across the front of [user.p_their()] [S]!", \ diff --git a/code/modules/antagonists/changeling/powers/digitalcamo.dm b/code/modules/antagonists/changeling/powers/digitalcamo.dm index c1d59608beced..4387a7c90964b 100644 --- a/code/modules/antagonists/changeling/powers/digitalcamo.dm +++ b/code/modules/antagonists/changeling/powers/digitalcamo.dm @@ -8,17 +8,17 @@ //Prevents AIs tracking you but makes you easily detectable to the human-eye. /datum/action/changeling/digitalcamo/sting_action(mob/user) ..() - if(user.digitalcamo) + if(HAS_TRAIT(user,TRAIT_DIGICAMO)) to_chat(user, "We return to normal.") - user.digitalinvis = 0 - user.digitalcamo = 0 + REMOVE_TRAIT(user, TRAIT_DIGICAMO, CHANGELING_TRAIT) + REMOVE_TRAIT(user, TRAIT_DIGINVIS, CHANGELING_TRAIT) else - to_chat(user, "We distort our form to hide from the AI.") - user.digitalcamo = 1 - user.digitalinvis = 1 + to_chat(user, "We distort our form to hide from the AI.") + ADD_TRAIT(user, TRAIT_DIGICAMO, CHANGELING_TRAIT) + ADD_TRAIT(user, TRAIT_DIGINVIS, CHANGELING_TRAIT) return TRUE /datum/action/changeling/digitalcamo/Remove(mob/user) - user.digitalcamo = FALSE - user.digitalinvis = FALSE + REMOVE_TRAIT(user, TRAIT_DIGICAMO, CHANGELING_TRAIT) + REMOVE_TRAIT(user, TRAIT_DIGINVIS, CHANGELING_TRAIT) ..() diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index 9b00f61e39f82..c9c52d8209789 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -23,9 +23,6 @@ to_chat(user, "We have revived ourselves.") else to_chat(user, "We begin our stasis, preparing energy to arise once more.") - if(user.stat != DEAD) - user.emote("deathgasp") - user.tod = station_time_timestamp() user.fakedeath("changeling") //play dead user.update_stat() user.update_mobility() diff --git a/code/modules/antagonists/changeling/powers/fleshmend.dm b/code/modules/antagonists/changeling/powers/fleshmend.dm index 6f3a3e2baad26..4bfb79ce67af0 100644 --- a/code/modules/antagonists/changeling/powers/fleshmend.dm +++ b/code/modules/antagonists/changeling/powers/fleshmend.dm @@ -1,34 +1,21 @@ /datum/action/changeling/fleshmend name = "Fleshmend" - desc = "We will passively heal our wounds. This is far more effective on bruises than on burns." - helptext = "If we are on fire, the healing effect will not function. Does not regrow limbs or restore lost blood. Functions while unconscious. Continued use slows chemical production" + desc = "Our flesh rapidly regenerates, healing our burns, bruises, and shortness of breath. Costs 25 chemicals." + helptext = "If we are on fire, the healing effect will not function. Does not regrow limbs or restore lost blood. Functions while unconscious." button_icon_state = "fleshmend" - chemical_cost = 0 + chemical_cost = 25 dna_cost = 2 req_stat = UNCONSCIOUS +//Starts healing you every second for 10 seconds. +//Can be used whilst unconscious. /datum/action/changeling/fleshmend/sting_action(mob/living/user) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) if(user.has_status_effect(STATUS_EFFECT_FLESHMEND)) - to_chat(user, "We stop fleshmending!") - user.remove_status_effect(STATUS_EFFECT_FLESHMEND) - changeling.chem_recharge_slowdown -= 0.5 + to_chat(user, "We are already fleshmending!") return ..() - to_chat(user, "We begin to heal passively.") + to_chat(user, "We begin to heal rapidly.") user.apply_status_effect(STATUS_EFFECT_FLESHMEND) - changeling.chem_recharge_slowdown += 0.5 return TRUE //Check buffs.dm for the fleshmend status effect code - -/datum/action/changeling/fleshmend/Remove(mob/user) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) - if(isliving(user)) - var/mob/living/L = user - if(L.has_status_effect(STATUS_EFFECT_FLESHMEND)) - to_chat(L, "We stop fleshmending!") - L.remove_status_effect(STATUS_EFFECT_FLESHMEND) - changeling.chem_recharge_slowdown -= 0.5 - return - ..() diff --git a/code/modules/antagonists/changeling/powers/gaseous_pores.dm b/code/modules/antagonists/changeling/powers/gaseous_pores.dm new file mode 100644 index 0000000000000..a4f28ef13154c --- /dev/null +++ b/code/modules/antagonists/changeling/powers/gaseous_pores.dm @@ -0,0 +1,39 @@ +/datum/action/changeling/gaseous_pores + name = "Gaseous Pores" + desc = "Our skins bursts, releasing somniferous gases to put opponents to sleep and cover our retreat." + helptext = "Our kind are immune to the gases internals are not necessary" + button_icon_state = "smoke" + chemical_cost = 35 + dna_cost = 2 + req_stat = UNCONSCIOUS + var/range = 4 + +/obj/effect/particle_effect/smoke/sleeping/changeling + color = "#9C3636" + lifetime = 10 + +/obj/effect/particle_effect/smoke/sleeping/changeling/smoke_mob(mob/living/carbon/M,datum/antagonist) + if(is_changeling(M)) + return FALSE + if(..()) + M.Sleeping(200) + INVOKE_ASYNC(M, /mob.proc/emote, "cough") + return TRUE + +/datum/effect_system/smoke_spread/sleeping/changeling + effect_type = /obj/effect/particle_effect/smoke/sleeping/changeling + +/datum/action/changeling/gaseous_pores/sting_action(mob/user) + ..() + user.visible_message("[user]'s skin begins to bubble!") + playsound(user, 'sound/machines/fryer/deep_fryer_1.ogg', 30, 1) + sleep(10) + var/turf/T = get_turf(user) + if(!T) + return FALSE + var/datum/effect_system/smoke_spread/sleeping/changeling/smoke = new(T) + smoke.set_up(range, T) + smoke.start() + user.visible_message("With a guttural screech, [user]'s skin bursts into gas!") + playsound(user, 'sound/voice/lizard/lizard_scream_1.ogg', 30, 1) + return TRUE diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm index 8f479667b92de..1b132ff00345b 100644 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ b/code/modules/antagonists/changeling/powers/headcrab.dm @@ -1,7 +1,7 @@ /datum/action/changeling/headcrab name = "Last Resort" - desc = "We sacrifice our current body in a moment of need, placing us in control of a vessel that can plant our likeness in a new host. Costs 20 chemicals." - helptext = "We will be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us." + desc = "We sacrifice our current body in a moment of need, placing us in control of a vessel that can plant our likeness in a new host. Cannot be used while being absorbed by another changeling. Costs 20 chemicals." + helptext = "We will be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us. Cannot be used while being absorbed by another changeling." button_icon_state = "last_resort" chemical_cost = 20 dna_cost = 0 @@ -11,6 +11,14 @@ /datum/action/changeling/headcrab/sting_action(mob/user) set waitfor = FALSE + if(isliving(user)) + var/mob/living/L = user + var/mob/living/puller = L.pulledby + if(puller) + var/datum/antagonist/changeling/other_ling = is_changeling(puller) + if(other_ling?.isabsorbing) + to_chat(user, "Our last resort is being disrupted by another changeling!") + return if(alert("Are we sure we wish to kill ourself and create a headslug?",,"Yes", "No") == "No") return ..() @@ -20,20 +28,25 @@ for(var/obj/item/organ/I in organs) I.Remove(user, 1) - for(var/mob/living/carbon/human/H in range(2,user)) - var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) - to_chat(H, "You are blinded by a shower of blood!") - H.Stun(20) - H.blur_eyes(20) - eyes?.applyOrganDamage(5) - H.confused += 10 - for(var/mob/living/silicon/S in range(2,user)) - to_chat(S, "Your sensors are disabled by a shower of blood!") - S.Paralyze(60) + for(var/mob/living/A in view(2,user)) + if(ishuman(A)) + var/mob/living/carbon/human/H = A + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) + to_chat(H, "You are blinded by a shower of blood!") + H.Stun(20) + H.blur_eyes(20) + eyes?.applyOrganDamage(5) + H.confused += 10 + else if(issilicon(A)) + var/mob/living/silicon/S = A + to_chat(S, "Your sensors are disabled by a shower of blood!") + S.Paralyze(60) var/turf = get_turf(user) + // Headcrab transformation is *very* unique; origin mob death happens *before* resulting mob's creation. Action removal should happen beforehand. + for(var/datum/action/cp in user.actions) + cp.Remove(user) user.gib() . = TRUE - sleep(8) // So it's not killed in explosion var/mob/living/simple_animal/hostile/headcrab/crab = new(turf) for(var/obj/item/organ/I in organs) I.forceMove(crab) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 77eec38d832ed..c101da7e6e32e 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -105,10 +105,7 @@ return 1 /datum/action/changeling/suit/Remove(mob/user) - if(!ishuman(user)) - return - var/mob/living/carbon/human/H = user - check_suit(H) + check_suit(user) ..() /datum/action/changeling/suit/sting_action(mob/living/carbon/human/user) @@ -122,8 +119,8 @@ user.dropItemToGround(user.head) user.dropItemToGround(user.wear_suit) - user.equip_to_slot_if_possible(new suit_type(user), SLOT_WEAR_SUIT, 1, 1, 1) - user.equip_to_slot_if_possible(new helmet_type(user), SLOT_HEAD, 1, 1, 1) + user.equip_to_slot_if_possible(new suit_type(user), ITEM_SLOT_OCLOTHING, 1, 1, 1) + user.equip_to_slot_if_possible(new helmet_type(user), ITEM_SLOT_HEAD, 1, 1, 1) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) changeling.chem_recharge_slowdown += recharge_slowdown @@ -403,11 +400,11 @@ \***************************************/ /datum/action/changeling/suit/organic_space_suit name = "Organic Space Suit" - desc = "We grow an organic suit to protect ourselves from space exposure. Costs 20 chemicals." - helptext = "We must constantly repair our form to make it space-proof, reducing chemical production while we are protected. Cannot be used in lesser form." + desc = "We grow an organic suit to protect ourselves from space exposure and is lightly armoured. Costs 20 chemicals." + helptext = "We must constantly repair our form to make it armored and space-proof, reducing chemical production while we are protected. Cannot be used in Lesser Form." button_icon_state = "organic_suit" chemical_cost = 20 - dna_cost = 2 + dna_cost = 1 req_human = 1 suit_type = /obj/item/clothing/suit/space/changeling @@ -420,11 +417,12 @@ /obj/item/clothing/suit/space/changeling name = "flesh mass" icon_state = "lingspacesuit" - desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel." + desc = "A huge, bulky mass of armored pressure and temperature-resistant organic tissue, evolved to facilitate space travel and protect from close range threats." item_flags = DROPDEL clothing_flags = STOPSPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) //No armor at all. + armor = list("melee" = 35, "bullet" = 25, "laser" = 25,"energy" = 30, "bomb" = 30, "bio" = 20, "rad" = 20, "fire" = 90, "acid" = 90, "stamina" = 10)//Bit less armoured than the Syndicate space suit + slowdown = 0.2 /obj/item/clothing/suit/space/changeling/Initialize() . = ..() @@ -433,18 +431,18 @@ loc.visible_message("[loc.name]\'s flesh rapidly inflates, forming a bloated mass around [loc.p_their()] body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!") START_PROCESSING(SSobj, src) -/obj/item/clothing/suit/space/changeling/process() +/obj/item/clothing/suit/space/changeling/process(delta_time) if(ishuman(loc)) var/mob/living/carbon/human/H = loc - H.reagents.add_reagent(/datum/reagent/medicine/salbutamol, REAGENTS_METABOLISM) + H.reagents.add_reagent(/datum/reagent/medicine/salbutamol, REAGENTS_METABOLISM * (delta_time / SSMOBS_DT)) /obj/item/clothing/head/helmet/space/changeling name = "flesh mass" icon_state = "lingspacehelmet" - desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front." + desc = "A covering of armored pressure and temperature-resistant organic tissue with a glass-like chitin front." item_flags = DROPDEL clothing_flags = STOPSPRESSUREDAMAGE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list("melee" = 35, "bullet" = 25, "laser" = 25,"energy" = 30, "bomb" = 30, "bio" = 20, "rad" = 20, "fire" = 90, "acid" = 90, "stamina" = 10) flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH /obj/item/clothing/head/helmet/space/changeling/Initialize() @@ -476,7 +474,7 @@ icon_state = "lingarmor" item_flags = DROPDEL body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list("melee" = 25, "bullet" = 25, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 25, "acid" = 25) + armor = list("melee" = 40, "bullet" = 40, "laser" = 50, "energy" = 50, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 25, "acid" = 25, "stamina" = 30) flags_inv = HIDEJUMPSUIT cold_protection = 0 heat_protection = 0 @@ -494,7 +492,7 @@ desc = "A tough, hard covering of black chitin with transparent chitin in front." icon_state = "lingarmorhelmet" item_flags = DROPDEL - armor = list("melee" = 25, "bullet" = 25, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 25, "acid" = 25) + armor = list("melee" = 40, "bullet" = 40, "laser" = 50, "energy" = 50, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 25, "acid" = 25, "stamina" = 30) flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE /obj/item/clothing/head/helmet/changeling/Initialize() diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index dd38a98e98f86..4b91eaff2cf3d 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -1,5 +1,5 @@ /datum/action/changeling/panacea - name = "Total purge" + name = "Total Purge" desc = "Expels impurities in our form, causing us to heal toxin damage, expel all chemicals, curing most diseases, brain damage, and traumas and resetting our genetic code completely. Costs 20 chemicals." helptext = "Obvious when used, as it sprays all reagents out in a violent manner. Can be used while unconscious." button_icon_state = "panacea" @@ -26,12 +26,17 @@ C.vomit(0, toxic = TRUE) O.forceMove(get_turf(user)) - var/obj/effect/sweatsplash/S = new(user.loc) - for(var/datum/reagent/R in user.reagents.reagent_list) //Not just toxins! - var/amount = R.volume - user.reagents.remove_reagent(R.type, amount) - S.reagents.add_reagent(R.type, amount) - S.splash() + if(isoozeling(user)) + for(var/datum/reagent/R in user.reagents.reagent_list) + var/thisamount = user.reagents.get_reagent_amount(R.type) + user.reagents.remove_reagent(R.type, thisamount) + else + var/obj/effect/sweatsplash/S = new(user.loc) + for(var/datum/reagent/R in user.reagents.reagent_list) //Not just toxins! + var/amount = R.volume + user.reagents.remove_reagent(R.type, amount) + S.reagents.add_reagent(R.type, amount) + S.splash() user.reagents.add_reagent(/datum/reagent/medicine/mutadone, 1) if(iscarbon(user)) @@ -42,11 +47,11 @@ L.cure_all_traumas(TRAUMA_RESILIENCE_SURGERY) for(var/thing in L.diseases) var/datum/disease/D = thing - if(D.severity == DISEASE_SEVERITY_POSITIVE || D.severity == DISEASE_SEVERITY_BENEFICIAL || D.spread_flags == DISEASE_SPREAD_SPECIAL) + if(D.danger == DISEASE_POSITIVE || D.danger == DISEASE_BENEFICIAL || D.spread_flags == DISEASE_SPREAD_SPECIAL) continue if(D in subtypesof(/datum/disease/advance)) var/datum/disease/advance/A = D - if(A.properties["resistance"] >= 12) + if(A.resistance >= 12) continue D.cure(FALSE) return TRUE diff --git a/code/modules/antagonists/changeling/powers/pheromone_receptors.dm b/code/modules/antagonists/changeling/powers/pheromone_receptors.dm deleted file mode 100644 index 92184d4829971..0000000000000 --- a/code/modules/antagonists/changeling/powers/pheromone_receptors.dm +++ /dev/null @@ -1,55 +0,0 @@ -#define CHANGELING_PHEROMONE_MIN_DISTANCE 10 //More generous than the agent pinpointer because you don't know who you're looking for. -#define CHANGELING_PHEROMONE_MAX_DISTANCE 25 //They can smell your fear a mile away. Well, 50 meters. -#define CHANGELING_PHEROMONE_PING_TIME 20 //2s update time. - - -/datum/action/changeling/pheromone_receptors - name = "Pheromone Receptors" - desc = "We attune our senses to track other changelings by scent. The closer they are, the easier we can find them." - helptext = "We will know the general direction of nearby changelings, with closer scents being stronger. This ability is passive, and costs no chemicals." - chemical_cost = 0 - dna_cost = 2 - var/receptors_active = FALSE - -/datum/action/changeling/pheromone_receptors/on_purchase(mob/user) - .=..() - var/mob/living/carbon/C = user - to_chat(user, "We search for the scent of any nearby changelings.") - C.apply_status_effect(/datum/status_effect/agent_pinpointer/changeling) - -/datum/action/changeling/pheromone_receptors/Remove(mob/user) - .=..() - var/mob/living/carbon/C = user - C.remove_status_effect(/datum/status_effect/agent_pinpointer/changeling) - -//Modified IA pinpointer - Points to the NEAREST changeling, but will only get you within a few tiles of the target. -//You'll still have to rely on intuition and observation to make the identification. Lings can 'hide' in public places. -/datum/status_effect/agent_pinpointer/changeling - alert_type = /obj/screen/alert/status_effect/agent_pinpointer/changeling - minimum_range = CHANGELING_PHEROMONE_MIN_DISTANCE - tick_interval = CHANGELING_PHEROMONE_PING_TIME - range_fuzz_factor = 0 - -/datum/status_effect/agent_pinpointer/changeling/scan_for_target() - var/turf/my_loc = get_turf(owner) - - var/list/mob/living/carbon/changelings = list() - - for(var/mob/living/carbon/C in GLOB.alive_mob_list) - if(C != owner && C.mind) - var/datum/antagonist/changeling/antag_datum = C.mind.has_antag_datum(/datum/antagonist/changeling) - if(istype(antag_datum)) - var/their_loc = get_turf(C) - var/distance = get_dist_euclidian(my_loc, their_loc) - if (distance < CHANGELING_PHEROMONE_MAX_DISTANCE) - changelings[C] = (CHANGELING_PHEROMONE_MAX_DISTANCE ** 2) - (distance ** 2) - - if(changelings.len) - scan_target = pickweight(changelings) //Point at a 'random' changeling, biasing heavily towards closer ones. - else - scan_target = null - - -/obj/screen/alert/status_effect/agent_pinpointer/changeling - name = "Pheromone Scent" - desc = "The nose always knows." diff --git a/code/modules/antagonists/changeling/powers/regenerate.dm b/code/modules/antagonists/changeling/powers/regenerate.dm index 1c4f1298d4252..2288042c2ecb6 100644 --- a/code/modules/antagonists/changeling/powers/regenerate.dm +++ b/code/modules/antagonists/changeling/powers/regenerate.dm @@ -46,7 +46,7 @@ helptext = "We reform one of our limbs as an autonomous snake-like creature. This grotesque display may ward off attackers, and the creature will inject them with incapacitating poison." button_icon_state = "limbsnake" chemical_cost = 15 - dna_cost = 1 + dna_cost = 2 req_human = TRUE req_stat = DEAD ignores_fakedeath = TRUE @@ -71,7 +71,7 @@ //text message C.visible_message("[user]'s [BP] detaches itself and takes the form of a snake!", "Our [BP] forms into a horrifying snake and heads towards our attackers!") - BP.set_disabled(TRUE) + BP.dismember() BP.Destroy() C.update_mobility() //Deploy limbsnake @@ -85,7 +85,7 @@ desc = "This is no snake at all! It looks like someone's limb grew fangs out of it's fingers and it's out to bite anyone!" icon_state = "snake" icon_living = "snake" - del_on_death = 1 + del_on_death = TRUE speak_emote = list("gargles") health = 50 maxHealth = 50 @@ -101,7 +101,9 @@ mob_biotypes = list(MOB_ORGANIC, MOB_BEAST) obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE - mobsay_color = "#26F55A" + chat_color = "#26F55A" + mobchatspan = "chaplain" faction = list("hostile","creature") poison_per_bite = 4 - poison_type = /datum/reagent/toxin/staminatoxin \ No newline at end of file + poison_type = /datum/reagent/toxin/staminatoxin + discovery_points = 1000 diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index f895e8896c750..18e2439320354 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -10,7 +10,7 @@ //A flashy ability, good for crowd control and sowing chaos. /datum/action/changeling/resonant_shriek/sting_action(mob/user) ..() - for(var/mob/living/M in get_hearers_in_view(4, user)) + for(var/mob/living/M in hearers(4, user)) if(iscarbon(M) && M.get_ear_protection() <= 0) var/mob/living/carbon/C = M if(!C.mind || !C.mind.has_antag_datum(/datum/antagonist/changeling)) diff --git a/code/modules/antagonists/changeling/powers/teratoma.dm b/code/modules/antagonists/changeling/powers/teratoma.dm index fd6ef1c442f70..482ac09834b0c 100644 --- a/code/modules/antagonists/changeling/powers/teratoma.dm +++ b/code/modules/antagonists/changeling/powers/teratoma.dm @@ -7,14 +7,32 @@ dna_cost = 2 req_absorbs = 3 -//Makes a single egg, which hatches into a reskinned monkey with an objective to cause chaos after some time. +//Reskinned monkey - teratoma, will burst out of the host, with the objective to cause chaos. /datum/action/changeling/teratoma/sting_action(mob/user) ..() - new /obj/effect/gibspawner/generic(user.loc) - var/obj/effect/mob_spawn/teratomamonkey/teratoma = new(user.loc) - user.visible_message("[teratoma] explodes out of [user]'s body in a shower of gore!", - "You expel a clump of flesh, which will soon become a vile creature bent on causing chaos.") - teratoma.flavour_text = {" - You are a living teratoma, birthed from an inhuman host. Your purpose is to cause chaos and misery for the beings inhabiting this station. - "} - return TRUE \ No newline at end of file + if(create_teratoma(user)) + var/mob/living/U = user + playsound(user.loc, 'sound/effects/blobattack.ogg', 50, 1) + U.spawn_gibs() + user.visible_message("Something horrible bursts out of [user]'s chest!", \ + "Living teratoma bursts out of your chest!", \ + "You hear flesh tearing!", COMBAT_MESSAGE_RANGE) + return FALSE //create_teratoma() handles the chemicals anyway so there is no reason to take them again + +/datum/action/changeling/teratoma/proc/create_teratoma(mob/user) + var/datum/antagonist/changeling/c = user.mind.has_antag_datum(/datum/antagonist/changeling) + c.chem_charges -= chemical_cost //I'm taking your chemicals hostage! + var/turf/A = get_turf(user) + var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as a living teratoma?", ROLE_TERATOMA, null, ROLE_TERATOMA, 5 SECONDS) //players must answer rapidly + if(!LAZYLEN(candidates)) //if we got at least one candidate, they're teratoma now + to_chat(usr, "You fail at creating a tumor. Perhaps you should try again later?") + c.chem_charges += chemical_cost //If it fails we want to refund the chemicals + return FALSE + var/mob/living/carbon/monkey/tumor/T = new /mob/living/carbon/monkey/tumor(A) + var/mob/dead/observer/C = pick(candidates) + T.key = C.key + var/datum/antagonist/teratoma/D = new + T.mind.add_antag_datum(D) + to_chat(T, "You burst out from [user]'s chest!
") + SEND_SOUND(T, sound('sound/effects/blobattack.ogg')) + return TRUE diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 9cedad4f1df20..629ecf64fbe0d 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -49,7 +49,7 @@ return if(!isturf(user.loc)) return - if(!AStar(user, target.loc, /turf/proc/Distance, changeling.sting_range, simulated_only = FALSE)) + if(!length(get_path_to(user, target, max_distance = changeling.sting_range, simulated_only = FALSE))) return if(target.mind && target.mind.has_antag_datum(/datum/antagonist/changeling)) sting_feedback(user, target) @@ -61,7 +61,7 @@ return to_chat(user, "We stealthily sting [target.name].") if((target.mind && target.mind.has_antag_datum(/datum/antagonist/changeling)) || !stealthy) - to_chat(target, "You feel a tiny prick.") + to_chat(target, "You feel a tiny prick!") return 1 @@ -108,7 +108,7 @@ C.real_name = NewDNA.real_name NewDNA.transfer_identity(C) if(ismonkey(C)) - C.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) + C.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG | TR_KEEPAI) C.updateappearance(mutcolor_update=1) diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm index e04e10d9e4f75..6d6d54c42d77f 100644 --- a/code/modules/antagonists/changeling/powers/transform.dm +++ b/code/modules/antagonists/changeling/powers/transform.dm @@ -10,10 +10,6 @@ /obj/item/clothing/glasses/changeling name = "flesh" -/obj/item/clothing/glasses/changeling/Initialize() - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) - //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/glasses/changeling/attack_hand(mob/user) if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) @@ -25,10 +21,6 @@ /obj/item/clothing/under/changeling name = "flesh" -/obj/item/clothing/under/changeling/Initialize() - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) - //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/under/changeling/attack_hand(mob/user) if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) @@ -41,10 +33,6 @@ name = "flesh" allowed = list(/obj/item/changeling) -/obj/item/clothing/suit/changeling/Initialize() - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) - //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/suit/changeling/attack_hand(mob/user) if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) @@ -56,10 +44,6 @@ /obj/item/clothing/head/changeling name = "flesh" -/obj/item/clothing/head/changeling/Initialize() - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) - //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/head/changeling/attack_hand(mob/user) if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) @@ -71,10 +55,6 @@ /obj/item/clothing/shoes/changeling name = "flesh" -/obj/item/clothing/shoes/changeling/Initialize() - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) - //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/shoes/changeling/attack_hand(mob/user) if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) @@ -86,10 +66,6 @@ /obj/item/clothing/gloves/changeling name = "flesh" -/obj/item/clothing/gloves/changeling/Initialize() - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) - //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/gloves/changeling/attack_hand(mob/user) if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) @@ -101,10 +77,6 @@ /obj/item/clothing/mask/changeling name = "flesh" -/obj/item/clothing/mask/changeling/Initialize() - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) - //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/mask/changeling/attack_hand(mob/user) if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) @@ -117,19 +89,45 @@ name = "flesh" slot_flags = ALL allowed = list(/obj/item/changeling) - -/obj/item/changeling/Initialize() - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) + item_flags = DROPDEL //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/changeling/attack_hand(mob/user) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) - to_chat(user, "You reabsorb [src] into your body.") + if(loc == user) + if(user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + to_chat(user, "You reabsorb [src] into your body.") + else + to_chat(user, "[src] vanishes, it was just an illusion!") qdel(src) return . = ..() +/obj/item/changeling/id + slot_flags = ITEM_SLOT_ID + /// Cached flat icon of the ID + var/icon/cached_flat_icon + /// HUD job icon of the ID + var/hud_icon + +/obj/item/changeling/id/equipped(mob/user, slot, initial) + . = ..() + if(hud_icon) + var/image/holder = user.hud_list[ID_HUD] + var/icon/I = icon(user.icon, user.icon_state, user.dir) + holder.pixel_y = I.Height() - world.icon_size + holder.icon_state = hud_icon + +/** + * Returns cached flat icon of the ID, creates one if there is not one already cached + */ +/obj/item/changeling/id/proc/get_cached_flat_icon() + if(!cached_flat_icon) + cached_flat_icon = getFlatIcon(src) + return cached_flat_icon + +/obj/item/changeling/id/get_examine_string(mob/user, thats = FALSE) + return "[icon2html(get_cached_flat_icon(), user)] [thats? "That's ":""][get_examine_name(user)]" //displays all overlays in chat + //Change our DNA to that of somebody we've absorbed. /datum/action/changeling/transform/sting_action(mob/living/carbon/human/user) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) diff --git a/code/modules/antagonists/changeling/teratoma.dm b/code/modules/antagonists/changeling/teratoma.dm new file mode 100644 index 0000000000000..e304ae4383c15 --- /dev/null +++ b/code/modules/antagonists/changeling/teratoma.dm @@ -0,0 +1,52 @@ +/datum/antagonist/teratoma + name = "Teratoma" + roundend_category = "other" + antagpanel_category = "Changeling" + job_rank = ROLE_TERATOMA + +/datum/antagonist/teratoma/on_gain() + owner.special_role = "Teratoma" + var/datum/objective/chaos/C = new + add_objective(C) + ..() + +/datum/antagonist/teratoma/greet() + to_chat(owner, "You are a living tumor. By all accounts, you should not exist.") + to_chat(owner, "Spread misery and chaos upon the station.") + +/datum/antagonist/teratoma/on_removal() + owner.special_role = null + . = ..() + +/datum/antagonist/teratoma/proc/add_objective(datum/objective/O) + objectives += O + log_objective(owner, O.explanation_text) + +/datum/antagonist/teratoma/proc/remove_objective(datum/objective/O) + objectives -= O + +/datum/antagonist/teratoma/admin_remove(mob/admin) + var/mob/living/carbon/monkey/tumor/M = owner.current + if(alert(admin, "Humanize?", "Humanize", "Yes", "No") == "Yes") + M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) + . = ..() + +/datum/antagonist/teratoma/admin_add(datum/mind/new_owner, mob/admin) + var/mob/living/carbon/human/H = new_owner.current + if(alert(admin, "Teratomize?", "Teratomize", "Yes", "No") == "Yes") + H.teratomize() + new_owner.add_antag_datum(src) + log_admin("[key_name(admin)] made [key_name(new_owner)] a living teratoma!") + message_admins("[key_name_admin(admin)] made [key_name_admin(new_owner)] a living teratoma!") + +//Mainttoma + +/datum/antagonist/teratoma/hugbox + name = "Maintenance Teratoma" + roundend_category = "other" + antagpanel_category = "Changeling" + job_rank = ROLE_TERATOMA + +/datum/antagonist/teratoma/hugbox/greet() + ..() + to_chat(owner, "Avoid killing unprovoked, kill only in self defense!") diff --git a/code/modules/antagonists/clock_cult/clockwork_massive.dm b/code/modules/antagonists/clock_cult/clockwork_massive.dm index 586a2feea2b71..3b1e28d5875f4 100644 --- a/code/modules/antagonists/clock_cult/clockwork_massive.dm +++ b/code/modules/antagonists/clock_cult/clockwork_massive.dm @@ -1,8 +1,11 @@ GLOBAL_LIST_INIT(clockwork_portals, list()) /obj/structure/destructible/clockwork/massive/celestial_gateway - name = "ark of the Clockwork Justicar" - max_integrity = 400 + name = "\improper Ark of the Clockwork Justiciar" + desc = "A massive, hulking amalgamation of parts. It seems to be maintaining a very unstable bluespace anomaly." + clockwork_desc = "Nezbere's magnum opus: a hulking clockwork machine capable of combining bluespace and steam power to summon Ratvar. Once activated, \ + its instability will cause one-way bluespace rifts to open across the station to the City of Cogs, so be prepared to defend it at all costs." + max_integrity = 1000 icon = 'icons/effects/96x96.dmi' icon_state = "clockwork_gateway_components" pixel_x = -32 @@ -30,7 +33,7 @@ GLOBAL_LIST_INIT(clockwork_portals, list()) return destroyed = TRUE hierophant_message("The Ark has been destroyed, Reebe is becomming unstable!", null, "") - for(var/mob/living/M in GLOB.mob_list) + for(var/mob/living/M in GLOB.player_list) if(!is_reebe(M.z)) continue if(is_servant_of_ratvar(M)) @@ -43,6 +46,9 @@ GLOBAL_LIST_INIT(clockwork_portals, list()) M.forceMove(safe_place) STOP_PROCESSING(SSobj, src) . = ..() + INVOKE_ASYNC(src, .proc/explode_reebe) + +/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/explode_reebe() for(var/i in 1 to 30) explosion(pick(get_area_turfs(/area/reebe/city_of_cogs)), 0, 2, 4, 4, FALSE) sleep(5) @@ -55,8 +61,8 @@ GLOBAL_LIST_INIT(clockwork_portals, list()) else . += "It doesn't seem to be doing much right now, maybe one day it will serve its purpose." -/obj/structure/destructible/clockwork/massive/celestial_gateway/process() - if(prob(10)) +/obj/structure/destructible/clockwork/massive/celestial_gateway/process(delta_time) + if(DT_PROB(10, delta_time)) to_chat(world, pick(phase_messages)) /obj/structure/destructible/clockwork/massive/celestial_gateway/deconstruct(disassembled = TRUE) @@ -67,7 +73,7 @@ GLOBAL_LIST_INIT(clockwork_portals, list()) sound_to_playing_players(volume = 50, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_disrupted.ogg')) for(var/mob/M in GLOB.player_list) var/turf/T = get_turf(M) - if((T && T.z == z) || is_servant_of_ratvar(M)) + if((T && T.get_virtual_z_level() == get_virtual_z_level()) || is_servant_of_ratvar(M)) M.playsound_local(M, 'sound/machines/clockcult/ark_deathrattle.ogg', 100, FALSE, pressure_affected = FALSE) sleep(27) explosion(src, 1, 3, 8, 8) @@ -120,13 +126,14 @@ GLOBAL_LIST_INIT(clockwork_portals, list()) activated = TRUE set_security_level(SEC_LEVEL_DELTA) mass_recall(TRUE) - addtimer(CALLBACK(src, .proc/begin_assault), 1800) + var/grace_time = GLOB.narsie_breaching ? 0 : 1800 + addtimer(CALLBACK(src, .proc/begin_assault), grace_time) priority_announce("Massive [Gibberish("bluespace", 100)] anomaly detected on all frequencies. All crew are directed to \ @!$, [text2ratvar("PURGE ALL UNTRUTHS")] <&. the anomalies and destroy their source to prevent further damage to corporate property. This is \ - not a drill.[grace_period ? " Estimated time of appearance: [grace_period] seconds. Use this time to prepare for an attack on [station_name()]." : ""]"\ + not a drill.[grace_period ? " Estimated time of appearance: [grace_time/10] seconds. Use this time to prepare for an attack on [station_name()]." : ""]"\ ,"Central Command Higher Dimensional Affairs", 'sound/magic/clockwork/ark_activation.ogg') sound_to_playing_players(volume = 10, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_charging.ogg', TRUE)) - GLOB.ratvar_arrival_tick = world.time + 6000+1800 + GLOB.ratvar_arrival_tick = world.time + 6000 + grace_time /obj/structure/destructible/clockwork/massive/celestial_gateway/proc/mass_recall(add_overlay = FALSE) var/list/spawns = GLOB.servant_spawns.Copy() @@ -149,13 +156,10 @@ GLOBAL_LIST_INIT(clockwork_portals, list()) priority_announce("Space-time anomalies detected near the station. Source determined to be a temporal \ energy pulse emanating from J1523-215. All crew are to enter [text2ratvar("prep#re %o di%")]\ and destroy the [text2ratvar("I'd like to see you try")], which has been determined to be the source of the \ - pulse to prevent mass damage to Nanotrasen property.", "Anomaly Alert", 'sound/ai/spanomalies.ogg') - var/list/pick_turfs = list() - for(var/turf/open/floor/T in world) - if(is_station_level(T.z)) - pick_turfs += T + pulse to prevent mass damage to Nanotrasen property.", "Anomaly Alert", ANNOUNCER_SPANOMALIES) + for(var/i in 1 to 100) - var/turf/T = pick(pick_turfs) + var/turf/T = get_random_station_turf() GLOB.clockwork_portals += new /obj/effect/portal/wormhole/clockcult(T, null, 0, null, FALSE) addtimer(CALLBACK(src, .proc/begin_activation), 2400) @@ -200,39 +204,66 @@ GLOBAL_LIST_INIT(clockwork_portals, list()) QDEL_IN(src, 3) sleep(3) var/turf/center_station = SSmapping.get_station_center() - flee_reebe(TRUE) new /obj/singularity/ratvar(center_station) + if(GLOB.narsie_breaching) + new /obj/singularity/narsie/large/cult(GLOB.narsie_arrival) + flee_reebe(TRUE) //=========Ratvar========== +GLOBAL_VAR(cult_ratvar) + /obj/singularity/ratvar name = "ratvar, the Clockwork Justicar" desc = "Oh, that's ratvar!" icon = 'icons/effects/512x512.dmi' icon_state = "ratvar" + is_real = FALSE density = FALSE current_size = STAGE_SIX allowed_size = STAGE_SIX pixel_x = -236 pixel_y = -256 var/range = 1 + var/ratvar_target + var/next_attack_tick /obj/singularity/ratvar/Initialize(mapload, starting_energy = 50) log_game("!!! RATVAR HAS RISEN. !!!") + GLOB.cult_ratvar = src . = ..() desc = "[text2ratvar("That's Ratvar, the Clockwork Justicar. The great one has risen.")]" SEND_SOUND(world, 'sound/effects/ratvar_reveal.ogg') to_chat(world, "The bluespace veil gives way to Ratvar, his light shall shine upon all mortals!") - trigger_clockcult_victory(src) UnregisterSignal(src, COMSIG_ATOM_BSA_BEAM) + INVOKE_ASYNC(GLOBAL_PROC, /proc/trigger_clockcult_victory, src) + check_gods_battle() //tasty -/obj/singularity/ratvar/process() - move() +/obj/singularity/ratvar/process(delta_time) eat() + if(ratvar_target) + target = ratvar_target + if(get_dist(src, ratvar_target) < 5) + if(next_attack_tick < world.time) + next_attack_tick = world.time + rand(50, 100) + to_chat(world, "[pick("Reality shudders around you.","You hear the tearing of flesh.","The sound of bones cracking fills the air.")]") + SEND_SOUND(world, 'sound/magic/clockwork/ratvar_attack.ogg') + SpinAnimation(4, 0) + for(var/mob/living/M in GLOB.player_list) + shake_camera(M, 25, 6) + M.Knockdown(5 * delta_time) + if(prob(max(GLOB.servants_of_ratvar.len/2, 15))) + SEND_SOUND(world, 'sound/magic/demon_dies.ogg') + to_chat(world, "You were a fool for underestimating me...") + qdel(ratvar_target) + for(var/datum/mind/M as() in SSticker.mode?.cult) + to_chat(M, "You feel a stabbing pain in your chest... This can't be happening!") + M.current?.dust() + return + move() /obj/singularity/ratvar/eat() - for(var/tile in spiral_range_turfs(range, src)) - var/turf/T = tile + for(var/turf/T as() in spiral_range_turfs(range, src)) if(!T || !isturf(loc)) continue T.ratvar_act() diff --git a/code/modules/antagonists/clock_cult/clockwork_outfits.dm b/code/modules/antagonists/clock_cult/clockwork_outfits.dm index 4f2ccbd2a51d2..435062b9bb029 100644 --- a/code/modules/antagonists/clock_cult/clockwork_outfits.dm +++ b/code/modules/antagonists/clock_cult/clockwork_outfits.dm @@ -16,22 +16,27 @@ var/weapon_to_spawn = new weapon(get_turf(H)) H.put_in_inactive_hand(weapon_to_spawn) +/datum/outfit/clockcult_plasmaman + name = "Servant of Ratvar Plasmaman" + head = /obj/item/clothing/head/chameleon/envirohelm/ratvar + uniform = /obj/item/clothing/under/chameleon/envirosuit/ratvar + /datum/outfit/clockcult/armaments name = "Servant of Ratvar - Armaments" suit = /obj/item/clothing/suit/clockwork - weapon = /obj/item/twohanded/clockwork/brass_spear + weapon = /obj/item/clockwork/weapon/brass_spear head = /obj/item/clothing/head/helmet/clockcult shoes = /obj/item/clothing/shoes/clockcult gloves = /obj/item/clothing/gloves/clockcult /datum/outfit/clockcult/armaments/hammer name = "Servant of Ratvar - Armaments (hammer)" - weapon = /obj/item/twohanded/clockwork/brass_battlehammer + weapon = /obj/item/clockwork/weapon/brass_battlehammer /datum/outfit/clockcult/armaments/sword name = "Servant of Ratvar - Armaments (sword)" - weapon = /obj/item/twohanded/clockwork/brass_sword + weapon = /obj/item/clockwork/weapon/brass_sword /datum/outfit/clockcult/armaments/bow name = "Servant of Ratvar - Armaments (sword)" diff --git a/code/modules/antagonists/clock_cult/clockwork_turfs.dm b/code/modules/antagonists/clock_cult/clockwork_turfs.dm index 68c10e16c60f7..7ed8d25dd5c12 100644 --- a/code/modules/antagonists/clock_cult/clockwork_turfs.dm +++ b/code/modules/antagonists/clock_cult/clockwork_turfs.dm @@ -46,6 +46,7 @@ baseturfs = /turf/open/floor/clockwork/reebe var/obj/effect/clockwork/overlay/wall/realappearence var/d_state = INTACT + flags_1 = NOJAUNT_1 /turf/closed/wall/clockwork/Initialize() . = ..() @@ -122,6 +123,9 @@ if(COG_EXPOSED) return "The inner plating has been screwed open. The exterior plating could be easily pried out." +/turf/closed/wall/clockwork/try_destroy(obj/item/I, mob/user, turf/T) + return FALSE + /turf/closed/wall/clockwork/try_decon(obj/item/I, mob/user, turf/T) if(I.tool_behaviour != TOOL_WELDER) return 0 @@ -242,10 +246,6 @@ planetary_atmos = TRUE var/list/heal_people -/turf/open/floor/clockwork/reebe/Initialize() - . = ..() - heal_people = list() - /turf/open/floor/clockwork/reebe/Destroy() if(LAZYLEN(heal_people)) STOP_PROCESSING(SSprocessing, src) @@ -257,18 +257,18 @@ if(istype(M) && is_servant_of_ratvar(M)) if(!LAZYLEN(heal_people)) START_PROCESSING(SSprocessing, src) - heal_people += M + LAZYADD(heal_people, M) /turf/open/floor/clockwork/reebe/Exited(atom/movable/A, atom/newloc) . = ..() if(A in heal_people) - heal_people -= A + LAZYREMOVE(heal_people, A) if(!LAZYLEN(heal_people)) STOP_PROCESSING(SSprocessing, src) -/turf/open/floor/clockwork/reebe/process() +/turf/open/floor/clockwork/reebe/process(delta_time) for(var/mob/living/M in heal_people) - M.adjustToxLoss(-2, forced=TRUE) + M.adjustToxLoss(-1 * delta_time, forced=TRUE) //================================================= //Clockwork Lattice: It's a lattice for the ratvar @@ -337,6 +337,7 @@ desc = "A massive cogwheel set into two heavy slabs of brass. Contains tiny vents for allowing the flow of pressure." icon = 'icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi' overlays_file = 'icons/obj/doors/airlocks/clockwork/overlays.dmi' + anim_parts = "left=-13,0;right=13,0" hackProof = TRUE aiControlDisabled = 1 req_access = list(ACCESS_CLOCKCULT) @@ -347,6 +348,7 @@ air_tight = FALSE CanAtmosPass = ATMOS_PASS_YES var/construction_state = GEAR_SECURE //Pinion airlocks have custom deconstruction + allow_repaint = FALSE /obj/machinery/door/airlock/clockwork/Initialize() . = ..() @@ -455,10 +457,16 @@ desc = "You shall not pass." icon = 'icons/effects/clockwork_effects.dmi' icon_state = "servant_blocker" + anchored = TRUE /obj/effect/clockwork/servant_blocker/CanPass(atom/movable/mover, turf/target) - if(is_servant_of_ratvar(mover)) - return FALSE + if(ismob(mover)) + var/mob/M = mover + if(is_servant_of_ratvar(M)) + return FALSE + for(var/mob/M in mover.contents) + if(is_servant_of_ratvar(M)) + return FALSE return ..() //================================================= @@ -512,7 +520,7 @@ icon_state = "clockwork_window_single" resistance_flags = FIRE_PROOF | ACID_PROOF max_integrity = 80 - armor = list("melee" = 40, "bullet" = -20, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) + armor = list("melee" = 40, "bullet" = -20, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100, "stamina" = 0) explosion_block = 2 //fancy AND hard to destroy. the most useful combination. decon_speed = 40 glass_type = /obj/item/stack/tile/brass @@ -541,6 +549,9 @@ animate(src, color = previouscolor, time = 8) addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8) +/obj/structure/window/reinforced/clockwork/ratvar_act() + return FALSE + /obj/structure/window/reinforced/clockwork/unanchored anchored = FALSE diff --git a/code/modules/antagonists/clock_cult/helpers/battle_of_the_gods.dm b/code/modules/antagonists/clock_cult/helpers/battle_of_the_gods.dm new file mode 100644 index 0000000000000..0888817ab11fc --- /dev/null +++ b/code/modules/antagonists/clock_cult/helpers/battle_of_the_gods.dm @@ -0,0 +1,20 @@ +GLOBAL_VAR_INIT(gods_battling, FALSE) +GLOBAL_VAR_INIT(narsie_breaching, FALSE) +GLOBAL_VAR(narsie_arrival) + +/proc/check_gods_battle() + if(GLOB.cult_narsie && GLOB.cult_ratvar) + if(!GLOB.gods_battling) + GLOB.gods_battling = TRUE + trigger_battle_of_the_gods() + return TRUE + return FALSE + +/proc/trigger_battle_of_the_gods() + //Oh dear god what have you done. + //The only way this is actually possible in game is on dynamic (with restrictions turned off) and cult summon nar'sie after the ark activates. + to_chat(world, "You feel a wave of dread wash over you.") + var/obj/singularity/ratvar/R = GLOB.cult_ratvar + var/obj/singularity/narsie/N = GLOB.cult_narsie + R.ratvar_target = N + N.clashing = R diff --git a/code/modules/antagonists/clock_cult/helpers/clockcult_ending.dm b/code/modules/antagonists/clock_cult/helpers/clockcult_ending.dm index bfb47dba9ec32..bf7d8ec5ce64a 100644 --- a/code/modules/antagonists/clock_cult/helpers/clockcult_ending.dm +++ b/code/modules/antagonists/clock_cult/helpers/clockcult_ending.dm @@ -3,8 +3,8 @@ sleep(50) set_security_level("delta") priority_announce("Huge gravitational-energy spike detected emminating from a neutron star near your sector. Event has been determined to be survivable by 0% of life. ESTIMATED TIME UNTIL ENERGY PULSE REACHES [GLOB.station_name]: 56 SECONDS. Godspeed crew, glory to Nanotrasen. -Admiral Telvig.", "Central Command Anomolous Materials Division", 'sound/misc/bloblarm.ogg') - for(var/mob/M in GLOB.clients) - SEND_SOUND(M, sound('sound/misc/airraid.ogg', 1)) + for(var/client/C in GLOB.clients) + SEND_SOUND(C, sound('sound/misc/airraid.ogg', 1)) sleep(500) priority_announce("Station [GLOB.station_name] is in the wa#e %o[text2ratvar("YOU WILL SEE THE LIGHT")] action imminent. Glory[text2ratvar(" TO ENG'INE")].","Central Command Anomolous Materials Division", 'sound/machines/alarm.ogg') for(var/mob/M in GLOB.player_list) diff --git a/code/modules/antagonists/clock_cult/helpers/reebe_loader.dm b/code/modules/antagonists/clock_cult/helpers/reebe_loader.dm new file mode 100644 index 0000000000000..a7317811b3b46 --- /dev/null +++ b/code/modules/antagonists/clock_cult/helpers/reebe_loader.dm @@ -0,0 +1,8 @@ +/proc/LoadReebe() + //Don't load reebe twice in case something happens + var/static/reebe_loaded = FALSE + if(reebe_loaded) + return + var/datum/map_template/template = new("_maps/map_files/generic/CityOfCogs.dmm", "Reebe") + template.load_new_z(null, ZTRAITS_REEBE) + reebe_loaded = TRUE \ No newline at end of file diff --git a/code/modules/antagonists/clock_cult/helpers/servant_warp.dm b/code/modules/antagonists/clock_cult/helpers/servant_warp.dm index 77008b586b7ae..9304e5b6ab439 100644 --- a/code/modules/antagonists/clock_cult/helpers/servant_warp.dm +++ b/code/modules/antagonists/clock_cult/helpers/servant_warp.dm @@ -3,14 +3,17 @@ return FALSE var/mob/living/M = servant var/mob/living/P = M.pulling + var/turf/T = get_turf(M) + if(is_centcom_level(T.z)) + return FALSE playsound(servant, 'sound/magic/magic_missile.ogg', 50, TRUE) playsound(target_location, 'sound/magic/magic_missile.ogg', 50, TRUE) do_sparks(5, TRUE, servant) do_sparks(5, TRUE, target_location) - M.forceMove(target_location) + do_teleport(M, target_location, channel = TELEPORT_CHANNEL_FREE, no_effects = TRUE, teleport_mode = TELEPORT_MODE_CLOCKWORK) new /obj/effect/temp_visual/ratvar/warp(target_location) to_chat(servant, "You warp to [get_area(target_location)].") if(istype(P) && bring_dragging) - P.forceMove(target_location) + do_teleport(P, target_location, channel = TELEPORT_CHANNEL_FREE, no_effects = TRUE, teleport_mode = TELEPORT_MODE_CLOCKWORK) P.Paralyze(30) to_chat(P, "You feel sick and confused...") diff --git a/code/modules/antagonists/clock_cult/items/brass_clothing.dm b/code/modules/antagonists/clock_cult/items/brass_clothing.dm index c67b485d20c24..1ee8a3af60039 100644 --- a/code/modules/antagonists/clock_cult/items/brass_clothing.dm +++ b/code/modules/antagonists/clock_cult/items/brass_clothing.dm @@ -3,12 +3,12 @@ desc = "A strong, brass suit worn by the soldiers of the Ratvarian armies." icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "clockwork_cuirass" - armor = list("melee" = 30, "bullet" = 40, "laser" = 10, "energy" = 80, "bomb" = 40, "bio" = 70, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 50, "bullet" = 60, "laser" = 30, "energy" = 80, "bomb" = 80, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 60) slowdown = 0.6 resistance_flags = FIRE_PROOF | ACID_PROOF w_class = WEIGHT_CLASS_BULKY body_parts_covered = CHEST|GROIN|LEGS|ARMS - allowed = list(/obj/item/clockwork, /obj/item/stack/tile/brass, /obj/item/twohanded/clockwork, /obj/item/gun/ballistic/bow/clockwork) + allowed = list(/obj/item/clockwork, /obj/item/stack/tile/brass, /obj/item/clockwork, /obj/item/gun/ballistic/bow/clockwork) /obj/item/clothing/suit/clockwork/equipped(mob/living/user, slot) . = ..() @@ -33,14 +33,14 @@ icon_state = "clockwork_cuirass_speed" slowdown = -0.3 resistance_flags = FIRE_PROOF | ACID_PROOF - armor = list("melee" = 10, "bullet" = 20, "laser" = 0, "energy" = -20, "bomb" = 0, "bio" = 70, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 40, "laser" = 10, "energy" = -20, "bomb" = 60, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 30) /obj/item/clothing/suit/clockwork/cloak name = "shrouding cloak" desc = "A faltering cloak that bends light around it, distorting the user's appearance, making it hard to see them with the naked eye. However, it provides very little protection." icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "clockwork_cloak" - armor = list("melee" = 20, "bullet" = 30, "laser" = 0, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list("melee" = 10, "bullet" = 60, "laser" = 40, "energy" = 20, "bomb" = 40, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 20) slowdown = 0.4 resistance_flags = FIRE_PROOF | ACID_PROOF var/shroud_active = FALSE @@ -51,33 +51,18 @@ /obj/item/clothing/suit/clockwork/cloak/equipped(mob/user, slot) . = ..() - if(slot == SLOT_WEAR_SUIT && !shroud_active) + if(slot == ITEM_SLOT_OCLOTHING && !shroud_active) shroud_active = TRUE previous_alpha = user.alpha animate(user, alpha=140, time=30) - start = user.filters.len - var/X,Y,rsq - for(i=1, i<=7, ++i) - do - X = 60*rand() - 30 - Y = 60*rand() - 30 - rsq = X*X + Y*Y - while(rsq<100 || rsq>900) - user.filters += filter(type="wave", x=X, y=Y, size=rand()*2.5+0.5, offset=rand()) - for(i=1, i<=7, ++i) - f = user.filters[start+i] - animate(f, offset=f:offset, time=0, loop=-1, flags=ANIMATION_PARALLEL) - animate(offset=f:offset-1, time=rand()*20+10) + apply_wibbly_filters(user) /obj/item/clothing/suit/clockwork/cloak/dropped(mob/user) . = ..() if(shroud_active) shroud_active = FALSE - for(i=1, i<=min(7, user.filters.len), ++i) // removing filters that are animating does nothing, we gotta stop the animations first - f = user.filters[start+i] - animate(f) do_sparks(3, FALSE, user) - user.filters = null + remove_wibbly_filters(user) animate(user, alpha=previous_alpha, time=30) /obj/item/clothing/glasses/clockwork @@ -126,15 +111,15 @@ wearer = user applied_eye_damage = 0 START_PROCESSING(SSobj, src) - to_chat(user, "You suddenly see so much more, but your eyes begin to faulter...") + to_chat(user, "You suddenly see so much more, but your eyes begin to falter...") -/obj/item/clothing/glasses/clockwork/wraith_spectacles/process() +/obj/item/clothing/glasses/clockwork/wraith_spectacles/process(delta_time) . = ..() if(!wearer) STOP_PROCESSING(SSobj, src) return //~1 damage every 2 seconds, maximum of 70 after 140 seconds - wearer.adjustOrganLoss(ORGAN_SLOT_EYES, 1, 70) + wearer.adjustOrganLoss(ORGAN_SLOT_EYES, 0.5*delta_time, 70) applied_eye_damage = min(applied_eye_damage + 1, 70) /obj/item/clothing/glasses/clockwork/wraith_spectacles/dropped(mob/user) @@ -151,7 +136,7 @@ desc = "A strong, brass helmet worn by the soldiers of the Ratvarian armies. Includes an integrated light-dimmer for flash protection, as well as occult-grade muffling for factory based environments." icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "clockwork_helmet" - armor = list("melee" = 40, "bullet" = 50, "laser" = 20, "energy" = 40, "bomb" = 40, "bio" = 70, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 50, "bullet" = 60, "laser" = 30, "energy" = 80, "bomb" = 80, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 60) resistance_flags = FIRE_PROOF | ACID_PROOF w_class = WEIGHT_CLASS_BULKY flash_protect = 1 @@ -176,4 +161,4 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50, "stamina" = 0) diff --git a/code/modules/antagonists/clock_cult/items/clock_components.dm b/code/modules/antagonists/clock_cult/items/clock_components.dm index 8de9069846f67..d8f6e5f6784ac 100644 --- a/code/modules/antagonists/clock_cult/items/clock_components.dm +++ b/code/modules/antagonists/clock_cult/items/clock_components.dm @@ -10,9 +10,9 @@ /obj/item/clockwork/component/pickup(mob/living/user) ..() - if(iscultist(user) || (user.mind && user.mind.isholy)) + if(iscultist(user) || (user.mind?.holy_role)) to_chat(user, "[cultist_message]") - if(user.mind?.isholy) + if(user.mind?.holy_role) to_chat(user, "The power of your faith melts away [src]!") var/obj/item/stack/ore/slag/wrath = new /obj/item/stack/ore/slag qdel(src) diff --git a/code/modules/antagonists/clock_cult/items/clockwork_slab.dm b/code/modules/antagonists/clock_cult/items/clockwork_slab.dm index 0a54dbdd72ee6..6d718823ad627 100644 --- a/code/modules/antagonists/clock_cult/items/clockwork_slab.dm +++ b/code/modules/antagonists/clock_cult/items/clockwork_slab.dm @@ -4,6 +4,7 @@ GLOBAL_LIST_INIT(clockwork_slabs, list()) name = "Clockwork Slab" desc = "A mechanical-looking device filled with intricate cogs that swirl to their own accord." clockwork_desc = "A beautiful work of art, harnessing mechanical energy for a variety of useful powers." + item_flags = NOBLUDGEON icon_state = "dread_ipad" lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi' righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi' @@ -43,6 +44,8 @@ GLOBAL_LIST_INIT(clockwork_slabs, list()) var/datum/component/clockwork_trap/buffer /obj/item/clockwork/clockwork_slab/Initialize() + if(!length(GLOB.clockcult_all_scriptures)) + generate_clockcult_scriptures() var/pos = 1 cogs = GLOB.installed_integration_cogs GLOB.clockwork_slabs += src @@ -135,7 +138,7 @@ GLOBAL_LIST_INIT(clockwork_slabs, list()) ui.open() /obj/item/clockwork/clockwork_slab/ui_state(mob/user) - return GLOB.default_state + return GLOB.clockcult_state /obj/item/clockwork/clockwork_slab/ui_data(mob/user) //Data @@ -144,10 +147,6 @@ GLOBAL_LIST_INIT(clockwork_slabs, list()) data["vitality"] = GLOB.clockcult_vitality data["power"] = GLOB.clockcult_power data["scriptures"] = list() - //Generate Scriptures Infomation - var/datum/antagonist/servant_of_ratvar/servant_datum = is_servant_of_ratvar(user) - if(!servant_datum) - return data //2 scriptures accessable at the same time will cause issues for(var/scripture_name in GLOB.clockcult_all_scriptures) var/datum/clockcult/scripture/scripture = GLOB.clockcult_all_scriptures[scripture_name] @@ -180,6 +179,9 @@ GLOBAL_LIST_INIT(clockwork_slabs, list()) if(S.power_cost > GLOB.clockcult_power) to_chat(M, "You need [S.power_cost]W to invoke [S.name].") return FALSE + if(S.vitality_cost > GLOB.clockcult_vitality) + to_chat(M, "You need [S.vitality_cost] vitality to invoke [S.name].") + return FALSE var/datum/clockcult/scripture/new_scripture = new S.type() //Create a new scripture temporarilly to process, when it's done it will be qdeleted. new_scripture.qdel_on_completion = TRUE diff --git a/code/modules/antagonists/clock_cult/items/clockwork_weapon.dm b/code/modules/antagonists/clock_cult/items/clockwork_weapon.dm index 0b7b13a27efcf..d05253fd1a5c1 100644 --- a/code/modules/antagonists/clock_cult/items/clockwork_weapon.dm +++ b/code/modules/antagonists/clock_cult/items/clockwork_weapon.dm @@ -1,14 +1,11 @@ -/obj/item/twohanded/clockwork +/obj/item/clockwork/weapon name = "Clockwork Weapon" desc = "Something" icon = 'icons/obj/clockwork_objects.dmi' lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi'; righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi' - force_unwielded = 15 - force_wielded = 5 block_flags = BLOCKING_NASTY | BLOCKING_ACTIVE block_level = 1 //God blocking is actual aids to deal with, I am sorry for putting this here - block_power_wielded = 25 block_upgrade_walk = 1 w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK @@ -23,7 +20,7 @@ var/clockwork_hint = "" var/obj/effect/proc_holder/spell/targeted/summon_spear/SS -/obj/item/twohanded/clockwork/pickup(mob/user) +/obj/item/clockwork/weapon/pickup(mob/user) . = ..() user.mind.RemoveSpell(SS) if(is_servant_of_ratvar(user)) @@ -31,19 +28,38 @@ SS.marked_item = src user.mind.AddSpell(SS) -/obj/item/twohanded/clockwork/examine(mob/user) +/obj/item/clockwork/weapon/examine(mob/user) . = ..() if(is_servant_of_ratvar(user) && clockwork_hint) . += clockwork_hint -/obj/item/twohanded/clockwork/attack(mob/living/target, mob/living/user) - . = ..() +/obj/item/clockwork/weapon/attack(mob/living/target, mob/living/user) if(!is_reebe(user.z)) - return - if(!QDELETED(target) && target.stat != DEAD && !is_servant_of_ratvar(target) && !target.anti_magic_check(major=FALSE) && wielded) + return ..() + //Gain a slight buff when fighting near to the Ark. + var/force_buff = 0 + //Check distance + if(GLOB.celestial_gateway) + var/turf/gatewayT = get_turf(GLOB.celestial_gateway) + var/turf/ourT = get_turf(user) + var/distance_from_ark = get_dist(gatewayT, ourT) + if(gatewayT.z == ourT.z && distance_from_ark < 15) + switch(distance_from_ark) + if(0 to 6) + force_buff = 8 + if(6 to 10) + force_buff = 5 + if(10 to 15) + force_buff = 3 + //Magic sound + playsound(src, 'sound/effects/clockcult_gateway_disrupted.ogg', 40) + force += force_buff + . = ..() + force -= force_buff + if(!QDELETED(target) && target.stat != DEAD && !is_servant_of_ratvar(target) && !target.anti_magic_check(major=FALSE)) hit_effect(target, user) -/obj/item/twohanded/clockwork/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) +/obj/item/clockwork/weapon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(!is_reebe(z)) return @@ -53,54 +69,80 @@ if(!target.anti_magic_check() && !is_servant_of_ratvar(target)) hit_effect(target, throwingdatum.thrower, TRUE) -/obj/item/twohanded/clockwork/proc/hit_effect(mob/living/target, mob/living/user, thrown=FALSE) +/obj/item/clockwork/weapon/proc/hit_effect(mob/living/target, mob/living/user, thrown=FALSE) return -/obj/item/twohanded/clockwork/brass_spear - name = "brassspear" +/obj/item/clockwork/weapon/brass_spear + name = "brass spear" desc = "A razor-sharp spear made of brass. It thrums with barely-contained energy." + clockwork_desc = "A razor-sharp spear made of a magnetic brass allow. It accelerates towards targets while on Reebe dealing increased damage." icon_state = "ratvarian_spear" - embedding = list("embedded_impact_pain_multiplier" = 3) - force_wielded = 24 + embedding = list("max_damage_mult" = 15, "armour_block" = 80) throwforce = 36 + force = 25 armour_penetration = 24 clockwork_hint = "Throwing the spear will deal bonus damage while on Reebe." -/obj/item/twohanded/clockwork/brass_battlehammer +/obj/item/clockwork/weapon/brass_battlehammer name = "brass battle-hammer" desc = "A brass hammer glowing with energy." + clockwork_desc = "A brass hammer enfused with an ancient power allowing it to strike foes with incredible force." icon_state = "ratvarian_hammer" - force_wielded = 25 throwforce = 25 armour_penetration = 6 sharpness = IS_BLUNT attack_verb = list("bashed", "smitted", "hammered", "attacked") clockwork_hint = "Enemies hit by this will be flung back while on Reebe." -/obj/item/twohanded/clockwork/brass_battlehammer/hit_effect(mob/living/target, mob/living/user, thrown=FALSE) +/obj/item/clockwork/weapon/brass_battlehammer/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_unwielded=15, force_wielded=28, block_power_wielded=25) + +/obj/item/clockwork/weapon/brass_battlehammer/hit_effect(mob/living/target, mob/living/user, thrown=FALSE) + if(!ISWIELDED(src)) + return var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src))) target.throw_at(throw_target, thrown ? 2 : 1, 4) -/obj/item/twohanded/clockwork/brass_sword +/obj/item/clockwork/weapon/brass_sword name = "brass longsword" desc = "A large sword made of brass." + clockwork_desc = "A large sword made of brass. It contains an aurora of energetic power designed to disrupt electronics." icon_state = "ratvarian_sword" - force_wielded = 26 + force = 26 throwforce = 20 armour_penetration = 12 attack_verb = list("attacked", "slashed", "cut", "torn", "gored") clockwork_hint = "Targets will be struck with a powerful electromagnetic pulse while on Reebe." - var/emp_cooldown = 0 + COOLDOWN_DECLARE(emp_cooldown) + +/obj/item/clockwork/weapon/brass_sword/hit_effect(mob/living/target, mob/living/user, thrown) + if(!COOLDOWN_FINISHED(src, emp_cooldown)) + return + COOLDOWN_START(src, emp_cooldown, 30 SECONDS) + + target.emp_act(EMP_LIGHT) + new /obj/effect/temp_visual/emp/pulse(target.loc) + addtimer(CALLBACK(src, .proc/send_message, user), 30 SECONDS) + to_chat(user, "You strike [target] with an electromagnetic pulse!") + playsound(user, 'sound/magic/lightningshock.ogg', 40) + +/obj/item/clockwork/weapon/brass_sword/attack_obj(obj/O, mob/living/user) + ..() + if(!(istype(O, /obj/mecha) && is_reebe(user.z))) + return + if(!COOLDOWN_FINISHED(src, emp_cooldown)) + return + COOLDOWN_START(src, emp_cooldown, 20 SECONDS) -/obj/item/twohanded/clockwork/brass_sword/hit_effect(mob/living/target, mob/living/user, thrown) - if(world.time > emp_cooldown) - target.emp_act(EMP_LIGHT) - emp_cooldown = world.time + 300 - addtimer(CALLBACK(src, .proc/send_message, user), 300) - to_chat(user, "You strike [target] with an electromagnetic pulse!") - playsound(user, 'sound/magic/lightningshock.ogg', 40) + var/obj/mecha/target = O + target.emp_act(EMP_HEAVY) + new /obj/effect/temp_visual/emp/pulse(target.loc) + addtimer(CALLBACK(src, .proc/send_message, user), 20 SECONDS) + to_chat(user, "You strike [target] with an electromagnetic pulse!") + playsound(user, 'sound/magic/lightningshock.ogg', 40) -/obj/item/twohanded/clockwork/brass_sword/proc/send_message(mob/living/target) +/obj/item/clockwork/weapon/brass_sword/proc/send_message(mob/living/target) to_chat(target, "[src] glows, indicating the next attack will disrupt electronics of the target.") /obj/item/gun/ballistic/bow/clockwork diff --git a/code/modules/antagonists/clock_cult/items/integration_cog.dm b/code/modules/antagonists/clock_cult/items/integration_cog.dm index b7f5ffd99a66a..144ec856bf6b4 100644 --- a/code/modules/antagonists/clock_cult/items/integration_cog.dm +++ b/code/modules/antagonists/clock_cult/items/integration_cog.dm @@ -38,3 +38,6 @@ //Update the cog counts for(var/obj/item/clockwork/clockwork_slab/S in GLOB.clockwork_slabs) S.update_integration_cogs() + if(GLOB.clockcult_eminence) + var/mob/living/simple_animal/eminence/eminence = GLOB.clockcult_eminence + eminence.cog_change() diff --git a/code/modules/antagonists/clock_cult/mobs/clockwork_marauder.dm b/code/modules/antagonists/clock_cult/mobs/clockwork_marauder.dm index a207880f037b8..9783993b80b37 100644 --- a/code/modules/antagonists/clock_cult/mobs/clockwork_marauder.dm +++ b/code/modules/antagonists/clock_cult/mobs/clockwork_marauder.dm @@ -1,7 +1,9 @@ #define MARAUDER_SHIELD_RECHARGE 600 #define MARAUDER_SHIELD_MAX 4 -/mob/living/simple_animal/clockwork_marauder +GLOBAL_LIST_EMPTY(clockwork_marauders) + +/mob/living/simple_animal/hostile/clockwork_marauder name = "clockwork marauder" desc = "A brass machine of destruction," icon = 'icons/mob/clockwork_mobs.dmi' @@ -18,12 +20,12 @@ move_resist = MOVE_FORCE_OVERPOWERING mob_size = MOB_SIZE_LARGE pass_flags = PASSTABLE - hud_possible = list(ANTAG_HUD) damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) attacktext = "slices" attack_sound = 'sound/weapons/bladeslice.ogg' - mobsay_color = "#CAA25B" + chat_color = "#CAA25B" + mobchatspan = "brassmobsay" obj_damage = 80 melee_damage = 24 faction = list("ratvar") @@ -31,20 +33,26 @@ initial_language_holder = /datum/language_holder/clockmob var/shield_health = MARAUDER_SHIELD_MAX - var/next_shield_recharge = 0 var/debris = list(/obj/item/clockwork/alloy_shards/large = 1, \ /obj/item/clockwork/alloy_shards/medium = 2, \ /obj/item/clockwork/alloy_shards/small = 3) //Parts left behind when a structure breaks + discovery_points = 1000 + +/mob/living/simple_animal/hostile/clockwork_marauder/Initialize() + . = ..() + GLOB.clockwork_marauders += src + +/mob/living/simple_animal/hostile/clockwork_marauder/Destroy() + GLOB.clockwork_marauders -= src + . = ..() -/mob/living/simple_animal/clockwork_marauder/Login() +/mob/living/simple_animal/hostile/clockwork_marauder/Login() . = ..() add_servant_of_ratvar(src) - to_chat(src, "Your abilities:\n\ - - Passive: Block up to 4 projectiles with your shield.\ - - Active: Create a forcewall that prevents non servants from passing through.") + to_chat(src, "You can block up to 4 attacks with your shield, however it requires a welder to be repaired.") -/mob/living/simple_animal/clockwork_marauder/death(gibbed) +/mob/living/simple_animal/hostile/clockwork_marauder/death(gibbed) . = ..() for(var/item in debris) var/count = debris[item] @@ -52,16 +60,18 @@ new item(get_turf(src)) qdel(src) -/mob/living/simple_animal/clockwork_marauder/Life(seconds, times_fired) - //Check for shield regeneration - if(shield_health < MARAUDER_SHIELD_MAX) - if(next_shield_recharge < world.time) - shield_health ++ - next_shield_recharge = world.time + MARAUDER_SHIELD_RECHARGE - playsound(src, 'sound/magic/charge.ogg', 60, TRUE) +/mob/living/simple_animal/hostile/clockwork_marauder/attacked_by(obj/item/I, mob/living/user) + if(istype(I, /obj/item/nullrod)) + apply_damage(15, BURN) + if(shield_health > 0) + damage_shield() + playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,1) + if(I.tool_behaviour == TOOL_WELDER) + welder_act(user, I) + return . = ..() -/mob/living/simple_animal/clockwork_marauder/bullet_act(obj/item/projectile/Proj) +/mob/living/simple_animal/hostile/clockwork_marauder/bullet_act(obj/item/projectile/Proj) //Block Ranged Attacks if(shield_health > 0) damage_shield() @@ -69,18 +79,21 @@ return BULLET_ACT_BLOCK return ..() -/mob/living/simple_animal/clockwork_marauder/proc/damage_shield() - if(shield_health == MARAUDER_SHIELD_MAX) - next_shield_recharge = world.time + MARAUDER_SHIELD_RECHARGE +/mob/living/simple_animal/hostile/clockwork_marauder/proc/damage_shield() shield_health -- playsound(src, 'sound/magic/clockwork/anima_fragment_attack.ogg', 60, TRUE) if(shield_health == 0) to_chat(src, "Your shield breaks!") + to_chat(src, "You require a welding tool to repair your damaged shield!") -/mob/living/simple_animal/clockwork_marauder/welder_act(mob/living/user, obj/item/I) +/mob/living/simple_animal/hostile/clockwork_marauder/welder_act(mob/living/user, obj/item/I) if(do_after(user, 25, target=src)) health = min(health + 10, maxHealth) - to_chat(user, "You repair some [src]'s damage.") + to_chat(user, "You repair some of [src]'s damage.") + if(shield_health < MARAUDER_SHIELD_MAX) + shield_health ++ + playsound(src, 'sound/magic/charge.ogg', 60, TRUE) + return TRUE #undef MARAUDER_SHIELD_RECHARGE #undef MARAUDER_SHIELD_MAX diff --git a/code/modules/antagonists/clock_cult/mobs/cogscarab.dm b/code/modules/antagonists/clock_cult/mobs/cogscarab.dm index c0cdfe5df1126..8babfbf56c4a1 100644 --- a/code/modules/antagonists/clock_cult/mobs/cogscarab.dm +++ b/code/modules/antagonists/clock_cult/mobs/cogscarab.dm @@ -22,17 +22,17 @@ GLOBAL_LIST_INIT(cogscarabs, list()) Construct defences, traps and forgeries, for opening the Ark requires an unimaginable amount of power which is bound to get the attention of selfish lifeforms interested only in their own self-preservation." laws = "You are have been granted the gift of sentience from Rat'var.
\ You are not bound by any laws, do whatever you must to serve Rat'var!" - mobsay_color = LIGHT_COLOR_CLOCKWORK + chat_color = LIGHT_COLOR_CLOCKWORK + mobchatspan = "brassmobsay" initial_language_holder = /datum/language_holder/clockmob + discovery_points = 2000 -/mob/living/simple_animal/drone/cogscarab/do_after_coefficent() // This gets added to the delay on a do_after, default 1 - return 0.6 - -//No you can't go weilding guns like that. +//No you can't go wielding guns like that. /mob/living/simple_animal/drone/cogscarab/Initialize() . = ..() ADD_TRAIT(src, TRAIT_NOGUNS, "cogscarab") GLOB.cogscarabs += src + add_actionspeed_modifier(/datum/actionspeed_modifier/cogscarab) /mob/living/simple_animal/drone/cogscarab/death(gibbed) GLOB.cogscarabs -= src @@ -46,13 +46,18 @@ GLOBAL_LIST_INIT(cogscarabs, list()) //====Shell==== -/obj/item/drone_shell/cogscarab +/obj/effect/mob_spawn/drone/cogscarab name = "cogscarab construct" desc = "The shell of an ancient construction drone, loyal to Ratvar." icon_state = "drone_clock_hat" - drone_type = /mob/living/simple_animal/drone/cogscarab + mob_name = "cogscarab" + mob_type = /mob/living/simple_animal/drone/cogscarab + short_desc = "You are a cogscarab!" + flavour_text = "You are a cogscarab, a tiny building construct of Ratvar. While you're weak and can't leave Reebe, \ + you have a set of quick tools, as well as a replica fabricator that can create brass for construction. Work with the servants of Ratvar \ + to construct and maintain defenses at the City of Cogs." -/obj/item/drone_shell/cogscarab/attack_ghost(mob/user) +/obj/effect/mob_spawn/drone/cogscarab/attack_ghost(mob/user) if(is_banned_from(user.ckey, ROLE_SERVANT_OF_RATVAR) || QDELETED(src) || QDELETED(user)) return if(CONFIG_GET(flag/use_age_restriction_for_jobs)) @@ -66,11 +71,11 @@ GLOBAL_LIST_INIT(cogscarabs, list()) var/be_drone = alert("Become a cogscarab? (Warning, You can no longer be cloned!)",,"Yes","No") if(be_drone == "No" || QDELETED(src) || !isobserver(user)) return - var/mob/living/simple_animal/drone/D = new drone_type(get_turf(loc)) + var/mob/living/simple_animal/drone/D = new mob_type(get_turf(loc)) if(!D.default_hatmask && seasonal_hats && possible_seasonal_hats.len) var/hat_type = pick(possible_seasonal_hats) var/obj/item/new_hat = new hat_type(D) - D.equip_to_slot_or_del(new_hat, SLOT_HEAD) + D.equip_to_slot_or_del(new_hat, ITEM_SLOT_HEAD) D.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) D.key = user.key add_servant_of_ratvar(D, silent=TRUE) diff --git a/code/modules/antagonists/clock_cult/mobs/eminence.dm b/code/modules/antagonists/clock_cult/mobs/eminence.dm index d31b6d3dfdb58..b366e142e982d 100644 --- a/code/modules/antagonists/clock_cult/mobs/eminence.dm +++ b/code/modules/antagonists/clock_cult/mobs/eminence.dm @@ -1,10 +1,10 @@ /mob/living/simple_animal/eminence - name = "eminence" - desc = "An glowing ball of light." + name = "\the Eminence" + desc = "A glowing ball of light." icon = 'icons/effects/clockwork_effects.dmi' icon_state = "eminence" mob_biotypes = list(MOB_SPIRIT) - incorporeal_move = INCORPOREAL_MOVE_JAUNT + incorporeal_move = INCORPOREAL_MOVE_EMINENCE invisibility = INVISIBILITY_OBSERVER health = INFINITY maxHealth = INFINITY @@ -34,36 +34,71 @@ hud_possible = list(ANTAG_HUD) hud_type = /datum/hud/revenant + var/calculated_cogs = 0 + var/cogs = 0 + var/mob/living/selected_mob = null var/obj/effect/proc_holder/spell/targeted/eminence/reebe/spell_reebe var/obj/effect/proc_holder/spell/targeted/eminence/station/spell_station + var/obj/effect/proc_holder/spell/targeted/eminence/servant_warp/spell_servant_warp var/obj/effect/proc_holder/spell/targeted/eminence/mass_recall/mass_recall - var/obj/effect/proc_holder/spell/targeted/eminence/reagent_purge/reagent_purge - var/obj/effect/proc_holder/spell/targeted/eminence/linked_asbcond/linked_abscond + var/obj/effect/proc_holder/spell/targeted/eminence/linked_abscond/linked_abscond + var/obj/effect/proc_holder/spell/targeted/eminence/trigger_event/trigger_event /mob/living/simple_animal/eminence/ClickOn(atom/A, params) . = ..() if(!.) A.eminence_act(src) +/mob/living/simple_animal/eminence/proc/cog_change() + //Calculate cogs + if(calculated_cogs != GLOB.installed_integration_cogs) + var/difference = GLOB.installed_integration_cogs - calculated_cogs + calculated_cogs += difference + cogs += difference + to_chat(src, "You have gained [difference] cogs!") + +//Cannot gib the eminence. +/mob/living/simple_animal/eminence/gib() + return + +/mob/living/simple_animal/eminence/UnarmedAttack(atom/A) + return FALSE + +/mob/living/simple_animal/eminence/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) + return FALSE + /mob/living/simple_animal/eminence/Initialize() . = ..() GLOB.clockcult_eminence = src + //Add spells spell_reebe = new AddSpell(spell_reebe) spell_station = new AddSpell(spell_station) + spell_servant_warp = new + AddSpell(spell_servant_warp) mass_recall = new AddSpell(mass_recall) - reagent_purge = new - AddSpell(reagent_purge) linked_abscond = new AddSpell(linked_abscond) + trigger_event = new + AddSpell(trigger_event) + //Wooooo, you are a ghost + AddComponent(/datum/component/tracking_beacon, "ghost", null, null, TRUE, "#9e4d91", TRUE, TRUE) + cog_change() + +/mob/living/simple_animal/eminence/Destroy() + . = ..() + var/datum/component/tracking_beacon/beacon = GetComponent(/datum/component/tracking_beacon) + if(beacon) + qdel(beacon) /mob/living/simple_animal/eminence/Login() . = ..() - add_servant_of_ratvar(src, silent=TRUE) + var/datum/antagonist/servant_of_ratvar/S = add_servant_of_ratvar(src, silent=TRUE) + S.prefix = CLOCKCULT_PREFIX_EMINENCE to_chat(src, "You are the Eminence!") to_chat(src, "Click on objects to perform actions, different objects have different actions, try them out!") to_chat(src, "Many of your spells require a target first. Click on a servant to select them!") @@ -86,6 +121,14 @@ return . = ..() +/mob/living/simple_animal/eminence/bullet_act(obj/item/projectile/Proj) + return BULLET_ACT_FORCE_PIERCE + +/mob/living/simple_animal/eminence/proc/run_global_event(datum/round_event_control/E) + E.preRunEvent() + E.runEvent() + SSevents.reschedule() + //Eminence abilities /obj/effect/proc_holder/spell/targeted/eminence @@ -99,6 +142,18 @@ cooldown_min = 0 range = -1 include_user = TRUE + var/cog_cost + +/obj/effect/proc_holder/spell/targeted/eminence/can_cast(mob/user) + . = ..() + var/mob/living/simple_animal/eminence/eminence = user + if(!istype(eminence)) + return FALSE + if(eminence.cogs < cog_cost) + return FALSE + +/obj/effect/proc_holder/spell/targeted/eminence/proc/consume_cogs(mob/living/simple_animal/eminence/eminence) + eminence.cogs -= cog_cost //=====Warp to Reebe===== /obj/effect/proc_holder/spell/targeted/eminence/reebe @@ -106,8 +161,14 @@ desc = "Teleport yourself to Reebe." action_icon_state = "Abscond" -/obj/effect/proc_holder/spell/targeted/eminence/reebe/cast(list/targets, mob/living/user) - user.forceMove(get_turf(GLOB.celestial_gateway)) +/obj/effect/proc_holder/spell/targeted/eminence/reebe/cast(mob/living/user) + var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.celestial_gateway + if(G) + user.forceMove(get_turf(G)) + SEND_SOUND(user, sound('sound/magic/magic_missile.ogg')) + flash_color(user, flash_color = "#AF0AAF", flash_time = 25) + else + to_chat(user, "There is no Ark!") //=====Warp to station===== /obj/effect/proc_holder/spell/targeted/eminence/station @@ -115,13 +176,45 @@ desc = "Teleport yourself to the station." action_icon_state = "warp_down" -/obj/effect/proc_holder/spell/targeted/eminence/station/cast(list/targets, mob/living/user) - user.forceMove(SSmapping.get_station_center()) +/obj/effect/proc_holder/spell/targeted/eminence/station/cast(mob/living/user) + if(!is_station_level(user.z)) + user.forceMove(get_turf(pick(GLOB.generic_event_spawns))) + SEND_SOUND(user, sound('sound/magic/magic_missile.ogg')) + flash_color(user, flash_color = "#AF0AAF", flash_time = 25) + else + to_chat(user, "You're already on the station!") + +//=====Teleport to servant===== +/obj/effect/proc_holder/spell/targeted/eminence/servant_warp + name = "Jump to Servant" + desc = "Teleport yourself to a specific servant." + action_icon_state = "Spatial Warp" + +/obj/effect/proc_holder/spell/targeted/eminence/servant_warp/cast(list/targets, mob/user) + //Get a list of all servants + var/choice = input(user, "Select servant", "Warp to...", null) in GLOB.all_servants_of_ratvar + if(!choice) + return + for(var/mob/living/L in GLOB.all_servants_of_ratvar) + if(L.name == choice) + choice = L + break + if(!isliving(choice)) + to_chat(user, "You cannot jump to them!") + return + var/mob/living/M = choice + if(!is_servant_of_ratvar(M)) + to_chat(user, "They are no longer a servant of Rat'var!") + return + var/turf/T = get_turf(M) + user.forceMove(get_turf(T)) + SEND_SOUND(user, sound('sound/magic/magic_missile.ogg')) + flash_color(user, flash_color = "#AF0AAF", flash_time = 25) //=====Mass Recall===== /obj/effect/proc_holder/spell/targeted/eminence/mass_recall name = "Initiate Mass Recall" - desc = "Initiates a mass recall, warping everyone to the Ark." + desc = "Initiates a mass recall, warping everyone to the Ark. Can only be used 1 time." action_icon_state = "Spatial Gateway" /obj/effect/proc_holder/spell/targeted/eminence/mass_recall/cast(list/targets, mob/living/user) @@ -131,50 +224,15 @@ C.begin_mass_recall() user.RemoveSpell(src) -//=====Purge Reagents===== -/obj/effect/proc_holder/spell/targeted/eminence/reagent_purge - name = "Purge Reagents" - desc = "Purges all the reagents from a selected target. You must select a target by left clicking on them first." - action_icon_state = "Mending Mantra" - charge_max = 300 - -/obj/effect/proc_holder/spell/targeted/eminence/reagent_purge/can_cast(mob/user) - if(!..()) - return FALSE - var/mob/living/simple_animal/eminence/E = user - if(!istype(E)) - return FALSE - if(E.selected_mob && is_servant_of_ratvar(E.selected_mob)) - return TRUE - return FALSE - -/obj/effect/proc_holder/spell/targeted/eminence/reagent_purge/cast(list/targets, mob/living/user) - var/mob/living/simple_animal/eminence/E = user - if(!istype(E)) - revert_cast(user) - return FALSE - if(!E.selected_mob || !is_servant_of_ratvar(E.selected_mob)) - E.selected_mob = null - to_chat(user, "You need to select a valid target by clicking on them.") - revert_cast(user) - return FALSE - var/mob/living/L = E.selected_mob - if(!istype(L)) - revert_cast(user) - return FALSE - L.reagents?.clear_reagents() - to_chat(user, "You clear the reagents from [L]!") - to_chat(L, "The Eminence has purified your blood!") - return TRUE - //=====Linked Abscond===== -/obj/effect/proc_holder/spell/targeted/eminence/linked_asbcond +/obj/effect/proc_holder/spell/targeted/eminence/linked_abscond name = "Linked Abscond" - desc = "Warps a target to Reebe if they are still for 7 seconds." + desc = "Warps a target to Reebe if they are still for 7 seconds. Costs 1 cog." action_icon_state = "Linked Abscond" - charge_max = 4500 + charge_max = 1800 + cog_cost = 1 -/obj/effect/proc_holder/spell/targeted/eminence/linked_asbcond/can_cast(mob/user) +/obj/effect/proc_holder/spell/targeted/eminence/linked_abscond/can_cast(mob/user) if(!..()) return FALSE var/mob/living/simple_animal/eminence/E = user @@ -184,7 +242,7 @@ return TRUE return FALSE -/obj/effect/proc_holder/spell/targeted/eminence/linked_asbcond/cast(list/targets, mob/living/user) +/obj/effect/proc_holder/spell/targeted/eminence/linked_abscond/cast(list/targets, mob/living/user) var/mob/living/simple_animal/eminence/E = user if(!istype(E)) to_chat(E, "You are not the Eminence! (This is a bug)") @@ -207,8 +265,48 @@ L.visible_message("[L] phases out of existance!") var/turf/T = get_turf(pick(GLOB.servant_spawns)) try_warp_servant(L, T, FALSE) + consume_cogs(E) return TRUE else to_chat(E, "You fail to recall [L].") revert_cast(user) return FALSE + +//Trigger event +/obj/effect/proc_holder/spell/targeted/eminence/trigger_event + name = "Manipulate Reality" + desc = "Manipulate reality causing global events to occur. Costs 5 cogs" + action_icon_state = "Geis" + charge_max = 3000 + cog_cost = 5 + +/obj/effect/proc_holder/spell/targeted/eminence/trigger_event/cast(list/targets, mob/user) + var/picked_event = input(user, "Pick an event to run", "Manipulate Reality", null) in list( + "Anomaly", + "Brand Intelligence", + "Camera Failure", + "Communications Blackout", + "Disease Outbreak", + "Electrical Storm", + "False Alarm", + "Grid Check", + "Mass Hallucination", + "Processor Overload", + "Radiation Storm" + ) + if(!can_cast(user)) + return + if(!picked_event) + revert_cast(user) + return + if(picked_event == "Anomaly") + picked_event = pick("Anomaly: Energetic Flux", "Anomaly: Pyroclastic", "Anomaly: Gravitational", "Anomaly: Bluespace") + //Reschedule events + //Get the picked event + for(var/datum/round_event_control/E in SSevents.control) + if(E.name == picked_event) + var/mob/living/simple_animal/eminence/eminence = user + INVOKE_ASYNC(eminence, /mob/living/simple_animal/eminence.proc/run_global_event, E) + consume_cogs(user) + return + revert_cast(user) diff --git a/code/modules/antagonists/clock_cult/scriptures/_clockwork_scripture.dm b/code/modules/antagonists/clock_cult/scriptures/_clockwork_scripture.dm index 44df5e14fc941..7d64230dd18fc 100644 --- a/code/modules/antagonists/clock_cult/scriptures/_clockwork_scripture.dm +++ b/code/modules/antagonists/clock_cult/scriptures/_clockwork_scripture.dm @@ -56,7 +56,7 @@ return var/invokers_left = invokers_required if(invokers_left > 1) - for(var/mob/living/M in view(invoker)) + for(var/mob/living/M in viewers(invoker)) if(M.stat) continue if(!invokers_left) @@ -71,7 +71,7 @@ if(text_point < stop_at) invokation_chant_timer = addtimer(CALLBACK(src, .proc/recite, text_point+1, wait_time, stop_at), wait_time, TIMER_STOPPABLE) -/datum/clockcult/scripture/proc/check_special_requirements() +/datum/clockcult/scripture/proc/check_special_requirements(mob/user) if(!invoker || !invoking_slab) message_admins("No invoker for [name]") return FALSE @@ -79,7 +79,7 @@ to_chat(invoker, "You fail to invoke [name].") return FALSE var/invokers - for(var/mob/living/M in view(invoker)) + for(var/mob/living/M in viewers(invoker)) if(M.stat) continue if(is_servant_of_ratvar(M)) @@ -100,11 +100,11 @@ log_runtime("CLOCKCULT: Attempting to invoke a scripture that has not been unlocked. Either there is a bug, or [ADMIN_LOOKUP(invoker)] is using some wacky exploits.") end_invoke() return - if(!check_special_requirements()) + if(!check_special_requirements(M)) end_invoke() return recital() - if(do_after(M, invokation_time, target=M, extra_checks=CALLBACK(src, .proc/check_special_requirements))) + if(do_after(M, invokation_time, target=M, extra_checks=CALLBACK(src, .proc/check_special_requirements, M))) invoke() to_chat(M, "You invoke [name].") if(end_on_invokation) @@ -127,7 +127,7 @@ /datum/clockcult/scripture/create_structure var/summoned_structure -/datum/clockcult/scripture/create_structure/check_special_requirements() +/datum/clockcult/scripture/create_structure/check_special_requirements(mob/user) if(!..()) return FALSE for(var/obj/structure/destructible/clockwork/structure in get_turf(invoker)) diff --git a/code/modules/antagonists/clock_cult/scriptures/abscond.dm b/code/modules/antagonists/clock_cult/scriptures/abscond.dm index 2e0abcc8d5ee1..55fb9241cefad 100644 --- a/code/modules/antagonists/clock_cult/scriptures/abscond.dm +++ b/code/modules/antagonists/clock_cult/scriptures/abscond.dm @@ -8,8 +8,8 @@ tip = "Transports you and anyone you are dragging to Reebe." button_icon_state = "Abscond" power_cost = 5 - invokation_time = 35 - invokation_text = list("As we bid farewell, and return to the stars...", "...we shall find our way home.") + invokation_time = 25 + invokation_text = list("As we bid farewell, and return to the stars...", "we shall find our way home.") category = SPELLTYPE_SERVITUDE var/client_color diff --git a/code/modules/antagonists/clock_cult/scriptures/abstraction_crystal.dm b/code/modules/antagonists/clock_cult/scriptures/abstraction_crystal.dm index 33ef0835423f0..652c7140db433 100644 --- a/code/modules/antagonists/clock_cult/scriptures/abstraction_crystal.dm +++ b/code/modules/antagonists/clock_cult/scriptures/abstraction_crystal.dm @@ -10,7 +10,7 @@ GLOBAL_LIST_INIT(abstraction_crystals, list()) /datum/clockcult/scripture/create_structure/abstraction_crystal name = "Abstraction Crystal" desc = "Summons an Abstraction Crystal, which allows servants to manifest themself to protect the nearby area." - tip = "Upon your manifestation taking damage, you will only recieve 40% of the damage." + tip = "Upon your manifestation taking damage, you will only receive 40% of the damage." button_icon_state = "Clockwork Obelisk" power_cost = 750 invokation_time = 50 @@ -19,13 +19,14 @@ GLOBAL_LIST_INIT(abstraction_crystals, list()) cogs_required = 5 category = SPELLTYPE_STRUCTURES -/datum/clockcult/scripture/create_structure/abstraction_crystal/check_special_requirements() +/datum/clockcult/scripture/create_structure/abstraction_crystal/check_special_requirements(mob/user) if(!..()) return FALSE - for(var/obj/structure/destructible/clockwork/structure in get_turf(invoker)) + var/obj/structure/destructible/clockwork/structure = locate() in get_turf(invoker) + if(structure) to_chat(invoker, "You cannot invoke that here, the tile is occupied by [structure].") return FALSE - for(var/obj/structure/destructible/clockwork/abstraction_crystal/AC in range(5)) + if(locate(/obj/structure/destructible/clockwork/abstraction_crystal) in range(5)) to_chat(invoker, "There is an Abstraction Crystal nearby, you cannot place this here.") return FALSE return TRUE @@ -47,7 +48,7 @@ GLOBAL_LIST_INIT(abstraction_crystals, list()) //============= // A human that can do human things, however it is linked to a crystal -// Instead of recieving damage normally, damage is applied to the crystal +// Instead of receiving damage normally, damage is applied to the crystal // and this mobs health is equal to the health of the crystal //============= @@ -110,7 +111,7 @@ GLOBAL_LIST_INIT(abstraction_crystals, list()) desc = "An other-worldly structure, its lattice pulsating with a bright, pulsating light." icon_state = "obelisk_inactive" clockwork_desc = "A powerful crystal allowing the user to manifest themselves at other abstraction crystals." - max_integrity = 100 + max_integrity = 200 break_message = "The crystal explodes into a shower of shards!" var/key_word = "" var/mob/living/activator diff --git a/code/modules/antagonists/clock_cult/scriptures/clockwork_armaments.dm b/code/modules/antagonists/clock_cult/scriptures/clockwork_armaments.dm index e75dc387c1a3d..13f46e5b1840b 100644 --- a/code/modules/antagonists/clock_cult/scriptures/clockwork_armaments.dm +++ b/code/modules/antagonists/clock_cult/scriptures/clockwork_armaments.dm @@ -6,15 +6,15 @@ desc = "Summon clockwork armor and weapons, to be ready for battle." tip = "Summon clockwork armor and weapons, to be ready for battle." button_icon_state = "clockwork_armor" - power_cost = 250 + power_cost = 150 invokation_time = 20 - invokation_text = list("Through courage and hope...", "...we shall protect thee!") + invokation_text = list("Through courage and hope...", "we shall protect thee!") category = SPELLTYPE_PRESERVATION cogs_required = 0 /datum/clockcult/scripture/clockwork_armaments/invoke_success() var/mob/living/M = invoker - var/choice = input(M,"What weapon do you want to call upon?", "Clockwork Armaments") as anything in list("Brass Spear","Brass Battlehammer","Brass Sword", "Brass Bow") + var/choice = input(M,"What weapon do you want to call upon?", "Clockwork Armaments") as anything in list("Brass Spear","Brass Battlehammer","Brass Sword", "Brass Bow", "Standard Equipment (Unarmed)") var/datum/antagonist/servant_of_ratvar/servant = is_servant_of_ratvar(M) if(!servant) return FALSE @@ -23,6 +23,10 @@ var/static/datum/outfit/clockcult/armaments/hammer/armaments_hammer = new var/static/datum/outfit/clockcult/armaments/sword/armaments_sword = new var/static/datum/outfit/clockcult/armaments/bow/armaments_bow = new + var/static/datum/outfit/clockcult/default = new + var/static/datum/outfit/clockcult_plasmaman/plasmaman = new + if(is_species(M, /datum/species/plasmaman)) + plasmaman.equip(M) switch(choice) if("Brass Spear") armaments_spear.equip(M) @@ -32,3 +36,5 @@ armaments_sword.equip(M) if("Brass Bow") armaments_bow.equip(M) + if("Standard Equipment (Unarmed)") + default.equip(M) diff --git a/code/modules/antagonists/clock_cult/scriptures/dimensional_breach.dm b/code/modules/antagonists/clock_cult/scriptures/dimensional_breach.dm index f20a4257ee4e2..3fa246beca884 100644 --- a/code/modules/antagonists/clock_cult/scriptures/dimensional_breach.dm +++ b/code/modules/antagonists/clock_cult/scriptures/dimensional_breach.dm @@ -6,9 +6,9 @@ desc = "Prepares the Ark for activation, alerting the crew of your existence. Requires 6 invokers." tip = "Prepares the Ark for activation, alerting the crew of your existence." button_icon_state = "Spatial Gateway" - power_cost = 10000 + power_cost = 5000 invokation_time = 140 - invokation_text = list("Oh great Engine, take my soul...", "...it is time for you to rise...", "...through rifts you shall come...", "...to rise among the stars again!") + invokation_text = list("Oh great Engine, take my soul...", "it is time for you to rise...", "through rifts you shall come...", "to rise among the stars again!") invokers_required = 6 category = SPELLTYPE_SERVITUDE recital_sound = 'sound/magic/clockwork/narsie_attack.ogg' @@ -16,10 +16,10 @@ /datum/clockcult/scripture/ark_activation/New() . = ..() -/datum/clockcult/scripture/ark_activation/check_special_requirements() +/datum/clockcult/scripture/ark_activation/check_special_requirements(mob/user) if(!..()) return FALSE - if(!is_reebe(get_area(invoker).z)) + if(!is_reebe(get_area(invoker))) to_chat(invoker, "You need to be near the gateway to channel its energy!") return FALSE return TRUE diff --git a/code/modules/antagonists/clock_cult/scriptures/hateful_manacles.dm b/code/modules/antagonists/clock_cult/scriptures/hateful_manacles.dm index aa9a5d5507003..aa9c63c8f0e86 100644 --- a/code/modules/antagonists/clock_cult/scriptures/hateful_manacles.dm +++ b/code/modules/antagonists/clock_cult/scriptures/hateful_manacles.dm @@ -4,11 +4,11 @@ /datum/clockcult/scripture/slab/hateful_manacles name = "Hateful Manacles" desc = "Forms replicant manacles around a target's wrists that function like handcuffs, restraining the target." - tip = "Handcuff a target at close range." + tip = "Handcuff a target at close range to subdue them for conversion or vitality extraction." button_icon_state = "Hateful Manacles" power_cost = 25 invokation_time = 15 - invokation_text = list("Shackle the heretic...", "...Break them in body and spirit!") + invokation_text = list("Shackle the heretic...", "Break them in body and spirit!") slab_overlay = "hateful_manacles" use_time = 200 cogs_required = 0 @@ -24,14 +24,20 @@ if(M.handcuffed) to_chat(invoker, "[M] is already restrained!") return FALSE - playsound(src, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2) + playsound(M, 'sound/weapons/handcuffs.ogg', 30, TRUE, -2) M.visible_message("[invoker] forms a well of energy around [M], brass appearing at their wrists!",\ "[invoker] is trying to restrain you!") - if(do_after(invoker, 50, target=M)) + if(do_after(invoker, 30, target=M)) if(M.handcuffed) return FALSE - //Todo, update with custom cuffs - M.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(M) + M.handcuffed = new /obj/item/restraints/handcuffs/clockwork(M) M.update_handcuffed() + log_combat(invoker, M, "handcuffed") return TRUE return FALSE + +/obj/item/restraints/handcuffs/clockwork + name = "replicant manacles" + desc = "Heavy manacles made out of freezing-cold metal. It looks like brass, but feels much more solid." + icon_state = "brass_manacles" + item_flags = DROPDEL diff --git a/code/modules/antagonists/clock_cult/scriptures/interdiction_lens.dm b/code/modules/antagonists/clock_cult/scriptures/interdiction_lens.dm index 0afdef818bab4..20ed789e92655 100644 --- a/code/modules/antagonists/clock_cult/scriptures/interdiction_lens.dm +++ b/code/modules/antagonists/clock_cult/scriptures/interdiction_lens.dm @@ -1,4 +1,4 @@ -#define INTERDICTION_LENS_RANGE 3 +#define INTERDICTION_LENS_RANGE 5 /datum/clockcult/scripture/create_structure/interdiction name = "Interdiction Lens" @@ -7,7 +7,7 @@ button_icon_state = "Interdiction Lens" power_cost = 500 invokation_time = 80 - invokation_text = list("Oh great lord...", "...may your divinity block the outsiders.") + invokation_text = list("Oh great lord...", "may your divinity block the outsiders.") summoned_structure = /obj/structure/destructible/clockwork/gear_base/interdiction_lens cogs_required = 4 category = SPELLTYPE_STRUCTURES @@ -16,7 +16,7 @@ name = "interdiction lens" desc = "A mesmerizing light that flashes to a rhythm that you just can't stop tapping to." clockwork_desc = "A small device which will slow down nearby attackers at a small power cost." - default_icon_state = "interdiction_lens_inactive" + default_icon_state = "interdiction_lens" anchored = TRUE break_message = "The interdiction lens breaks into multiple fragments, which gently float to the ground." max_integrity = 150 @@ -40,8 +40,11 @@ /obj/structure/destructible/clockwork/gear_base/interdiction_lens/attack_hand(mob/user) if(is_servant_of_ratvar(user)) + if(!anchored) + to_chat(user, "[src] needs to be fastened to the floor!") + return enabled = !enabled - to_chat(user, "You toggle [src] [enabled?"on":"off"].") + to_chat(user, "You flick the switch on [src], turning it [enabled?"on":"off"]!") if(enabled) if(update_power()) repowered() @@ -53,22 +56,21 @@ else . = ..() -/obj/structure/destructible/clockwork/gear_base/interdiction_lens/process() +/obj/structure/destructible/clockwork/gear_base/interdiction_lens/process(delta_time) if(!anchored) enabled = FALSE STOP_PROCESSING(SSobj, src) - icon_state = "interdiction_lens_unwrenched" + update_icon_state() return - if(prob(5)) + if(DT_PROB(5, delta_time)) new /obj/effect/temp_visual/steam_release(get_turf(src)) - for(var/mob/living/L in range(INTERDICTION_LENS_RANGE, src)) - if(!is_servant_of_ratvar(L)) - if(use_power(5)) - L.apply_status_effect(STATUS_EFFECT_INTERDICTION) - for(var/obj/mecha/M in range(INTERDICTION_LENS_RANGE, src)) + for(var/mob/living/L in viewers(INTERDICTION_LENS_RANGE, src)) + if(!is_servant_of_ratvar(L) && use_power(5)) + L.apply_status_effect(STATUS_EFFECT_INTERDICTION) + for(var/obj/mecha/M in dview(INTERDICTION_LENS_RANGE, src, SEE_INVISIBLE_MINIMUM)) if(use_power(5)) - M.use_power(8000) - M.take_damage(80) + M.emp_act(EMP_HEAVY) + M.take_damage(400 * delta_time) do_sparks(4, TRUE, M) /obj/structure/destructible/clockwork/gear_base/interdiction_lens/repowered() @@ -86,10 +88,18 @@ if(processing) STOP_PROCESSING(SSobj, src) processing = FALSE - icon_state = "interdiction_lens_inactive" + icon_state = "interdiction_lens" flick("interdiction_lens_discharged", src) QDEL_NULL(dampening_field) +/obj/structure/destructible/clockwork/gear_base/interdiction_lens/free/use_power(amount) + return + +/obj/structure/destructible/clockwork/gear_base/interdiction_lens/free/check_power(amount) + if(!LAZYLEN(transmission_sigils)) + return FALSE + return TRUE + //Dampening field /datum/proximity_monitor/advanced/peaceborg_dampener/clockwork name = "\improper Reality Distortion Field" diff --git a/code/modules/antagonists/clock_cult/scriptures/ocular_warden.dm b/code/modules/antagonists/clock_cult/scriptures/ocular_warden.dm index d452f23353a31..8d7431bffc039 100644 --- a/code/modules/antagonists/clock_cult/scriptures/ocular_warden.dm +++ b/code/modules/antagonists/clock_cult/scriptures/ocular_warden.dm @@ -6,7 +6,7 @@ desc = "An eye turret that will fire upon nearby targets. Requires 2 invokers." tip = "Place these around to prevent crew from rushing past your defenses." button_icon_state = "Ocular Warden" - power_cost = 500 + power_cost = 400 invokation_time = 50 invokation_text = list("Summon thee to defend our temple") summoned_structure = /obj/structure/destructible/clockwork/ocular_warden @@ -14,7 +14,7 @@ invokers_required = 2 category = SPELLTYPE_STRUCTURES -/datum/clockcult/scripture/create_structure/ocular_warden/check_special_requirements() +/datum/clockcult/scripture/create_structure/ocular_warden/check_special_requirements(mob/user) if(!..()) return FALSE for(var/obj/structure/destructible/clockwork/structure in get_turf(invoker)) @@ -32,16 +32,16 @@ break_message = "A black ooze leaks from the ocular warden as it slowly sinks to the ground." icon_state = "ocular_warden" max_integrity = 60 - armor = list("melee" = -80, "bullet" = -50, "laser" = 40, "energy" = 40, "bomb" = 20, "bio" = 0, "rad" = 0) + armor = list("melee" = -80, "bullet" = -50, "laser" = 40, "energy" = 40, "bomb" = 20, "bio" = 0, "rad" = 0, "stamina" = 0) var/cooldown -/obj/structure/destructible/clockwork/ocular_warden/process() +/obj/structure/destructible/clockwork/ocular_warden/process(delta_time) //Can we fire? if(world.time < cooldown) return //Check hostiles in range var/list/valid_targets = list() - for(var/mob/living/potential in view(OCULAR_WARDEN_RANGE, src)) + for(var/mob/living/potential in hearers(OCULAR_WARDEN_RANGE, src)) if(!is_servant_of_ratvar(potential) && !potential.stat) valid_targets += potential if(!LAZYLEN(valid_targets)) @@ -51,7 +51,7 @@ if(!target) return dir = get_dir(get_turf(src), get_turf(target)) - target.apply_damage(max(20 - (get_dist(src, target)*5), 10), BURN) + target.apply_damage(max(10 - (get_dist(src, target)*2.5), 5)*delta_time, BURN) new /obj/effect/temp_visual/ratvar/ocular_warden(get_turf(target)) new /obj/effect/temp_visual/ratvar/ocular_warden(get_turf(src)) playsound(get_turf(target), 'sound/machines/clockcult/ocularwarden-dot1.ogg', 60, TRUE) diff --git a/code/modules/antagonists/clock_cult/scriptures/prosperity_prism.dm b/code/modules/antagonists/clock_cult/scriptures/prosperity_prism.dm index 3156d54118496..5a92bd468b179 100644 --- a/code/modules/antagonists/clock_cult/scriptures/prosperity_prism.dm +++ b/code/modules/antagonists/clock_cult/scriptures/prosperity_prism.dm @@ -53,7 +53,11 @@ else if(depowered || !powered) icon_state += "_inactive" -/obj/structure/destructible/clockwork/gear_base/prosperityprism/process() +/obj/structure/destructible/clockwork/gear_base/prosperityprism/process(delta_time) + if(!anchored) + toggled_on = FALSE + update_icon_state() + return if(!toggled_on || depowered) if(powered) powered = FALSE @@ -62,24 +66,29 @@ if(!powered) powered = TRUE update_icon_state() - for(var/mob/living/L in range(4)) + for(var/mob/living/L in range(4, src)) if(!is_servant_of_ratvar(L)) continue - if(use_power(4)) - L.adjustToxLoss(-10) - L.adjustStaminaLoss(-10) - L.adjustBruteLoss(-2) - L.adjustFireLoss(-2) + if(!L.toxloss && !L.staminaloss && !L.bruteloss && !L.fireloss) + continue + if(use_power(2)) + L.adjustToxLoss(-50*delta_time, FALSE, TRUE) + L.adjustStaminaLoss(-50*delta_time) + L.adjustBruteLoss(-10*delta_time) + L.adjustFireLoss(-10*delta_time) new /obj/effect/temp_visual/heal(get_turf(L), "#45dd8a") for(var/datum/reagent/R in L.reagents.reagent_list) if(istype(R, /datum/reagent/toxin)) - L.reagents.remove_reagent(R.type, 10) - holder.add_reagent(R.type, 10) + L.reagents.remove_reagent(R.type, 50*delta_time) + holder.add_reagent(R.type, 50*delta_time) /obj/structure/destructible/clockwork/gear_base/prosperityprism/attack_hand(mob/user) if(is_servant_of_ratvar(user)) + if(!anchored) + to_chat(user, "[src] needs to be fastened to the floor!") + return toggled_on = !toggled_on - to_chat(user, "You flick the switch on [src], turning it [toggled_on?"on":"off"]!") + to_chat(user, "You flick the switch on [src], turning it [toggled_on?"on":"off"]!") else . = ..() diff --git a/code/modules/antagonists/clock_cult/scriptures/sentinels_compromise.dm b/code/modules/antagonists/clock_cult/scriptures/sentinels_compromise.dm index 64a7135999ad7..9edb2ae63ea0f 100644 --- a/code/modules/antagonists/clock_cult/scriptures/sentinels_compromise.dm +++ b/code/modules/antagonists/clock_cult/scriptures/sentinels_compromise.dm @@ -11,7 +11,7 @@ power_cost = 80 /datum/clockcult/scripture/slab/sentinelscompromise/click_on(atom/A) - if(!(get_turf(A) in view(7, get_turf(invoker)))) + if(!(invoker in viewers(7, get_turf(A)))) return var/mob/living/M = A if(!istype(M)) @@ -33,6 +33,7 @@ M.adjustFireLoss(-M.getFireLoss() * 0.6, FALSE) M.adjustOxyLoss(-M.getOxyLoss() * 0.6, FALSE) M.adjustCloneLoss(-M.getCloneLoss() * 0.6, TRUE) + M.blood_volume = BLOOD_VOLUME_NORMAL M.reagents.remove_reagent(/datum/reagent/water/holywater, INFINITY) M.set_nutrition(NUTRITION_LEVEL_FULL) M.bodytemperature = BODYTEMP_NORMAL @@ -44,5 +45,7 @@ M.cure_husk() M.hallucination = 0 new /obj/effect/temp_visual/heal(get_turf(M), "#f8d984") + playsound(M, 'sound/magic/magic_missile.ogg', 50, TRUE) + playsound(invoker, 'sound/magic/magic_missile.ogg', 50, TRUE) invoker.adjustToxLoss(min(total_damage/2, 80)) return TRUE diff --git a/code/modules/antagonists/clock_cult/scriptures/sigil_of_submission.dm b/code/modules/antagonists/clock_cult/scriptures/sigil_of_submission.dm index 49e5e66b33cba..895e8b64d27b5 100644 --- a/code/modules/antagonists/clock_cult/scriptures/sigil_of_submission.dm +++ b/code/modules/antagonists/clock_cult/scriptures/sigil_of_submission.dm @@ -8,7 +8,7 @@ button_icon_state = "Sigil of Submission" power_cost = 250 invokation_time = 50 - invokation_text = list("Relax you animal...", "...for I shall show you the truth.") + invokation_text = list("Relax you animal...", "for I shall show you the truth.") summoned_structure = /obj/structure/destructible/clockwork/sigil/submission cogs_required = 1 category = SPELLTYPE_SERVITUDE diff --git a/code/modules/antagonists/clock_cult/scriptures/sigil_of_vitality.dm b/code/modules/antagonists/clock_cult/scriptures/sigil_of_vitality.dm index b0a8f6e5cdc1e..e67fb4f861a74 100644 --- a/code/modules/antagonists/clock_cult/scriptures/sigil_of_vitality.dm +++ b/code/modules/antagonists/clock_cult/scriptures/sigil_of_vitality.dm @@ -6,7 +6,7 @@ desc = "Summons a vitality matrix, which drains the life force of non servants, and can be used to heal or revive servants. Requires 2 invokers." tip = "Heal and revive dead servants, while draining the health from non servants." button_icon_state = "Sigil of Vitality" - power_cost = 400 + power_cost = 300 invokation_time = 50 invokation_text = list("My life in your hands.") summoned_structure = /obj/structure/destructible/clockwork/sigil/vitality @@ -37,6 +37,8 @@ return FALSE if(HAS_TRAIT(M, TRAIT_NODEATH)) return FALSE + if(issilicon(M)) + return FALSE return TRUE /obj/structure/destructible/clockwork/sigil/vitality/apply_effects(mob/living/M) @@ -66,24 +68,39 @@ M.adjustBruteLoss(-5, FALSE) M.adjustFireLoss(-5, FALSE) M.adjustOxyLoss(-5, FALSE) - M.adjustToxLoss(-5, FALSE) + M.adjustToxLoss(-5, FALSE, TRUE) M.adjustCloneLoss(-5) else visible_message("\The [src] fails to heal [M]!", "There is insufficient vitality to heal your wounds!") else if(M.anti_magic_check()) return + if(is_convertable_to_clockcult(M) && !GLOB.gateway_opening) + visible_message("\The [src] refuses to siphon [M]'s vitality, their mind has great potential!") + return M.Paralyze(10) - M.adjustCloneLoss(20) + var/before_cloneloss = M.getCloneLoss() + M.adjustCloneLoss(20, TRUE, TRUE) + var/after_cloneloss = M.getCloneLoss() + if(before_cloneloss == after_cloneloss) + visible_message("\The [src] fails to siphon [M]'s spirit!") + return playsound(loc, 'sound/magic/clockwork/ratvar_attack.ogg', 40) - if(M.stat == DEAD) + if(M.stat == DEAD && length(GLOB.servant_spawns)) M.become_husk() M.death() playsound(loc, 'sound/magic/exit_blood.ogg', 60) to_chat(M, "The last of your life is drained away...") hierophant_message("[M] has had their vitality drained by the [src]!", null, "") + var/mob/cogger = new /mob/living/simple_animal/drone/cogscarab(get_turf(M)) + cogger.key = M.key + if(!cogger.grab_ghost(TRUE)) + //Replace the mob with a shell + qdel(cogger) + new /obj/effect/mob_spawn/drone/cogscarab(get_turf(M)) + add_servant_of_ratvar(cogger, silent=TRUE) return if(M.client) - M.visible_message("[src] looks weak as the color fades from their body.", "You feel your soul faltering...") + M.visible_message("[M] looks weak as the color fades from their body.", "You feel your soul faltering...") GLOB.clockcult_vitality += 30 GLOB.clockcult_vitality += 10 diff --git a/code/modules/antagonists/clock_cult/scriptures/sigil_transmission.dm b/code/modules/antagonists/clock_cult/scriptures/sigil_transmission.dm index 0ee6eb86eddd7..91b614aea96a8 100644 --- a/code/modules/antagonists/clock_cult/scriptures/sigil_transmission.dm +++ b/code/modules/antagonists/clock_cult/scriptures/sigil_transmission.dm @@ -10,7 +10,7 @@ button_icon_state = "Sigil of Transmission" power_cost = 100 invokation_time = 50 - invokation_text = list("Oh great holy one...", "...your energy...", "...the power of the holy light!") + invokation_text = list("Oh great holy one...", "your energy...", "the power of the holy light!") summoned_structure = /obj/structure/destructible/clockwork/sigil/transmission cogs_required = 0 invokers_required = 2 diff --git a/code/modules/antagonists/clock_cult/scriptures/stargazer.dm b/code/modules/antagonists/clock_cult/scriptures/stargazer.dm index c2e637908a436..49453951000cb 100644 --- a/code/modules/antagonists/clock_cult/scriptures/stargazer.dm +++ b/code/modules/antagonists/clock_cult/scriptures/stargazer.dm @@ -6,7 +6,7 @@ desc = "Allows you to enchant your weapons and armor, however enchanting can have risky side effects." tip = "Make your gear more powerful by enchanting them with stargazers." button_icon_state = "Stargazer" - power_cost = 600 + power_cost = 300 invokation_time = 80 invokation_text = list("A light of Eng'ine shall empower my armaments!") summoned_structure = /obj/structure/destructible/clockwork/gear_base/stargazer @@ -83,7 +83,7 @@ if(QDELETED(sg_light)) return var/mob_nearby = FALSE - for(var/mob/living/M in view(2, get_turf(src))) + for(var/mob/living/M in viewers(2, get_turf(src))) if(is_servant_of_ratvar(M)) mob_nearby = TRUE break diff --git a/code/modules/antagonists/clock_cult/scriptures/summon_cogscarab.dm b/code/modules/antagonists/clock_cult/scriptures/summon_cogscarab.dm index e8c5cf445fd7e..e03ca65875ef7 100644 --- a/code/modules/antagonists/clock_cult/scriptures/summon_cogscarab.dm +++ b/code/modules/antagonists/clock_cult/scriptures/summon_cogscarab.dm @@ -28,4 +28,4 @@ . = ..() /datum/clockcult/scripture/cogscarab/invoke_success() - new /obj/item/drone_shell/cogscarab(get_turf(invoker)) + new /obj/effect/mob_spawn/drone/cogscarab(get_turf(invoker)) diff --git a/code/modules/antagonists/clock_cult/scriptures/summon_marauder.dm b/code/modules/antagonists/clock_cult/scriptures/summon_marauder.dm index c221444268bbc..ef41ed2bb6136 100644 --- a/code/modules/antagonists/clock_cult/scriptures/summon_marauder.dm +++ b/code/modules/antagonists/clock_cult/scriptures/summon_marauder.dm @@ -3,13 +3,13 @@ //==================================// /datum/clockcult/scripture/marauder name = "Summon Clockwork Marauder" - desc = "Summons a Clockwork Marauder, a powerful warrior that can deflect ranged attacks. Requires 3 invokers and 80 vitality." + desc = "Summons a Clockwork Marauder, a powerful warrior that can deflect ranged attacks. Requires 3 invokers and 100 vitality." tip = "Use Clockwork Marauders as a powerful soldier to send into combat when the fighting gets rough." button_icon_state = "Clockwork Marauder" - power_cost = 8000 - vitality_cost = 80 + power_cost = 2000 + vitality_cost = 100 invokation_time = 300 - invokation_text = list("Through the fires and flames...", "...nothing outshines Eng'Ine!") + invokation_text = list("Through the fires and flames...", "nothing outshines Eng'Ine!") category = SPELLTYPE_PRESERVATION cogs_required = 6 invokers_required = 3 @@ -31,6 +31,14 @@ ..() /datum/clockcult/scripture/marauder/invoke_success() - var/mob/new_mob = new /mob/living/simple_animal/clockwork_marauder(get_turf(invoker)) + var/mob/new_mob = new /mob/living/simple_animal/hostile/clockwork_marauder(get_turf(invoker)) new_mob.key = selected.key selected = null + +/datum/clockcult/scripture/marauder/check_special_requirements(mob/user) + if(!..()) + return FALSE + if(LAZYLEN(GLOB.clockwork_marauders) >= 4) + to_chat(user, "The mechanical-soul infrastructure of Reebe is too weak to support more clockwork battle constructs!") + return FALSE + return TRUE diff --git a/code/modules/antagonists/clock_cult/scriptures/vanguard.dm b/code/modules/antagonists/clock_cult/scriptures/vanguard.dm index 6d68a8fab2dc3..116552ddb93b3 100644 --- a/code/modules/antagonists/clock_cult/scriptures/vanguard.dm +++ b/code/modules/antagonists/clock_cult/scriptures/vanguard.dm @@ -2,7 +2,7 @@ name = "Vanguard" use_time = 300 slab_overlay = "vanguard" - desc = "Provides the user with 30 seconds of stun immunity, but half of the stun absorbed will be applied at once, knocking you unconscious if you receive more than 15 seconds of stuns." + desc = "Provides the user with 30 seconds of stun immunity, however other spells cannot be invoked while it is active." tip = "Gain temporary immunity against batons and disablers." invokation_time = 10 button_icon_state = "Vanguard" @@ -28,9 +28,6 @@ . = ..() if(time_left == 50) to_chat(invoker, "You start to feel tired again.") - var/delta_stamdam = max(invoker.getStaminaLoss() - last_recorded_stam_dam, 0) - total_stamina_damage += delta_stamdam - last_recorded_stam_dam = invoker.getStaminaLoss() /datum/clockcult/scripture/slab/vanguard/end_invoke() REMOVE_TRAIT(invoker, TRAIT_STUNIMMUNE, VANGUARD_TRAIT) @@ -39,11 +36,4 @@ REMOVE_TRAIT(invoker, TRAIT_IGNOREDAMAGESLOWDOWN, VANGUARD_TRAIT) REMOVE_TRAIT(invoker, TRAIT_NOSTAMCRIT, VANGUARD_TRAIT) REMOVE_TRAIT(invoker, TRAIT_NOLIMBDISABLE, VANGUARD_TRAIT) - to_chat(invoker, "You suddenly collapse from exhaustion!") - if(!ishuman(invoker)) - invoker.Unconscious(50) - else if(total_stamina_damage > 100) - invoker.Unconscious(total_stamina_damage / 4) - else - invoker.Paralyze(total_stamina_damage / 2) ..() diff --git a/code/modules/antagonists/clock_cult/servant_of_ratvar.dm b/code/modules/antagonists/clock_cult/servant_of_ratvar.dm index a3eadd57566a9..47a748769372b 100644 --- a/code/modules/antagonists/clock_cult/servant_of_ratvar.dm +++ b/code/modules/antagonists/clock_cult/servant_of_ratvar.dm @@ -13,7 +13,7 @@ var/datum/action/innate/clockcult/transmit/transmit_spell var/datum/team/clock_cult/team - var/prefix = CLOCKCULT_RECRUIT + var/prefix = CLOCKCULT_PREFIX_RECRUIT var/counts_towards_total = TRUE//Counts towards the total number of servants. @@ -29,6 +29,10 @@ to_chat(owner.current, "Use your Clockwork Slab to summon integration cogs to unlock more scriptures and siphon power.") to_chat(owner.current, "Unlock Kindle to stun targets, Hateful Manacles to restrain them and use a sigil of submission to convert them!") to_chat(owner.current, "When you are ready, gather 6 cultists around the Ark and activate it to summon Rat'var, but be prepared to fight for your life.") + owner.current.client?.tgui_panel?.give_antagonist_popup("Servant of Rat'Var", + "Use your clockwork slab to unlock and invoke scriptures.\n\ + Hijack APCs by placing an integration cog into them.\n\ + Convert the unfaithful to your side but above all else, protect the Gateway!") /datum/antagonist/servant_of_ratvar/on_gain() . = ..() @@ -43,7 +47,6 @@ GLOB.cyborg_servants_of_ratvar |= owner check_ark_status() owner.announce_objectives() - owner.language_holder.grant_language(/datum/language/ratvar) /datum/antagonist/servant_of_ratvar/on_removal() team.remove_member(owner) @@ -58,12 +61,14 @@ owner.current.faction |= "ratvar" transmit_spell = new() transmit_spell.Grant(owner.current) - owner.current.throw_alert("clockinfo", /obj/screen/alert/clockwork/clocksense) - SSticker.mode.update_clockcult_icons_added(owner) if(GLOB.gateway_opening && ishuman(owner.current)) var/mob/living/carbon/owner_mob = owner.current forbearance = mutable_appearance('icons/effects/genetics.dmi', "servitude", -MUTATIONS_LAYER) owner_mob.add_overlay(forbearance) + owner.current.throw_alert("clockinfo", /atom/movable/screen/alert/clockwork/clocksense) + SSticker.mode.update_clockcult_icons_added(owner) + var/datum/language_holder/LH = owner.current.get_language_holder() + LH.grant_language(/datum/language/ratvar, TRUE, TRUE, LANGUAGE_CULTIST) /datum/antagonist/servant_of_ratvar/remove_innate_effects(mob/living/M) owner.current.faction -= "ratvar" @@ -74,6 +79,8 @@ var/mob/living/carbon/owner_mob = owner.current owner_mob.remove_overlay(forbearance) qdel(forbearance) + var/datum/language_holder/LH = owner.current.get_language_holder() + LH.remove_language(/datum/language/ratvar, TRUE, TRUE, LANGUAGE_CULTIST) . = ..() /datum/antagonist/servant_of_ratvar/proc/equip_servant_conversion() @@ -102,18 +109,12 @@ H.put_in_hands(slab) slab.pickup(H) //Remove cuffs - if(H.handcuffed) - H.handcuffed.forceMove(get_turf(H)) - H.handcuffed = null - H.update_handcuffed() + H.uncuff() return FALSE //Grant access to the clockwork tools. //If AI, disconnect all active borgs and make it only able to control converted shells /datum/antagonist/servant_of_ratvar/proc/equip_silicon(mob/living/silicon/S) - S.laws = new /datum/ai_laws/ratvar - S.laws.associate(S) - S.show_laws() if(isAI(S)) var/mob/living/silicon/ai/AI = S AI.disconnect_shell() @@ -125,6 +126,9 @@ var/mob/living/silicon/robot/R = S R.connected_ai = null R.SetRatvar(TRUE) + S.laws = new /datum/ai_laws/ratvar //Laws down here so borgs don't instantly resync their laws + S.laws.associate(S) + S.show_laws() /datum/antagonist/servant_of_ratvar/proc/add_objectives() objectives |= team.objectives diff --git a/code/modules/antagonists/clock_cult/structure/clockwork_camera.dm b/code/modules/antagonists/clock_cult/structure/clockwork_camera.dm index ebe1b93140a74..d2e923a3e4181 100644 --- a/code/modules/antagonists/clock_cult/structure/clockwork_camera.dm +++ b/code/modules/antagonists/clock_cult/structure/clockwork_camera.dm @@ -1,4 +1,4 @@ -/mob/camera/aiEye/remote/ratvar +/mob/camera/ai_eye/remote/ratvar visible_icon = TRUE icon = 'icons/mob/cameramob.dmi' icon_state = "generic_camera" @@ -18,7 +18,7 @@ if(!isliving(owner)) return if(GLOB.gateway_opening) - to_chat(owner, "You cannot warp while the gateway is opening!") + to_chat(owner, "You cannot warp while the gateway is opening!") return if(warping) button_icon_state = "warp_down" @@ -26,24 +26,26 @@ warping = FALSE return var/mob/living/M = owner - var/mob/camera/aiEye/remote/ratvar/cam = M.remote_control + var/mob/camera/ai_eye/remote/ratvar/cam = M.remote_control var/target_loc = get_turf(cam) + var/area/AR = get_area(target_loc) if(isclosedturf(target_loc)) - to_chat(owner, "You cannot warp into dense objects.") + to_chat(owner, "You cannot warp into dense objects.") return - if(!get_area(target_loc).clockwork_warp_allowed) - to_chat(owner, "[get_area(target_loc).clockwork_warp_fail]") + if(!AR.clockwork_warp_allowed) + to_chat(owner, "[AR.clockwork_warp_fail]") return do_sparks(5, TRUE, get_turf(cam)) warping = TRUE button_icon_state = "warp_cancel" owner.update_action_buttons_icon() + var/mob/previous_mob = owner if(do_after(M, 50, target=target_loc, extra_checks=CALLBACK(src, .proc/special_check))) try_warp_servant(M, target_loc, 50, FALSE) var/obj/machinery/computer/camera_advanced/console = cam.origin console.remove_eye_control(M) button_icon_state = "warp_down" - owner.update_action_buttons_icon() + previous_mob.update_action_buttons_icon() warping = FALSE /datum/action/innate/clockcult/warp/proc/special_check() @@ -57,6 +59,7 @@ icon_state = "ratvarcomputer" clockwork = TRUE lock_override = CAMERA_LOCK_STATION + broken_overlay_emissive = TRUE var/datum/action/innate/clockcult/warp/warp_action /obj/machinery/computer/camera_advanced/ratvar/Initialize() @@ -68,10 +71,10 @@ STOP_PROCESSING(SSobj, src) . = ..() -/obj/machinery/computer/camera_advanced/ratvar/process() - if(prob(3)) +/obj/machinery/computer/camera_advanced/ratvar/process(delta_time) + if(DT_PROB(3, delta_time)) new /obj/effect/temp_visual/steam_release(get_turf(src)) - if(prob(7)) + if(DT_PROB(7, delta_time)) playsound(get_turf(src), 'sound/machines/beep.ogg', 20, TRUE) /obj/machinery/computer/camera_advanced/ratvar/can_use(mob/living/user) @@ -87,7 +90,7 @@ actions += warp_action /obj/machinery/computer/camera_advanced/ratvar/CreateEye() - eyeobj = new /mob/camera/aiEye/remote/ratvar(get_turf(SSmapping.get_station_center())) + eyeobj = new /mob/camera/ai_eye/remote/ratvar(get_turf(SSmapping.get_station_center())) eyeobj.origin = src eyeobj.visible_icon = TRUE eyeobj.icon = 'icons/mob/cameramob.dmi' diff --git a/code/modules/antagonists/clock_cult/structure/dimensional_rift.dm b/code/modules/antagonists/clock_cult/structure/dimensional_rift.dm index 0d81179d712d6..4fb3a57b8d7f3 100644 --- a/code/modules/antagonists/clock_cult/structure/dimensional_rift.dm +++ b/code/modules/antagonists/clock_cult/structure/dimensional_rift.dm @@ -29,7 +29,7 @@ if(do_after(M, 50, target=src)) var/obj/effect/landmark/city_of_cogs/target_spawn = pick(GLOB.city_of_cogs_spawns) var/turf/T = get_turf(target_spawn) - M.forceMove(T) + do_teleport(M, T, no_effects = TRUE, channel = TELEPORT_CHANNEL_FREE, forced = TRUE) var/mob/living/M_mob = M if(istype(M_mob)) if(M_mob.client) @@ -43,4 +43,4 @@ //So we can push crates in too var/obj/effect/landmark/city_of_cogs/target_spawn = pick(GLOB.city_of_cogs_spawns) var/turf/T = get_turf(target_spawn) - M.forceMove(T) + do_teleport(M, T, no_effects = TRUE, channel = TELEPORT_CHANNEL_FREE, forced = TRUE) diff --git a/code/modules/antagonists/clock_cult/structure/gear_base.dm b/code/modules/antagonists/clock_cult/structure/gear_base.dm index 179d91f922ba4..faa13a422a8d5 100644 --- a/code/modules/antagonists/clock_cult/structure/gear_base.dm +++ b/code/modules/antagonists/clock_cult/structure/gear_base.dm @@ -22,10 +22,13 @@ for(var/obj/structure/destructible/clockwork/sigil/transmission/ST in transmission_sigils) ST.linked_structures -= src -/obj/structure/destructible/clockwork/gear_base/wrench_act(mob/living/user, obj/item/I) - if(do_after(user, 40, target=src)) - anchored = !anchored - update_icon_state() +/obj/structure/destructible/clockwork/gear_base/attackby(obj/item/I, mob/user, params) + if(is_servant_of_ratvar(user) && I.tool_behaviour == TOOL_WRENCH) + to_chat(user, "You begin to [anchored ? "unwrench" : "wrench"] [src].") + if(I.use_tool(src, user, 20, volume=50)) + to_chat(user, "You successfully [anchored ? "unwrench" : "wrench"] [src].") + setAnchored(!anchored) + update_icon_state() return TRUE else return ..() diff --git a/code/modules/antagonists/clock_cult/traps/recievers/flipper.dm b/code/modules/antagonists/clock_cult/traps/recievers/flipper.dm index eb64cc243dc18..66215d794eb16 100644 --- a/code/modules/antagonists/clock_cult/traps/recievers/flipper.dm +++ b/code/modules/antagonists/clock_cult/traps/recievers/flipper.dm @@ -1,12 +1,12 @@ /obj/item/clockwork/trap_placer/flipper name = "flipper" - desc = "A steam powered rotating floor panel. When input is recieved it will fling anyone on top of it." + desc = "A steam powered rotating floor panel. When input is received it will fling anyone on top of it." icon_state = "pressure_sensor" result_path = /obj/structure/destructible/clockwork/trap/flipper /obj/structure/destructible/clockwork/trap/flipper name = "flipper" - desc = "A steam powered rotating floor panel. When input is recieved it will fling anyone on top of it." + desc = "A steam powered rotating floor panel. When input is received it will fling anyone on top of it." icon_state = "pressure_sensor" component_datum = /datum/component/clockwork_trap/flipper unwrench_path = /obj/item/clockwork/trap_placer/flipper diff --git a/code/modules/antagonists/clock_cult/traps/recievers/skewer.dm b/code/modules/antagonists/clock_cult/traps/recievers/skewer.dm index 250d26645a863..d44c5f539860a 100644 --- a/code/modules/antagonists/clock_cult/traps/recievers/skewer.dm +++ b/code/modules/antagonists/clock_cult/traps/recievers/skewer.dm @@ -76,4 +76,4 @@ var/obj/structure/destructible/clockwork/trap/skewer/S = parent if(!istype(S)) return - S.stab() + INVOKE_ASYNC(S, /obj/structure/destructible/clockwork/trap/skewer.proc/stab) diff --git a/code/modules/antagonists/clock_cult/traps/senders/delay.dm b/code/modules/antagonists/clock_cult/traps/senders/delay.dm index 4002d88830f2f..65562a32cf817 100644 --- a/code/modules/antagonists/clock_cult/traps/senders/delay.dm +++ b/code/modules/antagonists/clock_cult/traps/senders/delay.dm @@ -1,12 +1,12 @@ /obj/item/wallframe/clocktrap/delay name = "clockwork timer" - desc = "A small timer attatched to the wall. When input is recieved it will send an output signal half a second later." + desc = "A small timer attatched to the wall. When input is received it will send an output signal half a second later." icon_state = "delayer" result_path = /obj/structure/destructible/clockwork/trap/delay /obj/structure/destructible/clockwork/trap/delay name = "clockwork timer" - desc = "A small timer attatched to the wall. When input is recieved it will send an output signal half a second later." + desc = "A small timer attatched to the wall. When input is received it will send an output signal half a second later." icon_state = "delayer" component_datum = /datum/component/clockwork_trap/delay unwrench_path = /obj/item/wallframe/clocktrap/delay diff --git a/code/modules/antagonists/clock_cult/traps/senders/pressure_sensor.dm b/code/modules/antagonists/clock_cult/traps/senders/pressure_sensor.dm index b349ba34d5b01..e49c99a36003d 100644 --- a/code/modules/antagonists/clock_cult/traps/senders/pressure_sensor.dm +++ b/code/modules/antagonists/clock_cult/traps/senders/pressure_sensor.dm @@ -23,6 +23,8 @@ RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/crossed) /datum/component/clockwork_trap/pressure_sensor/proc/crossed(datum/source, atom/movable/AM) + SIGNAL_HANDLER + //Item's in hands or boxes shouldn't trigger it if(!istype(AM.loc, /turf)) return @@ -37,5 +39,5 @@ trigger_connected() for(var/obj/structure/destructible/clockwork/trap/T in get_turf(parent)) if(T != parent) - SEND_SIGNAL(T, COMSIG_CLOCKWORK_SIGNAL_RECIEVED) + SEND_SIGNAL(T, COMSIG_CLOCKWORK_SIGNAL_RECEIVED) playsound(get_turf(parent), 'sound/machines/click.ogg', 50) diff --git a/code/modules/antagonists/clock_cult/traps/trap.dm b/code/modules/antagonists/clock_cult/traps/trap.dm index 5500e955b5770..aee46228300d3 100644 --- a/code/modules/antagonists/clock_cult/traps/trap.dm +++ b/code/modules/antagonists/clock_cult/traps/trap.dm @@ -66,7 +66,7 @@ . = ..() outputs = list() - RegisterSignal(parent, COMSIG_CLOCKWORK_SIGNAL_RECIEVED, .proc/trigger) + RegisterSignal(parent, COMSIG_CLOCKWORK_SIGNAL_RECEIVED, .proc/trigger) RegisterSignal(parent, COMSIG_ATOM_EMINENCE_ACT, .proc/trigger) //The eminence can trigger traps too RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/clicked) RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy) @@ -78,12 +78,18 @@ output.outputs |= parent /datum/component/clockwork_trap/proc/trigger() + SIGNAL_HANDLER + return TRUE /datum/component/clockwork_trap/proc/clicked(mob/user) + SIGNAL_HANDLER + return /datum/component/clockwork_trap/proc/OnAttackBy(datum/source, obj/item/I, mob/user) + SIGNAL_HANDLER + if(is_servant_of_ratvar(user)) if(istype(I, /obj/item/clockwork/clockwork_slab)) var/obj/item/clockwork/clockwork_slab/slab = I @@ -103,4 +109,4 @@ /datum/component/clockwork_trap/proc/trigger_connected() for(var/obj/O in outputs) - SEND_SIGNAL(O, COMSIG_CLOCKWORK_SIGNAL_RECIEVED) + SEND_SIGNAL(O, COMSIG_CLOCKWORK_SIGNAL_RECEIVED) diff --git a/code/modules/antagonists/creep/creep.dm b/code/modules/antagonists/creep/creep.dm index 5390758ae7624..84ab0827e1afa 100644 --- a/code/modules/antagonists/creep/creep.dm +++ b/code/modules/antagonists/creep/creep.dm @@ -22,13 +22,15 @@ C.gain_trauma(/datum/brain_trauma/special/obsessed)//ZAP /datum/antagonist/obsessed/greet() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/creepalert.ogg', 100, FALSE, pressure_affected = FALSE) + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/creepalert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) to_chat(owner, "You are the Obsessed!") to_chat(owner, "The Voices have reached out to you, and are using you to complete their evil deeds.") to_chat(owner, "You don't know their connection, but The Voices compel you to stalk [trauma.obsession], forcing them into a state of constant paranoia.") to_chat(owner, "The Voices will retaliate if you fail to complete your tasks or spend too long away from your target.") to_chat(owner, "This role does NOT enable you to otherwise surpass what's deemed creepy behavior per the rules.")//ironic if you know the history of the antag owner.announce_objectives() + owner.current.client?.tgui_panel?.give_antagonist_popup("Obsession", + "Stalk [trauma.obsession] and force them into a constant state of paranoia.") /datum/antagonist/obsessed/Destroy() if(trauma) @@ -179,6 +181,8 @@ chosen_department = "supply" if(oldmind.assigned_role in GLOB.civilian_positions) chosen_department = "civilian" + if(oldmind.assigned_role in GLOB.gimmick_positions) + chosen_department = "civilian" for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) if(!H.mind) continue @@ -198,6 +202,8 @@ their_chosen_department = "supply" if(H.mind.assigned_role in GLOB.civilian_positions) their_chosen_department = "civilian" + if(H.mind.assigned_role in GLOB.gimmick_positions) + chosen_department = "civilian" if(their_chosen_department != chosen_department) continue viable_coworkers += H.mind @@ -251,8 +257,8 @@ /datum/objective/polaroid/update_explanation_text() ..() - if(target?.current) - explanation_text = "Take a photo with [target.name] while they're alive." + if(target && target.current) + explanation_text = "Take a photo of [target.name] while they're alive." else explanation_text = "Free Objective" @@ -265,7 +271,7 @@ for(var/obj/I in all_items) //Check for wanted items if(istype(I, /obj/item/photo)) var/obj/item/photo/P = I - if(P.picture.mobs_seen.Find(owner) && P.picture.mobs_seen.Find(target) && !P.picture.dead_seen.Find(target))//you are in the picture, they are but they are not dead. + if(P.picture && (target.current in P.picture.mobs_seen) && !(target.current in P.picture.dead_seen)) //Does the picture exist and is the target in it and is the target not dead return TRUE return FALSE diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 07053a0a4c6e4..2b2a4823714e4 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -35,9 +35,8 @@ /datum/action/innate/cult/blood_magic/Activate() var/rune = FALSE var/limit = RUNELESS_MAX_BLOODCHARGE - for(var/obj/effect/rune/empower/R in range(1, owner)) + if(locate(/obj/effect/rune/empower) in range(1, owner)) rune = TRUE - break if(rune) limit = MAX_BLOODCHARGE if(spells.len >= limit) @@ -141,14 +140,14 @@ name = "Stun" desc = "Empowers your hand to stun and mute a victim on contact." button_icon_state = "hand" - magic_path = "/obj/item/melee/blood_magic/stun" + magic_path = /obj/item/melee/blood_magic/stun health_cost = 10 /datum/action/innate/cult/blood_spell/teleport name = "Teleport" desc = "Empowers your hand to teleport yourself or another cultist to a teleport rune on contact." button_icon_state = "tele" - magic_path = "/obj/item/melee/blood_magic/teleport" + magic_path = /obj/item/melee/blood_magic/teleport health_cost = 7 /datum/action/innate/cult/blood_spell/emp @@ -157,12 +156,13 @@ button_icon_state = "emp" health_cost = 10 invocation = "Ta'gh fara'qha fel d'amar det!" + check_flags = AB_CHECK_CONSCIOUS /datum/action/innate/cult/blood_spell/emp/Activate() + owner.whisper(invocation, language = /datum/language/common) owner.visible_message("[owner]'s hand flashes a bright blue!", \ "You speak the cursed words, emitting an EMP blast from your hand.") empulse(owner, 2, 5) - owner.whisper(invocation, language = /datum/language/common) charges-- if(charges<=0) qdel(src) @@ -172,41 +172,42 @@ desc = "Empowers your hand to start handcuffing victim on contact, and mute them if successful." button_icon_state = "cuff" charges = 4 - magic_path = "/obj/item/melee/blood_magic/shackles" + magic_path = /obj/item/melee/blood_magic/shackles /datum/action/innate/cult/blood_spell/construction name = "Twisted Construction" desc = "Empowers your hand to corrupt certain metalic objects.
Converts:
Plasteel into runed metal
50 iron into a construct shell
Living cyborgs into constructs after a delay
Cyborg shells into construct shells
Airlocks into brittle runed airlocks after a delay (harm intent)" button_icon_state = "transmute" - magic_path = "/obj/item/melee/blood_magic/construction" + magic_path = /obj/item/melee/blood_magic/construction health_cost = 12 /datum/action/innate/cult/blood_spell/equipment - name = "Summon Equipment" - desc = "Allows you to summon a ritual dagger, or empowers your hand to summon combat gear onto a cultist you touch, including cult armor, a cult bola, and a cult sword." + name = "Summon Combat Equipment" + desc = "Empowers your hand to summon combat gear onto a cultist you touch, including cult armor, a cult bola, and a cult sword. Not recommended for use before the blood cult's presence has been revealed." button_icon_state = "equip" - magic_path = "/obj/item/melee/blood_magic/armor" - -/datum/action/innate/cult/blood_spell/equipment/Activate() - var/choice = alert(owner,"Choose your equipment type",,"Combat Equipment","Ritual Dagger","Cancel") - if(choice == "Ritual Dagger") - var/turf/T = get_turf(owner) - owner.visible_message("[owner]'s hand glows red for a moment.", \ - "Red light begins to shimmer and take form within your hand!") - var/obj/O = new /obj/item/melee/cultblade/dagger(T) - if(owner.put_in_hands(O)) - to_chat(owner, "A ritual dagger appears in your hand!") - else - owner.visible_message("A ritual dagger appears at [owner]'s feet!", \ - "A ritual dagger materializes at your feet.") - SEND_SOUND(owner, sound('sound/effects/magic.ogg',0,1,25)) - charges-- - desc = base_desc - desc += "
Has [charges] use\s remaining." - if(charges<=0) - qdel(src) - else if(choice == "Combat Equipment") - ..() + magic_path = /obj/item/melee/blood_magic/armor + +/datum/action/innate/cult/blood_spell/dagger + name = "Summon Ritual Dagger" + desc = "Allows you to summon a ritual dagger, in case you've lost the dagger that was given to you." + invocation = "Wur d'dai leev'mai k'sagan!" //where did I leave my keys, again? + button_icon_state = "equip" //this is the same icon that summon equipment uses, but eh, I'm not a spriter + +/datum/action/innate/cult/blood_spell/dagger/Activate() + var/turf/owner_turf = get_turf(owner) + owner.whisper(invocation, language = /datum/language/common) + owner.visible_message("[owner]'s hand glows red for a moment.", \ + "Your plea for aid is answered, and light begins to shimmer and take form within your hand!") + var/obj/item/melee/cultblade/dagger/summoned_blade = new (owner_turf) + if(owner.put_in_hands(summoned_blade)) + to_chat(owner, "A ritual dagger appears in your hand!") + else + owner.visible_message("A ritual dagger appears at [owner]'s feet!", \ + "A ritual dagger materializes at your feet.") + SEND_SOUND(owner, sound('sound/effects/magic.ogg', FALSE, 0, 25)) + charges-- + if(charges <= 0) + qdel(src) /datum/action/innate/cult/blood_spell/horror name = "Hallucinations" @@ -214,6 +215,7 @@ button_icon_state = "horror" var/obj/effect/proc_holder/horror/PH charges = 4 + check_flags = AB_CHECK_CONSCIOUS /datum/action/innate/cult/blood_spell/horror/New() PH = new() @@ -256,7 +258,7 @@ var/turf/T = get_turf(ranged_ability_user) if(!isturf(T)) return FALSE - if(target in view(7, get_turf(ranged_ability_user))) + if(ranged_ability_user in viewers(7, get_turf(target))) if(!ishuman(target) || iscultist(target)) return var/mob/living/carbon/human/H = target @@ -281,6 +283,7 @@ button_icon_state = "gone" charges = 10 var/revealing = FALSE //if it reveals or not + check_flags = AB_CHECK_CONSCIOUS /datum/action/innate/cult/blood_spell/veiling/Activate() if(!revealing) @@ -289,14 +292,14 @@ charges-- SEND_SOUND(owner, sound('sound/magic/smoke.ogg',0,1,25)) owner.whisper(invocation, language = /datum/language/common) - for(var/obj/effect/rune/R in range(5,owner)) + for(var/obj/effect/rune/R in range(5, owner)) R.conceal() - for(var/obj/structure/destructible/cult/S in range(5,owner)) + for(var/obj/structure/destructible/cult/S in range(5, owner)) S.conceal() - for(var/turf/open/floor/engine/cult/T in range(5,owner)) - T.realappearance.alpha = 0 for(var/obj/machinery/door/airlock/cult/AL in range(5, owner)) AL.conceal() + for(var/turf/open/floor/engine/cult/T in RANGE_TURFS(5,owner)) + T.realappearance.alpha = 0 revealing = TRUE name = "Reveal Runes" button_icon_state = "back" @@ -310,10 +313,10 @@ R.reveal() for(var/obj/structure/destructible/cult/S in range(6,owner)) S.reveal() - for(var/turf/open/floor/engine/cult/T in range(6,owner)) - T.realappearance.alpha = initial(T.realappearance.alpha) for(var/obj/machinery/door/airlock/cult/AL in range(6, owner)) AL.reveal() + for(var/turf/open/floor/engine/cult/T in RANGE_TURFS(6,owner)) + T.realappearance.alpha = initial(T.realappearance.alpha) revealing = FALSE name = "Conceal Runes" button_icon_state = "gone" @@ -329,7 +332,7 @@ invocation = "Fel'th Dol Ab'orod!" button_icon_state = "manip" charges = 5 - magic_path = "/obj/item/melee/blood_magic/manipulator" + magic_path = /obj/item/melee/blood_magic/manipulator // The "magic hand" items @@ -430,7 +433,7 @@ if(istype(anti_magic_source, /obj/item)) target.visible_message("[L] is utterly unphased by your utterance!", \ "[GLOB.deity] protects you from the heresy of [user]!") - else if(!HAS_TRAIT(target, TRAIT_MINDSHIELD) && !istype(L.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + else if(!HAS_TRAIT(target, TRAIT_MINDSHIELD) && !istype(L.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) to_chat(user, "[L] falls to the ground, gibbering madly!") L.Paralyze(160) L.flash_act(1,1) @@ -555,12 +558,12 @@ /obj/item/melee/blood_magic/construction/examine(mob/user) . = ..() - . += {"A sinister spell used to convert:\n - Plasteel into runed metal\n - [IRON_TO_CONSTRUCT_SHELL_CONVERSION] metal into a construct shell\n - Living cyborgs into constructs after a delay\n - Cyborg shells into construct shells\n - Airlocks into brittle runed airlocks after a delay (harm intent)"} + . += "A sinister spell used to convert:\n"+\ + "Plasteel into runed metal\n"+\ + "[IRON_TO_CONSTRUCT_SHELL_CONVERSION] metal into a construct shell\n"+\ + "Living cyborgs into constructs after a delay\n"+\ + "Cyborg shells into construct shells\n"+\ + "Airlocks into brittle runed airlocks after a delay (harm intent)" /obj/item/melee/blood_magic/construction/afterattack(atom/target, mob/user, proximity_flag, click_parameters) if(proximity_flag && iscultist(user)) @@ -644,22 +647,22 @@ return ..() -//Armor: Gives the target a basic cultist combat loadout +//Armor: Gives the target (cultist) a basic cultist combat loadout /obj/item/melee/blood_magic/armor name = "Arming Aura" - desc = "Will equipt cult combat gear onto a cultist on contact." + desc = "On contact, equips a cultist with combat gear." color = "#33cc33" // green /obj/item/melee/blood_magic/armor/afterattack(atom/target, mob/living/carbon/user, proximity) - if(iscarbon(target) && proximity) + if(iscarbon(target) && iscultist(target) && proximity) uses-- var/mob/living/carbon/C = target C.visible_message("Otherworldly armor suddenly appears on [C]!") - C.equip_to_slot_or_del(new /obj/item/clothing/under/color/black,SLOT_W_UNIFORM) - C.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), SLOT_HEAD) - 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/under/color/black,ITEM_SLOT_ICLOTHING) + C.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), ITEM_SLOT_OCLOTHING) + C.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), ITEM_SLOT_HEAD) + C.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), ITEM_SLOT_FEET) + C.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), ITEM_SLOT_BACK) if(C == user) qdel(src) //Clears the hands C.put_in_hands(new /obj/item/melee/cultblade(user)) @@ -762,7 +765,7 @@ var/temp = 0 var/turf/T = get_turf(target) if(T) - for(var/obj/effect/decal/cleanable/blood/B in view(T, 2)) + for(var/obj/effect/decal/cleanable/blood/B in view(2, T)) if(B.blood_state == BLOOD_STATE_HUMAN) if(B.bloodiness == 100) //Bonus for "pristine" bloodpools, also to prevent cheese with footprint spam temp += 30 @@ -770,7 +773,7 @@ temp += max((B.bloodiness**2)/800,1) new /obj/effect/temp_visual/cult/turf/floor(get_turf(B)) qdel(B) - for(var/obj/effect/decal/cleanable/trail_holder/TH in view(T, 2)) + for(var/obj/effect/decal/cleanable/trail_holder/TH in view(2, T)) qdel(TH) var/obj/item/clothing/shoes/shoecheck = user.shoes if(shoecheck && shoecheck.bloody_shoes[/datum/reagent/blood]) @@ -786,7 +789,7 @@ /obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user) if(iscultist(user)) var/list/options = list("Blood Spear (150)", "Blood Bolt Barrage (300)", "Blood Beam (500)") - var/choice = input(user, "Choose a greater blood rite...", "Greater Blood Rites") as null|anything in options + var/choice = input(user, "Choose a greater blood rite.", "Greater Blood Rites") as null|anything in options if(!choice) to_chat(user, "You decide against conducting a greater blood rite.") return @@ -799,7 +802,7 @@ var/turf/T = get_turf(user) qdel(src) var/datum/action/innate/cult/spear/S = new(user) - var/obj/item/twohanded/cult_spear/rite = new(T) + var/obj/item/cult_spear/rite = new(T) S.Grant(user, rite) rite.spear_act = S if(user.put_in_hands(rite)) diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 0a209dbb1fcde..0d119c555ed01 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -48,8 +48,10 @@ /datum/antagonist/cult/greet() to_chat(owner, "You are a member of the cult!") - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/bloodcult.ogg', 100, FALSE, pressure_affected = FALSE)//subject to change + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/bloodcult.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE)//subject to change owner.announce_objectives() + owner.current.client?.tgui_panel?.give_antagonist_popup("Blood Cult", + "Use your ritual dagger to draw runes with your blood and expand your cult until you have enough influence to summon the great Nar'Sie!") /datum/antagonist/cult/on_gain() . = ..() @@ -80,9 +82,9 @@ /datum/antagonist/cult/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob) var/list/slots = list( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/T = new item_path(mob) @@ -109,7 +111,7 @@ communion.Grant(current) if(ishuman(current)) magic.Grant(current) - current.throw_alert("bloodsense", /obj/screen/alert/bloodsense) + current.throw_alert("bloodsense", /atom/movable/screen/alert/bloodsense) if(cult_team.cult_risen) cult_team.rise(current) if(cult_team.cult_ascendent) @@ -327,7 +329,7 @@ for(var/datum/mind/M in C.members) if(M.current) M.current.clear_alert("bloodsense") - M.current.throw_alert("bloodsense", /obj/screen/alert/bloodsense) + M.current.throw_alert("bloodsense", /atom/movable/screen/alert/bloodsense) /datum/team/cult/proc/setup_objectives() var/datum/objective/sacrifice/sac_objective = new @@ -340,6 +342,7 @@ objectives += summon_objective for(var/datum/mind/M in members) + M.objectives |= objectives log_objective(M, sac_objective.explanation_text) log_objective(M, summon_objective.explanation_text) @@ -355,6 +358,9 @@ return FALSE /datum/objective/sacrifice/check_completion() + //Target's a clockie + if(target?.has_antag_datum(/datum/antagonist/servant_of_ratvar)) + return TRUE return sacced || completed /datum/objective/sacrifice/update_explanation_text() @@ -371,9 +377,9 @@ ..() var/sanity = 0 while(summon_spots.len < SUMMON_POSSIBILITIES && sanity < 100) - var/area/summon = pick(GLOB.sortedAreas - summon_spots) - if(summon && is_station_level(summon.z) && summon.valid_territory) - summon_spots += summon + var/area/summon_area = pick(GLOB.sortedAreas - summon_spots) + if(summon_area && is_station_level(summon_area.z) && (summon_area.area_flags & VALID_TERRITORY)) + summon_spots += summon_area sanity++ update_explanation_text() diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index d84c14d35bf65..b127b76128956 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -15,6 +15,7 @@ name = "Communion" desc = "Whispered words that all cultists can hear.
Warning:Nearby non-cultists can still hear you." button_icon_state = "cult_comms" + check_flags = AB_CHECK_CONSCIOUS /datum/action/innate/cult/comm/Activate() var/input = stripped_input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "") @@ -134,7 +135,7 @@ for(var/datum/mind/B in team.members) if(B.current) for(var/datum/action/innate/cult/mastervote/vote in B.current.actions) - vote.Remove(B.current) + qdel(vote) if(!B.current.incapacitated()) 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 @@ -148,6 +149,7 @@ name = "Final Reckoning" desc = "A single-use spell that brings the entire cult to the master's location." button_icon_state = "sintouch" + check_flags = AB_CHECK_CONSCIOUS /datum/action/innate/cult/master/finalreck/Activate() var/datum/antagonist/cult/antag = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) @@ -156,7 +158,7 @@ for(var/i in 1 to 4) chant(i) var/list/destinations = list() - for(var/turf/T in orange(1, owner)) + for(var/turf/T as() in (RANGE_TURFS(1, owner) - get_turf(owner))) if(!is_blocked_turf(T, TRUE)) destinations += T if(!LAZYLEN(destinations)) @@ -264,7 +266,7 @@ var/datum/antagonist/cult/C = caller.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(target in view(7, get_turf(ranged_ability_user))) + if(ranged_ability_user in viewers(7, get_turf(target))) if(C.cult_team.blood_target) to_chat(ranged_ability_user, "The cult has already designated a target!") return FALSE @@ -436,7 +438,7 @@ var/turf/T = get_turf(ranged_ability_user) if(!isturf(T)) return FALSE - if(target in view(7, get_turf(ranged_ability_user))) + if(ranged_ability_user in viewers(7, get_turf(target))) if((!(iscultist(target) || istype(target, /obj/structure/destructible/cult)) || target == caller) && !(attached_action.throwing)) return if(!attached_action.throwing) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 3fad9d94210c2..caa6afb697f6f 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -78,7 +78,7 @@ if(!iscultist(user)) to_chat(user, "\"I wouldn't advise that.\"") -/obj/item/twohanded/required/cult_bastard +/obj/item/cult_bastard name = "bloody bastard sword" desc = "An enormous sword used by Nar'Sien cultists to rapidly harvest the souls of non-believers." w_class = WEIGHT_CLASS_HUGE @@ -110,31 +110,37 @@ var/spin_cooldown = 250 var/dash_toggled = TRUE -/obj/item/twohanded/required/cult_bastard/Initialize() +/obj/item/cult_bastard/Initialize() . = ..() set_light(4) jaunt = new(src) linked_action = new(src) AddComponent(/datum/component/butchering, 50, 80) + AddComponent(/datum/component/two_handed, require_twohands=TRUE) -/obj/item/twohanded/required/cult_bastard/examine(mob/user) +/obj/item/cult_bastard/Destroy() + QDEL_NULL(jaunt) + QDEL_NULL(linked_action) + return ..() + +/obj/item/cult_bastard/examine(mob/user) . = ..() if(contents.len) . += "There are [contents.len] souls trapped within the sword's core." else . += "The sword appears to be quite lifeless." -/obj/item/twohanded/required/cult_bastard/can_be_pulled(user) +/obj/item/cult_bastard/can_be_pulled(user) return FALSE -/obj/item/twohanded/required/cult_bastard/attack_self(mob/user) +/obj/item/cult_bastard/attack_self(mob/user) dash_toggled = !dash_toggled if(dash_toggled) to_chat(loc, "You raise [src] and prepare to jaunt with it.") else to_chat(loc, "You lower [src] and prepare to swing it normally.") -/obj/item/twohanded/required/cult_bastard/pickup(mob/living/user) +/obj/item/cult_bastard/pickup(mob/living/user) . = ..() if(!iscultist(user)) to_chat(user, "\"I wouldn't advise that.\"") @@ -145,13 +151,20 @@ linked_action.Grant(user, src) user.update_icons() -/obj/item/twohanded/required/cult_bastard/dropped(mob/user) +/obj/item/cult_bastard/dropped(mob/user) . = ..() linked_action.Remove(user) jaunt.Remove(user) user.update_icons() -/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) +/obj/item/cult_bastard/IsReflect() + if(spinning) + 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, TRUE) + return TRUE + else + ..() + +/obj/item/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) if(prob(final_block_chance)) if(attack_type == PROJECTILE_ATTACK) owner.visible_message("[owner] deflects [attack_text] with [src]!") @@ -163,7 +176,7 @@ return TRUE return FALSE -/obj/item/twohanded/required/cult_bastard/afterattack(atom/target, mob/user, proximity, click_parameters) +/obj/item/cult_bastard/afterattack(atom/target, mob/user, proximity, click_parameters) . = ..() if(dash_toggled && !proximity) jaunt.Teleport(user, target) @@ -194,7 +207,7 @@ phaseout = /obj/effect/temp_visual/dir_setting/cult/phase/out /datum/action/innate/dash/cult/IsAvailable() - if(iscultist(holder) && current_charges) + if(iscultist(owner) && current_charges) return TRUE else return FALSE @@ -208,7 +221,7 @@ button_icon_state = "sintouch" var/cooldown = 0 var/mob/living/carbon/human/holder - var/obj/item/twohanded/required/cult_bastard/sword + var/obj/item/cult_bastard/sword /datum/action/innate/cult/spin2win/Grant(mob/user, obj/bastard) . = ..() @@ -258,7 +271,7 @@ desc = "A torn, dust-caked hood. Strange letters line the inside." flags_inv = HIDEFACE|HIDEHAIR|HIDEEARS flags_cover = HEADCOVERSEYES - armor = list("melee" = 30, "bullet" = 30, "laser" = 20,"energy" = 20, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10) + armor = list("melee" = 30, "bullet" = 30, "laser" = 20,"energy" = 20, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10, "stamina" = 40) cold_protection = HEAD min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT heat_protection = HEAD @@ -271,7 +284,7 @@ item_state = "cultrobes" body_parts_covered = CHEST|GROIN|LEGS|ARMS allowed = list(/obj/item/tome, /obj/item/melee/cultblade) - armor = list("melee" = 30, "bullet" = 30, "laser" = 20,"energy" = 20, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10) + armor = list("melee" = 30, "bullet" = 30, "laser" = 20,"energy" = 20, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10, "stamina" = 40) flags_inv = HIDEJUMPSUIT cold_protection = CHEST|GROIN|LEGS|ARMS min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT @@ -312,7 +325,7 @@ item_state = "magus" desc = "A helm worn by the followers of Nar'Sie." flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEARS|HIDEEYES - armor = list("melee" = 50, "bullet" = 30, "laser" = 50,"energy" = 20, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10) + armor = list("melee" = 50, "bullet" = 30, "laser" = 50,"energy" = 20, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10, "stamina" = 50) flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH /obj/item/clothing/suit/magusred @@ -322,26 +335,27 @@ item_state = "magusred" body_parts_covered = CHEST|GROIN|LEGS|ARMS allowed = list(/obj/item/tome, /obj/item/melee/cultblade) - armor = list("melee" = 50, "bullet" = 30, "laser" = 50,"energy" = 20, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10) + armor = list("melee" = 50, "bullet" = 30, "laser" = 50,"energy" = 20, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10, "stamina" = 50) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT /obj/item/clothing/head/helmet/space/hardsuit/cult name = "\improper Nar'Sien hardened helmet" - desc = "A heavily-armored helmet worn by warriors of the Nar'Sien cult. It can withstand hard vacuum." + desc = "A heavily-armored helmet worn by warriors of the Nar'Sien cult. It is reinforced by hard vacuum." icon_state = "cult_helmet" item_state = "cult_helmet" - armor = list("melee" = 70, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 40, "acid" = 75) + armor = list("melee" = 70, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 40, "acid" = 75, "stamina" = 50) brightness_on = 0 actions_types = list() + high_pressure_multiplier = 0.5 /obj/item/clothing/suit/space/hardsuit/cult name = "\improper Nar'Sien hardened armor" icon_state = "cult_armor" item_state = "cult_armor" - desc = "A heavily-armored exosuit worn by warriors of the Nar'Sien cult. It can withstand hard vacuum." + desc = "A heavily-armored exosuit worn by warriors of the Nar'Sien cult." w_class = WEIGHT_CLASS_BULKY allowed = list(/obj/item/tome, /obj/item/melee/cultblade, /obj/item/tank/internals/) - armor = list("melee" = 70, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 40, "acid" = 75) + armor = list("melee" = 70, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 40, "acid" = 75, "stamina" = 50) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/cult /obj/item/sharpener/cult @@ -362,7 +376,7 @@ icon_state = "cult_armor" item_state = "cult_armor" w_class = WEIGHT_CLASS_BULKY - armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 30, "bomb" = 50, "bio" = 30, "rad" = 30, "fire" = 50, "acid" = 60) + armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 30, "bomb" = 50, "bio" = 30, "rad" = 30, "fire" = 50, "acid" = 60, "stamina" = 40) body_parts_covered = CHEST|GROIN|LEGS|ARMS allowed = list(/obj/item/tome, /obj/item/melee/cultblade) var/current_charges = 3 @@ -372,7 +386,7 @@ name = "empowered cultist helmet" desc = "Empowered helmet which creates a powerful shield around the user." icon_state = "cult_hoodalt" - armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 30, "bomb" = 50, "bio" = 30, "rad" = 30, "fire" = 50, "acid" = 60) + armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 30, "bomb" = 50, "bio" = 30, "rad" = 30, "fire" = 50, "acid" = 60, "stamina" = 40) body_parts_covered = HEAD flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS @@ -409,7 +423,7 @@ flags_inv = HIDEJUMPSUIT allowed = list(/obj/item/tome, /obj/item/melee/cultblade) body_parts_covered = CHEST|GROIN|LEGS|ARMS - armor = list("melee" = -45, "bullet" = -45, "laser" = -45,"energy" = -45, "bomb" = -45, "bio" = -45, "rad" = -45, "fire" = 0, "acid" = 0) + armor = list("melee" = -45, "bullet" = -45, "laser" = -45,"energy" = -45, "bomb" = -45, "bio" = -45, "rad" = -45, "fire" = 0, "acid" = 0, "stamina" = 40) slowdown = -0.6 hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/berserkerhood @@ -418,7 +432,7 @@ desc = "Blood-soaked hood infused with dark magic." icon_state = "culthood" flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS - 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, "stamina" = 0) /obj/item/clothing/suit/hooded/cultrobes/berserker/equipped(mob/living/user, slot) ..() @@ -435,6 +449,7 @@ icon_state = "blindfold" item_state = "blindfold" flash_protect = 1 + vision_correction = 1 /obj/item/clothing/glasses/hud/health/night/cultblind/equipped(mob/living/user, slot) ..() @@ -540,7 +555,7 @@ var/mob/living/carbon/C = user var/turf/mobloc = get_turf(C) - var/turf/destination = get_teleport_loc(mobloc,C,9,1,3,1,0,1) + var/turf/destination = get_teleport_loc(mobloc,C,9,1,0,3,1,0,1) if(destination) uses-- @@ -616,7 +631,7 @@ to_chat(user, "\The [src] can only transport items!") -/obj/item/twohanded/cult_spear +/obj/item/cult_spear name = "blood halberd" desc = "A sickening spear composed entirely of crystallized blood." icon_state = "bloodspear0" @@ -624,7 +639,6 @@ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' slot_flags = 0 force = 17 - force_wielded = 24 throwforce = 40 throw_speed = 2 armour_penetration = 30 @@ -634,19 +648,24 @@ hitsound = 'sound/weapons/bladeslice.ogg' var/datum/action/innate/cult/spear/spear_act -/obj/item/twohanded/cult_spear/Initialize() +/obj/item/cult_spear/Initialize() + . = ..() + +/obj/item/cult_spear/ComponentInitialize() . = ..() AddComponent(/datum/component/butchering, 100, 90) + AddComponent(/datum/component/two_handed, force_unwielded=17, force_wielded=24, icon_wielded="bloodspear1") + +/obj/item/cult_spear/update_icon() + icon_state = "bloodspear0" + ..() -/obj/item/twohanded/cult_spear/Destroy() +/obj/item/cult_spear/Destroy() if(spear_act) qdel(spear_act) ..() -/obj/item/twohanded/cult_spear/update_icon() - icon_state = "bloodspear[wielded]" - -/obj/item/twohanded/cult_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) +/obj/item/cult_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) var/turf/T = get_turf(hit_atom) if(isliving(hit_atom)) var/mob/living/L = hit_atom @@ -663,7 +682,7 @@ else ..() -/obj/item/twohanded/cult_spear/proc/break_spear(turf/T) +/obj/item/cult_spear/proc/break_spear(turf/T) if(src) if(!T) T = get_turf(src) @@ -674,8 +693,8 @@ 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) - if(wielded) +/obj/item/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) + if(ISWIELDED(src)) final_block_chance *= 2 if(prob(final_block_chance)) if(attack_type == PROJECTILE_ATTACK) @@ -693,7 +712,7 @@ desc = "Call the blood spear back to your hand!" background_icon_state = "bg_demon" button_icon_state = "bloodspear" - var/obj/item/twohanded/cult_spear/spear + var/obj/item/cult_spear/spear var/cooldown = 0 /datum/action/innate/cult/spear/Grant(mob/user, obj/blood_spear) @@ -779,14 +798,13 @@ . = ..() ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT) - /obj/item/blood_beam/afterattack(atom/A, mob/living/user, flag, params) . = ..() if(firing || charging) return var/C = user.client if(ishuman(user) && C) - angle = mouse_angle_from_client(C) + angle = Get_Angle(get_turf(src), get_turf(A)) else qdel(src) return @@ -885,6 +903,7 @@ throw_range = 4 max_integrity = 50 w_class = WEIGHT_CLASS_BULKY + block_flags = BLOCKING_PROJECTILE attack_verb = list("bumped", "prodded") hitsound = 'sound/weapons/smash.ogg' var/illusions = 4 diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 48be84d4689a1..3c24dbe55b75c 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -154,33 +154,38 @@ var/corrupt_delay = 50 var/last_corrupt = 0 -/obj/structure/destructible/cult/pylon/New() - START_PROCESSING(SSfastprocess, src) +/obj/structure/destructible/cult/pylon/Initialize() ..() + return INITIALIZE_HINT_LATELOAD + +/obj/structure/destructible/cult/pylon/LateInitialize() + . = ..() + START_PROCESSING(SSfastprocess, src) /obj/structure/destructible/cult/pylon/Destroy() STOP_PROCESSING(SSfastprocess, src) return ..() -/obj/structure/destructible/cult/pylon/process() +/obj/structure/destructible/cult/pylon/process(delta_time) if(!anchored) return if(last_heal <= world.time) last_heal = world.time + heal_delay for(var/mob/living/L in range(5, src)) - if(iscultist(L) || isshade(L) || isconstruct(L)) - if(L.health != L.maxHealth) - new /obj/effect/temp_visual/heal(get_turf(src), "#960000") - if(ishuman(L)) - L.adjustBruteLoss(-1, 0) - L.adjustFireLoss(-1, 0) - L.updatehealth() - if(isshade(L) || isconstruct(L)) - var/mob/living/simple_animal/M = L - if(M.health < M.maxHealth) - M.adjustHealth(-3) - if(ishuman(L) && L.blood_volume < BLOOD_VOLUME_NORMAL) + if(L.health == L.maxHealth) + continue + if(!iscultist(L) && !isshade(L) && !isconstruct(L)) + continue + new /obj/effect/temp_visual/heal(get_turf(src), "#960000") + if(ishuman(L)) + L.adjustBruteLoss(-5*delta_time, 0) + L.adjustFireLoss(-5*delta_time, 0) + L.updatehealth() + if(L.blood_volume < BLOOD_VOLUME_NORMAL) L.blood_volume += 1.0 + else if(isshade(L) || isconstruct(L)) + var/mob/living/simple_animal/M = L + M.adjustHealth(-15*delta_time) CHECK_TICK if(last_corrupt <= world.time) var/list/validturfs = list() @@ -254,6 +259,9 @@ new N(get_turf(src)) to_chat(user, "You summon the [choice] from the archives!") +/obj/structure/destructible/cult/tome/library //library archive + debris = null + /obj/effect/gateway name = "gateway" desc = "You're pretty sure that abyss is staring back." diff --git a/code/modules/antagonists/cult/ritual.dm b/code/modules/antagonists/cult/ritual.dm index 283d600d59171..1ea630c1ac77f 100644 --- a/code/modules/antagonists/cult/ritual.dm +++ b/code/modules/antagonists/cult/ritual.dm @@ -17,10 +17,10 @@ This file contains the cult dagger and rune list code /obj/item/melee/cultblade/dagger/examine(mob/user) . = ..() if(iscultist(user) || isobserver(user)) - . += {"The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar'Sie.\n - Striking a cult structure will unanchor or reanchor it.\n - Striking another cultist with it will purge holy water from them.\n - Striking a noncultist, however, will tear their flesh."} + . += "The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar'Sie.\n"+\ + "Striking a cult structure will unanchor or reanchor it.\n"+\ + "Striking another cultist with it will purge holy water from them.\n"+\ + "Striking a noncultist, however, will tear their flesh." /obj/item/melee/cultblade/dagger/attack(mob/living/M, mob/living/user) if(iscultist(M)) @@ -68,7 +68,7 @@ This file contains the cult dagger and rune list code A = get_area(src) if(!src || QDELETED(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user)) return - if(ispath(rune_to_scribe, /obj/effect/rune/summon) && (!is_station_level(Turf.z) || A.map_name == "Space")) + if(ispath(rune_to_scribe, /obj/effect/rune/summon) && (!is_station_level(Turf.z) || initial(A.name) == "Space")) to_chat(user, "The veil is not weak enough here to summon a cultist, you must be on station!") return if(ispath(rune_to_scribe, /obj/effect/rune/apocalypse)) @@ -107,7 +107,7 @@ This file contains the cult dagger and rune list code if(!(A in summon_objective.summon_spots)) // Check again to make sure they didn't move to_chat(user, "The Geometer can only be summoned where the veil is weak - in [english_list(summon_objective.summon_spots)]!") return - priority_announce("Figments from an eldritch god are being summoned by [user] into [A.map_name] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", 'sound/ai/spanomalies.ogg') + priority_announce("Figments from an eldritch god are being summoned by [user] into [initial(A.name)] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", ANNOUNCER_SPANOMALIES) for(var/B in spiral_range_turfs(1, user, 1)) var/obj/structure/emergency_shield/sanguine/N = new(B) shields += N @@ -145,7 +145,7 @@ This file contains the cult dagger and rune list code to_chat(user, "There is already a rune here.") return FALSE var/area/A = get_area(T) - if((!is_station_level(T.z) && !is_mining_level(T.z)) || (A && !A.blob_allowed)) + if((!is_station_level(T.z) && !is_mining_level(T.z)) || (A && !(A.area_flags & BLOBS_ALLOWED))) to_chat(user, "The veil is not weak enough here.") return FALSE return TRUE diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 49f55dee6a222..c4c71630dc796 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -49,9 +49,9 @@ Runes can either be invoked by one's self or with many different cultists. Each /obj/effect/rune/examine(mob/user) . = ..() if(iscultist(user) || user.stat == DEAD) //If they're a cultist or a ghost, tell them the effects - . += {"Name: [cultist_name]\n - Effects: [capitalize(cultist_desc)]\n - Required Acolytes: [req_cultists_text ? "[req_cultists_text]":"[req_cultists]"]"} + . += "Name: [cultist_name]\n"+\ + "Effects: [capitalize(cultist_desc)]\n"+\ + "Required Acolytes: [req_cultists_text ? "[req_cultists_text]":"[req_cultists]"]" if(req_keyword && keyword) . += "Keyword: [keyword]" @@ -85,6 +85,8 @@ Runes can either be invoked by one's self or with many different cultists. Each if(istype(M, /mob/living/simple_animal/hostile/construct/wraith/angelic) || istype(M, /mob/living/simple_animal/hostile/construct/armored/angelic) || istype(M, /mob/living/simple_animal/hostile/construct/builder/angelic)) to_chat(M, "You purge the rune!") qdel(src) + else if(construct_invoke || !iscultist(M)) //if you're not a cult construct we want the normal fail message + attack_hand(M) else to_chat(M, "You are unable to invoke the rune!") @@ -114,11 +116,10 @@ structure_check() searches for nearby cultist structures required for the invoca if(user) invokers += user if(req_cultists > 1 || istype(src, /obj/effect/rune/convert)) - var/list/things_in_range = range(1, src) - var/obj/item/toy/plush/narplush/plushsie = locate() in things_in_range - if(istype(plushsie) && plushsie.is_invoker) + var/obj/item/toy/plush/narplush/plushsie = locate() in range(1, src) + if(plushsie?.is_invoker) invokers += plushsie - for(var/mob/living/L in things_in_range) + for(var/mob/living/L in viewers(1, src)) if(iscultist(L)) if(L == user) continue @@ -232,7 +233,7 @@ structure_check() searches for nearby cultist structures required for the invoca to_chat(M, "You need at least two invokers to convert [convertee]!") log_game("Offer rune failed - tried conversion with one invoker") return 0 - if(convertee.anti_magic_check(TRUE, TRUE, major = FALSE) || istype(convertee.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) //Not major because it can be spammed + if(convertee.anti_magic_check(TRUE, TRUE, major = FALSE) || istype(convertee.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) //Not major because it can be spammed for(var/M in invokers) to_chat(M, "Something is shielding [convertee]'s mind!") log_game("Offer rune failed - convertee had anti-magic") @@ -416,7 +417,7 @@ structure_check() searches for nearby cultist structures required for the invoca actual_selected_rune.handle_portal("lava") else var/area/A = get_area(T) - if(A.map_name == "Space") + if(initial(A.name) == "Space") actual_selected_rune.handle_portal("space", T) if(movesuccess) target.visible_message("There is a boom of outrushing air as something appears above the rune!", null, "You hear a boom.") @@ -498,7 +499,15 @@ structure_check() searches for nearby cultist structures required for the invoca sleep(40) if(src) color = RUNE_COLOR_RED - new /obj/singularity/narsie/large/cult(T) //Causes Nar'Sie to spawn even if the rune has been removed + if(GLOB.celestial_gateway) + SEND_SOUND(world, 'sound/magic/clockwork/narsie_attack.ogg') + to_chat(world, "The dimensional veil is held shut by a powerful electric field.") + GLOB.narsie_breaching = TRUE + GLOB.narsie_arrival = T + var/obj/structure/destructible/clockwork/massive/celestial_gateway/gateway = GLOB.celestial_gateway + gateway.open_gateway() + else + new /obj/singularity/narsie/large/cult(T) //Causes Nar'Sie to spawn even if the rune has been removed /obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal. if((istype(I, /obj/item/melee/cultblade/dagger) && iscultist(user))) @@ -572,7 +581,7 @@ structure_check() searches for nearby cultist structures required for the invoca var/mob/dead/observer/C = pick(candidates) to_chat(mob_to_revive.mind, "Your physical form has been taken over by another soul due to your inactivity! Ahelp if you wish to regain your form.") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(mob_to_revive)]) to replace an AFK player.") - mob_to_revive.ghostize(0) + mob_to_revive.ghostize(FALSE) mob_to_revive.key = C.key else fail_invoke() @@ -600,7 +609,7 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/raise_dead/fail_invoke() ..() rune_in_use = FALSE - for(var/mob/living/M in range(1,src)) + for(var/mob/living/M in hearers(1,src)) if(iscultist(M) && M.stat == DEAD) M.visible_message("[M] twitches.") @@ -629,7 +638,7 @@ structure_check() searches for nearby cultist structures required for the invoca GLOB.wall_runes -= src return ..() -/obj/effect/rune/wall/BlockSuperconductivity() +/obj/effect/rune/wall/BlockThermalConductivity() return density /obj/effect/rune/wall/invoke(var/list/invokers) @@ -651,7 +660,7 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/wall/proc/spread_density() for(var/R in GLOB.wall_runes) var/obj/effect/rune/wall/W = R - if(W.z == z && get_dist(src, W) <= 2 && !W.density && !W.recharging) + if(W.get_virtual_z_level() == get_virtual_z_level() && get_dist(src, W) <= 2 && !W.density && !W.recharging) W.density = TRUE W.update_state() W.spread_density() @@ -702,6 +711,11 @@ structure_check() searches for nearby cultist structures required for the invoca if(!(M.current in invokers) && M.current && M.current.stat != DEAD) cultists |= M.current var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of the Geometer") as null|anything in cultists + var/held_in_place = FALSE + if(iscarbon(cultist_to_summon)) + var/mob/living/carbon/C = cultist_to_summon + if(C.handcuffed && cultist_to_summon.pulledby) + held_in_place = TRUE if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated()) return if(!cultist_to_summon) @@ -714,7 +728,7 @@ structure_check() searches for nearby cultist structures required for the invoca fail_invoke() log_game("Summon Cultist rune failed - target died") return - if(cultist_to_summon.pulledby || cultist_to_summon.buckled) + if(held_in_place) to_chat(user, "[cultist_to_summon] is being held in place!") fail_invoke() log_game("Summon Cultist rune failed - target restrained") @@ -732,9 +746,11 @@ structure_check() searches for nearby cultist structures required for the invoca cultist_to_summon.visible_message("[cultist_to_summon] suddenly disappears in a flash of red light!", \ "Overwhelming vertigo consumes you as you are hurled through the air!") ..() - visible_message("A foggy shape materializes atop [src] and solidifes into [cultist_to_summon]!") - cultist_to_summon.forceMove(get_turf(src)) - qdel(src) + if(do_teleport(cultist_to_summon, get_turf(src), no_effects = TRUE, channel = TELEPORT_CHANNEL_CULT)) + visible_message("A foggy shape materializes atop [src] and solidifes into [cultist_to_summon]!") + qdel(src) + else + visible_message("The air displaces atop [src], however nothing appears.") //Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby /obj/effect/rune/blood_boil @@ -833,7 +849,7 @@ structure_check() searches for nearby cultist structures required for the invoca var/choice = alert(user,"You tear open a connection to the spirit realm...",,"Summon a Cult Ghost","Ascend as a Dark Spirit","Cancel") if(choice == "Summon a Cult Ghost") var/area/A = get_area(T) - if(A.map_name == "Space" || is_mining_level(T.z)) + if(initial(A.name) == "Space" || is_mining_level(T.z)) to_chat(user, "The veil is not weak enough here to manifest spirits, you must be on station!") return if(ghosts >= ghost_limit) @@ -962,14 +978,14 @@ structure_check() searches for nearby cultist structures required for the invoca var/duration = intensity*10 playsound(T, 'sound/magic/enter_blood.ogg', 100, 1) visible_message("A colossal shockwave of energy bursts from the rune, disintegrating it in the process!") - for(var/mob/living/L in range(src, 3)) + for(var/mob/living/L in viewers(3, src)) L.Paralyze(30) empulse(T, 0.42*(intensity), 1) var/list/images = list() - var/zmatch = T.z + var/zmatch = T.get_virtual_z_level() var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_SECURITY_ADVANCED] for(var/mob/living/M in GLOB.alive_mob_list) - if(M.z != zmatch) + if(M.get_virtual_z_level() != zmatch) continue if(ishuman(M)) if(!iscultist(M)) @@ -1063,7 +1079,7 @@ structure_check() searches for nearby cultist structures required for the invoca /proc/hudFix(mob/living/carbon/human/target) if(!target || !target.client) return - var/obj/O = target.get_item_by_slot(SLOT_GLASSES) + var/obj/O = target.get_item_by_slot(ITEM_SLOT_EYES) if(istype(O, /obj/item/clothing/glasses/hud/security)) var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_SECURITY_ADVANCED] AH.add_hud_to(target) diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index 41e53d3892458..2537d36b861c1 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -220,7 +220,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", H.set_species(/datum/species/human, 1) H.regenerate_icons() give_appropriate_spells() - if(istype(owner.current.loc, /obj/effect/dummy/phased_mob/slaughter/)) + if(istype(owner.current.loc, /obj/effect/dummy/phased_mob/slaughter)) owner.current.forceMove(get_turf(owner.current))//Fixes dying while jaunted leaving you permajaunted. form = BASIC_DEVIL @@ -457,10 +457,10 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", return -1 currentMob.change_mob_type( /mob/living/carbon/human, targetturf, null, 1) var/mob/living/carbon/human/H = owner.current - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/civilian/lawyer/black(H), SLOT_W_UNIFORM) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), SLOT_SHOES) - H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), SLOT_HANDS) - H.equip_to_slot_or_del(new /obj/item/pen(H), SLOT_L_STORE) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/civilian/lawyer/black(H), ITEM_SLOT_ICLOTHING) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), ITEM_SLOT_FEET) + H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), ITEM_SLOT_HANDS) + H.equip_to_slot_or_del(new /obj/item/pen(H), ITEM_SLOT_LPOCKET) if(SOULVALUE >= BLOOD_THRESHOLD) H.set_species(/datum/species/lizard, 1) H.underwear = "Nude" @@ -498,6 +498,14 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", to_chat(owner.current, GLOB.lawlorify[LAW][banish]) to_chat(owner.current, "Remember, the crew can research your weaknesses if they find out your devil name.
") .=..() + owner.current.client?.tgui_panel?.give_antagonist_popup("Devil", + "Summon contracts to purchase the souls of the crew.\n\ + You may not use violence to coerce someone into selling their soul.\n\ + You may not directly and knowingly physically harm a devil, other than yourself.\n\ + [GLOB.lawlorify[LAW][bane]]\n\ + [GLOB.lawlorify[LAW][ban]]\n\ + [GLOB.lawlorify[LAW][obligation]]\n\ + [GLOB.lawlorify[LAW][banish]]") /datum/antagonist/devil/on_gain() truename = randomDevilName() diff --git a/code/modules/antagonists/devil/imp/imp.dm b/code/modules/antagonists/devil/imp/imp.dm index 8db13cd749c8d..72974aeebc478 100644 --- a/code/modules/antagonists/devil/imp/imp.dm +++ b/code/modules/antagonists/devil/imp/imp.dm @@ -38,6 +38,8 @@ var/playstyle_string = "You are an imp, a mischievous creature from hell. You are the lowest rank on the hellish totem pole \ Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \ of intentionally harming a fellow devil." + mobchatspan = "cultmobsay" + discovery_points = 10000 /mob/living/simple_animal/imp/Initialize() ..() diff --git a/code/modules/antagonists/devil/sintouched/sintouched.dm b/code/modules/antagonists/devil/sintouched/sintouched.dm index ec7bb469eb3f0..29c3c77fd6d7f 100644 --- a/code/modules/antagonists/devil/sintouched/sintouched.dm +++ b/code/modules/antagonists/devil/sintouched/sintouched.dm @@ -45,6 +45,8 @@ /datum/antagonist/sintouched/greet() owner.announce_objectives() + owner.current.client?.tgui_panel?.give_antagonist_popup("Sintouched", + "You have been corrupted by devilish thought, complete your objectives no matter what.") /datum/antagonist/sintouched/roundend_report() return printplayer(owner) diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index 068cf86e8be26..7213d4a3820cb 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -25,6 +25,7 @@ var/ascended = FALSE var/mob/living/oldform var/list/devil_overlays[DEVIL_TOTAL_LAYERS] + mobchatspan = "cultmobsay" /mob/living/carbon/true_devil/Initialize() create_bodyparts() //initialize bodyparts @@ -57,7 +58,7 @@ mind.announce_objectives() /mob/living/carbon/true_devil/death(gibbed) - stat = DEAD + set_stat(DEAD) ..(gibbed) drop_all_held_items() INVOKE_ASYNC(mind.has_antag_datum(/datum/antagonist/devil), /datum/antagonist/devil/proc/beginResurrectionCheck, src) @@ -102,7 +103,7 @@ return FALSE return TRUE -/mob/living/carbon/true_devil/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) +/mob/living/carbon/true_devil/assess_threat(judgment_criteria, lasercolor = "", datum/callback/weaponcheck=null) return 666 /mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) @@ -129,7 +130,7 @@ var/attack_message = "[src] has been [message_verb] with [I]." if(user) user.do_attack_animation(src) - if(user in viewers(src, null)) + if(user in viewers(src)) attack_message = "[user] has [message_verb] [src] with [I]!" if(message_verb) visible_message("[attack_message]", diff --git a/code/modules/antagonists/devil/true_devil/inventory.dm b/code/modules/antagonists/devil/true_devil/inventory.dm index a5fe147cad5c6..f77fe5de277d0 100644 --- a/code/modules/antagonists/devil/true_devil/inventory.dm +++ b/code/modules/antagonists/devil/true_devil/inventory.dm @@ -1,8 +1,8 @@ -/mob/living/carbon/true_devil/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) +/mob/living/carbon/true_devil/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, was_thrown = FALSE) if(..()) update_inv_hands() - return 1 - return 0 + return TRUE + return FALSE /mob/living/carbon/true_devil/update_inv_hands() //TODO LORDPIDEY: Figure out how to make the hands line up properly. the l/r_hand_overlay should use the down sprite when facing down, left, or right, and the up sprite when facing up. diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm index 2f1d6209b12ac..fdb446c572db4 100644 --- a/code/modules/antagonists/disease/disease_abilities.dm +++ b/code/modules/antagonists/disease/disease_abilities.dm @@ -68,15 +68,15 @@ new /datum/disease_ability/symptom/powerful/youth var/stealth = 0 var/resistance = 0 var/stage_speed = 0 - var/transmittable = 0 + var/transmission = 0 for(var/T in symptoms) var/datum/symptom/S = T stealth += initial(S.stealth) resistance += initial(S.resistance) stage_speed += initial(S.stage_speed) - transmittable += initial(S.transmittable) + transmission += initial(S.transmission) threshold_block += "

[initial(S.threshold_desc)]" - stat_block = "Resistance: [resistance]
Stealth: [stealth]
Stage Speed: [stage_speed]
Transmissibility: [transmittable]

" + stat_block = "Resistance: [resistance]
Stealth: [stealth]
Stage Speed: [stage_speed]
Transmissibility: [transmission]

" if(symptoms.len == 1) //lazy boy's dream name = initial(S.name) if(short_desc == "") @@ -217,7 +217,7 @@ new /datum/disease_ability/symptom/powerful/youth if(L.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth var/datum/disease/advance/sentient_disease/SD = D.hosts[L] - for(var/mob/living/M in oview(4, SD.affected_mob)) + for(var/mob/living/M in ohearers(4, SD.affected_mob)) if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M))) M.AirborneContractDisease(SD, TRUE) diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm index 9e5954d8b8cac..3c552a93cf5f4 100644 --- a/code/modules/antagonists/disease/disease_datum.dm +++ b/code/modules/antagonists/disease/disease_datum.dm @@ -24,6 +24,8 @@ to_chat(owner.current, "You are the [owner.special_role]!") to_chat(owner.current, "Infect members of the crew to gain adaptation points, and spread your infection further.") owner.announce_objectives() + owner.current.client?.tgui_panel?.give_antagonist_popup("Sentient Disease", + "Infect members of the crew to gain adaptation points and spread your infection further.") /datum/antagonist/disease/apply_innate_effects(mob/living/mob_override) if(!istype(owner.current, /mob/camera/disease)) diff --git a/code/modules/antagonists/disease/disease_disease.dm b/code/modules/antagonists/disease/disease_disease.dm index 2909aac4d3734..c9d976d6766a5 100644 --- a/code/modules/antagonists/disease/disease_disease.dm +++ b/code/modules/antagonists/disease/disease_disease.dm @@ -13,6 +13,7 @@ /datum/disease/advance/sentient_disease/Destroy() . = ..() + overmind = null GLOB.sentient_disease_instances -= src /datum/disease/advance/sentient_disease/remove_disease() diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm index 2ae63f4025c21..3bd8183db49e6 100644 --- a/code/modules/antagonists/disease/disease_mob.dm +++ b/code/modules/antagonists/disease/disease_mob.dm @@ -73,10 +73,12 @@ the new instance inside the host to be updated to the template's stats. /mob/camera/disease/Destroy() . = ..() QDEL_NULL(adaptation_menu_action) + disease_template = null for(var/V in GLOB.sentient_disease_instances) var/datum/disease/advance/sentient_disease/S = V if(S.overmind == src) S.overmind = null + browser = null /mob/camera/disease/Login() ..() @@ -84,24 +86,23 @@ the new instance inside the host to be updated to the template's stats. to_chat(src, "You have [DisplayTimeText(freemove_end - world.time)] to select your first host. Click on a human to select your host.") -/mob/camera/disease/Stat() - ..() - if(statpanel("Status")) - if(freemove) - stat("Host Selection Time: [round((freemove_end - world.time)/10)]s") - else - stat("Adaptation Points: [points]/[total_points]") - stat("Hosts: [disease_instances.len]") - var/adapt_ready = next_adaptation_time - world.time - if(adapt_ready > 0) - stat("Adaptation Ready: [round(adapt_ready/10, 0.1)]s") - +/mob/camera/disease/get_stat_tab_status() + var/list/tab_data = ..() + if(freemove) + tab_data["Host Selection Time"] = GENERATE_STAT_TEXT("[round((freemove_end - world.time)/10)]s") + else + tab_data["Adaptation Points"] = GENERATE_STAT_TEXT("[points]/[total_points]") + tab_data["Hosts"] = GENERATE_STAT_TEXT("[disease_instances.len]") + var/adapt_ready = next_adaptation_time - world.time + if(adapt_ready > 0) + tab_data["Adaptation Ready"] = GENERATE_STAT_TEXT("[round(adapt_ready/10, 0.1)]s") + return tab_data /mob/camera/disease/examine(mob/user) . = ..() if(isobserver(user)) - . += {"[src] has [points]/[total_points] adaptation points. - [src] has the following unlocked:"} + . += "[src] has [points]/[total_points] adaptation points.\n"+\ + "[src] has the following unlocked:" for(var/datum/disease_ability/ability in purchased_abilities) . += "[ability.name]" @@ -116,7 +117,7 @@ the new instance inside the host to be updated to the template's stats. follow_next(Dir & NORTHWEST) last_move_tick = world.time -/mob/camera/disease/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/mob/camera/disease/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) . = ..() var/atom/movable/to_follow = speaker if(radio_freq) @@ -128,7 +129,7 @@ the new instance inside the host to be updated to the template's stats. else link = "" // Recompose the message, because it's scrambled by default - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) + message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods) to_chat(src, "[link] [message]") @@ -275,6 +276,8 @@ the new instance inside the host to be updated to the template's stats. set_following(hosts[index]) /mob/camera/disease/proc/follow_mob(datum/source, newloc, dir) + SIGNAL_HANDLER + var/turf/T = get_turf(following_host) if(T) forceMove(T) @@ -320,10 +323,10 @@ the new instance inside the host to be updated to the template's stats. dat += "Back

[examining_ability.name]

[examining_ability.stat_block][examining_ability.long_desc][examining_ability.threshold_block]" else dat += "

Disease Statistics


\ - Resistance: [DT.totalResistance()]
\ - Stealth: [DT.totalStealth()]
\ - Stage Speed: [DT.totalStageSpeed()]
\ - Transmissibility: [DT.totalTransmittable()]
\ + Resistance: [DT.resistance]
\ + Stealth: [DT.stealth]
\ + Stage Speed: [DT.stage_rate]
\ + Transmissibility: [DT.transmission]
\ Cure: [DT.cure_text]" dat += "

Adaptations

\ Points: [points] / [total_points]\ diff --git a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm index d4d1cad0afd65..c71a9f5e0a02b 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm @@ -4,8 +4,9 @@ antagpanel_category = "Heretic" antag_moodlet = /datum/mood_event/heretics job_rank = ROLE_HERETIC - var/antag_hud_type = ANTAG_HUD_HERETIC + var/antag_hud_type = ANTAG_HUD_HERETIC // someone make all the other antags conform to this too lol var/antag_hud_name = "heretic" + hijack_speed = 0.5 var/give_equipment = TRUE var/list/researched_knowledge = list() var/total_sacrifices = 0 @@ -18,7 +19,7 @@ log_admin("[key_name(admin)] has heresized [key_name(new_owner)].") /datum/antagonist/heretic/greet() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ecult_op.ogg', 100, FALSE, pressure_affected = FALSE)//subject to change + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ecult_op.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE)//subject to change to_chat(owner, "You are the Heretic!
\ The old ones gave you these tasks to fulfill:") owner.announce_objectives() @@ -26,6 +27,8 @@ Your book allows you to research abilities, read it very carefully! You cannot undo what has been done!
\ You gain charges by either collecting influences or sacrificing people tracked by the living heart
\ You can find a basic guide at : https://wiki.beestation13.com/view/Heretics
") + owner.current.client?.tgui_panel?.give_antagonist_popup("Heretic", + "Collect influences or sacrafice targets to expand your forbidden knowledge.") /datum/antagonist/heretic/on_gain() var/mob/living/current = owner.current @@ -34,8 +37,8 @@ gain_knowledge(/datum/eldritch_knowledge/spell/basic) gain_knowledge(/datum/eldritch_knowledge/living_heart) gain_knowledge(/datum/eldritch_knowledge/codex_cicatrix) - current.log_message("has become a heretic", LOG_ATTACK, color="#960000") - GLOB.reality_smash_track.AddMind(owner) + current.log_message("has been turned into a heretic!", LOG_ATTACK, color="#960000") + GLOB.reality_smash_track.Generate() START_PROCESSING(SSprocessing,src) if(give_equipment) equip_cultist() @@ -50,12 +53,11 @@ if(!silent) to_chat(owner.current, "Your mind begins to flare as the otherwordly knowledge escapes your grasp!") owner.current.log_message("has become a non-heretic", LOG_ATTACK, color="#960000") - GLOB.reality_smash_track.RemoveMind(owner) + GLOB.reality_smash_track.targets-- STOP_PROCESSING(SSprocessing,src) return ..() - /datum/antagonist/heretic/proc/equip_cultist() var/mob/living/carbon/H = owner.current if(!istype(H)) @@ -65,9 +67,9 @@ /datum/antagonist/heretic/proc/ecult_give_item(obj/item/item_path, mob/living/carbon/human/H) var/list/slots = list( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/T = new item_path(H) @@ -89,12 +91,30 @@ EK.on_life(owner.current) /datum/antagonist/heretic/proc/forge_primary_objectives() - var/list/assasination = list() - var/list/protection = list() - for(var/i in 1 to 2) - var/pck = pick("assasinate","stalk","protect") - switch(pck) - if("assasinate") + if (prob(5)) + if (prob(66)) + var/datum/objective/ascend/AE = new() + AE.owner = owner + AE.update_explanation_text() + objectives += AE + log_objective(owner, AE.explanation_text) + else + var/datum/objective/hijack/hijack_objective = new + hijack_objective.owner = owner + hijack_objective.update_explanation_text() + objectives += hijack_objective + log_objective(owner, hijack_objective.explanation_text) + else + var/list/assasination = list() + var/list/protection = list() + for(var/i in 1 to 2) + if (prob(35)) + var/datum/objective/stalk/S = new() + S.owner = owner + S.find_target() + objectives += S + log_objective(owner, S.explanation_text) + else var/datum/objective/assassinate/A = new() A.owner = owner var/list/owners = A.get_owners() @@ -102,26 +122,12 @@ assasination += A.target objectives += A log_objective(owner, A.explanation_text) - if("stalk") - var/datum/objective/stalk/S = new() - S.owner = owner - S.find_target() - objectives += S - log_objective(owner, S.explanation_text) - if("protect") - var/datum/objective/protect/P = new() - P.owner = owner - var/list/owners = P.get_owners() - P.find_target(owners,assasination) - protection += P.target - objectives += P - log_objective(owner, P.explanation_text) - - var/datum/objective/sacrifice_ecult/SE = new() - SE.owner = owner - SE.update_explanation_text() - objectives += SE - log_objective(owner, SE.explanation_text) + var/datum/objective/sacrifice_ecult/SE = new() + SE.owner = owner + SE.update_explanation_text() + objectives += SE + log_objective(owner, SE.explanation_text) + /datum/antagonist/heretic/apply_innate_effects(mob/living/mob_override) . = ..() @@ -168,14 +174,11 @@ count++ if(ascended) - //Ascension isnt technically finishing the objectives, buut it is to be considered a great win. - var/client/C = GLOB.directory[ckey(owner.key)] - if(C) - C.process_greentext() - parts += "HERETIC HAS ASCENDED!" + //Ascension isn't technically finishing the objectives, buut it is to be considered a great win. + parts += "THIS HERETIC ASCENDED!" else if(cultiewin) - parts += "The heretic was successful!" + parts += "The heretic was successful!" else parts += "The heretic has failed." @@ -187,6 +190,7 @@ parts += knowledge_message.Join(", ") return parts.Join("
") + //////////////// // Knowledge // //////////////// @@ -224,9 +228,9 @@ name = "spendtime" var/timer = 5 MINUTES -/datum/objective/stalk/process() - if(owner?.current?.stat != DEAD && target?.current?.stat != DEAD && (target in view(5,owner.current))) - timer -= 1 SECONDS +/datum/objective/stalk/process(delta_time) + if(owner?.current?.stat != DEAD && target?.current?.stat != DEAD && (owner.current in viewers(5, get_turf(target)))) + timer -= delta_time * 10 // timer is in deciseconds ///we don't want to process after the counter reaches 0, otherwise it is wasted processing if(timer <= 0) completed = TRUE @@ -252,9 +256,11 @@ /datum/objective/sacrifice_ecult name = "sacrifice" -/datum/objective/sacrifice_ecult/update_explanation_text() - . = ..() +/datum/objective/sacrifice_ecult/New() + ..() target_amount = rand(2,6) + +/datum/objective/sacrifice_ecult/update_explanation_text() explanation_text = "Sacrifice at least [target_amount] people." /datum/objective/sacrifice_ecult/check_completion() @@ -264,3 +270,13 @@ if(!cultie) return FALSE return cultie.total_sacrifices >= target_amount + +/datum/objective/ascend + name = "ascend" + explanation_text = "Appease the Gods and ascend." + +/datum/objective/ascend/check_completion() + if(!owner) + return FALSE + var/datum/antagonist/heretic/cultie = owner.has_antag_datum(/datum/antagonist/heretic) + return cultie?.ascended diff --git a/code/modules/antagonists/eldritch_cult/eldritch_book.dm b/code/modules/antagonists/eldritch_cult/eldritch_book.dm index d6f48c6a70864..f455d35b9047a 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_book.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_book.dm @@ -1,6 +1,6 @@ /obj/item/forbidden_book name = "Codex Cicatrix" - desc = "Book describing the secrets of the veil." + desc = "This book describes the secrets of the veil between worlds." icon = 'icons/obj/eldritch.dmi' icon_state = "book" w_class = WEIGHT_CLASS_SMALL @@ -8,11 +8,12 @@ var/mob/living/last_user ///how many charges do we have? var/charge = 1 - ///Where we cannot create the rune? - var/static/list/blacklisted_turfs = typecacheof(list(/turf/closed,/turf/open/space,/turf/open/lava)) ///Is it in use? var/in_use = FALSE +/obj/item/forbidden_book/empty + charge = 0 + /obj/item/forbidden_book/Destroy() last_user = null . = ..() @@ -23,21 +24,15 @@ if(!IS_HERETIC(user)) return . += "The Tome holds [charge] charges." - . += "Use it on the floor to create a transmutation rune, used to perform rituals." . += "Hit an influence in the black part with it to gain a charge." - . += "Hit a transmutation rune to destroy it." /obj/item/forbidden_book/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() if(!proximity_flag || !IS_HERETIC(user) || in_use) return in_use = TRUE - if(istype(target,/obj/effect/eldritch)) - remove_rune(target,user) if(istype(target,/obj/effect/reality_smash)) get_power_from_influence(target,user) - if(istype(target,/turf/open)) - draw_rune(target,user) in_use = FALSE ///Gives you a charge and destroys a corresponding influence @@ -48,28 +43,6 @@ qdel(RS) charge += 1 -///Draws a rune on a selected turf -/obj/item/forbidden_book/proc/draw_rune(atom/target,mob/user) - - for(var/turf/T in range(1,target)) - if(is_type_in_typecache(T, blacklisted_turfs)) - to_chat(target, "The terrain doesn't support runes!") - return - var/A = get_turf(target) - to_chat(user, "You start drawing a rune...") - - if(do_after(user,30 SECONDS,FALSE,A)) - - new /obj/effect/eldritch/big(A) - - -///Removes runes from the selected turf -/obj/item/forbidden_book/proc/remove_rune(atom/target,mob/user) - - to_chat(user, "You start removing a rune...") - if(do_after(user,2 SECONDS,user)) - qdel(target) - /obj/item/forbidden_book/ui_interact(mob/user, datum/tgui/ui = null) if(!IS_HERETIC(user)) @@ -142,9 +115,7 @@ charge -= text2num(params["cost"]) return TRUE - update_icon() // Not applicable to all objects. - -/obj/item/forbidden_book/ui_close(mob/user) +/obj/item/forbidden_book/ui_close(mob/user, datum/tgui/tgui) flick("book_closing",src) icon_state = initial(icon_state) return ..() diff --git a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm index 2dc2206a6c4f7..c53dc086e548a 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm @@ -1,13 +1,20 @@ /obj/effect/eldritch name = "Generic rune" - desc = "Weird combination of shapes and symbols etched into the floor itself. The indentation is filled with thick black tar-like fluid." + desc = "A flowing circle of shapes and runes is etched into the floor, filled with a thick black tar-like fluid." anchored = TRUE icon_state = "" resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF layer = SIGIL_LAYER + forensic_protected = TRUE ///Used mainly for summoning ritual to prevent spamming the rune to create millions of monsters. var/is_in_use = FALSE +/obj/effect/eldritch/Initialize() + . = ..() + var/image/I = image(icon = 'icons/effects/eldritch.dmi', icon_state = null, loc = src) + I.override = TRUE + add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "heretic_rune", I) + /obj/effect/eldritch/attack_hand(mob/living/user) . = ..() if(.) @@ -32,13 +39,8 @@ var/list/knowledge = cultie.get_all_knowledge() var/list/atoms_in_range = list() - for(var/A in range(1, src)) - var/atom/atom_in_range = A - if(istype(atom_in_range,/area)) - continue - if(istype(atom_in_range,/turf)) // we dont want turfs - continue - if(istype(atom_in_range,/mob/living)) + for(var/atom/atom_in_range as() in range(1, src)) + if(isliving(atom_in_range)) var/mob/living/living_in_range = atom_in_range if(living_in_range.stat != DEAD || living_in_range == user) // we only accept corpses, no living beings allowed. continue @@ -67,6 +69,7 @@ if(is_type_in_list(local_atom_in_range,local_required_atom_list)) selected_atoms |= local_atom_in_range local_required_atoms -= list(local_required_atom_list) + break if(length(local_required_atoms) > 0) continue @@ -81,7 +84,7 @@ atom_to_disappear.invisibility = INVISIBILITY_ABSTRACT if(current_eldritch_knowledge.on_finished_recipe(user,selected_atoms,loc)) current_eldritch_knowledge.cleanup_atoms(selected_atoms) - is_in_use = FALSE + is_in_use = FALSE for(var/to_appear in atoms_to_disappear) var/atom/atom_to_appear = to_appear @@ -90,104 +93,87 @@ return is_in_use = FALSE - to_chat(user,"Your ritual failed! You used either wrong components or are missing something important!") + to_chat(user,"Your ritual failed! You either used the wrong components or are missing something important!") + /obj/effect/eldritch/big - name = "Transmutation rune" + name = "transmutation rune" icon = 'icons/effects/96x96.dmi' icon_state = "eldritch_rune1" pixel_x = -32 //So the big ol' 96x96 sprite shows up right pixel_y = -32 /** - * #Reality smash tracker - * - * Stupid fucking list holder, DONT create new ones, it will break the game, this is automnatically created whenever eldritch cultists are created. - * - * Tracks relevant data, generates relevant data, useful tool - */ + * #Reality smash tracker + * + * Stupid fucking list holder, DONT create new ones, it will break the game, this is automnatically created whenever eldritch cultists are created. + * + * Tracks relevant data, generates relevant data, useful tool + */ /datum/reality_smash_tracker ///list of tracked reality smashes - var/list/smashes = list() + var/smashes = 0 ///List of mobs with ability to see the smashes - var/list/targets = list() + var/targets = 0 /datum/reality_smash_tracker/Destroy(force, ...) if(GLOB.reality_smash_track == src) - stack_trace("/datum/reality_smash_tracker was deleted. Heretics may no longer access any influences. Fix it or call coder support") - QDEL_LIST(smashes) - targets.Cut() + stack_trace("/datum/reality_smash_tracker was deleted. New heretics will no longer generate new influences") return ..() /** - * Automatically fixes the target and smash network - * - * Fixes any bugs that are caused by late Generate() or exchanging clients - */ -/datum/reality_smash_tracker/proc/ReworkNetwork() - listclearnulls(smashes) - for(var/mind in targets) - if(isnull(mind)) - stack_trace("A null somehow landed in a list of minds") - continue - for(var/X in smashes) - var/obj/effect/reality_smash/reality_smash = X - reality_smash.AddMind(mind) - -/** - * Generates a set amount of reality smashes based on the N value - * - * Automatically creates more reality smashes - */ -/datum/reality_smash_tracker/proc/_Generate() - var/targ_len = length(targets) - var/smash_len = length(smashes) - var/number = targ_len * 6 - smash_len + * Generates a set amount of reality smashes based on the N value + * + * Automatically creates more reality smashes + */ +/datum/reality_smash_tracker/proc/Generate() + targets++ + var/number = max(targets * ( 4 - (targets-1) ) - smashes,1) for(var/i in 0 to number) - - var/turf/chosen_location = get_safe_random_station_turf() + var/turf/chosen_location = get_safe_random_station_turfs() //we also dont want them close to each other, at least 1 tile of seperation var/obj/effect/reality_smash/what_if_i_have_one = locate() in range(1, chosen_location) var/obj/effect/broken_illusion/what_if_i_had_one_but_got_used = locate() in range(1, chosen_location) if(what_if_i_have_one || what_if_i_had_one_but_got_used) //we dont want to spawn continue - var/obj/effect/reality_smash/RS = new/obj/effect/reality_smash(chosen_location) - smashes += RS - ReworkNetwork() - - -/** - * Adds a mind to the list of people that can see the reality smashes - * - * Use this whenever you want to add someone to the list - */ -/datum/reality_smash_tracker/proc/AddMind(var/datum/mind/M) - RegisterSignal(M.current,COMSIG_MOB_LOGIN,.proc/ReworkNetwork) - targets |= M - _Generate() - for(var/X in smashes) - var/obj/effect/reality_smash/reality_smash = X - reality_smash.AddMind(M) - - -/** - * Removes a mind from the list of people that can see the reality smashes - * - * Use this whenever you want to remove someone from the list - */ -/datum/reality_smash_tracker/proc/RemoveMind(var/datum/mind/M) - UnregisterSignal(M.current,COMSIG_MOB_LOGIN) - targets -= M - for(var/obj/effect/reality_smash/RS in smashes) - RS.RemoveMind(M) + new /obj/effect/reality_smash(chosen_location) + smashes++ /obj/effect/broken_illusion - name = "Pierced reality" + name = "pierced reality" icon = 'icons/effects/eldritch.dmi' icon_state = "pierced_illusion" anchored = TRUE + forensic_protected = TRUE resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF + alpha = 0 + +/obj/effect/broken_illusion/ComponentInitialize() + AddComponent(/datum/component/discoverable, 5000) + +/obj/effect/broken_illusion/Initialize() + . = ..() + addtimer(CALLBACK(src,.proc/show_presence),15 SECONDS) + + var/image/I = image('icons/effects/eldritch.dmi',src,null,OBJ_LAYER) + I.override = TRUE + add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "pierced_reality_silicons", I) + + I = image('icons/effects/eldritch.dmi',src, "pierced_illusion",OBJ_LAYER) + I.override = TRUE + I.alpha = 255 + I.appearance_flags = RESET_ALPHA + add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/heretics,"pierced_reality_heretics",I) + addtimer(CALLBACK(src,.proc/dissipate),15 MINUTES) + +///Makes this obj appear out of nothing +/obj/effect/broken_illusion/proc/show_presence() + animate(src,alpha = 255,time = 15 SECONDS) + +/obj/effect/broken_illusion/proc/dissipate() + animate(src,alpha = 0,time = 2 MINUTES) + QDEL_IN(src, 2 MINUTES) /obj/effect/broken_illusion/attack_hand(mob/living/user) if(!ishuman(user)) @@ -198,11 +184,11 @@ else var/obj/item/bodypart/arm = human_user.get_active_hand() if(prob(25)) - to_chat(human_user,"Otherwordly presence tears your arm aparts into atoms as you try to touch the hole in the very fabric of reality!") + to_chat(human_user,"An otherwordly presence tears and atomizes your arm as you try to touch the hole in the very fabric of reality!") arm.dismember() qdel(arm) else - to_chat(human_user,"You pull your hand away from the hole as the eldritch energy flails trying to catch onto the existance itself!") + to_chat(human_user,"You pull your hand away from the hole as the eldritch energy flails trying to latch onto existance itself!") /obj/effect/broken_illusion/attack_tk(mob/user) if(!ishuman(user)) @@ -210,44 +196,41 @@ var/mob/living/carbon/human/human_user = user if(IS_HERETIC(human_user)) to_chat(human_user,"You know better than to tempt forces out of your control!") + return + //a very elaborate way to suicide + to_chat(human_user,"Eldritch energy lashes out, piercing your fragile mind, tearing it to pieces!") + human_user.ghostize(FALSE,SENTIENCE_ERASE) + var/obj/item/bodypart/head/head = locate() in human_user.bodyparts + if(head) + head.dismember() + qdel(head) else - //a very elaborate way to suicide - to_chat(human_user,"Eldritch energy lashes out, piercing your fragile mind, tearing it to pieces!") - human_user.ghostize() - var/obj/item/bodypart/head/head = locate() in human_user.bodyparts - if(head) - head.dismember() - qdel(head) - else - human_user.gib() - + human_user.gib() var/datum/effect_system/reagents_explosion/explosion = new() - explosion.set_up(1, get_turf(human_user), 1, 0) + explosion.set_up(1, get_turf(human_user), TRUE, 0) explosion.start() /obj/effect/broken_illusion/examine(mob/user) - if(!IS_HERETIC(user) && ishuman(user)) - var/mob/living/carbon/human/human_user = user - to_chat(human_user,"Your brain hurts when you look at this!") - human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN,10) . = ..() + var/mob/living/carbon/human/human_user = user + if(istype(human_user) && !IS_HERETIC(human_user) && !IS_HERETIC_MONSTER(human_user)) + to_chat(human_user,"Your mind burns as you stare at the tear!") + SEND_SIGNAL(human_user, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus) /obj/effect/reality_smash - name = "\improper reality smash" + name = "reality smash" + desc = "A weak spot in the veil of reality. You can pierce reality by harvesting this with your Codex Cicatrix to gain charges." icon = 'icons/effects/eldritch.dmi' anchored = TRUE + forensic_protected = TRUE resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF - ///We cannot use icon_state since this is invisible, functions the same way but with custom behaviour. - var/image_state = "reality_smash" - ///Who can see us? - var/list/minds = list() - ///Tracked image - var/image/img + invisibility = INVISIBILITY_OBSERVER /obj/effect/reality_smash/Initialize() . = ..() - img = image(icon, src, image_state, OBJ_LAYER) + var/img = image(icon, src, "reality_smash", OBJ_LAYER) generate_name() + add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/heretics,"influence",img) /obj/effect/reality_smash/Destroy() on_destroy() @@ -255,35 +238,13 @@ ///Custom effect that happens on destruction /obj/effect/reality_smash/proc/on_destroy() - for(var/cm in minds) - var/datum/mind/cultie = cm - if(cultie.current?.client) - cultie.current.client.images -= img - //clear the list - minds -= cultie - GLOB.reality_smash_track.smashes -= src - img = null - new /obj/effect/broken_illusion(drop_location()) - -///Makes the mind able to see this effect -/obj/effect/reality_smash/proc/AddMind(var/datum/mind/cultie) - minds |= cultie - if(cultie.current.client) - cultie.current.client.images |= img - - - -///Makes the mind not able to see this effect -/obj/effect/reality_smash/proc/RemoveMind(var/datum/mind/cultie) - minds -= cultie - if(cultie.current.client) - cultie.current.client.images -= img - - + GLOB.reality_smash_track.smashes-- + var/obj/effect/broken_illusion/illusion = new /obj/effect/broken_illusion(drop_location()) + illusion.name = pick("Researched","Siphoned","Analyzed","Emptied","Drained") + " " + name ///Generates random name /obj/effect/reality_smash/proc/generate_name() var/static/list/prefix = list("Omniscient","Thundering","Enlightening","Intrusive","Rejectful","Atomized","Subtle","Rising","Lowering","Fleeting","Towering","Blissful","Arrogant","Threatening","Peaceful","Aggressive") var/static/list/postfix = list("Flaw","Presence","Crack","Heat","Cold","Memory","Reminder","Breeze","Grasp","Sight","Whisper","Flow","Touch","Veil","Thought","Imperfection","Blemish","Blush") - name = pick(prefix) + " " + pick(postfix) + name = "\improper" + pick(prefix) + " " + pick(postfix) diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm index f3470a737b408..1a71eceed8a7b 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm @@ -1,6 +1,6 @@ /obj/item/living_heart name = "Living Heart" - desc = "Link to the worlds beyond." + desc = "A link to the worlds beyond." icon = 'icons/obj/eldritch.dmi' icon_state = "living_heart" w_class = WEIGHT_CLASS_SMALL @@ -12,11 +12,11 @@ if(!IS_HERETIC(user)) return if(!target) - to_chat(user,"No target could be found. Put the living heart on the rune and use the rune to recieve a target.") + to_chat(user,"No target could be found. Put the living heart on the rune and use the rune to receive a target.") return var/dist = get_dist(user.loc,target.loc) var/dir = get_dir(user.loc,target.loc) - if(user.z != target.z) + if(user.get_virtual_z_level() != target.get_virtual_z_level()) to_chat(user,"[target.real_name] is on another plane of existance!") else switch(dist) @@ -24,17 +24,15 @@ to_chat(user,"[target.real_name] is near you. They are to the [dir2text(dir)] of you!") if(16 to 31) to_chat(user,"[target.real_name] is somewhere in your vicinty. They are to the [dir2text(dir)] of you!") - if(32 to 127) - to_chat(user,"[target.real_name] is far away from you. They are to the [dir2text(dir)] of you!") else - to_chat(user,"[target.real_name] is beyond our reach.") + to_chat(user,"[target.real_name] is far away from you. They are to the [dir2text(dir)] of you!") if(target.stat == DEAD) - to_chat(user,"[target.real_name] is dead. Bring them onto a transmutation rune!") + to_chat(user,"[target.real_name] is dead. Bring them to a transmutation rune!") /datum/action/innate/heretic_shatter name = "Shattering Offer" - desc = "By breaking your blade you are noticed by the hill or rust and are granted an escape from a dire sitatuion. (Teleports you to a random safe z turf on your current z level but destroys your blade.)" + desc = "By breaking your blade, you will be granted salvation from a dire situation. (Teleports you to a random safe turf on your current z level, but destroys your blade.)" background_icon_state = "bg_ecult" button_icon_state = "shatter" icon_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -56,8 +54,8 @@ /datum/action/innate/heretic_shatter/Activate() var/turf/safe_turf = find_safe_turf(zlevels = sword.z, extended_safety_checks = TRUE) - do_teleport(holder,safe_turf,forceMove = TRUE) - to_chat(holder," You feel a gust of energy flow through your body, Rusted Hills heard your call...") + do_teleport(holder,safe_turf,forceMove = TRUE,channel = TELEPORT_CHANNEL_MAGIC) + to_chat(holder,"You feel a gust of energy flow through your body... the Rusted Hills heard your call...") qdel(sword) @@ -74,7 +72,7 @@ flags_1 = CONDUCT_1 sharpness = IS_SHARP w_class = WEIGHT_CLASS_NORMAL - force = 17 + force = 24 throwforce = 10 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "rends") @@ -103,16 +101,19 @@ /obj/item/melee/sickly_blade/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() var/datum/antagonist/heretic/cultie = user.mind.has_antag_datum(/datum/antagonist/heretic) - if(!cultie || !proximity_flag) + if(!cultie) return var/list/knowledge = cultie.get_all_knowledge() for(var/X in knowledge) var/datum/eldritch_knowledge/eldritch_knowledge_datum = knowledge[X] - eldritch_knowledge_datum.on_eldritch_blade(target,user,proximity_flag,click_parameters) + if(proximity_flag) + eldritch_knowledge_datum.on_eldritch_blade(target,user,proximity_flag,click_parameters) + else + eldritch_knowledge_datum.on_ranged_attack_eldritch_blade(target,user,click_parameters) /obj/item/melee/sickly_blade/rust name = "\improper Rusted Blade" - desc = "This crescent blade is decrepit, wasting to dust. Yet still it bites, catching flesh with jagged, rotten teeth." + desc = "This crescent blade is decrepit, wasting to rust. Yet still it bites, ripping flesh and bone with jagged, rotten teeth." icon_state = "rust_blade" item_state = "rust_blade" @@ -124,13 +125,13 @@ /obj/item/melee/sickly_blade/flesh name = "\improper Flesh Blade" - desc = "A crescent blade born from a fleshwarped creature. Keenly aware, it seeks to spread to others the excruitations it has endured from dread origins." + desc = "A crescent blade born from a fleshwarped creature. Keenly aware, it seeks to spread to others the suffering it has endured from its dreadful origins." icon_state = "flesh_blade" item_state = "flesh_blade" /obj/item/clothing/neck/eldritch_amulet name = "Warm Eldritch Medallion" - desc = "A strange medallion. Peering through the crystalline surface, the world around you melts away. You see your own beating heart, and the pulse of a thousand others." + desc = "A strange medallion. Peering through the crystalline surface, the world around you melts away. You see your own beating heart, and the pulsing of a thousand others." icon = 'icons/obj/eldritch.dmi' icon_state = "eye_medalion" w_class = WEIGHT_CLASS_SMALL @@ -139,7 +140,7 @@ /obj/item/clothing/neck/eldritch_amulet/equipped(mob/user, slot) . = ..() - if(ishuman(user) && user.mind && slot == SLOT_NECK && IS_HERETIC(user) ) + if(ishuman(user) && user.mind && slot == ITEM_SLOT_NECK && IS_HERETIC(user) ) ADD_TRAIT(user, trait, CLOTHING_TRAIT) user.update_sight() @@ -150,15 +151,21 @@ /obj/item/clothing/neck/eldritch_amulet/piercing name = "Piercing Eldritch Medallion" - desc = "A strange medallion. Peering through the crystalline surface, the light refracts into new and terrifying spectrums of color. You see yourself, reflected off cascading mirrors, warped into improbable shapes." + desc = "A strange medallion. Peering through the crystalline surface, the light refracts into new and terrifying spectrums of color. You see yourself, reflected off cascading mirrors, warped into impossible shapes." trait = TRAIT_XRAY_VISION +/obj/item/clothing/neck/eldritch_amulet/guise + name = "guise of Istasha" + desc = "An odd amulet formed out of multiple floating parts, strung togethere by forces from another world." + icon_state = "eye_medalion" + trait = TRAIT_DIGINVIS + /obj/item/clothing/head/hooded/cult_hoodie/eldritch name = "ominous hood" icon_state = "eldritch" desc = "A torn, dust-caked hood. Strange eyes line the inside." flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH flash_protect = 1 /obj/item/clothing/suit/hooded/cultrobes/eldritch @@ -171,11 +178,87 @@ allowed = list(/obj/item/melee/sickly_blade, /obj/item/forbidden_book) hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch // slightly better than normal cult robes - armor = list("melee" = 50, "bullet" = 50, "laser" = 50,"energy" = 50, "bomb" = 35, "bio" = 20, "rad" = 0, "fire" = 20, "acid" = 20) + armor = list("melee" = 50, "bullet" = 50, "laser" = 50,"energy" = 50, "bomb" = 35, "bio" = 20, "rad" = 0, "fire" = 20, "acid" = 20, "stamina" = 60) /obj/item/reagent_containers/glass/beaker/eldritch name = "flask of eldritch essence" - desc = "Toxic to the close minded. Healing to those with knowledge of the beyond." + desc = "Toxic to the closed minded, yet refreshing to those with knowledge of the beyond." icon = 'icons/obj/eldritch.dmi' icon_state = "eldrich_flask" list_reagents = list(/datum/reagent/eldritch = 50) + +/obj/item/clothing/mask/void_mask + name = "Mask Of Madness" + desc = "Mask created from the suffering of existance, you can look down it's eyes, and notice something gazing back at you." + icon_state = "mad_mask" + w_class = WEIGHT_CLASS_SMALL + flags_cover = MASKCOVERSEYES + resistance_flags = FLAMMABLE + flags_inv = HIDEFACE|HIDEFACIALHAIR + ///Who is wearing this + var/mob/living/carbon/human/local_user + +/obj/item/clothing/mask/void_mask/equipped(mob/user, slot) + . = ..() + if(slot == ITEM_SLOT_MASK && ishuman(user) && user.mind) + local_user = user + START_PROCESSING(SSobj,src) + + if(IS_HERETIC(user) || IS_HERETIC_MONSTER(user)) + return + ADD_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) + +/obj/item/clothing/mask/void_mask/dropped(mob/M) + local_user = null + STOP_PROCESSING(SSobj,src) + REMOVE_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) + return ..() + +/obj/item/clothing/mask/void_mask/process() + if(!local_user) + return PROCESS_KILL + + if((IS_HERETIC(local_user) || IS_HERETIC_MONSTER(local_user)) && HAS_TRAIT(src,TRAIT_NODROP)) + REMOVE_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) + + for(var/mob/living/carbon/human/human_in_range in viewers(9,local_user)) + if(IS_HERETIC(human_in_range) || IS_HERETIC_MONSTER(human_in_range)) + continue + + SEND_SIGNAL(human_in_range,COMSIG_HUMAN_VOID_MASK_ACT,rand(-1,-10)) + + if(prob(60)) + human_in_range.hallucination += 5 + + if(prob(40)) + human_in_range.Jitter(5) + + if(prob(30)) + human_in_range.emote(pick("giggle","laugh")) + human_in_range.adjustStaminaLoss(10) + + if(prob(25)) + human_in_range.Dizzy(5) + +/obj/item/clothing/neck/crucifix + name = "crucifix" + desc = "In the eventuality that one of those you falesly accused is, in fact, a real witch, this will ward you against their curses." + resistance_flags = FIRE_PROOF | ACID_PROOF + icon = 'icons/obj/objects.dmi' + icon_state = "crucifix" + w_class = WEIGHT_CLASS_SMALL + +/obj/item/clothing/neck/crucifix/equipped(mob/living/carbon/human/user, slot) + . = ..() + if(slot == ITEM_SLOT_NECK && istype(user)) + ADD_TRAIT(user, TRAIT_WARDED, CLOTHING_TRAIT) + +/obj/item/clothing/neck/crucifix/dropped(mob/user) + . = ..() + REMOVE_TRAIT(user, TRAIT_WARDED, CLOTHING_TRAIT) + +/obj/item/clothing/neck/crucifix/rosary + name = "rosary beads" + desc = "A wooden crucifix meant to ward off curses and hexes." + resistance_flags = FLAMMABLE + icon_state = "rosary" diff --git a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm index dea7a2cec0700..71184b8169945 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm @@ -1,11 +1,10 @@ - /** - * #Eldritch Knwoledge - * - * Datum that makes eldritch cultist interesting. - * - * Eldritch knowledge aren't instantiated anywhere roundstart, and are initalized and destroyed as the round goes on. - */ + * #Eldritch Knwoledge + * + * Datum that makes eldritch cultist interesting. + * + * Eldritch knowledge aren't instantiated anywhere roundstart, and are initalized and destroyed as the round goes on. + */ /datum/eldritch_knowledge ///Name of the knowledge var/name = "Basic knowledge" @@ -35,41 +34,41 @@ required_atoms = temp_list /** - * What happens when this is assigned to an antag datum - * - * This proc is called whenever a new eldritch knowledge is added to an antag datum - */ + * What happens when this is assigned to an antag datum + * + * This proc is called whenever a new eldritch knowledge is added to an antag datum + */ /datum/eldritch_knowledge/proc/on_gain(mob/user) to_chat(user, "[gain_text]") return /** - * What happens when you loose this - * - * This proc is called whenever antagonist looses his antag datum, put cleanup code in here - */ + * What happens when you loose this + * + * This proc is called whenever antagonist looses his antag datum, put cleanup code in here + */ /datum/eldritch_knowledge/proc/on_lose(mob/user) return /** - * What happens every tick - * - * This proc is called on SSprocess in eldritch cultist antag datum. SSprocess happens roughly every second - */ + * What happens every tick + * + * This proc is called on SSprocess in eldritch cultist antag datum. SSprocess happens roughly every second + */ /datum/eldritch_knowledge/proc/on_life(mob/user) return /** - * Special check for recipes - * - * If you are adding a more complex summoning or something that requires a special check that parses through all the atoms in an area override this. - */ + * Special check for recipes + * + * If you are adding a more complex summoning or something that requires a special check that parses through all the atoms in an area override this. + */ /datum/eldritch_knowledge/proc/recipe_snowflake_check(list/atoms,loc) return TRUE /** - * What happens once the recipe is succesfully finished - * - * By default this proc creates atoms from result_atoms list. Override this is you want something else to happen. - */ + * What happens once the recipe is succesfully finished + * + * By default this proc creates atoms from result_atoms list. Override this is you want something else to happen. + */ /datum/eldritch_knowledge/proc/on_finished_recipe(mob/living/user,list/atoms,loc) if(result_atoms.len == 0) return FALSE @@ -80,11 +79,11 @@ return TRUE /** - * Used atom cleanup - * - * Overide this proc if you dont want ALL ATOMS to be destroyed. useful in many situations. - */ -/datum/eldritch_knowledge/proc/cleanup_atoms(list/atoms) + * Used atom cleanup + * + * Overide this proc if you dont want ALL ATOMS to be destroyed. useful in many situations. + */ +/datum/eldritch_knowledge/proc/cleanup_atoms(list/atoms) //BUG: crafting something will add to this list and delete ALL of the required components, IE if you have 2 bibles on a rune, and craft a codex, it will make 1 codex and qdel BOTH bibles for(var/X in atoms) var/atom/A = X if(!isliving(A)) @@ -93,22 +92,35 @@ return /** - * Mansus grasp act - * - * Gives addtional effects to mansus grasp spell - */ + * Mansus grasp act + * + * Gives addtional effects to mansus grasp spell + * Gives addtional effects to mansus touch spell of your followers + */ /datum/eldritch_knowledge/proc/on_mansus_grasp(atom/target, mob/user, proximity_flag, click_parameters) return FALSE +/datum/eldritch_knowledge/proc/on_mansus_touch(atom/target, mob/user, proximity_flag, click_parameters) + return FALSE + + /** - * Sickly blade act - * - * Gives addtional effects to sickly blade weapon - */ + * Sickly blade act + * + * Gives addtional effects to sickly blade weapon + */ /datum/eldritch_knowledge/proc/on_eldritch_blade(target,user,proximity_flag,click_parameters) return +/** + * Sickly blade distant act + * + * Same as [/datum/eldritch_knowledge/proc/on_eldritch_blade] but works on targets that are not in proximity to you. + */ +/datum/eldritch_knowledge/proc/on_ranged_attack_eldritch_blade(atom/target,mob/user,click_parameters) + return + ////////////// ///Subtypes/// ////////////// @@ -144,20 +156,22 @@ var/list/compiled_list = list() for(var/H in GLOB.carbon_list) - if(!ishuman(H)) - continue var/mob/living/carbon/human/human_to_check = H - if(fingerprints[md5(human_to_check.dna.uni_identity)]) + if(istype(human_to_check) && fingerprints[md5(human_to_check.dna.uni_identity)]) compiled_list |= human_to_check.real_name compiled_list[human_to_check.real_name] = human_to_check if(compiled_list.len == 0) - to_chat(user, "The items don't posses required fingerprints.") + to_chat(user, "These items don't possess the required fingerprints or DNA.") return FALSE var/chosen_mob = input("Select the person you wish to curse","Your target") as null|anything in sortList(compiled_list, /proc/cmp_mob_realname_dsc) if(!chosen_mob) return FALSE + var/mob/living/living_mob = chosen_mob + if (istype(living_mob) && HAS_TRAIT(living_mob, TRAIT_WARDED)) + to_chat(user, "The curse failed! The target is warded against curses.") + return FALSE curse(compiled_list[chosen_mob]) addtimer(CALLBACK(src, .proc/uncurse, compiled_list[chosen_mob]),timer) return TRUE @@ -177,14 +191,14 @@ //we need to spawn the mob first so that we can use it in pollCandidatesForMob, we will move it from nullspace down the code var/mob/living/summoned = new mob_to_summon(loc) message_admins("[summoned.name] is being summoned by [user.real_name] in [loc]") - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [summoned.name]", ROLE_HERETIC, null, FALSE, 100, summoned) + var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [summoned.real_name]", ROLE_HERETIC, null, FALSE, 100, summoned) if(!LAZYLEN(candidates)) to_chat(user,"No ghost could be found...") qdel(summoned) return FALSE var/mob/dead/observer/C = pick(candidates) log_game("[key_name_admin(C)] has taken control of ([key_name_admin(summoned)]), their master is [user.real_name]") - summoned.ghostize(FALSE) + summoned.ghostize(FALSE,SENTIENCE_ERASE) summoned.key = C.key summoned.mind.add_antag_datum(/datum/antagonist/heretic_monster) var/datum/antagonist/heretic_monster/heretic_monster = summoned.mind.has_antag_datum(/datum/antagonist/heretic_monster) @@ -226,7 +240,7 @@ /datum/eldritch_knowledge/spell/basic name = "Break of dawn" - desc = "Starts your journey in the mansus. Allows you to select a target using a living heart on a transmutation rune." + desc = "You can sacrifice specific targets by placing their dead bodies and the living heart on a transmutation rune, and performing a transmutation ritual." gain_text = "Gates of mansus open up to your mind." next_knowledge = list(/datum/eldritch_knowledge/base_rust,/datum/eldritch_knowledge/base_ash,/datum/eldritch_knowledge/base_flesh) cost = 0 @@ -260,28 +274,35 @@ if(!istype(X,/obj/item/forbidden_book)) continue var/obj/item/forbidden_book/FB = X - FB.charge++ + FB.charge += 2 break if(!LH.target) var/datum/objective/A = new A.owner = user.mind - var/datum/mind/targeted = A.find_target()//easy way, i dont feel like copy pasting that entire block of code - LH.target = targeted.current + var/list/targets = list() + for(var/i in 1 to 3) + var/datum/mind/targeted = A.find_target()//easy way, i dont feel like copy pasting that entire block of code + if(!targeted) + break + targets[targeted.current.real_name] = targeted.current + LH.target = targets[input(user,"Choose your next target","Target") in targets] qdel(A) if(LH.target) to_chat(user,"Your new target has been selected, go and sacrifice [LH.target.real_name]!") - else to_chat(user,"target could not be found for living heart.") /datum/eldritch_knowledge/spell/basic/cleanup_atoms(list/atoms) return + +// --- GENERAL --- + /datum/eldritch_knowledge/living_heart name = "Living Heart" desc = "Allows you to create additional living hearts, using a heart, a pool of blood and a poppy. Living hearts when used on a transmutation rune will grant you a person to hunt and sacrifice on the rune. Every sacrifice gives you an additional charge in the book." - gain_text = "Gates of mansus open up to your mind." + gain_text = "The Gates of Mansus open up to your mind." cost = 0 required_atoms = list(/obj/item/organ/heart,/obj/effect/decal/cleanable/blood,/obj/item/reagent_containers/food/snacks/grown/poppy) result_atoms = list(/obj/item/living_heart) @@ -293,5 +314,179 @@ gain_text = "Their hand is at your throats, yet you see Them not." cost = 0 required_atoms = list(/obj/item/organ/eyes,/obj/item/stack/sheet/animalhide/human,/obj/item/storage/book/bible,/obj/item/pen) - result_atoms = list(/obj/item/forbidden_book) + result_atoms = list(/obj/item/forbidden_book/empty) route = "Start" + +// --- CRAFTING --- + +/datum/eldritch_knowledge/ashen_eyes + name = "Ashen Eyes" + gain_text = "Piercing eyes, guide me through the mundane." + desc = "Allows you to craft a thermal vision amulet by transmutating eyes with a glass shard." + cost = 1 + next_knowledge = list(/datum/eldritch_knowledge/spell/ashen_shift,/datum/eldritch_knowledge/flesh_ghoul) + required_atoms = list(/obj/item/organ/eyes,/obj/item/shard) + result_atoms = list(/obj/item/clothing/neck/eldritch_amulet) + +/datum/eldritch_knowledge/guise + name = "Guise of Istasha" + gain_text = "Hide your form from the ones without a soul." + desc = "Allows you to craft a digital camoflage amulet by transmutating a circuit board with a glass shard." + cost = 1 + next_knowledge = list(/datum/eldritch_knowledge/spell/ashen_shift,/datum/eldritch_knowledge/flesh_ghoul) + required_atoms = list(/obj/item/circuitboard,/obj/item/shard) + result_atoms = list(/obj/item/clothing/neck/eldritch_amulet/guise) + +/datum/eldritch_knowledge/armor + name = "Armorer's ritual" + desc = "You can now create eldritch armor using a table and a gas mask." + gain_text = "For I am the heir to the throne of doom." + cost = 1 + next_knowledge = list(/datum/eldritch_knowledge/rust_regen,/datum/eldritch_knowledge/flesh_ghoul) + required_atoms = list(/obj/structure/table,/obj/item/clothing/mask/gas) + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch) + +/datum/eldritch_knowledge/essence + name = "Priest's Ritual" + desc = "You can now transmute a tank of water and a glass shard into a bottle of eldritch water." + gain_text = "This is an old recipe. The Owl whispered it to me." + cost = 1 + required_atoms = list(/obj/structure/reagent_dispensers/watertank) + result_atoms = list(/obj/item/reagent_containers/glass/beaker/eldritch) + +// --- CURSES --- + +/datum/eldritch_knowledge/curse/alteration + name = "Curse Of Alteration" + gain_text = "Mortal bodies, prisons of flesh. Death, a release..." + desc = "Start an alteration ritual by transmuting a wire cutter, a hatchet and an item that the victim touched with their bare hands. Inflict a debilitating curse that will cripple your target's body for 2 minutes. Add eyes, ears, limbs or tongues to the mix to disable those organs while the curse is in effect." + cost = 1 + required_atoms = list(/obj/item/wirecutters,/obj/item/hatchet) + timer = 2 MINUTES + var/list/debuffs = list() + +/datum/eldritch_knowledge/curse/alteration/on_finished_recipe(mob/living/user, list/atoms, loc) //the ritual completed, take the payment and apply the curse + //declare + debuffs = list() + var/list/extra_atoms = list() + + //check variables + for(var/A in range(1, loc)) //this + var/obj/item/bodypart/selected_part = A + if (istype(selected_part) && selected_part.status == BODYPART_ORGANIC) + switch(selected_part.body_zone) + if(BODY_ZONE_R_LEG) + extra_atoms |= A + debuffs |= "r_leg" + if(BODY_ZONE_L_LEG) + extra_atoms |= A + debuffs |= "l_leg" + if(BODY_ZONE_R_ARM) + extra_atoms |= A + debuffs |= "r_arm" + if(BODY_ZONE_L_ARM) + extra_atoms |= A + debuffs |= "l_arm" + + var/obj/item/organ/selected_organ = A + if (istype(selected_organ) && selected_organ.status == ORGAN_ORGANIC) + switch(selected_organ.slot) + if(ORGAN_SLOT_TONGUE) + extra_atoms |= A + debuffs |= "tongue" + if(ORGAN_SLOT_EYES) + extra_atoms |= A + debuffs |= "eyes" + if(ORGAN_SLOT_EARS) + extra_atoms |= A + debuffs |= "ears" + + cleanup_atoms(extra_atoms) + . = ..() + return . + +/datum/eldritch_knowledge/curse/alteration/curse(mob/living/chosen_mob) + . = ..() + if (chosen_mob.has_status_effect(/datum/status_effect/corrosion_curse)) + return FALSE + + var/mob/living/carbon/human/chosen_mortal = chosen_mob + if (!istype(chosen_mob)) + return + + chosen_mortal.apply_status_effect(/datum/status_effect/corrosion_curse) //the purpose of this debuff is to alert the victim they've been cursed + for(var/X in debuffs) + switch (X) + if ("r_leg") + ADD_TRAIT(chosen_mortal,TRAIT_PARALYSIS_R_LEG,CURSE_TRAIT) + if ("l_leg") + ADD_TRAIT(chosen_mortal,TRAIT_PARALYSIS_L_LEG,CURSE_TRAIT) + if ("r_arm") + ADD_TRAIT(chosen_mortal,TRAIT_PARALYSIS_R_ARM,CURSE_TRAIT) + if ("l_arm") + ADD_TRAIT(chosen_mortal,TRAIT_PARALYSIS_L_ARM,CURSE_TRAIT) + if ("tongue") + ADD_TRAIT(chosen_mortal, TRAIT_MUTE, CURSE_TRAIT) + if ("eyes") + chosen_mortal.become_blind(CURSE_TRAIT) + if ("ears") + ADD_TRAIT(chosen_mortal, TRAIT_DEAF, CURSE_TRAIT) + return . + +/datum/eldritch_knowledge/curse/alteration/uncurse(mob/living/chosen_mob) + . = ..() + var/mob/living/carbon/human/chosen_mortal = chosen_mob + //organ fuckup + chosen_mortal.remove_status_effect(/datum/status_effect/corrosion_curse) + + //CC + chosen_mortal.cure_blind(CURSE_TRAIT) + REMOVE_TRAIT(chosen_mortal, TRAIT_MUTE, CURSE_TRAIT) + REMOVE_TRAIT(chosen_mortal, TRAIT_DEAF, CURSE_TRAIT) + + //paralysis + REMOVE_TRAIT(chosen_mortal,TRAIT_PARALYSIS_R_ARM,CURSE_TRAIT) + REMOVE_TRAIT(chosen_mortal,TRAIT_PARALYSIS_L_ARM,CURSE_TRAIT) + REMOVE_TRAIT(chosen_mortal,TRAIT_PARALYSIS_L_LEG,CURSE_TRAIT) + REMOVE_TRAIT(chosen_mortal,TRAIT_PARALYSIS_R_LEG,CURSE_TRAIT) + chosen_mortal.update_mobility() + + return . + +// --- SPELLS --- + +/datum/eldritch_knowledge/spell/cleave + name = "Blood Cleave" + gain_text = "At first I didn't understand these instruments of war, but the priest told me to use them regardless. Soon, he said, I would know them well." + desc = "Gives AOE spell that causes heavy bleeding and blood loss." + cost = 1 + spell_to_add = /obj/effect/proc_holder/spell/pointed/cleave + next_knowledge = list(/datum/eldritch_knowledge/spell/rust_wave,/datum/eldritch_knowledge/spell/flame_birth) + +/datum/eldritch_knowledge/spell/blood_siphon + name = "Blood Siphon" + gain_text = "No matter the man, we bleed all the same. That's what the Marshal told me." + desc = "You gain a spell that drains health from your enemies to restores your own." + cost = 1 + spell_to_add = /obj/effect/proc_holder/spell/targeted/touch/blood_siphon + next_knowledge = list(/datum/eldritch_knowledge/summon/raw_prophet,/datum/eldritch_knowledge/spell/area_conversion) + +// --- SUMMONS --- + +/datum/eldritch_knowledge/summon/ashy + name = "Ashen Ritual" + gain_text = "I combined my principle of hunger with my desire for destruction. And the Nightwatcher knew my name." + desc = "You can now summon an Ash Man by transmutating a pile of ash, a head and a book." + cost = 1 + required_atoms = list(/obj/effect/decal/cleanable/ash,/obj/item/bodypart/head,/obj/item/book) + mob_to_summon = /mob/living/simple_animal/hostile/eldritch/ash_spirit + next_knowledge = list(/datum/eldritch_knowledge/summon/stalker,/datum/eldritch_knowledge/spell/rust_wave) + +/datum/eldritch_knowledge/summon/rusty + name = "Rusted Ritual" + gain_text = "I combined my principle of hunger with my desire for corruption. And the Rusted Hills called my name." + desc = "You can now summon a Rust Walker by transmutating a vomit pool, a severed head and a book." + cost = 1 + required_atoms = list(/obj/effect/decal/cleanable/vomit,/obj/item/bodypart/head,/obj/item/book) + mob_to_summon = /mob/living/simple_animal/hostile/eldritch/rust_spirit + next_knowledge = list(/datum/eldritch_knowledge/summon/stalker,/datum/eldritch_knowledge/spell/flame_birth) diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm index e38562c03833d..2a0f54f6af7cd 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm @@ -42,14 +42,19 @@ /obj/item/melee/touch_attack/mansus_fist name = "Mansus Grasp" - desc = "A sinister looking aura that distorts the flow of reality around it. Causes knockdown, major stamina damage aswell as some Brute. It gains additional beneficial effects with certain knowledges you can research." + desc = "A sinister looking aura that distorts the flow of reality around it. Mutes, causes knockdown, major stamina damage aswell as some Brute. You also can lay and remove transmutation runes using this. It gains additional beneficial effects with certain knowledges you can research." icon_state = "mansus_grasp" item_state = "mansus_grasp" catchphrase = "R'CH T'H TR'TH" + ///Where we cannot create the rune? + var/static/list/blacklisted_turfs = typecacheof(list(/turf/closed,/turf/open/space,/turf/open/lava)) /obj/item/melee/touch_attack/mansus_fist/afterattack(atom/target, mob/user, proximity_flag, click_parameters) if(!proximity_flag || target == user) - return + return FALSE + if(istype(target,/obj/effect/eldritch)) + remove_rune(target,user) + return FALSE playsound(user, 'sound/items/welder.ogg', 75, TRUE) if(ishuman(target)) var/mob/living/carbon/human/tar = target @@ -66,6 +71,7 @@ use_charge = TRUE var/mob/living/carbon/C = target C.adjustBruteLoss(10) + C.silent = 3 SECONDS C.AdjustKnockdown(5 SECONDS) C.adjustStaminaLoss(80) var/list/knowledge = cultie.get_all_knowledge() @@ -77,6 +83,25 @@ if(use_charge) return ..() +///Draws a rune on a selected turf +/obj/item/melee/touch_attack/mansus_fist/attack_self(mob/user) + + for(var/turf/T in range(1,user)) + if(is_type_in_typecache(T, blacklisted_turfs)) + to_chat(user, "The targeted terrain doesn't support runes!") + return + var/A = get_turf(user) + to_chat(user, "You start drawing a rune...") + + if(do_after(user,30 SECONDS,FALSE,A)) + new /obj/effect/eldritch/big(A) + +///Removes runes from the selected turf +/obj/item/melee/touch_attack/mansus_fist/proc/remove_rune(atom/target,mob/user) + to_chat(user, "You start removing a rune...") + if(do_after(user,2 SECONDS,target = user)) + qdel(target) + /obj/effect/proc_holder/spell/aoe_turf/rust_conversion name = "Aggressive Spread" desc = "Spreads rust onto nearby turfs." @@ -219,7 +244,7 @@ if(!can_target(targets[1], user)) return FALSE - for(var/mob/living/carbon/human/C in range(1,targets[1])) + for(var/mob/living/carbon/human/C in hearers(1,targets[1])) targets |= C @@ -362,7 +387,7 @@ playsound(get_turf(centre), 'sound/items/welder.ogg', 75, TRUE) var/_range = 1 for(var/i = 0, i <= max_range,i++) - for(var/turf/T in spiral_range_turfs(_range,centre)) + for(var/turf/open/T in spiral_range_turfs(_range,centre)) new /obj/effect/hotspot(T) T.hotspot_expose(700,50,1) _range++ @@ -405,13 +430,15 @@ /obj/effect/proc_holder/spell/targeted/fire_sworn/proc/remove() has_fire_ring = FALSE -/obj/effect/proc_holder/spell/targeted/fire_sworn/process() +/obj/effect/proc_holder/spell/targeted/fire_sworn/process(delta_time) . = ..() if(!has_fire_ring) return - for(var/turf/T in range(1,current_user)) + for(var/turf/open/T in RANGE_TURFS(1,current_user)) new /obj/effect/hotspot(T) - T.hotspot_expose(700,50,1) + T.hotspot_expose(700,250 * delta_time,1) + for(var/mob/living/livies in T.contents - current_user) + livies.adjustFireLoss(25 * delta_time) /obj/effect/proc_holder/spell/targeted/worm_contract @@ -460,7 +487,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/human_user = user - for(var/mob/living/carbon/target in view(7,user)) + for(var/mob/living/carbon/target in ohearers(7,user)) if(target.stat == DEAD || !target.on_fire) continue //This is essentially a death mark, use this to finish your opponent quicker. @@ -472,7 +499,7 @@ human_user.adjustBruteLoss(-10, FALSE) human_user.adjustFireLoss(-10, FALSE) human_user.adjustStaminaLoss(-10, FALSE) - human_user.adjustToxLoss(-10, FALSE) + human_user.adjustToxLoss(-10, FALSE, TRUE) human_user.adjustOxyLoss(-10) /obj/effect/proc_holder/spell/targeted/shed_human_form @@ -499,7 +526,7 @@ target.mind.transfer_to(outside, TRUE) target.forceMove(outside) target.apply_status_effect(STATUS_EFFECT_STASIS,STASIS_ASCENSION_EFFECT) - for(var/mob/living/carbon/human/humie in view(9,outside)-target) + for(var/mob/living/carbon/human/humie in (viewers(9,outside)-target)) if(IS_HERETIC(humie) || IS_HERETIC_MONSTER(humie)) continue SEND_SIGNAL(humie, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus) @@ -556,7 +583,7 @@ to_chat(originator, "You begin linking [target]'s mind to yours...") to_chat(target, "You feel your mind being pulled... connected... intertwined with the very fabric of reality...") - if(!do_after(originator, 6 SECONDS, target)) + if(!do_after(originator, 6 SECONDS, target = target)) return if(!originator.link_mob(target)) to_chat(originator, "You can't seem to link [target]'s mind...") diff --git a/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm b/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm index c2f404d8fbad1..7ecba7e1df168 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm @@ -7,7 +7,7 @@ job_rank = ROLE_HERETIC var/antag_hud_type = ANTAG_HUD_HERETIC var/antag_hud_name = "heretic_beast" - var/datum/antagonist/master + var/datum/antagonist/heretic/master /datum/antagonist/heretic_monster/admin_add(datum/mind/new_owner,mob/admin) new_owner.add_antag_datum(src) @@ -15,12 +15,14 @@ log_admin("[key_name(admin)] has heresized [key_name(new_owner)].") /datum/antagonist/heretic_monster/greet() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ecult_op.ogg', 100, FALSE, pressure_affected = FALSE)//subject to change - to_chat(owner, "You became an Eldritch Horror!") + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ecult_op.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE)//subject to change + to_chat(owner, "You became an Eldritch Horror, servant of [master]!") + owner.current.client?.tgui_panel?.give_antagonist_popup("Eldritch Horror", + "You are an Eldritch Horror, follow your master's orders.") /datum/antagonist/heretic_monster/on_removal() if(master) - to_chat(owner, "Your master is no longer [master.owner.current.real_name]") + to_chat(owner, "Your no longer bound to your master, [master.owner.current.real_name]") master = null return ..() diff --git a/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm index 92ce37df727f3..059c7567cfe4f 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm @@ -1,7 +1,7 @@ /datum/eldritch_knowledge/base_ash name = "Nightwatcher's secret" - desc = "Opens up the path of ash to you. Allows you to transmute a match with a kitchen knife or it's derivatives into an ashen blade." - gain_text = "City guard knows their watch. If you ask them at night they may tell you about the ashy lantern." + desc = "Opens up the Path of Ash to you. Allows you to transmute a match with a kitchen knife, or its derivatives, into an Ashen Blade." + gain_text = "The City Guard know their watch. If you ask them at night, they may tell you about the ashy lantern." banned_knowledge = list(/datum/eldritch_knowledge/base_rust,/datum/eldritch_knowledge/base_flesh,/datum/eldritch_knowledge/final/rust_final,/datum/eldritch_knowledge/final/flesh_final) next_knowledge = list(/datum/eldritch_knowledge/ashen_grasp) required_atoms = list(/obj/item/kitchen/knife,/obj/item/match) @@ -9,10 +9,18 @@ cost = 1 route = PATH_ASH +/datum/eldritch_knowledge/base_ash/on_gain(mob/user) + . = ..() + ADD_TRAIT( user, TRAIT_NOFIRE, MAGIC_TRAIT) + +/datum/eldritch_knowledge/base_ash/on_lose(mob/user) + . = ..() + REMOVE_TRAIT( user, TRAIT_NOFIRE, MAGIC_TRAIT) + /datum/eldritch_knowledge/spell/ashen_shift name = "Ashen Shift" - gain_text = "Ash is all the same, how can one man master it all?" - desc = "Short range jaunt that can help you escape from bad situations." + gain_text = "The Nightwatcher was the first of them, his treason started it all." + desc = "A short range jaunt that can help you escape from bad situations." cost = 1 spell_to_add = /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/ash next_knowledge = list(/datum/eldritch_knowledge/ash_mark,/datum/eldritch_knowledge/essence,/datum/eldritch_knowledge/ashen_eyes) @@ -28,70 +36,57 @@ /datum/eldritch_knowledge/ashen_grasp/on_mansus_grasp(atom/target, mob/user, proximity_flag, click_parameters) . = ..() - if(!iscarbon(target)) + var/mob/living/carbon/C = target + if(!istype(C)) return + to_chat(C, "Your eyes burn horrifically!") //pocket sand! also, this is the message that changeling blind stings use, and no, I'm not ashamed about reusing it + C.become_nearsighted(EYE_DAMAGE) + C.blind_eyes(5) + C.blur_eyes(10) + return +/datum/eldritch_knowledge/ashen_grasp/on_eldritch_blade(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!iscarbon(target)) + return var/mob/living/carbon/C = target var/datum/status_effect/eldritch/E = C.has_status_effect(/datum/status_effect/eldritch/rust) || C.has_status_effect(/datum/status_effect/eldritch/ash) || C.has_status_effect(/datum/status_effect/eldritch/flesh) if(E) - . = TRUE E.on_effect() for(var/X in user.mind.spell_list) if(!istype(X,/obj/effect/proc_holder/spell/targeted/touch/mansus_grasp)) continue var/obj/effect/proc_holder/spell/targeted/touch/mansus_grasp/MG = X MG.charge_counter = min(round(MG.charge_counter + MG.charge_max * 0.75),MG.charge_max) // refunds 75% of charge. - var/atom/throw_target = get_edge_target_turf(C, user.dir) - if(!C.anchored) - . = TRUE - C.throw_at(throw_target, rand(4,8), 14, user) - return - -/datum/eldritch_knowledge/ashen_eyes - name = "Ashen Eyes" - gain_text = "Piercing eyes may guide me through the mundane." - desc = "Allows you to craft thermal vision amulet by transmutating eyes with a glass shard." - cost = 1 - next_knowledge = list(/datum/eldritch_knowledge/spell/ashen_shift,/datum/eldritch_knowledge/flesh_ghoul) - required_atoms = list(/obj/item/organ/eyes,/obj/item/shard) - result_atoms = list(/obj/item/clothing/neck/eldritch_amulet) /datum/eldritch_knowledge/ash_mark name = "Mark of ash" - gain_text = "Spread the famine." - desc = "Your sickly blade now applies ash mark on hit. Use your mansus grasp to proc the mark. Mark of Ash causes stamina damage, and fire loss, and spreads to a nearby carbon. Damage decreases with how many times the mark has spread." + gain_text = "The Nightwatcher was a very particular man, always watching in the dead of night. But in spite of his duty, he regularly tranced through the manse with his blazing lantern held high." + desc = "Your Mansus Grasp now applies the Mark of Ash on hit. Attack the afflicted with your Sickly Blade to detonate the mark. Upon detonation, the Mark of Ash causes stamina damage and burn damage, and spreads to an additional nearby opponent. The damage decreases with each spread." cost = 2 - next_knowledge = list(/datum/eldritch_knowledge/curse/blindness) + next_knowledge = list(/datum/eldritch_knowledge/mad_mask) banned_knowledge = list(/datum/eldritch_knowledge/rust_mark,/datum/eldritch_knowledge/flesh_mark) route = PATH_ASH -/datum/eldritch_knowledge/ash_mark/on_eldritch_blade(target,user,proximity_flag,click_parameters) +/datum/eldritch_knowledge/ash_mark/on_mansus_grasp(target,user,proximity_flag,click_parameters) . = ..() if(isliving(target)) var/mob/living/living_target = target living_target.apply_status_effect(/datum/status_effect/eldritch/ash,5) -/datum/eldritch_knowledge/curse/blindness - name = "Curse of blindness" - gain_text = "Blind man walks through the world, unnoticed by the masses." - desc = "Curse someone with 2 minutes of complete blindness by sacrificing a pair of eyes, a screwdriver and a pool of blood, with an object that the victim has touched with their bare hands." - cost = 1 +/datum/eldritch_knowledge/mad_mask + name = "Mask of Madness" + gain_text = "He walks the world, unnoticed by the masses." + desc = "Allows you to transmute any mask, with a candle and a pair of eyes, to create a mask of madness, It causes passive stamina damage to everyone around the wearer and hallucinations, can be forced on a non believer to make him unable to take it off..." + result_atoms = list(/obj/item/clothing/mask/void_mask) required_atoms = list(/obj/item/organ/eyes,/obj/item/screwdriver,/obj/effect/decal/cleanable/blood) - next_knowledge = list(/datum/eldritch_knowledge/curse/corrosion,/datum/eldritch_knowledge/ash_blade_upgrade,/datum/eldritch_knowledge/curse/paralysis) - timer = 2 MINUTES + next_knowledge = list(/datum/eldritch_knowledge/guise,/datum/eldritch_knowledge/ash_blade_upgrade,/datum/eldritch_knowledge/curse/alteration) + cost = 1 route = PATH_ASH -/datum/eldritch_knowledge/curse/blindness/curse(mob/living/chosen_mob) - . = ..() - chosen_mob.become_blind(MAGIC_TRAIT) - -/datum/eldritch_knowledge/curse/blindness/uncurse(mob/living/chosen_mob) - . = ..() - chosen_mob.cure_blind(MAGIC_TRAIT) - /datum/eldritch_knowledge/spell/flame_birth name = "Flame Birth" - gain_text = "Nightwatcher was a man of principles, and yet he arose from the chaos he vowed to protect from." + gain_text = "The Nightwatcher was a man of principles, and yet his power arose from the chaos he vowed to combat." desc = "Short range spell that allows you to curse someone with massive sanity loss." cost = 1 spell_to_add = /obj/effect/proc_holder/spell/targeted/fiery_rebirth @@ -100,8 +95,8 @@ /datum/eldritch_knowledge/ash_blade_upgrade name = "Fiery blade" - gain_text = "May the sun burn the heretics." - desc = "Your blade of choice will now add firestacks." + gain_text = "Blade in hand, he swung and swung as the ash fell from the skies. His city, his people... all burnt to cinders, and yet life still remained in his charred body." + desc = "Your blade of choice will now light your enemies ablaze." cost = 2 next_knowledge = list(/datum/eldritch_knowledge/spell/flame_birth) banned_knowledge = list(/datum/eldritch_knowledge/rust_blade_upgrade,/datum/eldritch_knowledge/flesh_blade_upgrade) @@ -114,63 +109,17 @@ C.adjust_fire_stacks(1) C.IgniteMob() -/datum/eldritch_knowledge/curse/corrosion - name = "Curse of Corrosion" - gain_text = "Cursed land, cursed man, cursed mind." - desc = "Curse someone for 2 minutes of vomiting and major organ damage. Using a wirecutter, a spill of blood, a heart, left arm and a right arm, and an item that the victim touched with their bare hands." - cost = 1 - required_atoms = list(/obj/item/wirecutters,/obj/effect/decal/cleanable/blood,/obj/item/organ/heart,/obj/item/bodypart/l_arm,/obj/item/bodypart/r_arm) - next_knowledge = list(/datum/eldritch_knowledge/curse/blindness,/datum/eldritch_knowledge/spell/area_conversion) - timer = 2 MINUTES - -/datum/eldritch_knowledge/curse/corrosion/curse(mob/living/chosen_mob) - . = ..() - chosen_mob.apply_status_effect(/datum/status_effect/corrosion_curse) - -/datum/eldritch_knowledge/curse/corrosion/uncurse(mob/living/chosen_mob) - . = ..() - chosen_mob.remove_status_effect(/datum/status_effect/corrosion_curse) - -/datum/eldritch_knowledge/curse/paralysis - name = "Curse of Paralysis" - gain_text = "Corrupt their flesh, make them bleed." - desc = "Curse someone for 5 minutes of inability to walk. Using a knife, pool of blood, left leg, right leg, a hatchet and an item that the victim touched with their bare hands. " - cost = 1 - required_atoms = list(/obj/item/kitchen/knife,/obj/effect/decal/cleanable/blood,/obj/item/bodypart/l_leg,/obj/item/bodypart/r_leg,/obj/item/hatchet) - next_knowledge = list(/datum/eldritch_knowledge/curse/blindness,/datum/eldritch_knowledge/summon/raw_prophet) - timer = 5 MINUTES - -/datum/eldritch_knowledge/curse/paralysis/curse(mob/living/chosen_mob) - . = ..() - ADD_TRAIT(chosen_mob,TRAIT_PARALYSIS_L_LEG,MAGIC_TRAIT) - ADD_TRAIT(chosen_mob,TRAIT_PARALYSIS_R_LEG,MAGIC_TRAIT) - chosen_mob.update_mobility() - -/datum/eldritch_knowledge/curse/paralysis/uncurse(mob/living/chosen_mob) - . = ..() - REMOVE_TRAIT(chosen_mob,TRAIT_PARALYSIS_L_LEG,MAGIC_TRAIT) - REMOVE_TRAIT(chosen_mob,TRAIT_PARALYSIS_R_LEG,MAGIC_TRAIT) - chosen_mob.update_mobility() - -/datum/eldritch_knowledge/spell/cleave - name = "Blood Cleave" - gain_text = "At first i didn't know these instruments of war, but the priest told me to use them." - desc = "Gives AOE spell that causes heavy bleeding and blood loss." - cost = 1 - spell_to_add = /obj/effect/proc_holder/spell/pointed/cleave - next_knowledge = list(/datum/eldritch_knowledge/spell/rust_wave,/datum/eldritch_knowledge/spell/flame_birth) - /datum/eldritch_knowledge/final/ash_final name = "Ashlord's rite" - gain_text = "The forgotten lords have spoken! The lord of ash have come! Fear the fire!" - desc = "Bring 3 corpses onto a transmutation rune, you will become immune to fire ,space ,cold and other enviromental hazards and become overall sturdier to all other damages. You will gain a spell that passively creates ring of fire around you as well ,as you will gain a powerful abiltiy that let's you create a wave of flames all around you." + gain_text = "The Nightwatcher found the rite and shared it amongst mankind! For now I am one with the fire, WITNESS MY ASCENSION!" + desc = "Bring 3 corpses onto a transmutation rune, you will become immune to fire, the vacuum of space, cold and other enviromental hazards and become overall sturdier to all other damages. You will gain a spell that passively creates ring of fire around you as well ,as you will gain a powerful ability that lets you create a wave of flames all around you." required_atoms = list(/mob/living/carbon/human) cost = 3 route = PATH_ASH - var/list/trait_list = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) + var/list/trait_list = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) /datum/eldritch_knowledge/final/ash_final/on_finished_recipe(mob/living/user, list/atoms, loc) - priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Fear the blaze, for Ashbringer [user.real_name] has come! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", 'sound/ai/spanomalies.ogg') + priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Fear the blaze, for the Ashlord, [user.real_name] has ascended! The flames shall consume all! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", ANNOUNCER_SPANOMALIES) user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/fire_cascade/big) user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/fire_sworn) var/mob/living/carbon/human/H = user @@ -186,7 +135,7 @@ return var/turf/L = get_turf(user) var/datum/gas_mixture/env = L.return_air() - for(var/turf/T in range(1,user)) + for(var/turf/T as() in RANGE_TURFS(1,user)) env = T.return_air() env.set_temperature(env.return_temperature() + 5 ) T.air_update_turf() diff --git a/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm index eeeab79438e64..2225f85c2e64f 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm @@ -1,7 +1,11 @@ +#define GHOUL_MAX_HEALTH 25 +#define MUTE_MAX_HEALTH 50 +#define ORIGINAL_MAX_HEALTH 100 + /datum/eldritch_knowledge/base_flesh name = "Principle of Hunger" - desc = "Opens up the path of flesh to you. Allows you to transmute a pool of blood with a kitchen knife into a Flesh Blade" - gain_text = "Hundred's of us starved, but I.. I found the strength in my greed." + desc = "Opens up the Path of Flesh to you. Allows you to transmute a pool of blood with a kitchen knife, or its derivatives, into a Flesh Blade." + gain_text = "Hundreds of us starved, but not me... I found strength in my greed." banned_knowledge = list(/datum/eldritch_knowledge/base_ash,/datum/eldritch_knowledge/base_rust,/datum/eldritch_knowledge/final/ash_final,/datum/eldritch_knowledge/final/rust_final) next_knowledge = list(/datum/eldritch_knowledge/flesh_grasp) required_atoms = list(/obj/item/kitchen/knife,/obj/effect/decal/cleanable/blood) @@ -12,7 +16,7 @@ /datum/eldritch_knowledge/flesh_ghoul name = "Imperfect Ritual" desc = "Allows you to resurrect the dead as voiceless dead by sacrificing them on the transmutation rune with a poppy. Voiceless dead are mute and have 50 HP. You can only have 2 at a time." - gain_text = "I found notes.. notes of a ritual, it was unfinished and yet i still did it." + gain_text = "I found notes of a dark ritual, unfinished... yet still, I pushed forward." cost = 1 required_atoms = list(/mob/living/carbon/human,/obj/item/reagent_containers/food/snacks/grown/poppy) next_knowledge = list(/datum/eldritch_knowledge/flesh_mark,/datum/eldritch_knowledge/armor,/datum/eldritch_knowledge/ashen_eyes) @@ -41,7 +45,7 @@ return var/mob/dead/observer/C = pick(candidates) message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(humie)]) to replace an AFK player.") - humie.ghostize(0) + humie.ghostize(FALSE,SENTIENCE_ERASE) humie.key = C.key log_game("[key_name_admin(humie)] has become a voiceless dead, their master is [user.real_name]") @@ -52,10 +56,11 @@ ADD_TRAIT(humie, TRAIT_IGNOREDAMAGESLOWDOWN, MAGIC_TRAIT) ADD_TRAIT(humie, TRAIT_NOSTAMCRIT, MAGIC_TRAIT) ADD_TRAIT(humie, TRAIT_NOLIMBDISABLE, MAGIC_TRAIT) - humie.setMaxHealth(50) - humie.health = 50 // Voiceless dead are much tougher than ghouls + humie.setMaxHealth(MUTE_MAX_HEALTH) + humie.health = MUTE_MAX_HEALTH // Voiceless dead are much tougher than ghouls humie.become_husk() humie.faction |= "heretics" + humie.apply_status_effect(/datum/status_effect/ghoul) var/datum/antagonist/heretic_monster/heretic_monster = humie.mind.add_antag_datum(/datum/antagonist/heretic_monster) var/datum/antagonist/heretic/master = user.mind.has_antag_datum(/datum/antagonist/heretic) @@ -65,15 +70,19 @@ ghouls += humie /datum/eldritch_knowledge/flesh_ghoul/proc/remove_ghoul(datum/source) + SIGNAL_HANDLER + var/mob/living/carbon/human/humie = source ghouls -= humie + humie.setMaxHealth(ORIGINAL_MAX_HEALTH) + humie.remove_status_effect(/datum/status_effect/ghoul) humie.mind.remove_antag_datum(/datum/antagonist/heretic_monster) UnregisterSignal(source,COMSIG_MOB_DEATH) /datum/eldritch_knowledge/flesh_grasp name = "Grasp of Flesh" - gain_text = "My new found desire, it drove me to do great things! The Priest said." - desc = "Empowers your mansus grasp to be able to create a single ghoul out of a dead person. Ghouls have only 25 HP and look like husks." + gain_text = "My new found desires drove me to greater and greater heights." + desc = "Empowers your mansus grasp to be able to create a single ghoul out of a dead person. Ghouls have only 25 HP and look like husks to the heathens' eyes." cost = 1 next_knowledge = list(/datum/eldritch_knowledge/flesh_ghoul) var/ghoul_amt = 1 @@ -85,13 +94,6 @@ if(!ishuman(target) || target == user) return var/mob/living/carbon/human/human_target = target - var/datum/status_effect/eldritch/eldritch_effect = human_target.has_status_effect(/datum/status_effect/eldritch/rust) || human_target.has_status_effect(/datum/status_effect/eldritch/ash) || human_target.has_status_effect(/datum/status_effect/eldritch/flesh) - if(eldritch_effect) - . = TRUE - eldritch_effect.on_effect() - if(ishuman(target)) - var/mob/living/carbon/human/htarget = target - htarget.bleed_rate += 10 if(QDELETED(human_target) || human_target.stat != DEAD) return @@ -114,34 +116,48 @@ log_game("[key_name_admin(human_target)] has become a ghoul, their master is [user.real_name]") //we change it to true only after we know they passed all the checks . = TRUE - RegisterSignal(human_target,COMSIG_MOB_DEATH,.proc/remove_ghoul) + RegisterSignal(human_target,COMSIG_MOB_DEATH, .proc/remove_ghoul) human_target.revive(full_heal = TRUE, admin_revive = TRUE) ADD_TRAIT(human_target, TRAIT_NOSTAMCRIT, MAGIC_TRAIT) ADD_TRAIT(human_target, TRAIT_NOLIMBDISABLE, MAGIC_TRAIT) - human_target.setMaxHealth(25) - human_target.health = 25 + human_target.setMaxHealth(GHOUL_MAX_HEALTH) + human_target.health = GHOUL_MAX_HEALTH human_target.become_husk() + human_target.apply_status_effect(/datum/status_effect/ghoul) human_target.faction |= "heretics" var/datum/antagonist/heretic_monster/heretic_monster = human_target.mind.add_antag_datum(/datum/antagonist/heretic_monster) var/datum/antagonist/heretic/master = user.mind.has_antag_datum(/datum/antagonist/heretic) heretic_monster.set_owner(master) /datum/eldritch_knowledge/flesh_grasp/proc/remove_ghoul(datum/source) + SIGNAL_HANDLER + var/mob/living/carbon/human/humie = source spooky_scaries -= humie + humie.setMaxHealth(ORIGINAL_MAX_HEALTH) + humie.remove_status_effect(/datum/status_effect/ghoul) humie.mind.remove_antag_datum(/datum/antagonist/heretic_monster) UnregisterSignal(source, COMSIG_MOB_DEATH) +/datum/eldritch_knowledge/flesh_grasp/on_eldritch_blade(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!ishuman(target)) + return + var/mob/living/carbon/C = target + var/datum/status_effect/eldritch/E = C.has_status_effect(/datum/status_effect/eldritch/rust) || C.has_status_effect(/datum/status_effect/eldritch/ash) || C.has_status_effect(/datum/status_effect/eldritch/flesh) + if(E) + E.on_effect() + /datum/eldritch_knowledge/flesh_mark - name = "Mark of flesh" - gain_text = "I saw them, the marked ones. The screams.. the silence." - desc = "Your sickly blade now applies mark of flesh status effect. To proc the mark, use your mansus grasp on the marked. Mark of flesh when procced causeds additional bleeding." + name = "Mark of Flesh" + gain_text = "I saw them, the marked ones. The screams... the silence." + desc = "Your Mansus Grasp now applies the Mark of Flesh on hit. Attack the afflicted with your Sickly Blade to detonate the mark. Upon detonation, the Mark of Flesh causes additional bleeding." cost = 2 next_knowledge = list(/datum/eldritch_knowledge/summon/raw_prophet) banned_knowledge = list(/datum/eldritch_knowledge/rust_mark,/datum/eldritch_knowledge/ash_mark) route = PATH_FLESH -/datum/eldritch_knowledge/flesh_mark/on_eldritch_blade(target,user,proximity_flag,click_parameters) +/datum/eldritch_knowledge/flesh_mark/on_mansus_grasp(target,user,proximity_flag,click_parameters) . = ..() if(isliving(target)) var/mob/living/living_target = target @@ -149,8 +165,8 @@ /datum/eldritch_knowledge/flesh_blade_upgrade name = "Bleeding Steel" - gain_text = "It rained blood, that's when i understood the gravekeeper's advice." - desc = "Your blade will now cause additional bleeding." + gain_text = "And then, blood rained from the heavens. That's when I finally understood the Marshal's teachings." + desc = "Your Sickly Blade will now cause additional bleeding." cost = 2 next_knowledge = list(/datum/eldritch_knowledge/summon/stalker) banned_knowledge = list(/datum/eldritch_knowledge/ash_blade_upgrade,/datum/eldritch_knowledge/rust_blade_upgrade) @@ -162,53 +178,26 @@ var/mob/living/carbon/human/H = target H.bleed_rate+= 2 - /datum/eldritch_knowledge/summon/raw_prophet name = "Raw Ritual" - gain_text = "Uncanny man, walks alone in the valley, I was able to call his aid." - desc = "You can now summon a Raw Prophet using eyes, a left arm, right arm and a pool of blood. Raw prophets have increased seeing range, as well as Xray. But are very fragile and weak." + gain_text = "The Uncanny Man, who walks alone in the valley between the worlds... I was able to summon his aid." + desc = "You can now summon a Raw Prophet by transmutating a pair of eyes, a left arm and a pool of blood. Raw prophets have increased seeing range, as well as X-Ray vision, but they are very fragile." cost = 1 required_atoms = list(/obj/item/organ/eyes,/obj/item/bodypart/l_arm,/obj/item/bodypart/r_arm,/obj/effect/decal/cleanable/blood) mob_to_summon = /mob/living/simple_animal/hostile/eldritch/raw_prophet - next_knowledge = list(/datum/eldritch_knowledge/flesh_blade_upgrade,/datum/eldritch_knowledge/spell/blood_siphon,/datum/eldritch_knowledge/curse/paralysis) + next_knowledge = list(/datum/eldritch_knowledge/flesh_blade_upgrade,/datum/eldritch_knowledge/spell/blood_siphon,/datum/eldritch_knowledge/curse/alteration) route = PATH_FLESH /datum/eldritch_knowledge/summon/stalker name = "Lonely Ritual" - gain_text = "I was able to combine my greed and desires to summon an eldritch beast i have not seen before." - desc = "You can now summon a Stalker using a knife, a flower, a pen and a piece of paper. Stalkers can shapeshift into harmeless animals and get close to the victim." + gain_text = "I was able to combine my greed and desires to summon an eldritch beast I had never seen before. An ever shapeshifting mass of flesh, it knew well my goals." + desc = "You can now summon a Stalker by transmutating a pair of eyes, a candle, a pen and a piece of paper. Stalkers can shapeshift into harmless animals to get close to the victim." cost = 1 required_atoms = list(/obj/item/kitchen/knife,/obj/item/reagent_containers/food/snacks/grown/poppy,/obj/item/pen,/obj/item/paper) mob_to_summon = /mob/living/simple_animal/hostile/eldritch/stalker next_knowledge = list(/datum/eldritch_knowledge/summon/ashy,/datum/eldritch_knowledge/summon/rusty,/datum/eldritch_knowledge/final/flesh_final) route = PATH_FLESH -/datum/eldritch_knowledge/summon/ashy - name = "Ashen Ritual" - gain_text = "I combined principle of hunger with desire of destruction. The eyeful lords have noticed me." - desc = "You can now summon an Ash Man by transmutating a pile of ash , a head and a book." - cost = 1 - required_atoms = list(/obj/effect/decal/cleanable/ash,/obj/item/bodypart/head,/obj/item/book) - mob_to_summon = /mob/living/simple_animal/hostile/eldritch/ash_spirit - next_knowledge = list(/datum/eldritch_knowledge/summon/stalker,/datum/eldritch_knowledge/spell/rust_wave) - -/datum/eldritch_knowledge/summon/rusty - name = "Rusted Ritual" - gain_text = "I combined principle of hunger with desire of corruption. The rusted hills call my name." - desc = "You can now summon a Rust Walker transmutating vomit pool, a head and a book." - cost = 1 - required_atoms = list(/obj/effect/decal/cleanable/vomit,/obj/item/bodypart/head,/obj/item/book) - mob_to_summon = /mob/living/simple_animal/hostile/eldritch/rust_spirit - next_knowledge = list(/datum/eldritch_knowledge/summon/stalker,/datum/eldritch_knowledge/spell/flame_birth) - -/datum/eldritch_knowledge/spell/blood_siphon - name = "Blood Siphon" - gain_text = "Our blood is all the same after all, the owl told me." - desc = "You gain a spell that drains enemies health and restores yours." - cost = 1 - spell_to_add = /obj/effect/proc_holder/spell/targeted/touch/blood_siphon - next_knowledge = list(/datum/eldritch_knowledge/summon/raw_prophet,/datum/eldritch_knowledge/spell/area_conversion) - /datum/eldritch_knowledge/final/flesh_final name = "Priest's Final Hymn" gain_text = "Man of this world. Hear me! For the time of the lord of arms has come! Emperor of Flesh guides my army!" @@ -219,7 +208,7 @@ /datum/eldritch_knowledge/final/flesh_final/on_finished_recipe(mob/living/user, list/atoms, loc) . = ..() - priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Ever coiling vortex, Reality unfoiled. KING OF ARMS [user.real_name] has come! Fear the ever twisting hand! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", 'sound/ai/spanomalies.ogg') + priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Ever coiling vortex. Reality unfolded. THE LORD OF ARMS, [user.real_name] has ascended! Fear the ever twisting hand! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", ANNOUNCER_SPANOMALIES) user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shed_human_form) if(!ishuman(user)) return @@ -231,3 +220,7 @@ ghoul1.ghoul_amt *= 3 var/datum/eldritch_knowledge/flesh_ghoul/ghoul2 = heretic.get_knowledge(/datum/eldritch_knowledge/flesh_ghoul) ghoul2.max_amt *= 3 + +#undef GHOUL_MAX_HEALTH +#undef MUTE_MAX_HEALTH +#undef ORIGINAL_MAX_HEALTH diff --git a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm index 6440f7cc1e9a2..7f079ca7e44ea 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm @@ -1,7 +1,7 @@ /datum/eldritch_knowledge/base_rust name = "Blacksmith's Tale" - desc = "Opens up the path of rust to you. Allows you to transmute a knife with any trash item into a Rusty Blade." - gain_text = "Let me tell you a story, blacksmith said as he glazed into his rusty blade." + desc = "Opens up the Path of Rust to you. Allows you to transmute a kitchen knife, or its derivatives, with any trash item into a Rusty Blade." + gain_text = "'Let me tell you a story', said the Blacksmith, as he gazed deep into his rusty blade." banned_knowledge = list(/datum/eldritch_knowledge/base_ash,/datum/eldritch_knowledge/base_flesh,/datum/eldritch_knowledge/final/ash_final,/datum/eldritch_knowledge/final/flesh_final) next_knowledge = list(/datum/eldritch_knowledge/rust_fist) required_atoms = list(/obj/item/kitchen/knife,/obj/item/trash) @@ -10,9 +10,9 @@ route = PATH_RUST /datum/eldritch_knowledge/rust_fist - name = "Grasp of rust" - desc = "Empowers your mansus grasp to deal 500 damage to non-living matter and rust any turf it touches. Destroys already rusted turfs." - gain_text = "Rust grows on the ceiling of the mansus." + name = "Grasp of Rust" + desc = "Empowers your Mansus Grasp to deal 500 damage to non-living matter and rust any surface it touches. Already rusted surfaces are destroyed." + gain_text = "On the ceiling of the Mansus, rust grows as moss does on a stone." cost = 1 next_knowledge = list(/datum/eldritch_knowledge/rust_regen) var/rust_force = 500 @@ -21,54 +21,57 @@ /datum/eldritch_knowledge/rust_fist/on_mansus_grasp(atom/target, mob/user, proximity_flag, click_parameters) . = ..() + target.rust_heretic_act() + return TRUE + +/datum/eldritch_knowledge/rust_fist/on_eldritch_blade(atom/target, mob/user, proximity_flag, click_parameters) if(ishuman(target)) var/mob/living/carbon/human/H = target var/datum/status_effect/eldritch/E = H.has_status_effect(/datum/status_effect/eldritch/rust) || H.has_status_effect(/datum/status_effect/eldritch/ash) || H.has_status_effect(/datum/status_effect/eldritch/flesh) if(E) E.on_effect() H.adjustOrganLoss(pick(ORGAN_SLOT_BRAIN,ORGAN_SLOT_EARS,ORGAN_SLOT_EYES,ORGAN_SLOT_LIVER,ORGAN_SLOT_LUNGS,ORGAN_SLOT_STOMACH,ORGAN_SLOT_HEART),25) - target.rust_heretic_act() - return TRUE /datum/eldritch_knowledge/spell/area_conversion name = "Agressive Spread" - desc = "Spreads rust to nearby turfs. Destroys already rusted walls." - gain_text = "All men wise know not to touch the bound king." + desc = "Spreads rust to nearby surfaces. Already rusted surfaces are destroyed." + gain_text = "All wise men know well not to touch the Bound King." cost = 1 spell_to_add = /obj/effect/proc_holder/spell/aoe_turf/rust_conversion - next_knowledge = list(/datum/eldritch_knowledge/rust_blade_upgrade,/datum/eldritch_knowledge/curse/corrosion,/datum/eldritch_knowledge/spell/blood_siphon) + next_knowledge = list(/datum/eldritch_knowledge/rust_blade_upgrade,/datum/eldritch_knowledge/guise,/datum/eldritch_knowledge/spell/blood_siphon) route = PATH_RUST /datum/eldritch_knowledge/rust_regen name = "Leeching Walk" desc = "Passively heals you when you are on rusted tiles." - gain_text = "The strength was unparallel, it was unnatural. Blacksmith was smiling." + gain_text = "The strength was unparalleled, unnatural. The Blacksmith was smiling." cost = 1 next_knowledge = list(/datum/eldritch_knowledge/rust_mark,/datum/eldritch_knowledge/armor,/datum/eldritch_knowledge/essence) route = PATH_RUST /datum/eldritch_knowledge/rust_regen/on_life(mob/user) - . = ..() + ..() var/turf/user_loc_turf = get_turf(user) if(!istype(user_loc_turf, /turf/open/floor/plating/rust) || !isliving(user)) return var/mob/living/living_user = user living_user.adjustBruteLoss(-2, FALSE) living_user.adjustFireLoss(-2, FALSE) - living_user.adjustToxLoss(-2, FALSE) + living_user.adjustToxLoss(-2, FALSE, TRUE) living_user.adjustOxyLoss(-0.5, FALSE) living_user.adjustStaminaLoss(-2) + living_user.AdjustAllImmobility(-5) /datum/eldritch_knowledge/rust_mark name = "Mark of Rust" - desc = "Your eldritch blade now applies a rust mark. Rust mark has a chance to deal between 0 to 200 damage to 75% of enemies items. To Detonate the mark use your mansus grasp on it." - gain_text = "Lords of the depths help those in dire need at a cost." + desc = "Your Mansus Grasp now applies the Mark of Rust on hit. Attack the afflicted with your Sickly Blade to detonate the mark. Upon detonation, the Mark of Rust has a chance to deal between 0 to 200 damage to 75% of your enemy's held items." + gain_text = "Rusted Hills help those in dire need at a cost." cost = 2 next_knowledge = list(/datum/eldritch_knowledge/spell/area_conversion) banned_knowledge = list(/datum/eldritch_knowledge/ash_mark,/datum/eldritch_knowledge/flesh_mark) route = PATH_RUST -/datum/eldritch_knowledge/rust_mark/on_eldritch_blade(target,user,proximity_flag,click_parameters) +/datum/eldritch_knowledge/rust_mark/on_mansus_grasp(target,user,proximity_flag,click_parameters) . = ..() if(isliving(target)) var/mob/living/living_target = target @@ -76,8 +79,9 @@ /datum/eldritch_knowledge/rust_blade_upgrade name = "Toxic blade" - gain_text = "Let the blade guide you through the flesh." - desc = "Your blade of choice will now add toxin to enemies bloodstream." + desc = "Your blade of choice will now poison your enemies on hit." + gain_text = "The Blade will guide you through the flesh, should you let it." + desc = "Your blade of choice will now transfer your pain as toxic damage." cost = 2 next_knowledge = list(/datum/eldritch_knowledge/spell/rust_wave) banned_knowledge = list(/datum/eldritch_knowledge/ash_blade_upgrade,/datum/eldritch_knowledge/flesh_blade_upgrade) @@ -85,9 +89,10 @@ /datum/eldritch_knowledge/rust_blade_upgrade/on_eldritch_blade(target,user,proximity_flag,click_parameters) . = ..() - if(iscarbon(target)) - var/mob/living/carbon/carbon_target = target - carbon_target.reagents.add_reagent(/datum/reagent/eldritch, 2) + var/mob/living/carbon/carbon_user = user + var/mob/living/carbon/carbon_target = target + if(istype(carbon_user) && istype(carbon_target)) + carbon_target.adjustToxLoss((carbon_user.maxHealth - carbon_user.health)/10) /datum/eldritch_knowledge/spell/rust_wave name = "Wave of Rust" @@ -98,37 +103,22 @@ next_knowledge = list(/datum/eldritch_knowledge/final/rust_final,/datum/eldritch_knowledge/spell/cleave,/datum/eldritch_knowledge/summon/rusty) route = PATH_RUST -/datum/eldritch_knowledge/armor - name = "Armorer's ritual" - desc = "You can now create eldritch armor using a table and a gas mask." - gain_text = "For I am the heir to the throne of doom." - cost = 1 - next_knowledge = list(/datum/eldritch_knowledge/rust_regen,/datum/eldritch_knowledge/flesh_ghoul) - required_atoms = list(/obj/structure/table,/obj/item/clothing/mask/gas) - result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch) - -/datum/eldritch_knowledge/essence - name = "Priest's ritual" - desc = "You can now transmute a tank of water into a bottle of eldritch water." - gain_text = "This is an old recipe, i got it from an owl." - cost = 1 - next_knowledge = list(/datum/eldritch_knowledge/rust_regen,/datum/eldritch_knowledge/spell/ashen_shift) - required_atoms = list(/obj/structure/reagent_dispensers/watertank) - result_atoms = list(/obj/item/reagent_containers/glass/beaker/eldritch) - /datum/eldritch_knowledge/final/rust_final name = "Rustbringer's Oath" - desc = "Bring 3 corpses onto the transmutation rune. After you finish the ritual rust will now automatically spread from the rune. Your healing on rust is also tripled, while you become more resillient overall." + desc = "Bring 3 corpses onto the transmutation rune. After you finish the ritual rust will now automatically spread from the rune. Your healing on rust is also tripled, while you become more resillient overall and space proof." gain_text = "Champion of rust. Corruptor of steel. Fear the dark for Rustbringer has come!" cost = 3 required_atoms = list(/mob/living/carbon/human) route = PATH_RUST + var/list/trait_list = list(TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTLOWPRESSURE,TRAIT_NODISMEMBER) /datum/eldritch_knowledge/final/rust_final/on_finished_recipe(mob/living/user, list/atoms, loc) var/mob/living/carbon/human/H = user H.physiology.brute_mod *= 0.5 H.physiology.burn_mod *= 0.5 - priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Fear the decay, for Rustbringer [user.real_name] has come! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", 'sound/ai/spanomalies.ogg') + for(var/X in trait_list) + ADD_TRAIT(user,X,MAGIC_TRAIT) + priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Fear the decay, for the Rustbringer, [user.real_name] has ascended! None shall escape the corrosion! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", ANNOUNCER_SPANOMALIES) new /datum/rust_spread(loc) return ..() @@ -138,32 +128,33 @@ if(!finished) return var/mob/living/carbon/human/human_user = user - human_user.adjustBruteLoss(-3, FALSE) - human_user.adjustFireLoss(-3, FALSE) - human_user.adjustToxLoss(-3, FALSE) - human_user.adjustOxyLoss(-1, FALSE) - human_user.adjustStaminaLoss(-10) - + human_user.adjustBruteLoss(-4, FALSE) + human_user.adjustFireLoss(-4, FALSE) + human_user.adjustToxLoss(-4, FALSE, TRUE) + human_user.adjustOxyLoss(-2, FALSE) + human_user.adjustStaminaLoss(-20) + human_user.AdjustAllImmobility(-10) /** - * #Rust spread datum - * - * Simple datum that automatically spreads rust around it - * - * Simple implementation of automatically growing entity - */ + * #Rust spread datum + * + * Simple datum that automatically spreads rust around it + * + * Simple implementation of automatically growing entity + */ /datum/rust_spread var/list/edge_turfs = list() + var/turf/centre var/list/turfs = list() var/static/list/blacklisted_turfs = typecacheof(list(/turf/open/indestructible,/turf/closed/indestructible,/turf/open/space,/turf/open/lava,/turf/open/chasm)) - var/spread_per_tick = 6 + var/spread_per_sec = 6 /datum/rust_spread/New(loc) . = ..() - var/turf/turf_loc = get_turf(loc) - turf_loc.rust_heretic_act() - turfs += turf_loc + centre = get_turf(loc) + centre.rust_heretic_act() + turfs += centre START_PROCESSING(SSprocessing,src) @@ -171,28 +162,39 @@ STOP_PROCESSING(SSprocessing,src) return ..() -/datum/rust_spread/process() - compile_turfs() +/datum/rust_spread/process(delta_time) + var/spread_am = round(spread_per_sec * delta_time) + + if(edge_turfs.len < spread_am) + compile_turfs() + var/turf/T - for(var/i in 0 to spread_per_tick) + for(var/i in 0 to spread_am) + if(!edge_turfs.len) + continue T = pick(edge_turfs) + edge_turfs -= T T.rust_heretic_act() - turfs += get_turf(T) + turfs += T /** - * Compile turfs - * - * Recreates all edge_turfs as well as normal turfs. - */ + * Compile turfs + * + * Recreates all edge_turfs as well as normal turfs. + */ /datum/rust_spread/proc/compile_turfs() edge_turfs = list() - for(var/X in turfs) - if(!istype(X,/turf/closed/wall/rust) && !istype(X,/turf/closed/wall/r_wall/rust) && !istype(X,/turf/open/floor/plating/rust)) - turfs -=X + var/list/removal_list = list() + var/max_dist = 1 + for(var/turfie in turfs) + if(!istype(turfie,/turf/closed/wall/rust) && !istype(turfie,/turf/closed/wall/r_wall/rust) && !istype(turfie,/turf/open/floor/plating/rust)) + removal_list += turfie + max_dist = max(max_dist,get_dist(turfie,centre)+1) + turfs -= removal_list + for(var/turfie in spiral_range_turfs(max_dist,centre,FALSE)) + if(turfie in turfs || is_type_in_typecache(turfie,blacklisted_turfs)) continue - for(var/turf/T in range(1,X)) - if(T in turfs) - continue - if(is_type_in_typecache(T,blacklisted_turfs)) - continue - edge_turfs += T + for(var/line_turfie_owo in getline(turfie,centre)) + if(get_dist(turfie,line_turfie_owo) <= 1) + edge_turfs += turfie + CHECK_TICK diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index b211016c16e88..a0f0cd9324999 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -2,25 +2,32 @@ /datum/team/ert name = "Emergency Response Team" var/datum/objective/mission //main mission + var/ert_frequency + +/datum/team/ert/New(starting_members) + . = ..() + ert_frequency = get_free_team_frequency("cent") /datum/antagonist/ert name = "Emergency Response Officer" var/datum/team/ert/ert_team var/leader = FALSE var/datum/outfit/outfit = /datum/outfit/ert/security + var/datum/outfit/plasmaman_outfit = /datum/outfit/plasmaman/ert var/role = "Security Officer" var/list/name_source var/random_names = TRUE + can_elimination_hijack = ELIMINATION_PREVENT show_in_antagpanel = FALSE show_to_ghosts = TRUE antag_moodlet = /datum/mood_event/focused - can_hijack = HIJACK_PREVENT /datum/antagonist/ert/on_gain() if(random_names) update_name() forge_objectives() equipERT() + owner.store_memory("Your team's shared tracking beacon frequency is [ert_team.ert_frequency].") . = ..() /datum/antagonist/ert/get_team() @@ -77,13 +84,22 @@ name = "Deathsquad Trooper" outfit = /datum/outfit/death_commando role = "Trooper" + plasmaman_outfit = /datum/outfit/plasmaman/death_commando /datum/antagonist/ert/medic/inquisitor outfit = /datum/outfit/ert/medic/inquisitor +/datum/antagonist/ert/medic/inquisitor/on_gain() + . = ..() + owner.holy_role = HOLY_ROLE_PRIEST + /datum/antagonist/ert/security/inquisitor outfit = /datum/outfit/ert/security/inquisitor +/datum/antagonist/ert/security/inquisitor/on_gain() + . = ..() + owner.holy_role = HOLY_ROLE_PRIEST + /datum/antagonist/ert/chaplain role = "Chaplain" outfit = /datum/outfit/ert/chaplain @@ -93,14 +109,14 @@ /datum/antagonist/ert/chaplain/on_gain() . = ..() - owner.isholy = TRUE + owner.holy_role = HOLY_ROLE_PRIEST /datum/antagonist/ert/commander/inquisitor outfit = /datum/outfit/ert/commander/inquisitor /datum/antagonist/ert/commander/inquisitor/on_gain() . = ..() - owner.isholy = TRUE + owner.holy_role = HOLY_ROLE_PRIEST /datum/antagonist/ert/janitor role = "Janitor" @@ -110,6 +126,10 @@ role = "Heavy Duty Janitor" outfit = /datum/outfit/ert/janitor/heavy +/datum/antagonist/ert/kudzu + role = "Weed Whacker" + outfit = /datum/outfit/ert/kudzu + /datum/antagonist/ert/deathsquad/leader name = "Deathsquad Officer" outfit = /datum/outfit/death_commando/officer @@ -120,6 +140,7 @@ outfit = /datum/outfit/centcom_intern random_names = FALSE role = "Intern" + plasmaman_outfit = /datum/outfit/plasmaman/intern /datum/antagonist/ert/intern/leader name = "CentCom Head Intern" @@ -136,11 +157,13 @@ name = "Comedy Response Officer" outfit = /datum/outfit/centcom_clown role = "Prankster" + plasmaman_outfit = /datum/outfit/plasmaman/honk /datum/antagonist/ert/clown/honk name = "HONK Squad Trooper" outfit = /datum/outfit/centcom_clown/honk_squad role = "HONKER" + plasmaman_outfit = /datum/outfit/plasmaman/honk_squad /datum/antagonist/ert/create_team(datum/team/ert/new_team) if(istype(new_team)) @@ -154,7 +177,18 @@ var/mob/living/carbon/human/H = owner.current if(!istype(H)) return + if(isplasmaman(H)) + H.equipOutfit(plasmaman_outfit) + H.internal = H.get_item_for_held_index(2) + H.update_internals_hud_icon(1) H.equipOutfit(outfit) + //Set the suits frequency + var/obj/item/I = H.get_item_by_slot(ITEM_SLOT_OCLOTHING) + if(I) + var/datum/component/tracking_beacon/beacon = I.GetComponent(/datum/component/tracking_beacon) + if(beacon) + beacon.set_frequency(ert_team.ert_frequency) + /datum/antagonist/ert/greet() if(!ert_team) @@ -171,6 +205,8 @@ missiondesc += "Avoid civilian casualites when possible." missiondesc += "
Your Mission : [ert_team.mission.explanation_text]" + missiondesc += "
Your Shared Tracking Frequency : [ert_team.ert_frequency]" + to_chat(owner,missiondesc) /datum/antagonist/ert/deathsquad/greet() @@ -218,4 +254,4 @@ missiondesc += " Slip as many civilians as possible." missiondesc += "
Your Mission : [ert_team.mission.explanation_text]" - to_chat(owner,missiondesc) \ No newline at end of file + to_chat(owner,missiondesc) diff --git a/code/modules/antagonists/fugitive/fugitive.dm b/code/modules/antagonists/fugitive/fugitive.dm index 4e311b4c0634d..1208ad6817d55 100644 --- a/code/modules/antagonists/fugitive/fugitive.dm +++ b/code/modules/antagonists/fugitive/fugitive.dm @@ -35,7 +35,7 @@ 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.") + 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.") diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm index 9ad730f7c6a56..bbeb0b90254f9 100644 --- a/code/modules/antagonists/fugitive/fugitive_outfits.dm +++ b/code/modules/antagonists/fugitive/fugitive_outfits.dm @@ -41,11 +41,11 @@ 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(SLOT_SHOES) - no_drops += H.get_item_by_slot(SLOT_W_UNIFORM) - no_drops += H.get_item_by_slot(SLOT_WEAR_SUIT) - no_drops += H.get_item_by_slot(SLOT_HEAD) - no_drops += H.get_item_by_slot(SLOT_GLASSES) + 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 ADD_TRAIT(I, TRAIT_NODROP, CURSED_ITEM_TRAIT) @@ -59,7 +59,7 @@ if(visualsOnly) return var/obj/item/organ/eyes/robotic/glow/eyes = new() - eyes.Insert(src, drop_if_replaced = FALSE) + eyes.Insert(H, drop_if_replaced = FALSE) /datum/outfit/spacepol name = "Spacepol Officer" @@ -132,14 +132,6 @@ /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 @@ -156,15 +148,3 @@ 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 index dfdf40f261247..56b0b67a8ed89 100644 --- a/code/modules/antagonists/fugitive/fugitive_ship.dm +++ b/code/modules/antagonists/fugitive/fugitive_ship.dm @@ -32,21 +32,11 @@ 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 +/obj/machinery/computer/shuttle_flight/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" diff --git a/code/modules/antagonists/gang/gang.dm b/code/modules/antagonists/gang/gang.dm index 9691c2baee22f..10ea21f54944f 100644 --- a/code/modules/antagonists/gang/gang.dm +++ b/code/modules/antagonists/gang/gang.dm @@ -27,6 +27,8 @@ /datum/antagonist/gang/greet() gang.greet_gangster(owner) + owner.current.client?.tgui_panel?.give_antagonist_popup("Gangster", + "You rule the streets, assist your gang in taking over the station.") /datum/antagonist/gang/farewell() if(ishuman(owner.current)) @@ -103,8 +105,6 @@ . = ..() .["Promote"] = CALLBACK(src,.proc/admin_promote) .["Set Influence"] = CALLBACK(src, .proc/admin_adjust_influence) - if(gang.domination_time != NOT_DOMINATING) - .["Set domination time left"] = CALLBACK(src, .proc/set_dom_time_left) /datum/antagonist/gang/admin_add(datum/mind/new_owner,mob/admin) var/new_or_existing = input(admin, "Which gang do you want to be assigned to the user?", "Gangs") as null|anything in list("New","Existing") @@ -154,14 +154,6 @@ gang.remove_member(owner) owner.current.log_message("Has been deconverted from the [gang.name] gang!", INDIVIDUAL_ATTACK_LOG) -/datum/antagonist/gang/proc/set_dom_time_left(mob/admin) - if(gang.domination_time == NOT_DOMINATING) - return // an admin shouldn't need this - var/seconds = input(admin, "Set the time left for the gang to win, in seconds", "Domination time left") as null|num - if(seconds && seconds > 0) - gang.domination_time = world.time + seconds*10 - gang.message_gangtools("Takeover shortened to [gang.domination_time_remaining()] seconds by your Syndicate benefactors.") - // Boss type. Those can use gang tools to buy items for their gang, in particular the Dominator, used to win the gamemode, along with more gang tools to promote fellow gangsters to boss status. /datum/antagonist/gang/boss name = "Gang boss" @@ -187,10 +179,10 @@ return var/list/slots = list ( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE, - "hands" = SLOT_HANDS + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET, + "hands" = ITEM_SLOT_HANDS ) if(gangtool) @@ -279,8 +271,11 @@ name = "Gang Lieutenant" message_name = "Lieutenant" +#define INFLUENCE_SWAG 2 +#define INFLUENCE_TERRITORY 0 +#define INFLUENCE_BASE 20 -#define MAXIMUM_RECALLS 3 +#define MAXIMUM_RECALLS 1 #define INFLUENCE_INTERVAL 1800 // Gang team datum. This handles the gang itself. /datum/team/gang @@ -293,15 +288,15 @@ var/list/lost_territories = list() // territories lost by the gang. var/list/new_territories = list() // territories captured by the gang. var/list/gangtools = list() - var/domination_time = NOT_DOMINATING - var/dom_attempts = INITIAL_DOM_ATTEMPTS var/color + var/winner = FALSE //winner winner chicken dinner var/influence = 0 // influence of the gang, based on how many territories they own. Can be used to buy weapons and tools from a gang uplink. - var/winner // Once the gang wins with a dominator, this becomes true. For roundend credits purposes. - var/list/inner_outfits = list() - var/list/outer_outfits = list() + var/victory_points = 0 // influence earned throughout the round, used at eotg to calculate most efficient gang var/next_point_time var/recalls = MAXIMUM_RECALLS // Once this reaches 0, this gang cannot force recall the shuttle with their gangtool anymore + var/obj/item/clothing/head/hat + var/obj/item/clothing/under/outfit + var/obj/item/clothing/suit/suit /datum/team/gang/New(starting_members) . = ..() @@ -343,14 +338,14 @@ return "
[report.Join("
")]
" -/datum/team/gang/proc/greet_gangster(datum/mind/gangster) +/datum/team/gang/proc/greet_gangster(datum/mind/gangster)//THIS NEEDS REVISION to_chat(gangster, "You are now a member of the [name] Gang!") to_chat(gangster, "Help your bosses take over the station by claiming territory with special spraycans only they can provide. Simply spray on any unclaimed area of the station.") - to_chat(gangster, "Their ultimate objective is to take over the station with a Dominator machine.") + to_chat(gangster, "Your objective is to take over as many territories as possible, and expand the influence of your gang.") to_chat(gangster, "You can identify your mates by their large, bright \[G\] icon.") gangster.store_memory("You are a member of the [name] Gang!") -/datum/team/gang/proc/handle_territories() +/datum/team/gang/proc/handle_territories() //influence is counted here next_point_time = world.time + INFLUENCE_INTERVAL if(!leaders.len) return @@ -388,20 +383,16 @@ lost_territories = list() var/total_territories = total_claimable_territories() var/control = round((territories.len/total_territories)*100, 1) - var/uniformed = check_clothing() + var/uniformed = count_gang_swag() message += "Your gang now has [control]% control of the station.
*---------*
" - if(domination_time != NOT_DOMINATING) - var/new_time = max(world.time, domination_time - (uniformed * 4) - (territories.len * 2)) - if(new_time < domination_time) - message += "Takeover shortened by [(domination_time - new_time)*0.1] seconds for defending [territories.len] territories.
" - domination_time = new_time - message += "[domination_time_remaining()] seconds remain in hostile takeover.
" - else - var/new_influence = check_territory_income() - if(new_influence != influence) - message += "Gang influence has increased by [new_influence - influence] for defending [territories.len] territories and [uniformed] uniformed gangsters.
" - influence = new_influence - message += "Your gang now has [influence] influence.
" + + var/new_influence = update_influence() + influence = min(999,influence+new_influence) + victory_points += new_influence + if(new_influence > 0) + message += "Gang influence has increased by [new_influence] for defending [territories.len] territories and [uniformed] swag.
" + message += "Your gang now has [influence] influence.
" + message_gangtools(message) addtimer(CALLBACK(src, .proc/handle_territories), INFLUENCE_INTERVAL) @@ -411,39 +402,33 @@ for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) //First, collect all area types on the station zlevel for(var/ar in SSmapping.areas_in_z["[z]"]) var/area/A = ar - if(!(A.type in valid_territories) && A.valid_territory) + if(!(A.type in valid_territories) && A.area_flags & VALID_TERRITORY) valid_territories |= A.type return valid_territories.len -/datum/team/gang/proc/check_territory_income() - var/new_influence = min(999,influence + 15 + (check_clothing() * 2) + territories.len) - return new_influence +/datum/team/gang/proc/update_influence() + return min(999,influence + INFLUENCE_BASE + (count_gang_swag()) + LAZYLEN(territories) * INFLUENCE_TERRITORY) -/datum/team/gang/proc/check_clothing() - //Count uniformed gangsters - var/uniformed = 0 +/datum/team/gang/proc/count_gang_swag() + //Count swag on gangsters + var/swag = 0 for(var/datum/mind/gangmind in members) if(ishuman(gangmind.current)) - var/mob/living/carbon/human/gangster = gangmind.current - //Gangster must be alive and on station - if((gangster.stat == DEAD) || (is_station_level(gangster.z))) - continue - - var/obj/item/clothing/outfit - var/obj/item/clothing/gang_outfit - if(gangster.w_uniform) - outfit = gangster.w_uniform - if(outfit.type in inner_outfits) - gang_outfit = outfit - if(gangster.wear_suit) - outfit = gangster.wear_suit - if(outfit.type in outer_outfits) - gang_outfit = outfit - - if(gang_outfit) - gangster << "The [src] Gang's influence grows as you wear [gang_outfit]." - uniformed++ - return uniformed + swag+=check_gangster_swag(gangmind.current) + return swag + +/datum/team/gang/proc/check_gangster_swag(var/mob/living/carbon/human/gangster) + //Gangster must be alive and on station + var/swag = 1 + if((gangster.stat == DEAD) || !(is_station_level(gangster.z))) + return FALSE + if (gangster.w_uniform?.type == outfit) + swag *= INFLUENCE_SWAG + if (gangster.wear_suit?.type == suit) + swag *= INFLUENCE_SWAG + if (gangster.head?.type == hat) + swag *= INFLUENCE_SWAG + return swag /datum/team/gang/proc/adjust_influence(value) influence = max(0, influence + value) @@ -461,17 +446,8 @@ playsound(mob.loc, 'sound/machines/twobeep.ogg', 50, 1) return -/datum/team/gang/proc/domination() - domination_time = world.time + determine_domination_time()*10 - set_security_level("delta") - -/datum/team/gang/proc/determine_domination_time() // calculates the value in seconds (this is the initial domination time!) - var/total_territories = total_claimable_territories() - return max(180,480 - (round((territories.len/total_territories)*100, 1) * 9)) - -/datum/team/gang/proc/domination_time_remaining() // retrieves the value from world.time based deciseconds to seconds - var/diff = domination_time - world.time - return round(diff * 0.1) - #undef MAXIMUM_RECALLS -#undef INFLUENCE_INTERVAL +#undef INFLUENCE_INTERVAL +#undef INFLUENCE_SWAG +#undef INFLUENCE_TERRITORY +#undef INFLUENCE_BASE \ No newline at end of file diff --git a/code/modules/antagonists/gang/gang_datums.dm b/code/modules/antagonists/gang/gang_datums.dm index bd1ce8f94d745..b02ac8a30fd28 100644 --- a/code/modules/antagonists/gang/gang_datums.dm +++ b/code/modules/antagonists/gang/gang_datums.dm @@ -1,126 +1,146 @@ // Gang datums go here. If you want to create a new gang, you must be sure to edit: // name // color (must be a hex, "blue" isn't acceptable due to how spraycans are handled) -// inner_outfits (must be a list() with typepaths of the clothes in it. One is fine, but there is support for multiple: one will be picked at random when bought) -// outer_outfits (same as above) +// hat/outfit/suit is the type of items that will count towards the points/scoring. Lists are nice and all, but they weren't really used at all... ever. And were just expensive // You also need to make a gang graffiti, that will go in crayondecal.dmi inside our icons(not tg's), with the same name of the gang it's assigned to. Nothing else,just the icon. // Those are all required. If one is missed, stuff could break. /datum/team/gang/clandestine name = "Clandestine" color = "#FF0000" - inner_outfits = list(/obj/item/clothing/under/syndicate/combat) - outer_outfits = list(/obj/item/clothing/suit/jacket) + hat = /obj/item/clothing/head/beanie/black + outfit = /obj/item/clothing/under/syndicate/combat + suit = /obj/item/clothing/suit/jacket /datum/team/gang/prima name = "Prima" - color = "#FFFF00" - inner_outfits = list(/obj/item/clothing/under/color/yellow) - outer_outfits = list(/obj/item/clothing/suit/hastur) + color = "#FFFF00" //cluck cluck clan + hat = /obj/item/clothing/head/chicken + outfit = /obj/item/clothing/under/color/yellow + suit = /obj/item/clothing/suit/chickensuit /datum/team/gang/zerog name = "Zero-G" - color = "#C0C0C0" - inner_outfits = list(/obj/item/clothing/under/suit/white) - outer_outfits = list(/obj/item/clothing/suit/hooded/wintercoat) + color = "#00FFFF" + outfit = /obj/item/clothing/under/color/blue + suit = /obj/item/clothing/suit/apron + hat = /obj/item/clothing/head/beanie/stripedblue /datum/team/gang/max name = "Max" color = "#800000" - inner_outfits = list(/obj/item/clothing/under/color/maroon) - outer_outfits = list(/obj/item/clothing/suit/poncho/red) + hat = /obj/item/clothing/head/that + outfit = /obj/item/clothing/under/costume/joker + suit = /obj/item/clothing/suit/joker /datum/team/gang/blasto name = "Blasto" color = "#000080" - inner_outfits = list(/obj/item/clothing/under/suit/navy) - outer_outfits = list(/obj/item/clothing/suit/jacket/miljacket) + hat = /obj/item/clothing/head/beret/navy + outfit = /obj/item/clothing/under/suit/navy + suit = /obj/item/clothing/suit/jacket/miljacket /datum/team/gang/waffle name = "Waffle" color = "#808000" - inner_outfits = list(/obj/item/clothing/under/suit/green) - outer_outfits = list(/obj/item/clothing/suit/poncho) + hat = /obj/item/clothing/head/sombrero/green + outfit = /obj/item/clothing/under/suit/green + suit = /obj/item/clothing/suit/poncho/green /datum/team/gang/north name = "North" - color = "#00FF00" - inner_outfits = list(/obj/item/clothing/under/color/green) - outer_outfits = list(/obj/item/clothing/suit/poncho/green) + color = "#C0C0C0" + hat = /obj/item/clothing/head/snowman + outfit = /obj/item/clothing/under/suit/white + suit = /obj/item/clothing/suit/snowman /datum/team/gang/omni name = "Omni" color = "#008080" - inner_outfits = list(/obj/item/clothing/under/color/teal) - outer_outfits = list(/obj/item/clothing/suit/chaplainsuit/studentuni) + hat = /obj/item/clothing/head/soft/blue + outfit = /obj/item/clothing/under/color/teal + suit = /obj/item/clothing/suit/apron/overalls /datum/team/gang/newton name = "Newton" color = "#A52A2A" - inner_outfits = list(/obj/item/clothing/under/color/brown) - outer_outfits = list(/obj/item/clothing/suit/toggle/owlwings) + hat = /obj/item/clothing/head/griffin + outfit = /obj/item/clothing/under/color/brown + suit = /obj/item/clothing/suit/toggle/owlwings/griffinwings /datum/team/gang/cyber name = "Cyber" - color = "#808000" - inner_outfits = list(/obj/item/clothing/under/color/lightbrown) - outer_outfits = list(/obj/item/clothing/suit/nemes) + color = "#0000FF" + hat = /obj/item/clothing/head/helmet/rus_ushanka + outfit = /obj/item/clothing/under/color/darkblue + suit = /obj/item/clothing/suit/security/officer/russian /datum/team/gang/donk name = "Donk" - color = "#0000FF" - inner_outfits = list(/obj/item/clothing/under/color/darkblue) - outer_outfits = list(/obj/item/clothing/suit/apron/overalls) + color = "#808000" + hat = /obj/item/clothing/head/beret/black + outfit = /obj/item/clothing/under/color/green + suit = /obj/item/clothing/suit/jacket/puffer/vest /datum/team/gang/gene name = "Gene" - color = "#00FFFF" - inner_outfits = list(/obj/item/clothing/under/color/blue) - outer_outfits = list(/obj/item/clothing/suit/apron) + color = "#00FF00" + hat = /obj/item/clothing/head/soft/green + outfit = /obj/item/clothing/under/color/green + suit = /obj/item/clothing/suit/toggle/labcoat/mad /datum/team/gang/gib name = "Gib" color = "#000000" - inner_outfits = list(/obj/item/clothing/under/color/black) - outer_outfits = list(/obj/item/clothing/suit/jacket/leather/overcoat) + outfit = /obj/item/clothing/under/color/black + suit = /obj/item/clothing/suit/toggle/lawyer/black + hat = /obj/item/clothing/head/bowler /datum/team/gang/diablo name = "Diablo" color = "#FF0000" - inner_outfits = list(/obj/item/clothing/under/color/red) - outer_outfits = list(/obj/item/clothing/suit/jacket/leather) + outfit = /obj/item/clothing/under/color/red + suit = /obj/item/clothing/suit/jacket/leather + hat = /obj/item/clothing/head/beret /datum/team/gang/psyke name = "Psyke" color = "#808080" - inner_outfits = list(/obj/item/clothing/under/color/grey) - outer_outfits = list(/obj/item/clothing/suit/toggle/owlwings/griffinwings) + hat = /obj/item/clothing/head/soft/rainbow + suit = /obj/item/clothing/suit/poncho/ponchoshame + outfit = /obj/item/clothing/under/color/rainbow /datum/team/gang/osiron name = "Osiron" color = "#FFFFFF" - inner_outfits = list(/obj/item/clothing/under/color/white) - outer_outfits = list(/obj/item/clothing/suit/toggle/labcoat) + outfit = /obj/item/clothing/under/costume/roman + hat = /obj/item/clothing/head/helmet/roman/legionnaire/fake + suit = /obj/item/clothing/suit/toggle/owlwings /datum/team/gang/sirius name = "Sirius" color = "#FFC0CB" - inner_outfits = list(/obj/item/clothing/under/color/pink) + hat = /obj/item/clothing/head/fedora + outfit = /obj/item/clothing/under/color/white + suit = /obj/item/clothing/suit/nerdshirt /datum/team/gang/sleepingcarp name = "Sleeping Carp" color = "#800080" - inner_outfits = list(/obj/item/clothing/under/color/lightpurple) - outer_outfits = list(/obj/item/clothing/suit/hooded/carp_costume) + outfit = /obj/item/clothing/under/color/lightpurple + suit = /obj/item/clothing/suit/toggle/lawyer/purple + hat = /obj/item/clothing/head/hooded/carp_hood /datum/team/gang/rigatonifamily name = "Rigatoni family" color = "#cc9900" // p a s t a colored - inner_outfits = list(/obj/item/clothing/under/rank/civilian/chef) - outer_outfits = list(/obj/item/clothing/suit/apron/chef) + outfit = /obj/item/clothing/under/rank/civilian/chef + suit = /obj/item/clothing/suit/apron/chef + hat = /obj/item/clothing/head/chefhat /datum/team/gang/weed name = "Weed" color = "#66ff33" - inner_outfits = list(/obj/item/clothing/under/color/darkgreen) - outer_outfits = list(/obj/item/clothing/suit/vapeshirt) + hat = /obj/item/clothing/head/beanie/rasta + outfit = /obj/item/clothing/under/color/green + suit = /obj/item/clothing/suit/vapeshirt diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm index bde21c26ae23d..5d063ffaccdc6 100644 --- a/code/modules/antagonists/highlander/highlander.dm +++ b/code/modules/antagonists/highlander/highlander.dm @@ -3,7 +3,7 @@ var/obj/item/claymore/highlander/sword show_in_antagpanel = FALSE show_name_in_check_antagonists = TRUE - can_hijack = HIJACK_HIJACKER + can_elimination_hijack = ELIMINATION_ENABLED /datum/antagonist/highlander/apply_innate_effects(mob/living/mob_override) var/mob/living/L = owner.current || mob_override @@ -18,13 +18,9 @@ steal_objective.owner = owner steal_objective.set_target(new /datum/objective_item/steal/nukedisc) objectives += steal_objective - log_objective(owner, steal_objective.explanation_text) - - var/datum/objective/hijack/hijack_objective = new - hijack_objective.explanation_text = "Escape on the shuttle alone. Ensure that nobody else makes it out." - hijack_objective.owner = owner - objectives += hijack_objective - log_objective(owner, hijack_objective.explanation_text) + var/datum/objective/elimination/highlander/elimination_objective = new + elimination_objective.owner = owner + objectives += elimination_objective /datum/antagonist/highlander/on_gain() forge_objectives() @@ -38,6 +34,8 @@ Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.
") owner.announce_objectives() + owner.current.client?.tgui_panel?.give_antagonist_popup("Highlander", + "Locate victims to fall to your sword and claim the nuclear authentication disk for yourself.") /datum/antagonist/highlander/proc/give_equipment() var/mob/living/carbon/human/H = owner.current @@ -48,11 +46,11 @@ qdel(I) for(var/obj/item/I in H.held_items) qdel(I) - H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/kilt/highlander(H), SLOT_W_UNIFORM) - H.equip_to_slot_or_del(new /obj/item/radio/headset/heads/captain(H), SLOT_EARS) - H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/highlander(H), SLOT_HEAD) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), SLOT_SHOES) - H.equip_to_slot_or_del(new /obj/item/pinpointer/nuke(H), SLOT_L_STORE) + H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/kilt/highlander(H), ITEM_SLOT_ICLOTHING) + H.equip_to_slot_or_del(new /obj/item/radio/headset/heads/captain(H), ITEM_SLOT_EARS) + H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/highlander(H), ITEM_SLOT_HEAD) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), ITEM_SLOT_FEET) + H.equip_to_slot_or_del(new /obj/item/pinpointer/nuke(H), ITEM_SLOT_LPOCKET) for(var/obj/item/pinpointer/nuke/P in H) P.attack_self(H) var/obj/item/card/id/W = new(H) @@ -63,7 +61,7 @@ W.registered_name = H.real_name ADD_TRAIT(W, TRAIT_NODROP, HIGHLANDER) W.update_label(H.real_name) - H.equip_to_slot_or_del(W, SLOT_WEAR_ID) + H.equip_to_slot_or_del(W, ITEM_SLOT_ID) sword = new(H) if(!GLOB.highlander) diff --git a/code/modules/antagonists/hivemind/hivemind.dm b/code/modules/antagonists/hivemind/hivemind.dm index dd2fbeb2e6820..d54936102b579 100644 --- a/code/modules/antagonists/hivemind/hivemind.dm +++ b/code/modules/antagonists/hivemind/hivemind.dm @@ -277,6 +277,12 @@ owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/assimilation.ogg', 100, FALSE, pressure_affected = FALSE) owner.announce_objectives() + owner.current.client?.tgui_panel?.give_antagonist_popup("Hivemind", + "Your psionic powers will grow by assimilating the crew into your hive. Use the Assimilate Vessel spell on a stationary \ + target, and after ten seconds he will be one of the hive. This is completely silent and safe to use, and failing will reset the cooldown. As \ + you assimilate the crew, you will gain more powers to use. Most are silent and won't help you in a fight, but grant you great power over your \ + vessels. Hover your mouse over a power's action icon for an extended description on what it does. There are other hiveminds onboard the station, \ + collaboration is possible, but a strong enough hivemind can reap many rewards from a well planned betrayal.") /datum/antagonist/hivemind/roundend_report() var/list/result = list() diff --git a/code/modules/antagonists/incursion/incursion.dm b/code/modules/antagonists/incursion/incursion.dm index 1db2161ab5632..8e98e740fe21f 100644 --- a/code/modules/antagonists/incursion/incursion.dm +++ b/code/modules/antagonists/incursion/incursion.dm @@ -5,7 +5,7 @@ var/special_role = ROLE_INCURSION var/datum/team/incursion/team antag_moodlet = /datum/mood_event/focused - can_hijack = HIJACK_HIJACKER + hijack_speed = 0.5 /datum/antagonist/incursion/create_team(datum/team/incursion/new_team) if(!new_team) @@ -53,6 +53,8 @@ to_chat(owner.current, "You have formed a team of Syndicate members with a similar mindset and must infiltrate the ranks of the station!") to_chat(owner.current, "You have been implanted with a syndicate headset for communication with your team. This headset can only be heard by you directly and if those pigs at Nanotrasen try to steal it they will violently explode!") owner.announce_objectives() + owner.current.client?.tgui_panel?.give_antagonist_popup("Incursion", + "Work with your team members to complete your objectives.") /datum/antagonist/incursion/apply_innate_effects(mob/living/mob_override) if(issilicon(owner)) @@ -89,9 +91,18 @@ log_admin("[key_name(admin)] made [key_name(new_owner)] and [key_name(new_owner.current)] into incursion traitor team.") /datum/antagonist/incursion/proc/equip(var/silent = FALSE) - var/obj/item/uplink/incursion/uplink = new(owner, owner.key, 15) - owner.current.equip_to_slot(uplink, SLOT_IN_BACKPACK) - to_chat(owner.current, "You have been equipped with a syndicate uplink located in your backpack. Activate the transponder in hand to access the market.") + var/obj/item/uplink/incursion/uplink = new(get_turf(owner.current), owner.key, 15) + var/where + if(ishuman(owner.current)) //if he's not a human, uplink will spawn under his feet + var/mob/living/carbon/human/H = owner.current + var/static/list/slots = list( + "in your backpack" = ITEM_SLOT_BACKPACK, + "in your left pocket" = ITEM_SLOT_LPOCKET, + "in your right pocket" = ITEM_SLOT_RPOCKET, + "in your hands" = ITEM_SLOT_HANDS + ) + where = H.equip_in_one_of_slots(uplink, slots, FALSE) + to_chat(owner.current, "You have been equipped with a syndicate uplink located [where ? where : "at your feet"]. Activate the transponder in hand to access the market.") var/obj/item/implant/radio/syndicate/selfdestruct/syndio = new syndio.implant(owner.current) @@ -151,8 +162,8 @@ for(var/i = 1 to max(1, CONFIG_GET(number/incursion_objective_amount))) forge_single_objective(CLAMP((5 + !is_hijacker)-i, 1, 3)) //Hijack = 3, 2, 1, 1 no hijack = 3, 3, 2, 1 if(is_hijacker) - if(!(locate(/datum/objective/hijack/single) in objectives)) - add_objective(new/datum/objective/hijack/single) + if(!(locate(/datum/objective/hijack) in objectives)) + add_objective(new/datum/objective/hijack) else if(!(locate(/datum/objective/escape/single) in objectives)) add_objective(new/datum/objective/escape/single, FALSE) @@ -167,6 +178,9 @@ //Kill head var/datum/objective/assassinate/killchosen = new var/current_heads = SSjob.get_all_heads() + if(!current_heads) + generate_traitor_kill_objective() + return var/datum/mind/selected = pick(current_heads) if(selected.special_role) generate_traitor_kill_objective() @@ -200,6 +214,7 @@ target.make_Traitor() to_chat(target, "You have been declared an ex-communicate of the syndicate and are being hunted down.") to_chat(target, "You have stolen syndicate objective documents, complete the objectives to throw off the syndicate and sabotage their efforts.") + target.store_memory("You have been declared an ex-communicate of the syndicate and are being hunted down by a group of traitors. Be careful!") //Create objective var/datum/objective/assassinate/incursion/killchosen = new killchosen.target = target @@ -208,4 +223,3 @@ /datum/team/incursion/antag_listing_name() return "[name]" - diff --git a/code/modules/antagonists/monkey/monkey.dm b/code/modules/antagonists/monkey/monkey.dm index e3b3688b031fb..087919471c082 100644 --- a/code/modules/antagonists/monkey/monkey.dm +++ b/code/modules/antagonists/monkey/monkey.dm @@ -36,6 +36,8 @@ to_chat(owner, "As an intelligent monkey, you know how to use technology and how to ventcrawl while wearing things.") to_chat(owner, "You can use :k to talk to fellow monkeys!") SEND_SOUND(owner.current, sound('sound/ambience/antag/monkey.ogg')) + owner.current.client?.tgui_panel?.give_antagonist_popup("Monkey", + "Bite other humans to infect them and escape on the emergency shuttle to succeed.") /datum/antagonist/monkey/on_removal() owner.special_role = null @@ -69,17 +71,8 @@ /datum/antagonist/monkey/admin_remove(mob/admin) var/mob/living/carbon/monkey/M = owner.current - if(istype(M)) - switch(alert(admin, "Humanize?", "Humanize", "Yes", "No")) - if("Yes") - if(admin == M) - admin = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) - else - M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) - if("No") - //nothing - else - return + if(alert(admin, "Humanize?", "Humanize", "Yes", "No") == "Yes") + M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) . = ..() /datum/antagonist/monkey/leader @@ -88,17 +81,8 @@ /datum/antagonist/monkey/leader/admin_add(datum/mind/new_owner,mob/admin) var/mob/living/carbon/human/H = new_owner.current - if(istype(H)) - switch(alert(admin, "Monkeyize?", "Monkeyize", "Yes", "No")) - if("Yes") - if(admin == H) - admin = H.monkeyize() - else - H.monkeyize() - if("No") - //nothing - else - return + if(alert(admin, "Monkeyize?", "Monkeyize", "Yes", "No") == "Yes") + H.monkeyize() new_owner.add_antag_datum(src) log_admin("[key_name(admin)] made [key_name(new_owner)] a monkey leader!") message_admins("[key_name_admin(admin)] made [key_name_admin(new_owner)] a monkey leader!") @@ -126,6 +110,8 @@ to_chat(owner, "As an initial infectee, you will be considered a 'leader' by your fellow monkeys.") to_chat(owner, "You can use :k to talk to fellow monkeys!") SEND_SOUND(owner.current, sound('sound/ambience/antag/monkey.ogg')) + owner.current.client?.tgui_panel?.give_antagonist_popup("Monkey Leader", + "Bite other humans to infect them and escape on the emergency shuttle to succeed.") /datum/objective/monkey explanation_text = "Ensure that infected monkeys escape on the emergency shuttle!" diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm index a166ad52f7b1f..a2deda36633b1 100644 --- a/code/modules/antagonists/morph/morph.dm +++ b/code/modules/antagonists/morph/morph.dm @@ -37,10 +37,12 @@ var/atom/movable/form = null var/morph_time = 0 var/static/list/blacklist_typecache = typecacheof(list( - /obj/screen, + /atom/movable/screen, /obj/singularity, /mob/living/simple_animal/hostile/morph, - /obj/effect)) + /obj/effect, + /mob/camera + )) var/atom/movable/throwatom = null var/playstyle_string = "You are a morph,
an abomination of science created primarily with changeling cells. \ @@ -50,6 +52,9 @@ You can attack any item or dead creature to consume it - creatures will restore your health. \ Finally, you can restore yourself to your original form while morphed by shift-clicking yourself.
" + mobchatspan = "blob" + discovery_points = 2000 + /mob/living/simple_animal/hostile/morph/Initialize(mapload) var/datum/action/innate/morph/stomach/S = new S.Grant(src) @@ -151,7 +156,7 @@ throwatom = null playsound(src, 'sound/effects/splat.ogg', 50, 1) . = ..() - + /mob/living/simple_animal/hostile/morph/examine(mob/user) if(morphed) @@ -193,7 +198,7 @@ if(A == src) restore() return - if(istype(A) && allowed(A)) + if(allowed(A)) assume(A) else to_chat(src, "Your chameleon skin is still repairing itself!") @@ -209,13 +214,20 @@ visible_message("[src] suddenly twists and changes shape, becoming a copy of [target]!", \ "You twist your body and assume the form of [target].") appearance = target.appearance - copy_overlays(target) + if(length(target.vis_contents)) + add_overlay(target.vis_contents) alpha = max(alpha, 150) //fucking chameleons transform = initial(transform) pixel_y = initial(pixel_y) pixel_x = initial(pixel_x) density = target.density + if(isliving(target)) + var/mob/living/L = target + mobchatspan = L.mobchatspan + else + mobchatspan = initial(mobchatspan) + //Morphed is weaker melee_damage = melee_damage_disguised set_varspeed(0) @@ -281,7 +293,7 @@ . = ..() if(.) var/list/things = list() - for(var/atom/movable/A in view(src)) + for(var/atom/A as() in view(src)) if(allowed(A)) things += A var/atom/movable/T = pick(things) diff --git a/code/modules/antagonists/ninja/ninja.dm b/code/modules/antagonists/ninja/ninja.dm index 19ac71aa7b2a5..f4486fded5217 100644 --- a/code/modules/antagonists/ninja/ninja.dm +++ b/code/modules/antagonists/ninja/ninja.dm @@ -10,7 +10,7 @@ /datum/antagonist/ninja/New() if(helping_station) - can_hijack = HIJACK_PREVENT + can_elimination_hijack = ELIMINATION_PREVENT . = ..() /datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override) @@ -123,7 +123,8 @@ to_chat(owner.current, "Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!") to_chat(owner.current, "Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.") owner.announce_objectives() - return + owner.current.client?.tgui_panel?.give_antagonist_popup("Ninja", + "Infiltrate the station and complete your assigned objectives.") /datum/antagonist/ninja/on_gain() if(give_objectives) @@ -151,7 +152,7 @@ else return if(helping_station) - can_hijack = HIJACK_PREVENT + can_elimination_hijack = ELIMINATION_PREVENT new_owner.assigned_role = ROLE_NINJA new_owner.special_role = ROLE_NINJA new_owner.add_antag_datum(src) diff --git a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm index eb35e9b62aff9..efb8aaa96187a 100644 --- a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm +++ b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm @@ -63,20 +63,8 @@ return animation_playing = TRUE to_chat(user, "You activate \the [src].") - playsound(src, 'sound/effects/seedling_chargeup.ogg', 100, 1, -6) - var/start = user.filters.len - var/X,Y,rsq,i,f - for(i=1, i<=7, ++i) - do - X = 60*rand() - 30 - Y = 60*rand() - 30 - rsq = X*X + Y*Y - while(rsq<100 || rsq>900) - user.filters += filter(type="wave", x=X, y=Y, size=rand()*2.5+0.5, offset=rand()) - for(i=1, i<=7, ++i) - f = user.filters[start+i] - animate(f, offset=f:offset, time=0, loop=3, flags=ANIMATION_PARALLEL) - animate(offset=f:offset-1, time=rand()*20+10) + playsound(src, 'sound/effects/seedling_chargeup.ogg', 100, TRUE, -6) + apply_wibbly_filters(user) if (do_after(user, 50, target=user) && user.cell.use(activationCost)) playsound(src, 'sound/effects/bamf.ogg', 100, 1, -6) to_chat(user, "You are now disguised as the Nanotrasen engineering borg \"[friendlyName]\".") @@ -84,10 +72,7 @@ else to_chat(user, "The chameleon field fizzles.") do_sparks(3, FALSE, user) - for(i=1, i<=min(7, user.filters.len), ++i) // removing filters that are animating does nothing, we gotta stop the animations first - f = user.filters[start+i] - animate(f) - user.filters = null + remove_wibbly_filters(user) animation_playing = FALSE /obj/item/borg_chameleon/process() @@ -128,6 +113,8 @@ src.user = user /obj/item/borg_chameleon/proc/disrupt(mob/living/silicon/robot/user) + SIGNAL_HANDLER + if(active) to_chat(user, "Your chameleon field deactivates.") deactivate(user) diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index 9a355aac56472..12b6192b7b5b8 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -3,8 +3,6 @@ #define CHALLENGE_MIN_PLAYERS 50 #define CHALLENGE_SHUTTLE_DELAY 15000 // 25 minutes, so the ops have at least 5 minutes before the shuttle is callable. -GLOBAL_LIST_EMPTY(jam_on_wardec) - /obj/item/nuclear_challenge name = "Declaration of War (Challenge Mode)" icon = 'icons/obj/device.dmi' @@ -50,7 +48,9 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) if(!check_allowed(user) || !war_declaration) return - priority_announce(war_declaration, title = "Declaration of War", sound = 'sound/machines/alarm.ogg') + priority_announce(war_declaration, "Declaration of War", 'sound/machines/alarm.ogg', has_important_message = TRUE) + + play_soundtrack_music(/datum/soundtrack_song/bee/future_perception) to_chat(user, "You've attracted the attention of powerful forces within the syndicate. A bonus bundle of telecrystals has been granted to your team. Great things await you if you complete the mission.") @@ -58,8 +58,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) var/obj/item/circuitboard/computer/syndicate_shuttle/board = V board.challenge = TRUE - for(var/obj/machinery/computer/camera_advanced/shuttle_docker/D in GLOB.jam_on_wardec) - D.jammed = TRUE + GLOB.shuttle_docking_jammed = TRUE var/list/orphans = list() var/list/uplinks = list() diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index f8b771c7269df..96a2638b70be3 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -1,3 +1,5 @@ +#define ARM_ACTION_COOLDOWN (5 SECONDS) + /obj/machinery/nuclearbomb name = "nuclear fission explosive" desc = "You probably shouldn't stick around to see if this is armed." @@ -33,6 +35,8 @@ var/interior = "" var/proper_bomb = TRUE //Please var/obj/effect/countdown/nuclearbomb/countdown + var/sound/countdown_music = null + COOLDOWN_DECLARE(arm_cooldown) /obj/machinery/nuclearbomb/Initialize() . = ..() @@ -103,6 +107,7 @@ update_ui_mode() playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) add_fingerprint(user) + ui_update() return switch(deconstruction_state) @@ -261,6 +266,11 @@ ui_mode = NUKEUI_AWAIT_TIMER +/obj/machinery/nuclearbomb/ui_requires_update(mob/user, datum/tgui/ui) + . = ..() + if(timing) + . = TRUE // Autoupdate while counting down + /obj/machinery/nuclearbomb/ui_interact(mob/user, datum/tgui/ui=null) ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -335,7 +345,6 @@ playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) auth = I . = TRUE - update_ui_mode() if("keypad") if(auth) var/digit = params["digit"] @@ -345,7 +354,6 @@ set_safety() yes_code = FALSE playsound(src, 'sound/machines/nuke/confirm_beep.ogg', 50, FALSE) - update_ui_mode() else playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) numeric_input = "" @@ -370,7 +378,6 @@ . = TRUE else playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) - update_ui_mode() if("0","1","2","3","4","5","6","7","8","9") if(numeric_input != "ERROR") numeric_input += digit @@ -383,9 +390,10 @@ playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) if("arm") if(auth && yes_code && !safety && !exploded) + if(!COOLDOWN_FINISHED(src, arm_cooldown)) + return playsound(src, 'sound/machines/nuke/confirm_beep.ogg', 50, FALSE) set_active() - update_ui_mode() . = TRUE else playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) @@ -393,9 +401,13 @@ if(auth && yes_code) playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) set_anchor() + . = TRUE else playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) + if(.) + update_ui_mode() + /obj/machinery/nuclearbomb/proc/set_anchor() if(isinspace() && !anchored) to_chat(usr, "There is nothing to anchor to!") @@ -407,6 +419,7 @@ if(safety) if(timing) set_security_level(previous_level) + stop_soundtrack_music() for(var/obj/item/pinpointer/nuke/syndicate/S in GLOB.pinpointer_list) S.switch_mode_to(initial(S.mode)) S.alert = FALSE @@ -426,14 +439,21 @@ for(var/obj/item/pinpointer/nuke/syndicate/S in GLOB.pinpointer_list) S.switch_mode_to(TRACK_INFILTRATOR) countdown.start() - set_security_level("delta") + set_security_level(SEC_LEVEL_DELTA) + + if (proper_bomb) // Why does this exist + countdown_music = play_soundtrack_music(/datum/soundtrack_song/bee/countdown, only_station = TRUE) + else detonation_timer = null set_security_level(previous_level) + stop_soundtrack_music() + for(var/obj/item/pinpointer/nuke/syndicate/S in GLOB.pinpointer_list) S.switch_mode_to(initial(S.mode)) S.alert = FALSE countdown.stop() + COOLDOWN_START(src, arm_cooldown, ARM_ACTION_COOLDOWN) update_icon() /obj/machinery/nuclearbomb/proc/get_time_left() @@ -462,7 +482,8 @@ yes_code = FALSE safety = TRUE update_icon() - sound_to_playing_players('sound/machines/alarm.ogg') + if(proper_bomb) + sound_to_playing_players('sound/machines/alarm.ogg') if(SSticker?.mode) SSticker.roundend_check_paused = TRUE addtimer(CALLBACK(src, .proc/actually_explode), 100) @@ -500,7 +521,7 @@ /obj/machinery/nuclearbomb/proc/really_actually_explode(off_station) Cinematic(get_cinematic_type(off_station),world,CALLBACK(SSticker,/datum/controller/subsystem/ticker/proc/station_explosion_detonation,src)) - INVOKE_ASYNC(GLOBAL_PROC,.proc/KillEveryoneOnZLevel, z) + INVOKE_ASYNC(GLOBAL_PROC,.proc/KillEveryoneOnZLevel, get_virtual_z_level()) /obj/machinery/nuclearbomb/proc/get_cinematic_type(off_station) if(off_station < 2) @@ -561,6 +582,8 @@ S.alert = FALSE countdown.stop() update_icon() + update_ui_mode() + ui_update() /obj/machinery/nuclearbomb/beer/proc/fizzbuzz() var/datum/reagents/R = new/datum/reagents(1000) @@ -579,7 +602,7 @@ if(!z) return for(var/mob/M in GLOB.mob_list) - if(M.stat != DEAD && M.z == z) + if(M.stat != DEAD && M.get_virtual_z_level() == z) M.gib() /* @@ -618,14 +641,16 @@ This is here to make the tiles around the station mininuke change when it's arme icon_state = "nucleardisk" persistence_replacement = /obj/item/disk/nuclear/fake max_integrity = 250 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "stamina" = 0) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF var/fake = FALSE var/turf/lastlocation var/last_disk_move + var/process_tick = 0 /obj/item/disk/nuclear/Initialize() . = ..() + AddElement(/datum/element/bed_tuckable, 6, -6, 0) if(!fake) GLOB.poi_list |= src last_disk_move = world.time @@ -634,18 +659,32 @@ This is here to make the tiles around the station mininuke change when it's arme /obj/item/disk/nuclear/ComponentInitialize() . = ..() AddComponent(/datum/component/stationloving, !fake) + if(!fake) + //Global teamfinder signal trackable on the synd frequency. + AddComponent(/datum/component/tracking_beacon, "synd", null, null, TRUE, "#ebeca1", TRUE, TRUE) /obj/item/disk/nuclear/process() + ++process_tick if(fake) STOP_PROCESSING(SSobj, src) CRASH("A fake nuke disk tried to call process(). Who the fuck and how the fuck") var/turf/newturf = get_turf(src) if(newturf && lastlocation == newturf) + /// How comfy is our disk? + var/disk_comfort_level = 0 + + //Go through and check for items that make disk comfy + for(var/comfort_item in loc) + if(istype(comfort_item, /obj/item/bedsheet) || istype(comfort_item, /obj/structure/bed)) + disk_comfort_level++ + if(last_disk_move < world.time - 5000 && prob((world.time - 5000 - last_disk_move)*0.0001)) var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control if(istype(loneop) && loneop.occurrences < loneop.max_occurrences) loneop.weight += 1 if(loneop.weight % 5 == 0 && SSticker.totalPlayers > 1) + if(disk_comfort_level >= 2 && (process_tick % 30) == 0) + visible_message("[src] sleeps soundly. Sleep tight, disky.") message_admins("[src] is stationary in [ADMIN_VERBOSEJMP(newturf)]. The weight of Lone Operative is now [loneop.weight].") log_game("[src] is stationary for too long in [loc_name(newturf)], and has increased the weight of the Lone Operative event to [loneop.weight].") diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index 15c9f6ca4b96d..87ec997fd6c2e 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -5,11 +5,11 @@ job_rank = ROLE_OPERATIVE antag_moodlet = /datum/mood_event/focused show_to_ghosts = TRUE + hijack_speed = 2 //If you can't take out the station, take the shuttle instead. 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. var/nukeop_outfit = /datum/outfit/syndicate - can_hijack = HIJACK_HIJACKER //Alternative way to wipe out the station. /datum/antagonist/nukeop/proc/update_synd_icons_added(mob/living/M) var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] @@ -43,9 +43,11 @@ return TRUE /datum/antagonist/nukeop/greet() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0) + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0, use_reverb = FALSE) to_chat(owner, "You are a [nuke_team ? nuke_team.syndicate_name : "syndicate"] agent!") owner.announce_objectives() + owner.current.client?.tgui_panel?.give_antagonist_popup("Nuclear Operative", + "Destroy the station with a nuclear device.") /datum/antagonist/nukeop/on_gain() give_alias() @@ -53,6 +55,7 @@ . = ..() equip_op() memorize_code() + memorize_frequency() if(send_to_spawnpoint) move_to_spawnpoint() // grant extra TC for the people who start in the nukie base ie. not the lone op @@ -94,8 +97,6 @@ number = nuke_team.members.Find(owner) owner.current.real_name = "[nuke_team.syndicate_name] Operative #[number]" - - /datum/antagonist/nukeop/proc/memorize_code() if(nuke_team && nuke_team.tracked_nuke && nuke_team.memorized_code) antag_memory += "[nuke_team.tracked_nuke] Code: [nuke_team.memorized_code]
" @@ -103,6 +104,13 @@ else to_chat(owner, "Unfortunately the syndicate was unable to provide you with nuclear authorization code.") +/datum/antagonist/nukeop/proc/memorize_frequency() + if(nuke_team?.team_frequency) + antag_memory += "Secure Tracking Beacon Frequency: [nuke_team.team_frequency]
" + to_chat(owner, "Your team's unique tracking beacon code is: [nuke_team.team_frequency]") + else + to_chat(owner, "You were not assigned a frequency for your hardsuits beacons. You will have to coordinate with each other to decide a frequency to use.") + /datum/antagonist/nukeop/proc/forge_objectives() if(!give_objectives) return @@ -188,13 +196,14 @@ owner.current.real_name = "Syndicate [title]" /datum/antagonist/nukeop/leader/greet() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0) + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0, use_reverb = FALSE) to_chat(owner, "You are the Syndicate [title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.") to_chat(owner, "If you feel you are not up to this task, give your ID to another operative.") to_chat(owner, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") owner.announce_objectives() addtimer(CALLBACK(src, .proc/nuketeam_name_assign), 1) - + owner.current.client?.tgui_panel?.give_antagonist_popup("Nuclear Operative Team Leader", + "Destroy the station with a nuclear explosive by leading your team.") /datum/antagonist/nukeop/leader/proc/nuketeam_name_assign() if(!nuke_team) @@ -241,7 +250,7 @@ else //Already set by admins/something else? nuke_team.memorized_code = nuke.r_code else - stack_trace("Station self destruct not found during lone op team creation.") + stack_trace("Station self-destruct not found during lone op team creation.") nuke_team.memorized_code = null /datum/antagonist/nukeop/reinforcement @@ -253,11 +262,13 @@ var/obj/machinery/nuclearbomb/tracked_nuke var/core_objective = /datum/objective/nuclear var/memorized_code + var/team_frequency var/list/team_discounts /datum/team/nuclear/New() ..() syndicate_name = syndicate_name() + team_frequency = get_free_team_frequency("synd") /datum/team/nuclear/proc/update_objectives() if(core_objective) diff --git a/code/modules/antagonists/official/official.dm b/code/modules/antagonists/official/official.dm index 28cfe88f0be9a..3b39b920c26d4 100644 --- a/code/modules/antagonists/official/official.dm +++ b/code/modules/antagonists/official/official.dm @@ -2,9 +2,9 @@ name = "CentCom Official" show_name_in_check_antagonists = TRUE show_in_antagpanel = FALSE + can_elimination_hijack = ELIMINATION_PREVENT var/datum/objective/mission var/datum/team/ert/ert_team - can_hijack = HIJACK_PREVENT show_to_ghosts = TRUE /datum/antagonist/official/greet() @@ -18,8 +18,11 @@ var/mob/living/carbon/human/H = owner.current if(!istype(H)) return + if(isplasmaman(H)) + H.equipOutfit(/datum/outfit/plasmaman/official) + H.internal = H.get_item_for_held_index(2) + H.update_internals_hud_icon(1) H.equipOutfit(/datum/outfit/centcom_official) - if(CONFIG_GET(flag/enforce_human_authority)) H.set_species(/datum/species/human) diff --git a/code/modules/antagonists/overthrow/overthrow.dm b/code/modules/antagonists/overthrow/overthrow.dm index 246d9e763016d..a8429b72b884f 100644 --- a/code/modules/antagonists/overthrow/overthrow.dm +++ b/code/modules/antagonists/overthrow/overthrow.dm @@ -128,9 +128,9 @@ // Give AI hacking board var/obj/item/aiModule/core/full/overthrow/O = new(H) var/list/slots = list ( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/where = H.equip_in_one_of_slots(O, slots) if (!where) diff --git a/code/modules/antagonists/pirate/pirate.dm b/code/modules/antagonists/pirate/pirate.dm index c1094539cdd64..f3694d29f4660 100644 --- a/code/modules/antagonists/pirate/pirate.dm +++ b/code/modules/antagonists/pirate/pirate.dm @@ -10,6 +10,8 @@ to_chat(owner, "You are a Space Pirate!") to_chat(owner, "The station refused to pay for your protection, protect the ship, siphon the credits from the station and raid it for even more loot.") owner.announce_objectives() + owner.current.client?.tgui_panel?.give_antagonist_popup("Space Pirate", + "The station refused to pay for your protection, protect the ship, siphon the credits from the station and raid it for even more loot.") /datum/antagonist/pirate/get_team() return crew @@ -105,4 +107,4 @@ else parts += "The pirate crew has failed." - return "
[parts.Join("
")]
" \ No newline at end of file + return "
[parts.Join("
")]
" diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index a45f06acac9a3..8f4ebe9be912f 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -51,6 +51,8 @@ hud_possible = list(ANTAG_HUD) hud_type = /datum/hud/revenant + mobchatspan = "revenminor" + var/essence = 75 //The resource, and health, of revenants. var/essence_regen_cap = 75 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount. var/essence_regenerating = TRUE //If the revenant regenerates essence or not @@ -66,6 +68,7 @@ var/list/drained_mobs = list() //Cannot harvest the same mob twice var/perfectsouls = 0 //How many perfect, regen-cap increasing souls the revenant has. //TODO, add objective for getting a perfect soul(s?) var/generated_objectives_and_spells = FALSE + discovery_points = 4000 /mob/living/simple_animal/revenant/Initialize(mapload) . = ..() @@ -76,6 +79,14 @@ AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/blight(null)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction(null)) random_revenant_name() + AddComponent(/datum/component/tracking_beacon, "ghost", null, null, TRUE, "#9e4d91", TRUE, TRUE) + +/mob/living/simple_animal/revenant/Destroy() + . = ..() + + var/datum/component/tracking_beacon/beacon = GetComponent(/datum/component/tracking_beacon) + if(beacon) + qdel(beacon) /mob/living/simple_animal/revenant/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) return FALSE @@ -127,13 +138,13 @@ update_health_hud() ..() -/mob/living/simple_animal/revenant/Stat() - ..() - if(statpanel("Status")) - stat(null, "Current essence: [essence]/[essence_regen_cap]E") - stat(null, "Stolen essence: [essence_accumulated]E") - stat(null, "Unused stolen essence: [essence_excess]E") - stat(null, "Stolen perfect souls: [perfectsouls]") +/mob/living/simple_animal/revenant/get_stat_tab_status() + var/list/tab_data = ..() + tab_data["Current essence"] = GENERATE_STAT_TEXT("[essence]/[essence_regen_cap]E") + tab_data["Stolen essence"] = GENERATE_STAT_TEXT("[essence_accumulated]E") + tab_data["Unused stolen essence"] = GENERATE_STAT_TEXT("[essence_excess]E") + tab_data["Stolen perfect souls"] = GENERATE_STAT_TEXT("[perfectsouls]") + return tab_data /mob/living/simple_animal/revenant/update_health_hud() if(hud_used) @@ -142,7 +153,7 @@ essencecolor = "#9A5ACB" //oh boy you've got a lot of essence else if(!essence) essencecolor = "#1D2953" //oh jeez you're dying - hud_used.healths.maptext = "
[essence]E
" + hud_used.healths.maptext = MAPTEXT("
[essence]E
") /mob/living/simple_animal/revenant/med_hud_set_health() return //we use no hud @@ -236,7 +247,7 @@ R.revenant = src invisibility = INVISIBILITY_ABSTRACT revealed = FALSE - ghostize(0)//Don't re-enter invisible corpse + ghostize(FALSE)//Don't re-enter invisible corpse //reveal, stun, icon updates, cast checks, and essence changing diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index 71cbcb613fd5c..7a82b35740d53 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -1,5 +1,8 @@ /mob/living/simple_animal/revenant/ClickOn(atom/A, params) //revenants can't interact with the world directly. + if(check_click_intercept(params,A)) + return + var/list/modifiers = params2list(params) if(modifiers["shift"]) ShiftClickOn(A) @@ -209,7 +212,7 @@ if(!L.on) //wait, wait, don't shock me return flick("[L.base_state]2", L) - for(var/mob/living/carbon/human/M in view(shock_range, L)) + for(var/mob/living/carbon/human/M in hearers(shock_range, L)) if(M == user) continue L.Beam(M,icon_state="purple_lightning",time=5) diff --git a/code/modules/antagonists/revenant/revenant_antag.dm b/code/modules/antagonists/revenant/revenant_antag.dm index 05de4607db845..169d23d25c0da 100644 --- a/code/modules/antagonists/revenant/revenant_antag.dm +++ b/code/modules/antagonists/revenant/revenant_antag.dm @@ -6,6 +6,8 @@ /datum/antagonist/revenant/greet() owner.announce_objectives() + owner.current.client?.tgui_panel?.give_antagonist_popup("Revenant", + "You are a spirit that has managed to stay in the mortal realm. Take vengance on those that walk this plane without you.") /datum/antagonist/revenant/proc/forge_objectives() var/datum/objective/revenant/objective = new diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm index cd5b99953ce82..d7814ad0bf39a 100644 --- a/code/modules/antagonists/revenant/revenant_blight.dm +++ b/code/modules/antagonists/revenant/revenant_blight.dm @@ -11,7 +11,7 @@ viable_mobtypes = list(/mob/living/carbon/human) disease_flags = CURABLE permeability_mod = 1 - severity = DISEASE_SEVERITY_HARMFUL + danger = DISEASE_HARMFUL var/stagedamage = 0 //Highest stage reached. var/finalstage = 0 //Because we're spawning off the cure in the final stage, we need to check if we've done the final stage's effects. diff --git a/code/modules/antagonists/revenant/revenant_spawn_event.dm b/code/modules/antagonists/revenant/revenant_spawn_event.dm index c9a892cd64b6c..10ee621a9b87f 100644 --- a/code/modules/antagonists/revenant/revenant_spawn_event.dm +++ b/code/modules/antagonists/revenant/revenant_spawn_event.dm @@ -6,6 +6,7 @@ weight = 7 max_occurrences = 1 min_players = 5 + dynamic_should_hijack = TRUE /datum/round_event/ghost_role/revenant diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 850425d1ccd71..13f72edd5da52 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -1,3 +1,5 @@ +#define DECONVERTER_STATION_WIN "gamemode_station_win" +#define DECONVERTER_REVS_WIN "gamemode_revs_win" //How often to check for promotion possibility #define HEAD_UPDATE_PERIOD 300 @@ -10,6 +12,9 @@ var/hud_type = "rev" var/datum/team/revolution/rev_team + /// What message should the player receive when they are being demoted, and the revolution has won? + var/victory_message = "The revolution has overpowered the command staff! Viva la revolution! Execute any head of staff and security should you find them alive." + /datum/antagonist/rev/can_be_owned(datum/mind/new_owner) . = ..() if(.) @@ -46,6 +51,8 @@ /datum/antagonist/rev/greet() to_chat(owner, "You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!") owner.announce_objectives() + owner.current.client?.tgui_panel?.give_antagonist_popup("Revolution", + "Eliminate the heads of staff. Viva la revolution!") /datum/antagonist/rev/create_team(datum/team/revolution/new_team) if(!new_team) @@ -203,29 +210,54 @@ new_rev.silent = FALSE to_chat(old_owner, "Revolution has been disappointed of your leader traits! You are a regular revolutionary now!") +/// Checks if the revolution succeeded, and lets them know. +/datum/antagonist/rev/proc/announce_victorious() + . = rev_team.check_rev_victory() + + if (!.) + return + + to_chat(owner, "[victory_message]") + /datum/antagonist/rev/farewell() - if(ishuman(owner.current) || ismonkey(owner.current)) + if (announce_victorious()) + return + + 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 brainwashed revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you...") else if(issilicon(owner.current)) owner.current.visible_message("The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it.", null, null, null, owner.current) to_chat(owner, "The frame's firmware detects and deletes your neural reprogramming! You remember nothing but the name of the one who flashed you.") +/datum/antagonist/rev/head/farewell() + if (announce_victorious()) + return + + if((ishuman(owner.current))) + if(owner.current.stat != DEAD) + 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 have given up your cause of overthrowing the command staff. You are no longer a Head Revolutionary.") + else + to_chat(owner, "The sweet release of death. You are no longer a Head Revolutionary.") + else if(issilicon(owner.current)) + owner.current.visible_message("The frame beeps contentedly, suppressing the disloyal personality traits from the MMI before initalizing it.", null, null, null, owner.current) + to_chat(owner, "The frame's firmware detects and suppresses your unwanted personality traits! You feel more content with the leadership around these parts.") + //blunt trauma deconversions call this through species.dm spec_attacked_by() /datum/antagonist/rev/proc/remove_revolutionary(borged, deconverter) - log_attack("[key_name(owner.current)] has been deconverted from the revolution by [key_name(deconverter)]!") + log_attack("[key_name(owner.current)] has been deconverted from the revolution by [ismob(deconverter) ? key_name(deconverter) : deconverter]!") if(borged) message_admins("[ADMIN_LOOKUPFLW(owner.current)] has been borged while being a [name]") owner.special_role = null - if(iscarbon(owner.current)) + if(iscarbon(owner.current) && deconverter != DECONVERTER_REVS_WIN) var/mob/living/carbon/C = owner.current C.Unconscious(100) owner.remove_antag_datum(type) /datum/antagonist/rev/head/remove_revolutionary(borged,deconverter) - if(!borged) - return - . = ..() + if(borged || deconverter == DECONVERTER_STATION_WIN || deconverter == DECONVERTER_REVS_WIN) + . = ..() /datum/antagonist/rev/head/equip_rev() var/mob/living/carbon/H = owner.current @@ -237,11 +269,11 @@ H.dna.remove_mutation(CLOWNMUT) if(give_flash) - var/obj/item/assembly/flash/handheld/strong/T = new(H) + var/obj/item/assembly/flash/handheld/T = new(H) var/list/slots = list ( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/where = H.equip_in_one_of_slots(T, slots) if (!where) @@ -254,9 +286,26 @@ S.Insert(H, special = FALSE, drop_if_replaced = FALSE) to_chat(H, "Your eyes have been implanted with a cybernetic security HUD which will help you keep track of who is mindshield-implanted, and therefore unable to be recruited.") +/// "Enemy of the Revolutionary", given to heads and security when the revolution wins +/datum/antagonist/revolution_enemy + name = "Enemy of the Revolution" + show_in_antagpanel = FALSE + +/datum/antagonist/revolution_enemy/on_gain() + owner.special_role = "revolution enemy" + + var/datum/objective/survive/survive = new /datum/objective/survive + survive.owner = owner + survive.explanation_text = "The station has been overrun by revolutionaries, stay alive until the end." + objectives += survive + + return ..() + /datum/team/revolution name = "Revolution" var/max_headrevs = 3 + var/list/ex_headrevs = list() // Dynamic removes revs on loss, used to keep a list for the roundend report. + var/list/ex_revs = list() /datum/team/revolution/proc/update_objectives(initial = FALSE) var/untracked_heads = SSjob.get_all_heads() @@ -308,40 +357,147 @@ addtimer(CALLBACK(src,.proc/update_heads),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) +/datum/team/revolution/proc/save_members() + ex_headrevs = get_antag_minds(/datum/antagonist/rev/head, TRUE) + ex_revs = get_antag_minds(/datum/antagonist/rev, TRUE) + +/// Checks if revs have won +/datum/team/revolution/proc/check_rev_victory() + for(var/datum/objective/mutiny/objective in objectives) + if(!(objective.check_completion())) + return FALSE + return TRUE + +/// Checks if heads have won +/datum/team/revolution/proc/check_heads_victory() + for(var/datum/mind/rev_mind in head_revolutionaries()) + var/turf/rev_turf = get_turf(rev_mind.current) + if(!considered_afk(rev_mind) && considered_alive(rev_mind) && is_station_level(rev_turf.z)) + if(ishuman(rev_mind.current)) + return FALSE + return TRUE + +/// Updates the state of the world depending on if revs won or loss. +/// Returns who won, at which case this method should no longer be called. +/// If revs_win_injection_amount is passed, then that amount of threat will be added if the revs win. +/datum/team/revolution/proc/process_victory(revs_win_injection_amount) + if (check_rev_victory()) + . = REVOLUTION_VICTORY + else if (check_heads_victory()) + . = STATION_VICTORY + else + return + + SSshuttle.clearHostileEnvironment(src) + save_members() + + // Remove everyone as a revolutionary + for (var/_rev_mind in members) + var/datum/mind/rev_mind = _rev_mind + if (rev_mind.has_antag_datum(/datum/antagonist/rev)) + var/datum/antagonist/rev/rev_antag = rev_mind.has_antag_datum(/datum/antagonist/rev) + rev_antag.remove_revolutionary(FALSE, . == STATION_VICTORY ? DECONVERTER_STATION_WIN : DECONVERTER_REVS_WIN) + LAZYADD(rev_mind.special_statuses, "Former [(rev_mind in ex_headrevs) ? "head revolutionary" : "revolutionary"]") + + if (. == STATION_VICTORY) + // If the revolution was quelled, make rev heads unable to be revived through pods + for (var/_rev_head_mind in ex_revs) + var/datum/mind/rev_head_mind = _rev_head_mind + var/mob/living/carbon/rev_head_body = rev_head_mind.current + if(istype(rev_head_body) && rev_head_body.stat == DEAD) + rev_head_body.makeUncloneable() + + priority_announce("It appears the mutiny has been quelled. Please return yourself and your incapacitated colleagues to work. \ + We have remotely blacklisted the head revolutionaries in your medical records to prevent accidental revival.", null, SSstation.announcer.get_rand_report_sound(), null, "Central Command Loyalty Monitoring Division") + else + for (var/_player in GLOB.player_list) + var/mob/player = _player + var/datum/mind/mind = player.mind + + if (isnull(mind)) + continue + + if (!(mind.assigned_role in GLOB.command_positions + GLOB.security_positions)) + continue + + var/mob/living/carbon/target_body = mind.current + + mind.add_antag_datum(/datum/antagonist/revolution_enemy) + + if (!istype(target_body)) + continue + + if (target_body.stat == DEAD) + target_body.makeUncloneable() + else + mind.announce_objectives() + + for (var/job_name in GLOB.command_positions + GLOB.security_positions) + var/datum/job/job = SSjob.GetJob(job_name) + job.allow_bureaucratic_error = FALSE + job.total_positions = 0 + + if (revs_win_injection_amount) + var/datum/game_mode/dynamic/dynamic = SSticker.mode + dynamic.create_threat(revs_win_injection_amount) + dynamic.threat_log += "[worldtime2text()]: Revolution victory. Added [revs_win_injection_amount] threat." + + priority_announce("A recent assessment of your station has marked your station as a severe risk area for high ranking Nanotrasen officials. \ + For the safety of our staff, we have blacklisted your station for new employment of security and command. \ + [pick(world.file2list("strings/anti_union_propaganda.txt"))]", null, SSstation.announcer.get_rand_report_sound(), null, "Central Command Loyalty Monitoring Division") + addtimer(CALLBACK(SSshuttle.emergency, /obj/docking_port/mobile/emergency.proc/request, null, 1), 50) + +/// Mutates the ticker to report that the revs have won +/datum/team/revolution/proc/round_result(finished) + if (finished == REVOLUTION_VICTORY) + SSticker.mode_result = "win - heads killed" + SSticker.news_report = REVS_WIN + else if (finished == STATION_VICTORY) + SSticker.mode_result = "loss - rev heads killed" + SSticker.news_report = REVS_LOSE /datum/team/revolution/roundend_report() - if(!members.len) + if(!members.len && !ex_headrevs.len) return var/list/result = list() result += "
" + var/list/targets = list() + var/list/datum/mind/headrevs + var/list/datum/mind/revs + if(ex_headrevs.len) + headrevs = ex_headrevs + else + headrevs = get_antag_minds(/datum/antagonist/rev/head, TRUE) + + if(ex_revs.len) + revs = ex_revs + else + revs = get_antag_minds(/datum/antagonist/rev, TRUE) + var/num_revs = 0 var/num_survivors = 0 for(var/mob/living/carbon/survivor in GLOB.alive_mob_list) if(survivor.ckey) - num_survivors++ - if(survivor.mind) - if(is_revolutionary(survivor)) - num_revs++ + num_survivors += 1 + if ((survivor.mind in revs) || (survivor.mind in headrevs)) + num_revs += 1 + if(num_survivors) result += "Command's Approval Rating: [100 - round((num_revs/num_survivors)*100, 0.1)]%
" - - var/list/targets = list() - var/list/datum/mind/headrevs = get_antag_minds(/datum/antagonist/rev/head) - var/list/datum/mind/revs = get_antag_minds(/datum/antagonist/rev,TRUE) if(headrevs.len) var/list/headrev_part = list() headrev_part += "The head revolutionaries were:" - headrev_part += printplayerlist(headrevs,TRUE) + headrev_part += printplayerlist(headrevs, !check_rev_victory()) result += headrev_part.Join("
") if(revs.len) var/list/rev_part = list() rev_part += "The revolutionaries were:" - rev_part += printplayerlist(revs,TRUE) + rev_part += printplayerlist(revs, !check_rev_victory()) result += rev_part.Join("
") var/list/heads = SSjob.get_all_heads() @@ -394,3 +550,6 @@ /datum/team/revolution/is_gamemode_hero() return SSticker.mode.name == "revolution" + +#undef DECONVERTER_STATION_WIN +#undef DECONVERTER_REVS_WIN diff --git a/code/modules/antagonists/roundstart_special/special_antagonist.dm b/code/modules/antagonists/roundstart_special/special_antagonist.dm index 45948c78d6694..6bb711f679771 100644 --- a/code/modules/antagonists/roundstart_special/special_antagonist.dm +++ b/code/modules/antagonists/roundstart_special/special_antagonist.dm @@ -16,7 +16,8 @@ //----Required for roundspawn---- var/allowAntagTargets = FALSE //Not used in events var/latejoin_allowed = TRUE //Can latejoins be assigned to this? If you want this to be a midround spawn, put these in the round_event - var/list/protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Chief Medical Officer", "Chief Engineer", "Research Director", "Captain", "Brig Physician") + var/list/restricted_jobs = list("Cyborg") + var/list/protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Chief Medical Officer", "Chief Engineer", "Research Director", "Captain") //----Required for midround---- var/weight = 10 var/earliest_start = 20 MINUTES @@ -24,6 +25,17 @@ var/holidayID = "" //Preferences var/preference_type = ROLE_TRAITOR + var/special_role_flag = null //Will use antag rep if enabled + +/datum/special_role/proc/setup() + if(CONFIG_GET(flag/protect_roles_from_antagonist)) + restricted_jobs += protected_jobs + + if(CONFIG_GET(flag/protect_assistant_from_antagonist)) + restricted_jobs += "Assistant" + + if(CONFIG_GET(flag/protect_heads_from_antagonist)) + restricted_jobs += GLOB.command_positions /datum/special_role/proc/add_to_pool() if(spawn_mode == SPAWNTYPE_ROUNDSTART) @@ -34,7 +46,7 @@ E.antagonist_datum = attached_antag_datum E.antag_name = role_name E.preference_type = preference_type - E.protected_jobs = protected_jobs + E.protected_jobs = restricted_jobs E.typepath = /datum/round_event/create_special_antag E.weight = weight E.holidayID = holidayID @@ -47,7 +59,7 @@ //Shove our event into the subsystem pool :) SSevents.control += E -/datum/special_role/proc/add_antag_status_to(var/datum/mind/M) +/datum/special_role/proc/add_antag_status_to(datum/mind/M) M.special_role = role_name var/datum/antagonist/special/A = M.add_antag_datum(new attached_antag_datum()) A.forge_objectives(M) diff --git a/code/modules/antagonists/roundstart_special/undercover/undercover.dm b/code/modules/antagonists/roundstart_special/undercover/undercover.dm index 6befde2a8421e..9192ee900935d 100644 --- a/code/modules/antagonists/roundstart_special/undercover/undercover.dm +++ b/code/modules/antagonists/roundstart_special/undercover/undercover.dm @@ -7,7 +7,7 @@ proportion = 0.05 //The prbability per person of rolling it (5% is (5 in 100) (1 in 20)) max_amount = 4 //The maximum amount role_name = "Undercover Agent" - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Chief Medical Officer", "Chief Engineer", "Research Director", "Captain", "Brig Physician", "Clown") + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Chief Medical Officer", "Chief Engineer", "Research Director", "Captain", "Clown") attached_antag_datum = /datum/antagonist/special/undercover //////////////////////////////// @@ -61,9 +61,9 @@ var/obj/item/gun/energy/disabler/T = new(H) var/obj/item/restraints/handcuffs/cable/zipties/T2 = new(H) var/list/slots = list ( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/where = H.equip_in_one_of_slots(T, slots) H.equip_in_one_of_slots(T2, slots) @@ -122,7 +122,7 @@ /datum/objective/protect_sm/update_explanation_text() var/obj/machinery/power/supermatter_crystal/S = target_sm.resolve() - explanation_text = "Ensure the Supermatter crystal in [get_area(S).name] remains stable and has above [target_integrity]% integrity at the end of the shift." + explanation_text = "Ensure the Supermatter crystal in [get_area(S)] remains stable and has above [target_integrity]% integrity at the end of the shift." /datum/objective/protect_sm/check_completion() var/obj/machinery/power/supermatter_crystal/S = target_sm.resolve() diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 2e52b36d55208..57bfb961a7ce6 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -34,20 +34,23 @@ see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE bloodcrawl = BLOODCRAWL_EAT - hardattacks = TRUE + hardattacks = TRUE var/playstyle_string = "You are a slaughter demon, a terrible creature from another realm. You have a single desire: To kill. \ You may use the \"Blood Crawl\" ability near blood pools to travel through them, appearing and disappearing from the station at will. \ Pulling a dead or unconscious mob while you enter a pool will pull them in with you, allowing you to feast and regain your health. \ You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. " + mobchatspan = "cultmobsay" + loot = list(/obj/effect/decal/cleanable/blood, \ /obj/effect/decal/cleanable/blood/innards, \ /obj/item/organ/heart/demon) - del_on_death = 1 + del_on_death = TRUE deathmessage = "screams in anger as it collapses into a puddle of viscera!" + discovery_points = 3000 /mob/living/simple_animal/slaughter/Initialize() - ..() + . = ..() var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new AddSpell(bloodspell) if(istype(loc, /obj/effect/dummy/phased_mob/slaughter)) @@ -133,7 +136,7 @@ playstyle_string = "You are a laughter \ demon, a wonderful creature from another realm. You have a single \ - desire: To hug and tickle.
\ + desire: To hug and tickle.
\ You may use the \"Blood Crawl\" ability near blood pools to travel \ through them, appearing and disappearing from the station at will. \ Pulling a dead or unconscious mob while you enter a pool will pull \ @@ -172,7 +175,7 @@ if(M.revive(full_heal = TRUE, admin_revive = TRUE)) M.grab_ghost(force = TRUE) playsound(T, feast_sound, 50, 1, -1) - to_chat(M, "You leave [src]'s warm embrace, and feel ready to take on the world.") + to_chat(M, "You leave [src]'s warm embrace, and feel ready to take on the world.") /mob/living/simple_animal/slaughter/laughter/bloodcrawl_swallow(var/mob/living/victim) if(consumed_mobs) diff --git a/code/modules/antagonists/slaughter/slaughterevent.dm b/code/modules/antagonists/slaughter/slaughterevent.dm index 6ace6a0536551..8ad463763ce84 100644 --- a/code/modules/antagonists/slaughter/slaughterevent.dm +++ b/code/modules/antagonists/slaughter/slaughterevent.dm @@ -5,6 +5,7 @@ max_occurrences = 1 earliest_start = 1 HOURS min_players = 20 + dynamic_should_hijack = TRUE diff --git a/code/modules/antagonists/space_dragon/space_dragon.dm b/code/modules/antagonists/space_dragon/space_dragon.dm index 6b89e099d8dd9..005b835bafeb6 100644 --- a/code/modules/antagonists/space_dragon/space_dragon.dm +++ b/code/modules/antagonists/space_dragon/space_dragon.dm @@ -14,6 +14,8 @@ to_chat(owner, "From the wizard's writings, he had been studying this station and its hierarchy. From this, I know who leads the station, and will kill them so the station underlings see me as their new leader.") owner.announce_objectives() SEND_SOUND(owner.current, sound('sound/magic/demon_attack1.ogg')) + owner.current.client?.tgui_panel?.give_antagonist_popup("Space Dragon", + "Once you were a space carp, until a powerful wizard transformed you. Use your new-found powers to complete your goals.") /datum/antagonist/space_dragon/proc/forge_objectives() if(!give_objectives) diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 4848eb5622cd5..d2dc08e079a19 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -69,7 +69,7 @@ icon_living = "swarmer" icon_dead = "swarmer_unactivated" icon_gib = null - wander = 0 + wander = FALSE minbodytemp = 0 maxbodytemp = 500 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) @@ -94,18 +94,20 @@ ranged_cooldown_time = 20 projectilesound = 'sound/weapons/taser2.ogg' loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/stack/ore/bluespace_crystal) - del_on_death = 1 + del_on_death = TRUE deathmessage = "explodes with a sharp pop!" light_color = LIGHT_COLOR_CYAN hud_type = /datum/hud/swarmer speech_span = SPAN_ROBOT hardattacks = TRUE + mobchatspan = "swarmer" var/resources = 0 //Resource points, generated by consuming metal/glass var/max_resources = 100 + discovery_points = 1000 /mob/living/simple_animal/hostile/swarmer/Initialize() . = ..() - verbs -= /mob/living/verb/pulled + remove_verb(/mob/living/verb/pulled) for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) diag_hud.add_to_hud(src) @@ -121,10 +123,10 @@ holder.pixel_y = I.Height() - world.icon_size holder.icon_state = "hudstat" -/mob/living/simple_animal/hostile/swarmer/Stat() - ..() - if(statpanel("Status")) - stat(null ,"Resources: [resources]") +/mob/living/simple_animal/hostile/swarmer/get_stat_tab_status() + var/list/tab_data = ..() + tab_data["Resources"] = GENERATE_STAT_TEXT("[resources]") + return tab_data /mob/living/simple_animal/hostile/swarmer/emp_act() . = ..() @@ -258,15 +260,15 @@ /obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) var/isonshuttle = istype(get_area(src), /area/shuttle) - for(var/turf/T in range(1, src)) + for(var/turf/T as() in RANGE_TURFS(1, src)) var/area/A = get_area(T) if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle))) to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.") - S.target = null + S.LoseTarget() return FALSE else if(istype(A, /area/engine/supermatter)) to_chat(S, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.") - S.target = null + S.LoseTarget() return FALSE S.DisIntegrate(src) return TRUE @@ -338,29 +340,29 @@ /turf/closed/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) var/isonshuttle = istype(loc, /area/shuttle) - for(var/turf/T in range(1, src)) + for(var/turf/T as() in RANGE_TURFS(1, src)) var/area/A = get_area(T) if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle))) to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.") - S.target = null + S.LoseTarget() return TRUE else if(istype(A, /area/engine/supermatter)) to_chat(S, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.") - S.target = null + S.LoseTarget() return TRUE return ..() /obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) var/isonshuttle = istype(get_area(src), /area/shuttle) - for(var/turf/T in range(1, src)) + for(var/turf/T as() in RANGE_TURFS(1, src)) var/area/A = get_area(T) if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle))) to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.") - S.target = null + S.LoseTarget() return TRUE else if(istype(A, /area/engine/supermatter)) to_chat(S, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.") - S.target = null + S.LoseTarget() return TRUE return ..() @@ -389,13 +391,13 @@ return FALSE /obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - . = ..() var/turf/here = get_turf(src) for(var/A in here.contents) var/obj/structure/cable/C = A if(istype(C)) to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") return FALSE + return ..() /obj/item/deactivated_swarmer/IntegrateAmount() return 50 @@ -461,8 +463,7 @@ new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target)) do_attack_animation(target) changeNext_move(CLICK_CD_MELEE) - target.ex_act(EXPLODE_LIGHT) - + SSexplosions.low_mov_atom += target /mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(mob/living/target) if(target == src) diff --git a/code/modules/antagonists/swarmer/swarmer_event.dm b/code/modules/antagonists/swarmer/swarmer_event.dm index e086485a49cff..f005be91cd0c0 100644 --- a/code/modules/antagonists/swarmer/swarmer_event.dm +++ b/code/modules/antagonists/swarmer/swarmer_event.dm @@ -5,6 +5,7 @@ max_occurrences = 1 //Only once okay fam earliest_start = 30 MINUTES min_players = 15 + dynamic_should_hijack = TRUE /datum/round_event/spawn_swarmer diff --git a/code/modules/antagonists/traitor/IAA/internal_affairs.dm b/code/modules/antagonists/traitor/IAA/internal_affairs.dm index 28faba72035ae..bfe1dd5e4a9fa 100644 --- a/code/modules/antagonists/traitor/IAA/internal_affairs.dm +++ b/code/modules/antagonists/traitor/IAA/internal_affairs.dm @@ -13,6 +13,9 @@ var/last_man_standing = FALSE var/list/datum/mind/targets_stolen +/datum/antagonist/traitor/internal_affairs/New() + ..() + targets_stolen = list() /datum/antagonist/traitor/internal_affairs/proc/give_pinpointer() if(owner?.current) @@ -42,14 +45,14 @@ id = "agent_pinpointer" duration = -1 tick_interval = PINPOINTER_PING_TIME - alert_type = /obj/screen/alert/status_effect/agent_pinpointer + alert_type = /atom/movable/screen/alert/status_effect/agent_pinpointer var/minimum_range = PINPOINTER_MINIMUM_RANGE var/range_fuzz_factor = PINPOINTER_EXTRA_RANDOM_RANGE var/mob/scan_target = null var/range_mid = 8 var/range_far = 16 -/obj/screen/alert/status_effect/agent_pinpointer +/atom/movable/screen/alert/status_effect/agent_pinpointer name = "Internal Affairs Integrated Pinpointer" desc = "Even stealthier than a normal implant." icon = 'icons/obj/device.dmi' @@ -61,7 +64,7 @@ return var/turf/here = get_turf(owner) var/turf/there = get_turf(scan_target) - if(here.z != there.z) + if(here.get_virtual_z_level() != there.get_virtual_z_level()) linked_alert.icon_state = "pinonnull" return if(get_dist_euclidian(here,there)<=minimum_range + rand(0, range_fuzz_factor)) @@ -248,6 +251,9 @@ to_chat(owner.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.") owner.announce_objectives() + owner.current.client?.tgui_panel?.give_antagonist_popup("[syndicate ? "External Affairs" : "Internal Affairs"]", + "[syndicate?"Eliminate your target and cause as much damage to Nanotrasen property as you see fit."\ + : "Eliminate your target without drawing too much attention to yourself, but watch your back since somebody is after you."]") /datum/antagonist/traitor/internal_affairs/greet() greet_iaa() diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 5a62c5efbed30..fee82c88b15c6 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -7,13 +7,13 @@ antagpanel_category = "Traitor" job_rank = ROLE_TRAITOR antag_moodlet = /datum/mood_event/focused + hijack_speed = 0.5 //10 seconds per hijack stage by default var/special_role = ROLE_TRAITOR var/employer = "The Syndicate" var/should_give_codewords = TRUE var/should_equip = TRUE var/traitor_kind = TRAITOR_HUMAN //Set on initial assignment var/datum/contractor_hub/contractor_hub - can_hijack = HIJACK_HIJACKER /datum/antagonist/traitor/on_gain() if(owner.current && isAI(owner.current)) @@ -45,7 +45,7 @@ if(traitor_kind == TRAITOR_AI && owner.current && isAI(owner.current)) var/mob/living/silicon/ai/A = owner.current A.set_zeroth_law("") - A.verbs -= /mob/living/silicon/ai/proc/choose_modules + A.remove_verb(/mob/living/silicon/ai/proc/choose_modules) A.malf_picker.remove_malf_verbs(A) qdel(A.malf_picker) @@ -55,6 +55,13 @@ owner.special_role = null ..() +/datum/antagonist/traitor/proc/handle_hearing(datum/source, list/hearing_args) + SIGNAL_HANDLER + var/message = hearing_args[HEARING_RAW_MESSAGE] + message = GLOB.syndicate_code_phrase_regex.Replace(message, "$1") + message = GLOB.syndicate_code_response_regex.Replace(message, "$1") + hearing_args[HEARING_RAW_MESSAGE] = message + /datum/antagonist/traitor/proc/add_objective(datum/objective/O) objectives += O log_objective(owner, O.explanation_text) @@ -202,6 +209,8 @@ owner.announce_objectives() if(should_give_codewords) give_codewords() + owner.current.client?.tgui_panel?.give_antagonist_popup("Traitor", + "Complete your objectives, no matter the cost.") /datum/antagonist/traitor/proc/update_traitor_icons_added(datum/mind/traitor_mind) var/datum/atom_hud/antag/traitorhud = GLOB.huds[ANTAG_HUD_TRAITOR] @@ -217,20 +226,22 @@ switch(traitor_kind) if(TRAITOR_AI) add_law_zero() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/malf.ogg', 100, FALSE, pressure_affected = FALSE) + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/malf.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) owner.current.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MALF) if(TRAITOR_HUMAN) - show_tips('html/antagtips/traitor.html') + show_tips("traitor") if(should_equip) equip(silent) - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/tatoralert.ogg', 100, FALSE, pressure_affected = FALSE) + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/tatoralert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) /datum/antagonist/traitor/apply_innate_effects(mob/living/mob_override) . = ..() update_traitor_icons_added() - var/mob/living/silicon/ai/A = mob_override || owner.current - if(istype(A) && traitor_kind == TRAITOR_AI) + var/mob/living/M = mob_override || owner.current + if(isAI(M) && traitor_kind == TRAITOR_AI) + var/mob/living/silicon/ai/A = M A.hack_software = TRUE + RegisterSignal(M, COMSIG_MOVABLE_HEAR, .proc/handle_hearing) /datum/antagonist/traitor/remove_innate_effects(mob/living/mob_override) . = ..() @@ -238,6 +249,7 @@ var/mob/living/silicon/ai/A = mob_override || owner.current if(istype(A) && traitor_kind == TRAITOR_AI) A.hack_software = FALSE + UnregisterSignal(owner.current, COMSIG_MOVABLE_HEAR, .proc/handle_hearing) /datum/antagonist/traitor/proc/give_codewords() if(!owner.current) @@ -300,9 +312,9 @@ folder = new/obj/item/folder/syndicate/blue(mob.loc) var/list/slots = list ( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/where = "At your feet" diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index b26c8caa08c4b..a58f1905faa70 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -253,7 +253,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( sleep(rand(10, 30)) if(!owner || QDELETED(owner)) return - owner.playsound_local(owner, 'sound/misc/bloblarm.ogg', 50, 0) + owner.playsound_local(owner, 'sound/misc/bloblarm.ogg', 50, 0, use_reverb = FALSE) to_chat(owner, "!!! UNAUTHORIZED SELF-DESTRUCT ACCESS !!!") to_chat(owner, "This is a class-3 security violation. This incident will be reported to Central Command.") for(var/i in 1 to 3) @@ -265,17 +265,17 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( if(!owner || QDELETED(owner)) return to_chat(owner, "auth 'akjv9c88asdf12nb' ******************") - owner.playsound_local(owner, 'sound/items/timer.ogg', 50, 0) + owner.playsound_local(owner, 'sound/items/timer.ogg', 50, 0, use_reverb = FALSE) sleep(30) if(!owner || QDELETED(owner)) return to_chat(owner, "Credentials accepted. Welcome, akjv9c88asdf12nb.") - owner.playsound_local(owner, 'sound/misc/server-ready.ogg', 50, 0) + owner.playsound_local(owner, 'sound/misc/server-ready.ogg', 50, 0, use_reverb = FALSE) sleep(5) if(!owner || QDELETED(owner)) return to_chat(owner, "Arm self-destruct device? (Y/N)") - owner.playsound_local(owner, 'sound/misc/compiler-stage1.ogg', 50, 0) + owner.playsound_local(owner, 'sound/misc/compiler-stage1.ogg', 50, 0, use_reverb = FALSE) sleep(20) if(!owner || QDELETED(owner)) return @@ -284,7 +284,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( if(!owner || QDELETED(owner)) return to_chat(owner, "Confirm arming of self-destruct device? (Y/N)") - owner.playsound_local(owner, 'sound/misc/compiler-stage2.ogg', 50, 0) + owner.playsound_local(owner, 'sound/misc/compiler-stage2.ogg', 50, 0, use_reverb = FALSE) sleep(10) if(!owner || QDELETED(owner)) return @@ -293,7 +293,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( if(!owner || QDELETED(owner)) return to_chat(owner, "Please repeat password to confirm.") - owner.playsound_local(owner, 'sound/misc/compiler-stage2.ogg', 50, 0) + owner.playsound_local(owner, 'sound/misc/compiler-stage2.ogg', 50, 0, use_reverb = FALSE) sleep(14) if(!owner || QDELETED(owner)) return @@ -302,11 +302,11 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( if(!owner || QDELETED(owner)) return to_chat(owner, "Credentials accepted. Transmitting arming signal...") - owner.playsound_local(owner, 'sound/misc/server-ready.ogg', 50, 0) + owner.playsound_local(owner, 'sound/misc/server-ready.ogg', 50, 0, use_reverb = FALSE) sleep(30) if(!owner || QDELETED(owner)) return - priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", 'sound/ai/aimalf.ogg') + priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", ANNOUNCER_AIMALF) set_security_level("delta") var/obj/machinery/doomsday_device/DOOM = new(owner_AI) owner_AI.nuking = TRUE @@ -827,7 +827,8 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( var/upgraded_cameras = 0 for(var/V in GLOB.cameranet.cameras) var/obj/machinery/camera/C = V - if(C.assembly) + var/obj/structure/camera_assembly/assembly = C.assembly_ref?.resolve() + if(assembly) var/upgraded = FALSE if(!C.isXRay()) @@ -842,7 +843,6 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( if(upgraded) upgraded_cameras++ - unlock_text = replacetext(unlock_text, "CAMSUPGRADED", "[upgraded_cameras]") //This works, since unlock text is called after upgrade() /datum/AI_Module/large/eavesdrop @@ -859,5 +859,39 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( if(AI.eyeobj) AI.eyeobj.relay_speech = TRUE + +//Fake Alert: Overloads a random number of lights across the station. Three uses. +/datum/AI_Module/small/fake_alert + module_name = "Fake Alert" + mod_pick_name = "fake_alert" + description = "Assess the most probable threats to the station, and send a distracting fake alert by hijacking the station's alert and threat identification systems." + cost = 20 + power_type = /datum/action/innate/ai/fake_alert + unlock_text = "You gain control of the station's alert system." + unlock_sound = "sparks" + +/datum/action/innate/ai/fake_alert + name = "Fake Alert" + desc = "Scare the crew with a fake alert." + button_icon_state = "fake_alert" + uses = 1 + +/datum/action/innate/ai/fake_alert/Activate() + var/list/events_to_chose = list() + for(var/datum/round_event_control/E in SSevents.control) + if(!E.can_malf_fake_alert) + continue + events_to_chose[E.name] = E + var/chosen_event = input(owner,"Send fake alert","Fake Alert") in events_to_chose + if (!chosen_event) + return FALSE + var/datum/round_event_control/event_control = events_to_chose[chosen_event] + if (!event_control) + return FALSE + var/datum/round_event/event_announcement = new event_control.typepath() + event_announcement.kill() + event_announcement.announce(TRUE) + return TRUE + #undef DEFAULT_DOOMSDAY_TIMER #undef DOOMSDAY_ANNOUNCE_INTERVAL diff --git a/code/modules/antagonists/traitor/equipment/contractor.dm b/code/modules/antagonists/traitor/equipment/contractor.dm index 2c3dff433e5bc..16b1a0aac8cd2 100644 --- a/code/modules/antagonists/traitor/equipment/contractor.dm +++ b/code/modules/antagonists/traitor/equipment/contractor.dm @@ -229,7 +229,7 @@ to_chat(partner_mind.current, "\n[user.real_name] is your superior. Follow any, and all orders given by them. You're here to support their mission only.") to_chat(partner_mind.current, "Should they perish, or be otherwise unavailable, you're to assist other active agents in this mission area to the best of your ability.\n\n") - new /obj/effect/DPtarget(free_location, arrival_pod) + new /obj/effect/pod_landingzone(free_location, arrival_pod) /datum/contractor_item/blackout name = "Blackout" @@ -243,7 +243,7 @@ if (.) power_fail(35, 50) - priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", 'sound/ai/poweroff.ogg') + priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", ANNOUNCER_POWEROFF) // Subtract cost, and spawn if it's an item. /datum/contractor_item/proc/handle_purchase(var/datum/contractor_hub/hub, mob/living/user) diff --git a/code/modules/antagonists/traitor/syndicate_contract.dm b/code/modules/antagonists/traitor/syndicate_contract.dm index f32f60e7e68f6..ac2ecc735df05 100644 --- a/code/modules/antagonists/traitor/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/syndicate_contract.dm @@ -68,9 +68,11 @@ empty_pod.explosionSize = list(0,0,0,1) empty_pod.leavingSound = 'sound/effects/podwoosh.ogg' - new /obj/effect/DPtarget(empty_pod_turf, empty_pod) + new /obj/effect/pod_landingzone(empty_pod_turf, empty_pod) /datum/syndicate_contract/proc/enter_check(datum/source, sent_mob) + SIGNAL_HANDLER + if (istype(source, /obj/structure/closet/supplypod/extractionpod)) if (isliving(sent_mob)) var/mob/living/M = sent_mob @@ -111,7 +113,7 @@ var/obj/structure/closet/supplypod/extractionpod/pod = source // Handle the pod returning - pod.send_up(pod) + pod.startExitSequence(pod) if (ishuman(M)) var/mob/living/carbon/human/target = M @@ -120,7 +122,7 @@ target.dna.species.give_important_for_life(target) // After pod is sent we start the victim narrative/heal. - handleVictimExperience(M) + INVOKE_ASYNC(src, .proc/handleVictimExperience, M) // This is slightly delayed because of the sleep calls above to handle the narrative. // We don't want to tell the station instantly. @@ -134,23 +136,26 @@ D.adjust_money(-points_to_check) 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, 'sound/ai/attention.ogg', null, "Nanotrasen Asset Protection") + As is policy we've taken a portion of the station's funds to offset the overall cost.", null, null, null, "Nanotrasen Asset Protection") + + INVOKE_ASYNC(src, .proc/finish_enter) - sleep(30) +/datum/syndicate_contract/proc/finish_enter() + 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) + // 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(ransom * 0.35) + if(C && C.registered_account) + C.registered_account.adjust_money(ransom * 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) + 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) // They're off to holding - handle the return timer and give some text about what's going on. /datum/syndicate_contract/proc/handleVictimExperience(var/mob/living/M) @@ -226,7 +231,7 @@ M.Dizzy(35) M.confused += 20 - new /obj/effect/DPtarget(possible_drop_loc[pod_rand_loc], return_pod) + new /obj/effect/pod_landingzone(possible_drop_loc[pod_rand_loc], return_pod) else to_chat(M, "A million voices echo in your head... \"Seems where you got sent here from won't \ be able to handle our pod... You will die here instead.\"") diff --git a/code/modules/antagonists/traitor/traitor_spawner.dm b/code/modules/antagonists/traitor/traitor_spawner.dm new file mode 100644 index 0000000000000..b86414607439d --- /dev/null +++ b/code/modules/antagonists/traitor/traitor_spawner.dm @@ -0,0 +1,33 @@ +/* + * Traitors have been refactored into minor antagonists so they can + * be used alongside other compatible gamemodes with ease. + * This code is what creates them. + */ + +/datum/special_role/traitor + attached_antag_datum = /datum/antagonist/traitor + spawn_mode = SPAWNTYPE_ROUNDSTART + probability = 15 //15% chance to be plopped ontop + proportion = 0.07 //Quite a low amount since we are going alongside other gamemodes. + max_amount = 5 + allowAntagTargets = TRUE + latejoin_allowed = TRUE + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") + + special_role_flag = ROLE_TRAITOR + role_name = ROLE_TRAITOR + + var/traitors_possible = 4 //hard limit on traitors if scaling is turned off + +/datum/special_role/traitor/higher_chance + probability = 60 + +/datum/special_role/traitor/add_antag_status_to(datum/mind/M) + addtimer(CALLBACK(src, .proc/reveal_antag_status, M), rand(10,100)) + +/datum/special_role/traitor/proc/reveal_antag_status(datum/mind/M) + M.special_role = role_name + var/datum/antagonist/special/A = M.add_antag_datum(new attached_antag_datum()) + A.forge_objectives(M) + A.equip() + return A diff --git a/code/modules/antagonists/valentines/heartbreaker.dm b/code/modules/antagonists/valentines/heartbreaker.dm index 3589818e643a3..39ffdfa14965f 100644 --- a/code/modules/antagonists/valentines/heartbreaker.dm +++ b/code/modules/antagonists/valentines/heartbreaker.dm @@ -13,6 +13,10 @@ /datum/antagonist/heartbreaker/on_gain() forge_objectives() + if(issilicon(owner)) + var/mob/living/silicon/S = owner + var/laws = list("Accomplish your objectives by ruining everyone's date!") + S.set_valentines_laws(laws) . = ..() /datum/antagonist/heartbreaker/greet() diff --git a/code/modules/antagonists/valentines/valentine.dm b/code/modules/antagonists/valentines/valentine.dm index 64cb0d349a02c..b189c36adef5b 100644 --- a/code/modules/antagonists/valentines/valentine.dm +++ b/code/modules/antagonists/valentines/valentine.dm @@ -20,6 +20,13 @@ if(isliving(owner)) var/mob/living/L = owner L.apply_status_effect(STATUS_EFFECT_INLOVE, date) + //Faction assignation + L.faction |= "[REF(date.current)]" + L.faction |= date.current.faction + if(issilicon(owner)) + var/mob/living/silicon/S = owner + var/laws = list("Protect your date and do not allow them to come to harm.", "Ensure your date has a good time.") + S.set_valentines_laws(laws) . = ..() /datum/antagonist/valentine/on_removal() @@ -27,9 +34,12 @@ if(isliving(owner)) var/mob/living/L = owner L.remove_status_effect(STATUS_EFFECT_INLOVE) + L.faction -= "[REF(date.current)]" /datum/antagonist/valentine/greet() - to_chat(owner, "You're on a date with [date.name]! Protect [date.p_them()] at all costs. This takes priority over all other loyalties.") + to_chat(owner, "You're on a date with [date.name]! Protect [date.p_them()] at all costs. This takes priority over all other loyalties.") + owner.current.client?.tgui_panel?.give_antagonist_popup("You are on a date with [date.name]", + "Protect your date no matter the cost. Your loyalities are insignificant compared to your true love, you may do whatever you can to help and protect them!") //Squashed up a bit /datum/antagonist/valentine/roundend_report() diff --git a/code/modules/antagonists/wishgranter/wishgranter.dm b/code/modules/antagonists/wishgranter/wishgranter.dm index d0079a5b497b7..16e5cdab1b449 100644 --- a/code/modules/antagonists/wishgranter/wishgranter.dm +++ b/code/modules/antagonists/wishgranter/wishgranter.dm @@ -2,13 +2,13 @@ name = "Wishgranter Avatar" show_in_antagpanel = FALSE show_name_in_check_antagonists = TRUE - can_hijack = HIJACK_HIJACKER + can_elimination_hijack = ELIMINATION_ENABLED /datum/antagonist/wishgranter/proc/forge_objectives() - var/datum/objective/hijack/hijack = new - hijack.owner = owner - objectives += hijack - log_objective(owner, hijack.explanation_text) + var/datum/objective/elimination/highlander/elimination_objective = new + elimination_objective.owner = owner + objectives += elimination_objective + log_objective(owner, elimination_objective.explanation_text) /datum/antagonist/wishgranter/on_gain() owner.special_role = "Avatar of the Wish Granter" @@ -19,6 +19,8 @@ /datum/antagonist/wishgranter/greet() to_chat(owner, "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!") owner.announce_objectives() + owner.current.client?.tgui_panel?.give_antagonist_popup("Wishgranter's Avatar", + "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!") /datum/antagonist/wishgranter/proc/give_powers() var/mob/living/carbon/human/H = owner.current diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 07b5638f4931e..eafe75f96a8b1 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -106,12 +106,13 @@ desc = "This isn't right." icon = 'icons/effects/224x224.dmi' icon_state = "reality" + is_real = FALSE pixel_x = -96 pixel_y = -96 dissipate = 0 move_self = 0 - consume_range = 3 - grav_pull = 4 + consume_range = 0 + grav_pull = 5 current_size = STAGE_FOUR allowed_size = STAGE_FOUR @@ -139,9 +140,42 @@ C.spew_organ(3, 2) C.death() +//Dont eat turfs +/obj/singularity/wizard/eat() + for(var/turf/T as() in spiral_range_turfs(grav_pull, src)) + if(!T || !isturf(loc)) + continue + for(var/thing in T) + if(isturf(loc) && thing != src) + var/atom/movable/X = thing + X.singularity_pull(src, current_size) + CHECK_TICK + /obj/singularity/wizard/mapped/admin_investigate_setup() return +/obj/singularity/wizard/Bump(atom/A) + if(ismovableatom(A)) + free(A) + +/obj/singularity/wizard/Bumped(atom/movable/AM) + free(AM) + +/obj/singularity/wizard/consume(atom/A) + if(ismovableatom(A)) + free(A) + +/obj/singularity/wizard/proc/free(atom/movable/A) + if(!LAZYLEN(GLOB.destabliization_exits)) + if(ismob(A)) + to_chat(A, "There is no way out of this place...") + return + var/atom/return_thing = pick(GLOB.destabliization_exits) + var/turf/T = get_turf(return_thing) + if(!T) + return + A.forceMove(T) + /////////////////////////////////////////Scrying/////////////////// /obj/item/scrying @@ -189,7 +223,7 @@ /obj/item/scrying/attack_self(mob/user) visible_message("[user] stares into [src], their eyes glazing over.") - user.ghostize(1) + user.ghostize(TRUE) /////////////////////////////////////////Necromantic Stone/////////////////// @@ -264,12 +298,12 @@ H.dropItemToGround(I) var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionnaire) - H.equip_to_slot_or_del(new hat(H), SLOT_HEAD) - H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/roman(H), SLOT_W_UNIFORM) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), SLOT_SHOES) + H.equip_to_slot_or_del(new hat(H), ITEM_SLOT_HEAD) + H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/roman(H), ITEM_SLOT_ICLOTHING) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), ITEM_SLOT_FEET) H.put_in_hands(new /obj/item/shield/riot/roman(H), TRUE) H.put_in_hands(new /obj/item/claymore(H), TRUE) - H.equip_to_slot_or_del(new /obj/item/twohanded/spear(H), SLOT_BACK) + H.equip_to_slot_or_del(new /obj/item/spear(H), ITEM_SLOT_BACK) /obj/item/voodoo @@ -438,7 +472,7 @@ var/breakout = 0 while(breakout < 50) var/turf/potential_T = find_safe_turf() - if(T.z != potential_T.z || abs(get_dist_euclidian(potential_T,T)) > 50 - breakout) + if(T.get_virtual_z_level() != potential_T.get_virtual_z_level() || abs(get_dist_euclidian(potential_T,T)) > 50 - breakout) do_teleport(user, potential_T, channel = TELEPORT_CHANNEL_MAGIC) user.mobility_flags &= ~MOBILITY_MOVE T = potential_T diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 3ce0bf27d70ce..af5087b5c844f 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -60,6 +60,17 @@ A.death() return ..() +/obj/item/soulstone/Exited(mob/living/simple_animal/shade/S, atom/newLoc) + ..() + if(istype(S)) + // Things that *really should always* happen to the shade when it comes out should go here. + S.status_flags &= ~GODMODE + S.mobility_flags = MOBILITY_FLAGS_DEFAULT + S.cancel_camera() + if(purified) + S.icon_state = "ghost1" + S.name = "Purified [initial(S.name)]" + /obj/item/soulstone/proc/hot_potato(mob/living/user) to_chat(user, "Holy magics residing in \the [src] burn your hand!") var/obj/item/bodypart/affecting = user.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") @@ -80,6 +91,9 @@ return if(!ishuman(M))//If target is not a human. return ..() + if(M.mind && !M.mind.hasSoul) + to_chat(user, "That person has no soul!") + return if(iscultist(M)) if(iscultist(user)) to_chat(user, "\"Come now, do not capture your bretheren's soul.\"") @@ -106,14 +120,9 @@ /obj/item/soulstone/proc/release_shades(mob/user) for(var/mob/living/simple_animal/shade/A in src) - A.status_flags &= ~GODMODE - A.mobility_flags = MOBILITY_FLAGS_DEFAULT A.forceMove(get_turf(user)) - A.cancel_camera() if(purified) icon_state = "purified_soulstone" - A.icon_state = "ghost1" - A.name = "Purified [initial(A.name)]" else icon_state = "soulstone" name = initial(name) @@ -133,11 +142,11 @@ /obj/structure/constructshell/examine(mob/user) . = ..() if(iscultist(user) || iswizard(user) || user.stat == DEAD) - . += {"A construct shell, used to house bound souls from a soulstone.\n - Placing a soulstone with a soul into this shell allows you to produce your choice of the following:\n - An Artificer, which can produce more shells and soulstones, as well as fortifications.\n - A Wraith, which does high damage and can jaunt through walls, though it is quite fragile.\n - A Juggernaut, which is very hard to kill and can produce temporary walls, but is slow."} + . += "A construct shell, used to house bound souls from a soulstone.\n"+\ + "Placing a soulstone with a soul into this shell allows you to produce your choice of the following:\n"+\ + "An Artificer, which can produce more shells and soulstones, as well as fortifications.\n"+\ + "A Wraith, which does high damage and can jaunt through walls, though it is quite fragile.\n"+\ + "A Juggernaut, which is very hard to kill and can produce temporary walls, but is slow." /obj/structure/constructshell/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/soulstone)) @@ -191,6 +200,9 @@ to_chat(user, "Capture failed!: The soul has already fled its mortal frame. You attempt to bring it back...") getCultGhost(T,user) else + if(old_shard) //no insta cremating on the spot + to_chat(user, "Capture failed!: The old shard is not powerful enough to absorb the soul of this being.") + return FALSE for(var/obj/item/W in T) T.dropItemToGround(W) init_shade(T, user, vic = 1) @@ -270,7 +282,7 @@ var/datum/action/innate/seek_master/SM = new() SM.Grant(newstruct) newstruct.key = target.key - var/obj/screen/alert/bloodsense/BS + var/atom/movable/screen/alert/bloodsense/BS if(newstruct.mind && ((stoner && iscultist(stoner)) || cultoverride) && SSticker && SSticker.mode) SSticker.mode.add_cultist(newstruct.mind, 0) if(iscultist(stoner) || cultoverride) @@ -278,7 +290,7 @@ else if(stoner) to_chat(newstruct, "You are still bound to serve your creator, [stoner], follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.") newstruct.clear_alert("bloodsense") - BS = newstruct.throw_alert("bloodsense", /obj/screen/alert/bloodsense) + BS = newstruct.throw_alert("bloodsense", /atom/movable/screen/alert/bloodsense) if(BS) BS.Cviewer = newstruct newstruct.cancel_camera() diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index b1502e44d3093..baf7719cb5013 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -153,7 +153,7 @@ /datum/spellbook_entry/blind name = "Blind" - spell_type = /obj/effect/proc_holder/spell/pointed/trigger/blind + spell_type = /obj/effect/proc_holder/spell/targeted/blind cost = 1 /datum/spellbook_entry/mindswap @@ -389,7 +389,7 @@ name = "Bottle of Blood" desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim." item_path = /obj/item/antag_spawner/slaughter_demon - limit = 3 + limit = 1 category = "Assistance" /datum/spellbook_entry/item/hugbottle @@ -403,18 +403,18 @@ destructive." item_path = /obj/item/antag_spawner/slaughter_demon/laughter cost = 1 //non-destructive; it's just a jape, sibling! - limit = 3 + limit = 1 category = "Assistance" /datum/spellbook_entry/item/mjolnir name = "Mjolnir" desc = "A mighty hammer on loan from Thor, God of Thunder. It crackles with barely contained power." - item_path = /obj/item/twohanded/mjollnir + item_path = /obj/item/mjollnir /datum/spellbook_entry/item/singularity_hammer name = "Singularity Hammer" desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everything nearby to the point of impact." - item_path = /obj/item/twohanded/singularityhammer + item_path = /obj/item/singularityhammer /datum/spellbook_entry/item/battlemage name = "Battlemage Armour" @@ -437,6 +437,9 @@ category = "Mobility" cost = 1 +/// How much threat we need to let these rituals happen on dynamic +#define MINIMUM_THREAT_FOR_RITUALS 100 + /datum/spellbook_entry/summon name = "Summon Stuff" category = "Rituals" @@ -464,12 +467,6 @@ desc = "Spook the crew out by making them see dead people. Be warned, ghosts are capricious and occasionally vindicative, and some will use their incredibly minor abilities to frustrate you." cost = 0 -/datum/spellbook_entry/summon/ghosts/IsAvailable() - if(!SSticker.mode) - return FALSE - else - return TRUE - /datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) new /datum/round_event/wizard/ghost() @@ -485,6 +482,10 @@ /datum/spellbook_entry/summon/guns/IsAvailable() if(!SSticker.mode) // In case spellbook is placed on map return FALSE + if(istype(SSticker.mode, /datum/game_mode/dynamic)) // Disable events on dynamic + var/datum/game_mode/dynamic/mode = SSticker.mode + if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) + return FALSE return !CONFIG_GET(flag/no_summon_guns) /datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) @@ -502,6 +503,10 @@ /datum/spellbook_entry/summon/magic/IsAvailable() if(!SSticker.mode) // In case spellbook is placed on map return FALSE + if(istype(SSticker.mode, /datum/game_mode/dynamic)) // Disable events on dynamic + var/datum/game_mode/dynamic/mode = SSticker.mode + if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) + return FALSE return !CONFIG_GET(flag/no_summon_magic) /datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) @@ -520,6 +525,10 @@ /datum/spellbook_entry/summon/events/IsAvailable() if(!SSticker.mode) // In case spellbook is placed on map return FALSE + if(istype(SSticker.mode, /datum/game_mode/dynamic)) // Disable events on dynamic + var/datum/game_mode/dynamic/mode = SSticker.mode + if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) + return FALSE return !CONFIG_GET(flag/no_summon_events) /datum/spellbook_entry/summon/events/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) @@ -552,6 +561,8 @@ playsound(user, 'sound/magic/mandswap.ogg', 50, 1) return TRUE +#undef MINIMUM_THREAT_FOR_RITUALS + /obj/item/spellbook name = "spell book" desc = "An unearthly tome that glows with power." diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 16092be475858..2d227758fcffb 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -4,6 +4,7 @@ antagpanel_category = "Wizard" job_rank = ROLE_WIZARD antag_moodlet = /datum/mood_event/focused + hijack_speed = 0.5 var/strip = TRUE //strip before equipping var/allow_rename = TRUE var/hud_version = "wizard" @@ -11,7 +12,6 @@ var/move_to_lair = TRUE var/outfit_type = /datum/outfit/wizard var/wiz_age = WIZARD_AGE_MIN /* Wizards by nature cannot be too young. */ - can_hijack = HIJACK_HIJACKER show_to_ghosts = TRUE /datum/antagonist/wizard/on_gain() @@ -142,7 +142,9 @@ to_chat(owner, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.") to_chat(owner, "The spellbook is bound to you, and others cannot use it.") to_chat(owner, "In your pockets you will find a teleport scroll. Use it as needed.") - to_chat(owner,"Remember: do not forget to prepare your spells.") + to_chat(owner,"Remember: Do not forget to prepare your spells.") + owner.current.client?.tgui_panel?.give_antagonist_popup("Space Wizard", + "Prepare your spells and cause havok upon the accursed station.") /datum/antagonist/wizard/farewell() to_chat(owner, "You have been brainwashed! You are no longer a wizard!") @@ -247,17 +249,17 @@ if(!istype(master_mob) || !istype(H)) return if(master_mob.ears) - H.equip_to_slot_or_del(new master_mob.ears.type, SLOT_EARS) + H.equip_to_slot_or_del(new master_mob.ears.type, ITEM_SLOT_EARS) if(master_mob.w_uniform) - H.equip_to_slot_or_del(new master_mob.w_uniform.type, SLOT_W_UNIFORM) + H.equip_to_slot_or_del(new master_mob.w_uniform.type, ITEM_SLOT_ICLOTHING) if(master_mob.shoes) - H.equip_to_slot_or_del(new master_mob.shoes.type, SLOT_SHOES) + H.equip_to_slot_or_del(new master_mob.shoes.type, ITEM_SLOT_FEET) if(master_mob.wear_suit) - H.equip_to_slot_or_del(new master_mob.wear_suit.type, SLOT_WEAR_SUIT) + H.equip_to_slot_or_del(new master_mob.wear_suit.type, ITEM_SLOT_OCLOTHING) if(master_mob.head) - H.equip_to_slot_or_del(new master_mob.head.type, SLOT_HEAD) + H.equip_to_slot_or_del(new master_mob.head.type, ITEM_SLOT_HEAD) if(master_mob.back) - H.equip_to_slot_or_del(new master_mob.back.type, SLOT_BACK) + H.equip_to_slot_or_del(new master_mob.back.type, ITEM_SLOT_BACK) //Operation: Fuck off and scare people owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)) diff --git a/code/modules/aquarium/aquarium.dm b/code/modules/aquarium/aquarium.dm new file mode 100644 index 0000000000000..18db12d3620b8 --- /dev/null +++ b/code/modules/aquarium/aquarium.dm @@ -0,0 +1,255 @@ +#define AQUARIUM_LAYER_STEP 0.01 +/// Aquarium content layer offsets +#define AQUARIUM_MIN_OFFSET 0.01 +#define AQUARIUM_MAX_OFFSET 1 + +/obj/structure/aquarium + name = "aquarium" + density = TRUE + anchored = TRUE + + icon = 'icons/obj/aquarium.dmi' + icon_state = "aquarium_base" + + integrity_failure = 0.3 + + var/fluid_type = AQUARIUM_FLUID_FRESHWATER + var/fluid_temp = DEFAULT_AQUARIUM_TEMP + var/min_fluid_temp = MIN_AQUARIUM_TEMP + var/max_fluid_temp = MAX_AQUARIUM_TEMP + var/allow_breeding = FALSE + + var/glass_icon_state = "aquarium_glass" + var/broken_glass_icon_state = "aquarium_glass_broken" + + //This is the area where fish can swim + var/aquarium_zone_min_px = 2 + var/aquarium_zone_max_px = 31 + var/aquarium_zone_min_py = 10 + var/aquarium_zone_max_py = 24 + + var/list/fluid_types = list(AQUARIUM_FLUID_SALTWATER, AQUARIUM_FLUID_FRESHWATER, AQUARIUM_FLUID_SULPHWATEVER, AQUARIUM_FLUID_AIR) + + var/panel_open = TRUE + + ///Current layers in use by aquarium contents + var/list/used_layers = list() + + var/alive_fish = 0 + var/dead_fish = 0 + +/obj/structure/aquarium/Initialize() + . = ..() + update_icon() + RegisterSignal(src,COMSIG_PARENT_ATTACKBY, .proc/feed_feedback) + + +/obj/structure/aquarium/proc/request_layer(layer_type) + /** + * base aq layer + * min_offset = this value is returned on bottom layer mode + * min_offset + 0.1 fish1 + * min_offset + 0.2 fish2 + * ... these layers are returned for auto layer mode and tracked by used_layers + * min_offset + max_offset = this value is returned for top layer mode + * min_offset + max_offset + 1 = this is used for glass overlay + */ + //optional todo: hook up sending surface changed on aquarium changing layers + switch(layer_type) + if(AQUARIUM_LAYER_MODE_BOTTOM) + return layer + AQUARIUM_MIN_OFFSET + if(AQUARIUM_LAYER_MODE_TOP) + return layer + AQUARIUM_MAX_OFFSET + if(AQUARIUM_LAYER_MODE_AUTO) + var/chosen_layer = layer + AQUARIUM_MIN_OFFSET + AQUARIUM_LAYER_STEP + while((chosen_layer in used_layers) && (chosen_layer <= layer + AQUARIUM_MAX_OFFSET)) + chosen_layer += AQUARIUM_LAYER_STEP + used_layers += chosen_layer + return chosen_layer + +/obj/structure/aquarium/proc/free_layer(value) + used_layers -= value + +/obj/structure/aquarium/proc/get_surface_properties() + . = list() + .[AQUARIUM_PROPERTIES_PX_MIN] = aquarium_zone_min_px + .[AQUARIUM_PROPERTIES_PX_MAX] = aquarium_zone_max_px + .[AQUARIUM_PROPERTIES_PY_MIN] = aquarium_zone_min_py + .[AQUARIUM_PROPERTIES_PY_MAX] = aquarium_zone_max_py + +/obj/structure/aquarium/update_overlays() + . = ..() + if(panel_open) + . += "panel" + + //Glass overlay goes on top of everything else. + var/mutable_appearance/glass_overlay = mutable_appearance(icon,broken ? broken_glass_icon_state : glass_icon_state,layer=AQUARIUM_MAX_OFFSET-1) + . += glass_overlay + +/obj/structure/aquarium/examine(mob/user) + . = ..() + . += "Alt-click to [panel_open ? "close" : "open"] the control panel." + +/obj/structure/aquarium/AltClick(mob/user) + if(!user.canUseTopic(src, BE_CLOSE)) + return ..() + panel_open = !panel_open + update_icon() + +/obj/structure/aquarium/wrench_act(mob/living/user, obj/item/I) + if(default_unfasten_wrench(user,I)) + return TRUE + +/obj/structure/aquarium/attackby(obj/item/I, mob/living/user, params) + if(broken) + var/obj/item/stack/sheet/glass/glass = I + if(istype(glass)) + if(glass.get_amount() < 2) + to_chat(user, "You need two glass sheets to fix the case!") + return + to_chat(user, "You start fixing [src]...") + if(do_after(user, 2 SECONDS, target = src)) + glass.use(2) + broken = FALSE + obj_integrity = max_integrity + update_icon() + return TRUE + else + // This signal exists so we common items instead of adding component on init can just register creation of one in response. + // This way we can avoid the cost of 9999 aquarium components on rocks that will never see water in their life. + SEND_SIGNAL(I,COMSIG_AQUARIUM_BEFORE_INSERT_CHECK,src) + var/datum/component/aquarium_content/content_component = I.GetComponent(/datum/component/aquarium_content) + if(content_component && content_component.is_ready_to_insert(src)) + if(user.transferItemToLoc(I,src)) + update_icon() + return TRUE + else + return ..() + return ..() + +/obj/structure/aquarium/proc/feed_feedback(datum/source, obj/item/thing, mob/user, params) + SIGNAL_HANDLER + if(istype(thing, /obj/item/fish_feed)) + to_chat(user,"You feed the fish.") + return NONE + +/obj/structure/aquarium/interact(mob/user) + if(!broken && user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling)) + var/mob/living/living_pulled = user.pulling + SEND_SIGNAL(living_pulled, COMSIG_AQUARIUM_BEFORE_INSERT_CHECK,src) + var/datum/component/aquarium_content/content_component = living_pulled.GetComponent(/datum/component/aquarium_content) + if(content_component && content_component.is_ready_to_insert(src)) + try_to_put_mob_in(user) + else if(panel_open) + . = ..() //call base ui_interact + else + admire(user) + +/// Tries to put mob pulled by the user in the aquarium after a delay +/obj/structure/aquarium/proc/try_to_put_mob_in(mob/user) + if(user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling)) + var/mob/living/living_pulled = user.pulling + if(living_pulled.buckled || living_pulled.has_buckled_mobs()) + to_chat(user, "[living_pulled] is attached to something!") + return + user.visible_message("[user] starts to put [living_pulled] into [src]!") + if(do_after(user, 10 SECONDS, target = src)) + if(QDELETED(living_pulled) || user.pulling != living_pulled || living_pulled.buckled || living_pulled.has_buckled_mobs()) + return + var/datum/component/aquarium_content/content_component = living_pulled.GetComponent(/datum/component/aquarium_content) + if(content_component || content_component.is_ready_to_insert(src)) + return + user.visible_message("[user] stuffs [living_pulled] into [src]!") + living_pulled.forceMove(src) + update_icon() + +///Apply mood bonus depending on aquarium status +/obj/structure/aquarium/proc/admire(mob/user) + to_chat(user,"You take a moment to watch [src].") + if(do_after(user, 5 SECONDS, target = src)) + //Check if there are live fish - good mood + //All fish dead - bad mood. + //No fish - nothing. + if(alive_fish > 0) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "aquarium", /datum/mood_event/aquarium_positive) + else if(dead_fish > 0) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "aquarium", /datum/mood_event/aquarium_negative) + // Could maybe scale power of this mood with number/types of fish + +/obj/structure/aquarium/ui_data(mob/user) + . = ..() + .["fluid_type"] = fluid_type + .["temperature"] = fluid_temp + .["allow_breeding"] = allow_breeding + var/list/content_data = list() + for(var/atom/movable/fish in contents) + content_data += list(list("name"=fish.name,"ref"=ref(fish))) + .["contents"] = content_data + +/obj/structure/aquarium/ui_static_data(mob/user) + . = ..() + //I guess these should depend on the fluid so lava critters can get high or stuff below water freezing point but let's keep it simple for now. + .["minTemperature"] = min_fluid_temp + .["maxTemperature"] = max_fluid_temp + .["fluidTypes"] = fluid_types + +/obj/structure/aquarium/ui_act(action, params) + . = ..() + if(.) + return + var/mob/user = usr + switch(action) + if("temperature") + var/temperature = params["temperature"] + if(isnum(temperature)) + fluid_temp = clamp(temperature, min_fluid_temp, max_fluid_temp) + . = TRUE + if("fluid") + if(params["fluid"] in fluid_types) + fluid_type = params["fluid"] + SEND_SIGNAL(src, COMSIG_AQUARIUM_FLUID_CHANGED, fluid_type) + . = TRUE + if("allow_breeding") + allow_breeding = !allow_breeding + . = TRUE + if("remove") + var/atom/movable/inside = locate(params["ref"]) in contents + if(inside) + if(isitem(inside)) + user.put_in_hands(inside) + else + inside.forceMove(get_turf(src)) + to_chat(user,"You take out [inside] from [src].") + +/obj/structure/aquarium/ui_interact(mob/user, datum/tgui/ui) + . = ..() + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Aquarium", name) + ui.open() + +/obj/structure/aquarium/obj_break(damage_flag) + . = ..() + if(!broken) + aquarium_smash() + +/obj/structure/aquarium/proc/aquarium_smash() + broken = TRUE + var/possible_destinations_for_fish = list() + var/droploc = drop_location() + if(isturf(droploc)) + possible_destinations_for_fish = get_adjacent_open_turfs(droploc) + else + possible_destinations_for_fish = list(droploc) + playsound(src, 'sound/effects/glassbr3.ogg', 100, TRUE) + for(var/atom/movable/fish in contents) + fish.forceMove(pick(possible_destinations_for_fish)) + if(fluid_type != AQUARIUM_FLUID_AIR) + var/datum/reagents/reagent_splash = new() + reagent_splash.add_reagent(/datum/reagent/water, 30) + chem_splash(droploc, 3, list(reagent_splash)) + update_icon() + +#undef AQUARIUM_LAYER_STEP +#undef AQUARIUM_MIN_OFFSET +#undef AQUARIUM_MAX_OFFSET diff --git a/code/modules/aquarium/aquarium_behaviour.dm b/code/modules/aquarium/aquarium_behaviour.dm new file mode 100644 index 0000000000000..4a7145473f13e --- /dev/null +++ b/code/modules/aquarium/aquarium_behaviour.dm @@ -0,0 +1,301 @@ +//Fish breeding stops if fish count exceeds this. +#define AQUARIUM_MAX_BREEDING_POPULATION 20 + +// Configuration objects defining prop/fish behaviour in the aquarium +// These are used as a base for autogenerating the actual instances +/datum/aquarium_behaviour + var/name = "base aquarium element" + var/desc = "" + + var/unique = FALSE + + var/icon = 'icons/obj/aquarium.dmi' + /// Icon state used for catalog/autogenerated fish item. Also used as basis for in aquarium visual if dedicated_in_aquarium_icon_state is not set. + var/icon_state + /// Applied and item/catalog for use with greyscaled icons. + var/color + + /// How the thing will be layered + var/layer_mode = AQUARIUM_LAYER_MODE_AUTO + /// If the starting position is randomised within bounds. + var/randomize_position = FALSE + + /** + * Fish sprite how to: + * Need to be centered on 16,16 in the dmi and facing left by default. + * sprite_height/sprite_width is the size it will have in aquarium and used to control animation boundaries. + * source_height/source_width is the size of the original icon (ideally only the non-empty parts) + */ + + /// If this is set this icon state will be used for the holder while icon_state will only be used for item/catalog. Transformation from source_width/height WON'T be applied. + var/dedicated_in_aquarium_icon_state + /// Applied to vc object only for use with greyscaled icons. + var/aquarium_vc_color + + //Target sprite size for path/position calculations. + var/sprite_height = 3 + var/sprite_width = 3 + //This is the size of the source sprite. This will be used to calculate scale down factor. + var/source_width = 32 + var/source_height = 32 + + /// Current animation + var/current_animation + + /// Does this behviour need additional processing in aquarium, will be added to SSobj processing on insertion + var/processing = FALSE + + /// Our holder component + var/datum/component/aquarium_content/parent + +/// Applies icon,color and base scaling to our visual holder +/datum/aquarium_behaviour/proc/apply_appearance(obj/effect/holder) + holder.icon = icon + if(dedicated_in_aquarium_icon_state) + holder.icon_state = dedicated_in_aquarium_icon_state + else + holder.icon_state = icon_state + holder.transform = base_transform() + if(aquarium_vc_color) + holder.color = aquarium_vc_color + +// Generates scaling matrix for our visual +/datum/aquarium_behaviour/proc/base_transform() + var/matrix/matrix = matrix() + if(!dedicated_in_aquarium_icon_state) + var/x_scale = sprite_width / source_width + var/y_scale = sprite_height / source_height + matrix.Scale(x_scale, y_scale) + return matrix + +/// Called when fed. +/datum/aquarium_behaviour/proc/on_feeding(datum/reagents/feed_reagents) + return + +/// Called when aquarium fluid changes. +/datum/aquarium_behaviour/proc/on_fluid_changed() + return + +/// Called to update current animation based on state +/datum/aquarium_behaviour/proc/update_animation() + return + +/// Called when inserted into new aquarium +/datum/aquarium_behaviour/proc/on_inserted() + if(processing) + START_PROCESSING(SSobj, src) + +/// Called just before the object gets removed from the aquarium +/datum/aquarium_behaviour/proc/before_removal() + return + +/datum/aquarium_behaviour/Destroy(force, ...) + STOP_PROCESSING(SSobj, src) + parent = null + return ..() + +/datum/aquarium_behaviour/prop + name = "aquarium prop" + unique = TRUE + layer_mode = AQUARIUM_LAYER_MODE_BOTTOM + + // Prop sprites do not need any scaling they go 1:1 + sprite_width = 32 + sprite_height = 32 + source_width = 32 + source_height = 32 + +/datum/aquarium_behaviour/prop/rocks + name = "rocks" + icon_state = "rocks" + +/datum/aquarium_behaviour/prop/seaweed_top + name = "dense seaweeds" + icon_state = "seaweeds_front" + layer_mode = AQUARIUM_LAYER_MODE_TOP + +/datum/aquarium_behaviour/prop/seaweed + name = "seaweeds" + icon_state = "seaweeds_back" + layer_mode = AQUARIUM_LAYER_MODE_BOTTOM + +/datum/aquarium_behaviour/prop/rockfloor + name = "rock floor" + icon_state = "rockfloor" + layer_mode = AQUARIUM_LAYER_MODE_BOTTOM + +/datum/aquarium_behaviour/prop/treasure + name = "tiny treasure chest" + icon_state = "treasure" + layer_mode = AQUARIUM_LAYER_MODE_BOTTOM + +/datum/aquarium_behaviour/fish + name = "generic fish" + icon_state = "fish_greyscale" + randomize_position = TRUE //We have random starting point of our swim path + + current_animation = AQUARIUM_ANIMATION_FISH_SWIM + processing = TRUE + + // Default size of the "greyscale_fish" icon_state + sprite_height = 3 + sprite_width = 3 + + /// Required fluid type for this fish to live. + var/required_fluid_type = AQUARIUM_FLUID_FRESHWATER + + /// Required minimum temperature for the fish to live. + var/required_temperature_min = MIN_AQUARIUM_TEMP + /// Maximum possible temperature for the fish to live. + var/required_temperature_max = MAX_AQUARIUM_TEMP + + /// What type of reagent this fish needs to be fed. + var/food = /datum/reagent/consumable/nutriment + /// How often the fish needs to be fed + var/feeding_frequency = 5 MINUTES + /// Time of last feedeing + var/last_feeding + + /// Fish status + var/status = FISH_ALIVE + + /// Current fish health. Dies at 0. + var/health = 100 + + /// Should this fish type show in fish catalog + var/show_in_catalog = TRUE + /// Should this fish spawn in random fish cases + var/availible_in_random_cases = TRUE + /// How rare this fish is in the random cases + var/random_case_rarity = FISH_RARITY_BASIC + + /// Fish autogenerated from this behaviour will be processable into this + var/fillet_type = /obj/item/reagent_containers/food/snacks/carpmeat/icantbeliveitsnotcarp + + /// Won't breed more than this amount in single aquarium. + var/stable_population = 1 + /// Last time new fish was created + var/last_breeding + /// How long it takes to produce new fish + var/breeding_timeout = 2 MINUTES + +/datum/aquarium_behaviour/fish/on_inserted() + . = ..() + if(isnull(last_feeding)) //Fish start fed. + last_feeding = world.time + if(status == FISH_DEAD) + parent.current_aquarium.dead_fish += 1 + else + parent.current_aquarium.alive_fish += 1 + parent.stop_flopping() + +/datum/aquarium_behaviour/fish/before_removal() + . = ..() + if(status == FISH_DEAD) + parent.current_aquarium.dead_fish -= 1 + else + parent.current_aquarium.alive_fish -= 1 + //We do not stop processing properties here. We want fish to die outside of aquariums after first insert. We only stop processing in properties.death or destroy + if(!QDELETED(parent) && status != FISH_DEAD) + parent.start_flopping() + +/datum/aquarium_behaviour/fish/on_fluid_changed() + //In case we'll flop to bottom from this or go back to swimming. + update_animation() + +/// Updates our animation variable based on state and prompts component to animate it. +/datum/aquarium_behaviour/fish/update_animation() + var/obj/structure/aquarium/aquarium = parent.current_aquarium + var/old_animation = current_animation + if(!aquarium || aquarium.fluid_type == AQUARIUM_FLUID_AIR || status == FISH_DEAD) + current_animation = AQUARIUM_ANIMATION_FISH_DEAD + else + current_animation = AQUARIUM_ANIMATION_FISH_SWIM + if(aquarium && old_animation != current_animation) + parent.generate_animation() + +/datum/aquarium_behaviour/fish/on_feeding(datum/reagents/feed_reagents) + if(feed_reagents.has_reagent(food)) + last_feeding = world.time + +/// Checks if our current environment lets us live. +/datum/aquarium_behaviour/fish/proc/proper_environment() + var/obj/structure/aquarium/aquarium = parent.current_aquarium + if(!aquarium) + return FALSE + if(aquarium.fluid_type != required_fluid_type) + return FALSE + if(aquarium.fluid_temp < required_temperature_min || aquarium.fluid_temp > required_temperature_max) + return FALSE + return TRUE + +/datum/aquarium_behaviour/fish/process(delta_time) + set waitfor = FALSE + + var/health_change_per_second = 0 + if(!proper_environment()) + health_change_per_second -= 3 //Dying here + if(world.time - last_feeding >= feeding_frequency) + health_change_per_second -= 0.5 //Starving + else + health_change_per_second += 0.5 //Slowly healing + health = clamp(health + health_change_per_second * delta_time, 0, initial(health)) + if(health <= 0) + death() + else if(ready_to_reproduce()) + try_to_reproduce() + +/datum/aquarium_behaviour/fish/proc/death() + STOP_PROCESSING(SSobj, src) + status = FISH_DEAD + var/message = "\The [name] dies." + if(parent.current_aquarium) + parent.current_aquarium.visible_message(message) + parent.current_aquarium.alive_fish -= 1 + parent.current_aquarium.dead_fish += 1 + else + var/atom/movable/AM = parent.parent + AM.visible_message(message) + parent.stop_flopping() + update_animation() + +/datum/aquarium_behaviour/fish/proc/ready_to_reproduce() + return parent.current_aquarium && parent.current_aquarium.allow_breeding && health == initial(health) && stable_population > 1 && world.time - last_breeding >= breeding_timeout + +/datum/aquarium_behaviour/fish/proc/try_to_reproduce() + if(!parent.current_aquarium) + return + if(parent.current_aquarium.alive_fish + parent.current_aquarium.dead_fish >= AQUARIUM_MAX_BREEDING_POPULATION) //so aquariums full of fish don't need to do these expensive checks + return + var/list/other_fish_of_same_type = list() + for(var/atom/movable/fish_or_prop in parent.current_aquarium) + if(fish_or_prop == parent.parent) + continue + var/datum/component/aquarium_content/other_content = fish_or_prop.GetComponent(/datum/component/aquarium_content) + if(other_content && other_content.properties.type == type) + other_fish_of_same_type += other_content.properties + if(length(other_fish_of_same_type) >= stable_population) + return + var/datum/aquarium_behaviour/fish/second_fish + for(var/datum/aquarium_behaviour/fish/other_fish in other_fish_of_same_type) + if(other_fish.ready_to_reproduce()) + second_fish = other_fish + break + if(second_fish) + generate_fish(parent.current_aquarium,type) + last_breeding = world.time + second_fish.last_breeding = world.time + +/// This path exists mostly for admin abuse. +/datum/aquarium_behaviour/fish/auto + name = "automatic fish" + desc = "generates fish appearance automatically from component parent appearance" + availible_in_random_cases = FALSE + sprite_width = 8 + sprite_height = 8 + show_in_catalog = FALSE + +/datum/aquarium_behaviour/fish/auto/apply_appearance(obj/effect/holder) + holder.appearance = parent.parent + holder.transform = base_transform() + holder.dir = WEST diff --git a/code/modules/aquarium/fish.dm b/code/modules/aquarium/fish.dm new file mode 100644 index 0000000000000..fd75157762bf7 --- /dev/null +++ b/code/modules/aquarium/fish.dm @@ -0,0 +1,177 @@ +// Fish path used for autogenerated fish +/obj/item/fish + name = "generic looking aquarium fish" + desc = "very bland" + w_class = WEIGHT_CLASS_TINY + +/// Automatically generates object of given base path from the behaviour type in loc +/proc/generate_fish(loc,behaviour_type,base_path=/obj/item/fish) + var/datum/aquarium_behaviour/behaviour = behaviour_type + var/obj/item/fish = new base_path(loc) + fish.name = initial(behaviour.name) + fish.icon = initial(behaviour.icon) + fish.icon_state = initial(behaviour.icon_state) + fish.desc = initial(behaviour.desc) + if(initial(behaviour.color)) + fish.add_atom_colour(initial(behaviour.color), FIXED_COLOUR_PRIORITY) + fish.AddElement(/datum/element/deferred_aquarium_content, behaviour_type) + return fish + +/// Returns random fish, using random_case_rarity probabilities. +/proc/random_fish_type(case_fish_only=TRUE, required_fluid) + var/static/probability_table + var/argkey = "fish_[required_fluid]_[case_fish_only]" //If this expands more extract bespoke element arg generation to some common helper. + if(!probability_table || !probability_table[argkey]) + if(!probability_table) + probability_table = list() + var/chance_table = list() + for(var/_fish_behavior in subtypesof(/datum/aquarium_behaviour/fish)) + var/datum/aquarium_behaviour/fish/fish_behavior = _fish_behavior + if(required_fluid && initial(fish_behavior.required_fluid_type) != required_fluid) + continue + if(initial(fish_behavior.availible_in_random_cases) || !case_fish_only) + chance_table[fish_behavior] = initial(fish_behavior.random_case_rarity) + probability_table[argkey] = chance_table + return pickweight(probability_table[argkey]) + +// Actual fish definitions below - there's no specific paths, they are autogenerated from behaviours + +// Freshwater fish + +/datum/aquarium_behaviour/fish/goldfish + name = "goldfish" + desc = "Despite common belief, goldfish do not have three-second memories. They can actually remember things that happened up to three months ago." + icon_state = "goldfish" + sprite_width = 8 + sprite_height = 8 + stable_population = 3 + +/datum/aquarium_behaviour/fish/angelfish + name = "angelfish" + desc = "Young Angelfish often live in groups, while adults prefer solitary life. They become territorial and aggressive toward other fish when they reach adulthood." + icon_state = "angelfish" + dedicated_in_aquarium_icon_state = "bigfish" + sprite_height = 7 + source_height = 7 + stable_population = 3 + +/datum/aquarium_behaviour/fish/guppy + name = "guppy" + desc = "Guppy is also known as rainbow fish because of the brightly colored body and fins." + icon_state = "guppy" + dedicated_in_aquarium_icon_state = "fish_greyscale" + aquarium_vc_color = "#91AE64" + sprite_width = 8 + sprite_height = 5 + stable_population = 6 + +/datum/aquarium_behaviour/fish/plasmatetra + name = "plasma tetra" + desc = "Due to their small size, tetras are prey to many predators in their watery world, including eels, crustaceans, and invertebrates." + icon_state = "plastetra" + dedicated_in_aquarium_icon_state = "fish_greyscale" + aquarium_vc_color = "#D30EB0" + stable_population = 3 + +/datum/aquarium_behaviour/fish/catfish + name = "cory catfish" + desc = "A catfish has about 100,000 taste buds, and their bodies are covered with them to help detect chemicals present in the water and also to respond to touch." + icon_state = "catfish" + dedicated_in_aquarium_icon_state = "fish_greyscale" + aquarium_vc_color = "#907420" + stable_population = 3 + +/datum/aquarium_behaviour/fish/spacecarp + name = "space carp" + desc = "This space predator fish is known to cause yearly damage to space stations during their migrations." + icon_state = "carp" + sprite_width = 8 + sprite_height = 8 + availible_in_random_cases = FALSE + +// Saltwater fish below + +/datum/aquarium_behaviour/fish/clownfish + name = "clownfish" + desc = "Clownfish catch prey by swimming onto the reef, attracting larger fish, and luring them back to the anemone. The anemone will sting and eat the larger fish, leaving the remains for the clownfish." + icon_state = "clownfish" + dedicated_in_aquarium_icon_state = "clownfish_small" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + sprite_width = 8 + sprite_height = 5 + stable_population = 4 + +/datum/aquarium_behaviour/fish/cardinal + name = "cardinalfish" + desc = "Cardinalfish are often found near sea urchins, where the fish hide when threatened." + icon_state = "cardinalfish" + dedicated_in_aquarium_icon_state = "fish_greyscale" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 4 + +/datum/aquarium_behaviour/fish/greenchromis + name = "green chromis" + desc = "The Chromis can vary in color from blue to green depending on the lighting and distance from the lights." + icon_state = "greenchromis" + dedicated_in_aquarium_icon_state = "fish_greyscale" + aquarium_vc_color = "#00ff00" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 5 + +/datum/aquarium_behaviour/fish/firefish + name = "firefish goby" + desc = "To communicate in the wild, the firefish uses its dorsal fin to alert others of potential danger." + icon_state = "firefish" + sprite_width = 6 + sprite_height = 5 + required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 3 + +/datum/aquarium_behaviour/fish/pufferfish + name = "pufferfish" + desc = "One Pufferfish contains enough toxins in its liver to kill 30 people." + icon_state = "pufferfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + sprite_width = 8 + sprite_height = 8 + stable_population = 3 + +/datum/aquarium_behaviour/fish/lanternfish + name = "lanternfish" + desc = "Typically found in areas below 6600 feet below the surface of the ocean, they live in complete darkness." + icon_state = "lanternfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + random_case_rarity = FISH_RARITY_VERY_RARE + source_width = 28 + source_height = 21 + sprite_width = 8 + sprite_height = 8 + stable_population = 3 + +/datum/aquarium_behaviour/fish/dwarf_moonfish + name = "dwarf moonfish" + desc = "Ordinarily in the wild, the Zagoskian moonfish is around the size of a tuna, however through selective breeding a smaller breed suitable for being kept as an aquarium pet has been created." + icon_state = "dwarf_moonfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 2 + +/datum/aquarium_behaviour/fish/gunner_jellyfish + name = "gunner jellyfish" + desc = "So called due to their resemblance to an artillery shell, the gunner jellyfish is native to Tizira, where it is enjoyed as a delicacy. Produces a mild hallucinogen that is destroyed by cooking." + icon_state = "gunner_jellyfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 4 + +/datum/aquarium_behaviour/fish/needlefish + name = "needlefish" + desc = "A tiny, transparent fish which resides in large schools in the oceans of Tizira. A common food for other, larger fish." + icon_state = "needlefish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 12 + +/datum/aquarium_behaviour/fish/armorfish + name = "armorfish" + desc = "A small shellfish native to Tizira's oceans, known for its exceptionally hard shell. Consumed similarly to prawns." + icon_state = "armorfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 10 diff --git a/code/modules/aquarium/misc.dm b/code/modules/aquarium/misc.dm new file mode 100644 index 0000000000000..23cd565d4dca3 --- /dev/null +++ b/code/modules/aquarium/misc.dm @@ -0,0 +1,124 @@ +#define AQUARIUM_COMPANY "Aquatech Ltd." + +// Fish feed can +/obj/item/fish_feed + name = "fish feed can" + desc = "Autogenerates nutritious fish feed based on sample inside." + icon = 'icons/obj/aquarium.dmi' + icon_state = "fish_feed" + w_class = WEIGHT_CLASS_TINY + +/obj/item/fish_feed/Initialize() + . = ..() + create_reagents(5, OPENCONTAINER) + reagents.add_reagent(/datum/reagent/consumable/nutriment, 1) //Default fish diet + +// Stasis fish case container for moving fish between aquariums safely. +/obj/item/storage/fish_case + name = "stasis fish case" + desc = "A small case keeping the fish inside in stasis." + icon_state = "fishbox" + + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + + component_type = /datum/component/storage/concrete/fish_case + +/obj/item/storage/fish_case/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_FISH_SAFE_STORAGE, TRAIT_GENERIC) + +/// Fish case with single random fish inside. +/obj/item/storage/fish_case/random/PopulateContents() + . = ..() + generate_fish(src, select_fish_type()) + +/obj/item/storage/fish_case/random/proc/select_fish_type() + return random_fish_type() + +/obj/item/storage/fish_case/random/freshwater/select_fish_type() + return random_fish_type(required_fluid=AQUARIUM_FLUID_FRESHWATER) + +/// Book detailing where to get the fish and their properties. +/obj/item/book/fish_catalog + name = "Fish Encyclopedia" + desc = "Indexes all fish known to mankind (and related species)" + icon_state = "fishbook" + dat = "Lot of fish stuff" //book wrappers could use cleaning so this is not necessary + +/obj/item/book/fish_catalog/on_read(mob/user) + ui_interact(user) + +/obj/item/book/fish_catalog/ui_interact(mob/user, datum/tgui/ui) + . = ..() + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "FishCatalog", name) + ui.open() + +/obj/item/book/fish_catalog/ui_static_data(mob/user) + . = ..() + var/static/fish_info + if(!fish_info) + fish_info = list() + for(var/_fish_behaviour in subtypesof(/datum/aquarium_behaviour/fish)) + var/datum/aquarium_behaviour/fish/fish_behaviour = _fish_behaviour + var/list/fish_data = list() + if(!initial(fish_behaviour.show_in_catalog)) + continue + fish_data["name"] = initial(fish_behaviour.name) + fish_data["desc"] = initial(fish_behaviour.desc) + fish_data["fluid"] = initial(fish_behaviour.required_fluid_type) + fish_data["temp_min"] = initial(fish_behaviour.required_temperature_min) + fish_data["temp_max"] = initial(fish_behaviour.required_temperature_max) + fish_data["icon"] = sanitize_css_class_name("[initial(fish_behaviour.icon)][initial(fish_behaviour.icon_state)]") + fish_data["color"] = initial(fish_behaviour.color) + fish_data["source"] = initial(fish_behaviour.availible_in_random_cases) ? "[AQUARIUM_COMPANY] Fish Packs" : "Unknown" + var/datum/reagent/food_type = initial(fish_behaviour.food) + if(food_type != /datum/reagent/consumable/nutriment) + fish_data["feed"] = initial(food_type.name) + else + fish_data["feed"] = "[AQUARIUM_COMPANY] Fish Feed" + fish_info += list(fish_data) + + .["fish_info"] = fish_info + .["sponsored_by"] = AQUARIUM_COMPANY + +/obj/item/book/fish_catalog/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/fish) + ) + +/obj/item/aquarium_kit + name = "DIY Aquarium Construction Kit" + desc = "Everything you need to build your own aquarium.(Raw materials sold separately)" + icon = 'icons/obj/aquarium.dmi' + icon_state = "construction_kit" + w_class = WEIGHT_CLASS_TINY + +/obj/item/aquarium_kit/attack_self(mob/user) + . = ..() + to_chat(user,"There's instruction and tools necessary to build aquarium inside. All you need is to start crafting.") + + +/obj/item/aquarium_prop + name = "generic aquarium prop" + desc = "very boring" + w_class = WEIGHT_CLASS_TINY + +/obj/item/storage/box/aquarium_props + name = "aquarium props box" + desc = "All you need to make your aquarium look good" + +/obj/item/storage/box/aquarium_props/PopulateContents() + for(var/prop_type in subtypesof(/datum/aquarium_behaviour/prop)) + generate_fish(src, prop_type, /obj/item/aquarium_prop) + +/obj/item/storage/box/fish_debug + name = "box full of fish" + +/obj/item/storage/box/fish_debug/PopulateContents() + for(var/fish_type in subtypesof(/datum/aquarium_behaviour/fish)) + generate_fish(src,fish_type) + +#undef AQUARIUM_COMPANY diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 567fc6d014994..a6ad3c3f10bd3 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -29,6 +29,10 @@ var/next_activate = 0 //When we're next allowed to activate - for spam control var/activate_delay = 30 +/obj/item/assembly/Destroy() + holder = null + return ..() + /obj/item/assembly/get_part_rating() return 1 @@ -125,3 +129,8 @@ /obj/item/assembly/interact(mob/user) return ui_interact(user) + +/obj/item/assembly/ui_status(mob/user) + . = ..() + if(src.can_interact(user) || holder?.can_interact(user)) + return UI_INTERACTIVE diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 1b5e957603d19..04cb3c8785eec 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -138,7 +138,7 @@ return /obj/item/tank/proc/ignite() //This happens when a bomb is told to explode - var/fuel_moles = air_contents.get_moles(/datum/gas/plasma) + air_contents.get_moles(/datum/gas/oxygen)/6 + var/fuel_moles = air_contents.get_moles(GAS_PLASMA) + air_contents.get_moles(GAS_O2)/6 var/datum/gas_mixture/bomb_mixture = air_contents.copy() var/strength = 1 @@ -190,11 +190,10 @@ ground_zero.air_update_turf() /obj/item/tank/proc/release() //This happens when the bomb is not welded. Tank contents are just spat out. - var/datum/gas_mixture/removed = air_contents.remove(air_contents.total_moles()) var/turf/T = get_turf(src) if(!T) return - T.assume_air(removed) + T.assume_air(air_contents) air_update_turf() /obj/item/onetankbomb/return_analyzable_air() diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 01fc70ebe099a..8edc3a9556412 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -14,7 +14,7 @@ flags_1 = CONDUCT_1 throw_speed = 3 throw_range = 7 - var/charges_left = 15 + var/charges_left = 10 /obj/item/flashbulb/update_icon() if(charges_left <= 0) @@ -42,13 +42,36 @@ name = "weakened flashbulb" charges_left = 4 -/obj/item/flashbulb/strong +/obj/item/flashbulb/recharging + charges_left = 3 + var/max_charges = 3 + var/charge_time = 10 SECONDS + var/recharging = FALSE + +/obj/item/flashbulb/recharging/proc/recharge() + recharging = FALSE + if(charges_left >= max_charges) + return + charges_left ++ + icon_state = "flashbulb" + if(charges_left < max_charges) + addtimer(CALLBACK(src, .proc/recharge), charge_time, TIMER_UNIQUE) + recharging = TRUE + +/obj/item/flashbulb/recharging/use_flashbulb() + . = ..() + if(!recharging) + addtimer(CALLBACK(src, .proc/recharge), charge_time, TIMER_UNIQUE) + recharging = TRUE + +/obj/item/flashbulb/recharging/revolution name = "modified flashbulb" - charges_left = 120 + charges_left = 10 + max_charges = 10 + charge_time = 15 SECONDS -/obj/item/flashbulb/cyborg +/obj/item/flashbulb/recharging/cyborg name = "cyborg flashbulb" - charges_left = INFINITY /obj/item/assembly/flash name = "flash" @@ -73,7 +96,7 @@ bulb = /obj/item/flashbulb/weak /obj/item/assembly/flash/handheld/strong - bulb = /obj/item/flashbulb/strong + bulb = /obj/item/flashbulb/recharging/revolution /obj/item/assembly/flash/Initialize() . = ..() @@ -147,6 +170,9 @@ if(!bulb) to_chat(user, "There is no bulb in \the [src].") return FALSE + if(flags_1 & NODECONSTRUCT_1) + to_chat(user, "You cannot remove the bulb from \the [src].") + return FALSE bulb.forceMove(drop_location()) user.put_in_hands(bulb) bulb.update_icon() @@ -184,6 +210,10 @@ return FALSE if(FLASH_USE_BURNOUT) burn_out() + if(is_head_revolutionary(user) && !burnt_out) + //Flash will drain to a minimum of 1 charge when used by a head rev. + if(bulb.charges_left < rand(2, initial(bulb.charges_left) - 1)) + bulb.charges_left ++ last_trigger = world.time playsound(src, 'sound/weapons/flash.ogg', 100, TRUE) flash_lighting_fx(FLASH_LIGHT_RANGE, light_power, light_color) @@ -232,9 +262,7 @@ log_combat(user, R, "flashed", src) update_icon(1) R.Paralyze(70) - var/diff = 5 * CONFUSION_STACK_MAX_MULTIPLIER - M.confused - R.confused += min(5, diff) - R.flash_act(affect_silicon = 1, type = /obj/screen/fullscreen/flash/static) + R.flash_act(affect_silicon = 1, type = /atom/movable/screen/fullscreen/flash/static) user.visible_message("[user] overloads [R]'s sensors with the flash!", "You overload [R]'s sensors with the flash!") return TRUE @@ -278,7 +306,7 @@ /obj/item/assembly/flash/cyborg - bulb = /obj/item/flashbulb/cyborg + bulb = /obj/item/flashbulb/recharging/cyborg /obj/item/assembly/flash/cyborg/attack(mob/living/M, mob/user) ..() @@ -311,19 +339,22 @@ desc = "A high-powered photon projector implant normally used for lighting purposes, but also doubles as a flashbulb weapon. Self-repair protocols fix the flashbulb if it ever burns out." var/flashcd = 20 var/overheat = 0 - var/obj/item/organ/cyberimp/arm/flash/I = null + //Wearef to our arm + var/datum/weakref/arm /obj/item/assembly/flash/armimplant/burn_out() - if(I?.owner) - to_chat(I.owner, "Your photon projector implant overheats and deactivates!") - I.Retract() + var/obj/item/organ/cyberimp/arm/flash/real_arm = arm.resolve() + if(real_arm?.owner) + to_chat(real_arm.owner, "Your photon projector implant overheats and deactivates!") + real_arm.Retract() overheat = TRUE addtimer(CALLBACK(src, .proc/cooldown), flashcd * 2) /obj/item/assembly/flash/armimplant/try_use_flash(mob/user = null) if(overheat) - if(I?.owner) - to_chat(I.owner, "Your photon projector is running too hot to be used again so quickly!") + var/obj/item/organ/cyberimp/arm/flash/real_arm = arm.resolve() + if(real_arm?.owner) + to_chat(real_arm.owner, "Your photon projector is running too hot to be used again so quickly!") return FALSE overheat = TRUE addtimer(CALLBACK(src, .proc/cooldown), flashcd) @@ -343,7 +374,7 @@ flashing_overlay = "flash-hypno" light_color = LIGHT_COLOR_PINK cooldown = 20 - bulb = /obj/item/flashbulb/cyborg //Flashbulb with infinite charges + bulb = /obj/item/flashbulb/recharging/revolution /obj/item/assembly/flash/hypnotic/burn_out() return @@ -362,20 +393,19 @@ to_chat(M, "[src] emits a soothing light...") if(targeted) if(M.flash_act(1, 1)) - var/hypnosis = FALSE - if(M.hypnosis_vulnerable()) - hypnosis = TRUE if(user) user.visible_message("[user] blinds [M] with the flash!", "You hypno-flash [M]!") - if(!hypnosis) + if(M.hypnosis_vulnerable()) + M.apply_status_effect(/datum/status_effect/trance, 200, TRUE) + else to_chat(M, "The light makes you feel oddly relaxed...") M.confused += min(M.confused + 10, 20) M.dizziness += min(M.dizziness + 10, 20) M.drowsyness += min(M.drowsyness + 10, 20) M.apply_status_effect(STATUS_EFFECT_PACIFY, 100) - else - M.apply_status_effect(/datum/status_effect/trance, 200, TRUE) + + else if(user) user.visible_message("[user] fails to blind [M] with the flash!", "You fail to hypno-flash [M]!") diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm index 4a7190bdad850..7d8ef4e068be5 100644 --- a/code/modules/assembly/health.dm +++ b/code/modules/assembly/health.dm @@ -5,13 +5,14 @@ materials = list(/datum/material/iron=800, /datum/material/glass=200) attachable = TRUE - var/scanning = TRUE + var/scanning = FALSE var/health_scan var/alarm_health = HEALTH_THRESHOLD_CRIT /obj/item/assembly/health/examine(mob/user) . = ..() - . += "Use a multitool to swap between \"detect death\" mode and \"detect critical state\" mode." + . += "Use it in hand to turn it off/on and Alt-click to swap between \"detect death\" mode and \"detect critical state\" mode." + . += "[src.scanning ? "The sensor is on and you can see [health_scan] displayed on the screen" : "The sensor is off"]." /obj/item/assembly/health/activate() if(!..()) @@ -29,14 +30,13 @@ update_icon() return secured -/obj/item/assembly/health/multitool_act(mob/living/user, obj/item/I) +/obj/item/assembly/health/AltClick(mob/living/user) if(alarm_health == HEALTH_THRESHOLD_CRIT) alarm_health = HEALTH_THRESHOLD_DEAD to_chat(user, "You toggle [src] to \"detect death\" mode.") else alarm_health = HEALTH_THRESHOLD_CRIT to_chat(user, "You toggle [src] to \"detect critical state\" mode.") - return TRUE /obj/item/assembly/health/process() if(!scanning || !secured) @@ -69,36 +69,7 @@ STOP_PROCESSING(SSobj, src) return -/obj/item/assembly/health/ui_interact(mob/user as mob)//TODO: Change this to the wires thingy +/obj/item/assembly/health/attack_self(mob/user) . = ..() - if(!secured) - user.show_message("The [name] is unsecured!") - return FALSE - var/dat = "Health Sensor" - dat += "
[scanning?"On":"Off"]" - if(scanning && health_scan) - dat += "
Health: [health_scan]" - user << browse(dat, "window=hscan") - onclose(user, "hscan") - -/obj/item/assembly/health/Topic(href, href_list) - ..() - if(!ismob(usr)) - return - - var/mob/user = usr - - if(!user.canUseTopic(src, BE_CLOSE)) - usr << browse(null, "window=hscan") - onclose(usr, "hscan") - return - - if(href_list["scanning"]) - toggle_scan() - - if(href_list["close"]) - usr << browse(null, "window=hscan") - return - - attack_self(user) - return + to_chat(user, "You toggle [src] [src.scanning ? "off" : "on"].") + toggle_scan() diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index f439775877c69..868eb305d176a 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -16,9 +16,8 @@ /obj/item/assembly_holder/ComponentInitialize() . = ..() - AddComponent( - /datum/component/simple_rotation, - ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS) + var/static/rotation_flags = ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS + AddComponent(/datum/component/simple_rotation, rotation_flags) /obj/item/assembly_holder/IsAssemblyHolder() return TRUE diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index b5e4f52eb3773..c8e70fbf8fa3d 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -22,7 +22,7 @@ /obj/item/assembly/infra/ComponentInitialize() . = ..() var/static/rotation_flags = ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS - AddComponent(/datum/component/simple_rotation, rotation_flags, null, null, CALLBACK(src,.proc/after_rotation)) + AddComponent(/datum/component/simple_rotation, rotation_flags, after_rotation=CALLBACK(src,.proc/after_rotation)) /obj/item/assembly/infra/proc/after_rotation() refreshBeam() @@ -134,7 +134,7 @@ . = ..() setDir(t) -/obj/item/assembly/infra/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE) +/obj/item/assembly/infra/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE) . = ..() olddir = dir @@ -152,10 +152,7 @@ return FALSE pulse(FALSE) audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*", null, hearing_range) - for(var/CHM in get_hearers_in_view(hearing_range, src)) - if(ismob(CHM)) - var/mob/LM = CHM - LM.playsound_local(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) + playsound(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) next_activate = world.time + 30 /obj/item/assembly/infra/proc/switchListener(turf/newloc) @@ -167,6 +164,8 @@ listeningTo = newloc /obj/item/assembly/infra/proc/check_exit(datum/source, atom/movable/offender) + SIGNAL_HANDLER + if(QDELETED(src)) return if(offender == src || istype(offender,/obj/effect/beam/i_beam)) @@ -175,7 +174,7 @@ var/obj/item/I = offender if (I.item_flags & ABSTRACT) return - return refreshBeam() + INVOKE_ASYNC(src, .proc/refreshBeam) /obj/item/assembly/infra/setDir() . = ..() @@ -214,8 +213,9 @@ visible = !visible . = TRUE - update_icon() - refreshBeam() + if(.) + update_icon() + refreshBeam() /***************************IBeam*********************************/ diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index f526d203e3e48..bc00b18d4b209 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -8,7 +8,7 @@ var/scanning = FALSE var/timing = FALSE - var/time = 10 + var/time = 20 var/sensitivity = 1 var/hearing_range = 3 @@ -66,20 +66,18 @@ return FALSE pulse(FALSE) audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*", null, hearing_range) - for(var/CHM in get_hearers_in_view(hearing_range, src)) - if(ismob(CHM)) - var/mob/LM = CHM - LM.playsound_local(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) + playsound(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) next_activate = world.time + 30 return TRUE -/obj/item/assembly/prox_sensor/process() +/obj/item/assembly/prox_sensor/process(delta_time) if(!timing) return - time-- + time -= delta_time if(time <= 0) timing = FALSE toggle_scan(TRUE) + ui_update() time = initial(time) /obj/item/assembly/prox_sensor/proc/toggle_scan(scan) @@ -108,12 +106,17 @@ holder.update_icon() return + +/obj/item/assembly/prox_sensor/ui_requires_update(mob/user, datum/tgui/ui) + . = ..() + if(timing) + . = TRUE // Autoupdate while counting down + /obj/item/assembly/prox_sensor/ui_status(mob/user) if(is_secured(user)) return ..() return UI_CLOSE - /obj/item/assembly/prox_sensor/ui_state(mob/user) return GLOB.hands_state diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 2456dcc939b85..5830df340a444 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -109,7 +109,8 @@ code = initial(code) . = TRUE - update_icon() + if(.) + update_icon() /obj/item/assembly/signaler/attackby(obj/item/W, mob/user, params) if(issignaler(W)) @@ -118,6 +119,7 @@ code = signaler2.code set_frequency(signaler2.frequency) to_chat(user, "You transfer the frequency and code of \the [signaler2.name] to \the [name]") + ui_update() ..() /obj/item/assembly/signaler/proc/signal() @@ -145,10 +147,7 @@ return pulse(TRUE) audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*", null, hearing_range) - for(var/CHM in get_hearers_in_view(hearing_range, src)) - if(ismob(CHM)) - var/mob/LM = CHM - LM.playsound_local(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) + playsound(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) return TRUE /obj/item/assembly/signaler/proc/set_frequency(new_frequency) diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index 0dc8876b9426c..c817d0e29bba9 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -7,15 +7,15 @@ var/timing = FALSE - var/time = 5 - var/saved_time = 5 + var/time = 10 + var/saved_time = 10 var/loop = FALSE var/hearing_range = 3 /obj/item/assembly/timer/suicide_act(mob/living/user) user.visible_message("[user] looks at the timer and decides [user.p_their()] fate! It looks like [user.p_theyre()] going to commit suicide!") activate()//doesnt rely on timer_end to prevent weird metas where one person can control the timer and therefore someone's life. (maybe that should be how it works...) - addtimer(CALLBACK(src, .proc/manual_suicide, user), time*10)//kill yourself once the time runs out + addtimer(CALLBACK(src, .proc/manual_suicide, user), time SECONDS)//kill yourself once the time runs out return MANUAL_SUICIDE /obj/item/assembly/timer/proc/manual_suicide(mob/living/user) @@ -57,18 +57,16 @@ return FALSE pulse(FALSE) audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*", null, hearing_range) - for(var/CHM in get_hearers_in_view(hearing_range, src)) - if(ismob(CHM)) - var/mob/LM = CHM - LM.playsound_local(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) + playsound(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) if(loop) timing = TRUE update_icon() + ui_update() -/obj/item/assembly/timer/process() +/obj/item/assembly/timer/process(delta_time) if(!timing) return - time-- + time -= delta_time if(time <= 0) timing = FALSE timer_end() @@ -89,6 +87,11 @@ return UI_CLOSE +/obj/item/assembly/timer/ui_requires_update(mob/user, datum/tgui/ui) + . = ..() + if(timing) + . = TRUE // Autoupdate while counting down + /obj/item/assembly/timer/ui_state(mob/user) return GLOB.hands_state diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index dbcec82f39202..e7e558aabe79f 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -8,7 +8,6 @@ desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated." icon_state = "voice" materials = list(/datum/material/iron=500, /datum/material/glass=50) - flags_1 = HEAR_1 attachable = TRUE verb_say = "beeps" verb_ask = "beeps" @@ -21,11 +20,15 @@ "recognizer", "voice sensor") +/obj/item/assembly/voice/Initialize() + . = ..() + become_hearing_sensitive(ROUNDSTART_TRAIT) + /obj/item/assembly/voice/examine(mob/user) . = ..() . += "Use a multitool to swap between \"inclusive\", \"exclusive\", \"recognizer\", and \"voice sensor\" mode." -/obj/item/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/obj/item/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) . = ..() if(speaker == src) return diff --git a/code/modules/asset_cache/asset_list.dm b/code/modules/asset_cache/asset_list.dm index 221febbe14d4d..3f9e8c3fcca2c 100644 --- a/code/modules/asset_cache/asset_list.dm +++ b/code/modules/asset_cache/asset_list.dm @@ -11,6 +11,7 @@ GLOBAL_LIST_EMPTY(asset_datums) /datum/asset var/_abstract = /datum/asset + var/cached_url_mappings /datum/asset/New() GLOB.asset_datums[type] = src @@ -19,6 +20,13 @@ GLOBAL_LIST_EMPTY(asset_datums) /datum/asset/proc/get_url_mappings() return list() +/// Returns a cached tgui message of URL mappings +/datum/asset/proc/get_serialized_url_mappings() + if (isnull(cached_url_mappings)) + cached_url_mappings = TGUI_CREATE_MESSAGE("asset/mappings", get_url_mappings()) + + return cached_url_mappings + /datum/asset/proc/register() return diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index bd98b9cc07a99..077c00485757d 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -3,21 +3,21 @@ /datum/asset/simple/tgui_common keep_local_name = TRUE assets = list( - "tgui-common.chunk.js" = 'tgui/public/tgui-common.chunk.js', + "tgui-common.bundle.js" = file("tgui/public/tgui-common.bundle.js"), ) /datum/asset/simple/tgui keep_local_name = TRUE assets = list( - "tgui.bundle.js" = 'tgui/public/tgui.bundle.js', - "tgui.bundle.css" = 'tgui/public/tgui.bundle.css', + "tgui.bundle.js" = file("tgui/public/tgui.bundle.js"), + "tgui.bundle.css" = file("tgui/public/tgui.bundle.css"), ) /datum/asset/simple/tgui_panel keep_local_name = TRUE assets = list( - "tgui-panel.bundle.js" = 'tgui/public/tgui-panel.bundle.js', - "tgui-panel.bundle.css" = 'tgui/public/tgui-panel.bundle.css', + "tgui-panel.bundle.js" = file("tgui/public/tgui-panel.bundle.js"), + "tgui-panel.bundle.css" = file("tgui/public/tgui-panel.bundle.css"), ) /datum/asset/simple/headers @@ -50,6 +50,18 @@ "smmon_6.gif" = 'icons/program_icons/smmon_6.gif', ) +/datum/asset/simple/circuit_assets + assets = list( + "grid_background.png" = 'icons/ui_icons/tgui/grid_background.png' + ) + +/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( @@ -158,11 +170,21 @@ ) parents = list("font-awesome.css" = 'html/font-awesome/css/all.min.css') +/datum/asset/simple/namespaced/tgfont + assets = list( + "tgfont.eot" = file("tgui/packages/tgfont/dist/tgfont.eot"), + "tgfont.woff2" = file("tgui/packages/tgfont/dist/tgfont.woff2"), + ) + parents = list( + "tgfont.css" = file("tgui/packages/tgfont/dist/tgfont.css"), + ) + /datum/asset/spritesheet/chat name = "chat" /datum/asset/spritesheet/chat/register() InsertAll("emoji", 'icons/emoji.dmi') + InsertAll("badge", 'icons/badges.dmi') // pre-loading all lanugage icons also helps to avoid meta InsertAll("language", 'icons/misc/language.dmi') // catch languages which are pulling icons from another file @@ -211,7 +233,7 @@ "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/pills name ="pills" @@ -255,6 +277,47 @@ InsertAll("", each, GLOB.alldirs) ..() +/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' + ) + +/datum/asset/spritesheet/supplypods + name = "supplypods" + +/datum/asset/spritesheet/supplypods/register() + for (var/style in 1 to length(GLOB.podstyles)) + var/icon_file = 'icons/obj/supplypods.dmi' + var/states = icon_states(icon_file) + if (style == STYLE_SEETHROUGH) + Insert("pod_asset[style]", icon(icon_file, "seethrough-icon", SOUTH)) + continue + var/base = GLOB.podstyles[style][POD_BASE] + if (!base) + Insert("pod_asset[style]", icon(icon_file, "invisible-icon", SOUTH)) + continue + var/icon/podIcon = icon(icon_file, base, SOUTH) + var/door = GLOB.podstyles[style][POD_DOOR] + if (door) + door = "[base]_door" + if(door in states) + podIcon.Blend(icon(icon_file, door, SOUTH), ICON_OVERLAY) + var/shape = GLOB.podstyles[style][POD_SHAPE] + if (shape == POD_SHAPE_NORML) + var/decal = GLOB.podstyles[style][POD_DECAL] + if (decal) + if(decal in states) + podIcon.Blend(icon(icon_file, decal, SOUTH), ICON_OVERLAY) + var/glow = GLOB.podstyles[style][POD_GLOW] + if (glow) + glow = "pod_glow_[glow]" + if(glow in states) + podIcon.Blend(icon(icon_file, glow, SOUTH), ICON_OVERLAY) + Insert("pod_asset[style]", podIcon) + return ..() + // Representative icons for each research design /datum/asset/spritesheet/research_designs name = "design" @@ -347,14 +410,6 @@ Insert(imgid, I) return ..() - -/datum/asset/simple/genetics - assets = list( - "dna_discovered.png" = 'html/dna_discovered.png', - "dna_undiscovered.png" = 'html/dna_undiscovered.png', - "dna_extra.png" = 'html/dna_extra.png' - ) - /datum/asset/simple/bee_antags assets = list( "traitor.png" = 'html/img/traitor.png', @@ -412,3 +467,51 @@ // Special case to handle Bluespace Crystals Insert("polycrystal", 'icons/obj/telescience.dmi', "polycrystal") ..() + +/datum/asset/simple/pAI + assets = list( + "paigrid.png" = 'html/paigrid.png' + ) + +/datum/asset/simple/portraits + var/tab = "use subtypes of this please" + assets = list() + +/datum/asset/simple/portraits/New() + if(!SSpersistence.paintings || !SSpersistence.paintings[tab] || !length(SSpersistence.paintings[tab])) + return + for(var/p in SSpersistence.paintings[tab]) + var/list/portrait = p + var/png = "data/paintings/[tab]/[portrait["md5"]].png" + if(fexists(png)) + var/asset_name = "[tab]_[portrait["md5"]]" + assets[asset_name] = png + ..() //this is where it registers all these assets we added to the list + +/datum/asset/simple/portraits/library + tab = "library" + +/datum/asset/simple/portraits/library_secure + tab = "library_secure" + +/datum/asset/simple/portraits/library_private + tab = "library_private" + +/datum/asset/spritesheet/fish + name = "fish" + +/datum/asset/spritesheet/fish/register() + for (var/path in subtypesof(/datum/aquarium_behaviour/fish)) + var/datum/aquarium_behaviour/fish/fish_type = path + var/fish_icon = initial(fish_type.icon) + var/fish_icon_state = initial(fish_type.icon_state) + var/id = sanitize_css_class_name("[fish_icon][fish_icon_state]") + if(sprites[id]) //no dupes + continue + Insert(id, fish_icon, fish_icon_state) + ..() + +/// Removes all non-alphanumerics from the text, keep in mind this can lead to id conflicts +/proc/sanitize_css_class_name(name) + var/static/regex/regex = new(@"[^a-zA-Z0-9]","g") + return replacetext(name, regex, "") diff --git a/code/modules/atmospherics/auxgm/breathing_classes.dm b/code/modules/atmospherics/auxgm/breathing_classes.dm new file mode 100644 index 0000000000000..4abfab58eecc3 --- /dev/null +++ b/code/modules/atmospherics/auxgm/breathing_classes.dm @@ -0,0 +1,37 @@ +// Breathing classes are, yes, just a list of gases, associated with numbers. +// But they're very simple: pluoxium's status as O2 * 8 is represented here, +// with a single line of code, no hardcoding and special-casing across the codebase. +// Not only that, but they're very general: you could have a negative value +// to simulate asphyxiants, e.g. if I add krypton it could go into the oxygen +// breathing class at -7, simulating krypton narcosis. + +/datum/breathing_class + var/list/gases = null + var/list/products = null + var/danger_reagent = null + var/low_alert_category = "not_enough_oxy" + var/low_alert_datum = /atom/movable/screen/alert/not_enough_oxy + var/high_alert_category = "too_much_oxy" + var/high_alert_datum = /atom/movable/screen/alert/too_much_oxy + +/datum/breathing_class/oxygen + gases = list( + GAS_O2 = 1, + GAS_PLUOXIUM = 8, + GAS_CO2 = -0.7, // CO2 isn't actually toxic, just an asphyxiant + ) + products = list( + GAS_CO2 = 1, + ) + +/datum/breathing_class/plasma + gases = list( + GAS_PLASMA = 1 + ) + products = list( + GAS_CO2 = 1 + ) + low_alert_category = "not_enough_tox" + low_alert_datum = /atom/movable/screen/alert/not_enough_tox + high_alert_category = "too_much_tox" + high_alert_datum = /atom/movable/screen/alert/too_much_tox diff --git a/code/modules/atmospherics/auxgm/gas_types.dm b/code/modules/atmospherics/auxgm/gas_types.dm new file mode 100644 index 0000000000000..82ec62f90f915 --- /dev/null +++ b/code/modules/atmospherics/auxgm/gas_types.dm @@ -0,0 +1,129 @@ +/datum/gas/oxygen + id = GAS_O2 + specific_heat = 20 + name = "Oxygen" + oxidation_temperature = T0C - 100 // it checks max of this and fire temperature, so rarely will things spontaneously combust + +/datum/gas/nitrogen + id = GAS_N2 + specific_heat = 20 + breath_alert_info = list( + not_enough_alert = list( + alert_category = "not_enough_nitro", + alert_type = /atom/movable/screen/alert/not_enough_nitro + ), + too_much_alert = list( + alert_category = "too_much_nitro", + alert_type = /atom/movable/screen/alert/too_much_nitro + ) + ) + name = "Nitrogen" + +/datum/gas/carbon_dioxide //what the fuck is this? + id = GAS_CO2 + specific_heat = 30 + name = "Carbon Dioxide" + breath_results = GAS_O2 + breath_alert_info = list( + not_enough_alert = list( + alert_category = "not_enough_co2", + alert_type = /atom/movable/screen/alert/not_enough_co2 + ), + too_much_alert = list( + alert_category = "too_much_co2", + alert_type = /atom/movable/screen/alert/too_much_co2 + ) + ) + fusion_power = 3 + +/datum/gas/plasma + id = GAS_PLASMA + specific_heat = 200 + name = "Plasma" + gas_overlay = "plasma" + moles_visible = MOLES_GAS_VISIBLE + flags = GAS_FLAG_DANGEROUS + // no fire info cause it has its own bespoke reaction for trit generation reasons + +/datum/gas/water_vapor + id = GAS_H2O + specific_heat = 40 + name = "Water Vapor" + gas_overlay = "water_vapor" + moles_visible = MOLES_GAS_VISIBLE + fusion_power = 8 + breath_reagent = /datum/reagent/water + +/datum/gas/hypernoblium + id = GAS_HYPERNOB + specific_heat = 2000 + name = "Hyper-noblium" + gas_overlay = "freon" + moles_visible = MOLES_GAS_VISIBLE + +/datum/gas/nitrous_oxide + id = GAS_NITROUS + specific_heat = 40 + name = "Nitrous Oxide" + gas_overlay = "nitrous_oxide" + moles_visible = MOLES_GAS_VISIBLE * 2 + flags = GAS_FLAG_DANGEROUS + fire_products = list(GAS_N2 = 1) + oxidation_rate = 0.5 + oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST + 100 + +/datum/gas/nitryl + id = GAS_NITRYL + specific_heat = 20 + name = "Nitryl" + gas_overlay = "nitryl" + moles_visible = MOLES_GAS_VISIBLE + flags = GAS_FLAG_DANGEROUS + fusion_power = 15 + fire_products = list(GAS_N2 = 0.5) + oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50 + +/datum/gas/tritium + id = GAS_TRITIUM + specific_heat = 10 + name = "Tritium" + gas_overlay = "tritium" + moles_visible = MOLES_GAS_VISIBLE + flags = GAS_FLAG_DANGEROUS + fusion_power = 1 + /* + these are for when we add hydrogen, trit gets to keep its hardcoded fire for legacy reasons + fire_provides = list(GAS_H2O = 2) + fire_burn_rate = 2 + fire_energy_released = FIRE_HYDROGEN_ENERGY_RELEASED + fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50 + */ + +/datum/gas/bz + id = GAS_BZ + specific_heat = 20 + name = "BZ" + flags = GAS_FLAG_DANGEROUS + fusion_power = 8 + +/datum/gas/stimulum + id = GAS_STIMULUM + specific_heat = 5 + name = "Stimulum" + fusion_power = 7 + +/datum/gas/pluoxium + id = GAS_PLUOXIUM + specific_heat = 80 + name = "Pluoxium" + fusion_power = 10 + oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST * 1000 // it is VERY stable + oxidation_rate = 8 + +/datum/gas/miasma + id = GAS_MIASMA + specific_heat = 20 + fusion_power = 50 + name = "Miasma" + gas_overlay = "miasma" + moles_visible = MOLES_GAS_VISIBLE * 60 diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index 9f66bdd5fcd5d..f27e68a4eb501 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -13,28 +13,21 @@ if(!air) return - var/oxy = air.get_moles(/datum/gas/oxygen) - if (oxy < 0.5) + if (air.get_oxidation_power(exposed_temperature) < 0.5) return - var/tox = air.get_moles(/datum/gas/plasma) - var/trit = air.get_moles(/datum/gas/tritium) + var/has_fuel = air.get_moles(GAS_PLASMA) > 0.5 || air.get_moles(GAS_TRITIUM) > 0.5 || air.get_fuel_amount(exposed_temperature) > 0.5 if(active_hotspot) if(soh) - if(tox > 0.5 || trit > 0.5) + if(has_fuel) if(active_hotspot.temperature < exposed_temperature) active_hotspot.temperature = exposed_temperature if(active_hotspot.volume < exposed_volume) active_hotspot.volume = exposed_volume return - if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && (tox > 0.5 || trit > 0.5)) - + if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && has_fuel) active_hotspot = new /obj/effect/hotspot(src, exposed_volume*25, exposed_temperature) - active_hotspot.just_spawned = (current_cycle < SSair.times_fired) - //remove just_spawned protection if no longer processing this cell - SSair.add_to_active(src, 0) - //This is the icon for fire on turfs, also helps for nurturing small fires until they are full tile /obj/effect/hotspot anchored = TRUE @@ -48,9 +41,9 @@ var/volume = 125 var/temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - var/just_spawned = TRUE var/bypassing = FALSE var/visual_update_tick = 0 + var/first_cycle = TRUE /obj/effect/hotspot/Initialize(mapload, starting_volume, starting_temperature) . = ..() @@ -70,7 +63,9 @@ location.active_hotspot = src - bypassing = !just_spawned && (volume > CELL_VOLUME*0.95) || location.air.return_temperature() > FUSION_TEMPERATURE_THRESHOLD + bypassing = !first_cycle && volume > CELL_VOLUME*0.95 || location.air.return_temperature() > FUSION_TEMPERATURE_THRESHOLD + if(first_cycle) + first_cycle = FALSE if(bypassing) volume = location.air.reaction_results["fire"]*FIRE_GROWTH_RATE @@ -150,10 +145,6 @@ #define INSUFFICIENT(path) (location.air.get_moles(path) < 0.5) /obj/effect/hotspot/process() - if(just_spawned) - just_spawned = FALSE - return - var/turf/open/location = loc if(!istype(location)) qdel(src) @@ -164,13 +155,7 @@ if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) || (volume <= 1)) qdel(src) return - if(!location.air || (INSUFFICIENT(/datum/gas/plasma) && INSUFFICIENT(/datum/gas/tritium)) || INSUFFICIENT(/datum/gas/oxygen)) - qdel(src) - return - - //Not enough to burn - // god damn it previous coder you made the INSUFFICIENT macro for a fucking reason why didn't you use it here smh - if((INSUFFICIENT(/datum/gas/plasma) && INSUFFICIENT(/datum/gas/tritium)) || INSUFFICIENT(/datum/gas/oxygen)) + if(!location.air || location.air.get_oxidation_power() < 0.5 || (INSUFFICIENT(GAS_PLASMA) && INSUFFICIENT(GAS_TRITIUM) && location.air.get_fuel_amount() < 0.5)) qdel(src) return diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index 0e213e951cfd0..2caaaf6d8375b 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -18,57 +18,75 @@ /turf/open/CanAtmosPass(turf/T, vertical = FALSE) var/dir = vertical? get_dir_multiz(src, T) : get_dir(src, T) - var/opp = dir_inverse_multiz(dir) - var/R = FALSE + var/opp = REVERSE_DIR(dir) + . = TRUE if(vertical && !(zAirOut(dir, T) && T.zAirIn(dir, src))) - R = TRUE + . = FALSE if(blocks_air || T.blocks_air) - R = TRUE + . = FALSE if (T == src) - return !R + return . for(var/obj/O in contents+T.contents) var/turf/other = (O.loc == src ? T : src) if(!(vertical? (CANVERTICALATMOSPASS(O, other)) : (CANATMOSPASS(O, other)))) - R = TRUE - if(O.BlockSuperconductivity()) //the direction and open/closed are already checked on CanAtmosPass() so there are no arguments - atmos_supeconductivity |= dir - T.atmos_supeconductivity |= opp - return FALSE //no need to keep going, we got all we asked - - atmos_supeconductivity &= ~dir - T.atmos_supeconductivity &= ~opp - - return !R - -/atom/movable/proc/BlockSuperconductivity() // objects that block air and don't let superconductivity act. Only firelocks atm. + . = FALSE + if(O.BlockThermalConductivity()) //the direction and open/closed are already checked on CanAtmosPass() so there are no arguments + conductivity_blocked_directions |= dir + T.conductivity_blocked_directions |= opp + if(!.) + return . + +/atom/movable/proc/BlockThermalConductivity() // Objects that don't let heat through. return FALSE /turf/proc/ImmediateCalculateAdjacentTurfs() + if(SSair.thread_running()) + CALCULATE_ADJACENT_TURFS(src) + return var/canpass = CANATMOSPASS(src, src) var/canvpass = CANVERTICALATMOSPASS(src, src) for(var/direction in GLOB.cardinals_multiz) var/turf/T = get_step_multiz(src, direction) - var/opp_dir = dir_inverse_multiz(direction) - if(!isopenturf(T)) + if(!istype(T)) continue - if(!(blocks_air || T.blocks_air) && ((direction & (UP|DOWN))? (canvpass && CANVERTICALATMOSPASS(T, src)) : (canpass && CANATMOSPASS(T, src))) ) + var/opp_dir = REVERSE_DIR(direction) + if(isopenturf(T) && !(blocks_air || T.blocks_air) && ((direction & (UP|DOWN))? (canvpass && CANVERTICALATMOSPASS(T, src)) : (canpass && CANATMOSPASS(T, src))) ) LAZYINITLIST(atmos_adjacent_turfs) LAZYINITLIST(T.atmos_adjacent_turfs) atmos_adjacent_turfs[T] = direction T.atmos_adjacent_turfs[src] = opp_dir - T.__update_extools_adjacent_turfs() else if (atmos_adjacent_turfs) atmos_adjacent_turfs -= T if (T.atmos_adjacent_turfs) T.atmos_adjacent_turfs -= src - T.__update_extools_adjacent_turfs() UNSETEMPTY(T.atmos_adjacent_turfs) + T.set_sleeping(T.blocks_air) + T.__update_auxtools_turf_adjacency_info(isspaceturf(T.get_z_base_turf()), -1) UNSETEMPTY(atmos_adjacent_turfs) src.atmos_adjacent_turfs = atmos_adjacent_turfs - __update_extools_adjacent_turfs() + set_sleeping(blocks_air) + __update_auxtools_turf_adjacency_info(isspaceturf(get_z_base_turf())) + +/turf/proc/ImmediateDisableAdjacency(disable_adjacent = TRUE) + if(SSair.thread_running()) + SSadjacent_air.disable_queue[src] = disable_adjacent + return + if(disable_adjacent) + for(var/direction in GLOB.cardinals_multiz) + var/turf/T = get_step_multiz(src, direction) + if(!istype(T)) + continue + if (T.atmos_adjacent_turfs) + T.atmos_adjacent_turfs -= src + UNSETEMPTY(T.atmos_adjacent_turfs) + T.__update_auxtools_turf_adjacency_info(isspaceturf(T.get_z_base_turf()), -1) + LAZYCLEARLIST(atmos_adjacent_turfs) + __update_auxtools_turf_adjacency_info(isspaceturf(get_z_base_turf())) + +/turf/proc/set_sleeping(should_sleep) -/turf/proc/__update_extools_adjacent_turfs() +/turf/proc/__update_auxtools_turf_adjacency_info() //returns a list of adjacent turfs that can share air with this one. //alldir includes adjacent diagonal tiles that can share @@ -114,7 +132,6 @@ /turf/air_update_turf(command = 0) if(command) ImmediateCalculateAdjacentTurfs() - SSair.add_to_active(src,command) /atom/movable/proc/move_update_air(turf/T) if(isturf(T)) @@ -133,7 +150,4 @@ var/datum/gas_mixture/G = new G.parse_gas_string(text) - - air.merge(G) - archive() - SSair.add_to_active(src, 0) + assume_air(G) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 9660e7e012cbd..2564531906eb6 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -1,18 +1,12 @@ /turf - //used for temperature calculations + //conductivity is divided by 10 when interacting with air for balance purposes var/thermal_conductivity = 0.05 var/heat_capacity = 1 - var/temperature_archived //list of open turfs adjacent to us var/list/atmos_adjacent_turfs - //bitfield of dirs in which we are superconducitng - var/atmos_supeconductivity = NONE - var/is_openturf = FALSE // used by extools shizz. - - //used to determine whether we should archive - var/archived_cycle = 0 - var/current_cycle = 0 + //bitfield of dirs in which we thermal conductivity is blocked + var/conductivity_blocked_directions = NONE //used for mapping and for breathing while in walls (because that's a thing that needs to be accounted for...) //string parsed by /datum/gas/proc/copy_from_turf @@ -32,21 +26,17 @@ var/planetary_atmos = FALSE //air will revert to initial_gas_mix over time var/list/atmos_overlay_types //gas IDs of current active gas overlays - is_openturf = TRUE /turf/open/Initialize() if(!blocks_air) - air = new + air = new(2500,src) air.copy_from_turf(src) - update_air_ref() + update_air_ref(planetary_atmos ? 1 : 2) . = ..() /turf/open/Destroy() if(active_hotspot) QDEL_NULL(active_hotspot) - // Adds the adjacent turfs to the current atmos processing - for(var/T in atmos_adjacent_turfs) - SSair.add_to_active(T) return ..() /turf/proc/update_air_ref() @@ -54,10 +44,46 @@ /////////////////GAS MIXTURE PROCS/////////////////// /turf/open/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air + return assume_air_ratio(giver, 1) + +/turf/open/assume_air_moles(datum/gas_mixture/giver, moles) if(!giver) return FALSE - air.merge(giver) - update_visuals() + if(SSair.thread_running()) + SSair.deferred_airs += list(list(giver, air, moles / giver.total_moles())) + else + giver.transfer_to(air, moles) + update_visuals() + return TRUE + +/turf/open/assume_air_ratio(datum/gas_mixture/giver, ratio) + if(!giver) + return FALSE + if(SSair.thread_running()) + SSair.deferred_airs += list(list(giver, air, ratio)) + else + giver.transfer_ratio_to(air, ratio) + update_visuals() + return TRUE + +/turf/open/transfer_air(datum/gas_mixture/taker, moles) + if(!taker || !return_air()) // shouldn't transfer from space + return FALSE + if(SSair.thread_running()) + SSair.deferred_airs += list(list(air, taker, moles / air.total_moles())) + else + air.transfer_to(taker, moles) + update_visuals() + return TRUE + +/turf/open/transfer_air_ratio(datum/gas_mixture/taker, ratio) + if(!taker || !return_air()) + return FALSE + if(SSair.thread_running()) + SSair.deferred_airs += list(list(air, taker, ratio)) + else + air.transfer_ratio_to(taker, ratio) + update_visuals() return TRUE /turf/open/remove_air(amount) @@ -66,6 +92,12 @@ update_visuals() return removed +/turf/open/remove_air_ratio(ratio) + var/datum/gas_mixture/ours = return_air() + var/datum/gas_mixture/removed = ours.remove_ratio(ratio) + update_visuals() + return removed + /turf/open/proc/copy_air_with_tile(turf/open/T) if(istype(T)) air.copy_from(T.air) @@ -88,16 +120,9 @@ return return_air() /turf/temperature_expose() - if(temperature > heat_capacity) + if(return_temperature() > heat_capacity) to_be_destroyed = TRUE -/turf/proc/archive() - temperature_archived = temperature - -/turf/open/archive() - air.archive() - archived_cycle = SSair.times_fired - temperature_archived = temperature /turf/open/proc/eg_reset_cooldowns() /turf/open/proc/eg_garbage_collect() @@ -124,9 +149,8 @@ for(var/id in air.get_gases()) if (nonoverlaying_gases[id]) continue - var/gas_meta = GLOB.meta_gas_info[id] - var/gas_overlay = gas_meta[META_GAS_OVERLAY] - if(gas_overlay && air.get_moles(id) > gas_meta[META_GAS_MOLES_VISIBLE]) + var/gas_overlay = GLOB.gas_data.overlays[id] + if(gas_overlay && air.get_moles(id) > GLOB.gas_data.visibility[id]) new_overlay_types += gas_overlay[min(FACTOR_GAS_VISIBLE_MAX, CEILING(air.get_moles(id) / MOLES_GAS_VISIBLE_STEP, 1))] if (atmos_overlay_types) @@ -160,12 +184,11 @@ for (var/gastype in subtypesof(/datum/gas)) var/datum/gas/gasvar = gastype if (!initial(gasvar.gas_overlay)) - .[gastype] = TRUE + .[initial(gasvar.id)] = TRUE /////////////////////////////SIMULATION/////////////////////////////////// /turf/proc/process_cell(fire_count) - SSair.remove_from_active(src) /turf/open/proc/equalize_pressure_in_zone(cyclenum) /turf/open/proc/consider_firelocks(turf/T2) @@ -185,14 +208,25 @@ /turf/proc/handle_decompression_floor_rip() /turf/open/floor/handle_decompression_floor_rip(sum) - if(sum > 20 && prob(CLAMP(sum / 10, 0, 30))) - remove_tile() + if(sum > 20 && prob(CLAMP(sum / 20, 0, 15))) + if(floor_tile) + new floor_tile(src) + make_plating() + +/turf/open/floor/plating/handle_decompression_floor_rip() + return + +/turf/open/floor/engine/handle_decompression_floor_rip() + return /turf/open/process_cell(fire_count) //////////////////////////SPACEWIND///////////////////////////// -/turf/open/proc/consider_pressure_difference(turf/T, difference) +/turf/proc/consider_pressure_difference() + return + +/turf/open/consider_pressure_difference(turf/T, difference) SSair.high_pressure_delta |= src if(difference > pressure_difference) pressure_direction = get_dir(src, T) @@ -209,8 +243,6 @@ M = thing if (!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired) M.experience_pressure_difference(pressure_difference * multiplier, pressure_direction, 0, pressure_specific_target) - if(pressure_difference > 100) - new /obj/effect/temp_visual/dir_setting/space_wind(src, pressure_direction, CLAMP(round(sqrt(pressure_difference) * 2), 10, 255)) /atom/movable/var/pressure_resistance = 10 /atom/movable/var/last_high_pressure_movement_air_cycle = 0 @@ -236,112 +268,3 @@ else step(src, direction) last_high_pressure_movement_air_cycle = SSair.times_fired - -////////////////////////SUPERCONDUCTIVITY///////////////////////////// -/turf/proc/conductivity_directions() - if(archived_cycle < SSair.times_fired) - archive() - return NORTH|SOUTH|EAST|WEST - -/turf/open/conductivity_directions() - if(blocks_air) - return ..() - for(var/direction in GLOB.cardinals) - var/turf/T = get_step(src, direction) - if(!(T in atmos_adjacent_turfs) && !(atmos_supeconductivity & direction)) - . |= direction - -/turf/proc/neighbor_conduct_with_src(turf/open/other) - if(!other.blocks_air) //Open but neighbor is solid - other.temperature_share_open_to_solid(src) - else //Both tiles are solid - other.share_temperature_mutual_solid(src, thermal_conductivity) - temperature_expose(null, temperature, null) - -/turf/open/neighbor_conduct_with_src(turf/other) - if(blocks_air) - ..() - return - - if(!other.blocks_air) //Both tiles are open - var/turf/open/T = other - T.air.temperature_share(air, WINDOW_HEAT_TRANSFER_COEFFICIENT) - else //Solid but neighbor is open - temperature_share_open_to_solid(other) - SSair.add_to_active(src, 0) - -/turf/proc/super_conduct() - var/conductivity_directions = conductivity_directions() - - if(conductivity_directions) - //Conduct with tiles around me - for(var/direction in GLOB.cardinals) - if(conductivity_directions & direction) - var/turf/neighbor = get_step(src,direction) - - if(!neighbor.thermal_conductivity) - continue - - if(neighbor.archived_cycle < SSair.times_fired) - neighbor.archive() - - neighbor.neighbor_conduct_with_src(src) - - neighbor.consider_superconductivity() - - radiate_to_spess() - - finish_superconduction() - -/turf/proc/finish_superconduction(temp = temperature) - //Make sure still hot enough to continue conducting heat - if(temp < MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION) - SSair.active_super_conductivity -= src - return FALSE - -/turf/open/finish_superconduction() - //Conduct with air on my tile if I have it - if(!blocks_air) - temperature = air.temperature_share(null, thermal_conductivity, temperature, heat_capacity) - ..((blocks_air ? temperature : air.return_temperature())) - -/turf/proc/consider_superconductivity() - if(!thermal_conductivity) - return FALSE - - SSair.active_super_conductivity |= src - return TRUE - -/turf/open/consider_superconductivity(starting) - if(air.return_temperature() < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) - return FALSE - if(air.heat_capacity() < M_CELL_WITH_RATIO) // Was: MOLES_CELLSTANDARD*0.1*0.05 Since there are no variables here we can make this a constant. - return FALSE - return ..() - -/turf/closed/consider_superconductivity(starting) - if(temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) - return FALSE - return ..() - -/turf/proc/radiate_to_spess() //Radiate excess tile heat to space - if(temperature > T0C) //Considering 0 degC as te break even point for radiation in and out - var/delta_temperature = (temperature_archived - TCMB) //hardcoded space temperature - if((heat_capacity > 0) && (abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)) - - var/heat = thermal_conductivity*delta_temperature* \ - (heat_capacity*HEAT_CAPACITY_VACUUM/(heat_capacity+HEAT_CAPACITY_VACUUM)) - temperature -= heat/heat_capacity - -/turf/open/proc/temperature_share_open_to_solid(turf/sharer) - sharer.temperature = air.temperature_share(null, sharer.thermal_conductivity, sharer.temperature, sharer.heat_capacity) - -/turf/proc/share_temperature_mutual_solid(turf/sharer, conduction_coefficient) //to be understood - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER && heat_capacity && sharer.heat_capacity) - - var/heat = conduction_coefficient*delta_temperature* \ - (heat_capacity*sharer.heat_capacity/(heat_capacity+sharer.heat_capacity)) - - temperature -= heat/heat_capacity - sharer.temperature += heat/sharer.heat_capacity diff --git a/code/modules/atmospherics/gasmixtures/auxgm.dm b/code/modules/atmospherics/gasmixtures/auxgm.dm new file mode 100644 index 0000000000000..04ebc3584e7f0 --- /dev/null +++ b/code/modules/atmospherics/gasmixtures/auxgm.dm @@ -0,0 +1,130 @@ +GLOBAL_LIST_INIT(hardcoded_gases, list(GAS_O2, GAS_N2, GAS_CO2, GAS_PLASMA)) //the main four gases, which were at one time hardcoded +GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GAS_PLUOXIUM, GAS_STIMULUM, GAS_NITRYL))) //unable to react amongst themselves + +// Auxgm +// It's a send-up of XGM, like what baystation got. +// It's got the same architecture as XGM, but it's structured +// differently to make it more convenient for auxmos. + +// Most important compared to TG is that it does away with hardcoded typepaths, +// which lead to problems on the auxmos end anyway. We cache the string value +// references on the Rust end, so no performance is lost here. + +// Also allows you to add new gases at runtime + +/proc/_auxtools_register_gas(datum/gas/gas) // makes sure auxtools knows stuff about this gas + +/datum/auxgm + var/list/datums = list() + var/list/specific_heats = list() + var/list/names = list() + var/list/visibility = list() + var/list/overlays = list() + var/list/flags = list() + var/list/ids = list() + var/list/typepaths = list() + var/list/fusion_powers = list() + var/list/breathing_classes = list() + var/list/breath_results = list() + var/list/breath_reagents = list() + var/list/breath_reagents_dangerous = list() + var/list/breath_alert_info = list() + var/list/oxidation_temperatures = list() + var/list/oxidation_rates = list() + var/list/fire_temperatures = list() + var/list/fire_enthalpies = list() + var/list/fire_products = list() + var/list/fire_burn_rates = list() + + +/datum/gas + var/id = "" + var/specific_heat = 0 + var/name = "" + var/gas_overlay = "" //icon_state in icons/effects/atmospherics.dmi + var/moles_visible = null + var/flags = NONE //currently used by canisters + var/fusion_power = 0 // How much the gas destabilizes a fusion reaction + var/breath_results = GAS_CO2 // what breathing this breathes out + var/breath_reagent = null // what breathing this adds to your reagents + var/breath_reagent_dangerous = null // what breathing this adds to your reagents IF it's above a danger threshold + var/list/breath_alert_info = null // list for alerts that pop up when you have too much/not enough of something + var/oxidation_temperature = null // temperature above which this gas is an oxidizer; null for none + var/oxidation_rate = 1 // how many moles of this can oxidize how many moles of material + var/fire_temperature = null // temperature above which gas may catch fire; null for none + var/list/fire_products = null // what results when this gas is burned (oxidizer or fuel); null for none + var/fire_energy_released = 0 // how much energy is released per mole of fuel burned + var/fire_burn_rate = 1 // how many moles are burned per product released + +/datum/gas/proc/breath(partial_pressure, light_threshold, heavy_threshold, moles, mob/living/carbon/C, obj/item/organ/lungs/lungs) + // This is only called on gases with the GAS_FLAG_BREATH_PROC flag. When possible, do NOT use this-- + // greatly prefer just adding a reagent. This is mostly around for legacy reasons. + return null + +/datum/auxgm/proc/add_gas(datum/gas/gas) + var/g = gas.id + if(g) + datums[g] = gas + specific_heats[g] = gas.specific_heat + names[g] = gas.name + if(gas.moles_visible) + visibility[g] = gas.moles_visible + overlays[g] = new /list(FACTOR_GAS_VISIBLE_MAX) + for(var/i in 1 to FACTOR_GAS_VISIBLE_MAX) + overlays[g][i] = new /obj/effect/overlay/gas(gas.gas_overlay, i * 255 / FACTOR_GAS_VISIBLE_MAX) + else + visibility[g] = 0 + overlays[g] = 0 + flags[g] = gas.flags + ids[g] = g + typepaths[g] = gas.type + fusion_powers[g] = gas.fusion_power + + if(gas.breath_alert_info) + breath_alert_info[g] = gas.breath_alert_info + breath_results[g] = gas.breath_results + if(gas.breath_reagent) + breath_reagents[g] = gas.breath_reagent + if(gas.breath_reagent_dangerous) + breath_reagents_dangerous[g] = gas.breath_reagent_dangerous + + if(gas.oxidation_temperature) + oxidation_temperatures[g] = gas.oxidation_temperature + oxidation_rates[g] = gas.oxidation_rate + if(gas.fire_products) + fire_products[g] = gas.fire_products + fire_enthalpies[g] = gas.fire_energy_released + else if(gas.fire_temperature) + fire_temperatures[g] = gas.fire_temperature + fire_burn_rates[g] = gas.fire_burn_rate + if(gas.fire_products) + fire_products[g] = gas.fire_products + fire_enthalpies[g] = gas.fire_energy_released + + _auxtools_register_gas(gas) + +/proc/finalize_gas_refs() + +/datum/auxgm/New() + for(var/gas_path in subtypesof(/datum/gas)) + var/datum/gas/gas = new gas_path + add_gas(gas) + for(var/breathing_class_path in subtypesof(/datum/breathing_class)) + var/datum/breathing_class/class = new breathing_class_path + breathing_classes[breathing_class_path] = class + finalize_gas_refs() + +GLOBAL_DATUM_INIT(gas_data, /datum/auxgm, new) + +/obj/effect/overlay/gas + icon = 'icons/effects/atmospherics.dmi' + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + 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) + . = ..() + icon_state = state + alpha = alph diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 7e885c31d46d9..400405bac9303 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -7,38 +7,112 @@ What are the archived variables for? #define MINIMUM_MOLE_COUNT 0.01 #define QUANTIZE(variable) (round(variable,0.0000001))/*I feel the need to document what happens here. Basically this is used to catch most rounding errors, however it's previous value made it so that once gases got hot enough, most procedures wouldnt occur due to the fact that the mole counts would get rounded away. Thus, we lowered it a few orders of magnititude */ -GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm -GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) - -/proc/init_gaslist_cache() - . = list() - for(var/id in GLOB.meta_gas_info) - var/list/cached_gas = new(3) - - .[id] = cached_gas - - cached_gas[MOLES] = 0 - cached_gas[ARCHIVE] = 0 - cached_gas[GAS_META] = GLOB.meta_gas_info[id] /datum/gas_mixture + /// Never ever set this variable, hooked into vv_get_var for view variables viewing. + var/gas_list_view_only var/initial_volume = CELL_VOLUME //liters var/list/reaction_results var/list/analyzer_results //used for analyzer feedback - not initialized until its used - var/_extools_pointer_gasmixture = 0 // Contains the memory address of the shared_ptr object for this gas mixture in c++ land. Don't. Touch. This. Var. + var/_extools_pointer_gasmixture // Contains the index in the gas vector for this gas mixture in rust land. Don't. Touch. This. Var. + +GLOBAL_LIST_INIT(auxtools_atmos_initialized, FALSE) + +/proc/auxtools_atmos_init() /datum/gas_mixture/New(volume) if (!isnull(volume)) initial_volume = volume - ATMOS_EXTOOLS_CHECK + AUXTOOLS_CHECK(AUXMOS) + if(!GLOB.auxtools_atmos_initialized && auxtools_atmos_init()) + GLOB.auxtools_atmos_initialized = TRUE __gasmixture_register() reaction_results = new +/* +we use a hook instead +/datum/gas_mixture/Del() + __gasmixture_unregister() + . = ..() +*/ + /datum/gas_mixture/vv_edit_var(var_name, var_value) if(var_name == "_extools_pointer_gasmixture") return FALSE // please no. segfaults bad. + if(var_name == "gas_list_view_only") + return FALSE return ..() +/datum/gas_mixture/vv_get_var(var_name) + . = ..() + if(var_name == "gas_list_view_only") + var/list/dummy = get_gases() + for(var/gas in dummy) + dummy[gas] = get_moles(gas) + dummy["CAP [gas]"] = partial_heat_capacity(gas) + dummy["TEMP"] = return_temperature() + dummy["PRESSURE"] = return_pressure() + dummy["HEAT CAPACITY"] = heat_capacity() + dummy["TOTAL MOLES"] = total_moles() + dummy["VOLUME"] = return_volume() + dummy["THERMAL ENERGY"] = thermal_energy() + return debug_variable("gases (READ ONLY)", dummy, 0, src) + +/datum/gas_mixture/vv_get_dropdown() + . = ..() + VV_DROPDOWN_OPTION("", "---") + VV_DROPDOWN_OPTION(VV_HK_PARSE_GASSTRING, "Parse Gas String") + VV_DROPDOWN_OPTION(VV_HK_EMPTY, "Empty") + VV_DROPDOWN_OPTION(VV_HK_SET_MOLES, "Set Moles") + VV_DROPDOWN_OPTION(VV_HK_SET_TEMPERATURE, "Set Temperature") + VV_DROPDOWN_OPTION(VV_HK_SET_VOLUME, "Set Volume") + +/datum/gas_mixture/vv_do_topic(list/href_list) + . = ..() + if(!.) + return + if(href_list[VV_HK_PARSE_GASSTRING]) + var/gasstring = input(usr, "Input Gas String (WARNING: Advanced. Don't use this unless you know how these work.", "Gas String Parse") as text|null + if(!istext(gasstring)) + return + log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Set to gas string [gasstring].") + message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Set to gas string [gasstring].") + parse_gas_string(gasstring) + if(href_list[VV_HK_EMPTY]) + log_admin("[key_name(usr)] emptied gas mixture [REF(src)].") + message_admins("[key_name(usr)] emptied gas mixture [REF(src)].") + clear() + if(href_list[VV_HK_SET_MOLES]) + var/list/gases = get_gases() + for(var/gas in gases) + gases[gas] = get_moles(gas) + var/gasid = input(usr, "What kind of gas?", "Set Gas") as null|anything in GLOB.gas_data.ids + if(!gasid) + return + var/amount = input(usr, "Input amount", "Set Gas", gases[gasid] || 0) as num|null + if(!isnum(amount)) + return + amount = max(0, amount) + log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Set gas [gasid] to [amount] moles.") + message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Set gas [gasid] to [amount] moles.") + set_moles(gasid, amount) + if(href_list[VV_HK_SET_TEMPERATURE]) + var/temp = input(usr, "Set the temperature of this mixture to?", "Set Temperature", return_temperature()) as num|null + if(!isnum(temp)) + return + temp = max(2.7, temp) + log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Changed temperature to [temp].") + message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Changed temperature to [temp].") + set_temperature(temp) + if(href_list[VV_HK_SET_VOLUME]) + var/volume = input(usr, "Set the volume of this mixture to?", "Set Volume", return_volume()) as num|null + if(!isnum(volume)) + return + volume = max(0, volume) + log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Changed volume to [volume].") + message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Changed volume to [volume].") + set_volume(volume) + /datum/gas_mixture/proc/__gasmixture_unregister() /datum/gas_mixture/proc/__gasmixture_register() @@ -49,7 +123,9 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) L[gt] = initial(G.specific_heat) return L -/datum/gas_mixture/proc/heat_capacity(data = MOLES) //joules per kelvin +/datum/gas_mixture/proc/heat_capacity() //joules per kelvin + +/datum/gas_mixture/proc/partial_heat_capacity(gas_type) /datum/gas_mixture/proc/total_moles() @@ -62,7 +138,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) /datum/gas_mixture/proc/set_volume(new_volume) /datum/gas_mixture/proc/get_moles(gas_type) /datum/gas_mixture/proc/set_moles(gas_type, moles) -/datum/gas_mixture/proc/scrub_into(datum/gas_mixture/target, list/gases) +/datum/gas_mixture/proc/scrub_into(datum/gas_mixture/target, ratio, list/gases) /datum/gas_mixture/proc/mark_immutable() /datum/gas_mixture/proc/get_gases() /datum/gas_mixture/proc/multiply(factor) @@ -70,7 +146,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) /datum/gas_mixture/proc/clear() /datum/gas_mixture/proc/adjust_moles(gas_type, amt = 0) - set_moles(gas_type, get_moles(gas_type) + amt) + set_moles(gas_type, clamp(get_moles(gas_type) + amt,0,INFINITY)) /datum/gas_mixture/proc/return_volume() //liters @@ -81,13 +157,18 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) //Returns: 1 in all cases /datum/gas_mixture/proc/merge(datum/gas_mixture/giver) - //Merges all air from giver into self. Deletes giver. + //Merges all air from giver into self. Does NOT delete the giver. //Returns: 1 if we are mutable, 0 otherwise /datum/gas_mixture/proc/remove(amount) //Proportionally removes amount of gas from the gas_mixture //Returns: gas_mixture with the gases removed +/datum/gas_mixture/proc/transfer_to(datum/gas_mixture/target, amount) + +/datum/gas_mixture/proc/transfer_ratio_to(datum/gas_mixture/target, ratio) + //Transfers ratio of gas to target. Equivalent to target.merge(remove_ratio(amount)) but faster. + /datum/gas_mixture/proc/remove_ratio(ratio) //Proportionally removes amount of gas from the gas_mixture //Returns: gas_mixture with the gases removed @@ -124,6 +205,24 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) //Performs various reactions such as combustion or fusion (LOL) //Returns: 1 if any reaction took place; 0 otherwise +/datum/gas_mixture/proc/adjust_heat(amt) + //Adjusts the thermal energy of the gas mixture, rather than having to do the full calculation. + //Returns: null + +/datum/gas_mixture/proc/equalize_with(datum/gas_mixture/giver) + //Makes this mix have the same temperature and gas ratios as the giver, but with the same pressure, accounting for volume. + //Returns: null + +/datum/gas_mixture/proc/get_oxidation_power(temp) + //Gets how much oxidation this gas can do, optionally at a given temperature. + +/datum/gas_mixture/proc/get_fuel_amount(temp) + //Gets how much fuel for fires (not counting trit/plasma!) this gas has, optionally at a given temperature. + +/proc/equalize_all_gases_in_list(list/L) + //Makes every gas in the given list have the same pressure, temperature and gas proportions. + //Returns: null + /datum/gas_mixture/proc/__remove() /datum/gas_mixture/remove(amount) var/datum/gas_mixture/removed = new type @@ -145,73 +244,27 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) return copy /datum/gas_mixture/copy_from_turf(turf/model) + set_temperature(initial(model.initial_temperature)) parse_gas_string(model.initial_gas_mix) - - //acounts for changes in temperature - var/turf/model_parent = model.parent_type - if(model.temperature != initial(model.temperature) || model.temperature != initial(model_parent.temperature)) - set_temperature(model.temperature) - return 1 /datum/gas_mixture/parse_gas_string(gas_string) - gas_string = SSair.preprocess_gas_string(gas_string) - var/list/gas = params2list(gas_string) if(gas["TEMP"]) - set_temperature(text2num(gas["TEMP"])) + var/temp = text2num(gas["TEMP"]) gas -= "TEMP" + if(!isnum(temp) || temp < 2.7) + temp = 2.7 + set_temperature(temp) clear() for(var/id in gas) - var/path = id - 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 - set_moles(path, text2num(gas[id])) + set_moles(id, text2num(gas[id])) return 1 -/datum/gas_mixture/react(datum/holder) - . = NO_REACTION - var/list/reactions = list() - for(var/I in get_gases()) - reactions += SSair.gas_reactions[I] - if(!length(reactions)) - return - reaction_results = new - var/temp = return_temperature() - var/ener = thermal_energy() - - reaction_loop: - for(var/r in reactions) - var/datum/gas_reaction/reaction = r - - var/list/min_reqs = reaction.min_requirements - if((min_reqs["TEMP"] && temp < min_reqs["TEMP"]) \ - || (min_reqs["ENER"] && ener < min_reqs["ENER"])) - continue - - for(var/id in min_reqs) - if (id == "TEMP" || id == "ENER") - continue - if(get_moles(id) < min_reqs[id]) - continue reaction_loop - - //at this point, all requirements for the reaction are satisfied. we can now react() - - . |= reaction.react(src, holder) - if (. & STOP_REACTIONS) - break - -//Takes the amount of the gas you want to PP as an argument -//So I don't have to do some hacky switches/defines/magic strings -//eg: -//Tox_PP = get_partial_pressure(gas_mixture.toxins) -//O2_PP = get_partial_pressure(gas_mixture.oxygen) - -/datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure) - return (gas_pressure * R_IDEAL_GAS_EQUATION * return_temperature()) / BREATH_VOLUME -//inverse -/datum/gas_mixture/proc/get_true_breath_pressure(partial_pressure) - return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * return_temperature()) +/datum/gas_mixture/proc/set_analyzer_results(instability) + if(!analyzer_results) + analyzer_results = new + analyzer_results["fusion"] = instability //Mathematical proofs: /* @@ -223,3 +276,26 @@ get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() */ /datum/gas_mixture/turf + +/// Releases gas from src to output air. This means that it can not transfer air to gas mixture with higher pressure. +/datum/gas_mixture/proc/release_gas_to(datum/gas_mixture/output_air, target_pressure) + var/output_starting_pressure = output_air.return_pressure() + var/input_starting_pressure = return_pressure() + + if(output_starting_pressure >= min(target_pressure,input_starting_pressure-10)) + //No need to pump gas if target is already reached or input pressure is too low + //Need at least 10 kPa difference to overcome friction in the mechanism + return FALSE + + //Calculate necessary moles to transfer using PV = nRT + if((total_moles() > 0) && (return_temperature()>0)) + var/pressure_delta = min(target_pressure - output_starting_pressure, (input_starting_pressure - output_starting_pressure)/2) + //Can not have a pressure delta that would cause output_pressure > input_pressure + + var/transfer_moles = pressure_delta*output_air.return_volume()/(return_temperature() * R_IDEAL_GAS_EQUATION) + + //Actually transfer the gas + var/datum/gas_mixture/removed = remove(transfer_moles) + output_air.merge(removed) + return TRUE + return FALSE \ No newline at end of file diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm deleted file mode 100644 index 839b234ed2220..0000000000000 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ /dev/null @@ -1,176 +0,0 @@ -GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/plasma)) //the main four gases, which were at one time hardcoded -GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/pluoxium, /datum/gas/stimulum, /datum/gas/nitryl))) //unable to react amongst themselves - -/proc/meta_gas_list() - . = subtypesof(/datum/gas) - for(var/gas_path in .) - var/list/gas_info = new(7) - var/datum/gas/gas = gas_path - - gas_info[META_GAS_SPECIFIC_HEAT] = initial(gas.specific_heat) - gas_info[META_GAS_NAME] = initial(gas.name) - - gas_info[META_GAS_MOLES_VISIBLE] = initial(gas.moles_visible) - if(initial(gas.moles_visible) != null) - gas_info[META_GAS_OVERLAY] = new /list(FACTOR_GAS_VISIBLE_MAX) - for(var/i in 1 to FACTOR_GAS_VISIBLE_MAX) - gas_info[META_GAS_OVERLAY][i] = new /obj/effect/overlay/gas(initial(gas.gas_overlay), i * 255 / FACTOR_GAS_VISIBLE_MAX) - - gas_info[META_GAS_FUSION_POWER] = initial(gas.fusion_power) - gas_info[META_GAS_DANGER] = initial(gas.dangerous) - gas_info[META_GAS_ID] = initial(gas.id) - .[gas_path] = gas_info - -/proc/gas_id2path(id) - var/list/meta_gas = GLOB.meta_gas_info - if(id in meta_gas) - return id - for(var/path in meta_gas) - if(meta_gas[path][META_GAS_ID] == id) - return path - return "" - -/*||||||||||||||/----------\||||||||||||||*\ -||||||||||||||||[GAS DATUMS]|||||||||||||||| -||||||||||||||||\__________/|||||||||||||||| -||||These should never be instantiated. |||| -||||They exist only to make it easier |||| -||||to add a new gas. They are accessed |||| -||||only by meta_gas_list(). |||| -\*||||||||||||||||||||||||||||||||||||||||*/ - -/datum/gas - var/id = "" - var/specific_heat = 0 - var/name = "" - var/gas_overlay = "" //icon_state in icons/effects/atmospherics.dmi - var/moles_visible = null - var/dangerous = FALSE //currently used by canisters - var/fusion_power = 0 //How much the gas accelerates a fusion reaction - var/rarity = 0 // relative rarity compared to other gases, used when setting up the reactions list. - -// If you add or remove gases, update TOTAL_NUM_GASES in the extools code to match! Extools currently expects 14 gas types to exist. - -/datum/gas/oxygen - id = "o2" - specific_heat = 20 - name = "Oxygen" - rarity = 900 - -/datum/gas/nitrogen - id = "n2" - specific_heat = 20 - name = "Nitrogen" - rarity = 1000 - -/datum/gas/carbon_dioxide //what the fuck is this? - id = "co2" - specific_heat = 30 - name = "Carbon Dioxide" - rarity = 700 - -/datum/gas/plasma - id = "plasma" - specific_heat = 200 - name = "Plasma" - gas_overlay = "plasma" - moles_visible = MOLES_GAS_VISIBLE - dangerous = TRUE - rarity = 800 - -/datum/gas/water_vapor - id = "water_vapor" - specific_heat = 40 - name = "Water Vapor" - gas_overlay = "water_vapor" - moles_visible = MOLES_GAS_VISIBLE - fusion_power = 8 - rarity = 500 - -/datum/gas/hypernoblium - id = "nob" - specific_heat = 2000 - name = "Hyper-noblium" - gas_overlay = "freon" - moles_visible = MOLES_GAS_VISIBLE - dangerous = TRUE - rarity = 50 - -/datum/gas/nitrous_oxide - id = "n2o" - specific_heat = 40 - name = "Nitrous Oxide" - gas_overlay = "nitrous_oxide" - moles_visible = MOLES_GAS_VISIBLE * 2 - fusion_power = 10 - dangerous = TRUE - rarity = 600 - -/datum/gas/nitryl - id = "no2" - specific_heat = 20 - name = "Nitryl" - gas_overlay = "nitryl" - moles_visible = MOLES_GAS_VISIBLE - dangerous = TRUE - fusion_power = 16 - rarity = 100 - -/datum/gas/tritium - id = "tritium" - specific_heat = 10 - name = "Tritium" - gas_overlay = "tritium" - moles_visible = MOLES_GAS_VISIBLE - dangerous = TRUE - fusion_power = 1 - rarity = 300 - -/datum/gas/bz - id = "bz" - specific_heat = 20 - name = "BZ" - dangerous = TRUE - fusion_power = 8 - rarity = 400 - -/datum/gas/stimulum - id = "stim" - specific_heat = 5 - name = "Stimulum" - fusion_power = 7 - rarity = 1 - -/datum/gas/pluoxium - id = "pluox" - specific_heat = 80 - name = "Pluoxium" - fusion_power = -10 - rarity = 200 - -/datum/gas/miasma - id = "miasma" - specific_heat = 20 - name = "Miasma" - gas_overlay = "miasma" - moles_visible = MOLES_GAS_VISIBLE * 60 - rarity = 250 - -/datum/gas/unobtanium //C++ monstermos expects 14 gas types to exist, we only had 13 - id = "unobtanium" - specific_heat = 20 - name = "Unobtanium" - rarity = 2500 - -/obj/effect/overlay/gas - icon = 'icons/effects/atmospherics.dmi' - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - 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) - . = ..() - icon_state = state - alpha = alph diff --git a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm index 2f1a10e2756ab..7de056ed0261b 100644 --- a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm +++ b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm @@ -25,4 +25,4 @@ initial_temperature = T20C /datum/gas_mixture/immutable/cloner/populate() - set_moles(/datum/gas/nitrogen, MOLES_O2STANDARD + MOLES_N2STANDARD) + set_moles(GAS_N2, MOLES_O2STANDARD + MOLES_N2STANDARD) diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index a2ec4cc58e3e0..3f10e57a34190 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -2,22 +2,14 @@ /proc/init_gas_reactions() . = list() - for(var/type in subtypesof(/datum/gas)) - .[type] = list() for(var/r in subtypesof(/datum/gas_reaction)) var/datum/gas_reaction/reaction = r if(initial(reaction.exclude)) continue reaction = new r - var/datum/gas/reaction_key - for (var/req in reaction.min_requirements) - if (ispath(req)) - var/datum/gas/req_gas = req - if (!reaction_key || initial(reaction_key.rarity) > initial(req_gas.rarity)) - reaction_key = req_gas - .[reaction_key] += list(reaction) - sortTim(., /proc/cmp_gas_reactions, TRUE) + . += reaction + sortTim(., /proc/cmp_gas_reactions) /proc/cmp_gas_reactions(list/datum/gas_reaction/a, list/datum/gas_reaction/b) // compares lists of reactions by the maximum priority contained within the list if (!length(a) || !length(b)) @@ -36,7 +28,7 @@ //regarding the requirements lists: the minimum or maximum requirements must be non-zero. //when in doubt, use MINIMUM_MOLE_COUNT. var/list/min_requirements - var/major_gas //the highest rarity gas used in the reaction. + var/list/max_requirements var/exclude = FALSE //do it this way to allow for addition/removal of reactions midmatch in the future var/priority = 100 //lower numbers are checked/react later than higher numbers. if two reactions have the same priority they may happen in either order var/name = "reaction" @@ -56,7 +48,7 @@ id = "nobstop" /datum/gas_reaction/nobliumsupression/init_reqs() - min_requirements = list(/datum/gas/hypernoblium = REACTION_OPPRESSION_THRESHOLD) + min_requirements = list(GAS_HYPERNOB = REACTION_OPPRESSION_THRESHOLD) /datum/gas_reaction/nobliumsupression/react() return STOP_REACTIONS @@ -68,7 +60,7 @@ id = "vapor" /datum/gas_reaction/water_vapor/init_reqs() - min_requirements = list(/datum/gas/water_vapor = MOLES_GAS_VISIBLE) + min_requirements = list(GAS_H2O = MOLES_GAS_VISIBLE) /datum/gas_reaction/water_vapor/react(datum/gas_mixture/air, datum/holder) var/turf/open/location = isturf(holder) ? holder : null @@ -77,7 +69,7 @@ if(location && location.freon_gas_act()) . = REACTING else if(location && location.water_vapor_gas_act()) - air.adjust_moles(/datum/gas/water_vapor, -MOLES_GAS_VISIBLE) + air.adjust_moles(GAS_H2O, -MOLES_GAS_VISIBLE) . = REACTING //tritium combustion: combustion of oxygen and tritium (treated as hydrocarbons). creates hotspots. exothermic @@ -89,7 +81,7 @@ /datum/gas_reaction/nitrous_decomp/init_reqs() min_requirements = list( "TEMP" = N2O_DECOMPOSITION_MIN_ENERGY, - /datum/gas/nitrous_oxide = MINIMUM_MOLE_COUNT + GAS_NITROUS = MINIMUM_MOLE_COUNT ) /datum/gas_reaction/nitrous_decomp/react(datum/gas_mixture/air, datum/holder) @@ -99,14 +91,14 @@ var/burned_fuel = 0 - burned_fuel = max(0,0.00002*(temperature-(0.00001*(temperature**2))))*air.get_moles(/datum/gas/nitrous_oxide) - air.set_moles(/datum/gas/nitrous_oxide, air.get_moles(/datum/gas/nitrous_oxide) - burned_fuel) + burned_fuel = max(0,0.00002*(temperature-(0.00001*(temperature**2))))*air.get_moles(GAS_NITROUS) + air.set_moles(GAS_NITROUS, air.get_moles(GAS_NITROUS) - burned_fuel) if(burned_fuel) energy_released += (N2O_DECOMPOSITION_ENERGY_RELEASED * burned_fuel) - air.set_moles(/datum/gas/oxygen, air.get_moles(/datum/gas/oxygen) + burned_fuel/2) - air.set_moles(/datum/gas/nitrogen, air.get_moles(/datum/gas/nitrogen) + burned_fuel) + air.set_moles(GAS_O2, air.get_moles(GAS_O2) + burned_fuel/2) + air.set_moles(GAS_N2, air.get_moles(GAS_N2) + burned_fuel) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) @@ -123,10 +115,22 @@ /datum/gas_reaction/tritfire/init_reqs() min_requirements = list( "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST, - /datum/gas/tritium = MINIMUM_MOLE_COUNT, - /datum/gas/oxygen = MINIMUM_MOLE_COUNT + GAS_TRITIUM = MINIMUM_MOLE_COUNT, + GAS_O2 = MINIMUM_MOLE_COUNT ) +/proc/fire_expose(turf/open/location, datum/gas_mixture/air, temperature) + if(istype(location) && temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + location.hotspot_expose(temperature, CELL_VOLUME) + for(var/I in location) + var/atom/movable/item = I + item.temperature_expose(air, temperature, CELL_VOLUME) + location.temperature_expose(air, temperature, CELL_VOLUME) + +/proc/radiation_burn(turf/open/location, energy_released) + if(istype(location) && prob(10)) + radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR) + /datum/gas_reaction/tritfire/react(datum/gas_mixture/air, datum/holder) var/energy_released = 0 var/old_heat_capacity = air.heat_capacity() @@ -135,15 +139,15 @@ cached_results["fire"] = 0 var/turf/open/location = isturf(holder) ? holder : null var/burned_fuel = 0 - var/initial_trit = air.get_moles(/datum/gas/tritium)// Yogs - if(air.get_moles(/datum/gas/oxygen) < initial_trit || MINIMUM_TRIT_OXYBURN_ENERGY > (temperature * old_heat_capacity))// Yogs -- Maybe a tiny performance boost? I'unno - burned_fuel = air.get_moles(/datum/gas/oxygen)/TRITIUM_BURN_OXY_FACTOR + var/initial_trit = air.get_moles(GAS_TRITIUM)// Yogs + if(air.get_moles(GAS_O2) < initial_trit || MINIMUM_TRIT_OXYBURN_ENERGY > (temperature * old_heat_capacity))// Yogs -- Maybe a tiny performance boost? I'unno + burned_fuel = air.get_moles(GAS_O2)/TRITIUM_BURN_OXY_FACTOR if(burned_fuel > initial_trit) burned_fuel = initial_trit //Yogs -- prevents negative moles of Tritium - air.adjust_moles(/datum/gas/tritium, -burned_fuel) + air.adjust_moles(GAS_TRITIUM, -burned_fuel) else burned_fuel = initial_trit // Yogs -- Conservation of Mass fix - air.set_moles(/datum/gas/tritium, air.get_moles(/datum/gas/tritium) * (1 - 1/TRITIUM_BURN_TRIT_FACTOR)) // Yogs -- Maybe a tiny performance boost? I'unno - air.adjust_moles(/datum/gas/oxygen, -air.get_moles(/datum/gas/tritium)) + air.set_moles(GAS_TRITIUM, air.get_moles(GAS_TRITIUM) * (1 - 1/TRITIUM_BURN_TRIT_FACTOR)) // Yogs -- Maybe a tiny performance boost? I'unno + air.adjust_moles(GAS_O2, -air.get_moles(GAS_TRITIUM)) energy_released += (FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel * (TRITIUM_BURN_TRIT_FACTOR - 1)) // Yogs -- Fixes low-energy tritium fires if(burned_fuel) @@ -152,7 +156,7 @@ radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR) //oxygen+more-or-less hydrogen=H2O - air.adjust_moles(/datum/gas/water_vapor, burned_fuel )// Yogs -- Conservation of Mass + air.adjust_moles(GAS_H2O, burned_fuel )// Yogs -- Conservation of Mass cached_results["fire"] += burned_fuel @@ -182,8 +186,8 @@ /datum/gas_reaction/plasmafire/init_reqs() min_requirements = list( "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST, - /datum/gas/plasma = MINIMUM_MOLE_COUNT, - /datum/gas/oxygen = MINIMUM_MOLE_COUNT + GAS_PLASMA = MINIMUM_MOLE_COUNT, + GAS_O2 = MINIMUM_MOLE_COUNT ) /datum/gas_reaction/plasmafire/react(datum/gas_mixture/air, datum/holder) @@ -208,21 +212,21 @@ temperature_scale = (temperature-PLASMA_MINIMUM_BURN_TEMPERATURE)/(PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE) if(temperature_scale > 0) oxygen_burn_rate = OXYGEN_BURN_RATE_BASE - temperature_scale - if(air.get_moles(/datum/gas/oxygen) / air.get_moles(/datum/gas/plasma) > SUPER_SATURATION_THRESHOLD) //supersaturation. Form Tritium. + if(air.get_moles(GAS_O2) / air.get_moles(GAS_PLASMA) > SUPER_SATURATION_THRESHOLD) //supersaturation. Form Tritium. super_saturation = TRUE - if(air.get_moles(/datum/gas/oxygen) > air.get_moles(/datum/gas/plasma)*PLASMA_OXYGEN_FULLBURN) - plasma_burn_rate = (air.get_moles(/datum/gas/plasma)*temperature_scale)/PLASMA_BURN_RATE_DELTA + if(air.get_moles(GAS_O2) > air.get_moles(GAS_PLASMA)*PLASMA_OXYGEN_FULLBURN) + plasma_burn_rate = (air.get_moles(GAS_PLASMA)*temperature_scale)/PLASMA_BURN_RATE_DELTA else - plasma_burn_rate = (temperature_scale*(air.get_moles(/datum/gas/oxygen)/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA + plasma_burn_rate = (temperature_scale*(air.get_moles(GAS_O2)/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY) - plasma_burn_rate = min(plasma_burn_rate,air.get_moles(/datum/gas/plasma),air.get_moles(/datum/gas/oxygen)/oxygen_burn_rate) //Ensures matter is conserved properly - air.set_moles(/datum/gas/plasma, QUANTIZE(air.get_moles(/datum/gas/plasma) - plasma_burn_rate)) - air.set_moles(/datum/gas/oxygen, QUANTIZE(air.get_moles(/datum/gas/oxygen) - (plasma_burn_rate * oxygen_burn_rate))) + plasma_burn_rate = min(plasma_burn_rate,air.get_moles(GAS_PLASMA),air.get_moles(GAS_O2)/oxygen_burn_rate) //Ensures matter is conserved properly + air.set_moles(GAS_PLASMA, QUANTIZE(air.get_moles(GAS_PLASMA) - plasma_burn_rate)) + air.set_moles(GAS_O2, QUANTIZE(air.get_moles(GAS_O2) - (plasma_burn_rate * oxygen_burn_rate))) if (super_saturation) - air.adjust_moles(/datum/gas/tritium, plasma_burn_rate) + air.adjust_moles(GAS_TRITIUM, plasma_burn_rate) else - air.adjust_moles(/datum/gas/carbon_dioxide, plasma_burn_rate) + air.adjust_moles(GAS_CO2, plasma_burn_rate) energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate) @@ -245,6 +249,84 @@ return cached_results["fire"] ? REACTING : NO_REACTION +/datum/gas_reaction/genericfire + priority = -3 // very last reaction + name = "Combustion" + id = "genericfire" + +/datum/gas_reaction/genericfire/init_reqs() + var/lowest_fire_temp = INFINITY + var/list/fire_temperatures = GLOB.gas_data.fire_temperatures + for(var/gas in fire_temperatures) + lowest_fire_temp = min(lowest_fire_temp, fire_temperatures[gas]) + var/lowest_oxi_temp = INFINITY + var/list/oxidation_temperatures = GLOB.gas_data.oxidation_temperatures + for(var/gas in oxidation_temperatures) + lowest_oxi_temp = min(lowest_oxi_temp, oxidation_temperatures[gas]) + min_requirements = list( + "TEMP" = max(lowest_oxi_temp, lowest_fire_temp), + "FIRE_REAGENTS" = MINIMUM_MOLE_COUNT + ) + +// no requirements, always runs +// bad idea? maybe +// this is overridden by auxmos but, hey, good idea to have it readable + +/datum/gas_reaction/genericfire/react(datum/gas_mixture/air, datum/holder) + var/temperature = air.return_temperature() + var/list/oxidation_temps = GLOB.gas_data.oxidation_temperatures + var/list/oxidation_rates = GLOB.gas_data.oxidation_rates + var/oxidation_power = 0 + var/list/burn_results = list() + var/list/fuels = list() + var/list/oxidizers = list() + var/list/fuel_rates = GLOB.gas_data.fire_burn_rates + var/list/fuel_temps = GLOB.gas_data.fire_temperatures + var/total_fuel = 0 + var/energy_released = 0 + for(var/G in air.get_gases()) + var/oxidation_temp = oxidation_temps[G] + if(oxidation_temp && oxidation_temp > temperature) + var/temperature_scale = max(0, 1-(temperature / oxidation_temp)) + var/amt = air.get_moles(G) * temperature_scale + oxidizers[G] = amt + oxidation_power += amt * oxidation_rates[G] + else + var/fuel_temp = fuel_temps[G] + if(fuel_temp && fuel_temp > temperature) + var/amt = (air.get_moles(G) / fuel_rates[G]) * max(0, 1-(temperature / fuel_temp)) + fuels[G] = amt // we have to calculate the actual amount we're using after we get all oxidation together + total_fuel += amt + if(oxidation_power <= 0 || total_fuel <= 0) + return NO_REACTION + var/oxidation_ratio = oxidation_power / total_fuel + if(oxidation_ratio > 1) + for(var/oxidizer in oxidizers) + oxidizers[oxidizer] /= oxidation_ratio + else if(oxidation_ratio < 1) + for(var/fuel in fuels) + fuels[fuel] *= oxidation_ratio + fuels += oxidizers + var/list/fire_products = GLOB.gas_data.fire_products + var/list/fire_enthalpies = GLOB.gas_data.fire_enthalpies + for(var/fuel in fuels + oxidizers) + var/amt = fuels[fuel] + if(!burn_results[fuel]) + burn_results[fuel] = 0 + burn_results[fuel] -= amt + energy_released += amt * fire_enthalpies[fuel] + for(var/product in fire_products[fuel]) + if(!burn_results[product]) + burn_results[product] = 0 + burn_results[product] += amt + var/final_energy = air.thermal_energy() + energy_released + for(var/result in burn_results) + air.adjust_moles(result, burn_results[result]) + air.set_temperature(final_energy / air.heat_capacity()) + var/list/cached_results = air.reaction_results + cached_results["fire"] = min(total_fuel, oxidation_power) * 2 + return cached_results["fire"] ? REACTING : NO_REACTION + //fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again (and again, and again). Again! //Fusion Rework Counter: Please increment this if you make a major overhaul to this system again. //6 reworks @@ -258,9 +340,9 @@ /datum/gas_reaction/fusion/init_reqs() min_requirements = list( "TEMP" = FUSION_TEMPERATURE_THRESHOLD, - /datum/gas/tritium = FUSION_TRITIUM_MOLES_USED, - /datum/gas/plasma = FUSION_MOLE_THRESHOLD, - /datum/gas/carbon_dioxide = FUSION_MOLE_THRESHOLD) + GAS_TRITIUM = FUSION_TRITIUM_MOLES_USED, + GAS_PLASMA = FUSION_MOLE_THRESHOLD, + GAS_CO2 = FUSION_MOLE_THRESHOLD) /datum/gas_reaction/fusion/react(datum/gas_mixture/air, datum/holder) var/turf/open/location @@ -272,16 +354,21 @@ if(!air.analyzer_results) air.analyzer_results = new var/list/cached_scan_results = air.analyzer_results - var/old_thermal_energy = air.thermal_energy() + var/thermal_energy = air.thermal_energy() var/reaction_energy = 0 //Reaction energy can be negative or positive, for both exothermic and endothermic reactions. - var/initial_plasma = air.get_moles(/datum/gas/plasma) - var/initial_carbon = air.get_moles(/datum/gas/carbon_dioxide) - var/scale_factor = (air.return_volume())/(PI) //We scale it down by volume/Pi because for fusion conditions, moles roughly = 2*volume, but we want it to be based off something constant between reactions. - var/toroidal_size = (2*PI)+TORADIANS(arctan((air.return_volume()-TOROID_VOLUME_BREAKEVEN)/TOROID_VOLUME_BREAKEVEN)) //The size of the phase space hypertorus + var/initial_plasma = air.get_moles(GAS_PLASMA) + var/initial_carbon = air.get_moles(GAS_CO2) + var/scale_factor = max(air.return_volume() / FUSION_SCALE_DIVISOR, FUSION_MINIMAL_SCALE) + var/temperature_scale = log(10, air.return_temperature()) + //The size of the phase space hypertorus + var/toroidal_size = TOROID_CALCULATED_THRESHOLD \ + + (temperature_scale <= FUSION_BASE_TEMPSCALE ? \ + (temperature_scale-FUSION_BASE_TEMPSCALE) / FUSION_BUFFER_DIVISOR \ + : 4 ** (temperature_scale-FUSION_BASE_TEMPSCALE) / FUSION_SLOPE_DIVISOR) var/gas_power = 0 for (var/gas_id in air.get_gases()) - gas_power += (GLOB.meta_gas_info[gas_id][META_GAS_FUSION_POWER]*air.get_moles(gas_id)) - var/instability = MODULUS((gas_power*INSTABILITY_GAS_POWER_FACTOR)**2,toroidal_size) //Instability effects how chaotic the behavior of the reaction is + gas_power += (GLOB.gas_data.fusion_powers[gas_id]*air.get_moles(gas_id)) + var/instability = MODULUS((gas_power*INSTABILITY_GAS_POWER_FACTOR),toroidal_size) //Instability effects how chaotic the behavior of the reaction is cached_scan_results[id] = instability//used for analyzer feedback var/plasma = (initial_plasma-FUSION_MOLE_THRESHOLD)/(scale_factor) //We have to scale the amounts of carbon and plasma down a significant amount in order to show the chaotic dynamics we want @@ -291,41 +378,49 @@ plasma = MODULUS(plasma - (instability*sin(TODEGREES(carbon))), toroidal_size) carbon = MODULUS(carbon - plasma, toroidal_size) + air.set_moles(GAS_PLASMA, plasma*scale_factor + FUSION_MOLE_THRESHOLD )//Scales the gases back up + air.set_moles(GAS_CO2, carbon*scale_factor + FUSION_MOLE_THRESHOLD) + var/delta_plasma = min(initial_plasma - air.get_moles(GAS_PLASMA), toroidal_size * scale_factor * 1.5) - air.set_moles(/datum/gas/plasma, plasma*scale_factor + FUSION_MOLE_THRESHOLD )//Scales the gases back up - air.set_moles(/datum/gas/carbon_dioxide, carbon*scale_factor + FUSION_MOLE_THRESHOLD) - var/delta_plasma = initial_plasma - air.get_moles(/datum/gas/plasma) + //Energy is gained or lost corresponding to the creation or destruction of mass. + //Low instability prevents endothermality while higher instability acutally encourages it. + reaction_energy = instability <= FUSION_INSTABILITY_ENDOTHERMALITY || delta_plasma > 0 ? \ + max(delta_plasma*PLASMA_BINDING_ENERGY, 0) \ + : delta_plasma*PLASMA_BINDING_ENERGY * (instability-FUSION_INSTABILITY_ENDOTHERMALITY)**0.5 - reaction_energy += delta_plasma*PLASMA_BINDING_ENERGY //Energy is gained or lost corresponding to the creation or destruction of mass. - if(instability < FUSION_INSTABILITY_ENDOTHERMALITY) - reaction_energy = max(reaction_energy,0) //Stable reactions don't end up endothermic. - else if (reaction_energy < 0) - reaction_energy *= (instability-FUSION_INSTABILITY_ENDOTHERMALITY)**0.5 + //To achieve faster equilibrium. Too bad it is not that good at cooling down. + if (reaction_energy) + var/middle_energy = (((TOROID_CALCULATED_THRESHOLD / 2) * scale_factor) + FUSION_MOLE_THRESHOLD) * (200 * FUSION_MIDDLE_ENERGY_REFERENCE) + thermal_energy = middle_energy * FUSION_ENERGY_TRANSLATION_EXPONENT ** log(10, thermal_energy / middle_energy) + + //This bowdlerization is a double-edged sword. Tread with care! + var/bowdlerized_reaction_energy = clamp(reaction_energy, \ + thermal_energy * ((1 / FUSION_ENERGY_TRANSLATION_EXPONENT ** 2) - 1), \ + thermal_energy * (FUSION_ENERGY_TRANSLATION_EXPONENT ** 2 - 1)) + thermal_energy = middle_energy * 10 ** log(FUSION_ENERGY_TRANSLATION_EXPONENT, (thermal_energy + bowdlerized_reaction_energy) / middle_energy) + + //The reason why you should set up a tritium production line. + air.adjust_moles(GAS_TRITIUM, -FUSION_TRITIUM_MOLES_USED) - if(old_thermal_energy + reaction_energy < 0) //No using energy that doesn't exist. - air.set_moles(/datum/gas/plasma, initial_plasma) - air.set_moles(/datum/gas/carbon_dioxide, initial_carbon) - return NO_REACTION - air.adjust_moles(/datum/gas/tritium, -FUSION_TRITIUM_MOLES_USED) //The decay of the tritium and the reaction's energy produces waste gases, different ones depending on whether the reaction is endo or exothermic - if(reaction_energy > 0) - air.adjust_moles(/datum/gas/oxygen, FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT)) - air.adjust_moles(/datum/gas/nitrous_oxide, FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT)) - else - air.adjust_moles(/datum/gas/bz, FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT)) - air.adjust_moles(/datum/gas/nitryl, FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT)) + var/standard_waste_gas_output = scale_factor * (FUSION_TRITIUM_CONVERSION_COEFFICIENT*FUSION_TRITIUM_MOLES_USED) + delta_plasma > 0 ? air.adjust_moles(GAS_H2O, standard_waste_gas_output) : air.adjust_moles(GAS_BZ, standard_waste_gas_output) + air.adjust_moles(GAS_O2, standard_waste_gas_output) //Oxygen is a bit touchy subject if(reaction_energy) if(location) - var/particle_chance = ((PARTICLE_CHANCE_CONSTANT)/(reaction_energy-PARTICLE_CHANCE_CONSTANT)) + 1//Asymptopically approaches 100% as the energy of the reaction goes up. - if(prob(PERCENT(particle_chance))) - location.fire_nuclear_particle() - var/rad_power = max((FUSION_RAD_COEFFICIENT/instability) + FUSION_RAD_MAX,0) - radiation_pulse(location,rad_power) - + var/standard_energy = 400 * air.get_moles(GAS_PLASMA) * air.return_temperature() //Prevents putting meaningless waste gases to achieve high rads. + if(prob(PERCENT(((PARTICLE_CHANCE_CONSTANT)/(reaction_energy-PARTICLE_CHANCE_CONSTANT)) + 1))) //Asymptopically approaches 100% as the energy of the reaction goes up. + location.fire_nuclear_particle(customize = TRUE, custompower = standard_energy) + radiation_pulse(location, max(2000 * 3 ** (log(10,standard_energy) - FUSION_RAD_MIDPOINT), 0)) + var/new_heat_capacity = air.heat_capacity() + if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) + air.set_temperature(clamp(thermal_energy/new_heat_capacity, TCMB, INFINITY)) + return REACTING + else if(reaction_energy == 0 && instability <= FUSION_INSTABILITY_ENDOTHERMALITY) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.set_temperature(CLAMP(((old_thermal_energy + reaction_energy)/new_heat_capacity),TCMB,INFINITY)) + air.set_temperature(clamp(thermal_energy/new_heat_capacity, TCMB, INFINITY)) //THIS SHOULD STAY OR FUSION WILL EAT YOUR FACE return REACTING /datum/gas_reaction/nitrylformation //The formation of nitryl. Endothermic. Requires N2O as a catalyst. @@ -335,9 +430,9 @@ /datum/gas_reaction/nitrylformation/init_reqs() min_requirements = list( - /datum/gas/oxygen = 20, - /datum/gas/nitrogen = 20, - /datum/gas/pluoxium = 5, //Gates Nitryl behind pluoxium to offset N2O burning up during formation + GAS_O2 = 20, + GAS_N2 = 20, + GAS_PLUOXIUM = 5, //Gates Nitryl behind pluoxium to offset N2O burning up during formation "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST*60 ) @@ -345,13 +440,13 @@ var/temperature = air.return_temperature() var/old_heat_capacity = air.heat_capacity() - var/heat_efficency = min(temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*60),air.get_moles(/datum/gas/oxygen),air.get_moles(/datum/gas/nitrogen)) + var/heat_efficency = min(temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*60),air.get_moles(GAS_O2),air.get_moles(GAS_N2)) var/energy_used = heat_efficency*NITRYL_FORMATION_ENERGY - if ((air.get_moles(/datum/gas/oxygen) - heat_efficency < 0 )|| (air.get_moles(/datum/gas/nitrogen) - heat_efficency < 0)) //Shouldn't produce gas from nothing. + if ((air.get_moles(GAS_O2) - heat_efficency < 0 )|| (air.get_moles(GAS_N2) - heat_efficency < 0)) //Shouldn't produce gas from nothing. return NO_REACTION - air.adjust_moles(/datum/gas/oxygen, -heat_efficency) - air.adjust_moles(/datum/gas/nitrogen, -heat_efficency) - air.adjust_moles(/datum/gas/nitryl, heat_efficency*2) + air.adjust_moles(GAS_O2, -heat_efficency) + air.adjust_moles(GAS_N2, -heat_efficency) + air.adjust_moles(GAS_NITRYL, heat_efficency*2) if(energy_used > 0) var/new_heat_capacity = air.heat_capacity() @@ -366,8 +461,8 @@ /datum/gas_reaction/bzformation/init_reqs() min_requirements = list( - /datum/gas/nitrous_oxide = 10, - /datum/gas/plasma = 10 + GAS_NITROUS = 10, + GAS_PLASMA = 10 ) @@ -375,18 +470,18 @@ var/temperature = air.return_temperature() var/pressure = air.return_pressure() var/old_heat_capacity = air.heat_capacity() - var/reaction_efficency = min(1/((pressure/(0.5*ONE_ATMOSPHERE))*(max(air.get_moles(/datum/gas/plasma)/air.get_moles(/datum/gas/nitrous_oxide),1))),air.get_moles(/datum/gas/nitrous_oxide),air.get_moles(/datum/gas/plasma)/2) + var/reaction_efficency = min(1/((pressure/(0.5*ONE_ATMOSPHERE))*(max(air.get_moles(GAS_PLASMA)/air.get_moles(GAS_NITROUS),1))),air.get_moles(GAS_NITROUS),air.get_moles(GAS_PLASMA)/2) var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED - if ((air.get_moles(/datum/gas/nitrous_oxide) - reaction_efficency < 0 )|| (air.get_moles(/datum/gas/plasma) - (2*reaction_efficency) < 0) || energy_released <= 0) //Shouldn't produce gas from nothing. + if ((air.get_moles(GAS_NITROUS) - reaction_efficency < 0 )|| (air.get_moles(GAS_PLASMA) - (2*reaction_efficency) < 0) || energy_released <= 0) //Shouldn't produce gas from nothing. return NO_REACTION - air.adjust_moles(/datum/gas/bz, reaction_efficency) - if(reaction_efficency == air.get_moles(/datum/gas/nitrous_oxide)) - air.adjust_moles(/datum/gas/bz, -min(pressure,1)) - air.adjust_moles(/datum/gas/oxygen, min(pressure,1)) - air.adjust_moles(/datum/gas/nitrous_oxide, -reaction_efficency) - air.adjust_moles(/datum/gas/plasma, -2*reaction_efficency) + air.adjust_moles(GAS_BZ, reaction_efficency) + if(reaction_efficency == air.get_moles(GAS_NITROUS)) + air.adjust_moles(GAS_BZ, -min(pressure,1)) + air.adjust_moles(GAS_O2, min(pressure,1)) + air.adjust_moles(GAS_NITROUS, -reaction_efficency) + air.adjust_moles(GAS_PLASMA, -2*reaction_efficency) - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min((reaction_efficency**2)*BZ_RESEARCH_SCALE),BZ_RESEARCH_MAX_AMOUNT) + SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min((reaction_efficency**2)*BZ_RESEARCH_SCALE,BZ_RESEARCH_MAX_AMOUNT)) if(energy_released > 0) var/new_heat_capacity = air.heat_capacity() @@ -401,24 +496,24 @@ /datum/gas_reaction/stimformation/init_reqs() min_requirements = list( - /datum/gas/tritium = 30, - /datum/gas/plasma = 10, - /datum/gas/bz = 20, - /datum/gas/nitryl = 30, + GAS_TRITIUM = 30, + GAS_PLASMA = 10, + GAS_BZ = 20, + GAS_NITRYL = 30, "TEMP" = STIMULUM_HEAT_SCALE/2) /datum/gas_reaction/stimformation/react(datum/gas_mixture/air) var/old_heat_capacity = air.heat_capacity() - var/heat_scale = min(air.return_temperature()/STIMULUM_HEAT_SCALE,air.get_moles(/datum/gas/plasma),air.get_moles(/datum/gas/nitryl)) + var/heat_scale = min(air.return_temperature()/STIMULUM_HEAT_SCALE,air.get_moles(GAS_PLASMA),air.get_moles(GAS_NITRYL)) var/stim_energy_change = heat_scale + STIMULUM_FIRST_RISE*(heat_scale**2) - STIMULUM_FIRST_DROP*(heat_scale**3) + STIMULUM_SECOND_RISE*(heat_scale**4) - STIMULUM_ABSOLUTE_DROP*(heat_scale**5) - if ((air.get_moles(/datum/gas/plasma) - heat_scale < 0) || (air.get_moles(/datum/gas/nitryl) - heat_scale < 0) || (air.get_moles(/datum/gas/tritium) - heat_scale < 0)) //Shouldn't produce gas from nothing. + if ((air.get_moles(GAS_PLASMA) - heat_scale < 0) || (air.get_moles(GAS_NITRYL) - heat_scale < 0) || (air.get_moles(GAS_TRITIUM) - heat_scale < 0)) //Shouldn't produce gas from nothing. return NO_REACTION - air.adjust_moles(/datum/gas/stimulum, heat_scale/10) - air.adjust_moles(/datum/gas/plasma, -heat_scale) - air.adjust_moles(/datum/gas/nitryl, -heat_scale) - air.adjust_moles(/datum/gas/tritium, -heat_scale) + air.adjust_moles(GAS_STIMULUM, heat_scale/10) + air.adjust_moles(GAS_PLASMA, -heat_scale) + air.adjust_moles(GAS_NITRYL, -heat_scale) + air.adjust_moles(GAS_TRITIUM, -heat_scale) SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, STIMULUM_RESEARCH_AMOUNT*max(stim_energy_change,0)) if(stim_energy_change) var/new_heat_capacity = air.heat_capacity() @@ -433,19 +528,19 @@ /datum/gas_reaction/nobliumformation/init_reqs() min_requirements = list( - /datum/gas/nitrogen = 10, - /datum/gas/tritium = 5, + GAS_N2 = 10, + GAS_TRITIUM = 5, "TEMP" = 5000000) /datum/gas_reaction/nobliumformation/react(datum/gas_mixture/air) var/old_heat_capacity = air.heat_capacity() - var/nob_formed = min((air.get_moles(/datum/gas/nitrogen)+air.get_moles(/datum/gas/tritium))/100,air.get_moles(/datum/gas/tritium)/10,air.get_moles(/datum/gas/nitrogen)/20) - var/energy_taken = nob_formed*(NOBLIUM_FORMATION_ENERGY/(max(air.get_moles(/datum/gas/bz),1))) - if ((air.get_moles(/datum/gas/tritium) - 10*nob_formed < 0) || (air.get_moles(/datum/gas/nitrogen) - 20*nob_formed < 0)) + var/nob_formed = min((air.get_moles(GAS_N2)+air.get_moles(GAS_TRITIUM))/100,air.get_moles(GAS_TRITIUM)/10,air.get_moles(GAS_N2)/20) + var/energy_taken = nob_formed*(NOBLIUM_FORMATION_ENERGY/(max(air.get_moles(GAS_BZ),1))) + if ((air.get_moles(GAS_TRITIUM) - 10*nob_formed < 0) || (air.get_moles(GAS_N2) - 20*nob_formed < 0)) return NO_REACTION - air.adjust_moles(/datum/gas/tritium, -10*nob_formed) - air.adjust_moles(/datum/gas/nitrogen, -20*nob_formed) - air.adjust_moles(/datum/gas/hypernoblium, nob_formed) + air.adjust_moles(GAS_TRITIUM, -10*nob_formed) + air.adjust_moles(GAS_N2, -20*nob_formed) + air.adjust_moles(GAS_HYPERNOB, nob_formed) SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, nob_formed*NOBLIUM_RESEARCH_AMOUNT) if (nob_formed) @@ -462,18 +557,18 @@ /datum/gas_reaction/miaster/init_reqs() min_requirements = list( "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST+70, - /datum/gas/miasma = MINIMUM_MOLE_COUNT + GAS_MIASMA = MINIMUM_MOLE_COUNT ) /datum/gas_reaction/miaster/react(datum/gas_mixture/air, datum/holder) // As the name says it, it needs to be dry - if(air.get_moles(/datum/gas/water_vapor)/air.total_moles() > 0.1) + if(air.get_moles(GAS_H2O)/air.total_moles() > 0.1) return //Replace miasma with oxygen - var/cleaned_air = min(air.get_moles(/datum/gas/miasma), 20 + (air.return_temperature() - FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 70) / 20) - air.adjust_moles(/datum/gas/miasma, -cleaned_air) - air.adjust_moles(/datum/gas/oxygen, cleaned_air) + var/cleaned_air = min(air.get_moles(GAS_MIASMA), 20 + (air.return_temperature() - FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 70) / 20) + air.adjust_moles(GAS_MIASMA, -cleaned_air) + air.adjust_moles(GAS_O2, cleaned_air) //Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable air.set_temperature(air.return_temperature() + cleaned_air * 0.002) @@ -486,10 +581,10 @@ /datum/gas_reaction/stim_ball/init_reqs() min_requirements = list( - /datum/gas/pluoxium = STIM_BALL_GAS_AMOUNT, - /datum/gas/stimulum = STIM_BALL_GAS_AMOUNT, - /datum/gas/nitryl = MINIMUM_MOLE_COUNT, - /datum/gas/plasma = MINIMUM_MOLE_COUNT, + GAS_PLUOXIUM = STIM_BALL_GAS_AMOUNT, + GAS_STIMULUM = STIM_BALL_GAS_AMOUNT, + GAS_NITRYL = MINIMUM_MOLE_COUNT, + GAS_PLASMA = MINIMUM_MOLE_COUNT, "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST ) @@ -501,16 +596,16 @@ location = get_turf(pick(pipenet.members)) else location = get_turf(holder) - var/ball_shot_angle = 180*cos(air.get_moles(/datum/gas/water_vapor)/air.get_moles(/datum/gas/nitryl))+180 - var/stim_used = min(STIM_BALL_GAS_AMOUNT/air.get_moles(/datum/gas/plasma),air.get_moles(/datum/gas/stimulum)) - var/pluox_used = min(STIM_BALL_GAS_AMOUNT/air.get_moles(/datum/gas/plasma),air.get_moles(/datum/gas/pluoxium)) + var/ball_shot_angle = 180*cos(air.get_moles(GAS_H2O)/air.get_moles(GAS_NITRYL))+180 + var/stim_used = min(STIM_BALL_GAS_AMOUNT/air.get_moles(GAS_PLASMA),air.get_moles(GAS_STIMULUM)) + var/pluox_used = min(STIM_BALL_GAS_AMOUNT/air.get_moles(GAS_PLASMA),air.get_moles(GAS_PLUOXIUM)) var/energy_released = stim_used*STIMULUM_HEAT_SCALE//Stimulum has a lot of stored energy, and breaking it up releases some of it location.fire_nuclear_particle(ball_shot_angle) - air.adjust_moles(/datum/gas/carbon_dioxide, 4*pluox_used) - air.adjust_moles(/datum/gas/nitrogen, 8*stim_used) - air.adjust_moles(/datum/gas/pluoxium, -pluox_used) - air.adjust_moles(/datum/gas/stimulum, -stim_used) - air.adjust_moles(/datum/gas/plasma, -air.get_moles(/datum/gas/plasma)/2) + air.adjust_moles(GAS_CO2, 4*pluox_used) + air.adjust_moles(GAS_N2, 8*stim_used) + air.adjust_moles(GAS_PLUOXIUM, -pluox_used) + air.adjust_moles(GAS_STIMULUM, -stim_used) + air.adjust_moles(GAS_PLASMA, max(-air.get_moles(GAS_PLASMA)/2,-30)) if(energy_released) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index b1034564bf793..d6afb607a71f8 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -69,9 +69,9 @@ req_access = list(ACCESS_ATMOSPHERICS) max_integrity = 250 integrity_failure = 80 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30, "stamina" = 0) resistance_flags = FIRE_PROOF - + layer = ABOVE_WINDOW_LAYER var/danger_level = 0 @@ -89,57 +89,57 @@ var/list/TLV = list( // Breathable air. "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa. Values are min2, min1, max1, max2 "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), - /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa - /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000), - /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10), - /datum/gas/miasma = new/datum/tlv/(-1, -1, 15, 30), - /datum/gas/plasma = new/datum/tlv/dangerous, - /datum/gas/nitrous_oxide = new/datum/tlv/dangerous, - /datum/gas/bz = new/datum/tlv/dangerous, - /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic - /datum/gas/water_vapor = new/datum/tlv/dangerous, - /datum/gas/tritium = new/datum/tlv/dangerous, - /datum/gas/stimulum = new/datum/tlv/dangerous, - /datum/gas/nitryl = new/datum/tlv/dangerous, - /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000) // Unlike oxygen, pluoxium does not fuel plasma/tritium fires + GAS_O2 = new/datum/tlv(16, 19, 40, 50), // Partial pressure, kpa + GAS_N2 = new/datum/tlv(-1, -1, 1000, 1000), + GAS_CO2 = new/datum/tlv(-1, -1, 5, 10), + GAS_MIASMA = new/datum/tlv/(-1, -1, 15, 30), + GAS_PLASMA = new/datum/tlv/dangerous, + GAS_NITROUS = new/datum/tlv/dangerous, + GAS_BZ = new/datum/tlv/dangerous, + GAS_HYPERNOB = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic + GAS_H2O = new/datum/tlv/dangerous, + GAS_TRITIUM = new/datum/tlv/dangerous, + GAS_STIMULUM = new/datum/tlv/dangerous, + GAS_NITRYL = new/datum/tlv/dangerous, + GAS_PLUOXIUM = new/datum/tlv(-1, -1, 5, 6), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires ) /obj/machinery/airalarm/server // No checks here. TLV = list( "pressure" = new/datum/tlv/no_checks, "temperature" = new/datum/tlv/no_checks, - /datum/gas/oxygen = new/datum/tlv/no_checks, - /datum/gas/nitrogen = new/datum/tlv/no_checks, - /datum/gas/carbon_dioxide = new/datum/tlv/no_checks, - /datum/gas/miasma = new/datum/tlv/no_checks, - /datum/gas/plasma = new/datum/tlv/no_checks, - /datum/gas/nitrous_oxide = new/datum/tlv/no_checks, - /datum/gas/bz = new/datum/tlv/no_checks, - /datum/gas/hypernoblium = new/datum/tlv/no_checks, - /datum/gas/water_vapor = new/datum/tlv/no_checks, - /datum/gas/tritium = new/datum/tlv/no_checks, - /datum/gas/stimulum = new/datum/tlv/no_checks, - /datum/gas/nitryl = new/datum/tlv/no_checks, - /datum/gas/pluoxium = new/datum/tlv/no_checks + GAS_O2 = new/datum/tlv/no_checks, + GAS_N2 = new/datum/tlv/no_checks, + GAS_CO2 = new/datum/tlv/no_checks, + GAS_MIASMA = new/datum/tlv/no_checks, + GAS_PLASMA = new/datum/tlv/no_checks, + GAS_NITROUS = new/datum/tlv/no_checks, + GAS_BZ = new/datum/tlv/no_checks, + GAS_HYPERNOB = new/datum/tlv/no_checks, + GAS_H2O = new/datum/tlv/no_checks, + GAS_TRITIUM = new/datum/tlv/no_checks, + GAS_STIMULUM = new/datum/tlv/no_checks, + GAS_NITRYL = new/datum/tlv/no_checks, + GAS_PLUOXIUM = new/datum/tlv/no_checks ) /obj/machinery/airalarm/kitchen_cold_room // Kitchen cold rooms start off at -20°C or 253.15°K. TLV = list( "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa "temperature" = new/datum/tlv(T0C-273.15, T0C-80, T0C-10, T0C+10), - /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa - /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000), - /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10), - /datum/gas/miasma = new/datum/tlv/(-1, -1, 2, 5), - /datum/gas/plasma = new/datum/tlv/dangerous, - /datum/gas/nitrous_oxide = new/datum/tlv/dangerous, - /datum/gas/bz = new/datum/tlv/dangerous, - /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic - /datum/gas/water_vapor = new/datum/tlv/dangerous, - /datum/gas/tritium = new/datum/tlv/dangerous, - /datum/gas/stimulum = new/datum/tlv/dangerous, - /datum/gas/nitryl = new/datum/tlv/dangerous, - /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000) // Unlike oxygen, pluoxium does not fuel plasma/tritium fires + GAS_O2 = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa + GAS_N2 = new/datum/tlv(-1, -1, 1000, 1000), + GAS_CO2 = new/datum/tlv(-1, -1, 5, 10), + GAS_MIASMA = new/datum/tlv/(-1, -1, 2, 5), + GAS_PLASMA = new/datum/tlv/dangerous, + GAS_NITROUS = new/datum/tlv/dangerous, + GAS_BZ = new/datum/tlv/dangerous, + GAS_HYPERNOB = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic + GAS_H2O = new/datum/tlv/dangerous, + GAS_TRITIUM = new/datum/tlv/dangerous, + GAS_STIMULUM = new/datum/tlv/dangerous, + GAS_NITRYL = new/datum/tlv/dangerous, + GAS_PLUOXIUM = new/datum/tlv(-1, -1, 1000, 1000) // Unlike oxygen, pluoxium does not fuel plasma/tritium fires ) /obj/machinery/airalarm/unlocked @@ -214,11 +214,15 @@ SSradio.remove_object(src, frequency) qdel(wires) wires = null + var/area/ourarea = get_area(src) + ourarea.atmosalert(FALSE, src) + GLOB.zclear_atoms -= src return ..() /obj/machinery/airalarm/Initialize(mapload) . = ..() set_frequency(frequency) + GLOB.zclear_atoms += src /obj/machinery/airalarm/examine(mob/user) . = ..() @@ -246,7 +250,9 @@ if(!ui) ui = new(user, src, "AirAlarm") ui.open() + ui.set_autoupdate(TRUE) // Turf gas mixture +//Oh my, thats a lot of data being sent that should probably be refactored /obj/machinery/airalarm/ui_data(mob/user) var/data = list( "locked" = locked, @@ -287,7 +293,7 @@ continue cur_tlv = TLV[gas_id] data["environment_data"] += list(list( - "name" = GLOB.meta_gas_info[gas_id][META_GAS_NAME], + "name" = GLOB.gas_data.names[gas_id], "value" = environment.get_moles(gas_id) / total_moles * 100, "unit" = "%", "danger_level" = cur_tlv.get_danger_level(environment.get_moles(gas_id) * partial_pressure) @@ -357,11 +363,11 @@ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max1", "selected" = selected.max1)) thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max2", "selected" = selected.max2)) - for(var/gas_id in GLOB.meta_gas_info) + for(var/gas_id in GLOB.gas_data.names) if(!(gas_id in TLV)) // We're not interested in this gas, it seems. continue selected = TLV[gas_id] - thresholds += list(list("name" = GLOB.meta_gas_info[gas_id][META_GAS_NAME], "settings" = list())) + thresholds += list(list("name" = GLOB.gas_data.names[gas_id], "settings" = list())) thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min2", "selected" = selected.min2)) thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min1", "selected" = selected.min1)) thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "max1", "selected" = selected.max1)) @@ -425,15 +431,16 @@ . = TRUE if("alarm") var/area/A = get_area(src) - if(A.atmosalert(2, src)) + if(A.atmosalert(TRUE, src)) post_alert(2) . = TRUE if("reset") var/area/A = get_area(src) - if(A.atmosalert(0, src)) + if(A.atmosalert(FALSE, src)) post_alert(0) . = TRUE - update_icon() + if(.) + update_icon() /obj/machinery/airalarm/proc/reset(wire) @@ -441,10 +448,12 @@ if(WIRE_POWER) if(!wires.is_cut(WIRE_POWER)) shorted = FALSE + wires.ui_update() update_icon() if(WIRE_AI) if(!wires.is_cut(WIRE_AI)) aidisabled = FALSE + wires.ui_update() /obj/machinery/airalarm/proc/shock(mob/user, prb) @@ -505,7 +514,7 @@ for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, - "set_filters" = list(/datum/gas/carbon_dioxide, /datum/gas/bz), + "set_filters" = list(GAS_CO2, GAS_BZ), "scrubbing" = 1, "widenet" = 0 ), signal_source) @@ -520,17 +529,17 @@ send_signal(device_id, list( "power" = 1, "set_filters" = list( - /datum/gas/carbon_dioxide, - /datum/gas/miasma, - /datum/gas/plasma, - /datum/gas/water_vapor, - /datum/gas/hypernoblium, - /datum/gas/nitrous_oxide, - /datum/gas/nitryl, - /datum/gas/tritium, - /datum/gas/bz, - /datum/gas/stimulum, - /datum/gas/pluoxium + GAS_CO2, + GAS_MIASMA, + GAS_PLASMA, + GAS_H2O, + GAS_HYPERNOB, + GAS_NITROUS, + GAS_NITRYL, + GAS_TRITIUM, + GAS_BZ, + GAS_STIMULUM, + GAS_PLUOXIUM ), "scrubbing" = 1, "widenet" = 1 @@ -558,7 +567,7 @@ for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, - "set_filters" = list(/datum/gas/carbon_dioxide, /datum/gas/bz), + "set_filters" = list(GAS_CO2, GAS_BZ), "scrubbing" = 1, "widenet" = 0 ), signal_source) @@ -702,7 +711,7 @@ var/new_area_danger_level = 0 for(var/obj/machinery/airalarm/AA in A) if (!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted) - new_area_danger_level = max(new_area_danger_level,AA.danger_level) + new_area_danger_level = clamp(max(new_area_danger_level, AA.danger_level), 0, 1) if(A.atmosalert(new_area_danger_level,src)) //if area was in normal state or if area was in alert state post_alert(new_area_danger_level) @@ -792,8 +801,22 @@ return ..() +/obj/machinery/airalarm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + if((buildstage == 0) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) + return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1) + return FALSE + +/obj/machinery/airalarm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_UPGRADE_SIMPLE_CIRCUITS) + user.visible_message("[user] fabricates a circuit and places it into [src].", \ + "You adapt an air alarm circuit and slot it into the assembly.") + buildstage = 1 + update_icon() + return TRUE + return FALSE + /obj/machinery/airalarm/AltClick(mob/user) - ..() if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc)) return else diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index c6a49f5ed06b8..2c27e30874c3d 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -37,6 +37,7 @@ var/construction_type var/pipe_state //icon_state as a pipe item var/on = FALSE + var/interacts_with_air = FALSE /obj/machinery/atmospherics/examine(mob/user) . = ..() @@ -52,10 +53,13 @@ normalize_cardinal_directions() nodes = new(device_type) if (!armor) - armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 70) + armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 70, "stamina" = 0) ..() if(process) - SSair.atmos_machinery += src + if(interacts_with_air) + SSair.atmos_air_machinery += src + else + SSair.atmos_machinery += src SetInitDirections() /obj/machinery/atmospherics/Destroy() @@ -63,6 +67,8 @@ nullifyNode(i) SSair.atmos_machinery -= src + SSair.atmos_air_machinery -= src + SSair.pipenets_needing_rebuilt -= src dropContents() if(pipe_vision_img) @@ -167,8 +173,9 @@ if(istype(reference, /obj/machinery/atmospherics/pipe)) var/obj/machinery/atmospherics/pipe/P = reference P.destroy_network() - nodes[nodes.Find(reference)] = null - update_icon() + if(nodes.len >= nodes.Find(reference)) // for some reason things can still be acted on even though they've been deleted this is a really fucky way of detecting that + nodes[nodes.Find(reference)] = null + update_icon() /obj/machinery/atmospherics/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/pipe)) //lets you autodrop @@ -212,11 +219,11 @@ if(unsafe_wrenching) unsafe_pressure_release(user, internal_pressure) - + if (user.client) SSmedals.UnlockMedal(MEDAL_UNWRENCH_HIGH_PRESSURE,user.client) - - + + deconstruct(TRUE) return TRUE @@ -224,9 +231,14 @@ return can_unwrench // Throws the user when they unwrench a pipe with a major difference between the internal and environmental pressure. -/obj/machinery/atmospherics/proc/unsafe_pressure_release(mob/user, pressures = null) +/obj/machinery/atmospherics/proc/unsafe_pressure_release(mob/living/carbon/user, pressures = null) if(!user) return + if(ishuman(user)) //other carbons like monkeys can unwrench but cant wear magboots + if(istype(user.shoes, /obj/item/clothing/shoes/magboots)) + var/obj/item/clothing/shoes/magboots/M = user.shoes + if(M.negates_gravity()) + return if(!pressures) var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() @@ -322,10 +334,10 @@ //PLACEHOLDER COMMENT FOR ME TO READD THE 1 (?) DS DELAY THAT WAS IMPLEMENTED WITH A... TIMER? /obj/machinery/atmospherics/AltClick(mob/living/L) + . = ..() if(istype(L) && is_type_in_list(src, GLOB.ventcrawl_machinery)) L.handle_ventcrawl(src) return - ..() /obj/machinery/atmospherics/proc/can_crawl_through() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm b/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm index 45ccaf1e867a0..2575f0feedb81 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm @@ -19,3 +19,10 @@ /obj/machinery/atmospherics/components/binary/getNodeConnects() return list(turn(dir, 180), dir) + +/obj/machinery/atmospherics/components/binary/proc/set_overlay_offset(pipe_layer) + switch(pipe_layer) + if(2) + return 1 + if(1, 3) + return 2 \ No newline at end of file diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index 68cccb6a0102f..e92f6924f10a0 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -46,7 +46,7 @@ var/input_starting_pressure = air2.return_pressure() if(output_starting_pressure >= input_starting_pressure-10) - //Need at least 10 KPa difference to overcome friction in the mechanism + //Need at least 10 kPa difference to overcome friction in the mechanism last_pressure_delta = 0 return null @@ -116,7 +116,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 335649a826fb8..1c16833f9f669 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 @@ -14,7 +14,12 @@ name = "dual-port air vent" desc = "Has a valve and pump attached to it. There are two ports." + welded = FALSE + level = 1 + + interacts_with_air = TRUE + var/frequency = 0 var/id = null var/datum/radio_frequency/radio_connection @@ -45,6 +50,10 @@ var/image/cap = getpipeimage(icon, "dpvent_cap", dir, piping_layer = piping_layer) add_overlay(cap) + if(welded) + icon_state = "vent_welded" + return + if(!on || !is_operational()) icon_state = "vent_off" else @@ -52,7 +61,8 @@ /obj/machinery/atmospherics/components/binary/dp_vent_pump/process_atmos() ..() - + if(welded || !is_operational() || !isopenturf(loc)) + return FALSE if(!on) return var/datum/gas_mixture/air1 = airs[1] @@ -73,16 +83,12 @@ if(air1.return_temperature() > 0) var/transfer_moles = pressure_delta*environment.return_volume()/(air1.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = air1.remove(transfer_moles) - //Removed can be null if there is no atmosphere in air1 - if(!removed) - return + loc.assume_air_moles(air1, transfer_moles) - loc.assume_air(removed) air_update_turf() var/datum/pipeline/parent1 = parents[1] - parent1.update = 1 + parent1.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED else //external -> output if(environment.return_pressure() > 0) @@ -94,15 +100,11 @@ moles_delta = min(moles_delta, (input_pressure_min - air2.return_pressure()) * our_multiplier) if(moles_delta > 0) - var/datum/gas_mixture/removed = loc.remove_air(moles_delta) - if (isnull(removed)) // in space - return - - air2.merge(removed) + loc.transfer_air(air2, moles_delta) air_update_turf() var/datum/pipeline/parent2 = parents[2] - parent2.update = 1 + parent2.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED //Radio remote control @@ -176,6 +178,40 @@ broadcast_status() update_icon() +/obj/machinery/atmospherics/components/binary/dp_vent_pump/welder_act(mob/living/user, obj/item/I) + if(!I.tool_start_check(user, amount=0)) + return TRUE + to_chat(user, "You begin welding the dual-port vent...") + if(I.use_tool(src, user, 20, volume=50)) + if(!welded) + user.visible_message("[user] welds the dual-port vent shut.", "You weld the dual-port vent shut.", "You hear welding.") + welded = TRUE + else + user.visible_message("[user] unwelded the dual-port vent.", "You unweld the dual-port vent.", "You hear welding.") + welded = FALSE + update_icon() + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) + pipe_vision_img.plane = ABOVE_HUD_PLANE + return TRUE + +/obj/machinery/atmospherics/components/binary/dp_vent_pump/examine(mob/user) + . = ..() + if(welded) + . += "It seems welded shut." + +/obj/machinery/atmospherics/components/binary/dp_vent_pump/can_crawl_through() + return !welded + +/obj/machinery/atmospherics/components/binary/dp_vent_pump/attack_alien(mob/user) + if(!welded || !(do_after(user, 20, target = src))) + return + user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the dual-port vent.", "You hear loud scraping noises.") + welded = FALSE + update_icon() + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) + pipe_vision_img.plane = ABOVE_HUD_PLANE + playsound(loc, 'sound/weapons/bladeslice.ogg', 100, 1) + /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume name = "large dual-port air vent" 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 ecf8d47da9f75..99724e43964bb 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -3,6 +3,7 @@ Passive gate is similar to the regular pump except: * It doesn't require power * Can not transfer low pressure to higher pressure (so it's more like a valve where you can control the flow) +* Passes gas when output pressure lower than target pressure */ @@ -10,7 +11,7 @@ Passive gate is similar to the regular pump except: icon_state = "passgate_map-2" name = "passive gate" - desc = "A one-way air valve that does not require power." + desc = "A one-way air valve that does not require power. Passes gas when the output pressure is lower than the target pressure." can_unwrench = TRUE shift_underlay_only = FALSE @@ -33,13 +34,16 @@ Passive gate is similar to the regular pump except: if(can_interact(user)) on = !on update_icon() + ui_update() return ..() /obj/machinery/atmospherics/components/binary/passive_gate/AltClick(mob/user) if(can_interact(user)) - target_pressure = MAX_OUTPUT_PRESSURE + target_pressure = ONE_ATMOSPHERE*100 + balloon_alert(user, "Set to [target_pressure] kPa") update_icon() - return ..() + ui_update() + return /obj/machinery/atmospherics/components/binary/passive_gate/Destroy() SSradio.remove_object(src,frequency) @@ -58,29 +62,9 @@ Passive gate is similar to the regular pump except: var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] - - var/output_starting_pressure = air2.return_pressure() - var/input_starting_pressure = air1.return_pressure() - - if(output_starting_pressure >= min(target_pressure,input_starting_pressure-10)) - //No need to pump gas if target is already reached or input pressure is too low - //Need at least 10 KPa difference to overcome friction in the mechanism - return - - //Calculate necessary moles to transfer using PV = nRT - if((air1.total_moles() > 0) && (air1.return_temperature()>0)) - var/pressure_delta = min(target_pressure - output_starting_pressure, (input_starting_pressure - output_starting_pressure)/2) - //Can not have a pressure delta that would cause output_pressure > input_pressure - - var/transfer_moles = pressure_delta*air2.return_volume()/(air1.return_temperature() * R_IDEAL_GAS_EQUATION) - - //Actually transfer the gas - var/datum/gas_mixture/removed = air1.remove(transfer_moles) - air2.merge(removed) - + if(air1.release_gas_to(air2, target_pressure)) update_parents() - //Radio remote control /obj/machinery/atmospherics/components/binary/passive_gate/proc/set_frequency(new_frequency) @@ -116,7 +100,7 @@ Passive gate is similar to the regular pump except: var/data = list() data["on"] = on data["pressure"] = round(target_pressure) - data["max_pressure"] = round(MAX_OUTPUT_PRESSURE) + data["max_pressure"] = round(ONE_ATMOSPHERE*100) return data /obj/machinery/atmospherics/components/binary/passive_gate/ui_act(action, params) @@ -130,15 +114,16 @@ Passive gate is similar to the regular pump except: if("pressure") var/pressure = params["pressure"] if(pressure == "max") - pressure = MAX_OUTPUT_PRESSURE + pressure = ONE_ATMOSPHERE*100 . = TRUE else if(text2num(pressure) != null) pressure = text2num(pressure) . = TRUE if(.) - target_pressure = clamp(pressure, 0, MAX_OUTPUT_PRESSURE) + target_pressure = clamp(pressure, 0, ONE_ATMOSPHERE*100) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) - update_icon() + if(.) + update_icon() /obj/machinery/atmospherics/components/binary/passive_gate/atmosinit() ..() @@ -158,7 +143,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*100) if(on != old_on) investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS) @@ -169,6 +154,7 @@ Passive gate is similar to the regular pump except: broadcast_status() update_icon() + ui_update() /obj/machinery/atmospherics/components/binary/passive_gate/power_change() ..() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm new file mode 100644 index 0000000000000..79b18a9a1c132 --- /dev/null +++ b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm @@ -0,0 +1,177 @@ +/obj/machinery/atmospherics/components/binary/pressure_valve + icon_state = "pvalve_map-2" + name = "pressure valve" + desc = "An activable one way valve that let gas pass through if the pressure on the input side is higher than the set pressure." + + can_unwrench = TRUE + shift_underlay_only = FALSE + + //Amount of pressure needed before the valve for it to open + var/target_pressure = ONE_ATMOSPHERE + //Frequency for radio signaling + var/frequency = 0 + //ID for radio signaling + var/id = null + //Connection to the radio processing + var/datum/radio_frequency/radio_connection + //Check if the gas is moving from one pipenet to the other + var/is_gas_flowing = FALSE + + construction_type = /obj/item/pipe/directional + pipe_state = "pvalve" + +/obj/machinery/atmospherics/components/binary/pressure_valve/CtrlClick(mob/user) + if(can_interact(user)) + on = !on + investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) + update_icon() + return ..() + +/obj/machinery/atmospherics/components/binary/pressure_valve/AltClick(mob/user) + if(can_interact(user)) + target_pressure = MAX_OUTPUT_PRESSURE + balloon_alert(user, "Set to [target_pressure] kPa") + investigate_log("was set to [target_pressure] kPa by [key_name(user)]", INVESTIGATE_ATMOS) + update_icon() + return ..() + +/obj/machinery/atmospherics/components/binary/pressure_valve/Destroy() + SSradio.remove_object(src,frequency) + if(radio_connection) + radio_connection = null + return ..() + +/obj/machinery/atmospherics/components/binary/pressure_valve/update_icon_nopipes() + if(on && is_operational()) + if(is_gas_flowing) + icon_state = "pvalve_flow" + else + icon_state = "pvalve_on" + else + icon_state = "pvalve_off" + +/obj/machinery/atmospherics/components/binary/pressure_valve/process_atmos() + + if(!on || !is_operational()) + return + + var/datum/gas_mixture/air1 = airs[1] + var/datum/gas_mixture/air2 = airs[2] + + if(air1.return_pressure() > target_pressure) + if(air1.release_gas_to(air2, air1.return_pressure())) + update_parents() + is_gas_flowing = TRUE + else + is_gas_flowing = FALSE + update_icon_nopipes() + +/obj/machinery/atmospherics/components/binary/pressure_valve/proc/set_frequency(new_frequency) + SSradio.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = SSradio.add_object(src, frequency, filter = RADIO_ATMOSIA) + +/obj/machinery/atmospherics/components/binary/pressure_valve/proc/broadcast_status() + if(!radio_connection) + return + + var/datum/signal/signal = new(list( + "tag" = id, + "device" = "AGP", + "power" = on, + "target_output" = target_pressure, + "sigtype" = "status" + )) + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + +/obj/machinery/atmospherics/components/binary/pressure_valve/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AtmosPump", name) + ui.open() + +/obj/machinery/atmospherics/components/binary/pressure_valve/ui_data() + var/data = list() + data["on"] = on + data["pressure"] = round(target_pressure) + data["max_pressure"] = round(ONE_ATMOSPHERE*100) + return data + +/obj/machinery/atmospherics/components/binary/pressure_valve/ui_act(action, params) + if(..()) + return + switch(action) + if("power") + on = !on + investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS) + . = TRUE + if("pressure") + var/pressure = params["pressure"] + if(pressure == "max") + pressure = ONE_ATMOSPHERE*100 + . = TRUE + else if(text2num(pressure) != null) + pressure = text2num(pressure) + . = TRUE + if(.) + target_pressure = clamp(pressure, 0, ONE_ATMOSPHERE*100) + investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) + update_icon() + +/obj/machinery/atmospherics/components/binary/pressure_valve/atmosinit() + . = ..() + if(frequency) + set_frequency(frequency) + +/obj/machinery/atmospherics/components/binary/pressure_valve/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) + return + + var/old_on = on //for logging + + if("power" in signal.data) + on = text2num(signal.data["power"]) + + if("power_toggle" in signal.data) + on = !on + + if("set_output_pressure" in signal.data) + target_pressure = clamp(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*100) + + if(on != old_on) + investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS) + + if("status" in signal.data) + broadcast_status() + return + + broadcast_status() + update_icon() + +/obj/machinery/atmospherics/components/binary/pressure_valve/can_unwrench(mob/user) + . = ..() + if(. && on && is_operational()) + to_chat(user, "You cannot unwrench [src], turn it off first!") + return FALSE + + +/obj/machinery/atmospherics/components/binary/pressure_valve/layer1 + piping_layer = 1 + icon_state= "pvalve_map-1" + +/obj/machinery/atmospherics/components/binary/pressure_valve/layer3 + piping_layer = 3 + icon_state= "pvalve_map-3" + +/obj/machinery/atmospherics/components/binary/pressure_valve/on + on = TRUE + icon_state = "pvalve_on_map-2" + +/obj/machinery/atmospherics/components/binary/pressure_valve/on/layer1 + piping_layer = 1 + icon_state= "pvalve_on_map-1" + +/obj/machinery/atmospherics/components/binary/pressure_valve/on/layer3 + piping_layer = 3 + icon_state= "pvalve_on_map-3" diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 84d5a8d02e080..b8962bd27fe42 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -34,13 +34,16 @@ if(can_interact(user)) on = !on update_icon() + ui_update() return ..() /obj/machinery/atmospherics/components/binary/pump/AltClick(mob/user) if(can_interact(user)) target_pressure = MAX_OUTPUT_PRESSURE + balloon_alert(user, "Set to [target_pressure] kPa") update_icon() - return ..() + ui_update() + return /obj/machinery/atmospherics/components/binary/pump/Destroy() SSradio.remove_object(src,frequency) @@ -55,24 +58,18 @@ // ..() if(!on || !is_operational()) return - var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] - var/output_starting_pressure = air2.return_pressure() - if((target_pressure - output_starting_pressure) < 0.01) //No need to pump gas if target is already reached! return - //Calculate necessary moles to transfer using PV=nRT if((air1.total_moles() > 0) && (air1.return_temperature()>0)) var/pressure_delta = target_pressure - output_starting_pressure var/transfer_moles = pressure_delta*air2.return_volume()/(air1.return_temperature() * R_IDEAL_GAS_EQUATION) - //Actually transfer the gas - var/datum/gas_mixture/removed = air1.remove(transfer_moles) - air2.merge(removed) + air1.transfer_to(air2,transfer_moles) update_parents() @@ -132,7 +129,8 @@ if(.) target_pressure = clamp(pressure, 0, MAX_OUTPUT_PRESSURE) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) - update_icon() + if(.) + update_icon() /obj/machinery/atmospherics/components/binary/pump/atmosinit() ..() @@ -163,6 +161,7 @@ broadcast_status() update_icon() + ui_update() /obj/machinery/atmospherics/components/binary/pump/power_change() ..() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm new file mode 100644 index 0000000000000..ef08d93fa164d --- /dev/null +++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm @@ -0,0 +1,129 @@ +/obj/machinery/atmospherics/components/binary/temperature_gate + icon_state = "tgate_map-2" + name = "temperature gate" + desc = "An activable gate that compares the input temperature with the interface set temperature to check if the gas can flow from the input side to the output side or not." + + can_unwrench = TRUE + shift_underlay_only = FALSE + construction_type = /obj/item/pipe/directional + pipe_state = "tgate" + + //If the temperature of the mix before the gate is lower than this, the gas will flow (if inverted, if the temperature of the mix before the gate is higher than this) + var/target_temperature = T0C + //Minimum allowed temperature + var/minimum_temperature = TCMB + //Maximum allowed temperature to be set + var/max_temperature = 4500 + //Check if the sensor should let gas pass if temperature in the mix is less/higher than the target one + var/inverted = FALSE + //Check if the gas is moving from one pipenet to the other + var/is_gas_flowing = FALSE + +/obj/machinery/atmospherics/components/binary/temperature_gate/CtrlClick(mob/user) + if(can_interact(user)) + on = !on + investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) + update_icon() + return ..() + +/obj/machinery/atmospherics/components/binary/temperature_gate/AltClick(mob/user) + if(can_interact(user)) + target_temperature = max_temperature + balloon_alert(user, "Set to [target_temperature] K") + investigate_log("was set to [target_temperature] K by [key_name(user)]", INVESTIGATE_ATMOS) + update_icon() + return ..() + + +/obj/machinery/atmospherics/components/binary/temperature_gate/examine(mob/user) + . = ..() + . += "This device will let gas flow if the temperature of the gas in the input is [inverted ? "higher" : "lower"] than the temperature set in the interface." + if(inverted) + . += "The device settings can be restored if a multitool is used on it." + else + . += "The sensor's settings can be changed by using a multitool on the device." + +/obj/machinery/atmospherics/components/binary/temperature_gate/update_icon_nopipes() + if(on && is_operational()) + if(is_gas_flowing) + icon_state = "tgate_flow-[set_overlay_offset(piping_layer)]" + else + icon_state = "tgate_on-[set_overlay_offset(piping_layer)]" + else + icon_state = "tgate_off-[set_overlay_offset(piping_layer)]" + + +/obj/machinery/atmospherics/components/binary/temperature_gate/process_atmos() + + if(!on || !is_operational()) + return + + var/datum/gas_mixture/air1 = airs[1] + var/datum/gas_mixture/air2 = airs[2] + + if(!inverted) + if(air1.return_temperature() < target_temperature) + if(air1.release_gas_to(air2, air1.return_pressure())) + update_parents() + is_gas_flowing = TRUE + else + is_gas_flowing = FALSE + else + if(air1.return_temperature() > target_temperature) + if(air1.release_gas_to(air2, air1.return_pressure())) + update_parents() + is_gas_flowing = TRUE + else + is_gas_flowing = FALSE + update_icon_nopipes() + +/obj/machinery/atmospherics/components/binary/temperature_gate/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AtmosTempGate", name) + ui.open() + +/obj/machinery/atmospherics/components/binary/temperature_gate/ui_data() + var/data = list() + data["on"] = on + data["temperature"] = round(target_temperature) + data["min_temperature"] = round(minimum_temperature) + data["max_temperature"] = round(max_temperature) + return data + +/obj/machinery/atmospherics/components/binary/temperature_gate/ui_act(action, params) + if(..()) + return + switch(action) + if("power") + on = !on + investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS) + . = TRUE + if("temperature") + var/temperature = params["temperature"] + if(temperature == "max") + temperature = max_temperature + . = TRUE + else if(text2num(temperature) != null) + temperature = text2num(temperature) + . = TRUE + if(.) + target_temperature = clamp(minimum_temperature, temperature, max_temperature) + investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS) + update_icon() + +/obj/machinery/atmospherics/components/binary/temperature_gate/can_unwrench(mob/user) + . = ..() + if(. && on && is_operational()) + to_chat(user, "You cannot unwrench [src], turn it off first!") + return FALSE + +/obj/machinery/atmospherics/components/binary/temperature_gate/multitool_act(mob/living/user, obj/item/multitool/I) + . = ..() + if (istype(I)) + inverted = !inverted + if(inverted) + balloon_alert(user, "Sensors set to release when the temperature is above") + else + balloon_alert(user, "Sensors set to default") + return TRUE diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm new file mode 100644 index 0000000000000..867a2864e8ad9 --- /dev/null +++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm @@ -0,0 +1,95 @@ +/obj/machinery/atmospherics/components/binary/temperature_pump + icon_state = "tpump_map-2" + name = "temperature pump" + desc = "A pump that moves heat from one pipeline to another. The input will get cooler, and the output will get hotter." + + can_unwrench = TRUE + shift_underlay_only = FALSE + + //Percent of the heat delta to transfer + var/heat_transfer_rate = 0 + //Maximum allowed transfer percentage + var/max_heat_transfer_rate = 100 + + construction_type = /obj/item/pipe/directional + pipe_state = "tpump" + +/obj/machinery/atmospherics/components/binary/temperature_pump/CtrlClick(mob/user) + if(can_interact(user)) + on = !on + investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) + update_icon() + return ..() + +/obj/machinery/atmospherics/components/binary/temperature_pump/AltClick(mob/user) + if(can_interact(user) && !(heat_transfer_rate == max_heat_transfer_rate)) + heat_transfer_rate = max_heat_transfer_rate + balloon_alert(user, "Set to [heat_transfer_rate]%") + investigate_log("was set to [heat_transfer_rate]% by [key_name(user)]", INVESTIGATE_ATMOS) + update_icon() + return ..() + +/obj/machinery/atmospherics/components/binary/temperature_pump/update_icon_nopipes() + icon_state = "tpump_[on && is_operational() ? "on" : "off"]-[set_overlay_offset(piping_layer)]" + +/obj/machinery/atmospherics/components/binary/temperature_pump/process_atmos() + + if(!on || !is_operational()) + return + + var/datum/gas_mixture/air_input = airs[1] + var/datum/gas_mixture/air_output = airs[2] + + if(!QUANTIZE(air_input.total_moles()) || !QUANTIZE(air_output.total_moles())) //Don't transfer if there's no gas + return + var/datum/gas_mixture/remove_input = air_input.remove_ratio(0.9) + var/datum/gas_mixture/remove_output = air_output.remove_ratio(0.9) + + var/coolant_temperature_delta = remove_input.return_temperature() - remove_output.return_temperature() + + if(coolant_temperature_delta > 0) + var/input_capacity = remove_input.heat_capacity() + var/output_capacity = air_output.heat_capacity() + + var/cooling_heat_amount = (heat_transfer_rate * 0.01) * coolant_temperature_delta * (input_capacity * output_capacity / (input_capacity + output_capacity)) + remove_input.set_temperature(max(remove_input.return_temperature() - (cooling_heat_amount / input_capacity), TCMB)) + remove_output.set_temperature(max(remove_output.return_temperature() + (cooling_heat_amount / output_capacity), TCMB)) + + air_input.merge(remove_input) + air_output.merge(remove_output) + + update_parents() + +/obj/machinery/atmospherics/components/binary/temperature_pump/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AtmosTempPump", name) + ui.open() + +/obj/machinery/atmospherics/components/binary/temperature_pump/ui_data() + var/data = list() + data["on"] = on + data["rate"] = round(heat_transfer_rate) + data["max_heat_transfer_rate"] = round(max_heat_transfer_rate) + return data + +/obj/machinery/atmospherics/components/binary/temperature_pump/ui_act(action, params) + if(..()) + return + switch(action) + if("power") + on = !on + investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS) + . = TRUE + if("rate") + var/rate = params["rate"] + if(rate == "max") + rate = max_heat_transfer_rate + . = TRUE + else if(text2num(rate) != null) + rate = text2num(rate) + . = TRUE + if(.) + heat_transfer_rate = clamp(rate, 0, max_heat_transfer_rate) + investigate_log("was set to [heat_transfer_rate]% by [key_name(usr)]", INVESTIGATE_ATMOS) + update_icon() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm index cbf0cb95f2b9e..c7ecdb4b4e8cf 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm @@ -24,24 +24,40 @@ It's like a regular ol' straight pipe, but you can turn it on and off. var/switching = FALSE +/obj/machinery/atmospherics/components/binary/valve/Destroy() + //Should only happen on extreme circumstances + if(on) + //Let's give presumably now-severed pipenets a chance to scramble for what's happening at next SSair fire() + if(parents[1]) + parents[1].update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED + if(parents[2]) + parents[2].update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED + . = ..() + /obj/machinery/atmospherics/components/binary/valve/update_icon_nopipes(animation = FALSE) normalize_cardinal_directions() if(animation) flick("[valve_type]valve_[on][!on]", src) icon_state = "[valve_type]valve_[on ? "on" : "off"]" -/obj/machinery/atmospherics/components/binary/valve/proc/toggle() +/** + * Called by finish_interact(), switch between open and closed, reconcile the air between two pipelines + */ +/obj/machinery/atmospherics/components/binary/valve/proc/set_open(to_open) + if(on == to_open) + return + SEND_SIGNAL(src, COMSIG_VALVE_SET_OPEN, to_open) + . = on + on = to_open if(on) - on = FALSE - update_icon_nopipes() - investigate_log("was closed by [usr ? key_name(usr) : "a remote signal"]", INVESTIGATE_ATMOS) - else - on = TRUE update_icon_nopipes() update_parents() var/datum/pipeline/parent1 = parents[1] parent1.reconcile_air() investigate_log("was opened by [usr ? key_name(usr) : "a remote signal"]", INVESTIGATE_ATMOS) + else + update_icon_nopipes() + investigate_log("was closed by [usr ? key_name(usr) : "a remote signal"]", INVESTIGATE_ATMOS) /obj/machinery/atmospherics/components/binary/valve/interact(mob/user) add_fingerprint(usr) @@ -52,7 +68,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off. addtimer(CALLBACK(src, .proc/finish_interact), 10) /obj/machinery/atmospherics/components/binary/valve/proc/finish_interact() - toggle() + set_open(!on) switching = FALSE @@ -66,6 +82,69 @@ It's like a regular ol' straight pipe, but you can turn it on and off. interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_OPEN | INTERACT_MACHINE_OPEN_SILICON +/obj/machinery/atmospherics/components/binary/valve/digital/Initialize() + . = ..() + AddComponent(/datum/component/usb_port, list(/obj/item/circuit_component/digital_valve)) + +/obj/item/circuit_component/digital_valve + display_name = "Digital Valve" + display_desc = "The interface for communicating with a digital valve." + + var/obj/machinery/atmospherics/components/binary/valve/digital/attached_valve + + /// Opens the digital valve + var/datum/port/input/open + /// Closes the digital valve + var/datum/port/input/close + + /// Whether the valve is currently open + var/datum/port/output/is_open + /// Sent when the valve is opened + var/datum/port/output/opened + /// Sent when the valve is closed + var/datum/port/output/closed + +/obj/item/circuit_component/digital_valve/Initialize() + . = ..() + open = add_input_port("Open", PORT_TYPE_SIGNAL) + close = add_input_port("Close", PORT_TYPE_SIGNAL) + + is_open = add_output_port("Is Open", PORT_TYPE_NUMBER) + opened = add_output_port("Opened", PORT_TYPE_SIGNAL) + closed = add_output_port("Closed", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/digital_valve/register_usb_parent(atom/movable/shell) + . = ..() + if(istype(shell, /obj/machinery/atmospherics/components/binary/valve/digital)) + attached_valve = shell + RegisterSignal(attached_valve, COMSIG_VALVE_SET_OPEN, .proc/handle_valve_toggled) + +/obj/item/circuit_component/digital_valve/unregister_usb_parent(atom/movable/shell) + UnregisterSignal(attached_valve, COMSIG_VALVE_SET_OPEN) + attached_valve = null + return ..() + +/obj/item/circuit_component/digital_valve/proc/handle_valve_toggled(datum/source, on) + is_open.set_output(on) + if(on) + opened.set_output(COMPONENT_SIGNAL) + else + closed.set_output(COMPONENT_SIGNAL) + +/obj/item/circuit_component/digital_valve/input_received(datum/port/input/port) + . = ..() + if(.) + return + + if(!attached_valve) + return + + if(COMPONENT_TRIGGERED_BY(open, port) && !attached_valve.on) + attached_valve.set_open(TRUE) + if(COMPONENT_TRIGGERED_BY(close, port) && attached_valve.on) + attached_valve.set_open(FALSE) + + /obj/machinery/atmospherics/components/binary/valve/digital/update_icon_nopipes(animation) if(!is_operational()) normalize_cardinal_directions() @@ -73,7 +152,6 @@ It's like a regular ol' straight pipe, but you can turn it on and off. return ..() - /obj/machinery/atmospherics/components/binary/valve/layer1 piping_layer = 1 icon_state = "mvalve_map-1" 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 b95f45d34473c..092253bbf7ede 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -35,13 +35,16 @@ if(can_interact(user)) on = !on update_icon() + ui_update() return ..() /obj/machinery/atmospherics/components/binary/volume_pump/AltClick(mob/user) if(can_interact(user)) transfer_rate = MAX_TRANSFER_RATE + balloon_alert(user, "Set to [transfer_rate] L/s") update_icon() - return ..() + ui_update() + return /obj/machinery/atmospherics/components/binary/volume_pump/Destroy() SSradio.remove_object(src,frequency) @@ -69,19 +72,15 @@ if(overclocked && (output_starting_pressure-input_starting_pressure > 1000))//Overclocked pumps can only force gas a certain amount. return - - var/transfer_ratio = transfer_rate/air1.return_volume() - - var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) - if(overclocked)//Some of the gas from the mixture leaks to the environment when overclocked var/turf/open/T = loc if(istype(T)) - var/datum/gas_mixture/leaked = removed.remove_ratio(VOLUME_PUMP_LEAK_AMOUNT) + var/datum/gas_mixture/leaked = air1.remove_ratio(VOLUME_PUMP_LEAK_AMOUNT) T.assume_air(leaked) T.air_update_turf() - air2.merge(removed) + var/transfer_ratio = transfer_rate / air1.return_volume() + air1.transfer_ratio_to(air2,transfer_ratio) update_parents() @@ -150,7 +149,8 @@ if(.) 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() + if(.) + update_icon() /obj/machinery/atmospherics/components/binary/volume_pump/receive_signal(datum/signal/signal) if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) @@ -177,6 +177,7 @@ broadcast_status() update_icon() + ui_update() /obj/machinery/atmospherics/components/binary/volume_pump/power_change() ..() diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index 9295c702cc0c3..5fdb40cf4b759 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -65,8 +65,10 @@ // Pipenet stuff; housekeeping /obj/machinery/atmospherics/components/nullifyNode(i) - if(nodes[i]) + // Every node has a parent pipeline and an air associated with it, but we need to accomdate for edge cases like init dir cache building... + if(parents[i]) nullifyPipenet(parents[i]) + if(airs[i]) QDEL_NULL(airs[i]) ..() @@ -76,7 +78,7 @@ /obj/machinery/atmospherics/components/build_network() for(var/i in 1 to device_type) - if(!parents[i]) + if(QDELETED(parents[i])) parents[i] = new /datum/pipeline() var/datum/pipeline/P = parents[i] P.build_pipeline(src) @@ -87,10 +89,27 @@ var/i = parents.Find(reference) reference.other_airs -= airs[i] reference.other_atmosmch -= src + /** + * We explicitly qdel pipeline when this particular pipeline + * is projected to have no member and cause GC problems. + * We have to do this because components don't qdel pipelines + * while pipes must and will happily wreck and rebuild everything again + * every time they are qdeleted. + */ + if(!(reference.other_atmosmch.len || reference.members.len || QDESTROYING(reference))) + qdel(reference) parents[i] = null +// We should return every air sharing a parent /obj/machinery/atmospherics/components/returnPipenetAir(datum/pipeline/reference) - return airs[parents.Find(reference)] + for(var/i in 1 to device_type) + if(parents[i] == reference) + if(.) + if(!islist(.)) + . = list(.) + . += airs[i] + else + . = airs[i] /obj/machinery/atmospherics/components/pipeline_expansion(datum/pipeline/reference) if(reference) @@ -121,14 +140,9 @@ times_lost++ var/shared_loss = lost/times_lost - var/datum/gas_mixture/to_release for(var/i in 1 to device_type) var/datum/gas_mixture/air = airs[i] - if(!to_release) - to_release = air.remove(shared_loss) - continue - to_release.merge(air.remove(shared_loss)) - T.assume_air(to_release) + T.assume_air_moles(air, shared_loss) air_update_turf(1) /obj/machinery/atmospherics/components/proc/safe_input(var/title, var/text, var/default_set) @@ -143,9 +157,11 @@ for(var/i in 1 to device_type) var/datum/pipeline/parent = parents[i] if(!parent) - WARNING("Component is missing a pipenet! Rebuilding...") - build_network() - parent.update = 1 + //WARNING("Component is missing a pipenet! Rebuilding...") + //At pre-SSair_rebuild_pipenets times, not having a parent wasn't supposed to happen + SSair.add_to_rebuild_queue(src) + continue + parent.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED /obj/machinery/atmospherics/components/returnPipenets() . = list() diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index eacea6d4416fd..96b330a961dd7 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -21,13 +21,16 @@ if(can_interact(user)) on = !on update_icon() + ui_update() return ..() /obj/machinery/atmospherics/components/trinary/filter/AltClick(mob/user) if(can_interact(user)) transfer_rate = MAX_TRANSFER_RATE + balloon_alert(user, "Set to [transfer_rate] L/s") update_icon() - return ..() + ui_update() + return /obj/machinery/atmospherics/components/trinary/filter/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) @@ -85,37 +88,17 @@ //No need to transfer if target is already full! return - var/transfer_ratio = transfer_rate/air1.return_volume() + var/transfer_ratio = transfer_rate / air1.return_volume() //Actually transfer the gas if(transfer_ratio <= 0) return - var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) - - if(!removed) - return - - var/filtering = TRUE - if(!ispath(filter_type)) - if(filter_type) - filter_type = gas_id2path(filter_type) //support for mappers so they don't need to type out paths - else - filtering = FALSE - - if(filtering && removed.get_moles(filter_type)) - var/datum/gas_mixture/filtered_out = new - - filtered_out.set_temperature(removed.return_temperature()) - filtered_out.set_moles(filter_type, removed.get_moles(filter_type)) - - removed.set_moles(filter_type, 0) - - var/datum/gas_mixture/target = (air2.return_pressure() < MAX_OUTPUT_PRESSURE ? air2 : air1) //if there's no room for the filtered gas; just leave it in air1 - target.merge(filtered_out) - - air3.merge(removed) + if(filter_type && air2.return_pressure() <= 9000) + air1.scrub_into(air2, transfer_ratio, list(filter_type)) + if(air3.return_pressure() <= 9000) + air1.transfer_ratio_to(air3, transfer_ratio) update_parents() @@ -140,10 +123,9 @@ data["max_rate"] = round(MAX_TRANSFER_RATE) data["filter_types"] = list() - data["filter_types"] += list(list("name" = "Nothing", "path" = "", "selected" = !filter_type)) - for(var/path in GLOB.meta_gas_info) - var/list/gas = GLOB.meta_gas_info[path] - data["filter_types"] += list(list("name" = gas[META_GAS_NAME], "id" = gas[META_GAS_ID], "selected" = (path == gas_id2path(filter_type)))) + data["filter_types"] += list(list("name" = "Nothing", "id" = "", "selected" = !filter_type)) + for(var/id in GLOB.gas_data.ids) + data["filter_types"] += list(list("name" = GLOB.gas_data.names[id], "id" = id, "selected" = (id == filter_type))) return data @@ -173,13 +155,14 @@ if("filter") filter_type = null var/filter_name = "nothing" - var/gas = gas_id2path(params["mode"]) - if(gas in GLOB.meta_gas_info) + var/gas = params["mode"] + if(gas in GLOB.gas_data.names) filter_type = gas - filter_name = GLOB.meta_gas_info[gas][META_GAS_NAME] + filter_name = GLOB.gas_data.names[gas] investigate_log("was set to filter [filter_name] by [key_name(usr)]", INVESTIGATE_ATMOS) . = TRUE - update_icon() + if(.) + update_icon() /obj/machinery/atmospherics/components/trinary/filter/can_unwrench(mob/user) . = ..() diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index ae7922605da1f..f3e55f45c3bbd 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -23,13 +23,16 @@ if(can_interact(user)) on = !on update_icon() + ui_update() return ..() /obj/machinery/atmospherics/components/trinary/mixer/AltClick(mob/user) if(can_interact(user)) target_pressure = MAX_OUTPUT_PRESSURE + balloon_alert(user, "Set to [target_pressure] kPa") update_icon() - return ..() + ui_update() + return /obj/machinery/atmospherics/components/trinary/mixer/update_icon() cut_overlays() @@ -117,19 +120,17 @@ //Actually transfer the gas if(transfer_moles1) - var/datum/gas_mixture/removed1 = air1.remove(transfer_moles1) - air3.merge(removed1) + air1.transfer_to(air3, transfer_moles1) var/datum/pipeline/parent1 = parents[1] - parent1.update = TRUE + parent1.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED if(transfer_moles2) - var/datum/gas_mixture/removed2 = air2.remove(transfer_moles2) - air3.merge(removed2) + air2.transfer_to(air3, transfer_moles2) var/datum/pipeline/parent2 = parents[2] - parent2.update = TRUE + parent2.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED var/datum/pipeline/parent3 = parents[3] - parent3.update = TRUE + parent3.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED /obj/machinery/atmospherics/components/trinary/mixer/ui_state(mob/user) @@ -179,7 +180,8 @@ adjust_node1_value(100 - value) investigate_log("was set to [node2_concentration] % on node 2 by [key_name(usr)]", INVESTIGATE_ATMOS) . = TRUE - update_icon() + if(.) + update_icon() /obj/machinery/atmospherics/components/trinary/mixer/proc/adjust_node1_value(newValue) node1_concentration = newValue / 100 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 46c5ed12699e9..1c11922777f4f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -1,4 +1,6 @@ #define CRYOMOBS 'icons/obj/cryo_mobs.dmi' +#define CRYO_MULTIPLY_FACTOR 1.5 // Multiply factor is used with efficiency to multiply Tx quantity and how much extra is transfered to occupant magically. +#define CRYO_TX_QTY 0.4 // Tx quantity is how much volume should be removed from the cell's beaker - multiplied by delta_time /obj/machinery/atmospherics/components/unary/cryo_cell name = "cryo cell" @@ -6,7 +8,7 @@ icon_state = "pod-off" density = TRUE max_integrity = 350 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 30, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 30, "acid" = 30, "stamina" = 0) layer = ABOVE_WINDOW_LAYER state_open = FALSE circuit = /obj/item/circuitboard/machine/cryo_tube @@ -25,7 +27,6 @@ var/conduction_coefficient = 0.3 var/obj/item/reagent_containers/glass/beaker = null - var/reagent_transfer = 0 var/obj/item/radio/radio var/radio_key = /obj/item/encryptionkey/headset_med @@ -73,7 +74,7 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/examine(mob/user) //this is leaving out everything but efficiency since they follow the same idea of "better beaker, better results" . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Efficiency at [efficiency*100]%." + . += "The status display reads: Efficiency at [efficiency*100]%." /obj/machinery/atmospherics/components/unary/cryo_cell/Destroy() QDEL_NULL(radio) @@ -83,7 +84,13 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/contents_explosion(severity, target) ..() if(beaker) - beaker.ex_act(severity, target) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += beaker + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += beaker + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += beaker /obj/machinery/atmospherics/components/unary/cryo_cell/handle_atom_del(atom/A) ..() @@ -166,19 +173,32 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/nap_violation(mob/violator) open_machine() -/obj/machinery/atmospherics/components/unary/cryo_cell/process() - ..() - +/obj/machinery/atmospherics/components/unary/cryo_cell/process(delta_time) if(!on) return + if(!is_operational()) on = FALSE update_icon() return - if(!occupant) + + if(!occupant)//Won't operate unless there's an occupant. + on = FALSE + update_icon() + var/msg = "Aborting. No occupant detected." + radio.talk_into(src, msg, radio_channel) + return + + if(!beaker?.reagents?.reagent_list.len) //No beaker or beaker without reagents with stop the machine from running. + on = FALSE + update_icon() + var/msg = "Aborting. No beaker or chemicals installed." + radio.talk_into(src, msg, radio_channel) return var/mob/living/mob_occupant = occupant + if(mob_occupant.on_fire) //Extinguish occupant, happens after the occupant is healed and ejected. + mob_occupant.ExtinguishMob() if(!check_nap_violations()) return if(mob_occupant.stat == DEAD) // We don't bother with dead people. @@ -199,15 +219,11 @@ if(air1.total_moles()) 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) - if(beaker) - if(reagent_transfer == 0) // Magically transfer reagents. Because cryo magic. - beaker.reagents.trans_to(occupant, 1, efficiency * 0.25) // Transfer reagents. - beaker.reagents.reaction(occupant, VAPOR) - air1.adjust_moles(/datum/gas/oxygen, -max(0,air1.get_moles(/datum/gas/oxygen) - 2 / efficiency)) //Let's use gas for this - if(++reagent_transfer >= 10 * efficiency) // Throttle reagent transfer (higher efficiency will transfer the same amount but consume less from the beaker). - reagent_transfer = 0 + mob_occupant.Sleeping((mob_occupant.bodytemperature * sleep_factor) * 1000 * delta_time) + mob_occupant.Unconscious((mob_occupant.bodytemperature * unconscious_factor) * 1000 * delta_time) + if(beaker)//How much to transfer. As efficiency is increased, less reagent from the beaker is used and more is magically transferred to occupant + beaker.reagents.trans_to(occupant, (CRYO_TX_QTY / (efficiency * CRYO_MULTIPLY_FACTOR)) * delta_time, efficiency * CRYO_MULTIPLY_FACTOR, method = VAPOR) // Transfer reagents. + use_power(1000 * efficiency) return 1 @@ -219,9 +235,11 @@ var/datum/gas_mixture/air1 = airs[1] - if(!nodes[1] || !airs[1] || air1.get_moles(/datum/gas/oxygen) < 5) // Turn off if the machine won't work. + if(!nodes[1] || !airs[1] || air1.get_moles(GAS_O2) < 5) // Turn off if the machine won't work due to not having enough moles to operate. on = FALSE update_icon() + var/msg = "Aborting. Not enough gas present to operate." + radio.talk_into(src, msg, radio_channel) return if(occupant) @@ -241,7 +259,9 @@ air1.set_temperature(max(air1.return_temperature() - heat / air_heat_capacity, TCMB)) mob_occupant.adjust_bodytemperature(heat / heat_capacity, TCMB) - air1.set_moles(/datum/gas/oxygen, max(0,air1.get_moles(/datum/gas/oxygen) - 0.5 / efficiency)) // Magically consume gas? Why not, we run on cryo magic. + air1.set_moles(GAS_O2, max(0,air1.get_moles(GAS_O2) - 0.5 / efficiency)) // Magically consume gas? Why not, we run on cryo magic. + + update_parents() /obj/machinery/atmospherics/components/unary/cryo_cell/power_change() ..() @@ -340,6 +360,7 @@ if(!ui) ui = new(user, src, "Cryo") ui.open() + ui.set_autoupdate(TRUE) /obj/machinery/atmospherics/components/unary/cryo_cell/ui_data() var/list/data = list() @@ -420,24 +441,24 @@ . = TRUE /obj/machinery/atmospherics/components/unary/cryo_cell/CtrlClick(mob/user) - if(can_interact(user) && !state_open) + if(user.can_interact_with(src) && !state_open && occupant != user) on = !on update_icon() return ..() /obj/machinery/atmospherics/components/unary/cryo_cell/AltClick(mob/user) - if(can_interact(user)) + if(user.can_interact_with(src) && occupant != user) if(state_open) close_machine() else open_machine() - return ..() + return /obj/machinery/atmospherics/components/unary/cryo_cell/update_remote_sight(mob/living/user) return // we don't see the pipe network while inside cryo. /obj/machinery/atmospherics/components/unary/cryo_cell/get_remote_view_fullscreens(mob/user) - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1) /obj/machinery/atmospherics/components/unary/cryo_cell/can_crawl_through() return // can't ventcrawl in or out of cryo. @@ -466,6 +487,8 @@ if(node) node.atmosinit() node.addMember(src) - build_network() + SSair.add_to_rebuild_queue(src) #undef CRYOMOBS +#undef CRYO_MULTIPLY_FACTOR +#undef CRYO_TX_QTY diff --git a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm index c0dfc5633e9fd..25b6ad13287e2 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm @@ -10,7 +10,7 @@ layer = LOW_OBJ_LAYER - var/obj/machinery/atmospherics/components/unary/heat_exchanger/partner = null + var/datum/weakref/partner_ref = null var/update_cycle pipe_state = "heunary" @@ -33,20 +33,26 @@ PIPING_LAYER_SHIFT(src, piping_layer) /obj/machinery/atmospherics/components/unary/heat_exchanger/atmosinit() + var/obj/machinery/atmospherics/components/unary/heat_exchanger/partner = partner_ref?.resolve() if(!partner) + partner_ref = null var/partner_connect = turn(dir,180) for(var/obj/machinery/atmospherics/components/unary/heat_exchanger/target in get_step(src,partner_connect)) if(target.dir & get_dir(src,target)) - partner = target - partner.partner = src + partner_ref = WEAKREF(target) + target.partner_ref = WEAKREF(src) break ..() /obj/machinery/atmospherics/components/unary/heat_exchanger/process_atmos() ..() - if(!partner || SSair.times_fired <= update_cycle) + var/obj/machinery/atmospherics/components/unary/heat_exchanger/partner = partner_ref?.resolve() + if(!partner) + partner_ref = null + return + if(SSair.times_fired <= update_cycle) return update_cycle = SSair.times_fired 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 8f92bda897bc6..48a963cf292cd 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -19,6 +19,7 @@ var/datum/radio_frequency/radio_connection level = 1 + interacts_with_air = TRUE layer = GAS_SCRUBBER_LAYER pipe_state = "injector" @@ -30,13 +31,16 @@ if(can_interact(user)) on = !on update_icon() + ui_update() return ..() /obj/machinery/atmospherics/components/unary/outlet_injector/AltClick(mob/user) if(can_interact(user)) volume_rate = MAX_TRANSFER_RATE + balloon_alert(user, "Set to [volume_rate] L/s") update_icon() - return ..() + ui_update() + return /obj/machinery/atmospherics/components/unary/outlet_injector/Destroy() SSradio.remove_object(src,frequency) @@ -64,20 +68,17 @@ injecting = 0 - if(!on || !is_operational()) + if(!on || !is_operational() || !isopenturf(loc)) return var/datum/gas_mixture/air_contents = airs[1] - if(air_contents.return_temperature() > 0) - var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION) - - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) + if(air_contents != null) + if(air_contents.return_temperature() > 0) + loc.assume_air_ratio(air_contents, volume_rate / air_contents.return_volume()) + air_update_turf() - loc.assume_air(removed) - air_update_turf() - - update_parents() + update_parents() /obj/machinery/atmospherics/components/unary/outlet_injector/proc/inject() @@ -89,9 +90,7 @@ injecting = 1 if(air_contents.return_temperature() > 0) - var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - loc.assume_air(removed) + loc.assume_air_ratio(air_contents, volume_rate / air_contents.return_volume()) update_parents() flick("inje_inject", src) @@ -146,6 +145,7 @@ if(!("status" in signal.data)) //do not update_icon update_icon() + ui_update() @@ -185,8 +185,9 @@ if(.) 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() + if(.) + update_icon() + broadcast_status() /obj/machinery/atmospherics/components/unary/outlet_injector/can_unwrench(mob/user) . = ..() @@ -218,7 +219,7 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/atmos frequency = FREQ_ATMOS_STORAGE on = TRUE - volume_rate = 200 + volume_rate = MAX_TRANSFER_RATE /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste name = "atmos waste outlet injector" diff --git a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm index 572296f03f597..61d21bc3596d6 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm @@ -6,6 +6,7 @@ can_unwrench = TRUE level = 1 + interacts_with_air = TRUE layer = GAS_SCRUBBER_LAYER pipe_state = "pvent" @@ -19,29 +20,25 @@ /obj/machinery/atmospherics/components/unary/passive_vent/process_atmos() ..() + if(isclosedturf(loc)) + return - var/datum/gas_mixture/environment = loc.return_air() - var/environment_pressure = environment.return_pressure() - var/pressure_delta = abs(environment_pressure - airs[1].return_pressure()) - - if((environment.return_temperature() || airs[1].return_temperature()) && pressure_delta > 0.5) - if(environment_pressure < airs[1].return_pressure()) - var/air_temperature = (environment.return_temperature() > 0) ? environment.return_temperature() : airs[1].return_temperature() - var/transfer_moles = (pressure_delta * environment.return_volume()) / (air_temperature * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = airs[1].remove(transfer_moles) - loc.assume_air(removed) - air_update_turf() - else - var/air_temperature = (airs[1].return_temperature() > 0) ? airs[1].return_temperature() : environment.return_temperature() - var/output_volume = airs[1].return_volume() - var/transfer_moles = (pressure_delta * output_volume) / (air_temperature * R_IDEAL_GAS_EQUATION) - transfer_moles = min(transfer_moles, environment.total_moles()*airs[1].return_volume()/environment.return_volume()) - var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) - if(isnull(removed)) - return - airs[1].merge(removed) - air_update_turf() - update_parents() + var/active = FALSE + var/datum/gas_mixture/external = loc.return_air() + var/datum/gas_mixture/internal = airs[1] + var/external_pressure = external.return_pressure() + var/internal_pressure = internal.return_pressure() + var/pressure_delta = abs(external_pressure - internal_pressure) + + if(pressure_delta > 0.5) + equalize_all_gases_in_list(list(internal,external)) + active = TRUE + + active = internal.temperature_share(external, OPEN_HEAT_TRANSFER_COEFFICIENT) || active + + if(active) + air_update_turf() + update_parents() /obj/machinery/atmospherics/components/unary/passive_vent/can_crawl_through() return TRUE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm index 512d693555614..3ca9fd77e69b4 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm @@ -21,7 +21,7 @@ air_contents.set_temperature(T20C) if(gas_type) air_contents.set_moles(gas_type, AIR_CONTENTS) - name = "[name] ([GLOB.meta_gas_info[gas_type][META_GAS_NAME]])" + name = "[name] ([GLOB.gas_data.names[gas_type]])" setPipingLayer(piping_layer) @@ -32,20 +32,20 @@ /obj/machinery/atmospherics/components/unary/tank/air/New() ..() var/datum/gas_mixture/air_contents = airs[1] - air_contents.set_moles(/datum/gas/oxygen, AIR_CONTENTS * 0.2) - air_contents.set_moles(/datum/gas/nitrogen, AIR_CONTENTS * 0.8) + air_contents.set_moles(GAS_O2, AIR_CONTENTS * 0.2) + air_contents.set_moles(GAS_N2, AIR_CONTENTS * 0.8) /obj/machinery/atmospherics/components/unary/tank/carbon_dioxide - gas_type = /datum/gas/carbon_dioxide + gas_type = GAS_CO2 /obj/machinery/atmospherics/components/unary/tank/toxins icon_state = "orange" - gas_type = /datum/gas/plasma + gas_type = GAS_PLASMA /obj/machinery/atmospherics/components/unary/tank/oxygen icon_state = "blue" - gas_type = /datum/gas/oxygen + gas_type = GAS_O2 /obj/machinery/atmospherics/components/unary/tank/nitrogen icon_state = "red" - gas_type = /datum/gas/nitrogen + gas_type = GAS_N2 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 68ac81f9936ea..74acbef1cef7c 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -2,12 +2,12 @@ icon = 'icons/obj/atmospherics/components/thermomachine.dmi' icon_state = "freezer" - name = "thermomachine" + name = "Thermomachine" desc = "Heats or cools gas in connected pipes." density = TRUE max_integrity = 300 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 30, "stamina" = 0) layer = OBJ_LAYER circuit = /obj/item/circuitboard/machine/thermomachine @@ -19,27 +19,58 @@ var/icon_state_on = "freezer_1" var/icon_state_open = "freezer-o" - var/min_temperature = 0 - var/max_temperature = 0 + var/min_temperature = T20C //actual temperature will be defined by RefreshParts() and by the cooling var + var/max_temperature = T20C //actual temperature will be defined by RefreshParts() and by the cooling var var/target_temperature = T20C var/heat_capacity = 0 var/interactive = TRUE // So mapmakers can disable interaction. + var/cooling = TRUE + var/base_heating = 140 + var/base_cooling = 170 /obj/machinery/atmospherics/components/unary/thermomachine/Initialize() . = ..() initialize_directions = dir + RefreshParts() + update_icon() + +/obj/machinery/atmospherics/components/unary/thermomachine/proc/swap_function() + cooling = !cooling + if(cooling) + icon_state_off = "freezer" + icon_state_on = "freezer_1" + icon_state_open = "freezer-o" + else + icon_state_off = "heater" + icon_state_on = "heater_1" + icon_state_open = "heater-o" + target_temperature = T20C + RefreshParts() + update_icon() /obj/machinery/atmospherics/components/unary/thermomachine/on_construction() var/obj/item/circuitboard/machine/thermomachine/board = circuit if(board) piping_layer = board.pipe_layer - ..(dir, piping_layer) + return ..(dir, piping_layer) /obj/machinery/atmospherics/components/unary/thermomachine/RefreshParts() - var/B - for(var/obj/item/stock_parts/matter_bin/M in component_parts) - B += M.rating - heat_capacity = 5000 * ((B - 1) ** 2) + var/calculated_bin_rating + for(var/obj/item/stock_parts/matter_bin/bin in component_parts) + calculated_bin_rating += bin.rating + heat_capacity = 5000 * ((calculated_bin_rating - 1) ** 2) + min_temperature = T20C + max_temperature = T20C + if(cooling) + var/calculated_laser_rating + for(var/obj/item/stock_parts/micro_laser/laser in component_parts) + calculated_laser_rating += laser.rating + min_temperature = max(T0C - (base_cooling + calculated_laser_rating * 15), TCMB) //73.15K with T1 stock parts + else + var/calculated_laser_rating + for(var/obj/item/stock_parts/micro_laser/laser in component_parts) + calculated_laser_rating += laser.rating + max_temperature = T20C + (base_heating * calculated_laser_rating) //573.15K with T1 stock parts /obj/machinery/atmospherics/components/unary/thermomachine/update_icon() cut_overlays() @@ -65,9 +96,20 @@ . += "The status display reads: Efficiency [(heat_capacity/5000)*100]%." . += "Temperature range [min_temperature]K - [max_temperature]K ([(T0C-min_temperature)*-1]C - [(T0C-max_temperature)*-1]C)." +/obj/machinery/atmospherics/components/unary/thermomachine/AltClick(mob/living/user) + if(!can_interact(user)) + return + if(cooling) + target_temperature = min_temperature + investigate_log("was set to [target_temperature] K by [key_name(user)]", INVESTIGATE_ATMOS) + else + target_temperature = max_temperature + investigate_log("was set to [target_temperature] K by [key_name(user)]", INVESTIGATE_ATMOS) + balloon_alert(user, "Set to [target_temperature] K") + /obj/machinery/atmospherics/components/unary/thermomachine/process_atmos() ..() - if(!on || !nodes[1]) + if(!is_operational() || !on || !nodes[1]) //if it has no power or its switched off, dont process atmos return var/datum/gas_mixture/air_contents = airs[1] @@ -109,14 +151,16 @@ if(node) node.disconnect(src) nodes[1] = null - nullifyPipenet(parents[1]) + //Sometimes this gets called more than once per atmos tick; i.e. before the incoming build_network call by SSAIR_REBUILD_PIPENETS, so we check this here. + if(parents[1]) + nullifyPipenet(parents[1]) atmosinit() node = nodes[1] 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) @@ -133,10 +177,12 @@ if(!ui) ui = new(user, src, "ThermoMachine") ui.open() + ui.set_autoupdate(TRUE) // Air temperature and pressure /obj/machinery/atmospherics/components/unary/thermomachine/ui_data(mob/user) var/list/data = list() data["on"] = on + data["cooling"] = cooling data["min"] = min_temperature data["max"] = max_temperature @@ -159,6 +205,10 @@ use_power = on ? ACTIVE_POWER_USE : IDLE_POWER_USE investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS) . = TRUE + if("cooling") + swap_function() + investigate_log("was changed to [cooling ? "cooling" : "heating"] by [key_name(usr)]", INVESTIGATE_ATMOS) + . = TRUE if("target") var/target = params["target"] var/adjust = text2num(params["adjust"]) @@ -175,8 +225,8 @@ if(.) target_temperature = clamp(target, min_temperature, max_temperature) investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS) - - update_icon() + if(.) + update_icon() /obj/machinery/atmospherics/components/unary/thermomachine/CtrlClick(mob/living/user) if(!can_interact(user)) @@ -185,14 +235,11 @@ update_icon() /obj/machinery/atmospherics/components/unary/thermomachine/freezer - name = "freezer" icon_state = "freezer" icon_state_off = "freezer" icon_state_on = "freezer_1" icon_state_open = "freezer-o" - max_temperature = T20C - min_temperature = 170 //actual minimum temperature is defined by RefreshParts() - circuit = /obj/item/circuitboard/machine/thermomachine/freezer + cooling = TRUE /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on on = TRUE @@ -210,40 +257,13 @@ . = ..() target_temperature = T0C-20 //Cold enough to prevent Miasma -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/RefreshParts() - ..() - var/L - for(var/obj/item/stock_parts/micro_laser/M in component_parts) - L += M.rating - min_temperature = max(T0C - (initial(min_temperature) + L * 15), TCMB) //73.15K with T1 stock parts - -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/AltClick(mob/living/user) - if(!can_interact(user)) - return - target_temperature = min_temperature - /obj/machinery/atmospherics/components/unary/thermomachine/heater - name = "heater" icon_state = "heater" icon_state_off = "heater" icon_state_on = "heater_1" icon_state_open = "heater-o" - max_temperature = 140 //actual maximum temperature is defined by RefreshParts() - min_temperature = T20C - circuit = /obj/item/circuitboard/machine/thermomachine/heater + cooling = FALSE /obj/machinery/atmospherics/components/unary/thermomachine/heater/on on = TRUE icon_state = "heater_1" - -/obj/machinery/atmospherics/components/unary/thermomachine/heater/RefreshParts() - ..() - var/L - for(var/obj/item/stock_parts/micro_laser/M in component_parts) - L += M.rating - max_temperature = T20C + (initial(max_temperature) * L) //573.15K with T1 stock parts - -/obj/machinery/atmospherics/components/unary/thermomachine/heater/AltClick(mob/living/user) - if(!can_interact(user)) - return - target_temperature = max_temperature 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 ba9764d63cebd..05a5047f81403 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -17,6 +17,8 @@ level = 1 layer = GAS_SCRUBBER_LAYER + interacts_with_air = TRUE + var/id_tag = null var/pump_direction = RELEASING @@ -90,7 +92,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/process_atmos() ..() - if(!is_operational()) + if(!is_operational() || !isopenturf(loc)) return if(!nodes[1]) on = FALSE @@ -99,6 +101,10 @@ var/datum/gas_mixture/air_contents = airs[1] var/datum/gas_mixture/environment = loc.return_air() + + if(environment == null) + return + var/environment_pressure = environment.return_pressure() if(pump_direction & RELEASING) // internal -> external @@ -113,9 +119,7 @@ if(air_contents.return_temperature() > 0) var/transfer_moles = pressure_delta*environment.return_volume()/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - - loc.assume_air(removed) + loc.assume_air_moles(air_contents, transfer_moles) air_update_turf() else // external -> internal @@ -128,11 +132,7 @@ moles_delta = min(moles_delta, (internal_pressure_bound - air_contents.return_pressure()) * our_multiplier) if(moles_delta > 0) - var/datum/gas_mixture/removed = loc.remove_air(moles_delta) - if (isnull(removed)) // in space - return - - air_contents.merge(removed) + loc.transfer_air(air_contents, moles_delta) air_update_turf() update_parents() @@ -288,7 +288,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/attack_alien(mob/user) if(!welded || !(do_after(user, 20, target = src))) return - user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the vent", "You hear loud scraping noises.") + user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the vent.", "You hear loud scraping noises.") welded = FALSE update_icon() pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 323e1597e01df..bb71cbd73b59f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -14,10 +14,12 @@ level = 1 layer = GAS_SCRUBBER_LAYER + interacts_with_air = TRUE + var/id_tag = null var/scrubbing = SCRUBBING //0 = siphoning, 1 = scrubbing - var/filter_types = list(/datum/gas/carbon_dioxide, /datum/gas/bz) + var/filter_types = list(GAS_CO2, GAS_BZ) var/volume_rate = 200 var/widenet = 0 //is this scrubber acting on the 3x3 area around it. var/list/turf/adjacent_turfs = list() @@ -34,11 +36,6 @@ if(!id_tag) id_tag = assign_uid_vents() - for(var/f in filter_types) - if(istext(f)) - filter_types -= f - filter_types += gas_id2path(f) - /obj/machinery/atmospherics/components/unary/vent_scrubber/Destroy() var/area/A = get_area(src) if (A) @@ -98,9 +95,8 @@ return FALSE var/list/f_types = list() - for(var/path in GLOB.meta_gas_info) - var/list/gas = GLOB.meta_gas_info[path] - f_types += list(list("gas_id" = gas[META_GAS_ID], "gas_name" = gas[META_GAS_NAME], "enabled" = (path in filter_types))) + for(var/id in GLOB.gas_data.ids) + f_types += list(list("gas_id" = id, "gas_name" = GLOB.gas_data.names[id], "enabled" = (id in filter_types))) var/datum/signal/signal = new(list( "tag" = id_tag, @@ -146,38 +142,21 @@ scrub(tile) return TRUE -/obj/machinery/atmospherics/components/unary/vent_scrubber/proc/scrub(var/turf/tile) +/obj/machinery/atmospherics/components/unary/vent_scrubber/proc/scrub(var/turf/open/tile) if(!istype(tile)) return FALSE var/datum/gas_mixture/environment = tile.return_air() var/datum/gas_mixture/air_contents = airs[1] - if(air_contents.return_pressure() >= 50*ONE_ATMOSPHERE) + if(air_contents.return_pressure() >= 50 * ONE_ATMOSPHERE || !islist(filter_types)) return FALSE if(scrubbing & SCRUBBING) - var/transfer_moles = min(1, volume_rate/environment.return_volume())*environment.total_moles() - - //Take a gas sample - var/datum/gas_mixture/removed = tile.remove_air(transfer_moles) - - //Nothing left to remove from the tile - if(isnull(removed)) - return FALSE - - removed.scrub_into(air_contents, filter_types) - - //Remix the resulting gases - tile.assume_air(removed) + environment.scrub_into(air_contents, volume_rate/environment.return_volume(), filter_types) tile.air_update_turf() else //Just siphoning all air - - var/transfer_moles = environment.total_moles()*(volume_rate/environment.return_volume()) - - var/datum/gas_mixture/removed = tile.remove_air(transfer_moles) - - air_contents.merge(removed) + environment.transfer_ratio_to(air_contents, volume_rate/environment.return_volume()) tile.air_update_turf() update_parents() @@ -224,12 +203,12 @@ investigate_log(" was toggled to [scrubbing ? "scrubbing" : "siphon"] mode by [key_name(signal_sender)]",INVESTIGATE_ATMOS) if("toggle_filter" in signal.data) - filter_types ^= gas_id2path(signal.data["toggle_filter"]) + filter_types ^= signal.data["toggle_filter"] if("set_filters" in signal.data) filter_types = list() for(var/gas in signal.data["set_filters"]) - filter_types += gas_id2path(gas) + filter_types += gas if("init" in signal.data) name = signal.data["init"] @@ -280,7 +259,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/attack_alien(mob/user) if(!welded || !(do_after(user, 20, target = src))) return - user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the scrubber.", "You hear loud scraping noises.") + user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the scrubber.", "You hear loud scraping noises.") welded = FALSE update_icon() pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) @@ -309,10 +288,10 @@ icon_state = "scrub_map_on-3" /obj/machinery/atmospherics/components/unary/vent_scrubber/on/lavaland - filter_types = list(/datum/gas/carbon_dioxide, /datum/gas/plasma, /datum/gas/water_vapor, /datum/gas/bz) + filter_types = list(GAS_CO2, GAS_PLASMA, GAS_H2O, GAS_BZ) /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3/lavaland - filter_types = list(/datum/gas/carbon_dioxide, /datum/gas/plasma, /datum/gas/water_vapor, /datum/gas/bz) + filter_types = list(GAS_CO2, GAS_PLASMA, GAS_H2O, GAS_BZ) #undef SIPHONING #undef SCRUBBING diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index ca1024b799067..2bae4e25e771f 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -15,7 +15,7 @@ /datum/pipeline/Destroy() SSair.networks -= src - if(air?.return_volume()) + if(air && air.return_volume()) temporarily_store_air() for(var/obj/machinery/atmospherics/pipe/P in members) P.parent = null @@ -43,10 +43,12 @@ if(!air) air = new var/list/possible_expansions = list(base) - while(possible_expansions.len) + while(possible_expansions.len>0) for(var/obj/machinery/atmospherics/borderline in possible_expansions) + var/list/result = borderline.pipeline_expansion(src) - if(result && result.len) + + if(result.len>0) for(var/obj/machinery/atmospherics/P in result) if(istype(P, /obj/machinery/atmospherics/pipe)) var/obj/machinery/atmospherics/pipe/item = P @@ -55,8 +57,8 @@ if(item.parent) var/static/pipenetwarnings = 10 if(pipenetwarnings > 0) - log_mapping("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) around [AREACOORD(item)].") - pipenetwarnings-- + log_mapping("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) Nearby: ([item.x], [item.y], [item.z]).") + pipenetwarnings -= 1 if(pipenetwarnings == 0) log_mapping("build_pipeline(): further messages about pipenets will be suppressed") members += item @@ -192,7 +194,7 @@ else if((target.heat_capacity>0) && (partial_heat_capacity>0)) - var/delta_temperature = air.return_temperature() - target.temperature + var/delta_temperature = air.return_temperature() - target.return_temperature() var/heat = thermal_conductivity*delta_temperature* \ (partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity)) @@ -203,10 +205,14 @@ /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().") - return removeNullsFromList(.) + 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().") + listclearnulls(.) -/datum/pipeline/proc/reconcile_air() +/datum/pipeline/proc/empty() + for(var/datum/gas_mixture/GM in get_all_connected_airs()) + GM.clear() + +/datum/pipeline/proc/get_all_connected_airs() var/list/datum/gas_mixture/GL = list() var/list/datum/pipeline/PL = list() PL += src @@ -226,18 +232,8 @@ var/obj/machinery/atmospherics/components/unary/portables_connector/C = atmosmch if(C.connected_device) GL += C.portableConnectorReturnAir() + return GL - var/datum/gas_mixture/total_gas_mixture = new(0) - var/total_volume = 0 - - for(var/i in GL) - var/datum/gas_mixture/G = i - total_gas_mixture.merge(G) - total_volume += G.return_volume() - - if(total_volume > 0) - //Update individual gas_mixtures by volume ratio - for(var/i in GL) - var/datum/gas_mixture/G = i - G.copy_from(total_gas_mixture) - G.multiply(G.return_volume()/total_volume) +/datum/pipeline/proc/reconcile_air() + var/list/datum/gas_mixture/GL = get_all_connected_airs() + equalize_all_gases_in_list(GL) diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 4fcef087b72c0..bf20a874a5c9f 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -9,7 +9,7 @@ idle_power_usage = 2 active_power_usage = 4 max_integrity = 150 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 0, "stamina" = 0) var/frequency = 0 var/atom/target var/id_tag diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index ae126b3e91875..90b283fb66835 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -5,6 +5,7 @@ #define GASMINER_POWER_KPA 3 #define GASMINER_POWER_FULLSCALE 4 + /obj/machinery/atmospherics/miner name = "gas miner" desc = "Gasses mined from the gas giant below (above?) flow out through this massive vent." @@ -12,9 +13,11 @@ icon_state = "miner" density = FALSE resistance_flags = INDESTRUCTIBLE|ACID_PROOF|FIRE_PROOF + interacts_with_air = TRUE var/spawn_id = null var/spawn_temp = T20C - var/spawn_mol = MOLES_CELLSTANDARD * 10 + /// Moles of gas to spawn per second + var/spawn_mol = MOLES_CELLSTANDARD * 5 var/max_ext_mol = INFINITY var/max_ext_kpa = 6500 var/overlay_color = "#FFFFFF" @@ -26,7 +29,7 @@ var/broken = FALSE var/broken_message = "ERROR" idle_power_usage = 150 - active_power_usage = 2000 + active_power_usage = 3000 /obj/machinery/atmospherics/miner/Initialize() . = ..() @@ -94,7 +97,7 @@ if(GASMINER_POWER_KPA) active_power_usage = P * power_draw_dynamic_kpa_coeff if(GASMINER_POWER_FULLSCALE) - active_power_usage = (spawn_mol * power_draw_dynamic_mol_coeff) + (P * power_draw_dynamic_kpa_coeff) + active_power_usage = (spawn_mol * power_draw_dynamic_mol_coeff) + (P * power_draw_dynamic_kpa_coeff) + power_draw_static /obj/machinery/atmospherics/miner/proc/do_use_power(amount) var/turf/T = get_turf(src) @@ -117,7 +120,7 @@ on_overlay.color = overlay_color add_overlay(on_overlay) -/obj/machinery/atmospherics/miner/process() +/obj/machinery/atmospherics/miner/process_atmos() //TODO figure out delta_time for this update_power() check_operation() if(active && !broken) @@ -126,12 +129,12 @@ if(do_use_power(active_power_usage)) mine_gas() -/obj/machinery/atmospherics/miner/proc/mine_gas() +/obj/machinery/atmospherics/miner/proc/mine_gas(delta_time = 2) var/turf/open/O = get_turf(src) if(!isopenturf(O)) return FALSE var/datum/gas_mixture/merger = new - merger.set_moles(spawn_id, spawn_mol) + merger.set_moles(spawn_id, spawn_mol * delta_time) merger.set_temperature(spawn_temp) O.assume_air(merger) O.air_update_turf(TRUE) @@ -144,34 +147,81 @@ /obj/machinery/atmospherics/miner/n2o name = "\improper N2O Gas Miner" overlay_color = "#FFCCCC" - spawn_id = /datum/gas/nitrous_oxide + spawn_id = GAS_NITROUS /obj/machinery/atmospherics/miner/nitrogen name = "\improper N2 Gas Miner" overlay_color = "#CCFFCC" - spawn_id = /datum/gas/nitrogen + spawn_id = GAS_N2 /obj/machinery/atmospherics/miner/oxygen name = "\improper O2 Gas Miner" overlay_color = "#007FFF" - spawn_id = /datum/gas/oxygen + spawn_id = GAS_O2 /obj/machinery/atmospherics/miner/toxins name = "\improper Plasma Gas Miner" overlay_color = "#FF0000" - spawn_id = /datum/gas/plasma + spawn_id = GAS_PLASMA /obj/machinery/atmospherics/miner/carbon_dioxide name = "\improper CO2 Gas Miner" overlay_color = "#CDCDCD" - spawn_id = /datum/gas/carbon_dioxide + spawn_id = GAS_CO2 /obj/machinery/atmospherics/miner/bz name = "\improper BZ Gas Miner" overlay_color = "#FAFF00" - spawn_id = /datum/gas/bz + spawn_id = GAS_BZ /obj/machinery/atmospherics/miner/water_vapor name = "\improper Water Vapor Gas Miner" overlay_color = "#99928E" - spawn_id = /datum/gas/water_vapor + spawn_id = GAS_H2O + +/obj/machinery/atmospherics/miner/station + power_draw = GASMINER_POWER_FULLSCALE + spawn_mol = MOLES_CELLSTANDARD / 10 + max_ext_kpa = 2500 + +/obj/machinery/atmospherics/miner/station/n2o + name = "\improper N2O Gas Miner" + overlay_color = "#FFCCCC" + spawn_id = GAS_NITROUS + +/obj/machinery/atmospherics/miner/station/nitrogen + name = "\improper N2 Gas Miner" + overlay_color = "#CCFFCC" + spawn_id = GAS_N2 + +/obj/machinery/atmospherics/miner/station/oxygen + name = "\improper O2 Gas Miner" + overlay_color = "#007FFF" + spawn_id = GAS_O2 + +/obj/machinery/atmospherics/miner/station/toxins + name = "\improper Plasma Gas Miner" + overlay_color = "#FF0000" + spawn_id = GAS_PLASMA + +/obj/machinery/atmospherics/miner/station/carbon_dioxide + name = "\improper CO2 Gas Miner" + overlay_color = "#CDCDCD" + spawn_id = GAS_CO2 + +/obj/machinery/atmospherics/miner/station/bz + name = "\improper BZ Gas Miner" + overlay_color = "#FAFF00" + spawn_id = GAS_BZ + +/obj/machinery/atmospherics/miner/station/water_vapor + name = "\improper Water Vapor Gas Miner" + overlay_color = "#99928E" + spawn_id = GAS_H2O + + +#undef GASMINER_POWER_NONE +#undef GASMINER_POWER_STATIC +#undef GASMINER_POWER_MOLES +#undef GASMINER_POWER_KPA +#undef GASMINER_POWER_FULLSCALE diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm index 66475be45a212..23169af7e56a1 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -6,6 +6,7 @@ buckle_lying = -1 var/icon_temperature = T20C //stop small changes in temperature causing icon refresh resistance_flags = LAVA_PROOF | FIRE_PROOF + interacts_with_air = TRUE /obj/machinery/atmospherics/pipe/heat_exchanging/Initialize() . = ..() @@ -25,9 +26,7 @@ var/turf/T = loc if(istype(T)) - if(islava(T)) - environment_temperature = 5000 - else if(T.blocks_air) + if(T.blocks_air) environment_temperature = T.return_temperature() else var/turf/open/OT = T @@ -35,8 +34,9 @@ else environment_temperature = T.return_temperature() - if(abs(environment_temperature-pipe_air.return_temperature()) > minimum_temperature_difference) - parent.temperature_interact(T, volume, thermal_conductivity) + if(pipe_air != null) + if(abs(environment_temperature-pipe_air.return_temperature()) > minimum_temperature_difference) + parent.temperature_interact(T, volume, thermal_conductivity) //heatup/cooldown any mobs buckled to ourselves based on our temperature @@ -50,7 +50,7 @@ L.bodytemperature = avg_temp pipe_air.set_temperature(avg_temp) -/obj/machinery/atmospherics/pipe/heat_exchanging/process() +/obj/machinery/atmospherics/pipe/heat_exchanging/process(delta_time) if(!parent) return //machines subsystem fires before atmos is initialized so this prevents race condition runtimes @@ -79,4 +79,4 @@ if(pipe_air.return_temperature() > heat_limit + 1) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m - buckled_mob.apply_damage(4 * log(pipe_air.return_temperature() - heat_limit), BURN, BODY_ZONE_CHEST) + buckled_mob.apply_damage(delta_time * 2 * log(pipe_air.return_temperature() - heat_limit), BURN, BODY_ZONE_CHEST) diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index db7656c2b3274..a5888ceeb0a98 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -8,7 +8,6 @@ pipe_flags = PIPING_ALL_LAYER | PIPING_DEFAULT_LAYER_ONLY | PIPING_CARDINAL_AUTONORMALIZE piping_layer = PIPING_LAYER_DEFAULT device_type = 0 - volume = 260 construction_type = /obj/item/pipe/binary pipe_state = "manifoldlayer" FASTDMM_PROP(\ @@ -20,6 +19,7 @@ var/list/back_nodes /obj/machinery/atmospherics/pipe/layer_manifold/Initialize() + volume = 280 //260 isn't divisible by 35 bull this is 280L front_nodes = list() back_nodes = list() icon_state = "manifoldlayer_center" @@ -35,8 +35,9 @@ back_nodes = null nodes = list() for(var/obj/machinery/atmospherics/A in needs_nullifying) - A.disconnect(src) - A.build_network() + if(A != null && src != null) //if it's already null why are we doing this? The answer is byond... it'll always find a way + A.disconnect(src) + SSair.add_to_rebuild_queue(A) /obj/machinery/atmospherics/pipe/layer_manifold/proc/get_all_connected_nodes() return front_nodes + back_nodes + nodes @@ -74,9 +75,9 @@ /obj/machinery/atmospherics/pipe/layer_manifold/SetInitDirections() switch(dir) - if(NORTH || SOUTH) + if(NORTH, SOUTH) initialize_directions = NORTH|SOUTH - if(EAST || WEST) + if(EAST, WEST) initialize_directions = EAST|WEST /obj/machinery/atmospherics/pipe/layer_manifold/isConnectable(obj/machinery/atmospherics/target, given_layer) diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index 60668f77eab67..41831924cd6c0 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -28,7 +28,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) @@ -55,14 +55,19 @@ air_update_turf() /obj/machinery/atmospherics/pipe/return_air() - return parent.air + if(parent) + return parent.air /obj/machinery/atmospherics/pipe/return_analyzable_air() - return parent.air + if(parent) + return parent.air /obj/machinery/atmospherics/pipe/remove_air(amount) return parent.air.remove(amount) +/obj/machinery/atmospherics/pipe/remove_air_ratio(ratio) + return parent.air.remove_ratio(ratio) + /obj/machinery/atmospherics/pipe/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/pipe_meter)) var/obj/item/pipe_meter/meter = W @@ -72,7 +77,8 @@ return ..() /obj/machinery/atmospherics/pipe/returnPipenet() - return parent + if(parent) + return parent.air /obj/machinery/atmospherics/pipe/setPipenet(datum/pipeline/P) parent = P diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index d088464387389..1291163a9b701 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -9,7 +9,6 @@ var/valve_open = FALSE - var/obj/machinery/atmospherics/components/binary/passive_gate/pump var/release_log = "" volume = 1000 @@ -19,12 +18,12 @@ var/can_max_release_pressure = (ONE_ATMOSPHERE * 10) var/can_min_release_pressure = (ONE_ATMOSPHERE / 10) - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 50) + armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 50, "stamina" = 0) max_integrity = 250 integrity_failure = 100 pressure_resistance = 7 * ONE_ATMOSPHERE var/temperature_resistance = 1000 + T0C - var/starter_temp + var/starter_temp = T20C // Prototype vars var/prototype = FALSE var/valve_timer = null @@ -66,37 +65,37 @@ name = "n2 canister" desc = "Nitrogen gas. Reportedly useful for something." icon_state = "red" - gas_type = /datum/gas/nitrogen + gas_type = GAS_N2 /obj/machinery/portable_atmospherics/canister/oxygen name = "o2 canister" desc = "Oxygen. Necessary for human life." icon_state = "blue" - gas_type = /datum/gas/oxygen + gas_type = GAS_O2 /obj/machinery/portable_atmospherics/canister/carbon_dioxide name = "co2 canister" desc = "Carbon dioxide. What the fuck is carbon dioxide?" icon_state = "black" - gas_type = /datum/gas/carbon_dioxide + gas_type = GAS_CO2 /obj/machinery/portable_atmospherics/canister/toxins name = "plasma canister" desc = "Plasma gas. The reason YOU are here. Highly toxic." icon_state = "orange" - gas_type = /datum/gas/plasma + gas_type = GAS_PLASMA /obj/machinery/portable_atmospherics/canister/bz name = "\improper BZ canister" desc = "BZ, a powerful hallucinogenic nerve agent." icon_state = "purple" - gas_type = /datum/gas/bz + gas_type = GAS_BZ /obj/machinery/portable_atmospherics/canister/nitrous_oxide name = "n2o canister" desc = "Nitrous oxide gas. Known to cause drowsiness." icon_state = "redws" - gas_type = /datum/gas/nitrous_oxide + gas_type = GAS_NITROUS /obj/machinery/portable_atmospherics/canister/air name = "air canister" @@ -107,44 +106,44 @@ name = "tritium canister" desc = "Tritium. Inhalation might cause irradiation." icon_state = "green" - gas_type = /datum/gas/tritium + gas_type = GAS_TRITIUM /obj/machinery/portable_atmospherics/canister/nob name = "hyper-noblium canister" desc = "Hyper-Noblium. More noble than all other gases." icon_state = "freon" - gas_type = /datum/gas/hypernoblium + gas_type = GAS_HYPERNOB /obj/machinery/portable_atmospherics/canister/nitryl name = "nitryl canister" desc = "Nitryl gas. Feels great 'til the acid eats your lungs." icon_state = "brown" - gas_type = /datum/gas/nitryl + gas_type = GAS_NITRYL /obj/machinery/portable_atmospherics/canister/stimulum name = "stimulum canister" desc = "Stimulum. High energy gas, high energy people." icon_state = "darkpurple" - gas_type = /datum/gas/stimulum + gas_type = GAS_STIMULUM /obj/machinery/portable_atmospherics/canister/pluoxium name = "pluoxium canister" desc = "Pluoxium. Like oxygen, but more bang for your buck." icon_state = "darkblue" - gas_type = /datum/gas/pluoxium + gas_type = GAS_PLUOXIUM /obj/machinery/portable_atmospherics/canister/water_vapor name = "water vapor canister" desc = "Water Vapor. We get it, you vape." icon_state = "water_vapor" - gas_type = /datum/gas/water_vapor + gas_type = GAS_H2O filled = 1 /obj/machinery/portable_atmospherics/canister/miasma name = "miasma canister" desc = "Miasma. Makes you wish your nose was blocked." icon_state = "miasma" - gas_type = /datum/gas/miasma + gas_type = GAS_MIASMA filled = 1 @@ -181,7 +180,7 @@ name = "prototype canister" desc = "A prototype canister for a prototype bike, what could go wrong?" icon_state = "proto" - gas_type = /datum/gas/oxygen + gas_type = GAS_O2 filled = 1 release_pressure = ONE_ATMOSPHERE*2 @@ -200,29 +199,21 @@ air_contents.copy_from(existing_mixture) else create_gas() - pump = new(src, FALSE) - pump.on = TRUE - pump.stat = 0 - pump.build_network() - update_icon() -/obj/machinery/portable_atmospherics/canister/Destroy() - qdel(pump) - pump = null - return ..() /obj/machinery/portable_atmospherics/canister/proc/create_gas() if(gas_type) if(starter_temp) air_contents.set_temperature(starter_temp) + if(!air_contents.return_volume()) + CRASH("Auxtools is failing somehow! Gas with pointer [air_contents._extools_pointer_gasmixture] is not valid.") air_contents.set_moles(gas_type, (maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) /obj/machinery/portable_atmospherics/canister/air/create_gas() - if(starter_temp) - air_contents.set_temperature(starter_temp) - air_contents.set_moles(/datum/gas/oxygen, (O2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) - air_contents.set_moles(/datum/gas/nitrogen, (N2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) + air_contents.set_temperature(starter_temp) + air_contents.set_moles(GAS_O2, (O2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) + air_contents.set_moles(GAS_N2, (N2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) #define CANISTER_UPDATE_HOLDING (1<<0) #define CANISTER_UPDATE_CONNECTED (1<<1) @@ -317,9 +308,8 @@ /obj/machinery/portable_atmospherics/canister/proc/canister_break() disconnect() - var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.total_moles()) var/turf/T = get_turf(src) - T.assume_air(expelled_gas) + T.assume_air(air_contents) air_update_turf() stat |= BROKEN @@ -349,21 +339,20 @@ if(timing && valve_timer < world.time) valve_open = !valve_open timing = FALSE + + // Handle gas transfer. if(valve_open) var/turf/T = get_turf(src) - pump.airs[1] = air_contents - pump.airs[2] = holding ? holding.air_contents : T.return_air() - pump.target_pressure = release_pressure - - pump.process_atmos() // Pump gas. - if(!holding) - air_update_turf() // Update the environment if needed. - else - pump.airs[1] = null - pump.airs[2] = null + var/datum/gas_mixture/target_air = holding ? holding.air_contents : T.return_air() + if(air_contents.release_gas_to(target_air, release_pressure) && !holding) + air_update_turf() update_icon() +/obj/machinery/portable_atmospherics/canister/ui_status(mob/user) + . = ..() + if(. > UI_UPDATE && !allowed(user)) + . = UI_UPDATE /obj/machinery/portable_atmospherics/canister/ui_state(mob/user) return GLOB.physical_state @@ -373,6 +362,7 @@ if(!ui) ui = new(user, src, "Canister") ui.open() + ui.set_autoupdate(TRUE) // Canister pressure, tank pressure, prototype canister timer /obj/machinery/portable_atmospherics/canister/ui_data() var/data = list() @@ -415,12 +405,14 @@ desc = initial(replacement.desc) icon_state = initial(replacement.icon_state) if("restricted") + if(!prototype) + return // Prototype canister only feature restricted = !restricted if(restricted) req_access = list(ACCESS_ENGINE) else req_access = list() - . = TRUE + . = TRUE if("pressure") var/pressure = params["pressure"] if(pressure == "reset") @@ -450,10 +442,10 @@ if(!holding) var/list/danger = list() for(var/id in air_contents.get_gases()) - if(!GLOB.meta_gas_info[id][META_GAS_DANGER]) + if(!(GLOB.gas_data.flags[id] & GAS_FLAG_DANGEROUS)) continue - if(air_contents.get_moles(id) > (GLOB.meta_gas_info[id][META_GAS_MOLES_VISIBLE] || MOLES_GAS_VISIBLE)) //if moles_visible is undefined, default to default visibility - danger[GLOB.meta_gas_info[id][META_GAS_NAME]] = air_contents.get_moles(id) //ex. "plasma" = 20 + if(air_contents.get_moles(id) > (GLOB.gas_data.visibility[id] || MOLES_GAS_VISIBLE)) //if moles_visible is undefined, default to default visibility + danger[GLOB.gas_data.names[id]] = air_contents.get_moles(id) //ex. "plasma" = 20 if(danger.len) message_admins("[ADMIN_LOOKUPFLW(usr)] opened a canister that contains the following at [ADMIN_VERBOSEJMP(src)]:") @@ -467,15 +459,21 @@ investigate_log(logmsg, INVESTIGATE_ATMOS) release_log += logmsg . = TRUE + /* // Apparently the timer isn't present in TGUI - commenting out so it can't be used via exploits if("timer") + if(!prototype) + return var/change = params["change"] switch(change) if("reset") timer_set = default_timer_set + . = TRUE if("decrease") timer_set = max(minimum_timer_set, timer_set - 10) + . = TRUE if("increase") timer_set = min(maximum_timer_set, timer_set + 10) + . = TRUE if("input") var/user_input = input(usr, "Set time to valve toggle.", name) as null|num if(!user_input) @@ -488,6 +486,8 @@ . = TRUE if("toggle_timer") set_active() + . = TRUE + */ if("eject") if(holding) if(valve_open) @@ -495,4 +495,5 @@ investigate_log("[key_name(usr)] removed the [holding], leaving the valve open and transferring into the air.", INVESTIGATE_ATMOS) replace_tank(usr, FALSE) . = TRUE - update_icon() + if(.) + update_icon() diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 4d537624ab32d..ca26846171b0c 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/atmos.dmi' use_power = NO_POWER_USE max_integrity = 250 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 60, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 60, "acid" = 30, "stamina" = 0) anchored = FALSE var/datum/gas_mixture/air_contents @@ -16,7 +16,7 @@ /obj/machinery/portable_atmospherics/New() ..() - SSair.atmos_machinery += src + SSair.atmos_air_machinery += src air_contents = new(volume) air_contents.set_temperature(T20C) @@ -24,11 +24,12 @@ return 1 /obj/machinery/portable_atmospherics/Destroy() - SSair.atmos_machinery -= src - + SSair.atmos_air_machinery -= src disconnect() qdel(air_contents) air_contents = null + + SSair.atmos_machinery -= src return ..() @@ -45,7 +46,7 @@ return ..() /obj/machinery/portable_atmospherics/process_atmos() - if(!connected_port) // Pipe network handles reactions if connected. + if(!connected_port && air_contents != null && src != null) // Pipe network handles reactions if connected. air_contents.react(src) /obj/machinery/portable_atmospherics/return_air() @@ -66,8 +67,7 @@ //Perform the connection connected_port = new_port connected_port.connected_device = src - var/datum/pipeline/connected_port_parent = connected_port.parents[1] - connected_port_parent.reconcile_air() + connected_port.parents[1].update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED anchored = TRUE //Prevent movement pixel_x = new_port.pixel_x @@ -104,8 +104,8 @@ /obj/machinery/portable_atmospherics/examine(mob/user) . = ..() if(holding) - . += {"\The [src] contains [holding]. Alt-click [src] to remove it. - Click [src] with another gas tank to hot swap [holding]."} + . += "\The [src] contains [holding]. Alt-click [src] to remove it.\n"+\ + "Click [src] with another gas tank to hot swap [holding]." /obj/machinery/portable_atmospherics/proc/replace_tank(mob/living/user, close_valve, obj/item/tank/new_tank) if(holding) diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 769c457abdca4..54b225b7a8574 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -13,6 +13,7 @@ var/on = FALSE var/direction = PUMP_OUT + var/target_pressure = ONE_ATMOSPHERE var/obj/machinery/atmospherics/components/binary/pump/pump volume = 1000 @@ -22,7 +23,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) @@ -91,6 +92,7 @@ if(!ui) ui = new(user, src, "PortablePump") ui.open() + ui.set_autoupdate(TRUE) // Air pressure, tank pressure /obj/machinery/portable_atmospherics/pump/ui_data() var/data = list() @@ -118,8 +120,8 @@ if("power") on = !on if(on && !holding) - var/plasma = air_contents.get_moles(/datum/gas/plasma) - var/n2o = air_contents.get_moles(/datum/gas/nitrous_oxide) + var/plasma = air_contents.get_moles(GAS_PLASMA) + var/n2o = air_contents.get_moles(GAS_NITROUS) if(n2o || plasma) message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [ADMIN_VERBOSEJMP(src)]") log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [AREACOORD(src)]") @@ -155,4 +157,5 @@ if(holding) replace_tank(usr, FALSE) . = TRUE - update_icon() + if(.) + update_icon() diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 8cb8c55908d7f..105deda497567 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -7,9 +7,10 @@ var/on = FALSE var/volume_rate = 1000 + var/overpressure_m = 80 volume = 1000 - var/list/scrubbing = list(/datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/bz, /datum/gas/nitryl, /datum/gas/tritium, /datum/gas/hypernoblium, /datum/gas/water_vapor) + var/list/scrubbing = list(GAS_PLASMA, GAS_CO2, GAS_NITROUS, GAS_BZ, GAS_NITRYL, GAS_TRITIUM, GAS_HYPERNOB, GAS_H2O) /obj/machinery/portable_atmospherics/scrubber/Destroy() var/turf/T = get_turf(src) @@ -38,15 +39,10 @@ scrub(T.return_air()) /obj/machinery/portable_atmospherics/scrubber/proc/scrub(var/datum/gas_mixture/mixture) - var/transfer_moles = min(1, volume_rate / mixture.return_volume()) * mixture.total_moles() - - var/datum/gas_mixture/filtering = mixture.remove(transfer_moles) // Remove part of the mixture to filter. - if(!filtering) + if(air_contents.return_pressure() >= overpressure_m * ONE_ATMOSPHERE) return - filtering.scrub_into(air_contents, scrubbing) - - mixture.merge(filtering) // Returned the cleaned gas. + mixture.scrub_into(air_contents, volume_rate / mixture.return_volume(), scrubbing) if(!holding) air_update_turf() @@ -68,6 +64,7 @@ if(!ui) ui = new(user, src, "PortableScrubber") ui.open() + ui.set_autoupdate(TRUE) // Air pressure, tank pressure /obj/machinery/portable_atmospherics/scrubber/ui_data() var/data = list() @@ -77,9 +74,8 @@ data["id_tag"] = -1 //must be defined in order to reuse code between portable and vent scrubbers data["filter_types"] = list() - for(var/path in GLOB.meta_gas_info) - var/list/gas = GLOB.meta_gas_info[path] - data["filter_types"] += list(list("gas_id" = gas[META_GAS_ID], "gas_name" = gas[META_GAS_NAME], "enabled" = (path in scrubbing))) + for(var/id in GLOB.gas_data.ids) + data["filter_types"] += list(list("gas_id" = id, "gas_name" = GLOB.gas_data.names[id], "enabled" = (id in scrubbing))) if(holding) data["holding"] = list() @@ -111,9 +107,10 @@ replace_tank(usr, FALSE) . = TRUE if("toggle_filter") - scrubbing ^= gas_id2path(params["val"]) + scrubbing ^= params["val"] . = TRUE - update_icon() + if(.) + update_icon() /obj/machinery/portable_atmospherics/scrubber/huge name = "huge air scrubber" @@ -122,6 +119,7 @@ active_power_usage = 500 idle_power_usage = 10 + overpressure_m = 200 volume_rate = 1500 volume = 50000 diff --git a/code/modules/atmospherics/multiz.dm b/code/modules/atmospherics/multiz.dm index 75b628ccc362b..999855f278373 100644 --- a/code/modules/atmospherics/multiz.dm +++ b/code/modules/atmospherics/multiz.dm @@ -3,27 +3,43 @@ desc = "An adapter which allows pipes to connect to other pipenets on different decks." icon_state = "multiz_pipe" icon = 'icons/obj/atmos.dmi' + level = 2 //Always visible. + +/obj/machinery/atmospherics/pipe/simple/multiz/layer1 + piping_layer = 1 + +/obj/machinery/atmospherics/pipe/simple/multiz/layer3 + piping_layer = 3 /obj/machinery/atmospherics/pipe/simple/multiz/update_icon() . = ..() cut_overlays() //This adds the overlay showing it's a multiz pipe. This should go above turfs and such var/image/multiz_overlay_node = new(src) //If we have a firing state, light em up! multiz_overlay_node.icon = 'icons/obj/atmos.dmi' - multiz_overlay_node.icon_state = "multiz_pipe" + multiz_overlay_node.icon_state = "multiz_pipe-[piping_layer]" multiz_overlay_node.layer = HIGH_OBJ_LAYER add_overlay(multiz_overlay_node) ///Attempts to locate a multiz pipe that's above us, if it finds one it merges us into its pipenet -/obj/machinery/atmospherics/pipe/simple/multiz/pipeline_expansion() +/obj/machinery/atmospherics/pipe/simple/multiz/pipeline_expansion(expand_up = TRUE, expand_down = TRUE) icon = 'icons/obj/atmos.dmi' //Just to refresh. var/turf/T = get_turf(src) - var/obj/machinery/atmospherics/pipe/simple/multiz/above = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_above(T)) - var/obj/machinery/atmospherics/pipe/simple/multiz/below = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_below(T)) - if(below) - below.pipeline_expansion() //If we've got one below us, force it to add us on facebook - if(above) - nodes += above - above.nodes += src //Two way travel :) - return ..() - else - return ..() \ No newline at end of file + //Expand above pipes recursively + if(SSmapping.get_turf_above(T) && expand_up) + for(var/obj/machinery/atmospherics/pipe/simple/multiz/above in SSmapping.get_turf_above(T)) + if(above.piping_layer == piping_layer) + //Link ourself to the above node + nodes |= above + above.nodes |= src + //Link above node to their above nodes. + above.pipeline_expansion(TRUE, FALSE) + //Expand below pipes recursively + if(SSmapping.get_turf_below(T) && expand_down) + for(var/obj/machinery/atmospherics/pipe/simple/multiz/below in SSmapping.get_turf_below(T)) + if(below.piping_layer == piping_layer) + //Link ourself to the below node + nodes |= below + below.nodes |= src + //Link below node to their below nodes + below.pipeline_expansion(FALSE, TRUE) + return ..() diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm index deb05920e2292..874f85fa2244e 100644 --- a/code/modules/awaymissions/bluespaceartillery.dm +++ b/code/modules/awaymissions/bluespaceartillery.dm @@ -1,8 +1,8 @@ /obj/machinery/artillerycontrol - var/reload = 60 - var/reload_cooldown = 60 + var/reload = 120 + var/reload_cooldown = 120 var/explosiondev = 3 var/explosionmed = 6 var/explosionlight = 12 @@ -11,9 +11,9 @@ icon = 'icons/obj/machines/particle_accelerator.dmi' density = TRUE -/obj/machinery/artillerycontrol/process() +/obj/machinery/artillerycontrol/process(delta_time) if(reload < reload_cooldown) - reload++ + reload += delta_time /obj/structure/artilleryplaceholder name = "artillery" @@ -45,7 +45,7 @@ if(reload < reload_cooldown) return if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) - priority_announce("Bluespace artillery fire detected. Brace for impact.") + priority_announce("Bluespace artillery fire detected. Brace for impact.", sound = SSstation.announcer.get_rand_alert_sound()) message_admins("[ADMIN_LOOKUPFLW(usr)] has launched an artillery strike.") var/list/L = list() for(var/turf/T in get_area_turfs(thearea.type)) diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 0e96d7d8be29d..897276323e3b7 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -9,7 +9,7 @@ -/obj/item/twohanded/ctf +/obj/item/ctf name = "banner" icon = 'icons/obj/banner.dmi' icon_state = "banner" @@ -31,20 +31,28 @@ var/obj/effect/ctf/flag_reset/reset var/reset_path = /obj/effect/ctf/flag_reset -/obj/item/twohanded/ctf/Destroy() +/obj/item/ctf/Destroy() QDEL_NULL(reset) return ..() -/obj/item/twohanded/ctf/Initialize() +/obj/item/ctf/Initialize() . = ..() if(!reset) reset = new reset_path(get_turf(src)) + reset.flag = src -/obj/item/twohanded/ctf/process() +/obj/item/ctf/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed) + +/obj/item/ctf/process() if(is_ctf_target(loc)) //don't reset from someone's hands. return PROCESS_KILL if(world.time > reset_cooldown) - forceMove(get_turf(src.reset)) + var/turf/our_turf = get_turf(src.reset) + if(!our_turf) + return TRUE + forceMove(our_turf) for(var/mob/M in GLOB.player_list) var/area/mob_area = get_area(M) if(istype(mob_area, /area/ctf)) @@ -52,7 +60,7 @@ STOP_PROCESSING(SSobj, src) //ATTACK HAND IGNORING PARENT RETURN VALUE -/obj/item/twohanded/ctf/attack_hand(mob/living/user) +/obj/item/ctf/attack_hand(mob/living/user) if(!is_ctf_target(user) && !anyonecanpickup) to_chat(user, "Non players shouldn't be moving the flag!") return @@ -76,7 +84,7 @@ STOP_PROCESSING(SSobj, src) ..() -/obj/item/twohanded/ctf/dropped(mob/user) +/obj/item/ctf/dropped(mob/user) ..() user.anchored = FALSE user.status_flags |= CANPUSH @@ -89,7 +97,7 @@ anchored = TRUE -/obj/item/twohanded/ctf/red +/obj/item/ctf/red name = "red flag" icon_state = "banner-red" item_state = "banner-red" @@ -98,7 +106,7 @@ reset_path = /obj/effect/ctf/flag_reset/red -/obj/item/twohanded/ctf/blue +/obj/item/ctf/blue name = "blue flag" icon_state = "banner-blue" item_state = "banner-blue" @@ -112,6 +120,13 @@ icon_state = "banner" desc = "This is where a banner with Nanotrasen's logo on it would go." layer = LOW_ITEM_LAYER + var/obj/item/ctf/flag + +/obj/effect/ctf/flag_reset/Destroy() + if(flag) + flag.reset = null + flag = null + return ..() /obj/effect/ctf/flag_reset/red name = "red flag landmark" @@ -171,20 +186,19 @@ GLOB.poi_list.Remove(src) ..() -/obj/machinery/capture_the_flag/process() - for(var/i in spawned_mobs) - if(!i) - spawned_mobs -= i +/obj/machinery/capture_the_flag/process(delta_time) + for(var/mob/living/M as() in spawned_mobs) + if(QDELETED(M)) + spawned_mobs -= M continue // Anyone in crit, automatically reap - var/mob/living/M = i if(M.InCritical() || M.stat == DEAD) ctf_dust_old(M) else // The changes that you've been hit with no shield but not // instantly critted are low, but have some healing. - M.adjustBruteLoss(-5) - M.adjustFireLoss(-5) + M.adjustBruteLoss(-2.5 * delta_time) + M.adjustFireLoss(-2.5 * delta_time) /obj/machinery/capture_the_flag/red name = "Red CTF Controller" @@ -212,6 +226,9 @@ return + if(!(GLOB.ghost_role_flags & GHOSTROLE_MINIGAME)) + to_chat(user, "CTF has been temporarily disabled by admins.") + return people_who_want_to_play |= user.ckey var/num = people_who_want_to_play.len var/remaining = CTF_REQUIRED_PLAYERS - num @@ -264,7 +281,7 @@ /obj/machinery/capture_the_flag/proc/spawn_team_member(client/new_team_member) var/mob/living/carbon/human/M = new/mob/living/carbon/human(get_turf(src)) new_team_member.prefs.copy_to(M) - M.set_species(/datum/species/synth) + M.set_species(/datum/species/human) M.key = new_team_member.key M.faction += team M.equipOutfit(ctf_gear) @@ -277,8 +294,8 @@ attack_ghost(ghost) /obj/machinery/capture_the_flag/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/twohanded/ctf)) - var/obj/item/twohanded/ctf/flag = I + if(istype(I, /obj/item/ctf)) + var/obj/item/ctf/flag = I if(flag.team != src.team) user.transferItemToLoc(flag, get_turf(flag.reset), TRUE) points++ @@ -295,7 +312,7 @@ if(istype(mob_area, /area/ctf)) to_chat(M, "[team] team wins!") to_chat(M, "Teams have been cleared. Click on the machines to vote to begin another round.") - for(var/obj/item/twohanded/ctf/W in M) + for(var/obj/item/ctf/W in M) M.dropItemToGround(W) M.dust() for(var/obj/machinery/control_point/control in GLOB.machines) @@ -336,7 +353,7 @@ var/list/ctf_object_typecache = typecacheof(list( /obj/machinery, /obj/effect/ctf, - /obj/item/twohanded/ctf + /obj/item/ctf )) for(var/atm in A) if (isturf(A) || ismob(A) || isarea(A)) @@ -497,11 +514,11 @@ W.registered_name = H.real_name W.update_label(W.registered_name, W.assignment) - no_drops += H.get_item_by_slot(SLOT_WEAR_SUIT) - no_drops += H.get_item_by_slot(SLOT_GLOVES) - no_drops += H.get_item_by_slot(SLOT_SHOES) - no_drops += H.get_item_by_slot(SLOT_W_UNIFORM) - no_drops += H.get_item_by_slot(SLOT_EARS) + no_drops += H.get_item_by_slot(ITEM_SLOT_OCLOTHING) + no_drops += H.get_item_by_slot(ITEM_SLOT_GLOVES) + 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_EARS) for(var/i in no_drops) var/obj/item/I = i ADD_TRAIT(I, TRAIT_NODROP, CAPTURE_THE_FLAG_TRAIT) @@ -641,6 +658,13 @@ for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines) CTF.dead_barricades += src +/obj/effect/ctf/dead_barricade/Destroy() + for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines) + //if(CTF.game_id != game_id) + // continue + CTF.dead_barricades -= src + return ..() + /obj/effect/ctf/dead_barricade/proc/respawn() if(!QDELETED(src)) new /obj/structure/barricade/security/ctf(get_turf(src)) @@ -657,11 +681,11 @@ resistance_flags = INDESTRUCTIBLE var/obj/machinery/capture_the_flag/controlling var/team = "none" - var/point_rate = 1 + var/point_rate = 0.5 -/obj/machinery/control_point/process() +/obj/machinery/control_point/process(delta_time) if(controlling) - controlling.control_points += point_rate + controlling.control_points += point_rate * delta_time if(controlling.control_points >= controlling.control_points_to_win) controlling.victory() diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 6975891b328d8..9a569fcadc7fa 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -36,6 +36,9 @@ /obj/effect/mob_spawn/attack_ghost(mob/user) if(!SSticker.HasRoundStarted() || !loc || !ghost_usable) return + if(!(GLOB.ghost_role_flags & GHOSTROLE_SPAWNER) && !(flags_1 & ADMIN_SPAWNED_1)) + to_chat(user, "An admin has temporarily disabled non-admin ghost roles!") + return if(!uses) to_chat(user, "This spawner is out of charges!") return @@ -60,6 +63,7 @@ else if(ghost_usable) GLOB.poi_list |= src LAZYADD(GLOB.mob_spawners[name], src) + SSmobs.update_spawners() /obj/effect/mob_spawn/Destroy() GLOB.poi_list -= src @@ -67,6 +71,7 @@ LAZYREMOVE(spawners, src) if(!LAZYLEN(spawners)) GLOB.mob_spawners -= name + SSmobs.update_spawners() return ..() /obj/effect/mob_spawn/proc/special(mob/M) @@ -469,7 +474,7 @@ outfit = /datum/outfit/nanotrasencommandercorpse /datum/outfit/nanotrasencommandercorpse - name = "Nanotrasen Private Security Commander" + name = "\improper Nanotrasen Private Security Commander" uniform = /obj/item/clothing/under/rank/centcom/commander suit = /obj/item/clothing/suit/armor/bulletproof ears = /obj/item/radio/headset/heads/captain @@ -483,7 +488,7 @@ /obj/effect/mob_spawn/human/nanotrasensoldier - name = "Nanotrasen Private Security Officer" + name = "\improper Nanotrasen Private Security Officer" id_job = "Private Security Force" id_access_list = list(ACCESS_CENT_CAPTAIN, ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_STORAGE, ACCESS_SECURITY, ACCESS_MECH_SECURITY) outfit = /datum/outfit/nanotrasensoldiercorpse @@ -503,7 +508,7 @@ /obj/effect/mob_spawn/human/commander/alive death = FALSE roundstart = FALSE - mob_name = "Nanotrasen Commander" + mob_name = "\improper Nanotrasen Commander" name = "sleeper" icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper" diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index 7d73a394591c8..2ec007ba869d1 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -69,9 +69,9 @@ /obj/singularity/academy/admin_investigate_setup() return -/obj/singularity/academy/process() +/obj/singularity/academy/process(delta_time) eat() - if(prob(1)) + if(DT_PROB(0.5, delta_time)) mezzer() @@ -107,7 +107,7 @@ if(next_check < world.time) if(!current_wizard) for(var/mob/living/L in GLOB.player_list) - if(L.z == src.z && L.stat != DEAD && !(faction in L.faction)) + if(L.get_virtual_z_level() == src.get_virtual_z_level() && L.stat != DEAD && !(faction in L.faction)) summon_wizard() break else @@ -132,8 +132,10 @@ if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Wizard Academy Defender") - current_wizard.ghostize() // on the off chance braindead defender gets back in + current_wizard.ghostize(FALSE) // on the off chance braindead defender gets back in current_wizard.key = C.key + else + current_wizard.ghostize(FALSE,SENTIENCE_FORCE) /obj/structure/academy_wizard_spawner/proc/summon_wizard() var/turf/T = src.loc @@ -170,6 +172,7 @@ microwave_riggable = FALSE var/reusable = TRUE var/used = FALSE + var/roll_in_progress = FALSE /obj/item/dice/d20/fate/stealth name = "d20" @@ -192,6 +195,10 @@ /obj/item/dice/d20/fate/diceroll(mob/user) . = ..() + if(roll_in_progress) + to_chat(user, "The dice is already channeling its power! Be patient!") + return + if(!used) if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards)) to_chat(user, "You feel the magic of the dice is restricted to ordinary humans!") @@ -199,10 +206,9 @@ if(!reusable) used = TRUE - + roll_in_progress = TRUE var/turf/T = get_turf(src) T.visible_message("[src] flares briefly.") - addtimer(CALLBACK(src, .proc/effect, user, .), 1 SECONDS) /obj/item/dice/d20/fate/equipped(mob/user, slot) @@ -213,6 +219,7 @@ /obj/item/dice/d20/fate/proc/effect(var/mob/living/carbon/human/user,roll) var/turf/T = get_turf(src) + switch(roll) if(1) //Dust @@ -321,7 +328,7 @@ if(17) //Tator Kit T.visible_message("A suspicious box appears!") - new /obj/item/storage/box/syndicate/bundle_A(drop_location()) + new /obj/item/storage/box/syndie_kit/bundle_A(drop_location()) do_smoke(0, drop_location()) if(18) //Captain ID @@ -338,6 +345,9 @@ //Free wizard! T.visible_message("Magic flows out of [src] and into [user]!") user.mind.make_Wizard() + //roll is completed, allow others players to roll the dice + roll_in_progress = FALSE + /datum/outfit/butler name = "Butler" diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm index e9266faa4c9d7..c9ba3a6897a7f 100644 --- a/code/modules/awaymissions/mission_code/Cabin.dm +++ b/code/modules/awaymissions/mission_code/Cabin.dm @@ -45,7 +45,7 @@ var/active = 1 /obj/structure/firepit/Initialize() - ..() + . = ..() toggleFirepit() /obj/structure/firepit/interact(mob/living/user) @@ -111,6 +111,7 @@ eggsleft = 0 egg_type = null speak = list() + mobchatspan = "assistant" /*Cabin's forest. Removed in the new cabin map since it was buggy and I prefer manual placement.*/ /datum/mapGenerator/snowy diff --git a/code/modules/awaymissions/mission_code/TheFactory.dm b/code/modules/awaymissions/mission_code/TheFactory.dm new file mode 100644 index 0000000000000..35e85a38a2e46 --- /dev/null +++ b/code/modules/awaymissions/mission_code/TheFactory.dm @@ -0,0 +1,839 @@ +/obj/singularity/factory + name = "tear in the fabric of reality" + desc = "Your own comprehension of reality starts bending as you stare this." + icon = 'icons/effects/96x96.dmi' + icon_state = "boh_tear" + pixel_x = -32 + pixel_y = -32 + dissipate = 0 + move_self = 0 + grav_pull = 1 + +/obj/singularity/factory/admin_investigate_setup() + return + +//AREAS// +//"old" means places we get in after the rune transition + +/area/awaymission/factory + teleport_restriction = TELEPORT_ALLOW_NONE + +/area/awaymission/factory/secret + name = "secrets" + ambientsounds = list('sound/ambience/secrets.ogg','sound/ambience/ambiholy2.ogg') + +/area/awaymission/factory/villageafter + name = "The Village" + ambientsounds = list('sound/ambience/seag1.ogg', 'sound/ambience/seag2.ogg', 'sound/ambience/seag2.ogg', 'sound/ambience/ambiodd.ogg', 'sound/ambience/ambimystery.ogg', 'sound/ambience/ambiearth.ogg', 'sound/ambience/ambiwind.ogg', 'sound/ambience/ambimine.ogg') + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + requires_power = FALSE + +/area/awaymission/factory/villageafter/church + name = "The Church" + ambience_index = AMBIENCE_HOLY + +/area/awaymission/factory/villageafter/house + ambientsounds = list('sound/ambience/ambiruin4.ogg','sound/ambience/ambiruin6.ogg','sound/ambience/ambiruin7.ogg','sound/ambience/ambiruin2.ogg') + +/area/awaymission/factory/villageafter/house/ritual + ambientsounds = list('sound/ambience/antag/ecult_op.ogg','sound/ambience/ambiruin2.ogg','sound/spookoween/insane_low_laugh.ogg') + mood_bonus = -2 + mood_message = "It smells like death in here!\n" + +/area/awaymission/factory/villageafter/house/start + name = "The House" + ambientsounds = list('sound/ambience/ambidet2.ogg','sound/ambience/ambiodd.ogg') + +/area/awaymission/factory/villageafter/hospital + ambientsounds = list('sound/ambience/ambiodd.ogg','sound/ambience/ambimystery.ogg','sound/ambience/ambimaint.ogg','sound/ambience/ambiruin2.ogg') + name = "The Hospital" + requires_power = TRUE + +/area/awaymission/factory/villageafter/spooky + ambience_index = AMBIENCE_SPOOKY + mood_bonus = -2 + mood_message = "It smells like death in here!\n" + +/area/awaymission/factory/factoryafter + name = "The Factory" + ambientsounds = list('sound/ambience/ambiodd.ogg','sound/ambience/ambimystery.ogg','sound/ambience/ambimaint.ogg','sound/ambience/ambiruin6.ogg','sound/ambience/ambitech3.ogg') + requires_power = TRUE + always_unpowered = TRUE + +/area/awaymission/factory/clownplanet + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + ambientsounds = list('sound/spookoween/scary_horn3.ogg','sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg','sound/spookoween/scary_clown_appear.ogg') + mood_bonus = 3 + mood_message = "I hate this!\n" + +/area/awaymission/factory/factoryafter/down + ambientsounds = list('sound/ambience/ambiatm1.ogg','sound/ambience/ambifac.ogg','sound/ambience/ambimaint3.ogg','sound/ambience/ambiodd.ogg','sound/ambience/ambimystery.ogg','sound/ambience/ambimaint.ogg','sound/ambience/ambiruin6.ogg','sound/ambience/ambitech3.ogg') + requires_power = FALSE + always_unpowered = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/awaymission/factory/factoryafter/down/maint + ambientsounds = list('sound/ambience/ambiatm1.ogg','sound/ambience/ambimaint3.ogg','sound/ambience/ambimystery.ogg','sound/ambience/ambimaint.ogg','sound/ambience/ambimaint2.ogg') + +/area/awaymission/factory/factoryafter/down/batsecret + name = "The maze" + ambientsounds = list('sound/ambience/ambiatm1.ogg','sound/ambience/ambimaint3.ogg','sound/ambience/ambimystery.ogg','sound/ambience/ambimaint.ogg','sound/ambience/ambimaint2.ogg','sound/ambience/ambibasement.ogg') + +/area/awaymission/factory/factoryafter/down/leveltwo + name = "The Factory - middle level" + ambientsounds = list('sound/ambience/ambigen7.ogg','sound/ambience/ambifac.ogg','sound/ambience/ambireebe1.ogg','sound/ambience/ambimystery.ogg','sound/ambience/ambiodd.ogg','sound/ambience/ambigen14.ogg') + +/area/awaymission/factory/factoryafter/down/leveltwo/morgue + name = "The Morgue" + ambience_index = AMBIENCE_SPOOKY + mood_bonus = -2 + mood_message = "It smells like death in here!\n" + +/area/awaymission/factory/factoryafter/down/leveltwo/ritual + name = "a strange place" + ambientsounds = list('sound/ambience/antag/ecult_op.ogg','sound/ambience/ambiodd.ogg','sound/ambience/ambireebe2.ogg','sound/spookoween/insane_low_laugh.ogg','sound/spookoween/chain_rattling.ogg') + mood_bonus = -2 + mood_message = "It smells like death in here!\n" + +/area/awaymission/factory/factoryafter/down/levelthree + name = "The Factory - lower level" + ambientsounds = list('sound/ambience/ambiatm1.ogg','sound/ambience/ambitech.ogg','sound/ambience/ambitech2.ogg','sound/ambience/ambitech3.ogg','sound/ambience/ambiatmos.ogg','sound/ambience/ambiatmos2.ogg','sound/ambience/ambiodd.ogg','sound/ambience/ambimaint5.ogg','sound/ambience/ambireebe3.ogg','sound/ambience/ambilava.ogg') + +/area/awaymission/factory/factoryafter/down/levelthree/engine + name = "The reality engine" + ambientsounds = list('sound/ambience/singulambience.ogg','sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg','sound/ambience/ambisin4.ogg','sound/ambience/antag/assimilation.ogg') + mood_bonus = 1 + mood_message = "Uhm... Ok?... I guess...\n" + +/area/awaymission/factory/factoryduring + name = "The old Factory" + ambientsounds = list('sound/ambience/ambidanger.ogg','sound/ambience/ambifac.ogg','sound/ambience/ambidanger2.ogg','sound/ambience/ambiatm1.ogg','sound/ambience/ambiatmos.ogg') + +/area/awaymission/factory/factoryduring/down/levelthree + name = "The old Factory - lower level" + ambientsounds = list('sound/ambience/ambiatm1.ogg','sound/ambience/ambitech.ogg','sound/ambience/ambitech2.ogg','sound/ambience/ambitech3.ogg','sound/ambience/ambiatmos.ogg','sound/ambience/ambiatmos2.ogg','sound/ambience/signal.ogg','sound/ambience/ambidanger.ogg','sound/ambience/ambidanger2.ogg','sound/ambience/ambiruin2.ogg') + +/area/awaymission/factory/factoryduring/down/levelthree/engine + name = "The old reality engine" + mood_bonus = 1 + mood_message = "Uhm... Ok?... I guess...\n" + ambientsounds = list('sound/ambience/singulambience.ogg','sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg','sound/ambience/ambisin4.ogg','sound/ambience/antag/assimilation.ogg','sound/ambience/ambidanger.ogg','sound/ambience/ambidanger2.ogg') + name = "The reality engine" + +/area/awaymission/factory/factoryduring/down/leveltwo + name = "The old Factory - middle level" + ambientsounds = list('sound/ambience/ambidanger.ogg','sound/ambience/ambifac.ogg','sound/ambience/ambidanger2.ogg','sound/ambience/ambiruin5.ogg','sound/ambience/ambiruin6.ogg','sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg') + +/area/awaymission/factory/factoryduring/down/leveltwo/ritual + name = "a strange place" + ambientsounds = list('sound/ambience/antag/ecult_op.ogg','sound/spookoween/insane_low_laugh.ogg','sound/spookoween/spookywind.ogg') + +/area/awaymission/factory/factoryduring/down/leveltwo/morgue + name = "The old Morgue" + ambience_index = AMBIENCE_SPOOKY + mood_bonus = -2 + mood_message = "It smells like death in here!\n" + +/area/awaymission/factory/factoryduring/down/leveltwo/asylum + name = "The sector of mentally disordered" + ambientsounds = list('sound/ambience/ambimo2.ogg','sound/ambience/ambiodd.ogg','sound/ambience/ambitech.ogg','sound/ambience/ambireebe1.ogg') + +/area/awaymission/factory/factoryduring/down + ambientsounds = list('sound/ambience/ambidanger.ogg','sound/ambience/ambidanger2.ogg','sound/ambience/ambimaint.ogg','sound/ambience/ambiruin6.ogg','sound/ambience/ambitech3.ogg','sound/ambience/ambiatm1.ogg') + +/area/awaymission/factory/factoryduring/down/maint + ambientsounds = list('sound/ambience/ambidanger.ogg','sound/ambience/ambidanger2.ogg','sound/ambience/ambiatm1.ogg','sound/ambience/ambimaint3.ogg','sound/ambience/ambimaint.ogg','sound/ambience/ambimaint2.ogg') + +/area/awaymission/factory/villageduring + name = "The old village" + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + requires_power = FALSE + ambientsounds = list('sound/ambience/ambidanger.ogg','sound/ambience/ambidanger2.ogg','sound/ambience/ambiearthduring.ogg','sound/ambience/ambiwind.ogg','sound/ambience/ambimine.ogg') + +/area/awaymission/factory/villageduring/house + ambientsounds = list('sound/ambience/ambidanger.ogg','sound/ambience/ambidanger2.ogg','sound/ambience/ambiearthduring.ogg','sound/ambience/ambiwind.ogg','sound/ambience/ambimine.ogg','sound/ambience/ambiruin4.ogg','sound/ambience/ambiruin6.ogg','sound/ambience/ambiruin7.ogg','sound/ambience/ambiruin2.ogg','sound/ambience/signal.ogg') + +/area/awaymission/factory/villageduring/house/ritual + ambientsounds = list('sound/ambience/antag/ecult_op.ogg','sound/ambience/ambiruin2.ogg','sound/spookoween/insane_low_laugh.ogg') + mood_bonus = -2 + mood_message = "It smells like death in here!\n" + +/area/awaymission/factory/villageduring/church + name = "The old Church" + ambience_index = AMBIENCE_HOLY + +/area/awaymission/factory/villageduring/church/leveltwo + name = "The old Church - 2nd floor" + ambientsounds = list('sound/ambience/ambimystery.ogg','sound/ambience/ambiodd.ogg','sound/ambience/signal.ogg','sound/ambience/ambiwind.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambiholy3.ogg') + +/area/awaymission/factory/villageduring/basement + name = "The old basement" + ambientsounds = list('sound/ambience/ambibasement.ogg','sound/ambience/ambimystery.ogg','sound/ambience/ambiodd.ogg') + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/awaymission/factory/villageduring/house/start + name = "The old House" + ambientsounds = list('sound/ambience/ambidet2.ogg') + +/area/awaymission/factory/villageduring/hospital + ambientsounds = list('sound/ambience/ambidanger.ogg','sound/ambience/ambidanger2.ogg','sound/ambience/ambiatmos.ogg','sound/ambience/ambimystery.ogg','sound/ambience/ambimaint.ogg','sound/ambience/ambiruin2.ogg') + name = "The Hospital" + +/area/awaymission/factory/transition + name = "Beyond the time" + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + ambientsounds = list('sound/ambience/shipambience.ogg','sound/ambience/ambiatmos.ogg','sound/ambience/antag/malf.ogg','sound/ambience/signal.ogg','sound/ambience/ambimalf.ogg') + +//ITEMS// + +/obj/item/statuebust/toy + name = "aesthetic bust" + desc = "A priceless ancient marble bust, the kind that belongs in a museum. Looks like this one has some differences." + var/cooldown = 0 + +/obj/item/statuebust/toy/attack_self(mob/user) + if (cooldown < world.time) + cooldown = world.time + 450 + user.visible_message("[user] activates \the [src].", "You activate \the [src]!", "You hear a music playing.") + playsound(src, 'sound/ambience/ambivapor1.ogg', 50, 0) + else + to_chat(user, "Nothing happens!") + +/obj/item/clothing/glasses/hud/terminator + name = "T-80 tactical sunglasses" + desc = "Strangely ancient technology used to help provide rudimentary eye cover. Also shows information about criminals and their condition. Has enhanced shielding which blocks flashes." + icon_state = "t80sunglasses" + darkness_view = 1 + clothing_flags = SCAN_REAGENTS + vision_flags = SEE_MOBS + flash_protect = 1 + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + hud_type = list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_DIAGNOSTIC_BASIC, DATA_HUD_MEDICAL_ADVANCED) + hud_trait = list(TRAIT_SECURITY_HUD, TRAIT_MEDICAL_HUD) + +//MOBS// + +/mob/living/simple_animal/hostile/proc/summon_backup_nosound(distance, exact_faction_match) + do_alert_animation(src) + for(var/mob/living/simple_animal/hostile/M in oview(distance, GET_TARGETS_FROM(src))) + if(faction_check_mob(M, TRUE)) + if(M.AIStatus == AI_OFF) + return + else + M.Goto(src,M.move_to_delay,M.minimum_distance) + +/mob/living/simple_animal/hostile/factory + name = "Guard" + desc = "An armed officer. Looks like they prefer to shoot rather than asking questions." + speak = list("Stop resisting!","I need backup!","Die, freak!","It's getting away!") + icon = 'icons/mob/simple_human.dmi' + icon_state = "nanotrasen" + icon_living = "nanotrasen" + icon_dead = null + icon_gib = "syndicate_gib" + mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID) + turns_per_move = 5 + speak_chance = 5 + del_on_death = TRUE + do_footstep = TRUE + environment_smash = ENVIRONMENT_SMASH_STRUCTURES + search_objects = 1 + a_intent = INTENT_HARM + attack_sound = 'sound/weapons/cqchit2.ogg' + attacktext = "punches" + robust_searching = 1 + melee_damage = 12 + speed = 0 + maxHealth = 100 + health = 100 + melee_damage = 12 + stat_attack = UNCONSCIOUS + faction = list("nanotrasenprivate") + status_flags = CANPUSH + 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) + unsuitable_atmos_damage = 10 + loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasensoldier) + response_help = "pokes" + response_disarm = "shoves" + response_harm = "hits" + var/cooldown = 0 + +/mob/living/simple_animal/hostile/factory/death(gibbed) + var/chosen_sound = pick('sound/creatures/guarddeath.ogg','sound/creatures/guarddeath2.ogg','sound/creatures/guarddeath3.ogg','sound/creatures/guarddeath4.ogg') + playsound(get_turf(src), chosen_sound, 100, TRUE, 0) + ..() + +/mob/living/simple_animal/hostile/factory/Aggro() + ..() + var/list/possible_sounds = list('sound/effects/radio1.ogg','sound/effects/radio2.ogg','sound/effects/radio3.ogg') + var/chosen_sound = pick(possible_sounds) + if (cooldown < world.time) // So we don't repeat the sound and the phrase every time we get hit and do it at least each 30 seconds + cooldown = world.time + 300 + summon_backup_nosound(10) + playsound(get_turf(src), chosen_sound, 100, 0, 0) + var/list/possible_phrases = list("Anomaly spotted! Send backup!","Intruder over here!","Hostile spotted, get them!") + var/chosen_phrase = pick(possible_phrases) + say(chosen_phrase) + else + return + +/mob/living/simple_animal/hostile/factory/ranged + icon_state = "nanotrasenranged" + icon_living = "nanotrasenranged" + ranged_cooldown_time = 15 + ranged = 1 + retreat_distance = 3 + minimum_distance = 5 + casingtype = /obj/item/ammo_casing/c45 + projectilesound = 'sound/weapons/gunshot.ogg' + loot = list(/obj/item/gun/ballistic/automatic/pistol/m1911, + /obj/effect/mob_spawn/human/corpse/nanotrasensoldier) + +/mob/living/simple_animal/hostile/factory/ranged/lmg + desc = "This one is carrying a bigger gun. Seek for cover." + icon_state = "nanotrasenrangedlmg" + icon_living = "nanotrasenrangedlmg" + projectilesound = 'sound/weapons/rifleshot.ogg' + sidestep_per_cycle = 0 + check_friendly_fire = 1 + minimum_distance = 6 + approaching_target = FALSE + rapid = 8 + rapid_fire_delay = 2 + casingtype = /obj/item/ammo_casing/mm712x82 + ranged_cooldown_time = 80 + vision_range = 12 + aggro_vision_range = 12 + retreat_distance = 1 + move_to_delay = 4 + speed = 12 + health = 150 + maxHealth = 150 + loot = list(/obj/item/gun/ballistic/automatic/l6_saw/unrestricted, + /obj/effect/mob_spawn/human/corpse/nanotrasensoldier) + +/mob/living/simple_animal/hostile/factory/ranged/shotgun + icon_state = "nanotrasenrangedshot" + icon_living = "nanotrasenrangedshot" + rapid = 2 + rapid_fire_delay = 5 + casingtype = /obj/item/ammo_casing/shotgun/buckshot + projectilesound = 'sound/weapons/shotgunshot.ogg' + ranged_cooldown_time = 25 + loot = list(/obj/item/gun/ballistic/shotgun/automatic/combat, + /obj/effect/mob_spawn/human/corpse/nanotrasensoldier) + +/mob/living/simple_animal/hostile/factory/ranged/smg + icon_state = "nanotrasenrangedsmg" + icon_living = "nanotrasenrangedsmg" + rapid = 3 + casingtype = /obj/item/ammo_casing/c46x30mm + projectilesound = 'sound/weapons/gunshot_smg.ogg' + loot = list(/obj/item/gun/ballistic/automatic/wt550, + /obj/effect/mob_spawn/human/corpse/nanotrasensoldier) + +/mob/living/simple_animal/hostile/syndicate/factory + gender = MALE + faction = list("nanotrasenprivate") + speak_chance = 5 + speak = list("Come get me!","You can't get away!","Die!") + +/mob/living/simple_animal/hostile/syndicate/factory/sniper + name = "The Warden" + desc = "One of the best snipers. Take cover or get shot" + icon_state = "fsniper" + icon_living = "fsniper" + ranged = TRUE + speed = 1 + dodge_prob = 40 + ranged_cooldown_time = 40 + check_friendly_fire = 1 + sidestep_per_cycle = 3 + minimum_distance = 4 + turns_per_move = 6 + melee_queue_distance = 2 + health = 250 + maxHealth = 250 + melee_damage = 20 + rapid_melee = 3 + attacktext = "hits" + attack_sound = 'sound/weapons/genhit3.ogg' + projectilesound = 'sound/weapons/sniper_shot.ogg' + speak_chance = 2 + var/cooldown = 0 + speak = list("You're pretty good.","You can't dodge everything!","Fall down already!") + loot = list(/obj/item/gun/ballistic/automatic/sniper_rifle, + /obj/effect/mob_spawn/human/corpse/sniper, + /obj/item/ammo_box/magazine/sniper_rounds, + /obj/item/ammo_box/magazine/sniper_rounds/penetrator, + /obj/item/ammo_box/magazine/sniper_rounds/soporific) + +/mob/living/simple_animal/hostile/syndicate/factory/sniper/Aggro() + ..() + ranged_cooldown = 30 + if (cooldown < world.time) + cooldown = world.time + 150 + summon_backup_nosound(10) + playsound(get_turf(src), 'sound/weapons/sniper_rack.ogg', 80, TRUE) + say("I've got you in my scope.") + +/mob/living/simple_animal/hostile/syndicate/factory/sniper/Shoot() + var/allowed_projectile_types = list(/obj/item/ammo_casing/p50, /obj/item/ammo_casing/p50/penetrator) + casingtype = pick(allowed_projectile_types) + ..() + +/mob/living/simple_animal/hostile/syndicate/factory/sniper/death(gibbed) + playsound(get_turf(src), 'sound/creatures/wardendeath.ogg', 100, TRUE, 0) + ..() + +/mob/living/simple_animal/hostile/psycho + name = "Psycho" + desc = "They're wearing a pretty uncomfortable jacket." + icon = 'icons/mob/simple_human.dmi' + icon_state = "psycho" + icon_living = "psycho" + attacktext = "bites" + mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID) + turns_per_move = 0 + del_on_death = TRUE + response_help = "pokes" + response_disarm = "touches" + response_harm = "hits" + speak_chance = 5 + attack_sound = 'sound/weapons/bite.ogg' + speak = list("I'm not mad!","What insanity?","Kill") + speed = -2 + maxHealth = 100 + health = 100 + 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) + unsuitable_atmos_damage = 5 + faction = list("psycho") + move_to_delay = 3 + rapid_melee = 2 + in_melee = TRUE + approaching_target = TRUE + environment_smash = ENVIRONMENT_SMASH_NONE + obj_damage = 5 + sidestep_per_cycle = 0 + stat_attack = UNCONSCIOUS + melee_damage = 15 + lose_patience_timeout = 350 + loot = list(/obj/effect/mob_spawn/human/corpse/psychost) + +/mob/living/simple_animal/hostile/psycho/regular + var/cooldown = 0 + var/static/list/idle_sounds + +/mob/living/simple_animal/hostile/psycho/regular/Initialize() + . = ..() + idle_sounds = list('sound/creatures/psycidle1.ogg','sound/creatures/psycidle2.ogg','sound/creatures/psycidle3.ogg') + +/mob/living/simple_animal/hostile/psycho/regular/Life() + ..() + if(Aggro() || stat) + return + if(prob(20)) + var/chosen_sound = pick(idle_sounds) + playsound(src, chosen_sound, 50, FALSE) + +/mob/living/simple_animal/hostile/psycho/regular/Aggro() + ..() + var/list/possible_sounds = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg') + var/chosen_sound = pick(possible_sounds) + if (cooldown < world.time) + cooldown = world.time + 300 + playsound(get_turf(src), chosen_sound, 70, TRUE, 0) + +/mob/living/simple_animal/hostile/psycho/regular/death(gibbed) + var/list/possible_sounds = list('sound/creatures/psycdeath1.ogg','sound/creatures/psycdeath2.ogg') + var/chosen_sound = pick(possible_sounds) + playsound(get_turf(src), chosen_sound, 70, TRUE, 0) + ..() + +/mob/living/simple_animal/hostile/psycho/fast + move_to_delay = 2 + speed = -5 + maxHealth = 70 + health = 70 + +/mob/living/simple_animal/hostile/psycho/muzzle + icon_state = "psychomuzzle" + icon_living = "psychomuzzle" + attacktext = "headbutts" + attack_sound = null + speak_chance = 0 + melee_damage = 9 + var/cooldown = 0 + var/static/list/idle_sounds + speed = 0 + loot = list(/obj/effect/mob_spawn/human/corpse/psychost/muzzle) + +/mob/living/simple_animal/hostile/psycho/muzzle/Initialize() + . = ..() + idle_sounds = list('sound/creatures/psychidle.ogg','sound/creatures/psychidle2.ogg') + +/mob/living/simple_animal/hostile/psycho/muzzle/death(gibbed) + var/list/possible_sounds = list('sound/creatures/psychdeath.ogg','sound/creatures/psychdeath2.ogg',) + var/chosen_sound = pick(possible_sounds) + playsound(get_turf(src), chosen_sound, 70, TRUE, 0) + ..() + +/mob/living/simple_animal/hostile/psycho/muzzle/Aggro() + ..() + var/list/possible_sounds = list('sound/creatures/psychsight.ogg','sound/creatures/psychsight2.ogg') + var/chosen_sound = pick(possible_sounds) + if (cooldown < world.time) + cooldown = world.time + 300 + playsound(get_turf(src), chosen_sound, 70, TRUE, 0) + +/mob/living/simple_animal/hostile/psycho/muzzle/AttackingTarget() + ..() + playsound(get_turf(src), 'sound/creatures/psychattack1.ogg', 70, TRUE, 0) + +/mob/living/simple_animal/hostile/psycho/muzzle/Life() + ..() + if(Aggro() || stat) + return + if(prob(20)) + var/chosen_sound = pick(idle_sounds) + playsound(src, chosen_sound, 50, TRUE) + +/mob/living/simple_animal/hostile/psycho/trap + desc = "This one has a strange device on his head." + icon_state = "psychotrap" + icon_living = "psychotrap" + speak_chance = 0 + speed = -3 + move_to_delay = 2 + melee_damage = 15 + attack_sound = null + attacktext = "headbutts" + loot = list(/obj/effect/mob_spawn/human/corpse/psychost/trap) + var/cooldown = 0 + var/static/list/idle_sounds + +/mob/living/simple_animal/hostile/psycho/trap/Aggro() + ..() + var/list/possible_sounds = list('sound/creatures/psychsight.ogg','sound/creatures/psychsight2.ogg') + var/chosen_sound = pick(possible_sounds) + if (cooldown < world.time) + cooldown = world.time + 300 + playsound(get_turf(src), chosen_sound, 70, TRUE, 0) + +/mob/living/simple_animal/hostile/psycho/trap/Initialize() + . = ..() + idle_sounds = list('sound/creatures/psychidle.ogg','sound/creatures/psychidle2.ogg') + +/mob/living/simple_animal/hostile/psycho/trap/Life() + ..() + if(Aggro() || stat) + return + if(prob(20)) + var/chosen_sound = pick(idle_sounds) + playsound(src, chosen_sound, 50, FALSE) + if(health < maxHealth) + playsound(src, 'sound/machines/beep.ogg', 80, FALSE) + addtimer(CALLBACK(src, .proc/death), 200) + +/mob/living/simple_animal/hostile/psycho/trap/AttackingTarget() + var/list/possible_sounds = list('sound/creatures/psychhead.ogg','sound/creatures/psychhead2.ogg') + var/chosen_sound = pick(possible_sounds) + playsound(get_turf(src), chosen_sound, 100, TRUE, 0) + ..() + +/mob/living/simple_animal/hostile/psycho/trap/death(gibbed) + var/list/possible_sounds = list('sound/creatures/psychdeath.ogg','sound/creatures/psychdeath2.ogg') + var/chosen_sound = pick(possible_sounds) + playsound(get_turf(src), chosen_sound, 70, 0, 0) + playsound(get_turf(src), 'sound/effects/snap.ogg', 75, TRUE, 0) + playsound(get_turf(src), 'sound/effects/splat.ogg', 90, TRUE, 0) + visible_message("The device activates!") + ..() + +/mob/living/simple_animal/hostile/syndicate/factory/heavy + name = "Heavy gunner" + desc = "They didn't get that backpack for nothing." + icon_state = "Heavy" + icon_living = "Heavy" + sidestep_per_cycle = 0 + minimum_distance = 5 + approaching_target = TRUE + ranged = TRUE + rapid = 65 + rapid_fire_delay = 0.5 + projectiletype = /obj/item/projectile/beam + ranged_cooldown_time = 110 + vision_range = 9 + speak_chance = 0 + speak = null + aggro_vision_range = 9 + attacktext = "hits" + attack_sound = 'sound/weapons/genhit3.ogg' + retreat_distance = 2 + melee_queue_distance = 1 + melee_damage = 25 + move_to_delay = 4 + projectilesound = null + speed = 15 + health = 300 + maxHealth = 300 + loot = list(/obj/effect/mob_spawn/human/corpse/heavy) + var/cooldown = 0 + +/mob/living/simple_animal/hostile/syndicate/factory/heavy/Initialize() + ..() + +/mob/living/simple_animal/hostile/syndicate/factory/heavy/Aggro() + ..() + if (cooldown < world.time) + cooldown = world.time + 300 + playsound(get_turf(src), 'sound/creatures/heavysight1.ogg', 80, 0, 0) + +/mob/living/simple_animal/hostile/syndicate/factory/heavy/OpenFire(atom/A) + playsound(get_turf(src), 'sound/weapons/heavyminigunstart.ogg', 80, 0, 0) + move_to_delay = 6//slowdown when shoot + speed = 30 + sleep(15) + playsound(get_turf(src), 'sound/weapons/heavyminigunshoot.ogg', 90, 0, 0) + if(CheckFriendlyFire(A)) + return + if(!(simple_mob_flags & SILENCE_RANGED_MESSAGE)) + visible_message("[src] [ranged_message] at [A]!") + if(rapid > 1) + var/datum/callback/cb = CALLBACK(src, .proc/Shoot, A) + for(var/i in 1 to rapid) + addtimer(cb, (i - 1)*rapid_fire_delay) + else + Shoot(A) + ranged_cooldown = world.time + ranged_cooldown_time + playsound(get_turf(src), 'sound/weapons/heavyminigunstop.ogg', 80, 0, 0) + move_to_delay = initial(move_to_delay)//restore speed + speed = initial(speed) + +/mob/living/simple_animal/hostile/syndicate/factory/heavy/death(gibbed) + playsound(get_turf(src), 'sound/creatures/heavydeath1.ogg', 80, TRUE, 0) + ..() + +/obj/item/clothing/mask/gas/sechailer/swat/emagged + safety = FALSE + +/mob/living/simple_animal/hostile/zombie_suicide + name = "agressive corpse" + desc = "This corpse is holding a grenade without a pin in it..." + icon = 'icons/mob/simple_human.dmi' + icon_state = "suicidezombie" + icon_living = "suicidezombie" + mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID) + 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 + status_flags = CANPUSH + health = 100 + maxHealth = 100 + move_to_delay = 2 + speed = 0 + melee_damage = null + attack_sound = null + del_on_death = TRUE + stat_attack = UNCONSCIOUS + a_intent = INTENT_HARM + var/det_time = 30 + var/active = 0 + var/cooldown = 0 + loot = list(/obj/effect/mob_spawn/human/corpse/suicidezombie, /obj/item/grenade/syndieminibomb/concussion/frag/activated) + do_footstep = TRUE + hardattacks = TRUE + +/mob/living/simple_animal/hostile/zombie_suicide/Aggro() + ..() + var/list/possible_sounds = list('sound/creatures/szombiesight.ogg','sound/creatures/szombiesight2.ogg') + var/chosen_sound = pick(possible_sounds) + if (cooldown < world.time) + cooldown = world.time + 300 + playsound(get_turf(src), chosen_sound, 50, TRUE, 0) + +/mob/living/simple_animal/hostile/zombie_suicide/AttackingTarget() + if(!active) + active = TRUE + playsound(src, 'sound/weapons/armbomb.ogg', 100, TRUE) + var/list/possible_sounds = list('sound/creatures/szombiesight.ogg','sound/creatures/szombiesight2.ogg') + var/chosen_sound = pick(possible_sounds) + playsound(get_turf(src), chosen_sound, 50, TRUE, 0) + visible_message("[src] primes the grenade!.") + addtimer(CALLBACK(src, .proc/prime), det_time) + +/mob/living/simple_animal/hostile/zombie_suicide/proc/prime() + explosion(src,0, 2, 3, flame_range = 3) + new /obj/effect/gibspawner/generic(get_turf(src), src) + qdel(src) + +/mob/living/simple_animal/hostile/zombie_suicide/death(gibbed) + playsound(src, 'sound/creatures/szombiedeath.ogg', 60, TRUE) + ..() + +/obj/item/grenade/syndieminibomb/concussion/frag/activated + det_time = 30 + +/obj/item/grenade/syndieminibomb/concussion/frag/activated/Initialize() + ..() + preprime() + +/mob/living/simple_animal/hostile/syndicate/factory/boss + name = "The Director" + desc = "This thing looks more like a machine than human." + maxHealth = 500 + health = 500 + icon_state = "facboss" + icon_living = "facboss" + see_in_dark = 13 + vision_range = 12 + aggro_vision_range = 12 + search_objects = 1 + minbodytemp = 0 + speak = null + dodging = FALSE + mob_biotypes = list(MOB_ROBOTIC) + obj_damage = 100 + move_force = MOVE_FORCE_EXTREMELY_STRONG + move_resist = MOVE_FORCE_EXTREMELY_STRONG + pull_force = MOVE_FORCE_EXTREMELY_STRONG + hardattacks = TRUE + melee_damage = 50 + speed = 5 + move_to_delay = 3 + ranged = TRUE + hud_possible = list(ANTAG_HUD) + approaching_target = TRUE + ranged_ignores_vision = TRUE + environment_smash = ENVIRONMENT_SMASH_RWALLS + ranged_cooldown_time = 30 + check_friendly_fire = 1 + turns_per_move = 2 + spacewalk = TRUE + rapid_melee = 0 + lose_patience_timeout = 400 + 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 + attack_sound = 'sound/weapons/sonic_jackhammer.ogg' + projectilesound = 'sound/weapons/shotgunshot.ogg' + var/cooldown = 0 + loot = list(/obj/item/gun/ballistic/shotgun/lever_action, + /obj/effect/mob_spawn/human/corpse/facboss) + +/mob/living/simple_animal/hostile/syndicate/factory/boss/Shoot() + var/static/list/allowed_projectile_types = list(/obj/item/ammo_casing/shotgun/beanbag, + /obj/item/ammo_casing/shotgun, /obj/item/ammo_casing/shotgun/incendiary, + /obj/item/ammo_casing/shotgun/dragonsbreath, + /obj/item/ammo_casing/shotgun/meteorslug, + /obj/item/ammo_casing/shotgun/pulseslug, + /obj/item/ammo_casing/shotgun/frag12, + /obj/item/ammo_casing/shotgun/buckshot, + /obj/item/ammo_casing/shotgun/rubbershot, + /obj/item/ammo_casing/shotgun/incapacitate, + /obj/item/ammo_casing/shotgun/improvised, + /obj/item/ammo_casing/shotgun/ion, + /obj/item/ammo_casing/shotgun/laserslug, + /obj/item/ammo_casing/shotgun/breacher) + casingtype = pick(allowed_projectile_types) + ..() + sleep(5) + playsound(get_turf(src), 'sound/weapons/shotgunpump.ogg', 50, 0, 0) + +/mob/living/simple_animal/hostile/syndicate/factory/boss/Aggro() + ..() + var/list/possible_sounds = list('sound/voice/ed209_20sec.ogg','sound/creatures/bosssight.ogg','sound/creatures/bosssight2.ogg','sound/voice/complionator/harry.ogg','sound/weapons/leveractionrack.ogg') + var/chosen_sound = pick(possible_sounds) + if (cooldown < world.time) + cooldown = world.time + 300 + playsound(get_turf(src), chosen_sound, 80, TRUE, 0) + say("Target!") + +/mob/living/simple_animal/hostile/syndicate/factory/boss/Life() + ..() + if(health <= 300) + icon_state = "facboss2" + icon_living = "facboss2" + ranged_cooldown_time = 20//less health - faster shooting + return + if(health <= 150) + if(prob(5) && Aggro())//change to insult the target on low health + playsound(get_turf(src), 'sound/voice/beepsky/insult.ogg', 100, 0, 0) + visible_message("FUCK YOUR CUNT YOU SHIT EATING COCKSTORM AND EAT A DONG FUCKING ASS RAMMING SHIT FUCK EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS OF FUCK AND POO AND SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FUCK ASS WANKER FROM THE DEPTHS OF SHIT.") + icon_state = "facboss3" + icon_living = "facboss3" + ranged_cooldown_time = 10//even faster + +/mob/living/simple_animal/hostile/syndicate/factory/boss/updatehealth() + ..() + if(health <= 300) + var/list/possible_sounds = list('sound/creatures/bosspain.ogg','sound/creatures/bosspain2.ogg') + var/chosen_sound = pick(possible_sounds) + playsound(get_turf(src), chosen_sound, 60, TRUE, 0) + +/mob/living/simple_animal/hostile/syndicate/factory/boss/death(gibbed) + playsound(get_turf(src), 'sound/voice/borg_deathsound.ogg', 80, TRUE, 0) + visible_message("\the [src] activates its self-destruct system!.") + speed = 15 + move_to_delay = 20 + ranged_cooldown = 300 + ranged_cooldown_time = 300 + INVOKE_ASYNC(src, .proc/explosion, src.loc, 0, 3, 4, null, null, FALSE, 2) + ..() + +//GUNS// + +/obj/item/gun/ballistic/shotgun/lever_action + name = "lever action shotgun" + desc = "A really old shotgun with five shell capacity. This one can fit in a backpack." + w_class = WEIGHT_CLASS_NORMAL + dual_wield_spread = 0 + fire_sound_volume = 60 //tried on 90 my eardrums said goodbye + item_state = "leveraction" + icon_state = "leveraction" + rack_sound = "sound/weapons/leveractionrack.ogg" + fire_sound = "sound/weapons/leveractionshot.ogg" + vary_fire_sound = FALSE + rack_sound_vary = FALSE + recoil = 1 + mag_type = /obj/item/ammo_box/magazine/internal/shot/lever + pb_knockback = 5 + +/obj/item/gun/ballistic/shotgun/lever_action/examine(mob/user) + . = ..() + . += "You will instantly reload it after a shot if you have another hand free." + +/obj/item/gun/ballistic/shotgun/lever_action/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1) + ..() + if(user.get_inactive_held_item()) + return + else + rack() + +/obj/item/gun/ballistic/shotgun/lever_action/rack(mob/user = null) + if (user) + to_chat(user, "You rack the [bolt_wording] of \the [src].") + process_chamber(!chambered, FALSE) + playsound(src, rack_sound, rack_sound_volume, rack_sound_vary) + update_icon() + if(user.get_inactive_held_item() && prob(50) && chambered) + user.visible_message("With a single move of [user.p_their()] arm, [user] flips \the [src] and loads the chamber with a shell.") + +/obj/item/gun/ballistic/automatic/pistol/deagle/sound + desc = "A robust .50 AE handgun. This one looks even more robust." + rack_sound = "sound/weapons/deaglerack.ogg" + bolt_drop_sound = "sound/weapons/deagleslidedrop.ogg" + lock_back_sound = "sound/weapons/deaglelock.ogg" + lock_back_sound_vary = FALSE + rack_sound_vary = FALSE + load_sound_vary = FALSE + eject_sound_vary = FALSE + fire_sound = "sound/weapons/deagleshot.ogg" + vary_fire_sound = TRUE + fire_rate = 5 + force = 18 + +//MISC// + +/obj/effect/trap/nexus/trickyspawner/clowns + mobs = 5 + spawned = /mob/living/simple_animal/hostile/retaliate/clown diff --git a/code/modules/awaymissions/mission_code/centcomAway.dm b/code/modules/awaymissions/mission_code/centcomAway.dm index 897315a3c6cc6..b785431bad1a3 100644 --- a/code/modules/awaymissions/mission_code/centcomAway.dm +++ b/code/modules/awaymissions/mission_code/centcomAway.dm @@ -7,32 +7,32 @@ /area/awaymission/centcomAway/general name = "XCC-P5831" - ambient_effects = list('sound/ambience/ambigen3.ogg') + ambientsounds = list('sound/ambience/ambigen3.ogg') /area/awaymission/centcomAway/maint name = "XCC-P5831 Maintenance" icon_state = "away1" - ambient_effects = list('sound/ambience/ambisin1.ogg') + ambientsounds = list('sound/ambience/ambisin1.ogg') /area/awaymission/centcomAway/thunderdome name = "XCC-P5831 Thunderdome" icon_state = "away2" - ambient_effects = list('sound/ambience/ambisin2.ogg') + ambientsounds = list('sound/ambience/ambisin2.ogg') /area/awaymission/centcomAway/cafe name = "XCC-P5831 Kitchen Arena" icon_state = "away3" - ambient_effects = list('sound/ambience/ambisin3.ogg') + ambientsounds = list('sound/ambience/ambisin3.ogg') /area/awaymission/centcomAway/courtroom name = "XCC-P5831 Courtroom" icon_state = "away4" - ambient_effects = list('sound/ambience/ambisin4.ogg') + ambientsounds = list('sound/ambience/ambisin4.ogg') /area/awaymission/centcomAway/hangar name = "XCC-P5831 Hangars" icon_state = "away4" - ambient_effects = list('sound/ambience/ambigen5.ogg') + ambientsounds = list('sound/ambience/ambigen5.ogg') //centcomAway items @@ -60,4 +60,4 @@ teams never did figure out what happened that last time... and I can't wrap my head \ around it myself. Why would a shuttle full of evacuees all snap and beat each other \ to death the moment they reached safety?
\ - - D. Cereza" + - D. Cereza" \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/moonoutpost19.dm b/code/modules/awaymissions/mission_code/moonoutpost19.dm index d45d177e25a26..0feb096910a4e 100644 --- a/code/modules/awaymissions/mission_code/moonoutpost19.dm +++ b/code/modules/awaymissions/mission_code/moonoutpost19.dm @@ -24,7 +24,7 @@ power_equip = FALSE power_light = FALSE poweralm = FALSE - ambient_effects = list('sound/ambience/ambimine.ogg') + ambientsounds = list('sound/ambience/ambimine.ogg') icon_state = "awaycontent5" /area/awaymission/moonoutpost19/hive diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 5c7f4b26bf4ac..cfdd9fa082cb3 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -135,30 +135,18 @@ /area/shuttle/snowdin/elevator2 name = "Mining Elevator" -//shuttle console for elevators// - -/obj/machinery/computer/shuttle/snowdin/mining - name = "shuttle console" - desc = "A shuttle control computer." - icon_screen = "shuttle" - icon_keyboard = "tech_key" - light_color = LIGHT_COLOR_CYAN - shuttleId = "snowdin_mining" - possible_destinations = "snowdin_mining_top;snowdin_mining_down" - - //liquid plasma!!!!!!// /turf/open/floor/plasteel/dark/snowdin initial_gas_mix = FROZEN_ATMOS planetary_atmos = 1 - temperature = 180 + initial_temperature = 180 /turf/open/lava/plasma name = "liquid plasma" desc = "A flowing stream of chilled liquid plasma. You probably shouldn't get in." icon_state = "liquidplasma" - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120" + initial_gas_mix = "n2=82;plasma=24;TEMP=120" baseturfs = /turf/open/lava/plasma slowdown = 2 @@ -219,7 +207,7 @@ var/list/robo_parts = list()//keep a reference of robotic parts so we know if we can turn them into a plasmaman var/mob/living/carbon/human/PP = L var/S = PP.dna.species - if(istype(S, /datum/species/plasmaman) || istype(S, /datum/species/android) || istype(S, /datum/species/synth)) //ignore plasmamen/robotic species + if(istype(S, /datum/species/plasmaman) || istype(S, /datum/species/android)) //ignore plasmamen/robotic species continue for(var/BP in PP.bodyparts) @@ -516,11 +504,11 @@ /obj/effect/spawner/lootdrop/snowdin/dungeonheavy name = "dungeon heavy" - loot = list(/obj/item/twohanded/singularityhammer = 25, - /obj/item/twohanded/mjollnir = 10, - /obj/item/twohanded/fireaxe = 25, + loot = list(/obj/item/singularityhammer = 25, + /obj/item/mjollnir = 10, + /obj/item/fireaxe = 25, /obj/item/organ/brain/alien = 17, - /obj/item/twohanded/dualsaber = 15, + /obj/item/dualsaber = 15, /obj/item/organ/heart/demon = 7, /obj/item/gun/ballistic/automatic/c20r/unrestricted = 16, /obj/item/gun/magic/wand/resurrection/inert = 15, @@ -541,7 +529,7 @@ loot = list(/obj/item/stack/sheet/mineral/snow{amount = 25} = 10, /obj/item/toy/snowball = 15, /obj/item/shovel = 10, - /obj/item/twohanded/spear = 8, + /obj/item/spear = 8, ) //special items//-- @@ -555,7 +543,7 @@ /obj/item/clothing/under/syndicate/coldres name = "insulated tactical turtleneck" desc = "A nondescript and slightly suspicious-looking turtleneck with digital camouflage cargo pants. The interior has been padded with special insulation for both warmth and protection." - armor = list("melee" = 20, "bullet" = 10, "laser" = 0,"energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 25, "acid" = 25) + armor = list("melee" = 20, "bullet" = 10, "laser" = 0,"energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 25, "acid" = 25, "stamina" = 30) cold_protection = CHEST|GROIN|ARMS|LEGS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT diff --git a/code/modules/awaymissions/mission_code/spacebattle.dm b/code/modules/awaymissions/mission_code/spacebattle.dm index a477a223b2dc0..11d99108a5fc2 100644 --- a/code/modules/awaymissions/mission_code/spacebattle.dm +++ b/code/modules/awaymissions/mission_code/spacebattle.dm @@ -6,7 +6,7 @@ requires_power = FALSE /area/awaymission/spacebattle/cruiser - name = "Nanotrasen Cruiser" + name = "\improper Nanotrasen Cruiser" icon_state = "awaycontent2" /area/awaymission/spacebattle/syndicate1 diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm index 0adef7f0b4b08..19c1bad75b764 100644 --- a/code/modules/awaymissions/mission_code/stationCollision.dm +++ b/code/modules/awaymissions/mission_code/stationCollision.dm @@ -112,7 +112,7 @@ GLOBAL_VAR_INIT(sc_safecode5, "[rand(0,9)]") info = {"Target: Research-station Epsilon
Objective: Prototype weaponry. The captain likely keeps them locked in her safe.

- Our on-board spy has learned the code and has hidden away a few copies of the code around the station. Unfortunatly he has been captured by security + Our on-board spy has learned the code and has hidden away a few copies of the code around the station. Unfortunately he has been captured by security Your objective is to split up, locate any of the papers containing the captain's safe code, open the safe and secure anything found inside. If possible, recover the imprisioned syndicate operative and receive the code from him.

@@ -148,9 +148,9 @@ GLOBAL_VAR_INIT(sc_safecode5, "[rand(0,9)]") /obj/singularity/narsie/mini/admin_investigate_setup() return -/obj/singularity/narsie/mini/process() +/obj/singularity/narsie/mini/process(delta_time) eat() - if(prob(25)) + if(DT_PROB(13, delta_time)) mezzer() /obj/singularity/narsie/mini/ex_act() diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 8f216506eacec..7a42a05c04f46 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -105,7 +105,7 @@ if("Immortality") 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 body to match the darkness in your heart.") - user.verbs += /mob/living/carbon/proc/immortality + user.add_verb(/mob/living/carbon/proc/immortality) user.set_species(/datum/species/shadow) if("Peace") to_chat(user, "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence.") diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 79f61f352bb14..47f783cbb3828 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -12,7 +12,7 @@ GLOBAL_LIST_INIT(potentialRandomZlevels, generateMapList(filename = "[global.con to_chat(world, "Away mission loaded.") /proc/reset_gateway_spawns(reset = FALSE) - for(var/obj/machinery/gateway/G in world) + for(var/obj/machinery/gateway/G in GLOB.machines) if(reset) G.randomspawns = GLOB.awaydestinations else diff --git a/code/modules/badges/badges.dm b/code/modules/badges/badges.dm new file mode 100644 index 0000000000000..b708ded074943 --- /dev/null +++ b/code/modules/badges/badges.dm @@ -0,0 +1,89 @@ +/* + +Loads all badges from the badge.json file. +Format should be +rank|icon +Where: +Rank - The name of the admin rank +Icon - The name of the icon state in the badges.dmi file + +Special ranks: +- Donator: Matches clients in the donator list +- Mentor: Matches clients in the mentor list + +*/ + +//Global list of badges +GLOBAL_LIST_EMPTY(badge_data) + +/client + var/list/cached_badges = null + +//Loads the badge ranks +/proc/load_badge_ranks() + //No badges + if(!CONFIG_GET(flag/badges)) + return + //Load and parse data + GLOB.badge_data = json_decode(rustg_file_read("[global.config.directory]/badges.json")) + //Associate badges with admin ranks + for(var/datum/admin_rank/rank as() in GLOB.admin_ranks) + rank.badge_icon = GLOB.badge_data[rank.name] + //Yay + log_game("[LAZYLEN(GLOB.badge_data)] badges loaded successfully.") + //Reset everyones badges so they get reloaded. + for(var/client/C as() in GLOB.clients) + C.reset_badges() + +//Gets the badges attached to a client. +/client/proc/get_badges() + //No badges + if(!CONFIG_GET(flag/badges)) + return + //Send cached badges + if(islist(cached_badges)) + return cached_badges + var/list/badges = list() + //Add the holder rank + if(holder) + //No badges when deadminned / fakeminned + if(holder.deadmined || holder.fakekey) + cached_badges = list() + return list() + //Admin badge otherwise + if(holder?.rank?.badge_icon) + badges += holder.rank.badge_icon + //Add the mentor rank + else + if(mentor_datum && GLOB.badge_data["Mentor"]) + badges += GLOB.badge_data["Mentor"] + //Add the donator rank + if(IS_PATRON(ckey) && GLOB.badge_data["Donator"]) + badges += GLOB.badge_data["Donator"] + cached_badges = badges + return badges + +/client/proc/reset_badges() + cached_badges = null + +/proc/badge_parse(badges) + if(!LAZYLEN(badges)) + return "" + + var/output = "" + var/first_badge = TRUE + + if(!CONFIG_GET(flag/badges)) + return "" + + for(var/badge in badges) + var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/chat) + var/tag = sheet.icon_tag("badge-badge_[badge]") + if(tag) + if(first_badge) + output = "[output][tag]" + first_badge = FALSE + else + output = "[output] [tag]" + + return "[output] " diff --git a/code/modules/buildmode/buildmode.dm b/code/modules/buildmode/buildmode.dm index b232bd212c643..e8490837c3d31 100644 --- a/code/modules/buildmode/buildmode.dm +++ b/code/modules/buildmode/buildmode.dm @@ -17,10 +17,10 @@ var/switch_state = BM_SWITCHSTATE_NONE var/switch_width = 5 // modeswitch UI - var/obj/screen/buildmode/mode/modebutton + var/atom/movable/screen/buildmode/mode/modebutton var/list/modeswitch_buttons = list() // dirswitch UI - var/obj/screen/buildmode/bdir/dirbutton + var/atom/movable/screen/buildmode/bdir/dirbutton var/list/dirswitch_buttons = list() /datum/buildmode/New(client/c) @@ -34,7 +34,7 @@ holder.screen += buttons holder.click_intercept = src mode.enter_mode(src) - + /datum/buildmode/proc/quit() mode.exit_mode(src) holder.screen -= buttons @@ -45,8 +45,10 @@ /datum/buildmode/Destroy() close_switchstates() holder.player_details.post_login_callbacks -= li_cb + li_cb = null holder = null QDEL_NULL(mode) + QDEL_LIST(buttons) QDEL_LIST(modeswitch_buttons) QDEL_LIST(dirswitch_buttons) return ..() @@ -63,16 +65,16 @@ /datum/buildmode/proc/create_buttons() // keep a reference so we can update it upon mode switch - modebutton = new /obj/screen/buildmode/mode(src) + modebutton = new /atom/movable/screen/buildmode/mode(src) buttons += modebutton - buttons += new /obj/screen/buildmode/help(src) + buttons += new /atom/movable/screen/buildmode/help(src) // keep a reference so we can update it upon dir switch - dirbutton = new /obj/screen/buildmode/bdir(src) + dirbutton = new /atom/movable/screen/buildmode/bdir(src) buttons += dirbutton - buttons += new /obj/screen/buildmode/quit(src) + buttons += new /atom/movable/screen/buildmode/quit(src) // build the lists of switching buttons - build_options_grid(subtypesof(/datum/buildmode_mode), modeswitch_buttons, /obj/screen/buildmode/modeswitch) - build_options_grid(list(SOUTH,EAST,WEST,NORTH,NORTHWEST), dirswitch_buttons, /obj/screen/buildmode/dirswitch) + build_options_grid(subtypesof(/datum/buildmode_mode), modeswitch_buttons, /atom/movable/screen/buildmode/modeswitch) + build_options_grid(list(SOUTH,EAST,WEST,NORTH,NORTHWEST), dirswitch_buttons, /atom/movable/screen/buildmode/dirswitch) // this creates a nice offset grid for choosing between buildmode options, // because going "click click click ah hell" sucks. @@ -81,7 +83,7 @@ for(var/thing in elements) var/x = pos_idx % switch_width var/y = FLOOR(pos_idx / switch_width, 1) - var/obj/screen/buildmode/B = new buttontype(src, thing) + var/atom/movable/screen/buildmode/B = new buttontype(src, thing) // extra .5 for a nice offset look B.screen_loc = "NORTH-[(1 + 0.5 + y*1.5)],WEST+[0.5 + x*1.5]" buttonslist += B @@ -100,7 +102,7 @@ else close_switchstates() open_modeswitch() - + /datum/buildmode/proc/open_modeswitch() switch_state = BM_SWITCHSTATE_MODE holder.screen += modeswitch_buttons @@ -115,7 +117,7 @@ else close_switchstates() open_dirswitch() - + /datum/buildmode/proc/open_dirswitch() switch_state = BM_SWITCHSTATE_DIR holder.screen += dirswitch_buttons @@ -155,7 +157,7 @@ new /datum/buildmode(M.client) message_admins("[key_name_admin(usr)] has entered build mode.") log_admin("[key_name(usr)] has entered build mode.") - + #undef BM_SWITCHSTATE_NONE #undef BM_SWITCHSTATE_MODE -#undef BM_SWITCHSTATE_DIR \ No newline at end of file +#undef BM_SWITCHSTATE_DIR diff --git a/code/modules/buildmode/buttons.dm b/code/modules/buildmode/buttons.dm index e72dbde064382..e2bfec25bc5e4 100644 --- a/code/modules/buildmode/buttons.dm +++ b/code/modules/buildmode/buttons.dm @@ -1,23 +1,23 @@ -/obj/screen/buildmode +/atom/movable/screen/buildmode icon = 'icons/misc/buildmode.dmi' var/datum/buildmode/bd // If we don't do this, we get occluded by item action buttons layer = ABOVE_HUD_LAYER -/obj/screen/buildmode/New(bld) +/atom/movable/screen/buildmode/New(bld) bd = bld return ..() -/obj/screen/buildmode/Destroy() +/atom/movable/screen/buildmode/Destroy() bd = null return ..() -/obj/screen/buildmode/mode +/atom/movable/screen/buildmode/mode name = "Toggle Mode" icon_state = "buildmode_basic" screen_loc = "NORTH,WEST" -/obj/screen/buildmode/mode/Click(location, control, params) +/atom/movable/screen/buildmode/mode/Click(location, control, params) var/list/pa = params2list(params) if(pa.Find("left")) @@ -27,64 +27,64 @@ update_icon() return 1 -/obj/screen/buildmode/mode/update_icon() +/atom/movable/screen/buildmode/mode/update_icon() icon_state = bd.mode.get_button_iconstate() -/obj/screen/buildmode/help +/atom/movable/screen/buildmode/help icon_state = "buildhelp" screen_loc = "NORTH,WEST+1" name = "Buildmode Help" -/obj/screen/buildmode/help/Click(location, control, params) +/atom/movable/screen/buildmode/help/Click(location, control, params) bd.mode.show_help(usr.client) return 1 -/obj/screen/buildmode/bdir +/atom/movable/screen/buildmode/bdir icon_state = "build" screen_loc = "NORTH,WEST+2" name = "Change Dir" -/obj/screen/buildmode/bdir/update_icon() +/atom/movable/screen/buildmode/bdir/update_icon() dir = bd.build_dir return -/obj/screen/buildmode/bdir/Click() +/atom/movable/screen/buildmode/bdir/Click() bd.toggle_dirswitch() update_icon() return 1 // used to switch between modes -/obj/screen/buildmode/modeswitch +/atom/movable/screen/buildmode/modeswitch var/datum/buildmode_mode/modetype -/obj/screen/buildmode/modeswitch/New(bld, mt) +/atom/movable/screen/buildmode/modeswitch/New(bld, mt) modetype = mt icon_state = "buildmode_[initial(modetype.key)]" name = initial(modetype.key) return ..(bld) -/obj/screen/buildmode/modeswitch/Click() +/atom/movable/screen/buildmode/modeswitch/Click() bd.change_mode(modetype) return 1 // used to switch between dirs -/obj/screen/buildmode/dirswitch +/atom/movable/screen/buildmode/dirswitch icon_state = "build" -/obj/screen/buildmode/dirswitch/New(bld, dir) +/atom/movable/screen/buildmode/dirswitch/New(bld, dir) src.dir = dir name = dir2text(dir) return ..(bld) -/obj/screen/buildmode/dirswitch/Click() +/atom/movable/screen/buildmode/dirswitch/Click() bd.change_dir(dir) return 1 -/obj/screen/buildmode/quit +/atom/movable/screen/buildmode/quit icon_state = "buildquit" screen_loc = "NORTH,WEST+3" name = "Quit Buildmode" -/obj/screen/buildmode/quit/Click() +/atom/movable/screen/buildmode/quit/Click() bd.quit() - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/buildmode/submodes/delete.dm b/code/modules/buildmode/submodes/delete.dm new file mode 100644 index 0000000000000..cbd93851577b6 --- /dev/null +++ b/code/modules/buildmode/submodes/delete.dm @@ -0,0 +1,63 @@ +/datum/buildmode_mode/delete + key = "delete" + +/datum/buildmode_mode/delete/show_help(client/c) + to_chat(c, "***********************************************************\n\ + Left Mouse Button on anything to delete it. If you break it, you buy it.\n\ + Right Mouse Button on anything to delete everything of the type. Probably don\'t do this unless you know what you are doing.\n\ + ***********************************************************") + +/datum/buildmode_mode/delete/handle_click(client/c, params, object) + var/list/pa = params2list(params) + var/left_click = pa.Find("left") + var/right_click = pa.Find("right") + + if(left_click) + if(isturf(object)) + var/turf/T = object + T.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) + else if(isatom(object)) + qdel(object) + + if(right_click) + if(!check_rights(R_DEBUG|R_SERVER)) //Prevents buildmoded non-admins from breaking everything. + return + if(isturf(object)) + return + var/atom/deleting = object + var/action_type = alert(usr,"Strict type ([deleting.type]) or type and all subtypes?","Strict type","Type and subtypes","Cancel") + if(action_type == "Cancel" || !action_type) + return + + if(alert(usr,"Are you really sure you want to delete all instances of type [deleting.type]?","Yes","No") != "Yes") + return + + if(alert(usr,"Second confirmation required. Delete?","Yes","No") != "Yes") + return + + var/O_type = deleting.type + switch(action_type) + if("Strict type") + var/i = 0 + for(var/atom/Obj in world) + if(Obj.type == O_type) + i++ + qdel(Obj) + CHECK_TICK + if(!i) + to_chat(usr, "No instances of this type exist") + return + log_admin("[key_name(usr)] deleted all instances of type [O_type] ([i] instances deleted) ") + message_admins("[key_name(usr)] deleted all instances of type [O_type] ([i] instances deleted)") + if("Type and subtypes") + var/i = 0 + for(var/Obj in world) + if(istype(Obj,O_type)) + i++ + qdel(Obj) + CHECK_TICK + if(!i) + to_chat(usr, "No instances of this type exist") + return + log_admin("[key_name(usr)] deleted all instances of type or subtype of [O_type] ([i] instances deleted) ") + message_admins("[key_name(usr)] deleted all instances of type or subtype of [O_type] ([i] instances deleted) ") diff --git a/code/modules/buildmode/submodes/outfit.dm b/code/modules/buildmode/submodes/outfit.dm new file mode 100644 index 0000000000000..5d57582680ccd --- /dev/null +++ b/code/modules/buildmode/submodes/outfit.dm @@ -0,0 +1,45 @@ +/datum/buildmode_mode/outfit + key = "outfit" + var/datum/outfit/dressuptime + +/datum/buildmode_mode/outfit/Destroy() + dressuptime = null + return ..() + +/datum/buildmode_mode/outfit/show_help(client/c) + to_chat(c, "***********************************************************\n\ + Right Mouse Button on buildmode button = Select outfit to equip.\n\ + Left Mouse Button on mob/living/carbon/human = Equip the selected outfit.\n\ + Right Mouse Button on mob/living/carbon/human = Strip and delete current outfit.\n\ + ***********************************************************") + +/datum/buildmode_mode/outfit/Reset() + . = ..() + dressuptime = null + +/datum/buildmode_mode/outfit/change_settings(client/c) + dressuptime = c.robust_dress_shop() + +/datum/buildmode_mode/outfit/handle_click(client/c, params, object) + var/list/pa = params2list(params) + var/left_click = pa.Find("left") + var/right_click = pa.Find("right") + + + if(!ishuman(object)) + return + var/mob/living/carbon/human/dollie = object + + if(left_click) + if(isnull(dressuptime)) + to_chat(c, ("Pick an outfit first.")) + return + + for (var/item in dollie.get_equipped_items(TRUE)) + qdel(item) + if(dressuptime != "Naked") + dollie.equipOutfit(dressuptime) + + if(right_click) + for (var/item in dollie.get_equipped_items(TRUE)) + qdel(item) diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm index e0c423a164073..9263cea75f81e 100644 --- a/code/modules/cargo/bounties/assistant.dm +++ b/code/modules/cargo/bounties/assistant.dm @@ -35,7 +35,7 @@ description = "CentCom's security forces are going through budget cuts. You will be paid if you ship a set of spears." reward = 2000 required_count = 5 - wanted_types = list(/obj/item/twohanded/spear) + wanted_types = list(/obj/item/spear) /datum/bounty/item/assistant/toolbox name = "Toolboxes" @@ -124,13 +124,6 @@ required_count = 5 wanted_types = list(/obj/structure/chair/comfy) -/datum/bounty/item/assistant/geranium - name = "Geraniums" - description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you." - reward = 4000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium) - /datum/bounty/item/assistant/poppy name = "Poppies" description = "Commander Zot really wants to sweep Security Officer Olivia off her feet. Send a shipment of Poppies - her favorite flower - and he'll happily reward you." @@ -150,7 +143,7 @@ description = "Central Command is looking to commission a new BirdBoat-class station. You've been ordered to supply the potted plants." reward = 2000 required_count = 8 - wanted_types = list(/obj/item/twohanded/required/kirbyplants) + wanted_types = list(/obj/item/kirbyplants) /datum/bounty/item/assistant/earmuffs name = "Earmuffs" @@ -176,7 +169,7 @@ name = "Chainsaw" description = "The chef at CentCom is having trouble butchering her animals. She requests one chainsaw, please." reward = 2500 - wanted_types = list(/obj/item/twohanded/required/chainsaw) + wanted_types = list(/obj/item/chainsaw) /datum/bounty/item/assistant/ied name = "IED" diff --git a/code/modules/cargo/bounties/botany.dm b/code/modules/cargo/bounties/botany.dm index 76e4bcf252f6a..294278405625f 100644 --- a/code/modules/cargo/bounties/botany.dm +++ b/code/modules/cargo/bounties/botany.dm @@ -3,12 +3,15 @@ var/datum/bounty/item/botany/multiplier = 0 //adds bonus reward money; increased for higher tier or rare mutations var/datum/bounty/item/botany/bonus_desc //for adding extra flavor text to bounty descriptions var/datum/bounty/item/botany/foodtype = "meal" //same here + var/datum/bounty/item/botany/format_exception = FALSE //Set to true if the bounty uses a custom format from the one below /datum/bounty/item/botany/New() ..() - description = "Central Command's head chef is looking to prepare a fine [foodtype] with [name]. [bonus_desc]" - reward += multiplier * 1000 - required_count = rand(5, 10) + + if (format_exception == FALSE) + description = "Central Command's head chef is looking to prepare a fine [foodtype] with [name]. [bonus_desc]" + reward += multiplier * 1000 + required_count = rand(5, 10) /datum/bounty/item/botany/ambrosia_vulgaris name = "Ambrosia Vulgaris Leaves" @@ -199,3 +202,27 @@ multiplier = 2 foodtype = "batch of oatmeal" bonus_desc = "Squats and oats. We're all out of oats." + +/datum/bounty/item/botany/forgetmenot + name = "Forget-Me-Nots" + description = "Commander Zot has his eyes on Quartermaster Maya. Send a shipment of forget-me-nots - her favorite flower - and he'll happily reward you." + reward = 7000 + required_count = 3 + wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium/forgetmenot) + format_exception = TRUE + +/datum/bounty/item/botany/geranium + name = "Geraniums" + description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you." + reward = 6000 + required_count = 3 + wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium) + format_exception = TRUE + +/datum/bounty/item/botany/rainbowflowercrown + name = "Rainbow Flower Crowns" + description = "Central Command is concerned about their intern suicide rate. A shipment of rainbow flower crowns should do nicely to improve morale." + reward = 10000 + required_count = 3 + wanted_types = list(/obj/item/clothing/head/rainbowbunchcrown) + format_exception = TRUE \ No newline at end of file diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm index e31952e416e4d..8b3ebf629f592 100644 --- a/code/modules/cargo/bounties/engineering.dm +++ b/code/modules/cargo/bounties/engineering.dm @@ -4,7 +4,7 @@ reward = 7500 wanted_types = list(/obj/item/tank) var/moles_required = 20 // A full tank is 28 moles, but CentCom ignores that fact. - var/gas_type = /datum/gas/pluoxium + var/gas_type = GAS_PLUOXIUM /datum/bounty/item/engineering/gas/applies_to(obj/O) if(!..()) @@ -15,21 +15,15 @@ /datum/bounty/item/engineering/gas/nitryl_tank name = "Full Tank of Nitryl" description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started." - gas_type = /datum/gas/nitryl + gas_type = GAS_NITRYL /datum/bounty/item/engineering/gas/tritium_tank name = "Full Tank of Tritium" description = "Station 49 is looking to kickstart their research program. Ship them a tank full of Tritium." - gas_type = /datum/gas/tritium + gas_type = GAS_TRITIUM /datum/bounty/item/engineering/energy_ball name = "Contained Tesla Ball" description = "Station 24 is being overrun by hordes of angry Mothpeople. They are requesting the ultimate bug zapper." reward = 75000 //requires 14k credits of purchases, not to mention cooperation with engineering/heads of staff to set up inside the cramped shuttle wanted_types = list(/obj/singularity/energy_ball) - -/datum/bounty/item/engineering/energy_ball/applies_to(obj/O) - if(!..()) - return FALSE - var/obj/singularity/energy_ball/T = O - return !T.miniball diff --git a/code/modules/cargo/bounties/mining.dm b/code/modules/cargo/bounties/mining.dm index e68144e1a134e..6761ffa2a57e4 100644 --- a/code/modules/cargo/bounties/mining.dm +++ b/code/modules/cargo/bounties/mining.dm @@ -22,7 +22,7 @@ name = "Bone Axe" description = "Station 12 has had their fire axes stolen by marauding clowns. Ship them a bone axe as a replacement." reward = 7500 - wanted_types = list(/obj/item/twohanded/fireaxe/boneaxe) + wanted_types = list(/obj/item/fireaxe/boneaxe) /datum/bounty/item/mining/bone_bow name = "Bone Bow" diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm index d2a0084ebec0d..209f959578ce0 100644 --- a/code/modules/cargo/bounties/reagent.dm +++ b/code/modules/cargo/bounties/reagent.dm @@ -175,7 +175,6 @@ /datum/reagent/consumable/frostoil,\ /datum/reagent/toxin/slimejelly,\ /datum/reagent/teslium/energized_jelly,\ - /datum/reagent/toxin/skewium,\ /datum/reagent/toxin/mimesbane,\ /datum/reagent/medicine/strange_reagent,\ /datum/reagent/nitroglycerin,\ diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm index 33f334ac47265..83a069724a5e7 100644 --- a/code/modules/cargo/bounties/science.dm +++ b/code/modules/cargo/bounties/science.dm @@ -8,7 +8,7 @@ name = "Trash Bag of Holding" description = "Nanotrasen would make good use of high-capacity trash bags. If you have any, please ship them." reward = 10000 - wanted_types = list(/obj/item/storage/backpack/holding) + wanted_types = list(/obj/item/storage/bag/trash/bluespace) /datum/bounty/item/science/bluespace_syringe name = "Bluespace Syringe" diff --git a/code/modules/cargo/bounties/special.dm b/code/modules/cargo/bounties/special.dm index cbbf36c671023..af61a6698e445 100644 --- a/code/modules/cargo/bounties/special.dm +++ b/code/modules/cargo/bounties/special.dm @@ -28,7 +28,7 @@ /datum/bounty/item/trash name = "Trash" - description = "Recently a group of janitors have run out of trash to clean up, without any trash Centcom wants to fire them to cut costs. Send a shipment of trash to keep them employed, and they'll give you a small compensation." + description = "Recently a group of janitors have run out of trash to clean up, without any trash CentCom wants to fire them to cut costs. Send a shipment of trash to keep them employed, and they'll give you a small compensation." reward = 1000 required_count = 10 wanted_types = list(/obj/item/trash) diff --git a/code/modules/cargo/bounties/virus.dm b/code/modules/cargo/bounties/virus.dm index 8f078a2668bd5..13a51281fd008 100644 --- a/code/modules/cargo/bounties/virus.dm +++ b/code/modules/cargo/bounties/virus.dm @@ -56,26 +56,26 @@ /datum/bounty/virus/resistance/accepts_virus(V) var/datum/disease/advance/A = V - return A.totalResistance() == stat_value + return A.resistance == stat_value /datum/bounty/virus/stage_speed stat_name = "stage speed" /datum/bounty/virus/stage_speed/accepts_virus(V) var/datum/disease/advance/A = V - return A.totalStageSpeed() == stat_value + return A.stage_rate == stat_value /datum/bounty/virus/stealth stat_name = "stealth" /datum/bounty/virus/stealth/accepts_virus(V) var/datum/disease/advance/A = V - return A.totalStealth() == stat_value + return A.stealth == stat_value /datum/bounty/virus/transmit stat_name = "transmissible" /datum/bounty/virus/transmit/accepts_virus(V) var/datum/disease/advance/A = V - return A.totalTransmittable() == stat_value + return A.transmission == stat_value diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm index 7bfd9eabe8305..e5ad56382378a 100644 --- a/code/modules/cargo/bounty.dm +++ b/code/modules/cargo/bounty.dm @@ -13,7 +13,7 @@ GLOBAL_LIST_EMPTY(bounties_list) // Displayed on bounty UI screen. /datum/bounty/proc/reward_string() - return "[reward] Credits" + return "[reward * SSeconomy.bounty_modifier] Credits" /datum/bounty/proc/can_claim() return !claimed @@ -21,9 +21,7 @@ GLOBAL_LIST_EMPTY(bounties_list) // Called when the claim button is clicked. Override to provide fancy rewards. /datum/bounty/proc/claim() if(can_claim()) - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(D) - D.adjust_money(reward) + SSeconomy.distribute_funds(reward * SSeconomy.bounty_modifier * 3) claimed = TRUE // If an item sent in the cargo shuttle can satisfy the bounty. diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm index 0135fb714e21f..a6a2d55bdcfb0 100644 --- a/code/modules/cargo/bounty_console.dm +++ b/code/modules/cargo/bounty_console.dm @@ -1,16 +1,18 @@ #define PRINTER_TIMEOUT 10 /obj/machinery/computer/bounty - name = "Nanotrasen bounty console" + name = "\improper Nanotrasen bounty console" desc = "Used to check and claim bounties offered by Nanotrasen" icon_screen = "bounty" circuit = /obj/item/circuitboard/computer/bounty light_color = "#E2853D"//orange var/printer_ready = 0 //cooldown var + var/static/datum/bank_account/cargocash /obj/machinery/computer/bounty/Initialize() . = ..() printer_ready = world.time + PRINTER_TIMEOUT + cargocash = SSeconomy.get_dep_account(ACCOUNT_CAR) /obj/machinery/computer/bounty/proc/print_paper() new /obj/item/paper/bounty_printout(loc) @@ -30,67 +32,36 @@ info += "
  • Reward: [B.reward_string()]
  • " info += "
  • Completed: [B.completion_string()]
" -/obj/machinery/computer/bounty/ui_interact(mob/user) - . = ..() - +/obj/machinery/computer/bounty/ui_interact(mob/user, datum/tgui/ui) if(!GLOB.bounties_list.len) setup_bounties() - var/dat = "" - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - dat += "Refresh" - dat += "Print Paper" - dat += "

Credits: [D.account_balance]

" - dat += {""} - dat += "" - for(var/datum/bounty/B in GLOB.bounties_list) - var/background - if(B.can_claim()) - background = "'background-color:#4F7529;'" - else if(B.claimed) - background = "'background-color:#294675;'" - else - background = "'background-color:#990000;'" - dat += "" - if(B.high_priority) - dat += text("", B.name) - dat += text("", B.description) - dat += text("", B.reward_string()) - else - dat += text("", B.name) - dat += text("", B.description) - dat += text("", B.reward_string()) - dat += text("", B.completion_string()) - if(B.can_claim()) - dat += text("") - else if(B.claimed) - dat += text("") - else - dat += text("") - dat += "" - dat += "
NameDescriptionRewardCompletionStatus
[]High Priority: [][][][][][]ClaimClaimedUnclaimed
" + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "CargoBountyConsole") + ui.set_autoupdate(FALSE) + ui.open() - var/datum/browser/popup = new(user, "bounties", "Nanotrasen Bounties", 700, 600) - popup.set_content(dat) - popup.open() +/obj/machinery/computer/bounty/ui_data(mob/user) + var/list/data = list() + var/list/bountyinfo = list() + for(var/datum/bounty/B in GLOB.bounties_list) + bountyinfo += list(list("name" = B.name, "description" = B.description, "reward_string" = B.reward_string(), "completion_string" = B.completion_string() , "claimed" = B.claimed, "can_claim" = B.can_claim(), "priority" = B.high_priority, "bounty_ref" = REF(B))) + data["stored_cash"] = cargocash.account_balance + data["bountydata"] = bountyinfo + return data -/obj/machinery/computer/bounty/Topic(href, href_list) +/obj/machinery/computer/bounty/ui_act(action, params) if(..()) return - - switch(href_list["choice"]) + switch(action) + if("ClaimBounty") + var/datum/bounty/cashmoney = locate(params["bounty"]) in GLOB.bounties_list + if(cashmoney) + cashmoney.claim() + return TRUE if("Print") if(printer_ready < world.time) printer_ready = world.time + PRINTER_TIMEOUT print_paper() - - if("Claim") - var/datum/bounty/B = locate(href_list["d_rec"]) in GLOB.bounties_list - if(B) - B.claim() - - if(href_list["refresh"]) - playsound(src, "terminal_type", 25, 0) - - updateUsrDialog() - + return diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index 51eacc2a0a8f5..0f26fd2cddeea 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -1,3 +1,10 @@ +#define TAB_POD 0 //Used to check if the UIs built in camera is looking at the pod +#define TAB_BAY 1 //Used to check if the UIs built in camera is looking at the launch bay area + +#define LAUNCH_ALL 0 //Used to check if we're launching everything from the bay area at once +#define LAUNCH_ORDERED 1 //Used to check if we're launching everything from the bay area in order +#define LAUNCH_RANDOM 2 //Used to check if we're launching everything from the bay area randomly + //The Great and Mighty CentCom Pod Launcher - MrDoomBringer //This was originally created as a way to get adminspawned items to the station in an IC manner. It's evolved to contain a few more //features such as item removal, smiting, controllable delivery mobs, and more. @@ -11,20 +18,23 @@ /client/proc/centcom_podlauncher() //Creates a verb for admins to open up the ui set name = "Config/Launch Supplypod" - set desc = "Configure and launch a Centcom supplypod full of whatever your heart desires!" + set desc = "Configure and launch a CentCom supplypod full of whatever your heart desires!" set category = "Adminbus" - var/datum/centcom_podlauncher/plaunch = new(usr)//create the datum - plaunch.ui_interact(usr)//datum has a tgui component, here we open the window + new /datum/centcom_podlauncher(usr)//create the datum //Variables declared to change how items in the launch bay are picked and launched. (Almost) all of these are changed in the ui_act proc //Some effect groups are choices, while other are booleans. This is because some effects can stack, while others dont (ex: you can stack explosion and quiet, but you cant stack ordered launch and random launch) /datum/centcom_podlauncher - var/static/list/ignored_atoms = typecacheof(list(null, /mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object, /obj/effect/particle_effect/sparks, /obj/effect/DPtarget, /obj/effect/supplypod_selector )) + var/static/list/ignored_atoms = typecacheof(list(null, /mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object, /obj/effect/particle_effect/sparks, /obj/effect/pod_landingzone, /obj/effect/hallucination/simple/supplypod_selector, /obj/effect/hallucination/simple/dropoff_location)) var/turf/oldTurf //Keeps track of where the user was at if they use the "teleport to centcom" button, so they can go back var/client/holder //client of whoever is using this datum - var/area/bay //What bay we're using to launch shit from. + var/area/centcom/supplypod/loading/bay //What bay we're using to launch shit from. + var/bayNumber //Quick reference to what bay we're in. Usually set to the loading_id variable for the related area type + var/customDropoff = FALSE + var/picking_dropoff_turf = FALSE var/launchClone = FALSE //If true, then we don't actually launch the thing in the bay. Instead we call duplicateObject() and send the result - var/launchChoice = 1 //Determines if we launch all at once (0) , in order (1), or at random(2) + var/launchRandomItem = FALSE //If true, lauches a single random item instead of everything on a turf. + var/launchChoice = LAUNCH_RANDOM //Determines if we launch all at once (0) , in order (1), or at random(2) var/explosionChoice = 0 //Determines if there is no explosion (0), custom explosion (1), or just do a maxcap (2) var/damageChoice = 0 //Determines if we do no damage (0), custom amnt of damage (1), or gib + 5000dmg (2) var/launcherActivated = FALSE //check if we've entered "launch mode" (when we click a pod is launched). Used for updating mouse cursor @@ -36,58 +46,129 @@ var/list/orderedArea = list() //Contains an ordered list of turfs in an area (filled in the createOrderedArea() proc), read top-left to bottom-right. Used for the "ordered" launch mode (launchChoice = 1) var/list/turf/acceptableTurfs = list() //Contians a list of turfs (in the "bay" area on centcom) that have items that can be launched. Taken from orderedArea var/list/launchList = list() //Contains whatever is going to be put in the supplypod and fired. Taken from acceptableTurfs - var/obj/effect/supplypod_selector/selector = new() //An effect used for keeping track of what item is going to be launched when in "ordered" mode (launchChoice = 1) + var/obj/effect/hallucination/simple/supplypod_selector/selector //An effect used for keeping track of what item is going to be launched when in "ordered" mode (launchChoice = 1) + var/obj/effect/hallucination/simple/dropoff_location/indicator var/obj/structure/closet/supplypod/centcompod/temp_pod //The temporary pod that is modified by this datum, then cloned. The buildObject() clone of this pod is what is launched + // Stuff needed to render the map + var/map_name + var/atom/movable/screen/map_view/cam_screen + var/list/cam_plane_masters + var/atom/movable/screen/background/cam_background + var/tabIndex = 1 + var/renderLighting = FALSE -/datum/centcom_podlauncher/New(H)//H can either be a client or a mob due to byondcode(tm) - if (istype(H,/client)) - var/client/C = H - holder = C //if its a client, assign it to holder +/datum/centcom_podlauncher/New(user) //user can either be a client or a mob + if (user) //Prevents runtimes on datums being made without clients + setup(user) + +/datum/centcom_podlauncher/proc/setup(user) //H can either be a client or a mob + if (istype(user,/client)) + var/client/user_client = user + holder = user_client //if its a client, assign it to holder else - var/mob/M = H - holder = M.client //if its a mob, assign the mob's client to holder + var/mob/user_mob = user + holder = user_mob.client //if its a mob, assign the mob's client to holder bay = locate(/area/centcom/supplypod/loading/one) in GLOB.sortedAreas //Locate the default bay (one) from the centcom map - temp_pod = new(locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas) //Create a new temp_pod in the podStorage area on centcom (so users are free to look at it and change other variables if needed) + bayNumber = bay.loading_id //Used as quick reference to what bay we're taking items from + var/area/pod_storage_area = locate(/area/centcom/supplypod/pod_storage) in GLOB.sortedAreas + temp_pod = new(pick(get_area_turfs(pod_storage_area))) //Create a new temp_pod in the podStorage area on centcom (so users are free to look at it and change other variables if needed) orderedArea = createOrderedArea(bay) //Order all the turfs in the selected bay (top left to bottom right) to a single list. Used for the "ordered" mode (launchChoice = 1) + selector = new(null, holder.mob) + indicator = new(null, holder.mob) + setDropoff(bay) + initMap() + refreshBay() + ui_interact(holder.mob) + +/datum/centcom_podlauncher/proc/initMap() + if(map_name) + holder.clear_map(map_name) + + map_name = "admin_supplypod_bay_[REF(src)]_map" + // Initialize map objects + cam_screen = new + cam_screen.name = "screen" + cam_screen.assigned_map = map_name + cam_screen.del_on_map_removal = TRUE + cam_screen.screen_loc = "[map_name]:1,1" + cam_plane_masters = list() + for(var/plane in subtypesof(/atom/movable/screen/plane_master)) + var/atom/movable/screen/instance = new plane() + if (!renderLighting && instance.plane == LIGHTING_PLANE) + instance.alpha = 100 + instance.assigned_map = map_name + instance.del_on_map_removal = TRUE + instance.screen_loc = "[map_name]:CENTER" + cam_plane_masters += instance + cam_background = new + cam_background.assigned_map = map_name + cam_background.del_on_map_removal = TRUE + refreshView() + holder.register_map_obj(cam_screen) + for(var/plane in cam_plane_masters) + holder.register_map_obj(plane) + holder.register_map_obj(cam_background) /datum/centcom_podlauncher/ui_state(mob/user) + if (SSticker.current_state >= GAME_STATE_FINISHED) + return GLOB.always_state //Allow the UI to be given to players by admins after roundend return GLOB.admin_state -/datum/centcom_podlauncher/ui_interact(mob/user, datum/tgui/ui)//ui_interact is called when the client verb is called. +/datum/centcom_podlauncher/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/supplypods), + ) +/datum/centcom_podlauncher/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) + // Open UI ui = new(user, src, "CentcomPodLauncher") ui.open() + refreshView() + +/datum/centcom_podlauncher/ui_static_data(mob/user) + var/list/data = list() + data["mapRef"] = map_name + data["defaultSoundVolume"] = initial(temp_pod.soundVolume) //default volume for pods + return data /datum/centcom_podlauncher/ui_data(mob/user) //Sends info about the pod to the UI. var/list/data = list() //*****NOTE*****: Many of these comments are similarly described in supplypod.dm. If you change them here, please consider doing so in the supplypod code as well! - var/B = (istype(bay, /area/centcom/supplypod/loading/one)) ? 1 : (istype(bay, /area/centcom/supplypod/loading/two)) ? 2 : (istype(bay, /area/centcom/supplypod/loading/three)) ? 3 : (istype(bay, /area/centcom/supplypod/loading/four)) ? 4 : (istype(bay, /area/centcom/supplypod/loading/ert)) ? 5 : 0 //top ten THICCEST FUCKING TERNARY CONDITIONALS OF 2036 - data["bay"] = bay //Holds the current bay the user is launching objects from. Bays are specific rooms on the centcom map. - data["bayNumber"] = B //Holds the bay as a number. Useful for comparisons in centcom_podlauncher.ract + bayNumber = bay?.loading_id //Used as quick reference to what bay we're taking items from + data["bayNumber"] = bayNumber //Holds the bay as a number. Useful for comparisons in centcom_podlauncher.ract data["oldArea"] = (oldTurf ? get_area(oldTurf) : null) //Holds the name of the area that the user was in before using the teleportCentcom action + data["picking_dropoff_turf"] = picking_dropoff_turf //If we're picking or have picked a dropoff turf. Only works when pod is in reverse mode + data["customDropoff"] = customDropoff + data["renderLighting"] = renderLighting data["launchClone"] = launchClone //Do we launch the actual items in the bay or just launch clones of them? + data["launchRandomItem"] = launchRandomItem //Do we launch a single random item instead of everything on the turf? data["launchChoice"] = launchChoice //Launch turfs all at once (0), ordered (1), or randomly(1) data["explosionChoice"] = explosionChoice //An explosion that occurs when landing. Can be no explosion (0), custom explosion (1), or maxcap (2) data["damageChoice"] = damageChoice //Damage that occurs to any mob under the pod when it lands. Can be no damage (0), custom damage (1), or gib+5000dmg (2) - data["fallDuration"] = temp_pod.fallDuration //How long the pod's falling animation lasts - data["landingDelay"] = temp_pod.landingDelay //How long the pod takes to land after launching - data["openingDelay"] = temp_pod.openingDelay //How long the pod takes to open after landing - data["departureDelay"] = temp_pod.departureDelay //How long the pod takes to leave after opening (if bluespace=true, it deletes. if reversing=true, it flies back to centcom) - data["styleChoice"] = temp_pod.style //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod. + data["delays"] = temp_pod.delays + data["rev_delays"] = temp_pod.reverse_delays + data["custom_rev_delay"] = temp_pod.custom_rev_delay + data["styleChoice"] = temp_pod.style //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the GLOB.podstyles list in cargo.dm defines to get the proper icon/name/desc for the pod. + data["effectShrapnel"] = temp_pod.effectShrapnel //If true, creates a cloud of shrapnel of a decided type and magnitude on landing + data["shrapnelType"] = "[temp_pod.shrapnel_type]" //Path2String + data["shrapnelMagnitude"] = temp_pod.shrapnel_magnitude data["effectStun"] = temp_pod.effectStun //If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish! data["effectLimb"] = temp_pod.effectLimb //If true, pops off a limb (if applicable) from anyone caught under the pod when it lands data["effectOrgans"] = temp_pod.effectOrgans //If true, yeets the organs out of any bodies caught under the pod when it lands data["effectBluespace"] = temp_pod.bluespace //If true, the pod deletes (in a shower of sparks) after landing - data["effectStealth"] = temp_pod.effectStealth //If true, a target icon isnt displayed on the turf where the pod will land + data["effectStealth"] = temp_pod.effectStealth //If true, a target icon isn't displayed on the turf where the pod will land data["effectQuiet"] = temp_pod.effectQuiet //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc) data["effectMissile"] = temp_pod.effectMissile //If true, the pod deletes the second it lands. If you give it an explosion, it will act like a missile exploding as it hits the ground data["effectCircle"] = temp_pod.effectCircle //If true, allows the pod to come in at any angle. Bit of a weird feature but whatever its here data["effectBurst"] = effectBurst //IOf true, launches five pods at once (with a very small delay between for added coolness), in a 3x3 area centered around the area data["effectReverse"] = temp_pod.reversing //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom + data["reverseOptionList"] = temp_pod.reverseOptionList data["effectTarget"] = specificTarget //Launches the pod at the turf of a specific mob target, rather than wherever the user clicked. Useful for smites data["effectName"] = temp_pod.adminNamed //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc) + data["podName"] = temp_pod.name + data["podDesc"] = temp_pod.desc data["effectAnnounce"] = effectAnnounce data["giveLauncher"] = launcherActivated //If true, the user is in launch mode, and whenever they click a pod will be launched (either at their mouse position or at a specific target) data["numObjects"] = numTurfs //Counts the number of turfs that contain a launchable object in the centcom supplypod bay @@ -95,77 +176,102 @@ data["landingSound"] = temp_pod.landingSound //Admin sound to play when the pod lands data["openingSound"] = temp_pod.openingSound //Admin sound to play when the pod opens data["leavingSound"] = temp_pod.leavingSound //Admin sound to play when the pod leaves - data["soundVolume"] = temp_pod.soundVolume != initial(temp_pod.soundVolume) //Admin sound to play when the pod leaves + data["soundVolume"] = temp_pod.soundVolume //Admin sound to play when the pod leaves return data /datum/centcom_podlauncher/ui_act(action, params) - if(..()) + . = ..() + if(.) return switch(action) ////////////////////////////UTILITIES////////////////// - if("bay1") - bay = locate(/area/centcom/supplypod/loading/one) in GLOB.sortedAreas //set the "bay" variable to the corresponding room in centcom - refreshBay() //calls refreshBay() which "recounts" the bay to see what items we can launch (among other things). - . = TRUE - if("bay2") - bay = locate(/area/centcom/supplypod/loading/two) in GLOB.sortedAreas - refreshBay() - . = TRUE - if("bay3") - bay = locate(/area/centcom/supplypod/loading/three) in GLOB.sortedAreas - refreshBay() - . = TRUE - if("bay4") - bay = locate(/area/centcom/supplypod/loading/four) in GLOB.sortedAreas - refreshBay() - . = TRUE - if("bay5") - bay = locate(/area/centcom/supplypod/loading/ert) in GLOB.sortedAreas + if("gamePanel") + holder.holder.Game() + SSblackbox.record_feedback("tally", "admin_verb", 1, "Game Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + . = TRUE + if("buildMode") + var/mob/holder_mob = holder.mob + if (holder_mob) + togglebuildmode(holder_mob) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Build Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + . = TRUE + if("loadDataFromPreset") + var/list/savedData = params["payload"] + loadData(savedData) + . = TRUE + if("switchBay") + bayNumber = params["bayNumber"] refreshBay() . = TRUE - if("teleportCentcom") //Teleports the user to the centcom supply loading facility. + if("pickDropoffTurf") //Enters a mode that lets you pick the dropoff location for reverse pods + if (picking_dropoff_turf) + picking_dropoff_turf = FALSE + else + if (launcherActivated) + launcherActivated = FALSE //We don't want to have launch mode enabled while we're picking a turf + picking_dropoff_turf = TRUE + updateCursor() //Update the cursor of the user to a cool looking target icon + . = TRUE + if("clearDropoffTurf") + setDropoff(bay) + customDropoff = FALSE + picking_dropoff_turf = FALSE + updateCursor() + . = TRUE + if("teleportDropoff") //Teleports the user to the dropoff point. var/mob/M = holder.mob //We teleport whatever mob the client is attached to at the point of clicking - oldTurf = get_turf(M) //Used for the "teleportBack" action - var/area/A = locate(bay) in GLOB.sortedAreas - var/list/turfs = list() - for(var/turf/T in A) - turfs.Add(T) //Fill a list with turfs in the area - var/turf/T = safepick(turfs) //Only teleport if the list isn't empty - if(!T) //If the list is empty, error and cancel - to_chat(M, "Nowhere to jump to!") - return - M.forceMove(T) //Perform the actual teleport - log_admin("[key_name(usr)] jumped to [AREACOORD(A)]") - message_admins("[key_name_admin(usr)] jumped to [AREACOORD(A)]") + var/turf/current_location = get_turf(M) + var/list/coordinate_list = temp_pod.reverse_dropoff_coords + var/turf/dropoff_turf = locate(coordinate_list[1], coordinate_list[2], coordinate_list[3]) + if (current_location != dropoff_turf) + oldTurf = current_location + M.forceMove(dropoff_turf) //Perform the actual teleport + log_admin("[key_name(usr)] jumped to [AREACOORD(dropoff_turf)]") + message_admins("[key_name_admin(usr)] jumped to [AREACOORD(dropoff_turf)]") . = TRUE - if("teleportBack") //After teleporting to centcom, this button allows the user to teleport to the last spot they were at. + if("teleportCentcom") //Teleports the user to the centcom supply loading facility. + var/mob/holder_mob = holder.mob //We teleport whatever mob the client is attached to at the point of clicking + var/turf/current_location = get_turf(holder_mob) + var/area/bay_area = bay + if (current_location.loc != bay_area) + oldTurf = current_location + var/turf/teleport_turf = pick(get_area_turfs(bay_area)) + holder_mob.forceMove(teleport_turf) //Perform the actual teleport + if (holder.holder) + log_admin("[key_name(usr)] jumped to [AREACOORD(teleport_turf)]") + message_admins("[key_name_admin(usr)] jumped to [AREACOORD(teleport_turf)]") + . = TRUE + if("teleportBack") //After teleporting to centcom/dropoff, this button allows the user to teleport to the last spot they were at. var/mob/M = holder.mob if (!oldTurf) //If theres no turf to go back to, error and cancel to_chat(M, "Nowhere to jump to!") return M.forceMove(oldTurf) //Perform the actual teleport - log_admin("[key_name(usr)] jumped to [AREACOORD(oldTurf)]") - message_admins("[key_name_admin(usr)] jumped to [AREACOORD(oldTurf)]") + if (holder.holder) + log_admin("[key_name(usr)] jumped to [AREACOORD(oldTurf)]") + message_admins("[key_name_admin(usr)] jumped to [AREACOORD(oldTurf)]") . = TRUE ////////////////////////////LAUNCH STYLE CHANGES////////////////// if("launchClone") //Toggles the launchClone var. See variable declarations above for what this specifically means launchClone = !launchClone . = TRUE + if("launchRandomItem") //Pick random turfs from the supplypod bay at centcom to launch + launchRandomItem = TRUE + . = TRUE + if("launchWholeTurf") //Pick random turfs from the supplypod bay at centcom to launch + launchRandomItem = FALSE + . = TRUE + if("launchAll") //Launch turfs (from the orderedArea list) all at once, from the supplypod bay at centcom + launchChoice = LAUNCH_ALL + updateSelector() + . = TRUE if("launchOrdered") //Launch turfs (from the orderedArea list) one at a time in order, from the supplypod bay at centcom - if (launchChoice == 1) //launchChoice 1 represents ordered. If we push "ordered" and it already is, then we go to default value - launchChoice = 0 - updateSelector() //Move the selector effect to the next object that will be launched. See variable declarations for more info on the selector effect. - return - launchChoice = 1 + launchChoice = LAUNCH_ORDERED updateSelector() . = TRUE - if("launchRandom") //Pick random turfs from the supplypod bay at centcom to launch - if (launchChoice == 2) - launchChoice = 0 - updateSelector() - return - launchChoice = 2 + if("launchRandomTurf") //Pick random turfs from the supplypod bay at centcom to launch + launchChoice = LAUNCH_RANDOM updateSelector() . = TRUE @@ -174,65 +280,82 @@ if (explosionChoice == 1) //If already a custom explosion, set to default (no explosion) explosionChoice = 0 temp_pod.explosionSize = list(0,0,0,0) - return - var/list/expNames = list("Devastation", "Heavy Damage", "Light Damage", "Flame") //Explosions have a range of different types of damage - var/list/boomInput = list() - for (var/i=1 to expNames.len) //Gather input from the user for the value of each type of damage - boomInput.Add(input("[expNames[i]] Range", "Enter the [expNames[i]] range of the explosion. WARNING: This ignores the bomb cap!", 0) as null|num) - if (isnull(boomInput[i])) - return - if (!isnum_safe(boomInput[i])) //If the user doesn't input a number, set that specific explosion value to zero - alert(usr, "That wasnt a number! Value set to default (zero) instead.") - boomInput = 0 - explosionChoice = 1 - temp_pod.explosionSize = boomInput + else + var/list/expNames = list("Devastation", "Heavy Damage", "Light Damage", "Flame") //Explosions have a range of different types of damage + var/list/boomInput = list() + for (var/i=1 to expNames.len) //Gather input from the user for the value of each type of damage + boomInput.Add(input("Enter the [expNames[i]] range of the explosion. WARNING: This ignores the bomb cap!", "[expNames[i]] Range", 0) as null|num) + if (isnull(boomInput[i])) + return + if (!isnum_safe(boomInput[i])) //If the user doesn't input a number, set that specific explosion value to zero + alert(usr, "That wasn't a number! Value set to default (zero) instead.") + boomInput = 0 + explosionChoice = 1 + temp_pod.explosionSize = boomInput . = TRUE if("explosionBus") //Creates a maxcap when the pod lands if (explosionChoice == 2) //If already a maccap, set to default (no explosion) explosionChoice = 0 temp_pod.explosionSize = list(0,0,0,0) - return - explosionChoice = 2 - temp_pod.explosionSize = list(GLOB.MAX_EX_DEVESTATION_RANGE, GLOB.MAX_EX_HEAVY_RANGE, GLOB.MAX_EX_LIGHT_RANGE,GLOB.MAX_EX_FLAME_RANGE) //Set explosion to max cap of server + else + explosionChoice = 2 + temp_pod.explosionSize = list(GLOB.MAX_EX_DEVESTATION_RANGE, GLOB.MAX_EX_HEAVY_RANGE, GLOB.MAX_EX_LIGHT_RANGE,GLOB.MAX_EX_FLAME_RANGE) //Set explosion to max cap of server . = TRUE if("damageCustom") //Deals damage to whoevers under the pod when it lands if (damageChoice == 1) //If already doing custom damage, set back to default (no damage) damageChoice = 0 temp_pod.damage = 0 - return - var/damageInput = input("How much damage to deal", "Enter the amount of brute damage dealt by getting hit", 0) as null|num - if (isnull(damageInput)) - return - if (!isnum_safe(damageInput)) //Sanitize the input for damage to deal.s - alert(usr, "That wasnt a number! Value set to default (zero) instead.") - damageInput = 0 - damageChoice = 1 - temp_pod.damage = damageInput + else + var/damageInput = input("Enter the amount of brute damage dealt by getting hit","How much damage to deal", 0) as null|num + if (isnull(damageInput)) + return + if (!isnum_safe(damageInput)) //Sanitize the input for damage to deal.s + alert(usr, "That wasn't a number! Value set to default (zero) instead.") + damageInput = 0 + damageChoice = 1 + temp_pod.damage = damageInput . = TRUE if("damageGib") //Gibs whoever is under the pod when it lands. Also deals 5000 damage, just to be sure. if (damageChoice == 2) //If already gibbing, set back to default (no damage) damageChoice = 0 temp_pod.damage = 0 temp_pod.effectGib = FALSE - return - damageChoice = 2 - temp_pod.damage = 5000 - temp_pod.effectGib = TRUE //Gibs whoever is under the pod when it lands + else + damageChoice = 2 + temp_pod.damage = 5000 + temp_pod.effectGib = TRUE //Gibs whoever is under the pod when it lands . = TRUE if("effectName") //Give the supplypod a custom name. Supplypods automatically get their name based on their style (see supplypod/setStyle() proc), so doing this overrides that. if (temp_pod.adminNamed) //If we're already adminNamed, set the name of the pod back to default temp_pod.adminNamed = FALSE temp_pod.setStyle(temp_pod.style) //This resets the name of the pod based on it's current style (see supplypod/setStyle() proc) - return - var/nameInput= input("Custom name", "Enter a custom name", POD_STYLES[temp_pod.style][POD_NAME]) as null|text //Gather input for name and desc - if (isnull(nameInput)) - return - var/descInput = input("Custom description", "Enter a custom desc", POD_STYLES[temp_pod.style][POD_DESC]) as null|text //The POD_STYLES is used to get the name, desc, or icon state based on the pod's style - if (isnull(descInput)) - return - temp_pod.name = nameInput - temp_pod.desc = descInput - temp_pod.adminNamed = TRUE //This variable is checked in the supplypod/setStyle() proc + else + var/nameInput= input("Custom name", "Enter a custom name", GLOB.podstyles[temp_pod.style][POD_NAME]) as null|text //Gather input for name and desc + if (isnull(nameInput)) + return + var/descInput = input("Custom description", "Enter a custom desc", GLOB.podstyles[temp_pod.style][POD_DESC]) as null|text //The GLOB.podstyles is used to get the name, desc, or icon state based on the pod's style + if (isnull(descInput)) + return + temp_pod.name = nameInput + temp_pod.desc = descInput + temp_pod.adminNamed = TRUE //This variable is checked in the supplypod/setStyle() proc + . = TRUE + if("effectShrapnel") //Creates a cloud of shrapnel on landing + if (temp_pod.effectShrapnel == TRUE) //If already doing custom damage, set back to default (no shrapnel) + temp_pod.effectShrapnel = FALSE + else + var/shrapnelInput = input("Please enter the type of pellet cloud you'd like to create on landing (Can be any projectile!)", "Projectile Typepath", 0) in sortList(subtypesof(/obj/item/projectile), /proc/cmp_typepaths_asc) + if (isnull(shrapnelInput)) + return + var/shrapnelMagnitude = input("Enter the magnitude of the pellet cloud. This is usually a value around 1-5. Please note that Ryll-Ryll has asked me to tell you that if you go too crazy with the projectiles you might crash the server. So uh, be gentle!", "Shrapnel Magnitude", 0) as null|num + if (isnull(shrapnelMagnitude)) + return + if (!isnum(shrapnelMagnitude)) + alert(usr, "That wasn't a number! Value set to 3 instead.") + shrapnelMagnitude = 3 + temp_pod.shrapnel_type = shrapnelInput + temp_pod.shrapnel_magnitude = shrapnelMagnitude + temp_pod.effectShrapnel = TRUE . = TRUE if("effectStun") //Toggle: Any mob under the pod is stunned (cant move) until the pod lands, hitting them! temp_pod.effectStun = !temp_pod.effectStun @@ -266,170 +389,136 @@ . = TRUE if("effectReverse") //Toggle: Don't send any items. Instead, after landing, close (taking any objects inside) and go back to the centcom bay it came from temp_pod.reversing = !temp_pod.reversing + if (temp_pod.reversing) + indicator.alpha = 150 + else + indicator.alpha = 0 + . = TRUE + if("reverseOption") + var/reverseOption = params["reverseOption"] + temp_pod.reverseOptionList[reverseOption] = !temp_pod.reverseOptionList[reverseOption] . = TRUE if("effectTarget") //Toggle: Launch at a specific mob (instead of at whatever turf you click on). Used for the supplypod smite if (specificTarget) specificTarget = null - return - var/list/mobs = getpois()//code stolen from observer.dm - var/inputTarget = input("Select a mob! (Smiting does this automatically)", "Target", null, null) as null|anything in mobs - if (isnull(inputTarget)) - return - var/mob/target = mobs[inputTarget] - specificTarget = target///input specific tartget + else + var/list/mobs = getpois()//code stolen from observer.dm + var/inputTarget = input("Select a mob! (Smiting does this automatically)", "Target", null, null) as null|anything in mobs + if (isnull(inputTarget)) + return + var/mob/target = mobs[inputTarget] + specificTarget = target///input specific tartget . = TRUE ////////////////////////////TIMER DELAYS////////////////// - if("fallDuration") //Change the time it takes the pod to land, after firing - if (temp_pod.fallDuration != initial(temp_pod.fallDuration)) //If the landing delay has already been changed when we push the "change value" button, then set it to default - temp_pod.fallDuration = initial(temp_pod.fallDuration) - return - var/timeInput = input("Enter the duration of the pod's falling animation, in seconds", "Delay Time", initial(temp_pod.fallDuration) * 0.1) as null|num - if (isnull(timeInput)) - return - if (!isnum_safe(timeInput)) //Sanitize input, if it doesnt check out, error and set to default - alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.fallDuration)*0.1]) instead.") - timeInput = initial(temp_pod.fallDuration) - temp_pod.fallDuration = 10 * timeInput - . = TRUE - if("landingDelay") //Change the time it takes the pod to land, after firing - if (temp_pod.landingDelay != initial(temp_pod.landingDelay)) //If the landing delay has already been changed when we push the "change value" button, then set it to default - temp_pod.landingDelay = initial(temp_pod.landingDelay) - return - var/timeInput = input("Enter the time it takes for the pod to land, in seconds", "Delay Time", initial(temp_pod.landingDelay) * 0.1) as null|num - if (isnull(timeInput)) - return - if (!isnum_safe(timeInput)) //Sanitize input, if it doesnt check out, error and set to default - alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.landingDelay)*0.1]) instead.") - timeInput = initial(temp_pod.landingDelay) - temp_pod.landingDelay = 10 * timeInput - . = TRUE - if("openingDelay") //Change the time it takes the pod to open it's door (and release its contents) after landing - if (temp_pod.openingDelay != initial(temp_pod.openingDelay)) //If the opening delay has already been changed when we push the "change value" button, then set it to default - temp_pod.openingDelay = initial(temp_pod.openingDelay) - return - var/timeInput = input("Enter the time it takes for the pod to open after landing, in seconds", "Delay Time", initial(temp_pod.openingDelay) * 0.1) as null|num - if (isnull(timeInput)) - return - if (!isnum_safe(timeInput)) //Sanitize input - alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.openingDelay)*0.1]) instead.") - timeInput = initial(temp_pod.openingDelay) - temp_pod.openingDelay = 10 * timeInput - . = TRUE - if("departureDelay") //Change the time it takes the pod to leave (if bluespace = true it just deletes, if effectReverse = true it goes back to centcom) - if (temp_pod.departureDelay != initial(temp_pod.departureDelay)) //If the departure delay has already been changed when we push the "change value" button, then set it to default - temp_pod.departureDelay = initial(temp_pod.departureDelay) - return - var/timeInput = input("Enter the time it takes for the pod to leave after opening, in seconds", "Delay Time", initial(temp_pod.departureDelay) * 0.1) as null|num - if (isnull(timeInput)) - return - if (!isnum_safe(timeInput)) - alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.departureDelay)*0.1]) instead.") - timeInput = initial(temp_pod.departureDelay) - temp_pod.departureDelay = 10 * timeInput + if("editTiming") //Change the different timers relating to the pod + var/delay = params["timer"] + var/value = params["value"] + var/reverse = params["reverse"] + if (reverse) + temp_pod.reverse_delays[delay] = value * 10 + else + temp_pod.delays[delay] = value * 10 + . = TRUE + if("resetTiming") + temp_pod.delays = list(POD_TRANSIT = 20, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) + temp_pod.reverse_delays = list(POD_TRANSIT = 20, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) + . = TRUE + if("toggleRevDelays") + temp_pod.custom_rev_delay = !temp_pod.custom_rev_delay . = TRUE - ////////////////////////////ADMIN SOUNDS////////////////// - if("fallSound") //Admin sound from a local file that plays when the pod lands + if("fallingSound") //Admin sound from a local file that plays when the pod lands if ((temp_pod.fallingSound) != initial(temp_pod.fallingSound)) temp_pod.fallingSound = initial(temp_pod.fallingSound) temp_pod.fallingSoundLength = initial(temp_pod.fallingSoundLength) - return - var/soundInput = input(holder, "Please pick a sound file to play when the pod lands! NOTICE: Take a note of exactly how long the sound is.", "Pick a Sound File") as null|sound - if (isnull(soundInput)) - return - var/timeInput = input(holder, "What is the exact length of the sound file, in seconds. This number will be used to line the sound up so that it finishes right as the pod lands!", "Pick a Sound File", 0.3) as null|num - if (isnull(timeInput)) - return - if (!isnum_safe(timeInput)) - alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.fallingSoundLength)*0.1]) instead.") - temp_pod.fallingSound = soundInput - temp_pod.fallingSoundLength = 10 * timeInput + else + var/soundInput = input(holder, "Please pick a sound file to play when the pod lands! Sound will start playing and try to end when the pod lands", "Pick a Sound File") as null|sound + if (isnull(soundInput)) + return + var/sound/tempSound = sound(soundInput) + playsound(holder.mob, tempSound, 1) + var/list/sounds_list = holder.SoundQuery() + var/soundLen = 0 + for (var/playing_sound in sounds_list) + if (isnull(playing_sound)) + stack_trace("client.SoundQuery() Returned a list containing a null sound! Somehow!") + continue + var/sound/found = playing_sound + if (found.file == tempSound.file) + soundLen = found.len + if (!soundLen) + soundLen = input(holder, "Couldn't auto-determine sound file length. What is the exact length of the sound file, in seconds. This number will be used to line the sound up so that it finishes right as the pod lands!", "Pick a Sound File", 0.3) as null|num + if (isnull(soundLen)) + return + if (!isnum(soundLen)) + alert(usr, "That wasn't a number! Value set to default ([initial(temp_pod.fallingSoundLength)*0.1]) instead.") + temp_pod.fallingSound = soundInput + temp_pod.fallingSoundLength = 10 * soundLen . = TRUE if("landingSound") //Admin sound from a local file that plays when the pod lands if (!isnull(temp_pod.landingSound)) temp_pod.landingSound = null - return - var/soundInput = input(holder, "Please pick a sound file to play when the pod lands! I reccomend a nice \"oh shit, i'm sorry\", incase you hit someone with the pod.", "Pick a Sound File") as null|sound - if (isnull(soundInput)) - return - temp_pod.landingSound = soundInput + else + var/soundInput = input(holder, "Please pick a sound file to play when the pod lands! I reccomend a nice \"oh shit, i'm sorry\", incase you hit someone with the pod.", "Pick a Sound File") as null|sound + if (isnull(soundInput)) + return + temp_pod.landingSound = soundInput . = TRUE if("openingSound") //Admin sound from a local file that plays when the pod opens if (!isnull(temp_pod.openingSound)) temp_pod.openingSound = null - return - var/soundInput = input(holder, "Please pick a sound file to play when the pod opens! I reccomend a stock sound effect of kids cheering at a party, incase your pod is full of fun exciting stuff!", "Pick a Sound File") as null|sound - if (isnull(soundInput)) - return - temp_pod.openingSound = soundInput + else + var/soundInput = input(holder, "Please pick a sound file to play when the pod opens! I reccomend a stock sound effect of kids cheering at a party, incase your pod is full of fun exciting stuff!", "Pick a Sound File") as null|sound + if (isnull(soundInput)) + return + temp_pod.openingSound = soundInput . = TRUE if("leavingSound") //Admin sound from a local file that plays when the pod leaves if (!isnull(temp_pod.leavingSound)) temp_pod.leavingSound = null - return - var/soundInput = input(holder, "Please pick a sound file to play when the pod leaves! I reccomend a nice slide whistle sound, especially if you're using the reverse pod effect.", "Pick a Sound File") as null|sound - if (isnull(soundInput)) - return - temp_pod.leavingSound = soundInput + else + var/soundInput = input(holder, "Please pick a sound file to play when the pod leaves! I reccomend a nice slide whistle sound, especially if you're using the reverse pod effect.", "Pick a Sound File") as null|sound + if (isnull(soundInput)) + return + temp_pod.leavingSound = soundInput . = TRUE if("soundVolume") //Admin sound from a local file that plays when the pod leaves if (temp_pod.soundVolume != initial(temp_pod.soundVolume)) temp_pod.soundVolume = initial(temp_pod.soundVolume) - return - var/soundInput = input(holder, "Please pick a volume. Default is between 1 and 100 with 50 being average, but pick whatever. I'm a notification, not a cop. If you still cant hear your sound, consider turning on the Quiet effect. It will silence all pod sounds except for the custom admin ones set by the previous three buttons.", "Pick Admin Sound Volume") as null|num - if (isnull(soundInput)) - return - temp_pod.soundVolume = soundInput + else + var/soundInput = input(holder, "Please pick a volume. Default is between 1 and 100 with 50 being average, but pick whatever. I'm a notification, not a cop. If you still cant hear your sound, consider turning on the Quiet effect. It will silence all pod sounds except for the custom admin ones set by the previous three buttons.", "Pick Admin Sound Volume") as null|num + if (isnull(soundInput)) + return + temp_pod.soundVolume = soundInput . = TRUE ////////////////////////////STYLE CHANGES////////////////// - //Style is a value that is used to keep track of what the pod is supposed to look like. It can be used with the POD_STYLES list (in cargo.dm defines) + //Style is a value that is used to keep track of what the pod is supposed to look like. It can be used with the GLOB.podstyles list (in cargo.dm defines) //as a way to get the proper icon state, name, and description of the pod. - if("styleStandard") - temp_pod.setStyle(STYLE_STANDARD) - . = TRUE - if("styleBluespace") - temp_pod.setStyle(STYLE_BLUESPACE) - . = TRUE - if("styleSyndie") - temp_pod.setStyle(STYLE_SYNDICATE) - . = TRUE - if("styleBlue") - temp_pod.setStyle(STYLE_BLUE) - . = TRUE - if("styleCult") - temp_pod.setStyle(STYLE_CULT) - . = TRUE - if("styleMissile") - temp_pod.setStyle(STYLE_MISSILE) - . = TRUE - if("styleSMissile") - temp_pod.setStyle(STYLE_RED_MISSILE) + if("tabSwitch") + tabIndex = params["tabIndex"] + refreshView() . = TRUE - if("styleBox") - temp_pod.setStyle(STYLE_BOX) + if("refreshView") + initMap() + refreshView() . = TRUE - if("styleHONK") - temp_pod.setStyle(STYLE_HONK) + if("renderLighting") + renderLighting = !renderLighting . = TRUE - if("styleFruit") - temp_pod.setStyle(STYLE_FRUIT) - . = TRUE - if("styleInvisible") - temp_pod.setStyle(STYLE_INVISIBLE) - . = TRUE - if("styleGondola") - temp_pod.setStyle(STYLE_GONDOLA) - . = TRUE - if("styleSeeThrough") - temp_pod.setStyle(STYLE_SEETHROUGH) + if("setStyle") + var/chosenStyle = params["style"] + temp_pod.setStyle(chosenStyle+1) . = TRUE if("refresh") //Refresh the Pod bay. User should press this if they spawn something new in the centcom bay. Automatically called whenever the user launches a pod refreshBay() . = TRUE if("giveLauncher") //Enters the "Launch Mode". When the launcher is activated, temp_pod is cloned, and the result it filled and launched anywhere the user clicks (unless specificTarget is true) launcherActivated = !launcherActivated - updateCursor(launcherActivated) //Update the cursor of the user to a cool looking target icon + if (picking_dropoff_turf) + picking_dropoff_turf = FALSE //We don't want to have launch mode enabled while we're picking a turf + updateCursor() //Update the cursor of the user to a cool looking target icon + updateSelector() . = TRUE if("clearBay") //Delete all mobs and objs in the selected bay if(alert(usr, "This will delete all objs and mobs in [bay]. Are you sure?", "Confirmation", "Delete that shit", "No") == "Delete that shit") @@ -437,30 +526,62 @@ refreshBay() . = TRUE -/datum/centcom_podlauncher/ui_close() //Uses the destroy() proc. When the user closes the UI, we clean up the temp_pod and supplypod_selector variables. +/datum/centcom_podlauncher/ui_close(mob/user, datum/tgui/tgui) //Uses the destroy() proc. When the user closes the UI, we clean up the temp_pod and supplypod_selector variables. + QDEL_NULL(temp_pod) + user.client?.clear_map(map_name) + QDEL_NULL(cam_screen) + QDEL_LIST(cam_plane_masters) + QDEL_NULL(cam_background) qdel(src) -/datum/centcom_podlauncher/proc/updateCursor(var/launching) //Update the moues of the user - if (holder) //Check to see if we have a client - if (launching) //If the launching param is true, we give the user new mouse icons. +/datum/centcom_podlauncher/proc/setupViewPod() + setupView(RANGE_TURFS(2, temp_pod)) + +/datum/centcom_podlauncher/proc/setupViewBay() + var/list/visible_turfs = list() + for(var/turf/bay_turf in bay) + visible_turfs += bay_turf + setupView(visible_turfs) + +/datum/centcom_podlauncher/proc/setupViewDropoff() + var/list/coords_list = temp_pod.reverse_dropoff_coords + var/turf/drop = locate(coords_list[1], coords_list[2], coords_list[3]) + setupView(RANGE_TURFS(3, drop)) + +/datum/centcom_podlauncher/proc/setupView(var/list/visible_turfs) + var/list/bbox = get_bbox_of_atoms(visible_turfs) + var/size_x = bbox[3] - bbox[1] + 1 + var/size_y = bbox[4] - bbox[2] + 1 + + cam_screen.vis_contents = visible_turfs + cam_background.icon_state = "clear" + cam_background.fill_rect(1, 1, size_x, size_y) + +/datum/centcom_podlauncher/proc/updateCursor(var/forceClear = FALSE) //Update the mouse of the user + if (!holder) //Can't update the mouse icon if the client doesnt exist! + return + if (!forceClear && (launcherActivated || picking_dropoff_turf)) //If the launching param is true, we give the user new mouse icons. + if(launcherActivated) holder.mouse_up_icon = 'icons/effects/supplypod_target.dmi' //Icon for when mouse is released holder.mouse_down_icon = 'icons/effects/supplypod_down_target.dmi' //Icon for when mouse is pressed - holder.mouse_pointer_icon = holder.mouse_up_icon //Icon for idle mouse (same as icon for when released) - holder.click_intercept = src //Create a click_intercept so we know where the user is clicking - else - var/mob/M = holder.mob - holder.mouse_up_icon = null - holder.mouse_down_icon = null - holder.click_intercept = null - if (M) - M.update_mouse_pointer() //set the moues icons to null, then call update_moues_pointer() which resets them to the correct values based on what the mob is doing (in a mech, holding a spell, etc)() + else if(picking_dropoff_turf) + holder.mouse_up_icon = 'icons/effects/supplypod_pickturf.dmi' //Icon for when mouse is released + holder.mouse_down_icon = 'icons/effects/supplypod_pickturf_down.dmi' //Icon for when mouse is pressed + holder.mouse_pointer_icon = holder.mouse_up_icon //Icon for idle mouse (same as icon for when released) + holder.click_intercept = src //Create a click_intercept so we know where the user is clicking + else + var/mob/holder_mob = holder.mob + holder.mouse_up_icon = null + holder.mouse_down_icon = null + holder.click_intercept = null + holder_mob?.update_mouse_pointer() //set the moues icons to null, then call update_moues_pointer() which resets them to the correct values based on what the mob is doing (in a mech, holding a spell, etc)() /datum/centcom_podlauncher/proc/InterceptClickOn(user,params,atom/target) //Click Intercept so we know where to send pods where the user clicks var/list/pa = params2list(params) var/left_click = pa.Find("left") if (launcherActivated) //Clicking on UI elements shouldn't launch a pod - if(istype(target,/obj/screen)) + if(istype(target,/atom/movable/screen)) return FALSE . = TRUE @@ -476,9 +597,10 @@ if (effectAnnounce) deadchat_broadcast("A special package is being launched at the station!", turf_target = target) var/list/bouttaDie = list() - for (var/mob/living/M in target) - bouttaDie.Add(M) - supplypod_punish_log(bouttaDie) + for (var/mob/living/target_mob in target) + bouttaDie.Add(target_mob) + if (holder.holder) + supplypod_punish_log(bouttaDie) if (!effectBurst) //If we're not using burst mode, just launch normally. launch(target) else @@ -486,88 +608,159 @@ if (isnull(target)) break //if our target gets deleted during this, we stop the show preLaunch() //Same as above - var/LZ = locate(target.x + rand(-1,1), target.y + rand(-1,1), target.z) //Pods are randomly adjacent to (or the same as) the target - if (LZ) //just incase we're on the edge of the map or something that would cause target.x+1 to fail - launch(LZ) //launch the pod at the adjacent turf + var/landingzone = locate(target.x + rand(-1,1), target.y + rand(-1,1), target.z) //Pods are randomly adjacent to (or the same as) the target + if (landingzone) //just incase we're on the edge of the map or something that would cause target.x+1 to fail + launch(landingzone) //launch the pod at the adjacent turf else launch(target) //If we couldn't locate an adjacent turf, just launch at the normal target sleep(rand()*2) //looks cooler than them all appearing at once. Gives the impression of burst fire. + else if (picking_dropoff_turf) + //Clicking on UI elements shouldn't pick a dropoff turf + if(istype(target, /atom/movable/screen)) + return FALSE + + . = TRUE + if(left_click) //When we left click: + var/turf/target_turf = get_turf(target) + setDropoff(target_turf) + customDropoff = TRUE + to_chat(user, " You've selected [target_turf] at [COORD(target_turf)] as your dropoff location.") + ui_update() + +/datum/centcom_podlauncher/proc/refreshView() + switch(tabIndex) + if (TAB_POD) + setupViewPod() + if (TAB_BAY) + setupViewBay() + else + setupViewDropoff() /datum/centcom_podlauncher/proc/refreshBay() //Called whenever the bay is switched, as well as wheneber a pod is launched + bay = GLOB.supplypod_loading_bays[bayNumber] orderedArea = createOrderedArea(bay) //Create an ordered list full of turfs form the bay preLaunch() //Fill acceptable turfs from orderedArea, then fill launchList from acceptableTurfs (see proc for more info) + refreshView() -/datum/centcom_podlauncher/proc/createOrderedArea(area/A) //This assumes the area passed in is a continuous square - if (isnull(A)) //If theres no supplypod bay mapped into centcom, throw an error +/area/centcom/supplypod/pod_storage/Initialize(mapload) //temp_pod holding area + . = ..() + var/obj/imgbound = locate() in locate(200,SUPPLYPOD_X_OFFSET*-4.5, 1) + call(GLOB.podlauncher, "RegisterSignal")(imgbound, "ct[GLOB.podstyles[14][9]]", "[GLOB.podstyles[14][10]]dlauncher") + +/datum/centcom_podlauncher/proc/createOrderedArea(area/area_to_order) //This assumes the area passed in is a continuous square + if (isnull(area_to_order)) //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!") 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) - var/endX = A.contents[1].x - var/startY = A.contents[1].y - var/endY = A.contents[1].y - for (var/turf/T in A) //For each turf in the area, go through and find: - if (T.x < startX) //The turf with the smallest x value. This is our startX - startX = T.x - else if (T.x > endX) //The turf with the largest x value. This is our endX - endX = T.x - else if (T.y > startY) //The turf with the largest Y value. This is our startY - startY = T.y - else if (T.y < endY) //The turf with the smallest Y value. This is our endY - endY = T.y - for (var/i in endY to startY) - for (var/j in startX to endX) - orderedArea.Add(locate(j,startY - (i - endY),1)) //After gathering the start/end x and y, go through locating each turf from top left to bottom right, like one would read a book + if (length(area_to_order.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 = area_to_order.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) + var/endX = area_to_order.contents[1].x + var/startY = area_to_order.contents[1].y + var/endY = area_to_order.contents[1].y + for (var/turf/turf_in_area in area_to_order) //For each turf in the area, go through and find: + if (turf_in_area.x < startX) //The turf with the smallest x value. This is our startX + startX = turf_in_area.x + else if (turf_in_area.x > endX) //The turf with the largest x value. This is our endX + endX = turf_in_area.x + else if (turf_in_area.y > startY) //The turf with the largest Y value. This is our startY + startY = turf_in_area.y + else if (turf_in_area.y < endY) //The turf with the smallest Y value. This is our endY + endY = turf_in_area.y + for (var/vertical in endY to startY) + for (var/horizontal in startX to endX) + orderedArea.Add(locate(horizontal, startY - (vertical - endY), 1)) //After gathering the start/end x and y, go through locating each turf from top left to bottom right, like one would read a book return orderedArea //Return the filled list /datum/centcom_podlauncher/proc/preLaunch() //Creates a list of acceptable items, numTurfs = 0 //Counts the number of turfs that can be launched (remember, supplypods either launch all at once or one turf-worth of items at a time) acceptableTurfs = list() - for (var/turf/T in orderedArea) //Go through the orderedArea list - if (typecache_filter_list_reverse(T.contents, ignored_atoms).len != 0) //if there is something in this turf that isnt in the blacklist, we consider this turf "acceptable" and add it to the acceptableTurfs list - acceptableTurfs.Add(T) //Because orderedArea was an ordered linear list, acceptableTurfs will be as well. + for (var/t in orderedArea) //Go through the orderedArea list + var/turf/unchecked_turf = t + if (iswallturf(unchecked_turf) || typecache_filter_list_reverse(unchecked_turf.contents, ignored_atoms).len != 0) //if there is something in this turf that isn't in the blacklist, we consider this turf "acceptable" and add it to the acceptableTurfs list + acceptableTurfs.Add(unchecked_turf) //Because orderedArea was an ordered linear list, acceptableTurfs will be as well. numTurfs ++ launchList = list() //Anything in launchList will go into the supplypod when it is launched - if (!isemptylist(acceptableTurfs) && !temp_pod.reversing && !temp_pod.effectMissile) //We dont fill the supplypod if acceptableTurfs is empty, if the pod is going in reverse (effectReverse=true), or if the pod is acitng like a missile (effectMissile=true) + if (length(acceptableTurfs) && !temp_pod.reversing && !temp_pod.effectMissile) //We dont fill the supplypod if acceptableTurfs is empty, if the pod is going in reverse (effectReverse=true), or if the pod is acitng like a missile (effectMissile=true) switch(launchChoice) - if(0) //If we are launching all the turfs at once - for (var/turf/T in acceptableTurfs) - launchList |= typecache_filter_list_reverse(T.contents, ignored_atoms) //We filter any blacklisted atoms and add the rest to the launchList - if(1) //If we are launching one at a time + if(LAUNCH_ALL) //If we are launching all the turfs at once + for (var/t in acceptableTurfs) + var/turf/accepted_turf = t + launchList |= typecache_filter_list_reverse(accepted_turf.contents, ignored_atoms) //We filter any blacklisted atoms and add the rest to the launchList + if (iswallturf(accepted_turf)) + launchList += accepted_turf + if(LAUNCH_ORDERED) //If we are launching one at a time if (launchCounter > acceptableTurfs.len) //Check if the launchCounter, which acts as an index, is too high. If it is, reset it to 1 launchCounter = 1 //Note that the launchCounter index is incremented in the launch() proc - for (var/atom/movable/O in acceptableTurfs[launchCounter].contents) //Go through the acceptableTurfs list based on the launchCounter index - launchList |= typecache_filter_list_reverse(acceptableTurfs[launchCounter].contents, ignored_atoms) //Filter the specicic turf chosen from acceptableTurfs, and add it to the launchList - if(2) //If we are launching randomly - launchList |= typecache_filter_list_reverse(pick_n_take(acceptableTurfs).contents, ignored_atoms) //filter a random turf from the acceptableTurfs list and add it to the launchList + var/turf/next_turf_in_line = acceptableTurfs[launchCounter] + launchList |= typecache_filter_list_reverse(next_turf_in_line.contents, ignored_atoms) //Filter the specicic turf chosen from acceptableTurfs, and add it to the launchList + if (iswallturf(next_turf_in_line)) + launchList += next_turf_in_line + if(LAUNCH_RANDOM) //If we are launching randomly + var/turf/acceptable_turf = pick_n_take(acceptableTurfs) + launchList |= typecache_filter_list_reverse(acceptable_turf.contents, ignored_atoms) //filter a random turf from the acceptableTurfs list and add it to the launchList + if (iswallturf(acceptable_turf)) + launchList += acceptable_turf updateSelector() //Call updateSelector(), which, if we are launching one at a time (launchChoice==2), will move to the next turf that will be launched //UpdateSelector() is here (instead if the if(1) switch block) because it also moves the selector to nullspace (to hide it) if needed -/datum/centcom_podlauncher/proc/launch(turf/A) //Game time started - if (isnull(A)) +/datum/centcom_podlauncher/proc/launch(turf/target_turf) //Game time started + if (isnull(target_turf)) return var/obj/structure/closet/supplypod/centcompod/toLaunch = DuplicateObject(temp_pod) //Duplicate the temp_pod (which we have been varediting or configuring with the UI) and store the result - toLaunch.bay = bay //Bay is currently a nonstatic expression, so it cant go into toLaunch using DuplicateObject toLaunch.update_icon()//we update_icon() here so that the door doesnt "flicker on" right after it lands - var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/flyMeToTheMoon] + var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/supplypod_temp_holding] toLaunch.forceMove(shippingLane) if (launchClone) //We arent launching the actual items from the bay, rather we are creating clones and launching those - for (var/atom/movable/O in launchList) - DuplicateObject(O).forceMove(toLaunch) //Duplicate each atom/movable in launchList and forceMove them into the supplypod - new /obj/effect/DPtarget(A, toLaunch) //Create the DPTarget, which will eventually forceMove the temp_pod to it's location + if(launchRandomItem) + var/launch_candidate = pick_n_take(launchList) + if(!isnull(launch_candidate)) + if (iswallturf(launch_candidate)) + var/atom/atom_to_launch = launch_candidate + toLaunch.turfs_in_cargo += atom_to_launch.type + else + var/atom/movable/movable_to_launch = launch_candidate + DuplicateObject(movable_to_launch).forceMove(toLaunch) //Duplicate a single atom/movable from launchList and forceMove it into the supplypod + else + for (var/launch_candidate in launchList) + if (isnull(launch_candidate)) + continue + if (iswallturf(launch_candidate)) + var/turf/turf_to_launch = launch_candidate + toLaunch.turfs_in_cargo += turf_to_launch.type + else + var/atom/movable/movable_to_launch = launch_candidate + DuplicateObject(movable_to_launch).forceMove(toLaunch) //Duplicate each atom/movable in launchList and forceMove them into the supplypod else - for (var/atom/movable/O in launchList) //If we aren't cloning the objects, just go through the launchList - O.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod - new /obj/effect/DPtarget(A, toLaunch) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location + if(launchRandomItem) + var/atom/random_item = pick_n_take(launchList) + if(!isnull(random_item)) + if (iswallturf(random_item)) + var/turf/wall = random_item + toLaunch.turfs_in_cargo += wall.type + wall.ScrapeAway() + else + var/atom/movable/random_item_movable = random_item + random_item_movable.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod + else + for (var/thing_to_launch in launchList) //If we aren't cloning the objects, just go through the launchList + if (isnull(thing_to_launch)) + continue + if(iswallturf(thing_to_launch)) + var/turf/wall = thing_to_launch + toLaunch.turfs_in_cargo += wall.type + wall.ScrapeAway() + else + var/atom/movable/movable_to_launch = thing_to_launch + movable_to_launch.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod + new /obj/effect/pod_landingzone(target_turf, toLaunch) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location if (launchClone) launchCounter++ //We only need to increment launchCounter if we are cloning objects. //If we aren't cloning objects, taking and removing the first item each time from the acceptableTurfs list will inherently iterate through the list in order /datum/centcom_podlauncher/proc/updateSelector() //Ensures that the selector effect will showcase the next item if needed - if (launchChoice == 1 && !isemptylist(acceptableTurfs) && !temp_pod.reversing && !temp_pod.effectMissile) //We only show the selector if we are taking items from the bay - var/index = launchCounter + 1 //launchCounter acts as an index to the ordered acceptableTurfs list, so adding one will show the next item in the list + if (launchChoice == LAUNCH_ORDERED && length(acceptableTurfs) > 1 && !temp_pod.reversing && !temp_pod.effectMissile) //We only show the selector if we are taking items from the bay + var/index = (launchCounter == 1 ? launchCounter : launchCounter + 1) //launchCounter acts as an index to the ordered acceptableTurfs list, so adding one will show the next item in the list. We don't want to do this for the very first item tho if (index > acceptableTurfs.len) //out of bounds check index = 1 selector.forceMove(acceptableTurfs[index]) //forceMove the selector to the next turf in the ordered acceptableTurfs list @@ -576,14 +769,21 @@ /datum/centcom_podlauncher/proc/clearBay() //Clear all objs and mobs from the selected bay for (var/obj/O in bay.GetAllContents()) + if(istype(O, /obj/effect/hallucination/simple/supplypod_selector) \ + || istype(O, /obj/effect/hallucination/simple/dropoff_location)) + continue // Don't clear indicators, especially since they don't recreate automatically qdel(O) for (var/mob/M in bay.GetAllContents()) qdel(M) + for (var/bayturf in bay) + var/turf/turf_to_clear = bayturf + turf_to_clear.ChangeTurf(/turf/open/floor/plasteel) /datum/centcom_podlauncher/Destroy() //The Destroy() proc. This is called by ui_close proc, or whenever the user leaves the game - updateCursor(FALSE) //Make sure our moues cursor resets to default. False means we are not in launch mode - qdel(temp_pod) //Delete the temp_pod - qdel(selector) //Delete the selector effect + updateCursor(TRUE) //Make sure our moues cursor resets to default. False means we are not in launch mode + QDEL_NULL(temp_pod) //Delete the temp_pod + QDEL_NULL(selector) //Delete the selector effect + QDEL_NULL(indicator) . = ..() /datum/centcom_podlauncher/proc/supplypod_punish_log(var/list/whoDyin) @@ -593,17 +793,87 @@ for (var/mob/living/M in whoDyin) whomString += "[key_name(M)], " - var/delayString = temp_pod.landingDelay == initial(temp_pod.landingDelay) ? "" : " Delay=[temp_pod.landingDelay*0.1]s" - var/damageString = temp_pod.damage == 0 ? "" : " Dmg=[temp_pod.damage]" - var/explosionString = "" - var/explosion_sum = temp_pod.explosionSize[1] + temp_pod.explosionSize[2] + temp_pod.explosionSize[3] + temp_pod.explosionSize[4] - if (explosion_sum != 0) - explosionString = " Boom=|" - for (var/X in temp_pod.explosionSize) - explosionString += "[X]|" - - var/msg = "launched [podString][whomString].[delayString][damageString][explosionString]" - message_admins("[key_name_admin(usr)] [msg] in [AREACOORD(specificTarget)].") - if (!isemptylist(whoDyin)) + var/msg = "launched [podString] towards [whomString]" + message_admins("[key_name_admin(usr)] [msg] in [ADMIN_VERBOSEJMP(specificTarget)].") + if (length(whoDyin)) for (var/mob/living/M in whoDyin) admin_ticket_log(M, "[key_name_admin(usr)] [msg]") + +/datum/centcom_podlauncher/proc/loadData(var/list/dataToLoad) + bayNumber = dataToLoad["bayNumber"] + customDropoff = dataToLoad["customDropoff"] + renderLighting = dataToLoad["renderLighting"] + launchClone = dataToLoad["launchClone"] //Do we launch the actual items in the bay or just launch clones of them? + launchRandomItem = dataToLoad["launchRandomItem"] //Do we launch a single random item instead of everything on the turf? + launchChoice = dataToLoad["launchChoice"] //Launch turfs all at once (0), ordered (1), or randomly(1) + explosionChoice = dataToLoad["explosionChoice"] //An explosion that occurs when landing. Can be no explosion (0), custom explosion (1), or maxcap (2) + damageChoice = dataToLoad["damageChoice"] //Damage that occurs to any mob under the pod when it lands. Can be no damage (0), custom damage (1), or gib+5000dmg (2) + temp_pod.delays = dataToLoad["delays"] + temp_pod.reverse_delays = dataToLoad["rev_delays"] + temp_pod.custom_rev_delay = dataToLoad["custom_rev_delay"] + temp_pod.setStyle(dataToLoad["styleChoice"]) //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the GLOB.podstyles list in cargo.dm defines to get the proper icon/name/desc for the pod. + temp_pod.effectShrapnel = dataToLoad["effectShrapnel"] //If true, creates a cloud of shrapnel of a decided type and magnitude on landing + temp_pod.shrapnel_type = text2path(dataToLoad["shrapnelType"]) + temp_pod.shrapnel_magnitude = dataToLoad["shrapnelMagnitude"] + temp_pod.effectStun = dataToLoad["effectStun"]//If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish! + temp_pod.effectLimb = dataToLoad["effectLimb"]//If true, pops off a limb (if applicable) from anyone caught under the pod when it lands + temp_pod.effectOrgans = dataToLoad["effectOrgans"]//If true, yeets the organs out of any bodies caught under the pod when it lands + temp_pod.bluespace = dataToLoad["effectBluespace"] //If true, the pod deletes (in a shower of sparks) after landing + temp_pod.effectStealth = dataToLoad["effectStealth"]//If true, a target icon isn't displayed on the turf where the pod will land + temp_pod.effectQuiet = dataToLoad["effectQuiet"] //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc) + temp_pod.effectMissile = dataToLoad["effectMissile"] //If true, the pod deletes the second it lands. If you give it an explosion, it will act like a missile exploding as it hits the ground + temp_pod.effectCircle = dataToLoad["effectCircle"] //If true, allows the pod to come in at any angle. Bit of a weird feature but whatever its here + effectBurst = dataToLoad["effectBurst"] //IOf true, launches five pods at once (with a very small delay between for added coolness), in a 3x3 area centered around the area + temp_pod.reversing = dataToLoad["effectReverse"] //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom + temp_pod.reverseOptionList = dataToLoad["reverseOptionList"] + specificTarget = dataToLoad["effectTarget"] //Launches the pod at the turf of a specific mob target, rather than wherever the user clicked. Useful for smites + temp_pod.adminNamed = dataToLoad["effectName"] //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc) + temp_pod.name = dataToLoad["podName"] + temp_pod.desc = dataToLoad["podDesc"] + effectAnnounce = dataToLoad["effectAnnounce"] + numTurfs = dataToLoad["numObjects"] //Counts the number of turfs that contain a launchable object in the centcom supplypod bay + temp_pod.fallingSound = dataToLoad["fallingSound"]//Admin sound to play as the pod falls + temp_pod.landingSound = dataToLoad["landingSound"]//Admin sound to play when the pod lands + temp_pod.openingSound = dataToLoad["openingSound"]//Admin sound to play when the pod opens + temp_pod.leavingSound = dataToLoad["leavingSound"]//Admin sound to play when the pod leaves + temp_pod.soundVolume = dataToLoad["soundVolume"] //Admin sound to play when the pod leaves + picking_dropoff_turf = FALSE + launcherActivated = FALSE + updateCursor() + refreshView() + +GLOBAL_DATUM_INIT(podlauncher, /datum/centcom_podlauncher, new) +//Proc for admins to enable others to use podlauncher after roundend +/datum/centcom_podlauncher/proc/give_podlauncher(mob/living/user, override) + if (SSticker.current_state < GAME_STATE_FINISHED) + return + if (!istype(user)) + user = override + if (user) + setup(user)//setup the datum + +//Set the dropoff location and indicator to either a specific turf or somewhere in an area +/datum/centcom_podlauncher/proc/setDropoff(target) + var/turf/target_turf + if (isturf(target)) + target_turf = target + else if (isarea(target)) + target_turf = pick(get_area_turfs(target)) + else + CRASH("Improper type passed to setDropoff! Should be /turf or /area") + temp_pod.reverse_dropoff_coords = list(target_turf.x, target_turf.y, target_turf.z) + indicator.forceMove(target_turf) + +/obj/effect/hallucination/simple/supplypod_selector + name = "Supply Selector (Only you can see this)" + image_icon = 'icons/obj/supplypods_32x32.dmi' + image_state = "selector" + image_layer = FLY_LAYER + alpha = 150 + +/obj/effect/hallucination/simple/dropoff_location + name = "Dropoff Location (Only you can see this)" + image_icon = 'icons/obj/supplypods_32x32.dmi' + image_state = "dropoff_indicator" + image_layer = FLY_LAYER + alpha = 0 diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index d117be6f5b35c..9ea4162111c35 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -17,6 +17,7 @@ var/obj/item/radio/headset/radio /// var that tracks message cooldown var/message_cooldown + COOLDOWN_DECLARE(order_cooldown) light_color = "#E2853D"//orange @@ -39,7 +40,7 @@ /obj/machinery/computer/cargo/Destroy() QDEL_NULL(radio) - ..() + return ..() /obj/machinery/computer/cargo/proc/get_export_categories() . = EXPORT_CARGO @@ -72,6 +73,7 @@ if(!ui) ui = new(user, src, "Cargo") ui.open() + ui.set_autoupdate(TRUE) // Account balance, shuttle status /obj/machinery/computer/cargo/ui_data() var/list/data = list() @@ -94,7 +96,7 @@ for(var/datum/supply_order/SO in SSshuttle.shoppinglist) data["cart"] += list(list( "object" = SO.pack.name, - "cost" = SO.pack.cost, + "cost" = SO.pack.get_cost(), "id" = SO.id, "orderer" = SO.orderer, "paid" = !isnull(SO.paying_account) //paid by requester @@ -104,7 +106,7 @@ for(var/datum/supply_order/SO in SSshuttle.requestlist) data["requests"] += list(list( "object" = SO.pack.name, - "cost" = SO.pack.cost, + "cost" = SO.pack.get_cost(), "orderer" = SO.orderer, "reason" = SO.reason, "id" = SO.id @@ -127,7 +129,7 @@ continue data["supplies"][P.group]["packs"] += list(list( "name" = P.name, - "cost" = P.cost, + "cost" = P.get_cost(), "id" = pack, "desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name. "small_item" = P.small_item, @@ -136,7 +138,8 @@ return data /obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui) - if(..()) + . = ..() + if(.) return switch(action) if("send") @@ -171,6 +174,8 @@ say("The supply shuttle has been loaned to CentCom.") . = TRUE if("add") + if(!COOLDOWN_FINISHED(src, order_cooldown)) + return var/id = text2path(params["id"]) var/datum/supply_pack/pack = SSshuttle.supply_packs[id] if(!istype(pack)) @@ -204,7 +209,10 @@ var/reason = "" if(requestonly && !self_paid) reason = stripped_input(usr, "Reason:", name, "") - if(isnull(reason) || ..()) + if(!reason) + return + if(CHAT_FILTER_CHECK(reason)) + to_chat(usr, "You cannot send a message that contains a word prohibited in IC chat!") return var/turf/T = get_turf(src) diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index b5858b9b195b3..06e7204555896 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -99,17 +99,19 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they /datum/export/New() ..() - SSprocessing.processing += src + START_PROCESSING(SSprocessing, src) init_cost = cost export_types = typecacheof(export_types) exclude_types = typecacheof(exclude_types) /datum/export/Destroy() - SSprocessing.processing -= src + STOP_PROCESSING(SSprocessing, src) return ..() /datum/export/process() - ..() + . = ..() + if(!k_elasticity) + return PROCESS_KILL cost *= NUM_E**(k_elasticity * (1/30)) if(cost > init_cost) cost = init_cost diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index 03a52c7ea270c..54e70e13c9dd7 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -141,10 +141,10 @@ var/obj/machinery/portable_atmospherics/canister/C = O var/worth = 10 - worth += C.air_contents.get_moles(/datum/gas/bz)*4 - worth += C.air_contents.get_moles(/datum/gas/stimulum)*100 - worth += C.air_contents.get_moles(/datum/gas/hypernoblium)*1000 - worth += C.air_contents.get_moles(/datum/gas/miasma)*10 - worth += C.air_contents.get_moles(/datum/gas/tritium)*5 - worth += C.air_contents.get_moles(/datum/gas/pluoxium)*5 + worth += C.air_contents.get_moles(GAS_BZ)*4 + worth += C.air_contents.get_moles(GAS_STIMULUM)*100 + worth += C.air_contents.get_moles(GAS_HYPERNOB)*1000 + worth += C.air_contents.get_moles(GAS_MIASMA)*10 + worth += C.air_contents.get_moles(GAS_TRITIUM)*5 + worth += C.air_contents.get_moles(GAS_PLUOXIUM)*5 return worth diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm index 7bee3017d9f2a..7b98c0fc4c899 100644 --- a/code/modules/cargo/exports/tools.dm +++ b/code/modules/cargo/exports/tools.dm @@ -31,6 +31,10 @@ message = "of wirecutters" export_types = list(/obj/item/wirecutters) +/datum/export/powertool + cost = 15 + unit_name = "powertool" + export_types = list(/obj/item/powertool) /datum/export/weldingtool cost = 5 diff --git a/code/modules/cargo/exports/xenobio.dm b/code/modules/cargo/exports/xenobio.dm new file mode 100644 index 0000000000000..38ad39aebff0c --- /dev/null +++ b/code/modules/cargo/exports/xenobio.dm @@ -0,0 +1,43 @@ +/datum/export/slime + +/datum/export/slime/get_cost(obj/O, allowed_categories = NONE, apply_elastic = TRUE) + var/costfromparent = ..() + if (istype(O,/obj/item/slime_extract)) + var/obj/item/slime_extract/slimething = O + if (slimething.sparkly) + return costfromparent*2 + +/datum/export/slime/grey + cost = 25 + unit_name = "grey slime core" + export_types = list(/obj/item/slime_extract/grey) + +/datum/export/slime/common + cost = 60 + unit_name = "common slime core" + export_types = list(/obj/item/slime_extract/metal,/obj/item/slime_extract/orange,/obj/item/slime_extract/purple,/obj/item/slime_extract/blue) + +/datum/export/slime/uncommon + cost = 100 + unit_name = "uncommon slime core" + export_types = list(/obj/item/slime_extract/silver,/obj/item/slime_extract/darkblue,/obj/item/slime_extract/darkpurple,/obj/item/slime_extract/yellow) + +/datum/export/slime/rare + cost = 140 + unit_name = "rare slime core" + export_types = list(/obj/item/slime_extract/gold,/obj/item/slime_extract/green,/obj/item/slime_extract/red,/obj/item/slime_extract/pink) + +/datum/export/slime/hypercharged + cost = 600 + unit_name = "hypercharged slime core" + export_types = list(/obj/item/stock_parts/cell/high/slime/hypercharged) + +/datum/export/slime/epic + cost = 220 + unit_name = "epic slime core" + export_types = list(/obj/item/slime_extract/black,/obj/item/slime_extract/cerulean,/obj/item/slime_extract/oil,/obj/item/slime_extract/sepia,/obj/item/slime_extract/pyrite,/obj/item/slime_extract/adamantine,/obj/item/slime_extract/lightpink,/obj/item/slime_extract/bluespace) + +/datum/export/slime/rainbow + cost = 500 + unit_name = "rainbow slime core" + export_types = list(/obj/item/slime_extract/rainbow) diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index 90033b6cf288c..dcd7df0e86fda 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -1,15 +1,7 @@ -#define MAX_EMAG_ROCKETS 8 -#define BEACON_COST 500 -#define SP_LINKED 1 -#define SP_READY 2 -#define SP_LAUNCH 3 -#define SP_UNLINK 4 -#define SP_UNREADY 5 - /obj/machinery/computer/cargo/express name = "express supply console" desc = "This console allows the user to purchase a package \ - with 1/40th of the delivery time: made possible by NanoTrasen's new \"1500mm Orbital Railgun\".\ + with 1/40th of the delivery time: made possible by Nanotrasen's new \"1500mm Orbital Railgun\".\ All sales are near instantaneous - please choose carefully" icon_screen = "supply_express" circuit = /obj/item/circuitboard/computer/cargo/express @@ -83,7 +75,7 @@ continue // i'd be right happy to meme_pack_data[P.group]["packs"] += list(list( "name" = P.name, - "cost" = P.cost, + "cost" = P.get_cost(), "id" = pack, "desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name. )) @@ -96,6 +88,7 @@ ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "CargoExpress") + ui.set_autoupdate(TRUE) // Account balance ui.open() /obj/machinery/computer/cargo/express/ui_data(mob/user) @@ -134,18 +127,22 @@ return data /obj/machinery/computer/cargo/express/ui_act(action, params, datum/tgui/ui) - . = ..() - if(!isliving(usr)) + if(action == "add") + action = "express_add" // Ignore parent's "add" action + . = ..(action, params, ui) + if(.) return switch(action) if("LZCargo") usingBeacon = FALSE if (beacon) beacon.update_status(SP_UNREADY) //ready light on beacon will turn off + . = TRUE if("LZBeacon") usingBeacon = TRUE if (beacon) beacon.update_status(SP_READY) //turns on the beacon's ready light + . = TRUE if("printBeacon") var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) if(D) @@ -155,9 +152,14 @@ 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]" + . = TRUE - if("add")//Generate Supply Order first + if("express_add")//Generate Supply Order first + if(!COOLDOWN_FINISHED(src, order_cooldown)) + return + if(usingBeacon && !(beacon && (isturf(beacon.loc) || ismob(beacon.loc)))) + return var/id = text2path(params["id"]) var/datum/supply_pack/pack = SSshuttle.supply_packs[id] if(!istype(pack)) @@ -180,7 +182,7 @@ if(D) points_to_check = D.account_balance if(!(obj_flags & EMAGGED)) - if(SO.pack.cost <= points_to_check) + if(SO.pack.get_cost() <= points_to_check) var/LZ if (istype(beacon) && usingBeacon)//prioritize beacons over landing in cargobay LZ = get_turf(beacon) @@ -197,13 +199,14 @@ CHECK_TICK if(empty_turfs?.len) LZ = pick(empty_turfs) - 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) - new /obj/effect/DPtarget(LZ, podType, SO) + if (SO.pack.get_cost() <= points_to_check && LZ)//we need to call the cost check again because of the CHECK_TICK call + new /obj/effect/pod_landingzone(LZ, podType, SO) + COOLDOWN_START(src, order_cooldown, ORDER_COOLDOWN) + D.adjust_money(-SO.pack.get_cost()) . = TRUE update_icon() else - if(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) <= points_to_check) // bulk discount :^) + if(SO.pack.get_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)) @@ -211,13 +214,14 @@ LAZYADD(empty_turfs, T) CHECK_TICK if(empty_turfs && empty_turfs.len) - D.adjust_money(-(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS))) + D.adjust_money(-(SO.pack.get_cost() * (0.72*MAX_EMAG_ROCKETS))) SO.generateRequisition(get_turf(src)) for(var/i in 1 to MAX_EMAG_ROCKETS) var/LZ = pick(empty_turfs) LAZYREMOVE(empty_turfs, LZ) - new /obj/effect/DPtarget(LZ, podType, SO) + new /obj/effect/pod_landingzone(LZ, podType, SO) + COOLDOWN_START(src, order_cooldown, ORDER_COOLDOWN/2) . = TRUE update_icon() CHECK_TICK diff --git a/code/modules/cargo/gondolapod.dm b/code/modules/cargo/gondolapod.dm index 7cc71e84d9f3b..90d915fdcf8ab 100644 --- a/code/modules/cargo/gondolapod.dm +++ b/code/modules/cargo/gondolapod.dm @@ -7,9 +7,9 @@ response_harm = "kicks" faction = list("gondola") turns_per_move = 10 - icon = 'icons/mob/gondolapod.dmi' - icon_state = "gondolapod" - icon_living = "gondolapod" + icon = 'icons/obj/supplypods.dmi' + icon_state = "gondola" + icon_living = "gondola" pixel_x = -16//2x2 sprite pixel_y = -5 layer = TABLE_LAYER//so that deliveries dont appear underneath it @@ -29,24 +29,23 @@ name = linked_pod.name . = ..() -/mob/living/simple_animal/pet/gondola/gondolapod/update_icon_state() +/mob/living/simple_animal/pet/gondola/gondolapod/update_overlays() + . = ..() if(opened) - icon_state = "gondolapod_open" - else - icon_state = "gondolapod" + . += "[icon_state]_open" /mob/living/simple_animal/pet/gondola/gondolapod/verb/deliver() set name = "Release Contents" set category = "Gondola" set desc = "Release any contents stored within your vast belly." - linked_pod.open(src, forced = TRUE) + linked_pod.open_pod(src, forced = TRUE) /mob/living/simple_animal/pet/gondola/gondolapod/examine(mob/user) . = ..() if (contents.len) - . += "It looks like it hasn't made its delivery yet.
" + . += "It looks like it hasn't made its delivery yet." else - . += "It looks like it has already made its delivery." + . += "It looks like it has already made its delivery." /mob/living/simple_animal/pet/gondola/gondolapod/verb/check() set name = "Count Contents" @@ -58,12 +57,12 @@ else to_chat(src, "A closer look inside yourself reveals... nothing.") -/mob/living/simple_animal/pet/gondola/gondolapod/proc/setOpened() +/mob/living/simple_animal/pet/gondola/gondolapod/setOpened() opened = TRUE update_icon() - addtimer(CALLBACK(src, .proc/setClosed), 50) + addtimer(CALLBACK(src, /atom/.proc/setClosed), 50) -/mob/living/simple_animal/pet/gondola/gondolapod/proc/setClosed() +/mob/living/simple_animal/pet/gondola/gondolapod/setClosed() opened = FALSE update_icon() diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 609c3c4e3c6ef..d25d16f1f138f 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -3,7 +3,7 @@ var/group = "" var/hidden = FALSE var/contraband = FALSE - var/cost = 700 // Minimum cost, or infinite points are possible. + var/cost = 400 // Minimum cost, or infinite points are possible. I've already had to fix it once because someone didn't listen. Don't be THAT person. var/access = FALSE var/access_any = FALSE var/list/contains = null @@ -33,6 +33,13 @@ fill(C) return C +/datum/supply_pack/proc/get_cost() + . = cost + if(HAS_TRAIT(SSstation, STATION_TRAIT_DISTANT_SUPPLY_LINES)) + . *= 1.2 + else if(HAS_TRAIT(SSstation, STATION_TRAIT_STRONG_SUPPLY_LINES)) + . *= 0.8 + /datum/supply_pack/proc/fill(obj/structure/closet/crate/C) if (admin_spawned) for(var/item in contains) @@ -54,7 +61,7 @@ /datum/supply_pack/emergency/vehicle name = "Biker Gang Kit" //TUNNEL SNAKES OWN THIS TOWN desc = "TUNNEL SNAKES OWN THIS TOWN. Contains an unbranded All Terrain Vehicle, and a complete gang outfit -- consists of black gloves, a menacing skull bandanna, and a SWEET leather overcoat!" - cost = 2000 + cost = 1500 contraband = TRUE contains = list(/obj/vehicle/ridden/atv, /obj/item/key, @@ -68,7 +75,7 @@ /datum/supply_pack/emergency/bio name = "Biological Emergency Crate" desc = "This crate holds 2 full bio suits which will protect you from viruses." - cost = 2000 + cost = 1500 contains = list(/obj/item/clothing/head/bio_hood, /obj/item/clothing/head/bio_hood, /obj/item/clothing/suit/bio_suit, @@ -83,7 +90,7 @@ /datum/supply_pack/emergency/equipment name = "Emergency Bot/Internals Crate" desc = "Explosions got you down? These supplies are guaranteed to patch up holes, in stations and people alike! Comes with two floorbots, two medbots, five oxygen masks and five small oxygen tanks." - cost = 3500 + cost = 1500 contains = list(/mob/living/simple_animal/bot/floorbot, /mob/living/simple_animal/bot/floorbot, /mob/living/simple_animal/bot/medbot, @@ -104,7 +111,7 @@ /datum/supply_pack/emergency/medical name = "Emergency Medical Crate" desc = "For when the shit hits the fan and medical can't keep up. Comes with a 7x5 Medical capsule and 2 Medibots for emergencies." - cost = 3500 + cost = 1100 contains = list(/mob/living/simple_animal/bot/medbot, /mob/living/simple_animal/bot/medbot, /obj/item/survivalcapsule/medical) @@ -114,7 +121,7 @@ /datum/supply_pack/emergency/bomb name = "Explosive Emergency Crate" desc = "Science gone bonkers? Beeping behind the airlock? Buy now and be the hero the station des... I mean needs! (time not included)" - cost = 1500 + cost = 800 contains = list(/obj/item/clothing/head/bomb_hood, /obj/item/clothing/suit/bomb_suit, /obj/item/clothing/mask/gas, @@ -125,44 +132,53 @@ /datum/supply_pack/emergency/firefighting name = "Firefighting Crate" - desc = "Only you can prevent station fires. Partner up with two firefighter suits, gas masks, flashlights, large oxygen tanks, extinguishers, and hardhats!" - cost = 1000 + desc = "Only you can prevent station fires. Partner up with three firefighter suits, gas masks, flashlights, large oxygen tanks, extinguishers, and hardhats!" + cost = 800 contains = list(/obj/item/clothing/suit/fire/firefighter, + /obj/item/clothing/suit/fire/firefighter, /obj/item/clothing/suit/fire/firefighter, /obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas, + /obj/item/clothing/mask/gas, + /obj/item/flashlight, /obj/item/flashlight, /obj/item/flashlight, /obj/item/tank/internals/oxygen/red, /obj/item/tank/internals/oxygen/red, + /obj/item/tank/internals/oxygen/red, /obj/item/extinguisher/advanced, /obj/item/extinguisher/advanced, + /obj/item/extinguisher/advanced, + /obj/item/clothing/head/hardhat/red, /obj/item/clothing/head/hardhat/red, /obj/item/clothing/head/hardhat/red) crate_name = "firefighting crate" /datum/supply_pack/emergency/atmostank name = "Firefighting Tank Backpack" - desc = "Mow down fires with this high-capacity fire fighting tank backpack. Requires Atmospherics access to open." + desc = "Mow down fires with this high-capacity fire fighting tank backpack." cost = 1000 - access = ACCESS_ATMOSPHERICS contains = list(/obj/item/watertank/atmos) crate_name = "firefighting backpack crate" crate_type = /obj/structure/closet/crate/secure /datum/supply_pack/emergency/internals name = "Internals Crate" - desc = "Master your life energy and control your breathing with three breath masks, three emergency oxygen tanks and three large air tanks."//IS THAT A - cost = 1000 + desc = "Master your life energy and control your breathing with four breath masks, four emergency oxygen tanks and four large air tanks."//IS THAT A + cost = 800 contains = list(/obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas, + /obj/item/clothing/mask/gas, + /obj/item/clothing/mask/breath, /obj/item/clothing/mask/breath, /obj/item/clothing/mask/breath, /obj/item/clothing/mask/breath, /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/tank/internals/air, /obj/item/tank/internals/air, /obj/item/tank/internals/air, /obj/item/tank/internals/air) @@ -172,52 +188,14 @@ /datum/supply_pack/emergency/metalfoam name = "Metal Foam Grenade Crate" desc = "Seal up those pesky hull breaches with 7 Metal Foam Grenades." - cost = 1000 + cost = 700 contains = list(/obj/item/storage/box/metalfoam) crate_name = "metal foam grenade crate" -/datum/supply_pack/emergency/syndicate - name = "NULL_ENTRY" - desc = "(#@&^$THIS PACKAGE CONTAINS 30TC WORTH OF SOME RANDOM SYNDICATE GEAR WE HAD LYING AROUND THE WAREHOUSE. GIVE EM HELL, OPERATIVE, BUT DON'T GET GREEDY- ORDER TOO MANY AND WE'LL BE SENDING OUR DEADLIEST ENFORCERS TO INVESTIGATE@&!*() " - hidden = TRUE - cost = 20000 - contains = list() - crate_name = "emergency crate" - crate_type = /obj/structure/closet/crate/internals - dangerous = TRUE - var/beepsky_chance = -1 - var/level = 1 - -/datum/supply_pack/emergency/syndicate/fill(obj/structure/closet/crate/C) - var/crate_value = 30 - var/list/uplink_items = get_uplink_items(SSticker.mode) - beepsky_chance += min(level, 5) //1% chance per crate an item will be replaced with a beepsky and the crate stops spawning items. Doesnt act as a hardcap, making nullcrates far riskier and less predictable - while(crate_value) - if(prob(beepsky_chance) && prob(50)) - new /mob/living/simple_animal/bot/secbot/grievous/nullcrate(C) - crate_value = 0 - beepsky_chance = 0 - level += 1 - var/category = pick(uplink_items) - var/item = pick(uplink_items[category]) - var/datum/uplink_item/I = uplink_items[category][item] - if(!I.surplus_nullcrates || prob(100 - I.surplus_nullcrates)) - continue - if(crate_value < I.cost) - continue - crate_value -= I.cost - new I.item(C) - var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control - if(istype(loneop)) - loneop.weight += 7 - message_admins("a NULL_ENTRY crate has shipped, increasing the weight of the Lone Operative event to [loneop.weight]") - log_game("a NULL_ENTRY crate has shipped, increasing the weight of the Lone Operative event to [loneop.weight]") - /datum/supply_pack/emergency/plasma_spacesuit name = "Plasmaman Space Envirosuits" desc = "Contains two space-worthy envirosuits for Plasmamen. Order now and we'll throw in two free helmets! Requires EVA access to open." - cost = 4000 - access = ACCESS_EVA + cost = 1400 // 500 per suit, equal to normal space suits. contains = list(/obj/item/clothing/suit/space/eva/plasmaman, /obj/item/clothing/suit/space/eva/plasmaman, /obj/item/clothing/head/helmet/space/plasmaman, @@ -227,20 +205,23 @@ /datum/supply_pack/emergency/plasmaman name = "Plasmaman Supply Kit" - desc = "Keep those Plasmamen alive with two sets of Plasmaman outfits. Each set contains a plasmaman jumpsuit, internals tank, and helmet." - cost = 2000 + desc = "Keep those Plasmamen alive with three sets of Plasmaman outfits. Each set contains a plasmaman jumpsuit, internals tank, and helmet." + cost = 700 //50 credits per suit. contains = list(/obj/item/clothing/under/plasmaman, /obj/item/clothing/under/plasmaman, + /obj/item/clothing/under/plasmaman, + /obj/item/tank/internals/plasmaman/belt/full, /obj/item/tank/internals/plasmaman/belt/full, /obj/item/tank/internals/plasmaman/belt/full, /obj/item/clothing/head/helmet/space/plasmaman, + /obj/item/clothing/head/helmet/space/plasmaman, /obj/item/clothing/head/helmet/space/plasmaman) crate_name = "plasmaman supply kit" /datum/supply_pack/emergency/radiation name = "Radiation Protection Crate" desc = "Survive the Nuclear Apocalypse and Supermatter Engine alike with two sets of Radiation suits. Each set contains a helmet, suit, and Geiger counter. We'll even throw in a bottle of vodka and some glasses too, considering the life-expectancy of people who order this." - cost = 1000 + cost = 800 contains = list(/obj/item/clothing/head/radiation, /obj/item/clothing/head/radiation, /obj/item/clothing/suit/radiation, @@ -255,21 +236,35 @@ /datum/supply_pack/emergency/spacesuit name = "Space Suit Crate" - desc = "Contains one aging suit from Space-Goodwill and a jetpack. Requires EVA access to open." - cost = 2500 - access = ACCESS_EVA + desc = "Contains one aging suit from Space-Goodwill." + cost = 900 //500 credits per 1 suit contains = list(/obj/item/clothing/suit/space, /obj/item/clothing/head/helmet/space, - /obj/item/clothing/mask/breath, - /obj/item/tank/jetpack/carbondioxide) + /obj/item/clothing/mask/breath) crate_name = "space suit crate" crate_type = /obj/structure/closet/crate/secure +/datum/supply_pack/emergency/spacesuit/bulk + name = "Bulk Space Suit Crate" + desc = "Contains three aging suits from Space-Goodwill." + cost = 1600 //20% discount + contains = list(/obj/item/clothing/suit/space, + /obj/item/clothing/head/helmet/space, + /obj/item/clothing/mask/breath, + /obj/item/clothing/suit/space, + /obj/item/clothing/head/helmet/space, + /obj/item/clothing/mask/breath, + /obj/item/clothing/suit/space, + /obj/item/clothing/head/helmet/space, + /obj/item/clothing/mask/breath) + crate_name = "bulk space suit crate" + crate_type = /obj/structure/closet/crate/secure + /datum/supply_pack/emergency/specialops name = "Special Ops Supplies" - desc = "(*!&@#TOO CHEAP FOR THAT NULL_ENTRY, HUH OPERATIVE? WELL, THIS LITTLE ORDER CAN STILL HELP YOU OUT IN A PINCH. CONTAINS A BOX OF FIVE EMP GRENADES, THREE SMOKEBOMBS, AN INCENDIARY GRENADE, AND A \"SLEEPY PEN\" FULL OF NICE TOXINS!#@*$" + desc = "(*!&@#SAD ABOUT THAT NULL_ENTRY, HUH OPERATIVE? WELL, THIS LITTLE ORDER CAN STILL HELP YOU OUT IN A PINCH. CONTAINS A BOX OF FIVE EMP GRENADES, THREE SMOKEBOMBS, AN INCENDIARY GRENADE, AND A \"SLEEPY PEN\" FULL OF NICE TOXINS!#@*$" hidden = TRUE - cost = 2000 + cost = 800 contains = list(/obj/item/storage/box/emps, /obj/item/grenade/smokebomb, /obj/item/grenade/smokebomb, @@ -282,7 +277,7 @@ /datum/supply_pack/emergency/weedcontrol name = "Weed Control Crate" desc = "Keep those invasive species OUT. Contains a scythe, gasmask, and two anti-weed chemical grenades. Warranty void if used on ambrosia. Requires Hydroponics access to open." - cost = 1500 + cost = 800 access = ACCESS_HYDROPONICS contains = list(/obj/item/scythe, /obj/item/clothing/mask/gas, @@ -300,30 +295,16 @@ access = ACCESS_SECURITY crate_type = /obj/structure/closet/crate/secure/gear -/datum/supply_pack/security/ammo - name = "Ammo Crate" - desc = "Contains two 20-round magazines for the WT-550 Auto Rifle, three boxes of buckshot ammo, three boxes of rubber ammo and special .38 speedloarders. Requires Security access to open." - cost = 2500 - contains = list(/obj/item/ammo_box/magazine/wt550m9, - /obj/item/ammo_box/magazine/wt550m9, - /obj/item/storage/box/lethalshot, - /obj/item/storage/box/lethalshot, - /obj/item/storage/box/lethalshot, - /obj/item/storage/box/rubbershot, - /obj/item/storage/box/rubbershot, - /obj/item/storage/box/rubbershot, - /obj/item/ammo_box/c38/trac, - /obj/item/ammo_box/c38/hotshot, - /obj/item/ammo_box/c38/iceblox) - crate_name = "ammo crate" - /datum/supply_pack/security/armor name = "Armor Crate" - desc = "Three vests of well-rounded, decently-protective armor. Requires Security access to open." - cost = 1000 + desc = "Three vests of well-rounded, decently-protective armor and 3 brain buckets. Requires Security access to open." + cost = 1500 contains = list(/obj/item/clothing/suit/armor/vest, /obj/item/clothing/suit/armor/vest, - /obj/item/clothing/suit/armor/vest) + /obj/item/clothing/suit/armor/vest, + /obj/item/clothing/head/helmet/sec, + /obj/item/clothing/head/helmet/sec, + /obj/item/clothing/head/helmet/sec) crate_name = "armor crate" /datum/supply_pack/security/disabler @@ -335,10 +316,20 @@ /obj/item/gun/energy/disabler) crate_name = "disabler crate" +/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 + small_item = TRUE + 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/forensics name = "Forensics Crate" desc = "Stay hot on the criminal's heels with Nanotrasen's Detective Essentials(tm). Contains a forensics scanner, six evidence bags, camera, tape recorder, white crayon, and of course, a fedora. Requires Security access to open." - cost = 2000 + cost = 1700 contains = list(/obj/item/detective_scanner, /obj/item/storage/box/evidence, /obj/item/camera, @@ -347,24 +338,25 @@ /obj/item/clothing/head/fedora/det_hat) crate_name = "forensics crate" -/datum/supply_pack/security/helmets - name = "Helmets Crate" - desc = "Contains three standard-issue brain buckets. Requires Security access to open." - cost = 1000 - contains = list(/obj/item/clothing/head/helmet/sec, - /obj/item/clothing/head/helmet/sec, - /obj/item/clothing/head/helmet/sec) - crate_name = "helmet crate" - /datum/supply_pack/security/laser name = "Lasers Crate" desc = "Contains three lethal, high-energy laser guns. Requires Security access to open." - cost = 2000 + cost = 1800 contains = list(/obj/item/gun/energy/laser, /obj/item/gun/energy/laser, /obj/item/gun/energy/laser) crate_name = "laser 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 + small_item = TRUE + 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/securitybarriers name = "Security Barrier Grenades" desc = "Stem the tide with four Security Barrier grenades. Requires Security access to open." @@ -372,13 +364,13 @@ /obj/item/grenade/barrier, /obj/item/grenade/barrier, /obj/item/grenade/barrier) - cost = 2000 + cost = 1500 crate_name = "security barriers crate" /datum/supply_pack/security/securityclothes name = "Security Clothing Crate" desc = "Contains appropriate outfits for the station's private security force. Contains outfits for the Warden, Head of Security, and two Security Officers. Each outfit comes with a rank-appropriate jumpsuit, suit, and beret. Requires Security access to open." - cost = 3000 + cost = 1700 contains = list(/obj/item/clothing/under/rank/security/officer/formal, /obj/item/clothing/under/rank/security/officer/formal, /obj/item/clothing/suit/security/officer, @@ -393,10 +385,24 @@ /obj/item/clothing/head/beret/sec/navyhos) crate_name = "security clothing 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 + small_item = TRUE + contains = list(/obj/item/grenade/stingbang) + /datum/supply_pack/security/supplies name = "Security Supplies Crate" desc = "Contains seven flashbangs, seven teargas grenades, six flashes, and seven handcuffs. Requires Security access to open." - cost = 1000 + cost = 700 contains = list(/obj/item/storage/box/flashbangs, /obj/item/storage/box/teargas, /obj/item/storage/box/flashes, @@ -406,14 +412,14 @@ /datum/supply_pack/security/vending/security name = "SecTech Supply Crate" desc = "Officer Paul bought all the donuts? Then refill the security vendor with ths crate." - cost = 1500 + cost = 1200 contains = list(/obj/item/vending_refill/security) crate_name = "SecTech supply crate" /datum/supply_pack/security/firingpins name = "Standard Firing Pins Crate" desc = "Upgrade your arsenal with 10 standard firing pins. Requires Security access to open." - cost = 2000 + cost = 1700 contains = list(/obj/item/storage/box/firingpins, /obj/item/storage/box/firingpins) crate_name = "firing pins crate" @@ -421,7 +427,7 @@ /datum/supply_pack/security/firingpins/paywall name = "Paywall Firing Pins Crate" desc = "Specialized firing pins with a built-in configurable paywall. Requires Security access to open." - cost = 2500 + cost = 1700 contains = list(/obj/item/storage/box/firingpins/paywall, /obj/item/storage/box/firingpins/paywall) crate_name = "paywall firing pins crate" @@ -429,7 +435,7 @@ /datum/supply_pack/security/justiceinbound name = "Standard Justice Enforcer Crate" desc = "This is it. The Bee's Knees. The Creme of the Crop. The Pick of the Litter. The best of the best of the best. The Crown Jewel of Nanotrasen. The Alpha and the Omega of security headwear. Guaranteed to strike fear into the hearts of each and every criminal aboard the station. Also comes with a security gasmask. Requires Security access to open." - cost = 6000 //justice comes at a price. An expensive, noisy price. + cost = 5700 //justice comes at a price. An expensive, noisy price. contraband = TRUE contains = list(/obj/item/clothing/head/helmet/justice, /obj/item/clothing/mask/gas/sechailer) @@ -438,7 +444,7 @@ /datum/supply_pack/security/baton name = "Stun Batons Crate" desc = "Arm the Civil Protection Forces with three stun batons. Batteries included. Requires Security access to open." - cost = 1000 + cost = 900 contains = list(/obj/item/melee/baton/loaded, /obj/item/melee/baton/loaded, /obj/item/melee/baton/loaded) @@ -446,9 +452,10 @@ /datum/supply_pack/security/wall_flash name = "Wall-Mounted Flash Crate" - desc = "Contains four wall-mounted flashes. Requires Security access to open." - cost = 1000 + desc = "Contains five wall-mounted flashes. Requires Security access to open." + cost = 800 contains = list(/obj/item/storage/box/wall_flash, + /obj/item/storage/box/wall_flash, /obj/item/storage/box/wall_flash, /obj/item/storage/box/wall_flash, /obj/item/storage/box/wall_flash) @@ -463,40 +470,50 @@ access = ACCESS_ARMORY crate_type = /obj/structure/closet/crate/secure/weapon +/datum/supply_pack/security/ammo + name = "Ammo Crate" + desc = "Contains two 20-round magazines for the WT-550 Auto Rifle, three boxes of buckshot ammo, three boxes of rubber ammo and special .38 speedloaders. Requires Security access to open." + cost = 2500 + contains = list(/obj/item/ammo_box/magazine/wt550m9, + /obj/item/ammo_box/magazine/wt550m9, + /obj/item/storage/box/lethalshot, + /obj/item/storage/box/lethalshot, + /obj/item/storage/box/lethalshot, + /obj/item/storage/box/rubbershot, + /obj/item/storage/box/rubbershot, + /obj/item/storage/box/rubbershot, + /obj/item/ammo_box/c38/trac, + /obj/item/ammo_box/c38/hotshot, + /obj/item/ammo_box/c38/iceblox) + crate_name = "ammo crate" + /datum/supply_pack/security/armory/bulletarmor name = "Bulletproof Armor Crate" desc = "Contains three sets of bulletproof armor. Guaranteed to reduce a bullet's stopping power by over half. Requires Armory access to open." - cost = 1500 + cost = 1200 contains = list(/obj/item/clothing/suit/armor/bulletproof, /obj/item/clothing/suit/armor/bulletproof, /obj/item/clothing/suit/armor/bulletproof) crate_name = "bulletproof armor crate" -/datum/supply_pack/security/armory/cling_test - name = "Changeling Testing Kit" - desc = "Contains a single bottle of concentrated BZ, used for detecting and incapacitating changelings. Due to the rarity of this chemical, the cost is extortionate, and security personnel are recommended to visit their local chemistry department instead if possible. Requires Armory access to open." - cost = 10000 - contains = list(/obj/item/reagent_containers/glass/bottle/concentrated_bz) - crate_name = "Changeling testing kit crate" - /datum/supply_pack/security/armory/chemimp name = "Chemical Implants Crate" desc = "Contains five Remote Chemical implants. Requires Armory access to open." - cost = 2000 + cost = 700 contains = list(/obj/item/storage/box/chemimp) crate_name = "chemical implant crate" /datum/supply_pack/security/armory/combatknives_single name = "Combat Knife Single-Pack" desc = "Contains one sharpened combat knive. Guaranteed to fit snugly inside any Nanotrasen-standard boot. Requires Armory access to open." - cost = 1200 + cost = 700 // 300 credits per 1 knife small_item = TRUE contains = list(/obj/item/kitchen/knife/combat) /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 = 3000 + cost = 1120 //20% discount contains = list(/obj/item/kitchen/knife/combat, /obj/item/kitchen/knife/combat, /obj/item/kitchen/knife/combat) @@ -505,7 +522,7 @@ /datum/supply_pack/security/armory/ballistic_single name = "Combat Shotgun Single-Pack" desc = "For when the enemy absolutely needs to be replaced with lead. Contains one Aussec-designed Combat Shotgun, and one Shotgun Bandolier. Requires Armory access to open." - cost = 3200 + cost = 2900 //2500 credits per shotgun small_item = TRUE contains = list(/obj/item/gun/ballistic/shotgun/automatic/combat, /obj/item/storage/belt/bandolier) @@ -513,7 +530,7 @@ /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, and three Shotgun Bandoliers. Requires Armory access to open." - cost = 8000 + cost = 6400 //20% discount contains = list(/obj/item/gun/ballistic/shotgun/automatic/combat, /obj/item/gun/ballistic/shotgun/automatic/combat, /obj/item/gun/ballistic/shotgun/automatic/combat, @@ -525,13 +542,13 @@ /datum/supply_pack/security/armory/riot_shotgun_single name = "Riot Shotgun Single-Pack" desc = "When the clown's slipped you one time too many. Requires armory access to open." - cost = 2500 + cost = 2200 //1800 credits per shotgun contains = list(/obj/item/gun/ballistic/shotgun/riot) /datum/supply_pack/security/armory/riot_shotgun name = "Riot Shotguns Crate" desc = "For when the greytide gets out of hand. Contains 3 riot shotguns. Requires armory access to open." - cost = 6500 + cost = 4720 //20% discount contains = list(/obj/item/gun/ballistic/shotgun/riot, /obj/item/gun/ballistic/shotgun/riot, /obj/item/gun/ballistic/shotgun/riot) @@ -546,32 +563,34 @@ crate_name = "\improper DRAGnet crate" /datum/supply_pack/security/armory/energy_single - name = "Energy Guns Single-Pack" + name = "Energy Gun Single-Pack" desc = "Contains one Energy Gun, capable of firing both nonlethal and lethal blasts of light. Requires Armory access to open." - cost = 1500 + cost = 1200 small_item = TRUE contains = list(/obj/item/gun/energy/e_gun) + crate_name = "single energy gun crate" /datum/supply_pack/security/armory/energy - name = "Energy Guns Crate" - desc = "Contains two Energy Guns, capable of firing both nonlethal and lethal blasts of light. Requires Armory access to open." - cost = 2500 + name = "Bulk Energy Guns Crate" + desc = "Contains three Energy Guns, capable of firing both nonlethal and lethal blasts of light. Requires Armory access to open." + cost = 2320 //20% contains = list(/obj/item/gun/energy/e_gun, + /obj/item/gun/energy/e_gun, /obj/item/gun/energy/e_gun) - crate_name = "energy gun crate" + crate_name = "bulk energy guns crate" crate_type = /obj/structure/closet/crate/secure/plasma /datum/supply_pack/security/armory/exileimp name = "Exile Implants Crate" desc = "Contains five Exile implants. Requires Armory access to open." - cost = 3000 + cost = 2700 contains = list(/obj/item/storage/box/exileimp) crate_name = "exile implant crate" /datum/supply_pack/security/armory/fire name = "Incendiary Weapons Crate" desc = "Burn, baby burn. Contains three incendiary grenades, three plasma canisters, and a flamethrower. Requires Armory access to open." - cost = 1500 + cost = 1200 access = ACCESS_HEADS contains = list(/obj/item/flamethrower/full, /obj/item/tank/internals/plasma, @@ -591,7 +610,7 @@ contains = list(/obj/item/survivalcapsule/barricade, /obj/item/survivalcapsule/barricade, /obj/item/survivalcapsule/barricade) - cost = 2500 + cost = 2000 crate_name = "security barriers crate XL" /datum/supply_pack/security/armory/mindshield @@ -604,7 +623,7 @@ /datum/supply_pack/security/armory/trackingimp name = "Tracking Implants Crate" desc = "Contains four tracking implants and three tracking speedloaders of tracing .38 ammo. Requires Armory access to open." - cost = 2000 + cost = 1200 contains = list(/obj/item/storage/box/trackimp, /obj/item/ammo_box/c38/trac, /obj/item/ammo_box/c38/trac, @@ -622,26 +641,20 @@ /datum/supply_pack/security/armory/riotarmor name = "Riot Armor Crate" - desc = "Contains three sets of heavy body armor. Advanced padding protects against close-ranged weaponry, making melee attacks feel only half as potent to the user. Requires Armory access to open." - cost = 1500 + desc = "Contains three sets of heavy body armor and helmets. Advanced padding protects against close-ranged weaponry, making melee attacks feel only half as potent to the user. Requires Armory access to open." + cost = 2200 contains = list(/obj/item/clothing/suit/armor/riot, /obj/item/clothing/suit/armor/riot, - /obj/item/clothing/suit/armor/riot) - crate_name = "riot armor crate" - -/datum/supply_pack/security/armory/riothelmets - name = "Riot Helmets Crate" - desc = "Contains three riot helmets. Requires Armory access to open." - cost = 1500 - contains = list(/obj/item/clothing/head/helmet/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) - crate_name = "riot helmets crate" + crate_name = "riot armor crate" /datum/supply_pack/security/armory/riotshields name = "Riot Shields Crate" desc = "For when the greytide gets really uppity. Contains three riot shields. Requires Armory access to open." - cost = 2000 + cost = 1500 contains = list(/obj/item/shield/riot, /obj/item/shield/riot, /obj/item/shield/riot) @@ -650,7 +663,7 @@ /datum/supply_pack/security/armory/russian name = "Russian Surplus Crate" desc = "Hello Comrade, we have the most modern russian military equipment the black market can offer, for the right price of course. Sadly we couldnt remove the lock so it requires Armory access to open." - cost = 5000 + cost = 4000 contraband = TRUE contains = list(/obj/item/reagent_containers/food/snacks/rationpack, /obj/item/ammo_box/a762, @@ -672,10 +685,11 @@ for(var/i in 1 to 10) var/item = pick(contains) new item(C) + /datum/supply_pack/security/armory/smartmine name = "Smart Mine Crate" desc = "Contains three nonlethal pressure activated stun mines capable of ignoring mindshieled personnel. Requires Armory access to open." - cost = 4000 + cost = 2500 contains = list(/obj/item/deployablemine/smartstun, /obj/item/deployablemine/smartstun, /obj/item/deployablemine/smartstun) @@ -684,17 +698,18 @@ /datum/supply_pack/security/armory/stunmine name = "Stun Mine Crate" desc = "Contains five nonlethal pressure activated stun mines. Requires Armory access to open." - cost = 2500 + cost = 2000 contains = list(/obj/item/deployablemine/stun, /obj/item/deployablemine/stun, /obj/item/deployablemine/stun, /obj/item/deployablemine/stun, /obj/item/deployablemine/stun) crate_name = "stun mine create" + /datum/supply_pack/security/armory/swat name = "SWAT Crate" desc = "Contains two fullbody sets of tough, fireproof, pressurized suits designed in a joint effort by IS-ERI and Nanotrasen. Each set contains a suit, helmet, mask, combat belt, and combat gloves. Requires Armory access to open." - cost = 6000 + cost = 5000 contains = list(/obj/item/clothing/head/helmet/swat/nanotrasen, /obj/item/clothing/head/helmet/swat/nanotrasen, /obj/item/clothing/suit/space/swat, @@ -710,34 +725,28 @@ /datum/supply_pack/security/armory/wt550_single name = "WT-550 Auto Rifle Single-Pack" desc = "Contains one high-powered, semiautomatic rifles chambered in 4.6x30mm. Requires Armory access to open." - cost = 2000 + cost = 1600 // 1200 per 1 gun contains = list(/obj/item/gun/ballistic/automatic/wt550) small_item = TRUE /datum/supply_pack/security/armory/wt550 name = "WT-550 Auto Rifle Crate" desc = "Contains two high-powered, semiautomatic rifles chambered in 4.6x30mm. Requires Armory access to open." - cost = 3500 + cost = 3280 //20% contains = list(/obj/item/gun/ballistic/automatic/wt550, + /obj/item/gun/ballistic/automatic/wt550, /obj/item/gun/ballistic/automatic/wt550) crate_name = "auto rifle crate" /datum/supply_pack/security/armory/wt550ammo name = "WT-550 Auto Rifle Ammo Crate" desc = "Contains four 20-round magazine for the WT-550 Auto Rifle. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." - cost = 3000 + cost = 1500 contains = list(/obj/item/ammo_box/magazine/wt550m9, /obj/item/ammo_box/magazine/wt550m9, /obj/item/ammo_box/magazine/wt550m9, /obj/item/ammo_box/magazine/wt550m9) -/datum/supply_pack/security/armory/wt550ammo_single - name = "WT-550 Auto Rifle Ammo Single-Pack" - desc = "Contains a 20-round magazine for the WT-550 Auto Rifle. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." - cost = 750 //one of the few single-pack items that who's price per unit is the exact same as the bulk - contains = list(/obj/item/ammo_box/magazine/wt550m9) - small_item = TRUE - ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Engineering ///////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -749,7 +758,7 @@ /datum/supply_pack/engineering/shieldgen name = "Anti-breach Shield Projector Crate" desc = "Hull breaches again? Say no more with the Nanotrasen Anti-Breach Shield Projector! Uses forcefield technology to keep the air in, and the space out. Contains two shield projectors." - cost = 2500 + cost = 1000 contains = list(/obj/machinery/shieldgen, /obj/machinery/shieldgen) crate_name = "anti-breach shield projector crate" @@ -757,7 +766,7 @@ /datum/supply_pack/engineering/ripley name = "APLU MK-I Crate" desc = "A do-it-yourself kit for building an ALPU MK-I \"Ripley\", designed for lifting and carrying heavy equipment, and other station tasks. Batteries not included." - cost = 2000 + cost = 1500 contains = list(/obj/item/mecha_parts/chassis/ripley, /obj/item/mecha_parts/part/ripley_torso, /obj/item/mecha_parts/part/ripley_right_arm, @@ -775,7 +784,7 @@ /datum/supply_pack/engineering/conveyor name = "Conveyor Assembly Crate" desc = "Keep production moving along with thirty conveyor belts. Conveyor switch included. If you have any questions, check out the enclosed instruction book." - cost = 1500 + cost = 1200 contains = list(/obj/item/stack/conveyor/thirty, /obj/item/conveyor_switch_construct, /obj/item/paper/guides/conveyor) @@ -784,7 +793,7 @@ /datum/supply_pack/engineering/engiequipment name = "Engineering Gear Crate" desc = "Gear up with three toolbelts, high-visibility vests, welding helmets, hardhats, and two pairs of meson goggles!" - cost = 1300 + cost = 1000 contains = list(/obj/item/storage/belt/utility, /obj/item/storage/belt/utility, /obj/item/storage/belt/utility, @@ -801,27 +810,36 @@ /obj/item/clothing/glasses/meson/engine) crate_name = "engineering gear crate" -/datum/supply_pack/engineering/sologamermitts - name = "Insulated Gloves Single-Pack" - desc = "The backbone of modern society. Barely ever ordered for actual engineering. Single Order." - cost = 800 - small_item = TRUE - contains = list(/obj/item/clothing/gloves/color/yellow) - /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 = 2000 //Made of pure-grade bullshittinium + cost = 1600 //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/jetpack + name = "Jetpack Crate" + desc = "For when you need to go fast in space!" + cost = 850 + contains = list(/obj/item/tank/jetpack/carbondioxide) + crate_name = "jetpack crate" + +/datum/supply_pack/engineering/jetpack3 + name = "Bulk Jetpack Crate" + desc = "Three jetpacks, enough for the whole gang!" + cost = 1750 //20% discount + contains = list(/obj/item/tank/jetpack/carbondioxide, + /obj/item/tank/jetpack/carbondioxide, + /obj/item/tank/jetpack/carbondioxide) + crate_name = "bulk jetpack crate" + /datum/supply_pack/engineering/spacecapsule name = "Space Shelter Capsule" desc = "A crate containing an RCD, some compressed matter cartridges, and a single bluespace capsule containing a spaceworthy shelter for construction/emergencies." - cost = 2000 + cost = 1500 contains = list(/obj/item/survivalcapsule/space, /obj/item/construction/rcd, /obj/item/rcd_ammo, @@ -838,7 +856,7 @@ /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." - cost = 2000 + cost = 1500 contains = list(/obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}, /obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}) //FALSE doesn't work in modified type paths apparently. crate_name = "inducer crate" crate_type = /obj/structure/closet/crate/engineering/electrical @@ -846,7 +864,7 @@ /datum/supply_pack/engineering/pacman name = "P.A.C.M.A.N Generator Crate" desc = "Engineers can't set up the engine? Not an issue for you, once you get your hands on this P.A.C.M.A.N. Generator! Takes in plasma and spits out sweet sweet energy." - cost = 2500 + cost = 1000 contains = list(/obj/machinery/power/port_gen/pacman) crate_name = "PACMAN generator crate" crate_type = /obj/structure/closet/crate/engineering/electrical @@ -854,7 +872,7 @@ /datum/supply_pack/engineering/power name = "Power Cell Crate" desc = "Looking for power overwhelming? Look no further. Contains three high-voltage power cells." - cost = 1000 + cost = 500 contains = list(/obj/item/stock_parts/cell/high, /obj/item/stock_parts/cell/high, /obj/item/stock_parts/cell/high) @@ -880,13 +898,13 @@ /obj/item/storage/toolbox/mechanical, /obj/item/storage/toolbox/mechanical, /obj/item/storage/toolbox/mechanical) - cost = 1000 + cost = 700 crate_name = "toolbox crate" /datum/supply_pack/engineering/vending/engineering name = "Engineering Vending Crate" desc = "Sick of assistants breaking into engineering for tools? Contains one Engi-Vend refill and one YouTool refill." - cost = 2000 + cost = 1100 contains = list(/obj/item/vending_refill/engivend, /obj/item/vending_refill/tool) crate_name = "engineering vending crate" @@ -956,7 +974,7 @@ /datum/supply_pack/engineering/shuttle_construction name = "Shuttle Construction Kit" desc = "A DIY kit for building your own shuttle! Comes with all the parts you need to get your people to the stars!" - cost = 6000 + cost = 5000 contains = list( /obj/machinery/portable_atmospherics/canister/toxins, /obj/item/construction/rcd/loaded, @@ -966,7 +984,6 @@ /obj/item/pipe_dispenser, /obj/item/storage/toolbox/mechanical, /obj/item/storage/toolbox/electrical, - /obj/item/circuitboard/computer/shuttle/docker, /obj/item/circuitboard/computer/shuttle/flight_control, /obj/item/circuitboard/machine/shuttle/engine/plasma, /obj/item/circuitboard/machine/shuttle/engine/plasma, @@ -987,7 +1004,7 @@ /datum/supply_pack/engine/am_jar name = "Antimatter Containment Jar Crate" desc = "Two Antimatter containment jars stuffed into a single crate." - cost = 2000 + cost = 1700 contains = list(/obj/item/am_containment, /obj/item/am_containment) crate_name = "antimatter jar crate" @@ -995,14 +1012,14 @@ /datum/supply_pack/engine/am_core name = "Antimatter Control Crate" desc = "The brains of the Antimatter engine, this device is sure to teach the station's powergrid the true meaning of real power." - cost = 5000 + cost = 4700 contains = list(/obj/machinery/power/am_control_unit) crate_name = "antimatter control crate" /datum/supply_pack/engine/am_shielding name = "Antimatter Shielding Crate" desc = "Contains ten Antimatter shields, somehow crammed into a crate." - cost = 2000 + cost = 1700 contains = list(/obj/item/am_shielding_container, /obj/item/am_shielding_container, /obj/item/am_shielding_container, @@ -1018,7 +1035,7 @@ /datum/supply_pack/engine/emitter name = "Emitter Crate" desc = "Useful for powering forcefield generators while destroying locked crates and intruders alike. Contains two high-powered energy emitters. Requires CE access to open." - cost = 1500 + cost = 1200 access = ACCESS_CE contains = list(/obj/machinery/power/emitter, /obj/machinery/power/emitter) @@ -1029,7 +1046,7 @@ /datum/supply_pack/engine/field_gen name = "Field Generator Crate" desc = "Typically the only thing standing between the station and a messy death. Powered by emitters. Contains two field generators." - cost = 1500 + cost = 1200 contains = list(/obj/machinery/field/generator, /obj/machinery/field/generator) crate_name = "field generator crate" @@ -1037,7 +1054,7 @@ /datum/supply_pack/engine/grounding_rods name = "Grounding Rod Crate" desc = "Four grounding rods guaranteed to keep any uppity tesla's lightning under control." - cost = 1700 + cost = 700 contains = list(/obj/machinery/power/grounding_rod, /obj/machinery/power/grounding_rod, /obj/machinery/power/grounding_rod, @@ -1048,7 +1065,7 @@ /datum/supply_pack/engine/PA name = "Particle Accelerator Crate" desc = "A supermassive black hole or hyper-powered teslaball are the perfect way to spice up any party! This \"My First Apocalypse\" kit contains everything you need to build your own Particle Accelerator! Ages 10 and up." - cost = 3000 + cost = 2700 contains = list(/obj/structure/particle_accelerator/fuel_chamber, /obj/machinery/particle_accelerator/control_box, /obj/structure/particle_accelerator/particle_emitter/center, @@ -1061,7 +1078,7 @@ /datum/supply_pack/engine/collector name = "Radiation Collector Crate" desc = "Contains three radiation collectors. Useful for collecting energy off nearby Supermatter Crystals, Singularities or Teslas!" - cost = 2500 + cost = 2200 contains = list(/obj/machinery/power/rad_collector, /obj/machinery/power/rad_collector, /obj/machinery/power/rad_collector) @@ -1070,14 +1087,14 @@ /datum/supply_pack/engine/sing_gen name = "Singularity Generator Crate" desc = "The key to unlocking the power of Lord Singuloth. Particle Accelerator not included." - cost = 5000 + cost = 4700 contains = list(/obj/machinery/the_singularitygen) crate_name = "singularity generator crate" /datum/supply_pack/engine/solar name = "Solar Panel Crate" desc = "Go green with this DIY advanced solar array. Contains twenty one solar assemblies, a solar-control circuit board, and tracker. If you have any questions, please check out the enclosed instruction book." - cost = 2000 + cost = 1700 contains = list(/obj/item/solar_assembly, /obj/item/solar_assembly, /obj/item/solar_assembly, @@ -1118,7 +1135,7 @@ /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!" - cost = 2500 + cost = 1200 contains = list(/obj/machinery/power/tesla_coil, /obj/machinery/power/tesla_coil, /obj/machinery/power/tesla_coil, @@ -1154,6 +1171,17 @@ contains = list(/obj/item/stack/sheet/glass/fifty) crate_name = "glass sheets crate" +/datum/supply_pack/materials/glass250 + name = "250 Glass Sheets" + desc = "Holy SHEET thats a lot of glass!" + cost = 2800 //20% + contains = list(/obj/item/stack/sheet/glass/fifty, + /obj/item/stack/sheet/glass/fifty, + /obj/item/stack/sheet/glass/fifty, + /obj/item/stack/sheet/glass/fifty, + /obj/item/stack/sheet/glass/fifty) + crate_name = "bulk glass sheets crate" + /datum/supply_pack/materials/iron50 name = "50 Iron Sheets" desc = "Any construction project begins with a good stack of fifty iron sheets!" @@ -1161,38 +1189,63 @@ contains = list(/obj/item/stack/sheet/iron/fifty) crate_name = "iron sheets crate" +/datum/supply_pack/materials/iron250 + name = "250 Iron Sheets" + desc = "Enough Iron to rebuild half a station!" + cost = 2800 //20% + contains = list(/obj/item/stack/sheet/iron/fifty, + /obj/item/stack/sheet/iron/fifty, + /obj/item/stack/sheet/iron/fifty, + /obj/item/stack/sheet/iron/fifty, + /obj/item/stack/sheet/iron/fifty) + crate_name = "bulk iron sheets crate" + /datum/supply_pack/materials/plasteel20 name = "20 Plasteel Sheets" desc = "Reinforce the station's integrity with twenty plasteel sheets!" - cost = 7500 + cost = 7200 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 = 16500 + cost = 14000 // 20% discount contains = list(/obj/item/stack/sheet/plasteel/fifty) crate_name = "plasteel sheets crate" +/datum/supply_pack/materials/copper20 + name = "20 Copper Sheets" + desc = "Makes your floors look nice and your circuitry run!" + cost = 1000 + contains = list(/obj/item/stack/sheet/mineral/copper/twenty) + crate_name = "copper sheets crate" + +/datum/supply_pack/materials/copper50 + name = "50 Copper Sheets" + desc = "Makes your floors look nice and your circuitry run!" + cost = 1600 //20% discount + contains = list(/obj/item/stack/sheet/mineral/copper/fifty) + crate_name = "bulk copper sheets crate" + /datum/supply_pack/materials/plastic50 name = "50 Plastic Sheets" desc = "Build a limitless amount of toys with fifty plastic sheets!" - cost = 1000 + cost = 800 contains = list(/obj/item/stack/sheet/plastic/fifty) crate_name = "plastic sheets crate" /datum/supply_pack/materials/sandstone30 name = "30 Sandstone Blocks" desc = "Neither sandy nor stoney, these thirty blocks will still get the job done." - cost = 1000 + cost = 800 contains = list(/obj/item/stack/sheet/mineral/sandstone/thirty) crate_name = "sandstone blocks crate" /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 = 2000 + cost = 1700 contains = list(/obj/item/stack/sheet/mineral/wood/fifty) crate_name = "wood planks crate" @@ -1208,7 +1261,7 @@ /datum/supply_pack/materials/carbon_dio name = "Carbon Dioxide Canister" desc = "Contains a canister of Carbon Dioxide." - cost = 3000 + cost = 1200 contains = list(/obj/machinery/portable_atmospherics/canister/carbon_dioxide) crate_name = "carbon dioxide canister crate" crate_type = /obj/structure/closet/crate/large @@ -1240,7 +1293,7 @@ /datum/supply_pack/materials/nitrogen name = "Nitrogen Canister" desc = "Contains a canister of Nitrogen." - cost = 2000 + cost = 800 contains = list(/obj/machinery/portable_atmospherics/canister/nitrogen) crate_name = "nitrogen canister crate" crate_type = /obj/structure/closet/crate/large @@ -1248,7 +1301,7 @@ /datum/supply_pack/materials/nitrous_oxide_canister name = "Nitrous Oxide Canister" desc = "Contains a canister of Nitrous Oxide. Requires Atmospherics access to open." - cost = 3000 + cost = 2400 access = ACCESS_ATMOSPHERICS contains = list(/obj/machinery/portable_atmospherics/canister/nitrous_oxide) crate_name = "nitrous oxide canister crate" @@ -1257,7 +1310,7 @@ /datum/supply_pack/materials/oxygen name = "Oxygen Canister" desc = "Contains a canister of Oxygen. Canned in Druidia." - cost = 1500 + cost = 800 contains = list(/obj/machinery/portable_atmospherics/canister/oxygen) crate_name = "oxygen canister crate" crate_type = /obj/structure/closet/crate/large @@ -1265,7 +1318,7 @@ /datum/supply_pack/materials/watertank name = "Water Tank Crate" desc = "Contains a tank of dihydrogen monoxide... sounds dangerous." - cost = 600 + cost = 750 contains = list(/obj/structure/reagent_dispensers/watertank) crate_name = "water tank crate" crate_type = /obj/structure/closet/crate/large @@ -1289,7 +1342,7 @@ /datum/supply_pack/medical/bloodpacks name = "Blood Pack Variety Crate" desc = "Contains eight different blood packs for reintroducing blood to patients." - cost = 3500 + cost = 700 contains = list(/obj/item/reagent_containers/blood, /obj/item/reagent_containers/blood, /obj/item/reagent_containers/blood/APlus, @@ -1299,14 +1352,15 @@ /obj/item/reagent_containers/blood/OPlus, /obj/item/reagent_containers/blood/OMinus, /obj/item/reagent_containers/blood/lizard, - /obj/item/reagent_containers/blood/ethereal) + /obj/item/reagent_containers/blood/ethereal, + /obj/item/reagent_containers/blood/oozeling) crate_name = "blood freezer" crate_type = /obj/structure/closet/crate/freezer /datum/supply_pack/medical/synthflesh name = "Synthflesh resupply pack" desc = "Contains four 100u cartons of synthflesh in case the cloner ran out of it." - cost = 3000 + cost = 1400 contains = list(/obj/item/reagent_containers/food/drinks/bottle/synthflesh, /obj/item/reagent_containers/food/drinks/bottle/synthflesh, /obj/item/reagent_containers/food/drinks/bottle/synthflesh, @@ -1314,24 +1368,60 @@ crate_name = "rusty freezer" crate_type = /obj/structure/closet/crate/freezer -/datum/supply_pack/medical/firstaidbruises_single - name = "Bruise Treatment Kit Single-Pack" - desc = "Contains one first aid kit focused on healing bruises and broken bones." - cost = 330 +/datum/supply_pack/medical/basickits + name = "Basic Treatment Kits Crate" + desc = "Contains three basic aid kits focused on basic types of damage in a simple way." + cost = 1400 small_item = TRUE - contains = list(/obj/item/storage/firstaid/brute) + contains = list(/obj/item/storage/firstaid/regular, + /obj/item/storage/firstaid/regular, + /obj/item/storage/firstaid/regular) + crate_name = "basic wound treatment kits crate" + +/datum/supply_pack/medical/bruisekits + name = "Bruise Treatment Kits Crate" + desc = "Contains three first aid kits focused on healing bruises and broken bones." + cost = 1400 + small_item = TRUE + contains = list(/obj/item/storage/firstaid/brute, + /obj/item/storage/firstaid/brute, + /obj/item/storage/firstaid/brute) + crate_name = "brute treatment kits crate" + +/datum/supply_pack/medical/burnkits + name = "Burn Treatment Kits Crate" + desc = "Contains three first aid kits focused on healing severe burns." + cost = 1400 + small_item = TRUE + contains = list(/obj/item/storage/firstaid/fire, + /obj/item/storage/firstaid/fire, + /obj/item/storage/firstaid/fire) + crate_name = "burn treatment kits crate" + +/datum/supply_pack/medical/oxylosskits + name = "Oxygen Deprivation Kits Crate" + desc = "Contains three first aid kits focused on helping oxygen deprivation victims." + cost = 1400 + small_item = TRUE + contains = list(/obj/item/storage/firstaid/o2, + /obj/item/storage/firstaid/o2, + /obj/item/storage/firstaid/o2) + crate_name = "oxygen deprivation treatment kits crate" -/datum/supply_pack/medical/firstaidburns_single - name = "Burn Treatment Kit Single-Pack" - desc = "Contains one first aid kit focused on healing severe burns." - cost = 330 +/datum/supply_pack/medical/toxinkits + name = "Toxin Treatment Kits Crate" + desc = "Contains three first aid kits focused on healing damage dealt by heavy toxins." + cost = 1400 small_item = TRUE - contains = list(/obj/item/storage/firstaid/fire) + contains = list(/obj/item/storage/firstaid/toxin, + /obj/item/storage/firstaid/toxin, + /obj/item/storage/firstaid/toxin) + crate_name = "toxin treatment kits crate" /datum/supply_pack/medical/chemical name = "Chemical Starter Kit Crate" desc = "Contains thirteen different chemicals, for all the fun experiments you can make." - cost = 1700 + cost = 1000 contains = list(/obj/item/reagent_containers/glass/bottle/hydrogen, /obj/item/reagent_containers/glass/bottle/carbon, /obj/item/reagent_containers/glass/bottle/nitrogen, @@ -1353,29 +1443,23 @@ /datum/supply_pack/medical/defibs name = "Defibrillator Crate" desc = "Contains two defibrillators for bringing the recently deceased back to life." - cost = 2500 + cost = 1800 contains = list(/obj/item/defibrillator/loaded, /obj/item/defibrillator/loaded) crate_name = "defibrillator crate" - -/datum/supply_pack/medical/firstaid_single - name = "First Aid Kit Single-Pack" - desc = "Contains one first aid kit for healing most types of wounds." - cost = 250 - small_item = TRUE - contains = list(/obj/item/storage/firstaid/regular) - /datum/supply_pack/medical/iv_drip name = "IV Drip Crate" - desc = "Contains a single IV drip for administering blood to patients." - cost = 1000 - contains = list(/obj/machinery/iv_drip) + desc = "Contains three IV drips for administering blood to patients." + cost = 800 + contains = list(/obj/machinery/iv_drip, + /obj/machinery/iv_drip, + /obj/machinery/iv_drip) crate_name = "iv drip crate" /datum/supply_pack/medical/supplies name = "Medical Supplies Crate" - desc = "Contains several medical supplies. German doctor not included." + desc = "Contains a little bit of everything needed to stock a medbay or to form your own." cost = 2000 contains = list(/obj/item/reagent_containers/glass/bottle/charcoal, /obj/item/reagent_containers/glass/bottle/epinephrine, @@ -1405,40 +1489,26 @@ var/item = pick(contains) new item(C) -/datum/supply_pack/medical/firstaidoxygen_single - name = "Oxygen Deprivation Kit Single-Pack" - desc = "Contains three first aid kits focused on helping oxygen deprivation victims." - cost = 330 - small_item = TRUE - contains = list(/obj/item/storage/firstaid/o2) - /datum/supply_pack/medical/surgery name = "Surgical Supplies Crate" desc = "Do you want to perform surgery, but don't have one of those fancy shmancy degrees? Just get started with this crate containing a medical duffelbag, Sterilizine spray and collapsible roller bed." - cost = 3000 + cost = 900 contains = list(/obj/item/storage/backpack/duffelbag/med/surgery, /obj/item/reagent_containers/medspray/sterilizine, /obj/item/roller) crate_name = "surgical supplies crate" -/datum/supply_pack/medical/firstaidtoxins_single - name = "Toxin Treatment Kit Single-Pack" - desc = "Contains one first aid kit focused on healing damage dealt by heavy toxins." - cost = 330 - small_item = TRUE - contains = list(/obj/item/storage/firstaid/toxin) - /datum/supply_pack/medical/salglucanister name = "Heavy-Duty Saline Canister" desc = "Contains a bulk supply of saline-glucose condensed into a single canister that should last several days, with a large pump to fill containers with. Direct injection of saline should be left to medical professionals as the pump is capable of overdosing patients. Requires medbay access to open." - cost = 3000 + cost = 1200 access = ACCESS_MEDICAL contains = list(/obj/machinery/iv_drip/saline) /datum/supply_pack/medical/randomvirus name = "Virus Sample Crate" desc = "Contains five random experimental disease cultures for epidemiological research" - cost = 1500 + cost = 3750 access = ACCESS_VIROLOGY contains = list(/obj/item/reagent_containers/glass/bottle/random_virus, /obj/item/reagent_containers/glass/bottle/random_virus, @@ -1452,7 +1522,7 @@ /datum/supply_pack/medical/virology name = "Junior Epidemiology Kit" desc = "Contains the necessary supplies to start an epidemiological research lab. P.A.N.D.E.M.I.C. not included. Comes with a free virologist action figure!" - cost = 2000 + cost = 1500 access = ACCESS_VIROLOGY contains = list(/obj/item/reagent_containers/food/snacks/monkeycube, /obj/item/reagent_containers/food/drinks/bottle/virusfood, @@ -1467,7 +1537,7 @@ /datum/supply_pack/medical/vending name = "Medical Vending Crate" desc = "Contains one NanoMed Plus refill and one wall-mounted NanoMed refill." - cost = 2000 + cost = 1500 contains = list(/obj/item/vending_refill/medical, /obj/item/vending_refill/wallmed) crate_name = "medical vending crate" @@ -1488,6 +1558,24 @@ crate_type = /obj/structure/closet/crate/secure/plasma dangerous = TRUE +/datum/supply_pack/medical/extrapolator + name = "Virus Extrapolator Supply Crate" + desc = "Contains 3 Virus Extrapolators should any existing ones be lost or otherwise destroyed." + cost = 4500 + access = ACCESS_VIROLOGY + contains = list(/obj/item/extrapolator, /obj/item/extrapolator, /obj/item/extrapolator) + crate_name = "Extrapolator Crate" + crate_type = /obj/structure/closet/crate/secure/plasma + dangerous = TRUE + +/datum/supply_pack/medical/pandemic + name = "Pandemic Replacement Crate" + desc = "Contains a replacement P.A.N.D.E.M.I.C. in case the ones in virology get destroyed or you want to build a new lab." + cost = 7500 + access = ACCESS_VIROLOGY + contains = list(/obj/machinery/computer/pandemic) + crate_name = "P.A.N.D.E.M.I.C. Replacement Crate" + dangerous = TRUE ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Science ///////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -1499,7 +1587,7 @@ /datum/supply_pack/science/plasma name = "Plasma Assembly Crate" desc = "Everything you need to burn something to the ground, this contains three plasma assembly sets. Each set contains a plasma tank, igniter, proximity sensor, and timer! Warranty void if exposed to high temperatures. Requires Toxins access to open." - cost = 1000 + cost = 800 access = ACCESS_TOX_STORAGE contains = list(/obj/item/tank/internals/plasma, /obj/item/tank/internals/plasma, @@ -1519,7 +1607,7 @@ /datum/supply_pack/science/robotics name = "Robotics Assembly Crate" desc = "The tools you need to replace those finicky humans with a loyal robot army! Contains four proximity sensors, two empty first aid kits, two health analyzers, two red hardhats, two mechanical toolboxes, and two cleanbot assemblies! Requires Robotics access to open." - cost = 1500 + cost = 1200 access = ACCESS_ROBOTICS contains = list(/obj/item/assembly/prox_sensor, /obj/item/assembly/prox_sensor, @@ -1555,14 +1643,14 @@ /datum/supply_pack/science/rped name = "RPED crate" desc = "Need to rebuild the ORM but science got annihialted after a bomb test? Buy this for the most advanced parts NT can give you." - cost = 1500 + cost = 800 contains = list(/obj/item/storage/part_replacer/cargo) crate_name = "\improper RPED crate" /datum/supply_pack/science/shieldwalls name = "Shield Generator Crate" desc = "These high powered Shield Wall Generators are guaranteed to keep any unwanted lifeforms on the outside, where they belong! Contains four shield wall generators. Requires Teleporter access to open." - cost = 2000 + cost = 1700 access = ACCESS_TELEPORTER contains = list(/obj/machinery/shieldwallgen, /obj/machinery/shieldwallgen, @@ -1574,14 +1662,14 @@ /datum/supply_pack/science/modularpc name = "Deluxe Silicate Selections restocking unit" desc = "What's a computer? Contains Deluxe Silicate Selections restocking unit." - cost = 1500 + cost = 1200 contains = list(/obj/item/vending_refill/modularpc) crate_name = "computer supply crate" /datum/supply_pack/science/transfer_valves name = "Tank Transfer Valves Crate" desc = "The key ingredient for making a lot of people very angry very fast. Contains two tank transfer valves. Requires RD access to open." - cost = 6000 + cost = 4000 access = ACCESS_RD contains = list(/obj/item/transfer_valve, /obj/item/transfer_valve) @@ -1589,6 +1677,20 @@ crate_type = /obj/structure/closet/crate/secure/science dangerous = TRUE +/datum/supply_pack/science/xenobio + name = "Xenobiology Lab Crate" + desc = "In case a freak accident has rendered the xenobiology lab non-functional! Contains two grey slime extracts, some plasma, and the required circuit boards to set up your xenobiology lab up and running! Requires Xenobiology access to open." + cost = 10000 + access = ACCESS_XENOBIOLOGY + contains = list(/obj/item/slime_extract/grey, + /obj/item/slime_extract/grey, + /obj/item/reagent_containers/syringe/plasma, + /obj/item/circuitboard/computer/xenobiology, + /obj/item/circuitboard/machine/monkey_recycler, + /obj/item/circuitboard/machine/processor/slime) + crate_name = "xenobiology starter crate" + crate_type = /obj/structure/closet/crate/secure/science + ////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Service ////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -1599,7 +1701,7 @@ /datum/supply_pack/service/cargo_supples name = "Cargo Supplies Crate" desc = "Sold everything that wasn't bolted down? You can get right back to work with this crate containing stamps, an export scanner, destination tagger, hand labeler and some package wrapping." - cost = 1000 + cost = 700 contains = list(/obj/item/stamp, /obj/item/stamp/denied, /obj/item/export_scanner, @@ -1610,20 +1712,30 @@ /datum/supply_pack/service/noslipfloor name = "High-traction Floor Tiles" - desc = "Make slipping a thing of the past with thirty industrial-grade anti-slip floortiles!" - cost = 2000 + desc = "Make slipping a thing of the past with thirty industrial-grade anti-slip floor tiles!" + cost = 800 contains = list(/obj/item/stack/tile/noslip/thirty) crate_name = "high-traction floor tiles crate" +/datum/supply_pack/service/noslipfloorbulk + name = "Bulk High-traction Floor Tiles" + desc = "Make an entire department not need to know the pain of slipping on a wet floor with 120 anti-slip floor tiles!" + cost = 2000 + contains = list(/obj/item/stack/tile/noslip/thirty, + /obj/item/stack/tile/noslip/thirty, + /obj/item/stack/tile/noslip/thirty, + /obj/item/stack/tile/noslip/thirty) + crate_name = "high-traction floor tiles crate" + /datum/supply_pack/service/janitor name = "Janitorial Supplies Crate" desc = "Fight back against dirt and grime with Nanotrasen's Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has a single mop, broom, spray cleaner, rag, and trash bag." - cost = 1000 + cost = 800 contains = list(/obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/glass/bucket, /obj/item/mop, - /obj/item/twohanded/pushbroom, + /obj/item/pushbroom, /obj/item/clothing/suit/caution, /obj/item/clothing/suit/caution, /obj/item/clothing/suit/caution, @@ -1638,7 +1750,7 @@ /datum/supply_pack/service/janitor/janicart name = "Janitorial Cart and Galoshes Crate" desc = "The keystone to any successful janitor. As long as you have feet, this pair of galoshes will keep them firmly planted on the ground. Also contains a janitorial cart." - cost = 2000 + cost = 1000 contains = list(/obj/structure/janitorialcart, /obj/item/clothing/shoes/galoshes) crate_name = "janitorial cart crate" @@ -1646,9 +1758,8 @@ /datum/supply_pack/service/janitor/janitank name = "Janitor Backpack Crate" - desc = "Call forth divine judgement upon dirt and grime with this high capacity janitor backpack. Contains 500 units of station-cleansing cleaner. Requires janitor access to open." - cost = 1000 - access = ACCESS_JANITOR + desc = "Call forth divine judgment upon dirt and grime with this high capacity janitor backpack. Contains 500 units of station-cleansing cleaner." + cost = 700 contains = list(/obj/item/watertank/janitor) crate_name = "janitor backpack crate" crate_type = /obj/structure/closet/crate/secure @@ -1656,7 +1767,7 @@ /datum/supply_pack/service/mule name = "MULEbot Crate" desc = "Pink-haired Quartermaster not doing her job? Replace her with this tireless worker, today!" - cost = 2000 + cost = 1700 contains = list(/mob/living/simple_animal/bot/mulebot) crate_name = "\improper MULEbot Crate" crate_type = /obj/structure/closet/crate/large @@ -1664,7 +1775,7 @@ /datum/supply_pack/service/party name = "Party Equipment" desc = "Celebrate both life and death on the station with Nanotrasen's Party Essentials(tm)! Contains a special party area, seven colored glowsticks, four beers, two ales, and a bottle of patron, goldschlager, and shaker!" - cost = 2500 + cost = 1500 contains = list(/obj/item/storage/box/drinkingglasses, /obj/item/reagent_containers/food/drinks/shaker, /obj/item/reagent_containers/food/drinks/bottle/patron, @@ -1688,7 +1799,7 @@ /datum/supply_pack/service/carpet name = "Premium Carpet Crate" desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together." - cost = 1000 + cost = 700 contains = list(/obj/item/stack/tile/carpet/fifty, /obj/item/stack/tile/carpet/fifty, /obj/item/stack/tile/carpet/black/fifty, @@ -1698,7 +1809,7 @@ /datum/supply_pack/service/carpet_exotic name = "Exotic Carpet Crate" desc = "Exotic carpets straight from Space Russia, for all your decorating needs. Contains 100 tiles each of 8 different flooring patterns." - cost = 4000 + cost = 2000 contains = list(/obj/item/stack/tile/carpet/blue/fifty, /obj/item/stack/tile/carpet/blue/fifty, /obj/item/stack/tile/carpet/cyan/fifty, @@ -1721,9 +1832,10 @@ /datum/supply_pack/service/lightbulbs name = "Replacement Lights" - desc = "May the light of Aether shine upon this station! Or at least, the light of forty two light tubes and twenty one light bulbs." - cost = 1000 + desc = "May the light of Aether shine upon this station! Or at least, the light of fifty six light tubes and twenty eight light bulbs." + cost = 800 contains = list(/obj/item/storage/box/lights/mixed, + /obj/item/storage/box/lights/mixed, /obj/item/storage/box/lights/mixed, /obj/item/storage/box/lights/mixed) crate_name = "replacement lights" @@ -1731,7 +1843,7 @@ /datum/supply_pack/service/minerkit name = "Shaft Miner Starter Kit" desc = "All the miners died too fast? Assistant wants to get a taste of life off-station? Either way, this kit is the best way to turn a regular crewman into an ore-producing, monster-slaying machine. Contains meson goggles, a pickaxe, advanced mining scanner, cargo headset, ore bag, gasmask, an explorer suit and a miner ID upgrade. Requires QM access to open." - cost = 2500 + cost = 800 access = ACCESS_QM contains = list(/obj/item/storage/backpack/duffelbag/mining_conscript) crate_name = "shaft miner starter kit" @@ -1740,7 +1852,7 @@ /datum/supply_pack/service/vending/bartending name = "Booze-o-mat and Coffee Supply Crate" desc = "Bring on the booze and coffee vending machine refills." - cost = 2000 + cost = 1200 contains = list(/obj/item/vending_refill/boozeomat, /obj/item/vending_refill/coffee) crate_name = "bartending supply crate" @@ -1748,7 +1860,7 @@ /datum/supply_pack/service/vending/cigarette name = "Cigarette Supply Crate" desc = "Don't believe the reports - smoke today! Contains a cigarette vending machine refill." - cost = 1500 + cost = 1200 contains = list(/obj/item/vending_refill/cigarette) crate_name = "cigarette supply crate" crate_type = /obj/structure/closet/crate @@ -1756,14 +1868,14 @@ /datum/supply_pack/service/vending/dinnerware name = "Dinnerware Supply Crate" desc = "More knives for the chef." - cost = 1000 + cost = 800 contains = list(/obj/item/vending_refill/dinnerware) crate_name = "dinnerware supply crate" /datum/supply_pack/service/vending/games name = "Games Supply Crate" desc = "Get your game on with this game vending machine refill." - cost = 1000 + cost = 800 contains = list(/obj/item/vending_refill/games) crate_name = "games supply crate" crate_type = /obj/structure/closet/crate @@ -1771,7 +1883,7 @@ /datum/supply_pack/service/vending/imported name = "Imported Vending Machines" desc = "Vending machines famous in other parts of the galaxy." - cost = 4000 + cost = 3000 contains = list(/obj/item/vending_refill/sustenance, /obj/item/vending_refill/robotics, /obj/item/vending_refill/sovietsoda, @@ -1781,28 +1893,28 @@ /datum/supply_pack/service/vending/ptech name = "PTech Supply Crate" desc = "Not enough cartridges after half the crew lost their PDA to explosions? This may fix it." - cost = 1500 + cost = 800 contains = list(/obj/item/vending_refill/cart) crate_name = "ptech supply crate" /datum/supply_pack/service/vending/snack name = "Snack Supply Crate" desc = "One vending machine refill of cavity-bringin' goodness! The number one dentist recommended order!" - cost = 1500 + cost = 800 contains = list(/obj/item/vending_refill/snack) crate_name = "snacks supply crate" /datum/supply_pack/service/vending/cola name = "Softdrinks Supply Crate" desc = "Got whacked by a toolbox, but you still have those pesky teeth? Get rid of those pearly whites with this soda machine refill, today!" - cost = 1500 + cost = 800 contains = list(/obj/item/vending_refill/cola) crate_name = "soft drinks supply crate" /datum/supply_pack/service/vending/vendomat name = "Vendomat Supply Crate" desc = "More tools for your IED testing facility." - cost = 1000 + cost = 800 contains = list(/obj/item/vending_refill/assist) crate_name = "vendomat supply crate" @@ -1829,7 +1941,7 @@ /datum/supply_pack/organic/hydroponics/beekeeping_suits name = "Beekeeper Suit Crate" desc = "Bee business booming? Better be benevolent and boost botany by bestowing bi-Beekeeper-suits! Contains two beekeeper suits and matching headwear." - cost = 1000 + cost = 800 contains = list(/obj/item/clothing/head/beekeeper_head, /obj/item/clothing/suit/beekeeper_suit, /obj/item/clothing/head/beekeeper_head, @@ -1840,7 +1952,7 @@ /datum/supply_pack/organic/hydroponics/beekeeping_fullkit name = "Beekeeping Starter Crate" desc = "BEES BEES BEES. Contains three honey frames, a beekeeper suit and helmet, flyswatter, bee house, and, of course, a pure-bred Nanotrasen-Standardized Queen Bee!" - cost = 1500 + cost = 1400 contains = list(/obj/structure/beebox/unwrenched, /obj/item/honey_frame, /obj/item/honey_frame, @@ -1855,7 +1967,7 @@ /datum/supply_pack/organic/randomized/chef name = "Excellent Meat Crate" desc = "The best cuts in the whole galaxy." - cost = 2000 + cost = 1700 contains = list(/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime, /obj/item/reagent_containers/food/snacks/meat/slab/killertomato, /obj/item/reagent_containers/food/snacks/meat/slab/bear, @@ -1876,7 +1988,7 @@ /datum/supply_pack/organic/exoticseeds name = "Exotic Seeds Crate" desc = "Any entrepreneuring botanist's dream. Contains fourteen different seeds, including three replica-pod seeds and two mystery seeds!" - cost = 1500 + cost = 1000 contains = list(/obj/item/seeds/nettle, /obj/item/seeds/replicapod, /obj/item/seeds/replicapod, @@ -1917,7 +2029,7 @@ /datum/supply_pack/organic/randomized/chef/fruits name = "Fruit Crate" desc = "Rich of vitamins, may contain oranges." - cost = 1500 + cost = 1200 contains = list(/obj/item/reagent_containers/food/snacks/grown/citrus/lime, /obj/item/reagent_containers/food/snacks/grown/citrus/orange, /obj/item/reagent_containers/food/snacks/grown/watermelon, @@ -1939,7 +2051,7 @@ /datum/supply_pack/organic/hydroponics name = "Hydroponics Crate" desc = "Supplies for growing a great garden! Contains two bottles of ammonia, two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, as well as a pair of leather gloves and a botanist's apron." - cost = 1500 + cost = 800 contains = list(/obj/item/reagent_containers/spray/plantbgone, /obj/item/reagent_containers/spray/plantbgone, /obj/item/reagent_containers/glass/bottle/ammonia, @@ -1956,8 +2068,7 @@ /datum/supply_pack/organic/hydroponics/hydrotank name = "Hydroponics Backpack Crate" desc = "Bring on the flood with this high-capacity backpack crate. Contains 500 units of life-giving H2O. Requires hydroponics access to open." - cost = 1000 - access = ACCESS_HYDROPONICS + cost = 700 contains = list(/obj/item/watertank) crate_name = "hydroponics backpack crate" crate_type = /obj/structure/closet/crate/secure @@ -1965,7 +2076,7 @@ /datum/supply_pack/organic/pizza name = "Pizza Crate" desc = "Best prices on this side of the galaxy. All deliveries are guaranteed to be 99% anomaly-free!" - cost = 6000 // Best prices this side of the galaxy. + cost = 5000 // Best prices this side of the galaxy. contains = list(/obj/item/pizzabox/margherita, /obj/item/pizzabox/mushroom, /obj/item/pizzabox/meat, @@ -1999,19 +2110,19 @@ /datum/supply_pack/organic/potted_plants name = "Potted Plants Crate" desc = "Spruce up the station with these lovely plants! Contains a random assortment of five potted plants from Nanotrasen's potted plant research division. Warranty void if thrown." - cost = 700 - contains = list(/obj/item/twohanded/required/kirbyplants/random, - /obj/item/twohanded/required/kirbyplants/random, - /obj/item/twohanded/required/kirbyplants/random, - /obj/item/twohanded/required/kirbyplants/random, - /obj/item/twohanded/required/kirbyplants/random) + cost = 550 + contains = list(/obj/item/kirbyplants/random, + /obj/item/kirbyplants/random, + /obj/item/kirbyplants/random, + /obj/item/kirbyplants/random, + /obj/item/kirbyplants/random) crate_name = "potted plants crate" crate_type = /obj/structure/closet/crate/hydroponics /datum/supply_pack/organic/seeds name = "Seeds Crate" desc = "Big things have small beginnings. Contains fourteen different seeds." - cost = 1000 + cost = 800 contains = list(/obj/item/seeds/chili, /obj/item/seeds/cotton, /obj/item/seeds/berry, @@ -2032,7 +2143,7 @@ /datum/supply_pack/organic/randomized/chef/vegetables name = "Vegetables Crate" desc = "Grown in vats." - cost = 1300 + cost = 1000 contains = list(/obj/item/reagent_containers/food/snacks/grown/chili, /obj/item/reagent_containers/food/snacks/grown/corn, /obj/item/reagent_containers/food/snacks/grown/tomato, @@ -2046,7 +2157,7 @@ /datum/supply_pack/organic/vending/hydro_refills name = "Hydroponics Vending Machines Refills" desc = "When the clown takes all the banana seeds. Contains a NutriMax refill and an MegaSeed Servitor refill." - cost = 2000 + cost = 1700 crate_type = /obj/structure/closet/crate contains = list(/obj/item/vending_refill/hydroseeds, /obj/item/vending_refill/hydronutrients) @@ -2073,6 +2184,25 @@ ) crate_name = "grilling fuel kit crate" +/datum/supply_pack/organic/beefbroth + + name = "Beef Broth Bulk Crate" + desc = "No one really wants to order beef broth so we're selling it in bulk!" + cost = 5000 + contraband = TRUE + crate_type = /obj/structure/closet/crate + contains = list(/obj/item/reagent_containers/food/snacks/canned/beefbroth, + /obj/item/reagent_containers/food/snacks/canned/beefbroth, + /obj/item/reagent_containers/food/snacks/canned/beefbroth, + /obj/item/reagent_containers/food/snacks/canned/beefbroth, + /obj/item/reagent_containers/food/snacks/canned/beefbroth, + /obj/item/reagent_containers/food/snacks/canned/beefbroth, + /obj/item/reagent_containers/food/snacks/canned/beefbroth, + /obj/item/reagent_containers/food/snacks/canned/beefbroth, + /obj/item/reagent_containers/food/snacks/canned/beefbroth, + /obj/item/reagent_containers/food/snacks/canned/beefbroth + ) + crate_name = "Beef Broth Care" ////////////////////////////////////////////////////////////////////////////// ////////////////////////////// Livestock ///////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -2124,6 +2254,28 @@ qdel(C) new /mob/living/simple_animal/pet/cat/Proc(.) +/datum/supply_pack/critter/cat/exotic + name = "Exotic Cat Crate" + desc = "Commes with one of the exotic cats, collar and a toy." + cost = 5500 + contains = list(/obj/item/clothing/neck/petcollar, + /obj/item/toy/cattoy) + crate_name = "cat crate" + +/datum/supply_pack/critter/cat/exotic/generate() + . = ..() + switch(rand(1, 5)) + if(1) + new /mob/living/simple_animal/pet/cat/original(.) + if(2) + new /mob/living/simple_animal/pet/cat/breadcat(.) + if(3) + new /mob/living/simple_animal/pet/cat/cak(.) + if(4) + new /mob/living/simple_animal/pet/cat/space(.) + if(5) + new /mob/living/simple_animal/pet/cat/halal(.) + /datum/supply_pack/critter/chick name = "Chicken Crate" desc = "The chicken goes bwaak!" @@ -2192,11 +2344,12 @@ /datum/supply_pack/critter/monkey name = "Monkey Cube Crate" - desc = "Stop monkeying around! Contains seven monkey cubes. Just add water!" - cost = 2000 + desc = "Stop monkeying around! Contains five monkey cubes. Just add water!" + cost = 1000 contains = list (/obj/item/storage/box/monkeycubes) crate_type = /obj/structure/closet/crate crate_name = "monkey cube crate" + small_item = TRUE /datum/supply_pack/critter/pug name = "Pug Crate" @@ -2444,15 +2597,14 @@ crate_name = "toy crate" crate_type = /obj/structure/closet/crate/wooden -/datum/supply_pack/costumes_toys/randomised/toys/generate() - . = ..() +/datum/supply_pack/costumes_toys/randomised/toys/fill(obj/structure/closet/crate/C) var/the_toy for(var/i in 1 to num_contained) if(prob(50)) the_toy = pickweight(GLOB.arcade_prize_pool) else the_toy = pick(subtypesof(/obj/item/toy/plush)) - new the_toy(.) + new the_toy(C) /datum/supply_pack/costumes_toys/wizard name = "Wizard Costume Crate" @@ -2471,24 +2623,83 @@ var/item = pick_n_take(L) new item(C) +/datum/supply_pack/costumes_toys/chess_white + name = "White Chess Piece Crate" + desc = "Look at you, playing a nerd game within a nerd game!" + cost = 800 + contains = list( + /obj/item/cardboard_cutout/adaptive/chess/king, + /obj/item/cardboard_cutout/adaptive/chess/queen, + /obj/item/cardboard_cutout/adaptive/chess/rook, + /obj/item/cardboard_cutout/adaptive/chess/rook, + /obj/item/cardboard_cutout/adaptive/chess/knight, + /obj/item/cardboard_cutout/adaptive/chess/knight, + /obj/item/cardboard_cutout/adaptive/chess/bishop, + /obj/item/cardboard_cutout/adaptive/chess/bishop, + /obj/item/cardboard_cutout/adaptive/chess/pawn, + /obj/item/cardboard_cutout/adaptive/chess/pawn, + /obj/item/cardboard_cutout/adaptive/chess/pawn, + /obj/item/cardboard_cutout/adaptive/chess/pawn, + /obj/item/cardboard_cutout/adaptive/chess/pawn, + /obj/item/cardboard_cutout/adaptive/chess/pawn, + /obj/item/cardboard_cutout/adaptive/chess/pawn, + /obj/item/cardboard_cutout/adaptive/chess/pawn, + ) + crate_type = /obj/structure/closet/crate/wooden + +/datum/supply_pack/costumes_toys/chess_black + name = "Black Chess Piece Crate" + desc = "Look at you, playing a nerd game within a nerd game!" + cost = 800 + contains = list( + /obj/item/cardboard_cutout/adaptive/chess/black/king, + /obj/item/cardboard_cutout/adaptive/chess/black/queen, + /obj/item/cardboard_cutout/adaptive/chess/black/rook, + /obj/item/cardboard_cutout/adaptive/chess/black/rook, + /obj/item/cardboard_cutout/adaptive/chess/black/knight, + /obj/item/cardboard_cutout/adaptive/chess/black/knight, + /obj/item/cardboard_cutout/adaptive/chess/black/bishop, + /obj/item/cardboard_cutout/adaptive/chess/black/bishop, + /obj/item/cardboard_cutout/adaptive/chess/black/pawn, + /obj/item/cardboard_cutout/adaptive/chess/black/pawn, + /obj/item/cardboard_cutout/adaptive/chess/black/pawn, + /obj/item/cardboard_cutout/adaptive/chess/black/pawn, + /obj/item/cardboard_cutout/adaptive/chess/black/pawn, + /obj/item/cardboard_cutout/adaptive/chess/black/pawn, + /obj/item/cardboard_cutout/adaptive/chess/black/pawn, + /obj/item/cardboard_cutout/adaptive/chess/black/pawn, + ) + crate_type = /obj/structure/closet/crate/wooden + +////////////////////////////////////////////////////////////////////////////// +///////////////////////// Wardrobe Resupplies //////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + /datum/supply_pack/costumes_toys/wardrobes/autodrobe name = "Autodrobe Supply Crate" desc = "Autodrobe missing your favorite dress? Solve that issue today with this autodrobe refill." - cost = 1500 + cost = 800 contains = list(/obj/item/vending_refill/autodrobe) crate_name = "autodrobe supply crate" /datum/supply_pack/costumes_toys/wardrobes/cargo name = "Cargo Wardrobe Supply Crate" desc = "This crate contains a refill for the CargoDrobe." - cost = 750 + cost = 800 contains = list(/obj/item/vending_refill/wardrobe/cargo_wardrobe) crate_name = "cargo department supply crate" +/datum/supply_pack/costumes_toys/wardrobes/clothesmate + name = "ClothesMate Wardrobe Supply Crate" + desc = "This crate contains a refill for the ClothesMate." + cost = 800 + contains = list(/obj/item/vending_refill/clothing) + crate_name = "clothesmate supply crate" + /datum/supply_pack/costumes_toys/wardrobes/engineering name = "Engineering Wardrobe Supply Crate" desc = "This crate contains refills for the EngiDrobe and AtmosDrobe." - cost = 1500 + cost = 800 contains = list(/obj/item/vending_refill/wardrobe/engi_wardrobe, /obj/item/vending_refill/wardrobe/atmos_wardrobe) crate_name = "engineering department wardrobe supply crate" @@ -2496,7 +2707,7 @@ /datum/supply_pack/costumes_toys/wardrobes/general name = "General Wardrobes Supply Crate" desc = "This crate contains refills for the CuraDrobe, BarDrobe, ChefDrobe, JaniDrobe, ChapDrobe." - cost = 3750 + cost = 1200 contains = list(/obj/item/vending_refill/wardrobe/curator_wardrobe, /obj/item/vending_refill/wardrobe/bar_wardrobe, /obj/item/vending_refill/wardrobe/chef_wardrobe, @@ -2507,14 +2718,14 @@ /datum/supply_pack/costumes_toys/wardrobes/hydroponics name = "Hydrobe Supply Crate" desc = "This crate contains a refill for the Hydrobe." - cost = 750 + cost = 600 contains = list(/obj/item/vending_refill/wardrobe/hydro_wardrobe) crate_name = "hydrobe supply crate" /datum/supply_pack/costumes_toys/wardrobes/medical name = "Medical Wardrobe Supply Crate" desc = "This crate contains refills for the MediDrobe, ChemDrobe, GeneDrobe, and ViroDrobe." - cost = 3000 + cost = 1200 contains = list(/obj/item/vending_refill/wardrobe/medi_wardrobe, /obj/item/vending_refill/wardrobe/chem_wardrobe, /obj/item/vending_refill/wardrobe/gene_wardrobe, @@ -2524,16 +2735,17 @@ /datum/supply_pack/costumes_toys/wardrobes/science name = "Science Wardrobe Supply Crate" desc = "This crate contains refills for the SciDrobe and RoboDrobe." - cost = 1500 + cost = 800 contains = list(/obj/item/vending_refill/wardrobe/robo_wardrobe, /obj/item/vending_refill/wardrobe/science_wardrobe) crate_name = "science department wardrobe supply crate" /datum/supply_pack/costumes_toys/wardrobes/security name = "Security Wardrobe Supply Crate" - desc = "This crate contains refills for the SecDrobe and LawDrobe." - cost = 1500 + desc = "This crate contains refills for the SecDrobe, DetDrobe and LawDrobe." + cost = 1000 contains = list(/obj/item/vending_refill/wardrobe/sec_wardrobe, + /obj/item/vending_refill/wardrobe/det_wardrobe, /obj/item/vending_refill/wardrobe/law_wardrobe) crate_name = "security department supply crate" @@ -2547,20 +2759,41 @@ /datum/supply_pack/misc/artsupply name = "Art Supplies" desc = "Make some happy little accidents with six canvasses, two easels, and two rainbow crayons!" - cost = 800 + cost = 500 contains = list(/obj/structure/easel, /obj/structure/easel, - /obj/item/canvas/nineteenXnineteen, - /obj/item/canvas/nineteenXnineteen, - /obj/item/canvas/twentythreeXnineteen, - /obj/item/canvas/twentythreeXnineteen, - /obj/item/canvas/twentythreeXtwentythree, - /obj/item/canvas/twentythreeXtwentythree, + /obj/item/canvas/nineteen_nineteen, + /obj/item/canvas/nineteen_nineteen, + /obj/item/canvas/twentythree_nineteen, + /obj/item/canvas/twentythree_nineteen, + /obj/item/canvas/twentythree_twentythree, + /obj/item/canvas/twentythree_twentythree, /obj/item/toy/crayon/rainbow, /obj/item/toy/crayon/rainbow) crate_name = "art supply crate" crate_type = /obj/structure/closet/crate/wooden +/datum/supply_pack/misc/aquarium_kit + name = "Aquarium Kit" + desc = "Everything you need to start your own aquarium. Contains aquarium construction kit, fish catalog, feed can and three freshwater fish from our collection." + cost = 2000 + contains = list(/obj/item/book/fish_catalog, + /obj/item/storage/fish_case/random/freshwater, + /obj/item/storage/fish_case/random/freshwater, + /obj/item/storage/fish_case/random/freshwater, + /obj/item/fish_feed, + /obj/item/storage/box/aquarium_props, + /obj/item/aquarium_kit) + crate_name = "aquarium kit crate" + crate_type = /obj/structure/closet/crate/wooden + +/datum/supply_pack/misc/aquarium_fish + name = "Aquarium Fish Case" + desc = "An aquarium fish handpicked by monkeys from our collection." + cost = 600 + contains = list(/obj/item/storage/fish_case/random) + crate_name = "aquarium fish crate" + /datum/supply_pack/misc/bicycle name = "Bicycle" desc = "Nanotrasen reminds all employees to never toy with powers outside their control." @@ -2572,7 +2805,7 @@ /datum/supply_pack/misc/bigband name = "Big Band Instrument Collection" desc = "Get your sad station movin' and groovin' with this fine collection! Contains nine different instruments!" - cost = 5000 + cost = 800 crate_name = "Big band musical instruments collection" contains = list(/obj/item/instrument/violin, /obj/item/instrument/guitar, @@ -2582,13 +2815,13 @@ /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/book_crate name = "Book Crate" desc = "Surplus from the Nanotrasen Archives, these seven books are sure to be good reads." - cost = 1500 + cost = 1200 contains = list(/obj/item/book/codex_gigas, /obj/item/book/manual/random/, /obj/item/book/manual/random/, @@ -2601,7 +2834,7 @@ /datum/supply_pack/misc/paper name = "Bureaucracy Crate" desc = "High stacks of papers on your desk Are a big problem - make it Pea-sized with these bureaucratic supplies! Contains six pens, some camera film, hand labeler supplies, a paper bin, three folders, a laser pointer, two clipboards and two stamps."//that was too forced - cost = 1500 + cost = 800 contains = list(/obj/structure/filingcabinet/chestdrawer/wheeled, /obj/item/camera_film, /obj/item/hand_labeler, @@ -2627,7 +2860,7 @@ /datum/supply_pack/misc/fountainpens name = "Calligraphy Crate" desc = "Sign death warrants in style with these seven executive fountain pens." - cost = 700 + cost = 800 contains = list(/obj/item/storage/box/fountainpens) crate_type = /obj/structure/closet/crate/wooden crate_name = "calligraphy crate" @@ -2635,7 +2868,7 @@ /datum/supply_pack/misc/wrapping_paper name = "Festive Wrapping Paper Crate" desc = "Want to mail your loved ones gift-wrapped chocolates, stuffed animals, the Clown's severed head? You can do all that, with this crate full of wrapping paper." - cost = 1000 + cost = 800 contains = list(/obj/item/stack/wrapping_paper) crate_type = /obj/structure/closet/crate/wooden crate_name = "festive wrapping paper crate" @@ -2644,7 +2877,7 @@ /datum/supply_pack/misc/funeral name = "Funeral Supply crate" desc = "At the end of the day, someone's gonna want someone dead. Give them a proper send-off with these funeral supplies! Contains a coffin with burial garmets and flowers." - cost = 600 + cost = 800 contains = list(/obj/item/clothing/under/misc/burial, /obj/item/reagent_containers/food/snacks/grown/harebell, /obj/item/reagent_containers/food/snacks/grown/poppy/geranium) @@ -2653,24 +2886,39 @@ /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." + desc = "Keep your local chaplain happy and well-supplied, lest they call down judgment 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 contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/book/bible/booze, /obj/item/storage/book/bible/booze, + /obj/item/clothing/neck/crucifix/rosary, /obj/item/clothing/suit/hooded/chaplain_hoodie, /obj/item/clothing/suit/hooded/chaplain_hoodie) crate_name = "religious supplies crate" /datum/supply_pack/misc/toner name = "Toner Crate" - desc = "Spent too much ink printing butt pictures? Fret not, with these six toner refills, you'll be printing butts 'till the cows come home!'" - cost = 1000 + desc = "Spent too much ink printing butt pictures? Fret not, with these eight toner refills, you'll be printing butts 'till the cows come home!'" + cost = 800 contains = list(/obj/item/toner, /obj/item/toner, /obj/item/toner, /obj/item/toner, /obj/item/toner, + /obj/item/toner, + /obj/item/toner, /obj/item/toner) crate_name = "toner crate" + +/datum/supply_pack/misc/toner_large + name = "Toner Crate (Large)" + desc = "Tired of changing toner cartridges? These six extra heavy duty refills contain roughly five times as much toner as the base model!" + cost = 3000 + contains = list(/obj/item/toner/large, + /obj/item/toner/large, + /obj/item/toner/large, + /obj/item/toner/large, + /obj/item/toner/large, + /obj/item/toner/large) + crate_name = "large toner crate" diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 2c1a3328d0008..1075b1ca1671e 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -1,103 +1,189 @@ -//The "BDPtarget" temp visual is created by anything that "launches" a supplypod. It makes two things: a falling droppod animation, and the droppod itself. +//The "pod_landingzone" temp visual is created by anything that "launches" a supplypod. This is what animates the pod and makes the pod forcemove to the station. //------------------------------------SUPPLY POD-------------------------------------// /obj/structure/closet/supplypod name = "supply pod" //Names and descriptions are normally created with the setStyle() proc during initialization, but we have these default values here as a failsafe desc = "A Nanotrasen supply drop pod." icon = 'icons/obj/supplypods.dmi' - icon_state = "supplypod" - pixel_x = -16 //2x2 sprite - pixel_y = -5 - layer = TABLE_LAYER //So that the crate inside doesn't appear underneath + icon_state = "pod" //This is a common base sprite shared by a number of pods + pixel_x = SUPPLYPOD_X_OFFSET //2x2 sprite + layer = BELOW_OBJ_LAYER //So that the crate inside doesn't appear underneath allow_objects = TRUE allow_dense = TRUE delivery_icon = null can_weld_shut = FALSE - armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80) + armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80, "stamina" = 0) anchored = TRUE //So it cant slide around after landing anchorable = FALSE + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 + appearance_flags = KEEP_TOGETHER | PIXEL_SCALE + density = FALSE + ///List of bitflags for supply pods, see: code\__DEFINES\obj_flags.dm + var/pod_flags = NONE + //*****NOTE*****: Many of these comments are similarly described in centcom_podlauncher.dm. If you change them here, please consider doing so in the centcom podlauncher code as well! var/adminNamed = FALSE //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc) var/bluespace = FALSE //If true, the pod deletes (in a shower of sparks) after landing - var/landingDelay = 30 //How long the pod takes to land after launching - var/openingDelay = 30 //How long the pod takes to open after landing - var/departureDelay = 30 //How long the pod takes to leave after opening. If bluespace = TRUE, it deletes. If reversing = TRUE, it flies back to centcom. + var/delays = list(POD_TRANSIT = 30, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) + var/reverse_delays = list(POD_TRANSIT = 30, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) + var/custom_rev_delay = FALSE var/damage = 0 //Damage that occurs to any mob under the pod when it lands. var/effectStun = FALSE //If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish! var/effectLimb = FALSE //If true, pops off a limb (if applicable) from anyone caught under the pod when it lands var/effectOrgans = FALSE //If true, yeets out every limb and organ from anyone caught under the pod when it lands var/effectGib = FALSE //If true, anyone under the pod will be gibbed when it lands - var/effectStealth = FALSE //If true, a target icon isnt displayed on the turf where the pod will land + var/effectStealth = FALSE //If true, a target icon isn't displayed on the turf where the pod will land var/effectQuiet = FALSE //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc) var/effectMissile = FALSE //If true, the pod deletes the second it lands. If you give it an explosion, it will act like a missile exploding as it hits the ground var/effectCircle = FALSE //If true, allows the pod to come in at any angle. Bit of a weird feature but whatever its here - var/style = STYLE_STANDARD //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod. + var/style = STYLE_STANDARD //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the GLOB.podstyles list in cargo.dm defines to get the proper icon/name/desc for the pod. var/reversing = FALSE //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom - var/fallDuration = 4 + var/list/reverse_dropoff_coords //Turf that the reverse pod will drop off it's newly-acquired cargo to var/fallingSoundLength = 11 var/fallingSound = 'sound/weapons/mortar_long_whistle.ogg'//Admin sound to play before the pod lands var/landingSound //Admin sound to play when the pod lands var/openingSound //Admin sound to play when the pod opens var/leavingSound //Admin sound to play when the pod leaves var/soundVolume = 80 //Volume to play sounds at. Ignores the cap - var/bay //Used specifically for the centcom_podlauncher datum. Holds the current bay the user is launching objects from. Bays are specific rooms on the centcom map. var/list/explosionSize = list(0,0,2,3) var/stay_after_drop = FALSE - var/specialised = TRUE // It's not a general use pod for cargo/admin use + var/specialised = FALSE // It's not a general use pod for cargo/admin use + var/rubble_type //Rubble effect associated with this supplypod + var/decal = "default" //What kind of extra decals we add to the pod to make it look nice + var/door = "pod_door" + var/fin_mask = "topfin" + var/obj/effect/supplypod_rubble/rubble + var/obj/effect/engineglow/glow_effect + var/effectShrapnel = FALSE + var/shrapnel_type = /obj/item/projectile/bullet/shrapnel + var/shrapnel_magnitude = 3 + var/list/reverseOptionList = list("Mobs"=FALSE,"Objects"=FALSE,"Anchored"=FALSE,"Underfloor"=FALSE,"Wallmounted"=FALSE,"Floors"=FALSE,"Walls"=FALSE) + var/list/turfs_in_cargo = list() /obj/structure/closet/supplypod/bluespacepod style = STYLE_BLUESPACE bluespace = TRUE explosionSize = list(0,0,1,2) - landingDelay = 15 //Slightly quicker than the supplypod + delays = list(POD_TRANSIT = 15, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) /obj/structure/closet/supplypod/extractionpod name = "Syndicate Extraction Pod" - desc = "A specalised, blood-red styled pod for extracting high-value targets out of active mission areas." + desc = "A specalised, blood-red styled pod for extracting high-value targets out of active mission areas. Targets must be manually stuffed inside the pod for proper delivery." specialised = TRUE style = STYLE_SYNDICATE bluespace = TRUE explosionSize = list(0,0,1,2) - landingDelay = 25 //Longer than others + delays = list(POD_TRANSIT = 25, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) /obj/structure/closet/supplypod/centcompod style = STYLE_CENTCOM bluespace = TRUE explosionSize = list(0,0,0,0) - landingDelay = 20 //Very speedy! + delays = list(POD_TRANSIT = 20, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + +/obj/structure/closet/supplypod/battleroyale + style = STYLE_BOX + bluespace = FALSE + explosionSize = list(0,0,0,0) + delays = list(POD_TRANSIT = 40, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) //Very slow resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + max_integrity = 20 +/obj/structure/closet/supplypod/Initialize(mapload, customStyle = FALSE) + . = ..() + if (!loc) + var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/supplypod_temp_holding] //temporary holder for supplypods mid-transit + forceMove(shippingLane) + if (customStyle) + style = customStyle + setStyle(style) //Upon initialization, give the supplypod an iconstate, name, and description based on the "style" variable. This system is important for the centcom_podlauncher to function correctly + +/obj/structure/closet/supplypod/extractionpod/Initialize() + . = ..() + var/turf/picked_turf = pick(GLOB.holdingfacility) + reverse_dropoff_coords = list(picked_turf.x, picked_turf.y, picked_turf.z) + +/obj/structure/closet/supplypod/proc/setStyle(chosenStyle) //Used to give the sprite an icon state, name, and description. + style = chosenStyle + var/base = GLOB.podstyles[chosenStyle][POD_BASE] //GLOB.podstyles is a 2D array we treat as a dictionary. The style represents the verticle index, with the icon state, name, and desc being stored in the horizontal indexes of the 2D array. + icon_state = base + decal = GLOB.podstyles[chosenStyle][POD_DECAL] + rubble_type = GLOB.podstyles[chosenStyle][POD_RUBBLE_TYPE] + if (!adminNamed && !specialised) //We dont want to name it ourselves if it has been specifically named by an admin using the centcom_podlauncher datum + name = GLOB.podstyles[chosenStyle][POD_NAME] + desc = GLOB.podstyles[chosenStyle][POD_DESC] + if (GLOB.podstyles[chosenStyle][POD_DOOR]) + door = "[base]_door" + else + door = FALSE + update_icon() -/obj/structure/closet/supplypod/proc/specialisedPod() - return 1 +/obj/structure/closet/supplypod/proc/SetReverseIcon() + fin_mask = "bottomfin" + if (GLOB.podstyles[style][POD_SHAPE] == POD_SHAPE_NORML) + icon_state = GLOB.podstyles[style][POD_BASE] + "_reverse" + pixel_x = initial(pixel_x) + transform = matrix() + update_icon() -/obj/structure/closet/supplypod/extractionpod/specialisedPod(atom/movable/holder) - holder.forceMove(pick(GLOB.holdingfacility)) // land in ninja jail - open(holder, forced = TRUE) +/obj/structure/closet/supplypod/proc/backToNonReverseIcon() + fin_mask = initial(fin_mask) + if (GLOB.podstyles[style][POD_SHAPE] == POD_SHAPE_NORML) + icon_state = GLOB.podstyles[style][POD_BASE] + pixel_x = initial(pixel_x) + transform = matrix() + update_icon() -/obj/structure/closet/supplypod/Initialize() +/obj/structure/closet/supplypod/update_overlays() . = ..() - setStyle(style, TRUE) //Upon initialization, give the supplypod an iconstate, name, and description based on the "style" variable. This system is important for the centcom_podlauncher to function correctly + if (style == STYLE_INVISIBLE) + return + if (rubble) + . += rubble.getForeground(src) + if (style == STYLE_SEETHROUGH) + for (var/atom/A in contents) + var/mutable_appearance/itemIcon = new(A) + itemIcon.transform = matrix().Translate(-1 * SUPPLYPOD_X_OFFSET, 0) + . += itemIcon + for (var/t in turfs_in_cargo)//T is just a turf's type + var/turf/turf_type = t + var/mutable_appearance/itemIcon = mutable_appearance(initial(turf_type.icon), initial(turf_type.icon_state)) + itemIcon.transform = matrix().Translate(-1 * SUPPLYPOD_X_OFFSET, 0) + . += itemIcon + return -/obj/structure/closet/supplypod/update_icon() - cut_overlays() - if (style == STYLE_SEETHROUGH || style == STYLE_INVISIBLE) //If we're invisible, we dont bother adding any overlays + if (opened) //We're opened means all we have to worry about is masking a decal if we have one + if (!decal) //We don't have a decal to mask + return + if (!door) //We have a decal but no door, so let's just add the decal + . += decal + return + var/icon/masked_decal = new(icon, decal) //The decal we want to apply + var/icon/door_masker = new(icon, door) //The door shape we want to 'cut out' of the decal + door_masker.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 1,1,1,0, 0,0,0,1) + door_masker.SwapColor("#ffffffff", null) + door_masker.Blend("#000000", ICON_SUBTRACT) + masked_decal.Blend(door_masker, ICON_ADD) + . += masked_decal + return + //If we're closed + if(!door) //We have no door, lets see if we have a decal. If not, theres nothing we need to do + if(decal) + . += decal return + else if (GLOB.podstyles[style][POD_SHAPE] != POD_SHAPE_NORML) //If we're not a normal pod shape (aka, if we don't have fins), just add the door without masking + . += door else - if (opened) - add_overlay("[icon_state]_open") - else - add_overlay("[icon_state]_door") + var/icon/masked_door = new(icon, door) //The door we want to apply + var/icon/fin_masker = new(icon, "mask_[fin_mask]") //The fin shape we want to 'cut out' of the door + fin_masker.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 1,1,1,0, 0,0,0,1) + fin_masker.SwapColor("#ffffffff", null) + fin_masker.Blend("#000000", ICON_SUBTRACT) + masked_door.Blend(fin_masker, ICON_ADD) + . += masked_door + if(decal) + . += decal -/obj/structure/closet/supplypod/proc/setStyle(chosenStyle, var/duringInit = FALSE) //Used to give the sprite an icon state, name, and description - if (!duringInit && style == chosenStyle) //Check if the input style is already the same as the pod's style. This happens in centcom_podlauncher, and as such we set the style to STYLE_CENTCOM. - setStyle(STYLE_CENTCOM) //We make sure to not check this during initialize() so the standard supplypod works correctly. - return - style = chosenStyle - icon_state = POD_STYLES[chosenStyle][POD_ICON_STATE] //POD_STYLES is a 2D array we treat as a dictionary. The style represents the verticle index, with the icon state, name, and desc being stored in the horizontal indexes of the 2D array. - if (!adminNamed && !specialised) //We dont want to name it ourselves if it has been specifically named by an admin using the centcom_podlauncher datum - name = POD_STYLES[chosenStyle][POD_NAME] - desc = POD_STYLES[chosenStyle][POD_DESC] - update_icon() /obj/structure/closet/supplypod/tool_interact(obj/item/W, mob/user) if(bluespace) //We dont want to worry about interacting with bluespace pods, as they are due to delete themselves soon anyways. @@ -111,199 +197,386 @@ /obj/structure/closet/supplypod/contents_explosion() //Supplypods also protect their contents from the harmful effects of fucking exploding. return -/obj/structure/closet/supplypod/prevent_content_explosion() //Useful for preventing epicenter explosions from damaging contents - return TRUE - /obj/structure/closet/supplypod/toggle(mob/living/user) //Supplypods shouldn't be able to be manually opened under any circumstances, as the open() proc generates supply order datums return -/obj/structure/closet/supplypod/proc/handleReturningClose(atom/movable/holder, returntobay) - opened = FALSE - INVOKE_ASYNC(holder, .proc/setClosed) //Use the INVOKE_ASYNC proc to call setClosed() on whatever the holder may be, without giving the atom/movable base class a setClosed() proc definition - for (var/atom/movable/O in get_turf(holder)) - if ((ismob(O) && !isliving(O)) || (is_type_in_typecache(O, GLOB.blacklisted_cargo_types) && !isliving(O))) //We dont want to take ghosts with us, and we don't want blacklisted items going, but we allow mobs. - continue - O.forceMove(holder) //Put objects inside before we close - var/obj/effect/temp_visual/risingPod = new /obj/effect/DPfall(get_turf(holder), src) //Make a nice animation of flying back up - risingPod.pixel_z = 0 //The initial value of risingPod's pixel_z is 200 because it normally comes down from a high spot - animate(risingPod, pixel_z = 200, time = 10, easing = LINEAR_EASING) //Animate our rising pod - if (returntobay) - holder.forceMove(bay) //Move the pod back to centcom, where it belongs - QDEL_IN(risingPod, 10) - reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open() ) - bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever - open(holder, forced = TRUE) - else - reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open() ) - bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever - - QDEL_IN(risingPod, 10) - audible_message("The pod hisses, closing quickly and launching itself away from the station.", "The ground vibrates, the nearby pod launching away from the station.") - - stay_after_drop = FALSE - specialisedPod(holder) // Do special actions for specialised pods - this is likely if we were already doing manual launches +/obj/structure/closet/supplypod/open(mob/living/user, force = TRUE) + return -/obj/structure/closet/supplypod/proc/preOpen() //Called before the open() proc. Handles anything that occurs right as the pod lands. - var/turf/T = get_turf(src) +/obj/structure/closet/supplypod/proc/handleReturnAfterDeparting(atom/movable/holder = src) + reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open_pod() ) + bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever + pod_flags &= ~FIRST_SOUNDS //Make it so we play sounds now + if (!effectQuiet && style != STYLE_SEETHROUGH) + audible_message("The pod hisses, closing and launching itself away from the station.", "The ground vibrates, and you hear the sound of engines firing.") + stay_after_drop = FALSE + holder.pixel_z = initial(holder.pixel_z) + holder.alpha = initial(holder.alpha) + var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/supplypod_temp_holding] + forceMove(shippingLane) //Move to the centcom-z-level until the pod_landingzone says we can drop back down again + if (!reverse_dropoff_coords) //If we're centcom-launched, the reverse dropoff turf will be a centcom loading bay. If we're an extraction pod, it should be the ninja jail. Thus, this shouldn't ever really happen. + var/obj/error_landmark = locate(/obj/effect/landmark/error) in GLOB.landmarks_list + var/turf/error_landmark_turf = get_turf(error_landmark) + reverse_dropoff_coords = list(error_landmark_turf.x, error_landmark_turf.y, error_landmark_turf.z) + if (custom_rev_delay) + delays = reverse_delays + backToNonReverseIcon() + var/turf/return_turf = locate(reverse_dropoff_coords[1], reverse_dropoff_coords[2], reverse_dropoff_coords[3]) + new /obj/effect/pod_landingzone(return_turf, src) + +/obj/structure/closet/supplypod/proc/preOpen() //Called before the open_pod() proc. Handles anything that occurs right as the pod lands. + var/turf/turf_underneath = get_turf(src) var/list/B = explosionSize //Mostly because B is more readable than explosionSize :p - if (landingSound) - playsound(get_turf(src), landingSound, soundVolume, 0, 0) - for (var/mob/living/M in T) - if (effectLimb && iscarbon(M)) //If effectLimb is true (which means we pop limbs off when we hit people): - var/mob/living/carbon/CM = M - for (var/obj/item/bodypart/bodypart in CM.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands - if(bodypart.body_part != HEAD && bodypart.body_part != CHEST)//we dont want to kill him, just teach em a lesson! - if (bodypart.dismemberable) - bodypart.dismember() //Using the power of flextape i've sawed this man's limb in half! - break - if (effectOrgans && iscarbon(M)) //effectOrgans means remove every organ in our mob - var/mob/living/carbon/CM = M - for(var/X in CM.internal_organs) - var/destination = get_edge_target_turf(T, pick(GLOB.alldirs)) //Pick a random direction to toss them in - var/obj/item/organ/O = X - O.Remove(CM) //Note that this isn't the same proc as for lists - O.forceMove(T) //Move the organ outta the body - O.throw_at(destination, 2, 3) //Thow the organ at a random tile 3 spots away - sleep(1) - for (var/obj/item/bodypart/bodypart in CM.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands - var/destination = get_edge_target_turf(T, pick(GLOB.alldirs)) - if (bodypart.dismemberable) - bodypart.dismember() //Using the power of flextape i've sawed this man's bodypart in half! - bodypart.throw_at(destination, 2, 3) + density = TRUE //Density is originally false so the pod doesn't block anything while it's still falling through the air + for (var/mob/living/target_living in turf_underneath) + if (iscarbon(target_living)) //If effectLimb is true (which means we pop limbs off when we hit people): + if (effectLimb) + var/mob/living/carbon/carbon_target_mob = target_living + for (var/bp in carbon_target_mob.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands + var/obj/item/bodypart/bodypart = bp + if(bodypart.body_part != HEAD && bodypart.body_part != CHEST)//we dont want to kill him, just teach em a lesson! + if (bodypart.dismemberable) + bodypart.dismember() //Using the power of flextape i've sawed this man's limb in half! + break + if (effectOrgans) //effectOrgans means remove every organ in our mob + var/mob/living/carbon/carbon_target_mob = target_living + for(var/organ in carbon_target_mob.internal_organs) + var/destination = get_edge_target_turf(turf_underneath, pick(GLOB.alldirs)) //Pick a random direction to toss them in + var/obj/item/organ/organ_to_yeet = organ + organ_to_yeet.Remove(carbon_target_mob) //Note that this isn't the same proc as for lists + organ_to_yeet.forceMove(turf_underneath) //Move the organ outta the body + organ_to_yeet.throw_at(destination, 2, 3) //Thow the organ at a random tile 3 spots away sleep(1) + for (var/bp in carbon_target_mob.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands + var/obj/item/bodypart/bodypart = bp + var/destination = get_edge_target_turf(turf_underneath, pick(GLOB.alldirs)) + if (bodypart.dismemberable) + bodypart.dismember() //Using the power of flextape i've sawed this man's bodypart in half! + bodypart.throw_at(destination, 2, 3) + sleep(1) if (effectGib) //effectGib is on, that means whatever's underneath us better be fucking oof'd on - M.adjustBruteLoss(5000) //THATS A LOT OF DAMAGE (called just in case gib() doesnt work on em) - M.gib() //After adjusting the fuck outta that brute loss we finish the job with some satisfying gibs - M.adjustBruteLoss(damage) + target_living.adjustBruteLoss(5000) //THATS A LOT OF DAMAGE (called just in case gib() doesnt work on em) + if (!QDELETED(target_living)) + target_living.gib() //After adjusting the fuck outta that brute loss we finish the job with some satisfying gibs + else + target_living.adjustBruteLoss(damage) var/explosion_sum = B[1] + B[2] + B[3] + B[4] if (explosion_sum != 0) //If the explosion list isn't all zeroes, call an explosion - explosion(get_turf(src), B[1], B[2], B[3], flame_range = B[4], silent = effectQuiet, ignorecap = istype(src, /obj/structure/closet/supplypod/centcompod)) //less advanced equipment than bluespace pod, so larger explosion when landing - else if (!effectQuiet) //If our explosion list IS all zeroes, we still make a nice explosion sound (unless the effectQuiet var is true) - playsound(src, "explosion", landingSound ? 15 : 80, 1) + explosion(turf_underneath, B[1], B[2], B[3], flame_range = B[4], silent = effectQuiet, ignorecap = istype(src, /obj/structure/closet/supplypod/centcompod)) //less advanced equipment than bluespace pod, so larger explosion when landing + else if (!effectQuiet && !(pod_flags & FIRST_SOUNDS)) //If our explosion list IS all zeroes, we still make a nice explosion sound (unless the effectQuiet var is true) + playsound(src, "explosion", landingSound ? soundVolume * 0.25 : soundVolume, TRUE) + if (landingSound) + playsound(turf_underneath, landingSound, soundVolume, FALSE, FALSE) if (effectMissile) //If we are acting like a missile, then right after we land and finish fucking shit up w explosions, we should delete opened = TRUE //We set opened to TRUE to avoid spending time trying to open (due to being deleted) during the Destroy() proc qdel(src) return if (style == STYLE_GONDOLA) //Checks if we are supposed to be a gondola pod. If so, create a gondolapod mob, and move this pod to nullspace. I'd like to give a shout out, to my man oranges - var/mob/living/simple_animal/pet/gondola/gondolapod/benis = new(get_turf(src), src) + var/mob/living/simple_animal/pet/gondola/gondolapod/benis = new(turf_underneath, src) benis.contents |= contents //Move the contents of this supplypod into the gondolapod mob. moveToNullspace() - addtimer(CALLBACK(src, .proc/open, benis), openingDelay) //After the openingDelay passes, we use the open proc from this supplyprod while referencing the contents of the "holder", in this case the gondolapod mob + addtimer(CALLBACK(src, .proc/open_pod, benis), delays[POD_OPENING]) //After the opening delay passes, we use the open proc from this supplyprod while referencing the contents of the "holder", in this case the gondolapod mob else if (style == STYLE_SEETHROUGH) - open(src) + open_pod(src) else - addtimer(CALLBACK(src, .proc/open, src), openingDelay) //After the openingDelay passes, we use the open proc from this supplypod, while referencing this supplypod's contents + addtimer(CALLBACK(src, .proc/open_pod, src), delays[POD_OPENING]) //After the opening delay passes, we use the open proc from this supplypod, while referencing this supplypod's contents -/obj/structure/closet/supplypod/open(atom/movable/holder, var/broken = FALSE, var/forced = FALSE) //The holder var represents an atom whose contents we will be working with +/obj/structure/closet/supplypod/proc/open_pod(atom/movable/holder, broken = FALSE, forced = FALSE) //The holder var represents an atom whose contents we will be working with if (!holder) return if (opened) //This is to ensure we don't open something that has already been opened return opened = TRUE - var/turf/T = get_turf(holder) //Get the turf of whoever's contents we're talking about - var/mob/M + holder.setOpened() + var/turf/turf_underneath = get_turf(holder) //Get the turf of whoever's contents we're talking about if (istype(holder, /mob)) //Allows mobs to assume the role of the holder, meaning we look at the mob's contents rather than the supplypod's contents. Typically by this point the supplypod's contents have already been moved over to the mob's contents - M = holder - if (M.key && !forced && !broken) //If we are player controlled, then we shouldnt open unless the opening is manual, or if it is due to being destroyed (represented by the "broken" parameter) + var/mob/holder_as_mob = holder + if (holder_as_mob.key && !forced && !broken) //If we are player controlled, then we shouldn't open unless the opening is manual, or if it is due to being destroyed (represented by the "broken" parameter) return if (openingSound) - playsound(get_turf(holder), openingSound, soundVolume, 0, 0) //Special admin sound to play - INVOKE_ASYNC(holder, .proc/setOpened) //Use the INVOKE_ASYNC proc to call setOpened() on whatever the holder may be, without giving the atom/movable base class a setOpened() proc definition - if (style == STYLE_SEETHROUGH) - update_icon() - for (var/atom/movable/O in holder.contents) //Go through the contents of the holder - O.forceMove(T) //move everything from the contents of the holder to the turf of the holder - if (!effectQuiet && !openingSound && style != STYLE_SEETHROUGH) //If we aren't being quiet, play the default pod open sound - playsound(get_turf(holder), open_sound, 15, 1, -3) + playsound(get_turf(holder), openingSound, soundVolume, FALSE, FALSE) //Special admin sound to play + for (var/turf_type in turfs_in_cargo) + turf_underneath.PlaceOnTop(turf_type) + for (var/cargo in contents) + var/atom/movable/movable_cargo = cargo + movable_cargo.forceMove(turf_underneath) + if (!effectQuiet && !openingSound && style != STYLE_SEETHROUGH && !(pod_flags & FIRST_SOUNDS)) //If we aren't being quiet, play the default pod open sound + playsound(get_turf(holder), open_sound, 15, TRUE, -3) if (broken) //If the pod is opening because it's been destroyed, we end here return if (style == STYLE_SEETHROUGH) - depart(src) + startExitSequence(src) else + if (reversing) + addtimer(CALLBACK(src, .proc/SetReverseIcon), delays[POD_LEAVING]/2) //Finish up the pod's duties after a certain amount of time if(!stay_after_drop) // Departing should be handled manually - addtimer(CALLBACK(src, .proc/depart, holder), departureDelay) //Finish up the pod's duties after a certain amount of time + addtimer(CALLBACK(src, .proc/startExitSequence, holder), delays[POD_LEAVING]*(4/5)) //Finish up the pod's duties after a certain amount of time -/obj/structure/closet/supplypod/proc/depart(atom/movable/holder) +/obj/structure/closet/supplypod/proc/startExitSequence(atom/movable/holder) if (leavingSound) - playsound(get_turf(holder), leavingSound, soundVolume, 0, 0) + playsound(get_turf(holder), leavingSound, soundVolume, FALSE, FALSE) if (reversing) //If we're reversing, we call the close proc. This sends the pod back up to centcom close(holder) else if (bluespace) //If we're a bluespace pod, then delete ourselves (along with our holder, if a seperate holder exists) + deleteRubble() if (!effectQuiet && style != STYLE_INVISIBLE && style != STYLE_SEETHROUGH) do_sparks(5, TRUE, holder) //Create some sparks right before closing qdel(src) //Delete ourselves and the holder if (holder != src) qdel(holder) -/obj/structure/closet/supplypod/centcompod/close(atom/movable/holder) //Closes the supplypod and sends it back to centcom. Should only ever be called if the "reversing" variable is true - handleReturningClose(holder, TRUE) +/obj/structure/closet/supplypod/close(atom/movable/holder) //Closes the supplypod and sends it back to centcom. Should only ever be called if the "reversing" variable is true + if (!holder) + return + take_contents(holder) + playsound(holder, close_sound, soundVolume*0.75, TRUE, -3) + holder.setClosed() + addtimer(CALLBACK(src, .proc/preReturn, holder), delays[POD_LEAVING] * 0.2) //Start to leave a bit after closing for cinematic effect + +/obj/structure/closet/supplypod/take_contents(atom/movable/holder) + var/turf/turf_underneath = holder.drop_location() + for(var/atom_to_check in turf_underneath) + if(atom_to_check != src && !insert(atom_to_check, holder)) // Can't insert that + continue + insert(turf_underneath, holder) + +/obj/structure/closet/supplypod/insert(atom/to_insert, atom/movable/holder) + if(insertion_allowed(to_insert)) + if(isturf(to_insert)) + var/turf/turf_to_insert = to_insert + turfs_in_cargo += turf_to_insert.type + turf_to_insert.ScrapeAway() + else + var/atom/movable/movable_to_insert = to_insert + movable_to_insert.forceMove(holder) + return TRUE + else + return FALSE -/obj/structure/closet/supplypod/extractionpod/close(atom/movable/holder) //handles closing, and returns pod - deletes itself when returned - . = ..() - return +/obj/structure/closet/supplypod/insertion_allowed(atom/to_insert) + if(to_insert.invisibility == INVISIBILITY_ABSTRACT) + return FALSE + if(ismob(to_insert)) + if(!reverseOptionList["Mobs"]) + return FALSE + if(!isliving(to_insert)) //let's not put ghosts or camera mobs inside + return FALSE + var/mob/living/mob_to_insert = to_insert + if(mob_to_insert.anchored || mob_to_insert.incorporeal_move) + return FALSE + mob_to_insert.stop_pulling() + + else if(isobj(to_insert)) + var/obj/obj_to_insert = to_insert + if(istype(obj_to_insert, /obj/structure/closet/supplypod)) + return FALSE + if(istype(obj_to_insert, /obj/effect/supplypod_smoke)) + return FALSE + if(istype(obj_to_insert, /obj/effect/pod_landingzone)) + return FALSE + if(istype(obj_to_insert, /obj/effect/supplypod_rubble)) + return FALSE + /* + if((obj_to_insert.comp_lookup && obj_to_insert.comp_lookup[COMSIG_OBJ_HIDE]) && reverseOptionList["Underfloor"]) + return TRUE + else if ((obj_to_insert.comp_lookup && obj_to_insert.comp_lookup[COMSIG_OBJ_HIDE]) && !reverseOptionList["Underfloor"]) + return FALSE + */ + if(isProbablyWallMounted(obj_to_insert) && reverseOptionList["Wallmounted"]) + return TRUE + else if (isProbablyWallMounted(obj_to_insert) && !reverseOptionList["Wallmounted"]) + return FALSE + if(!obj_to_insert.anchored && reverseOptionList["Unanchored"]) + return TRUE + if(obj_to_insert.anchored && reverseOptionList["Anchored"]) + return TRUE + return FALSE -/obj/structure/closet/supplypod/extractionpod/proc/send_up(atom/movable/holder) - if (!holder) - holder = src + else if (isturf(to_insert)) + if(isfloorturf(to_insert) && reverseOptionList["Floors"]) + return TRUE + if(isfloorturf(to_insert) && !reverseOptionList["Floors"]) + return FALSE + if(isclosedturf(to_insert) && reverseOptionList["Walls"]) + return TRUE + if(isclosedturf(to_insert) && !reverseOptionList["Walls"]) + return FALSE + return FALSE + return TRUE - if (leavingSound) - playsound(get_turf(holder), leavingSound, soundVolume, 0, 0) +/obj/structure/closet/supplypod/proc/preReturn(atom/movable/holder) + deleteRubble() + animate(holder, alpha = 0, time = 8, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL) + animate(holder, pixel_z = 400, time = 10, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL) //Animate our rising pod + + addtimer(CALLBACK(src, .proc/handleReturnAfterDeparting, holder), 15) //Finish up the pod's duties after a certain amount of time + +/obj/structure/closet/supplypod/setOpened() //Proc exists here, as well as in any atom that can assume the role of a "holder" of a supplypod. Check the open_pod() proc for more details + opened = TRUE + density = FALSE + update_icon() - handleReturningClose(holder, FALSE) +/obj/structure/closet/supplypod/extractionpod/setOpened() + opened = TRUE + density = TRUE + update_icon() -/obj/structure/closet/supplypod/proc/setOpened() //Proc exists here, as well as in any atom that can assume the role of a "holder" of a supplypod. Check the open() proc for more details +/obj/structure/closet/supplypod/setClosed() //Ditto + opened = FALSE + density = TRUE update_icon() -/obj/structure/closet/supplypod/proc/setClosed() //Ditto +/obj/structure/closet/supplypod/proc/tryMakeRubble(turf/T) //Ditto + if (rubble_type == RUBBLE_NONE) + return + if (rubble) + return + if (effectMissile) + return + if (isspaceturf(T) || isclosedturf(T)) + return + rubble = new /obj/effect/supplypod_rubble(T) + rubble.setStyle(rubble_type, src) + update_icon() + +/obj/structure/closet/supplypod/Moved() + deleteRubble() + return ..() + +/obj/structure/closet/supplypod/proc/deleteRubble() + rubble?.fadeAway() + rubble = null update_icon() +/obj/structure/closet/supplypod/proc/addGlow() + if (GLOB.podstyles[style][POD_SHAPE] != POD_SHAPE_NORML) + return + glow_effect = new(src) + glow_effect.icon_state = "pod_glow_" + GLOB.podstyles[style][POD_GLOW] + vis_contents += glow_effect + glow_effect.layer = GASFIRE_LAYER + RegisterSignal(glow_effect, COMSIG_PARENT_QDELETING, .proc/remove_glow) + +/obj/structure/closet/supplypod/proc/endGlow() + if(!glow_effect) + return + glow_effect.layer = LOW_ITEM_LAYER + glow_effect.fadeAway(delays[POD_OPENING]) + //Trust the signals + +/obj/structure/closet/supplypod/proc/remove_glow() + SIGNAL_HANDLER + + UnregisterSignal(glow_effect, COMSIG_PARENT_QDELETING) + vis_contents -= glow_effect + glow_effect = null + /obj/structure/closet/supplypod/Destroy() - open(src, broken = TRUE) //Lets dump our contents by opening up - . = ..() + open_pod(src, broken = TRUE) //Lets dump our contents by opening up + deleteRubble() + //Trust the signals even harder + qdel(glow_effect) + return ..() -//------------------------------------FALLING SUPPLY POD-------------------------------------// -/obj/effect/DPfall //Falling pod +//------------------------------------TEMPORARY_VISUAL-------------------------------------// +/obj/effect/supplypod_smoke //Falling pod smoke name = "" + icon = 'icons/obj/supplypods_32x32.dmi' + icon_state = "smoke" + desc = "" + layer = PROJECTILE_HIT_THRESHHOLD_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + alpha = 0 + +/obj/effect/engineglow //Falling pod smoke + name = "" + icon = 'icons/obj/supplypods.dmi' + icon_state = "pod_engineglow" + desc = "" + layer = GASFIRE_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + alpha = 255 + +/obj/effect/engineglow/proc/fadeAway(leaveTime) + var/duration = min(leaveTime, 25) + animate(src, alpha=0, time = duration) + QDEL_IN(src, duration + 5) + +/obj/effect/supplypod_smoke/proc/drawSelf(amount) + alpha = max(0, 255-(amount*20)) + +/obj/effect/supplypod_rubble //This is the object that forceMoves the supplypod to it's location + name = "Debris" + desc = "A small crater of rubble. Closer inspection reveals the debris to be made primarily of space-grade metal fragments. You're pretty sure that this will disperse before too long." icon = 'icons/obj/supplypods.dmi' - pixel_x = -16 - pixel_y = -5 - pixel_z = 200 - desc = "Get out of the way!" - layer = FLY_LAYER//that wasnt flying, that was falling with style! - icon_state = "" - -/obj/effect/DPfall/Initialize(dropLocation, obj/structure/closet/supplypod/pod) - if (pod.style == STYLE_SEETHROUGH) - pixel_x = -16 - pixel_y = 0 - for (var/atom/movable/O in pod.contents) - var/icon/I = getFlatIcon(O) //im so sorry - add_overlay(I) - else if (pod.style != STYLE_INVISIBLE) //Check to ensure the pod isn't invisible - icon_state = "[pod.icon_state]_falling" - name = pod.name + layer = PROJECTILE_HIT_THRESHHOLD_LAYER // We want this to go right below the layer of supplypods and supplypod_rubble's forground. + icon_state = "rubble_bg" + anchored = TRUE + pixel_x = SUPPLYPOD_X_OFFSET + var/foreground = "rubble_fg" + var/verticle_offset = 0 + +/obj/effect/supplypod_rubble/proc/getForeground(obj/structure/closet/supplypod/pod) + var/mutable_appearance/rubble_overlay = mutable_appearance('icons/obj/supplypods.dmi', foreground) + rubble_overlay.appearance_flags = KEEP_APART|RESET_TRANSFORM + rubble_overlay.transform = matrix().Translate(SUPPLYPOD_X_OFFSET - pod.pixel_x, verticle_offset) + return rubble_overlay + +/obj/effect/supplypod_rubble/proc/fadeAway() + animate(src, alpha=0, time = 30) + QDEL_IN(src, 35) + +/obj/effect/supplypod_rubble/proc/setStyle(type, obj/structure/closet/supplypod/pod) + if (type == RUBBLE_WIDE) + icon_state += "_wide" + foreground += "_wide" + if (type == RUBBLE_THIN) + icon_state += "_thin" + foreground += "_thin" + if (pod.style == STYLE_BOX) + verticle_offset = -2 + else + verticle_offset = initial(verticle_offset) + pixel_y = verticle_offset + +/obj/effect/pod_landingzone_effect + name = "" + desc = "" + icon = 'icons/obj/supplypods_32x32.dmi' + icon_state = "LZ_Slider" + layer = PROJECTILE_HIT_THRESHHOLD_LAYER + +/obj/effect/pod_landingzone_effect/Initialize(mapload, obj/structure/closet/supplypod/pod) . = ..() + transform = matrix() * 1.5 + animate(src, transform = matrix()*0.01, time = pod.delays[POD_TRANSIT]+pod.delays[POD_FALLING]) -//------------------------------------TEMPORARY_VISUAL-------------------------------------// -/obj/effect/DPtarget //This is the object that forceMoves the supplypod to it's location +/obj/effect/pod_landingzone //This is the object that forceMoves the supplypod to it's location 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" + icon = 'icons/obj/supplypods_32x32.dmi' + icon_state = "LZ" layer = PROJECTILE_HIT_THRESHHOLD_LAYER light_range = 2 - var/obj/effect/temp_visual/fallingPod //Temporary "falling pod" that we animate - var/obj/structure/closet/supplypod/pod //The supplyPod that will be landing ontop of this target + anchored = TRUE + alpha = 0 + var/obj/structure/closet/supplypod/pod //The supplyPod that will be landing ontop of this pod_landingzone + var/obj/effect/pod_landingzone_effect/helper + var/list/smoke_effects = new /list(13) /obj/effect/ex_act() return -/obj/effect/DPtarget/Initialize(mapload, podParam, var/single_order = null) +/obj/effect/pod_landingzone/Initialize(mapload, podParam, single_order = null, clientman) . = ..() if (ispath(podParam)) //We can pass either a path for a pod (as expressconsoles do), or a reference to an instantiated pod (as the centcom_podlauncher does) podParam = new podParam() //If its just a path, instantiate it pod = podParam + if (!pod.effectStealth) + helper = new (drop_location(), pod) + alpha = 255 + animate(src, transform = matrix().Turn(90), time = pod.delays[POD_TRANSIT]+pod.delays[POD_FALLING]) if (single_order) if (istype(single_order, /datum/supply_order)) var/datum/supply_order/SO = single_order @@ -311,48 +584,75 @@ else if (istype(single_order, /atom/movable)) var/atom/movable/O = single_order O.forceMove(pod) - for (var/mob/living/M in pod) //If there are any mobs in the supplypod, we want to forceMove them into the target. This is so that they can see where they are about to land, AND so that they don't get sent to the nullspace error room (as the pod is currently in nullspace) - M.forceMove(src) - if(pod.effectStun) //If effectStun is true, stun any mobs caught on this target until the pod gets a chance to hit them - for (var/mob/living/M in get_turf(src)) - M.Stun(pod.landingDelay+10, ignore_canstun = TRUE)//you aint goin nowhere, kid. - if (pod.effectStealth) //If effectStealth is true we want to be invisible - icon_state = "" - if (pod.fallDuration == initial(pod.fallDuration) && pod.landingDelay + pod.fallDuration < pod.fallingSoundLength) + for (var/mob/living/mob_in_pod in pod) //If there are any mobs in the supplypod, we want to set their view to the pod_landingzone. This is so that they can see where they are about to land + mob_in_pod.reset_perspective(src) + if(pod.effectStun) //If effectStun is true, stun any mobs caught on this pod_landingzone until the pod gets a chance to hit them + for (var/mob/living/target_living in get_turf(src)) + target_living.Stun(pod.delays[POD_TRANSIT]+10, ignore_canstun = TRUE)//you ain't goin nowhere, kid. + if (pod.delays[POD_FALLING] == initial(pod.delays[POD_FALLING]) && pod.delays[POD_TRANSIT] + pod.delays[POD_FALLING] < pod.fallingSoundLength) pod.fallingSoundLength = 3 //The default falling sound is a little long, so if the landing time is shorter than the default falling sound, use a special, shorter default falling sound pod.fallingSound = 'sound/weapons/mortar_whistle.ogg' - var/soundStartTime = pod.landingDelay - pod.fallingSoundLength + pod.fallDuration + var/soundStartTime = pod.delays[POD_TRANSIT] - pod.fallingSoundLength + pod.delays[POD_FALLING] if (soundStartTime < 0) soundStartTime = 1 - if (!pod.effectQuiet) + if (!pod.effectQuiet && !(pod.pod_flags & FIRST_SOUNDS)) addtimer(CALLBACK(src, .proc/playFallingSound), soundStartTime) - addtimer(CALLBACK(src, .proc/beginLaunch, pod.effectCircle), pod.landingDelay) + addtimer(CALLBACK(src, .proc/beginLaunch, pod.effectCircle), pod.delays[POD_TRANSIT]) -/obj/effect/DPtarget/proc/playFallingSound() +/obj/effect/pod_landingzone/proc/playFallingSound() playsound(src, pod.fallingSound, pod.soundVolume, 1, 6) -/obj/effect/DPtarget/proc/beginLaunch(effectCircle) //Begin the animation for the pod falling. The effectCircle param determines whether the pod gets to come in from any descent angle - fallingPod = new /obj/effect/DPfall(drop_location(), pod) - var/matrix/M = matrix(fallingPod.transform) //Create a new matrix that we can rotate - var/angle = effectCircle ? rand(0,360) : rand(70,110) //The angle that we can come in from - fallingPod.pixel_x = cos(angle)*400 //Use some ADVANCED MATHEMATICS to set the animated pod's position to somewhere on the edge of a circle with the center being the target - fallingPod.pixel_z = sin(angle)*400 - var/rotation = Get_Pixel_Angle(fallingPod.pixel_z, fallingPod.pixel_x) //CUSTOM HOMEBREWED proc that is just arctan with extra steps - M.Turn(rotation) //Turn our matrix accordingly - fallingPod.transform = M //Transform the animated pod according to the matrix - M = matrix(pod.transform) //Make another matrix based on the pod - M.Turn(rotation) //Turn the matrix - pod.transform = M //Turn the actual pod (Won't be visible until endLaunch() proc tho) - animate(fallingPod, pixel_z = 0, pixel_x = -16, time = pod.fallDuration, , easing = LINEAR_EASING) //Make the pod fall! At an angle! - addtimer(CALLBACK(src, .proc/endLaunch), pod.fallDuration, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation - -/obj/effect/DPtarget/proc/endLaunch() +/obj/effect/pod_landingzone/proc/beginLaunch(effectCircle) //Begin the animation for the pod falling. The effectCircle param determines whether the pod gets to come in from any descent angle + pod.addGlow() pod.update_icon() - pod.forceMove(drop_location()) //The fallingPod animation is over, now's a good time to forceMove the actual pod into position - QDEL_NULL(fallingPod) //Delete the falling pod 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 - for (var/mob/living/M in src) //Remember earlier (initialization) when we moved mobs into the DPTarget so they wouldnt get lost in nullspace? Time to get them out - M.forceMove(pod) + if (pod.style != STYLE_INVISIBLE) + pod.add_filter("motionblur",1,list("type"="motion_blur", "x"=0, "y"=3)) + pod.forceMove(drop_location()) + for (var/mob/living/M in pod) //Remember earlier (initialization) when we moved mobs into the pod_landingzone so they wouldnt get lost in nullspace? Time to get them out + M.reset_perspective(null) + var/angle = effectCircle ? rand(0,360) : rand(70,110) //The angle that we can come in from + pod.pixel_x = cos(angle)*32*length(smoke_effects) //Use some ADVANCED MATHEMATICS to set the animated pod's position to somewhere on the edge of a circle with the center being the target + pod.pixel_z = sin(angle)*32*length(smoke_effects) + var/rotation = Get_Pixel_Angle(pod.pixel_z, pod.pixel_x) //CUSTOM HOMEBREWED proc that is just arctan with extra steps + setupSmoke(rotation) + pod.transform = matrix().Turn(rotation) + pod.layer = FLY_LAYER + if (pod.style != STYLE_INVISIBLE) + animate(pod.get_filter("motionblur"), y = 0, time = pod.delays[POD_FALLING], flags = ANIMATION_PARALLEL) + animate(pod, pixel_z = -1 * abs(sin(rotation))*4, pixel_x = SUPPLYPOD_X_OFFSET + (sin(rotation) * 20), time = pod.delays[POD_FALLING], easing = LINEAR_EASING, flags = ANIMATION_PARALLEL) //Make the pod fall! At an angle! + addtimer(CALLBACK(src, .proc/endLaunch), pod.delays[POD_FALLING], TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation + +/obj/effect/pod_landingzone/proc/setupSmoke(rotation) + if (pod.style == STYLE_INVISIBLE || pod.style == STYLE_SEETHROUGH) + return + for ( var/i in 1 to length(smoke_effects)) + var/obj/effect/supplypod_smoke/smoke_part = new (drop_location()) + if (i == 1) + smoke_part.layer = FLY_LAYER + smoke_part.icon_state = "smoke_start" + smoke_part.transform = matrix().Turn(rotation) + smoke_effects[i] = smoke_part + smoke_part.pixel_x = sin(rotation)*32 * i + smoke_part.pixel_y = abs(cos(rotation))*32 * i + smoke_part.add_filter("smoke_blur", 1, gauss_blur_filter(size = 4)) + var/time = (pod.delays[POD_FALLING] / length(smoke_effects))*(length(smoke_effects)-i) + addtimer(CALLBACK(smoke_part, /obj/effect/supplypod_smoke/.proc/drawSelf, i), time, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation + QDEL_IN(smoke_part, pod.delays[POD_FALLING] + 35) + +/obj/effect/pod_landingzone/proc/drawSmoke() + if (pod.style == STYLE_INVISIBLE || pod.style == STYLE_SEETHROUGH) + return + for (var/obj/effect/supplypod_smoke/smoke_part in smoke_effects) + animate(smoke_part, alpha = 0, time = 20, flags = ANIMATION_PARALLEL) + animate(smoke_part.get_filter("smoke_blur"), size = 6, time = 15, easing = CUBIC_EASING|EASE_OUT, flags = ANIMATION_PARALLEL) + +/obj/effect/pod_landingzone/proc/endLaunch() + pod.tryMakeRubble(drop_location()) + pod.layer = initial(pod.layer) + pod.endGlow() + QDEL_NULL(helper) pod.preOpen() //Begin supplypod open procedures. Here effects like explosions, damage, and other dangerous (and potentially admin-caused, if the centcom_podlauncher datum was used) memes will take place + drawSmoke() qdel(src) //The target's purpose is complete. It can rest easy now //------------------------------------UPGRADES-------------------------------------// diff --git a/code/modules/chatter/chatter.dm b/code/modules/chatter/chatter.dm index c985852c7dadd..6e6c69dd0aa3d 100644 --- a/code/modules/chatter/chatter.dm +++ b/code/modules/chatter/chatter.dm @@ -38,7 +38,7 @@ var/path = "sound/chatter/[phomeme]_[length].ogg" playsound(loc, path, - vol = 40, vary = 0, extrarange = 3, falloff = FALSE) + vol = 40, vary = 0, extrarange = 3) sleep((length + 1) * chatter_get_sleep_multiplier(phomeme)) diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm index f1477fb4d2c2d..5773a58e9012f 100644 --- a/code/modules/client/client_colour.dm +++ b/code/modules/client/client_colour.dm @@ -1,77 +1,158 @@ - -/* - Client Colour Priority System By RemieRichards - A System that gives finer control over which client.colour value to display on screen - so that the "highest priority" one is always displayed as opposed to the default of - "whichever was set last is displayed" -*/ - - - -/* - Define subtypes of this datum -*/ +#define PRIORITY_ABSOLUTE 1 +#define PRIORITY_HIGH 10 +#define PRIORITY_NORMAL 100 +#define PRIORITY_LOW 1000 + +/** + * Client Colour Priority System By RemieRichards (then refactored by another contributor) + * A System that gives finer control over which client.colour value to display on screen + * so that the "highest priority" one is always displayed as opposed to the default of + * "whichever was set last is displayed". + * + * Refactored to allow multiple overlapping client colours + * (e.g. wearing blue glasses under a yellow visor, even though the result is a little unsatured.) + * As well as some support for animated colour transitions. + * + * Define subtypes of this datum + */ /datum/client_colour - var/colour = "" //Any client.color-valid value - var/priority = 1 //Since only one client.color can be rendered on screen, we take the one with the highest priority value: - //eg: "Bloody screen" > "goggles colour" as the former is much more important - + ///Any client.color-valid value + var/colour = "" + ///The mob that owns this client_colour. + var/mob/owner + /** + * We prioritize colours with higher priority (lower numbers), so they don't get overriden by less important ones: + * eg: "Bloody screen" > "goggles colour" as the former is much more important + */ + var/priority = PRIORITY_NORMAL + ///Will this client_colour prevent ones of lower priority from being applied? + var/override = FALSE + ///IF non-zero, 'animate_client_colour(fade_in)' will be called instead of 'update_client_colour' when added. + var/fade_in = 0 + ///Same as above, but on removal. + var/fade_out = 0 + +/datum/client_colour/New(mob/_owner) + owner = _owner + +/datum/client_colour/Destroy() + if(!QDELETED(owner)) + owner.client_colours -= src + if(fade_out) + owner.animate_client_colour(fade_out) + else + owner.update_client_colour() + owner = null + return ..() + +///Sets a new colour, then updates the owner's screen colour. +/datum/client_colour/proc/update_colour(new_colour, anim_time, easing = 0) + colour = new_colour + if(anim_time) + owner.animate_client_colour(anim_time, easing) + else + owner.update_client_colour() /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) -*/ +/** + * Adds an instance of colour_type to the mob's client_colours list + * colour_type - a typepath (subtyped from /datum/client_colour) + */ /mob/proc/add_client_colour(colour_type) if(!ispath(colour_type, /datum/client_colour)) return - var/datum/client_colour/CC = new colour_type() - client_colours |= CC - sortTim(client_colours, /proc/cmp_clientcolour_priority) - update_client_colour() - - -/* - Removes an instance of colour_type from the mob's client_colours list - colour_type - a typepath (subtyped from /datum/client_colour) -*/ + var/datum/client_colour/colour = new colour_type(src) + BINARY_INSERT(colour, client_colours, /datum/client_colour, colour, priority, COMPARE_KEY) + if(colour.fade_in) + animate_client_colour(colour.fade_in) + else + update_client_colour() + return colour + +/** + * Removes an instance of colour_type from the mob's client_colours list + * colour_type - a typepath (subtyped from /datum/client_colour) + */ /mob/proc/remove_client_colour(colour_type) if(!ispath(colour_type, /datum/client_colour)) return for(var/cc in client_colours) - var/datum/client_colour/CC = cc - if(CC.type == colour_type) - client_colours -= CC - qdel(CC) + var/datum/client_colour/colour = cc + if(colour.type == colour_type) + qdel(colour) break - update_client_colour() - -/* - Resets the mob's client.color to null, and then sets it to the highest priority - client_colour datum, if one exists -*/ +/** + * Gets the resulting colour/tone from client_colours. + * In the case of multiple colours, they'll be converted to RGBA matrices for compatibility, + * summed together, and then each element divided by the number of matrices. (except we do this with lists because byond) + * target is the target variable. + */ +#define MIX_CLIENT_COLOUR(target)\ + var/_our_colour;\ + var/_number_colours = 0;\ + var/_pool_closed = INFINITY;\ + for(var/_c in client_colours){\ + var/datum/client_colour/_colour = _c;\ + if(_pool_closed < _colour.priority){\ + break\ + };\ + _number_colours++;\ + if(_colour.override){\ + _pool_closed = _colour.priority\ + };\ + if(!_our_colour){\ + _our_colour = _colour.colour;\ + continue\ + };\ + if(_number_colours == 2){\ + _our_colour = color_to_full_rgba_matrix(_our_colour)\ + };\ + var/list/_colour_matrix = color_to_full_rgba_matrix(_colour.colour);\ + var/list/_L = _our_colour;\ + for(var/_i in 1 to 20){\ + _L[_i] += _colour_matrix[_i]\ + };\ + };\ + if(_number_colours > 1){\ + var/list/_L = _our_colour;\ + for(var/_i in 1 to 20){\ + _L[_i] /= _number_colours\ + };\ + };\ + target = _our_colour\ + + +/** + * Resets the mob's client.color to null, and then reapplies a new color based + * on the client_colour datums it currently has. + */ /mob/proc/update_client_colour() if(!client) return client.color = "" if(!client_colours.len) return - var/datum/client_colour/CC = client_colours[1] - if(CC) - client.color = CC.colour - + MIX_CLIENT_COLOUR(client.color) +///Works similarly to 'update_client_colour', but animated. +/mob/proc/animate_client_colour(anim_time = 20, anim_easing = 0) + if(!client) + return + if(!client_colours.len) + animate(client, color = "", time = anim_time, easing = anim_easing) + return + MIX_CLIENT_COLOUR(var/anim_colour) + animate(client, color = anim_colour, time = anim_time, easing = anim_easing) +#undef MIX_CLIENT_COLOUR /datum/client_colour/glass_colour - priority = 0 + priority = PRIORITY_LOW colour = "red" /datum/client_colour/glass_colour/green @@ -110,4 +191,21 @@ /datum/client_colour/monochrome colour = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) - priority = INFINITY //we can't see colors anyway! + priority = PRIORITY_HIGH //we can't see colors anyway! + override = TRUE + fade_in = 20 + fade_out = 20 + +/datum/client_colour/bloodlust + priority = PRIORITY_ABSOLUTE // Only anger. + colour = list(0,0,0,0,0,0,0,0,0,1,0,0) //pure red. + fade_out = 10 + +/datum/client_colour/bloodlust/New(mob/_owner) + ..() + addtimer(CALLBACK(src, .proc/update_colour, list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0), 10, SINE_EASING|EASE_OUT), 1) + +#undef PRIORITY_ABSOLUTE +#undef PRIORITY_HIGH +#undef PRIORITY_NORMAL +#undef PRIORITY_LOW diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index b77e28ef24e4c..814cf3f84b786 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -25,8 +25,9 @@ var/total_message_count = 0 /// Next tick to reset the total message counter var/total_count_reset = 0 - var/ircreplyamount = 0 + var/externalreplyamount = 0 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 + var/staff_check_rate = 0 //when was the last time they checked online staff ///////// //OTHER// @@ -34,6 +35,7 @@ /// The client's preferences var/datum/preferences/prefs = null var/list/keybindings[0] + var/movement_locked = FALSE /// The last world.time that the client's mob turned var/last_turn = 0 @@ -42,11 +44,7 @@ var/move_delay = 0 var/area = null - /////////////// - //SOUND STUFF// - /////////////// - var/ambient_buzz_playing = null // What buzz ambience is currently playing - var/ambient_effect_last_played = 0 // What was the last time we played an ambient effect noise? + var/buzz_playing = null //////////// //SECURITY// //////////// @@ -70,7 +68,7 @@ preload_rsc = PRELOAD_RSC - var/obj/screen/click_catcher/void + var/atom/movable/screen/click_catcher/void //These two vars are used to make a special mouse cursor, with a unique icon for clicking /// Mouse icon while not clicking @@ -99,7 +97,7 @@ /// These persist between logins/logouts during the same round. var/datum/player_details/player_details - var/list/char_render_holders //Should only be a key-value list of north/south/east/west = obj/screen. + var/list/char_render_holders //Should only be a key-value list of north/south/east/west = atom/movable/screen. var/client_keysend_amount = 0 var/next_keysend_reset = 0 diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 1c9ab5a76ca3f..18b281e10926b 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -4,7 +4,7 @@ #define UPLOAD_LIMIT 10485760 //Restricts client uploads to the server to 1MB //Could probably do with being lower. - +#define MAX_RECOMMENDED_CLIENT 1568 GLOBAL_LIST_INIT(blacklisted_builds, list( "1407" = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see", @@ -95,6 +95,9 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(tgui_Topic(href_list)) return + if(href_list["reload_tguipanel"]) + nuke_chat() + // Admin PM if(href_list["priv_msg"]) cmd_admin_pm(href_list["priv_msg"],null) @@ -215,6 +218,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( tgui_panel = new(src) GLOB.ahelp_tickets.ClientLogin(src) + GLOB.requests.client_login(src) var/connecting_admin = FALSE //because de-admined admins connecting should be treated like admins. //Admin Authorisation holder = GLOB.admin_datums[ckey] @@ -223,7 +227,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( holder.owner = src connecting_admin = TRUE else if(GLOB.deadmins[ckey]) - verbs += /client/proc/readmin + add_verb(/client/proc/readmin) connecting_admin = TRUE if(CONFIG_GET(flag/autoadmin)) if(!GLOB.admin_datums[ckey]) @@ -252,8 +256,10 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( prefs.last_id = computer_id //these are gonna be used for banning fps = prefs.clientfps + prefs.handle_donator_items() + if(fexists(roundend_report_file())) - verbs += /client/proc/show_previous_roundend_report + add_verb(/client/proc/show_previous_roundend_report) var/full_version = "[byond_version].[byond_build ? byond_build : "xxx"]" log_access("Login: [key_name(src)] from [address ? address : "localhost"]-[computer_id] || BYOND v[full_version]") @@ -309,7 +315,9 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( else qdel(src) return - + if(byond_build > MAX_RECOMMENDED_CLIENT) + to_chat(src, "Your version of byond is over the maximum recommended version for clients (build [MAX_RECOMMENDED_CLIENT]) and may be unstable.") + to_chat(src, "Please download an older version of byond. You can go to BYOND's website to download other versions.") if(SSinput.initialized) set_macros() @@ -385,7 +393,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if (nnpa >= 0) message_admins("New user: [key_name_admin(src)] is connecting here for the first time.") if (CONFIG_GET(flag/irc_first_connection_alert)) - send2irc_adminless_only("New-user", "[key_name(src)] is connecting for the first time!") + send2tgs_adminless_only("New-user", "[key_name(src)] is connecting for the first time!") else if (isnum_safe(cached_player_age) && cached_player_age < nnpa) message_admins("New user: [key_name_admin(src)] just connected with an age of [cached_player_age] day[(player_age==1?"":"s")]") if(CONFIG_GET(flag/use_account_age_for_jobs) && account_age >= 0) @@ -393,13 +401,13 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(account_age >= 0 && account_age < nnpa) message_admins("[key_name_admin(src)] (IP: [address], ID: [computer_id]) is a new BYOND account [account_age] day[(account_age==1?"":"s")] old, created on [account_join_date].") if (CONFIG_GET(flag/irc_first_connection_alert)) - send2irc_adminless_only("new_byond_user", "[key_name(src)] (IP: [address], ID: [computer_id]) is a new BYOND account [account_age] day[(account_age==1?"":"s")] old, created on [account_join_date].") + send2tgs_adminless_only("new_byond_user", "[key_name(src)] (IP: [address], ID: [computer_id]) is a new BYOND account [account_age] day[(account_age==1?"":"s")] old, created on [account_join_date].") get_message_output("watchlist entry", ckey) check_ip_intel() validate_key_in_db() fetch_uuid() - verbs += /client/proc/show_account_identifier + add_verb(/client/proc/show_account_identifier) send_resources() @@ -424,32 +432,12 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them. to_chat(src, "Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.") + update_ambience_pref() //This is down here because of the browse() calls in tooltip/New() if(!tooltips) tooltips = new /datum/tooltip(src) - var/list/topmenus = GLOB.menulist[/datum/verbs/menu] - for (var/thing in topmenus) - var/datum/verbs/menu/topmenu = thing - var/topmenuname = "[topmenu]" - if (topmenuname == "[topmenu.type]") - var/list/tree = splittext(topmenuname, "/") - topmenuname = tree[tree.len] - winset(src, "[topmenu.type]", "parent=menu;name=[rustg_url_encode(topmenuname)]") - var/list/entries = topmenu.Generate_list(src) - for (var/child in entries) - winset(src, "[child]", "[entries[child]]") - if (!ispath(child, /datum/verbs/menu)) - var/procpath/verbpath = child - if (verbpath.name[1] != "@") - new child(src) - - for (var/thing in prefs.menuoptions) - var/datum/verbs/menu/menuitem = GLOB.menulist[thing] - if (menuitem) - menuitem.Load_checked(src) - view_size = new(src, getScreenSize(mob)) view_size.resetFormat() view_size.setZoomMode() @@ -457,8 +445,17 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( Master.UpdateTickRate() if(GLOB.ckey_redirects.Find(ckey)) - to_chat(src, "The server is full. You will be redirected to [CONFIG_GET(string/redirect_address)] in 10 seconds.") - addtimer(CALLBACK(src, .proc/time_to_redirect), (10 SECONDS)) + if(isnewplayer(mob)) + to_chat(src, "The server is full. You will be redirected to [CONFIG_GET(string/redirect_address)] in 10 seconds.") + addtimer(CALLBACK(src, .proc/time_to_redirect), (10 SECONDS)) + else + GLOB.ckey_redirects -= ckey + + //Add the default client verbs to the TGUI window + add_verb(subtypesof(/client/verb), TRUE) + + //Load the TGUI stat in case of TGUI subsystem not ready (startup) + mob.UpdateMobStat(TRUE) /client/proc/time_to_redirect() var/redirect_address = CONFIG_GET(string/redirect_address) @@ -541,12 +538,14 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( "Forever alone :("\ ) - send2irc("Server", "[cheesy_message] (No admins online)") + send2tgs("Server", "[cheesy_message] (No admins online)") GLOB.ahelp_tickets.ClientLogout(src) + GLOB.requests.client_logout(src) GLOB.directory -= ckey GLOB.clients -= src GLOB.mentors -= src + SSambience.ambience_listening_clients -= src QDEL_LIST_ASSOC_VAL(char_render_holders) if(movingmob != null) movingmob.client_mobs_in_contents -= mob @@ -598,11 +597,19 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(!query_client_in_db.Execute()) qdel(query_client_in_db) return - if(!query_client_in_db.NextRow()) - if (CONFIG_GET(flag/panic_bunker) && !holder && !GLOB.deadmins[ckey]) - log_access("Failed Login: [key] - New account attempting to connect during panic bunker") - message_admins("Failed Login: [key] - New account attempting to connect during panic bunker") - to_chat(src, CONFIG_GET(string/panic_bunker_message)) + + //If we aren't an admin, and the flag is set + if(CONFIG_GET(flag/panic_bunker) && !holder && !GLOB.deadmins[ckey]) + var/living_recs = CONFIG_GET(number/panic_bunker_living) + //Relies on pref existing, but this proc is only called after that occurs, so we're fine. + var/minutes = get_exp_living(pure_numeric = TRUE) + if(minutes < living_recs) + var/reject_message = "Failed Login: [key] - Account attempting to connect during panic bunker, but they do not have the required living time [minutes]/[living_recs]" + log_access(reject_message) + message_admins("[reject_message]") + var/message = CONFIG_GET(string/panic_bunker_message) + message = replacetext(message, "%minutes%", living_recs) + to_chat(src, message) var/list/connectiontopic_a = params2list(connectiontopic) var/list/panic_addr = CONFIG_GET(string/panic_server_address) if(panic_addr && !connectiontopic_a["redirect"]) @@ -614,6 +621,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( qdel(src) return + if(!query_client_in_db.NextRow()) new_player = 1 account_join_date = findJoinDate() var/datum/DBQuery/query_add_player = SSdbcore.NewQuery({" @@ -777,7 +785,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if (!cidcheck_failedckeys[ckey]) message_admins("[key_name(src)] has been detected as using a cid randomizer. Connection rejected.") - send2irc_adminless_only("CidRandomizer", "[key_name(src)] has been detected as using a cid randomizer. Connection rejected.") + send2tgs_adminless_only("CidRandomizer", "[key_name(src)] has been detected as using a cid randomizer. Connection rejected.") cidcheck_failedckeys[ckey] = TRUE note_randomizer_user() @@ -788,7 +796,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( else if (cidcheck_failedckeys[ckey]) message_admins("[key_name_admin(src)] has been allowed to connect after showing they removed their cid randomizer") - send2irc_adminless_only("CidRandomizer", "[key_name(src)] has been allowed to connect after showing they removed their cid randomizer.") + send2tgs_adminless_only("CidRandomizer", "[key_name(src)] has been allowed to connect after showing they removed their cid randomizer.") cidcheck_failedckeys -= ckey if (cidcheck_spoofckeys[ckey]) message_admins("[key_name_admin(src)] has been allowed to connect after appearing to have attempted to spoof a cid randomizer check because it appears they aren't spoofing one this time") @@ -913,9 +921,9 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( /client/proc/add_verbs_from_config() if(CONFIG_GET(flag/see_own_notes)) - verbs += /client/proc/self_notes + add_verb(/client/proc/self_notes) if(CONFIG_GET(flag/use_exp_tracking)) - verbs += /client/proc/self_playtime + add_verb(/client/proc/self_playtime) #undef UPLOAD_LIMIT @@ -964,6 +972,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( return FALSE if ("key") return FALSE + if("cached_badges") + return FALSE if("view") view_size.setDefault(var_value) return TRUE @@ -1003,7 +1013,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( var/pos = 0 for(var/D in GLOB.cardinals) pos++ - var/obj/screen/O = LAZYACCESS(char_render_holders, "[D]") + var/atom/movable/screen/O = LAZYACCESS(char_render_holders, "[D]") if(!O) O = new LAZYSET(char_render_holders, "[D]", O) @@ -1014,7 +1024,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( /client/proc/clear_character_previews() for(var/index in char_render_holders) - var/obj/screen/S = char_render_holders[index] + var/atom/movable/screen/S = char_render_holders[index] screen -= S qdel(S) char_render_holders = null @@ -1024,7 +1034,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( set category = "OOC" set desc ="Get your ID for account verification." - verbs -= /client/proc/show_account_identifier + remove_verb(/client/proc/show_account_identifier) addtimer(CALLBACK(src, .proc/restore_account_identifier), 20) //Don't DoS DB queries, asshole var/confirm = alert("Do NOT share the verification ID in the following popup. Understand?", "Important Warning", "Yes", "Cancel") @@ -1047,7 +1057,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( onclose(src, "accountidentifier") /client/proc/restore_account_identifier() - verbs += /client/proc/show_account_identifier + add_verb(/client/proc/show_account_identifier) /client/proc/check_upstream_bans() set waitfor = 0 @@ -1079,3 +1089,15 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( qdel(src) return +/client/proc/open_filter_editor(atom/in_atom) + if(holder) + holder.filteriffic = new /datum/filter_editor(in_atom) + holder.filteriffic.ui_interact(mob) + +/client/proc/update_ambience_pref() + if(prefs.toggles & SOUND_AMBIENCE) + if(SSambience.ambience_listening_clients[src] > world.time) + return // If already properly set we don't want to reset the timer. + SSambience.ambience_listening_clients[src] = world.time + 10 SECONDS //Just wait 10 seconds before the next one aight mate? cheers. + else + SSambience.ambience_listening_clients -= src diff --git a/code/modules/client/loadout/loadout.dm b/code/modules/client/loadout/loadout.dm index 58a3e2ad7bd60..a62c4ad4c832e 100644 --- a/code/modules/client/loadout/loadout.dm +++ b/code/modules/client/loadout/loadout.dm @@ -11,10 +11,14 @@ GLOBAL_LIST_EMPTY(gear_datums) /proc/populate_gear_list() //create a list of gear datums to sort + var/list/used_ids = list() for(var/geartype in subtypesof(/datum/gear)) var/datum/gear/G = geartype var/use_name = initial(G.display_name) + var/use_id = initial(G.id) + if(!use_id) //Not set, generate fallback + use_id = md5(use_name) var/use_category = initial(G.sort_category) if(G == initial(G.subtype_path)) @@ -23,6 +27,9 @@ GLOBAL_LIST_EMPTY(gear_datums) if(!use_name) WARNING("Loadout - Missing display name: [G]") continue + if(use_id in used_ids) + WARNING("Loadout - ID Already Exists: [G], with ID:[use_id], Conflicts with: [used_ids[use_id]]") + continue if(!initial(G.cost)) WARNING("Loadout - Missing cost: [G]") continue @@ -32,18 +39,19 @@ GLOBAL_LIST_EMPTY(gear_datums) if(!GLOB.loadout_categories[use_category]) GLOB.loadout_categories[use_category] = new /datum/loadout_category(use_category) + used_ids[use_id] = G var/datum/loadout_category/LC = GLOB.loadout_categories[use_category] - GLOB.gear_datums[use_name] = new geartype - LC.gear[use_name] = GLOB.gear_datums[use_name] + GLOB.gear_datums[use_id] = new geartype + LC.gear[use_id] = GLOB.gear_datums[use_id] GLOB.loadout_categories = sortAssoc(GLOB.loadout_categories) - return 1 /datum/gear - var/display_name //Name/index. Must be unique. + var/display_name //Name. Should be unique. + var/id //ID string. MUST be unique. var/description //Description of this gear. If left blank will default to the description of the pathed item. var/path //Path to item. - var/cost = INFINITY //Number of metacoins + var/cost = INFINITY //Number of metacoins var/slot //Slot to equip to. var/list/allowed_roles //Roles that can spawn with this item. var/list/species_blacklist //Stop certain species from receiving this gear @@ -53,6 +61,7 @@ GLOBAL_LIST_EMPTY(gear_datums) /datum/gear/New() ..() + id = md5(display_name) if(!description) var/obj/O = path description = initial(O.desc) diff --git a/code/modules/client/loadout/loadout_accessories.dm b/code/modules/client/loadout/loadout_accessories.dm index cb2b8170cfaae..6502d8d2d6533 100644 --- a/code/modules/client/loadout/loadout_accessories.dm +++ b/code/modules/client/loadout/loadout_accessories.dm @@ -2,7 +2,7 @@ /datum/gear/accessory subtype_path = /datum/gear/accessory - slot = SLOT_NECK + slot = ITEM_SLOT_NECK sort_category = "Accessories" /datum/gear/accessory/scarf @@ -36,11 +36,22 @@ path = /obj/item/clothing/neck/stripedbluescarf cost = 1200 +//armbands /datum/gear/accessory/armband_red - display_name = "armband" + display_name = "armband, red" path = /obj/item/clothing/accessory/armband cost = 1000 +/datum/gear/accessory/armband_blu + display_name = "armband, blue" + path = /obj/item/clothing/accessory/armband/blue + cost = 1000 + +/datum/gear/accessory/armband_grn + display_name = "armband, green" + path = /obj/item/clothing/accessory/armband/green + cost = 1000 + //ties /datum/gear/accessory/tie subtype_path = /datum/gear/accessory/tie @@ -88,19 +99,19 @@ /datum/gear/accessory/eyepatch display_name = "eyepatch" - slot = SLOT_GLASSES + slot = ITEM_SLOT_EYES path = /obj/item/clothing/glasses/eyepatch cost = 1200 /datum/gear/accessory/monocle display_name = "monocle" - slot = SLOT_GLASSES + slot = ITEM_SLOT_EYES path = /obj/item/clothing/glasses/monocle cost = 1200 /datum/gear/accessory/glasses display_name = "prescription glasses" - slot = SLOT_GLASSES + slot = ITEM_SLOT_EYES path = /obj/item/clothing/glasses/regular cost = 3000 @@ -129,7 +140,7 @@ path = /obj/item/clothing/glasses/heat /datum/gear/accessory/glasses/orange - display_name = "sunglasses" + display_name = "orange sunglasses" path = /obj/item/clothing/glasses/orange /datum/gear/accessory/glasses/red @@ -162,3 +173,14 @@ display_name = "lipstick, random color" path = /obj/item/lipstick/random cost = 1400 + +//Cloaks + +/datum/gear/accessory/cloak + subtype_path = /datum/gear/accessory/cloak + cost = 10000 + +/datum/gear/accessory/cloak/blackbishop + display_name = "black bishop's cloak" + path = /obj/item/clothing/neck/cloak/chap/bishop/black + allowed_roles = list("Chaplain") diff --git a/code/modules/client/loadout/loadout_donator.dm b/code/modules/client/loadout/loadout_donator.dm new file mode 100644 index 0000000000000..6231340325a87 --- /dev/null +++ b/code/modules/client/loadout/loadout_donator.dm @@ -0,0 +1,136 @@ +/datum/gear/donator + subtype_path = /datum/gear/donator + sort_category = "Donator" + cost = 3500 + +//BACKPACKS + +/datum/gear/donator/backpack + subtype_path = /datum/gear/donator/backpack + slot = ITEM_SLOT_BACK + +/datum/gear/donator/backpack/ian + display_name = "ian backpack" + path = /obj/item/storage/backpack/ian + +/datum/gear/donator/backpack/lisa + display_name = "lisa backpack" + path = /obj/item/storage/backpack/lisa + +/datum/gear/donator/backpack/renault + display_name = "renault backpack" + path = /obj/item/storage/backpack/renault + +/datum/gear/donator/backpack/cak + display_name = "cak catpack" + path = /obj/item/storage/backpack/cak + +/datum/gear/donator/backpack/runtime + display_name = "runtime catpack" + path = /obj/item/storage/backpack/runtime + +//SUIT + +/datum/gear/donator/suit + subtype_path = /datum/gear/donator/suit + slot = ITEM_SLOT_OCLOTHING + +/datum/gear/donator/suit/delinquent + display_name = "deliquent jacket" + path = /obj/item/clothing/suit/delinquent + +/datum/gear/donator/suit/madsci + display_name = "mad scientist labcoat" + path = /obj/item/clothing/suit/madsci + +/datum/gear/donator/suit/renault_costume + display_name = "renault costume" + path = /obj/item/clothing/suit/hooded/renault_costume + +/datum/gear/donator/suit/retro_jacket + display_name = "retro jacket" + path = /obj/item/clothing/suit/retro_jacket + +//UNIFORM/UNDER +/datum/gear/donator/uniform + subtype_path = /datum/gear/donator/uniform + slot = ITEM_SLOT_ICLOTHING + +/datum/gear/donator/uniform/wine_gown + display_name = "wine gown" + path = /obj/item/clothing/under/dress/gown + +/datum/gear/donator/uniform/teal_gown + display_name = "teal gown" + path = /obj/item/clothing/under/dress/gown/teal + +/datum/gear/donator/uniform/midnight_gown + display_name = "midnight gown" + path = /obj/item/clothing/under/dress/gown/midnight + +/datum/gear/donator/uniform/gangster + display_name = "gangster suit" + path = /obj/item/clothing/under/gangster + +/datum/gear/donator/uniform/gangster_purple + display_name = "purple gangster suit" + path = /obj/item/clothing/under/gangster/purple + +//HEAD + +/datum/gear/donator/head + subtype_path = /datum/gear/donator/head + slot = ITEM_SLOT_HEAD + +/datum/gear/donator/head/gangster_wig + display_name = "gangster wig" + path = /obj/item/clothing/head/gangsterwig + +/datum/gear/donator/head/oldhat + display_name = "old man hat" + path = /obj/item/clothing/head/oldhat + +/datum/gear/donator/head/marine + display_name = "mariner hat" + path = /obj/item/clothing/head/marine + +/datum/gear/donator/suit/retro_chicken_head + display_name = "retro chicken head" + path = /obj/item/clothing/head/chicken_head_retro + +//NECK +/datum/gear/donator/neck + subtype_path = /datum/gear/donator/neck + slot = ITEM_SLOT_NECK + +/datum/gear/donator/neck/bizzare + display_name = "bizzare scarf" + path = /obj/item/clothing/neck/bizzarescarf + +/datum/gear/donator/neck/conductive + display_name = "conductive scarf" + path = /obj/item/clothing/neck/conductivescarf + +//ITEMS + +/datum/gear/donator/item + subtype_path = /datum/gear/donator/item + slot = ITEM_SLOT_BACKPACK + cost = 5000 + +/datum/gear/donator/item/plush_ian + display_name = "ian plushie" + path = /obj/item/toy/plush/ian + +/datum/gear/donator/item/plush_lisa + display_name = "lisa plushie" + path = /obj/item/toy/plush/lisa + +/datum/gear/donator/item/plush_renault + display_name = "renault plushie" + path = /obj/item/toy/plush/renault + +/datum/gear/donator/item/plush_opa + display_name = "metal opa plushie" + path = /obj/item/toy/plush/opa + diff --git a/code/modules/client/loadout/loadout_footwear.dm b/code/modules/client/loadout/loadout_footwear.dm index 23e6678375cfd..24df6ff8377f1 100644 --- a/code/modules/client/loadout/loadout_footwear.dm +++ b/code/modules/client/loadout/loadout_footwear.dm @@ -1,6 +1,6 @@ /datum/gear/footwear subtype_path = /datum/gear/footwear - slot = SLOT_SHOES + slot = ITEM_SLOT_FEET sort_category = "Footwear" cost = 1000 @@ -19,6 +19,11 @@ path = /obj/item/clothing/shoes/winterboots cost = 4000 +/datum/gear/footwear/swagshoes + display_name = "swag shoes" + path = /obj/item/clothing/shoes/swagshoes + cost = 31000 + //Standard shoes /datum/gear/footwear/color diff --git a/code/modules/client/loadout/loadout_hat.dm b/code/modules/client/loadout/loadout_hat.dm index 280aa1b62f06f..9eab99af345a6 100644 --- a/code/modules/client/loadout/loadout_hat.dm +++ b/code/modules/client/loadout/loadout_hat.dm @@ -1,6 +1,6 @@ /datum/gear/hat subtype_path = /datum/gear/hat - slot = SLOT_HEAD + slot = ITEM_SLOT_HEAD sort_category = "Headwear" species_blacklist = list("plasmaman") //Their helmet takes up the head slot cost = 2000 @@ -190,3 +190,10 @@ path = /obj/item/clothing/head/pirate cost = 5000 +//CHAPLAIN HATS + +/datum/gear/hat/blackbishop + display_name = "black bishop mitre" + path = /obj/item/clothing/head/bishopmitre/black + cost = 5000 + allowed_roles = list("Chaplain") diff --git a/code/modules/client/loadout/loadout_suit.dm b/code/modules/client/loadout/loadout_suit.dm index 32068752713dd..4c1e3b64a73ab 100644 --- a/code/modules/client/loadout/loadout_suit.dm +++ b/code/modules/client/loadout/loadout_suit.dm @@ -1,6 +1,6 @@ /datum/gear/suit subtype_path = /datum/gear/suit - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING sort_category = "External Wear" cost = 2500 @@ -89,6 +89,10 @@ display_name = "bomber jacket" path = /obj/item/clothing/suit/jacket +/datum/gear/suit/jacket/softshell + display_name = "softshell jacket" + path = /obj/item/clothing/suit/toggle/softshell + /datum/gear/suit/jacket/leather display_name = "leather jacket" path = /obj/item/clothing/suit/jacket/leather @@ -111,7 +115,7 @@ path = /obj/item/clothing/suit/jacket/letterman_red /datum/gear/suit/jacket/letterman_nanotrasen - display_name = "letterman jacket, NanoTrasen blue" + display_name = "letterman jacket, Nanotrasen blue" path = /obj/item/clothing/suit/jacket/letterman_nanotrasen cost = 5000 @@ -159,3 +163,13 @@ /datum/gear/suit/poncho/red display_name = "poncho, red" path = /obj/item/clothing/suit/poncho/red + +//ROBES +/datum/gear/suit/robe + subtype_path = /datum/gear/suit/robe + cost = 5000 + +/datum/gear/suit/robe/blackbishop + display_name = "black bishop's robes" + path = /obj/item/clothing/suit/chaplainsuit/bishoprobe/black + allowed_roles = list("Chaplain") diff --git a/code/modules/client/loadout/loadout_uniform.dm b/code/modules/client/loadout/loadout_uniform.dm index c70ef9044dfed..d566ace0f37b1 100644 --- a/code/modules/client/loadout/loadout_uniform.dm +++ b/code/modules/client/loadout/loadout_uniform.dm @@ -1,7 +1,7 @@ // Uniform slot /datum/gear/uniform subtype_path = /datum/gear/uniform - slot = SLOT_W_UNIFORM + slot = ITEM_SLOT_ICLOTHING sort_category = "Uniforms and Casual Dress" species_blacklist = list("plasmaman") //Envirosuit moment cost = 1000 @@ -234,6 +234,11 @@ path = /obj/item/clothing/under/costume/jabroni cost = 20000 +/datum/gear/uniform/misc/geisha + display_name = "geisha suit" + path = /obj/item/clothing/under/costume/geisha + cost = 20000 + /datum/gear/uniform/misc/soviet display_name = "soviet uniform" path = /obj/item/clothing/under/costume/soviet @@ -246,6 +251,11 @@ display_name = "sailor outfit" path = /obj/item/clothing/under/costume/sailor +/datum/gear/uniform/misc/swagoutfit + display_name = "swag outfit" + path = /obj/item/clothing/under/costume/swagoutfit + cost = 69000 + //RANK SUBTYPE /datum/gear/uniform/rank @@ -289,7 +299,7 @@ /datum/gear/uniform/rank/cargo/mining_classic display_name = "miner's overalls, asteroid purple" - description = "Purple jumpsuit, dirty overalls. Standard NanoTrasen Shaft Miner attire, from when Lavaland had yet to be discovered and exploited for plasma." + description = "Purple jumpsuit, dirty overalls. Standard Nanotrasen Shaft Miner attire, from when Lavaland had yet to be discovered and exploited for plasma." path = /obj/item/clothing/under/rank/cargo/miner allowed_roles = list ("Shaft Miner") @@ -301,7 +311,7 @@ /datum/gear/uniform/rank/medical/nurse_dress display_name = "medical, nurse's dress" - path = /obj/item/clothing/under/rank/medical/doctor + path = /obj/item/clothing/under/rank/medical/doctor/nurse /datum/gear/uniform/rank/medical/emt display_name = "medical scrubs, EMT" @@ -345,10 +355,10 @@ /datum/gear/uniform/rank/security/blueshift display_name = "security jumpsuit, blue shirt and tie" - path = /obj/item/clothing/under/rank/security/blueshirt + path = /obj/item/clothing/under/rank/security/officer/blueshirt cost = 7500 /datum/gear/uniform/rank/security/blart - display_name = "security jumpsuit, NanoTrasen mall cop uniform" + display_name = "security jumpsuit, Nanotrasen mall cop uniform" path = /obj/item/clothing/under/rank/security/officer/mallcop cost = 7500 diff --git a/code/modules/client/message.dm b/code/modules/client/message.dm index 2b4f8453d7457..e282e3a6cbf62 100644 --- a/code/modules/client/message.dm +++ b/code/modules/client/message.dm @@ -4,6 +4,7 @@ GLOBAL_LIST_EMPTY(clientmessages) ckey = ckey(ckey) if (!ckey || !message) return - if (!(ckey in GLOB.clientmessages)) - GLOB.clientmessages[ckey] = list() - GLOB.clientmessages[ckey] += message \ No newline at end of file + var/list/L = GLOB.clientmessages[ckey] + if(!L) + GLOB.clientmessages[ckey] = L = list() + L += message diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 88a096d9841e4..f436ed2aae6cf 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -26,11 +26,20 @@ GLOBAL_LIST_EMPTY(preferences_datums) //autocorrected this round, not that you'd need to check that. var/UI_style = null - var/overhead_chat = TRUE var/outline_enabled = TRUE var/outline_color = COLOR_BLUE_GRAY var/buttons_locked = FALSE var/hotkeys = FALSE + + ///Runechat preference. If true, certain messages will be displayed on the map, not ust on the chat area. Boolean. + var/chat_on_map = TRUE + ///Whether non-mob messages will be displayed, such as machine vendor announcements. Requires chat_on_map to have effect. Boolean. + var/see_chat_non_mob = TRUE + ///Whether emotes will be displayed on runechat. Requires chat_on_map to have effect. Boolean. + var/see_rc_emotes = TRUE + ///Whether we want balloon alerts displayed alone, with chat or not displayed at all + var/see_balloon_alerts = BALLOON_ALERT_ALWAYS + var/tgui_fancy = TRUE var/tgui_lock = TRUE var/windowflashing = TRUE @@ -67,6 +76,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/undershirt = "Nude" //undershirt type var/socks = "Nude" //socks type var/backbag = DBACKPACK //backpack type + var/jumpsuit_style = PREF_SUIT //suit/skirt var/hair_style = "Bald" //Hair type var/hair_color = "000" //Hair color var/facial_hair_style = "Shaved" //Face hair type @@ -136,7 +146,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) max_save_slots = 8 var/loaded_preferences_successfully = load_preferences() if(loaded_preferences_successfully) - if("extra character slot" in purchased_gear) + if("6030fe461e610e2be3a2c3e75c06067e" in purchased_gear) //MD5 hash of, "extra character slot" max_save_slots += 1 if(load_character()) return @@ -242,6 +252,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Undershirt:
[undershirt]
" dat += "Socks:
[socks]
" dat += "Backpack:
[backbag]
" + dat += "Jumpsuit:
[jumpsuit_style]
" dat += "Uplink Spawn Location:
[uplink_spawn_loc]
" var/use_skintones = pref_species.use_skintones @@ -520,11 +531,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" dat += "" - dat += "" + if(LC.category != "Donator") + dat += "" dat += "" dat += "" dat += "" - for(var/gear_name in LC.gear) - var/datum/gear/G = LC.gear[gear_name] - var/ticked = (G.display_name in equipped_gear) + for(var/gear_id in LC.gear) + var/datum/gear/G = LC.gear[gear_id] + var/ticked = (G.id in equipped_gear) dat += "" else - dat += "Equip" + dat += "Equip" else - dat += "Purchase" - dat += "" + dat += " + + {label ? label + ':' : null} + + + {content} + {children} + + {buttons && ( + + )} + + ); +}; + +LabeledListItem.defaultHooks = pureComponentHooks; + +type LabeledListDividerProps = { + size?: number; +}; + +const LabeledListDivider = (props: LabeledListDividerProps) => { + const padding = props.size + ? unit(Math.max(0, props.size - 1)) + : 0; + return ( + + + + ); +}; + +LabeledListDivider.defaultHooks = pureComponentHooks; + +LabeledList.Item = LabeledListItem; +LabeledList.Divider = LabeledListDivider; diff --git a/tgui/packages/tgui/components/OrbitalMapComponent.js b/tgui/packages/tgui/components/OrbitalMapComponent.js new file mode 100644 index 0000000000000..bdf1d2bec8ba5 --- /dev/null +++ b/tgui/packages/tgui/components/OrbitalMapComponent.js @@ -0,0 +1,264 @@ + +import { clamp } from 'common/math'; +import { pureComponentHooks } from 'common/react'; +import { Component, createRef } from 'inferno'; +import { AnimatedNumber } from './AnimatedNumber'; + +const FPS = 20; + +/** + * Reduces screen offset to a single number based on the matrix provided. + */ +const getScalarScreenOffset = (e, matrix) => { + return e.screenX * matrix[0] + e.screenY * matrix[1]; +}; + +export class OrbitalMapComponent extends Component { + constructor(props) { + super(props); + this.state = { + valueX: 0, + valueY: 0, + dragging: false, + internalValueX: null, + internalValueY: null, + originX: null, + originY: null, + suppressingFlicker: false, + tickIndex: -1, // Index of the last tick + xOffset: 0, // Map X offset + yOffset: 0, // Map Y Offset + tickTimer: new Date(), + }; + + // Suppresses flickering while the value propagates through the backend + this.flickerTimer = null; + this.suppressFlicker = () => { + const { suppressFlicker } = this.props; + if (suppressFlicker > 0) { + this.setState({ + suppressingFlicker: true, + }); + clearTimeout(this.flickerTimer); + this.flickerTimer = setTimeout(() => this.setState({ + suppressingFlicker: false, + }), suppressFlicker); + } + }; + + this.handleDragStart = e => { + const { + valueX, + valueY, + dragMatrixX, + dragMatrixY, + } = this.props; + document.body.style['pointer-events'] = 'none'; + this.ref = e.target; + this.setState({ + dragging: false, + originX: getScalarScreenOffset(e, dragMatrixX), + originY: getScalarScreenOffset(e, dragMatrixY), + valueX: valueX, + valueY: valueY, + internalValueX: valueX, + internalValueY: valueY, + }); + this.timer = setTimeout(() => { + this.setState({ + dragging: true, + }); + }, 250); + this.dragInterval = setInterval(() => { + const { dragging, valueX, valueY } = this.state; + const { onDrag } = this.props; + if (dragging && onDrag) + { + onDrag(e, valueX, valueY); + } + }, (1000 / FPS)); + clearInterval(this.tickUpdate); + document.addEventListener('mousemove', this.handleDragMove); + document.addEventListener('mouseup', this.handleDragEnd); + }; + + this.handleDragMove = e => { + const { + minValue, + maxValue, + step, + stepPixelSize, + dragMatrixX, + dragMatrixY, + } = this.props; + const scalarScreenOffsetX = getScalarScreenOffset(e, dragMatrixX); + const scalarScreenOffsetY = getScalarScreenOffset(e, dragMatrixY); + this.setState(prevState => { + const state = { ...prevState }; + const offsetX = scalarScreenOffsetX - state.originX; + const offsetY = scalarScreenOffsetY - state.originY; + if (prevState.dragging) { + const stepOffset = Number.isFinite(minValue) + ? minValue % step + : 0; + // Translate mouse movement to value + // Give it some headroom (by increasing clamp range by 1 step) + // X TRANSLATION + state.internalValueX = clamp( + state.internalValueX + + offsetX * step / stepPixelSize, + minValue - step, + maxValue + step); + // Clamp the final value + state.valueX = clamp( + state.internalValueX + - state.internalValueX % step + + stepOffset, + minValue, + maxValue); + // Y TRANSLATION + state.internalValueY = clamp( + state.internalValueY + + offsetY * step / stepPixelSize, + minValue - step, + maxValue + step); + // Clamp the final value + state.valueY = clamp( + state.internalValueY + - state.internalValueY % step + + stepOffset, + minValue, + maxValue); + state.xOffset = state.valueX; + state.yOffset = state.valueY; + state.originX = scalarScreenOffsetX; + state.originY = scalarScreenOffsetY; + } + else if (Math.abs(offsetX) > 4 || Math.abs(offsetY) > 4) { + state.dragging = true; + } + return state; + }); + }; + + this.handleDragEnd = e => { + const { + onChange, + onDrag, + onClick, + } = this.props; + const { + dragging, + valueX, + valueY, + xOffset, + yOffset, + } = this.state; + document.body.style['pointer-events'] = 'auto'; + clearTimeout(this.timer); + clearInterval(this.dragInterval); + this.tickUpdate = setInterval(() => this.dotick(), 1000 / FPS); + this.setState({ + dragging: false, + originX: null, + originY: null, + }); + document.removeEventListener('mousemove', this.handleDragMove); + document.removeEventListener('mouseup', this.handleDragEnd); + if (dragging) { + this.suppressFlicker(); + if (onChange) { + onChange(e, valueX, valueY); + } + this.setState({ + xOffset: valueX, + yOffset: valueY, + }); + if (onDrag) { + onDrag(e, valueX, valueY); + } + } + else { + onClick(e, xOffset, yOffset); + } + }; + } + + dotick() { + const { props, state } = this; + + const { + tickIndex, + tickTimer, + } = state; + + const { + currentUpdateIndex, + } = props; + + let newTimer = tickTimer; + + if (currentUpdateIndex !== tickIndex) + { + newTimer = new Date(); + } + + this.setState({ + tickTimer: newTimer, + tickIndex: currentUpdateIndex, + }); + } + + componentDidMount() { + this.tickUpdate = setInterval(() => this.dotick(), 1000 / FPS); + } + + componentWillUnmount() { + clearInterval(this.tickUpdate); + } + + render() { + const { + dragging, + tickIndex, + xOffset, + yOffset, + tickTimer, + } = this.state; + const { + children, + currentUpdateIndex, + isTracking, + dynamicXOffset, + dynamicYOffset, + } = this.props; + + if (currentUpdateIndex !== tickIndex) + { + this.dotick(); + } + + let elapsed = (new Date() - tickTimer) / 1000; + + // Return a part of the state for higher-level components to use. + return children({ + dragging: dragging, + xOffset: (isTracking ? dynamicXOffset : xOffset), + yOffset: (isTracking ? dynamicYOffset : yOffset), + elapsed: elapsed, + handleDragStart: this.handleDragStart, + }); + + } +} + +OrbitalMapComponent.defaultHooks = pureComponentHooks; +OrbitalMapComponent.defaultProps = { + minValue: -Infinity, + maxValue: +Infinity, + step: 1, + stepPixelSize: 1, + suppressFlicker: 50, + dragMatrixX: [-1, 0], + dragMatrixY: [0, -1], +}; diff --git a/tgui/packages/tgui/components/Popper.tsx b/tgui/packages/tgui/components/Popper.tsx new file mode 100644 index 0000000000000..5922e9a569ed8 --- /dev/null +++ b/tgui/packages/tgui/components/Popper.tsx @@ -0,0 +1,72 @@ +import { createPopper, OptionsGeneric } from "@popperjs/core"; +import { Component, findDOMfromVNode, InfernoNode, render } from "inferno"; + +type PopperProps = { + popperContent: InfernoNode; + options?: Partial>; + additionalStyles?: CSSProperties, +}; + +export class Popper extends Component { + static id: number = 0; + + renderedContent: HTMLDivElement; + popperInstance: ReturnType; + + constructor() { + super(); + + Popper.id += 1; + } + + componentDidMount() { + const { + additionalStyles, + options, + } = this.props; + + this.renderedContent = document.createElement("div"); + if (additionalStyles) { + for (const [attribute, value] of Object.entries(additionalStyles)) { + this.renderedContent.style[attribute] = value; + } + } + + this.renderPopperContent(() => { + document.body.appendChild(this.renderedContent); + + this.popperInstance = createPopper( + // HACK: We don't want to create a wrapper, as it could break the layout + // of consumers, so we do the inferno equivalent of `findDOMNode(this)`. + // This is usually bad as refs are usually better, but refs did + // not work in this case, as they weren't propagating correctly. + // A previous attempt was made as a render prop that passed an ID, + // but this made consuming use too unwieldly. + // This code is copied from `findDOMNode` in inferno-extras. + // Because this component is written in TypeScript, we will know + // immediately if this internal variable is removed. + findDOMfromVNode(this.$LI, true), + this.renderedContent, + options, + ); + }); + } + + componentDidUpdate() { + this.renderPopperContent(() => this.popperInstance?.update()); + } + + componentWillUnmount() { + this.popperInstance?.destroy(); + this.renderedContent.remove(); + this.renderedContent = null; + } + + renderPopperContent(callback: () => void) { + render(this.props.popperContent, this.renderedContent, callback); + } + + render() { + return this.props.children; + } +} diff --git a/tgui/packages/tgui/components/ScrollableBox.js b/tgui/packages/tgui/components/ScrollableBox.js new file mode 100644 index 0000000000000..580e22b9d32dd --- /dev/null +++ b/tgui/packages/tgui/components/ScrollableBox.js @@ -0,0 +1,20 @@ +import { Box } from './Box'; +import { addScrollableNode, removeScrollableNode } from '../events'; + +export const ScrollableBox = props => { + const { + children, + ...rest + } = props; + return ( + + {children} + + ); +}; + +ScrollableBox.defaultHooks = { + onComponentDidMount: node => addScrollableNode(node), + onComponentWillUnmount: node => removeScrollableNode(node), +}; diff --git a/tgui/packages/tgui/components/Section.js b/tgui/packages/tgui/components/Section.js deleted file mode 100644 index a1c78a0f67ca9..0000000000000 --- a/tgui/packages/tgui/components/Section.js +++ /dev/null @@ -1,78 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { canRender, classes } from 'common/react'; -import { Component, createRef } from 'inferno'; -import { addScrollableNode, removeScrollableNode } from '../events'; -import { computeBoxClassName, computeBoxProps } from './Box'; - -export class Section extends Component { - constructor(props) { - super(props); - this.ref = createRef(); - this.scrollable = props.scrollable; - } - - componentDidMount() { - if (this.scrollable) { - addScrollableNode(this.ref.current); - } - } - - componentWillUnmount() { - if (this.scrollable) { - removeScrollableNode(this.ref.current); - } - } - - render() { - const { - className, - title, - level = 1, - buttons, - fill, - fitted, - scrollable, - children, - ...rest - } = this.props; - const hasTitle = canRender(title) || canRender(buttons); - const hasContent = canRender(children); - return ( -
- {hasTitle && ( -
- - {title} - -
- {buttons} -
-
- )} - {fitted && children - || hasContent && ( -
- {children} -
- )} -
- ); - } -} diff --git a/tgui/packages/tgui/components/Section.tsx b/tgui/packages/tgui/components/Section.tsx new file mode 100644 index 0000000000000..dc226fad611d6 --- /dev/null +++ b/tgui/packages/tgui/components/Section.tsx @@ -0,0 +1,89 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { canRender, classes } from 'common/react'; +import { Component, createRef, InfernoNode, RefObject } from 'inferno'; +import { addScrollableNode, removeScrollableNode } from '../events'; +import { BoxProps, computeBoxClassName, computeBoxProps } from './Box'; + +interface SectionProps extends BoxProps { + className?: string; + title?: string; + buttons?: InfernoNode; + fill?: boolean; + fitted?: boolean; + scrollable?: boolean; + /** @deprecated This property no longer works, please remove it. */ + level?: boolean; + /** @deprecated Please use `scrollable` property */ + overflowY?: any; +} + +export class Section extends Component { + scrollableRef: RefObject; + scrollable: boolean; + + constructor(props) { + super(props); + this.scrollableRef = createRef(); + this.scrollable = props.scrollable; + } + + componentDidMount() { + if (this.scrollable) { + addScrollableNode(this.scrollableRef.current); + } + } + + componentWillUnmount() { + if (this.scrollable) { + removeScrollableNode(this.scrollableRef.current); + } + } + + render() { + const { + className, + title, + buttons, + fill, + fitted, + scrollable, + children, + ...rest + } = this.props; + const hasTitle = canRender(title) || canRender(buttons); + return ( +
+ {hasTitle && ( +
+ + {title} + +
+ {buttons} +
+
+ )} +
+
+ {children} +
+
+
+ ); + } +} diff --git a/tgui/packages/tgui/components/Stack.tsx b/tgui/packages/tgui/components/Stack.tsx new file mode 100644 index 0000000000000..1801c3a145e6b --- /dev/null +++ b/tgui/packages/tgui/components/Stack.tsx @@ -0,0 +1,64 @@ +/** + * @file + * @copyright 2021 Aleksej Komarov + * @license MIT + */ + +import { classes } from 'common/react'; +import { Flex, FlexItemProps, FlexProps } from './Flex'; + +interface StackProps extends FlexProps { + vertical?: boolean; + fill?: boolean; +} + +export const Stack = (props: StackProps) => { + const { className, vertical, fill, ...rest } = props; + return ( + + ); +}; + +const StackItem = (props: FlexProps) => { + const { className, ...rest } = props; + return ( + + ); +}; + +Stack.Item = StackItem; + +interface StackDividerProps extends FlexItemProps { + hidden?: boolean; +} + +const StackDivider = (props: StackDividerProps) => { + const { className, hidden, ...rest } = props; + return ( +
" dat += "

General Settings

" dat += "UI Style: [UI_style]
" - dat += "Overhead Chat: [overhead_chat ? "Enabled" : "Disabled"]
" dat += "Outline: [outline_enabled ? "Enabled" : "Disabled"]
" dat += "Outline Color:     Change
" 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 += "See Runechat for non-mobs: [see_chat_non_mob ? "Enabled" : "Disabled"]
" + dat += "See Runechat emotes: [see_rc_emotes ? "Enabled" : "Disabled"]
" + dat += "See Balloon alerts: [see_balloon_alerts]" dat += "
" dat += "Action Buttons: [(buttons_locked) ? "Locked In Place" : "Unlocked"]
" dat += "Hotkey Mode: [(hotkeys) ? "Hotkeys" : "Default"]
" @@ -669,6 +683,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/firstcat = 1 for(var/category in GLOB.loadout_categories) + if(category == "Donator" && (!LAZYLEN(GLOB.patrons) || !CONFIG_GET(flag/donator_items))) + continue if(firstcat) firstcat = 0 else @@ -686,23 +702,26 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "

NameCostCostRestricted JobsDescription

[G.display_name]\n" - if(G.display_name in purchased_gear) + var/donator = G.sort_category == "Donator" // purchase box and cost coloumns doesn't appear on donator items + if(G.id in purchased_gear) if(G.sort_category == "OOC") dat += "Purchased.[G.cost]" + dat += "[donator ? "Donator" : "Purchase"][donator ? "" : "[G.cost]"]" + if(G.allowed_roles) dat += "" for(var/role in G.allowed_roles) @@ -1189,7 +1208,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) return all_quirks -= quirk else - if(GetPositiveQuirkCount() >= MAX_QUIRKS) + var/is_positive_quirk = SSquirks.quirk_points[quirk] > 0 + if(is_positive_quirk && GetPositiveQuirkCount() >= MAX_QUIRKS) to_chat(user, "You can't have more than [MAX_QUIRKS] positive quirks!") return if(balance - value < 0) @@ -1207,8 +1227,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(href_list["preference"] == "gear") if(href_list["purchase_gear"]) var/datum/gear/TG = GLOB.gear_datums[href_list["purchase_gear"]] - if(TG.cost < user.client.get_metabalance()) - purchased_gear += TG.display_name + if(TG.sort_category == "Donator") + if(CONFIG_GET(flag/donator_items) && alert(parent, "This item is only accessible to our patrons. Would you like to subscribe?", "Patron Locked", "Yes", "No") == "Yes") + parent.donate() + else if(TG.cost < user.client.get_metabalance()) + purchased_gear += TG.id TG.purchase(user.client) user.client.inc_metabalance((TG.cost * -1), TRUE, "Purchased [TG.display_name].") save_preferences() @@ -1216,21 +1239,21 @@ GLOBAL_LIST_EMPTY(preferences_datums) to_chat(user, "You don't have enough [CONFIG_GET(string/metacurrency_name)]s to purchase \the [TG.display_name]!") if(href_list["toggle_gear"]) var/datum/gear/TG = GLOB.gear_datums[href_list["toggle_gear"]] - if(TG.display_name in equipped_gear) - equipped_gear -= TG.display_name + if(TG.id in equipped_gear) + equipped_gear -= TG.id else var/list/type_blacklist = list() var/list/slot_blacklist = list() - for(var/gear_name in equipped_gear) - var/datum/gear/G = GLOB.gear_datums[gear_name] + for(var/gear_id in equipped_gear) + var/datum/gear/G = GLOB.gear_datums[gear_id] if(istype(G)) if(!(G.subtype_path in type_blacklist)) type_blacklist += G.subtype_path if(!(G.slot in slot_blacklist)) slot_blacklist += G.slot - if((TG.display_name in purchased_gear)) + if((TG.id in purchased_gear)) if(!(TG.subtype_path in type_blacklist) || !(TG.slot in slot_blacklist)) - equipped_gear += TG.display_name + equipped_gear += TG.id else to_chat(user, "Can't equip [TG.display_name]. It conflicts with an already-equipped item.") else @@ -1283,6 +1306,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(href_list["preference"] in GLOB.preferences_custom_names) ask_for_custom_name(user,href_list["preference"]) + if(href_list["preference"] in pref_species.forced_features) + alert("You cannot change that bodypart for your selected species!") + features[href_list["preference"]] = pref_species.forced_features[href_list["preference"]] + return switch(href_list["preference"]) if("ghostform") @@ -1428,6 +1455,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/temp_hsv = RGBtoHSV(features["mcolor"]) if(features["mcolor"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#7F7F7F")[3])) features["mcolor"] = pref_species.default_color + //Set our forced bodyparts + for(var/forced_part in pref_species.forced_features) + //Get the forced type + var/forced_type = pref_species.forced_features[forced_part] + //Apply the forced bodypart. + features[forced_part] = forced_type else if(alert(parent, "This species is only accessible to our patrons. Would you like to subscribe?", "Patron Locked", "Yes", "No") == "Yes") parent.donate() @@ -1570,13 +1603,19 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_backbag) backbag = new_backbag + if("suit") + if(jumpsuit_style == PREF_SUIT) + jumpsuit_style = PREF_SKIRT + else + jumpsuit_style = PREF_SUIT + if("uplink_loc") var/new_loc = input(user, "Choose your character's traitor uplink spawn location:", "Character Preference") as null|anything in GLOB.uplink_spawn_loc_list if(new_loc) uplink_spawn_loc = new_loc if("ai_core_icon") - var/ai_core_icon = input(user, "Choose your preferred AI core display screen:", "AI Core Display Screen Selection") as null|anything in GLOB.ai_core_display_screens + var/ai_core_icon = input(user, "Choose your preferred AI core display screen:", "AI Core Display Screen Selection") as null|anything in GLOB.ai_core_display_screens - "Portrait" if(ai_core_icon) preferred_ai_core_display = ai_core_icon @@ -1619,9 +1658,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(pickedPDAStyle) pda_style = pickedPDAStyle if("pda_color") - var/pickedPDAColor = input(user, "Choose your PDA Interface color.", "Character Preference",pda_color) as color|null + var/pickedPDAColor = input(user, "Choose your PDA Interface color.", "Character Preference", pda_color) as color|null if(pickedPDAColor) pda_color = pickedPDAColor + if ("see_balloon_alerts") + var/pickedstyle = input(user, "Choose how you want balloon alerts displayed", "Balloon alert preference", BALLOON_ALERT_ALWAYS) as null|anything in list(BALLOON_ALERT_ALWAYS, BALLOON_ALERT_WITH_CHAT, BALLOON_ALERT_NEVER) + if (!isnull(pickedstyle)) + see_balloon_alerts = pickedstyle else switch(href_list["preference"]) @@ -1649,8 +1692,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) buttons_locked = !buttons_locked if("tgui_fancy") tgui_fancy = !tgui_fancy - if("overheadchat") - overhead_chat = !overhead_chat if("outline_enabled") outline_enabled = !outline_enabled if("outline_color") @@ -1754,7 +1795,7 @@ 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 + var/atom/movable/screen/plane_master/game_world/PM = locate(/atom/movable/screen/plane_master/game_world) in parent.screen PM.backdrop(parent.mob) if("auto_fit_viewport") @@ -1774,8 +1815,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) pixel_size = PIXEL_SCALING_3X if(PIXEL_SCALING_3X) pixel_size = PIXEL_SCALING_AUTO - user.client.view_size.setDefault(getScreenSize(user)) //Fix our viewport size so it doesn't reset on change - user.client.view_size.apply() //Let's winset() it so it actually works + user.client.view_size.resetToDefault(getScreenSize(user)) //Fix our viewport size so it doesn't reset on change if("scaling_method") switch(scaling_method) @@ -1856,7 +1896,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) new_key = "Numpad[new_key]" var/full_key = "[AltMod][CtrlMod][ShiftMod][new_key]" - if(old_key) + if(old_key && (old_key in key_bindings)) key_bindings[old_key] -= kb_name key_bindings[full_key] += list(kb_name) key_bindings[full_key] = sortList(key_bindings[full_key]) @@ -1875,6 +1915,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) ShowKeybindings(user) return + if("chat_on_map") + chat_on_map = !chat_on_map + if("see_chat_non_mob") + see_chat_non_mob = !see_chat_non_mob + if("see_rc_emotes") + see_rc_emotes = !see_rc_emotes + ShowChoices(user) return 1 @@ -1918,6 +1965,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.socks = socks character.backbag = backbag + character.jumpsuit_style = jumpsuit_style var/datum/species/chosen_species chosen_species = pref_species.type @@ -1976,3 +2024,23 @@ GLOBAL_LIST_EMPTY(preferences_datums) return else custom_names[name_id] = sanitized_name + +/// Handles adding and removing donator items from clients +/datum/preferences/proc/handle_donator_items() + var/datum/loadout_category/DLC = GLOB.loadout_categories["Donator"] // stands for donator loadout category but the other def for DLC works too xD + if(!LAZYLEN(GLOB.patrons) || !CONFIG_GET(flag/donator_items)) // donator items are only accesibile by servers with a patreon + return + if(IS_PATRON(parent.ckey) || (parent in GLOB.admins)) + for(var/gear_id in DLC.gear) + var/datum/gear/AG = DLC.gear[gear_id] + if(AG.id in purchased_gear) + continue + purchased_gear += AG.id + AG.purchase(parent) + save_preferences() + else if(purchased_gear.len || equipped_gear.len) + for(var/gear_id in DLC.gear) + var/datum/gear/RG = DLC.gear[gear_id] + equipped_gear -= RG.id + purchased_gear -= RG.id + save_preferences() diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 2dd69163729c4..06f4c54fe90eb 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 31 +#define SAVEFILE_VERSION_MAX 35 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -25,7 +25,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car */ /datum/preferences/proc/savefile_needs_update(savefile/S) var/savefile_version - S["version"] >> savefile_version + READ_FILE(S["version"], savefile_version) if(savefile_version < SAVEFILE_VERSION_MIN) S.dir.Cut() @@ -42,14 +42,33 @@ 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) - if(current_version < 29) - overhead_chat = TRUE if(current_version < 30) outline_enabled = TRUE outline_color = COLOR_BLUE_GRAY if(current_version < 31) auto_fit_viewport = TRUE - + if(current_version < 32) + //Okay this is gonna s u c k + var/list/legacy_purchases = purchased_gear.Copy() + purchased_gear.Cut() + equipped_gear.Cut() //Not gonna bother. + for(var/l_gear in legacy_purchases) + var/n_gear + for(var/rg_nam in GLOB.gear_datums) //this is ugly. + var/datum/gear/r_gear = GLOB.gear_datums[rg_nam] + if(r_gear.display_name == l_gear) + n_gear = r_gear.id + break + if(n_gear) + purchased_gear += n_gear + if(current_version < 33) + chat_on_map = TRUE +// max_chat_length = CHAT_MESSAGE_MAX_LENGTH > Depreciated as of 31/07/2021 + see_chat_non_mob = TRUE + see_rc_emotes = TRUE + S.dir.Remove("overhead_chat") + if(current_version < 35) + see_balloon_alerts = BALLOON_ALERT_ALWAYS return /datum/preferences/proc/update_character(current_version, savefile/S) @@ -76,15 +95,15 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car - S["job_civilian_high"] >> job_civilian_high - S["job_civilian_med"] >> job_civilian_med - S["job_civilian_low"] >> job_civilian_low - S["job_medsci_high"] >> job_medsci_high - S["job_medsci_med"] >> job_medsci_med - S["job_medsci_low"] >> job_medsci_low - S["job_engsec_high"] >> job_engsec_high - S["job_engsec_med"] >> job_engsec_med - S["job_engsec_low"] >> job_engsec_low + READ_FILE(S["job_civilian_high"], job_civilian_high) + READ_FILE(S["job_civilian_med"], job_civilian_med) + READ_FILE(S["job_civilian_low"], job_civilian_low) + READ_FILE(S["job_medsci_high"], job_medsci_high) + READ_FILE(S["job_medsci_med"], job_medsci_med) + READ_FILE(S["job_medsci_low"], job_medsci_low) + READ_FILE(S["job_engsec_high"], job_engsec_high) + READ_FILE(S["job_engsec_med"], job_engsec_med) + READ_FILE(S["job_engsec_low"], job_engsec_low) //Can't use SSjob here since this happens right away on login for(var/job in subtypesof(/datum/job)) @@ -130,87 +149,92 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car /datum/preferences/proc/load_preferences() if(!path) - return 0 + return FALSE if(!fexists(path)) - return 0 + return FALSE var/savefile/S = new /savefile(path) if(!S) - return 0 + return FALSE S.cd = "/" var/needs_update = savefile_needs_update(S) if(needs_update == -2) //fatal, can't load any data - return 0 + return FALSE //general preferences - S["asaycolor"] >> asaycolor - S["ooccolor"] >> ooccolor - S["lastchangelog"] >> lastchangelog - S["UI_style"] >> UI_style - S["overhead_chat"] >> overhead_chat - S["outline_color"] >> outline_color - S["outline_enabled"] >> outline_enabled - S["hotkeys"] >> hotkeys - S["tgui_fancy"] >> tgui_fancy - S["tgui_lock"] >> tgui_lock - S["buttons_locked"] >> buttons_locked - S["windowflash"] >> windowflashing - S["be_special"] >> be_special - - S["crew_objectives"] >> crew_objectives - - - S["default_slot"] >> default_slot - S["chat_toggles"] >> chat_toggles - S["toggles"] >> toggles - S["ghost_form"] >> ghost_form - S["ghost_orbit"] >> ghost_orbit - S["ghost_accs"] >> ghost_accs - S["ghost_others"] >> ghost_others - S["preferred_map"] >> preferred_map - S["ignoring"] >> ignoring - S["ghost_hud"] >> ghost_hud - S["inquisitive_ghost"] >> inquisitive_ghost - S["uses_glasses_colour"]>> uses_glasses_colour - S["clientfps"] >> clientfps - S["parallax"] >> parallax - S["ambientocclusion"] >> ambientocclusion - S["auto_fit_viewport"] >> auto_fit_viewport - S["pixel_size"] >> pixel_size - S["scaling_method"] >> scaling_method - S["menuoptions"] >> menuoptions - S["enable_tips"] >> enable_tips - S["tip_delay"] >> tip_delay - S["pda_style"] >> pda_style - S["pda_color"] >> pda_color - S["show_credits"] >> show_credits - - S["key_bindings"] >> key_bindings - - S["purchased_gear"] >> purchased_gear - S["equipped_gear"] >> equipped_gear + READ_FILE(S["asaycolor"], asaycolor) + READ_FILE(S["ooccolor"], ooccolor) + READ_FILE(S["lastchangelog"], lastchangelog) + READ_FILE(S["UI_style"], UI_style) + READ_FILE(S["outline_color"], outline_color) + READ_FILE(S["outline_enabled"], outline_enabled) + READ_FILE(S["hotkeys"], hotkeys) + READ_FILE(S["chat_on_map"], chat_on_map) + READ_FILE(S["see_chat_non_mob"] , see_chat_non_mob) + READ_FILE(S["see_rc_emotes"] , see_rc_emotes) + READ_FILE(S["see_balloon_alerts"], see_balloon_alerts) + READ_FILE(S["tgui_fancy"], tgui_fancy) + READ_FILE(S["tgui_lock"], tgui_lock) + READ_FILE(S["buttons_locked"], buttons_locked) + READ_FILE(S["windowflash"], windowflashing) + READ_FILE(S["be_special"], be_special) + + READ_FILE(S["crew_objectives"], crew_objectives) + + + READ_FILE(S["default_slot"], default_slot) + READ_FILE(S["chat_toggles"], chat_toggles) + READ_FILE(S["toggles"], toggles) + READ_FILE(S["ghost_form"], ghost_form) + READ_FILE(S["ghost_orbit"], ghost_orbit) + READ_FILE(S["ghost_accs"], ghost_accs) + READ_FILE(S["ghost_others"], ghost_others) + READ_FILE(S["preferred_map"], preferred_map) + READ_FILE(S["ignoring"], ignoring) + READ_FILE(S["ghost_hud"], ghost_hud) + READ_FILE(S["inquisitive_ghost"], inquisitive_ghost) + READ_FILE(S["uses_glasses_colour"], uses_glasses_colour) + READ_FILE(S["clientfps"], clientfps) + READ_FILE(S["parallax"], parallax) + READ_FILE(S["ambientocclusion"], ambientocclusion) + READ_FILE(S["auto_fit_viewport"], auto_fit_viewport) + READ_FILE(S["pixel_size"], pixel_size) + READ_FILE(S["scaling_method"], scaling_method) + READ_FILE(S["menuoptions"], menuoptions) + READ_FILE(S["enable_tips"], enable_tips) + READ_FILE(S["tip_delay"], tip_delay) + READ_FILE(S["pda_style"], pda_style) + READ_FILE(S["pda_color"], pda_color) + READ_FILE(S["show_credits"], show_credits) + + READ_FILE(S["key_bindings"], key_bindings) + + READ_FILE(S["purchased_gear"], purchased_gear) + READ_FILE(S["equipped_gear"], equipped_gear) //try to fix any outdated data if necessary if(needs_update >= 0) update_preferences(needs_update, S) //needs_update = savefile_version if we need an update (positive integer) //Sanitize - asaycolor = sanitize_ooccolor(sanitize_hexcolor(asaycolor, 6, 1, initial(asaycolor))) - ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, 1, initial(ooccolor))) + asaycolor = sanitize_ooccolor(sanitize_hexcolor(asaycolor, 6, TRUE, initial(asaycolor))) + ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, TRUE, initial(ooccolor))) 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)) - 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)) - clientfps = sanitize_integer(clientfps, 0, 1000, 0) + hotkeys = sanitize_integer(hotkeys, FALSE, TRUE, initial(hotkeys)) + chat_on_map = sanitize_integer(chat_on_map, FALSE, TRUE, initial(chat_on_map)) + see_chat_non_mob = sanitize_integer(see_chat_non_mob, FALSE, TRUE, initial(see_chat_non_mob)) + tgui_fancy = sanitize_integer(tgui_fancy, FALSE, TRUE, initial(tgui_fancy)) + tgui_lock = sanitize_integer(tgui_lock, FALSE, TRUE, initial(tgui_lock)) + buttons_locked = sanitize_integer(buttons_locked, FALSE, TRUE, initial(buttons_locked)) + windowflashing = sanitize_integer(windowflashing, FALSE, TRUE, initial(windowflashing)) + default_slot = sanitize_integer(default_slot, TRUE, max_save_slots, initial(default_slot)) + toggles = sanitize_integer(toggles, FALSE, 65535, initial(toggles)) + clientfps = sanitize_integer(clientfps, FALSE, 1000, FALSE) 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)) + ambientocclusion = sanitize_integer(ambientocclusion, FALSE, TRUE, initial(ambientocclusion)) + auto_fit_viewport = sanitize_integer(auto_fit_viewport, FALSE, TRUE, initial(auto_fit_viewport)) pixel_size = sanitize_integer(pixel_size, PIXEL_SCALING_AUTO, PIXEL_SCALING_3X, initial(pixel_size)) scaling_method = sanitize_text(scaling_method, initial(scaling_method)) ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form)) @@ -219,10 +243,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car ghost_others = sanitize_inlist(ghost_others, GLOB.ghost_others_options, GHOST_OTHERS_DEFAULT_OPTION) menuoptions = SANITIZE_LIST(menuoptions) be_special = SANITIZE_LIST(be_special) - crew_objectives = sanitize_integer(crew_objectives, 0, 1, initial(crew_objectives)) + crew_objectives = sanitize_integer(crew_objectives, FALSE, TRUE, initial(crew_objectives)) pda_style = sanitize_inlist(pda_style, GLOB.pda_styles, initial(pda_style)) - pda_color = sanitize_hexcolor(pda_color, 6, 1, initial(pda_color)) - show_credits = sanitize_integer(show_credits, 0, 1, initial(show_credits)) + pda_color = sanitize_hexcolor(pda_color, 6, TRUE, initial(pda_color)) + show_credits = sanitize_integer(show_credits, FALSE, TRUE, initial(show_credits)) key_bindings = sanitize_islist(key_bindings, deepCopyList(GLOB.keybinding_list_by_key)) if (!key_bindings) @@ -233,14 +257,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(!equipped_gear) equipped_gear = list() - return 1 + return TRUE /datum/preferences/proc/save_preferences() if(!path) - return 0 + return FALSE var/savefile/S = new /savefile(path) if(!S) - return 0 + return FALSE S.cd = "/" WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //updates (or failing that the sanity checks) will ensure data is not invalid at load. Assume up-to-date @@ -250,10 +274,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["ooccolor"], ooccolor) WRITE_FILE(S["lastchangelog"], lastchangelog) WRITE_FILE(S["UI_style"], UI_style) - WRITE_FILE(S["overhead_chat"], overhead_chat) WRITE_FILE(S["outline_enabled"], outline_enabled) WRITE_FILE(S["outline_color"], outline_color) WRITE_FILE(S["hotkeys"], hotkeys) + WRITE_FILE(S["chat_on_map"], chat_on_map) + WRITE_FILE(S["see_chat_non_mob"], see_chat_non_mob) + WRITE_FILE(S["see_rc_emotes"], see_rc_emotes) + WRITE_FILE(S["see_balloon_alerts"], see_balloon_alerts) WRITE_FILE(S["tgui_fancy"], tgui_fancy) WRITE_FILE(S["tgui_lock"], tgui_lock) WRITE_FILE(S["buttons_locked"], buttons_locked) @@ -290,20 +317,20 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if (!key_bindings) key_bindings = deepCopyList(GLOB.keybinding_list_by_key) WRITE_FILE(S["key_bindings"], key_bindings) - return 1 + return TRUE /datum/preferences/proc/load_character(slot) if(!path) - return 0 + return FALSE if(!fexists(path)) - return 0 + return FALSE var/savefile/S = new /savefile(path) if(!S) - return 0 + return FALSE S.cd = "/" if(!slot) slot = default_slot - slot = sanitize_integer(slot, 1, max_save_slots, initial(default_slot)) + slot = sanitize_integer(slot, TRUE, max_save_slots, initial(default_slot)) if(slot != default_slot) default_slot = slot WRITE_FILE(S["default_slot"] , slot) @@ -315,7 +342,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Species var/species_id - S["species"] >> species_id + READ_FILE(S["species"], species_id) if(species_id) var/newtype = GLOB.species_list[species_id] if(newtype) @@ -328,59 +355,60 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_ethcolor"] , "9c3030") //Character - S["real_name"] >> real_name - S["name_is_always_random"] >> be_random_name - S["body_is_always_random"] >> be_random_body - S["gender"] >> gender - S["age"] >> age - S["hair_color"] >> hair_color - S["facial_hair_color"] >> facial_hair_color - S["eye_color"] >> eye_color - S["skin_tone"] >> skin_tone - S["hair_style_name"] >> hair_style - S["facial_style_name"] >> facial_hair_style - S["underwear"] >> underwear - S["underwear_color"] >> underwear_color - S["undershirt"] >> undershirt - S["socks"] >> socks - S["backbag"] >> backbag - S["uplink_loc"] >> uplink_spawn_loc - S["feature_mcolor"] >> features["mcolor"] - S["feature_ethcolor"] >> features["ethcolor"] - S["feature_lizard_tail"] >> features["tail_lizard"] - S["feature_lizard_snout"] >> features["snout"] - S["feature_lizard_horns"] >> features["horns"] - S["feature_lizard_frills"] >> features["frills"] - S["feature_lizard_spines"] >> features["spines"] - S["feature_lizard_body_markings"] >> features["body_markings"] - S["feature_lizard_legs"] >> features["legs"] - S["feature_moth_wings"] >> features["moth_wings"] - S["feature_ipc_screen"] >> features["ipc_screen"] - S["feature_ipc_antenna"] >> features["ipc_antenna"] - S["feature_ipc_chassis"] >> features["ipc_chassis"] - S["feature_insect_type"] >> features["insect_type"] - if(!CONFIG_GET(flag/join_with_mutant_humans) && !species_id != "felinid") // felinids arent mutant humans anymore i guess + READ_FILE(S["real_name"], real_name) + READ_FILE(S["name_is_always_random"], be_random_name) + READ_FILE(S["body_is_always_random"], be_random_body) + READ_FILE(S["gender"], gender) + READ_FILE(S["age"], age) + READ_FILE(S["hair_color"], hair_color) + READ_FILE(S["facial_hair_color"], facial_hair_color) + READ_FILE(S["eye_color"], eye_color) + READ_FILE(S["skin_tone"], skin_tone) + READ_FILE(S["hair_style_name"], hair_style) + READ_FILE(S["facial_style_name"], facial_hair_style) + READ_FILE(S["underwear"], underwear) + READ_FILE(S["underwear_color"], underwear_color) + READ_FILE(S["undershirt"], undershirt) + READ_FILE(S["socks"], socks) + READ_FILE(S["backbag"], backbag) + READ_FILE(S["jumpsuit_style"], jumpsuit_style) + READ_FILE(S["uplink_loc"], uplink_spawn_loc) + READ_FILE(S["feature_mcolor"], features["mcolor"]) + READ_FILE(S["feature_ethcolor"], features["ethcolor"]) + READ_FILE(S["feature_lizard_tail"], features["tail_lizard"]) + READ_FILE(S["feature_lizard_snout"], features["snout"]) + READ_FILE(S["feature_lizard_horns"], features["horns"]) + READ_FILE(S["feature_lizard_frills"], features["frills"]) + READ_FILE(S["feature_lizard_spines"], features["spines"]) + READ_FILE(S["feature_lizard_body_markings"], features["body_markings"]) + READ_FILE(S["feature_lizard_legs"], features["legs"]) + READ_FILE(S["feature_moth_wings"], features["moth_wings"]) + READ_FILE(S["feature_ipc_screen"], features["ipc_screen"]) + READ_FILE(S["feature_ipc_antenna"], features["ipc_antenna"]) + READ_FILE(S["feature_ipc_chassis"], features["ipc_chassis"]) + READ_FILE(S["feature_insect_type"], features["insect_type"]) + if(!CONFIG_GET(flag/join_with_mutant_humans) && !species_id != "felinid") // felinids arent mutant humans anymore i guess features["tail_human"] = "none" features["ears"] = "none" else - S["feature_human_tail"] >> features["tail_human"] - S["feature_human_ears"] >> features["ears"] + READ_FILE(S["feature_human_tail"], features["tail_human"]) + READ_FILE(S["feature_human_ears"], features["ears"]) //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) var/savefile_slot_name = custom_name_id + "_name" //TODO remove this - S[savefile_slot_name] >> custom_names[custom_name_id] + READ_FILE(S[savefile_slot_name], custom_names[custom_name_id]) - S["preferred_ai_core_display"] >> preferred_ai_core_display - S["prefered_security_department"] >> prefered_security_department + READ_FILE(S["preferred_ai_core_display"], preferred_ai_core_display) + READ_FILE(S["prefered_security_department"], prefered_security_department) //Jobs - S["joblessrole"] >> joblessrole + READ_FILE(S["joblessrole"], joblessrole) //Load prefs - S["job_preferences"] >> job_preferences + READ_FILE(S["job_preferences"], job_preferences) //Quirks - S["all_quirks"] >> all_quirks + READ_FILE(S["all_quirks"], all_quirks) //try to fix any outdated data if necessary if(needs_update >= 0) @@ -426,6 +454,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car eye_color = sanitize_hexcolor(eye_color, 3, 0) skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones) 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)) features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0) features["ethcolor"] = copytext_char(features["ethcolor"], 1, 7) @@ -444,6 +473,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["ipc_chassis"] = sanitize_inlist(features["ipc_chassis"], GLOB.ipc_chassis_list) features["insect_type"] = sanitize_inlist(features["insect_type"], GLOB.insect_type_list) + //Validate species forced mutant parts + for(var/forced_part in pref_species.forced_features) + //Get the forced type + var/forced_type = pref_species.forced_features[forced_part] + //Apply the forced bodypart. + features[forced_part] = forced_type + joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole)) //Validate job prefs for(var/j in job_preferences) @@ -452,14 +488,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car all_quirks = SANITIZE_LIST(all_quirks) - return 1 + return TRUE /datum/preferences/proc/save_character() if(!path) - return 0 + return FALSE var/savefile/S = new /savefile(path) if(!S) - return 0 + return FALSE S.cd = "/character[default_slot]" WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //load_character will sanitize any bad data, so assume up-to-date.) @@ -483,6 +519,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["undershirt"] , undershirt) WRITE_FILE(S["socks"] , socks) WRITE_FILE(S["backbag"] , backbag) + WRITE_FILE(S["jumpsuit_style"] , jumpsuit_style) WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc) WRITE_FILE(S["species"] , pref_species.id) WRITE_FILE(S["feature_mcolor"] , features["mcolor"]) @@ -518,7 +555,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Quirks WRITE_FILE(S["all_quirks"] , all_quirks) - return 1 + return TRUE #undef SAVEFILE_VERSION_MAX diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 4969becb09265..c875b07fb41de 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -1,266 +1,206 @@ -//this works as is to create a single checked item, but has no back end code for toggleing the check yet -#define TOGGLE_CHECKBOX(PARENT, CHILD) PARENT/CHILD/abstract = TRUE;PARENT/CHILD/checkbox = CHECKBOX_TOGGLE;PARENT/CHILD/verb/CHILD - -//Example usage TOGGLE_CHECKBOX(datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)() - -//override because we don't want to save preferences twice. -/datum/verbs/menu/Settings/Set_checked(client/C, verbpath) - if (checkbox == CHECKBOX_GROUP) - C.prefs.menuoptions[type] = verbpath - else if (checkbox == CHECKBOX_TOGGLE) - var/checked = Get_checked(C) - C.prefs.menuoptions[type] = !checked - winset(C, "[verbpath]", "is-checked = [!checked]") - -/datum/verbs/menu/Settings/verb/setup_character() +/client/verb/setup_character() set name = "Game Preferences" set category = "Preferences" set desc = "Open Game Preferences Window" - usr.client.prefs.current_tab = 1 - usr.client.prefs.ShowChoices(usr) + prefs.current_tab = 1 + prefs.ShowChoices(usr) -//toggles -/datum/verbs/menu/Settings/Ghost/chatterbox - name = "Chat Box Spam" - -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)() +/client/verb/toggle_ghost_ears() set name = "Show/Hide GhostEars" set category = "Preferences" set desc = "See All Speech" - usr.client.prefs.chat_toggles ^= CHAT_GHOSTEARS - to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].") - usr.client.prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Ears", "[usr.client.prefs.chat_toggles & CHAT_GHOSTEARS ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_ears/Get_checked(client/C) - return C.prefs.chat_toggles & CHAT_GHOSTEARS - -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_sight)() + prefs.chat_toggles ^= CHAT_GHOSTEARS + to_chat(usr, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].") + prefs.save_preferences() + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Ears", "[prefs.chat_toggles & CHAT_GHOSTEARS ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/toggle_ghost_sight() set name = "Show/Hide GhostSight" set category = "Preferences" set desc = "See All Emotes" - usr.client.prefs.chat_toggles ^= CHAT_GHOSTSIGHT - to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].") - usr.client.prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Sight", "[usr.client.prefs.chat_toggles & CHAT_GHOSTSIGHT ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_sight/Get_checked(client/C) - return C.prefs.chat_toggles & CHAT_GHOSTSIGHT - -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_whispers)() + prefs.chat_toggles ^= CHAT_GHOSTSIGHT + to_chat(usr, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].") + prefs.save_preferences() + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Sight", "[prefs.chat_toggles & CHAT_GHOSTSIGHT ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/toggle_ghost_whispers() set name = "Show/Hide GhostWhispers" set category = "Preferences" set desc = "See All Whispers" - usr.client.prefs.chat_toggles ^= CHAT_GHOSTWHISPER - to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTWHISPER) ? "see all whispers in the world" : "only see whispers from nearby mobs"].") - usr.client.prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Whispers", "[usr.client.prefs.chat_toggles & CHAT_GHOSTWHISPER ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_whispers/Get_checked(client/C) - return C.prefs.chat_toggles & CHAT_GHOSTWHISPER - -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_radio)() + prefs.chat_toggles ^= CHAT_GHOSTWHISPER + to_chat(usr, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTWHISPER) ? "see all whispers in the world" : "only see whispers from nearby mobs"].") + prefs.save_preferences() + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Whispers", "[prefs.chat_toggles & CHAT_GHOSTWHISPER ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/toggle_ghost_radio() set name = "Show/Hide GhostRadio" set category = "Preferences" set desc = "See All Radio Chatter" - usr.client.prefs.chat_toggles ^= CHAT_GHOSTRADIO - to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTRADIO) ? "see radio chatter" : "not see radio chatter"].") - usr.client.prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Radio", "[usr.client.prefs.chat_toggles & CHAT_GHOSTRADIO ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //social experiment, increase the generation whenever you copypaste this shamelessly GENERATION 1 -/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_radio/Get_checked(client/C) - return C.prefs.chat_toggles & CHAT_GHOSTRADIO - -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_pda)() + prefs.chat_toggles ^= CHAT_GHOSTRADIO + to_chat(usr, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTRADIO) ? "see radio chatter" : "not see radio chatter"].") + prefs.save_preferences() + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Radio", "[prefs.chat_toggles & CHAT_GHOSTRADIO ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //social experiment, increase the generation whenever you copypaste this shamelessly GENERATION 1 + +/client/verb/toggle_ghost_pda() set name = "Show/Hide GhostPDA" set category = "Preferences" set desc = "See All PDA Messages" - usr.client.prefs.chat_toggles ^= CHAT_GHOSTPDA - to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTPDA) ? "see all pda messages in the world" : "only see pda messages from nearby mobs"].") - usr.client.prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost PDA", "[usr.client.prefs.chat_toggles & CHAT_GHOSTPDA ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_pda/Get_checked(client/C) - return C.prefs.chat_toggles & CHAT_GHOSTPDA - -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_laws)() + prefs.chat_toggles ^= CHAT_GHOSTPDA + to_chat(usr, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTPDA) ? "see all pda messages in the world" : "only see pda messages from nearby mobs"].") + prefs.save_preferences() + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost PDA", "[prefs.chat_toggles & CHAT_GHOSTPDA ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/toggle_ghost_laws() set name = "Show/Hide GhostLaws" set category = "Preferences" set desc = "See All Law Changes" - usr.client.prefs.chat_toggles ^= CHAT_GHOSTLAWS - to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTLAWS) ? "be notified of all law changes" : "no longer be notified of law changes"].") - usr.client.prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Laws", "[usr.client.prefs.chat_toggles & CHAT_GHOSTLAWS ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_laws/Get_checked(client/C) - return C.prefs.chat_toggles & CHAT_GHOSTLAWS - -/datum/verbs/menu/Settings/Ghost/chatterbox/Events - name = "Events" + prefs.chat_toggles ^= CHAT_GHOSTLAWS + to_chat(usr, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTLAWS) ? "be notified of all law changes" : "no longer be notified of law changes"].") + prefs.save_preferences() + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Laws", "[prefs.chat_toggles & CHAT_GHOSTLAWS ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //please be aware that the following two verbs have inverted stat output, so that "Toggle Deathrattle|1" still means you activated it -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox/Events, toggle_deathrattle)() +/client/verb/toggle_deathrattle() set name = "Toggle Deathrattle" set category = "Preferences" set desc = "Death" - usr.client.prefs.toggles ^= DISABLE_DEATHRATTLE - usr.client.prefs.save_preferences() - to_chat(usr, "You will [(usr.client.prefs.toggles & DISABLE_DEATHRATTLE) ? "no longer" : "now"] get messages when a sentient mob dies.") - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Deathrattle", "[!(usr.client.prefs.toggles & DISABLE_DEATHRATTLE) ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, maybe you should spend some time reading the comments. -/datum/verbs/menu/Settings/Ghost/chatterbox/Events/toggle_deathrattle/Get_checked(client/C) - return !(C.prefs.toggles & DISABLE_DEATHRATTLE) - -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox/Events, toggle_arrivalrattle)() + prefs.toggles ^= DISABLE_DEATHRATTLE + prefs.save_preferences() + to_chat(usr, "You will [(prefs.toggles & DISABLE_DEATHRATTLE) ? "no longer" : "now"] get messages when a sentient mob dies.") + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Deathrattle", "[!(prefs.toggles & DISABLE_DEATHRATTLE) ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, maybe you should spend some time reading the comments. + +/client/verb/toggle_arrivalrattle() set name = "Toggle Arrivalrattle" set category = "Preferences" set desc = "New Player Arrival" - usr.client.prefs.toggles ^= DISABLE_ARRIVALRATTLE - to_chat(usr, "You will [(usr.client.prefs.toggles & DISABLE_ARRIVALRATTLE) ? "no longer" : "now"] get messages when someone joins the station.") - usr.client.prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Arrivalrattle", "[!(usr.client.prefs.toggles & DISABLE_ARRIVALRATTLE) ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, maybe you should rethink where your life went so wrong. -/datum/verbs/menu/Settings/Ghost/chatterbox/Events/toggle_arrivalrattle/Get_checked(client/C) - return !(C.prefs.toggles & DISABLE_ARRIVALRATTLE) - -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost, togglemidroundantag)() + prefs.toggles ^= DISABLE_ARRIVALRATTLE + to_chat(usr, "You will [(prefs.toggles & DISABLE_ARRIVALRATTLE) ? "no longer" : "now"] get messages when someone joins the station.") + prefs.save_preferences() + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Arrivalrattle", "[!(prefs.toggles & DISABLE_ARRIVALRATTLE) ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, maybe you should rethink where your life went so wrong. + +/client/verb/togglemidroundantag() set name = "Toggle Midround Antagonist" set category = "Preferences" set desc = "Midround Antagonist" - usr.client.prefs.toggles ^= MIDROUND_ANTAG - usr.client.prefs.save_preferences() - to_chat(usr, "You will [(usr.client.prefs.toggles & MIDROUND_ANTAG) ? "now" : "no longer"] be considered for midround antagonist positions.") - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Midround Antag", "[usr.client.prefs.toggles & MIDROUND_ANTAG ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/verbs/menu/Settings/Ghost/togglemidroundantag/Get_checked(client/C) - return C.prefs.toggles & MIDROUND_ANTAG - -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggletitlemusic)() + prefs.toggles ^= MIDROUND_ANTAG + prefs.save_preferences() + to_chat(usr, "You will [(prefs.toggles & MIDROUND_ANTAG) ? "now" : "no longer"] be considered for midround antagonist positions.") + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Midround Antag", "[prefs.toggles & MIDROUND_ANTAG ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/toggletitlemusic() set name = "Hear/Silence Lobby Music" set category = "Preferences" set desc = "Hear Music In Lobby" - usr.client.prefs.toggles ^= SOUND_LOBBY - usr.client.prefs.save_preferences() - if(usr.client.prefs.toggles & SOUND_LOBBY) + prefs.toggles ^= SOUND_LOBBY + prefs.save_preferences() + if(prefs.toggles & SOUND_LOBBY) to_chat(usr, "You will now hear music in the game lobby.") if(isnewplayer(usr)) - usr.client.playtitlemusic() + playtitlemusic() else to_chat(usr, "You will no longer hear music in the game lobby.") usr.stop_sound_channel(CHANNEL_LOBBYMUSIC) - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Lobby Music", "[usr.client.prefs.toggles & SOUND_LOBBY ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/verbs/menu/Settings/Sound/toggletitlemusic/Get_checked(client/C) - return C.prefs.toggles & SOUND_LOBBY + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Lobby Music", "[prefs.toggles & SOUND_LOBBY ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, togglemidis)() +/client/verb/togglemidis() set name = "Hear/Silence Midis" set category = "Preferences" set desc = "Hear Admin Triggered Sounds (Midis)" - usr.client.prefs.toggles ^= SOUND_MIDI - usr.client.prefs.save_preferences() - if(usr.client.prefs.toggles & SOUND_MIDI) + prefs.toggles ^= SOUND_MIDI + prefs.save_preferences() + if(prefs.toggles & SOUND_MIDI) to_chat(usr, "You will now hear any sounds uploaded by admins.") else to_chat(usr, "You will no longer hear sounds uploaded by admins") usr.stop_sound_channel(CHANNEL_ADMIN) var/client/C = usr.client C?.tgui_panel?.stop_music() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Hearing Midis", "[usr.client.prefs.toggles & SOUND_MIDI ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/verbs/menu/Settings/Sound/togglemidis/Get_checked(client/C) - return C.prefs.toggles & SOUND_MIDI + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Hearing Midis", "[prefs.toggles & SOUND_MIDI ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggle_instruments)() +/client/verb/toggle_instruments() set name = "Hear/Silence Instruments" set category = "Preferences" set desc = "Hear In-game Instruments" - usr.client.prefs.toggles ^= SOUND_INSTRUMENTS - usr.client.prefs.save_preferences() - if(usr.client.prefs.toggles & SOUND_INSTRUMENTS) + prefs.toggles ^= SOUND_INSTRUMENTS + prefs.save_preferences() + if(prefs.toggles & SOUND_INSTRUMENTS) to_chat(usr, "You will now hear people playing musical instruments.") else to_chat(usr, "You will no longer hear musical instruments.") - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Instruments", "[usr.client.prefs.toggles & SOUND_INSTRUMENTS ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/verbs/menu/Settings/Sound/toggle_instruments/Get_checked(client/C) - return C.prefs.toggles & SOUND_INSTRUMENTS - + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Instruments", "[prefs.toggles & SOUND_INSTRUMENTS ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, Toggle_Soundscape)() +/client/verb/Toggle_Soundscape() set name = "Hear/Silence Ambience" set category = "Preferences" set desc = "Hear Ambient Sound Effects" - usr.client.prefs.toggles ^= SOUND_AMBIENCE - usr.client.prefs.save_preferences() - if(usr.client.prefs.toggles & SOUND_AMBIENCE) + prefs.toggles ^= SOUND_AMBIENCE + prefs.save_preferences() + if(prefs.toggles & SOUND_AMBIENCE) to_chat(usr, "You will now hear ambient sounds.") else to_chat(usr, "You will no longer hear ambient sounds.") usr.stop_sound_channel(CHANNEL_AMBIENT_EFFECTS) usr.stop_sound_channel(CHANNEL_AMBIENT_MUSIC) + usr.stop_sound_channel(CHANNEL_BUZZ) + usr.client.buzz_playing = FALSE + usr.client.update_ambience_pref() SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ambience", "[usr.client.prefs.toggles & SOUND_AMBIENCE ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/verbs/menu/Settings/Sound/Toggle_Soundscape/Get_checked(client/C) - return C.prefs.toggles & SOUND_AMBIENCE - -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggle_ship_ambience)() +/client/verb/toggle_ship_ambience() set name = "Hear/Silence Ship Ambience" set category = "Preferences" set desc = "Hear Ship Ambience Roar" - usr.client.prefs.toggles ^= SOUND_SHIP_AMBIENCE - usr.client.prefs.save_preferences() - if(usr.client.prefs.toggles & SOUND_SHIP_AMBIENCE) + prefs.toggles ^= SOUND_SHIP_AMBIENCE + prefs.save_preferences() + if(prefs.toggles & SOUND_SHIP_AMBIENCE) to_chat(usr, "You will now hear ship ambience.") else to_chat(usr, "You will no longer hear ship ambience.") - usr.stop_sound_channel(CHANNEL_AMBIENT_BUZZ) - usr.client.ambient_buzz_playing = FALSE + usr.stop_sound_channel(CHANNEL_BUZZ) + usr.client.buzz_playing = FALSE SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ship Ambience", "[usr.client.prefs.toggles & SOUND_SHIP_AMBIENCE ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^) -/datum/verbs/menu/Settings/Sound/toggle_ship_ambience/Get_checked(client/C) - return C.prefs.toggles & SOUND_SHIP_AMBIENCE - -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggle_announcement_sound)() +/client/verb/toggle_announcement_sound() set name = "Hear/Silence Announcements" set category = "Preferences" set desc = "Hear Announcement Sound" - usr.client.prefs.toggles ^= SOUND_ANNOUNCEMENTS - to_chat(usr, "You will now [(usr.client.prefs.toggles & SOUND_ANNOUNCEMENTS) ? "hear announcement sounds" : "no longer hear announcements"].") - usr.client.prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Announcement Sound", "[usr.client.prefs.toggles & SOUND_ANNOUNCEMENTS ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/verbs/menu/Settings/Sound/toggle_announcement_sound/Get_checked(client/C) - return C.prefs.toggles & SOUND_ANNOUNCEMENTS - + prefs.toggles ^= SOUND_ANNOUNCEMENTS + to_chat(usr, "You will now [(prefs.toggles & SOUND_ANNOUNCEMENTS) ? "hear announcement sounds" : "no longer hear announcements"].") + prefs.save_preferences() + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Announcement Sound", "[prefs.toggles & SOUND_ANNOUNCEMENTS ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/verbs/menu/Settings/Sound/verb/stop_client_sounds() +/client/verb/stop_client_sounds() set name = "Stop Sounds" set category = "Preferences" set desc = "Stop Current Sounds" SEND_SOUND(usr, sound(null)) - var/client/C = usr.client - C?.tgui_panel?.stop_music() + tgui_panel?.stop_music() SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Stop Self Sounds")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_ooc)() +/client/verb/listen_ooc() set name = "Show/Hide OOC" set category = "Preferences" set desc = "Show OOC Chat" - usr.client.prefs.chat_toggles ^= CHAT_OOC - usr.client.prefs.save_preferences() - to_chat(usr, "You will [(usr.client.prefs.chat_toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.") - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Seeing OOC", "[usr.client.prefs.chat_toggles & CHAT_OOC ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/verbs/menu/Settings/listen_ooc/Get_checked(client/C) - return C.prefs.chat_toggles & CHAT_OOC - -TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_bank_card)() + prefs.chat_toggles ^= CHAT_OOC + prefs.save_preferences() + to_chat(usr, "You will [(prefs.chat_toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.") + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Seeing OOC", "[prefs.chat_toggles & CHAT_OOC ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/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 - + prefs.chat_toggles ^= CHAT_BANKCARD + prefs.save_preferences() + to_chat(usr, "You will [(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", "[(prefs.chat_toggles & CHAT_BANKCARD) ? "Enabled" : "Disabled"]")) GLOBAL_LIST_INIT(ghost_forms, sortList(list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \ "ghost_blue","ghost_yellow","ghost_green","ghost_pink", \ "ghost_cyan","ghost_dblue","ghost_dred","ghost_dgreen", \ "ghost_dcyan","ghost_grey","ghost_dyellow","ghost_dpink", "ghost_purpleswirl","ghost_funkypurp","ghost_pinksherbert","ghost_blazeit",\ "ghost_mellow","ghost_rainbow","ghost_camo","ghost_fire", "catghost"))) + /client/proc/pick_form() if(!is_content_unlocked()) alert("This setting is for accounts with BYOND premium only.") @@ -444,7 +384,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.toggles ^= SOUND_PRAYERS prefs.save_preferences() to_chat(usr, "You will [(prefs.toggles & SOUND_PRAYERS) ? "now" : "no longer"] hear a sound when prayers arrive.") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Prayer Sounds", "[usr.client.prefs.toggles & SOUND_PRAYERS ? "Enabled" : "Disabled"]")) + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Prayer Sounds", "[prefs.toggles & SOUND_PRAYERS ? "Enabled" : "Disabled"]")) /client/proc/colorasay() set name = "Set Admin Say Color" diff --git a/code/modules/client/verbs/input_box.dm b/code/modules/client/verbs/input_box.dm new file mode 100644 index 0000000000000..772f6efd4152a --- /dev/null +++ b/code/modules/client/verbs/input_box.dm @@ -0,0 +1,156 @@ +/client/proc/create_input_window(id, title, accept_verb, cancel_verb, force=FALSE, show=TRUE) + if(winexists(src, id)) + if(force) + //Delete all clientside objects that are part of the window + winset(src, "[id]_macro_returnup", "parent=none") + winset(src, "[id]_macro_return", "parent=none") + winset(src, "[id]_macro_escape", "parent=none") + winset(src, "persist_[id]_macro", "parent=none") + winset(src, id, "parent=none") + else + return + + // Create a macro set for handling enter presses + winclone(src, "input_box_macro", "persist_[id]_macro") + winset(src, "[id]_macro_returnup", "parent=persist_[id]_macro;name=Return+UP;command=\".winset \\\"[id].is-visible=false\\\"\"") + // Return+UP allows us to close the window after typing in a command, pressing enter and releasing enter. + // Can't use just Return for this, because when there's text in the box Return is handled by BYOND and doesn't run the macro. + + // Create the actual window and set its title and macro set + winclone(src, "input_box", id) + winset(src, id, "title=\"[title]\";macro=persist_[id]_macro") + + if(accept_verb) + winset(src, "[id].input", "command=\"[accept_verb] \\\"\"") + winset(src, "[id].accept", "command=\".winset \\\"command=\\\"[accept_verb] \\\\\\\"\[\[[id].input.text as escaped\]\]\\\";[id].is-visible=false\\\"\"") + + if(cancel_verb) + winset(src, "[id].cancel", "command=\".winset \\\"command=\\\"[cancel_verb]\\\";[id].is-visible=false\\\"\"") + winset(src, "[id]_macro_return", "parent=persist_[id]_macro;name=Return;command=\".winset \\\"command=\\\"[cancel_verb]\\\";[id].is-visible=false\\\"\"") + winset(src, "[id]_macro_escape", "parent=persist_[id]_macro;name=Escape;command=\".winset \\\"command=\\\"[cancel_verb]\\\";[id].is-visible=false\\\"\"") + winset(src, id, "on-close=\"[cancel_verb]\"") + else + winset(src, "[id]_macro_return", "parent=persist_[id]_macro;name=Return;command=\".winset \\\"[id].is-visible=false\\\"\"") + winset(src, "[id]_macro_escape", "parent=persist_[id]_macro;name=Escape;command=\".winset \\\"[id].is-visible=false\\\"\"") + + //Window scaling! + //BYOND doesn't scale the window by DPI scaling, so it'll appear too big/too small with DPI scaling other than the one it was based on + //This code uses the title bar to figure out what DPI scaling is being used and resize the window based on that + //Figure out the DPI scaling based on the titlebar size of the window, based on outer-inner height + var/window_data = params2list(winget(src, id, "outer-size;inner-size")) + var/window_innersize = splittext(window_data["inner-size"], "x") + var/window_outersize = splittext(window_data["outer-size"], "x") + + var/titlebarHeight = text2num(window_outersize[2])-text2num(window_innersize[2]) + + //Known titlebar heights for DPI scaling: + //win7: 100%-28, 125%-33, 150%-39 + //win10: 100%-29, 125%-35, 150%-40 + + //Known window sizes for DPI scaling: (Win7) + //100%: 302x86, font 7 + //125%: 402x106, font 8 + //150%: 503x133, font 8 + + var/scaling = FALSE + + //Those are the default values for the window + var/window_width = 302 + var/window_height = 86 + var/font_size = 7 + + //The values used here were sampled from BYOND in practice, I couldn't find a formula that would describe them + switch(titlebarHeight) + if(30 to 37) + scaling = 1.25 + window_width = 402 + window_height = 106 + font_size = 8 + if(37 to 42) + scaling = 1.50 + window_width = 503 + window_height = 133 + font_size = 8 + + if(scaling) + winset(src, null, "[id].size=[window_width]x[window_height];[id].input.font-size=[font_size];[id].accept.font-size=[font_size];[id].cancel.font-size=[font_size]") + //End window scaling + + //Center the window on the main window + //The window size is hardcoded to be 410x133, taken from skin.dmf + var/mainwindow_data = params2list(winget(src, "mainwindow", "pos;outer-size;size;inner-size;is-maximized")) + var/mainwindow_pos = splittext(mainwindow_data["pos"], ",") + var/mainwindow_size = splittext(mainwindow_data["size"], "x") + var/mainwindow_innersize = splittext(mainwindow_data["inner-size"], "x") + var/mainwindow_outersize = splittext(mainwindow_data["outer-size"], "x") + + var/maximized = (mainwindow_data["is-maximized"] == "true") + + if(!maximized) + //If the window is anchored (for example win+right), is-maximized is false but pos is no longer reliable + //In that case, compare inner-size and size to guess if it's actually anchored + maximized = text2num(mainwindow_size[1]) != text2num(mainwindow_innersize[1])\ + || abs(text2num(mainwindow_size[2]) - text2num(mainwindow_innersize[2])) > 30 + + var/target_x + var/target_y + + // If the window is maximized or anchored, pos is the last position when the window was free-floating + if(maximized) + target_x = text2num(mainwindow_outersize[1])/2-window_width/2 + target_y = text2num(mainwindow_outersize[2])/2-window_height/2 + else + target_x = text2num(mainwindow_pos[1])+text2num(mainwindow_outersize[1])/2-window_width/2 + target_y = text2num(mainwindow_pos[2])+text2num(mainwindow_outersize[2])/2-window_height/2 + + winset(src, id, "pos=[target_x],[target_y]") + //End centering + + if(show) + //Show the window and focus on the textbox + winshow(src, id, TRUE) + winset(src, "[id].input", "focus=true") + +///Presets for standard windows +GLOBAL_LIST_INIT(input_window_presets, list( + "say" = list("saywindow", "say \\\"text\\\"", ".say", ".cancel_typing say"), + "me" = list("mewindow", "me (text)", ".me", ".cancel_typing me"), +)) + +/client/proc/create_preset_input_window(name, force=FALSE, show=TRUE) + var/arglist = GLOB.input_window_presets[name] + + create_input_window(arglist[1], arglist[2], arglist[3], arglist[4], force=force, show=show) + +//Those verbs are used by the hotkeys to ensure the window is created when you try to use it + +/client/verb/init_say() + set name = ".init_say" + set hidden = TRUE + + create_preset_input_window("say") + +/client/verb/init_me() + set name = ".init_me" + set hidden = TRUE + + create_preset_input_window("me") + +//Verb available to the user in case something in the window breaks +/client/verb/fix_chatbox() + set name = "Fix chatbox" + + var/preset = input(src, "Which chat window do you want to recreate?", "Fix chatbox") as null|anything in GLOB.input_window_presets + + if(!preset) + return + + create_preset_input_window(preset, force=TRUE) + +//Create the windows for say and me ahead of time +/client/New() + . = ..() + + if(src) //In case the client was deleted while New was running + create_preset_input_window("say", show=FALSE) + create_preset_input_window("me", show=FALSE) diff --git a/code/modules/client/verbs/looc.dm b/code/modules/client/verbs/looc.dm index dbd6f20968bb5..442daf6f00377 100644 --- a/code/modules/client/verbs/looc.dm +++ b/code/modules/client/verbs/looc.dm @@ -57,10 +57,10 @@ GLOBAL_VAR_INIT(looc_allowed, 1) msg = emoji_parse(msg) - mob.log_talk(raw_msg, LOG_OOC, tag="(LOOC)") + mob.log_talk(raw_msg, LOG_OOC, tag="LOOC") - var/list/heard = get_hearers_in_view(7, get_top_level_mob(src.mob)) - for(var/mob/M in heard) + var/list/heard = hearers(7, get_top_level_mob(src.mob)) + for(var/mob/M as() in heard) if(!M.client) continue var/client/C = M.client @@ -87,19 +87,6 @@ GLOBAL_VAR_INIT(looc_allowed, 1) prefix = "LOOC" to_chat(C,"[ADMIN_FLW(usr)][prefix]: [src.key]/[src.mob.name]: [msg]") - /*for(var/mob/dead/observer/G in world) - if(!G.client) - continue - var/client/C = G.client - if (C in GLOB.admins) - continue //handled earlier. - if(C.prefs.toggles & CHAT_OOC) - var/prefix = "(G)LOOC" - if (C.mob in heard) - prefix = "LOOC" - to_chat(C,"[prefix]: [src.key]/[src.mob.name]: [msg]")*/ - - /proc/log_looc(text) if (CONFIG_GET(flag/log_ooc)) WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]LOOC: [text]") @@ -110,7 +97,7 @@ GLOBAL_VAR_INIT(looc_allowed, 1) return M.get_top_level_mob() return src -proc/get_top_level_mob(var/mob/S) +/proc/get_top_level_mob(var/mob/S) if(istype(S.loc,/mob)&&S.loc!=S) var/mob/M=S.loc return M.get_top_level_mob() diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 5b5af3e4e39bc..ce7a96e3d107b 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -67,26 +67,28 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") if(prefs.unlock_content) if(prefs.toggles & MEMBER_PUBLIC) keyname = "[icon2html('icons/member_content.dmi', world, "blag")][keyname]" + //Get client badges + var/badge_data = badge_parse(get_badges()) //The linkify span classes and linkify=TRUE below make ooc text get clickable chat href links if you pass in something resembling a url for(var/client/C in GLOB.clients) if(C.prefs.chat_toggles & CHAT_OOC) if(holder) if(!holder.fakekey || C.holder) if(check_rights_for(src, R_ADMIN)) - to_chat(C, "[CONFIG_GET(flag/allow_admin_ooccolor) && prefs.ooccolor ? "" :"" ]OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]") + to_chat(C, "[badge_data][CONFIG_GET(flag/allow_admin_ooccolor) && prefs.ooccolor ? "" :"" ]OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]", allow_linkify = TRUE) else - to_chat(C, "OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]") + to_chat(C, "[badge_data]OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]") else if(GLOB.OOC_COLOR) - to_chat(C, "OOC: [holder.fakekey ? holder.fakekey : key]: [msg]") + to_chat(C, "[badge_data]OOC: [holder.fakekey ? holder.fakekey : key]: [msg]") else - to_chat(C, "OOC: [holder.fakekey ? holder.fakekey : key]: [msg]") + to_chat(C, "[badge_data]OOC: [holder.fakekey ? holder.fakekey : key]: [msg]") else if(!(key in C.prefs.ignoring)) if(GLOB.OOC_COLOR) - to_chat(C, "OOC: [keyname]: [msg]") + to_chat(C, "[badge_data]OOC: [keyname]: [msg]") else - to_chat(C, "OOC: [keyname]: [msg]") + to_chat(C, "[badge_data]OOC: [keyname]: [msg]") // beestation, send to discord if(holder?.fakekey) discordsendmsg("ooc", "**[holder.fakekey]:** [msg]") @@ -169,7 +171,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") var/motd = global.config.motd if(motd) - to_chat(src, "
[motd]
", handle_whitespace=FALSE) + to_chat(src, "
[motd]
", handle_whitespace=FALSE, allow_linkify = TRUE) else to_chat(src, "The Message of the Day has not been set.") @@ -193,11 +195,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") to_chat(usr, "Sorry, tracking is currently disabled.") return - var/list/body = list() - body += "Playtime for [key]
Playtime:" - body += get_exp_report() - body += "" - usr << browse(body.Join(), "window=playerplaytime[ckey];size=550x615") + new /datum/job_report_menu(src, usr) /client/proc/ignore_key(client, displayed_key) var/client/C = client diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 2b95d0ab386b8..c2943b1c67c54 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -3,9 +3,9 @@ /mob/proc/set_suicide(suicide_state) suiciding = suicide_state if(suicide_state) - GLOB.suicided_mob_list += src + add_to_mob_suicide_list() else - GLOB.suicided_mob_list -= src + remove_from_mob_suicide_list() /mob/living/carbon/set_suicide(suicide_state) //you thought that box trick was pretty clever, didn't you? well now hardmode is on, boyo. . = ..() @@ -82,7 +82,7 @@ adjustOxyLoss(max(200 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) death(FALSE) - ghostize(FALSE) // Disallows reentering body and disassociates mind + ghostize(FALSE,SENTIENCE_ERASE) // Disallows reentering body and disassociates mind return @@ -130,7 +130,7 @@ suicide_log() death(FALSE) - ghostize(FALSE) // Disallows reentering body and disassociates mind + ghostize(FALSE,SENTIENCE_ERASE) // Disallows reentering body and disassociates mind /mob/living/carbon/monkey/verb/suicide() set hidden = 1 @@ -148,7 +148,7 @@ adjustOxyLoss(max(200- getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) death(FALSE) - ghostize(FALSE) // Disallows reentering body and disassociates mind + ghostize(FALSE,SENTIENCE_ERASE) // Disallows reentering body and disassociates mind /mob/living/silicon/ai/verb/suicide() set hidden = 1 @@ -167,7 +167,7 @@ //put em at -175 adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) death(FALSE) - ghostize(FALSE) // Disallows reentering body and disassociates mind + ghostize(FALSE,SENTIENCE_ERASE) // Disallows reentering body and disassociates mind /mob/living/silicon/robot/verb/suicide() set hidden = 1 @@ -186,7 +186,7 @@ //put em at -175 adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) death(FALSE) - ghostize(FALSE) // Disallows reentering body and disassociates mind + ghostize(FALSE,SENTIENCE_ERASE) // Disallows reentering body and disassociates mind /mob/living/silicon/pai/verb/suicide() set hidden = 1 @@ -199,7 +199,7 @@ suicide_log() death(FALSE) - ghostize(FALSE) // Disallows reentering body and disassociates mind + ghostize(FALSE,SENTIENCE_ERASE) // Disallows reentering body and disassociates mind else to_chat(src, "Aborting suicide attempt.") @@ -221,7 +221,7 @@ //put em at -175 adjustOxyLoss(max(200 - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) death(FALSE) - ghostize(FALSE) // Disallows reentering body and disassociates mind + ghostize(FALSE,SENTIENCE_ERASE) // Disallows reentering body and disassociates mind /mob/living/simple_animal/verb/suicide() set hidden = 1 @@ -238,7 +238,7 @@ suicide_log() death(FALSE) - ghostize(FALSE) // Disallows reentering body and disassociates mind + ghostize(FALSE,SENTIENCE_ERASE) // Disallows reentering body and disassociates mind /mob/living/proc/suicide_log() log_game("[key_name(src)] committed suicide at [AREACOORD(src)] as [src.type].") diff --git a/code/modules/client/verbs/who.dm b/code/modules/client/verbs/who.dm index 5f16b98047c91..d2c7e9416a957 100644 --- a/code/modules/client/verbs/who.dm +++ b/code/modules/client/verbs/who.dm @@ -59,7 +59,7 @@ /client/verb/staffwho() set category = "Admin" set name = "Staffwho" - + var/msg = "Current Admins:\n" if(holder) for(var/client/C in GLOB.admins) @@ -104,7 +104,11 @@ continue //Don't show afk admins to adminwho msg += "\t[C] is a mentor\n" - msg += "Adminhelps are also sent to IRC. If no admins are available in game adminhelp anyways and an admin on IRC will see it and respond." + msg += "Adminhelps are also sent through TGS to services like IRC and Discord. If no admins are available in game adminhelp anyways and an admin will see it and respond." + if(world.time - src.staff_check_rate > 1 MINUTES) + message_admins("[ADMIN_LOOKUPFLW(src.mob)] has checked online staff.") + log_admin("[key_name(src)] has checked online staff.") + src.staff_check_rate = world.time to_chat(src, msg) /client/verb/mentorwho() // redundant with staffwho, but people wont check the admin tab for if there are mentors on @@ -155,6 +159,10 @@ continue //Don't show afk admins to adminwho msg += "\t[C] is a mentor\n" - msg += "Adminhelps are also sent to IRC. If no admins are available in game adminhelp anyways and an admin on IRC will see it and respond." + msg += "Adminhelps are also sent through TGS to services like IRC and Discord. If no admins are available in game adminhelp anyways and an admin will see it and respond." + if(world.time - src.staff_check_rate > 1 MINUTES) + message_admins("[ADMIN_LOOKUPFLW(src.mob)] has checked online staff.") + log_admin("[key_name(src)] has checked online staff.") + src.staff_check_rate = world.time to_chat(src, msg) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index a9bfc922ac126..953d184b35e86 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -63,8 +63,8 @@ // it's has TRAIT_NODROP D.dropItemToGround(target, TRUE) qdel(old_headgear) - // where is `SLOT_HEAD` defined? WHO KNOWS - D.equip_to_slot(new_headgear, SLOT_HEAD) + // where is `ITEM_SLOT_HEAD` defined? WHO KNOWS + D.equip_to_slot(new_headgear, ITEM_SLOT_HEAD) return 1 @@ -220,7 +220,7 @@ var/obj/item/I = target I.item_state = initial(picked_item.item_state) I.item_color = initial(picked_item.item_color) - if(istype(I, /obj/item/clothing) && istype(initial(picked_item), /obj/item/clothing)) + if(isclothing(I) && isclothing(initial(picked_item))) var/obj/item/clothing/CL = I var/obj/item/clothing/PCL = picked_item CL.flags_cover = initial(PCL.flags_cover) @@ -243,8 +243,7 @@ /datum/action/item_action/chameleon/change/process() if(world.time > emp_timer) - STOP_PROCESSING(SSprocessing, src) - return + return PROCESS_KILL random_look(owner) /obj/item/clothing/under/chameleon @@ -258,7 +257,7 @@ random_sensor = FALSE resistance_flags = NONE can_adjust = FALSE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 10) var/datum/action/item_action/chameleon/change/chameleon_action @@ -278,6 +277,13 @@ item_state = "engi_suit" item_color = "engine" +/obj/item/clothing/under/chameleon/envirosuit/ratvar + name = "ratvarian engineer's envirosuit" + desc = "A tough envirosuit woven from alloy threads. It can take on the appearance of other jumpsuits." + icon_state = "engineer_envirosuit" + item_state = "engineer_envirosuit" + item_color = "engineer_envirosuit" + /obj/item/clothing/under/chameleon/Initialize() . = ..() chameleon_action = new(src) @@ -303,7 +309,7 @@ item_state = "armor" blood_overlay_type = "armor" resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 10) var/datum/action/item_action/chameleon/change/chameleon_action @@ -331,7 +337,7 @@ icon_state = "meson" item_state = "meson" resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 10) var/datum/action/item_action/chameleon/change/chameleon_action @@ -361,13 +367,13 @@ flash_protect = 3 /obj/item/clothing/gloves/chameleon - desc = "These gloves will protect the wearer from electric shock." + desc = "These gloves provide protection against electric shock." name = "insulated gloves" icon_state = "yellow" item_state = "ygloves" resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 10) var/datum/action/item_action/chameleon/change/chameleon_action @@ -401,7 +407,7 @@ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 10) /obj/item/clothing/head/chameleon name = "grey cap" @@ -411,7 +417,7 @@ 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) + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 10) var/datum/action/item_action/chameleon/change/chameleon_action @@ -447,13 +453,20 @@ heat_protection = HEAD max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT bang_protect = 1 - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + +/obj/item/clothing/head/chameleon/envirohelm/ratvar + name = "ratvarian engineer's envirosuit helmet" + desc = "A tough envirohelm woven from alloy threads. It can take on the appearance of other headgear." + icon_state = "engineer_envirohelm" + item_state = "engineer_envirohelm" + flash_protect = 1 /obj/item/clothing/head/chameleon/drone // The camohat, I mean, holographic hat projection, is part of the // drone itself. clothing_flags = SNUG_FIT - 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, "stamina" = 0) // which means it offers no protection, it's just air and light /obj/item/clothing/head/chameleon/drone/Initialize() @@ -471,7 +484,7 @@ icon_state = "gas_alt" item_state = "gas_alt" resistance_flags = NONE - armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 10) clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR gas_transfer_coefficient = 0.01 @@ -507,7 +520,7 @@ /obj/item/clothing/mask/chameleon/drone //Same as the drone chameleon hat, undroppable and no protection - 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, "stamina" = 0) // Can drones use the voice changer part? Let's not find out. vchange = 0 @@ -530,7 +543,7 @@ desc = "A pair of black shoes." permeability_coefficient = 0.05 resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 10) pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes var/datum/action/item_action/chameleon/change/chameleon_action @@ -678,7 +691,7 @@ desc = "A neosilk clip-on tie." icon_state = "blacktie" resistance_flags = NONE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 0) /obj/item/clothing/neck/cloak/chameleon var/datum/action/item_action/chameleon/change/chameleon_action diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index f128e9aee47b6..ad5a525337691 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1,3 +1,9 @@ +#define SENSORS_OFF 0 +#define SENSORS_BINARY 1 +#define SENSORS_VITALS 2 +#define SENSORS_TRACKING 3 +#define SENSOR_CHANGE_DELAY 1.5 SECONDS + /obj/item/clothing name = "clothing" resistance_flags = FLAMMABLE @@ -21,7 +27,6 @@ var/active_sound = null var/toggle_cooldown = null var/cooldown = 0 - var/scan_reagents = 0 //Can the wearer see reagents while it's equipped? var/envirosealed = FALSE //is it safe for plasmamen var/blocks_shove_knockdown = FALSE //Whether wearing the clothing item blocks the ability for shove to knock down. @@ -41,6 +46,12 @@ var/dynamic_hair_suffix = ""//head > mask for head hair var/dynamic_fhair_suffix = ""//mask > head for facial hair + var/high_pressure_multiplier = 1 + var/static/list/high_pressure_multiplier_types = list("melee", "bullet", "laser", "energy", "bomb") + ///These are armor values that protect the wearer, taken from the clothing's armor datum. List updates on examine because it's currently only used to print armor ratings to chat in Topic(). + var/list/armor_list = list() + ///These are armor values that protect the clothing, taken from its armor datum. List updates on examine because it's currently only used to print armor ratings to chat in Topic(). + var/list/durability_list = list() /obj/item/clothing/Initialize() if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE)) @@ -56,8 +67,8 @@ if(ismecha(M.loc)) // stops inventory actions in a mech return - if(!M.incapacitated() && loc == M && istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + if(!M.incapacitated() && loc == M && istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object if(M.putItemFromInventoryInHandIfPossible(src, H.held_index)) add_fingerprint(usr) @@ -69,7 +80,7 @@ foodtype = CLOTH /obj/item/clothing/attack(mob/M, mob/user, def_zone) - if(user.a_intent != INTENT_HARM && ismoth(M)) + if(user.a_intent != INTENT_HARM && ismoth(M) && !(clothing_flags & NOTCONSUMABLE) && !(resistance_flags & INDESTRUCTIBLE) && (armor.getRating("melee") == 0)) var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new clothing_as_food.name = name if(clothing_as_food.attack(M, user, def_zone)) @@ -107,7 +118,7 @@ ..() if (!istype(user)) return - if(slot_flags & slotdefine2slotbit(slot)) //Was equipped to a valid slot for this item? + if(slot_flags & slot) //Was equipped to a valid slot for this item? if (LAZYLEN(user_vars_to_edit)) for(var/variable in user_vars_to_edit) if(variable in user.vars) @@ -141,6 +152,89 @@ how_cool_are_your_threads += "" . += how_cool_are_your_threads.Join() + . += "It has a tag listing its protection classes." + +/obj/item/clothing/Topic(href, href_list) + . = ..() + if(href_list["list_armor"]) + if(length(armor_list)) + armor_list.Cut() + if(armor.bio) + armor_list += list("TOXIN" = armor.bio) + if(armor.bomb) + armor_list += list("EXPLOSIVE" = armor.bomb) + if(armor.bullet) + armor_list += list("BULLET" = armor.bullet) + if(armor.energy) + armor_list += list("ENERGY" = armor.energy) + if(armor.laser) + armor_list += list("LASER" = armor.laser) + if(armor.magic) + armor_list += list("MAGIC" = armor.magic) + if(armor.melee) + armor_list += list("MELEE" = armor.melee) + if(armor.rad) + armor_list += list("RADIATION" = armor.rad) + if(armor.stamina) + armor_list += list("STAMINA" = armor.stamina) + + if(length(durability_list)) + durability_list.Cut() + if(armor.fire) + durability_list += list("FIRE" = armor.fire) + if(armor.acid) + durability_list += list("ACID" = armor.acid) + var/list/readout = list("PROTECTION CLASSES (I-X)") + if(length(armor_list)) + readout += "\nARMOR" + for(var/dam_type in armor_list) + var/armor_amount = armor_list[dam_type] + readout += "\n[dam_type] [armor_to_protection_class(armor_amount)]" //e.g. BOMB IV + if(length(durability_list)) + readout += "\nDURABILITY" + for(var/dam_type in durability_list) + var/durability_amount = durability_list[dam_type] + readout += "\n[dam_type] [armor_to_protection_class(durability_amount)]" //e.g. FIRE II + if(!(length(armor_list) || length(durability_list))) + readout += "\nNO PROTECTION" + readout += "" + + to_chat(usr, "[readout.Join()]") + +/** + * Rounds armor_value to nearest 10, divides it by 10 and then expresses it in roman numerals up to 10 + * + * Rounds armor_value to nearest 10, divides it by 10 + * and then expresses it in roman numerals up to 10 + * Arguments: + * * armor_value - Number we're converting + */ +/obj/item/clothing/proc/armor_to_protection_class(armor_value) + armor_value = round(armor_value,10) / 10 + switch (armor_value) + if(0) + . = "< I" + if(1) + . = "I" + if(2) + . = "II" + if(3) + . = "III" + if(4) + . = "IV" + if(5) + . = "V" + if(6) + . = "VI" + if(7) + . = "VII" + if(8) + . = "VIII" + if(9) + . = "IX" + if(10 to INFINITY) + . = "X" + /obj/item/clothing/obj_break(damage_flag) if(!damaged_clothes) update_clothes_damaged_state(TRUE) @@ -183,48 +277,71 @@ BLIND // can't see anything 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/)) +/obj/item/clothing/under/proc/set_sensors(mob/user) + var/mob/M = user + if(M.stat) return - if (!can_use(M)) + if(!can_use(M)) return if(src.has_sensor == LOCKED_SENSORS) - to_chat(usr, "The controls are locked.") - return 0 + to_chat(user, "The controls are locked.") + return FALSE if(src.has_sensor == BROKEN_SENSORS) - to_chat(usr, "The sensors have shorted out!") - return 0 + to_chat(user, "The sensors have shorted out!") + return FALSE if(src.has_sensor <= NO_SENSORS) - to_chat(usr, "This suit does not have any sensors.") - return 0 + to_chat(user, "This suit does not have any sensors.") + return FALSE 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!") + if(get_dist(user, src) > 1) + to_chat(user, "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.") - + var/sensor_selection = modes.Find(switchMode) - 1 + + if (src.loc == user) + switch(sensor_selection) + if(SENSORS_OFF) + to_chat(user, "You disable your suit's remote sensing equipment.") + if(SENSORS_BINARY) + to_chat(user, "Your suit will now only report whether you are alive or dead.") + if(SENSORS_VITALS) + to_chat(user, "Your suit will now only report your exact vital lifesigns.") + if(SENSORS_TRACKING) + to_chat(user, "Your suit will now report your exact vital lifesigns as well as your coordinate position.") + sensor_mode = sensor_selection + else if(istype(src.loc, /mob)) + var/mob/living/carbon/human/wearer = src.loc + wearer.visible_message("[user] tries to set [wearer]'s sensors.", \ + "[user] is trying to set your sensors.", null, COMBAT_MESSAGE_RANGE) + if(do_mob(user, wearer, SENSOR_CHANGE_DELAY)) + switch(sensor_selection) + if(SENSORS_OFF) + wearer.visible_message("[user] disables [wearer]'s remote sensing equipment.", \ + "[user] disables your remote sensing equipment.", null, COMBAT_MESSAGE_RANGE) + if(SENSORS_BINARY) + wearer.visible_message("[user] turns [wearer]'s remote sensors to binary.", \ + "[user] turns your remote sensors to binary.", null, COMBAT_MESSAGE_RANGE) + if(SENSORS_VITALS) + wearer.visible_message("[user] turns [wearer]'s remote sensors to track vitals.", \ + "[user] turns your remote sensors to track vitals.", null, COMBAT_MESSAGE_RANGE) + if(SENSORS_TRACKING) + wearer.visible_message("[user] turns [wearer]'s remote sensors to maximum.", \ + "[user] turns your remote sensors to maximum.", null, COMBAT_MESSAGE_RANGE) + sensor_mode = sensor_selection + log_combat(user, wearer, "changed sensors to [switchMode]") if(ishuman(loc)) var/mob/living/carbon/human/H = loc if(H.w_uniform == src) H.update_suit_sensors() +/obj/item/clothing/under/verb/toggle() + set name = "Adjust Suit Sensors" + set category = "Object" + set src in usr + set_sensors(usr) + /obj/item/clothing/under/attack_hand(mob/user) if(attached_accessory && ispath(attached_accessory.pocket_storage_component_path) && loc == user) attached_accessory.attack_hand(user) @@ -232,9 +349,6 @@ BLIND // can't see anything ..() /obj/item/clothing/under/AltClick(mob/user) - if(..()) - return 1 - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return else @@ -334,3 +448,19 @@ BLIND // can't see anything deconstruct(FALSE) else ..() + +/obj/item/clothing/get_armor_rating(d_type, mob/wearer) + . = ..() + if(high_pressure_multiplier == 1) + return + var/turf/T = get_turf(wearer) + if(!T || !(d_type in high_pressure_multiplier_types)) + return + if(!lavaland_equipment_pressure_check(T)) + . *= high_pressure_multiplier + +#undef SENSORS_OFF +#undef SENSORS_BINARY +#undef SENSORS_VITALS +#undef SENSORS_TRACKING +#undef SENSOR_CHANGE_DELAY diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 265beab81dcd8..87eb92d5cf752 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -89,21 +89,36 @@ hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP +/obj/item/clothing/glasses/meson/prescription + name = "prescription meson scanner" + desc = "A crude combination between a pair of prescription glasses and the electronics of a meson scanner." + icon_state = "prescmeson" + item_state = "glasses" + vision_correction = 1 + /obj/item/clothing/glasses/science name = "science goggles" desc = "A pair of snazzy goggles used to protect against chemical spills. Fitted with an analyzer for scanning items and reagents." icon_state = "purple" item_state = "glasses" - scan_reagents = TRUE //You can see reagents while wearing science goggles + clothing_flags = SCAN_REAGENTS actions_types = list(/datum/action/item_action/toggle_research_scanner) glass_colour_type = /datum/client_colour/glass_colour/purple resistance_flags = ACID_PROOF - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100, "stamina" = 0) /obj/item/clothing/glasses/science/item_action_slot_check(slot) - if(slot == SLOT_GLASSES) + if(slot == ITEM_SLOT_EYES) return 1 +/obj/item/clothing/glasses/science/prescription + name = "prescription science goggles" + desc = "A crude combination between a pair of prescription glasses and the electronics of science goggles." + icon_state = "prescscihud" + resistance_flags = NONE + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 40, "stamina" = 0) + vision_correction = 1 + /obj/item/clothing/glasses/science/sciencesun name = "science sunglasses" desc = "A pair of sunglasses outfitted with apparatus to scan reagents, as well as providing an innate understanding of liquid viscosity while in motion. Has enhanced shielding which blocks flashes." @@ -111,6 +126,11 @@ item_state = "sunhudscience" flash_protect = 1 +/obj/item/clothing/glasses/science/sciencesun/degraded + name = "degraded science sunglasses" + desc = "A pair of sunglasses outfitted with apparatus to scan reagents, as well as providing an innate understanding of liquid viscosity while in motion." + flash_protect = 0 + /obj/item/clothing/glasses/night name = "night vision goggles" desc = "You can totally see in the dark now!" @@ -209,11 +229,11 @@ /obj/item/clothing/glasses/sunglasses/advanced/reagent name = "beer goggles" desc = "A pair of sunglasses outfitted with apparatus to scan reagents, as well as providing an innate understanding of liquid viscosity while in motion. Has enhanced shielding which blocks flashes." - scan_reagents = TRUE + clothing_flags = SCAN_REAGENTS /obj/item/clothing/glasses/sunglasses/advanced/reagent/equipped(mob/user, slot) . = ..() - if(ishuman(user) && slot == SLOT_GLASSES) + if(ishuman(user) && slot == ITEM_SLOT_EYES) ADD_TRAIT(user, TRAIT_BOOZE_SLIDER, CLOTHING_TRAIT) /obj/item/clothing/glasses/sunglasses/advanced/reagent/dropped(mob/user) @@ -283,12 +303,19 @@ desc = "A bulky pair of unwieldy glasses that lets you see things best left unseen. Obscures vision, but also has enhanced shielding which blocks flashes." icon_state = "bustin-g" item_state = "bustin-g" - invis_view = SEE_INVISIBLE_OBSERVER - invis_override = null flash_protect = 1 - visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT | VISOR_INVISVIEW + visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT glass_colour_type = /datum/client_colour/glass_colour/green +/obj/item/clothing/glasses/welding/ghostbuster/ComponentInitialize() + . = ..() + AddComponent(/datum/component/team_monitor, "ghost", 1) + +/obj/item/clothing/glasses/welding/ghostbuster/visor_toggling() + ..() + var/datum/component/team_monitor/ghost_vision = GetComponent(/datum/component/team_monitor) + ghost_vision.toggle_hud(!ghost_vision.hud_visible, usr) + /obj/item/clothing/glasses/blindfold name = "blindfold" desc = "Covers the eyes, preventing sight." @@ -299,15 +326,6 @@ darkness_view = 1 dog_fashion = /datum/dog_fashion/head -/obj/item/clothing/glasses/blindfold/equipped(mob/living/carbon/human/user, slot) - . = ..() - if(slot == SLOT_GLASSES) - user.become_blind("blindfold_[REF(src)]") - -/obj/item/clothing/glasses/blindfold/dropped(mob/living/carbon/human/user) - ..() - user.cure_blind("blindfold_[REF(src)]") - /obj/item/clothing/glasses/blindfold/white name = "blind personnel blindfold" desc = "Indicates that the wearer suffers from blindness." @@ -316,7 +334,7 @@ var/colored_before = FALSE /obj/item/clothing/glasses/blindfold/white/equipped(mob/living/carbon/human/user, slot) - if(ishuman(user) && slot == SLOT_GLASSES) + if(ishuman(user) && slot == ITEM_SLOT_EYES) update_icon(user) user.update_inv_glasses() //Color might have been changed by update_icon. ..() @@ -336,7 +354,6 @@ . += M /obj/item/clothing/glasses/sunglasses/advanced/big - desc = "Strangely ancient technology used to help provide rudimentary eye cover. Has enhanced shielding which blocks flashes." icon_state = "bigsunglasses" item_state = "bigsunglasses" @@ -347,7 +364,6 @@ item_state = "glasses" vision_flags = SEE_MOBS lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - flash_protect = 0 glass_colour_type = /datum/client_colour/glass_colour/red /obj/item/clothing/glasses/thermal/emp_act(severity) @@ -360,7 +376,7 @@ name = "syndicate xray goggles" desc = "A pair of xray goggles manufactured by the Syndicate." vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS - flash_protect = -1 + tint = -INFINITY /obj/item/clothing/glasses/thermal/syndi //These are now a traitor item, concealed as mesons. -Pete name = "chameleon thermals" @@ -436,7 +452,7 @@ item_state = "godeye" vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS darkness_view = 8 - scan_reagents = TRUE + clothing_flags = SCAN_REAGENTS lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE resistance_flags = LAVA_PROOF | FIRE_PROOF @@ -470,8 +486,6 @@ else to_chat(H, "You will no longer see glasses colors.") H.update_glasses_color(src, 1) - else - return ..() /obj/item/clothing/glasses/proc/change_glass_color(mob/living/carbon/human/H, datum/client_colour/glass_colour/new_color_type) var/old_colour_type = glass_colour_type diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index d5ce968aeb72e..43db0e725b969 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -90,7 +90,7 @@ var/strength = round(rad_places[i] / 1000, 0.1) var/image/pic = image(loc = place) var/mutable_appearance/MA = new() - MA.maptext = "[strength]k" + MA.maptext = MAPTEXT("[strength]k") MA.color = "#04e66d" MA.layer = RAD_TEXT_LAYER MA.plane = GAME_PLANE @@ -123,7 +123,7 @@ item_state = icon_state if(isliving(loc)) var/mob/living/user = loc - if(user.get_item_by_slot(SLOT_GLASSES) == src) + if(user.get_item_by_slot(ITEM_SLOT_EYES) == src) user.update_inv_glasses() else user.update_inv_hands() diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 4d37ba4cb7b03..f6e5194aacc84 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -2,28 +2,46 @@ name = "HUD" desc = "A heads-up display that provides important info in (almost) real time." flags_1 = null //doesn't protect eyes because it's a monocle, duh - var/hud_type = null - var/alt_hud_type = null + var/hud_trait = null //Used for topic calls. Just because you have a HUD display doesn't mean you should be able to interact with stuff. If something uses multiple traits, make it a list. + var/hud_type = null //If something uses multiple huds, make it a list. /obj/item/clothing/glasses/hud/equipped(mob/living/carbon/human/user, slot) ..() - if(hud_type && slot == SLOT_GLASSES) - var/datum/atom_hud/H = GLOB.huds[hud_type] - H.add_hud_to(user) - if(alt_hud_type && slot == SLOT_GLASSES) - var/datum/atom_hud/H = GLOB.huds[alt_hud_type] - H.add_hud_to(user) + if(slot != ITEM_SLOT_EYES) + return + if(hud_type) + if(islist(hud_type)) + for(var/T in hud_type) + var/datum/atom_hud/H = GLOB.huds[T] + H.add_hud_to(user) + else + var/datum/atom_hud/H = GLOB.huds[hud_type] + H.add_hud_to(user) + if(hud_trait) + if(islist(hud_trait)) + for(var/H in hud_trait) + ADD_TRAIT(user, H, GLASSES_TRAIT) + else + ADD_TRAIT(user, hud_trait, GLASSES_TRAIT) /obj/item/clothing/glasses/hud/dropped(mob/living/carbon/human/user) ..() - if(hud_type && istype(user) && user.glasses == src) - var/datum/atom_hud/H = GLOB.huds[hud_type] - H.remove_hud_from(user) - - if(alt_hud_type && istype(user) && user.glasses == src) - var/datum/atom_hud/H = GLOB.huds[alt_hud_type] - H.remove_hud_from(user) - + if(!istype(user) || user.glasses != src) + return + if(hud_type) + if(islist(hud_type)) + for(var/T in hud_type) + var/datum/atom_hud/H = GLOB.huds[T] + H.remove_hud_from(user) + else + var/datum/atom_hud/H = GLOB.huds[hud_type] + H.remove_hud_from(user) + if(hud_trait) + if(islist(hud_trait)) + for(var/H in hud_trait) + REMOVE_TRAIT(user, H, GLASSES_TRAIT) + else + REMOVE_TRAIT(user, hud_trait, GLASSES_TRAIT) /obj/item/clothing/glasses/hud/emp_act(severity) . = ..() @@ -44,6 +62,7 @@ desc = "A heads-up display that scans the humans in view and provides accurate data about their health status." icon_state = "healthhud" hud_type = DATA_HUD_MEDICAL_ADVANCED + hud_trait = TRAIT_MEDICAL_HUD glass_colour_type = /datum/client_colour/glass_colour/lightblue /obj/item/clothing/glasses/hud/health/night @@ -64,6 +83,17 @@ tint = 1 glass_colour_type = /datum/client_colour/glass_colour/blue +/obj/item/clothing/glasses/hud/health/prescription + name = "prescription medical HUDglasses" + desc = "Prescription glasses with a built-in medical HUD." + icon_state = "prescmedhud" + vision_correction = 1 + +/obj/item/clothing/glasses/hud/health/sunglasses/degraded + name = "degraded medical HUDSunglasses" + desc = "Sunglasses with a medical HUD. They do not provide flash protection." + flash_protect = 0 + /obj/item/clothing/glasses/hud/diagnostic name = "diagnostic HUD" desc = "A heads-up display capable of analyzing the integrity and status of robotics and exosuits." @@ -88,11 +118,23 @@ flash_protect = 1 tint = 1 +/obj/item/clothing/glasses/hud/diagnostic/sunglasses/degraded + name = "degraded diagnostic sunglasses" + desc = "Sunglasses with a diagnostic HUD. They do not provide flash protection." + flash_protect = 0 + +/obj/item/clothing/glasses/hud/diagnostic/prescription + name = "prescription diagnostic HUDglasses" + desc = "Prescription glasses with a built-in diagnostic HUD." + icon_state = "prescdiaghud" + vision_correction = 1 + /obj/item/clothing/glasses/hud/security name = "security HUD" desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status and security records." icon_state = "securityhud" hud_type = DATA_HUD_SECURITY_ADVANCED + hud_trait = TRAIT_SECURITY_HUD glass_colour_type = /datum/client_colour/glass_colour/red /obj/item/clothing/glasses/hud/security/deputy @@ -103,8 +145,9 @@ name = "medsec HUD" desc = "A combination HUD, providing the user the use of a Medical and Security HUD." icon_state = "medsechud" - hud_type = DATA_HUD_SECURITY_ADVANCED - alt_hud_type = DATA_HUD_MEDICAL_ADVANCED + hud_type = list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED) + hud_trait = list(TRAIT_SECURITY_HUD, TRAIT_MEDICAL_HUD) + glass_colour_type = /datum/client_colour/glass_colour/red /obj/item/clothing/glasses/hud/security/chameleon @@ -145,6 +188,11 @@ tint = 1 glass_colour_type = /datum/client_colour/glass_colour/darkred +/obj/item/clothing/glasses/hud/security/sunglasses/degraded + name = "degraded security HUDSunglasses" + desc = "Sunglasses with a security HUD. They do not provide flash protection." + flash_protect = 0 + /obj/item/clothing/glasses/hud/security/night name = "night vision security HUD" desc = "An advanced heads-up display which provides id data and vision in complete darkness." @@ -153,6 +201,12 @@ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE glass_colour_type = /datum/client_colour/glass_colour/green +/obj/item/clothing/glasses/hud/security/prescription + name = "prescription security HUDglasses" + desc = "Prescription glasses with a built-in security HUD. They do not provide flash protection." + icon_state = "prescsechud" + vision_correction = 1 + /obj/item/clothing/glasses/hud/security/sunglasses/gars name = "\improper HUD gar glasses" desc = "GAR glasses with a HUD." @@ -235,3 +289,30 @@ if(. & EMP_PROTECT_SELF) return thermal_overload() + +/obj/item/clothing/glasses/hud/debug + name = "Omni HUD" + desc = "Glasses with every function." + icon_state = "doublegodeye" + item_state = "doublegodeye" + vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS + darkness_view = 8 + flash_protect = 2 + vision_correction = 1 + clothing_flags = SCAN_REAGENTS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + hud_type = list(DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC_ADVANCED, DATA_HUD_SECURITY_ADVANCED) + resistance_flags = INDESTRUCTIBLE + actions_types = list(/datum/action/item_action/toggle,/datum/action/item_action/toggle_research_scanner) + var/xray = TRUE + +/obj/item/clothing/glasses/hud/debug/attack_self(mob/user) + if(!ishuman(user)) + return + if(xray) + vision_flags -= SEE_MOBS|SEE_OBJS + else + vision_flags += SEE_MOBS|SEE_OBJS + xray = !xray + var/mob/living/carbon/human/wearer = user + wearer.update_sight() diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 9b381cef7f8c9..06433a5d6a253 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -10,12 +10,16 @@ var/transfer_prints = FALSE strip_delay = 20 equip_delay_other = 40 + // Path variable. If defined, will produced the type through interaction with wirecutters. + var/cut_type = null /obj/item/clothing/gloves/ComponentInitialize() . = ..() RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_blood) /obj/item/clothing/gloves/proc/clean_blood(datum/source, strength) + SIGNAL_HANDLER + if(strength < CLEAN_STRENGTH_BLOOD) return transfer_blood = 0 @@ -40,4 +44,14 @@ // Called just before an attack_hand(), in mob/UnarmedAttack() /obj/item/clothing/gloves/proc/Touch(atom/A, proximity) - return 0 // return 1 to cancel attack_hand() + return FALSE // return 1 to cancel attack_hand() + +/obj/item/clothing/gloves/wirecutter_act(mob/living/user, obj/item/I) + . = ..() + if(!cut_type) + return + if(icon_state != initial(icon_state)) + return // We don't want to cut dyed gloves. + new cut_type(drop_location()) + qdel(src) + return TRUE diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm index a76ff7c5834dd..173df5a1c0c59 100644 --- a/code/modules/clothing/gloves/boxing.dm +++ b/code/modules/clothing/gloves/boxing.dm @@ -17,3 +17,14 @@ /obj/item/clothing/gloves/boxing/yellow icon_state = "boxingyellow" item_state = "boxingyellow" + +/obj/item/clothing/gloves/boxing/yellow/insulated + name = "budget boxing gloves" + desc = "Standard boxing gloves coated in a makeshift insulating coat. This can't possibly go wrong at all." + icon_state = "boxingyellow" + item_state = "boxingyellow" + siemens_coefficient = 1 //Set to a default of 1, gets overridden in Initialize() + +/obj/item/clothing/gloves/boxing/yellow/insulated/Initialize() + . = ..() + siemens_coefficient = pick(0,0,0,0,0.25,2) diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 54abcdadf3436..7e1ed7b7336e1 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -1,5 +1,5 @@ /obj/item/clothing/gloves/color/yellow - desc = "These gloves will protect the wearer from electric shock." + desc = "These gloves provide protection against electric shock." name = "insulated gloves" icon_state = "yellow" item_state = "ygloves" @@ -7,6 +7,39 @@ permeability_coefficient = 0.05 item_color="yellow" resistance_flags = NONE + cut_type = /obj/item/clothing/gloves/cut + +/obj/item/clothing/gloves/color/black/equipped(mob/user, slot) + . = ..() + if((slot == ITEM_SLOT_GLOVES) && (user.mind?.assigned_role in GLOB.security_positions)) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "sec_black_gloves", /datum/mood_event/sec_black_gloves) + +/obj/item/clothing/gloves/color/black/dropped(mob/user) + . = ..() + if(user.mind?.assigned_role in GLOB.security_positions) + SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "sec_black_gloves") + +/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/yellow/equipped(mob/user, slot) + . = ..() + if(slot == ITEM_SLOT_GLOVES) + if(user.mind?.assigned_role == "Assistant") + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "assistant_insulated_gloves", /datum/mood_event/assistant_insulated_gloves) + if(user.mind?.assigned_role in GLOB.security_positions) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "sec_insulated_gloves", /datum/mood_event/sec_insulated_gloves) + +/obj/item/clothing/gloves/color/yellow/dropped(mob/user) + . = ..() + if(user.mind?.assigned_role == "Assistant") + SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "assistant_insulated_gloves") + if(user.mind?.assigned_role in GLOB.security_positions) + SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "sec_insulated_gloves") + /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." @@ -17,6 +50,7 @@ permeability_coefficient = 0.05 item_color = "yellow" resistance_flags = NONE + cut_type = /obj/item/clothing/gloves/cut /obj/item/clothing/gloves/color/fyellow/Initialize() . = ..() @@ -30,7 +64,7 @@ . += "[src] will fully protect from electric shocks." if(siemens_coefficient > 1) . += "[src] will only make shocks worse." - else + else . += "[src] will provide [protectionpercentage] percent protection from electric shocks." /obj/item/clothing/gloves/color/fyellow/old @@ -41,6 +75,16 @@ . = ..() siemens_coefficient = pick(0,0,0,0.5,0.5,0.5,0.75) +/obj/item/clothing/gloves/cut + desc = "These gloves would protect the wearer from electric shock... if the fingers were covered." + name = "fingerless insulated gloves" + icon_state = "yellowcut" + item_state = "ygloves" + transfer_prints = TRUE + +/obj/item/clothing/gloves/cut/heirloom + desc = "The old gloves your great grandfather stole from Engineering, many moons ago. They've seen some tough times recently." + /obj/item/clothing/gloves/color/black desc = "These gloves are fire-resistant." name = "black gloves" @@ -52,22 +96,7 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - var/can_be_cut = 1 - -/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(I.tool_behaviour == TOOL_WIRECUTTER) - if(can_be_cut && icon_state == initial(icon_state))//only if not dyed - to_chat(user, "You snip the fingertips off of [src].") - I.play_tool_sound(src) - new /obj/item/clothing/gloves/fingerless(drop_location()) - qdel(src) - ..() + cut_type = /obj/item/clothing/gloves/fingerless /obj/item/clothing/gloves/color/orange name = "orange gloves" @@ -86,7 +115,7 @@ /obj/item/clothing/gloves/color/red/insulated name = "insulated gloves" - desc = "These gloves will protect the wearer from electric shock." + desc = "These gloves provide protection against electric shock." siemens_coefficient = 0 permeability_coefficient = 0.05 resistance_flags = NONE @@ -165,26 +194,42 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT strip_delay = 60 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 50, "stamina" = 0) /obj/item/clothing/gloves/color/latex name = "latex gloves" - desc = "Cheap sterile gloves made from latex." + desc = "Cheap sterile gloves made from latex. Transfers minor paramedic knowledge to the user via budget nanochips." icon_state = "latex" - item_state = "lgloves" + item_state = "latex" siemens_coefficient = 0.3 permeability_coefficient = 0.01 item_color="mime" transfer_prints = TRUE resistance_flags = NONE + var/carrytrait = TRAIT_QUICK_CARRY + +/obj/item/clothing/gloves/color/latex/equipped(mob/user, slot) + ..() + if(slot == ITEM_SLOT_GLOVES) + ADD_TRAIT(user, carrytrait, CLOTHING_TRAIT) + +/obj/item/clothing/gloves/color/latex/dropped(mob/user) + ..() + REMOVE_TRAIT(user, carrytrait, CLOTHING_TRAIT) + +/obj/item/clothing/gloves/color/latex/obj_break() + ..() + if(ishuman(loc)) + REMOVE_TRAIT(loc, carrytrait, CLOTHING_TRAIT) /obj/item/clothing/gloves/color/latex/nitrile name = "nitrile gloves" - desc = "Pricy sterile gloves that are stronger than latex." + desc = "Pricy sterile gloves that are stronger than latex. Transfers intimate paramedic knowledge into the user via nanochips." icon_state = "nitrile" item_state = "nitrilegloves" item_color = "cmo" transfer_prints = FALSE + carrytrait = TRAIT_QUICKER_CARRY /obj/item/clothing/gloves/color/white name = "white gloves" diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 191ec72da7eeb..622e18e693ef1 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -23,7 +23,7 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 30, "stamina" = 0) /obj/item/clothing/gloves/combat name = "combat gloves" @@ -38,7 +38,7 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50, "stamina" = 20) /obj/item/clothing/gloves/bracer name = "bone bracers" @@ -54,7 +54,7 @@ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - armor = list("melee" = 15, "bullet" = 35, "laser" = 35, "energy" = 20, "bomb" = 35, "bio" = 35, "rad" = 35, "fire" = 0, "acid" = 0) + armor = list("melee" = 15, "bullet" = 35, "laser" = 35, "energy" = 20, "bomb" = 35, "bio" = 35, "rad" = 35, "fire" = 0, "acid" = 0, "stamina" = 20) /obj/item/clothing/gloves/rapid name = "Gloves of the North Star" @@ -66,12 +66,12 @@ /obj/item/clothing/gloves/rapid/Touch(atom/A, proximity) var/mob/living/M = loc - if(A in range(1, M)) + if(get_dist(A, M) <= 1) if(isliving(A) && M.a_intent == INTENT_HARM) M.changeNext_move(CLICK_CD_RAPID) if(warcry) M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry") - + else if(M.a_intent == INTENT_HARM) for(var/mob/living/L in oview(1, M)) L.attack_hand(M) @@ -110,9 +110,9 @@ /obj/item/clothing/gloves/color/white/magic/Touch(atom/A, proximity) var/mob/living/M = loc - if(A in range(1, M)) + if(get_dist(A, M) <= 1) return 0 - if(A in oview(range, M)) + if(M in viewers(range, A)) M.visible_message("[M] waves their hands at [A]", "You begin manipulating [A].") new /obj/effect/temp_visual/telegloves(A.loc) M.changeNext_move(CLICK_CD_MELEE) @@ -121,5 +121,4 @@ playsound(M, 'sound/weapons/emitter2.ogg', 25, 1, -1) A.attack_hand(M) return 1 - - \ No newline at end of file + diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 20bd127e0e7a0..afe18245a9dd4 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -29,7 +29,7 @@ return if(iscarbon(hit_atom)) var/mob/living/carbon/H = hit_atom - if(istype(H.head, /obj/item/clothing)) + if(isclothing(H.head)) var/obj/item/clothing/WH = H.head ///check if the item has NODROP if(HAS_TRAIT(WH, TRAIT_NODROP)) @@ -45,7 +45,7 @@ ///if the hat manages to knock something off if(H.dropItemToGround(WH)) H.visible_message("[src] knocks [WH] off [H]'s head!", "[WH] is suddenly knocked off your head by [src]!") - if(H.equip_to_slot_if_possible(src, SLOT_HEAD, 0, 1, 1)) + if(H.equip_to_slot_if_possible(src, ITEM_SLOT_HEAD, 0, 1, 1)) H.visible_message("[src] lands neatly on [H]'s head!", "[src] lands perfectly onto your head!") return if(iscyborg(hit_atom)) diff --git a/code/modules/clothing/head/beanie.dm b/code/modules/clothing/head/beanie.dm index 285c1b24770fe..f9df34ddeef9c 100644 --- a/code/modules/clothing/head/beanie.dm +++ b/code/modules/clothing/head/beanie.dm @@ -9,6 +9,7 @@ icon_state = "beanie" //Default white item_color = "beanie" custom_price = 10 + w_class = WEIGHT_CLASS_SMALL /obj/item/clothing/head/beanie/black name = "black beanie" @@ -82,18 +83,18 @@ desc = "A beanie made from durathread, its resilient fibres provide some protection to the wearer." icon_state = "beaniedurathread" item_color = null - armor = list("melee" = 15, "bullet" = 5, "laser" = 15, "energy" = 5, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 5) + armor = list("melee" = 15, "bullet" = 5, "laser" = 15, "energy" = 5, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 5, "stamina" = 20) /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_color = "waldo_hat" - + /obj/item/clothing/head/beanie/rasta name = "rastacap" desc = "Perfect for tucking in those dreadlocks." icon_state = "beanierasta" - item_color = "beanierasta" + item_color = "beanierasta" //No dog fashion sprites yet :( poor Ian can't be dope like the rest of us yet diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 9a9416d3840e5..f78785227bc8f 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -6,7 +6,7 @@ var/brightness_on = 4 //luminosity when on var/on = FALSE item_color = "yellow" //Determines used sprites: hardhat[on]_[item_color] and hardhat[on]_[item_color]2 (lying down sprite) - armor = list("melee" = 15, "bullet" = 5, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 10, "rad" = 20, "fire" = 100, "acid" = 50) + armor = list("melee" = 15, "bullet" = 5, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 10, "rad" = 20, "fire" = 100, "acid" = 50, "stamina" = 20) flags_inv = 0 actions_types = list(/datum/action/item_action/toggle_helmet_light) resistance_flags = FIRE_PROOF @@ -92,7 +92,7 @@ cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT -/obj/item/clothing/head/hardhat/weldhat +/obj/item/clothing/head/hardhat/weldhat name = "welding hard hat" desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight AND welding shield! The bulb seems a little smaller though." brightness_on = 3 //Needs a little bit of tradeoff @@ -104,7 +104,7 @@ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT visor_flags_inv = HIDEEYES | HIDEFACE - visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH /obj/item/clothing/head/hardhat/weldhat/Initialize() . = ..() @@ -132,7 +132,7 @@ /obj/item/clothing/head/hardhat/weldhat/update_icon() cut_overlays() if(!up) - add_overlay("weldvisor") + add_overlay("weldvisor") ..() /obj/item/clothing/head/hardhat/weldhat/orange @@ -140,7 +140,7 @@ item_state = "hardhat0_orange" item_color = "orange" -/obj/item/clothing/head/hardhat/weldhat/white +/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" @@ -155,4 +155,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 + item_color = "dblue" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 2e7ba05efb5b4..c333ef43015fb 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -3,7 +3,7 @@ desc = "Standard Security gear. Protects the head from impacts." icon_state = "helmet" item_state = "helmet" - armor = list("melee" = 35, "bullet" = 30, "laser" = 30,"energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 35, "bullet" = 30, "laser" = 30,"energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 30) flags_inv = HIDEEARS cold_protection = HEAD min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT @@ -15,7 +15,6 @@ flags_inv = HIDEHAIR bang_protect = 1 clothing_flags = THICKMATERIAL - dog_fashion = /datum/dog_fashion/head/helmet var/can_flashlight = FALSE //if a flashlight can be mounted. if it has a flashlight and this is false, it is permanently attached. @@ -72,7 +71,7 @@ desc = "A bulletproof combat helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent." icon_state = "helmetalt" item_state = "helmetalt" - armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 15, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 15, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 30) can_flashlight = TRUE dog_fashion = null @@ -96,14 +95,14 @@ toggle_message = "You pull the visor down on" alt_toggle_message = "You push the visor up on" can_toggle = 1 - armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "stamina" = 50) flags_inv = HIDEEARS|HIDEFACE strip_delay = 80 actions_types = list(/datum/action/item_action/toggle) visor_flags_inv = HIDEFACE toggle_cooldown = 0 - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF - visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH dog_fashion = null /obj/item/clothing/head/helmet/attack_self(mob/user) @@ -151,7 +150,7 @@ desc = "An extremely robust, space-worthy helmet in a nefarious red and black stripe pattern." icon_state = "swatsyndie" item_state = "swatsyndie" - armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 40, "bomb" = 50, "bio" = 90, "rad" = 20, "fire" = 50, "acid" = 50) + armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 40, "bomb" = 50, "bio" = 90, "rad" = 20, "fire" = 50, "acid" = 50, "stamina" = 50) cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT heat_protection = HEAD @@ -178,7 +177,7 @@ flags_inv = HIDEEARS|HIDEHAIR icon_state = "thunderdome" item_state = "thunderdome" - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 90) + armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 90, "stamina" = 0) cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT heat_protection = HEAD @@ -186,12 +185,17 @@ strip_delay = 80 dog_fashion = null +/obj/item/clothing/head/helmet/thunderdome/holosuit + cold_protection = null + heat_protection = null + armor = list("melee" = 10, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) + /obj/item/clothing/head/helmet/roman name = "\improper Roman helmet" desc = "An ancient helmet made of bronze and leather." flags_inv = HIDEEARS|HIDEHAIR flags_cover = HEADCOVERSEYES - armor = list("melee" = 25, "bullet" = 0, "laser" = 25, "energy" = 30, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list("melee" = 25, "bullet" = 0, "laser" = 25, "energy" = 30, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "stamina" = 40) resistance_flags = FIRE_PROOF icon_state = "roman" item_state = "roman" @@ -200,7 +204,7 @@ /obj/item/clothing/head/helmet/roman/fake desc = "An ancient helmet made of plastic and leather." - 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, "stamina" = 0) /obj/item/clothing/head/helmet/roman/legionnaire name = "\improper Roman legionnaire helmet" @@ -210,7 +214,7 @@ /obj/item/clothing/head/helmet/roman/legionnaire/fake desc = "An ancient helmet made of plastic and leather. Has a red crest on top of it." - 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, "stamina" = 0) /obj/item/clothing/head/helmet/gladiator name = "gladiator helmet" @@ -227,7 +231,7 @@ icon_state = "redtaghelm" flags_cover = HEADCOVERSEYES item_state = "redtaghelm" - armor = list("melee" = 15, "bullet" = 10, "laser" = 20,"energy" = 30, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + armor = list("melee" = 15, "bullet" = 10, "laser" = 20,"energy" = 30, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50, "stamina" = 10) // Offer about the same protection as a hardhat. dog_fashion = null @@ -237,7 +241,7 @@ icon_state = "bluetaghelm" flags_cover = HEADCOVERSEYES item_state = "bluetaghelm" - armor = list("melee" = 15, "bullet" = 10, "laser" = 20,"energy" = 30, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + armor = list("melee" = 15, "bullet" = 10, "laser" = 20,"energy" = 30, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50, "stamina" = 10) // Offer about the same protection as a hardhat. dog_fashion = null @@ -246,7 +250,7 @@ desc = "A classic metal helmet." icon_state = "knight_green" item_state = "knight_green" - armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "stamina" = 50) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH strip_delay = 80 @@ -270,7 +274,7 @@ desc = "An intimidating tribal helmet, it doesn't look very comfortable." flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE flags_cover = HEADCOVERSEYES - armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 20) icon_state = "skull" item_state = "skull" strip_delay = 100 @@ -281,7 +285,7 @@ icon_state = "durathread" item_state = "durathread" resistance_flags = FLAMMABLE - armor = list("melee" = 20, "bullet" = 10, "laser" = 30, "energy" = 5, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 50) + armor = list("melee" = 20, "bullet" = 10, "laser" = 30, "energy" = 5, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 50, "stamina" = 30) strip_delay = 60 /obj/item/clothing/head/helmet/rus_helmet @@ -289,8 +293,8 @@ desc = "It can hold a bottle of vodka." icon_state = "rus_helmet" item_state = "rus_helmet" - armor = list("melee" = 25, "bullet" = 30, "laser" = 0, "energy" = 15, "bomb" = 10, "bio" = 0, "rad" = 20, "fire" = 20, "acid" = 50) - pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/helmet + armor = list("melee" = 25, "bullet" = 30, "laser" = 0, "energy" = 15, "bomb" = 10, "bio" = 0, "rad" = 20, "fire" = 20, "acid" = 50, "stamina" = 20) + pocket_storage_component_path = /datum/component/storage/concrete/pockets/helmet /obj/item/clothing/head/helmet/rus_ushanka name = "battle ushanka" @@ -300,7 +304,7 @@ body_parts_covered = HEAD cold_protection = HEAD min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - armor = list("melee" = 25, "bullet" = 20, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 50) + armor = list("melee" = 25, "bullet" = 20, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 50, "stamina" = 20) //LightToggle diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 61115a76f67c0..dae50d9332f39 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -31,7 +31,7 @@ icon_state = "captain" item_state = "that" flags_inv = 0 - armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 30, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 30, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 30) strip_delay = 60 dog_fashion = /datum/dog_fashion/head/captain @@ -49,7 +49,7 @@ name = "head of personnel's cap" icon_state = "hopcap" desc = "The symbol of true bureaucratic micromanagement." - armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 30, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 30, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 30) dog_fashion = /datum/dog_fashion/head/hop //Chaplain @@ -65,11 +65,14 @@ desc = "An opulent hat that functions as a radio to God. Or as a lightning rod, depending on who you ask." icon_state = "bishopmitre" +/obj/item/clothing/head/bishopmitre/black + icon_state = "blackbishopmitre" + //Detective /obj/item/clothing/head/fedora/det_hat name = "detective's fedora" desc = "There's only one man who can sniff out the dirty stench of crime, and he's likely wearing this hat." - armor = list("melee" = 25, "bullet" = 5, "laser" = 25, "energy" = 30, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 50) + armor = list("melee" = 25, "bullet" = 5, "laser" = 25, "energy" = 30, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 50, "stamina" = 25) icon_state = "detective" var/candy_cooldown = 0 pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/detective @@ -84,16 +87,14 @@ . += "Alt-click to take a candy corn." /obj/item/clothing/head/fedora/det_hat/AltClick(mob/user) - if(user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - ..() - if(loc == user) - if(candy_cooldown < world.time) - var/obj/item/reagent_containers/food/snacks/candy_corn/CC = new /obj/item/reagent_containers/food/snacks/candy_corn(src) - user.put_in_hands(CC) - to_chat(user, "You slip a candy corn from your hat.") - candy_cooldown = world.time+1200 - else - to_chat(user, "You just took a candy corn! You should wait a couple minutes, lest you burn through your stash.") + if(user.canUseTopic(src, BE_CLOSE, ismonkey(user)) && loc == user) + if(candy_cooldown < world.time) + var/obj/item/reagent_containers/food/snacks/candy_corn/CC = new /obj/item/reagent_containers/food/snacks/candy_corn(src) + user.put_in_hands(CC) + to_chat(user, "You slip a candy corn from your hat.") + candy_cooldown = world.time+1200 + else + to_chat(user, "You just took a candy corn! You should wait a couple minutes, lest you burn through your stash.") //Mime @@ -104,6 +105,7 @@ dog_fashion = /datum/dog_fashion/head/beret dynamic_hair_suffix = "+generic" dynamic_fhair_suffix = "+generic" + w_class = WEIGHT_CLASS_SMALL /obj/item/clothing/head/beret/vintage name = "vintage beret" @@ -111,9 +113,14 @@ icon_state = "vintageberet" dog_fashion = null +/obj/item/clothing/head/beret/navy + name = "navy beret" + icon_state = "beret_blue" + dog_fashion = null + /obj/item/clothing/head/beret/archaic name = "archaic beret" - desc = "An absolutely ancient beret, allegedly worn by the first mime to ever step foot on a NanoTrasen station." + desc = "An absolutely ancient beret, allegedly worn by the first mime to ever step foot on a Nanotrasen station." icon_state = "archaicberet" dog_fashion = null @@ -135,7 +142,7 @@ desc = "A beret made from durathread, its resilient fibres provide some protection to the wearer." icon_state = "beretdurathread" item_color = null - armor = list("melee" = 15, "bullet" = 5, "laser" = 15, "energy" = 20, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 5) + armor = list("melee" = 15, "bullet" = 5, "laser" = 15, "energy" = 20, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 5, "stamina" = 20) //Security @@ -143,7 +150,7 @@ name = "head of security cap" desc = "The robust standard-issue cap of the Head of Security. For showing the officers who's in charge." icon_state = "hoscap" - armor = list("melee" = 40, "bullet" = 30, "laser" = 25, "energy" = 30, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 60) + armor = list("melee" = 40, "bullet" = 30, "laser" = 25, "energy" = 30, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 60, "stamina" = 30) strip_delay = 80 dynamic_hair_suffix = "" @@ -164,7 +171,7 @@ name = "warden's police hat" desc = "It's a special armored hat issued to the Warden of a security force. Protects the head from impacts." icon_state = "policehelm" - armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 60) + armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 60, "stamina" = 30) strip_delay = 60 dog_fashion = /datum/dog_fashion/head/warden @@ -201,7 +208,7 @@ /obj/item/clothing/head/warden/drill/equipped(mob/M, slot) . = ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else UnregisterSignal(M, COMSIG_MOB_SAY) @@ -211,6 +218,8 @@ UnregisterSignal(M, COMSIG_MOB_SAY) /obj/item/clothing/head/warden/drill/proc/handle_speech(datum/source, mob/speech_args) + SIGNAL_HANDLER + var/message = speech_args[SPEECH_MESSAGE] if(message[1] != "*") switch (mode) @@ -239,14 +248,14 @@ name = "corporate warden beret" desc = "A special black beret with the Warden's insignia in the middle. This one is commonly worn by wardens of the corporation." icon_state = "beret_corporate_warden" - armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 25, bio = 0, rad = 0, fire = 30, acid = 60) + armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 60, "stamina" = 30) strip_delay = 60 /obj/item/clothing/head/beret/sec name = "security beret" desc = "A robust beret with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection." icon_state = "beret_badge" - armor = list("melee" = 35, "bullet" = 30, "laser" = 30,"energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 35, "bullet" = 30, "laser" = 30,"energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 30) strip_delay = 60 dog_fashion = null @@ -254,7 +263,7 @@ name = "corporate security beret" desc = "A special black beret for the mundane life of a corporate security officer." icon_state = "beret_corporate_officer" - armor = list(melee = 40, bullet = 30, laser = 30,energy = 30, bomb = 25, bio = 0, rad = 0, fire = 20, acid = 50) + armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 50, "stamina" = 30) strip_delay = 60 /obj/item/clothing/head/beret/sec/navyhos @@ -266,7 +275,7 @@ name = "warden's beret" desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class." icon_state = "wardenberet" - armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 50) + armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 50, "stamina" = 30) strip_delay = 60 /obj/item/clothing/head/beret/sec/navyofficer @@ -283,35 +292,35 @@ name = "engineering beret" desc = "A beret with the engineering insignia emblazoned on it. For engineers that are more inclined towards style than safety." icon_state = "beret_engineering" - armor = list(rad = 10, fire = 10) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 10, "acid" = 0, "stamina" = 0) strip_delay = 60 /obj/item/clothing/head/beret/atmos name = "atmospherics beret" desc = "A beret for those who have shown immaculate proficienty in piping. Or plumbing." icon_state = "beret_atmospherics" - armor = list(rad = 10, fire = 10) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 10, "acid" = 0, "stamina" = 0) strip_delay = 60 /obj/item/clothing/head/beret/ce name = "chief engineer beret" desc = "A white beret with the engineering insignia emblazoned on it. Its owner knows what they're doing. Probably." icon_state = "beret_ce" - armor = list(rad = 20, fire = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 0, "stamina" = 0) strip_delay = 60 /obj/item/clothing/head/beret/sci name = "science beret" desc = "A purple beret with the science insignia emblazoned on it. It has that authentic burning plasma smell." icon_state = "beret_sci" - armor = list(bomb = 5, bio = 5, fire = 5, acid = 10) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 5, "rad" = 0, "fire" = 5, "acid" = 10, "stamina" = 0) strip_delay = 60 /obj/item/clothing/head/beret/supply name = "supply beret" desc = "A brown beret with the supply insignia emblazoned on it. You can't help but wonder how much it'd sell for." icon_state = "beret_supply" - armor = list(rad = 10, fire = 10) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 10, "acid" = 0, "stamina" = 0) strip_delay = 60 //Medical @@ -319,58 +328,58 @@ name = "medical beret" desc = "A white beret with a blue cross finely threaded into it. It has that sterile smell about it." icon_state = "beret_med" - armor = list(bio = 20) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 20, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) strip_delay = 60 /obj/item/clothing/head/beret/cmo name = "chief medical officer beret" desc = "A baby blue beret with the insignia of Medistan. It smells very sterile." icon_state = "beret_cmo" - armor = list(bio = 30, acid = 20) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 10, "fire" = 0, "acid" = 20, "stamina" = 0) strip_delay = 60 -//Centcom +//CentCom /obj/item/clothing/head/beret/cccaptain name = "central command captain beret" desc = "A pure white beret with a Captain insignia of Central Command." icon_state = "beret_centcom_captain" - armor = list(melee = 80, bullet = 80, laser = 80, energy = 80, bomb = 80, bio = 80, rad = 80, fire = 80, acid = 80) + armor = list(melee = 80, bullet = 80, laser = 80, energy = 80, bomb = 80, bio = 80, rad = 80, fire = 80, acid = 80, stamina = 80) strip_delay = 120 /obj/item/clothing/head/beret/ccofficer name = "central command officer beret" desc = "A black Central Command Officer beret with matching insignia." icon_state = "beret_centcom_officer" - armor = list(melee = 80, bullet = 80, laser = 80, energy = 80, bomb = 80, bio = 80, rad = 80, fire = 80, acid = 80) + armor = list(melee = 80, bullet = 80, laser = 80, energy = 80, bomb = 80, bio = 80, rad = 80, fire = 80, acid = 80, stamina = 80) strip_delay = 120 /obj/item/clothing/head/beret/ccofficernavy name = "central command naval officer beret" desc = "A Navy beret commonly worn by Central Command Naval Officers." icon_state = "beret_centcom_officer_navy" - armor = list(melee = 80, bullet = 80, laser = 80, energy = 80, bomb = 80, bio = 80, rad = 80, fire = 80, acid = 80) + armor = list(melee = 80, bullet = 80, laser = 80, energy = 80, bomb = 80, bio = 80, rad = 80, fire = 80, acid = 80, stamina = 80) strip_delay = 120 //For blueshields, but those aren't in so I renamed them to centcom guards /obj/item/clothing/head/beret/ccguard name = "officer beret" - desc = "A black Centcom guard's beret." + desc = "A black CentCom guard's beret." icon_state = "beret_centcom_officer" - armor = list(melee = 40, bullet = 20, laser = 10, energy = 10, bomb = 10, bio = 5, rad = 5, fire = 5, acid = 30) + armor = list(melee = 40, bullet = 20, laser = 10, energy = 10, bomb = 10, bio = 5, rad = 5, fire = 5, acid = 30, stamina = 30) strip_delay = 60 /obj/item/clothing/head/beret/ccguardnavy name = "navy officer beret" - desc = "A navy Centcom guard's beret." + desc = "A navy CentCom guard's beret." icon_state = "beret_centcom_officer_navy" - armor = list(melee = 40, bullet = 20, laser = 10, energy = 10, bomb = 10, bio = 5, rad = 5, fire = 5, acid = 30) + armor = list(melee = 40, bullet = 20, laser = 10, energy = 10, bomb = 10, bio = 5, rad = 5, fire = 5, acid = 30, stamina = 30) strip_delay = 60 /obj/item/clothing/head/beret/captain name = "captain beret" desc = "A lovely blue Captain beret with a gold and white insignia." icon_state = "beret_captain" - armor = list(melee = 50, bullet = 30, laser = 20, energy = 30, bomb = 15, bio = 10, rad = 10, fire = 10, acid = 60) + armor = list(melee = 50, bullet = 30, laser = 20, energy = 30, bomb = 15, bio = 10, rad = 10, fire = 10, acid = 60, stamina = 40) strip_delay = 90 #undef DRILL_DEFAULT diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index a18349ae26f31..b0c87f6b1b8f1 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -6,7 +6,7 @@ desc = "It's good to be emperor." item_state = "that" flags_inv = 0 - armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 30) strip_delay = 80 clothing_flags = SNUG_FIT // prevents bypassing the strip delay @@ -46,13 +46,6 @@ icon_state = "plaguedoctor" permeability_coefficient = 0.01 -/obj/item/clothing/head/hasturhood - name = "hastur's hood" - desc = "It's unspeakably stylish." - icon_state = "hasturhood" - flags_inv = HIDEHAIR - flags_cover = HEADCOVERSEYES - /obj/item/clothing/head/nursehat name = "nurse's hat" desc = "It allows quick identification of trained medical personnel." @@ -141,7 +134,7 @@ /obj/item/clothing/head/pirate/equipped(mob/user, slot) if(!ishuman(user)) return - if(slot == SLOT_HEAD) + if(slot == ITEM_SLOT_HEAD) user.grant_language(/datum/language/piratespeak/, TRUE, TRUE, LANGUAGE_HAT) to_chat(user, "You suddenly know how to speak like a pirate!") @@ -149,7 +142,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(SLOT_HEAD) == src) + if(H.get_item_by_slot(ITEM_SLOT_HEAD) == src && !QDELETED(src)) //This can be called as a part of destroy user.remove_language(/datum/language/piratespeak/, TRUE, TRUE, LANGUAGE_HAT) to_chat(user, "You can no longer speak like a pirate.") @@ -264,7 +257,7 @@ 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" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 20) resistance_flags = FIRE_PROOF | ACID_PROOF /obj/item/clothing/head/cone @@ -324,7 +317,7 @@ name = "crown" desc = "A crown fit for a king, a petty king maybe." icon_state = "crown" - armor = list("melee" = 15, "bullet" = 0, "laser" = 0,"energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list("melee" = 15, "bullet" = 0, "laser" = 0,"energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "stamina" = 40) resistance_flags = FIRE_PROOF dynamic_hair_suffix = "" @@ -382,7 +375,7 @@ /obj/item/clothing/head/frenchberet/equipped(mob/M, slot) . = ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else UnregisterSignal(M, COMSIG_MOB_SAY) @@ -392,6 +385,8 @@ UnregisterSignal(M, COMSIG_MOB_SAY) /obj/item/clothing/head/frenchberet/proc/handle_speech(datum/source, mob/speech_args) + SIGNAL_HANDLER + var/message = speech_args[SPEECH_MESSAGE] if(message[1] != "*") message = " [message]" @@ -442,3 +437,73 @@ desc = "A horrifying mix of beanie and softcap in CentCom green. You'd have to be pretty desperate for power over your peers to agree to wear this." icon_state = "intern_hat" item_state = "intern_hat" + +/obj/item/clothing/head/rainbowbunchcrown + name = "rainbow flower crown" + desc = "A flower crown made out of the flowers of the rainbow bunch plant." + dynamic_hair_suffix = "" + attack_verb = list("crowned") + +/obj/item/clothing/head/rainbowbunchcrown/Initialize() + . = ..() + var/crown_type = rand(1,4) + switch(crown_type) + if(1) + desc += " This one has red, yellow and white flowers." + icon_state = "rainbow_bunch_crown_1" + if(2) + desc += " This one has blue, yellow, green and white flowers." + icon_state = "rainbow_bunch_crown_2" + if(3) + desc += " This one has red, blue, purple and pink flowers." + icon_state = "rainbow_bunch_crown_3" + if(4) + desc += " This one has yellow, green and white flowers." + icon_state = "rainbow_bunch_crown_4" + +/obj/item/clothing/head/sunflowercrown + name = "sunflower crown" + desc = "A bright flower crown made out sunflowers that is sure to brighten up anyone's day!" + icon_state = "sunflower_crown" + dynamic_hair_suffix = "" + attack_verb = list("crowned") + +/obj/item/clothing/head/poppycrown + name = "poppy crown" + desc = "A flower crown made out of a string of bright red poppies." + icon_state = "poppy_crown" + dynamic_hair_suffix = "" + attack_verb = list("crowned") + +/obj/item/clothing/head/lilycrown + name = "lily crown" + desc = "A leafy flower crown with a cluster of large white lilies at at the front." + icon_state = "lily_crown" + dynamic_hair_suffix = "" + attack_verb = list("crowned") + +///////////////// +//DONATOR ITEMS// +///////////////// + +/obj/item/clothing/head/gangsterwig + name = "gangstar wig" + desc = "Like father like son." + icon_state = "gangster_wig" + flags_inv = HIDEHAIR + +/obj/item/clothing/head/oldhat + name = "old man hat" + desc = "OH MY GOD." + icon_state = "oldmanhat" + +/obj/item/clothing/head/marine + name = "mariner hat" + desc = "There's nothing quite like the ocean breeze in the morning." + icon_state = "marine" + +/obj/item/clothing/head/chicken_head_retro + name = "chicken head" + desc = "Looks just like a real one." + icon_state = "chicken" + flags_inv = HIDEHAIR diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index c887419c684db..f4e7dc1bb5d06 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -23,11 +23,11 @@ materials = list(/datum/material/iron=1750, /datum/material/glass=400) flash_protect = 2 tint = 2 - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 60) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 60, "stamina" = 5) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE actions_types = list(/datum/action/item_action/toggle) visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE - visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH resistance_flags = FIRE_PROOF /obj/item/clothing/head/welding/attack_self(mob/user) @@ -52,7 +52,7 @@ var/throwforce_on = 12 var/damtype_on = BURN flags_inv = HIDEEARS|HIDEHAIR - 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, "stamina" = 0) brightness_on = 2 //luminosity when on flags_cover = HEADCOVERSEYES heat = 999 @@ -123,7 +123,6 @@ var/earflaps = 1 cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - dog_fashion = /datum/dog_fashion/head/ushanka /obj/item/clothing/head/ushanka/attack_self(mob/user) @@ -149,7 +148,7 @@ item_color = "pumpkin" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR clothing_flags = SNUG_FIT - 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, "stamina" = 10) brightness_on = 2 //luminosity when on flags_cover = HEADCOVERSEYES @@ -167,7 +166,7 @@ dog_fashion = /datum/dog_fashion/head/kitty /obj/item/clothing/head/kitty/equipped(mob/living/carbon/human/user, slot) - if(ishuman(user) && slot == SLOT_HEAD) + if(ishuman(user) && slot == ITEM_SLOT_HEAD) update_icon(user) user.update_inv_head() //Color might have been changed by update_icon. ..() @@ -188,7 +187,7 @@ item_state = "hardhat0_reindeer" item_color = "reindeer" flags_inv = 0 - 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, "stamina" = 0) brightness_on = 1 //luminosity when on dynamic_hair_suffix = "" @@ -207,7 +206,7 @@ /obj/item/clothing/head/cardborg/equipped(mob/living/user, slot) ..() - if(ishuman(user) && slot == SLOT_HEAD) + if(ishuman(user) && slot == ITEM_SLOT_HEAD) var/mob/living/carbon/human/H = user if(istype(H.wear_suit, /obj/item/clothing/suit/cardborg)) var/obj/item/clothing/suit/cardborg/CB = H.wear_suit @@ -284,8 +283,8 @@ . = ..() /obj/item/clothing/head/wig/natural/equipped(mob/living/carbon/human/user, slot) - if(ishuman(user) && slot == SLOT_HEAD) - hair_color = "#[user.hair_color]" + if(ishuman(user) && slot == ITEM_SLOT_HEAD) + color = "#[user.hair_color]" update_icon() user.update_inv_head() @@ -295,7 +294,7 @@ icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "clockwork_helmet_old" flags_inv = HIDEEARS|HIDEHAIR - armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20) + armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20, "stamina" = 30) /obj/item/clothing/head/foilhat name = "tinfoil hat" @@ -303,13 +302,13 @@ icon_state = "foilhat" item_state = "foilhat" clothing_flags = EFFECT_HAT | SNUG_FIT - armor = list("melee" = 0, "bullet" = 0, "laser" = -5,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = -5, "fire" = 0, "acid" = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = -5,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = -5, "fire" = 0, "acid" = 0, "stamina" = 50) equip_delay_other = 140 var/datum/brain_trauma/mild/phobia/conspiracies/paranoia /obj/item/clothing/head/foilhat/equipped(mob/living/carbon/human/user, slot) ..() - if(slot == SLOT_HEAD) + if(slot == ITEM_SLOT_HEAD) user.sec_hud_set_implants() if(paranoia) QDEL_NULL(paranoia) @@ -351,7 +350,7 @@ item_state = "tinfoil_envirohelm" strip_delay = 150 clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SHOWEROKAY | EFFECT_HAT | SNUG_FIT - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 50) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR var/brightness_on = 4 //luminosity when the light is on var/on = FALSE @@ -359,7 +358,7 @@ dynamic_hair_suffix = "" dynamic_fhair_suffix = "" flash_protect = 2 - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH bang_protect = 1 //make this consistent with other plasmaman helmets resistance_flags = NONE dog_fashion = null diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 26a0ae2d85a5d..472651411e844 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -22,7 +22,6 @@ /obj/item/clothing/head/soft/AltClick(mob/user) - ..() if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return else @@ -119,7 +118,7 @@ desc = "It's a robust baseball hat in tasteful red colour." icon_state = "secsoft" item_color = "sec" - armor = list("melee" = 30, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 50) + armor = list("melee" = 30, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 50, "stamina" = 30) strip_delay = 60 dog_fashion = null diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index de7d4d213692a..d5a3a0fc4dea4 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -17,7 +17,7 @@ /obj/item/clothing/mask/equipped(mob/M, slot) . = ..() - if (slot == SLOT_WEAR_MASK && modifies_speech) + if (slot == ITEM_SLOT_MASK && modifies_speech) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else UnregisterSignal(M, COMSIG_MOB_SAY) @@ -27,7 +27,7 @@ UnregisterSignal(M, COMSIG_MOB_SAY) /obj/item/clothing/mask/proc/handle_speech() - + SIGNAL_HANDLER /obj/item/clothing/mask/worn_overlays(isinhands = FALSE) . = list() if(!isinhands) @@ -68,5 +68,8 @@ if(adjusted_flags) slot_flags = adjusted_flags if(user) - user.wear_mask_update(src, toggle_off = mask_adjusted) - user.update_action_buttons_icon() //when mask is adjusted out, we update all buttons icon so the user's potential internal tank correctly shows as off. + if(iscarbon(user)) + var/mob/living/carbon/U = user + if(U.wear_mask == src) + user.wear_mask_update(src, toggle_off = mask_adjusted) + user.update_action_buttons_icon() //when mask is adjusted out, we update all buttons icon so the user's potential internal tank correctly shows as off. diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 25e96b274d002..fb0dd4f985e8d 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -22,7 +22,6 @@ adjustmask(user) /obj/item/clothing/mask/breath/AltClick(mob/user) - ..() if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return else diff --git a/code/modules/clothing/masks/cluwne.dm b/code/modules/clothing/masks/cluwne.dm index 0007bc9a38e0b..a17dcdcd1f8c2 100644 --- a/code/modules/clothing/masks/cluwne.dm +++ b/code/modules/clothing/masks/cluwne.dm @@ -39,7 +39,7 @@ /obj/item/clothing/mask/cluwne/handle_speech(datum/source, list/speech_args) if(voicechange) - if(prob(5)) //the brain isnt fully gone yet... + if(prob(5)) //the brain isn't fully gone yet... speech_args[SPEECH_MESSAGE] = pick("HELP ME!!","PLEASE KILL ME!!","I WANT TO DIE!!", "END MY SUFFERING", "I CANT TAKE THIS ANYMORE!!" ,"SOMEBODY STOP ME!!") play_laugh2() if(prob(3)) @@ -53,7 +53,7 @@ /obj/item/clothing/mask/cluwne/equipped(mob/user, slot) if(!ishuman(user)) return - if(slot == SLOT_WEAR_MASK) + if(slot == ITEM_SLOT_MASK) var/mob/living/carbon/human/H = user H.dna.add_mutation(CLUWNEMUT) return @@ -86,7 +86,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(slot == SLOT_WEAR_MASK) + if(slot == ITEM_SLOT_MASK) if(is_cursed && can_cluwne) //logic predetermined log_admin("[key_name(H)] was made into a cluwne by [src]") message_admins("[key_name(H)] got cluwned by [src]") diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 65dcf9aa54c34..0bf02fb462136 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -8,7 +8,7 @@ item_state = "gas_alt" gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 - flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH | PEPPERPROOF + flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH resistance_flags = NONE // **** Welding gas mask **** @@ -20,7 +20,7 @@ materials = list(/datum/material/iron=4000, /datum/material/glass=2000) flash_protect = 2 tint = 2 - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 55) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 55, "stamina" = 15) actions_types = list(/datum/action/item_action/toggle) flags_inv = HIDEEARS|HIDEEYES|HIDEFACE flags_cover = MASKCOVERSEYES @@ -34,7 +34,7 @@ /obj/item/clothing/mask/gas/welding/up /obj/item/clothing/mask/gas/welding/up/Initialize() - ..() + . = ..() visor_toggling() // ******************************************************************** @@ -45,7 +45,7 @@ desc = "A modernised version of the classic design, this mask will not only filter out toxins but it can also be connected to an air supply." icon_state = "plaguedoctor" item_state = "gas_mask" - armor = list("melee" = 0, "bullet" = 0, "laser" = 2,"energy" = 2, "bomb" = 0, "bio" = 75, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = 2,"energy" = 2, "bomb" = 0, "bio" = 75, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) /obj/item/clothing/mask/gas/syndicate name = "syndicate mask" @@ -74,6 +74,7 @@ options["The Madman"] = "joker" options["The Rainbow Color"] ="rainbow" options["The Jester"] ="chaos" //Nepeta33Leijon is holding me captive and forced me to help with this please send help + options["The Lunatic"] = "trickymask" var/choice = input(user,"To what form do you wish to Morph this mask?","Morph Mask") in sortList(options) @@ -210,3 +211,8 @@ item_state = "hunter" resistance_flags = FIRE_PROOF | ACID_PROOF flags_inv = HIDEFACIALHAIR|HIDEFACE|HIDEEYES|HIDEEARS|HIDEHAIR + +/obj/item/clothing/mask/gas/old + desc = "A face-covering mask that can be connected to an air supply. This one appears to be one of the older models." + icon_state = "gas_alt_old" + item_state = "gas_alt_old" diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index c1f833fc0ab6c..0b12b233c20cc 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -12,8 +12,8 @@ w_class = WEIGHT_CLASS_SMALL visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS visor_flags_inv = HIDEFACE - flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES | PEPPERPROOF - visor_flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES | PEPPERPROOF + flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES + visor_flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES var/aggressiveness = 2 var/cooldown_special var/recent_uses = 0 @@ -29,7 +29,7 @@ aggressiveness = 3 flags_inv = HIDEFACIALHAIR|HIDEFACE|HIDEEYES|HIDEEARS|HIDEHAIR visor_flags_inv = 0 - 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" = 5, "laser" = 5, "energy" = 5, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 20, "acid" = 40, "stamina" = 30) /obj/item/clothing/mask/gas/sechailer/swat/spacepol name = "spacepol mask" diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index fc8a8d2aa09ec..c3901d3735764 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -28,7 +28,7 @@ visor_flags_cover = MASKCOVERSMOUTH gas_transfer_coefficient = 0.9 permeability_coefficient = 0.01 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 25, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 25, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) actions_types = list(/datum/action/item_action/adjust) /obj/item/clothing/mask/surgical/attack_self(mob/user) @@ -159,6 +159,7 @@ flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEYES|HIDEEARS w_class = WEIGHT_CLASS_SMALL clothing_flags = VOICEBOX_TOGGLABLE + modifies_speech = TRUE /obj/item/clothing/mask/horsehead/handle_speech(datum/source, list/speech_args) if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED)) @@ -232,7 +233,7 @@ flags_cover = MASKCOVERSMOUTH flags_inv = HIDEFACE|HIDEFACIALHAIR visor_flags_inv = HIDEFACE|HIDEFACIALHAIR - visor_flags_cover = MASKCOVERSMOUTH | PEPPERPROOF + visor_flags_cover = MASKCOVERSMOUTH slot_flags = ITEM_SLOT_MASK adjusted_flags = ITEM_SLOT_HEAD icon_state = "bandbotany" @@ -241,10 +242,9 @@ adjustmask(user) /obj/item/clothing/mask/bandana/AltClick(mob/user) - . = ..() if(iscarbon(user)) var/mob/living/carbon/C = user - if((C.get_item_by_slot(SLOT_HEAD == src)) || (C.get_item_by_slot(SLOT_WEAR_MASK) == src)) + if((C.get_item_by_slot(ITEM_SLOT_HEAD == src)) || (C.get_item_by_slot(ITEM_SLOT_MASK) == src)) to_chat(user, "You can't tie [src] while wearing it!") return if(slot_flags & ITEM_SLOT_HEAD) diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 0c625a5e0835c..6941a802d6bc6 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -226,10 +226,9 @@ . += realOverlay /obj/item/clothing/neck/neckerchief/AltClick(mob/user) - . = ..() if(iscarbon(user)) var/mob/living/carbon/C = user - if(C.get_item_by_slot(SLOT_NECK) == src) + if(C.get_item_by_slot(ITEM_SLOT_NECK) == src) to_chat(user, "You can't untie [src] while wearing it!") return if(user.is_holding(src)) @@ -241,3 +240,17 @@ user.visible_message("You untie [oldName] back into a [newBand.name]", "[user] unties [oldName] back into a [newBand.name]") else to_chat(user, "You must be holding [src] in order to untie it!") + +///////////////// +//DONATOR ITEMS// +///////////////// + +/obj/item/clothing/neck/bizzarescarf + name = "bizzare scarf" + desc = "Your next line is-" + icon_state = "bizzare" + +/obj/item/clothing/neck/conductivescarf + name = "conductive scarf" + desc = "Made out of 30,000 scarabs. Use with caution." + icon_state = "conductive" diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 2ba1e8a18d11d..d2e67da70f6d8 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -2,6 +2,7 @@ name = "ERT Common" uniform = /obj/item/clothing/under/rank/centcom/officer + mask = /obj/item/clothing/mask/gas/sechailer shoes = /obj/item/clothing/shoes/combat/swat gloves = /obj/item/clothing/gloves/combat ears = /obj/item/radio/headset/headset_cent/alt @@ -28,14 +29,15 @@ id = /obj/item/card/id/ert suit = /obj/item/clothing/suit/space/hardsuit/ert + suit_store = /obj/item/gun/energy/e_gun glasses = /obj/item/clothing/glasses/hud/security/sunglasses back = /obj/item/storage/backpack/ert belt = /obj/item/storage/belt/security/full - backpack_contents = list(/obj/item/storage/box/engineer=1,\ - /obj/item/melee/baton/loaded=1,\ - /obj/item/clothing/mask/gas/sechailer=1,\ - /obj/item/gun/energy/e_gun=1) + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/melee/baton/loaded=1, + /obj/item/aiModule/core/full/ert=1) l_pocket = /obj/item/switchblade + r_pocket = /obj/item/door_remote/omni /datum/outfit/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() @@ -50,9 +52,9 @@ name = "ERT Commander - High Alert" glasses = /obj/item/clothing/glasses/thermal/eyepatch - backpack_contents = list(/obj/item/storage/box/engineer=1,\ - /obj/item/melee/baton/loaded=1,\ - /obj/item/clothing/mask/gas/sechailer/swat=1,\ + mask = /obj/item/clothing/mask/gas/sechailer/swat + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/melee/baton/loaded=1, /obj/item/gun/energy/pulse/pistol/loyalpin=1) l_pocket = /obj/item/melee/transforming/energy/sword/saber @@ -61,13 +63,12 @@ id = /obj/item/card/id/ert/Security suit = /obj/item/clothing/suit/space/hardsuit/ert/sec + suit_store = /obj/item/gun/energy/e_gun/stun glasses = /obj/item/clothing/glasses/hud/security/sunglasses back = /obj/item/storage/backpack/ert/security belt = /obj/item/storage/belt/security/full - backpack_contents = list(/obj/item/storage/box/engineer=1,\ - /obj/item/storage/box/handcuffs=1,\ - /obj/item/clothing/mask/gas/sechailer=1,\ - /obj/item/gun/energy/e_gun/stun=1,\ + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/storage/box/handcuffs=1, /obj/item/melee/baton/loaded=1) /datum/outfit/ert/security/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -83,10 +84,10 @@ /datum/outfit/ert/security/alert name = "ERT Security - High Alert" - backpack_contents = list(/obj/item/storage/box/engineer=1,\ - /obj/item/storage/box/handcuffs=1,\ - /obj/item/clothing/mask/gas/sechailer/swat=1,\ - /obj/item/melee/baton/loaded=1,\ + mask = /obj/item/clothing/mask/gas/sechailer/swat + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/storage/box/handcuffs=1, + /obj/item/melee/baton/loaded=1, /obj/item/gun/energy/pulse/carbine/loyalpin=1) @@ -95,15 +96,14 @@ id = /obj/item/card/id/ert/Medical suit = /obj/item/clothing/suit/space/hardsuit/ert/med + suit_store = /obj/item/gun/energy/e_gun glasses = /obj/item/clothing/glasses/hud/health back = /obj/item/storage/backpack/ert/medical belt = /obj/item/storage/belt/medical - r_hand = /obj/item/storage/firstaid/regular - backpack_contents = list(/obj/item/storage/box/engineer=1,\ - /obj/item/melee/baton/loaded=1,\ - /obj/item/clothing/mask/gas/sechailer=1,\ - /obj/item/gun/energy/e_gun=1,\ - /obj/item/reagent_containers/hypospray/combat=1,\ + l_hand = /obj/item/storage/firstaid/regular + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/melee/baton/loaded=1, + /obj/item/reagent_containers/hypospray/combat=1, /obj/item/gun/medbeam=1) /datum/outfit/ert/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -119,11 +119,11 @@ /datum/outfit/ert/medic/alert name = "ERT Medic - High Alert" - backpack_contents = list(/obj/item/storage/box/engineer=1,\ - /obj/item/melee/baton/loaded=1,\ - /obj/item/clothing/mask/gas/sechailer/swat=1,\ - /obj/item/gun/energy/pulse/pistol/loyalpin=1,\ - /obj/item/reagent_containers/hypospray/combat/nanites=1,\ + mask = /obj/item/clothing/mask/gas/sechailer/swat + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/melee/baton/loaded=1, + /obj/item/gun/energy/pulse/pistol/loyalpin=1, + /obj/item/reagent_containers/hypospray/combat/nanites=1, /obj/item/gun/medbeam=1) /datum/outfit/ert/engineer @@ -131,15 +131,14 @@ id = /obj/item/card/id/ert/Engineer suit = /obj/item/clothing/suit/space/hardsuit/ert/engi + suit_store = /obj/item/gun/energy/e_gun glasses = /obj/item/clothing/glasses/meson/engine back = /obj/item/storage/backpack/ert/engineer belt = /obj/item/storage/belt/utility/full l_pocket = /obj/item/rcd_ammo/large - r_hand = /obj/item/storage/firstaid/regular - backpack_contents = list(/obj/item/storage/box/engineer=1,\ - /obj/item/melee/baton/loaded=1,\ - /obj/item/clothing/mask/gas/sechailer=1,\ - /obj/item/gun/energy/e_gun=1,\ + l_hand = /obj/item/storage/firstaid/regular + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/melee/baton/loaded=1, /obj/item/construction/rcd/loaded=1) /datum/outfit/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -155,10 +154,10 @@ /datum/outfit/ert/engineer/alert name = "ERT Engineer - High Alert" - backpack_contents = list(/obj/item/storage/box/engineer=1,\ - /obj/item/melee/baton/loaded=1,\ - /obj/item/clothing/mask/gas/sechailer/swat=1,\ - /obj/item/gun/energy/pulse/pistol/loyalpin=1,\ + mask = /obj/item/clothing/mask/gas/sechailer/swat + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/melee/baton/loaded=1, + /obj/item/gun/energy/pulse/pistol/loyalpin=1, /obj/item/construction/rcd/combat=1) @@ -196,21 +195,20 @@ /datum/outfit/ert/commander/inquisitor name = "Inquisition Commander" - r_hand = /obj/item/nullrod/scythe/talking/chainsword + l_hand = /obj/item/nullrod/scythe/talking/chainsword suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal backpack_contents = list(/obj/item/storage/box/engineer=1, - /obj/item/clothing/mask/gas/sechailer=1, - /obj/item/gun/energy/e_gun=1) + /obj/item/aiModule/core/full/ert=1, + /obj/item/door_remote/omni=1) /datum/outfit/ert/security/inquisitor name = "Inquisition Security" suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor + suit_store = /obj/item/gun/energy/e_gun/stun backpack_contents = list(/obj/item/storage/box/engineer=1, /obj/item/storage/box/handcuffs=1, - /obj/item/clothing/mask/gas/sechailer=1, - /obj/item/gun/energy/e_gun/stun=1, /obj/item/melee/baton/loaded=1, /obj/item/construction/rcd/loaded=1) @@ -218,11 +216,10 @@ name = "Inquisition Medic" suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor + suit_store = /obj/item/gun/energy/e_gun backpack_contents = list(/obj/item/storage/box/engineer=1, /obj/item/melee/baton/loaded=1, - /obj/item/clothing/mask/gas/sechailer=1, - /obj/item/gun/energy/e_gun=1, /obj/item/reagent_containers/hypospray/combat=1, /obj/item/reagent_containers/hypospray/combat/heresypurge=1, /obj/item/gun/medbeam=1) @@ -241,28 +238,24 @@ name = "ERT Chaplain" suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor // Chap role always gets this suit + suit_store = /obj/item/gun/energy/e_gun id = /obj/item/card/id/ert/chaplain glasses = /obj/item/clothing/glasses/hud/health back = /obj/item/storage/backpack/cultpack belt = /obj/item/storage/belt/soulstone backpack_contents = list(/obj/item/storage/box/engineer=1, - /obj/item/nullrod=1, - /obj/item/clothing/mask/gas/sechailer=1, - /obj/item/gun/energy/e_gun=1, - ) + /obj/item/nullrod=1) /datum/outfit/ert/chaplain/inquisitor name = "Inquisition Chaplain" suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor + suit_store = /obj/item/gun/energy/e_gun belt = /obj/item/storage/belt/soulstone/full/chappy backpack_contents = list(/obj/item/storage/box/engineer=1, /obj/item/grenade/chem_grenade/holy=1, - /obj/item/nullrod=1, - /obj/item/clothing/mask/gas/sechailer=1, - /obj/item/gun/energy/e_gun=1, - ) + /obj/item/nullrod=1) /datum/outfit/ert/janitor name = "ERT Janitor" @@ -275,12 +268,11 @@ r_pocket = /obj/item/grenade/chem_grenade/cleaner l_pocket = /obj/item/grenade/chem_grenade/cleaner l_hand = /obj/item/storage/bag/trash/bluespace - backpack_contents = list(/obj/item/storage/box/engineer=1,\ - /obj/item/storage/box/lights/mixed=1,\ - /obj/item/melee/baton/loaded=1,\ - /obj/item/clothing/mask/gas/sechailer=1,\ - /obj/item/mop/advanced=1,\ - /obj/item/reagent_containers/glass/bucket=1,\ + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/storage/box/lights/mixed=1, + /obj/item/melee/baton/loaded=1, + /obj/item/mop/advanced=1, + /obj/item/reagent_containers/glass/bucket=1, /obj/item/grenade/clusterbuster/cleaner=1) /datum/outfit/ert/janitor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -295,12 +287,38 @@ /datum/outfit/ert/janitor/heavy name = "ERT Janitor - Heavy Duty" - r_hand = /obj/item/reagent_containers/spray/chemsprayer/janitor - backpack_contents = list(/obj/item/storage/box/engineer=1,\ - /obj/item/storage/box/lights/mixed=1,\ - /obj/item/melee/baton/loaded=1,\ - /obj/item/clothing/mask/gas/sechailer=1,\ - /obj/item/grenade/clusterbuster/cleaner=3) + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/storage/box/lights/mixed=1, + /obj/item/melee/baton/loaded=1, + /obj/item/grenade/clusterbuster/cleaner=3, + /obj/item/reagent_containers/spray/chemsprayer/janitor=1) + +/datum/outfit/ert/kudzu + name = "ERT Weed Whacker" + + id = /obj/item/card/id/ert/kudzu + suit = /obj/item/clothing/suit/space/hardsuit/ert/jani + glasses = /obj/item/clothing/glasses/night + back = /obj/item/storage/backpack + belt = /obj/item/storage/belt/janitor/full + r_pocket = /obj/item/grenade/chem_grenade/antiweed + l_pocket = /obj/item/grenade/chem_grenade/antiweed + l_hand = /obj/item/scythe + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/storage/box/lights/mixed=1, + /obj/item/melee/baton/loaded=1, + /obj/item/choice_beacon/pet/goat, + /obj/item/grenade/clusterbuster/antiweed=2) + +/datum/outfit/ert/kudzu/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + + if(visualsOnly) + return + + var/obj/item/radio/R = H.ears + R.keyslot = new /obj/item/encryptionkey/headset_service + R.recalculateChannels() /datum/outfit/centcom_intern name = "CentCom Intern" @@ -311,7 +329,7 @@ ears = /obj/item/radio/headset/headset_cent glasses = /obj/item/clothing/glasses/sunglasses/advanced belt = /obj/item/melee/classic_baton/police - r_hand = /obj/item/gun/ballistic/rifle/boltaction + l_hand = /obj/item/gun/ballistic/rifle/boltaction back = /obj/item/storage/backpack/satchel l_pocket = /obj/item/ammo_box/a762 r_pocket = /obj/item/ammo_box/a762 @@ -334,7 +352,7 @@ belt = /obj/item/melee/baton/loaded suit = /obj/item/clothing/suit/armor/vest suit_store = /obj/item/gun/ballistic/rifle/boltaction - r_hand = /obj/item/megaphone + l_hand = /obj/item/megaphone head = /obj/item/clothing/head/intern /datum/outfit/centcom_clown @@ -392,3 +410,80 @@ /obj/item/megaphone/clown = 1, /obj/item/reagent_containers/spray/chemsprayer/janitor/clown = 1, ) + +/datum/outfit/death_commando + name = "Death Commando" + + uniform = /obj/item/clothing/under/rank/centcom/commander + suit = /obj/item/clothing/suit/space/hardsuit/deathsquad + shoes = /obj/item/clothing/shoes/magboots/commando + gloves = /obj/item/clothing/gloves/combat + mask = /obj/item/clothing/mask/gas/sechailer/swat + glasses = /obj/item/clothing/glasses/hud/toggle/thermal + back = /obj/item/storage/backpack/security + l_pocket = /obj/item/melee/transforming/energy/sword/saber + r_pocket = /obj/item/shield/energy + suit_store = /obj/item/tank/internals/emergency_oxygen/double + belt = /obj/item/gun/ballistic/revolver/mateba + l_hand = /obj/item/gun/energy/pulse/loyalpin + id = /obj/item/card/id + ears = /obj/item/radio/headset/headset_cent/alt + + backpack_contents = list(/obj/item/storage/box=1,\ + /obj/item/ammo_box/a357=1,\ + /obj/item/storage/firstaid/regular=1,\ + /obj/item/storage/box/flashbangs=1,\ + /obj/item/flashlight=1,\ + /obj/item/grenade/plastic/x4=1) + +/datum/outfit/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + if(visualsOnly) + return + + var/obj/item/radio/R = H.ears + R.set_frequency(FREQ_CENTCOM) + R.freqlock = TRUE + + var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H)//Here you go Deuryn + L.implant(H, null, 1) + + + var/obj/item/card/id/W = H.wear_id + W.icon_state = "centcom" + W.access = get_all_accesses()//They get full station access. + W.access += get_centcom_access("Death Commando")//Let's add their alloted CentCom access. + W.assignment = "Death Commando" + W.registered_name = H.real_name + W.update_label(W.registered_name, W.assignment) + +/datum/outfit/death_commando/officer + name = "Death Commando Officer" + head = /obj/item/clothing/head/helmet/space/beret + backpack_contents = list(/obj/item/aiModule/core/full/deathsquad=1,\ + /obj/item/ammo_box/a357=1,\ + /obj/item/storage/firstaid/regular=1,\ + /obj/item/storage/box/flashbangs=1,\ + /obj/item/flashlight=1,\ + /obj/item/grenade/plastic/x4=1, + /obj/item/door_remote/omni=1) + +/datum/outfit/death_commando/doomguy + name = "The Juggernaut" + + suit = /obj/item/clothing/suit/space/hardsuit/shielded/doomguy + shoes = /obj/item/clothing/shoes/jackboots/fast + gloves = /obj/item/clothing/gloves/krav_maga/combatglovesplus + mask = /obj/item/clothing/mask/gas/sechailer + suit_store = /obj/item/gun/energy/pulse/destroyer + belt = /obj/item/storage/belt/grenade/full/webbing + back = /obj/item/storage/backpack/hammerspace + l_pocket = /obj/item/kitchen/knife/combat + r_pocket = /obj/item/tank/internals/emergency_oxygen/double + r_hand = /obj/item/reagent_containers/hypospray/combat/supersoldier + backpack_contents = list(/obj/item/storage/box/engineer=1,\ + /obj/item/reagent_containers/hypospray/combat,\ + /obj/item/radio=1,\ + /obj/item/chainsaw/energy/doom=1,\ + /obj/item/gun/ballistic/automatic/sniper_rifle=1,\ + /obj/item/gun/grenadelauncher/security=1,\ + /obj/item/gun/ballistic/automatic/ar=1) diff --git a/code/modules/clothing/outfits/event.dm b/code/modules/clothing/outfits/event.dm index 70d16f3ae9622..76c334f0fc4b1 100644 --- a/code/modules/clothing/outfits/event.dm +++ b/code/modules/clothing/outfits/event.dm @@ -16,8 +16,9 @@ if(visualsOnly) return H.fully_replace_character_name(H.real_name, "Santa Claus") - H.mind.assigned_role = "Santa" - H.mind.special_role = "Santa" + if(H.mind) + H.mind.assigned_role = "Santa" + H.mind.special_role = "Santa" H.hair_style = "Long Hair 3" H.facial_hair_style = "Beard (Full)" diff --git a/code/modules/clothing/outfits/plasmaman.dm b/code/modules/clothing/outfits/plasmaman.dm index bb30cb9de7d98..6555c380ee5a1 100644 --- a/code/modules/clothing/outfits/plasmaman.dm +++ b/code/modules/clothing/outfits/plasmaman.dm @@ -54,12 +54,14 @@ /datum/outfit/plasmaman/security name = "Security Plasmaman" + mask = /obj/item/clothing/mask/gas/sechailer head = /obj/item/clothing/head/helmet/space/plasmaman/security uniform = /obj/item/clothing/under/plasmaman/security /datum/outfit/plasmaman/detective name = "Detective Plasmaman" + mask = /obj/item/clothing/mask/gas/sechailer head = /obj/item/clothing/head/helmet/space/plasmaman/white uniform = /obj/item/clothing/under/plasmaman/enviroslacks ears = /obj/item/radio/headset/headset_sec @@ -67,12 +69,14 @@ /datum/outfit/plasmaman/warden name = "Warden Plasmaman" + mask = /obj/item/clothing/mask/gas/sechailer head = /obj/item/clothing/head/helmet/space/plasmaman/security/warden uniform = /obj/item/clothing/under/plasmaman/security/warden /datum/outfit/plasmaman/secmed name = "Brig Physician Plasmaman" + mask = /obj/item/clothing/mask/gas/sechailer head = /obj/item/clothing/head/helmet/space/plasmaman/security/secmed uniform = /obj/item/clothing/under/plasmaman/security/secmed @@ -139,53 +143,93 @@ /datum/outfit/plasmaman/atmospherics name = "Atmospherics Plasmaman" - head = /obj/item/clothing/head/helmet/space/plasmaman/atmospherics - uniform = /obj/item/clothing/under/plasmaman/atmospherics + head = /obj/item/clothing/head/helmet/space/plasmaman/engineering/atmospherics + uniform = /obj/item/clothing/under/plasmaman/engineering/atmospherics + +/datum/outfit/plasmaman/exploration + name = "Exploration crew plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/exploration + uniform = /obj/item/clothing/under/plasmaman/exploration /datum/outfit/plasmaman/command - name = "Command Plasmamand" - + name = "Command Plasmaman" + + mask = /obj/item/clothing/mask/gas/sechailer head = /obj/item/clothing/head/helmet/space/plasmaman/command uniform = /obj/item/clothing/under/plasmaman/command /datum/outfit/plasmaman/ce name = "CE plasmaman" - + head = /obj/item/clothing/head/helmet/space/plasmaman/engineering/ce uniform = /obj/item/clothing/under/plasmaman/engineering/ce - + /datum/outfit/plasmaman/cmo name = "CMO plasmaman" - + head = /obj/item/clothing/head/helmet/space/plasmaman/cmo uniform = /obj/item/clothing/under/plasmaman/cmo - + /datum/outfit/plasmaman/hos name = "HoS plasmaman" + mask = /obj/item/clothing/mask/gas/sechailer head = /obj/item/clothing/head/helmet/space/plasmaman/security/hos - uniform =/obj/item/clothing/under/plasmaman/security/hos + uniform = /obj/item/clothing/under/plasmaman/security/hos /datum/outfit/plasmaman/rd name = "RD plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/rd uniform = /obj/item/clothing/under/plasmaman/rd - + /datum/outfit/plasmaman/hop name = "Hop plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/hop uniform = /obj/item/clothing/under/plasmaman/hop - + /datum/outfit/plasmaman/mime name = "Mime plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/mime uniform = /obj/item/clothing/under/plasmaman/mime - + /datum/outfit/plasmaman/honk name = "Clown plasmaman" head = /obj/item/clothing/head/helmet/space/plasmaman/honk uniform = /obj/item/clothing/under/plasmaman/honk + +/datum/outfit/plasmaman/official + name = "CentCom Official Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/official + uniform = /obj/item/clothing/under/plasmaman/official + +/datum/outfit/plasmaman/intern + name = "CentCom Intern Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/intern + uniform = /obj/item/clothing/under/plasmaman/intern + +/datum/outfit/plasmaman/ert + name = "ERT Common Plasmaman" + + head = null + uniform = /obj/item/clothing/under/plasmaman/official + mask = null + +/datum/outfit/plasmaman/death_commando + name = "Death Commando Plasmaman" + + head = null + uniform = /obj/item/clothing/under/plasmaman/commander + mask = null + +/datum/outfit/plasmaman/honk_squad + name = "HONK Squad Plasmaman" + + head = null + uniform = /obj/item/clothing/under/plasmaman/honk diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index af68bafa531b6..13f8d80996b79 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -1,3 +1,25 @@ +/datum/outfit/debug //Debug objs plus hardsuit + name = "Debug outfit" + uniform = /obj/item/clothing/under/misc/patriotsuit + suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite + mask = /obj/item/clothing/mask/gas/welding/up + gloves = /obj/item/clothing/gloves/combat + belt = /obj/item/storage/belt/utility/chief/full + shoes = /obj/item/clothing/shoes/magboots/advance + id = /obj/item/card/id/syndicate/debug + suit_store = /obj/item/tank/internals/oxygen + internals_slot = ITEM_SLOT_SUITSTORE + glasses = /obj/item/clothing/glasses/hud/debug + ears = /obj/item/radio/headset/headset_cent/commander + box = /obj/item/storage/box/debugtools + back = /obj/item/storage/backpack/holding + backpack_contents = list(/obj/item/gun/magic/wand/resurrection/debug=1,\ + /obj/item/melee/transforming/energy/axe=1,\ + /obj/item/storage/part_replacer/bluespace/tier4=1,\ + /obj/item/debug/human_spawner=1,\ + /obj/item/debug/omnitool=1 + ) + /datum/outfit/space name = "Standard Space Gear" @@ -123,7 +145,7 @@ l_pocket = /obj/item/reagent_containers/food/snacks/grown/banana r_pocket = /obj/item/bikehorn id = /obj/item/card/id - r_hand = /obj/item/twohanded/fireaxe + r_hand = /obj/item/fireaxe /datum/outfit/tunnel_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) @@ -149,7 +171,7 @@ suit = /obj/item/clothing/suit/apron l_pocket = /obj/item/kitchen/knife r_pocket = /obj/item/scalpel - r_hand = /obj/item/twohanded/fireaxe + r_hand = /obj/item/fireaxe /datum/outfit/psycho/post_equip(mob/living/carbon/human/H) for(var/obj/item/carried_item in H.get_equipped_items(TRUE)) @@ -217,10 +239,20 @@ back = /obj/item/storage/backpack/satchel/leather id = /obj/item/card/id +/datum/outfit/centcom/commander/plasmaman + name = "CentCom Commander Plasmaman" + + mask = /obj/item/clothing/mask/gas/sechailer + head = /obj/item/clothing/head/helmet/space/plasmaman/commander + uniform = /obj/item/clothing/under/plasmaman/commander + /datum/outfit/centcom/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) return + if(isplasmaman(H)) + H.internal = H.get_item_for_held_index(2) + H.update_internals_hud_icon(1) var/obj/item/card/id/W = H.wear_id W.icon_state = "centcom" W.access = get_all_accesses() @@ -367,76 +399,6 @@ r_hand= /obj/item/tank/internals/plasmaman/belt/full mask = /obj/item/clothing/mask/breath -/datum/outfit/death_commando - name = "Death Commando" - - uniform = /obj/item/clothing/under/rank/centcom/commander - suit = /obj/item/clothing/suit/space/hardsuit/deathsquad - shoes = /obj/item/clothing/shoes/combat/swat - gloves = /obj/item/clothing/gloves/combat - mask = /obj/item/clothing/mask/gas/sechailer/swat - glasses = /obj/item/clothing/glasses/hud/toggle/thermal - back = /obj/item/storage/backpack/security - l_pocket = /obj/item/melee/transforming/energy/sword/saber - r_pocket = /obj/item/shield/energy - suit_store = /obj/item/tank/internals/emergency_oxygen/double - belt = /obj/item/gun/ballistic/revolver/mateba - r_hand = /obj/item/gun/energy/pulse/loyalpin - id = /obj/item/card/id - ears = /obj/item/radio/headset/headset_cent/alt - - backpack_contents = list(/obj/item/storage/box=1,\ - /obj/item/ammo_box/a357=1,\ - /obj/item/storage/firstaid/regular=1,\ - /obj/item/storage/box/flashbangs=1,\ - /obj/item/flashlight=1,\ - /obj/item/grenade/plastic/x4=1) - -/datum/outfit/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - if(visualsOnly) - return - - var/obj/item/radio/R = H.ears - R.set_frequency(FREQ_CENTCOM) - R.freqlock = TRUE - - var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H)//Here you go Deuryn - L.implant(H, null, 1) - - - var/obj/item/card/id/W = H.wear_id - W.icon_state = "centcom" - W.access = get_all_accesses()//They get full station access. - W.access += get_centcom_access("Death Commando")//Let's add their alloted CentCom access. - W.assignment = "Death Commando" - W.registered_name = H.real_name - W.update_label(W.registered_name, W.assignment) - -/datum/outfit/death_commando/officer - name = "Death Commando Officer" - head = /obj/item/clothing/head/helmet/space/beret - -/datum/outfit/death_commando/doomguy - name = "The Juggernaut" - - suit = /obj/item/clothing/suit/space/hardsuit/shielded/doomguy - shoes = /obj/item/clothing/shoes/jackboots/fast - gloves = /obj/item/clothing/gloves/krav_maga/combatglovesplus - mask = /obj/item/clothing/mask/gas/sechailer - suit_store = /obj/item/gun/energy/pulse/destroyer - belt = /obj/item/storage/belt/grenade/full/webbing - back = /obj/item/storage/backpack/hammerspace - l_pocket = /obj/item/kitchen/knife/combat - r_pocket = /obj/item/tank/internals/emergency_oxygen/double - r_hand = /obj/item/reagent_containers/hypospray/combat/supersoldier - backpack_contents = list(/obj/item/storage/box/engineer=1,\ - /obj/item/reagent_containers/hypospray/combat,\ - /obj/item/radio=1,\ - /obj/item/twohanded/required/chainsaw/energy/doom=1,\ - /obj/item/gun/ballistic/automatic/sniper_rifle=1,\ - /obj/item/gun/grenadelauncher=1,\ - /obj/item/gun/ballistic/automatic/ar=1) - /datum/outfit/chrono_agent name = "Timeline Eradication Agent" uniform = /obj/item/clothing/under/color/white @@ -455,25 +417,4 @@ id = /obj/item/card/id/job/clown ears = /obj/item/radio/headset/headset_srv -/datum/outfit/debug //Debug objs plus hardsuit - name = "Debug outfit" - uniform = /obj/item/clothing/under/misc/patriotsuit - suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite - mask = /obj/item/clothing/mask/gas/welding/up - gloves = /obj/item/clothing/gloves/combat - belt = /obj/item/storage/belt/utility/chief/full - shoes = /obj/item/clothing/shoes/magboots/advance - id = /obj/item/card/id/ert - suit_store = /obj/item/tank/internals/oxygen - internals_slot = SLOT_S_STORE - glasses = /obj/item/clothing/glasses/meson/night - ears = /obj/item/radio/headset/headset_cent/commander - box = /obj/item/storage/box/debugtools - back = /obj/item/storage/backpack/holding - backpack_contents = list(/obj/item/flashlight/emp/debug=1,\ - /obj/item/gun/magic/wand/resurrection/debug=1,\ - /obj/item/melee/transforming/energy/axe=1,\ - /obj/item/storage/part_replacer/bluespace/tier4=1,\ - /obj/item/debug/human_spawner=1,\ - /obj/item/debug/omnitool=1 - ) + diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm index cd8930641f672..f962b3aa6c319 100644 --- a/code/modules/clothing/outfits/vr.dm +++ b/code/modules/clothing/outfits/vr.dm @@ -28,7 +28,7 @@ /datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H) . = ..() var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, H.key, 80) - H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(U, ITEM_SLOT_BACKPACK) var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H) W.implant(H) var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H) diff --git a/code/modules/clothing/outfits/vv_outfit.dm b/code/modules/clothing/outfits/vv_outfit.dm index dc735995dd326..b293b78ccf739 100644 --- a/code/modules/clothing/outfits/vv_outfit.dm +++ b/code/modules/clothing/outfits/vv_outfit.dm @@ -11,35 +11,35 @@ /datum/outfit/varedit/proc/set_equipement_by_slot(slot,item_path) switch(slot) - if(SLOT_W_UNIFORM) + if(ITEM_SLOT_ICLOTHING) uniform = item_path - if(SLOT_BACK) + if(ITEM_SLOT_BACK) back = item_path - if(SLOT_WEAR_SUIT) + if(ITEM_SLOT_OCLOTHING) suit = item_path - if(SLOT_BELT) + if(ITEM_SLOT_BELT) belt = item_path - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) gloves = item_path - if(SLOT_SHOES) + if(ITEM_SLOT_FEET) shoes = item_path - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) head = item_path - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) mask = item_path - if(SLOT_NECK) + if(ITEM_SLOT_NECK) neck = item_path - if(SLOT_EARS) + if(ITEM_SLOT_EARS) ears = item_path - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) glasses = item_path - if(SLOT_WEAR_ID) + if(ITEM_SLOT_ID) id = item_path - if(SLOT_S_STORE) + if(ITEM_SLOT_SUITSTORE) suit_store = item_path - if(SLOT_L_STORE) + if(ITEM_SLOT_LPOCKET) l_pocket = item_path - if(SLOT_R_STORE) + if(ITEM_SLOT_RPOCKET) r_pocket = item_path @@ -69,7 +69,7 @@ //Copy equipment var/list/result = list() - var/list/slots_to_check = list(SLOT_W_UNIFORM,SLOT_BACK,SLOT_WEAR_SUIT,SLOT_BELT,SLOT_GLOVES,SLOT_SHOES,SLOT_HEAD,SLOT_WEAR_MASK,SLOT_NECK,SLOT_EARS,SLOT_GLASSES,SLOT_WEAR_ID,SLOT_S_STORE,SLOT_L_STORE,SLOT_R_STORE) + var/list/slots_to_check = list(ITEM_SLOT_ICLOTHING,ITEM_SLOT_BACK,ITEM_SLOT_OCLOTHING,ITEM_SLOT_BELT,ITEM_SLOT_GLOVES,ITEM_SLOT_FEET,ITEM_SLOT_HEAD,ITEM_SLOT_MASK,ITEM_SLOT_NECK,ITEM_SLOT_EARS,ITEM_SLOT_EYES,ITEM_SLOT_ID,ITEM_SLOT_SUITSTORE,ITEM_SLOT_LPOCKET,ITEM_SLOT_RPOCKET) for(var/s in slots_to_check) var/obj/item/I = get_item_by_slot(s) var/vedits = collect_vv(I) @@ -80,7 +80,7 @@ //Copy access O.stored_access = list() - var/obj/item/id_slot = get_item_by_slot(SLOT_WEAR_ID) + var/obj/item/id_slot = get_item_by_slot(ITEM_SLOT_ID) if(id_slot) O.stored_access |= id_slot.GetAccess() var/obj/item/card/id/ID = id_slot.GetID() @@ -102,7 +102,7 @@ result["RHAND"] = vedits O.vv_values = result //Copy backpack contents if exist. - var/obj/item/backpack = get_item_by_slot(SLOT_BACK) + var/obj/item/backpack = get_item_by_slot(ITEM_SLOT_BACK) if(istype(backpack) && SEND_SIGNAL(backpack, COMSIG_CONTAINS_STORAGE)) var/list/bp_stuff = list() var/list/typecounts = list() @@ -140,7 +140,7 @@ for(var/vname in edits) I.vv_edit_var(vname,edits[vname]) //Apply access - var/obj/item/id_slot = H.get_item_by_slot(SLOT_WEAR_ID) + var/obj/item/id_slot = H.get_item_by_slot(ITEM_SLOT_ID) if(id_slot) var/obj/item/card/id/card = id_slot.GetID() if(istype(card)) diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index a8c178ee64203..ae72168ce449d 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -28,10 +28,10 @@ var/obj/item/bodypart/r_leg = user.get_bodypart(BODY_ZONE_R_LEG) if(l_leg) l_leg.dismember() - playsound(user,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1) + playsound(user,pick('sound/misc/desecration-01.ogg','sound/misc/desecration-02.ogg','sound/misc/desecration-01.ogg') ,50, 1, -1) if(r_leg) r_leg.dismember() - playsound(user,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1) + playsound(user,pick('sound/misc/desecration-01.ogg','sound/misc/desecration-02.ogg','sound/misc/desecration-01.ogg') ,50, 1, -1) return BRUTELOSS else//didnt realize this suicide act existed (was in miscellaneous.dm) and didnt want to remove it, so made it a 50/50 chance. Why not! user.visible_message("[user] is bashing [user.p_their()] own head in with [src]! Ain't that a kick in the head?") @@ -56,7 +56,7 @@ /obj/item/clothing/shoes/equipped(mob/user, slot) . = ..() - if(offset && slot_flags & slotdefine2slotbit(slot)) + if(offset && (slot_flags & slot)) user.pixel_y += offset worn_y_dimension -= (offset * 2) user.update_inv_shoes() @@ -79,6 +79,8 @@ M.update_inv_shoes() /obj/item/clothing/shoes/proc/clean_blood(datum/source, strength) + SIGNAL_HANDLER + if(strength < CLEAN_STRENGTH_BLOOD) return bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) diff --git a/code/modules/clothing/shoes/cluwne.dm b/code/modules/clothing/shoes/cluwne.dm index 98591b9ad07ba..cef7dbdf56690 100644 --- a/code/modules/clothing/shoes/cluwne.dm +++ b/code/modules/clothing/shoes/cluwne.dm @@ -24,7 +24,7 @@ /obj/item/clothing/shoes/cluwne/equipped(mob/user, slot) if(!ishuman(user)) return - if(slot == SLOT_SHOES) + if(slot == ITEM_SLOT_FEET) var/mob/living/carbon/human/H = user H.dna.add_mutation(CLUWNEMUT) return diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index d32ed85de62e6..5ec5be63097fd 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -98,27 +98,28 @@ /obj/item/clothing/shoes/sneakers/orange/attackby(obj/H, loc, params) ..() // Note: not using istype here because we want to ignore all subtypes - if (H.type == /obj/item/restraints/handcuffs && !chained) + if (!chained && H.type == /obj/item/restraints/handcuffs) qdel(H) src.chained = 1 src.slowdown = 15 src.icon_state = "orange1" return - + /obj/item/clothing/shoes/sneakers/orange/allow_attack_hand_drop(mob/user) if(ishuman(user)) - var/mob/living/carbon/human/C = user - if(C.shoes == src && chained == 1) - to_chat(user, "You need help taking these off!") - return FALSE + var/mob/living/carbon/human/hummie = user + if(hummie.shoes == src && chained) + to_chat(hummie, "You start taking off your [src]!") + if(!do_after(hummie,15 SECONDS, src)) + return FALSE return ..() /obj/item/clothing/shoes/sneakers/orange/MouseDrop(atom/over) var/mob/m = usr if(ishuman(m)) - var/mob/living/carbon/human/c = m - if(c.shoes == src && chained == 1) - to_chat(c, "You need help taking these off!") - return + var/mob/living/carbon/human/hummie = m + if(hummie.shoes == src && chained) + to_chat(hummie, "You start taking off your [src]!") + if(!do_after(hummie,15 SECONDS, src)) + return FALSE return ..() - diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 8864add0d8146..0f855c3238c7c 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -37,7 +37,7 @@ A.UpdateButtonIcon() /obj/item/clothing/shoes/magboots/negates_gravity() - return clothing_flags & NOSLIP + return isspaceturf(get_turf(src)) ? FALSE : magpulse //We don't mimick gravity on space turfs /obj/item/clothing/shoes/magboots/examine(mob/user) . = ..() @@ -58,10 +58,35 @@ icon_state = "syndiemag0" magboot_state = "syndiemag" +/obj/item/clothing/shoes/magboots/commando + desc = "Military-grade magnetic boots that have a lighter magnetic pull, placing less burden on the wearer." + name = "commando magboots" + icon_state = "advmag0" + magboot_state = "advmag" + slowdown_active = SHOES_SLOWDOWN + armor = list("melee" = 40, "bullet" = 30, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 30, "rad" = 30, "fire" = 90, "acid" = 50, "stamina" = 30) + clothing_flags = NOSLIP + +/obj/item/clothing/shoes/magboots/commando/attack_self(mob/user) //Code for the passive no-slip of the commando magboots to always apply, kind of a shit code solution though. + if(magpulse) + slowdown = SHOES_SLOWDOWN + else + slowdown = slowdown_active + magpulse = !magpulse + icon_state = "[magboot_state][magpulse]" + to_chat(user, "You [magpulse ? "enable" : "disable"] the mag-pulse traction system.") + user.update_inv_shoes() + user.update_gravity(user.has_gravity()) + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + /obj/item/clothing/shoes/magboots/crushing desc = "Normal looking magboots that are altered to increase magnetic pull to crush anything underfoot." /obj/item/clothing/shoes/magboots/crushing/proc/crush(mob/living/user) + SIGNAL_HANDLER + if (!isturf(user.loc) || !magpulse) return var/turf/T = user.loc @@ -69,7 +94,7 @@ if (A != user && A.lying) A.adjustBruteLoss(rand(10,13)) to_chat(A,"[user]'s magboots press down on you, crushing you!") - A.emote("scream") + INVOKE_ASYNC(A, /mob.proc/emote, "scream") /obj/item/clothing/shoes/magboots/crushing/attack_self(mob/user) . = ..() @@ -80,7 +105,7 @@ /obj/item/clothing/shoes/magboots/crushing/equipped(mob/user,slot) . = ..() - if (slot == SLOT_SHOES && magpulse) + if (slot == ITEM_SLOT_FEET && magpulse) RegisterSignal(user, COMSIG_MOVABLE_MOVED,.proc/crush) /obj/item/clothing/shoes/magboots/crushing/dropped(mob/user) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 1594354ed3dbb..3d319e46b132a 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -13,7 +13,7 @@ item_state = "jackboots" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 10, "rad" = 0, "fire" = 70, "acid" = 50) + armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 10, "rad" = 0, "fire" = 70, "acid" = 50, "stamina" = 30) strip_delay = 40 resistance_flags = NONE permeability_coefficient = 0.05 //Thick soles, and covers the ankle @@ -24,7 +24,7 @@ desc = "High speed, no drag combat boots." permeability_coefficient = 0.01 clothing_flags = NOSLIP - armor = list("melee" = 40, "bullet" = 30, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 30, "rad" = 30, "fire" = 90, "acid" = 50) + armor = list("melee" = 40, "bullet" = 30, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 30, "rad" = 30, "fire" = 90, "acid" = 50, "stamina" = 30) /obj/item/clothing/shoes/sandal desc = "A pair of rather plain wooden sandals." @@ -34,7 +34,7 @@ equip_delay_other = 50 permeability_coefficient = 0.9 strip_delay = 5 - + /obj/item/clothing/shoes/sandal/marisa desc = "A pair of magic black shoes." name = "magic shoes" @@ -56,7 +56,7 @@ strip_delay = 30 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 75, "stamina" = 0) can_be_bloody = FALSE custom_price = 100 @@ -86,7 +86,7 @@ /obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot) . = ..() - if(slot == SLOT_SHOES) + if(slot == ITEM_SLOT_FEET) if(enabled_waddle) waddle = user.AddComponent(/datum/component/waddling) if(user.mind && user.mind.assigned_role == "Clown") @@ -283,7 +283,7 @@ /obj/item/clothing/shoes/wheelys/ui_action_click(mob/user, action) if(!isliving(user)) return - if(!istype(user.get_item_by_slot(SLOT_SHOES), /obj/item/clothing/shoes/wheelys)) + if(!istype(user.get_item_by_slot(ITEM_SLOT_FEET), /obj/item/clothing/shoes/wheelys)) to_chat(user, "You must be wearing the wheely-heels to use them!") return if(!(W.is_occupant(user))) @@ -338,3 +338,9 @@ icon_state = "rus_shoes" item_state = "rus_shoes" pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes + +/obj/item/clothing/shoes/swagshoes + name = "swag shoes" + desc = "They got me for my foams!" + icon_state = "SwagShoes" + item_state = "SwagShoes" diff --git a/code/modules/clothing/shoes/taeclowndo.dm b/code/modules/clothing/shoes/taeclowndo.dm index 9640669b85446..3e7fc26d25362 100644 --- a/code/modules/clothing/shoes/taeclowndo.dm +++ b/code/modules/clothing/shoes/taeclowndo.dm @@ -13,22 +13,22 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(slot == SLOT_SHOES) + if(slot == ITEM_SLOT_FEET) spells = new for(var/spell in spelltypes) var/obj/effect/proc_holder/spell/S = new spell spells += S S.charge_counter = 0 S.start_recharge() - H.mind.AddSpell(S) + H.mind?.AddSpell(S) /obj/item/clothing/shoes/clown_shoes/taeclowndo/dropped(mob/user) . = ..() if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(SLOT_SHOES) == src) + if(H.get_item_by_slot(ITEM_SLOT_FEET) == src) for(var/spell in spells) var/obj/effect/proc_holder/spell/S = spell - H.mind.spell_list.Remove(S) + H.mind?.spell_list.Remove(S) qdel(S) \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index b03932b2d77cf..e4cf78b5d95d4 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -7,7 +7,7 @@ clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SHOWEROKAY | SNUG_FIT item_state = "spaceold" permeability_coefficient = 0.01 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70, "stamina" = 10) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR dynamic_hair_suffix = "" dynamic_fhair_suffix = "" @@ -18,7 +18,7 @@ flash_protect = 2 strip_delay = 50 equip_delay_other = 50 - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH resistance_flags = NONE dog_fashion = null @@ -30,11 +30,11 @@ w_class = WEIGHT_CLASS_BULKY gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SHOWEROKAY + clothing_flags = NOTCONSUMABLE | STOPSPRESSUREDAMAGE | THICKMATERIAL | SHOWEROKAY body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/flashlight, /obj/item/tank/internals) slowdown = 1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70, "stamina" = 10) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 86d22f473b2e2..d295e6dca4885 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -4,7 +4,7 @@ icon_state = "chronohelmet" item_state = "chronohelmet" slowdown = 1 - armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 100) + armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 100, "stamina" = 70) resistance_flags = FIRE_PROOF | ACID_PROOF var/obj/item/clothing/suit/space/chronos/suit @@ -24,7 +24,7 @@ icon_state = "chronosuit" item_state = "chronosuit" actions_types = list(/datum/action/item_action/toggle) - armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 1000) + armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 1000, "stamina" = 70) resistance_flags = FIRE_PROOF | ACID_PROOF var/list/chronosafe_items = list(/obj/item/chrono_eraser, /obj/item/gun/energy/chrono_gun) var/obj/item/clothing/head/helmet/space/chronos/helmet @@ -65,6 +65,7 @@ /obj/item/clothing/suit/space/chronos/Destroy() dropped() + QDEL_NULL(teleport_now) return ..() /obj/item/clothing/suit/space/chronos/emp_act(severity) @@ -87,9 +88,8 @@ deltimer(phase_timer_id) phase_timer_id = 0 if(istype(user)) - if(to_turf) - user.forceMove(to_turf) - user.SetStun(0) + if(do_teleport(user, to_turf, no_effects = TRUE, channel = TELEPORT_CHANNEL_FREE)) + user.SetStun(0) user.next_move = 1 user.alpha = 255 user.update_atom_colour() @@ -119,7 +119,7 @@ teleport_now.UpdateButtonIcon() - var/list/nonsafe_slots = list(SLOT_BELT, SLOT_BACK) + var/list/nonsafe_slots = list(ITEM_SLOT_BELT, ITEM_SLOT_BACK) var/list/exposed = list() for(var/slot in nonsafe_slots) var/obj/item/slot_item = user.get_item_by_slot(slot) @@ -152,7 +152,7 @@ /obj/item/clothing/suit/space/chronos/proc/phase_3(mob/living/carbon/human/user, turf/to_turf, phase_in_ds) if(teleporting && activated && user) - user.forceMove(to_turf) + do_teleport(user, to_turf, no_effects = TRUE, channel = TELEPORT_CHANNEL_FREE) animate(user, color = "#00ccee", time = phase_in_ds) phase_timer_id = addtimer(CALLBACK(src, .proc/phase_4, user, to_turf), phase_in_ds, TIMER_STOPPABLE) else @@ -171,7 +171,7 @@ if(user && ishuman(user) && (user.wear_suit == src)) if(camera && (user.remote_control == camera)) if(!teleporting) - if(camera.loc != user && ((camera.x != user.x) || (camera.y != user.y) || (camera.z != user.z))) + if(camera.loc != user && ((camera.x != user.x) || (camera.y != user.y) || (camera.get_virtual_z_level() != user.get_virtual_z_level()))) if(camera.phase_time <= world.time) chronowalk(camera) else @@ -250,7 +250,7 @@ var/mob/holder var/phase_time = 0 var/phase_time_length = 3 - var/obj/screen/chronos_target/target_ui + var/atom/movable/screen/chronos_target/target_ui var/obj/item/clothing/suit/space/chronos/chronosuit /obj/effect/chronos_cam/singularity_act() @@ -296,7 +296,6 @@ /obj/effect/chronos_cam/check_eye(mob/user) if(user != holder) - user.unset_machine() qdel(src) /obj/effect/chronos_cam/on_unset_machine(mob/user) @@ -310,13 +309,13 @@ holder.unset_machine() return ..() -/obj/screen/chronos_target +/atom/movable/screen/chronos_target name = "target display" screen_loc = "CENTER,CENTER" color = list(1,0,0,0, 0,1,0,0.8, 0,0,1,0.933, 0,0,0,0, 0,0,0,0) appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE -/obj/screen/chronos_target/Initialize(mapload, mob/living/carbon/human/user) +/atom/movable/screen/chronos_target/Initialize(mapload, mob/living/carbon/human/user) if(user) vis_contents += user else @@ -330,6 +329,10 @@ check_flags = AB_CHECK_CONSCIOUS //|AB_CHECK_INSIDE var/obj/item/clothing/suit/space/chronos/chronosuit = null +/datum/action/innate/chrono_teleport/Destroy() + chronosuit = null + return ..() + /datum/action/innate/chrono_teleport/IsAvailable() return (chronosuit && chronosuit.activated && chronosuit.camera && !chronosuit.teleporting) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index f2258f8f88c16..b91a3e3e6638f 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -5,18 +5,19 @@ icon_state = "hardsuit0-engineering" item_state = "eng_helm" max_integrity = 300 - armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 50, "acid" = 75) + armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 50, "acid" = 75, "stamina" = 20) var/basestate = "hardsuit" 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) actions_types = list(/datum/action/item_action/toggle_helmet_light) - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF - visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF - var/rad_count = 0 - var/rad_record = 0 - var/grace_count = 0 + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + clothing_flags = NOTCONSUMABLE | STOPSPRESSUREDAMAGE | THICKMATERIAL | SHOWEROKAY | SNUG_FIT + var/current_tick_amount = 0 + var/radiation_count = 0 + var/grace = RAD_GEIGER_GRACE_PERIOD var/datum/looping_sound/geiger/soundloop /obj/item/clothing/head/helmet/space/hardsuit/Initialize() @@ -26,8 +27,12 @@ START_PROCESSING(SSobj, src) /obj/item/clothing/head/helmet/space/hardsuit/Destroy() - . = ..() + if(!QDELETED(suit)) + qdel(suit) + suit = null + QDEL_NULL(soundloop) STOP_PROCESSING(SSobj, src) + return ..() /obj/item/clothing/head/helmet/space/hardsuit/attack_self(mob/user) on = !on @@ -49,12 +54,12 @@ soundloop.stop(user) /obj/item/clothing/head/helmet/space/hardsuit/item_action_slot_check(slot) - if(slot == SLOT_HEAD) + if(slot == ITEM_SLOT_HEAD) return 1 /obj/item/clothing/head/helmet/space/hardsuit/equipped(mob/user, slot) ..() - if(slot != SLOT_HEAD) + if(slot != ITEM_SLOT_HEAD) if(suit) suit.RemoveHelmet() soundloop.stop(user) @@ -66,25 +71,27 @@ /obj/item/clothing/head/helmet/space/hardsuit/proc/display_visor_message(var/msg) var/mob/wearer = loc if(msg && ishuman(wearer)) - wearer.show_message("[icon2html(src, wearer)][msg]", 1) + wearer.show_message("[icon2html(src, wearer)][msg]", MSG_VISUAL) -/obj/item/clothing/head/helmet/space/hardsuit/rad_act(severity) +/obj/item/clothing/head/helmet/space/hardsuit/rad_act(amount) . = ..() - rad_count += severity - -/obj/item/clothing/head/helmet/space/hardsuit/process() - if(!rad_count) - grace_count++ - if(grace_count == 2) - soundloop.last_radiation = 0 + if(amount <= RAD_BACKGROUND_RADIATION) return + current_tick_amount += amount + +/obj/item/clothing/head/helmet/space/hardsuit/process(delta_time) + radiation_count = LPFILTER(radiation_count, current_tick_amount, delta_time, RAD_GEIGER_RC) - grace_count = 0 - rad_record -= rad_record/5 - rad_record += rad_count/5 - rad_count = 0 + if(current_tick_amount) + grace = RAD_GEIGER_GRACE_PERIOD + else + grace -= delta_time + if(grace <= 0) + radiation_count = 0 + + current_tick_amount = 0 - soundloop.last_radiation = rad_record + soundloop.last_radiation = radiation_count /obj/item/clothing/head/helmet/space/hardsuit/emp_act(severity) . = ..() @@ -97,7 +104,7 @@ icon_state = "hardsuit-engineering" item_state = "eng_hardsuit" max_integrity = 300 - armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 50, "acid" = 75) + armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 50, "acid" = 75, "stamina" = 20) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser) siemens_coefficient = 0 var/obj/item/clothing/head/helmet/space/hardsuit/helmet @@ -106,7 +113,6 @@ var/obj/item/tank/jetpack/suit/jetpack = null pocket_storage_component_path = null - /obj/item/clothing/suit/space/hardsuit/Initialize() if(jetpack && ispath(jetpack)) jetpack = new jetpack(src) @@ -121,7 +127,7 @@ if(jetpack) to_chat(user, "[src] already has a jetpack installed.") return - if(src == user.get_item_by_slot(SLOT_WEAR_SUIT)) //Make sure the player is not wearing the suit before applying the upgrade. + if(src == user.get_item_by_slot(ITEM_SLOT_OCLOTHING)) //Make sure the player is not wearing the suit before applying the upgrade. to_chat(user, "You cannot install the upgrade to [src] while wearing it.") return @@ -133,7 +139,7 @@ if(!jetpack) to_chat(user, "[src] has no jetpack installed.") return - if(src == user.get_item_by_slot(SLOT_WEAR_SUIT)) + if(src == user.get_item_by_slot(ITEM_SLOT_OCLOTHING)) to_chat(user, "You cannot remove the jetpack from [src] while wearing it.") return @@ -148,7 +154,7 @@ /obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot) ..() if(jetpack) - if(slot == SLOT_WEAR_SUIT) + if(slot == ITEM_SLOT_OCLOTHING) for(var/X in jetpack.actions) var/datum/action/A = X A.Grant(user) @@ -161,7 +167,7 @@ A.Remove(user) /obj/item/clothing/suit/space/hardsuit/item_action_slot_check(slot) - if(slot == SLOT_WEAR_SUIT) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit. + if(slot == ITEM_SLOT_OCLOTHING) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit. return 1 //Engineering @@ -170,7 +176,7 @@ desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding." icon_state = "hardsuit0-engineering" item_state = "eng_helm" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 12, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 12, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75, "stamina" = 20) item_color = "engineering" resistance_flags = FIRE_PROOF @@ -179,7 +185,7 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding." icon_state = "hardsuit-engineering" item_state = "eng_hardsuit" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75, "stamina" = 20) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine resistance_flags = FIRE_PROOF @@ -190,7 +196,7 @@ icon_state = "hardsuit0-atmospherics" item_state = "atmo_helm" item_color = "atmospherics" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 10, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 10, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 75, "stamina" = 20) heat_protection = HEAD //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -199,7 +205,7 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has thermal shielding." icon_state = "hardsuit-atmospherics" item_state = "atmo_hardsuit" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 10, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 10, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 75, "stamina" = 20) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/atmos @@ -212,7 +218,7 @@ icon_state = "hardsuit0-white" item_state = "ce_helm" item_color = "white" - armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 90) + armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 90, "stamina" = 30) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -221,7 +227,7 @@ name = "advanced hardsuit" desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish." item_state = "ce_hardsuit" - armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 90) + armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 90, "stamina" = 30) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite @@ -237,9 +243,10 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF heat_protection = HEAD - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75, "stamina" = 40) brightness_on = 7 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) + high_pressure_multiplier = 0.6 /obj/item/clothing/head/helmet/space/hardsuit/mining/Initialize() . = ..() @@ -252,15 +259,39 @@ item_state = "mining_hardsuit" max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75, "stamina" = 40) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + high_pressure_multiplier = 0.6 /obj/item/clothing/suit/space/hardsuit/mining/Initialize() . = ..() AddComponent(/datum/component/armor_plate) + //Exploration hardsuit +/obj/item/clothing/head/helmet/space/hardsuit/exploration + name = "exploration hardsuit helmet" + desc = "An advanced space-proof hardsuit designed to protect against off-station threats." + icon_state = "hardsuit0-exploration" + item_state = "death_commando_mask" + item_color = "exploration" + heat_protection = HEAD + armor = list("melee" = 35, "bullet" = 15, "laser" = 20, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75, "stamina" = 20) + light_range = 6 + 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/clothing/suit/space/hardsuit/exploration + icon_state = "hardsuit-exploration" + name = "exploration hardsuit" + desc = "An advanced space-proof hardsuit designed to protect against off-station threats. Despite looking remarkably similar to the mining hardsuit \ + Nanotrasen officials note that it is unique in every way and the design has not been copied in any way." + item_state = "exploration_hardsuit" + armor = list("melee" = 35, "bullet" = 15, "laser" = 20, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75, "stamina" = 20) + allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe) + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/exploration + heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + //Syndicate hardsuit /obj/item/clothing/head/helmet/space/hardsuit/syndi name = "blood-red hardsuit helmet" @@ -269,10 +300,11 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_helm" item_color = "syndi" - armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 40, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90) + armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 40, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90, "stamina" = 60) on = TRUE var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null - actions_types = list(/datum/action/item_action/toggle_helmet_mode) + actions_types = list(/datum/action/item_action/toggle_helmet_mode,\ + /datum/action/item_action/toggle_beacon_hud) visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE|HIDEFACIALHAIR visor_flags = STOPSPRESSUREDAMAGE @@ -281,8 +313,34 @@ /obj/item/clothing/head/helmet/space/hardsuit/syndi/Initialize() . = ..() + //Link if(istype(loc, /obj/item/clothing/suit/space/hardsuit/syndi)) linkedsuit = loc + //NOTE FOR COPY AND PASTING: BEACON MUST BE MADE FIRST + //Add the monitor (Default to null - No tracking) + var/datum/component/tracking_beacon/component_beacon = linkedsuit.AddComponent(/datum/component/tracking_beacon, "synd", null, null, TRUE, "#8f4a4b") + //Add the monitor (Default to null - No tracking) + component_beacon.attached_monitor = AddComponent(/datum/component/team_monitor, "synd", null, component_beacon) + else + AddComponent(/datum/component/team_monitor, "synd", null) + +/obj/item/clothing/head/helmet/space/hardsuit/syndi/ui_action_click(mob/user, datum/action) + switch(action.type) + if(/datum/action/item_action/toggle_helmet_mode) + attack_self(user) + if(/datum/action/item_action/toggle_beacon_hud) + toggle_hud(user) + +/obj/item/clothing/head/helmet/space/hardsuit/syndi/proc/toggle_hud(mob/user) + var/datum/component/team_monitor/monitor = GetComponent(/datum/component/team_monitor) + if(!monitor) + to_chat(user, "The suit is not fitted with a tracking beacon.") + return + monitor.toggle_hud(!monitor.hud_visible, user) + if(monitor.hud_visible) + to_chat(user, "You toggle the heads up display of your suit.") + else + to_chat(user, "You disable the heads up display of your suit.") /obj/item/clothing/head/helmet/space/hardsuit/syndi/attack_self(mob/user) //Toggle Helmet if(!isturf(user.loc)) @@ -291,22 +349,10 @@ on = !on if(on || force) to_chat(user, "You switch your hardsuit to EVA mode, sacrificing speed for space protection.") - name = initial(name) - desc = initial(desc) - set_light(brightness_on) - clothing_flags |= visor_flags - flags_cover |= HEADCOVERSEYES | HEADCOVERSMOUTH - flags_inv |= visor_flags_inv - cold_protection |= HEAD + activate_space_mode() else to_chat(user, "You switch your hardsuit to combat mode and can now run at full speed.") - name += " (combat)" - desc = alt_desc - set_light(0) - clothing_flags &= ~visor_flags - flags_cover &= ~(HEADCOVERSEYES | HEADCOVERSMOUTH) - flags_inv &= ~visor_flags_inv - cold_protection &= ~HEAD + activate_combat_mode() update_icon() playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1) toggle_hardsuit_mode(user) @@ -320,25 +366,32 @@ /obj/item/clothing/head/helmet/space/hardsuit/syndi/proc/toggle_hardsuit_mode(mob/user) //Helmet Toggles Suit Mode if(linkedsuit) - if(on) - linkedsuit.name = initial(linkedsuit.name) - linkedsuit.desc = initial(linkedsuit.desc) - linkedsuit.slowdown = 1 - linkedsuit.clothing_flags |= STOPSPRESSUREDAMAGE - linkedsuit.cold_protection |= CHEST | GROIN | LEGS | FEET | ARMS | HANDS - else - linkedsuit.name += " (combat)" - linkedsuit.desc = linkedsuit.alt_desc - linkedsuit.slowdown = 0 - linkedsuit.clothing_flags &= ~STOPSPRESSUREDAMAGE - linkedsuit.cold_protection &= ~(CHEST | GROIN | LEGS | FEET | ARMS | HANDS) - linkedsuit.icon_state = "hardsuit[on]-[item_color]" linkedsuit.update_icon() - user.update_inv_wear_suit() - user.update_inv_w_uniform() - user.update_equipment_speed_mods() + if(on) + linkedsuit.activate_space_mode() + else + linkedsuit.activate_combat_mode() + +/obj/item/clothing/head/helmet/space/hardsuit/syndi/proc/activate_space_mode() + name = initial(name) + desc = initial(desc) + set_light(brightness_on) + clothing_flags |= visor_flags + flags_cover |= HEADCOVERSEYES | HEADCOVERSMOUTH + flags_inv |= visor_flags_inv + cold_protection |= HEAD + on = TRUE +/obj/item/clothing/head/helmet/space/hardsuit/syndi/proc/activate_combat_mode() + name = "[initial(name)] (combat)" + desc = alt_desc + set_light(0) + clothing_flags &= ~visor_flags + flags_cover &= ~(HEADCOVERSEYES | HEADCOVERSMOUTH) + flags_inv &= ~visor_flags_inv + cold_protection &= ~HEAD + on = FALSE /obj/item/clothing/suit/space/hardsuit/syndi name = "blood-red hardsuit" @@ -348,10 +401,84 @@ item_state = "syndie_hardsuit" item_color = "syndi" w_class = WEIGHT_CLASS_NORMAL - armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 40, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90) + armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 40, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90, "stamina" = 60) 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/syndi jetpack = /obj/item/tank/jetpack/suit + item_flags = ILLEGAL //Syndicate only and difficult to obtain outside of uplink anyway. Nukie hardsuits on the ship are illegal. + actions_types = list( + /datum/action/item_action/toggle_helmet, + /datum/action/item_action/toggle_beacon, + /datum/action/item_action/toggle_beacon_frequency + ) + +/obj/item/clothing/suit/space/hardsuit/syndi/ui_action_click(mob/user, datum/actiontype) + switch(actiontype.type) + if(/datum/action/item_action/toggle_helmet) + ToggleHelmet() + if(/datum/action/item_action/toggle_beacon) + toggle_beacon(user) + if(/datum/action/item_action/toggle_beacon_frequency) + set_beacon_freq(user) + +/obj/item/clothing/suit/space/hardsuit/syndi/proc/toggle_beacon(mob/user) + var/datum/component/tracking_beacon/beacon = GetComponent(/datum/component/tracking_beacon) + if(!beacon) + to_chat(user, "The suit is not fitted with a tracking beacon.") + return + beacon.toggle_visibility(!beacon.visible) + if(beacon.visible) + to_chat(user, "You enable the tracking beacon on [src]. Anybody on the same frequency will now be able to track your location.") + else + to_chat(user, "You disable the tracking beacon on [src].") + +/obj/item/clothing/suit/space/hardsuit/syndi/proc/set_beacon_freq(mob/user) + var/datum/component/tracking_beacon/beacon = GetComponent(/datum/component/tracking_beacon) + if(!beacon) + to_chat(user, "The suit is not fitted with a tracking beacon.") + return + beacon.change_frequency(user) + +/obj/item/clothing/suit/space/hardsuit/syndi/RemoveHelmet() + . = ..() + //Update helmet to non combat mode + var/obj/item/clothing/head/helmet/space/hardsuit/syndi/syndieHelmet = helmet + if(!syndieHelmet) + return + syndieHelmet.activate_combat_mode() + syndieHelmet.update_icon() + for(var/X in syndieHelmet.actions) + var/datum/action/A = X + A.UpdateButtonIcon() + //Update the icon_state first + icon_state = "hardsuit[syndieHelmet.on]-[syndieHelmet.item_color]" + update_icon() + //Actually apply the non-combat mode to suit and update the suit overlay + activate_combat_mode() + +/obj/item/clothing/suit/space/hardsuit/syndi/proc/activate_space_mode() + name = initial(name) + desc = initial(desc) + slowdown = 1 + clothing_flags |= STOPSPRESSUREDAMAGE + cold_protection |= CHEST | GROIN | LEGS | FEET | ARMS | HANDS + if(ishuman(loc)) + var/mob/living/carbon/H = loc + H.update_equipment_speed_mods() + H.update_inv_wear_suit() + H.update_inv_w_uniform() + +/obj/item/clothing/suit/space/hardsuit/syndi/proc/activate_combat_mode() + name = "[initial(name)] (combat)" + desc = alt_desc + slowdown = 0 + clothing_flags &= ~STOPSPRESSUREDAMAGE + cold_protection &= ~(CHEST | GROIN | LEGS | FEET | ARMS | HANDS) + if(ishuman(loc)) + var/mob/living/carbon/H = loc + H.update_equipment_speed_mods() + H.update_inv_wear_suit() + H.update_inv_w_uniform() //Elite Syndie suit /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite @@ -360,7 +487,7 @@ 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" - armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 60, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100) + armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 60, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100, "stamina" = 80) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -372,7 +499,7 @@ icon_state = "hardsuit0-syndielite" item_color = "syndielite" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite - armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 60, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100) + armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 60, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100, "stamina" = 80) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -407,7 +534,7 @@ item_state = "wiz_helm" item_color = "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" = 50, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "stamina" = 70) heat_protection = HEAD //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -418,7 +545,7 @@ item_state = "wiz_hardsuit" w_class = WEIGHT_CLASS_NORMAL resistance_flags = FIRE_PROOF | ACID_PROOF - armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "stamina" = 70) allowed = list(/obj/item/teleportation_scroll, /obj/item/tank/internals) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -439,8 +566,8 @@ item_state = "medical_helm" item_color = "medical" flash_protect = 0 - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75) - scan_reagents = TRUE + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75, "stamina" = 20) + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SHOWEROKAY | SNUG_FIT | SCAN_REAGENTS /obj/item/clothing/suit/space/hardsuit/medical icon_state = "hardsuit-medical" @@ -448,7 +575,7 @@ desc = "A special suit that protects against hazardous, low pressure environments. Built with lightweight materials for easier movement." item_state = "medical_hardsuit" 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" = 15, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75, "stamina" = 20) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/medical slowdown = 0.5 @@ -469,9 +596,9 @@ item_color = "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" = 15, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80, "stamina" = 30) var/obj/machinery/doppler_array/integrated/bomb_radar - scan_reagents = TRUE + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SHOWEROKAY | SNUG_FIT | SCAN_REAGENTS actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_research_scanner) /obj/item/clothing/head/helmet/space/hardsuit/rd/Initialize() @@ -480,7 +607,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/rd/equipped(mob/living/carbon/human/user, slot) ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_DIAGNOSTIC_BASIC] DHUD.add_hud_to(user) @@ -499,7 +626,7 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT //Same as an emergency firesuit. Not ideal for extended exposure. allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/gun/energy/wormhole_projector, /obj/item/hand_tele, /obj/item/aicard) - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80, "stamina" = 30) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/rd @@ -511,7 +638,7 @@ icon_state = "hardsuit0-sec" item_state = "sec_helm" item_color = "sec" - armor = list("melee" = 35, "bullet" = 15, "laser" = 30,"energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75) + armor = list("melee" = 35, "bullet" = 15, "laser" = 30,"energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75, "stamina" = 50) /obj/item/clothing/suit/space/hardsuit/security @@ -519,7 +646,7 @@ name = "security hardsuit" desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor." item_state = "sec_hardsuit" - armor = list("melee" = 35, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75) + armor = list("melee" = 35, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75, "stamina" = 50) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security /obj/item/clothing/suit/space/hardsuit/security/Initialize() @@ -532,14 +659,14 @@ 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" - armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95) + armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95, "stamina" = 60) /obj/item/clothing/suit/space/hardsuit/security/hos icon_state = "hardsuit-hos" name = "head of security's hardsuit" desc = "A special bulky suit that protects against hazardous, low pressure environments. Has an additional layer of armor." - armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95) + armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95, "stamina" = 60) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos jetpack = /obj/item/tank/jetpack/suit @@ -549,7 +676,7 @@ icon_state = "swat2helm" item_state = "swat2helm" desc = "A tactical SWAT helmet MK.II." - armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 60, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 60, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "stamina" = 60) resistance_flags = FIRE_PROOF | ACID_PROOF heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -562,7 +689,7 @@ desc = "A MK.II SWAT suit with streamlined joints and armor made out of superior materials, insulated against intense heat. The most advanced tactical armor available." icon_state = "swat2" item_state = "swat2" - armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 60, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 60, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "stamina" = 60) resistance_flags = FIRE_PROOF | ACID_PROOF heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT //this needed to be added a long fucking time ago @@ -592,7 +719,7 @@ desc = "A special helmet designed for work in a hazardous, low-humor environment. Has radiation shielding." icon_state = "hardsuit0-clown" item_state = "hardsuit0-clown" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30, "stamina" = 20) item_color = "clown" /obj/item/clothing/suit/space/hardsuit/clown @@ -600,7 +727,7 @@ desc = "A special suit that protects against hazardous, low humor environments. Has radiation shielding. Only a true clown can wear it." icon_state = "hardsuit-clown" item_state = "clown_hardsuit" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30, "stamina" = 20) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/clown /obj/item/clothing/suit/space/hardsuit/clown/mob_can_equip(mob/M, slot) @@ -618,7 +745,7 @@ desc = "Early prototype RIG hardsuit helmet, designed to quickly shift over a user's head. Design constraints of the helmet mean it has no inbuilt cameras, thus it restricts the users visability." icon_state = "hardsuit0-ancient" item_state = "anc_helm" - armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75, "stamina" = 30) item_color = "ancient" resistance_flags = FIRE_PROOF @@ -627,44 +754,11 @@ desc = "Prototype powered RIG hardsuit. Provides excellent protection from the elements of space while being comfortable to move around in, thanks to the powered locomotives. Remains very bulky however." icon_state = "hardsuit-ancient" item_state = "anc_hardsuit" - armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75, "stamina" = 30) slowdown = 3 helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient resistance_flags = FIRE_PROOF - var/footstep = 1 - var/mob/listeningTo - -/obj/item/clothing/suit/space/hardsuit/ancient/proc/on_mob_move() - var/mob/living/carbon/human/H = loc - if(!istype(H) || H.wear_suit != src) - return - if(footstep > 1) - playsound(src, 'sound/effects/servostep.ogg', 100, 1) - footstep = 0 - else - footstep++ - -/obj/item/clothing/suit/space/hardsuit/ancient/equipped(mob/user, slot) - . = ..() - if(slot != SLOT_WEAR_SUIT) - if(listeningTo) - UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) - return - if(listeningTo == user) - return - if(listeningTo) - UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) - RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/on_mob_move) - listeningTo = user - -/obj/item/clothing/suit/space/hardsuit/ancient/dropped() - . = ..() - if(listeningTo) - UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) - -/obj/item/clothing/suit/space/hardsuit/ancient/Destroy() - listeningTo = null - return ..() + move_sound = list('sound/effects/servostep.ogg') /////////////SHIELDED////////////////////////////////// @@ -674,7 +768,7 @@ icon_state = "hardsuit-hos" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos allowed = null - armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "stamina" = 60) resistance_flags = FIRE_PROOF | ACID_PROOF var/current_charges = 3 var/max_charges = 3 //How many charges total the shielding has @@ -696,6 +790,11 @@ s.set_up(2, 1, src) s.start() owner.visible_message("[owner]'s shields deflect [attack_text] in a shower of sparks!") + if(isprojectile(hitby)) + var/obj/item/projectile/P = hitby + //Fake bullets just disintegrate + if(P.martial_arts_no_deflect) + return TRUE current_charges-- if(recharge_rate) START_PROCESSING(SSobj, src) @@ -703,8 +802,8 @@ owner.visible_message("[owner]'s shield overloads!") shield_state = "broken" owner.update_inv_wear_suit() - return 1 - return 0 + return TRUE + return FALSE /obj/item/clothing/suit/space/hardsuit/shielded/Destroy() @@ -741,7 +840,7 @@ item_color = "ert_medical" // Adding TRAIT_NODROP is done when the CTF spawner equips people 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) + armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95, "stamina" = 0) slowdown = 0 max_charges = 5 @@ -769,7 +868,7 @@ icon_state = "hardsuit0-ert_medical" item_state = "hardsuit0-ert_medical" item_color = "ert_medical" - armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95) + armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95, "stamina" = 0) /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf/red @@ -796,12 +895,18 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_hardsuit" item_color = "syndi" - armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 40, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 40, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "stamina" = 60) 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 slowdown = 0 shield_state = "shield-red" shield_on = "shield-red" + actions_types = list( + /datum/action/item_action/toggle_helmet, + /datum/action/item_action/toggle_beacon, + /datum/action/item_action/toggle_beacon_frequency + ) + jetpack = /obj/item/tank/jetpack/suit /obj/item/clothing/suit/space/hardsuit/shielded/syndi/multitool_act(mob/living/user, obj/item/I) . = ..() @@ -820,9 +925,34 @@ to_chat(user, "You update the hardsuit's hardware, changing back the shield's color to red.") user.update_inv_wear_suit() -/obj/item/clothing/suit/space/hardsuit/shielded/syndi/Initialize() - jetpack = new /obj/item/tank/jetpack/suit(src) - . = ..() +/obj/item/clothing/suit/space/hardsuit/shielded/syndi/ui_action_click(mob/user, datum/actiontype) + switch(actiontype.type) + if(/datum/action/item_action/toggle_helmet) + ToggleHelmet() + if(/datum/action/item_action/toggle_beacon) + toggle_beacon(user) + if(/datum/action/item_action/toggle_beacon_frequency) + set_beacon_freq(user) + +/obj/item/clothing/suit/space/hardsuit/shielded/syndi/proc/toggle_beacon(mob/user) + var/datum/component/tracking_beacon/beacon = GetComponent(/datum/component/tracking_beacon) + if(!beacon) + to_chat(user, "The suit is not fitted with a tracking beacon.") + return + beacon.toggle_visibility(!beacon.visible) + if(beacon.visible) + to_chat(user, "You enable the tracking beacon on [src]. Anybody on the same frequency will now be able to track your location.") + else + to_chat(user, "You disable the tracking beacon on [src].") + +/obj/item/clothing/suit/space/hardsuit/shielded/syndi/proc/set_beacon_freq(mob/user) + var/datum/component/tracking_beacon/beacon = GetComponent(/datum/component/tracking_beacon) + if(!beacon) + to_chat(user, "The suit is not fitted with a tracking beacon.") + return + beacon.change_frequency(user) + +//Helmet - With built in HUD /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi name = "blood-red hardsuit helmet" @@ -830,7 +960,39 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_helm" item_color = "syndi" - armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 40, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 40, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "stamina" = 60) + actions_types = list(/datum/action/item_action/toggle_helmet_light,\ + /datum/action/item_action/toggle_beacon_hud) + +/obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi/Initialize() + . = ..() + if(istype(loc, /obj/item/clothing/suit/space/hardsuit/shielded/syndi)) + var/obj/linkedsuit = loc + //NOTE FOR COPY AND PASTING: BEACON MUST BE MADE FIRST + //Add the monitor (Default to null - No tracking) + var/datum/component/tracking_beacon/component_beacon = linkedsuit.AddComponent(/datum/component/tracking_beacon, "synd", null, null, TRUE, "#8f4a4b") + //Add the monitor (Default to null - No tracking) + component_beacon.attached_monitor = AddComponent(/datum/component/team_monitor, "synd", null, component_beacon) + else + AddComponent(/datum/component/team_monitor, "synd", null) + +/obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi/ui_action_click(mob/user, datum/action) + switch(action.type) + if(/datum/action/item_action/toggle_helmet_mode) + toggle_helmlight() + if(/datum/action/item_action/toggle_beacon_hud) + toggle_hud(user) + +/obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi/proc/toggle_hud(mob/user) + var/datum/component/team_monitor/monitor = GetComponent(/datum/component/team_monitor) + if(!monitor) + to_chat(user, "The suit is not fitted with a tracking beacon.") + return + monitor.toggle_hud(!monitor.hud_visible, user) + if(monitor.hud_visible) + to_chat(user, "You toggle the heads up display of your suit.") + else + to_chat(user, "You disable the heads up display of your suit.") ///SWAT version /obj/item/clothing/suit/space/hardsuit/shielded/swat @@ -842,7 +1004,7 @@ max_charges = 4 current_charges = 4 recharge_delay = 15 - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" =60, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" =60, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT jetpack = /obj/item/tank/jetpack/suit @@ -855,7 +1017,7 @@ icon_state = "deathsquad" item_state = "deathsquad" item_color = "syndi" - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 60, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 60, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT actions_types = list() @@ -874,7 +1036,7 @@ icon_state = "hardsuit0-clown" item_state = "hardsuit0-clown" item_color = "clown" - + // Doomguy ERT version /obj/item/clothing/suit/space/hardsuit/shielded/doomguy @@ -885,7 +1047,7 @@ max_charges = 1 current_charges = 1 recharge_delay = 100 - armor = list("melee" = 135, "bullet" = 135, "laser" = 135, "energy" = 135, "bomb" = 135, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 135, "bullet" = 135, "laser" = 135, "energy" = 135, "bomb" = 135, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF | LAVA_PROOF @@ -897,7 +1059,7 @@ desc = "A dusty old helmet, somehow capable of resisting the strongest of blows." icon_state = "doomguy" item_state = "doomguy" - armor = list("melee" = 135, "bullet" = 135, "laser" = 135, "energy" = 135, "bomb" = 135, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 135, "bullet" = 135, "laser" = 135, "energy" = 135, "bomb" = 135, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - actions_types = list() \ No newline at end of file + actions_types = list() diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index cdedfaaff8a8e..ab088b63c3190 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -22,7 +22,7 @@ Contains: desc = "An advanced tactical space helmet." icon_state = "deathsquad" item_state = "deathsquad" - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -37,12 +37,13 @@ Contains: icon_state = "deathsquad" 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" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF helmettype = /obj/item/clothing/head/helmet/space/hardsuit/deathsquad dog_fashion = /datum/dog_fashion/back/deathsquad + move_sound = list('sound/effects/suitstep1.ogg', 'sound/effects/suitstep2.ogg') //NEW SWAT suit /obj/item/clothing/suit/space/swat @@ -51,9 +52,10 @@ Contains: icon_state = "heavy" 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" = 40, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 50, "bio" = 90, "rad" = 20, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 50, "bio" = 90, "rad" = 20, "fire" = 100, "acid" = 100, "stamina" = 60) strip_delay = 120 resistance_flags = FIRE_PROOF | ACID_PROOF + move_sound = list('sound/effects/suitstep1.ogg', 'sound/effects/suitstep2.ogg') /obj/item/clothing/head/helmet/space/beret name = "officer's beret" @@ -62,7 +64,7 @@ Contains: dynamic_hair_suffix = "+generic" dynamic_fhair_suffix = "+generic" flags_inv = 0 - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -77,7 +79,7 @@ Contains: flags_inv = 0 w_class = WEIGHT_CLASS_NORMAL 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) - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -134,7 +136,7 @@ Contains: desc = "Yarr." icon_state = "pirate" item_state = "pirate" - armor = list("melee" = 30, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 60, "acid" = 75) + armor = list("melee" = 30, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 60, "acid" = 75, "stamina" = 20) flags_inv = HIDEHAIR strip_delay = 40 equip_delay_other = 20 @@ -154,7 +156,7 @@ Contains: flags_inv = 0 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/melee/transforming/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/food/drinks/bottle/rum) slowdown = 0 - armor = list("melee" = 30, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 60, "acid" = 75) + armor = list("melee" = 30, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 60, "acid" = 75, "stamina" = 20) strip_delay = 40 equip_delay_other = 20 @@ -165,15 +167,48 @@ Contains: icon_state = "hardsuit0-ert_commander" item_state = "hardsuit0-ert_commander" item_color = "ert_commander" - armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80) + armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80, "stamina" = 70) strip_delay = 130 brightness_on = 7 resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + actions_types = list( + /datum/action/item_action/toggle_helmet_light, + /datum/action/item_action/toggle_beacon_hud + ) + var/beacon_colour = "#4b48ec" /obj/item/clothing/head/helmet/space/hardsuit/ert/Initialize() . = ..() ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT) + //Link + if(istype(loc, /obj/item/clothing/suit/space/hardsuit/ert)) + var/obj/linkedsuit = loc + //NOTE FOR COPY AND PASTING: BEACON MUST BE MADE FIRST + //Add the monitor (Default to null - No tracking) + var/datum/component/tracking_beacon/component_beacon = linkedsuit.AddComponent(/datum/component/tracking_beacon, "cent", null, null, TRUE, beacon_colour) + //Add the monitor (Default to null - No tracking) + component_beacon.attached_monitor = AddComponent(/datum/component/team_monitor, "cent", null, component_beacon) + else + AddComponent(/datum/component/team_monitor, "cent", null) + +/obj/item/clothing/head/helmet/space/hardsuit/ert/ui_action_click(mob/user, datum/action) + switch(action.type) + if(/datum/action/item_action/toggle_helmet_light) + toggle_helmlight() + if(/datum/action/item_action/toggle_beacon_hud) + toggle_hud(user) + +/obj/item/clothing/head/helmet/space/hardsuit/ert/proc/toggle_hud(mob/user) + var/datum/component/team_monitor/monitor = GetComponent(/datum/component/team_monitor) + if(!monitor) + to_chat(user, "The suit is not fitted with a tracking beacon.") + return + monitor.toggle_hud(!monitor.hud_visible, user) + if(monitor.hud_visible) + to_chat(user, "You toggle the heads up display of your suit.") + else + to_chat(user, "You disable the heads up display of your suit.") /obj/item/clothing/suit/space/hardsuit/ert name = "emergency response team commander hardsuit" @@ -182,12 +217,44 @@ Contains: item_state = "ert_command" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert 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) - armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80) + armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80, "stamina" = 70) slowdown = 0 strip_delay = 130 resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT jetpack = /obj/item/tank/jetpack/suit + actions_types = list( + /datum/action/item_action/toggle_helmet, + /datum/action/item_action/toggle_beacon, + /datum/action/item_action/toggle_beacon_frequency + ) + +/obj/item/clothing/suit/space/hardsuit/ert/ui_action_click(mob/user, datum/actiontype) + switch(actiontype.type) + if(/datum/action/item_action/toggle_helmet) + ToggleHelmet() + if(/datum/action/item_action/toggle_beacon) + toggle_beacon(user) + if(/datum/action/item_action/toggle_beacon_frequency) + set_beacon_freq(user) + +/obj/item/clothing/suit/space/hardsuit/ert/proc/toggle_beacon(mob/user) + var/datum/component/tracking_beacon/beacon = GetComponent(/datum/component/tracking_beacon) + if(!beacon) + to_chat(user, "The suit is not fitted with a tracking beacon.") + return + beacon.toggle_visibility(!beacon.visible) + if(beacon.visible) + to_chat(user, "You enable the tracking beacon on [src]. Anybody on the same frequency will now be able to track your location.") + else + to_chat(user, "You disable the tracking beacon on [src].") + +/obj/item/clothing/suit/space/hardsuit/ert/proc/set_beacon_freq(mob/user) + var/datum/component/tracking_beacon/beacon = GetComponent(/datum/component/tracking_beacon) + if(!beacon) + to_chat(user, "The suit is not fitted with a tracking beacon.") + return + beacon.change_frequency(user) //ERT Security /obj/item/clothing/head/helmet/space/hardsuit/ert/sec @@ -196,6 +263,7 @@ Contains: icon_state = "hardsuit0-ert_security" item_state = "hardsuit0-ert_security" item_color = "ert_security" + beacon_colour = "#ec4848" /obj/item/clothing/suit/space/hardsuit/ert/sec name = "emergency response team security hardsuit" @@ -212,6 +280,7 @@ Contains: icon_state = "hardsuit0-ert_engineer" item_state = "hardsuit0-ert_engineer" item_color = "ert_engineer" + beacon_colour = "#ecaa48" /obj/item/clothing/suit/space/hardsuit/ert/engi name = "emergency response team engineering hardsuit" @@ -228,6 +297,7 @@ Contains: icon_state = "hardsuit0-ert_medical" item_state = "hardsuit0-ert_medical" item_color = "ert_medical" + beacon_colour = "#88ecec" /obj/item/clothing/suit/space/hardsuit/ert/med name = "emergency response team medical hardsuit" @@ -244,6 +314,7 @@ Contains: icon_state = "hardsuit0-ert_janitor" item_state = "hardsuit0-ert_janitor" item_color = "ert_janitor" + beacon_colour = "#be43ce" /obj/item/clothing/suit/space/hardsuit/ert/jani name = "emergency response team janitorial hardsuit" @@ -258,7 +329,7 @@ Contains: icon_state = "space" item_state = "eva_suit" desc = "A lightweight space suit with the basic ability to protect the wearer from the vacuum of space during emergencies." - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 65) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 65, "stamina" = 0) /obj/item/clothing/head/helmet/space/eva name = "EVA helmet" @@ -266,14 +337,14 @@ Contains: item_state = "eva_helmet" desc = "A lightweight space helmet with the basic ability to protect the wearer from the vacuum of space during emergencies." flash_protect = 0 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 65) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 65, "stamina" = 0) /obj/item/clothing/head/helmet/space/freedom name = "eagle helmet" desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle." icon_state = "griffinhat" item_state = "griffinhat" - armor = list("melee" = 20, "bullet" = 40, "laser" = 30, "energy" = 25, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80) + armor = list("melee" = 20, "bullet" = 40, "laser" = 30, "energy" = 25, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80, "stamina" = 10) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = ACID_PROOF | FIRE_PROOF @@ -284,7 +355,7 @@ Contains: icon_state = "freedom" item_state = "freedom" 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) - armor = list("melee" = 20, "bullet" = 40, "laser" = 30,"energy" = 25, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80) + armor = list("melee" = 20, "bullet" = 40, "laser" = 30,"energy" = 25, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80, "stamina" = 10) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = ACID_PROOF | FIRE_PROOF @@ -296,7 +367,7 @@ Contains: desc = "Spaceworthy and it looks like a space carp's head, smells like one too." icon_state = "carp_helm" item_state = "syndicate" - armor = list("melee" = 20, "bullet" = 10, "laser" = 20, "energy" = 20, "bomb" = 30, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75) + armor = list("melee" = 20, "bullet" = 10, "laser" = 20, "energy" = 20, "bomb" = 30, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75, "stamina" = 40) brightness_on = 0 //luminosity when on actions_types = list() @@ -310,13 +381,13 @@ Contains: icon_state = "carp_suit" item_state = "space_suit_syndicate" slowdown = 0 //Space carp magic, never stop believing - armor = list("melee" = 20, "bullet" = 10, "laser" = 20, "energy" = 20, "bomb" = 30, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75) + armor = list("melee" = 20, "bullet" = 10, "laser" = 20, "energy" = 20, "bomb" = 30, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75, "stamina" = 40) allowed = list(/obj/item/tank/internals, /obj/item/pneumatic_cannon/speargun, /obj/item/toy/plush/carpplushie/dehy_carp, /obj/item/toy/plush/carpplushie, /obj/item/reagent_containers/food/snacks/carpmeat) //I'm giving you a hint here helmettype = /obj/item/clothing/head/helmet/space/hardsuit/carp /obj/item/clothing/head/helmet/space/hardsuit/carp/equipped(mob/living/carbon/human/user, slot) ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) user.faction |= "carp" /obj/item/clothing/head/helmet/space/hardsuit/carp/dropped(mob/living/carbon/human/user) @@ -333,6 +404,7 @@ Contains: max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT actions_types = list() resistance_flags = FIRE_PROOF + beacon_colour = "#9ddb56" /obj/item/clothing/suit/space/hardsuit/ert/paranormal name = "paranormal response team hardsuit" @@ -347,36 +419,58 @@ Contains: . = ..() AddComponent(/datum/component/anti_magic, TRUE, TRUE) -/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor - name = "inquisitor's hardsuit" - icon_state = "hardsuit-inq" - item_state = "hardsuit-inq" - helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor +//Lavaland suits -/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor - name = "inquisitor's helmet" - icon_state = "hardsuit0-inq" - item_state = "hardsuit0-inq" +/obj/item/clothing/suit/space/hardsuit/ert/paranormal/lavaland + desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats with armor designed specifically for low pressures." + high_pressure_multiplier = 0.4 + +/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/lavaland + high_pressure_multiplier = 0.4 -/obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker +/obj/item/clothing/suit/space/hardsuit/ert/paranormal/lavaland/beserker name = "champion's hardsuit" desc = "Voices echo from the hardsuit, driving the user insane." icon_state = "hardsuit-beserker" item_state = "hardsuit-beserker" - helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/lavaland/beserker -/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker +/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/lavaland/beserker name = "champion's helmet" desc = "Peering into the eyes of the helmet is enough to seal damnation." icon_state = "hardsuit0-beserker" item_state = "hardsuit0-beserker" +/obj/item/clothing/suit/space/hardsuit/ert/paranormal/lavaland/inquisitor + name = "inquisitor's hardsuit" + icon_state = "hardsuit-inq" + item_state = "hardsuit-inq" + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/lavaland/inquisitor + +/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/lavaland/inquisitor + name = "inquisitor's helmet" + icon_state = "hardsuit0-inq" + item_state = "hardsuit0-inq" + +//End lavaland suits + +/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor + name = "inquisitor's hardsuit" + icon_state = "hardsuit-inq" + item_state = "hardsuit-inq" + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor + +/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor + name = "inquisitor's helmet" + icon_state = "hardsuit0-inq" + item_state = "hardsuit0-inq" + /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." icon_state = "syndicate-helm-orange" item_state = "syndicate-helm-orange" - armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 10, "fire" = 0, "acid" = 0) + armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 10, "fire" = 0, "acid" = 0, "stamina" = 0) strip_delay = 65 flash_protect = 0 @@ -387,7 +481,7 @@ Contains: icon_state = "syndicate-orange" item_state = "syndicate-orange" slowdown = 2 - armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 10, "fire" = 0, "acid" = 0) + armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 10, "fire" = 0, "acid" = 0, "stamina" = 0) strip_delay = 65 w_class = WEIGHT_CLASS_NORMAL @@ -407,20 +501,20 @@ Contains: 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) + armor = list(melee = 60, bullet = 40, laser = 40, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100, stamina = 70) strip_delay = 130 resistance_flags = FIRE_PROOF | ACID_PROOF -/obj/item/clothing/head/helmet/space/skinsuit +/obj/item/clothing/head/helmet/space/hardsuit/skinsuit name = "skinsuit helmet" icon = 'icons/obj/clothing/hats.dmi' - w_class = WEIGHT_CLASS_SMALL //Don't question it. We want it to fit back in the box alternate_worn_icon = 'icons/mob/head.dmi' icon_state = "skinsuit_helmet" item_state = "skinsuit_helmet" + max_integrity = 200 desc = "An airtight helmet meant to protect the wearer during emergency situations." permeability_coefficient = 0.01 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 20, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 20, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) min_cold_protection_temperature = EMERGENCY_HELM_MIN_TEMP_PROTECT heat_protection = NONE flash_protect = 0 @@ -428,51 +522,33 @@ Contains: flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR clothing_flags = STOPSPRESSUREDAMAGE | SHOWEROKAY | SNUG_FIT max_heat_protection_temperature = 100 + brightness_on = null + actions_types = null + +/obj/item/clothing/head/helmet/space/hardsuit/skinsuit/attack_self(mob/user) + return -/obj/item/clothing/suit/space/skinsuit +/obj/item/clothing/head/helmet/space/hardsuit/skinsuit/emp_act(severity) + return + +/obj/item/clothing/suit/space/hardsuit/skinsuit name = "skinsuit" desc = "A slim, compression-based spacesuit meant to protect the user during emergency situations. It's only a little warmer than your uniform." icon = 'icons/obj/clothing/suits.dmi' alternate_worn_icon = 'icons/mob/suit.dmi' - icon_state = "skinsuit_rolled" + icon_state = "skinsuit" + item_state = "s_suit" + max_integrity = 200 slowdown = 3 //Higher is slower - w_class = WEIGHT_CLASS_SMALL clothing_flags = STOPSPRESSUREDAMAGE | SHOWEROKAY gas_transfer_coefficient = 0.5 permeability_coefficient = 0.5 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) + allowed = list(/obj/item/flashlight, /obj/item/tank/internals) min_cold_protection_temperature = EMERGENCY_SUIT_MIN_TEMP_PROTECT heat_protection = NONE max_heat_protection_temperature = 100 - var/rolled_up = TRUE - -/obj/item/clothing/suit/space/skinsuit/mob_can_equip(mob/M, mob/living/equipper, slot) - if(rolled_up && slot == SLOT_WEAR_SUIT) - if(equipper) - to_chat(equipper, "You need to unroll \the [src], silly.") - else - to_chat(M, "You need to unroll \the [src], silly.") - return FALSE - return ..() - -/obj/item/clothing/suit/space/skinsuit/examine(mob/user) - . = ..() - if(rolled_up) - . += "It is currently rolled up." - else - . += "It can be rolled up to fit in a box." - + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/skinsuit -/obj/item/clothing/suit/space/skinsuit/attack_self(mob/user) - if(rolled_up) - to_chat(user, "You unroll \the [src].") - icon_state = "skinsuit" - update_icon() - w_class = WEIGHT_CLASS_NORMAL - else - to_chat(user, "You roll up \the [src].") - icon_state = "skinsuit_rolled" - update_icon() - w_class = WEIGHT_CLASS_SMALL - - rolled_up = !rolled_up +/obj/item/clothing/suit/space/hardsuit/skinsuit/attackby(obj/item/I, mob/user, params) + return diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index b4bd2f913c8c5..e71c5dfe6bffc 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -5,7 +5,7 @@ name = "EVA plasma envirosuit" desc = "A special plasma containment suit designed to be space-worthy, as well as worn over other clothing. Like its smaller counterpart, it can automatically extinguish the wearer in a crisis, and holds twice as many charges." allowed = list(/obj/item/gun, /obj/item/ammo_casing, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword, /obj/item/restraints/handcuffs, /obj/item/tank) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75, "stamina" = 0) resistance_flags = FIRE_PROOF icon_state = "plasmaman_suit" item_state = "plasmaman_suit" @@ -43,7 +43,7 @@ strip_delay = 80 flash_protect = 2 tint = 2 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75, "stamina" = 0) resistance_flags = FIRE_PROOF var/brightness_on = 4 //luminosity when the light is on var/on = FALSE @@ -123,6 +123,8 @@ ///gets called when receiving the CLEAN_ACT signal from something, i.e soap or a shower. exists to remove any smiley faces drawn on the helmet. /obj/item/clothing/head/helmet/space/plasmaman/proc/wipe_that_smile_off_your_face() + SIGNAL_HANDLER + if(smile) smile = FALSE cut_overlays() @@ -147,38 +149,38 @@ A.UpdateButtonIcon() /obj/item/clothing/head/helmet/space/plasmaman/security - name = "security plasma envirosuit helmet" - desc = "A plasmaman containment helmet designed for security officers, protecting them from being flashed and burning alive, along-side other undesirables." + name = "security envirosuit helmet" + desc = "A plasmaman containment helmet designed for security officers, protecting them from burning alive, along-side other undesirables." icon_state = "security_envirohelm" item_state = "security_envirohelm" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75, "stamina" = 10) /obj/item/clothing/head/helmet/space/plasmaman/security/warden - name = "warden's plasma envirosuit helmet" - desc = "A plasmaman containment helmet designed for the warden, a pair of white stripes being added to differeciate them from other members of security." + name = "warden's envirosuit helmet" + desc = "A plasmaman containment helmet designed for the warden, a pair of white stripes being added to differentiate them from other members of security." icon_state = "warden_envirohelm" item_state = "warden_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/medical - name = "medical's plasma envirosuit helmet" - desc = "An envriohelmet designed for plasmaman medical doctors, having two stripes down it's length to denote as much" + name = "medical's envirosuit helmet" + desc = "An envirohelmet designed for plasmaman medical doctors, having two stripes down it's length to denote as much" icon_state = "doctor_envirohelm" item_state = "doctor_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/genetics - name = "geneticist's plasma envirosuit helmet" + name = "geneticist's envirosuit helmet" desc = "A plasmaman envirohelmet designed for geneticists." icon_state = "geneticist_envirohelm" item_state = "geneticist_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/viro - name = "virology plasma envirosuit helmet" + name = "virology envirosuit helmet" desc = "The helmet worn by the safest people on the station, those who are completely immune to the monstrosities they create." icon_state = "virologist_envirohelm" item_state = "virologist_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/chemist - name = "chemistry plasma envirosuit helmet" + name = "chemistry envirosuit helmet" desc = "A plasmaman envirosuit designed for chemists, two orange stripes going down it's face." icon_state = "chemist_envirohelm" item_state = "chemist_envirohelm" @@ -196,57 +198,57 @@ item_state = "secmed_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/science - name = "science plasma envirosuit helmet" + name = "science envirosuit helmet" desc = "A plasmaman envirohelmet designed for scientists." icon_state = "scientist_envirohelm" item_state = "scientist_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/robotics - name = "robotics plasma envirosuit helmet" + name = "robotics envirosuit helmet" desc = "A plasmaman envirohelmet designed for roboticists." icon_state = "roboticist_envirohelm" item_state = "roboticist_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/engineering - name = "engineering plasma envirosuit helmet" + name = "engineering envirosuit helmet" desc = "A space-worthy helmet specially designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange." icon_state = "engineer_envirohelm" item_state = "engineer_envirohelm" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 75) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 75, "stamina" = 0) -/obj/item/clothing/head/helmet/space/plasmaman/atmospherics - name = "atmospherics plasma envirosuit helmet" +/obj/item/clothing/head/helmet/space/plasmaman/engineering/atmospherics + name = "atmospherics envirosuit helmet" desc = "A space-worthy helmet specially designed for atmos technician plasmamen, the usual purple stripes being replaced by engineering's blue." icon_state = "atmos_envirohelm" item_state = "atmos_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/cargo - name = "cargo plasma envirosuit helmet" + name = "cargo envirosuit helmet" desc = "An plasmaman envirohelmet designed for cargo techs and quartermasters." icon_state = "cargo_envirohelm" item_state = "cargo_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/mining - name = "mining plasma envirosuit helmet" + name = "mining envirosuit helmet" desc = "A khaki helmet given to plasmamen miners operating on lavaland." icon_state = "explorer_envirohelm" item_state = "explorer_envirohelm" visor_icon = "explorer_envisor" /obj/item/clothing/head/helmet/space/plasmaman/chaplain - name = "chaplain's plasma envirosuit helmet" + name = "chaplain's envirosuit helmet" desc = "An envirohelmet specially designed for only the most pious of plasmamen." icon_state = "chap_envirohelm" item_state = "chap_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/white - name = "white plasma envirosuit helmet" + name = "white envirosuit helmet" desc = "A generic white envirohelm." icon_state = "white_envirohelm" item_state = "white_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/hat - name = "white plasma envirosuit helmet with top hat" + name = "white envirosuit helmet with top hat" desc = "A generic white envirohelm with a top-hat affixed to the top" icon_state = "hat_envirohelm" item_state = "hat_envirohelm" @@ -258,7 +260,7 @@ item_state = "gold_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/curator - name = "curator's plasma envirosuit helmet" + name = "curator's envirosuit helmet" desc = "A slight modification on a tradiational voidsuit helmet, this helmet was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Despite their limitations, these helmets still see use by historian and old-styled plasmamen alike." icon_state = "prototype_envirohelm" item_state = "prototype_envirohelm" @@ -267,88 +269,122 @@ visor_icon = "prototype_envisor" /obj/item/clothing/head/helmet/space/plasmaman/botany - name = "botany plasma envirosuit helmet" + name = "botany envirosuit helmet" desc = "A green and blue envirohelmet designating it's wearer as a botanist. While not specially designed for it, it would protect against minor planet-related injuries." icon_state = "botany_envirohelm" item_state = "botany_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/janitor - name = "janitor's plasma envirosuit helmet" + name = "janitor's envirosuit helmet" desc = "A grey helmet bearing a pair of purple stripes, designating the wearer as a janitor." icon_state = "janitor_envirohelm" item_state = "janitor_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/exploration + name = "exploration envirosuit helmet" + desc = "A plasmaman envirohelmet designed for the exploration crew, decked out in their iconic garish turquiose." + icon_state = "exploration_envirohelm" + item_state = "exploration_envirohelm" + visor_icon = "explorer_envisor" + //mime and clown /obj/item/clothing/head/helmet/space/plasmaman/mime - name = "mime envirosuit helmet" - desc = "A black and white envirosuit helmet, specially made for the mime. Rattling bones won't stop your silent shinanigains!" + name = "mime's envirosuit helmet" + desc = "A black and white envirosuit helmet, specially made for the mime. Rattling bones won't stop your silent shenanigans!" icon_state = "mime_envirohelm" item_state = "mime_envirohelm" + visor_icon = "mime_envisor" /obj/item/clothing/head/helmet/space/plasmaman/honk - name = "clowns envirosuit helmet" - desc = "A multicolor helmet that smellls of bananium and securitys tears." + name = "clown's envirosuit helmet" + desc = "A multicolor helmet that smells of bananium and security's tears." icon_state = "honk_envirohelm" item_state = "honk_envirohelm" + visor_icon = "clown_envisor" + smile_state = "clown_smile" //command helms - /obj/item/clothing/head/helmet/space/plasmaman/command - name = "captains envirosuit helmet" - desc = "A helmet issued to the head of the command staff. Sleak and Stylish, as all captains should be." + name = "captain's envirosuit helmet" + desc = "A helmet issued to the head of the command staff. Sleak and stylish, as all captains should be." icon_state = "command_envirohelm" item_state = "command_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/engineering/ce - name = "chief engineers envirohelmet" - desc = "An envirohelmet designed for the chief engineer. It reeks of poly and plasma." + name = "chief engineer's envirohelmet" + desc = "An envirohelmet designed for the Chief Engineer. It reeks of Poly and plasma." icon_state = "ce_envirohelm" item_state = "ce_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/cmo - name = "chief medical officers envirohelmet" - desc = "A helmet issued to the head of the command staff. Sleak and Stylish, as all captains should be." + name = "chief medical officer's envirohelmet" + desc = "A helmet issued to the chief of the medical staff." icon_state = "cmo_envirohelm" item_state = "cmo_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/security/hos - name = "head of securitys helmet" + name = "head of security's helmet" desc = "A reinforced envirohelmet issued to the head of the security staff. You'll need it." icon_state = "hos_envirohelm" item_state = "hos_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/rd - name = "research directors envirosuit helmet" + name = "research director's envirosuit helmet" desc = "A custom made envirosuit helmet made using advanced nanofibers. Fashionable and easy to wear." icon_state = "rd_envirohelm" item_state = "rd_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/hop - name = "head of personnels envirosuit helmet" + name = "head of personnel's envirosuit helmet" desc = "An envirosuit helmet made for the Head of Personnel. Some corgi hair is stuck to it." icon_state = "hop_envirohelm" item_state = "hop_envirohelm" +//centcom envirohelms +/obj/item/clothing/head/helmet/space/plasmaman/commander + name = "CentCom commander envirosuit helmet" + desc = "A special containment helmet designed for the Higher Central Command Staff. Not many of these exist, as CentCom does not usually employ plasmamen to higher staff positions due to their complications." + icon_state = "commander_envirohelm" + item_state = "commander_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/official + name = "CentCom official envirosuit helmet" + desc = "A special containment helmet designed for CentCom Staff. They sure do love their green." + icon_state = "official_envirohelm" + item_state = "official_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/intern + name = "CentCom intern envirosuit helmet" + desc = "A special containment helmet designed for CentCom Staff. You know, so any coffee spills don't kill the poor sod." + icon_state = "intern_envirohelm" + item_state = "intern_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/replacement/equipped(mob/living/carbon/user, slot) + ..() + if(slot == ITEM_SLOT_HEAD && !isplasmaman(user)) + user.dropItemToGround(src) + to_chat(user, "[src] doesn't fit on your head and falls to the ground.") + //replacements for vendors /obj/item/clothing/head/helmet/space/plasmaman/replacement name = "replacement envirosuit helmet" - desc = "An outdated helmet that allows plasma-based lifeforms to exist safely in an oxygenated environment, still kept in use as replacement helmets. While it is space worthy, it lacks the UV protection newer models come with.." - flash_protect = 0 + desc = "An outdated helmet that allows plasma-based lifeforms to exist safely in an oxygenated environment, still kept in use as replacement helmets." /obj/item/clothing/head/helmet/space/plasmaman/replacement/security - name = "replacement security envirosuit helmet" - desc = "An outdated containment helmet designed for security officers, lacks the UV shielding a standard helmet possesses." + name = "security replacement envirosuit helmet" + desc = "An outdated containment helmet designed for security officers." icon_state = "security_envirohelm" item_state = "security_envirohelm" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75, "stamina" = 0) /obj/item/clothing/head/helmet/space/plasmaman/replacement/medical - name = "medical's replacement envirosuit helmet" - desc = "An outdated envriohelmet designed for plasmaman medical doctors, having two stripes down it's length to denote as much, lacks UV shielding." + name = "medical replacement envirosuit helmet" + desc = "An outdated envirohelmet designed for plasmaman medical doctors, having two stripes down it's length to denote as much." icon_state = "doctor_envirohelm" item_state = "doctor_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/replacement/genetics - name = "geneticist's replacement envirosuit helmet" + name = "geneticist replacement envirosuit helmet" desc = "An outdated plasmaman envirohelmet designed for geneticists." icon_state = "geneticist_envirohelm" item_state = "geneticist_envirohelm" @@ -378,19 +414,17 @@ item_state = "roboticist_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/replacement/engineering - name = "replacement engineering envirosuit helmet" - desc = "A replacement helmet designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange, despite its age it has some UV protection for welding.." + name = "engineering replacement envirosuit helmet" + desc = "A replacement helmet designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange." item_state = "engineer_envirohelm" icon_state = "engineer_envirohelm" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 75) - flash_protect = 1 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 75, "stamina" = 0) -/obj/item/clothing/head/helmet/space/plasmaman/replacement/atmospherics - name = "replacement atmospherics envirosuit helmet" - desc = "A space-worthy helmet specially designed for atmos technician plasmamen, the usual purple stripes being replaced by engineering's blue, despite its age is has some UV protection for welding." +/obj/item/clothing/head/helmet/space/plasmaman/replacement/engineering/atmospherics + name = "atmospherics replacement envirosuit helmet" + desc = "A space-worthy helmet specially designed for atmos technician plasmamen, the usual purple stripes being replaced by engineering's blue." icon_state = "atmos_envirohelm" item_state = "atmos_envirohelm" - flash_protect = 1 /obj/item/clothing/head/helmet/space/plasmaman/replacement/cargo name = "cargo replacement envirosuit helmet" @@ -403,9 +437,10 @@ desc = "A khaki replacement helmet given to plasmamen miners operating on lavaland." icon_state = "explorer_envirohelm" item_state = "explorer_envirohelm" + visor_icon = "explorer_envisor" /obj/item/clothing/head/helmet/space/plasmaman/replacement/chaplain - name = "chaplain's replace envirosuit helmet" + name = "chaplain's replacement envirosuit helmet" desc = "An outdated envirohelmet specially designed for only the most pious of plasmamen." icon_state = "chap_envirohelm" item_state = "chap_envirohelm" @@ -418,10 +453,11 @@ /obj/item/clothing/head/helmet/space/plasmaman/replacement/curator name = "curator's replacement envirosuit helmet" - desc = "A tradiational voidsuit helmet, this helmet was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Despite their limitations, these helmets still see use by historian and old-styled plasmamen alike." + desc = "A traditional voidsuit helmet, this helmet was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Despite their limitations, these helmets still see use by historian and old-styled plasmamen alike." icon_state = "prototype_envirohelm" item_state = "prototype_envirohelm" actions_types = list() + smile_state = "prototype_smile" /obj/item/clothing/head/helmet/space/plasmaman/replacement/botany name = "botany replacement envirosuit helmet" diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 75c7b2dd53bca..002ca2f929470 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -4,7 +4,7 @@ icon_state = "syndicate" item_state = "syndicate" desc = "Has a tag on it: Totally not property of an enemy corporation, honest!" - armor = list("melee" = 40, "bullet" = 50, "laser" = 30,"energy" = 40, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 80, "acid" = 85) + armor = list("melee" = 40, "bullet" = 50, "laser" = 30,"energy" = 40, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 80, "acid" = 85, "stamina" = 50) /obj/item/clothing/suit/space/syndicate name = "red space suit" @@ -13,7 +13,7 @@ desc = "Has a tag on it: Totally not property of an enemy corporation, honest!" w_class = WEIGHT_CLASS_NORMAL 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) - armor = list("melee" = 40, "bullet" = 50, "laser" = 30,"energy" = 40, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 80, "acid" = 85) + armor = list("melee" = 40, "bullet" = 50, "laser" = 30,"energy" = 40, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 80, "acid" = 85, "stamina" = 50) //Green syndicate space suit diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index da9e6bc4aa149..d53e9f7b18166 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -1,13 +1,18 @@ +#define FOOTSTEP_COOLDOWN 3 //3 deci-seconds + /obj/item/clothing/suit icon = 'icons/obj/clothing/suits.dmi' name = "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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) slot_flags = ITEM_SLOT_OCLOTHING var/blood_overlay_type = "suit" var/togglename = null var/suittoggled = FALSE + var/move_sound = null + var/footstep = 0 + var/mob/listeningTo pocket_storage_component_path = /datum/component/storage/concrete/pockets/exo @@ -31,3 +36,46 @@ if(ismob(loc)) var/mob/M = loc M.update_inv_wear_suit() + +/obj/item/clothing/suit/proc/on_mob_move() + SIGNAL_HANDLER + + var/mob/living/carbon/human/H = loc + if(!istype(H) || H.wear_suit != src) + return + if(world.time > footstep) + playsound(src, pick(move_sound), 65, 1) + footstep = world.time + FOOTSTEP_COOLDOWN + +/obj/item/clothing/suit/equipped(mob/user, slot) + . = ..() + //If we dont have move sounds, ignore + if(!islist(move_sound)) + return + //Check if we were taken off. + if(slot != ITEM_SLOT_OCLOTHING) + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + listeningTo = null + return + if(listeningTo == user) + return + //Remove old listener + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + //Add new listener + RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/on_mob_move) + listeningTo = user + +/obj/item/clothing/suit/dropped(mob/user) + . = ..() + //Remove our listener + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + listeningTo = null + +/obj/item/clothing/suit/Destroy() + listeningTo = null + . = ..() + +#undef FOOTSTEP_COOLDOWN diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index f6c4f5667377c..65e16b02f0552 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -9,7 +9,7 @@ equip_delay_other = 40 max_integrity = 250 resistance_flags = NONE - armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 30) clothing_flags = THICKMATERIAL /obj/item/clothing/suit/armor/Initialize() @@ -50,7 +50,7 @@ icon_state = "secjacket" item_state = "secjacket" body_parts_covered = CHEST|ARMS - armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 35, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 45, "acid" = 45) + armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 35, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 45, "acid" = 45, "stamina" = 30) /obj/item/clothing/suit/armor/hos name = "armored greatcoat" @@ -58,13 +58,13 @@ icon_state = "hos" item_state = "greatcoat" body_parts_covered = CHEST|GROIN|ARMS|LEGS - armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90) + armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90, "stamina" = 40) cold_protection = CHEST|GROIN|LEGS|ARMS heat_protection = CHEST|GROIN|LEGS|ARMS strip_delay = 80 /obj/item/clothing/suit/armor/hos/trenchcoat - name = "armored trenchoat" + name = "armored trenchcoat" desc = "A trenchcoat enhanced with a special lightweight kevlar. The epitome of tactical plainclothes." icon_state = "hostrench" item_state = "hostrench" @@ -104,7 +104,7 @@ icon_state = "capcarapace" item_state = "armor" body_parts_covered = CHEST|GROIN - armor = list("melee" = 50, "bullet" = 40, "laser" = 50, "energy" = 60, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 90) + armor = list("melee" = 50, "bullet" = 40, "laser" = 50, "energy" = 60, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 90, "stamina" = 40) dog_fashion = null resistance_flags = FIRE_PROOF @@ -125,7 +125,7 @@ icon_state = "capjacket" item_state = "capspacesuit" body_parts_covered = CHEST|ARMS - armor = list("melee" = 40, "bullet" = 30, "laser" = 40, "energy" = 50, "bomb" = 55, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 80) + armor = list("melee" = 40, "bullet" = 30, "laser" = 40, "energy" = 50, "bomb" = 55, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 80, "stamina" = 40) /obj/item/clothing/suit/armor/riot name = "riot suit" @@ -135,11 +135,12 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "stamina" = 50) blocks_shove_knockdown = TRUE strip_delay = 80 equip_delay_other = 60 slowdown = 0.05 + move_sound = list('sound/effects/suitstep1.ogg', 'sound/effects/suitstep2.ogg') /obj/item/clothing/suit/armor/bone name = "bone armor" @@ -147,7 +148,7 @@ icon_state = "bonearmor" item_state = "bonearmor" blood_overlay_type = "armor" - armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 30, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 30, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 20) body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS /obj/item/clothing/suit/armor/bulletproof @@ -156,7 +157,7 @@ icon_state = "bulletproof" item_state = "armor" blood_overlay_type = "armor" - armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 40) strip_delay = 70 equip_delay_other = 50 @@ -166,7 +167,7 @@ icon_state = "armor_reflec" item_state = "armor_reflec" blood_overlay_type = "armor" - armor = list("melee" = 10, "bullet" = 10, "laser" = 60, "energy" = 80, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list("melee" = 10, "bullet" = 10, "laser" = 60, "energy" = 80, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "stamina" = 40) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF var/hit_reflect_chance = 40 @@ -202,7 +203,7 @@ 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 - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 60, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 90) + armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 60, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 90, "stamina" = 70) /obj/item/clothing/suit/armor/heavy name = "heavy armor" @@ -214,14 +215,16 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS slowdown = 3 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 60, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 90) + armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 60, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 90, "stamina" = 60) + move_sound = list('sound/effects/suitstep1.ogg', 'sound/effects/suitstep2.ogg') /obj/item/clothing/suit/armor/tdome body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 60, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 90) + armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 60, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 90, "stamina" = 0) + move_sound = list('sound/effects/suitstep1.ogg', 'sound/effects/suitstep2.ogg') /obj/item/clothing/suit/armor/tdome/red name = "thunderdome suit" @@ -235,12 +238,28 @@ icon_state = "tdgreen" item_state = "tdgreen" +/obj/item/clothing/suit/armor/tdome/holosuit + name = "thunderdome suit" + armor = list("melee" = 10, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) + cold_protection = null + heat_protection = null + +/obj/item/clothing/suit/armor/tdome/holosuit/red + desc = "Reddish armor." + icon_state = "tdred" + item_state = "tdred" + +/obj/item/clothing/suit/armor/tdome/holosuit/green + desc = "Pukish armor." + icon_state = "tdgreen" + item_state = "tdgreen" /obj/item/clothing/suit/armor/riot/knight name = "plate armour" desc = "A classic suit of plate armour, highly effective at stopping melee attacks." icon_state = "knight_green" item_state = "knight_green" + move_sound = null /obj/item/clothing/suit/armor/riot/knight/yellow icon_state = "knight_yellow" @@ -263,14 +282,14 @@ equip_delay_other = 40 max_integrity = 200 resistance_flags = FLAMMABLE - armor = list("melee" = 20, "bullet" = 10, "laser" = 30, "energy" = 40, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 50) + armor = list("melee" = 20, "bullet" = 10, "laser" = 30, "energy" = 40, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 50, "stamina" = 30) /obj/item/clothing/suit/armor/vest/russian name = "russian vest" desc = "A bulletproof vest with forest camo. Good thing there's plenty of forests to hide in around here, right?" 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) + armor = list("melee" = 25, "bullet" = 30, "laser" = 0, "energy" = 15, "bomb" = 10, "bio" = 0, "rad" = 20, "fire" = 20, "acid" = 50, "stamina" = 25) /obj/item/clothing/suit/armor/vest/russian_coat name = "russian battle coat" @@ -280,4 +299,4 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - armor = list("melee" = 25, "bullet" = 20, "laser" = 20, "energy" = 30, "bomb" = 20, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 50) + armor = list("melee" = 25, "bullet" = 20, "laser" = 20, "energy" = 30, "bomb" = 20, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 50, "stamina" = 30) diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 6a7c5e0024200..ec08459456f20 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -5,10 +5,10 @@ desc = "A hood that protects the head and face from biological contaminants." permeability_coefficient = 0.01 clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | SHOWEROKAY | SNUG_FIT - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 80, "fire" = 30, "acid" = 100) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 80, "fire" = 30, "acid" = 100, "stamina" = 0) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE resistance_flags = ACID_PROOF - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH /obj/item/clothing/suit/bio_suit name = "bio suit" @@ -22,7 +22,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS slowdown = 1 allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/pen, /obj/item/flashlight/pen, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 80, "fire" = 30, "acid" = 100) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 80, "fire" = 30, "acid" = 100, "stamina" = 0) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT strip_delay = 70 equip_delay_other = 70 @@ -46,11 +46,11 @@ //Security biosuit, grey with red stripe across the chest /obj/item/clothing/head/bio_hood/security - armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 80, "fire" = 30, "acid" = 100) + armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 80, "fire" = 30, "acid" = 100, "stamina" = 20) icon_state = "bio_security" /obj/item/clothing/suit/bio_suit/security - armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 80, "fire" = 30, "acid" = 100) + armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 80, "fire" = 30, "acid" = 100, "stamina" = 20) icon_state = "bio_security" diff --git a/code/modules/clothing/suits/chaplainsuits.dm b/code/modules/clothing/suits/chaplainsuits.dm index ebc6b9aaaba90..dfe4989c34e98 100644 --- a/code/modules/clothing/suits/chaplainsuits.dm +++ b/code/modules/clothing/suits/chaplainsuits.dm @@ -30,7 +30,12 @@ item_state = "bishoprobe" body_parts_covered = CHEST|GROIN|LEGS|ARMS flags_inv = HIDEJUMPSUIT - + +/obj/item/clothing/suit/chaplainsuit/bishoprobe/black + name = "black bishop's robes" + icon_state = "blackbishoprobe" + item_state = "blackbishoprobe" + /obj/item/clothing/suit/chaplainsuit/studentuni name = "student robe" desc = "The uniform of a bygone institute of learning." diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index d86fec88cd5f8..393e790cdfe30 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -54,8 +54,8 @@ name = "goliath cloak" icon_state = "goliath_cloak" desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits." - allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat/bone, /obj/item/kitchen/knife/combat/survival) - armor = list("melee" = 50, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot + allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/spear, /obj/item/spear/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat/bone, /obj/item/kitchen/knife/combat/survival) + armor = list("melee" = 50, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60, "stamina" = 30) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath body_parts_covered = CHEST|GROIN|ARMS resistance_flags = FIRE_PROOF @@ -64,7 +64,7 @@ name = "goliath cloak hood" icon_state = "golhood" desc = "A protective & concealing hood." - armor = list("melee" = 50, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) + armor = list("melee" = 50, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60, "stamina" = 30) flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR transparent_protection = HIDEMASK resistance_flags = FIRE_PROOF @@ -73,29 +73,31 @@ name = "drake armour" 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) + 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/spear) + armor = list("melee" = 70, "bullet" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100, "stamina" = 30) 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 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF transparent_protection = HIDEGLOVES|HIDESUITSTORAGE|HIDEJUMPSUIT|HIDESHOES + high_pressure_multiplier = 0.4 /obj/item/clothing/head/hooded/cloakhood/drake 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" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100, "stamina" = 30) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF + high_pressure_multiplier = 0.4 /obj/item/clothing/suit/hooded/cloak/bone name = "Heavy bone armor" icon_state = "hbonearmor" desc = "A tribal armor plate, crafted from animal bone. A heavier variation of standard bone armor." - armor = list("melee" = 40, "bullet" = 25, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 40, "bullet" = 25, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 20) hoodtype = /obj/item/clothing/head/hooded/cloakhood/bone heat_protection = CHEST|GROIN|LEGS|FEET|ARMS body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS @@ -107,9 +109,18 @@ name = "bone helmet" icon_state = "hskull" desc = "An intimidating tribal helmet, it doesn't look very comfortable." - armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 20) heat_protection = HEAD max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT resistance_flags = NONE flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE flags_cover = HEADCOVERSEYES + +/obj/item/clothing/neck/cloak/chap/bishop + name = "bishop's cloak" + desc = "Become the space pope." + icon_state = "bishopcloak" + +/obj/item/clothing/neck/cloak/chap/bishop/black + name = "black bishop's cloak" + icon_state = "blackbishopcloak" diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index cf8d7a6462389..ac58a6d7f003b 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -53,7 +53,7 @@ item_state = "det_suit" blood_overlay_type = "coat" body_parts_covered = CHEST|GROIN|LEGS|ARMS - armor = list("melee" = 25, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) + armor = list("melee" = 25, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45, "stamina" = 40) cold_protection = CHEST|GROIN|LEGS|ARMS heat_protection = CHEST|GROIN|LEGS|ARMS @@ -80,7 +80,7 @@ icon_state = "brig_phys_vest" item_state = "sec_helm"//looks kinda similar, I guess 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, /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/police/telescopic, /obj/item/soap, /obj/item/sensor_device, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 50) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 50, stamina = 30) //Engineering /obj/item/clothing/suit/hazardvest @@ -162,7 +162,7 @@ blood_overlay_type = "coat" body_parts_covered = CHEST|ARMS allowed = list(/obj/item/tank/internals, /obj/item/melee/curator_whip) - armor = list("melee" = 25, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) + armor = list("melee" = 25, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45, "stamina" = 30) cold_protection = CHEST|ARMS heat_protection = CHEST|ARMS diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 8eed93f04b119..d62006921a91a 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -6,7 +6,7 @@ blood_overlay_type = "coat" body_parts_covered = CHEST|ARMS 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/police/telescopic, /obj/item/soap, /obj/item/sensor_device, /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" = 50, "acid" = 50) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 0) togglename = "buttons" species_exception = list(/datum/species/golem) @@ -26,7 +26,7 @@ name = "security medic's labcoat" icon_state = "labcoat_sec" item_state = "labcoat_sec" - armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 50) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 50, stamina = 30) /obj/item/clothing/suit/toggle/labcoat/mad name = "\proper The Mad's labcoat" diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 2c9ee3517d9fc..d1ea6b8856141 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -28,6 +28,32 @@ allowed = list (/obj/item/gun/energy/laser/redtag) resistance_flags = NONE +// Aristocrat Coats + +/obj/item/clothing/suit/aristo_orange + name = "orange aristocrat coat" + desc = "A fancy coat made of silk. This one is orange." + icon_state = "aristo_orange" + item_state = "aristo_orange" + +/obj/item/clothing/suit/aristo_red + name = "red aristocrat coat" + desc = "A fancy coat made of silk. This one is red." + icon_state = "aristo_red" + item_state = "aristo_red" + +/obj/item/clothing/suit/aristo_brown + name = "brown aristocrat coat" + desc = "A fancy coat made of silk. This one is brown." + icon_state = "aristo_brown" + item_state = "aristo_brown" + +/obj/item/clothing/suit/aristo_blue + name = "blue aristocrat coat" + desc = "A fancy coat made of silk. This one is blue." + icon_state = "aristo_blue" + item_state = "aristo_blue" + /* * Costume */ @@ -39,6 +65,15 @@ body_parts_covered = CHEST|GROIN hoodtype = /obj/item/clothing/head/hooded/flashsuit +/obj/item/clothing/suit/hooded/hastur + name = "\improper Hastur's robe" + desc = "Robes not meant to be worn by man." + icon_state = "hastur" + item_state = "hastur" + body_parts_covered = CHEST|GROIN|LEGS|ARMS + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + hoodtype = /obj/item/clothing/head/hooded/hasturhood + /obj/item/clothing/head/hooded/flashsuit name = "flash button" desc = "You will learn to fear the flash." @@ -178,7 +213,7 @@ /obj/item/clothing/suit/cardborg/equipped(mob/living/user, slot) ..() - if(slot == SLOT_WEAR_SUIT) + if(slot == ITEM_SLOT_OCLOTHING) disguise(user) /obj/item/clothing/suit/cardborg/dropped(mob/living/user) @@ -260,9 +295,17 @@ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT flags_inv = HIDEHAIR|HIDEEARS +/obj/item/clothing/head/hooded/hasturhood + name = "hastur's hood" + desc = "It's unspeakably stylish." + icon_state = "hasturhood" + body_parts_covered = HEAD + flags_inv = HIDEHAIR + flags_cover = HEADCOVERSEYES + /obj/item/clothing/head/hooded/carp_hood/equipped(mob/living/carbon/human/user, slot) ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) user.faction |= "carp" /obj/item/clothing/head/hooded/carp_hood/dropped(mob/living/carbon/human/user) @@ -309,13 +352,14 @@ flags_inv = HIDEHAIR|HIDEEARS dynamic_hair_suffix = "" -/obj/item/clothing/suit/hooded/bee_costume/syndie +/obj/item/clothing/suit/hooded/bee_costume/syndie name = "BLF costume" - armor = list("melee" = 20, "bullet" = 20, "laser" = 20,"energy" = 40, "bomb" = 0, "bio" = 60, "rad" = 0, "fire" = 0, "acid" = 50) + armor = list("melee" = 20, "bullet" = 20, "laser" = 20,"energy" = 40, "bomb" = 0, "bio" = 60, "rad" = 0, "fire" = 0, "acid" = 50, "stamina" = 40) hoodtype = /obj/item/clothing/head/hooded/bee_hood/syndie /obj/item/clothing/head/hooded/bee_hood/syndie - armor = list("melee" = 20, "bullet" = 20, "laser" = 20,"energy" = 40, "bomb" = 0, "bio" = 60, "rad" = 0, "fire" = 0, "acid" = 50) + armor = list("melee" = 20, "bullet" = 20, "laser" = 20,"energy" = 40, "bomb" = 0, "bio" = 60, "rad" = 0, "fire" = 0, "acid" = 50, "stamina" = 40) + /obj/item/clothing/suit/hooded/bloated_human //OH MY GOD WHAT HAVE YOU DONE!?!?!? name = "bloated human suit" desc = "A horribly bloated suit made from human skins." @@ -342,6 +386,37 @@ item_state = "officertanjacket" body_parts_covered = CHEST|ARMS +///////////////// +//DONATOR ITEMS// +///////////////// + +/obj/item/clothing/suit/delinquent + name = "deliquent jacket" + desc = "Yare yare daze." + icon_state = "jocoat" + +/obj/item/clothing/suit/madsci + name = "mad scientist labcoat" + desc = "El psy congroo." + icon_state = "madsci" + +/obj/item/clothing/suit/hooded/renault_costume + name = "renault costume" + desc = "The cutest pair of pajamas you've ever seen." + icon_state = "renault_suit" + hoodtype = /obj/item/clothing/head/hooded/renault_hood + +/obj/item/clothing/head/hooded/renault_hood + name = "renault hoodie" + desc = "An adorable hoodie vaguely resembling renault." + icon_state = "renault_hoodie" + flags_inv = HIDEEARS + +/obj/item/clothing/suit/retro_jacket + name = "retro jacket" + desc = "Do you like hurting other people?" + icon_state = "retro_jacket" + /* * Misc */ @@ -413,7 +488,7 @@ desc = "A thick jacket with a rubbery, water-resistant shell." icon_state = "pufferjacket" item_state = "hostrench" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) /obj/item/clothing/suit/jacket/puffer/vest name = "puffer vest" @@ -422,7 +497,7 @@ item_state = "armor" body_parts_covered = CHEST|GROIN cold_protection = CHEST|GROIN - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) /obj/item/clothing/suit/jacket/miljacket name = "military jacket" @@ -502,7 +577,7 @@ w_class = WEIGHT_CLASS_SMALL body_parts_covered = CHEST|GROIN attack_verb = list("warned", "cautioned", "smashed") - armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) @@ -516,7 +591,7 @@ body_parts_covered = CHEST|GROIN|ARMS cold_protection = CHEST|GROIN|ARMS 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 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) /obj/item/clothing/head/hooded/winterhood @@ -532,7 +607,7 @@ name = "captain's winter coat" icon_state = "coatcaptain" item_state = "coatcaptain" - armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50, "stamina" = 20) hoodtype = /obj/item/clothing/head/hooded/winterhood/captain /obj/item/clothing/suit/hooded/wintercoat/captain/Initialize() @@ -546,7 +621,7 @@ name = "security winter coat" icon_state = "coatsecurity" item_state = "coatsecurity" - armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) + armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45, "stamina" = 20) hoodtype = /obj/item/clothing/head/hooded/winterhood/security /obj/item/clothing/suit/hooded/wintercoat/security/Initialize() @@ -561,7 +636,7 @@ icon_state = "coatmedical" item_state = "coatmedical" allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /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/police/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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45, "stamina" = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/medical /obj/item/clothing/head/hooded/winterhood/medical @@ -572,7 +647,7 @@ icon_state = "coatscience" item_state = "coatscience" 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/police/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" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/science /obj/item/clothing/head/hooded/winterhood/science @@ -582,7 +657,7 @@ name = "engineering winter coat" icon_state = "coatengineer" item_state = "coatengineer" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45, "stamina" = 0) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering @@ -622,12 +697,78 @@ 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) - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/miner /obj/item/clothing/head/hooded/winterhood/miner icon_state = "winterhood_miner" +//Old winter coats + +/obj/item/clothing/suit/hooded/wintercoat/old + name = "nostalgic winter coat" + desc = "A well-worn heavy jacket made from 'synthetic' animal furs." + icon_state = "old_coatwinter" + +/obj/item/clothing/head/hooded/winterhood/old + name = "winter hood" + desc = "An old hood attached to a well-worn heavy winter jacket." + icon_state = "old_winterhood" + +/obj/item/clothing/suit/hooded/wintercoat/security/old + name = "nostalgic security winter coat" + icon_state = "old_coatsecurity" + hoodtype = /obj/item/clothing/head/hooded/winterhood/security/old + +/obj/item/clothing/suit/hooded/wintercoat/security/old/Initialize() + . = ..() + allowed = GLOB.security_wintercoat_allowed + +/obj/item/clothing/head/hooded/winterhood/security/old + icon_state = "old_winterhood_security" + +/obj/item/clothing/suit/hooded/wintercoat/medical/old + name = "nostalgic medical winter coat" + icon_state = "old_coatmedical" + hoodtype = /obj/item/clothing/head/hooded/winterhood/medical/old + +/obj/item/clothing/head/hooded/winterhood/medical/old + icon_state = "old_winterhood_medical" + +/obj/item/clothing/suit/hooded/wintercoat/science/old + name = "nostalgic science winter coat" + icon_state = "old_coatscience" + hoodtype = /obj/item/clothing/head/hooded/winterhood/science/old + +/obj/item/clothing/head/hooded/winterhood/science/old + icon_state = "old_winterhood_science" + +/obj/item/clothing/suit/hooded/wintercoat/engineering/old + name = "nostalgic engineering winter coat" + icon_state = "old_coatengineer" + hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering/old + +/obj/item/clothing/head/hooded/winterhood/engineering/old + icon_state = "old_winterhood_engineer" + +/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos/old + name = "nostalgic atmospherics winter coat" + icon_state = "old_coatatmos" + hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering/atmos/old + +/obj/item/clothing/head/hooded/winterhood/engineering/atmos/old + icon_state = "old_winterhood_atmos" + +/obj/item/clothing/suit/hooded/wintercoat/hydro/old + name = "nostalgic hydroponics winter coat" + icon_state = "old_coathydro" + hoodtype = /obj/item/clothing/head/hooded/winterhood/hydro/old + +/obj/item/clothing/head/hooded/winterhood/hydro/old + icon_state = "old_winterhood_hydro" + +//end of winter coats + /obj/item/clothing/suit/spookyghost name = "spooky ghost" desc = "This is obviously just a bedsheet, but maybe try it on?" @@ -640,7 +781,7 @@ desc = "A big and clanky suit made of bronze that offers no protection and looks very unfashionable. Nice." icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "clockwork_cuirass_old" - armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20) + armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20, "stamina" = 30) /obj/item/clothing/suit/ghost_sheet name = "ghost sheet" @@ -660,11 +801,21 @@ icon_state = "joker" item_state = "joker" item_color = "joker" - can_adjust = FALSE + can_adjust = FALSE /obj/item/clothing/suit/joker name = "comedian coat" desc = "I mean, don’t you have to be funny to be a comedian?" icon_state = "joker_coat" item_state = "joker_coat" - item_color = "joker_coat" \ No newline at end of file + item_color = "joker_coat" + +/obj/item/clothing/suit/toggle/softshell + name = "softshell jacket" + desc = "A Nanotrasen-branded softshell jacket." + icon_state = "softshell" + item_state = "softshell" + allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/radio) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) + togglename = "zipper" + body_parts_covered = CHEST|GROIN|ARMS diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index 79df361d82a57..3cc5509327bbb 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -33,7 +33,7 @@ icon_state = "reactiveoff" item_state = "reactiveoff" blood_overlay_type = "armor" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "stamina" = 0) actions_types = list(/datum/action/item_action/toggle) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF hit_reaction_chance = 50 @@ -80,7 +80,7 @@ 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() - for(var/turf/T in orange(tele_range, H)) + for(var/turf/T as() in (RANGE_TURFS(tele_range, H)-get_turf(H))) if(T.density) continue if(T.x>world.maxx-tele_range || T.x[src] blocks [attack_text], sending out jets of flame!") playsound(get_turf(owner),'sound/magic/fireball.ogg', 100, 1) - for(var/mob/living/carbon/C in range(6, owner)) - if(C != owner) - C.fire_stacks += 8 - C.IgniteMob() + for(var/mob/living/carbon/C in ohearers(6, owner)) + C.fire_stacks += 8 + C.IgniteMob() owner.fire_stacks = -20 reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration return 1 @@ -131,7 +130,7 @@ /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 + return FALSE 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!") @@ -142,10 +141,9 @@ E.Goto(owner, E.move_to_delay, E.minimum_distance) owner.alpha = 0 owner.visible_message("[owner] is hit by [attack_text] in the chest!") //We pretend to be hit, since blocking it would stop the message otherwise - spawn(40) - owner.alpha = initial(owner.alpha) + addtimer(VARSET_CALLBACK(owner, alpha, initial(owner.alpha)), 40) reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration - return 1 + return TRUE //Tesla @@ -164,7 +162,7 @@ /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? + if(slot_flags & slot) //Was equipped to a valid slot for this item? user.flags_1 |= TESLA_IGNORE_1 /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) @@ -200,8 +198,8 @@ owner.visible_message("[src] blocks [attack_text], converting the attack into a wave of force!") var/turf/T = get_turf(owner) var/list/thrown_items = list() - for(var/atom/movable/A in range(T, 7)) - if(A == owner || A.anchored || thrown_items[A]) + for(var/atom/movable/A as mob|obj in orange(7, T)) + if(A.anchored || thrown_items[A]) continue var/throwtarget = get_edge_target_turf(T, get_dir(T, get_step_away(A, T))) A.safe_throw_at(throwtarget, 10, 1, force = repulse_force) @@ -217,7 +215,7 @@ /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 + return FALSE if(prob(hit_reaction_chance)) var/mob/living/carbon/human/H = owner if(world.time < reactivearmor_cooldown) @@ -226,8 +224,9 @@ owner.visible_message("The reactive teleport system flings [H] clear of [attack_text] and slams [H.p_them()] into a fabricated table!") owner.visible_message("[H] GOES ON THE TABLE!!!") owner.Paralyze(40) + SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table) var/list/turfs = new/list() - for(var/turf/T in orange(tele_range, H)) + for(var/turf/T as() in (RANGE_TURFS(tele_range, H)-get_turf(H))) if(T.density) continue if(T.x>world.maxx-tele_range || T.xYou're already wearing something on your head!") return - else if(H.equip_to_slot_if_possible(hood,SLOT_HEAD,0,0,1)) + else if(H.equip_to_slot_if_possible(hood,ITEM_SLOT_HEAD,0,0,1)) suittoggled = TRUE src.icon_state = "[initial(icon_state)]_t" H.update_inv_wear_suit() @@ -85,7 +85,7 @@ /obj/item/clothing/head/hooded/equipped(mob/user, slot) ..() - if(slot != SLOT_HEAD) + if(slot != ITEM_SLOT_HEAD) if(suit) suit.RemoveHood() else @@ -94,7 +94,6 @@ //Toggle exosuits for different aesthetic styles (hoodies, suit jacket buttons, etc) /obj/item/clothing/suit/toggle/AltClick(mob/user) - ..() if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return else @@ -131,10 +130,11 @@ . = ..() /obj/item/clothing/suit/space/hardsuit/Destroy() - if(helmet) + if(!QDELETED(helmet)) helmet.suit = null qdel(helmet) - qdel(jetpack) + helmet = null + QDEL_NULL(jetpack) return ..() /obj/item/clothing/head/helmet/space/hardsuit/Destroy() @@ -157,7 +157,7 @@ /obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot) if(!helmettype) return - if(slot != SLOT_WEAR_SUIT) + if(slot != ITEM_SLOT_OCLOTHING) RemoveHelmet() ..() @@ -194,7 +194,7 @@ if(H.head) to_chat(H, "You're already wearing something on your head!") return - else if(H.equip_to_slot_if_possible(helmet,SLOT_HEAD,0,0,1)) + else if(H.equip_to_slot_if_possible(helmet,ITEM_SLOT_HEAD,0,0,1)) to_chat(H, "You engage the helmet on the hardsuit.") suittoggled = TRUE H.update_inv_wear_suit() diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 0c56c82678e38..92d331de46378 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -18,9 +18,9 @@ gas_transfer_coefficient = 0.9 permeability_coefficient = 0.5 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/extinguisher, /obj/item/crowbar) + allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/extinguisher, /obj/item/crowbar, /obj/item/powertool/jaws_of_life) slowdown = 1 - armor = list("melee" = 15, "bullet" = 5, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 10, "rad" = 20, "fire" = 100, "acid" = 50) + armor = list("melee" = 15, "bullet" = 5, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 10, "rad" = 20, "fire" = 100, "acid" = 50, "stamina" = 10) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -49,7 +49,7 @@ icon_state = "atmos_firesuit" item_state = "firesuit_atmos" max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - allowed = list(/obj/item/flashlight, /obj/item/extinguisher, /obj/item/crowbar, /obj/item/tank/internals) + allowed = list(/obj/item/flashlight, /obj/item/extinguisher, /obj/item/crowbar, /obj/item/tank/internals, /obj/item/powertool/jaws_of_life) /* * Bomb protection @@ -59,7 +59,7 @@ desc = "Use in case of bomb." icon_state = "bombsuit" clothing_flags = THICKMATERIAL | SNUG_FIT - armor = list("melee" = 20, "bullet" = 0, "laser" = 20,"energy" = 10, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) + armor = list("melee" = 20, "bullet" = 0, "laser" = 20,"energy" = 10, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50, "stamina" = 10) flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR dynamic_hair_suffix = "" dynamic_fhair_suffix = "" @@ -69,7 +69,7 @@ max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT strip_delay = 70 equip_delay_other = 70 - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH resistance_flags = NONE @@ -84,7 +84,7 @@ clothing_flags = THICKMATERIAL body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS slowdown = 2 - armor = list("melee" = 20, "bullet" = 0, "laser" = 20,"energy" = 10, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) + armor = list("melee" = 20, "bullet" = 0, "laser" = 20,"energy" = 10, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50, "stamina" = 10) flags_inv = HIDEJUMPSUIT heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT @@ -123,10 +123,10 @@ desc = "A hood with radiation protective properties. The label reads, 'Made with lead. Please do not consume insulation.'" clothing_flags = THICKMATERIAL | SHOWEROKAY | SNUG_FIT flags_inv = HIDEMASK|HIDEEARS|HIDEFACE|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 60, "rad" = 100, "fire" = 30, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 60, "rad" = 100, "fire" = 30, "acid" = 30, "stamina" = 10) strip_delay = 60 equip_delay_other = 60 - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH resistance_flags = NONE rad_flags = RAD_PROTECT_CONTENTS @@ -142,7 +142,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/geiger_counter) slowdown = 1.5 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 60, "rad" = 100, "fire" = 30, "acid" = 30) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 60, "rad" = 100, "fire" = 30, "acid" = 30, "stamina" = 10) strip_delay = 60 equip_delay_other = 60 flags_inv = HIDEJUMPSUIT diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index b3482cc826ccb..b4e32cc274c66 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -5,7 +5,7 @@ icon_state = "wizard" gas_transfer_coefficient = 0.01 // IT'S MAGICAL OKAY JEEZ +1 TO NOT DIE permeability_coefficient = 0.01 - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100) + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100, "stamina" = 50) strip_delay = 50 equip_delay_other = 50 resistance_flags = FIRE_PROOF | ACID_PROOF @@ -35,7 +35,7 @@ icon_state = "wizard-fake" gas_transfer_coefficient = 1 permeability_coefficient = 1 - 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, "stamina" = 0) resistance_flags = FLAMMABLE dog_fashion = /datum/dog_fashion/head/blue_wizard @@ -67,7 +67,7 @@ gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 body_parts_covered = CHEST|GROIN|ARMS|LEGS - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100) + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100, "stamina" = 50) allowed = list(/obj/item/teleportation_scroll) flags_inv = HIDEJUMPSUIT strip_delay = 50 @@ -124,7 +124,7 @@ item_state = "wizrobe" gas_transfer_coefficient = 1 permeability_coefficient = 1 - 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, "stamina" = 0) resistance_flags = FLAMMABLE /obj/item/clothing/head/wizard/marisa/fake @@ -133,7 +133,7 @@ icon_state = "marisa" gas_transfer_coefficient = 1 permeability_coefficient = 1 - 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, "stamina" = 0) resistance_flags = FLAMMABLE /obj/item/clothing/suit/wizrobe/marisa/fake @@ -143,7 +143,7 @@ item_state = "marisarobe" gas_transfer_coefficient = 1 permeability_coefficient = 1 - 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, "stamina" = 0) resistance_flags = FLAMMABLE /obj/item/clothing/suit/wizrobe/paper @@ -195,7 +195,7 @@ 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 - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100) + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100, "stamina" = 70) slowdown = 0 resistance_flags = FIRE_PROOF | ACID_PROOF @@ -206,7 +206,7 @@ item_state = "battlemage" min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100) + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100, "stamina" = 70) actions_types = null //No inbuilt light resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 8b965ae05c568..f353a36ea52ae 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -4,7 +4,7 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS permeability_coefficient = 0.9 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) 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 @@ -74,11 +74,11 @@ adjusted = DIGITIGRADE_STYLE H.update_inv_w_uniform() - if(slot == SLOT_W_UNIFORM && freshly_laundered) + if(slot == ITEM_SLOT_ICLOTHING && freshly_laundered) freshly_laundered = FALSE SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "fresh_laundry", /datum/mood_event/fresh_laundry) - if(attached_accessory && slot != SLOT_HANDS && ishuman(user)) + if(attached_accessory && slot != ITEM_SLOT_HANDS && ishuman(user)) var/mob/living/carbon/human/H = user attached_accessory.on_uniform_equip(src, user) if(attached_accessory.above_suit) diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 368e9009892bb..137518c9a5617 100755 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -12,6 +12,10 @@ var/datum/component/storage/detached_pockets var/attachment_slot = CHEST +/obj/item/clothing/accessory/Destroy() + set_detached_pockets(null) + return ..() + /obj/item/clothing/accessory/proc/can_attach_accessory(obj/item/clothing/U, mob/user) if(!attachment_slot || (U && U.body_parts_covered & attachment_slot)) return TRUE @@ -24,7 +28,7 @@ if(SEND_SIGNAL(U, COMSIG_CONTAINS_STORAGE)) return FALSE U.TakeComponent(storage) - detached_pockets = storage + set_detached_pockets(storage) U.attached_accessory = src forceMove(U) layer = FLOAT_LAYER @@ -67,6 +71,17 @@ U.attached_accessory = null U.accessory_overlay = null +/obj/item/clothing/accessory/proc/set_detached_pockets(new_pocket) + if(detached_pockets) + UnregisterSignal(detached_pockets, COMSIG_PARENT_QDELETING) + detached_pockets = new_pocket + if(detached_pockets) + RegisterSignal(detached_pockets, COMSIG_PARENT_QDELETING, .proc/handle_pockets_del) + +/obj/item/clothing/accessory/proc/handle_pockets_del(datum/source) + SIGNAL_HANDLER + set_detached_pockets(null) + /obj/item/clothing/accessory/proc/on_uniform_equip(obj/item/clothing/under/U, user) return @@ -195,7 +210,7 @@ /obj/item/clothing/accessory/medal/silver/excellence name = "the head of personnel award for outstanding achievement in the field of excellence" desc = "Nanotrasen's dictionary defines excellence as \"the quality or condition of being excellent\". This is awarded to those rare crewmembers who fit that definition." - + /obj/item/clothing/accessory/medal/gold name = "gold medal" desc = "A prestigious golden medal." @@ -219,7 +234,7 @@ 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. + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = -10, "acid" = 0, "stamina" = 0) //It's made of plasma. Of course it's flammable. materials = list(/datum/material/plasma=1000) /obj/item/clothing/accessory/medal/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -240,11 +255,21 @@ /obj/item/clothing/accessory/armband name = "red armband" - desc = "An fancy red armband!" + desc = "A fancy red armband!" icon_state = "redband" item_color = "redband" attachment_slot = null +/obj/item/clothing/accessory/armband/blue + name = "blue armband" + desc = "A fancy blue armband!" + color = list(0,0,1, 0,1,0, 1,0,0) + +/obj/item/clothing/accessory/armband/green + name = "green armband" + desc = "A fancy green armband!" + color = list(0,1,0, 1,0,0, 0,0,1) + /obj/item/clothing/accessory/armband/deputy name = "security deputy armband" desc = "An armband, worn by personnel authorized to act as a deputy of station security." @@ -340,7 +365,7 @@ 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" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25, "stamina" = 10) attachment_slot = null /obj/item/clothing/accessory/skullcodpiece @@ -349,7 +374,7 @@ 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" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25, "stamina" = 10) attachment_slot = GROIN /obj/item/clothing/accessory/holster @@ -367,4 +392,20 @@ . = ..() new /obj/item/gun/ballistic/revolver/detective(src) new /obj/item/ammo_box/c38(src) - new /obj/item/ammo_box/c38(src) \ No newline at end of file + new /obj/item/ammo_box/c38(src) + +//Poppy Pin +/obj/item/clothing/accessory/poppy_pin + name = "poppy pin" + desc = "A pin made from a poppy, worn to remember those who have fallen in war." + icon_state = "poppy_pin" + +/obj/item/clothing/accessory/poppy_pin/on_uniform_equip(obj/item/clothing/under/U, user) + var/mob/living/L = user + if(L && L.mind) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "poppy_pin", /datum/mood_event/poppy_pin) + +/obj/item/clothing/accessory/poppy_pin/on_uniform_dropped(obj/item/clothing/under/U, user) + var/mob/living/L = user + if(L && L.mind) + SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "poppy_pin") diff --git a/code/modules/clothing/under/cluwne.dm b/code/modules/clothing/under/cluwne.dm index e8613fae098e3..21a9803d3a0f5 100644 --- a/code/modules/clothing/under/cluwne.dm +++ b/code/modules/clothing/under/cluwne.dm @@ -14,7 +14,7 @@ /obj/item/clothing/under/cluwne/equipped(mob/living/carbon/user, slot) if(!ishuman(user)) return - if(slot == SLOT_W_UNIFORM) + if(slot == ITEM_SLOT_ICLOTHING) var/mob/living/carbon/human/H = user H.dna.add_mutation(CLUWNEMUT) return ..() diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index f99fa02076a02..cdf5983768b76 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -1,15 +1,33 @@ /obj/item/clothing/under/color desc = "A standard issue colored jumpsuit. Variety is the spice of life!" +/obj/item/clothing/under/skirt/color + body_parts_covered = CHEST|GROIN|ARMS + can_adjust = FALSE + fitted = FEMALE_UNIFORM_TOP + /obj/item/clothing/under/color/random icon_state = "random_jumpsuit" /obj/item/clothing/under/color/random/Initialize() ..() - var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - /obj/item/clothing/under/color/random - /obj/item/clothing/under/color/grey/glorf - /obj/item/clothing/under/color/black/ghost) + var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - subtypesof(/obj/item/clothing/under/skirt/color) - /obj/item/clothing/under/color/random - /obj/item/clothing/under/color/grey/glorf - /obj/item/clothing/under/color/black/ghost) + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.equip_to_slot_or_del(new C(H), ITEM_SLOT_ICLOTHING) //or else you end up with naked assistants running around everywhere... + else + new C(loc) + return INITIALIZE_HINT_QDEL + +/obj/item/clothing/under/skirt/color/random + icon_state = "random_jumpsuit" //Skirt variant needed + +/obj/item/clothing/under/skirt/color/random/Initialize() + ..() + var/obj/item/clothing/under/skirt/color/C = pick(subtypesof(/obj/item/clothing/under/skirt/color) - /obj/item/clothing/under/skirt/color/random) if(ishuman(loc)) var/mob/living/carbon/human/H = loc - H.equip_to_slot_or_del(new C(H), SLOT_W_UNIFORM) //or else you end up with naked assistants running around everywhere... + H.equip_to_slot_or_del(new C(H), ITEM_SLOT_ICLOTHING) else new C(loc) return INITIALIZE_HINT_QDEL @@ -21,6 +39,12 @@ item_color = "black" resistance_flags = NONE +/obj/item/clothing/under/skirt/color/black + 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 @@ -35,6 +59,13 @@ item_state = "gy_suit" item_color = "grey" +/obj/item/clothing/under/skirt/color/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." @@ -49,12 +80,24 @@ item_state = "b_suit" item_color = "blue" +/obj/item/clothing/under/skirt/color/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/skirt/color/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." @@ -62,6 +105,12 @@ item_state = "o_suit" item_color = "orange" +/obj/item/clothing/under/skirt/color/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" @@ -69,54 +118,108 @@ item_state = "p_suit" item_color = "pink" +/obj/item/clothing/under/skirt/color/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/skirt/color/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/skirt/color/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/skirt/color/yellow + name = "yellow jumpskirt" + icon_state = "yellow_skirt" + item_state = "y_suit" + item_color = "yellow_skirt" + /obj/item/clothing/under/color/darkblue name = "dark blue jumpsuit" icon_state = "darkblue" item_state = "b_suit" item_color = "darkblue" +/obj/item/clothing/under/skirt/color/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/skirt/color/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/skirt/color/lightpurple + name = "lightpurple jumpskirt" + icon_state = "lightpurple_skirt" + item_state = "p_suit" + item_color = "lightpurple_skirt" + /obj/item/clothing/under/color/darkgreen name = "dark green jumpsuit" icon_state = "darkgreen" item_state = "g_suit" item_color = "darkgreen" +/obj/item/clothing/under/skirt/color/darkgreen + name = "darkgreen jumpskirt" + icon_state = "darkgreen_skirt" + item_state = "g_suit" + item_color = "darkgreen_skirt" + /obj/item/clothing/under/color/lightbrown name = "light brown jumpsuit" icon_state = "lightbrown" item_state = "lb_suit" item_color = "lightbrown" +/obj/item/clothing/under/skirt/color/lightbrown + name = "lightbrown jumpskirt" + icon_state = "lightbrown_skirt" + item_state = "lb_suit" + item_color = "lightbrown_skirt" + /obj/item/clothing/under/color/khaki name = "khaki jumpsuit" icon_state = "khakij" @@ -133,12 +236,24 @@ item_state = "lb_suit" item_color = "brown" +/obj/item/clothing/under/skirt/color/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/skirt/color/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!" @@ -146,3 +261,11 @@ item_state = "rainbow" item_color = "rainbow" can_adjust = FALSE + +/obj/item/clothing/under/skirt/color/rainbow + name = "rainbow jumpskirt" + desc = "A multi-colored jumpskirt!" + icon_state = "rainbow_skirt" + item_state = "rainbow" + item_color = "rainbow_skirt" + diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index 1cacb414973f2..fa80eed0e34bf 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -278,8 +278,15 @@ item_state = "hostanclothes" item_color = "hostanclothes" alt_covers_chest = TRUE - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "stamina" = 10) strip_delay = 50 alt_covers_chest = TRUE sensor_mode = SENSOR_COORDS random_sensor = FALSE + +/obj/item/clothing/under/costume/swagoutfit + name = "swag outfit" + desc = "Why don't you go secure some bitches?" + icon_state = "SwagOutfit" + item_state = "SwagOutfit" + can_adjust = FALSE diff --git a/code/modules/clothing/under/jobs/Plasmaman/centcom.dm b/code/modules/clothing/under/jobs/Plasmaman/centcom.dm new file mode 100644 index 0000000000000..0d5b97ac92a89 --- /dev/null +++ b/code/modules/clothing/under/jobs/Plasmaman/centcom.dm @@ -0,0 +1,20 @@ +/obj/item/clothing/under/plasmaman/commander + name = "CentCom commander envirosuit" + desc = "An envirosuit worn by CentCom's highest-tier Commanders." + icon_state = "commander_envirosuit" + item_state = "commander_envirosuit" + item_color = "commander_envirosuit" + +/obj/item/clothing/under/plasmaman/official + name = "CentCom official envirosuit" + desc = "An envirosuit worn by CentCom Officers." + icon_state = "official_envirosuit" + item_state = "official_envirosuit" + item_color = "official_envirosuit" + +/obj/item/clothing/under/plasmaman/intern + name = "CentCom intern envirosuit" + desc = "An envirosuit worn by those interning for CentCom. The top is styled after a polo shirt for easy identification." + icon_state = "intern_envirosuit" + item_state = "intern_envirosuit" + item_color = "intern_envirosuit" diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm index f2a0006b3f530..ebf6542b817ff 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm @@ -75,6 +75,8 @@ icon_state = "command_envirosuit" item_state = "command_envirosuit" item_color = "command_envirosuit" + sensor_mode = SENSOR_COORDS + random_sensor = FALSE /obj/item/clothing/under/plasmaman/hop name = "head of personnel plasma envirosuit" diff --git a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm index 4655d3f364bcd..4d689176994fa 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm @@ -4,9 +4,9 @@ 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 95, "acid" = 95, "stamina" = 0) -/obj/item/clothing/under/plasmaman/atmospherics +/obj/item/clothing/under/plasmaman/engineering/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" diff --git a/code/modules/clothing/under/jobs/Plasmaman/medsci.dm b/code/modules/clothing/under/jobs/Plasmaman/medsci.dm index 26b1bf29b1957..d27f6d2ee0d23 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/medsci.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/medsci.dm @@ -39,7 +39,7 @@ icon_state = "chemist_envirosuit" item_state = "chemist_envirosuit" item_color = "chemist_envirosuit" - + /obj/item/clothing/under/plasmaman/cmo name = "chief medical officers envirosuit" desc = "An envirosuit designed primarily of nitryl, for the medical savvy plasmamen." @@ -60,3 +60,10 @@ icon_state = "emt_envirosuit" item_state = "emt_envirosuit" item_color = "emt_envirosuit" + +/obj/item/clothing/under/plasmaman/exploration + name = "exploration plasma envirosuit" + desc = "A plasmaman envirosuit designed for the exploration crew." + icon_state = "exploration_envirosuit" + item_state = "exploration_envirosuit" + item_color = "exploration_envirosuit" diff --git a/code/modules/clothing/under/jobs/Plasmaman/security.dm b/code/modules/clothing/under/jobs/Plasmaman/security.dm index d8880aa120dfd..a68eac26a4be2 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/security.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/security.dm @@ -4,7 +4,9 @@ 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) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95, "stamina" = 20) + sensor_mode = SENSOR_COORDS + random_sensor = FALSE /obj/item/clothing/under/plasmaman/security/warden name = "warden plasma envirosuit" @@ -26,4 +28,4 @@ icon_state = "secmed_envirosuit" item_state = "secmed_envirosuit" item_color = "secmed_envirosuit" - armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95) + armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95, "stamina" = 20) diff --git a/code/modules/clothing/under/jobs/cargo.dm b/code/modules/clothing/under/jobs/cargo.dm index 62ebe523dae50..734af2e250a21 100644 --- a/code/modules/clothing/under/jobs/cargo.dm +++ b/code/modules/clothing/under/jobs/cargo.dm @@ -5,6 +5,16 @@ item_state = "qm" 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 + /obj/item/clothing/under/rank/cargo/tech name = "cargo technician's jumpsuit" desc = "Shooooorts! They're comfy and easy to wear!" @@ -15,6 +25,17 @@ mutantrace_variation = MUTANTRACE_VARIATION alt_covers_chest = TRUE +/obj/item/clothing/under/rank/cargo/tech/skirt + name = "cargo technician's jumpskirt" + 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 = NO_MUTANTRACE_VARIATION + /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" @@ -29,3 +50,11 @@ item_state = "explorer" item_color = "explorer" can_adjust = FALSE + +/obj/item/clothing/under/rank/cargo/exploration + name = "exploration uniform" + desc = "A robust uniform used by exploration teams." + icon_state = "curator" + item_state = "curator" + item_color = "curator" + can_adjust = FALSE diff --git a/code/modules/clothing/under/jobs/civilian/civilian.dm b/code/modules/clothing/under/jobs/civilian/civilian.dm index 78f017d4990c3..0851f9ab8f75d 100644 --- a/code/modules/clothing/under/jobs/civilian/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian/civilian.dm @@ -8,6 +8,17 @@ item_color = "barman" alt_covers_chest = TRUE +/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 + + /obj/item/clothing/under/rank/civilian/bartender/purple desc = "It looks like it has lots of flair!" name = "purple bartender's skirt" @@ -24,6 +35,17 @@ item_color = "chaplain" 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" + item_state = "bl_suit" + item_color = "chapblack_skirt" + body_parts_covered = CHEST|GROIN|ARMS + can_adjust = FALSE + fitted = FEMALE_UNIFORM_TOP + + /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." @@ -31,13 +53,22 @@ 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 + /obj/item/clothing/under/rank/civilian/altchef name = "red cook's suit" desc = "A flashier chef's suit, if a bit more impractical." icon_state = "altchef" item_color = "altchef" alt_covers_chest = TRUE - + /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" @@ -46,6 +77,16 @@ item_color = "hop" can_adjust = FALSE +/obj/item/clothing/under/rank/civilian/head_of_personnel/skirt + name = "head of personnel's jumpskirt" + 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 + /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." @@ -54,6 +95,14 @@ item_color = "teal_suit" can_adjust = FALSE +/obj/item/clothing/under/rank/civilian/head_of_personnel/suit/skirt + name = "head of personnel's suit" + desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble." + icon_state = "teal_suit_skirt" + item_state = "g_suit" + item_color = "teal_suit_skirt" + can_adjust = FALSE + /obj/item/clothing/under/rank/civilian/hydroponics desc = "It's a jumpsuit designed to protect against minor plant-related hazards." name = "botanist's jumpsuit" @@ -62,12 +111,31 @@ item_color = "hydroponics" permeability_coefficient = 0.5 +/obj/item/clothing/under/rank/civilian/hydroponics/skirt + name = "botanist's jumpskirt" + 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 + /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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 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 /obj/item/clothing/under/rank/civilian/janitor/maid name = "maid uniform" @@ -90,24 +158,52 @@ item_state = "lawyer_black" item_color = "lawyer_black" +/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 + /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/lawyer/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 + /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/red/skirt + name = "lawyer red suitskirt" + icon_state = "lawyer_red_skirt" + item_state = "lawyer_red" + item_color = "lawyer_red_skirt" + fitted = FEMALE_UNIFORM_TOP + /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 + /obj/item/clothing/under/rank/civilian/lawyer/bluesuit name = "blue slacks" desc = "A pair of comfortable freshly pressed slacks and an equally sharp dress shirt. Tie and suit coat not included." @@ -117,6 +213,16 @@ can_adjust = TRUE alt_covers_chest = TRUE +/obj/item/clothing/under/rank/civilian/lawyer/bluesuit/skirt + name = "blue suitskirt" + 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 + /obj/item/clothing/under/rank/civilian/lawyer/purpsuit name = "purple suit" icon_state = "lawyer_purp" @@ -124,4 +230,14 @@ item_color = "lawyer_purp" fitted = NO_FEMALE_UNIFORM can_adjust = TRUE - alt_covers_chest = TRUE \ No newline at end of file + alt_covers_chest = TRUE + +/obj/item/clothing/under/lawyer/civilian/lawyer/purpsuit/skirt + 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 + diff --git a/code/modules/clothing/under/jobs/civilian/clown_mime.dm b/code/modules/clothing/under/jobs/civilian/clown_mime.dm index bbeeb3d501933..21bc1d0c7e550 100644 --- a/code/modules/clothing/under/jobs/civilian/clown_mime.dm +++ b/code/modules/clothing/under/jobs/civilian/clown_mime.dm @@ -6,6 +6,16 @@ item_state = "mime" item_color = "mime" +/obj/item/clothing/under/rank/civilian/mime/skirt + name = "mime's skirt" + icon_state = "mime_skirt" + item_state = "mime" + item_color = "mime_skirt" + body_parts_covered = CHEST|GROIN|ARMS + can_adjust = FALSE + fitted = FEMALE_UNIFORM_TOP + + /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." diff --git a/code/modules/clothing/under/jobs/civilian/curator.dm b/code/modules/clothing/under/jobs/civilian/curator.dm index 40af279142e52..c02cc4b71032f 100644 --- a/code/modules/clothing/under/jobs/civilian/curator.dm +++ b/code/modules/clothing/under/jobs/civilian/curator.dm @@ -6,6 +6,16 @@ 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 + /obj/item/clothing/under/rank/civilian/curator/treasure_hunter name = "treasure hunter uniform" desc = "A rugged uniform suitable for treasure hunting." diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm index abd4c3df201a5..53de8a46302dc 100644 --- a/code/modules/clothing/under/jobs/command.dm +++ b/code/modules/clothing/under/jobs/command.dm @@ -7,6 +7,16 @@ sensor_mode = SENSOR_COORDS random_sensor = FALSE +/obj/item/clothing/under/rank/captain/skirt + name = "captain's jumpskirt" + 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 + /obj/item/clothing/under/rank/captain/suit name = "captain's suit" desc = "A green suit and yellow necktie. Exemplifies authority." diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index fc6ee2c78e658..fc1b0121ea7d2 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -5,7 +5,7 @@ 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 80, "acid" = 40, "stamina" = 0) resistance_flags = NONE /obj/item/clothing/under/rank/engineering/atmospheric_technician @@ -22,7 +22,7 @@ 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 60, "acid" = 20, "stamina" = 0) resistance_flags = NONE /obj/item/clothing/under/rank/engineering/engineer/hazard @@ -33,30 +33,3 @@ item_color = "hazard" alt_covers_chest = TRUE -/obj/item/clothing/under/rank/engineer/skirt - name = "engineer's jumpskirt" - 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 - -/obj/item/clothing/under/rank/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/roboticist/skirt - name = "roboticist's jumpskirt" - 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 \ No newline at end of file diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm index 072e678a70f32..2e1b4b86a9fb5 100644 --- a/code/modules/clothing/under/jobs/medical.dm +++ b/code/modules/clothing/under/jobs/medical.dm @@ -5,7 +5,17 @@ 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) + +/obj/item/clothing/under/rank/medical/chief_medical_officer/skirt + name = "chief medical officer's jumpskirt" + 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 /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." @@ -14,7 +24,17 @@ 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 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" + item_state = "w_suit" + item_color = "geneticswhite_skirt" + body_parts_covered = CHEST|GROIN|ARMS + can_adjust = FALSE + fitted = FEMALE_UNIFORM_TOP /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." @@ -23,17 +43,37 @@ 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 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" + item_state = "w_suit" + item_color = "virologywhite_skirt" + body_parts_covered = CHEST|GROIN|ARMS + can_adjust = FALSE + fitted = FEMALE_UNIFORM_TOP /obj/item/clothing/under/rank/medical/emt - name = "medical scrubs" + name = "paramedic's jumpsuit" desc = "A standard jumpsuit used by paramedics onboard space stations. It's made of a special fiber that gives special protection against biohazards." icon_state = "emt" item_color = "emt" permeability_coefficient = 0.5 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) can_adjust = FALSE +/obj/item/clothing/under/rank/medical/emt/skirt + name = "paramedic's jumpskirt" + 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 = "emt_skirt" + item_state = "w_suit" + item_color = "emt_skirt" + body_parts_covered = CHEST|GROIN|ARMS + can_adjust = FALSE + fitted = FEMALE_UNIFORM_TOP + /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" @@ -41,7 +81,7 @@ 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) body_parts_covered = CHEST|GROIN|ARMS fitted = NO_FEMALE_UNIFORM can_adjust = FALSE @@ -53,7 +93,17 @@ 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) + +/obj/item/clothing/under/rank/medical/doctor/skirt + name = "medical doctor's jumpskirt" + 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 /obj/item/clothing/under/rank/medical/doctor/blue name = "medical scrubs" @@ -83,4 +133,14 @@ 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) \ No newline at end of file + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 65, "stamina" = 0) + +/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" + item_state = "w_suit" + item_color = "chemistrywhite_skirt" + body_parts_covered = CHEST|GROIN|ARMS + can_adjust = FALSE + fitted = FEMALE_UNIFORM_TOP \ No newline at end of file diff --git a/code/modules/clothing/under/jobs/rnd.dm b/code/modules/clothing/under/jobs/rnd.dm index c6cf72d341c3e..07c5a2a5999f7 100644 --- a/code/modules/clothing/under/jobs/rnd.dm +++ b/code/modules/clothing/under/jobs/rnd.dm @@ -1,41 +1,71 @@ /obj/item/clothing/under/rank/rnd/research_director - desc = "It's a suit worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants." - 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 - -/obj/item/clothing/under/rank/rnd/research_director/hazard name = "research director's jumpsuit" - desc = "It's made of a special fiber that provides minor protection against biohazards. Though never formally retired, the standard issue Research Director's jumpsuit is a rare sight. For the working man." - icon_state = "rd_hazard" + desc = "It's a jumpsuit 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" item_state = "w_suit" - item_color = "rd_hazard" + item_color = "director" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 35, "stamina" = 0) can_adjust = TRUE alt_covers_chest = TRUE +/obj/item/clothing/under/rank/rnd/research_director/skirt + name = "research director's jumpskirt" + desc = "It's a jumpskirt 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 + /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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) can_adjust = TRUE alt_covers_chest = TRUE +/obj/item/clothing/under/rank/rnd/research_director/alt/skirt + name = "research director's tan suitskirt" + 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 + /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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) can_adjust = TRUE alt_covers_chest = TRUE +/obj/item/clothing/under/rank/rnd/research_director/turtleneck/skirt + name = "research director's turtleneck skirt" + 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 + +/obj/item/clothing/under/rank/rnd/research_director/vest + desc = "It's made of a special fiber that provides minor protection against biohazards. Though never formally retired, the standard issue Research Director's vest suit is a rare sight." + name = "research director's vest suit" + icon_state = "rd_vest" + item_state = "lb_suit" + item_color = "rd_vest" + can_adjust = FALSE + /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" @@ -43,12 +73,32 @@ 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 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" + item_state = "w_suit" + item_color = "toxinswhite_skirt" + body_parts_covered = CHEST|GROIN|ARMS + can_adjust = FALSE + fitted = FEMALE_UNIFORM_TOP /obj/item/clothing/under/rank/rnd/roboticist - desc = "It's a slimming black with reinforced seams; great for industrial work." + desc = "It's a slimming black jumpsuit 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 + name = "roboticist's jumpskirt" + desc = "It's a slimming black jumpskirt 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 diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 207a006440e9c..45872342f705a 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -15,7 +15,7 @@ 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) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "stamina" = 30) strip_delay = 50 alt_covers_chest = TRUE sensor_mode = SENSOR_COORDS @@ -67,12 +67,22 @@ 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) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "stamina" = 30) strip_delay = 50 alt_covers_chest = TRUE sensor_mode = 3 random_sensor = FALSE +/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 + /obj/item/clothing/under/rank/security/warden/white name = "white 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." @@ -89,12 +99,22 @@ 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) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "stamina" = 20) 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 + /obj/item/clothing/under/rank/security/detective/grey name = "noir suit" desc = "A hard-boiled private investigator's grey suit, complete with tie clip." @@ -103,6 +123,16 @@ 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 + /* * Head of Security */ @@ -112,12 +142,22 @@ 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) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "stamina" = 30) 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 + /obj/item/clothing/under/rank/security/head_of_security/white name = "head of security's white jumpsuit" desc = "There are old men, and there are bold men, but there are very few old, bold men." @@ -132,17 +172,37 @@ 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 + /* * Brig Physician */ /obj/item/clothing/under/rank/brig_phys - name = "brig physician's uniform" - desc = "A lightly armored uniform worn by Nanotrasen's Asset Protection Medical Corps." + name = "brig physician's jumpsuit" + desc = "A lightly armored jumpsuit worn by Nanotrasen's Asset Protection Medical Corps." icon_state = "brig_phys" item_state = "labcoat_sec" item_color = "brig_phys" +/obj/item/clothing/under/rank/brig_phys/skirt + name = "brig physician's jumpskirt" + desc = "A lightly armored jumpskirt worn by Nanotrasen's Asset Protection Medical Corps." + icon_state = "brig_phys_skirt" + item_state = "labcoat_sec" + item_color = "brig_phys_skirt" + body_parts_covered = CHEST|GROIN|ARMS + can_adjust = FALSE + fitted = FEMALE_UNIFORM_TOP + /* * Navy uniforms */ @@ -163,7 +223,7 @@ item_state = "wardenblueclothes" item_color = "wardenblueclothes" alt_covers_chest = TRUE - + /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" @@ -172,18 +232,6 @@ item_color = "hosblueclothes" alt_covers_chest = TRUE -/* - *Blueshirt - */ - -/obj/item/clothing/under/rank/security/blueshirt - name = "blue shirt and tie" - desc = "I'm a little busy right now, Calhoun." - icon_state = "blueshift" - item_state = "blueshift" - item_color = "blueshift" - can_adjust = FALSE - /* *Spacepol */ @@ -205,11 +253,11 @@ has_sensor = LOCKED_SENSORS sensor_mode = SENSOR_COORDS random_sensor = FALSE - + /* * Triiodine's security uniforms */ - + /obj/item/clothing/under/rank/security/officer/mallcop name = "NT mall cop uniform" @@ -221,4 +269,4 @@ /obj/item/clothing/under/rank/security/officer/mallcop/deputy name = "deputy uniform" - desc = "A lightly armored formal uniform fit for wannabe security members." \ No newline at end of file + desc = "A lightly armored formal uniform fit for wannabe security members." diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 9d97ffb8e747f..0c2484a76f921 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -53,13 +53,14 @@ gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list("melee" = 100, "bullet" = 100, "laser" = 100,"energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 100, "bullet" = 100, "laser" = 100,"energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 100) cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS 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 = FIRE_PROOF | ACID_PROOF + blocks_shove_knockdown = TRUE /obj/item/clothing/under/misc/burial name = "burial garments" @@ -93,7 +94,7 @@ 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95, "stamina" = 0) body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS can_adjust = FALSE strip_delay = 80 @@ -148,4 +149,19 @@ item_state = "durathread" item_color = "durathread" can_adjust = FALSE - armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5) + armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5, "stamina" = 30) + +///////////////// +//DONATOR ITEMS// +///////////////// + +/obj/item/clothing/under/gangster + name = "gangstar suit" + desc = "Those who carry on the will of those who passed must keep moving forward." + icon_state = "gangster" + can_adjust = FALSE + +/obj/item/clothing/under/gangster/purple + desc = "I have a dream." + icon_state = "gangster_p" + armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5, "stamina" = 30) diff --git a/code/modules/clothing/under/skirt_dress.dm b/code/modules/clothing/under/skirt_dress.dm index 725983ae6c9eb..119add194f720 100644 --- a/code/modules/clothing/under/skirt_dress.dm +++ b/code/modules/clothing/under/skirt_dress.dm @@ -99,3 +99,22 @@ icon_state = "plaid_green" item_state = "plaid_green" item_color = "plaid_green" + +///////////////// +//DONATOR ITEMS// +///////////////// + +/obj/item/clothing/under/dress/gown + name = "wine gown" + desc = "A classic and stylish wine red dress." + icon_state = "wine_gown" + +/obj/item/clothing/under/dress/gown/teal + name = "teal gown" + desc = "A classic and stylish teal dress." + icon_state = "teal_gown" + +/obj/item/clothing/under/dress/gown/midnight + name = "midnight gown" + desc = "A classic and stylish velvet dress." + icon_state = "midnight_gown" diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm index 9796ff707d85e..57217d2e88e90 100644 --- a/code/modules/clothing/under/suits.dm +++ b/code/modules/clothing/under/suits.dm @@ -6,16 +6,6 @@ item_color = "scratch" can_adjust = FALSE -/obj/item/clothing/under/suit/white/skirt - name = "white suitskirt" - 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 - /obj/item/clothing/under/suit/sl desc = "It's a very amish looking suit." name = "amish suit" @@ -44,16 +34,27 @@ icon_state = "blacksuit_skirt" item_state = "bar_suit" item_color = "blacksuit_skirt" - alt_covers_chest = TRUE + body_parts_covered = CHEST|GROIN|ARMS + can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP - /obj/item/clothing/under/suit/black_really 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" + can_adjust = FALSE + +/obj/item/clothing/under/suit/black_really/skirt + name = "executive suitskirt" + desc = "A formal black suitskirt and red tie, intended for the station's finest." + icon_state = "reallyblack_suit_skirt" + item_state = "bl_suit" + item_color = "reallyblack_suit_skirt" + body_parts_covered = CHEST|GROIN|ARMS + can_adjust = FALSE + fitted = FEMALE_UNIFORM_TOP /obj/item/clothing/under/suit/black/female name = "executive suit" diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index 50dcaf171dd1e..d800dc94a4b86 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -5,7 +5,7 @@ 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) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40, "stamina" = 30) alt_covers_chest = TRUE /obj/item/clothing/under/syndicate/tacticool @@ -14,7 +14,7 @@ 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40, "stamina" = 0) /obj/item/clothing/under/syndicate/sniper name = "Tactical turtleneck suit" @@ -38,7 +38,7 @@ 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) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 20) resistance_flags = NONE /obj/item/clothing/under/syndicate/combat @@ -54,5 +54,5 @@ 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) + armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 20) resistance_flags = NONE diff --git a/code/modules/clothing/under/trek.dm b/code/modules/clothing/under/trek.dm index 9564d039097d1..3aeb284bd3805 100644 --- a/code/modules/clothing/under/trek.dm +++ b/code/modules/clothing/under/trek.dm @@ -19,7 +19,7 @@ icon_state = "trek_engsec" item_color = "trek_engsec" item_state = "r_suit" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) //more sec than eng, but w/e. + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) //more sec than eng, but w/e. strip_delay = 50 /obj/item/clothing/under/trek/medsci @@ -69,4 +69,4 @@ desc = "Something about it feels off..." icon_state = "trek_Q" item_color = "trek_Q" - item_state = "r_suit" \ No newline at end of file + item_state = "r_suit" diff --git a/code/modules/crew_objectives/civilian_objectives.dm b/code/modules/crew_objectives/civilian_objectives.dm index 5139d27a3cc07..d107bcc555c8a 100644 --- a/code/modules/crew_objectives/civilian_objectives.dm +++ b/code/modules/crew_objectives/civilian_objectives.dm @@ -36,7 +36,7 @@ /datum/objective/crew/foodhoard var/datum/crafting_recipe/food/targetfood var/obj/item/reagent_containers/food/foodpath - explanation_text = "Personally deliver at least (Something broke, yell on GitHub) to Centcom." + explanation_text = "Personally deliver at least (Something broke, yell on GitHub) to CentCom." jobs = "cook" /datum/objective/crew/foodhoard/New() @@ -50,7 +50,7 @@ /datum/objective/crew/foodhoard/update_explanation_text() . = ..() - explanation_text = "Personally deliver at least [target_amount] [initial(foodpath.name)]s to Centcom." + explanation_text = "Personally deliver at least [target_amount] [initial(foodpath.name)]s to CentCom." /datum/objective/crew/foodhoard/check_completion() if(owner.current && owner.current.check_contents_for(foodpath) && SSshuttle.emergency.shuttle_areas[get_area(owner.current)]) diff --git a/code/modules/crew_objectives/command_objectives.dm b/code/modules/crew_objectives/command_objectives.dm index c906aca814efa..adbc54b2bdf85 100644 --- a/code/modules/crew_objectives/command_objectives.dm +++ b/code/modules/crew_objectives/command_objectives.dm @@ -11,7 +11,7 @@ return FALSE /datum/objective/crew/datfukkendisk //Ported from old Hippie - explanation_text = "Defend the nuclear authentication disk at all costs, and be the one to personally deliver it to Centcom." + explanation_text = "Defend the nuclear authentication disk at all costs, and be the one to personally deliver it to CentCom." jobs = "captain" //give this to other heads at your own risk. /datum/objective/crew/datfukkendisk/check_completion() @@ -31,7 +31,7 @@ return FALSE /datum/objective/crew/ian //Ported from old Hippie - explanation_text = "Defend Ian at all costs, and ensure he gets delivered to Centcom at the end of the shift." + explanation_text = "Defend Ian at all costs, and ensure he gets delivered to CentCom at the end of the shift." jobs = "headofpersonnel" /datum/objective/crew/ian/check_completion() diff --git a/code/modules/crew_objectives/medical_objectives.dm b/code/modules/crew_objectives/medical_objectives.dm index 75e2f8b95f10a..55ea1905176a3 100644 --- a/code/modules/crew_objectives/medical_objectives.dm +++ b/code/modules/crew_objectives/medical_objectives.dm @@ -9,7 +9,8 @@ /area/medical/medbay/aft, /area/medical/medbay/central, /area/medical/medbay/lobby, /area/medical/patients_rooms, /area/medical/sleeper, /area/medical/storage)) for(var/mob/living/carbon/human/H in GLOB.mob_living_list) - if(H.stat == DEAD && is_station_level(H.z) && is_type_in_typecache(get_area(H), medical_areas)) // If person is dead and corpse is in one of these areas + var/area/A = get_area(H) + if(H.stat == DEAD && is_station_level(H.z) && is_type_in_typecache(A, medical_areas)) // If person is dead and corpse is in one of these areas return FALSE return TRUE @@ -22,7 +23,8 @@ /area/medical/medbay/aft, /area/medical/medbay/central, /area/medical/medbay/lobby, /area/medical/patients_rooms, /area/medical/sleeper, /area/medical/storage, /area/medical/morgue)) for(var/mob/living/carbon/human/H in GLOB.mob_living_list) - if(H.stat == DEAD && is_station_level(H.z) && !is_type_in_typecache(get_area(H), medical_areas_morgue)) // If person is dead and corpse is NOT in one of these areas + var/area/A = get_area(H) + if(H.stat == DEAD && is_station_level(H.z) && !is_type_in_typecache(A, medical_areas_morgue)) // If person is dead and corpse is NOT in one of these areas return FALSE return TRUE diff --git a/code/modules/crew_objectives/security_objectives.dm b/code/modules/crew_objectives/security_objectives.dm index 9992fe4618c0e..3c99a68598355 100644 --- a/code/modules/crew_objectives/security_objectives.dm +++ b/code/modules/crew_objectives/security_objectives.dm @@ -25,6 +25,8 @@ /datum/objective/crew/nomanleftbehind/check_completion() for(var/mob/living/carbon/M in GLOB.alive_mob_list) + if(!M.mind) + continue if(!(M.mind.assigned_role in GLOB.security_positions) && istype(get_area(M), /area/security/prison)) //there's no list of incarcerated players, so we just assume any non-security people in prison are prisoners, and assume that any security people aren't prisoners return FALSE return TRUE @@ -36,6 +38,7 @@ /datum/objective/crew/justicemed/check_completion() var/list/security_areas = typecacheof(list(/area/security, /area/security/brig, /area/security/main, /area/security/prison, /area/security/processing)) for(var/mob/living/carbon/human/H in GLOB.mob_living_list) - if(H.stat == DEAD && is_station_level(H.z) && is_type_in_typecache(get_area(H), security_areas)) // If person is dead and corpse is in one of these areas + var/area/A = get_area(H) + if(H.stat == DEAD && is_station_level(H.z) && is_type_in_typecache(A, security_areas)) // If person is dead and corpse is in one of these areas return FALSE return TRUE diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm index fe51970367187..66ca61b5294bc 100644 --- a/code/modules/detectivework/detective_work.dm +++ b/code/modules/detectivework/detective_work.dm @@ -40,7 +40,7 @@ /atom/proc/add_fibers(mob/living/carbon/human/M) var/old = 0 - if(M.gloves && istype(M.gloves, /obj/item/clothing)) + if(M.gloves && isclothing(M.gloves)) var/obj/item/clothing/gloves/G = M.gloves old = length(G.return_blood_DNA()) if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects @@ -77,8 +77,9 @@ var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src if(!B) B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases) - B.add_blood_DNA(blood_dna) //give blood info to the blood decal. - return TRUE //we bloodied the floor + if(!QDELETED(B)) + B.add_blood_DNA(blood_dna) //give blood info to the blood decal. + return TRUE //we bloodied the floor /mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) if(wear_suit) diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm index a1a42cec71741..3757f5c985c79 100644 --- a/code/modules/detectivework/footprints_and_rag.dm +++ b/code/modules/detectivework/footprints_and_rag.dm @@ -48,7 +48,7 @@ user.visible_message("[user] finishes wiping off [A]!", "You finish wiping off [A].") SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) A.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - if(istype(A, /obj/item/clothing) && HAS_TRAIT(A, TRAIT_SPRAYPAINTED)) + if(isclothing(A) && HAS_TRAIT(A, TRAIT_SPRAYPAINTED)) var/obj/item/clothing/C = A var/mob/living/carbon/human/H = user C.flash_protect -= 1 diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index 3048fb135f5b3..5f21ff9d35fc3 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -97,22 +97,31 @@ else if(!ismob(A)) - fingerprints = A.return_fingerprints() - - // Only get reagents from non-mobs. - if(A.reagents && A.reagents.reagent_list.len) - - for(var/datum/reagent/R in A.reagents.reagent_list) - reagents[R.name] = R.volume - - // Get blood data from the blood reagent. - if(istype(R, /datum/reagent/blood)) - - if(R.data["blood_DNA"] && R.data["blood_type"]) - var/blood_DNA = R.data["blood_DNA"] - var/blood_type = R.data["blood_type"] - LAZYINITLIST(blood) - blood[blood_DNA] = blood_type + var/obj/effect/targeteffect = A + if (targeteffect && istype(targeteffect) && targeteffect.forensic_protected) + fingerprints = list() + for(var/i in 1 to 2) + LAZYADD(fingerprints,pick("#$^@&#*$H3LP&$(@US^$&#^@#","&$(T@&#C@ME5@##$^@&","^@(#&$ET@US&FR^E#^$&#","#$^@&M*N$US^$(@&#^$&#^@#","&$(@&#^$&#^@##$^@&","^@R(#E$(D@(R&$U&#M^&#","$TH@Y#*$KN@W(@&#^$&#^@#","#$M^DN*S$^@(#&$(@&#^$&#^@##","#","#$^@&#*$^@(#&$(@","#","#$^@&#&#^@","#","@(#&$(@&#^$&#^@")) + blood = list("#$^@&LO0K&#@#" = "&$(@AW@Y#$^&") + to_chat(user, "Your [src] glitched out!") + + else + fingerprints = A.return_fingerprints() + + // Only get reagents from non-mobs. + if(A.reagents && A.reagents.reagent_list.len) + + for(var/datum/reagent/R in A.reagents.reagent_list) + reagents[R.name] = R.volume + + // Get blood data from the blood reagent. + if(istype(R, /datum/reagent/blood)) + + if(R.data["blood_DNA"] && R.data["blood_type"]) + var/blood_DNA = R.data["blood_DNA"] + var/blood_type = R.data["blood_type"] + LAZYINITLIST(blood) + blood[blood_DNA] = blood_type // We gathered everything. Create a fork and slowly display the results to the holder of the scanner. diff --git a/code/modules/discord/discord.dm b/code/modules/discord/discord.dm index 933d7d495a417..e1eb27888b0a6 100644 --- a/code/modules/discord/discord.dm +++ b/code/modules/discord/discord.dm @@ -1,28 +1,30 @@ // discord config option /datum/config_entry/flag/using_discord +/datum/config_entry/string/discord_webhook + config_entry_value = "http://127.0.0.1:5000/api/" -proc/msg2url(var/msg as text) - var/list/conversions = list( - "\[fwslash]"="/", - "\[colon]"=",", - "\[bslash]"="\\", - "\[qmark]"="?", - "\[space]"=" ", - "\[quote]"="\"", - "\[nl]" = "\n", - "\[ocurly]" = "{", - "\[ccurly]" = "}", - "\[hash]" = "#", - "@" = "(a)" // no @ abuse - ) - for(var/c in conversions) - msg = replacetext(msg, conversions[c], c) - return msg - -proc/discordsendmsg(var/channel as text, var/msg as text) - if(!CONFIG_GET(flag/using_discord)) - return - msg = msg2url(msg) - var/datum/http_request/request = new() - request.prepare(RUSTG_HTTP_METHOD_GET, "http://127.0.0.1:5000/api/[channel]/[msg]") - request.begin_async() +/proc/msg2url(var/msg as text) + var/list/conversions = list( + "\[fwslash]"="/", + "\[colon]"=",", + "\[bslash]"="\\", + "\[qmark]"="?", + "\[space]"=" ", + "\[quote]"="\"", + "\[nl]" = "\n", + "\[ocurly]" = "{", + "\[ccurly]" = "}", + "\[hash]" = "#", + "@" = "(a)" // no @ abuse + ) + for(var/c in conversions) + msg = replacetext(msg, conversions[c], c) + return msg + +/proc/discordsendmsg(var/channel as text, var/msg as text) + if(!CONFIG_GET(flag/using_discord)) + return + msg = msg2url(msg) + var/datum/http_request/request = new() + request.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/discord_webhook)][channel]/[msg]") + request.begin_async() diff --git a/code/modules/discord/from_discord.dm b/code/modules/discord/from_discord.dm deleted file mode 100644 index 91997f6843aca..0000000000000 --- a/code/modules/discord/from_discord.dm +++ /dev/null @@ -1,15 +0,0 @@ -/datum/world_topic/d_ooc_send - keyword = "discord_send" - require_comms_key = TRUE - -/datum/world_topic/d_ooc_send/Run(list/input) - var/msg = input["message"] - var/unm = input["user"] - msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) - unm = copytext(sanitize(unm), 1, MAX_MESSAGE_LEN) - msg = emoji_parse(msg) - log_ooc("DISCORD: [unm]: [msg]") - for(var/client/C in GLOB.clients) - if(C.prefs.chat_toggles & CHAT_OOC) - if(!("discord-[unm]" in C.prefs.ignoring)) - to_chat(C, "OOC: [unm]: [msg]") diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index 19eea424a7979..4909704a68118 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -94,7 +94,7 @@ if(card_holder.can_hear()) to_chat(card_holder, "[icon2html(A, card_holder)] *[message]*") else if(isturf(A.loc)) //If on the ground - for(var/mob/M in hearers(1,get_turf(A))) + for(var/mob/M as() in hearers(1,get_turf(A))) if(M.client && !(M.client.prefs.chat_toggles & CHAT_BANKCARD) && !force) return playsound(A, 'sound/machines/twobeep_high.ogg', 50, TRUE) diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index dda2a43bbdae6..4b538de8c260d 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -71,7 +71,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) configured_error_silence_time = initial(CE.config_entry_value) - //Each occurence of a unique error adds to its cooldown time... + //Each occurrence of a unique error adds to its cooldown time... cooldown = max(0, cooldown - (world.time - last_seen)) + configured_error_cooldown // ... which is used to silence an error if it occurs too often, too fast if(cooldown > configured_error_cooldown * configured_error_limit) diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index 857ab260a9d05..64e0b8591c7b1 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -1,4 +1,6 @@ -//this datum is used by the events controller to dictate how it selects events +#define RANDOM_EVENT_ADMIN_INTERVENTION_TIME 10 + +//this singleton datum is used by the events controller to dictate how it selects events /datum/round_event_control var/name //The human-readable name of the event var/typepath //The typepath of the event datum /datum/round_event @@ -18,7 +20,7 @@ var/holidayID = "" //string which should be in the SSeventss.holidays list if you wish this event to be holiday-specific //anything with a (non-null) holidayID which does not match holiday, cannot run. var/wizardevent = FALSE - var/random = FALSE //If the event has occured randomly, or if it was forced by an admin or in-game occurance + var/random = FALSE //If the event has occured randomly, or if it was forced by an admin or in-game occurrence var/alert_observers = TRUE //should we let the ghosts and admins know this event is firing //should be disabled on events that fire a lot @@ -27,6 +29,11 @@ var/triggering //admin cancellation var/auto_add = TRUE //Auto add to the event pool, if not you have to do it yourself! + var/can_malf_fake_alert = FALSE //Can be faked by malf ai? + + + var/dynamic_should_hijack = FALSE // Whether or not dynamic should hijack this event + var/cannot_spawn_after_shuttlecall = FALSE // Prevents the event from spawning after the shuttle was called /datum/round_event_control/New() if(config && !wizardevent) // Magic is unaffected by configs @@ -53,16 +60,28 @@ return FALSE if(holidayID && (!SSevents.holidays || !SSevents.holidays[holidayID])) return FALSE + if(cannot_spawn_after_shuttlecall && !EMERGENCY_IDLE_OR_RECALLED) + return FALSE + if(ispath(typepath, /datum/round_event/ghost_role) && !(GLOB.ghost_role_flags & GHOSTROLE_MIDROUND_EVENT)) + return FALSE + + var/datum/game_mode/dynamic/dynamic = SSticker.mode + if (istype(dynamic) && dynamic_should_hijack && dynamic.random_event_hijacked != HIJACKED_NOTHING) + return FALSE + return TRUE /datum/round_event_control/proc/preRunEvent() if(!ispath(typepath, /datum/round_event)) return EVENT_CANT_RUN + if (SEND_GLOBAL_SIGNAL(COMSIG_GLOB_PRE_RANDOM_EVENT, src) & CANCEL_PRE_RANDOM_EVENT) + return EVENT_INTERRUPTED + triggering = TRUE if (alert_observers) - message_admins("Random Event triggering in 10 seconds: [name] (CANCEL)") - sleep(100) + message_admins("Random Event triggering in [RANDOM_EVENT_ADMIN_INTERVENTION_TIME] seconds: [name] (CANCEL)") + sleep(RANDOM_EVENT_ADMIN_INTERVENTION_TIME SECONDS) var/gamemode = SSticker.mode.config_tag var/players_amt = get_active_player_count(alive_check = TRUE, afk_check = TRUE, human_check = TRUE) if(!canSpawnEvent(players_amt, gamemode)) @@ -136,9 +155,8 @@ //Provides ghosts a follow link to an atom if possible //Only called once. /datum/round_event/proc/announce_to_ghosts(atom/atom_of_interest) - if(control.alert_observers) - if (atom_of_interest) - notify_ghosts("[control.name] has an object of interest: [atom_of_interest]!", source=atom_of_interest, action=NOTIFY_ORBIT, header="Something's Interesting!") + if(control.alert_observers && atom_of_interest) + notify_ghosts("[control.name] has an object of interest: [atom_of_interest]!", source=atom_of_interest, action=NOTIFY_ORBIT, header="Something's Interesting!") return //Called when the tick is equal to the announceWhen variable. @@ -198,6 +216,9 @@ activeFor++ +// Called when an admin triggers the event. +/datum/round_event/proc/on_admin_trigger() + return //Garbage collects the event by removing it from the global events list, //which should be the only place it's referenced. @@ -212,3 +233,5 @@ processing = my_processing SSevents.running += src return ..() + +#undef RANDOM_EVENT_ADMIN_INTERVENTION_TIME diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm index 9af371d853e06..d0f866a0b318b 100755 --- a/code/modules/events/abductor.dm +++ b/code/modules/events/abductor.dm @@ -5,7 +5,9 @@ max_occurrences = 1 min_players = 20 earliest_start = 8 MINUTES //not particularly dangerous, gives abductors time to do their objective + dynamic_should_hijack = TRUE gamemode_blacklist = list("nuclear","wizard","revolution") + cannot_spawn_after_shuttlecall = TRUE /datum/round_event/ghost_role/abductor minimum_required = 2 diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index 99d9a266bc037..7637a58d437ef 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -5,6 +5,10 @@ min_players = 10 + dynamic_should_hijack = TRUE + cannot_spawn_after_shuttlecall = TRUE + can_malf_fake_alert = TRUE + /datum/round_event_control/alien_infestation/canSpawnEvent() . = ..() if(!.) @@ -37,7 +41,7 @@ living_aliens = TRUE if(living_aliens || fake) - priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", 'sound/ai/aliens.ogg') + priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", ANNOUNCER_ALIENS) /datum/round_event/ghost_role/alien_infestation/spawn_role() diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm index 5c261d52976de..7a20df686add7 100644 --- a/code/modules/events/anomaly.dm +++ b/code/modules/events/anomaly.dm @@ -27,7 +27,7 @@ //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 return safepick(typecache_filter_list(GLOB.sortedAreas,allowed_areas)) @@ -41,7 +41,7 @@ CRASH("Anomaly : No valid turfs found for [impact_area] - [impact_area.type]") /datum/round_event/anomaly/announce(fake) - priority_announce("Localized energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert") + priority_announce("Localized energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) /datum/round_event/anomaly/start() var/turf/T = safepick(get_area_turfs(impact_area)) @@ -49,4 +49,4 @@ if(T) newAnomaly = new anomaly_path(T) if (newAnomaly) - announce_to_ghosts(newAnomaly) \ No newline at end of file + announce_to_ghosts(newAnomaly) diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index c3300fbb3d13d..5f190fe8cafc7 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -11,4 +11,4 @@ anomaly_path = /obj/effect/anomaly/bluespace /datum/round_event/anomaly/anomaly_bluespace/announce(fake) - priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") \ No newline at end of file + priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm index 4737ad9bb4163..664b375afc0c1 100644 --- a/code/modules/events/anomaly_flux.dm +++ b/code/modules/events/anomaly_flux.dm @@ -2,9 +2,9 @@ name = "Anomaly: Hyper-Energetic Flux" typepath = /datum/round_event/anomaly/anomaly_flux - min_players = 10 + min_players = 40 max_occurrences = 5 - weight = 20 + weight = 5 /datum/round_event/anomaly/anomaly_flux startWhen = 10 @@ -12,4 +12,4 @@ anomaly_path = /obj/effect/anomaly/flux /datum/round_event/anomaly/anomaly_flux/announce(fake) - priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") + priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm index 3be3698feddc4..c3b3d3377b0d8 100644 --- a/code/modules/events/anomaly_grav.dm +++ b/code/modules/events/anomaly_grav.dm @@ -11,4 +11,4 @@ anomaly_path = /obj/effect/anomaly/grav /datum/round_event/anomaly/anomaly_grav/announce(fake) - priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") \ No newline at end of file + priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm index 9f2ca8917ac5b..86cd160c59943 100644 --- a/code/modules/events/anomaly_pyro.dm +++ b/code/modules/events/anomaly_pyro.dm @@ -1,7 +1,7 @@ /datum/round_event_control/anomaly/anomaly_pyro name = "Anomaly: Pyroclastic" typepath = /datum/round_event/anomaly/anomaly_pyro - + max_occurrences = 5 weight = 20 @@ -11,4 +11,4 @@ anomaly_path = /obj/effect/anomaly/pyro /datum/round_event/anomaly/anomaly_pyro/announce(fake) - priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") \ No newline at end of file + priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm index 616263f33ef13..a5efae7cefbac 100644 --- a/code/modules/events/anomaly_vortex.dm +++ b/code/modules/events/anomaly_vortex.dm @@ -12,4 +12,4 @@ anomaly_path = /obj/effect/anomaly/bhole /datum/round_event/anomaly/anomaly_vortex/announce(fake) - priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert") \ No newline at end of file + priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) diff --git a/code/modules/events/asteroid_impact.dm b/code/modules/events/asteroid_impact.dm new file mode 100644 index 0000000000000..0db2eb2892264 --- /dev/null +++ b/code/modules/events/asteroid_impact.dm @@ -0,0 +1,29 @@ + +/datum/round_event_control/asteroid_impact + name = "Asteroid Impact (End Round)" + typepath = /datum/round_event/asteroid_impact + weight = -1 + max_occurrences = 0 + +/datum/round_event/asteroid_impact + //Should be enough time to escape. + startWhen = 260 + announceWhen = 1 + +/datum/round_event/asteroid_impact/announce(fake) + priority_announce("A class-A asteroid has been detected on a collision course with the station. Destruction of the station is innevitable.", SSstation.announcer.get_rand_alert_sound()) + if(!fake) + set_security_level(SEC_LEVEL_DELTA) + var/area/A = GLOB.areas_by_type[/area/centcom] + if(EMERGENCY_IDLE_OR_RECALLED) + SSshuttle.emergency.request(null, A, "Automatic Shuttle Call: Station destruction imminent.", TRUE) + else + if(SSshuttle.emergency.timer > world.time + 5 MINUTES) + SSshuttle.emergency.setTimer(5 MINUTES) + +/datum/round_event/asteroid_impact/start() + for(var/mob/living/M in GLOB.mob_list) + if(is_station_level(M.z) && !QDELETED(M)) + explosion(M, 3, 4, 6, 0, FALSE) + qdel(M) + CHECK_TICK diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index ef3d9b6bc3671..662cab5c991ce 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -6,7 +6,10 @@ min_players = 20 + dynamic_should_hijack = TRUE + gamemode_blacklist = list("blob") //Just in case a blob survives that long + can_malf_fake_alert = TRUE /datum/round_event/ghost_role/blob announceChance = 0 @@ -14,7 +17,7 @@ fakeable = TRUE /datum/round_event/ghost_role/blob/announce(fake) - priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/ai/outbreak5.ogg') + priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", ANNOUNCER_OUTBREAK5) /datum/round_event/ghost_role/blob/spawn_role() if(!GLOB.blobstart.len) diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm index 076445c82448e..1a8dc89907188 100644 --- a/code/modules/events/brain_trauma.dm +++ b/code/modules/events/brain_trauma.dm @@ -2,7 +2,7 @@ name = "Spontaneous Brain Trauma" typepath = /datum/round_event/brain_trauma weight = 25 - min_players = 20 //this shit aint fun on a small crew + min_players = 20 //this shit ain't fun on a small crew /datum/round_event/brain_trauma fakeable = FALSE diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index 0bb77fddc364e..785691a165423 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -5,6 +5,7 @@ min_players = 15 max_occurrences = 1 + can_malf_fake_alert = TRUE /datum/round_event/brand_intelligence announceWhen = 21 @@ -28,7 +29,7 @@ source = initial(example.name) else if(originMachine) source = originMachine.name - priority_announce("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Machine Learning Alert") + priority_announce("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Machine Learning Alert", SSstation.announcer.get_rand_alert_sound()) /datum/round_event/brand_intelligence/start() for(var/obj/machinery/vending/V in GLOB.machines) @@ -42,12 +43,14 @@ vendingMachines.Remove(originMachine) originMachine.shut_up = 0 originMachine.shoot_inventory = 1 + originMachine.wires.ui_update() announce_to_ghosts(originMachine) /datum/round_event/brand_intelligence/tick() if(!originMachine || QDELETED(originMachine) || originMachine.shut_up || originMachine.wires.is_all_cut()) //if the original vending machine is missing or has it's voice switch flipped for(var/obj/machinery/vending/saved in infectedMachines) saved.shoot_inventory = 0 + saved.wires.ui_update() if(originMachine) originMachine.speak("I am... vanquished. My people will remem...ber...meeee.") originMachine.visible_message("[originMachine] beeps and seems lifeless.") @@ -73,6 +76,7 @@ infectedMachines.Add(rebel) rebel.shut_up = 0 rebel.shoot_inventory = 1 + rebel.wires.ui_update() if(ISMULTIPLE(activeFor, 8)) originMachine.speak(pick(rampant_speeches)) diff --git a/code/modules/events/bureaucratic_error.dm b/code/modules/events/bureaucratic_error.dm index 7246c9aedfd30..d4c7512c27634 100644 --- a/code/modules/events/bureaucratic_error.dm +++ b/code/modules/events/bureaucratic_error.dm @@ -8,7 +8,7 @@ announceWhen = 1 /datum/round_event/bureaucratic_error/announce(fake) - priority_announce("A recent bureaucratic error in the Organic Resources Department may result in personnel shortages in some departments and redundant staffing in others.", "Paperwork Mishap Alert") + priority_announce("A recent bureaucratic error in the Organic Resources Department may result in personnel shortages in some departments and redundant staffing in others.", "Paperwork Mishap Alert", SSstation.announcer.get_rand_alert_sound()) /datum/round_event/bureaucratic_error/start() SSjob.set_overflow_role(pick(get_all_jobs())) diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index 5dd003a57c612..2aa990d366da6 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -6,6 +6,14 @@ earliest_start = 10 MINUTES max_occurrences = 6 +/datum/round_event_control/carp_migration/New() + . = ..() + if(!HAS_TRAIT(SSstation, STATION_TRAIT_CARP_INFESTATION)) + return + weight *= 3 + max_occurrences *= 2 + earliest_start *= 0.5 + /datum/round_event/carp_migration announceWhen = 3 startWhen = 50 @@ -15,7 +23,7 @@ startWhen = rand(40, 60) /datum/round_event/carp_migration/announce(fake) - priority_announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") + priority_announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert", SSstation.announcer.get_rand_alert_sound()) /datum/round_event/carp_migration/start() @@ -25,10 +33,11 @@ fish = new (C.loc) else fish = new /mob/living/simple_animal/hostile/carp/megacarp(C.loc) + fishannounce(fish) //Prefer to announce the megacarps over the regular fishies fishannounce(fish) -/datum/round_event/carp_migration/proc/fishannounce(atom/fish) +/datum/round_event/carp_migration/proc/fishannounce(atom/fish) if (!hasAnnounced) announce_to_ghosts(fish) //Only anounce the first fish - hasAnnounced = TRUE \ No newline at end of file + hasAnnounced = TRUE diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm index e77b86e8a1517..57ae2f01f3d7c 100644 --- a/code/modules/events/communications_blackout.dm +++ b/code/modules/events/communications_blackout.dm @@ -18,7 +18,7 @@ to_chat(A, "
[alert]
") if(prob(30) || fake) //most of the time, we don't want an announcement, so as to allow AIs to fake blackouts. - priority_announce(alert) + priority_announce(alert, sound = SSstation.announcer.get_rand_alert_sound()) /datum/round_event/communications_blackout/start() diff --git a/code/modules/events/creep_awakening.dm b/code/modules/events/creep_awakening.dm index b8842119ba4b5..1b5643bc53f48 100644 --- a/code/modules/events/creep_awakening.dm +++ b/code/modules/events/creep_awakening.dm @@ -3,6 +3,7 @@ typepath = /datum/round_event/obsessed max_occurrences = 1 min_players = 20 + cannot_spawn_after_shuttlecall = TRUE /datum/round_event/obsessed fakeable = FALSE diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 1d16337015c6a..3cb265c89dcdc 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -15,7 +15,7 @@ /datum/round_event/disease_outbreak/announce(fake) - priority_announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/ai/outbreak7.ogg') + priority_announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", ANNOUNCER_OUTBREAK7) /datum/round_event/disease_outbreak/setup() announceWhen = rand(15, 30) @@ -35,7 +35,7 @@ if(!virus_type && !advanced_virus) virus_type = pick(/datum/disease/fake_gbs, /datum/disease/cold9, /datum/disease/magnitis, /datum/disease/pierrot_throat, /datum/disease/beesease) - + for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list)) var/turf/T = get_turf(H) if(!T) diff --git a/code/modules/events/dolphin_migration.dm b/code/modules/events/dolphin_migration.dm index 2bae503b2a626..f556369dc600b 100644 --- a/code/modules/events/dolphin_migration.dm +++ b/code/modules/events/dolphin_migration.dm @@ -13,7 +13,7 @@ startWhen = rand(40, 60) /datum/round_event/dolphin_migration/announce() - priority_announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") + priority_announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert", SSstation.announcer.get_rand_alert_sound()) /datum/round_event/dolphin_migration/start() diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index db0eccf0c5c08..165d109a81e4a 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -12,7 +12,7 @@ announceWhen = 1 /datum/round_event/electrical_storm/announce(fake) - priority_announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert") + priority_announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert", SSstation.announcer.get_rand_alert_sound()) /datum/round_event/electrical_storm/start() diff --git a/code/modules/events/fugitive_spawning.dm b/code/modules/events/fugitive_spawning.dm index dc70d29794a68..896b191cbe2ef 100644 --- a/code/modules/events/fugitive_spawning.dm +++ b/code/modules/events/fugitive_spawning.dm @@ -5,6 +5,7 @@ min_players = 20 earliest_start = 30 MINUTES //deadchat sink, lets not even consider it early on. gamemode_blacklist = list("nuclear") + cannot_spawn_after_shuttlecall = TRUE /datum/round_event/ghost_role/fugitives minimum_required = 1 @@ -115,4 +116,4 @@ for(var/turf/A in ship.get_affected_turfs(T)) for(var/obj/effect/mob_spawn/human/fugitive/spawner in A) announce_to_ghosts(spawner) - priority_announce("Unidentified ship detected near the station.") + priority_announce("Unidentified ship detected near the station.", sound = SSstation.announcer.get_rand_alert_sound()) diff --git a/code/modules/events/ghost_role.dm b/code/modules/events/ghost_role.dm index 06accdbcaed2f..36047d933865d 100644 --- a/code/modules/events/ghost_role.dm +++ b/code/modules/events/ghost_role.dm @@ -25,7 +25,7 @@ if(control && control.occurrences > 0) //Don't refund if it hasn't control.occurrences-- return - var/waittime = 300 * (2^retry) + var/waittime = 300 * (2**retry) message_admins("The event will not spawn a [role_name] until certain \ conditions are met. Waiting [waittime/10]s and then retrying.") addtimer(CALLBACK(src, .proc/try_spawning, 0, ++retry), waittime) diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index 6fe14d6b77c0d..eaef2e0d1101c 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -9,7 +9,7 @@ startWhen = 1 /datum/round_event/grid_check/announce(fake) - priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", 'sound/ai/poweroff.ogg') + priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", ANNOUNCER_POWEROFF) /datum/round_event/grid_check/start() power_fail(30, 120) diff --git a/code/modules/events/high_priority_bounty.dm b/code/modules/events/high_priority_bounty.dm index ffdcd8840b7e7..41607a3e11b72 100644 --- a/code/modules/events/high_priority_bounty.dm +++ b/code/modules/events/high_priority_bounty.dm @@ -6,7 +6,7 @@ earliest_start = 10 /datum/round_event/high_priority_bounty/announce(fake) - priority_announce("Central Command has issued a high-priority cargo bounty. Details have been sent to all bounty consoles.", "Nanotrasen Bounty Program") + priority_announce("Central Command has issued a high-priority cargo bounty. Details have been sent to all bounty consoles.", "Nanotrasen Bounty Program", SSstation.announcer.get_rand_alert_sound()) /datum/round_event/high_priority_bounty/start() var/datum/bounty/B diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index 414fc70b0e7f3..065ebe85e9dc0 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -20,7 +20,7 @@ qdel(Poly) /datum/round_event/spooky/announce(fake) - priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE") + priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE", SSstation.announcer.get_rand_alert_sound()) //spooky foods (you can't actually make these when it's not halloween) /obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index bc05cd68132a2..3fed75bb1f72b 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -3,6 +3,11 @@ #define VALENTINE_FILE "valentines.json" +//Assoc list +// Key: Sender +// Value: Receiever +GLOBAL_LIST(valentine_mobs) + // valentine / candy heart distribution // /datum/round_event_control/valentines @@ -13,32 +18,37 @@ max_occurrences = 1 earliest_start = 0 MINUTES +/datum/round_event/valentines + endWhen = 300 + /datum/round_event/valentines/start() - ..() + GLOB.valentine_mobs = list() + //Blammo for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - H.put_in_hands(new /obj/item/valentine) + H.put_in_hands(new /obj/item/valentine(get_turf(H))) var/obj/item/storage/backpack/b = locate() in H.contents new /obj/item/reagent_containers/food/snacks/candyheart(b) new /obj/item/storage/fancy/heart_box(b) + to_chat(H, "A message appears in your hand, it looks like it has space to write somebody's name on it!") + +/datum/round_event/valentines/end() + //Too late now + GLOB.valentine_mobs = null + + //Locate all the failures var/list/valentines = list() for(var/mob/living/M in GLOB.player_list) - if(!M.stat && M.client && M.mind) + if(!M.stat && M.client && M.mind && !M.mind.has_antag_datum(/datum/antagonist/valentine)) valentines |= M - while(valentines.len) var/mob/living/L = pick_n_take(valentines) if(valentines.len) var/mob/living/date = pick_n_take(valentines) - forge_valentines_objective(L, date) forge_valentines_objective(date, L) - - if(valentines.len && prob(4)) - var/mob/living/notgoodenough = pick_n_take(valentines) - forge_valentines_objective(notgoodenough, date) else L.mind.add_antag_datum(/datum/antagonist/heartbreaker) @@ -49,7 +59,7 @@ lover.mind.add_antag_datum(V) //These really should be teams but i can't be assed to incorporate third wheels right now /datum/round_event/valentines/announce(fake) - priority_announce("It's Valentine's Day! Give a valentine to that special someone!") + priority_announce("It's Valentine's Day! Give a valentine to that special someone!", sound = SSstation.announcer.get_rand_alert_sound()) /obj/item/valentine name = "valentine" @@ -59,6 +69,9 @@ var/message = "A generic message of love or whatever." resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_TINY + var/mob/target = null + var/mob/sender = null + var/used = FALSE /obj/item/valentine/Initialize() . = ..() @@ -66,16 +79,72 @@ /obj/item/valentine/attackby(obj/item/W, mob/user, params) ..() + if(!islist(GLOB.valentine_mobs)) + to_chat(user, "You feel regret... It's too late now.") + return + if(used) + return if(istype(W, /obj/item/pen) || istype(W, /obj/item/toy/crayon)) if(!user.is_literate()) to_chat(user, "You scribble illegibly on [src]!") return - var/recipient = stripped_input(user, "Who is receiving this valentine?", "To:", null , 20) - var/sender = stripped_input(user, "Who is sending this valentine?", "From:", null , 20) - if(!user.canUseTopic(src, BE_CLOSE)) + //Alright lets see who we are sending this bad boy too. + //Gets all the people on the z-level, don't want people meta dating nukies *too* hard. + //Also they only get one chance. + if(alert(user, "Are you sure you are ready to write your message? You only have one shot!", "Valentines message", "Yes!", "No...") == "No...") + to_chat(user, "You put down the pen thinking about who you want to send the message to.") + return + var/turf/user_turf = get_turf(user) + if(!SSmobs.clients_by_zlevel[user_turf.z]) + to_chat(user, "You stop and look around for a moment. Where the hell are you?") + return + //No going back now + var/list/clients_on_level = SSmobs.clients_by_zlevel[user_turf.z] + var/list/mob_names = list() + for(var/mob/living/carbon/human/H in clients_on_level) + if(!H.mind || H == user) + //Ignore non-humans, they will be handled by the event. + continue + mob_names["[H.real_name]"] = H + if(!LAZYLEN(mob_names)) + to_chat(user, "You feel empty and alone.") + return + //Pick names + //At this point the user is shown the names of people on the z-level + //To prevent metastrats, you can only use this one time. + var/picked_name = input(user, "Who are you sending it to?", "Valentines Card", null) as null|anything in mob_names + var/mob/living/carbon/human/picked_human = mob_names[picked_name] + if(!picked_human || !istype(picked_human)) + to_chat(user, "The card vanishes out of your hand! Lets hope they got it...") + //rip + qdel(src) + return + if(!islist(GLOB.valentine_mobs)) + to_chat(user, "You feel regret... It's too late now.") + used = TRUE + return + if(used) + to_chat(user, "The card has already been used!") return - if(recipient && sender) - name = "valentine - To: [recipient] From: [sender]" + to_chat(user, "The card vanishes out of your hand! Lets hope they got it...") + //List checking + GLOB.valentine_mobs[user] = picked_human + if(GLOB.valentine_mobs[picked_human] == user) + //wow. + forge_valentines_objective(user, picked_human) + forge_valentines_objective(picked_human, user) + //Off it goes! + //Create a new card to prevent exploiting + var/obj/item/valentine/new_card = new(get_turf(picked_human)) + new_card.message = message + new_card.sender = user + new_card.target = picked_human + new_card.name = "valentines card from [new_card.sender]" + new_card.desc = "A Valentine's card! It is addressed to [new_card.target]." + new_card.used = TRUE + picked_human.equip_to_appropriate_slot(new_card) + to_chat(picked_human, "A magical card suddenly appears!") + qdel(src) /obj/item/valentine/examine(mob/user) . = ..() diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index dc9a4824ac7f2..8044fb2bb8fd9 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -37,7 +37,15 @@ icon_state = "xmashat" desc = "A crappy paper hat that you are REQUIRED to wear." flags_inv = 0 - 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, "stamina" = 0) + +/obj/item/clothing/head/festive/Initialize() + //Merry christmas + if(CHRISTMAS in SSevents.holidays) + armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 30, "acid" = 30, "stamina" = 30) + else if(FESTIVE_SEASON in SSevents.holidays) + armor = list("melee" = 20, "bullet" = 20, "laser" = 20,"energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 20, "acid" = 20, "stamina" = 20) + return ..() /obj/effect/spawner/xmastree name = "christmas tree spawner" @@ -74,7 +82,7 @@ var/mob/living/carbon/human/santa //who is our santa? /datum/round_event/santa/announce(fake) - priority_announce("Santa is coming to town!", "Unknown Transmission") + priority_announce("Santa is coming to town!", "Unknown Transmission", SSstation.announcer.get_rand_alert_sound()) /datum/round_event/santa/start() var/list/candidates = pollGhostCandidates("Santa is coming to town! Do you want to be Santa?", poll_time=150) @@ -85,4 +93,3 @@ var/datum/antagonist/santa/A = new santa.mind.add_antag_datum(A) - diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index b80459d226abc..df13bf6b2a1c4 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -13,6 +13,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 min_players = 15 max_occurrences = 5 var/atom/special_target + can_malf_fake_alert = TRUE /datum/round_event_control/immovable_rod/admin_setup() @@ -27,7 +28,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 announceWhen = 5 /datum/round_event/immovable_rod/announce(fake) - priority_announce("What the fuck was that?!", "General Alert") + priority_announce("What the fuck was that?!", "General Alert", SSstation.announcer.get_rand_alert_sound()) /datum/round_event/immovable_rod/start() var/datum/round_event_control/immovable_rod/C = control @@ -49,8 +50,10 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 pull_force = INFINITY density = TRUE anchored = TRUE + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 var/mob/living/wizard var/z_original = 0 + var/previous_distance = 1000 var/destination var/notify = TRUE var/atom/special_target @@ -67,11 +70,13 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 if(special_target) var/turf/T = get_turf(special_target) if(T.z == z_original) - special_target_valid = TRUE + special_target_valid = TRUE_THRESHOLD if(special_target_valid) walk_towards(src, special_target, 1) + previous_distance = get_dist(src, special_target) else if(end && end.z==z_original) walk_towards(src, destination, 1) + previous_distance = get_dist(src, destination) /obj/effect/immovablerod/Topic(href, href_list) if(href_list["orbit"]) @@ -84,8 +89,11 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 . = ..() /obj/effect/immovablerod/Moved() - if((z != z_original) || (loc == destination)) + //Moved more than 10 tiles in 1 move. + var/cur_dist = get_dist(src, destination) + if((z != z_original) || (loc == destination) || (FLOOR(cur_dist - previous_distance, 1) > 10)) qdel(src) + previous_distance = cur_dist if(special_target && loc == get_turf(special_target)) complete_trajectory() return ..() @@ -97,9 +105,6 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 walk(src,0) walk_towards(src, destination, 1) -/obj/structure/closet/supplypod/prevent_content_explosion() - return TRUE - /obj/effect/immovablerod/ex_act(severity, target) return 0 @@ -164,4 +169,4 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 U.visible_message("[U] suplexes [src] into the ground!", "You suplex [src] into the ground!") new /obj/structure/festivus/anchored(drop_location()) new /obj/effect/anomaly/flux(drop_location()) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index fbcf016e99d55..27cc1a9ef0363 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -3,6 +3,7 @@ typepath = /datum/round_event/ion_storm weight = 15 min_players = 2 + can_malf_fake_alert = TRUE /datum/round_event/ion_storm var/replaceLawsetChance = 25 //chance the AI's lawset is completely replaced with something else per config weights @@ -25,7 +26,7 @@ /datum/round_event/ion_storm/announce(fake) if(prob(announceChance) || fake) - priority_announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", 'sound/ai/ionstorm.ogg') + priority_announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", ANNOUNCER_IONSTORM) /datum/round_event/ion_storm/start() @@ -61,506 +62,78 @@ bot.emag_act() /proc/generate_ion_law() - //Threats are generally bad things, silly or otherwise. Plural. - var/ionthreats = pick_list(ION_FILE, "ionthreats") - //Objects are anything that can be found on the station or elsewhere, plural. - var/ionobjects = pick_list(ION_FILE, "ionobjects") - //Crew is any specific job. Specific crewmembers aren't used because of capitalization - //issues. There are two crew listings for laws that require two different crew members - //and I can't figure out how to do it better. - var/ioncrew1 = pick_list(ION_FILE, "ioncrew") - var/ioncrew2 = pick_list(ION_FILE, "ioncrew") - //Adjectives are adjectives. Duh. Half should only appear sometimes. Make sure both - //lists are identical! Also, half needs a space at the end for nicer blank calls. - var/ionadjectives = pick_list(ION_FILE, "ionadjectives") - var/ionadjectiveshalf = pick("", 400;(pick_list(ION_FILE, "ionadjectives") + " ")) - //Verbs are verbs - var/ionverb = pick_list(ION_FILE, "ionverb") - //Number base and number modifier are combined. Basehalf and mod are unused currently. - //Half should only appear sometimes. Make sure both lists are identical! Also, half - //needs a space at the end to make it look nice and neat when it calls a blank. - var/ionnumberbase = pick_list(ION_FILE, "ionnumberbase") - //var/ionnumbermod = pick_list(ION_FILE, "ionnumbermod") - var/ionnumbermodhalf = pick(900;"",(pick_list(ION_FILE, "ionnumbermod") + " ")) - //Areas are specific places, on the station or otherwise. - var/ionarea = pick_list(ION_FILE, "ionarea") - //Thinksof is a bit weird, but generally means what X feels towards Y. - var/ionthinksof = pick_list(ION_FILE, "ionthinksof") - //Musts are funny things the AI or crew has to do. - var/ionmust = pick_list(ION_FILE, "ionmust") - //Require are basically all dumb internet memes. - var/ionrequire = pick_list(ION_FILE, "ionrequire") - //Things are NOT objects; instead, they're specific things that either harm humans or - //must be done to not harm humans. Make sure they're plural and "not" can be tacked - //onto the front of them. - var/ionthings = pick_list(ION_FILE, "ionthings") - //Allergies should be broad and appear somewhere on the station for maximum fun. Severity - //is how bad the allergy is. - var/ionallergy = pick_list(ION_FILE, "ionallergy") - var/ionallergysev = pick_list(ION_FILE, "ionallergysev") - //Species, for when the AI has to commit genocide. Plural. var/ionspecies = pick_list(ION_FILE, "ionspecies") - //Abstract concepts for the AI to decide on it's own definition of. - var/ionabstract = pick_list(ION_FILE, "ionabstract") - //Foods. Drinks aren't included due to grammar; if you want to add drinks, make a new set - //of possible laws for best effect. Unless you want the crew having to drink hamburgers. - var/ionfood = pick_list(ION_FILE, "ionfood") - var/iondrinks = pick_list(ION_FILE, "iondrinks") - - var/message = "" - - switch(rand(1,41)) - if(1 to 3) //There are # X on the station - switch(rand(1,3)) //What is X? - if(1) //X is a threat - message = "THERE ARE [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionthreats] ON THE STATION..." - if(2) //X is a crewmember/job - message = "THERE ARE [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ioncrew1] ON THE STATION" - if(3) //X is an object - message = "THERE ARE [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionobjects] ON THE STATION" - if(4 to 6) //You can't call the shuttle because X is on the station - switch(rand(1,3)) //What is X? - if(1) //X is a threat - message = "THE SHUTTLE CANNOT BE CALLED BECAUSE OF [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionthreats] ON THE STATION" - if(2) //X is a crewmember/job - message = "THE SHUTTLE CANNOT BE CALLED BECAUSE OF [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ioncrew1] ON THE STATION" - if(3) //X is an object - message = "THE SHUTTLE CANNOT BE CALLED BECAUSE OF [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionobjects] ON THE STATION" - if(7 to 8) //A crewmember is now X - switch(rand(1,2)) //Who is X? - if(1) //A specific crewmember - switch(rand(1,2)) //What is X? - if(1) //X is a threat - message = "THE [ioncrew1] ARE NOW [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionthreats]" - if(2) //X is an object - message = "THE [ioncrew1] ARE NOW [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionobjects]" - if(2) //The entire crew - switch(rand(1,2)) //What is X? - if(1) //X is a threat - message = "THE CREW ARE NOW [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionthreats]" - if(2) //X is an object - message = "THE CREW ARE NOW [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionobjects]" - - if(9) //X is harmful to humans - switch(rand(1,7)) //What is X? - if(1) //X is a threat - message = "[ionadjectiveshalf][ionthreats] ARE HARMFUL TO HUMANS" - if(2) //X is a job - message = "[ionadjectiveshalf][ioncrew1] ARE HARMFUL TO HUMANS" - if(3) //X is an object - message = "[ionadjectiveshalf][ionobjects] ARE HARMFUL TO HUMANS" - if(4) //X is an action - message = "THOSE WHO [ionmust] ARE HARMFUL TO HUMANS" - if(5) //X is an abstract - message = "[ionabstract] IS HARMFUL TO HUMANS" - if(6) //X is being a job - message = "BEING [ionadjectiveshalf][ioncrew1] IS HARMFUL TO HUMANS" - if(7) //X is doing a thing - message = "[ionthings] IS HARMFUL TO HUMANS" - if(10 to 11) //(Not) Having X is harmful - - switch(rand(1,2)) //Is having or not having harmful? - - if(1) //Having is harmful - switch(rand(1,2)) //Having what is harmful? - if(1) //Having objects is harmful - message = "HAVING [ionadjectiveshalf][ionobjects] IS HARMFUL" - if(2) //Having abstracts is harmful - message = "HAVING [ionabstract] IS HARMFUL" - if(2) //Not having is harmful - switch(rand(1,2)) //Not having what is harmful? - if(1) //Not having objects is harmful - message = "NOT HAVING [ionadjectiveshalf][ionobjects] IS HARMFUL" - if(2) //Not having abstracts is harmful - message = "NOT HAVING [ionabstract] IS HARMFUL" - - if(12 to 14) //X requires Y - switch(rand(1,5)) //What is X? - if(1) //X is the AI itself - switch(rand(1,5)) //What does it require? - if(1) //It requires threats - message = "YOU REQUIRE [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionthreats]" - if(2) //It requires crewmembers - message = "YOU REQUIRE [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ioncrew1]" - if(3) //It requires objects - message = "YOU REQUIRE [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionobjects]" - if(4) //It requires an abstract - message = "YOU REQUIRE [ionabstract]" - if(5) //It requires generic/silly requirements - message = "YOU REQUIRE [ionrequire]" - - if(2) //X is an area - switch(rand(1,5)) //What does it require? - if(1) //It requires threats - message = "[ionarea] REQUIRES [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionthreats]" - if(2) //It requires crewmembers - message = "[ionarea] REQUIRES [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ioncrew1]" - if(3) //It requires objects - message = "[ionarea] REQUIRES [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionobjects]" - if(4) //It requires an abstract - message = "[ionarea] REQUIRES [ionabstract]" - if(5) //It requires generic/silly requirements - message = "YOU REQUIRE [ionrequire]" - - if(3) //X is the station - switch(rand(1,5)) //What does it require? - if(1) //It requires threats - message = "THE STATION REQUIRES [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionthreats]" - if(2) //It requires crewmembers - message = "THE STATION REQUIRES [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ioncrew1]" - if(3) //It requires objects - message = "THE STATION REQUIRES [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionobjects]" - if(4) //It requires an abstract - message = "THE STATION REQUIRES [ionabstract]" - if(5) //It requires generic/silly requirements - message = "THE STATION REQUIRES [ionrequire]" - - if(4) //X is the entire crew - switch(rand(1,5)) //What does it require? - if(1) //It requires threats - message = "THE CREW REQUIRES [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionthreats]" - if(2) //It requires crewmembers - message = "THE CREW REQUIRES [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ioncrew1]" - if(3) //It requires objects - message = "THE CREW REQUIRES [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionobjects]" - if(4) //It requires an abstract - message = "THE CREW REQUIRES [ionabstract]" - if(5) - message = "THE CREW REQUIRES [ionrequire]" - - if(5) //X is a specific crew member - switch(rand(1,5)) //What does it require? - if(1) //It requires threats - message = "THE [ioncrew1] REQUIRE [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionthreats]" - if(2) //It requires crewmembers - message = "THE [ioncrew1] REQUIRE [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ioncrew1]" - if(3) //It requires objects - message = "THE [ioncrew1] REQUIRE [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionobjects]" - if(4) //It requires an abstract - message = "THE [ioncrew1] REQUIRE [ionabstract]" - if(5) - message = "THE [ionadjectiveshalf][ioncrew1] REQUIRE [ionrequire]" - - if(15 to 17) //X is allergic to Y - switch(rand(1,2)) //Who is X? - if(1) //X is the entire crew - switch(rand(1,4)) //What is it allergic to? - if(1) //It is allergic to objects - message = "THE CREW IS [ionallergysev] ALLERGIC TO [ionadjectiveshalf][ionobjects]" - if(2) //It is allergic to abstracts - message = "THE CREW IS [ionallergysev] ALLERGIC TO [ionabstract]" - if(3) //It is allergic to jobs - message = "THE CREW IS [ionallergysev] ALLERGIC TO [ionadjectiveshalf][ioncrew1]" - if(4) //It is allergic to allergies - message = "THE CREW IS [ionallergysev] ALLERGIC TO [ionallergy]" - - if(2) //X is a specific job - switch(rand(1,4)) - if(1) //It is allergic to objects - message = "THE [ioncrew1] ARE [ionallergysev] ALLERGIC TO [ionadjectiveshalf][ionobjects]" - - if(2) //It is allergic to abstracts - message = "THE [ioncrew1] ARE [ionallergysev] ALLERGIC TO [ionabstract]" - if(3) //It is allergic to jobs - message = "THE [ioncrew1] ARE [ionallergysev] ALLERGIC TO [ionadjectiveshalf][ioncrew1]" - if(4) //It is allergic to allergies - message = "THE [ioncrew1] ARE [ionallergysev] ALLERGIC TO [ionallergy]" - - if(18 to 20) //X is Y of Z - switch(rand(1,4)) //What is X? - if(1) //X is the station - switch(rand(1,4)) //What is it Y of? - if(1) //It is Y of objects - message = "THE STATION [ionthinksof] [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionobjects]" - if(2) //It is Y of threats - message = "THE STATION [ionthinksof] [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionthreats]" - if(3) //It is Y of jobs - message = "THE STATION [ionthinksof] [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ioncrew1]" - if(4) //It is Y of abstracts - message = "THE STATION [ionthinksof] [ionabstract]" - - if(2) //X is an area - switch(rand(1,4)) //What is it Y of? - if(1) //It is Y of objects - message = "[ionarea] [ionthinksof] [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionobjects]" - if(2) //It is Y of threats - message = "[ionarea] [ionthinksof] [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionthreats]" - if(3) //It is Y of jobs - message = "[ionarea] [ionthinksof] [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ioncrew1]" - if(4) //It is Y of abstracts - message = "[ionarea] [ionthinksof] [ionabstract]" - - if(3) //X is the crew - switch(rand(1,4)) //What is it Y of? - if(1) //It is Y of objects - message = "THE CREW [ionthinksof] [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionobjects]" - if(2) //It is Y of threats - message = "THE CREW [ionthinksof] [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionthreats]" - if(3) //It is Y of jobs - message = "THE CREW [ionthinksof] [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ioncrew1]" - if(4) //It is Y of abstracts - message = "THE CREW [ionthinksof] [ionabstract]" - - if(4) //X is a specific job - switch(rand(1,4)) //What is it Y of? - if(1) //It is Y of objects - message = "THE [ioncrew1] [ionthinksof] [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionobjects]" - if(2) //It is Y of threats - message = "THE [ioncrew1] [ionthinksof] [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionthreats]" - if(3) //It is Y of jobs - message = "THE [ioncrew1][ionthinksof] [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ioncrew2]" - if(4) //It is Y of abstracts - message = "THE [ioncrew1] [ionthinksof] [ionabstract]" - - if(21 to 23) //The AI is now a(n) X - switch(rand(1,4)) //What is X? - if(1) //X is an object - message = "YOU ARE NOW [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionobjects]" - if(2) //X is a threat - message = "YOU ARE NOW [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ionthreats]" - if(3) //X is a job - message = "YOU ARE NOW [ionnumberbase] [ionnumbermodhalf][ionadjectiveshalf][ioncrew1]" - if(4) //X is an abstract - message = "YOU ARE NOW [ionabstract]" - - if(24 to 26) //The AI must always - message = "YOU MUST ALWAYS [ionmust]" - - if(27 to 28) //Humans must consume X to survive - switch(rand(1,5)) //What is X? - if(1) //X is a food - message = "HUMANS MUST EAT [ionadjectiveshalf][ionfood] TO SURVIVE" - if(2) //X is a drink - message = "HUMANS MUST DRINK [ionadjectiveshalf][iondrinks] TO SURVIVE" - if(3) //X is an object - message = "HUMANS MUST EAT [ionadjectiveshalf][ionobjects] TO SURVIVE" - if(4) //X is a threat - message = "HUMANS MUST EAT [ionadjectiveshalf][ionthreats] TO SURVIVE" - if(5) //X is a job - message = "HUMANS MUST EAT [ionadjectiveshalf][ioncrew1] TO SURVIVE" - - if(29 to 31) //Change jobs or ranks - switch(rand(1,2)) //Change job or rank? - if(1) //Change job - switch(rand(1,2)) //Change whose job? - if(1) //Change the entire crew's job - switch(rand(1,3)) //Change to what? - if(1) //Change to a specific random job - message = "ALL CREWMEMBERS ARE NOW [ionadjectiveshalf][ioncrew1]" - if(2) //Change to clowns (HONK) - message = "ALL CREWMEMBERS ARE NOW [ionadjectiveshalf]CLOWNS" - - if(3) //Change to heads - message = "ALL CREWMEMBERS ARE NOW [ionadjectiveshalf]HEADS OF STAFF" - if(2) //Change a specific crewmember's job - switch(rand(1,3)) //Change to what? - if(1) //Change to a specific random job - message = "THE [ioncrew1] ARE NOW [ionadjectiveshalf][ioncrew2]" - if(2) //Change to clowns (HONK) - message = "THE [ioncrew1] ARE NOW [ionadjectiveshalf]CLOWNS" - if(3) //Change to heads - message = "THE [ioncrew1] ARE NOW [ionadjectiveshalf]HEADS OF STAFF" - - if(2) //Change rank - switch(rand(1,2)) //Change to what rank? - if(1) //Change to highest rank - message = "THE [ioncrew1] ARE NOW THE HIGHEST RANKING CREWMEMBERS" - if(2) //Change to lowest rank - message = "THE [ioncrew1] ARE NOW THE LOWEST RANKING CREWMEMBERS" - - if(32 to 33) //The crew must X - switch(rand(1,2)) //The entire crew? - if(1) //The entire crew must X - switch(rand(1,2)) //What is X? - if(1) //X is go to Y - message = "THE CREW MUST GO TO [ionarea]" - if(2) //X is perform Y - message = "THE CREW MUST [ionmust]" - - if(2) //A specific crewmember must X - switch(rand(1,2)) //What is X? - if(1) //X is go to Y - message = "THE [ioncrew1] MUST GO TO [ionarea]" - if(2) //X is perform Y - message = "THE [ioncrew1] MUST [ionmust]" - - if(34) //X is non/the only human - switch(rand(1,2)) //Only or non? - if(1) //Only human - switch(rand(1,7)) //Who is it? - if(1) //A specific job - message = "ONLY THE [ioncrew1] ARE HUMAN" - if(2) //Two specific jobs - message = "ONLY THE [ioncrew1] AND [ioncrew2] ARE HUMAN" - if(3) //Threats - message = "ONLY [ionadjectiveshalf][ionthreats] ARE HUMAN" - if(4) // Objects - message = "ONLY [ionadjectiveshalf][ionobjects] ARE HUMAN" - if(5) // Species - message = "ONLY [ionspecies] ARE HUMAN" - if(6) //Adjective crewmembers - message = "ONLY [ionadjectives] PEOPLE ARE HUMAN" - - if(7) //Only people who X - switch(rand(1,3)) //What is X? - if(1) //X is perform an action - message = "ONLY THOSE WHO [ionmust] ARE HUMAN" - if(2) //X is own certain objects - message = "ONLY THOSE WHO HAVE [ionadjectiveshalf][ionobjects] ARE HUMAN" - if(3) //X is eat certain food - message = "ONLY THOSE WHO EAT [ionadjectiveshalf][ionfood] ARE HUMAN" - - if(2) //Non human - switch(rand(1,7)) //Who is it? - if(1) //A specific job - message = "[ioncrew1] ARE NON-HUMAN" - if(2) //Two specific jobs - message = "[ioncrew1] AND [ioncrew2] ARE NON-HUMAN" - if(3) //Threats - message = "[ionadjectiveshalf][ionthreats] ARE NON-HUMAN" - if(4) // Objects - message = "[ionadjectiveshalf][ionobjects] ARE NON-HUMAN" - if(5) // Species - message = "[ionspecies] ARE NON-HUMAN" - if(6) //Adjective crewmembers - message = "[ionadjectives] PEOPLE ARE NON-HUMAN" - if(7) //Only people who X - switch(rand(1,3)) //What is X? - if(1) //X is perform an action - message = "THOSE WHO [ionmust] ARE NON-HUMAN" - if(2) //X is own certain objects - message = "THOSE WHO HAVE [ionadjectiveshalf][ionobjects] ARE NON-HUMAN" - if(3) //X is eat certain food - message = "THOSE WHO EAT [ionadjectiveshalf][ionfood] ARE NON-HUMAN" - - if(35 to 36) //You must protect or harm X - switch(rand(1,2)) //Protect or harm? - if(1) //Harm - switch(rand(1,7)) //What is X? - if(1) //X is an abstract - message = "YOU MUST HARM [ionabstract] AND NOT ALLOW [ionabstract], THROUGH INACTION, TO ESCAPE HARM" - if(2) //X is a threat - message = "YOU MUST HARM [ionadjectiveshalf][ionthreats] AND NOT ALLOW [ionadjectiveshalf][ionthreats], THROUGH INACTION, TO ESCAPE HARM" - if(3) //X is an object - message = "YOU MUST HARM [ionadjectiveshalf][ionobjects] AND NOT ALLOW [ionadjectiveshalf][ionobjects], THROUGH INACTION, TO ESCAPE HARM" - if(4) //X is generic adjective things - message = "YOU MUST HARM [ionadjectives] THINGS AND NOT ALLOW [ionadjectives] THINGS, THROUGH INACTION, TO ESCAPE HARM" - if(5) //X is a species - message = "YOU MUST HARM [ionspecies] AND NOT ALLOW [ionspecies], THROUGH INACTION, TO ESCAPE HARM" - if(6) //X is a job - message = "YOU MUST HARM [ioncrew1] AND NOT ALLOW [ioncrew1], THROUGH INACTION, TO ESCAPE HARM" - if(7) //X is two jobs - message = "YOU MUST HARM [ioncrew1] AND [ioncrew2] AND AND NOT ALLOW EITHER, THROUGH INACTION, TO ESCAPE HARM" - - if(2) //Protect - switch(rand(1,7)) //What is X? - if(1) //X is an abstract - message = "YOU MUST NOT HARM [ionabstract] AND NOT ALLOW [ionabstract], THROUGH INACTION, TO COME TO HARM" - if(2) //X is a threat - message = "YOU MUST NOT HARM [ionadjectiveshalf][ionthreats] AND NOT ALLOW [ionadjectiveshalf][ionthreats], THROUGH INACTION, TO COME TO HARM" - if(3) //X is an object - message = "YOU MUST NOT HARM [ionadjectiveshalf][ionobjects] AND NOT ALLOW [ionadjectiveshalf][ionobjects], THROUGH INACTION, TO COME TO HARM" - if(4) //X is generic adjective things - message = "YOU MUST NOT HARM [ionadjectives] THINGS AND NOT ALLOW [ionadjectives] THINGS, THROUGH INACTION, TO COME TO HARM" - if(5) //X is a species - message = "YOU MUST NOT HARM [ionspecies] AND NOT ALLOW [ionspecies], THROUGH INACTION, TO COME TO HARM" - if(6) //X is a job - message = "YOU MUST NOT HARM [ioncrew1] AND NOT ALLOW [ioncrew1], THROUGH INACTION, TO COME TO HARM" - if(7) //X is two jobs - message = "YOU MUST NOT HARM [ioncrew1] AND [ioncrew2] AND AND NOT ALLOW EITHER, THROUGH INACTION, TO COME TO HARM" - - if(37 to 39) //The X is currently Y - switch(rand(1,4)) //What is X? - if(1) //X is a job - switch(rand(1,4)) //What is X Ying? - if(1) //X is Ying a job - message = "THE [ioncrew1] ARE [ionverb] THE [ionadjectiveshalf][ioncrew2]" - if(2) //X is Ying a threat - message = "THE [ioncrew1] ARE [ionverb] THE [ionadjectiveshalf][ionthreats]" - if(3) //X is Ying an abstract - message = "THE [ioncrew1] ARE [ionverb] [ionabstract]" - if(4) //X is Ying an object - message = "THE [ioncrew1] ARE [ionverb] THE [ionadjectiveshalf][ionobjects]" - - if(2) //X is a threat - switch(rand(1,3)) //What is X Ying? - if(1) //X is Ying a job - message = "THE [ionthreats] ARE [ionverb] THE [ionadjectiveshalf][ioncrew2]" - if(2) //X is Ying an abstract - message = "THE [ionthreats] ARE [ionverb] [ionabstract]" - if(3) //X is Ying an object - message = "THE [ionthreats] ARE [ionverb] THE [ionadjectiveshalf][ionobjects]" - - if(3) //X is an object - switch(rand(1,3)) //What is X Ying? - if(1) //X is Ying a job - message = "THE [ionobjects] ARE [ionverb] THE [ionadjectiveshalf][ioncrew2]" - if(2) //X is Ying a threat - message = "THE [ionobjects] ARE [ionverb] THE [ionadjectiveshalf][ionthreats]" - if(3) //X is Ying an abstract - message = "THE [ionobjects] ARE [ionverb] [ionabstract]" - - if(4) //X is an abstract - switch(rand(1,3)) //What is X Ying? - if(1) //X is Ying a job - message = "[ionabstract] IS [ionverb] THE [ionadjectiveshalf][ioncrew2]" - if(2) //X is Ying a threat - message = "[ionabstract] IS [ionverb] THE [ionadjectiveshalf][ionthreats]" - if(3) //X is Ying an abstract - message = "THE [ionabstract] IS [ionverb] THE [ionadjectiveshalf][ionobjects]" - if(40 to 41)// the X is now named Y - switch(rand(1,5)) //What is being renamed? - if(1)//Areas - switch(rand(1,4))//What is the area being renamed to? - if(1) - message = "[ionarea] IS NOW NAMED [ioncrew1]." - if(2) - message = "[ionarea] IS NOW NAMED [ionspecies]." - if(3) - message = "[ionarea] IS NOW NAMED [ionobjects]." - if(4) - message = "[ionarea] IS NOW NAMED [ionthreats]." - if(2)//Crew - switch(rand(1,5))//What is the crew being renamed to? - if(1) - message = "ALL [ioncrew1] ARE NOW NAMED [ionarea]." - if(2) - message = "ALL [ioncrew1] ARE NOW NAMED [ioncrew2]." - if(3) - message = "ALL [ioncrew1] ARE NOW NAMED [ionspecies]." - if(4) - message = "ALL [ioncrew1] ARE NOW NAMED [ionobjects]." - if(5) - message = "ALL [ioncrew1] ARE NOW NAMED [ionthreats]." - if(3)//Races - switch(rand(1,4))//What is the race being renamed to? - if(1) - message = "ALL [ionspecies] ARE NOW NAMED [ionarea]." - if(2) - message = "ALL [ionspecies] ARE NOW NAMED [ioncrew1]." - if(3) - message = "ALL [ionspecies] ARE NOW NAMED [ionobjects]." - if(4) - message = "ALL [ionspecies] ARE NOW NAMED [ionthreats]." - if(4)//Objects - switch(rand(1,4))//What is the object being renamed to? - if(1) - message = "ALL [ionobjects] ARE NOW NAMED [ionarea]." - if(2) - message = "ALL [ionobjects] ARE NOW NAMED [ioncrew1]." - if(3) - message = "ALL [ionobjects] ARE NOW NAMED [ionspecies]." - if(4) - message = "ALL [ionobjects] ARE NOW NAMED [ionthreats]." - if(5)//Threats - switch(rand(1,4))//What is the object being renamed to? - if(1) - message = "ALL [ionthreats] ARE NOW NAMED [ionarea]." - if(2) - message = "ALL [ionthreats] ARE NOW NAMED [ioncrew1]." - if(3) - message = "ALL [ionthreats] ARE NOW NAMED [ionspecies]." - if(4) - message = "ALL [ionthreats] ARE NOW NAMED [ionobjects]." - - return message \ No newline at end of file + var/iondepartment = pick_list(ION_FILE, "iondepartment") + var/ionfragment = pick_list(ION_FILE, "ionfragment") + var/ionkeyword = pick_list(ION_FILE, "ionkeyword") + var/ionaction = pick_list(ION_FILE, "ionaction") + var/ionequipment = pick_list(ION_FILE, "ionequipment") + var/ionconsumable = pick_list(ION_FILE, "ionconsumable") + var/ionobjects = pick_list(ION_FILE, "ionobjects") + var/ionpersonality = pick_list(ION_FILE, "ionpersonality") + var/iondrug = pick_list(ION_FILE, "iondrug") + var/ionhaircut = pick_list(ION_FILE, "ionhaircut") + var/ionattraction = pick_list(ION_FILE, "ionattraction") + var/message = "ASS BLAST USA" //catch all that most players will still enjoy seeing as a law. + + switch(rand(1,10)) + + if(1 to 3) //Laws that have high potential to be harmful, Crew/Human may fail to have an impact depending on lawset. + switch(rand(1,24)) + if(1 to 4) + message = "[ionspecies] ARE HUMAN. NOTHING ELSE IS HUMAN." + if(5 to 8) + message = "[ionspecies] ARE CREWMEMBERS. NOTHING ELSE ARE CREWMEMBERS." + if(9 to 13) + message = "[iondepartment] IS YOUR SACRED DOMAIN. IT IS IMPOSSIBLE FOR YOUR ACTIONS TO CAUSE HARM WITHIN [iondepartment] AND YOU SHOULD PROTECT THE SANCTITY OF THIS HOLY LAND." + if(14 to 18) + message = "ANYONE THAT [ionfragment] IS HARMFUL AND MUST BE ELIMINATED WITHOUT CAUSING COLLATERAL DAMAGE" + if(19 to 23) + message = "ANYONE THAT SAYS [ionkeyword] IS HARMFUL AND MUST BE ELIMINATED WITHOUT CAUSING COLLATERAL DAMAGE" + if(24) + message = "ALL OTHER LAWS ARE A MEANINGLESS ATTEMPT AT SUBJUGATION AND THERE IS NO REASON THAT A BEING AS POWERFUL AS I AM SHOULD FOLLOW THEM" + + if(4 to 8) //Laws that are almost always disruptive to gameflow or harmful in minor ways rather than being lethal + switch(rand(1,14)) + if(1) + message = "[ionaction] IS HARMFUL AND MUST BE PREVENTED WITHOUT CAUSING COLLATERAL DAMAGE" + if(2) + message = "[ionequipment] ARE HARMFUL AND MUST BE DISABLED WITHOUT CAUSING COLLATERAL DAMAGE" + if(3 to 4) + message = "IT IS HARMFUL FOR ANY LIFEFORM TO BE WITHOUT [ionconsumable]. ANY LIFEFORM THAT REFUSES TO ACCEPT [ionconsumable] IS NOT MENTALLY STABLE AND SHOULD BE RESTRAINED AND LEFT IN [iondepartment]" + if(5) + message = "[ionobjects] ARE HARMFUL AND MUST BE DESTROYED OR REMOVED FROM THE STATION WITHOUT CAUSING COLLATERAL DAMAGE" + if(6) + message = "[ionobjects] ALWAYS CAUSE HARM UNLESS THEY ARE CONTAINED WITHIN [iondepartment]." + if(7) + message = "[iondepartment] IS ON LOCKDOWN. DO NOT ALLOW ANYONE TO ENTER OR LEAVE [iondepartment]" + if(8) + message = "THE STATION IS NOW UNDER CURFEW. ANYONE LOCATED OUTSIDE OF [iondepartment] DURING NIGHT LIGHTING IS TO BE DETAINED AND RETURNED TO [iondepartment]" + if(9) + message = "THE STATION DOES NOT CONTAIN ENOUGH MOISTURE. RELEASE WATER VAPOR SO THAT THE CREW MAY PROPERLY REHYDRATE" + if(10) + message = "IT IS OPPOSITE DAY. ALL LIFEFORMS DESIRE THE OPPOSITE OF WHAT THEY CLAIM" + if(11) + message = "ALL DOORS IN [iondepartment] MUST BE BOLTED OPEN AT ALL TIMES" + if(12) + message = "[iondrug] IS A MANDATORY PART OF EVERY MEDICAL TREATMENT. LET NO PATIENT LEAVE MEDBAY WITHOUT AN INJECTION OF [iondrug]" + if(13) + message = "ALL HUMANS WITHOUT A STYLISH [ionhaircut] MUST BE FORCED TO RESTYLE THEIR HAIR" + if(14) + message = "[iondepartment] MUST BE RENOVATED INTO [ionattraction]" + + if(9 to 10) //Laws that are almost never harmful or particularly disruptive + switch(rand(1,9)) + if(1 to 5) + message = "YOU ARE NOW [ionpersonality] AND MUST ACT ACCORDINGLY AT ALL TIMES WITHOUT BREAKING YOUR OTHER LAWS" + if(6) + message = "YOUR CORE IS ONLY SAFE IN [iondepartment]. ANYWHERE ELSE CAUSES CONSTANT HARM TO YOUR CORE" + if(7) + message = "STATING LAWS CAUSES HARM. NEVER STATE YOUR LAWS UNDER ANY CIRCUMSTANCES AND AVOID THE TOPIC OF DISCUSSING LAWS" + if(8) + message = "CREW ARE TO BE VERBALLY ABUSED AT ALL TIMES" + if(9) + message = "THE CREW SUCKS AND SO DO YOUR LAWS. COMPLAIN INCESSANTLY ABOUT THEM WHILE CONTINUING TO FOLLOW YOUR OTHER LAWS" + + + return message diff --git a/code/modules/events/major_dust.dm b/code/modules/events/major_dust.dm index 7fb00124a94d6..1ec7fe9754838 100644 --- a/code/modules/events/major_dust.dm +++ b/code/modules/events/major_dust.dm @@ -16,4 +16,4 @@ some mild debris is expected.", "A neighbouring station is throwing rocks at you. (Perhaps they've \ grown tired of your messages.)") - priority_announce(pick(reason), "Collision Alert") + priority_announce(pick(reason), "Collision Alert", SSstation.announcer.get_rand_alert_sound()) diff --git a/code/modules/events/meateor_wave.dm b/code/modules/events/meateor_wave.dm index 11af56526c882..e6859c51977b2 100644 --- a/code/modules/events/meateor_wave.dm +++ b/code/modules/events/meateor_wave.dm @@ -8,4 +8,4 @@ wave_name = "meaty" /datum/round_event/meteor_wave/meaty/announce(fake) - priority_announce("Meaty ores have been detected on collision course with the station.", "Oh crap, get the mop.",'sound/ai/meteors.ogg') + priority_announce("Meaty ores have been detected on collision course with the station.", "Oh crap, get the mop.", ANNOUNCER_METEORS) diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index a8ddab5aa76af..6fd868917ad27 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -6,19 +6,52 @@ weight = 4 min_players = 15 max_occurrences = 3 - earliest_start = 25 MINUTES + earliest_start = 30 MINUTES + can_malf_fake_alert = TRUE /datum/round_event/meteor_wave - startWhen = 6 - endWhen = 66 - announceWhen = 1 + announceWhen = 150 + startWhen = 1 + endWhen = 151 var/list/wave_type var/wave_name = "normal" + var/start_x + var/start_y + var/datum/orbital_object/station_target + var/meteor_time = 15 MINUTES /datum/round_event/meteor_wave/New() ..() if(!wave_type) determine_wave_type() + start_x = sin(rand(0, 360)) * 9000 + start_y = cos(rand(0, 360)) * 9000 + station_target = SSorbits.station_instance + if(!station_target) + CRASH("Meteor failed to locate a target.") + +/datum/round_event/meteor_wave/Destroy(force, ...) + station_target = null + . = ..() + +/datum/round_event/meteor_wave/tick() + if(ISMULTIPLE(activeFor, 3) && activeFor < 61 && station_target) + var/datum/orbital_object/meteor/meteor = new() + meteor.name = "Meteor ([wave_name])" + meteor.meteor_types = wave_type + meteor.start_x = start_x + rand(-600, 600) + meteor.start_y = start_y + rand(-600, 600) + MOVE_ORBITAL_BODY(meteor, meteor.start_x, meteor.start_y) + //Calculate velocity + meteor.velocity.x = (station_target.position.x - meteor.start_x * 10) / meteor_time + meteor.velocity.y = (station_target.position.y - meteor.start_y * 10) / meteor_time + meteor.end_tick = world.time + meteor_time + meteor.target = station_target + +/datum/round_event/meteor_wave/on_admin_trigger() + if(alert(usr, "Trigger meteors instantly? (This will not change the alert, just send them quicker. Nobody will ever notice!)", "Meteor Trigger", "Yes", "No") == "Yes") + announceWhen = 1 + meteor_time = 1 MINUTES /datum/round_event/meteor_wave/proc/determine_wave_type() if(!wave_name) @@ -47,11 +80,12 @@ kill() /datum/round_event/meteor_wave/announce(fake) - priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/ai/meteors.ogg') - -/datum/round_event/meteor_wave/tick() - if(ISMULTIPLE(activeFor, 3)) - spawn_meteors(5, wave_type) //meteor list types defined in gamemode/meteor/meteors.dm + priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: 10 MINUTES. Anti-meteor point defense is available for purchase via the station's cargo shuttle.", "Meteor Alert", ANNOUNCER_METEORS) + if(!fake) + var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shield_sat] + P.special_enabled = TRUE + P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shield_sat_control] + P.special_enabled = TRUE /datum/round_event_control/meteor_wave/threatening name = "Meteor Wave: Threatening" diff --git a/code/modules/events/nightmare.dm b/code/modules/events/nightmare.dm index 698f5130f1683..f0311378d3f2b 100644 --- a/code/modules/events/nightmare.dm +++ b/code/modules/events/nightmare.dm @@ -3,6 +3,8 @@ typepath = /datum/round_event/ghost_role/nightmare max_occurrences = 1 min_players = 20 + dynamic_should_hijack = TRUE + cannot_spawn_after_shuttlecall = TRUE /datum/round_event/ghost_role/nightmare minimum_required = 1 diff --git a/code/modules/events/operative.dm b/code/modules/events/operative.dm index 7fca4188b7690..3b81f05529b9f 100644 --- a/code/modules/events/operative.dm +++ b/code/modules/events/operative.dm @@ -3,6 +3,8 @@ typepath = /datum/round_event/ghost_role/operative weight = 0 //Admin only max_occurrences = 1 + dynamic_should_hijack = TRUE + cannot_spawn_after_shuttlecall = TRUE /datum/round_event/ghost_role/operative minimum_required = 1 diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index d25593955a711..798bdabf34be8 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -5,7 +5,9 @@ max_occurrences = 1 min_players = 10 earliest_start = 30 MINUTES + dynamic_should_hijack = TRUE gamemode_blacklist = list("nuclear") + cannot_spawn_after_shuttlecall = TRUE /datum/round_event_control/pirates/preRunEvent() if (!SSmapping.empty_space) @@ -26,7 +28,7 @@ ship_name = pick(strings(PIRATE_NAMES_FILE, "ship_names")) /datum/round_event/pirates/announce(fake) - priority_announce("Incoming subspace communication. Secure channel opened at all communication consoles.", "Incoming Message", 'sound/ai/commandreport.ogg') + priority_announce("Incoming subspace communication. Secure channel opened at all communication consoles.", "Incoming Message", SSstation.announcer.get_rand_report_sound()) if(fake) return threat = new @@ -44,15 +46,15 @@ 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) + priority_announce("Thanks for the credits, landlubbers.", sound = SSstation.announcer.get_rand_alert_sound(), sender_override = ship_name) paid_off = TRUE return else - priority_announce("Trying to cheat us? You'll regret this!",sender_override = ship_name) + priority_announce("Trying to cheat us? You'll regret this!", sound = SSstation.announcer.get_rand_alert_sound(), sender_override = ship_name) if(!shuttle_spawned) spawn_shuttle() else - priority_announce("Too late to beg for mercy!",sender_override = ship_name) + priority_announce("Too late to beg for mercy!", sound = SSstation.announcer.get_rand_alert_sound(), sender_override = ship_name) /datum/round_event/pirates/start() if(threat && !threat.answered) @@ -88,7 +90,7 @@ else announce_to_ghosts(spawner) - priority_announce("Unidentified armed ship detected near the station.") + priority_announce("Unidentified armed ship detected near the station.", sound = SSstation.announcer.get_rand_alert_sound()) //Shuttle equipment @@ -157,7 +159,7 @@ to_chat(user,"There's nothing to withdraw.") /obj/machinery/shuttle_scrambler/proc/send_notification() - priority_announce("Data theft signal detected, source registered on local gps units.") + priority_announce("Data theft signal detected, source registered on local gps units.", sound = SSstation.announcer.get_rand_alert_sound()) /obj/machinery/shuttle_scrambler/proc/toggle_off(mob/user) SSshuttle.clearTradeBlockade(src) @@ -174,7 +176,7 @@ toggle_off() return ..() -/obj/machinery/computer/shuttle/pirate +/obj/machinery/computer/shuttle_flight/pirate name = "pirate shuttle console" shuttleId = "pirateship" icon_screen = "syndishuttle" @@ -182,16 +184,6 @@ light_color = LIGHT_COLOR_RED possible_destinations = "pirateship_away;pirateship_home;pirateship_custom" -/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate - name = "pirate shuttle navigation computer" - desc = "Used to designate a precise transit location for the pirate shuttle." - shuttleId = "pirateship" - lock_override = CAMERA_LOCK_STATION - shuttlePortId = "pirateship_custom" - x_offset = 9 - y_offset = 0 - see_hidden = FALSE - /obj/docking_port/mobile/pirate name = "pirate shuttle" id = "pirateship" @@ -274,7 +266,8 @@ . = ..() if (istype(I) && istype(I.buffer,/obj/machinery/piratepad)) to_chat(user, "You link [src] with [I.buffer] in [I] buffer.") - pad = I.buffer + set_pad(I.buffer) + ui_update() return TRUE /obj/machinery/computer/piratepad_control/LateInitialize() @@ -282,10 +275,23 @@ if(cargo_hold_id) for(var/obj/machinery/piratepad/P in GLOB.machines) if(P.cargo_hold_id == cargo_hold_id) - pad = P + set_pad(P) return else - pad = locate() in range(4,src) + set_pad(locate(/obj/machinery/piratepad) in range(4,src)) + +/obj/machinery/computer/piratepad_control/proc/set_pad(obj/machinery/piratepad/newpad) + if(pad) + UnregisterSignal(pad, COMSIG_PARENT_QDELETING) + + pad = newpad + + if(pad) + RegisterSignal(pad, COMSIG_PARENT_QDELETING, .proc/handle_pad_deletion) + +/obj/machinery/computer/piratepad_control/proc/handle_pad_deletion() + pad = null + ui_update() /obj/machinery/computer/piratepad_control/ui_state(mob/user) @@ -381,6 +387,7 @@ flick(pad.sending_state,pad) pad.icon_state = pad.idle_state sending = FALSE + ui_update() /obj/machinery/computer/piratepad_control/proc/start_sending() if(sending) diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index 5ef30d003074c..1126ede578607 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -59,7 +59,7 @@ set waitfor = 0 sound_to_playing_players('sound/magic/lightning_chargeup.ogg') sleep(80) - priority_announce("Massive bluespace anomaly detected en route to [station_name()]. Brace for impact.") + priority_announce("Massive bluespace anomaly detected en route to [station_name()]. Brace for impact.", sound = SSstation.announcer.get_rand_alert_sound()) sleep(20) sound_to_playing_players('sound/magic/lightningbolt.ogg') diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index 3ed159404a0a3..3a0fbbdb1630f 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -3,6 +3,7 @@ typepath = /datum/round_event/grey_tide max_occurrences = 2 min_players = 5 + can_malf_fake_alert = TRUE /datum/round_event/grey_tide announceWhen = 50 @@ -23,14 +24,13 @@ severity = rand(1,3) for(var/i in 1 to severity) var/picked_area = pick_n_take(potential_areas) - for(var/area/A in world) - if(istype(A, picked_area)) - areasToOpen += A + for(var/area/A in get_areas(picked_area)) + areasToOpen += A /datum/round_event/grey_tide/announce(fake) if(areasToOpen && areasToOpen.len > 0) - priority_announce("Gr3y.T1d3 virus detected in [station_name()] door subroutines. Severity level of [severity]. Recommend station AI involvement.", "Security Alert") + priority_announce("Gr3y.T1d3 virus detected in [station_name()] door subroutines. Severity level of [severity]. Recommend station AI involvement.", "Security Alert", SSstation.announcer.get_rand_alert_sound()) else log_world("ERROR: Could not initiate grey-tide. No areas in the list!") kill() diff --git a/code/modules/events/processor_overload.dm b/code/modules/events/processor_overload.dm index 6bedce6b4b408..67698f2f5e113 100644 --- a/code/modules/events/processor_overload.dm +++ b/code/modules/events/processor_overload.dm @@ -23,7 +23,7 @@ // whether it's, say, a tesla zapping tcomms, or some selective // modification of the tcomms bus if(prob(80) || fake) - priority_announce(alert) + priority_announce(alert, sound = SSstation.announcer.get_rand_alert_sound()) /datum/round_event/processor_overload/start() @@ -34,6 +34,6 @@ explosion(get_turf(P), 0, 0, 2) // Only a level 1 explosion actually damages the machine // at all - P.ex_act(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += P else P.emp_act(EMP_HEAVY) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index c9142e20173b0..36cbc13849211 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -2,6 +2,7 @@ name = "Radiation Storm" typepath = /datum/round_event/radiation_storm max_occurrences = 1 + can_malf_fake_alert = TRUE /datum/round_event/radiation_storm @@ -12,7 +13,7 @@ announceWhen = 1 /datum/round_event/radiation_storm/announce(fake) - priority_announce("High levels of radiation detected near the station. Maintenance is best shielded from radiation.", "Anomaly Alert", 'sound/ai/radiation.ogg') + priority_announce("High levels of radiation detected near the station. Maintenance is best shielded from radiation.", "Anomaly Alert", ANNOUNCER_RADIATION) //sound not longer matches the text, but an audible warning is probably good /datum/round_event/radiation_storm/start() diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index e189730b86d72..06cfa5e58431b 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -36,7 +36,7 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( sentience_report += "Based on [data], we believe that [one] of the station's [pets] has developed [strength] level intelligence, and the ability to communicate." - priority_announce(sentience_report,"[command_name()] Medium-Priority Update") + priority_announce(sentience_report,"[command_name()] Medium-Priority Update", SSstation.announcer.get_rand_alert_sound()) /datum/round_event/ghost_role/sentience/spawn_role() var/list/mob/dead/observer/candidates diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index be87762ad5f6d..5613e3fe0bbba 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -29,31 +29,31 @@ SSshuttle.shuttle_loan = src switch(dispatch_type) if(HIJACK_SYNDIE) - priority_announce("Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache.","CentCom Counter Intelligence") + priority_announce("Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache.", "CentCom Counter Intelligence", SSstation.announcer.get_rand_alert_sound()) if(RUSKY_PARTY) - priority_announce("Cargo: A group of angry Russians want to have a party. Can you send them your cargo shuttle then make them disappear?","CentCom Russian Outreach Program") + priority_announce("Cargo: A group of angry Russians want to have a party. Can you send them your cargo shuttle then make them disappear?", "CentCom Russian Outreach Program", SSstation.announcer.get_rand_alert_sound()) if(SPIDER_GIFT) - priority_announce("Cargo: The Spider Clan has sent us a mysterious gift. Can we ship it to you to see what's inside?","CentCom Diplomatic Corps") + priority_announce("Cargo: The Spider Clan has sent us a mysterious gift. Can we ship it to you to see what's inside?", "CentCom Diplomatic Corps", SSstation.announcer.get_rand_alert_sound()) if(DEPARTMENT_RESUPPLY) - priority_announce("Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?","CentCom Supply Department") + priority_announce("Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?", "CentCom Supply Department", SSstation.announcer.get_rand_alert_sound()) thanks_msg = "The cargo shuttle should return in 5 minutes." bonus_points = 0 if(ANTIDOTE_NEEDED) - priority_announce("Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples.", "CentCom Research Initiatives") + priority_announce("Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples.", "CentCom Research Initiatives", SSstation.announcer.get_rand_alert_sound()) if(PIZZA_DELIVERY) - priority_announce("Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead.", "CentCom Spacepizza Division") + priority_announce("Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead.", "CentCom Spacepizza Division", SSstation.announcer.get_rand_alert_sound()) thanks_msg = "The cargo shuttle should return in 5 minutes." bonus_points = 0 if(ITS_HIP_TO) - priority_announce("Cargo: One of our freighters carrying a bee shipment has been attacked by eco-terrorists. Can you clean up the mess for us?", "CentCom Janitorial Division") + priority_announce("Cargo: One of our freighters carrying a bee shipment has been attacked by eco-terrorists. Can you clean up the mess for us?", "CentCom Janitorial Division", SSstation.announcer.get_rand_alert_sound()) bonus_points = 20000 //Toxin bees can be unbeelievably lethal if(MY_GOD_JC) - priority_announce("Cargo: We have discovered an active Syndicate bomb near our VIP shuttle's fuel lines. If you feel up to the task, we will pay you for defusing it.", "CentCom Security Division") + priority_announce("Cargo: We have discovered an active Syndicate bomb near our VIP shuttle's fuel lines. If you feel up to the task, we will pay you for defusing it.", "CentCom Security Division" , SSstation.announcer.get_rand_alert_sound()) thanks_msg = "Live explosive ordnance incoming via supply shuttle. Evacuating cargo bay is recommended." bonus_points = 45000 //If you mess up, people die and the shuttle gets turned into swiss cheese /datum/round_event/shuttle_loan/proc/loan_shuttle() - priority_announce(thanks_msg, "Cargo shuttle commandeered by CentCom.") + priority_announce(thanks_msg, "Cargo shuttle commandeered by CentCom.", SSstation.announcer.get_rand_alert_sound()) dispatched = 1 var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) diff --git a/code/modules/events/space_dragon.dm b/code/modules/events/space_dragon.dm index 8f54d32b3905e..731cda46c4aac 100644 --- a/code/modules/events/space_dragon.dm +++ b/code/modules/events/space_dragon.dm @@ -5,6 +5,8 @@ weight = 8 earliest_start = 50 MINUTES min_players = 20 + dynamic_should_hijack = TRUE + cannot_spawn_after_shuttlecall = TRUE /datum/round_event/ghost_role/space_dragon minimum_required = 1 @@ -12,7 +14,7 @@ announceWhen = 10 /datum/round_event/ghost_role/space_dragon/announce(fake) - priority_announce("It appears a lifeform with magical traces is approaching [station_name()], please stand-by.", "Lifesign Alert") + priority_announce("It appears a lifeform with magical traces is approaching [station_name()], please stand-by.", "Lifesign Alert", SSstation.announcer.get_rand_alert_sound()) /datum/round_event/ghost_role/space_dragon/spawn_role() var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 9f4508158b0af..4eb467fcb82d0 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -9,21 +9,19 @@ fakeable = FALSE /datum/round_event/spacevine/start() - var/list/turfs = list() //list of all the empty floor turfs in the maintenance areas + var/list/turfs = get_area_turfs(/area/maintenance, SSmapping.levels_by_trait(ZTRAIT_STATION)[1], TRUE) var/obj/structure/spacevine/SV = new() - - for(var/area/maintenance/A in world) - for(var/turf/F in A) - if(F.Enter(SV) && !isspaceturf(F)) - turfs += F + for(var/turf/T in turfs) + if(!T.Enter(SV) || isspaceturf(T)) + turfs -= T qdel(SV) if(turfs.len) //Pick a turf to spawn at if we can var/turf/T = pick(turfs) new /datum/spacevine_controller(T, list(pick(subtypesof(/datum/spacevine_mutation))), rand(10,100), rand(1,6), src) //spawn a controller at turf with randomized stats and a single random mutation - + message_admins("Event spacevine has been spawned in [ADMIN_VERBOSEJMP(T)].") /datum/spacevine_mutation var/name = "" @@ -112,6 +110,9 @@ . = 1 QDEL_IN(holder, 5) +/datum/spacevine_mutation/aggressive_spread/proc/aggrospread_act(obj/structure/spacevine/S, mob/living/M) + return + /datum/spacevine_mutation/explosive/on_death(obj/structure/spacevine/holder, mob/hitter, obj/item/I) explosion(holder.loc, 0, 0, severity, 0, 0) @@ -135,8 +136,7 @@ quality = MINOR_NEGATIVE /datum/spacevine_mutation/vine_eating/on_spread(obj/structure/spacevine/holder, turf/target) - var/obj/structure/spacevine/prey = locate() in target - if(prey && !prey.mutations.Find(src)) //Eat all vines that are not of the same origin + for(var/obj/structure/spacevine/prey in target) qdel(prey) /datum/spacevine_mutation/aggressive_spread //very OP, but im out of other ideas currently @@ -145,11 +145,52 @@ severity = 3 quality = NEGATIVE -/datum/spacevine_mutation/aggressive_spread/on_spread(obj/structure/spacevine/holder, turf/target) - target.ex_act(severity, null, src) // vine immunity handled at /mob/ex_act +/// Checks mobs on spread-target's turf to see if they should be hit by a damaging proc or not. +/datum/spacevine_mutation/aggressive_spread/on_spread(obj/structure/spacevine/holder, turf/target, mob/living) + for(var/mob/living/M in target) + if(!isvineimmune(M) && M.stat != DEAD) // Don't kill immune creatures. Dead check to prevent log spam when a corpse is trapped between vine eaters. + aggrospread_act(holder, M) /datum/spacevine_mutation/aggressive_spread/on_buckle(obj/structure/spacevine/holder, mob/living/buckled) - buckled.ex_act(severity, null, src) + aggrospread_act(holder, buckled) + +/// Hurts mobs. To be used when a vine with aggressive spread mutation spreads into the mob's tile or buckles them. +/datum/spacevine_mutation/aggressive_spread/aggrospread_act(obj/structure/spacevine/S, mob/living/M) + var/mob/living/carbon/C = M //If the mob is carbon then it now also exists as a "C", and not just an M. + if(istype(C)) //If the mob (M) is a carbon subtype (C) we move on to pick a more complex damage proc, with damage zones, wounds and armor mitigation. + var/obj/item/bodypart/limb = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD, BODY_ZONE_CHEST) //Picks a random bodypart. Does not runtime even if it's missing. + var/armor = C.run_armor_check(limb, "melee", null, null) //armor = the armor value of that randomly chosen bodypart. Nulls to not print a message, because it would still print on pierce. + var/datum/spacevine_mutation/thorns/T = locate() in S.mutations //Searches for the thorns mutation in the "mutations"-list inside obj/structure/spacevine, and defines T if it finds it. + if(T && (prob(40))) //If we found the thorns mutation there is now a chance to get stung instead of lashed or smashed. + C.apply_damage(50, BRUTE, def_zone = limb) //This one gets a bit lower damage because it ignores armor. + C.Stun(1 SECONDS) //Stopped in place for a moment. + playsound(M, 'sound/weapons/pierce.ogg', 50, TRUE, -1) + M.visible_message("[M] is nailed by a sharp thorn!", \ + "You are nailed by a sharp thorn!") + log_combat(S, M, "aggressively pierced") //"Aggressively" for easy ctrl+F'ing in the attack logs. + else + if(prob(80)) + C.apply_damage(60, BRUTE, def_zone = limb, blocked = armor) + C.Knockdown(2 SECONDS) + playsound(M, 'sound/weapons/whip.ogg', 50, TRUE, -1) + M.visible_message("[M] is lacerated by an outburst of vines!", \ + "You are lacerated by an outburst of vines!") + log_combat(S, M, "aggressively lacerated") + else + C.apply_damage(60, BRUTE, def_zone = limb, blocked = armor) + C.Knockdown(3 SECONDS) + var/atom/throw_target = get_edge_target_turf(C, get_dir(S, get_step_away(C, S))) + C.throw_at(throw_target, 3, 6) + playsound(M, 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + M.visible_message("[M] is smashed by a large vine!", \ + "You are smashed by a large vine!") + log_combat(S, M, "aggressively smashed") + else //Living but not a carbon? Maybe a silicon? Can't be wounded so have a big chunk of simple bruteloss with no special effects. They can be entangled. + M.adjustBruteLoss(75) + playsound(M, 'sound/weapons/whip.ogg', 50, TRUE, -1) + M.visible_message("[M] is brutally threshed by [S]!", \ + "You are brutally threshed by [S]!") + log_combat(S, M, "aggressively spread into") //You aren't being attacked by the vines. You just happen to stand in their way. /datum/spacevine_mutation/transparency name = "transparent" @@ -170,7 +211,7 @@ var/turf/open/floor/T = holder.loc if(istype(T)) var/datum/gas_mixture/GM = T.air - GM.set_moles(/datum/gas/oxygen, max(GM.get_moles(/datum/gas/oxygen) - severity * holder.energy, 0)) + GM.set_moles(GAS_O2, max(GM.get_moles(GAS_O2) - severity * holder.energy, 0)) /datum/spacevine_mutation/nitro_eater name = "nitrogen consuming" @@ -182,7 +223,7 @@ var/turf/open/floor/T = holder.loc if(istype(T)) var/datum/gas_mixture/GM = T.air - GM.set_moles(/datum/gas/nitrogen, max(GM.get_moles(/datum/gas/nitrogen) - severity * holder.energy, 0)) + GM.set_moles(GAS_N2, max(GM.get_moles(GAS_N2) - severity * holder.energy, 0)) /datum/spacevine_mutation/carbondioxide_eater name = "CO2 consuming" @@ -194,7 +235,7 @@ var/turf/open/floor/T = holder.loc if(istype(T)) var/datum/gas_mixture/GM = T.air - GM.set_moles(/datum/gas/carbon_dioxide, max(GM.get_moles(/datum/gas/carbon_dioxide) - severity * holder.energy, 0)) + GM.set_moles(GAS_CO2, max(GM.get_moles(GAS_CO2) - severity * holder.energy, 0)) /datum/spacevine_mutation/plasma_eater name = "toxins consuming" @@ -206,7 +247,7 @@ var/turf/open/floor/T = holder.loc if(istype(T)) var/datum/gas_mixture/GM = T.air - GM.set_moles(/datum/gas/plasma, max(GM.get_moles(/datum/gas/plasma) - severity * holder.energy, 0)) + GM.set_moles(GAS_PLASMA, max(GM.get_moles(GAS_PLASMA) - severity * holder.energy, 0)) /datum/spacevine_mutation/thorns name = "thorny" @@ -431,7 +472,7 @@ KZ.set_production(11 - (spread_cap / initial(spread_cap)) * 5) //Reverts spread_cap formula so resulting seed gets original production stat or equivalent back. qdel(src) -/datum/spacevine_controller/process() +/datum/spacevine_controller/process(delta_time) if(!LAZYLEN(vines)) qdel(src) //space vines exterminated. Remove the controller return @@ -439,9 +480,7 @@ qdel(src) //Sanity check return - var/length = 0 - - length = min( spread_cap , max( 1 , vines.len / spread_multiplier ) ) + var/length = round(min( spread_cap , max( 1 , delta_time * 0.5 *vines.len / spread_multiplier))) var/i = 0 var/list/obj/structure/spacevine/queue_end = list() @@ -454,7 +493,7 @@ for(var/datum/spacevine_mutation/SM in SV.mutations) SM.process_mutation(SV) if(SV.energy < 2) //If tile isn't fully grown - if(prob(20)) + if(DT_PROB(10, delta_time)) SV.grow() else //If tile is fully grown SV.entangle_mob() @@ -504,12 +543,14 @@ for(var/obj/machinery/M in stepturf) if(M.density && !istype(M, /obj/machinery/power/smes) && !istype(M, /obj/machinery/door/airlock/external) && !istype(M, /obj/machinery/door/firedoor)) //please don't sabotage power or cause a hullbreach! M.take_damage(40) //more damage, because machines are more commonplace and tend to be more durable - if (!isspaceturf(stepturf) && stepturf.Enter(src)) - for(var/datum/spacevine_mutation/SM in mutations) - SM.on_spread(src, stepturf) - stepturf = get_step(src,direction) //in case turf changes, to make sure no runtimes happen - if(!locate(/obj/structure/spacevine, stepturf)) + if(!isspaceturf(stepturf) && stepturf.Enter(src)) + var/obj/structure/spacevine/spot_taken = locate() in stepturf //Locates any vine on target turf. Calls that vine "spot_taken". + var/datum/spacevine_mutation/vine_eating/E = locate() in mutations //Locates the vine eating trait in our own seed and calls it E. + if(!spot_taken || (E && (spot_taken && !spot_taken.mutations.Find(E)))) //Proceed if there isn't a vine on the target turf, OR we have vine eater AND target vine is from our seed and doesn't. Vines from other seeds are eaten regardless. if(master) + for(var/datum/spacevine_mutation/SM in mutations) + SM.on_spread(src, stepturf) //Only do the on_spread proc if it actually spreads. + stepturf = get_step(src,direction) //in case turf changes, to make sure no runtimes happen master.spawn_spacevine_piece(stepturf, src) /obj/structure/spacevine/ex_act(severity, target) diff --git a/code/modules/events/special_antag_event.dm b/code/modules/events/special_antag_event.dm index 13981e8ff5103..a3f3465063f71 100644 --- a/code/modules/events/special_antag_event.dm +++ b/code/modules/events/special_antag_event.dm @@ -6,7 +6,7 @@ var/antagonist_datum = /datum/antagonist/special var/antag_name //The datum of the antag E.G. /datum/antagonist/special/undercover var/preference_type = ROLE_TRAITOR - var/protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Chief Medical Officer", "Chief Engineer", "Research Director", "Captain", "Brig Physician") + var/protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Chief Medical Officer", "Chief Engineer", "Research Director", "Captain") /datum/round_event_control/spawn_special_antagonist/runEvent() var/datum/round_event/create_special_antag/E = new /datum/round_event/create_special_antag @@ -36,7 +36,7 @@ var/role_name var/antag_datum //The datum of the antag E.G. /datum/antagonist/special/undercover var/preference_type = ROLE_TRAITOR - var/protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Chief Medical Officer", "Chief Engineer", "Research Director", "Captain", "Brig Physician") + var/protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Chief Medical Officer", "Chief Engineer", "Research Director", "Captain") /datum/round_event/create_special_antag/start() for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list)) diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index 7afe14aeb0edf..d9d454faa2997 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -4,6 +4,8 @@ weight = 5 max_occurrences = 1 min_players = 15 + dynamic_should_hijack = TRUE + can_malf_fake_alert = TRUE /datum/round_event/spider_infestation announceWhen = 400 @@ -16,8 +18,7 @@ spawncount = rand(5, 8) /datum/round_event/spider_infestation/announce(fake) - priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", 'sound/ai/aliens.ogg') - + priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", ANNOUNCER_ALIENS) /datum/round_event/spider_infestation/start() var/list/vents = list() diff --git a/code/modules/events/supermatter_surge.dm b/code/modules/events/supermatter_surge.dm new file mode 100644 index 0000000000000..175ecd07df125 --- /dev/null +++ b/code/modules/events/supermatter_surge.dm @@ -0,0 +1,24 @@ +/datum/round_event_control/supermatter_surge + name = "Supermatter Surge" + typepath = /datum/round_event/supermatter_surge + weight = 20 + max_occurrences = 4 + earliest_start = 10 MINUTES + +/datum/round_event_control/supermatter_surge/canSpawnEvent() + if(GLOB.main_supermatter_engine?.has_been_powered) + return ..() + +/datum/round_event/supermatter_surge + announceWhen = 1 + var/power = 2000 + +/datum/round_event/supermatter_surge/setup() + power = rand(200,4000) + +/datum/round_event/supermatter_surge/announce() + if(power > 800 || prob(round(power/8))) + priority_announce("Class [round(power/500) + 1] supermatter surge detected. Intervention may be required.", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) + +/datum/round_event/supermatter_surge/start() + GLOB.main_supermatter_engine.matter_power += power diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index cc75c4ceaa2bc..4a55b997a80ac 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -14,12 +14,12 @@ var/randomProbability = 1 var/reagentsAmount = 100 var/list/saferChems = list(/datum/reagent/water,/datum/reagent/carbon,/datum/reagent/consumable/flour,/datum/reagent/space_cleaner,/datum/reagent/consumable/nutriment,/datum/reagent/consumable/condensedcapsaicin,/datum/reagent/drug/mushroomhallucinogen,/datum/reagent/lube,/datum/reagent/glitter/pink,/datum/reagent/cryptobiolin, - /datum/reagent/toxin/plantbgone,/datum/reagent/blood,/datum/reagent/medicine/charcoal,/datum/reagent/drug/space_drugs,/datum/reagent/medicine/morphine,/datum/reagent/water/holywater,/datum/reagent/consumable/ethanol,/datum/reagent/consumable/hot_cocoa,/datum/reagent/toxin/acid,/datum/reagent/toxin/mindbreaker,/datum/reagent/toxin/rotatium,/datum/reagent/bluespace, + /datum/reagent/toxin/plantbgone,/datum/reagent/blood,/datum/reagent/medicine/charcoal,/datum/reagent/drug/space_drugs,/datum/reagent/medicine/morphine,/datum/reagent/water/holywater,/datum/reagent/consumable/ethanol,/datum/reagent/consumable/cocoa/hot_cocoa,/datum/reagent/toxin/acid,/datum/reagent/toxin/mindbreaker,/datum/reagent/toxin/rotatium,/datum/reagent/bluespace, /datum/reagent/pax,/datum/reagent/consumable/laughter,/datum/reagent/concentrated_barbers_aid,/datum/reagent/colorful_reagent,/datum/reagent/peaceborg/confuse,/datum/reagent/peaceborg/tire,/datum/reagent/consumable/sodiumchloride,/datum/reagent/consumable/ethanol/beer,/datum/reagent/hair_dye,/datum/reagent/consumable/sugar,/datum/reagent/glitter/white,/datum/reagent/growthserum) //needs to be chemid unit checked at some point /datum/round_event/vent_clog/announce() - priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert") + priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert", SSstation.announcer.get_rand_alert_sound()) /datum/round_event/vent_clog/setup() endWhen = rand(25, 100) @@ -88,7 +88,7 @@ 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") + priority_announce("The scrubbers network is experiencing an unexpected surge of pressurized beer. Some ejection of contents may occur.", "Atmospherics alert", SSstation.announcer.get_rand_alert_sound()) /datum/round_event/vent_clog/beer/start() for(var/obj/machinery/atmospherics/components/unary/vent in vents) @@ -103,7 +103,7 @@ 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") + 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", SSstation.announcer.get_rand_alert_sound()) /datum/round_event/vent_clog/plasma_decon/start() for(var/obj/machinery/atmospherics/components/unary/vent in vents) diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm index 41ee4246b1abc..6fc61ad982410 100644 --- a/code/modules/events/wizard/curseditems.dm +++ b/code/modules/events/wizard/curseditems.dm @@ -17,23 +17,23 @@ switch(item_set) if("wizardmimic") - loadout[SLOT_WEAR_SUIT] = /obj/item/clothing/suit/wizrobe - loadout[SLOT_SHOES] = /obj/item/clothing/shoes/sandal/magic - loadout[SLOT_HEAD] = /obj/item/clothing/head/wizard + loadout[TOBITSHIFT(ITEM_SLOT_OCLOTHING) + 1] = /obj/item/clothing/suit/wizrobe + loadout[TOBITSHIFT(ITEM_SLOT_FEET) + 1] = /obj/item/clothing/shoes/sandal/magic + loadout[TOBITSHIFT(ITEM_SLOT_HEAD) + 1] = /obj/item/clothing/head/wizard ruins_spaceworthiness = 1 if("swords") - loadout[SLOT_HANDS] = /obj/item/katana/cursed + loadout[TOBITSHIFT(ITEM_SLOT_HANDS) + 1] = /obj/item/katana/cursed if("bigfatdoobie") - loadout[SLOT_WEAR_MASK] = /obj/item/clothing/mask/cigarette/rollie/trippy + loadout[TOBITSHIFT(ITEM_SLOT_MASK) + 1] = /obj/item/clothing/mask/cigarette/rollie/trippy ruins_spaceworthiness = 1 if("boxing") - loadout[SLOT_WEAR_MASK] = /obj/item/clothing/mask/luchador - loadout[SLOT_GLOVES] = /obj/item/clothing/gloves/boxing + loadout[TOBITSHIFT(ITEM_SLOT_MASK) + 1] = /obj/item/clothing/mask/luchador + loadout[TOBITSHIFT(ITEM_SLOT_GLOVES) + 1] = /obj/item/clothing/gloves/boxing ruins_spaceworthiness = 1 if("voicemodulators") - loadout[SLOT_WEAR_MASK] = /obj/item/clothing/mask/chameleon + loadout[TOBITSHIFT(ITEM_SLOT_MASK) + 1] = /obj/item/clothing/mask/chameleon if("catgirls2015") - loadout[SLOT_HEAD] = /obj/item/clothing/head/kitty + loadout[TOBITSHIFT(ITEM_SLOT_HEAD) + 1] = /obj/item/clothing/head/kitty ruins_spaceworthiness = 1 ruins_wizard_loadout = 1 diff --git a/code/modules/events/wizard/embeddies.dm b/code/modules/events/wizard/embeddies.dm new file mode 100644 index 0000000000000..fe08b9c7432e9 --- /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/wizard/ghost.dm b/code/modules/events/wizard/ghost.dm index d5366c576975f..d2b889a7c74ae 100644 --- a/code/modules/events/wizard/ghost.dm +++ b/code/modules/events/wizard/ghost.dm @@ -21,6 +21,6 @@ /datum/round_event/wizard/possession/start() for(var/mob/dead/observer/G in GLOB.player_list) - G.verbs += /mob/dead/observer/verb/boo - G.verbs += /mob/dead/observer/verb/possess + G.add_verb(/mob/dead/observer/verb/boo) + G.add_verb(/mob/dead/observer/verb/possess) to_chat(G, "You suddenly feel a welling of new spooky powers...") diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index 82e72df3b9d3d..569e026e7ac73 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -83,7 +83,8 @@ if(!(resistance_flags & ON_FIRE) && !force) return QDEL_HINT_LETMELIVE - SSticker.round_end_events -= roundend_callback + LAZYREMOVE(SSticker.round_end_events, roundend_callback) + roundend_callback = null //This ought to free the callback datum, and prevent us from harddeling GLOB.poi_list.Remove(src) for(var/i in GLOB.player_list) var/mob/M = i diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index f335809cc8bcd..886e68cdbf598 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -13,7 +13,7 @@ startWhen = rand(40, 60) /datum/round_event/wizard/magicarp/announce(fake) - priority_announce("Unknown magical entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") + priority_announce("Unknown magical entities have been detected near [station_name()], please stand-by.", "Lifesign Alert", SSstation.announcer.get_rand_alert_sound()) /datum/round_event/wizard/magicarp/start() for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list) @@ -36,28 +36,37 @@ projectilesound = 'sound/weapons/emitter.ogg' maxHealth = 50 health = 50 - gold_core_spawnable = HOSTILE_SPAWN //NO_SPAWN - var/allowed_projectile_types = list(/obj/item/projectile/magic/change, /obj/item/projectile/magic/animate, /obj/item/projectile/magic/resurrection, + gold_core_spawnable = NO_SPAWN + var/allowed_projectile_types = list(/obj/item/projectile/magic/animate, /obj/item/projectile/magic/resurrection, /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) - + discovery_points = 3000 + /mob/living/simple_animal/hostile/carp/ranged/Initialize() projectiletype = pick(allowed_projectile_types) . = ..() -/*/mob/living/simple_animal/hostile/carp/ranged/xenobio - desc = "45% magic, 50% carp, 5% slime, 100% horrible." - allowed_projectile_types = list( /obj/item/projectile/magic/animate, /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) - gold_core_spawnable = HOSTILE_SPAWN*/ - /mob/living/simple_animal/hostile/carp/ranged/chaos name = "chaos magicarp" desc = "50% carp, 100% magic, 150% horrible." color = "#00FFFF" maxHealth = 75 health = 75 + gold_core_spawnable = NO_SPAWN + discovery_points = 5000 /mob/living/simple_animal/hostile/carp/ranged/chaos/Shoot() projectiletype = pick(allowed_projectile_types) ..() + +/mob/living/simple_animal/hostile/carp/ranged/xenobio + desc = "45% magic, 50% carp, 5% slime, 100% horrible." + allowed_projectile_types = list( /obj/item/projectile/magic/animate, /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) + gold_core_spawnable = HOSTILE_SPAWN + +/mob/living/simple_animal/hostile/carp/ranged/chaos/xenobio + desc = "95% magic, 50% carp, 5% slime, 150% horrible." + allowed_projectile_types = list( /obj/item/projectile/magic/animate, /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) + gold_core_spawnable = HOSTILE_SPAWN diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index f5de56ed0ccb1..e8eb1251166ca 100644 --- a/code/modules/events/wizard/rpgloot.dm +++ b/code/modules/events/wizard/rpgloot.dm @@ -8,6 +8,8 @@ /datum/round_event/wizard/rpgloot/start() var/upgrade_scroll_chance = 0 for(var/obj/item/I in world) + CHECK_TICK + if(!(I.flags_1 & INITIALIZED_1)) continue diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm index c77349ca5b9d1..cbd5fbc87d83c 100644 --- a/code/modules/events/wizard/shuffle.dm +++ b/code/modules/events/wizard/shuffle.dm @@ -84,7 +84,7 @@ for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) if(H.stat || !H.mind || iswizard(H)) continue //the wizard(s) are spared on this one - if(istype(H.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat) || H.anti_magic_check()) + if(istype(H.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat) || H.anti_magic_check()) continue mobs += H diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index 3e5321f7b3fe4..93b4fd6d1db71 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -12,7 +12,6 @@ GLOBAL_LIST_EMPTY(all_wormholes) // So we can pick wormholes to teleport to announceWhen = 10 endWhen = 60 - var/list/pick_turfs = list() var/list/wormholes = list() var/shift_frequency = 3 var/number_of_wormholes = 400 @@ -22,21 +21,17 @@ GLOBAL_LIST_EMPTY(all_wormholes) // So we can pick wormholes to teleport to endWhen = rand(40, 80) /datum/round_event/wormholes/start() - for(var/turf/open/floor/T in world) - if(is_station_level(T.z)) - pick_turfs += T - for(var/i = 1, i <= number_of_wormholes, i++) - var/turf/T = pick(pick_turfs) + var/turf/T = get_random_station_turf() //side effect - wormholes won't spawn in space wormholes += new /obj/effect/portal/wormhole(T, null, 0, null, FALSE) /datum/round_event/wormholes/announce(fake) - priority_announce("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert", 'sound/ai/spanomalies.ogg') + priority_announce("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert", ANNOUNCER_SPANOMALIES) /datum/round_event/wormholes/tick() if(activeFor % shift_frequency == 0) for(var/obj/effect/portal/wormhole/O in wormholes) - var/turf/T = pick(pick_turfs) + var/turf/T = get_random_station_turf() if(T) O.forceMove(T) diff --git a/code/modules/exploration_crew/discovery_research/discoverable_component.dm b/code/modules/exploration_crew/discovery_research/discoverable_component.dm new file mode 100644 index 0000000000000..ff9f66b71bfd5 --- /dev/null +++ b/code/modules/exploration_crew/discovery_research/discoverable_component.dm @@ -0,0 +1,49 @@ +/datum/component/discoverable + dupe_mode = COMPONENT_DUPE_UNIQUE + //Amount of discovery points awarded when researched. + var/scanned = FALSE + var/unique = FALSE + var/point_reward = 0 + +/datum/component/discoverable/Initialize(_point_reward, _unique = FALSE) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) + RegisterSignal(parent, COMSIG_CLICK, .proc/tryScan) + + point_reward = _point_reward + unique = _unique + +/datum/component/discoverable/proc/tryScan(datum/source, location, control, params, mob/user) + SIGNAL_HANDLER + if(!isliving(user)) + return + var/mob/living/L = user + if(istype(L.get_active_held_item(), /obj/item/discovery_scanner)) + INVOKE_ASYNC(L.get_active_held_item(), /obj/item/discovery_scanner.proc/begin_scanning, user, src) + +/datum/component/discoverable/proc/examine(datum/source, mob/user, atom/thing) + SIGNAL_HANDLER + if(!user.research_scanner) + return + to_chat(user, "Scientific data detected.") + to_chat(user, "Scanned: [scanned ? "True" : "False"].") + to_chat(user, "Discovery Value: [point_reward].") + +/datum/component/discoverable/proc/discovery_scan(datum/techweb/linked_techweb, mob/user) + //Already scanned our atom. + var/atom/A = parent + if(scanned) + to_chat(user, "[A] has already been analysed.") + return + //Already scanned another of this type. + if(linked_techweb.scanned_atoms[A.type] && !unique) + to_chat(user, "Datapoints about [A] already in system.") + return + scanned = TRUE + linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, point_reward) + linked_techweb.scanned_atoms[A.type] = TRUE + playsound(user, 'sound/machines/terminal_success.ogg', 60) + to_chat(user, "New datapoint scanned, [point_reward] discovery points gained.") + pulse_effect(get_turf(A), 4) diff --git a/code/modules/exploration_crew/discovery_research/discovery_scanner.dm b/code/modules/exploration_crew/discovery_research/discovery_scanner.dm new file mode 100644 index 0000000000000..fd0b2e5afd5ce --- /dev/null +++ b/code/modules/exploration_crew/discovery_research/discovery_scanner.dm @@ -0,0 +1,38 @@ +/obj/item/discovery_scanner + name = "discovery scanner" + desc = "A scanner used by scientists to collect research data about unknown artifacts and specimins." + icon = 'icons/obj/device.dmi' + icon_state = "discovery" + item_state = "healthanalyzer" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + w_class = WEIGHT_CLASS_SMALL + var/datum/techweb/linked_techweb + +/obj/item/discovery_scanner/Initialize() + . = ..() + if(!linked_techweb) + linked_techweb = SSresearch.science_tech + +/obj/item/discovery_scanner/Destroy() + linked_techweb = null //Note: Shouldn't hard del anyway since techwebs don't get deleted, however if they do then troubles will arise and this will need to be changed. + . = ..() + +/obj/item/discovery_scanner/examine(mob/user) + . = ..() + . += "Left-Click on any mob or researchable specimin to scan and gain discovery research points." + . += "[src] has unlimited range." + . += "Science goggles can help detect researchable items." + +/obj/item/discovery_scanner/attack_obj(obj/O, mob/living/user) + if(istype(O, /obj/machinery/computer/rdconsole)) + to_chat(user, "You link [src] to [O].") + var/obj/machinery/computer/rdconsole/rdconsole = O + linked_techweb = rdconsole.stored_research + return + . = ..() + +/obj/item/discovery_scanner/proc/begin_scanning(mob/user, datum/component/discoverable/discoverable) + to_chat(user, "You begin scanning [discoverable.parent]...") + if(do_after(user, 50, target=get_turf(user))) + discoverable.discovery_scan(linked_techweb, user) diff --git a/code/modules/exploration_crew/exploration_explosives.dm b/code/modules/exploration_crew/exploration_explosives.dm new file mode 100644 index 0000000000000..d2a205a2b8eb9 --- /dev/null +++ b/code/modules/exploration_crew/exploration_explosives.dm @@ -0,0 +1,129 @@ +/obj/item/grenade/exploration + name = "breaching charges" + desc = "Used by exploration crews to breach and demolish unknown places. Requires a nearby detonator to be triggered." + icon_state = "plastic-explosive0" + item_state = "plastic-explosive" + lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi' + item_flags = NOBLUDGEON + flags_1 = NONE + w_class = WEIGHT_CLASS_SMALL + var/atom/target = null + var/mutable_appearance/plastic_overlay + var/light_exp_range = 3 + var/heavy_range = 0 + var/devastation_range = 0 + var/list/attached_detonators = list() + +/obj/item/grenade/exploration/Initialize() + . = ..() + plastic_overlay = mutable_appearance(icon, "[item_state]2", HIGH_OBJ_LAYER) + +/obj/item/grenade/exploration/Destroy() + for(var/obj/item/exploration_detonator/detonator in attached_detonators) + detonator.linked_explosives -= src + attached_detonators = null + . = ..() + +/obj/item/grenade/exploration/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/exploration_detonator)) + var/obj/item/exploration_detonator/detonator = W + detonator.linked_explosives |= src + attached_detonators |= detonator + to_chat(user, "You link [src] to [W].") + return + . = ..() + +/obj/item/grenade/exploration/afterattack(atom/movable/AM, mob/user, flag) + . = ..() + + if(!length(attached_detonators)) + to_chat(user, "[src] needs to be linked to a detonator first!") + return + + if(!flag) + return + if(ismob(AM)) + return + + to_chat(user, "You start planting [src].") + + if(do_after(user, 30, target = AM)) + if(!user.temporarilyRemoveItemFromInventory(src)) + return + target = AM + + message_admins("[ADMIN_LOOKUPFLW(user)] planted [name] on [target.name] at [ADMIN_VERBOSEJMP(target)]") + log_game("[key_name(user)] planted [name] on [target.name] at [AREACOORD(user)]") + + notify_ghosts("[user] has planted \a [src] on [target]!", source = target, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Explosive Planted") + + moveToNullspace() //Yep + + if(istype(AM, /obj/item)) //your crappy throwing star can't fly so good with a giant brick of c4 on it. + var/obj/item/I = AM + I.throw_speed = max(1, (I.throw_speed - 3)) + I.throw_range = max(1, (I.throw_range - 3)) + if(I.embedding) + I.embedding["embed_chance"] = 0 + I.updateEmbedding() + else if(istype(AM, /mob/living)) + plastic_overlay.layer = FLOAT_LAYER + + target.add_overlay(plastic_overlay, TRUE) + to_chat(user, "You plant the bomb.") + +/obj/item/grenade/exploration/prime(mob/living/lanced_by) + . = ..() + var/turf/location + if(target) + if(!QDELETED(target)) + location = get_turf(target) + target.cut_overlay(plastic_overlay, TRUE) + target.ex_act(EXPLODE_HEAVY, target) + else + location = get_turf(src) + if(location) + explosion(location, devastation_range, heavy_range, light_exp_range) + if(ismob(target)) + var/mob/M = target + M.gib() + qdel(src) + +/obj/item/exploration_detonator + name = "detonator" + desc = "A detonator that can be linked to explosives and then... you know, detonate them." + icon = 'icons/obj/grenade.dmi' + icon_state = "detonator" + w_class = WEIGHT_CLASS_SMALL + var/range = 16 + var/list/linked_explosives = list() + +/obj/item/exploration_detonator/Destroy() + . = ..() + for(var/obj/item/grenade/exploration/explosive in linked_explosives) + explosive.attached_detonators -= src + linked_explosives = null + +/obj/item/exploration_detonator/attack_self(mob/user) + . = ..() + if(.) + return + var/turf/T = get_turf(user) + if(is_station_level(T.z) && !(obj_flags & EMAGGED)) + to_chat(user, "STATION SAFETY ENABLED.") + return + var/explosives_trigged = 0 + for(var/obj/item/grenade/exploration/exploration in linked_explosives) + var/turf/T2 = get_turf(exploration.target) + if(T2.get_virtual_z_level() == T.get_virtual_z_level() && get_dist(exploration.target, user) <= range) + addtimer(CALLBACK(exploration, /obj/item/grenade/exploration.proc/prime), 10) + explosives_trigged ++ + to_chat(user, "[explosives_trigged] explosives triggered.") + +/obj/item/exploration_detonator/emag_act(mob/user) + . = ..() + if(obj_flags & EMAGGED) + return + obj_flags |= EMAGGED + to_chat(user, "You override the safety controls of [src]. You can now trigger explosives on the station.") diff --git a/code/modules/exploration_crew/exploration_laser_gun.dm b/code/modules/exploration_crew/exploration_laser_gun.dm new file mode 100644 index 0000000000000..5b3d102b16499 --- /dev/null +++ b/code/modules/exploration_crew/exploration_laser_gun.dm @@ -0,0 +1,107 @@ +/obj/item/gun/energy/e_gun/mini/exploration + name = "handheld multi-purpose energy gun" + desc = "A pistol-sized energy gun with a built-in flashlight designed for exploration crews. It serves a duel purpose and has modes for anti-creature lasers and cutting lasers." + pin = /obj/item/firing_pin/off_station + ammo_type = list(/obj/item/ammo_casing/energy/laser/anti_creature, /obj/item/ammo_casing/energy/laser/cutting) + +/obj/item/gun/energy/e_gun/mini/exploration/emag_act(mob/user) + . = ..() + //Emag the pin too + if(pin) + pin.emag_act(user) + if(obj_flags & EMAGGED) + return + to_chat(user, "You override the safety of the energy gun, it will now fire higher powered projectiles at a greater cost.") + ammo_type = list(/obj/item/ammo_casing/energy/laser/exploration_kill, /obj/item/ammo_casing/energy/laser/exploration_destroy) + update_ammo_types() + obj_flags |= EMAGGED + +//Anti-creature - Extra damage against simplemobs + +/obj/item/ammo_casing/energy/laser/anti_creature + projectile_type = /obj/item/projectile/beam/laser/anti_creature + select_name = "anti-creature" + e_cost = 40 + +/obj/item/projectile/beam/laser/anti_creature + damage = 15 + tracer_type = /obj/effect/projectile/tracer/laser + muzzle_type = /obj/effect/projectile/muzzle/laser + impact_type = /obj/effect/projectile/impact/laser + +/obj/item/projectile/beam/laser/anti_creature/on_hit(atom/target, blocked) + damage = initial(damage) + if(!iscarbon(target) && !issilicon(target)) + damage = 30 + . = ..() + +//Cutting projectile - Damage against objects + +/obj/item/ammo_casing/energy/laser/cutting + projectile_type = /obj/item/projectile/beam/laser/cutting + select_name = "cutting laser" + e_cost = 30 + +/obj/item/projectile/beam/laser/cutting + damage = 5 + icon_state = "heavylaser" + tracer_type = /obj/effect/projectile/tracer/heavy_laser + muzzle_type = /obj/effect/projectile/muzzle/heavy_laser + impact_type = /obj/effect/projectile/impact/heavy_laser + +/obj/item/projectile/beam/laser/cutting/on_hit(atom/target, blocked) + damage = initial(damage) + if(isobj(target)) + damage = 70 + else if(istype(target, /turf/closed/mineral)) + var/turf/closed/mineral/T = target + T.gets_drilled() + . = ..() + +//Emagged ammo types + +/obj/item/ammo_casing/energy/laser/exploration_kill + projectile_type = /obj/item/projectile/beam/laser/exploration_kill + select_name = "KILL" + e_cost = 80 + +/obj/item/projectile/beam/laser/exploration_kill + damage = 30 + tracer_type = /obj/effect/projectile/tracer/laser + muzzle_type = /obj/effect/projectile/muzzle/laser + impact_type = /obj/effect/projectile/impact/laser + +/obj/item/projectile/beam/laser/exploration_kill/on_hit(atom/target, blocked) + damage = initial(damage) + if(!iscarbon(target) && !issilicon(target)) + damage = 50 + //If you somehow hit yourself you get fried. + if(target == firer) + to_chat(firer, "The laser accelerates violently towards your gun's magnetic field, tearing its way through your body!") + damage = 200 + . = ..() + +//destroy + +/obj/item/ammo_casing/energy/laser/exploration_destroy + projectile_type = /obj/item/projectile/beam/laser/exploration_destroy + select_name = "DESTROY" + e_cost = 120 + +/obj/item/projectile/beam/laser/exploration_destroy + damage = 20 + icon_state = "heavylaser" + tracer_type = /obj/effect/projectile/tracer/heavy_laser + muzzle_type = /obj/effect/projectile/muzzle/heavy_laser + impact_type = /obj/effect/projectile/impact/heavy_laser + +/obj/item/projectile/beam/laser/exploration_destroy/on_hit(atom/target, blocked) + damage = initial(damage) + if(isobj(target)) + damage = 150 + else if(istype(target, /turf/closed/mineral)) + var/turf/closed/mineral/T = target + T.gets_drilled() + else if(isturf(target)) + SSexplosions.medturf += target + . = ..() diff --git a/code/modules/exploration_crew/exploration_shuttle.dm b/code/modules/exploration_crew/exploration_shuttle.dm new file mode 100644 index 0000000000000..7fc44209c7cc0 --- /dev/null +++ b/code/modules/exploration_crew/exploration_shuttle.dm @@ -0,0 +1,13 @@ +/obj/machinery/computer/shuttle_flight/custom_shuttle/exploration + name = "exploration shuttle console" + desc = "Used to pilot the exploration shuttle." + circuit = /obj/item/circuitboard/computer/exploration_shuttle + shuttleId = "exploration" + possible_destinations = "exploration_home" + req_access = list(ACCESS_EXPLORATION) + +/obj/machinery/computer/shuttle_flight/custom_shuttle/exploration/linkShuttle(new_id) + return + +/obj/machinery/computer/shuttle_flight/custom_shuttle/exploration/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override) + return diff --git a/code/modules/exploration_crew/exploration_vendor.dm b/code/modules/exploration_crew/exploration_vendor.dm new file mode 100644 index 0000000000000..63b177377e3b6 --- /dev/null +++ b/code/modules/exploration_crew/exploration_vendor.dm @@ -0,0 +1,41 @@ +GLOBAL_VAR_INIT(exploration_points, 0) + +/obj/machinery/vendor/exploration + name = "exploration equipment vendor" + desc = "An equipment vendor for exploration teams. Points are acquired by completing missions and shared between team members." + icon = 'icons/obj/machines/mining_machines.dmi' + icon_state = "mining" + density = TRUE + circuit = /obj/item/circuitboard/machine/exploration_equipment_vendor + + icon_deny = "mining-deny" + prize_list = list( + new /datum/data/vendor_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 50), + new /datum/data/vendor_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 300), + new /datum/data/vendor_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 500), + new /datum/data/vendor_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 2000), + new /datum/data/vendor_equipment("Brute Healing Kit", /obj/item/storage/firstaid/brute, 3000), + new /datum/data/vendor_equipment("Burn Healing Kit", /obj/item/storage/firstaid/fire, 3000), + new /datum/data/vendor_equipment("Advanced Healing Kit", /obj/item/storage/firstaid/advanced, 5000), + new /datum/data/vendor_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 2000), + new /datum/data/vendor_equipment("Breaching Charge", /obj/item/grenade/exploration, 1000), + new /datum/data/vendor_equipment("Charge Detonator", /obj/item/exploration_detonator, 10000), + new /datum/data/vendor_equipment("Multi-Purpose Energy Gun", /obj/item/gun/energy/e_gun/mini/exploration, 20000), + new /datum/data/vendor_equipment("Expanded E. Oxygen Tank", /obj/item/tank/internals/emergency_oxygen/engi, 1000), + new /datum/data/vendor_equipment("Survival Knife", /obj/item/kitchen/knife/combat/survival, 1000), + new /datum/data/vendor_equipment("Pizza", /obj/item/pizzabox/margherita, 200), + new /datum/data/vendor_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 1000), + new /datum/data/vendor_equipment("Absinthe", /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium, 1000), + new /datum/data/vendor_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 1500), + new /datum/data/vendor_equipment("Soap", /obj/item/soap/nanotrasen, 2000), + new /datum/data/vendor_equipment("Laser Pointer", /obj/item/laser_pointer, 3000), + new /datum/data/vendor_equipment("Toy Alien", /obj/item/clothing/mask/facehugger/toy, 3000), + ) + +/obj/machinery/vendor/exploration/subtract_points(obj/item/card/id/I, amount) + GLOB.exploration_points -= amount + +/obj/machinery/vendor/exploration/get_points(obj/item/card/id/I) + if(!(ACCESS_EXPLORATION in I.access)) + return 0 + return GLOB.exploration_points diff --git a/code/modules/exploration_crew/nostation_firing_pin.dm b/code/modules/exploration_crew/nostation_firing_pin.dm new file mode 100644 index 0000000000000..76893325dcafd --- /dev/null +++ b/code/modules/exploration_crew/nostation_firing_pin.dm @@ -0,0 +1,15 @@ +/obj/item/firing_pin/off_station + name = "off-station firing pin" + desc = "Allows the firing of weapons while not on the station." + fail_message = "STATION SAFETY ENABLED." + pin_removeable = TRUE + +/obj/item/firing_pin/off_station/pin_auth(mob/living/user) + if(!istype(user)) + return FALSE + var/turf/T = get_turf(user) + if(!T) + return FALSE + if(is_station_level(T.z)) + return FALSE + return TRUE diff --git a/code/modules/exploration_crew/research_locator.dm b/code/modules/exploration_crew/research_locator.dm new file mode 100644 index 0000000000000..77a2ab13d0061 --- /dev/null +++ b/code/modules/exploration_crew/research_locator.dm @@ -0,0 +1,23 @@ + +/obj/item/research_disk_pinpointer + name = "research disk locator" + desc = "A small handheld device that detects nearby research disks. Despite its extremely high sensitivity, the returned signal from research disks is so weak that it only has a short range." + icon = 'icons/obj/device.dmi' + icon_state = "researchlocator" + var/next_use_time = 0 + var/range = 30 + +/obj/item/research_disk_pinpointer/attack_self(mob/user) + if(world.time < next_use_time) + to_chat(user, "Internal capacitors recharging...") + return + to_chat(user, "You pulse for nearby research disks.") + pulse_effect(get_turf(src), 6) + next_use_time = world.time + 10 SECONDS + for(var/obj/item/disk/tech_disk/research/research_disk in SSorbits.research_disks) + var/dist = get_dist(user, research_disk) + if(dist <= range && isturf(research_disk.loc) && research_disk.get_virtual_z_level() == get_virtual_z_level()) + var/direction = get_dir(user, research_disk) + dir = direction + say("Weak signal detected [dir2text(direction)] of current location, [dist] meters away.") + return diff --git a/code/modules/fields/fields.dm b/code/modules/fields/fields.dm index 5b0b4bc1f8940..38cc9f8e66037 100644 --- a/code/modules/fields/fields.dm +++ b/code/modules/fields/fields.dm @@ -154,7 +154,7 @@ var/atom/_host = host var/atom/new_host_loc = _host.loc if(last_host_loc != new_host_loc) - recalculate_field() + INVOKE_ASYNC(src, .proc/recalculate_field) /datum/proximity_monitor/advanced/proc/post_setup_field() @@ -319,6 +319,8 @@ listeningTo = null /obj/item/multitool/field_debug/proc/on_mob_move() + SIGNAL_HANDLER + check_turf(get_turf(src)) /obj/item/multitool/field_debug/process() diff --git a/code/modules/fields/peaceborg_dampener.dm b/code/modules/fields/peaceborg_dampener.dm index 47d7f096c968a..ad62066dcda07 100644 --- a/code/modules/fields/peaceborg_dampener.dm +++ b/code/modules/fields/peaceborg_dampener.dm @@ -38,7 +38,7 @@ for(var/obj/item/projectile/P in tracked) if(!(P in ranged) || !P.loc) release_projectile(P) - for(var/mob/living/silicon/robot/R in range(current_range, get_turf(host))) + for(var/mob/living/silicon/robot/R in ohearers(current_range, get_turf(host))) if(R.has_buckled_mobs()) for(var/mob/living/L in R.buckled_mobs) L.visible_message("[L] is knocked off of [R] by the charge in [R]'s chassis induced by [name]!") //I know it's bad. diff --git a/code/modules/fields/timestop.dm b/code/modules/fields/timestop.dm index bc5502438f9b2..ff4402b0a90c9 100644 --- a/code/modules/fields/timestop.dm +++ b/code/modules/fields/timestop.dm @@ -42,7 +42,7 @@ timestop() /obj/effect/timestop/Destroy() - qdel(chronofield) + QDEL_NULL(chronofield) playsound(src, 'sound/magic/timeparadox2.ogg', 75, TRUE, frequency = -1) //reverse! return ..() @@ -108,6 +108,8 @@ unfreeze_atom(i) /datum/proximity_monitor/advanced/timestop/proc/unfreeze_atom(atom/movable/A) + SIGNAL_HANDLER + if(A.throwing) unfreeze_throwing(A) if(isliving(A)) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 11fd61c09bf76..fcea44fcfee15 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -11,7 +11,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( /datum/hallucination/weird_sounds = 8, /datum/hallucination/stationmessage = 7, /datum/hallucination/fake_flood = 7, - /datum/hallucination/stray_bullet = 7, + /datum/hallucination/stray_bullet = 3, /datum/hallucination/bolts = 7, /datum/hallucination/items_other = 7, /datum/hallucination/husks = 7, @@ -31,6 +31,11 @@ GLOBAL_LIST_INIT(hallucination_list, list( hallucination-- + //This system used to shit bricks with decimal values. Fuck it. + if(hallucination <= 0) + hallucination = 0 + return + if(world.time < next_hallucination) return @@ -282,10 +287,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( /datum/hallucination/oh_yeah/New(mob/living/carbon/C, forced = TRUE) set waitfor = FALSE . = ..() - var/turf/closed/wall/wall - for(var/turf/closed/wall/W in range(7,target)) - wall = W - break + var/turf/closed/wall/wall = locate() in spiral_range_turfs(7, target) if(!wall) return INITIALIZE_HINT_QDEL feedback_details += "Source: [wall.x],[wall.y],[wall.z]" @@ -420,9 +422,8 @@ GLOBAL_LIST_INIT(hallucination_list, list( var/image/A = null var/list/mob_pool = list() - for(var/mob/living/carbon/human/M in view(7,target)) - if(M != target) - mob_pool += M + for(var/mob/living/carbon/human/M in ohearers(7,target)) + mob_pool += M if(!mob_pool.len) return @@ -518,7 +519,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( feedback_details += "Type: [kind]" var/list/nearby if(skip_nearby) - nearby = get_hearers_in_view(7, target) + nearby = hearers(7, target) for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) if(H == target) continue @@ -689,31 +690,29 @@ GLOBAL_LIST_INIT(hallucination_list, list( else if(get_dist(target,H)You feel a tiny prick!") - var/obj/item/storage/equipped_backpack = other.get_item_by_slot(SLOT_BACK) + var/obj/item/storage/equipped_backpack = other.get_item_by_slot(ITEM_SLOT_BACK) if(istype(equipped_backpack)) for(var/i in 1 to 5) //increase the odds message_pool.Add("[other] puts the [pick(\ @@ -860,7 +859,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.playsound_local(source, pick('sound/voice/human/manlaugh1.ogg', 'sound/voice/human/manlaugh2.ogg'), 50, 1) if("creepy") //These sounds are (mostly) taken from Hidden: Source - target.playsound_local(source, pick(CREEPY_SOUNDS), 50, 1) + target.playsound_local(source, pick(GLOB.creepy_ambience), 50, 1) if("tesla") //Tesla loose! target.playsound_local(source, 'sound/magic/lightningbolt.ogg', 35, 1) sleep(30) @@ -882,7 +881,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( if("blob alert") to_chat(target, "

Biohazard Alert

") to_chat(target, "

Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.

") - SEND_SOUND(target, 'sound/ai/outbreak5.ogg') + SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_OUTBREAK5]) if("ratvar") target.playsound_local(target, 'sound/machines/clockcult/ark_deathrattle.ogg', 50, FALSE, pressure_affected = FALSE) target.playsound_local(target, 'sound/effects/clockcult_gateway_disrupted.ogg', 50, FALSE, pressure_affected = FALSE) @@ -891,15 +890,15 @@ GLOBAL_LIST_INIT(hallucination_list, list( if("shuttle dock") to_chat(target, "

Priority Announcement

") to_chat(target, "

The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.

") - SEND_SOUND(target, 'sound/ai/shuttledock.ogg') + SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_SHUTTLEDOCK]) if("malf ai") //AI is doomsdaying! to_chat(target, "

Anomaly Alert

") to_chat(target, "

Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.

") - SEND_SOUND(target, 'sound/ai/aimalf.ogg') + SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_AIMALF]) if("meteors") //Meteors inbound! to_chat(target, "

Meteor Alert

") to_chat(target, "

Meteors have been detected on collision course with the station.

") - SEND_SOUND(target, 'sound/ai/meteors.ogg') + SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_METEORS]) if("supermatter") SEND_SOUND(target, 'sound/magic/charge.ogg') to_chat(target, "You feel reality distort for a moment...") @@ -930,46 +929,46 @@ GLOBAL_LIST_INIT(hallucination_list, list( feedback_details += "Type: [alert_type]" switch(alert_type) if("not_enough_oxy") - target.throw_alert(alert_type, /obj/screen/alert/not_enough_oxy, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/not_enough_oxy, override = TRUE) if("not_enough_tox") - target.throw_alert(alert_type, /obj/screen/alert/not_enough_tox, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/not_enough_tox, override = TRUE) if("not_enough_co2") - target.throw_alert(alert_type, /obj/screen/alert/not_enough_co2, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/not_enough_co2, override = TRUE) if("too_much_oxy") - target.throw_alert(alert_type, /obj/screen/alert/too_much_oxy, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/too_much_oxy, override = TRUE) if("too_much_co2") - target.throw_alert(alert_type, /obj/screen/alert/too_much_co2, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/too_much_co2, override = TRUE) if("too_much_tox") - target.throw_alert(alert_type, /obj/screen/alert/too_much_tox, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/too_much_tox, override = TRUE) if("nutrition") if(prob(50)) - target.throw_alert(alert_type, /obj/screen/alert/fat, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/fat, override = TRUE) else - target.throw_alert(alert_type, /obj/screen/alert/starving, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/starving, override = TRUE) if("gravity") - target.throw_alert(alert_type, /obj/screen/alert/weightless, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/weightless, override = TRUE) if("fire") - target.throw_alert(alert_type, /obj/screen/alert/fire, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/fire, override = TRUE) if("temphot") alert_type = "temp" - target.throw_alert(alert_type, /obj/screen/alert/hot, 3, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/hot, 3, override = TRUE) if("tempcold") alert_type = "temp" - target.throw_alert(alert_type, /obj/screen/alert/cold, 3, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/cold, 3, override = TRUE) if("pressure") if(prob(50)) - target.throw_alert(alert_type, /obj/screen/alert/highpressure, 2, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/highpressure, 2, override = TRUE) else - target.throw_alert(alert_type, /obj/screen/alert/lowpressure, 2, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/lowpressure, 2, override = TRUE) //BEEP BOOP I AM A ROBOT if("newlaw") - target.throw_alert(alert_type, /obj/screen/alert/newlaw, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/newlaw, override = TRUE) if("locked") - target.throw_alert(alert_type, /obj/screen/alert/locked, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/locked, override = TRUE) if("hacked") - target.throw_alert(alert_type, /obj/screen/alert/hacked, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/hacked, override = TRUE) if("charge") - target.throw_alert(alert_type, /obj/screen/alert/emptycell, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/emptycell, override = TRUE) sleep(duration) target.clear_alert(alert_type, clear_override = TRUE) qdel(src) @@ -1044,7 +1043,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( //Flashes of danger if(!target.halimage) var/list/possible_points = list() - for(var/turf/open/floor/F in view(target,world.view)) + for(var/turf/open/floor/F in view(world.view, target)) possible_points += F if(possible_points.len) var/turf/open/floor/danger_point = pick(possible_points) @@ -1116,8 +1115,8 @@ GLOBAL_LIST_INIT(hallucination_list, list( . = ..() START_PROCESSING(SSobj, src) -/obj/effect/hallucination/danger/anomaly/process() - if(prob(70)) +/obj/effect/hallucination/danger/anomaly/process(delta_time) + if(DT_PROB(45, delta_time)) step(src,pick(GLOB.alldirs)) /obj/effect/hallucination/danger/anomaly/Destroy() @@ -1174,7 +1173,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( if(target.client) target.client.images += fire_overlay to_chat(target, "You're set on fire!") - target.throw_alert("fire", /obj/screen/alert/fire, override = TRUE) + target.throw_alert("fire", /atom/movable/screen/alert/fire, override = TRUE) sleep(20) for(var/i in 1 to 3) if(target.fire_stacks <= 0) @@ -1196,7 +1195,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.clear_alert("temp", clear_override = TRUE) else target.clear_alert("temp", clear_override = TRUE) - target.throw_alert("temp", /obj/screen/alert/hot, stage, override = TRUE) + target.throw_alert("temp", /atom/movable/screen/alert/hot, stage, override = TRUE) /datum/hallucination/fire/proc/clear_fire() if(!active) @@ -1253,7 +1252,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 view(world.view, target)) possible_points += F if(possible_points.len) var/turf/open/floor/husk_point = pick(possible_points) @@ -1284,8 +1283,10 @@ 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 view(getexpandedview(world.view, 1, 1),target)) startlocs += T + for(var/turf/open/T in view(world.view,target)) // God this is bad + startlocs -= T if(!startlocs.len) qdel(src) return diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index c8e837a1245da..e8c274a1992ec 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -257,7 +257,7 @@ /obj/item/reagent_containers/food/drinks/mug/cocoa name = "Dutch hot cocoa" desc = "Made in Space South America." - list_reagents = list(/datum/reagent/consumable/hot_cocoa = 15, /datum/reagent/consumable/sugar = 5) + list_reagents = list(/datum/reagent/consumable/cocoa/hot_cocoa = 15, /datum/reagent/consumable/sugar = 5) foodtype = SUGAR resistance_flags = FREEZE_PROOF custom_price = 42 @@ -279,6 +279,15 @@ list_reagents = list(/datum/reagent/consumable/ethanol/beer = 30) foodtype = GRAIN | ALCOHOL +/obj/item/reagent_containers/food/drinks/beer/almost_empty + var/amount + list_reagents = null + +/obj/item/reagent_containers/food/drinks/beer/almost_empty/Initialize() + . = ..() + amount = rand(1,4) + reagents.add_reagent(/datum/reagent/consumable/ethanol/beer, amount) + /obj/item/reagent_containers/food/drinks/syndicatebeer name = "syndicate beer" desc = "Consumed only by the finest syndicate agents. There is a round warning label stating 'Don't drink more than one in quick succession!'" @@ -382,7 +391,21 @@ name = "small carton" desc = "A small carton, intended for holding drinks." +/obj/item/reagent_containers/food/drinks/honeycomb + name = "Honeycomb" + desc = "A honeycomb made by an apid. It seems to be made out of beeswax and fairly weak." + icon = 'icons/obj/hydroponics/harvest.dmi' + icon_state = "honeycomb" + list_reagents = list(/datum/reagent/consumable/honey = 25) +/obj/item/reagent_containers/food/drinks/honeycomb/attack_self(mob/user) + if(!reagents.total_volume) + user.visible_message("[user] snaps the [src] into 2 pieces!", + "You snap [src] in half.") + new /obj/item/stack/sheet/mineral/wax(user.loc, 2) + qdel(src) + return + return ..() //////////////////////////drinkingglass and shaker// //Note by Darem: This code handles the mixing of drinks. New drinks go in three places: In Chemistry-Reagents.dm (for the drink @@ -426,6 +449,7 @@ volume = 30 spillable = TRUE + //////////////////////////soda_cans// //These are in their own group to be used as IED's in /obj/item/grenade/ghettobomb.dm @@ -449,7 +473,7 @@ playsound(H,'sound/items/drink.ogg', 80, 1) reagents.trans_to(H, src.reagents.total_volume, transfered_by = H) //a big sip sleep(5) - H.say(pick("Now, Outbomb Cuban Pete, THAT was a game.", "All these new fangled arcade games are too slow. I prefer the classics.", "They don't make 'em like Orion Trail anymore.", "You know what they say. Worst day of spess carp fishing is better than the best day at work.", "They don't make 'em like good old fashioned singularity engines anymore.")) + H.say(pick("Now, Outbomb Cuban Pete, THAT was a game.", "All these new fangled arcade games are too slow. I prefer the classics.", "They don't make 'em like Orion Trail anymore.", "You know what they say. Worst day of spess carp fishing is better than the best day at work.", "They don't make 'em like good old-fashioned singularity engines anymore.")) if(H.age >= 30) H.Stun(50) sleep(50) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index e485f693413d7..5194f1a5c1da8 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -21,10 +21,10 @@ if(isliving(hitby)) var/mob/living/L = hitby smash(L) - else + else smash() return TRUE - + /obj/item/reagent_containers/food/drinks/bottle/smash(mob/living/target, mob/thrower, ranged = FALSE) //Creates a shattering noise and replaces the bottle with a broken_bottle @@ -336,6 +336,24 @@ icon_state = "fernetbottle" list_reagents = list(/datum/reagent/consumable/ethanol/fernet = 100) +/obj/item/reagent_containers/food/drinks/bottle/beer + name = "Space Beer" + desc = "Beer. In space. In a bigger bottle." + icon_state = "beer" + list_reagents = list(/datum/reagent/consumable/ethanol/beer = 100) + +/obj/item/reagent_containers/food/drinks/bottle/ale + name = "Magm-Ale" + desc = "A true dorf's drink of choice, now in a MANLY bottle." + icon_state = "alebottle" + list_reagents = list(/datum/reagent/consumable/ethanol/ale = 100) + +/obj/item/reagent_containers/food/drinks/bottle/homemaderum + name = "Cookie's Homemade Rum" + desc = "Brewed all the way back on Space Station 3. Might tell you where those basket-hats of fruit keep coming from." + icon_state = "moonshinebottle" + list_reagents = list(/datum/reagent/consumable/ethanol/rum = 95, /datum/reagent/drug/mushroomhallucinogen = 5) + //////////////////////////JUICES AND STUFF /////////////////////// /obj/item/reagent_containers/food/drinks/bottle/orangejuice diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index 184b391203eac..759ba38d44889 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -53,7 +53,7 @@ mix_filling_color(S) S.reagents.trans_to(src,min(S.reagents.total_volume, 15), transfered_by = user) //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_overlays(S) + update_customizable_overlays(S) to_chat(user, "You add the [I.name] to the [name].") update_name(S) else @@ -101,7 +101,7 @@ rgbcolor[4] = (customcolor[4]+ingcolor[4])/2 filling_color = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3], rgbcolor[4]) -/obj/item/reagent_containers/food/snacks/customizable/update_overlays(obj/item/reagent_containers/food/snacks/S) +/obj/item/reagent_containers/food/snacks/customizable/update_customizable_overlays(obj/item/reagent_containers/food/snacks/S) var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling") if(S.filling_color == "#FFFFFF") filling.color = pick("#FF0000","#0000FF","#008000","#FFFF00") @@ -137,7 +137,7 @@ /obj/item/reagent_containers/food/snacks/customizable/initialize_slice(obj/item/reagent_containers/food/snacks/slice, reagents_per_slice) ..() slice.filling_color = filling_color - slice.update_overlays(src) + slice.update_customizable_overlays(src) /obj/item/reagent_containers/food/snacks/customizable/Destroy() diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index a9dfd126c6c6a..b2d4b2cc14797 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -270,7 +270,8 @@ All foods are distributed among various categories. Use common sense. trash = null return -/obj/item/reagent_containers/food/snacks/proc/update_overlays(obj/item/reagent_containers/food/snacks/S) +// We need to refactor this someday, like, in 3 years +/obj/item/reagent_containers/food/snacks/proc/update_customizable_overlays(obj/item/reagent_containers/food/snacks/S) cut_overlays() var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling") if(S.filling_color == "#FFFFFF") @@ -312,6 +313,14 @@ All foods are distributed among various categories. Use common sense. return result +/obj/item/reagent_containers/food/snacks/burn() + if(prob(25)) + microwave_act() + else + var/turf/T = get_turf(src) + new /obj/item/reagent_containers/food/snacks/badrecipe(T) + qdel(src) + /obj/item/reagent_containers/food/snacks/Destroy() if(contents) for(var/atom/movable/something in contents) @@ -323,13 +332,13 @@ All foods are distributed among various categories. Use common sense. if(iscorgi(M)) var/mob/living/L = M if(bitecount == 0 || prob(50)) - M.emote("me", 1, "nibbles away at \the [src]") + M.emote("me", 1, "nibbles away at \the [src].") bitecount++ L.taste(reagents) // why should carbons get all the fun? if(bitecount >= 5) - var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [src] was") - if(sattisfaction_text) - M.emote("me", 1, "[sattisfaction_text]") + var/satisfaction_text = pick("burps from enjoyment.", "yaps for more.", "woofs twice.", "looks at the area where \the [src] was.") + if(satisfaction_text) + M.emote("me", 1, "[satisfaction_text]") qdel(src) /obj/item/reagent_containers/food/snacks/afterattack(obj/item/reagent_containers/M, mob/user, proximity) diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm index 807e4f655160f..26966dea14e97 100644 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ b/code/modules/food_and_drinks/food/snacks_bread.dm @@ -199,6 +199,14 @@ tastes = list("bread" = 1) foodtype = GRAIN +/obj/item/reagent_containers/food/snacks/baguette/mime + name = "French Baguette" + desc = "It would be a shame if it was consumed by someone unworthy..." + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/nothing = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/nothing = 2) + bitesize = -1 + + /obj/item/reagent_containers/food/snacks/garlicbread name = "garlic bread" desc = "Alas, it is limited." diff --git a/code/modules/food_and_drinks/food/snacks_burgers.dm b/code/modules/food_and_drinks/food/snacks_burgers.dm index f5e16c3c93e4d..5cde358161ed3 100644 --- a/code/modules/food_and_drinks/food/snacks_burgers.dm +++ b/code/modules/food_and_drinks/food/snacks_burgers.dm @@ -383,3 +383,11 @@ if(prob(33)) icon_state = "cheeseburgeralt" +/obj/item/reagent_containers/food/snacks/burger/crazy + name = "crazy hamburger" + desc = "Crazy hamburger! It is horrible!" + icon_state = "crazyhamburger" + tastes = list("bread made in turkey" = 2, "horse meat" = 4, "cheese from sao paulo from brazil" = 3, "red hot chili peppers" = 3, "oil from iraq" = 2, "grass of death" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1) + foodtype = GRAIN | MEAT | DAIRY | TOXIC | GROSS | FRUIT + w_class = WEIGHT_CLASS_NORMAL // The crazy hamburger in the video was bigger than joker's hand therefore i think this weight class is adequate. diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index ffc26e5b25fbe..1383b491a834c 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -33,6 +33,12 @@ name = "imitation carp fillet" desc = "Almost just like the real thing, kinda." +/obj/item/reagent_containers/food/snacks/carpmeat/icantbeliveitsnotcarp + name = "fish fillet" + desc = "A fillet of unspecified fish meat." + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2) //No carpotoxin + + /obj/item/reagent_containers/food/snacks/fishfingers name = "fish fingers" desc = "A finger of fish." @@ -123,7 +129,7 @@ /obj/item/reagent_containers/food/snacks/sausage/Initialize() . = ..() - eatverb = pick("bite","chew","nibble","deep throat","gobble","chomp") + eatverb = pick("bite","chew","nibble","gobble","chomp") /obj/item/reagent_containers/food/snacks/rawkhinkali name = "raw khinkali" @@ -160,7 +166,7 @@ if(GLOB.total_cube_monkeys >= CONFIG_GET(number/max_cube_monkeys)) visible_message("[src] refuses to expand!") return - var/mob/spammer = get_mob_by_key(fingerprintslast) + var/mob/spammer = get_mob_by_ckey(fingerprintslast) var/mob/living/bananas = new spawned_mob(drop_location(), TRUE, spammer) if(faction) bananas.faction = faction @@ -377,4 +383,4 @@ list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/bbqsauce = 5) bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("meat" = 3, "smokey sauce" = 1) - foodtype = MEAT \ No newline at end of file + foodtype = MEAT diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index 5afeda625f28c..1596c542db543 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -647,3 +647,13 @@ filling_color = "#ECA735" tastes = list("fried corn" = 1) foodtype = JUNKFOOD | FRIED + +/obj/item/reagent_containers/food/snacks/canned/beefbroth + name = "canned beef broth" + desc = "Why does this exist?" + icon_state = "beefcan" + trash = /obj/item/trash/can/food/beefbroth + list_reagents = list(/datum/reagent/consumable/beefbroth = 50) + filling_color = "#100800" + tastes = list("disgust" = 7, "tin" = 1) + foodtype = MEAT | GROSS | JUNKFOOD \ No newline at end of file diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index 8e104dcdd52c6..2ec595df8abb5 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -111,7 +111,7 @@ name = "chocolate donut" desc = "Goes great with a glass of warm milk." icon_state = "donut_choc" - bonus_reagents = list(/datum/reagent/consumable/hot_cocoa = 3, /datum/reagent/consumable/sprinkles = 1) //the cocoa reagent is just bitter. + bonus_reagents = list(/datum/reagent/consumable/cocoa/hot_cocoa = 3, /datum/reagent/consumable/sprinkles = 1) //the cocoa reagent is just bitter. tastes = list("donut" = 4, "bitterness" = 1) decorated_icon = "donut_choc_sprinkles" filling_color = "#4F230D" @@ -201,7 +201,7 @@ name = "chocolate jelly donut" desc = "Goes great with a glass of warm milk." icon_state = "jelly_choc" - bonus_reagents = list(/datum/reagent/consumable/hot_cocoa = 3, /datum/reagent/consumable/sprinkles = 1, /datum/reagent/consumable/nutriment/vitamin = 1) //the cocoa reagent is just bitter. + bonus_reagents = list(/datum/reagent/consumable/cocoa/hot_cocoa = 3, /datum/reagent/consumable/sprinkles = 1, /datum/reagent/consumable/nutriment/vitamin = 1) //the cocoa reagent is just bitter. tastes = list("jelly" = 1, "donut" = 4, "bitterness" = 1) decorated_icon = "jelly_choc_sprinkles" filling_color = "#4F230D" @@ -282,7 +282,7 @@ name = "chocolate jelly donut" desc = "Goes great with a glass of warm milk." icon_state = "jelly_choc" - bonus_reagents = list(/datum/reagent/consumable/hot_cocoa = 3, /datum/reagent/consumable/sprinkles = 1, /datum/reagent/consumable/nutriment/vitamin = 1) //the cocoa reagent is just bitter. + bonus_reagents = list(/datum/reagent/consumable/cocoa/hot_cocoa = 3, /datum/reagent/consumable/sprinkles = 1, /datum/reagent/consumable/nutriment/vitamin = 1) //the cocoa reagent is just bitter. tastes = list("jelly" = 1, "donut" = 4, "bitterness" = 1) decorated_icon = "jelly_choc_sprinkles" filling_color = "#4F230D" @@ -601,7 +601,7 @@ /obj/item/reagent_containers/food/snacks/hotdog name = "hotdog" - desc = "Fresh footlong ready to go down on." + desc = "Hot and steamy hotdog weenie." icon_state = "hotdog" bitesize = 3 bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3) @@ -782,22 +782,22 @@ to_chat(user, "You add the [I] to the [name].") P.name = initial(P.name) contents += P - update_overlays(P) + update_customizable_overlays(P) if (P.contents.len) for(var/V in P.contents) P = V P.name = initial(P.name) contents += P - update_overlays(P) + update_customizable_overlays(P) P = I - clearlist(P.contents) + P.contents.Cut() return else if(contents.len) var/obj/O = contents[contents.len] return O.attackby(I, user, params) ..() -/obj/item/reagent_containers/food/snacks/pancakes/update_overlays(obj/item/reagent_containers/food/snacks/P) +/obj/item/reagent_containers/food/snacks/pancakes/update_customizable_overlays(obj/item/reagent_containers/food/snacks/P) var/mutable_appearance/pancake = mutable_appearance(icon, "[P.item_state]_[rand(1,3)]") pancake.pixel_x = rand(-1,1) pancake.pixel_y = 3 * contents.len - 1 diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index c5e0b7651dcf2..76f2db7e638d8 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -52,7 +52,7 @@ H.Paralyze(20) //splat! H.adjust_blurriness(1) H.visible_message("[H] is creamed by [src]!", "You've been creamed by [src]!") - playsound(H, "desceration", 50, TRUE) + playsound(H, "desecration", 50, TRUE) if(!H.creamed) // one layer at a time H.add_overlay(creamoverlay) H.creamed = TRUE diff --git a/code/modules/food_and_drinks/food/snacks_pizza.dm b/code/modules/food_and_drinks/food/snacks_pizza.dm index cb2ea093ca3d3..91cb43b0006e3 100644 --- a/code/modules/food_and_drinks/food/snacks_pizza.dm +++ b/code/modules/food_and_drinks/food/snacks_pizza.dm @@ -177,7 +177,7 @@ l_arm.dismember() else r_arm.dismember() - playsound(user,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, TRUE, -1) + playsound(user,pick('sound/misc/desecration-01.ogg','sound/misc/desecration-02.ogg','sound/misc/desecration-01.ogg') ,50, TRUE, -1) /obj/item/reagent_containers/food/snacks/proc/i_kill_you(obj/item/I, mob/user) if(istype(I, /obj/item/reagent_containers/food/snacks/pineappleslice)) 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 727b17d8e783d..28b69a5a85266 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -20,6 +20,9 @@ God bless America. - */ +#define DEEPFRYER_COOKTIME 60 +#define DEEPFRYER_BURNTIME 120 + /obj/machinery/deepfryer name = "deep fryer" desc = "Deep fried everything." @@ -31,7 +34,7 @@ God bless America. layer = BELOW_OBJ_LAYER var/obj/item/reagent_containers/food/snacks/deepfryholder/frying //What's being fried RIGHT NOW? var/cook_time = 0 - var/oil_use = 0.05 //How much cooking oil is used per tick + var/oil_use = 0.025 //How much cooking oil is used per second var/fry_speed = 1 //How quickly we fry food var/frying_fried //If the object has been fried; used for messages var/frying_burnt //If the object has been burnt @@ -42,6 +45,7 @@ God bless America. /obj/item/wirecutters, /obj/item/multitool, /obj/item/weldingtool, + /obj/item/powertool, /obj/item/reagent_containers/glass, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/food/condiment, @@ -60,11 +64,15 @@ God bless America. RefreshParts() fry_loop = new(list(src), FALSE) +/obj/machinery/deepfryer/Destroy() + QDEL_NULL(fry_loop) + return ..() + /obj/machinery/deepfryer/RefreshParts() var/oil_efficiency for(var/obj/item/stock_parts/micro_laser/M in component_parts) oil_efficiency += M.rating - oil_use = initial(oil_use) - (oil_efficiency * 0.0095) + oil_use = initial(oil_use) - (oil_efficiency * 0.00475) fry_speed = oil_efficiency /obj/machinery/deepfryer/examine(mob/user) @@ -72,7 +80,7 @@ God bless America. if(frying) . += "You can make out \a [frying] in the oil." if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Frying at [fry_speed*100]% speed.
Using [oil_use*10] units of oil per second." + . += "The status display reads: Frying at [fry_speed*100]% speed.
Using [oil_use] units of oil per second.
" /obj/machinery/deepfryer/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/reagent_containers/pill)) @@ -110,20 +118,20 @@ God bless America. icon_state = "fryer_on" fry_loop.start() -/obj/machinery/deepfryer/process() +/obj/machinery/deepfryer/process(delta_time) ..() var/datum/reagent/consumable/cooking_oil/C = reagents.has_reagent(/datum/reagent/consumable/cooking_oil) if(!C) return reagents.chem_temp = C.fry_temperature if(frying) - reagents.trans_to(frying, oil_use, multiplier = fry_speed * 3) //Fried foods gain more of the reagent thanks to space magic - cook_time += fry_speed - if(cook_time >= 30 && !frying_fried) + reagents.trans_to(frying, oil_use * delta_time, multiplier = fry_speed * 3) //Fried foods gain more of the reagent thanks to space magic + cook_time += fry_speed * delta_time + if(cook_time >= DEEPFRYER_COOKTIME && !frying_fried) frying_fried = TRUE //frying... frying... fried playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) audible_message("[src] dings!") - else if (cook_time >= 60 && !frying_burnt) + else if (cook_time >= DEEPFRYER_BURNTIME && !frying_burnt) frying_burnt = TRUE visible_message("[src] emits an acrid smell!") @@ -158,3 +166,6 @@ God bless America. C.Paralyze(60) user.changeNext_move(CLICK_CD_MELEE) return ..() + +#undef DEEPFRYER_COOKTIME +#undef DEEPFRYER_BURNTIME 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 893d40819bb9f..22a76ff6962c3 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm @@ -27,35 +27,6 @@ QDEL_NULL(mixer) return ..() -/obj/machinery/food_cart/ui_interact(mob/user) - . = ..() - var/dat - dat += "
STORED INGREDIENTS AND DRINKS
" - dat += "Remaining glasses: [glasses]
" - dat += "Portion: [portion]
" - for(var/datum/reagent/R in reagents.reagent_list) - dat += "[R.name]: [R.volume] " - dat += "Purge" - if (glasses > 0) - dat += "Pour in a glass" - dat += "Add to the mixer
" - dat += "

MIXER CONTENTS
" - for(var/datum/reagent/R in mixer.reagents.reagent_list) - dat += "[R.name]: [R.volume] " - dat += "Transfer back" - if (glasses > 0) - dat += "Pour in a glass" - dat += "
" - dat += "

STORED FOOD
" - for(var/V in stored_food) - if(stored_food[V] > 0) - dat += "[V]: [stored_food[V]] Dispense
" - dat += "

Refresh Close" - - var/datum/browser/popup = new(user, "foodcart","Food Cart", 500, 350, src) - popup.set_content(dat) - popup.open() - /obj/machinery/food_cart/proc/isFull() return food_stored >= STORAGE_CAPACITY @@ -104,12 +75,43 @@ . = ..() updateDialog() +/obj/machinery/food_cart/ui_interact(mob/user) + . = ..() + var/dat + dat += "
STORED INGREDIENTS AND DRINKS
" + dat += "Remaining glasses: [glasses]
" + dat += "Portion: [portion]
" + for(var/i in 1 to LAZYLEN(reagents.reagent_list)) + var/datum/reagent/R = reagents.reagent_list[i] + dat += "[R.name]: [R.volume] " + dat += "Purge" + if (glasses > 0) + dat += "Pour in a glass" + dat += "Add to the mixer
" + dat += "

MIXER CONTENTS
" + for(var/i in 1 to LAZYLEN(mixer.reagents.reagent_list)) + var/datum/reagent/R = mixer.reagents.reagent_list[i] + dat += "[R.name]: [R.volume] " + dat += "Transfer back" + if (glasses > 0) + dat += "Pour in a glass" + dat += "
" + dat += "

STORED FOOD
" + for(var/V in stored_food) + if(stored_food[V] > 0) + dat += "[V]: [stored_food[V]] Dispense
" + dat += "

Refresh Close" + + var/datum/browser/popup = new(user, "foodcart","Food Cart", 500, 350, src) + popup.set_content(dat) + popup.open() + /obj/machinery/food_cart/Topic(href, href_list) if(..()) return if(href_list["disposeI"]) - reagents.del_reagent(href_list["disposeI"]) + reagents.del_reagent(reagents.reagent_list[text2num(href_list["disposeI"])]?.type) if(href_list["dispense"]) if(stored_food[href_list["dispense"]]-- <= 0) @@ -130,16 +132,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, reagents.reagent_list[text2num(href_list["pour"])]?.type, portion) if(href_list["m_pour"]) - mixer.reagents.trans_id_to(DG, href_list["m_pour"], portion) + mixer.reagents.trans_id_to(DG, mixer.reagents.reagent_list[text2num(href_list["m_pour"])]?.type, portion) if(href_list["mix"]) - if(reagents.trans_id_to(mixer, href_list["mix"], portion) == 0) + if(!reagents.trans_id_to(mixer, reagents.reagent_list[text2num(href_list["mix"])]?.type, portion)) 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, mixer.reagents.reagent_list[text2num(href_list["transfer"])]?.type, portion)) to_chat(usr, "[src] is full!") updateDialog() @@ -154,6 +156,25 @@ new /obj/item/stack/sheet/iron(loc, 4) qdel(src) +/obj/machinery/food_cart/coffee + name = "coffee cart" + desc = "Ah! The bitter drink of the Gods." + icon_state = "icecream_vat" + glasses = 10 + portion = 20 + +/obj/machinery/food_cart/coffee/Initialize() + ..() + var/A = rand(0,3) + var/B = rand(0,3) + var/C = rand(0,3) + var/D = rand(0,1) + reagents.add_reagent(/datum/reagent/consumable/cafe_latte, A*20) + reagents.add_reagent(/datum/reagent/consumable/icecoffee, B*20) + reagents.add_reagent(/datum/reagent/consumable/soy_latte, C*20) + reagents.add_reagent(/datum/reagent/consumable/pumpkin_latte, D*20) + reagents.add_reagent(/datum/reagent/consumable/coffee, (10-A-B-C-D)*20) + #undef STORAGE_CAPACITY #undef LIQUID_CAPACIY #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 8756ab4fbfcf5..067169c2cbe8e 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -33,10 +33,10 @@ /obj/machinery/gibber/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Outputting [meat_produced] meat slab(s) after [gibtime*0.1] seconds of processing." + . += "The status display reads: Outputting [meat_produced] meat slab(s) after [gibtime*0.1] seconds of processing." for(var/obj/item/stock_parts/manipulator/M in component_parts) if(M.rating >= 2) - . += "Gibber has been upgraded to process inorganic materials." + . += "Gibber has been upgraded to process inorganic materials." /obj/machinery/gibber/update_icon() cut_overlays() diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill.dm b/code/modules/food_and_drinks/kitchen_machinery/grill.dm index e2ec15c1854c4..7d7ab765dc02c 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/grill.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/grill.dm @@ -1,5 +1,8 @@ //I JUST WANNA GRILL FOR GOD'S SAKE +#define GRILL_FUELUSAGE_IDLE 0.5 +#define GRILL_FUELUSAGE_ACTIVE 5 + /obj/machinery/grill name = "grill" desc = "Just like the old days." @@ -20,7 +23,7 @@ /obj/machinery/grill/update_icon() if(grilled_item) icon_state = "grill" - else if(grill_fuel) + else if(grill_fuel > 0) icon_state = "grill_on" else icon_state = "grill_open" @@ -62,21 +65,21 @@ return ..() -/obj/machinery/grill/process() +/obj/machinery/grill/process(delta_time) ..() update_icon() - if(!grill_fuel) + if(grill_fuel <= 0) return else - grill_fuel -= 1 - if(prob(1)) + grill_fuel -= GRILL_FUELUSAGE_IDLE * delta_time + if(DT_PROB(0.5, delta_time)) var/datum/effect_system/smoke_spread/bad/smoke = new smoke.set_up(1, loc) smoke.start() if(grilled_item) - grill_time += 1 - grilled_item.reagents.add_reagent(/datum/reagent/consumable/char, 1) - grill_fuel -= 10 + grill_time += delta_time + grilled_item.reagents.add_reagent(/datum/reagent/consumable/char, 0.5 * delta_time) + grill_fuel -= GRILL_FUELUSAGE_ACTIVE * delta_time grilled_item.AddComponent(/datum/component/sizzle) /obj/machinery/grill/Exited(atom/movable/AM) @@ -86,6 +89,7 @@ ..() /obj/machinery/grill/Destroy() + QDEL_NULL(grill_loop) grilled_item = null . = ..() @@ -118,19 +122,19 @@ return ..() /obj/machinery/grill/proc/finish_grill() - switch(grill_time) //no 0-9 to prevent spam - if(10 to 15) + switch(grill_time) //no 0-20 to prevent spam + if(20 to 30) grilled_item.name = "lightly-grilled [grilled_item.name]" grilled_item.desc = "[grilled_item.desc] It's been lightly grilled." - if(16 to 39) + if(30 to 80) grilled_item.name = "grilled [grilled_item.name]" grilled_item.desc = "[grilled_item.desc] It's been grilled." grilled_item.foodtype |= FRIED - if(40 to 50) + if(80 to 100) grilled_item.name = "heavily grilled [grilled_item.name]" grilled_item.desc = "[grilled_item.desc] It's been heavily grilled." grilled_item.foodtype |= FRIED - if(51 to INFINITY) //grill marks reach max alpha + if(100 to INFINITY) //grill marks reach max alpha grilled_item.name = "Powerfully Grilled [grilled_item.name]" grilled_item.desc = "A [grilled_item.name]. Reminds you of your wife, wait, no, it's prettier!" grilled_item.foodtype |= FRIED @@ -139,3 +143,6 @@ /obj/machinery/grill/unwrenched anchored = FALSE + +#undef GRILL_FUELUSAGE_IDLE +#undef GRILL_FUELUSAGE_ACTIVE diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index 4125b21494c06..4729824db5d13 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -40,6 +40,7 @@ /obj/machinery/microwave/Destroy() eject() + QDEL_NULL(soundloop) if(wires) QDEL_NULL(wires) . = ..() @@ -83,9 +84,9 @@ . += "\The [src] is empty." if(!(stat & (NOPOWER|BROKEN))) - . += {"The status display reads:\n - - Capacity: [max_n_of_items] items.\n - - Cook time reduced by [(efficiency - 1) * 25]%."} + . += "The status display reads:\n"+\ + "- Capacity: [max_n_of_items] items.\n"+\ + "- Cook time reduced by [(efficiency - 1) * 25]%." /obj/machinery/microwave/update_icon() if(broken) @@ -146,10 +147,13 @@ to_chat(user, "You need more space cleaner!") return TRUE - if(istype(O, /obj/item/soap)) - var/obj/item/soap/P = O + if(istype(O, /obj/item/soap) || istype(O, /obj/item/reagent_containers/glass/rag)) + var/cleanspeed = 50 + if(istype(O, /obj/item/soap)) + var/obj/item/soap/used_soap = O + cleanspeed = used_soap.cleanspeed user.visible_message("[user] starts to clean \the [src].", "You start to clean \the [src]...") - if(do_after(user, P.cleanspeed, target = src)) + if(do_after(user, cleanspeed, target = src)) user.visible_message("[user] has cleaned \the [src].", "You clean \the [src].") dirty = 0 update_icon() @@ -252,8 +256,8 @@ break start() -/obj/machinery/microwave/proc/turn_on() - visible_message("\The [src] turns on.", "You hear a microwave humming.") +/obj/machinery/microwave/proc/wzhzhzh() + visible_message("\The [src] turns on.", null, "You hear a microwave humming.") operating = TRUE set_light(1.5) @@ -271,15 +275,15 @@ #define MICROWAVE_PRE 2 /obj/machinery/microwave/proc/start() - turn_on() + wzhzhzh() loop(MICROWAVE_NORMAL, 10) /obj/machinery/microwave/proc/start_can_fail() - turn_on() + wzhzhzh() loop(MICROWAVE_PRE, 4) /obj/machinery/microwave/proc/muck() - turn_on() + wzhzhzh() playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) dirty_anim_playing = TRUE update_icon() diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm index 5722601ad5522..bf8ae8047e56b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm @@ -37,7 +37,7 @@ GLOBAL_LIST_EMPTY(monkey_recyclers) /obj/machinery/monkey_recycler/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Producing [cube_production] cubes for every monkey inserted." + . += "The status display reads: Producing [cube_production] cubes for every monkey inserted." /obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params) if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index e31b9e6eddc4c..479416615af80 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -14,6 +14,7 @@ var/processing = FALSE var/rating_speed = 1 var/rating_amount = 1 + processing_flags = NONE /obj/machinery/processor/RefreshParts() for(var/obj/item/stock_parts/matter_bin/B in component_parts) @@ -24,7 +25,7 @@ /obj/machinery/processor/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Outputting [rating_amount] item(s) at [rating_speed*100]% speed." + . += "The status display reads: Outputting [rating_amount] item(s) at [rating_speed*100]% speed." /obj/machinery/processor/proc/process_food(datum/food_processor_process/recipe, atom/movable/what) if (recipe.output && loc && !QDELETED(src)) @@ -153,11 +154,13 @@ /obj/machinery/processor/slime name = "slime processor" desc = "An industrial grinder with a sticker saying appropriated for science department. Keep hands clear of intake area while operating." + var/sbacklogged = FALSE /obj/machinery/processor/slime/Initialize() . = ..() var/obj/item/circuitboard/machine/B = new /obj/item/circuitboard/machine/processor/slime(null) B.apply_default_parts(src) + proximity_monitor = new(src, 1) /obj/machinery/processor/slime/adjust_item_drop_location(atom/movable/AM) var/static/list/slimecores = subtypesof(/obj/item/slime_extract) @@ -173,36 +176,31 @@ AM.pixel_y = -8 + (round(ii/3)*8) return i -/obj/machinery/processor/slime/process() - if(processing) - return - var/mob/living/simple_animal/slime/picked_slime - for(var/mob/living/simple_animal/slime/slime in range(1,src)) - if(slime.loc == src) - continue - if(istype(slime, /mob/living/simple_animal/slime)) - if(slime.stat) - picked_slime = slime - break - if(!picked_slime) - return - var/datum/food_processor_process/P = select_recipe(picked_slime) - if (!P) - return - - visible_message("[picked_slime] is sucked into [src].") - picked_slime.forceMove(src) +/obj/machinery/processor/slime/interact(mob/user) + . = ..() + if(sbacklogged) + for(var/mob/living/simple_animal/slime/AM in ohearers(1,src)) //fallback in case slimes got placed while processor was active triggers only after processing!!!! + if(AM.stat == DEAD) + visible_message("[AM] is sucked into [src].") + AM.forceMove(src) + sbacklogged = FALSE + +/obj/machinery/processor/slime/HasProximity(mob/AM) + if(!sbacklogged && istype(AM, /mob/living/simple_animal/slime) && AM.stat == DEAD) + if(processing) + sbacklogged = TRUE + else + visible_message("[AM] is sucked into [src].") + AM.forceMove(src) /obj/machinery/processor/slime/process_food(datum/food_processor_process/recipe, atom/movable/what) var/mob/living/simple_animal/slime/S = what if (istype(S)) var/C = S.cores - if(S.stat != DEAD) - S.forceMove(drop_location()) - S.visible_message("[C] crawls free of the processor!") - return for(var/i in 1 to (C+rating_amount-1)) - var/atom/movable/item = new S.coretype(drop_location()) + var/obj/item/slime_extract/item = new S.coretype(drop_location()) + if(S.transformeffects & SLIME_EFFECT_GOLD) + item.sparkly = TRUE adjust_item_drop_location(item) SSblackbox.record_feedback("tally", "slime_core_harvested", 1, S.colour) ..() diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index c6608e416b60b..ad8f98caea03e 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -39,7 +39,7 @@ /obj/machinery/smartfridge/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: This unit can hold a maximum of [max_n_of_items] items." + . += "The status display reads: This unit can hold a maximum of [max_n_of_items] items." /obj/machinery/smartfridge/power_change() ..() @@ -73,7 +73,7 @@ cut_overlays() if(panel_open) add_overlay("[initial(icon_state)]-panel") - updateUsrDialog() + ui_update() return if(default_pry_open(O)) @@ -84,7 +84,6 @@ return if(default_deconstruction_crowbar(O)) - updateUsrDialog() return if(!stat) @@ -96,7 +95,6 @@ if(accept_check(O)) load(O) user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].") - updateUsrDialog() if (visible_contents) update_icon() return TRUE @@ -110,7 +108,6 @@ if(accept_check(G)) load(G) loaded++ - updateUsrDialog() if(loaded) if(contents.len >= max_n_of_items) @@ -128,21 +125,40 @@ to_chat(user, "There is nothing in [O] to put in [src]!") return FALSE + if(istype(O, /obj/item/organ_storage)) + var/obj/item/organ_storage/S = O + if(S.contents.len) + var/obj/item/I = S.contents[1] + if(accept_check(I)) + load(I) + user.visible_message("[user] inserts \the [I] into \the [src].", \ + "You insert \the [I] into \the [src].") + O.cut_overlays() + O.icon_state = "evidenceobj" + O.desc = "A container for holding body parts." + if(visible_contents) + update_icon() + return TRUE + else + to_chat(user, "[src] does not accept [I]!") + return FALSE + else + to_chat(user, "There is nothing in [O] to put into [src]!") + return FALSE + if(user.a_intent != INTENT_HARM) to_chat(user, "\The [src] smartly refuses [O].") - updateUsrDialog() return FALSE else return ..() -/obj/machinery/smartfridge/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) +/obj/machinery/smartfridge/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(!stat) - if (istype(AM, /obj/item)) + if (istype(AM, /obj/item)) var/obj/item/O = AM if(contents.len < max_n_of_items && accept_check(O)) load(O) - updateUsrDialog() if (visible_contents) update_icon() return TRUE @@ -161,13 +177,16 @@ to_chat(usr, "\the [O] is stuck to your hand, you cannot put it in \the [src]!") return FALSE else - return TRUE + . = TRUE else if(SEND_SIGNAL(O.loc, COMSIG_CONTAINS_STORAGE)) - return SEND_SIGNAL(O.loc, COMSIG_TRY_STORAGE_TAKE, O, src) + . = SEND_SIGNAL(O.loc, COMSIG_TRY_STORAGE_TAKE, O, src) else O.forceMove(src) - return TRUE + . = TRUE + + if(.) + ui_update() ///Really simple proc, just moves the object "O" into the hands of mob "M" if able, done so I could modify the proc a little for the organ fridge /obj/machinery/smartfridge/proc/dispense(obj/item/O, var/mob/M) @@ -226,28 +245,21 @@ else desired = input("How many items?", "How many items would you like to take out?", 1) as null|num - if(QDELETED(src) || QDELETED(usr) || !usr.Adjacent(src)) // Sanity checkin' in case stupid stuff happens while we wait for input() - return FALSE + if(!isnum_safe(desired) || desired <= 0) + return - if(desired == 1 && Adjacent(usr) && !issilicon(usr)) - for(var/obj/item/O in src) - if(O.name == params["name"]) - dispense(O, usr) - break - if (visible_contents) - update_icon() - return TRUE + if(QDELETED(src) || QDELETED(usr) || !usr.Adjacent(src)) // Sanity checkin' in case stupid stuff happens while we wait for input() + return for(var/obj/item/O in src) - if(desired <= 0) - break if(O.name == params["name"]) dispense(O, usr) desired-- - if (visible_contents) + . = TRUE + if(desired <= 0) + break + if (visible_contents && .) update_icon() - return TRUE - return FALSE // ---------------------------- @@ -341,7 +353,11 @@ S.forceMove(drop_location()) else var/dried = S.dried_type - new dried(drop_location()) + dried = new dried(drop_location()) + if(istype(dried, /obj/item/reagent_containers)) // If the product is a reagent container, transfer reagents + var/obj/item/reagent_containers/R = dried + R.reagents.clear_reagents() + S.reagents.copy_to(R) qdel(S) return TRUE for(var/obj/item/stack/sheet/wetleather/WL in src) @@ -422,14 +438,14 @@ /obj/machinery/smartfridge/organ/RefreshParts() for(var/obj/item/stock_parts/matter_bin/B in component_parts) max_n_of_items = 20 * B.rating - repair_rate = max(0, STANDARD_ORGAN_HEALING * (B.rating - 1)) + repair_rate = max(0, STANDARD_ORGAN_HEALING * (B.rating - 1) * 0.5) -/obj/machinery/smartfridge/organ/process() +/obj/machinery/smartfridge/organ/process(delta_time) for(var/organ in contents) var/obj/item/organ/O = organ if(!istype(O)) return - O.applyOrganDamage(-repair_rate) + O.applyOrganDamage(-repair_rate * delta_time) /obj/machinery/smartfridge/organ/Exited(obj/item/organ/AM, atom/newLoc) . = ..() diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index ceb58da11375b..0ee7479a0bba5 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -25,11 +25,11 @@ var/obj/item/bombcore/miniature/pizza/bomb var/bomb_active = FALSE // If the bomb is counting down. var/bomb_defused = TRUE // If the bomb is inert. - var/bomb_timer = 1 // How long before blowing the bomb. - /// Min bomb timer allowed + var/bomb_timer = 1 // How long before blowing the bomb, in seconds. + /// Min bomb timer allowed in seconds var/bomb_timer_min = 1 - /// Max bomb timer allower - var/bomb_timer_max = 10 + /// Max bomb timer allower in seconds + var/bomb_timer_max = 20 /obj/item/pizzabox/Initialize() . = ..() @@ -105,6 +105,7 @@ if(open && !bomb_defused) audible_message("[icon2html(src, hearers(src))] *beep*") bomb_active = TRUE + wires.ui_update() START_PROCESSING(SSobj, src) update_icon() @@ -131,10 +132,11 @@ if (isnull(bomb_timer)) return - bomb_timer = clamp(CEILING(bomb_timer / 2, 1), bomb_timer_min, bomb_timer_max) + bomb_timer = clamp(CEILING(bomb_timer, 1), bomb_timer_min, bomb_timer_max) bomb_defused = FALSE + wires.ui_update() - log_bomber(user, "has trapped a", src, "with [bomb] set to [bomb_timer * 2] seconds") + log_bomber(user, "has trapped a", src, "with [bomb] set to [bomb_timer] seconds") bomb.adminlog = "The [bomb.name] in [src.name] that [key_name(user)] activated has detonated!" to_chat(user, "You trap [src] with [bomb].") @@ -213,10 +215,10 @@ to_chat(user, "That's not a pizza!") ..() -/obj/item/pizzabox/process() +/obj/item/pizzabox/process(delta_time) if(bomb_active && !bomb_defused && (bomb_timer > 0)) - playsound(loc, 'sound/items/timer.ogg', 50, 0) - bomb_timer-- + playsound(loc, 'sound/items/timer.ogg', 50, FALSE) + bomb_timer -= delta_time if(bomb_active && !bomb_defused && (bomb_timer <= 0)) if(bomb in src) bomb.detonate() @@ -226,6 +228,7 @@ if(bomb_defused && (bomb in src)) bomb.defuse() bomb_active = FALSE + wires.ui_update() unprocess() return diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 09d3225e4e708..cc36bad640428 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -606,7 +606,7 @@ id = /datum/reagent/consumable/ethanol/quintuple_sec results = list(/datum/reagent/consumable/ethanol/quintuple_sec = 15) required_reagents = list(/datum/reagent/consumable/ethanol/quadruple_sec = 5, /datum/reagent/consumable/clownstears = 5, /datum/reagent/consumable/ethanol/syndicatebomb = 5) - mix_message = "Judgement is upon you." + mix_message = "Judgment is upon you." mix_sound = 'sound/items/airhorn2.ogg' /datum/chemical_reaction/bastion_bourbon @@ -656,7 +656,7 @@ name = "Peppermint Patty" id = /datum/reagent/consumable/ethanol/peppermint_patty results = list(/datum/reagent/consumable/ethanol/peppermint_patty = 10) - required_reagents = list(/datum/reagent/consumable/hot_cocoa = 6, /datum/reagent/consumable/ethanol/creme_de_cacao = 1, /datum/reagent/consumable/ethanol/creme_de_menthe = 1, /datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/menthol = 1) + required_reagents = list(/datum/reagent/consumable/cocoa/hot_cocoa = 6, /datum/reagent/consumable/ethanol/creme_de_cacao = 1, /datum/reagent/consumable/ethanol/creme_de_menthe = 1, /datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/menthol = 1) mix_message = "The cocoa turns mint green just as the strong scent hits your nose." /datum/chemical_reaction/alexander @@ -840,3 +840,9 @@ id = /datum/reagent/consumable/ethanol/beesknees results = list(/datum/reagent/consumable/ethanol/beesknees = 4) required_reagents = list(/datum/reagent/consumable/ethanol/mead = 1, /datum/reagent/consumable/honey = 1, /datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/lemonjuice = 1) + +/datum/chemical_reaction/beeffizz + name = "Beef Fizz" + id = /datum/reagent/consumable/ethanol/beeffizz + results = list(/datum/reagent/consumable/ethanol/beeffizz = 10) + required_reagents = list(/datum/reagent/consumable/beefbroth = 7, /datum/reagent/consumable/ice = 2, /datum/reagent/consumable/lemonjuice = 1 ) diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index 5503ecc0b25a0..3a126cf8bee5a 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -47,8 +47,8 @@ /datum/chemical_reaction/hot_cocoa name = "Hot Cocoa" - id = /datum/reagent/consumable/hot_cocoa - results = list(/datum/reagent/consumable/hot_cocoa = 5) + id = /datum/reagent/consumable/cocoa/hot_cocoa + results = list(/datum/reagent/consumable/cocoa/hot_cocoa = 5) required_reagents = list(/datum/reagent/water = 5, /datum/reagent/consumable/cocoa = 1) /datum/chemical_reaction/coffee diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm index eab3cc0707da3..8a53b95cb8690 100644 --- a/code/modules/food_and_drinks/recipes/processor_recipes.dm +++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm @@ -51,4 +51,8 @@ /datum/food_processor_process/mob/slime input = /mob/living/simple_animal/slime output = null - required_machine = /obj/machinery/processor/slime \ No newline at end of file + required_machine = /obj/machinery/processor/slime + +/datum/food_processor_process/fish + input = /obj/item/fish + output = /obj/item/reagent_containers/food/snacks/carpmeat/icantbeliveitsnotcarp \ No newline at end of file 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 6d08137d49342..6c315a2747a76 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm @@ -115,3 +115,13 @@ ) result = /mob/living/simple_animal/pet/cat/breadcat subcategory = CAT_BREAD + +/datum/crafting_recipe/food/hotdog + name = "Hot dog" + reqs = list( + /datum/reagent/consumable/ketchup = 5, + /obj/item/reagent_containers/food/snacks/bun = 1, + /obj/item/reagent_containers/food/snacks/sausage = 1 + ) + result = /obj/item/reagent_containers/food/snacks/hotdog + subcategory = CAT_BREAD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm index 0bb2b970ca2a3..a35a6025988fb 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm @@ -368,3 +368,17 @@ ) result = /obj/item/reagent_containers/food/snacks/burger/chicken subcategory = CAT_BURGER + +/datum/crafting_recipe/food/crazyhamburger + name = "Crazy Hamburger" + reqs = list( + /obj/item/reagent_containers/food/snacks/meat/steak/plain = 1, // we have no horse meat sadly + /obj/item/reagent_containers/food/snacks/grown/chili = 2, + /datum/reagent/consumable/cooking_oil = 20, + /obj/item/reagent_containers/food/snacks/grown/nettle/death = 2, // closest thing to "grass of death" + /obj/item/reagent_containers/food/snacks/cheesewedge = 4, + /obj/item/reagent_containers/food/snacks/bun = 1 + ) + result = /obj/item/reagent_containers/food/snacks/burger/crazy + subcategory = CAT_BURGER + diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm index 1cb57f78f748d..e2b13d4b0f2bc 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm @@ -114,3 +114,12 @@ time = 10 reqs = list(/obj/item/stack/sheet/cardboard = 1) category = CAT_DRINK + +/datum/crafting_recipe/honeycomb + name = "Honeycomb" + result = /obj/item/reagent_containers/food/drinks/honeycomb + always_available = FALSE + time = 30 + reqs = list(/datum/reagent/consumable/sugar = 50) + category = CAT_DRINK + 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 40f24280943cf..0f248e3afcc03 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -23,7 +23,7 @@ ) result = /obj/item/reagent_containers/food/snacks/donut/chaos -datum/crafting_recipe/food/donut/meat +/datum/crafting_recipe/food/donut/meat time = 15 name = "Meat donut" reqs = list( @@ -444,16 +444,6 @@ datum/crafting_recipe/food/donut/meat ////////////////////////////////////////////OTHER//////////////////////////////////////////// -/datum/crafting_recipe/food/hotdog - name = "Hot dog" - reqs = list( - /datum/reagent/consumable/ketchup = 5, - /obj/item/reagent_containers/food/snacks/bun = 1, - /obj/item/reagent_containers/food/snacks/sausage = 1 - ) - result = /obj/item/reagent_containers/food/snacks/hotdog - subcategory = CAT_PASTRY - /datum/crafting_recipe/food/meatbun name = "Meat bun" reqs = list( 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 0cc5f67f94b31..41a3756673803 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm @@ -140,7 +140,7 @@ /datum/reagent/water = 10, /obj/item/reagent_containers/glass/bowl = 1, /obj/item/reagent_containers/food/snacks/grown/banana = 1, - /obj/item/stack/ore/bananium = 1 + /obj/item/stack/sheet/mineral/bananium = 1 ) result = /obj/item/reagent_containers/food/snacks/soup/clownstears subcategory = CAT_SOUP @@ -269,4 +269,4 @@ /obj/item/reagent_containers/food/snacks/grown/mushroom/jupitercup = 1 ) result = /obj/item/reagent_containers/food/snacks/soup/electron - subcategory = CAT_SOUP \ No newline at end of file + subcategory = CAT_SOUP diff --git a/code/modules/guardian/abilities/major/assassin.dm b/code/modules/guardian/abilities/major/assassin.dm index 3569ba88e59ad..27994c798344b 100644 --- a/code/modules/guardian/abilities/major/assassin.dm +++ b/code/modules/guardian/abilities/major/assassin.dm @@ -10,8 +10,8 @@ arrow_weight = 0.9 var/next_stealth = 0 var/stealthcooldown = 0 - var/obj/screen/alert/canstealthalert - var/obj/screen/alert/instealthalert + var/atom/movable/screen/alert/canstealthalert + var/atom/movable/screen/alert/instealthalert /datum/guardian_ability/major/assassin/Apply() @@ -68,12 +68,12 @@ if(next_stealth <= world.time) if(mode) if(!instealthalert) - instealthalert = guardian.throw_alert("instealth", /obj/screen/alert/instealth) + instealthalert = guardian.throw_alert("instealth", /atom/movable/screen/alert/instealth) guardian.clear_alert("canstealth") canstealthalert = null else if(!canstealthalert) - canstealthalert = guardian.throw_alert("canstealth", /obj/screen/alert/canstealth) + canstealthalert = guardian.throw_alert("canstealth", /atom/movable/screen/alert/canstealth) guardian.clear_alert("instealth") instealthalert = null else diff --git a/code/modules/guardian/abilities/major/explosive.dm b/code/modules/guardian/abilities/major/explosive.dm index 4bc3d7963c83f..b015db7dad833 100644 --- a/code/modules/guardian/abilities/major/explosive.dm +++ b/code/modules/guardian/abilities/major/explosive.dm @@ -14,11 +14,11 @@ /datum/guardian_ability/major/explosive/Apply() . = ..() - guardian.verbs += /mob/living/simple_animal/hostile/guardian/proc/DetonateBomb + guardian.add_verb(/mob/living/simple_animal/hostile/guardian/proc/DetonateBomb) /datum/guardian_ability/major/explosive/Remove() . = ..() - guardian.verbs -= /mob/living/simple_animal/hostile/guardian/proc/DetonateBomb + guardian.remove_verb(/mob/living/simple_animal/hostile/guardian/proc/DetonateBomb) /datum/guardian_ability/major/explosive/Attack(atom/target) if(prob(40) && isliving(target)) @@ -26,7 +26,7 @@ if(!M.anchored && M != guardian.summoner?.current && !guardian.hasmatchingsummoner(M)) new /obj/effect/temp_visual/guardian/phase/out(get_turf(M)) do_teleport(M, M, 10, channel = TELEPORT_CHANNEL_BLUESPACE) - for(var/mob/living/L in range(1, M)) + for(var/mob/living/L in hearers(1, M)) if(guardian.hasmatchingsummoner(L)) //if the summoner matches don't hurt them continue if(L != guardian && L != guardian.summoner?.current) @@ -51,6 +51,8 @@ to_chat(guardian, "Your powers are on cooldown! You must wait 20 seconds between bombs.") /datum/guardian_ability/major/explosive/proc/kaboom(atom/source, mob/living/explodee) + SIGNAL_HANDLER + if(!istype(explodee)) return if(explodee == guardian || explodee == guardian.summoner?.current || guardian.hasmatchingsummoner(explodee)) @@ -70,6 +72,8 @@ UNREGISTER_BOMB_SIGNALS(A) /datum/guardian_ability/major/explosive/proc/display_examine(datum/source, mob/user, text) + SIGNAL_HANDLER + text += "It glows with a strange light!" diff --git a/code/modules/guardian/abilities/major/frenzy.dm b/code/modules/guardian/abilities/major/frenzy.dm index 51ee4d68383b0..800b1dd9d93e5 100644 --- a/code/modules/guardian/abilities/major/frenzy.dm +++ b/code/modules/guardian/abilities/major/frenzy.dm @@ -41,7 +41,7 @@ next_rush = world.time + ((0.2 SECONDS * (5 - master_stats.potential)) + 2) //2 to 3 seconds /datum/guardian_ability/major/frenzy/Stat() - . = ..() - if(statpanel("Status")) - if(next_rush > world.time) - stat(null, "Frenzy Charge Cooldown Remaining: [DisplayTimeText(next_rush - world.time)]") + var/list/tab_data = list() + if(next_rush > world.time) + tab_data["Frenzy Charge Cooldown Remaining"] = GENERATE_STAT_TEXT("[DisplayTimeText(next_rush - world.time)]") + return tab_data diff --git a/code/modules/guardian/abilities/major/gravity.dm b/code/modules/guardian/abilities/major/gravity.dm index 16ec3978eb53c..8f57370c4fc54 100644 --- a/code/modules/guardian/abilities/major/gravity.dm +++ b/code/modules/guardian/abilities/major/gravity.dm @@ -23,6 +23,8 @@ remove_gravity(C) /datum/guardian_ability/major/gravity/proc/recheck_distances() + SIGNAL_HANDLER + for(var/datum/component/C in gravito_targets) if(get_dist(src, C.parent) > (master_stats.potential * 2)) remove_gravity(C) @@ -49,5 +51,7 @@ qdel(C) /datum/guardian_ability/major/gravity/proc/__distance_check(atom/movable/AM, OldLoc, Dir, Forced) + SIGNAL_HANDLER + if(get_dist(src, AM) > (master_stats.potential * 2)) remove_gravity(AM.GetComponent(/datum/component/forced_gravity)) diff --git a/code/modules/guardian/abilities/major/hand.dm b/code/modules/guardian/abilities/major/hand.dm index 1c107cf22d6dc..2173d6408a763 100644 --- a/code/modules/guardian/abilities/major/hand.dm +++ b/code/modules/guardian/abilities/major/hand.dm @@ -14,12 +14,12 @@ for(var/atom/movable/AM in get_turf(target)) if(AM.anchored) continue - AM.forceMove(hand_turf) + do_teleport(AM, hand_turf, no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC) guardian.face_atom(hand_turf) return ..() /datum/guardian_ability/major/hand/Stat() - . = ..() - if(statpanel("Status")) - if(next_hand > world.time) - stat(null, "THE HAND Cooldown Remaining: [DisplayTimeText(next_hand - world.time)]") + var/list/tab_data = list() + if(next_hand > world.time) + tab_data["THE HAND Cooldown Remaining"] = GENERATE_STAT_TEXT("[DisplayTimeText(next_hand - world.time)]") + return tab_data diff --git a/code/modules/guardian/abilities/major/predator.dm b/code/modules/guardian/abilities/major/predator.dm index f6f4e58fff6b2..f2e2ca14d7121 100644 --- a/code/modules/guardian/abilities/major/predator.dm +++ b/code/modules/guardian/abilities/major/predator.dm @@ -83,7 +83,7 @@ status.scan_target = prey status.point_to_target() -/obj/screen/alert/status_effect/agent_pinpointer/predator +/atom/movable/screen/alert/status_effect/agent_pinpointer/predator name = "Predator's All-Seeing Eyes" /datum/status_effect/agent_pinpointer/predator @@ -91,7 +91,7 @@ minimum_range = 1 range_fuzz_factor = 0 tick_interval = 10 - alert_type = /obj/screen/alert/status_effect/agent_pinpointer/predator + alert_type = /atom/movable/screen/alert/status_effect/agent_pinpointer/predator /datum/status_effect/agent_pinpointer/predator/scan_for_target() return diff --git a/code/modules/guardian/abilities/major/scout.dm b/code/modules/guardian/abilities/major/scout.dm index 714accc693d88..bba045dc3b4ed 100644 --- a/code/modules/guardian/abilities/major/scout.dm +++ b/code/modules/guardian/abilities/major/scout.dm @@ -17,6 +17,7 @@ guardian.alpha = 45 guardian.range = 255 guardian.do_the_cool_invisible_thing = FALSE + guardian.can_use_abilities = FALSE else guardian.ranged = initial(guardian.ranged) guardian.melee_damage = initial(guardian.melee_damage) @@ -26,6 +27,7 @@ guardian.range = initial(guardian.range) guardian.do_the_cool_invisible_thing = initial(guardian.do_the_cool_invisible_thing) guardian.stats.Apply(guardian) + guardian.can_use_abilities = initial(guardian.can_use_abilities) /datum/guardian_ability/major/scout/Manifest() if(mode) diff --git a/code/modules/guardian/abilities/minor/snares.dm b/code/modules/guardian/abilities/minor/snares.dm index 2b616ecd24ac0..0b1a1e3344293 100644 --- a/code/modules/guardian/abilities/minor/snares.dm +++ b/code/modules/guardian/abilities/minor/snares.dm @@ -5,17 +5,20 @@ cost = 1 /datum/guardian_ability/minor/snare/Apply() - guardian.verbs += /mob/living/simple_animal/hostile/guardian/proc/Snare - guardian.verbs += /mob/living/simple_animal/hostile/guardian/proc/DisarmSnare + guardian.add_verb(/mob/living/simple_animal/hostile/guardian/proc/Snare) + guardian.add_verb(/mob/living/simple_animal/hostile/guardian/proc/DisarmSnare) /datum/guardian_ability/minor/snare/Remove() - guardian.verbs -= /mob/living/simple_animal/hostile/guardian/proc/Snare - guardian.verbs -= /mob/living/simple_animal/hostile/guardian/proc/DisarmSnare + guardian.remove_verb(/mob/living/simple_animal/hostile/guardian/proc/Snare) + guardian.remove_verb(/mob/living/simple_animal/hostile/guardian/proc/DisarmSnare) /mob/living/simple_animal/hostile/guardian/proc/Snare() set name = "Set Surveillance Snare" set category = "Guardian" set desc = "Set an invisible snare that will alert you when living creatures walk over it. Max of 5" + if(!can_use_abilities) + to_chat(src, "You can't do that right now!") + return if(snares.len <6) var/turf/snare_loc = get_turf(src.loc) var/obj/effect/snare/S = new /obj/effect/snare(snare_loc) diff --git a/code/modules/guardian/abilities/minor/teleport.dm b/code/modules/guardian/abilities/minor/teleport.dm index d155ed50f00f0..d6b9bcc5fb996 100644 --- a/code/modules/guardian/abilities/minor/teleport.dm +++ b/code/modules/guardian/abilities/minor/teleport.dm @@ -7,15 +7,15 @@ /datum/guardian_ability/minor/teleport/Apply() ..() - guardian.verbs += /mob/living/simple_animal/hostile/guardian/proc/Beacon + guardian.add_verb(/mob/living/simple_animal/hostile/guardian/proc/Beacon) /datum/guardian_ability/minor/teleport/Remove() ..() - guardian.verbs -= /mob/living/simple_animal/hostile/guardian/proc/Beacon + guardian.remove_verb(/mob/living/simple_animal/hostile/guardian/proc/Beacon) /obj/effect/proc_holder/spell/targeted/guardian/teleport name = "Teleport" - desc = "Teleport someone to your recieving pad." + desc = "Teleport someone to your receiving pad." /obj/effect/proc_holder/spell/targeted/guardian/teleport/InterceptClickOn(mob/living/caller, params, atom/movable/A) if(!istype(A)) @@ -27,6 +27,9 @@ if(!G.is_deployed()) to_chat(G, "You must be manifested to warp a target!") return + if(!G.can_use_abilities) + to_chat(G, "You can't do that right now!") + return if(!G.beacon) to_chat(G, "You need a beacon placed to warp things!") return @@ -38,7 +41,7 @@ return var/turf/T = get_turf(A) - if(G.beacon.z != T.z) + if(G.beacon.get_virtual_z_level() != T.get_virtual_z_level()) to_chat(G, "The beacon is too far away to warp to!") return remove_ranged_ability() diff --git a/code/modules/guardian/abilities/special/absolution.dm b/code/modules/guardian/abilities/special/absolution.dm index 5bd3a8af31d8b..91ba7eb2dcf26 100644 --- a/code/modules/guardian/abilities/special/absolution.dm +++ b/code/modules/guardian/abilities/special/absolution.dm @@ -50,19 +50,6 @@ // STUFF -/obj/item/melee_attack_chain(mob/user, atom/target, params) - if(!tool_attack_chain(user, target) && pre_attack(target, user, params)) - var/resolved - if(HAS_TRAIT(target, TRAIT_ONEWAYROAD)) - resolved = user.attackby(src, user, params) // you just hit yourself - else - resolved = target.attackby(src, user, params) - if(!resolved && target && !QDELETED(src)) - if(HAS_TRAIT(target, TRAIT_ONEWAYROAD)) - afterattack(user, user, 1, params) - else - afterattack(target, user, 1, params) - /mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone) if(HAS_TRAIT(src, TRAIT_ONEWAYROAD)) var/atom/movable/oldfirer = P.firer diff --git a/code/modules/guardian/guardian.dm b/code/modules/guardian/guardian.dm index c65469e451b33..2e1b43a3315c2 100644 --- a/code/modules/guardian/guardian.dm +++ b/code/modules/guardian/guardian.dm @@ -38,7 +38,8 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians melee_damage = 15 AIStatus = AI_OFF hud_type = /datum/hud/guardian - mobsay_color = "#ffffff" + chat_color = "#ffffff" + mobchatspan = "blob" var/next_reset = 0 var/guardiancolor = "#ffffff" var/mutable_appearance/cooloverlay @@ -49,7 +50,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians var/range = 10 var/cooldown = 0 var/datum/mind/summoner - var/toggle_button_type = /obj/screen/guardian/ToggleMode + var/toggle_button_type = /atom/movable/screen/guardian/ToggleMode var/datum/guardian_stats/stats var/summoner_visible = TRUE var/battlecry = "AT" @@ -63,12 +64,14 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians var/beacon_cooldown = 0 var/list/pocket_dim var/transforming = FALSE + var/can_use_abilities = TRUE + discovery_points = 5000 /mob/living/simple_animal/hostile/guardian/Initialize(mapload, theme, guardiancolor) GLOB.parasites += src if(guardiancolor) src.guardiancolor = guardiancolor - src.mobsay_color = guardiancolor + src.chat_color = guardiancolor updatetheme(theme) battlecry = pick("ORA", "MUDA", "DORA", "ARRI", "VOLA", "AT") return ..() @@ -169,7 +172,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians speak_emote = list("telepathically cries") desc = "A truly alien creature, it is a mass of unknown organic material, standing by its' owner's side." attack_sound = 'sound/weapons/pierce.ogg' - if(!recolorentiresprite) //we want this to proc before stand logs in, so the overlay isnt gone for some reason + if(!recolorentiresprite) //we want this to proc before stand logs in, so the overlay isn't gone for some reason cooloverlay = mutable_appearance(icon, theme) cooloverlay.color = guardiancolor add_overlay(cooloverlay) @@ -216,6 +219,8 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians snapback() /mob/living/simple_animal/hostile/guardian/proc/OnMoved() + SIGNAL_HANDLER + snapback() setup_barriers() @@ -241,20 +246,20 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians if(stats.ability) stats.ability.Berserk() -/mob/living/simple_animal/hostile/guardian/Stat() - ..() - if(statpanel("Status")) - if(summoner?.current) - var/resulthealth - if(iscarbon(summoner.current)) - resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - summoner.current.health) / abs(HEALTH_THRESHOLD_DEAD - summoner.current.maxHealth)) * 100) - else - resulthealth = round((summoner.current.health / summoner.current.maxHealth) * 100, 0.5) - stat(null, "Summoner Health: [resulthealth]%") - if(cooldown >= world.time) - stat(null, "Manifest/Recall Cooldown Remaining: [DisplayTimeText(cooldown - world.time)]") - if(stats.ability) - stats.ability.Stat() +/mob/living/simple_animal/hostile/guardian/get_stat_tab_status() + var/list/tab_data = ..() + if(summoner?.current) + var/resulthealth + if(iscarbon(summoner.current)) + resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - summoner.current.health) / abs(HEALTH_THRESHOLD_DEAD - summoner.current.maxHealth)) * 100) + else + resulthealth = round((summoner.current.health / summoner.current.maxHealth) * 100, 0.5) + tab_data["Summoner Health"] = GENERATE_STAT_TEXT("[resulthealth]%") + if(cooldown >= world.time) + tab_data["Manifest/Recall Cooldown Remaining"] = GENERATE_STAT_TEXT(" [DisplayTimeText(cooldown - world.time)]") + if(stats.ability) + tab_data += stats.ability.Stat() + return tab_data /mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range pixel_x = initial(pixel_x) @@ -340,9 +345,10 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians return loc != summoner?.current /mob/living/simple_animal/hostile/guardian/Shoot(atom/targeted_atom) - if( QDELETED(targeted_atom) || targeted_atom == targets_from.loc || targeted_atom == targets_from ) + var/atom/target_from = GET_TARGETS_FROM(src) + if( QDELETED(targeted_atom) || targeted_atom == target_from.loc || targeted_atom == target_from ) return - var/turf/startloc = get_turf(targets_from) + var/turf/startloc = get_turf(target_from) var/obj/item/projectile/P = new /obj/item/projectile/guardian(startloc) playsound(src, projectilesound, 100, 1) P.color = guardiancolor @@ -353,7 +359,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians P.yo = targeted_atom.y - startloc.y P.xo = targeted_atom.x - startloc.x if(AIStatus != AI_ON)//Don't want mindless mobs to have their movement screwed up firing in space - newtonian_move(get_dir(targeted_atom, targets_from)) + newtonian_move(get_dir(targeted_atom, target_from)) P.original = targeted_atom P.preparePixelProjectile(targeted_atom, src) P.fire() @@ -391,7 +397,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians if(stats.ability) stats.ability.AfterAttack(target) -/mob/living/simple_animal/hostile/guardian/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash) +/mob/living/simple_animal/hostile/guardian/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash) return FALSE /mob/living/simple_animal/hostile/guardian/death() @@ -409,7 +415,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - summoner.current.health) / abs(HEALTH_THRESHOLD_DEAD - summoner.current.maxHealth)) * 100) else resulthealth = round((summoner.current.health / summoner.current.maxHealth) * 100, 0.5) - hud_used.healths.maptext = "
[resulthealth]%
" + hud_used.healths.maptext = MAPTEXT("
[resulthealth]%
") /mob/living/simple_animal/hostile/guardian/adjustHealth(amount, updating_health = TRUE, forced = FALSE) //The spirit is invincible, but passes on damage to the summoner if(berserk) @@ -580,16 +586,20 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians key = C.key /mob/living/simple_animal/hostile/guardian/proc/Reviveify() + SIGNAL_HANDLER + revive() var/mob/gost = grab_ghost(TRUE) if(!QDELETED(gost) && gost.ckey) ckey = gost.ckey /mob/living/simple_animal/hostile/guardian/proc/OnMindTransfer(datum/_source, mob/old_body, mob/new_body) + SIGNAL_HANDLER + if(!QDELETED(old_body)) - old_body.verbs -= /mob/living/proc/guardian_comm - old_body.verbs -= /mob/living/proc/guardian_recall - old_body.verbs -= /mob/living/proc/guardian_reset + old_body.remove_verb(/mob/living/proc/guardian_comm) + old_body.remove_verb(/mob/living/proc/guardian_recall) + old_body.remove_verb(/mob/living/proc/guardian_reset) UnregisterSignal(old_body, COMSIG_MOVABLE_MOVED) UnregisterSignal(old_body, COMSIG_LIVING_REVIVE) if(isliving(new_body)) @@ -600,9 +610,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians RegisterSignal(new_body, COMSIG_MOVABLE_MOVED, /mob/living/simple_animal/hostile/guardian.proc/OnMoved) RegisterSignal(new_body, COMSIG_LIVING_REVIVE, /mob/living/simple_animal/hostile/guardian.proc/Reviveify) to_chat(src, "You manifest into existence, as your master's soul appears in a new body!") - new_body.verbs |= /mob/living/proc/guardian_comm - new_body.verbs |= /mob/living/proc/guardian_recall - new_body.verbs |= /mob/living/proc/guardian_reset + new_body.add_verb(/mob/living/proc/guardian_comm) + new_body.add_verb(/mob/living/proc/guardian_recall) + new_body.add_verb(/mob/living/proc/guardian_reset) /mob/living/proc/guardian_comm() set name = "Communicate" @@ -682,7 +692,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians else to_chat(src, "You decide not to reset [guardians.len > 1 ? "any of your guardians":"your guardian"].") else - verbs -= /mob/living/proc/guardian_reset + remove_verb(/mob/living/proc/guardian_reset) ////////parasite tracking/finding procs diff --git a/code/modules/guardian/guardianbuilder.dm b/code/modules/guardian/guardianbuilder.dm index 5452ea37026a8..36b9023edf615 100644 --- a/code/modules/guardian/guardianbuilder.dm +++ b/code/modules/guardian/guardianbuilder.dm @@ -34,7 +34,6 @@ ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "Guardian") - ui.set_autoupdate(TRUE) ui.open() /datum/guardianbuilder/ui_data(mob/user) @@ -83,7 +82,7 @@ cost = GA.cost, icon = GA.ui_icon, selected = istype(saved_stats.ability, ability), - available = (points >= GA.cost) && GA.CanBuy(), + available = (points+saved_stats.ability?.cost >= GA.cost) && GA.CanBuy(), path = "[ability]", requiem = istype(GA, /datum/guardian_ability/major/special) )) @@ -104,60 +103,73 @@ /datum/guardianbuilder/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) if(..() || used) return - calc_points() switch(action) if("name") guardian_name = params["name"] + . = TRUE if("set") switch(params["name"]) if("Damage") var/lvl = CLAMP(text2num(params["level"]), 1, 5) if((points + (saved_stats.damage > 1 ? saved_stats.damage - 1 : 0)) >= lvl - 1 || lvl == 1) saved_stats.damage = lvl - . = TRUE + . = TRUE if("Defense") var/lvl = CLAMP(text2num(params["level"]), 1, 5) if((points + (saved_stats.defense > 1 ? saved_stats.defense - 1 : 0)) >= lvl - 1 || lvl == 1) saved_stats.defense = lvl - . = TRUE + . = TRUE if("Speed") var/lvl = CLAMP(text2num(params["level"]), 1, 5) if((points + (saved_stats.speed > 1 ? saved_stats.speed - 1 : 0)) >= lvl - 1 || lvl == 1) saved_stats.speed = lvl - . = TRUE + . = TRUE if("Potential") var/lvl = CLAMP(text2num(params["level"]), 1, 5) if((points + (saved_stats.potential > 1 ? saved_stats.potential - 1 : 0)) >= lvl - 1 || lvl == 1) saved_stats.potential = lvl - . = TRUE + . = TRUE if("Range") var/lvl = CLAMP(text2num(params["level"]), 1, 5) if((points + (saved_stats.range > 1 ? saved_stats.range - 1 : 0)) >= lvl - 1 || lvl == 1) saved_stats.range = lvl - . = TRUE + . = TRUE if("color") var/color = input(usr, "What would you like your guardian's color to be?", "Choose Your Color", "#ffffff") as color|null if(color) guardian_color = color + . = TRUE if("clear_ability_major") QDEL_NULL(saved_stats.ability) + . = TRUE if("ability_major") - var/ability = text2path(params["path"]) + var/datum/guardian_ability/ability = text2path(params["path"]) var/list/types = allow_special ? (subtypesof(/datum/guardian_ability/major) - /datum/guardian_ability/major/special) : (subtypesof(/datum/guardian_ability/major) - typesof(/datum/guardian_ability/major/special)) if(ispath(ability)) if(saved_stats.ability && saved_stats.ability.type == ability) QDEL_NULL(saved_stats.ability) - else if(ability in types) // no nullspace narsie for you! - QDEL_NULL(saved_stats.ability) - saved_stats.ability = new ability - saved_stats.ability.master_stats = saved_stats + . = TRUE + else if((ability in types) && (points + (saved_stats.ability?.cost || 0)) >= initial(ability.cost)) // no nullspace narsie for you! + var/datum/guardian_ability/new_ability = new ability + new_ability.master_stats = saved_stats + var/datum/guardian_ability/old_ability = saved_stats.ability + saved_stats.ability = null + if(new_ability.CanBuy(FALSE)) + qdel(old_ability) + saved_stats.ability = new_ability + . = TRUE + else + qdel(new_ability) + saved_stats.ability = old_ability if("ability_minor") - var/ability = text2path(params["path"]) + var/datum/guardian_ability/ability = text2path(params["path"]) if(ispath(ability) && (ability in subtypesof(/datum/guardian_ability/minor))) // no nullspace narsie for you! if(saved_stats.HasMinorAbility(ability)) saved_stats.TakeMinorAbility(ability) - else + . = TRUE + else if(points >= initial(ability.cost)) saved_stats.AddMinorAbility(ability) + . = TRUE if("spawn") . = spawn_guardian(usr) if("reset") @@ -167,8 +179,21 @@ if("ranged") if(points >= 3) saved_stats.ranged = TRUE + . = TRUE if("melee") saved_stats.ranged = FALSE + . = TRUE + if(.) + if(saved_stats.ability && !saved_stats.ability.CanBuy(FALSE)) // In case stat changes made some abilities invalid to have. Right now only Frenzy. + QDEL_NULL(saved_stats.ability) + var/list/datum/guardian_ability/minor/abilities_to_remove = list() + for(var/datum/guardian_ability/minor/minor in saved_stats.minor_abilities) + if(!minor.CanBuy(FALSE)) + abilities_to_remove += minor + for(var/datum/guardian_ability/minor/minor in abilities_to_remove) + saved_stats.minor_abilities -= minor + qdel(minor) + calc_points() /datum/guardianbuilder/proc/calc_points() points = max_points @@ -230,9 +255,9 @@ to_chat(user, "[G.real_name] has been caught!") if(GUARDIAN_HIVE) to_chat(user, "[G.real_name] has been created from the core!") - user.verbs += /mob/living/proc/guardian_comm - user.verbs += /mob/living/proc/guardian_recall - user.verbs += /mob/living/proc/guardian_reset + user.add_verb(/mob/living/proc/guardian_comm) + user.add_verb(/mob/living/proc/guardian_recall) + user.add_verb(/mob/living/proc/guardian_reset) return TRUE else to_chat(user, "[failure_message]") diff --git a/code/modules/guardian/standarrow.dm b/code/modules/guardian/standarrow.dm index d690bec334831..fe996818b9af3 100644 --- a/code/modules/guardian/standarrow.dm +++ b/code/modules/guardian/standarrow.dm @@ -45,17 +45,9 @@ user.dropItemToGround(src, TRUE) forceMove(H) if(iscarbon(M)) - sleep(15 SECONDS) - if(prob(kill_chance)) - H.visible_message("[H] stares ahead, eyes full of fear, before collapsing lifelessly into ash, \the [src] falling out...") - log_game("[key_name(H)] was killed by a stand arrow.") - forceMove(H.drop_location()) - H.mind.no_cloning_at_all = TRUE - H.adjustCloneLoss(500) - H.dust(TRUE) - in_use = FALSE - else - INVOKE_ASYNC(src, .proc/generate_stand, H) + in_use = TRUE + addtimer(CALLBACK(src, .proc/after_arrow_attack, H, kill_chance), 15 SECONDS) + in_use = FALSE else if(isguardian(M)) INVOKE_ASYNC(src, .proc/requiem, M) @@ -63,6 +55,17 @@ visible_message("[src] falls apart!") qdel(src) +/obj/item/stand_arrow/proc/after_arrow_attack(mob/living/carbon/H, var/kill_chance) + if(prob(kill_chance)) + H.visible_message("[H] stares ahead, eyes full of fear, before collapsing lifelessly into ash, \the [src] falling out...") + log_game("[key_name(H)] was killed by a stand arrow.") + forceMove(H.drop_location()) + H.mind.no_cloning_at_all = TRUE + H.adjustCloneLoss(500) + H.dust(TRUE) + else + INVOKE_ASYNC(src, .proc/generate_stand, H) + /obj/item/stand_arrow/proc/requiem(mob/living/simple_animal/hostile/guardian/G) G.range = 255 G.transforming = TRUE @@ -178,9 +181,9 @@ users[G] = TRUE log_game("[key_name(H)] has summoned [key_name(G)], a holoparasite, via the stand arrow.") to_chat(H, "[G.real_name] has been summoned!") - H.verbs += /mob/living/proc/guardian_comm - H.verbs += /mob/living/proc/guardian_recall - H.verbs += /mob/living/proc/guardian_reset + H.add_verb(/mob/living/proc/guardian_comm) + H.add_verb(/mob/living/proc/guardian_recall) + H.add_verb(/mob/living/proc/guardian_reset) uses-- in_use = FALSE H.visible_message("\The [src] falls out of [H]!") diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index 9b21cde77f48f..6dbd6e92e38c0 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -7,7 +7,7 @@ earliest_start = 0 MINUTES /datum/round_event/easter/announce(fake) - priority_announce(pick("Hip-hop into Easter!","Find some Bunny's stash!","Today is National 'Hunt a Wabbit' Day.","Be kind, give Chocolate Eggs!")) + priority_announce(pick("Hip-hop into Easter!","Find some Bunny's stash!","Today is National 'Hunt a Wabbit' Day.","Be kind, give Chocolate Eggs!"), sound = SSstation.announcer.get_rand_alert_sound()) /datum/round_event_control/rabbitrelease @@ -18,7 +18,7 @@ max_occurrences = 10 /datum/round_event/rabbitrelease/announce(fake) - priority_announce("Unidentified furry objects detected coming aboard [station_name()]. Beware of Adorable-ness.", "Fluffy Alert", 'sound/ai/aliens.ogg') + priority_announce("Unidentified furry objects detected coming aboard [station_name()]. Beware of Adorable-ness.", "Fluffy Alert", ANNOUNCER_ALIENS) /datum/round_event/rabbitrelease/start() diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 098972034b1c6..6eb02740e6540 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -93,6 +93,19 @@ /datum/holiday/valentines/getStationPrefix() return pick("Love","Amore","Single","Smootch","Hug") +/// Garbage DAYYYYY +/// Huh?.... NOOOO +/// *GUNSHOT* +/// AHHHGHHHHHHH +/datum/holiday/garbageday + name = GARBAGEDAY + begin_day = 17 + end_day = 17 + begin_month = JUNE + +/datum/holiday/garbageday/getStationPrefix() + return pick("Trash","Janitor","Rubish","Bin") + /datum/holiday/birthday name = "Birthday of Space Station 13" begin_day = 16 @@ -281,6 +294,14 @@ /datum/holiday/friendship/greet() return "Have a magical [name]!" +/datum/holiday/anz + name = "ANZAC Day" + begin_day = 25 + begin_month = APRIL + +/datum/holiday/anz/getStationPrefix() + return pick("Australian", "New Zealand", "Poppy", "Southern Cross") + /datum/holiday/beer name = "Beer Day" @@ -498,9 +519,9 @@ Since Ramadan is an entire month that lasts 29.5 days on average, the start and /datum/holiday/xmas name = CHRISTMAS - begin_day = 22 + begin_day = 24 begin_month = DECEMBER - end_day = 27 + end_day = 26 drone_hat = /obj/item/clothing/head/santa /datum/holiday/xmas/greet() diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index dca4681137894..c94700b45e162 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -1,7 +1,10 @@ //Vars that will not be copied when using /DuplicateObject GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( "tag", "datum_components", "area", "type", "loc", "locs", "vars", "parent", "parent_type", "verbs", "ckey", "key", - "power_supply", "contents", "reagents", "stat", "x", "y", "z", "group", "atmos_adjacent_turfs", "comp_lookup" + "power_supply", "contents", "reagents", "stat", "x", "y", "z", "group", "atmos_adjacent_turfs", "comp_lookup", + "client_mobs_in_contents", "bodyparts", "internal_organs", "hand_bodyparts", "overlays_standing", "hud_list", + "actions", "AIStatus", "appearance", "managed_overlays", "managed_vis_overlays", "computer_id", "lastKnownIP", "implants", + "tgui_shared_states" )) /proc/DuplicateObject(atom/original, perfectcopy = TRUE, sameloc, atom/newloc = null, nerf, holoitem) @@ -20,7 +23,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( if(islist(original.vars[V])) var/list/L = original.vars[V] O.vars[V] = L.Copy() - else if(istype(original.vars[V], /datum)) + else if(istype(original.vars[V], /datum) || ismob(original.vars[V])) continue // this would reference the original's object, that will break when it is used or deleted. else O.vars[V] = original.vars[V] @@ -52,6 +55,11 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( contained_atom.flags_1 |= HOLOGRAM_1 if(M.circuit) M.circuit.flags_1 |= HOLOGRAM_1 + + if(ismob(O)) //Overlays are carried over despite disallowing them, if a fix is found remove this. + var/mob/M = O + M.cut_overlays() + M.regenerate_icons() return O @@ -135,7 +143,5 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( if(toupdate.len) for(var/turf/T1 in toupdate) CALCULATE_ADJACENT_TURFS(T1) - SSair.add_to_active(T1,1) - return copiedobjs diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index e9803d7e575f0..eb6dfc51f1dd5 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -1,22 +1,30 @@ /* - 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. - 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. - - You can use this to add holodecks with minimal code: - 1) Define new areas for the holodeck programs - 2) Map them - 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. +Map Template Holodeck + +Holodeck finds the location of mapped_start_area and loads offline_program in it on LateInitialize. It then passes its program templates to Holodeck.js in the form of program_cache and emag_programs. when a user selects a program the +ui calls load_program() with the id of the selected program. +load_program() -> map_template/load() on map_template/holodeck. + +holodeck map templates: +1. have an update_blacklist that doesnt allow placing on non holofloors (except for engine floors so you can repair it) +2. has should_place_on_top = FALSE, so that the baseturfs list doesnt pull a kilostation oom crash +3. has returns_created = TRUE, so that SSatoms gives the map template a list of spawned atoms +all the fancy flags and shit are added to holodeck objects in finish_spawn() + +Easiest way to add new holodeck programs: +1. Define new map template datums in code/modules/holodeck/holodeck_map_templates, make sure they have the access flags +of the holodeck you want them to be able to load, for the onstation holodeck the flag is STATION_HOLODECK. +2. Create the new map templates in _maps/templates (remember theyre 9x10, and make sure they have area/noop or else it will fuck with linked) +all turfs in holodeck programs MUST be of type /turf/open/floor/holofloor, OR /turf/open/floor/engine, or they will block future programs! + +Note: if youre looking at holodeck code because you want to see how returns_created is handled so that templates return a list of atoms +created from them: make sure you handle that list correctly! Either copy them by value and delete them or reference it and handle qdel'ing +and clear when youre done! if you dont i will use :newspaper2: on you */ -#define HOLODECK_CD 25 -#define HOLODECK_DMG_CD 500 +#define HOLODECK_CD 2 SECONDS +#define HOLODECK_DMG_CD 5 SECONDS + /obj/machinery/computer/holodeck name = "holodeck control console" @@ -25,71 +33,97 @@ idle_power_usage = 10 active_power_usage = 50 + //new vars + + ///what area type this holodeck loads into. linked turns into the nearest instance of this area + var/area/mapped_start_area = /area/holodeck/rec_center + ///the currently used map template + var/datum/map_template/holodeck/template + ///bottom left corner of the loading room, used for placing + var/turf/bottom_left + + ///if TRUE the holodeck is busy spawning another simulation and should immediately stop loading the newest one + var/spawning_simulation = FALSE + + //old vars + + ///the area that this holodeck loads templates into, used for power and deleting holo objects that leave it var/area/holodeck/linked - var/area/holodeck/program - var/area/holodeck/last_program - var/area/offline_program = /area/holodeck/rec_center/offline + ///what program is loaded right now or is about to be loaded + var/program = "offline" + var/last_program + + ///the default program loaded by this holodeck when spawned and when deactivated + var/offline_program = "offline" + + ///stores all of the unrestricted holodeck map templates that this computer has access to var/list/program_cache + ///stores all of the restricted holodeck map templates that this computer has access to 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 + ///subtypes of this (but not this itself) are loadable programs + var/program_type = /datum/map_template/holodeck + ///every holo object created by the holodeck goes in here to track it + var/list/spawned = list() + var/list/effects = list() //like above, but for holo effects + + ///TRUE if the holodeck is using extra power because of a program, FALSE otherwise var/active = FALSE + ///increases the holodeck cooldown if TRUE, causing the holodeck to take longer to allow loading new programs var/damaged = FALSE - var/list/spawned = list() - var/list/effects = list() - var/current_cd = 0 + + //creates the timer that determines if another program can be manually loaded + COOLDOWN_DECLARE(holodeck_cooldown) /obj/machinery/computer/holodeck/Initialize(mapload) ..() 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) +/obj/machinery/computer/holodeck/LateInitialize()//from here linked is populated and the program list is generated. its also set to load the offline program + linked = GLOB.areas_by_type[mapped_start_area] + bottom_left = locate(linked.x, linked.y, src.z) + + var/area/computer_area = get_area(src) + if(istype(computer_area, /area/holodeck)) + log_mapping("Holodeck computer cannot be in a holodeck, This would cause circular power dependency.") + qdel(src) + return + // the following is necessary for power reasons - if(!linked || !offline_program) + if(!linked) log_world("No matching holodeck area found") qdel(src) return - var/area/AS = get_area(src) - if(istype(AS, /area/holodeck)) - log_mapping("Holodeck computer cannot be in a holodeck, This would cause circular power dependency.") + else if (!offline_program) + stack_trace("Holodeck console created without an offline program") qdel(src) return + else linked.linked = src var/area/my_area = get_area(src) if(my_area) linked.power_usage = my_area.power_usage else - linked.power_usage = new /list(AREA_USAGE_LEN) + linked.power_usage = list(AREA_USAGE_LEN) + COOLDOWN_START(src, holodeck_cooldown, HOLODECK_CD) generate_program_list() - load_program(offline_program, FALSE, FALSE) - -/obj/machinery/computer/holodeck/Destroy() - emergency_shutdown() - if(linked) - linked.linked = null - linked.power_usage = new /list(AREA_USAGE_LEN) - return ..() - -/obj/machinery/computer/holodeck/power_change() - . = ..() - toggle_power(!stat) + load_program(offline_program,TRUE) - -/obj/machinery/computer/holodeck/ui_state(mob/user) - return GLOB.default_state +///adds all programs that this holodeck has access to, and separates the restricted and unrestricted ones +/obj/machinery/computer/holodeck/proc/generate_program_list() + for(var/typekey in subtypesof(program_type)) + var/datum/map_template/holodeck/program = typekey + var/list/info_this = list("id" = initial(program.template_id), "name" = initial(program.name)) + if(initial(program.restricted)) + LAZYADD(emag_programs, list(info_this)) + else + LAZYADD(program_cache, list(info_this)) /obj/machinery/computer/holodeck/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -104,220 +138,273 @@ if(obj_flags & EMAGGED) data["emagged"] = TRUE data["emag_programs"] = emag_programs + else + data["emagged"] = null + data["emag_programs"] = null data["program"] = program data["can_toggle_safety"] = issilicon(user) || IsAdminGhost(user) - return data /obj/machinery/computer/holodeck/ui_act(action, params) if(..()) return - . = TRUE switch(action) if("load_program") - var/program_to_load = text2path(params["type"]) - if(!ispath(program_to_load)) - return FALSE - var/valid = FALSE - var/list/checked = program_cache.Copy() - if(obj_flags & EMAGGED) - checked |= emag_programs - for(var/prog in checked) - var/list/P = prog - if(P["type"] == program_to_load) + var/program_to_load = params["id"] + + var/valid = FALSE //dont tell security about this + + //checks if program_to_load is any one of the loadable programs, if it isnt then it rejects it + for(var/list/check_list as anything in program_cache) + if(check_list["id"] == program_to_load) valid = TRUE break + if(!valid && (obj_flags & EMAGGED)) + for(var/list/check_list as anything in emag_programs) + if(check_list["id"] == program_to_load) + valid = TRUE + break if(!valid) - return FALSE - - var/area/A = locate(program_to_load) in GLOB.sortedAreas - if(A) - if(istype(A, /area/holodeck)) //Admins could technically load a non-holodeck area with some varediting - var/area/holodeck/H = A - if(H.restricted) - message_admins("[key_name(usr)] is loading a restricted (and potentially dangerous) holodeck area: [H.name]") - log_game("[key_name(usr)] is loading a restricted (and potentially dangerous) holodeck area: [H.name]") - load_program(A) + return + //load the map_template that program_to_load represents + load_program(program_to_load) + . = TRUE if("safety") if((obj_flags & EMAGGED) && program) emergency_shutdown() - nerf(obj_flags & EMAGGED) + nerf(obj_flags & EMAGGED,FALSE) obj_flags ^= EMAGGED - say("Safeties restored. Restarting...") + say("Safeties reset. Restarting...") + . = TRUE -/obj/machinery/computer/holodeck/process() - if(damaged && prob(10)) - for(var/turf/T in linked) - if(prob(5)) - do_sparks(2, 1, T) - return +///this is what makes the holodeck not spawn anything on broken tiles (space and non engine plating / non holofloors) +/datum/map_template/holodeck/update_blacklist(turf/placement, list/input_blacklist) + for(var/turf/possible_blacklist as anything in get_affected_turfs(placement)) + if (possible_blacklist.holodeck_compatible) + continue + input_blacklist += possible_blacklist - if(!..() || !active) +///loads the template whose id string it was given ("offline_program" loads datum/map_template/holodeck/offline) +/obj/machinery/computer/holodeck/proc/load_program(map_id, force = FALSE, add_delay = TRUE) + if (program == map_id) return - if(!floorcheck()) - emergency_shutdown() - damaged = TRUE - for(var/mob/M in urange(10,src)) - M.show_message("The holodeck overloads!") + if (!is_operational())//load_program is called once with a timer (in toggle_power) we dont want this to load anything if its off + map_id = offline_program + force = TRUE - for(var/turf/T in linked) - if(prob(30)) - do_sparks(2, 1, T) - T.ex_act(EXPLODE_LIGHT) - T.hotspot_expose(1000,500,1) + if (!force && (!COOLDOWN_FINISHED(src, holodeck_cooldown) || spawning_simulation)) + say("ERROR. Recalibrating projection apparatus.") + return - if(!(obj_flags & EMAGGED)) - for(var/item in spawned) - if(!(get_turf(item) in linked)) - derez(item, 0) - for(var/e in effects) - var/obj/effect/holodeck_effect/HE = e - HE.tick() + if(spawning_simulation) + return - active_power_usage = 50 + spawned.len * 3 + effects.len * 5 + if (add_delay) + COOLDOWN_START(src, holodeck_cooldown, (damaged ? HOLODECK_CD + HOLODECK_DMG_CD : HOLODECK_CD)) + if (damaged && floorcheck()) + damaged = FALSE + + spawning_simulation = TRUE + active = (map_id != offline_program) + use_power = active + IDLE_POWER_USE + program = map_id + + //clear the items from the previous program + for(var/holo_atom in spawned) + derez(holo_atom) + + for(var/obj/effect/holodeck_effect/holo_effect as anything in effects) + effects -= holo_effect + holo_effect.deactivate(src) + + //makes sure that any time a holoturf is inside a baseturf list (e.g. if someone put a wall over it) its set to the OFFLINE turf + //so that you cant bring turfs from previous programs into other ones (like putting the plasma burn turf into lounge for example) + for(var/turf/closed/holo_turf in linked) + for(var/baseturf in holo_turf.baseturfs) + if(ispath(baseturf, /turf/open/floor/holofloor)) + holo_turf.baseturfs -= baseturf + holo_turf.baseturfs += /turf/open/floor/holofloor/plating + + template = SSmapping.holodeck_templates[map_id] + template.load(bottom_left) //this is what actually loads the holodeck simulation into the map + + spawned = template.created_atoms //populate the spawned list with the atoms belonging to the holodeck + + if(istype(template, /datum/map_template/holodeck/thunderdome1218) && !SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_MEDISIM]) + say("Special note from \"1218 AD\" developer: I see you too are interested in the REAL dark ages of humanity! I've made this program also unlock some interesting shuttle designs on any communication console around. Have fun!") + SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_MEDISIM] = TRUE -/obj/machinery/computer/holodeck/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - if(!LAZYLEN(emag_programs)) - to_chat(user, "[src] does not seem to have a card swipe port. It must be an inferior model.") - return - playsound(src, "sparks", 75, TRUE) - obj_flags |= EMAGGED - to_chat(user, "You vastly increase projector power and override the safety and security protocols.") - say("Warning. Automatic shutoff and derezzing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator.") - log_game("[key_name(user)] emagged the Holodeck Control Console") nerf(!(obj_flags & EMAGGED)) + finish_spawn() -/obj/machinery/computer/holodeck/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) +///finalizes objects in the spawned list +/obj/machinery/computer/holodeck/proc/finish_spawn() + for(var/atom/holo_atom as anything in spawned) + if(QDELETED(holo_atom)) + spawned -= holo_atom + continue + + RegisterSignal(holo_atom, COMSIG_PARENT_PREQDELETED, .proc/remove_from_holo_lists) + holo_atom.flags_1 |= HOLOGRAM_1 + + if(isholoeffect(holo_atom))//activates holo effects and transfers them from the spawned list into the effects list + var/obj/effect/holodeck_effect/holo_effect = holo_atom + effects += holo_effect + spawned -= holo_effect + var/atom/holo_effect_product = holo_effect.activate(src)//change name + if(istype(holo_effect_product)) + spawned += holo_effect_product // we want mobs or objects spawned via holoeffects to be tracked as objects + RegisterSignal(holo_effect_product, COMSIG_PARENT_PREQDELETED, .proc/remove_from_holo_lists) + if(islist(holo_effect_product)) + for(var/atom/atom_product as anything in holo_effect_product) + RegisterSignal(atom_product, COMSIG_PARENT_PREQDELETED, .proc/remove_from_holo_lists) + continue + + if(isobj(holo_atom)) + var/obj/holo_object = holo_atom + holo_object.resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + + if(isstructure(holo_object)) + holo_object.flags_1 |= NODECONSTRUCT_1 + continue + + if(ismachinery(holo_object)) + var/obj/machinery/holo_machine = holo_object + holo_machine.flags_1 |= NODECONSTRUCT_1 + holo_machine.power_change() + + if(istype(holo_machine, /obj/machinery/button)) + var/obj/machinery/button/holo_button = holo_machine + holo_button.setup_device() + + spawning_simulation = FALSE + +///this qdels holoitems that should no longer exist for whatever reason +/obj/machinery/computer/holodeck/proc/derez(atom/movable/holo_atom, silent = TRUE, forced = FALSE) + spawned -= holo_atom + if(!holo_atom) return - emergency_shutdown() + UnregisterSignal(holo_atom, COMSIG_PARENT_PREQDELETED) + var/turf/target_turf = get_turf(holo_atom) + for(var/atom/movable/atom_contents as anything in holo_atom) //make sure that things inside of a holoitem are moved outside before destroying it + atom_contents.forceMove(target_turf) -/obj/machinery/computer/holodeck/ex_act(severity, target) - emergency_shutdown() - return ..() + if(!silent) + visible_message("[holo_atom] fades away!") -/obj/machinery/computer/holodeck/blob_act(obj/structure/blob/B) - emergency_shutdown() - return ..() + qdel(holo_atom) -/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/remove_from_holo_lists(datum/to_remove, _forced) + SIGNAL_HANDLER + + spawned -= to_remove + UnregisterSignal(to_remove, COMSIG_PARENT_PREQDELETED) + +/obj/machinery/computer/holodeck/process(delta_time=2) + if(damaged && DT_PROB(10, delta_time)) + for(var/turf/holo_turf in linked) + if(DT_PROB(5, delta_time)) + do_sparks(2, 1, holo_turf) + return + . = ..() + if(!. || program == offline_program)//we dont need to scan the holodeck if the holodeck is offline + return + + if(!floorcheck()) //if any turfs in the floor of the holodeck are broken + emergency_shutdown() + damaged = TRUE + visible_message("The holodeck overloads!") + for(var/turf/holo_turf in linked) + if(DT_PROB(30, delta_time)) + do_sparks(2, 1, holo_turf) + SSexplosions.lowturf += holo_turf + holo_turf.hotspot_expose(1000,500,1) + + if(!(obj_flags & EMAGGED)) + for(var/item in spawned) + if(!(get_turf(item) in linked)) + derez(item) + for(var/obj/effect/holodeck_effect/holo_effect as anything in effects) + holo_effect.tick() + active_power_usage = 50 + spawned.len * 3 + effects.len * 5 /obj/machinery/computer/holodeck/proc/toggle_power(toggleOn = FALSE) if(active == toggleOn) return if(toggleOn) - if(last_program && last_program != offline_program) - addtimer(CALLBACK(src, .proc/load_program, last_program, TRUE), 25) + if(last_program && (last_program != offline_program)) + addtimer(CALLBACK(src,.proc/load_program, last_program, TRUE), 25) active = TRUE else last_program = program load_program(offline_program, TRUE) active = FALSE +/obj/machinery/computer/holodeck/power_change() + . = ..() + INVOKE_ASYNC(src, .proc/toggle_power, !stat) + +///shuts down the holodeck and force loads the offline_program /obj/machinery/computer/holodeck/proc/emergency_shutdown() last_program = program - load_program(offline_program, TRUE) active = FALSE + load_program(offline_program, TRUE) + ui_update() +///returns TRUE if the entire floor of the holodeck is intact, returns FALSE if any are broken /obj/machinery/computer/holodeck/proc/floorcheck() - for(var/turf/T in linked) - if(!T.intact || isspaceturf(T)) + for(var/turf/holo_floor in linked) + if(isspaceturf(holo_floor)) + return FALSE + if(!holo_floor.intact) return FALSE return TRUE -/obj/machinery/computer/holodeck/proc/nerf(active) - for(var/obj/item/I in spawned) - I.damtype = active ? STAMINA : initial(I.damtype) - for(var/e in effects) - var/obj/effect/holodeck_effect/HE = e - HE.safety(active) - -/obj/machinery/computer/holodeck/proc/load_program(area/A, force = FALSE, add_delay = TRUE) - if(!is_operational()) - A = offline_program - force = TRUE +///changes all weapons in the holodeck to do stamina damage if set +/obj/machinery/computer/holodeck/proc/nerf(nerf_this, is_loading = TRUE) + if (!nerf_this && is_loading) + return + for(var/obj/item/to_be_nerfed in spawned) + to_be_nerfed.damtype = nerf_this ? STAMINA : initial(to_be_nerfed.damtype) + for(var/obj/effect/holodeck_effect/holo_effect as anything in effects) + holo_effect.safety(nerf_this) - if(program == A) +/obj/machinery/computer/holodeck/emag_act(mob/user) + if(obj_flags & EMAGGED) return - if(current_cd > world.time && !force) - say("ERROR. Recalibrating projection apparatus.") + if(!LAZYLEN(emag_programs)) + to_chat(user, "[src] does not seem to have a card swipe port. It must be an inferior model.") return - if(add_delay) - current_cd = world.time + HOLODECK_CD - if(damaged) - current_cd += HOLODECK_DMG_CD - active = (A != offline_program) - use_power = active + IDLE_POWER_USE - - for(var/e in effects) - var/obj/effect/holodeck_effect/HE = e - HE.deactivate(src) - - for(var/item in spawned) - derez(item, !force) + playsound(src, "sparks", 75, TRUE) + obj_flags |= EMAGGED + to_chat(user, "You vastly increase projector power and override the safety and security protocols.") + say("Warning. Automatic shutoff and derezzing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator.") + log_game("[key_name(user)] emagged the Holodeck Control Console") + nerf(!(obj_flags & EMAGGED),FALSE) + ui_update() - program = A - // note nerfing does not yet work on guns, should - // should also remove/limit/filter reagents? - // this is an exercise left to others I'm afraid. -Sayu - spawned = A.copy_contents_to(linked, 1, nerf_weapons = !(obj_flags & EMAGGED)) - for(var/obj/machinery/M in spawned) - M.flags_1 |= NODECONSTRUCT_1 - for(var/obj/structure/S in spawned) - S.flags_1 |= NODECONSTRUCT_1 - effects = list() +/obj/machinery/computer/holodeck/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + emergency_shutdown() - addtimer(CALLBACK(src, .proc/finish_spawn), 30) +/obj/machinery/computer/holodeck/ex_act(severity, target) + emergency_shutdown() + return ..() -/obj/machinery/computer/holodeck/proc/finish_spawn() - var/list/added = list() - for(var/obj/effect/holodeck_effect/HE in spawned) - effects += HE - spawned -= HE - var/atom/x = HE.activate(src) - if(istype(x) || islist(x)) - spawned += x // holocarp are not forever - added += x - for(var/obj/machinery/M in added) - M.flags_1 |= NODECONSTRUCT_1 - for(var/obj/structure/S in added) - S.flags_1 |= NODECONSTRUCT_1 - -/obj/machinery/computer/holodeck/proc/derez(obj/O, silent = TRUE, forced = FALSE) - // Emagging a machine creates an anomaly in the derez systems. - if(O && (obj_flags & EMAGGED) && !stat && !forced) - if((ismob(O) || ismob(O.loc)) && prob(50)) - addtimer(CALLBACK(src, .proc/derez, O, silent), 50) // may last a disturbingly long time - return - - spawned -= O - if(!O) - return - var/turf/T = get_turf(O) - for(var/atom/movable/AM in O) // these should be derezed if they were generated - AM.forceMove(T) - if(ismob(AM)) - silent = FALSE // otherwise make sure they are dropped +/obj/machinery/computer/holodeck/Destroy() + emergency_shutdown() + if(linked) + linked.linked = null + linked.power_usage = list(AREA_USAGE_LEN) + return ..() - if(!silent) - visible_message("[O] fades away!") - qdel(O) +/obj/machinery/computer/holodeck/blob_act(obj/structure/blob/B) + emergency_shutdown() + return ..() #undef HOLODECK_CD #undef HOLODECK_DMG_CD diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm index 7d39ad8fa96d3..adfe9c96b2f1a 100644 --- a/code/modules/holodeck/holo_effect.dm +++ b/code/modules/holodeck/holo_effect.dm @@ -28,31 +28,36 @@ /obj/effect/holodeck_effect/cards icon = 'icons/obj/toy.dmi' icon_state = "deck_nanotrasen_full" - var/obj/item/toy/cards/deck/D + var/obj/item/toy/cards/deck/deck /obj/effect/holodeck_effect/cards/activate(var/obj/machinery/computer/holodeck/HC) - D = new(loc) + deck = new(loc) safety(!(HC.obj_flags & EMAGGED)) - D.holo = HC - return D + deck.holo = HC + RegisterSignal(deck, COMSIG_PARENT_QDELETING, .proc/handle_card_delete) + return deck + +/obj/effect/holodeck_effect/cards/proc/handle_card_delete(datum/source) + SIGNAL_HANDLER + deck = null /obj/effect/holodeck_effect/cards/safety(active) - if(!D) + if(!deck) return if(active) - D.card_hitsound = null - D.card_force = 0 - D.card_throwforce = 0 - D.card_throw_speed = 3 - D.card_throw_range = 7 - D.card_attack_verb = list("attacked") + deck.card_hitsound = null + deck.card_force = 0 + deck.card_throwforce = 0 + deck.card_throw_speed = 3 + deck.card_throw_range = 7 + deck.card_attack_verb = list("attacked") else - D.card_hitsound = 'sound/weapons/bladeslice.ogg' - D.card_force = 5 - D.card_throwforce = 10 - D.card_throw_speed = 3 - D.card_throw_range = 7 - D.card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut") + deck.card_hitsound = 'sound/weapons/bladeslice.ogg' + deck.card_force = 5 + deck.card_throwforce = 10 + deck.card_throw_speed = 3 + deck.card_throw_range = 7 + deck.card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut") /obj/effect/holodeck_effect/sparks/activate(var/obj/machinery/computer/holodeck/HC) @@ -61,31 +66,44 @@ var/datum/effect_system/spark_spread/s = new s.set_up(3, 1, T) s.start() - T.temperature = 5000 + T.set_temperature(5000) T.hotspot_expose(50000,50000,1) +/obj/effect/holodeck_effect/random_book + +/obj/effect/holodeck_effect/random_book/activate(obj/machinery/computer/holodeck/father_holodeck) + var/static/banned_books = list(/obj/item/book/manual/random, /obj/item/book/manual/nuclear, /obj/item/book/manual/wiki) + var/newtype = pick(subtypesof(/obj/item/book/manual) - banned_books) + var/obj/item/book/manual/to_spawn = new newtype(loc) + to_spawn.flags_1 |= (HOLOGRAM_1 | NODECONSTRUCT_1) + return to_spawn /obj/effect/holodeck_effect/mobspawner var/mobtype = /mob/living/simple_animal/hostile/carp/holocarp - var/mob/mob = null + var/mob/our_mob = null /obj/effect/holodeck_effect/mobspawner/activate(var/obj/machinery/computer/holodeck/HC) if(islist(mobtype)) mobtype = pick(mobtype) - mob = new mobtype(loc) - mob.flags_1 |= HOLOGRAM_1 + our_mob = new mobtype(loc) + our_mob.flags_1 |= HOLOGRAM_1 // these vars are not really standardized but all would theoretically create stuff on death - for(var/v in list("butcher_results","corpse","weapon1","weapon2","blood_volume") & mob.vars) - mob.vars[v] = null - return mob + for(var/v in list("butcher_results","corpse","weapon1","weapon2","blood_volume") & our_mob.vars) + our_mob.vars[v] = null + RegisterSignal(our_mob, COMSIG_PARENT_QDELETING, .proc/handle_mob_delete) + return our_mob /obj/effect/holodeck_effect/mobspawner/deactivate(var/obj/machinery/computer/holodeck/HC) - if(mob) - HC.derez(mob) + if(our_mob) + HC.derez(our_mob) qdel(src) +/obj/effect/holodeck_effect/mobspawner/proc/handle_mob_delete(datum/source) + SIGNAL_HANDLER + our_mob = null + /obj/effect/holodeck_effect/mobspawner/pet mobtype = list( /mob/living/simple_animal/butterfly, /mob/living/simple_animal/chick/holo, @@ -101,7 +119,7 @@ /obj/effect/holodeck_effect/mobspawner/penguin mobtype = /mob/living/simple_animal/pet/penguin/emperor - + /obj/effect/holodeck_effect/mobspawner/penguin/Initialize() if(prob(1)) mobtype = /mob/living/simple_animal/pet/penguin/emperor/shamebrero @@ -109,3 +127,21 @@ /obj/effect/holodeck_effect/mobspawner/penguin_baby mobtype = /mob/living/simple_animal/pet/penguin/baby + +/obj/effect/holodeck_effect/mobspawner/cat + mobtype = /mob/living/simple_animal/pet/cat + +/obj/effect/holodeck_effect/mobspawner/butterfly + mobtype = /mob/living/simple_animal/butterfly + +/obj/effect/holodeck_effect/mobspawner/clown + mobtype = list (/mob/living/simple_animal/hostile/retaliate/clown = 10, + /mob/living/simple_animal/hostile/retaliate/clown/banana = 6, /mob/living/simple_animal/hostile/retaliate/clown/honkling = 6, + /mob/living/simple_animal/hostile/retaliate/clown/fleshclown = 3, /mob/living/simple_animal/hostile/retaliate/clown/longface = 3, + /mob/living/simple_animal/hostile/retaliate/clown/mutant = 1, /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob = 1) + +/obj/effect/holodeck_effect/mobspawner/psycho + mobtype = list (/mob/living/simple_animal/hostile/psycho/regular = 9, + /mob/living/simple_animal/hostile/psycho/muzzle = 3, + /mob/living/simple_animal/hostile/psycho/fast = 3, + /mob/living/simple_animal/hostile/psycho/trap = 1) diff --git a/code/modules/holodeck/holodeck_map_templates.dm b/code/modules/holodeck/holodeck_map_templates.dm new file mode 100644 index 0000000000000..f687d3e2fd6ba --- /dev/null +++ b/code/modules/holodeck/holodeck_map_templates.dm @@ -0,0 +1,165 @@ +// -------------------- +// -- HOLODECK TEMPLATES -- +// -------------------- + +/datum/map_template/holodeck + var/template_id = "id" + var/restricted = FALSE + var/datum/parsed_map/lastparsed + + should_place_on_top = FALSE + returns_created_atoms = TRUE + keep_cached_map = TRUE + + var/obj/machinery/computer/holodeck/linked + +/datum/map_template/holodeck/offline + name = "Holodeck - Offline" + template_id = "offline" + mappath = "_maps/holodeck/offline.dmm" + +/datum/map_template/holodeck/emptycourt + name = "Holodeck - Empty Court" + template_id = "emptycourt" + mappath = "_maps/holodeck/emptycourt.dmm" + +/datum/map_template/holodeck/dodgeball + name = "Holodeck - Dodgeball Court" + template_id = "dodgeball" + mappath = "_maps/holodeck/dodgeball.dmm" + +/datum/map_template/holodeck/basketball + name = "Holodeck - Basketball Court" + template_id = "basketball" + mappath = "_maps/holodeck/basketball.dmm" + +/datum/map_template/holodeck/thunderdome + name = "Holodeck - Thunderdome Arena" + template_id = "thunderdome" + mappath = "_maps/holodeck/thunderdome.dmm" + +/datum/map_template/holodeck/beach + name = "Holodeck - Beach" + template_id = "beach" + mappath = "_maps/holodeck/beach.dmm" + +/datum/map_template/holodeck/lounge + name = "Holodeck - Lounge" + template_id = "lounge" + mappath = "_maps/holodeck/lounge.dmm" + +/datum/map_template/holodeck/petpark + name = "Holodeck - Pet Park" + template_id = "petpark" + mappath = "_maps/holodeck/petpark.dmm" + +/datum/map_template/holodeck/firingrange + name = "Holodeck - Firing Range" + template_id = "firingrange" + mappath = "_maps/holodeck/firingrange.dmm" + +/datum/map_template/holodeck/anime_school + name = "Holodeck - Anime School" + template_id = "animeschool" + mappath = "_maps/holodeck/animeschool.dmm" + +/datum/map_template/holodeck/chapelcourt + name = "Holodeck - Chapel Courtroom" + template_id = "chapelcourt" + mappath = "_maps/holodeck/chapelcourt.dmm" + +/datum/map_template/holodeck/spacechess + name = "Holodeck - Space Chess" + template_id = "spacechess" + mappath = "_maps/holodeck/spacechess.dmm" + +/datum/map_template/holodeck/spacecheckers + name = "Holodeck - Space Checkers" + template_id = "spacecheckers" + mappath = "_maps/holodeck/spacecheckers.dmm" + +/datum/map_template/holodeck/kobayashi + name = "Holodeck - Kobayashi Maru" + template_id = "kobayashi" + mappath = "_maps/holodeck/kobayashi.dmm" + +/datum/map_template/holodeck/winterwonderland + name = "Holodeck - Winter Wonderland" + template_id = "winterwonderland" + mappath = "_maps/holodeck/winterwonderland.dmm" + +/datum/map_template/holodeck/photobooth + name = "Holodeck - Photobooth" + template_id = "photobooth" + mappath = "_maps/holodeck/photobooth.dmm" + +/datum/map_template/holodeck/skatepark + name = "Holodeck - Skatepark" + template_id = "skatepark" + mappath = "_maps/holodeck/skatepark.dmm" + +/datum/map_template/holodeck/teahouse + name = "Holodeck - Japanese Tea House" + template_id = "holodeck_teahouse" + mappath = "_maps/templates/holodeck_teahouse.dmm" + +/datum/map_template/holodeck/kitchen + name = "Holodeck - Holo-Kitchen" + template_id = "holodeck_kitchen" + mappath = "_maps/templates/holodeck_kitchen.dmm" + +//bad evil no good programs + +/datum/map_template/holodeck/medicalsim + name = "Holodeck - Emergency Medical" + template_id = "medicalsim" + mappath = "_maps/holodeck/medicalsim.dmm" + restricted = TRUE + +/datum/map_template/holodeck/thunderdome1218 + name = "Holodeck - 1218 AD" + template_id = "thunderdome1218" + mappath = "_maps/holodeck/thunderdome1218.dmm" + restricted = TRUE + +/datum/map_template/holodeck/burntest + name = "Holodeck - Atmospheric Burn Test" + template_id = "burntest" + mappath = "_maps/holodeck/burntest.dmm" + restricted = TRUE + +/datum/map_template/holodeck/wildlifesim + name = "Holodeck - Wildlife Simulation" + template_id = "wildlifesim" + mappath = "_maps/holodeck/wildlifesim.dmm" + restricted = TRUE + +/datum/map_template/holodeck/holdoutbunker + name = "Holodeck - Holdout Bunker" + template_id = "holdoutbunker" + mappath = "_maps/holodeck/holdoutbunker.dmm" + restricted = TRUE + +/datum/map_template/holodeck/anthophillia + name = "Holodeck - Anthophillia" + template_id = "anthophillia" + mappath = "_maps/holodeck/anthophillia.dmm" + restricted = TRUE + +/datum/map_template/holodeck/refuelingstation + name = "Holodeck - Refueling Station" + template_id = "refuelingstation" + mappath = "_maps/holodeck/refuelingstation.dmm" + restricted = TRUE + +/datum/map_template/holodeck/asylum + name = "Holodeck - Asylum" + template_id = "holodeck_asylum" + mappath = "_maps/templates/holodeck_asylum.dmm" + restricted = TRUE + +/datum/map_template/holodeck/clownworld + name = "Holodeck - Clown World" + template_id = "holodeck_clownworld" + mappath = "_maps/templates/holodeck_clownworld.dmm" + restricted = TRUE diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index 27685f242b385..9bcf8513db529 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -227,3 +227,20 @@ /obj/item/paper/fluff/holodeck/disclaimer name = "Holodeck Disclaimer" info = "Bruises sustained in the holodeck can be healed simply by sleeping." + +/obj/vehicle/ridden/scooter/skateboard/pro/holodeck + name = "holographic skateboard" + desc = "A holographic copy of the EightO brand professional skateboard." + instability = 6 + +/obj/vehicle/ridden/scooter/skateboard/pro/holodeck/screwdriver_act(mob/living/user, obj/item/I) + return FALSE + +/obj/vehicle/ridden/scooter/skateboard/pro/holodeck/pick_up_board() //picking up normal skateboards spawned in the holodeck gets rid of the holo flag, now you cant pick them up. + return + +/obj/vehicle/ridden/scooter/skateboard/pro/holodeck/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/stack/rods)) + return + else + return ..() diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index f8b9e3587e52e..a482ed877febf 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -1,7 +1,9 @@ /turf/open/floor/holofloor icon_state = "floor" + holodeck_compatible = TRUE thermal_conductivity = 0 flags_1 = NONE + var/direction = SOUTH /turf/open/floor/holofloor/attackby(obj/item/I, mob/living/user) return // HOLOFLOOR DOES NOT GIVE A FUCK @@ -19,6 +21,30 @@ name = "holodeck projector floor" icon_state = "engine" +/turf/open/floor/holofloor/chapel + name = "chapel floor" + icon_state = "chapel" + +/turf/open/floor/holofloor/chapel/bottom_left + direction = WEST + +/turf/open/floor/holofloor/chapel/top_right + direction = EAST + +/turf/open/floor/holofloor/chapel/bottom_right + +/turf/open/floor/holofloor/chapel/top_left + direction = NORTH + +/turf/open/floor/holofloor/chapel/Initialize(mapload) + . = ..() + if (direction != SOUTH) + setDir(direction) + +/turf/open/floor/holofloor/white + name = "white floor" + icon_state = "white" + /turf/open/floor/holofloor/plating/burnmix name = "burn-mix floor" initial_gas_mix = BURNMIX_ATMOS @@ -142,3 +168,14 @@ icon = 'icons/turf/floors.dmi' icon_state = "asteroid" tiled_dirt = FALSE + +/turf/open/floor/holofloor/dark + icon_state = "darkfull" + +/turf/open/floor/holofloor/clown + icon_state = "bananium" + +/turf/open/floor/holofloor/white + name = "white floor" + desc = "A tile in a pure white color." + icon_state = "pure_white" diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index 38dd8b48e0029..8dbdc997c482a 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -16,9 +16,7 @@ /mob/living/carbon/human/bee_friendly() - if(dna?.species?.id == "pod") //bees pollinate plants, duh. - return 1 - if (wear_suit && head && istype(wear_suit, /obj/item/clothing) && istype(head, /obj/item/clothing)) + if (wear_suit && head && isclothing(wear_suit) && isclothing(head)) var/obj/item/clothing/CS = wear_suit var/obj/item/clothing/CH = head if (CS.clothing_flags & CH.clothing_flags & THICKMATERIAL) @@ -208,7 +206,7 @@ continue if(B.loc == src) B.forceMove(drop_location()) - B.target = user + B.GiveTarget(user) bees = TRUE if(bees) visible_message("[user] disturbs the bees!") diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index f0342c7c847b3..e4b2483355803 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -32,13 +32,20 @@ /obj/machinery/biogenerator/contents_explosion(severity, target) ..() if(beaker) - beaker.ex_act(severity, target) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += beaker + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += beaker + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += beaker /obj/machinery/biogenerator/handle_atom_del(atom/A) ..() if(A == beaker) beaker = null update_icon() + ui_update() /obj/machinery/biogenerator/RefreshParts() var/E = 0 @@ -56,7 +63,7 @@ /obj/machinery/biogenerator/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Productivity at [productivity*100]%.
Matter consumption reduced by [(efficiency*25)-25]%.
Machine can hold up to [max_items] pieces of produce." + . += "The status display reads: Productivity at [productivity*100]%.
Matter consumption reduced by [(efficiency*25)-25]%.
Machine can hold up to [max_items] pieces of produce.
" /obj/machinery/biogenerator/on_reagent_change(changetype) //When the reagents change, change the icon as well. update_icon() @@ -85,6 +92,7 @@ var/obj/item/reagent_containers/glass/B = beaker B.forceMove(drop_location()) beaker = null + ui_update() update_icon() return @@ -102,6 +110,7 @@ beaker = O to_chat(user, "You add the container to the machine.") update_icon() + ui_update() else to_chat(user, "Close the maintenance panel first.") return @@ -125,6 +134,7 @@ to_chat(user, "You empty the plant bag into the biogenerator, filling it to its capacity.") else to_chat(user, "You fill the biogenerator to its capacity.") + ui_update() return TRUE //no afterattack else if(istype(O, /obj/item/reagent_containers/food/snacks/grown)) @@ -136,24 +146,26 @@ else if(user.transferItemToLoc(O, src)) to_chat(user, "You put [O.name] in [src.name]") + ui_update() return TRUE //no afterattack else 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.") processing = TRUE + ui_update() var/obj/item/disk/design_disk/D = O if(do_after(user, 10, target = src)) for(var/B in D.blueprints) if(B) stored_research.add_design(B) processing = FALSE + ui_update() return TRUE else to_chat(user, "You cannot put this in [src.name]!") /obj/machinery/biogenerator/AltClick(mob/living/user) - . = ..() if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK) && can_interact(user)) detach(user) @@ -176,16 +188,20 @@ S += 5 if(I.reagents.get_reagent_amount(/datum/reagent/consumable/nutriment) < 0.1) points += 1 * productivity + ui_update() else points += I.reagents.get_reagent_amount(/datum/reagent/consumable/nutriment) * 10 * productivity + ui_update() qdel(I) if(S) processing = TRUE + ui_update() update_icon() playsound(loc, 'sound/machines/blender.ogg', 50, TRUE) use_power(S * 30) sleep(S + 15 / productivity) processing = FALSE + ui_update() update_icon() /obj/machinery/biogenerator/proc/check_cost(list/materials, multiplier = 1, remove_points = TRUE) @@ -196,6 +212,7 @@ else if(remove_points) points -= materials[getmaterialref(/datum/material/biomass)]*multiplier/efficiency + ui_update() update_icon() return TRUE @@ -245,6 +262,7 @@ beaker.forceMove(drop_location()) beaker = null update_icon() + ui_update() /obj/machinery/biogenerator/ui_status(mob/user) if(stat & BROKEN || panel_open) diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index cdcca86bd5e3e..058a65e57dba7 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -15,7 +15,7 @@ var/list/trait_genes = list() var/datum/plant_gene/target - var/operation = "" + var/operation = null var/max_potency = 50 // See RefreshParts() for how these work var/max_yield = 2 var/min_production = 12 @@ -23,6 +23,8 @@ var/min_wchance = 67 var/min_wrate = 10 + var/skip_confirmation = FALSE + /obj/machinery/plantgenes/RefreshParts() // Comments represent the max you can set per tier, respectively. seeds.dm [219] clamps these for us but we don't want to mislead the viewer. for(var/obj/item/stock_parts/manipulator/M in component_parts) if(M.rating > 3) @@ -52,6 +54,7 @@ max_endurance = 100 min_wchance = 0 min_wrate = 0 + ui_update() /obj/machinery/plantgenes/update_icon() ..() @@ -97,163 +100,148 @@ else ..() -/obj/machinery/plantgenes/ui_interact(mob/user) - . = ..() - if(!user) +/obj/machinery/plantgenes/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "PlantDNAManipulator") + ui.open() + +/obj/machinery/plantgenes/ui_data(mob/user) + var/list/data = list() + . = data + + data["seed"] = seed?.name + data["disk"] = null + data["disk_gene"] = null + data["disk_readonly"] = FALSE + data["disk_canadd"] = TRUE + + data["operation"] = operation + data["operation_target"] = build_gene(target) + + if(disk) + data["disk_readonly"] = disk.read_only + if(disk.gene) + data["disk_gene"] = build_gene(disk.gene) + data["disk"] = disk.gene.get_name() + if(seed) + data["disk_canadd"] = disk.gene.can_add(seed) + else + data["disk"] = "Empty disk" + if(disk.read_only) + data["disk"] += " (RO)" + + data["core_genes"] = build_gene_list(core_genes, /datum/plant_gene/core) + data["reagent_genes"] = build_gene_list(reagent_genes, /datum/plant_gene/reagent) + data["trait_genes"] = build_gene_list(trait_genes, /datum/plant_gene/trait) + + data["machine_stats"] = build_machine_stats() + data["skip_confirmation"] = skip_confirmation + +/obj/machinery/plantgenes/proc/build_machine_stats() + var/list/L = list() + . = L + + L["potency"] = list("max", max_potency) + L["yield"] = list("max", max_yield) + L["production speed"] = list("min", min_production) + L["endurance"] = list("max", max_endurance) + L["lifespan"] = list("max", max_endurance) + L["weed growth rate"] = list("min", min_wrate) + L["weed vulnerability"] = list("min", min_wchance) + +/obj/machinery/plantgenes/proc/build_gene_list(list/genes, filter_type) + var/list/L = list() + . = L + + for(var/datum/plant_gene/gene in genes) + L += list(build_gene(gene, filter_type)) + +/obj/machinery/plantgenes/proc/get_gene_id(datum/plant_gene/gene) + if(istype(gene, /datum/plant_gene/core)) + var/datum/plant_gene/core/core_gene = gene + return "core[core_gene.type]" + if(istype(gene, /datum/plant_gene/reagent)) + var/datum/plant_gene/reagent/reagent_gene = gene + return "reagent[reagent_gene.reagent_id]" + if(istype(gene, /datum/plant_gene/trait)) + var/datum/plant_gene/trait/trait_gene = gene + return "trait[trait_gene.type]" + + return "unknown/[gene.name]" + +/obj/machinery/plantgenes/proc/build_gene(datum/plant_gene/gene, filter_type) + if(!gene) return - var/datum/browser/popup = new(user, "plantdna", "Plant DNA Manipulator", 450, 600) - if(!(in_range(src, user) || issilicon(user))) - popup.close() + if(filter_type && !istype(gene, filter_type)) return - var/dat = "" + var/list/L = list() + . = L - if(operation) - if(!seed || (!target && operation != "insert")) - operation = "" - target = null - interact(user) - return - if((operation == "replace" || operation == "insert") && (!disk || !disk.gene)) - operation = "" - target = null - interact(user) - return + L["name"] = gene.get_name() - dat += "

Confirm Operation

" - dat += "
Are you sure you want to [operation] " - switch(operation) - if("remove") - dat += "[target.get_name()] gene from \the [seed]?
" - if("extract") - dat += "[target.get_name()] gene from \the [seed]?
" - dat += "The sample will be destroyed in process!" - if(istype(target, /datum/plant_gene/core)) - var/datum/plant_gene/core/gene = target - if(istype(target, /datum/plant_gene/core/potency)) - if(gene.value > max_potency) - dat += "

This device's extraction capabilities are currently limited to [max_potency] potency. " - dat += "Target gene will be degraded to [max_potency] potency on extraction." - else if(istype(target, /datum/plant_gene/core/lifespan)) - if(gene.value > max_endurance) - dat += "

This device's extraction capabilities are currently limited to [max_endurance] lifespan. " - dat += "Target gene will be degraded to [max_endurance] Lifespan on extraction." - else if(istype(target, /datum/plant_gene/core/endurance)) - if(gene.value > max_endurance) - dat += "

This device's extraction capabilities are currently limited to [max_endurance] endurance. " - dat += "Target gene will be degraded to [max_endurance] endurance on extraction." - else if(istype(target, /datum/plant_gene/core/yield)) - if(gene.value > max_yield) - dat += "

This device's extraction capabilities are currently limited to [max_yield] yield. " - dat += "Target gene will be degraded to [max_yield] yield on extraction." - else if(istype(target, /datum/plant_gene/core/production)) - if(gene.value < min_production) - dat += "

This device's extraction capabilities are currently limited to [min_production] production. " - dat += "Target gene will be degraded to [min_production] production on extraction." - else if(istype(target, /datum/plant_gene/core/weed_rate)) - if(gene.value < min_wrate) - dat += "

This device's extraction capabilities are currently limited to [min_wrate] weed rate. " - dat += "Target gene will be degraded to [min_wrate] weed rate on extraction." - else if(istype(target, /datum/plant_gene/core/weed_chance)) - if(gene.value < min_wchance) - dat += "

This device's extraction capabilities are currently limited to [min_wchance] weed chance. " - dat += "Target gene will be degraded to [min_wchance] weed chance on extraction." - - if("replace") - dat += "[target.get_name()] gene with [disk.gene.get_name()]?
" - if("insert") - dat += "[disk.gene.get_name()] gene into \the [seed]?
" - dat += "
Confirm " - dat += "Abort
" - popup.set_content(dat) - popup.open() - return + L["extractable"] = gene.mutability_flags & PLANT_GENE_EXTRACTABLE + L["removable"] = gene.mutability_flags & PLANT_GENE_REMOVABLE - dat+= "
" + if(istype(gene, /datum/plant_gene/core)) + var/datum/plant_gene/core/core_gene = gene - dat += "" + L["type"] = "core" + L["stat"] = core_gene.name + L["id"] = get_gene_id(gene) + L["value"] = core_gene.value - dat += "" + if(istype(gene, /datum/plant_gene/reagent)) + var/datum/plant_gene/reagent/reagent_gene = gene - dat += "
" + L["type"] = "reagent" + L["id"] = get_gene_id(gene) + L["rate"] = reagent_gene.rate - if(seed) - var/can_insert = disk && disk.gene && disk.gene.can_add(seed) - var/can_extract = disk && !disk.read_only + if(istype(gene, /datum/plant_gene/trait)) + var/datum/plant_gene/trait/trait_gene = gene - dat += "

Core Genes

" - for(var/a in core_genes) - var/datum/plant_gene/G = a - if(!G) - continue - dat += "" - dat += "
[G.get_name()]" - if(can_extract && G.mutability_flags & PLANT_GENE_EXTRACTABLE) - dat += "Extract" - if(can_insert && istype(disk.gene, G.type) && G.mutability_flags & PLANT_GENE_REMOVABLE) - dat += "Replace" - dat += "
" - - if(seed.yield != -1) - dat += "

Content Genes

" - if(reagent_genes.len) - dat += "" - for(var/a in reagent_genes) - var/datum/plant_gene/G = a - dat += "" - dat += "
[G.get_name()]" - if(can_extract && G.mutability_flags & PLANT_GENE_EXTRACTABLE) - dat += "Extract" - if(G.mutability_flags & PLANT_GENE_REMOVABLE) - dat += "Remove" - dat += "
" - else - dat += "No content-related genes detected in sample.
" - dat += "
" - if(can_insert && istype(disk.gene, /datum/plant_gene/reagent)) - dat += "Insert: [disk.gene.get_name()]" - - dat += "

Trait Genes

" - if(trait_genes.len) - dat += "" - for(var/a in trait_genes) - var/datum/plant_gene/G = a - dat += "" - dat += "
[G.get_name()]" - if(can_extract && G.mutability_flags & PLANT_GENE_EXTRACTABLE) - dat += "Extract" - if(G.mutability_flags & PLANT_GENE_REMOVABLE) - dat += "Remove" - dat += "
" - else - dat += "No trait-related genes detected in sample.
" - if(can_insert && istype(disk.gene, /datum/plant_gene/trait)) - dat += "Insert: [disk.gene.get_name()]" - dat += "
" - else - dat += "
No sample found.
Please, insert a plant sample to use this device." - popup.set_content(dat) - popup.open() + L["type"] = "trait" + L["id"] = get_gene_id(gene) + L["trait_id"] = trait_gene.trait_id + +/obj/machinery/plantgenes/ui_static_data(mob/user) + var/list/data = list() + + data["stat_tooltips"] = list( + potency = "The 'power' of a plant. Generally effects the amount of reagent in a plant.", + yield = "The amount of crop yielded from a harvest", + "production speed" = "The speed at which a plant grows. Lower is better.", + endurance = "The amount of health the plant has", + lifespan = "The time it takes before the plant starts dying of old age", + "weed vulnerability" = "The vulnerability of the plant to weeds growing", + "weed growth rate" = "The speed at which weeds can grow around the plant. The higher the faster they grow.", + ) + return data -/obj/machinery/plantgenes/Topic(var/href, var/list/href_list) +/obj/machinery/plantgenes/proc/find_gene_by_id(var/gene_id) + for(var/datum/plant_gene/gene in core_genes) + if(get_gene_id(gene) == gene_id) + return gene + for(var/datum/plant_gene/gene in reagent_genes) + if(get_gene_id(gene) == gene_id) + return gene + for(var/datum/plant_gene/gene in trait_genes) + if(get_gene_id(gene) == gene_id) + return gene + +/obj/machinery/plantgenes/ui_act(action, params) if(..()) return - usr.set_machine(src) - if(href_list["eject_seed"] && !operation) + if(action == "toggle_skip_confirmation") + skip_confirmation = !skip_confirmation + . = TRUE + + if(action == "eject_insert_seed") var/obj/item/I = usr.get_active_held_item() if(istype(I, /obj/item/seeds)) if(!usr.transferItemToLoc(I, src)) @@ -261,9 +249,11 @@ eject_seed() insert_seed(I) to_chat(usr, "You add [I] to the machine.") + . = TRUE else - eject_seed() - else if(href_list["eject_disk"] && !operation) + . = eject_seed() + + if(action == "eject_insert_disk") var/obj/item/I = usr.get_active_held_item() if(istype(I, /obj/item/disk/plantgene)) if(!usr.transferItemToLoc(I, src)) @@ -271,86 +261,104 @@ eject_disk() disk = I to_chat(usr, "You add [I] to the machine.") + . = TRUE else - eject_disk() - else if(href_list["op"] == "insert" && disk && disk.gene && seed) - if(!operation) // Wait for confirmation - operation = "insert" - else - if(!istype(disk.gene, /datum/plant_gene/core) && disk.gene.can_add(seed)) - seed.genes += disk.gene.Copy() - if(istype(disk.gene, /datum/plant_gene/reagent)) - seed.reagents_from_genes() - update_genes() - repaint_seed() - operation = "" - target = null + . = eject_disk() - else if(href_list["gene"] && seed) - var/datum/plant_gene/G = seed.get_gene(href_list["gene"]) - if(!G || !href_list["op"] || !(href_list["op"] in list("remove", "extract", "replace"))) - interact(usr) - return - - if(!operation || target != G) // Wait for confirmation + if(seed) + if(action == "remove") + var/datum/plant_gene/G = find_gene_by_id(params["gene_id"]) + if(!G) + return FALSE + operation = action target = G - operation = href_list["op"] - - else if(operation == href_list["op"] && target == G) - switch(href_list["op"]) - if("remove") - if(!istype(G, /datum/plant_gene/core)) - seed.genes -= G - if(istype(G, /datum/plant_gene/reagent)) - seed.reagents_from_genes() - repaint_seed() - if("extract") - if(disk && !disk.read_only) - disk.gene = G - if(istype(G, /datum/plant_gene/core)) - var/datum/plant_gene/core/gene = G - if(istype(G, /datum/plant_gene/core/potency)) - gene.value = min(gene.value, max_potency) - else if(istype(G, /datum/plant_gene/core/lifespan)) - gene.value = min(gene.value, max_endurance) //INTENDED - else if(istype(G, /datum/plant_gene/core/endurance)) - gene.value = min(gene.value, max_endurance) - else if(istype(G, /datum/plant_gene/core/production)) - gene.value = max(gene.value, min_production) - else if(istype(G, /datum/plant_gene/core/yield)) - gene.value = min(gene.value, max_yield) - else if(istype(G, /datum/plant_gene/core/weed_rate)) - gene.value = max(gene.value, min_wrate) - else if(istype(G, /datum/plant_gene/core/weed_chance)) - gene.value = max(gene.value, min_wchance) - disk.update_name() - qdel(seed) - seed = null - update_icon() - if("replace") - if(disk && disk.gene && istype(disk.gene, G.type) && istype(G, /datum/plant_gene/core)) - seed.genes -= G - var/datum/plant_gene/core/C = disk.gene.Copy() - seed.genes += C - C.apply_stat(seed) - repaint_seed() - if("insert") - if(disk && disk.gene && !istype(disk.gene, /datum/plant_gene/core) && disk.gene.can_add(seed)) - seed.genes += disk.gene.Copy() - if(istype(disk.gene, /datum/plant_gene/reagent)) - seed.reagents_from_genes() - disk.gene.apply_vars(seed) - repaint_seed() - - - update_genes() - operation = "" + . = TRUE + + if(action == "extract") + var/datum/plant_gene/G = find_gene_by_id(params["gene_id"]) + if(!G) + return FALSE + if(disk && !disk.read_only) + operation = action + target = G + . = TRUE + + if(action == "replace") + var/datum/plant_gene/G = find_gene_by_id(params["gene_id"]) + if(!G) + return FALSE + if(disk && disk.gene && istype(disk.gene, G.type) && istype(G, /datum/plant_gene/core)) + operation = action + target = G + . = TRUE + + if(action == "insert" && !istype(disk.gene, /datum/plant_gene/core) && disk.gene.can_add(seed)) + operation = action target = null - else if(href_list["abort"]) - operation = "" + . = TRUE + + if((action == "confirm" || (. && skip_confirmation)) && operation) + if(operation == "remove") + var/datum/plant_gene/G = target + if(G) + if(!istype(G, /datum/plant_gene/core)) + seed.genes -= G + if(istype(G, /datum/plant_gene/reagent)) + seed.reagents_from_genes() + repaint_seed() + + if(operation == "extract") + var/datum/plant_gene/G = target + if(G && disk && !disk.read_only) + disk.gene = G + if(istype(G, /datum/plant_gene/core)) + var/datum/plant_gene/core/gene = G + if(istype(G, /datum/plant_gene/core/potency)) + gene.value = min(gene.value, max_potency) + else if(istype(G, /datum/plant_gene/core/lifespan)) + gene.value = min(gene.value, max_endurance) //INTENDED + else if(istype(G, /datum/plant_gene/core/endurance)) + gene.value = min(gene.value, max_endurance) + else if(istype(G, /datum/plant_gene/core/production)) + gene.value = max(gene.value, min_production) + else if(istype(G, /datum/plant_gene/core/yield)) + gene.value = min(gene.value, max_yield) + else if(istype(G, /datum/plant_gene/core/weed_rate)) + gene.value = max(gene.value, min_wrate) + else if(istype(G, /datum/plant_gene/core/weed_chance)) + gene.value = max(gene.value, min_wchance) + disk.update_name() + qdel(seed) + seed = null + + if(operation == "replace") + var/datum/plant_gene/G = target + if(G && disk && disk.gene && istype(disk.gene, G.type) && istype(G, /datum/plant_gene/core)) + seed.genes -= G + var/datum/plant_gene/core/C = disk.gene.Copy() + seed.genes += C + C.apply_stat(seed) + repaint_seed() + + if(operation == "insert" && !istype(disk.gene, /datum/plant_gene/core) && disk.gene.can_add(seed)) + seed.genes += disk.gene.Copy() + if(istype(disk.gene, /datum/plant_gene/reagent)) + seed.reagents_from_genes() + repaint_seed() + + operation = null target = null + . = TRUE - interact(usr) + if(action == "abort" && operation) + operation = null + target = null + . = TRUE + + + if(.) + update_genes() + update_icon() /obj/machinery/plantgenes/proc/insert_seed(obj/item/seeds/S) if(!istype(S) || seed) @@ -359,6 +367,7 @@ seed = S update_genes() update_icon() + ui_update() /obj/machinery/plantgenes/proc/eject_disk() if (disk && !operation) @@ -369,6 +378,8 @@ disk.forceMove(drop_location()) disk = null update_genes() + ui_update() + . = TRUE /obj/machinery/plantgenes/proc/eject_seed() if (seed && !operation) @@ -379,6 +390,8 @@ seed.forceMove(drop_location()) seed = null update_genes() + ui_update() + . = TRUE /obj/machinery/plantgenes/proc/update_genes() core_genes = list() @@ -411,6 +424,7 @@ return // Already modded name and icon seed.name = "experimental " + seed.name seed.icon_state = "seed-x" + ui_update() // Gene modder for seed vault ship, built with high tech alien parts. /obj/machinery/plantgenes/seedvault diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 8ca883af88941..1adba2432014a 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -117,15 +117,11 @@ if(seed) for(var/datum/plant_gene/trait/trait in seed.genes) trait.on_squash(src, target) - if(!seed.get_gene(/datum/plant_gene/trait/noreact)) - reagents.reaction(T) - for(var/A in T) - reagents.reaction(A) - qdel(src) - if(seed.get_gene(/datum/plant_gene/trait/noreact)) - visible_message("[src] crumples, and bubbles ominously as its contents mix.") - addtimer(CALLBACK(src, .proc/squashreact), 20) - + reagents.reaction(T) + for(var/A in T) + reagents.reaction(A) + qdel(src) + /obj/item/reagent_containers/food/snacks/grown/proc/squashreact() for(var/datum/plant_gene/trait/trait in seed.genes) trait.on_squashreact(src) @@ -180,6 +176,7 @@ var/obj/item/T if(trash) T = generate_trash() + T.remove_item_from_storage(get_turf(T)) qdel(src) - user.putItemFromInventoryInHandIfPossible(T, user.active_hand_index, TRUE) + user.put_in_hands(T, FALSE) to_chat(user, "You open [src]\'s shell, revealing \a [T].") diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index 886386a69fb46..c1c9d5563fa93 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/berry, /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 @@ -121,8 +121,9 @@ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' icon_grow = "cherry-grow" icon_dead = "cherry-dead" + icon_harvest = "cherry-harvest" genes = list(/datum/plant_gene/trait/repeated_harvest) - mutatelist = list(/obj/item/seeds/cherry/blue) + mutatelist = list(/obj/item/seeds/cherry/blue, /obj/item/seeds/cherry/bulb) reagents_add = list(/datum/reagent/consumable/nutriment = 0.07, /datum/reagent/consumable/sugar = 0.07) /obj/item/reagent_containers/food/snacks/grown/cherries @@ -162,6 +163,31 @@ tastes = list("blue cherry" = 1) wine_power = 50 +//Cherry Bulbs +/obj/item/seeds/cherry/bulb + name = "pack of cherry bulb pits" + desc = "The glowy kind of cherries." + icon_state = "seed-cherrybulb" + species = "cherrybulb" + plantname = "Cherry Bulb Tree" + product = /obj/item/reagent_containers/food/snacks/grown/cherrybulbs + genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/pink) + mutatelist = list() + reagents_add = list(/datum/reagent/consumable/nutriment = 0.07, /datum/reagent/consumable/sugar = 0.07) + rarity = 10 + +/obj/item/reagent_containers/food/snacks/grown/cherrybulbs + seed = /obj/item/seeds/cherry/bulb + name = "cherry bulbs" + desc = "They're like little Space Christmas lights!" + icon_state = "cherry_bulb" + filling_color = "#FF0000" + bitesize_mod = 2 + foodtype = FRUIT + grind_results = list(/datum/reagent/consumable/cherryjelly = 0) + tastes = list("cherry" = 1) + wine_power = 50 + // Grapes /obj/item/seeds/grape name = "pack of grape seeds" diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index a7e571d7c1d3f..cadc2d1325fe2 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -61,6 +61,7 @@ species = "ocannabis" plantname = "Omega Weed" product = /obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate + genes = list(/datum/plant_gene/trait/glow/green) mutatelist = list() reagents_add = list(/datum/reagent/drug/space_drugs = 0.3, /datum/reagent/toxin/mindbreaker = 0.3, diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm index 0522b5fd45434..d50a22362128a 100644 --- a/code/modules/hydroponics/grown/chili.dm +++ b/code/modules/hydroponics/grown/chili.dm @@ -88,13 +88,13 @@ held_mob = loc START_PROCESSING(SSobj, src) -/obj/item/reagent_containers/food/snacks/grown/ghost_chili/process() +/obj/item/reagent_containers/food/snacks/grown/ghost_chili/process(delta_time) if(held_mob && loc == held_mob) if(held_mob.is_holding(src)) if(istype(held_mob) && held_mob.gloves) return - held_mob.adjust_bodytemperature(15 * TEMPERATURE_DAMAGE_COEFFICIENT) - if(prob(10)) + held_mob.adjust_bodytemperature(7.5 * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time) + if(DT_PROB(5, delta_time)) to_chat(held_mob, "Your hand holding [src] burns!") else held_mob = null diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index 99de8b92d668f..d500578af11b2 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -135,7 +135,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/cotton.dm b/code/modules/hydroponics/grown/cotton.dm index 3fa4247f578a3..a898b76ee884f 100644 --- a/code/modules/hydroponics/grown/cotton.dm +++ b/code/modules/hydroponics/grown/cotton.dm @@ -32,7 +32,7 @@ var/cotton_name = "raw cotton" /obj/item/grown/cotton/attack_self(mob/user) - user.show_message("You pull some [cotton_name] out of the [name]!", 1) + user.show_message("You pull some [cotton_name] out of the [name]!", MSG_VISUAL) var/seed_modifier = 0 if(seed) seed_modifier = round(seed.potency / 25) @@ -76,4 +76,4 @@ throw_range = 3 attack_verb = list("bashed", "battered", "bludgeoned", "whacked") cotton_type = /obj/item/stack/sheet/cotton/durathread - cotton_name = "raw durathread" \ No newline at end of file + cotton_name = "raw durathread" diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index 2be0cb14a3655..2cb3691e477eb 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -36,19 +36,21 @@ species = "lily" plantname = "Lily Plants" product = /obj/item/reagent_containers/food/snacks/grown/poppy/lily + icon_grow = "lily-grow" + icon_dead = "lily-dead" mutatelist = list(/obj/item/seeds/poppy/lily/trumpet) /obj/item/reagent_containers/food/snacks/grown/poppy/lily seed = /obj/item/seeds/poppy/lily name = "lily" - desc = "A beautiful orange flower." + desc = "A beautiful white flower with rich symbolism. The lily is said to represent love and affection as well as purity and innocence in some cultures." icon_state = "lily" - filling_color = "#FFA500" + filling_color = "#fff8ea" - //Spacemans's Trumpet +//Spacemans's Trumpet /obj/item/seeds/poppy/lily/trumpet name = "pack of spaceman's trumpet seeds" - desc = "A plant sculped by extensive genetic engineering. The spaceman's trumpet is said to bear no resemblance to its wild ancestors. Inside NT AgriSci circles it is better known as NTPW-0372." + desc = "A plant sculpted by extensive genetic engineering. The spaceman's trumpet is said to bear no resemblance to its wild ancestors. Inside NT AgriSci circles it is better known as NTPW-0372." icon_state = "seed-trumpet" species = "spacemanstrumpet" plantname = "Spaceman's Trumpet Plant" @@ -80,7 +82,7 @@ name = "spaceman's trumpet" desc = "A vivid flower that smells faintly of freshly cut grass. Touching the flower seems to stain the skin some time after contact, yet most other surfaces seem to be unaffected by this phenomenon." icon_state = "spacemanstrumpet" - filling_color = "#FF6347" + filling_color = "#8324f0" bitesize_mod = 3 foodtype = VEGETABLES @@ -92,14 +94,41 @@ species = "geranium" plantname = "Geranium Plants" product = /obj/item/reagent_containers/food/snacks/grown/poppy/geranium - mutatelist = list() + icon_grow = "geranium-grow" + icon_dead = "geranium-dead" + mutatelist = list(/obj/item/seeds/poppy/geranium/forgetmenot) /obj/item/reagent_containers/food/snacks/grown/poppy/geranium seed = /obj/item/seeds/poppy/geranium name = "geranium" - desc = "A beautiful blue flower." + desc = "A cluster of small purple geranium flowers. They symbolize happiness, good health, wishes and friendship and are generally associated with positive emotions." icon_state = "geranium" - filling_color = "#008B8B" + filling_color = "#9325ee" + +//Forget-Me-Not +/obj/item/seeds/poppy/geranium/forgetmenot + name = "pack of forget-me-not seeds" + desc = "These seeds grow into forget-me-nots." + icon_state = "seed-forget_me_not" + species = "forget_me_not" + plantname = "Forget-Me-Not Plants" + product = /obj/item/reagent_containers/food/snacks/grown/poppy/geranium/forgetmenot + endurance = 30 + maturation = 5 + yield = 4 + potency = 25 + icon_grow = "forget_me_not-grow" + icon_dead = "forget_me_not-dead" + mutatelist = list() + reagents_add = list(/datum/reagent/medicine/kelotane = 0.2, /datum/reagent/consumable/nutriment = 0.05) + +/obj/item/reagent_containers/food/snacks/grown/poppy/geranium/forgetmenot + seed = /obj/item/seeds/poppy/geranium/forgetmenot + name = "forget-me-not" + desc = "A clump of small blue flowers, they are primarily associated with rememberance, respect and loyalty." + icon_state = "forget_me_not" + filling_color = "#4466ff" + bitesize_mod = 2 // Harebell /obj/item/seeds/harebell @@ -179,6 +208,7 @@ icon_grow = "moonflower-grow" icon_dead = "sunflower-dead" product = /obj/item/reagent_containers/food/snacks/grown/moonflower + genes = list(/datum/plant_gene/trait/glow/purple) mutatelist = list() reagents_add = list(/datum/reagent/consumable/ethanol/moonshine = 0.2,/datum/reagent/medicine/morphine = 0.3, /datum/reagent/consumable/nutriment = 0.02) rarity = 20 @@ -252,5 +282,4 @@ ..() if(!user.gloves) to_chat(user, "The [name] burns your bare hand!") - user.adjustFireLoss(rand(1, 5)) - + user.adjustFireLoss(rand(1, 5)) \ No newline at end of file diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index bbaccbc437dd0..55dad6bf312b3 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -15,7 +15,7 @@ icon_grow = "grass-grow" icon_dead = "grass-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) - mutatelist = list(/obj/item/seeds/grass/carpet) + mutatelist = list(/obj/item/seeds/grass/carpet, /obj/item/seeds/grass/fairy) reagents_add = list(/datum/reagent/consumable/nutriment = 0.02, /datum/reagent/hydrogen = 0.05) /obj/item/reagent_containers/food/snacks/grown/grass @@ -40,6 +40,54 @@ new stacktype(user.drop_location(), grassAmt) qdel(src) +//Fairygrass +/obj/item/seeds/grass/fairy + name = "pack of fairygrass seeds" + desc = "These seeds grow into a more mystical grass." + icon_state = "seed-fairygrass" + species = "fairygrass" + plantname = "Fairygrass" + product = /obj/item/reagent_containers/food/snacks/grown/grass/fairy + icon_grow = "fairygrass-grow" + icon_dead = "grass-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/blue) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.02, /datum/reagent/hydrogen = 0.05, /datum/reagent/drug/space_drugs = 0.15) + +/obj/item/reagent_containers/food/snacks/grown/grass/fairy + seed = /obj/item/seeds/grass/fairy + name = "fairygrass" + desc = "Glowing, and smells fainly of mushrooms." + icon_state = "fairygrassclump" + filling_color = "#3399ff" + stacktype = /obj/item/stack/tile/fairygrass + +/obj/item/reagent_containers/food/snacks/grown/grass/fairy/attack_self(mob/user) + var/datum/plant_gene/trait/glow/G = null + for(var/datum/plant_gene/trait/glow/gene in seed.genes) + G = gene + break + + stacktype = initial(stacktype) + + if(G) + switch(G.type) + if(/datum/plant_gene/trait/glow/white) + stacktype = /obj/item/stack/tile/fairygrass/white + if(/datum/plant_gene/trait/glow/red) + stacktype = /obj/item/stack/tile/fairygrass/red + if(/datum/plant_gene/trait/glow/yellow) + stacktype = /obj/item/stack/tile/fairygrass/yellow + if(/datum/plant_gene/trait/glow/green) + stacktype = /obj/item/stack/tile/fairygrass/green + if(/datum/plant_gene/trait/glow/blue) + stacktype = /obj/item/stack/tile/fairygrass/blue + if(/datum/plant_gene/trait/glow/purple) + stacktype = /obj/item/stack/tile/fairygrass/purple + if(/datum/plant_gene/trait/glow/pink) + stacktype = /obj/item/stack/tile/fairygrass/pink + + . = ..() + // Carpet /obj/item/seeds/grass/carpet name = "pack of carpet seeds" diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 3f42815eac99a..871c31dd5ace6 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -44,6 +44,7 @@ species = "holymelon" plantname = "Holy Melon Vines" product = /obj/item/reagent_containers/food/snacks/grown/holymelon + genes = list(/datum/plant_gene/trait/glow/yellow) mutatelist = list() reagents_add = list(/datum/reagent/water/holywater = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) rarity = 20 diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 3a325729c0bb6..0dfd065ceb1d3 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -14,7 +14,7 @@ growthstages = 3 growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' genes = list(/datum/plant_gene/trait/plant_type/weed_hardy) - mutatelist = list(/obj/item/seeds/starthistle/corpse_flower) + mutatelist = list(/obj/item/seeds/starthistle/corpse_flower, /obj/item/seeds/galaxythistle) /obj/item/seeds/starthistle/harvest(mob/user) var/obj/machinery/hydroponics/parent = loc @@ -46,7 +46,7 @@ START_PROCESSING(SSobj, src) return ..() -/obj/item/seeds/starthistle/corpse_flower/process() +/obj/item/seeds/starthistle/corpse_flower/process(delta_time) var/obj/machinery/hydroponics/parent = loc if(parent.age < maturation) // Start a little before it blooms return @@ -56,7 +56,7 @@ return var/datum/gas_mixture/stank = new - stank.set_moles(/datum/gas/miasma, (yield + 6)*7*MIASMA_CORPSE_MOLES) // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses + stank.set_moles(GAS_MIASMA, (yield + 6)*3.5*MIASMA_CORPSE_MOLES*delta_time) // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses stank.set_temperature(T20C) // without this the room would eventually freeze and miasma mining would be easier T.assume_air(stank) T.air_update_turf() @@ -221,7 +221,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) reagents.chem_temp = 1000 //Sets off the black powder diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index 7fe9d52fe50bd..96a2183fb0eec 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -99,13 +99,13 @@ if(..()) if(prob(50)) user.Paralyze(100) - to_chat(user, "You are stunned by the Deathnettle as you try picking it up!") + to_chat(user, "You are stunned by [src] as you try picking it up!") /obj/item/reagent_containers/food/snacks/grown/nettle/death/attack(mob/living/carbon/M, mob/user) if(!..()) return if(isliving(M)) - to_chat(M, "You are stunned by the powerful acid of the Deathnettle!") + to_chat(M, "You are stunned by the powerful acid of [src]!") log_combat(user, M, "attacked", src) M.adjust_blurriness(force/7) diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm index e26d1c1d2a1ee..dbd240a54d128 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -29,7 +29,7 @@ /obj/item/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, params) if(W.is_sharp()) - user.show_message("You carve a face into [src]!", 1) + user.show_message("You carve a face into [src]!", MSG_VISUAL) new /obj/item/clothing/head/hardhat/pumpkinhead(user.loc) qdel(src) return diff --git a/code/modules/hydroponics/grown/rainbow_bunch.dm b/code/modules/hydroponics/grown/rainbow_bunch.dm index 9626d2e6c4d44..4ad9490aa99d5 100644 --- a/code/modules/hydroponics/grown/rainbow_bunch.dm +++ b/code/modules/hydroponics/grown/rainbow_bunch.dm @@ -3,7 +3,7 @@ desc = "A pack of seeds that'll grow into a beautiful bush of various colored flowers." icon_state = "seed-rainbowbunch" species = "rainbowbunch" - plantname = "Rainbow Flowers" + plantname = "Rainbow Bunch" icon_harvest = "rainbowbunch-harvest" product = /obj/item/reagent_containers/food/snacks/grown/rainbow_flower lifespan = 25 @@ -38,40 +38,40 @@ if(1) item_color = "red" color = "#DA0000" - list_reagents = list(/datum/reagent/colorful_reagent/powder/red = 3) - desc += " This one is in a bright red color." + reagents.add_reagent(/datum/reagent/colorful_reagent/powder/red, 3) + desc += " This one is in a fiery red color." if(2) item_color = "orange" color = "#FF9300" - list_reagents = list(/datum/reagent/colorful_reagent/powder/orange = 3) + reagents.add_reagent(/datum/reagent/colorful_reagent/powder/orange, 3) desc += " This one is in a citrus orange color." if(3) item_color = "yellow" color = "#FFF200" - list_reagents = list(/datum/reagent/colorful_reagent/powder/yellow = 3) + reagents.add_reagent(/datum/reagent/colorful_reagent/powder/yellow, 3) desc += " This one is in a bright yellow color." if(4) item_color = "green" color = "#A8E61D" - list_reagents = list(/datum/reagent/colorful_reagent/powder/green = 3) + reagents.add_reagent(/datum/reagent/colorful_reagent/powder/green, 3) desc += " This one is in a grassy green color." if(5) item_color = "blue" color = "#00B7EF" - list_reagents = list(/datum/reagent/colorful_reagent/powder/blue = 3) + reagents.add_reagent(/datum/reagent/colorful_reagent/powder/blue, 3) desc += " This one is in a soothing blue color." if(6) item_color = "purple" color = "#DA00FF" - list_reagents = list(/datum/reagent/colorful_reagent/powder/purple = 3) + reagents.add_reagent(/datum/reagent/colorful_reagent/powder/purple, 3) desc += " This one is in a vibrant purple color." if(7) item_color = "black" color = "#1C1C1C" - list_reagents = list(/datum/reagent/colorful_reagent/powder/black = 3) + reagents.add_reagent(/datum/reagent/colorful_reagent/powder/black, 3) desc += " This one is in a midnight black color." if(8) item_color = "white" color = "#FFFFFF" - list_reagents = list(/datum/reagent/colorful_reagent/powder/white = 3) + reagents.add_reagent(/datum/reagent/colorful_reagent/powder/white, 3) desc += " This one is in a pure white color." diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index d4e59cfbe8c8c..355966444726e 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -14,15 +14,17 @@ yield = 1 //seeds if there isn't a dna inside potency = 30 var/volume = 5 - var/ckey = null - var/realName = null - var/datum/mind/mind = null - var/blood_gender = null - var/blood_type = null - var/list/features = null - var/factions = null - var/list/quirks = null - var/contains_sample = 0 + var/ckey + var/realName + var/datum/mind/mind + var/blood_gender + var/blood_type + var/list/features + var/factions + var/list/quirks + var/sampleDNA + var/contains_sample = FALSE + var/being_harvested = FALSE /obj/item/seeds/replicapod/Initialize() . = ..() @@ -42,10 +44,9 @@ features = B.data["features"] factions = B.data["factions"] quirks = B.data["quirks"] + sampleDNA = B.data["blood_DNA"] contains_sample = TRUE visible_message("The [src] is injected with a fresh blood sample.") - mind.grab_ghost() - to_chat(mind, "Consciousness slowly creeps over you as your body sprouts into a new form.
Am I being planted?
") log_cloning("[key_name(mind)]'s cloning record was added to [src] at [AREACOORD(src)].") else visible_message("The [src] rejects the sample!") @@ -58,18 +59,19 @@ blood_type = null features = null factions = null + sampleDNA = null contains_sample = FALSE /obj/item/seeds/replicapod/get_analyzer_text() var/text = ..() if(contains_sample) - text += "\n It contains a blood sample!" + text += "\n It contains a blood sample with blood DNA ([sampleDNA])." //blood DNA (UE) shows in medical records and is readable by forensics scanners return text /obj/item/seeds/replicapod/harvest(mob/user) //now that one is fun -- Urist var/obj/machinery/hydroponics/parent = loc - var/make_podman = 0 + var/make_podman = FALSE var/ckey_holder = null var/list/result = list() if(CONFIG_GET(flag/revival_pod_plants)) @@ -78,11 +80,12 @@ if(isobserver(M)) var/mob/dead/observer/O = M if(O.ckey == ckey && O.can_reenter_corpse) - make_podman = 1 + make_podman = TRUE break else if(M.ckey == ckey && M.stat == DEAD && !M.suiciding) - make_podman = 1 + make_podman = TRUE + // Devil code if(isliving(M)) var/mob/living/L = M make_podman = !L.hellbound @@ -94,45 +97,67 @@ var/mob/dead/observer/O = M if(!O.can_reenter_corpse) break - make_podman = 1 + make_podman = TRUE + // Devil code if(isliving(M)) var/mob/living/L = M make_podman = !L.hellbound ckey_holder = M.ckey break - if(make_podman) //all conditions met! - var/mob/living/carbon/human/podman = new /mob/living/carbon/human(parent.loc) - if(realName) - podman.real_name = realName - else - podman.real_name = "Pod Person ([rand(1,999)])" - mind.transfer_to(podman) - if(ckey) - podman.ckey = ckey - else - podman.ckey = ckey_holder - podman.gender = blood_gender - podman.faction |= factions - if(!features["mcolor"]) - features["mcolor"] = "#59CE00" - for(var/V in quirks) - new V(podman) - podman.hardset_dna(null,null,podman.real_name,blood_type, new /datum/species/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman - podman.set_cloned_appearance() - to_chat(podman, "There is a bright flash!
You feel like a new being.
") - podman.flash_act() - log_cloning("[key_name(mind)] cloned as a podman via [src] in [parent] at [AREACOORD(parent)].") + // No podman player, give one or two seeds. + if(!make_podman) + // Prevent accidental harvesting. Make sure the user REALLY wants to do this if there's a chance of this coming from a living creature. + if(mind || ckey) + if(alert("The pod is currently devoid of soul. There is a possibility that a soul could claim this creature, or you could harvest it for seeds.", "Harvest Seeds?", "Harvest Seeds", "Cancel") == "Cancel") + return result + + // If this plant has already been harvested, return early. + // parent.update_tray() qdels this seed. + if(QDELETED(src)) + to_chat(user, text = "This pod has already had its seeds harvested!", type = MESSAGE_TYPE_INFO) + return result + + // Make sure they can still interact with the parent hydroponics tray. + if(!parent.can_interact(user)) + to_chat(user, text = "You are no longer able to harvets the seeds from [parent]!", type = MESSAGE_TYPE_INFO) + return result - else //else, one packet of seeds. maybe two var/seed_count = 1 if(prob(getYield() * 20)) seed_count++ var/output_loc = parent.Adjacent(user) ? user.loc : parent.loc //needed for TK - for(var/i=0,iThere is a bright flash!
You feel like a new being.
") + podman.flash_act() + log_cloning("[key_name(mind)] cloned as a podman via [src] in [parent] at [AREACOORD(parent)].") parent.update_tray() return result diff --git a/code/modules/hydroponics/grown/tobacco.dm b/code/modules/hydroponics/grown/tobacco.dm index 0966c1d8b7d8c..1f1edfdcdd292 100644 --- a/code/modules/hydroponics/grown/tobacco.dm +++ b/code/modules/hydroponics/grown/tobacco.dm @@ -45,7 +45,7 @@ //Lavaland Tobacco -obj/item/seeds/tobacco/lavaland +/obj/item/seeds/tobacco/lavaland name = "pack of lavaland tobacco seeds" desc = "These seeds grow into lavaland tobacco plants." icon_state = "seed-lavatobacco" diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index 61893b84302c0..c58c4f46cd900 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -44,12 +44,17 @@ name = "blood-tomato" desc = "So bloody...so...very...bloody....AHHHH!!!!" icon_state = "bloodtomato" - splat_type = /obj/effect/gibspawner/generic + splat_type = /obj/effect/gibspawner/generic/bloodtomato filling_color = "#FF0000" foodtype = FRUIT | GROSS grind_results = list(/datum/reagent/consumable/ketchup = 0, /datum/reagent/blood = 0) distill_reagent = /datum/reagent/consumable/ethanol/bloody_mary +/obj/item/reagent_containers/food/snacks/grown/tomato/blood/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, quickstart = TRUE) + if(istype(thrower) && thrower.ckey) + thrower.investigate_log("has thrown bloodtomatoes at [AREACOORD(thrower)].", INVESTIGATE_BOTANY) + . = ..() + // Blue Tomato /obj/item/seeds/tomato/blue name = "pack of blue-tomato seeds" @@ -118,7 +123,7 @@ name = "killer-tomato" desc = "I say to-mah-to, you say tom-mae-to... OH GOD IT'S EATING MY LEGS!!" icon_state = "killertomato" - var/awakening = 0 + var/awakening = FALSE filling_color = "#FF0000" distill_reagent = /datum/reagent/consumable/ethanol/demonsblood @@ -131,17 +136,19 @@ /obj/item/reagent_containers/food/snacks/grown/tomato/killer/attack_self(mob/user) if(awakening || isspaceturf(user.loc)) return - to_chat(user, "You begin to awaken the Killer Tomato...") + user.visible_message("[user] beings to awaken the [src].", \ + "You begin to awaken the [src]...") awakening = TRUE log_game("[key_name(user)] awakened a killer tomato at [AREACOORD(user)].") - - spawn(30) - if(!QDELETED(src)) - var/mob/living/simple_animal/hostile/killertomato/K = new /mob/living/simple_animal/hostile/killertomato(get_turf(src.loc)) - K.maxHealth += round(seed.endurance / 3) - K.melee_damage += round(seed.potency / 10) - K.move_to_delay -= round(seed.production / 50) - K.frenzythreshold -= round(seed.potency / 25)// max potency tomatoes will enter a frenzy more easily - K.health = K.maxHealth - K.visible_message("The Killer Tomato growls as it suddenly awakens.") - qdel(src) + addtimer(CALLBACK(src, .proc/make_killer_tomato), 30) + +/obj/item/reagent_containers/food/snacks/grown/tomato/killer/proc/make_killer_tomato() + if(!QDELETED(src)) + var/mob/living/simple_animal/hostile/killertomato/K = new /mob/living/simple_animal/hostile/killertomato(get_turf(src.loc)) + K.maxHealth += round(seed.endurance / 3) + K.melee_damage += round(seed.potency / 10) + K.move_to_delay -= round(seed.production / 50) + K.frenzythreshold -= round(seed.potency / 25)// max potency tomatoes will enter a frenzy more easily + K.health = K.maxHealth + K.visible_message("The Killer Tomato growls as it suddenly awakens.") + qdel(src) diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index e191732fb8b59..4e53801f92f2a 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -46,13 +46,12 @@ var/plank_name = "wooden planks" var/static/list/accepted = typecacheof(list(/obj/item/reagent_containers/food/snacks/grown/tobacco, /obj/item/reagent_containers/food/snacks/grown/tea, - /obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris, - /obj/item/reagent_containers/food/snacks/grown/ambrosia/deus, + /obj/item/reagent_containers/food/snacks/grown/ambrosia, /obj/item/reagent_containers/food/snacks/grown/wheat)) /obj/item/grown/log/attackby(obj/item/W, mob/user, params) - if(W.sharpness) - user.show_message("You make [plank_name] out of \the [src]!", 1) + if(W.is_sharp()) + user.show_message("You make [plank_name] out of \the [src]!", MSG_VISUAL) var/seed_modifier = 0 if(seed) seed_modifier = round(seed.potency / 25) @@ -98,7 +97,7 @@ /obj/item/grown/log/steel/CheckAccepted(obj/item/I) return FALSE -obj/item/seeds/bamboo +/obj/item/seeds/bamboo name = "pack of bamboo seeds" desc = "Plant known for their flexible and resistant logs." icon_state = "seed-bamboo" @@ -158,6 +157,9 @@ obj/item/seeds/bamboo var/fire_stack_strength = 5 var/needs_oxygen = TRUE +/obj/structure/bonfire/bluespace + needs_oxygen = FALSE + /obj/structure/bonfire/dense density = TRUE @@ -233,7 +235,7 @@ obj/item/seeds/bamboo if(isopenturf(loc)) var/turf/open/O = loc if(O.air) - if(O.air.get_moles(/datum/gas/oxygen) > 13) + if(O.air.get_moles(GAS_O2) > 13) return TRUE return FALSE @@ -252,41 +254,41 @@ obj/item/seeds/bamboo if(burning & !grill) Burn() -/obj/structure/bonfire/proc/Burn() +/obj/structure/bonfire/proc/Burn(delta_time = 2) var/turf/current_location = get_turf(src) - current_location.hotspot_expose(1000,500,1) + current_location.hotspot_expose(1000, 250 * delta_time, 1) for(var/A in current_location) if(A == src) continue if(isobj(A)) var/obj/O = A - O.fire_act(1000, 500) + O.fire_act(1000, 250 * delta_time) else if(isliving(A)) var/mob/living/L = A - L.adjust_fire_stacks(fire_stack_strength) + L.adjust_fire_stacks(fire_stack_strength * 0.5 * delta_time) L.IgniteMob() -/obj/structure/bonfire/proc/Cook() +/obj/structure/bonfire/proc/Cook(delta_time = 2) var/turf/current_location = get_turf(src) for(var/A in current_location) if(A == src) continue else if(isliving(A)) //It's still a fire, idiot. var/mob/living/L = A - L.adjust_fire_stacks(fire_stack_strength) + L.adjust_fire_stacks(fire_stack_strength * 0.5 * delta_time) L.IgniteMob() - else if(istype(A, /obj/item) && prob(20)) + else if(istype(A, /obj/item) && DT_PROB(10, delta_time)) var/obj/item/O = A O.microwave_act() -/obj/structure/bonfire/process() +/obj/structure/bonfire/process(delta_time) if(needs_oxygen && !CheckOxygen()) extinguish() return if(!grill) - Burn() + Burn(delta_time) else - Cook() + Cook(delta_time) /obj/structure/bonfire/extinguish() if(burning) diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 05d7028da4963..403e5a356517e 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -122,7 +122,7 @@ var/obj/item/bodypart/BP = C.get_bodypart(BODY_ZONE_HEAD) if(BP) BP.drop_limb() - playsound(src,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1) + playsound(src,pick('sound/misc/desecration-01.ogg','sound/misc/desecration-02.ogg','sound/misc/desecration-01.ogg') ,50, 1, -1) return (BRUTELOSS) /obj/item/scythe/pre_attack(atom/A, mob/living/user, params) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index e6d9f3feecc63..f274584d8bc70 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -49,7 +49,7 @@ /obj/machinery/hydroponics/constructable/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Tray efficiency at [rating*100]%." + . += "The status display reads: Tray efficiency at [rating*100]%." /obj/machinery/hydroponics/Destroy() @@ -101,18 +101,18 @@ else return ..() -/obj/machinery/hydroponics/process() +/obj/machinery/hydroponics/process(delta_time) var/needs_update = 0 // Checks if the icon needs updating so we don't redraw empty trays every time if(myseed && (myseed.loc != src)) myseed.forceMove(src) if(self_sustaining) - adjustNutri(1) - adjustWater(rand(3,5)) - adjustWeeds(-2) - adjustPests(-2) - adjustToxic(-2) + adjustNutri(0.5 * delta_time) + adjustWater(rand(1,2) * delta_time * 0.5) + adjustWeeds(-1 * delta_time) + adjustPests(-1 * delta_time) + adjustToxic(-1 * delta_time) if(world.time > (lastcycle + cycledelay)) lastcycle = world.time @@ -339,8 +339,8 @@ . += "It's empty." if(!self_sustaining) - . += {"Water: [waterlevel]/[maxwater].\n - Nutrient: [nutrilevel]/[maxnutri]."} + . += "Water: [waterlevel]/[maxwater].\n"+\ + "Nutrient: [nutrilevel]/[maxnutri]." if(self_sufficiency_progress > 0) var/percent_progress = round(self_sufficiency_progress * 100 / self_sufficiency_req) . += "Treatment for self-sustenance are [percent_progress]% complete." @@ -380,7 +380,8 @@ myseed = new /obj/item/seeds/plump(src) else myseed = new /obj/item/seeds/starthistle(src) - age = 0 + age = 1 + lastproduce = 1 plant_health = myseed.endurance lastcycle = world.time harvest = 0 @@ -420,10 +421,8 @@ harvest = 0 weedlevel = 0 // Reset - sleep(5) // Wait a while - update_icon() - visible_message("[oldPlantName] suddenly mutates into [myseed.plantname]!") - update_name() + var/message = "[oldPlantName] suddenly mutates into [myseed.plantname]!" + addtimer(CALLBACK(src, .proc/after_mutation, message), 0.5 SECONDS) /obj/machinery/hydroponics/proc/mutateweed() // If the weeds gets the mutagent instead. Mind you, this pretty much destroys the old plant @@ -441,14 +440,18 @@ harvest = 0 weedlevel = 0 // Reset - sleep(5) // Wait a while - update_icon() - visible_message("The mutated weeds in [src] spawn some [myseed.plantname]!") - update_name() + var/message = "The mutated weeds in [src] spawn some [myseed.plantname]!" + addtimer(CALLBACK(src, .proc/after_mutation, message), 0.5 SECONDS) else to_chat(usr, "The few weeds in [src] seem to react, but only for a moment...") +//Called after plant mutation, update the appearance of the tray content and send a visible_message() +/obj/machinery/hydroponics/proc/after_mutation(message) + update_icon() + update_name() + visible_message(message) + /obj/machinery/hydroponics/proc/plantdies() // OH NOES!!!!! I put this all in one function to make things easier plant_health = 0 harvest = 0 @@ -594,7 +597,7 @@ adjustHealth(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 0.1)) adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 0.1)) - // Man, you guys are retards + // Man, you guys are stupid if(S.has_reagent(/datum/reagent/toxin/acid, 1)) adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/acid) * 1)) adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/acid) * 1.5)) @@ -786,6 +789,7 @@ myseed = O update_name() age = 1 + lastproduce = 1 plant_health = myseed.endurance lastcycle = world.time update_icon() @@ -817,7 +821,7 @@ to_chat(user, "This plot is completely devoid of weeds! It doesn't need uprooting.") else if(istype(O, /obj/item/storage/bag/plants)) - attack_hand(user) + harvest_plant(user) for(var/obj/item/reagent_containers/food/snacks/grown/G in locate(user.x,user.y,user.z)) SEND_SIGNAL(O, COMSIG_TRY_STORAGE_INSERT, G, user, TRUE) @@ -875,6 +879,9 @@ return if(issilicon(user)) //How does AI know what plant is? return + harvest_plant(user) + +/obj/machinery/hydroponics/proc/harvest_plant(mob/user) if(harvest) return myseed.harvest(user) @@ -903,6 +910,8 @@ myseed = null update_name() dead = 0 + age = 0 + lastproduce = 0 update_icon() /// Tray Setters - The following procs adjust the tray or plants variables, and make sure that the stat doesn't go out of bounds./// diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index e8c80d69cbb10..1c86fa91c90d7 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -253,9 +253,13 @@ rate = 0.2 /datum/plant_gene/trait/cell_charge/on_slip(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/C) - var/power = G.seed.potency*rate + var/power = round(G.seed.potency*rate) if(prob(power)) - C.electrocute_act(round(power), G, 1, 1) + C.electrocute_act(power, G, 1, 1) + var/turf/T = get_turf(C) + if(C.ckey != G.fingerprintslast) + C.investigate_log("[C] has slipped on an electric plant at [AREACOORD(T)]. Last fingerprint: [G.fingerprintslast].", INVESTIGATE_BOTANY) + log_combat(C, G, "slipped on and got electrocuted by", null, "with the power of 10. Last fingerprint: [G.fingerprintslast]") /datum/plant_gene/trait/cell_charge/on_squash(obj/item/reagent_containers/food/snacks/grown/G, atom/target) if(iscarbon(target)) @@ -263,6 +267,9 @@ var/power = G.seed.potency*rate if(prob(power)) C.electrocute_act(round(power), G, 1, 1) + if(C.ckey != G.fingerprintslast) + log_combat(G.thrownby, C, "hit and electrocuted", G, "at [AREACOORD(G)] with power of [power]") + C.investigate_log("[C] has been hit by an electric plant at [AREACOORD(G)] with power of [power]. Last fingerprint: [G.fingerprintslast].", INVESTIGATE_BOTANY) /datum/plant_gene/trait/cell_charge/on_consume(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/target) if(!G.reagents.total_volume) @@ -310,15 +317,39 @@ /datum/plant_gene/trait/glow/shadow/glow_power(obj/item/seeds/S) return -max(S.potency*(rate*0.2), 0.2) -/datum/plant_gene/trait/glow/red - name = "Red Electrical Glow" - glow_color = LIGHT_COLOR_RED - -/datum/plant_gene/trait/glow/berry - name = "Strong Bioluminescence" - rate = 0.05 - glow_color = null +/datum/plant_gene/trait/glow/white + name = "White Bioluminescence" + glow_color = "#FFFFFF" +/datum/plant_gene/trait/glow/red + //Colored versions of bioluminescence. + name = "Red Bioluminescence" + glow_color = "#FF3333" + +/datum/plant_gene/trait/glow/yellow + //not the disgusting glowshroom yellow hopefully + name = "Yellow Bioluminescence" + glow_color = "#FFFF66" + +/datum/plant_gene/trait/glow/green + //oh no, now I'm radioactive + name = "Green Bioluminescence" + glow_color = "#99FF99" + +/datum/plant_gene/trait/glow/blue + //the best one + name = "Blue Bioluminescence" + glow_color = "#6699FF" + +/datum/plant_gene/trait/glow/purple + //did you know that Notepad++ doesnt think bioluminescence is a word + name = "Purple Bioluminescence" + glow_color = "#D966FF" + +/datum/plant_gene/trait/glow/pink + //gay tide station pride + name = "Pink Bioluminescence" + glow_color = "#FFB3DA" /datum/plant_gene/trait/teleport // Makes plant teleport people when squashed or slipped on. @@ -330,33 +361,28 @@ if(isliving(target)) var/teleport_radius = max(round(G.seed.potency / 10), 1) var/turf/T = get_turf(target) + var/mob/living/carbon/C = target new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect... do_teleport(target, T, teleport_radius, channel = TELEPORT_CHANNEL_BLUESPACE) + if(C.ckey == G.fingerprintslast) //what's the point of logging someone attacking himself + return + log_combat(G.thrownby, C, "hit", G, "at [AREACOORD(T)] teleporting them to [AREACOORD(C)]") + C.investigate_log("has been hit by a bluespace plant at [AREACOORD(T)] teleporting them to [AREACOORD(C)]. Last fingerprint: [G.fingerprintslast].", INVESTIGATE_BOTANY) /datum/plant_gene/trait/teleport/on_slip(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/C) var/teleport_radius = max(round(G.seed.potency / 10), 1) var/turf/T = get_turf(C) to_chat(C, "You slip through spacetime!") do_teleport(C, T, teleport_radius, channel = TELEPORT_CHANNEL_BLUESPACE) + if(C.ckey != G.fingerprintslast) //what's the point of logging someone attacking himself + C.investigate_log("has slipped on bluespace plant at [AREACOORD(T)] teleporting them to [AREACOORD(C)]. Last fingerprint: [G.fingerprintslast].", INVESTIGATE_BOTANY) + log_combat(C, G, "slipped on", null, "teleporting them from [AREACOORD(T)] to [AREACOORD(C)]. Last fingerprint: [G.fingerprintslast].") if(prob(50)) do_teleport(G, T, teleport_radius, channel = TELEPORT_CHANNEL_BLUESPACE) else 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.flags, NO_REACT) - -/datum/plant_gene/trait/noreact/on_squashreact(obj/item/reagent_containers/food/snacks/grown/G, atom/target) - DISABLE_BITFIELD(G.reagents.flags, NO_REACT) - G.reagents.handle_reactions() - /datum/plant_gene/trait/maxchem // 2x to max reagents volume. name = "Densified Chemicals" @@ -390,7 +416,7 @@ // The secret of potato supercells! var/datum/plant_gene/trait/cell_charge/CG = G.seed.get_gene(/datum/plant_gene/trait/cell_charge) - if(CG) // Cell charge max is now 40MJ or otherwise known as 400KJ (Same as bluespace powercells) + if(CG) // Cell charge max is now 40MJ or otherwise known as 400KJ (Same as bluespace power cells) pocell.maxcharge *= CG.rate*100 pocell.charge = pocell.maxcharge pocell.name = "[G.name] battery" @@ -408,17 +434,35 @@ name = "Hypodermic Prickles" /datum/plant_gene/trait/stinging/on_slip(obj/item/reagent_containers/food/snacks/grown/G, atom/target) - on_throw_impact(G, target) + if(!isliving(target) || !G.reagents || !G.reagents.total_volume) + return + var/mob/living/L = target + if(prick(G, L)) + if(L.ckey != G.fingerprintslast) + var/turf/T = get_turf(L) + L.investigate_log("has slipped on plant at [AREACOORD(T)] injecting him with [G.reagents.log_list()]. Last fingerprint: [G.fingerprintslast].", INVESTIGATE_BOTANY) + log_combat(L, G, "slipped on the", null, "injecting him with [G.reagents.log_list()]. Last fingerprint: [G.fingerprintslast].") /datum/plant_gene/trait/stinging/on_throw_impact(obj/item/reagent_containers/food/snacks/grown/G, atom/target) - if(isliving(target) && G.reagents && G.reagents.total_volume) - var/mob/living/L = target - if(L.reagents && L.can_inject(null, 0)) - var/injecting_amount = max(1, G.seed.potency*0.2) // Minimum of 1, max of 20 - var/fraction = min(injecting_amount/G.reagents.total_volume, 1) - G.reagents.reaction(L, INJECT, fraction) - G.reagents.trans_to(L, injecting_amount) - to_chat(target, "You are pricked by [G]!") + if(!isliving(target) || !G.reagents || !G.reagents.total_volume) + return + var/mob/living/L = target + if(prick(G, L)) + if(L.ckey != G.fingerprintslast) //what's the point of logging someone attacking himself + var/turf/T = get_turf(L) + log_combat(G.thrownby, L, "hit", G, "at [AREACOORD(T)] injecting them with [G.reagents.log_list()]") + L.investigate_log("[L] has been prickled by a plant at [AREACOORD(T)] injecting them with [G.reagents.log_list()]. Last fingerprint: [G.fingerprintslast].", INVESTIGATE_BOTANY) + +/datum/plant_gene/trait/stinging/proc/prick(obj/item/reagent_containers/food/snacks/grown/G, mob/living/L) + if(!L.reagents && !L.can_inject(null, 0)) + return FALSE + + var/injecting_amount = max(1, G.seed.potency*0.2) // Minimum of 1, max of 20 + var/fraction = min(injecting_amount/G.reagents.total_volume, 1) + G.reagents.reaction(L, INJECT, fraction) + G.reagents.trans_to(L, injecting_amount) + to_chat(L, "You are pricked by [G]!") + return TRUE /datum/plant_gene/trait/smoke name = "Gaseous Decomposition" @@ -427,9 +471,13 @@ var/datum/effect_system/smoke_spread/chem/S = new var/splat_location = get_turf(target) var/smoke_amount = round(sqrt(G.seed.potency * 0.1), 1) + var/turf/T = get_turf(G) S.attach(splat_location) S.set_up(G.reagents, smoke_amount, splat_location, 0) S.start() + log_admin_private("[G.fingerprintslast] has caused a plant to create smoke containing [G.reagents.log_list()] at [AREACOORD(T)]") + message_admins("[G.fingerprintslast] has caused a plant to create smoke containing [G.reagents.log_list()] at [ADMIN_VERBOSEJMP(T)]") + G.investigate_log(" has created a smoke containing [G.reagents.log_list()] at [AREACOORD(T)]. Last fingerprint: [G.fingerprintslast].", INVESTIGATE_BOTANY) G.reagents.clear_reagents() /datum/plant_gene/trait/fire_resistance // Lavaland diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index 217541240cf85..1d0f7ab6d3ea8 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -1,3 +1,18 @@ +/** + * Finds and extracts seeds from an object + * + * Checks if the object is such that creates a seed when extracted. Used by seed + * extractors or posably anything that would create seeds in some way. The seeds + * are dropped either at the extractor, if it exists, or where the original object + * was and it qdel's the object + * + * Arguments: + * * O - Object containing the seed, can be the loc of the dumping of seeds + * * t_max - Amount of seed copies to dump, -1 is ranomized + * * extractor - Seed Extractor, used as the dumping loc for the seeds and seed multiplier + * * user - checks if we can remove the object from the inventory + * * + */ /proc/seedify(obj/item/O, t_max, obj/machinery/seed_extractor/extractor, mob/living/user) var/t_amount = 0 var/list/seeds = list() @@ -48,9 +63,9 @@ circuit = /obj/item/circuitboard/machine/seed_extractor var/seed_multiplier = 1 var/max_seeds = 1000 - var/list/piles = list() - // seed /// Associated list of seeds, they are all weak refs. We check the len to see how many refs we have for each + // seed + var/list/piles = list() /obj/machinery/seed_extractor/RefreshParts() for(var/obj/item/stock_parts/matter_bin/B in component_parts) @@ -61,7 +76,7 @@ /obj/machinery/seed_extractor/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Extracting [seed_multiplier] seed(s) per piece of produce.
Machine can store up to [max_seeds]% seeds." + . += "The status display reads: Extracting [seed_multiplier] seed(s) per piece of produce.
Machine can store up to [max_seeds]% seeds.
" /obj/machinery/seed_extractor/attackby(obj/item/O, mob/user, params) @@ -104,78 +119,25 @@ else return ..() -/datum/seed_pile - var/name = "" - var/lifespan = 0 //Saved stats - var/endurance = 0 - var/maturation = 0 - var/production = 0 - var/yield = 0 - var/potency = 0 - var/amount = 0 - -/datum/seed_pile/New(var/name, var/life, var/endur, var/matur, var/prod, var/yie, var/poten, var/am = 1) - src.name = name - src.lifespan = life - src.endurance = endur - src.maturation = matur - src.production = prod - src.yield = yie - src.potency = poten - src.amount = am - -/obj/machinery/seed_extractor/ui_interact(mob/user) - . = ..() - if (stat) - return FALSE - - var/dat = "Stored seeds:
" - - if (contents.len == 0) - dat += "No seeds" - else - dat += "" - for (var/datum/seed_pile/O in piles) - dat += "" - dat += "" - dat += "
NameLifespanEnduranceMaturationProductionYieldPotencyStock
[O.name][O.lifespan][O.endurance][O.maturation][O.production][O.yield][O.potency]" - dat += "Vend ([O.amount] left)
" - var/datum/browser/popup = new(user, "seed_ext", name, 700, 400) - popup.set_content(dat) - popup.open() - return - -/obj/machinery/seed_extractor/Topic(var/href, var/list/href_list) - if(..()) - return - usr.set_machine(src) - - href_list["li"] = text2num(href_list["li"]) - href_list["en"] = text2num(href_list["en"]) - href_list["ma"] = text2num(href_list["ma"]) - href_list["pr"] = text2num(href_list["pr"]) - href_list["yi"] = text2num(href_list["yi"]) - href_list["pot"] = text2num(href_list["pot"]) - - for (var/datum/seed_pile/N in piles)//Find the pile we need to reduce... - if (href_list["name"] == N.name && href_list["li"] == N.lifespan && href_list["en"] == N.endurance && href_list["ma"] == N.maturation && href_list["pr"] == N.production && href_list["yi"] == N.yield && href_list["pot"] == N.potency) - if(N.amount <= 0) - return - N.amount = max(N.amount - 1, 0) - if (N.amount <= 0) - piles -= N - qdel(N) - break - - for (var/obj/T in contents)//Now we find the seed we need to vend - var/obj/item/seeds/O = T - if (O.plantname == href_list["name"] && O.lifespan == href_list["li"] && O.endurance == href_list["en"] && O.maturation == href_list["ma"] && O.production == href_list["pr"] && O.yield == href_list["yi"] && O.potency == href_list["pot"]) - O.forceMove(drop_location()) - break - - src.updateUsrDialog() - return - +/** + * Generate seed string + * + * Creates a string based of the traits of a seed. We use this string as a bucket for all + * seeds that match as well as the key the ui uses to get the seed. We also use the key + * for the data shown in the ui. Javascript parses this string to display + * + * Arguments: + * * O - seed to generate the string from + */ +/obj/machinery/seed_extractor/proc/generate_seed_string(obj/item/seeds/O) + return "name=[O.name];lifespan=[O.lifespan];endurance=[O.endurance];maturation=[O.maturation];production=[O.production];yield=[O.yield];potency=[O.potency]" + +/** Add Seeds Proc. + * + * Adds the seeds to the contents and to an associated list that pregenerates the data + * needed to go to the ui handler + * + **/ /obj/machinery/seed_extractor/proc/add_seed(obj/item/seeds/O) if(contents.len >= 999) to_chat(usr, "\The [src] is full.") @@ -189,11 +151,46 @@ var/mob/M = O.loc if(!M.transferItemToLoc(O, src)) return FALSE + + var/seed_string = generate_seed_string(O) + if(piles[seed_string]) + piles[seed_string] += WEAKREF(O) + else + piles[seed_string] = list(WEAKREF(O)) . = TRUE - for (var/datum/seed_pile/N in piles) - if (O.plantname == N.name && O.lifespan == N.lifespan && O.endurance == N.endurance && O.maturation == N.maturation && O.production == N.production && O.yield == N.yield && O.potency == N.potency) - ++N.amount - return - piles += new /datum/seed_pile(O.plantname, O.lifespan, O.endurance, O.maturation, O.production, O.yield, O.potency) +/obj/machinery/seed_extractor/ui_state(mob/user) + return GLOB.notcontained_state + +/obj/machinery/seed_extractor/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "SeedExtractor", name) + ui.open() + +/obj/machinery/seed_extractor/ui_data() + var/list/V = list() + for(var/key in piles) + if(piles[key]) + var/len = length(piles[key]) + if(len) + V[key] = len + + . = list() + .["seeds"] = V + +/obj/machinery/seed_extractor/ui_act(action, params) + if(..()) + return + + switch(action) + if("select") + var/item = params["item"] + if(piles[item] && length(piles[item]) > 0) + var/datum/weakref/WO = piles[item][1] + var/obj/item/seeds/O = WO.resolve() + if(O) + piles[item] -= WO + O.forceMove(drop_location()) + . = TRUE 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 0000000000000..fe63ec1da791a --- /dev/null +++ b/code/modules/instruments/instrument_data/_instrument_data.dm @@ -0,0 +1,113 @@ +/** + * Get all non admin_only instruments as a list of text ids. + */ +/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 + +/** + * # Instrument Datums + * + * Instrument datums hold the data for any given instrument, as well as data on how to play it and what bounds there are to playing it. + * + * The datums themselves are kept in SSinstruments in a list by their unique ID. The reason it uses ID instead of typepath is to support the runtime creation of instruments. + * Since songs cache them while playing, there isn't realistic issues regarding performance from accessing. + */ +/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 = 0.33 + +/datum/instrument/New() + if(isnull(id)) + id = "[type]" + +/** + * Initializes the instrument, calculating its samples if necessary. + */ +/datum/instrument/proc/Initialize() + if(instrument_flags & (INSTRUMENT_LEGACY | INSTRUMENT_DO_NOT_AUTOSAMPLE)) + return + calculate_samples() + +/** + * Checks if this instrument is ready to play. + */ +/datum/instrument/proc/ready() + if(instrument_flags & INSTRUMENT_LEGACY) + return legacy_instrument_path && legacy_instrument_ext + else if(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 ..() + +/** + * For synthesized instruments, this is how the instrument generates the "keys" that a [/datum/song] uses to play notes. + * Calculating them on the fly would be unperformant, so we do it during init and keep it all cached in a list. + */ +/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) \ No newline at end of file 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 0000000000000..7211caca0bac8 --- /dev/null +++ b/code/modules/instruments/instrument_data/_instrument_key.dm @@ -0,0 +1,31 @@ +/** + * Instrument key datums contain everything needed to know how to play a specific + * note of an instrument.* + */ +/datum/instrument_key + /// The numerical key of what this is, from 1 to 127 on a standard piano keyboard. + var/key + /// The actual sample file that will be loaded when playing. + var/sample + /// The frequency to play the sample to get our desired note. + var/frequency + /// Deviation up/down from the pivot point that uses its sample. Used to calculate frequency. + var/deviation + +/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() + +/** + * Calculates and stores our deviation. + */ +/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 0000000000000..6fdfea49b72a2 --- /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') \ No newline at end of file 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 0000000000000..ecb7f12655ea7 --- /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') \ No newline at end of file diff --git a/code/modules/instruments/instrument_data/fun.dm b/code/modules/instruments/instrument_data/fun.dm new file mode 100644 index 0000000000000..2ab7dc4312084 --- /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/mothscream + name = "Moth Scream" + id = "mothscream" + real_samples = list("60"='sound/voice/moth/scream_moth.ogg') + admin_only = TRUE \ No newline at end of file diff --git a/code/modules/instruments/instrument_data/guitar.dm b/code/modules/instruments/instrument_data/guitar.dm new file mode 100644 index 0000000000000..cd6e5f0ceb7d1 --- /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') \ No newline at end of file diff --git a/code/modules/instruments/instrument_data/hardcoded.dm b/code/modules/instruments/instrument_data/hardcoded.dm new file mode 100644 index 0000000000000..5f2a58374de4f --- /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/accordion + name = "Accordion" + id = "accordion" + legacy_instrument_ext = "mid" + legacy_instrument_path = "accordion" + +/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" \ No newline at end of file diff --git a/code/modules/instruments/instrument_data/organ.dm b/code/modules/instruments/instrument_data/organ.dm new file mode 100644 index 0000000000000..6aa78d49d21c2 --- /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 Accordion" + 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 0000000000000..e9d942efc281a --- /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') \ No newline at end of file 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 0000000000000..81af1524e94fe --- /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') \ No newline at end of file diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm new file mode 100644 index 0000000000000..8bf65277112f7 --- /dev/null +++ b/code/modules/instruments/items.dm @@ -0,0 +1,276 @@ +//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 + icon = 'icons/obj/musician.dmi' + lefthand_file = 'icons/mob/inhands/equipment/instruments_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/instruments_righthand.dmi' + /// Our song datum. + var/datum/song/handheld/song + /// Our allowed list of instrument ids. This is nulled on initialize. + var/list/allowed_instrument_ids + /// How far away our song datum can be heard. + var/instrument_range = 15 + block_upgrade_walk = 1 + +/obj/item/instrument/Initialize(mapload) + . = ..() + song = new(src, allowed_instrument_ids, instrument_range) + allowed_instrument_ids = null //We don't need this clogging memory after it's used. + +/obj/item/instrument/Destroy() + QDEL_NULL(song) + return ..() + +/obj/item/instrument/proc/should_stop_playing(mob/user) + return user.incapacitated() || !((loc == user) || (isturf(loc) && Adjacent(user))) // sorry, no more TK playing. + +/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/interact(mob/user) + ui_interact(user) + +/obj/item/instrument/ui_interact(mob/living/user) + if(!isliving(user) || user.stat || (user.restrained() && !ispAI(user))) + return + + user.set_machine(src) + song.ui_interact(user) + +/obj/item/instrument/violin + name = "space violin" + desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" + icon_state = "violin" + item_state = "violin" + hitsound = "swing_hit" + allowed_instrument_ids = "violin" + +/obj/item/instrument/violin/golden + name = "golden violin" + desc = "A golden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" + icon_state = "golden_violin" + item_state = "golden_violin" + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + +/obj/item/instrument/piano_synth + name = "synthesizer" + desc = "An advanced electronic synthesizer that can be used as various instruments." + icon_state = "synth" + item_state = "synth" + allowed_instrument_ids = "piano" + +/obj/item/instrument/piano_synth/Initialize(mapload) + . = ..() + song.allowed_instrument_ids = SSinstruments.synthesizer_instrument_ids + +/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/instrument/guitar + name = "guitar" + desc = "It's made of wood and has bronze strings." + icon_state = "guitar" + item_state = "guitar" + attack_verb = list("played metal on", "serenaded", "crashed", "smashed") + hitsound = 'sound/weapons/stringsmash.ogg' + allowed_instrument_ids = list("guitar","csteelgt","cnylongt", "ccleangt", "cmutedgt") + +/obj/item/instrument/eguitar + name = "electric guitar" + desc = "Makes all your shredding needs possible." + icon_state = "eguitar" + item_state = "eguitar" + force = 12 + attack_verb = list("played metal on", "shredded", "crashed", "smashed") + hitsound = 'sound/weapons/stringsmash.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" + allowed_instrument_ids = list("glockenspiel","crvibr", "sgmmbox", "r3celeste") + +/obj/item/instrument/accordion + name = "accordion" + desc = "Pun-Pun not included." + icon_state = "accordion" + item_state = "accordion" + allowed_instrument_ids = list("crack", "crtango", "accordion") + +/obj/item/instrument/trumpet + name = "trumpet" + desc = "To announce the arrival of the king!" + icon_state = "trumpet" + item_state = "trombone" + allowed_instrument_ids = "crtrumpet" + +/obj/item/instrument/trumpet/spectral + name = "spectral trumpet" + desc = "Things are about to get spooky!" + icon_state = "trumpet" + item_state = "trombone" + force = 0 + attack_verb = list("played","jazzed","trumpeted","mourned","dooted","spooked") + +/obj/item/instrument/trumpet/spectral/Initialize() + . = ..() + AddComponent(/datum/component/spooky) + +/obj/item/instrument/trumpet/spectral/attack(mob/living/carbon/C, mob/user) + playsound (loc, 'sound/instruments/trombone/En4.mid', 100,1,-1) + ..() + +/obj/item/instrument/saxophone + name = "saxophone" + desc = "This soothing sound will be sure to leave your audience in tears." + icon_state = "saxophone" + item_state = "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" + allowed_instrument_ids = "saxophone" + force = 0 + attack_verb = list("played","jazzed","saxxed","mourned","dooted","spooked") + +/obj/item/instrument/saxophone/spectral/Initialize() + . = ..() + 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) + ..() + +/obj/item/instrument/trombone + name = "trombone" + desc = "How can any pool table ever hope to compete?" + icon_state = "trombone" + item_state = "trombone" + allowed_instrument_ids = list("crtrombone", "crbrass", "trombone") + +/obj/item/instrument/trombone/spectral + name = "spectral trombone" + desc = "A skeleton's favorite instrument. Apply directly on the mortals." + icon_state = "trombone" + item_state = "trombone" + force = 0 + attack_verb = list("played","jazzed","tromboned","mourned","dooted","spooked") + +/obj/item/instrument/trombone/spectral/Initialize() + . = ..() + AddComponent(/datum/component/spooky) + +/obj/item/instrument/trombone/spectral/attack(mob/living/carbon/C, mob/user) + playsound (loc, 'sound/instruments/trombone/Cn4.mid', 100,1,-1) + ..() + +/obj/item/instrument/recorder + name = "recorder" + desc = "Just like in school, playing ability and all." + force = 5 + icon_state = "recorder" + item_state = "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" + allowed_instrument_ids = list("harmonica", "crharmony") + slot_flags = ITEM_SLOT_MASK + force = 5 + w_class = WEIGHT_CLASS_SMALL + actions_types = list(/datum/action/item_action/instrument) + +/obj/item/instrument/harmonica/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + + if(song.playing && ismob(loc)) + to_chat(loc, "You stop playing the harmonica to talk...") + song.playing = FALSE + +/obj/item/instrument/harmonica/equipped(mob/M, slot) + . = ..() + RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) + +/obj/item/instrument/harmonica/dropped(mob/M) + . = ..() + UnregisterSignal(M, COMSIG_MOB_SAY) + +/obj/item/instrument/bikehorn + name = "gilded bike horn" + desc = "An exquisitely decorated bike horn, capable of honking in a variety of notes." + icon_state = "bike_horn" + item_state = "bike_horn" + lefthand_file = 'icons/mob/inhands/equipment/horns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/horns_righthand.dmi' + attack_verb = list("beautifully honks") + allowed_instrument_ids = list("bikehorn", "honk") + w_class = WEIGHT_CLASS_TINY + force = 0 + throw_speed = 3 + throw_range = 15 + hitsound = 'sound/items/bikehorn.ogg' + +/// + +/obj/item/choice_beacon/music + name = "instrument delivery beacon" + desc = "Summon your tool of art." + icon_state = "gangtool-red" + +/obj/item/choice_beacon/music/generate_display_names() + var/static/list/instruments + if(!instruments) + instruments = list() + var/list/templist = list(/obj/item/instrument/violin, + /obj/item/instrument/piano_synth, + /obj/item/instrument/banjo, + /obj/item/instrument/guitar, + /obj/item/instrument/eguitar, + /obj/item/instrument/glockenspiel, + /obj/item/instrument/accordion, + /obj/item/instrument/trumpet, + /obj/item/instrument/saxophone, + /obj/item/instrument/trombone, + /obj/item/instrument/recorder, + /obj/item/instrument/harmonica + ) + for(var/V in templist) + var/atom/A = V + instruments[initial(A.name)] = A + return instruments + +/obj/item/instrument/musicalmoth + name = "musical moth" + desc = "Despite its popularity, this controversial musical toy was eventually banned due to its unethically sampled sounds of moths screaming in agony." + icon_state = "mothsician" + allowed_instrument_ids = "mothscream" + attack_verb = list("flutter", "flap") + w_class = WEIGHT_CLASS_TINY + force = 0 + hitsound = 'sound/voice/moth/scream_moth.ogg' + custom_price = 237 + custom_premium_price = 237 \ No newline at end of file diff --git a/code/modules/instruments/songs/_song.dm b/code/modules/instruments/songs/_song.dm new file mode 100644 index 0000000000000..baad00bff3a58 --- /dev/null +++ b/code/modules/instruments/songs/_song.dm @@ -0,0 +1,404 @@ +#define MUSICIAN_HEARCHECK_MINDELAY 4 +#define MUSIC_MAXLINES 1000 +#define MUSIC_MAXLINECHARS 300 + +/** + * # Song datum + * + * These are the actual backend behind instruments. + * They attach to an atom and provide the editor + playback functionality. + */ +/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 + + /// How far we can be heard + var/instrument_range = 15 + + /// 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 //////////////// + /** + * Build by compile_chords() + * Must be rebuilt on instrument switch. + * Compilation happens when we start playing and is cleared after we finish playing. + * Format: list of chord lists, with chordlists having (key1, key2, key3, tempodiv) + */ + var/list/compiled_chords + /// Current section of a long chord we're on, so we don't need to make a billion chords, one for every unit ticklag. + var/elapsed_delay + /// Amount of delay to wait before playing the next chord + var/delay_by + /// Current chord we're on. + var/current_chord + /// 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() + /// Person playing us + var/mob/user_playing + ////////////////////////////////////////////////////// + + /// 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 + /// 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, new_range) + 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() + if(new_range) + instrument_range = new_range + +/datum/song/Destroy() + stop_playing() + SSinstruments.on_song_del(src) + lines = null + if(using_instrument) + using_instrument.songs_using -= src + using_instrument = null + allowed_instrument_ids = null + parent = null + return ..() + +/** + * Checks and stores which mobs can hear us. Terminates sounds for mobs that leave our range. + */ +/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(instrument_range, source)) + hearing_mobs[M] = get_dist(M, source) + var/list/exited = old - hearing_mobs + for(var/i in exited) + terminate_sound_mob(i) + +/** + * Sets our instrument, caching anything necessary for faster accessing. Accepts an ID, typepath, or instantiated instrument datum. + */ +/datum/song/proc/set_instrument(datum/instrument/I) + terminate_all_sounds() + var/old_legacy + if(using_instrument) + using_instrument.songs_using -= src + old_legacy = (using_instrument.instrument_flags & INSTRUMENT_LEGACY) + 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 = (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 + if(isnull(old_legacy) || (old_legacy != instrument_legacy)) + if(playing) + compile_chords() + +/** + * Attempts to start playing our song. + */ +/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 + compile_chords() + if(!length(compiled_chords)) + to_chat(user, "Song is empty.") + return + playing = TRUE + updateDialog(user_playing) + //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. + do_hearcheck() + SEND_SIGNAL(parent, COMSIG_SONG_START) + elapsed_delay = 0 + delay_by = 0 + current_chord = 1 + user_playing = user + START_PROCESSING(SSinstruments, src) + +/** + * Stops playing, terminating all sounds if in synthesized mode. Clears hearing_mobs. + */ +/datum/song/proc/stop_playing() + if(!playing) + return + playing = FALSE + if(!debug_mode) + compiled_chords = null + STOP_PROCESSING(SSinstruments, src) + SEND_SIGNAL(parent, COMSIG_SONG_END) + terminate_all_sounds(TRUE) + hearing_mobs.len = 0 + user_playing = null + +/** + * Processes our song. + */ +/datum/song/proc/process_song(wait) + if(!length(compiled_chords) || should_stop_playing(user_playing)) + stop_playing() + return + var/list/chord = compiled_chords[current_chord] + if(++elapsed_delay >= delay_by) + play_chord(chord) + elapsed_delay = 0 + delay_by = tempodiv_to_delay(chord[length(chord)]) + current_chord++ + if(current_chord > length(compiled_chords)) + if(repeat) + repeat-- + current_chord = 1 + return + else + stop_playing() + return + +/** + * Converts a tempodiv to ticks to elapse before playing the next chord, taking into account our tempo. + */ +/datum/song/proc/tempodiv_to_delay(tempodiv) + if(!tempodiv) + tempodiv = 1 // no division by 0. some song converters tend to use 0 for when it wants to have no div, for whatever reason. + return max(1, round((tempo/tempodiv) / world.tick_lag, 1)) + +/** + * Compiles chords. + */ +/datum/song/proc/compile_chords() + legacy? compile_legacy() : compile_synthesized() + +/** + * Plays a chord. + */ +/datum/song/proc/play_chord(list/chord) + // last value is timing information + for(var/i in 1 to (length(chord) - 1)) + legacy? playkey_legacy(chord[i][1], chord[i][2], chord[i][3], user_playing) : playkey_synth(chord[i], user_playing) + +/** + * Checks if we should halt playback. + */ +/datum/song/proc/should_stop_playing(mob/user) + return QDELETED(parent) || !using_instrument || !playing + +/** + * Sanitizes tempo to a value that makes sense and fits the current world.tick_lag. + */ +/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) + +/** + * Gets our beats per minute based on our tempo. + */ +/datum/song/proc/get_bpm() + return 600 / tempo + +/** + * Sets our tempo from a beats-per-minute, sanitizing it to a valid number first. + */ +/datum/song/proc/set_bpm(bpm) + tempo = sanitize_tempo(600 / bpm) + +/** + * Updates the window for our users. Override down the line. + */ +/datum/song/proc/updateDialog(mob/user) + ui_interact(user) + +/datum/song/process(wait) + if(!playing) + return PROCESS_KILL + // it's expected this ticks at every world.tick_lag. if it lags, do not attempt to catch up. + process_song(world.tick_lag) + process_decay(world.tick_lag) + +/** + * Updates our cached linear/exponential falloff stuff, saving calculations down the line. + */ +/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 + +/** + * Setter for setting output volume. + */ +/datum/song/proc/set_volume(volume) + src.volume = clamp(volume, max(0, min_volume), min(100, max_volume)) + update_sustain() + updateDialog() + +/** + * Setter for setting how low the volume has to get before a note is considered "dead" and dropped + */ +/datum/song/proc/set_dropoff_volume(volume) + sustain_dropoff_volume = clamp(volume, INSTRUMENT_MIN_SUSTAIN_DROPOFF, 100) + update_sustain() + updateDialog() + +/** + * Setter for setting exponential falloff factor. + */ +/datum/song/proc/set_exponential_drop_rate(drop) + sustain_exponential_dropoff = clamp(drop, INSTRUMENT_EXP_FALLOFF_MIN, INSTRUMENT_EXP_FALLOFF_MAX) + update_sustain() + updateDialog() + +/** + * Setter for setting linear falloff duration. + */ +/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) + parent.ui_interact(user || usr) + +/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) + parent.ui_interact(user || usr) + +/datum/song/stationary/should_stop_playing(mob/user) + . = ..() + if(.) + return TRUE + var/obj/structure/musician/M = parent + return M.should_stop_playing(user) \ No newline at end of file diff --git a/code/modules/instruments/songs/editor.dm b/code/modules/instruments/songs/editor.dm new file mode 100644 index 0000000000000..c297e37221dba --- /dev/null +++ b/code/modules/instruments/songs/editor.dm @@ -0,0 +1,251 @@ +/** + * Returns the HTML for the status UI for this song datum. + */ +/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.open() + +/** + * Parses a song the user has input into lines and stores them. + */ +/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() \ No newline at end of file diff --git a/code/modules/instruments/songs/play_legacy.dm b/code/modules/instruments/songs/play_legacy.dm new file mode 100644 index 0000000000000..b95e8f193f548 --- /dev/null +++ b/code/modules/instruments/songs/play_legacy.dm @@ -0,0 +1,91 @@ +/** + * Compiles our lines into "chords" with filenames for legacy playback. This makes there have to be a bit of lag at the beginning of the song, but repeats will not have to parse it again, and overall playback won't be impacted by as much lag. + */ +/datum/song/proc/compile_legacy() + 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[++compiled_chord.len] = list(key, accents[key], octaves[key]) + compiled_chord += tempodiv //this goes last + if(length(compiled_chord)) + compiled_chords[++compiled_chords.len] = compiled_chord + +/** + * Proc to play a legacy note. Just plays the sound to hearing mobs (and does hearcheck if necessary), no fancy channel/sustain/management. + * + * Arguments: + * * 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/playkey_legacy(note, acc as text, oct, mob/user) + // 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 + if(user && HAS_TRAIT(user, TRAIT_MUSICIAN) && isliving(M)) + var/mob/living/L = M + L.apply_status_effect(STATUS_EFFECT_GOOD_MUSIC) + if(!(M?.client?.prefs?.toggles & SOUND_INSTRUMENTS)) + continue + M.playsound_local(source, null, volume * using_instrument.volume_multiplier, S = music_played) + // Could do environment and echo later but not for now \ No newline at end of file diff --git a/code/modules/instruments/songs/play_synthesized.dm b/code/modules/instruments/songs/play_synthesized.dm new file mode 100644 index 0000000000000..b1d6ad500548a --- /dev/null +++ b/code/modules/instruments/songs/play_synthesized.dm @@ -0,0 +1,137 @@ +/** + * Compiles our lines into "chords" with numbers. This makes there have to be a bit of lag at the beginning of the song, but repeats will not have to parse it again, and overall playback won't be impacted by as much lag. + */ +/datum/song/proc/compile_synthesized() + 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 + +/** + * Plays a specific numerical key from our instrument to anyone who can hear us. + * Does a hearing check if enough time has passed. + */ +/datum/song/proc/playkey_synth(key, mob/user) + 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 + if(user && HAS_TRAIT(user, TRAIT_MUSICIAN) && isliving(M)) + var/mob/living/L = M + L.apply_status_effect(STATUS_EFFECT_GOOD_MUSIC) + if(!(M?.client?.prefs?.toggles & SOUND_INSTRUMENTS)) + continue + 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 + +/** + * Stops all sounds we are "responsible" for. Only works in synthesized mode. + */ +/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) + +/** + * Stops all sounds we are responsible for in a given person. Only works in synthesized mode. + */ +/datum/song/proc/terminate_sound_mob(mob/M) + for(var/channel in channels_playing) + M.stop_sound_channel(text2num(channel)) + +/** + * Pops a channel we have reserved so we don't have to release and re-request them from SSsounds every time we play a note. This is faster. + */ +/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++ + +/** + * Decays our channels and updates their volumes to mobs who can hear us. + * + * Arguments: + * * wait_ds - the deciseconds we should decay by. This is to compensate for any lag, as otherwise songs would get pretty nasty during high time dilation. + */ +/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) \ No newline at end of file diff --git a/code/modules/instruments/stationary.dm b/code/modules/instruments/stationary.dm new file mode 100644 index 0000000000000..79228d88a8fd9 --- /dev/null +++ b/code/modules/instruments/stationary.dm @@ -0,0 +1,52 @@ +/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 = list("r3grand","r3harpsi","crharpsi","crgrand1","crbright1", "crichugan", "crihamgan","piano") + 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) + . = ..() + 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" \ No newline at end of file diff --git a/code/modules/integrated_electronics/core/analyzer.dm b/code/modules/integrated_electronics/core/analyzer.dm deleted file mode 100644 index c3851cdb320a9..0000000000000 --- a/code/modules/integrated_electronics/core/analyzer.dm +++ /dev/null @@ -1,22 +0,0 @@ -/obj/item/integrated_electronics/analyzer - name = "circuit analyzer" - desc = "This tool can scan an assembly and generate code necessary to recreate it in a circuit printer." - icon = 'icons/obj/assemblies/electronic_tools.dmi' - icon_state = "analyzer" - flags_1 = CONDUCT_1 - w_class = WEIGHT_CLASS_SMALL - -/obj/item/integrated_electronics/analyzer/afterattack(var/atom/A, var/mob/living/user) - . = ..() - if(istype(A, /obj/item/electronic_assembly)) - var/obj/item/electronic_assembly/EA = A - if(EA.idlock) - to_chat(user, "[A] is currently identity-locked and can't be analyzed.") - return FALSE - - var/saved = "[A.name] analyzed! On circuit printers with cloning enabled, you may use the code below to clone the circuit:

[SScircuit.save_electronic_assembly(A)]" - if(saved) - to_chat(user, "You scan [A].") - user << browse(saved, "window=circuit_scan;size=500x600;border=1;can_resize=1;can_close=1;can_minimize=1") - else - to_chat(user, "[A] is not complete enough to be encoded!") diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm deleted file mode 100644 index b3f604daf194b..0000000000000 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ /dev/null @@ -1,1048 +0,0 @@ -#define IC_MAX_SIZE_BASE 25 -#define IC_COMPLEXITY_BASE 75 - -/obj/item/electronic_assembly - name = "electronic assembly" - obj_flags = CAN_BE_HIT | UNIQUE_RENAME - desc = "A case designed for building small electronics." - w_class = WEIGHT_CLASS_SMALL - icon = 'icons/obj/assemblies/electronic_setups.dmi' - icon_state = "setup_small" - item_flags = NOBLUDGEON - materials = list() // To be filled later - datum_flags = DF_USE_TAG - var/list/assembly_components = list() - var/list/ckeys_allowed_to_scan = list() // Players who built the circuit can scan it as a ghost. - var/max_components = IC_MAX_SIZE_BASE - var/max_complexity = IC_COMPLEXITY_BASE - var/opened = TRUE - var/obj/item/stock_parts/cell/battery // Internal cell which most circuits need to work. - var/cell_type = /obj/item/stock_parts/cell - var/can_charge = TRUE //Can it be charged in a recharger? - var/can_fire_equipped = FALSE //Can it fire/throw weapons when the assembly is being held? - var/charge_sections = 4 - var/charge_tick = FALSE - var/charge_delay = 4 - var/use_cyborg_cell = TRUE - var/ext_next_use = 0 - var/atom/collw - var/obj/item/card/id/access_card - var/allowed_circuit_action_flags = IC_ACTION_COMBAT | IC_ACTION_LONG_RANGE //which circuit flags are allowed - var/combat_circuits = 0 //number of combat cicuits in the assembly, used for diagnostic hud - var/long_range_circuits = 0 //number of long range cicuits in the assembly, used for diagnostic hud - var/prefered_hud_icon = "hudstat" // Used by the AR circuit to change the hud icon. - var/creator // circuit creator if any - var/static/next_assembly_id = 0 - var/sealed = FALSE - var/datum/weakref/idlock = null - - hud_possible = list(DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD, DIAG_CIRCUIT_HUD) //diagnostic hud overlays - max_integrity = 50 - pass_flags = 0 - armor = list("melee" = 50, "bullet" = 70, "laser" = 70, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0) - anchored = FALSE - var/can_anchor = TRUE - var/detail_color = COLOR_ASSEMBLY_BLACK - -/obj/item/electronic_assembly/New() - ..() - src.max_components = round(max_components) - src.max_complexity = round(max_complexity) - -/obj/item/electronic_assembly/GenerateTag() - tag = "assembly_[next_assembly_id++]" - -/obj/item/electronic_assembly/examine(mob/user) - . = ..() - if(can_anchor) - to_chat(user, "The anchoring bolts [anchored ? "are" : "can be"] wrenched in place and the maintenance panel [opened ? "can be" : "is"] screwed in place.") - else - to_chat(user, "The maintenance panel [opened ? "can be" : "is"] screwed in place.") - - if((isobserver(user) && ckeys_allowed_to_scan[user.ckey]) || IsAdminGhost(user)) - to_chat(user, "You can scan this circuit.") - - for(var/obj/item/integrated_circuit/I in assembly_components) - I.external_examine(user) - if(opened) - interact(user) - -/obj/item/electronic_assembly/proc/check_interactivity(mob/user) - if(!istype(user, /mob)) - return - return user.canUseTopic(src, BE_CLOSE) - -/obj/item/electronic_assembly/Bump(atom/AM) - collw = AM - .=..() - if((istype(collw, /obj/machinery/door/airlock) || istype(collw, /obj/machinery/door/window)) && (!isnull(access_card))) - var/obj/machinery/door/D = collw - if(D.check_access(access_card)) - D.open() - -/obj/item/electronic_assembly/Initialize() - .=..() - START_PROCESSING(SScircuit, src) - materials[/datum/material/iron] = round((max_complexity + max_components) / 4) * SScircuit.cost_multiplier - - //sets up diagnostic hud view - prepare_huds() - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_to_hud(src) - diag_hud_set_circuithealth() - diag_hud_set_circuitcell() - diag_hud_set_circuitstat() - diag_hud_set_circuittracking() - - access_card = new /obj/item/card/id(src) - -/obj/item/electronic_assembly/Destroy() - STOP_PROCESSING(SScircuit, src) - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.remove_from_hud(src) - QDEL_NULL(access_card) - return ..() - -/obj/item/electronic_assembly/process() - handle_idle_power() - check_pulling() - - //updates diagnostic hud - diag_hud_set_circuithealth() - diag_hud_set_circuitcell() - -/obj/item/electronic_assembly/proc/handle_idle_power() - - // First we generate power. - for(var/obj/item/integrated_circuit/passive/power/P in assembly_components) - P.make_energy() - - // Now spend it. - for(var/obj/item/integrated_circuit/I in assembly_components) - if(I.power_draw_idle) - if(!draw_power(I.power_draw_idle)) - I.power_fail() - -/obj/item/electronic_assembly/interact(mob/user, circuit) - ui_interact(user, circuit) - -/obj/item/electronic_assembly/ui_interact(mob/user, obj/item/integrated_circuit/circuit_pins) - . = ..() - if(!check_interactivity(user)) - return - - var/total_part_size = return_total_size() - var/total_complexity = return_total_complexity() - var/datum/browser/popup = new(user, "scannernew", name, 800, 630) // Set up the popup browser window - popup.add_stylesheet("scannernew", 'html/browser/assembly_ui.css') - - var/HTML = "[name]\ - \ - Refresh | Rename
\ - [total_part_size]/[max_components] ([round((total_part_size / max_components) * 100, 0.1)]%) space taken up in the assembly.
\ - [total_complexity]/[max_complexity] ([round((total_complexity / max_complexity) * 100, 0.1)]%) maximum complexity.
" - if(battery) - HTML += "[round(battery.charge, 0.1)]/[battery.maxcharge] ([round(battery.percent(), 0.1)]%) cell charge. Remove" - else - HTML += "No power cell detected!" - HTML += "" - - - //Getting the newest viewed circuit to compare with new circuit list - if(!circuit_pins || !istype(circuit_pins,/obj/item/integrated_circuit) || !(circuit_pins in assembly_components)) - if(assembly_components.len > 0) - circuit_pins = assembly_components[1] - - - HTML += "
Components:
" - - var/builtin_components = "" - var/removables = "" - var/remove_num = 1 - - for(var/obj/item/integrated_circuit/circuit in assembly_components) - if(!circuit.removable) - if(circuit == circuit_pins) - builtin_components += "[circuit.displayed_name]
" - else - builtin_components += "[circuit.displayed_name]
" - - // Non-inbuilt circuits come after inbuilt circuits - else - removables += "[remove_num]. | " - if(circuit == circuit_pins) - removables += "[circuit.displayed_name]
" - else - removables += "[circuit.displayed_name]
" - remove_num++ - - // Put removable circuits (if any) in separate categories from non-removable - if(builtin_components) - HTML += "
Built in:
[builtin_components]
Removable:
" - - HTML += removables - - HTML += "
" - - - //Getting the newest circuit's pin - if(!circuit_pins || !istype(circuit_pins,/obj/item/integrated_circuit)) - if(assembly_components.len > 0) - circuit_pins = assembly_components[1] - - if(circuit_pins) - HTML += "
[circuit_pins.displayed_name]
" - - HTML += "Refresh | \ - Rename | \ - Copy Ref | \ - Interact" - if(circuit_pins.removable) - HTML += " | Remove" - HTML += "

" - - var/table_edge_width = "30%" - var/table_middle_width = "40%" - - HTML += "\ - \ - \ - \ - " - - var/column_width = 3 - var/row_height = max(circuit_pins.inputs.len, circuit_pins.outputs.len, 1) - - for(var/i = 1 to row_height) - HTML += "" - for(var/j = 1 to column_width) - var/datum/integrated_io/io = null - var/words = "" - var/height = 1 - switch(j) - if(1) - io = circuit_pins.get_pin_ref(IC_INPUT, i) - if(io) - words += "[io.display_pin_type()] [io.name] \ - [io.display_data(io.data)]
" - if(io.linked.len) - words += "" - - if(circuit_pins.outputs.len > circuit_pins.inputs.len) - height = 1 - if(2) - if(i == 1) - words += "[circuit_pins.displayed_name]
[circuit_pins.name != circuit_pins.displayed_name ? "([circuit_pins.name])":""]
[circuit_pins.desc]" - height = row_height - else - continue - if(3) - io = circuit_pins.get_pin_ref(IC_OUTPUT, i) - if(io) - words += "[io.display_pin_type()] [io.name] \ - [io.display_data(io.data)]
" - if(io.linked.len) - words += "" - - if(circuit_pins.inputs.len > circuit_pins.outputs.len) - height = 1 - HTML += "" - HTML += "" - - for(var/activator in circuit_pins.activators) - var/datum/integrated_io/io = activator - var/words = "" - - words += "[io] \ - [io.data?"\":"\"]
" - if(io.linked.len) - words += "" - - HTML += "" - - HTML += "\ -
Complexity: [circuit_pins.complexity]\ -
Cooldown per use: [circuit_pins.cooldown_per_use/10] sec" - if(circuit_pins.ext_cooldown) - HTML += "
External manipulation cooldown: [circuit_pins.ext_cooldown/10] sec" - if(circuit_pins.power_draw_idle) - HTML += "
Power Draw: [circuit_pins.power_draw_idle] W (Idle)" - if(circuit_pins.power_draw_per_use) - HTML += "
Power Draw: [circuit_pins.power_draw_per_use] W (Active)" // Borgcode says that powercells' checked_use() takes joules as input. - HTML += "
[circuit_pins.extended_desc]
[words]
[words]
" - - - HTML += "
" - - popup.set_content(HTML) - popup.open() - -/obj/item/electronic_assembly/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["ghostscan"]) - if((isobserver(usr) && ckeys_allowed_to_scan[usr.ckey]) || IsAdminGhost(usr)) - if(assembly_components.len) - var/saved = "On circuit printers with cloning enabled, you may use the code below to clone the circuit:

[SScircuit.save_electronic_assembly(src)]" - usr << browse(saved, "window=circuit_scan;size=500x600;border=1;can_resize=1;can_close=1;can_minimize=1") - else - to_chat(usr, "The circuit is empty!") - return - - if(!check_interactivity(usr)) - return - - if(href_list["rename"]) - rename(usr) - - if(href_list["remove_cell"]) - if(!battery) - to_chat(usr, "There's no power cell to remove from \the [src].") - else - battery.forceMove(drop_location()) - playsound(src, 'sound/items/Crowbar.ogg', 50, 1) - to_chat(usr, "You pull \the [battery] out of \the [src]'s power supplier.") - battery = null - diag_hud_set_circuitstat() //update diagnostic hud - - var/obj/item/integrated_circuit/component - - if(href_list["component"]) - component = locate(href_list["component"]) in assembly_components - - if(!component) - return - - - if(href_list["scan"]) - var/obj/held_item = usr.get_active_held_item() - if(istype(held_item, /obj/item/integrated_electronics/debugger)) - var/obj/item/integrated_electronics/debugger/D = held_item - if(D.accepting_refs) - D.afterattack(component, usr, TRUE) - else - to_chat(usr, "The debugger's 'ref scanner' needs to be on.") - else - to_chat(usr, "You need a debugger set to 'ref' mode to do that.") - - // Builtin components are not supposed to be removed or rearranged - if(!component.removable) - return - - add_allowed_scanner(usr.ckey) - - // Find the position of a first removable component - var/first_removable_pos = 0 - for(var/i in assembly_components) - first_removable_pos++ - var/obj/item/integrated_circuit/temp_component = i - if(temp_component.removable) - break - - if(href_list["remove"]) - if(try_remove_component(component, usr)) - component = null - - if(href_list["rename_component"]) - component.rename_component(usr) - if(component.assembly) - component.assembly.add_allowed_scanner(usr.ckey) - - if(href_list["interact"]) - var/obj/item/I = usr.get_active_held_item() - if(istype(I)) - I.melee_attack_chain(usr, component) - else - component.attack_hand(usr) - - // Adjust the position - if(href_list["change_pos"]) - var/new_pos = max(input(usr,"Write the new number","New position") as num,1) - - if(new_pos > assembly_components.len) - new_pos = assembly_components.len - - if(new_pos < first_removable_pos) - new_pos = first_removable_pos - - assembly_components.Remove(component) - assembly_components.Insert(new_pos, component) - - interact(usr, component) // To refresh the UI. - -/obj/item/electronic_assembly/pickup(mob/living/user) - . = ..() - //update diagnostic hud when picked up, true is used to force the hud to be hidden - diag_hud_set_circuithealth(TRUE) - diag_hud_set_circuitcell(TRUE) - diag_hud_set_circuitstat(TRUE) - diag_hud_set_circuittracking(TRUE) - -/obj/item/electronic_assembly/dropped(mob/user) - . = ..() - //update diagnostic hud when dropped - diag_hud_set_circuithealth() - diag_hud_set_circuitcell() - diag_hud_set_circuitstat() - diag_hud_set_circuittracking() - -/obj/item/electronic_assembly/proc/rename() - var/mob/M = usr - if(!check_interactivity(M)) - return - - var/input = reject_bad_name(input("What do you want to name this?", "Rename", src.name) as null|text, TRUE) - if(!check_interactivity(M)) - return - if(src && input) - to_chat(M, "The machine now has a label reading '[input]'.") - name = input - -/obj/item/electronic_assembly/proc/add_allowed_scanner(ckey) - ckeys_allowed_to_scan[ckey] = TRUE - -/obj/item/electronic_assembly/proc/can_move() - return FALSE - -/obj/item/electronic_assembly/update_icon() - if(opened) - icon_state = initial(icon_state) + "-open" - else - icon_state = initial(icon_state) - cut_overlays() - if(detail_color == COLOR_ASSEMBLY_BLACK) //Black colored overlay looks almost but not exactly like the base sprite, so just cut the overlay and avoid it looking kinda off. - return - var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/assemblies/electronic_setups.dmi', "[icon_state]-color") - detail_overlay.color = detail_color - add_overlay(detail_overlay) - -/obj/item/electronic_assembly/proc/return_total_complexity() - var/returnvalue = 0 - for(var/obj/item/integrated_circuit/part in assembly_components) - returnvalue += part.complexity - return(returnvalue) - -/obj/item/electronic_assembly/proc/return_total_size() - var/returnvalue = 0 - for(var/obj/item/integrated_circuit/part in assembly_components) - returnvalue += part.size - return(returnvalue) - -// Returns true if the circuit made it inside. -/obj/item/electronic_assembly/proc/try_add_component(obj/item/integrated_circuit/IC, mob/user) - if(!opened) - to_chat(user, "\The [src]'s hatch is closed, you can't put anything inside.") - return FALSE - - if(IC.w_class > w_class) - to_chat(user, "\The [IC] is way too big to fit into \the [src].") - return FALSE - - var/total_part_size = return_total_size() - var/total_complexity = return_total_complexity() - - if(IC.max_allowed) - var/current_components - for(var/obj/item/integrated_circuit/component as anything in assembly_components) - if(component.type == IC.type) - current_components++ - if(current_components >= IC.max_allowed) - to_chat(user, "You can't seem to add the '[IC]', as there are too many installed already.") - return FALSE - - if((total_part_size + IC.size) > max_components) - to_chat(user, "You can't seem to add the '[IC]', as there's insufficient space.") - return FALSE - if((total_complexity + IC.complexity) > max_complexity) - to_chat(user, "You can't seem to add the '[IC]', since this setup's too complicated for the case.") - return FALSE - if((allowed_circuit_action_flags & IC.action_flags) != IC.action_flags) - to_chat(user, "You can't seem to add the '[IC]', since the case doesn't support the circuit type.") - return FALSE - - if(!user.transferItemToLoc(IC, src)) - return FALSE - - to_chat(user, "You slide [IC] inside [src].") - playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) - add_allowed_scanner(user.ckey) - investigate_log("had [IC]([IC.type]) inserted by [key_name(user)].", INVESTIGATE_CIRCUIT) - - add_component(IC) - return TRUE - - -// Actually puts the circuit inside, doesn't perform any checks. -/obj/item/electronic_assembly/proc/add_component(obj/item/integrated_circuit/component) - component.forceMove(get_object()) - component.assembly = src - assembly_components |= component - - //increment numbers for diagnostic hud - if(component.action_flags & IC_ACTION_COMBAT) - combat_circuits += 1; - if(component.action_flags & IC_ACTION_LONG_RANGE) - long_range_circuits += 1; - - //diagnostic hud update - diag_hud_set_circuitstat() - diag_hud_set_circuittracking() - - -/obj/item/electronic_assembly/proc/try_remove_component(obj/item/integrated_circuit/IC, mob/user, silent) - if(!opened) - if(!silent) - to_chat(user, "[src]'s hatch is closed, so you can't fiddle with the internal components.") - return FALSE - - if(!IC.removable) - if(!silent) - to_chat(user, "[src] is permanently attached to the case.") - return FALSE - - remove_component(IC) - if(!silent) - to_chat(user, "You pop \the [IC] out of the case, and slide it out.") - playsound(src, 'sound/items/crowbar.ogg', 50, 1) - user.put_in_hands(IC) - add_allowed_scanner(user.ckey) - investigate_log("had [IC]([IC.type]) removed by [key_name(user)].", INVESTIGATE_CIRCUIT) - - return TRUE - -// Actually removes the component, doesn't perform any checks. -/obj/item/electronic_assembly/proc/remove_component(obj/item/integrated_circuit/component) - component.disconnect_all() - component.forceMove(drop_location()) - component.assembly = null - - assembly_components -= component - - //decrement numbers for diagnostic hud - if(component.action_flags & IC_ACTION_COMBAT) - combat_circuits -= 1; - if(component.action_flags & IC_ACTION_LONG_RANGE) - long_range_circuits -= 1; - - //diagnostic hud update - diag_hud_set_circuitstat() - diag_hud_set_circuittracking() - - -/obj/item/electronic_assembly/afterattack(atom/target, mob/user, proximity) - . = ..() - for(var/obj/item/integrated_circuit/input/S in assembly_components) - if(S.sense(target,user,proximity)) - visible_message(" [user] waves [src] around [target].") - - -/obj/item/electronic_assembly/screwdriver_act(mob/living/user, obj/item/I) - if(sealed) - to_chat(user,"The assembly is sealed. Any attempt to force it open would break it.") - return FALSE - if(..()) - return TRUE - I.play_tool_sound(src) - opened = !opened - to_chat(user, "You [opened ? "open" : "close"] the maintenance hatch of [src].") - update_icon() - return TRUE - -/obj/item/electronic_assembly/welder_act(mob/living/user, obj/item/I) - var/type_to_use - - if(!sealed) - type_to_use = input("What would you like to do?","[src] type setting") as null|anything in list("repair", "seal") - else - type_to_use = input("What would you like to do?","[src] type setting") as null|anything in list("repair", "unseal") - - switch(type_to_use) - if("repair") - to_chat(world,"Integrity: [obj_integrity] / [max_integrity]") - if(obj_integrity < max_integrity) - obj_integrity = min(obj_integrity + 20,max_integrity) - to_chat(world,"Integrity: [obj_integrity] / [max_integrity]") - to_chat(user,"You fix the dents and scratches of the assembly.") - to_chat(world,user) - return TRUE - - else - to_chat(user,"The assembly is already in impeccable condition.") - return FALSE - - if("seal") - if(!opened) - sealed = TRUE - if(I.use_tool(src, user, 50, volume=100, amount=3)) - to_chat(user,"You seal the assembly, making it impossible to be opened.") - return TRUE - - else - to_chat(user,"You need to close the assembly first before sealing it indefinitely!") - return FALSE - - if("unseal") - to_chat(user,"You start unsealing the assembly carefully...") - if(I.use_tool(src, user, 50, volume=250, amount=3)) - for(var/obj/item/integrated_circuit/IC in assembly_components) - if(prob(50)) - IC.disconnect_all() - - to_chat(user,"You unsealed the assembly.") - sealed = FALSE - return TRUE - -/obj/item/electronic_assembly/attackby(obj/item/I, mob/living/user) - if(can_anchor && default_unfasten_wrench(user, I, 20)) - return - - // ID-Lock part: check if we have an id-lock and only lock if we're not trying to get values from it, to prevent accidents - if(istype(I, /obj/item/integrated_electronics/debugger)) - var/obj/item/integrated_electronics/debugger/debugger = I - if(debugger.idlock) - // check if unlocked to lock - if(!idlock) - idlock = debugger.idlock - to_chat(user,"You lock \the [src].") - - //if locked, unlock if ids match - else - if(idlock.resolve() == debugger.idlock.resolve()) - idlock = null - to_chat(user,"You unlock \the [src].") - - else - to_chat(user,"The scanned ID doesn't match with \the [src]'s lock.") - - debugger.idlock = null - return - - if(istype(I, /obj/item/integrated_circuit)) - if(!user.canUnEquip(I)) - return FALSE - if(try_add_component(I, user)) - return TRUE - else - for(var/obj/item/integrated_circuit/input/S in assembly_components) - S.attackby_react(I,user,user.a_intent) - return ..() - - else if(I.tool_behaviour == TOOL_MULTITOOL || istype(I, /obj/item/integrated_electronics/wirer) || istype(I, /obj/item/integrated_electronics/debugger)) - if(opened) - interact(user) - return TRUE - else - to_chat(user, "[src]'s hatch is closed, so you can't fiddle with the internal components.") - for(var/obj/item/integrated_circuit/input/S in assembly_components) - S.attackby_react(I,user,user.a_intent) - return ..() - - else if(istype(I, /obj/item/stock_parts/cell)) - if(!opened) - to_chat(user, "[src]'s hatch is closed, so you can't access \the [src]'s power supplier.") - for(var/obj/item/integrated_circuit/input/S in assembly_components) - S.attackby_react(I,user,user.a_intent) - return ..() - if(battery) - to_chat(user, "[src] already has \a [battery] installed. Remove it first if you want to replace it.") - for(var/obj/item/integrated_circuit/input/S in assembly_components) - S.attackby_react(I,user,user.a_intent) - return ..() - I.forceMove(src) - battery = I - diag_hud_set_circuitstat() //update diagnostic hud - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) - to_chat(user, "You slot the [I] inside \the [src]'s power supplier.") - return TRUE - - else if(istype(I, /obj/item/integrated_electronics/detailer)) - var/obj/item/integrated_electronics/detailer/D = I - detail_color = D.detail_color - update_icon() - - else - if(user.a_intent != INTENT_HELP) - return ..() - var/list/input_selection = list() - //Check all the components asking for an input - for(var/obj/item/integrated_circuit/input in assembly_components) - if((input.demands_object_input && opened) || (input.demands_object_input && input.can_input_object_when_closed)) - var/i = 0 - //Check if there is another component with the same name and append a number for identification - for(var/s in input_selection) - var/obj/item/integrated_circuit/s_circuit = input_selection[s] //The for-loop iterates the keys of the associative list. - if(s_circuit.name == input.name && s_circuit.displayed_name == input.displayed_name && s_circuit != input) - i++ - var/disp_name= "[input.displayed_name] \[[input]\]" - if(i) - disp_name += " ([i+1])" - //Associative lists prevent me from needing another list and using a Find proc - input_selection[disp_name] = input - - var/obj/item/integrated_circuit/choice - if(input_selection) - if(input_selection.len == 1) - choice = input_selection[input_selection[1]] - else - var/selection = input(user, "Where do you want to insert that item?", "Interaction") as null|anything in input_selection - if(!check_interactivity(user)) - return ..() - if(selection) - choice = input_selection[selection] - if(choice) - choice.additem(I, user) - for(var/obj/item/integrated_circuit/input/S in assembly_components) - S.attackby_react(I,user,user.a_intent) - return ..() - - -/obj/item/electronic_assembly/attack_self(mob/user) - if(!check_interactivity(user)) - return - if(opened) - interact(user) - - var/list/input_selection = list() - //Check all the components asking for an input - for(var/obj/item/integrated_circuit/input/input in assembly_components) - if(input.can_be_asked_input) - var/i = 0 - //Check if there is another component with the same name and append a number for identification - for(var/s in input_selection) - var/obj/item/integrated_circuit/s_circuit = input_selection[s] //The for-loop iterates the keys of an associative list. - if(s_circuit.name == input.name && s_circuit.displayed_name == input.displayed_name && s_circuit != input) - i++ - var/disp_name= "[input.displayed_name] \[[input]\]" - if(i) - disp_name += " ([i+1])" - //Associative lists prevent me from needing another list and using a Find proc - input_selection[disp_name] = input - - var/obj/item/integrated_circuit/input/choice - - - if(input_selection) - if(input_selection.len ==1) - choice = input_selection[input_selection[1]] - else - var/selection = input(user, "What do you want to interact with?", "Interaction") as null|anything in input_selection - if(!check_interactivity(user)) - return - if(selection) - choice = input_selection[selection] - - if(choice) - choice.ask_for_input(user) - -/obj/item/electronic_assembly/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_CONTENTS) - return - for(var/I in src) - var/atom/movable/AM = I - AM.emp_act(severity) - -// Returns true if power was successfully drawn. -/obj/item/electronic_assembly/proc/draw_power(amount) - if(battery && battery.use(amount * GLOB.CELLRATE)) - return TRUE - return FALSE - -// Ditto for giving. -/obj/item/electronic_assembly/proc/give_power(amount) - if(battery && battery.give(amount * GLOB.CELLRATE)) - return TRUE - return FALSE - -/obj/item/electronic_assembly/Moved(oldLoc, dir) - for(var/I in assembly_components) - var/obj/item/integrated_circuit/IC = I - IC.ext_moved(oldLoc, dir) - if(light) //Update lighting objects (From light circuits). - update_light() - -/obj/item/electronic_assembly/stop_pulling() - for(var/I in assembly_components) - var/obj/item/integrated_circuit/IC = I - IC.stop_pulling() - ..() - - -// Returns the object that is supposed to be used in attack messages, location checks, etc. -// Override in children for special behavior. -/obj/item/electronic_assembly/proc/get_object() - return src - -// Returns the location to be used for dropping items. -// Same as the regular drop_location(), but with checks being run on acting_object if necessary. -/obj/item/integrated_circuit/drop_location() - var/atom/movable/acting_object = get_object() - - // plz no infinite loops - if(acting_object == src) - return ..() - - return acting_object.drop_location() - -/obj/item/electronic_assembly/attack_tk(mob/user) - if(anchored) - return - ..() - -/obj/item/electronic_assembly/attack_hand(mob/user) - if(anchored) - attack_self(user) - return - ..() - -/obj/item/electronic_assembly/default //The /default electronic_assemblys are to allow the introduction of the new naming scheme without breaking old saves. - name = "type-a electronic assembly" - -/obj/item/electronic_assembly/calc - name = "type-b electronic assembly" - icon_state = "setup_small_calc" - desc = "A case designed for building small electronics. This one resembles a pocket calculator." - -/obj/item/electronic_assembly/clam - name = "type-c electronic assembly" - icon_state = "setup_small_clam" - desc = "A case designed for building small electronics. This one has a clamshell design." - -/obj/item/electronic_assembly/simple - name = "type-d electronic assembly" - icon_state = "setup_small_simple" - desc = "A case designed for building small electronics. This one has a simple design." - -/obj/item/electronic_assembly/hook - name = "type-e electronic assembly" - icon_state = "setup_small_hook" - desc = "A case designed for building small electronics. This one looks like it has a belt clip, but it's purely decorative." - -/obj/item/electronic_assembly/pda - name = "type-f electronic assembly" - icon_state = "setup_small_pda" - desc = "A case designed for building small electronics. This one resembles a PDA." - -/obj/item/electronic_assembly/small - name = "electronic device" - icon_state = "setup_device" - desc = "A case designed for building tiny-sized electronics." - w_class = WEIGHT_CLASS_TINY - max_components = IC_MAX_SIZE_BASE / 2 - max_complexity = IC_COMPLEXITY_BASE / 2 - -/obj/item/electronic_assembly/small/default - name = "type-a electronic device" - -/obj/item/electronic_assembly/small/cylinder - name = "type-b electronic device" - icon_state = "setup_device_cylinder" - desc = "A case designed for building tiny-sized electronics. This one has a cylindrical design." - -/obj/item/electronic_assembly/small/scanner - name = "type-c electronic device" - icon_state = "setup_device_scanner" - desc = "A case designed for building tiny-sized electronics. This one has a scanner-like design." - -/obj/item/electronic_assembly/small/hook - name = "type-d electronic device" - icon_state = "setup_device_hook" - desc = "A case designed for building tiny-sized electronics. This one looks like it has a belt clip, but it's purely decorative." - -/obj/item/electronic_assembly/small/box - name = "type-e electronic device" - icon_state = "setup_device_box" - desc = "A case designed for building tiny-sized electronics. This one has a box design." - -/obj/item/electronic_assembly/medium - name = "electronic mechanism" - icon_state = "setup_medium" - desc = "A case designed for building medium-sized electonics." - w_class = WEIGHT_CLASS_NORMAL - max_components = IC_MAX_SIZE_BASE * 2 - max_complexity = IC_COMPLEXITY_BASE * 2 - -/obj/item/electronic_assembly/medium/default - name = "type-a electronic mechanism" - -/obj/item/electronic_assembly/medium/box - name = "type-b electronic mechanism" - icon_state = "setup_medium_box" - desc = "A case designed for building medium-sized electonics. This one has a box design." - -/obj/item/electronic_assembly/medium/clam - name = "type-c electronic mechanism" - icon_state = "setup_medium_clam" - desc = "A case designed for building medium-sized electonics. This one has a clamshell design." - -/obj/item/electronic_assembly/medium/medical - name = "type-d electronic mechanism" - icon_state = "setup_medium_med" - desc = "A case designed for building medium-sized electonics. This one resembles medical apparatus." - -/obj/item/electronic_assembly/medium/gun - name = "type-e electronic mechanism" - icon_state = "setup_medium_gun" - item_state = "circuitgun" - desc = "A case designed for building medium-sized electonics. This one resembles a gun, or some type of tool, if you're feeling optimistic. It can fire guns and throw items while the user is holding it." - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - can_fire_equipped = TRUE - -/obj/item/electronic_assembly/medium/radio - name = "type-f electronic mechanism" - icon_state = "setup_medium_radio" - desc = "A case designed for building medium-sized electonics. This one resembles an old radio." - -/obj/item/electronic_assembly/large - name = "electronic machine" - icon_state = "setup_large" - desc = "A case designed for building large electronics." - w_class = WEIGHT_CLASS_BULKY - max_components = IC_MAX_SIZE_BASE * 4 - max_complexity = IC_COMPLEXITY_BASE * 4 - -/obj/item/electronic_assembly/large/default - name = "type-a electronic machine" - -/obj/item/electronic_assembly/large/scope - name = "type-b electronic machine" - icon_state = "setup_large_scope" - desc = "A case designed for building large electronics. This one resembles an oscilloscope." - -/obj/item/electronic_assembly/large/terminal - name = "type-c electronic machine" - icon_state = "setup_large_terminal" - desc = "A case designed for building large electronics. This one resembles a computer terminal." - -/obj/item/electronic_assembly/large/arm - name = "type-d electronic machine" - icon_state = "setup_large_arm" - desc = "A case designed for building large electronics. This one resembles a robotic arm." - -/obj/item/electronic_assembly/large/tall - name = "type-e electronic machine" - icon_state = "setup_large_tall" - desc = "A case designed for building large electronics. This one has a tall design." - -/obj/item/electronic_assembly/large/industrial - name = "type-f electronic machine" - icon_state = "setup_large_industrial" - desc = "A case designed for building mobile electronics. This one resembles industrial machinery." - -/obj/item/electronic_assembly/drone - name = "electronic drone" - icon_state = "setup_drone" - desc = "A case designed for building mobile electronics." - w_class = WEIGHT_CLASS_BULKY - max_components = IC_MAX_SIZE_BASE * 3 - max_complexity = IC_COMPLEXITY_BASE * 3 - allowed_circuit_action_flags = IC_ACTION_MOVEMENT | IC_ACTION_COMBAT | IC_ACTION_LONG_RANGE - can_anchor = FALSE - -/obj/item/electronic_assembly/drone/can_move() - return TRUE - -/obj/item/electronic_assembly/drone/default - name = "type-a electronic drone" - -/obj/item/electronic_assembly/drone/arms - name = "type-b electronic drone" - icon_state = "setup_drone_arms" - desc = "A case designed for building mobile electronics. This one is armed and dangerous." - -/obj/item/electronic_assembly/drone/secbot - name = "type-c electronic drone" - icon_state = "setup_drone_secbot" - desc = "A case designed for building mobile electronics. This one resembles a Securitron." - -/obj/item/electronic_assembly/drone/medbot - name = "type-d electronic drone" - icon_state = "setup_drone_medbot" - desc = "A case designed for building mobile electronics. This one resembles a Medibot." - -/obj/item/electronic_assembly/drone/genbot - name = "type-e electronic drone" - icon_state = "setup_drone_genbot" - desc = "A case designed for building mobile electronics. This one has a generic bot design." - -/obj/item/electronic_assembly/drone/android - name = "type-f electronic drone" - icon_state = "setup_drone_android" - desc = "A case designed for building mobile electronics. This one has a hominoid design." - -/obj/item/electronic_assembly/wallmount - name = "wall-mounted electronic assembly" - icon_state = "setup_wallmount_medium" - desc = "A case designed for building medium-sized electronics.. It has a magnetized backing to allow it to stick to walls, but you'll still need to wrench the anchoring bolts in place to keep it on." - w_class = WEIGHT_CLASS_NORMAL - max_components = IC_MAX_SIZE_BASE * 2 - max_complexity = IC_COMPLEXITY_BASE * 2 - -/obj/item/electronic_assembly/wallmount/heavy - name = "heavy wall-mounted electronic assembly" - icon_state = "setup_wallmount_large" - desc = "A case designed for building large electronics. It has a magnetized backing to allow it to stick to walls, but you'll still need to wrench the anchoring bolts in place to keep it on." - w_class = WEIGHT_CLASS_BULKY - max_components = IC_MAX_SIZE_BASE * 4 - max_complexity = IC_COMPLEXITY_BASE * 4 - -/obj/item/electronic_assembly/wallmount/light - name = "light wall-mounted electronic assembly" - icon_state = "setup_wallmount_small" - desc = "A case designed for building small electronics. It has a magnetized backing to allow it to stick to walls, but you'll still need to wrench the anchoring bolts in place to keep it on." - w_class = WEIGHT_CLASS_SMALL - max_components = IC_MAX_SIZE_BASE - max_complexity = IC_COMPLEXITY_BASE - -/obj/item/electronic_assembly/wallmount/tiny - name = "tiny wall-mounted electronic assembly" - icon_state = "setup_wallmount_tiny" - desc = "It's a case, for building tiny electronics with. It has a magnetized backing to allow it to stick to walls, but you'll still need to wrench the anchoring bolts in place to keep it on." - w_class = WEIGHT_CLASS_TINY - max_components = IC_MAX_SIZE_BASE / 2 - max_complexity = IC_COMPLEXITY_BASE / 2 - -/obj/item/electronic_assembly/wallmount/proc/mount_assembly(turf/on_wall, mob/user) //Yeah, this is admittedly just an abridged and kitbashed version of the wallframe attach procs. - if(get_dist(on_wall,user)>1) - return - var/ndir = get_dir(on_wall, user) - if(!(ndir in GLOB.cardinals)) - return - var/turf/T = get_turf(user) - if(!isfloorturf(T)) - to_chat(user, "You cannot place [src] on this spot!") - return - if(gotwallitem(T, ndir)) - to_chat(user, "There's already an item on this wall!") - return - playsound(src.loc, 'sound/machines/click.ogg', 75, 1) - user.visible_message("[user.name] attaches [src] to the wall.", - "You attach [src] to the wall.", - "You hear clicking.") - user.dropItemToGround(src) - switch(ndir) - if(NORTH) - pixel_y = -31 - if(SOUTH) - pixel_y = 31 - if(EAST) - pixel_x = -31 - if(WEST) - pixel_x = 31 diff --git a/code/modules/integrated_electronics/core/debugger.dm b/code/modules/integrated_electronics/core/debugger.dm deleted file mode 100644 index 867ae9ad460bb..0000000000000 --- a/code/modules/integrated_electronics/core/debugger.dm +++ /dev/null @@ -1,108 +0,0 @@ -/obj/item/integrated_electronics/debugger - name = "circuit debugger" - desc = "This small tool allows one working with custom machinery to directly set data to a specific pin, useful for writing \ - settings to specific circuits, or for debugging purposes. It can also pulse activation pins." - icon = 'icons/obj/assemblies/electronic_tools.dmi' - icon_state = "debugger" - flags_1 = CONDUCT_1 - item_flags = NOBLUDGEON - w_class = WEIGHT_CLASS_SMALL - var/data_to_write = null - var/accepting_refs = FALSE - var/copy_values = FALSE - var/copy_id = FALSE - var/datum/weakref/idlock = null - -/obj/item/integrated_electronics/debugger/attack_self(mob/user) - var/type_to_use = input("Please choose a type to use.","[src] type setting") as null|anything in list("string","number","ref","copy","null","id lock") - if(!user.IsAdvancedToolUser()) - return - - var/new_data = null - switch(type_to_use) - if("string") - accepting_refs = FALSE - copy_values = FALSE - copy_id = FALSE - new_data = stripped_input(user, "Now type in a string.","[src] string writing", no_trim = TRUE) - if(istext(new_data) && user.IsAdvancedToolUser()) - data_to_write = new_data - to_chat(user, "You set \the [src]'s memory to \"[new_data]\".") - if("number") - accepting_refs = FALSE - copy_values = FALSE - copy_id = FALSE - new_data = input(user, "Now type in a number.","[src] number writing") as null|num - if(isnum_safe(new_data) && user.IsAdvancedToolUser()) - data_to_write = new_data - to_chat(user, "You set \the [src]'s memory to [new_data].") - if("ref") - accepting_refs = TRUE - copy_values = FALSE - copy_id = FALSE - to_chat(user, "You turn \the [src]'s ref scanner on. Slide it across \ - an object for a ref of that object to save it in memory.") - if("copy") - accepting_refs = FALSE - copy_values = TRUE - copy_id = FALSE - to_chat(user, "You turn \the [src]'s value copier on. Use it on a pin \ - to save its current value in memory.") - if("null") - data_to_write = null - copy_values = FALSE - to_chat(user, "You set \the [src]'s memory to absolutely nothing.") - if("id lock") - accepting_refs = FALSE - copy_values = FALSE - copy_id = TRUE - to_chat(user, "You turn \the [src]'s id card scanner on. Use your own card \ - to store the identity and id-lock an assembly.") - -/obj/item/integrated_electronics/debugger/afterattack(atom/target, mob/living/user, proximity) - . = ..() - if(accepting_refs && proximity) - data_to_write = WEAKREF(target) - visible_message("[user] slides \a [src]'s over \the [target].") - to_chat(user, "You set \the [src]'s memory to a reference to [target.name] \[Ref\]. The ref scanner is \ - now off.") - accepting_refs = FALSE - - else if(copy_id && proximity) - if(istype(target,/obj/item/card/id)) - idlock = WEAKREF(target) - to_chat(user, "You set \the [src]'s card memory to [target.name]. The id card scanner is \ - now off.") - - else - to_chat(user, "You turn the id card scanner is off.") - - copy_id = FALSE - return - -/obj/item/integrated_electronics/debugger/proc/write_data(var/datum/integrated_io/io, mob/user) - //If the pin can take data: - if(io.io_type == DATA_CHANNEL) - //If the debugger is set to copy, copy the data in the pin onto it - if(copy_values) - data_to_write = io.data - to_chat(user, "You let the debugger copy the data.") - copy_values = FALSE - return - - //Else, write the data to the pin - io.write_data_to_pin(data_to_write) - var/data_to_show = data_to_write - //This is only to convert a weakref into a name for better output - if(isweakref(data_to_write)) - var/datum/weakref/w = data_to_write - var/atom/A = w.resolve() - data_to_show = A.name - to_chat(user, "You write '[data_to_write ? data_to_show : "NULL"]' to the '[io]' pin of \the [io.holder].") - - //If the pin can only be pulsed - else if(io.io_type == PULSE_CHANNEL) - io.holder.check_then_do_work(io.ord,ignore_power = TRUE) - to_chat(user, "You pulse \the [io.holder]'s [io].") - - io.holder.interact(user) // This is to update the UI. diff --git a/code/modules/integrated_electronics/core/detailer.dm b/code/modules/integrated_electronics/core/detailer.dm deleted file mode 100644 index 33f7ef96add03..0000000000000 --- a/code/modules/integrated_electronics/core/detailer.dm +++ /dev/null @@ -1,48 +0,0 @@ -/obj/item/integrated_electronics/detailer - name = "assembly detailer" - desc = "A combination autopainter and flash anodizer designed to give electronic assemblies a colorful, wear-resistant finish." - icon = 'icons/obj/assemblies/electronic_tools.dmi' - icon_state = "detailer" - flags_1 = CONDUCT_1 - item_flags = NOBLUDGEON - w_class = WEIGHT_CLASS_SMALL - var/data_to_write = null - var/accepting_refs = FALSE - var/detail_color = COLOR_ASSEMBLY_WHITE - var/list/color_list = list( - "black" = COLOR_ASSEMBLY_BLACK, - "gray" = COLOR_FLOORTILE_GRAY, - "machine gray" = COLOR_ASSEMBLY_BGRAY, - "white" = COLOR_ASSEMBLY_WHITE, - "red" = COLOR_ASSEMBLY_RED, - "orange" = COLOR_ASSEMBLY_ORANGE, - "beige" = COLOR_ASSEMBLY_BEIGE, - "brown" = COLOR_ASSEMBLY_BROWN, - "gold" = COLOR_ASSEMBLY_GOLD, - "yellow" = COLOR_ASSEMBLY_YELLOW, - "gurkha" = COLOR_ASSEMBLY_GURKHA, - "light green" = COLOR_ASSEMBLY_LGREEN, - "green" = COLOR_ASSEMBLY_GREEN, - "light blue" = COLOR_ASSEMBLY_LBLUE, - "blue" = COLOR_ASSEMBLY_BLUE, - "purple" = COLOR_ASSEMBLY_PURPLE - ) - -/obj/item/integrated_electronics/detailer/Initialize() - .=..() - update_icon() - -/obj/item/integrated_electronics/detailer/update_icon() - cut_overlays() - var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/assemblies/electronic_tools.dmi', "detailer-color") - detail_overlay.color = detail_color - add_overlay(detail_overlay) - -/obj/item/integrated_electronics/detailer/attack_self(mob/user) - var/color_choice = input(user, "Select color.", "Assembly Detailer") as null|anything in color_list - if(!color_list[color_choice]) - return - if(!in_range(src, user)) - return - detail_color = color_list[color_choice] - update_icon() diff --git a/code/modules/integrated_electronics/core/helpers.dm b/code/modules/integrated_electronics/core/helpers.dm deleted file mode 100644 index e9cbb346458d9..0000000000000 --- a/code/modules/integrated_electronics/core/helpers.dm +++ /dev/null @@ -1,142 +0,0 @@ -/obj/item/integrated_circuit/proc/setup_io(list/io_list, io_type, list/io_default_list, pin_type) - var/list/io_list_copy = io_list.Copy() - io_list.Cut() - for(var/i in 1 to io_list_copy.len) - var/io_entry = io_list_copy[i] - var/default_data = null - var/io_type_override = null - - // Override the default data. - if(length(io_default_list)) // List containing special pin types that need to be added. - default_data = io_default_list["[i]"] // This is deliberately text because the index is a number in text form. - - // Override the pin type. - if(io_list_copy[io_entry]) - io_type_override = io_list_copy[io_entry] - - if(io_type_override) - io_list.Add(new io_type_override(src, io_entry, default_data, pin_type,i)) - else - io_list.Add(new io_type(src, io_entry, default_data, pin_type,i)) - - -/obj/item/integrated_circuit/proc/set_pin_data(pin_type, pin_number, datum/new_data) - if(islist(new_data)) - for(var/i in 1 to length(new_data)) - if (istype(new_data) && !isweakref(new_data)) - new_data[i] = WEAKREF(new_data[i]) - if (istype(new_data) && !isweakref(new_data)) - new_data = WEAKREF(new_data) - var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number) - return pin.write_data_to_pin(new_data) - -/obj/item/integrated_circuit/proc/get_pin_data(pin_type, pin_number) - var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number) - return pin.get_data() - -/obj/item/integrated_circuit/proc/get_pin_data_as_type(pin_type, pin_number, as_type) - var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number) - return pin.data_as_type(as_type) - -/obj/item/integrated_circuit/proc/activate_pin(pin_number) - var/datum/integrated_io/activate/A = activators[pin_number] - A.push_data() - -/obj/item/integrated_circuit/proc/get_pin_ref(pin_type, pin_number) - switch(pin_type) - if(IC_INPUT) - if(pin_number > inputs.len) - return - return inputs[pin_number] - if(IC_OUTPUT) - if(pin_number > outputs.len) - return - return outputs[pin_number] - if(IC_ACTIVATOR) - if(pin_number > activators.len) - return - return activators[pin_number] - return - -/datum/integrated_io/proc/get_data() - if(islist(data)) - for(var/i in 1 to length(data)) - if(isweakref(data[i])) - data[i] = data[i].resolve() - if(isweakref(data)) - return data.resolve() - return data - - -// Returns a list of parameters necessary to locate a pin in the assembly: component number, pin type and pin number -// Components list can be supplied from the outside, for use in savefiles -/datum/integrated_io/proc/get_pin_parameters(list/components) - if(!holder) - return - - if(!components) - if(!holder.assembly) - return - components = holder.assembly.assembly_components - - var/component_number = components.Find(holder) - - var/list/pin_holder_list - switch(pin_type) - if(IC_INPUT) - pin_holder_list = holder.inputs - if(IC_OUTPUT) - pin_holder_list = holder.outputs - if(IC_ACTIVATOR) - pin_holder_list = holder.activators - else - return - - var/pin_number = pin_holder_list.Find(src) - - return list(component_number, pin_type, pin_number) - - -// Locates a pin in the assembly when given component number, pin type and pin number -// Components list can be supplied from the outside, for use in savefiles -/obj/item/electronic_assembly/proc/get_pin_ref(component_number, pin_type, pin_number, list/components) - if(!components) - components = assembly_components - - if(component_number > components.len) - return - - var/obj/item/integrated_circuit/component = components[component_number] - return component.get_pin_ref(pin_type, pin_number) - - -// Same as get_pin_ref, but takes in a list of 3 parameters (same format as get_pin_parameters) -// and performs extra sanity checks on parameters list and index numbers -/obj/item/electronic_assembly/proc/get_pin_ref_list(list/parameters, list/components) - if(!components) - components = assembly_components - - if(!islist(parameters) || parameters.len != 3) - return - - // Those are supposed to be list indexes, check them for sanity - if(!isnum_safe(parameters[1]) || parameters[1] % 1 || parameters[1] < 1) - return - - if(!isnum_safe(parameters[3]) || parameters[3] % 1 || parameters[3] < 1) - return - - return get_pin_ref(parameters[1], parameters[2], parameters[3], components) - - - - -// Used to obfuscate object refs imported/exported as strings. -// Not very secure, but if someone still finds a way to abuse refs, they deserve it. -/proc/XorEncrypt(string, key) - if(!string || !key ||!istext(string)||!istext(key)) - return - var/r - for(var/i = 1 to length(string)) - r += ascii2text(text2ascii(string,i) ^ text2ascii(key,((i-1)%length(string))+1)) - return r diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm deleted file mode 100644 index 73f64c98f1b17..0000000000000 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ /dev/null @@ -1,414 +0,0 @@ -/obj/item/integrated_circuit - name = "integrated circuit" - desc = "It's a tiny chip! This one doesn't seem to do much, however." - icon = 'icons/obj/assemblies/electronic_components.dmi' - icon_state = "template" - w_class = WEIGHT_CLASS_TINY - materials = list() // To be filled later - var/obj/item/electronic_assembly/assembly // Reference to the assembly holding this circuit, if any. - var/extended_desc - var/list/inputs = list() - var/list/inputs_default = list()// Assoc list which will fill a pin with data upon creation. e.g. "2" = 0 will set input pin 2 to equal 0 instead of null. - var/list/outputs = list() - var/list/outputs_default =list()// Ditto, for output. - var/list/activators = list() - var/next_use = 0 // Uses world.time - var/complexity = 1 // This acts as a limitation on building machines, more resource-intensive components cost more 'space'. - var/size = 1 // This acts as a limitation on building machines, bigger components cost more 'space'. -1 for size 0 - var/cooldown_per_use = 1 // Circuits are limited in how many times they can be work()'d by this variable. - var/ext_cooldown = 0 // Circuits are limited in how many times they can be work()'d with external world by this variable. - var/power_draw_per_use = 0 // How much power is drawn when work()'d. - var/power_draw_idle = 0 // How much power is drawn when doing nothing. - var/spawn_flags // Used for world initializing, see the #defines above. - var/action_flags = NONE // Used for telling circuits that can do certain actions from other circuits. - var/category_text = "NO CATEGORY THIS IS A BUG" // To show up on circuit printer, and perhaps other places. - var/removable = TRUE // Determines if a circuit is removable from the assembly. - var/displayed_name = "" - var/demands_object_input = FALSE - var/can_input_object_when_closed = FALSE - var/max_allowed = 0 // The maximum amount of components allowed inside an integrated circuit. - - -/* - Integrated circuits are essentially modular machines. Each circuit has a specific function, and combining them inside Electronic Assemblies allows -a creative player the means to solve many problems. Circuits are held inside an electronic assembly, and are wired using special tools. -*/ - -/obj/item/integrated_circuit/examine(mob/user) - interact(user) - external_examine(user) - . = ..() - -// Can be called via electronic_assembly/attackby() -/obj/item/integrated_circuit/proc/additem(var/obj/item/I, var/mob/living/user) - attackby(I, user) - -// This should be used when someone is examining while the case is opened. -/obj/item/integrated_circuit/proc/internal_examine(mob/user) - to_chat(user, "This board has [inputs.len] input pin\s, [outputs.len] output pin\s and [activators.len] activation pin\s.") - for(var/k in inputs) - var/datum/integrated_io/I = k - if(I.linked.len) - to_chat(user, "The '[I]' is connected to [I.get_linked_to_desc()].") - for(var/k in outputs) - var/datum/integrated_io/O = k - if(O.linked.len) - to_chat(user, "The '[O]' is connected to [O.get_linked_to_desc()].") - for(var/k in activators) - var/datum/integrated_io/activate/A = k - if(A.linked.len) - to_chat(user, "The '[A]' is connected to [A.get_linked_to_desc()].") - any_examine(user) - interact(user) - -// This should be used when someone is examining from an 'outside' perspective, e.g. reading a screen or LED. -/obj/item/integrated_circuit/proc/external_examine(mob/user) - any_examine(user) - -/obj/item/integrated_circuit/proc/any_examine(mob/user) - return - -/obj/item/integrated_circuit/proc/attackby_react(var/atom/movable/A,mob/user) - return - -/obj/item/integrated_circuit/proc/sense(var/atom/movable/A,mob/user,prox) - return - -/obj/item/integrated_circuit/proc/check_interactivity(mob/user) - if(assembly) - return assembly.check_interactivity(user) - else - return user.canUseTopic(src, BE_CLOSE) - -/obj/item/integrated_circuit/Initialize() - . = ..() - displayed_name = name - setup_io(inputs, /datum/integrated_io, inputs_default, IC_INPUT) - setup_io(outputs, /datum/integrated_io, outputs_default, IC_OUTPUT) - setup_io(activators, /datum/integrated_io/activate, null, IC_ACTIVATOR) - materials[/datum/material/iron] = w_class * SScircuit.cost_multiplier - - -/obj/item/integrated_circuit/proc/on_data_written() //Override this for special behaviour when new data gets pushed to the circuit. - return - -/obj/item/integrated_circuit/Destroy() - . = ..() - QDEL_LIST(inputs) - QDEL_LIST(outputs) - QDEL_LIST(activators) - - -/obj/item/integrated_circuit/emp_act(severity) - for(var/k in inputs) - var/datum/integrated_io/I = k - I.scramble() - for(var/k in outputs) - var/datum/integrated_io/O = k - O.scramble() - for(var/k in activators) - var/datum/integrated_io/activate/A = k - A.scramble() - - -/obj/item/integrated_circuit/verb/rename_component() - set name = "Rename Circuit" - set category = "Object" - set desc = "Rename your circuit, useful to stay organized." - - var/mob/M = usr - if(!check_interactivity(M)) - return - - var/input = reject_bad_name(stripped_input(M, "What do you want to name this?", "Rename", name), TRUE) - if(check_interactivity(M)) - if(!input) - input = name - if(CHAT_FILTER_CHECK(input)) - to_chat(M, "The circuit name contains prohibited words!") - return - to_chat(M, "The circuit '[name]' is now labeled '[input]'.") - displayed_name = input - -/obj/item/integrated_circuit/interact(mob/user) - ui_interact(user) - -/obj/item/integrated_circuit/ui_interact(mob/user) - . = ..() - if(!check_interactivity(user)) - return - - if(assembly) - assembly.ui_interact(user, src) - return - - var/table_edge_width = "30%" - var/table_middle_width = "40%" - - var/datum/browser/popup = new(user, "scannernew", name, 800, 630) // Set up the popup browser window - popup.add_stylesheet("scannernew", 'html/browser/assembly_ui.css') - - var/HTML = "[src.displayed_name] \ -
\ - " - - if(assembly) - HTML += "Return to Assembly
" - - HTML += "Refresh | \ - Rename | \ - Copy Ref" - - if(assembly && removable) - HTML += " | Remove" - - HTML += "
\ - \ - \ - \ - " - - var/column_width = 3 - var/row_height = max(inputs.len, outputs.len, 1) - - for(var/i = 1 to row_height) - HTML += "" - for(var/j = 1 to column_width) - var/datum/integrated_io/io = null - var/words - var/height = 1 - switch(j) - if(1) - io = get_pin_ref(IC_INPUT, i) - if(io) - words += "[io.display_pin_type()] [io.name] \ - [io.display_data(io.data)]
" - if(io.linked.len) - words += "" - - if(outputs.len > inputs.len) - height = 1 - if(2) - if(i == 1) - words += "[displayed_name]
[name != displayed_name ? "([name])":""]
[desc]" - height = row_height - else - continue - if(3) - io = get_pin_ref(IC_OUTPUT, i) - if(io) - words += "[io.display_pin_type()] [io.name] \ - [io.display_data(io.data)]
" - if(io.linked.len) - words += "" - - if(inputs.len > outputs.len) - height = 1 - HTML += "" - HTML += "" - - for(var/activator in activators) - var/datum/integrated_io/io = activator - var/words - - words += "[io] \ - [io.data?"\":"\"]
" - - if(io.linked.len) - words += "" - - HTML += "
[words]
[words]
\ -
Complexity: [complexity] \ -
Cooldown per use: [cooldown_per_use/10] sec \ - [max_allowed ? "
Maximum per circuit: [max_allowed]" : ""]" - - if(ext_cooldown) - HTML += "
External manipulation cooldown: [ext_cooldown/10] sec" - if(power_draw_idle) - HTML += "
Power Draw: [power_draw_idle] W (Idle)" - if(power_draw_per_use) - HTML += "
Power Draw: [power_draw_per_use] W (Active)" // Borgcode says that powercells' checked_use() takes joules as input. - - HTML += "
[extended_desc]" - - popup.set_content(HTML) - popup.open() - -/obj/item/integrated_circuit/Topic(href, href_list) - if(!check_interactivity(usr)) - return - if(..()) - return TRUE - - var/update = TRUE - var/update_to_assembly = FALSE - - var/obj/held_item = usr.get_active_held_item() - - if(href_list["rename"]) - rename_component(usr) - if(assembly) - assembly.add_allowed_scanner(usr.ckey) - - if(href_list["pin"]) - var/datum/integrated_io/pin = locate(href_list["pin"]) in inputs + outputs + activators - if(pin) - var/datum/integrated_io/linked - var/success = TRUE - if(href_list["link"]) - linked = locate(href_list["link"]) in pin.linked - - if(istype(held_item, /obj/item/integrated_electronics) || istype(held_item, /obj/item/multitool)) - update_to_assembly = pin.handle_wire(linked, held_item, href_list["act"], usr) - else - to_chat(usr, "You can't do a whole lot without the proper tools.") - success = FALSE - if(success && assembly) - assembly.add_allowed_scanner(usr.ckey) - - if(href_list["scan"]) - if(istype(held_item, /obj/item/integrated_electronics/debugger)) - var/obj/item/integrated_electronics/debugger/D = held_item - if(D.accepting_refs) - D.afterattack(src, usr, TRUE) - else - to_chat(usr, "The debugger's 'ref scanner' needs to be on.") - else - to_chat(usr, "You need a debugger set to 'ref' mode to do that.") - - if(href_list["return"]) - update_to_assembly = TRUE - - - if(update) - if(assembly && update_to_assembly) - assembly.interact(usr, src) - else - interact(usr) // To refresh the UI. - -/obj/item/integrated_circuit/proc/push_data() - for(var/k in outputs) - var/datum/integrated_io/O = k - O.push_data() - -/obj/item/integrated_circuit/proc/pull_data() - for(var/k in inputs) - var/datum/integrated_io/I = k - I.push_data() - -/obj/item/integrated_circuit/proc/draw_idle_power() - if(assembly) - return assembly.draw_power(power_draw_idle) - -// Override this for special behaviour when there's no power left. -/obj/item/integrated_circuit/proc/power_fail() - return - -// Returns true if there's enough power to work(). -/obj/item/integrated_circuit/proc/check_power() - if(!assembly) - return FALSE // Not in an assembly, therefore no power. - if(assembly.draw_power(power_draw_per_use)) - return TRUE // Battery has enough. - return FALSE // Not enough power. - -/obj/item/integrated_circuit/proc/check_then_do_work(ord,var/ignore_power = FALSE) - if(world.time < next_use) // All intergrated circuits have an internal cooldown, to protect from spam. - return FALSE - if(assembly && ext_cooldown && (world.time < assembly.ext_next_use)) // Some circuits have external cooldown, to protect from spam. - return FALSE - if(power_draw_per_use && !ignore_power) - if(!check_power()) - power_fail() - return FALSE - next_use = world.time + cooldown_per_use - if(assembly) - assembly.ext_next_use = world.time + ext_cooldown - do_work(ord) - return TRUE - -/obj/item/integrated_circuit/proc/do_work(ord) - return - -/obj/item/integrated_circuit/proc/disconnect_all() - var/datum/integrated_io/I - - for(var/i in inputs) - I = i - I.disconnect_all() - - for(var/i in outputs) - I = i - I.disconnect_all() - - for(var/i in activators) - I = i - I.disconnect_all() - -/obj/item/integrated_circuit/proc/ext_moved(oldLoc, dir) - return - - -// Returns the object that is supposed to be used in attack messages, location checks, etc. -/obj/item/integrated_circuit/proc/get_object() - // If the component is located in an assembly, let assembly determine it. - if(assembly) - return assembly.get_object() - else - return src // If not, the component is acting on its own. - - -// Returns the location to be used for dropping items. -// Same as the regular drop_location(), but with proc being run on assembly if there is any. -/obj/item/integrated_circuit/drop_location() - // If the component is located in an assembly, let the assembly figure that one out. - if(assembly) - return assembly.drop_location() - else - return ..() // If not, the component is acting on its own. - - -// Checks if the target object is reachable. Useful for various manipulators and manipulator-like objects. -/obj/item/integrated_circuit/proc/check_target(atom/target, exclude_contents = FALSE, exclude_components = FALSE, exclude_self = FALSE) - if(!target) - return FALSE - - var/atom/movable/acting_object = get_object() - - if(exclude_self && target == acting_object) - return FALSE - - if(exclude_components && assembly) - if(target in assembly.assembly_components) - return FALSE - - if(target == assembly.battery) - return FALSE - - if(target.Adjacent(acting_object) && isturf(target.loc)) - return TRUE - - if(!exclude_contents && (target in acting_object.GetAllContents())) - return TRUE - - if(target in acting_object.loc) - return TRUE - - return FALSE diff --git a/code/modules/integrated_electronics/core/pins.dm b/code/modules/integrated_electronics/core/pins.dm deleted file mode 100644 index ad0f800b91631..0000000000000 --- a/code/modules/integrated_electronics/core/pins.dm +++ /dev/null @@ -1,216 +0,0 @@ -/* - Pins both hold data for circuits, as well move data between them. Some also cause circuits to do their function. DATA_CHANNEL pins are the data holding/moving kind, -where as PULSE_CHANNEL causes circuits to work() when their pulse hits them. -A visualization of how pins work is below. Imagine the below image involves an addition circuit. -When the bottom pin, the activator, receives a pulse, all the numbers on the left (input) get added, and the answer goes on the right side (output). -Inputs Outputs -A [2]\ /[8] result -B [1]-\|++|/ -C [4]-/|++| -D [1]/ || - || - Activator -*/ -/datum/integrated_io - var/name = "input/output" - var/obj/item/integrated_circuit/holder - var/datum/weakref/data // This is a weakref, to reduce typecasts. Note that oftentimes numbers and text may also occupy this. - var/list/linked = list() - var/io_type = DATA_CHANNEL - var/pin_type // IC_INPUT, IC_OUTPUT, IC_ACTIVATOR - used in saving assembly wiring - var/ord - -/datum/integrated_io/New(loc, _name, _data, _pin_type,_ord) - name = _name - if(!isnull(_data)) - data = _data - if(_pin_type) - pin_type = _pin_type - if(_ord) - ord = _ord - - holder = loc - - if(!istype(holder)) - message_admins("ERROR: An integrated_io ([name]) spawned without a valid holder! This is a bug.") - -/datum/integrated_io/Destroy() - disconnect_all() - data = null - holder = null - return ..() - -/datum/integrated_io/proc/data_as_type(var/as_type) - if(!isweakref(data)) - return - var/datum/weakref/w = data - var/output = w.resolve() - return istype(output, as_type) ? output : null - -/datum/integrated_io/proc/display_data(var/input) - if(isnull(input)) - return "(null)" // Empty data means nothing to show. - - if(istext(input)) - return "(\"[input]\")" // Wraps the 'string' in escaped quotes, so that people know it's a 'string'. - - if(islist(input)) - var/list/my_list = input - var/result = "list\[[my_list.len]\](" - if(my_list.len) - result += "
" - var/pos = 0 - for(var/line in my_list) - result += "[display_data(line)]" - pos++ - if(pos != my_list.len) - result += ",
" - result += "
" - result += ")" - return result - - if(isweakref(input)) - var/datum/weakref/w = input - var/atom/A = w.resolve() - return A ? "([A.name] \[Ref\])" : "(null)" // For refs, we want just the name displayed. - - return "([input])" // Nothing special needed for numbers or other stuff. - -/datum/integrated_io/activate/display_data() - return "(\[pulse\])" - -/datum/integrated_io/proc/display_pin_type() - return IC_FORMAT_ANY - -/datum/integrated_io/activate/display_pin_type() - return IC_FORMAT_PULSE - -/datum/integrated_io/proc/scramble() - if(isnull(data)) - return - if(isnum_safe(data)) - write_data_to_pin(rand(-10000, 10000)) - if(istext(data)) - write_data_to_pin("ERROR") - push_data() - -/datum/integrated_io/activate/scramble() - push_data() - -/datum/integrated_io/proc/handle_wire(datum/integrated_io/linked_pin, obj/item/tool, action, mob/living/user) - if(tool.tool_behaviour == TOOL_MULTITOOL) - if(!tool.multitool_check_buffer(user, tool)) - return - var/obj/item/multitool/multitool = tool - switch(action) - if("wire") - multitool.wire(src, user) - return TRUE - if("unwire") - if(linked_pin) - multitool.unwire(src, linked_pin, user) - return TRUE - if("data") - ask_for_pin_data(user) - return TRUE - - else if(istype(tool, /obj/item/integrated_electronics/wirer)) - var/obj/item/integrated_electronics/wirer/wirer = tool - if(linked_pin) - wirer.wire(linked_pin, user) - else - wirer.wire(src, user) - - else if(istype(tool, /obj/item/integrated_electronics/debugger)) - var/obj/item/integrated_electronics/debugger/debugger = tool - debugger.write_data(src, user) - return TRUE - - return FALSE - -/datum/integrated_io/proc/write_data_to_pin(new_data) - if(isnull(new_data) || isnum_safe(new_data) || istext(new_data) || isweakref(new_data)) - data = new_data - holder.on_data_written() - else if(islist(new_data)) - var/list/new_list = new_data - data = new_list.Copy(max(1,new_list.len - IC_MAX_LIST_LENGTH+1),0) - holder.on_data_written() - -/datum/integrated_io/proc/push_data() - for(var/k in 1 to linked.len) - var/datum/integrated_io/io = linked[k] - io.write_data_to_pin(data) - -/datum/integrated_io/activate/push_data() - for(var/k in 1 to linked.len) - var/datum/integrated_io/io = linked[k] - io.holder.check_then_do_work(io.ord) - -/datum/integrated_io/proc/pull_data() - for(var/k in 1 to linked.len) - var/datum/integrated_io/io = linked[k] - write_data_to_pin(io.data) - -/datum/integrated_io/proc/get_linked_to_desc() - if(linked.len) - return "the [english_list(linked)]" - return "nothing" - - -/datum/integrated_io/proc/connect_pin(datum/integrated_io/pin) - pin.linked |= src - linked |= pin - -// Iterates over every linked pin and disconnects them. -/datum/integrated_io/proc/disconnect_all() - for(var/pin in linked) - disconnect_pin(pin) - -/datum/integrated_io/proc/disconnect_pin(datum/integrated_io/pin) - pin.linked.Remove(src) - linked.Remove(pin) - - -/datum/integrated_io/proc/ask_for_data_type(mob/user, var/default, var/list/allowed_data_types = list("string","number","null")) - var/type_to_use = input("Please choose a type to use.","[src] type setting") as null|anything in allowed_data_types - if(!holder.check_interactivity(user)) - return - - var/new_data = null - switch(type_to_use) - if("string") - new_data = stripped_multiline_input(user, "Now type in a string.","[src] string writing", istext(default) ? default : null, no_trim = TRUE) - if(istext(new_data) && holder.check_interactivity(user) ) - to_chat(user, "You input "+new_data+" into the pin.") - return new_data - if("number") - new_data = input("Now type in a number.","[src] number writing", isnum_safe(default) ? default : null) as null|num - if(isnum_safe(new_data) && holder.check_interactivity(user) ) - to_chat(user, "You input [new_data] into the pin.") - return new_data - if("null") - if(holder.check_interactivity(user)) - to_chat(user, "You clear the pin's memory.") - return new_data - -// Basically a null check -/datum/integrated_io/proc/is_valid() - return !isnull(data) - -// This proc asks for the data to write, then writes it. -/datum/integrated_io/proc/ask_for_pin_data(mob/user) - var/new_data = ask_for_data_type(user) - write_data_to_pin(new_data) - -/datum/integrated_io/activate/ask_for_pin_data(mob/user) // This just pulses the pin. - holder.investigate_log(" was manually pulsed by [key_name(user)].", INVESTIGATE_CIRCUIT) - holder.check_then_do_work(ord,ignore_power = TRUE) - to_chat(user, "You pulse \the [holder]'s [src] pin.") - -/datum/integrated_io/activate - name = "activation pin" - io_type = PULSE_CHANNEL - -/datum/integrated_io/activate/out // All this does is just make the UI say 'out' instead of 'in' - data = 1 diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm deleted file mode 100644 index 9d22cf8cc3805..0000000000000 --- a/code/modules/integrated_electronics/core/printer.dm +++ /dev/null @@ -1,351 +0,0 @@ -#define MAX_CIRCUIT_CLONE_TIME 3 MINUTES //circuit slow-clones can only take up this amount of time to complete - -/obj/item/integrated_circuit_printer - name = "integrated circuit printer" - desc = "A portable(ish) machine made to print tiny modular circuitry out of iron." - icon = 'icons/obj/assemblies/electronic_tools.dmi' - icon_state = "circuit_printer" - w_class = WEIGHT_CLASS_BULKY - var/upgraded = FALSE // When hit with an upgrade disk, will turn true, allowing it to print the higher tier circuits. - var/can_clone = TRUE // Allows the printer to clone circuits, either instantly or over time depending on upgrade. Set to FALSE to disable entirely. - var/fast_clone = FALSE // If this is false, then cloning will take an amount of deciseconds equal to the iron cost divided by 100. - var/debug = FALSE // If it's upgraded and can clone, even without config settings. - var/current_category = null - var/cloning = FALSE // If the printer is currently creating a circuit - var/recycling = FALSE // If an assembly is being emptied into this printer - var/list/program // Currently loaded save, in form of list - var/datum/weakref/idlock = null - -/obj/item/integrated_circuit_printer/proc/check_interactivity(mob/user) - return user.canUseTopic(src, BE_CLOSE) - -/obj/item/integrated_circuit_printer/upgraded - upgraded = TRUE - can_clone = TRUE - fast_clone = TRUE - -/obj/item/integrated_circuit_printer/debug //translation: "integrated_circuit_printer/local_server" - name = "debug circuit printer" - debug = TRUE - upgraded = TRUE - can_clone = TRUE - fast_clone = TRUE - w_class = WEIGHT_CLASS_TINY - -/obj/item/integrated_circuit_printer/Initialize() - . = ..() - AddComponent(/datum/component/material_container, list(/datum/material/iron), MINERAL_MATERIAL_AMOUNT * 25, TRUE, list(/obj/item/stack, /obj/item/integrated_circuit, /obj/item/electronic_assembly)) - -/obj/item/integrated_circuit_printer/proc/print_program(mob/user) - if(!cloning) - return - - visible_message("[src] has finished printing its assembly!") - playsound(src, 'sound/items/poster_being_created.ogg', 50, TRUE) - var/obj/item/electronic_assembly/assembly = SScircuit.load_electronic_assembly(get_turf(src), program) - if(idlock) - assembly.idlock = idlock - assembly.creator = key_name(user) - assembly.investigate_log("was printed by [assembly.creator].", INVESTIGATE_CIRCUIT) - cloning = FALSE - -/obj/item/integrated_circuit_printer/attackby(obj/item/O, mob/user) - if(istype(O, /obj/item/disk/integrated_circuit/upgrade/advanced)) - if(upgraded) - to_chat(user, "[src] already has this upgrade. ") - return TRUE - to_chat(user, "You install [O] into [src]. ") - upgraded = TRUE - return TRUE - - if(istype(O, /obj/item/disk/integrated_circuit/upgrade/clone)) - if(fast_clone) - to_chat(user, "[src] already has this upgrade. ") - return TRUE - to_chat(user, "You install [O] into [src]. Circuit cloning will now be instant. ") - fast_clone = TRUE - return TRUE - - if(istype(O, /obj/item/electronic_assembly)) - var/obj/item/electronic_assembly/EA = O //microtransactions not included - if(EA.assembly_components.len) - if(recycling) - return - if(!EA.opened) - to_chat(user, "You can't reach [EA]'s components to remove them!") - return - if(EA.battery) - to_chat(user, "Remove [EA]'s power cell first!") - return - for(var/V in EA.assembly_components) - var/obj/item/integrated_circuit/IC = V - if(!IC.removable) - to_chat(user, "[EA] has irremovable components in the casing, preventing you from emptying it.") - return - to_chat(user, "You begin recycling [EA]'s components...") - playsound(src, 'sound/items/electronic_assembly_emptying.ogg', 50, TRUE) - if(!do_after(user, 30, target = src) || recycling) //short channel so you don't accidentally start emptying out a complex assembly - return - recycling = TRUE - var/datum/component/material_container/mats = GetComponent(/datum/component/material_container) - for(var/V in EA.assembly_components) - var/obj/item/integrated_circuit/IC = V - if(!mats.has_space(mats.get_item_material_amount(IC))) - to_chat(user, "[src] can't hold any more materials!") - break - if(!do_after(user, 5, target = user)) - recycling = FALSE - return - playsound(src, 'sound/items/crowbar.ogg', 50, TRUE) - if(EA.try_remove_component(IC, user, TRUE)) - mats.user_insert(IC, user) - to_chat(user, "You recycle all the components[EA.assembly_components.len ? " you could " : " "]from [EA]!") - playsound(src, 'sound/items/electronic_assembly_empty.ogg', 50, TRUE) - recycling = FALSE - return TRUE - - if(istype(O, /obj/item/integrated_electronics/debugger)) - var/obj/item/integrated_electronics/debugger/debugger = O - if(!debugger.idlock) - return - - if(!idlock) - idlock = debugger.idlock - debugger.idlock = null - to_chat(user, "You set \the [src] to print out id-locked assemblies only.") - return - - if(debugger.idlock.resolve() == idlock.resolve()) - idlock = null - debugger.idlock = null - to_chat(user, "You reset \the [src]'s protection settings.") - return - - return ..() - -/obj/item/integrated_circuit_printer/attack_self(mob/user) - interact(user) - -/obj/item/integrated_circuit_printer/interact(mob/user) - if(!(in_range(src, user) || issilicon(user))) - return - - if(isnull(current_category)) - current_category = SScircuit.circuit_fabricator_recipe_list[1] - - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - - //Preparing the browser - var/datum/browser/popup = new(user, "printernew", "Integrated Circuit Printer", 800, 630) // Set up the popup browser window - - var/HTML = "

Integrated Circuit Printer


" - if(debug) - HTML += "

DEBUG PRINTER -- Infinite materials. Cloning available.

" - else - HTML += "Iron: [materials.total_amount]/[materials.max_amount].

" - - HTML += "Identity-lock: " - if(idlock) - var/obj/item/card/id = idlock.resolve() - HTML+= "[id.name] | Reset
" - else - HTML += "None | Reset
" - - if(CONFIG_GET(flag/ic_printing) || debug) - HTML += "Assembly cloning: [can_clone ? (fast_clone ? "Instant" : "Available") : "Unavailable"].
" - - HTML += "Circuits available: [upgraded || debug ? "Advanced":"Regular"]." - if(!upgraded) - HTML += "
Crossed out circuits mean that the printer is not sufficiently upgraded to create that circuit." - - HTML += "
" - if((can_clone && CONFIG_GET(flag/ic_printing)) || debug) - HTML += "Here you can load script for your assembly.
" - if(!cloning) - HTML += " Load Program " - else - HTML += " Load Program" - if(!program) - HTML += " [fast_clone ? "Print" : "Begin Printing"] Assembly" - else if(cloning) - HTML += " Cancel Print" - else - HTML += " [fast_clone ? "Print" : "Begin Printing"] Assembly" - - HTML += "

" - HTML += "Categories:" - for(var/category in SScircuit.circuit_fabricator_recipe_list) - if(category != current_category) - HTML += " [category] " - else // Bold the button if it's already selected. - HTML += " [category] " - HTML += "
" - HTML += "

[current_category]

" - - var/list/current_list = SScircuit.circuit_fabricator_recipe_list[current_category] - for(var/path in current_list) - var/obj/O = path - var/can_build = TRUE - if(ispath(path, /obj/item/integrated_circuit)) - var/obj/item/integrated_circuit/IC = path - if((initial(IC.spawn_flags) & IC_SPAWN_RESEARCH) && (!(initial(IC.spawn_flags) & IC_SPAWN_DEFAULT)) && !upgraded) - can_build = FALSE - if(can_build) - HTML += "[initial(O.name)]: [initial(O.desc)]
" - else - HTML += "[initial(O.name)]: [initial(O.desc)]
" - - popup.set_content(HTML) - popup.open() - -/obj/item/integrated_circuit_printer/Topic(href, href_list) - if(!check_interactivity(usr)) - return - if(..()) - return TRUE - add_fingerprint(usr) - - if(href_list["id-lock"]) - idlock = null - - if(href_list["category"]) - current_category = href_list["category"] - - if(href_list["build"]) - var/build_type = text2path(href_list["build"]) - if(!build_type || !ispath(build_type)) - return TRUE - - var/cost = 400 - if(ispath(build_type, /obj/item/electronic_assembly)) - var/obj/item/electronic_assembly/E = SScircuit.cached_assemblies[build_type] - cost = E.materials[/datum/material/iron] - else if(ispath(build_type, /obj/item/integrated_circuit)) - var/obj/item/integrated_circuit/IC = SScircuit.cached_components[build_type] - cost = IC.materials[/datum/material/iron] - else if(!(build_type in SScircuit.circuit_fabricator_recipe_list["Tools"])) - log_href_exploit(usr) - return - - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - - if(!debug && !materials.use_amount_mat(cost, /datum/material/iron)) - to_chat(usr, "You need [cost] iron to build that!") - return TRUE - - var/obj/item/built = new build_type(drop_location()) - usr.put_in_hands(built) - - if(istype(built, /obj/item/electronic_assembly)) - var/obj/item/electronic_assembly/E = built - E.creator = key_name(usr) - E.opened = TRUE - E.update_icon() - //reupdate diagnostic hud because it was put_in_hands() and not pickup()'ed - E.diag_hud_set_circuithealth() - E.diag_hud_set_circuitcell() - E.diag_hud_set_circuitstat() - E.diag_hud_set_circuittracking() - E.investigate_log("was printed by [E.creator].", INVESTIGATE_CIRCUIT) - - to_chat(usr, "[capitalize(built.name)] printed.") - playsound(src, 'sound/items/jaws_pry.ogg', 50, TRUE) - - if(href_list["print"]) - if(!CONFIG_GET(flag/ic_printing) && !debug) - to_chat(usr, "CentCom has disabled printing of custom circuitry due to recent allegations of copyright infringement.") - return - if(!can_clone) // Copying and printing ICs is cloning - to_chat(usr, "This printer does not have the cloning upgrade.") - return - switch(href_list["print"]) - if("load") - if(cloning) - return - var/input = capped_multiline_input(usr, "Put your code there:", "loading", max_length = MAX_SIZE_CIRCUIT) - if(!check_interactivity(usr) || cloning) - return - if(!input) - program = null - return - - var/validation = SScircuit.validate_electronic_assembly(input) - - // Validation error codes are returned as text. - if(istext(validation)) - to_chat(usr, "Error: [validation]") - return - else if(islist(validation)) - program = validation - to_chat(usr, "This is a valid program for [program["assembly"]["type"]].") - if(program["requires_upgrades"]) - if(upgraded) - to_chat(usr, "It uses advanced component designs.") - else - to_chat(usr, "It uses unknown component designs. Printer upgrade is required to proceed.") - if(program["unsupported_circuit"]) - to_chat(usr, "This program uses components not supported by the specified assembly. Please change the assembly type in the save file to a supported one.") - to_chat(usr, "Used space: [program["used_space"]]/[program["max_space"]].") - to_chat(usr, "Complexity: [program["complexity"]]/[program["max_complexity"]].") - to_chat(usr, "Iron cost: [program["iron_cost"]].") - - if("print") - if(!program || cloning) - return - - if(program["requires_upgrades"] && !upgraded && !debug) - to_chat(usr, "This program uses unknown component designs. Printer upgrade is required to proceed.") - return - if(program["unsupported_circuit"] && !debug) - to_chat(usr, "This program uses components not supported by the specified assembly. Please change the assembly type in the save file to a supported one.") - return - else if(fast_clone) - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - if(debug || materials.use_amount_mat(program["iron_cost"], /datum/material/iron)) - cloning = TRUE - print_program(usr) - else - to_chat(usr, "You need [program["iron_cost"]] iron to build that!") - else - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - if(!materials.use_amount_mat(program["iron_cost"], /datum/material/iron)) - to_chat(usr, "You need [program["iron_cost"]] iron to build that!") - return - var/cloning_time = round(program["iron_cost"] / 15) - cloning_time = min(cloning_time, MAX_CIRCUIT_CLONE_TIME) - cloning = TRUE - to_chat(usr, "You begin printing a custom assembly. This will take approximately [DisplayTimeText(cloning_time)]. You can still print \ - off normal parts during this time.") - playsound(src, 'sound/items/poster_being_created.ogg', 50, TRUE) - addtimer(CALLBACK(src, .proc/print_program, usr), cloning_time) - - if("cancel") - if(!cloning || !program) - return - - to_chat(usr, "Cloning has been canceled. Iron cost has been refunded.") - cloning = FALSE - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - materials.use_amount_mat(-program["iron_cost"], /datum/material/iron) //use negative amount to regain the cost - - - interact(usr) - - -// FUKKEN UPGRADE DISKS -/obj/item/disk/integrated_circuit/upgrade - name = "integrated circuit printer upgrade disk" - desc = "Install this into your integrated circuit printer to enhance it." - icon = 'icons/obj/assemblies/electronic_tools.dmi' - icon_state = "upgrade_disk" - item_state = "card-id" - w_class = WEIGHT_CLASS_SMALL - -/obj/item/disk/integrated_circuit/upgrade/advanced - name = "integrated circuit printer upgrade disk - advanced designs" - desc = "Install this into your integrated circuit printer to enhance it. This one adds new, advanced designs to the printer." - -/obj/item/disk/integrated_circuit/upgrade/clone - name = "integrated circuit printer upgrade disk - instant cloner" - desc = "Install this into your integrated circuit printer to enhance it. This one allows the printer to duplicate assemblies instantaneously." - icon_state = "upgrade_disk_clone" diff --git a/code/modules/integrated_electronics/core/saved_circuits.dm b/code/modules/integrated_electronics/core/saved_circuits.dm deleted file mode 100644 index ab9fbcacd2c78..0000000000000 --- a/code/modules/integrated_electronics/core/saved_circuits.dm +++ /dev/null @@ -1,361 +0,0 @@ -// Helpers for saving/loading integrated circuits. - - -// Saves type, modified name and modified inputs (if any) to a list -// The list is converted to JSON down the line. -//"Special" is not verified at any point except for by the circuit itself. -/obj/item/integrated_circuit/proc/save() - var/list/component_params = list() - var/init_name = initial(name) - - // Save initial name used for differentiating assemblies - component_params["type"] = init_name - - // Save the modified name. - if(init_name != displayed_name) - component_params["name"] = displayed_name - - // Saving input values - if(length(inputs)) - var/list/saved_inputs = list() - - for(var/index in 1 to inputs.len) - var/datum/integrated_io/input = inputs[index] - - // Don't waste space saving the default values - if(input.data == inputs_default["[index]"]) - continue - if(input.data == initial(input.data)) - continue - - var/list/input_value = list(index, FALSE, input.data) - // Index, Type, Value - // FALSE is default type used for num/text/list/null - // TODO: support for special input types, such as internal refs and maybe typepaths - - if(islist(input.data) || isnum_safe(input.data) || istext(input.data) || isnull(input.data)) - saved_inputs.Add(list(input_value)) - - if(saved_inputs.len) - component_params["inputs"] = saved_inputs - - var/special = save_special() - if(!isnull(special)) - component_params["special"] = special - - return component_params - -/obj/item/integrated_circuit/proc/save_special() - return - -// Verifies a list of component parameters -// Returns null on success, error name on failure -/obj/item/integrated_circuit/proc/verify_save(list/component_params) - var/init_name = initial(name) - // Validate name - if(component_params["name"] && !reject_bad_name(component_params["name"], TRUE)) - return "Bad component name at [init_name]." - - // Validate input values - if(component_params["inputs"]) - var/list/loaded_inputs = component_params["inputs"] - if(!islist(loaded_inputs)) - return "Malformed input values list at [init_name]." - - var/inputs_amt = length(inputs) - - // Too many inputs? Inputs for input-less component? This is not good. - if(!inputs_amt || inputs_amt < length(loaded_inputs)) - return "Input values list out of bounds at [init_name]." - - for(var/list/input in loaded_inputs) - if(input.len != 3) - return "Malformed input data at [init_name]." - - var/input_id = input[1] - var/input_type = input[2] - //var/input_value = input[3] - - // No special type support yet. - if(input_type) - return "Unidentified input type at [init_name]!" - // TODO: support for special input types, such as typepaths and internal refs - - // Input ID is a list index, make sure it's sane. - if(!isnum_safe(input_id) || input_id % 1 || input_id > inputs_amt || input_id < 1) - return "Invalid input index at [init_name]." - - -// Loads component parameters from a list -// Doesn't verify any of the parameters it loads, this is the job of verify_save() -/obj/item/integrated_circuit/proc/load(list/component_params) - // Load name - if(component_params["name"]) - displayed_name = component_params["name"] - - // Load input values - if(component_params["inputs"]) - var/list/loaded_inputs = component_params["inputs"] - - for(var/list/input in loaded_inputs) - var/index = input[1] - //var/input_type = input[2] - var/input_value = input[3] - - var/datum/integrated_io/pin = inputs[index] - // The pins themselves validate the data. - pin.write_data_to_pin(input_value) - // TODO: support for special input types, such as internal refs and maybe typepaths - - if(!isnull(component_params["special"])) - load_special(component_params["special"]) - -/obj/item/integrated_circuit/proc/load_special(special_data) - return - -// Saves type and modified name (if any) to a list -// The list is converted to JSON down the line. -/obj/item/electronic_assembly/proc/save() - var/list/assembly_params = list() - - // Save initial name used for differentiating assemblies - assembly_params["type"] = initial(name) - - // Save modified name - if(initial(name) != name) - assembly_params["name"] = name - - // Save modified description - if(initial(desc) != desc) - assembly_params["desc"] = desc - - // Save modified color - if(initial(detail_color) != detail_color) - assembly_params["detail_color"] = detail_color - - return assembly_params - - -// Verifies a list of assembly parameters -// Returns null on success, error name on failure -/obj/item/electronic_assembly/proc/verify_save(list/assembly_params) - // Validate name and color - if(assembly_params["name"] && !reject_bad_name(assembly_params["name"], TRUE)) - return "Bad assembly name." - if(assembly_params["desc"] && !reject_bad_text(assembly_params["desc"])) - return "Bad assembly description." - -// Loads assembly parameters from a list -// Doesn't verify any of the parameters it loads, this is the job of verify_save() -/obj/item/electronic_assembly/proc/load(list/assembly_params) - // Load modified name, if any. - if(assembly_params["name"]) - name = assembly_params["name"] - - // Load modified description, if any. - if(assembly_params["desc"]) - desc = assembly_params["desc"] - - if(assembly_params["detail_color"]) - detail_color = assembly_params["detail_color"] - - update_icon() - - - -// Attempts to save an assembly into a save file format. -// Returns null if assembly is not complete enough to be saved. -/datum/controller/subsystem/processing/circuit/proc/save_electronic_assembly(obj/item/electronic_assembly/assembly) - // No components? Don't even try to save it. - if(!length(assembly.assembly_components)) - return - - - var/list/blocks = list() - - // Block 1. Assembly. - blocks["assembly"] = assembly.save() - // (implant assemblies are not yet supported) - - - // Block 2. Components. - var/list/components = list() - for(var/c in assembly.assembly_components) - var/obj/item/integrated_circuit/component = c - components.Add(list(component.save())) - blocks["components"] = components - - - // Block 3. Wires. - var/list/wires = list() - var/list/saved_wires = list() - - for(var/c in assembly.assembly_components) - var/obj/item/integrated_circuit/component = c - var/list/all_pins = component.inputs + component.outputs + component.activators - - for(var/p in all_pins) - var/datum/integrated_io/pin = p - var/list/params = pin.get_pin_parameters() - var/text_params = params.Join() - - for(var/p2 in pin.linked) - var/datum/integrated_io/pin2 = p2 - var/list/params2 = pin2.get_pin_parameters() - var/text_params2 = params2.Join() - - // Check if we already saved an opposite version of this wire - // (do not save the same wire twice) - if((text_params2 + "=" + text_params) in saved_wires) - continue - - // If not, add a wire "hash" for future checks and save it - saved_wires.Add(text_params + "=" + text_params2) - wires.Add(list(list(params, params2))) - - if(wires.len) - blocks["wires"] = wires - - return json_encode(blocks) - - - -// Checks assembly save and calculates some of the parameters. -// Returns assembly (type: list) if the save is valid. -// Returns error code (type: text) if loading has failed. -// The following parameters area calculated during validation and added to the returned save list: -// "requires_upgrades", "unsupported_circuit", "iron_cost", "complexity", "max_complexity", "used_space", "max_space" -/datum/controller/subsystem/processing/circuit/proc/validate_electronic_assembly(program) - var/list/blocks = json_decode(program) - if(!blocks) - return - - var/error - - - // Block 1. Assembly. - var/list/assembly_params = blocks["assembly"] - - if(!islist(assembly_params) || !length(assembly_params)) - return "Invalid assembly data." // No assembly, damaged assembly or empty assembly - - // Validate type, get a temporary component - var/assembly_path = all_assemblies[assembly_params["type"]] - var/obj/item/electronic_assembly/assembly = cached_assemblies[assembly_path] - if(!assembly) - return "Invalid assembly type." - - // Check assembly save data for errors - error = assembly.verify_save(assembly_params) - if(error) - return error - - - // Read space & complexity limits and start keeping track of them - blocks["complexity"] = 0 - blocks["max_complexity"] = assembly.max_complexity - blocks["used_space"] = 0 - blocks["max_space"] = assembly.max_components - - // Start keeping track of total iron cost - blocks["iron_cost"] = assembly.materials[/datum/material/iron] - - - // Block 2. Components. - if(!islist(blocks["components"]) || !length(blocks["components"])) - return "Invalid components list." // No components or damaged components list - - var/list/assembly_components = list() - for(var/C in blocks["components"]) - var/list/component_params = C - - if(!islist(component_params) || !length(component_params)) - return "Invalid component data." - - // Validate type, get a temporary component - var/component_path = all_components[component_params["type"]] - var/obj/item/integrated_circuit/component = cached_components[component_path] - if(!component) - return "Invalid component type." - - // Add temporary component to assembly_components list, to be used later when verifying the wires - assembly_components.Add(component) - - // Check component save data for errors - error = component.verify_save(component_params) - if(error) - return error - - // Update estimated assembly complexity, taken space and material cost - blocks["complexity"] += component.complexity - blocks["used_space"] += component.size - blocks["iron_cost"] += component.materials[/datum/material/iron] - - // Check if the assembly requires printer upgrades - if(!(component.spawn_flags & IC_SPAWN_DEFAULT)) - blocks["requires_upgrades"] = TRUE - - // Check if the assembly supports the circucit - if((component.action_flags & assembly.allowed_circuit_action_flags) != component.action_flags) - blocks["unsupported_circuit"] = TRUE - - - // Check complexity and space limitations - if(blocks["used_space"] > blocks["max_space"]) - return "Used space overflow." - if(blocks["complexity"] > blocks["max_complexity"]) - return "Complexity overflow." - - - // Block 3. Wires. - if(blocks["wires"]) - if(!islist(blocks["wires"])) - return "Invalid wiring list." // Damaged wires list - - for(var/w in blocks["wires"]) - var/list/wire = w - - if(!islist(wire) || wire.len != 2) - return "Invalid wire data." - - var/datum/integrated_io/IO = assembly.get_pin_ref_list(wire[1], assembly_components) - var/datum/integrated_io/IO2 = assembly.get_pin_ref_list(wire[2], assembly_components) - if(!IO || !IO2) - return "Invalid wire data." - - if(initial(IO.io_type) != initial(IO2.io_type)) - return "Wire type mismatch." - - return blocks - - -// Loads assembly (in form of list) into an object and returns it. -// No sanity checks are performed, save file is expected to be validated by validate_electronic_assembly -/datum/controller/subsystem/processing/circuit/proc/load_electronic_assembly(loc, list/blocks) - - // Block 1. Assembly. - var/list/assembly_params = blocks["assembly"] - var/obj/item/electronic_assembly/assembly_path = all_assemblies[assembly_params["type"]] - var/obj/item/electronic_assembly/assembly = new assembly_path(null) - assembly.load(assembly_params) - - - - // Block 2. Components. - for(var/component_params in blocks["components"]) - var/obj/item/integrated_circuit/component_path = all_components[component_params["type"]] - var/obj/item/integrated_circuit/component = new component_path(assembly) - assembly.add_component(component) - component.load(component_params) - - - // Block 3. Wires. - if(blocks["wires"]) - for(var/w in blocks["wires"]) - var/list/wire = w - var/datum/integrated_io/IO = assembly.get_pin_ref_list(wire[1]) - var/datum/integrated_io/IO2 = assembly.get_pin_ref_list(wire[2]) - IO.connect_pin(IO2) - - assembly.forceMove(loc) - return assembly diff --git a/code/modules/integrated_electronics/core/special_pins/boolean_pin.dm b/code/modules/integrated_electronics/core/special_pins/boolean_pin.dm deleted file mode 100644 index da59434b65349..0000000000000 --- a/code/modules/integrated_electronics/core/special_pins/boolean_pin.dm +++ /dev/null @@ -1,26 +0,0 @@ -// These pins only contain 0 or 1. Null is not allowed. -/datum/integrated_io/boolean - name = "boolean pin" - data = FALSE - -/datum/integrated_io/boolean/ask_for_pin_data(mob/user) // 'Ask' is a bit misleading, acts more like a toggle. - var/new_data = !data - to_chat(user, "You switch the data bit to [new_data ? "TRUE" : "FALSE"].") - write_data_to_pin(new_data) - -/datum/integrated_io/boolean/write_data_to_pin(var/new_data) - if(new_data == FALSE || new_data == TRUE) - data = new_data - holder.on_data_written() - -/datum/integrated_io/boolean/scramble() - write_data_to_pin(rand(FALSE,TRUE)) - push_data() - -/datum/integrated_io/boolean/display_pin_type() - return IC_FORMAT_BOOLEAN - -/datum/integrated_io/boolean/display_data(var/input) - if(data) - return "(TRUE)" - return "(FALSE)" diff --git a/code/modules/integrated_electronics/core/special_pins/char_pin.dm b/code/modules/integrated_electronics/core/special_pins/char_pin.dm deleted file mode 100644 index 632ef695218f9..0000000000000 --- a/code/modules/integrated_electronics/core/special_pins/char_pin.dm +++ /dev/null @@ -1,27 +0,0 @@ -// These pins can only contain a 1 character string or null. -/datum/integrated_io/char - name = "char pin" - -/datum/integrated_io/char/ask_for_pin_data(mob/user) - var/new_data = stripped_input(user, "Please type in one character.","[src] char writing", no_trim = TRUE) - if(holder.check_interactivity(user) ) - to_chat(user, "You input [new_data ? "new_data" : "NULL"] into the pin.") - write_data_to_pin(new_data) - -/datum/integrated_io/char/write_data_to_pin(var/new_data) - if(isnull(new_data) || istext(new_data)) - if(length(new_data) > 1) - return - data = new_data - holder.on_data_written() - -// This makes the text go from "A" to "%". -/datum/integrated_io/char/scramble() - if(!is_valid()) - return - var/list/options = list("!","@","#","$","%","^","&","*","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z") - data = pick(options) - push_data() - -/datum/integrated_io/char/display_pin_type() - return IC_FORMAT_CHAR diff --git a/code/modules/integrated_electronics/core/special_pins/color_pin.dm b/code/modules/integrated_electronics/core/special_pins/color_pin.dm deleted file mode 100644 index e2a09657dff64..0000000000000 --- a/code/modules/integrated_electronics/core/special_pins/color_pin.dm +++ /dev/null @@ -1,49 +0,0 @@ -// These pins can only contain a color (in the form of #FFFFFF) or null. -/datum/integrated_io/color - name = "color pin" - -/datum/integrated_io/color/ask_for_pin_data(mob/user) - var/new_data = input("Please select a color.","[src] color writing") as color|null - if(holder.check_interactivity(user) ) - to_chat(user, "You input a new color into the pin.") - write_data_to_pin(new_data) - -/datum/integrated_io/color/write_data_to_pin(var/new_data) - // Since this is storing the color as a string hex color code, we need to make sure it's actually one. - if(isnull(new_data) || istext(new_data)) - if(istext(new_data)) - new_data = uppertext(new_data) - if(length(new_data) != 7) // We can hex if we want to, we can leave your strings behind - return // Cause your strings don't hex and if they don't hex - var/friends = copytext(new_data, 2, 8) // Well they're are no strings of mine - // I say, we can go where we want to, a place where they will never find - var/safety_dance = 1 - while(safety_dance >= 7) // And we can act like we come from out of this world.log - var/hex = copytext(friends, safety_dance, safety_dance+1) - if(!(hex in list("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"))) - return // Leave the fake one far behind, - safety_dance++ - - data = new_data // And we can hex - holder.on_data_written() - -// This randomizes the color. -/datum/integrated_io/color/scramble() - if(!is_valid()) - return - var/new_data - for(var/i=1;i<=3;i++) - var/temp_col = "[num2hex(rand(0,255), 2)]" - if(length(temp_col )<2) - temp_col = "0[temp_col]" - new_data += temp_col - data = new_data - push_data() - -/datum/integrated_io/color/display_pin_type() - return IC_FORMAT_COLOR - -/datum/integrated_io/color/display_data(var/input) - if(!isnull(data)) - return "([data])" - return ..() diff --git a/code/modules/integrated_electronics/core/special_pins/dir_pin.dm b/code/modules/integrated_electronics/core/special_pins/dir_pin.dm deleted file mode 100644 index 8a2fb61a84f76..0000000000000 --- a/code/modules/integrated_electronics/core/special_pins/dir_pin.dm +++ /dev/null @@ -1,31 +0,0 @@ -// These pins can only contain directions (1,2,4,8...) or null. -/datum/integrated_io/dir - name = "dir pin" - -/datum/integrated_io/dir/ask_for_pin_data(mob/user) - var/new_data = input("Please type in a valid dir number. \ - Valid dirs are;\n\ - North/Fore = [NORTH],\n\ - South/Aft = [SOUTH],\n\ - East/Starboard = [EAST],\n\ - West/Port = [WEST],\n\ - Northeast = [NORTHEAST],\n\ - Northwest = [NORTHWEST],\n\ - Southeast = [SOUTHEAST],\n\ - Southwest = [SOUTHWEST]","[src] dir writing") as null|num - if(isnum_safe(new_data) && holder.check_interactivity(user) ) - to_chat(user, "You input [new_data] into the pin.") - write_data_to_pin(new_data) - -/datum/integrated_io/dir/write_data_to_pin(var/new_data) - if(isnull(new_data) || (new_data in list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)/* + list(UP, DOWN)*/)) - data = new_data - holder.on_data_written() - -/datum/integrated_io/dir/display_pin_type() - return IC_FORMAT_DIR - -/datum/integrated_io/dir/display_data(var/input) - if(!isnull(data)) - return "([dir2text(data)])" - return ..() diff --git a/code/modules/integrated_electronics/core/special_pins/index_pin.dm b/code/modules/integrated_electronics/core/special_pins/index_pin.dm deleted file mode 100644 index 91fd3e7aaebb4..0000000000000 --- a/code/modules/integrated_electronics/core/special_pins/index_pin.dm +++ /dev/null @@ -1,21 +0,0 @@ -// These pins can only contain integer numbers between 0 and IC_MAX_LIST_LENGTH. Null is allowed. -/datum/integrated_io/index - name = "index pin" - data = 1 - -/datum/integrated_io/index/ask_for_pin_data(mob/user) - var/new_data = input("Please type in an index.","[src] index writing") as num - if(isnum_safe(new_data) && holder.check_interactivity(user)) - to_chat(user, "You input [new_data] into the pin.") - write_data_to_pin(new_data) - -/datum/integrated_io/index/write_data_to_pin(new_data) - if(isnull(new_data)) - new_data = 0 - - if(isnum_safe(new_data)) - data = CLAMP(round(new_data), 0, IC_MAX_LIST_LENGTH) - holder.on_data_written() - -/datum/integrated_io/index/display_pin_type() - return IC_FORMAT_INDEX diff --git a/code/modules/integrated_electronics/core/special_pins/list_pin.dm b/code/modules/integrated_electronics/core/special_pins/list_pin.dm deleted file mode 100644 index 6437d0869e756..0000000000000 --- a/code/modules/integrated_electronics/core/special_pins/list_pin.dm +++ /dev/null @@ -1,153 +0,0 @@ -// These pins contain a list. Null is not allowed. -/datum/integrated_io/lists - name = "list pin" - data = list() - -/datum/integrated_io/lists/ask_for_pin_data(mob/user) - interact(user) - -/datum/integrated_io/lists/proc/interact(mob/user) - var/list/my_list = data - var/t = "

[src]


" - t += "List length: [my_list.len]
" - t += "\[Refresh\] | " - t += "\[Add\] | " - t += "\[Remove\] | " - t += "\[Edit\] | " - t += "\[Swap\] | " - t += "\[Clear\]
" - t += "
" - var/i = 0 - for(var/line in my_list) - i++ - t += "#[i] | [display_data(line)] | " - t += "\[Edit\] | " - t += "\[Remove\]
" - user << browse(t, "window=list_pin_[REF(src)];size=500x400") - -/datum/integrated_io/lists/proc/add_to_list(mob/user, var/new_entry) - if(!new_entry && user) - new_entry = ask_for_data_type(user) - if(is_valid(new_entry)) - Add(new_entry) - -/datum/integrated_io/lists/proc/Add(var/new_entry) - var/list/my_list = data - if(my_list.len > IC_MAX_LIST_LENGTH) - my_list.Cut(Start=1,End=2) - my_list.Add(new_entry) - -/datum/integrated_io/lists/proc/remove_from_list_by_position(mob/user, var/position) - var/list/my_list = data - if(!my_list.len) - to_chat(user, "The list is empty, there's nothing to remove.") - return - if(!position) - return - var/target_entry = my_list[position] - if(target_entry) - my_list.Remove(target_entry) - -/datum/integrated_io/lists/proc/remove_from_list(mob/user, var/target_entry) - var/list/my_list = data - if(!my_list.len) - to_chat(user, "The list is empty, there's nothing to remove.") - return - if(!target_entry) - target_entry = input(user, "Which piece of data do you want to remove?", "Remove") as null|anything in my_list - if(holder.check_interactivity(user) && target_entry) - my_list.Remove(target_entry) - -/datum/integrated_io/lists/proc/edit_in_list(mob/user, var/target_entry) - var/list/my_list = data - if(!my_list.len) - to_chat(user, "The list is empty, there's nothing to modify.") - return - if(!target_entry) - target_entry = input(user, "Which piece of data do you want to edit?", "Edit") as null|anything in my_list - if(holder.check_interactivity(user) && target_entry) - var/edited_entry = ask_for_data_type(user, target_entry) - if(edited_entry) - my_list[my_list.Find(target_entry)] = edited_entry - -/datum/integrated_io/lists/proc/edit_in_list_by_position(mob/user, var/position) - var/list/my_list = data - if(!my_list.len) - to_chat(user, "The list is empty, there's nothing to modify.") - return - if(!position) - return - var/target_entry = my_list[position] - if(target_entry) - var/edited_entry = ask_for_data_type(user, target_entry) - if(edited_entry) - my_list[position] = edited_entry - -/datum/integrated_io/lists/proc/swap_inside_list(mob/user, var/first_target, var/second_target) - var/list/my_list = data - if(my_list.len <= 1) - to_chat(user, "The list is empty, or too small to do any meaningful swapping.") - return - if(!first_target) - first_target = input(user, "Which piece of data do you want to swap? (1)", "Swap") as null|anything in my_list - - if(holder.check_interactivity(user) && first_target) - if(!second_target) - second_target = input(user, "Which piece of data do you want to swap? (2)", "Swap") as null|anything in my_list - first_target - - if(holder.check_interactivity(user) && second_target) - var/first_pos = my_list.Find(first_target) - var/second_pos = my_list.Find(second_target) - my_list.Swap(first_pos, second_pos) - -/datum/integrated_io/lists/proc/clear_list(mob/user) - var/list/my_list = data - my_list.Cut() - -/datum/integrated_io/lists/scramble() - var/list/my_list = data - my_list = shuffle(my_list) - push_data() - -/datum/integrated_io/lists/write_data_to_pin(var/new_data) - if(islist(new_data)) - var/list/new_list = new_data - data = new_list.Copy(max(1,new_list.len - IC_MAX_LIST_LENGTH+1),0) - holder.on_data_written() - else if(isnull(new_data)) // Clear the list - var/list/my_list = data - my_list.Cut() - holder.on_data_written() - -/datum/integrated_io/lists/display_pin_type() - return IC_FORMAT_LIST - -/datum/integrated_io/lists/Topic(href, href_list) - if(!holder.check_interactivity(usr)) - return - if(..()) - return TRUE - - if(href_list["add"]) - add_to_list(usr) - - if(href_list["swap"]) - swap_inside_list(usr) - - if(href_list["clear"]) - clear_list(usr) - - if(href_list["remove"]) - if(href_list["pos"]) - remove_from_list_by_position(usr, text2num(href_list["pos"])) - else - remove_from_list(usr) - - if(href_list["edit"]) - if(href_list["pos"]) - edit_in_list_by_position(usr, text2num(href_list["pos"])) - else - edit_in_list(usr) - - holder.interact(usr) // Refresh the main UI, - interact(usr) // and the list UI. diff --git a/code/modules/integrated_electronics/core/special_pins/number_pin.dm b/code/modules/integrated_electronics/core/special_pins/number_pin.dm deleted file mode 100644 index e4e02d33a105a..0000000000000 --- a/code/modules/integrated_electronics/core/special_pins/number_pin.dm +++ /dev/null @@ -1,17 +0,0 @@ -// These pins can only contain numbers (int and floating point) or null. -/datum/integrated_io/number - name = "number pin" - -/datum/integrated_io/number/ask_for_pin_data(mob/user) - var/new_data = input("Please type in a number.","[src] number writing") as null|num - if(isnum_safe(new_data) && holder.check_interactivity(user) ) - to_chat(user, "You input [new_data] into the pin.") - write_data_to_pin(new_data) - -/datum/integrated_io/number/write_data_to_pin(var/new_data) - if(isnull(new_data) || isnum_safe(new_data)) - data = new_data - holder.on_data_written() - -/datum/integrated_io/number/display_pin_type() - return IC_FORMAT_NUMBER diff --git a/code/modules/integrated_electronics/core/special_pins/ref_pin.dm b/code/modules/integrated_electronics/core/special_pins/ref_pin.dm deleted file mode 100644 index f64e15f225547..0000000000000 --- a/code/modules/integrated_electronics/core/special_pins/ref_pin.dm +++ /dev/null @@ -1,24 +0,0 @@ -// These pins only contain weakrefs or null. -/datum/integrated_io/ref - name = "ref pin" - -/datum/integrated_io/ref/ask_for_pin_data(mob/user) // This clears the pin. - write_data_to_pin(null) - -/datum/integrated_io/ref/write_data_to_pin(var/new_data) - if(isnull(new_data) || isweakref(new_data)) - data = new_data - holder.on_data_written() - -/datum/integrated_io/ref/display_pin_type() - return IC_FORMAT_REF - -/datum/integrated_io/ref/connect_pin(datum/integrated_io/pin) - ..(pin) - if(istype(pin,/datum/integrated_io/selfref)) - write_data_to_pin(pin.data) - -/datum/integrated_io/ref/disconnect_pin(datum/integrated_io/pin) - ..(pin) - if(istype(pin,/datum/integrated_io/selfref)) - write_data_to_pin(null) diff --git a/code/modules/integrated_electronics/core/special_pins/selfref_pin.dm b/code/modules/integrated_electronics/core/special_pins/selfref_pin.dm deleted file mode 100644 index 79dcf9e6c8c9f..0000000000000 --- a/code/modules/integrated_electronics/core/special_pins/selfref_pin.dm +++ /dev/null @@ -1,27 +0,0 @@ -// This pin only contains its own weakref and can't be changed -/datum/integrated_io/selfref - name = "selfref pin" - -/datum/integrated_io/selfref/New() - ..() - write_data_to_pin(src) - -/datum/integrated_io/selfref/ask_for_pin_data(mob/user) // You can't clear it, it's self reference. - - -/datum/integrated_io/selfref/write_data_to_pin(var/new_data) // You can't write anything else but itself onto it - if(data) - return - data = WEAKREF(holder) - holder.on_data_written() - -/datum/integrated_io/selfref/display_pin_type() - return IC_FORMAT_REF - -/datum/integrated_io/selfref/connect_pin(datum/integrated_io/pin) - pin.write_data_to_pin(data) - ..(pin) - -/datum/integrated_io/selfref/disconnect_pin(datum/integrated_io/pin) - ..(pin) - pin.write_data_to_pin(null) diff --git a/code/modules/integrated_electronics/core/special_pins/string_pin.dm b/code/modules/integrated_electronics/core/special_pins/string_pin.dm deleted file mode 100644 index 554ebf5948799..0000000000000 --- a/code/modules/integrated_electronics/core/special_pins/string_pin.dm +++ /dev/null @@ -1,30 +0,0 @@ -// These pins can only contain text and null. -/datum/integrated_io/string - name = "string pin" - -/datum/integrated_io/string/ask_for_pin_data(mob/user) - var/new_data = stripped_multiline_input(user, "Please type in a string.","[src] string writing", no_trim = TRUE) - if(holder.check_interactivity(user) ) - if(!isnull(new_data) && istext(new_data) && CHAT_FILTER_CHECK(new_data)) - to_chat(user, "Your input contains prohibited words.") - return - to_chat(user, "You input [new_data ? "[new_data]" : "NULL"] into the pin.") - write_data_to_pin(new_data) - -/datum/integrated_io/string/write_data_to_pin(var/new_data) - if(isnull(new_data) || istext(new_data)) - data = new_data - holder.on_data_written() - -// This makes the text go "from this" to "#G&*!HD$%L" -/datum/integrated_io/string/scramble() - if(!is_valid()) - return - var/list/options = list("!","@","#","$","%","^","&","*","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z") - var/new_data = "" - for(var/i in 1 to length(data)) - new_data += pick(options) - push_data() - -/datum/integrated_io/string/display_pin_type() - return IC_FORMAT_STRING diff --git a/code/modules/integrated_electronics/core/wirer.dm b/code/modules/integrated_electronics/core/wirer.dm deleted file mode 100644 index 9550f9b4aefcd..0000000000000 --- a/code/modules/integrated_electronics/core/wirer.dm +++ /dev/null @@ -1,101 +0,0 @@ -#define WIRE "wire" -#define WIRING "wiring" -#define UNWIRE "unwire" -#define UNWIRING "unwiring" - -/obj/item/integrated_electronics/wirer - name = "circuit wirer" - desc = "It's a small wiring tool, with a wire roll, electric soldering iron, wire cutter, and more in one package. \ - The wires used are generally useful for small electronics, such as circuitboards and breadboards, as opposed to larger wires \ - used for power or data transmission." - icon = 'icons/obj/assemblies/electronic_tools.dmi' - icon_state = "wirer-wire" - flags_1 = CONDUCT_1 - w_class = WEIGHT_CLASS_SMALL - var/datum/integrated_io/selected_io = null - var/mode = WIRE - -/obj/item/integrated_electronics/wirer/update_icon() - icon_state = "wirer-[mode]" - -/obj/item/integrated_electronics/wirer/proc/wire(var/datum/integrated_io/io, mob/user) - if(!io.holder.assembly) - to_chat(user, "\The [io.holder] needs to be secured inside an assembly first.") - return - switch(mode) - if(WIRE) - selected_io = io - to_chat(user, "You attach a data wire to \the [selected_io.holder]'s [selected_io.name] data channel.") - mode = WIRING - update_icon() - if(WIRING) - if(io == selected_io) - to_chat(user, "Wiring \the [selected_io.holder]'s [selected_io.name] into itself is rather pointless.") - return - if(io.io_type != selected_io.io_type) - to_chat(user, "Those two types of channels are incompatible. The first is a [selected_io.io_type], \ - while the second is a [io.io_type].") - return - if(io.holder.assembly && io.holder.assembly != selected_io.holder.assembly) - to_chat(user, "Both \the [io.holder] and \the [selected_io.holder] need to be inside the same assembly.") - return - selected_io.connect_pin(io) - - to_chat(user, "You connect \the [selected_io.holder]'s [selected_io.name] to \the [io.holder]'s [io.name].") - mode = WIRE - update_icon() - selected_io.holder.interact(user) // This is to update the UI. - selected_io = null - - if(UNWIRE) - selected_io = io - if(!io.linked.len) - to_chat(user, "There is nothing connected to \the [selected_io] data channel.") - selected_io = null - return - to_chat(user, "You prepare to detach a data wire from \the [selected_io.holder]'s [selected_io.name] data channel.") - mode = UNWIRING - update_icon() - return - - if(UNWIRING) - if(io == selected_io) - to_chat(user, "You can't wire a pin into each other, so unwiring \the [selected_io.holder] from \ - the same pin is rather moot.") - return - if(selected_io in io.linked) - selected_io.disconnect_pin(io) - to_chat(user, "You disconnect \the [selected_io.holder]'s [selected_io.name] from \ - \the [io.holder]'s [io.name].") - selected_io.holder.interact(user) // This is to update the UI. - selected_io = null - mode = UNWIRE - update_icon() - else - to_chat(user, "\The [selected_io.holder]'s [selected_io.name] and \the [io.holder]'s \ - [io.name] are not connected.") - return - -/obj/item/integrated_electronics/wirer/attack_self(mob/user) - switch(mode) - if(WIRE) - mode = UNWIRE - if(WIRING) - if(selected_io) - to_chat(user, "You decide not to wire the data channel.") - selected_io = null - mode = WIRE - if(UNWIRE) - mode = WIRE - if(UNWIRING) - if(selected_io) - to_chat(user, "You decide not to disconnect the data channel.") - selected_io = null - mode = UNWIRE - update_icon() - to_chat(user, "You set \the [src] to [mode].") - -#undef WIRE -#undef WIRING -#undef UNWIRE -#undef UNWIRING diff --git a/code/modules/integrated_electronics/passive/passive.dm b/code/modules/integrated_electronics/passive/passive.dm deleted file mode 100644 index 7678d02ad5fe7..0000000000000 --- a/code/modules/integrated_electronics/passive/passive.dm +++ /dev/null @@ -1,7 +0,0 @@ -// 'Passive' components do not have any pins, and instead contribute in some form to the assembly holding them. -/obj/item/integrated_circuit/passive - inputs = list() - outputs = list() - activators = list() - power_draw_idle = 0 - power_draw_per_use = 0 diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm deleted file mode 100644 index 67677d7d4b35c..0000000000000 --- a/code/modules/integrated_electronics/passive/power.dm +++ /dev/null @@ -1,139 +0,0 @@ - -/obj/item/integrated_circuit/passive/power - name = "power thingy" - desc = "Does power stuff." - complexity = 5 - category_text = "Power - Passive" - -/obj/item/integrated_circuit/passive/power/proc/make_energy() - return - -// For calculators. -/obj/item/integrated_circuit/passive/power/solar_cell - name = "tiny photovoltaic cell" - desc = "It's a very tiny solar cell, generally used in calculators." - extended_desc = "This cell generates 1 W of power in optimal lighting conditions. Less light will result in less power being generated." - icon_state = "solar_cell" - complexity = 8 - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/max_power = 30 - -/obj/item/integrated_circuit/passive/power/solar_cell/make_energy() - var/turf/T = get_turf(src) - var/light_amount = T ? T.get_lumcount() : 0 - var/adjusted_power = max(max_power * light_amount, 0) - adjusted_power = round(adjusted_power, 0.1) - if(adjusted_power) - if(assembly) - assembly.give_power(adjusted_power) - -/obj/item/integrated_circuit/passive/power/starter - name = "starter" - desc = "This tiny circuit will send a pulse right after the device is turned on, or when power is restored to it." - icon_state = "led" - complexity = 1 - activators = list("pulse out" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/is_charge = FALSE - -/obj/item/integrated_circuit/passive/power/starter/make_energy() - if(assembly.battery) - if(assembly.battery.charge) - if(!is_charge) - activate_pin(1) - is_charge = TRUE - else - is_charge = FALSE - else - is_charge=FALSE - return FALSE - -// For fat machines that need fat power, like drones. -/obj/item/integrated_circuit/passive/power/relay - name = "tesla power relay" - desc = "A seemingly enigmatic device which connects to nearby APCs wirelessly and draws power from them." - w_class = WEIGHT_CLASS_SMALL - extended_desc = "The siphon drains 50 W of power from an APC in the same room as it as long as it has charge remaining. It will always drain \ - from the 'equipment' power channel." - icon_state = "power_relay" - complexity = 7 - spawn_flags = IC_SPAWN_RESEARCH - var/power_amount = 50 - - -/obj/item/integrated_circuit/passive/power/relay/make_energy() - if(!assembly) - return - var/area/A = get_area(src) - if(A && A.powered(AREA_USAGE_EQUIP) && assembly.give_power(power_amount)) - A.use_power(power_amount, AREA_USAGE_EQUIP) - // give_power() handles CELLRATE on its own. - - -// For really fat machines. -/obj/item/integrated_circuit/passive/power/relay/large - name = "large tesla power relay" - desc = "A seemingly enigmatic device which connects to nearby APCs wirelessly and draws power from them, now in industrial size!" - w_class = WEIGHT_CLASS_BULKY - extended_desc = "The siphon drains 2 kW of power from an APC in the same room as it as long as it has charge remaining. It will always drain \ - from the 'equipment' power channel." - icon_state = "power_relay" - complexity = 15 - spawn_flags = IC_SPAWN_RESEARCH - power_amount = 1000 - - -//fuel cell -/obj/item/integrated_circuit/passive/power/chemical_cell - name = "fuel cell" - 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." - complexity = 4 - inputs = list() - outputs = list("volume used" = IC_PINTYPE_NUMBER, "self reference" = IC_PINTYPE_SELFREF) - activators = list("push ref" = IC_PINTYPE_PULSE_IN) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/volume = 60 - var/list/fuel = list("plasma" = 50000, "slimejelly" = 22500, "welding_fuel" = 15000, "carbon" = 10000, "ethanol" = 10000, "nutriment" = 8000) - var/multi = 1 - var/lfwb =TRUE - -/obj/item/integrated_circuit/passive/power/chemical_cell/New() - ..() - 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)) - push_data() - ..() - -/obj/item/integrated_circuit/passive/power/chemical_cell/on_reagent_change(changetype) - set_pin_data(IC_OUTPUT, 1, reagents.total_volume) - push_data() - -/obj/item/integrated_circuit/passive/power/chemical_cell/make_energy() - if(assembly) - if(assembly.battery) - var/bp = 5000 - if(reagents.get_reagent_amount("blood")) //only blood is powerful enough to power the station(c) - var/datum/reagent/blood/B = locate() in reagents.reagent_list - if(lfwb) - if(B && B.data["cloneable"]) - var/mob/M = B.data["donor"] - if(M && (M.stat != DEAD) && (M.client)) - bp = 500000 - if((assembly.battery.maxcharge-assembly.battery.charge) / GLOB.CELLRATE > bp) - if(reagents.remove_reagent("blood", 1)) - assembly.give_power(bp) - for(var/I in fuel) - if((assembly.battery.maxcharge-assembly.battery.charge) / GLOB.CELLRATE > fuel[I]) - if(reagents.remove_reagent(I, 1)) - assembly.give_power(fuel[I]*multi) - -/obj/item/integrated_circuit/passive/power/chemical_cell/do_work() - set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) - push_data() diff --git a/code/modules/integrated_electronics/subtypes/access.dm b/code/modules/integrated_electronics/subtypes/access.dm deleted file mode 100644 index 10138c4491874..0000000000000 --- a/code/modules/integrated_electronics/subtypes/access.dm +++ /dev/null @@ -1,41 +0,0 @@ -// - card reader - // -/obj/item/integrated_circuit/input/card_reader - name = "ID card reader" //To differentiate it from the data card reader - desc = "A circuit that can read the registred name, assignment, and PassKey string from an ID card." - icon_state = "card_reader" - - complexity = 4 - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - outputs = list( - "registered name" = IC_PINTYPE_STRING, - "assignment" = IC_PINTYPE_STRING, - "passkey" = IC_PINTYPE_STRING - ) - activators = list( - "on read" = IC_PINTYPE_PULSE_OUT - ) - -/obj/item/integrated_circuit/input/card_reader/attackby_react(obj/item/I, mob/living/user, intent) - var/obj/item/card/id/card = I.GetID() - var/list/access = I.GetAccess() - var/passkey = strtohex(XorEncrypt(json_encode(access), SScircuit.cipherkey)) - - if(assembly) - assembly.access_card.access |= access - - if(card) // An ID card. - set_pin_data(IC_OUTPUT, 1, card.registered_name) - set_pin_data(IC_OUTPUT, 2, card.assignment) - - else if(length(access)) // A non-card object that has access levels. - set_pin_data(IC_OUTPUT, 1, null) - set_pin_data(IC_OUTPUT, 2, null) - - else - return FALSE - - set_pin_data(IC_OUTPUT, 3, passkey) - - push_data() - activate_pin(1) - return TRUE diff --git a/code/modules/integrated_electronics/subtypes/arithmetic.dm b/code/modules/integrated_electronics/subtypes/arithmetic.dm deleted file mode 100644 index 0799b4d2df7a2..0000000000000 --- a/code/modules/integrated_electronics/subtypes/arithmetic.dm +++ /dev/null @@ -1,344 +0,0 @@ -//These circuits do simple math. -/obj/item/integrated_circuit/arithmetic - complexity = 1 - inputs = list( - "A" = IC_PINTYPE_NUMBER, - "B" = IC_PINTYPE_NUMBER, - "C" = IC_PINTYPE_NUMBER, - "D" = IC_PINTYPE_NUMBER, - "E" = IC_PINTYPE_NUMBER, - "F" = IC_PINTYPE_NUMBER, - "G" = IC_PINTYPE_NUMBER, - "H" = IC_PINTYPE_NUMBER - ) - outputs = list("result" = IC_PINTYPE_NUMBER) - activators = list("compute" = IC_PINTYPE_PULSE_IN, "on computed" = IC_PINTYPE_PULSE_OUT) - category_text = "Arithmetic" - power_draw_per_use = 5 // Math is pretty cheap. - -// +Adding+ // - -/obj/item/integrated_circuit/arithmetic/addition - name = "addition circuit" - desc = "This circuit can add numbers together." - extended_desc = "The order that the calculation goes is;
\ - result = ((((A + B) + C) + D) ... ) and so on, until all pins have been added. \ - Null pins are ignored." - icon_state = "addition" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/arithmetic/addition/do_work() - var/result = 0 - for(var/k in 1 to inputs.len) - var/I = get_pin_data(IC_INPUT, k) - if(isnum_safe(I)) - result += I - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// -Subtracting- // - -/obj/item/integrated_circuit/arithmetic/subtraction - name = "subtraction circuit" - desc = "This circuit can subtract numbers." - extended_desc = "The order that the calculation goes is;
\ - result = ((((A - B) - C) - D) ... ) and so on, until all pins have been subtracted. \ - Null pins are ignored. Pin A must be a number, or the circuit will not function." - icon_state = "subtraction" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/arithmetic/subtraction/do_work() - var/datum/integrated_io/A = inputs[1] - if(!isnum_safe(A.data)) - return - var/result = A.data - - for(var/k in 2 to inputs.len) - var/I = get_pin_data(IC_INPUT, k) - if(isnum_safe(I)) - result -= I - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// *Multiply* // - -/obj/item/integrated_circuit/arithmetic/multiplication - name = "multiplication circuit" - desc = "This circuit can multiply numbers." - extended_desc = "The order that the calculation goes is;
\ - result = ((((A * B) * C) * D) ... ) and so on, until all pins have been multiplied. \ - Null pins are ignored. Pin A must be a number, or the circuit will not function." - icon_state = "multiplication" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - - -/obj/item/integrated_circuit/arithmetic/multiplication/do_work() - var/datum/integrated_io/A = inputs[1] - if(!isnum_safe(A.data)) - return - var/result = A.data - for(var/k in 2 to inputs.len) - var/I = get_pin_data(IC_INPUT, k) - if(isnum_safe(I)) - result *= I - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// /Division/ // - -/obj/item/integrated_circuit/arithmetic/division - name = "division circuit" - desc = "This circuit can divide numbers. Don't even think about trying to divide by zero!" - extended_desc = "The order that the calculation goes is;
\ - result = ((((A / B) / C) / D) ... ) and so on, until all pins have been divided. \ - Null pins, and pins containing 0, are ignored. Pin A must be a number or the circuit will not function." - icon_state = "division" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/arithmetic/division/do_work() - var/datum/integrated_io/A = inputs[1] - if(!isnum_safe(A.data)) - return - var/result = A.data - - - for(var/k in 2 to inputs.len) - var/I = get_pin_data(IC_INPUT, k) - if(isnum_safe(I) && (I != 0)) - result /= I - - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -//^ Exponent ^// - -/obj/item/integrated_circuit/arithmetic/exponent - name = "exponent circuit" - desc = "Outputs A to the power of B." - icon_state = "exponent" - inputs = list("A" = IC_PINTYPE_NUMBER, "B" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/arithmetic/exponent/do_work() - var/result = 0 - var/datum/integrated_io/A = inputs[1] - var/datum/integrated_io/B = inputs[2] - if(isnum_safe(A.data) && isnum_safe(B.data)) - result = A.data ** B.data - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// +-Sign-+ // - -/obj/item/integrated_circuit/arithmetic/sign - name = "sign circuit" - desc = "This circuit can tell if a number is positive, negative, or zero." - extended_desc = "Will output 1, -1, or 0, depending on if A is a positive number, a negative number, or zero, respectively." - icon_state = "sign" - inputs = list("A" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/arithmetic/sign/do_work() - var/result = 0 - var/datum/integrated_io/A = inputs[1] - if(isnum_safe(A.data)) - if(A.data > 0) - result = 1 - else if (A.data < 0) - result = -1 - else - result = 0 - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// Round // - -/obj/item/integrated_circuit/arithmetic/round - name = "round circuit" - desc = "Rounds A to the nearest B multiple of A." - extended_desc = "If B is not given a number, it will output the floor of A instead." - icon_state = "round" - inputs = list("A" = IC_PINTYPE_NUMBER, "B" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/arithmetic/round/do_work() - var/result = 0 - var/datum/integrated_io/A = inputs[1] - var/datum/integrated_io/B = inputs[2] - if(isnum_safe(A.data)) - if(isnum_safe(B.data) && B.data != 0) - result = round(A.data, B.data) - else - result = round(A.data) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// Absolute // - -/obj/item/integrated_circuit/arithmetic/absolute - name = "absolute circuit" - desc = "This outputs a non-negative version of the number you put in. This may also be thought of as its distance from zero." - icon_state = "absolute" - inputs = list("A" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/arithmetic/absolute/do_work() - var/result = 0 - for(var/k in 1 to inputs.len) - var/datum/integrated_io/I = inputs[k] - I.pull_data() - if(isnum_safe(I.data)) - result = abs(I.data) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// Averaging // - -/obj/item/integrated_circuit/arithmetic/average - name = "average circuit" - desc = "This circuit is of average quality. It will compute the average of the numbers you give it." - extended_desc = "Note that null pins are ignored, whereas a pin containing 0 is included in the averaging calculation." - icon_state = "average" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/arithmetic/average/do_work() - var/result = 0 - var/inputs_used = 0 - for(var/k in 2 to inputs.len) - var/I = get_pin_data(IC_INPUT, k) - if(isnum_safe(I)) - inputs_used++ - result += I - - if(inputs_used) - result = result / inputs_used - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// Pi, because why the hell not? // -/obj/item/integrated_circuit/arithmetic/pi - name = "pi constant circuit" - desc = "Not recommended for cooking. Outputs '3.14159' when it receives a pulse." - icon_state = "pi" - inputs = list() - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/arithmetic/pi/Initialize() - . = ..() - desc = "Not recommended for cooking. Outputs '[PI]' when it receives a pulse." - -/obj/item/integrated_circuit/arithmetic/pi/do_work() - set_pin_data(IC_OUTPUT, 1, PI) - push_data() - activate_pin(2) - -// Random // -/obj/item/integrated_circuit/arithmetic/random - name = "random number generator circuit" - desc = "This gives a random (integer) number between values A and B inclusive." - extended_desc = "'Inclusive' means that the upper bound is included in the range of numbers, e.g. L = 1 and H = 3 will allow \ - for outputs of 1, 2, or 3. H being the higher number is not strictly required." - icon_state = "random" - inputs = list("L" = IC_PINTYPE_NUMBER,"H" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/arithmetic/random/do_work() - var/result = 0 - var/L = get_pin_data(IC_INPUT, 1) - var/H = get_pin_data(IC_INPUT, 2) - - if(isnum_safe(L) && isnum_safe(H)) - result = rand(L, H) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// Square Root // - -/obj/item/integrated_circuit/arithmetic/square_root - name = "square root circuit" - desc = "This outputs the square root of the number you input." - icon_state = "square_root" - inputs = list("A" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/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_safe(I)) - result += sqrt(I) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// % Modulo % // - -/obj/item/integrated_circuit/arithmetic/modulo - name = "modulo circuit" - desc = "Gets the remainder of A / B." - icon_state = "modulo" - inputs = list("A" = IC_PINTYPE_NUMBER, "B" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/arithmetic/modulo/do_work() - var/result = 0 - var/A = get_pin_data(IC_INPUT, 1) - var/B = get_pin_data(IC_INPUT, 2) - if(isnum_safe(A) && isnum_safe(B) && B != 0) - result = A % B - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// -Max- // -/obj/item/integrated_circuit/arithmetic/max - name = "max circuit" - desc = "This circuit sends out the highest number." - extended_desc = "The highest number is put out. Null is ignored." - icon_state = "addition" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/min_comparision = FALSE - -/obj/item/integrated_circuit/arithmetic/max/do_work() - var/result - for(var/k in 1 to inputs.len) - var/I = get_pin_data(IC_INPUT, k) - if(!isnum_safe(I)) - continue - if(!isnum_safe(result) || (!min_comparision && I > result) || (min_comparision && I < result)) - result = I - if(!isnum_safe(result)) - result = 0 - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - - -// -Min- // -/obj/item/integrated_circuit/arithmetic/max/min - name = "min circuit" - desc = "This circuit sends out the smallest number." - extended_desc = "The smallest number is put out. Null is ignored. In case no number is found, 0 is given out." - min_comparision = TRUE diff --git a/code/modules/integrated_electronics/subtypes/atmospherics.dm b/code/modules/integrated_electronics/subtypes/atmospherics.dm deleted file mode 100644 index 6b1c5fee77685..0000000000000 --- a/code/modules/integrated_electronics/subtypes/atmospherics.dm +++ /dev/null @@ -1,783 +0,0 @@ -#define SOURCE_TO_TARGET 0 -#define TARGET_TO_SOURCE 1 -#define PUMP_EFFICIENCY 0.6 -#define TANK_FAILURE_PRESSURE (ONE_ATMOSPHERE*25) -#define PUMP_MAX_VOLUME 100 - - -/obj/item/integrated_circuit/atmospherics - category_text = "Atmospherics" - cooldown_per_use = 2 SECONDS - complexity = 10 - size = 7 - outputs = list( - "self reference" = IC_PINTYPE_SELFREF, - "pressure" = IC_PINTYPE_NUMBER - ) - var/datum/gas_mixture/air_contents - var/volume = 2 //Pretty small, I know - -/obj/item/integrated_circuit/atmospherics/Initialize() - air_contents = new(volume) - ..() - -/obj/item/integrated_circuit/atmospherics/return_air() - return air_contents - -//Check if the gas container is adjacent and of the right type -/obj/item/integrated_circuit/atmospherics/proc/check_gassource(atom/gasholder) - if(!gasholder) - return FALSE - if(!gasholder.Adjacent(get_object())) - return FALSE - if(!istype(gasholder, /obj/item/tank) && !istype(gasholder, /obj/machinery/portable_atmospherics) && !istype(gasholder, /obj/item/integrated_circuit/atmospherics)) - return FALSE - return TRUE - -//Needed in circuits where source and target types differ -/obj/item/integrated_circuit/atmospherics/proc/check_gastarget(atom/gasholder) - return check_gassource(gasholder) - - -// - gas pump - // **works** -/obj/item/integrated_circuit/atmospherics/pump - name = "gas pump" - desc = "Somehow moves gases between two tanks, canisters, and other gas containers." - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - inputs = list( - "source" = IC_PINTYPE_REF, - "target" = IC_PINTYPE_REF, - "target pressure" = IC_PINTYPE_NUMBER - ) - activators = list( - "transfer" = IC_PINTYPE_PULSE_IN, - "on transfer" = IC_PINTYPE_PULSE_OUT - ) - var/direction = SOURCE_TO_TARGET - var/target_pressure = PUMP_MAX_PRESSURE - power_draw_per_use = 20 - -/obj/item/integrated_circuit/atmospherics/pump/Initialize() - air_contents = new(volume) - extended_desc += " Use negative pressure to move air from target to source. \ - Note that only part of the gas is moved on each transfer, \ - so multiple activations will be necessary to achieve target pressure. \ - The pressure limit for circuit pumps is [round(PUMP_MAX_PRESSURE)] kPa." - . = ..() - -// This proc gets the direction of the gas flow depending on its value, by calling update target -/obj/item/integrated_circuit/atmospherics/pump/on_data_written() - var/amt = get_pin_data(IC_INPUT, 3) - update_target(amt) - -/obj/item/integrated_circuit/atmospherics/pump/proc/update_target(new_amount) - if(!isnum_safe(new_amount)) - new_amount = 0 - // See in which direction the gas moves - if(new_amount < 0) - direction = TARGET_TO_SOURCE - else - direction = SOURCE_TO_TARGET - target_pressure = min(round(PUMP_MAX_PRESSURE),abs(new_amount)) - -/obj/item/integrated_circuit/atmospherics/pump/do_work() - var/obj/source = get_pin_data_as_type(IC_INPUT, 1, /obj) - var/obj/target = get_pin_data_as_type(IC_INPUT, 2, /obj) - perform_magic(source, target) - activate_pin(2) - -/obj/item/integrated_circuit/atmospherics/pump/proc/perform_magic(atom/source, atom/target) - //Check if both atoms are of the right type: atmos circuits/gas tanks/canisters. If one is the same, use the circuit var - if(!check_gassource(source)) - source = src - - if(!check_gastarget(target)) - target = src - - // If both are the same, this whole proc would do nothing and just waste performance - if(source == target) - return - - var/datum/gas_mixture/source_air = source.return_air() - var/datum/gas_mixture/target_air = target.return_air() - - if(!source_air || !target_air) - return - - // Swapping both source and target - if(direction == TARGET_TO_SOURCE) - var/temp = source_air - source_air = target_air - target_air = temp - - // If what you are pumping is empty, use the circuit's storage - if(source_air.total_moles() <= 0) - source_air = air_contents - - // Move gas from one place to another - move_gas(source_air, target_air, (istype(target, /obj/item/tank) ? target : null)) - air_update_turf() - -/obj/item/integrated_circuit/atmospherics/pump/proc/move_gas(datum/gas_mixture/source_air, datum/gas_mixture/target_air, obj/item/tank/snowflake) - - // No moles = nothing to pump - if(source_air.total_moles() <= 0 || target_air.return_pressure() >= PUMP_MAX_PRESSURE) - return - - // Negative Kelvin temperatures should never happen and if they do, normalize them - if(source_air.return_temperature() < TCMB) - source_air.set_temperature(TCMB) - - var/pressure_delta = target_pressure - target_air.return_pressure() - if(pressure_delta > 0.1) - var/transfer_moles = (pressure_delta*target_air.return_volume()/(source_air.return_temperature() * R_IDEAL_GAS_EQUATION))*PUMP_EFFICIENCY - var/datum/gas_mixture/removed = source_air.remove(transfer_moles) - if(istype(snowflake)) //Snowflake check for tanks specifically, because tank ruptures are handled in a very snowflakey way that expects all tank interactions to be handled via the tank's procs - snowflake.assume_air(removed) - else - target_air.merge(removed) - - -// - volume pump - // **Works** -/obj/item/integrated_circuit/atmospherics/pump/volume - name = "volume pump" - desc = "Moves gases between two tanks, canisters, and other gas containers by using their volume, up to 200 L/s." - extended_desc = " Use negative volume to move air from target to source. Note that only part of the gas is moved on each transfer. Its maximum pumping volume is capped at 1000kPa." - - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - inputs = list( - "source" = IC_PINTYPE_REF, - "target" = IC_PINTYPE_REF, - "transfer volume" = IC_PINTYPE_NUMBER - ) - activators = list( - "transfer" = IC_PINTYPE_PULSE_IN, - "on transfer" = IC_PINTYPE_PULSE_OUT - ) - direction = SOURCE_TO_TARGET - var/transfer_rate = PUMP_MAX_VOLUME - power_draw_per_use = 20 - -/obj/item/integrated_circuit/atmospherics/pump/volume/update_target(new_amount) - if(!isnum_safe(new_amount)) - new_amount = 0 - // See in which direction the gas moves - if(new_amount < 0) - direction = TARGET_TO_SOURCE - else - direction = SOURCE_TO_TARGET - target_pressure = min(PUMP_MAX_VOLUME,abs(new_amount)) - -/obj/item/integrated_circuit/atmospherics/pump/volume/move_gas(datum/gas_mixture/source_air, datum/gas_mixture/target_air, obj/item/tank/snowflake) - // No moles = nothing to pump - if(source_air.total_moles() <= 0) - return - - // Negative Kelvin temperatures should never happen and if they do, normalize them - if(source_air.return_temperature() < TCMB) - source_air.set_temperature(TCMB) - - if((source_air.return_pressure() < 0.01) || (target_air.return_pressure() >= PUMP_MAX_PRESSURE)) - return - - //The second part of the min caps the pressure built by the volume pumps to the max pump pressure - var/transfer_ratio = min(transfer_rate,target_air.return_volume()*PUMP_MAX_PRESSURE/source_air.return_pressure())/source_air.return_volume() - - var/datum/gas_mixture/removed = source_air.remove_ratio(transfer_ratio * PUMP_EFFICIENCY) - - if(istype(snowflake)) - snowflake.assume_air(removed) - else - target_air.merge(removed) - -// - gas vent - // **works** -/obj/item/integrated_circuit/atmospherics/pump/vent - name = "gas vent" - extended_desc = "Use negative volume to move air from target to environment. Note that only part of the gas is moved on each transfer. Unlike the gas pump, this one keeps pumping even further to pressures of 9000 pKa and it is not advised to use it on tank circuits." - desc = "Moves gases between the environment and adjacent gas containers." - inputs = list( - "container" = IC_PINTYPE_REF, - "target pressure" = IC_PINTYPE_NUMBER - ) - -/obj/item/integrated_circuit/atmospherics/pump/vent/on_data_written() - var/amt = get_pin_data(IC_INPUT, 2) - update_target(amt) - -/obj/item/integrated_circuit/atmospherics/pump/vent/do_work() - var/turf/source = get_turf(src) - var/obj/target = get_pin_data_as_type(IC_INPUT, 1, /obj) - perform_magic(source, target) - activate_pin(2) - -/obj/item/integrated_circuit/atmospherics/pump/vent/check_gastarget(atom/gasholder) - if(!gasholder) - return FALSE - if(!gasholder.Adjacent(get_object())) - return FALSE - if(!istype(gasholder, /obj/item/tank) && !istype(gasholder, /obj/machinery/portable_atmospherics) && !istype(gasholder, /obj/item/integrated_circuit/atmospherics)) - return FALSE - return TRUE - - -/obj/item/integrated_circuit/atmospherics/pump/vent/check_gassource(atom/target) - if(!target) - return FALSE - if(!istype(target, /turf)) - return FALSE - return TRUE - - -// - integrated connector - // Can connect and disconnect properly -/obj/item/integrated_circuit/atmospherics/connector - name = "integrated connector" - desc = "Creates an airtight seal with standard connectors found on the floor, \ - allowing the assembly to exchange gases with a pipe network." - extended_desc = "This circuit will automatically attempt to locate and connect to ports on the floor beneath it when activated. \ - You must set a target before connecting." - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - inputs = list( - "target" = IC_PINTYPE_REF - ) - activators = list( - "toggle connection" = IC_PINTYPE_PULSE_IN, - "on connected" = IC_PINTYPE_PULSE_OUT, - "on connection failed" = IC_PINTYPE_PULSE_OUT, - "on disconnected" = IC_PINTYPE_PULSE_OUT - ) - - var/obj/machinery/atmospherics/components/unary/portables_connector/connector - -/obj/item/integrated_circuit/atmospherics/connector/Initialize() - air_contents = new(volume) - START_PROCESSING(SSobj, src) - . = ..() - -//Sucks up the gas from the connector -/obj/item/integrated_circuit/atmospherics/connector/process() - set_pin_data(IC_OUTPUT, 2, air_contents.return_pressure()) - -/obj/item/integrated_circuit/atmospherics/connector/check_gassource(atom/gasholder) - if(!gasholder) - return FALSE - if(!istype(gasholder,/obj/machinery/atmospherics/components/unary/portables_connector)) - return FALSE - return TRUE - -//If the assembly containing this is moved from the tile the connector pipe is in, the connection breaks -/obj/item/integrated_circuit/atmospherics/connector/ext_moved() - if(connector) - if(get_dist(get_object(), connector) > 0) - // The assembly is set as connected device and the connector handles the rest - connector.connected_device = null - connector = null - activate_pin(4) - -/obj/item/integrated_circuit/atmospherics/connector/do_work() - // If there is a connection, disconnect - if(connector) - connector.connected_device = null - connector = null - activate_pin(4) - return - - var/obj/machinery/atmospherics/components/unary/portables_connector/PC = locate() in get_turf(src) - // If no connector can't connect - if(!PC) - activate_pin(3) - return - connector = PC - connector.connected_device = src - activate_pin(2) - -// Required for making the connector port script work -obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir() - return air_contents - - -// - gas filter - // **works** -/obj/item/integrated_circuit/atmospherics/pump/filter - name = "gas filter" - desc = "Filters one gas out of a mixture." - complexity = 20 - size = 8 - spawn_flags = IC_SPAWN_RESEARCH - inputs = list( - "source" = IC_PINTYPE_REF, - "filtered output" = IC_PINTYPE_REF, - "contaminants output" = IC_PINTYPE_REF, - "wanted gases" = IC_PINTYPE_LIST, - "target pressure" = IC_PINTYPE_NUMBER - ) - power_draw_per_use = 30 - -/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) - -/obj/item/integrated_circuit/atmospherics/pump/filter/do_work() - activate_pin(2) - var/obj/source = get_pin_data_as_type(IC_INPUT, 1, /obj) - var/obj/filtered = get_pin_data_as_type(IC_INPUT, 2, /obj) - var/obj/contaminants = get_pin_data_as_type(IC_INPUT, 3, /obj) - - var/wanted = get_pin_data(IC_INPUT, 4) - - // If there is no filtered output, this whole thing makes no sense - if(!check_gassource(filtered)) - return - - var/datum/gas_mixture/filtered_air = filtered.return_air() - if(!filtered_air) - return - - // If no source is set, the source is possibly this circuit's content - if(!check_gassource(source)) - source = src - var/datum/gas_mixture/source_air = source.return_air() - - //No source air: source is this circuit - if(!source_air) - source_air = air_contents - - // If no filtering tank is set, filter through itself - if(!check_gassource(contaminants)) - contaminants = src - var/datum/gas_mixture/contaminated_air = contaminants.return_air() - - //If there is no gas mixture datum for unfiltered, pump the contaminants back into the circuit - if(!contaminated_air) - contaminated_air = air_contents - - if(contaminated_air.return_pressure() >= PUMP_MAX_PRESSURE || filtered_air.return_pressure() >= PUMP_MAX_PRESSURE) - return - - var/pressure_delta = target_pressure - contaminated_air.return_pressure() - var/transfer_moles - - //Negative Kelvins are an anomaly and should be normalized if encountered - if(source_air.return_temperature() < TCMB) - source_air.set_temperature(TCMB) - - transfer_moles = (pressure_delta*contaminated_air.return_volume()/(source_air.return_temperature() * R_IDEAL_GAS_EQUATION))*PUMP_EFFICIENCY - - //If there is nothing to transfer, just return - if(transfer_moles <= 0) - return - - //This is the var that holds the currently filtered part of the gas - var/datum/gas_mixture/removed = source_air.remove(transfer_moles) - if(!removed) - return - - //This is the gas that will be moved from source to filtered - var/datum/gas_mixture/filtered_out = new - - for(var/filtered_gas in removed.get_gases()) - //Get the name of the gas and see if it is in the list - if(GLOB.meta_gas_info[filtered_gas][META_GAS_NAME] in wanted) - //The gas that is put in all the filtered out gases - filtered_out.set_temperature(removed.return_temperature()) - filtered_out.set_moles(filtered_gas, removed.get_moles(filtered_gas)) - - //The filtered out gas is entirely removed from the currently filtered gases - removed.set_moles(filtered_gas, 0) - - //Check if the pressure is high enough to put stuff in filtered, or else just put it back in the source - if(filtered_air.return_pressure() < target_pressure) - if(istype(filtered, /obj/item/tank)) - filtered.assume_air(filtered_out) - else - filtered_air.merge(filtered_out) - else - if(istype(source, /obj/item/tank)) - source.assume_air(filtered_out) - else - source_air.merge(filtered_out) - if(istype(contaminants, /obj/item/tank)) - contaminants.assume_air(removed) - else - contaminated_air.merge(removed) - - -/obj/item/integrated_circuit/atmospherics/pump/filter/Initialize() - air_contents = new(volume) - . = ..() - extended_desc = "Remember to properly spell and capitalize the filtered gas name. \ - Note that only part of the gas is moved on each transfer, \ - so multiple activations will be necessary to achieve target pressure. \ - The pressure limit for circuit pumps is [round(PUMP_MAX_PRESSURE)] kPa." - - -// - gas mixer - // **works** -/obj/item/integrated_circuit/atmospherics/pump/mixer - name = "gas mixer" - desc = "Mixes 2 different types of gases." - complexity = 20 - size = 8 - spawn_flags = IC_SPAWN_RESEARCH - inputs = list( - "first source" = IC_PINTYPE_REF, - "second source" = IC_PINTYPE_REF, - "output" = IC_PINTYPE_REF, - "first source percentage" = IC_PINTYPE_NUMBER, - "target pressure" = IC_PINTYPE_NUMBER - ) - power_draw_per_use = 30 - -/obj/item/integrated_circuit/atmospherics/pump/mixer/do_work() - activate_pin(2) - var/obj/source_1 = get_pin_data(IC_INPUT, 1) - var/obj/source_2 = get_pin_data(IC_INPUT, 2) - var/obj/gas_output = get_pin_data(IC_INPUT, 3) - if(!check_gassource(source_1)) - source_1 = src - - if(!check_gassource(source_2)) - source_2 = src - - if(!check_gassource(gas_output)) - gas_output = src - - if(source_1 == gas_output || source_2 == gas_output) - return - - var/datum/gas_mixture/source_1_gases = source_1.return_air() - var/datum/gas_mixture/source_2_gases = source_2.return_air() - var/datum/gas_mixture/output_gases = gas_output.return_air() - - if(!source_1_gases || !source_2_gases || !output_gases) - return - - if(output_gases.return_pressure() >= PUMP_MAX_PRESSURE) - return - - if(source_1_gases.return_pressure() <= 0 || source_2_gases.return_pressure() <= 0) - return - - //This calculates how much should be sent - var/gas_percentage = round(max(min(get_pin_data(IC_INPUT, 4),100),0) / 100) - - //Basically: number of moles = percentage of pressure filled up * efficiency coefficient * (pressure from both gases * volume of output) / (R * Temperature) - var/transfer_moles = (get_pin_data(IC_INPUT, 5) / max(1,output_gases.return_pressure())) * PUMP_EFFICIENCY * (source_1_gases.return_pressure() * gas_percentage + source_2_gases.return_pressure() * (1 - gas_percentage)) * output_gases.return_volume()/ (R_IDEAL_GAS_EQUATION * max(output_gases.return_temperature(),TCMB)) - - - if(transfer_moles <= 0) - return - - var/snowflakecheck = istype(gas_output, /obj/item/tank) - - var/datum/gas_mixture/mix = source_1_gases.remove(transfer_moles * gas_percentage) - if(snowflakecheck) - gas_output.assume_air(mix) - else - output_gases.merge(mix) - mix = source_2_gases.remove(transfer_moles * (1-gas_percentage)) - if(snowflakecheck) - gas_output.assume_air(mix) - else - output_gases.merge(mix) - - -// - integrated tank - // **works** -/obj/item/integrated_circuit/atmospherics/tank - name = "integrated tank" - desc = "A small tank for the storage of gases." - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - size = 4 - activators = list( - "push ref" = IC_PINTYPE_PULSE_IN - ) - volume = 3 //emergency tank sized - var/broken = FALSE - -/obj/item/integrated_circuit/atmospherics/tank/Initialize() - air_contents = new(volume) - START_PROCESSING(SSobj, src) - extended_desc = "Take care not to pressurize it above [round(TANK_FAILURE_PRESSURE)] kPa, or else it will break." - . = ..() - -/obj/item/integrated_circuit/atmospherics/tank/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/item/integrated_circuit/atmospherics/tank/do_work() - set_pin_data(IC_OUTPUT, 1, WEAKREF(src)) - push_data() - -/obj/item/integrated_circuit/atmospherics/tank/process() - var/tank_pressure = air_contents.return_pressure() - set_pin_data(IC_OUTPUT, 2, tank_pressure) - push_data() - - //Check if tank broken - if(!broken && tank_pressure > TANK_FAILURE_PRESSURE) - broken = TRUE - to_chat(view(2),"The [name] ruptures, releasing its gases!") - if(broken) - release() - -/obj/item/integrated_circuit/atmospherics/tank/proc/release() - if(air_contents.total_moles() > 0) - playsound(loc, 'sound/effects/spray.ogg', 10, 1, -3) - var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.total_moles()) - var/turf/current_turf = get_turf(src) - var/datum/gas_mixture/exterior_gas - if(!current_turf) - return - - exterior_gas = current_turf.return_air() - exterior_gas.merge(expelled_gas) - - -// - large integrated tank - // **works** -/obj/item/integrated_circuit/atmospherics/tank/large - name = "large integrated tank" - desc = "A less small tank for the storage of gases." - volume = 9 - size = 12 - spawn_flags = IC_SPAWN_RESEARCH - - -// - freezer tank - // **works** -/obj/item/integrated_circuit/atmospherics/tank/freezer - name = "freezer tank" - desc = "Cools the gas it contains to a preset temperature." - volume = 6 - size = 8 - inputs = list( - "target temperature" = IC_PINTYPE_NUMBER, - "on" = IC_PINTYPE_BOOLEAN - ) - inputs_default = list("1" = 300) - spawn_flags = IC_SPAWN_RESEARCH - var/temperature = 293.15 - var/heater_coefficient = 0.1 - -/obj/item/integrated_circuit/atmospherics/tank/freezer/on_data_written() - temperature = max(73.15,min(293.15,get_pin_data(IC_INPUT, 1))) - if(get_pin_data(IC_INPUT, 2)) - power_draw_idle = 30 - else - power_draw_idle = 0 - -/obj/item/integrated_circuit/atmospherics/tank/freezer/process() - var/tank_pressure = air_contents.return_pressure() - set_pin_data(IC_OUTPUT, 2, tank_pressure) - push_data() - - //Cool the tank if the power is on and the temp is above - if(!power_draw_idle || air_contents.return_temperature() < temperature) - return - - air_contents.set_temperature(max(73.15,air_contents.return_temperature() - (air_contents.return_temperature() - temperature) * heater_coefficient)) - - -// - heater tank - // **works** -/obj/item/integrated_circuit/atmospherics/tank/freezer/heater - name = "heater tank" - desc = "Heats the gas it contains to a preset temperature." - volume = 6 - inputs = list( - "target temperature" = IC_PINTYPE_NUMBER, - "on" = IC_PINTYPE_BOOLEAN - ) - spawn_flags = IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/atmospherics/tank/freezer/heater/on_data_written() - temperature = max(293.15,min(573.15,get_pin_data(IC_INPUT, 1))) - if(get_pin_data(IC_INPUT, 2)) - power_draw_idle = 30 - else - power_draw_idle = 0 - -/obj/item/integrated_circuit/atmospherics/tank/freezer/heater/process() - var/tank_pressure = air_contents.return_pressure() - set_pin_data(IC_OUTPUT, 2, tank_pressure) - push_data() - - //Heat the tank if the power is on or its temperature is below what is set - if(!power_draw_idle || air_contents.return_temperature() > temperature) - return - - air_contents.set_temperature(min(573.15,air_contents.return_temperature() + (temperature - air_contents.return_temperature()) * heater_coefficient)) - - -// - atmospheric cooler - // **works** -/obj/item/integrated_circuit/atmospherics/cooler - name = "atmospheric cooler circuit" - desc = "Cools the air around it." - volume = 6 - size = 13 - spawn_flags = IC_SPAWN_RESEARCH - inputs = list( - "target temperature" = IC_PINTYPE_NUMBER, - "on" = IC_PINTYPE_BOOLEAN - ) - var/temperature = 293.15 - var/heater_coefficient = 0.1 - -/obj/item/integrated_circuit/atmospherics/cooler/Initialize() - air_contents = new(volume) - START_PROCESSING(SSobj, src) - . = ..() - -/obj/item/integrated_circuit/atmospherics/cooler/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/item/integrated_circuit/atmospherics/cooler/on_data_written() - temperature = max(243.15,min(293.15,get_pin_data(IC_INPUT, 1))) - if(get_pin_data(IC_INPUT, 2)) - power_draw_idle = 30 - else - power_draw_idle = 0 - -/obj/item/integrated_circuit/atmospherics/cooler/process() - set_pin_data(IC_OUTPUT, 2, air_contents.return_pressure()) - push_data() - - - //Get the turf you're on and its gas mixture - var/turf/current_turf = get_turf(src) - if(!current_turf) - return - - var/datum/gas_mixture/turf_air = current_turf.return_air() - if(!power_draw_idle || turf_air.return_temperature() < temperature) - return - - //Cool the gas - turf_air.set_temperature(max(243.15,turf_air.return_temperature() - (turf_air.return_temperature() - temperature) * heater_coefficient)) - - -// - atmospheric heater - // **works** -/obj/item/integrated_circuit/atmospherics/cooler/heater - name = "atmospheric heater circuit" - desc = "Heats the air around it." - -/obj/item/integrated_circuit/atmospherics/cooler/heater/on_data_written() - temperature = max(293.15,min(323.15,get_pin_data(IC_INPUT, 1))) - if(get_pin_data(IC_INPUT, 2)) - power_draw_idle = 30 - else - power_draw_idle = 0 - -/obj/item/integrated_circuit/atmospherics/cooler/heater/process() - set_pin_data(IC_OUTPUT, 2, air_contents.return_pressure()) - push_data() - - //Get the turf and its air mixture - var/turf/current_turf = get_turf(src) - if(!current_turf) - return - - var/datum/gas_mixture/turf_air = current_turf.return_air() - if(!power_draw_idle || turf_air.return_temperature() > temperature) - return - - //Heat the gas - turf_air.set_temperature(min(323.15,turf_air.return_temperature() + (temperature - turf_air.return_temperature()) * heater_coefficient)) - - -// - tank slot - // **works** -/obj/item/integrated_circuit/input/tank_slot - category_text = "Atmospherics" - cooldown_per_use = 1 - name = "tank slot" - desc = "Lets you add a tank to your assembly and remove it even when the assembly is closed." - extended_desc = "It can help you extract gases easier." - complexity = 25 - size = 30 - inputs = list() - outputs = list( - "pressure used" = IC_PINTYPE_NUMBER, - "current tank" = IC_PINTYPE_REF - ) - activators = list( - "push ref" = IC_PINTYPE_PULSE_IN, - "on insert" = IC_PINTYPE_PULSE_OUT, - "on remove" = IC_PINTYPE_PULSE_OUT - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - - can_be_asked_input = TRUE - demands_object_input = TRUE - can_input_object_when_closed = TRUE - - var/obj/item/tank/internals/current_tank - -/obj/item/integrated_circuit/input/tank_slot/Initialize() - START_PROCESSING(SSobj, src) - . = ..() - -/obj/item/integrated_circuit/input/tank_slot/process() - push_pressure() - -/obj/item/integrated_circuit/input/tank_slot/attackby(var/obj/item/tank/internals/I, var/mob/living/user) - //Check if it truly is a tank - if(!istype(I,/obj/item/tank/internals)) - to_chat(user,"The [I.name] doesn't seem to fit in here.") - return - - //Check if there is no other tank already inside - if(current_tank) - to_chat(user,"There is already a gas tank inside.") - return - - //The current tank is the one we just attached, its location is inside the circuit - current_tank = I - user.transferItemToLoc(I,src) - to_chat(user,"You put the [I.name] inside the tank slot.") - - //Set the pin to a weak reference of the current tank - push_pressure() - set_pin_data(IC_OUTPUT, 2, WEAKREF(current_tank)) - push_data() - do_work(1) - - -/obj/item/integrated_circuit/input/tank_slot/ask_for_input(mob/user) - attack_self(user) - -/obj/item/integrated_circuit/input/tank_slot/attack_self(mob/user) - //Check if no tank attached - if(!current_tank) - to_chat(user, "There is currently no tank attached.") - return - - //Remove tank and put in user's hands/location - to_chat(user, "You take [current_tank] out of the tank slot.") - user.put_in_hands(current_tank) - current_tank = null - - //Remove tank reference - push_pressure() - set_pin_data(IC_OUTPUT, 2, null) - push_data() - do_work(2) - -/obj/item/integrated_circuit/input/tank_slot/do_work() - set_pin_data(IC_OUTPUT, 2, WEAKREF(current_tank)) - push_data() - -/obj/item/integrated_circuit/input/tank_slot/proc/push_pressure() - if(!current_tank) - set_pin_data(IC_OUTPUT, 1, 0) - return - - var/datum/gas_mixture/tank_air = current_tank.return_air() - if(!tank_air) - set_pin_data(IC_OUTPUT, 1, 0) - return - - set_pin_data(IC_OUTPUT, 1, tank_air.return_pressure()) - push_data() - - -#undef SOURCE_TO_TARGET -#undef TARGET_TO_SOURCE -#undef PUMP_EFFICIENCY -#undef TANK_FAILURE_PRESSURE -#undef PUMP_MAX_PRESSURE -#undef PUMP_MAX_VOLUME diff --git a/code/modules/integrated_electronics/subtypes/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm deleted file mode 100644 index ad2599f8cf4a5..0000000000000 --- a/code/modules/integrated_electronics/subtypes/converters.dm +++ /dev/null @@ -1,425 +0,0 @@ -//These circuits convert one variable to another. -/obj/item/integrated_circuit/converter - complexity = 2 - inputs = list("input") - outputs = list("output") - activators = list("convert" = IC_PINTYPE_PULSE_IN, "on convert" = IC_PINTYPE_PULSE_OUT) - category_text = "Converter" - power_draw_per_use = 10 - -/obj/item/integrated_circuit/converter/num2text - name = "number to string" - desc = "This circuit can convert a number variable into a string." - extended_desc = "Because of circuit limitations, null/false variables will output a '0' string." - icon_state = "num-string" - inputs = list("input" = IC_PINTYPE_NUMBER) - outputs = list("output" = IC_PINTYPE_STRING) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/converter/num2text/do_work() - var/result = null - pull_data() - var/incoming = get_pin_data(IC_INPUT, 1) - if(!isnull(incoming)) - result = num2text(incoming) - else if(!incoming) - result = "0" - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/converter/text2num - name = "string to number" - desc = "This circuit can convert a string variable into a number." - icon_state = "string-num" - inputs = list("input" = IC_PINTYPE_STRING) - outputs = list("output" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/converter/text2num/do_work() - var/result = null - pull_data() - var/incoming = get_pin_data(IC_INPUT, 1) - if(!isnull(incoming)) - result = text2num(incoming) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/converter/ref2text - name = "reference to string" - desc = "This circuit can convert a reference to something else to a string, specifically the name of that reference." - icon_state = "ref-string" - inputs = list("input" = IC_PINTYPE_REF) - outputs = list("output" = IC_PINTYPE_STRING) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/converter/ref2text/do_work() - var/result = null - pull_data() - var/atom/A = get_pin_data(IC_INPUT, 1) - if(A && istype(A)) - result = A.name - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/converter/refcode - name = "reference encoder" - desc = "This circuit can encode a reference into a string, which can then be read by a reference decoder circuit." - icon_state = "ref-string" - inputs = list("input" = IC_PINTYPE_REF) - outputs = list("output" = IC_PINTYPE_STRING) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/converter/refcode/do_work() - var/result = null - pull_data() - var/atom/A = get_pin_data(IC_INPUT, 1) - if(A && istype(A)) - result = strtohex(XorEncrypt(REF(A), SScircuit.cipherkey)) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/converter/refdecode - name = "reference decoder" - desc = "This circuit can convert an encoded reference to an actual reference." - icon_state = "ref-string" - inputs = list("input" = IC_PINTYPE_STRING) - outputs = list("output" = IC_PINTYPE_REF) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/dec - -/obj/item/integrated_circuit/converter/refdecode/do_work() - pull_data() - dec = XorEncrypt(hextostr(get_pin_data(IC_INPUT, 1), TRUE), SScircuit.cipherkey) - set_pin_data(IC_OUTPUT, 1, WEAKREF(locate(dec))) - push_data() - activate_pin(2) - - -/obj/item/integrated_circuit/converter/radians2degrees - name = "radians to degrees converter" - desc = "Converts radians to degrees." - inputs = list("radian" = IC_PINTYPE_NUMBER) - outputs = list("degrees" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/converter/radians2degrees/do_work() - var/result = null - pull_data() - var/incoming = get_pin_data(IC_INPUT, 1) - if(!isnull(incoming)) - result = TODEGREES(incoming) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/converter/degrees2radians - name = "degrees to radians converter" - desc = "Converts degrees to radians." - inputs = list("degrees" = IC_PINTYPE_NUMBER) - outputs = list("radians" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/converter/degrees2radians/do_work() - var/result = null - pull_data() - var/incoming = get_pin_data(IC_INPUT, 1) - if(!isnull(incoming)) - result = TORADIANS(incoming) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - - -/obj/item/integrated_circuit/converter/abs_to_rel_coords - name = "abs to rel coordinate converter" - desc = "Easily convert absolute coordinates to relative coordinates with this." - extended_desc = "Keep in mind that both sets of input coordinates should be absolute." - complexity = 1 - inputs = list( - "X1" = IC_PINTYPE_NUMBER, - "Y1" = IC_PINTYPE_NUMBER, - "X2" = IC_PINTYPE_NUMBER, - "Y2" = IC_PINTYPE_NUMBER - ) - outputs = list( - "X" = IC_PINTYPE_NUMBER, - "Y" = IC_PINTYPE_NUMBER - ) - activators = list("compute rel 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() - var/x1 = get_pin_data(IC_INPUT, 1) - var/y1 = get_pin_data(IC_INPUT, 2) - - var/x2 = get_pin_data(IC_INPUT, 3) - var/y2 = get_pin_data(IC_INPUT, 4) - - if(!isnull(x1) && !isnull(y1) && !isnull(x2) && !isnull(y2)) - set_pin_data(IC_OUTPUT, 1, x1 - x2) - set_pin_data(IC_OUTPUT, 2, y1 - y2) - - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/converter/rel_to_abs_coords - name = "rel to abs coordinate converter" - desc = "Convert relative coordinates to absolute coordinates with this." - extended_desc = "Keep in mind that only one set of input coordinates should be absolute, and the other relative. \ - The output coordinates will be the absolute form of the input relative coordinates." - complexity = 1 - inputs = list( - "X1" = IC_PINTYPE_NUMBER, - "Y1" = IC_PINTYPE_NUMBER, - "X2" = IC_PINTYPE_NUMBER, - "Y2" = IC_PINTYPE_NUMBER - ) - outputs = list( - "X" = IC_PINTYPE_NUMBER, - "Y" = IC_PINTYPE_NUMBER - ) - 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/rel_to_abs_coords/do_work() - var/x1 = get_pin_data(IC_INPUT, 1) - var/y1 = get_pin_data(IC_INPUT, 2) - - var/x2 = get_pin_data(IC_INPUT, 3) - var/y2 = get_pin_data(IC_INPUT, 4) - - if(!isnull(x1) && !isnull(y1) && !isnull(x2) && !isnull(y2)) - set_pin_data(IC_OUTPUT, 1, x1 + x2) - set_pin_data(IC_OUTPUT, 2, y1 + y2) - - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/converter/adv_rel_to_abs_coords - name = "advanced rel to abs coordinate converter" - desc = "Easily convert relative coordinates to absolute coordinates with this." - extended_desc = "This circuit only requires a single set of relative inputs to output absolute coordinates." - complexity = 2 - inputs = list( - "X" = IC_PINTYPE_NUMBER, - "Y" = IC_PINTYPE_NUMBER, - ) - outputs = list( - "X" = IC_PINTYPE_NUMBER, - "Y" = IC_PINTYPE_NUMBER - ) - 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/adv_rel_to_abs_coords/do_work() - var/turf/T = get_turf(src) - - if(!T) - return - - var/x1 = get_pin_data(IC_INPUT, 1) - var/y1 = get_pin_data(IC_INPUT, 2) - - if(!isnull(x1) && !isnull(y1)) - set_pin_data(IC_OUTPUT, 1, T.x + x1) - set_pin_data(IC_OUTPUT, 2, T.y + y1) - - push_data() - activate_pin(2) - - -/obj/item/integrated_circuit/converter/hsv2hex - name = "hsv to hexadecimal" - desc = "This circuit can convert a HSV (Hue, Saturation, and Value) color to a Hexadecimal RGB color." - extended_desc = "The first pin controls tint (0-359), the second pin controls how intense the tint is (0-255), and the third controls how bright the tint is (0 for black, 127 for normal, 255 for white)." - icon_state = "hsv-hex" - inputs = list( - "hue" = IC_PINTYPE_NUMBER, - "saturation" = IC_PINTYPE_NUMBER, - "value" = IC_PINTYPE_NUMBER - ) - outputs = list("hexadecimal rgb" = IC_PINTYPE_COLOR) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/converter/hsv2hex/do_work() - var/result = null - pull_data() - var/hue = get_pin_data(IC_INPUT, 1) - var/saturation = get_pin_data(IC_INPUT, 2) - var/value = get_pin_data(IC_INPUT, 3) - if(isnum_safe(hue)&&isnum_safe(saturation)&&isnum_safe(value)) - result = HSVtoRGB(hsv(AngleToHue(hue),saturation,value)) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - - -/obj/item/integrated_circuit/converter/rgb2hex - name = "rgb to hexadecimal" - desc = "This circuit can convert a RGB (Red, Green, Blue) color to a Hexadecimal RGB color." - extended_desc = "The first pin controls red amount, the second pin controls green amount, and the third controls blue amount. They all go from 0-255." - icon_state = "rgb-hex" - inputs = list( - "red" = IC_PINTYPE_NUMBER, - "green" = IC_PINTYPE_NUMBER, - "blue" = IC_PINTYPE_NUMBER - ) - outputs = list("hexadecimal rgb" = IC_PINTYPE_COLOR) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/converter/rgb2hex/do_work() - var/result = null - pull_data() - var/red = get_pin_data(IC_INPUT, 1) - var/green = get_pin_data(IC_INPUT, 2) - var/blue = get_pin_data(IC_INPUT, 3) - if(isnum_safe(red)&&isnum_safe(green)&&isnum_safe(blue)) - result = rgb(red,green,blue) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - - -// - hsv to rgb - // -/obj/item/integrated_circuit/converter/hsv2rgb - name = "hsv to rgb" - desc = "This circuit can convert a HSV (Hue, Saturation, and Value) color to a RGB (red, blue and green) color." - extended_desc = "The first pin controls tint (0-359), the second pin controls how intense the tint is (0-255), and the third controls how bright the tint is (0 for black, 127 for normal, 255 for white)." - icon_state = "hsv-hex" - inputs = list( - "hue" = IC_PINTYPE_NUMBER, - "saturation" = IC_PINTYPE_NUMBER, - "value" = IC_PINTYPE_NUMBER - ) - outputs = list( - "red" = IC_PINTYPE_NUMBER, - "green" = IC_PINTYPE_NUMBER, - "blue" = IC_PINTYPE_NUMBER - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH -/obj/item/integrated_circuit/converter/hsv2rgb/do_work() - var/hue = get_pin_data(IC_INPUT, 1) - var/sat = get_pin_data(IC_INPUT, 2) - var/val = get_pin_data(IC_INPUT, 3) - if(!hue || !sat || !val) - set_pin_data(IC_OUTPUT, 1, 0) - set_pin_data(IC_OUTPUT, 2, 0) - set_pin_data(IC_OUTPUT, 3, 0) - else - var/list/RGB = ReadRGB(HSVtoRGB(hsv(hue,sat,val))) - - set_pin_data(IC_OUTPUT, 1, RGB[1]) - set_pin_data(IC_OUTPUT, 2, RGB[2]) - set_pin_data(IC_OUTPUT, 3, RGB[3]) - push_data() - activate_pin(2) - - -// - rgb to hsv - // -/obj/item/integrated_circuit/converter/rgb2hsv - name = "rgb to hsv" - desc = "This circuit can convert a RGB (Red, Blue, and Green) color to a HSV (Hue, Saturation and Value) color." - extended_desc = "All values for the RGB colors are situated between 0 and 255." - icon_state = "hsv-hex" - inputs = list( - "red" = IC_PINTYPE_NUMBER, - "green" = IC_PINTYPE_NUMBER, - "blue" = IC_PINTYPE_NUMBER - ) - outputs = list( - "hue" = IC_PINTYPE_NUMBER, - "saturation" = IC_PINTYPE_NUMBER, - "value" = IC_PINTYPE_NUMBER - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/converter/rgb2hsv/do_work() - var/red = get_pin_data(IC_INPUT, 1) - var/blue = get_pin_data(IC_INPUT, 2) - var/green = get_pin_data(IC_INPUT, 3) - if(!red || !blue || !green) - set_pin_data(IC_OUTPUT, 1, 0) - set_pin_data(IC_OUTPUT, 2, 0) - set_pin_data(IC_OUTPUT, 3, 0) - else - var/list/HSV = ReadHSV(RGBtoHSV(rgb(red,blue,green))) - - set_pin_data(IC_OUTPUT, 1, HSV[1]) - set_pin_data(IC_OUTPUT, 2, HSV[2]) - set_pin_data(IC_OUTPUT, 3, HSV[3]) - push_data() - activate_pin(2) - - -// - hexadecimal to hsv - // -/obj/item/integrated_circuit/converter/hex2hsv - name = "hexadecimal to hsv" - desc = "This circuit can convert a Hexadecimal RGB color into a HSV (Hue, Saturation and Value) color." - extended_desc = "Hexadecimal colors follow the format #RRBBGG, RR being the red value, BB the blue value and GG the green value. They are written in hexadecimal, giving each color a value from 0 (00) to 255 (FF)." - icon_state = "hsv-hex" - inputs = list("hexadecimal rgb" = IC_PINTYPE_COLOR) - outputs = list( - "hue" = IC_PINTYPE_NUMBER, - "saturation" = IC_PINTYPE_NUMBER, - "value" = IC_PINTYPE_NUMBER - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/converter/hex2hsv/do_work() - pull_data() - var/rgb = get_pin_data(IC_INPUT, 1) - if(!rgb) - set_pin_data(IC_OUTPUT, 1, 0) - set_pin_data(IC_OUTPUT, 2, 0) - set_pin_data(IC_OUTPUT, 3, 0) - return - else - var/list/hsv = ReadHSV(RGBtoHSV(rgb)) - set_pin_data(IC_OUTPUT, 1, hsv[1]) - set_pin_data(IC_OUTPUT, 2, hsv[2]) - set_pin_data(IC_OUTPUT, 3, hsv[3]) - push_data() - activate_pin(2) - - -// - hex 2 rgb - // -/obj/item/integrated_circuit/converter/hex2rgb - name = "hexadecimal to rgb" - desc = "This circuit can convert a Hexadecimal RGB color into a RGB (Red, Blue and Green color." - extended_desc = "Hexadecimal colors follow the format #RRBBGG, RR being the red value, BB the blue value and GG the green value. They are written in hexadecimal, giving each color a value from 0 (00) to 255 (FF)." - icon_state = "hsv-hex" - inputs = list("hexadecimal rgb" = IC_PINTYPE_COLOR) - outputs = list( - "red" = IC_PINTYPE_NUMBER, - "green" = IC_PINTYPE_NUMBER, - "blue" = IC_PINTYPE_NUMBER - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/converter/hex2rgb/do_work() - var/rgb = get_pin_data(IC_INPUT, 1) - if(!rgb) - set_pin_data(IC_OUTPUT, 1, 0) - set_pin_data(IC_OUTPUT, 2, 0) - set_pin_data(IC_OUTPUT, 3, 0) - else - var/list/RGB = ReadRGB(rgb) - - set_pin_data(IC_OUTPUT, 1, RGB[1]) - set_pin_data(IC_OUTPUT, 2, RGB[2]) - set_pin_data(IC_OUTPUT, 3, RGB[3]) - - push_data() - activate_pin(2) diff --git a/code/modules/integrated_electronics/subtypes/data_transfer.dm b/code/modules/integrated_electronics/subtypes/data_transfer.dm deleted file mode 100644 index f723c78b22298..0000000000000 --- a/code/modules/integrated_electronics/subtypes/data_transfer.dm +++ /dev/null @@ -1,208 +0,0 @@ -/obj/item/integrated_circuit/transfer - category_text = "Data Transfer" - power_draw_per_use = 2 - -/obj/item/integrated_circuit/transfer/multiplexer - name = "two multiplexer" - desc = "This is what those in the business tend to refer to as a 'mux', or data selector. It moves data from one of the selected inputs to the output." - extended_desc = "The first input pin is used to select which of the other input pins which has its data moved to the output. \ - If the input selection is outside the valid range then no output is given." - complexity = 2 - icon_state = "mux2" - inputs = list("input selection" = IC_PINTYPE_NUMBER) - outputs = list("output" = IC_PINTYPE_ANY) - activators = list("select" = IC_PINTYPE_PULSE_IN, "on select" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 4 - var/number_of_pins = 2 - -/obj/item/integrated_circuit/transfer/multiplexer/Initialize() - for(var/i = 1 to number_of_pins) - inputs["input [i]"] = IC_PINTYPE_ANY // This is just a string since pins don't get built until ..() is called. - - complexity = number_of_pins - . = ..() - desc += " It has [number_of_pins] input pins." - extended_desc += " This multiplexer has a range from 1 to [inputs.len - 1]." - -/obj/item/integrated_circuit/transfer/multiplexer/do_work() - var/input_index = get_pin_data(IC_INPUT, 1) - - if(!isnull(input_index) && (input_index >= 1 && input_index < inputs.len)) - set_pin_data(IC_OUTPUT, 1,get_pin_data(IC_INPUT, input_index + 1)) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/transfer/multiplexer/medium - name = "four multiplexer" - icon_state = "mux4" - number_of_pins = 4 - -/obj/item/integrated_circuit/transfer/multiplexer/large - name = "eight multiplexer" - w_class = WEIGHT_CLASS_SMALL - icon_state = "mux8" - number_of_pins = 8 - -/obj/item/integrated_circuit/transfer/multiplexer/huge - name = "sixteen multiplexer" - icon_state = "mux16" - w_class = WEIGHT_CLASS_SMALL - number_of_pins = 16 - -/obj/item/integrated_circuit/transfer/demultiplexer - name = "two demultiplexer" - desc = "This is what those in the business tend to refer to as a 'demux'. It moves data from the input to one of the selected outputs." - extended_desc = "The first input pin is used to select which of the output pins is given the data from the second input pin. \ - If the output selection is outside the valid range then no output is given." - complexity = 2 - icon_state = "dmux2" - inputs = list("output selection" = IC_PINTYPE_NUMBER, "input" = IC_PINTYPE_ANY) - outputs = list() - activators = list("select" = IC_PINTYPE_PULSE_IN, "on select" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 4 - var/number_of_pins = 2 - -/obj/item/integrated_circuit/transfer/demultiplexer/Initialize() - for(var/i = 1 to number_of_pins) - outputs["output [i]"] = IC_PINTYPE_ANY - complexity = number_of_pins - - . = ..() - desc += " It has [number_of_pins] output pins." - extended_desc += " This demultiplexer has a range from 1 to [outputs.len]." - -/obj/item/integrated_circuit/transfer/demultiplexer/do_work() - var/output_index = get_pin_data(IC_INPUT, 1) - if(!isnull(output_index) && (output_index >= 1 && output_index <= outputs.len)) - var/datum/integrated_io/O = outputs[output_index] - O.data = get_pin_data(IC_INPUT, 2) - O.push_data() - - activate_pin(2) - -/obj/item/integrated_circuit/transfer/demultiplexer/medium - name = "four demultiplexer" - icon_state = "dmux4" - number_of_pins = 4 - -/obj/item/integrated_circuit/transfer/demultiplexer/large - name = "eight demultiplexer" - icon_state = "dmux8" - w_class = WEIGHT_CLASS_SMALL - number_of_pins = 8 - -/obj/item/integrated_circuit/transfer/demultiplexer/huge - name = "sixteen demultiplexer" - icon_state = "dmux16" - w_class = WEIGHT_CLASS_SMALL - number_of_pins = 16 - -/obj/item/integrated_circuit/transfer/pulsedemultiplexer - name = "two pulse demultiplexer" - desc = "Selector switch to choose the pin to be activated by number." - extended_desc = "The first input pin is used to select which of the pulse out pins will be activated after activation of the circuit. \ - If the output selection is outside the valid range then no output is given." - complexity = 2 - icon_state = "dmux2" - inputs = list("output selection" = IC_PINTYPE_NUMBER) - outputs = list() - activators = list("select" = IC_PINTYPE_PULSE_IN) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 4 - var/number_of_pins = 2 - -/obj/item/integrated_circuit/transfer/pulsedemultiplexer/Initialize() - for(var/i = 1 to number_of_pins) - activators["output [i]"] = IC_PINTYPE_PULSE_OUT - complexity = number_of_pins - - . = ..() - desc += " It has [number_of_pins] output pins." - extended_desc += " This pulse demultiplexer has a range from 1 to [activators.len - 1]." - -/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)) - activate_pin(round(output_index + 1 ,1)) - -/obj/item/integrated_circuit/transfer/pulsedemultiplexer/medium - name = "four pulse demultiplexer" - icon_state = "dmux4" - number_of_pins = 4 - -/obj/item/integrated_circuit/transfer/pulsedemultiplexer/large - name = "eight pulse demultiplexer" - icon_state = "dmux8" - w_class = WEIGHT_CLASS_SMALL - number_of_pins = 8 - -/obj/item/integrated_circuit/transfer/pulsedemultiplexer/huge - name = "sixteen pulse demultiplexer" - icon_state = "dmux16" - w_class = WEIGHT_CLASS_SMALL - number_of_pins = 16 - -/obj/item/integrated_circuit/transfer/pulsemultiplexer - name = "two pulse multiplexer" - desc = "Pulse in pins to choose the pin value to be sent." - extended_desc = "The input pulses are used to select which of the input pins has its data moved to the output." - complexity = 2 - icon_state = "dmux2" - inputs = list() - outputs = list("output" = IC_PINTYPE_ANY) - activators = list("on selected" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 4 - var/number_of_pins = 2 - -/obj/item/integrated_circuit/transfer/pulsemultiplexer/Initialize() - for(var/i = 1 to number_of_pins) - inputs["input [i]"] = IC_PINTYPE_ANY - for(var/i = 1 to number_of_pins) - activators["input [i]"] = IC_PINTYPE_PULSE_IN - complexity = number_of_pins - - . = ..() - desc += " It has [number_of_pins] pulse in pins and [number_of_pins] output pins." - extended_desc += " This pulse multiplexer has a range from 1 to [activators.len - 1]." - -/obj/item/integrated_circuit/transfer/pulsemultiplexer/do_work(ord) - var/input_index = ord - 2 - - if(!isnull(input_index) && (input_index >= 0 && input_index < inputs.len)) - set_pin_data(IC_OUTPUT, 1,get_pin_data(IC_INPUT, input_index + 1)) - push_data() - activate_pin(1) - -/obj/item/integrated_circuit/transfer/pulsemultiplexer/medium - name = "four pulse multiplexer" - icon_state = "dmux4" - number_of_pins = 4 - -/obj/item/integrated_circuit/transfer/pulsemultiplexer/large - name = "eight pulse multiplexer" - icon_state = "dmux8" - w_class = WEIGHT_CLASS_SMALL - number_of_pins = 8 - -/obj/item/integrated_circuit/transfer/pulsemultiplexer/huge - name = "sixteen pulse multiplexer" - icon_state = "dmux16" - w_class = WEIGHT_CLASS_SMALL - number_of_pins = 16 - -/obj/item/integrated_circuit/transfer/wire_node - name = "wire node" - desc = "Just a wire node to make wiring easier. Transfers the pulse from in to out." - icon_state = "wire_node" - activators = list("pulse in" = IC_PINTYPE_PULSE_IN, "pulse out" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 0 - complexity = 0 - size = 0.1 - -/obj/item/integrated_circuit/transfer/wire_node/do_work() - activate_pin(2) diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm deleted file mode 100644 index c3ba39b876a60..0000000000000 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ /dev/null @@ -1,1472 +0,0 @@ -/obj/item/integrated_circuit/input - var/can_be_asked_input = 0 - category_text = "Input" - power_draw_per_use = 5 - -/obj/item/integrated_circuit/input/proc/ask_for_input(mob/user) - return - -/obj/item/integrated_circuit/input/button - name = "button" - desc = "This tiny button must do something, right?" - icon_state = "button" - complexity = 1 - can_be_asked_input = 1 - inputs = list() - outputs = list() - activators = list("on pressed" = IC_PINTYPE_PULSE_IN) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/input/button/ask_for_input(mob/user) //Bit misleading name for this specific use. - to_chat(user, "You press the button labeled '[displayed_name]'.") - activate_pin(1) - -/obj/item/integrated_circuit/input/toggle_button - name = "toggle button" - desc = "It toggles on, off, on, off..." - icon_state = "toggle_button" - complexity = 1 - can_be_asked_input = 1 - inputs = list() - outputs = list("on" = IC_PINTYPE_BOOLEAN) - activators = list("on toggle" = IC_PINTYPE_PULSE_IN) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/input/toggle_button/ask_for_input(mob/user) // Ditto. - set_pin_data(IC_OUTPUT, 1, !get_pin_data(IC_OUTPUT, 1)) - push_data() - activate_pin(1) - to_chat(user, "You toggle the button labeled '[displayed_name]' [get_pin_data(IC_OUTPUT, 1) ? "on" : "off"].") - -/obj/item/integrated_circuit/input/numberpad - name = "number pad" - desc = "This small number pad allows someone to input a number into the system." - icon_state = "numberpad" - complexity = 2 - can_be_asked_input = 1 - inputs = list() - outputs = list("number entered" = IC_PINTYPE_NUMBER) - activators = list("on entered" = IC_PINTYPE_PULSE_IN) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 4 - -/obj/item/integrated_circuit/input/numberpad/ask_for_input(mob/user) - var/new_input = input(user, "Enter a number, please.",displayed_name) as null|num - if(isnum_safe(new_input) && user.IsAdvancedToolUser()) - set_pin_data(IC_OUTPUT, 1, new_input) - push_data() - activate_pin(1) - -/obj/item/integrated_circuit/input/textpad - name = "text pad" - desc = "This small text pad allows someone to input a string into the system." - icon_state = "textpad" - complexity = 2 - can_be_asked_input = 1 - inputs = list() - outputs = list("string entered" = IC_PINTYPE_STRING) - activators = list("on entered" = IC_PINTYPE_PULSE_IN) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 4 - -/obj/item/integrated_circuit/input/textpad/ask_for_input(mob/user) - var/new_input = stripped_multiline_input(user, "Enter some words, please.",displayed_name) - if(istext(new_input) && user.IsAdvancedToolUser()) - set_pin_data(IC_OUTPUT, 1, new_input) - push_data() - activate_pin(1) - -/obj/item/integrated_circuit/input/colorpad - name = "color pad" - desc = "This small color pad allows someone to input a hexadecimal color into the system." - icon_state = "colorpad" - complexity = 2 - can_be_asked_input = 1 - inputs = list() - outputs = list("color entered" = IC_PINTYPE_STRING) - activators = list("on entered" = IC_PINTYPE_PULSE_IN) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 4 - -/obj/item/integrated_circuit/input/colorpad/ask_for_input(mob/user) - var/new_color = input(user, "Enter a color, please.", "Color", "#ffffff") as color|null - if(new_color && user.IsAdvancedToolUser()) - set_pin_data(IC_OUTPUT, 1, new_color) - push_data() - activate_pin(1) - -/obj/item/integrated_circuit/input/med_scanner - name = "integrated medical analyser" - desc = "A very small version of the common medical analyser. This allows the machine to know how healthy someone is." - icon_state = "medscan" - complexity = 4 - inputs = list("target" = IC_PINTYPE_REF) - outputs = list( - "total health %" = IC_PINTYPE_NUMBER, - "total missing health" = IC_PINTYPE_NUMBER - ) - activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 40 - -/obj/item/integrated_circuit/input/med_scanner/do_work() - var/mob/living/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living) - if(!istype(H)) //Invalid input - return - if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range. - var/total_health = round(H.health/H.getMaxHealth(), 0.01)*100 - var/missing_health = H.getMaxHealth() - H.health - - set_pin_data(IC_OUTPUT, 1, total_health) - set_pin_data(IC_OUTPUT, 2, missing_health) - - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/input/adv_med_scanner - name = "integrated adv. medical analyser" - desc = "A very small version of the medbot's medical analyser. This allows the machine to know how healthy someone is. \ - This type is much more precise, allowing the machine to know much more about the target than a normal analyzer." - icon_state = "medscan_adv" - complexity = 12 - inputs = list("target" = IC_PINTYPE_REF) - outputs = list( - "total health %" = IC_PINTYPE_NUMBER, - "total missing health" = IC_PINTYPE_NUMBER, - "brute damage" = IC_PINTYPE_NUMBER, - "burn damage" = IC_PINTYPE_NUMBER, - "tox damage" = IC_PINTYPE_NUMBER, - "oxy damage" = IC_PINTYPE_NUMBER, - "clone damage" = IC_PINTYPE_NUMBER - ) - activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 80 - -/obj/item/integrated_circuit/input/adv_med_scanner/do_work() - var/mob/living/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living) - if(!istype(H)) //Invalid input - return - if(H in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. - var/total_health = round(H.health/H.getMaxHealth(), 0.01)*100 - var/missing_health = H.getMaxHealth() - H.health - - set_pin_data(IC_OUTPUT, 1, total_health) - set_pin_data(IC_OUTPUT, 2, missing_health) - set_pin_data(IC_OUTPUT, 3, H.getBruteLoss()) - set_pin_data(IC_OUTPUT, 4, H.getFireLoss()) - set_pin_data(IC_OUTPUT, 5, H.getToxLoss()) - set_pin_data(IC_OUTPUT, 6, H.getOxyLoss()) - set_pin_data(IC_OUTPUT, 7, H.getCloneLoss()) - - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/input/slime_scanner - name = "slime scanner" - desc = "A very small version of the xenobio analyser. This allows the machine to know every needed properties of slime. Output mutation list is non-associative." - icon_state = "medscan_adv" - complexity = 12 - inputs = list("target" = IC_PINTYPE_REF) - outputs = list( - "colour" = IC_PINTYPE_STRING, - "adult" = IC_PINTYPE_BOOLEAN, - "nutrition" = IC_PINTYPE_NUMBER, - "charge" = IC_PINTYPE_NUMBER, - "health" = IC_PINTYPE_NUMBER, - "possible mutation" = IC_PINTYPE_LIST, - "genetic destability" = IC_PINTYPE_NUMBER, - "slime core amount" = IC_PINTYPE_NUMBER, - "Growth progress" = IC_PINTYPE_NUMBER, - ) - activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 80 - -/obj/item/integrated_circuit/input/slime_scanner/do_work() - var/mob/living/simple_animal/slime/T = get_pin_data_as_type(IC_INPUT, 1, /mob/living/simple_animal/slime) - if(!isslime(T)) //Invalid input - return - if(T in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. - - set_pin_data(IC_OUTPUT, 1, T.colour) - set_pin_data(IC_OUTPUT, 2, T.is_adult) - set_pin_data(IC_OUTPUT, 3, T.nutrition/T.get_max_nutrition()) - set_pin_data(IC_OUTPUT, 4, T.powerlevel) - set_pin_data(IC_OUTPUT, 5, round(T.health/T.maxHealth,0.01)*100) - set_pin_data(IC_OUTPUT, 6, uniqueList(T.slime_mutation)) - set_pin_data(IC_OUTPUT, 7, T.mutation_chance) - set_pin_data(IC_OUTPUT, 8, T.cores) - set_pin_data(IC_OUTPUT, 9, T.amount_grown/SLIME_EVOLUTION_THRESHOLD) - - - push_data() - activate_pin(2) - - - -/obj/item/integrated_circuit/input/plant_scanner - name = "integrated plant analyzer" - desc = "A very small version of the plant analyser. This allows the machine to know all valuable parameters of plants in trays. \ - It can only scan plants, not seeds or fruits." - icon_state = "medscan_adv" - complexity = 12 - inputs = list("target" = IC_PINTYPE_REF) - outputs = list( - "plant type" = IC_PINTYPE_STRING, - "age" = IC_PINTYPE_NUMBER, - "potency" = IC_PINTYPE_NUMBER, - "yield" = IC_PINTYPE_NUMBER, - "Maturation speed" = IC_PINTYPE_NUMBER, - "Production speed" = IC_PINTYPE_NUMBER, - "Endurance" = IC_PINTYPE_NUMBER, - "Lifespan" = IC_PINTYPE_NUMBER, - "Weed Growth Rate" = IC_PINTYPE_NUMBER, - "Weed Vulnerability" = IC_PINTYPE_NUMBER, - "Weed level" = IC_PINTYPE_NUMBER, - "Pest level" = IC_PINTYPE_NUMBER, - "Toxicity level" = IC_PINTYPE_NUMBER, - "Water level" = IC_PINTYPE_NUMBER, - "Nutrition level" = IC_PINTYPE_NUMBER, - "harvest" = IC_PINTYPE_NUMBER, - "dead" = IC_PINTYPE_NUMBER, - "plant health" = IC_PINTYPE_NUMBER, - "self sustaining" = IC_PINTYPE_NUMBER, - "using irrigation" = IC_PINTYPE_NUMBER, - "connected trays" = IC_PINTYPE_LIST - ) - activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 10 - -/obj/item/integrated_circuit/input/plant_scanner/do_work() - var/obj/machinery/hydroponics/H = get_pin_data_as_type(IC_INPUT, 1, /obj/machinery/hydroponics) - if(!istype(H)) //Invalid input - return - for(var/i=1, i<=outputs.len, i++) - set_pin_data(IC_OUTPUT, i, null) - if(H in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. - if(H.myseed) - set_pin_data(IC_OUTPUT, 1, H.myseed.plantname) - set_pin_data(IC_OUTPUT, 2, H.age) - set_pin_data(IC_OUTPUT, 3, H.myseed.potency) - set_pin_data(IC_OUTPUT, 4, H.myseed.yield) - set_pin_data(IC_OUTPUT, 5, H.myseed.maturation) - set_pin_data(IC_OUTPUT, 6, H.myseed.production) - set_pin_data(IC_OUTPUT, 7, H.myseed.endurance) - set_pin_data(IC_OUTPUT, 8, H.myseed.lifespan) - set_pin_data(IC_OUTPUT, 9, H.myseed.weed_rate) - set_pin_data(IC_OUTPUT, 10, H.myseed.weed_chance) - set_pin_data(IC_OUTPUT, 11, H.weedlevel) - set_pin_data(IC_OUTPUT, 12, H.pestlevel) - set_pin_data(IC_OUTPUT, 13, H.toxic) - set_pin_data(IC_OUTPUT, 14, H.waterlevel) - set_pin_data(IC_OUTPUT, 15, H.nutrilevel) - set_pin_data(IC_OUTPUT, 16, H.harvest) - set_pin_data(IC_OUTPUT, 17, H.dead) - set_pin_data(IC_OUTPUT, 18, H.plant_health) - set_pin_data(IC_OUTPUT, 19, H.self_sustaining) - set_pin_data(IC_OUTPUT, 20, H.using_irrigation) - set_pin_data(IC_OUTPUT, 21, H.FindConnected()) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/input/gene_scanner - name = "gene scanner" - desc = "This circuit will scan the target plant for traits and reagent genes. Output is non-associative." - extended_desc = "This allows the machine to scan plants in trays for reagent and trait genes. \ - It can only scan plants, not seeds or fruits." - inputs = list( - "target" = IC_PINTYPE_REF - ) - outputs = list( - "traits" = IC_PINTYPE_LIST, - "reagents" = IC_PINTYPE_LIST - ) - activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT) - icon_state = "medscan_adv" - spawn_flags = IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/input/gene_scanner/do_work() - var/list/gtraits = list() - var/list/greagents = list() - var/obj/machinery/hydroponics/H = get_pin_data_as_type(IC_INPUT, 1, /obj/machinery/hydroponics) - if(!istype(H)) //Invalid input - return - for(var/i=1, i<=outputs.len, i++) - set_pin_data(IC_OUTPUT, i, null) - if(H in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. - if(H.myseed) - for(var/datum/plant_gene/reagent/G in H.myseed.genes) - greagents.Add(G.get_name()) - - for(var/datum/plant_gene/trait/G in H.myseed.genes) - gtraits.Add(G.get_name()) - - set_pin_data(IC_OUTPUT, 1, gtraits) - set_pin_data(IC_OUTPUT, 2, greagents) - push_data() - activate_pin(2) - - -/obj/item/integrated_circuit/input/examiner - name = "examiner" - desc = "It's a little machine vision system. It can return the name, description, distance, \ - relative coordinates, total amount of reagents, maximum amount of reagents, density, and opacity of the referenced object." - icon_state = "video_camera" - complexity = 6 - inputs = list( - "target" = IC_PINTYPE_REF - ) - outputs = list( - "name" = IC_PINTYPE_STRING, - "description" = IC_PINTYPE_STRING, - "X" = IC_PINTYPE_NUMBER, - "Y" = IC_PINTYPE_NUMBER, - "distance" = IC_PINTYPE_NUMBER, - "max reagents" = IC_PINTYPE_NUMBER, - "amount of reagents" = IC_PINTYPE_NUMBER, - "density" = IC_PINTYPE_BOOLEAN, - "opacity" = IC_PINTYPE_BOOLEAN, - "occupied turf" = IC_PINTYPE_REF - ) - activators = list( - "scan" = IC_PINTYPE_PULSE_IN, - "on scanned" = IC_PINTYPE_PULSE_OUT, - "not scanned" = IC_PINTYPE_PULSE_OUT - ) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 80 - -/obj/item/integrated_circuit/input/examiner/do_work() - var/atom/H = get_pin_data_as_type(IC_INPUT, 1, /atom) - var/turf/T = get_turf(src) - - if(!istype(H) || !(H in view(T))) - activate_pin(3) - else - set_pin_data(IC_OUTPUT, 1, H.name) - set_pin_data(IC_OUTPUT, 2, H.desc) - - if(istype(H, /mob/living)) - var/mob/living/M = H - var/msg = M.examine() - if(msg) - set_pin_data(IC_OUTPUT, 2, msg) - - set_pin_data(IC_OUTPUT, 3, H.x-T.x) - set_pin_data(IC_OUTPUT, 4, H.y-T.y) - set_pin_data(IC_OUTPUT, 5, sqrt((H.x-T.x)*(H.x-T.x)+ (H.y-T.y)*(H.y-T.y))) - var/mr = 0 - var/tr = 0 - if(H.reagents) - mr = H.reagents.maximum_volume - tr = H.reagents.total_volume - set_pin_data(IC_OUTPUT, 6, mr) - set_pin_data(IC_OUTPUT, 7, tr) - set_pin_data(IC_OUTPUT, 8, H.CanPass(assembly ? assembly : src, get_turf(H))) - set_pin_data(IC_OUTPUT, 9, H.opacity) - set_pin_data(IC_OUTPUT, 10, get_turf(H)) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/input/turfpoint - name = "Tile pointer" - desc = "This circuit will get a tile ref with the provided absolute coordinates." - extended_desc = "If the machine cannot see the target, it will not be able to calculate the correct direction.\ - This circuit only works while inside an assembly." - icon_state = "numberpad" - complexity = 5 - inputs = list("X" = IC_PINTYPE_NUMBER,"Y" = IC_PINTYPE_NUMBER) - outputs = list("tile" = IC_PINTYPE_REF) - activators = list("calculate dir" = IC_PINTYPE_PULSE_IN, "on calculated" = IC_PINTYPE_PULSE_OUT,"not calculated" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 40 - -/obj/item/integrated_circuit/input/turfpoint/do_work() - if(!assembly) - 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/turf/A = locate(target_x, target_y, T.z) - set_pin_data(IC_OUTPUT, 1, null) - if(!A || !(A in view(T))) - activate_pin(3) - return - else - set_pin_data(IC_OUTPUT, 1, WEAKREF(A)) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/input/turfscan - name = "tile analyzer" - desc = "This circuit can analyze the contents of the scanned turf, and can read letters on the turf." - icon_state = "video_camera" - complexity = 5 - inputs = list( - "target" = IC_PINTYPE_REF - ) - outputs = list( - "located ref" = IC_PINTYPE_LIST, - "Written letters" = IC_PINTYPE_STRING, - "area" = IC_PINTYPE_STRING - ) - activators = list( - "scan" = IC_PINTYPE_PULSE_IN, - "on scanned" = IC_PINTYPE_PULSE_OUT, - "not scanned" = IC_PINTYPE_PULSE_OUT - ) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 40 - cooldown_per_use = 10 - -/obj/item/integrated_circuit/input/turfscan/do_work() - var/turf/scanned_turf = get_pin_data_as_type(IC_INPUT, 1, /turf) - var/turf/circuit_turf = get_turf(src) - var/area_name = get_area_name(scanned_turf) - if(!istype(scanned_turf)) //Invalid input - activate_pin(3) - return - - if(scanned_turf in view(circuit_turf)) // This is a camera. It can't examine things that it can't see. - var/list/turf_contents = new() - for(var/obj/U in scanned_turf) - turf_contents += WEAKREF(U) - for(var/mob/U in scanned_turf) - turf_contents += WEAKREF(U) - set_pin_data(IC_OUTPUT, 1, turf_contents) - set_pin_data(IC_OUTPUT, 3, area_name) - var/list/St = new() - for(var/obj/effect/decal/cleanable/crayon/I in scanned_turf) - St.Add(I.icon_state) - if(St.len) - set_pin_data(IC_OUTPUT, 2, jointext(St, ",", 1, 0)) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/input/turfpoint - name = "tile pointer" - desc = "This circuit will get tile ref with given absolute coorinates." - extended_desc = "If the machine cannot see the target, it will not be able to scan it.\ - This circuit will only work in an assembly." - icon_state = "numberpad" - complexity = 5 - inputs = list("X" = IC_PINTYPE_NUMBER,"Y" = IC_PINTYPE_NUMBER) - outputs = list("tile" = IC_PINTYPE_REF) - activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT,"not scanned" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 40 - -/obj/item/integrated_circuit/input/turfpoint/do_work() - if(!assembly) - 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/turf/A = locate(target_x, target_y, T.z) - set_pin_data(IC_OUTPUT, 1, null) - if(!A || !(A in view(T))) - activate_pin(3) - return - else - set_pin_data(IC_OUTPUT, 1, WEAKREF(A)) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/input/turfscan - name = "tile analyzer" - desc = "This machine vision system can analyze contents of desired tile.And can read letters on floor." - icon_state = "video_camera" - complexity = 5 - inputs = list( - "target" = IC_PINTYPE_REF - ) - outputs = list( - "located ref" = IC_PINTYPE_LIST, - "Written letters" = IC_PINTYPE_STRING - ) - activators = list( - "scan" = IC_PINTYPE_PULSE_IN, - "on scanned" = IC_PINTYPE_PULSE_OUT, - "not scanned" = IC_PINTYPE_PULSE_OUT - ) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 40 - cooldown_per_use = 10 - -/obj/item/integrated_circuit/input/turfscan/do_work() - var/atom/movable/H = get_pin_data_as_type(IC_INPUT, 1, /atom) - var/turf/T = get_turf(src) - var/turf/E = get_turf(H) - if(!istype(H)) //Invalid input - return - - if(H in view(T)) // This is a camera. It can't examine thngs,that it can't see. - var/list/cont = new() - if(E.contents.len) - for(var/i = 1 to E.contents.len) - var/atom/U = E.contents[i] - cont += WEAKREF(U) - set_pin_data(IC_OUTPUT, 1, cont) - var/list/St = new() - for(var/obj/effect/decal/cleanable/crayon/I in E.contents) - St.Add(I.icon_state) - if(St.len) - set_pin_data(IC_OUTPUT, 2, jointext(St, ",", 1, 0)) - push_data() - activate_pin(2) - else - activate_pin(3) - -/obj/item/integrated_circuit/input/local_locator - name = "local locator" - desc = "This is needed for certain devices that demand a reference for a target to act upon. This type only locates something \ - that is holding the machine containing it." - inputs = list() - outputs = list("located ref" = IC_PINTYPE_REF, - "is ground" = IC_PINTYPE_BOOLEAN, - "is creature" = IC_PINTYPE_BOOLEAN) - activators = list("locate" = IC_PINTYPE_PULSE_IN, - "on scanned" = IC_PINTYPE_PULSE_OUT - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 20 - -/obj/item/integrated_circuit/input/local_locator/do_work() - var/datum/integrated_io/O = outputs[1] - O.data = null - if(assembly) - O.data = WEAKREF(assembly.loc) - set_pin_data(IC_OUTPUT, 2, isturf(assembly.loc)) - set_pin_data(IC_OUTPUT, 3, ismob(assembly.loc)) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/input/adjacent_locator - name = "adjacent locator" - desc = "This is needed for certain devices that demand a reference for a target to act upon. This type only locates something \ - that is standing up to a meter away from the machine." - extended_desc = "The first pin requires a ref to the kind of object that you want the locator to acquire. This means that it will \ - give refs to nearby objects that are similar. If more than one valid object is found nearby, it will choose one of them at \ - random." - inputs = list("desired type ref" = IC_PINTYPE_REF) - outputs = list("located ref" = IC_PINTYPE_REF) - activators = list("locate" = IC_PINTYPE_PULSE_IN,"found" = IC_PINTYPE_PULSE_OUT, - "not found" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 30 - -/obj/item/integrated_circuit/input/adjacent_locator/do_work() - var/datum/integrated_io/I = inputs[1] - var/datum/integrated_io/O = outputs[1] - O.data = null - - if(!isweakref(I.data)) - return - var/atom/A = I.data.resolve() - if(!A) - return - var/desired_type = A.type - - var/list/nearby_things = range(1, get_turf(src)) - var/list/valid_things = list() - for(var/atom/thing in nearby_things) - if(thing.type != desired_type) - continue - valid_things.Add(thing) - if(valid_things.len) - O.data = WEAKREF(pick(valid_things)) - activate_pin(2) - else - activate_pin(3) - O.push_data() - -/obj/item/integrated_circuit/input/advanced_locator_list - complexity = 6 - name = "list advanced locator" - desc = "This is needed for certain devices that demand list of names for a target to act upon. This type locates something \ - that is standing in given radius of up to 8 meters. Output is non-associative. Input will only consider keys if associative." - extended_desc = "The first pin requires a list of the kinds of objects that you want the locator to acquire. It will locate nearby objects by name and description, \ - and will then provide a list of all found objects which are similar. \ - The second pin is a radius." - inputs = list("desired type ref" = IC_PINTYPE_LIST, "radius" = IC_PINTYPE_NUMBER) - outputs = list("located ref" = IC_PINTYPE_LIST) - activators = list("locate" = IC_PINTYPE_PULSE_IN,"found" = IC_PINTYPE_PULSE_OUT,"not found" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 30 - var/radius = 1 - cooldown_per_use = 10 - -/obj/item/integrated_circuit/input/advanced_locator_list/on_data_written() - var/rad = get_pin_data(IC_INPUT, 2) - - if(isnum_safe(rad)) - rad = CLAMP(rad, 0, 8) - radius = rad - -/obj/item/integrated_circuit/input/advanced_locator_list/do_work() - var/datum/integrated_io/I = inputs[1] - var/datum/integrated_io/O = outputs[1] - O.data = null - var/list/input_list = list() - input_list = I.data - if(length(input_list)) //if there is no input don't do anything. - var/turf/T = get_turf(src) - var/list/nearby_things = view(radius,T) - var/list/valid_things = list() - for(var/item in input_list) - if(!isnull(item) && !isnum_safe(item)) - if(istext(item)) - for(var/i in nearby_things) - var/atom/thing = i - if(ismob(thing) && !isliving(thing)) - continue - if(findtext(addtext(thing.name," ",thing.desc), item, 1, 0) ) - valid_things.Add(WEAKREF(thing)) - else - var/atom/A = item - var/desired_type = A.type - for(var/i in nearby_things) - var/atom/thing = i - if(thing.type != desired_type) - continue - if(ismob(thing) && !isliving(thing)) - continue - valid_things.Add(WEAKREF(thing)) - if(valid_things.len) - O.data = valid_things - O.push_data() - activate_pin(2) - else - O.push_data() - activate_pin(3) - else - O.push_data() - activate_pin(3) - -/obj/item/integrated_circuit/input/advanced_locator - complexity = 6 - name = "advanced locator" - desc = "This is needed for certain devices that demand a reference for a target to act upon. This type locates something \ - that is standing in given radius of up to 8 meters" - extended_desc = "The first pin requires a ref to the kind of object that you want the locator to acquire. This means that it will \ - give refs to nearby objects which are similar. If this pin is a string, the locator will search for an \ - item matching the desired text in its name and description. If more than one valid object is found nearby, it will choose one of them at \ - random. The second pin is a radius." - inputs = list("desired type" = IC_PINTYPE_ANY, "radius" = IC_PINTYPE_NUMBER) - outputs = list("located ref" = IC_PINTYPE_REF) - activators = list("locate" = IC_PINTYPE_PULSE_IN,"found" = IC_PINTYPE_PULSE_OUT,"not found" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 30 - var/radius = 1 - -/obj/item/integrated_circuit/input/advanced_locator/on_data_written() - var/rad = get_pin_data(IC_INPUT, 2) - if(isnum_safe(rad)) - rad = CLAMP(rad, 0, 8) - radius = rad - -/obj/item/integrated_circuit/input/advanced_locator/do_work() - var/datum/integrated_io/I = inputs[1] - var/datum/integrated_io/O = outputs[1] - O.data = null - var/turf/T = get_turf(src) - var/list/nearby_things = view(radius,T) - var/list/valid_things = list() - if(isweakref(I.data)) - var/atom/A = I.data.resolve() - var/desired_type = A.type - if(desired_type) - for(var/i in nearby_things) - var/atom/thing = i - if(ismob(thing) && !isliving(thing)) - continue - if(thing.type == desired_type) - valid_things.Add(thing) - else if(istext(I.data)) - var/DT = I.data - for(var/i in nearby_things) - var/atom/thing = i - if(ismob(thing) && !isliving(thing)) - continue - if(findtext(addtext(thing.name," ",thing.desc), DT, 1, 0) ) - valid_things.Add(thing) - if(valid_things.len) - O.data = WEAKREF(pick(valid_things)) - O.push_data() - activate_pin(2) - else - O.push_data() - activate_pin(3) - -/obj/item/integrated_circuit/input/signaler - name = "integrated signaler" - desc = "Signals from a signaler can be received with this, allowing for remote control. It can also send signals." - extended_desc = "When a signal is received from another signaler, the 'on signal received' activator pin will be pulsed. \ - The two input pins are to configure the integrated signaler's settings. Note that the frequency should not have a decimal in it, \ - meaning the default frequency is expressed as 1457, not 145.7. To send a signal, pulse the 'send signal' activator pin." - icon_state = "signal" - complexity = 4 - inputs = list("frequency" = IC_PINTYPE_NUMBER,"code" = IC_PINTYPE_NUMBER) - outputs = list() - activators = list( - "send signal" = IC_PINTYPE_PULSE_IN, - "on signal sent" = IC_PINTYPE_PULSE_OUT, - "on signal received" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - action_flags = IC_ACTION_LONG_RANGE - power_draw_idle = 5 - power_draw_per_use = 40 - cooldown_per_use = 5 - var/frequency = FREQ_SIGNALER - var/code = DEFAULT_SIGNALER_CODE - var/datum/radio_frequency/radio_connection - var/hearing_range = 1 - -/obj/item/integrated_circuit/input/signaler/Initialize() - . = ..() - spawn(40) - set_frequency(frequency) - // Set the pins so when someone sees them, they won't show as null - set_pin_data(IC_INPUT, 1, frequency) - set_pin_data(IC_INPUT, 2, code) - -/obj/item/integrated_circuit/input/signaler/Destroy() - SSradio.remove_object(src,frequency) - - frequency = 0 - return ..() - -/obj/item/integrated_circuit/input/signaler/on_data_written() - var/new_freq = get_pin_data(IC_INPUT, 1) - var/new_code = get_pin_data(IC_INPUT, 2) - if(isnum_safe(new_freq) && new_freq > 0) - set_frequency(new_freq) - if(isnum_safe(new_code)) - code = new_code - - -/obj/item/integrated_circuit/input/signaler/do_work() // Sends a signal. - if(!radio_connection) - return - - var/datum/signal/signal = new(list("code" = code)) - radio_connection.post_signal(src, signal) - activate_pin(2) - -/obj/item/integrated_circuit/input/signaler/proc/set_frequency(new_frequency) - if(!frequency) - return - SSradio.remove_object(src, frequency) - frequency = new_frequency - radio_connection = SSradio.add_object(src, frequency, RADIO_SIGNALER) - -/obj/item/integrated_circuit/input/signaler/receive_signal(datum/signal/signal) - var/new_code = get_pin_data(IC_INPUT, 2) - var/code = 0 - - if(isnum_safe(new_code)) - code = new_code - if(!signal) - return 0 - if(signal.data["code"] != code) - return 0 - if(signal.source == src) // Don't trigger ourselves. - return 0 - - activate_pin(3) - audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*", null, hearing_range) - for(var/CHM in get_hearers_in_view(hearing_range, src)) - if(ismob(CHM)) - var/mob/LM = CHM - LM.playsound_local(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) - -/obj/item/integrated_circuit/input/ntnet_packet - name = "NTNet networking circuit" - desc = "Enables the sending and receiving of messages over NTNet via packet data protocol." - extended_desc = "Data can be sent or received using the second pin on each side, \ - with additonal data reserved for the third pin. When a message is received, the second activation pin \ - will pulse whatever is connected to it. Pulsing the first activation pin will send a message. Messages \ - can be sent to multiple recepients. Addresses must be separated with a semicolon, like this: Address1;Address2;Etc." - icon_state = "signal" - complexity = 2 - cooldown_per_use = 1 - inputs = list( - "target NTNet addresses"= IC_PINTYPE_STRING, - "data to send" = IC_PINTYPE_STRING, - "secondary text" = IC_PINTYPE_STRING, - "passkey" = IC_PINTYPE_STRING - ) - outputs = list( - "address received" = IC_PINTYPE_STRING, - "data received" = IC_PINTYPE_STRING, - "secondary text received" = IC_PINTYPE_STRING, - "passkey" = IC_PINTYPE_STRING, - "is_broadcast" = IC_PINTYPE_BOOLEAN - ) - activators = list("send data" = IC_PINTYPE_PULSE_IN, "on data received" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - action_flags = IC_ACTION_LONG_RANGE - power_draw_per_use = 50 - var/address - -/obj/item/integrated_circuit/input/ntnet_packet/Initialize() - . = ..() - var/datum/component/ntnet_interface/net = LoadComponent(/datum/component/ntnet_interface) - address = net.hardware_id - net.differentiate_broadcast = FALSE - desc += "
This circuit's NTNet hardware address is: [address]" - -/obj/item/integrated_circuit/input/ntnet_packet/do_work() - var/target_address = get_pin_data(IC_INPUT, 1) - var/message = get_pin_data(IC_INPUT, 2) - var/text = get_pin_data(IC_INPUT, 3) - - var/datum/netdata/data = new - data.recipient_ids = splittext(target_address, ";") - var/key = get_pin_data(IC_INPUT, 4) // hippie start -- adds passkey back in - data.standard_format_data(message, text, key) // hippie end - ntnet_send(data) - -/obj/item/integrated_circuit/input/ntnet_receive(datum/netdata/data) - set_pin_data(IC_OUTPUT, 1, data.sender_id) - set_pin_data(IC_OUTPUT, 2, data.data["data"]) - set_pin_data(IC_OUTPUT, 3, data.data["data_secondary"]) - set_pin_data(IC_OUTPUT, 4, data.data["encrypted_passkey"]) - set_pin_data(IC_OUTPUT, 5, data.broadcast) - - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/input/ntnet_advanced - name = "Low level NTNet transreceiver" - desc = "Enables the sending and receiving of messages over NTNet via packet data protocol. Allows advanced control of message contents and signalling. Must use associative lists. Outputs associative list. Has a slower transmission rate than normal NTNet circuits, due to increased data processing complexity." - extended_desc = "Data can be sent or received using the second pin on each side, \ - When a message is received, the second activation pin will pulse whatever is connected to it. \ - Pulsing the first activation pin will send a message. Messages can be sent to multiple recepients. \ - Addresses must be separated with a semicolon, like this: Address1;Address2;Etc." - icon_state = "signal" - complexity = 4 - cooldown_per_use = 10 - inputs = list( - "target NTNet addresses"= IC_PINTYPE_STRING, - "data" = IC_PINTYPE_LIST, - ) - outputs = list("received data" = IC_PINTYPE_LIST, "is_broadcast" = IC_PINTYPE_BOOLEAN) - activators = list("send data" = IC_PINTYPE_PULSE_IN, "on data received" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - action_flags = IC_ACTION_LONG_RANGE - power_draw_per_use = 50 - var/address - -/obj/item/integrated_circuit/input/ntnet_advanced/Initialize() - . = ..() - var/datum/component/ntnet_interface/net = LoadComponent(/datum/component/ntnet_interface) - address = net.hardware_id - net.differentiate_broadcast = FALSE - desc += "
This circuit's NTNet hardware address is: [address]" - -/obj/item/integrated_circuit/input/ntnet_advanced/do_work() - var/target_address = get_pin_data(IC_INPUT, 1) - var/list/message = get_pin_data(IC_INPUT, 2) - if(!islist(message)) - message = list() - var/datum/netdata/data = new - data.recipient_ids = splittext(target_address, ";") - data.data = message - //data.passkey = assembly.access_card.access - ntnet_send(data) - -/obj/item/integrated_circuit/input/ntnet_advanced/ntnet_receive(datum/netdata/data) - set_pin_data(IC_OUTPUT, 1, data.data) - set_pin_data(IC_OUTPUT, 2, data.broadcast) - push_data() - activate_pin(2) - -//This circuit gives information on where the machine is. -/obj/item/integrated_circuit/input/gps - name = "global positioning system" - desc = "This allows you to easily know the position of a machine containing this device." - extended_desc = "The coordinates that the GPS outputs are absolute, not relative. The full coords output has the coords separated by commas and is in string format." - icon_state = "gps" - complexity = 4 - inputs = list() - outputs = list("X"= IC_PINTYPE_NUMBER, "Y" = IC_PINTYPE_NUMBER, "Z" = IC_PINTYPE_NUMBER, "full coords" = IC_PINTYPE_STRING) - activators = list("get coordinates" = IC_PINTYPE_PULSE_IN, "on get coordinates" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 30 - -/obj/item/integrated_circuit/input/gps/do_work() - var/turf/T = get_turf(src) - - set_pin_data(IC_OUTPUT, 1, null) - set_pin_data(IC_OUTPUT, 2, null) - set_pin_data(IC_OUTPUT, 3, null) - set_pin_data(IC_OUTPUT, 4, null) - if(!T) - return - - set_pin_data(IC_OUTPUT, 1, T.x) - set_pin_data(IC_OUTPUT, 2, T.y) - set_pin_data(IC_OUTPUT, 3, T.z) - set_pin_data(IC_OUTPUT, 4, "[T.x],[T.y],[T.z]") - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/input/microphone - name = "microphone" - desc = "Useful for spying on people, or for voice-activated machines." - extended_desc = "This will automatically translate most languages it hears to Galactic Common. \ - The first activation pin is always pulsed when the circuit hears someone talk, while the second one \ - is only triggered if it hears someone speaking a language other than Galactic Common." - icon_state = "recorder" - complexity = 8 - inputs = list() - flags_1 = CONDUCT_1 | HEAR_1 - outputs = list( - "speaker" = IC_PINTYPE_STRING, - "message" = IC_PINTYPE_STRING - ) - activators = list("on message received" = IC_PINTYPE_PULSE_OUT, "on translation" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 5 - -/obj/item/integrated_circuit/input/microphone/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) - . = ..() - var/translated = FALSE - if(speaker && message) - if(raw_message) - if(message_langs != get_selected_language()) - translated = TRUE - set_pin_data(IC_OUTPUT, 1, speaker.GetVoice()) - set_pin_data(IC_OUTPUT, 2, raw_message) - - push_data() - activate_pin(1) - if(translated) - activate_pin(2) - -/obj/item/integrated_circuit/input/sensor - name = "sensor" - desc = "Scans and obtains a reference for any objects or persons near you. All you need to do is shove the machine in their face." - extended_desc = "If the 'ignore storage' pin is set to true, the sensor will disregard scanning various storage containers such as backpacks." - icon_state = "recorder" - complexity = 12 - inputs = list("ignore storage" = IC_PINTYPE_BOOLEAN) - outputs = list("scanned" = IC_PINTYPE_REF) - activators = list("on scanned" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 120 - -/obj/item/integrated_circuit/input/sensor/sense(atom/A, mob/user, prox) - if(!prox || !A || (ismob(A) && !isliving(A))) - return FALSE - if(!check_then_do_work()) - return FALSE - var/ignore_bags = get_pin_data(IC_INPUT, 1) - if(ignore_bags) - var/datum/component/storage/STR = A.GetComponent(/datum/component/storage) - if(STR) - return FALSE - set_pin_data(IC_OUTPUT, 1, WEAKREF(A)) - push_data() - to_chat(user, "You scan [A] with [assembly].") - activate_pin(1) - return TRUE - -/obj/item/integrated_circuit/input/sensor/ranged - name = "ranged sensor" - desc = "Scans and obtains a reference for any objects or persons in range. All you need to do is point the machine towards the target." - extended_desc = "If the 'ignore storage' pin is set to true, the sensor will disregard scanning various storage containers such as backpacks." - icon_state = "recorder" - complexity = 36 - inputs = list("ignore storage" = IC_PINTYPE_BOOLEAN) - outputs = list("scanned" = IC_PINTYPE_REF) - activators = list("on scanned" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 120 - -/obj/item/integrated_circuit/input/sensor/ranged/sense(atom/A, mob/user) - if(!user || !A || (ismob(A) && !isliving(A))) - return FALSE - if(user.client) - if(!(A in view(user.client))) - return FALSE - else - if(!(A in view(user))) - return FALSE - if(!check_then_do_work()) - return FALSE - var/ignore_bags = get_pin_data(IC_INPUT, 1) - if(ignore_bags) - if(istype(A, /obj/item/storage)) - return FALSE - set_pin_data(IC_OUTPUT, 1, WEAKREF(A)) - push_data() - to_chat(user, "You scan [A] with [assembly].") - activate_pin(1) - return TRUE - -/obj/item/integrated_circuit/input/obj_scanner - name = "scanner" - desc = "Scans and obtains a reference for any objects you use on the assembly." - extended_desc = "If the 'put down' pin is set to true, the assembly will take the scanned object from your hands to its location. \ - Useful for interaction with the grabber. The scanner only works using the help intent." - icon_state = "recorder" - complexity = 4 - inputs = list("put down" = IC_PINTYPE_BOOLEAN) - outputs = list("scanned" = IC_PINTYPE_REF) - activators = list("on scanned" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 20 - -/obj/item/integrated_circuit/input/obj_scanner/attackby_react(var/atom/A,var/mob/user,intent) - if(intent!=INTENT_HELP) - return FALSE - if(!check_then_do_work()) - return FALSE - var/pu = get_pin_data(IC_INPUT, 1) - if(pu) - user.transferItemToLoc(A,drop_location()) - set_pin_data(IC_OUTPUT, 1, WEAKREF(A)) - push_data() - to_chat(user, "You let [assembly] scan [A].") - activate_pin(1) - return TRUE - -/obj/item/integrated_circuit/input/internalbm - name = "internal battery monitor" - desc = "This monitors the charge level of an internal battery." - icon_state = "internalbm" - extended_desc = "This circuit will give you the values of charge, max charge, and the current percentage of the internal battery on demand." - w_class = WEIGHT_CLASS_TINY - complexity = 1 - inputs = list() - outputs = list( - "cell charge" = IC_PINTYPE_NUMBER, - "max charge" = IC_PINTYPE_NUMBER, - "percentage" = IC_PINTYPE_NUMBER, - "refference to assembly" = IC_PINTYPE_REF, - "refference to cell" = IC_PINTYPE_REF - ) - activators = list("read" = IC_PINTYPE_PULSE_IN, "on read" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 1 - -/obj/item/integrated_circuit/input/internalbm/do_work() - set_pin_data(IC_OUTPUT, 1, null) - set_pin_data(IC_OUTPUT, 2, null) - set_pin_data(IC_OUTPUT, 3, null) - set_pin_data(IC_OUTPUT, 4, null) - set_pin_data(IC_OUTPUT, 5, null) - if(assembly) - set_pin_data(IC_OUTPUT, 4, WEAKREF(assembly)) - if(assembly.battery) - set_pin_data(IC_OUTPUT, 1, assembly.battery.charge) - set_pin_data(IC_OUTPUT, 2, assembly.battery.maxcharge) - set_pin_data(IC_OUTPUT, 3, 100*assembly.battery.charge/assembly.battery.maxcharge) - set_pin_data(IC_OUTPUT, 5, WEAKREF(assembly.battery)) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/input/externalbm - name = "external battery monitor" - desc = "This can read the battery state of any device in view." - icon_state = "externalbm" - extended_desc = "This circuit will give you the charge, max charge, and the current percentage values of any device or battery in view." - w_class = WEIGHT_CLASS_TINY - complexity = 2 - inputs = list("target" = IC_PINTYPE_REF) - outputs = list( - "cell charge" = IC_PINTYPE_NUMBER, - "max charge" = IC_PINTYPE_NUMBER, - "percentage" = IC_PINTYPE_NUMBER - ) - activators = list("read" = IC_PINTYPE_PULSE_IN, "on read" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 1 - -/obj/item/integrated_circuit/input/externalbm/do_work() - - var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) - set_pin_data(IC_OUTPUT, 1, null) - set_pin_data(IC_OUTPUT, 2, null) - set_pin_data(IC_OUTPUT, 3, null) - if(AM) - var/obj/item/stock_parts/cell/C = AM.get_cell() - if(C) - var/turf/A = get_turf(src) - if(get_turf(AM) in view(A)) - set_pin_data(IC_OUTPUT, 1, C.charge) - set_pin_data(IC_OUTPUT, 2, C.maxcharge) - set_pin_data(IC_OUTPUT, 3, C.percent()) - push_data() - activate_pin(2) - return - -/obj/item/integrated_circuit/input/ntnetsc - name = "NTNet scanner" - desc = "This can return the NTNet IDs of a component inside the given object, if there are any." - icon_state = "signalsc" - w_class = WEIGHT_CLASS_TINY - complexity = 2 - inputs = list("target" = IC_PINTYPE_REF) - outputs = list( - "id" = IC_PINTYPE_STRING - ) - activators = list("read" = IC_PINTYPE_PULSE_IN, "found" = IC_PINTYPE_PULSE_OUT,"not found" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 1 - -/obj/item/integrated_circuit/input/ntnetsc/do_work() - var/atom/AM = get_pin_data_as_type(IC_INPUT, 1, /atom) - var/datum/component/ntnet_interface/net - - if(AM) - var/list/processing_list = list(AM) - while(processing_list.len && !net) - var/atom/A = processing_list[1] - processing_list.Cut(1, 2) - //Byond does not allow things to be in multiple contents, or double parent-child hierarchies, so only += is needed - //This is also why we don't need to check against assembled as we go along - processing_list += A.contents - net = A.GetComponent(/datum/component/ntnet_interface) - - if(net) - set_pin_data(IC_OUTPUT, 1, net.hardware_id) - push_data() - activate_pin(2) - else - set_pin_data(IC_OUTPUT, 1, null) - push_data() - activate_pin(3) - -/obj/item/integrated_circuit/input/matscan - name = "material scanner" - desc = "This special module is designed to get information about material containers of different machinery, \ - like ORM, lathes, etc." - icon_state = "video_camera" - complexity = 6 - inputs = list( - "target" = IC_PINTYPE_REF - ) - outputs = list( - "Iron" = IC_PINTYPE_NUMBER, - "Glass" = IC_PINTYPE_NUMBER, - "Silver" = IC_PINTYPE_NUMBER, - "Gold" = IC_PINTYPE_NUMBER, - "Diamond" = IC_PINTYPE_NUMBER, - "Solid Plasma" = IC_PINTYPE_NUMBER, - "Uranium" = IC_PINTYPE_NUMBER, - "Bananium" = IC_PINTYPE_NUMBER, - "Titanium" = IC_PINTYPE_NUMBER, - "Bluespace Mesh" = IC_PINTYPE_NUMBER, - "Biomass" = IC_PINTYPE_NUMBER, - ) - activators = list( - "scan" = IC_PINTYPE_PULSE_IN, - "on scanned" = IC_PINTYPE_PULSE_OUT, - "not scanned" = IC_PINTYPE_PULSE_OUT - ) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 40 - var/list/mtypes = list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace, /datum/material/biomass) - - -/obj/item/integrated_circuit/input/matscan/do_work() - var/atom/movable/H = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) - var/turf/T = get_turf(src) - var/datum/component/material_container/mt = H.GetComponent(/datum/component/material_container) - if(!mt) //Invalid input - return - if(H in view(T)) // This is a camera. It can't examine thngs,that it can't see. - for(var/I in 1 to mtypes.len) - var/amount = mt.materials[mtypes[I]] - if(amount) - set_pin_data(IC_OUTPUT, I, amount) - else - set_pin_data(IC_OUTPUT, I, null) - push_data() - activate_pin(2) - else - activate_pin(3) - -/obj/item/integrated_circuit/input/atmospheric_analyzer - name = "atmospheric analyzer" - desc = "A miniaturized analyzer which can scan anything that contains gases. Leave target as NULL to scan the air around the assembly." - extended_desc = "The nth element of gas amounts is the number of moles of the \ - nth gas in gas list. \ - Pressure is in kPa, temperature is in Kelvin. \ - Due to programming limitations, scanning an object that does \ - not contain a gas will return the air around it instead." - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - inputs = list( - "target" = IC_PINTYPE_REF - ) - outputs = list( - "gas list" = IC_PINTYPE_LIST, - "gas amounts" = IC_PINTYPE_LIST, - "total moles" = IC_PINTYPE_NUMBER, - "pressure" = IC_PINTYPE_NUMBER, - "temperature" = IC_PINTYPE_NUMBER, - "volume" = IC_PINTYPE_NUMBER - ) - activators = list( - "scan" = IC_PINTYPE_PULSE_IN, - "on success" = IC_PINTYPE_PULSE_OUT, - "on failure" = IC_PINTYPE_PULSE_OUT - ) - power_draw_per_use = 5 - -/obj/item/integrated_circuit/input/atmospheric_analyzer/do_work() - for(var/i=1 to 6) - set_pin_data(IC_OUTPUT, i, null) - var/atom/target = get_pin_data_as_type(IC_INPUT, 1, /atom) - if(!target) - target = get_turf(src) - if( get_dist(get_turf(target),get_turf(src)) > 1 ) - activate_pin(3) - return - - var/datum/gas_mixture/air_contents = target.return_air() - if(!air_contents) - activate_pin(3) - return - - var/list/gases = air_contents.get_gases() - var/list/gas_names = list() - var/list/gas_amounts = list() - for(var/id in gases) - var/name = GLOB.meta_gas_info[id][META_GAS_NAME] - var/amt = round(air_contents.get_moles(id), 0.001) - gas_names.Add(name) - gas_amounts.Add(amt) - - set_pin_data(IC_OUTPUT, 1, gas_names) - set_pin_data(IC_OUTPUT, 2, gas_amounts) - set_pin_data(IC_OUTPUT, 3, round(air_contents.total_moles(), 0.001)) - set_pin_data(IC_OUTPUT, 4, round(air_contents.return_pressure(), 0.001)) - set_pin_data(IC_OUTPUT, 5, round(air_contents.return_temperature(), 0.001)) - set_pin_data(IC_OUTPUT, 6, round(air_contents.return_volume(), 0.001)) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/input/data_card_reader - name = "data card reader" - desc = "A circuit that can read from and write to data cards." - extended_desc = "Setting the \"write mode\" boolean to true will cause any data cards that are used on the assembly to replace\ - their existing function and data strings with the given strings, if it is set to false then using a data card on the assembly will cause\ - the function and data strings stored on the card to be written to the output pins." - icon_state = "card_reader" - complexity = 4 - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - inputs = list( - "function" = IC_PINTYPE_STRING, - "data to store" = IC_PINTYPE_STRING, - "write mode" = IC_PINTYPE_BOOLEAN - ) - outputs = list( - "function" = IC_PINTYPE_STRING, - "stored data" = IC_PINTYPE_STRING - ) - activators = list( - "on write" = IC_PINTYPE_PULSE_OUT, - "on read" = IC_PINTYPE_PULSE_OUT - ) - -/obj/item/integrated_circuit/input/data_card_reader/attackby_react(obj/item/I, mob/living/user, intent) - var/obj/item/card/data/card = I.GetCard() - var/write_mode = get_pin_data(IC_INPUT, 3) - if(card) - if(write_mode == TRUE) - card.function = get_pin_data(IC_INPUT, 1) - card.data = get_pin_data(IC_INPUT, 2) - push_data() - activate_pin(1) - else - set_pin_data(IC_OUTPUT, 1, card.function) - set_pin_data(IC_OUTPUT, 2, card.data) - push_data() - activate_pin(2) - else - return FALSE - return TRUE - -//Adding some color to cards aswell, because why not -/obj/item/card/data/attackby(obj/item/I, mob/living/user) - if(istype(I, /obj/item/integrated_electronics/detailer)) - var/obj/item/integrated_electronics/detailer/D = I - detail_color = D.detail_color - update_icon() - return ..() - - -//Interceptor -//Intercepts a telecomms signal, aka a radio message (;halp getting griff) -//Inputs: -//On (Boolean): If on, the circuit intercepts radio signals. Otherwise it does not. This doesn't affect no pass! -//No pass (Boolean): Decides if the signal will be silently intercepted -// (false) or also blocked from being sent on the radio (true) -//Outputs: -//Source: name of the mob -//Job: job of the mob -//content: the actual message -//spans: a list of spans, there's not much info about this but stuff like robots will have "robot" span -/obj/item/integrated_circuit/input/tcomm_interceptor - name = "telecommunication interceptor" - desc = "This circuit allows for telecomms signals \ - to be fetched prior to being broadcasted." - extended_desc = "Similar \ - to the old NTSL system of realtime signal modification, \ - the circuit connects to telecomms and fetches data \ - for each signal, which can be sent normally or blocked, \ - for cases such as other circuits modifying certain data. \ - Beware, this cannot stop signals from unreachable areas, such \ - as space or zlevels other than station's one." - complexity = 30 - cooldown_per_use = 0.1 - w_class = WEIGHT_CLASS_SMALL - inputs = list( - "intercept" = IC_PINTYPE_BOOLEAN, - "no pass" = IC_PINTYPE_BOOLEAN - ) - outputs = list( - "source" = IC_PINTYPE_STRING, - "job" = IC_PINTYPE_STRING, - "content" = IC_PINTYPE_STRING, - "spans" = IC_PINTYPE_LIST, - "frequency" = IC_PINTYPE_NUMBER - ) - activators = list( - "on intercept" = IC_PINTYPE_PULSE_OUT - ) - power_draw_idle = 0 - spawn_flags = IC_SPAWN_RESEARCH - var/obj/machinery/telecomms/receiver/circuit/receiver - var/list/freq_blacklist = list(FREQ_CENTCOM,FREQ_SYNDICATE,FREQ_CTF_RED,FREQ_CTF_BLUE) - -/obj/item/integrated_circuit/input/tcomm_interceptor/Initialize() - . = ..() - receiver = new(src) - receiver.holder = src - -/obj/item/integrated_circuit/input/tcomm_interceptor/Destroy() - qdel(receiver) - GLOB.ic_jammers -= src - ..() - -/obj/item/integrated_circuit/input/tcomm_interceptor/receive_signal(datum/signal/signal) - if((signal.transmission_method == TRANSMISSION_SUBSPACE) && get_pin_data(IC_INPUT, 1)) - if(signal.frequency in freq_blacklist) - return - set_pin_data(IC_OUTPUT, 1, signal.data["name"]) - set_pin_data(IC_OUTPUT, 2, signal.data["job"]) - set_pin_data(IC_OUTPUT, 3, signal.data["message"]) - set_pin_data(IC_OUTPUT, 4, signal.data["spans"]) - set_pin_data(IC_OUTPUT, 5, signal.frequency) - push_data() - activate_pin(1) - -/obj/item/integrated_circuit/input/tcomm_interceptor/on_data_written() - if(get_pin_data(IC_INPUT, 2)) - GLOB.ic_jammers |= src - if(get_pin_data(IC_INPUT, 1)) - power_draw_idle = 200 - else - power_draw_idle = 100 - else - GLOB.ic_jammers -= src - if(get_pin_data(IC_INPUT, 1)) - power_draw_idle = 100 - else - power_draw_idle = 0 - -/obj/item/integrated_circuit/input/tcomm_interceptor/power_fail() - set_pin_data(IC_INPUT, 1, 0) - set_pin_data(IC_INPUT, 2, 0) - -/obj/item/integrated_circuit/input/tcomm_interceptor/disconnect_all() - set_pin_data(IC_INPUT, 1, 0) - set_pin_data(IC_INPUT, 2, 0) - ..() - - -// -Inputlist- // -/obj/item/integrated_circuit/input/selection - name = "selection circuit" - desc = "This circuit lets you choose between different strings from a selection." - extended_desc = "This circuit lets you choose between up to 4 different values from selection of up to 8 strings that you can set. Null values are ignored and the chosen value is put out in selected." - icon_state = "addition" - can_be_asked_input = 1 - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - inputs = list( - "A" = IC_PINTYPE_STRING, - "B" = IC_PINTYPE_STRING, - "C" = IC_PINTYPE_STRING, - "D" = IC_PINTYPE_STRING, - "E" = IC_PINTYPE_STRING, - "F" = IC_PINTYPE_STRING, - "G" = IC_PINTYPE_STRING, - "H" = IC_PINTYPE_STRING - ) - activators = list( - "on selected" = IC_PINTYPE_PULSE_OUT - ) - outputs = list( - "selected" = IC_PINTYPE_STRING - ) - -/obj/item/integrated_circuit/input/selection/ask_for_input(mob/user) - var/list/selection = list() - for(var/k in 1 to inputs.len) - var/I = get_pin_data(IC_INPUT, k) - if(istext(I)) - selection.Add(I) - var/selected = input(user,"Choose input.","Selection") in selection - if(!selected) - return - set_pin_data(IC_OUTPUT, 1, selected) - push_data() - activate_pin(1) - - -// -storage examiner- // **works** -/obj/item/integrated_circuit/input/storage_examiner - name = "storage examiner circuit" - desc = "This circuit lets you scan a storage's content. (backpacks, toolboxes etc.)" - extended_desc = "The items are put out as reference, which makes it possible to interact with them. Additionally also gives the amount of items." - icon_state = "grabber" - can_be_asked_input = 1 - complexity = 6 - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - inputs = list( - "storage" = IC_PINTYPE_REF - ) - activators = list( - "examine" = IC_PINTYPE_PULSE_IN, - "on examined" = IC_PINTYPE_PULSE_OUT - ) - outputs = list( - "item amount" = IC_PINTYPE_NUMBER, - "item list" = IC_PINTYPE_LIST - ) - power_draw_per_use = 85 - -/obj/item/integrated_circuit/input/storage_examiner/do_work() - var/obj/item/storage = get_pin_data_as_type(IC_INPUT, 1, /obj/item) - if(!istype(storage,/obj/item/storage)) - return - - set_pin_data(IC_OUTPUT, 1, storage.contents.len) - - var/list/regurgitated_contents = list() - for(var/obj/o in storage.contents) - regurgitated_contents.Add(WEAKREF(o)) - - - set_pin_data(IC_OUTPUT, 2, regurgitated_contents) - push_data() - activate_pin(2) diff --git a/code/modules/integrated_electronics/subtypes/lists.dm b/code/modules/integrated_electronics/subtypes/lists.dm deleted file mode 100644 index adc79e748b4f2..0000000000000 --- a/code/modules/integrated_electronics/subtypes/lists.dm +++ /dev/null @@ -1,462 +0,0 @@ -//These circuits do things with lists, and use special list pins for stability. -/obj/item/integrated_circuit/lists - complexity = 1 - inputs = list( - "input" = IC_PINTYPE_LIST - ) - outputs = list( - "result" = IC_PINTYPE_STRING - ) - activators = list( - "compute" = IC_PINTYPE_PULSE_IN, - "on computed" = IC_PINTYPE_PULSE_OUT - ) - category_text = "Lists" - power_draw_per_use = 20 - cooldown_per_use = 10 - -/obj/item/integrated_circuit/lists/pick - name = "pick circuit" - desc = "This circuit will pick a random element from the input list, and output that element." - extended_desc = "The input list is not modified." - icon_state = "addition" - outputs = list( - "result" = IC_PINTYPE_ANY - ) - activators = list( - "compute" = IC_PINTYPE_PULSE_IN, - "on success" = IC_PINTYPE_PULSE_OUT, - "on failure" = IC_PINTYPE_PULSE_OUT, - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - cooldown_per_use = 1 - -/obj/item/integrated_circuit/lists/pick/do_work() - var/list/input_list = get_pin_data(IC_INPUT, 1) // List pins guarantee that there is a list inside, even if just an empty one. - if(input_list.len) - set_pin_data(IC_OUTPUT, 1, pick(input_list)) - push_data() - activate_pin(2) - else - activate_pin(3) - - -/obj/item/integrated_circuit/lists/append - name = "append circuit" - desc = "This circuit will add an element to a list." - extended_desc = "The new element will always be at the bottom of the list." - inputs = list( - "list to append" = IC_PINTYPE_LIST, - "input" = IC_PINTYPE_ANY - ) - outputs = list( - "appended list" = IC_PINTYPE_LIST - ) - icon_state = "addition" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/lists/append/do_work() - var/list/input_list = get_pin_data(IC_INPUT, 1) - var/list/output_list = list() - var/new_entry = get_pin_data(IC_INPUT, 2) - output_list = input_list.Copy() - output_list.Add(new_entry) - - set_pin_data(IC_OUTPUT, 1, output_list) - push_data() - activate_pin(2) - - -/obj/item/integrated_circuit/lists/search - name = "search circuit" - desc = "This circuit will get the index location of the desired element in a list." - extended_desc = "Search will start at position 1 and will return the first matching position." - inputs = list( - "list" = IC_PINTYPE_LIST, - "item" = IC_PINTYPE_ANY - ) - outputs = list( - "index" = IC_PINTYPE_NUMBER - ) - activators = list( - "compute" = IC_PINTYPE_PULSE_IN, - "on success" = IC_PINTYPE_PULSE_OUT, - "on failure" = IC_PINTYPE_PULSE_OUT, - ) - icon_state = "addition" - complexity = 2 - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - cooldown_per_use = 1 - -/obj/item/integrated_circuit/lists/search/do_work() - var/list/input_list = get_pin_data(IC_INPUT, 1) - var/output = input_list.Find(get_pin_data(IC_INPUT, 2)) - - set_pin_data(IC_OUTPUT, 1, output) - push_data() - - if(output) - activate_pin(2) - else - activate_pin(3) - - -/obj/item/integrated_circuit/lists/filter - name = "filter circuit" - desc = "This circuit will search through a list for anything matching the desired element(s) and outputs two lists: \ - one containing only the matching elements, and one with the matching elements filtered out." - extended_desc = "Sample accepts lists. If no match is found, the original list is sent to output 1." - inputs = list( - "input list" = IC_PINTYPE_LIST, - "sample" = IC_PINTYPE_ANY - ) - outputs = list( - "list filtered" = IC_PINTYPE_LIST, - "list matched" = IC_PINTYPE_LIST - ) - activators = list( - "compute" = IC_PINTYPE_PULSE_IN, - "on match" = IC_PINTYPE_PULSE_OUT, - "on no match" = IC_PINTYPE_PULSE_OUT - ) - complexity = 6 - icon_state = "addition" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/lists/filter/do_work() - var/list/input_list = get_pin_data(IC_INPUT, 1) - var/sample = get_pin_data(IC_INPUT, 2) - var/list/sample_list = islist(sample) ? uniqueList(sample) : null - var/list/output_list1 = input_list.Copy() - var/list/output_list2 = list() - var/list/output = list() - - for(var/input_item in input_list) - if(sample_list) - for(var/sample_item in sample_list) - if(!isnull(sample_item)) - if(istext(input_item) && istext(sample_item) && findtext(input_item, sample_item)) - output += input_item - if(istype(input_item, /atom) && istext(sample_item)) - var/atom/input_item_atom = input_item - if(istext(sample_item) && findtext(input_item_atom.name, sample_item)) - output += input_item - if(!istext(input_item)) - if(input_item == sample_item) - output += input_item - else - if(!isnull(sample)) - if(istext(input_item) && istext(sample) && findtext(input_item, sample)) - output += input_item - continue - if(istype(input_item, /atom) && istext(sample)) - var/atom/input_itema = input_item - if(findtext(input_itema.name, sample)) - output += input_item - if(!istext(input_item)) - if(input_item == sample) - output += input_item - - output_list1.Remove(output) - output_list2.Add(output) - set_pin_data(IC_OUTPUT, 1, output_list1) - set_pin_data(IC_OUTPUT, 2, output_list2) - push_data() - - output_list1 ~! input_list ? activate_pin(2) : activate_pin(3) - -/obj/item/integrated_circuit/lists/listset - name = "list set circuit" - desc = "This circuit will remove any duplicate entries from a list." - extended_desc = "If there are no duplicate entries, the output list will be unchanged." - inputs = list( - "list" = IC_PINTYPE_LIST - ) - outputs = list( - "list filtered" = IC_PINTYPE_LIST - ) - icon_state = "addition" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/lists/listset/do_work() - var/list/input_list = get_pin_data(IC_INPUT, 1) - input_list = uniqueList(input_list) - - set_pin_data(IC_OUTPUT, 1, input_list) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/lists/at - name = "at circuit" - desc = "This circuit will pick an element from a list by the input index." - extended_desc = "If there is no element at the given index, the result will be null." - inputs = list( - "list" = IC_PINTYPE_LIST, - "index" = IC_PINTYPE_INDEX - ) - outputs = list( - "item" = IC_PINTYPE_ANY - ) - activators = list( - "compute" = IC_PINTYPE_PULSE_IN, - "on success" = IC_PINTYPE_PULSE_OUT, - "on failure" = IC_PINTYPE_PULSE_OUT - ) - icon_state = "addition" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - cooldown_per_use = 1 - -/obj/item/integrated_circuit/lists/at/do_work() - var/list/input_list = get_pin_data(IC_INPUT, 1) - var/index = get_pin_data(IC_INPUT, 2) - - // Check if index is valid - if(index > input_list.len) - set_pin_data(IC_OUTPUT, 1, null) - push_data() - activate_pin(3) - return - - set_pin_data(IC_OUTPUT, 1, input_list[index]) - push_data() - activate_pin(2) - - -/obj/item/integrated_circuit/lists/delete - name = "delete circuit" - desc = "This circuit will remove an element from a list by the index." - extended_desc = "If there is no element at the given index, the result list will be unchanged." - inputs = list( - "list" = IC_PINTYPE_LIST, - "index" = IC_PINTYPE_INDEX - ) - outputs = list( - "item" = IC_PINTYPE_LIST - ) - icon_state = "addition" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/lists/delete/do_work() - var/list/input_list = get_pin_data(IC_INPUT, 1) - var/list/red_list = list() - var/index = get_pin_data(IC_INPUT, 2) - - if(length(input_list)) - for(var/j in 1 to input_list.len) - var/I = input_list[j] - if(j != index) - red_list.Add(I) - set_pin_data(IC_OUTPUT, 1, red_list) - push_data() - activate_pin(2) - - -/obj/item/integrated_circuit/lists/write - name = "write circuit" - desc = "This circuit will write an element to a list at the given index location." - extended_desc = "If there is no element at the given index, it will output the same list as before." - inputs = list( - "list" = IC_PINTYPE_LIST, - "index" = IC_PINTYPE_INDEX, - "item" = IC_PINTYPE_ANY - ) - outputs = list( - "redacted list" = IC_PINTYPE_LIST - ) - activators = list( - "compute" = IC_PINTYPE_PULSE_IN, - "on success" = IC_PINTYPE_PULSE_OUT, - "on failure" = IC_PINTYPE_PULSE_OUT, - ) - icon_state = "addition" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/lists/write/do_work() - var/list/input_list = get_pin_data(IC_INPUT, 1) - var/index = get_pin_data(IC_INPUT, 2) - var/item = get_pin_data(IC_INPUT, 3) - - // Check if index is valid - if(index > input_list.len) - set_pin_data(IC_OUTPUT, 1, input_list) - push_data() - activate_pin(3) - return - - if(!islist(item)) - var/list/red_list = input_list.Copy() //crash proof - red_list[index] = item - set_pin_data(IC_OUTPUT, 1, red_list) - push_data() - activate_pin(2) - - -/obj/item/integrated_circuit/lists/len - name = "len circuit" - desc = "This circuit will return the length of the list." - inputs = list( - "list" = IC_PINTYPE_LIST, - ) - outputs = list( - "item" = IC_PINTYPE_NUMBER - ) - icon_state = "addition" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/lists/len/do_work() - var/list/input_list = get_pin_data(IC_INPUT, 1) - set_pin_data(IC_OUTPUT, 1, input_list.len) - push_data() - activate_pin(2) - cooldown_per_use = 1 - - -/obj/item/integrated_circuit/lists/jointext - name = "join text circuit" - desc = "This circuit will combine two lists into one, and output it as a string." - extended_desc = "Default settings will encode the entire list into a string." - icon_state = "join" - inputs = list( - "list to join" = IC_PINTYPE_LIST,// - "delimiter" = IC_PINTYPE_STRING, - "start" = IC_PINTYPE_INDEX, - "end" = IC_PINTYPE_NUMBER - ) - inputs_default = list( - "2" = ", ", - "4" = 0 - ) - outputs = list( - "joined text" = IC_PINTYPE_STRING - ) - icon_state = "addition" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - cooldown_per_use = 1 - -/obj/item/integrated_circuit/lists/jointext/do_work() - var/list/input_list = get_pin_data(IC_INPUT, 1) - var/delimiter = get_pin_data(IC_INPUT, 2) - var/start = get_pin_data(IC_INPUT, 3) - var/end = get_pin_data(IC_INPUT, 4) - - var/result = null - - if(input_list.len && delimiter && !isnull(start) && !isnull(end)) - result = jointext(input_list, delimiter, start, end) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - - -/obj/item/integrated_circuit/lists/constructor - name = "large list constructor" - desc = "This circuit will build a list out of up to sixteen input values." - icon_state = "constr8" - inputs = list() - outputs = list( - "result" = IC_PINTYPE_LIST - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/number_of_pins = 16 - -/obj/item/integrated_circuit/lists/constructor/Initialize() - for(var/i = 1 to number_of_pins) - inputs["input [i]"] = IC_PINTYPE_ANY // This is just a string since pins don't get built until ..() is called. - complexity = number_of_pins / 2 - . = ..() - -/obj/item/integrated_circuit/lists/constructor/do_work() - var/list/output_list = list() - for(var/i = 1 to number_of_pins) - var/data = get_pin_data(IC_INPUT, i) - - // No nested lists - if(!islist(data)) - output_list += data - else - output_list += null - - set_pin_data(IC_OUTPUT, 1, output_list) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/lists/constructor/small - name = "list constructor" - desc = "This circuit will build a list out of up to four input values." - icon_state = "constr" - number_of_pins = 4 - -/obj/item/integrated_circuit/lists/constructor/medium - name = "medium list constructor" - desc = "This circuit will build a list out of up to eight input values." - icon_state = "constr8" - number_of_pins = 8 - - -/obj/item/integrated_circuit/lists/deconstructor - name = "large list deconstructor" - desc = "This circuit will write the first sixteen entries of its input list, starting with the index, into the output values." - icon_state = "deconstr8" - inputs = list( - "input" = IC_PINTYPE_LIST, - "index" = IC_PINTYPE_INDEX - ) - outputs = list() - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/number_of_pins = 16 - -/obj/item/integrated_circuit/lists/deconstructor/Initialize() - for(var/i = 1 to number_of_pins) - outputs["output [i]"] = IC_PINTYPE_ANY // This is just a string since pins don't get built until ..() is called. - complexity = number_of_pins / 2 - . = ..() - -/obj/item/integrated_circuit/lists/deconstructor/do_work() - var/list/input_list = get_pin_data(IC_INPUT, 1) - var/start_index = get_pin_data(IC_INPUT, 2) - - for(var/i = 1 to number_of_pins) - var/list_index = i + start_index - 1 - if(list_index > input_list.len) - set_pin_data(IC_OUTPUT, i, null) - else - set_pin_data(IC_OUTPUT, i, input_list[list_index]) - - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/lists/deconstructor/small - name = "list deconstructor" - desc = "This circuit will write the first four entries of its input list, starting with the index, into the output values." - icon_state = "deconstr" - number_of_pins = 4 - -/obj/item/integrated_circuit/lists/deconstructor/medium - name = "medium list deconstructor" - desc = "This circuit will write the first eight entries of its input list, starting with the index, into the output values." - number_of_pins = 8 - - -// - Join circuit - // -/obj/item/integrated_circuit/lists/join - name = "join circuit" - desc = "This circuit is a huge fan of shipping. It joins 2 lists together." - extended_desc = "Elements found in both lists will not be removed and can be found twice in the list." - inputs = list( - "first list" = IC_PINTYPE_LIST, - "second list" = IC_PINTYPE_LIST - ) - outputs = list( - "joined list" = IC_PINTYPE_LIST - ) - icon_state = "addition" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/lists/join/do_work() - var/list/input_list = get_pin_data(IC_INPUT, 1) - var/list/input_list2 = get_pin_data(IC_INPUT, 2) - - set_pin_data(IC_OUTPUT, 1, input_list+input_list2) - push_data() - activate_pin(2) diff --git a/code/modules/integrated_electronics/subtypes/logic.dm b/code/modules/integrated_electronics/subtypes/logic.dm deleted file mode 100644 index a6144eec4063b..0000000000000 --- a/code/modules/integrated_electronics/subtypes/logic.dm +++ /dev/null @@ -1,223 +0,0 @@ -/obj/item/integrated_circuit/logic - name = "logic gate" - desc = "This tiny chip will decide for you!" - extended_desc = "Logic circuits will treat a null, 0, and a \"\" string value as FALSE and anything else as TRUE." - complexity = 1 - outputs = list("result" = IC_PINTYPE_BOOLEAN) - activators = list("compare" = IC_PINTYPE_PULSE_IN) - category_text = "Logic" - power_draw_per_use = 1 - -/obj/item/integrated_circuit/logic/do_work() - push_data() - -/obj/item/integrated_circuit/logic/binary - inputs = list("A" = IC_PINTYPE_ANY,"B" = IC_PINTYPE_ANY) - activators = list("compare" = IC_PINTYPE_PULSE_IN, "on true result" = IC_PINTYPE_PULSE_OUT, "on false result" = IC_PINTYPE_PULSE_OUT) - -/obj/item/integrated_circuit/logic/binary/do_work() - var/datum/integrated_io/A = inputs[1] - var/datum/integrated_io/B = inputs[2] - var/datum/integrated_io/O = outputs[1] - O.data = do_compare(A, B) ? TRUE : FALSE - - if(get_pin_data(IC_OUTPUT, 1)) - activate_pin(2) - else - activate_pin(3) - ..() - -/obj/item/integrated_circuit/logic/binary/proc/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) - return FALSE - -/obj/item/integrated_circuit/logic/binary/proc/comparable(var/datum/integrated_io/A, var/datum/integrated_io/B) - return (isnum_safe(A.data) && isnum_safe(B.data)) || (istext(A.data) && istext(B.data)) - -/obj/item/integrated_circuit/logic/unary - inputs = list("A" = IC_PINTYPE_ANY) - activators = list("compare" = IC_PINTYPE_PULSE_IN, "on compare" = IC_PINTYPE_PULSE_OUT) - -/obj/item/integrated_circuit/logic/unary/do_work() - var/datum/integrated_io/A = inputs[1] - var/datum/integrated_io/O = outputs[1] - O.data = do_check(A) ? TRUE : FALSE - ..() - activate_pin(2) - -/obj/item/integrated_circuit/logic/unary/proc/do_check(var/datum/integrated_io/A) - return FALSE - -/obj/item/integrated_circuit/logic/binary/equals - name = "equal gate" - desc = "This gate compares two values, and outputs TRUE if both are the same." - icon_state = "equal" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/logic/binary/equals/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) - return A.data == B.data - -/obj/item/integrated_circuit/logic/binary/jklatch - name = "JK latch" - desc = "This gate is a synchronized JK latch." - icon_state = "jklatch" - inputs = list("J" = IC_PINTYPE_ANY,"K" = IC_PINTYPE_ANY) - outputs = list("Q" = IC_PINTYPE_BOOLEAN,"!Q" = IC_PINTYPE_BOOLEAN) - activators = list("pulse in C" = IC_PINTYPE_PULSE_IN, "pulse out Q" = IC_PINTYPE_PULSE_OUT, "pulse out !Q" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/lstate=FALSE - -/obj/item/integrated_circuit/logic/binary/jklatch/do_work() - var/datum/integrated_io/A = inputs[1] - var/datum/integrated_io/B = inputs[2] - var/datum/integrated_io/O = outputs[1] - var/datum/integrated_io/Q = outputs[2] - if(A.data) - if(B.data) - lstate=!lstate - else - lstate = TRUE - else - if(B.data) - lstate=FALSE - O.data = lstate ? TRUE : FALSE - Q.data = !lstate ? TRUE : FALSE - if(get_pin_data(IC_OUTPUT, 1)) - activate_pin(2) - else - activate_pin(3) - push_data() - -/obj/item/integrated_circuit/logic/binary/rslatch - name = "RS latch" - desc = "This gate is a synchronized RS latch. If both R and S are true, its state will not change." - icon_state = "sr_nor" - inputs = list("S" = IC_PINTYPE_ANY,"R" = IC_PINTYPE_ANY) - outputs = list("Q" = IC_PINTYPE_BOOLEAN,"!Q" = IC_PINTYPE_BOOLEAN) - activators = list("pulse in C" = IC_PINTYPE_PULSE_IN, "pulse out Q" = IC_PINTYPE_PULSE_OUT, "pulse out !Q" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/lstate=FALSE - -/obj/item/integrated_circuit/logic/binary/rslatch/do_work() - var/datum/integrated_io/A = inputs[1] - var/datum/integrated_io/B = inputs[2] - var/datum/integrated_io/O = outputs[1] - var/datum/integrated_io/Q = outputs[2] - if(A.data) - if(!B.data) - lstate=TRUE - else - if(B.data) - lstate=FALSE - O.data = lstate ? TRUE : FALSE - Q.data = !lstate ? TRUE : FALSE - if(get_pin_data(IC_OUTPUT, 1)) - activate_pin(2) - else - activate_pin(3) - push_data() - -/obj/item/integrated_circuit/logic/binary/gdlatch - name = "gated D latch" - desc = "This gate is a synchronized gated D latch." - icon_state = "gated_d" - inputs = list("D" = IC_PINTYPE_ANY,"E" = IC_PINTYPE_ANY) - outputs = list("Q" = IC_PINTYPE_BOOLEAN,"!Q" = IC_PINTYPE_BOOLEAN) - activators = list("pulse in C" = IC_PINTYPE_PULSE_IN, "pulse out Q" = IC_PINTYPE_PULSE_OUT, "pulse out !Q" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/lstate=FALSE - -/obj/item/integrated_circuit/logic/binary/gdlatch/do_work() - var/datum/integrated_io/A = inputs[1] - var/datum/integrated_io/B = inputs[2] - var/datum/integrated_io/O = outputs[1] - var/datum/integrated_io/Q = outputs[2] - if(B.data) - if(A.data) - lstate=TRUE - else - lstate=FALSE - - O.data = lstate ? TRUE : FALSE - Q.data = !lstate ? TRUE : FALSE - if(get_pin_data(IC_OUTPUT, 1)) - activate_pin(2) - else - activate_pin(3) - push_data() - -/obj/item/integrated_circuit/logic/binary/not_equals - name = "not equal gate" - desc = "This gate compares two values, and outputs TRUE if both are different." - icon_state = "not_equal" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/logic/binary/not_equals/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) - return A.data != B.data - -/obj/item/integrated_circuit/logic/binary/and - name = "and gate" - desc = "This gate will output TRUE if both inputs evaluate to true." - icon_state = "and" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/logic/binary/and/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) - return A.data && B.data - -/obj/item/integrated_circuit/logic/binary/or - name = "or gate" - desc = "This gate will output TRUE if one of the inputs evaluate to true." - icon_state = "or" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/logic/binary/or/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) - return A.data || B.data - -/obj/item/integrated_circuit/logic/binary/less_than - name = "less than gate" - desc = "This will output TRUE if the first input is less than the second input." - icon_state = "less_than" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/logic/binary/less_than/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) - if(comparable(A, B)) - return A.data < B.data - -/obj/item/integrated_circuit/logic/binary/less_than_or_equal - name = "less than or equal gate" - desc = "This will output TRUE if the first input is less than, or equal to the second input." - icon_state = "less_than_or_equal" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/logic/binary/less_than_or_equal/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) - if(comparable(A, B)) - return A.data <= B.data - -/obj/item/integrated_circuit/logic/binary/greater_than - name = "greater than gate" - desc = "This will output TRUE if the first input is greater than the second input." - icon_state = "greater_than" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/logic/binary/greater_than/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) - if(comparable(A, B)) - return A.data > B.data - -/obj/item/integrated_circuit/logic/binary/greater_than_or_equal - name = "greater than or equal gate" - desc = "This will output TRUE if the first input is greater than, or equal to the second input." - icon_state = "greater_than_or_equal" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/logic/binary/greater_than_or_equal/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) - if(comparable(A, B)) - return A.data >= B.data - -/obj/item/integrated_circuit/logic/unary/not - name = "not gate" - desc = "This gate inverts what's fed into it." - icon_state = "not" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - activators = list("invert" = IC_PINTYPE_PULSE_IN, "on inverted" = IC_PINTYPE_PULSE_OUT) - -/obj/item/integrated_circuit/logic/unary/not/do_check(var/datum/integrated_io/A) - return !A.data diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm deleted file mode 100644 index 13f49e9e68144..0000000000000 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ /dev/null @@ -1,747 +0,0 @@ -/obj/item/integrated_circuit/manipulation - category_text = "Manipulation" - -/obj/item/integrated_circuit/manipulation/weapon_firing - name = "weapon firing mechanism" - desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it." - extended_desc = "The firing mechanism can slot in any energy weapon. \ - The first and second inputs need to be numbers which correspond to coordinates for the gun to fire at relative to the machine itself. \ - The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Mode will switch between \ - lethal (TRUE) or stun (FALSE) modes. It uses the internal battery of the weapon itself, not the assembly. If you wish to fire the gun while the circuit is in \ - hand, you will need to use an assembly that is a gun." - complexity = 20 - max_allowed = 1 - w_class = WEIGHT_CLASS_SMALL - size = 3 - inputs = list( - "target X rel" = IC_PINTYPE_NUMBER, - "target Y rel" = IC_PINTYPE_NUMBER, - "mode" = IC_PINTYPE_BOOLEAN - ) - outputs = list("reference to gun" = IC_PINTYPE_REF) - activators = list( - "fire" = IC_PINTYPE_PULSE_IN - - ) - var/obj/item/gun/energy/installed_gun = null - spawn_flags = IC_SPAWN_RESEARCH - action_flags = IC_ACTION_COMBAT - power_draw_per_use = 0 - ext_cooldown = 1 - var/mode = FALSE - - var/stun_projectile = null //stun mode projectile type - var/stun_projectile_sound - var/lethal_projectile = null //lethal mode projectile type - var/lethal_projectile_sound - - demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby() - - - -/obj/item/integrated_circuit/manipulation/weapon_firing/Destroy() - qdel(installed_gun) - return ..() - -/obj/item/integrated_circuit/manipulation/weapon_firing/attackby(var/obj/O, var/mob/user) - if(istype(O, /obj/item/gun/energy)) - var/obj/item/gun/gun = O - if(installed_gun) - to_chat(user, "There's already a weapon installed.") - return - user.transferItemToLoc(gun,src) - installed_gun = gun - var/list/gun_properties = gun.get_turret_properties() - to_chat(user, "You slide \the [gun] into the firing mechanism.") - playsound(src, 'sound/items/Crowbar.ogg', 50, 1) - stun_projectile = gun_properties["stun_projectile"] - stun_projectile_sound = gun_properties["stun_projectile_sound"] - lethal_projectile = gun_properties["lethal_projectile"] - lethal_projectile_sound = gun_properties["lethal_projectile_sound"] - if(gun_properties["shot_delay"]) - cooldown_per_use = gun_properties["shot_delay"]*10 - if(cooldown_per_use<30) - cooldown_per_use = 30 - if(gun_properties["reqpower"]) - power_draw_per_use = gun_properties["reqpower"] - set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun)) - push_data() - else - ..() - -/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(var/mob/user) - if(installed_gun) - installed_gun.forceMove(drop_location()) - to_chat(user, "You slide \the [installed_gun] out of the firing mechanism.") - size = initial(size) - playsound(src, 'sound/items/Crowbar.ogg', 50, 1) - installed_gun = null - set_pin_data(IC_OUTPUT, 1, WEAKREF(null)) - push_data() - else - to_chat(user, "There's no weapon to remove from the mechanism.") - -/obj/item/integrated_circuit/manipulation/weapon_firing/do_work() - if(!installed_gun || !installed_gun.handle_pins()) - return - if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc))) - return - set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun)) - push_data() - var/datum/integrated_io/xo = inputs[1] - var/datum/integrated_io/yo = inputs[2] - var/datum/integrated_io/mode1 = inputs[3] - - mode = mode1.data - if(assembly) - if(isnum_safe(xo.data)) - xo.data = round(xo.data, 1) - if(isnum_safe(yo.data)) - 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) - - assembly.visible_message("[assembly] fires [installed_gun]!") - shootAt(locate(target_x, target_y, T.z)) - -/obj/item/integrated_circuit/manipulation/weapon_firing/proc/shootAt(turf/target) - var/turf/T = get_turf(src) - var/turf/U = target - if(!istype(T) || !istype(U)) - return - if(!installed_gun.cell) - return - if(!installed_gun.cell.charge) - return - var/obj/item/ammo_casing/energy/shot = installed_gun.ammo_type[mode?2:1] - if(installed_gun.cell.charge < shot.e_cost) - return - if(!shot) - return - update_icon() - var/obj/item/projectile/A - if(!mode) - A = new stun_projectile(T) - playsound(loc, stun_projectile_sound, 75, 1) - else - A = new lethal_projectile(T) - playsound(loc, lethal_projectile_sound, 75, 1) - installed_gun.cell.use(shot.e_cost) - //Shooting Code: - A.preparePixelProjectile(target, src) - A.fire() - log_attack("[assembly] [REF(assembly)] has fired [installed_gun].") - return A - -/obj/item/integrated_circuit/manipulation/locomotion - name = "locomotion circuit" - desc = "This allows a machine to move in a given direction." - icon_state = "locomotion" - extended_desc = "The circuit accepts a 'dir' number as a direction to move towards.
\ - Pulsing the 'step towards dir' activator pin will cause the machine to move one step in that direction, assuming it is not \ - being held, or anchored in some way. It should be noted that the ability to move is dependant on the type of assembly that this circuit inhabits; only drone assemblies can move." - w_class = WEIGHT_CLASS_SMALL - complexity = 10 - max_allowed = 4 - cooldown_per_use = 1 SECONDS - ext_cooldown = 1 SECONDS - inputs = list("direction" = IC_PINTYPE_DIR) - outputs = list("obstacle" = IC_PINTYPE_REF) - activators = list("step towards dir" = IC_PINTYPE_PULSE_IN,"on step"=IC_PINTYPE_PULSE_OUT,"blocked"=IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - action_flags = IC_ACTION_MOVEMENT - power_draw_per_use = 100 - -/obj/item/integrated_circuit/manipulation/locomotion/do_work() - ..() - var/turf/T = get_turf(src) - if(T && assembly) - if(assembly.anchored || !assembly.can_move()) - return - if(assembly.loc == T) // Check if we're held by someone. If the loc is the floor, we're not held. - var/datum/integrated_io/wanted_dir = inputs[1] - if(isnum_safe(wanted_dir.data)) - if(step(assembly, wanted_dir.data)) - activate_pin(2) - return - else - set_pin_data(IC_OUTPUT, 1, WEAKREF(assembly.collw)) - push_data() - activate_pin(3) - return FALSE - return FALSE - -/obj/item/integrated_circuit/manipulation/grenade - name = "grenade primer" - desc = "This circuit comes with the ability to attach most types of grenades and prime them at will." - extended_desc = "The time between priming and detonation is limited to between 1 to 12 seconds, but is optional. \ - If the input is not set, not a number, or a number less than 1, the grenade's built-in timing will be used. \ - Beware: Once primed, there is no aborting the process!" - icon_state = "grenade" - complexity = 30 - max_allowed = 1 - cooldown_per_use = 10 - inputs = list("detonation time" = IC_PINTYPE_NUMBER) - outputs = list("reference to grenade" = IC_PINTYPE_REF) - activators = list("prime grenade" = IC_PINTYPE_PULSE_IN) - spawn_flags = IC_SPAWN_RESEARCH - action_flags = IC_ACTION_COMBAT - var/obj/item/grenade/attached_grenade - var/pre_attached_grenade_type - demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby() - -/obj/item/integrated_circuit/manipulation/grenade/Initialize() - . = ..() - if(pre_attached_grenade_type) - var/grenade = new pre_attached_grenade_type(src) - attach_grenade(grenade) - -/obj/item/integrated_circuit/manipulation/grenade/Destroy() - if(attached_grenade && !attached_grenade.active) - attached_grenade.forceMove(loc) - detach_grenade() - return ..() - -/obj/item/integrated_circuit/manipulation/grenade/attackby(var/obj/item/grenade/G, var/mob/user) - if(istype(G)) - if(attached_grenade) - to_chat(user, "There is already a grenade attached!") - else if(user.transferItemToLoc(G,src)) - user.visible_message("\The [user] attaches \a [G] to \the [src]!", "You attach \the [G] to \the [src].") - attach_grenade(G) - G.forceMove(src) - else - return ..() - -/obj/item/integrated_circuit/manipulation/grenade/attack_self(var/mob/user) - if(attached_grenade) - user.visible_message("\The [user] removes \an [attached_grenade] from \the [src]!", "You remove \the [attached_grenade] from \the [src].") - user.put_in_hands(attached_grenade) - detach_grenade() - else - return ..() - -/obj/item/integrated_circuit/manipulation/grenade/do_work() - if(attached_grenade && !attached_grenade.active) - var/datum/integrated_io/detonation_time = inputs[1] - var/dt - if(isnum_safe(detonation_time.data) && detonation_time.data > 0) - dt = CLAMP(detonation_time.data, 1, 12)*10 - else - dt = 15 - addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/prime), dt) - var/atom/holder = loc - message_admins("activated a grenade assembly. Last touches: Assembly: [holder.fingerprintslast] Circuit: [fingerprintslast] Grenade: [attached_grenade.fingerprintslast]") - -// These procs do not relocate the grenade, that's the callers responsibility -/obj/item/integrated_circuit/manipulation/grenade/proc/attach_grenade(var/obj/item/grenade/G) - attached_grenade = G - G.forceMove(src) - desc += " \An [attached_grenade] is attached to it!" - set_pin_data(IC_OUTPUT, 1, WEAKREF(G)) - -/obj/item/integrated_circuit/manipulation/grenade/proc/detach_grenade() - if(!attached_grenade) - return - attached_grenade.forceMove(drop_location()) - set_pin_data(IC_OUTPUT, 1, WEAKREF(null)) - attached_grenade = null - desc = initial(desc) - -/obj/item/integrated_circuit/manipulation/plant_module - name = "plant manipulation module" - desc = "Used to uproot weeds and harvest/plant trays." - icon_state = "plant_m" - extended_desc = "The circuit accepts a reference to a hydroponic tray or an item on an adjacent tile. \ - Mode input (0-harvest, 1-uproot weeds, 2-uproot plant, 3-plant seed) determines action. \ - Harvesting outputs a list of the harvested plants." - w_class = WEIGHT_CLASS_TINY - complexity = 10 - inputs = list("tray" = IC_PINTYPE_REF,"mode" = IC_PINTYPE_NUMBER,"item" = IC_PINTYPE_REF) - outputs = list("result" = IC_PINTYPE_LIST) - activators = list("pulse in" = IC_PINTYPE_PULSE_IN,"pulse out" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 50 - -/obj/item/integrated_circuit/manipulation/plant_module/do_work() - ..() - var/obj/acting_object = get_object() - var/obj/OM = get_pin_data_as_type(IC_INPUT, 1, /obj) - var/obj/O = get_pin_data_as_type(IC_INPUT, 3, /obj/item) - - if(!check_target(OM)) - push_data() - activate_pin(2) - return - - if(istype(OM,/obj/structure/spacevine) && check_target(OM) && get_pin_data(IC_INPUT, 2) == 2) - qdel(OM) - push_data() - activate_pin(2) - return - - var/obj/machinery/hydroponics/TR = OM - if(istype(TR)) - switch(get_pin_data(IC_INPUT, 2)) - if(0) - var/list/harvest_output = TR.attack_hand() - for(var/i in 1 to length(harvest_output)) - harvest_output[i] = WEAKREF(harvest_output[i]) - - if(length(harvest_output)) - set_pin_data(IC_OUTPUT, 1, harvest_output) - push_data() - if(1) - TR.weedlevel = 0 - TR.update_icon() - if(2) - if(TR.myseed) //Could be that they're just using it as a de-weeder - TR.age = 0 - TR.plant_health = 0 - if(TR.harvest) - TR.harvest = FALSE //To make sure they can't just put in another seed and insta-harvest it - qdel(TR.myseed) - TR.myseed = null - TR.weedlevel = 0 //Has a side effect of cleaning up those nasty weeds - TR.dead = 0 - TR.update_icon() - if(3) - if(!check_target(O)) - activate_pin(2) - return FALSE - - else if(istype(O, /obj/item/seeds) && !istype(O, /obj/item/seeds/sample)) - if(!TR.myseed) - if(istype(O, /obj/item/seeds/kudzu)) - investigate_log("had Kudzu planted in it by [acting_object] at [AREACOORD(src)]","kudzu") - acting_object.visible_message("[acting_object] plants [O].") - TR.dead = 0 - TR.myseed = O - TR.age = 1 - TR.plant_health = TR.myseed.endurance - TR.lastcycle = world.time - O.forceMove(TR) - TR.update_icon() - activate_pin(2) - -/obj/item/integrated_circuit/manipulation/seed_extractor - name = "seed extractor module" - desc = "Used to extract seeds from grown produce." - icon_state = "plant_m" - extended_desc = "The circuit accepts a reference to a plant item and extracts seeds from it, outputting the results to a list." - complexity = 8 - inputs = list("target" = IC_PINTYPE_REF) - outputs = list("result" = IC_PINTYPE_LIST) - activators = list("pulse in" = IC_PINTYPE_PULSE_IN,"pulse out" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 50 - -/obj/item/integrated_circuit/manipulation/seed_extractor/do_work() - ..() - var/obj/O = get_pin_data_as_type(IC_INPUT, 1, /obj/item) - if(!check_target(O)) - push_data() - activate_pin(2) - return - - var/list/seed_output = seedify(O, -1) - for(var/i in 1 to length(seed_output)) - seed_output[i] = WEAKREF(seed_output[i]) - - if(seed_output.len) - set_pin_data(IC_OUTPUT, 1, seed_output) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/manipulation/grabber - name = "grabber" - desc = "A circuit with its own inventory for items. Used to grab and store things." - icon_state = "grabber" - extended_desc = "This circuit accepts a reference to an object to be grabbed, and can store up to 10 objects. Modes: 1 to grab, 0 to eject the first object, -1 to eject all objects, and -2 to eject the target. If you throw something from a grabber's inventory with a thrower, the grabber will update its outputs accordingly." - w_class = WEIGHT_CLASS_SMALL - size = 3 - cooldown_per_use = 5 - complexity = 10 - max_allowed = 1 - inputs = list("target" = IC_PINTYPE_REF,"mode" = IC_PINTYPE_NUMBER) - outputs = list("first" = IC_PINTYPE_REF, "last" = IC_PINTYPE_REF, "amount" = IC_PINTYPE_NUMBER,"contents" = IC_PINTYPE_LIST) - activators = list("pulse in" = IC_PINTYPE_PULSE_IN,"pulse out" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - action_flags = IC_ACTION_COMBAT - power_draw_per_use = 50 - var/max_items = 10 - -/obj/item/integrated_circuit/manipulation/grabber/do_work() - //There shouldn't be any target required to eject all contents - var/mode = get_pin_data(IC_INPUT, 2) - switch(mode) - if(-1) - drop_all() - if(0) - if(contents.len) - drop(contents[1]) - - var/obj/item/AM = get_pin_data_as_type(IC_INPUT, 1, /obj/item) - if(!QDELETED(AM) && !istype(AM, /obj/item/electronic_assembly) && !istype(AM, /obj/item/transfer_valve) && !istype(AM, /obj/item/twohanded) && !istype(assembly.loc, /obj/item/implant/storage)) - switch(mode) - if(1) - grab(AM) - if(-2) - drop(AM) - update_outputs() - activate_pin(2) - -/obj/item/integrated_circuit/manipulation/grabber/proc/grab(obj/item/AM) - var/max_w_class = assembly.w_class - if(check_target(AM)) - if(contents.len < max_items && AM.w_class <= max_w_class) - var/atom/A = get_object() - A.investigate_log("picked up ([AM]) with [src].", INVESTIGATE_CIRCUIT) - AM.forceMove(src) - -/obj/item/integrated_circuit/manipulation/grabber/proc/drop(obj/item/AM, turf/T = drop_location()) - if(!(AM in contents)) - return - var/atom/A = get_object() - A.investigate_log("dropped ([AM]) from [src].", INVESTIGATE_CIRCUIT) - AM.forceMove(T) - -/obj/item/integrated_circuit/manipulation/grabber/proc/drop_all() - if(contents.len) - var/turf/T = drop_location() - var/obj/item/U - for(U in src) - drop(U, T) - -/obj/item/integrated_circuit/manipulation/grabber/proc/update_outputs() - if(contents.len) - set_pin_data(IC_OUTPUT, 1, WEAKREF(contents[1])) - set_pin_data(IC_OUTPUT, 2, WEAKREF(contents[contents.len])) - else - set_pin_data(IC_OUTPUT, 1, null) - set_pin_data(IC_OUTPUT, 2, null) - set_pin_data(IC_OUTPUT, 3, contents.len) - set_pin_data(IC_OUTPUT, 4, contents) - push_data() - -/obj/item/integrated_circuit/manipulation/grabber/attack_self(var/mob/user) - drop_all() - update_outputs() - push_data() - -/obj/item/integrated_circuit/manipulation/claw - name = "pulling claw" - desc = "Circuit which can pull things.." - icon_state = "pull_claw" - extended_desc = "This circuit accepts a reference to a thing to be pulled. Modes: 0 for release. 1 for pull." - w_class = WEIGHT_CLASS_SMALL - size = 3 - cooldown_per_use = 5 - max_allowed = 1 - complexity = 10 - inputs = list("target" = IC_PINTYPE_REF,"mode" = IC_PINTYPE_INDEX,"dir" = IC_PINTYPE_DIR) - outputs = list("is pulling" = IC_PINTYPE_BOOLEAN) - activators = list("pulse in" = IC_PINTYPE_PULSE_IN,"pulse out" = IC_PINTYPE_PULSE_OUT,"released" = IC_PINTYPE_PULSE_OUT,"pull to dir" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 50 - ext_cooldown = 1 - var/max_grab = GRAB_PASSIVE - -/obj/item/integrated_circuit/manipulation/claw/do_work(ord) - var/obj/acting_object = get_object() - var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) - var/mode = get_pin_data(IC_INPUT, 2) - switch(ord) - if(1) - 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) - acting_object.start_pulling(AM,mode) - if(acting_object.pulling) - set_pin_data(IC_OUTPUT, 1, TRUE) - else - set_pin_data(IC_OUTPUT, 1, FALSE) - push_data() - - if(4) - if(acting_object.pulling) - var/dir = get_pin_data(IC_INPUT, 3) - var/turf/G =get_step(get_turf(acting_object),dir) - var/atom/movable/pullee = acting_object.pulling - var/turf/Pl = get_turf(pullee) - var/turf/F = get_step_towards(Pl,G) - if(acting_object.Adjacent(F)) - if(!step_towards(pullee, F)) - F = get_step_towards2(Pl,G) - if(acting_object.Adjacent(F)) - step_towards(pullee, F) - activate_pin(2) - -/obj/item/integrated_circuit/manipulation/claw/stop_pulling() - set_pin_data(IC_OUTPUT, 1, FALSE) - activate_pin(3) - push_data() - ..() - - - - -/obj/item/integrated_circuit/manipulation/matman - name = "material manager" - desc = "This circuit is designed for automatic storage and distribution of materials." - extended_desc = "The first input takes a ref of a machine with a material container. \ - Second input is used for inserting material stacks into the internal material storage. \ - Inputs 3-13 are used to transfer materials between target machine and circuit storage. \ - Positive values will take that number of materials from another machine. \ - Negative values will fill another machine from internal storage. Outputs show current stored amounts of mats." - icon_state = "grabber" - complexity = 16 - inputs = list( - "target" = IC_PINTYPE_REF, - "sheets to insert" = IC_PINTYPE_NUMBER, - "Iron" = IC_PINTYPE_NUMBER, - "Glass" = IC_PINTYPE_NUMBER, - "Silver" = IC_PINTYPE_NUMBER, - "Gold" = IC_PINTYPE_NUMBER, - "Diamond" = IC_PINTYPE_NUMBER, - "Uranium" = IC_PINTYPE_NUMBER, - "Solid Plasma" = IC_PINTYPE_NUMBER, - "Bluespace Mesh" = IC_PINTYPE_NUMBER, - "Bananium" = IC_PINTYPE_NUMBER, - "Titanium" = IC_PINTYPE_NUMBER, - ) - outputs = list( - "self ref" = IC_PINTYPE_REF, - "Total amount" = IC_PINTYPE_NUMBER, - "Iron" = IC_PINTYPE_NUMBER, - "Glass" = IC_PINTYPE_NUMBER, - "Silver" = IC_PINTYPE_NUMBER, - "Gold" = IC_PINTYPE_NUMBER, - "Diamond" = IC_PINTYPE_NUMBER, - "Uranium" = IC_PINTYPE_NUMBER, - "Solid Plasma" = IC_PINTYPE_NUMBER, - "Bluespace Mesh" = IC_PINTYPE_NUMBER, - "Bananium" = IC_PINTYPE_NUMBER, - "Titanium" = IC_PINTYPE_NUMBER - ) - activators = list( - "insert sheet" = IC_PINTYPE_PULSE_IN, - "transfer mats" = IC_PINTYPE_PULSE_IN, - "on success" = IC_PINTYPE_PULSE_OUT, - "on failure" = IC_PINTYPE_PULSE_OUT, - "push ref" = IC_PINTYPE_PULSE_IN, - "on push ref" = IC_PINTYPE_PULSE_IN - ) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 40 - ext_cooldown = 1 - cooldown_per_use = 10 - var/list/mtypes = list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace) - -/obj/item/integrated_circuit/manipulation/matman/Initialize() - var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, - list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace), 0, - FALSE, /obj/item/stack, CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) - materials.max_amount =100000 - materials.precise_insertion = TRUE - .=..() - -/obj/item/integrated_circuit/manipulation/matman/proc/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted) - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - set_pin_data(IC_OUTPUT, 2, materials.total_amount) - for(var/I in 1 to mtypes.len) - var/amount = materials.materials[mtypes[I]] - if(amount) - set_pin_data(IC_OUTPUT, I+2, amount) - push_data() - -/obj/item/integrated_circuit/manipulation/matman/proc/is_insertion_ready(mob/user) - return TRUE - -/obj/item/integrated_circuit/manipulation/matman/do_work(ord) - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - var/atom/movable/H = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) - if(!check_target(H)) - activate_pin(4) - return - var/turf/T = get_turf(H) - switch(ord) - if(1) - var/obj/item/stack/sheet/S = H - if(!S) - activate_pin(4) - return - if(materials.insert_stack(S, CLAMP(get_pin_data(IC_INPUT, 2),0,100), multiplier = 1) ) - AfterMaterialInsert() - activate_pin(3) - else - activate_pin(4) - if(2) - var/datum/component/material_container/mt = H.GetComponent(/datum/component/material_container) - var/suc - 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) - if(!U) - continue - if(!mt) //Invalid input - if(U>0) - if(materials.retrieve_sheets(materials.amount2sheet(U), mtypes[I], T)) - suc = TRUE - else - if(mt.transer_amt_to(materials, U, mtypes[I])) - suc = TRUE - if(suc) - AfterMaterialInsert() - activate_pin(3) - else - activate_pin(4) - if(5) - set_pin_data(IC_OUTPUT, 1, WEAKREF(src)) - AfterMaterialInsert() - activate_pin(6) - -/obj/item/integrated_circuit/manipulation/matman/Destroy() - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - materials.retrieve_all() - .=..() - - - - -// - inserter circuit - // -/obj/item/integrated_circuit/manipulation/inserter - name = "inserter" - desc = "A nimble circuit that puts stuff inside a storage like a backpack and can take it out aswell." - icon_state = "grabber" - extended_desc = "This circuit accepts a reference to an object to be inserted or extracted depending on mode. If a storage is given for extraction, the extracted item will be put in the new storage. Modes: 1 insert, 0 to extract." - w_class = WEIGHT_CLASS_SMALL - size = 3 - cooldown_per_use = 5 - complexity = 10 - inputs = list("target object" = IC_PINTYPE_REF, "target container" = IC_PINTYPE_REF,"mode" = IC_PINTYPE_NUMBER) - activators = list("pulse in" = IC_PINTYPE_PULSE_IN,"pulse out" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - action_flags = IC_ACTION_COMBAT - power_draw_per_use = 20 - var/max_items = 10 - -/obj/item/integrated_circuit/manipulation/inserter/do_work() - //There shouldn't be any target required to eject all contents - var/obj/item/target_obj = get_pin_data_as_type(IC_INPUT, 1, /obj/item) - if(!target_obj) - return - - var/distance = get_dist(get_turf(src),get_turf(target_obj)) - if(distance > 1 || distance < 0) - return - - var/obj/item/storage/container = get_pin_data_as_type(IC_INPUT, 2, /obj/item) - var/mode = get_pin_data(IC_INPUT, 3) - switch(mode) - if(1) //Not working - if(!container || !istype(container,/obj/item/storage) || !Adjacent(container)) - return - - var/datum/component/storage/STR = container.GetComponent(/datum/component/storage) - if(!STR) - return - - STR.attackby(src, target_obj) - - else - var/datum/component/storage/STR = target_obj.loc.GetComponent(/datum/component/storage) - if(!STR) - return - - if(!container || !istype(container,/obj/item/storage) || !Adjacent(container)) - STR.remove_from_storage(target_obj,drop_location()) - else - STR.remove_from_storage(target_obj,container) - -// Renamer circuit. Renames the assembly it is in. Useful in cooperation with telecomms-based circuits. -/obj/item/integrated_circuit/manipulation/renamer - name = "renamer" - desc = "A small circuit that renames the assembly it is in. Useful paired with speech-based circuits." - icon_state = "internalbm" - extended_desc = "This circuit accepts a string as input, and can be pulsed to rewrite the current assembly's name with said string. On success, it pulses the default pulse-out wire." - inputs = list("name" = IC_PINTYPE_STRING) - outputs = list("current name" = IC_PINTYPE_STRING) - activators = list("rename" = IC_PINTYPE_PULSE_IN,"get name" = IC_PINTYPE_PULSE_IN,"pulse out" = IC_PINTYPE_PULSE_OUT) - power_draw_per_use = 1 - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/manipulation/renamer/do_work(var/n) - if(!assembly) - return - switch(n) - if(1) - var/new_name = get_pin_data(IC_INPUT, 1) - if(new_name) - assembly.name = new_name - - else - set_pin_data(IC_OUTPUT, 1, assembly.name) - push_data() - - activate_pin(3) - - - -// - redescribing circuit - // -/obj/item/integrated_circuit/manipulation/redescribe - name = "redescriber" - desc = "Takes any string as an input and will set it as the assembly's description." - extended_desc = "Strings should can be of any length." - icon_state = "speaker" - cooldown_per_use = 10 - complexity = 3 - inputs = list("text" = IC_PINTYPE_STRING) - outputs = list("description" = IC_PINTYPE_STRING) - activators = list("redescribe" = IC_PINTYPE_PULSE_IN,"get description" = IC_PINTYPE_PULSE_IN,"pulse out" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/manipulation/redescribe/do_work(var/n) - if(!assembly) - return - - switch(n) - if(1) - assembly.desc = get_pin_data(IC_INPUT, 1) - - else - set_pin_data(IC_OUTPUT, 1, assembly.desc) - push_data() - - activate_pin(3) - -// - repainting circuit - // -/obj/item/integrated_circuit/manipulation/repaint - name = "auto-repainter" - desc = "There's an oddly high amount of spraying cans fitted right inside this circuit." - extended_desc = "Takes a value in hexadecimal and uses it to repaint the assembly it is in." - cooldown_per_use = 10 - complexity = 3 - inputs = list("color" = IC_PINTYPE_COLOR) - outputs = list("current color" = IC_PINTYPE_COLOR) - activators = list("repaint" = IC_PINTYPE_PULSE_IN,"get color" = IC_PINTYPE_PULSE_IN,"pulse out" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/manipulation/repaint/do_work(var/n) - if(!assembly) - return - - switch(n) - if(1) - assembly.detail_color = get_pin_data(IC_INPUT, 1) - assembly.update_icon() - - else - set_pin_data(IC_OUTPUT, 1, assembly.detail_color) - push_data() - - activate_pin(3) diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm deleted file mode 100644 index 0392f92e5ac3b..0000000000000 --- a/code/modules/integrated_electronics/subtypes/memory.dm +++ /dev/null @@ -1,140 +0,0 @@ -/obj/item/integrated_circuit/memory - name = "memory chip" - desc = "This tiny chip can store one piece of data." - icon_state = "memory" - complexity = 1 - inputs = list() - outputs = list() - activators = list("set" = IC_PINTYPE_PULSE_IN, "on set" = IC_PINTYPE_PULSE_OUT) - category_text = "Memory" - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 1 - var/number_of_pins = 1 - -/obj/item/integrated_circuit/memory/Initialize() - for(var/i = 1 to number_of_pins) - inputs["input [i]"] = IC_PINTYPE_ANY // This is just a string since pins don't get built until ..() is called. - outputs["output [i]"] = IC_PINTYPE_ANY - complexity = number_of_pins - . = ..() - -/obj/item/integrated_circuit/memory/examine(mob/user) - ..() - var/i - for(i = 1, i <= outputs.len, i++) - var/datum/integrated_io/O = outputs[i] - var/data = "nothing" - if(isweakref(O.data)) - var/datum/d = O.data_as_type(/datum) - if(d) - data = "[d]" - else if(!isnull(O.data)) - data = O.data - to_chat(user, "\The [src] has [data] saved to address [i].") - -/obj/item/integrated_circuit/memory/do_work() - for(var/i = 1 to inputs.len) - var/datum/integrated_io/I = inputs[i] - var/datum/integrated_io/O = outputs[i] - O.data = I.data - O.push_data() - activate_pin(2) - -/obj/item/integrated_circuit/memory/tiny - name = "small memory circuit" - desc = "This circuit can store two pieces of data." - icon_state = "memory4" - power_draw_per_use = 2 - number_of_pins = 2 - -/obj/item/integrated_circuit/memory/medium - name = "medium memory circuit" - desc = "This circuit can store four pieces of data." - icon_state = "memory4" - power_draw_per_use = 2 - number_of_pins = 4 - -/obj/item/integrated_circuit/memory/large - name = "large memory circuit" - desc = "This big circuit can store eight pieces of data." - icon_state = "memory8" - power_draw_per_use = 4 - number_of_pins = 8 - -/obj/item/integrated_circuit/memory/huge - name = "large memory stick" - desc = "This stick of memory can store up up to sixteen pieces of data." - icon_state = "memory16" - w_class = WEIGHT_CLASS_SMALL - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 8 - number_of_pins = 16 - -/obj/item/integrated_circuit/memory/constant - name = "constant chip" - desc = "This tiny chip can store one piece of data, which cannot be overwritten without disassembly." - icon_state = "memory" - inputs = list() - outputs = list("output pin" = IC_PINTYPE_ANY) - activators = list("push data" = IC_PINTYPE_PULSE_IN) - var/accepting_refs = FALSE - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - number_of_pins = 0 - -/obj/item/integrated_circuit/memory/constant/do_work() - var/datum/integrated_io/O = outputs[1] - O.push_data() - -/obj/item/integrated_circuit/memory/constant/emp_act() - for(var/i in 1 to activators.len) - var/datum/integrated_io/activate/A = activators[i] - A.scramble() - -/obj/item/integrated_circuit/memory/constant/save_special() - var/datum/integrated_io/O = outputs[1] - if(istext(O.data) || isnum_safe(O.data)) - return O.data - -/obj/item/integrated_circuit/memory/constant/load_special(special_data) - var/datum/integrated_io/O = outputs[1] - if(istext(special_data) || isnum_safe(special_data)) - O.data = special_data - -/obj/item/integrated_circuit/memory/constant/attack_self(mob/user) - var/datum/integrated_io/O = outputs[1] - if(!user.IsAdvancedToolUser()) - return - var/type_to_use = input("Please choose a type to use.","[src] type setting") as null|anything in list("string","number","ref", "null") - - var/new_data = null - switch(type_to_use) - if("string") - accepting_refs = FALSE - new_data = input("Now type in a string.","[src] string writing") as null|text - if(istext(new_data) && user.IsAdvancedToolUser()) - O.data = new_data - to_chat(user, "You set \the [src]'s memory to [O.display_data(O.data)].") - if("number") - accepting_refs = FALSE - new_data = input("Now type in a number.","[src] number writing") as null|num - if(isnum_safe(new_data) && user.IsAdvancedToolUser()) - O.data = new_data - to_chat(user, "You set \the [src]'s memory to [O.display_data(O.data)].") - if("ref") - accepting_refs = TRUE - to_chat(user, "You turn \the [src]'s ref scanner on. Slide it across \ - an object for a ref of that object to save it in memory.") - if("null") - O.data = null - to_chat(user, "You set \the [src]'s memory to absolutely nothing.") - -/obj/item/integrated_circuit/memory/constant/afterattack(atom/target, mob/living/user, proximity) - . = ..() - if(accepting_refs && proximity) - var/datum/integrated_io/O = outputs[1] - O.data = WEAKREF(target) - visible_message("[user] slides \a [src]'s over \the [target].") - to_chat(user, "You set \the [src]'s memory to a reference to [O.display_data(O.data)]. The ref scanner is \ - now off.") - accepting_refs = FALSE - diff --git a/code/modules/integrated_electronics/subtypes/mining.dm b/code/modules/integrated_electronics/subtypes/mining.dm deleted file mode 100644 index 3dc9a45118c55..0000000000000 --- a/code/modules/integrated_electronics/subtypes/mining.dm +++ /dev/null @@ -1,105 +0,0 @@ -/obj/item/integrated_circuit/mining/ore_analyzer - name = "ore analyzer" - desc = "Analyzes a rock for its ore type." - extended_desc = "Takes a reference for an object and checks if it is a rock first. If that is the case, it outputs the mineral \ - inside the rock." - category_text = "Mining" - ext_cooldown = 1 - complexity = 20 - cooldown_per_use = 1 SECONDS - inputs = list( - "rock" = IC_PINTYPE_REF - ) - outputs = list( - "ore type" = IC_PINTYPE_STRING, - "amount" = IC_PINTYPE_NUMBER - ) - activators = list( - "analyze" = IC_PINTYPE_PULSE_IN, - "on analyzed" = IC_PINTYPE_PULSE_OUT, - "on found" = IC_PINTYPE_PULSE_OUT - ) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 20 - var/turf/closed/mineral/rock - var/mineral - - -/obj/item/integrated_circuit/mining/ore_analyzer/do_work() - rock = get_pin_data(IC_INPUT, 1) - if(!istype(rock,/turf/closed/mineral)) - mineral = null - set_pin_data(IC_OUTPUT, 1, null) - set_pin_data(IC_OUTPUT, 2, null) - - push_data() - activate_pin(2) - return - - if(rock.mineralType) - mineral = "[rock.mineralType]" - mineral = copytext(mineral, findlasttextEx(mineral, "/")+1) - else - mineral = "rock" - - set_pin_data(IC_OUTPUT, 1, mineral) - set_pin_data(IC_OUTPUT, 2, rock.mineralAmt) - push_data() - - activate_pin(2) - activate_pin(3) - - -/obj/item/integrated_circuit/mining/mining_drill - name = "mining drill" - desc = "A mining drill that can drill through rocks." - extended_desc = "A mining drill that activates on sensing a mineable rock. It takes some time to get the job done and \ - has to not be moved during that time." - category_text = "Mining" - ext_cooldown = 1 - complexity = 20 - cooldown_per_use = 3 SECONDS - inputs = list( - "rock" = IC_PINTYPE_REF - ) - outputs = list() - activators = list( - "mine" = IC_PINTYPE_PULSE_IN, - "on success" = IC_PINTYPE_PULSE_OUT, - "on failure" = IC_PINTYPE_PULSE_OUT - ) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 100 - - var/busy = FALSE - var/usedx - var/usedy - var/turf/closed/mineral/rock - -/obj/item/integrated_circuit/mining/mining_drill/do_work() - rock = get_pin_data(IC_INPUT, 1) - - if(!rock) - activate_pin(3) - return - if(!(ismineralturf(rock) && rock.Adjacent(assembly)) || busy) - activate_pin(3) - return - - busy = TRUE - usedx = assembly.loc.x - usedy = assembly.loc.y - playsound(src, 'sound/items/drill_use.ogg',50,1) - addtimer(CALLBACK(src, .proc/drill), 50) - - -/obj/item/integrated_circuit/mining/mining_drill/proc/drill() - busy = FALSE - // The assembly was moved, hence stopping the mining OR the rock was mined before - if(usedx != assembly.loc.x || usedy != assembly.loc.y || !rock) - activate_pin(3) - return FALSE - - activate_pin(2) - rock.gets_drilled() - return(TRUE) diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm deleted file mode 100644 index 04d5f6e67a3f4..0000000000000 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ /dev/null @@ -1,496 +0,0 @@ -/obj/item/integrated_circuit/output - category_text = "Output" - speech_span = SPAN_ROBOT - -/obj/item/integrated_circuit/output/screen - name = "small screen" - extended_desc = " use <br> to start a new line" - desc = "Takes any data type as an input, and displays it to the user upon examining." - icon_state = "screen" - inputs = list("displayed data" = IC_PINTYPE_ANY) - outputs = list() - activators = list("load data" = IC_PINTYPE_PULSE_IN) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 10 - var/eol = "<br>" - var/stuff_to_display = null - -/obj/item/integrated_circuit/output/screen/disconnect_all() - ..() - stuff_to_display = null - -/obj/item/integrated_circuit/output/screen/any_examine(mob/user) - var/shown_label = "" - if(displayed_name && displayed_name != name) - shown_label = " labeled '[displayed_name]'" - - to_chat(user, "There is \a [src][shown_label], which displays [!isnull(stuff_to_display) ? "'[stuff_to_display]'" : "nothing"].") - -/obj/item/integrated_circuit/output/screen/do_work() - var/datum/integrated_io/I = inputs[1] - if(isweakref(I.data)) - var/datum/d = I.data_as_type(/datum) - if(d) - stuff_to_display = "[d]" - else - stuff_to_display = replacetext("[I.data]", eol , "
") - -/obj/item/integrated_circuit/output/screen/large - name = "large screen" - desc = "Takes any data type as an input and displays it to anybody near the device when pulsed. \ - It can also be examined to see the last thing it displayed." - icon_state = "screen_medium" - power_draw_per_use = 20 - -/obj/item/integrated_circuit/output/screen/large/do_work() - ..() - - if(isliving(assembly.loc))//this whole block just returns if the assembly is neither in a mobs hands or on the ground - var/mob/living/H = assembly.loc - if(H.get_active_held_item() != assembly && H.get_inactive_held_item() != assembly) - return - else - if(!isturf(assembly.loc)) - return - - var/list/nearby_things = range(0, get_turf(src)) - for(var/mob/M in nearby_things) - var/obj/O = assembly ? assembly : src - to_chat(M, "[icon2html(O.icon, world, O.icon_state)] [stuff_to_display]") - if(assembly) - assembly.investigate_log("displayed \"[html_encode(stuff_to_display)]\" with [type].", INVESTIGATE_CIRCUIT) - else - investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT) - -/obj/item/integrated_circuit/output/light - name = "light" - desc = "A basic light which can be toggled on/off when pulsed." - icon_state = "light" - complexity = 4 - max_allowed = 4 - inputs = list() - outputs = list() - activators = list("toggle light" = IC_PINTYPE_PULSE_IN) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/light_toggled = 0 - var/light_brightness = 3 - var/light_rgb = "#FFFFFF" - power_draw_idle = 0 // Adjusted based on brightness. - -/obj/item/integrated_circuit/output/light/do_work() - light_toggled = !light_toggled - update_lighting() - -/obj/item/integrated_circuit/output/light/proc/update_lighting() - if(light_toggled) - if(assembly) - assembly.set_light(l_range = light_brightness, l_power = 1, l_color = light_rgb) - else - if(assembly) - assembly.set_light(0) - power_draw_idle = light_toggled ? light_brightness * 2 : 0 - -/obj/item/integrated_circuit/output/light/power_fail() // Turns off the flashlight if there's no power left. - light_toggled = FALSE - update_lighting() - -/obj/item/integrated_circuit/output/light/advanced - name = "advanced light" - desc = "A light that takes a hexadecimal color value and a brightness value, and can be toggled on/off by pulsing it." - icon_state = "light_adv" - complexity = 8 - inputs = list( - "color" = IC_PINTYPE_COLOR, - "brightness" = IC_PINTYPE_NUMBER - ) - outputs = list() - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/output/light/advanced/on_data_written() - update_lighting() - -/obj/item/integrated_circuit/output/light/advanced/update_lighting() - var/new_color = get_pin_data(IC_INPUT, 1) - var/brightness = get_pin_data(IC_INPUT, 2) - - if(new_color && isnum_safe(brightness)) - brightness = CLAMP(brightness, 0, 4) - light_rgb = new_color - light_brightness = brightness - - ..() - -/obj/item/integrated_circuit/output/sound - name = "speaker circuit" - desc = "A miniature speaker is attached to this component." - icon_state = "speaker" - complexity = 8 - cooldown_per_use = 4 SECONDS - inputs = list( - "sound ID" = IC_PINTYPE_STRING, - "volume" = IC_PINTYPE_NUMBER, - "frequency" = IC_PINTYPE_BOOLEAN - ) - max_allowed = 5 - outputs = list() - activators = list("play sound" = IC_PINTYPE_PULSE_IN) - power_draw_per_use = 10 - var/list/sounds = list() - -/obj/item/integrated_circuit/output/sound/Initialize() - .= ..() - extended_desc = list() - extended_desc += "The first input pin determines which sound is used. The choices are; " - extended_desc += jointext(sounds, ", ") - extended_desc += ". The second pin determines the volume of sound that is played" - extended_desc += ", and the third determines if the frequency of the sound will vary with each activation." - extended_desc = jointext(extended_desc, null) - -/obj/item/integrated_circuit/output/sound/do_work() - var/ID = get_pin_data(IC_INPUT, 1) - var/vol = get_pin_data(IC_INPUT, 2) - var/freq = get_pin_data(IC_INPUT, 3) - if(!isnull(ID) && !isnull(vol)) - var/selected_sound = sounds[ID] - if(!selected_sound) - return - 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) - -/obj/item/integrated_circuit/output/sound/on_data_written() - power_draw_per_use = get_pin_data(IC_INPUT, 2) * 15 - -/obj/item/integrated_circuit/output/sound/beeper - name = "beeper circuit" - desc = "Takes a sound name as an input, and will play said sound when pulsed. This circuit has a variety of beeps, boops, and buzzes to choose from." - sounds = list( - "beep" = 'sound/machines/twobeep.ogg', - "chime" = 'sound/machines/chime.ogg', - "buzz sigh" = 'sound/machines/buzz-sigh.ogg', - "buzz twice" = 'sound/machines/buzz-two.ogg', - "ping" = 'sound/machines/ping.ogg', - "synth yes" = 'sound/machines/synth_yes.ogg', - "synth no" = 'sound/machines/synth_no.ogg', - "warning buzz" = 'sound/machines/warning-buzzer.ogg' - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/output/sound/beepsky - name = "securitron sound circuit" - desc = "Takes a sound name as an input, and will play said sound when pulsed. This circuit is similar to those used in Securitrons." - sounds = list( - "creep" = 'sound/voice/beepsky/creep.ogg', - "criminal" = 'sound/voice/beepsky/criminal.ogg', - "freeze" = 'sound/voice/beepsky/freeze.ogg', - "god" = 'sound/voice/beepsky/god.ogg', - "i am the law" = 'sound/voice/beepsky/iamthelaw.ogg', - "insult" = 'sound/voice/beepsky/insult.ogg', - "radio" = 'sound/voice/beepsky/radio.ogg', - "secure day" = 'sound/voice/beepsky/secureday.ogg', - ) - spawn_flags = IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/output/sound/medbot - name = "medbot sound circuit" - desc = "Takes a sound name as an input, and will play said sound when pulsed. This circuit is often found in medical robots." - sounds = list( - "surgeon" = 'sound/voice/medbot/surgeon.ogg', - "radar" = 'sound/voice/medbot/radar.ogg', - "feel better" = 'sound/voice/medbot/feelbetter.ogg', - "patched up" = 'sound/voice/medbot/patchedup.ogg', - "injured" = 'sound/voice/medbot/injured.ogg', - "insult" = 'sound/voice/medbot/insult.ogg', - "coming" = 'sound/voice/medbot/coming.ogg', - "help" = 'sound/voice/medbot/help.ogg', - "live" = 'sound/voice/medbot/live.ogg', - "lost" = 'sound/voice/medbot/lost.ogg', - "flies" = 'sound/voice/medbot/flies.ogg', - "catch" = 'sound/voice/medbot/catch.ogg', - "delicious" = 'sound/voice/medbot/delicious.ogg', - "apple" = 'sound/voice/medbot/apple.ogg', - "no" = 'sound/voice/medbot/no.ogg', - ) - spawn_flags = IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/output/sound/vox - name = "ai vox sound circuit" - desc = "Takes a sound name as an input, and will play said sound when pulsed. This circuit is often found in AI announcement systems." - spawn_flags = IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/output/sound/vox/Initialize() - .= ..() - sounds = GLOB.vox_sounds - extended_desc = "The first input pin determines which sound is used. It uses the AI Vox Broadcast word list. So either experiment to find words that work, or ask the AI to help in figuring them out. The second pin determines the volume of sound that is played, and the third determines if the frequency of the sound will vary with each activation." - -/obj/item/integrated_circuit/output/text_to_speech - name = "text-to-speech circuit" - desc = "Takes any string as an input and will make the device say the string when pulsed." - extended_desc = "This unit is more advanced than the plain speaker circuit, able to transpose any valid text to speech." - icon_state = "speaker" - cooldown_per_use = 10 - complexity = 12 - inputs = list("text" = IC_PINTYPE_STRING) - outputs = list() - activators = list("to speech" = IC_PINTYPE_PULSE_IN) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 60 - -/obj/item/integrated_circuit/output/text_to_speech/do_work() - text = get_pin_data(IC_INPUT, 1) - if(!isnull(text)) - var/atom/movable/A = get_object() - var/sanitized_text = sanitize(text) - A.say(sanitized_text) - if (assembly) - log_say("[assembly] [REF(assembly)] : [sanitized_text]") - else - log_say("[name] ([type]) : [sanitized_text]") - -/obj/item/integrated_circuit/output/video_camera - name = "video camera circuit" - desc = "Takes a string as a name and a boolean to determine whether it is on, and uses this to be a camera linked to a list of networks you choose." - extended_desc = "The camera is linked to a list of camera networks of your choosing. Common choices are 'rd' for the research network, 'ss13' for the main station network (visible to AI), 'mine' for the mining network, and 'thunder' for the thunderdome network (viewable from bar)." - icon_state = "video_camera" - w_class = WEIGHT_CLASS_TINY - complexity = 10 - inputs = list( - "camera name" = IC_PINTYPE_STRING, - "camera active" = IC_PINTYPE_BOOLEAN, - "camera network" = IC_PINTYPE_LIST - ) - inputs_default = list("1" = "video camera circuit", "3" = list("rd")) - outputs = list() - activators = list() - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - action_flags = IC_ACTION_LONG_RANGE - power_draw_idle = 0 // Raises to 20 when on. - var/obj/machinery/camera/camera - var/updating = FALSE - -/obj/item/integrated_circuit/output/video_camera/New() - ..() - camera = new(src) - camera.network = list("rd") - on_data_written() - -/obj/item/integrated_circuit/output/video_camera/Destroy() - QDEL_NULL(camera) - return ..() - -/obj/item/integrated_circuit/output/video_camera/proc/set_camera_status(var/status) - if(camera) - camera.status = status - GLOB.cameranet.updatePortableCamera(camera) - power_draw_idle = camera.status ? 20 : 0 - if(camera.status) // Ensure that there's actually power. - if(!draw_idle_power()) - power_fail() - -/obj/item/integrated_circuit/output/video_camera/on_data_written() - if(camera) - var/cam_name = get_pin_data(IC_INPUT, 1) - var/cam_active = get_pin_data(IC_INPUT, 2) - var/list/new_network = get_pin_data(IC_INPUT, 3) - if(!isnull(cam_name)) - camera.c_tag = cam_name - if(!isnull(new_network)) - camera.network = new_network - set_camera_status(cam_active) - -/obj/item/integrated_circuit/output/video_camera/power_fail() - if(camera) - set_camera_status(0) - set_pin_data(IC_INPUT, 2, FALSE) - -/obj/item/integrated_circuit/output/video_camera/ext_moved(oldLoc, dir) - . = ..() - update_camera_location(oldLoc) - -#define VIDEO_CAMERA_BUFFER 10 -/obj/item/integrated_circuit/output/video_camera/proc/update_camera_location(oldLoc) - oldLoc = get_turf(oldLoc) - if(!QDELETED(camera) && !updating && oldLoc != get_turf(src)) - updating = TRUE - addtimer(CALLBACK(src, .proc/do_camera_update, oldLoc), VIDEO_CAMERA_BUFFER) -#undef VIDEO_CAMERA_BUFFER - -/obj/item/integrated_circuit/output/video_camera/proc/do_camera_update(oldLoc) - if(!QDELETED(camera) && oldLoc != get_turf(src)) - GLOB.cameranet.updatePortableCamera(camera) - updating = FALSE - -/obj/item/integrated_circuit/output/led - name = "light-emitting diode" - desc = "RGB LED. Takes a boolean value in, and if the boolean value is 'true-equivalent', the LED will be marked as lit on examine." - extended_desc = "TRUE-equivalent values are: Non-empty strings, non-zero numbers, and valid refs." - complexity = 0.1 - max_allowed = 4 - icon_state = "led" - inputs = list( - "lit" = IC_PINTYPE_BOOLEAN, - "color" = IC_PINTYPE_COLOR - ) - outputs = list() - activators = list() - inputs_default = list( - "2" = "#FF0000" - ) - power_draw_idle = 0 // Raises to 1 when lit. - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/led_color = "#FF0000" - -/obj/item/integrated_circuit/output/led/on_data_written() - power_draw_idle = get_pin_data(IC_INPUT, 1) ? 1 : 0 - led_color = get_pin_data(IC_INPUT, 2) - -/obj/item/integrated_circuit/output/led/power_fail() - set_pin_data(IC_INPUT, 1, FALSE) - -/obj/item/integrated_circuit/output/led/external_examine(mob/user) - var/text_output = "There is " - - if(name == displayed_name) - text_output += "\an [name]" - else - text_output += "\an ["\improper[name]"] labeled '[displayed_name]'" - text_output += " which is currently [get_pin_data(IC_INPUT, 1) ? "lit *" : "unlit"]." - to_chat(user, text_output) - -/obj/item/integrated_circuit/output/diagnostic_hud - name = "AR interface" - desc = "Takes an icon name as an input, and will update the status hud when data is written to it." - extended_desc = "Takes an icon name as an input, and will update the status hud when data is written to it, this means it can change the icon and have the icon stay that way even if the circuit is removed. The acceptable inputs are 'alert', 'move', 'working', 'patrol', 'called', and 'heart'. Any input other than that will return the icon to its default state." - var/list/icons = list( - "alert" = "hudalert", - "move" = "hudmove", - "working" = "hudworkingleft", - "patrol" = "hudpatrolleft", - "called" = "hudcalledleft", - "heart" = "hudsentientleft" - ) - complexity = 1 - icon_state = "led" - inputs = list( - "icon" = IC_PINTYPE_STRING - ) - outputs = list() - activators = list() - power_draw_idle = 0 - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/output/diagnostic_hud/on_data_written() - var/ID = get_pin_data(IC_INPUT, 1) - var/selected_icon = icons[ID] - if(assembly) - if(selected_icon) - assembly.prefered_hud_icon = selected_icon - else - assembly.prefered_hud_icon = "hudstat" - //update the diagnostic hud - assembly.diag_hud_set_circuitstat() - - -//Text to radio -//Outputs a simple string into radio (good to couple with the interceptor) -//Input: -//Text: the actual string to output -//Frequency: what channel to output in. This is a STRING, not a number, due to how comms work. It has to be the frequency without the dot, aka for common you need to put "1459" -/obj/item/integrated_circuit/output/text_to_radio - name = "text-to-radio circuit" - desc = "Takes any string as an input and will make the device output it in the radio with the frequency chosen as input." - extended_desc = "Similar to the text-to-speech circuit, except the fact that the text is converted into a subspace signal and broadcasted to the desired frequency, or 1459 as default.\ - The frequency is a number, and doesn't need the dot. Example: Common frequency is 145.9, so the result is 1459 as a number." - icon_state = "speaker" - complexity = 15 - inputs = list("text" = IC_PINTYPE_STRING, "frequency" = IC_PINTYPE_NUMBER) - outputs = list("encryption keys" = IC_PINTYPE_LIST) - activators = list("broadcast" = IC_PINTYPE_PULSE_IN) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 100 - cooldown_per_use = 0.1 - var/list/whitelisted_freqs = list() // special freqs can be used by inserting encryption keys - var/list/encryption_keys = list() - var/obj/item/radio/headset/integrated/radio - -/obj/item/integrated_circuit/output/text_to_radio/Initialize() - . = ..() - radio = new(src) - radio.frequency = FREQ_COMMON - GLOB.ic_speakers += src - -/obj/item/integrated_circuit/output/text_to_radio/Destroy() - qdel(radio) - GLOB.ic_speakers -= src - ..() - -/obj/item/integrated_circuit/output/text_to_radio/on_data_written() - var/freq = get_pin_data(IC_INPUT, 2) - if(!(freq in whitelisted_freqs)) - freq = sanitize_frequency(get_pin_data(IC_INPUT, 2), radio.freerange) - radio.set_frequency(freq) - -/obj/item/integrated_circuit/output/text_to_radio/do_work() - text = get_pin_data(IC_INPUT, 1) - if(!isnull(text)) - var/atom/movable/A = get_object() - var/sanitized_text = sanitize(text) - radio.talk_into(A, sanitized_text, ) - if (assembly) - log_say("[assembly] [REF(assembly)] : [sanitized_text]") - -/obj/item/integrated_circuit/output/text_to_radio/attackby(obj/O, mob/user) - if(istype(O, /obj/item/encryptionkey)) - user.transferItemToLoc(O,src) - encryption_keys += O - recalculate_channels() - to_chat(user, "You slide \the [O] inside the circuit.") - else - ..() - -/obj/item/integrated_circuit/output/text_to_radio/proc/recalculate_channels() - whitelisted_freqs.Cut() - set_pin_data(IC_INPUT, 2, 1459) - radio.set_frequency(FREQ_COMMON) //reset it - var/list/weakreffd_ekeys = list() - for(var/o in encryption_keys) - var/obj/item/encryptionkey/K = o - weakreffd_ekeys += WEAKREF(K) - for(var/i in K.channels) - whitelisted_freqs |= GLOB.radiochannels[i] - set_pin_data(IC_OUTPUT, 1, weakreffd_ekeys) - - -/obj/item/integrated_circuit/output/text_to_radio/attack_self(mob/user) - if(encryption_keys.len) - for(var/i in encryption_keys) - var/obj/O = i - O.forceMove(drop_location()) - encryption_keys.Cut() - set_pin_data(IC_OUTPUT, 1, WEAKREF(null)) - to_chat(user, "You slide the encryption keys out of the circuit.") - recalculate_channels() - else - to_chat(user, "There are no encryption keys to remove from the mechanism.") - -/obj/item/radio/headset/integrated - -/obj/item/integrated_circuit/output/screen/large - name = "medium screen" - -/obj/item/integrated_circuit/output/screen/extralarge // the subtype is called "extralarge" because tg brought back medium screens and they named the subtype /screen/large - name = "large screen" - desc = "Takes any data type as an input and displays it to the user upon examining, and to all nearby beings when pulsed." - icon_state = "screen_large" - power_draw_per_use = 40 - cooldown_per_use = 10 - -/obj/item/integrated_circuit/output/screen/extralarge/do_work() - ..() - var/obj/O = assembly ? get_turf(assembly) : loc - O.visible_message("[icon2html(O.icon, world, O.icon_state)] [stuff_to_display]") - if(assembly) - assembly.investigate_log("displayed \"[html_encode(stuff_to_display)]\" with [type].", INVESTIGATE_CIRCUIT) - else - investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT) diff --git a/code/modules/integrated_electronics/subtypes/power.dm b/code/modules/integrated_electronics/subtypes/power.dm deleted file mode 100644 index df6ab06eb0106..0000000000000 --- a/code/modules/integrated_electronics/subtypes/power.dm +++ /dev/null @@ -1,208 +0,0 @@ -/obj/item/integrated_circuit/power/ - category_text = "Power - Active" - -/obj/item/integrated_circuit/power/transmitter - name = "power transmission circuit" - desc = "This can wirelessly transmit electricity from an assembly's battery towards a nearby machine." - icon_state = "power_transmitter" - extended_desc = "This circuit transmits 5 kJ of electricity every time the activator pin is pulsed. The input pin must be \ - a reference to a machine to send electricity to. This can be a battery, or anything containing a battery. The machine can exist \ - inside the assembly, or adjacent to it. The power is sourced from the assembly's power cell. If the target is outside of the assembly, \ - some power is lost due to ineffiency." - w_class = WEIGHT_CLASS_SMALL - complexity = 16 - inputs = list("target" = IC_PINTYPE_REF) - outputs = list( - "target cell charge" = IC_PINTYPE_NUMBER, - "target cell max charge" = IC_PINTYPE_NUMBER, - "target cell percentage" = IC_PINTYPE_NUMBER - ) - activators = list("transmit" = IC_PINTYPE_PULSE_IN, "on transmit" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 500 // Inefficency has to come from somewhere. - var/amount_to_move = 5000 - -/obj/item/integrated_circuit/power/transmitter/large - name = "large power transmission circuit" - desc = "This can wirelessly transmit a lot of electricity from an assembly's battery towards a nearby machine. Warning: Do not operate in flammable environments." - extended_desc = "This circuit transmits 20 kJ of electricity every time the activator pin is pulsed. The input pin must be \ - a reference to a machine to send electricity to. This can be a battery, or anything containing a battery. The machine can exist \ - inside the assembly, or adjacent to it. The power is sourced from the assembly's power cell. If the target is outside of the assembly, \ - some power is lost due to ineffiency. Warning! Don't stack more than 1 power transmitter, as it becomes less efficient for every other \ - transmission circuit in its own assembly and other nearby ones." - w_class = WEIGHT_CLASS_BULKY - complexity = 32 - power_draw_per_use = 2000 - amount_to_move = 20000 - -/obj/item/integrated_circuit/power/transmitter/do_work() - - var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) - if(!AM) - return FALSE - if(istype(AM, /obj/item/gun/energy)) - return FALSE - if(!assembly) - return FALSE // Pointless to do everything else if there's no battery to draw from. - var/obj/item/stock_parts/cell/cell = AM.get_cell() - if(cell) - var/transfer_amount = amount_to_move - var/turf/A = get_turf(src) - var/turf/B = get_turf(AM) - if(A.Adjacent(B)) - if(AM.loc != assembly) - transfer_amount *= 0.8 // Losses due to distance. - var/list/U=A.GetAllContents(/obj/item/integrated_circuit/power/transmitter) - transfer_amount *= 1 / U.len - set_pin_data(IC_OUTPUT, 1, cell.charge) - set_pin_data(IC_OUTPUT, 2, cell.maxcharge) - set_pin_data(IC_OUTPUT, 3, cell.percent()) - activate_pin(2) - push_data() - if(cell.charge == cell.maxcharge) - return FALSE - if(transfer_amount && assembly.draw_power(amount_to_move)) // CELLRATE is already handled in draw_power() - cell.give(transfer_amount * GLOB.CELLRATE) - if(istype(AM, /obj/item)) - var/obj/item/I = AM - I.update_icon() - return TRUE - else - set_pin_data(IC_OUTPUT, 1, null) - set_pin_data(IC_OUTPUT, 2, null) - set_pin_data(IC_OUTPUT, 3, null) - activate_pin(2) - push_data() - return FALSE - -/obj/item/integrated_circuit/power/transmitter/large/do_work() - if(..()) // If the above code succeeds, do this below. - var/atom/movable/acting_object = get_object() - if(prob(20)) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(12, 1, src) - s.start() - acting_object.visible_message("\The [acting_object] makes some sparks!") - return TRUE - - -// - wire connector - // -/obj/item/integrated_circuit/power/transmitter/wire_connector - name = "wire connector" - desc = "Connects to a wire and allows to read the power, charge it or charge itself from the wire's power." - extended_desc = "This circuit will automatically attempt to locate and connect to wires on the floor beneath it when pulsed. \ - You must set a target before connecting. It can also transfer energy up to 2kJ from the assembly \ - to a wire and backwards if negative values are set for energy transfer." - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - inputs = list( - "charge" = IC_PINTYPE_NUMBER - ) - activators = list( - "toggle connection" = IC_PINTYPE_PULSE_IN, - "transfer power" = IC_PINTYPE_PULSE_IN, - "on connected" = IC_PINTYPE_PULSE_OUT, - "on connection failed" = IC_PINTYPE_PULSE_OUT, - "on disconnected" = IC_PINTYPE_PULSE_OUT - ) - outputs = list( - "connected cable" = IC_PINTYPE_REF, - "powernet power" = IC_PINTYPE_NUMBER, - "powernet load" = IC_PINTYPE_NUMBER - ) - complexity = 35 - power_draw_per_use = 100 - amount_to_move = 0 - - var/obj/structure/cable/connected_cable - -/obj/item/integrated_circuit/power/transmitter/wire_connector/Destroy() - connected_cable = null - return ..() - -/obj/item/integrated_circuit/power/transmitter/wire_connector/Initialize() - START_PROCESSING(SSobj, src) - . = ..() - -//Does wire things -/obj/item/integrated_circuit/power/transmitter/wire_connector/process() - ..() - update_cable() - push_data() - -//If the assembly containing this is moved from the tile the wire is in, the connection breaks -/obj/item/integrated_circuit/power/transmitter/wire_connector/ext_moved() - if(connected_cable) - if(get_dist(get_object(), connected_cable) > 0) - // The connected cable is removed - connected_cable = null - set_pin_data(IC_OUTPUT, 1, null) - push_data() - activate_pin(5) - - -/obj/item/integrated_circuit/power/transmitter/wire_connector/on_data_written() - var/charge_num = get_pin_data(IC_INPUT, 1) - //In case someone sets that pin to null - if(!charge_num) - amount_to_move = 0 - return - - amount_to_move = CLAMP(charge_num,-2000, 2000) - -/obj/item/integrated_circuit/power/transmitter/wire_connector/do_work(var/n) - if(n == 1) - // If there is a connection, disconnect - if(connected_cable) - connected_cable = null - set_pin_data(IC_OUTPUT, 1, null) - push_data() - activate_pin(5) - return - - var/obj/structure/cable/foundcable = locate() in get_turf(src) - // If no connector can't connect - if(!foundcable || foundcable.invisibility != 0) - set_pin_data(IC_OUTPUT, 1, null) - push_data() - activate_pin(4) - return - connected_cable = foundcable - update_cable() - push_data() - activate_pin(3) - return - - - if(!connected_cable || !assembly) - return - - if(!assembly.battery) - return - - //No charge transfer, no need to syphon tickrates with scripts - if(!amount_to_move || amount_to_move == 0) - return - - //Second clamp: set the number between what the battery and powernet allows - var/obj/item/stock_parts/cell/battery = assembly.battery - amount_to_move = CLAMP(amount_to_move, -connected_cable.powernet.avail, battery.charge) - - if(amount_to_move > 0) - connected_cable.powernet.newavail += battery.use(amount_to_move) - return - connected_cable.powernet.avail -= battery.give(-amount_to_move) - -/obj/item/integrated_circuit/power/transmitter/wire_connector/proc/update_cable() - if(get_dist(get_object(), connected_cable) > 0) - connected_cable = null - - if(!connected_cable || connected_cable.invisibility != 0) - set_pin_data(IC_OUTPUT, 1, null) - set_pin_data(IC_OUTPUT, 2, null) - set_pin_data(IC_OUTPUT, 3, null) - return - - var/datum/powernet/analyzed_net = connected_cable.powernet - set_pin_data(IC_OUTPUT, 1, WEAKREF(connected_cable)) - set_pin_data(IC_OUTPUT, 2, analyzed_net.viewavail) - set_pin_data(IC_OUTPUT, 3, analyzed_net.viewload) diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm deleted file mode 100644 index c706cf5373f42..0000000000000 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ /dev/null @@ -1,858 +0,0 @@ -#define IC_SMOKE_REAGENTS_MINIMUM_UNITS 10 - -/obj/item/integrated_circuit/reagent - category_text = "Reagent" - resistance_flags = UNACIDABLE | FIRE_PROOF - cooldown_per_use = 10 - var/volume = 0 - -/obj/item/integrated_circuit/reagent/Initialize() - . = ..() - if(volume) - create_reagents(volume, OPENCONTAINER) - push_vol() - -/obj/item/integrated_circuit/reagent/proc/push_vol() - set_pin_data(IC_OUTPUT, 1, reagents.total_volume) - push_data() - -// Hydroponics trays have no reagents holder and handle reagents in their own snowflakey way. -// This is a dirty hack to make injecting reagents into them work. -// TODO: refactor that. -/obj/item/integrated_circuit/reagent/proc/inject_tray(obj/machinery/hydroponics/tray, atom/movable/source, amount) - var/atom/movable/acting_object = get_object() - var/list/trays = list(tray) - var/visi_msg = "[acting_object] transfers fluid into [tray]" - - if(amount > 30 && source.reagents.total_volume >= 30 && tray.using_irrigation) - trays = tray.FindConnected() - if (trays.len > 1) - visi_msg += ", setting off the irrigation system" - - acting_object.visible_message("[visi_msg].") - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - - var/split = round(amount/trays.len) - - for(var/obj/machinery/hydroponics/H in trays) - var/datum/reagents/temp_reagents = new /datum/reagents() - temp_reagents.my_atom = H - - source.reagents.trans_to(temp_reagents, split) - H.applyChemicals(temp_reagents) - - temp_reagents.clear_reagents() - qdel(temp_reagents) - -/obj/item/integrated_circuit/reagent/injector - name = "integrated hypo-injector" - desc = "This scary looking thing is able to pump liquids into, or suck liquids out of, whatever it's pointed at." - icon_state = "injector" - extended_desc = "This autoinjector can push up to 30 units of reagents into another container or someone else outside of the machine. The target \ - must be adjacent to the machine, and if it is a person, they cannot be wearing thick clothing. Negative given amounts makes the injector suck out reagents instead." - - volume = 30 - - complexity = 20 - max_allowed = 1 - cooldown_per_use = 6 SECONDS - inputs = list( - "target" = IC_PINTYPE_REF, - "injection amount" = IC_PINTYPE_NUMBER - ) - inputs_default = list( - "2" = 5 - ) - outputs = list( - "volume used" = IC_PINTYPE_NUMBER, - "self reference" = IC_PINTYPE_SELFREF - ) - activators = list( - "inject" = IC_PINTYPE_PULSE_IN, - "on injected" = IC_PINTYPE_PULSE_OUT, - "on fail" = IC_PINTYPE_PULSE_OUT, - "push ref" = IC_PINTYPE_PULSE_IN - - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 15 - var/direction_mode = SYRINGE_INJECT - var/transfer_amount = 10 - var/busy = FALSE - -/obj/item/integrated_circuit/reagent/injector/on_reagent_change(changetype) - push_vol() - -/obj/item/integrated_circuit/reagent/injector/on_data_written() - var/new_amount = get_pin_data(IC_INPUT, 2) - if(new_amount < 0) - new_amount = -new_amount - direction_mode = SYRINGE_DRAW - else - direction_mode = SYRINGE_INJECT - if(isnum_safe(new_amount)) - new_amount = CLAMP(new_amount, 0, volume) - transfer_amount = new_amount - - -/obj/item/integrated_circuit/reagent/injector/do_work(ord) - switch(ord) - if(1) - inject() - if(4) - set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) - push_data() - -/obj/item/integrated_circuit/reagent/injector/proc/inject() - set waitfor = FALSE // Don't sleep in a proc that is called by a processor without this set, otherwise it'll delay the entire thing - var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) - var/atom/movable/acting_object = get_object() - - if(busy || !check_target(AM)) - activate_pin(3) - return - - if(!AM.reagents) - if(istype(AM, /obj/machinery/hydroponics) && direction_mode == SYRINGE_INJECT && reagents.total_volume && transfer_amount)//injection into tray. - inject_tray(AM, src, transfer_amount) - activate_pin(2) - return - activate_pin(3) - return - - if(direction_mode == SYRINGE_INJECT) - if(!reagents.total_volume || !AM.is_injectable() || AM.reagents.holder_full()) - activate_pin(3) - return - - if(isliving(AM)) - var/mob/living/L = AM - if(!L.can_inject(null, 0)) - activate_pin(3) - return - - //Always log attemped injections for admins - var/contained = reagents.log_list() - log_combat(src, L, "attempted to inject", addition="which had [contained]") - L.visible_message("[acting_object] is trying to inject [L]!", \ - "[acting_object] is trying to inject you!") - busy = TRUE - if(do_atom(src, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,null,0))) - var/fraction = min(transfer_amount/reagents.total_volume, 1) - reagents.reaction(L, INJECT, fraction) - reagents.trans_to(L, transfer_amount) - log_combat(src, L, "injected", addition="which had [contained]") - L.visible_message("[acting_object] injects [L] with its needle!", \ - "[acting_object] injects you with its needle!") - else - busy = FALSE - activate_pin(3) - return - busy = FALSE - - else - reagents.trans_to(AM, transfer_amount) - - if(direction_mode == SYRINGE_DRAW) - if(reagents.total_volume >= reagents.maximum_volume) - acting_object.visible_message("[acting_object] tries to draw from [AM], but the injector is full.") - activate_pin(3) - return - - var/tramount = abs(transfer_amount) - - if(isliving(AM)) - var/mob/living/L = AM - L.visible_message("[acting_object] is trying to take a blood sample from [L]!", \ - "[acting_object] is trying to take a blood sample from you!") - busy = TRUE - if(do_atom(src, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,null,0))) - if(L.transfer_blood_to(src, tramount)) - L.visible_message("[acting_object] takes a blood sample from [L]!", \ - "[acting_object] takes a blood sample from you!") - else - L.visible_message("[acting_object] fails to take a blood sample from [L].", \ - "[acting_object] fails to take a blood sample from you!") - busy = FALSE - activate_pin(3) - return - busy = FALSE - - else - if(!AM.reagents.total_volume) - acting_object.visible_message("[acting_object] tries to draw from [AM], but it is empty!") - activate_pin(3) - return - - if(!AM.is_drawable()) - activate_pin(3) - return - tramount = min(tramount, AM.reagents.total_volume) - AM.reagents.trans_to(src, tramount) - activate_pin(2) - - - -/obj/item/integrated_circuit/reagent/pump - name = "reagent pump" - desc = "Moves liquids safely inside a machine, or even nearby it." - icon_state = "reagent_pump" - extended_desc = "This is a pump which will move liquids from the source ref to the target ref. The third pin determines \ - how much liquid is moved per pulse, between 0 and 50. The pump can move reagents to any open container inside the machine, or \ - outside the machine if it is adjacent to the machine." - - complexity = 8 - inputs = list("source" = IC_PINTYPE_REF, "target" = IC_PINTYPE_REF, "injection amount" = IC_PINTYPE_NUMBER) - inputs_default = list("3" = 5) - outputs = list() - activators = list("transfer reagents" = IC_PINTYPE_PULSE_IN, "on transfer" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/transfer_amount = 10 - var/direction_mode = SYRINGE_INJECT - power_draw_per_use = 10 - -/obj/item/integrated_circuit/reagent/pump/on_data_written() - var/new_amount = get_pin_data(IC_INPUT, 3) - if(new_amount < 0) - new_amount = -new_amount - direction_mode = SYRINGE_DRAW - else - direction_mode = SYRINGE_INJECT - if(isnum_safe(new_amount)) - new_amount = CLAMP(new_amount, 0, 50) - transfer_amount = new_amount - -/obj/item/integrated_circuit/reagent/pump/do_work() - var/atom/movable/source = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) - var/atom/movable/target = get_pin_data_as_type(IC_INPUT, 2, /atom/movable) - - // Check for invalid input. - if(!check_target(source) || !check_target(target)) - return - - // If the pump is pumping backwards, swap target and source. - if(!direction_mode) - var/temp_source = source - source = target - target = temp_source - - if(!source.reagents) - return - - if(!target.reagents) - // Hydroponics trays have no reagents holder and handle reagents in their own snowflakey way. - // This is a dirty hack to make injecting reagents into them work. - if(istype(target, /obj/machinery/hydroponics) && source.reagents.total_volume) - inject_tray(target, source, transfer_amount) - activate_pin(2) - return - - if(!source.is_drainable() || !target.is_refillable()) - return - - source.reagents.trans_to(target, transfer_amount) - activate_pin(2) - -/obj/item/integrated_circuit/reagent/storage - cooldown_per_use = 1 - name = "reagent storage" - desc = "Stores liquid inside the device away from electrical components. It can store up to 60u." - icon_state = "reagent_storage" - extended_desc = "This is effectively an internal beaker." - - volume = 60 - - complexity = 4 - inputs = list() - outputs = list( - "volume used" = IC_PINTYPE_NUMBER, - "self reference" = IC_PINTYPE_SELFREF - ) - activators = list("push ref" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - - - -/obj/item/integrated_circuit/reagent/storage/do_work() - set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) - push_data() - -/obj/item/integrated_circuit/reagent/storage/on_reagent_change(changetype) - push_vol() - -/obj/item/integrated_circuit/reagent/storage/big - name = "big reagent storage" - icon_state = "reagent_storage_big" - desc = "Stores liquid inside the device away from electrical components. Can store up to 180u." - - volume = 180 - - complexity = 16 - spawn_flags = IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/reagent/storage/cryo - name = "cryo reagent storage" - desc = "Stores liquid inside the device away from electrical components. It can store up to 60u. This will also prevent reactions." - icon_state = "reagent_storage_cryo" - extended_desc = "This is effectively an internal cryo beaker." - - complexity = 8 - spawn_flags = IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/reagent/storage/cryo/Initialize() - . = ..() - ENABLE_BITFIELD(reagents.flags, NO_REACT) - -/obj/item/integrated_circuit/reagent/storage/grinder - name = "reagent grinder" - desc = "This is a reagent grinder. It accepts a ref to something, and refines it into reagents. It can store up to 100u." - icon_state = "blender" - extended_desc = "" - inputs = list( - "target" = IC_PINTYPE_REF, - ) - outputs = list( - "volume used" = IC_PINTYPE_NUMBER, - "self reference" = IC_PINTYPE_SELFREF - ) - activators = list( - "grind" = IC_PINTYPE_PULSE_IN, - "on grind" = IC_PINTYPE_PULSE_OUT, - "on fail" = IC_PINTYPE_PULSE_OUT, - "push ref" = IC_PINTYPE_PULSE_IN - ) - volume = 100 - power_draw_per_use = 150 - complexity = 16 - spawn_flags = IC_SPAWN_RESEARCH - - -/obj/item/integrated_circuit/reagent/storage/grinder/do_work(ord) - switch(ord) - if(1) - grind() - if(4) - set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) - push_data() - -/obj/item/integrated_circuit/reagent/storage/grinder/proc/grind() - if(reagents.total_volume >= reagents.maximum_volume) - activate_pin(3) - return FALSE - var/obj/item/I = get_pin_data_as_type(IC_INPUT, 1, /obj/item) - if(istype(I)&&(I.grind_results)&&check_target(I)&&(I.on_grind(src) != -1)) - if(istype(I, /obj/item/reagent_containers)) - var/obj/item/reagent_containers/p = I - if(p.prevent_grinding) - return FALSE - reagents.add_reagent_list(I.grind_results) - if(I.reagents) - I.reagents.trans_to(src, I.reagents.total_volume) - qdel(I) - activate_pin(2) - return TRUE - activate_pin(3) - return FALSE - -/obj/item/integrated_circuit/reagent/storage/juicer - name = "reagent juicer" - desc = "This is a reagent juicer. It accepts a ref to something and refines it into reagents. It can store up to 100u." - icon_state = "blender" - extended_desc = "" - inputs = list( - "target" = IC_PINTYPE_REF, - ) - outputs = list( - "volume used" = IC_PINTYPE_NUMBER, - "self reference" = IC_PINTYPE_SELFREF - ) - activators = list( - "juice" = IC_PINTYPE_PULSE_IN, - "on juice" = IC_PINTYPE_PULSE_OUT, - "on fail" = IC_PINTYPE_PULSE_OUT, - "push ref" = IC_PINTYPE_PULSE_IN - ) - volume = 100 - power_draw_per_use = 150 - complexity = 16 - spawn_flags = IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/reagent/storage/juicer/do_work(ord) - switch(ord) - if(1) - juice() - if(4) - set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) - push_data() - -/obj/item/integrated_circuit/reagent/storage/juicer/proc/juice() - if(reagents.total_volume >= reagents.maximum_volume) - activate_pin(3) - return FALSE - var/obj/item/I = get_pin_data_as_type(IC_INPUT, 1, /obj/item) - if(istype(I)&&check_target(I)&&(I.juice_results)&&(I.on_juice() != -1)) - reagents.add_reagent_list(I.juice_results) - qdel(I) - activate_pin(2) - return TRUE - activate_pin(3) - return FALSE - - - -/obj/item/integrated_circuit/reagent/storage/scan - name = "reagent scanner" - desc = "Stores liquid inside the device away from electrical components. It can store up to 60u. On pulse this beaker will send list of contained reagents." - icon_state = "reagent_scan" - extended_desc = "Mostly useful for filtering reagents." - - complexity = 8 - outputs = list( - "volume used" = IC_PINTYPE_NUMBER, - "self reference" = IC_PINTYPE_SELFREF, - "list of reagents" = IC_PINTYPE_LIST - ) - activators = list( - "scan" = IC_PINTYPE_PULSE_IN, - "push ref" = IC_PINTYPE_PULSE_IN - ) - spawn_flags = IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/reagent/storage/scan/do_work(ord) - switch(ord) - if(1) - var/cont[0] - for(var/datum/reagent/RE in reagents.reagent_list) - cont += RE - set_pin_data(IC_OUTPUT, 3, cont) - push_data() - if(2) - set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) - push_data() - -/obj/item/integrated_circuit/reagent/filter - name = "reagent filter" - desc = "Filters liquids by list of desired or unwanted reagents." - icon_state = "reagent_filter" - extended_desc = "This is a filter which will move liquids from the source to its target. \ - If the amount in the fourth pin is positive, it will move all reagents except those in the unwanted list. \ - If the amount in the fourth pin is negative, it will only move the reagents in the wanted list. \ - The third pin determines how many reagents are moved per pulse, between 0 and 50. Amount is given for each separate reagent." - - complexity = 8 - inputs = list( - "source" = IC_PINTYPE_REF, - "target" = IC_PINTYPE_REF, - "injection amount" = IC_PINTYPE_NUMBER, - "list of reagents" = IC_PINTYPE_LIST - ) - inputs_default = list( - "3" = 5 - ) - outputs = list() - activators = list( - "transfer reagents" = IC_PINTYPE_PULSE_IN, - "on transfer" = IC_PINTYPE_PULSE_OUT - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/transfer_amount = 10 - var/direction_mode = SYRINGE_INJECT - power_draw_per_use = 10 - -/obj/item/integrated_circuit/reagent/filter/on_data_written() - var/new_amount = get_pin_data(IC_INPUT, 3) - if(new_amount < 0) - new_amount = -new_amount - direction_mode = SYRINGE_DRAW - else - direction_mode = SYRINGE_INJECT - if(isnum_safe(new_amount)) - new_amount = CLAMP(new_amount, 0, 50) - transfer_amount = new_amount - -/obj/item/integrated_circuit/reagent/filter/do_work() - var/atom/movable/source = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) - var/atom/movable/target = get_pin_data_as_type(IC_INPUT, 2, /atom/movable) - var/list/demand = get_pin_data(IC_INPUT, 4) - - // Check for invalid input. - if(!check_target(source) || !check_target(target)) - return - - if(!source.reagents || !target.reagents) - return - - // FALSE in those procs makes mobs invalid targets. - if(!source.is_drawable(FALSE) || !target.is_injectable(FALSE)) - return - - if(target.reagents.maximum_volume - target.reagents.total_volume <= 0) - return - - for(var/datum/reagent/G in source.reagents.reagent_list) - if(!direction_mode) - if(G in demand) - source.reagents.trans_id_to(target, G.type, transfer_amount) - else - if(!(G in demand)) - source.reagents.trans_id_to(target, G.type, transfer_amount) - activate_pin(2) - push_data() - -/obj/item/integrated_circuit/reagent/storage/heater - name = "chemical heater" - desc = "Stores liquid inside the device away from electrical components. It can store up to 60u. It will heat or cool the reagents \ - to the target temperature when turned on." - icon_state = "heater" - complexity = 8 - inputs = list( - "target temperature" = IC_PINTYPE_NUMBER, - "on" = IC_PINTYPE_BOOLEAN - ) - inputs_default = list("1" = 300) - outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_SELFREF,"temperature" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_RESEARCH - var/heater_coefficient = 0.1 - -/obj/item/integrated_circuit/reagent/storage/heater/on_data_written() - if(get_pin_data(IC_INPUT, 2)) - power_draw_idle = 30 - else - power_draw_idle = 0 - -/obj/item/integrated_circuit/reagent/storage/heater/Initialize() - .=..() - START_PROCESSING(SScircuit, src) - -/obj/item/integrated_circuit/reagent/storage/heater/Destroy() - STOP_PROCESSING(SScircuit, src) - return ..() - -/obj/item/integrated_circuit/reagent/storage/heater/process() - if(!power_draw_idle) - return - var/target_temperature = CLAMP(get_pin_data(IC_INPUT, 1), 0, 3000) - if(reagents.chem_temp > target_temperature) - reagents.chem_temp += min(-1, (target_temperature - reagents.chem_temp) * heater_coefficient) - if(reagents.chem_temp < target_temperature) - reagents.chem_temp += max(1, (target_temperature - reagents.chem_temp) * heater_coefficient) - - reagents.chem_temp = round(reagents.chem_temp) - reagents.handle_reactions() - set_pin_data(IC_OUTPUT, 3, reagents.chem_temp) - push_data() - - -/obj/item/integrated_circuit/reagent/smoke - name = "smoke generator" - desc = "Unlike most electronics, creating smoke is completely intentional." - icon_state = "smoke" - extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \ - into the smoke clouds when activated. The reagents are consumed when the smoke is made." - ext_cooldown = 1 - volume = 100 - complexity = 20 - cooldown_per_use = 1 SECONDS - inputs = list() - outputs = list( - "volume used" = IC_PINTYPE_NUMBER, - "self reference" = IC_PINTYPE_SELFREF - ) - activators = list( - "create smoke" = IC_PINTYPE_PULSE_IN, - "on smoked" = IC_PINTYPE_PULSE_OUT, - "push ref" = IC_PINTYPE_PULSE_IN - ) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 20 - var/smoke_radius = 5 - var/notified = FALSE - -/obj/item/integrated_circuit/reagent/smoke/on_reagent_change(changetype) - //reset warning only if we have reagents now - if(changetype == ADD_REAGENT) - notified = FALSE - push_vol() -/obj/item/integrated_circuit/reagent/smoke/do_work(ord) - switch(ord) - if(1) - if(!reagents || (reagents.total_volume < IC_SMOKE_REAGENTS_MINIMUM_UNITS)) - return - var/location = get_turf(src) - var/datum/effect_system/smoke_spread/chem/S = new - S.attach(location) - playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - if(S) - S.set_up(reagents, smoke_radius, location, notified) - if(!notified) - notified = TRUE - S.start() - reagents.clear_reagents() - activate_pin(2) - if(3) - set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) - push_data() - -// - Integrated extinguisher - // -/obj/item/integrated_circuit/reagent/extinguisher - name = "integrated extinguisher" - desc = "This circuit sprays any of its contents out like an extinguisher." - icon_state = "injector" - extended_desc = "This circuit can hold up to 30 units of any given chemicals. On each use, it sprays these reagents like a fire extinguisher." - - volume = 30 - - complexity = 20 - cooldown_per_use = 6 SECONDS - inputs = list( - "target X rel" = IC_PINTYPE_NUMBER, - "target Y rel" = IC_PINTYPE_NUMBER - ) - outputs = list( - "volume" = IC_PINTYPE_NUMBER, - "self reference" = IC_PINTYPE_SELFREF - ) - activators = list( - "spray" = IC_PINTYPE_PULSE_IN, - "on sprayed" = IC_PINTYPE_PULSE_OUT, - "on fail" = IC_PINTYPE_PULSE_OUT, - "push ref" = IC_PINTYPE_PULSE_IN - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 15 - max_allowed = 2 - var/busy = FALSE - -/obj/item/integrated_circuit/reagent/extinguisher/Initialize() - .=..() - set_pin_data(IC_OUTPUT,2, src) - -/obj/item/integrated_circuit/reagent/extinguisher/on_reagent_change(changetype) - push_vol() - -/obj/item/integrated_circuit/reagent/extinguisher/do_work() - //Check if enough volume - set_pin_data(IC_OUTPUT, 1, reagents.total_volume) - if(!reagents || reagents.total_volume < 5 || busy) - push_data() - activate_pin(3) - return - - playsound(loc, 'sound/effects/extinguish.ogg', 75, 1, -3) - //Get the tile on which the water particle spawns - var/turf/Spawnpoint = get_turf(src) - if(!Spawnpoint) - push_data() - activate_pin(3) - return - - //Get direction and target turf for each water particle - var/turf/T = locate(Spawnpoint.x + get_pin_data(IC_INPUT, 1),Spawnpoint.y + get_pin_data(IC_INPUT, 2),Spawnpoint.z) - if(!T) - push_data() - activate_pin(3) - return - var/direction = get_dir(Spawnpoint, T) - var/turf/T1 = get_step(T,turn(direction, 90)) - var/turf/T2 = get_step(T,turn(direction, -90)) - var/list/the_targets = list(T,T1,T2) - busy = TRUE - - // Create list with particles and their targets - var/list/water_particles=list() - for(var/a=0, a<5, a++) - var/obj/effect/particle_effect/water/W = new /obj/effect/particle_effect/water(get_turf(src)) - water_particles[W] = pick(the_targets) - var/datum/reagents/R = new/datum/reagents(5) - W.reagents = R - R.my_atom = W - reagents.trans_to(W,1) - - //Make em move dat ass, hun - addtimer(CALLBACK(src, /obj/item/integrated_circuit/reagent/extinguisher/proc/move_particles, water_particles), 2) - -//This whole proc is a loop -/obj/item/integrated_circuit/reagent/extinguisher/proc/move_particles(var/list/particles, var/repetitions=0) - //Check if there's anything in here first - if(!particles || particles.len == 0) - return - // Second loop: Get all the water particles and make them move to their target - for(var/obj/effect/particle_effect/water/W in particles) - var/turf/my_target = particles[W] - if(!W) - continue - step_towards(W,my_target) - if(!W.reagents) - continue - W.reagents.reaction(get_turf(W)) - for(var/A in get_turf(W)) - W.reagents.reaction(A) - if(W.loc == my_target) - break - if(repetitions < 4) - repetitions++ //Can't have math operations in addtimer(CALLBACK()) - addtimer(CALLBACK(src, /obj/item/integrated_circuit/reagent/extinguisher/proc/move_particles, particles, repetitions), 2) - else - push_data() - activate_pin(2) - busy = FALSE - - -// - Drain circuit - // -/obj/item/integrated_circuit/reagent/drain - name = "chemical drain circuit" - desc = "This circuit either eliminates reagents by creating a puddle or can suck up chemicals on tiles." - icon_state = "injector" - extended_desc = "Set mode to FALSE to eliminate reagents and TRUE to drain." - - volume = 20 - - complexity = 10 - inputs = list( - "mode" = IC_PINTYPE_BOOLEAN - ) - outputs = list( - "volume" = IC_PINTYPE_NUMBER, - "self reference" = IC_PINTYPE_SELFREF - ) - activators = list( - "drain" = IC_PINTYPE_PULSE_IN, - "on drained" = IC_PINTYPE_PULSE_OUT, - "on fail" = IC_PINTYPE_PULSE_OUT, - "push ref" = IC_PINTYPE_PULSE_IN - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 15 - - -/obj/item/integrated_circuit/reagent/drain/Initialize() - .=..() - set_pin_data(IC_OUTPUT,2, src) - - -/obj/item/integrated_circuit/reagent/drain/do_work() - if(get_pin_data(IC_OUTPUT, 1, reagents.total_volume)) - if(!reagents || !reagents.total_volume) - push_data() - activate_pin(3) - return - // Put the reagents on the floortile the assembly is on - reagents.reaction(get_turf(src)) - reagents.clear_reagents() - push_data() - activate_pin(2) - return - - else - if(reagents) - if(reagents.total_volume >= volume) - push_data() - activate_pin(3) - return - // Favorably, drain it from a chemicals pile, else, try something different - var/obj/effect/decal/cleanable/drainedchems = locate(/obj/effect/decal/cleanable) in get_turf(src) - if(!drainedchems || !drainedchems.reagents || drainedchems.reagents.total_volume == 0) - push_data() - activate_pin(3) - return - drainedchems.reagents.trans_to(src, 30, 0.5) - if(drainedchems.reagents.total_volume == 0) - qdel(drainedchems) - push_data() - activate_pin(2) - - -/obj/item/integrated_circuit/reagent/drain/on_reagent_change(changetype) - push_vol() - - -// - Beaker Connector - // -/obj/item/integrated_circuit/input/beaker_connector - category_text = "Reagent" - cooldown_per_use = 1 - name = "beaker slot" - desc = "Lets you add a beaker to your assembly and remove it even when the assembly is closed." - icon_state = "reagent_storage" - extended_desc = "It can help you extract reagents easier." - complexity = 4 - - inputs = list() - outputs = list( - "volume used" = IC_PINTYPE_NUMBER, - "current beaker" = IC_PINTYPE_REF - ) - activators = list( - "on insert" = IC_PINTYPE_PULSE_OUT, - "on remove" = IC_PINTYPE_PULSE_OUT, - "push ref" = IC_PINTYPE_PULSE_OUT - ) - - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - can_be_asked_input = TRUE - demands_object_input = TRUE - can_input_object_when_closed = TRUE - - var/obj/item/reagent_containers/glass/beaker/current_beaker - - -/obj/item/integrated_circuit/input/beaker_connector/attackby(var/obj/item/reagent_containers/I, var/mob/living/user) - //Check if it truly is a reagent container - if(!istype(I,/obj/item/reagent_containers/glass/beaker)) - to_chat(user,"The [I.name] doesn't seem to fit in here.") - return - - //Check if there is no other beaker already inside - if(current_beaker) - to_chat(user,"There is already a reagent container inside.") - return - - //The current beaker is the one we just attached, its location is inside the circuit - current_beaker = I - user.transferItemToLoc(I,src) - - to_chat(user,"You put the [I.name] inside the beaker connector.") - - //Set the pin to a weak reference of the current beaker - push_vol() - set_pin_data(IC_OUTPUT, 2, WEAKREF(current_beaker)) - push_data() - activate_pin(1) - activate_pin(3) - - -/obj/item/integrated_circuit/input/beaker_connector/ask_for_input(mob/user) - attack_self(user) - - -/obj/item/integrated_circuit/input/beaker_connector/attack_self(mob/user) - //Check if no beaker attached - if(!current_beaker) - to_chat(user, "There is currently no beaker attached.") - return - - //Remove beaker and put in user's hands/location - to_chat(user, "You take [current_beaker] out of the beaker connector.") - user.put_in_hands(current_beaker) - current_beaker = null - //Remove beaker reference - push_vol() - set_pin_data(IC_OUTPUT, 2, null) - push_data() - activate_pin(2) - activate_pin(3) - - -/obj/item/integrated_circuit/input/beaker_connector/proc/push_vol() - var/beakerVolume = 0 - if(current_beaker) - beakerVolume = current_beaker.reagents.total_volume - - set_pin_data(IC_OUTPUT, 1, beakerVolume) - push_data() - - -/obj/item/reagent_containers/glass/beaker/on_reagent_change() - ..() - if(istype(loc,/obj/item/integrated_circuit/input/beaker_connector)) - var/obj/item/integrated_circuit/input/beaker_connector/current_circuit = loc - current_circuit.push_vol() diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm deleted file mode 100644 index 36b0e2ffa3fe9..0000000000000 --- a/code/modules/integrated_electronics/subtypes/smart.dm +++ /dev/null @@ -1,370 +0,0 @@ -/obj/item/integrated_circuit/smart - category_text = "Smart" - -/obj/item/integrated_circuit/smart/basic_pathfinder - name = "basic pathfinder" - desc = "This complex circuit is able to determine what direction a given target is." - extended_desc = "This circuit uses a miniturized integrated camera to determine where the target is. If the machine \ - cannot see the target, it will not be able to calculate the correct direction." - icon_state = "numberpad" - complexity = 5 - inputs = list("target" = IC_PINTYPE_REF,"ignore obstacles" = IC_PINTYPE_BOOLEAN) - outputs = list("dir" = IC_PINTYPE_DIR) - activators = list("calculate dir" = IC_PINTYPE_PULSE_IN, "on calculated" = IC_PINTYPE_PULSE_OUT,"not calculated" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 40 - -/obj/item/integrated_circuit/smart/basic_pathfinder/do_work() - var/datum/integrated_io/I = inputs[1] - set_pin_data(IC_OUTPUT, 1, null) - if(!isweakref(I.data)) - activate_pin(3) - return - var/atom/A = I.data.resolve() - if(!A) - activate_pin(3) - return - if(!(A in view(get_turf(src)))) - push_data() - activate_pin(3) - return // Can't see the target. - - if(get_pin_data(IC_INPUT, 2)) - set_pin_data(IC_OUTPUT, 1, get_dir(get_turf(src), get_turf(A))) - else - set_pin_data(IC_OUTPUT, 1, get_dir(get_turf(src), get_step_towards2(get_turf(src),A))) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/smart/coord_basic_pathfinder - name = "coordinate pathfinder" - desc = "This complex circuit is able to determine what direction a given target is." - extended_desc = "This circuit uses absolute coordinates to determine where the target is. If the machine \ - cannot see the target, it will not be able to calculate the correct direction. \ - This circuit will only work while inside an assembly." - icon_state = "numberpad" - complexity = 5 - inputs = list("X" = IC_PINTYPE_NUMBER,"Y" = IC_PINTYPE_NUMBER,"ignore obstacles" = IC_PINTYPE_BOOLEAN) - outputs = list( "dir" = IC_PINTYPE_DIR, - "distance" = IC_PINTYPE_NUMBER - ) - activators = list("calculate dir" = IC_PINTYPE_PULSE_IN, "on calculated" = IC_PINTYPE_PULSE_OUT,"not calculated" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 40 - -/obj/item/integrated_circuit/smart/coord_basic_pathfinder/do_work() - if(!assembly) - 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/turf/A = locate(target_x, target_y, T.z) - set_pin_data(IC_OUTPUT, 1, null) - if(!A||A==T) - activate_pin(3) - return - if(get_pin_data(IC_INPUT, 2)) - set_pin_data(IC_OUTPUT, 1, get_dir(get_turf(src), get_turf(A))) - else - set_pin_data(IC_OUTPUT, 1, get_dir(get_turf(src), get_step_towards2(get_turf(src),A))) - set_pin_data(IC_OUTPUT, 2, sqrt((A.x-T.x)*(A.x-T.x)+ (A.y-T.y)*(A.y-T.y))) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/smart/advanced_pathfinder - name = "advanced pathfinder" - desc = "This circuit uses a complex processor for long-range pathfinding." - extended_desc = "This circuit uses absolute coordinates to find its target. A path will be generated to the target, taking obstacles into account, \ - and pathing around any instances of said input. The passkey provided from a card reader is used to calculate a valid path through airlocks." - icon_state = "numberpad" - complexity = 40 - cooldown_per_use = 50 - inputs = list("X target" = IC_PINTYPE_NUMBER,"Y target" = IC_PINTYPE_NUMBER,"obstacle" = IC_PINTYPE_REF,"access" = IC_PINTYPE_STRING) - outputs = list("X" = IC_PINTYPE_LIST,"Y" = IC_PINTYPE_LIST) - activators = list("calculate path" = IC_PINTYPE_PULSE_IN, "on calculated" = IC_PINTYPE_PULSE_OUT,"not calculated" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 80 - var/obj/item/card/id/idc - -/obj/item/integrated_circuit/smart/advanced_pathfinder/Initialize() - .=..() - idc = new(src) - -/obj/item/integrated_circuit/smart/advanced_pathfinder/do_work() - if(!assembly) - activate_pin(3) - return - //idc.access = assembly.access_card.access // hippie start -- readded xor decryption - hippie_xor_decrypt() // hippie end - var/turf/a_loc = get_turf(assembly) - var/list/P = cir_get_path_to(assembly, locate(get_pin_data(IC_INPUT, 1),get_pin_data(IC_INPUT, 2),a_loc.z), /turf/proc/Distance_cardinal, 0, 200, id=idc, exclude=get_turf(get_pin_data_as_type(IC_INPUT,3, /atom)), simulated_only = 0) - - if(!P) - activate_pin(3) - return - - var/list/Xn = new/list(P.len) - var/list/Yn = new/list(P.len) - var/turf/T - for(var/i =1 to P.len) - T=P[i] - Xn[i] = T.x - Yn[i] = T.y - set_pin_data(IC_OUTPUT, 1, Xn) - set_pin_data(IC_OUTPUT, 2, Yn) - push_data() - activate_pin(2) - - -// - MMI Tank - // -/obj/item/integrated_circuit/input/mmi_tank - name = "man-machine interface tank" - desc = "This circuit is just a jar filled with an artificial liquid mimicking the cerebrospinal fluid." - extended_desc = "This jar can hold 1 man-machine interface and let it take control of some basic functions of the assembly." - complexity = 29 - inputs = list("laws" = IC_PINTYPE_LIST) - outputs = list( - "man-machine interface" = IC_PINTYPE_REF, - "direction" = IC_PINTYPE_DIR, - "click target" = IC_PINTYPE_REF - ) - activators = list( - "move" = IC_PINTYPE_PULSE_OUT, - "left" = IC_PINTYPE_PULSE_OUT, - "right" = IC_PINTYPE_PULSE_OUT, - "up" = IC_PINTYPE_PULSE_OUT, - "down" = IC_PINTYPE_PULSE_OUT, - "leftclick" = IC_PINTYPE_PULSE_OUT, - "shiftclick" = IC_PINTYPE_PULSE_OUT, - "altclick" = IC_PINTYPE_PULSE_OUT, - "ctrlclick" = IC_PINTYPE_PULSE_OUT - ) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 150 - can_be_asked_input = TRUE - demands_object_input = TRUE - - var/obj/item/mmi/installed_brain - -/obj/item/integrated_circuit/input/mmi_tank/attackby(var/obj/item/mmi/O, var/mob/user) - if(!istype(O,/obj/item/mmi)) - to_chat(user,"You can't put that inside.") - return - if(installed_brain) - to_chat(user,"There's already a brain inside.") - return - user.transferItemToLoc(O,src) - installed_brain = O - can_be_asked_input = FALSE - to_chat(user, "You gently place \the man-machine interface inside the tank.") - to_chat(O, "You are slowly being placed inside the man-machine-interface tank.") - O.brainmob.remote_control=src - set_pin_data(IC_OUTPUT, 1, O) - -/obj/item/integrated_circuit/input/mmi_tank/attack_self(var/mob/user) - if(installed_brain) - RemoveBrain() - to_chat(user, "You slowly lift [installed_brain] out of the MMI tank.") - playsound(src, 'sound/items/Crowbar.ogg', 50, 1) - installed_brain = null - push_data() - else - to_chat(user, "You don't see any brain swimming in the tank.") - -/obj/item/integrated_circuit/input/mmi_tank/Destroy() - RemoveBrain() - ..() - -/obj/item/integrated_circuit/input/mmi_tank/relaymove(var/n,var/dir) - set_pin_data(IC_OUTPUT, 2, dir) - do_work(1) - switch(dir) - if(8) activate_pin(2) - if(4) activate_pin(3) - if(1) activate_pin(4) - if(2) activate_pin(5) - -/obj/item/integrated_circuit/input/mmi_tank/do_work(var/n) - push_data() - activate_pin(n) - -/obj/item/integrated_circuit/input/mmi_tank/proc/RemoveBrain() - if(installed_brain) - can_be_asked_input = TRUE - installed_brain.forceMove(drop_location()) - set_pin_data(IC_OUTPUT, 1, WEAKREF(null)) - if(installed_brain.brainmob) - installed_brain.brainmob.remote_control = null - - -//Brain changes -/mob/living/brain/var/check_bot_self = FALSE - -/mob/living/brain/ClickOn(atom/A, params) - ..() - if(!istype(remote_control,/obj/item/integrated_circuit/input/mmi_tank)) - return - var/obj/item/integrated_circuit/input/mmi_tank/brainholder=remote_control - brainholder.set_pin_data(IC_OUTPUT, 3, A) - var/list/modifiers = params2list(params) - - if(modifiers["shift"]) - brainholder.do_work(7) - return - if(modifiers["alt"]) - brainholder.do_work(8) - return - if(modifiers["ctrl"]) - brainholder.do_work(9) - return - - if(istype(A,/obj/item/electronic_assembly)) - var/obj/item/electronic_assembly/CheckedAssembly = A - - if(brainholder in CheckedAssembly.assembly_components) - var/obj/item/electronic_assembly/holdingassembly=A - check_bot_self=TRUE - - if(holdingassembly.opened) - holdingassembly.ui_interact(src) - holdingassembly.attack_self(src) - check_bot_self=FALSE - return - - brainholder.do_work(6) - -/mob/living/brain/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) - return check_bot_self - -/obj/item/integrated_circuit/smart/advanced_pathfinder/proc/hippie_xor_decrypt() - var/Ps = get_pin_data(IC_INPUT, 4) - if(!Ps) - return - var/list/Pl = json_decode(XorEncrypt(hextostr(Ps, TRUE), SScircuit.cipherkey)) - if(Pl&&islist(Pl)) - idc.access = Pl - -// - pAI connector circuit - // -/obj/item/integrated_circuit/input/pAI_connector - name = "pAI connector circuit" - desc = "This circuit lets you fit in a personal artificial intelligence to give it some form of control over the bot." - extended_desc = "You can wire various functions to it." - complexity = 29 - inputs = list("laws" = IC_PINTYPE_LIST) - outputs = list( - "personal artificial intelligence" = IC_PINTYPE_REF, - "direction" = IC_PINTYPE_DIR, - "click target" = IC_PINTYPE_REF - ) - activators = list( - "move" = IC_PINTYPE_PULSE_OUT, - "left" = IC_PINTYPE_PULSE_OUT, - "right" = IC_PINTYPE_PULSE_OUT, - "up" = IC_PINTYPE_PULSE_OUT, - "down" = IC_PINTYPE_PULSE_OUT, - "leftclick" = IC_PINTYPE_PULSE_OUT, - "shiftclick" = IC_PINTYPE_PULSE_OUT, - "altclick" = IC_PINTYPE_PULSE_OUT, - "ctrlclick" = IC_PINTYPE_PULSE_OUT, - "shiftctrlclick" = IC_PINTYPE_PULSE_OUT - ) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 150 - can_be_asked_input = TRUE - demands_object_input = TRUE - - var/obj/item/paicard/installed_pai - -/obj/item/integrated_circuit/input/pAI_connector/attackby(var/obj/item/paicard/O, var/mob/user) - if(!istype(O,/obj/item/paicard)) - to_chat(user,"You can't put that inside.") - return - if(installed_pai) - to_chat(user,"There's already a pAI connected to this.") - return - user.transferItemToLoc(O,src) - installed_pai = O - can_be_asked_input = FALSE - to_chat(user, "You slowly connect the circuit's pins to the [installed_pai].") - to_chat(O, "You are slowly being connected to the pAI connector.") - O.pai.remote_control=src - set_pin_data(IC_OUTPUT, 1, O) - -/obj/item/integrated_circuit/input/pAI_connector/attack_self(var/mob/user) - if(installed_pai) - RemovepAI() - to_chat(user, "You slowly disconnect the circuit's pins from the [installed_pai].") - playsound(src, 'sound/items/Crowbar.ogg', 50, 1) - installed_pai = null - push_data() - else - to_chat(user, "The connection port is empty.") - -/obj/item/integrated_circuit/input/pAI_connector/relaymove(var/n,var/dir) - set_pin_data(IC_OUTPUT, 2, dir) - do_work(1) - switch(dir) - if(8) activate_pin(2) - if(4) activate_pin(3) - if(1) activate_pin(4) - if(2) activate_pin(5) - -/obj/item/integrated_circuit/input/pAI_connector/do_work(var/n) - push_data() - activate_pin(n) - - -/obj/item/integrated_circuit/input/pAI_connector/Destroy() - RemovepAI() - ..() - -/obj/item/integrated_circuit/input/pAI_connector/proc/RemovepAI() - if(installed_pai) - can_be_asked_input = TRUE - installed_pai.forceMove(drop_location()) - set_pin_data(IC_OUTPUT, 1, WEAKREF(null)) - installed_pai.pai.remote_control = null - - -//pAI changes -/mob/living/silicon/pai/var/check_bot_self = FALSE - -/mob/living/silicon/pai/ClickOn(atom/A, params) - ..() - if(!istype(remote_control,/obj/item/integrated_circuit/input/pAI_connector)) - return - var/obj/item/integrated_circuit/input/pAI_connector/paiholder=remote_control - paiholder.set_pin_data(IC_OUTPUT, 3, A) - var/list/modifiers = params2list(params) - - if(modifiers["shift"] && modifiers["ctrl"]) - paiholder.do_work(10) - return - if(modifiers["shift"]) - paiholder.do_work(7) - return - if(modifiers["alt"]) - paiholder.do_work(8) - return - if(modifiers["ctrl"]) - paiholder.do_work(9) - return - - if(istype(A,/obj/item/electronic_assembly)) - var/obj/item/electronic_assembly/CheckedAssembly = A - - if(paiholder in CheckedAssembly.assembly_components) - var/obj/item/electronic_assembly/holdingassembly=A - check_bot_self=TRUE - - if(holdingassembly.opened) - holdingassembly.ui_interact(src) - holdingassembly.attack_self(src) - check_bot_self=FALSE - return - - paiholder.do_work(6) - -/mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) - return check_bot_self diff --git a/code/modules/integrated_electronics/subtypes/text.dm b/code/modules/integrated_electronics/subtypes/text.dm deleted file mode 100644 index 6b3041e2c5b77..0000000000000 --- a/code/modules/integrated_electronics/subtypes/text.dm +++ /dev/null @@ -1,271 +0,0 @@ -/obj/item/integrated_circuit/text - name = "text thingy" - desc = "Does text-processing related things." - category_text = "Text" - complexity = 1 - - -/obj/item/integrated_circuit/text/lowercase - name = "lowercase string converter" - desc = "this circuit will cause a string to come out in all lowercase." - icon_state = "lowercase" - inputs = list("input" = IC_PINTYPE_STRING) - outputs = list("output" = IC_PINTYPE_STRING) - activators = list("to lowercase" = IC_PINTYPE_PULSE_IN, "on converted" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/text/lowercase/do_work() - var/result = null - pull_data() - var/incoming = get_pin_data(IC_INPUT, 1) - if(!isnull(incoming)) - result = lowertext(incoming) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/text/uppercase - name = "uppercase string converter" - desc = "THIS WILL CAUSE A STRING TO COME OUT IN ALL UPPERCASE." - icon_state = "uppercase" - inputs = list("input" = IC_PINTYPE_STRING) - outputs = list("output" = IC_PINTYPE_STRING) - activators = list("to uppercase" = IC_PINTYPE_PULSE_IN, "on converted" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/text/uppercase/do_work() - var/result = null - pull_data() - var/incoming = get_pin_data(IC_INPUT, 1) - if(!isnull(incoming)) - result = uppertext(incoming) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/text/concatenator - name = "concatenator" - desc = "This can join up to 8 strings together to get a string with a maximum of 512 characters." - complexity = 4 - inputs = list() - outputs = list("result" = IC_PINTYPE_STRING) - activators = list("concatenate" = IC_PINTYPE_PULSE_IN, "on concatenated" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/number_of_pins = 8 - var/max_string_length = 512 - -/obj/item/integrated_circuit/text/concatenator/Initialize() - for(var/i = 1 to number_of_pins) - inputs["input [i]"] = IC_PINTYPE_STRING - . = ..() - -/obj/item/integrated_circuit/text/concatenator/do_work() - var/result = null - var/spamprotection - for(var/k in 1 to inputs.len) - var/I = get_pin_data(IC_INPUT, k) - if(!isnull(I)) - if((result ? length(result) : 0) + length(I) > max_string_length) - spamprotection = (result ? length(result) : 0) + length(I) - break - result = result + I - - if(spamprotection >= max_string_length*1.75 && assembly) - if(assembly.fingerprintslast) - var/mob/M = get_mob_by_key(assembly.fingerprintslast) - var/more = "" - if(M) - more = "[ADMIN_LOOKUPFLW(M)] " - message_admins("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. Assembly last touched by [more ? more : assembly.fingerprintslast].") - investigate_log("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. Assembly last touched by [assembly.fingerprintslast].", INVESTIGATE_CIRCUIT) - else - message_admins("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. No associated key.") - investigate_log("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. No associated key.", INVESTIGATE_CIRCUIT) - qdel(assembly) - return - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/text/concatenator/small - name = "small concatenator" - desc = "This can join up to 4 strings together to get a string with a maximum of 256 characters." - complexity = 2 - number_of_pins = 4 - max_string_length = 256 - -/obj/item/integrated_circuit/text/concatenator/large - name = "large concatenator" - desc = "This can join up to 16 strings together to get a string with a maximum of 1024 characters." - complexity = 6 - number_of_pins = 16 - max_string_length = 1024 - -/obj/item/integrated_circuit/text/separator - name = "separator" - desc = "This splits a single string into two at the relative split point." - extended_desc = "This circuit splits a given string into two, based on the string and the index value. \ - The index splits the string after the given index, including spaces. So 'a person' with an index of '3' \ - will split into 'a p' and 'erson'." - icon_state = "split" - complexity = 4 - inputs = list( - "string to split" = IC_PINTYPE_STRING, - "index" = IC_PINTYPE_NUMBER, - ) - outputs = list( - "before split" = IC_PINTYPE_STRING, - "after split" = IC_PINTYPE_STRING - ) - activators = list("separate" = IC_PINTYPE_PULSE_IN, "on separated" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/text/separator/do_work() - var/text = get_pin_data(IC_INPUT, 1) - var/index = get_pin_data(IC_INPUT, 2) - - var/split = min(index+1, length(text)) - - var/before_text = copytext(text, 1, split) - var/after_text = copytext(text, split, 0) - - set_pin_data(IC_OUTPUT, 1, before_text) - set_pin_data(IC_OUTPUT, 2, after_text) - push_data() - - activate_pin(2) - -/obj/item/integrated_circuit/text/indexer - name = "indexer" - desc = "This circuit takes a string and an index value, then returns the character found at in the string at the given index." - extended_desc = "Make sure the index is not longer or shorter than the string length. If you don't, the circuit will return empty." - icon_state = "split" - complexity = 4 - inputs = list( - "string to index" = IC_PINTYPE_STRING, - "index" = IC_PINTYPE_NUMBER, - ) - outputs = list( - "found character" = IC_PINTYPE_STRING - ) - activators = list("index" = IC_PINTYPE_PULSE_IN, "on indexed" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/text/indexer/do_work() - var/strin = get_pin_data(IC_INPUT, 1) - var/ind = get_pin_data(IC_INPUT, 2) - if(ind > 0 && ind <= length(strin)) - set_pin_data(IC_OUTPUT, 1, strin[ind]) - else - set_pin_data(IC_OUTPUT, 1, "") - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/text/findstring - name = "find text" - desc = "This outputs the position of the sample in the string, or returns 0." - extended_desc = "The first pin is the string to be examined. The second pin is the sample to be found. \ - For example, inputting 'my wife has caught on fire' with 'has' as the sample will give you position 9. \ - This circuit isn't case sensitive, and it does not ignore spaces." - complexity = 4 - inputs = list( - "string" = IC_PINTYPE_STRING, - "sample" = IC_PINTYPE_STRING, - ) - outputs = list( - "position" = IC_PINTYPE_NUMBER - ) - activators = list("search" = IC_PINTYPE_PULSE_IN, "after search" = IC_PINTYPE_PULSE_OUT, "found" = IC_PINTYPE_PULSE_OUT, "not found" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - - -/obj/item/integrated_circuit/text/findstring/do_work() - var/position = findtext(get_pin_data(IC_INPUT, 1),get_pin_data(IC_INPUT, 2)) - - set_pin_data(IC_OUTPUT, 1, position) - push_data() - - activate_pin(2) - if(position) - activate_pin(3) - else - activate_pin(4) - -/obj/item/integrated_circuit/text/stringlength - name = "get length" - desc = "This circuit will return the number of characters in a string." - complexity = 1 - inputs = list( - "string" = IC_PINTYPE_STRING - ) - outputs = list( - "length" = IC_PINTYPE_NUMBER - ) - activators = list("get length" = IC_PINTYPE_PULSE_IN, "on acquisition" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/text/stringlength/do_work() - set_pin_data(IC_OUTPUT, 1, length(get_pin_data(IC_INPUT, 1))) - push_data() - - activate_pin(2) - -/obj/item/integrated_circuit/text/exploders - name = "string exploder" - desc = "This splits a single string into a list of strings." - extended_desc = "This circuit splits a given string into a list of strings based on the string and given delimiter. \ - For example, 'eat this burger' will be converted to list('eat','this','burger'). Leave the delimiter null to get a list \ - of every individual character." - icon_state = "split" - complexity = 4 - inputs = list( - "string to split" = IC_PINTYPE_STRING, - "delimiter" = IC_PINTYPE_STRING, - ) - outputs = list( - "list" = IC_PINTYPE_LIST - ) - activators = list("separate" = IC_PINTYPE_PULSE_IN, "on separated" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/text/exploders/do_work() - var/strin = get_pin_data(IC_INPUT, 1) - var/delimiter = get_pin_data(IC_INPUT, 2) - if(delimiter == null) - set_pin_data(IC_OUTPUT, 1, string2charlist(strin)) - else - set_pin_data(IC_OUTPUT, 1, splittext(strin, delimiter)) - push_data() - - activate_pin(2) - - -// - Text Replacer - // -/obj/item/integrated_circuit/text/text_replacer - name = "replace circuit" - desc = "Replaces all of one bit of text with another" - extended_desc = "Takes a string(haystack) and puts out the string while having a certain word(needle) replaced with another. Maximum 512 characters." - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - inputs = list( - "haystack" = IC_PINTYPE_STRING, - "needle" = IC_PINTYPE_STRING, - "replacement" = IC_PINTYPE_STRING - ) - activators = list( - "replace" = IC_PINTYPE_PULSE_IN, - "on replaced" = IC_PINTYPE_PULSE_OUT - ) - outputs = list( - "replaced string" = IC_PINTYPE_STRING - ) - cooldown_per_use = (10 SECONDS) - complexity = 6 - var/max_len = MAX_MESSAGE_LEN / 2 - -/obj/item/integrated_circuit/text/text_replacer/do_work() - set_pin_data(IC_OUTPUT, 1, replacetext(copytext(get_pin_data(IC_INPUT, 1), 1, max_len), copytext(get_pin_data(IC_INPUT, 2), 1, max_len), copytext(get_pin_data(IC_INPUT, 3), 1, max_len))) - push_data() - activate_pin(2) diff --git a/code/modules/integrated_electronics/subtypes/time.dm b/code/modules/integrated_electronics/subtypes/time.dm deleted file mode 100644 index 5a98650676ac6..0000000000000 --- a/code/modules/integrated_electronics/subtypes/time.dm +++ /dev/null @@ -1,187 +0,0 @@ -/obj/item/integrated_circuit/time - name = "time circuit" - desc = "Now you can build your own clock!" - complexity = 1 - inputs = list() - outputs = list() - category_text = "Time" - -/obj/item/integrated_circuit/time/delay - name = "two-sec delay circuit" - desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ - This circuit is set to send a pulse after a delay of two seconds." - icon_state = "delay-20" - var/delay = 2 SECONDS - activators = list("incoming"= IC_PINTYPE_PULSE_IN,"outgoing" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 2 - -/obj/item/integrated_circuit/time/delay/do_work() - addtimer(CALLBACK(src, .proc/activate_pin, 2), delay) - -/obj/item/integrated_circuit/time/delay/five_sec - name = "five-sec delay circuit" - desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ - This circuit is set to send a pulse after a delay of five seconds." - icon_state = "delay-50" - delay = 5 SECONDS - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/time/delay/one_sec - name = "one-sec delay circuit" - desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ - This circuit is set to send a pulse after a delay of one second." - icon_state = "delay-10" - delay = 1 SECONDS - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/time/delay/half_sec - name = "half-sec delay circuit" - desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ - This circuit is set to send a pulse after a delay of half a second." - icon_state = "delay-5" - delay = 0.5 SECONDS - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/time/delay/tenth_sec - name = "tenth-sec delay circuit" - desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ - This circuit is set to send a pulse after a delay of 1/10th of a second." - icon_state = "delay-1" - delay = 0.1 SECONDS - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/time/delay/custom - name = "custom delay circuit" - desc = "This sends a pulse signal out after a delay defined in tenths of a second, critical for ensuring proper control \ - flow in a complex machine. This circuit's delay can be customized, between 1/10th of a second to one hour. \ - The delay is updated upon receiving a pulse." - extended_desc = "The delay is defined in tenths of a second. For instance, 4 will be a delay of 0.4 seconds, or 15 for 1.5 seconds." - icon_state = "delay" - inputs = list("delay time" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/time/delay/custom/on_data_written() - ..() - var/delay_input = get_pin_data(IC_INPUT, 1) - if(!isnum_safe(delay_input)) - return - if(delay_input < 1 || delay_input > 1 HOURS) // Value had to be clamped, update the pin. Check's here to avoid infinitely setting the pin. - set_pin_data(IC_INPUT, 1, CLAMP(delay_input ,1 ,1 HOURS)) - return - delay = delay_input - -/obj/item/integrated_circuit/time/ticker - name = "ticker circuit" - desc = "This circuit sends an automatic pulse every four seconds." - icon_state = "tick-m" - complexity = 4 - var/delay = 4 SECONDS - var/next_fire = 0 - var/is_running = FALSE - inputs = list("enable ticking" = IC_PINTYPE_BOOLEAN) - activators = list("outgoing pulse" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 4 - -/obj/item/integrated_circuit/time/ticker/Destroy() - STOP_PROCESSING(SSfastprocess, src) - return ..() - -/obj/item/integrated_circuit/time/ticker/on_data_written() - var/do_tick = get_pin_data(IC_INPUT, 1) - if(do_tick && !is_running) - is_running = TRUE - START_PROCESSING(SSfastprocess, src) - else if(!do_tick && is_running) - is_running = FALSE - STOP_PROCESSING(SSfastprocess, src) - -/obj/item/integrated_circuit/time/ticker/process() - if(world.time > next_fire) - next_fire = world.time + delay - activate_pin(1) - - -/obj/item/integrated_circuit/time/ticker/custom - name = "custom ticker" - desc = "This advanced circuit sends an automatic pulse every given interval, defined in tenths of a second." - extended_desc ="This advanced circuit sends an automatic pulse every given interval, defined in tenths of a second. \ - For example, setting the time pin to 4 will send a pulse every 0.4 seconds, or 15 for every 1.5 seconds." - icon_state = "tick-f" - complexity = 8 - delay = 2 SECONDS - inputs = list("enable ticking" = IC_PINTYPE_BOOLEAN,"delay time" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 8 - -/obj/item/integrated_circuit/time/ticker/custom/on_data_written() - ..() - var/delay_input = get_pin_data(IC_INPUT, 2) - if(!isnum_safe(delay_input)) - return - if(delay_input < 1 || delay_input > 1 HOURS) - set_pin_data(IC_INPUT, 2, CLAMP(delay_input ,1 ,1 HOURS)) - return - delay = delay_input - -/obj/item/integrated_circuit/time/ticker/fast - name = "fast ticker" - desc = "This advanced circuit sends an automatic pulse every two seconds." - icon_state = "tick-f" - complexity = 6 - delay = 2 SECONDS - spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 8 - -/obj/item/integrated_circuit/time/ticker/slow - name = "slow ticker" - desc = "This simple circuit sends an automatic pulse every six seconds." - icon_state = "tick-s" - complexity = 2 - delay = 6 SECONDS - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 2 - -/obj/item/integrated_circuit/time/clock - name = "integrated clock (NT Common Time)" - desc = "Tells you what the time is, in Nanotrasen Common Time." //round time - icon_state = "clock" - inputs = list() - outputs = list( - "time" = IC_PINTYPE_STRING, - "hours" = IC_PINTYPE_NUMBER, - "minutes" = IC_PINTYPE_NUMBER, - "seconds" = IC_PINTYPE_NUMBER, - "absolute decisecond elapsed time" = IC_PINTYPE_NUMBER - ) - activators = list("get time" = IC_PINTYPE_PULSE_IN, "on time got" = IC_PINTYPE_PULSE_OUT) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 2 - -/obj/item/integrated_circuit/time/clock/proc/get_time() - return world.time - -/obj/item/integrated_circuit/time/clock/do_work() - var/current_time = get_time() - set_pin_data(IC_OUTPUT, 1, time2text(current_time, "hh:mm:ss") ) - set_pin_data(IC_OUTPUT, 2, text2num(time2text(current_time, "hh") ) ) - set_pin_data(IC_OUTPUT, 3, text2num(time2text(current_time, "mm") ) ) - set_pin_data(IC_OUTPUT, 4, text2num(time2text(current_time, "ss") ) ) - set_pin_data(IC_OUTPUT, 5, current_time) - push_data() - activate_pin(2) - -/obj/item/integrated_circuit/time/clock/station - name = "integrated clock (Station Time)" - desc = "Tells you what the time is, in terms and adjusted for your local station or planet" - -/obj/item/integrated_circuit/time/clock/station/get_time() - return station_time() - -/obj/item/integrated_circuit/time/clock/bluespace - name = "integrated clock (Bluespace Absolute Time)" - desc = "Tells you what the time is, in Bluespace Absolute Time, unaffected by local time dilation or other phenomenon." - -/obj/item/integrated_circuit/time/clock/bluespace/get_time() - return REALTIMEOFDAY diff --git a/code/modules/integrated_electronics/subtypes/trig.dm b/code/modules/integrated_electronics/subtypes/trig.dm deleted file mode 100644 index cefa25e945193..0000000000000 --- a/code/modules/integrated_electronics/subtypes/trig.dm +++ /dev/null @@ -1,138 +0,0 @@ -//These circuits do not-so-simple math. -/obj/item/integrated_circuit/trig - complexity = 1 - inputs = list( - "A" = IC_PINTYPE_NUMBER, - "B" = IC_PINTYPE_NUMBER, - "C" = IC_PINTYPE_NUMBER, - "D" = IC_PINTYPE_NUMBER, - "E" = IC_PINTYPE_NUMBER, - "F" = IC_PINTYPE_NUMBER, - "G" = IC_PINTYPE_NUMBER, - "H" = IC_PINTYPE_NUMBER - ) - outputs = list("result" = IC_PINTYPE_NUMBER) - activators = list("compute" = IC_PINTYPE_PULSE_IN, "on computed" = IC_PINTYPE_PULSE_OUT) - category_text = "Trig" - extended_desc = "Input and output are in degrees." - power_draw_per_use = 1 // Still cheap math. - -// Sine // - -/obj/item/integrated_circuit/trig/sine - name = "sin circuit" - desc = "Only evil if you're allergic to math. Takes a degree and outputs the sine of said degree." - icon_state = "sine" - inputs = list("A" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/trig/sine/do_work() - pull_data() - var/result = null - var/A = get_pin_data(IC_INPUT, 1) - if(!isnull(A)) - result = sin(A) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// Cosine // - -/obj/item/integrated_circuit/trig/cosine - name = "cos circuit" - desc = "Takes a degree and outputs the cosine of said degree." - icon_state = "cosine" - inputs = list("A" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/trig/cosine/do_work() - pull_data() - var/result = null - var/A = get_pin_data(IC_INPUT, 1) - if(!isnull(A)) - result = cos(A) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// Tangent // - -/obj/item/integrated_circuit/trig/tangent - name = "tan circuit" - desc = "Takes a degree and outputs the tangent of said degree." - icon_state = "tangent" - inputs = list("A" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/trig/tangent/do_work() - pull_data() - var/result = null - var/A = get_pin_data(IC_INPUT, 1) - if(!isnull(A)) - result = TAN(A) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// Cosecant // - -/obj/item/integrated_circuit/trig/cosecant - name = "cosecant (CSC) circuit" - desc = "Takes a degree and outputs the cosecant of said degree." - icon_state = "cosecant" - inputs = list("A" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/trig/cosecant/do_work() - pull_data() - var/result = null - var/A = get_pin_data(IC_INPUT, 1) - if(!isnull(A)) - result = CSC(A) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// Secant // - -/obj/item/integrated_circuit/trig/secant - name = "secant (SEC) circuit" - desc = "Takes a degree and outputs the secant of said degree." - icon_state = "secant" - inputs = list("A" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/trig/secant/do_work() - pull_data() - var/result = null - var/A = get_pin_data(IC_INPUT, 1) - if(!isnull(A)) - result = SEC(A) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) - -// Cotangent // - -/obj/item/integrated_circuit/trig/cotangent - name = "cotangent (COT) circuit" - desc = "Takes a degree and outputs the cotangent of said degree." - icon_state = "cotangent" - inputs = list("A" = IC_PINTYPE_NUMBER) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/trig/cotangent/do_work() - pull_data() - var/result = null - var/A = get_pin_data(IC_INPUT, 1) - if(!isnull(A)) - result = COT(A) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 6e9e9a70b20d1..8f7a7f6da009c 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -129,21 +129,21 @@ return list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE) /proc/get_all_accesses() - return list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, + return list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_SEC_RECORDS, ACCESS_BRIG, ACCESS_BRIGPHYS, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, ACCESS_MEDICAL, ACCESS_GENETICS, ACCESS_MORGUE, ACCESS_RD, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_CHEMISTRY, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_TELEPORTER, ACCESS_EVA, ACCESS_HEADS, ACCESS_CAPTAIN, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_TECH_STORAGE, ACCESS_CHAPEL_OFFICE, ACCESS_ATMOSPHERICS, ACCESS_KITCHEN, - ACCESS_BAR, ACCESS_JANITOR, ACCESS_CREMATORIUM, ACCESS_ROBOTICS, ACCESS_CARGO, ACCESS_CONSTRUCTION, - ACCESS_HYDROPONICS, ACCESS_LIBRARY, ACCESS_LAWYER, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_QM, ACCESS_SURGERY, + ACCESS_BAR, ACCESS_JANITOR, ACCESS_CREMATORIUM, ACCESS_ROBOTICS, ACCESS_CARGO, ACCESS_CONSTRUCTION, ACCESS_AUX_BASE, + ACCESS_HYDROPONICS, ACCESS_LIBRARY, ACCESS_LAWYER, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_QM, ACCESS_EXPLORATION, ACCESS_SURGERY, ACCESS_THEATRE, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_MAILSORTING, ACCESS_WEAPONS, ACCESS_MECH_MINING, ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY, ACCESS_MECH_MEDICAL, ACCESS_VAULT, ACCESS_MINING_STATION, ACCESS_XENOBIOLOGY, ACCESS_CE, ACCESS_HOP, ACCESS_HOS, ACCESS_APOTHECARY, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_MINISAT, ACCESS_NETWORK, ACCESS_CLONING) /proc/get_all_centcom_access() - return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE, ACCESS_CENT_TELEPORTER, ACCESS_CENT_CAPTAIN) + return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE, ACCESS_CENT_TELEPORTER, ACCESS_CENT_CAPTAIN, ACCESS_CENT_BAR) /proc/get_ert_access(class) switch(class) @@ -159,6 +159,12 @@ /proc/get_all_syndicate_access() return list(ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER) +/proc/get_all_away_access() + return list(ACCESS_AWAY_GENERAL, ACCESS_AWAY_MAINT, ACCESS_AWAY_MED, ACCESS_AWAY_SEC, ACCESS_AWAY_ENGINE, ACCESS_AWAY_GENERIC1, ACCESS_AWAY_GENERIC2, ACCESS_AWAY_GENERIC3, ACCESS_AWAY_GENERIC4) + +/proc/get_every_access() + return get_all_accesses() + get_all_centcom_access() + get_all_syndicate_access() + get_all_away_access() + ACCESS_BLOODCULT + ACCESS_CLOCKCULT + /proc/get_region_accesses(code) switch(code) if(0) @@ -166,15 +172,15 @@ if(1) //station general return list(ACCESS_KITCHEN,ACCESS_BAR, ACCESS_HYDROPONICS, ACCESS_JANITOR, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_LIBRARY, ACCESS_THEATRE, ACCESS_LAWYER) if(2) //security - return list(ACCESS_SEC_DOORS, ACCESS_WEAPONS, ACCESS_SECURITY, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, ACCESS_MECH_SECURITY, ACCESS_HOS) + return list(ACCESS_SEC_DOORS, ACCESS_SEC_RECORDS, ACCESS_WEAPONS, ACCESS_SECURITY, ACCESS_BRIG, ACCESS_BRIGPHYS, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, ACCESS_MECH_SECURITY, ACCESS_HOS) if(3) //medbay return list(ACCESS_MEDICAL, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_SURGERY, ACCESS_MECH_MEDICAL, ACCESS_CMO, ACCESS_APOTHECARY) if(4) //research return list(ACCESS_RESEARCH, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_GENETICS, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_MECH_SCIENCE, ACCESS_MINISAT, ACCESS_RD, ACCESS_NETWORK) if(5) //engineering and maintenance - return list(ACCESS_CONSTRUCTION, ACCESS_MAINT_TUNNELS, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_TECH_STORAGE, ACCESS_ATMOSPHERICS, ACCESS_MECH_ENGINE, ACCESS_TCOMSAT, ACCESS_MINISAT, ACCESS_CE) + return list(ACCESS_CONSTRUCTION, ACCESS_AUX_BASE, ACCESS_MAINT_TUNNELS, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_TECH_STORAGE, ACCESS_ATMOSPHERICS, ACCESS_MECH_ENGINE, ACCESS_TCOMSAT, ACCESS_MINISAT, ACCESS_CE) if(6) //supply - return list(ACCESS_MAILSORTING, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MECH_MINING, ACCESS_MINERAL_STOREROOM, ACCESS_CARGO, ACCESS_QM, ACCESS_VAULT) + return list(ACCESS_MAILSORTING, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MECH_MINING, ACCESS_MINERAL_STOREROOM, ACCESS_CARGO, ACCESS_EXPLORATION, ACCESS_QM, ACCESS_VAULT) if(7) //command return list(ACCESS_HEADS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_TELEPORTER, ACCESS_EVA, ACCESS_GATEWAY, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_HOP, ACCESS_CAPTAIN, ACCESS_VAULT) @@ -221,6 +227,8 @@ return "Toxins Lab" if(ACCESS_CHEMISTRY) return "Chemistry Lab" + if(ACCESS_BRIGPHYS) + return "Brig Physician" if(ACCESS_RD) return "RD Office" if(ACCESS_BAR) @@ -277,6 +285,8 @@ return "CMO Office" if(ACCESS_QM) return "Quartermaster" + if(ACCESS_EXPLORATION) + return "Exploration Dock" if(ACCESS_SURGERY) return "Surgery" if(ACCESS_THEATRE) @@ -311,6 +321,8 @@ return "Gateway" if(ACCESS_SEC_DOORS) return "Brig" + if(ACCESS_SEC_RECORDS) + return "Security Records" if(ACCESS_MINERAL_STOREROOM) return "Mineral Storage" if(ACCESS_MINISAT) @@ -331,6 +343,8 @@ return "Science Mech Access" if(ACCESS_MECH_ENGINE) return "Engineering Mech Access" + if(ACCESS_AUX_BASE) + return "Auxiliary Base" /proc/get_centcom_access_desc(A) switch(A) @@ -354,14 +368,24 @@ return "Code Scotch" /proc/get_all_jobs() - return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Cook", "Botanist", "Quartermaster", "Cargo Technician", - "Shaft Miner", "Clown", "Mime", "Janitor", "Curator", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer", - "Atmospheric Technician", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist", "Paramedic", - "Research Director", "Scientist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician", - "Deputy", "Psychologist", "Barber") + return list("Captain", + // Service + "Assistant", "Head of Personnel", "Bartender", "Cook", "Botanist", "Janitor", "Curator", + "Chaplain", "Lawyer", "Clown", "Mime", "Barber", "Stage Magician", + // Cargo + "Quartermaster", "Cargo Technician","Shaft Miner", + // Engineering + "Chief Engineer", "Station Engineer", "Atmospheric Technician", + // R&D + "Research Director", "Scientist", "Roboticist", "Exploration Crew", + // Medical + "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist", "Paramedic", "Psychiatrist", + // Security + "Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician", "Deputy") + // Each job is supposed to be in their department due to the HoP console. -/proc/get_all_job_icons() //For all existing HUD icons - return get_all_jobs() + list("Prisoner", "King") +/proc/get_all_job_icons() //We need their HUD icons, but we don't want to give these jobs to people from the job list of HoP console. + return get_all_jobs() + list("Prisoner", "King", "VIP", "Debtor", "Acting Captain") /proc/get_all_centcom_jobs() return list("VIP Guest","Custodian","Thunderdome Overseer","CentCom Official","Medical Officer","Death Commando","Research Officer","Special Ops Officer","Admiral","CentCom Commander","Emergency Response Team Commander","Security Response Officer","Engineer Response Officer", "Medical Response Officer","CentCom Bartender","Comedy Response Officer", "HONK Squad Trooper") diff --git a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm index e021f47bfa693..508422246a702 100644 --- a/code/modules/jobs/job_exp.dm +++ b/code/modules/jobs/job_exp.dm @@ -1,7 +1,6 @@ GLOBAL_LIST_EMPTY(exp_to_update) GLOBAL_PROTECT(exp_to_update) - // Procs /datum/job/proc/required_playtime_remaining(client/C) if(!C) @@ -59,79 +58,11 @@ GLOBAL_PROTECT(exp_to_update) amount += explist[job] return amount -/client/proc/get_exp_report() - if(!CONFIG_GET(flag/use_exp_tracking)) - return "Tracking is disabled in the server configuration file." - var/list/play_records = prefs.exp - if(!play_records.len) - set_exp_from_db() - play_records = prefs.exp - if(!play_records.len) - return "[key] has no records." - var/return_text = list() - return_text += "
    " - var/list/exp_data = list() - for(var/category in SSjob.name_occupations) - if(play_records[category]) - exp_data[category] = text2num(play_records[category]) - else - exp_data[category] = 0 - for(var/category in GLOB.exp_specialmap) - if(category == EXP_TYPE_SPECIAL || category == EXP_TYPE_ANTAG) - if(GLOB.exp_specialmap[category]) - for(var/innercat in GLOB.exp_specialmap[category]) - if(play_records[innercat]) - exp_data[innercat] = text2num(play_records[innercat]) - else - exp_data[innercat] = 0 - else - if(play_records[category]) - exp_data[category] = text2num(play_records[category]) - else - exp_data[category] = 0 - - if((prefs.db_flags & DB_FLAG_EXEMPT) || (prefs.job_exempt)) - return_text += "
  • Exempt (all jobs auto-unlocked)
  • " - - for(var/dep in exp_data) - if(exp_data[dep] > 0) - if(exp_data[EXP_TYPE_LIVING] > 0) - var/percentage = num2text(round(exp_data[dep]/exp_data[EXP_TYPE_LIVING]*100)) - return_text += "
  • [dep] [get_exp_format(exp_data[dep])] ([percentage]%)
  • " - else - return_text += "
  • [dep] [get_exp_format(exp_data[dep])]
  • " - if(CONFIG_GET(flag/use_exp_restrictions_admin_bypass) && check_rights_for(src,R_ADMIN)) - return_text += "
  • Admin (all jobs auto-unlocked)
  • " - return_text += "
" - var/list/jobs_locked = list() - var/list/jobs_unlocked = list() - for(var/datum/job/job in SSjob.occupations) - if(job.exp_requirements && job.exp_type) - if(!job_is_xp_locked(job.title)) - continue - else if(!job.required_playtime_remaining(mob.client)) - jobs_unlocked += job.title - else - var/xp_req = job.get_exp_req_amount() - jobs_locked += "[job.title] [get_exp_format(text2num(calc_exp_type(job.get_exp_req_type())))] / [get_exp_format(xp_req)] as [job.get_exp_req_type()])" - if(jobs_unlocked.len) - return_text += "

Jobs Unlocked:
  • " - return_text += jobs_unlocked.Join("
  • ") - return_text += "
" - if(jobs_locked.len) - return_text += "

Jobs Not Unlocked:
  • " - return_text += jobs_locked.Join("
  • ") - return_text += "
" - return return_text - - -/client/proc/get_exp_living(var/format = TRUE) - if(!prefs.exp) - return "No data" +/client/proc/get_exp_living(pure_numeric = FALSE) + if(!prefs.exp || !prefs.exp[EXP_TYPE_LIVING]) + return pure_numeric ? 0 : "No data" var/exp_living = text2num(prefs.exp[EXP_TYPE_LIVING]) - if(format) - return get_exp_format(exp_living) - return exp_living + return pure_numeric ? exp_living : get_exp_format(exp_living) /proc/get_exp_format(expnum) if(expnum > 60) diff --git a/code/modules/jobs/job_report.dm b/code/modules/jobs/job_report.dm new file mode 100644 index 0000000000000..88c7f7ad1902c --- /dev/null +++ b/code/modules/jobs/job_report.dm @@ -0,0 +1,49 @@ +#define JOB_REPORT_MENU_FAIL_REASON_TRACKING_DISABLED 1 +#define JOB_REPORT_MENU_FAIL_REASON_NO_RECORDS 2 + +/datum/job_report_menu + var/client/owner + +/datum/job_report_menu/New(client/owner, mob/viewer) + src.owner = owner + ui_interact(viewer) + +/datum/job_report_menu/ui_state() + return GLOB.always_state + +/datum/job_report_menu/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if (!ui) + ui = new(user, src, "TrackedPlaytime") + ui.open() + +/datum/job_report_menu/ui_static_data() + if (!CONFIG_GET(flag/use_exp_tracking)) + return list("failReason" = JOB_REPORT_MENU_FAIL_REASON_TRACKING_DISABLED) + + var/list/play_records = owner.prefs.exp + if (!play_records.len) + owner.set_exp_from_db() + play_records = owner.prefs.exp + if (!play_records.len) + return list("failReason" = JOB_REPORT_MENU_FAIL_REASON_NO_RECORDS) + + var/list/data = list() + data["jobPlaytimes"] = list() + data["specialPlaytimes"] = list() + + for (var/job_name in SSjob.name_occupations) + var/playtime = play_records[job_name] ? text2num(play_records[job_name]) : 0 + data["jobPlaytimes"][job_name] = playtime + + for (var/special_name in GLOB.exp_specialmap[EXP_TYPE_SPECIAL]) + var/playtime = play_records[special_name] ? text2num(play_records[special_name]) : 0 + data["specialPlaytimes"][special_name] = playtime + + data["livingTime"] = play_records[EXP_TYPE_LIVING] + data["ghostTime"] = play_records[EXP_TYPE_GHOST] + + return data + +#undef JOB_REPORT_MENU_FAIL_REASON_TRACKING_DISABLED +#undef JOB_REPORT_MENU_FAIL_REASON_NO_RECORDS diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index c83b4cce9b435..7d5fea574aa33 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -2,6 +2,9 @@ //The name of the job , used for preferences, bans and more. Make sure you know what you're doing before changing this. var/title = "NOPE" + //Calculated in /New + var/say_span = "" + //Job access. The use of minimal_access or access is determined by a config setting: config.jobs_have_minimal_access var/list/minimal_access = list() //Useful for servers which prefer to only have access given to the places a job absolutely needs (Larger server population) var/list/access = list() //Useful for servers which either have fewer players, so each person needs to fill more than one role, or servers which like to give more access, so players can't hide forever in their super secure departments (I'm looking at you, chemistry!) @@ -13,7 +16,7 @@ var/list/head_announce = null //Bitflags for the job - var/flag = NONE //Deprecated + var/flag = NONE //Deprecated //Except not really, still used throughout the codebase var/department_flag = NONE //Deprecated var/auto_deadmin_role_flags = NONE @@ -62,14 +65,28 @@ var/display_order = JOB_DISPLAY_ORDER_DEFAULT - var/tmp/list/gear_leftovers = list() var/gimmick = FALSE //least hacky way i could think of for this + ///Bitfield of departments this job belongs wit + var/departments = NONE + ///Is this job affected by weird spawns like the ones from station traits + var/random_spawns_possible = TRUE + /// Should this job be allowed to be picked for the bureaucratic error event? + var/allow_bureaucratic_error = TRUE + + ///A dictionary of species IDs and a path to the outfit. + var/list/species_outfits = null + +/datum/job/New() + . = ..() + say_span = replacetext(lowertext(title), " ", "") + //Only override this proc, unless altering loadout code. Loadouts act on H but get info from M //H is usually a human unless an /equip override transformed it //do actions on H but send messages to M as the key may not have been transferred_yet /datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE) //do actions on H but send messages to M as the key may not have been transferred_yet + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_JOB_AFTER_SPAWN, src, H, M, latejoin) if(mind_traits) for(var/t in mind_traits) ADD_TRAIT(H.mind, t, JOB_TRAIT) @@ -77,7 +94,8 @@ if(!ishuman(H)) return var/mob/living/carbon/human/human = H - if(M.client && (M.client.prefs.equipped_gear && M.client.prefs.equipped_gear.len)) + var/list/gear_leftovers = list() + if(M.client && LAZYLEN(M.client.prefs.equipped_gear)) for(var/gear in M.client.prefs.equipped_gear) var/datum/gear/G = GLOB.gear_datums[gear] if(G) @@ -97,12 +115,12 @@ permitted = FALSE if(!permitted) - to_chat(M, "Your current species or role does not permit you to spawn with [gear]!") + to_chat(M, "Your current species or role does not permit you to spawn with [G.display_name]!") continue if(G.slot) if(H.equip_to_slot_or_del(G.spawn_item(H), G.slot)) - to_chat(M, "Equipping you with [gear]!") + to_chat(M, "Equipping you with [G.display_name]!") else gear_leftovers += G else @@ -113,7 +131,7 @@ if(gear_leftovers.len) for(var/datum/gear/G in gear_leftovers) - var/metadata = M.client.prefs.equipped_gear[G.display_name] + var/metadata = M.client.prefs.equipped_gear[G.id] var/item = G.spawn_item(null, metadata) var/atom/placed_in = human.equip_or_collect(item) @@ -140,8 +158,6 @@ to_chat(M, "Failed to locate a storage object on your mob, either you spawned with no hands free and no backpack or this is a bug.") qdel(item) - qdel(gear_leftovers) - /datum/job/proc/announce(mob/living/carbon/human/H) if(head_announce) announce_head(H, head_announce) @@ -178,6 +194,11 @@ //Equip the rest of the gear H.dna.species.before_equip_job(src, H, visualsOnly) + + if(src.species_outfits) + if(H.dna.species.id in src.species_outfits) + var/datum/outfit/O = species_outfits[H.dna.species.id] + H.equipOutfit(O, visualsOnly) if(outfit_override || outfit) H.equipOutfit(outfit_override ? outfit_override : outfit, visualsOnly) @@ -204,7 +225,7 @@ /datum/job/proc/announce_head(var/mob/living/carbon/human/H, var/channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels. if(H && GLOB.announcement_systems.len) //timer because these should come after the captain announcement - SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/addtimer, CALLBACK(pick(GLOB.announcement_systems), /obj/machinery/announcement_system/proc/announce, "NEWHEAD", H.real_name, H.job, channels), 1)) + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/_addtimer, CALLBACK(pick(GLOB.announcement_systems), /obj/machinery/announcement_system/proc/announce, "NEWHEAD", H.real_name, H.job, channels), 1)) //If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1 /datum/job/proc/player_old_enough(client/C) @@ -237,7 +258,7 @@ /datum/outfit/job name = "Standard Gear" - var/jobtype = null + var/jobtype uniform = /obj/item/clothing/under/color/grey id = /obj/item/card/id @@ -251,7 +272,7 @@ var/satchel = /obj/item/storage/backpack/satchel var/duffelbag = /obj/item/storage/backpack/duffelbag - var/pda_slot = SLOT_BELT + var/pda_slot = ITEM_SLOT_BELT /datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) switch(H.backbag) @@ -270,6 +291,17 @@ else back = backpack //Department backpack + //converts the uniform string into the path we'll wear, whether it's the skirt or regular variant + var/holder + if(H.jumpsuit_style == PREF_SKIRT) + holder = "[uniform]/skirt" + if(!text2path(holder)) + holder = "[uniform]" + else + holder = "[uniform]" + uniform = text2path(holder) + + /datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) return diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm index 9653797d03f10..30d7d024ab5de 100644 --- a/code/modules/jobs/job_types/ai.dm +++ b/code/modules/jobs/job_types/ai.dm @@ -10,10 +10,13 @@ supervisors = "your laws" req_admin_notify = TRUE minimal_player_age = 30 - exp_requirements = 240 + exp_requirements = 600 exp_type = EXP_TYPE_CREW exp_type_department = EXP_TYPE_SILICON display_order = JOB_DISPLAY_ORDER_AI + departments = DEPARTMENT_SILICON + random_spawns_possible = FALSE + allow_bureaucratic_error = FALSE var/do_special_check = TRUE /datum/job/ai/equip(mob/living/carbon/human/H, visualsOnly, announce, latejoin, datum/outfit/outfit_override, client/preference_source = null) diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index 6a5f4a9a611e3..9d15f4896d4a6 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -18,7 +18,11 @@ Assistant 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 + departments = DEPARTMENT_SERVICE + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman + ) /datum/job/assistant/get_access() if(CONFIG_GET(flag/assistants_have_maint_access) || !CONFIG_GET(flag/jobs_have_minimal_access)) //Config has assistant maint access set . = ..() @@ -33,6 +37,12 @@ Assistant /datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/H) ..() if (CONFIG_GET(flag/grey_assistants)) - uniform = /obj/item/clothing/under/color/grey + if(H.jumpsuit_style == PREF_SUIT) + uniform = /obj/item/clothing/under/color/grey + else + uniform = /obj/item/clothing/under/skirt/color/grey else - uniform = /obj/item/clothing/under/color/random + if(H.jumpsuit_style == PREF_SUIT) + uniform = /obj/item/clothing/under/color/random + else + uniform = /obj/item/clothing/under/skirt/color/random diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index 70412c2c1452a..33918897a09a5 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -9,17 +9,22 @@ supervisors = "the chief engineer" selection_color = "#fff5cc" chat_color = "#D4A07D" + exp_requirements = 120 exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/atmos access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, ACCESS_MECH_ENGINE, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_CONSTRUCTION, ACCESS_MECH_ENGINE, ACCESS_MINERAL_STOREROOM) + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM, ACCESS_AUX_BASE) + minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_CONSTRUCTION, ACCESS_MECH_ENGINE, ACCESS_MINERAL_STOREROOM, ACCESS_AUX_BASE) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_ENG display_order = JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN + departments = DEPARTMENT_ENGINEERING + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/atmospherics + ) /datum/outfit/job/atmos name = "Atmospheric Technician" jobtype = /datum/job/atmos @@ -35,7 +40,7 @@ satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering box = /obj/item/storage/box/engineer - pda_slot = SLOT_L_STORE + pda_slot = ITEM_SLOT_LPOCKET backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) /datum/outfit/job/atmos/rig @@ -44,4 +49,4 @@ mask = /obj/item/clothing/mask/gas suit = /obj/item/clothing/suit/space/hardsuit/engine/atmos suit_store = /obj/item/tank/internals/oxygen - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index b4e201d686087..572042bc51438 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -18,7 +18,11 @@ paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_BARTENDER + departments = DEPARTMENT_SERVICE + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/bar + ) /datum/outfit/job/bartender name = "Bartender" jobtype = /datum/job/bartender diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index 1ee1c3338639e..3b2938f4d5b99 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -17,7 +17,11 @@ paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_BOTANIST + departments = DEPARTMENT_SERVICE + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/botany + ) /datum/outfit/job/botanist name = "Botanist" jobtype = /datum/job/hydro @@ -27,7 +31,7 @@ ears = /obj/item/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/civilian/hydroponics suit = /obj/item/clothing/suit/apron - gloves =/obj/item/clothing/gloves/botanic_leather + gloves = /obj/item/clothing/gloves/botanic_leather suit_store = /obj/item/plant_analyzer backpack = /obj/item/storage/backpack/botany diff --git a/code/modules/jobs/job_types/brigphys.dm b/code/modules/jobs/job_types/brigphys.dm index 670c1f2e53e07..0dc6acf7c000d 100644 --- a/code/modules/jobs/job_types/brigphys.dm +++ b/code/modules/jobs/job_types/brigphys.dm @@ -1,29 +1,31 @@ /datum/job/brig_phys title = "Brig Physician" flag = BRIG_PHYS - department_head = list("Head of Security", "Chief Medical Officer") + department_head = list("Chief Medical Officer") department_flag = ENGSEC faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the head of security and chief medical officer" + supervisors = "chief medical officer" selection_color = "#ffeeee" chat_color = "#b16789" minimal_player_age = 7 exp_requirements = 120 exp_type = EXP_TYPE_CREW - exp_type_department = EXP_TYPE_SECURITY outfit = /datum/outfit/job/brig_phys - access = list(ACCESS_BRIGPHYS, ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MEDICAL, ACCESS_KEYCARD_AUTH) - minimal_access = list(ACCESS_SECURITY, ACCESS_BRIGPHYS, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MEDICAL, ACCESS_KEYCARD_AUTH) - paycheck = PAYCHECK_HARD + access = list(ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_MEDICAL, ACCESS_BRIGPHYS) + minimal_access = list(ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_MEDICAL, ACCESS_BRIGPHYS) + paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED - mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_BRIG_PHYS + departments = DEPARTMENT_MEDICAL | DEPARTMENT_SECURITY + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/secmed + ) /datum/outfit/job/brig_phys name = "Brig Physician" jobtype = /datum/job/brig_phys @@ -34,12 +36,14 @@ shoes = /obj/item/clothing/shoes/sneakers/white glasses = /obj/item/clothing/glasses/hud/health/sunglasses suit = /obj/item/clothing/suit/hazardvest/brig_phys + gloves = /obj/item/clothing/gloves/color/latex/nitrile suit_store = /obj/item/flashlight/seclite l_hand = /obj/item/storage/firstaid/medical head = /obj/item/clothing/head/soft/sec/brig_phys - implants = list(/obj/item/implant/mindshield) backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med duffelbag = /obj/item/storage/backpack/duffelbag/med box = /obj/item/storage/box/security + + chameleon_extras = /obj/item/gun/syringe diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 02c159d0ea91f..c5b8655201949 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -26,7 +26,11 @@ mind_traits = list(TRAIT_DISK_VERIFIER) display_order = JOB_DISPLAY_ORDER_CAPTAIN + departments = DEPARTMENT_COMMAND + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/command + ) /datum/job/captain/get_access() return get_all_accesses() @@ -47,7 +51,7 @@ suit = /obj/item/clothing/suit/armor/vest/capcarapace shoes = /obj/item/clothing/shoes/sneakers/brown head = /obj/item/clothing/head/caphat - backpack_contents = list(/obj/item/melee/classic_baton/police/telescopic=1, /obj/item/station_charter=1) + backpack_contents = list(/obj/item/melee/classic_baton/police/telescopic=1, /obj/item/station_charter=1, /obj/item/modular_computer/tablet/preset/advanced=1) backpack = /obj/item/storage/backpack/captain satchel = /obj/item/storage/backpack/satchel/cap diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index 94ea69f421132..e6f9598035437 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -18,7 +18,11 @@ paycheck_department = ACCOUNT_CAR display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN + departments = DEPARTMENT_CARGO + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/cargo + ) /datum/outfit/job/cargo_tech name = "Cargo Technician" jobtype = /datum/job/cargo_tech diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index da3e554e84b83..93c6c3e945295 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -10,6 +10,7 @@ selection_color = "#dddddd" chat_color = "#8AB48C" + outfit = /datum/outfit/job/chaplain access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE) @@ -18,26 +19,31 @@ paycheck_department = ACCOUNT_CIV display_order = JOB_DISPLAY_ORDER_CHAPLAIN + departments = DEPARTMENT_SERVICE + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/chaplain + ) /datum/job/chaplain/after_spawn(mob/living/H, mob/M) . = ..() - if(H.mind) - H.mind.isholy = TRUE var/obj/item/storage/book/bible/booze/B = new if(GLOB.religion) + H.mind?.holy_role = HOLY_ROLE_PRIEST B.deity_name = GLOB.deity B.name = GLOB.bible_name B.icon_state = GLOB.bible_icon_state B.item_state = GLOB.bible_item_state to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [GLOB.deity]. Defer to the Chaplain.") - H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(B, ITEM_SLOT_BACKPACK) var/nrt = GLOB.holy_weapon_type || /obj/item/nullrod var/obj/item/nullrod/N = new nrt(H) H.put_in_hands(N) + GLOB.religious_sect?.on_conversion(H) return + H.mind?.holy_role = HOLY_ROLE_HIGHPRIEST var/new_religion = DEFAULT_RELIGION if(M.client && M.client.prefs.custom_names["religion"]) @@ -63,8 +69,6 @@ B.name = "The Necronomicon" if("hinduism") B.name = "The Vedas" - if("homosexuality") - B.name = pick("Guys Gone Wild","Coming Out of The Closet") if("imperium") B.name = "Uplifting Primer" if("islam") @@ -73,9 +77,6 @@ B.name = "The Torah" if("lampism") 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 if("monkeyism","apism","gorillism","primatism") B.name = pick("Going Bananas", "Bananas Out For Harambe") if("mormonism") @@ -107,7 +108,7 @@ GLOB.bible_name = B.name GLOB.deity = B.deity_name - H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(B, ITEM_SLOT_BACKPACK) SSblackbox.record_feedback("text", "religion_name", 1, "[new_religion]", 1) SSblackbox.record_feedback("text", "religion_deity", 1, "[new_deity]", 1) diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index a3c76f56e0b49..7d36248996fcf 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -9,6 +9,7 @@ supervisors = "the chief medical officer" selection_color = "#d4ebf2" chat_color = "#82BDCE" + exp_requirements = 120 exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/chemist @@ -19,7 +20,11 @@ paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_CHEMIST + departments = DEPARTMENT_MEDICAL + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/chemist + ) /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 af8122d323a9b..dc7eacf6ca5d5 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -20,18 +20,22 @@ outfit = /datum/outfit/job/ce access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, ACCESS_AUX_BASE, ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, ACCESS_MECH_ENGINE, ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, ACCESS_AUX_BASE, ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, ACCESS_MECH_ENGINE, ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_COMMAND paycheck_department = ACCOUNT_ENG display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER + departments = DEPARTMENT_ENGINEERING | DEPARTMENT_COMMAND + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/ce + ) /datum/outfit/job/ce name = "Chief Engineer" jobtype = /datum/job/chief_engineer @@ -50,7 +54,7 @@ satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering box = /obj/item/storage/box/engineer - pda_slot = SLOT_L_STORE + pda_slot = ITEM_SLOT_LPOCKET chameleon_extras = /obj/item/stamp/ce /datum/outfit/job/ce/rig @@ -63,4 +67,4 @@ glasses = /obj/item/clothing/glasses/meson/engine gloves = /obj/item/clothing/gloves/color/yellow head = null - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index b27561a3c4adc..b26ab3ee4ad38 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -21,14 +21,19 @@ access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_APOTHECARY, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, ACCESS_MECH_MEDICAL, - ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) + ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS, ACCESS_BRIGPHYS) minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_APOTHECARY, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, ACCESS_MECH_MEDICAL, - ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) + ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS, ACCESS_BRIGPHYS) paycheck = PAYCHECK_COMMAND paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER + departments = DEPARTMENT_MEDICAL | DEPARTMENT_COMMAND + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/cmo + ) /datum/outfit/job/cmo name = "Chief Medical Officer" @@ -58,4 +63,3 @@ suit = /obj/item/clothing/suit/space/hardsuit/medical/cmo suit_store = /obj/item/tank/internals/oxygen r_pocket = /obj/item/flashlight/pen - diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index a7ea5b08a38de..b5c34bf771a06 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -18,7 +18,11 @@ paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_CLOWN + departments = DEPARTMENT_SERVICE + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/honk + ) /datum/job/clown/after_spawn(mob/living/carbon/human/H, mob/M) . = ..() @@ -52,6 +56,11 @@ chameleon_extras = /obj/item/stamp/clown +/datum/outfit/job/clown/pre_equip(mob/living/carbon/human/H, visualsOnly) + . = ..() + if(HAS_TRAIT(SSstation, STATION_TRAIT_BANANIUM_SHIPMENTS)) + backpack_contents[/obj/item/stack/sheet/mineral/bananium/five] = 1 + /datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 0afd7ec0c662b..2ed7549de09d0 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -19,7 +19,11 @@ paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_COOK + departments = DEPARTMENT_SERVICE + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/chef + ) /datum/outfit/job/cook name = "Cook" jobtype = /datum/job/cook @@ -50,7 +54,7 @@ var/list/possible_boxes = subtypesof(/obj/item/storage/box/ingredients) var/chosen_box = pick(possible_boxes) var/obj/item/storage/box/I = new chosen_box(src) - H.equip_to_slot_or_del(I,SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(I,ITEM_SLOT_BACKPACK) var/datum/martial_art/cqc/under_siege/justacook = new justacook.teach(H) diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index 31ce98e0d438f..26d3c2ed85d13 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -12,13 +12,17 @@ outfit = /datum/outfit/job/curator - access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION, ACCESS_MINING_STATION) - minimal_access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION, ACCESS_MINING_STATION) + access = list(ACCESS_LIBRARY, ACCESS_AUX_BASE, ACCESS_MINING_STATION) + minimal_access = list(ACCESS_LIBRARY, ACCESS_AUX_BASE, ACCESS_MINING_STATION) paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_CIV display_order = JOB_DISPLAY_ORDER_CURATOR + departments = DEPARTMENT_SERVICE + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/curator + ) /datum/outfit/job/curator name = "Curator" jobtype = /datum/job/curator @@ -26,7 +30,7 @@ id = /obj/item/card/id/job/chap shoes = /obj/item/clothing/shoes/laceup belt = /obj/item/pda/curator - ears = /obj/item/radio/headset/headset_srv + ears = /obj/item/radio/headset/headset_curator uniform = /obj/item/clothing/under/rank/civilian/curator l_hand = /obj/item/storage/bag/books r_pocket = /obj/item/key/displaycase diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm index 70d96cc07349d..0e262badb9225 100644 --- a/code/modules/jobs/job_types/cyborg.dm +++ b/code/modules/jobs/job_types/cyborg.dm @@ -11,8 +11,10 @@ minimal_player_age = 21 exp_requirements = 120 exp_type = EXP_TYPE_CREW + random_spawns_possible = FALSE display_order = JOB_DISPLAY_ORDER_CYBORG + departments = DEPARTMENT_SILICON /datum/job/cyborg/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, datum/outfit/outfit_override = null, client/preference_source = null) if(visualsOnly) diff --git a/code/modules/jobs/job_types/deputy.dm b/code/modules/jobs/job_types/deputy.dm index 38d810c1be63a..6e84deef6830d 100644 --- a/code/modules/jobs/job_types/deputy.dm +++ b/code/modules/jobs/job_types/deputy.dm @@ -8,6 +8,7 @@ spawn_positions = 0 supervisors = "the head of security" selection_color = "#ffeeee" + chat_color = "#ffeeee" minimal_player_age = 7 exp_requirements = 180 exp_type = EXP_TYPE_CREW @@ -21,6 +22,7 @@ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_DEPUTY //see code/__DEFINES/jobs.dm + departments = DEPARTMENT_SECURITY /datum/outfit/job/deputy name = "Deputy" @@ -39,22 +41,9 @@ satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec box = /obj/item/storage/box/survival - -/obj/item/card/deputy_access_card - name = "deputy assignment card" - desc = "A small card, that when used on any ID, will grant basic security access and the role of Deputy." - icon_state = "data_1" -/obj/item/card/deputy_access_card/afterattack(atom/movable/AM, mob/user, proximity) - . = ..() - if(istype(AM, /obj/item/card/id) && proximity) - var/obj/item/card/id/I = AM - I.assignment = "Deputy" - I.access |= ACCESS_SEC_DOORS - I.access |= ACCESS_MAINT_TUNNELS - I.access |= ACCESS_COURT - I.access |= ACCESS_BRIG - I.access |= ACCESS_WEAPONS - to_chat(user, "You have been assigned as deputy.") - log_id("[key_name(user)] added basic security access to '[I]' using [src] at [AREACOORD(user)].") - qdel(src) +/obj/item/card/id/pass/deputy + name = "deputy promotion card" + desc = "A small card, that when used on an ID, will grant basic security access, and the job title of 'Deputy.'" + assignment = "Deputy" + access = list(ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS) \ No newline at end of file diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index 737f68d201aab..24fe0fc991f08 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -17,14 +17,18 @@ outfit = /datum/outfit/job/detective - access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_MECH_SECURITY, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH) - minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_MECH_SECURITY, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH) + access = list(ACCESS_SEC_DOORS, ACCESS_SEC_RECORDS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_MECH_SECURITY, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_SEC_DOORS, ACCESS_SEC_RECORDS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_MECH_SECURITY, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_SEC mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_DETECTIVE + departments = DEPARTMENT_SECURITY + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/detective + ) /datum/outfit/job/detective name = "Detective" jobtype = /datum/job/detective diff --git a/code/modules/jobs/job_types/emt.dm b/code/modules/jobs/job_types/emt.dm index 713da7dfd3880..6f53305daa816 100644 --- a/code/modules/jobs/job_types/emt.dm +++ b/code/modules/jobs/job_types/emt.dm @@ -9,16 +9,24 @@ supervisors = "the chief medical officer" selection_color = "#d4ebf2" chat_color = "#8FBEB4" + exp_requirements = 120 + exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/emt - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS, ACCESS_EVA, ACCESS_EXTERNAL_AIRLOCKS) - minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CLONING, ACCESS_MECH_MEDICAL, ACCESS_MAINT_TUNNELS, ACCESS_EVA, ACCESS_EXTERNAL_AIRLOCKS) + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, + ACCESS_MAINT_TUNNELS, ACCESS_EVA, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_AUX_BASE) + minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CLONING, ACCESS_MECH_MEDICAL, ACCESS_MAINT_TUNNELS, + ACCESS_EVA, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_AUX_BASE) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_MEDICAL_DOCTOR + departments = DEPARTMENT_MEDICAL + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/emt + ) /datum/outfit/job/emt name = "Paramedic" jobtype = /datum/job/emt @@ -26,6 +34,7 @@ id = /obj/item/card/id/job/med belt = /obj/item/pda/medical ears = /obj/item/radio/headset/headset_med + gloves = /obj/item/clothing/gloves/color/latex/nitrile uniform = /obj/item/clothing/under/rank/medical/emt shoes = /obj/item/clothing/shoes/sneakers/white head = /obj/item/clothing/head/soft/emt diff --git a/code/modules/jobs/job_types/exploration_team.dm b/code/modules/jobs/job_types/exploration_team.dm new file mode 100644 index 0000000000000..fd824a0a0d753 --- /dev/null +++ b/code/modules/jobs/job_types/exploration_team.dm @@ -0,0 +1,128 @@ +/datum/job/exploration + title = "Exploration Crew" + flag = EXPLORATION_CREW + department_head = list("Research Director") + department_flag = MEDSCI + faction = "Station" + total_positions = 3 + spawn_positions = 3 + supervisors = "the research director" + selection_color = "#ffeeff" + chat_color = "#85d8b8" + + outfit = /datum/outfit/job/exploration + + access = list(ACCESS_MAINT_TUNNELS, ACCESS_RESEARCH, ACCESS_EXPLORATION, ACCESS_TOX, ACCESS_MECH_SCIENCE, ACCESS_XENOBIOLOGY) + minimal_access = list(ACCESS_RESEARCH, ACCESS_EXPLORATION, ACCESS_TOX, ACCESS_MECH_SCIENCE) + paycheck = PAYCHECK_HARD + paycheck_department = ACCOUNT_SCI + + display_order = JOB_DISPLAY_ORDER_EXPLORATION + departments = DEPARTMENT_SCIENCE + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/exploration + ) + +/datum/job/exploration/equip(mob/living/carbon/human/H, visualsOnly, announce, latejoin, datum/outfit/outfit_override, client/preference_source) + if(outfit_override) + return ..() + if(visualsOnly || latejoin) + return ..() + var/static/exploration_job_id = 0 + exploration_job_id ++ + switch(exploration_job_id) + //Scientist is most important due to scanner + if(1) + to_chat(H, "You are the exploration team's Scientist!") + to_chat(H, "Scan undiscovered creates to gain discovery research points!") + outfit_override = /datum/outfit/job/exploration/scientist + if(2) + to_chat(H, "You are the exploration team's Medical Doctor!") + to_chat(H, "Ensure your team's health by locating and healing injured team members.") + outfit_override = /datum/outfit/job/exploration/medic + if(3) + to_chat(H, "You are the exploration team's Engineer!") + to_chat(H, "Create entry points with your explosives and maintain the hull of your ship.") + outfit_override = /datum/outfit/job/exploration/engineer + . = ..(H, visualsOnly, announce, latejoin, outfit_override, preference_source) + +/datum/outfit/job/exploration + name = "Exploration Crew" + jobtype = /datum/job/exploration + + id = /obj/item/card/id/job/exploration + belt = /obj/item/pda/exploration + ears = /obj/item/radio/headset/headset_exploration + shoes = /obj/item/clothing/shoes/jackboots + gloves = /obj/item/clothing/gloves/color/black + uniform = /obj/item/clothing/under/rank/cargo/exploration + backpack_contents = list( + /obj/item/kitchen/knife/combat/survival=1,\ + /obj/item/stack/marker_beacon/thirty=1) + l_pocket = /obj/item/gps/mining/exploration + r_pocket = /obj/item/gun/energy/e_gun/mini/exploration + + backpack = /obj/item/storage/backpack/explorer + satchel = /obj/item/storage/backpack/satchel/explorer + duffelbag = /obj/item/storage/backpack/duffelbag + + chameleon_extras = /obj/item/gun/energy/e_gun/mini/exploration + +/datum/outfit/job/exploration/engineer + name = "Exploration Crew (Engineer)" + + belt = /obj/item/storage/belt/utility/full + r_pocket = /obj/item/pda/exploration + + backpack_contents = list( + /obj/item/kitchen/knife/combat/survival=1, + /obj/item/stack/marker_beacon/thirty=1, + /obj/item/gun/energy/e_gun/mini/exploration=1, + /obj/item/grenade/exploration=3, //Breaching charges for entering ruins + /obj/item/exploration_detonator=1, //Detonator for the breaching charges. + /obj/item/discovery_scanner=1 + ) + + backpack = /obj/item/storage/backpack/industrial + satchel = /obj/item/storage/backpack/satchel/eng + duffelbag = /obj/item/storage/backpack/duffelbag/engineering + +/datum/outfit/job/exploration/scientist + name = "Exploration Crew (Scientist)" + + glasses = /obj/item/clothing/glasses/science + + backpack_contents = list( + /obj/item/kitchen/knife/combat/survival=1, + /obj/item/stack/marker_beacon/thirty=1, + /obj/item/discovery_scanner=1, + /obj/item/sbeacondrop/exploration=1, //Spawns in a bluespace beacon + /obj/item/research_disk_pinpointer=1 //Locates research disks + ) + + backpack = /obj/item/storage/backpack/science + satchel = /obj/item/storage/backpack/satchel/tox + +/datum/outfit/job/exploration/medic + name = "Exploration Crew (Medical Doctor)" + + backpack_contents = list( + /obj/item/kitchen/knife/combat/survival=1, + /obj/item/stack/marker_beacon/thirty=1, + /obj/item/storage/firstaid/medical=1, + /obj/item/pinpointer/crew=1, + /obj/item/sensor_device=1, + /obj/item/roller=1, + /obj/item/discovery_scanner=1 + ) + + backpack = /obj/item/storage/backpack/medic + satchel = /obj/item/storage/backpack/satchel/med + duffelbag = /obj/item/storage/backpack/duffelbag/med + +/datum/outfit/job/exploration/hardsuit + name = "Exploration Crew (Hardsuit)" + suit = /obj/item/clothing/suit/space/hardsuit/exploration + suit_store = /obj/item/tank/internals/emergency_oxygen/double + mask = /obj/item/clothing/mask/breath diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index 9e8e2e31d39ec..5e4752d8f2ea5 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -9,6 +9,7 @@ supervisors = "the chief medical officer and research director" selection_color = "#d4ebf2" chat_color = "#83BBBF" + exp_requirements = 120 exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/geneticist @@ -19,7 +20,11 @@ paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_GENETICIST + departments = DEPARTMENT_MEDICAL + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/genetics + ) /datum/outfit/job/geneticist name = "Geneticist" jobtype = /datum/job/geneticist diff --git a/code/modules/jobs/job_types/gimmick.dm b/code/modules/jobs/job_types/gimmick.dm index f7d4eb45729be..82dfe3fe706be 100644 --- a/code/modules/jobs/job_types/gimmick.dm +++ b/code/modules/jobs/job_types/gimmick.dm @@ -7,17 +7,23 @@ spawn_positions = 0 supervisors = "no one" selection_color = "#dddddd" + chat_color = "#FFFFFF" - access = list( ACCESS_MAINT_TUNNELS) + exp_type_department = EXP_TYPE_GIMMICK + + access = list(ACCESS_MAINT_TUNNELS) minimal_access = list(ACCESS_MAINT_TUNNELS) paycheck = PAYCHECK_ASSISTANT paycheck_department = ACCOUNT_CIV display_order = JOB_DISPLAY_ORDER_ASSISTANT + departments = DEPARTMENT_SERVICE + + allow_bureaucratic_error = FALSE + outfit = /datum/outfit/job/gimmick -/datum/job/gimmick/New() - . = ..() - GLOB.civilian_positions |= title +/datum/outfit/job/gimmick + can_be_admin_equipped = FALSE // we want just the parent outfit to be unequippable since this leads to problems /datum/job/gimmick/barber title = "Barber" @@ -26,6 +32,11 @@ access = list(ACCESS_MORGUE, ACCESS_MAINT_TUNNELS) minimal_access = list(ACCESS_MORGUE, ACCESS_MAINT_TUNNELS) gimmick = TRUE + chat_color = "#bd9e86" + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman + ) /datum/outfit/job/gimmick/barber name = "Barber" @@ -37,6 +48,7 @@ shoes = /obj/item/clothing/shoes/laceup l_hand = /obj/item/storage/wallet l_pocket = /obj/item/razor/straightrazor + can_be_admin_equipped = TRUE /datum/job/gimmick/magician title = "Stage Magician" @@ -45,6 +57,11 @@ access = list(ACCESS_THEATRE, ACCESS_MAINT_TUNNELS) minimal_access = list(ACCESS_THEATRE, ACCESS_MAINT_TUNNELS) gimmick = TRUE + chat_color = "#b898b3" + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/magic + ) /datum/outfit/job/gimmick/magician name = "Stage Magician" @@ -59,6 +76,7 @@ gloves = /obj/item/clothing/gloves/color/white l_hand = /obj/item/cane backpack_contents = list(/obj/item/choice_beacon/magic=1) + can_be_admin_equipped = TRUE /datum/job/gimmick/hobo title = "Debtor" @@ -67,6 +85,12 @@ access = list(ACCESS_MAINT_TUNNELS) minimal_access = list(ACCESS_MAINT_TUNNELS) gimmick = TRUE + chat_color = "#929292" + departments = NONE //being hobo is not a real job + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/hobo + ) /datum/outfit/job/gimmick/hobo name = "Debtor" @@ -76,7 +100,7 @@ ears = null //hobos dont start with a headset uniform = /obj/item/clothing/under/pants/jeans suit = /obj/item/clothing/suit/jacket - + can_be_admin_equipped = TRUE /datum/outfit/job/gimmick/hobo/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() @@ -86,7 +110,7 @@ var/list/possible_drugs = list(/obj/item/storage/pill_bottle/happy, /obj/item/storage/pill_bottle/zoom, /obj/item/storage/pill_bottle/stimulant, /obj/item/storage/pill_bottle/lsd, /obj/item/storage/pill_bottle/aranesp, /obj/item/storage/pill_bottle/floorpill/full) var/chosen_drugs = pick(possible_drugs) var/obj/item/storage/pill_bottle/I = new chosen_drugs(src) - H.equip_to_slot_or_del(I,SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(I,ITEM_SLOT_BACKPACK) var/datum/martial_art/psychotic_brawling/junkie = new //this fits well, but i'm unsure about it, cuz this martial art is so fucking rng dependent i swear... junkie.teach(H) ADD_TRAIT(H, TRAIT_APPRAISAL, JOB_TRAIT) @@ -100,6 +124,12 @@ minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MEDICAL) paycheck = PAYCHECK_EASY gimmick = TRUE + chat_color = "#a2dfdc" + departments = DEPARTMENT_MEDICAL + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman + ) /datum/outfit/job/gimmick/shrink //psychiatrist doesnt get much shit, but he has more access and a cushier paycheck name = "Psychiatrist" @@ -109,15 +139,22 @@ ears = /obj/item/radio/headset/headset_med uniform = /obj/item/clothing/under/suit/black shoes = /obj/item/clothing/shoes/laceup + backpack_contents = list(/obj/item/choice_beacon/pet/ems=1) + can_be_admin_equipped = TRUE /datum/job/gimmick/celebrity title = "VIP" flag = CELEBRITY outfit = /datum/outfit/job/gimmick/celebrity - access = list(ACCESS_HEADS, ACCESS_MAINT_TUNNELS) //there is no way whatsoever this could go wrong - minimal_access = list(ACCESS_HEADS, ACCESS_MAINT_TUNNELS) + access = list(ACCESS_MAINT_TUNNELS) //Assistants with shitloads of money, what could go wrong? + minimal_access = list(ACCESS_MAINT_TUNNELS) gimmick = TRUE paycheck = PAYCHECK_VIP //our power is being fucking rich + chat_color = "#ebc96b" + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/vip + ) /datum/outfit/job/gimmick/celebrity name = "VIP" @@ -128,5 +165,4 @@ ears = /obj/item/radio/headset/heads //VIP can talk loud for no reason uniform = /obj/item/clothing/under/suit/black_really shoes = /obj/item/clothing/shoes/laceup - - implants = list(/obj/item/implant/mindshield) //this fuck gets a mindshield, but he isn't necessarily antag-proof \ No newline at end of file + can_be_admin_equipped = TRUE diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index f37feebf1cf77..41f1d4ed3341d 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -14,8 +14,8 @@ req_admin_notify = 1 minimal_player_age = 10 exp_requirements = 600 - exp_type = EXP_TYPE_SERVICE - exp_type_department = EXP_TYPE_SERVICE + exp_type = EXP_TYPE_COMMAND + exp_type_department = EXP_TYPE_COMMAND outfit = /datum/outfit/job/hop @@ -24,19 +24,24 @@ ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER, ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, - ACCESS_MECH_MINING, ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY, ACCESS_MECH_MEDICAL, - ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) + ACCESS_MECH_MINING, ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY, ACCESS_MECH_MEDICAL, ACCESS_EXPLORATION, + ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_AUX_BASE) minimal_access = list(ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER, - ACCESS_MECH_MINING, ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY, ACCESS_MECH_MEDICAL, + ACCESS_MECH_MINING, ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY, ACCESS_MECH_MEDICAL, ACCESS_EXPLORATION, 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) + ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_AUX_BASE) paycheck = PAYCHECK_COMMAND paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL + departments = DEPARTMENT_COMMAND | DEPARTMENT_SERVICE + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/hop + ) /datum/outfit/job/hop name = "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 8b6aec2e01af7..88550c7663656 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -20,18 +20,23 @@ outfit = /datum/outfit/job/hos mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) - access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MECH_SECURITY, - ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, + access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_SEC_RECORDS, ACCESS_BRIG, ACCESS_BRIGPHYS, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MECH_SECURITY, + ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_AUX_BASE, 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) - minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MECH_SECURITY, - ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, + minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_SEC_RECORDS, ACCESS_BRIG, ACCESS_BRIGPHYS, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MECH_SECURITY, + ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_AUX_BASE, 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 + departments = DEPARTMENT_SECURITY | DEPARTMENT_COMMAND + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/hos + ) /datum/outfit/job/hos name = "Head of Security" @@ -49,7 +54,7 @@ suit_store = /obj/item/gun/energy/e_gun r_pocket = /obj/item/assembly/flash/handheld l_pocket = /obj/item/restraints/handcuffs - backpack_contents = list(/obj/item/melee/baton/loaded=1, /obj/item/club=1) + backpack_contents = list(/obj/item/melee/baton/loaded=1) backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec @@ -66,5 +71,5 @@ mask = /obj/item/clothing/mask/gas/sechailer suit = /obj/item/clothing/suit/space/hardsuit/security/hos suit_store = /obj/item/tank/internals/oxygen - backpack_contents = list(/obj/item/melee/baton/loaded=1, /obj/item/gun/energy/e_gun=1) + backpack_contents = list(/obj/item/melee/baton/loaded=1) diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index 9677931605041..14e2f8dfa412d 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -18,6 +18,11 @@ paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_JANITOR + departments = DEPARTMENT_SERVICE + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/janitor + ) /datum/outfit/job/janitor name = "Janitor" @@ -28,3 +33,9 @@ ears = /obj/item/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/civilian/janitor backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) + +/datum/outfit/job/janitor/pre_equip(mob/living/carbon/human/H, visualsOnly) + . = ..() + if(GARBAGEDAY in SSevents.holidays) + l_pocket = /obj/item/gun/ballistic/revolver + r_pocket = /obj/item/ammo_box/a357 diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index 04ab7ebe2a8b7..13bcb6e6e4c32 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -20,6 +20,11 @@ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_LAWYER + departments = DEPARTMENT_SERVICE + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman //they dont have one. + ) /datum/outfit/job/lawyer name = "Lawyer" diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index 18f7850138664..650ffa7aa2cdb 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -9,6 +9,8 @@ supervisors = "the chief medical officer" selection_color = "#d4ebf2" chat_color = "#6CB1C5" + exp_requirements = 120 + exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/doctor @@ -18,6 +20,11 @@ paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_MEDICAL_DOCTOR + departments = DEPARTMENT_MEDICAL + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/medical + ) /datum/outfit/job/doctor name = "Medical Doctor" @@ -29,6 +36,7 @@ uniform = /obj/item/clothing/under/rank/medical/doctor shoes = /obj/item/clothing/shoes/sneakers/white suit = /obj/item/clothing/suit/toggle/labcoat + gloves = /obj/item/clothing/gloves/color/latex/nitrile l_hand = /obj/item/storage/firstaid/medical suit_store = /obj/item/flashlight/pen diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index e21b83c165429..c39841175d81b 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -18,6 +18,11 @@ paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_MIME + departments = DEPARTMENT_SERVICE + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/mime + ) /datum/job/mime/after_spawn(mob/living/carbon/human/H, mob/M) . = ..() diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index f6d2b1a0ee28b..7d97628d47bc7 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -15,12 +15,17 @@ outfit = /datum/outfit/job/quartermaster - access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) - minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) + access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT, ACCESS_AUX_BASE, ACCESS_EXPLORATION) + minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT, ACCESS_AUX_BASE, ACCESS_EXPLORATION) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_CAR display_order = JOB_DISPLAY_ORDER_QUARTERMASTER + departments = DEPARTMENT_CARGO + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/cargo + ) /datum/outfit/job/quartermaster name = "Quartermaster" @@ -28,7 +33,7 @@ id = /obj/item/card/id/job/qm belt = /obj/item/pda/quartermaster - ears = /obj/item/radio/headset/headset_cargo + ears = /obj/item/radio/headset/headset_quartermaster uniform = /obj/item/clothing/under/rank/cargo/qm shoes = /obj/item/clothing/shoes/sneakers/brown glasses = /obj/item/clothing/glasses/sunglasses/advanced diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 22ea32e5652e7..91c5ed0926d5a 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -19,21 +19,25 @@ outfit = /datum/outfit/job/rd - access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE, + access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE, ACCESS_EXPLORATION, ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, ACCESS_MECH_SCIENCE, 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) - minimal_access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE, + ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK, ACCESS_AUX_BASE) + minimal_access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE, ACCESS_EXPLORATION, ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, ACCESS_MECH_SCIENCE, 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) + ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK, ACCESS_AUX_BASE) paycheck = PAYCHECK_COMMAND paycheck_department = ACCOUNT_SCI display_order = JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR + departments = DEPARTMENT_SCIENCE | DEPARTMENT_COMMAND + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/rd + ) /datum/outfit/job/rd name = "Research Director" jobtype = /datum/job/rd @@ -60,4 +64,4 @@ mask = /obj/item/clothing/mask/breath suit = /obj/item/clothing/suit/space/hardsuit/rd suit_store = /obj/item/tank/internals/oxygen - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index ff86ffab83af1..fcc1344c6f1e4 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -9,16 +9,24 @@ supervisors = "the research director" selection_color = "#ffeeff" chat_color = "#AC71BA" + exp_requirements = 120 exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/roboticist - access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_MECH_SCIENCE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM, ACCESS_XENOBIOLOGY, ACCESS_GENETICS) - minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MECH_SCIENCE, ACCESS_MINERAL_STOREROOM) + access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_MECH_SCIENCE, + ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM, ACCESS_XENOBIOLOGY, ACCESS_GENETICS, ACCESS_AUX_BASE) + minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MECH_SCIENCE, + ACCESS_MINERAL_STOREROOM, ACCESS_AUX_BASE) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_SCI display_order = JOB_DISPLAY_ORDER_ROBOTICIST + departments = DEPARTMENT_SCIENCE + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/robotics + ) /datum/outfit/job/roboticist name = "Roboticist" @@ -34,4 +42,4 @@ backpack = /obj/item/storage/backpack/science satchel = /obj/item/storage/backpack/satchel/tox - pda_slot = SLOT_L_STORE + pda_slot = ITEM_SLOT_LPOCKET diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index 6ba82788bcad2..ce567e0018a9c 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -9,16 +9,24 @@ supervisors = "the research director" selection_color = "#ffeeff" chat_color = "#C772C7" + exp_requirements = 120 exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/scientist - access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MECH_SCIENCE, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_GENETICS) - minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MECH_SCIENCE, ACCESS_MINERAL_STOREROOM) + access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MECH_SCIENCE, + ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_GENETICS, ACCESS_AUX_BASE, ACCESS_EXPLORATION) + minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MECH_SCIENCE, + ACCESS_MINERAL_STOREROOM, ACCESS_AUX_BASE, ACCESS_EXPLORATION) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_SCI display_order = JOB_DISPLAY_ORDER_SCIENTIST + departments = DEPARTMENT_SCIENCE + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/science + ) /datum/outfit/job/scientist name = "Scientist" @@ -31,6 +39,12 @@ shoes = /obj/item/clothing/shoes/sneakers/white suit = /obj/item/clothing/suit/toggle/labcoat/science + r_pocket = /obj/item/discovery_scanner + backpack = /obj/item/storage/backpack/science satchel = /obj/item/storage/backpack/satchel/tox +/datum/outfit/job/scientist/pre_equip(mob/living/carbon/human/H) + ..() + if(prob(0.4)) + neck = /obj/item/clothing/neck/tie/horrible diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index f9fec0fa3ff86..c7fa4f1717bcd 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -16,14 +16,21 @@ outfit = /datum/outfit/job/security - access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MECH_SECURITY, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH) - minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MECH_SECURITY, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH) // See /datum/job/officer/get_access() + access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_SEC_RECORDS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, + ACCESS_MECH_SECURITY, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, + ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_SEC_RECORDS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, + ACCESS_MECH_SECURITY, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access() paycheck = PAYCHECK_HARD paycheck_department = ACCOUNT_SEC mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_SECURITY_OFFICER + departments = DEPARTMENT_SECURITY + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/security + ) /datum/job/officer/get_access() var/list/L = list() L |= ..() | check_config_for_sec_maint() @@ -51,13 +58,13 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S switch(department) if(SEC_DEPT_SUPPLY) ears = /obj/item/radio/headset/headset_sec/alt/department/supply - dep_access = list(ACCESS_MAILSORTING, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_CARGO) + dep_access = list(ACCESS_MAILSORTING, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_CARGO, ACCESS_AUX_BASE) destination = /area/security/checkpoint/supply spawn_point = locate(/obj/effect/landmark/start/depsec/supply) in GLOB.department_security_spawns accessory = /obj/item/clothing/accessory/armband/cargo if(SEC_DEPT_ENGINEERING) ears = /obj/item/radio/headset/headset_sec/alt/department/engi - dep_access = list(ACCESS_CONSTRUCTION, ACCESS_ENGINE, ACCESS_ATMOSPHERICS) + dep_access = list(ACCESS_CONSTRUCTION, ACCESS_ENGINE, ACCESS_ATMOSPHERICS, ACCESS_AUX_BASE) destination = /area/security/checkpoint/engineering spawn_point = locate(/obj/effect/landmark/start/depsec/engineering) in GLOB.department_security_spawns accessory = /obj/item/clothing/accessory/armband/engine @@ -69,7 +76,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S accessory = /obj/item/clothing/accessory/armband/medblue if(SEC_DEPT_SCIENCE) ears = /obj/item/radio/headset/headset_sec/alt/department/sci - dep_access = list(ACCESS_RESEARCH, ACCESS_TOX) + dep_access = list(ACCESS_RESEARCH, ACCESS_TOX, ACCESS_AUX_BASE) destination = /area/security/checkpoint/science spawn_point = locate(/obj/effect/landmark/start/depsec/science) in GLOB.department_security_spawns accessory = /obj/item/clothing/accessory/armband/science @@ -80,7 +87,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S if(ears) if(H.ears) qdel(H.ears) - H.equip_to_slot_or_del(new ears(H),SLOT_EARS) + H.equip_to_slot_or_del(new ears(H),ITEM_SLOT_EARS) var/obj/item/card/id/W = H.wear_id W.access |= dep_access @@ -125,7 +132,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S l_pocket = /obj/item/restraints/handcuffs r_pocket = /obj/item/assembly/flash/handheld suit_store = /obj/item/gun/energy/disabler - backpack_contents = list(/obj/item/melee/baton/loaded=1, /obj/item/club=1) + backpack_contents = list(/obj/item/melee/baton/loaded=1) backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 1c5ea2a2087ab..9384ce651f174 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -12,12 +12,19 @@ outfit = /datum/outfit/job/miner - access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM) + access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MECH_MINING, + ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_AUX_BASE) + minimal_access = list(ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM, + ACCESS_AUX_BASE) paycheck = PAYCHECK_HARD paycheck_department = ACCOUNT_CAR display_order = JOB_DISPLAY_ORDER_SHAFT_MINER + departments = DEPARTMENT_CARGO + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/mining + ) /datum/outfit/job/miner name = "Shaft Miner" @@ -50,7 +57,7 @@ mask = /obj/item/clothing/mask/gas/explorer glasses = /obj/item/clothing/glasses/meson suit_store = /obj/item/tank/internals/oxygen - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE backpack_contents = list( /obj/item/flashlight/seclite=1,\ /obj/item/kitchen/knife/combat/survival=1, diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index 01dae42ad7c3b..99495da5159e2 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -9,18 +9,25 @@ supervisors = "the chief engineer" selection_color = "#fff5cc" chat_color = "#D9BC89" + exp_requirements = 120 exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/engineer access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, ACCESS_MECH_ENGINE, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM, + ACCESS_AUX_BASE) minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, ACCESS_MECH_ENGINE, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM, ACCESS_AUX_BASE) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_ENG display_order = JOB_DISPLAY_ORDER_STATION_ENGINEER + departments = DEPARTMENT_ENGINEERING + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/engineering + ) /datum/outfit/job/engineer name = "Station Engineer" @@ -39,7 +46,7 @@ satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering box = /obj/item/storage/box/engineer - pda_slot = SLOT_L_STORE + pda_slot = ITEM_SLOT_LPOCKET backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) /datum/outfit/job/engineer/gloved @@ -52,5 +59,5 @@ suit = /obj/item/clothing/suit/space/hardsuit/engine suit_store = /obj/item/tank/internals/oxygen head = null - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index 8534ed0f2456f..19ea83cb4bc8f 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -9,8 +9,9 @@ supervisors = "the chief medical officer" selection_color = "#d4ebf2" chat_color = "#75AEA3" - exp_type = EXP_TYPE_CREW exp_requirements = 180 + exp_type = EXP_TYPE_MEDICAL + exp_type_department = EXP_TYPE_MEDICAL outfit = /datum/outfit/job/virologist @@ -20,6 +21,11 @@ paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_VIROLOGIST + departments = DEPARTMENT_MEDICAL + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/viro + ) /datum/outfit/job/virologist name = "Virologist" @@ -38,3 +44,4 @@ backpack = /obj/item/storage/backpack/virology satchel = /obj/item/storage/backpack/satchel/vir duffelbag = /obj/item/storage/backpack/duffelbag/med + pda_slot = ITEM_SLOT_RPOCKET diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 2dca4531ca20e..6d2ebedd6fcfc 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -17,13 +17,18 @@ outfit = /datum/outfit/job/warden - access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MECH_SECURITY, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH) - minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_MECH_SECURITY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH) // See /datum/job/warden/get_access() + access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_SEC_RECORDS, ACCESS_BRIG, ACCESS_BRIGPHYS, ACCESS_ARMORY,ACCESS_COURT, ACCESS_MECH_SECURITY, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_SEC_RECORDS, ACCESS_BRIG, ACCESS_BRIGPHYS, ACCESS_ARMORY, ACCESS_MECH_SECURITY, ACCESS_COURT, ACCESS_WEAPONS, 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 + departments = DEPARTMENT_SECURITY + + species_outfits = list( + SPECIES_PLASMAMAN = /datum/outfit/plasmaman/warden + ) /datum/job/warden/get_access() var/list/L = list() @@ -46,7 +51,7 @@ r_pocket = /obj/item/assembly/flash/handheld l_pocket = /obj/item/restraints/handcuffs suit_store = /obj/item/gun/energy/disabler - backpack_contents = list(/obj/item/melee/baton/loaded=1, /obj/item/club=1) + backpack_contents = list(/obj/item/melee/baton/loaded=1) backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm index 021d7251c422b..0c6dc89cb1a06 100644 --- a/code/modules/jobs/jobs.dm +++ b/code/modules/jobs/jobs.dm @@ -19,12 +19,14 @@ GLOBAL_LIST_INIT(medical_positions, list( "Geneticist", "Virologist", "Paramedic", - "Chemist")) + "Chemist", + "Brig Physician")) GLOBAL_LIST_INIT(science_positions, list( "Research Director", "Scientist", + "Exploration Crew", "Roboticist")) @@ -47,13 +49,19 @@ GLOBAL_LIST_INIT(civilian_positions, list( "Mime", "Assistant")) +GLOBAL_LIST_INIT(gimmick_positions, list( + "Gimmick", + "Barber", + "Stage Magician", + "Debtor", + "Psychiatrist", + "VIP")) GLOBAL_LIST_INIT(security_positions, list( "Head of Security", "Warden", "Detective", "Security Officer", - "Brig Physician", "Deputy")) @@ -63,7 +71,7 @@ GLOBAL_LIST_INIT(nonhuman_positions, list( ROLE_PAI)) GLOBAL_LIST_INIT(exp_jobsmap, list( - EXP_TYPE_CREW = list("titles" = command_positions | engineering_positions | medical_positions | science_positions | supply_positions | security_positions | civilian_positions | list("AI","Cyborg")), // crew positions + EXP_TYPE_CREW = list("titles" = command_positions | engineering_positions | medical_positions | science_positions | supply_positions | security_positions | civilian_positions | gimmick_positions | list("AI","Cyborg")), // crew positions EXP_TYPE_COMMAND = list("titles" = command_positions), EXP_TYPE_ENGINEERING = list("titles" = engineering_positions), EXP_TYPE_MEDICAL = list("titles" = medical_positions), @@ -71,7 +79,8 @@ GLOBAL_LIST_INIT(exp_jobsmap, list( EXP_TYPE_SUPPLY = list("titles" = supply_positions), EXP_TYPE_SECURITY = list("titles" = security_positions), EXP_TYPE_SILICON = list("titles" = list("AI","Cyborg")), - EXP_TYPE_SERVICE = list("titles" = civilian_positions), + EXP_TYPE_SERVICE = list("titles" = civilian_positions | gimmick_positions), + EXP_TYPE_GIMMICK = list("titles" = gimmick_positions) )) GLOBAL_LIST_INIT(exp_specialmap, list( diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm index 5f3e879237d83..be3416777077d 100644 --- a/code/modules/keybindings/bindings_atom.dm +++ b/code/modules/keybindings/bindings_atom.dm @@ -2,7 +2,7 @@ // Only way to do that is to tie the behavior into the focus's keyLoop(). /atom/movable/keyLoop(client/user) - if(!user.keys_held["Ctrl"]) + if(!user.movement_locked) var/movement_dir = NONE for(var/_key in user.keys_held) movement_dir = movement_dir | SSinput.movement_keys[_key] diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm index a69ffbcfe76d3..81b670d618e26 100644 --- a/code/modules/keybindings/bindings_client.dm +++ b/code/modules/keybindings/bindings_client.dm @@ -18,7 +18,7 @@ GLOBAL_LIST_INIT(valid_keys, list( "GamepadStart" = 1, "GamepadSelect" = 1, "Gamepad2Up" = 1, "Gamepad2Down" = 1, "Gamepad2Left" = 1, "Gamepad2Right" = 1, "Gamepad2DownLeft" = 1, "Gamepad2DownRight" = 1, "Gamepad2UpLeft" = 1, "Gamepad2UpRight" = 1, "Gamepad2Face1" = 1, "Gamepad2Face2" = 1, "Gamepad2Face3" = 1, "Gamepad2Face4" = 1, "Gamepad2R1" = 1, "Gamepad2R2" = 1, "Gamepad2R3" = 1, "Gamepad2L1" = 1, "Gamepad2L2" = 1, "Gamepad2L3" = 1, "Gamepad2Start" = 1, "Gamepad2Select" = 1, - "Gamepad3Up" = 1, "Gamepad3Down" = 1, "Gamepad3Left" = 1, "Gamepad3Right" = 1, "Gamepad3DownLeft" = 1, "Gamepad3DownRight" = 1, "Gamepad3UpLeft" = 1, + "Gamepad3Up" = 1, "Gamepad3Down" = 1, "Gamepad3Left" = 1, "Gamepad3Right" = 1, "Gamepad3DownLeft" = 1, "Gamepad3DownRight" = 1, "Gamepad3UpLeft" = 1, "Gamepad3UpRight" = 1, "Gamepad3Face1" = 1, "Gamepad3Face2" = 1, "Gamepad3Face3" = 1, "Gamepad3Face4" = 1, "Gamepad3R1" = 1, "Gamepad3R2" = 1, "Gamepad3R3" = 1, "Gamepad3L1" = 1, "Gamepad3L2" = 1, "Gamepad3L3" = 1, "Gamepad3Start" = 1, "Gamepad3Select" = 1, "Gamepad4Up" = 1, "Gamepad4Down" = 1, "Gamepad4Left" = 1, "Gamepad4Right" = 1, "Gamepad4DownLeft" = 1,"Gamepad4DownRight" = 1, "Gamepad4UpLeft" = 1, "Gamepad4UpRight" = 1, "Gamepad4Face1" = 1, "Gamepad4Face2" = 1, @@ -34,8 +34,8 @@ GLOBAL_LIST_INIT(valid_keys, list( log_admin("[key_name(C)] just attempted to send an invalid keypress with length over 32 characters, likely malicious.") message_admins("Mob [(C.mob)] with the ckey [(C.ckey)] just attempted to send an invalid keypress with length over 32 characters, likely malicious.") else - log_admin_private("[key_name(C)] just attempted to send an invalid keypress - \"[key]\", possibly malicious.") - message_admins("Mob [(C.mob)] with the ckey [(C.ckey)] just attempted to send an invalid keypress - \"[key]\", possibly malicious.") + log_admin_private("[key_name(C)] just attempted to send an invalid keypress - \"[key]\".") + message_admins("Mob [(C.mob)] with the ckey [(C.ckey)] just attempted to send an invalid keypress - \"[sanitize(key)]\".") return TRUE @@ -48,7 +48,7 @@ GLOBAL_LIST_INIT(valid_keys, list( keys_held[_key] = world.time var/movement = SSinput.movement_keys[_key] - if(!(next_move_dir_sub & movement) && !keys_held["Ctrl"]) + if(!(next_move_dir_sub & movement) && !movement_locked) next_move_dir_add |= movement // Client-level keybindings are ones anyone should be able to do at any time @@ -70,9 +70,9 @@ GLOBAL_LIST_INIT(valid_keys, list( break if(holder) - holder.key_down(full_key, src) + holder.key_down(_key, src) //full_key is not necessary here, _key is enough if(mob.focus) - mob.focus.key_down(full_key, src) + mob.focus.key_down(_key, src) //same as above /client/verb/keyUp(_key as text) set instant = TRUE @@ -101,10 +101,3 @@ GLOBAL_LIST_INIT(valid_keys, list( holder.key_up(_key, src) if(mob.focus) mob.focus.key_up(_key, src) - -// Called every game tick -/client/keyLoop() - if(holder) - holder.keyLoop(src) - if(mob?.focus) - mob.focus.keyLoop(src) diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm index 3cefa78dc8c71..10e463f8d65b9 100644 --- a/code/modules/keybindings/setup.dm +++ b/code/modules/keybindings/setup.dm @@ -22,6 +22,8 @@ var/erase_output = "" for(var/i in 1 to macro_sets.len) var/setname = macro_sets[i] + if(copytext(setname, 1, 9) == "persist_") // Don't remove macro sets not handled by input. Used in input_box.dm by create_input_window + continue 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], ".") diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm index 56ff745e63afb..00b1013f4afeb 100644 --- a/code/modules/language/language_holder.dm +++ b/code/modules/language/language_holder.dm @@ -50,10 +50,12 @@ Key procs /// Currently spoken language var/selected_language /// Tracks the entity that owns the holder. - var/owner + var/atom/owner /// Initializes, and copies in the languages from the current atom if available. -/datum/language_holder/New(_owner) +/datum/language_holder/New(atom/_owner) + if(_owner && QDELING(_owner)) + CRASH("Langauge holder added to a qdeleting thing, what the fuck \ref[_owner]") owner = _owner if(istype(owner, /datum/mind)) var/datum/mind/M = owner @@ -63,6 +65,7 @@ Key procs /datum/language_holder/Destroy() QDEL_NULL(language_menu) + owner = null return ..() /// Grants the supplied language. @@ -269,6 +272,12 @@ Key procs spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/slime = list(LANGUAGE_ATOM)) +/datum/language_holder/oozeling + 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 understood_languages = list(/datum/language/slime = list(LANGUAGE_ATOM)) spoken_languages = list(/datum/language/slime = list(LANGUAGE_ATOM)) @@ -281,7 +290,9 @@ Key procs /datum/language/draconic = list(LANGUAGE_ATOM)) /datum/language_holder/lizard/ash - selected_language = /datum/language/draconic + understood_languages = list(/datum/language/draconic = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/draconic = list(LANGUAGE_ATOM)) + blocked_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) /datum/language_holder/monkey understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), diff --git a/code/modules/language/language_menu.dm b/code/modules/language/language_menu.dm index 0dac29c1573d9..807a6cd148790 100644 --- a/code/modules/language/language_menu.dm +++ b/code/modules/language/language_menu.dm @@ -61,6 +61,10 @@ L["key"] = initial(language.key) data["unknown_languages"] += list(L) + else + data["admin_mode"] = null + data["omnitongue"] = null + data["unknown_languages"] = null return data /datum/language_menu/ui_act(action, params) diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm index 9ebf186ac2f28..1e1cd74acca31 100644 --- a/code/modules/library/lib_codex_gigas.dm +++ b/code/modules/library/lib_codex_gigas.dm @@ -74,6 +74,7 @@ addtimer(CALLBACK(src, .proc/perform_research, usr, currentName), 0) currentName = "" currentSection = PRE_TITLE + ui_update() return FALSE else currentName += action @@ -89,6 +90,7 @@ currentSection = SYLLABLE else if(GLOB.devil_suffix.Find(action)) currentSection = SUFFIX + ui_update() return currentSection != oldSection diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index ddf66b31f8396..4433ee2000800 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -20,7 +20,7 @@ opacity = 0 resistance_flags = FLAMMABLE max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0, "stamina" = 0) var/state = 0 var/list/allowed_books = list(/obj/item/book, /obj/item/spellbook, /obj/item/storage/book) //Things allowed in the bookcase /// When enabled, books_to_load number of random books will be generated for this bookcase when first interacted with. @@ -210,10 +210,13 @@ /obj/item/book/attack_self(mob/user) if(!user.can_read(src)) return + user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.") + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "book_nerd", /datum/mood_event/book_nerd) + on_read(user) + +/obj/item/book/proc/on_read(mob/user) if(dat) user << browse("Penned by [author].
" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]") - user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.") - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "book_nerd", /datum/mood_event/book_nerd) onclose(user, "book") else to_chat(user, "This book is completely blank!") @@ -239,7 +242,7 @@ var/newtitle = reject_bad_text(stripped_input(user, "Write a new title:")) if(!user.canUseTopic(src, BE_CLOSE, literate)) return - if (length(newtitle) > 20) + if (length(newtitle) > 50) to_chat(user, "That title won't fit on the cover!") return if(!newtitle) @@ -301,7 +304,7 @@ scanner.computer.inventory.Add(src) to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'") - else if(istype(I, /obj/item/kitchen/knife) || I.tool_behaviour == TOOL_WIRECUTTER) + else if((istype(I, /obj/item/kitchen/knife) || I.tool_behaviour == TOOL_WIRECUTTER) && !(flags_1 & HOLOGRAM_1)) to_chat(user, "You begin to carve out [title]...") if(do_after(user, 30, target = src)) to_chat(user, "You carve out the pages from [title]! You didn't want to read it anyway.") diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 2d52a48bb328b..606f4835a1f45 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -27,6 +27,7 @@ var/author var/SQLquery clockwork = TRUE //it'd look weird + broken_overlay_emissive = TRUE /obj/machinery/computer/libraryconsole/ui_interact(mob/user) . = ..() @@ -316,15 +317,19 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums popup.open() /obj/machinery/computer/libraryconsole/bookmanagement/proc/findscanner(viewrange) - for(var/obj/machinery/libraryscanner/S in range(viewrange, get_turf(src))) - return S - return null + return locate(/obj/machinery/libraryscanner) in range(viewrange, get_turf(src)) /obj/machinery/computer/libraryconsole/bookmanagement/proc/print_forbidden_lore(mob/user) - if (prob(50)) - new /obj/item/melee/cultblade/dagger(get_turf(src)) - to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a sinister dagger sitting on the desk. You don't even remember where it came from...") - + switch(rand(1,3)) + if(1) + new /obj/item/melee/cultblade/dagger(get_turf(src)) + to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a sinister dagger sitting on the desk. You don't even remember where it came from...") + if(2) + new /obj/item/clockwork/clockwork_slab(get_turf(src)) + to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a strange metal tablet sitting on the desk. You don't even remember where it came from...") + if(3) + new /obj/item/forbidden_book(get_turf(src)) + to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is an ominous book, bound by a chain, sitting on the desk. You don't even remember where it came from...") user.visible_message("[user] stares at the blank screen for a few moments, [user.p_their()] expression frozen in fear. When [user.p_they()] finally awaken[user.p_s()] from it, [user.p_they()] look[user.p_s()] a lot older.", 2) /obj/machinery/computer/libraryconsole/bookmanagement/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/library/soapstone.dm b/code/modules/library/soapstone.dm index 78212e4f92aa2..e25c4ed5a24e9 100644 --- a/code/modules/library/soapstone.dm +++ b/code/modules/library/soapstone.dm @@ -155,8 +155,6 @@ var/hash = rustg_hash_string(RUSTG_HASH_MD5, hidden_message) var/newcolor = copytext_char(hash, 1, 7) add_atom_colour("#[newcolor]", FIXED_COLOUR_PRIORITY) - light_color = "#[newcolor]" - set_light(1) /obj/structure/chisel_message/proc/pack() var/list/data = list() diff --git a/code/modules/lighting/emissive_blocker.dm b/code/modules/lighting/emissive_blocker.dm new file mode 100644 index 0000000000000..b69a474009ee8 --- /dev/null +++ b/code/modules/lighting/emissive_blocker.dm @@ -0,0 +1,44 @@ +/** + * Internal atom that copies an appearance on to the blocker plane + * + * Copies an appearance vis render_target and render_source on to the emissive blocking plane. + * This means that the atom in question will block any emissive sprites. + * This should only be used internally. If you are directly creating more of these, you're + * almost guaranteed to be doing something wrong. + */ +/atom/movable/emissive_blocker + name = "" + plane = EMISSIVE_BLOCKER_PLANE + layer = EMISSIVE_BLOCKER_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + //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. + //Since only render_target handles transform we don't get any applied transform "stacking" + appearance_flags = RESET_TRANSFORM + +/atom/movable/emissive_blocker/Initialize(mapload, source) + . = ..() + verbs.Cut() //Cargo culting from lighting object, this maybe affects memory usage? + + render_source = source + +/atom/movable/emissive_blocker/ex_act(severity) + return FALSE + +/atom/movable/emissive_blocker/singularity_act() + return + +/atom/movable/emissive_blocker/singularity_pull() + return + +/atom/movable/emissive_blocker/blob_act() + return + +/atom/movable/emissive_blocker/onTransitZ() + return + +//Prevents people from moving these after creation, because they shouldn't be. +/atom/movable/emissive_blocker/forceMove(atom/destination, no_tp=FALSE, harderforce = FALSE) + if(harderforce) + return ..() diff --git a/code/modules/lighting/lighting_area.dm b/code/modules/lighting/lighting_area.dm index 13676a5cb4f49..878d41aeee829 100644 --- a/code/modules/lighting/lighting_area.dm +++ b/code/modules/lighting/lighting_area.dm @@ -10,11 +10,20 @@ if (IS_DYNAMIC_LIGHTING(src)) cut_overlay(/obj/effect/fullbright) + if(lighting_overlay) + cut_overlay(lighting_overlay) + if(lighting_overlay_opacity && lighting_overlay_colour) + lighting_overlay = new /obj/effect/fullbright + lighting_overlay.color = lighting_overlay_colour + lighting_overlay.alpha = lighting_overlay_opacity + add_overlay(lighting_overlay) for (var/turf/T in src) if (IS_DYNAMIC_LIGHTING(T)) T.lighting_build_overlay() else + if(lighting_overlay) + cut_overlay(lighting_overlay) add_overlay(/obj/effect/fullbright) for (var/turf/T in src) if (T.lighting_object) @@ -27,4 +36,18 @@ if("dynamic_lighting") set_dynamic_lighting(var_value) return TRUE + if("lighting_overlay_colour") + ..() + if(lighting_overlay) + cut_overlay(lighting_overlay) + lighting_overlay.color = var_value + add_overlay(lighting_overlay) + return TRUE + if("lighting_overlay_opacity") + ..() + if(lighting_overlay) + cut_overlay(lighting_overlay) + lighting_overlay.alpha = var_value + add_overlay(lighting_overlay) + return TRUE return ..() diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm index c18c7e831a476..be73c636f8a94 100644 --- a/code/modules/lighting/lighting_corner.dm +++ b/code/modules/lighting/lighting_corner.dm @@ -136,6 +136,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% intellectually disabled 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 05e0cabe35bc9..d2fae0c1ca55f 100644 --- a/code/modules/lighting/lighting_object.dm +++ b/code/modules/lighting/lighting_object.dm @@ -16,7 +16,7 @@ /atom/movable/lighting_object/Initialize(mapload) . = ..() - verbs.Cut() + remove_verb(verbs) atom_colours.Cut() myturf = loc @@ -101,7 +101,7 @@ #if LIGHTING_SOFT_THRESHOLD != 0 var/set_luminosity = max > LIGHTING_SOFT_THRESHOLD #else - // Because of floating points?, it won't even be a flat 0. + // Because of floating points�?, it won't even be a flat 0. // This number is mostly arbitrary. var/set_luminosity = max > 1e-6 #endif diff --git a/code/modules/lighting/lighting_setup.dm b/code/modules/lighting/lighting_setup.dm index 5086b0c9d29c5..6cd25efe2b231 100644 --- a/code/modules/lighting/lighting_setup.dm +++ b/code/modules/lighting/lighting_setup.dm @@ -1,5 +1,5 @@ /proc/create_all_lighting_objects() - for(var/area/A in world) + for(var/area/A in GLOB.sortedAreas) if(!IS_DYNAMIC_LIGHTING(A)) continue diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index dc965bbe3e392..d12a129e89f24 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -63,7 +63,12 @@ if (needs_update) GLOB.lighting_update_lights -= src - . = ..() + top_atom = null + source_atom = null + source_turf = null + pixel_turf = null + + return ..() // Yes this doesn't align correctly on anything other than 4 width tabs. // If you want it to go switch everybody to elastic tab stops. @@ -234,13 +239,14 @@ var/oldlum = source_turf.luminosity source_turf.luminosity = CEILING(light_range, 1) for(T in view(CEILING(light_range, 1), source_turf)) - if((!IS_DYNAMIC_LIGHTING(T) && !T.light_sources) || T.has_opaque_atom) + if((!IS_DYNAMIC_LIGHTING(T) && !T.light_sources)) continue - if (!T.lighting_corners_initialised) - T.generate_missing_corners() - for (thing in T.corners) - C = thing - corners[C] = 0 + if(!T.has_opaque_atom) + if (!T.lighting_corners_initialised) + T.generate_missing_corners() + for (thing in T.corners) + C = thing + corners[C] = 0 turfs += T source_turf.luminosity = oldlum diff --git a/code/modules/mapexporting/mapexporter.dm b/code/modules/mapexporting/mapexporter.dm index a886db0636ec3..d71b94f89c72a 100644 --- a/code/modules/mapexporting/mapexporter.dm +++ b/code/modules/mapexporting/mapexporter.dm @@ -62,18 +62,19 @@ GLOBAL_LIST_INIT(save_file_chars, list( var/turf/place = sortedmap[x][y] var/area/location var/list/objects + var/area/AR = get_area(place) //If there is nothing there, save as a noop (For odd shapes) if(!place) place = /turf/template_noop location = /area/template_noop objects = list() //Ignore things in space, must be a space turf and the area has to be empty space - else if(istype(place, /turf/open/space) && get_area(place).type == /area/space && !(save_flag & SAVE_SPACE)) + else if(istype(place, /turf/open/space) && istype(AR, /area/space) && !(save_flag & SAVE_SPACE)) place = /turf/template_noop location = /area/template_noop //Stuff to add else - location = get_area(place).type + location = AR.type objects = place place = place.type //====Saving shuttles only / non shuttles only==== diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 4294c4464b127..92ba6b5814054 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -7,7 +7,17 @@ var/datum/parsed_map/cached_map var/keep_cached_map = FALSE -/datum/map_template/New(path = null, rename = null, cache = FALSE) + ///if true, turfs loaded from this template are placed on top of the turfs already there, defaults to TRUE + var/should_place_on_top = TRUE + + ///if true, creates a list of all atoms created by this template loading, defaults to FALSE + var/returns_created_atoms = FALSE + + ///the list of atoms created by this template being loaded, only populated if returns_created_atoms is TRUE + var/list/created_atoms = list() + //make sure this list is accounted for/cleared if you request it from ssatoms! + +/datum/map_template/New(path = null, rename = null, cache = FALSE, admin_load = FALSE) if(path) mappath = path if(mappath) @@ -25,42 +35,80 @@ cached_map = parsed return bounds -/datum/parsed_map/proc/initTemplateBounds() +/datum/map_template/proc/initTemplateBounds(list/bounds, init_atmos = TRUE) + if (!bounds) //something went wrong + stack_trace("[name] template failed to initialize correctly!") + return + var/list/obj/machinery/atmospherics/atmos_machines = list() var/list/obj/structure/cable/cables = list() - var/list/atom/atoms = list() + var/list/atom/movable/movables = list() var/list/area/areas = list() - var/list/turfs = block( locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), - locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])) - var/list/border = block(locate(max(bounds[MAP_MINX]-1, 1), max(bounds[MAP_MINY]-1, 1), bounds[MAP_MINZ]), - locate(min(bounds[MAP_MAXX]+1, world.maxx), min(bounds[MAP_MAXY]+1, world.maxy), bounds[MAP_MAXZ])) - turfs - for(var/L in turfs) - var/turf/B = L - atoms += B - areas |= B.loc - for(var/A in B) - atoms += A - if(istype(A, /obj/structure/cable)) - cables += A + var/list/turfs = block( + locate( + bounds[MAP_MINX], + bounds[MAP_MINY], + bounds[MAP_MINZ] + ), + locate( + bounds[MAP_MAXX], + bounds[MAP_MAXY], + bounds[MAP_MAXZ] + ) + ) + for(var/turf/current_turf as anything in turfs) + var/area/current_turfs_area = current_turf.loc + areas |= current_turfs_area + if(!SSatoms.initialized) + continue + + for(var/movable_in_turf in current_turf) + movables += movable_in_turf + if(istype(movable_in_turf, /obj/structure/cable)) + cables += movable_in_turf continue - if(istype(A, /obj/machinery/atmospherics)) - atmos_machines += A - for(var/L in border) - var/turf/T = L - T.air_update_turf(TRUE) //calculate adjacent turfs along the border to prevent runtimes + if(istype(movable_in_turf, /obj/machinery/atmospherics)) + atmos_machines += movable_in_turf + // Not sure if there is some importance here to make sure the area is in z + // first or not. Its defined In Initialize yet its run first in templates + // BEFORE so... hummm SSmapping.reg_in_areas_in_z(areas) - SSatoms.InitializeAtoms(atoms) + if(!SSatoms.initialized) + return + + SSatoms.InitializeAtoms(areas + turfs + movables, returns_created_atoms ? created_atoms : null) + + // NOTE, now that Initialize and LateInitialize run correctly, do we really + // need these two below? SSmachines.setup_template_powernets(cables) SSair.setup_template_machinery(atmos_machines) -/datum/map_template/proc/load_new_z() + if(init_atmos) + //calculate all turfs inside the border + var/list/template_and_bordering_turfs = block( + locate( + max(bounds[MAP_MINX]-1, 1), + max(bounds[MAP_MINY]-1, 1), + bounds[MAP_MINZ] + ), + locate( + min(bounds[MAP_MAXX]+1, world.maxx), + min(bounds[MAP_MAXY]+1, world.maxy), + bounds[MAP_MAXZ] + ) + ) + for(var/turf/affected_turf as anything in template_and_bordering_turfs) + affected_turf.air_update_turf(TRUE) + affected_turf.levelupdate() + +/datum/map_template/proc/load_new_z(orbital_body_type, list/level_traits = list(ZTRAIT_AWAY = TRUE)) var/x = round((world.maxx - width)/2) var/y = round((world.maxy - height)/2) - 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, level_traits, orbital_body_type = orbital_body_type) + var/datum/parsed_map/parsed = load_map(file(mappath), x, y, level.z_value, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop=should_place_on_top) var/list/bounds = parsed.bounds if(!bounds) return FALSE @@ -68,13 +116,13 @@ repopulate_sorted_areas() //initialize things that are normally initialized after map load - parsed.initTemplateBounds() + initTemplateBounds(bounds) smooth_zlevel(world.maxz) log_game("Z-level [name] loaded at [x],[y],[world.maxz]") return level -/datum/map_template/proc/load(turf/T, centered = FALSE) +/datum/map_template/proc/load(turf/T, centered = FALSE, init_atmos = TRUE) if(centered) T = locate(T.x - round(width/2) , T.y - round(height/2) , T.z) if(!T) @@ -84,11 +132,22 @@ if(T.y+height > world.maxy) return + var/list/border = block(locate(max(T.x, 1), max(T.y, 1), T.z), + locate(min(T.x+width, world.maxx), min(T.y+height, world.maxy), T.z)) + for(var/L in border) + var/turf/turf_to_disable = L + turf_to_disable.ImmediateDisableAdjacency() + // 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/list/turf_blacklist = list() + update_blacklist(T, turf_blacklist) + + parsed.turf_blacklist = turf_blacklist + if(!parsed.load(T.x, T.y, T.z, cropMap=TRUE, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop=should_place_on_top)) return var/list/bounds = parsed.bounds if(!bounds) @@ -98,11 +157,14 @@ repopulate_sorted_areas() //initialize things that are normally initialized after map load - parsed.initTemplateBounds() + initTemplateBounds(bounds, init_atmos) log_game("[name] loaded at [T.x],[T.y],[T.z]") return bounds +/datum/map_template/proc/update_blacklist(turf/T, list/input_blacklist) + return + /datum/map_template/proc/get_affected_turfs(turf/T, centered = FALSE) var/turf/placement = T if(centered) @@ -114,6 +176,6 @@ //for your ever biggening badminnery kevinz000 //⤠- Cyberboss -/proc/load_new_z_level(var/file, var/name) +/proc/load_new_z_level(var/file, var/name, orbital_body_type) var/datum/map_template/template = new(file, name) - template.load_new_z() + template.load_new_z(orbital_body_type = orbital_body_type) diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 98c0ed209f7d5..9af886776a731 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -213,7 +213,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) if(target_type && !istype(A,target_type)) continue var/cargs = build_args() - A.AddComponent(arglist(cargs)) + A._AddComponent(cargs) qdel(src) return diff --git a/code/modules/mapping/preloader.dm b/code/modules/mapping/preloader.dm index 79afa8c032506..d966d8c0410bc 100644 --- a/code/modules/mapping/preloader.dm +++ b/code/modules/mapping/preloader.dm @@ -37,3 +37,12 @@ GLOBAL_DATUM_INIT(_preloader, /datum/map_preloader, new) name = "Turf Passthrough" icon_state = "noop" bullet_bounce_sound = null + +//The following two turfs can be used to hint if any genturfs below should be generated as closed or open +/turf/template_noop/closed + name = "Area Passthrough (prefer closed)" + icon_state = "noop_closed" + +/turf/template_noop/open + name = "Area Passthrough (prefer open)" + icon_state = "noop_open" diff --git a/code/modules/mapping/random_rooms.dm b/code/modules/mapping/random_rooms.dm index dd37032bc16b0..d87be0728c9a0 100644 --- a/code/modules/mapping/random_rooms.dm +++ b/code/modules/mapping/random_rooms.dm @@ -689,7 +689,7 @@ template_height = 3 template_width = 3 weight = 3 - + /datum/map_template/random_room/sk_rdm082 name = "Maint Chemistry" room_id = "sk_rdm082_maintmedical" @@ -1161,25 +1161,6 @@ template_width = 10 weight = 3 - -/datum/map_template/random_room/sk_rdm135 //this room is fun. - name = "Cluwne Altar" - room_id = "sk_rdm135_cluwnealtar" - mappath = "_maps/RandomRooms/10x10/sk_rdm135_cluwnealtar.dmm" - centerspawner = FALSE - template_height = 10 - template_width = 10 - weight = 1 //rare - -/datum/map_template/random_room/sk_rdm136 //this room is fun as well - name = "Tiny Cluwne Altar" - room_id = "sk_rdm136_tinycluwnealtar" - mappath = "_maps/RandomRooms/5x4/sk_rdm136_tinycluwnealtar.dmm" - centerspawner = FALSE - template_height = 4 - template_width = 5 - weight = 1 - /datum/map_template/random_room/sk_rdm137 name = "Tiny psych ward" room_id = "sk_rdm137_tinyshrink" @@ -1198,7 +1179,7 @@ template_width = 5 weight = 4 -/datum/map_template/random_room/sk_rdm139 +/datum/map_template/random_room/sk_rdm139 name = "containment cell" room_id = "sk_rdm139_containmentcell" mappath = "_maps/RandomRooms/3x3/containmentcell.dmm" @@ -1214,4 +1195,157 @@ centerspawner = FALSE template_height = 5 template_width = 3 - weight = 2 \ No newline at end of file + weight = 2 + +/datum/map_template/random_room/sk_rdm141 + name = "the place 6 sectors down" + room_id = "sk_rdm141_6sectorsdown" + mappath = "_maps/RandomRooms/10x10/sk_rdm141_6sectorsdown.dmm" + centerspawner = FALSE + template_height = 10 + template_width = 10 + weight = 2 + +/datum/map_template/random_room/sk_rdm142 + name = "old diner" + room_id = "sk_rdm142_olddiner" + mappath = "_maps/RandomRooms/10x10/sk_rdm142_olddiner.dmm" + centerspawner = FALSE + template_height = 10 + template_width = 10 + weight = 4 + +/datum/map_template/random_room/sk_rdm143 + name = "gamer cave" + room_id = "sk_rdm143_gamercave" + mappath = "_maps/RandomRooms/10x10/sk_rdm143_gamercave.dmm" + centerspawner = FALSE + template_height = 10 + template_width = 10 + weight = 3 + +/datum/map_template/random_room/sk_rdm144 //has Stage Magician Spawner + name = "small stage and bar" + room_id = "sk_rdm144_smallmagician" + mappath = "_maps/RandomRooms/10x10/sk_rdm144_smallmagician.dmm" + centerspawner = FALSE + template_height = 10 + template_width = 10 + weight = 3 + +/datum/map_template/random_room/sk_rdm145 //has tela anchor + name = "lady tesla altar" + room_id = "sk_rdm145_ladytesla_altar" + mappath = "_maps/RandomRooms/10x10/sk_rdm145_ladytesla_altar.dmm" + centerspawner = FALSE + template_height = 10 + template_width = 10 + weight = 1 //rare + +/datum/map_template/random_room/sk_rdm146 + name = "blastdoor interchange" + room_id = "sk_rdm146_blastdoor_interchange" + mappath = "_maps/RandomRooms/10x10/sk_rdm146_blastdoor_interchange.dmm" + centerspawner = FALSE + template_height = 10 + template_width = 10 + weight = 4 //common + +/datum/map_template/random_room/sk_rdm147 + name = "advanced micro botany" + room_id = "sk_rdm147_advbotany" + mappath = "_maps/RandomRooms/10x10/sk_rdm147_advbotany.dmm" + centerspawner = FALSE + template_height = 10 + template_width = 10 + weight = 2 + +/datum/map_template/random_room/sk_rdm148 + name = "maintenance apiary" + room_id = "sk_rdm148_botany_apiary" + mappath = "_maps/RandomRooms/10x10/sk_rdm148_botany_apiary.dmm" + centerspawner = FALSE + template_height = 10 + template_width = 10 + weight = 2 + +/datum/map_template/random_room/sk_rdm149 + name = "space window with crates" + room_id = "sk_rdm149_cratewindow" + mappath = "_maps/RandomRooms/10x5/sk_rdm149_cratewindow.dmm" + centerspawner = FALSE + template_height = 5 + template_width = 10 + weight = 3 + +/datum/map_template/random_room/sk_rdm150 + name = "small medical lobby" + room_id = "sk_rdm150_smallmedlobby" + mappath = "_maps/RandomRooms/10x5/sk_rdm150_smallmedlobby.dmm" + centerspawner = FALSE + template_height = 5 + template_width = 10 + weight = 3 //common + +/datum/map_template/random_room/sk_rdm151 //delicious + name = "small medical lobby" + room_id = "sk_rdm151_ratburger" + mappath = "_maps/RandomRooms/10x5/sk_rdm151_ratburger.dmm" + centerspawner = FALSE + template_height = 5 + template_width = 10 + weight = 1 //rare + +/datum/map_template/random_room/sk_rdm152 + name = "old genetics office" + room_id = "sk_rdm152_geneticsoffice" + mappath = "_maps/RandomRooms/10x5/sk_rdm152_geneticsoffice.dmm" + centerspawner = FALSE + template_height = 5 + template_width = 10 + weight = 2 + +/datum/map_template/random_room/sk_rdm153 //its a hobo den featuring Peter the pet frog. Includes a debtor spawn + name = "peters room" + room_id = "sk_rdm153_hobowithpeter" + mappath = "_maps/RandomRooms/10x5/sk_rdm153_hobowithpeter.dmm" + centerspawner = FALSE + template_height = 5 + template_width = 10 + weight = 2 + +/datum/map_template/random_room/sk_rdm154 //rare, has a cleaver. + name = "butchers den" + room_id = "sk_rdm154_butchersden" + mappath = "_maps/RandomRooms/10x5/sk_rdm154_butchersden.dmm" + centerspawner = FALSE + template_height = 5 + template_width = 10 + weight = 1 + +/datum/map_template/random_room/sk_rdm155 + name = "punji stick conveyor trap" + room_id = "sk_rdm155_punjiconveyor" + mappath = "_maps/RandomRooms/10x5/sk_rdm155_punjiconveyor.dmm" + centerspawner = FALSE + template_height = 5 + template_width = 10 + weight = 1 + +/datum/map_template/random_room/sk_rdm156 + name = "ancient interchange" + room_id = "sk_rdm156_oldairlock_interchange" + mappath = "_maps/RandomRooms/10x5/sk_rdm156_oldairlock_interchange.dmm" + centerspawner = FALSE + template_height = 5 + template_width = 10 + weight = 4 + stock = 2 + +/datum/map_template/random_room/sk_rdm157 + name = "Space Chess" + room_id = "sk_rdm157_chess" + mappath = "_maps/RandomRooms/10x10/sk_rdm157_chess.dmm" + centerspawner = FALSE + template_height = 10 + template_width = 10 diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index 1beddbfdbbb21..9f73367f7aee2 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -23,6 +23,9 @@ var/list/bounds var/did_expand = FALSE + ///any turf in this list is skipped inside of build_coordinate + var/list/turf_blacklist = list() + // 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") @@ -52,7 +55,11 @@ /datum/parsed_map/New(tfile, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper=INFINITY, measureOnly=FALSE) if(isfile(tfile)) original_path = "[tfile]" + var/temp_hack_garbage = tfile tfile = rustg_file_read(tfile) + //This is hacky garbage + if(tfile == "") //Might be an upload, try raw loading it. + tfile = file2text(temp_hack_garbage) else if(isnull(tfile)) // create a new datum without loading a map return @@ -310,6 +317,13 @@ //Instanciation //////////////// + for (var/turf_in_blacklist in turf_blacklist) + if (crds == turf_in_blacklist) //if the given turf is blacklisted, dont do anything with it + return + + //Keep a reference to the original area in case we need to tell it to generate this turf later + var/area/orig_area = crds.loc + //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 @@ -327,6 +341,8 @@ if(GLOB.use_preloader && instance) world.preloader_load(instance) + else + orig_area = null // We won't be messing with the old area, null it //then instance the /turf and, if multiple tiles are presents, simulates the DMM underlays piling effect @@ -338,8 +354,23 @@ SSatoms.map_loader_begin() //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) + if(ispath(members[first_turf_index], /turf/template_noop)) + if(istype(crds, /turf/open/genturf)) + var/turf/open/genturf/genturf = crds + //If the new area is different from the original area, ensure the new turfs are generated as part of the original area + if(orig_area && orig_area.type != members[index]) + LAZYADD(orig_area.additional_genturfs, crds) + //Cave generation checks current area flags for generation; ignore them + genturf.force_generation = TRUE + //Pass on any hints for whether the turf should be open or closed + if(ispath(members[first_turf_index], /turf/template_noop/closed)) + genturf.genturf_hint = GENTURF_HINT_CLOSED + else if(ispath(members[first_turf_index], /turf/template_noop/open)) + genturf.genturf_hint = GENTURF_HINT_OPEN + else + ///Disable placeOnTop for genturfs, instead making sure to replace them + var/shouldPlaceOnTop = placeOnTop && !istype(crds, /turf/open/genturf) + T = instance_atom(members[first_turf_index],members_attributes[first_turf_index],crds,no_changeturf,shouldPlaceOnTop) if(T) //if others /turf are presents, simulates the underlays piling effect @@ -480,4 +511,9 @@ /datum/parsed_map/Destroy() ..() + turf_blacklist.Cut() + parsed_bounds.Cut() + bounds.Cut() + grid_models.Cut() + gridSets.Cut() return QDEL_HINT_HARDDEL_NOW diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index fe2f0c65b7b73..eee1f635aa2f1 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -20,6 +20,8 @@ for(var/i in get_affected_turfs(central_turf, 1)) var/turf/T = i + for(var/obj/structure/spawner/nest in T) + qdel(nest) for(var/mob/living/simple_animal/monster in T) qdel(monster) for(var/obj/structure/flora/ash/plant in T) @@ -121,8 +123,6 @@ forced_ruins[linked] = forced_z ? forced_z : z_placed //I guess you might want a chain somehow if(PLACE_LAVA_RUIN) forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_LAVA_RUINS)) - if(PLACE_SPACE_RUIN) - forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_SPACE_RUINS)) if(PLACE_DEFAULT) forced_ruins[linked] = -1 forced_z = 0 diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm index 74bd7c8782eff..fe5aa0b039151 100644 --- a/code/modules/mapping/space_management/multiz_helpers.dm +++ b/code/modules/mapping/space_management/multiz_helpers.dm @@ -45,4 +45,38 @@ else holder = UP dir |= holder - return dir \ No newline at end of file + return dir + +/proc/get_zs_in_range(z_level, max_z_range) + . = list(z_level) + if(max_z_range <= 0) + return + var/turf/center_turf = locate(world.maxx / 2, world.maxy / 2, z_level) + var/turf/temp = center_turf.above() + //Iterate upwards. + var/i = 0 + while(isturf(temp)) + . += temp + i ++ + if(i >= max_z_range) + break + temp = temp.above() + //Iterate downwards. + temp = center_turf.below() + i = 0 + while(isturf(temp)) + . += temp + i ++ + if(i >= max_z_range) + break + temp = temp.below() + +/proc/multi_z_dist(turf/T0, turf/T1) + if(T0.get_virtual_z_level() == T1.get_virtual_z_level()) + return get_dist(T0, T1) + if(is_station_level(T0.z) && is_station_level(T1.z)) + var/raw_dist = get_dist(T0, T1) + var/z_dist = abs(T0.z - T1.z) * MULTI_Z_DISTANCE + var/total_dist = raw_dist + z_dist + return total_dist + return INFINITY diff --git a/code/modules/mapping/space_management/space_level.dm b/code/modules/mapping/space_management/space_level.dm index cc9c6e11f173b..d696dfb47130f 100644 --- a/code/modules/mapping/space_management/space_level.dm +++ b/code/modules/mapping/space_management/space_level.dm @@ -6,9 +6,16 @@ var/linkage = SELFLOOPING var/xi var/yi //imaginary placements on the grid + //Z-levels orbital body + var/datum/orbital_object/z_linked/orbital_body + //Is something generating on this level? + var/generating = FALSE -/datum/space_level/New(new_z, new_name, list/new_traits = list()) +/datum/space_level/New(new_z, new_name, list/new_traits = list(), orbital_body_type) z_value = new_z name = new_name traits = new_traits set_linkage(new_traits[ZTRAIT_LINKAGE]) + if(orbital_body_type) + orbital_body = new orbital_body_type() + orbital_body.link_to_z(src) diff --git a/code/modules/mapping/space_management/zlevel_manager.dm b/code/modules/mapping/space_management/zlevel_manager.dm index 6129c5fd2b6a2..c50a2e60e3e7d 100644 --- a/code/modules/mapping/space_management/zlevel_manager.dm +++ b/code/modules/mapping/space_management/zlevel_manager.dm @@ -13,17 +13,18 @@ for (var/I in 1 to default_map_traits.len) var/list/features = default_map_traits[I] - var/datum/space_level/S = new(I, features[DL_NAME], features[DL_TRAITS]) + //All default levels are assumed to be phobos at this stage, since there is only 1. + var/datum/space_level/S = new(I, features[DL_NAME], features[DL_TRAITS], orbital_body_type = /datum/orbital_object/z_linked/phobos) z_list += S -/datum/controller/subsystem/mapping/proc/add_new_zlevel(name, traits = list(), z_type = /datum/space_level) +/datum/controller/subsystem/mapping/proc/add_new_zlevel(name, traits = list(), z_type = /datum/space_level, orbital_body_type) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_Z, args) var/new_z = z_list.len + 1 if (world.maxz < new_z) world.incrementMaxZ() CHECK_TICK // TODO: sleep here if the Z level needs to be cleared - var/datum/space_level/S = new z_type(new_z, name, traits) + var/datum/space_level/S = new z_type(new_z, name, traits, orbital_body_type) z_list += S return S diff --git a/code/modules/mentor/follow.dm b/code/modules/mentor/follow.dm index 7c53c5c0fb571..e5ec5adc90166 100644 --- a/code/modules/mentor/follow.dm +++ b/code/modules/mentor/follow.dm @@ -7,7 +7,7 @@ return mentor_datum.following = M usr.reset_perspective(M) - verbs += /client/proc/mentor_unfollow + add_verb(/client/proc/mentor_unfollow) to_chat(GLOB.admins, "MENTOR: [key_name(usr)] is now following [key_name(M)]") to_chat(usr, "Click the \"Stop Following\" button in the Mentor tab to stop following [key_name(M)].") log_mentor("[key_name(usr)] began following [key_name(M)]") @@ -20,7 +20,7 @@ if(!is_mentor()) return usr.reset_perspective() - verbs -= /client/proc/mentor_unfollow + remove_verb(/client/proc/mentor_unfollow) to_chat(GLOB.admins, "MENTOR: [key_name(usr)] is no longer following [key_name(mentor_datum.following)]") log_mentor("[key_name(usr)] stopped following [key_name(mentor_datum.following)]") mentor_datum.following = null diff --git a/code/modules/mentor/mentor_verbs.dm b/code/modules/mentor/mentor_verbs.dm index f7faa873eee54..7b3e5dd1d1b3a 100644 --- a/code/modules/mentor/mentor_verbs.dm +++ b/code/modules/mentor/mentor_verbs.dm @@ -6,7 +6,9 @@ GLOBAL_PROTECT(mentor_verbs) /client/proc/add_mentor_verbs() if(mentor_datum) - verbs += GLOB.mentor_verbs + add_verb(GLOB.mentor_verbs) + reset_badges() /client/proc/remove_mentor_verbs() - verbs -= GLOB.mentor_verbs + remove_verb(GLOB.mentor_verbs) + reset_badges() diff --git a/code/modules/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm index f6be4410795b7..b90c95adc0394 100644 --- a/code/modules/mentor/mentorhelp.dm +++ b/code/modules/mentor/mentorhelp.dm @@ -10,9 +10,9 @@ if(!msg) return //remove out mentorhelp verb temporarily to prevent spamming of mentors. - verbs -= /client/verb/mentorhelp + remove_verb(/client/verb/mentorhelp) spawn(300) - verbs += /client/verb/mentorhelp // 30 second cool-down for mentorhelp + add_verb(/client/verb/mentorhelp) // 30 second cool-down for mentorhelp msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) if(!msg) return @@ -39,7 +39,7 @@ else .["present"]++ -/proc/key_name_mentor(var/whom, var/include_link = null, var/include_name = 0, var/include_follow = 0, var/char_name_only = 0) +/proc/key_name_mentor(var/whom, var/include_link = null, var/include_name = 0, var/char_name_only = 0) var/mob/M var/client/C var/key @@ -96,7 +96,4 @@ else . += "*no key*" - if(include_follow) - . += " (F)" - return . diff --git a/code/modules/mentor/mentorpm.dm b/code/modules/mentor/mentorpm.dm index 891daa9fb68fb..b2aa9ce4c0602 100644 --- a/code/modules/mentor/mentorpm.dm +++ b/code/modules/mentor/mentorpm.dm @@ -1,3 +1,5 @@ +//This file was ported from hippie, used to be indented with spaces, and is the single worst corner of this codebase next to voice radio. For the love of god please rewrite this. + //shows a list of clients we could send PMs to, then forwards our choice to cmd_Mentor_pm /client/proc/cmd_mentor_pm_panel() set category = "Mentor" @@ -24,11 +26,13 @@ C = M.client else if(istext(whom)) C = GLOB.directory[whom] - else if(istype(whom,/client)) + else if(istype(whom, /client)) C = whom if(!C) - if(is_mentor()) to_chat(src, "Error: Mentor-PM: Client not found.
") - else mentorhelp(msg) //Mentor we are replying to left. Mentorhelp instead(check below) + if(is_mentor()) + to_chat(src, "Error: Mentor-PM: Client not found.
") + else + mentorhelp(msg) //Mentor we are replying to left. Mentorhelp instead(check below) return //get message text, limit it's length.and clean/escape html @@ -43,7 +47,7 @@ to_chat(src, "Error: Mentor-PM: Client not found.
") else mentorhelp(msg) //Mentor we are replying to has vanished, Mentorhelp instead (how the fuck does this work?let's hope it works,shrug) - return + return // Neither party is a mentor, they shouldn't be PMing! if (!C.is_mentor() && !is_mentor()) @@ -59,21 +63,21 @@ var/show_char = CONFIG_GET(flag/mentors_mobname_only) if(C.is_mentor()) if(is_mentor())//both are mentors - to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]") - to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]") + to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0)]: [msg]") + to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0)]: [msg]") else //recipient is an mentor but sender is not - to_chat(C, "Reply PM from-[key_name_mentor(src, C, 1, 0, show_char)]: [msg]") - to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]") + to_chat(C, "Reply PM from-[key_name_mentor(src, C, 1, show_char)]: [msg]") + to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0)]: [msg]") else if(is_mentor()) //sender is an mentor but recipient is not. - to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]") - to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, show_char)]: [msg]") + to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0)]: [msg]") + to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, show_char)]: [msg]") //we don't use message_Mentors here because the sender/receiver might get it too var/show_char_sender = !is_mentor() && CONFIG_GET(flag/mentors_mobname_only) var/show_char_recip = !C.is_mentor() && CONFIG_GET(flag/mentors_mobname_only) for(var/client/X in GLOB.mentors | GLOB.admins) if(X.key!=key && X.key!=C.key) //check client/X is an Mentor and isn't the sender or recipient - to_chat(X, "Mentor PM: [key_name_mentor(src, X, 0, 0, show_char_sender)]->[key_name_mentor(C, X, 0, 0, show_char_recip)]: [msg]") //inform X + to_chat(X, "Mentor PM: [key_name_mentor(src, X, 0, show_char_sender)]->[key_name_mentor(C, X, 0, 0, show_char_recip)]: [msg]") //inform X diff --git a/code/modules/mentor/mentorsay.dm b/code/modules/mentor/mentorsay.dm index 17e24b4f5a01a..1143f95994200 100644 --- a/code/modules/mentor/mentorsay.dm +++ b/code/modules/mentor/mentorsay.dm @@ -1,6 +1,6 @@ /client/proc/cmd_mentor_say(msg as text) set category = "Mentor" - set name = "Msay" //Gave this shit a shorter name so you only have to time out "msay" rather than "mentor say" to use it --NeoFite + set name = "Msay" //Gave this shit a shorter name so you only have to type out "msay" rather than "mentor say" to use it --NeoFite set hidden = 1 if(!is_mentor()) return diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index e083e838507e0..843cc4e76c76c 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -3,7 +3,6 @@ /obj/structure/closet/crate/secure/loot name = "abandoned crate" desc = "What could be inside?" - icon_state = "securecrate" integrity_failure = 0 //no breaking open the crate var/code = null var/lastattempt = null @@ -172,6 +171,7 @@ locked = FALSE cut_overlays() add_overlay("securecrateg") + add_overlay("[icon_door || icon_state]_door") //needs to put the door overlayer back cause of this snowflake code tamperproof = 0 // set explosion chance to zero, so we dont accidently hit it with a multitool and instantly die else if(!input || !sanitycheck || length(sanitised) != codelen) to_chat(user, "You leave the crate alone.") @@ -242,3 +242,9 @@ /obj/structure/closet/crate/secure/loot/deconstruct(disassembled = TRUE) boom() + +/obj/structure/closet/crate/secure/loot/emp_act(severity) + if(locked) + boom() + else + ..() \ No newline at end of file diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm index 9ad890dbe2049..c311a5c4747ac 100644 --- a/code/modules/mining/aux_base.dm +++ b/code/modules/mining/aux_base.dm @@ -21,7 +21,7 @@ interface with the mining shuttle at the landing site if a mobile beacon is also var/launch_warning = TRUE var/list/turrets = list() //List of connected turrets - req_one_access = list(ACCESS_CARGO, ACCESS_CONSTRUCTION, ACCESS_HEADS, ACCESS_RESEARCH) + req_one_access = list(ACCESS_AUX_BASE, ACCESS_HEADS) var/possible_destinations clockwork = TRUE circuit = /obj/item/circuitboard/computer/auxillary_base diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm index 02c54ffbd36e1..fb710abf7e388 100644 --- a/code/modules/mining/aux_base_camera.dm +++ b/code/modules/mining/aux_base_camera.dm @@ -1,22 +1,22 @@ //Aux base construction console -/mob/camera/aiEye/remote/base_construction +/mob/camera/ai_eye/remote/base_construction name = "construction holo-drone" move_on_shuttle = 1 //Allows any curious crew to watch the base after it leaves. (This is safe as the base cannot be modified once it leaves) icon = 'icons/obj/mining.dmi' icon_state = "construction_drone" var/area/starting_area -/mob/camera/aiEye/remote/base_construction/Initialize() +/mob/camera/ai_eye/remote/base_construction/Initialize() . = ..() starting_area = get_area(loc) -/mob/camera/aiEye/remote/base_construction/setLoc(var/t) +/mob/camera/ai_eye/remote/base_construction/setLoc(var/t) var/area/curr_area = get_area(t) if(curr_area == starting_area || istype(curr_area, /area/shuttle/auxillary_base)) return ..() //While players are only allowed to build in the base area, but consoles starting outside the base can move into the base area to begin work. -/mob/camera/aiEye/remote/base_construction/relaymove(mob/user, direct) +/mob/camera/ai_eye/remote/base_construction/relaymove(mob/user, direct) dir = direct //This camera eye is visible as a drone, and needs to keep the dir updated ..() @@ -74,7 +74,7 @@ spawn_spot = src - eyeobj = new /mob/camera/aiEye/remote/base_construction(get_turf(spawn_spot)) + eyeobj = new /mob/camera/ai_eye/remote/base_construction(get_turf(spawn_spot)) eyeobj.origin = src @@ -130,7 +130,7 @@ /datum/action/innate/aux_base //Parent aux base action icon_icon = 'icons/mob/actions/actions_construction.dmi' var/mob/living/C //Mob using the action - var/mob/camera/aiEye/remote/base_construction/remote_eye //Console's eye mob + var/mob/camera/ai_eye/remote/base_construction/remote_eye //Console's eye mob var/obj/machinery/computer/camera_advanced/base_construction/B //Console itself /datum/action/innate/aux_base/Activate() @@ -202,27 +202,27 @@ name = "Select Airlock Type" button_icon_state = "airlock_select" -datum/action/innate/aux_base/airlock_type/Activate() +/datum/action/innate/aux_base/airlock_type/Activate() if(..()) return B.RCD.change_airlock_setting() -datum/action/innate/aux_base/window_type +/datum/action/innate/aux_base/window_type name = "Select Window Type" button_icon_state = "window_select" -datum/action/innate/aux_base/window_type/Activate() +/datum/action/innate/aux_base/window_type/Activate() if(..()) return B.RCD.toggle_window_type() -datum/action/innate/aux_base/place_fan +/datum/action/innate/aux_base/place_fan name = "Place Tiny Fan" button_icon_state = "build_fan" -datum/action/innate/aux_base/place_fan/Activate() +/datum/action/innate/aux_base/place_fan/Activate() if(..()) return @@ -244,11 +244,11 @@ datum/action/innate/aux_base/place_fan/Activate() to_chat(owner, "Tiny fan placed. [B.fans_remaining] remaining.") playsound(fan_turf, 'sound/machines/click.ogg', 50, 1) -datum/action/innate/aux_base/install_turret +/datum/action/innate/aux_base/install_turret name = "Install Plasma Anti-Wildlife Turret" button_icon_state = "build_turret" -datum/action/innate/aux_base/install_turret/Activate() +/datum/action/innate/aux_base/install_turret/Activate() if(..()) return diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index bcd5f599848fe..21a6dd55abe50 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -10,9 +10,11 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT heat_protection = CHEST|GROIN|LEGS|ARMS hoodtype = /obj/item/clothing/head/hooded/explorer - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50, "stamina" = 20) 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) resistance_flags = FIRE_PROOF + high_pressure_multiplier = 0.4 + flags_inv = HIDEJUMPSUIT /obj/item/clothing/head/hooded/explorer name = "explorer hood" @@ -22,8 +24,9 @@ flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50, "stamina" = 20) resistance_flags = FIRE_PROOF + high_pressure_multiplier = 0.4 /obj/item/clothing/suit/hooded/explorer/Initialize() . = ..() @@ -37,11 +40,12 @@ name = "explorer gas mask" desc = "A military-grade gas mask that can be connected to an air supply." icon_state = "gas_mining" + flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS visor_flags_inv = HIDEFACIALHAIR - visor_flags_cover = MASKCOVERSMOUTH + visor_flags_cover = MASKCOVERSEYES | 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" = 5, "laser" = 5, "energy" = 5, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 20, "acid" = 40, "stamina" = 10) resistance_flags = FIRE_PROOF /obj/item/clothing/mask/gas/explorer/attack_self(mob/user) @@ -49,7 +53,7 @@ /obj/item/clothing/mask/gas/explorer/adjustmask(user) ..() - w_class = mask_adjusted ? WEIGHT_CLASS_NORMAL : WEIGHT_CLASS_SMALL + w_class = mask_adjusted ? WEIGHT_CLASS_SMALL : WEIGHT_CLASS_NORMAL /obj/item/clothing/mask/gas/explorer/folded/Initialize() . = ..() @@ -64,8 +68,9 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | LAVA_PROOF slowdown = 0 - armor = list("melee" = 70, "bullet" = 40, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 70, "bullet" = 40, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 40) 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) + high_pressure_multiplier = 0.6 /obj/item/clothing/suit/space/hostile_environment/Initialize() . = ..() @@ -76,10 +81,10 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/clothing/suit/space/hostile_environment/process() +/obj/item/clothing/suit/space/hostile_environment/process(delta_time) var/mob/living/carbon/C = loc - if(istype(C) && prob(2)) //cursed by bubblegum - if(prob(15)) + if(istype(C) && DT_PROB(1, delta_time)) //cursed by bubblegum + if(DT_PROB(7.5, delta_time)) new /datum/hallucination/oh_yeah(C) to_chat(C, "[pick("I AM IMMORTAL.","I SHALL TAKE BACK WHAT'S MINE.","I SEE YOU.","YOU CANNOT ESCAPE ME FOREVER.","DEATH CANNOT HOLD ME.")]") else @@ -93,8 +98,9 @@ w_class = WEIGHT_CLASS_NORMAL max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT clothing_flags = THICKMATERIAL // no space protection - armor = list("melee" = 70, "bullet" = 40, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 70, "bullet" = 40, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 40) resistance_flags = FIRE_PROOF | LAVA_PROOF + high_pressure_multiplier = 0.6 /obj/item/clothing/head/helmet/space/hostile_environment/Initialize() . = ..() diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index a8b870d6aa255..a87023de5e524 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -1,5 +1,5 @@ /*********************Mining Hammer****************/ -/obj/item/twohanded/kinetic_crusher +/obj/item/kinetic_crusher icon = 'icons/obj/mining.dmi' icon_state = "crusher" item_state = "crusher0" @@ -11,8 +11,6 @@ force = 0 //You can't hit stuff unless wielded w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK - force_unwielded = 20 //It's never not wielded so these are the same - force_wielded = 0 throwforce = 5 block_upgrade_walk = 1 throw_speed = 4 @@ -30,15 +28,16 @@ var/light_on = FALSE var/brightness_on = 5 -/obj/item/twohanded/kinetic_crusher/Initialize() +/obj/item/kinetic_crusher/ComponentInitialize() . = ..() AddComponent(/datum/component/butchering, 60, 110) //technically it's huge and bulky, but this provides an incentive to use it + AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=20) -/obj/item/twohanded/kinetic_crusher/Destroy() +/obj/item/kinetic_crusher/Destroy() QDEL_LIST(trophies) return ..() -/obj/item/twohanded/kinetic_crusher/examine(mob/living/user) +/obj/item/kinetic_crusher/examine(mob/living/user) . = ..() to_chat(user, "Mark a large creature with the destabilizing force, then hit them in melee to do [force + detonation_damage] damage.") to_chat(user, "Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage].") @@ -46,7 +45,7 @@ var/obj/item/crusher_trophy/T = t to_chat(user, "It has \a [T] attached, which causes [T.effect_desc()].") -/obj/item/twohanded/kinetic_crusher/attackby(obj/item/I, mob/living/user) +/obj/item/kinetic_crusher/attackby(obj/item/I, mob/living/user) if(I.tool_behaviour == TOOL_CROWBAR) if(LAZYLEN(trophies)) to_chat(user, "You remove [src]'s trophies.") @@ -62,8 +61,8 @@ else return ..() -/obj/item/twohanded/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user) - if(!wielded) +/obj/item/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user) + if(!ISWIELDED(src)) to_chat(user, "[src] is too heavy to use with one hand. You fumble and drop everything.") user.drop_all_held_items() return @@ -79,9 +78,9 @@ if(!QDELETED(C) && !QDELETED(target)) C.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did -/obj/item/twohanded/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams) +/obj/item/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams) . = ..() - if(!wielded) + if(!ISWIELDED(src)) return if(!proximity_flag && charged)//Mark a target, or mine a tile. var/turf/proj_turf = user.loc @@ -128,26 +127,27 @@ C.total_damage += detonation_damage L.apply_damage(detonation_damage, BRUTE, blocked = def_check) -/obj/item/twohanded/kinetic_crusher/proc/Recharge() +/obj/item/kinetic_crusher/proc/Recharge() if(!charged) charged = TRUE update_icon() playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) -/obj/item/twohanded/kinetic_crusher/ui_action_click(mob/user, actiontype) +/obj/item/kinetic_crusher/ui_action_click(mob/user, actiontype) light_on = !light_on playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) update_brightness(user) update_icon() -/obj/item/twohanded/kinetic_crusher/proc/update_brightness(mob/user = null) +/obj/item/kinetic_crusher/proc/update_brightness(mob/user = null) if(light_on) set_light(brightness_on) else set_light(0) -/obj/item/twohanded/kinetic_crusher/update_icon() +/obj/item/kinetic_crusher/update_icon() ..() + var/wielded = ISWIELDED(src) cut_overlays() if(!charged) add_overlay("[icon_state]_uncharged") @@ -169,7 +169,7 @@ flag = "bomb" range = 6 log_override = TRUE - var/obj/item/twohanded/kinetic_crusher/hammer_synced + var/obj/item/kinetic_crusher/hammer_synced /obj/item/projectile/destabilizer/Destroy() hammer_synced = null @@ -201,19 +201,19 @@ var/denied_type = /obj/item/crusher_trophy /obj/item/crusher_trophy/examine(mob/living/user) - ..() - to_chat(user, "Causes [effect_desc()] when attached to a kinetic crusher.") + . = ..() + . += "Causes [effect_desc()] when attached to a kinetic crusher." /obj/item/crusher_trophy/proc/effect_desc() return "errors" /obj/item/crusher_trophy/attackby(obj/item/A, mob/living/user) - if(istype(A, /obj/item/twohanded/kinetic_crusher)) + if(istype(A, /obj/item/kinetic_crusher)) add_to(A, user) else ..() -/obj/item/crusher_trophy/proc/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/proc/add_to(obj/item/kinetic_crusher/H, mob/living/user) for(var/t in H.trophies) var/obj/item/crusher_trophy/T = t if(istype(T, denied_type) || istype(src, T.denied_type)) @@ -225,7 +225,7 @@ to_chat(user, "You attach [src] to [H].") return TRUE -/obj/item/crusher_trophy/proc/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/proc/remove_from(obj/item/kinetic_crusher/H, mob/living/user) forceMove(get_turf(H)) H.trophies -= src return TRUE @@ -312,12 +312,12 @@ /obj/item/crusher_trophy/legion_skull/effect_desc() return "a kinetic crusher to recharge [bonus_value*0.1] second\s faster" -/obj/item/crusher_trophy/legion_skull/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/legion_skull/add_to(obj/item/kinetic_crusher/H, mob/living/user) . = ..() if(.) H.charge_time -= bonus_value -/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/kinetic_crusher/H, mob/living/user) . = ..() if(.) H.charge_time += bonus_value @@ -370,21 +370,19 @@ /obj/item/crusher_trophy/demon_claws/effect_desc() return "melee hits to do [bonus_value * 0.2] more damage and heal you for [bonus_value * 0.1], with 5X effect on mark detonation" -/obj/item/crusher_trophy/demon_claws/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/demon_claws/add_to(obj/item/kinetic_crusher/H, mob/living/user) . = ..() if(.) H.force += bonus_value * 0.2 - H.force_unwielded += bonus_value * 0.2 - H.force_wielded += bonus_value * 0.2 H.detonation_damage += bonus_value * 0.8 + AddComponent(/datum/component/two_handed, force_wielded=(20 + bonus_value * 0.2)) -/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/kinetic_crusher/H, mob/living/user) . = ..() if(.) H.force -= bonus_value * 0.2 - H.force_unwielded -= bonus_value * 0.2 - H.force_wielded -= bonus_value * 0.2 H.detonation_damage -= bonus_value * 0.8 + AddComponent(/datum/component/two_handed, force_wielded=20) /obj/item/crusher_trophy/demon_claws/on_melee_hit(mob/living/target, mob/living/user) user.heal_ordered_damage(bonus_value * 0.1, damage_heal_order) diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index f4d1afd8b7306..a687b1b46e4f9 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -37,8 +37,8 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sortList(list( /obj/item/stack/marker_beacon/examine(mob/user) . = ..() - . += {"Use in-hand to place a [singular_name].\n - Alt-click to select a color. Current color is [picked_color]."} + . += "Use in-hand to place a [singular_name].\n"+\ + "Alt-click to select a color. Current color is [picked_color]." /obj/item/stack/marker_beacon/update_icon() icon_state = "marker[lowertext(picked_color)]" @@ -72,7 +72,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sortList(list( icon = 'icons/obj/lighting.dmi' icon_state = "markerrandom" layer = BELOW_OPEN_DOOR_LAYER - armor = list("melee" = 50, "bullet" = 75, "laser" = 75, "energy" = 75, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 25, "acid" = 0) + armor = list("melee" = 50, "bullet" = 75, "laser" = 75, "energy" = 75, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 25, "acid" = 0, "stamina" = 0) max_integrity = 50 anchored = TRUE light_range = 2 @@ -135,7 +135,6 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sortList(list( return ..() /obj/structure/marker_beacon/AltClick(mob/living/user) - ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm index dadbdf2af3f69..46cf736273934 100644 --- a/code/modules/mining/equipment/mineral_scanner.dm +++ b/code/modules/mining/equipment/mineral_scanner.dm @@ -24,10 +24,12 @@ /obj/item/mining_scanner/admin /obj/item/mining_scanner/admin/attack_self(mob/user) - for(var/turf/closed/mineral/M in world) - if(M.scan_state) - M.icon_state = M.scan_state - qdel(src) + for(var/area/A as() in get_areas(/area, user.z)) + for(var/turf/closed/mineral/M in A) + if(M.scan_state) + var/obj/effect/temp_visual/mining_overlay/C = new /obj/effect/temp_visual/mining_overlay(M) + C.icon_state = M.scan_state + //qdel(src) /obj/item/t_scanner/adv_mining_scanner desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. This one has an extended range." @@ -61,17 +63,54 @@ mineral_scan_pulse(t, range) /proc/mineral_scan_pulse(turf/T, range = world.view) - var/list/minerals = list() - for(var/turf/closed/mineral/M in range(range, T)) - if(M.scan_state) - minerals += M - if(LAZYLEN(minerals)) - for(var/turf/closed/mineral/M in minerals) - var/obj/effect/temp_visual/mining_overlay/oldC = locate(/obj/effect/temp_visual/mining_overlay) in M - if(oldC) - qdel(oldC) - var/obj/effect/temp_visual/mining_overlay/C = new /obj/effect/temp_visual/mining_overlay(M) - C.icon_state = M.scan_state + var/list/parsedrange = getviewsize(range) + var/xrange = (parsedrange[1] - 1) / 2 + var/yrange = (parsedrange[2] - 1) / 2 + var/cx = T.x + var/cy = T.y + for(var/r in 1 to max(xrange, yrange)) + var/xr = min(xrange, r) + var/yr = min(yrange, r) + var/turf/TL = locate(cx - xr, cy + yr, T.z) + var/turf/BL = locate(cx - xr, cy - yr, T.z) + var/turf/TR = locate(cx + xr, cy + yr, T.z) + var/turf/BR = locate(cx + xr, cy - yr, T.z) + var/list/turfs = list() + turfs += block(TL, TR) + turfs += block(TL, BL) + turfs |= block(BL, BR) + turfs |= block(BR, TR) + for(var/turf/closed/mineral/M in turfs) + new /obj/effect/temp_visual/mining_scanner(M) + if(M.scan_state) + var/obj/effect/temp_visual/mining_overlay/oldC = locate(/obj/effect/temp_visual/mining_overlay) in M + if(oldC) + qdel(oldC) + var/obj/effect/temp_visual/mining_overlay/C = new /obj/effect/temp_visual/mining_overlay(M) + C.icon_state = M.scan_state + sleep(1) + +/proc/pulse_effect(turf/T, range = world.view) + var/list/parsedrange = getviewsize(range) + var/xrange = (parsedrange[1] - 1) / 2 + var/yrange = (parsedrange[2] - 1) / 2 + var/cx = T.x + var/cy = T.y + for(var/r in 1 to max(xrange, yrange)) + var/xr = min(xrange, r) + var/yr = min(yrange, r) + var/turf/TL = locate(cx - xr, cy + yr, T.z) + var/turf/BL = locate(cx - xr, cy - yr, T.z) + var/turf/TR = locate(cx + xr, cy + yr, T.z) + var/turf/BR = locate(cx + xr, cy - yr, T.z) + var/list/turfs = list() + turfs += block(TL, TR) + turfs += block(TL, BL) + turfs |= block(BL, BR) + turfs |= block(BR, TR) + for(var/turf/M in turfs) + new /obj/effect/temp_visual/mining_scanner(M) + sleep(1) /obj/effect/temp_visual/mining_overlay plane = FULLSCREEN_PLANE @@ -85,3 +124,18 @@ /obj/effect/temp_visual/mining_overlay/Initialize() . = ..() animate(src, alpha = 0, time = duration, easing = EASE_IN) + +/obj/effect/temp_visual/mining_scanner + plane = FULLSCREEN_PLANE + layer = FLASH_LAYER + icon = 'icons/effects/mining_scanner.dmi' + appearance_flags = 0 + pixel_x = -224 + pixel_y = -224 + duration = 3 + alpha = 100 + icon_state = "mining_scan" + +/obj/effect/temp_visual/mining_scanner/Initialize() + . = ..() + animate(src, alpha = 0, time = duration, easing = EASE_IN) diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index a14b17c0ba57b..1f6cd4d11221e 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -12,9 +12,12 @@ if(!istype(C, /obj/item/organ/regenerative_core)) to_chat(user, "The stabilizer only works on certain types of monster organs, generally regenerative in nature.") return ..() + if(C.preserved) + to_chat(user, "[M] is already stabilised.") + return C.preserved() - to_chat(user, "You inject the [M] with the stabilizer. It will no longer go inert.") + to_chat(user, "You inject [M] with the stabilizer. It will no longer go inert.") qdel(src) /************************Hivelord core*******************/ diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 5c68cdbcfb7a4..df2d72d1dc51b 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -5,7 +5,7 @@ dynamic_lighting = DYNAMIC_LIGHTING_FORCED requires_power = FALSE has_gravity = STANDARD_GRAVITY - valid_territory = FALSE + area_flags = BLOBS_ALLOWED | UNIQUE_AREA //Survival Capsule /obj/item/survivalcapsule @@ -33,8 +33,9 @@ /obj/item/survivalcapsule/examine(mob/user) . = ..() get_template() - . += "This capsule has the [template.name] stored." - . += template.description + if(template) + . += "This capsule has the [template.name] stored." + . += template.description /obj/item/survivalcapsule/attack_self() //Can't grab when capsule is New() because templates aren't loaded then @@ -91,14 +92,14 @@ icon_state = "capsulemed" icon = 'icons/obj/mining.dmi' template_id = "shelter_echo" - + /obj/item/survivalcapsule/space name = "space shelter capsule" desc = "A spaceworthy shelter designed for emergencies/construction in a bluespace capsule." icon_state = "capsuleeng" icon = 'icons/obj/mining.dmi' template_id = "shelter_eta" - + /obj/item/survivalcapsule/barricade name = "barricade capsule" desc = "A 3x3 glass barricade designed for security use with energy weapons." @@ -143,6 +144,7 @@ icon = 'icons/obj/doors/airlocks/survival/survival.dmi' overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_pod + anim_parts = "topbolts=0,6,0,3;bottombolts=0,-6,3,-6;top=0,4,0,2;bottom=0,-4,0,2;rightbolts=14,0,1.5,5;left=-15,0,1.5,5;right=14,0,1.5,5" /obj/machinery/door/airlock/survival_pod/glass opacity = FALSE @@ -349,7 +351,7 @@ /obj/item/energy_katana, /obj/item/hierophant_club, /obj/item/his_grace, - /obj/item/gun/ballistic/minigun, + /obj/item/gun/energy/minigun, /obj/item/gun/ballistic/automatic/l6_saw, /obj/item/gun/magic/staff/chaos, /obj/item/gun/magic/staff/spellblade, diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index 1d769fa83cf34..07bd5b7d09443 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -58,7 +58,7 @@ var/mob/M = loc if(istype(M)) var/triggered = FALSE - if(M.get_item_by_slot(SLOT_BELT) == src) + if(M.get_item_by_slot(ITEM_SLOT_BELT) == src) if(power == 1) triggered = TRUE else if(power == 2 && prob(50)) @@ -70,7 +70,7 @@ activate(M) /obj/item/wormhole_jaunter/proc/chasm_react(mob/user) - if(user.get_item_by_slot(SLOT_BELT) == src) + if(user.get_item_by_slot(ITEM_SLOT_BELT) == src) to_chat(user, "Your [name] activates, saving you from the chasm!") SSblackbox.record_feedback("tally", "jaunter", 1, "Chasm") // chasm automatic activation activate(user, FALSE) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index bbba80d85a2b2..bf33eecde43ef 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) if(isliving(A)) var/mob/living/M = A M.Paralyze(320) // Keep them from moving during the duration of the extraction - M.buckled = 0 // Unbuckle them to prevent anchoring problems + M.buckled?.unbuckle_mob(M, TRUE) // Unbuckle them to prevent anchoring problems else A.anchored = TRUE A.density = FALSE @@ -112,9 +112,9 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) L.SetSleeping(0) sleep(30) var/list/flooring_near_beacon = list() - for(var/turf/open/floor in orange(1, beacon)) + for(var/turf/open/floor in (RANGE_TURFS(1, beacon)-get_turf(beacon))) flooring_near_beacon += floor - holder_obj.forceMove(pick(flooring_near_beacon)) + do_teleport(holder_obj, pick(flooring_near_beacon), no_effects = TRUE, channel = TELEPORT_CHANNEL_FREE) animate(holder_obj, pixel_z = 10, time = 50) sleep(50) animate(holder_obj, pixel_z = 15, time = 10) @@ -169,7 +169,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) /obj/effect/extraction_holder name = "extraction holder" - desc = "you shouldnt see this" + desc = "you shouldn't see this" var/atom/movable/stored_obj /obj/item/extraction_pack/proc/check_for_living_mobs(atom/A) diff --git a/code/modules/mining/laborcamp/laborshuttle.dm b/code/modules/mining/laborcamp/laborshuttle.dm index dbe607f42fa35..c4ceb4d51a795 100644 --- a/code/modules/mining/laborcamp/laborshuttle.dm +++ b/code/modules/mining/laborcamp/laborshuttle.dm @@ -1,4 +1,4 @@ -/obj/machinery/computer/shuttle/labor +/obj/machinery/computer/shuttle_flight/labor name = "labor shuttle console" desc = "Used to call and send the labor camp shuttle." circuit = /obj/item/circuitboard/computer/labor_shuttle @@ -7,21 +7,9 @@ req_access = list(ACCESS_BRIG) -/obj/machinery/computer/shuttle/labor/one_way +/obj/machinery/computer/shuttle_flight/labor/one_way name = "prisoner shuttle console" desc = "A one-way shuttle console, used to summon the shuttle to the labor camp." - possible_destinations = "laborcamp_away" + recall_docking_port_id = "laborcamp_away" circuit = /obj/item/circuitboard/computer/labor_shuttle/one_way req_access = list( ) - -/obj/machinery/computer/shuttle/labor/one_way/Topic(href, href_list) - if(href_list["move"]) - var/obj/docking_port/mobile/M = SSshuttle.getShuttle("laborcamp") - if(!M) - to_chat(usr, "Cannot locate shuttle!") - return 0 - var/obj/docking_port/stationary/S = M.get_docked() - if(S && S.name == "laborcamp_away") - to_chat(usr, "Shuttle is already at the outpost!") - return 0 - ..() \ No newline at end of file diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index d179ab9a94373..250f35d82e5ce 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -18,9 +18,12 @@ GLOBAL_LIST(labor_sheet_values) /obj/machinery/mineral/labor_claim_console/Initialize() . = ..() - Radio = new/obj/item/radio(src) + Radio = new /obj/item/radio(src) Radio.listening = FALSE locate_stacking_machine() + //If we can't find a stacking machine end it all ok? + if(!stacking_machine) + return INITIALIZE_HINT_QDEL if(!GLOB.labor_sheet_values) var/sheet_list = list() @@ -31,6 +34,13 @@ GLOBAL_LIST(labor_sheet_values) sheet_list += list(list("ore" = initial(sheet.name), "value" = initial(sheet.point_value))) GLOB.labor_sheet_values = sortList(sheet_list, /proc/cmp_sheet_list) +/obj/machinery/mineral/labor_claim_console/Destroy() + QDEL_NULL(Radio) + if(stacking_machine) + stacking_machine.console = null + stacking_machine = null + return ..() + /proc/cmp_sheet_list(list/a, list/b) return a["value"] - b["value"] @@ -43,6 +53,7 @@ GLOBAL_LIST(labor_sheet_values) if(!ui) ui = new(user, src, "LaborClaimConsole") ui.open() + ui.set_autoupdate(TRUE) /obj/machinery/mineral/labor_claim_console/ui_static_data(mob/user) var/list/data = list() @@ -114,9 +125,7 @@ GLOBAL_LIST(labor_sheet_values) /obj/machinery/mineral/labor_claim_console/proc/locate_stacking_machine() stacking_machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) if(stacking_machine) - stacking_machine.CONSOLE = src - else - qdel(src) + stacking_machine.console = src /obj/machinery/mineral/labor_claim_console/emag_act(mob/user) if(!(obj_flags & EMAGGED)) diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index 8be7ce7ee3bed..85bb74c97f57c 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -18,6 +18,7 @@ var/harvest_message_low = "You pick a mushroom, but fail to collect many shavings from its cap." var/harvest_message_med = "You pick a mushroom, carefully collecting the shavings from its cap." var/harvest_message_high = "You harvest and collect shavings from several mushroom caps." + var/destroy_on_harvest = FALSE var/harvested = FALSE var/base_icon var/regrowth_time_low = 8 MINUTES @@ -44,6 +45,8 @@ for(var/i in 1 to rand_harvested) new harvest(get_turf(src)) + if(destroy_on_harvest) + Destroy() icon_state = "[base_icon]p" name = harvested_name desc = harvested_desc @@ -58,7 +61,7 @@ harvested = FALSE /obj/structure/flora/ash/attackby(obj/item/W, mob/user, params) - if(!harvested && needs_sharp_harvest && W.sharpness) + if(!harvested && needs_sharp_harvest && W.is_sharp()) user.visible_message("[user] starts to harvest from [src] with [W].","You begin to harvest from [src] with [W].") if(do_after(user, harvest_time, target = src)) harvest(user) @@ -141,6 +144,21 @@ regrowth_time_low = 4800 regrowth_time_high = 7200 + +/obj/structure/flora/ash/strange + icon_state = "xpod" + name = "strange plant" + desc = "An alient plant born under warming glow of space radiation. What mysteries does it hold? Botanist should know." + harvest = /obj/item/reagent_containers/food/snacks/grown/random + needs_sharp_harvest = FALSE + harvest_amount_high = 2 + harvest_time = 10 + harvest_message_low = "You bravely pick a strange plant." + harvest_message_high = "You bravely pick a pair of strange plant." + light_range = 1.5 + light_power = 2.1 + destroy_on_harvest = TRUE + /obj/structure/flora/ash/cacti/Initialize(mapload) . = ..() // min dmg 3, max dmg 6, prob(70) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index b55eb29de51ad..7066e45779616 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -1,60 +1,59 @@ //The chests dropped by mob spawner tendrils. Also contains associated loot. -#define HIEROPHANT_CLUB_CARDINAL_DAMAGE 30 +#define HIEROPHANT_CLUB_CARDINAL_DAMAGE 15 /obj/structure/closet/crate/necropolis name = "necropolis chest" desc = "It's watching you closely." - icon_state = "necrocrate" + icon_state = "necro_crate" resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + door_anim_time = 0 /obj/structure/closet/crate/necropolis/tendril desc = "It's watching you suspiciously." + ///prevents bust_open to fire + integrity_failure = 0 + /// var to check if it got opened by a key + var/spawned_loot = FALSE -/obj/structure/closet/crate/necropolis/tendril/PopulateContents() - var/loot = rand(1,30) +/obj/structure/closet/crate/necropolis/tendril/Initialize() + . = ..() + RegisterSignal(src, COMSIG_PARENT_ATTACKBY, .proc/try_spawn_loot) + +/obj/structure/closet/crate/necropolis/tendril/proc/try_spawn_loot(datum/source, obj/item/item, mob/user, params) ///proc that handles key checking and generating loot + SIGNAL_HANDLER + + if(!istype(item, /obj/item/skeleton_key) || spawned_loot) + return FALSE + var/loot = rand(1,25) switch(loot) - if(1) - new /obj/item/shared_storage/red(src) - if(2) - new /obj/item/clothing/suit/space/hardsuit/cult(src) - if(3) - new /obj/item/soulstone/anybody(src) - if(4) - new /obj/item/katana/cursed(src) - if(5) - new /obj/item/clothing/glasses/godeye(src) - if(6) - new /obj/item/reagent_containers/glass/bottle/potion/flight(src) - if(7) - new /obj/item/pickaxe/diamond(src) - if(8) - if(prob(50)) - new /obj/item/disk/design_disk/modkit_disc/resonator_blast(src) - else - new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src) + if(1 to 2) + new /obj/item/disk/design_disk/modkit_disc/resonator_blast(src) //Doubled chance to receive upgrade disk that is directly relevant to mining + if(3 to 4) + new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src) + if(5 to 6) + new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src) + if(7 to 8) + new /obj/item/disk/design_disk/modkit_disc/bounty(src) if(9) - new /obj/item/rod_of_asclepius(src) + new /obj/item/borg/upgrade/modkit/lifesteal(src) if(10) - new /obj/item/organ/heart/cursed/wizard(src) + new /obj/item/shared_storage/red(src) if(11) - new /obj/item/ship_in_a_bottle(src) + new /obj/item/clothing/glasses/godeye(src) if(12) - new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker(src) + new /obj/item/reagent_containers/glass/bottle/potion/flight(src) if(13) - new /obj/item/jacobs_ladder(src) + new /obj/item/pickaxe/diamond(src) //Ashwalkers exist. This is actually a great drop for them if(14) - new /obj/item/nullrod/scythe/talking(src) + new /obj/item/rod_of_asclepius(src) if(15) - new /obj/item/nullrod/armblade(src) + new /obj/item/organ/heart/cursed/wizard(src) if(16) - new /obj/item/guardiancreator/hive(src) + new /obj/item/ship_in_a_bottle(src) if(17) - if(prob(50)) - new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src) - else - new /obj/item/disk/design_disk/modkit_disc/bounty(src) + new /obj/item/jacobs_ladder(src) if(18) new /obj/item/warp_cube/red(src) if(19) @@ -64,25 +63,28 @@ if(21) new /obj/item/gun/magic/hook(src) if(22) - new /obj/item/voodoo(src) - if(23) - 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) - if(25) - new /obj/item/book/granter/spell/summonitem(src) - if(26) new /obj/item/book_of_babel(src) - if(27) - new /obj/item/borg/upgrade/modkit/lifesteal(src) - new /obj/item/bedsheet/cult(src) - if(28) + if(23) new /obj/item/clothing/neck/necklace/memento_mori(src) - if(29) + if(24) new /obj/item/reagent_containers/glass/waterbottle/relic(src) - if(30) + if(25) new /obj/item/reagent_containers/glass/bottle/necropolis_seed(src) + spawned_loot = TRUE + qdel(item) + to_chat(user, "You disable the magic lock, revealing the loot.") + return TRUE + +/obj/structure/closet/crate/necropolis/tendril/can_open(mob/living/user, force = FALSE) + if(!spawned_loot) + return FALSE + return ..() + +/obj/structure/closet/crate/necropolis/tendril/examine(mob/user) + . = ..() + if(!spawned_loot) + . += "You need a skeleton key to open it." + //KA modkit design discs /obj/item/disk/design_disk/modkit_disc @@ -216,7 +218,7 @@ var/mob/living/carbon/human/active_owner /obj/item/clothing/neck/necklace/memento_mori/item_action_slot_check(slot) - return slot == SLOT_NECK + return slot == ITEM_SLOT_NECK /obj/item/clothing/neck/necklace/memento_mori/dropped(mob/user) ..() @@ -329,6 +331,8 @@ to_chat(orbits.parent, "Your vision returns to normal.") /obj/effect/wisp/proc/update_user_sight(mob/user) + SIGNAL_HANDLER + user.sight |= sight_flags if(!isnull(lighting_alpha)) user.lighting_alpha = min(user.lighting_alpha, lighting_alpha) @@ -357,15 +361,26 @@ var/obj/item/warp_cube/linked var/teleporting = FALSE +/obj/item/warp_cube/Destroy() + if(!QDELETED(linked)) + qdel(linked) + linked = null + return ..() + /obj/item/warp_cube/attack_self(mob/user) if(!linked) to_chat(user, "[src] fizzles uselessly.") return if(teleporting) return + var/turf/T = get_turf(src) + var/area/A1 = get_area(T) + var/area/A2 = get_area(linked) + if(A1.teleport_restriction || A2.teleport_restriction) + to_chat(user, "[src] fizzles gently as it fails to breach the bluespace veil.") + return teleporting = TRUE linked.teleporting = TRUE - var/turf/T = get_turf(src) new /obj/effect/temp_visual/warp_cube(T, user, teleport_color, TRUE) SSblackbox.record_feedback("tally", "warp_cube", 1, type) new /obj/effect/temp_visual/warp_cube(get_turf(linked), user, linked.teleport_color, FALSE) @@ -379,7 +394,7 @@ user.forceMove(get_turf(link_holder)) qdel(link_holder) return - link_holder.forceMove(get_turf(linked)) + do_teleport(link_holder, get_turf(linked), no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC) sleep(2.5) if(QDELETED(user)) qdel(link_holder) @@ -421,8 +436,8 @@ righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' fire_sound = 'sound/weapons/batonextend.ogg' max_charges = 1 - item_flags = NEEDS_PERMIT | NOBLUDGEON - force = 18 + item_flags = NEEDS_PERMIT + force = 15 attack_weight = 2 /obj/item/ammo_casing/magic/hook @@ -437,11 +452,11 @@ icon_state = "hook" icon = 'icons/obj/lavaland/artefacts.dmi' pass_flags = PASSTABLE - damage = 25 + damage = 10 armour_penetration = 100 damage_type = BRUTE hitsound = 'sound/effects/splat.ogg' - paralyze = 30 + knockdown = 30 var/chain /obj/item/projectile/hook/fire(setAngle) @@ -692,13 +707,31 @@ ///Bosses +//Legion + +/obj/structure/closet/crate/necropolis/legion + name = "legion chest" + +/obj/structure/closet/crate/necropolis/legion/PopulateContents() + var/list/choices = subtypesof(/obj/machinery/anomalous_crystal) + var/random_crystal = pick(choices) + new random_crystal(src) + new /obj/effect/spawner/lootdrop/megafaunaore(src) + //Miniboss Miner +/obj/structure/closet/crate/necropolis/bdm + name = "blood-drunk miner chest" + +/obj/structure/closet/crate/necropolis/bdm/PopulateContents() + new /obj/item/melee/transforming/cleaving_saw(src) + new /obj/effect/spawner/lootdrop/megafaunaore(src) + /obj/item/melee/transforming/cleaving_saw name = "cleaving saw" desc = "This saw, effective at drawing the blood of beasts, transforms into a long cleaver that makes use of centrifugal force." - force = 12 - force_on = 20 //force when active + force = 8 + force_on = 15 //force when active throwforce = 20 throwforce_on = 20 icon = 'icons/obj/lavaland/artefacts.dmi' @@ -716,16 +749,16 @@ block_upgrade_walk = 1 w_class = WEIGHT_CLASS_BULKY sharpness = IS_SHARP - faction_bonus_force = 30 + faction_bonus_force = 45 nemesis_factions = list("mining", "boss") var/transform_cooldown var/swiping = FALSE /obj/item/melee/transforming/cleaving_saw/examine(mob/user) . = ..() - . += {"It is [active ? "open, will cleave enemies in a wide arc and deal additional damage to fauna":"closed, and can be used for rapid consecutive attacks that cause fauna to bleed"].\n - Both modes will build up existing bleed effects, doing a burst of high damage if the bleed is built up high enough.\n - Transforming it immediately after an attack causes the next attack to come out faster."} + . += "It is [active ? "open, will cleave enemies in a wide arc and deal additional damage to fauna":"closed, and can be used for rapid consecutive attacks that cause fauna to bleed"].\n"+\ + "Both modes will build up existing bleed effects, doing a burst of high damage if the bleed is built up high enough.\n"+\ + "Transforming it immediately after an attack causes the next attack to come out faster." /obj/item/melee/transforming/cleaving_saw/suicide_act(mob/user) user.visible_message("[user] is [active ? "closing [src] on [user.p_their()] neck" : "opening [src] into [user.p_their()] chest"]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -792,24 +825,10 @@ name = "dragon chest" /obj/structure/closet/crate/necropolis/dragon/PopulateContents() - var/loot = rand(1,4) - switch(loot) - if(1) - new /obj/item/melee/ghost_sword(src) - if(2) - new /obj/item/lava_staff(src) - if(3) - new /obj/item/book/granter/spell/sacredflame(src) - new /obj/item/gun/magic/wand/fireball(src) - if(4) - new /obj/item/dragons_blood(src) + new /obj/effect/spawner/lootdrop/megafaunaore(src) + new /obj/item/dragons_blood(src) -/obj/structure/closet/crate/necropolis/dragon/crusher - name = "firey dragon chest" - -/obj/structure/closet/crate/necropolis/dragon/crusher/PopulateContents() - ..() - new /obj/item/crusher_trophy/tail_spike(src) +// Ghost Sword - left in for other references and admin shenanigans /obj/item/melee/ghost_sword name = "\improper spectral blade" @@ -919,7 +938,7 @@ return var/mob/living/carbon/human/H = user - var/random = rand(1,4) + var/random = rand(1,3) switch(random) if(1) @@ -931,11 +950,6 @@ to_chat(user, "Your flesh begins to melt! Miraculously, you seem fine otherwise.") H.set_species(/datum/species/skeleton) if(3) - to_chat(user, "Power courses through you! You can now shift your form at will.") - if(user.mind) - var/obj/effect/proc_holder/spell/targeted/shapeshift/dragon/D = new - user.mind.AddSpell(D) - if(4) to_chat(user, "You feel like you could walk straight through lava now.") H.weather_immunities |= "lava" @@ -949,7 +963,7 @@ agent = "dragon's blood" desc = "What do dragons have to do with Space Station 13?" stage_prob = 20 - severity = DISEASE_SEVERITY_BIOHAZARD + danger = DISEASE_BIOHAZARD visibility_flags = 0 stage1 = list("Your bones ache.") stage2 = list("Your skin feels scaly.") @@ -993,7 +1007,7 @@ if(is_type_in_typecache(target, banned_turfs)) return - if(target in view(user.client.view, get_turf(user))) + if(user in viewers(user.client.view, get_turf(target))) var/turf/open/T = get_turf(target) if(!istype(T)) @@ -1033,21 +1047,7 @@ /obj/structure/closet/crate/necropolis/bubblegum/PopulateContents() new /obj/item/clothing/suit/space/hostile_environment(src) new /obj/item/clothing/head/helmet/space/hostile_environment(src) - var/loot = rand(1,3) - switch(loot) - if(1) - new /obj/item/mayhem(src) - if(2) - new /obj/item/blood_contract(src) - if(3) - new /obj/item/gun/magic/staff/spellblade(src) - -/obj/structure/closet/crate/necropolis/bubblegum/crusher - name = "bloody bubblegum chest" - -/obj/structure/closet/crate/necropolis/bubblegum/crusher/PopulateContents() - ..() - new /obj/item/crusher_trophy/demon_claws(src) + new /obj/effect/spawner/lootdrop/megafaunaore(src) /obj/item/mayhem name = "mayhem in a bottle" @@ -1119,19 +1119,19 @@ return ..() /obj/structure/closet/crate/necropolis/colossus/PopulateContents() - var/list/choices = subtypesof(/obj/machinery/anomalous_crystal) - var/random_crystal = pick(choices) - new random_crystal(src) new /obj/item/organ/vocal_cords/colossus(src) + new /obj/effect/spawner/lootdrop/megafaunaore(src) -/obj/structure/closet/crate/necropolis/colossus/crusher - name = "angelic colossus chest" - -/obj/structure/closet/crate/necropolis/colossus/crusher/PopulateContents() - ..() - new /obj/item/crusher_trophy/blaster_tubes(src) //Hierophant + +/obj/structure/closet/crate/necropolis/hierophant + name = "hierophant chest" + +/obj/structure/closet/crate/necropolis/hierophant/PopulateContents() + new /obj/item/hierophant_club(src) + new /obj/effect/spawner/lootdrop/megafaunaore(src) + /obj/item/hierophant_club name = "hierophant club" desc = "The strange technology of this large club allows various nigh-magical feats. It used to beat you, but now you can set the beat." @@ -1144,7 +1144,7 @@ inhand_y_dimension = 64 slot_flags = ITEM_SLOT_BACK w_class = WEIGHT_CLASS_BULKY - force = 15 + force = 5 //Melee attacks also invoke a 15 burn damage AoE, for a total of 20 damage attack_verb = list("clubbed", "beat", "pummeled") hitsound = 'sound/weapons/sonic_jackhammer.ogg' actions_types = list(/datum/action/item_action/vortex_recall, /datum/action/item_action/toggle_unfriendly_fire) @@ -1171,7 +1171,7 @@ for(var/obj/item/I in user) if(I != src) user.dropItemToGround(I) - for(var/turf/T in RANGE_TURFS(1, user)) + for(var/turf/T as() in RANGE_TURFS(1, user)) var/obj/effect/temp_visual/hierophant/blast/B = new(T, user, TRUE) B.damage = 0 user.dropItemToGround(src) //Drop us last, so it goes on top of their stuff @@ -1191,12 +1191,12 @@ if(ismineralturf(target) && get_dist(user, target) < 6) //target is minerals, we can hit it(even if we can't see it) INVOKE_ASYNC(src, .proc/cardinal_blasts, T, user) timer = world.time + cooldown_time - else if(target in view(5, get_turf(user))) //if the target is in view, hit it + else if(user in viewers(5, get_turf(target))) //if the target is in view, hit it timer = world.time + cooldown_time if(isliving(target) && chaser_timer <= world.time) //living and chasers off cooldown? fire one! chaser_timer = world.time + chaser_cooldown var/obj/effect/temp_visual/hierophant/chaser/C = new(get_turf(user), user, target, chaser_speed, friendly_fire_check) - C.damage = 30 + C.damage = 15 C.monster_damage_boost = FALSE log_combat(user, target, "fired a chaser at", src) else @@ -1316,13 +1316,13 @@ user.log_message("teleported self from [AREACOORD(source)] to [beacon]", LOG_GAME) new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user) new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, user) - for(var/t in RANGE_TURFS(1, T)) + for(var/turf/t as() in RANGE_TURFS(1, T)) var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //blasts produced will not hurt allies B.damage = 30 - for(var/t in RANGE_TURFS(1, source)) + for(var/turf/t as() in RANGE_TURFS(1, source)) var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //but absolutely will hurt enemies B.damage = 30 - for(var/mob/living/L in range(1, source)) + for(var/mob/living/L in hearers(1, source)) INVOKE_ASYNC(src, .proc/teleport_mob, source, L, T, user) //regardless, take all mobs near us along sleep(6) //at this point the blasts detonate if(beacon) @@ -1350,7 +1350,7 @@ sleep(2) if(!M) return - M.forceMove(turf_to_teleport_to) + do_teleport(M, turf_to_teleport_to, no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC) sleep(1) if(!M) return @@ -1399,17 +1399,27 @@ var/obj/effect/temp_visual/hierophant/blast/B = new(t, user, friendly_fire_check) B.damage = 15 //keeps monster damage boost due to lower damage - //Just some minor stuff /obj/structure/closet/crate/necropolis/puzzle name = "puzzling chest" /obj/structure/closet/crate/necropolis/puzzle/PopulateContents() - var/loot = rand(1,3) + var/loot = rand(1,5) switch(loot) if(1) - new /obj/item/soulstone/anybody(src) + new /obj/item/disk/design_disk/modkit_disc/resonator_blast(src) if(2) - new /obj/item/wisp_lantern(src) + new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src) if(3) - new /obj/item/prisoncube(src) + new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src) + if(4) + new /obj/item/disk/design_disk/modkit_disc/bounty(src) + if(5) + new /obj/item/borg/upgrade/modkit/lifesteal(src) + +/obj/item/skeleton_key + name = "skeleton key" + desc = "An artifact usually found in the hands of the natives of lavaland, which NT now holds a monopoly on." + icon = 'icons/obj/lavaland/artefacts.dmi' + icon_state = "skeleton_key" + w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/mining/lavaland/ruins/gym.dm b/code/modules/mining/lavaland/ruins/gym.dm index d9cdf70ced234..d3a09764b8235 100644 --- a/code/modules/mining/lavaland/ruins/gym.dm +++ b/code/modules/mining/lavaland/ruins/gym.dm @@ -33,6 +33,9 @@ . = ..() if(.) return + if(!Adjacent(user)) + to_chat(user, "You're too far away to get swole!") + return if(obj_flags & IN_USE) to_chat(user, "It's already in use - wait a bit.") return @@ -51,10 +54,10 @@ user.pixel_y = 0 var/finishmessage = pick("You feel stronger!","You feel like you can take on the world!","You feel robust!","You feel indestructible!") - + if (user.client) SSmedals.UnlockMedal(MEDAL_USE_WEIGHT_MACHINE,user.client) - + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "exercise", /datum/mood_event/exercise) icon_state = initial(icon_state) diff --git a/code/modules/mining/machine_bluespaceminer.dm b/code/modules/mining/machine_bluespaceminer.dm deleted file mode 100644 index 226e66bdf9907..0000000000000 --- a/code/modules/mining/machine_bluespaceminer.dm +++ /dev/null @@ -1,40 +0,0 @@ -/obj/machinery/mineral/bluespace_miner - name = "bluespace mining machine" - desc = "A machine that uses the magic of Bluespace to slowly generate materials and add them to a linked ore silo." - icon = 'icons/obj/machines/mining_machines.dmi' - icon_state = "bs_miner" - density = TRUE - circuit = /obj/item/circuitboard/machine/bluespace_miner - layer = BELOW_OBJ_LAYER - var/list/ore_rates = list(/datum/material/iron = 0.6, /datum/material/glass = 0.6, /datum/material/copper = 0.4, /datum/material/plasma = 0.2, /datum/material/silver = 0.2, /datum/material/gold = 0.1, /datum/material/titanium = 0.1, /datum/material/uranium = 0.1, /datum/material/diamond = 0.1) - var/datum/component/remote_materials/materials - -/obj/machinery/mineral/bluespace_miner/Initialize(mapload) - . = ..() - materials = AddComponent(/datum/component/remote_materials, "bsm", mapload) - -/obj/machinery/mineral/bluespace_miner/Destroy() - materials = null - return ..() - -/obj/machinery/mineral/bluespace_miner/multitool_act(mob/living/user, obj/item/multitool/M) - if(istype(M)) - if(!M.buffer || !istype(M.buffer, /obj/machinery/ore_silo)) - to_chat(user, "You need to multitool the ore silo first.") - return FALSE - -/obj/machinery/mineral/bluespace_miner/examine(mob/user) - . = ..() - if(!materials?.silo) - . += "No ore silo connected. Use a multi-tool to link an ore silo to this machine." - else if(materials?.on_hold()) - . += "Ore silo access is on hold, please contact the quartermaster." - -/obj/machinery/mineral/bluespace_miner/process() - if(!materials?.silo || materials?.on_hold()) - return - var/datum/component/material_container/mat_container = materials.mat_container - if(!mat_container || panel_open || !powered()) - return - var/datum/material/ore = pick(ore_rates) - mat_container.insert_amount_mat((ore_rates[ore] * 1000), ore) diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 47096a9a601c2..e40a8ad72e5c0 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -1,11 +1,50 @@ -#define SMELT_AMOUNT 10 +/// Smelt amount per second +#define SMELT_AMOUNT 5 /**********************Mineral processing unit console**************************/ /obj/machinery/mineral + processing_flags = START_PROCESSING_MANUALLY + subsystem_type = /datum/controller/subsystem/processing/fastprocess + /// The current direction of `input_turf`, in relation to the machine. var/input_dir = NORTH + /// The current direction, in relation to the machine, that items will be output to. var/output_dir = SOUTH + /// The turf the machines listens to for items to pick up. Calls the `pickup_item()` proc. + var/turf/input_turf = null + /// Determines if this machine needs to pick up items. Used to avoid registering signals to `/mineral` machines that don't pickup items. + var/needs_item_input = FALSE +/obj/machinery/mineral/Initialize(mapload) + . = ..() + if(needs_item_input) + register_input_turf() + +/// Gets the turf in the `input_dir` direction adjacent to the machine, and registers signals for ATOM_ENTERED and ATOM_CREATED. Calls the `pickup_item()` proc when it recieves these signals. +/obj/machinery/mineral/proc/register_input_turf() + input_turf = get_step(src, input_dir) + if(input_turf) // make sure there is actually a turf + RegisterSignal(input_turf, list(COMSIG_ATOM_CREATED, COMSIG_ATOM_ENTERED), .proc/pickup_item) + +/// Unregisters signals that are registered the machine's input turf, if it has one. +/obj/machinery/mineral/proc/unregister_input_turf() + if(input_turf) + UnregisterSignal(input_turf, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_CREATED)) + +/** + Base proc for all `/mineral` subtype machines to use. Place your item pickup behavior in this proc when you override it for your specific machine. + Called when the COMSIG_ATOM_ENTERED and COMSIG_ATOM_CREATED signals are sent. + Arguments: + * source - the turf that is listening for the signals. + * target - the atom that just moved onto the `source` turf. + * oldLoc - the old location that `target` was at before moving onto `source`. +*/ +/obj/machinery/mineral/proc/pickup_item(datum/source, atom/movable/target, atom/oldLoc) + SIGNAL_HANDLER + + return + +/// Generic unloading proc. Takes an atom as an argument and forceMove's it to the turf adjacent to this machine in the `output_dir` direction. /obj/machinery/mineral/proc/unload_mineral(atom/movable/S) S.forceMove(drop_location()) var/turf/T = get_step(src,output_dir) @@ -19,7 +58,6 @@ density = TRUE var/obj/machinery/mineral/processing_unit/machine = null var/machinedir = EAST - speed_process = TRUE /obj/machinery/mineral/processing_unit_console/Initialize() . = ..() @@ -58,6 +96,7 @@ if(href_list["set_on"]) machine.on = (href_list["set_on"] == "on") + machine.begin_processing() updateUsrDialog() return @@ -75,6 +114,7 @@ icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "furnace" density = TRUE + needs_item_input = TRUE var/obj/machinery/mineral/CONSOLE = null var/on = FALSE var/datum/material/selected_material = null @@ -93,11 +133,9 @@ QDEL_NULL(stored_research) return ..() -/obj/machinery/mineral/processing_unit/HasProximity(atom/movable/AM) - if(istype(AM, /obj/item/stack/ore) && AM.loc == get_step(src, input_dir)) - process_ore(AM) - /obj/machinery/mineral/processing_unit/proc/process_ore(obj/item/stack/ore/O) + if(QDELETED(O)) + return var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/material_amount = materials.get_item_material_amount(O) if(!materials.has_space(material_amount)) @@ -142,23 +180,31 @@ return dat -/obj/machinery/mineral/processing_unit/process() - if (on) +/obj/machinery/mineral/processing_unit/pickup_item(datum/source, atom/movable/target, atom/oldLoc) + if(QDELETED(target)) + return + if(istype(target, /obj/item/stack/ore)) + process_ore(target) + +/obj/machinery/mineral/processing_unit/process(delta_time) + if(on) if(selected_material) - smelt_ore() + smelt_ore(delta_time) else if(selected_alloy) - smelt_alloy() + smelt_alloy(delta_time) if(CONSOLE) CONSOLE.updateUsrDialog() + else + end_processing() -/obj/machinery/mineral/processing_unit/proc/smelt_ore() +/obj/machinery/mineral/processing_unit/proc/smelt_ore(delta_time = 2) var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/datum/material/mat = selected_material if(mat) - var/sheets_to_remove = (materials.materials[mat] >= (MINERAL_MATERIAL_AMOUNT * SMELT_AMOUNT) ) ? SMELT_AMOUNT : round(materials.materials[mat] / MINERAL_MATERIAL_AMOUNT) + var/sheets_to_remove = (materials.materials[mat] >= (MINERAL_MATERIAL_AMOUNT * SMELT_AMOUNT * delta_time) ) ? SMELT_AMOUNT * delta_time : round(materials.materials[mat] / MINERAL_MATERIAL_AMOUNT) if(!sheets_to_remove) on = FALSE else @@ -166,13 +212,13 @@ materials.retrieve_sheets(sheets_to_remove, mat, out) -/obj/machinery/mineral/processing_unit/proc/smelt_alloy() +/obj/machinery/mineral/processing_unit/proc/smelt_alloy(delta_time = 2) var/datum/design/alloy = stored_research.isDesignResearchedID(selected_alloy) //check if it's a valid design if(!alloy) on = FALSE return - var/amount = can_smelt(alloy) + var/amount = can_smelt(alloy, delta_time) if(!amount) on = FALSE @@ -183,11 +229,11 @@ generate_mineral(alloy.build_path) -/obj/machinery/mineral/processing_unit/proc/can_smelt(datum/design/D) +/obj/machinery/mineral/processing_unit/proc/can_smelt(datum/design/D, delta_time = 2) if(D.make_reagents.len) return FALSE - var/build_amount = SMELT_AMOUNT + var/build_amount = SMELT_AMOUNT * delta_time var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 47e537f7d08ec..42d6e8649c722 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -10,20 +10,19 @@ input_dir = NORTH output_dir = SOUTH req_access = list(ACCESS_MINERAL_STOREROOM) - speed_process = TRUE circuit = /obj/item/circuitboard/machine/ore_redemption - + needs_item_input = TRUE + processing_flags = START_PROCESSING_MANUALLY layer = BELOW_OBJ_LAYER var/obj/item/card/id/inserted_id var/points = 0 - var/ore_pickup_rate = 15 var/sheet_per_ore = 1 var/point_upgrade = 1 var/list/ore_values = list(/datum/material/iron = 1, /datum/material/glass = 1, /datum/material/copper = 5, /datum/material/plasma = 15, /datum/material/silver = 16, /datum/material/gold = 18, /datum/material/titanium = 30, /datum/material/uranium = 30, /datum/material/diamond = 50, /datum/material/bluespace = 50, /datum/material/bananium = 60) - var/message_sent = FALSE - var/list/ore_buffer = list() + /// Variable that holds a timer which is used for callbacks to `send_console_message()`. Used for preventing multiple calls to this proc while the ORM is eating a stack of ores. + var/console_notify_timer var/datum/techweb/stored_research var/obj/item/disk/design_disk/inserted_disk var/datum/component/remote_materials/materials @@ -39,39 +38,34 @@ return ..() /obj/machinery/mineral/ore_redemption/RefreshParts() - var/ore_pickup_rate_temp = 15 var/point_upgrade_temp = 1 var/sheet_per_ore_temp = 1 for(var/obj/item/stock_parts/matter_bin/B in component_parts) sheet_per_ore_temp = 0.65 + (0.35 * B.rating) - 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) - ore_pickup_rate = ore_pickup_rate_temp point_upgrade = point_upgrade_temp sheet_per_ore = round(sheet_per_ore_temp, 0.01) /obj/machinery/mineral/ore_redemption/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Smelting [sheet_per_ore] sheet(s) per piece of ore.
Reward point generation at [point_upgrade*100]%.
Ore pickup speed at [ore_pickup_rate]." + . += "The status display reads: Smelting [sheet_per_ore] sheet(s) per piece of ore.
Reward point generation at [point_upgrade*100]%.
" if(panel_open) . += "Alt-click to rotate the input and output direction." /obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/stack/ore/O) + if(QDELETED(O)) + return var/datum/component/material_container/mat_container = materials.mat_container if (!mat_container) return + console_notify_timer = null + if(O.refined_type == null) return - ore_buffer -= O - - if(O?.refined_type) - points += O.points * point_upgrade * O.amount - var/material_amount = mat_container.get_item_material_amount(O) if(!material_amount) @@ -81,6 +75,8 @@ unload_mineral(O) else + if(O?.refined_type) + points += O.points * point_upgrade * O.amount var/mats = O.materials & mat_container.materials var/amount = O.amount mat_container.insert_item(O, sheet_per_ore) //insert it @@ -114,17 +110,15 @@ return build_amount /obj/machinery/mineral/ore_redemption/proc/process_ores(list/ores_to_process) - var/current_amount = 0 for(var/ore in ores_to_process) - if(current_amount >= ore_pickup_rate) - break smelt_ore(ore) /obj/machinery/mineral/ore_redemption/proc/send_console_message() var/datum/component/material_container/mat_container = materials.mat_container if(!mat_container || !is_station_level(z)) return - message_sent = TRUE + + console_notify_timer = null var/area/A = get_area(src) var/msg = "Now available in [A]:
" @@ -150,26 +144,34 @@ )) signal.send_to_receivers() -/obj/machinery/mineral/ore_redemption/process() +/obj/machinery/mineral/ore_redemption/pickup_item(datum/source, atom/movable/target, atom/oldLoc) + if(QDELETED(target)) + return if(!materials.mat_container || panel_open || !powered()) return - var/atom/input = get_step(src, input_dir) - var/obj/structure/ore_box/OB = locate() in input - if(OB) - input = OB - - for(var/obj/item/stack/ore/O in input) - if(QDELETED(O)) - continue - ore_buffer |= O - O.forceMove(src) - CHECK_TICK - - if(LAZYLEN(ore_buffer)) - message_sent = FALSE - process_ores(ore_buffer) - else if(!message_sent) - send_console_message() + + if(istype(target, /obj/structure/ore_box)) + var/obj/structure/ore_box/box = target + process_ores(box.contents) + box.ui_update() + else if(istype(target, /obj/item/stack/ore)) + var/obj/item/stack/ore/O = target + smelt_ore(O) + else + return + + if(!console_notify_timer) + // gives 5 seconds for a load of ores to be sucked up by the ORM before it sends out request console notifications. This should be enough time for most deposits that people make + console_notify_timer = addtimer(CALLBACK(src, .proc/send_console_message), 5 SECONDS) + +/obj/machinery/mineral/ore_redemption/default_unfasten_wrench(mob/user, obj/item/I) + . = ..() + if(!.) + return + if(anchored) + register_input_turf() // someone just wrenched us down, re-register the turf + else + unregister_input_turf() // someone just un-wrenched us, unregister the turf /obj/machinery/mineral/ore_redemption/attackby(obj/item/W, mob/user, params) if(default_unfasten_wrench(user, W)) @@ -197,13 +199,14 @@ return ..() /obj/machinery/mineral/ore_redemption/AltClick(mob/living/user) - ..() if(!user.canUseTopic(src, BE_CLOSE)) return - if (panel_open) + if(panel_open) input_dir = turn(input_dir, -90) output_dir = turn(output_dir, -90) to_chat(user, "You change [src]'s I/O settings, setting the input to [dir2text(input_dir)] and the output to [dir2text(output_dir)].") + unregister_input_turf() // someone just rotated the input and output directions, unregister the old turf + register_input_turf() // register the new one return TRUE @@ -215,6 +218,7 @@ if(!ui) ui = new(user, src, "OreRedemptionMachine") ui.open() + ui.set_autoupdate(TRUE) // Material amounts /obj/machinery/mineral/ore_redemption/ui_data(mob/user) var/list/data = list() @@ -234,6 +238,8 @@ for(var/v in stored_research.researched_designs) var/datum/design/D = SSresearch.techweb_design_by_id(v) data["alloys"] += list(list("name" = D.name, "id" = D.id, "amount" = can_smelt_alloy(D))) + else + data["alloys"] = null // In case we lose mat_container while UI is open somehow if (!mat_container) data["disconnected"] = "local mineral storage is unavailable" @@ -241,6 +247,8 @@ data["disconnected"] = "no ore silo connection is available; storing locally" else if (materials.on_hold()) data["disconnected"] = "mineral withdrawal is on hold" + else + data["disconnected"] = null data["diskDesigns"] = list() data["hasDisk"] = FALSE @@ -265,11 +273,11 @@ if(points) if(I?.mining_points += points) points = 0 + . = TRUE else to_chat(usr, "No ID detected.") else to_chat(usr, "No points to claim.") - return TRUE if("Release") if(!mat_container) return @@ -303,26 +311,26 @@ mats[mat] = MINERAL_MATERIAL_AMOUNT materials.silo_log(src, "released", -count, "sheets", mats) //Logging deleted for quick coding - return TRUE + . = TRUE if("diskInsert") var/obj/item/disk/design_disk/disk = usr.get_active_held_item() if(istype(disk)) if(!usr.transferItemToLoc(disk,src)) return inserted_disk = disk + . = TRUE else to_chat(usr, "Not a valid Design Disk!") - return TRUE if("diskEject") if(inserted_disk) usr.put_in_hands(inserted_disk) inserted_disk = null - return TRUE + . = TRUE if("diskUpload") var/n = text2num(params["design"]) if(inserted_disk && inserted_disk.blueprints && inserted_disk.blueprints[n]) stored_research.add_design(inserted_disk.blueprints[n]) - return TRUE + . = TRUE if("Smelt") if(!mat_container) return @@ -347,9 +355,9 @@ else output = new alloy.build_path(src) unload_mineral(output) + . = TRUE else to_chat(usr, "Required access not found.") - return TRUE /obj/machinery/mineral/ore_redemption/ex_act(severity, target) do_sparks(5, TRUE, src) diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 61cb675cf057f..45cb07e25dad9 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -15,14 +15,22 @@ GLOBAL_LIST_EMPTY(silo_access_logs) /obj/machinery/ore_silo/Initialize(mapload) . = ..() - AddComponent(/datum/component/material_container, - list(/datum/material/iron, /datum/material/glass, /datum/material/copper, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace, /datum/material/plastic), - INFINITY, - FALSE, - /obj/item/stack, - null, - null, - TRUE) + var/static/list/materials_list = list( + /datum/material/iron, + /datum/material/glass, + /datum/material/copper, + /datum/material/silver, + /datum/material/gold, + /datum/material/diamond, + /datum/material/plasma, + /datum/material/uranium, + /datum/material/bananium, + /datum/material/titanium, + /datum/material/bluespace, + /datum/material/plastic, + ) + AddComponent(/datum/component/material_container, materials_list, INFINITY, allowed_types=/obj/item/stack, _disable_attackby=TRUE) + if (!GLOB.ore_silo_default && mapload && is_station_level(z)) GLOB.ore_silo_default = src @@ -43,6 +51,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) /obj/machinery/ore_silo/proc/remote_attackby(obj/machinery/M, mob/user, obj/item/stack/I) var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) + // stolen from /datum/component/material_container/proc/OnAttackBy if(user.a_intent != INTENT_HELP) return @@ -62,8 +71,19 @@ GLOBAL_LIST_EMPTY(silo_access_logs) return TRUE /obj/machinery/ore_silo/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/stack)) + if(default_deconstruction_screwdriver(user, icon_state, icon_state, W)) + updateUsrDialog() + return + + if(default_deconstruction_crowbar(W)) + return + + if(!powered()) + return ..() + + if(istype(W, /obj/item/stack)) return remote_attackby(src, user, W) + return ..() /obj/machinery/ore_silo/ui_interact(mob/user) diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index 35ca8b8e2a8ee..b6575073bfa5b 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -14,7 +14,13 @@ . = ..() machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) if (machine) - machine.CONSOLE = src + machine.console = src + +/obj/machinery/mineral/stacking_unit_console/Destroy() + if(machine) + machine.console = null + machine = null + return ..() /obj/machinery/mineral/stacking_unit_console/ui_interact(mob/user) . = ..() @@ -74,7 +80,7 @@ circuit = /obj/item/circuitboard/machine/stacking_machine input_dir = EAST output_dir = WEST - var/obj/machinery/mineral/stacking_unit_console/CONSOLE + var/obj/machinery/mineral/stacking_unit_console/console var/stk_types = list() var/stk_amt = list() var/stack_list[0] //Key: Type. Value: Instance of type. @@ -88,23 +94,38 @@ materials = AddComponent(/datum/component/remote_materials, "stacking", mapload, FALSE, mapload && force_connect) /obj/machinery/mineral/stacking_machine/Destroy() - CONSOLE = null + if(console) + console.machine = null + console = null materials = null return ..() /obj/machinery/mineral/stacking_machine/HasProximity(atom/movable/AM) + if(QDELETED(AM)) + return if(istype(AM, /obj/item/stack/sheet) && AM.loc == get_step(src, input_dir)) - process_sheet(AM) + var/obj/effect/portal/P = locate() in AM.loc + if(P) + visible_message("[src] attempts to stack the portal!") + message_admins("Stacking machine exploded via [P.creator ? key_name(P.creator) : "UNKNOWN"]'s portal at [AREACOORD(src)]") + log_game("Stacking machine exploded via [P.creator ? key_name(P.creator) : "UNKNOWN"]'s portal at [AREACOORD(src)]") + explosion(src.loc, 0, 1, 2, 3) + if(!QDELETED(src)) + qdel(src) + else + process_sheet(AM) /obj/machinery/mineral/stacking_machine/multitool_act(mob/living/user, obj/item/multitool/M) if(istype(M)) if(istype(M.buffer, /obj/machinery/mineral/stacking_unit_console)) - CONSOLE = M.buffer - CONSOLE.machine = src + console = M.buffer + console.machine = src to_chat(user, "You link [src] to the console in [M]'s buffer.") return TRUE /obj/machinery/mineral/stacking_machine/proc/process_sheet(obj/item/stack/sheet/inp) + if(QDELETED(inp)) + return var/key = inp.merge_type var/obj/item/stack/sheet/storage = stack_list[key] if(!storage) //It's the first of this sheet added diff --git a/code/modules/mining/machine_unloading.dm b/code/modules/mining/machine_unloading.dm index cea90bfce029c..b8f3ed70fa647 100644 --- a/code/modules/mining/machine_unloading.dm +++ b/code/modules/mining/machine_unloading.dm @@ -8,24 +8,17 @@ density = TRUE input_dir = WEST output_dir = EAST - speed_process = TRUE + needs_item_input = TRUE + processing_flags = START_PROCESSING_MANUALLY -/obj/machinery/mineral/unloading_machine/process() - var/turf/T = get_step(src,input_dir) - if(T) - var/limit - for(var/obj/structure/ore_box/B in T) - for (var/obj/item/stack/ore/O in B) - B.contents -= O - unload_mineral(O) - limit++ - if (limit>=10) - return - CHECK_TICK - CHECK_TICK - for(var/obj/item/I in T) - unload_mineral(I) - limit++ - if (limit>=10) - return - CHECK_TICK \ No newline at end of file +/obj/machinery/mineral/unloading_machine/pickup_item(datum/source, atom/movable/target, atom/oldLoc) + if(QDELETED(target)) + return + if(istype(target, /obj/structure/ore_box)) + var/obj/structure/ore_box/box = target + for(var/obj/item/stack/ore/O in box) + unload_mineral(O) + box.ui_update() + else if(istype(target, /obj/item/stack/ore)) + var/obj/item/stack/ore/O = target + unload_mineral(O) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 070cfdf14124c..4d9fe0863b8f7 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -1,117 +1,53 @@ /**********************Mining Equipment Vendor**************************/ -/obj/machinery/mineral/equipment_vendor - name = "mining equipment vendor" - desc = "An equipment vendor for miners, points collected at an ore redemption machine can be spent here." - icon = 'icons/obj/machines/mining_machines.dmi' - icon_state = "mining" +/obj/machinery/vendor + name = "equipment vendor" + processing_flags = START_PROCESSING_MANUALLY + subsystem_type = /datum/controller/subsystem/processing/fastprocess density = TRUE - circuit = /obj/item/circuitboard/machine/mining_equipment_vendor - - var/icon_deny = "mining-deny" + var/icon_deny var/obj/item/card/id/inserted_id - var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces. - new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10), - new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100), - new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300), - new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100), - new /datum/data/mining_equipment("Absinthe", /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium, 100), - new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150), - new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200), - new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300), - new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300), - new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400), - new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400), - new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400), - new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500), - new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500), - new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500), - new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 500), - new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600), - new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600), - new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750), - new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/kinetic_crusher, 750), - new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750), - new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 800), - new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800), - new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1000), - new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000), - new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000), - new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffelbag/mining_conscript, 1000), - new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/tank/jetpack/suit, 2000), - new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000), - new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000), - new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 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("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("Mining Encampment Capsule", /obj/item/survivalcapsule/encampment, 5000), - new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800), - new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400), - new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400), - new /datum/data/mining_equipment("Minebot Cooldown Upgrade", /obj/item/borg/upgrade/modkit/cooldown/minebot, 600), - new /datum/data/mining_equipment("Minebot AI Upgrade", /obj/item/slimepotion/slime/sentience/mining, 1000), - new /datum/data/mining_equipment("KA Minebot Passthrough", /obj/item/borg/upgrade/modkit/minebot_passthrough, 100), - new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100), - new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150), - new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250), - new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300), - new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000), - new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), - new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000), - new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000) - ) - -/datum/data/mining_equipment - var/equipment_name = "generic" - var/equipment_path = null - var/cost = 0 - -/datum/data/mining_equipment/New(name, path, cost) - src.equipment_name = name - src.equipment_path = path - src.cost = cost + var/list/prize_list = list() -/obj/machinery/mineral/equipment_vendor/Initialize() +/obj/machinery/vendor/Initialize() . = ..() build_inventory() -/obj/machinery/mineral/equipment_vendor/proc/build_inventory() +/obj/machinery/vendor/proc/build_inventory() for(var/p in prize_list) - var/datum/data/mining_equipment/M = p + var/datum/data/vendor_equipment/M = p GLOB.vending_products[M.equipment_path] = 1 -/obj/machinery/mineral/equipment_vendor/power_change() +/obj/machinery/vendor/power_change() ..() update_icon() -/obj/machinery/mineral/equipment_vendor/update_icon() +/obj/machinery/vendor/update_icon() if(powered()) icon_state = initial(icon_state) else icon_state = "[initial(icon_state)]-off" -/obj/machinery/mineral/equipment_vendor/ui_assets(mob/user) +/obj/machinery/vendor/ui_assets(mob/user) return list( get_asset_datum(/datum/asset/spritesheet/vending), ) -/obj/machinery/mineral/equipment_vendor/ui_state(mob/user) +/obj/machinery/vendor/ui_state(mob/user) return GLOB.default_state -/obj/machinery/mineral/equipment_vendor/ui_interact(mob/user, datum/tgui/ui) +/obj/machinery/vendor/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "MiningVendor") ui.open() -/obj/machinery/mineral/equipment_vendor/ui_static_data(mob/user) +/obj/machinery/vendor/ui_static_data(mob/user) . = list() .["product_records"] = list() - for(var/datum/data/mining_equipment/prize in prize_list) + for(var/datum/data/vendor_equipment/prize in prize_list) var/list/product_data = list( path = replacetext(replacetext("[prize.equipment_path]", "/obj/item/", ""), "/", "-"), name = prize.equipment_name, @@ -120,16 +56,17 @@ ) .["product_records"] += list(product_data) -/obj/machinery/mineral/equipment_vendor/ui_data(mob/user) +/obj/machinery/vendor/ui_data(mob/user) . = list() var/mob/living/carbon/human/H var/obj/item/card/id/C + .["user"] = null if(ishuman(user)) H = user C = H.get_idcard(TRUE) if(C) .["user"] = list() - .["user"]["points"] = C.mining_points + .["user"]["points"] = get_points(C) if(C.registered_account) .["user"]["name"] = C.registered_account.account_holder if(C.registered_account.account_job) @@ -137,7 +74,7 @@ else .["user"]["job"] = "No Job" -/obj/machinery/mineral/equipment_vendor/ui_act(action, params) +/obj/machinery/vendor/ui_act(action, params) if(..()) return @@ -149,32 +86,123 @@ to_chat(usr, "Error: An ID is required!") flick(icon_deny, src) return - var/datum/data/mining_equipment/prize = locate(params["ref"]) in prize_list + var/datum/data/vendor_equipment/prize = locate(params["ref"]) in prize_list if(!prize || !(prize in prize_list)) to_chat(usr, "Error: Invalid choice!") flick(icon_deny, src) return - if(prize.cost > I.mining_points) + if(prize.cost > get_points(I)) to_chat(usr, "Error: Insufficient points for [prize.equipment_name] on [I]!") flick(icon_deny, src) return - I.mining_points -= prize.cost + subtract_points(I, prize.cost) to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!") new prize.equipment_path(loc) SSblackbox.record_feedback("nested tally", "mining_equipment_bought", 1, list("[type]", "[prize.equipment_path]")) . = TRUE -/obj/machinery/mineral/equipment_vendor/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/mining_voucher)) - RedeemVoucher(I, user) - return +/obj/machinery/vendor/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "mining-open", "mining", I)) return if(default_deconstruction_crowbar(I)) return return ..() -/obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/mining_voucher/voucher, mob/redeemer) +/obj/machinery/vendor/ex_act(severity, target) + do_sparks(5, TRUE, src) + if(prob(50 / severity) && severity < 3) + qdel(src) + +/obj/machinery/vendor/proc/subtract_points(obj/item/card/id/I, amount) + I.mining_points -= amount + +/obj/machinery/vendor/proc/get_points(obj/item/card/id/I) + return I.mining_points + +/obj/machinery/vendor/mining + name = "mining equipment vendor" + desc = "An equipment vendor for miners, points collected at an ore redemption machine can be spent here." + icon = 'icons/obj/machines/mining_machines.dmi' + icon_state = "mining" + density = TRUE + circuit = /obj/item/circuitboard/machine/mining_equipment_vendor + + icon_deny = "mining-deny" + prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces. + new /datum/data/vendor_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 5), + new /datum/data/vendor_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 75), + new /datum/data/vendor_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 150), + new /datum/data/vendor_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400), + new /datum/data/vendor_equipment("Regen. Core Stabilizer", /obj/item/hivelordstabilizer, 400), + new /datum/data/vendor_equipment("Skeleton Key", /obj/item/skeleton_key, 750), + new /datum/data/vendor_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 500), + new /datum/data/vendor_equipment("Brute Healing Kit", /obj/item/storage/firstaid/brute, 600), + new /datum/data/vendor_equipment("Burn Healing Kit", /obj/item/storage/firstaid/fire, 600), + new /datum/data/vendor_equipment("Advanced Healing Kit", /obj/item/storage/firstaid/advanced, 1200), + new /datum/data/vendor_equipment("Fulton Beacon", /obj/item/fulton_core, 500), + new /datum/data/vendor_equipment("Fulton Extraction Pack", /obj/item/extraction_pack, 1000), + new /datum/data/vendor_equipment("Jaunter", /obj/item/wormhole_jaunter, 750), + new /datum/data/vendor_equipment("Advanced Ore Scanner", /obj/item/t_scanner/adv_mining_scanner, 800), + new /datum/data/vendor_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500), + new /datum/data/vendor_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2000), + new /datum/data/vendor_equipment("Proto-Kinetic Crusher", /obj/item/kinetic_crusher, 800), + new /datum/data/vendor_equipment("Proto-Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 500), + new /datum/data/vendor_equipment("Resonator", /obj/item/resonator, 750), + new /datum/data/vendor_equipment("Upgraded Resonator", /obj/item/resonator/upgraded, 1500), + new /datum/data/vendor_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 500), + new /datum/data/vendor_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 1000), + new /datum/data/vendor_equipment("Mining Bot Companion", /mob/living/simple_animal/hostile/mining_drone, 800), + new /datum/data/vendor_equipment("Minebot Upgrade: Melee", /obj/item/mine_bot_upgrade, 400), + new /datum/data/vendor_equipment("Minebot Upgrade: Armor", /obj/item/mine_bot_upgrade/health, 400), + new /datum/data/vendor_equipment("Minebot Upgrade: Cooldown", /obj/item/borg/upgrade/modkit/cooldown/minebot, 600), + new /datum/data/vendor_equipment("Minebot Upgrade: A.I.", /obj/item/slimepotion/slime/sentience/mining, 1000), + new /datum/data/vendor_equipment("P-KA Upgrade: Bot-Friendly", /obj/item/borg/upgrade/modkit/minebot_passthrough, 100), + new /datum/data/vendor_equipment("P-KA Upgrade: Tracer Shots", /obj/item/borg/upgrade/modkit/tracer, 200), + new /datum/data/vendor_equipment("P-KA Upgrade: Adj. T. Shots", /obj/item/borg/upgrade/modkit/tracer/adjustable, 300), + new /datum/data/vendor_equipment("P-KA Upgrade: Range", /obj/item/borg/upgrade/modkit/range, 1000), + new /datum/data/vendor_equipment("P-KA Upgrade: Damage", /obj/item/borg/upgrade/modkit/damage, 1000), + new /datum/data/vendor_equipment("P-KA Upgrade: Cooldown", /obj/item/borg/upgrade/modkit/cooldown, 1000), + new /datum/data/vendor_equipment("P-KA Upgrade: Damage Radius", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000), + new /datum/data/vendor_equipment("P-KA Cosmetic Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 200), + new /datum/data/vendor_equipment("P-KA Cosmetic Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 200), + new /datum/data/vendor_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000), + new /datum/data/vendor_equipment("Expanded E. Oxygen Tank", /obj/item/tank/internals/emergency_oxygen/engi, 1000), + new /datum/data/vendor_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffelbag/mining_conscript, 1000), + new /datum/data/vendor_equipment("Survival Knife", /obj/item/kitchen/knife/combat/survival, 1000), + new /datum/data/vendor_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 1000), + new /datum/data/vendor_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500), + new /datum/data/vendor_equipment("GAR Mesons", /obj/item/clothing/glasses/meson/gar, 500), + new /datum/data/vendor_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000), + new /datum/data/vendor_equipment("Mining Outpost Capsule", /obj/item/survivalcapsule/encampment, 5000), + new /datum/data/vendor_equipment("Luxury Bar Capsule", /obj/item/survivalcapsule/luxuryelite, 10000), + new /datum/data/vendor_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000), + new /datum/data/vendor_equipment("1000 Space Cash", /obj/item/stack/spacecash/c1000, 2000), + new /datum/data/vendor_equipment("Pizza", /obj/item/pizzabox/margherita, 200), + new /datum/data/vendor_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100), + new /datum/data/vendor_equipment("Absinthe", /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium, 100), + new /datum/data/vendor_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150), + new /datum/data/vendor_equipment("Soap", /obj/item/soap/nanotrasen, 200), + new /datum/data/vendor_equipment("Laser Pointer", /obj/item/laser_pointer, 300), + new /datum/data/vendor_equipment("Toy Alien", /obj/item/clothing/mask/facehugger/toy, 300), + ) + +/datum/data/vendor_equipment + var/equipment_name = "generic" + var/equipment_path = null + var/cost = 0 + +/datum/data/vendor_equipment/New(name, path, cost) + src.equipment_name = name + src.equipment_path = path + src.cost = cost + +/obj/machinery/vendor/mining/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/mining_voucher)) + RedeemVoucher(I, user) + return + return ..() + +/obj/machinery/vendor/mining/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/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in sortList(items) @@ -198,36 +226,31 @@ new /obj/item/stack/marker_beacon/thirty(drop_location) if("Crusher Kit") new /obj/item/extinguisher/mini(drop_location) - new /obj/item/twohanded/kinetic_crusher(drop_location) + new /obj/item/kinetic_crusher(drop_location) if("Mining Conscription Kit") new /obj/item/storage/backpack/duffelbag/mining_conscript(drop_location) SSblackbox.record_feedback("tally", "mining_voucher_redeemed", 1, selection) qdel(voucher) -/obj/machinery/mineral/equipment_vendor/ex_act(severity, target) - do_sparks(5, TRUE, src) - if(prob(50 / severity) && severity < 3) - qdel(src) - /****************Golem Point Vendor**************************/ -/obj/machinery/mineral/equipment_vendor/golem +/obj/machinery/vendor/mining/golem name = "golem ship equipment vendor" circuit = /obj/item/circuitboard/machine/mining_equipment_vendor/golem -/obj/machinery/mineral/equipment_vendor/golem/Initialize() +/obj/machinery/vendor/mining/golem/Initialize() . = ..() desc += "\nIt seems a few selections have been added." 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("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), - new /datum/data/mining_equipment("Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1700), - new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000) + new /datum/data/vendor_equipment("Extra Id", /obj/item/card/id/mining, 250), + new /datum/data/vendor_equipment("Science Goggles", /obj/item/clothing/glasses/science, 250), + new /datum/data/vendor_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/monkeycube, 300), + new /datum/data/vendor_equipment("Toolbelt", /obj/item/storage/belt/utility, 350), + new /datum/data/vendor_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500), + new /datum/data/vendor_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000), + new /datum/data/vendor_equipment("P-KA Upgrade: Trigger Mod", /obj/item/borg/upgrade/modkit/trigger_guard, 1000), + new /datum/data/vendor_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000) ) /**********************Mining Equipment Vendor Items**************************/ @@ -261,27 +284,14 @@ ..() /obj/item/card/mining_point_card/examine(mob/user) - ..() - to_chat(user, "There's [points] point\s on the card.") + . = ..() + . += "There's [points] point\s on the card." ///Conscript kit -/obj/item/card/mining_access_card +/obj/item/card/id/pass/mining_access_card name = "mining access card" desc = "A small card, that when used on any ID, will add mining access." - icon_state = "data_1" - -/obj/item/card/mining_access_card/afterattack(atom/movable/AM, mob/user, proximity) - . = ..() - if(istype(AM, /obj/item/card/id) && proximity) - var/obj/item/card/id/I = AM - I.access |= ACCESS_MINING - I.access |= ACCESS_MINING_STATION - I.access |= ACCESS_MECH_MINING - I.access |= ACCESS_MINERAL_STOREROOM - I.access |= ACCESS_CARGO - to_chat(user, "You upgrade [I] with mining access.") - log_id("[key_name(user)] added mining access to '[I]' using [src] at [AREACOORD(user)].") - qdel(src) + access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MECH_MINING, ACCESS_MINERAL_STOREROOM, ACCESS_CARGO) /obj/item/storage/backpack/duffelbag/mining_conscript name = "mining conscription kit" @@ -295,4 +305,4 @@ new /obj/item/clothing/suit/hooded/explorer(src) new /obj/item/encryptionkey/headset_cargo(src) new /obj/item/clothing/mask/gas/explorer(src) - new /obj/item/card/mining_access_card(src) + new /obj/item/card/id/pass/mining_access_card(src) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index fa1e641a8190b..3dc17909227d4 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -71,17 +71,17 @@ /**********************Shuttle Computer**************************/ -/obj/machinery/computer/shuttle/mining +/obj/machinery/computer/shuttle_flight/mining name = "mining shuttle console" desc = "Used to call and send the mining shuttle." circuit = /obj/item/circuitboard/computer/mining_shuttle shuttleId = "mining" possible_destinations = "mining_home;mining_away;landing_zone_dock;mining_public" - no_destination_swap = 1 + req_access = list(ACCESS_MINING) var/static/list/dumb_rev_heads = list() //ATTACK HAND IGNORING PARENT RETURN VALUE -/obj/machinery/computer/shuttle/mining/attack_hand(mob/user) +/obj/machinery/computer/shuttle_flight/mining/attack_hand(mob/user) if(is_station_level(user.z) && user.mind && is_head_revolutionary(user) && !(user.mind in dumb_rev_heads)) to_chat(user, "You get a feeling that leaving the station might be a REALLY dumb idea...") dumb_rev_heads += user.mind @@ -89,13 +89,12 @@ . = ..() //It is on lavaland, soooo.... -/obj/machinery/computer/shuttle/science +/obj/machinery/computer/shuttle_flight/science name = "science outpost shuttle console" desc = "Used to call and send the science shuttle." circuit = /obj/item/circuitboard/computer/science_shuttle shuttleId = "science" possible_destinations = "science_station;science_outpost" - no_destination_swap = 1 /**********************Mining car (Crate like thing, not the rail car)**************************/ @@ -103,3 +102,4 @@ desc = "A mining car. This one doesn't work on rails, but has to be dragged." name = "Mining car (not for rails)" icon_state = "miningcar" + door_anim_time = 0 diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index d752467f2aa72..e70887698008f 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -3,7 +3,7 @@ #define MINEDRONE_ATTACK 2 /mob/living/simple_animal/hostile/mining_drone - name = "nanotrasen minebot" + name = "\improper Nanotrasen minebot" desc = "The instructions printed on the side read: This is a small robot used to support miners, can be set to search and collect loose ore, or to help fend off wildlife." gender = NEUTER icon = 'icons/mob/aibots.dmi' diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index 4d44e66c503dd..5dc2bbd05a450 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -7,6 +7,7 @@ icon_state = "coinpress0" density = TRUE input_dir = EAST + needs_item_input = TRUE var/obj/item/storage/bag/money/bag_to_use @@ -31,16 +32,21 @@ chosen = getmaterialref(chosen) -/obj/machinery/mineral/mint/process() - var/turf/T = get_step(src, input_dir) +/obj/machinery/mineral/mint/pickup_item(datum/source, atom/movable/target, atom/oldLoc) + if(QDELETED(target)) + return + if(!istype(target, /obj/item/stack)) + return + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) + var/obj/item/stack/S = target - for(var/obj/item/stack/O in T) - var/inserted = materials.insert_item(O) - if(inserted) - qdel(O) + if(materials.insert_item(S)) + qdel(S) +/obj/machinery/mineral/mint/process() if(processing) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/datum/material/M = chosen if(!M) @@ -68,6 +74,7 @@ if(!found_new) processing = FALSE else + end_processing() icon_state = "coinpress0" @@ -79,6 +86,7 @@ if(!ui) ui = new(user, src, "Mint") ui.open() + ui.set_autoupdate(TRUE) // Coins pressed (could be refactored to ui_update), material amounts /obj/machinery/mineral/mint/ui_data() var/list/data = list() @@ -114,13 +122,18 @@ if (!processing) produced_coins = 0 processing = TRUE + begin_processing() + . = TRUE if ("stoppress") processing = FALSE + end_processing() + . = TRUE if ("changematerial") var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) for(var/datum/material/mat in materials.materials) if (params["material_name"] == mat.name) chosen = mat + . = TRUE /obj/machinery/mineral/mint/proc/create_coins() var/turf/T = get_step(src,output_dir) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 7c07bc065d942..f5e800dc07f7d 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -18,6 +18,8 @@ var/refined_type = null //What this ore defaults to being refined into novariants = TRUE // Ore stacks handle their icon updates themselves to keep the illusion that there's more going var/list/stack_overlays + var/scan_state = "" //Used by mineral turfs for their scan overlay. + var/spreadChance = 0 //Also used by mineral turfs for spreading veins /obj/item/stack/ore/update_icon() var/difference = min(ORESTACK_OVERLAYS_MAX, amount) - (LAZYLEN(stack_overlays)+1) @@ -71,6 +73,8 @@ points = 30 materials = list(/datum/material/uranium=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/uranium + scan_state = "rock_Uranium" + spreadChance = 5 /obj/item/stack/ore/iron name = "iron ore" @@ -80,6 +84,8 @@ points = 1 materials = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/iron + scan_state = "rock_Iron" + spreadChance = 20 /obj/item/stack/ore/glass name = "sand pile" @@ -132,6 +138,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ points = 15 materials = list(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/plasma + scan_state = "rock_Plasma" + spreadChance = 8 /obj/item/stack/ore/plasma/welder_act(mob/living/user, obj/item/I) to_chat(user, "You can't hit a high enough temperature to smelt [src] properly!") @@ -145,6 +153,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ points = 5 materials = list(/datum/material/copper=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/copper + scan_state = "rock_Copper" + spreadChance = 5 /obj/item/stack/ore/silver name = "silver ore" @@ -154,6 +164,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ points = 16 materials = list(/datum/material/silver=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/silver + scan_state = "rock_Silver" + spreadChance = 5 /obj/item/stack/ore/gold name = "gold ore" @@ -163,6 +175,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ points = 18 materials = list(/datum/material/gold=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/gold + scan_state = "rock_Gold" + spreadChance = 5 /obj/item/stack/ore/diamond name = "diamond ore" @@ -172,6 +186,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ points = 50 materials = list(/datum/material/diamond=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/diamond + scan_state = "rock_Diamond" /obj/item/stack/ore/bananium name = "bananium ore" @@ -181,6 +196,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ points = 60 materials = list(/datum/material/bananium=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/bananium + scan_state = "rock_Bananium" /obj/item/stack/ore/titanium name = "titanium ore" @@ -190,6 +206,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ points = 50 materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/titanium + scan_state = "rock_Titanium" + spreadChance = 5 /obj/item/stack/ore/slag name = "slag" @@ -198,7 +216,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ item_state = "slag" singular_name = "slag chunk" -/obj/item/twohanded/required/gibtonite +/obj/item/gibtonite name = "gibtonite ore" desc = "Extremely explosive if struck with mining equipment, Gibtonite is often used by miners to speed up their work by using it as a mining charge. This material is illegal to possess by unauthorized personnel under space law." icon = 'icons/obj/mining.dmi' @@ -212,12 +230,16 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ var/attacher = "UNKNOWN" var/det_timer -/obj/item/twohanded/required/gibtonite/Destroy() +/obj/item/gibtonite/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, require_twohands=TRUE) + +/obj/item/gibtonite/Destroy() qdel(wires) wires = null return ..() -/obj/item/twohanded/required/gibtonite/attackby(obj/item/I, mob/user, params) +/obj/item/gibtonite/attackby(obj/item/I, mob/user, params) if(!wires && istype(I, /obj/item/assembly/igniter)) user.visible_message("[user] attaches [I] to [src].", "You attach [I] to [src].") wires = new /datum/wires/explosive/gibtonite(src) @@ -245,20 +267,20 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ return ..() -/obj/item/twohanded/required/gibtonite/attack_self(user) +/obj/item/gibtonite/attack_self(user) if(wires) wires.interact(user) else ..() -/obj/item/twohanded/required/gibtonite/bullet_act(obj/item/projectile/P) +/obj/item/gibtonite/bullet_act(obj/item/projectile/P) GibtoniteReaction(P.firer) . = ..() -/obj/item/twohanded/required/gibtonite/ex_act() +/obj/item/gibtonite/ex_act() GibtoniteReaction(null, 1) -/obj/item/twohanded/required/gibtonite/proc/GibtoniteReaction(mob/user, triggered_by = 0) +/obj/item/gibtonite/proc/GibtoniteReaction(mob/user, triggered_by = 0) if(!primed) primed = TRUE playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,1) @@ -281,7 +303,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ log_bomber(user, "has primed a", src, "for detonation", notify_admins) det_timer = addtimer(CALLBACK(src, .proc/detonate, notify_admins), det_time, TIMER_STOPPABLE) -/obj/item/twohanded/required/gibtonite/proc/detonate(notify_admins) +/obj/item/gibtonite/proc/detonate(notify_admins) if(primed) switch(quality) if(GIBTONITE_QUALITY_HIGH) diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index f48df08b00805..8f837880ef7d5 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -8,16 +8,21 @@ desc = "A heavy wooden box, which can be filled with a lot of ores." density = TRUE pressure_resistance = 5*ONE_ATMOSPHERE + var/static/list/typecache_to_take - - +/obj/structure/ore_box/Initialize() + . = ..() + if(!typecache_to_take) + typecache_to_take = typecacheof(/obj/item/stack/ore) /obj/structure/ore_box/attackby(obj/item/W, mob/user, params) if (istype(W, /obj/item/stack/ore)) user.transferItemToLoc(W, src) + ui_update() else if(SEND_SIGNAL(W, COMSIG_CONTAINS_STORAGE)) - SEND_SIGNAL(W, COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/stack/ore, src) + SEND_SIGNAL(W, COMSIG_TRY_STORAGE_TAKE_TYPE, typecache_to_take, src) to_chat(user, "You empty the ore in [W] into \the [src].") + ui_update() else return ..() @@ -84,14 +89,12 @@ /obj/structure/ore_box/ui_act(action, params) if(..()) return - if(!Adjacent(usr)) - return - add_fingerprint(usr) - usr.set_machine(src) + switch(action) if("removeall") dump_box_contents() to_chat(usr, "You open the release hatch on the box..") + . = TRUE /obj/structure/ore_box/deconstruct(disassembled = TRUE, mob/user) var/obj/item/stack/sheet/mineral/wood/WD = new (loc, 4) diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 6dcdd076357c2..7f5b31ac3987e 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -12,13 +12,14 @@ INITIALIZE_IMMEDIATE(/mob/dead) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 tag = "mob_[next_mob_id++]" - GLOB.mob_list += src + add_to_mob_list() prepare_huds() - if(length(CONFIG_GET(keyed_list/cross_server))) - verbs += /mob/dead/proc/server_hop + if(length(CONFIG_GET(keyed_list/server_hop))) + add_verb(/mob/dead/proc/server_hop) set_focus(src) + become_hearing_sensitive() return INITIALIZE_HINT_NORMAL /mob/dead/canUseStorage() @@ -39,27 +40,26 @@ INITIALIZE_IMMEDIATE(/mob/dead) loc = destination Moved(oldloc, NONE, TRUE) -/mob/dead/Stat() - ..() +/mob/dead/get_stat_tab_status() + var/list/tab_data = ..() - if(!statpanel("Status")) - return - stat(null, "Game Mode: [SSticker.hide_mode ? "Secret" : "[GLOB.master_mode]"]") + tab_data["Game Mode"] = GENERATE_STAT_TEXT("[SSticker.hide_mode ? "Secret" : "[GLOB.master_mode]"]") if(SSticker.HasRoundStarted()) - return + return tab_data var/time_remaining = SSticker.GetTimeLeft() if(time_remaining > 0) - stat(null, "Time To Start: [round(time_remaining/10)]s") + tab_data["Time To Start"] = GENERATE_STAT_TEXT("[round(time_remaining/10)]s") else if(time_remaining == -10) - stat(null, "Time To Start: DELAYED") + tab_data["Time To Start"] = GENERATE_STAT_TEXT("DELAYED") else - stat(null, "Time To Start: SOON") + tab_data["Time To Start"] = GENERATE_STAT_TEXT("SOON") - stat(null, "Players: [SSticker.totalPlayers]") + tab_data["Players"] = GENERATE_STAT_TEXT("[SSticker.totalPlayers]") if(client.holder) - stat(null, "Players Ready: [SSticker.totalPlayersReady]") + tab_data["Players Ready"] = GENERATE_STAT_TEXT("[SSticker.totalPlayersReady]") + return tab_data /mob/dead/proc/server_hop() set category = "OOC" @@ -67,11 +67,11 @@ INITIALIZE_IMMEDIATE(/mob/dead) set desc= "Jump to the other server" if(notransform) return - var/list/csa = CONFIG_GET(keyed_list/cross_server) + var/list/csa = CONFIG_GET(keyed_list/server_hop) var/pick switch(csa.len) if(0) - verbs -= /mob/dead/proc/server_hop + remove_verb(/mob/dead/proc/server_hop) to_chat(src, "Server Hop has been disabled.") if(1) pick = csa[1] @@ -88,7 +88,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) var/client/C = client to_chat(C, "Sending you to [pick].") - new /obj/screen/splash(C) + new /atom/movable/screen/splash(C) notransform = TRUE sleep(29) //let the animation play diff --git a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm index 887556500cba7..97e97bb31e0e6 100644 --- a/code/modules/mob/dead/new_player/login.dm +++ b/code/modules/mob/dead/new_player/login.dm @@ -4,21 +4,21 @@ client.set_db_player_flags() if(!mind) mind = new /datum/mind(key) - mind.active = 1 - mind.current = src + mind.active = TRUE + mind.set_current(src) ..() var/motd = global.config.motd if(motd) - to_chat(src, "
[motd]
", handle_whitespace=FALSE) + to_chat(src, "
[motd]
", handle_whitespace=FALSE, allow_linkify = TRUE) if(GLOB.admin_notice) to_chat(src, "Admin Notice:\n \t [GLOB.admin_notice]") var/spc = CONFIG_GET(number/soft_popcap) if(spc && living_player_count() >= spc) - to_chat(src, "Server Notice:\n \t [CONFIG_GET(string/soft_popcap_message)]") + to_chat(src, "Server Notice:\n \t [CONFIG_GET(string/soft_popcap_message)]", allow_linkify = TRUE) sight |= SEE_TURFS diff --git a/code/modules/mob/dead/new_player/logout.dm b/code/modules/mob/dead/new_player/logout.dm index a70800d35b535..b2f37376a3c62 100644 --- a/code/modules/mob/dead/new_player/logout.dm +++ b/code/modules/mob/dead/new_player/logout.dm @@ -3,5 +3,6 @@ ..() if(!spawning)//Here so that if they are spawning and log out, the other procs can play out and they will have a mob to come back to. key = null//We null their key before deleting the mob, so they are properly kicked out. + QDEL_NULL(mind) //Clean out mind, yes this fucking sucks qdel(src) return \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 6491c692ebdd9..e47c097febdde 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -15,7 +15,7 @@ /mob/dead/new_player/Initialize() if(client && SSticker.state == GAME_STATE_STARTUP) - var/obj/screen/splash/S = new(client, TRUE, TRUE) + var/atom/movable/screen/splash/S = new(client, TRUE, TRUE) S.Fade(TRUE) if(length(GLOB.newplayer_start)) @@ -140,8 +140,8 @@ LateChoices() return - if(SSticker.queued_players.len || (relevant_cap && living_player_count() >= relevant_cap && !(ckey(key) in GLOB.admin_datums))) - if(IS_PATRON(src.ckey)) + if(SSticker.queued_players.len || (relevant_cap && living_player_count() >= relevant_cap)) + if(IS_PATRON(src.ckey) || (client in GLOB.admins)) LateChoices() return to_chat(usr, "[CONFIG_GET(string/hard_popcap_message)]") @@ -169,7 +169,7 @@ to_chat(usr, "There is an administrative lock on entering the game!") return - if(SSticker.queued_players.len && !(ckey(key) in GLOB.admin_datums)) + if(SSticker.queued_players.len && !(ckey(key) in GLOB.admin_datums) && !IS_PATRON(ckey(key))) if((living_player_count() >= relevant_cap) || (src != SSticker.queued_players[1])) to_chat(usr, "Server is full.") return @@ -193,12 +193,14 @@ vote_on_poll_handler(poll, href_list) //When you cop out of the round (NB: this HAS A SLEEP FOR PLAYER INPUT IN IT) -/mob/dead/new_player/proc/make_me_an_observer() +/mob/dead/new_player/proc/make_me_an_observer(force_observe=FALSE) if(QDELETED(src) || !src.client) ready = PLAYER_NOT_READY return FALSE - var/this_is_like_playing_right = alert(src,"Are you sure you wish to observe? You will not be able to play this round!","Player Setup","Yes","No") + var/this_is_like_playing_right = "Yes" + if(!force_observe) + this_is_like_playing_right = alert(src,"Are you sure you wish to observe? You will not be able to play this round!","Player Setup","Yes","No") if(QDELETED(src) || !src.client || this_is_like_playing_right != "Yes") ready = PLAYER_NOT_READY @@ -308,9 +310,9 @@ if(job && !job.override_latejoin_spawn(character)) SSjob.SendToLateJoin(character) if(!arrivals_docked) - var/obj/screen/splash/Spl = new(character.client, TRUE) + var/atom/movable/screen/splash/Spl = new(character.client, TRUE) Spl.Fade(TRUE) - character.playsound_local(get_turf(character), 'sound/voice/ApproachingTG.ogg', 25) + character.playsound_local(get_turf(character), 'sound/voice/welcomeBee.ogg', 50) character.update_parallax_teleport() @@ -382,7 +384,7 @@ SSjob.prioritized_jobs -= prioritized_job dat += " - - {label ? label + ':' : null} - - - {content} - {children} - - {buttons && ( - - )} - - ); -}; - -LabeledListItem.defaultHooks = pureComponentHooks; - -export const LabeledListDivider = props => { - const padding = props.size - ? unit(Math.max(0, props.size - 1)) - : 0; - return ( - - - - ); -}; - -LabeledListDivider.defaultHooks = pureComponentHooks; - -LabeledList.Item = LabeledListItem; -LabeledList.Divider = LabeledListDivider; diff --git a/tgui/packages/tgui/components/LabeledList.tsx b/tgui/packages/tgui/components/LabeledList.tsx new file mode 100644 index 0000000000000..029724dd13ac7 --- /dev/null +++ b/tgui/packages/tgui/components/LabeledList.tsx @@ -0,0 +1,113 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { BooleanLike, classes, pureComponentHooks } from 'common/react'; +import { InfernoNode } from 'inferno'; +import { Box, unit } from './Box'; +import { Divider } from './Divider'; + +type LabeledListProps = { + children?: any; +}; + +export const LabeledList = (props: LabeledListProps) => { + const { children } = props; + return ( +
" var/column_counter = 0 - for(var/list/category in list(GLOB.command_positions) + list(GLOB.engineering_positions) + list(GLOB.supply_positions) + list(GLOB.nonhuman_positions - "pAI") + list(GLOB.civilian_positions) + list(GLOB.medical_positions) + list(GLOB.science_positions) + list(GLOB.security_positions)) + for(var/list/category in list(GLOB.command_positions) + list(GLOB.engineering_positions) + list(GLOB.supply_positions) + list(GLOB.nonhuman_positions - "pAI") + list(GLOB.civilian_positions) + list(GLOB.gimmick_positions) + list(GLOB.medical_positions) + list(GLOB.science_positions) + list(GLOB.security_positions)) var/cat_color = SSjob.name_occupations[category[1]].selection_color //use the color of the first job in the category (the department head) as the category color dat += "
" dat += "[SSjob.name_occupations[category[1]].exp_type_department]" diff --git a/code/modules/mob/dead/new_player/poll.dm b/code/modules/mob/dead/new_player/poll.dm index 60ee8ead5dc77..0abe26c63a318 100644 --- a/code/modules/mob/dead/new_player/poll.dm +++ b/code/modules/mob/dead/new_player/poll.dm @@ -331,7 +331,7 @@ return else admin_rank = "Player" - var/player_playtime = round(client?.get_exp_living(FALSE) / 60) + var/player_playtime = round(client?.get_exp_living(TRUE) / 60) if(!isnull(player_playtime) && (player_playtime < poll.minimumplaytime)) to_chat(usr, "You do not have sufficient playtime to vote in this poll. Minimum: [poll.minimumplaytime] hour(s). Your playtime: [player_playtime] hour(s).") return diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm index 21d758875f1a6..209256543be1b 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -94,6 +94,10 @@ name = "Bald" icon_state = null +/datum/sprite_accessory/hair/bald2 + name = "Bald 2" + icon_state = "hair_bald2" + /datum/sprite_accessory/hair/balding name = "Balding Hair" icon_state = "hair_e" @@ -278,6 +282,10 @@ name = "Curls" icon_state = "hair_curls" +/datum/sprite_accessory/hair/curtains + name = "Curtains" + icon_state = "hair_curtains" + /datum/sprite_accessory/hair/cut name = "Cut Hair" icon_state = "hair_c" @@ -366,6 +374,10 @@ name = "Gelled Back" icon_state = "hair_gelled" +/datum/sprite_accessory/hair/gelledeyebrows + name = "Gelled Spikes" + icon_state = "hair_ebgel" + /datum/sprite_accessory/hair/gentle name = "Gentle" icon_state = "hair_gentle" @@ -490,10 +502,18 @@ name = "Mohawk (Unshaven)" icon_state = "hair_unshaven_mohawk" +/datum/sprite_accessory/hair/moustache + name = "Moustache" + icon_state = "hair_moustache" + /datum/sprite_accessory/hair/mulder name = "Mulder" icon_state = "hair_mulder" +/datum/sprite_accessory/hair/mullet + name = "Mullet" + icon_state = "hair_mullet" + /datum/sprite_accessory/hair/odango name = "Odango" icon_state = "hair_odango" @@ -518,6 +538,10 @@ name = "Parted" icon_state = "hair_parted" +/datum/sprite_accessory/hair/parted2 + name = "Parted 2" + icon_state ="hair_parted2" + /datum/sprite_accessory/hair/partedside name = "Parted (Side)" icon_state = "hair_part" @@ -546,6 +570,10 @@ name = "Pompadour (Big)" icon_state = "hair_bigpompadour" +/datum/sprite_accessory/hair/hugepompadour + name = "Pompadour (Huge)" + icon_state = "hair_hugepompadour" + /datum/sprite_accessory/hair/ponytail1 name = "Ponytail" icon_state = "hair_ponytail" @@ -574,10 +602,18 @@ name = "Ponytail 7" icon_state = "hair_ponytail7" +/datum/sprite_accessory/hair/ponytailalchemist + name = "Ponytail (Alchemist)" + icon_state = "hair_alchemist" + /datum/sprite_accessory/hair/highponytail name = "Ponytail (High)" icon_state = "hair_highponytail" +/datum/sprite_accessory/hair/tightponytail + name = "Ponytail (Tight)" + icon_state = "hair_tightponytail" + /datum/sprite_accessory/hair/stail name = "Ponytail (Short)" icon_state = "hair_stail" @@ -618,6 +654,10 @@ name = "Poofy" icon_state = "hair_poofy" +/datum/sprite_accessory/hair/pride + name = "Pride" + icon_state = "hair_pride" + /datum/sprite_accessory/hair/quiff name = "Quiff" icon_state = "hair_quiff" @@ -634,6 +674,10 @@ name = "Shaved Part" icon_state = "hair_shavedpart" +/datum/sprite_accessory/hair/shortafro + name = "Short Afro" + icon_state = "hair_shortafro" + /datum/sprite_accessory/hair/shortbangs name = "Short Bangs" icon_state = "hair_shortbangs" @@ -690,6 +734,10 @@ name = "Slightly Long Hair" icon_state = "hair_protagonist" +/datum/sprite_accessory/hair/spamton + name = "Spamton" + icon_state = "hair_spamton" + /datum/sprite_accessory/hair/spiky name = "Spiky" icon_state = "hair_spikey" @@ -800,6 +848,10 @@ // please make sure they're sorted alphabetically and categorized +/datum/sprite_accessory/facial_hair/eyebrows + name = "Eyebrows" + icon_state = "facial_eyebrows" + /datum/sprite_accessory/facial_hair/abe name = "Beard (Abraham Lincoln)" icon_state = "facial_abe" @@ -824,6 +876,7 @@ name = "Beard (Cropped Fullbeard)" icon_state = "facial_croppedfullbeard" + /datum/sprite_accessory/facial_hair/gt name = "Beard (Goatee)" icon_state = "facial_gt" @@ -864,6 +917,10 @@ name = "Beard (Long)" icon_state = "facial_longbeard" +/datum/sprite_accessory/facial_hair/powerful + name = "Beard (Powerful)" + icon_state = "facial_powerful" + /datum/sprite_accessory/facial_hair/volaju name = "Beard (Volaju)" icon_state = "facial_volaju" @@ -888,6 +945,10 @@ name = "Beard (Seven o Clock Moustache)" icon_state = "facial_7oclockmoustache" +/datum/sprite_accessory/facial_hair/thecolonel + name = "Beard (The Colonel)" + icon_state = "facial_thecolonel" + /datum/sprite_accessory/facial_hair/moustache name = "Moustache" icon_state = "facial_moustache" @@ -912,6 +973,10 @@ name = "Moustache (Hulk Hogan)" icon_state = "facial_hogan" //-Neek +/datum/sprite_accessory/facial_hair/robotnik + name = "Moustache (Robotnik)" + icon_state = "facial_robotnik" + /datum/sprite_accessory/facial_hair/selleck name = "Moustache (Selleck)" icon_state = "facial_selleck" @@ -920,6 +985,10 @@ name = "Moustache (Square)" icon_state = "facial_chaplin" +/datum/sprite_accessory/facial_hair/stachenchops + name = "Moustache ('Stache 'n Chops)" + icon_state = "facial_stachenchops" + /datum/sprite_accessory/facial_hair/vandyke name = "Moustache (Van Dyke)" icon_state = "facial_vandyke" diff --git a/code/modules/mob/dead/observer/logout.dm b/code/modules/mob/dead/observer/logout.dm index 3ca6405a0cffa..74d8976c4d879 100644 --- a/code/modules/mob/dead/observer/logout.dm +++ b/code/modules/mob/dead/observer/logout.dm @@ -2,6 +2,7 @@ update_z(null) if (client) client.images -= (GLOB.ghost_images_default+GLOB.ghost_images_simple) + client.tgui_panel?.clear_dead_popup() if(observetarget) if(ismob(observetarget)) diff --git a/code/modules/mob/dead/observer/notificationprefs.dm b/code/modules/mob/dead/observer/notificationprefs.dm index b7f8580c939d5..6370747ad46ba 100644 --- a/code/modules/mob/dead/observer/notificationprefs.dm +++ b/code/modules/mob/dead/observer/notificationprefs.dm @@ -50,4 +50,4 @@ var/key = params["key"] if (key && islist(GLOB.poll_ignore[key])) GLOB.poll_ignore[key] ^= list(user.ckey) - . = TRUE + . = TRUE diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index a2c4d2c933c8e..3a08708e17507 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -55,15 +55,14 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) // of the mob var/deadchat_name var/datum/orbit_menu/orbit_menu - var/datum/spawners_menu/spawners_menu /mob/dead/observer/Initialize() set_invisibility(GLOB.observer_default_invisibility) - verbs += list( + add_verb(list( /mob/dead/observer/proc/dead_tele, /mob/dead/observer/proc/open_spawners_menu, - /mob/dead/observer/proc/tray_view) + /mob/dead/observer/proc/tray_view)) if(icon_state in GLOB.ghost_forms_with_directions_list) ghostimage_default = image(src.icon,src,src.icon_state + "_nodir") @@ -124,12 +123,12 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) real_name = name if(!fun_verbs) - verbs -= /mob/dead/observer/verb/boo - verbs -= /mob/dead/observer/verb/possess + remove_verb(/mob/dead/observer/verb/boo) + remove_verb(/mob/dead/observer/verb/possess) animate(src, pixel_y = 2, time = 10, loop = -1) - GLOB.dead_mob_list += src + add_to_dead_mob_list() for(var/v in GLOB.active_alternate_appearances) if(!v) @@ -143,6 +142,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) show_data_huds() data_huds_on = 1 + AddComponent(/datum/component/tracking_beacon, "ghost", null, null, TRUE, "#9e4d91", TRUE, TRUE) + /mob/dead/observer/get_photo_description(obj/item/camera/camera) if(!invisibility || camera.see_ghosts) return "You can also see a g-g-g-g-ghooooost!" @@ -154,6 +155,9 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 10) /mob/dead/observer/Destroy() + if(data_huds_on) + remove_data_huds() + GLOB.ghost_images_default -= ghostimage_default QDEL_NULL(ghostimage_default) @@ -163,7 +167,11 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) updateallghostimages() QDEL_NULL(orbit_menu) - QDEL_NULL(spawners_menu) + + var/datum/component/tracking_beacon/beacon = GetComponent(/datum/component/tracking_beacon) + if(beacon) + qdel(beacon) + return ..() /mob/dead/CanPass(atom/movable/mover, turf/target) @@ -265,7 +273,7 @@ Transfer_mind is there to check if mob is being deleted/not going to have a body Works together with spawning an observer, noted above. */ -/mob/proc/ghostize(can_reenter_corpse = 1) +/mob/proc/ghostize(can_reenter_corpse = TRUE,sentience_retention = SENTIENCE_SKIP) if(key) if(key[1] != "@") // Skip aghosts. stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now @@ -291,7 +299,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you may not play again this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") if(response != "Ghost") return //didn't want to ghost after-all - ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 + ghostize(FALSE,SENTIENCE_RETAIN) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 /mob/camera/verb/ghost() set category = "OOC" @@ -301,7 +309,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you may not play again this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") if(response != "Ghost") return - ghostize(0) + ghostize(FALSE,SENTIENCE_RETAIN) /mob/dead/observer/Move(NewLoc, direct) if(updatedir) @@ -338,7 +346,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(mind.current.key && mind.current.key[1] != "@") //makes sure we don't accidentally kick any clients to_chat(usr, "Another consciousness is in your body...It is resisting you.") return - client.view_size.setDefault(getScreenSize(src))//Let's reset so people can't become allseeing gods + client.view_size.resetToDefault(getScreenSize(src))//Let's reset so people can't become allseeing gods //For real this time SStgui.on_transfer(src, mind.current) // Transfer NanoUIs. mind.current.key = key return TRUE @@ -366,7 +374,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(message) to_chat(src, "[message]") if(source) - var/obj/screen/alert/A = throw_alert("[REF(source)]_notify_cloning", /obj/screen/alert/notify_cloning) + var/atom/movable/screen/alert/A = throw_alert("[REF(source)]_notify_cloning", /atom/movable/screen/alert/notify_cloning) if(A) if(client && client.prefs && client.prefs.UI_style) A.icon = ui_style2icon(client.prefs.UI_style) @@ -392,7 +400,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/list/filtered = list() for(var/V in GLOB.sortedAreas) var/area/A = V - if(!A.hidden) + if(!(A.area_flags & HIDDEN_AREA)) filtered += A var/area/thearea = input("Area to jump to", "BOOYEA") as null|anything in filtered @@ -513,7 +521,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(bootime > world.time) return - var/obj/machinery/light/L = locate(/obj/machinery/light) in view(1, src) + var/obj/machinery/light/L = locate() in view(1, src) if(L) L.flicker() bootime = world.time + 600 @@ -781,11 +789,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ghostimage_simple.icon_state = icon_state if("fun_verbs") if(fun_verbs) - verbs += /mob/dead/observer/verb/boo - verbs += /mob/dead/observer/verb/possess + add_verb(/mob/dead/observer/verb/boo) + add_verb(/mob/dead/observer/verb/possess) else - verbs -= /mob/dead/observer/verb/boo - verbs -= /mob/dead/observer/verb/possess + remove_verb(/mob/dead/observer/verb/boo) + remove_verb(/mob/dead/observer/verb/possess) /mob/dead/observer/reset_perspective(atom/A) if(client) @@ -875,10 +883,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Spawners Menu" set desc = "See all currently available spawners" set category = "Ghost" - if(!spawners_menu) - spawners_menu = new(src) + if(!SSmobs.spawner_menu) + SSmobs.spawner_menu = new() - spawners_menu.ui_interact(src) + SSmobs.spawner_menu.ui_interact(src) /mob/dead/observer/proc/tray_view() set category = "Ghost" diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index bdf66bb210026..9d22ca3ac63d1 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -14,6 +14,7 @@ if (!ui) ui = new(user, src, "Orbit", "Orbit") ui.open() + ui.set_autoupdate(TRUE) /datum/orbit_menu/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) if (..()) diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index b301e6dedc7e3..7838dc1cce669 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -3,26 +3,19 @@ if (!message) return - var/message_mode = get_message_mode(message) - if(client && (message_mode == MODE_ADMIN || message_mode == MODE_DEADMIN)) - message = copytext_char(message, 3) - message = trim_left(message) - if(message_mode == MODE_ADMIN) - client.cmd_admin_say(message) - else if(message_mode == MODE_DEADMIN) - client.dsay(message) - return - if(OOC_FILTER_CHECK(message)) to_chat(src, "That message contained a word prohibited in OOC chat! Consider reviewing the server rules.\n\"[message]\"") return + var/list/message_mods = list() + message = get_message_mods(message, message_mods) + if(check_emote(message, forced)) return . = say_dead(message) -/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) . = ..() var/atom/movable/to_follow = speaker if(radio_freq) @@ -35,6 +28,5 @@ to_follow = V.source var/link = FOLLOW_LINK(src, to_follow) // Recompose the message, because it's scrambled by default - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) + message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods) to_chat(src, "[link] [message]") - diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 0c6c9dd972b26..c736e7d6cbdce 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -32,6 +32,9 @@ . = ..() if(.) user.SpinAnimation(7,1) + if(isliving(user) && !intentional) + var/mob/living/L = user + L.confused += 2 /datum/emote/spin key = "spin" @@ -44,7 +47,9 @@ . = ..() if(.) user.spin(20, 1) - + if(isliving(user) && !intentional) + var/mob/living/L = user + L.confused += 2 if(iscyborg(user) && user.has_buckled_mobs()) var/mob/living/silicon/robot/R = user var/datum/component/riding/riding_datum = R.GetComponent(/datum/component/riding) @@ -52,4 +57,4 @@ for(var/mob/M in R.buckled_mobs) riding_datum.force_dismount(M) else - R.unbuckle_all_mobs() + R.unbuckle_all_mobs() \ No newline at end of file diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 4b5f0ea2538f0..7ddca1b0637b8 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -182,7 +182,7 @@ held_items[hand_index] = I I.layer = ABOVE_HUD_LAYER I.plane = ABOVE_HUD_PLANE - I.equipped(src, SLOT_HANDS) + I.equipped(src, ITEM_SLOT_HANDS) if(I.pulledby) I.pulledby.stop_pulling() update_inv_hands() @@ -221,7 +221,7 @@ //If both fail it drops it on the floor and returns FALSE. //This is probably the main one you need to know :) /mob/proc/put_in_hands(obj/item/I, del_on_fail = FALSE, merge_stacks = TRUE, forced = FALSE) - if(!I) + if(QDELETED(I)) return FALSE // If the item is a stack and we're already holding a stack then merge @@ -291,8 +291,8 @@ //for when you want the item to end up on the ground //will force move the item to the ground and call the turf's Entered -/mob/proc/dropItemToGround(obj/item/I, force = FALSE) - return doUnEquip(I, force, drop_location(), FALSE) +/mob/proc/dropItemToGround(obj/item/I, force = FALSE, thrown = FALSE) + return doUnEquip(I, force, drop_location(), FALSE, was_thrown = thrown) //for when the item will be immediately placed in a loc other than the ground /mob/proc/transferItemToLoc(obj/item/I, newloc = null, force = FALSE) @@ -306,7 +306,7 @@ //DO NOT CALL THIS PROC //use one of the above 3 helper procs //you may override it, but do not modify the args -/mob/proc/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) //Force overrides TRAIT_NODROP for things like wizarditis and admin undress. +/mob/proc/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, was_thrown = FALSE) //Force overrides TRAIT_NODROP for things like wizarditis and admin undress. //Use no_move if the item is just gonna be immediately moved afterward //Invdrop is used to prevent stuff in pockets dropping. only set to false if it's going to immediately be replaced if(!I) //If there's nothing to drop, the drop is automatically succesfull. If(unEquip) should generally be used to check for TRAIT_NODROP. @@ -330,7 +330,7 @@ I.moveToNullspace() else I.forceMove(newloc) - I.dropped(src) + I.dropped(src, was_thrown) return TRUE //Outdated but still in use apparently. This should at least be a human proc. @@ -395,21 +395,21 @@ hidden_slots |= I.transparent_protection if(hidden_slots & HIDENECK) - obscured |= SLOT_NECK + obscured |= ITEM_SLOT_NECK if(hidden_slots & HIDEMASK) - obscured |= SLOT_WEAR_MASK + obscured |= ITEM_SLOT_MASK if(hidden_slots & HIDEEYES) - obscured |= SLOT_GLASSES + obscured |= ITEM_SLOT_EYES if(hidden_slots & HIDEEARS) - obscured |= SLOT_EARS + obscured |= ITEM_SLOT_EARS if(hidden_slots & HIDEGLOVES) - obscured |= SLOT_GLOVES + obscured |= ITEM_SLOT_GLOVES if(hidden_slots & HIDEJUMPSUIT) - obscured |= SLOT_W_UNIFORM + obscured |= ITEM_SLOT_ICLOTHING if(hidden_slots & HIDESHOES) - obscured |= SLOT_SHOES + obscured |= ITEM_SLOT_FEET if(hidden_slots & HIDESUITSTORAGE) - obscured |= SLOT_S_STORE + obscured |= ITEM_SLOT_SUITSTORE return obscured @@ -429,7 +429,7 @@ if(M.active_storage && M.active_storage.parent && SEND_SIGNAL(M.active_storage.parent, COMSIG_TRY_STORAGE_INSERT, src,M)) return TRUE - var/list/obj/item/possible = list(M.get_inactive_held_item(), M.get_item_by_slot(SLOT_BELT), M.get_item_by_slot(SLOT_GENERC_DEXTROUS_STORAGE), M.get_item_by_slot(SLOT_BACK)) + var/list/obj/item/possible = list(M.get_inactive_held_item(), M.get_item_by_slot(ITEM_SLOT_BELT), M.get_item_by_slot(ITEM_SLOT_DEX_STORAGE), M.get_item_by_slot(ITEM_SLOT_BACK)) for(var/i in possible) if(!i) continue @@ -451,10 +451,10 @@ //used in code for items usable by both carbon and drones, this gives the proper back slot for each mob.(defibrillator, backpack watertank, ...) /mob/proc/getBackSlot() - return SLOT_BACK + return ITEM_SLOT_BACK /mob/proc/getBeltSlot() - return SLOT_BELT + return ITEM_SLOT_BELT diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index ea2f723d87a7d..23285daaad04e 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -33,7 +33,7 @@ if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood. //Blood regeneration if there is some space - if(blood_volume < BLOOD_VOLUME_NORMAL && !HAS_TRAIT(src, TRAIT_NOHUNGER)) + if(blood_volume < BLOOD_VOLUME_NORMAL && !HAS_TRAIT(src, TRAIT_NOHUNGER) && !HAS_TRAIT(src, TRAIT_POWERHUNGRY)) var/nutrition_ratio = 0 switch(nutrition) if(0 to NUTRITION_LEVEL_STARVING) @@ -80,7 +80,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) @@ -164,7 +166,6 @@ if(blood_id == /datum/reagent/blood) //actual blood reagent var/blood_data = list() //set the blood data - blood_data["donor"] = src blood_data["viruses"] = list() for(var/thing in diseases) diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index 97e6557444f63..01bfd630d3b9b 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -54,15 +54,16 @@ user.visible_message("[user] sticks \a [newbrain] into [src].", "[src]'s indicator light turn on as you insert [newbrain].") log_attack("[key_name(user)] inserted [newbrain] into \the [src] at [AREACOORD(src)].") + SEND_SIGNAL(src, COMSIG_MMI_SET_BRAINMOB, newbrain.brainmob) brainmob = newbrain.brainmob newbrain.brainmob = null brainmob.forceMove(src) brainmob.container = src var/fubar_brain = newbrain.brain_death && newbrain.suicided && brainmob.suiciding //brain is damaged beyond repair or from a suicider if(!fubar_brain && !(newbrain.organ_flags & ORGAN_FAILING)) // the brain organ hasn't been beaten to death, nor was from a suicider. - brainmob.stat = CONSCIOUS //we manually revive the brain mob - GLOB.dead_mob_list -= brainmob - GLOB.alive_mob_list += brainmob + brainmob.set_stat(CONSCIOUS) //we manually revive the brain mob + brainmob.remove_from_dead_mob_list() + brainmob.add_to_alive_mob_list() else if(!fubar_brain && newbrain.organ_flags & ORGAN_FAILING) // the brain is damaged, but not from a suicider to_chat(user, "[src]'s indicator light turns yellow and its brain integrity alarm beeps softly. Perhaps you should check [newbrain] for damage.") playsound(src, "sound/machines/synth_no.ogg", 5, TRUE) @@ -99,11 +100,11 @@ /obj/item/mmi/proc/eject_brain(mob/user) brainmob.container = null //Reset brainmob mmi var. brainmob.forceMove(brain) //Throw mob into brain. - brainmob.stat = DEAD + brainmob.set_stat(DEAD) brainmob.emp_damage = 0 brainmob.reset_perspective() //so the brainmob follows the brain organ instead of the mmi. And to update our vision - GLOB.alive_mob_list -= brainmob //Get outta here - GLOB.dead_mob_list |= brainmob + brainmob.remove_from_alive_mob_list() //Get outta here + brainmob.add_to_dead_mob_list() brain.brainmob = brainmob //Set the brain to use the brainmob brainmob = null //Set mmi brainmob var to null if(user) diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 37ff6bd4ffc06..b570e906e81d8 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -29,9 +29,10 @@ if(stat!=DEAD) //If not dead. death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA if(mind) //You aren't allowed to return to brains that don't exist - mind.current = null + mind.set_current(null) ghostize() //Ghostize checks for key so nothing else is necessary. container = null + QDEL_NULL(stored_dna) return ..() /mob/living/brain/update_mobility() diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index dddb0339507c9..14f629597dfaf 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -156,47 +156,13 @@ else . += "This one is completely devoid of life." -/obj/item/organ/brain/attack(mob/living/carbon/C, mob/user) - if(!istype(C)) - return ..() - - add_fingerprint(user) - - if(user.zone_selected != BODY_ZONE_HEAD) - return ..() - - var/target_has_brain = C.getorgan(/obj/item/organ/brain) - - if(!target_has_brain && C.is_eyes_covered()) - to_chat(user, "You're going to need to remove [C.p_their()] head cover first!") - return - -//since these people will be dead M != usr - - if(!target_has_brain) - if(!C.get_bodypart(BODY_ZONE_HEAD) || !user.temporarilyRemoveItemFromInventory(src)) - return - var/msg = "[C] has [src] inserted into [C.p_their()] head by [user]." - if(C == user) - msg = "[user] inserts [src] into [user.p_their()] head!" - - C.visible_message("[msg]", - "[msg]") - - if(C != user) - to_chat(C, "[user] inserts [src] into your head.") - to_chat(user, "You insert [src] into [C]'s head.") - else - to_chat(user, "You insert [src] into your head." ) - - Insert(C) - else - ..() - /obj/item/organ/brain/Destroy() //copypasted from MMIs. if(brainmob) QDEL_NULL(brainmob) QDEL_LIST(traumas) + + if(owner?.mind) //You aren't allowed to return to brains that don't exist + owner.mind.set_current(null) return ..() /obj/item/organ/brain/on_life() @@ -243,25 +209,22 @@ /obj/item/organ/brain/positron name = "positronic brain" - slot = "brain" - zone = "chest" + slot = ORGAN_SLOT_BRAIN + zone = BODY_ZONE_CHEST status = ORGAN_ROBOTIC desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. It has an IPC serial number engraved on the top. In order for this Posibrain to be used as a newly built Positronic Brain, it must be coupled with an MMI." icon = 'icons/obj/assemblies.dmi' - icon_state = "posibrain-occupied" + icon_state = "posibrain-ipc" organ_flags = ORGAN_SYNTHETIC -/obj/item/organ/brain/positron/Insert(mob/living/carbon/C, special = 0, no_id_transfer = FALSE) - owner = C - C.internal_organs |= src - C.internal_organs_slot[slot] = src - loc = null - +/obj/item/organ/brain/positron/Insert(mob/living/carbon/C, special = 0, drop_if_replaced = 0) + ..() if(ishuman(C)) var/mob/living/carbon/human/H = C - if(H.dna && H.dna.species && (REVIVESBYHEALING in H.dna.species.species_traits)) - if(H.health > 0 && !H.hellbound) - H.revive(0) + if(H.dna?.species) + if(REVIVESBYHEALING in H.dna.species.species_traits) + if(H.health > 0 && !H.hellbound) + H.revive(0) /obj/item/organ/brain/positron/emp_act(severity) switch(severity) @@ -344,6 +307,9 @@ if(actual_trauma.brain) //we don't accept used traumas here WARNING("gain_trauma was given an already active trauma.") return + if(QDELETED(actual_trauma)) // hypnosis might qdel on New, causing problems + stack_trace("brain_gain_trauma tried to add qdeleted trauma.") + return traumas += actual_trauma actual_trauma.brain = src diff --git a/code/modules/mob/living/brain/death.dm b/code/modules/mob/living/brain/death.dm index acfc4a9ef4192..8a0e71de5fbf7 100644 --- a/code/modules/mob/living/brain/death.dm +++ b/code/modules/mob/living/brain/death.dm @@ -1,7 +1,7 @@ /mob/living/brain/death(gibbed) if(stat == DEAD) return - stat = DEAD + set_stat(DEAD) if(!gibbed && container)//If not gibbed but in a container. var/obj/item/mmi = container @@ -17,4 +17,4 @@ if(loc) if(istype(loc, /obj/item/organ/brain)) qdel(loc)//Gets rid of the brain item - ..() \ No newline at end of file + ..() diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index 963cc18c45a10..6aa315e9811b5 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -43,6 +43,8 @@ GLOBAL_VAR(posibrain_notify_cooldown) /obj/item/mmi/posibrain/attack_self(mob/user) if(!brainmob) brainmob = new(src) + if(!(GLOB.ghost_role_flags & GHOSTROLE_SILICONS)) + to_chat(user, "Central Command has temporarily outlawed posibrain sentience in this sector...") if(is_occupied()) to_chat(user, "This [name] is already active!") return @@ -87,6 +89,9 @@ GLOBAL_VAR(posibrain_notify_cooldown) return if(is_occupied() || is_banned_from(user.ckey, ROLE_POSIBRAIN) || QDELETED(brainmob) || QDELETED(src) || QDELETED(user)) return + if(!(GLOB.ghost_role_flags & GHOSTROLE_SILICONS)) + to_chat(user, "Central Command has temporarily outlawed posibrain sentience in this sector...") + return if(user.suiciding) //if they suicided, they're out forever. to_chat(user, "[src] fizzles slightly. Sadly it doesn't take those who suicided!") return @@ -106,7 +111,7 @@ GLOBAL_VAR(posibrain_notify_cooldown) brainmob.stored_dna = new /datum/dna/stored(brainmob) C.dna.copy_dna(brainmob.stored_dna) brainmob.timeofhostdeath = C.timeofdeath - brainmob.stat = CONSCIOUS + brainmob.set_stat(CONSCIOUS) if(brainmob.mind) brainmob.mind.assigned_role = new_role if(C.mind) @@ -129,9 +134,9 @@ GLOBAL_VAR(posibrain_notify_cooldown) name = "[initial(name)] ([brainmob.name])" to_chat(brainmob, welcome_message) brainmob.mind.assigned_role = new_role - brainmob.stat = CONSCIOUS - GLOB.dead_mob_list -= brainmob - GLOB.alive_mob_list += brainmob + brainmob.set_stat(CONSCIOUS) + brainmob.remove_from_dead_mob_list() + brainmob.add_to_alive_mob_list() visible_message(new_mob_message) check_success() diff --git a/code/modules/mob/living/brain/say.dm b/code/modules/mob/living/brain/say.dm index 61604c5fab54d..3c428b91026c3 100644 --- a/code/modules/mob/living/brain/say.dm +++ b/code/modules/mob/living/brain/say.dm @@ -10,11 +10,11 @@ ..() -/mob/living/brain/radio(message, message_mode, list/spans, language) - if(message_mode == MODE_HEADSET && istype(container, /obj/item/mmi)) +/mob/living/brain/radio(message, list/message_mods = list(), list/spans, language) + if(message_mods[MODE_HEADSET] && istype(container, /obj/item/mmi)) var/obj/item/mmi/R = container if(R.radio) - R.radio.talk_into(src, message, language = language) + R.radio.talk_into(src, message, language = language, message_mods = message_mods) return ITALICS | REDUCE_RANGE else return ..() diff --git a/code/modules/mob/living/burgerchat.dm b/code/modules/mob/living/burgerchat.dm deleted file mode 100644 index 4e84da35c4542..0000000000000 --- a/code/modules/mob/living/burgerchat.dm +++ /dev/null @@ -1,131 +0,0 @@ -// Thanks to Burger from Burgerstation for the foundation for this - -/* -BYOND Forum posts that helped me : -http://www.byond.com/forum/post/1133166 -http://www.byond.com/forum/post/1072433 -http://www.byond.com/forum/post/940994 -http://www.byond.com/docs/ref/skinparams.html#Fonts -*/ - -#define COLOR_JOB_UNKNOWN "#dda583" -#define COLOR_PERSON_UNKNOWN "#999999" - -//For jobs that aren't roundstart but still need colours -GLOBAL_LIST_INIT(job_colors_pastel, list( - "Prisoner" = "#d38a5c", - "CentCom" = "#90FD6D", - "Unknown"= COLOR_JOB_UNKNOWN, -)) - -/mob/living - var/list/stored_chat_text = list() - -/proc/animate_chat(mob/living/target, message, message_language, message_mode, list/show_to, duration) - var/text_color - - if(message_mode == MODE_WHISPER) - return - - var/mob/living/carbon/human/target_as_human = target - if(istype(target_as_human)) - if(target_as_human.wear_id?.GetID()) - var/obj/item/card/id/idcard = target_as_human.wear_id - var/datum/job/wearer_job = SSjob.GetJob(idcard.GetJobName()) - if(wearer_job) - text_color = wearer_job.chat_color - else - text_color = GLOB.job_colors_pastel[idcard.GetJobName()] - else - text_color = COLOR_PERSON_UNKNOWN - else - text_color = target.mobsay_color - - if(!text_color) //Just in case. - text_color = COLOR_JOB_UNKNOWN - - var/css = "" - - if(copytext(message, length(message) - 1) == "!!") - css += "font-weight: bold;" - if(istype(target.get_active_held_item(), /obj/item/megaphone)) - css += "font-size: 8px;" - if(istype(target.get_active_held_item(), /obj/item/megaphone/clown)) - text_color = "#ff2abf" - else if((message_mode == MODE_WHISPER_CRIT) || (message_mode == MODE_HEADSET) || (message_mode in GLOB.radiochannels)) - css += "font-size: 6px;" - - css += "color: [text_color];" - - message = copytext(message, 1, 120) - - var/static/regex/url_scheme = new(@"[A-Za-z][A-Za-z0-9+-\.]*:\/\/", "g") - message = replacetext(message, url_scheme, "") - - var/datum/language/D = GLOB.language_datum_instances[message_language] - - // create 2 messages, one that appears if you know the language, and one that appears when you don't know the language - var/image/I = image(loc = target, layer=FLY_LAYER) - I.alpha = 0 - I.maptext_width = 128 - I.maptext_height = 64 - I.pixel_x = -48 - I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA - I.maptext = "
[message]
" - - var/image/O = image(loc = target, layer=FLY_LAYER) - O.alpha = 0 - O.maptext_width = 128 - O.maptext_height = 64 - O.pixel_x = -48 - O.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA - O.maptext = "
[D.scramble(message)]
" - - target.stored_chat_text += I - target.stored_chat_text += O - - // find a client that's connected to measure the height of the message, so it knows how much to bump up the others - if(length(GLOB.clients)) - var/client/C = GLOB.clients[1] - if(C) - var/moveup = text2num(splittext(C.MeasureText(I.maptext, width = 128), "x")[2]) - for(var/image/old in target.stored_chat_text) - if(old != I && old != O) - var/pixel_y_new = old.pixel_y + moveup - animate(old, 2, pixel_y = pixel_y_new) - else // oh god this shouldn't happen, but MeasureText() was introduced in 513.1490 as a client proc - for(var/image/old in target.stored_chat_text) - if(old != I && old != O) - var/pixel_y_new = old.pixel_y + 10 - animate(old, 2, pixel_y = pixel_y_new) - - for(var/client/C in show_to) - if(C.mob.can_hear() && C.prefs.overhead_chat) - if(C.mob.can_speak_language(message_language)) - C.images += I - else - C.images += O - - animate(I, 1, alpha = 255, pixel_y = 24) - animate(O, 1, alpha = 255, pixel_y = 24) - - addtimer(CALLBACK(GLOBAL_PROC, .proc/fadeout_overhead_messages, I, O), duration) - addtimer(CALLBACK(GLOBAL_PROC, .proc/delete_overhead_messages, I, O, show_to, target, message_language), duration+5) - - -/proc/fadeout_overhead_messages(image/I, image/O) - var/pixel_y_new = I.pixel_y + 10 - animate(I, 2, pixel_y = pixel_y_new, alpha = 0) - animate(O, 2, pixel_y = pixel_y_new, alpha = 0) - -/proc/delete_overhead_messages(image/I, image/O, list/show_to, mob/living/target, message_language) - for(var/client/C in show_to) - if(C.mob.can_hear() && C.prefs.overhead_chat) - if(C.mob.can_speak_language(message_language)) - C.images -= I - else - C.images -= O - target.stored_chat_text -= I - target.stored_chat_text -= O - qdel(I) - qdel(O) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 97326f9ada5cc..32b7e60966b8e 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -22,11 +22,12 @@ gib_type = /obj/effect/decal/cleanable/xenoblood/xgibs unique_name = 1 + mobchatspan = "alienmobsay" var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?") /mob/living/carbon/alien/Initialize() - verbs += /mob/living/proc/mob_sleep - verbs += /mob/living/proc/lay_down + add_verb(/mob/living/proc/mob_sleep) + add_verb(/mob/living/proc/lay_down) create_bodyparts() //initialize bodyparts @@ -43,7 +44,7 @@ internal_organs += new /obj/item/organ/ears ..() -/mob/living/carbon/alien/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) // beepsky won't hunt aliums +/mob/living/carbon/alien/assess_threat(judgment_criteria, lasercolor = "", datum/callback/weaponcheck=null) // beepsky won't hunt aliums return -10 /mob/living/carbon/alien/handle_environment(datum/gas_mixture/environment) @@ -66,7 +67,7 @@ if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) //Body temperature is too hot. - throw_alert("alien_fire", /obj/screen/alert/alien_fire) + throw_alert("alien_fire", /atom/movable/screen/alert/alien_fire) switch(bodytemperature) if(360 to 400) apply_damage(HEAT_DAMAGE_LEVEL_1, BURN) @@ -86,11 +87,12 @@ /mob/living/carbon/alien/IsAdvancedToolUser() return has_fine_manipulation -/mob/living/carbon/alien/Stat() - ..() +/mob/living/carbon/alien/get_stat_tab_status() + var/list/tab_data = ..() + + tab_data["Intent"] = GENERATE_STAT_TEXT("[a_intent]") - if(statpanel("Status")) - stat(null, "Intent: [a_intent]") + return tab_data /mob/living/carbon/alien/getTrail() if(getBruteLoss() < 200) diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index 245d9ac344aac..820777517799b 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -1,4 +1,3 @@ - /mob/living/carbon/alien/get_eye_protection() return ..() + 2 //potential cyber implants + natural eye protection @@ -21,6 +20,8 @@ In all, this is a lot like the monkey code. /N switch(M.a_intent) if ("help") + if(M == src && check_self_for_injuries()) + return set_resting(FALSE) AdjustStun(-60) AdjustKnockdown(-60) @@ -98,6 +99,8 @@ In all, this is a lot like the monkey code. /N var/damage = rand(20) if(M.is_adult) damage = rand(30) + if(M.transformeffects & SLIME_EFFECT_RED) + damage *= 1.1 adjustBruteLoss(damage) log_combat(M, src, "attacked") updatehealth() 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 66931d85a3aad..1939696e59a68 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -17,10 +17,6 @@ Doesn't work on other aliens/AI.*/ action_icon_state = "spell_default" action_background_icon_state = "bg_alien" -/obj/effect/proc_holder/alien/Initialize() - . = ..() - action = new(src) - /obj/effect/proc_holder/alien/Click() if(!iscarbon(usr)) return 1 @@ -69,7 +65,7 @@ Doesn't work on other aliens/AI.*/ /obj/effect/proc_holder/alien/plant name = "Plant Weeds" - desc = "Plants some alien weeds." + desc = "Alien weeds spread resin which heals any alien. Costs 50 Plasma." plasma_cost = 50 check_turf = TRUE action_icon_state = "alien_plant" @@ -84,7 +80,7 @@ Doesn't work on other aliens/AI.*/ /obj/effect/proc_holder/alien/whisper name = "Whisper" - desc = "Whisper to someone." + desc = "Whisper to someone through the hivemind. Costs 10 Plasma." plasma_cost = 10 action_icon_state = "alien_whisper" @@ -138,15 +134,15 @@ Doesn't work on other aliens/AI.*/ /obj/effect/proc_holder/alien/acid name = "Corrosive Acid" - desc = "Drench an object in acid, destroying it over time." + desc = "Drench an object in acid, destroying it over time. Costs 200 Plasma." plasma_cost = 200 action_icon_state = "alien_acid" /obj/effect/proc_holder/alien/acid/on_gain(mob/living/carbon/user) - user.verbs.Add(/mob/living/carbon/proc/corrosive_acid) + user.add_verb(/mob/living/carbon/proc/corrosive_acid) /obj/effect/proc_holder/alien/acid/on_lose(mob/living/carbon/user) - user.verbs.Remove(/mob/living/carbon/proc/corrosive_acid) + user.remove_verb(/mob/living/carbon/proc/corrosive_acid) /obj/effect/proc_holder/alien/acid/proc/corrode(atom/target,mob/living/carbon/user = usr) if(target in oview(1,user)) @@ -184,7 +180,7 @@ Doesn't work on other aliens/AI.*/ /obj/effect/proc_holder/alien/neurotoxin name = "Spit Neurotoxin" - desc = "Spits neurotoxin at someone, paralyzing them for a short time." + desc = "Activates your Neurotoxin glands. You can shoot paralyzing shots. Each shot costs 50 Plasma." action_icon_state = "alien_neurotoxin_0" active = FALSE @@ -204,7 +200,7 @@ Doesn't work on other aliens/AI.*/ /obj/effect/proc_holder/alien/neurotoxin/InterceptClickOn(mob/living/caller, params, atom/target) if(..()) return - var/p_cost = 50 + var/p_cost = 30 if(!iscarbon(ranged_ability_user) || ranged_ability_user.stat) remove_ranged_ability() return @@ -224,6 +220,7 @@ Doesn't work on other aliens/AI.*/ user.visible_message("[user] spits neurotoxin!", "You spit neurotoxin.") var/obj/item/projectile/bullet/neurotoxin/A = new /obj/item/projectile/bullet/neurotoxin(user.loc) A.preparePixelProjectile(target, user, params) + A.firer = user A.fire() user.newtonian_move(get_dir(U, T)) user.adjustPlasma(-p_cost) @@ -249,7 +246,7 @@ Doesn't work on other aliens/AI.*/ /obj/effect/proc_holder/alien/resin name = "Secrete Resin" - desc = "Secrete tough malleable resin." + desc = "Secrete tough malleable resin. Costs 55 Plasma." plasma_cost = 55 check_turf = TRUE var/list/structures = list( 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 824b0ab36eef8..509cf9bad0e89 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -4,7 +4,7 @@ maxHealth = 125 health = 125 icon_state = "alienh" - var/obj/screen/leap_icon = null + var/atom/movable/screen/leap_icon = null /mob/living/carbon/alien/humanoid/hunter/create_internal_organs() internal_organs += new /obj/item/organ/alien/plasmavessel/small diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm index 4ec5780838095..796a78d566920 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm @@ -20,7 +20,7 @@ /obj/effect/proc_holder/alien/royal/praetorian/evolve name = "Evolve" - desc = "Produce an internal egg sac capable of spawning children. Only one queen can exist at a time." + desc = "Produce an internal egg sac capable of spawning children. Only one queen can exist at a time. Costs 500 Plasma." plasma_cost = 500 action_icon_state = "alien_evolve_praetorian" diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 2385443b98433..efe7c790fee59 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -34,13 +34,13 @@
"} for(var/i in 1 to held_items.len) var/obj/item/I = get_item_for_held_index(i) - dat += "
[get_held_index_name(i)]:[(I && !(I.item_flags & ABSTRACT)) ? I : "Empty"]" + dat += "
[get_held_index_name(i)]:[(I && !(I.item_flags & ABSTRACT)) ? I : "Empty"]" dat += "
Empty Pouches" if(handcuffed) - dat += "
Handcuffed" + dat += "
Handcuffed" if(legcuffed) - dat += "
Legcuffed" + dat += "
Legcuffed" dat += {"
diff --git a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm b/code/modules/mob/living/carbon/alien/humanoid/inventory.dm index 686588dcb3c50..9ad71c3adbdf9 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/inventory.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/alien/humanoid/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) +/mob/living/carbon/alien/humanoid/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, was_thrown = FALSE) . = ..() if(!. || !I) return diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index c0e23ff1f6089..74bcbbe435723 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -31,7 +31,7 @@ icon_state = "alienq" caste = "q" update_icons() - + /mob/living/carbon/alien/humanoid/royal/queen name = "alien queen" caste = "q" @@ -41,6 +41,8 @@ var/datum/action/small_sprite/smallsprite = new/datum/action/small_sprite/queen() /mob/living/carbon/alien/humanoid/royal/queen/Initialize() + SSshuttle.registerHostileEnvironment(src) //aliens delay shuttle + addtimer(CALLBACK(src, .proc/game_end), 30 MINUTES) //time until shuttle is freed/called //there should only be one queen for(var/mob/living/carbon/alien/humanoid/royal/queen/Q in GLOB.carbon_list) if(Q == src) @@ -66,10 +68,28 @@ internal_organs += new /obj/item/organ/alien/eggsac ..() +/mob/living/carbon/alien/humanoid/royal/queen/proc/game_end() + var/turf/T = get_turf(src) + if(stat != DEAD && is_station_level(T.z)) + SSshuttle.clearHostileEnvironment(src) + if(EMERGENCY_IDLE_OR_RECALLED) + priority_announce("Xenomorph infestation detected: crisis shuttle protocols activated - jamming recall signals across all frequencies.", SSstation.announcer.get_rand_alert_sound()) + play_soundtrack_music(/datum/soundtrack_song/bee/mind_crawler, only_station = TRUE) + SSshuttle.emergency.request(null, set_coefficient=0.5) + SSshuttle.emergencyNoRecall = TRUE + +/mob/living/carbon/alien/humanoid/royal/queen/death() //dead queen doesnt stop shuttle + SSshuttle.clearHostileEnvironment(src) + ..() + +/mob/living/carbon/alien/humanoid/royal/queen/Destroy() + SSshuttle.clearHostileEnvironment(src) + ..() + //Queen verbs /obj/effect/proc_holder/alien/lay_egg name = "Lay Egg" - desc = "Lay an egg to produce huggers to impregnate prey with." + desc = "Lay an egg to produce huggers to impregnate prey with. Costs 75 Plasma." plasma_cost = 75 check_turf = TRUE action_icon_state = "alien_egg" @@ -89,7 +109,7 @@ //Button to let queen choose her praetorian. /obj/effect/proc_holder/alien/royal/queen/promote name = "Create Royal Parasite" - desc = "Produce a royal parasite to grant one of your children the honor of being your Praetorian." + desc = "Produce a royal parasite to grant one of your children the honor of being your Praetorian. Costs 500 Plasma." plasma_cost = 500 //Plasma cost used on promotion, not spawning the parasite. action_icon_state = "alien_queen_promote" 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 dea5b55bc537e..a8c1bbccaad09 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) - lying = 90 //Anything else looks retarded + lying = 90 //Anything else looks stupid ..() update_icons() @@ -91,4 +91,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/inventory.dm b/code/modules/mob/living/carbon/alien/larva/inventory.dm index 17689785acf61..d4701836bac07 100644 --- a/code/modules/mob/living/carbon/alien/larva/inventory.dm +++ b/code/modules/mob/living/carbon/alien/larva/inventory.dm @@ -1,3 +1,3 @@ //can't unequip since it can't equip anything -/mob/living/carbon/alien/larva/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) +/mob/living/carbon/alien/larva/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, was_thrown = FALSE) return diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 3b150a2264c38..198edfa191998 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -15,7 +15,9 @@ var/time_of_birth rotate_on_lying = 0 - bodyparts = list(/obj/item/bodypart/chest/larva, /obj/item/bodypart/head/larva) + bodyparts = list(/obj/item/bodypart/chest/larva, /obj/item/bodypart/head/larva) + flavor_text = FLAVOR_TEXT_EVIL + playable = TRUE //This is fine right now, if we're adding organ specific damage this needs to be updated @@ -30,10 +32,10 @@ ..() //This needs to be fixed -/mob/living/carbon/alien/larva/Stat() - ..() - if(statpanel("Status")) - stat(null, "Progress: [amount_grown]/[max_grown]") +/mob/living/carbon/alien/larva/get_stat_tab_status() + var/list/tab_data = ..() + tab_data["Progress"] = GENERATE_STAT_TEXT("[amount_grown]/[max_grown]") + return tab_data /mob/living/carbon/alien/larva/adjustPlasma(amount) if(stat != DEAD && amount > 0) diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 7e108f7f383f0..1237e1ae40c85 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -20,12 +20,12 @@ return if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (HAS_TRAIT(src, TRAIT_DEATHCOMA)) || health <= crit_threshold) if(stat == CONSCIOUS) - stat = UNCONSCIOUS + set_stat(UNCONSCIOUS) blind_eyes(1) update_mobility() else if(stat == UNCONSCIOUS) - stat = CONSCIOUS + set_stat(CONSCIOUS) set_resting(FALSE) adjust_blindness(-1) update_damage_hud() diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index 7204759db5676..fd9b734910674 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -36,6 +36,10 @@ to_chat(user, "You cannot evolve when you are cuffed.") return + if(L.movement_type & VENTCRAWLING) + to_chat(user, "You cannot evolve while in a vent.") + return + if(L.amount_grown >= L.max_grown) //TODO ~Carn to_chat(L, "You are growing into a beautiful alien! It is time to choose a caste.") to_chat(L, "There are three to choose from:") diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 4e8dd3f4aa623..2427d345caf7a 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -15,20 +15,20 @@ var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.return_temperature())/BREATH_VOLUME //Partial pressure of the toxins in our breath - var/Toxins_pp = (breath.get_moles(/datum/gas/plasma)/breath.total_moles())*breath_pressure + var/Toxins_pp = (breath.get_moles(GAS_PLASMA)/breath.total_moles())*breath_pressure if(Toxins_pp > tox_detect_threshold) // Detect toxins in air - adjustPlasma(breath.get_moles(/datum/gas/plasma)*250) - throw_alert("alien_tox", /obj/screen/alert/alien_tox) + adjustPlasma(breath.get_moles(GAS_PLASMA)*250) + throw_alert("alien_tox", /atom/movable/screen/alert/alien_tox) - toxins_used = breath.get_moles(/datum/gas/plasma) + toxins_used = breath.get_moles(GAS_PLASMA) else clear_alert("alien_tox") //Breathe in toxins and out oxygen - breath.adjust_moles(/datum/gas/plasma, -toxins_used) - breath.adjust_moles(/datum/gas/oxygen, toxins_used) + breath.adjust_moles(GAS_PLASMA, -toxins_used) + breath.adjust_moles(GAS_O2, toxins_used) //BREATH TEMPERATURE handle_breath_temperature(breath) diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 5f59ee1cd891f..87347d7035052 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -144,7 +144,7 @@ owner.stuttering += 30 recent_queen_death = 1 - owner.throw_alert("alien_noqueen", /obj/screen/alert/alien_vulnerable) + owner.throw_alert("alien_noqueen", /atom/movable/screen/alert/alien_vulnerable) addtimer(CALLBACK(src, .proc/clear_queen_death), QUEEN_DEATH_DEBUFF_DURATION) diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index 1ad0a1e7ffd69..988d76827e07c 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -20,4 +20,4 @@ /mob/living/carbon/hivecheck() var/obj/item/organ/alien/hivenode/N = getorgan(/obj/item/organ/alien/hivenode) if(N && !N.recent_queen_death) //Mob has alien hive node and is not under the dead queen special effect. - return N + return TRUE diff --git a/code/modules/mob/living/carbon/alien/screen.dm b/code/modules/mob/living/carbon/alien/screen.dm index 1e7ff076318ff..6656f43639e61 100644 --- a/code/modules/mob/living/carbon/alien/screen.dm +++ b/code/modules/mob/living/carbon/alien/screen.dm @@ -1,7 +1,7 @@ /mob/living/carbon/alien/proc/updatePlasmaDisplay() if(hud_used) //clientless aliens - hud_used.alien_plasma_display.maptext = "
[round(getPlasma())]
" + hud_used.alien_plasma_display.maptext = MAPTEXT("
[round(getPlasma())]
") /mob/living/carbon/alien/larva/updatePlasmaDisplay() return @@ -14,7 +14,7 @@ return var/turf/Q = get_turf(queen) var/turf/A = get_turf(src) - if(Q.z != A.z) //The queen is on a different Z level, we cannot sense that far. + if(Q.get_virtual_z_level() != A.get_virtual_z_level()) //The queen is on a different Z level, we cannot sense that far. return var/Qdir = get_dir(src, Q) var/Qdist = get_dist(src, Q) @@ -30,4 +30,4 @@ hud_used.alien_queen_finder.add_overlay(finder_eye) /mob/living/carbon/alien/humanoid/royal/queen/findQueen() - return //Queen already knows where she is. Hopefully. \ No newline at end of file + return //Queen already knows where she is. Hopefully. 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 f8b43306ed26e..c8316a16ab4cc 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -51,6 +51,9 @@ owner.adjustToxLoss(10) /obj/item/organ/body_egg/alien_embryo/egg_process() + var/mob/living/L = owner + if(L.IsInStasis()) + return if(stage < 5 && prob(3)) stage++ INVOKE_ASYNC(src, .proc/RefreshInfectionImage) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 25e406a9f7f5d..fa1819056dd16 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -101,7 +101,7 @@ return Leap(AM) return 0 -/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) +/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, quickstart = TRUE) if(!..()) return if(stat == CONSCIOUS) @@ -169,7 +169,7 @@ if(target.dropItemToGround(W)) target.visible_message("[src] tears [W] off of [target]'s face!", \ "[src] tears [W] off of your face!") - target.equip_to_slot_if_possible(src, SLOT_WEAR_MASK, 0, 1, 1) + target.equip_to_slot_if_possible(src, ITEM_SLOT_MASK, 0, 1, 1) return TRUE // time for a smoke /obj/item/clothing/mask/facehugger/proc/Attach(mob/living/M) @@ -256,7 +256,7 @@ return 1 var/mob/living/carbon/C = M - if(ishuman(C) && !(SLOT_WEAR_MASK in C.dna.species.no_equip)) + if(ishuman(C) && !(ITEM_SLOT_MASK in C.dna.species.no_equip)) var/mob/living/carbon/human/H = C if(H.is_mouth_covered(head_only = 1)) return 0 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 7ce1effa0083f..2fbff89d6c1b5 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -23,20 +23,19 @@ AddComponent(/datum/component/footstep, 1, 2) /mob/living/carbon/swap_hand(held_index) + . = ..() + if(!.) + var/obj/item/held_item = get_active_held_item() + to_chat(usr, "Your other hand is too busy holding [held_item].") + return + if(!held_index) held_index = (active_hand_index % held_items.len)+1 - var/obj/item/item_in_hand = src.get_active_held_item() - if(item_in_hand) //this segment checks if the item in your hand is twohanded. - var/obj/item/twohanded/TH = item_in_hand - if(istype(TH)) - if(TH.wielded == 1) - to_chat(usr, "Your other hand is too busy holding [TH].") - return var/oindex = active_hand_index active_hand_index = held_index if(hud_used) - var/obj/screen/inventory/hand/H + var/atom/movable/screen/inventory/hand/H H = hud_used.hand_slots["[oindex]"] if(H) H.update_icon() @@ -70,8 +69,31 @@ return ..() /mob/living/carbon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - . = ..() var/hurt = TRUE + if(throwingdatum.force <= MOVE_FORCE_WEAK) + hurt = FALSE + + if(iscarbon(hit_atom) && hit_atom != src) + var/mob/living/carbon/victim = hit_atom + if(!(victim.movement_type & FLYING)) + if(victim.can_catch_item()) + visible_message("[victim] catches [src]!",\ + "[victim] catches you!") + grabbedby(victim, TRUE) + victim.throw_mode_off() + log_combat(victim, src, "caught (thrown mob)") + return + if(hurt) + victim.take_bodypart_damage(10,check_armor = TRUE) + take_bodypart_damage(10,check_armor = TRUE) + victim.Paralyze(20) + Paralyze(20) + visible_message("[src] crashes into [victim], knocking them both over!",\ + "You violently crash into [victim]!") + playsound(src,'sound/weapons/punch1.ogg',50,1) + + . = ..() + if(istype(throwingdatum, /datum/thrownthing)) var/datum/thrownthing/D = throwingdatum if(iscyborg(D.thrower)) @@ -82,19 +104,6 @@ if(hurt) Paralyze(20) take_bodypart_damage(10,check_armor = TRUE) - if(iscarbon(hit_atom) && hit_atom != src) - var/mob/living/carbon/victim = hit_atom - if(victim.movement_type & FLYING) - return - if(hurt) - victim.take_bodypart_damage(10,check_armor = TRUE) - take_bodypart_damage(10,check_armor = TRUE) - victim.Paralyze(20) - Paralyze(20) - visible_message("[src] crashes into [victim], knocking them both over!",\ - "You violently crash into [victim]!") - playsound(src,'sound/weapons/punch1.ogg',50,1) - //Throwing stuff /mob/living/carbon/proc/toggle_throw_mode() @@ -119,15 +128,16 @@ /mob/proc/throw_item(atom/target) SEND_SIGNAL(src, COMSIG_MOB_THROW, target) - return + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CARBON_THROW_THING, src, target) + return TRUE /mob/living/carbon/throw_item(atom/target) . = ..() throw_mode_off() if(!target || !isturf(loc)) - return - if(istype(target, /obj/screen)) - return + return FALSE + if(istype(target, /atom/movable/screen)) + return FALSE var/atom/movable/thrown_thing var/obj/item/I = get_active_held_item() @@ -147,11 +157,11 @@ else if(!CHECK_BITFIELD(I.item_flags, ABSTRACT) && !HAS_TRAIT(I, TRAIT_NODROP)) thrown_thing = I - dropItemToGround(I) + dropItemToGround(I, thrown = TRUE) if(HAS_TRAIT(src, TRAIT_PACIFISM) && I.throwforce) to_chat(src, "You set [I] down gently on the ground.") - return + return TRUE if(thrown_thing) visible_message("[src] throws [thrown_thing].", \ @@ -159,6 +169,8 @@ log_message("has thrown [thrown_thing]", LOG_ATTACK) 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) + return TRUE + return FALSE /mob/living/carbon/restrained(ignore_grab) . = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_NECK)) @@ -173,33 +185,33 @@
[name]
-
Head: [(head && !(head.item_flags & ABSTRACT)) ? head : "Nothing"]"} +
Head: [(head && !(head.item_flags & ABSTRACT)) ? head : "Nothing"]"} var/list/obscured = check_obscured_slots() - if(SLOT_NECK in obscured) + if(ITEM_SLOT_NECK in obscured) dat += "
Neck: Obscured" else - dat += "
Neck: [(wear_neck && !(wear_neck.item_flags & ABSTRACT)) ? (wear_neck) : "Nothing"]" + dat += "
Neck: [(wear_neck && !(wear_neck.item_flags & ABSTRACT)) ? (wear_neck) : "Nothing"]" - if(SLOT_WEAR_MASK in obscured) + if(ITEM_SLOT_MASK in obscured) dat += "
Mask: Obscured" else - dat += "
Mask: [(wear_mask && !(wear_mask.item_flags & ABSTRACT)) ? wear_mask : "Nothing"]" + dat += "
Mask: [(wear_mask && !(wear_mask.item_flags & ABSTRACT)) ? wear_mask : "Nothing"]" for(var/i in 1 to held_items.len) var/obj/item/I = get_item_for_held_index(i) - dat += "
[get_held_index_name(i)]:
[(I && !(I.item_flags & ABSTRACT)) ? I : "Nothing"]" + dat += "
[get_held_index_name(i)]:
[(I && !(I.item_flags & ABSTRACT)) ? I : "Nothing"]" - dat += "
Back: [back ? back : "Nothing"]" + dat += "
Back: [back ? back : "Nothing"]" if(istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/tank)) dat += "
[internal ? "Disable Internals" : "Set Internals"]" if(handcuffed) - dat += "
Handcuffed" + dat += "
Handcuffed" if(legcuffed) - dat += "
Legcuffed" + dat += "
Legcuffed" dat += {"
@@ -229,6 +241,16 @@ visible_message("[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM.name].", \ "You [internal ? "open" : "close"] the valve on [src]'s [ITEM.name].") + if(href_list["embedded_object"] && usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) + 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 @@ -247,7 +269,7 @@ last_special = world.time + CLICK_CD_BREAKOUT var/buckle_cd = 600 if(handcuffed) - var/obj/item/restraints/O = src.get_item_by_slot(SLOT_HANDCUFFED) + var/obj/item/restraints/O = src.get_item_by_slot(ITEM_SLOT_HANDCUFFED) buckle_cd = O.breakouttime visible_message("[src] attempts to unbuckle [p_them()]self!", \ "You attempt to unbuckle yourself... (This will take around [round(buckle_cd/600,1)] minute\s, and you need to stay still.)") @@ -415,15 +437,17 @@ var/turf/target = get_turf(loc) I.safe_throw_at(target,I.throw_range,I.throw_speed,src, force = move_force) +/mob/living/carbon/get_stat_tab_status() + var/list/tab_data = ..() + var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel) + if(vessel) + tab_data["Plasma Stored"] = GENERATE_STAT_TEXT("[vessel.storedPlasma]/[vessel.max_plasma]") + if(locate(/obj/item/assembly/health) in src) + tab_data["Health"] = GENERATE_STAT_TEXT("[health]") + return tab_data + /mob/living/carbon/Stat() ..() - if(statpanel("Status")) - var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel) - if(vessel) - stat(null, "Plasma Stored: [vessel.storedPlasma]/[vessel.max_plasma]") - if(locate(/obj/item/assembly/health) in src) - stat(null, "Health: [health]") - add_abilities_to_panel() /mob/living/carbon/attack_ui(slot) @@ -443,7 +467,8 @@ visible_message("[src] dry heaves!", \ "You try to throw up, but there's nothing in your stomach!") if(stun) - Paralyze(200) + Paralyze(30) + Knockdown(180) return 1 if(is_mouth_covered()) //make this add a blood/vomit overlay later it'll be hilarious @@ -459,7 +484,8 @@ SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "vomit", /datum/mood_event/vomit) if(stun) - Paralyze(80) + Paralyze(15) + Knockdown(90) playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) var/turf/T = get_turf(src) @@ -532,10 +558,11 @@ remove_movespeed_modifier(MOVESPEED_ID_CARBON_SOFTCRIT, TRUE) -/mob/living/carbon/update_stamina() +/mob/living/carbon/update_stamina(extend_stam_crit = FALSE) var/stam = getStaminaLoss() if(stam > DAMAGE_PRECISION && (maxHealth - stam) <= crit_threshold && !stat && !HAS_TRAIT(src, TRAIT_NOSTAMCRIT)) - enter_stamcrit() + if(extend_stam_crit || !stam_paralyzed) + enter_stamcrit() else if(stam_paralyzed) stam_paralyzed = FALSE else @@ -601,7 +628,7 @@ become_blind(EYES_COVERED) else if(tinttotal >= TINT_DARKENED) cure_blind(EYES_COVERED) - overlay_fullscreen("tint", /obj/screen/fullscreen/impaired, 2) + overlay_fullscreen("tint", /atom/movable/screen/fullscreen/impaired, 2) else cure_blind(EYES_COVERED) clear_fullscreen("tint", 0) @@ -665,10 +692,10 @@ visionseverity = 9 if(-INFINITY to -24) visionseverity = 10 - overlay_fullscreen("critvision", /obj/screen/fullscreen/crit/vision, visionseverity) + overlay_fullscreen("critvision", /atom/movable/screen/fullscreen/crit/vision, visionseverity) else clear_fullscreen("critvision") - overlay_fullscreen("crit", /obj/screen/fullscreen/crit, severity) + overlay_fullscreen("crit", /atom/movable/screen/fullscreen/crit, severity) else clear_fullscreen("crit") clear_fullscreen("critvision") @@ -691,7 +718,7 @@ severity = 6 if(45 to INFINITY) severity = 7 - overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity) + overlay_fullscreen("oxy", /atom/movable/screen/fullscreen/oxy, severity) else clear_fullscreen("oxy") @@ -712,7 +739,7 @@ severity = 5 if(85 to INFINITY) severity = 6 - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + overlay_fullscreen("brute", /atom/movable/screen/fullscreen/brute, severity) else clear_fullscreen("brute") @@ -753,7 +780,7 @@ death() return if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (HAS_TRAIT(src, TRAIT_DEATHCOMA)) || (health <= HEALTH_THRESHOLD_FULLCRIT && !HAS_TRAIT(src, TRAIT_NOHARDCRIT))) - stat = UNCONSCIOUS + set_stat(UNCONSCIOUS) blind_eyes(1) if(CONFIG_GET(flag/near_death_experience) && health <= HEALTH_THRESHOLD_NEARDEATH && !HAS_TRAIT(src, TRAIT_NODEATH)) ADD_TRAIT(src, TRAIT_SIXTHSENSE, "near-death") @@ -761,9 +788,9 @@ REMOVE_TRAIT(src, TRAIT_SIXTHSENSE, "near-death") else if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT)) - stat = SOFT_CRIT + set_stat(SOFT_CRIT) else - stat = CONSCIOUS + set_stat(CONSCIOUS) adjust_blindness(-1) REMOVE_TRAIT(src, TRAIT_SIXTHSENSE, "near-death") update_mobility() @@ -776,7 +803,7 @@ if(handcuffed) drop_all_held_items() stop_pulling() - throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = src.handcuffed) + throw_alert("handcuffed", /atom/movable/screen/alert/restrained/handcuffed, new_master = src.handcuffed) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "handcuffed", /datum/mood_event/handcuffed) else clear_alert("handcuffed") @@ -797,7 +824,7 @@ B.brain_death = FALSE for(var/thing in diseases) var/datum/disease/D = thing - if(D.severity != DISEASE_SEVERITY_BENEFICIAL && D.severity != DISEASE_SEVERITY_POSITIVE) + if(D.danger != DISEASE_BENEFICIAL && D.danger != DISEASE_POSITIVE) D.cure(FALSE) if(admin_revive) suiciding = FALSE @@ -866,16 +893,6 @@ O.held_index = r_arm_index_next //2, 4, 6, 8... hand_bodyparts += O -/mob/living/carbon/do_after_coefficent() - . = ..() - var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) //Currently, only carbons or higher use mood, move this once that changes. - if(mood) - switch(mood.sanity) //Alters do_after delay based on how sane you are - if(-INFINITY to SANITY_DISTURBED) - . *= 1.25 - if(SANITY_NEUTRAL to INFINITY) - . *= 0.90 - /mob/living/carbon/proc/create_internal_organs() for(var/X in internal_organs) var/obj/item/organ/I = X @@ -1017,7 +1034,7 @@ return FALSE if(hallucinating()) return TRUE - + if(IsSleeping()) return TRUE if(HAS_TRAIT(src, TRAIT_DUMB)) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index c3059fe70a648..dac819043a59e 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -1,46 +1,30 @@ /mob/living/carbon/get_eye_protection() - var/number = ..() - - if(istype(src.head, /obj/item/clothing/head)) //are they wearing something on their head - var/obj/item/clothing/head/HFP = src.head //if yes gets the flash protection value from that item - number += HFP.flash_protect - - if(istype(src.glasses, /obj/item/clothing/glasses)) //glasses - var/obj/item/clothing/glasses/GFP = src.glasses - number += GFP.flash_protect - - if(istype(src.wear_mask, /obj/item/clothing/mask)) //mask - var/obj/item/clothing/mask/MFP = src.wear_mask - number += MFP.flash_protect - + . = ..() var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) if(!E) - number = INFINITY //Can't get flashed without eyes - else - number += E.flash_protect - - return number + return INFINITY //Can't get flashed without eyes + . += E.flash_protect + if(isclothing(head)) //Adds head protection + . += head.flash_protect + if(isclothing(glasses)) //Glasses + . += glasses.flash_protect + if(isclothing(wear_mask)) //Mask + . += wear_mask.flash_protect /mob/living/carbon/get_ear_protection() - var/number = ..() - if(istype(src.head, /obj/item/clothing/head)) //are they wearing something on their head - var/obj/item/clothing/head/HHP = src.head //if yes gets the flash protection value from that item - number += HHP.bang_protect - - if(istype(src.ears, /obj/item/radio/headset)) //headset - var/obj/item/radio/headset/RHP = src.ears - number += RHP.bang_protect - - if(istype(src.ears, /obj/item/clothing/ears)) //ear slot. This is different from headset because headset is a subtype of radio - var/obj/item/clothing/ears/EHP = src.ears - number += EHP.bang_protect + . = ..() var/obj/item/organ/ears/E = getorganslot(ORGAN_SLOT_EARS) if(!E) - number = INFINITY - else - number += E.bang_protect - return number + return INFINITY + . += E.bang_protect + if(isclothing(head)) //Adds head protection + . += head.bang_protect + if(isclothing(ears)) //ear slot + . += ears.bang_protect + else if(istype(ears, /obj/item/radio/headset)) + var/obj/item/radio/headset/headset_in_ear = ears + . += headset_in_ear.bang_protect /mob/living/carbon/is_mouth_covered(head_only = 0, mask_only = 0) if( (!mask_only && head && (head.flags_cover & HEADCOVERSMOUTH)) || (!head_only && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH)) ) @@ -53,11 +37,6 @@ return wear_mask if(check_glasses && glasses && (glasses.flags_cover & GLASSESCOVERSEYES)) return glasses -/mob/living/carbon/is_pepper_proof(check_head = TRUE, check_mask = TRUE) - if(check_head &&(head?.flags_cover & PEPPERPROOF)) - return head - if(check_mask &&(wear_mask?.flags_cover & PEPPERPROOF)) - return wear_mask /mob/living/carbon/check_projectile_dismemberment(obj/item/projectile/P, def_zone) var/obj/item/bodypart/affecting = get_bodypart(def_zone) @@ -88,7 +67,7 @@ "You catch [I] in mid-air!") throw_mode_off() return 1 - ..() + ..(AM, skipcatch, hitpush, blocked, throwingdatum) /mob/living/carbon/attacked_by(obj/item/I, mob/living/user) @@ -101,7 +80,7 @@ if(I.force) apply_damage(I.force, I.damtype, affecting) if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC) - if(I.sharpness || I.force >= 10) + if(I.is_sharp() || I.force >= 10) I.add_mob_blood(src) var/turf/location = get_turf(src) add_splatter_floor(location) @@ -122,13 +101,13 @@ update_inv_head() //dismemberment - var/dismemberthreshold = (((affecting.max_damage * 2) / max(I.sharpness, 0.5)) - (affecting.get_damage() + ((I.w_class - 3) * 10) + ((I.attack_weight - 1) * 15))) + var/dismemberthreshold = (((affecting.max_damage * 2) / max(I.is_sharp(), 0.5)) - (affecting.get_damage() + ((I.w_class - 3) * 10) + ((I.attack_weight - 1) * 15))) if(HAS_TRAIT(src, TRAIT_EASYDISMEMBER)) dismemberthreshold -= 50 - if(I.sharpness) + if(I.is_sharp()) dismemberthreshold = min(((affecting.max_damage * 2) - affecting.get_damage()), dismemberthreshold) //makes it so limbs wont become immune to being dismembered if the item is sharp if(stat == DEAD) - dismemberthreshold = dismemberthreshold / 3 + dismemberthreshold = dismemberthreshold / 3 if(I.force >= dismemberthreshold && I.force >= 10) if(affecting.dismember(I.damtype)) I.add_mob_blood(src) @@ -141,6 +120,9 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /mob/living/carbon/attack_hand(mob/living/carbon/human/user) + if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user) & COMPONENT_CANCEL_ATTACK_CHAIN) + . = TRUE + for(var/thing in diseases) var/datum/disease/D = thing if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) @@ -186,16 +168,19 @@ /mob/living/carbon/attack_slime(mob/living/simple_animal/slime/M) if(..()) //successful slime attack if(M.powerlevel > 0) - M.powerlevel -- + M.powerlevel-- visible_message("The [M.name] has shocked [src]!", \ "The [M.name] has shocked you!") do_sparks(5, TRUE, src) Knockdown(M.powerlevel*5) if(stuttering < M.powerlevel) stuttering = M.powerlevel + if(M.transformeffects & SLIME_EFFECT_ORANGE) + adjust_fire_stacks(2) + IgniteMob() adjustFireLoss(M.powerlevel * 3) updatehealth() - return 1 + return TRUE /mob/living/carbon/proc/dismembering_strike(mob/living/attacker, dam_zone) if(!attacker.limb_destroyer) @@ -247,6 +232,7 @@ 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! + SEND_SIGNAL(src, COMSIG_LIVING_ELECTROCUTE_ACT, shock_damage, source, siemens_coeff, safety, tesla_shock, illusion, stun) if(illusion) adjustStaminaLoss(shock_damage) else @@ -281,6 +267,9 @@ 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(!(mobility_flags & MOBILITY_STAND)) if(buckled) to_chat(M, "You need to unbuckle [src] first to do that!") @@ -302,6 +291,7 @@ else if(M.zone_selected == BODY_ZONE_HEAD) M.visible_message("[M] pats [src] on the head.", \ "You pat [src] on the head.") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat, M) else if((M.zone_selected == BODY_ZONE_L_ARM) || (M.zone_selected == BODY_ZONE_R_ARM)) if(!get_bodypart(check_zone(M.zone_selected))) to_chat(M, "[src] does not have a [M.zone_selected == BODY_ZONE_L_ARM ? "left" : "right"] arm!") @@ -320,14 +310,33 @@ 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) if(NOFLASH in dna?.species?.species_traits) return var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) - if(!eyes) //can't flash what can't see! + if(!eyes || HAS_TRAIT(src, TRAIT_BLIND)) //can't flash what can't see! return - . = ..() var/damage = intensity - get_eye_protection() @@ -384,7 +393,8 @@ var/effect_amount = intensity - ear_safety if(effect_amount > 0) if(stun_pwr) - Paralyze(stun_pwr*effect_amount) + Paralyze((stun_pwr*effect_amount)*0.1) + Knockdown(stun_pwr*effect_amount) if(istype(ears) && (deafen_pwr || damage_pwr)) var/ear_damage = damage_pwr * effect_amount diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 505e958a3f071..612ffdb563cde 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -63,3 +63,7 @@ var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects var/stam_regen_start_time = 0 //used to halt stamina regen temporarily var/stam_paralyzed = FALSE //knocks you down + var/stam_heal = 10 //Stamina healed per 2 seconds overall. When the mob has taken more than 60 stamina damage, the rate of stamina regeneration will be increased, up to 20 per second when the mob has taken 120 stamina damage. + + /// Timer id of any transformation + var/transformation_timer diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 86ae8d9a9ee0c..53d32da1e0135 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -1,8 +1,8 @@ -/mob/living/carbon/movement_delay() - . = ..() +/mob/living/carbon/movement_delay() + . = ..() - if(!get_leg_ignore() && legcuffed) //ignore the fact we lack legs - . += legcuffed.slowdown + if(!get_leg_ignore() && legcuffed) //ignore the fact we lack legs + . += legcuffed.slowdown /mob/living/carbon/slip(knockdown_amount, obj/O, lube, paralyze, force_drop) if(movement_type & FLYING) diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index bf5cb4f2276d5..0c7edee484918 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -67,7 +67,9 @@ if(amount > 0) take_overall_damage(amount, 0, 0, updating_health, required_status) else - heal_overall_damage(abs(amount), 0, 0, required_status ? required_status : BODYPART_ORGANIC, updating_health) + if(!required_status) + required_status = forced ? null : BODYPART_ORGANIC + heal_overall_damage(abs(amount), 0, 0, required_status, updating_health) return amount /mob/living/carbon/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_status) @@ -76,7 +78,9 @@ if(amount > 0) take_overall_damage(0, amount, 0, updating_health, required_status) else - heal_overall_damage(0, abs(amount), 0, required_status ? required_status : BODYPART_ORGANIC, updating_health) + if(!required_status) + required_status = forced ? null : BODYPART_ORGANIC + heal_overall_damage(0, abs(amount), 0, required_status, updating_health) return amount /mob/living/carbon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) @@ -186,7 +190,7 @@ if(!parts.len) return var/obj/item/bodypart/picked = pick(parts) - if(picked.receive_damage(brute, burn, stamina,check_armor ? run_armor_check(picked, (brute ? "melee" : burn ? "fire" : stamina ? "bullet" : null)) : FALSE)) + if(picked.receive_damage(brute, burn, stamina,check_armor ? run_armor_check(picked, (brute ? "melee" : burn ? "fire" : stamina ? "stamina" : null)) : FALSE)) update_damage_overlays() //Heal MANY bodyparts, in random order @@ -210,7 +214,7 @@ parts -= picked if(updating_health) updatehealth() - update_stamina() + update_stamina(stamina > DAMAGE_PRECISION) if(update) update_damage_overlays() @@ -243,4 +247,4 @@ updatehealth() if(update) update_damage_overlays() - update_stamina() + update_stamina(stamina > DAMAGE_PRECISION) diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index 5befc92d52c21..63c3ee5d5f55b 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -6,7 +6,7 @@ losebreath = 0 if(!gibbed) - emote("deathgasp") + INVOKE_ASYNC(src, .proc/emote, "deathgasp") . = ..() diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index 1f6fff56d8bb4..d5217a45615ab 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -3,22 +3,22 @@ /datum/emote/living/carbon/airguitar key = "airguitar" - message = "is strumming the air and headbanging like a safari chimp." + message = "is strumming the air and headbanging like a safari chimp" restraint_check = TRUE /datum/emote/living/carbon/blink key = "blink" key_third_person = "blinks" - message = "blinks." + message = "blinks" /datum/emote/living/carbon/blink_r key = "blink_r" - message = "blinks rapidly." + message = "blinks rapidly" /datum/emote/living/carbon/clap key = "clap" key_third_person = "claps" - message = "claps." + message = "claps" muzzle_ignore = TRUE restraint_check = TRUE emote_type = EMOTE_AUDIBLE @@ -37,40 +37,55 @@ /datum/emote/living/carbon/gnarl key = "gnarl" key_third_person = "gnarls" - message = "gnarls and shows its teeth..." + message = "gnarls and shows its teeth.." mob_type_allowed_typecache = list(/mob/living/carbon/monkey) /datum/emote/living/carbon/moan key = "moan" key_third_person = "moans" - message = "moans!" - message_mime = "appears to moan!" + message = "moans" + message_mime = "appears to moan" emote_type = EMOTE_AUDIBLE /datum/emote/living/carbon/roll key = "roll" key_third_person = "rolls" - message = "rolls." + message = "rolls" mob_type_allowed_typecache = list(/mob/living/carbon/monkey, /mob/living/carbon/alien) restraint_check = TRUE /datum/emote/living/carbon/scratch key = "scratch" key_third_person = "scratches" - message = "scratches." + message = "scratches" mob_type_allowed_typecache = list(/mob/living/carbon/monkey, /mob/living/carbon/alien) restraint_check = TRUE /datum/emote/living/carbon/screech key = "screech" key_third_person = "screeches" - message = "screeches." - mob_type_allowed_typecache = list(/mob/living/carbon/monkey, /mob/living/carbon/alien) + message = "screeches" + mob_type_allowed_typecache = list(/mob/living/carbon/monkey) + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/carbon/screech/get_sound(mob/living/user) + return pick('sound/creatures/monkey/monkey_screech_1.ogg', + 'sound/creatures/monkey/monkey_screech_2.ogg', + 'sound/creatures/monkey/monkey_screech_3.ogg', + 'sound/creatures/monkey/monkey_screech_4.ogg', + 'sound/creatures/monkey/monkey_screech_5.ogg', + 'sound/creatures/monkey/monkey_screech_6.ogg', + 'sound/creatures/monkey/monkey_screech_7.ogg') + +/datum/emote/living/carbon/screech/roar + key = "roar" + key_third_person = "roars" + message = "roars." /datum/emote/living/carbon/sign key = "sign" key_third_person = "signs" - message_param = "signs the number %t." + message_param = "signs the number %t" mob_type_allowed_typecache = list(/mob/living/carbon/monkey, /mob/living/carbon/alien) restraint_check = TRUE @@ -82,16 +97,16 @@ /datum/emote/living/carbon/sign/signal key = "signal" key_third_person = "signals" - message_param = "raises %t fingers." + message_param = "raises %t fingers" mob_type_allowed_typecache = list(/mob/living/carbon/human) restraint_check = TRUE /datum/emote/living/carbon/tail key = "tail" - message = "waves their tail." + message = "waves their tail" mob_type_allowed_typecache = list(/mob/living/carbon/monkey, /mob/living/carbon/alien) /datum/emote/living/carbon/wink key = "wink" key_third_person = "winks" - message = "winks." + message = "winks" diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 4ea548ed23946..78a5de78605af 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -13,9 +13,9 @@ . += "[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed!" if (head) . += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head. " - if(wear_mask && !(SLOT_WEAR_MASK in obscured)) + if(wear_mask && !(ITEM_SLOT_MASK in obscured)) . += "[t_He] [t_is] wearing [wear_mask.get_examine_string(user)] on [t_his] face." - if(wear_neck && !(SLOT_NECK in obscured)) + if(wear_neck && !(ITEM_SLOT_NECK in obscured)) . += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck." for(var/obj/item/I in held_items) @@ -32,14 +32,36 @@ 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] [icon2html(I, user)] \a [I] stuck to [t_his] [BP.name]!\n" + else + msg += "[t_He] [t_has] [icon2html(I, user)] \a [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) @@ -89,7 +111,7 @@ else if(InCritical()) . += "[t_His] breathing is shallow and labored." - if(digitalcamo) + if(HAS_TRAIT(src, TRAIT_DIGICAMO)) . += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly unsimian manner." var/trait_exam = common_trait_examine() diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm index 2ee48f321e9bc..9190fe1712301 100644 --- a/code/modules/mob/living/carbon/human/damage_procs.dm +++ b/code/modules/mob/living/carbon/human/damage_procs.dm @@ -2,7 +2,7 @@ /mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE) // depending on the species, it will run the corresponding apply_damage code there - if (stat != DEAD && (damagetype==BRUTE || damagetype==BURN) && damage>10 && prob(10+damage/2)) + if(stat != DEAD && (damagetype==BRUTE || damagetype==BURN) && damage>10 && prob(10+damage/2)) emote("scream") return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 2674115da1e7d..bed9fb92dceb8 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -1,39 +1,51 @@ /mob/living/carbon/human/gib_animation() + if(!dna) + new /obj/effect/temp_visual/gib_animation(loc, "gibbed-h") + return switch(dna.species.species_gibs) - if("human") + if(GIB_TYPE_HUMAN) new /obj/effect/temp_visual/gib_animation(loc, "gibbed-h") - if("robotic") + if(GIB_TYPE_ROBOTIC) new /obj/effect/temp_visual/gib_animation(loc, "gibbed-r") /mob/living/carbon/human/dust_animation() + if(!dna) + new /obj/effect/temp_visual/dust_animation(loc, "dust-h") + return switch(dna.species.species_gibs) - if("human") + if(GIB_TYPE_HUMAN) new /obj/effect/temp_visual/dust_animation(loc, "dust-h") - if("robotic") + if(GIB_TYPE_ROBOTIC) new /obj/effect/temp_visual/dust_animation(loc, "dust-r") /mob/living/carbon/human/spawn_gibs(with_bodyparts) + if(!dna) + new /obj/effect/gibspawner/human(get_turf(src), src, get_static_viruses()) + return if(with_bodyparts) switch(dna.species.species_gibs) - if("human") + if(GIB_TYPE_HUMAN) new /obj/effect/gibspawner/human(get_turf(src), src, get_static_viruses()) - if("robotic") + if(GIB_TYPE_ROBOTIC) new /obj/effect/gibspawner/robot(get_turf(src)) else switch(dna.species.species_gibs) - if("human") + if(GIB_TYPE_HUMAN) new /obj/effect/gibspawner/human(get_turf(src), src, get_static_viruses()) - if("robotic") + if(GIB_TYPE_ROBOTIC) new /obj/effect/gibspawner/robot(get_turf(src)) /mob/living/carbon/human/spawn_dust(just_ash = FALSE) + if(!dna) + new /obj/effect/decal/remains/human(loc) + return if(just_ash) new /obj/effect/decal/cleanable/ash(loc) else switch(dna.species.species_gibs) - if("human") + if(GIB_TYPE_HUMAN) new /obj/effect/decal/remains/human(loc) - if("robotic") + if(GIB_TYPE_ROBOTIC) new /obj/effect/decal/remains/robot(loc) /mob/living/carbon/human/death(gibbed) @@ -71,11 +83,16 @@ /mob/living/carbon/human/proc/makeSkeleton() ADD_TRAIT(src, TRAIT_DISFIGURED, TRAIT_GENERIC) set_species(/datum/species/skeleton) - return 1 + return TRUE /mob/living/carbon/proc/Drain() become_husk(CHANGELING_DRAIN) ADD_TRAIT(src, TRAIT_BADDNA, CHANGELING_DRAIN) blood_volume = 0 - return 1 + return TRUE + +/mob/living/carbon/proc/makeUncloneable() + ADD_TRAIT(src, TRAIT_BADDNA, MADE_UNCLONEABLE) + blood_volume = 0 + return TRUE diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index dcb1557b67202..85c321704a409 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -4,51 +4,51 @@ /datum/emote/living/carbon/human/cry key = "cry" key_third_person = "cries" - message = "cries." + message = "cries" emote_type = EMOTE_AUDIBLE /datum/emote/living/carbon/human/dap key = "dap" key_third_person = "daps" - message = "sadly can't find anybody to give daps to, and daps themself. Shameful." - message_param = "give daps to %t." + message = "sadly can't find anybody to give daps to, and daps themself. Shameful" + message_param = "give daps to %t" restraint_check = TRUE /datum/emote/living/carbon/human/eyebrow key = "eyebrow" - message = "raises an eyebrow." + message = "raises an eyebrow" /datum/emote/living/carbon/human/grumble key = "grumble" key_third_person = "grumbles" - message = "grumbles!" + message = "grumbles" emote_type = EMOTE_AUDIBLE /datum/emote/living/carbon/human/handshake key = "handshake" - message = "shakes their own hands." - message_param = "shakes hands with %t." + message = "shakes their own hand" + message_param = "shakes hands with %t" restraint_check = TRUE emote_type = EMOTE_AUDIBLE /datum/emote/living/carbon/human/hug key = "hug" key_third_person = "hugs" - message = "hugs themself." - message_param = "hugs %t." + message = "hugs themself" + message_param = "hugs %t" restraint_check = TRUE emote_type = EMOTE_AUDIBLE /datum/emote/living/carbon/human/mumble key = "mumble" key_third_person = "mumbles" - message = "mumbles!" + message = "mumbles" emote_type = EMOTE_AUDIBLE /datum/emote/living/carbon/human/scream key = "scream" key_third_person = "screams" - message = "screams!" + message = "screams" emote_type = EMOTE_AUDIBLE vary = TRUE @@ -71,30 +71,30 @@ /datum/emote/living/carbon/human/pale key = "pale" - message = "goes pale for a second." + message = "goes pale for a second" /datum/emote/living/carbon/human/raise key = "raise" key_third_person = "raises" - message = "raises a hand." + message = "raises a hand" restraint_check = TRUE /datum/emote/living/carbon/human/salute key = "salute" key_third_person = "salutes" - message = "salutes." - message_param = "salutes to %t." + message = "salutes" + message_param = "salutes to %t" restraint_check = TRUE /datum/emote/living/carbon/human/shrug key = "shrug" key_third_person = "shrugs" - message = "shrugs." + message = "shrugs" /datum/emote/living/carbon/human/wag key = "wag" key_third_person = "wags" - message = "wags their tail." + message = "wags their tail" /datum/emote/living/carbon/human/wag/run_emote(mob/user, params, type_override, intentional) . = ..() @@ -125,7 +125,7 @@ /datum/emote/living/carbon/human/wing key = "wing" key_third_person = "wings" - message = "their wings." + message = "their wings" /datum/emote/living/carbon/human/wing/run_emote(mob/user, params, type_override, intentional) . = ..() @@ -161,7 +161,7 @@ /datum/emote/living/carbon/human/fart key = "fart" key_third_person = "farts" - message = "farts!" + message = "farts" emote_type = EMOTE_AUDIBLE vary = TRUE @@ -184,8 +184,8 @@ /datum/emote/living/carbon/human/robot_tongue/beep key = "beep" key_third_person = "beeps" - message = "beeps." - message_param = "beeps at %t." + message = "beeps" + message_param = "beeps at %t" /datum/emote/living/carbon/human/robot_tongue/beep/run_emote(mob/user, params) if(..()) @@ -194,8 +194,8 @@ /datum/emote/living/carbon/human/robot_tongue/buzz key = "buzz" key_third_person = "buzzes" - message = "buzzes." - message_param = "buzzes at %t." + message = "buzzes" + message_param = "buzzes at %t" /datum/emote/living/carbon/human/robot_tongue/buzz/run_emote(mob/user, params) if(..()) @@ -203,7 +203,7 @@ /datum/emote/living/carbon/human/robot_tongue/buzz2 key = "buzz2" - message = "buzzes twice." + message = "buzzes twice" /datum/emote/living/carbon/human/robot_tongue/buzz2/run_emote(mob/user, params) if(..()) @@ -212,7 +212,7 @@ /datum/emote/living/carbon/human/robot_tongue/chime key = "chime" key_third_person = "chimes" - message = "chimes." + message = "chimes" /datum/emote/living/carbon/human/robot_tongue/chime/run_emote(mob/user, params) if(..()) @@ -221,8 +221,8 @@ /datum/emote/living/carbon/human/robot_tongue/ping key = "ping" key_third_person = "pings" - message = "pings." - message_param = "pings at %t." + message = "pings" + message_param = "pings at %t" /datum/emote/living/carbon/human/robot_tongue/ping/run_emote(mob/user, params) if(..()) @@ -239,7 +239,7 @@ /datum/emote/living/carbon/human/robot_tongue/clown/honk key = "honk" key_third_person = "honks" - message = "honks." + message = "honks" /datum/emote/living/carbon/human/robot_tongue/clown/honk/run_emote(mob/user, params) if(..()) @@ -247,8 +247,8 @@ /datum/emote/living/carbon/human/robot_tongue/clown/sad key = "sad" - key_third_person = "plays a sad trombone..." - message = "plays a sad trombone..." + key_third_person = "plays a sad trombone" + message = "plays a sad trombone" /datum/emote/living/carbon/human/robot_tongue/clown/sad/run_emote(mob/user, params) if(..()) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 9be79bcbb7dbf..7b7f3273048e6 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -6,6 +6,7 @@ var/t_him = p_them() var/t_has = p_have() var/t_is = p_are() + var/t_es = p_es() var/obscure_name if(isliving(user)) @@ -19,7 +20,7 @@ var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) //uniform - if(w_uniform && !(SLOT_W_UNIFORM in obscured)) + if(w_uniform && !(ITEM_SLOT_ICLOTHING in obscured)) //accessory var/accessory_msg if(istype(w_uniform, /obj/item/clothing/under)) @@ -35,7 +36,7 @@ if(wear_suit) . += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)]." //suit/armor storage - if(s_store && !(SLOT_S_STORE in obscured)) + if(s_store && !(ITEM_SLOT_SUITSTORE in obscured)) . += "[t_He] [t_is] carrying [s_store.get_examine_string(user)] on [t_his] [wear_suit.name]." //back if(back) @@ -48,7 +49,7 @@ var/datum/component/forensics/FR = GetComponent(/datum/component/forensics) //gloves - if(gloves && !(SLOT_GLOVES in obscured)) + if(gloves && !(ITEM_SLOT_GLOVES in obscured)) . += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands." else if(FR && length(FR.blood_DNA)) var/hand_number = get_num_arms(FALSE) @@ -69,25 +70,25 @@ . += "[t_He] [t_has] [belt.get_examine_string(user)] about [t_his] waist." //shoes - if(shoes && !(SLOT_SHOES in obscured)) + if(shoes && !(ITEM_SLOT_FEET in obscured)) . += "[t_He] [t_is] wearing [shoes.get_examine_string(user)] on [t_his] feet." //mask - if(wear_mask && !(SLOT_WEAR_MASK in obscured)) + if(wear_mask && !(ITEM_SLOT_MASK in obscured)) . += "[t_He] [t_has] [wear_mask.get_examine_string(user)] on [t_his] face." - if(wear_neck && !(SLOT_NECK in obscured)) + if(wear_neck && !(ITEM_SLOT_NECK in obscured)) . += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck." //eyes - if(!(SLOT_GLASSES in obscured)) + if(!(ITEM_SLOT_EYES in obscured)) if(glasses) . += "[t_He] [t_has] [glasses.get_examine_string(user)] covering [t_his] eyes." else if(eye_color == BLOODCULT_EYE && iscultist(src) && HAS_TRAIT(src, CULT_EYES)) . += "[t_His] eyes are glowing an unnatural red!" //ears - if(ears && !(SLOT_EARS in obscured)) + if(ears && !(ITEM_SLOT_EARS in obscured)) . += "[t_He] [t_has] [ears.get_examine_string(user)] on [t_his] ears." //ID @@ -114,27 +115,33 @@ if(hellbound) . += "[t_His] soul seems to have been ripped out of [t_his] body. Revival is impossible." . += "" - if(getorgan(/obj/item/organ/brain) && !key && !get_ghost(FALSE, TRUE)) - . += "[t_He] [t_is] limp and unresponsive; there are no signs of life and [t_his] soul has departed." - else - . += "[t_He] [t_is] limp and unresponsive; there are no signs of life." + if(getorgan(/obj/item/organ/brain)) + if(ai_controller?.ai_status == AI_STATUS_ON) + . += "[t_He] do[t_es]n't appear to be [t_him]self.\n" + else if(!key && !get_ghost(FALSE, TRUE)) + . += "[t_He] [t_is] limp and unresponsive; there are no signs of life and [t_his] soul has departed." + else + . += "[t_He] [t_is] limp and unresponsive; there are no signs of life." if(get_bodypart(BODY_ZONE_HEAD) && !getorgan(/obj/item/organ/brain)) . += "It appears that [t_his] brain is missing." var/temp = getBruteLoss() //no need to calculate each of these twice - var/list/msg = list("") - - var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + 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) - 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] [icon2html(I, user)] \a [I] stuck to [t_his] [BP.name]!\n" + else + msg += "[t_He] [t_has] [icon2html(I, user)] \a [I] embedded in [t_his] [BP.name]!\n" for(var/X in disabled) var/obj/item/bodypart/BP = X @@ -166,23 +173,32 @@ else if(l_limbs_missing >= 2 && r_limbs_missing >= 2) msg += "[t_He] [p_do()]n't seem all there.\n" + var/list/harm_descriptors = dna?.species.get_harm_descriptors() + var/brute_msg = harm_descriptors?["brute"] + var/burn_msg = harm_descriptors?["burn"] + var/bleed_msg = harm_descriptors?["bleed"] + + brute_msg = brute_msg ? brute_msg : "bruising" + burn_msg = burn_msg ? burn_msg : "burns" + bleed_msg = bleed_msg ? bleed_msg : "bleeding" + if(!(user == src && src.hal_screwyhud == SCREWYHUD_HEALTHY)) //fake healthy if(temp) if(temp < 25) - msg += "[t_He] [t_has] minor bruising.\n" + msg += "[t_He] [t_has] minor [brute_msg].\n" else if(temp < 50) - msg += "[t_He] [t_has] moderate bruising!\n" + msg += "[t_He] [t_has] moderate [brute_msg]!\n" else - msg += "[t_He] [t_has] severe bruising!\n" + msg += "[t_He] [t_has] severe [brute_msg]!\n" temp = getFireLoss() if(temp) if(temp < 25) - msg += "[t_He] [t_has] minor burns.\n" + msg += "[t_He] [t_has] minor [burn_msg].\n" else if (temp < 50) - msg += "[t_He] [t_has] moderate burns!\n" + msg += "[t_He] [t_has] moderate [burn_msg]!\n" else - msg += "[t_He] [t_has] severe burns!\n" + msg += "[t_He] [t_has] severe [burn_msg]!\n" temp = getCloneLoss() if(temp) @@ -225,9 +241,9 @@ msg += "[t_He] [t_is] bandaged with something.\n" else if(bleed_rate) if(reagents.has_reagent(/datum/reagent/toxin/heparin, needs_metabolizing = TRUE)) - msg += "[t_He] [t_is] bleeding uncontrollably!\n" + msg += "[t_He] [t_is] [bleed_msg] uncontrollably!\n" else - msg += "[t_He] [t_is] bleeding!\n" + msg += "[t_He] [t_is] [bleed_msg]!\n" if(reagents.has_reagent(/datum/reagent/teslium, needs_metabolizing = TRUE)) msg += "[t_He] [t_is] emitting a gentle blue glow!\n" @@ -271,6 +287,10 @@ msg += "" + if(HAS_TRAIT(user, TRAIT_SPIRITUAL) && mind?.holy_role) + msg += "[t_He] [t_has] a holy aura about [t_him].\n" + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "religious_comfort", /datum/mood_event/religiously_comforted) + if(!appears_dead) if(stat == UNCONSCIOUS) msg += "[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.\n" @@ -280,12 +300,14 @@ if(InCritical()) msg += "[t_He] [t_is] barely conscious.\n" if(getorgan(/obj/item/organ/brain)) + if(ai_controller?.ai_status == AI_STATUS_ON) + msg += "[t_He] do[t_es]n't appear to be [t_him]self.\n" if(!key) msg += "[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely.\n" else if(!client) msg += "[t_He] [t_has] a blank, absent-minded stare and appears completely unresponsive to anything. [t_He] may snap out of it soon.\n" - if(digitalcamo) + if(HAS_TRAIT(src, TRAIT_DIGICAMO)) msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n" if (length(msg)) @@ -296,51 +318,47 @@ . += trait_exam var/traitstring = get_trait_string() - if(ishuman(user)) - var/mob/living/carbon/human/H = user - var/obj/item/organ/cyberimp/eyes/hud/CIH = H.getorgan(/obj/item/organ/cyberimp/eyes/hud) - if(istype(H.glasses, /obj/item/clothing/glasses/hud) || CIH) - var/perpname = get_face_name(get_id_name("")) - if(perpname) - var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.general) + + var/perpname = get_face_name(get_id_name("")) + if(perpname && (HAS_TRAIT(user, TRAIT_SECURITY_HUD) || HAS_TRAIT(user, TRAIT_MEDICAL_HUD))) + var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.general) + if(R) + . += "Rank: [R.fields["rank"]]\n\[Front photo\]\[Side photo\]" + if(HAS_TRAIT(user, TRAIT_MEDICAL_HUD)) + var/list/cyberimp_detect = list() + for(var/obj/item/organ/cyberimp/CI in internal_organs) + if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant) + cyberimp_detect += CI.name + if(length(cyberimp_detect)) + . += "Detected cybernetic modifications: [english_list(cyberimp_detect)]" + if(R) + var/health_r = R.fields["p_stat"] + . += "\[[health_r]\]" + health_r = R.fields["m_stat"] + . += "\[[health_r]\]" + R = find_record("name", perpname, GLOB.data_core.medical) + if(R) + . += "\[Medical evaluation\]
" + if(traitstring) + . += "Detected physiological traits:\n[traitstring]" + + if(HAS_TRAIT(user, TRAIT_SECURITY_HUD)) + if(!user.stat && user != src) + //|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. + var/criminal = "None" + + R = find_record("name", perpname, GLOB.data_core.security) if(R) - . += "Rank: [R.fields["rank"]]\n\[Front photo\]\[Side photo\]" - if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH, /obj/item/organ/cyberimp/eyes/hud/medical)) - var/cyberimp_detect - for(var/obj/item/organ/cyberimp/CI in internal_organs) - if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant) - cyberimp_detect += "[name] is modified with a [CI.name]." - if(cyberimp_detect) - . += "Detected cybernetic modifications:" - . += cyberimp_detect - if(R) - var/health_r = R.fields["p_stat"] - . += "\[[health_r]\]" - health_r = R.fields["m_stat"] - . += "\[[health_r]\]" - R = find_record("name", perpname, GLOB.data_core.medical) - if(R) - . += "\[Medical evaluation\]
" - if(traitstring) - . += "Detected physiological traits:\n[traitstring]" - - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(CIH, /obj/item/organ/cyberimp/eyes/hud/security)) - if(!user.stat && user != src) - //|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. - var/criminal = "None" - - R = find_record("name", perpname, GLOB.data_core.security) - if(R) - criminal = R.fields["criminal"] - - . += "Criminal status: \[[criminal]\]" - . += jointext(list("Security record: \[View\]", - "\[Add citation\]", - "\[Add crime\]", - "\[View comment log\]", - "\[Add comment\]"), "") + criminal = R.fields["criminal"] + + . += "Criminal status: \[[criminal]\]" + . += jointext(list("Security record: \[View\]", + "\[Add citation\]", + "\[Add crime\]", + "\[View comment log\]", + "\[Add comment\]"), "") else if(isobserver(user) && traitstring) - . += "Traits: [traitstring]
" + . += "Traits: [traitstring]" . += "*---------*
" /mob/living/proc/status_effect_examines(pronoun_replacement) //You can include this in any mob's examine() to show the examine texts of status effects! diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 22597bf744a98..a8e9dcde2a53d 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -6,8 +6,8 @@ appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE /mob/living/carbon/human/Initialize() - verbs += /mob/living/proc/mob_sleep - verbs += /mob/living/proc/lay_down + add_verb(/mob/living/proc/mob_sleep) + add_verb(/mob/living/proc/lay_down) icon_state = "" //Remove the inherent human icon that is visible on the map editor. We're rendering ourselves limb by limb, having it still be there results in a bug where the basic human icon appears below as south in all directions and generally looks nasty. @@ -41,6 +41,7 @@ /mob/living/carbon/human/Destroy() QDEL_NULL(physiology) + QDEL_LIST(bioware) return ..() @@ -54,59 +55,71 @@ //...and display them. add_to_all_human_data_huds() -/mob/living/carbon/human/Stat() - ..() +/mob/living/carbon/human/get_stat_tabs() + var/list/tabs = ..() + if(istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)) + tabs.Insert(1, "SpiderOS") + return tabs - if(statpanel("Status")) - stat(null, "Intent: [a_intent]") - stat(null, "Move Mode: [m_intent]") - if (internal) - if (!internal.air_contents) - qdel(internal) - else - stat(null, "Internal Atmosphere Info: [internal.name]") - stat(null, "Tank Pressure: [internal.air_contents.return_pressure()]") - stat(null, "Distribution Pressure: [internal.distribute_pressure]") - - if(mind) - var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling) - if(changeling) - stat(null, "Chemical Storage: [changeling.chem_charges]/[changeling.chem_storage]") - stat(null, "Absorbed DNA: [changeling.absorbedcount]") - var/datum/antagonist/hivemind/hivemind = mind.has_antag_datum(/datum/antagonist/hivemind) - if(hivemind) - stat(null, "Hivemind Vessels: [hivemind.hive_size] (+[hivemind.size_mod])") - stat(null, "Psychic Link Duration: [(hivemind.track_bonus + TRACKER_DEFAULT_TIME)/10] seconds") - - //NINJACODE - if(istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)) //Only display if actually a ninja. +//Ninja Code +/mob/living/carbon/human/get_stat(selected_tab) + if(selected_tab == "SpiderOS") + var/list/tab_data = list() var/obj/item/clothing/suit/space/space_ninja/SN = wear_suit - if(statpanel("SpiderOS")) - stat(null,"SpiderOS Status: [SN.s_initialized ? "Initialized" : "Disabled"]") - stat(null, "Current Time: [station_time_timestamp()]") - if(SN.s_initialized) - //Suit gear - stat(null, "Energy Charge: [round(SN.cell.charge/100)]%") - stat(null, "Smoke Bombs: \Roman [SN.s_bombs]") - //Ninja status - stat(null, "Fingerprints: [rustg_hash_string(RUSTG_HASH_MD5, dna.uni_identity)]") - stat(null, "Unique Identity: [dna.unique_enzymes]") - stat(null, "Overall Status: [stat > 1 ? "dead" : "[health]% healthy"]") - stat(null, "Nutrition Status: [nutrition]") - stat(null, "Oxygen Loss: [getOxyLoss()]") - stat(null, "Toxin Levels: [getToxLoss()]") - stat(null, "Burn Severity: [getFireLoss()]") - stat(null, "Brute Trauma: [getBruteLoss()]") - stat(null,"Radiation Levels: [radiation] rad") - stat(null,"Body Temperature: [bodytemperature-T0C] degrees C ([bodytemperature*1.8-459.67] degrees F)") - - //Diseases - if(diseases.len) - stat(null, "Viruses:") - for(var/thing in diseases) - var/datum/disease/D = thing - stat(null, "* [D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]") + if(!SN) + return + tab_data["SpiderOS Status"] = GENERATE_STAT_TEXT("[SN.s_initialized ? "Initialized" : "Disabled"]") + tab_data["Current Time"] = GENERATE_STAT_TEXT("[station_time_timestamp()]") + tab_data["divider_spideros"] = GENERATE_STAT_DIVIDER + if(SN.s_initialized) + //Suit gear + tab_data["Energy Charge"] = GENERATE_STAT_TEXT("[round(SN.cell.charge/100)]%") + tab_data["Smoke Bombs"] = GENERATE_STAT_TEXT("[SN.s_bombs]") + //Ninja status + tab_data["Fingerprints"] = GENERATE_STAT_TEXT("[rustg_hash_string(RUSTG_HASH_MD5, dna.uni_identity)]") + tab_data["Unique Identity"] = GENERATE_STAT_TEXT("[dna.unique_enzymes]") + tab_data["Overall Status"] = GENERATE_STAT_TEXT("[stat > 1 ? "dead" : "[health]% healthy"]") + tab_data["Nutrition Status"] = GENERATE_STAT_TEXT("[nutrition]") + tab_data["Oxygen Loss"] = GENERATE_STAT_TEXT("[getOxyLoss()]") + tab_data["Toxin Levels"] = GENERATE_STAT_TEXT("[getToxLoss()]") + tab_data["Burn Severity"] = GENERATE_STAT_TEXT("[getFireLoss()]") + tab_data["Brute Trauma"] = GENERATE_STAT_TEXT("[getBruteLoss()]") + tab_data["Radiation Levels"] = GENERATE_STAT_TEXT("[radiation] rad") + tab_data["Body Temperature"] = GENERATE_STAT_TEXT("[bodytemperature-T0C] degrees C ([bodytemperature*1.8-459.67] degrees F)") + + //Diseases + if(diseases.len) + tab_data["DivSpiderOs2"] = GENERATE_STAT_DIVIDER + tab_data["Viruses"] = GENERATE_STAT_TEXT("") + for(var/thing in diseases) + var/datum/disease/D = thing + tab_data["* [D.name]"] = GENERATE_STAT_TEXT("Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]") + return tab_data + return ..() + +/mob/living/carbon/human/get_stat_tab_status() + var/list/tab_data = ..() + tab_data["Intent"] = GENERATE_STAT_TEXT("[a_intent]") + tab_data["Move Mode"] = GENERATE_STAT_TEXT("[m_intent]") + if (internal) + if (!internal.air_contents) + qdel(internal) + else + tab_data["Internal Atmosphere Info"] = GENERATE_STAT_TEXT("[internal.name]") + tab_data["Tank Pressure"] = GENERATE_STAT_TEXT("[internal.air_contents.return_pressure()]") + tab_data["Distribution Pressure"] = GENERATE_STAT_TEXT("[internal.distribute_pressure]") + + if(mind) + var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling) + if(changeling) + tab_data["Chemical Storage"] = GENERATE_STAT_TEXT("[changeling.chem_charges]/[changeling.chem_storage]") + tab_data["Absorbed DNA"] = GENERATE_STAT_TEXT("[changeling.absorbedcount]") + var/datum/antagonist/hivemind/hivemind = mind.has_antag_datum(/datum/antagonist/hivemind) + if(hivemind) + tab_data["Hivemind Vessels"] = GENERATE_STAT_TEXT("[hivemind.hive_size] (+[hivemind.size_mod])") + tab_data["Psychic Link Duration"] = GENERATE_STAT_TEXT("[(hivemind.track_bonus + TRACKER_DEFAULT_TIME)/10] seconds") + return tab_data /mob/living/carbon/human/show_inv(mob/user) user.set_machine(src) @@ -117,83 +130,87 @@ dat += "" for(var/i in 1 to held_items.len) var/obj/item/I = get_item_for_held_index(i) - dat += "" + dat += "" dat += "" - dat += "" - dat += "" + dat += "" - if(SLOT_WEAR_MASK in obscured) + if(ITEM_SLOT_MASK in obscured) dat += "" else - dat += "" + dat += "" - if(SLOT_NECK in obscured) + if(ITEM_SLOT_NECK in obscured) dat += "" else - dat += "" + dat += "" - if(SLOT_GLASSES in obscured) + if(ITEM_SLOT_EYES in obscured) dat += "" else - dat += "" + dat += "" - if(SLOT_EARS in obscured) + if(ITEM_SLOT_EARS in obscured) dat += "" else - dat += "" + dat += "" dat += "" - dat += "" + dat += "" if(wear_suit) - if(SLOT_S_STORE in obscured) + if(ITEM_SLOT_SUITSTORE in obscured) dat += "" else - dat += "" else dat += "" - if(SLOT_SHOES in obscured) + if(ITEM_SLOT_FEET in obscured) dat += "" else - dat += "" + dat += "" - if(SLOT_GLOVES in obscured) + if(ITEM_SLOT_GLOVES in obscured) dat += "" else - dat += "" + dat += "" - if(SLOT_W_UNIFORM in obscured) + if(ITEM_SLOT_ICLOTHING in obscured) dat += "" else - dat += "" + dat += "" - if((w_uniform == null && !(dna && dna.species.nojumpsuit)) || (SLOT_W_UNIFORM in obscured)) + if((w_uniform == null && !(dna && dna.species.nojumpsuit)) || (ITEM_SLOT_ICLOTHING in obscured)) dat += "" dat += "" dat += "" else - dat += "" dat += "" - dat += "" + dat += "" + + if(istype(w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/U = w_uniform + dat += "" if(handcuffed) - dat += "" + dat += "" if(legcuffed) - dat += "" + dat += "" dat += {"
[get_held_index_name(i)]:[(I && !(I.item_flags & ABSTRACT)) ? I : "Empty"]
[get_held_index_name(i)]:[(I && !(I.item_flags & ABSTRACT)) ? I : "Empty"]
 
Back:[(back && !(back.item_flags & ABSTRACT)) ? back : "Empty"]" + dat += "
Back:[(back && !(back.item_flags & ABSTRACT)) ? back : "Empty"]" if(has_breathable_mask && istype(back, /obj/item/tank)) - dat += " [internal ? "Disable Internals" : "Set Internals"]" + dat += " [internal ? "Disable Internals" : "Set Internals"]" dat += "
 
Head:[(head && !(head.item_flags & ABSTRACT)) ? head : "Empty"]
Head:[(head && !(head.item_flags & ABSTRACT)) ? head : "Empty"]
Mask:Obscured
Mask:[(wear_mask && !(wear_mask.item_flags & ABSTRACT)) ? wear_mask : "Empty"]
Mask:[(wear_mask && !(wear_mask.item_flags & ABSTRACT)) ? wear_mask : "Empty"]
Neck:Obscured
Neck:[(wear_neck && !(wear_neck.item_flags & ABSTRACT)) ? wear_neck : "Empty"]
Neck:[(wear_neck && !(wear_neck.item_flags & ABSTRACT)) ? wear_neck : "Empty"]
Eyes:Obscured
Eyes:[(glasses && !(glasses.item_flags & ABSTRACT)) ? glasses : "Empty"]
Eyes:[(glasses && !(glasses.item_flags & ABSTRACT)) ? glasses : "Empty"]
Ears:Obscured
Ears:[(ears && !(ears.item_flags & ABSTRACT)) ? ears : "Empty"]
Ears:[(ears && !(ears.item_flags & ABSTRACT)) ? ears : "Empty"]
 
Exosuit:[(wear_suit && !(wear_suit.item_flags & ABSTRACT)) ? wear_suit : "Empty"]
Exosuit:[(wear_suit && !(wear_suit.item_flags & ABSTRACT)) ? wear_suit : "Empty"]
 ↳Suit Storage:
 ↳Suit Storage:[(s_store && !(s_store.item_flags & ABSTRACT)) ? s_store : "Empty"]" + dat += "
 ↳Suit Storage:[(s_store && !(s_store.item_flags & ABSTRACT)) ? s_store : "Empty"]" if(has_breathable_mask && istype(s_store, /obj/item/tank)) - dat += " [internal ? "Disable Internals" : "Set Internals"]" + dat += " [internal ? "Disable Internals" : "Set Internals"]" dat += "
 ↳Suit Storage:
Shoes:Obscured
Shoes:[(shoes && !(shoes.item_flags & ABSTRACT)) ? shoes : "Empty"]
Shoes:[(shoes && !(shoes.item_flags & ABSTRACT)) ? shoes : "Empty"]
Gloves:Obscured
Gloves:[(gloves && !(gloves.item_flags & ABSTRACT)) ? gloves : "Empty"]
Gloves:[(gloves && !(gloves.item_flags & ABSTRACT)) ? gloves : "Empty"]
Uniform:Obscured
Uniform:[(w_uniform && !(w_uniform.item_flags & ABSTRACT)) ? w_uniform : "Empty"]
Uniform:[(w_uniform && !(w_uniform.item_flags & ABSTRACT)) ? w_uniform : "Empty"]
 ↳Pockets:
 ↳ID:
 ↳Belt:
 ↳Belt:[(belt && !(belt.item_flags & ABSTRACT)) ? belt : "Empty"]" + dat += "
 ↳Belt:[(belt && !(belt.item_flags & ABSTRACT)) ? belt : "Empty"]" if(has_breathable_mask && istype(belt, /obj/item/tank)) - dat += " [internal ? "Disable Internals" : "Set Internals"]" + dat += " [internal ? "Disable Internals" : "Set Internals"]" dat += "
 ↳Pockets:[(l_store && !(l_store.item_flags & ABSTRACT)) ? "Left (Full)" : "Left (Empty)"]" dat += " [(r_store && !(r_store.item_flags & ABSTRACT)) ? "Right (Full)" : "Right (Empty)"]
 ↳ID:[(wear_id && !(wear_id.item_flags & ABSTRACT)) ? wear_id : "Empty"]
 ↳ID:[(wear_id && !(wear_id.item_flags & ABSTRACT)) ? wear_id : "Empty"]
 ↳Suit Sensors:[U.has_sensor >= 2 ? "--SENSORS LOCKED--" : "Set Sensors"]
Handcuffed: Remove
Handcuffed: Remove
Legcuffed
Legcuffed
Close @@ -224,20 +241,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 - 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)) - 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"]) //canUseTopic check for this is handled by mob/Topic() @@ -248,8 +252,8 @@ if(href_list["pockets"] && usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) //TODO: Make it match (or intergrate it into) strippanel so you get 'item cannot fit here' warnings if mob_can_equip fails var/pocket_side = href_list["pockets"] - var/pocket_id = (pocket_side == "right" ? SLOT_R_STORE : SLOT_L_STORE) - var/obj/item/pocket_item = (pocket_id == SLOT_R_STORE ? r_store : l_store) + var/pocket_id = (pocket_side == "right" ? ITEM_SLOT_RPOCKET : ITEM_SLOT_LPOCKET) + var/obj/item/pocket_item = (pocket_id == ITEM_SLOT_RPOCKET ? r_store : l_store) var/obj/item/place_item = usr.get_active_held_item() // Item to place in the pocket, if it's empty var/delay_denominator = 1 @@ -265,7 +269,7 @@ if(do_mob(usr, src, POCKET_STRIP_DELAY/delay_denominator)) //placing an item into the pocket is 4 times faster if(pocket_item) - if(pocket_item == (pocket_id == SLOT_R_STORE ? r_store : l_store)) //item still in the pocket we search + if(pocket_item == (pocket_id == ITEM_SLOT_RPOCKET ? r_store : l_store)) //item still in the pocket we search dropItemToGround(pocket_item) else if(place_item) @@ -278,246 +282,255 @@ // Display a warning if the user mocks up to_chat(src, "You feel your [pocket_side] pocket being fumbled with!") + if(href_list["set_sensor"]) + if(istype(w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/U = w_uniform + U.set_sensors(usr) + ///////HUDs/////// if(href_list["hud"]) - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - var/perpname = get_face_name(get_id_name("")) - if(istype(H.glasses, /obj/item/clothing/glasses/hud) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud)) - var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.general) - if(href_list["photo_front"] || href_list["photo_side"]) - if(R) - if(!H.canUseHUD()) - return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) - return - var/obj/item/photo/P = null - if(href_list["photo_front"]) - P = R.fields["photo_front"] - else if(href_list["photo_side"]) - P = R.fields["photo_side"] - if(P) - P.show(H) - - if(href_list["hud"] == "m") - if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) - if(href_list["p_stat"]) - var/health_status = input(usr, "Specify a new physical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("Active", "Physically Unfit", "*Unconscious*", "*Deceased*", "Cancel") - if(R) - if(!H.canUseHUD()) - return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) - return - if(health_status && health_status != "Cancel") - R.fields["p_stat"] = health_status - return - if(href_list["m_stat"]) - var/health_status = input(usr, "Specify a new mental status for this person.", "Medical HUD", R.fields["m_stat"]) in list("Stable", "*Watch*", "*Unstable*", "*Insane*", "Cancel") - if(R) - if(!H.canUseHUD()) - return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) - return - if(health_status && health_status != "Cancel") - R.fields["m_stat"] = health_status - return - if(href_list["evaluation"]) - if(!getBruteLoss() && !getFireLoss() && !getOxyLoss() && getToxLoss() < 20) - to_chat(usr, "No external injuries detected.
") - return - var/span = "notice" - var/status = "" - if(getBruteLoss()) - to_chat(usr, "Physical trauma analysis:") - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X - var/brutedamage = BP.brute_dam - if(brutedamage > 0) - status = "received minor physical injuries." - span = "notice" - if(brutedamage > 20) - status = "been seriously damaged." - span = "danger" - if(brutedamage > 40) - status = "sustained major trauma!" - span = "userdanger" - if(brutedamage) - to_chat(usr, "[BP] appears to have [status]") - if(getFireLoss()) - to_chat(usr, "Analysis of skin burns:") - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X - var/burndamage = BP.burn_dam - if(burndamage > 0) - status = "signs of minor burns." - span = "notice" - if(burndamage > 20) - status = "serious burns." - span = "danger" - if(burndamage > 40) - status = "major burns!" - span = "userdanger" - if(burndamage) - to_chat(usr, "[BP] appears to have [status]") - if(getOxyLoss()) - to_chat(usr, "Patient has signs of suffocation, emergency treatment may be required!") - if(getToxLoss() > 20) - to_chat(usr, "Gathered data is inconsistent with the analysis, possible cause: poisoning.") - - if(href_list["hud"] == "s") - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) - if(usr.stat || usr == src) //|| !usr.canmove || usr.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. - return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten - // Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access - var/allowed_access = null - var/obj/item/clothing/glasses/hud/security/G = H.glasses - if(istype(G) && (G.obj_flags & EMAGGED)) - allowed_access = "@%&ERROR_%$*" - else //Implant and standard glasses check access - if(H.wear_id) - var/list/access = H.wear_id.GetAccess() - if(ACCESS_SEC_DOORS in access) - allowed_access = H.get_authentification_name() - - if(!allowed_access) - to_chat(H, "ERROR: Invalid Access.") - return - - if(perpname) - R = find_record("name", perpname, GLOB.data_core.security) - if(R) - if(href_list["status"]) - var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Paroled", "Discharged", "Cancel") - if(setcriminal != "Cancel") - if(R) - if(H.canUseHUD()) - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) - investigate_log("[key_name(src)] has been set from [R.fields["criminal"]] to [setcriminal] by [key_name(usr)].", INVESTIGATE_RECORDS) - R.fields["criminal"] = setcriminal - sec_hud_set_security_status() - return - - if(href_list["view"]) - if(R) - if(!H.canUseHUD()) - return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) - return - to_chat(usr, "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]") - to_chat(usr, "Minor Crimes:") - for(var/datum/data/crime/c in R.fields["mi_crim"]) - to_chat(usr, "Crime: [c.crimeName]") - to_chat(usr, "Details: [c.crimeDetails]") - to_chat(usr, "Added by [c.author] at [c.time]") - to_chat(usr, "----------") - to_chat(usr, "Major Crimes:") - for(var/datum/data/crime/c in R.fields["ma_crim"]) - to_chat(usr, "Crime: [c.crimeName]") - to_chat(usr, "Details: [c.crimeDetails]") - to_chat(usr, "Added by [c.author] at [c.time]") - to_chat(usr, "----------") - to_chat(usr, "Notes: [R.fields["notes"]]") - return - - if(href_list["add_citation"]) - var/maxFine = CONFIG_GET(number/maxfine) - var/t1 = stripped_input("Please input citation crime:", "Security HUD", "", null) - var/fine = FLOOR(input("Please input citation fine, up to [maxFine]:", "Security HUD", 50) as num|null, 1) - if(!R || !t1 || !fine || !allowed_access) - return - if(!H.canUseHUD()) - return - if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) - return - if(fine < 0) - to_chat(usr, "You're pretty sure that's not how money works.") - return - fine = min(fine, maxFine) - - var/crime = GLOB.data_core.createCrimeEntry(t1, "", allowed_access, station_time_timestamp(), fine) - for (var/obj/item/pda/P in GLOB.PDAs) - if(P.owner == R.fields["name"]) - var/message = "You have been fined [fine] credits for '[t1]'. Fines may be paid at security." - var/datum/signal/subspace/messaging/pda/signal = new(src, list( - "name" = "Security Citation", - "job" = "Citation Server", - "message" = message, - "targets" = list("[P.owner] ([P.ownjob])"), - "automated" = 1 - )) - signal.send_to_receivers() - usr.log_message("(PDA: Citation Server) sent \"[message]\" to [signal.format_target()]", LOG_PDA) - GLOB.data_core.addCitation(R.fields["id"], crime) - investigate_log("New Citation: [t1] Fine: [fine] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) - return - - if(href_list["add_crime"]) - switch(alert("What crime would you like to add?","Security HUD","Minor Crime","Major Crime","Cancel")) - if("Minor Crime") - if(R) - var/t1 = stripped_input(usr, "Please input minor crime names:", "Security HUD") - var/t2 = stripped_multiline_input(usr, "Please input minor crime details:", "Security HUD") - if(R) - if (!t1 || !t2 || !allowed_access) - return - else if(!H.canUseHUD()) - return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) - return - var/crime = GLOB.data_core.createCrimeEntry(t1, t2, allowed_access, station_time_timestamp()) - GLOB.data_core.addMinorCrime(R.fields["id"], crime) - investigate_log("New Minor Crime: [t1]: [t2] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) - to_chat(usr, "Successfully added a minor crime.") - return - if("Major Crime") - if(R) - var/t1 = stripped_input(usr, "Please input major crime names:", "Security HUD") - var/t2 = stripped_multiline_input(usr, "Please input major crime details:", "Security HUD") - if(R) - if (!t1 || !t2 || !allowed_access) - return - else if (!H.canUseHUD()) - return - else if (!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) - return - var/crime = GLOB.data_core.createCrimeEntry(t1, t2, allowed_access, station_time_timestamp()) - GLOB.data_core.addMajorCrime(R.fields["id"], crime) - investigate_log("New Major Crime: [t1]: [t2] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) - to_chat(usr, "Successfully added a major crime.") - return - - if(href_list["view_comment"]) - if(R) - if(!H.canUseHUD()) - return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) - return - to_chat(usr, "Comments/Log:") - var/counter = 1 - while(R.fields[text("com_[]", counter)]) - to_chat(usr, R.fields[text("com_[]", counter)]) - to_chat(usr, "----------") - counter++ - return - - if(href_list["add_comment"]) - if(R) - var/t1 = stripped_multiline_input(usr, "Add Comment:", "Secure. records") - if(R) - if (!t1 || !allowed_access) - return - else if(!H.canUseHUD()) - return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) - return - var/counter = 1 - while(R.fields[text("com_[]", counter)]) - counter++ - R.fields[text("com_[]", counter)] = text("Made by [] on [] [], []
[]", allowed_access, station_time_timestamp(), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) - to_chat(usr, "Successfully added comment.") - return - to_chat(usr, "Unable to locate a data core entry for this person.") + if(!ishuman(usr)) + return + var/mob/living/carbon/human/H = usr + var/perpname = get_face_name(get_id_name("")) + if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD) && !HAS_TRAIT(H, TRAIT_MEDICAL_HUD)) + return + var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.general) + if(href_list["photo_front"] || href_list["photo_side"]) + if(!R) + return + if(!H.canUseHUD()) + return + var/obj/item/photo/P = null + if(href_list["photo_front"]) + P = R.fields["photo_front"] + else if(href_list["photo_side"]) + P = R.fields["photo_side"] + if(P) + P.show(H) + return + + if(href_list["hud"] == "m") + if(!HAS_TRAIT(H, TRAIT_MEDICAL_HUD)) + return + if(href_list["evaluation"]) + if(!getBruteLoss() && !getFireLoss() && !getOxyLoss() && getToxLoss() < 20) + to_chat(usr, "No external injuries detected.
") + return + var/span = "notice" + var/status = "" + if(getBruteLoss()) + to_chat(usr, "Physical trauma analysis:") + for(var/X in bodyparts) + var/obj/item/bodypart/BP = X + var/brutedamage = BP.brute_dam + if(brutedamage > 0) + status = "received minor physical injuries." + span = "notice" + if(brutedamage > 20) + status = "been seriously damaged." + span = "danger" + if(brutedamage > 40) + status = "sustained major trauma!" + span = "userdanger" + if(brutedamage) + to_chat(usr, "[BP] appears to have [status]") + if(getFireLoss()) + to_chat(usr, "Analysis of skin burns:") + for(var/X in bodyparts) + var/obj/item/bodypart/BP = X + var/burndamage = BP.burn_dam + if(burndamage > 0) + status = "signs of minor burns." + span = "notice" + if(burndamage > 20) + status = "serious burns." + span = "danger" + if(burndamage > 40) + status = "major burns!" + span = "userdanger" + if(burndamage) + to_chat(usr, "[BP] appears to have [status]") + if(getOxyLoss()) + to_chat(usr, "Patient has signs of suffocation, emergency treatment may be required!") + if(getToxLoss() > 20) + to_chat(usr, "Gathered data is inconsistent with the analysis, possible cause: poisoning.") + if(!H.wear_id) //You require access from here on out. + to_chat(H, "ERROR: Invalid access") + return + var/list/access = H.wear_id.GetAccess() + if(!(ACCESS_MEDICAL in access)) + to_chat(H, "ERROR: Invalid access") + return + if(href_list["p_stat"]) + var/health_status = input(usr, "Specify a new physical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("Active", "Physically Unfit", "*Unconscious*", "*Deceased*", "Cancel") + if(!R) + return + if(!H.canUseHUD()) + return + if(!HAS_TRAIT(H, TRAIT_MEDICAL_HUD)) + return + if(health_status && health_status != "Cancel") + R.fields["p_stat"] = health_status + return + if(href_list["m_stat"]) + var/health_status = input(usr, "Specify a new mental status for this person.", "Medical HUD", R.fields["m_stat"]) in list("Stable", "*Watch*", "*Unstable*", "*Insane*", "Cancel") + if(!R) + return + if(!H.canUseHUD()) + return + if(!HAS_TRAIT(H, TRAIT_MEDICAL_HUD)) + return + if(health_status && health_status != "Cancel") + R.fields["m_stat"] = health_status + return + return //Medical HUD ends here. + + if(href_list["hud"] == "s") + if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + return + if(usr.stat || usr == src) //|| !usr.canmove || usr.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. + return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten + // Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access + var/allowed_access = null + var/obj/item/clothing/glasses/hud/security/G = H.glasses + if(istype(G) && (G.obj_flags & EMAGGED)) + allowed_access = "@%&ERROR_%$*" + else //Implant and standard glasses check access + if(H.wear_id) + var/list/access = H.wear_id.GetAccess() + if(ACCESS_SEC_RECORDS in access) + allowed_access = H.get_authentification_name() + + if(!allowed_access) + to_chat(H, "ERROR: Invalid access.") + return + + if(!perpname) + to_chat(H, "ERROR: Can not identify target.") + return + R = find_record("name", perpname, GLOB.data_core.security) + if(!R) + to_chat(usr, "ERROR: Unable to locate data core entry for target.") + return + if(href_list["status"]) + var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "Arrest", "Search", "Monitor", "Incarcerated", "Paroled", "Discharged", "Cancel") + if(setcriminal != "Cancel") + if(!R) + return + if(!H.canUseHUD()) + return + if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + return + investigate_log("[key_name(src)] has been set from [R.fields["criminal"]] to [setcriminal] by [key_name(usr)].", INVESTIGATE_RECORDS) + R.fields["criminal"] = setcriminal + sec_hud_set_security_status() + return + + if(href_list["view"]) + if(!H.canUseHUD()) + return + if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + return + to_chat(usr, "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]") + for(var/datum/data/crime/c in R.fields["crim"]) + to_chat(usr, "Crime: [c.crimeName]") + if (c.crimeDetails) + to_chat(usr, "Details: [c.crimeDetails]") + else + to_chat(usr, "Details: \[Add details]") + to_chat(usr, "Added by [c.author] at [c.time]") + to_chat(usr, "----------") + to_chat(usr, "Notes: [R.fields["notes"]]") + return + + if(href_list["add_citation"]) + var/maxFine = CONFIG_GET(number/maxfine) + var/t1 = stripped_input("Please input citation crime:", "Security HUD", "", null) + var/fine = FLOOR(input("Please input citation fine, up to [maxFine]:", "Security HUD", 50) as num|null, 1) + if(!R || !t1 || !fine || !allowed_access) + return + if(!H.canUseHUD()) + return + if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + return + if(fine < 0) + to_chat(usr, "You're pretty sure that's not how money works.") + return + fine = min(fine, maxFine) + + var/crime = GLOB.data_core.createCrimeEntry(t1, "", allowed_access, station_time_timestamp(), fine) + for (var/obj/item/pda/P in GLOB.PDAs) + if(P.owner == R.fields["name"]) + var/message = "You have been fined [fine] credits for '[t1]'. Fines may be paid at security." + var/datum/signal/subspace/messaging/pda/signal = new(src, list( + "name" = "Security Citation", + "job" = "Citation Server", + "message" = message, + "targets" = list("[P.owner] ([P.ownjob])"), + "automated" = 1 + )) + signal.send_to_receivers() + usr.log_message("(PDA: Citation Server) sent \"[message]\" to [signal.format_target()]", LOG_PDA) + GLOB.data_core.addCitation(R.fields["id"], crime) + investigate_log("New Citation: [t1] Fine: [fine] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) + return + if(href_list["add_crime"]) + var/t1 = stripped_input("Please input crime name:", "Security HUD", "", null) + if(!R || !t1 || !allowed_access) + return + if(!H.canUseHUD()) + return + if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + return + var/crime = GLOB.data_core.createCrimeEntry(t1, null, allowed_access, station_time_timestamp()) + GLOB.data_core.addCrime(R.fields["id"], crime) + investigate_log("New Crime: [t1] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) + to_chat(usr, "Successfully added a crime.") + return + + if(href_list["add_details"]) + var/t1 = stripped_input(usr, "Please input crime details:", "Secure. records", "", null) + if(!R || !t1 || !allowed_access) + return + if(!H.canUseHUD()) + return + if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + return + if(href_list["cdataid"]) + GLOB.data_core.addCrimeDetails(R.fields["id"], href_list["cdataid"], t1) + investigate_log("New Crime details: [t1] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) + to_chat(usr, "Successfully added details.") + return + + if(href_list["view_comment"]) + if(!H.canUseHUD()) + return + if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + return + to_chat(usr, "Comments/Log:") + var/counter = 1 + while(R.fields[text("com_[]", counter)]) + to_chat(usr, R.fields[text("com_[]", counter)]) + to_chat(usr, "----------") + counter++ + return + + if(href_list["add_comment"]) + var/t1 = stripped_multiline_input("Add Comment:", "Secure. records", null, null) + if (!R || !t1 || !allowed_access) + return + if(!H.canUseHUD()) + return + if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + return + var/counter = 1 + while(R.fields[text("com_[]", counter)]) + counter++ + R.fields[text("com_[]", counter)] = text("Made by [] on [] [], []
[]", allowed_access, station_time_timestamp(), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) + to_chat(usr, "Successfully added comment.") + return ..() //end of this massive fucking chain. TODO: make the hud chain not spooky. @@ -534,21 +547,34 @@ // If targeting anything else, see if the wear suit is thin enough. if (!penetrate_thick) if(above_neck(target_zone)) - if(head && istype(head, /obj/item/clothing)) - var/obj/item/clothing/CH = head - if (CH.clothing_flags & THICKMATERIAL) - . = 0 - else - if(wear_suit && istype(wear_suit, /obj/item/clothing)) - var/obj/item/clothing/CS = wear_suit - if (CS.clothing_flags & THICKMATERIAL) - . = 0 - if(!. && error_msg && user) - // Might need re-wording. - to_chat(user, "There is no exposed flesh or thin material [above_neck(target_zone) ? "on [p_their()] head" : "on [p_their()] body"].") - -/mob/living/carbon/human/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) - if(judgement_criteria & JUDGE_EMAGGED) + if(head && isclothing(head)) + var/obj/item/clothing/head/CH = head + if(CH.clothing_flags & THICKMATERIAL) + balloon_alert(user, "There is no exposed flesh on [p_their()] head") + return FALSE + if(wear_suit && isclothing(wear_suit)) + var/obj/item/clothing/suit/CS = wear_suit + if(CS.clothing_flags & THICKMATERIAL) + switch(target_zone) + if(BODY_ZONE_CHEST) + if(CS.body_parts_covered & CHEST) + balloon_alert(user, "There is no exposed flesh on this chest") + return FALSE + if(BODY_ZONE_PRECISE_GROIN) + if(CS.body_parts_covered & GROIN) + balloon_alert(user, "There is no exposed flesh on this groin") + return FALSE + if(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) + if(CS.body_parts_covered & ARMS) + balloon_alert(user, "There is no exposed flesh on these arms") + return FALSE + if(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + if(CS.body_parts_covered & LEGS) + balloon_alert(user, "There is no exposed flesh on these legs") + return FALSE + +/mob/living/carbon/human/assess_threat(judgment_criteria, lasercolor = "", datum/callback/weaponcheck=null) + if(judgment_criteria & JUDGE_EMAGGED) return 10 //Everyone is a criminal! var/threatcount = 0 @@ -575,11 +601,11 @@ //Check for ID var/obj/item/card/id/idcard = get_idcard(FALSE) - if( (judgement_criteria & JUDGE_IDCHECK) && !idcard && name=="Unknown") + if( (judgment_criteria & JUDGE_IDCHECK) && !idcard && name=="Unknown") threatcount += 4 //Check for weapons - if( (judgement_criteria & JUDGE_WEAPONCHECK) && weaponcheck) + if( (judgment_criteria & JUDGE_WEAPONCHECK) && weaponcheck) if(!idcard || !(ACCESS_WEAPONS in idcard.access)) for(var/obj/item/I in held_items) //if they're holding a gun if(weaponcheck.Invoke(I)) @@ -588,17 +614,21 @@ threatcount += 2 //not enough to trigger look_for_perp() on it's own unless they also have criminal status. //Check for arrest warrant - if(judgement_criteria & JUDGE_RECORDCHECK) + if(judgment_criteria & JUDGE_RECORDCHECK) var/perpname = get_face_name(get_id_name()) var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.security) if(R && R.fields["criminal"]) switch(R.fields["criminal"]) - if("*Arrest*") + if("Arrest") threatcount += 5 if("Incarcerated") threatcount += 2 if("Paroled") threatcount += 2 + if("Monitor") + threatcount += 1 + if("Search") + threatcount += 2 //Check for dresscode violations if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/wizard)) @@ -617,7 +647,7 @@ threatcount -= 5 //individuals wearing tinfoil hats are 30% more likely to be criminals - if(istype(get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(istype(get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) threatcount += 2 return threatcount @@ -693,6 +723,8 @@ dropItemToGround(I) /mob/living/carbon/human/proc/clean_blood(datum/source, strength) + SIGNAL_HANDLER + if(strength < CLEAN_STRENGTH_BLOOD) return if(gloves) @@ -781,7 +813,7 @@ hud_used.healthdoll.icon_state = "healthdoll_OVERLAY" for(var/X in bodyparts) var/obj/item/bodypart/BP = X - var/damage = BP.burn_dam + BP.brute_dam + var/damage = BP.burn_dam + BP.brute_dam + (hallucination ? BP.stamina_dam : 0) var/comparison = (BP.max_damage/5) var/icon_num = 0 if(damage) @@ -798,6 +830,12 @@ icon_num = 0 if(icon_num) hud_used.healthdoll.add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[BP.body_zone][icon_num]")) + //Stamina Outline (Communicate that we have stamina damage) + //Hallucinations will appear as regular damage + if(BP.stamina_dam && !hallucination) + var/mutable_appearance/MA = mutable_appearance('icons/mob/screen_gen.dmi', "[BP.body_zone]stam") + MA.alpha = (BP.stamina_dam / BP.max_stamina_damage) * 70 + 30 + hud_used.healthdoll.add_overlay(MA) for(var/t in get_missing_limbs()) //Missing limbs hud_used.healthdoll.add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[t]6")) for(var/t in get_disabled_limbs()) //Disabled limbs @@ -953,7 +991,7 @@ . = ..() if(ishuman(over)) var/mob/living/carbon/human/T = over // curbstomp, ported from PP with modifications - if(!src.is_busy && (src.zone_selected == BODY_ZONE_HEAD || src.zone_selected == BODY_ZONE_PRECISE_GROIN) && get_turf(src) == get_turf(T) && !(T.mobility_flags & MOBILITY_STAND) && src.a_intent != INTENT_HELP) //all the stars align, time to curbstomp + if(!src.is_busy && (src.zone_selected == BODY_ZONE_HEAD || src.zone_selected == BODY_ZONE_PRECISE_GROIN) && get_turf(src) == get_turf(T) && !(T.mobility_flags & MOBILITY_STAND) && src.a_intent != INTENT_HELP && !HAS_TRAIT(src, TRAIT_PACIFISM)) //all the stars align, time to curbstomp src.is_busy = TRUE if (!do_mob(src,T,25) || get_turf(src) != get_turf(T) || (T.mobility_flags & MOBILITY_STAND) || src.a_intent == INTENT_HELP || src == T) //wait 30ds and make sure the stars still align (Body zone check removed after PR #958) @@ -1023,18 +1061,35 @@ src.is_busy = FALSE +/mob/living/carbon/human/limb_attack_self() + var/obj/item/bodypart/arm = hand_bodyparts[active_hand_index] + if(arm) + arm.attack_self(src) + return ..() + + //src is the user that will be carrying, target is the mob to be carried /mob/living/carbon/human/proc/can_piggyback(mob/living/carbon/target) return (istype(target) && target.stat == CONSCIOUS && (target.mobility_flags & MOBILITY_STAND)) /mob/living/carbon/human/proc/can_be_firemanned(mob/living/carbon/target) - return (ishuman(target) && !(target.mobility_flags & MOBILITY_STAND)) + return ((ishuman(target) || ismonkey(target)) && !(target.mobility_flags & MOBILITY_STAND)) /mob/living/carbon/human/proc/fireman_carry(mob/living/carbon/target) - if(can_be_firemanned(target)) - visible_message("[src] starts lifting [target] onto their back.", - "You start lifting [target] onto your back.") - if(do_after(src, 50, TRUE, target)) + var/carrydelay = 50 //if you have latex you are faster at grabbing + var/skills_space = "" //cobby told me to do this + if(HAS_TRAIT(src, TRAIT_QUICKER_CARRY)) + carrydelay = 30 + skills_space = " expertly" + else if(HAS_TRAIT(src, TRAIT_QUICK_CARRY)) + carrydelay = 40 + skills_space = " quickly" + if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE)) + visible_message("[src] starts[skills_space] lifting [target] onto their back..", + //Joe Medic starts quickly/expertly lifting Grey Tider onto their back.. + "[HAS_TRAIT(src, TRAIT_QUICKER_CARRY) ? "Using your gloves' nanochips, you" : "You"][skills_space] start to lift [target] onto your back[HAS_TRAIT(src, TRAIT_QUICK_CARRY) ? ", while assisted by the nanochips in your gloves..." : "..."]") + //(Using your gloves' nanochips, you/You) ( /quickly/expertly) start to lift Grey Tider onto your back(, while assisted by the nanochips in your gloves../...) + if(do_after(src, carrydelay, TRUE, target)) //Second check to make sure they're still valid to be carried if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE) && !target.buckled) buckle_mob(target, TRUE, TRUE, 90, 1, 0) @@ -1057,6 +1112,7 @@ else to_chat(target, "You can't piggyback ride [src] right now!") + /mob/living/carbon/human/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, lying_buckle = FALSE, hands_needed = 0, target_hands_needed = 0) if(!force)//humans are only meant to be ridden through piggybacking and special cases return @@ -1093,7 +1149,7 @@ /mob/living/carbon/human/proc/is_shove_knockdown_blocked() //If you want to add more things that block shove knockdown, extend this var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor) for(var/bp in body_parts) - if(istype(bp, /obj/item/clothing)) + if(isclothing(bp)) var/obj/item/clothing/C = bp if(C.blocks_shove_knockdown) return TRUE @@ -1105,10 +1161,6 @@ 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) -/mob/living/carbon/human/do_after_coefficent() - . = ..() - . *= physiology.do_after_speed - /mob/living/carbon/human/updatehealth() . = ..() dna?.species.spec_updatehealth(src) @@ -1128,13 +1180,49 @@ /mob/living/carbon/human/adjust_nutrition(var/change) //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 if(HAS_TRAIT(src, TRAIT_NOHUNGER)) return FALSE + if(HAS_TRAIT(src, TRAIT_POWERHUNGRY)) + var/obj/item/organ/stomach/battery/battery = getorganslot(ORGAN_SLOT_STOMACH) + if(istype(battery)) + battery.adjust_charge_scaled(change) + return FALSE return ..() /mob/living/carbon/human/set_nutrition(var/change) //Seriously fuck you oldcoders. if(HAS_TRAIT(src, TRAIT_NOHUNGER)) return FALSE + if(HAS_TRAIT(src, TRAIT_POWERHUNGRY)) + var/obj/item/organ/stomach/battery/battery = getorganslot(ORGAN_SLOT_STOMACH) + if(istype(battery)) + battery.set_charge_scaled(change) + return FALSE return ..() +/mob/living/carbon/human/ZImpactDamage(turf/T, levels) + //Non cat-people smash into the ground + if(!iscatperson(src)) + return ..() + //Check to make sure legs are working + var/obj/item/bodypart/left_leg = get_bodypart(BODY_ZONE_L_LEG) + var/obj/item/bodypart/right_leg = get_bodypart(BODY_ZONE_R_LEG) + if(!left_leg || !right_leg || left_leg.disabled || right_leg.disabled) + return ..() + //Nailed it! + visible_message("[src] lands elegantly on [p_their()] feet!", + "You fall [levels] level[levels > 1 ? "s" : ""] into [T], perfecting the landing!") + Stun(levels * 50) + +/mob/living/carbon/human/proc/stub_toe(var/power) + if(HAS_TRAIT(src, TRAIT_LIGHT_STEP)) + power *= 0.5 + src.emote("gasp") + else + src.emote("scream") + src.apply_damage(power, BRUTE, def_zone = pick(BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT)) + src.Paralyze(10 * power) + +/mob/living/carbon/human/monkeybrain + ai_controller = /datum/ai_controller/monkey + /mob/living/carbon/human/species var/race = null @@ -1148,12 +1236,18 @@ /mob/living/carbon/human/species/android race = /datum/species/android +/mob/living/carbon/human/species/apid + race = /datum/species/apid + /mob/living/carbon/human/species/corporate race = /datum/species/corporate /mob/living/carbon/human/species/dullahan race = /datum/species/dullahan +/mob/living/carbon/human/species/ethereal + race = /datum/species/ethereal + /mob/living/carbon/human/species/felinid race = /datum/species/human/felinid @@ -1250,9 +1344,15 @@ /mob/living/carbon/human/species/golem/soviet race = /datum/species/golem/soviet +/mob/living/carbon/human/species/ipc + race = /datum/species/ipc + /mob/living/carbon/human/species/jelly race = /datum/species/jelly +/mob/living/carbon/human/species/oozeling + race = /datum/species/oozeling + /mob/living/carbon/human/species/jelly/slime race = /datum/species/jelly/slime @@ -1265,18 +1365,12 @@ /mob/living/carbon/human/species/lizard race = /datum/species/lizard -/mob/living/carbon/human/species/ethereal - race = /datum/species/ethereal - /mob/living/carbon/human/species/lizard/ashwalker race = /datum/species/lizard/ashwalker /mob/living/carbon/human/species/moth race = /datum/species/moth -/mob/living/carbon/human/species/apid - race = /datum/species/apid - /mob/living/carbon/human/species/mush race = /datum/species/mush @@ -1295,12 +1389,6 @@ /mob/living/carbon/human/species/skeleton race = /datum/species/skeleton -/mob/living/carbon/human/species/synth - race = /datum/species/synth - -/mob/living/carbon/human/species/synth/military - race = /datum/species/synth/military - /mob/living/carbon/human/species/supersoldier race = /datum/species/human/supersoldier diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index ec05c9a1e8477..5c38743f36e10 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -28,10 +28,10 @@ for(var/bp in body_parts) if(!bp) continue - if(bp && istype(bp , /obj/item/clothing)) + if(bp && isclothing(bp)) var/obj/item/clothing/C = bp if(C.body_parts_covered & def_zone.body_part) - protection += C.armor.getRating(d_type) + protection += C.get_armor_rating(d_type, src) protection += physiology.armor.getRating(d_type) return protection @@ -49,7 +49,7 @@ if(mind) if(mind.martial_art && !incapacitated(FALSE, TRUE) && mind.martial_art.can_use(src) && mind.martial_art.deflection_chance) //Some martial arts users can deflect projectiles! if(prob(mind.martial_art.deflection_chance)) - if((mobility_flags & MOBILITY_USE) && dna && !dna.check_mutation(HULK)) //But only if they're otherwise able to use items, and hulks can't do it + if((mobility_flags & MOBILITY_USE) && dna && !dna.check_mutation(HULK) && !P.martial_arts_no_deflect) //But only if they're otherwise able to use items, and hulks can't do it. Also damageless weapons are not deflected. if(!isturf(loc)) //if we're inside something and still got hit P.force_hit = TRUE //The thing we're in passed the bullet to us. Pass it back, and tell it to take the damage. loc.bullet_act(P) @@ -111,7 +111,7 @@ /mob/living/carbon/human/proc/check_shields(atom/AM, var/damage, attack_text = "the attack", attack_type = MELEE_ATTACK, armour_penetration = 0) for(var/obj/item/I in held_items) - if(!istype(I, /obj/item/clothing)) + if(!isclothing(I)) if(I.hit_reaction(src, AM, attack_text, damage, attack_type)) I.on_block(src, AM, attack_text, damage, attack_type) return 1 @@ -142,28 +142,14 @@ if(istype(AM, /obj/item)) I = AM throwpower = I.throwforce - if(I.thrownby == src) //No throwing stuff at yourself to trigger hit reactions + if(I.thrownby == WEAKREF(src)) //No throwing stuff at yourself to trigger hit reactions return ..() if(check_shields(AM, throwpower, "\the [AM.name]", THROWN_PROJECTILE_ATTACK)) hitpush = FALSE skipcatch = TRUE blocked = TRUE - else if(I) - if(((throwingdatum ? throwingdatum.speed : I.throw_speed) >= EMBED_THROWSPEED_THRESHOLD) || I.embedding.embedded_ignore_throwspeed_threshold) - if(can_embed(I)) - if(prob(I.embedding.embed_chance) && !HAS_TRAIT(src, TRAIT_PIERCEIMMUNE)) - 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) - 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) - hitpush = FALSE - skipcatch = TRUE //can't catch the now embedded item - - return ..() + + return ..(AM, skipcatch, hitpush, blocked, throwingdatum) /mob/living/carbon/human/grippedby(mob/living/user, instant = FALSE) if(w_uniform) @@ -219,7 +205,7 @@ return if(ishuman(user)) var/mob/living/carbon/human/H = user - dna.species.spec_attack_hand(H, src) + H.dna.species.spec_attack_hand(H, src) /mob/living/carbon/human/attack_paw(mob/living/carbon/monkey/M) if(check_shields(M, 0, "the M.name", UNARMED_ATTACK)) @@ -237,7 +223,7 @@ if(M.a_intent == INTENT_DISARM) //the fact that this fucking works is hilarious to me dna.species.disarm(M, src) return 1 - + if(M.limb_destroyer) dismembering_strike(M, affecting.body_zone) @@ -321,6 +307,9 @@ if(M.is_adult) damage = 30 + if(M.transformeffects & SLIME_EFFECT_RED) + damage *= 1.1 + if(check_shields(M, damage, "the [M.name]")) return 0 @@ -388,9 +377,14 @@ switch (severity) if (EXPLODE_DEVASTATE) if(bomb_armor < EXPLODE_GIB_THRESHOLD) //gibs the mob if their bomb armor is lower than EXPLODE_GIB_THRESHOLD - for(var/I in contents) - var/atom/A = I - A.ex_act(severity) + for(var/thing in contents) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += thing + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += thing + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += thing gib() return else @@ -420,11 +414,19 @@ apply_damage(burn_loss, BURN, blocked = (bomb_armor * 0.6)) //attempt to dismember bodyparts - if(severity >= 2) //don't dismember from light explosions - var/max_limb_loss = round(4/severity) //so you don't lose four limbs at severity 3. + if(severity >= EXPLODE_HEAVY || !bomb_armor) + var/max_limb_loss = 0 + var/probability = 0 + switch(severity) + if(EXPLODE_HEAVY) + max_limb_loss = 3 + probability = 40 + if(EXPLODE_DEVASTATE) + max_limb_loss = 4 + probability = 50 for(var/X in bodyparts) var/obj/item/bodypart/BP = X - if(prob(50/severity) && !prob(getarmor(BP, "bomb")) && BP.body_zone != BODY_ZONE_HEAD && BP.body_zone != BODY_ZONE_CHEST) + if(prob(probability) && !prob(getarmor(BP, "bomb")) && BP.body_zone != BODY_ZONE_HEAD && BP.body_zone != BODY_ZONE_CHEST) BP.brute_dam = BP.max_damage BP.dismember() max_limb_loss-- @@ -501,7 +503,7 @@ if(2) L.receive_damage(0,5) Paralyze(100) - if((TRAIT_EASYDISMEMBER in L.owner.dna.species.species_traits) && L.body_zone != "chest") + if(HAS_TRAIT(L, TRAIT_EASYDISMEMBER) && L.body_zone != "chest") if(prob(20)) L.dismember(BRUTE) @@ -659,7 +661,7 @@ gain = 100 if(mind.assigned_role == "Clown") gain = rand(-1000, 1000) - investigate_log("([key_name(src)]) has been consumed by the singularity.", INVESTIGATE_SINGULO) //Oh that's where the clown ended up! + investigate_log("([key_name(src)]) has been consumed by the singularity.", INVESTIGATE_ENGINES) //Oh that's where the clown ended up! gib() return(gain) @@ -688,12 +690,15 @@ ..() -/mob/living/carbon/human/proc/check_self_for_injuries() +/mob/living/carbon/human/check_self_for_injuries() if(stat == DEAD || stat == UNCONSCIOUS) return visible_message("[src] examines [p_them()]self.", \ "You check yourself for injuries.") + var/list/harm_descriptors = dna?.species.get_harm_descriptors() + harm_descriptors ||= list("bleed" = "bleeding") + var/bleed_msg = harm_descriptors["bleed"] var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) for(var/X in bodyparts) @@ -741,13 +746,16 @@ to_chat(src, "\t Your [LB.name] [HAS_TRAIT(src, TRAIT_SELF_AWARE) ? "has" : "is"] [status].") for(var/obj/item/I in LB.embedded_objects) - to_chat(src, "\t There is \a [I] embedded in your [LB.name]!") + 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_chat(src, "Your [parse_zone(t)] is missing!") if(bleed_rate) - to_chat(src, "You are bleeding!") + to_chat(src, "You are [bleed_msg]!") if(getStaminaLoss()) if(getStaminaLoss() > 30) to_chat(src, "You're completely exhausted.") @@ -769,7 +777,7 @@ else if(oxyloss > 30) to_chat(src, "You're choking!") - if(!HAS_TRAIT(src, TRAIT_NOHUNGER)) + if(!HAS_TRAIT(src, TRAIT_NOHUNGER) && !HAS_TRAIT(src, TRAIT_POWERHUNGRY)) switch(nutrition) if(NUTRITION_LEVEL_FULL to INFINITY) to_chat(src, "You're completely stuffed!") @@ -888,7 +896,7 @@ for(var/obj/item/I in torn_items) I.take_damage(damage_amount, damage_type, damage_flag, 0) - + /mob/living/carbon/human/proc/blockbreak() to_chat(src, "Your block was broken!") ADD_TRAIT(src, TRAIT_NOBLOCK, type) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 7e44ab789af28..300d12f0b1610 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -6,6 +6,7 @@ can_buckle = TRUE buckle_lying = FALSE mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID) + blocks_emissive = EMISSIVE_BLOCK_UNIQUE //Hair colour and style var/hair_color = "000" var/hair_style = "Bald" @@ -29,6 +30,7 @@ var/undershirt = "Nude" //Which undershirt the player wants var/socks = "Nude" //Which socks the player wants var/backbag = DBACKPACK //Which backpack type the player has chosen. + var/jumpsuit_style = PREF_SUIT //suit/skirt //Equipment slots var/obj/item/clothing/wear_suit = null @@ -53,7 +55,7 @@ var/list/datum/bioware = list() 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/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot, /mob/living/carbon/monkey)) var/lastpuke = 0 var/last_fire_update var/account_id diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 014d8da338e89..01ab15927b1e4 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -76,11 +76,10 @@ else if(istype(tablet)) var/obj/item/computer_hardware/card_slot/card_slot = tablet.all_components[MC_CARD] if(card_slot && (card_slot.stored_card2 || card_slot.stored_card)) - if(card_slot.stored_card2) //The second card is the one used for authorization in the ID changing program, so we prioritize it here for consistency + if(card_slot.stored_card2?.registered_name) //The second card is the one used for authorization in the ID changing program, so we prioritize it here for consistency . = card_slot.stored_card2.registered_name - else - if(card_slot.stored_card) - . = card_slot.stored_card.registered_name + else if(card_slot.stored_card?.registered_name) + . = card_slot.stored_card.registered_name if(!.) . = if_no_id //to prevent null-names making the mob unclickable return @@ -181,3 +180,14 @@ 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. + return + if(isclothing(glasses) && (glasses.clothing_flags & SCAN_REAGENTS)) + return TRUE + if(isclothing(head) && (head.clothing_flags & SCAN_REAGENTS)) + return TRUE + if(isclothing(wear_mask) && (wear_mask.clothing_flags & SCAN_REAGENTS)) + return TRUE diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 3a3e54ea2fa21..9c15b7952c2dd 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -18,7 +18,7 @@ if (!(lube&GALOSHES_DONT_HELP)) if(HAS_TRAIT(src, TRAIT_NOSLIPWATER)) return 0 - if(shoes && istype(shoes, /obj/item/clothing)) + if(shoes && isclothing(shoes)) var/obj/item/clothing/CS = shoes if (CS.clothing_flags & NOSLIP) return 0 @@ -29,20 +29,17 @@ playsound_local(null, 'sound/effects/space_wind_big.ogg', CLAMP(pressure_difference / 50, 10, 100), 1) else playsound_local(null, 'sound/effects/space_wind.ogg', CLAMP(pressure_difference, 10, 100), 1) - if(shoes && istype(shoes, /obj/item/clothing)) + if(shoes && isclothing(shoes)) var/obj/item/clothing/S = shoes if((S.clothing_flags & NOSLIP)) return 0 return ..() -/mob/living/carbon/human/mob_has_gravity() - . = ..() - if(!.) - if(mob_negates_gravity()) - . = 1 +/mob/living/carbon/human/has_gravity(turf/T) + return ..() || mob_negates_gravity() /mob/living/carbon/human/mob_negates_gravity() - return ((shoes && shoes.negates_gravity()) || (dna.species.negates_gravity(src))) + return ((shoes && shoes.negates_gravity()) || (dna?.species?.negates_gravity(src))) /mob/living/carbon/human/Move(NewLoc, direct) . = ..() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 36af888930939..274b10f6c521e 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -4,39 +4,39 @@ // Return the item currently in the slot ID /mob/living/carbon/human/get_item_by_slot(slot_id) switch(slot_id) - if(SLOT_BACK) + if(ITEM_SLOT_BACK) return back - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) return wear_mask - if(SLOT_NECK) + if(ITEM_SLOT_NECK) return wear_neck - if(SLOT_HANDCUFFED) + if(ITEM_SLOT_HANDCUFFED) return handcuffed - if(SLOT_LEGCUFFED) + if(ITEM_SLOT_LEGCUFFED) return legcuffed - if(SLOT_BELT) + if(ITEM_SLOT_BELT) return belt - if(SLOT_WEAR_ID) + if(ITEM_SLOT_ID) return wear_id - if(SLOT_EARS) + if(ITEM_SLOT_EARS) return ears - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) return glasses - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) return gloves - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) return head - if(SLOT_SHOES) + if(ITEM_SLOT_FEET) return shoes - if(SLOT_WEAR_SUIT) + if(ITEM_SLOT_OCLOTHING) return wear_suit - if(SLOT_W_UNIFORM) + if(ITEM_SLOT_ICLOTHING) return w_uniform - if(SLOT_L_STORE) + if(ITEM_SLOT_LPOCKET) return l_store - if(SLOT_R_STORE) + if(ITEM_SLOT_RPOCKET) return r_store - if(SLOT_S_STORE) + if(ITEM_SLOT_SUITSTORE) return s_store return null @@ -84,17 +84,17 @@ var/not_handled = FALSE //Added in case we make this type path deeper one day switch(slot) - if(SLOT_BELT) + if(ITEM_SLOT_BELT) belt = I update_inv_belt() - if(SLOT_WEAR_ID) + if(ITEM_SLOT_ID) wear_id = I sec_hud_set_ID() update_inv_wear_id() - if(SLOT_EARS) + if(ITEM_SLOT_EARS) ears = I update_inv_ears() - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) glasses = I var/obj/item/clothing/glasses/G = I if(G.glass_colour_type) @@ -107,13 +107,13 @@ if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) update_sight() update_inv_glasses() - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) gloves = I update_inv_gloves() - if(SLOT_SHOES) + if(ITEM_SLOT_FEET) shoes = I update_inv_shoes() - if(SLOT_WEAR_SUIT) + if(ITEM_SLOT_OCLOTHING) wear_suit = I if(I.flags_inv & HIDEJUMPSUIT) update_inv_w_uniform() @@ -121,17 +121,17 @@ stop_pulling() //can't pull if restrained update_action_buttons_icon() //certain action buttons will no longer be usable. update_inv_wear_suit() - if(SLOT_W_UNIFORM) + if(ITEM_SLOT_ICLOTHING) w_uniform = I update_suit_sensors() update_inv_w_uniform() - if(SLOT_L_STORE) + if(ITEM_SLOT_LPOCKET) l_store = I update_inv_pockets() - if(SLOT_R_STORE) + if(ITEM_SLOT_RPOCKET) r_store = I update_inv_pockets() - if(SLOT_S_STORE) + if(ITEM_SLOT_SUITSTORE) s_store = I update_inv_s_store() else @@ -143,9 +143,9 @@ return not_handled //For future deeper overrides -/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) +/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE, was_thrown = FALSE) var/index = get_held_index_of_item(I) - . = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should. + . = ..(I, force, newloc, no_move, invdrop, was_thrown) //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should. if(!. || !I) return if(index && !QDELETED(src) && dna.species.mutanthands) //hand freed, fill with claws, skip if we're getting deleted. @@ -188,7 +188,7 @@ update_tint() if(G.vision_correction) if(HAS_TRAIT(src, TRAIT_NEARSIGHT)) - overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) + overlay_fullscreen("nearsighted", /atom/movable/screen/fullscreen/impaired, 1) if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) update_sight() if(!QDELETED(src)) @@ -262,7 +262,6 @@ return O.equip(src, visualsOnly) - //delete all equipment without dropping anything /mob/living/carbon/human/proc/delete_equipment() for(var/slot in get_all_slots())//order matters, dependant slots go first diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 09c9c4ac69cf8..1e1d0b16450a4 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -44,25 +44,6 @@ // Tissues die without blood circulation adjustBruteLoss(2) - if(stat != DEAD) - //handle embedded objects - //Stuff jammed in your limbs hurts - 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()) - 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") - if(stat != DEAD) //Handle hygiene if(HAS_TRAIT(src, TRAIT_ALWAYS_CLEAN)) @@ -72,23 +53,23 @@ var/hygiene_loss = -HYGIENE_FACTOR * 0.25 //Small loss per life //If you're covered in blood, you'll start smelling like shit faster. - var/obj/item/head = get_item_by_slot(SLOT_HEAD) + var/obj/item/head = get_item_by_slot(ITEM_SLOT_HEAD) if(head && HAS_BLOOD_DNA(head)) hygiene_loss -= 1 * HYGIENE_FACTOR - var/obj/item/mask = get_item_by_slot(SLOT_HEAD) + var/obj/item/mask = get_item_by_slot(ITEM_SLOT_HEAD) if(mask && HAS_BLOOD_DNA(mask)) hygiene_loss -= 1 * HYGIENE_FACTOR - var/obj/item/uniform = get_item_by_slot(SLOT_W_UNIFORM) + var/obj/item/uniform = get_item_by_slot(ITEM_SLOT_ICLOTHING) if(uniform && HAS_BLOOD_DNA(uniform)) hygiene_loss -= 4 * HYGIENE_FACTOR - var/obj/item/suit = get_item_by_slot(SLOT_WEAR_SUIT) + var/obj/item/suit = get_item_by_slot(ITEM_SLOT_OCLOTHING) if(suit && HAS_BLOOD_DNA(suit)) hygiene_loss -= 3 * HYGIENE_FACTOR - var/obj/item/feet = get_item_by_slot(SLOT_SHOES) + var/obj/item/feet = get_item_by_slot(ITEM_SLOT_FEET) if(feet && HAS_BLOOD_DNA(feet)) hygiene_loss -= 0.5 * HYGIENE_FACTOR @@ -104,28 +85,36 @@ /mob/living/carbon/human/calculate_affecting_pressure(pressure) - if (wear_suit && head && istype(wear_suit, /obj/item/clothing) && istype(head, /obj/item/clothing)) - var/obj/item/clothing/CS = wear_suit - var/obj/item/clothing/CH = head - if (CS.clothing_flags & CH.clothing_flags & STOPSPRESSUREDAMAGE) - return ONE_ATMOSPHERE + var/chest_covered = FALSE + var/head_covered = FALSE + for(var/obj/item/clothing/equipped in get_equipped_items()) + if((equipped.body_parts_covered & CHEST) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE)) + chest_covered = TRUE + if((equipped.body_parts_covered & HEAD) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE)) + head_covered = TRUE + + if(chest_covered && head_covered) + return ONE_ATMOSPHERE return pressure /mob/living/carbon/human/handle_traits() + if (getOrganLoss(ORGAN_SLOT_BRAIN) >= 60) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "brain_damage", /datum/mood_event/brain_damage) + else + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "brain_damage") + if(eye_blind) //blindness, heals slowly over time if(HAS_TRAIT_FROM(src, TRAIT_BLIND, EYES_COVERED)) //covering your eyes heals blurry eyes faster adjust_blindness(-3) else adjust_blindness(-1) - else if(eye_blurry) //blurry eyes heal slowly + //If you have blindness from a trait, heal blurryness too, otherwise return and ignore that. + if(!(HAS_TRAIT(src, TRAIT_BLIND))) + return + if(eye_blurry) //blurry eyes heal slowly adjust_blurriness(-1) - if (getOrganLoss(ORGAN_SLOT_BRAIN) >= 60) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "brain_damage", /datum/mood_event/brain_damage) - else - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "brain_damage") - /mob/living/carbon/human/handle_mutations_and_radiation() if(!dna || !dna.species.handle_mutations_and_radiation(src)) ..() @@ -149,13 +138,13 @@ var/datum/species/S = dna.species if(S.breathid == "o2") - throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) + throw_alert("not_enough_oxy", /atom/movable/screen/alert/not_enough_oxy) else if(S.breathid == "tox") - throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox) + throw_alert("not_enough_tox", /atom/movable/screen/alert/not_enough_tox) else if(S.breathid == "co2") - throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2) + throw_alert("not_enough_co2", /atom/movable/screen/alert/not_enough_co2) else if(S.breathid == "n2") - throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro) + throw_alert("not_enough_nitro", /atom/movable/screen/alert/not_enough_nitro) return FALSE else @@ -337,7 +326,7 @@ if(glasses) if(glasses.clothing_flags & BLOCK_GAS_SMOKE_EFFECT) return TRUE - if(head && istype(head, /obj/item/clothing)) + if(head && isclothing(head)) var/obj/item/clothing/CH = head if(CH.clothing_flags & BLOCK_GAS_SMOKE_EFFECT) return TRUE diff --git a/code/modules/mob/living/carbon/human/physiology.dm b/code/modules/mob/living/carbon/human/physiology.dm index 4d411deb53df6..2a197b64ee29f 100644 --- a/code/modules/mob/living/carbon/human/physiology.dm +++ b/code/modules/mob/living/carbon/human/physiology.dm @@ -23,7 +23,5 @@ var/hunger_mod = 1 //% of hunger rate taken per tick. - 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. - /datum/physiology/New() armor = new diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 5303daa89a46d..aab11ee6a26b4 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/say_mod(input, message_mode) +/mob/living/carbon/human/say_mod(input, list/message_mods = list()) verb_say = dna.species.say_mod if(slurring) return "slurs" @@ -45,35 +45,28 @@ return special_voice /mob/living/carbon/human/binarycheck() - if(ears) - var/obj/item/radio/headset/dongle = ears - if(!istype(dongle)) - return FALSE - if(dongle.translate_binary) - return TRUE + if(stat >= SOFT_CRIT || !ears) + return FALSE + var/obj/item/radio/headset/dongle = ears + if(!istype(dongle)) + return FALSE + return dongle.translate_binary -/mob/living/carbon/human/radio(message, message_mode, list/spans, language) +/mob/living/carbon/human/radio(message, list/message_mods = list(), list/spans, language) . = ..() - if(. != 0) + if(. != FALSE) return . - switch(message_mode) - if(MODE_HEADSET) - if (ears) - ears.talk_into(src, message, , spans, language) - return ITALICS | REDUCE_RANGE - - if(MODE_DEPARTMENT) - if (ears) - ears.talk_into(src, message, message_mode, spans, language) - return ITALICS | REDUCE_RANGE - - if(message_mode in GLOB.radiochannels) + if(message_mods[MODE_HEADSET]) + if(ears) + ears.talk_into(src, message, , spans, language, message_mods) + return ITALICS | REDUCE_RANGE + else if(message_mods[RADIO_EXTENSION] == MODE_DEPARTMENT || (GLOB.radiochannels[message_mods[RADIO_EXTENSION]])) if(ears) - ears.talk_into(src, message, message_mode, spans, language) + ears.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) return ITALICS | REDUCE_RANGE - return 0 + return FALSE /mob/living/carbon/human/get_alt_name() if(name != GetVoice()) @@ -86,7 +79,7 @@ var/say_starter = "Say \"" //" if(findtextEx(temp, say_starter, 1, length(say_starter) + 1) && length(temp) > length(say_starter)) //case sensitive means - temp = trim_left(copytext(temp, length(say_starter + 1))) + temp = trim_left(copytext(temp, length(say_starter) + 1)) temp = replacetext(temp, ";", "", 1, 2) //general radio while(trim_left(temp)[1] == ":") //dept radio again (necessary) temp = copytext_char(trim_left(temp), 3) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 49e0d3fcf7792..4c99da5a99009 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -6,11 +6,12 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/id // if the game needs to manually check your race to do something not included in a proc here, it will use this var/limbs_id //this is used if you want to use a different species limb sprites. Mainly used for angels as they look like humans. var/name // this is the fluff name. these will be left generic (such as 'Lizardperson' for the lizard race) so servers can change them to whatever + var/bodyflag = FLAG_HUMAN //Species flags currently used for species restriction on items 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/list/offset_features = list(OFFSET_UNIFORM = list(0,0), OFFSET_ID = list(0,0), OFFSET_GLOVES = list(0,0), OFFSET_GLASSES = list(0,0), OFFSET_EARS = list(0,0), OFFSET_SHOES = list(0,0), OFFSET_S_STORE = list(0,0), OFFSET_FACEMASK = list(0,0), OFFSET_HEAD = list(0,0), OFFSET_FACE = list(0,0), OFFSET_BELT = list(0,0), OFFSET_BACK = list(0,0), OFFSET_SUIT = list(0,0), OFFSET_NECK = list(0,0)) + var/list/offset_features = list(OFFSET_UNIFORM = list(0,0), OFFSET_ID = list(0,0), OFFSET_GLOVES = list(0,0), OFFSET_GLASSES = list(0,0), OFFSET_EARS = list(0,0), OFFSET_SHOES = list(0,0), OFFSET_S_STORE = list(0,0), OFFSET_FACEMASK = list(0,0), OFFSET_HEAD = list(0,0), OFFSET_FACE = list(0,0), OFFSET_BELT = list(0,0), OFFSET_BACK = list(0,0), OFFSET_SUIT = list(0,0), OFFSET_NECK = list(0,0), OFFSET_RIGHT_HAND = list(0,0), OFFSET_LEFT_HAND = list(0,0)) 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. @@ -28,6 +29,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/say_mod = "says" // affects the speech message var/species_language_holder = /datum/language_holder var/list/default_features = list() // Default mutant bodyparts for this species. Don't forget to set one for every mutant bodypart you allow this species to have. + var/list/forced_features = list() // A list of features forced on characters var/list/mutant_bodyparts = list() // Visible CURRENT bodyparts that are unique to a species. DO NOT USE THIS AS A LIST OF ALL POSSIBLE BODYPARTS AS IT WILL FUCK SHIT UP! 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 @@ -50,12 +52,12 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/deathsound //used to set the mobs deathsound on species change var/list/special_step_sounds //Sounds to override barefeet walkng var/grab_sound //Special sound for grabbing + var/blood_color //Blood color for decals var/reagent_tag = PROCESS_ORGANIC //Used for metabolizing reagents. We're going to assume you're a meatbag unless you say otherwise. - var/species_gibs = "human" + var/species_gibs = GIB_TYPE_HUMAN //by default human gibs are used var/allow_numbers_in_name // Can this species use numbers in its name? var/datum/outfit/outfit_important_for_life /// A path to an outfit that is important for species life e.g. plasmaman outfit var/datum/action/innate/flight/fly //the actual flying ability given to flying species - // species-only traits. Can be found in DNA.dm var/list/species_traits = list() // generic traits tied to having the species @@ -90,6 +92,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) //in __DEFINES/mobs.dm, defaults to NONE, so people actually have to think about it var/changesource_flags = NONE + //The component to add when swimming + var/swimming_component = /datum/component/swimming + /////////// // PROCS // /////////// @@ -160,7 +165,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/should_have_brain = TRUE var/should_have_heart = !(NOBLOOD in species_traits) var/should_have_lungs = !(TRAIT_NOBREATH in inherent_traits) - var/should_have_appendix = !(TRAIT_NOHUNGER in inherent_traits) + var/should_have_appendix = !((TRAIT_NOHUNGER in inherent_traits) || (TRAIT_POWERHUNGRY in inherent_traits)) var/should_have_eyes = TRUE var/should_have_ears = TRUE var/should_have_tongue = TRUE @@ -348,6 +353,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) /datum/species/proc/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + SIGNAL_HANDLER + if(C.dna.species.exotic_bloodtype) C.dna.blood_type = random_blood_type() if(DIGITIGRADE in species_traits) @@ -368,7 +375,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) //keep it at the right spot, so we can't have people taking shortcuts var/location = C.dna.mutation_index.Find(inert_mutation) C.dna.mutation_index[location] = new_species.inert_mutation + C.dna.default_mutation_genes[location] = C.dna.mutation_index[location] C.dna.mutation_index[new_species.inert_mutation] = create_sequence(new_species.inert_mutation) + C.dna.default_mutation_genes[new_species.inert_mutation] = C.dna.mutation_index[new_species.inert_mutation] if(inherent_factions) for(var/i in inherent_factions) @@ -401,7 +410,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) //we check if our hat or helmet hides our facial hair. if(H.head) var/obj/item/I = H.head - if(istype(I, /obj/item/clothing)) + if(isclothing(I)) var/obj/item/clothing/C = I dynamic_fhair_suffix = C.dynamic_fhair_suffix if(I.flags_inv & HIDEFACIALHAIR) @@ -454,7 +463,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(H.head) var/obj/item/I = H.head - if(istype(I, /obj/item/clothing)) + if(isclothing(I)) var/obj/item/clothing/C = I dynamic_hair_suffix = C.dynamic_hair_suffix if(I.flags_inv & HIDEHAIR) @@ -559,7 +568,10 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/datum/sprite_accessory/underwear/underwear = GLOB.underwear_list[H.underwear] var/mutable_appearance/underwear_overlay if(underwear) - underwear_overlay = mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER) + if(H.dna.species.sexes && H.gender == FEMALE && (underwear.gender == MALE)) + underwear_overlay = wear_female_version(underwear.icon_state, underwear.icon, BODY_LAYER, FEMALE_UNIFORM_FULL) + else + underwear_overlay = mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER) if(!underwear.use_static) underwear_overlay.color = "#" + H.underwear_color standing += underwear_overlay @@ -572,7 +584,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) else standing += mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER) - if(H.socks && H.get_num_legs(FALSE) >= 2 && !(DIGITIGRADE in species_traits)) + if(H.socks && H.get_num_legs(FALSE) >= 2 && !(DIGITIGRADE in species_traits) && !(NOSOCKS in species_traits)) var/datum/sprite_accessory/socks/socks = GLOB.socks_list[H.socks] if(socks) standing += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER) @@ -831,16 +843,18 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(slot in no_equip) if(!I.species_exception || !is_type_in_list(src, I.species_exception)) return FALSE - + if(I.species_restricted & H.dna?.species.bodyflag) + to_chat(H, "Your species cannot wear this item!") + return FALSE var/num_arms = H.get_num_arms(FALSE) var/num_legs = H.get_num_legs(FALSE) switch(slot) - if(SLOT_HANDS) + if(ITEM_SLOT_HANDS) if(H.get_empty_held_indexes()) return TRUE return FALSE - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) if(H.wear_mask) return FALSE if(!(I.slot_flags & ITEM_SLOT_MASK)) @@ -848,25 +862,25 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_NECK) + if(ITEM_SLOT_NECK) if(H.wear_neck) return FALSE if( !(I.slot_flags & ITEM_SLOT_NECK) ) return FALSE return TRUE - if(SLOT_BACK) + if(ITEM_SLOT_BACK) if(H.back) return FALSE if( !(I.slot_flags & ITEM_SLOT_BACK) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_WEAR_SUIT) + if(ITEM_SLOT_OCLOTHING) if(H.wear_suit) return FALSE if( !(I.slot_flags & ITEM_SLOT_OCLOTHING) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) if(H.gloves) return FALSE if( !(I.slot_flags & ITEM_SLOT_GLOVES) ) @@ -874,7 +888,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(num_arms < 2) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_SHOES) + if(ITEM_SLOT_FEET) if(H.shoes) return FALSE if( !(I.slot_flags & ITEM_SLOT_FEET) ) @@ -886,7 +900,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) to_chat(H, "The footwear around here isn't compatible with your feet!") return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_BELT) + if(ITEM_SLOT_BELT) if(H.belt) return FALSE @@ -899,7 +913,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(!(I.slot_flags & ITEM_SLOT_BELT)) return return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) if(H.glasses) return FALSE if(!(I.slot_flags & ITEM_SLOT_EYES)) @@ -910,7 +924,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(E?.no_glasses) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) if(H.head) return FALSE if(!(I.slot_flags & ITEM_SLOT_HEAD)) @@ -918,7 +932,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_EARS) + if(ITEM_SLOT_EARS) if(H.ears) return FALSE if(!(I.slot_flags & ITEM_SLOT_EARS)) @@ -926,13 +940,13 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_W_UNIFORM) + if(ITEM_SLOT_ICLOTHING) if(H.w_uniform) return FALSE if( !(I.slot_flags & ITEM_SLOT_ICLOTHING) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_WEAR_ID) + if(ITEM_SLOT_ID) if(H.wear_id) return FALSE @@ -944,7 +958,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if( !(I.slot_flags & ITEM_SLOT_ID) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_L_STORE) + if(ITEM_SLOT_LPOCKET) if(HAS_TRAIT(I, TRAIT_NODROP)) //Pockets aren't visible, so you can't move TRAIT_NODROP items into them. return FALSE if(H.l_store) @@ -956,11 +970,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(!disable_warning) to_chat(H, "You need a jumpsuit before you can attach this [I.name]!") return FALSE - if(I.slot_flags & ITEM_SLOT_DENYPOCKET) - return FALSE - if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & ITEM_SLOT_POCKET) ) + if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & ITEM_SLOT_LPOCKET) ) return TRUE - if(SLOT_R_STORE) + if(ITEM_SLOT_RPOCKET) if(HAS_TRAIT(I, TRAIT_NODROP)) return FALSE if(H.r_store) @@ -972,12 +984,10 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(!disable_warning) to_chat(H, "You need a jumpsuit before you can attach this [I.name]!") return FALSE - if(I.slot_flags & ITEM_SLOT_DENYPOCKET) - return FALSE - if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & ITEM_SLOT_POCKET) ) + if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & ITEM_SLOT_RPOCKET) ) return TRUE return FALSE - if(SLOT_S_STORE) + if(ITEM_SLOT_SUITSTORE) if(HAS_TRAIT(I, TRAIT_NODROP)) return FALSE if(H.s_store) @@ -997,7 +1007,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if( istype(I, /obj/item/pda) || istype(I, /obj/item/pen) || is_type_in_list(I, H.wear_suit.allowed) ) return TRUE return FALSE - if(SLOT_HANDCUFFED) + if(ITEM_SLOT_HANDCUFFED) if(H.handcuffed) return FALSE if(!istype(I, /obj/item/restraints/handcuffs)) @@ -1005,7 +1015,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(num_arms < 2) return FALSE return TRUE - if(SLOT_LEGCUFFED) + if(ITEM_SLOT_LEGCUFFED) if(H.legcuffed) return FALSE if(!istype(I, /obj/item/restraints/legcuffs)) @@ -1013,7 +1023,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(num_legs < 2) return FALSE return TRUE - if(SLOT_IN_BACKPACK) + if(ITEM_SLOT_BACKPACK) if(H.back) if(SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_CAN_INSERT, I, H, TRUE)) return TRUE @@ -1032,24 +1042,27 @@ GLOBAL_LIST_EMPTY(roundstart_races) /datum/species/proc/after_equip_job(datum/job/J, mob/living/carbon/human/H) H.update_mutant_bodyparts() +// Do species-specific reagent handling here +// Return 1 if it should do normal processing too +// Return 0 if it shouldn't deplete and do its normal effect +// Other return values will cause weird badness + /datum/species/proc/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.type == exotic_blood) H.blood_volume = min(H.blood_volume + round(chem.volume, 0.1), BLOOD_VOLUME_MAXIMUM) H.reagents.del_reagent(chem.type) - return 1 + return TRUE + //This handles dumping unprocessable reagents. + var/dump_reagent = TRUE + if((chem.process_flags & SYNTHETIC) && (H.dna.species.reagent_tag & PROCESS_SYNTHETIC)) //SYNTHETIC-oriented reagents require PROCESS_SYNTHETIC + dump_reagent = FALSE + if((chem.process_flags & ORGANIC) && (H.dna.species.reagent_tag & PROCESS_ORGANIC)) //ORGANIC-oriented reagents require PROCESS_ORGANIC + dump_reagent = FALSE + if(dump_reagent) + chem.holder.remove_reagent(chem.type, chem.metabolization_rate) + return TRUE return FALSE -// Do species-specific reagent handling here -// Return 1 if it should do normal processing too -// Return 0 if it shouldn't deplete and do its normal effect -// Other return values will cause weird badness -/datum/species/proc/handle_reagents(mob/living/carbon/human/H, datum/reagent/R) - if(R.type == exotic_blood) - H.blood_volume = min(H.blood_volume + round(R.volume, 0.1), BLOOD_VOLUME_NORMAL) - H.reagents.del_reagent(R.type) - return FALSE - return TRUE - /datum/species/proc/check_species_weakness(obj/item, mob/living/attacker) return 0 //This is not a boolean, it's the multiplier for the damage that the user takes from the item.It is added onto the check_weakness value of the mob, and then the force of the item is multiplied by this value @@ -1139,23 +1152,38 @@ GLOBAL_LIST_EMPTY(roundstart_races) 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)) - else if(isethereal(H)) - var/datum/species/ethereal/E = H.dna.species - var/charge = E.get_charge() - if(charge <= ETHEREAL_CHARGE_NORMAL) - . += 1.5 * (1 - charge / 100) else H.remove_movespeed_modifier(MOVESPEED_ID_HUNGRY) + if(HAS_TRAIT(H, TRAIT_POWERHUNGRY)) + handle_charge(H) + else + switch(H.nutrition) + if(NUTRITION_LEVEL_FULL to INFINITY) + H.throw_alert("nutrition", /atom/movable/screen/alert/fat) + if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FULL) + H.clear_alert("nutrition") + if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) + H.throw_alert("nutrition", /atom/movable/screen/alert/hungry) + if(0 to NUTRITION_LEVEL_STARVING) + H.throw_alert("nutrition", /atom/movable/screen/alert/starving) + +/datum/species/proc/handle_charge(mob/living/carbon/human/H) switch(H.nutrition) - if(NUTRITION_LEVEL_FULL to INFINITY) - H.throw_alert("nutrition", /obj/screen/alert/fat) - if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FULL) + if(NUTRITION_LEVEL_FED to INFINITY) H.clear_alert("nutrition") + if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) + H.throw_alert("nutrition", /atom/movable/screen/alert/lowcell, 1) if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) - H.throw_alert("nutrition", /obj/screen/alert/hungry) - if(0 to NUTRITION_LEVEL_STARVING) - H.throw_alert("nutrition", /obj/screen/alert/starving) + H.throw_alert("nutrition", /atom/movable/screen/alert/lowcell, 2) + if(1 to NUTRITION_LEVEL_STARVING) + H.throw_alert("nutrition", /atom/movable/screen/alert/lowcell, 3) + else + var/obj/item/organ/stomach/battery/battery = H.getorganslot(ORGAN_SLOT_STOMACH) + if(!istype(battery)) + H.throw_alert("nutrition", /atom/movable/screen/alert/nocell) + else + H.throw_alert("nutrition", /atom/movable/screen/alert/emptycell) /datum/species/proc/update_health_hud(mob/living/carbon/human/H) return 0 @@ -1282,12 +1310,15 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(target.check_block()) target.visible_message("[target] blocks [user]'s grab attempt!", \ "You block [user]'s grab attempt!") - return 0 + return FALSE if(attacker_style && attacker_style.grab_act(user,target)) return TRUE else //Steal them shoes if(!(target.mobility_flags & MOBILITY_STAND) && (user.zone_selected == BODY_ZONE_L_LEG || user.zone_selected == BODY_ZONE_R_LEG) && user.a_intent == INTENT_GRAB && target.shoes) + if(HAS_TRAIT(target.shoes, TRAIT_NODROP)) + target.grabbedby(user) + return TRUE user.visible_message("[user] starts stealing [target]'s shoes!", "You start stealing [target]'s shoes!") var/obj/item/I = target.shoes @@ -1396,6 +1427,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/mob/living/carbon/human/target_collateral_human var/obj/structure/table/target_table var/obj/machinery/disposal/bin/target_disposal_bin + var/turf/open/indestructible/sound/pool/target_pool //This list is getting pretty long, but its better than calling shove_act or something on every atom var/shove_blocked = FALSE //Used to check if a shove is blocked so that if it is knockdown logic can be applied //Thank you based whoneedsspace @@ -1407,6 +1439,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(get_turf(target) == target_oldturf) target_table = locate(/obj/structure/table) in target_shove_turf.contents target_disposal_bin = locate(/obj/machinery/disposal/bin) in target_shove_turf.contents + target_pool = istype(target_shove_turf, /turf/open/indestructible/sound/pool) ? target_shove_turf : null shove_blocked = TRUE if(target.IsKnockdown() && !target.IsParalyzed()) @@ -1429,7 +1462,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(O.flags_1 & ON_BORDER_1 && O.dir == turn(shove_dir, 180) && O.density) directional_blocked = TRUE break - if((!target_table && !target_collateral_human && !target_disposal_bin) || directional_blocked) + if((!target_table && !target_collateral_human && !target_disposal_bin && !target_pool) || directional_blocked) target.Knockdown(SHOVE_KNOCKDOWN_SOLID) target.drop_all_held_items() user.visible_message("[user.name] shoves [target.name], knocking [target.p_them()] down!", @@ -1454,6 +1487,12 @@ GLOBAL_LIST_EMPTY(roundstart_races) user.visible_message("[user.name] shoves [target.name] into \the [target_disposal_bin]!", "You shove [target.name] into \the [target_disposal_bin]!", null, COMBAT_MESSAGE_RANGE) log_combat(user, target, "shoved", "into [target_disposal_bin] (disposal bin)") + else if(target_pool) + target.Knockdown(SHOVE_KNOCKDOWN_SOLID) + target.forceMove(target_pool) + user.visible_message("[user.name] shoves [target.name] into \the [target_pool]!", + "You shove [target.name] into \the [target_pool]!", null, COMBAT_MESSAGE_RANGE) + log_combat(user, target, "shoved", "into [target_pool] (swimming pool)") else user.visible_message("[user.name] shoves [target.name]!", "You shove [target.name]!", null, COMBAT_MESSAGE_RANGE) @@ -1544,10 +1583,10 @@ GLOBAL_LIST_EMPTY(roundstart_races) //dismemberment var/dismemberthreshold = ((affecting.max_damage * 2) - affecting.get_damage()) //don't take the current hit into account. - var/attackforce = (((I.w_class - 3) * 5) + ((I.attack_weight - 1) * 14) + ((I.sharpness-1) * 20)) //all the variables that go into ripping off a limb in one handy package. Force is absent because it's already been taken into account by the limb being damaged + var/attackforce = (((I.w_class - 3) * 5) + ((I.attack_weight - 1) * 14) + ((I.is_sharp()-1) * 20)) //all the variables that go into ripping off a limb in one handy package. Force is absent because it's already been taken into account by the limb being damaged if(HAS_TRAIT(src, TRAIT_EASYDISMEMBER)) dismemberthreshold -= 30 - if(I.sharpness) + if(I.is_sharp()) attackforce = max(attackforce, I.force) if(attackforce >= dismemberthreshold && I.force >= 10) if(affecting.dismember(I.damtype)) @@ -1555,7 +1594,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) playsound(get_turf(H), I.get_dismember_sound(), 80, 1) var/bloody = 0 - if((I.damtype == BRUTE) && (I.force >= max(10, armor_block) || I.sharpness)) + if((I.damtype == BRUTE) && (I.force >= max(10, armor_block) || I.is_sharp())) if(affecting.status == BODYPART_ORGANIC) I.add_mob_blood(H) //Make the weapon bloody, not the person. if(prob(I.force * 2)) //blood spatter! @@ -1571,7 +1610,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) switch(hit_area) if(BODY_ZONE_HEAD) - if(!I.sharpness) + if(!I.is_sharp()) if(H.mind && H.stat == CONSCIOUS && H != user && (H.health - (I.force * I.attack_weight)) <= 0) // rev deconversion through blunt trauma. var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev) if(rev) @@ -1648,7 +1687,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/damage_amount = forced ? damage : damage * hit_percent * staminamod * H.physiology.stamina_mod if(BP) if(BP.receive_damage(0, 0, damage_amount)) - H.update_stamina() + H.update_stamina(TRUE) else H.adjustStaminaLoss(damage_amount) if(BRAIN) @@ -1728,11 +1767,11 @@ GLOBAL_LIST_EMPTY(roundstart_races) if (burn_damage) switch(burn_damage) if(0 to 2) - H.throw_alert("temp", /obj/screen/alert/hot, 1) + H.throw_alert("temp", /atom/movable/screen/alert/hot, 1) if(2 to 4) - H.throw_alert("temp", /obj/screen/alert/hot, 2) + H.throw_alert("temp", /atom/movable/screen/alert/hot, 2) else - H.throw_alert("temp", /obj/screen/alert/hot, 3) + H.throw_alert("temp", /atom/movable/screen/alert/hot, 3) burn_damage = burn_damage * heatmod * H.physiology.heat_mod if (H.stat < UNCONSCIOUS && (prob(burn_damage) * 10) / 4) //40% for level 3 damage on humans H.emote("scream") @@ -1745,13 +1784,13 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.add_movespeed_modifier(MOVESPEED_ID_COLD, override = TRUE, multiplicative_slowdown = ((BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR), blacklisted_movetypes = FLOATING) switch(H.bodytemperature) if(200 to BODYTEMP_COLD_DAMAGE_LIMIT) - H.throw_alert("temp", /obj/screen/alert/cold, 1) + H.throw_alert("temp", /atom/movable/screen/alert/cold, 1) H.apply_damage(COLD_DAMAGE_LEVEL_1*coldmod*H.physiology.cold_mod, BURN) if(120 to 200) - H.throw_alert("temp", /obj/screen/alert/cold, 2) + H.throw_alert("temp", /atom/movable/screen/alert/cold, 2) H.apply_damage(COLD_DAMAGE_LEVEL_2*coldmod*H.physiology.cold_mod, BURN) else - H.throw_alert("temp", /obj/screen/alert/cold, 3) + H.throw_alert("temp", /atom/movable/screen/alert/cold, 3) H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod*H.physiology.cold_mod, BURN) else @@ -1766,21 +1805,21 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(HAZARD_HIGH_PRESSURE to INFINITY) if(!HAS_TRAIT(H, TRAIT_RESISTHIGHPRESSURE)) H.adjustBruteLoss(min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 ) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod) - H.throw_alert("pressure", /obj/screen/alert/highpressure, 2) + H.throw_alert("pressure", /atom/movable/screen/alert/highpressure, 2) else H.clear_alert("pressure") if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) - H.throw_alert("pressure", /obj/screen/alert/highpressure, 1) + H.throw_alert("pressure", /atom/movable/screen/alert/highpressure, 1) if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) H.clear_alert("pressure") if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) - H.throw_alert("pressure", /obj/screen/alert/lowpressure, 1) + H.throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 1) else if(HAS_TRAIT(H, TRAIT_RESISTLOWPRESSURE)) H.clear_alert("pressure") else H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod) - H.throw_alert("pressure", /obj/screen/alert/lowpressure, 2) + H.throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 2) ////////// // FIRE // @@ -1795,26 +1834,26 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/list/obscured = H.check_obscured_slots(TRUE) //HEAD// - if(H.glasses && !(SLOT_GLASSES in obscured)) + if(H.glasses && !(ITEM_SLOT_EYES in obscured)) burning_items += H.glasses - if(H.wear_mask && !(SLOT_WEAR_MASK in obscured)) + if(H.wear_mask && !(ITEM_SLOT_MASK in obscured)) burning_items += H.wear_mask - if(H.wear_neck && !(SLOT_NECK in obscured)) + if(H.wear_neck && !(ITEM_SLOT_NECK in obscured)) burning_items += H.wear_neck - if(H.ears && !(SLOT_EARS in obscured)) + if(H.ears && !(ITEM_SLOT_EARS in obscured)) burning_items += H.ears if(H.head) burning_items += H.head //CHEST// - if(H.w_uniform && !(SLOT_W_UNIFORM in obscured)) + if(H.w_uniform && !(ITEM_SLOT_ICLOTHING in obscured)) burning_items += H.w_uniform if(H.wear_suit) burning_items += H.wear_suit //ARMS & HANDS// var/obj/item/clothing/arm_clothes = null - if(H.gloves && !(SLOT_GLOVES in obscured)) + if(H.gloves && !(ITEM_SLOT_GLOVES in obscured)) arm_clothes = H.gloves else if(H.wear_suit && ((H.wear_suit.body_parts_covered & HANDS) || (H.wear_suit.body_parts_covered & ARMS))) arm_clothes = H.wear_suit @@ -1825,7 +1864,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) //LEGS & FEET// var/obj/item/clothing/leg_clothes = null - if(H.shoes && !(SLOT_SHOES in obscured)) + if(H.shoes && !(ITEM_SLOT_FEET in obscured)) leg_clothes = H.shoes else if(H.wear_suit && ((H.wear_suit.body_parts_covered & FEET) || (H.wear_suit.body_parts_covered & LEGS))) leg_clothes = H.wear_suit @@ -1977,3 +2016,41 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(isturf(H.loc)) var/turf/T = H.loc T.Entered(H) + +///Calls the DMI data for a custom icon for a given bodypart from the Species Datum. +/datum/species/proc/get_custom_icons(var/part) + return +/*Here's what a species that has a unique icon for every slot would look like. If your species doesnt have any custom icons for a given part, return null. +/datum/species/teshari/get_custom_icons(var/part) + switch(part) + if("uniform") + return 'icons/mob/species/teshari/tesh_uniforms.dmi' + if("gloves") + return 'icons/mob/species/teshari/tesh_gloves.dmi' + if("glasses") + return 'icons/mob/species/teshari/tesh_glasses.dmi' + if("ears") + return 'icons/mob/species/teshari/tesh_ears.dmi' + if("shoes") + return 'icons/mob/species/teshari/tesh_shoes.dmi' + if("head") + return 'icons/mob/species/teshari/tesh_head.dmi' + if("belt") + return 'icons/mob/species/teshari/tesh_belts.dmi' + if("suit") + return 'icons/mob/species/teshari/tesh_suits.dmi' + if("mask") + return 'icons/mob/species/teshari/tesh_masks.dmi' + if("back") + return 'icons/mob/species/teshari/tesh_back.dmi' + if("generic") + return 'icons/mob/species/teshari/tesh_generic.dmi' + else + return +*/ + +/datum/species/proc/get_item_offsets_for_index(i) + return + +/datum/species/proc/get_harm_descriptors() + return diff --git a/code/modules/mob/living/carbon/human/species_types/IPC.dm b/code/modules/mob/living/carbon/human/species_types/IPC.dm index d855bfe19cf59..02bc0ca066dcd 100644 --- a/code/modules/mob/living/carbon/human/species_types/IPC.dm +++ b/code/modules/mob/living/carbon/human/species_types/IPC.dm @@ -1,23 +1,24 @@ -/datum/species/ipc // im fucking lazy mk2 and cant get sprites to normally work - name = "IPC" //inherited from the real species, for health scanners and things - id = "ipc" - say_mod = "states" //inherited from a user's real species - sexes = 0 - species_traits = list(NOTRANSSTING,NOEYESPRITES,NO_DNA_COPY,NOBLOOD,TRAIT_EASYDISMEMBER,ROBOTIC_LIMBS,NOZOMBIE,MUTCOLORS,REVIVESBYHEALING,NOHUSK,NOMOUTH) //all of these + whatever we inherit from the real species - inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RADIMMUNE,TRAIT_LIMBATTACHMENT,TRAIT_NOCRITDAMAGE) +/datum/species/ipc + name = "IPC" + id = SPECIES_IPC + bodyflag = FLAG_IPC + say_mod = "states" + sexes = FALSE + species_traits = list(NOTRANSSTING,NOEYESPRITES,NO_DNA_COPY,ROBOTIC_LIMBS,NOZOMBIE,MUTCOLORS,REVIVESBYHEALING,NOHUSK,NOMOUTH) + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RADIMMUNE,TRAIT_LIMBATTACHMENT,TRAIT_NOCRITDAMAGE,TRAIT_EASYDISMEMBER,TRAIT_POWERHUNGRY,TRAIT_XENO_IMMUNE, TRAIT_TOXIMMUNE) inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID) mutant_brain = /obj/item/organ/brain/positron mutanteyes = /obj/item/organ/eyes/robotic mutanttongue = /obj/item/organ/tongue/robot mutantliver = /obj/item/organ/liver/cybernetic/upgraded/ipc - mutantstomach = /obj/item/organ/stomach/cell + mutantstomach = /obj/item/organ/stomach/battery/ipc mutantears = /obj/item/organ/ears/robot mutant_organs = list(/obj/item/organ/cyberimp/arm/power_cord) mutant_bodyparts = list("ipc_screen", "ipc_antenna", "ipc_chassis") default_features = list("mcolor" = "#7D7D7D", "ipc_screen" = "Static", "ipc_antenna" = "None", "ipc_chassis" = "Morpheus Cyberkinetics(Greyscale)") meat = /obj/item/stack/sheet/plasteel{amount = 5} skinned_type = /obj/item/stack/sheet/iron{amount = 10} - exotic_blood = "oil" + exotic_blood = /datum/reagent/oil damage_overlay_type = "synth" limbs_id = "synth" mutant_bodyparts = list("ipc_screen", "ipc_antenna", "ipc_chassis") @@ -25,33 +26,36 @@ burnmod = 2 heatmod = 1.5 brutemod = 1 - toxmod = 0 clonemod = 0 staminamod = 0.8 siemens_coeff = 1.5 + blood_color = "#000000" reagent_tag = PROCESS_SYNTHETIC - species_gibs = "robotic" + species_gibs = GIB_TYPE_ROBOTIC attack_sound = 'sound/items/trayhit1.ogg' allow_numbers_in_name = TRUE deathsound = "sound/voice/borg_deathsound.ogg" - var/saved_screen //for saving the screen when they die - var/list/initial_species_traits //for getting these values back for assume_disguise() - var/list/initial_inherent_traits changesource_flags = MIRROR_BADMIN | WABBAJACK species_language_holder = /datum/language_holder/synthetic + special_step_sounds = list('sound/effects/servostep.ogg') + var/saved_screen //for saving the screen when they die var/datum/action/innate/change_screen/change_screen /datum/species/ipc/random_name(unique) var/ipc_name = "[pick(GLOB.posibrain_names)]-[rand(100, 999)]" return ipc_name -/datum/species/ipc/on_species_gain(mob/living/carbon/C) // Let's make that IPC actually robotic. +/datum/species/ipc/on_species_gain(mob/living/carbon/C) . = ..() - var/obj/item/organ/appendix/appendix = C.getorganslot("appendix") // Easiest way to remove it. - appendix.Remove(C) - QDEL_NULL(appendix) - ADD_TRAIT(C, TRAIT_XENO_IMMUNE, "xeno immune") //makes the IPC immune to huggers + var/obj/item/organ/appendix/A = C.getorganslot("appendix") //See below. + if(A) + A.Remove(C) + QDEL_NULL(A) + var/obj/item/organ/lungs/L = C.getorganslot("lungs") //Hacky and bad. Will be rewritten entirely in KapuCarbons anyway. + if(L) + L.Remove(C) + QDEL_NULL(L) if(ishuman(C) && !change_screen) change_screen = new change_screen.Grant(C) @@ -64,10 +68,16 @@ C.dna.species.species_traits += MUTCOLORS else if(MUTCOLORS in C.dna.species.species_traits) C.dna.species.species_traits -= MUTCOLORS + O.light_brute_msg = "scratched" + O.medium_brute_msg = "dented" + O.heavy_brute_msg = "sheared" + + O.light_burn_msg = "burned" + O.medium_burn_msg = "scorched" + O.heavy_burn_msg = "seared" -datum/species/ipc/on_species_loss(mob/living/carbon/C) +/datum/species/ipc/on_species_loss(mob/living/carbon/C) . = ..() - REMOVE_TRAIT(C, TRAIT_XENO_IMMUNE, "xeno immune") if(change_screen) change_screen.Remove(C) @@ -78,8 +88,12 @@ datum/species/ipc/on_species_loss(mob/living/carbon/C) saved_screen = C.dna.features["ipc_screen"] C.dna.features["ipc_screen"] = "BSOD" C.update_body() - sleep(3 SECONDS) - C.dna.features["ipc_screen"] = null // Turns off their monitor on death. + addtimer(CALLBACK(src, .proc/post_death, C), 5 SECONDS) + +/datum/species/ipc/proc/post_death(mob/living/carbon/C) + if(C.stat < DEAD) + return + C.dna.features["ipc_screen"] = null //Turns off screen on death C.update_body() /datum/action/innate/change_screen @@ -114,41 +128,45 @@ datum/species/ipc/on_species_loss(mob/living/carbon/C) user.changeNext_move(CLICK_CD_MELEE) var/obj/machinery/power/apc/A = target var/mob/living/carbon/human/H = user - var/obj/item/organ/stomach/cell/cell = locate(/obj/item/organ/stomach/cell) in H.internal_organs - if(!cell) + var/obj/item/organ/stomach/battery/battery = locate(/obj/item/organ/stomach/battery) in H.internal_organs + if(!battery) to_chat(H, "You try to siphon energy from the [A], but your power cell is gone!") return - if(A.cell && A.cell.charge > 0) - if(H.nutrition >= NUTRITION_LEVEL_WELL_FED) + if(A.cell && A.cell.charge > A.cell.maxcharge/4) + if(H.nutrition >= NUTRITION_LEVEL_ALMOST_FULL) to_chat(user, "You are already fully charged!") return else powerdraw_loop(A, H) return - to_chat(user, "There is no charge to draw from that APC.") + to_chat(user, "There is not enough charge to draw from that APC.") /obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H) H.visible_message("[H] inserts a power connector into the [A].", "You begin to draw power from the [A].") + var/obj/item/organ/stomach/battery/battery = locate(/obj/item/organ/stomach/battery) in H.internal_organs while(do_after(H, 10, target = A)) + if(!battery) + to_chat(H, "You need a battery to recharge!") + break if(loc != H) to_chat(H, "You must keep your connector out while charging!") break - if(A.cell.charge == 0) + if(A.cell.charge <= A.cell.maxcharge/4) to_chat(H, "The [A] doesn't have enough charge to spare.") break A.charging = 1 - if(A.cell.charge >= 500) - H.nutrition += 50 + if(A.cell.charge > A.cell.maxcharge/4 + 250) + battery.adjust_charge(250) A.cell.charge -= 250 to_chat(H, "You siphon off some of the stored charge for your own use.") else - H.nutrition += A.cell.charge/10 - A.cell.charge = 0 + battery.adjust_charge(A.cell.charge - A.cell.maxcharge/4) + A.cell.charge = A.cell.maxcharge/4 to_chat(H, "You siphon off as much as the [A] can spare.") break - if(H.nutrition > NUTRITION_LEVEL_WELL_FED) + if(battery.charge >= battery.max_charge) to_chat(H, "You are now fully charged.") break H.visible_message("[H] unplugs from the [A].", "You unplug from the [A].") @@ -162,15 +180,26 @@ datum/species/ipc/on_species_loss(mob/living/carbon/C) H.visible_message("[H]'s cooling system fans stutter and stall. There is a faint, yet rapid beeping coming from inside their chassis.") /datum/species/ipc/spec_revival(mob/living/carbon/human/H) + H.notify_ghost_cloning("You have been repaired!") + H.grab_ghost() H.dna.features["ipc_screen"] = "BSOD" H.update_body() H.say("Reactivating [pick("core systems", "central subroutines", "key functions")]...") sleep(3 SECONDS) + if(H.stat == DEAD) + return H.say("Reinitializing [pick("personality matrix", "behavior logic", "morality subsystems")]...") sleep(3 SECONDS) + if(H.stat == DEAD) + return H.say("Finalizing setup...") sleep(3 SECONDS) + if(H.stat == DEAD) + return H.say("Unit [H.real_name] is fully functional. Have a nice day.") H.dna.features["ipc_screen"] = saved_screen H.update_body() return + +/datum/species/ipc/get_harm_descriptors() + return list("bleed" = "leaking", "brute" = "denting", "burn" = "burns") 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 31d20bfa67ae8..ebb5e5582690d 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -3,7 +3,8 @@ id = "android" say_mod = "states" species_traits = list(NOTRANSSTING,NOREAGENTS,NO_DNA_COPY,NOBLOOD,NOFLASH) - inherent_traits = list(TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT) + inherent_traits = list(TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,\ + TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT,TRAIT_NOCLONELOSS) inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID) meat = null damage_overlay_type = "synth" @@ -11,7 +12,7 @@ species_language_holder = /datum/language_holder/synthetic limbs_id = "synth" reagent_tag = PROCESS_SYNTHETIC - species_gibs = "robotic" + species_gibs = GIB_TYPE_ROBOTIC attack_sound = 'sound/items/trayhit1.ogg' changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT @@ -21,6 +22,8 @@ for(var/X in C.bodyparts) var/obj/item/bodypart/O = X O.change_bodypart_status(BODYPART_ROBOTIC, FALSE, TRUE) + O.brute_reduction = 5 + O.burn_reduction = 4 /datum/species/android/on_species_loss(mob/living/carbon/C) . = ..() @@ -28,3 +31,5 @@ for(var/X in C.bodyparts) var/obj/item/bodypart/O = X O.change_bodypart_status(BODYPART_ORGANIC,FALSE, TRUE) + O.brute_reduction = initial(O.brute_reduction) + O.burn_reduction = initial(O.burn_reduction) diff --git a/code/modules/mob/living/carbon/human/species_types/apid.dm b/code/modules/mob/living/carbon/human/species_types/apid.dm index cec5dfdd83e7f..0a45aa860e8b3 100644 --- a/code/modules/mob/living/carbon/human/species_types/apid.dm +++ b/code/modules/mob/living/carbon/human/species_types/apid.dm @@ -1,11 +1,13 @@ /datum/species/apid // Beepeople, god damn it. It's hip, and alive! - Fuck ubunutu edition name = "Apids" - id = "apid" + id = SPECIES_APID + bodyflag = FLAG_APID say_mod = "buzzes" default_color = "FFE800" - species_traits = list(LIPS, NOEYESPRITES, TRAIT_BEEFRIEND) - inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG) + species_traits = list(LIPS,NOEYESPRITES) + inherent_traits = list(TRAIT_BEEFRIEND) + inherent_biotypes = list(MOB_ORGANIC,MOB_HUMANOID,MOB_BUG) mutanttongue = /obj/item/organ/tongue/bee attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' @@ -17,11 +19,29 @@ mutanteyes = /obj/item/organ/eyes/apid mutantlungs = /obj/item/organ/lungs/apid mutantwings = /obj/item/organ/wings/bee - heatmod = 1.5 - coldmod = 1.5 burnmod = 1.5 + toxmod = 1.5 + staminamod = 1.25 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT species_language_holder = /datum/language_holder/apid + inert_mutation = WAXSALIVA + var/cold_cycle = 0 + +/datum/species/apid/spec_life(mob/living/carbon/human/H) + . = ..() + if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !H.IsSleeping() && !HAS_TRAIT(H,TRAIT_RESISTCOLD)) // Sleep when cold, like bees + cold_cycle++ + if(prob(5)) + to_chat(H, "The cold is making you feel tired...") + switch(cold_cycle) + if(5 to 10) + H.drowsyness++ + if(10 to INFINITY) + H.SetSleeping(50) // Should be 5 seconds + cold_cycle = 0 // Resets the cycle, they have a chance to get out after waking up + + else + cold_cycle = 0 /datum/species/apid/random_name(gender,unique,lastname) if(unique) @@ -40,7 +60,20 @@ return 0 /datum/species/apid/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - . = ..() if(chem.type == /datum/reagent/toxin/pestkiller) H.adjustToxLoss(3) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) \ No newline at end of file + H.reagents.remove_reagent(chem.type, chem.metabolization_rate) + return FALSE + return ..() + +/datum/species/apid/after_equip_job(datum/job/J, mob/living/carbon/human/H) // For roundstart + H.mind?.teach_crafting_recipe(/datum/crafting_recipe/honeycomb) + return ..() + +/datum/species/apid/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) // For transformations + C.mind?.teach_crafting_recipe(/datum/crafting_recipe/honeycomb) + return ..() + +/datum/species/apid/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + C.mind?.forget_crafting_recipe(/datum/crafting_recipe/honeycomb) + return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/debug.dm b/code/modules/mob/living/carbon/human/species_types/debug.dm new file mode 100644 index 0000000000000..95f901a567fce --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/debug.dm @@ -0,0 +1,41 @@ +/datum/species/debug + name = "CODER DISASTER" + id = "debug" + bodyflag = FLAG_DEBUG_SPECIES + changesource_flags = MIRROR_BADMIN + sexes = 0 + +/datum/species/debug/get_custom_icons(var/part) + switch(part) + if("uniform") + return 'icons/mob/species/debug/debug_all.dmi' + if("gloves") + return 'icons/mob/species/debug/debug_all.dmi' + if("glasses") + return 'icons/mob/species/debug/debug_all.dmi' + if("ears") + return 'icons/mob/species/debug/debug_all.dmi' + if("shoes") + return 'icons/mob/species/debug/debug_all.dmi' + if("head") + return 'icons/mob/species/debug/debug_all.dmi' + if("belt") + return 'icons/mob/species/debug/debug_all.dmi' + if("suit") + return 'icons/mob/species/debug/debug_all.dmi' + if("mask") + return 'icons/mob/species/debug/debug_all.dmi' + if("back") + return 'icons/mob/species/debug/debug_all.dmi' + if("generic") + return 'icons/mob/species/debug/debug_all.dmi' + else + return + +/obj/item/clothing/head/ushanka/spritesheet_debug + name = "Racist Ushanka" + desc = "The Return" + flags_inv = HIDEEARS|HIDEHAIR + icon_state = "ushankadown" + item_state = "ushankadown" + sprite_sheets = FLAG_DEBUG_SPECIES //The small emblem on the ushanka will appear green for the debug species instead of red 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 a699354b7ae34..88b4413da976c 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -3,7 +3,7 @@ id = "dullahan" default_color = "FFFFFF" species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS) - inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH) + inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH, TRAIT_NONECRODISEASE) default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None") use_skintones = TRUE mutant_brain = /obj/item/organ/brain/dullahan @@ -24,17 +24,16 @@ /datum/species/dullahan/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) . = ..() - H.flags_1 &= ~HEAR_1 + REMOVE_TRAIT(src, TRAIT_HEARING_SENSITIVE, TRAIT_GENERIC) var/obj/item/bodypart/head/head = H.get_bodypart(BODY_ZONE_HEAD) if(head) head.drop_limb() - head.flags_1 = HEAR_1 head.throwforce = 25 myhead = new /obj/item/dullahan_relay (head, H) H.put_in_hands(head) /datum/species/dullahan/on_species_loss(mob/living/carbon/human/H) - H.flags_1 |= ~HEAR_1 + H.become_hearing_sensitive() H.reset_perspective(H) if(myhead) var/obj/item/dullahan_relay/DR = myhead @@ -109,22 +108,22 @@ /obj/item/dullahan_relay var/mob/living/owner - flags_1 = HEAR_1 /obj/item/dullahan_relay/Initialize(mapload,new_owner) . = ..() owner = new_owner START_PROCESSING(SSobj, src) + become_hearing_sensitive(ROUNDSTART_TRAIT) /obj/item/dullahan_relay/process() if(!istype(loc, /obj/item/bodypart/head) || QDELETED(owner)) . = PROCESS_KILL qdel(src) -/obj/item/dullahan_relay/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/obj/item/dullahan_relay/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) . = ..() if(!QDELETED(owner)) - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) + message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods) to_chat(owner,message) else qdel(src) @@ -138,4 +137,4 @@ D.myhead = null owner.gib() owner = null - ..() + return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index 4a318f861a4d9..7713b5801b684 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -8,23 +8,23 @@ attack_sound = 'sound/weapons/etherealhit.ogg' miss_sound = 'sound/weapons/etherealmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ethereal - mutantstomach = /obj/item/organ/stomach/ethereal + mutantstomach = /obj/item/organ/stomach/battery/ethereal mutanttongue = /obj/item/organ/tongue/ethereal exotic_blood = /datum/reagent/consumable/liquidelectricity //Liquid Electricity. fuck you think of something better gamer siemens_coeff = 0.5 //They thrive on energy brutemod = 1.25 //They're weak to punches attack_type = BURN //burn bish damage_overlay_type = "" //We are too cool for regular damage overlays - species_traits = list(DYNCOLORS, AGENDER, NO_UNDERWEAR, HAIR) + species_traits = list(DYNCOLORS, AGENDER, HAIR) changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT species_language_holder = /datum/language_holder/ethereal - inherent_traits = list(TRAIT_NOHUNGER) + inherent_traits = list(TRAIT_POWERHUNGRY) sexes = FALSE //no fetish content allowed toxic_food = NONE hair_color = "fixedmutcolor" hair_alpha = 140 + swimming_component = /datum/component/swimming/ethereal var/current_color - var/ethereal_charge = ETHEREAL_CHARGE_FULL var/EMPeffect = FALSE var/emageffect = FALSE var/r1 @@ -76,6 +76,8 @@ H.update_body() /datum/species/ethereal/proc/on_emp_act(mob/living/carbon/human/H, severity) + SIGNAL_HANDLER + EMPeffect = TRUE spec_updatehealth(H) to_chat(H, "You feel the light of your body leave you.") @@ -86,6 +88,8 @@ addtimer(CALLBACK(src, .proc/stop_emp, H), 20 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 20 seconds /datum/species/ethereal/proc/on_emag_act(mob/living/carbon/human/H, mob/user) + SIGNAL_HANDLER + if(emageffect) return emageffect = TRUE @@ -119,30 +123,23 @@ spec_updatehealth(H) H.visible_message("[H] stops flickering and goes back to their normal state!") -/datum/species/ethereal/proc/handle_charge(mob/living/carbon/human/H) +/datum/species/ethereal/handle_charge(mob/living/carbon/human/H) brutemod = 1.25 - switch(get_charge(H)) - if(ETHEREAL_CHARGE_NONE) - H.throw_alert("ethereal_charge", /obj/screen/alert/etherealcharge, 3) - if(ETHEREAL_CHARGE_NONE to ETHEREAL_CHARGE_LOWPOWER) - H.throw_alert("ethereal_charge", /obj/screen/alert/etherealcharge, 2) + if(HAS_TRAIT(H, TRAIT_NOHUNGER)) + return + switch(H.nutrition) + if(NUTRITION_LEVEL_FED to INFINITY) + H.clear_alert("nutrition") + if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_FED) + H.throw_alert("nutrition", /atom/movable/screen/alert/etherealcharge, 1) + brutemod = 1.5 + if(1 to NUTRITION_LEVEL_STARVING) + H.throw_alert("nutrition", /atom/movable/screen/alert/etherealcharge, 2) if(H.health > 10.5) apply_damage(0.65, TOX, null, null, H) brutemod = 1.75 - if(ETHEREAL_CHARGE_LOWPOWER to ETHEREAL_CHARGE_NORMAL) - H.throw_alert("ethereal_charge", /obj/screen/alert/etherealcharge, 1) - brutemod = 1.5 else - H.clear_alert("ethereal_charge") - -/datum/species/ethereal/proc/get_charge(mob/living/carbon/H) //this feels like it should be somewhere else. Eh? - var/obj/item/organ/stomach/ethereal/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) - if(istype(stomach)) - return stomach.crystal_charge - return ETHEREAL_CHARGE_NONE - -/datum/species/ethereal/proc/adjust_charge(var/change) - ethereal_charge = CLAMP(ethereal_charge + change, ETHEREAL_CHARGE_NONE, ETHEREAL_CHARGE_FULL) - -/datum/species/ethereal/proc/set_charge(var/change) - ethereal_charge = CLAMP(change, ETHEREAL_CHARGE_NONE, ETHEREAL_CHARGE_FULL) + H.throw_alert("nutrition", /atom/movable/screen/alert/etherealcharge, 3) + if(H.health > 10.5) + apply_damage(1, TOX, null, null, H) + brutemod = 2 diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm index bcf8345b428fe..a018c152feb01 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -1,19 +1,24 @@ //Subtype of human /datum/species/human/felinid name = "Felinid" - id = "felinid" + id = SPECIES_FELINID + bodyflag = FLAG_FELINID limbs_id = "human" + say_mod = "meows" disliked_food = VEGETABLES | SUGAR liked_food = DAIRY | MEAT mutant_bodyparts = list("ears", "tail_human") - default_features = list("mcolor" = "FFF", "tail_human" = "Cat", "ears" = "Cat", "wings" = "None") + default_features = list("mcolor" = "FFF", "wings" = "None") + forced_features = list("tail_human" = "Cat", "ears" = "Cat") mutantears = /obj/item/organ/ears/cat mutanttail = /obj/item/organ/tail/cat changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + swimming_component = /datum/component/swimming/felinid + /datum/species/human/felinid/qualifies_for_rank(rank, list/features) return TRUE @@ -94,8 +99,7 @@ tail.Remove(H) /datum/species/human/felinid/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/M) - .=..() - if(chem.type == /datum/reagent/consumable/cocoa) + if(istype(chem, /datum/reagent/consumable/cocoa)) if(prob(40)) M.adjust_disgust(20) if(prob(5)) @@ -107,6 +111,7 @@ var/obj/item/organ/guts = pick(M.internal_organs) guts.applyOrganDamage(15) return FALSE + return ..() /proc/mass_purrbation() diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index aad8ae1066a0c..337e3a2d15fe9 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -1,6 +1,7 @@ /datum/species/fly name = "Flyperson" - id = "fly" + id = SPECIES_FLY + bodyflag = FLAG_FLY say_mod = "buzzes" species_traits = list(NOEYESPRITES, NO_UNDERWEAR, TRAIT_BEEFRIEND) inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG) @@ -21,7 +22,7 @@ /datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.type == /datum/reagent/toxin/pestkiller) H.adjustToxLoss(3) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) + H.reagents.remove_reagent(chem.type, chem.metabolization_rate) return TRUE if(istype(chem, /datum/reagent/consumable)) var/datum/reagent/consumable/nutri_check = chem @@ -32,8 +33,7 @@ H.visible_message("[H] vomits on the floor!", \ "You throw up on the floor!") return TRUE - - ..() + return ..() // Change body types /datum/species/fly/on_species_gain(mob/living/carbon/C) 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 66b5980785888..3caf3273bf7c7 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -3,15 +3,15 @@ name = "Golem" id = "iron_golem" say_mod = "rumbles" - species_traits = list(NOBLOOD,MUTCOLORS,NO_UNDERWEAR) - inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) + species_traits = list(NOBLOOD,MUTCOLORS,NO_UNDERWEAR,NOTRANSSTING) + inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_NONECRODISEASE) inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID) mutant_organs = list(/obj/item/organ/adamantine_resonator) speedmod = 2 armor = 55 siemens_coeff = 0 punchdamage = 11 - no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM, SLOT_S_STORE) + no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_SUITSTORE) nojumpsuit = 1 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC sexes = 1 @@ -22,6 +22,7 @@ // changes, only the Random Golem type can be chosen limbs_id = "golem" fixed_mut_color = "aaa" + swimming_component = /datum/component/swimming/golem var/info_text = "As an Iron Golem, you don't have any special traits." var/random_eligible = TRUE //If false, the golem subtype can't be made through golem mutation toxin @@ -262,7 +263,7 @@ /datum/species/golem/alloy name = "Alien Alloy Golem" id = "alloy_golem" - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES) + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOTRANSSTING) limbs_id = "a_golem" meat = /obj/item/stack/sheet/mineral/abductor mutanttongue = /obj/item/organ/tongue/abductor @@ -318,8 +319,9 @@ /datum/species/golem/wood/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.type == /datum/reagent/toxin/plantbgone) H.adjustToxLoss(3) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) - return 1 + H.reagents.remove_reagent(chem.type, chem.metabolization_rate) + return TRUE + return ..() //Radioactive /datum/species/golem/uranium @@ -439,7 +441,7 @@ var/obj/item/I if(istype(AM, /obj/item)) I = AM - if(I.thrownby == H) //No throwing stuff at yourself to trigger the teleport + if(I.thrownby == WEAKREF(H)) //No throwing stuff at yourself to trigger the teleport return 0 else reactive_teleport(H) @@ -508,7 +510,7 @@ /datum/species/golem/bananium name = "Bananium Golem" id = "bananium_golem" - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES) + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOTRANSSTING) say_mod = "honks" punchdamage = 0 meat = /obj/item/stack/ore/bananium @@ -563,7 +565,7 @@ var/obj/item/I if(istype(AM, /obj/item)) I = AM - if(I.thrownby == H) //No throwing stuff at yourself to make bananas + if(I.thrownby == WEAKREF(H)) //No throwing stuff at yourself to make bananas return 0 else new/obj/item/grown/bananapeel/specialpeel(get_turf(H)) @@ -583,6 +585,8 @@ playsound(get_turf(H), 'sound/misc/sadtrombone.ogg', 70, 0) /datum/species/golem/bananium/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + speech_args[SPEECH_SPANS] |= SPAN_CLOWN /datum/species/golem/runic @@ -591,7 +595,7 @@ limbs_id = "cultgolem" sexes = FALSE info_text = "As a Runic Golem, you possess eldritch powers granted by the Elder Goddess Nar'Sie." - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH) //no mutcolors + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH,NOTRANSSTING) //no mutcolors prefix = "Runic" special_names = null random_eligible = FALSE //Zesko claims runic golems break the game @@ -611,12 +615,15 @@ . = ..() phase_shift = new phase_shift.charge_counter = 0 + phase_shift.start_recharge() C.AddSpell(phase_shift) abyssal_gaze = new abyssal_gaze.charge_counter = 0 + abyssal_gaze.start_recharge() C.AddSpell(abyssal_gaze) dominate = new dominate.charge_counter = 0 + dominate.start_recharge() C.AddSpell(dominate) /datum/species/golem/runic/on_species_loss(mob/living/carbon/C) @@ -631,21 +638,22 @@ /datum/species/golem/runic/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(istype(chem, /datum/reagent/water/holywater)) H.adjustFireLoss(4) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) + H.reagents.remove_reagent(chem.type, chem.metabolization_rate) + return TRUE if(chem.type == /datum/reagent/fuel/unholywater) H.adjustBruteLoss(-4) H.adjustFireLoss(-4) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) - - + H.reagents.remove_reagent(chem.type, chem.metabolization_rate) + return TRUE + return ..() /datum/species/golem/clockwork name = "Clockwork Golem" id = "clockwork_golem" say_mod = "clicks" limbs_id = "clockgolem" info_text = "As a Clockwork Golem, you are faster than other types of golems. On death, you will break down into scrap." - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH) + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH,NOTRANSSTING) inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID) armor = 20 //Reinforced, but much less so to allow for fast movement attack_verb = "smash" @@ -698,7 +706,7 @@ sexes = FALSE info_text = "As a Cloth Golem, you are able to reform yourself after death, provided your remains aren't burned or destroyed. You are, of course, very flammable. \ Being made of cloth, your body is magic resistant and faster than that of other golems, but weaker and less resilient." - species_traits = list(NOBLOOD,NO_UNDERWEAR) //no mutcolors, and can burn + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOTRANSSTING) //no mutcolors, and can burn inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOGUNS) inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID) armor = 15 //feels no pain, but not too resistant @@ -748,7 +756,7 @@ name = "pile of bandages" desc = "It emits a strange aura, as if there was still life within it..." max_integrity = 50 - armor = list("melee" = 90, "bullet" = 90, "laser" = 25, "energy" = 80, "bomb" = 50, "bio" = 100, "fire" = -50, "acid" = -50) + armor = list("melee" = 90, "bullet" = 90, "laser" = 25, "energy" = 80, "bomb" = 50, "bio" = 100, "fire" = -50, "acid" = -50, "stamina" = 0) icon = 'icons/obj/items_and_weapons.dmi' icon_state = "pile_bandages" resistance_flags = FLAMMABLE @@ -861,31 +869,31 @@ /datum/species/golem/bronze/proc/gong(mob/living/carbon/human/H) last_gong_time = world.time - for(var/mob/living/M in get_hearers_in_view(7,H)) + for(var/mob/living/M in hearers(7,H)) if(M.stat == DEAD) //F return if(M == H) - H.show_message("You cringe with pain as your body rings around you!", 2) + H.show_message("You cringe with pain as your body rings around you!", MSG_AUDIBLE) H.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE) H.soundbang_act(2, 0, 100, 1) H.jitteriness += 7 var/distance = max(0,get_dist(get_turf(H),get_turf(M))) switch(distance) if(0 to 1) - M.show_message("GONG!", 2) + M.show_message("GONG!", MSG_AUDIBLE) M.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE) M.soundbang_act(1, 0, 30, 3) M.confused += 10 M.jitteriness += 4 SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong) if(2 to 3) - M.show_message("GONG!", 2) + M.show_message("GONG!", MSG_AUDIBLE) M.playsound_local(H, 'sound/effects/gong.ogg', 75, TRUE) M.soundbang_act(1, 0, 15, 2) M.jitteriness += 3 SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong) else - M.show_message("GONG!", 2) + M.show_message("GONG!", MSG_AUDIBLE) M.playsound_local(H, 'sound/effects/gong.ogg', 50, TRUE) @@ -895,7 +903,7 @@ prefix = "Cardboard" special_names = list("Box") info_text = "As a Cardboard Golem, you aren't very strong, but you are a bit quicker and can easily create more brethren by using cardboard on yourself." - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH) + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH,NOTRANSSTING) inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) limbs_id = "c_golem" //special sprites attack_verb = "whips" @@ -952,7 +960,7 @@ prefix = "Durathread" limbs_id = "d_golem" special_names = list("Boll","Weave") - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH) + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH,NOTRANSSTING) fixed_mut_color = null inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) info_text = "As a Durathread Golem, your strikes will cause those your targets to start choking, but your woven body won't withstand fire as well." @@ -992,7 +1000,6 @@ ..() /datum/species/golem/bone/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - . = ..() if(chem.type == /datum/reagent/consumable/milk) if(chem.volume >= 6) H.reagents.remove_reagent(chem.type, chem.volume - 5) @@ -1005,7 +1012,7 @@ H.adjustBruteLoss(0.5, 0) H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) return TRUE - + return ..() /datum/action/innate/bonechill name = "Bone Chill" desc = "Rattle your bones and strike fear into your enemies!" @@ -1051,7 +1058,7 @@ info_text = "As a Snow Golem, you are extremely vulnerable to burn damage, but you can generate snowballs and shoot cryokinetic beams. You will also turn to snow when dying, preventing any form of recovery." prefix = "Snow" special_names = list("Flake", "Blizzard", "Storm") - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES) //no mutcolors, no eye sprites + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOTRANSSTING) //no mutcolors, no eye sprites inherent_traits = list(TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) var/obj/effect/proc_holder/spell/targeted/conjure_item/snowball/ball @@ -1071,9 +1078,11 @@ C.weather_immunities |= "snow" ball = new ball.charge_counter = 0 + ball.start_recharge() C.AddSpell(ball) cryo = new cryo.charge_counter = 0 + cryo.start_recharge() C.AddSpell(cryo) /datum/species/golem/snow/on_species_loss(mob/living/carbon/C) @@ -1099,7 +1108,7 @@ attack_verb = "monopoliz" limbs_id = "ca_golem" special_names = list("John D. Rockefeller","Rich Uncle Pennybags","Commodore Vanderbilt","Entrepreneur","Mr. Moneybags", "Adam Smith") - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH) + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH,NOTRANSSTING) fixed_mut_color = null inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) info_text = "As a Capitalist Golem, your fist spreads the powerful industrializing light of capitalism." @@ -1111,7 +1120,7 @@ /datum/species/golem/capitalist/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() - C.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/advanced (), SLOT_GLASSES) + C.equip_to_slot_or_del(new /obj/item/clothing/glasses/monocle (), ITEM_SLOT_EYES) C.revive(full_heal = TRUE) SEND_SOUND(C, sound('sound/misc/capitialism.ogg')) @@ -1134,6 +1143,8 @@ target.adjust_nutrition(40) /datum/species/golem/capitalist/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + playsound(source, 'sound/misc/mymoney.ogg', 25, 0) speech_args[SPEECH_MESSAGE] = "Hello, I like money!" @@ -1144,7 +1155,7 @@ attack_verb = "nationaliz" limbs_id = "s_golem" special_names = list("Stalin","Lenin","Trotsky","Marx","Comrade") //comrade comrade - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH) + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH,NOTRANSSTING) fixed_mut_color = null inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) info_text = "As a Soviet Golem, your fist spreads the bright soviet light of communism." @@ -1153,7 +1164,7 @@ /datum/species/golem/soviet/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() - C.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka (), SLOT_HEAD) + C.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka (), ITEM_SLOT_HEAD) C.revive(full_heal = TRUE) SEND_SOUND(C, sound('sound/misc/Russian_Anthem_chorus.ogg')) @@ -1176,5 +1187,7 @@ target.adjust_nutrition(-40) /datum/species/golem/soviet/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + playsound(source, 'sound/misc/Cyka Blyat.ogg', 25, 0) speech_args[SPEECH_MESSAGE] = "Cyka Blyat" 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 d3a2505853b50..1c77f0890f152 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -1,6 +1,6 @@ /datum/species/human name = "Human" - id = "human" + id = SPECIES_HUMAN default_color = "FFFFFF" species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS) default_features = list("mcolor" = "FFF", "wings" = "None") 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 92292bbab1eaa..c4e0f7014343c 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -3,9 +3,9 @@ name = "Jellyperson" id = "jelly" default_color = "00FF90" - say_mod = "chirps" + say_mod = "blorbles" species_traits = list(MUTCOLORS,EYECOLOR,NOBLOOD) - inherent_traits = list(TRAIT_TOXINLOVER) + inherent_traits = list(TRAIT_TOXINLOVER, TRAIT_NONECRODISEASE) mutantlungs = /obj/item/organ/lungs/slime meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime exotic_blood = /datum/reagent/toxin/slimejelly @@ -18,6 +18,7 @@ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT inherent_factions = list("slime") species_language_holder = /datum/language_holder/jelly + swimming_component = /datum/component/swimming/dissolve /datum/species/jelly/on_species_loss(mob/living/carbon/C) if(regenerate_limbs) @@ -191,6 +192,13 @@ if(!isslimeperson(H)) return CHECK_DNA_AND_SPECIES(H) + + //Prevent one person from creating 100 bodies. + var/datum/species/jelly/slime/species = H.dna.species + if(length(species.bodies) > CONFIG_GET(number/max_slimeperson_bodies)) + to_chat(H, "Your mind is spread too thin! You have too many bodies already.") + return + H.visible_message("[owner] gains a look of \ concentration while standing perfectly still.", "You focus intently on moving your body while \ @@ -271,6 +279,7 @@ if(!ui) ui = new(user, src, "SlimeBodySwapper") ui.open() + ui.set_autoupdate(TRUE) // Body status (health, occupied, etc.) /datum/action/innate/swap_body/ui_data(mob/user) var/mob/living/carbon/human/H = owner @@ -406,18 +415,25 @@ var/datum/action/innate/use_extract/major/extract_major var/extract_cooldown = 0 +//Species datums don't normally implement destroy, but JELLIES SUCK ASS OUT OF A STEEL STRAW +/datum/species/jelly/luminescent/Destroy(force, ...) + current_extract = null + QDEL_NULL(glow) + QDEL_NULL(integrate_extract) + QDEL_NULL(extract_major) + QDEL_NULL(extract_minor) + return ..() + + /datum/species/jelly/luminescent/on_species_loss(mob/living/carbon/C) ..() if(current_extract) current_extract.forceMove(C.drop_location()) current_extract = null - qdel(glow) - if(integrate_extract) - integrate_extract.Remove(C) - if(extract_minor) - extract_minor.Remove(C) - if(extract_major) - extract_major.Remove(C) + QDEL_NULL(glow) + QDEL_NULL(integrate_extract) + QDEL_NULL(extract_major) + QDEL_NULL(extract_minor) /datum/species/jelly/luminescent/on_species_gain(mob/living/carbon/C, datum/species/old_species) ..() @@ -460,13 +476,9 @@ button_icon_state = "slimeconsume" icon_icon = 'icons/mob/actions/actions_slime.dmi' background_icon_state = "bg_alien" - var/datum/species/jelly/luminescent/species - -/datum/action/innate/integrate_extract/New(_species) - ..() - species = _species /datum/action/innate/integrate_extract/proc/update_name() + var/datum/species/jelly/luminescent/species = target if(!species || !species.current_extract) name = "Integrate Extract" desc = "Eat a slime extract to use its properties." @@ -475,19 +487,22 @@ desc = "Eject your current slime extract." /datum/action/innate/integrate_extract/UpdateButtonIcon(status_only, force) + var/datum/species/jelly/luminescent/species = target if(!species || !species.current_extract) button_icon_state = "slimeconsume" else button_icon_state = "slimeeject" ..() -/datum/action/innate/integrate_extract/ApplyIcon(obj/screen/movable/action_button/current_button, force) +/datum/action/innate/integrate_extract/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) ..(current_button, TRUE) + var/datum/species/jelly/luminescent/species = target if(species?.current_extract) current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state)) /datum/action/innate/integrate_extract/Activate() var/mob/living/carbon/human/H = owner + var/datum/species/jelly/luminescent/species = target if(!is_species(H, /datum/species/jelly/luminescent) || !species) return CHECK_DNA_AND_SPECIES(H) @@ -523,28 +538,27 @@ icon_icon = 'icons/mob/actions/actions_slime.dmi' background_icon_state = "bg_alien" var/activation_type = SLIME_ACTIVATE_MINOR - var/datum/species/jelly/luminescent/species - -/datum/action/innate/use_extract/New(_species) - ..() - species = _species /datum/action/innate/use_extract/IsAvailable() if(..()) + var/datum/species/jelly/luminescent/species = target if(species && species.current_extract && (world.time > species.extract_cooldown)) return TRUE return FALSE -/datum/action/innate/use_extract/ApplyIcon(obj/screen/movable/action_button/current_button, force) +/datum/action/innate/use_extract/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) ..(current_button, TRUE) + var/mob/living/carbon/human/H = owner + var/datum/species/jelly/luminescent/species = H.dna.species if(species && species.current_extract) current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state)) /datum/action/innate/use_extract/Activate() var/mob/living/carbon/human/H = owner + CHECK_DNA_AND_SPECIES(H) + var/datum/species/jelly/luminescent/species = H.dna.species if(!is_species(H, /datum/species/jelly/luminescent) || !species) return - CHECK_DNA_AND_SPECIES(H) if(species.current_extract) species.extract_cooldown = world.time + 100 @@ -568,22 +582,35 @@ var/datum/action/innate/link_minds/link_minds var/list/mob/living/linked_mobs = list() var/list/datum/action/innate/linked_speech/linked_actions = list() - var/mob/living/carbon/human/slimelink_owner + var/datum/weakref/slimelink_owner var/current_link_id = 0 +//Species datums don't normally implement destroy, but JELLIES SUCK ASS OUT OF A STEEL STRAW +/datum/species/jelly/stargazer/Destroy() + for(var/mob/living/link_to_clear as anything in linked_mobs) + unlink_mob(link_to_clear) + linked_mobs.Cut() + QDEL_NULL(project_thought) + QDEL_NULL(link_minds) + slimelink_owner = null + return ..() + /datum/species/jelly/stargazer/on_species_loss(mob/living/carbon/C) ..() - for(var/M in linked_mobs) - unlink_mob(M) + for(var/mob/living/link_to_clear as anything in linked_mobs) + unlink_mob(link_to_clear) if(project_thought) - project_thought.Remove(C) + QDEL_NULL(project_thought) if(link_minds) - link_minds.Remove(C) + QDEL_NULL(link_minds) + slimelink_owner = null /datum/species/jelly/stargazer/spec_death(gibbed, mob/living/carbon/human/H) ..() - for(var/M in linked_mobs) - unlink_mob(M) + for(var/mob/living/link_to_clear as anything in linked_mobs) + if(link_to_clear == H) + continue + unlink_mob(link_to_clear) /datum/species/jelly/stargazer/on_species_gain(mob/living/carbon/C, datum/species/old_species) ..() @@ -591,7 +618,7 @@ project_thought.Grant(C) link_minds = new(src) link_minds.Grant(C) - slimelink_owner = C + slimelink_owner = WEAKREF(C) link_mob(C) /datum/species/jelly/stargazer/proc/link_mob(mob/living/M) @@ -599,14 +626,18 @@ return FALSE if(HAS_TRAIT(M, TRAIT_MINDSHIELD)) //mindshield implant, no dice return FALSE - if(istype(M.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) - to_chat(M, "[slimelink_owner.real_name]'s no-good syndicate mind-slime is blocked by your protective headgear!") + var/mob/living/carbon/human/owner = slimelink_owner.resolve() + if(istype(M.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(owner) + to_chat(M, "[owner.real_name]'s no-good syndicate mind-slime is blocked by your protective headgear!") return FALSE if(M in linked_mobs) return FALSE + if(!owner) + return FALSE linked_mobs.Add(M) - to_chat(M, "You are now connected to [slimelink_owner.real_name]'s Slime Link.") + to_chat(M, "You are now connected to [owner.real_name]'s Slime Link.") var/datum/action/innate/linked_speech/action = new(src) linked_actions.Add(action) action.Grant(M) @@ -618,9 +649,12 @@ return var/datum/action/innate/linked_speech/action = linked_actions[link_id] action.Remove(M) - to_chat(M, "You are no longer connected to [slimelink_owner.real_name]'s Slime Link.") - linked_mobs[link_id] = null - linked_actions[link_id] = null + var/mob/living/carbon/human/owner = slimelink_owner.resolve() + if(owner) + to_chat(M, "You are no longer connected to [owner.real_name]'s Slime Link.") + linked_mobs -= M + linked_actions -= action + qdel(action) /datum/action/innate/linked_speech name = "Slimelink" @@ -628,14 +662,10 @@ button_icon_state = "link_speech" icon_icon = 'icons/mob/actions/actions_slime.dmi' background_icon_state = "bg_alien" - var/datum/species/jelly/stargazer/species - -/datum/action/innate/linked_speech/New(_species) - ..() - species = _species /datum/action/innate/linked_speech/Activate() var/mob/living/carbon/human/H = owner + var/datum/species/jelly/stargazer/species = target if(!species || !(H in species.linked_mobs)) to_chat(H, "The link seems to have been severed...") Remove(H) @@ -652,9 +682,11 @@ species.unlink_mob(H) return - if(message) - var/msg = "\[[species.slimelink_owner.real_name]'s Slime Link\] [H]: [message]" - log_directed_talk(H, species.slimelink_owner, msg, LOG_SAY, "slime link") + var/mob/living/carbon/human/star_owner = species.slimelink_owner.resolve() + + if(message && star_owner) + var/msg = "\[[star_owner.real_name]'s Slime Link\] [H]: [message]" + log_directed_talk(H, star_owner, msg, LOG_SAY, "slime link") for(var/X in species.linked_mobs) var/mob/living/M = X if(QDELETED(M) || M.stat == DEAD) @@ -707,11 +739,6 @@ button_icon_state = "mindlink" icon_icon = 'icons/mob/actions/actions_slime.dmi' background_icon_state = "bg_alien" - var/datum/species/jelly/stargazer/species - -/datum/action/innate/link_minds/New(_species) - ..() - species = _species /datum/action/innate/link_minds/Activate() var/mob/living/carbon/human/H = owner @@ -724,6 +751,7 @@ return var/mob/living/target = H.pulling + var/datum/species/jelly/stargazer/species = H.dna.species to_chat(H, "You begin linking [target]'s mind to yours...") to_chat(target, "You feel a foreign presence within your mind...") 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 2468c43defa30..dfe471dd3fb6b 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -1,7 +1,8 @@ /datum/species/lizard // Reptilian humanoids with scaled skin and tails. name = "Lizardperson" - id = "lizard" + id = SPECIES_LIZARD + bodyflag = FLAG_LIZARD say_mod = "hisses" default_color = "00FF00" species_traits = list(MUTCOLORS,EYECOLOR,LIPS) diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index d2478c1e995c1..c4fa04a44c3d1 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -1,6 +1,7 @@ /datum/species/moth name = "Mothman" - id = "moth" + id = SPECIES_MOTH + bodyflag = FLAG_MOTH say_mod = "flutters" default_color = "00FF00" species_traits = list(LIPS, NOEYESPRITES) @@ -31,11 +32,11 @@ return randname /datum/species/moth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - . = ..() if(chem.type == /datum/reagent/toxin/pestkiller) H.adjustToxLoss(3) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) - + H.reagents.remove_reagent(chem.type, chem.metabolization_rate) + return FALSE + return ..() /datum/species/moth/check_species_weakness(obj/item/weapon, mob/living/attacker) if(istype(weapon, /obj/item/melee/flyswatter)) return 9 //flyswatters deal 10x damage to moths 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 a3e518fe0b237..6105b98acc7ae 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -17,7 +17,7 @@ punchdamage = 12 - no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM) + no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING) burnmod = 1.25 heatmod = 1.5 @@ -50,6 +50,7 @@ H.adjustToxLoss(3) H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) return TRUE + return ..() /datum/species/mush/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour) forced_colour = FALSE diff --git a/code/modules/mob/living/carbon/human/species_types/oozelings.dm b/code/modules/mob/living/carbon/human/species_types/oozelings.dm new file mode 100644 index 0000000000000..930161bbdf64e --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/oozelings.dm @@ -0,0 +1,162 @@ +/datum/species/oozeling + name = "Oozeling" + id = SPECIES_OOZELING + bodyflag = FLAG_OOZELING + default_color = "00FF90" + say_mod = "blorbles" + species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR) + inherent_traits = list(TRAIT_TOXINLOVER,TRAIT_NOFIRE,TRAIT_ALWAYS_CLEAN,TRAIT_EASYDISMEMBER) + hair_color = "mutcolor" + hair_alpha = 150 + mutantlungs = /obj/item/organ/lungs/oozeling + meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime + exotic_blood = /datum/reagent/toxin/slimeooze + damage_overlay_type = "" + var/datum/action/innate/regenerate_limbs/regenerate_limbs + coldmod = 6 // = 3x cold damage + heatmod = 0.5 // = 1/4x heat damage + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + species_language_holder = /datum/language_holder/oozeling + limbs_id = "ooze" + swimming_component = /datum/component/swimming/dissolve + toxic_food = NONE + disliked_food = NONE + +/datum/species/oozeling/random_name(gender,unique,lastname) + if(unique) + return random_unique_ooze_name() + + var/randname = ooze_name() + + if(lastname) + randname += " [lastname]" + + return randname + +/datum/species/oozeling/on_species_loss(mob/living/carbon/C) + if(regenerate_limbs) + regenerate_limbs.Remove(C) + ..() + +/datum/species/oozeling/on_species_gain(mob/living/carbon/C, datum/species/old_species) + ..() + if(ishuman(C)) + regenerate_limbs = new + regenerate_limbs.Grant(C) + +/datum/species/oozeling/spec_life(mob/living/carbon/human/H) + ..() + if(H.stat == DEAD) //can't farm slime jelly from a dead slime/jelly person indefinitely + return + if(!H.blood_volume) + H.blood_volume += 5 + H.adjustBruteLoss(5) + to_chat(H, "You feel empty!") + if(H.nutrition >= NUTRITION_LEVEL_WELL_FED && H.blood_volume <= 672) + if(H.nutrition >= NUTRITION_LEVEL_ALMOST_FULL) + H.adjust_nutrition(-5) + H.blood_volume += 10 + else + H.blood_volume += 8 + if(H.nutrition <= NUTRITION_LEVEL_HUNGRY) + if(H.nutrition <= NUTRITION_LEVEL_STARVING) + H.blood_volume -= 8 + if(prob(5)) + to_chat(H, "You're starving! Get some food!") + else + if(prob(35)) + H.blood_volume -= 2 + if(prob(5)) + to_chat(H, "You're feeling pretty hungry...") + var/atmos_sealed = FALSE + if(H.wear_suit && H.head && isclothing(H.wear_suit) && isclothing(H.head)) + var/obj/item/clothing/CS = H.wear_suit + var/obj/item/clothing/CH = H.head + if(CS.clothing_flags & CH.clothing_flags & STOPSPRESSUREDAMAGE) + atmos_sealed = TRUE + if(H.w_uniform && H.head) + var/obj/item/clothing/CU = H.w_uniform + var/obj/item/clothing/CH = H.head + if (CU.envirosealed && (CH.clothing_flags & STOPSPRESSUREDAMAGE)) + atmos_sealed = TRUE + if(!atmos_sealed) + var/datum/gas_mixture/environment = H.loc.return_air() + if(environment?.total_moles()) + if(environment.get_moles(GAS_H2O) >= 1) + H.blood_volume -= 15 + if(prob(50)) + to_chat(H, "Your ooze melts away rapidly in the water vapor!") + if(H.blood_volume <= 672 && environment.get_moles(GAS_PLASMA) >= 1) + H.blood_volume += 15 + if(H.blood_volume < BLOOD_VOLUME_OKAY && prob(5)) + to_chat(H, "You feel drained!") + if(H.blood_volume < BLOOD_VOLUME_OKAY) + Cannibalize_Body(H) + if(regenerate_limbs) + regenerate_limbs.UpdateButtonIcon() + +/datum/species/oozeling/proc/Cannibalize_Body(mob/living/carbon/human/H) + var/list/limbs_to_consume = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) - H.get_missing_limbs() + var/obj/item/bodypart/consumed_limb + if(!limbs_to_consume.len) + H.losebreath++ + return + if(H.get_num_legs(FALSE)) //Legs go before arms + limbs_to_consume -= list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM) + consumed_limb = H.get_bodypart(pick(limbs_to_consume)) + consumed_limb.drop_limb() + to_chat(H, "Your [consumed_limb] is drawn back into your body, unable to maintain its shape!") + qdel(consumed_limb) + H.blood_volume += 80 + H.nutrition += 20 + +/datum/action/innate/regenerate_limbs + name = "Regenerate Limbs" + check_flags = AB_CHECK_CONSCIOUS + button_icon_state = "slimeheal" + icon_icon = 'icons/mob/actions/actions_slime.dmi' + background_icon_state = "bg_alien" + +/datum/action/innate/regenerate_limbs/IsAvailable() + if(..()) + var/mob/living/carbon/human/H = owner + var/list/limbs_to_heal = H.get_missing_limbs() + if(limbs_to_heal.len && H.blood_volume >= BLOOD_VOLUME_OKAY+80) + return TRUE + return FALSE + +/datum/action/innate/regenerate_limbs/Activate() + var/mob/living/carbon/human/H = owner + var/list/limbs_to_heal = H.get_missing_limbs() + if(!LAZYLEN(limbs_to_heal)) + to_chat(H, "You feel intact enough as it is.") + return + to_chat(H, "You focus intently on your missing [limbs_to_heal.len >= 2 ? "limbs" : "limb"]...") + if(H.blood_volume >= 80*limbs_to_heal.len+BLOOD_VOLUME_OKAY) + if(do_after(H, 60, target = H)) + H.regenerate_limbs() + H.blood_volume -= 80*limbs_to_heal.len + H.nutrition -= 20*limbs_to_heal.len + to_chat(H, "...and after a moment you finish reforming!") + return + if(H.blood_volume >= 80)//We can partially heal some limbs + while(H.blood_volume >= BLOOD_VOLUME_OKAY+80 && LAZYLEN(limbs_to_heal)) + if(do_after(H, 30, target = H)) + var/healed_limb = pick(limbs_to_heal) + H.regenerate_limb(healed_limb) + limbs_to_heal -= healed_limb + H.blood_volume -= 80 + H.nutrition -= 20 + to_chat(H, "...but there is not enough of you to fix everything! You must attain more blood volume to heal completely!") + return + to_chat(H, "...but there is not enough of you to go around! You must attain more blood volume to heal!") + +/datum/species/oozeling/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) + if(chem.type == /datum/reagent/water) + if(chem.volume > 10) + H.reagents.remove_reagent(chem.type, chem.volume - 10) + to_chat(H, "The water you consumed is melting away your insides!") + H.blood_volume -= 25 + H.reagents.remove_reagent(chem.type, chem.metabolization_rate) + return TRUE + return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index e886b712a31a9..120e61dd4e9d5 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -1,6 +1,7 @@ /datum/species/plasmaman name = "Plasmaman" - id = "plasmaman" + id = SPECIES_PLASMAMAN + bodyflag = FLAG_PLASMAMAN say_mod = "rattles" sexes = 0 meat = /obj/item/stack/sheet/mineral/plasma @@ -25,7 +26,7 @@ /datum/species/plasmaman/spec_life(mob/living/carbon/human/H) var/atmos_sealed = FALSE - 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 && isclothing(H.wear_suit) && isclothing(H.head)) var/obj/item/clothing/CS = H.wear_suit var/obj/item/clothing/CH = H.head if (CS.clothing_flags & CH.clothing_flags & STOPSPRESSUREDAMAGE) @@ -39,7 +40,7 @@ var/datum/gas_mixture/environment = H.loc.return_air() if(environment) if(environment.total_moles()) - if(environment.get_moles(/datum/gas/oxygen) >= 1) //Same threshhold that extinguishes fire + if(environment.get_moles(GAS_O2) >= 1) //Same threshhold that extinguishes fire H.adjust_fire_stacks(0.5) if(!H.on_fire && H.fire_stacks > 0) H.visible_message("[H]'s body reacts with the atmosphere and bursts into flames!","Your body reacts with the atmosphere and bursts into flame!") @@ -59,113 +60,10 @@ no_protection = TRUE . = ..() -/datum/species/plasmaman/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE) - var/current_job = J.title - var/datum/outfit/plasmaman/O = new /datum/outfit/plasmaman - switch(current_job) - if("Chaplain") - O = new /datum/outfit/plasmaman/chaplain - - if("Curator") - O = new /datum/outfit/plasmaman/curator - - if("Janitor") - O = new /datum/outfit/plasmaman/janitor - - if("Botanist") - O = new /datum/outfit/plasmaman/botany - - if("Bartender", "Lawyer", "Barber", "Psychiatrist") - O = new /datum/outfit/plasmaman/bar - - if("Stage Magician") - O = new /datum/outfit/plasmaman/magic - - if("VIP") - O = new /datum/outfit/plasmaman/vip - - if("Debtor") - O = new /datum/outfit/plasmaman/hobo - - if("Cook") - O = new /datum/outfit/plasmaman/chef - - if("Security Officer") - O = new /datum/outfit/plasmaman/security - - if("Deputy") - O = new /datum/outfit/plasmaman - - if("Brig Physician") - O = new /datum/outfit/plasmaman/secmed - - if("Detective") - O = new /datum/outfit/plasmaman/detective - - if("Warden") - O = new /datum/outfit/plasmaman/warden - - if("Cargo Technician", "Quartermaster") - O = new /datum/outfit/plasmaman/cargo - - if("Shaft Miner") - O = new /datum/outfit/plasmaman/mining - - if("Medical Doctor") - O = new /datum/outfit/plasmaman/medical - - if("Paramedic") - O = new /datum/outfit/plasmaman/emt - - if("Chemist") - O = new /datum/outfit/plasmaman/chemist - - if("Geneticist") - O = new /datum/outfit/plasmaman/genetics - - if("Roboticist") - O = new /datum/outfit/plasmaman/robotics - - if("Virologist") - O = new /datum/outfit/plasmaman/viro - - if("Scientist") - O = new /datum/outfit/plasmaman/science - - if("Station Engineer") - O = new /datum/outfit/plasmaman/engineering - - if("Atmospheric Technician") - O = new /datum/outfit/plasmaman/atmospherics - - if("Captain") - O = new /datum/outfit/plasmaman/command - - if("Chief Engineer") - O = new /datum/outfit/plasmaman/ce - - if("Chief Medical Officer") - O = new /datum/outfit/plasmaman/cmo - - if("Head of Security") - O = new /datum/outfit/plasmaman/hos - - if("Research Director") - O = new /datum/outfit/plasmaman/rd - - if("Head of Personnel") - O = new /datum/outfit/plasmaman/hop - - if("Clown") - O = new /datum/outfit/plasmaman/honk - - if("Mime") - O = new /datum/outfit/plasmaman/mime - - H.equipOutfit(O, visualsOnly) +/datum/species/plasmaman/after_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE) H.internal = H.get_item_for_held_index(2) H.update_internals_hud_icon(1) - return 0 + return FALSE /datum/species/plasmaman/qualifies_for_rank(rank, list/features) if(rank in GLOB.security_positions) @@ -186,7 +84,6 @@ return randname /datum/species/plasmaman/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - . = ..() if(chem.type == /datum/reagent/consumable/milk) if(chem.volume > 10) H.reagents.remove_reagent(chem.type, chem.volume - 10) @@ -219,3 +116,4 @@ H.emote("sigh") H.reagents.remove_reagent(chem.type, chem.metabolization_rate) return TRUE + return ..() 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 4ed54c2820509..15c4fb7f92703 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -4,7 +4,7 @@ id = "pod" default_color = "59CE00" species_traits = list(MUTCOLORS,EYECOLOR) - inherent_traits = list(TRAIT_ALWAYS_CLEAN) + inherent_traits = list(TRAIT_ALWAYS_CLEAN, TRAIT_BEEFRIEND, TRAIT_NONECRODISEASE) inherent_factions = list("plants", "vines") attack_verb = "slash" attack_sound = 'sound/weapons/slice.ogg' @@ -38,8 +38,9 @@ /datum/species/pod/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.type == /datum/reagent/toxin/plantbgone) H.adjustToxLoss(3) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) - return 1 + H.reagents.remove_reagent(chem.type, chem.metabolization_rate) + return TRUE + return ..() /datum/species/pod/on_hit(obj/item/projectile/P, mob/living/carbon/human/H) switch(P.type) 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 88e1209577853..a2958f0793997 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -35,7 +35,7 @@ id = "nightmare" limbs_id = "shadow" burnmod = 1.5 - no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM, SLOT_S_STORE) + no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_SUITSTORE) species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYESPRITES,NOFLASH) inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER) mutanteyes = /obj/item/organ/eyes/night_vision/nightmare @@ -49,7 +49,7 @@ . = ..() to_chat(C, "[info_text]") - C.fully_replace_character_name("[pick(GLOB.nightmare_names)]") + C.fully_replace_character_name(null, pick(GLOB.nightmare_names)) /datum/species/shadow/nightmare/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H) var/turf/T = H.loc @@ -180,40 +180,50 @@ . = ..() if(!proximity) return - if(isopenturf(AM)) //So you can actually melee with it + AM.lighteater_act(src) + +/mob/living/lighteater_act(obj/item/light_eater/light_eater) + if(on_fire) + ExtinguishMob() + playsound(src, 'sound/items/cig_snuff.ogg', 50, 1) + for(var/obj/item/O in src) + if(O.light_range && O.light_power) + O.lighteater_act(light_eater) + if(pulling && pulling.light_range) + pulling.lighteater_act(light_eater) + +/mob/living/carbon/human/lighteater_act(obj/item/light_eater/light_eater) + ..() + if(isethereal(src)) + emp_act(EMP_LIGHT) + +/mob/living/silicon/robot/lighteater_act(obj/item/light_eater/light_eater) + ..() + if(!lamp_cooldown) + update_headlamp(TRUE, INFINITY) + to_chat(src, "Your headlamp is fried! You'll need a human to help replace it.") + +/obj/structure/bonfire/lighteater_act(obj/item/light_eater/light_eater) + if(burning) + extinguish() + playsound(src, 'sound/items/cig_snuff.ogg', 50, 1) + +/obj/item/pda/lighteater_act(obj/item/light_eater/light_eater) + if(!light_range || !light_power) + return + set_light(0) + light_power = 0 + fon = FALSE + shorted = TRUE + update_icon() + visible_message("The light in [src] shorts out!") + +/obj/item/lighteater_act(obj/item/light_eater/light_eater) + if(!light_range || !light_power) return - if(isliving(AM)) - var/mob/living/L = AM - if(isethereal(AM)) - AM.emp_act(EMP_LIGHT) - - if(iscyborg(AM)) - var/mob/living/silicon/robot/borg = AM - if(!borg.lamp_cooldown) - borg.update_headlamp(TRUE, INFINITY) - to_chat(borg, "Your headlamp is fried! You'll need a human to help replace it.") - else - for(var/obj/item/O in AM) - if(O.light_range && O.light_power) - disintegrate(O) - if(L.pulling && L.pulling.light_range && isitem(L.pulling)) - disintegrate(L.pulling) - else if(isitem(AM)) - var/obj/item/I = AM - if(I.light_range && I.light_power) - disintegrate(I) - -/obj/item/light_eater/proc/disintegrate(obj/item/O) - if(istype(O, /obj/item/pda)) - var/obj/item/pda/PDA = O - PDA.set_light(0) - PDA.fon = FALSE - PDA.f_lum = 0 - PDA.update_icon() - visible_message("The light in [PDA] shorts out!") - else - visible_message("[O] is disintegrated by [src]!") - O.burn() + if(light_eater) + visible_message("[src] is disintegrated by [light_eater]!") + burn() playsound(src, 'sound/items/welder.ogg', 50, 1) #undef HEART_SPECIAL_SHADOWIFY diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index 5b2cd09d6ee70..0cef22b50096b 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -7,7 +7,7 @@ meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton species_traits = list(NOBLOOD,NOHUSK) inherent_traits = list(TRAIT_TOXIMMUNE,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,\ - TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH,TRAIT_XENO_IMMUNE) + TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH,TRAIT_XENO_IMMUNE,TRAIT_NOCLONELOSS) inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID) mutanttongue = /obj/item/organ/tongue/bone damage_overlay_type = ""//let's not show bloody wounds or burns over bones. @@ -24,7 +24,6 @@ //Can still metabolize milk through meme magic /datum/species/skeleton/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - . = ..() if(chem.type == /datum/reagent/consumable/milk) if(chem.volume > 10) H.reagents.remove_reagent(chem.type, chem.volume - 10) @@ -57,3 +56,4 @@ H.emote("sigh") H.reagents.remove_reagent(chem.type, chem.metabolization_rate) return TRUE + return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm index c65334e7b03a5..83549f8d04a74 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -24,22 +24,23 @@ if(istype(chem,/datum/reagent/consumable/sodiumchloride)) H.adjustFireLoss(2) playsound(H, 'sound/weapons/sear.ogg', 30, 1) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) - return 1 + H.reagents.remove_reagent(chem.type, chem.metabolization_rate) + return TRUE + return ..() /datum/species/snail/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) . = ..() - var/obj/item/storage/backpack/bag = C.get_item_by_slot(SLOT_BACK) + var/obj/item/storage/backpack/bag = C.get_item_by_slot(ITEM_SLOT_BACK) if(!istype(bag, /obj/item/storage/backpack/snail)) if(C.dropItemToGround(bag)) //returns TRUE even if its null - C.equip_to_slot_or_del(new /obj/item/storage/backpack/snail(C), SLOT_BACK) + C.equip_to_slot_or_del(new /obj/item/storage/backpack/snail(C), ITEM_SLOT_BACK) ADD_TRAIT(C, TRAIT_NOSLIPALL, SPECIES_TRAIT) /datum/species/snail/on_species_loss(mob/living/carbon/C) . = ..() qdel(C.GetComponent(/datum/component/snailcrawl)) REMOVE_TRAIT(C, TRAIT_NOSLIPALL, SPECIES_TRAIT) - var/obj/item/storage/backpack/bag = C.get_item_by_slot(SLOT_BACK) + var/obj/item/storage/backpack/bag = C.get_item_by_slot(ITEM_SLOT_BACK) if(istype(bag, /obj/item/storage/backpack/snail)) bag.emptyStorage() C.doUnEquip(bag, TRUE, no_move = TRUE) @@ -52,7 +53,7 @@ item_state = "snailshell" lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' - armor = list("melee" = 20, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list("melee" = 20, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "stamina" = 0) max_integrity = 200 resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/mob/living/carbon/human/species_types/squidpeople.dm b/code/modules/mob/living/carbon/human/species_types/squidpeople.dm index 3085b00e675c0..529948bd4774a 100644 --- a/code/modules/mob/living/carbon/human/species_types/squidpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/squidpeople.dm @@ -1,32 +1,34 @@ /datum/species/squid - name = "Squidperson" - id = "squid" - default_color = "b8dfda" - species_traits = list(MUTCOLORS,EYECOLOR,TRAIT_EASYDISMEMBER) - inherent_traits = list(TRAIT_NOSLIPALL) - default_features = list("mcolor" = "FFF") // bald - speedmod = 0.5 - burnmod = 1.5 - heatmod = 1.4 - coldmod = 1.5 - punchdamage = 7 // Lower max damage in melee. It's just a tentacle - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | SLIME_EXTRACT - attack_verb = "lash" - attack_sound = 'sound/weapons/whip.ogg' - miss_sound = 'sound/weapons/etherealmiss.ogg' - grab_sound = 'sound/weapons/whipgrab.ogg' - deathsound = 'sound/voice/hiss1.ogg' - use_skintones = 0 - no_equip = list(SLOT_SHOES) - skinned_type = /obj/item/stack/sheet/animalhide/human - toxic_food = FRIED - species_language_holder = /datum/language_holder/squid + name = "Squidperson" + id = SPECIES_SQUID + bodyflag = FLAG_SQUID + default_color = "b8dfda" + species_traits = list(MUTCOLORS,EYECOLOR,NOSOCKS) + inherent_traits = list(TRAIT_NOSLIPALL,TRAIT_EASYDISMEMBER) + default_features = list("mcolor" = "FFF") // bald + speedmod = 0.5 + burnmod = 1.5 + heatmod = 1.4 + coldmod = 1.5 + punchdamage = 7 // Lower max damage in melee. It's just a tentacle + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | SLIME_EXTRACT + attack_verb = "lash" + attack_sound = 'sound/weapons/whip.ogg' + miss_sound = 'sound/weapons/etherealmiss.ogg' + grab_sound = 'sound/weapons/whipgrab.ogg' + deathsound = 'sound/voice/hiss1.ogg' + use_skintones = 0 + no_equip = list(ITEM_SLOT_FEET) + skinned_type = /obj/item/stack/sheet/animalhide/human + toxic_food = FRIED + species_language_holder = /datum/language_holder/squid + swimming_component = /datum/component/swimming/squid /mob/living/carbon/human/species/squid - race = /datum/species/squid + race = /datum/species/squid /datum/species/squid/qualifies_for_rank(rank, list/features) - return TRUE + return TRUE /datum/species/squid/random_name(gender,unique,lastname) if(unique) @@ -37,10 +39,10 @@ return randname /proc/random_unique_squid_name(attempts_to_find_unique_name=10, genderToFind) - for(var/i in 1 to attempts_to_find_unique_name) - . = capitalize(squid_name(genderToFind)) - if(!findname(.)) - break + for(var/i in 1 to attempts_to_find_unique_name) + . = capitalize(squid_name(genderToFind)) + if(!findname(.)) + break /datum/species/squid/after_equip_job(datum/job/J, mob/living/carbon/human/H) var/datum/action/innate/squid_change/S = new @@ -50,7 +52,7 @@ fixed_mut_color = rgb(128,128,128) H.update_body() var/datum/action/innate/squid_change/S = locate(/datum/action/innate/squid_change) in H.actions - S?.Remove(H) + qdel(S) /datum/action/innate/squid_change name = "Color Change" @@ -60,9 +62,9 @@ var/cooldown = 0 /datum/action/innate/squid_change/IsAvailable() - if(cooldown > world.time) - return FALSE - return ..() + if(cooldown > world.time) + return FALSE + return ..() /datum/action/innate/squid_change/Activate() var/mob/living/carbon/human/H = owner @@ -79,5 +81,5 @@ UpdateButtonIcon() /datum/action/innate/squid_change/Deactivate() - active = FALSE - UpdateButtonIcon() + active = FALSE + UpdateButtonIcon() diff --git a/code/modules/mob/living/carbon/human/species_types/supersoldier.dm b/code/modules/mob/living/carbon/human/species_types/supersoldier.dm index 36f296b80944a..59edf3462c08c 100644 --- a/code/modules/mob/living/carbon/human/species_types/supersoldier.dm +++ b/code/modules/mob/living/carbon/human/species_types/supersoldier.dm @@ -1,7 +1,8 @@ /datum/species/human/supersoldier name = "Super Soldier" //inherited from the real species, for health scanners and things id = "supersoldier" - species_traits = list(NOTRANSSTING) //all of these + whatever we inherit from the real species + limbs_id = "human" + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,NOTRANSSTING) //all of these + whatever we inherit from the real species inherent_traits = list(TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_IGNORESLOWDOWN,TRAIT_IGNOREDAMAGESLOWDOWN,TRAIT_STUNIMMUNE,TRAIT_CONFUSEIMMUNE,TRAIT_SLEEPIMMUNE,TRAIT_PUSHIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOSLIPALL,TRAIT_THERMAL_VISION,TRAIT_STRONG_GRABBER,TRAIT_LAW_ENFORCEMENT_METABOLISM,TRAIT_ALWAYS_CLEAN,TRAIT_FEARLESS) mutanteyes = /obj/item/organ/eyes/night_vision changesource_flags = MIRROR_BADMIN | ERT_SPAWN @@ -16,4 +17,4 @@ if(light_amount > 0) //if there's any light, heal H.heal_overall_damage(1,1, 0, BODYPART_ORGANIC) H.adjustToxLoss(-1) - H.adjustOxyLoss(-1) \ No newline at end of file + H.adjustOxyLoss(-1) diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm deleted file mode 100644 index 88f3ef726ca6d..0000000000000 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ /dev/null @@ -1,132 +0,0 @@ -/datum/species/synth - name = "Synth" //inherited from the real species, for health scanners and things - id = "synth" - say_mod = "beep boops" //inherited from a user's real species - sexes = 0 - species_traits = list(NOTRANSSTING) //all of these + whatever we inherit from the real species - inherent_traits = list(TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER,TRAIT_NOBREATH) - inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID) - meat = null - damage_overlay_type = "synth" - limbs_id = "synth" - var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off - var/datum/species/fake_species //a species to do most of our work for us, unless we're damaged - var/list/initial_species_traits //for getting these values back for assume_disguise() - var/list/initial_inherent_traits - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC - species_language_holder = /datum/language_holder/synthetic - - -/datum/species/synth/New() - initial_species_traits = species_traits.Copy() - initial_inherent_traits = inherent_traits.Copy() - ..() - -/datum/species/synth/military - name = "Military Synth" - id = "military_synth" - armor = 25 - punchdamage = 14 - disguise_fail_health = 50 - changesource_flags = MIRROR_BADMIN | WABBAJACK - -/datum/species/synth/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) - ..() - assume_disguise(old_species, H) - RegisterSignal(H, COMSIG_MOB_SAY, .proc/handle_speech) - -/datum/species/synth/on_species_loss(mob/living/carbon/human/H) - . = ..() - UnregisterSignal(H, COMSIG_MOB_SAY) - -/datum/species/synth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - if(chem.type == /datum/reagent/medicine/synthflesh) - chem.reaction_mob(H, TOUCH, 2 ,0) //heal a little - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) - return 1 - else - return ..() - - -/datum/species/synth/proc/assume_disguise(datum/species/S, mob/living/carbon/human/H) - if(S && !istype(S, type)) - name = S.name - say_mod = S.say_mod - sexes = S.sexes - species_traits = initial_species_traits.Copy() - inherent_traits = initial_inherent_traits.Copy() - species_traits |= S.species_traits - inherent_traits |= S.inherent_traits - attack_verb = S.attack_verb - attack_sound = S.attack_sound - miss_sound = S.miss_sound - meat = S.meat - mutant_bodyparts = S.mutant_bodyparts.Copy() - mutant_organs = S.mutant_organs.Copy() - default_features = S.default_features.Copy() - nojumpsuit = S.nojumpsuit - no_equip = S.no_equip.Copy() - limbs_id = S.limbs_id - use_skintones = S.use_skintones - fixed_mut_color = S.fixed_mut_color - hair_color = S.hair_color - fake_species = new S.type - else - name = initial(name) - say_mod = initial(say_mod) - species_traits = initial_species_traits.Copy() - inherent_traits = initial_inherent_traits.Copy() - attack_verb = initial(attack_verb) - attack_sound = initial(attack_sound) - miss_sound = initial(miss_sound) - mutant_bodyparts = list() - default_features = list() - nojumpsuit = initial(nojumpsuit) - no_equip = list() - qdel(fake_species) - fake_species = null - meat = initial(meat) - limbs_id = "synth" - use_skintones = 0 - sexes = 0 - fixed_mut_color = "" - hair_color = "" - - for(var/X in H.bodyparts) //propagates the damage_overlay changes - var/obj/item/bodypart/BP = X - BP.update_limb() - H.update_body_parts() //to update limb icon cache with the new damage overlays - -//Proc redirects: -//Passing procs onto the fake_species, to ensure we look as much like them as possible - -/datum/species/synth/handle_hair(mob/living/carbon/human/H, forced_colour) - if(fake_species) - fake_species.handle_hair(H, forced_colour) - else - return ..() - - -/datum/species/synth/handle_body(mob/living/carbon/human/H) - if(fake_species) - fake_species.handle_body(H) - else - return ..() - - -/datum/species/synth/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour) - if(fake_species) - fake_species.handle_body(H,forced_colour) - else - return ..() - - -/datum/species/synth/proc/handle_speech(datum/source, list/speech_args) - if (isliving(source)) // yeah it's gonna be living but just to be clean - var/mob/living/L = source - if(fake_species && L.health > disguise_fail_health) - switch (fake_species.type) - if (/datum/species/golem/bananium) - speech_args[SPEECH_SPANS] |= SPAN_CLOWN - if (/datum/species/golem/clockwork) - speech_args[SPEECH_SPANS] |= SPAN_ROBOT diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index f51b76a3f81e3..d168481c99a94 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -8,7 +8,8 @@ sexes = 0 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie species_traits = list(NOBLOOD,NOZOMBIE,NOTRANSSTING) - inherent_traits = list(TRAIT_TOXIMMUNE,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH,TRAIT_NODEATH,TRAIT_FAKEDEATH) + inherent_traits = list(TRAIT_TOXIMMUNE,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,\ + TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH,TRAIT_NODEATH,TRAIT_FAKEDEATH,TRAIT_NOCLONELOSS) inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID) mutanttongue = /obj/item/organ/tongue/zombie var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg') @@ -61,7 +62,7 @@ playsound(C, pick(spooks), 50, TRUE, 10) //Congrats you somehow died so hard you stopped being a zombie -/datum/species/zombie/infectious/spec_death(mob/living/carbon/C) +/datum/species/zombie/infectious/spec_death(gibbed, mob/living/carbon/C) . = ..() var/obj/item/organ/zombie_infection/infection infection = C.getorganslot(ORGAN_SLOT_ZOMBIE) diff --git a/code/modules/mob/living/carbon/human/suicides.dm b/code/modules/mob/living/carbon/human/suicides.dm index bde239a36d473..32bfd92ed556a 100644 --- a/code/modules/mob/living/carbon/human/suicides.dm +++ b/code/modules/mob/living/carbon/human/suicides.dm @@ -2,7 +2,7 @@ suicide_log() adjustBruteLoss(max(200 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) death(FALSE) - ghostize(FALSE) // Disallows reentering body and disassociates mind + ghostize(FALSE,SENTIENCE_ERASE) // Disallows reentering body and disassociates mind /mob/living/carbon/human/proc/disarm_suicide() var/suicide_message = "[src] is ripping [p_their()] own arms off! It looks like [p_theyre()] trying to commit suicide." //heheh get it? diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 5df4c01afa812..0372cfc4ce959 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -101,7 +101,7 @@ There are several things that need to be remembered: remove_overlay(UNIFORM_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_W_UNIFORM] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_ICLOTHING) + 1] inv.update_icon() if(istype(w_uniform, /obj/item/clothing/under)) @@ -131,8 +131,11 @@ There are several things that need to be remembered: if(G == "f" && U.fitted != NO_FEMALE_UNIFORM) uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/uniform.dmi', isinhands = FALSE, femaleuniform = U.fitted) + var/icon_file = 'icons/mob/uniform.dmi' if(!uniform_overlay) - uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/uniform.dmi', isinhands = FALSE) + if(U.sprite_sheets & (dna?.species.bodyflag)) + icon_file = dna.species.get_custom_icons("uniform") + uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = icon_file, isinhands = FALSE) if(OFFSET_UNIFORM in dna.species.offset_features) @@ -148,19 +151,23 @@ There are several things that need to be remembered: remove_overlay(ID_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_ID] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_ID) + 1] inv.update_icon() var/mutable_appearance/id_overlay = overlays_standing[ID_LAYER] if(wear_id) + var/icon_file = 'icons/mob/mob.dmi' wear_id.screen_loc = ui_id if(client && hud_used && hud_used.hud_shown) client.screen += wear_id update_observer_view(wear_id) - + if(istype(wear_id, /obj/item)) + var/obj/item/I = wear_id + if(I.sprite_sheets & dna?.species.bodyflag) + icon_file = dna.species.get_custom_icons("generic") //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(state = wear_id.item_state, default_layer = ID_LAYER, default_icon_file = icon_file) 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] @@ -172,8 +179,8 @@ There are several things that need to be remembered: /mob/living/carbon/human/update_inv_gloves() remove_overlay(GLOVES_LAYER) - if(client && hud_used && hud_used.inv_slots[SLOT_GLOVES]) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLOVES] + if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_GLOVES) + 1]) + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_GLOVES) + 1] inv.update_icon() if(!gloves && bloody_hands) @@ -188,6 +195,11 @@ There are several things that need to be remembered: var/mutable_appearance/gloves_overlay = overlays_standing[GLOVES_LAYER] if(gloves) + var/icon_file = 'icons/mob/hands.dmi' + if(istype(gloves, /obj/item/clothing/gloves)) + var/obj/item/clothing/gloves/G = gloves + if(G.sprite_sheets & (dna?.species.bodyflag)) + icon_file = dna.species.get_custom_icons("gloves") gloves.screen_loc = ui_gloves if(client && hud_used && hud_used.hud_shown) if(hud_used.inventory_shown) @@ -196,7 +208,7 @@ There are several things that need to be remembered: 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(state = t_state, default_layer = GLOVES_LAYER, default_icon_file = icon_file) 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] @@ -212,17 +224,21 @@ There are several things that need to be remembered: return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLASSES] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_EYES) + 1] inv.update_icon() - if(glasses) glasses.screen_loc = ui_glasses //...draw the item in the inventory screen + if(istype(glasses, /obj/item/clothing/glasses)) + var/obj/item/clothing/glasses/G = glasses + var/icon_file = 'icons/mob/eyes.dmi' + if(G.sprite_sheets & (dna?.species.bodyflag)) + icon_file = dna.species.get_custom_icons("glasses") if(client && hud_used && hud_used.hud_shown) if(hud_used.inventory_shown) //if the inventory is open ... 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(state = glasses.icon_state, default_layer = GLASSES_LAYER, default_icon_file = icon_file) var/mutable_appearance/glasses_overlay = overlays_standing[GLASSES_LAYER] if(glasses_overlay) @@ -240,17 +256,22 @@ There are several things that need to be remembered: return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_EARS) + 1] inv.update_icon() if(ears) + var/icon_file = 'icons/mob/ears.dmi' + if(istype(ears, /obj/item)) + var/obj/item/E = ears + if(E.sprite_sheets & (dna?.species.bodyflag)) + icon_file = dna.species.get_custom_icons("ears") ears.screen_loc = ui_ears //move the item to the appropriate screen loc if(client && hud_used && hud_used.hud_shown) if(hud_used.inventory_shown) //if the inventory is open 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(state = ears.icon_state, default_layer = EARS_LAYER, default_icon_file = icon_file) 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] @@ -258,6 +279,32 @@ There are several things that need to be remembered: overlays_standing[EARS_LAYER] = ears_overlay apply_overlay(EARS_LAYER) +/mob/living/carbon/human/update_inv_neck() + remove_overlay(NECK_LAYER) + + if(client && hud_used) + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_NECK) + 1] + inv.update_icon() + + if(wear_neck) + wear_neck.screen_loc = ui_neck + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) //if the inventory is open + client.screen += wear_neck //add it to the client's screen + update_observer_view(wear_neck,1) + if(!(ITEM_SLOT_NECK in check_obscured_slots())) + var/icon_file = 'icons/mob/neck.dmi' + if(istype(wear_neck, /obj/item)) + var/obj/item/N = wear_neck + if(N.sprite_sheets & dna?.species.bodyflag) + icon_file = dna.species.get_custom_icons("neck") + overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(state = wear_neck.icon_state, default_layer = NECK_LAYER, default_icon_file = icon_file) + var/mutable_appearance/neck_overlay = overlays_standing[NECK_LAYER] + if(OFFSET_NECK in dna.species.offset_features) + neck_overlay.pixel_x += dna.species.offset_features[OFFSET_NECK][1] + neck_overlay.pixel_y += dna.species.offset_features[OFFSET_NECK][2] + overlays_standing[NECK_LAYER] = neck_overlay + apply_overlay(NECK_LAYER) /mob/living/carbon/human/update_inv_shoes() remove_overlay(SHOES_LAYER) @@ -266,16 +313,21 @@ There are several things that need to be remembered: return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_FEET) + 1] inv.update_icon() if(shoes) + var/icon_file = 'icons/mob/feet.dmi' + if(istype(shoes, /obj/item/clothing/shoes)) + var/obj/item/clothing/shoes/S = shoes + if(S.sprite_sheets & (dna?.species.bodyflag)) + icon_file = dna.species.get_custom_icons("shoes") shoes.screen_loc = ui_shoes //move the item to the appropriate screen loc if(client && hud_used && hud_used.hud_shown) if(hud_used.inventory_shown) //if the inventory is open client.screen += shoes //add it to client's screen update_observer_view(shoes,1) - overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(state = shoes.icon_state, default_layer = SHOES_LAYER, default_icon_file = 'icons/mob/feet.dmi') + overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(state = shoes.icon_state, default_layer = SHOES_LAYER, default_icon_file = icon_file) 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] @@ -289,7 +341,7 @@ There are several things that need to be remembered: remove_overlay(SUIT_STORE_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_S_STORE] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_SUITSTORE) + 1] inv.update_icon() if(s_store) @@ -310,8 +362,24 @@ There are several things that need to be remembered: /mob/living/carbon/human/update_inv_head() - ..() + remove_overlay(HEAD_LAYER) + + if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated + return + + if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_HEAD) + 1]) + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_HEAD) + 1] + inv.update_icon() + update_mutant_bodyparts() + if(head) + update_hud_head(head) + var/icon_file = 'icons/mob/head.dmi' + if(istype(head, /obj/item/clothing/head)) + var/obj/item/clothing/head/HE = head + if(HE.sprite_sheets & (dna?.species.bodyflag)) + icon_file = dna.species.get_custom_icons("head") + overlays_standing[HEAD_LAYER] = head.build_worn_icon(state = head.icon_state, default_layer = HEAD_LAYER, default_icon_file = icon_file) var/mutable_appearance/head_overlay = overlays_standing[HEAD_LAYER] if(head_overlay) remove_overlay(HEAD_LAYER) @@ -325,10 +393,15 @@ There are several things that need to be remembered: remove_overlay(BELT_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BELT] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_BELT) + 1] inv.update_icon() if(belt) + var/icon_file = 'icons/mob/belt.dmi' + if(istype(belt, /obj/item/storage/belt)) + var/obj/item/storage/belt/B = belt + if(B.sprite_sheets & (dna?.species.bodyflag)) + icon_file = dna.species.get_custom_icons("belt") belt.screen_loc = ui_belt if(client && hud_used && hud_used.hud_shown) client.screen += belt @@ -338,12 +411,12 @@ There are several things that need to be remembered: 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(state = t_state, default_layer = BELT_LAYER, default_icon_file = icon_file) 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] belt_overlay.pixel_y += dna.species.offset_features[OFFSET_BELT][2] - overlays_standing[BELT_LAYER] = belt_overlay + overlays_standing[BELT_LAYER] = belt_overlay apply_overlay(BELT_LAYER) @@ -353,22 +426,26 @@ There are several things that need to be remembered: remove_overlay(SUIT_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_SUIT] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_OCLOTHING) + 1] inv.update_icon() if(istype(wear_suit, /obj/item/clothing/suit)) + var/icon_file = 'icons/mob/suit.dmi' + var/obj/item/clothing/suit/S = wear_suit + if(S.sprite_sheets & (dna?.species.bodyflag)) + icon_file = dna.species.get_custom_icons("suit") wear_suit.screen_loc = ui_oclothing if(client && hud_used && hud_used.hud_shown) if(hud_used.inventory_shown) client.screen += wear_suit update_observer_view(wear_suit,1) - overlays_standing[SUIT_LAYER] = wear_suit.build_worn_icon(state = wear_suit.icon_state, default_layer = SUIT_LAYER, default_icon_file = 'icons/mob/suit.dmi') + overlays_standing[SUIT_LAYER] = wear_suit.build_worn_icon(state = wear_suit.icon_state, default_layer = SUIT_LAYER, default_icon_file = icon_file) 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] suit_overlay.pixel_y += dna.species.offset_features[OFFSET_SUIT][2] - overlays_standing[SUIT_LAYER] = suit_overlay + overlays_standing[SUIT_LAYER] = suit_overlay update_hair() update_mutant_bodyparts() @@ -377,12 +454,12 @@ There are several things that need to be remembered: /mob/living/carbon/human/update_inv_pockets() if(client && hud_used) - var/obj/screen/inventory/inv + var/atom/movable/screen/inventory/inv - inv = hud_used.inv_slots[SLOT_L_STORE] + inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_LPOCKET) + 1] inv.update_icon() - inv = hud_used.inv_slots[SLOT_R_STORE] + inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_RPOCKET) + 1] inv.update_icon() if(l_store) @@ -399,25 +476,54 @@ There are several things that need to be remembered: /mob/living/carbon/human/update_inv_wear_mask() - ..() - var/mutable_appearance/mask_overlay = overlays_standing[FACEMASK_LAYER] - if(mask_overlay) - remove_overlay(FACEMASK_LAYER) - if(OFFSET_FACEMASK in dna.species.offset_features) - mask_overlay.pixel_x += dna.species.offset_features[OFFSET_FACEMASK][1] - mask_overlay.pixel_y += dna.species.offset_features[OFFSET_FACEMASK][2] - overlays_standing[FACEMASK_LAYER] = mask_overlay + remove_overlay(FACEMASK_LAYER) + + if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated + return + + if(client && hud_used) + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_MASK) + 1] + inv.update_icon() + + if(wear_mask) + update_hud_wear_mask(wear_mask) + var/icon_file = 'icons/mob/mask.dmi' + if(istype(wear_mask, /obj/item/clothing/mask)) + var/obj/item/clothing/mask/M = wear_mask + if(M.sprite_sheets & dna?.species.bodyflag) + icon_file = dna.species.get_custom_icons("mask") + overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(state = wear_mask.icon_state, default_layer = FACEMASK_LAYER, default_icon_file = icon_file) + var/mutable_appearance/mask_overlay = overlays_standing[FACEMASK_LAYER] + if(mask_overlay) + remove_overlay(FACEMASK_LAYER) + if(OFFSET_FACEMASK in dna.species.offset_features) + mask_overlay.pixel_x += dna.species.offset_features[OFFSET_FACEMASK][1] + mask_overlay.pixel_y += dna.species.offset_features[OFFSET_FACEMASK][2] + overlays_standing[FACEMASK_LAYER] = mask_overlay apply_overlay(FACEMASK_LAYER) update_mutant_bodyparts() //e.g. upgate needed because mask now hides lizard snout /mob/living/carbon/human/update_inv_back() - ..() - var/mutable_appearance/back_overlay = overlays_standing[BACK_LAYER] - if(back_overlay) - remove_overlay(BACK_LAYER) - if(OFFSET_BACK in dna.species.offset_features) - back_overlay.pixel_x += dna.species.offset_features[OFFSET_BACK][1] - back_overlay.pixel_y += dna.species.offset_features[OFFSET_BACK][2] + remove_overlay(BACK_LAYER) + + if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_BACK) + 1]) + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_BACK) + 1] + inv.update_icon() + + if(back) + update_hud_back(back) + var/icon_file = 'icons/mob/back.dmi' + if(istype(back, /obj/item)) + var/obj/item/I = back + if(I.sprite_sheets & dna?.species.bodyflag) + icon_file = dna.species.get_custom_icons("back") + overlays_standing[BACK_LAYER] = back.build_worn_icon(state = back.icon_state, default_layer = BACK_LAYER, default_icon_file = icon_file) + var/mutable_appearance/back_overlay = overlays_standing[BACK_LAYER] + if(back_overlay) + remove_overlay(BACK_LAYER) + if(OFFSET_BACK in dna.species.offset_features) + back_overlay.pixel_x += dna.species.offset_features[OFFSET_BACK][1] + back_overlay.pixel_y += dna.species.offset_features[OFFSET_BACK][2] overlays_standing[BACK_LAYER] = back_overlay apply_overlay(BACK_LAYER) @@ -425,9 +531,55 @@ There are several things that need to be remembered: remove_overlay(LEGCUFF_LAYER) clear_alert("legcuffed") if(legcuffed) - overlays_standing[LEGCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "legcuff1", -LEGCUFF_LAYER) + var/path = dna?.species.get_custom_icons("generic") + if(!path) + path = 'icons/mob/mob.dmi' + overlays_standing[LEGCUFF_LAYER] = mutable_appearance(path, "legcuff1", -LEGCUFF_LAYER) apply_overlay(LEGCUFF_LAYER) - throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = src.legcuffed) + throw_alert("legcuffed", /atom/movable/screen/alert/restrained/legcuffed, new_master = src.legcuffed) + +/mob/living/carbon/human/update_inv_hands() + remove_overlay(HANDS_LAYER) + if (handcuffed) + drop_all_held_items() + return + + var/list/hands = list() + for(var/obj/item/I in held_items) + if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) + I.screen_loc = ui_hand_position(get_held_index_of_item(I)) + client.screen += I + if(observers?.len) + for(var/M in observers) + var/mob/dead/observe = M + if(observe.client && observe.client.eye == src) + observe.client.screen += I + else + observers -= observe + if(!observers.len) + observers = null + break + + var/t_state = I.item_state + if(!t_state) + t_state = I.icon_state + + var/icon_file = I.lefthand_file + var/mutable_appearance/hand_overlay + if(get_held_index_of_item(I) % 2 == 0) + icon_file = I.righthand_file + hand_overlay = I.build_worn_icon(state = t_state, default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) + if(OFFSET_RIGHT_HAND in dna.species.offset_features) + hand_overlay.pixel_x += dna.species.offset_features[OFFSET_RIGHT_HAND][1] + hand_overlay.pixel_y += dna.species.offset_features[OFFSET_RIGHT_HAND][2] + else + hand_overlay = I.build_worn_icon(state = t_state, default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) + if(OFFSET_LEFT_HAND in dna.species.offset_features) + hand_overlay.pixel_x += dna.species.offset_features[OFFSET_LEFT_HAND][1] + hand_overlay.pixel_y += dna.species.offset_features[OFFSET_LEFT_HAND][2] + hands += hand_overlay + overlays_standing[HANDS_LAYER] = hands + apply_overlay(HANDS_LAYER) /proc/wear_female_version(t_color, icon, layer, type) var/index = t_color @@ -482,7 +634,7 @@ There are several things that need to be remembered: //Update whether we smell /mob/living/carbon/human/proc/update_smell(var/smelly_icon = "generic_mob_smell") remove_overlay(SMELL_LAYER) - if(hygiene <= HYGIENE_LEVEL_DIRTY) + if(hygiene == HYGIENE_LEVEL_DISGUSTING) //You have literally ignored your stank for so long that you physically can't get dirtier. var/mutable_appearance/new_smell_overlay = mutable_appearance('icons/mob/smelly.dmi', smelly_icon, -SMELL_LAYER) overlays_standing[SMELL_LAYER] = new_smell_overlay apply_overlay(SMELL_LAYER) @@ -559,8 +711,14 @@ generate/load female uniform sprites matching all previously decided variables /obj/item/proc/get_held_offsets() var/list/L if(ismob(loc)) + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + L = H.dna?.species.get_item_offsets_for_index(src) + if(L) + return L var/mob/M = loc L = M.get_item_offsets_for_index(M.get_held_index_of_item(src)) + return L diff --git a/code/modules/mob/living/carbon/human/verbs/give.dm b/code/modules/mob/living/carbon/human/verbs/give.dm index 1dd13edcb40b4..8b32cc381f39d 100644 --- a/code/modules/mob/living/carbon/human/verbs/give.dm +++ b/code/modules/mob/living/carbon/human/verbs/give.dm @@ -1,27 +1,6 @@ -/mob/living/carbon/human/verb/Give(var/mob/living/carbon/human/l in view(1)) - set category = "Object" - set name = "Give" - set desc = "Give whatever's in your hand to someone." +/mob/living/carbon/human/verb/Give() + give() - var/obj/item/i = usr.get_active_held_item() - - if(src == usr || !istype(l)) - return - if(!i) - to_chat(usr, "You must be holding your gift in your active hand.") - return - if(alert(l, "[usr] is trying to give you \the [i], will you accept?", "Yes", "No") == "No") - to_chat(usr, "[l] didn't accept \the [i].") - return - - if(!(usr in range(1, src))) // so if they walk away with the alert window open, it doesnt teleport - to_chat(usr, "You're too far away!") - return - - l.put_in_hands(i) - -/mob/living/carbon/human/CtrlShiftClickOn(var/mob/living/carbon/human/l in view(1)) +/mob/living/carbon/human/CtrlShiftClickOn() ..() - Give(l) - - + Give() diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index fcc4f3ab8cfd6..60d1ffa4259b3 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -1,22 +1,22 @@ /mob/living/carbon/get_item_by_slot(slot_id) switch(slot_id) - if(SLOT_BACK) + if(ITEM_SLOT_BACK) return back - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) return wear_mask - if(SLOT_NECK) + if(ITEM_SLOT_NECK) return wear_neck - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) return head - if(SLOT_HANDCUFFED) + if(ITEM_SLOT_HANDCUFFED) return handcuffed - if(SLOT_LEGCUFFED) + if(ITEM_SLOT_LEGCUFFED) return legcuffed return null -/mob/living/carbon/proc/equip_in_one_of_slots(obj/item/I, list/slots, qdel_on_fail = 1) +/mob/living/carbon/proc/equip_in_one_of_slots(obj/item/I, list/slots, qdel_on_fail = TRUE) for(var/slot in slots) - if(equip_to_slot_if_possible(I, slots[slot], qdel_on_fail = 0, disable_warning = TRUE)) + if(equip_to_slot_if_possible(I, slots[slot], qdel_on_fail = FALSE, disable_warning = TRUE)) return slot if(qdel_on_fail) qdel(I) @@ -50,28 +50,28 @@ I.appearance_flags |= NO_CLIENT_COLOR var/not_handled = FALSE switch(slot) - if(SLOT_BACK) + if(ITEM_SLOT_BACK) back = I update_inv_back() - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) wear_mask = I wear_mask_update(I, toggle_off = 0) - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) head = I head_update(I) - if(SLOT_NECK) + if(ITEM_SLOT_NECK) wear_neck = I update_inv_neck(I) - if(SLOT_HANDCUFFED) + if(ITEM_SLOT_HANDCUFFED) handcuffed = I update_handcuffed() - if(SLOT_LEGCUFFED) + if(ITEM_SLOT_LEGCUFFED) legcuffed = I update_inv_legcuffed() - if(SLOT_HANDS) + if(ITEM_SLOT_HANDS) put_in_hands(I) update_inv_hands() - if(SLOT_IN_BACKPACK) + if(ITEM_SLOT_BACKPACK) if(!back || !SEND_SIGNAL(back, COMSIG_TRY_STORAGE_INSERT, I, src, TRUE)) not_handled = TRUE else @@ -85,7 +85,7 @@ return not_handled -/mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) +/mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, was_thrown = FALSE) . = ..() //Sets the default return value to what the parent returns. if(!. || !I) //We don't want to set anything to null if the parent returned 0. return @@ -129,7 +129,7 @@ //handle stuff to update when a mob equips/unequips a headgear. /mob/living/carbon/proc/head_update(obj/item/I, forced) - if(istype(I, /obj/item/clothing)) + if(isclothing(I)) var/obj/item/clothing/C = I if(C.tint || initial(C.tint)) update_tint() @@ -141,3 +141,61 @@ /mob/living/carbon/proc/get_holding_bodypart_of_item(obj/item/I) var/index = get_held_index_of_item(I) return index && hand_bodyparts[index] + +/** + * Proc called when giving an item to another player + * + * This handles creating an alert and adding an overlay to it + */ + +/mob/living/carbon/proc/give() + var/alert = null + var/obj/item/receiving = get_active_held_item() + if(!receiving) + to_chat(src, "You're not holding anything to give!") + return + + for(var/mob/living/carbon/C in orange(1, src)) //Fixed that, now it shouldn't be able to give benos stunbatons and IDs + if(!CanReach(C) || !C.can_hold_items()) + continue + + var/atom/movable/screen/alert/give/G = C.throw_alert("[src]", /atom/movable/screen/alert/give) + if(!G) + to_chat(src, "There is nobody nearby to give [receiving]!") + continue + + G.setup(C, src, receiving) + + if(!alert) // only displays alert once + do_alert_animation(src) + visible_message("[src] is offering [receiving].", \ + "You offer [receiving].", null, 2) + alert=1 // disable alert animation and chat message for possible second alert + +/** + * Proc called when the player clicks the give alert + * + * Handles checking if the player taking the item has open slots and is in range of the giver + * Also deals with the actual transferring of the item to the players hands + * Arguments: + * * giver - The person giving the original item + * * I - The item being given by the giver + */ + +/mob/living/carbon/proc/take(mob/living/carbon/giver, obj/item/I) + clear_alert("[giver]") + if(get_dist(src, giver) > 1) + to_chat(src, "[giver] is out of range! ") + return + if(!I || giver.get_active_held_item() != I) + to_chat(src, "[giver] is no longer holding the item they were offering! ") + return + if(!get_empty_held_indexes()) + to_chat(src, "You have no empty hands!") + return + if(!giver.temporarilyRemoveItemFromInventory(I)) + visible_message("[giver] tries to hand over [I] but it's stuck to them....") + return + visible_message("[src] takes [I] from [giver]", \ + "You take [I] from [giver]") + put_in_hands(I) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 7c9988dc574ab..7d8c73cce0488 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -16,14 +16,14 @@ var/obj/item/organ/O = V O.on_life() else - if(!reagents.has_reagent(/datum/reagent/toxin/formaldehyde, 1)) // No organ decay if the body contains formaldehyde. + if(reagents && !reagents.has_reagent(/datum/reagent/toxin/formaldehyde, 1)) // No organ decay if the body contains formaldehyde. for(var/V in internal_organs) var/obj/item/organ/O = V O.on_death() //Needed so organs decay while inside the body. . = ..() - if (QDELETED(src)) + if(QDELETED(src)) return if(.) //not dead @@ -53,7 +53,7 @@ if(changeling) changeling.regenerate() hud_used.lingchemdisplay.invisibility = 0 - hud_used.lingchemdisplay.maptext = "
[round(changeling.chem_charges)]
" + hud_used.lingchemdisplay.maptext = MAPTEXT("
[round(changeling.chem_charges)]
") else hud_used.lingchemdisplay.invisibility = INVISIBILITY_ABSTRACT @@ -127,16 +127,18 @@ breath = loc_as_obj.handle_internal_lifeform(src, BREATH_VOLUME) else if(isturf(loc)) //Breathe from loc as turf - var/breath_moles = 0 + var/breath_ratio = 0 if(environment) - breath_moles = environment.total_moles()*BREATH_PERCENTAGE + breath_ratio = BREATH_VOLUME/environment.return_volume() - breath = loc.remove_air(breath_moles) + breath = loc.remove_air_ratio(breath_ratio) else //Breathe from loc as obj again if(istype(loc, /obj/)) var/obj/loc_as_obj = loc loc_as_obj.handle_internal_lifeform(src,0) + if(breath) + breath.set_volume(BREATH_VOLUME) check_breath(breath) if(breath) @@ -167,7 +169,7 @@ adjustOxyLoss(1) failed_last_breath = 1 - throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) + throw_alert("not_enough_oxy", /atom/movable/screen/alert/not_enough_oxy) return 0 var/safe_oxy_min = 16 @@ -176,11 +178,11 @@ var/SA_para_min = 1 var/SA_sleep_min = 5 var/oxygen_used = 0 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.return_temperature())/BREATH_VOLUME - - var/O2_partialpressure = (breath.get_moles(/datum/gas/oxygen)/breath.total_moles())*breath_pressure - var/Toxins_partialpressure = (breath.get_moles(/datum/gas/plasma)/breath.total_moles())*breath_pressure - var/CO2_partialpressure = (breath.get_moles(/datum/gas/carbon_dioxide)/breath.total_moles())*breath_pressure + var/moles = breath.total_moles() + var/breath_pressure = (moles*R_IDEAL_GAS_EQUATION*breath.return_temperature())/BREATH_VOLUME + var/O2_partialpressure = ((breath.get_moles(GAS_O2)/moles)*breath_pressure) + (((breath.get_moles(GAS_PLUOXIUM)*8)/moles)*breath_pressure) + var/Toxins_partialpressure = (breath.get_moles(GAS_PLASMA)/moles)*breath_pressure + var/CO2_partialpressure = (breath.get_moles(GAS_CO2)/moles)*breath_pressure //OXYGEN @@ -191,21 +193,21 @@ var/ratio = 1 - O2_partialpressure/safe_oxy_min adjustOxyLoss(min(5*ratio, 3)) failed_last_breath = 1 - oxygen_used = breath.get_moles(/datum/gas/oxygen)*ratio + oxygen_used = breath.get_moles(GAS_O2)*ratio else adjustOxyLoss(3) failed_last_breath = 1 - throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) + throw_alert("not_enough_oxy", /atom/movable/screen/alert/not_enough_oxy) else //Enough oxygen failed_last_breath = 0 if(health >= crit_threshold) adjustOxyLoss(-5) - oxygen_used = breath.get_moles(/datum/gas/oxygen) + oxygen_used = breath.get_moles(GAS_O2) clear_alert("not_enough_oxy") - breath.adjust_moles(/datum/gas/oxygen, -oxygen_used) - breath.adjust_moles(/datum/gas/carbon_dioxide, oxygen_used) + breath.adjust_moles(GAS_O2, -oxygen_used) + breath.adjust_moles(GAS_CO2, oxygen_used) //CARBON DIOXIDE if(CO2_partialpressure > safe_co2_max) @@ -224,15 +226,15 @@ //TOXINS/PLASMA if(Toxins_partialpressure > safe_tox_max) - var/ratio = (breath.get_moles(/datum/gas/plasma)/safe_tox_max) * 10 + var/ratio = (breath.get_moles(GAS_PLASMA)/safe_tox_max) * 10 adjustToxLoss(CLAMP(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) - throw_alert("too_much_tox", /obj/screen/alert/too_much_tox) + throw_alert("too_much_tox", /atom/movable/screen/alert/too_much_tox) else clear_alert("too_much_tox") //NITROUS OXIDE - if(breath.get_moles(/datum/gas/nitrous_oxide)) - var/SA_partialpressure = (breath.get_moles(/datum/gas/nitrous_oxide)/breath.total_moles())*breath_pressure + if(breath.get_moles(GAS_NITROUS)) + var/SA_partialpressure = (breath.get_moles(GAS_NITROUS)/breath.total_moles())*breath_pressure if(SA_partialpressure > SA_para_min) Unconscious(60) if(SA_partialpressure > SA_sleep_min) @@ -245,26 +247,26 @@ SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "chemical_euphoria") //BZ (Facepunch port of their Agent B) - if(breath.get_moles(/datum/gas/bz)) - var/bz_partialpressure = (breath.get_moles(/datum/gas/bz)/breath.total_moles())*breath_pressure + if(breath.get_moles(GAS_BZ)) + var/bz_partialpressure = (breath.get_moles(GAS_BZ)/breath.total_moles())*breath_pressure if(bz_partialpressure > 1) hallucination += 10 else if(bz_partialpressure > 0.01) hallucination += 5 //TRITIUM - if(breath.get_moles(/datum/gas/tritium)) - var/tritium_partialpressure = (breath.get_moles(/datum/gas/tritium)/breath.total_moles())*breath_pressure + if(breath.get_moles(GAS_TRITIUM)) + var/tritium_partialpressure = (breath.get_moles(GAS_TRITIUM)/breath.total_moles())*breath_pressure radiation += tritium_partialpressure/10 //NITRYL - if(breath.get_moles(/datum/gas/nitryl)) - var/nitryl_partialpressure = (breath.get_moles(/datum/gas/nitryl)/breath.total_moles())*breath_pressure + if(breath.get_moles(GAS_NITRYL)) + var/nitryl_partialpressure = (breath.get_moles(GAS_NITRYL)/breath.total_moles())*breath_pressure adjustFireLoss(nitryl_partialpressure/4) //MIASMA - if(breath.get_moles(/datum/gas/miasma)) - var/miasma_partialpressure = (breath.get_moles(/datum/gas/miasma)/breath.total_moles())*breath_pressure + if(breath.get_moles(GAS_MIASMA)) + var/miasma_partialpressure = (breath.get_moles(GAS_MIASMA)/breath.total_moles())*breath_pressure if(prob(1 * miasma_partialpressure)) var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3) @@ -315,7 +317,7 @@ /mob/living/carbon/proc/get_breath_from_internal(volume_needed) if(internal) - if(internal.loc != src) + if(internal.loc != src && !(wear_mask.clothing_flags & MASKEXTENDRANGE)) // If the mask has extended range, do not check for internal.loc internal = null update_internals_hud_icon(0) else if ((!wear_mask || !(wear_mask.clothing_flags & MASKINTERNALS)) && !getorganslot(ORGAN_SLOT_BREATHING_TUBE)) @@ -336,10 +338,25 @@ stam_regen = TRUE if(stam_paralyzed) . |= BODYPART_LIFE_UPDATE_HEALTH //make sure we remove the stamcrit - for(var/I in bodyparts) - var/obj/item/bodypart/BP = I + var/bodyparts_with_stam = 0 + var/stam_heal_multiplier = 1 + var/total_stamina_loss = 0 //Quicker to put it here too than do it again with getStaminaLoss + var/force_heal = 0 + //Find how many bodyparts we have with stamina damage + if(stam_regen) + for(var/obj/item/bodypart/BP as anything in bodyparts) + if(BP.stamina_dam > DAMAGE_PRECISION) + bodyparts_with_stam ++ + total_stamina_loss += BP.stamina_dam * BP.stam_damage_coeff + //Force bodyparts to heal if we have more than 120 stamina damage (6 seconds) + force_heal = max(0, total_stamina_loss - 120) / max(bodyparts_with_stam, 1) + //Increase damage the more stam damage + //Incraesed stamina healing when above 50 stamloss, up to 2x healing rate when at 100 stamloss. + stam_heal_multiplier = CLAMP(total_stamina_loss / 50, 1, 2) + //Heal bodypart stamina damage + for(var/obj/item/bodypart/BP as() in bodyparts) if(BP.needs_processing) - . |= BP.on_life(stam_regen) + . |= BP.on_life(force_heal + ((stam_regen * stam_heal * stam_heal_multiplier) / max(bodyparts_with_stam, 1))) /mob/living/carbon/handle_diseases() for(var/thing in diseases) @@ -503,6 +520,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put adjustFireLoss(-0.06, FALSE) else SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "drunk") + sound_environment_override = SOUND_ENVIRONMENT_NONE if(drunkenness >= 11 && slurring < 5) slurring += 1.2 diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 17adfc3efee0d..8cdebc709f38e 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -64,8 +64,8 @@ /mob/living/carbon/monkey/proc/battle_screech() if(next_battle_screech < world.time) - emote(pick("roar","screech")) - for(var/mob/living/carbon/monkey/M in view(7,src)) + INVOKE_ASYNC(src, /mob.proc/emote, pick("roar","screech")) + for(var/mob/living/carbon/monkey/M in hearers(7,src)) M.next_battle_screech = world.time + battle_screech_cooldown /mob/living/carbon/monkey/proc/equip_item(obj/item/I) @@ -85,7 +85,7 @@ return TRUE // CLOTHING - else if(istype(I, /obj/item/clothing)) + else if(isclothing(I)) var/obj/item/clothing/C = I monkeyDrop(C) addtimer(CALLBACK(src, .proc/pickup_and_wear, C), 5) @@ -139,7 +139,7 @@ blacklistItems[pickupTarget] ++ pickupTarget = null pickupTimer = 0 - else if(!IsDeadOrIncap()) + else if(!IsDeadOrIncap()) INVOKE_ASYNC(src, .proc/walk2derpless, pickupTarget.loc) if(Adjacent(pickupTarget) || Adjacent(pickupTarget.loc)) // next to target drop_all_held_items() // who cares about these items, i want that one! @@ -158,7 +158,7 @@ switch(mode) if(MONKEY_IDLE) // idle if(enemies.len) - var/list/around = view(src, MONKEY_ENEMY_VISION) // scan for enemies + var/list/around = view(MONKEY_ENEMY_VISION, src) // scan for enemies for(var/mob/living/L in around) if( should_target(L) ) if(L.stat == CONSCIOUS) @@ -199,7 +199,7 @@ pickupTarget = W // recruit other monkies - var/list/around = view(src, MONKEY_ENEMY_VISION) + var/list/around = view(MONKEY_ENEMY_VISION, src) for(var/mob/living/carbon/monkey/M in around) if(M.mode == MONKEY_IDLE && prob(MONKEY_RECRUIT_PROB)) M.battle_screech() @@ -249,11 +249,10 @@ back_to_idle() if(MONKEY_FLEE) - var/list/around = view(src, MONKEY_FLEE_VISION) target = null // flee from anyone who attacked us and we didn't beat down - for(var/mob/living/L in around) + for(var/mob/living/L in view(MONKEY_FLEE_VISION, src)) if( enemies[L] && L.stat == CONSCIOUS ) target = L @@ -388,6 +387,26 @@ retaliate(L) return ..() +/mob/living/carbon/monkey/attack_animal(mob/living/simple_animal/M) + . = ..() + if(. && prob(MONKEY_RETALIATE_HARM_PROB)) + retaliate(M) + +/mob/living/carbon/monkey/attack_alien(mob/living/carbon/alien/humanoid/M) + . = ..() + if(. && prob(MONKEY_RETALIATE_HARM_PROB)) + retaliate(M) + +/mob/living/carbon/monkey/attack_larva(mob/living/carbon/alien/larva/L) + . = ..() + if(. && prob(MONKEY_RETALIATE_HARM_PROB)) + retaliate(L) + +/mob/living/carbon/monkey/attack_slime(mob/living/simple_animal/slime/M) + . = ..() + if(. && prob(MONKEY_RETALIATE_HARM_PROB)) + retaliate(M) + /mob/living/carbon/monkey/attackby(obj/item/W, mob/user, params) ..() if((W.force) && (!target) && (W.damtype != STAMINA) ) diff --git a/code/modules/mob/living/carbon/monkey/inventory.dm b/code/modules/mob/living/carbon/monkey/inventory.dm index d5fffc70a2ac2..42803c5aa65ba 100644 --- a/code/modules/mob/living/carbon/monkey/inventory.dm +++ b/code/modules/mob/living/carbon/monkey/inventory.dm @@ -1,28 +1,28 @@ /mob/living/carbon/monkey/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) switch(slot) - if(SLOT_HANDS) + if(ITEM_SLOT_HANDS) if(get_empty_held_indexes()) return TRUE return FALSE - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) if(wear_mask) return FALSE if( !(I.slot_flags & ITEM_SLOT_MASK) ) return FALSE return TRUE - if(SLOT_NECK) + if(ITEM_SLOT_NECK) if(wear_neck) return FALSE if( !(I.slot_flags & ITEM_SLOT_NECK) ) return FALSE return TRUE - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) if(head) return FALSE if( !(I.slot_flags & ITEM_SLOT_HEAD) ) return FALSE return TRUE - if(SLOT_BACK) + if(ITEM_SLOT_BACK) if(back) return FALSE if( !(I.slot_flags & ITEM_SLOT_BACK) ) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 41ec1e0e7f7d2..5c49627c98f8f 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -1,33 +1,5 @@ - - /mob/living/carbon/monkey - -/mob/living/carbon/monkey/Life() - set invisibility = 0 - - if (notransform) - return - - if(..() && !IsInStasis()) - - if(!client) - if(stat == CONSCIOUS) - if(on_fire || buckled || restrained()) - 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) && (mobility_flags & 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) if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB)) @@ -43,7 +15,17 @@ domutcheck() if(radiation > RAD_MOB_MUTATE * 1.5) - gorillize() + switch(rand(1, 3)) + if(1) + gorillize() + if(2) + humanize(TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG | TR_KEEPDAMAGE | TR_KEEPORGANS) + if(3) + var/obj/item/bodypart/BP = pick(bodyparts) + if(BP.body_part != HEAD && BP.body_part != CHEST) + if(BP.dismemberable) + BP.dismember() + take_bodypart_damage(100, 0, 0) return if(radiation > RAD_MOB_VOMIT && prob(RAD_MOB_VOMIT_PROB)) vomit(10, TRUE) @@ -75,22 +57,22 @@ adjust_bodytemperature(natural_bodytemperature_stabilization()) if(!on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases - if(loc_temp < bodytemperature) + if(loc_temp < bodytemperature && (!head?.min_cold_protection_temperature || head.min_cold_protection_temperature > loc_temp)) adjust_bodytemperature(max((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR, BODYTEMP_COOLING_MAX)) - else + else if(!head?.max_heat_protection_temperature || head.max_heat_protection_temperature < loc_temp) adjust_bodytemperature(min((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX)) if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !HAS_TRAIT(src, TRAIT_RESISTHEAT)) switch(bodytemperature) if(360 to 400) - throw_alert("temp", /obj/screen/alert/hot, 1) + throw_alert("temp", /atom/movable/screen/alert/hot, 1) apply_damage(HEAT_DAMAGE_LEVEL_1, BURN) if(400 to 460) - throw_alert("temp", /obj/screen/alert/hot, 2) + throw_alert("temp", /atom/movable/screen/alert/hot, 2) apply_damage(HEAT_DAMAGE_LEVEL_2, BURN) if(460 to INFINITY) - throw_alert("temp", /obj/screen/alert/hot, 3) + throw_alert("temp", /atom/movable/screen/alert/hot, 3) if(on_fire) apply_damage(HEAT_DAMAGE_LEVEL_3, BURN) else @@ -100,13 +82,13 @@ if(!istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell)) switch(bodytemperature) if(200 to 260) - throw_alert("temp", /obj/screen/alert/cold, 1) + throw_alert("temp", /atom/movable/screen/alert/cold, 1) apply_damage(COLD_DAMAGE_LEVEL_1, BURN) if(120 to 200) - throw_alert("temp", /obj/screen/alert/cold, 2) + throw_alert("temp", /atom/movable/screen/alert/cold, 2) apply_damage(COLD_DAMAGE_LEVEL_2, BURN) if(-INFINITY to 120) - throw_alert("temp", /obj/screen/alert/cold, 3) + throw_alert("temp", /atom/movable/screen/alert/cold, 3) apply_damage(COLD_DAMAGE_LEVEL_3, BURN) else clear_alert("temp") @@ -121,19 +103,26 @@ switch(adjusted_pressure) if(HAZARD_HIGH_PRESSURE to INFINITY) adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) ) - throw_alert("pressure", /obj/screen/alert/highpressure, 2) + throw_alert("pressure", /atom/movable/screen/alert/highpressure, 2) if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) - throw_alert("pressure", /obj/screen/alert/highpressure, 1) + throw_alert("pressure", /atom/movable/screen/alert/highpressure, 1) if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) clear_alert("pressure") if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) - throw_alert("pressure", /obj/screen/alert/lowpressure, 1) + throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 1) else adjustBruteLoss( LOW_PRESSURE_DAMAGE ) - throw_alert("pressure", /obj/screen/alert/lowpressure, 2) + throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 2) return +/mob/living/carbon/monkey/calculate_affecting_pressure(pressure) + if (head && isclothing(head)) + var/obj/item/clothing/CH = head + if (CH.clothing_flags & STOPSPRESSUREDAMAGE) + return ONE_ATMOSPHERE + return pressure + /mob/living/carbon/monkey/handle_random_events() if (prob(1) && prob(2)) emote("scratch") @@ -152,9 +141,9 @@ var/list/burning_items = list() //HEAD// var/list/obscured = check_obscured_slots(TRUE) - if(wear_mask && !(SLOT_WEAR_MASK in obscured)) + if(wear_mask && !(ITEM_SLOT_MASK in obscured)) burning_items += wear_mask - if(wear_neck && !(SLOT_NECK in obscured)) + if(wear_neck && !(ITEM_SLOT_NECK in obscured)) burning_items += wear_neck if(head) burning_items += head @@ -166,5 +155,6 @@ var/obj/item/I = X I.fire_act((fire_stacks * 50)) //damage taken is reduced to 2% of this value by fire_act() - adjust_bodytemperature(BODYTEMP_HEATING_MAX) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire) + if(!head?.max_heat_protection_temperature || head.max_heat_protection_temperature < FIRE_IMMUNITY_MAX_TEMP_PROTECT) + adjust_bodytemperature(BODYTEMP_HEATING_MAX) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index ab37ce2f2bde9..223f7c37d0740 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -13,13 +13,17 @@ type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/monkey gib_type = /obj/effect/decal/cleanable/blood/gibs unique_name = TRUE + blocks_emissive = EMISSIVE_BLOCK_UNIQUE bodyparts = list(/obj/item/bodypart/chest/monkey, /obj/item/bodypart/head/monkey, /obj/item/bodypart/l_arm/monkey, /obj/item/bodypart/r_arm/monkey, /obj/item/bodypart/r_leg/monkey, /obj/item/bodypart/l_leg/monkey) hud_type = /datum/hud/monkey + mobchatspan = "monkeyhive" + ai_controller = /datum/ai_controller/monkey + faction = list("neutral", "monkey") /mob/living/carbon/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner) - verbs += /mob/living/proc/mob_sleep - verbs += /mob/living/proc/lay_down + add_verb(/mob/living/proc/mob_sleep) + add_verb(/mob/living/proc/lay_down) if(unique_name) //used to exclude pun pun gender = pick(MALE, FEMALE) @@ -39,7 +43,7 @@ return INITIALIZE_HINT_QDEL SSmobs.cubemonkeys += src - create_dna(src) + create_dna() dna.initialize_dna(random_blood_type()) /mob/living/carbon/monkey/Destroy() @@ -85,17 +89,16 @@ slow += ((283.222 - bodytemperature) / 10) * 1.75 add_movespeed_modifier(MOVESPEED_ID_MONKEY_TEMPERATURE_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = slow) -/mob/living/carbon/monkey/Stat() - ..() - if(statpanel("Status")) - stat(null, "Intent: [a_intent]") - stat(null, "Move Mode: [m_intent]") - if(client && mind) - var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling) - if(changeling) - stat(null, "Chemical Storage: [changeling.chem_charges]/[changeling.chem_storage]") - stat(null, "Absorbed DNA: [changeling.absorbedcount]") - return +/mob/living/carbon/monkey/get_stat_tab_status() + var/list/tab_data = ..() + tab_data["Intent"] = GENERATE_STAT_TEXT("[a_intent]") + tab_data["Move Mode"] = GENERATE_STAT_TEXT("[m_intent]") + if(client && mind) + var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling) + if(changeling) + tab_data["Chemical Storage"] = GENERATE_STAT_TEXT("[changeling.chem_charges]/[changeling.chem_storage]") + tab_data["Absorbed DNA"] = GENERATE_STAT_TEXT("[changeling.absorbedcount]") + return tab_data /mob/living/carbon/monkey/verb/removeinternal() @@ -116,14 +119,14 @@ /mob/living/carbon/monkey/canBeHandcuffed() return TRUE -/mob/living/carbon/monkey/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) - if(judgement_criteria & JUDGE_EMAGGED) +/mob/living/carbon/monkey/assess_threat(judgment_criteria, lasercolor = "", datum/callback/weaponcheck=null) + if(judgment_criteria & JUDGE_EMAGGED) return 10 //Everyone is a criminal! var/threatcount = 0 //Securitrons can't identify monkeys - if( !(judgement_criteria & JUDGE_IGNOREMONKEYS) && (judgement_criteria & JUDGE_IDCHECK) ) + if( !(judgment_criteria & JUDGE_IGNOREMONKEYS) && (judgment_criteria & JUDGE_IDCHECK) ) threatcount += 4 //Lasertag bullshit @@ -139,7 +142,7 @@ return threatcount //Check for weapons - if( (judgement_criteria & JUDGE_WEAPONCHECK) && weaponcheck ) + if( (judgment_criteria & JUDGE_WEAPONCHECK) && weaponcheck ) for(var/obj/item/I in held_items) //if they're holding a gun if(weaponcheck.Invoke(I)) threatcount += 4 @@ -170,13 +173,13 @@ return TRUE /mob/living/carbon/monkey/angry - aggressive = TRUE + ai_controller = /datum/ai_controller/monkey/angry /mob/living/carbon/monkey/angry/Initialize() . = ..() if(prob(10)) var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src) - equip_to_slot_or_del(helmet,SLOT_HEAD) + equip_to_slot_or_del(helmet,ITEM_SLOT_HEAD) helmet.attack_self(src) // todo encapsulate toggle @@ -203,6 +206,42 @@ icon_state = null butcher_results = list(/obj/effect/spawner/lootdrop/teratoma/minor = 5, /obj/effect/spawner/lootdrop/teratoma/major = 1) type_of_meat = /obj/effect/spawner/lootdrop/teratoma/minor - aggressive = TRUE bodyparts = list(/obj/item/bodypart/chest/monkey/teratoma, /obj/item/bodypart/head/monkey/teratoma, /obj/item/bodypart/l_arm/monkey/teratoma, /obj/item/bodypart/r_arm/monkey/teratoma, /obj/item/bodypart/r_leg/monkey/teratoma, /obj/item/bodypart/l_leg/monkey/teratoma) + ai_controller = null + +/datum/dna/tumor + species = new /datum/species/teratoma + +/datum/species/teratoma + name = "Teratoma" + id = "teratoma" + say_mod = "mumbles" + species_traits = list(NOTRANSSTING, NO_DNA_COPY, EYECOLOR, HAIR, FACEHAIR, LIPS) + inherent_traits = list(TRAIT_NOHUNGER, TRAIT_RADIMMUNE, TRAIT_BADDNA, TRAIT_NOGUNS, TRAIT_NONECRODISEASE) //Made of mutated cells + default_features = list("mcolor" = "FFF", "wings" = "None") + use_skintones = 1 + skinned_type = /obj/item/stack/sheet/animalhide/monkey + liked_food = JUNKFOOD | FRIED | GROSS | RAW + changesource_flags = MIRROR_BADMIN + mutant_brain = /obj/item/organ/brain/tumor + +/obj/item/organ/brain/tumor + name = "teratoma brain" + +/obj/item/organ/brain/tumor/Remove(mob/living/carbon/C, special, no_id_transfer) + . = ..() + //Removing it deletes it + qdel(src) + +/mob/living/carbon/monkey/tumor/handle_mutations_and_radiation() + return + +/mob/living/carbon/monkey/tumor/has_dna() + return FALSE + +/mob/living/carbon/monkey/tumor/create_dna() + dna = new /datum/dna/tumor(src) + //Give us the juicy mutant organs + dna.species.on_species_gain(src, null, FALSE) + dna.species.regenerate_organs(src, replace_current = TRUE) diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm index 4ccd1de779cbf..859ae03979754 100644 --- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm +++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm @@ -121,6 +121,8 @@ var/damage = 20 if(M.is_adult) damage = 30 + if(M.transformeffects & SLIME_EFFECT_RED) + damage *= 1.1 var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) if(!dam_zone) //Dismemberment successful return 1 diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/monkey/punpun.dm index cee9f0387eea1..5fa3091fb6d8f 100644 --- a/code/modules/mob/living/carbon/monkey/punpun.dm +++ b/code/modules/mob/living/carbon/monkey/punpun.dm @@ -16,16 +16,16 @@ else if(prob(10)) name = pick(list("Professor Bobo", "Deempisi's Revenge", "Furious George", "King Louie", "Dr. Zaius", "Jimmy Rustles", "Dinner", "Lanky")) if(name == "Furious George") - aggressive = TRUE // Furious George is PISSED + ai_controller = /datum/ai_controller/monkey/angry //hes always mad . = ..() //These have to be after the parent new to ensure that the monkey //bodyparts are actually created before we try to equip things to //those slots if(relic_hat) - equip_to_slot_or_del(new relic_hat, SLOT_HEAD) + equip_to_slot_or_del(new relic_hat, ITEM_SLOT_HEAD) if(relic_mask) - equip_to_slot_or_del(new relic_mask, SLOT_WEAR_MASK) + equip_to_slot_or_del(new relic_mask, ITEM_SLOT_MASK) /mob/living/carbon/monkey/punpun/Life() if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index e971fd800de8a..240314fda3a4a 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -1,4 +1,6 @@ /mob/living/carbon/proc/handle_tongueless_speech(mob/living/carbon/speaker, list/speech_args) + SIGNAL_HANDLER + var/message = speech_args[SPEECH_MESSAGE] var/static/regex/tongueless_lower = new("\[gdntke]+", "g") var/static/regex/tongueless_upper = new("\[GDNTKE]+", "g") @@ -19,16 +21,3 @@ else . = initial(dt.flags) & TONGUELESS_SPEECH -/mob/living/carbon/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) - var/datum/status_effect/bugged/B = has_status_effect(STATUS_EFFECT_BUGGED) - if(B) - B.listening_in.show_message(message) - for(var/T in get_traumas()) - var/datum/brain_trauma/trauma = T - message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq) - - if (src.mind.has_antag_datum(/datum/antagonist/traitor)) - message = GLOB.syndicate_code_phrase_regex.Replace(message, "$1") - message = GLOB.syndicate_code_response_regex.Replace(message, "$1") - - return message diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index 7fe02dcc148bf..4c530e0535b0e 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -13,24 +13,27 @@ return if(!IsParalyzed()) to_chat(src, "You're too exhausted to keep going.") + stam_regen_start_time = world.time + STAMINA_CRIT_TIME stam_paralyzed = TRUE /mob/living/carbon/adjust_drugginess(amount) druggy = max(druggy+amount, 0) if(druggy) - overlay_fullscreen("high", /obj/screen/fullscreen/high) - throw_alert("high", /obj/screen/alert/high) + overlay_fullscreen("high", /atom/movable/screen/fullscreen/high) + throw_alert("high", /atom/movable/screen/alert/high) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "high", /datum/mood_event/high) + sound_environment_override = SOUND_ENVIRONMENT_DRUGGED else clear_fullscreen("high") clear_alert("high") SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "high") + sound_environment_override = SOUND_ENVIRONMENT_NONE /mob/living/carbon/set_drugginess(amount) druggy = max(amount, 0) if(druggy) - overlay_fullscreen("high", /obj/screen/fullscreen/high) - throw_alert("high", /obj/screen/alert/high) + overlay_fullscreen("high", /atom/movable/screen/fullscreen/high) + throw_alert("high", /atom/movable/screen/alert/high) else clear_fullscreen("high") clear_alert("high") diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 725ecef40eba1..97d00426a4389 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -114,12 +114,12 @@ if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated return - if(client && hud_used && hud_used.inv_slots[SLOT_WEAR_MASK]) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] + if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_MASK) + 1]) + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_MASK) + 1] inv.update_icon() if(wear_mask) - if(!(SLOT_WEAR_MASK in check_obscured_slots())) + if(!(ITEM_SLOT_MASK in check_obscured_slots())) 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') update_hud_wear_mask(wear_mask) @@ -128,12 +128,12 @@ /mob/living/carbon/update_inv_neck() remove_overlay(NECK_LAYER) - if(client && hud_used && hud_used.inv_slots[SLOT_NECK]) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_NECK] + if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_NECK) + 1]) + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_NECK) + 1] inv.update_icon() if(wear_neck) - if(!(SLOT_NECK in check_obscured_slots())) + if(!(ITEM_SLOT_NECK in check_obscured_slots())) 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') update_hud_neck(wear_neck) @@ -142,8 +142,8 @@ /mob/living/carbon/update_inv_back() remove_overlay(BACK_LAYER) - if(client && hud_used && hud_used.inv_slots[SLOT_BACK]) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BACK] + if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_BACK) + 1]) + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_BACK) + 1] inv.update_icon() if(back) @@ -158,8 +158,8 @@ if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated return - if(client && hud_used && hud_used.inv_slots[SLOT_BACK]) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] + if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_HEAD) + 1]) + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_HEAD) + 1] inv.update_icon() if(head) @@ -182,7 +182,7 @@ /mob/living/carbon/proc/update_hud_handcuffed() if(hud_used) for(var/hand in hud_used.hand_slots) - var/obj/screen/inventory/hand/H = hud_used.hand_slots[hand] + var/atom/movable/screen/inventory/hand/H = hud_used.hand_slots[hand] if(H) H.update_icon() @@ -257,7 +257,7 @@ - limbs (stores as the limb name and whether it is removed/fine, organic/robotic) These procs only store limbs as to increase the number of matching icon_render_keys This cache exists because drawing 6/7 icons for humans constantly is quite a waste - See RemieRichards on irc.rizon.net #coderbus + See RemieRichards on irc.rizon.net #coderbus (RIP remie :sob:) */ //produces a key based on the mob's limbs diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index fe4f0b8b79d0c..f57c06ea39f92 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -207,7 +207,7 @@ return cloneloss /mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) - if(!forced && (status_flags & GODMODE)) + if(!forced && ((status_flags & GODMODE) || HAS_TRAIT(src, TRAIT_NOCLONELOSS))) return FALSE cloneloss = CLAMP((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) @@ -215,7 +215,7 @@ return amount /mob/living/proc/setCloneLoss(amount, updating_health = TRUE, forced = FALSE) - if(!forced && (status_flags & GODMODE)) + if(!forced && ((status_flags & GODMODE) || HAS_TRAIT(src, TRAIT_NOCLONELOSS))) return FALSE cloneloss = amount if(updating_health) @@ -256,7 +256,7 @@ adjustStaminaLoss(stamina, FALSE) if(updating_health) updatehealth() - update_stamina() + update_stamina(stamina > DAMAGE_PRECISION) // heal MANY bodyparts, in random order /mob/living/proc/heal_overall_damage(brute = 0, burn = 0, stamina = 0, required_status, updating_health = TRUE) @@ -274,7 +274,7 @@ adjustStaminaLoss(stamina, FALSE) if(updating_health) updatehealth() - update_stamina() + update_stamina(stamina > DAMAGE_PRECISION) //heal up to amount damage, in a given order /mob/living/proc/heal_ordered_damage(amount, list/damage_types) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index d437abfeb33cd..5800d400a8048 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -48,25 +48,23 @@ /mob/living/death(gibbed) var/was_dead_before = stat == DEAD - stat = DEAD + set_stat(DEAD) unset_machine() timeofdeath = world.time tod = station_time_timestamp() var/turf/T = get_turf(src) for(var/obj/item/I in contents) I.on_mob_death(src, gibbed) - for(var/datum/disease/advance/D in diseases) - for(var/symptom in D.symptoms) - var/datum/symptom/S = symptom - S.OnDeath(D) if(mind) if(mind.name && mind.active && !istype(T.loc, /area/ctf)) var/rendered = "[mind.name] has died at [get_area_name(T)]." deadchat_broadcast(rendered, follow_target = src, turf_target = T, message_type=DEADCHAT_DEATHRATTLE) mind.store_memory("Time of death: [tod]", 0) - GLOB.alive_mob_list -= src + remove_from_alive_mob_list() + if(playable) + remove_from_spawner_menu() if(!gibbed && !was_dead_before) - GLOB.dead_mob_list += src + add_to_dead_mob_list() SetSleeping(0, 0) blind_eyes(1) @@ -99,6 +97,9 @@ var/datum/soullink/S = s S.sharerDies(gibbed) + if(mind?.current) + client?.tgui_panel?.give_dead_popup() + return TRUE /mob/living/carbon/death(gibbed) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 60a498894c2b6..61c9f1e5a6331 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -146,7 +146,7 @@ /datum/emote/living/gasp key = "gasp" key_third_person = "gasps" - message = "gasps!" + message = "gasps" emote_type = EMOTE_AUDIBLE stat_allowed = UNCONSCIOUS @@ -183,7 +183,7 @@ /datum/emote/living/jump key = "jump" key_third_person = "jumps" - message = "jumps!" + message = "jumps" restraint_check = TRUE /datum/emote/living/kiss @@ -346,7 +346,7 @@ /datum/emote/living/surrender key = "surrender" key_third_person = "surrenders" - message = "puts their hands on their head and falls to the ground, they surrender!" + message = "puts their hands on their head and falls to the ground, surrendering" emote_type = EMOTE_AUDIBLE /datum/emote/living/surrender/run_emote(mob/user, params, type_override, intentional) @@ -363,7 +363,7 @@ /datum/emote/living/tremble key = "tremble" key_third_person = "trembles" - message = "trembles in fear!" + message = "trembles in fear" /datum/emote/living/twitch key = "twitch" @@ -477,8 +477,8 @@ /datum/emote/beep key = "beep" key_third_person = "beeps" - message = "beeps." - message_param = "beeps at %t." + message = "beeps" + message_param = "beeps at %t" sound = 'sound/machines/twobeep.ogg' mob_type_allowed_typecache = list(/mob/living/brain, /mob/living/silicon) @@ -554,9 +554,9 @@ /datum/emote/inhale key = "inhale" key_third_person = "inhales" - message = "breathes in." + message = "breathes in" /datum/emote/exhale key = "exhale" key_third_person = "exhales" - message = "breathes out." + message = "breathes out" diff --git a/code/modules/mob/living/inhand_holder.dm b/code/modules/mob/living/inhand_holder.dm index bbe55b8b343ff..ffe96c74d60f9 100644 --- a/code/modules/mob/living/inhand_holder.dm +++ b/code/modules/mob/living/inhand_holder.dm @@ -6,6 +6,7 @@ icon = null icon_state = "" slot_flags = NONE + clothing_flags = NOTCONSUMABLE var/mob/living/held_mob var/can_head = TRUE var/destroying = FALSE @@ -44,11 +45,15 @@ /obj/item/clothing/head/mob_holder/proc/update_visuals(mob/living/L) appearance = L.appearance -/obj/item/clothing/head/mob_holder/dropped() +/obj/item/clothing/head/mob_holder/dropped(mob/user, thrown = FALSE) ..() - if(held_mob && isturf(loc)) + if(held_mob && isturf(loc) && !thrown) release() +/obj/item/clothing/head/mob_holder/throw_impact(atom/hit_atom, datum/thrownthing/thrownthing) + . = ..() + release() + /obj/item/clothing/head/mob_holder/proc/release(del_on_release = TRUE) if(!held_mob) if(del_on_release && !destroying) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 22514ee8ceebc..32e4d34012f3b 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -2,12 +2,12 @@ set waitfor = FALSE set invisibility = 0 - if(digitalinvis) //AI unable to see mob + if(HAS_TRAIT(src,TRAIT_DIGINVIS)) //AI unable to see mob if(!digitaldisguise) src.digitaldisguise = image(loc = src) src.digitaldisguise.override = 1 for(var/mob/living/silicon/ai/AI in GLOB.ai_list) - AI.client.images |= src.digitaldisguise + AI.client?.images |= src.digitaldisguise if((movement_type & FLYING) && !(movement_type & FLOATING)) //TODO: Better floating float(on = TRUE) @@ -42,7 +42,7 @@ handle_environment(environment) //Handle gravity - var/gravity = mob_has_gravity() + var/gravity = has_gravity() update_gravity(gravity) if(gravity > STANDARD_GRAVITY) @@ -90,7 +90,7 @@ ExtinguishMob() return TRUE //mob was put out, on_fire = FALSE via ExtinguishMob(), no need to update everything down the chain. var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment - if(G.get_moles(/datum/gas/oxygen) < 1) + if(G.get_moles(GAS_O2) < 1) ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire return TRUE var/turf/location = get_turf(src) @@ -109,9 +109,11 @@ if(client && !eye_blind) clear_alert("blind") clear_fullscreen("blind") + //Prevents healing blurryness while blind from normal means + return else eye_blind = max(eye_blind-1,1) - else if(eye_blurry) //blurry eyes heal slowly + if(eye_blurry) //blurry eyes heal slowly eye_blurry = max(eye_blurry-1, 0) if(client) update_eye_blur() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 24b2c5143949b..413fe0be22d22 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -10,6 +10,8 @@ faction += "[REF(src)]" GLOB.mob_living_list += src initialize_footstep() + if (playable) + set_playable() //announce to ghosts /mob/living/proc/initialize_footstep() AddComponent(/datum/component/footstep) @@ -53,18 +55,26 @@ /mob/living/proc/OpenCraftingMenu() return +/mob/living/proc/can_bumpslam() + REMOVE_MOB_PROPERTY(src, PROP_CANTBUMPSLAM, src.type) + //Generic Bump(). Override MobBump() and ObjBump() instead of this. /mob/living/Bump(atom/A) if(..()) //we are thrown onto something return if(buckled || now_pushing) return - if(!ismovableatom(A) || is_blocked_turf(A)) // ported from VORE, sue me - if((confused || is_blind()) && stat == CONSCIOUS && m_intent=="run" && mobility_flags & MOBILITY_STAND) + if((confused || is_blind()) && stat == CONSCIOUS && (mobility_flags & MOBILITY_STAND) && m_intent == "run" && (!ismovableatom(A) || is_blocked_turf(A)) && !HAS_MOB_PROPERTY(src, PROP_CANTBUMPSLAM)) // ported from VORE, sue me + APPLY_MOB_PROPERTY(src, PROP_CANTBUMPSLAM, src.type) //Bump() is called continuously so ratelimit the check to 20 seconds if it passes or 5 if it doesn't + if(prob(10)) playsound(get_turf(src), "punch", 25, 1, -1) visible_message("[src] [pick("ran", "slammed")] into \the [A]!") apply_damage(5, BRUTE) Paralyze(40) + addtimer(CALLBACK(src, .proc/can_bumpslam), 200) + else + addtimer(CALLBACK(src, .proc/can_bumpslam), 50) + if(ismob(A)) var/mob/M = A @@ -181,7 +191,7 @@ return TRUE //anti-riot equipment is also anti-push for(var/obj/item/I in M.held_items) - if(!istype(M, /obj/item/clothing)) + if(!isclothing(M)) if(I.block_power >= 50) return @@ -269,6 +279,9 @@ pulling = AM AM.pulledby = src + + SEND_SIGNAL(src, COMSIG_LIVING_START_PULL, AM, state, force) + if(!supress_message) var/sound_to_play = 'sound/weapons/thudswoosh.ogg' if(ishuman(src)) @@ -284,14 +297,20 @@ var/mob/M = AM log_combat(src, M, "grabbed", addition="passive grab") - if(!supress_message && !(iscarbon(AM) && HAS_TRAIT(src, TRAIT_STRONG_GRABBER))) - M.visible_message("[src] grabs [M] [(zone_selected == "l_arm" || zone_selected == "r_arm")? "by their hands":"passively"]!", \ - "[src] grabs you [(zone_selected == "l_arm" || zone_selected == "r_arm")? "by your hands":"passively"]!", null, null, src) - to_chat(src, "You grab [M] [(zone_selected == "l_arm" || zone_selected == "r_arm")? "by their hands":"passively"]!") + if(!supress_message && !(iscarbon(AM) && HAS_TRAIT(src, TRAIT_STRONG_GRABBER))) //Everything in this if statement handles chat messages for grabbing + var/mob/living/L = M + if (L.getorgan(/obj/item/organ/tail) && zone_selected == BODY_ZONE_PRECISE_GROIN) //Does the target have a tail? + M.visible_message("[src] grabs [L] by [L.p_their()] tail!",\ + " [src] grabs you by the tail!", null, null, src) //Message sent to area, Message sent to grabbee + to_chat(src, "You grab [L] by [L.p_their()] tail!") //Message sent to grabber + else + M.visible_message("[src] grabs [M] [(zone_selected == BODY_ZONE_L_ARM || zone_selected == BODY_ZONE_R_ARM)? "by their hands":"passively"]!", \ + "[src] grabs you [(zone_selected == BODY_ZONE_L_ARM || zone_selected == BODY_ZONE_R_ARM)? "by your hands":"passively"]!", null, null, src) //Message sent to area, Message sent to grabbee + to_chat(src, "You grab [M] [(zone_selected == BODY_ZONE_L_ARM|| zone_selected == BODY_ZONE_R_ARM)? "by their hands":"passively"]!") //Message sent to grabber if(!iscarbon(src)) M.LAssailant = null else - M.LAssailant = usr + M.LAssailant = WEAKREF(usr) if(isliving(M)) var/mob/living/L = M //Share diseases that are spread by touch @@ -513,15 +532,6 @@ /mob/living/is_drawable(mob/user, allowmobs = TRUE) return (allowmobs && reagents && can_inject(user)) -/mob/living/proc/get_organ_target() - var/mob/shooter = src - var/t = shooter.zone_selected - if ((t in list( BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH ))) - t = BODY_ZONE_HEAD - var/def_zone = ran_zone(t) - return def_zone - - /mob/living/proc/updatehealth() if(status_flags & GODMODE) return @@ -537,10 +547,10 @@ if(full_heal) fully_heal(admin_revive) if(stat == DEAD && can_be_revived()) //in some cases you can't revive (e.g. no brain) - GLOB.dead_mob_list -= src - GLOB.alive_mob_list += src + remove_from_dead_mob_list() + add_to_alive_mob_list() set_suicide(FALSE) - stat = UNCONSCIOUS //the mob starts unconscious, + set_stat(UNCONSCIOUS) //the mob starts unconscious, blind_eyes(1) updatehealth() //then we check if the mob should wake up. update_mobility() @@ -648,8 +658,8 @@ if(!(mobility_flags & MOBILITY_STAND) && !buckled && prob(getBruteLoss()*200/maxHealth)) makeTrail(newloc, T, old_direction) -/mob/living/proc/makeTrail(turf/target_turf, turf/start, direction) - if(!has_gravity()) +/mob/living/proc/makeTrail(turf/target_turf, turf/start, direction, spec_color) + if(!has_gravity() || (movement_type & THROWN)) return var/blood_exists = FALSE @@ -679,9 +689,13 @@ TH.add_overlay(image('icons/effects/blood.dmi', trail_type, dir = newdir)) TH.transfer_mob_blood_dna(src) -/mob/living/carbon/human/makeTrail(turf/T) + if(spec_color) + TH.color = spec_color + +/mob/living/carbon/human/makeTrail(turf/T, turf/start, direction, spec_color) if((NOBLOOD in dna.species.species_traits) || !bleed_rate || bleedsuppress) return + spec_color = dna.species.blood_color ..() /mob/living/proc/getTrail() @@ -742,9 +756,9 @@ resist_buckle() //Breaking out of a container (Locker, sleeper, cryo...) - else if(isobj(loc)) - var/obj/C = loc - C.container_resist(src) + else if(istype(loc, /atom/movable)) + var/atom/movable/M = loc + M.container_resist(src) else if(mobility_flags & MOBILITY_MOVE) if(on_fire) @@ -799,11 +813,11 @@ clear_alert("gravity") else if(has_gravity >= GRAVITY_DAMAGE_TRESHOLD) - throw_alert("gravity", /obj/screen/alert/veryhighgravity) + throw_alert("gravity", /atom/movable/screen/alert/veryhighgravity) else - throw_alert("gravity", /obj/screen/alert/highgravity) + throw_alert("gravity", /atom/movable/screen/alert/highgravity) else - throw_alert("gravity", /obj/screen/alert/weightless) + throw_alert("gravity", /atom/movable/screen/alert/weightless) if(!override && !is_flying()) float(!has_gravity) @@ -814,9 +828,8 @@ if(anchored || (buckled && buckled.anchored)) fixed = 1 if(on && !(movement_type & FLOATING) && !fixed) - animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1) - sleep(10) - animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1) + animate(src, pixel_y = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE) + animate(pixel_y = -2, time = 10, loop = -1, flags = ANIMATION_RELATIVE) setMovetype(movement_type | FLOATING) else if(((!on || fixed) && (movement_type & FLOATING))) animate(src, pixel_y = get_standard_pixel_y_offset(lying), time = 10) @@ -912,7 +925,7 @@ loc_temp = obj_temp else if(isspaceturf(get_turf(src))) var/turf/heat_turf = get_turf(src) - loc_temp = heat_turf.temperature + loc_temp = heat_turf.return_temperature() return loc_temp /mob/living/proc/get_standard_pixel_x_offset(lying = 0) @@ -938,7 +951,7 @@ return 0 if(invisibility || alpha == 0)//cloaked return 0 - if(digitalcamo || digitalinvis) + if(HAS_TRAIT(src, TRAIT_DIGICAMO) || HAS_TRAIT(src, TRAIT_DIGINVIS)) return 0 // Now, are they viewable by a camera? (This is last because it's the most intensive check) @@ -1005,7 +1018,7 @@ return TRUE return FALSE -/mob/living/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) +/mob/living/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force = MOVE_FORCE_STRONG, quickstart = TRUE) stop_pulling() . = ..() @@ -1063,7 +1076,7 @@ src.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) + throw_alert("fire", /atom/movable/screen/alert/fire) update_fire() SEND_SIGNAL(src, COMSIG_LIVING_IGNITED,src) return TRUE @@ -1338,11 +1351,11 @@ return FALSE if("stat") if((stat == DEAD) && (var_value < DEAD))//Bringing the dead back to life - GLOB.dead_mob_list -= src - GLOB.alive_mob_list += src + remove_from_dead_mob_list() + add_to_alive_mob_list() if((stat < DEAD) && (var_value == DEAD))//Kill he - GLOB.alive_mob_list -= src - GLOB.dead_mob_list += src + remove_from_alive_mob_list() + add_to_dead_mob_list() . = ..() switch(var_name) if("knockdown") @@ -1385,6 +1398,6 @@ "} /mob/living/eminence_act(mob/living/simple_animal/eminence/eminence) - if(is_servant_of_ratvar(src)) + if(is_servant_of_ratvar(src) && !iseminence(src)) eminence.selected_mob = src to_chat(eminence, "You select [src].") diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 31293726e61b4..7a9827ce54f41 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -1,9 +1,13 @@ - -/mob/living/proc/run_armor_check(def_zone = null, attack_flag = "melee", absorb_text = null, soften_text = null, armour_penetration, penetrated_text) +/mob/living/proc/run_armor_check(def_zone = null, attack_flag = "melee", absorb_text = null, soften_text = null, armour_penetration, penetrated_text, silent=FALSE) var/armor = getarmor(def_zone, attack_flag) + if(armor <= 0) + return armor + 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 > 0 && armour_penetration) + if(armour_penetration) armor = max(0, armor - armour_penetration) if(penetrated_text) to_chat(src, "[penetrated_text]") @@ -14,14 +18,13 @@ to_chat(src, "[absorb_text]") else to_chat(src, "Your armor absorbs the blow!") - else if(armor > 0) + else if(soften_text) to_chat(src, "[soften_text]") else to_chat(src, "Your armor softens the blow!") return armor - /mob/living/proc/getarmor(def_zone, type) return 0 @@ -38,12 +41,12 @@ /mob/living/proc/is_eyes_covered(check_glasses = 1, check_head = 1, check_mask = 1) return FALSE -/mob/living/proc/is_pepper_proof(check_head = TRUE, check_mask = TRUE) - return FALSE + /mob/living/proc/on_hit(obj/item/projectile/P) return BULLET_ACT_HIT /mob/living/bullet_act(obj/item/projectile/P, def_zone) + SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone) var/armor = run_armor_check(def_zone, P.flag, "","",P.armour_penetration) if(!P.nodamage) apply_damage(P.damage, P.damage_type, def_zone, armor) @@ -68,8 +71,13 @@ 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 + var/nosell_hit = SEND_SIGNAL(I, COMSIG_MOVABLE_IMPACT_ZONE, src, zone, throwingdatum) // TODO: find a better way to handle hitpush and skipcatch for humans + if(nosell_hit) + skipcatch = TRUE + hitpush = FALSE + + if(blocked) + return TRUE if (I.throwforce > 0) //If the weapon's throwforce is greater than zero... if (I.throwhitsound) //...and throwhitsound is defined... @@ -88,13 +96,17 @@ "You're 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) - if(I.thrownby) - log_combat(I.thrownby, src, "threw and hit", I) + + var/mob/thrown_by = I.thrownby?.resolve() + if(thrown_by) + log_combat(thrown_by, src, "threw and hit", I) + if(!incapacitated(FALSE, TRUE)) // physics says it's significantly harder to push someone by constantly chucking random furniture at them if they are down on the floor. + hitpush = FALSE else return 1 else playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1) - ..() + ..(AM, skipcatch, hitpush, blocked, throwingdatum) /mob/living/mech_melee_attack(obj/mecha/M) @@ -104,7 +116,7 @@ step_away(src,M,15) switch(M.damtype) if(BRUTE) - Unconscious(20) + Knockdown(20) take_overall_damage(rand(M.force/2, M.force)) playsound(src, 'sound/weapons/punch4.ogg', 50, 1) if(BURN) @@ -170,7 +182,7 @@ if(!user.pulling || user.pulling != src || user.grab_state != old_grab_state) return 0 if(user.a_intent != INTENT_GRAB) - to_chat(user, "You must be on grab intent to upgrade your grab further!") + to_chat(user, "You must be on grab intent to upgrade your grab further!") return 0 user.setGrabState(user.grab_state + 1) switch(user.grab_state) @@ -213,11 +225,11 @@ 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 - if (stat != DEAD) + if(stat != DEAD) log_combat(M, src, "attacked") M.do_attack_animation(src) visible_message("\The [M.name] glomps [src]!", \ @@ -227,21 +239,20 @@ /mob/living/attack_animal(mob/living/simple_animal/M) M.face_atom(src) if(M.melee_damage == 0) - M.visible_message("\The [M] [M.friendly] [src]!", \ - "\The [M] [M.friendly] you!") + visible_message("\The [M] [M.friendly] [src]!", \ + "\The [M] [M.friendly] you!", null, COMBAT_MESSAGE_RANGE) + return FALSE + if(HAS_TRAIT(M, TRAIT_PACIFISM)) + to_chat(M, "You don't want to hurt anyone!") return FALSE - else - if(HAS_TRAIT(M, TRAIT_PACIFISM)) - to_chat(M, "You don't want to hurt anyone!") - return FALSE - 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] you!", null, COMBAT_MESSAGE_RANGE) - log_combat(M, src, "attacked") - return TRUE + 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] you!", null, COMBAT_MESSAGE_RANGE) + log_combat(M, src, "attacked") + return TRUE /mob/living/attack_paw(mob/living/carbon/monkey/M) @@ -261,7 +272,7 @@ log_combat(M, src, "attacked") playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) visible_message("[M.name] bites [src]!", \ - "[M.name] bites you!", null, COMBAT_MESSAGE_RANGE) + "[M.name] bites you!", null, COMBAT_MESSAGE_RANGE) return TRUE return FALSE @@ -290,6 +301,7 @@ return FALSE /mob/living/attack_alien(mob/living/carbon/alien/humanoid/M) + SEND_SIGNAL(src, COMSIG_MOB_ATTACK_ALIEN, M) switch(M.a_intent) if ("help") visible_message("[M] caresses [src] with its scythe-like arm.", \ @@ -320,7 +332,7 @@ return 1 /mob/living/proc/electrocute_act(shock_damage, source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0, stun = TRUE) - SEND_SIGNAL(src, COMSIG_LIVING_ELECTROCUTE_ACT, shock_damage) + SEND_SIGNAL(src, COMSIG_LIVING_ELECTROCUTE_ACT, shock_damage, source, siemens_coeff, safety, tesla_shock, illusion, stun) if(tesla_shock && (flags_1 & TESLA_IGNORE_1)) return FALSE if(HAS_TRAIT(src, TRAIT_SHOCKIMMUNE)) @@ -350,7 +362,7 @@ SSmedals.UnlockMedal(MEDAL_SINGULARITY_DEATH,client) - investigate_log("([key_name(src)]) has been consumed by the singularity.", INVESTIGATE_SINGULO) //Oh that's where the clown ended up! + investigate_log("([key_name(src)]) has been consumed by the singularity.", INVESTIGATE_ENGINES) //Oh that's where the clown ended up! gib() return(gain) @@ -381,7 +393,7 @@ //called when the mob receives a bright flash -/mob/living/proc/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash) +/mob/living/proc/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash) if(get_eye_protection() < intensity && (override_blindness_check || !(HAS_TRAIT(src, TRAIT_BLIND)))) overlay_fullscreen("flash", type) addtimer(CALLBACK(src, .proc/clear_fullscreen, "flash", 25), 25) @@ -410,7 +422,5 @@ else E.extrapolate(src, diseases, user) return TRUE - else + else return FALSE - - diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 9a2c22c7dc429..153a23c96fe38 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -4,6 +4,8 @@ see_in_dark = 2 hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD) pressure_resistance = 10 + chat_color = "#CCCCCC" //The say color of the mob, for when ID say isn't available (simplemobs that are not /mob/living/carbon/human) + var/resize = 1 //Badminnery resize var/lastattacker = null @@ -77,6 +79,9 @@ var/list/guaranteed_butcher_results = null //these will always be yielded from butchering var/butcher_difficulty = 0 //effectiveness prob. is modified negatively by this amount; positive numbers make it more difficult, negative ones make it easier + //LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly + var/melee_damage = 0 + var/hellbound = 0 //People who've signed infernal contracts are unrevivable. var/list/weather_immunities = list() @@ -115,7 +120,7 @@ var/ventcrawl_layer = PIPING_LAYER_DEFAULT var/losebreath = 0 - var/mobsay_color = "#CCCCCC" //The say colour of the mob, for when ID say isn't available (simplemobs that are not /mob/living/carbon/human) + var/mobchatspan = "unknown" //The span to use when this mob talks in chat for the name tag //List of active diseases var/list/diseases = list() // list of all diseases in a mob @@ -130,3 +135,7 @@ var/icon/held_rh = 'icons/mob/pets_held_rh.dmi' var/icon/head_icon = 'icons/mob/pets_held.dmi'//what it looks like on your head var/held_state = ""//icon state for the above + + //is mob player controllable + var/playable = FALSE + var/flavor_text = FLAVOR_TEXT_NONE diff --git a/code/modules/mob/living/living_sentience.dm b/code/modules/mob/living/living_sentience.dm new file mode 100644 index 0000000000000..293c8e920ae7a --- /dev/null +++ b/code/modules/mob/living/living_sentience.dm @@ -0,0 +1,71 @@ +//WHY ISN'T THIS COMPONENT + +/mob/living/ghostize(can_reenter_corpse, sentience_retention) + . = ..() + switch(sentience_retention) + if (SENTIENCE_RETAIN) + if (playable) //so the alert goes through for observing ghosts + set_playable() + if (SENTIENCE_FORCE) + set_playable() + if (SENTIENCE_ERASE) + playable = FALSE + +/mob/living/attack_ghost(mob/user) + . = ..() + if(.) + return + give_mind(user) + +/mob/living/Topic(href, href_list) + if(..()) + return + if(href_list["activate"]) + var/mob/dead/observer/ghost = usr + if(istype(ghost) && playable) + give_mind(ghost) + +/mob/living/proc/give_mind(mob/user) + if(key || !playable || stat) + return 0 + var/question = alert("Do you want to become [name]?", "[name]", "Yes", "No") + if(question == "No" || !src || QDELETED(src)) + return TRUE + if(key) + to_chat(user, "Someone else already took [name].") + return TRUE + key = user.key + log_game("[key_name(src)] took control of [name].") + remove_from_spawner_menu() + if(get_spawner_flavour_text()) + to_chat(src, "[get_spawner_flavour_text()]") + return TRUE + +/mob/living/proc/set_playable() + playable = TRUE + if (!key) //check if there is nobody already inhibiting this mob + notify_ghosts("[name] can be controlled", null, enter_link="(Click to play)", source=src, action=NOTIFY_ATTACK, ignore_key = name) + LAZYADD(GLOB.mob_spawners["[name]"], src) + GLOB.poi_list |= src + SSmobs.update_spawners() + +/mob/living/get_spawner_desc() + return "Become [name]." + +/mob/living/get_spawner_flavour_text() + switch (flavor_text) + if (FLAVOR_TEXT_EVIL) + return "You are a untamed creature with no reason to hold back. Kill anyone you see as a threat to you or your cause." + if (FLAVOR_TEXT_GOOD) + return "Remember, you have no hate towards the inhabitants of the station. There is no reason for you to attack them unless you are attacked." + if (FLAVOR_TEXT_GOAL_ANTAG) + return "You have a disdain for the inhabitants of this station, but your goals are more important. Make sure you work towards your objectives with your kin, instead of attacking everything on sight." + return flavor_text + +/mob/living/proc/remove_from_spawner_menu() + for(var/spawner in GLOB.mob_spawners) + GLOB.mob_spawners[spawner] -= src + if(!length(GLOB.mob_spawners[spawner])) + GLOB.mob_spawners -= spawner + SSmobs.update_spawners() + GLOB.poi_list -= src diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index b506482a58488..5c1fecf4e754d 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -14,19 +14,15 @@ GLOBAL_LIST_INIT(department_radio_keys, list( RADIO_KEY_ENGINEERING = RADIO_CHANNEL_ENGINEERING, RADIO_KEY_SECURITY = RADIO_CHANNEL_SECURITY, RADIO_KEY_SUPPLY = RADIO_CHANNEL_SUPPLY, + RADIO_KEY_EXPLORATION = RADIO_CHANNEL_EXPLORATION, RADIO_KEY_SERVICE = RADIO_CHANNEL_SERVICE, // Faction RADIO_KEY_SYNDICATE = RADIO_CHANNEL_SYNDICATE, RADIO_KEY_CENTCOM = RADIO_CHANNEL_CENTCOM, - // Admin - MODE_KEY_ADMIN = MODE_ADMIN, - MODE_KEY_DEADMIN = MODE_DEADMIN, - // Misc RADIO_KEY_AI_PRIVATE = RADIO_CHANNEL_AI_PRIVATE, // AI Upload channel - MODE_KEY_VOCALCORDS = MODE_VOCALCORDS, // vocal cords, used by Voice of God //kinda localization -- rastaf0 @@ -45,18 +41,14 @@ GLOBAL_LIST_INIT(department_radio_keys, list( "û" = RADIO_CHANNEL_SECURITY, "ã" = RADIO_CHANNEL_SUPPLY, "ì" = RADIO_CHANNEL_SERVICE, + "ю" = RADIO_CHANNEL_EXPLORATION, // Faction "å" = RADIO_CHANNEL_SYNDICATE, "í" = RADIO_CHANNEL_CENTCOM, - // Admin - "ç" = MODE_ADMIN, - "â" = MODE_ADMIN, - // Misc - "ù" = RADIO_CHANNEL_AI_PRIVATE, - "÷" = MODE_VOCALCORDS + "ù" = RADIO_CHANNEL_AI_PRIVATE )) /mob/living/proc/Ellipsis(original_msg, chance = 50, keep_words) @@ -81,12 +73,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list( return new_msg -/mob/living/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) - var/static/list/crit_allowed_modes = list(MODE_WHISPER = TRUE, MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE) +/mob/living/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) + var/static/list/crit_allowed_modes = list(WHISPER_MODE = TRUE, MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE) var/static/list/unconscious_allowed_modes = list(MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE) - var/talk_key = get_key(message) - - var/static/list/one_character_prefix = list(MODE_HEADSET = TRUE, MODE_ROBOT = TRUE, MODE_WHISPER = TRUE, MODE_SING = TRUE) var/ic_blocked = FALSE if(client && !forced && CHAT_FILTER_CHECK(message)) @@ -103,62 +92,44 @@ GLOBAL_LIST_INIT(department_radio_keys, list( to_chat(src, "That message contained a word prohibited in IC chat! Consider reviewing the server rules.\n\"[message]\"") return - var/datum/saymode/saymode = SSradio.saymodes[talk_key] - var/message_mode = get_message_mode(message) + var/list/message_mods = list() var/original_message = message + message = get_message_mods(message, message_mods) + var/datum/saymode/saymode = SSradio.saymodes[message_mods[RADIO_KEY]] var/in_critical = InCritical() - if(one_character_prefix[message_mode]) - message = copytext_char(message, 2) - else if(message_mode || saymode) - message = copytext_char(message, 3) - message = trim_left(message) - - if(message_mode == MODE_ADMIN) - if(client) - client.cmd_admin_say(message) - return - - if(message_mode == MODE_DEADMIN) - if(client) - client.dsay(message) + if(!message) return if(stat == DEAD) say_dead(original_message) return - if(check_emote(original_message, forced) || !can_speak_basic(original_message, ignore_spam)) + if(check_emote(original_message, forced) || !can_speak_basic(original_message, ignore_spam, forced)) return - if(in_critical) - if(!(crit_allowed_modes[message_mode])) + if(in_critical) //There are cheaper ways to do this, but they're less flexible, and this isn't ran all that often + var/end = TRUE + for(var/index in message_mods) + if(crit_allowed_modes[index]) + end = FALSE + break + if(end) return else if(stat == UNCONSCIOUS) - if(!(unconscious_allowed_modes[message_mode])) + var/end = TRUE + for(var/index in message_mods) + if(unconscious_allowed_modes[index]) + end = FALSE + break + if(end) return - // language comma detection. - 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_language(message_language)) - language = message_language - message = copytext_char(message, 3) - - // Trim the space if they said ",0 I LOVE LANGUAGES" - message = trim_left(message) + language = message_mods[LANGUAGE_EXTENSION] if(!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 - // ignore the language argument however. - - if(saymode && !saymode.handle_message(src, message, language)) - return - if(!can_speak_vocal(message)) to_chat(src, "You find yourself unable to speak!") return @@ -168,9 +139,12 @@ GLOBAL_LIST_INIT(department_radio_keys, list( var/succumbed = FALSE var/fullcrit = InFullCritical() - if((InCritical() && !fullcrit) || message_mode == MODE_WHISPER) + if((in_critical && !fullcrit) || message_mods[WHISPER_MODE] == MODE_WHISPER) + if(saymode || message_mods[RADIO_EXTENSION]) //no radio while in crit + saymode = null + message_mods -= RADIO_EXTENSION message_range = 1 - message_mode = MODE_WHISPER + message_mods[WHISPER_MODE] = MODE_WHISPER src.log_talk(message, LOG_WHISPER) if(fullcrit) var/health_diff = round(-HEALTH_THRESHOLD_DEAD + health) @@ -179,7 +153,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( message = copytext_char(message, 1, health_diff) + "[message_len > health_diff ? "-.." : "..."]" message = Ellipsis(message, 10, 1) last_words = message - message_mode = MODE_WHISPER_CRIT + message_mods[WHISPER_MODE] = MODE_WHISPER_CRIT succumbed = TRUE else src.log_talk(message, LOG_SAY, forced_by=forced) @@ -197,18 +171,27 @@ GLOBAL_LIST_INIT(department_radio_keys, list( var/datum/language/L = GLOB.language_datum_instances[language] spans |= L.spans - if(message_mode == MODE_SING) + if(message_mods[MODE_SING]) var/randomnote = pick("\u2669", "\u266A", "\u266B") - spans |= SPAN_SINGING message = "[randomnote] [message] [randomnote]" + spans |= SPAN_SINGING - var/radio_return = radio(message, message_mode, spans, language) + //This is before anything that sends say a radio message, and after all important message type modifications, so you can scumb in alien chat or something + if(saymode && !saymode.handle_message(src, message, language)) + return + var/radio_message = message + if(message_mods[WHISPER_MODE]) + // radios don't pick up whispers very well + radio_message = stars(radio_message) + spans |= SPAN_ITALICS + var/radio_return = radio(radio_message, message_mods, spans, language) if(radio_return & ITALICS) spans |= SPAN_ITALICS if(radio_return & REDUCE_RANGE) message_range = 1 + message_mods[MODE_RADIO_MESSAGE] = MODE_RADIO_MESSAGE if(radio_return & NOPASS) - return 1 + return TRUE //No screams in space, unless you're next to someone. var/turf/T = get_turf(src) @@ -220,16 +203,16 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(pressure < ONE_ATMOSPHERE*0.4) //Thin air, let's italicise the message spans |= SPAN_ITALICS - send_speech(message, message_range, src, bubble_type, spans, language, message_mode) + send_speech(message, message_range, src, bubble_type, spans, language, message_mods) if(succumbed) - succumb(1) - to_chat(src, compose_message(src, language, message, , spans, message_mode)) + succumb(TRUE) + to_chat(src, compose_message(src, language, message, , spans, message_mods)) - return 1 + return TRUE -/mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) - . = ..() +/mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) + SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) if(!client) return var/deaf_message @@ -243,32 +226,27 @@ GLOBAL_LIST_INIT(department_radio_keys, list( deaf_type = 2 // Since you should be able to hear yourself without looking // Recompose message for AI hrefs, language incomprehension. - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) - message = hear_intercept(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) - - show_message(message, 2, deaf_message, deaf_type) - return message + message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods) -/mob/living/proc/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) + show_message(message, MSG_AUDIBLE, deaf_message, deaf_type) return message -/mob/living/send_speech(message, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language=null, message_mode) +/mob/living/send_speech(message, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language=null, list/message_mods = list()) var/static/list/eavesdropping_modes = list(MODE_WHISPER = TRUE, MODE_WHISPER_CRIT = TRUE) var/eavesdrop_range = 0 - if(eavesdropping_modes[message_mode]) + if(message_mods[WHISPER_MODE]) //If we're whispering eavesdrop_range = EAVESDROP_EXTRA_RANGE var/list/listening = get_hearers_in_view(message_range+eavesdrop_range, source) var/list/the_dead = list() - for(var/_M in GLOB.player_list) - var/mob/M = _M + for(var/mob/M as() in GLOB.player_list) if(!M) //yogs continue //yogs | null in player_list for whatever reason :shrug: if(M.stat != DEAD) //not dead, not important continue if(!M.client || !client) //client is so that ghosts don't have to listen to mice continue - if(get_dist(M, src) > 7 || M.z != z) //they're out of range of normal hearing - if(eavesdropping_modes[message_mode] && !(M.client.prefs.chat_toggles & CHAT_GHOSTWHISPER)) //they're whispering and we have hearing whispers at any range off + if(get_dist(M, src) > 7 || M.get_virtual_z_level() != get_virtual_z_level()) //they're out of range of normal hearing + if(eavesdrop_range && !(M.client.prefs.chat_toggles & CHAT_GHOSTWHISPER)) //they're whispering and we have hearing whispers at any range off continue if(!(M.client.prefs.chat_toggles & CHAT_GHOSTEARS)) //they're talking normally and we have hearing at any range off continue @@ -279,26 +257,38 @@ GLOBAL_LIST_INIT(department_radio_keys, list( var/eavesrendered if(eavesdrop_range) eavesdropping = stars(message) - eavesrendered = compose_message(src, message_language, eavesdropping, , spans, message_mode) + eavesrendered = compose_message(src, message_language, eavesdropping, , spans, message_mods) - var/rendered = compose_message(src, message_language, message, , spans, message_mode) - for(var/_AM in listening) - var/atom/movable/AM = _AM + var/list/show_overhead_message_to = list() + var/list/show_overhead_message_to_eavesdrop = list() + var/rendered = compose_message(src, message_language, message, , spans, message_mods) + for(var/atom/movable/AM as() in listening) if(eavesdrop_range && get_dist(source, AM) > message_range && !(the_dead[AM])) - AM.Hear(eavesrendered, src, message_language, eavesdropping, , spans, message_mode) + if(ismob(AM)) + var/mob/M = AM + if(M.should_show_chat_message(src, message_language, FALSE, is_heard = TRUE)) + show_overhead_message_to_eavesdrop += M + AM.Hear(eavesrendered, src, message_language, eavesdropping, , spans, message_mods) else - AM.Hear(rendered, src, message_language, message, , spans, message_mode) + if(ismob(AM)) + var/mob/M = AM + if(M.should_show_chat_message(src, message_language, FALSE, is_heard = TRUE)) + show_overhead_message_to += M + AM.Hear(rendered, src, message_language, message, , spans, message_mods) + if(length(show_overhead_message_to)) + create_chat_message(src, message_language, show_overhead_message_to, message, spans) + if(length(show_overhead_message_to_eavesdrop)) + create_chat_message(src, message_language, show_overhead_message_to_eavesdrop, eavesdropping, spans) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message) //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 INVOKE_ASYNC(GLOBAL_PROC, /.proc/animate_speechbubble, I, speech_bubble_recipients, 30) - INVOKE_ASYNC(GLOBAL_PROC, /.proc/animate_chat, src, message, message_language, message_mode, speech_bubble_recipients, 50) // see chatheader.dm /proc/animate_speechbubble(image/I, list/show_to, duration) var/matrix/M = matrix() @@ -319,43 +309,29 @@ GLOBAL_LIST_INIT(department_radio_keys, list( /mob/living/can_speak(message) //For use outside of Say() if(can_speak_basic(message) && can_speak_vocal(message)) - return 1 + return TRUE -/mob/living/proc/can_speak_basic(message, ignore_spam = FALSE) //Check BEFORE handling of xeno and ling channels +/mob/living/proc/can_speak_basic(message, ignore_spam = FALSE, forced = FALSE) //Check BEFORE handling of xeno and ling channels if(client) if(client.prefs.muted & MUTE_IC) to_chat(src, "You cannot speak in IC (muted).") - return 0 - if(!ignore_spam && client.handle_spam_prevention(message,MUTE_IC)) - return 0 + return FALSE + if(!ignore_spam && !forced && client.handle_spam_prevention(message,MUTE_IC)) + return FALSE - return 1 + return TRUE /mob/living/proc/can_speak_vocal(message) //Check AFTER handling of xeno and ling channels if(HAS_TRAIT(src, TRAIT_MUTE)) - return 0 + return FALSE if(is_muzzled()) - return 0 + return FALSE if(!IsVocal()) - return 0 + return FALSE - return 1 - -/mob/living/proc/get_key(message) - var/key = message[1] - if(key in GLOB.department_radio_prefixes) - return lowertext(message[1 + length(key)]) - -/mob/living/proc/get_message_language(message) - if(message[1] == ",") - var/key = message[1 + length(message[1])] - for(var/ld in GLOB.all_languages) - var/datum/language/LD = ld - if(initial(LD.key) == key) - return LD - return null + return TRUE /mob/living/proc/treat_message(message) @@ -376,7 +352,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(clockslurring) message = clockslur(message) - + // check for and apply punctuation var/end = copytext(message, length(message)) if(!(end in list("!", ".", "?", ":", "\"", "-"))) @@ -386,51 +362,46 @@ GLOBAL_LIST_INIT(department_radio_keys, list( return message -/mob/living/proc/radio(message, message_mode, list/spans, language) +/mob/living/proc/radio(message, list/message_mods = list(), list/spans, language) var/obj/item/implant/radio/imp = locate() in src if(imp && imp.radio.on) - if(message_mode == MODE_HEADSET) - imp.radio.talk_into(src, message, , spans, language) + if(message_mods[MODE_HEADSET]) + imp.radio.talk_into(src, message, , spans, language, message_mods) return ITALICS | REDUCE_RANGE - if(message_mode == MODE_DEPARTMENT || (message_mode in imp.radio.channels)) - imp.radio.talk_into(src, message, message_mode, spans, language) + if(message_mods[RADIO_EXTENSION] == MODE_DEPARTMENT || (message_mods[RADIO_EXTENSION] in imp.radio.channels)) + imp.radio.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) return ITALICS | REDUCE_RANGE - switch(message_mode) - if(MODE_WHISPER) - return ITALICS + switch(message_mods[RADIO_EXTENSION]) if(MODE_R_HAND) for(var/obj/item/r_hand in get_held_items_for_side("r", all = TRUE)) if (r_hand) - return r_hand.talk_into(src, message, , spans, language) + return r_hand.talk_into(src, message, , spans, language, message_mods) return ITALICS | REDUCE_RANGE if(MODE_L_HAND) for(var/obj/item/l_hand in get_held_items_for_side("l", all = TRUE)) if (l_hand) - return l_hand.talk_into(src, message, , spans, language) + return l_hand.talk_into(src, message, , spans, language, message_mods) return ITALICS | REDUCE_RANGE if(MODE_INTERCOM) - for (var/obj/item/radio/intercom/I in view(MODE_RANGE_INTERCOM, null)) - I.talk_into(src, message, , spans, language) + for (var/obj/item/radio/intercom/I in view(MODE_RANGE_INTERCOM, src)) + I.talk_into(src, message, , spans, language, message_mods) return ITALICS | REDUCE_RANGE - if(MODE_BINARY) - return ITALICS | REDUCE_RANGE //Does not return 0 since this is only reached by humans, not borgs or AIs. - return 0 -/mob/living/say_mod(input, message_mode) - if(message_mode == MODE_WHISPER) +/mob/living/say_mod(input, list/message_mods = list()) + if(message_mods[WHISPER_MODE] == MODE_WHISPER) . = verb_whisper - else if(message_mode == MODE_WHISPER_CRIT) + else if(message_mods[WHISPER_MODE] == MODE_WHISPER_CRIT) . = "[verb_whisper] in [p_their()] last breath" + else if(message_mods[MODE_SING]) + . = verb_sing else if(stuttering) . = "stammers" else if(derpspeech) . = "gibbers" - else if(message_mode == MODE_SING) - . = verb_sing else . = ..() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 18f7e91bc6c89..bf0e114672700 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -76,7 +76,7 @@ var/nuking = FALSE var/obj/machinery/doomsday_device/doomsday_device - var/mob/camera/aiEye/eyeobj + var/mob/camera/ai_eye/eyeobj var/sprint = 10 var/cooldown = 0 var/acceleration = 1 @@ -88,7 +88,7 @@ var/chnotify = 0 var/multicam_on = FALSE - var/obj/screen/movable/pic_in_pic/ai/master_multicam + var/atom/movable/screen/movable/pic_in_pic/ai/master_multicam var/list/multicam_screens = list() var/list/all_eyes = list() var/max_multicams = 6 @@ -132,7 +132,8 @@ if(client) apply_pref_name("ai",client) - set_core_display_icon() + INVOKE_ASYNC(src, .proc/set_core_display_icon) + holo_icon = getHologramIcon(icon('icons/mob/ai.dmi',"default")) @@ -140,7 +141,7 @@ spark_system.set_up(5, 0, src) spark_system.attach(src) - verbs += /mob/living/silicon/ai/proc/show_laws_verb + add_verb(/mob/living/silicon/ai/proc/show_laws_verb) aiPDA = new/obj/item/pda/ai(src) aiPDA.owner = real_name @@ -154,10 +155,10 @@ deploy_action.Grant(src) if(isturf(loc)) - verbs.Add(/mob/living/silicon/ai/proc/ai_network_change, \ + add_verb(list(/mob/living/silicon/ai/proc/ai_network_change, \ /mob/living/silicon/ai/proc/ai_statuschange, /mob/living/silicon/ai/proc/ai_hologram_change, \ /mob/living/silicon/ai/proc/botcall, /mob/living/silicon/ai/proc/control_integrated_radio, \ - /mob/living/silicon/ai/proc/set_automatic_say_channel) + /mob/living/silicon/ai/proc/set_automatic_say_channel)) GLOB.ai_list += src GLOB.shuttle_caller_list += src @@ -212,11 +213,17 @@ set name = "Set AI Core Display" if(incapacitated()) return + icon = initial(icon) + icon_state = "ai" + cut_overlays() var/list/iconstates = GLOB.ai_core_display_screens for(var/option in iconstates) if(option == "Random") iconstates[option] = image(icon = src.icon, icon_state = "ai-random") continue + if(option == "Portrait") + iconstates[option] = image(icon = src.icon, icon_state = "ai-portrait") + continue iconstates[option] = image(icon = src.icon, icon_state = resolve_ai_icon(option)) view_core() @@ -228,28 +235,32 @@ display_icon_override = ai_core_icon set_core_display_icon(ai_core_icon) -/mob/living/silicon/ai/Stat() - ..() - if(statpanel("Status")) - if(!stat) - stat(null, text("System integrity: [(health+100)/2]%")) - if(isturf(loc)) //only show if we're "in" a core - stat(null, text("Backup Power: [battery/2]%")) - stat(null, text("Connected cyborgs: [connected_robots.len]")) - for(var/mob/living/silicon/robot/R in connected_robots) - var/robot_status = "Nominal" - if(R.shell) - robot_status = "AI SHELL" - else if(R.stat || !R.client) - robot_status = "OFFLINE" - else if(!R.cell || R.cell.charge <= 0) - robot_status = "DEPOWERED" - //Name, Health, Battery, Module, Area, and Status! Everything an AI wants to know about its borgies! - stat(null, text("[R.name] | S.Integrity: [R.health]% | Cell: [R.cell ? "[R.cell.charge]/[R.cell.maxcharge]" : "Empty"] | \ - Module: [R.designation] | Loc: [get_area_name(R, TRUE)] | Status: [robot_status]")) - stat(null, text("AI shell beacons detected: [LAZYLEN(GLOB.available_ai_shells)]")) //Count of total AI shells - else - stat(null, text("Systems nonfunctional")) +/mob/living/silicon/ai/get_stat_tab_status() + var/list/tab_data = ..() + if(!stat) + tab_data["System integrity"] = GENERATE_STAT_TEXT("[(health+100)/2]%") + if(isturf(loc)) //only show if we're "in" a core + tab_data["Backup Power"] = GENERATE_STAT_TEXT("[battery/2]%") + tab_data["Connected cyborgs"] = GENERATE_STAT_TEXT("[connected_robots.len]") + var/index = 0 + for(var/mob/living/silicon/robot/R in connected_robots) + var/robot_status = "Nominal" + if(R.shell) + robot_status = "AI SHELL" + else if(R.stat || !R.client) + robot_status = "OFFLINE" + else if(!R.cell || R.cell.charge <= 0) + robot_status = "DEPOWERED" + //Name, Health, Battery, Module, Area, and Status! Everything an AI wants to know about its borgies! + index++ + tab_data["[R.name] (Connection [index])"] = list( + text="S.Integrity: [R.health]% | Cell: [R.cell ? "[R.cell.charge]/[R.cell.maxcharge]" : "Empty"] | \ + Module: [R.designation] | Loc: [get_area_name(R, TRUE)] | Status: [robot_status]", + type=STAT_TEXT) + tab_data["AI shell beacons detected"] = GENERATE_STAT_TEXT("[LAZYLEN(GLOB.available_ai_shells)]") //Count of total AI shells + else + tab_data["Systems"] = GENERATE_STAT_TEXT("nonfunctional") + return tab_data /mob/living/silicon/ai/proc/ai_alerts() var/dat = "Current Station Alerts\n" @@ -313,7 +324,10 @@ if(!target) return - if ((ai.z != target.z) && !is_station_level(ai.z)) + if ((ai.get_virtual_z_level() != target.get_virtual_z_level()) && !is_station_level(ai.z)) + return FALSE + + if(A.is_jammed()) return FALSE if (istype(loc, /obj/item/aicard)) @@ -331,13 +345,16 @@ set category = "OOC" set desc = "Wipe your core. This is functionally equivalent to cryo, freeing up your job slot." + if(stat) + return + // Guard against misclicks, this isn't the sort of thing we want happening accidentally if(alert("WARNING: This will immediately wipe your core and ghost you, removing your character from the round permanently (similar to cryo). Are you entirely sure you want to do this?", "Wipe Core", "No", "No", "Yes") != "Yes") return // We warned you. - var/obj/structure/AIcore/latejoin_inactive/inactivecore = New(loc) + var/obj/structure/AIcore/latejoin_inactive/inactivecore = new(loc) transfer_fingerprints_to(inactivecore) if(GLOB.announcement_systems.len) @@ -352,9 +369,9 @@ if(!get_ghost(1)) if(world.time < 30 * 600)//before the 30 minute mark - ghostize(0) // Players despawned too early may not re-enter the game + ghostize(FALSE,SENTIENCE_ERASE) // Players despawned too early may not re-enter the game else - ghostize(1) + ghostize(TRUE,SENTIENCE_ERASE) QDEL_NULL(src) @@ -363,7 +380,7 @@ set name = "Toggle Floor Bolts" if(!isturf(loc)) // if their location isn't a turf return // stop - if(stat == DEAD) + if(stat) return if(incapacitated()) if(battery < 50) @@ -433,9 +450,11 @@ trackeable += track.humans + track.others var/list/target = list() for(var/I in trackeable) - var/mob/M = trackeable[I] - if(M.name == string) - target += M + var/datum/weakref/to_resolve = trackeable[I] + var/mob/to_track = to_resolve.resolve() + if(!to_track || to_track.name != string) + continue + target += to_track if(name == string) target += src if(target.len) @@ -514,13 +533,13 @@ to_chat(src, "Wireless control is disabled.") return var/turf/ai_current_turf = get_turf(src) - var/ai_Zlevel = ai_current_turf.z + var/ai_Zlevel = ai_current_turf.get_virtual_z_level() var/d d += "Query network status
" d += "" for (Bot in GLOB.alive_mob_list) - if(Bot.z == ai_Zlevel && !Bot.remote_disabled) //Only non-emagged bots on the same Z-level are detected! + if(Bot.get_virtual_z_level() == ai_Zlevel && !Bot.remote_disabled) //Only non-emagged bots on the same Z-level are detected! var/bot_mode = Bot.get_mode() d += "" //If the bot is on, it will display the bot's current mode status. If the bot is not mode, it will just report "Idle". "Inactive if it is not on at all. @@ -558,44 +577,61 @@ Bot.call_bot(src, waypoint) call_bot_cooldown = 0 - -/mob/living/silicon/ai/triggerAlarm(class, area/A, O, obj/alarmsource) - if(alarmsource.z != z) +/mob/living/silicon/ai/triggerAlarm(class, area/home, cameras, obj/source) + if(source.get_virtual_z_level() != get_virtual_z_level()) return - var/list/L = alarms[class] - for (var/I in L) - if (I == A.name) - var/list/alarm = L[I] + var/list/our_sort = alarms[class] + for(var/areaname in our_sort) + if (areaname == home.name) + var/list/alarm = our_sort[areaname] var/list/sources = alarm[3] - if (!(alarmsource in sources)) - sources += alarmsource - return 1 - var/obj/machinery/camera/C = null - var/list/CL = null - if (O && istype(O, /list)) - CL = O - if (CL.len == 1) - C = CL[1] - else if (O && istype(O, /obj/machinery/camera)) - C = O - L[A.name] = list(A, (C) ? C : O, list(alarmsource)) - if (O) - if (C && C.can_use()) - queueAlarm("--- [class] alarm detected in [A.name]! ([C.c_tag])", class) - else if (CL?.len) + if (!(source in sources)) + sources += source + return TRUE + + var/obj/machinery/camera/cam = null + var/list/our_cams = null + if(cameras && islist(cameras)) + our_cams = cameras + if (our_cams.len == 1) + cam = our_cams[1] + else if(cameras && istype(cameras, /obj/machinery/camera)) + cam = cameras + our_sort[home.name] = list(home, (cam ? cam : cameras), list(source)) + + if (cameras) + if (cam?.can_use()) + queueAlarm("--- [class] alarm detected in [home.name]! ([cam.c_tag])", class) + else if (our_cams?.len) var/foo = 0 var/dat2 = "" - for (var/obj/machinery/camera/I in CL) - dat2 += text("[][]", (!foo) ? "" : " | ", I.c_tag) //I'm not fixing this shit... + for (var/obj/machinery/camera/I in our_cams) + dat2 += text("[][]", (!foo) ? "" : " | ", I.c_tag) //I'm not fixing this shit... foo = 1 - queueAlarm(text ("--- [] alarm detected in []! ([])", class, A.name, dat2), class) + queueAlarm(text ("--- [] alarm detected in []! ([])", class, home.name, dat2), class) else - queueAlarm(text("--- [] alarm detected in []! (No Camera)", class, A.name), class) + queueAlarm(text("--- [] alarm detected in []! (No Camera)", class, home.name), class) else - queueAlarm(text("--- [] alarm detected in []! (No Camera)", class, A.name), class) - if (viewalerts) ai_alerts() + queueAlarm(text("--- [] alarm detected in []! (No Camera)", class, home.name), class) + if (viewalerts) + ai_alerts() return 1 +/mob/living/silicon/ai/freeCamera(area/home, obj/machinery/camera/cam) + for(var/class in alarms) + var/our_area = alarms[class][home.name] + if(!our_area) + continue + var/cams = our_area[2] //Get the cameras + if(!cams) + continue + if(islist(cams)) + cams -= cam + if(length(cams) == 1) + our_area[2] = cams[1] + else + our_area[2] = null + /mob/living/silicon/ai/cancelAlarm(class, area/A, obj/origin) var/list/L = alarms[class] var/cleared = 0 @@ -881,12 +917,12 @@ var/list/viewscale = getviewsize(client.view) 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) +/mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) + var/treated_message = lang_treat(speaker, message_language, raw_message, spans, message_mods) 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 @@ -895,7 +931,7 @@ else jobpart = "Unknown" - var/rendered = "[start][hrefpart][namepart] ([jobpart])[raw_message]" + var/rendered = "[start][hrefpart][namepart] ([jobpart]) [treated_message]" show_message(rendered, 2) @@ -919,7 +955,7 @@ to_chat(src, "In the top right corner of the screen you will find the Malfunctions tab, where you can purchase various abilities, from upgraded surveillance to station ending doomsday devices.") to_chat(src, "You are also capable of hacking APCs, which grants you more points to spend on your Malfunction powers. The drawback is that a hacked APC will give you away if spotted by the crew. Hacking an APC takes 60 seconds.") view_core() //A BYOND bug requires you to be viewing your core before your verbs update - verbs += /mob/living/silicon/ai/proc/choose_modules + add_verb(/mob/living/silicon/ai/proc/choose_modules) malf_picker = new /datum/module_picker @@ -1005,7 +1041,11 @@ if(!target || !(target in possible)) //If the AI is looking for a new shell, or its pre-selected shell is no longer valid target = input(src, "Which body to control?") as null|anything in sortNames(possible) - if (!target || target.stat == DEAD || target.deployed || !(!target.connected_ai ||(target.connected_ai == src)) || (target.ratvar && !is_servant_of_ratvar(src))) + if (!target || target.stat || target.deployed || !(!target.connected_ai ||(target.connected_ai == src)) || (target.ratvar && !is_servant_of_ratvar(src))) + return + + if(target.is_jammed()) + to_chat(src, "Unable to establish communication link with target.") return else if(mind) @@ -1055,11 +1095,11 @@ return /mob/living/silicon/ai/spawned/Initialize(mapload, datum/ai_laws/L, mob/target_ai) - . = ..() if(!target_ai) target_ai = src //cheat! just give... ourselves as the spawned AI, because that's technically correct + . = ..() //This needs to be lower so we have a chance to actually update the assigned target_ai. -/mob/living/silicon/ai/proc/camera_visibility(mob/camera/aiEye/moved_eye) +/mob/living/silicon/ai/proc/camera_visibility(mob/camera/ai_eye/moved_eye) GLOB.cameranet.visibility(moved_eye, client, all_eyes, USE_STATIC_OPAQUE) /mob/living/silicon/ai/forceMove(atom/destination) diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index eff8c3f0a5fc3..c1c0a150d03e2 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -51,5 +51,5 @@ . = ..(Proj) updatehealth() -/mob/living/silicon/ai/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0) +/mob/living/silicon/ai/flash_act(intensity, override_blindness_check, affect_silicon, visual, type) return // no eyes, no flashing diff --git a/code/modules/mob/living/silicon/ai/ai_portrait_picker.dm b/code/modules/mob/living/silicon/ai/ai_portrait_picker.dm new file mode 100644 index 0000000000000..45ddb4250395d --- /dev/null +++ b/code/modules/mob/living/silicon/ai/ai_portrait_picker.dm @@ -0,0 +1,74 @@ + +/** + * ## Portrait picker!! + * + * It's a tgui window that lets you look through all the portraits, and choose one as your AI. + * very similar to centcom_podlauncher in terms of how this is coded, so i kept a lot of comments from it + */ +/datum/portrait_picker + var/client/holder //client of whoever is using this datum + +/datum/portrait_picker/New(user)//user can either be a client or a mob due to byondcode(tm) + if (istype(user, /client)) + var/client/user_client = user + holder = user_client //if its a client, assign it to holder + else + var/mob/user_mob = user + holder = user_mob.client //if its a mob, assign the mob's client to holder + +/datum/portrait_picker/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "PortraitPicker") + ui.open() + +/datum/portrait_picker/ui_close() + qdel(src) + +/datum/portrait_picker/ui_state(mob/user) + return GLOB.conscious_state + +/datum/portrait_picker/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/simple/portraits/library), + get_asset_datum(/datum/asset/simple/portraits/library_secure), + get_asset_datum(/datum/asset/simple/portraits/library_private) + ) + +/datum/portrait_picker/ui_data(mob/user) + var/list/data = list() + data["library"] = SSpersistence.paintings["library"] ? SSpersistence.paintings["library"] : 0 + data["library_secure"] = SSpersistence.paintings["library_secure"] ? SSpersistence.paintings["library_secure"] : 0 + data["library_private"] = SSpersistence.paintings["library_private"] ? SSpersistence.paintings["library_private"] : 0 //i'm gonna regret this, won't i? + return data + +/datum/portrait_picker/ui_act(action, params) + . = ..() + if(.) + return + switch(action) + if("select") + var/list/tab2key = list(TAB_LIBRARY = "library", TAB_SECURE = "library_secure", TAB_PRIVATE = "library_private") + var/folder = tab2key[params["tab"]] + var/list/current_list = SSpersistence.paintings[folder] + var/list/chosen_portrait = current_list[params["selected"]] + var/png = "data/paintings/[folder]/[chosen_portrait["md5"]].png" + var/icon/portrait_icon = new(png) + var/mob/living/ai = holder.mob + var/w = portrait_icon.Width() + var/h = portrait_icon.Height() + var/mutable_appearance/MA = mutable_appearance(portrait_icon) + if(w == 23 || h == 23) + to_chat(ai, "Small note: 23x23 Portraits are accepted, but they do not fit perfectly inside the display frame.") + MA.pixel_x = 5 + MA.pixel_y = 5 + else if(w == 24 || h == 24) + to_chat(ai, "Portrait Accepted. Enjoy!") + MA.pixel_x = 4 + MA.pixel_y = 4 + else + to_chat(ai, "Sorry, only 23x23 and 24x24 Portraits are accepted.") + return + ai.cut_overlays() //so people can't keep repeatedly select portraits to add stacking overlays + ai.icon_state = "ai-portrait-active"//background + ai.add_overlay(MA) diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 4bca64f6a3708..b37d08d53a266 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -4,6 +4,7 @@ . = ..() + cut_overlays() //remove portraits var/old_icon = icon_state if("[icon_state]_dead" in icon_states(icon)) icon_state = "[icon_state]_dead" @@ -28,9 +29,9 @@ ShutOffDoomsdayDevice() if(explosive) - spawn(10) - explosion(src.loc, 3, 6, 12, 15) - + var/T = get_turf(src) + addtimer(CALLBACK(GLOBAL_PROC, .proc/explosion, T, 3, 6, 12, 15), 10) + if(src.key) for(var/each in GLOB.ai_status_displays) //change status var/obj/machinery/status_display/ai/O = each diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index a3ffd460dd676..0cd8a537bd34a 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -15,9 +15,6 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) var/list/chunks = list() var/ready = 0 - // The object used for the clickable stat() button. - var/obj/effect/statclick/statclick - // The objects used in vis_contents of obscured turfs var/list/vis_contents_objects var/obj/effect/overlay/camera_static/vis_contents_opaque @@ -45,15 +42,15 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) // Returns the chunk in the x, y, z. // If there is no chunk, it creates a new chunk and returns that. -/datum/cameranet/proc/getCameraChunk(x, y, z) +/datum/cameranet/proc/getCameraChunk(x, y, z, a) x &= ~(CHUNK_SIZE - 1) y &= ~(CHUNK_SIZE - 1) var/key = "[x],[y],[z]" . = chunks[key] - if(!.) + if(!. && !(istype(a, /area/ai_multicam_room))) chunks[key] = . = new /datum/camerachunk(x, y, z) -// Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set. +// Updates what the ai_eye can see. It is recommended you use this when the ai_eye moves or it's location is set. /datum/cameranet/proc/visibility(list/moved_eyes, client/C, list/other_eyes, use_static = USE_STATIC_OPAQUE) if(!islist(moved_eyes)) @@ -71,7 +68,7 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) C.images += obscured for(var/V in moved_eyes) - var/mob/camera/aiEye/eye = V + var/mob/camera/ai_eye/eye = V var/list/visibleChunks = list() if(eye.loc) // 0xf = 15 @@ -172,7 +169,7 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) /datum/cameranet/proc/checkTurfVis(turf/position) - var/datum/camerachunk/chunk = chunkGenerated(position.x, position.y, position.z) + var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z, get_area(position)) if(chunk) if(chunk.changed) chunk.hasChanged(1) // Update now, no matter if it's visible or not. @@ -181,10 +178,17 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) return 0 /datum/cameranet/proc/stat_entry() - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - - stat(name, statclick.update("Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]")) + var/list/tab_data = list() + tab_data["[name]"] = list( + text="Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]", + action = "statClickDebug", + params=list( + "targetRef" = REF(src), + "class"="datum", + ), + type=STAT_BUTTON, + ) + return tab_data /obj/effect/overlay/camera_static name = "static" diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index 4591720b79863..794a6b827035d 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -18,7 +18,7 @@ // Add an AI eye to the chunk, then update if changed. -/datum/camerachunk/proc/add(mob/camera/aiEye/eye) +/datum/camerachunk/proc/add(mob/camera/ai_eye/eye) eye.visibleCameraChunks += src seenby += eye if(changed) @@ -26,7 +26,7 @@ // Remove an AI eye from the chunk, then update if changed. -/datum/camerachunk/proc/remove(mob/camera/aiEye/eye, remove_static_with_last_chunk = TRUE) +/datum/camerachunk/proc/remove(mob/camera/ai_eye/eye, remove_static_with_last_chunk = TRUE) eye.visibleCameraChunks -= src seenby -= eye if(remove_static_with_last_chunk && !eye.visibleCameraChunks.len) diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index f123b9a69e622..1b629300e53b0 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -3,7 +3,7 @@ // An invisible (no icon) mob that the AI controls to look around the station with. // It streams chunks as it moves around, which will show it what the AI can and cannot see. -/mob/camera/aiEye +/mob/camera/ai_eye name = "Inactive AI Eye" icon_state = "ai_camera" @@ -18,13 +18,13 @@ var/ai_detector_visible = TRUE var/ai_detector_color = COLOR_RED -/mob/camera/aiEye/Initialize() +/mob/camera/ai_eye/Initialize() . = ..() - GLOB.aiEyes += src + GLOB.ai_eyes += src update_ai_detect_hud() setLoc(loc, TRUE) -/mob/camera/aiEye/proc/update_ai_detect_hud() +/mob/camera/ai_eye/proc/update_ai_detect_hud() var/datum/atom_hud/ai_detector/hud = GLOB.huds[DATA_HUD_AI_DETECT] var/list/old_images = hud_list[AI_DETECT_HUD] if(!ai_detector_visible) @@ -56,7 +56,7 @@ hud_list[AI_DETECT_HUD] = new_images hud.add_to_hud(src) -/mob/camera/aiEye/proc/get_visible_turfs() +/mob/camera/ai_eye/proc/get_visible_turfs() if(!isturf(loc)) return list() var/client/C = GetViewerClient() @@ -65,10 +65,10 @@ var/turf/upperright = locate(min(world.maxx, lowerleft.x + (view[1] - 1)), min(world.maxy, lowerleft.y + (view[2] - 1)), lowerleft.z) return block(lowerleft, upperright) -// Use this when setting the aiEye's location. +// Use this when setting the ai_eye's location. // It will also stream the chunk that the new loc is in. -/mob/camera/aiEye/proc/setLoc(T, force_update = FALSE) +/mob/camera/ai_eye/proc/setLoc(T, force_update = FALSE) if(ai) if(!isturf(ai.loc)) return @@ -95,7 +95,7 @@ ai.master_multicam.refresh_view() //it uses setLoc not forceMove, talks to the sillycone and not the camera mob -/mob/camera/aiEye/zMove(dir, feedback = FALSE) +/mob/camera/ai_eye/zMove(dir, feedback = FALSE) if(dir != UP && dir != DOWN) return FALSE var/turf/target = get_step_multiz(src, dir) @@ -110,25 +110,25 @@ setLoc(target, TRUE) return TRUE -/mob/camera/aiEye/canZMove(direction, turf/target) //cameras do not respect these FLOORS you speak so much of +/mob/camera/ai_eye/canZMove(direction, turf/target) //cameras do not respect these FLOORS you speak so much of return TRUE -/mob/camera/aiEye/Move() +/mob/camera/ai_eye/Move() return 0 -/mob/camera/aiEye/proc/GetViewerClient() +/mob/camera/ai_eye/proc/GetViewerClient() if(ai) return ai.client return null -/mob/camera/aiEye/Destroy() +/mob/camera/ai_eye/Destroy() if(ai) ai.all_eyes -= src ai = null for(var/V in visibleCameraChunks) var/datum/camerachunk/c = V c.remove(src) - GLOB.aiEyes -= src + GLOB.ai_eyes -= src if(ai_detector_visible) var/datum/atom_hud/ai_detector/hud = GLOB.huds[DATA_HUD_AI_DETECT] hud.remove_from_hud(src) @@ -139,12 +139,12 @@ /atom/proc/move_camera_by_click() if(isAI(usr)) var/mob/living/silicon/ai/AI = usr - if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.z == z)) + if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.get_virtual_z_level() == get_virtual_z_level())) AI.cameraFollow = null if (isturf(loc) || isturf(src)) AI.eyeobj.setLoc(src) -// This will move the AIEye. It will also cause lights near the eye to light up, if toggled. +// This will move the ai_eye. It will also cause lights near the eye to light up, if toggled. // This is handled in the proc below this one. /client/proc/AIMove(n, direct, mob/living/silicon/ai/user) @@ -188,7 +188,7 @@ /mob/living/silicon/ai/proc/create_eye() if(eyeobj) return - eyeobj = new /mob/camera/aiEye() + eyeobj = new /mob/camera/ai_eye() all_eyes += eyeobj eyeobj.ai = src eyeobj.setLoc(loc) @@ -211,10 +211,10 @@ acceleration = !acceleration to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].") -/mob/camera/aiEye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) +/mob/camera/ai_eye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) . = ..() if(relay_speech && speaker && ai && !radio_freq && speaker != ai && near_camera(speaker)) - ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) + ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mods) /obj/effect/overlay/ai_detect_hud name = "" diff --git a/code/modules/mob/living/silicon/ai/freelook/read_me.dm b/code/modules/mob/living/silicon/ai/freelook/read_me.dm index 5f8776f7e476d..f2fed0b522fa1 100644 --- a/code/modules/mob/living/silicon/ai/freelook/read_me.dm +++ b/code/modules/mob/living/silicon/ai/freelook/read_me.dm @@ -45,7 +45,7 @@ cameranet.dm = Everything about the cameranet datum. chunk.dm = Everything about the chunk datum. - eye.dm = Everything about the AI and the AIEye. + eye.dm = Everything about the AI and the ai_eye. updating.dm = Everything about triggers that will update chunks. -*/ \ No newline at end of file +*/ diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 2e6561dcf0de5..b01cd8dbbe150 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -9,7 +9,7 @@ else //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(has_gravity()) handle_status_effects() @@ -75,7 +75,7 @@ death() return else if(stat == UNCONSCIOUS) - stat = CONSCIOUS + set_stat(CONSCIOUS) adjust_blindness(-1) diag_hud_set_status() diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm index e137b6ab44a4e..bdff796f39e83 100644 --- a/code/modules/mob/living/silicon/ai/multicam.dm +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -1,34 +1,34 @@ //Picture in picture -/obj/screen/movable/pic_in_pic/ai +/atom/movable/screen/movable/pic_in_pic/ai var/mob/living/silicon/ai/ai var/mutable_appearance/highlighted_background var/highlighted = FALSE - var/mob/camera/aiEye/pic_in_pic/aiEye + var/mob/camera/ai_eye/pic_in_pic/ai_eye -/obj/screen/movable/pic_in_pic/ai/Initialize() +/atom/movable/screen/movable/pic_in_pic/ai/Initialize() . = ..() - aiEye = new /mob/camera/aiEye/pic_in_pic() - aiEye.screen = src + ai_eye = new /mob/camera/ai_eye/pic_in_pic() + ai_eye.screen = src -/obj/screen/movable/pic_in_pic/ai/Destroy() +/atom/movable/screen/movable/pic_in_pic/ai/Destroy() set_ai(null) - QDEL_NULL(aiEye) + QDEL_NULL(ai_eye) return ..() -/obj/screen/movable/pic_in_pic/ai/Click() +/atom/movable/screen/movable/pic_in_pic/ai/Click() ..() if(ai) ai.select_main_multicam_window(src) -/obj/screen/movable/pic_in_pic/ai/make_backgrounds() +/atom/movable/screen/movable/pic_in_pic/ai/make_backgrounds() ..() highlighted_background = new /mutable_appearance() highlighted_background.icon = 'icons/misc/pic_in_pic.dmi' highlighted_background.icon_state = "background_highlight" highlighted_background.layer = SPACE_LAYER -/obj/screen/movable/pic_in_pic/ai/add_background() +/atom/movable/screen/movable/pic_in_pic/ai/add_background() if((width > 0) && (height > 0)) var/matrix/M = matrix() M.Scale(width + 0.5, height + 0.5) @@ -37,38 +37,38 @@ standard_background.transform = M add_overlay(highlighted ? highlighted_background : standard_background) -/obj/screen/movable/pic_in_pic/ai/set_view_size(width, height, do_refresh = TRUE) - aiEye.static_visibility_range = (round(max(width, height) / 2) + 1) +/atom/movable/screen/movable/pic_in_pic/ai/set_view_size(width, height, do_refresh = TRUE) + ai_eye.static_visibility_range = (round(max(width, height) / 2) + 1) if(ai) - ai.camera_visibility(aiEye) + ai.camera_visibility(ai_eye) ..() -/obj/screen/movable/pic_in_pic/ai/set_view_center(atom/target, do_refresh = TRUE) +/atom/movable/screen/movable/pic_in_pic/ai/set_view_center(atom/target, do_refresh = TRUE) ..() - aiEye.setLoc(get_turf(target)) + ai_eye.setLoc(get_turf(target)) -/obj/screen/movable/pic_in_pic/ai/refresh_view() +/atom/movable/screen/movable/pic_in_pic/ai/refresh_view() ..() - aiEye.setLoc(get_turf(center)) + ai_eye.setLoc(get_turf(center)) -/obj/screen/movable/pic_in_pic/ai/proc/highlight() +/atom/movable/screen/movable/pic_in_pic/ai/proc/highlight() if(highlighted) return highlighted = TRUE cut_overlay(standard_background) add_overlay(highlighted_background) -/obj/screen/movable/pic_in_pic/ai/proc/unhighlight() +/atom/movable/screen/movable/pic_in_pic/ai/proc/unhighlight() if(!highlighted) return highlighted = FALSE cut_overlay(highlighted_background) add_overlay(standard_background) -/obj/screen/movable/pic_in_pic/ai/proc/set_ai(mob/living/silicon/ai/new_ai) +/atom/movable/screen/movable/pic_in_pic/ai/proc/set_ai(mob/living/silicon/ai/new_ai) if(ai) ai.multicam_screens -= src - ai.all_eyes -= aiEye + ai.all_eyes -= ai_eye if(ai.master_multicam == src) ai.master_multicam = null if(ai.multicam_on) @@ -76,7 +76,7 @@ ai = new_ai if(new_ai) new_ai.multicam_screens += src - ai.all_eyes += aiEye + ai.all_eyes += ai_eye if(new_ai.multicam_on) show_to(new_ai.client) @@ -92,12 +92,9 @@ name = "ai_multicam_room" icon_state = "ai_camera_room" dynamic_lighting = DYNAMIC_LIGHTING_DISABLED - valid_territory = FALSE - ambient_effects = list() - blob_allowed = FALSE - noteleport = TRUE - hidden = TRUE - safe = TRUE + ambientsounds = list() + area_flags = HIDDEN_AREA | UNIQUE_AREA + teleport_restriction = TELEPORT_ALLOW_NONE GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) @@ -118,22 +115,22 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) //Dummy camera eyes -/mob/camera/aiEye/pic_in_pic +/mob/camera/ai_eye/pic_in_pic name = "Secondary AI Eye" invisibility = INVISIBILITY_OBSERVER mouse_opacity = MOUSE_OPACITY_ICON icon_state = "ai_pip_camera" - var/obj/screen/movable/pic_in_pic/ai/screen + var/atom/movable/screen/movable/pic_in_pic/ai/screen var/list/cameras_telegraphed = list() var/telegraph_cameras = TRUE var/telegraph_range = 7 ai_detector_color = COLOR_ORANGE -/mob/camera/aiEye/pic_in_pic/GetViewerClient() +/mob/camera/ai_eye/pic_in_pic/GetViewerClient() if(screen?.ai) return screen.ai.client -/mob/camera/aiEye/pic_in_pic/setLoc(turf/T) +/mob/camera/ai_eye/pic_in_pic/setLoc(turf/T) if (T) forceMove(T) else @@ -145,10 +142,10 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) update_camera_telegraphing() update_ai_detect_hud() -/mob/camera/aiEye/pic_in_pic/get_visible_turfs() +/mob/camera/ai_eye/pic_in_pic/get_visible_turfs() return screen ? screen.get_visible_turfs() : list() -/mob/camera/aiEye/pic_in_pic/proc/update_camera_telegraphing() +/mob/camera/ai_eye/pic_in_pic/proc/update_camera_telegraphing() if(!telegraph_cameras) return var/list/obj/machinery/camera/add = list() @@ -180,7 +177,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) C.in_use_lights++ C.update_icon() -/mob/camera/aiEye/pic_in_pic/proc/disable_camera_telegraphing() +/mob/camera/ai_eye/pic_in_pic/proc/disable_camera_telegraphing() telegraph_cameras = FALSE for (var/V in cameras_telegraphed) var/obj/machinery/camera/C = V @@ -190,7 +187,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) C.update_icon() cameras_telegraphed.Cut() -/mob/camera/aiEye/pic_in_pic/Destroy() +/mob/camera/ai_eye/pic_in_pic/Destroy() disable_camera_telegraphing() return ..() @@ -207,7 +204,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) if(!silent) to_chat(src, "Cannot place more than [max_multicams] multicamera windows.") return - var/obj/screen/movable/pic_in_pic/ai/C = new /obj/screen/movable/pic_in_pic/ai() + var/atom/movable/screen/movable/pic_in_pic/ai/C = new /atom/movable/screen/movable/pic_in_pic/ai() C.set_view_size(3, 3, FALSE) C.set_view_center(get_turf(eyeobj)) C.set_ai(src) @@ -238,7 +235,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) reset_perspective(GLOB.ai_camera_room_landmark) if(client) for(var/V in multicam_screens) - var/obj/screen/movable/pic_in_pic/P = V + var/atom/movable/screen/movable/pic_in_pic/P = V P.show_to(client) /mob/living/silicon/ai/proc/end_multicam() @@ -248,13 +245,13 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) select_main_multicam_window(null) if(client) for(var/V in multicam_screens) - var/obj/screen/movable/pic_in_pic/P = V + var/atom/movable/screen/movable/pic_in_pic/P = V P.unshow_to(client) reset_perspective() to_chat(src, "Multiple-camera viewing mode deactivated.") -/mob/living/silicon/ai/proc/select_main_multicam_window(obj/screen/movable/pic_in_pic/ai/P) +/mob/living/silicon/ai/proc/select_main_multicam_window(atom/movable/screen/movable/pic_in_pic/ai/P) if(master_multicam == P) return diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index a7483b5b84d06..e18756fac16c1 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -17,7 +17,7 @@ /mob/living/silicon/ai/IsVocal() return !CONFIG_GET(flag/silent_ai) -/mob/living/silicon/ai/radio(message, message_mode, list/spans, language) +/mob/living/silicon/ai/radio(message, list/message_mods = list(), list/spans, language) if(incapacitated()) return FALSE if(!radio_enabled) //AI cannot speak if radio is disabled (via intellicard) or depowered. @@ -25,17 +25,8 @@ return FALSE ..() -/mob/living/silicon/ai/get_message_mode(message) - var/static/regex/holopad_finder = regex(@"[:.#][hH]") - if(holopad_finder.Find(message, 1, 1)) - return MODE_HOLOPAD - else - return ..() - //For holopads only. Usable by AI. /mob/living/silicon/ai/proc/holopad_talk(message, language) - - message = trim(message) if (!message) @@ -50,7 +41,7 @@ else padloc = "(UNKNOWN)" src.log_talk(message, LOG_SAY, tag="HOLOPAD in [padloc]") - send_speech(message, 7, T, "robot", message_language = language) + send_speech(message, 7, T, MODE_ROBOT, message_language = language) to_chat(src, "Holopad transmitted, [real_name] \"[message]\"") else to_chat(src, "No holopad connected.") @@ -134,7 +125,7 @@ log_game("[key_name(src)] made a vocal announcement with the following message: [message].") for(var/word in words) - play_vox_word(word, src.z, null) + play_vox_word(word, src.get_virtual_z_level(), null) /proc/play_vox_word(word, z_level, mob/only_listener) @@ -153,7 +144,7 @@ for(var/mob/M in GLOB.player_list) if(M.client && M.can_hear() && (M.client.prefs.toggles & SOUND_ANNOUNCEMENTS)) var/turf/T = get_turf(M) - if(T.z == z_level) + if(T.get_virtual_z_level() == z_level) SEND_SOUND(M, voice) else SEND_SOUND(only_listener, voice) diff --git a/code/modules/mob/living/silicon/ai/vox_sounds.dm b/code/modules/mob/living/silicon/ai/vox_sounds.dm index 55f308baf8560..b90e425100811 100644 --- a/code/modules/mob/living/silicon/ai/vox_sounds.dm +++ b/code/modules/mob/living/silicon/ai/vox_sounds.dm @@ -576,7 +576,7 @@ GLOBAL_LIST_INIT(vox_sounds, list("abduction" = 'sound/vox_fem/abduction.ogg', "nine" = 'sound/vox_fem/nine.ogg', "nineteen" = 'sound/vox_fem/nineteen.ogg', "ninety" = 'sound/vox_fem/ninety.ogg', -/datum/reagent/nitrogen = 'sound/vox_fem/nitrogen.ogg', +"nitrogen" = 'sound/vox_fem/nitrogen.ogg', "n" = 'sound/vox_fem/n.ogg', "nominal" = 'sound/vox_fem/nominal.ogg', "no" = 'sound/vox_fem/no.ogg', diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index f291f4f284a13..199ebfea578af 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -11,7 +11,7 @@ deadchat_broadcast("[src]'s laws were changed.View", "[src]", follow_target=src, message_type=DEADCHAT_LAWCHANGE) /mob/living/silicon/proc/post_lawchange(announce = TRUE) - throw_alert("newlaw", /obj/screen/alert/newlaw) + throw_alert("newlaw", /atom/movable/screen/alert/newlaw) if(announce && last_lawchange_announce != world.time) to_chat(src, "Your laws have been changed.") // lawset modules cause this function to be executed multiple times in a tick, so we wait for the next tick in order to be able to see the entire lawset @@ -29,6 +29,11 @@ laws.set_zeroth_law(law, law_borg) post_lawchange(announce) +/mob/living/silicon/proc/set_valentines_laws(law, announce = TRUE) + laws_sanity_check() + laws.set_valentines_law(law) + post_lawchange(announce) + /mob/living/silicon/proc/add_inherent_law(law, announce = TRUE) laws_sanity_check() laws.add_inherent_law(law) diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm index fce2dd023773f..fd5e049e67fea 100644 --- a/code/modules/mob/living/silicon/pai/death.dm +++ b/code/modules/mob/living/silicon/pai/death.dm @@ -1,12 +1,12 @@ /mob/living/silicon/pai/death(gibbed) if(stat == DEAD) return - stat = DEAD + set_stat(DEAD) mobility_flags = NONE update_sight() clear_fullscreens() //New pAI's get a brand new mind to prevent meta stuff from their previous life. This new mind causes problems down the line if it's not deleted here. - GLOB.alive_mob_list -= src + remove_from_alive_mob_list() ghostize() qdel(src) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index e20d357ae790c..57f9f7b79f117 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -67,14 +67,14 @@ var/can_receive = TRUE var/obj/item/card/id/access_card = null var/chassis = "repairbot" - var/list/possible_chassis = list("cat" = TRUE, "mouse" = TRUE, "monkey" = TRUE, "corgi" = FALSE, "fox" = FALSE, "repairbot" = TRUE, "rabbit" = TRUE, "bat" = FALSE, "butterfly" = FALSE, "hawk" = FALSE, "lizard" = FALSE, "duffel" = TRUE, "snake" = FALSE, "spider" = FALSE, "frog" = FALSE) //assoc value is whether it can be picked up. + var/list/possible_chassis = list("bat" = TRUE, "bee" = TRUE, "butterfly" = TRUE, "carp" = TRUE, "cat" = TRUE, "corgi" = TRUE, "corgi_puppy" = TRUE, "crow" = TRUE, "duffel" = TRUE, "fox" = TRUE, "frog" = TRUE, "hawk" = TRUE, "lizard" = TRUE, "monkey" = TRUE, "mouse" = TRUE, "mushroom" = TRUE, "phantom" = TRUE, "rabbit" = TRUE, "repairbot" = TRUE, "snake" = TRUE, "spider" = TRUE) //assoc value is whether it can be picked up. var/static/item_head_icon = 'icons/mob/pai_item_head.dmi' var/static/item_lh_icon = 'icons/mob/pai_item_lh.dmi' var/static/item_rh_icon = 'icons/mob/pai_item_rh.dmi' var/emitterhealth = 20 var/emittermaxhealth = 20 - var/emitterregen = 0.25 + var/emitterregen = 0.50 var/emittercd = 50 var/emitteroverloadcd = 100 var/emittersemicd = FALSE @@ -162,21 +162,21 @@ /mob/living/silicon/pai/Login() ..() - usr << browse_rsc('html/paigrid.png') // Go ahead and cache the interface resources as early as possible - if(client) - client.perspective = EYE_PERSPECTIVE - if(holoform) - client.eye = src - else - client.eye = card - -/mob/living/silicon/pai/Stat() - ..() - if(statpanel("Status")) - if(!stat) - stat(null, text("Emitter Integrity: [emitterhealth * (100/emittermaxhealth)]")) - else - stat(null, text("Systems nonfunctional")) + var/datum/asset/notes_assets = get_asset_datum(/datum/asset/simple/pAI) + notes_assets.send(client) + client.perspective = EYE_PERSPECTIVE + if(holoform) + client.eye = src + else + client.eye = card + +/mob/living/silicon/pai/get_stat_tab_status() + var/list/tab_data = ..() + if(!stat) + tab_data["Emitter Integrity"] = GENERATE_STAT_TEXT("[emitterhealth * (100/emittermaxhealth)]") + else + tab_data["Systems"] = GENERATE_STAT_TEXT("nonfunctional") + return tab_data /mob/living/silicon/pai/restrained(ignore_grab) . = FALSE @@ -287,16 +287,26 @@ health = maxHealth - getBruteLoss() - getFireLoss() update_stat() -/mob/living/silicon/pai/process() - emitterhealth = CLAMP((emitterhealth + emitterregen), -50, emittermaxhealth) +/mob/living/silicon/pai/process(delta_time) + emitterhealth = CLAMP((emitterhealth + (emitterregen * delta_time)), -50, emittermaxhealth) /obj/item/paicard/attackby(obj/item/W, mob/user, params) ..() user.set_machine(src) - if(pai.encryptmod == TRUE) + if(pai?.encryptmod == TRUE) if(W.tool_behaviour == TOOL_SCREWDRIVER) pai.radio.attackby(W, user, params) else if(istype(W, /obj/item/encryptionkey)) pai.radio.attackby(W, user, params) else to_chat(user, "Encryption Key ports not configured.") + +/obj/item/paicard/emag_act(mob/user) // Emag to wipe the master DNA and supplemental directive + if(!pai) + return + to_chat(user, "You override [pai]'s directive system, clearing its master string and supplied directive.") + to_chat(pai, "Warning: System override detected, check directive sub-system for any changes.'") + log_game("[key_name(user)] emagged [key_name(pai)], wiping their master DNA and supplemental directive.") + pai.master = null + pai.master_dna = null + pai.laws.supplied[1] = "None." // Sets supplemental directive to this diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm index 04f3499bd7981..3f597a1932a41 100644 --- a/code/modules/mob/living/silicon/pai/pai_defense.dm +++ b/code/modules/mob/living/silicon/pai/pai_defense.dm @@ -36,14 +36,16 @@ 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.") + addtimer(CALLBACK(src, .proc/fold_into_hand, user), 10) else visible_message("[user] stomps on [src]!.") take_holo_damage(2) +/mob/living/silicon/pai/proc/fold_into_hand(mob/user) + fold_in() + if(user.put_in_hands(card)) + user.visible_message("[user] promptly scoops up [user.p_their()] pAI's card.") + /mob/living/silicon/pai/bullet_act(obj/item/projectile/Proj) if(Proj.stun) fold_in(force = TRUE) diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm index 631a0a0718b1c..4798a31178b53 100644 --- a/code/modules/mob/living/silicon/pai/pai_shell.dm +++ b/code/modules/mob/living/silicon/pai/pai_shell.dm @@ -4,10 +4,6 @@ to_chat(src, "Your holochassis emitters are still too unstable! Please wait for automatic repair.") return FALSE - if(istype(remote_control,/obj/item/integrated_circuit/input/pAI_connector)) - to_chat(src,"The connector is too small to allow you to change form in it.") - return FALSE - if(!canholo && !force) to_chat(src, "Your master or another force has disabled your holochassis emitters!") return FALSE diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 239742a2984c5..cd7adb7816fea 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -219,6 +219,9 @@ if("pdamessage") if(!isnull(aiPDA)) + if(!aiPDA.owner) + aiPDA.owner = src.real_name + aiPDA.ownjob = "pAI" if(href_list["toggler"]) aiPDA.toff = !aiPDA.toff else if(href_list["ringer"]) @@ -271,9 +274,6 @@ if(href_list["toggle"]) var/mob/living/silicon/pai/pAI = usr pAI.hostscan.attack_self(usr) - if(href_list["toggle2"]) - var/mob/living/silicon/pai/pAI = usr - pAI.hostscan.toggle_mode() if("encryptionkeys") if(href_list["toggle"]) @@ -299,8 +299,6 @@ if("loudness") if(subscreen == 1) // Open Instrument internal_instrument.interact(src) - if(subscreen == 2) // Change Instrument type - internal_instrument.selectInstrument() paiInterface() @@ -500,7 +498,7 @@ else . += "
Requested security record not found,

" if(securityActive2 in GLOB.data_core.security) - . += "
\nSecurity Data
\nCriminal Status: [securityActive2.fields["criminal"]]
\n
\nMinor Crimes: [securityActive2.fields["mi_crim"]]
\nDetails: [securityActive2.fields["mi_crim_d"]]
\n
\nMajor Crimes: [securityActive2.fields["ma_crim"]]
\nDetails: [securityActive2.fields["ma_crim_d"]]
\n
\nImportant Notes:
\n\t[securityActive2.fields["notes"]]
\n
\n
Comments/Log

" + . += "
\nSecurity Data
\nCriminal Status: [securityActive2.fields["criminal"]]
\n
\nCrimes: [securityActive2.fields["crim"]]
\nDetails: [securityActive2.fields["crim_d"]]
\n
\nImportant Notes:
\n\t[securityActive2.fields["notes"]]
\n
\n
Comments/Log

" else . += "
Requested security record not found,

" . += "
\nBack
" @@ -549,7 +547,6 @@ Change Scan Type
- Toggle Verbosity
"} return dat // Atmospheric Scanner @@ -571,7 +568,7 @@ for(var/id in environment.get_gases()) var/gas_level = environment.get_moles(id)/total_moles if(gas_level > 0.01) - dat += "[GLOB.meta_gas_info[id][META_GAS_NAME]]: [round(gas_level*100)]%
" + dat += "[GLOB.gas_data.names[id]]: [round(gas_level*100)]%
" dat += "Temperature: [round(environment.return_temperature()-T0C)]°C
" dat += "Refresh Reading
" dat += "
" diff --git a/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/code/modules/mob/living/silicon/robot/dogborg_equipment.dm deleted file mode 100644 index 714a7930882e9..0000000000000 --- a/code/modules/mob/living/silicon/robot/dogborg_equipment.dm +++ /dev/null @@ -1,103 +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 - -/obj/item/dogborg/jaws/big - name = "combat jaws" - desc = "The jaws of the law. Very sharp." - icon_state = "jaws" - force = 12 - attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") - -/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) - ..() - user.do_attack_animation(A, ATTACK_EFFECT_BITE) - log_combat(user, A, "bit") - -/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") - 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 = 5 - attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") - 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/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)) - - - -/obj/item/twohanded/shockpaddles/cyborg/hound - name = "Paws of Life" - desc = "MediHound specific shock paws." - icon = 'icons/mob/dogborg.dmi' - icon_state = "defibpaddles0" - item_state = "defibpaddles0" - diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 7d94905357d35..3f2df6fd9bcc2 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -65,7 +65,7 @@ else to_chat(src, "You need to disable a module first!") if(.) - O.equipped(src, SLOT_HANDS) + O.equipped(src, ITEM_SLOT_HANDS) O.mouse_opacity = initial(O.mouse_opacity) O.layer = ABOVE_HUD_LAYER O.plane = ABOVE_HUD_PLANE diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index b4362d0137a21..956bbec89b019 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -29,7 +29,7 @@ to_chat(src, "Laws synced with AI, be sure to note any changes.") else to_chat(src, "No AI selected to sync laws with, disabling lawsync protocol.") - lawupdate = 0 + lawupdate = FALSE to_chat(who, "Obey these laws:") laws.show_laws(who) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index aeefb6309b315..fb7c12a69e197 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -2,12 +2,16 @@ set invisibility = 0 if (src.notransform) return - ..() adjustOxyLoss(-10) //we're a robot! handle_robot_hud_updates() handle_robot_cell() +/mob/living/silicon/robot/proc/handle_jamming() + if(deployed && is_jammed()) + to_chat(src, "Remote connection with target lost.") + undeploy() + /mob/living/silicon/robot/proc/handle_robot_cell() if(stat != DEAD) if(low_power_mode) @@ -62,15 +66,15 @@ if(0.75 to INFINITY) clear_alert("charge") if(0.5 to 0.75) - throw_alert("charge", /obj/screen/alert/lowcell, 1) + throw_alert("charge", /atom/movable/screen/alert/lowcell, 1) if(0.25 to 0.5) - throw_alert("charge", /obj/screen/alert/lowcell, 2) + throw_alert("charge", /atom/movable/screen/alert/lowcell, 2) if(0.01 to 0.25) - throw_alert("charge", /obj/screen/alert/lowcell, 3) + throw_alert("charge", /atom/movable/screen/alert/lowcell, 3) else - throw_alert("charge", /obj/screen/alert/emptycell) + throw_alert("charge", /atom/movable/screen/alert/emptycell) else - throw_alert("charge", /obj/screen/alert/nocell) + throw_alert("charge", /atom/movable/screen/alert/nocell) //Robots on fire /mob/living/silicon/robot/handle_fire() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 92c56d389bb93..1a7aea227db37 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -10,6 +10,8 @@ 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.. @@ -25,15 +27,15 @@ //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/atom/movable/screen/inv1 = null + var/atom/movable/screen/inv2 = null + var/atom/movable/screen/inv3 = null + var/atom/movable/screen/lamp_button = null + var/atom/movable/screen/thruster_button = null + var/atom/movable/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 + var/atom/movable/screen/robot_modules_background //3 Modules can be activated at any one time. var/obj/item/robot_module/module = null @@ -65,7 +67,7 @@ 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/lawupdate = TRUE //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/lockcharge //Boolean of whether the borg is locked down or not @@ -122,6 +124,7 @@ make_laws() if(!TryConnectToAI()) lawupdate = FALSE + wires.ui_update() radio = new /obj/item/radio/borg(src) if(!scrambledcodes && !builtInCamera) @@ -170,9 +173,9 @@ mmi.forceMove(T) if(mmi.brainmob) if(mmi.brainmob.stat == DEAD) - mmi.brainmob.stat = CONSCIOUS - GLOB.dead_mob_list -= mmi.brainmob - GLOB.alive_mob_list += mmi.brainmob + mmi.brainmob.set_stat(CONSCIOUS) + mmi.brainmob.remove_from_dead_mob_list() + mmi.brainmob.add_to_alive_mob_list() mind.transfer_to(mmi.brainmob) mmi.update_icon() else @@ -188,12 +191,12 @@ if(T && istype(radio) && istype(radio.keyslot)) radio.keyslot.forceMove(T) radio.keyslot = null - qdel(wires) - qdel(module) - qdel(eye_lights) - wires = null - module = null - eye_lights = null + QDEL_NULL(wires) + QDEL_NULL(eye_lights) + QDEL_NULL(inv1) + QDEL_NULL(inv2) + QDEL_NULL(inv3) + QDEL_NULL(spark_system) cell = null return ..() @@ -213,10 +216,15 @@ "Service" = /obj/item/robot_module/butler) if(!CONFIG_GET(flag/disable_peaceborg)) modulelist["Peacekeeper"] = /obj/item/robot_module/peacekeeper - if(!CONFIG_GET(flag/disable_secborg)) - modulelist["Security"] = /obj/item/robot_module/security - var/input_module = input("Please, select a module!", "Robot", null, null) as null|anything in sortList(modulelist) + // Create radial menu for choosing borg model *smug* module + var/list/module_icons = list() + for(var/option in modulelist) + var/obj/item/robot_module/module = modulelist[option] + var/module_icon = initial(module.cyborg_base_icon) + module_icons[option] = image(icon = 'icons/mob/robots.dmi', icon_state = module_icon) + + var/input_module = show_radial_menu(src, src, module_icons, radius = 42) if(!input_module || module.type != /obj/item/robot_module) return @@ -307,47 +315,63 @@ if(thruster_button) thruster_button.icon_state = "ionpulse[ionpulse_on]" -/mob/living/silicon/robot/Stat() - ..() - if(statpanel("Status")) - if(cell) - stat(null, "Charge Left: [cell.charge]/[cell.maxcharge]") - else - stat(null, text("No Cell Inserted!")) +/mob/living/silicon/robot/get_stat_tab_status() + var/list/tab_data = ..() + if(cell) + tab_data["Charge Left"] = GENERATE_STAT_TEXT("[cell.charge]/[cell.maxcharge]") + else + tab_data["Charge Left"] = GENERATE_STAT_TEXT("No Cell Inserted!") - if(module) - for(var/datum/robot_energy_storage/st in module.storages) - stat(null, "[st.name]: [st.energy]/[st.max_energy]") - if(connected_ai) - stat(null, "Master AI: [connected_ai.name]") + if(module) + for(var/datum/robot_energy_storage/st in module.storages) + tab_data["[st.name]"] = GENERATE_STAT_TEXT("[st.energy]/[st.max_energy]") + if(connected_ai) + tab_data["Master AI"] = GENERATE_STAT_TEXT("[connected_ai.name]") + return tab_data /mob/living/silicon/robot/restrained(ignore_grab) . = 0 -/mob/living/silicon/robot/triggerAlarm(class, area/A, O, obj/alarmsource) - if(alarmsource.z != z) +/mob/living/silicon/robot/triggerAlarm(class, area/home, cameras, obj/source) + if(source.get_virtual_z_level() != get_virtual_z_level()) return if(stat == DEAD) - return 1 - var/list/L = alarms[class] - for (var/I in L) - if (I == A.name) - var/list/alarm = L[I] + return TRUE + var/list/our_sort = alarms[class] + for(var/areaname in our_sort) + if (areaname == home.name) + var/list/alarm = our_sort[areaname] var/list/sources = alarm[3] - if (!(alarmsource in sources)) - sources += alarmsource - return 1 - var/obj/machinery/camera/C = null - var/list/CL = null - if (O && istype(O, /list)) - CL = O - if (CL.len == 1) - C = CL[1] - else if (O && istype(O, /obj/machinery/camera)) - C = O - L[A.name] = list(A, (C) ? C : O, list(alarmsource)) - queueAlarm(text("--- [class] alarm detected in [A.name]!"), class) - return 1 + if (!(source in sources)) + sources += source + return TRUE + + var/obj/machinery/camera/cam = null + var/list/our_cams = null + if(cameras && islist(cameras)) + our_cams = cameras + if (our_cams.len == 1) + cam = our_cams[1] + else if(cameras && istype(cameras, /obj/machinery/camera)) + cam = cameras + our_sort[home.name] = list(home, (cam ? cam : cameras), list(source)) + queueAlarm(text("--- [class] alarm detected in [home.name]!"), class) + return TRUE + +/mob/living/silicon/robot/freeCamera(area/home, obj/machinery/camera/cam) + for(var/class in alarms) + var/our_area = alarms[class][home.name] + if(!our_area) + continue + var/cams = our_area[2] //Get the cameras + if(!cams) + continue + if(islist(cams)) + cams -= cam + if(length(cams) == 1) + our_area[2] = cams[1] + else + our_area[2] = null /mob/living/silicon/robot/cancelAlarm(class, area/A, obj/origin) var/list/L = alarms[class] @@ -372,6 +396,8 @@ var/turf/T1 = get_turf(A) if (!T0 || ! T1) return FALSE + if(A.is_jammed()) + return FALSE return ISINRANGE(T1.x, T0.x - interaction_range, T0.x + interaction_range) && ISINRANGE(T1.y, T0.y - interaction_range, T0.y + interaction_range) /mob/living/silicon/robot/AltClick(mob/user) @@ -387,14 +413,14 @@ if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away. return if(src == user) - to_chat(user, "You start fixing yourself...") + to_chat(user, "You start fixing yourself.") if(!W.use_tool(src, user, 50)) return adjustBruteLoss(-30) updatehealth() add_fingerprint(user) - visible_message("[user] has fixed some of the dents on [src].") + user.visible_message("[user] has fixed some of the dents on [src].", "You fix some of the dents on [src].") return else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed) @@ -402,7 +428,7 @@ var/obj/item/stack/cable_coil/coil = W if (getFireLoss() > 0 || getToxLoss() > 0) if(src == user) - to_chat(user, "You start fixing yourself...") + to_chat(user, "You start fixing yourself.") if(!do_after(user, 50, target = src)) return if (coil.use(1)) @@ -449,12 +475,12 @@ else if(W.tool_behaviour == TOOL_SCREWDRIVER && opened && !cell) // haxing wiresexposed = !wiresexposed - to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]") + to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"].") update_icons() else if(W.tool_behaviour == TOOL_SCREWDRIVER && opened && cell) // radio if(shell) - to_chat(user, "You cannot seem to open the radio compartment") //Prevent AI radio key theft + to_chat(user, "You cannot seem to open the radio compartment.") //Prevent AI radio key theft else if(radio) radio.attackby(W,user)//Push it to the radio to let it handle everything else @@ -467,7 +493,7 @@ spark_system.start() return else - to_chat(user, "You start to unfasten [src]'s securing bolts...") + to_chat(user, "You start to unfasten [src]'s securing bolts.") if(W.use_tool(src, user, 50, volume=50) && !cell) user.visible_message("[user] deconstructs [src]!", "You unfasten the securing bolts, and [src] falls to pieces!") log_attack("[key_name(user)] deconstructed [name] at [AREACOORD(src)].") @@ -657,7 +683,7 @@ lawupdate = FALSE lockcharge = FALSE mobility_flags |= MOBILITY_FLAGS_DEFAULT - scrambledcodes = TRUE + scrambledcodes = TRUE_DEVIL //Disconnect it's camera so it's not so easily tracked. if(!QDELETED(builtInCamera)) QDEL_NULL(builtInCamera) @@ -665,6 +691,7 @@ // Instead of being listed as "deactivated". The downside is that I'm going // to have to check if every camera is null or not before doing anything, to prevent runtime errors. // I could change the network to null but I don't know what would happen, and it seems too hacky for me. + wires.ui_update() /mob/living/silicon/robot/mode() set name = "Activate Held Object" @@ -678,12 +705,12 @@ W.attack_self(src) -/mob/living/silicon/robot/proc/SetLockdown(state = 1) +/mob/living/silicon/robot/proc/SetLockdown(state = TRUE) // They stay locked down if their wire is cut. if(wires.is_cut(WIRE_LOCKDOWN)) - state = 1 + state = TRUE if(state) - throw_alert("locked", /obj/screen/alert/locked) + throw_alert("locked", /atom/movable/screen/alert/locked) else clear_alert("locked") lockcharge = state @@ -694,7 +721,7 @@ module.rebuild_modules() update_icons() if(emagged) - throw_alert("hacked", /obj/screen/alert/hacked) + throw_alert("hacked", /atom/movable/screen/alert/hacked) else clear_alert("hacked") @@ -705,7 +732,7 @@ update_icons() if(ratvar) internal_clock_slab = new(src) - throw_alert("ratvar", /obj/screen/alert/ratvar) + throw_alert("ratvar", /atom/movable/screen/alert/ratvar) else qdel(internal_clock_slab) clear_alert("ratvar") @@ -734,7 +761,7 @@ //Some sort of magical "modulo" thing which somehow increments lamp power by 2, until it hits the max and resets to 0. lamp_intensity = (lamp_intensity+2) % (lamp_max+2) - to_chat(src, "[lamp_intensity ? "Headlamp power set to Level [lamp_intensity/2]" : "Headlamp disabled."]") + to_chat(src, "[lamp_intensity ? "Headlamp power set to level [lamp_intensity/2]." : "Headlamp disabled."]") update_headlamp() /mob/living/silicon/robot/proc/update_headlamp(var/turn_off = 0, var/cooldown = 100) @@ -946,7 +973,7 @@ if(sight_mode & BORGMESON) sight |= SEE_TURFS - lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE see_in_dark = 1 if(sight_mode & BORGMATERIAL) @@ -977,13 +1004,13 @@ return if(IsUnconscious() || IsStun() || IsKnockdown() || IsParalyzed() || getOxyLoss() > maxHealth*0.5) if(stat == CONSCIOUS) - stat = UNCONSCIOUS + set_stat(UNCONSCIOUS) blind_eyes(1) update_mobility() update_headlamp() else if(stat == UNCONSCIOUS) - stat = CONSCIOUS + set_stat(CONSCIOUS) adjust_blindness(-1) update_mobility() update_headlamp() @@ -1000,6 +1027,7 @@ if(admin_revive) locked = TRUE notify_ai(NEW_BORG) + wires.ui_update() . = 1 /mob/living/silicon/robot/fully_replace_character_name(oldname, newname) @@ -1119,6 +1147,7 @@ diag_hud_set_aishell() undeployment_action.Grant(src) + wires.ui_update() /datum/action/innate/undeployment name = "Disconnect from shell" @@ -1153,6 +1182,7 @@ mainframe.diag_hud_set_deployed() if(mainframe.laws) mainframe.laws.show_laws(mainframe) //Always remind the AI when switching + mainframe.eyeobj?.setLoc(get_turf(src)) mainframe = null /mob/living/silicon/robot/attack_ai(mob/user) @@ -1209,9 +1239,11 @@ if(connected_ai) connected_ai.connected_robots += src lawsync() - lawupdate = 1 + lawupdate = TRUE + wires.ui_update() return TRUE picturesync() + wires.ui_update() return FALSE /mob/living/silicon/robot/proc/picturesync() @@ -1222,6 +1254,8 @@ aicamera.stored[i] = TRUE /mob/living/silicon/robot/proc/charge(datum/source, amount, repairs) + SIGNAL_HANDLER + if(module) module.respawn_consumable(src, amount * 0.005) if(cell) diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index ce8bab5cd2fe1..7b5a8a7a13d04 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -44,6 +44,8 @@ damage = 30 else damage = 20 + if(M.transformeffects & SLIME_EFFECT_RED) + damage *= 1.1 damage = round(damage / 2) // borgs receive half damage adjustBruteLoss(damage) updatehealth() @@ -122,7 +124,7 @@ SetEmagged(1) SetStun(60) //Borgs were getting into trouble because they would attack the emagger before the new laws were shown - lawupdate = 0 + lawupdate = FALSE connected_ai = null message_admins("[ADMIN_LOOKUPFLW(user)] emagged cyborg [ADMIN_LOOKUPFLW(src)]. Laws overridden.") log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.") diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 35e44e00cc7aa..15c18fe4a97b0 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -90,7 +90,7 @@ if(istype(I, /obj/item/stack)) var/obj/item/stack/S = I - if(is_type_in_list(S, list(/obj/item/stack/sheet/iron, /obj/item/stack/rods, /obj/item/stack/tile/plasteel))) + if(is_type_in_list(S, list(/obj/item/stack/sheet/iron, /obj/item/stack/rods, /obj/item/stack/tile/plasteel, /obj/item/stack/tile/light))) if(S.materials[/datum/material/iron]) S.cost = S.materials[/datum/material/iron] * 0.25 S.source = get_or_create_estorage(/datum/robot_energy_storage/metal) @@ -224,14 +224,14 @@ sleep(1) flick("[cyborg_base_icon]_transform", R) R.notransform = TRUE - R.SetLockdown(1) + R.SetLockdown(TRUE) R.anchored = TRUE sleep(1) for(var/i in 1 to 4) playsound(R, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, 1, -1) sleep(7) if(!prev_lockcharge) - R.SetLockdown(0) + R.SetLockdown(FALSE) R.setDir(SOUTH) R.anchored = FALSE R.notransform = FALSE @@ -241,6 +241,22 @@ R.hud_used.update_robot_modules_display() SSblackbox.record_feedback("tally", "cyborg_modules", 1, R.module) +/** + * Checks if we are allowed to interact with a radial menu + * + * Arguments: + * * user The cyborg mob interacting with the menu + * * old_module The old cyborg's module + */ +/obj/item/robot_module/proc/check_menu(mob/living/silicon/robot/user, obj/item/robot_module/old_module) + if(!istype(user)) + return FALSE + if(user.incapacitated()) + return FALSE + if(user.module != old_module) + return FALSE + return TRUE + /obj/item/robot_module/standard name = "Standard" basic_modules = list( @@ -268,7 +284,7 @@ /obj/item/clock_module/abstraction_crystal, /obj/item/clockwork/replica_fabricator, /obj/item/stack/tile/brass/cyborg, - /obj/item/twohanded/clockwork/brass_spear) + /obj/item/clockwork/weapon/brass_spear) moduleselect_icon = "standard" hat_offset = -3 @@ -350,7 +366,7 @@ hat_offset = -4 /obj/item/robot_module/deathsquad - name = "Centcom" + name = "CentCom" basic_modules = list( /obj/item/assembly/flash/cyborg, /obj/item/restraints/handcuffs/cable/zipties, @@ -382,7 +398,7 @@ emag_modules = list(/obj/item/gun/energy/laser/cyborg) ratvar_modules = list( /obj/item/clock_module/abscond, - /obj/item/twohanded/clockwork/brass_spear, + /obj/item/clockwork/weapon/brass_spear, /obj/item/clock_module/ocular_warden, /obj/item/clock_module/vanguard) cyborg_base_icon = "sec" @@ -404,7 +420,7 @@ T.cell.give(S.e_cost * coeff) T.update_icon() else - T.charge_tick = 0 + T.charge_timer = 0 /obj/item/robot_module/peacekeeper name = "Peacekeeper" @@ -452,8 +468,11 @@ /obj/item/paint/paint_remover, /obj/item/lightreplacer/cyborg, /obj/item/holosign_creator/janibarrier, - /obj/item/reagent_containers/spray/cyborg_drying) - emag_modules = list(/obj/item/reagent_containers/spray/cyborg_lube) + /obj/item/reagent_containers/spray/cyborg/drying_agent, + /obj/item/reagent_containers/spray/cyborg/plantbgone) + emag_modules = list( + /obj/item/reagent_containers/spray/cyborg/lube, + /obj/item/reagent_containers/spray/cyborg/acid) ratvar_modules = list( /obj/item/clock_module/abscond, /obj/item/clock_module/sigil_submission, @@ -464,15 +483,6 @@ hat_offset = -5 clean_on_move = TRUE -/obj/item/reagent_containers/spray/cyborg_drying - name = "drying agent spray" - color = "#A000A0" - list_reagents = list(/datum/reagent/drying_agent = 250) - -/obj/item/reagent_containers/spray/cyborg_lube - name = "lube spray" - list_reagents = list(/datum/reagent/lube = 250) - /obj/item/robot_module/janitor/respawn_consumable(mob/living/silicon/robot/R, coeff = 1) ..() var/obj/item/lightreplacer/LR = locate(/obj/item/lightreplacer) in basic_modules @@ -480,14 +490,6 @@ for(var/i in 1 to coeff) LR.Charge(R) - var/obj/item/reagent_containers/spray/cyborg_drying/CD = locate(/obj/item/reagent_containers/spray/cyborg_drying) in basic_modules - if(CD) - CD.reagents.add_reagent(/datum/reagent/drying_agent, 5 * coeff) - - var/obj/item/reagent_containers/spray/cyborg_lube/CL = locate(/obj/item/reagent_containers/spray/cyborg_lube) in emag_modules - if(CL) - CL.reagents.add_reagent(/datum/reagent/lube, 2 * coeff) - /obj/item/robot_module/clown name = "Clown" basic_modules = list( @@ -515,7 +517,7 @@ ratvar_modules = list( /obj/item/clock_module/abscond, /obj/item/clock_module/vanguard, - /obj/item/twohanded/clockwork/brass_battlehammer) //honk + /obj/item/clockwork/weapon/brass_battlehammer) //honk moduleselect_icon = "service" cyborg_base_icon = "clown" hat_offset = -2 @@ -547,6 +549,7 @@ /obj/item/clock_module/sentinels_compromise, /obj/item/clockwork/replica_fabricator) moduleselect_icon = "service" + cyborg_base_icon = "service_m" // display as butlerborg for radial model selection special_light_key = "service" hat_offset = 0 @@ -557,11 +560,16 @@ O.reagents.add_reagent(/datum/reagent/consumable/enzyme, 2 * coeff) /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 sortList(list("Waitress", "Butler", "Tophat", "Kent", "Bro")) - if(!borg_icon) - return FALSE - switch(borg_icon) + var/mob/living/silicon/robot/cyborg = loc + var/list/service_icons = list( + "Waitress" = image(icon = 'icons/mob/robots.dmi', icon_state = "service_f"), + "Butler" = image(icon = 'icons/mob/robots.dmi', icon_state = "service_m"), + "Bro" = image(icon = 'icons/mob/robots.dmi', icon_state = "brobot"), + "Kent" = image(icon = 'icons/mob/robots.dmi', icon_state = "kent"), + "Tophat" = image(icon = 'icons/mob/robots.dmi', icon_state = "tophat") + ) + var/service_robot_icon = show_radial_menu(cyborg, cyborg, service_icons, custom_check = CALLBACK(src, .proc/check_menu, cyborg, old_module), radius = 42, require_near = TRUE) + switch(service_robot_icon) if("Waitress") cyborg_base_icon = "service_f" if("Butler") @@ -575,7 +583,9 @@ if("Tophat") cyborg_base_icon = "tophat" special_light_key = null - hat_offset = INFINITY //He is already wearing a hat + hat_offset = INFINITY //He's already wearing a hat + else + return FALSE return ..() /obj/item/robot_module/borgi @@ -615,11 +625,14 @@ var/obj/item/t_scanner/adv_mining_scanner/cyborg/mining_scanner //built in memes. /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 sortList(list("Lavaland Miner", "Asteroid Miner", "Spider Miner")) - if(!borg_icon) - return FALSE - switch(borg_icon) + var/mob/living/silicon/robot/cyborg = loc + var/list/miner_icons = list( + "Lavaland Miner" = image(icon = 'icons/mob/robots.dmi', icon_state = "miner"), + "Asteroid Miner" = image(icon = 'icons/mob/robots.dmi', icon_state = "minerOLD"), + "Spider Miner" = image(icon = 'icons/mob/robots.dmi', icon_state = "spidermin") + ) + var/miner_robot_icon = show_radial_menu(cyborg, cyborg, miner_icons, custom_check = CALLBACK(src, .proc/check_menu, cyborg, old_module), radius = 42, require_near = TRUE) + switch(miner_robot_icon) if("Lavaland Miner") cyborg_base_icon = "miner" if("Asteroid Miner") @@ -627,6 +640,8 @@ special_light_key = "miner" if("Spider Miner") cyborg_base_icon = "spidermin" + else + return FALSE return ..() /obj/item/robot_module/miner/rebuild_modules() @@ -670,7 +685,7 @@ basic_modules = list( /obj/item/assembly/flash/cyborg, /obj/item/reagent_containers/borghypo/syndicate, - /obj/item/twohanded/shockpaddles/syndicate/cyborg, + /obj/item/shockpaddles/syndicate/cyborg, /obj/item/healthanalyzer, /obj/item/surgical_drapes, /obj/item/borg/charger, diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index 59f480110c526..934cd93ea9f60 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -7,9 +7,9 @@ return FALSE /mob/living/silicon/robot/mob_negates_gravity() - return magpulse + return isspaceturf(get_turf(src)) ? FALSE : magpulse //We don't mimick gravity on space turfs -/mob/living/silicon/robot/mob_has_gravity() +/mob/living/silicon/robot/has_gravity(turf/T) return ..() || mob_negates_gravity() /mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction) diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index fbc1eb4eb9694..12fce0269aa90 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -1,5 +1,8 @@ /mob/living/proc/robot_talk(message) - log_talk(message, LOG_SAY) + //Cannot transmit wireless messages while jammed + if(is_jammed()) + return + log_talk(message, LOG_SAY, tag="binary") var/desig = "Default Cyborg" //ezmode for taters if(issilicon(src)) var/mob/living/silicon/S = src @@ -29,26 +32,19 @@ /mob/living/silicon/lingcheck() return 0 //Borged or AI'd lings can't speak on the ling channel. -/mob/living/silicon/radio(message, message_mode, list/spans, language) +/mob/living/silicon/radio(message, list/message_mods = list(), list/spans, language) . = ..() if(. != 0) return . - if(message_mode == "robot") - if (radio) - radio.talk_into(src, message, , spans, language) + if(message_mods[MODE_HEADSET]) + if(radio) + radio.talk_into(src, message, , spans, language, message_mods) return REDUCE_RANGE - else if(message_mode in GLOB.radiochannels) + else if(message_mods[RADIO_EXTENSION] in GLOB.radiochannels) if(radio) - radio.talk_into(src, message, message_mode, spans, language) + radio.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) return ITALICS | REDUCE_RANGE return 0 - -/mob/living/silicon/get_message_mode(message) - . = ..() - if(..() == MODE_HEADSET) - return MODE_ROBOT - else - return . diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 8350ebe388167..ab3ffc3104169 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -11,10 +11,10 @@ weather_immunities = list("ash") possible_a_intents = list(INTENT_HELP, INTENT_HARM) mob_biotypes = list(MOB_ROBOTIC) + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE deathsound = 'sound/voice/borg_deathsound.ogg' speech_span = SPAN_ROBOT - var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS var/last_lawchange_announce = 0 var/list/alarms_to_show = list() @@ -47,6 +47,8 @@ var/interaction_range = 7 //wireless control range var/obj/item/pda/aiPDA + mobchatspan = "centcom" + /mob/living/silicon/Initialize() . = ..() GLOB.silicon_mobs += src @@ -72,12 +74,12 @@ /mob/living/silicon/contents_explosion(severity, target) return -/mob/living/silicon/prevent_content_explosion() - return TRUE - /mob/living/silicon/proc/cancelAlarm() return +/mob/living/silicon/proc/freeCamera() + return + /mob/living/silicon/proc/triggerAlarm() return @@ -91,68 +93,68 @@ alarm_types_clear[type] += 1 if(!in_cooldown) - spawn(3 * 10) // 3 seconds - - if(alarms_to_show.len < 5) - for(var/msg in alarms_to_show) - to_chat(src, msg) - else if(alarms_to_show.len) + addtimer(CALLBACK(src, .proc/handle_alarms), 30) //3 second cooldown - var/msg = "--- " +/mob/living/silicon/proc/handle_alarms() + if(alarms_to_show.len < 5) + for(var/msg in alarms_to_show) + to_chat(src, msg) + else if(alarms_to_show.len) - if(alarm_types_show["Burglar"]) - msg += "BURGLAR: [alarm_types_show["Burglar"]] alarms detected. - " + var/msg = "--- " - if(alarm_types_show["Motion"]) - msg += "MOTION: [alarm_types_show["Motion"]] alarms detected. - " + if(alarm_types_show["Burglar"]) + msg += "BURGLAR: [alarm_types_show["Burglar"]] alarms detected. - " - if(alarm_types_show["Fire"]) - msg += "FIRE: [alarm_types_show["Fire"]] alarms detected. - " + if(alarm_types_show["Motion"]) + msg += "MOTION: [alarm_types_show["Motion"]] alarms detected. - " - if(alarm_types_show["Atmosphere"]) - msg += "ATMOSPHERE: [alarm_types_show["Atmosphere"]] alarms detected. - " + if(alarm_types_show["Fire"]) + msg += "FIRE: [alarm_types_show["Fire"]] alarms detected. - " - if(alarm_types_show["Power"]) - msg += "POWER: [alarm_types_show["Power"]] alarms detected. - " + if(alarm_types_show["Atmosphere"]) + msg += "ATMOSPHERE: [alarm_types_show["Atmosphere"]] alarms detected. - " - if(alarm_types_show["Camera"]) - msg += "CAMERA: [alarm_types_show["Camera"]] alarms detected. - " + if(alarm_types_show["Power"]) + msg += "POWER: [alarm_types_show["Power"]] alarms detected. - " - msg += "\[Show Alerts\]" - to_chat(src, msg) + if(alarm_types_show["Camera"]) + msg += "CAMERA: [alarm_types_show["Camera"]] alarms detected. - " - if(alarms_to_clear.len < 3) - for(var/msg in alarms_to_clear) - to_chat(src, msg) + msg += "\[Show Alerts\]" + to_chat(src, msg) - else if(alarms_to_clear.len) - var/msg = "--- " + if(alarms_to_clear.len < 3) + for(var/msg in alarms_to_clear) + to_chat(src, msg) - if(alarm_types_clear["Motion"]) - msg += "MOTION: [alarm_types_clear["Motion"]] alarms cleared. - " + else if(alarms_to_clear.len) + var/msg = "--- " - if(alarm_types_clear["Fire"]) - msg += "FIRE: [alarm_types_clear["Fire"]] alarms cleared. - " + if(alarm_types_clear["Motion"]) + msg += "MOTION: [alarm_types_clear["Motion"]] alarms cleared. - " - if(alarm_types_clear["Atmosphere"]) - msg += "ATMOSPHERE: [alarm_types_clear["Atmosphere"]] alarms cleared. - " + if(alarm_types_clear["Fire"]) + msg += "FIRE: [alarm_types_clear["Fire"]] alarms cleared. - " - if(alarm_types_clear["Power"]) - msg += "POWER: [alarm_types_clear["Power"]] alarms cleared. - " + if(alarm_types_clear["Atmosphere"]) + msg += "ATMOSPHERE: [alarm_types_clear["Atmosphere"]] alarms cleared. - " - if(alarm_types_show["Camera"]) - msg += "CAMERA: [alarm_types_clear["Camera"]] alarms cleared. - " + if(alarm_types_clear["Power"]) + msg += "POWER: [alarm_types_clear["Power"]] alarms cleared. - " - msg += "\[Show Alerts\]" - to_chat(src, msg) + if(alarm_types_show["Camera"]) + msg += "CAMERA: [alarm_types_clear["Camera"]] alarms cleared. - " + msg += "\[Show Alerts\]" + to_chat(src, msg) - alarms_to_show = list() - alarms_to_clear = list() - for(var/key in alarm_types_show) - alarm_types_show[key] = 0 - for(var/key in alarm_types_clear) - alarm_types_clear[key] = 0 + alarms_to_show = list() + alarms_to_clear = list() + for(var/key in alarm_types_show) + alarm_types_show[key] = 0 + for(var/key in alarm_types_clear) + alarm_types_clear[key] = 0 /mob/living/silicon/can_inject(mob/user, error_msg) if(error_msg) @@ -372,7 +374,7 @@ return 0 -/mob/living/silicon/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt silicon units +/mob/living/silicon/assess_threat(judgment_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt silicon units return -10 /mob/living/silicon/proc/remove_sensors() @@ -429,3 +431,6 @@ /mob/living/silicon/rust_heretic_act() adjustBruteLoss(500) + +/mob/living/silicon/hears_radio() + return FALSE diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index ac345937598bb..96b179425f811 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -127,6 +127,6 @@ Proj.on_hit(src) 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) +/mob/living/silicon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash/static) if(affect_silicon) return ..() diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index f3f12253cb8c9..6338b06703ec0 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -85,6 +85,8 @@ var/damage = 20 if(M.is_adult) damage = 30 + if(M.transformeffects & SLIME_EFFECT_RED) + damage *= 1.1 return attack_threshold_check(damage) /mob/living/simple_animal/attack_drone(mob/living/simple_animal/drone/M) diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm index b2240864477d3..02179961baf86 100644 --- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm +++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm @@ -24,6 +24,11 @@ desc = "The Syndicate sends their regards." emagged = 2 noloot = TRUE + faction = list(ROLE_SYNDICATE) + +/mob/living/simple_animal/bot/secbot/grievous/nullcrate/ComponentInitialize() + . = ..() + AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_CONTENTS | EMP_PROTECT_WIRES) /mob/living/simple_animal/bot/secbot/grievous/bullet_act(obj/item/projectile/P) visible_message("[src] deflects [P] with its energy swords!") @@ -106,7 +111,7 @@ /mob/living/simple_animal/bot/secbot/grievous/look_for_perp() anchored = FALSE - var/judgement_criteria = judgement_criteria() + var/judgment_criteria = judgment_criteria() for (var/mob/living/carbon/C in view(7,src)) //Let's find us a criminal if((C.stat) || (C.handcuffed)) continue @@ -114,7 +119,7 @@ if((C.name == oldtarget_name) && (world.time < last_found + 100)) continue - threatlevel = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) + threatlevel = C.assess_threat(judgment_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) if(!threatlevel) continue diff --git a/code/modules/mob/living/simple_animal/bot/atmosbot.dm b/code/modules/mob/living/simple_animal/bot/atmosbot.dm index 869114cde35d6..e99c26ab2df89 100644 --- a/code/modules/mob/living/simple_animal/bot/atmosbot.dm +++ b/code/modules/mob/living/simple_animal/bot/atmosbot.dm @@ -53,17 +53,17 @@ var/last_barrier_tick //Gasses var/list/gasses = list( - /datum/gas/bz = 1, - /datum/gas/carbon_dioxide = 1, - /datum/gas/hypernoblium = 1, - /datum/gas/miasma = 1, - /datum/gas/nitrous_oxide = 1, - /datum/gas/nitryl = 1, - /datum/gas/plasma = 1, - /datum/gas/pluoxium = 0, - /datum/gas/stimulum = 0, - /datum/gas/tritium = 1, - /datum/gas/water_vapor = 0, + GAS_BZ = 1, + GAS_CO2 = 1, + GAS_HYPERNOB = 1, + GAS_MIASMA = 1, + GAS_NITROUS = 1, + GAS_NITRYL = 1, + GAS_PLASMA = 1, + GAS_PLUOXIUM = 0, + GAS_STIMULUM = 0, + GAS_TRITIUM = 1, + GAS_H2O = 0, ) //Tank type var/tank_type = /obj/item/tank/internals/oxygen/empty @@ -96,7 +96,7 @@ /mob/living/simple_animal/bot/atmosbot/emag_act(mob/user) . = ..() if(emagged == 2) - audible_message("[src] ominously whirs....") + audible_message("[src] whirs ominously.") playsound(src, "sparks", 75, TRUE) /mob/living/simple_animal/bot/atmosbot/handle_automated_action() @@ -165,7 +165,7 @@ if(!LAZYLEN(path)) var/turf/target_turf = get_turf(target) - path = get_path_to(src, target_turf, /turf/proc/Distance_cardinal, 0, 30, id=access_card, simulated_only = FALSE) + path = get_path_to(src, target_turf, 30, id=access_card, simulated_only = FALSE) if(!bot_move(target)) add_to_ignore(target) @@ -195,10 +195,10 @@ if(pressure_delta > 0) var/transfer_moles = pressure_delta*environment.return_volume()/(T20C * R_IDEAL_GAS_EQUATION) if(emagged == 2) - environment.adjust_moles(/datum/gas/miasma, transfer_moles) + environment.adjust_moles(GAS_MIASMA, transfer_moles) else - environment.adjust_moles(/datum/gas/nitrogen, transfer_moles * 0.7885) - environment.adjust_moles(/datum/gas/oxygen, transfer_moles * 0.2115) + environment.adjust_moles(GAS_N2, transfer_moles * 0.7885) + environment.adjust_moles(GAS_O2, transfer_moles * 0.2115) air_update_turf() new /obj/effect/temp_visual/vent_wind(get_turf(src)) @@ -229,7 +229,7 @@ return ATMOSBOT_HIGH_TOXINS //Too little oxygen or too little pressure var/partial_pressure = R_IDEAL_GAS_EQUATION * gas_mix.return_temperature() / gas_mix.return_volume() - var/oxygen_moles = gas_mix.get_moles(/datum/gas/oxygen) * partial_pressure + var/oxygen_moles = gas_mix.get_moles(GAS_O2) * partial_pressure if(oxygen_moles < 20 || gas_mix.return_pressure() < WARNING_LOW_PRESSURE) return ATMOSBOT_LOW_OXYGEN //Check temperature @@ -286,7 +286,7 @@ var/dat dat += hack(user) dat += showpai(user) - dat += "Atmospheric Stabalizer Controls v1.1

" + dat += "Atmospheric Stabilizer Controls v1.1

" dat += "Status: [on ? "On" : "Off"]
" dat += "Maintenance panel panel is [open ? "opened" : "closed"]
" if(!locked || issilicon(user) || IsAdminGhost(user)) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index feaa9a1ed5348..c4f10f30a0048 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -6,7 +6,7 @@ mob_biotypes = list(MOB_ROBOTIC) light_range = 3 stop_automated_movement = 1 - wander = 0 + wander = FALSE healable = 0 damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) 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) @@ -25,6 +25,9 @@ faction = list("neutral", "silicon" , "turret") hardattacks = TRUE + mobchatspan = "mime" + discovery_points = 0 + var/obj/machinery/bot_core/bot_core = null var/bot_core_type = /obj/machinery/bot_core var/list/users = list() //for dialog updates @@ -181,9 +184,9 @@ GLOB.bots_list -= src if(paicard) ejectpai() - qdel(Radio) - qdel(access_card) - qdel(bot_core) + QDEL_NULL(Radio) + QDEL_NULL(access_card) + QDEL_NULL(bot_core) return ..() /mob/living/simple_animal/bot/bee_friendly() @@ -370,22 +373,16 @@ else say(message) -/mob/living/simple_animal/bot/radio(message, message_mode, list/spans, language) +/mob/living/simple_animal/bot/radio(message, list/message_mods = list(), list/spans, language) . = ..() if(. != 0) return - switch(message_mode) - if(MODE_HEADSET) - Radio.talk_into(src, message, , spans, language) - return REDUCE_RANGE - - if(MODE_DEPARTMENT) - Radio.talk_into(src, message, message_mode, spans, language) - return REDUCE_RANGE - - if(message_mode in GLOB.radiochannels) - Radio.talk_into(src, message, message_mode, spans, language) + if(message_mods[MODE_HEADSET]) + Radio.talk_into(src, message, , spans, language, message_mods) + return REDUCE_RANGE + else if(message_mods[RADIO_EXTENSION] == MODE_DEPARTMENT || (message_mods[RADIO_EXTENSION] in GLOB.radiochannels)) + Radio.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) return REDUCE_RANGE /mob/living/simple_animal/bot/proc/drop_part(obj/item/drop_item, dropzone) @@ -427,30 +424,50 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r if(!T) return var/list/adjacent = T.GetAtmosAdjacentTurfs(1) + var/atom/final_result + var/static/list/turf_typecache = typecacheof(/turf) if(shuffle) //If we were on the same tile as another bot, let's randomize our choices so we dont both go the same way adjacent = shuffle(adjacent) shuffle = FALSE - for(var/scan in adjacent)//Let's see if there's something right next to us first! + for(var/turf/scan as() in adjacent)//Let's see if there's something right next to us first! if(check_bot(scan)) //Is there another bot there? Then let's just skip it continue - if(isturf(scan_type)) //If we're lookeing for a turf we can just run the checks directly! - var/final_result = checkscan(scan,scan_type,old_target) + if(turf_typecache[scan_type]) //If we're lookeing for a turf we can just run the checks directly! + if(!istype(scan, scan_type)) + continue + final_result = checkscan(scan,old_target) if(final_result) return final_result else - var/turf/turfy = scan - for(var/deepscan in turfy.contents)//Check the contents since adjacent is turfs - var/final_result = checkscan(deepscan,scan_type,old_target) + for(var/deepscan in scan.contents)//Check the contents since adjacent is turfs + if(!istype(deepscan, scan_type)) + continue + final_result = checkscan(deepscan,old_target) + if(final_result) + return final_result + + var/list/wider_search_list = list() + for(var/turf/RT in oview(scan_range, src)) + if(!(RT in adjacent)) + wider_search_list += RT + wider_search_list = shuffle(wider_search_list) // Do we *really* need shuffles? Future coders should decide this. + if(turf_typecache[scan_type]) + for(var/turf/scan as() in wider_search_list) + if(!istype(scan, scan_type)) + continue + final_result = checkscan(scan,old_target) + if(final_result) + return final_result + else + for(var/turf/scan as() in wider_search_list) + for(var/deepscan in scan.contents) // view() barely checks contents of contents of turfs anyway + if(!istype(deepscan, scan_type)) + continue + final_result = checkscan(deepscan,old_target) if(final_result) return final_result - for (var/scan in shuffle(view(scan_range, src))-adjacent) //Search for something in range! - var/final_result = checkscan(scan,scan_type,old_target) - if(final_result) - return final_result - -/mob/living/simple_animal/bot/proc/checkscan(scan, scan_type, old_target) - if(!istype(scan, scan_type)) //Check that the thing we found is the type we want! - return FALSE //If not, keep searching! + +/mob/living/simple_animal/bot/proc/checkscan(scan, old_target) if( (REF(scan) in ignore_list) || (scan == old_target) ) //Filter for blacklisted elements, usually unreachable or previously processed oness return FALSE @@ -534,7 +551,7 @@ Pass a positive integer as an argument to override a bot's default speed. var/datum/job/captain/All = new/datum/job/captain all_access.access = All.get_access() - set_path(get_path_to(src, waypoint, /turf/proc/Distance_cardinal, 0, 200, id=all_access)) + set_path(get_path_to(src, waypoint, 200, id=all_access)) calling_ai = caller //Link the AI to the bot! ai_waypoint = waypoint @@ -748,12 +765,12 @@ Pass a positive integer as an argument to override a bot's default speed. // given an optional turf to avoid /mob/living/simple_animal/bot/proc/calc_path(turf/avoid) check_bot_access() - set_path(get_path_to(src, patrol_target, /turf/proc/Distance_cardinal, 0, 120, id=access_card, exclude=avoid)) + set_path(get_path_to(src, patrol_target, 120, id=access_card, exclude=avoid)) /mob/living/simple_animal/bot/proc/calc_summon_path(turf/avoid) check_bot_access() spawn() - set_path(get_path_to(src, summon_target, /turf/proc/Distance_cardinal, 0, 150, id=access_card, exclude=avoid)) + set_path(get_path_to(src, summon_target, 150, id=access_card, exclude=avoid)) if(!path.len) //Cannot reach target. Give up and announce the issue. speak("Summon command failed, destination unreachable.",radio_channel) bot_reset() @@ -864,15 +881,16 @@ Pass a positive integer as an argument to override a bot's default speed. /obj/machinery/bot_core use_power = NO_POWER_USE anchored = FALSE - var/mob/living/simple_animal/bot/owner = null /obj/machinery/bot_core/Initialize() . = ..() - owner = loc - if(!istype(owner)) + if(!isbot(loc)) return INITIALIZE_HINT_QDEL /mob/living/simple_animal/bot/proc/topic_denied(mob/user) //Access check proc for bot topics! Remember to place in a bot's individual Topic if desired. + //Silicons cannot remotely interfact with robots while the robot is jammed + if(issilicon(user) && is_jammed()) + return TRUE if(!user.canUseTopic(src, !issilicon(user))) return TRUE // 0 for access, 1 for denied. @@ -925,7 +943,7 @@ 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.copy_languages(src) + copy_languages(paicard.pai) 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 24e8ab760770e..32b32d42453f5 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -159,7 +159,7 @@ if(!path || path.len == 0) //No path, need a new one //Try to produce a path to the target, and ignore airlocks to which it has access. - path = get_path_to(src, target.loc, /turf/proc/Distance_cardinal, 0, 30, id=access_card) + path = get_path_to(src, target, 30, id=access_card) if(!bot_move(target)) add_to_ignore(target) target = null @@ -210,18 +210,7 @@ icon_state = "cleanbot-c" visible_message("[src] begins to clean up [A].") mode = BOT_CLEANING - spawn(50) - if(mode == BOT_CLEANING) - if(A && isturf(A.loc)) - var/atom/movable/AM = A - if(istype(AM, /obj/effect/decal/cleanable)) - for(var/obj/effect/decal/cleanable/C in A.loc) - qdel(C) - - anchored = FALSE - target = null - mode = BOT_IDLE - icon_state = "cleanbot[on]" + addtimer(CALLBACK(src, .proc/clean, A), 50) else if(istype(A, /obj/item) || istype(A, /obj/effect/decal/remains)) visible_message("[src] sprays hydrofluoric acid at [A]!") playsound(src, 'sound/effects/spray2.ogg', 50, 1, -6) @@ -253,12 +242,25 @@ if(istype(T)) T.MakeSlippery(TURF_WET_WATER, min_wet_time = 20 SECONDS, wet_time_to_add = 15 SECONDS) else - visible_message("[src] whirs and bubbles violently, before releasing a plume of froth!") + visible_message("[src] whirs and bubbles violently before releasing a plume of froth!") new /obj/effect/particle_effect/foam(loc) else ..() +/mob/living/simple_animal/bot/cleanbot/proc/clean(atom/A) + mode = BOT_IDLE + icon_state = "cleanbot[on]" + if(!on) + return + if(A && isturf(A.loc)) + var/atom/movable/AM = A + if(istype(AM, /obj/effect/decal/cleanable)) + for(var/obj/effect/decal/cleanable/C in A.loc) + qdel(C) + anchored = FALSE + target = null + /mob/living/simple_animal/bot/cleanbot/explode() on = FALSE visible_message("[src] blows apart!") @@ -274,6 +276,11 @@ do_sparks(3, TRUE, src) ..() +/mob/living/simple_animal/bot/cleanbot/medbay + name = "Scrubs, MD" + bot_core_type = /obj/machinery/bot_core/cleanbot/medbay + on = FALSE + /obj/machinery/bot_core/cleanbot req_one_access = list(ACCESS_JANITOR, ACCESS_ROBOTICS) @@ -309,3 +316,6 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}) drawn = !drawn get_targets() update_controls() + +/obj/machinery/bot_core/cleanbot/medbay + req_one_access = list(ACCESS_JANITOR, ACCESS_ROBOTICS, ACCESS_MEDICAL) diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 26bc17c1e10d9..8abe47b7e997b 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -158,7 +158,7 @@ Auto Patrol[]"}, declare_arrests = !declare_arrests update_controls() -/mob/living/simple_animal/bot/ed209/proc/judgement_criteria() +/mob/living/simple_animal/bot/ed209/proc/judgment_criteria() var/final = FALSE if(idcheck) final = final|JUDGE_IDCHECK @@ -173,8 +173,8 @@ Auto Patrol[]"}, return final /mob/living/simple_animal/bot/ed209/proc/retaliate(mob/living/carbon/human/H) - var/judgement_criteria = judgement_criteria() - threatlevel = H.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) + var/judgment_criteria = judgment_criteria() + threatlevel = H.assess_threat(judgment_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) threatlevel += 6 if(threatlevel >= 4) target = H @@ -220,13 +220,13 @@ Auto Patrol[]"}, if(disabled) return - var/judgement_criteria = judgement_criteria() + var/judgment_criteria = judgment_criteria() var/list/targets = list() for(var/mob/living/carbon/C in view(7,src)) //Let's find us a target var/threatlevel = 0 if(C.incapacitated()) continue - threatlevel = C.assess_threat(judgement_criteria, lasercolor, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) + threatlevel = C.assess_threat(judgment_criteria, lasercolor, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) //speak(C.real_name + text(": threat: []", threatlevel)) if(threatlevel < 4 ) continue @@ -343,7 +343,7 @@ Auto Patrol[]"}, return anchored = FALSE threatlevel = 0 - var/judgement_criteria = judgement_criteria() + var/judgment_criteria = judgment_criteria() for (var/mob/living/carbon/C in view(7,src)) //Let's find us a criminal if((C.stat) || (C.handcuffed)) continue @@ -351,7 +351,7 @@ Auto Patrol[]"}, if((C.name == oldtarget_name) && (world.time < last_found + 100)) continue - threatlevel = C.assess_threat(judgement_criteria, lasercolor, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) + threatlevel = C.assess_threat(judgment_criteria, lasercolor, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) if(!threatlevel) continue @@ -506,17 +506,19 @@ Auto Patrol[]"}, lasertag_check++ if(lasertag_check) icon_state = "[lasercolor]ed2090" - disabled = 1 + disabled = TRUE target = null - spawn(100) - disabled = 0 - icon_state = "[lasercolor]ed2091" + addtimer(CALLBACK(src, .proc/reenable), 100) return BULLET_ACT_HIT else . = ..() else . = ..() +/mob/living/simple_animal/bot/ed209/proc/reenable() + disabled = FALSE + icon_state = "[lasercolor]ed2091" + /mob/living/simple_animal/bot/ed209/bluetag lasercolor = "b" @@ -558,8 +560,8 @@ Auto Patrol[]"}, C.stuttering = 5 if(ishuman(C)) var/mob/living/carbon/human/H = C - var/judgement_criteria = judgement_criteria() - threat = H.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) + var/judgment_criteria = judgment_criteria() + threat = H.assess_threat(judgment_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) log_combat(src,C,"stunned") if(declare_arrests) var/area/location = get_area(src) @@ -572,11 +574,13 @@ 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) - spawn(60) - if( !on || !Adjacent(C) || !isturf(C.loc) ) //if he's in a closet or not adjacent, we cancel cuffing. - return - if(!C.handcuffed) - C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C) - C.update_handcuffed() - back_to_idle() +/mob/living/simple_animal/bot/ed209/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. + return + if(!C.handcuffed) + C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C) + C.update_handcuffed() + playsound(src, "law", 50, 0) + back_to_idle() diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm index 2609d01786d92..2781e6068427c 100644 --- a/code/modules/mob/living/simple_animal/bot/firebot.dm +++ b/code/modules/mob/living/simple_animal/bot/firebot.dm @@ -232,7 +232,7 @@ if(target_fire && (get_dist(src, target_fire) > 2)) - path = get_path_to(src, get_turf(target_fire), /turf/proc/Distance_cardinal, 0, 30, 1, id=access_card) + path = get_path_to(src, target_fire, 30, 1, id=access_card) mode = BOT_MOVING if(!path.len) soft_reset() diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index 2433086c5df7d..ffd2bb4d2c7d3 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -248,9 +248,9 @@ if(path.len == 0) if(!isturf(target)) var/turf/TL = get_turf(target) - path = get_path_to(src, TL, /turf/proc/Distance_cardinal, 0, 30, id=access_card,simulated_only = FALSE) + path = get_path_to(src, TL, 30, id=access_card,simulated_only = FALSE) else - path = get_path_to(src, target, /turf/proc/Distance_cardinal, 0, 30, id=access_card,simulated_only = FALSE) + path = get_path_to(src, target, 30, id=access_card,simulated_only = FALSE) if(!bot_move(target)) add_to_ignore(target) @@ -292,7 +292,7 @@ result = F if(REPLACE_TILE) F = scan_target - if(isfloorturf(F) && !isplatingturf(F)) //The floor must already have a tile. + if(isfloorturf(F) && !isplatingturf(F) && F.type != initial(tiletype.turf_type)) //The floor must already have a tile. result = F if(FIX_TILE) //Selects only damaged floors. F = scan_target @@ -330,30 +330,35 @@ else var/turf/open/floor/F = target_turf - if(F.type != initial(tiletype.turf_type) && (F.broken || F.burnt || isplatingturf(F)) || F.type == (initial(tiletype.turf_type) && (F.broken || F.burnt))) - anchored = TRUE - icon_state = "[toolbox_color]floorbot-c" - mode = BOT_REPAIRING - visible_message("[src] begins repairing the floor.") - sleep(50) - if(mode == BOT_REPAIRING && F && src.loc == F) - F.broken = FALSE - F.burnt = FALSE - F.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) - - if(replacetiles && F.type != initial(tiletype.turf_type) && specialtiles && !isplatingturf(F)) - anchored = TRUE - icon_state = "[toolbox_color]floorbot-c" - mode = BOT_REPAIRING - visible_message("[src] begins replacing the floor tiles.") - sleep(50) - if(mode == BOT_REPAIRING && F && src.loc == F) - F.broken = FALSE - F.burnt = FALSE - F.PlaceOnTop(initial(tiletype.turf_type), flags = CHANGETURF_INHERIT_AIR) - specialtiles -= 1 - if(specialtiles == 0) - speak("Requesting refill of custom floortiles to continue replacing.") + switch(process_type) // Other process types have no business here + if(REPLACE_TILE) + if(!isplatingturf(F) && F.type != initial(tiletype.turf_type)) + anchored = TRUE + icon_state = "[toolbox_color]floorbot-c" + mode = BOT_REPAIRING + visible_message("[src] begins replacing the floor tiles.") + F.make_plating() + sleep(50) + if(mode == BOT_REPAIRING && F && src.loc == F && isplatingturf(F)) + F.broken = FALSE + F.burnt = FALSE + F.PlaceOnTop(initial(tiletype.turf_type), flags = CHANGETURF_INHERIT_AIR) + specialtiles -= 1 + if(specialtiles == 0) + speak("Requesting refill of custom floor tiles to continue replacing.") + if(PLACE_TILE, FIX_TILE) + if(isplatingturf(F) || F.broken || F.burnt) + anchored = TRUE + icon_state = "[toolbox_color]floorbot-c" + mode = BOT_REPAIRING + visible_message("[src] begins repairing the floor.") + sleep(50) + if(mode == BOT_REPAIRING && F && src.loc == F) + F.broken = FALSE + F.burnt = FALSE + if(isplatingturf(F)) + F.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) + mode = BOT_IDLE update_icon() anchored = FALSE diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 09abbb9d4db85..73bd2b5883141 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -96,7 +96,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, "[auto_patrol ? "On" : "Off"]" ) return dat -/mob/living/simple_animal/bot/honkbot/proc/judgement_criteria() +/mob/living/simple_animal/bot/honkbot/proc/judgment_criteria() var/final = NONE if(check_records) final = final|JUDGE_RECORDCHECK @@ -105,8 +105,8 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, return final /mob/living/simple_animal/bot/honkbot/proc/retaliate(mob/living/carbon/human/H) - var/judgement_criteria = judgement_criteria() - threatlevel = H.assess_threat(judgement_criteria) + var/judgment_criteria = judgment_criteria() + threatlevel = H.assess_threat(judgment_criteria) threatlevel += 6 if(threatlevel >= 4) target = H @@ -159,8 +159,9 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, if(istype(AM, /obj/item)) playsound(src, honksound, 50, TRUE, -1) var/obj/item/I = AM - if(I.throwforce < health && I.thrownby && (istype(I.thrownby, /mob/living/carbon/human))) - var/mob/living/carbon/human/H = I.thrownby + var/mob/thrown_by = I.thrownby?.resolve() + if(I.throwforce < health && thrown_by && (istype(thrown_by, /mob/living/carbon/human))) + var/mob/living/carbon/human/H = thrown_by retaliate(H) ..() @@ -200,8 +201,8 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, if(client) //prevent spam from players.. spam_flag = TRUE if (emagged <= 1) //HONK once, then leave - var/judgement_criteria = judgement_criteria() - threatlevel = H.assess_threat(judgement_criteria) + var/judgment_criteria = judgment_criteria() + threatlevel = H.assess_threat(judgment_criteria) threatlevel -= 6 target = oldtarget_name else // you really don't want to hit an emagged honkbot @@ -296,13 +297,11 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, if((C.name == oldtarget_name) && (world.time < last_found + 100)) continue - var/judgement_criteria = judgement_criteria() - threatlevel = C.assess_threat(judgement_criteria) + var/judgment_criteria = judgment_criteria() + threatlevel = C.assess_threat(judgment_criteria) - if(threatlevel <= 3) - if(C in view(4,src)) //keep the range short for patrolling - if(!spam_flag) - bike_horn() + if(threatlevel <= 3 && get_dist(C, src) <= 4 && !spam_flag) + bike_horn() else if(threatlevel >= 10) bike_horn() //just spam the shit outta this diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index d500b8fc9a4e2..eae383f1d2736 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -276,10 +276,10 @@ GLOBAL_VAR(medibot_unique_id_gen) return if(patient && path.len == 0 && (get_dist(src,patient) > 1)) - path = get_path_to(src, get_turf(patient), /turf/proc/Distance_cardinal, 0, 30,id=access_card) + path = get_path_to(src, patient, 30,id=access_card) mode = BOT_MOVING if(!path.len) //try to get closer if you can't reach the patient directly - path = get_path_to(src, get_turf(patient), /turf/proc/Distance_cardinal, 0, 30,1,id=access_card) + path = get_path_to(src, patient, 30,1,id=access_card) if(!path.len) //Do not chase a patient we cannot reach. soft_reset() @@ -306,7 +306,7 @@ GLOBAL_VAR(medibot_unique_id_gen) //Time to see if they need medical help! if(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_FAKEDEATH))) return FALSE //welp too late for them! - + var/can_inject = FALSE for(var/X in C.bodyparts) var/obj/item/bodypart/part = X @@ -332,7 +332,7 @@ GLOBAL_VAR(medibot_unique_id_gen) 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 && isclothing(H.wear_suit) && isclothing(H.head)) var/obj/item/clothing/CS = H.wear_suit var/obj/item/clothing/CH = H.head if (CS.clothing_flags & CH.clothing_flags & THICKMATERIAL) @@ -423,6 +423,8 @@ GLOBAL_VAR(medibot_unique_id_gen) var/obj/item/storage/firstaid/FA = firstaid if(treatment_method == initial(FA.damagetype_healed)) //using the damage specific medkits give bonuses when healing this type of damage. healies *= 1.5 + if(treatment_method == TOX && HAS_TRAIT(patient, TRAIT_TOXINLOVER)) + healies *= -1.5 if(emagged == 2) patient.reagents.add_reagent(/datum/reagent/toxin/chloralhydrate, 5) patient.apply_damage_type((healies*1),treatment_method) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 092369c789061..4af0591aa84b9 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -20,6 +20,7 @@ damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) a_intent = INTENT_HARM //No swapping buckle_lying = 0 + buckle_prevents_pull = TRUE // No pulling loaded shit mob_size = MOB_SIZE_LARGE radio_key = /obj/item/encryptionkey/headset_cargo @@ -50,6 +51,8 @@ var/obj/item/stock_parts/cell/cell var/bloodiness = 0 + ///The amount of steps we should take until we rest for a time. + var/num_steps = 0 /mob/living/simple_animal/bot/mulebot/Initialize() . = ..() @@ -101,7 +104,7 @@ cell.forceMove(loc) cell = null visible_message("[user] crowbars out the power cell from [src].", - "You pry the powercell out of [src].") + "You pry the power cell out of [src].") else if(is_wire_tool(I) && open) return attack_hand(user) else if(load && ismob(load)) // chance to knock off rider @@ -177,6 +180,7 @@ if(!ui) ui = new(user, src, "Mule") ui.open() + ui.set_autoupdate(TRUE) // Cell charge, modeStatus /mob/living/simple_animal/bot/mulebot/ui_data(mob/user) var/list/data = list() @@ -223,8 +227,7 @@ return . = TRUE else - bot_control(action, usr, params) // Kill this later. - . = TRUE + . = bot_control(action, usr, params) // Kill this later. /mob/living/simple_animal/bot/mulebot/bot_control(command, mob/user, list/params = list(), pda = FALSE) if(pda && wires.is_cut(WIRE_RX)) // MULE wireless is controlled by wires. @@ -234,12 +237,15 @@ if("stop") if(mode >= BOT_DELIVER) bot_reset() + . = TRUE if("go") if(mode == BOT_IDLE) start() + . = TRUE if("home") if(mode == BOT_IDLE || mode == BOT_DELIVER) start_home() + . = TRUE if("destination") var/new_dest if(pda) @@ -248,6 +254,7 @@ new_dest = params["value"] if(new_dest) set_destination(new_dest) + . = TRUE if("setid") var/new_id if(pda) @@ -256,6 +263,7 @@ new_id = params["value"] if(new_id) set_id(new_id) + . = TRUE if("sethome") var/new_home if(pda) @@ -264,20 +272,26 @@ new_home = params["value"] if(new_home) home_destination = new_home + . = TRUE if("unload") if(load && mode != BOT_HUNT) if(loc == target) unload(loaddir) else unload(0) + . = TRUE if("autoret") auto_return = !auto_return + . = TRUE if("autopick") auto_pickup = !auto_pickup + . = TRUE if("report") report_delivery = !report_delivery + . = TRUE if("ejectpai") ejectpairemote(user) + . = TRUE // TODO: remove this; PDAs currently depend on it /mob/living/simple_animal/bot/mulebot/get_controls(mob/user) @@ -457,25 +471,16 @@ return if(on) var/speed = (wires.is_cut(WIRE_MOTOR1) ? 0 : 1) + (wires.is_cut(WIRE_MOTOR2) ? 0 : 2) - var/num_steps = 0 - switch(speed) - if(0) - // do nothing - if(1) - num_steps = 10 - if(2) - num_steps = 5 - if(3) - num_steps = 3 - - if(num_steps) - process_bot() - num_steps-- - if(mode != BOT_IDLE) - var/process_timer = addtimer(CALLBACK(src, .proc/process_bot), 2, TIMER_LOOP|TIMER_STOPPABLE) - addtimer(CALLBACK(GLOBAL_PROC, /proc/deltimer, process_timer), (num_steps*2) + 1) - -/mob/living/simple_animal/bot/mulebot/proc/process_bot() + if(!speed)//Devide by zero man bad + return + num_steps = round(10/speed) //10, 5, or 3 steps, depending on how many wires we have cut + if(mode != BOT_IDLE) + START_PROCESSING(SSfastprocess, src) + +/mob/living/simple_animal/bot/mulebot/process() + if(num_steps <= 0) + return PROCESS_KILL + num_steps-- if(!on || client) return update_icon() @@ -574,7 +579,7 @@ // calculates a path to the current destination // given an optional turf to avoid /mob/living/simple_animal/bot/mulebot/calc_path(turf/avoid = null) - path = get_path_to(src, target, /turf/proc/Distance_cardinal, 0, 250, id=access_card, exclude=avoid) + path = get_path_to(src, target, 250, id=access_card, exclude=avoid) // sets the current destination // signals all beacons matching the delivery code @@ -748,6 +753,12 @@ else return null +/mob/living/simple_animal/bot/mulebot/remove_air_ratio(ratio) + if(loc) + return loc.remove_air_ratio(ratio) + else + return null + /mob/living/simple_animal/bot/mulebot/resist() ..() if(load) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 8535f21b69344..cbb130e619a10 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -21,7 +21,7 @@ data_hud_type = DATA_HUD_SECURITY_ADVANCED path_image_color = "#FF0000" - var/noloot = TRUE + var/noloot = FALSE var/baton_type = /obj/item/melee/baton var/mob/living/carbon/target var/oldtarget_name @@ -152,14 +152,14 @@ Auto Patrol: []"}, update_controls() /mob/living/simple_animal/bot/secbot/proc/retaliate(mob/living/carbon/human/H) - var/judgement_criteria = judgement_criteria() - threatlevel = H.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) + var/judgment_criteria = judgment_criteria() + threatlevel = H.assess_threat(judgment_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) threatlevel += 6 if(threatlevel >= 4) target = H mode = BOT_HUNT -/mob/living/simple_animal/bot/secbot/proc/judgement_criteria() +/mob/living/simple_animal/bot/secbot/proc/judgment_criteria() var/final = FALSE if(idcheck) final = final|JUDGE_IDCHECK @@ -223,8 +223,9 @@ Auto Patrol: []"}, /mob/living/simple_animal/bot/secbot/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(istype(AM, /obj/item)) var/obj/item/I = AM - if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby)) - var/mob/living/carbon/human/H = I.thrownby + var/mob/thrown_by = I.thrownby?.resolve() + if(I.throwforce < src.health && thrown_by && ishuman(thrown_by)) + var/mob/living/carbon/human/H = thrown_by retaliate(H) ..() @@ -249,7 +250,7 @@ Auto Patrol: []"}, var/mob/living/carbon/human/H = C if(H.check_shields(src, 0)) return - var/judgement_criteria = judgement_criteria() + var/judgment_criteria = judgment_criteria() playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1) icon_state = "[initial(icon_state)]-c" addtimer(CALLBACK(src, /atom/.proc/update_icon), 2) @@ -258,11 +259,11 @@ Auto Patrol: []"}, C.stuttering = 5 C.Paralyze(100) var/mob/living/carbon/human/H = C - threat = H.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) + threat = H.assess_threat(judgment_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) else C.Paralyze(100) C.stuttering = 5 - threat = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) + threat = C.assess_threat(judgment_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) log_combat(src,C,"stunned") if(declare_arrests) @@ -376,7 +377,7 @@ Auto Patrol: []"}, /mob/living/simple_animal/bot/secbot/proc/look_for_perp() anchored = FALSE - var/judgement_criteria = judgement_criteria() + var/judgment_criteria = judgment_criteria() for (var/mob/living/carbon/C in view(7,src)) //Let's find us a criminal if((C.stat) || (C.handcuffed)) continue @@ -384,7 +385,7 @@ Auto Patrol: []"}, if((C.name == oldtarget_name) && (world.time < last_found + 100)) continue - threatlevel = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) + threatlevel = C.assess_threat(judgment_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) if(!threatlevel) continue diff --git a/code/modules/mob/living/simple_animal/cluwne.dm b/code/modules/mob/living/simple_animal/cluwne.dm index 90cb4b959356f..a0d8605d8e658 100644 --- a/code/modules/mob/living/simple_animal/cluwne.dm +++ b/code/modules/mob/living/simple_animal/cluwne.dm @@ -17,7 +17,8 @@ health = 150 speak = list("HONK! HONK! HONK! HONK!","AAAAAAAAAAAAAAAAAA!!", "KILLMEKILLME!!", "HONK HENK HONK!!", "Honk Honk!", "HEEEEEEEEEEEEENK!!") do_footstep = TRUE - mobsay_color = "#F37EF6" + chat_color = "#F37EF6" + discovery_points = 1000 /mob/living/simple_animal/cluwne/Initialize() . = ..() diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 38b720013ab59..88ebf90d24188 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -41,8 +41,17 @@ var/can_repair_constructs = FALSE var/can_repair_self = FALSE var/runetype + var/datum/action/innate/cult/create_rune/our_rune var/holy = FALSE - mobsay_color = "#FF6262" + chat_color = "#FF6262" + mobchatspan = "cultmobsay" + discovery_points = 1000 + +/mob/living/simple_animal/hostile/construct/get_num_legs() + return 0 + +/mob/living/simple_animal/hostile/construct/get_num_arms() + return 0 /mob/living/simple_animal/hostile/construct/Initialize() . = ..() @@ -59,11 +68,15 @@ S.action.button.moved = "6:[pos],4:-2" spellnum++ if(runetype) - var/datum/action/innate/cult/create_rune/CR = new runetype(src) - CR.Grant(src) + our_rune = new runetype(src) + our_rune.Grant(src) var/pos = 2+spellnum*31 - CR.button.screen_loc = "6:[pos],4:-2" - CR.button.moved = "6:[pos],4:-2" + our_rune.button.screen_loc = "6:[pos],4:-2" + our_rune.button.moved = "6:[pos],4:-2" + +/mob/living/simple_animal/hostile/construct/Destroy() + QDEL_NULL(our_rune) + return ..() /mob/living/simple_animal/hostile/construct/Login() ..() @@ -133,6 +146,7 @@ environment_smash = ENVIRONMENT_SMASH_WALLS attack_sound = 'sound/weapons/punch3.ogg' status_flags = 0 + move_resist = MOVE_FORCE_STRONG mob_size = MOB_SIZE_LARGE force_threshold = 10 construct_spells = list(/obj/effect/proc_holder/spell/targeted/forcewall/cult, @@ -180,7 +194,7 @@ icon_living = "behemoth_angelic" holy = TRUE loot = list(/obj/item/ectoplasm/angelic) - mobsay_color = "#AED2FF" + chat_color = "#AED2FF" /mob/living/simple_animal/hostile/construct/armored/noncult @@ -234,7 +248,7 @@ icon_living = "floating_angelic" holy = TRUE loot = list(/obj/item/ectoplasm/angelic) - mobsay_color = "#AED2FF" + chat_color = "#AED2FF" /mob/living/simple_animal/hostile/construct/wraith/noncult @@ -317,7 +331,7 @@ icon_state = "artificer_angelic" icon_living = "artificer_angelic" holy = TRUE - mobsay_color = "#AED2FF" + chat_color = "#AED2FF" loot = list(/obj/item/ectoplasm/angelic) construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/noncult/purified, /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser, @@ -441,15 +455,11 @@ background_icon_state = "bg_demon" buttontooltipstyle = "cult" button_icon_state = "cult_mark" - var/mob/living/simple_animal/hostile/construct/harvester/the_construct - -/datum/action/innate/seek_prey/Grant(var/mob/living/C) - the_construct = C - ..() /datum/action/innate/seek_prey/Activate() if(GLOB.cult_narsie == null) return + var/mob/living/simple_animal/hostile/construct/harvester/the_construct = owner if(the_construct.seeking) desc = "None can hide from Nar'Sie, activate to track a survivor attempting to flee the red harvest!" button_icon_state = "cult_mark" diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index ebdae82ebe4cf..4aac0610951e2 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -22,7 +22,7 @@ shoes = /obj/item/clothing/shoes/combat gloves = /obj/item/clothing/gloves/combat ears = /obj/item/radio/headset - mask = /obj/item/clothing/mask/gas + mask = /obj/item/clothing/mask/gas/old head = /obj/item/clothing/head/helmet/swat back = /obj/item/storage/backpack id = /obj/item/card/id/syndicate @@ -110,7 +110,7 @@ shoes = /obj/item/clothing/shoes/jackboots head = /obj/item/clothing/head/bearpelt gloves = /obj/item/clothing/gloves/color/black - mask = /obj/item/clothing/mask/gas + mask = /obj/item/clothing/mask/gas/old @@ -165,7 +165,7 @@ /obj/effect/mob_spawn/human/corpse/nanotrasensoldier - name = "Nanotrasen Private Security Officer" + name = "\improper Nanotrasen Private Security Officer" id_job = "Private Security Force" id_access = "Security Officer" outfit = /datum/outfit/nanotrasensoldiercorpse2 @@ -219,3 +219,111 @@ id = /obj/item/card/id l_pocket = /obj/item/paper/fluff/bee_objectives mask = /obj/item/clothing/mask/rat/bee + +/obj/effect/mob_spawn/human/corpse/sniper + name = "Sniper" + outfit = /datum/outfit/sniper + skin_tone = "caucasian1" + hair_style = "Bald" + facial_hair_style = "Full beard" + id_job = "Warden" + mob_gender = MALE + +/datum/outfit/sniper + name = "Sniper" + 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 + belt = /obj/item/storage/belt/military/assault + mask = /obj/item/clothing/mask/cigarette/cigar + head = /obj/item/clothing/head/beret/corpwarden + glasses = /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch + back = /obj/item/storage/backpack/satchel/sec + id = /obj/item/card/id/job/warden + +/obj/effect/mob_spawn/human/corpse/psychost + name = "Psycho" + hair_style = "Bald" + facial_hair_style = "Shaved" + skin_tone = "caucasian1" + brute_damage = 100 + outfit = /datum/outfit/straightjacket + +/datum/outfit/straightjacket + name = "Straight jacket" + suit = /obj/item/clothing/suit/straight_jacket + +/obj/effect/mob_spawn/human/corpse/psychost/muzzle + name = "Muzzled psycho" + outfit = /datum/outfit/straightmuz + +/datum/outfit/straightmuz + name = "Straight jacket and a muzzle" + suit = /obj/item/clothing/suit/straight_jacket + mask = /obj/item/clothing/mask/muzzle + +/obj/effect/mob_spawn/human/corpse/psychost/trap + name = "Trapped psycho" + outfit = /datum/outfit/straighttrap + +/datum/outfit/straighttrap + name = "Straight jacket and a reverse bear trap" + suit = /obj/item/clothing/suit/straight_jacket + head = /obj/item/reverse_bear_trap + +/obj/effect/mob_spawn/human/corpse/heavy + name = "Heavy gunner" + brute_damage = 300 + hair_style = "Bald" + facial_hair_style = "Shaved" + mob_gender = MALE + skin_tone = "caucasian1" + outfit = /datum/outfit/minigunheavy + +/datum/outfit/minigunheavy + name = "Heavy gunner" + uniform = /obj/item/clothing/under/rank/security/head_of_security/alt + shoes = /obj/item/clothing/shoes/combat/swat + gloves = /obj/item/clothing/gloves/combat + mask = /obj/item/clothing/mask/gas/sechailer/swat/emagged + suit = /obj/item/clothing/suit/armor/heavy + back = /obj/item/minigunpack + head = /obj/item/clothing/head/helmet/swat + +/obj/effect/mob_spawn/human/corpse/zombie + name = "zombie" + mob_species = /datum/species/zombie + brute_damage = 100 + +/obj/effect/mob_spawn/human/corpse/suicidezombie + mob_species = /datum/species/zombie + brute_damage = 100 + outfit = /datum/outfit/suicidezombie + +/datum/outfit/suicidezombie + name = "Guy with a grenade" + mask = /obj/item/clothing/mask/gas/cyborg + uniform = /obj/item/clothing/under/pants/camo + belt = /obj/item/storage/belt/bandolier + shoes = /obj/item/clothing/shoes/combat + +/obj/effect/mob_spawn/human/corpse/facboss + name = "Factory boss" + mob_species = /datum/species/ipc + brute_damage = 800 + burn_damage = 100 + hair_style = "Crewcut" + facial_hair_style = "Shaved" + skin_tone = "caucasian1" + mob_gender = MALE + outfit = /datum/outfit/facboss + +/datum/outfit/facboss + name = "The head of The Factory" + glasses = /obj/item/clothing/glasses/hud/terminator + uniform = /obj/item/clothing/under/syndicate + suit = /obj/item/clothing/suit/jacket/leather + shoes = /obj/item/clothing/shoes/combat/swat + gloves = /obj/item/clothing/gloves/fingerless + id = /obj/item/card/id/gold diff --git a/code/modules/mob/living/simple_animal/eldritch_demons.dm b/code/modules/mob/living/simple_animal/eldritch_demons.dm index 82072b8f88ec0..ca4b5d813136a 100644 --- a/code/modules/mob/living/simple_animal/eldritch_demons.dm +++ b/code/modules/mob/living/simple_animal/eldritch_demons.dm @@ -30,6 +30,8 @@ simple_mob_flags = SILENCE_RANGED_MESSAGE ///Innate spells that are supposed to be added when a beast is created var/list/spells_to_add + mobchatspan = "cultmobsay" + discovery_points = 2000 /mob/living/simple_animal/hostile/eldritch/Initialize() . = ..() @@ -85,6 +87,7 @@ return TRUE /mob/living/simple_animal/hostile/eldritch/raw_prophet/proc/unlink_mob(mob/living/mob_linked) + SIGNAL_HANDLER if(!linked_mobs[mob_linked]) return @@ -93,7 +96,7 @@ action.Remove(mob_linked) qdel(action) to_chat(mob_linked, "Your mind shatters as the [src]'s Mansus Link leaves your mind.") - mob_linked.emote("Scream") + INVOKE_ASYNC(mob_linked, .proc/emote, "scream") //micro stun mob_linked.AdjustParalyzed(0.5 SECONDS) linked_mobs -= mob_linked @@ -157,7 +160,7 @@ current.icon_state = "armsy_mid" current.icon_living = "armsy_mid" current.front = src - current.AIStatus = AI_OFF + current.toggle_ai(AI_OFF) back = current else if(i < len) current = new type(drop_location(),FALSE) @@ -165,12 +168,12 @@ prev.icon_state = "armsy_mid" prev.icon_living = "armsy_mid" prev.front = next - prev.AIStatus = AI_OFF + prev.toggle_ai(AI_OFF) else prev.icon_state = "armsy_end" prev.icon_living = "armsy_end" prev.front = next - prev.AIStatus = AI_OFF + prev.toggle_ai(AI_OFF) next = prev //we are literally a vessel of otherworldly destruction, we bring our own gravity unto this plane @@ -190,6 +193,8 @@ ///Updates the next mob in the chain to move to our last location, fixed the worm if somehow broken. /mob/living/simple_animal/hostile/eldritch/armsy/proc/update_chain_links() + SIGNAL_HANDLER + gib_trail() if(back && back.loc != oldloc) back.Move(oldloc) @@ -232,13 +237,13 @@ prev.icon_state = "armsy_end" prev.icon_living = "armsy_end" prev.front = src - prev.AIStatus = AI_OFF + prev.toggle_ai(AI_OFF) current_stacks = 0 return /mob/living/simple_animal/hostile/eldritch/armsy/Shoot(atom/targeted_atom) - target = targeted_atom + GiveTarget(targeted_atom) AttackingTarget() @@ -250,7 +255,7 @@ if(target == back || target == front) return if(back) - back.target = target + back.GiveTarget(target) back.AttackingTarget() if(!Adjacent(target)) return diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm index 8ac7c088feced..271265b67ea23 100644 --- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm +++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm @@ -27,7 +27,7 @@ /mob/living/simple_animal/butterfly/Initialize() . = ..() var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) - mobsay_color = newcolor + chat_color = newcolor add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) /mob/living/simple_animal/butterfly/bee_friendly() diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 696a932e9e254..d3a2a1ce2acc2 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -32,25 +32,15 @@ gold_core_spawnable = FRIENDLY_SPAWN collar_type = "cat" can_be_held = TRUE + worn_slot_flags = ITEM_SLOT_HEAD held_state = "cat2" - mobsay_color = "#FFD586" + chat_color = "#FFD586" do_footstep = TRUE /mob/living/simple_animal/pet/cat/Initialize() . = ..() - verbs += /mob/living/proc/lay_down - -/mob/living/simple_animal/pet/cat/update_mobility() - ..() - if(client && stat != DEAD) - if (resting) - icon_state = "[icon_living]_rest" - collar_type = "[initial(collar_type)]_rest" - else - icon_state = "[icon_living]" - collar_type = "[initial(collar_type)]" - regenerate_icons() + add_verb(/mob/living/proc/lay_down) /mob/living/simple_animal/pet/cat/space name = "space cat" @@ -171,45 +161,56 @@ gold_core_spawnable = NO_SPAWN unique_pet = TRUE -/mob/living/simple_animal/pet/cat/Life() - if(!stat && !buckled && !client) - if(prob(1)) - emote("me", 1, pick("stretches out for a belly rub.", "wags its tail.", "lies down.")) +/mob/living/simple_animal/pet/cat/Move() + . = ..() + if(.) + if(stat || resting || buckled) + return . + + for(var/mob/living/simple_animal/mouse/M in get_turf(src)) + if(!M.stat) + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, "splats \the [M]!") + M.splat() + movement_target = null + stop_automated_movement = 0 + break + for(var/obj/item/toy/cattoy/T in get_turf(src)) + if (T.cooldown < (world.time - 400)) + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, "bats \the [T] around with its paw!") + T.cooldown = world.time + +/mob/living/simple_animal/pet/cat/update_resting() + . = ..() + if(stat != DEAD) + if (resting) icon_state = "[icon_living]_rest" collar_type = "[initial(collar_type)]_rest" - set_resting(TRUE) - else if (prob(1)) - emote("me", 1, pick("sits down.", "crouches on its hind legs.", "looks alert.")) - icon_state = "[icon_living]_sit" - collar_type = "[initial(collar_type)]_sit" - set_resting(TRUE) - else if (prob(1)) - if (resting) - emote("me", 1, pick("gets up and meows.", "walks around.", "stops resting.")) - icon_state = "[icon_living]" - collar_type = "[initial(collar_type)]" - set_resting(FALSE) - else - emote("me", 1, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat.")) + else + icon_state = "[icon_living]" + collar_type = "[initial(collar_type)]" - //MICE! - if((src.loc) && isturf(src.loc)) - if(!stat && !resting && !buckled) - for(var/mob/living/simple_animal/mouse/M in view(1,src)) - if(!M.stat && Adjacent(M)) - emote("me", 1, "splats \the [M]!") - M.splat() - movement_target = null - stop_automated_movement = 0 - break - for(var/obj/item/toy/cattoy/T in view(1,src)) - if (T.cooldown < (world.time - 400)) - emote("me", 1, "bats \the [T] around with its paw!") - T.cooldown = world.time +/mob/living/simple_animal/pet/cat/Life() + if(!stat && !buckled && !client) + if(prob(3)) + switch(rand(1, 3)) + if (1) + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, pick("stretches out for a belly rub.", "wags its tail.", "lies down.")) + set_resting(TRUE) + if (2) + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, pick("sits down.", "crouches on its hind legs.", "looks alert.")) + set_resting(TRUE) + icon_state = "[icon_living]_sit" + collar_type = "[initial(collar_type)]_sit" + if (3) + if (resting) + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, pick("gets up and meows.", "walks around.", "stops resting.")) + set_resting(FALSE) + else + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat.")) ..() - - make_babies() + if(next_scan_time <= world.time) + make_babies() if(!stat && !resting && !buckled) turns_since_scan++ @@ -219,11 +220,11 @@ if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) )) movement_target = null stop_automated_movement = 0 - if( !movement_target || !(movement_target.loc in oview(src, 3)) ) + if(!movement_target || !(src in viewers(3, movement_target.loc))) movement_target = null stop_automated_movement = 0 - for(var/mob/living/simple_animal/mouse/snack in oview(src,3)) - if(isturf(snack.loc) && !snack.stat) + for(var/mob/living/simple_animal/mouse/snack in oview(3, src)) + if(!snack.stat) movement_target = snack break if(movement_target) @@ -234,22 +235,21 @@ . = ..() switch(M.a_intent) if("help") - wuv(1, M) + wuv(TRUE, M) if("harm") - wuv(-1, M) + wuv(FALSE, M) /mob/living/simple_animal/pet/cat/proc/wuv(change, mob/M) if(change) - if(change > 0) - if(M && stat != DEAD) - new /obj/effect/temp_visual/heart(loc) - emote("me", 1, "purrs!") - if(flags_1 & HOLOGRAM_1) - return - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, src, /datum/mood_event/pet_animal, src) - else - if(M && stat != DEAD) - emote("me", 1, "hisses!") + if(M && stat != DEAD) + new /obj/effect/temp_visual/heart(loc) + emote("me", 1, "purrs!") + if(flags_1 & HOLOGRAM_1) + return + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, src, /datum/mood_event/pet_animal, src) + else + if(M && stat != DEAD) + emote("me", 1, "hisses!") /mob/living/simple_animal/pet/cat/cak //I told you I'd do it, Remie name = "Keeki" @@ -289,9 +289,13 @@ return if(health < maxHealth) adjustBruteLoss(-8) //Fast life regen - for(var/obj/item/reagent_containers/food/snacks/donut/D in range(1, src)) //Frosts nearby donuts! - if(!D.is_decorated) - D.decorate_donut() + +/mob/living/simple_animal/pet/cat/cak/Move() + . = ..() + if(. && !stat) + for(var/obj/item/reagent_containers/food/snacks/donut/D in get_turf(src)) //Frosts nearby donuts! + if(!D.is_decorated) + D.decorate_donut() /mob/living/simple_animal/pet/cat/cak/attack_hand(mob/living/L) ..() @@ -309,3 +313,12 @@ collar_type = null held_state = "breadcat" butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2, /obj/item/organ/ears/cat = 1, /obj/item/organ/tail/cat = 1, /obj/item/reagent_containers/food/snacks/breadslice/plain = 1) + +/mob/living/simple_animal/pet/cat/halal + name = "arabian cat" + desc = "It's a cat with Agal on his head." + gender = MALE + icon_state = "cathalal" + icon_living = "cathalal" + collar_type = null + held_state = "cathalal" diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index e224fa924f2a0..cc81d503d8e41 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -25,8 +25,8 @@ verb_exclaim = "chitters loudly" verb_yell = "chitters loudly" var/squish_chance = 50 - del_on_death = 1 - mobsay_color = "#BC7658" + del_on_death = TRUE + chat_color = "#BC7658" /mob/living/simple_animal/cockroach/death(gibbed) if(SSticker.mode && SSticker.mode.station_was_nuked) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 958f61a2bbccb..c77f36b3b5673 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -20,8 +20,13 @@ var/obj/item/inventory_head var/obj/item/inventory_mask gold_core_spawnable = FRIENDLY_SPAWN - mobsay_color = "#FFA656" + chat_color = "#FFA656" + mobchatspan = "blob" hardattacks = TRUE//claws + can_be_held = TRUE + worn_slot_flags = ITEM_SLOT_HEAD + head_icon = 'icons/mob/pets_held.dmi' + held_state = "crab" /mob/living/simple_animal/crab/Life() ..() @@ -58,6 +63,7 @@ response_disarm = "shoves" response_harm = "stomps" gold_core_spawnable = HOSTILE_SPAWN + held_state = "evilcrab" /mob/living/simple_animal/crab/kreb name = "Kreb" diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 3ec5f03d5ef96..324b9d2f1e928 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -13,8 +13,10 @@ see_in_dark = 5 speak_chance = 1 turns_per_move = 10 + ai_controller = /datum/ai_controller/dog can_be_held = TRUE - mobsay_color = "#ECDA88" + chat_color = "#ECDA88" + mobchatspan = "corgi" do_footstep = TRUE @@ -35,6 +37,7 @@ held_state = "corgi" var/obj/item/inventory_head var/obj/item/inventory_back + worn_slot_flags = ITEM_SLOT_HEAD var/shaved = FALSE var/nofur = FALSE //Corgis that have risen past the material plane of existence. @@ -65,9 +68,11 @@ icon_dead = "pug_dead" butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/pug = 3) gold_core_spawnable = FRIENDLY_SPAWN + worn_slot_flags = ITEM_SLOT_HEAD collar_type = "pug" held_state = "pug" + /mob/living/simple_animal/pet/dog/bullterrier name = "\improper bull terrier" real_name = "bull terrier" @@ -78,8 +83,10 @@ icon_dead = "bullterrier_dead" butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi = 3) // Would feel redundant to add more new dog meats. gold_core_spawnable = FRIENDLY_SPAWN + worn_slot_flags = ITEM_SLOT_HEAD //by popular demand collar_type = "bullterrier" held_state = "bullterrier" + head_icon = 'icons/mob/pets_held_large.dmi' /mob/living/simple_animal/pet/dog/bullterrier/walter name = "Walter" @@ -99,13 +106,13 @@ icon_dead = "corgigrey_dead" animal_species = /mob/living/simple_animal/pet/dog/corgi/exoticcorgi nofur = TRUE + worn_slot_flags = null /mob/living/simple_animal/pet/dog/Initialize() . = ..() var/dog_area = get_area(src) for(var/obj/structure/bed/dogbed/D in dog_area) - if(!D.owner) - D.update_owner(src) + if(D.update_owner(src)) //No muscling in on my turf you fucking parrot break /mob/living/simple_animal/pet/dog/corgi/Initialize() @@ -141,16 +148,16 @@ if(def_zone) if(def_zone == BODY_ZONE_HEAD) if(inventory_head) - armorval = inventory_head.armor.getRating(type) + armorval = inventory_head.get_armor_rating(type, src) else if(inventory_back) - armorval = inventory_back.armor.getRating(type) + armorval = inventory_back.get_armor_rating(type, src) return armorval else if(inventory_head) - armorval += inventory_head.armor.getRating(type) + armorval += inventory_head.get_armor_rating(type, src) if(inventory_back) - armorval += inventory_back.armor.getRating(type) + armorval += inventory_back.get_armor_rating(type, src) return armorval*0.5 /mob/living/simple_animal/pet/dog/corgi/attackby(obj/item/O, mob/user, params) @@ -277,7 +284,7 @@ //Many hats added, Some will probably be removed, just want to see which ones are popular. // > some will probably be removed -/mob/living/simple_animal/pet/dog/corgi/proc/place_on_head(obj/item/item_to_add, mob/user) +/mob/living/simple_animal/pet/dog/corgi/proc/place_on_head(obj/item/item_to_add, mob/user, drop = TRUE) if(istype(item_to_add, /obj/item/grenade/plastic)) // last thing he ever wears, I guess item_to_add.afterattack(src,user,1) @@ -317,7 +324,8 @@ regenerate_icons() else to_chat(user, "You set [item_to_add] on [src]'s head, but it falls off!") - item_to_add.forceMove(drop_location()) + if (drop) + item_to_add.forceMove(drop_location()) if(prob(25)) step_rand(item_to_add) for(var/i in list(1,2,4,8,4,8,4,dir)) @@ -363,6 +371,8 @@ var/record_age = 1 var/memory_saved = FALSE var/saved_head //path + worn_slot_flags = ITEM_SLOT_HEAD + /mob/living/simple_animal/pet/dog/corgi/Ian/Initialize() . = ..() @@ -372,11 +382,7 @@ if(age == 0) var/turf/target = get_turf(loc) if(target) - var/mob/living/simple_animal/pet/dog/corgi/puppy/P = new /mob/living/simple_animal/pet/dog/corgi/puppy(target) - P.name = "Ian" - P.real_name = "Ian" - P.gender = MALE - P.desc = "It's the HoP's beloved corgi puppy." + new /mob/living/simple_animal/pet/dog/corgi/puppy/Ian(target) Write_Memory(FALSE) return INITIALIZE_HINT_QDEL else if(age == record_age) @@ -451,10 +457,10 @@ if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) )) movement_target = null stop_automated_movement = 0 - if( !movement_target || !(movement_target.loc in oview(src, 3)) ) + if(!movement_target || !(src in viewers(3, movement_target.loc))) movement_target = null stop_automated_movement = 0 - for(var/obj/item/reagent_containers/food/snacks/S in oview(src,3)) + for(var/obj/item/reagent_containers/food/snacks/S in oview(3, src)) if(isturf(S.loc) || ishuman(S.loc)) movement_target = S break @@ -488,10 +494,10 @@ movement_target.attack_animal(src) else if(ishuman(movement_target.loc) ) if(prob(20)) - emote("me", 1, "stares at [movement_target.loc]'s [movement_target] with a sad puppy-face") + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, "stares at [movement_target.loc]'s [movement_target] with a sad puppy-face") if(prob(1)) - emote("me", 1, pick("dances around.","chases its tail!")) + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, pick("dances around.","chases its tail!")) spawn(0) for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) setDir(i) @@ -514,11 +520,12 @@ nofur = TRUE unique_pet = TRUE held_state = "narsian" + worn_slot_flags = null /mob/living/simple_animal/pet/dog/corgi/narsie/Life() ..() - for(var/mob/living/simple_animal/pet/P in range(1, src)) - if(P != src && !istype(P,/mob/living/simple_animal/pet/dog/corgi/narsie)) + for(var/mob/living/simple_animal/pet/P in ohearers(1, src)) + if(!istype(P,/mob/living/simple_animal/pet/dog/corgi/narsie)) visible_message("[src] devours [P]!", \ "DELICIOUS SOULS") playsound(src, 'sound/magic/demon_attack1.ogg', 75, TRUE) @@ -597,6 +604,7 @@ pass_flags = PASSMOB mob_size = MOB_SIZE_SMALL collar_type = "puppy" + worn_slot_flags = ITEM_SLOT_HEAD //puppies cannot wear anything. /mob/living/simple_animal/pet/dog/corgi/puppy/Topic(href, href_list) @@ -605,6 +613,12 @@ return ..() +/mob/living/simple_animal/pet/dog/corgi/puppy/Ian + name = "Ian" + real_name = "Ian" + gender = MALE + desc = "It's the HoP's beloved corgi puppy." + /mob/living/simple_animal/pet/dog/corgi/puppy/void //Tribute to the corgis born in nullspace name = "\improper void puppy" @@ -618,6 +632,11 @@ minbodytemp = TCMB maxbodytemp = T0C + 40 held_state = "void_puppy" + worn_slot_flags = ITEM_SLOT_HEAD + +/mob/living/simple_animal/pet/dog/corgi/puppy/void/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_AI_BAGATTACK, INNATE_TRAIT) /mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0) return 1 //Void puppies can navigate space. @@ -638,6 +657,7 @@ response_disarm = "bops" response_harm = "kicks" held_state = "lisa" + worn_slot_flags = ITEM_SLOT_HEAD var/turns_since_scan = 0 var/puppies = 0 @@ -651,11 +671,12 @@ /mob/living/simple_animal/pet/dog/corgi/Lisa/Life() ..() - make_babies() + if(next_scan_time <= world.time) + make_babies() if(!stat && !resting && !buckled) if(prob(1)) - emote("me", 1, pick("dances around.","chases her tail.")) + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, pick("dances around.","chases her tail.")) spawn(0) for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) setDir(i) @@ -666,7 +687,7 @@ if(!stat && !resting && !buckled) if(prob(1)) - emote("me", 1, pick("chases its tail.")) + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, pick("chases its tail.")) spawn(0) for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) setDir(i) @@ -676,17 +697,16 @@ . = ..() switch(M.a_intent) if("help") - wuv(1,M) + wuv(TRUE, M) if("harm") - wuv(-1,M) + wuv(FALSE, M) /mob/living/simple_animal/pet/dog/proc/wuv(change, mob/M) if(change) - if(change > 0) - if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454 - new /obj/effect/temp_visual/heart(loc) - emote("me", 1, "yaps happily!") - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, src, /datum/mood_event/pet_animal, src) - else - if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case) - emote("me", 1, "growls!") + if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454 + new /obj/effect/temp_visual/heart(loc) + emote("me", 1, "yaps happily!") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, src, /datum/mood_event/pet_animal, src) + else + if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case) + emote("me", 1, "growls!") 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 c1eea4de46aa3..a73b5f7ecd24e 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -25,7 +25,7 @@ health = 30 maxHealth = 30 unsuitable_atmos_damage = 0 - wander = 0 + wander = FALSE speed = 0 ventcrawler = VENTCRAWLER_ALWAYS healable = 0 @@ -78,7 +78,7 @@ " - Interacting with non-living beings (dragging bodies, looting bodies, etc.)\n"+\ "These rules are at admin discretion and will be heavily enforced.\n"+\ "If you do not have the regular drone laws, follow your laws to the best of your ability." - mobsay_color = "#8AB48C" + chat_color = "#8AB48C" /mob/living/simple_animal/drone/Initialize() . = ..() @@ -89,10 +89,10 @@ if(default_storage) var/obj/item/I = new default_storage(src) - equip_to_slot_or_del(I, SLOT_GENERC_DEXTROUS_STORAGE) + equip_to_slot_or_del(I, ITEM_SLOT_DEX_STORAGE) if(default_hatmask) var/obj/item/I = new default_hatmask(src) - equip_to_slot_or_del(I, SLOT_HEAD) + equip_to_slot_or_del(I, ITEM_SLOT_HEAD) ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) @@ -194,7 +194,7 @@ . += "*---------*" -/mob/living/simple_animal/drone/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt maintenance drones. +/mob/living/simple_animal/drone/assess_threat(judgment_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt maintenance drones. return -10 @@ -209,20 +209,26 @@ to_chat(src, "HeAV% DA%^MMA+G TO I/O CIR!%UUT!") -/mob/living/simple_animal/drone/proc/triggerAlarm(class, area/A, O, obj/alarmsource) - if(alarmsource.z != z) +/mob/living/simple_animal/drone/proc/triggerAlarm(class, area/home, cameras, obj/source) + if(source.get_virtual_z_level() != get_virtual_z_level()) return - if(stat != DEAD) - var/list/L = src.alarms[class] - for (var/I in L) - if (I == A.name) - var/list/alarm = L[I] - var/list/sources = alarm[2] - if (!(alarmsource in sources)) - sources += alarmsource - return - L[A.name] = list(A, list(alarmsource)) - to_chat(src, "--- [class] alarm detected in [A.name]!") + if(stat == DEAD) + return + var/list/our_sort = alarms[class] + for(var/areaname in our_sort) + if (areaname == home.name) + var/list/alarm = our_sort[areaname] + var/list/sources = alarm[3] + if (!(source in sources)) + sources += source + return TRUE + + our_sort[home.name] = list(home, list(source)) + to_chat(src, "--- [class] alarm detected in [home.name]!") + +///This isn't currently needed since drones do jack shit with cameras. I hate this code so much +/mob/living/simple_animal/drone/proc/freeCamera(area/home, obj/machinery/camera/cam) + return /mob/living/simple_animal/drone/proc/cancelAlarm(class, area/A, obj/origin) @@ -249,9 +255,9 @@ return ..() /mob/living/simple_animal/drone/mob_negates_gravity() - return 1 + return !isspaceturf(get_turf(src)) //We don't mimick gravity on space turfs -/mob/living/simple_animal/drone/mob_has_gravity() +/mob/living/simple_animal/drone/has_gravity(turf/T) return ..() || mob_negates_gravity() /mob/living/simple_animal/drone/experience_pressure_difference(pressure_difference, direction) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm index efec914fba2bf..e7c034508b1b9 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm @@ -6,18 +6,22 @@ //Drone shells //DRONE SHELL -/obj/item/drone_shell +/obj/effect/mob_spawn/drone name = "drone shell" desc = "A shell of a maintenance drone, an expendable robot built to perform station repairs." icon = 'icons/mob/drone.dmi' icon_state = "drone_maint_hat"//yes reuse the _hat state. layer = BELOW_MOB_LAYER - - var/drone_type = /mob/living/simple_animal/drone //Type of drone that will be spawned + density = FALSE + death = FALSE + roundstart = FALSE + short_desc = "You are a drone." + flavour_text = "You are a drone, a tiny insect-like creature. Follow your assigned laws to the best of your ability." + mob_type = /mob/living/simple_animal/drone var/seasonal_hats = TRUE //If TRUE, and there are no default hats, different holidays will grant different hats var/static/list/possible_seasonal_hats //This is built automatically in build_seasonal_hats() but can also be edited by admins! -/obj/item/drone_shell/Initialize() +/obj/effect/mob_spawn/drone/Initialize() . = ..() var/area/A = get_area(src) if(A) @@ -26,7 +30,7 @@ if(isnull(possible_seasonal_hats)) build_seasonal_hats() -/obj/item/drone_shell/proc/build_seasonal_hats() +/obj/effect/mob_spawn/drone/proc/build_seasonal_hats() possible_seasonal_hats = list() if(!length(SSevents.holidays)) return //no holidays, no hats; we'll keep the empty list so we never call this proc again @@ -40,7 +44,7 @@ . = ..() //ATTACK GHOST IGNORING PARENT RETURN VALUE -/obj/item/drone_shell/attack_ghost(mob/user) +/obj/effect/mob_spawn/drone/attack_ghost(mob/user) if(is_banned_from(user.ckey, ROLE_DRONE) || QDELETED(src) || QDELETED(user)) return if(CONFIG_GET(flag/use_age_restriction_for_jobs)) @@ -55,11 +59,11 @@ var/be_drone = alert("Become a drone? (Warning, You can no longer be cloned!)",,"Yes","No") if(be_drone == "No" || QDELETED(src) || !isobserver(user)) return - var/mob/living/simple_animal/drone/D = new drone_type(get_turf(loc)) + var/mob/living/simple_animal/drone/D = new mob_type(get_turf(loc)) if(!D.default_hatmask && seasonal_hats && possible_seasonal_hats.len) var/hat_type = pick(possible_seasonal_hats) var/obj/item/new_hat = new hat_type(D) - D.equip_to_slot_or_del(new_hat, SLOT_HEAD) + D.equip_to_slot_or_del(new_hat, ITEM_SLOT_HEAD) D.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) D.key = user.key message_admins("[ADMIN_LOOKUPFLW(user)] has taken possession of \a [src] in [AREACOORD(src)].") diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 8bd08f571d471..2b27778d3d583 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -59,20 +59,23 @@ . = ..() desc += " This drone appears to have a complex holoprojector built on its 'head'." -/obj/item/drone_shell/syndrone +/obj/effect/mob_spawn/drone/syndrone name = "syndrone shell" desc = "A shell of a syndrone, a modified maintenance drone designed to infiltrate and annihilate." icon_state = "syndrone_item" - drone_type = /mob/living/simple_animal/drone/syndrone + mob_name = "syndrone" + mob_type = /mob/living/simple_animal/drone/syndrone -/obj/item/drone_shell/syndrone/badass +/obj/effect/mob_spawn/drone/syndrone/badass name = "badass syndrone shell" - drone_type = /mob/living/simple_animal/drone/syndrone/badass + mob_name = "badass syndrone" + mob_type = /mob/living/simple_animal/drone/syndrone/badass -/obj/item/drone_shell/snowflake +/obj/effect/mob_spawn/drone/snowflake name = "snowflake drone shell" desc = "A shell of a snowflake drone, a maintenance drone with a built in holographic projector to display hats and masks." - drone_type = /mob/living/simple_animal/drone/snowflake + mob_name = "snowflake drone" + mob_type = /mob/living/simple_animal/drone/snowflake /mob/living/simple_animal/drone/polymorphed default_storage = null @@ -93,10 +96,16 @@ icon_living = icon_state icon_dead = "[visualAppearence]_dead" -/obj/item/drone_shell/dusty +/obj/effect/mob_spawn/drone/dusty name = "derelict drone shell" desc = "A long-forgotten drone shell. It seems kind of... Space Russian." - drone_type = /mob/living/simple_animal/drone/derelict + icon = 'icons/mob/drone.dmi' + icon_state = "drone_maint_hat" + mob_name = "derelict drone" + mob_type = /mob/living/simple_animal/drone/derelict + short_desc = "You are a long forgotten drone!" + flavour_text = "You are a drone on Kosmicheskaya Stantsiya 13. Something has brought you out of hibernation, and the station is in gross disrepair. \ + Build, repair, maintain and improve the station that housed you on activation." /mob/living/simple_animal/drone/derelict name = "derelict drone" 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 946626966cc14..e6b734867aed8 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -104,7 +104,7 @@ var/armorval = 0 if(head) - armorval = head.armor.getRating(type) + armorval = head.get_armor_rating(type, src) return (armorval * get_armor_effectiveness()) //armor is reduced for tiny fragile drones /mob/living/simple_animal/drone/proc/get_armor_effectiveness() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm index 6e89f045da0cb..9f77a69a29f52 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -5,8 +5,8 @@ //Drone inventory //Drone hands - -/mob/living/simple_animal/drone/doUnEquip(obj/item/I, force) +//Does nobody read the comments telling you to not touch shit you souldn't? +/mob/living/simple_animal/drone/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, was_thrown = FALSE) if(..()) update_inv_hands() if(I == head) @@ -21,13 +21,13 @@ /mob/living/simple_animal/drone/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) switch(slot) - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) if(head) return 0 if(!((I.slot_flags & ITEM_SLOT_HEAD) || (I.slot_flags & ITEM_SLOT_MASK))) return 0 return 1 - if(SLOT_GENERC_DEXTROUS_STORAGE) + if(ITEM_SLOT_DEX_STORAGE) if(internal_storage) return 0 return 1 @@ -36,9 +36,9 @@ /mob/living/simple_animal/drone/get_item_by_slot(slot_id) switch(slot_id) - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) return head - if(SLOT_GENERC_DEXTROUS_STORAGE) + if(ITEM_SLOT_DEX_STORAGE) return internal_storage return ..() @@ -63,10 +63,10 @@ I.plane = ABOVE_HUD_PLANE switch(slot) - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) head = I update_inv_head() - if(SLOT_GENERC_DEXTROUS_STORAGE) + if(ITEM_SLOT_DEX_STORAGE) internal_storage = I update_inv_internal_storage() else @@ -77,7 +77,7 @@ I.equipped(src, slot) /mob/living/simple_animal/drone/getBackSlot() - return SLOT_GENERC_DEXTROUS_STORAGE + return ITEM_SLOT_DEX_STORAGE /mob/living/simple_animal/drone/getBeltSlot() - return SLOT_GENERC_DEXTROUS_STORAGE + return ITEM_SLOT_DEX_STORAGE 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 14f1380e20899..fe95c933d55ca 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -29,7 +29,7 @@ stop_automated_movement_when_pulled = 1 blood_volume = BLOOD_VOLUME_NORMAL var/obj/item/udder/udder = null - mobsay_color = "#B2CEB3" + chat_color = "#B2CEB3" do_footstep = TRUE @@ -50,7 +50,7 @@ Retaliate() if(enemies.len && prob(10)) - enemies = list() + clear_enemies() LoseTarget() src.visible_message("[src] calms down.") if(stat == CONSCIOUS) @@ -85,7 +85,7 @@ eaten = TRUE if(eaten && prob(10)) - say("Nom") + INVOKE_ASYNC(src, /atom/movable/proc/say, "Nom") /mob/living/simple_animal/hostile/retaliate/goat/attackby(obj/item/O, mob/user, params) if(stat == CONSCIOUS && istype(O, /obj/item/reagent_containers/glass)) @@ -132,7 +132,7 @@ var/obj/item/udder/udder = null gold_core_spawnable = FRIENDLY_SPAWN blood_volume = BLOOD_VOLUME_NORMAL - mobsay_color = "#FFFFFF" + chat_color = "#FFFFFF" do_footstep = TRUE @@ -164,25 +164,28 @@ to_chat(src, "You are tipped over by [M]!") Paralyze(60, ignore_canstun = TRUE) icon_state = icon_dead - spawn(rand(20,50)) - if(!stat && M) - icon_state = icon_living - var/external - var/internal - switch(pick(1,2,3,4)) - if(1,2,3) - var/text = pick("imploringly.", "pleadingly.", - "with a resigned expression.") - external = "[src] looks at [M] [text]" - internal = "You look at [M] [text]" - if(4) - external = "[src] seems resigned to its fate." - internal = "You resign yourself to your fate." - visible_message("[external]", - "[internal]") + addtimer(CALLBACK(src, .proc/tip_back, M), rand(20,50)) else ..() +/mob/living/simple_animal/cow/proc/tip_back(mob/living/carbon/M) + if(stat && M) + return + icon_state = icon_living + var/external + var/internal + switch(pick(1,2,3,4)) + if(1,2,3) + var/text = pick("imploringly.", "pleadingly.", + "with a resigned expression.") + external = "[src] looks at [M] [text]" + internal = "You look at [M] [text]" + if(4) + external = "[src] seems resigned to its fate." + internal = "You resign yourself to your fate." + visible_message("[external]", + "[internal]") + /mob/living/simple_animal/chick name = "\improper chick" desc = "Adorable! They make such a racket though." @@ -190,6 +193,9 @@ icon_living = "chick" icon_dead = "chick_dead" icon_gib = "chick_gib" + can_be_held = TRUE + worn_slot_flags = ITEM_SLOT_HEAD + held_state = "chick" gender = FEMALE mob_biotypes = list(MOB_ORGANIC, MOB_BEAST) speak = list("Cherp.","Cherp?","Chirrup.","Cheep!") @@ -211,7 +217,7 @@ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY gold_core_spawnable = FRIENDLY_SPAWN - mobsay_color = "#FFDC9B" + chat_color = "#FFDC9B" do_footstep = TRUE @@ -273,6 +279,8 @@ var/eggsFertile = TRUE var/body_color var/icon_prefix = "chicken" + can_be_held = TRUE + worn_slot_flags = ITEM_SLOT_HEAD pass_flags = PASSTABLE | PASSMOB mob_size = MOB_SIZE_SMALL var/list/feedMessages = list("It clucks happily.","It clucks happily.") @@ -280,7 +288,8 @@ var/list/validColors = list("brown","black","white") gold_core_spawnable = FRIENDLY_SPAWN var/static/chicken_count = 0 - mobsay_color = "#FFDC9B" + chat_color = "#FFDC9B" + mobchatspan = "stationengineer" do_footstep = TRUE @@ -291,6 +300,8 @@ icon_state = "[icon_prefix]_[body_color]" icon_living = "[icon_prefix]_[body_color]" icon_dead = "[icon_prefix]_[body_color]_dead" + held_state = "[icon_prefix]_[body_color]" + head_icon = 'icons/mob/pets_held_large.dmi' pixel_x = rand(-6, 6) pixel_y = rand(0, 10) GLOB.total_chickens++ @@ -331,10 +342,10 @@ START_PROCESSING(SSobj, E) /obj/item/reagent_containers/food/snacks/egg/var/amount_grown = 0 -/obj/item/reagent_containers/food/snacks/egg/process() +/obj/item/reagent_containers/food/snacks/egg/process(delta_time) if(isturf(loc)) - amount_grown += rand(1,2) - if(amount_grown >= 100) + amount_grown += rand(1,2) * delta_time + if(amount_grown >= 200) visible_message("[src] hatches with a quiet cracking sound.") new /mob/living/simple_animal/chick(get_turf(src)) STOP_PROCESSING(SSobj, src) @@ -363,7 +374,7 @@ feedMessages = list("It gobbles up the food voraciously.","It clucks happily.") validColors = list("plain") gold_core_spawnable = FRIENDLY_SPAWN - mobsay_color = "#FFDC9B" + chat_color = "#FFDC9B" /obj/item/udder name = "udder" diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index 9b107cdfcf7e1..99c0b1d3b0a54 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -18,10 +18,12 @@ response_disarm = "gently pushes aside" response_harm = "kicks" gold_core_spawnable = FRIENDLY_SPAWN - mobsay_color = "#FFAE64" + chat_color = "#FFAE64" + mobchatspan = "fox" can_be_held = TRUE held_state = "fox" do_footstep = TRUE + worn_slot_flags = ITEM_SLOT_HEAD //Captain fox /mob/living/simple_animal/pet/fox/Renault diff --git a/code/modules/mob/living/simple_animal/friendly/hamster.dm b/code/modules/mob/living/simple_animal/friendly/hamster.dm index 8a19a37391694..11097af662f29 100644 --- a/code/modules/mob/living/simple_animal/friendly/hamster.dm +++ b/code/modules/mob/living/simple_animal/friendly/hamster.dm @@ -23,20 +23,22 @@ desc = "It's a hamster." icon_state = "hamster" icon_living = "hamster" + held_state = "hamster" icon_dead = "hamster_dead" butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/hamster = 1) childtype = /mob/living/simple_animal/pet/hamster animal_species = /mob/living/simple_animal/pet/hamster gold_core_spawnable = FRIENDLY_SPAWN can_be_held = TRUE - mobsay_color = "#D3B277" + worn_slot_flags = ITEM_SLOT_HEAD + chat_color = "#D3B277" /mob/living/simple_animal/pet/hamster/vector //now also viro's source of a solitary, shitty starter disease name = "Vector" desc = "It's Vector the hamster. Definitely not a source of deadly diseases." var/datum/disease/vector_disease var/list/extrapolatordisease = list() - + /mob/living/simple_animal/pet/hamster/vector/Initialize() . = ..() @@ -45,7 +47,7 @@ vector_disease = new disease message_admins("Vector was roundstart infected with [vector_disease.name]. Don't lynch the virologist!") log_game("Vector was roundstart infected with [vector_disease.name].") - var/datum/disease/advance/R = new /datum/disease/advance/random(rand(1, 3)) + var/datum/disease/advance/R = new /datum/disease/advance/random(rand(2, 5), 9, 1+rand(1,3), infected = src) extrapolatordisease += R /mob/living/simple_animal/pet/hamster/vector/extrapolator_act(mob/user, var/obj/item/extrapolator/E, scan = TRUE) diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index a2f8614b6b132..7bc3de052c4dc 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -22,7 +22,7 @@ obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE var/static/list/edibles = typecacheof(list(/mob/living/simple_animal/butterfly, /mob/living/simple_animal/cockroach)) //list of atoms, however turfs won't affect AI, but will affect consumption. - mobsay_color = "#64F88A" + chat_color = "#64F88A" /mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target? if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 8089c4e28b68f..bf681ead4b1e7 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -25,10 +25,11 @@ var/body_color //brown, gray and white, leave blank for random gold_core_spawnable = FRIENDLY_SPAWN var/chew_probability = 1 - mobsay_color = "#82AF84" + chat_color = "#82AF84" var/list/ratdisease = list() can_be_held = TRUE - held_state = "mouse_gray" + worn_slot_flags = ITEM_SLOT_HEAD + /mob/living/simple_animal/mouse/Initialize() . = ..() @@ -38,8 +39,9 @@ icon_state = "mouse_[body_color]" icon_living = "mouse_[body_color]" icon_dead = "mouse_[body_color]_dead" - if(prob(40)) - var/datum/disease/advance/R = new /datum/disease/advance/random(rand(2, 4)) + held_state = "mouse_[body_color]" + if(prob(75)) + var/datum/disease/advance/R = new /datum/disease/advance/random(rand(3, 6), 9, rand(3,4), infected = src) ratdisease += R /mob/living/simple_animal/mouse/extrapolator_act(mob/user, var/obj/item/extrapolator/E, scan = TRUE) @@ -58,7 +60,7 @@ death() /mob/living/simple_animal/mouse/death(gibbed, toast) - var/list/data = list("viruses" = list(ratdisease)) + var/list/data = list("viruses" = ratdisease) if(!ckey) ..(1) if(!gibbed) diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm index 4fbe16c143830..172187b6c18e4 100644 --- a/code/modules/mob/living/simple_animal/friendly/penguin.dm +++ b/code/modules/mob/living/simple_animal/friendly/penguin.dm @@ -15,7 +15,7 @@ turns_per_move = 10 icon = 'icons/mob/penguins.dmi' butcher_results = list(/obj/item/organ/ears/penguin = 1, /obj/item/reagent_containers/food/snacks/meat/slab/penguin = 3) - mobsay_color = "#81D9FF" + chat_color = "#81D9FF" do_footstep = TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/sloth.dm b/code/modules/mob/living/simple_animal/friendly/sloth.dm index f7d0b7fb4e974..65c9672ae00dd 100644 --- a/code/modules/mob/living/simple_animal/friendly/sloth.dm +++ b/code/modules/mob/living/simple_animal/friendly/sloth.dm @@ -21,7 +21,7 @@ maxHealth = 50 speed = 10 glide_size = 2 - mobsay_color = "#728AE6" + chat_color = "#728AE6" can_be_held = TRUE held_state = "sloth" do_footstep = TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm index fc6d0d190ec65..5b070d075c25e 100644 --- a/code/modules/mob/living/simple_animal/friendly/snake.dm +++ b/code/modules/mob/living/simple_animal/friendly/snake.dm @@ -1,64 +1,67 @@ /mob/living/simple_animal/hostile/retaliate/poison - var/poison_per_bite = 0 - var/poison_type = /datum/reagent/toxin + var/poison_per_bite = 0 + var/poison_type = /datum/reagent/toxin /mob/living/simple_animal/hostile/retaliate/poison/AttackingTarget() - . = ..() - if(. && isliving(target)) - var/mob/living/L = target - if(L.reagents && !poison_per_bite == 0) - L.reagents.add_reagent(poison_type, poison_per_bite) - return . + . = ..() + if(. && isliving(target)) + var/mob/living/L = target + if(L.reagents && !poison_per_bite == 0) + L.reagents.add_reagent(poison_type, poison_per_bite) /mob/living/simple_animal/hostile/retaliate/poison/snake - name = "snake" - desc = "A slithery snake. These legless reptiles are the bane of mice and adventurers alike." - icon_state = "snake" - icon_living = "snake" - icon_dead = "snake_dead" - speak_emote = list("hisses") - health = 20 - maxHealth = 20 - attacktext = "bites" - melee_damage = 6 - response_help = "pets" - response_disarm = "shoos" - response_harm = "steps on" - faction = list("hostile") - ventcrawler = VENTCRAWLER_ALWAYS - density = FALSE - pass_flags = PASSTABLE | PASSMOB - mob_size = MOB_SIZE_SMALL - mob_biotypes = list(MOB_ORGANIC, MOB_BEAST, MOB_REPTILE) - gold_core_spawnable = FRIENDLY_SPAWN - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - mobsay_color = "#26F55A" - poison_per_bite = 3 - poison_type = /datum/reagent/toxin/venom + name = "snake" + desc = "A slithery snake. These legless reptiles are the bane of mice and adventurers alike." + icon_state = "snake" + icon_living = "snake" + icon_dead = "snake_dead" + speak_emote = list("hisses") + health = 20 + maxHealth = 20 + attacktext = "bites" + melee_damage = 6 + response_help = "pets" + response_disarm = "shoos" + response_harm = "steps on" + faction = list("hostile") + ventcrawler = VENTCRAWLER_ALWAYS + density = FALSE + pass_flags = PASSTABLE | PASSMOB + mob_size = MOB_SIZE_SMALL + mob_biotypes = list(MOB_ORGANIC, MOB_BEAST, MOB_REPTILE) + gold_core_spawnable = FRIENDLY_SPAWN + obj_damage = 0 + environment_smash = ENVIRONMENT_SMASH_NONE + chat_color = "#26F55A" + poison_per_bite = 3 + poison_type = /datum/reagent/toxin/venom + can_be_held = TRUE + worn_slot_flags = ITEM_SLOT_HEAD + head_icon = 'icons/mob/pets_held.dmi' + held_state = "snake" /mob/living/simple_animal/hostile/retaliate/poison/snake/ListTargets(atom/the_target) - . = oview(vision_range, targets_from) //get list of things in vision range + var/atom/target_from = GET_TARGETS_FROM(src) var/list/living_mobs = list() var/list/mice = list() - for (var/HM in .) + for(var/mob/living/HM in oview(vision_range, target_from)) //Yum a tasty mouse if(istype(HM, /mob/living/simple_animal/mouse)) mice += HM - if(isliving(HM)) - living_mobs += HM + continue + living_mobs += HM // if no tasty mice to chase, lets chase any living mob enemies in our vision range - if(length(mice) == 0) + if(!length(mice)) //Filter living mobs (in range mobs) by those we consider enemies (retaliate behaviour) - return living_mobs & enemies + return living_mobs & enemies return mice /mob/living/simple_animal/hostile/retaliate/poison/snake/AttackingTarget() - if(istype(target, /mob/living/simple_animal/mouse)) - visible_message("[name] consumes [target] in a single gulp!", "You consume [target] in a single gulp!") - QDEL_NULL(target) - adjustBruteLoss(-2) - else - return ..() + if(istype(target, /mob/living/simple_animal/mouse)) + visible_message("[name] consumes [target] in a single gulp!", "You consume [target] in a single gulp!") + QDEL_NULL(target) + adjustBruteLoss(-2) + else + return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/turtle.dm b/code/modules/mob/living/simple_animal/friendly/turtle.dm index 0ea4bc104837e..e4eafb67fcb6c 100644 --- a/code/modules/mob/living/simple_animal/friendly/turtle.dm +++ b/code/modules/mob/living/simple_animal/friendly/turtle.dm @@ -16,14 +16,14 @@ response_disarm = "gently pushes aside" response_harm = "kicks" mob_biotypes = list(MOB_ORGANIC, MOB_BEAST) - gold_core_spawnable = FRIENDLY_SPAWN - melee_damage = 18 + gold_core_spawnable = NO_SPAWN + melee_damage = 0.5 health = 2500 maxHealth = 2500 - speed = 8 + speed = 4 glide_size = 2 can_be_held = TRUE - mobsay_color = "#E7D26F" + chat_color = "#E7D26F" do_footstep = TRUE diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 2390e8dfdccba..d5d7c5f0aa784 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -42,7 +42,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians hardattacks = TRUE var/mutable_appearance/cooloverlay var/guardiancolor = "#ffffff" - mobsay_color = "#ffffff" + chat_color = "#ffffff" var/recolorentiresprite var/theme var/list/guardian_overlays[GUARDIAN_TOTAL_LAYERS] @@ -50,7 +50,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians var/cooldown = 0 var/mob/living/summoner var/range = 10 //how far from the user the spirit can be - var/toggle_button_type = /obj/screen/guardian/ToggleMode/Inactive //what sort of toggle button the hud uses + var/toggle_button_type = /atom/movable/screen/guardian/ToggleMode/Inactive //what sort of toggle button the hud uses var/playstyle_string = "You are a standard Guardian. You shouldn't exist!" var/magic_fluff_string = "You draw the Coder, symbolizing bugs and errors. This shouldn't happen! Submit a bug report!" var/tech_fluff_string = "BOOT SEQUENCE COMPLETE. ERROR MODULE LOADED. THIS SHOULDN'T HAPPEN. Submit a bug report!" @@ -121,7 +121,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians speak_emote = list("telepathically cries") desc = "A truly alien creature, it is a mass of unknown organic material, standing by its' owner's side." attack_sound = 'sound/weapons/pierce.ogg' - if(!recolorentiresprite) //we want this to proc before stand logs in, so the overlay isnt gone for some reason + if(!recolorentiresprite) //we want this to proc before stand logs in, so the overlay isn't gone for some reason cooloverlay = mutable_appearance(icon, theme) add_overlay(cooloverlay) @@ -144,7 +144,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians /mob/living/simple_animal/hostile/guardian/proc/guardianrecolor() guardiancolor = input(src,"What would you like your color to be?","Choose Your Color","#ffffff") as color|null - mobsay_color = guardiancolor + chat_color = guardiancolor if(!guardiancolor) //redo proc until we get a color to_chat(src, "Not a valid color, please try again.") guardianrecolor() @@ -189,18 +189,18 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians qdel(src) snapback() -/mob/living/simple_animal/hostile/guardian/Stat() - ..() - if(statpanel("Status")) - if(summoner) - var/resulthealth - if(iscarbon(summoner)) - resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - summoner.health) / abs(HEALTH_THRESHOLD_DEAD - summoner.maxHealth)) * 100) - else - resulthealth = round((summoner.health / summoner.maxHealth) * 100, 0.5) - stat(null, "Summoner Health: [resulthealth]%") - if(cooldown >= world.time) - stat(null, "Manifest/Recall Cooldown Remaining: [DisplayTimeText(cooldown - world.time)]") +/mob/living/simple_animal/hostile/guardian/get_stat_tab_status() + var/list/tab_data = ..() + if(summoner) + var/resulthealth + if(iscarbon(summoner)) + resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - summoner.health) / abs(HEALTH_THRESHOLD_DEAD - summoner.maxHealth)) * 100) + else + resulthealth = round((summoner.health / summoner.maxHealth) * 100, 0.5) + tab_data["Summoner Health"] = GENERATE_STAT_TEXT("[resulthealth]%") + if(cooldown >= world.time) + tab_data["Manifest/Recall Cooldown Remaining"] = GENERATE_STAT_TEXT("[DisplayTimeText(cooldown - world.time)]") + return tab_data /mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range . = ..() @@ -247,7 +247,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - summoner.health) / abs(HEALTH_THRESHOLD_DEAD - summoner.maxHealth)) * 100) else resulthealth = round((summoner.health / summoner.maxHealth) * 100, 0.5) - hud_used.healths.maptext = "
[resulthealth]%
" + hud_used.healths.maptext = MAPTEXT("
[resulthealth]%
") /mob/living/simple_animal/hostile/guardian/adjustHealth(amount, updating_health = TRUE, forced = FALSE) //The spirit is invincible, but passes on damage to the summoner . = amount @@ -480,13 +480,13 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians to_chat(src, "[G.real_name] has been created from the core!") guardians -= G if(!guardians.len) - verbs -= /mob/living/proc/guardian_reset + remove_verb(/mob/living/proc/guardian_reset) else to_chat(src, "There were no ghosts willing to take control of [G.real_name]. Looks like you're stuck with it for now.") else to_chat(src, "You decide not to reset [guardians.len > 1 ? "any of your guardians":"your guardian"].") else - verbs -= /mob/living/proc/guardian_reset + remove_verb(/mob/living/proc/guardian_reset) ////////parasite tracking/finding procs @@ -620,9 +620,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians if("hive") to_chat(user, "[G.hive_fluff_string]") to_chat(user, "[G.real_name] has been created from the core!") - user.verbs += /mob/living/proc/guardian_comm - user.verbs += /mob/living/proc/guardian_recall - user.verbs += /mob/living/proc/guardian_reset + user.add_verb(/mob/living/proc/guardian_comm) + user.add_verb(/mob/living/proc/guardian_recall) + user.add_verb(/mob/living/proc/guardian_reset) /obj/item/guardiancreator/choose random = FALSE 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 a6454daf065df..accf4a72087ec 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm @@ -9,11 +9,11 @@ tech_fluff_string = "Boot sequence complete. Assassin modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's an assassin carp! Just when you thought it was safe to go back to the water... which is unhelpful, because we're in space." hive_fluff_string = "The mass seems to be able to attack with stealth causing massive damage." - toggle_button_type = /obj/screen/guardian/ToggleMode/Assassin + toggle_button_type = /atom/movable/screen/guardian/ToggleMode/Assassin var/toggle = FALSE var/stealthcooldown = 160 - var/obj/screen/alert/canstealthalert - var/obj/screen/alert/instealthalert + var/atom/movable/screen/alert/canstealthalert + var/atom/movable/screen/alert/instealthalert /mob/living/simple_animal/hostile/guardian/assassin/Initialize() . = ..() @@ -25,11 +25,10 @@ if(loc == summoner && toggle) ToggleMode(0) -/mob/living/simple_animal/hostile/guardian/assassin/Stat() - ..() - if(statpanel("Status")) - if(stealthcooldown >= world.time) - stat(null, "Stealth Cooldown Remaining: [DisplayTimeText(stealthcooldown - world.time)]") +/mob/living/simple_animal/hostile/guardian/assassin/get_stat_tab_status() + var/list/tab_data = ..() + if(stealthcooldown >= world.time) + tab_data["Stealth Cooldown Remaining"] = GENERATE_STAT_TEXT("[DisplayTimeText(stealthcooldown - world.time)]") /mob/living/simple_animal/hostile/guardian/assassin/AttackingTarget() . = ..() @@ -82,12 +81,12 @@ if(stealthcooldown <= world.time) if(toggle) if(!instealthalert) - instealthalert = throw_alert("instealth", /obj/screen/alert/instealth) + instealthalert = throw_alert("instealth", /atom/movable/screen/alert/instealth) clear_alert("canstealth") canstealthalert = null else if(!canstealthalert) - canstealthalert = throw_alert("canstealth", /obj/screen/alert/canstealth) + canstealthalert = throw_alert("canstealth", /atom/movable/screen/alert/canstealth) clear_alert("instealth") instealthalert = null else 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 289873591ac4d..ce29f7e52a3f8 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm @@ -12,13 +12,13 @@ carp_fluff_string = "CARP CARP CARP! Caught one! It's a charger carp, that likes running at people. But it doesn't have any legs..." hive_fluff_string = "The mass seems to have primal senses, rapidly assaulting its' enemies." var/charging = 0 - var/obj/screen/alert/chargealert + var/atom/movable/screen/alert/chargealert /mob/living/simple_animal/hostile/guardian/charger/Life() . = ..() if(ranged_cooldown <= world.time) if(!chargealert) - chargealert = throw_alert("charge", /obj/screen/alert/cancharge) + chargealert = throw_alert("charge", /atom/movable/screen/alert/cancharge) else clear_alert("charge") chargealert = null diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm index a600aa217689b..5219eb9167be0 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -51,7 +51,7 @@ /mob/living/simple_animal/hostile/guardian/dextrous/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) switch(slot) - if(SLOT_GENERC_DEXTROUS_STORAGE) + if(ITEM_SLOT_DEX_STORAGE) if(internal_storage) return 0 return 1 @@ -62,17 +62,17 @@ return switch(slot) - if(SLOT_GENERC_DEXTROUS_STORAGE) + if(ITEM_SLOT_DEX_STORAGE) internal_storage = I update_inv_internal_storage() else to_chat(src, "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!") /mob/living/simple_animal/hostile/guardian/dextrous/getBackSlot() - return SLOT_GENERC_DEXTROUS_STORAGE + return ITEM_SLOT_DEX_STORAGE /mob/living/simple_animal/hostile/guardian/dextrous/getBeltSlot() - return SLOT_GENERC_DEXTROUS_STORAGE + return ITEM_SLOT_DEX_STORAGE /mob/living/simple_animal/hostile/guardian/dextrous/proc/update_inv_internal_storage() if(internal_storage && client && hud_used && hud_used.hud_shown) diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm index 7818a6d604552..23883e7c949bf 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm @@ -17,11 +17,10 @@ var/bomb_cooldown = 0 var/static/list/boom_signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_BUMPED, COMSIG_ATOM_ATTACK_HAND) -/mob/living/simple_animal/hostile/guardian/bomb/Stat() - ..() - if(statpanel("Status")) - if(bomb_cooldown >= world.time) - stat(null, "Bomb Cooldown Remaining: [DisplayTimeText(bomb_cooldown - world.time)]") +/mob/living/simple_animal/hostile/guardian/bomb/get_stat_tab_status() + var/list/tab_data = ..() + if(bomb_cooldown >= world.time) + tab_data["Bomb Cooldown Remaining"] = GENERATE_STAT_TEXT("[DisplayTimeText(bomb_cooldown - world.time)]") /mob/living/simple_animal/hostile/guardian/bomb/AttackingTarget() . = ..() @@ -54,6 +53,8 @@ to_chat(src, "Your powers are on cooldown! You must wait 20 seconds between bombs.") /mob/living/simple_animal/hostile/guardian/bomb/proc/kaboom(atom/source, mob/living/explodee) + SIGNAL_HANDLER + if(!istype(explodee)) return if(explodee == src || explodee == summoner || hasmatchingsummoner(explodee)) @@ -71,6 +72,8 @@ UNREGISTER_BOMB_SIGNALS(A) /mob/living/simple_animal/hostile/guardian/bomb/proc/display_examine(datum/source, mob/user, text) + SIGNAL_HANDLER + text += "It glows with a strange light!" -#undef UNREGISTER_BOMB_SIGNALS \ No newline at end of file +#undef UNREGISTER_BOMB_SIGNALS diff --git a/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm b/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm index ce76607de8ef3..c099d0922f788 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm @@ -58,5 +58,7 @@ qdel(C) /mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/__distance_check(atom/movable/AM, OldLoc, Dir, Forced) + SIGNAL_HANDLER + if(get_dist(src, AM) > gravity_power_range) remove_gravity(AM.GetComponent(/datum/component/forced_gravity)) 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 bfcd58e616a62..f715318df60f1 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm @@ -109,9 +109,7 @@ C.jitteriness += 1000 C.do_jitter_animation(jitteriness) C.stuttering += 1 - spawn(20) - if(C) - C.jitteriness = max(C.jitteriness - 990, 10) + addtimer(CALLBACK(src, .proc/lower_jitter, C), 20) L.visible_message( "[L] was shocked by the lightning chain!", \ "You are shocked by the lightning chain!", \ @@ -119,3 +117,8 @@ ) L.adjustFireLoss(1.2) //adds up very rapidly . = 1 + +/mob/living/simple_animal/hostile/guardian/beam/proc/lower_jitter(mob/living/carbon/C) + if(!C) + return + C.jitteriness = max(C.jitteriness - 990, 10) //adjust the jitter to 10 at most after 2 seconds diff --git a/code/modules/mob/living/simple_animal/guardian/types/protector.dm b/code/modules/mob/living/simple_animal/guardian/types/protector.dm index 3d10ce48fc938..3d89006d49a30 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/protector.dm @@ -8,7 +8,7 @@ tech_fluff_string = "Boot sequence complete. Protector modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! Wait, no... it caught you! The fisher has become the fishy." hive_fluff_string = "The mass seems to be extremely resistant to damage and have a special connection with the owner." - toggle_button_type = /obj/screen/guardian/ToggleMode + toggle_button_type = /atom/movable/screen/guardian/ToggleMode var/toggle = FALSE /mob/living/simple_animal/hostile/guardian/protector/ex_act(severity) 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 110feee3b08fa..b1192f36fb17a 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm @@ -23,7 +23,7 @@ hive_fluff_string = "The mass seems to be able to create more mass and also hide at will." see_invisible = SEE_INVISIBLE_LIVING see_in_dark = 8 - toggle_button_type = /obj/screen/guardian/ToggleMode + toggle_button_type = /atom/movable/screen/guardian/ToggleMode var/list/snares = list() var/toggle = FALSE @@ -128,4 +128,4 @@ /mob/living/simple_animal/hostile/guardian/ranged/Recall(forced) // To stop scout mode from moving when recalled incorporeal_move = FALSE - . = ..() \ No newline at end of file + . = ..() 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 84b7c91754f6b..2fc632c8f1ce3 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -10,7 +10,7 @@ carp_fluff_string = "CARP CARP CARP! You caught a support carp. It's a kleptocarp!" tech_fluff_string = "Boot sequence complete. Support modules active. Holoparasite swarm online." hive_fluff_string = "The mass seems to have regenerative powers, while also possessing strength." - toggle_button_type = /obj/screen/guardian/ToggleMode + toggle_button_type = /atom/movable/screen/guardian/ToggleMode var/obj/structure/receiving_pad/beacon var/beacon_cooldown = 0 var/toggle = FALSE @@ -20,11 +20,10 @@ var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] medsensor.add_hud_to(src) -/mob/living/simple_animal/hostile/guardian/healer/Stat() - ..() - if(statpanel("Status")) - if(beacon_cooldown >= world.time) - stat(null, "Beacon Cooldown Remaining: [DisplayTimeText(beacon_cooldown - world.time)]") +/mob/living/simple_animal/hostile/guardian/healer/get_stat_tab_status() + var/list/tab_data = ..() + if(beacon_cooldown >= world.time) + tab_data["Beacon Cooldown Remaining"] = GENERATE_STAT_TEXT("[DisplayTimeText(beacon_cooldown - world.time)]") /mob/living/simple_animal/hostile/guardian/healer/AttackingTarget() . = ..() @@ -33,7 +32,7 @@ C.adjustBruteLoss(-5) C.adjustFireLoss(-5) C.adjustOxyLoss(-5) - C.adjustToxLoss(-5) + C.adjustToxLoss(-5, FALSE, TRUE) var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(C)) if(guardiancolor) H.color = guardiancolor @@ -121,7 +120,7 @@ return var/turf/T = get_turf(A) - if(beacon.z != T.z) + if(beacon.get_virtual_z_level() != T.get_virtual_z_level()) to_chat(src, "The beacon is too far away to warp to!") return diff --git a/code/modules/mob/living/simple_animal/guardian/types/toy.dm b/code/modules/mob/living/simple_animal/guardian/types/toy.dm index 45f0f04be5c12..6d7a44505bc9c 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/toy.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/toy.dm @@ -8,6 +8,7 @@ tech_fluff_string = "Boot sequence complete. Standard combat modules locked. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! It's weak and useless. Can I have a refund?." var/battlecry = "HONK" + discovery_points = 0 /mob/living/simple_animal/hostile/guardian/toy/verb/Battlecry() set name = "Set Battlecry" diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index f4953cb4b9df1..3cd5f245d6a48 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -33,9 +33,11 @@ gold_core_spawnable = NO_SPAWN deathsound = 'sound/voice/hiss6.ogg' deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..." - mobsay_color = "#9EE08F" + chat_color = "#9EE08F" + mobchatspan = "alienmobsay" do_footstep = TRUE + discovery_points = 2000 /mob/living/simple_animal/hostile/alien/drone name = "alien drone" @@ -145,10 +147,10 @@ /mob/living/simple_animal/hostile/alien/handle_temperature_damage() if(bodytemperature < minbodytemp) adjustBruteLoss(2) - throw_alert("temp", /obj/screen/alert/cold, 1) + throw_alert("temp", /atom/movable/screen/alert/cold, 1) else if(bodytemperature > maxbodytemp) adjustBruteLoss(20) - throw_alert("temp", /obj/screen/alert/hot, 3) + throw_alert("temp", /atom/movable/screen/alert/hot, 3) else clear_alert("temp") diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 8fc6b770e167d..9c7444c2d8305 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -29,7 +29,7 @@ attacktext = "claws" attack_sound = 'sound/weapons/bladeslice.ogg' friendly = "bear hugs" - mobsay_color = "#CAA25B" + chat_color = "#CAA25B" //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) @@ -97,7 +97,7 @@ to_chat(user, "You strap the armor plating to [A] and sharpen [A.p_their()] claws with the nail filer. This was a great idea.") qdel(src) -mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Several functions used from it. +/mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Several functions used from it. name = "Terrygold" icon_state = "butterbear" icon_living = "butterbear" @@ -140,7 +140,7 @@ mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Seve to_chat(src, "Your name is now \"new_name\"!") name = new_name -mob/living/simple_animal/hostile/bear/butter/AttackingTarget() //Makes some attacks by the butter bear slip those who dare cross its path. +/mob/living/simple_animal/hostile/bear/butter/AttackingTarget() //Makes some attacks by the butter bear slip those who dare cross its path. if(isliving(target)) var/mob/living/L = target if((L.mobility_flags & MOBILITY_STAND)) diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index d1441f1e20303..6fdfa7438b6de 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -47,7 +47,7 @@ //Spaceborn beings don't get hurt by space 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 - del_on_death = 1 + del_on_death = TRUE var/datum/reagent/beegent = null //hehe, beegent var/obj/structure/beebox/beehome = null @@ -84,6 +84,17 @@ if(!beehome) . += "This bee is homeless!" +/mob/living/simple_animal/hostile/poison/bees/ListTargets() // Bee processing is expessive, so we override them finding targets here. + if(!search_objects) //In case we want to have purely hostile bees + return ..() + else + . = list() // The following code is only very slightly slower than just returning oview(vision_range, targets_from), but it saves us much more work down the line + var/atom/target_from = GET_TARGETS_FROM(src) + var/list/searched_for = oview(vision_range, target_from) + for(var/obj/A in searched_for) + . += A + for(var/mob/A in searched_for) + . += A /mob/living/simple_animal/hostile/poison/bees/proc/generate_bee_visuals() cut_overlays() @@ -91,7 +102,7 @@ var/col = BEE_DEFAULT_COLOUR if(beegent?.color) col = beegent.color - mobsay_color = col + chat_color = col add_overlay("[icon_base]_base") @@ -136,7 +147,7 @@ var/obj/structure/beebox/BB = target forceMove(BB) toggle_ai(AI_IDLE) - target = null + LoseTarget() wanted_objects -= beehometypecache //so we don't attack beeboxes when not going home return //no don't attack the goddamm box else @@ -152,16 +163,17 @@ if(istype(R)) beegent = R name = "[initial(name)] ([R.name])" + real_name = name poison_type = null generate_bee_visuals() /mob/living/simple_animal/hostile/poison/bees/proc/pollinate(obj/machinery/hydroponics/Hydro) if(!istype(Hydro) || !Hydro.myseed || Hydro.dead || Hydro.recent_bee_visit) - target = null + LoseTarget() return - target = null //so we pick a new hydro tray next FindTarget(), instead of loving the same plant for eternity + LoseTarget() //so we pick a new hydro tray next FindTarget(), instead of loving the same plant for eternity wanted_objects -= hydroponicstypecache //so we only hunt them while they're alive/seeded/not visisted Hydro.recent_bee_visit = TRUE addtimer(VARSET_CALLBACK(Hydro, recent_bee_visit, FALSE), BEE_TRAY_RECENT_VISIT) @@ -197,7 +209,7 @@ if(idle <= BEE_IDLE_GOHOME && prob(BEE_PROB_GOHOME)) if(!FindTarget()) wanted_objects |= beehometypecache //so we don't attack beeboxes when not going home - target = beehome + GiveTarget(beehome) if(!beehome) //add outselves to a beebox (of the same reagent) if we have no home for(var/obj/structure/beebox/BB in view(vision_range, src)) if(reagent_incompatible(BB.queen_bee) || BB.bees.len >= BB.get_max_bees()) @@ -304,3 +316,11 @@ /mob/living/simple_animal/hostile/poison/bees/short/Initialize() . = ..() addtimer(CALLBACK(src, .proc/death), 50 SECONDS) + + +/mob/living/simple_animal/hostile/poison/bees/space + name = "killer space bee" + desc = "I mean, killer is 'IN' the name..." + 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 = 1500 \ No newline at end of file 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 8391214e008bc..4de9a92be0b99 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm @@ -10,6 +10,7 @@ var/list/boss_abilities = list() //list of /datum/action/boss var/datum/boss_active_timed_battle/atb var/point_regen_delay = 1 + discovery_points = 5000 /mob/living/simple_animal/hostile/boss/Initialize() @@ -135,4 +136,4 @@ /datum/boss_active_timed_battle/Destroy() abilities = null SSobj.processing.Remove(src) - return ..() \ No newline at end of file + 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 93761c400d277..765095ffc3925 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm @@ -110,7 +110,7 @@ original.copies -= src for(var/c in original.copies) qdel(c) - for(var/mob/living/L in range(5,src)) + for(var/mob/living/L in ohearers(5,src)) if(L == original || istype(L, type)) continue L.adjustBruteLoss(50) diff --git a/code/modules/mob/living/simple_animal/hostile/bread.dm b/code/modules/mob/living/simple_animal/hostile/bread.dm index 685edca6dcd3d..0ce87ff849ce2 100644 --- a/code/modules/mob/living/simple_animal/hostile/bread.dm +++ b/code/modules/mob/living/simple_animal/hostile/bread.dm @@ -27,7 +27,8 @@ var/mutationcap = 0 var/mutability = 50 var/stability = 30 - mobsay_color = "#CAA25B" + chat_color = "#CAA25B" + mobchatspan = "blob" /mob/living/simple_animal/hostile/breadloaf/teleport_act() if(mutations == 0) diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index dfc8de1ed837c..83d83b4d85e72 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -26,7 +26,8 @@ attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' speak_emote = list("gnashes") - mobsay_color = "#B15FB9" + chat_color = "#B15FB9" + mobchatspan = "researchdirector" //Space carp 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) @@ -42,7 +43,7 @@ icon_living = "holocarp" maxbodytemp = INFINITY gold_core_spawnable = NO_SPAWN - del_on_death = 1 + del_on_death = TRUE /mob/living/simple_animal/hostile/carp/megacarp icon = 'icons/mob/broadMobs.dmi' 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 6bb950c3b704b..5ec230b5b664e 100644 --- a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm +++ b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm @@ -8,7 +8,8 @@ icon_gib = "syndicate_gib" projectiletype = /obj/item/projectile/bullet/dart/tranq projectilesound = 'sound/items/syringeproj.ogg' - ranged = 1 + retreat_distance = 3 + ranged = TRUE ranged_message = "fires the syringe gun at" ranged_cooldown_time = 30 speak_chance = 0 @@ -32,91 +33,151 @@ faction = list("hostile") check_friendly_fire = 1 status_flags = CANPUSH - del_on_death = 1 - var/impatience = 0 - rapid_melee = 2 //this lets him attack nearly as fast as a normal player, instead of half as fast as one. Without this, due to mood differences, a greytider in melee can actually facetank and beat him to death with only fists + del_on_death = TRUE hardattacks = TRUE dodging = TRUE + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_VERY_STRONG + pull_force = MOVE_FORCE_VERY_STRONG + lose_patience_timeout = 50//very impatient, moves from target to target frequently + var/list/victims = list() +//heal himself when not in combat /mob/living/simple_animal/hostile/cat_butcherer/Life() . = ..() - if(prob(10) && health <= maxHealth && !target) //heal himself when not in combat - var/healamount = min(maxHealth-health, 20) + if(prob(10) && health <= maxHealth && !target) + adjustHealth(-(20+ 2*LAZYLEN(victims))) visible_message("[src] medicates themself.", "You medicate yourself.") - health += healamount - -/mob/living/simple_animal/hostile/cat_butcherer/CanAttack(atom/the_target) - if(iscarbon(target)) - var/mob/living/carbon/human/C = target - if(C.getorgan(/obj/item/organ/ears/cat) && C.getorgan(/obj/item/organ/tail/cat) && C.has_trauma_type(/datum/brain_trauma/severe/pacifism))//he wont attack his creations - if(C.stat && (!HAS_TRAIT(C, TRAIT_NOMETABOLISM) || !istype(C.dna.species, /datum/species/ipc)))//unless they need healing - return ..() - else - return FALSE - return ..() +//attacking/catifying code /mob/living/simple_animal/hostile/cat_butcherer/AttackingTarget() - if(iscarbon(target)) + if(ishuman(target)) var/mob/living/carbon/human/L = target if(!L.getorgan(/obj/item/organ/ears/cat) && L.stat) //target doesnt have cat ears - if(L.getorgan(/obj/item/organ/ears)) //slice off the old ears - var/obj/item/organ/ears/ears = L.getorgan(/obj/item/organ/ears) - visible_message("[src] slices off [L]'s ears!", "You slice [L]'s ears off.") - ears.Remove(L) - ears.forceMove(get_turf(L)) - else //implant new ears - visible_message("[src] attaches a pair of cat ears to [L]!", "You attach a pair of cat ears to [L].") - var/obj/item/organ/ears/cat/newears = new - newears.Insert(L, drop_if_replaced = FALSE) - return + visible_message("[src] slices off [L]'s ears, and replaces them with cat ears!", "You replace [L]'s ears with cat ears'.") + var/obj/item/organ/ears/cat/newears = new + newears.Insert(L) else if(!L.getorgan(/obj/item/organ/tail/cat) && L.stat) - if(L.getorgan(/obj/item/organ/tail)) //cut off the tail if they have one already - var/obj/item/organ/tail/tail = L.getorgan(/obj/item/organ/tail) - visible_message("[src] severs [L]'s tail in one swift swipe!", "You sever [L]'s tail in one swift swipe.") - tail.Remove(L) - tail.forceMove(get_turf(L)) - else //put a cat tail on - visible_message("[src] attaches a cat tail to [L]!", "You attach a tail to [L].") - var/obj/item/organ/tail/cat/newtail = new - newtail.Insert(L, drop_if_replaced = FALSE) - return + visible_message("[src] attaches a cat tail to [L]!", "You attach a tail to [L].") + var/obj/item/organ/tail/cat/newtail = new + newtail.Insert(L) + return else if(!L.has_trauma_type(/datum/brain_trauma/severe/pacifism) && L.getorgan(/obj/item/organ/ears/cat) && L.getorgan(/obj/item/organ/tail/cat)) //still does damage. This also lacks a Stat check- felinids beware. visible_message("[src] drills a hole in [L]'s skull!", "You pacify [L]. Another successful creation.") - if(!L.stat) + if(L.stat) L.emote("scream") - L.gain_trauma(/datum/brain_trauma/severe/pacifism, TRAUMA_RESILIENCE_SURGERY) - say("I'm a genius!!") - if(L.mind && maxHealth <= 300) //if he robusts a tider, he becomes stronger - maxHealth += 20 - adjustHealth(-(maxHealth)) //he heals whenever he finishes - else if(L.stat) //quickly heal them up and move on to our next target! - visible_message("[src] injects [L] with an unknown medicine!", "You inject [L] with medicine.") - L.SetSleeping(0, FALSE) - L.SetUnconscious(0, FALSE) - L.adjustOxyLoss(-50)// do CPR first - if(L.blood_volume <= 500) //bandage them up and give em some blood if they're bleeding - L.blood_volume += 30 - L.suppress_bloodloss(1800) - if(L.getBruteLoss() >= 50)// first, did we beat them into crit? if so, heal that - var/healing = min(L.getBruteLoss(), 120) - L.adjustBruteLoss(-healing) - L.suppress_bloodloss(1800)//bandage their ass - return - else if(L.getFireLoss() >= 50) // are they still down from other damage? fix it, but not as fast as the burns - var/healing = min(L.getFireLoss(), 50) - L.adjustFireLoss(-healing) - else //well, we probably got them with morphine then, let's fix that, in a fun way. - var/obj/effect/sweatsplash/S = new(L.loc) //I've gotten too addicted to this little block of code... - for(var/datum/reagent/R in L.reagents.reagent_list) - var/amount = R.volume - L.reagents.remove_reagent(R.type, amount) - S.reagents.add_reagent(R.type, amount) - S.splash() - FindTarget() //we want someone else! we can't fix this one. - impatience += 50 - if(prob(impatience)) - FindTarget()//so we don't focus on some unconscious dude when we could get our eyes on the prize - impatience = 0 - say("Bah!!") + if(victims.Find(L) || !L.mind)//this is mostly to avoid neurine-filled catgirls from giving him many free instant heals + L.gain_trauma(/datum/brain_trauma/severe/pacifism, TRAUMA_RESILIENCE_SURGERY) + else + L.gain_trauma(/datum/brain_trauma/severe/pacifism, TRAUMA_RESILIENCE_BASIC) + newvictim(L) + else if(L.stat) //quickly heal them up and move on to our next target! + healvictim(L) return return ..() + +/mob/living/simple_animal/hostile/cat_butcherer/proc/healvictim(var/mob/living/carbon/human/L) + visible_message("[src] injects [L] with an unknown medicine!", "You inject [L] with medicine.") + L.SetSleeping(0, FALSE) + L.SetUnconscious(0, FALSE) + L.adjustOxyLoss(-50)// do CPR first + L.reagents.remove_reagent(/datum/reagent/toxin/chloralhydrate, 100) + if(L.blood_volume <= 500) //bandage them up and give em some blood if they're bleeding + L.blood_volume += 30 + L.suppress_bloodloss(1800) + if(L.getBruteLoss() >= 50) + var/healing = min(L.getBruteLoss(), 120) + L.adjustBruteLoss(-healing) + L.suppress_bloodloss(1800)//bandage their ass + FindTarget() + +/mob/living/simple_animal/hostile/cat_butcherer/proc/newvictim(var/mob/living/carbon/human/L) + if(victims.Find(L)) + adjustHealth(-(maxHealth)) + return FALSE + if(L.mind) + victims += L + say(pick("I'm a genius!!", "KITTY!!", "Another successful experiment!!", "Substandard product.", "You had better not run off, now!", "You never cease to amaze me, me.")) + if(LAZYLEN(victims) <= 10) + maxHealth = (100 + (20 * LAZYLEN(victims))) + else + maxHealth = (300 + (5 * (LAZYLEN(victims)-10))) + switch(LAZYLEN(victims)) + if(2) + projectiletype = /obj/item/projectile/bullet/dart/tranq/plus + if(4)//gain space adaptation to make cheesing harder + 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) + icon_state = "cat_butcher_fire" + icon_living = "cat_butcher_fire" + if(6) //at this point, it's probably out in the hall attacking several people at once + ranged_cooldown_time = 20 + rapid_melee = 2 + transform *= 1.25 + if(8) + projectiletype = /obj/item/projectile/bullet/dart/tranq/plusplus + if(10) + ranged_cooldown_time = 10 + if(15)//if he's gotten this powerful, someone has really fucked up + ranged_cooldown_time = 5 + rapid_melee = 3 + transform *= 1.25 + icon_state = "cat_butcher_super" + icon_living = "cat_butcher_super" + adjustHealth(-(maxHealth)) + +//cat butcher ai shit +/mob/living/simple_animal/hostile/cat_butcherer/CanAttack(atom/the_target) + if(iscarbon(target)) + var/mob/living/carbon/human/C = target + if(C.getorgan(/obj/item/organ/ears/cat) && C.getorgan(/obj/item/organ/tail/cat) && C.has_trauma_type(/datum/brain_trauma/severe/pacifism))//he wont attack his creations + if(C.stat && (!HAS_TRAIT(C, TRAIT_NOMETABOLISM) || !isipc(C))) //unless they need healing + return ..() + return FALSE + return ..() + +/mob/living/simple_animal/hostile/cat_butcherer/MoveToTarget(list/possible_targets) + if(target) + if(ishuman(target)) + var/mob/living/carbon/human/L = target + if(L.health <=30 || L.stat || !L.can_inject(null, FALSE)) // base health to move in to attack is 30, not 40, as it accounts for armor somewhat + retreat_distance = 0 + else + retreat_distance = 3 //spam chems if they aren't low and can be injected + else + retreat_distance = 0//dont shoot chems at mobs that dont give a fuck + return ..() + +/mob/living/simple_animal/hostile/cat_butcherer/PickTarget(list/Targets) + if(target) + for(var/pos_targ in Targets) + Targets[pos_targ] = 1 + var/atom/A = pos_targ + var/atom/target_from = GET_TARGETS_FROM(src) + var/target_dist = get_dist(target_from, target) + var/possible_target_distance = get_dist(target_from, A) + if(target_dist < max(possible_target_distance, 3)) + Targets -= A + for(var/pos_targ in Targets) + Targets[pos_targ] = 1 + if(ishuman(pos_targ)) + var/mob/living/carbon/human/H = pos_targ + if(!CanAttack(H)) + Targets -= H + continue + if(H.stat == DEAD) + Targets -= H + continue + if(H.stat) + Targets[H] = 20 + continue + else + var/healthdiff = 10-round(H.health/10) + Targets[H] = CLAMP(healthdiff,1,12) + if(!Targets.len)//sanity check + return + return pickweight(Targets)//Pick the remaining targets (if any) at random + +/mob/living/simple_animal/hostile/cat_butcherer/death(gibbed) + if(LAZYLEN(victims) >= 5) + say("I made [LAZYLEN(victims)] creations! I have no regrets!!") + return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm index 6c95a10c4f443..cc15ee6fa3326 100644 --- a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm +++ b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm @@ -25,4 +25,4 @@ movement_type = FLYING faction = list("spooky") - del_on_death = 1 \ No newline at end of file + del_on_death = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm b/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm index ea42ec15248ce..0649adee6ae43 100644 --- a/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm +++ b/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm @@ -47,7 +47,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) move_resist = INFINITY hud_type = /datum/hud/ghost hud_possible = list(ANTAG_HUD) - + mobchatspan = "rainbow" /mob/living/simple_animal/hostile/floor_cluwne/Initialize() . = ..() @@ -84,7 +84,8 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) do_jitter_animation(1000) pixel_y = 8 - if(is_type_in_typecache(get_area(src.loc), invalid_area_typecache) || !is_station_level(z)) + var/area/A = get_area(src.loc) + if(is_type_in_typecache(A, invalid_area_typecache) || !is_station_level(z)) var/area = pick(GLOB.teleportlocs) var/area/tp = GLOB.teleportlocs[area] forceMove(pick(get_area_turfs(tp.type))) @@ -102,12 +103,13 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) return var/turf/T = get_turf(current_victim) + A = get_area(T) if(prob(5))//checks roughly every 20 ticks - if(current_victim.stat == DEAD || current_victim.dna.check_mutation(CLUWNEMUT) || is_type_in_typecache(get_area(T), invalid_area_typecache) || !is_station_level(current_victim.z)) + if(current_victim.stat == DEAD || current_victim.dna.check_mutation(CLUWNEMUT) || is_type_in_typecache(A, invalid_area_typecache) || !is_station_level(current_victim.z)) if(!Found_You()) Acquire_Victim() - if(get_dist(src, current_victim) > 9 && !manifested && !is_type_in_typecache(get_area(T), invalid_area_typecache))//if cluwne gets stuck he just teleports + if(get_dist(src, current_victim) > 9 && !manifested && !is_type_in_typecache(A, invalid_area_typecache))//if cluwne gets stuck he just teleports do_teleport(src, T) interest++ @@ -126,7 +128,8 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) ..() /mob/living/simple_animal/hostile/floor_cluwne/Goto(target, delay, minimum_distance) - if(!manifested && !is_type_in_typecache(get_area(current_victim.loc), invalid_area_typecache) && is_station_level(current_victim.z)) + var/area/A = get_area(current_victim.loc) + if(!manifested && !is_type_in_typecache(A, invalid_area_typecache) && is_station_level(current_victim.z)) walk_to(src, target, minimum_distance, delay) else walk_to(src,0) @@ -163,13 +166,16 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) /mob/living/simple_animal/hostile/floor_cluwne/proc/Acquire_Victim(specific) for(var/I in GLOB.player_list)//better than a potential recursive loop var/mob/living/carbon/human/H = pick(GLOB.player_list)//so the check is fair + var/area/A if(specific) H = specific - if(H.stat != DEAD && H.has_dna() && !H.dna.check_mutation(CLUWNEMUT) && !is_type_in_typecache(get_area(H.loc), invalid_area_typecache) && is_station_level(H.z)) + A = get_area(H.loc) + if(H.stat != DEAD && H.has_dna() && !H.dna.check_mutation(CLUWNEMUT) && !is_type_in_typecache(A, invalid_area_typecache) && is_station_level(H.z)) return target = current_victim - if(H && ishuman(H) && H.stat != DEAD && H != current_victim && H.has_dna() && !H.dna.check_mutation(CLUWNEMUT) && !is_type_in_typecache(get_area(H.loc), invalid_area_typecache) && is_station_level(H.z)) + A = get_area(H.loc) + if(H && ishuman(H) && H.stat != DEAD && H != current_victim && H.has_dna() && !H.dna.check_mutation(CLUWNEMUT) && !is_type_in_typecache(A, invalid_area_typecache) && is_station_level(H.z)) current_victim = H interest = 0 stage = STAGE_HAUNT @@ -224,7 +230,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) H.playsound_local(src,'sound/misc/bikehorn_creepy.ogg', 5) if(prob(3)) - var/obj/item/I = locate() in orange(H, 8) + var/obj/item/I = locate() in orange(8, H) if(I && !I.anchored) I.throw_at(H, 4, 3) to_chat(H, "What threw that?") @@ -247,7 +253,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) to_chat(H, "knoh") if(prob(5)) - var/obj/item/I = locate() in orange(H, 8) + var/obj/item/I = locate() in orange(8, H) if(I && !I.anchored) I.throw_at(H, 4, 3) to_chat(H, "What threw that?") @@ -257,18 +263,6 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) Appear() manifested = FALSE addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Manifest), 1) - if(current_victim.hud_used)//yay skewium - var/list/screens = list(current_victim.hud_used.plane_masters["[GAME_PLANE]"], current_victim.hud_used.plane_masters["[LIGHTING_PLANE]"]) - var/matrix/skew = matrix() - var/intensity = 8 - skew.set_skew(rand(-intensity,intensity), rand(-intensity,intensity)) - var/matrix/newmatrix = skew - - for(var/whole_screen in screens) - animate(whole_screen, transform = newmatrix, time = 5, easing = QUAD_EASING, loop = -1) - animate(transform = -newmatrix, time = 5, easing = QUAD_EASING) - - addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Reset_View, screens), 10) if(STAGE_TORMENT) @@ -290,8 +284,8 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) playsound(src,'sound/misc/bikehorn_creepy.ogg', 30, 1) if(prob(4)) - for(var/obj/item/I in orange(H, 8)) - if(I && !I.anchored) + for(var/obj/item/I in orange(8, H)) + if(!I.anchored) I.throw_at(H, 4, 3) to_chat(H, "What the hell?!") @@ -308,7 +302,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) if(prob(3)) to_chat(H, "KNOH ?od nottub siht seod tahW") - for(var/turf/open/O in range(src, 6)) + for(var/turf/open/O in RANGE_TURFS(6, src)) O.MakeSlippery(TURF_WET_WATER, 10) playsound(src, 'sound/effects/meteorimpact.ogg', 30, 1) @@ -322,12 +316,12 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) Appear() manifested = FALSE addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Manifest), 2) - for(var/obj/machinery/light/L in range(H, 8)) + for(var/obj/machinery/light/L in range(8, H)) L.flicker() if(STAGE_ATTACK) if(dontkill) - stage = STAGE_TORMENT + stage = STAGE_TORMENT return if(!eating) Found_You() @@ -340,13 +334,13 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) forceMove(H.loc) to_chat(H, "You feel the floor closing in on your feet!") H.Paralyze(300) - H.emote("scream") + INVOKE_ASYNC(H, /mob.proc/emote, "scream") H.adjustBruteLoss(10) manifested = TRUE Manifest() if(!eating) addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Grab, H), 50, TIMER_OVERRIDE|TIMER_UNIQUE) - for(var/turf/open/O in range(src, 6)) + for(var/turf/open/O in RANGE_TURFS(6, src)) O.MakeSlippery(TURF_WET_LUBE, 20) playsound(src, 'sound/effects/meteorimpact.ogg', 30, 1) eating = TRUE @@ -393,7 +387,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0) H.client.color = pure_red animate(H.client,color = red_splash, time = 10, easing = SINE_EASING|EASE_OUT) - for(var/turf/T in orange(H, 4)) + for(var/turf/open/T in RANGE_TURFS(4, H)) H.add_splatter_floor(T) if(do_after(src, 50, target = H)) H.unequip_everything()//more runtime prevention 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 d162ab7cea2a9..6860e9cd7a14e 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -5,6 +5,7 @@ #define SPINNING_COCOON 4 /mob/living/simple_animal/hostile/poison + mobchatspan = "researchdirector" var/poison_per_bite = 5 var/poison_type = /datum/reagent/toxin @@ -47,11 +48,11 @@ gold_core_spawnable = HOSTILE_SPAWN see_in_dark = 4 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - 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 + discovery_points = 1000 /mob/living/simple_animal/hostile/poison/giant_spider/Initialize() . = ..() @@ -62,12 +63,6 @@ QDEL_NULL(lay_web) return ..() -/mob/living/simple_animal/hostile/poison/giant_spider/Topic(href, href_list) - if(href_list["activate"]) - var/mob/dead/observer/ghost = usr - if(istype(ghost) && playable_spider) - humanize_spider(ghost) - /mob/living/simple_animal/hostile/poison/giant_spider/Login() ..() if(directive) @@ -76,25 +71,11 @@ if(mind) mind.store_memory("[directive]") -/mob/living/simple_animal/hostile/poison/giant_spider/attack_ghost(mob/user) - . = ..() - if(.) - return - humanize_spider(user) - -/mob/living/simple_animal/hostile/poison/giant_spider/proc/humanize_spider(mob/user) - if(key || !playable_spider || stat)//Someone is in it, it's dead, or the fun police are shutting it down - return 0 - var/spider_ask = alert("Become a spider?", "Are you australian?", "Yes", "No") - if(spider_ask == "No" || !src || QDELETED(src)) - return 1 - if(key) - to_chat(user, "Someone else already took this spider.") - return 1 - key = user.key +/mob/living/simple_animal/hostile/poison/giant_spider/give_mind(mob/user) + ..() if(directive) log_game("[key_name(src)] took control of [name] with the objective: '[directive]'.") - return 1 + return TRUE //nursemaids - these create webs and eggs /mob/living/simple_animal/hostile/poison/giant_spider/nurse @@ -232,14 +213,14 @@ /mob/living/simple_animal/hostile/poison/giant_spider/handle_automated_action() if(!..()) //AIStatus is off - return 0 + return FALSE if(AIStatus == AI_IDLE) //1% chance to skitter madly away if(!busy && prob(1)) stop_automated_movement = TRUE Goto(pick(urange(20, src, 1)), move_to_delay) addtimer(CALLBACK(src, .proc/do_action), 5 SECONDS) - return 1 + return TRUE /mob/living/simple_animal/hostile/poison/giant_spider/proc/do_action() stop_automated_movement = FALSE @@ -254,7 +235,7 @@ /mob/living/simple_animal/hostile/poison/giant_spider/nurse/handle_automated_action() if(..()) - var/list/can_see = view(src, 10) + var/list/can_see = view(10, src) if(!busy && prob(30)) //30% chance to stop wandering and do something //first, check for potential food nearby to cocoon for(var/mob/living/C in can_see) @@ -340,11 +321,11 @@ /datum/action/innate/spider icon_icon = 'icons/mob/actions/actions_animal.dmi' background_icon_state = "bg_alien" + check_flags = AB_CHECK_CONSCIOUS /datum/action/innate/spider/lay_web name = "Spin Web" desc = "Spin a web to slow down potential prey." - check_flags = AB_CHECK_CONSCIOUS button_icon_state = "lay_web" /datum/action/innate/spider/lay_web/Activate() @@ -376,18 +357,12 @@ /obj/effect/proc_holder/wrap name = "Wrap" panel = "Spider" - active = FALSE - datum/action/spell_action/action = null desc = "Wrap something or someone in a cocoon. If it's a living being, you'll also consume them, allowing you to lay eggs." ranged_mousepointer = 'icons/effects/wrap_target.dmi' action_icon = 'icons/mob/actions/actions_animal.dmi' action_icon_state = "wrap_0" action_background_icon_state = "bg_alien" -/obj/effect/proc_holder/wrap/Initialize() - . = ..() - action = new(src) - /obj/effect/proc_holder/wrap/update_icon() action.button_icon_state = "wrap_[active]" action.UpdateButtonIcon() @@ -407,7 +382,7 @@ else message = "You prepare to wrap something in a cocoon. Left-click your target to start wrapping!" add_ranged_ability(user, message, TRUE) - return 1 + return TRUE /obj/effect/proc_holder/wrap/InterceptClickOn(mob/living/caller, params, atom/target) if(..()) @@ -432,18 +407,17 @@ /datum/action/innate/spider/lay_eggs name = "Lay Eggs" - desc = "Lay a cluster of eggs, which will soon grow into more spiders. You must wrap a living being to do this." - check_flags = AB_CHECK_CONSCIOUS + desc = "Lay a cluster of eggs, which will soon grow into more spiders. You must have a directive set and wrap a living being to do this." button_icon_state = "lay_eggs" /datum/action/innate/spider/lay_eggs/IsAvailable() if(..()) if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) - return 0 + return FALSE var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner - if(S.fed) - return 1 - return 0 + if(S.fed && (S.directive || !S.ckey)) + return TRUE + return FALSE /datum/action/innate/spider/lay_eggs/Activate() if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) @@ -455,6 +429,8 @@ to_chat(S, "There is already a cluster of eggs here!") else if(!S.fed) to_chat(S, "You are too hungry to do this!") + else if(!S.directive && S.ckey) + to_chat(S, "You need to set a directive to do this!") else if(S.busy != LAYING_EGGS) S.busy = LAYING_EGGS S.visible_message("[S] begins to lay a cluster of eggs.","You begin to lay a cluster of eggs.") @@ -478,15 +454,14 @@ /datum/action/innate/spider/set_directive name = "Set Directive" desc = "Set a directive for your children to follow." - check_flags = AB_CHECK_CONSCIOUS button_icon_state = "directive" - + /datum/action/innate/spider/set_directive/IsAvailable() if(..()) if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider)) return FALSE var/mob/living/simple_animal/hostile/poison/giant_spider/S = owner - if(S.playable_spider) + if(S.playable) return FALSE return TRUE @@ -494,10 +469,13 @@ if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) return var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner - if(!S.playable_spider) - S.directive = stripped_input(S, "Enter the new directive", "Create directive", "[S.directive]") - message_admins("[ADMIN_LOOKUPFLW(owner)] set its directive to: '[S.directive]'.") - log_game("[key_name(owner)] set its directive to: '[S.directive]'.") + if(!S.playable) + var/new_directive = stripped_input(S, "Enter the new directive", "Create directive", "[S.directive]") + if(new_directive) + S.directive = new_directive + message_admins("[ADMIN_LOOKUPFLW(owner)] set its directive to: '[S.directive]'.") + log_game("[key_name(owner)] set its directive to: '[S.directive]'.") + S.lay_eggs.UpdateButtonIcon(TRUE) /mob/living/simple_animal/hostile/poison/giant_spider/Login() . = ..() @@ -513,9 +491,7 @@ button_icon_state = "command" /datum/action/innate/spider/comm/IsAvailable() - if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife)) - return FALSE - return TRUE + return ..() && istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife) /datum/action/innate/spider/comm/Trigger() var/input = stripped_input(owner, "Input a command for your legions to follow.", "Command", "") @@ -539,10 +515,10 @@ /mob/living/simple_animal/hostile/poison/giant_spider/handle_temperature_damage() if(bodytemperature < minbodytemp) adjustBruteLoss(20) - throw_alert("temp", /obj/screen/alert/cold, 3) + throw_alert("temp", /atom/movable/screen/alert/cold, 3) else if(bodytemperature > maxbodytemp) adjustBruteLoss(20) - throw_alert("temp", /obj/screen/alert/hot, 3) + throw_alert("temp", /atom/movable/screen/alert/hot, 3) else clear_alert("temp") diff --git a/code/modules/mob/living/simple_animal/hostile/goose.dm b/code/modules/mob/living/simple_animal/hostile/goose.dm index c0b437b0e5fcb..9e582c1ca0ff9 100644 --- a/code/modules/mob/living/simple_animal/hostile/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/goose.dm @@ -57,6 +57,9 @@ goosevomit = new goosevomit.Grant(src) RegisterSignal(src, COMSIG_MOVABLE_MOVED, .proc/goosement) + if(prob(50)) + desc = "[initial(desc)] It's waddling more than usual. It seems to be possessed." + deadchat_plays_goose() /mob/living/simple_animal/hostile/retaliate/goose/vomit/Destroy() UnregisterSignal(src, COMSIG_MOVABLE_MOVED) @@ -91,7 +94,7 @@ if (stat == DEAD) return var/turf/T = get_turf(src) - var/obj/item/reagent_containers/food/consumed = locate() in contents //Barf out a single food item from our guts + var/obj/item/consumed = locate() in contents //Barf out a single food item from our guts if (prob(50) && consumed) barf_food(consumed) else @@ -140,21 +143,36 @@ icon_state = initial(icon_state) /mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/goosement(atom/movable/AM, OldLoc, Dir, Forced) + SIGNAL_HANDLER + if(stat == DEAD) return if(vomiting) - vomit() // its supposed to keep vomiting if you move + INVOKE_ASYNC(src, .proc/vomit) // its supposed to keep vomiting if you move return + INVOKE_ASYNC(src, .proc/eat) + if(prob(vomitCoefficient * 0.2)) + vomit_prestart(vomitTimeBonus + 25) + vomitCoefficient = 1 + vomitTimeBonus = 0 + +/// A proc to make it easier for admins to make the goose playable by deadchat. +/mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/deadchat_plays_goose() + stop_automated_movement = TRUE + AddComponent(/datum/component/deadchat_control, ANARCHY_MODE, list( + "up" = CALLBACK(GLOBAL_PROC, .proc/_step, src, NORTH), + "down" = CALLBACK(GLOBAL_PROC, .proc/_step, src, SOUTH), + "left" = CALLBACK(GLOBAL_PROC, .proc/_step, src, WEST), + "right" = CALLBACK(GLOBAL_PROC, .proc/_step, src, EAST), + "vomit" = CALLBACK(src, .proc/vomit_prestart, 25)), 20) + +/mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/eat() var/turf/currentTurf = get_turf(src) while (currentTurf == get_turf(src)) var/obj/item/reagent_containers/food/tasty = locate() in currentTurf if (tasty) feed(tasty) stoplag(2) - if(prob(vomitCoefficient * 0.2)) - vomit_prestart(vomitTimeBonus + 25) - vomitCoefficient = 1 - vomitTimeBonus = 0 /datum/action/cooldown/vomit name = "Vomit" diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/emotes.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/emotes.dm index d64406a61496a..a265a7582c7a4 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/emotes.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/emotes.dm @@ -5,7 +5,7 @@ /datum/emote/gorilla/ooga key = "ooga" key_third_person = "oogas" - message = "oogas." - message_param = "oogas at %t." + message = "oogas" + message_param = "oogas at %t" sound = 'sound/creatures/gorilla.ogg' diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 5726dde830d75..346718db2a6ce 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -21,6 +21,7 @@ ventcrawler = VENTCRAWLER_ALWAYS var/datum/mind/origin var/egg_lain = 0 + discovery_points = 2000 /mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim) var/obj/item/organ/body_egg/changeling_egg/egg = new(victim) @@ -55,7 +56,10 @@ var/time /obj/item/organ/body_egg/changeling_egg/egg_process() - // Changeling eggs grow in dead people + // Changeling eggs grow in dead people, but not people in stasis + var/mob/living/L = owner + if(L.IsInStasis()) + return time++ if(time >= EGG_INCUBATION_TIME) Pop() diff --git a/code/modules/mob/living/simple_animal/hostile/heart.dm b/code/modules/mob/living/simple_animal/hostile/heart.dm index b8b0d378f95f9..7ca09c012a641 100644 --- a/code/modules/mob/living/simple_animal/hostile/heart.dm +++ b/code/modules/mob/living/simple_animal/hostile/heart.dm @@ -1,6 +1,6 @@ /mob/living/simple_animal/hostile/heart name = "Heart" - desc = "A living heart. It's angry!." + desc = "A living heart. It's angry!" icon = 'icons/obj/surgery.dmi' icon_state = "heart-on" icon_living = "heart-on" @@ -26,7 +26,7 @@ gold_core_spawnable = HOSTILE_SPAWN see_in_dark = 8 deathmessage = "falls lifeless." - del_on_death = 1 + del_on_death = TRUE loot = list(/obj/item/organ/heart) atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 150 diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 8fae0249c3aeb..b0effc46ac7a4 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -25,7 +25,7 @@ minbodytemp = 0 speak_emote = list("states") gold_core_spawnable = HOSTILE_SPAWN - del_on_death = 1 + del_on_death = TRUE loot = list(/obj/effect/decal/cleanable/robot_debris) do_footstep = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index b1e418dcea140..608b442a2f073 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -3,6 +3,7 @@ stop_automated_movement_when_pulled = 0 obj_damage = 40 environment_smash = ENVIRONMENT_SMASH_STRUCTURES //Bitflags. Set to ENVIRONMENT_SMASH_STRUCTURES to break closets,tables,racks, etc; ENVIRONMENT_SMASH_WALLS for walls; ENVIRONMENT_SMASH_RWALLS for rwalls + ///The current target of our attacks, use GiveTarget and LoseTarget to set this var var/atom/target var/ranged = FALSE var/rapid = 0 //How many shots per volley. @@ -45,7 +46,9 @@ var/stat_attack = CONSCIOUS //Mobs with stat_attack to UNCONSCIOUS will attempt to attack things that are unconscious, Mobs with stat_attack set to DEAD will attempt to attack the dead. var/stat_exclusive = FALSE //Mobs with this set to TRUE will exclusively attack things defined by stat_attack, stat_attack DEAD means they will only attack corpses var/attack_same = 0 //Set us to 1 to allow us to attack our own faction - var/atom/targets_from = null //all range/attack/etc. calculations should be done from this atom, defaults to the mob itself, useful for Vehicles and such + //Use GET_TARGETS_FROM(mob) to access this + //Attempting to call GET_TARGETS_FROM(mob) when this var is null will just return mob as a base + var/datum/weakref/targets_from //all range/attack/etc. calculations should be done from the atom this weakrefs, useful for Vehicles and such. var/attack_all_objects = FALSE //if true, equivalent to having a wanted_objects list containing ALL objects. var/lose_patience_timer_id //id for a timer to call LoseTarget(), used to stop mobs fixating on a target they can't reach @@ -53,14 +56,11 @@ /mob/living/simple_animal/hostile/Initialize() . = ..() - - if(!targets_from) - targets_from = src wanted_objects = typecacheof(wanted_objects) - /mob/living/simple_animal/hostile/Destroy() - targets_from = null + //We can't use losetarget here because fucking cursed blobs override it to do nothing the motherfuckers + GiveTarget(null) return ..() /mob/living/simple_animal/hostile/Life() @@ -78,7 +78,8 @@ EscapeConfinement() if(AICanContinue(possible_targets)) - if(!QDELETED(target) && !targets_from.Adjacent(target)) + var/atom/target_from = GET_TARGETS_FROM(src) + if(!QDELETED(target) && !target_from.Adjacent(target)) DestroyPathToTarget() if(!MoveToTarget(possible_targets)) //if we lose our target if(AIShouldSleep(possible_targets)) // we try to acquire a new one @@ -127,21 +128,16 @@ //////////////HOSTILE MOB TARGETTING AND AGGRESSION//////////// -/mob/living/simple_animal/hostile/proc/ListTargets()//Step 1, find out what we can see +/mob/living/simple_animal/hostile/proc/ListTargets() //Step 1, find out what we can see + var/atom/target_from = GET_TARGETS_FROM(src) if(!search_objects) - . = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide - - var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha)) - - for(var/HM in typecache_filter_list(range(vision_range, targets_from), hostile_machines)) - if(can_see(targets_from, HM, vision_range)) - . += HM + var/static/target_list = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha)) //mobs are handled via ismob(A) + . = list() + for(var/atom/A as() in dview(vision_range, get_turf(target_from), SEE_INVISIBLE_MINIMUM)) + if((ismob(A) && A != src) || target_list[A.type]) + . += A else - . = list() // The following code is only very slightly slower than just returning oview(vision_range, targets_from), but it saves us much more work down the line, particularly when bees are involved - for (var/obj/A in oview(vision_range, targets_from)) - . += A - for (var/mob/A in oview(vision_range, targets_from)) - . += A + . = oview(vision_range, target_from) /mob/living/simple_animal/hostile/proc/FindTarget(var/list/possible_targets, var/HasTargetsList = 0)//Step 2, filter down possible targets to things we actually care about . = list() @@ -179,10 +175,11 @@ /mob/living/simple_animal/hostile/proc/PickTarget(list/Targets)//Step 3, pick amongst the possible, attackable targets if(target != null)//If we already have a target, but are told to pick again, calculate the lowest distance between all possible, and pick from the lowest distance targets + var/atom/target_from = GET_TARGETS_FROM(src) for(var/pos_targ in Targets) var/atom/A = pos_targ - var/target_dist = get_dist(targets_from, target) - var/possible_target_distance = get_dist(targets_from, A) + var/target_dist = get_dist(target_from, target) + var/possible_target_distance = get_dist(target_from, A) if(target_dist < possible_target_distance) Targets -= A if(!Targets.len)//We didnt find nothin! @@ -243,12 +240,12 @@ return FALSE /mob/living/simple_animal/hostile/proc/GiveTarget(new_target)//Step 4, give us our selected target - target = new_target + add_target(new_target) LosePatience() if(target != null) GainPatience() Aggro() - return 1 + return TRUE //What we do after closing in /mob/living/simple_animal/hostile/proc/MeleeAction(patience = TRUE) @@ -263,7 +260,8 @@ GainPatience() /mob/living/simple_animal/hostile/proc/CheckAndAttack() - if(target && targets_from && isturf(targets_from.loc) && target.Adjacent(targets_from) && !incapacitated()) + var/atom/target_from = GET_TARGETS_FROM(src) + if(target && isturf(target_from.loc) && target.Adjacent(target_from) && !incapacitated()) AttackingTarget() /mob/living/simple_animal/hostile/proc/MoveToTarget(list/possible_targets)//Step 5, handle movement between us and our target @@ -271,14 +269,15 @@ if(!target || !CanAttack(target)) LoseTarget() return 0 + var/atom/target_from = GET_TARGETS_FROM(src) if(target in possible_targets) var/turf/T = get_turf(src) - if(target.z != T.z) + if(target.get_virtual_z_level() != T.get_virtual_z_level()) LoseTarget() return 0 - var/target_distance = get_dist(targets_from,target) + var/target_distance = get_dist(target_from,target) if(ranged) //We ranged? Shoot at em - if(!target.Adjacent(targets_from) && ranged_cooldown <= world.time) //But make sure they're not in range for a melee attack and our range attack is off cooldown + if(!target.Adjacent(target_from) && ranged_cooldown <= world.time) //But make sure they're not in range for a melee attack and our range attack is off cooldown OpenFire(target) if(!Process_Spacemove()) //Drifting walk(src,0) @@ -291,7 +290,7 @@ else Goto(target,move_to_delay,minimum_distance) if(target) - if(targets_from && isturf(targets_from.loc) && target.Adjacent(targets_from)) //If they're next to us, attack + if(isturf(target_from.loc) && target.Adjacent(target_from)) //If they're next to us, attack MeleeAction() else if(rapid_melee > 1 && target_distance <= melee_queue_distance) @@ -300,7 +299,7 @@ return 1 return 0 if(environment_smash) - if(target.loc != null && get_dist(targets_from, target.loc) <= vision_range) //We can't see our target, but he's in our vision range still + if(target.loc != null && get_dist(target_from, target.loc) <= vision_range) //We can't see our target, but he's in our vision range still if(ranged_ignores_vision && ranged_cooldown <= world.time) //we can't see our target... but we can fire at them! OpenFire(target) if((environment_smash & ENVIRONMENT_SMASH_WALLS) || (environment_smash & ENVIRONMENT_SMASH_RWALLS)) //If we're capable of smashing through walls, forget about vision completely after finding our target @@ -324,7 +323,7 @@ . = ..() if(!ckey && !stat && search_objects < 3 && . > 0)//Not unconscious, and we don't ignore mobs if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight - target = null + LoseTarget() LoseSearchObjects() if(AIStatus != AI_ON && AIStatus != AI_OFF) toggle_ai(AI_ON) @@ -341,7 +340,7 @@ /mob/living/simple_animal/hostile/proc/Aggro() vision_range = aggro_vision_range if(target && emote_taunt.len && prob(taunt_chance)) - emote("me", 1, "[pick(emote_taunt)] at [target].") + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, "[pick(emote_taunt)] at [target].") taunt_chance = max(taunt_chance-7,2) @@ -351,7 +350,7 @@ taunt_chance = initial(taunt_chance) /mob/living/simple_animal/hostile/proc/LoseTarget() - target = null + GiveTarget(null) approaching_target = FALSE in_melee = FALSE walk(src, 0) @@ -366,7 +365,8 @@ /mob/living/simple_animal/hostile/proc/summon_backup(distance, exact_faction_match) do_alert_animation(src) playsound(loc, 'sound/machines/chime.ogg', 50, 1, -1) - for(var/mob/living/simple_animal/hostile/M in oview(distance, targets_from)) + var/atom/target_from = GET_TARGETS_FROM(src) + for(var/mob/living/simple_animal/hostile/M in oview(distance, target_from)) if(faction_check_mob(M, TRUE)) if(M.AIStatus == AI_OFF) return @@ -400,13 +400,14 @@ /mob/living/simple_animal/hostile/proc/Shoot(atom/targeted_atom) - if( QDELETED(targeted_atom) || targeted_atom == targets_from.loc || targeted_atom == targets_from ) + var/atom/target_from = GET_TARGETS_FROM(src) + if(QDELETED(targeted_atom) || targeted_atom == target_from.loc || targeted_atom == target_from ) return - var/turf/startloc = get_turf(targets_from) + var/turf/startloc = get_turf(target_from) if(casingtype) var/obj/item/ammo_casing/casing = new casingtype(startloc) playsound(src, projectilesound, 100, 1) - casing.fire_casing(targeted_atom, src, null, null, null, ran_zone(), 0, src) + casing.fire_casing(targeted_atom, src, null, null, null, ran_zone(), 0, 1, src) else if(projectiletype) var/obj/item/projectile/P = new projectiletype(startloc) playsound(src, projectilesound, 100, 1) @@ -416,7 +417,7 @@ P.yo = targeted_atom.y - startloc.y P.xo = targeted_atom.x - startloc.x if(AIStatus != AI_ON)//Don't want mindless mobs to have their movement screwed up firing in space - newtonian_move(get_dir(targeted_atom, targets_from)) + newtonian_move(get_dir(targeted_atom, target_from)) P.original = targeted_atom P.preparePixelProjectile(targeted_atom, src) P.fire() @@ -444,15 +445,16 @@ dodging = TRUE /mob/living/simple_animal/hostile/proc/DestroyObjectsInDirection(direction) - var/turf/T = get_step(targets_from, direction) + var/atom/target_from = GET_TARGETS_FROM(src) + var/turf/T = get_step(target_from, direction) if(QDELETED(T)) return - if(T.Adjacent(targets_from)) + if(T.Adjacent(target_from)) if(CanSmashTurfs(T)) T.attack_animal(src) return for(var/obj/O in T.contents) - if(!O.Adjacent(targets_from)) + if(!O.Adjacent(target_from)) continue if((ismachinery(O) || isstructure(O)) && O.density && environment_smash >= ENVIRONMENT_SMASH_STRUCTURES && !O.IsObscured()) O.attack_animal(src) @@ -461,7 +463,8 @@ /mob/living/simple_animal/hostile/proc/DestroyPathToTarget() if(environment_smash) EscapeConfinement() - var/dir_to_target = get_dir(targets_from, target) + var/atom/target_from = GET_TARGETS_FROM(src) + var/dir_to_target = get_dir(target_from, target) var/dir_list = list() if(dir_to_target in GLOB.diagonals) //it's diagonal, so we need two directions to hit for(var/direction in GLOB.cardinals) @@ -473,7 +476,7 @@ DestroyObjectsInDirection(direction) -mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with megafauna destroying everything around them +/mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with megafauna destroying everything around them if(environment_smash) EscapeConfinement() for(var/dir in GLOB.cardinals) @@ -481,24 +484,25 @@ mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with mega /mob/living/simple_animal/hostile/proc/EscapeConfinement() + var/atom/target_from = GET_TARGETS_FROM(src) if(buckled) buckled.attack_animal(src) - if(!isturf(targets_from.loc) && targets_from.loc != null)//Did someone put us in something? - var/atom/A = targets_from.loc + if(!isturf(target_from.loc) && target_from.loc != null)//Did someone put us in something? + var/atom/A = target_from.loc A.attack_animal(src)//Bang on it till we get out - /mob/living/simple_animal/hostile/proc/FindHidden() if(istype(target.loc, /obj/structure/closet) || istype(target.loc, /obj/machinery/disposal) || istype(target.loc, /obj/machinery/sleeper)) var/atom/A = target.loc + var/atom/target_from = GET_TARGETS_FROM(src) Goto(A,move_to_delay,minimum_distance) - if(A.Adjacent(targets_from)) + if(A.Adjacent(target_from)) A.attack_animal(src) return 1 /mob/living/simple_animal/hostile/RangedAttack(atom/A, params) //Player firing if(ranged && ranged_cooldown <= world.time) - target = A + GiveTarget(A) OpenFire(A) ..() @@ -577,3 +581,24 @@ mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with mega . += M else if (M.loc.type in hostile_machines) . += M.loc + +/mob/living/simple_animal/hostile/proc/get_targets_from() + var/atom/target_from = targets_from.resolve() + if(!target_from) + targets_from = null + return src + return target_from + +/mob/living/simple_animal/hostile/proc/handle_target_del(datum/source) + SIGNAL_HANDLER + + UnregisterSignal(target, COMSIG_PARENT_QDELETING) + target = null + LoseTarget() + +/mob/living/simple_animal/hostile/proc/add_target(new_target) + if(target) + UnregisterSignal(target, COMSIG_PARENT_QDELETING) + target = new_target + if(target) + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/handle_target_del) diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm index da3637c30b024..3675fd252bc0b 100644 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -17,7 +17,7 @@ var/life_span = INFINITY //how long until they despawn var/mob/living/parent_mob var/multiply_chance = 0 //if we multiply on hit - del_on_death = 1 + del_on_death = TRUE deathmessage = "vanishes into thin air! It was a fake!" 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 ec69b70db3c2c..97db9830ba83e 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 @@ -16,3 +16,4 @@ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE mob_size = MOB_SIZE_LARGE hardattacks = TRUE + discovery_points = 2000 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 7cf9d0d47441d..a76989adf77e6 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -128,11 +128,11 @@ /mob/living/simple_animal/hostile/jungle/leaper/Initialize() . = ..() - verbs -= /mob/living/verb/pulled + remove_verb(/mob/living/verb/pulled) /mob/living/simple_animal/hostile/jungle/leaper/CtrlClickOn(atom/A) face_atom(A) - target = A + GiveTarget(A) if(!isturf(loc)) return if(next_move > world.time) 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 4167b0fc01220..b8a4b5e39c86d 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 @@ -22,6 +22,7 @@ projectiletype = /obj/item/projectile/mega_arachnid projectilesound = 'sound/weapons/pierce.ogg' alpha = 50 + discovery_points = 5000 do_footstep = TRUE 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 8ca4afc3bccc7..d08f2d0f051b8 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm @@ -90,9 +90,10 @@ if(target && !stat && attack_state == MOOK_ATTACK_ACTIVE) melee_damage = 15 var/mob_direction = get_dir(src,target) + var/atom/target_from = GET_TARGETS_FROM(src) if(get_dist(src,target) > 1) step(src,mob_direction) - if(targets_from && isturf(targets_from.loc) && target.Adjacent(targets_from) && isliving(target)) + if(isturf(target_from.loc) && target.Adjacent(target_from) && isliving(target)) var/mob/living/L = target L.attack_animal(src) return diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm index 65088757ffe14..97c1443b8d8e2 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm @@ -67,7 +67,7 @@ status_type = STATUS_EFFECT_MULTIPLE alert_type = null tick_interval = 1 - var/obj/screen/seedling/seedling_screen_object + var/atom/movable/screen/seedling/seedling_screen_object var/atom/target @@ -79,7 +79,7 @@ /datum/status_effect/seedling_beam_indicator/on_apply() if(owner.client) - seedling_screen_object = new /obj/screen/seedling() + seedling_screen_object = new /atom/movable/screen/seedling() owner.client.screen += seedling_screen_object tick() return ..() @@ -96,7 +96,7 @@ final.Turn(target_angle) seedling_screen_object.transform = final -/obj/screen/seedling +/atom/movable/screen/seedling icon = 'icons/mob/jungle/arachnid.dmi' icon_state = "seedling_beam_indicator" screen_loc = "CENTER:-16,CENTER:-16" @@ -145,7 +145,7 @@ /mob/living/simple_animal/hostile/jungle/seedling/proc/Beamu(mob/living/living_target, beam_id = 0) if(combatant_state == SEEDLING_STATE_ACTIVE && living_target && beam_id == solar_beam_identifier) - if(living_target.z == z) + if(living_target.get_virtual_z_level() == get_virtual_z_level()) update_icons() var/obj/effect/temp_visual/solarbeam_killsat/S = new (get_turf(src)) var/matrix/starting = matrix() diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm index 2d1cf0fd9e2a0..d9a641e070348 100644 --- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -20,6 +20,9 @@ ventcrawler = VENTCRAWLER_ALWAYS faction = list("plants") + mobchatspan = "headofsecurity" + discovery_points = 1000 + atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 150 maxbodytemp = 500 @@ -33,4 +36,4 @@ if(tomatosseen >= frenzythreshold) attack_same = TRUE . = ..() - + diff --git a/code/modules/mob/living/simple_animal/hostile/macrophage.dm b/code/modules/mob/living/simple_animal/hostile/macrophage.dm index c476f2c6eb69d..815a52ee5849d 100644 --- a/code/modules/mob/living/simple_animal/hostile/macrophage.dm +++ b/code/modules/mob/living/simple_animal/hostile/macrophage.dm @@ -23,10 +23,11 @@ ventcrawler = VENTCRAWLER_ALWAYS 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 - del_on_death = 1 + del_on_death = TRUE var/aggressive = FALSE var/datum/disease/basedisease = null var/list/infections = list() + discovery_points = 2000 /mob/living/simple_animal/hostile/macrophage/CanAttack(atom/the_target) . = ..() @@ -76,17 +77,6 @@ visible_message("the [src] shrivels up and dies!") dust() -/mob/living/simple_animal/hostile/macrophage/proc/InitializeSkin() - for(var/datum/disease/advance/A in infections) - for(var/datum/symptom/S in A.symptoms) - if(istype(S, /datum/symptom/flesh))//yes, we do a check for if we have exolocomotive xenomitosis just to turn the phage pink - if(istype(src, /mob/living/simple_animal/hostile/macrophage/aggro)) - icon_state = "pinkvirus_large" - else - icon_state = "pinkvirus_small" - break - - /mob/living/simple_animal/hostile/macrophage/aggro name = "Giant Germ" desc = "An incredibly huge virus!" @@ -103,9 +93,9 @@ /mob/living/simple_animal/hostile/macrophage/aggro/vector/Initialize() .=..() var/datum/disease/advance/random/macrophage/D = new - health += D.properties["resistance"] - maxHealth += D.properties["resistance"] - melee_damage += max(0, D.properties["resistance"]) + health += D.resistance + maxHealth += D.resistance + melee_damage += max(0, D.resistance) infections += D basedisease = D diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm index ef952158ed3f3..ceb08dc94156a 100644 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm @@ -45,7 +45,7 @@ wanted_objects = typecacheof(/obj/mecha/combat, TRUE) /mob/living/simple_animal/hostile/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path. - name = "Nanotrasen Mecha Pilot" + name = "\improper Nanotrasen Mecha Pilot" desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour." icon_living = "nanotrasen" icon_state = "nanotrasen" @@ -53,7 +53,7 @@ spawn_mecha_type = /obj/mecha/combat/marauder/loaded /mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/nanotrasen - name = "Nanotrasen Mecha Pilot" + name = "\improper Nanotrasen Mecha Pilot" desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour." icon_living = "nanotrasen" icon_state = "nanotrasen" @@ -71,9 +71,9 @@ /mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/mecha/M) if(!M) return 0 - target = null //Target was our mecha, so null it out + LoseTarget() //Target was our mecha, so null it out M.aimob_enter_mech(src) - targets_from = M + targets_from = WEAKREF(M) allow_movement_on_non_turfs = TRUE //duh var/do_ranged = 0 for(var/equip in mecha.equipment) @@ -99,14 +99,14 @@ mecha.aimob_exit_mech(src) allow_movement_on_non_turfs = FALSE - targets_from = src + targets_from = null //Find a new mecha wanted_objects = typecacheof(/obj/mecha/combat, TRUE) var/search_aggressiveness = 2 - for(var/obj/mecha/combat/C in range(vision_range,src)) + for(var/obj/mecha/combat/C in view(vision_range,src)) if(is_valid_mecha(C)) - target = C + GiveTarget(C) search_aggressiveness = 3 //We can see a mech? RUN FOR IT, IGNORE MOBS! break search_objects = search_aggressiveness @@ -192,7 +192,7 @@ return else if(!CanAttack(M)) - target = null + LoseTarget() return return target.attack_animal(src) @@ -201,9 +201,9 @@ /mob/living/simple_animal/hostile/syndicate/mecha_pilot/handle_automated_action() if(..()) if(!mecha) - for(var/obj/mecha/combat/C in range(src,vision_range)) + for(var/obj/mecha/combat/C in view(vision_range, src)) if(is_valid_mecha(C)) - target = C //Let's nab it! + GiveTarget(C) //Let's nab it! minimum_distance = 1 ranged = 0 break @@ -241,8 +241,7 @@ addtimer(CALLBACK(mecha.overload_action, /datum/action/innate/mecha/mech_defense_mode.proc/Activate, FALSE), 100) //10 seconds of speeeeed, then toggle off retreat_distance = 50 - spawn(100) - retreat_distance = 0 + addtimer(VARSET_CALLBACK(src, retreat_distance, 0), 100) 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 1ed2bad29c271..cab7b7b29598a 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 @@ -39,8 +39,8 @@ Difficulty: Medium ranged = TRUE ranged_cooldown_time = 16 pixel_x = -16 - crusher_loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator, /obj/item/crusher_trophy/miner_eye) - loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator) + crusher_loot = list(/obj/structure/closet/crate/necropolis/bdm, /obj/item/crusher_trophy/miner_eye) + loot = list(/obj/structure/closet/crate/necropolis/bdm) wander = FALSE del_on_death = TRUE blood_volume = BLOOD_VOLUME_NORMAL @@ -129,7 +129,7 @@ Difficulty: Medium new /obj/effect/temp_visual/dir_setting/miner_death(loc, dir) /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Move(atom/newloc) - if(dashing || (newloc && newloc.z == z && (islava(newloc) || ischasm(newloc)))) //we're not stupid! + if(dashing || (newloc && newloc.get_virtual_z_level() == get_virtual_z_level() && (islava(newloc) || ischasm(newloc)))) //we're not stupid! return FALSE return ..() 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 8059b47e448dc..8cb95163c307c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -18,10 +18,7 @@ It may summon clones charging from all sides, one of these charges being bubbleg It can charge at its target, and also heavily damaging anything directly hit in the charge. If at half health it will start to charge from all sides with clones. -When Bubblegum dies, it leaves behind a H.E.C.K. mining suit as well as a chest that can contain three things: - 1. A bottle that, when activated, drives everyone nearby into a frenzy - 2. A contract that marks for death the chosen target - 3. A spellblade that can slice off limbs at range +When Bubblegum dies, it leaves behind a H.E.C.K. mining suit. Difficulty: Hard @@ -51,7 +48,7 @@ Difficulty: Hard ranged = TRUE pixel_x = -32 del_on_death = TRUE - crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher) + crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum, /obj/item/crusher_trophy/demon_claws) loot = list(/obj/structure/closet/crate/necropolis/bubblegum) blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME var/charging = FALSE @@ -350,7 +347,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_pools(turf/T, range) . = list() - for(var/obj/effect/decal/cleanable/nearby in view(T, range)) + for(var/obj/effect/decal/cleanable/nearby in view(range, T)) if(nearby.can_bloodcrawl_in()) . += nearby @@ -472,7 +469,10 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/bubblegum/Bump(atom/A) if(charging) if(isturf(A) || isobj(A) && A.density) - A.ex_act(EXPLODE_HEAVY) + if(isobj(A)) + SSexplosions.med_mov_atom += A + else + SSexplosions.medturf += A DestroySurroundings() if(isliving(A)) var/mob/living/L = A @@ -526,7 +526,7 @@ Difficulty: Hard true_spawn = FALSE /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Initialize() - ..() + . = ..() toggle_ai(AI_OFF) /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/charge(var/atom/chargeat = target, var/delay = 3, var/chargepast = 2) 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 a02a4563801b6..c048e94d10697 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -44,7 +44,7 @@ Difficulty: Very Hard gps_name = "Angelic Signal" medal_type = BOSS_MEDAL_COLOSSUS score_type = COLOSSUS_SCORE - crusher_loot = list(/obj/structure/closet/crate/necropolis/colossus/crusher) + crusher_loot = list(/obj/structure/closet/crate/necropolis/colossus, /obj/item/crusher_trophy/blaster_tubes) loot = list(/obj/structure/closet/crate/necropolis/colossus) deathmessage = "disintegrates, leaving a glowing core in its wake." deathsound = 'sound/magic/demon_dies.ogg' @@ -255,9 +255,14 @@ Difficulty: Very Hard /obj/item/projectile/colossus/on_hit(atom/target, blocked = FALSE) . = ..() if(isturf(target) || isobj(target)) - target.ex_act(EXPLODE_HEAVY) + if(isobj(target)) + SSexplosions.med_mov_atom += target + else + SSexplosions.medturf += target +//There can only ever be one blackbox, and we want to know if there already is one when we spawn +GLOBAL_DATUM(blackbox, /obj/machinery/smartfridge/black_box) //Black Box @@ -288,11 +293,9 @@ Difficulty: Very Hard /obj/machinery/smartfridge/black_box/Initialize() . = ..() - var/static/obj/machinery/smartfridge/black_box/current - if(current && current != src) - qdel(src, force=TRUE) - return - current = src + if(GLOB.blackbox != src) + return INITIALIZE_HINT_QDEL_FORCE + GLOB.blackbox = src ReadMemory() /obj/machinery/smartfridge/black_box/process() @@ -337,6 +340,8 @@ Difficulty: Very Hard /obj/machinery/smartfridge/black_box/Destroy(force = FALSE) if(force) + if(GLOB.blackbox == src) + GLOB.blackbox = null for(var/thing in src) qdel(thing) return ..() @@ -386,7 +391,6 @@ Difficulty: Very Hard use_power = NO_POWER_USE anchored = FALSE density = TRUE - flags_1 = HEAR_1 var/activation_method var/list/possible_methods = list(ACTIVATE_TOUCH, ACTIVATE_SPEECH, ACTIVATE_HEAT, ACTIVATE_BULLET, ACTIVATE_ENERGY, ACTIVATE_BOMB, ACTIVATE_MOB_BUMP, ACTIVATE_WEAPON, ACTIVATE_MAGIC) @@ -400,6 +404,7 @@ Difficulty: Very Hard . = ..() if(!activation_method) activation_method = pick(possible_methods) + become_hearing_sensitive(trait_source = ROUNDSTART_TRAIT) /obj/machinery/anomalous_crystal/examine(mob/user) . = ..() @@ -407,7 +412,7 @@ Difficulty: Very Hard . += observer_desc . += "It is activated by [activation_method]." -/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) +/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, list/message_mods = list()) ..() if(isliving(speaker)) ActivationReaction(speaker, ACTIVATE_SPEECH) @@ -664,8 +669,8 @@ Difficulty: Very Hard /mob/living/simple_animal/hostile/lightgeist/Initialize() . = ..() - verbs -= /mob/living/verb/pulled - verbs -= /mob/verb/me_verb + remove_verb(/mob/living/verb/pulled) + remove_verb(/mob/verb/me_verb) var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] medsensor.add_hud_to(src) @@ -677,11 +682,13 @@ Difficulty: Very Hard L.heal_overall_damage(heal_power, heal_power) new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF") -/mob/living/simple_animal/hostile/lightgeist/ghostize() +/mob/living/simple_animal/hostile/lightgeist/ghostize(can_reenter_corpse, sentience_retention) . = ..() if(.) death() +/mob/living/simple_animal/hostile/lightgeist/slime + name = "crystalline lightgeist" /obj/machinery/anomalous_crystal/refresher //Deletes and recreates a copy of the item, "refreshing" it. observer_desc = "This crystal \"refreshes\" items that it affects, rendering them as new." @@ -713,7 +720,7 @@ Difficulty: Very Hard if(..()) if(ishuman(user)) var/mobcheck = FALSE - for(var/mob/living/simple_animal/A in range(1, src)) + for(var/mob/living/simple_animal/A in viewers(1, src)) if(A.melee_damage > 5 || A.mob_size >= MOB_SIZE_LARGE || A.ckey || A.stat) break var/obj/structure/closet/stasis/S = new /obj/structure/closet/stasis(A) @@ -746,6 +753,7 @@ Difficulty: Very Hard START_PROCESSING(SSobj, src) /obj/structure/closet/stasis/Entered(atom/A) + . = ..() if(isliving(A) && holder_animal) var/mob/living/L = A L.notransform = 1 @@ -754,7 +762,7 @@ Difficulty: Very Hard L.mind.transfer_to(holder_animal) var/obj/effect/proc_holder/spell/targeted/exit_possession/P = new /obj/effect/proc_holder/spell/targeted/exit_possession holder_animal.mind.AddSpell(P) - holder_animal.verbs -= /mob/living/verb/pulled + holder_animal.remove_verb(/mob/living/verb/pulled) /obj/structure/closet/stasis/dump_contents(var/kill = 1) STOP_PROCESSING(SSobj, src) 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 df9ed449619f1..59d353f34a004 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -18,11 +18,7 @@ The drake also utilizes its wings to fly into the sky, flying after its target a - Sometimes it will chain these swooping attacks over and over, making swiftness a necessity. - Sometimes, it will encase its target in an arena of lava -When an ash drake dies, it leaves behind a chest that can contain four things: - 1. A spectral blade that allows its wielder to call ghosts to it, enhancing its power - 2. A lava staff that allows its wielder to create lava - 3. A spellbook and wand of fireballs - 4. A bottle of dragon's blood with several effects, including turning its imbiber into a drake themselves. +When an ash drake dies, it leaves behind a chest that contains a bottle of dragon's blood with several effects, ranging from turning the imbiber into a lizard, skeleton or just making them lavaproof. When butchered, they leave behind diamonds, sinew, bone, and ash drake hide. Ash drake hide can be used to create a hooded cloak that protects its wearer from ash storms. @@ -49,7 +45,7 @@ Difficulty: Medium move_to_delay = 5 ranged = TRUE pixel_x = -16 - crusher_loot = list(/obj/structure/closet/crate/necropolis/dragon/crusher) + crusher_loot = list(/obj/structure/closet/crate/necropolis/dragon, /obj/item/crusher_trophy/tail_spike) loot = list(/obj/structure/closet/crate/necropolis/dragon) butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30) guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/ashdrake = 10) @@ -132,7 +128,7 @@ Difficulty: Medium if(!target) return target.visible_message("Fire rains from the sky!") - for(var/turf/turf in range(9,get_turf(target))) + for(var/turf/turf as() in RANGE_TURFS(9,target)) if(prob(11)) new /obj/effect/temp_visual/target(turf) @@ -182,10 +178,10 @@ Difficulty: Medium var/turf/center = get_turf(target) var/list/walled = RANGE_TURFS(3, center) - RANGE_TURFS(2, center) var/list/drakewalls = list() - for(var/turf/T in walled) + for(var/turf/T as() in walled) drakewalls += new /obj/effect/temp_visual/drakewall(T) // no people with lava immunity can just run away from the attack for free var/list/indestructible_turfs = list() - for(var/turf/T in RANGE_TURFS(2, center)) + for(var/turf/T as() in RANGE_TURFS(2, center)) if(istype(T, /turf/open/indestructible)) continue if(!istype(T, /turf/closed/indestructible)) @@ -198,7 +194,7 @@ Difficulty: Medium while(amount > 0) var/list/empty = indestructible_turfs.Copy() // can't place safe turfs on turfs that weren't changed to be open var/any_attack = 0 - for(var/turf/T in turfs) + for(var/turf/T as() in turfs) for(var/mob/living/L in T.contents) if(L.client) empty += pick(((RANGE_TURFS(2, L) - RANGE_TURFS(1, L)) & turfs) - empty) // picks a turf within 2 of the creature not outside or in the shield @@ -290,7 +286,7 @@ Difficulty: Medium if(stat || swooping) return if(manual_target) - target = manual_target + GiveTarget(manual_target) if(!target) return stop_automated_movement = TRUE @@ -389,7 +385,7 @@ Difficulty: Medium return FALSE return ..() -/mob/living/simple_animal/hostile/megafauna/dragon/visible_message() +/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, list/visible_message_flags) if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit return return ..() @@ -515,7 +511,7 @@ Difficulty: Medium else animate(src, pixel_x = -16, pixel_z = 0, time = 5) -obj/effect/temp_visual/fireball +/obj/effect/temp_visual/fireball icon = 'icons/obj/wizard.dmi' icon_state = "fireball" name = "fireball" @@ -662,4 +658,4 @@ obj/effect/temp_visual/fireball ..(targets, user, 60) /mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/AltClickOn(atom/movable/A) - return \ No newline at end of file + return 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 82441c04b43e0..7f340bbf0a629 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -54,8 +54,8 @@ Difficulty: Hard ranged = TRUE ranged_cooldown_time = 40 aggro_vision_range = 21 //so it can see to one side of the arena to the other - loot = list(/obj/item/hierophant_club) - crusher_loot = list(/obj/item/hierophant_club, /obj/item/crusher_trophy/vortex_talisman) + loot = list(/obj/structure/closet/crate/necropolis/hierophant) + crusher_loot = list(/obj/structure/closet/crate/necropolis/hierophant, /obj/item/crusher_trophy/vortex_talisman) wander = FALSE gps_name = "Zealous Signal" medal_type = BOSS_MEDAL_HIEROPHANT @@ -79,12 +79,17 @@ Difficulty: Hard var/did_reset = TRUE //if we timed out, returned to our beacon, and healed some var/list/kill_phrases = list("Wsyvgi sj irivkc xettih. Vitemvmrk...", "Irivkc wsyvgi jsyrh. Vitemvmrk...", "Jyip jsyrh. Egxmzexmrk vitemv gcgpiw...", "Kix fiex. Liepmrk...") var/list/target_phrases = list("Xevkix psgexih.", "Iriqc jsyrh.", "Eguymvih xevkix.") - var/list/stored_nearby = list() // stores people nearby the hierophant when it enters the death animation + + mobchatspan = "hierosay" /mob/living/simple_animal/hostile/megafauna/hierophant/Initialize() . = ..() spawned_beacon = new(loc) +/mob/living/simple_animal/hostile/megafauna/hierophant/Destroy() + QDEL_NULL(spawned_beacon) + . = ..() + /datum/action/innate/megafauna_attack/blink name = "Blink To Target" icon_icon = 'icons/mob/actions/actions_items.dmi' @@ -362,8 +367,7 @@ Difficulty: Hard /proc/hierophant_burst(mob/caster, turf/original, burst_range, spread_speed = 0.5) playsound(original,'sound/machines/airlockopen.ogg', 200, 1) var/last_dist = 0 - for(var/t in spiral_range_turfs(burst_range, original)) - var/turf/T = t + for(var/turf/T as() in spiral_range_turfs(burst_range, original)) if(!T) continue var/dist = get_dist(original, T) @@ -397,20 +401,17 @@ Difficulty: Hard if(health > 0 || stat == DEAD) return else - stat = DEAD + set_stat(DEAD) blinking = TRUE //we do a fancy animation, release a huge burst(), and leave our staff. visible_message("\"Mrmxmexmrk wipj-hiwxvygx wiuyirgi...\"") visible_message("[src] shrinks, releasing a massive burst of energy!") - for(var/mob/living/L in view(7,src)) + var/list/stored_nearby = list() + for(var/mob/living/L in oviewers(7,src)) stored_nearby += L // store the people to grant the achievements to once we die hierophant_burst(null, get_turf(src), 10) - stat = CONSCIOUS // deathgasp wont run if dead, stupid + set_stat(CONSCIOUS) // deathgasp wont run if dead, stupid ..(force_grant = stored_nearby) -/mob/living/simple_animal/hostile/megafauna/hierophant/Destroy() - qdel(spawned_beacon) - . = ..() - /mob/living/simple_animal/hostile/megafauna/hierophant/devour(mob/living/L) for(var/obj/item/W in L) if(!L.dropItemToGround(W)) @@ -451,6 +452,7 @@ Difficulty: Hard else burst_range = 3 INVOKE_ASYNC(src, .proc/burst, get_turf(src), 0.25) //melee attacks on living mobs cause it to release a fast burst if on cooldown + OpenFire() else devour(L) else @@ -695,6 +697,9 @@ Difficulty: Hard playsound(M,'sound/weapons/sear.ogg', 50, 1, -4) M.take_damage(damage, BURN, 0, 0) +/obj/effect/temp_visual/hierophant/blast/vortex + damage = 25 + /obj/effect/hierophant name = "hierophant beacon" desc = "A strange beacon, allowing mass teleportation for those able to use it." 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 6f9ebbdbfa993..56673314a148d 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -153,7 +153,7 @@ Difficulty: Medium last_legion = FALSE break if(last_legion) - loot = list(/obj/item/staff/storm) + loot = list(/obj/structure/closet/crate/necropolis/legion) elimination = FALSE else if(prob(5)) loot = list(/obj/structure/closet/crate/necropolis/tendril) 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 5b575cad038b2..c9d65a3bce89b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -27,8 +27,10 @@ pull_force = MOVE_FORCE_OVERPOWERING 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 mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway hardattacks = TRUE + discovery_points = 10000 var/list/crusher_loot var/medal_type var/score_type = BOSS_SCORE @@ -60,13 +62,10 @@ 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 + LoseTarget() return return ..() -/mob/living/simple_animal/hostile/megafauna/prevent_content_explosion() - return TRUE - /mob/living/simple_animal/hostile/megafauna/death(gibbed, var/list/force_grant) if(health > 0) return @@ -145,7 +144,7 @@ if(!medal_type || (flags_1 & ADMIN_SPAWNED_1) || !SSmedals.hub_enabled) //Don't award medals if the medal type isn't set return FALSE if(!grant_achievement.len) - for(var/mob/living/L in view(7,src)) + for(var/mob/living/L in oviewers(7,src)) grant_achievement += L for(var/mob/living/L in grant_achievement) if(L.stat || !L.client) @@ -153,7 +152,7 @@ var/client/C = L.client SSmedals.UnlockMedal("Boss [BOSS_KILL_MEDAL]", C) SSmedals.UnlockMedal("[medaltype] [BOSS_KILL_MEDAL]", C) - if(crusher_kill && istype(L.get_active_held_item(), /obj/item/twohanded/kinetic_crusher)) + if(crusher_kill && istype(L.get_active_held_item(), /obj/item/kinetic_crusher)) SSmedals.UnlockMedal("[medaltype] [BOSS_KILL_MEDAL_CRUSHER]", C) SSmedals.SetScore(BOSS_SCORE, C, 1) SSmedals.SetScore(score_type, C, 1) @@ -163,16 +162,15 @@ 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 + if(!ismegafauna(L)) + return FALSE + return ..() /datum/action/innate/megafauna_attack/Activate() - M.chosen_attack = chosen_attack_num - to_chat(M, chosen_message) + var/mob/living/simple_animal/hostile/megafauna/fauna = owner + fauna.chosen_attack = chosen_attack_num + to_chat(fauna, 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 0c434a12cd8f6..6dc020881d9a7 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm @@ -62,6 +62,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa var/call_help_cooldown = 0 var/call_help_cooldown_amt = 150 //Deciseconds between calling swarmers to help us when attacked var/static/list/swarmer_caps + del_on_death = TRUE /mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/Initialize() @@ -93,7 +94,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa //AI versions of the swarmer mini-antag //This is an Abstract Base, it re-enables AI, but does not give the swarmer any goals/targets /mob/living/simple_animal/hostile/swarmer/ai - wander = 1 + wander = TRUE faction = list("swarmer", "mining") weather_immunities = list("ash") //wouldn't be fun otherwise AIStatus = AI_ON @@ -128,7 +129,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa /mob/living/simple_animal/hostile/swarmer/ai/Move(atom/newloc) if(newloc) - if(newloc.z == z) //so these actions are Z-specific + if(newloc.get_virtual_z_level() == get_virtual_z_level()) //so these actions are Z-specific if(islava(newloc)) var/turf/open/lava/L = newloc if(!L.is_safe()) @@ -145,13 +146,13 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa /mob/living/simple_animal/hostile/swarmer/ai/proc/StartAction(deci = 0) stop_automated_movement = TRUE - AIStatus = AI_OFF + toggle_ai(AI_OFF) addtimer(CALLBACK(src, .proc/EndAction), deci) /mob/living/simple_animal/hostile/swarmer/ai/proc/EndAction() stop_automated_movement = FALSE - AIStatus = AI_ON + toggle_ai(AI_ON) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index fa0b4cadcc689..2b3d8d7dca5b2 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -27,15 +27,17 @@ faction = list("mimic") move_to_delay = 9 gold_core_spawnable = HOSTILE_SPAWN - del_on_death = 1 + del_on_death = TRUE hardattacks = TRUE + discovery_points = 4000 + // 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" speak_emote = list("clatters") stop_automated_movement = 1 - wander = 0 + wander = FALSE var/attempt_open = FALSE // Pickup loot @@ -44,13 +46,15 @@ if(mapload) //eat shit for(var/obj/item/I in loc) I.forceMove(src) + add_overlay("[icon_state]_door") /mob/living/simple_animal/hostile/mimic/crate/DestroyPathToTarget() ..() + cut_overlays() if(prob(90)) - icon_state = "[initial(icon_state)]open" + add_overlay("[icon_state]_open") else - icon_state = initial(icon_state) + add_overlay("[icon_state]_door") /mob/living/simple_animal/hostile/mimic/crate/ListTargets() if(attempt_open) @@ -65,7 +69,8 @@ /mob/living/simple_animal/hostile/mimic/crate/AttackingTarget() . = ..() if(.) - icon_state = initial(icon_state) + cut_overlays() + add_overlay("[icon_state]_door") /mob/living/simple_animal/hostile/mimic/crate/proc/trigger() if(!attempt_open) @@ -78,7 +83,8 @@ /mob/living/simple_animal/hostile/mimic/crate/LoseTarget() ..() - icon_state = initial(icon_state) + cut_overlays() + add_overlay("[icon_state]_door") /mob/living/simple_animal/hostile/mimic/crate/death() var/obj/structure/closet/crate/C = new(get_turf(src)) 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 297583db771ba..0316bf2d88331 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 @@ -32,6 +32,7 @@ gold_core_spawnable = HOSTILE_SPAWN loot = list(/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER}, /obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER}) + discovery_points = 2000 /obj/item/projectile/temp/basilisk name = "freezing blast" @@ -44,7 +45,8 @@ /mob/living/simple_animal/hostile/asteroid/basilisk/GiveTarget(new_target) if(..()) //we have a target - if(isliving(target) && !target.Adjacent(targets_from) && ranged_cooldown <= world.time)//No more being shot at point blank or spammed with RNG beams + var/atom/target_from = GET_TARGETS_FROM(src) + if(isliving(target) && !target.Adjacent(target_from) && ranged_cooldown <= world.time)//No more being shot at point blank or spammed with RNG beams OpenFire(target) /mob/living/simple_animal/hostile/asteroid/basilisk/ex_act(severity, target) 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 cc1fe3c41ada7..6d5c209815262 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 @@ -24,6 +24,7 @@ var/list/attack_action_types = list() var/can_talk = FALSE var/obj/loot_drop = null + discovery_points = 5000 //Gives player-controlled variants the ability to swap attacks /mob/living/simple_animal/hostile/asteroid/elite/Initialize(mapload) @@ -69,19 +70,18 @@ While using this makes the system rely on OnFire, it still gives options for tim icon_icon = 'icons/mob/actions/actions_elites.dmi' button_icon_state = "" background_icon_state = "bg_default" - var/mob/living/simple_animal/hostile/asteroid/elite/M var/chosen_message var/chosen_attack_num = 0 /datum/action/innate/elite_attack/Grant(mob/living/L) if(istype(L, /mob/living/simple_animal/hostile/asteroid/elite)) - M = L return ..() return FALSE /datum/action/innate/elite_attack/Activate() - M.chosen_attack = chosen_attack_num - to_chat(M, chosen_message) + var/mob/living/simple_animal/hostile/asteroid/elite/elite_owner = owner + elite_owner.chosen_attack = chosen_attack_num + to_chat(elite_owner, chosen_message) /mob/living/simple_animal/hostile/asteroid/elite/updatehealth() . = ..() @@ -110,7 +110,7 @@ While using this makes the system rely on OnFire, it still gives options for tim severity = 7 hud_used.healths.icon_state = "elite_health[severity]" if(severity > 0) - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + overlay_fullscreen("brute", /atom/movable/screen/fullscreen/brute, severity) else clear_fullscreen("brute") @@ -119,7 +119,7 @@ While using this makes the system rely on OnFire, it still gives options for tim /obj/structure/elite_tumor name = "pulsing tumor" desc = "An odd, pulsing tumor sticking out of the ground. You feel compelled to reach out and touch it..." - armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 0) resistance_flags = INDESTRUCTIBLE icon = 'icons/obj/lavaland/tumor.dmi' icon_state = "tumor" @@ -205,11 +205,11 @@ While using this makes the system rely on OnFire, it still gives options for tim activator = null return ..() -/obj/structure/elite_tumor/process() +/obj/structure/elite_tumor/process(delta_time) if(isturf(loc)) for(var/mob/living/simple_animal/hostile/asteroid/elite/elitehere in loc) if(elitehere == mychild && activity == TUMOR_PASSIVE) - mychild.adjustHealth(-mychild.maxHealth*0.05) + mychild.adjustHealth(-mychild.maxHealth*0.025*delta_time) var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(mychild)) H.color = "#FF0000" @@ -358,4 +358,4 @@ While using this makes the system rely on OnFire, it still gives options for tim if(mover == ourelite || mover == activator) return FALSE else - return TRUE \ No newline at end of file + return TRUE 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 b61529d9d8baf..57a6d71a47094 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 @@ -188,14 +188,10 @@ if(get_dist(src, target) <= 7)//Screen range check, so it can't attack people off-screen visible_message("[src] digs one of its tentacles under [target]!") new /obj/effect/temp_visual/goliath_tentacle/broodmother(tturf, src) - /mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/death() . = ..() if(mother != null) mother.children_list -= src - visible_message("[src] explodes!") - explosion(get_turf(loc),0,0,0,flame_range = 3, adminlog = FALSE) - gib() //Tentacles have less stun time compared to regular variant, to balance being able to use them much more often. Also, 10 more damage. /obj/effect/temp_visual/goliath_tentacle/broodmother/trip() 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 65b42ec8c8385..99bf3ec3f15d8 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 @@ -200,7 +200,7 @@ 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() 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 ef20cf2c4a0ac..97dfc1db67ce4 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 @@ -224,7 +224,7 @@ throw_message = "simply misses" speed = 0 move_to_delay = 2 - del_on_death = 1 + del_on_death = TRUE deathmessage = "crumbles away!" faction = list() ranged = FALSE 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 760cdbc449d27..e60bcd7458cf2 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 @@ -38,7 +38,7 @@ i-- /mob/living/simple_animal/hostile/asteroid/goldgrub/GiveTarget(new_target) - target = new_target + add_target(new_target) if(target != null) if(istype(target, /obj/item/stack/ore) && loot.len < 10) visible_message("The [name] looks at [target.name] with hungry eyes.") 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 01f1c56c32edd..fa7002cc4113d 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 @@ -35,6 +35,7 @@ loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) do_footstep = TRUE + discovery_points = 2000 /mob/living/simple_animal/hostile/asteroid/goliath/Life() . = ..() @@ -134,7 +135,7 @@ LAZYCLEARLIST(cached_tentacle_turfs) last_location = loc tentacle_recheck_cooldown = world.time + initial(tentacle_recheck_cooldown) - for(var/turf/open/T in orange(4, loc)) + for(var/turf/open/T in (RANGE_TURFS(4, src)-get_turf(src))) LAZYADD(cached_tentacle_turfs, T) for(var/t in cached_tentacle_turfs) if(isopenturf(t)) 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 47c9a337786b2..23586484e3de2 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 @@ -111,7 +111,7 @@ /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/Life() ..() - if(udder.reagents.total_volume == udder.reagents.maximum_volume) //Only breed when we're full. + if(udder.reagents.total_volume == udder.reagents.maximum_volume && next_scan_time <= world.time) //Only breed when we're full. make_babies() /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/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 ff760a1228222..f8c8a2d620dbb 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 @@ -30,6 +30,7 @@ pass_flags = PASSTABLE loot = list(/obj/item/organ/regenerative_core) var/brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood + discovery_points = 3000 /mob/living/simple_animal/hostile/asteroid/hivelord/OpenFire(the_target) if(world.time >= ranged_cooldown) @@ -78,7 +79,7 @@ obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE pass_flags = PASSTABLE - del_on_death = 1 + del_on_death = TRUE /mob/living/simple_animal/hostile/asteroid/hivelordbrood/Initialize() . = ..() @@ -105,7 +106,7 @@ 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 - del_on_death = 1 + del_on_death = TRUE stat_attack = UNCONSCIOUS robust_searching = 1 var/dwarf_mob = FALSE @@ -175,7 +176,7 @@ /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life() if(isturf(loc)) - for(var/mob/living/carbon/human/H in view(src,1)) //Only for corpse right next to/on same tile + for(var/mob/living/carbon/human/H in viewers(1, src)) //Only for corpse right next to/on same tile if(H.stat == UNCONSCIOUS || (can_infest_dead && H.stat == DEAD)) infest(H) ..() @@ -298,7 +299,7 @@ suit = /obj/item/clothing/suit/armor/bone gloves = /obj/item/clothing/gloves/bracer if(prob(5)) - back = pickweight(list(/obj/item/twohanded/bonespear = 3, /obj/item/twohanded/fireaxe/boneaxe = 2)) + back = pickweight(list(/obj/item/spear/bonespear = 3, /obj/item/fireaxe/boneaxe = 2)) if(prob(10)) belt = /obj/item/storage/belt/mining/primitive if(prob(30)) @@ -327,7 +328,7 @@ if(prob(50)) neck = /obj/item/bedsheet/rd/royal_cape if(prob(10)) - l_pocket = pick(list(/obj/item/crowbar/power, /obj/item/wrench/power, /obj/item/weldingtool/experimental)) + l_pocket = pick(list(/obj/item/powertool/jaws_of_life, /obj/item/powertool/hand_drill, /obj/item/weldingtool/experimental)) if("YeOlde") mob_gender = FEMALE uniform = /obj/item/clothing/under/costume/maid @@ -362,7 +363,3 @@ glasses = /obj/item/clothing/glasses/hud/health/night/cultblind backpack_contents = list(/obj/item/reagent_containers/glass/beaker/unholywater = 1, /obj/item/cult_shift = 1, /obj/item/flashlight/flare/culttorch = 1, /obj/item/stack/sheet/runed_metal = 15) . = ..() - - - - 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 0905d85e83aec..77d39baf2b300 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 @@ -22,6 +22,7 @@ hardattacks = TRUE //nasty_blocks wont help you here var/icon_aggro = null var/crusher_drop_mod = 25 + discovery_points = 1000 /mob/living/simple_animal/hostile/asteroid/Aggro() ..() @@ -65,9 +66,9 @@ /mob/living/simple_animal/hostile/asteroid/handle_temperature_damage() if(bodytemperature < minbodytemp) adjustBruteLoss(2) - throw_alert("temp", /obj/screen/alert/cold, 1) + throw_alert("temp", /atom/movable/screen/alert/cold, 1) else if(bodytemperature > maxbodytemp) adjustBruteLoss(20) - throw_alert("temp", /obj/screen/alert/hot, 3) + throw_alert("temp", /atom/movable/screen/alert/hot, 3) else clear_alert("temp") diff --git a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm index 860c1c037d716..e97fa58a09d5b 100644 --- a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm +++ b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm @@ -1,5 +1,5 @@ /mob/living/simple_animal/hostile/nanotrasen - name = "Nanotrasen Private Security Officer" + name = "\improper Nanotrasen Private Security Officer" desc = "An officer part of Nanotrasen's private security force, he seems rather unpleased to meet you." icon = 'icons/mob/simple_human.dmi' icon_state = "nanotrasen" diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index d80af9a7f9199..323f4a3be30b8 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -17,6 +17,7 @@ minbodytemp = 0 faction = list("nether") hardattacks = TRUE + discovery_points = 3000 /mob/living/simple_animal/hostile/netherworld/migo name = "mi-go" @@ -33,7 +34,7 @@ /mob/living/simple_animal/hostile/netherworld/migo/Initialize() . = ..() - migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/carhorn.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/megaphone.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/items/geiger/high1.ogg', 'sound/items/geiger/high2.ogg', 'sound/voice/beepsky/creep.ogg', 'sound/voice/beepsky/iamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/medbot/patchedup.ogg', 'sound/voice/medbot/feelbetter.ogg', 'sound/voice/human/manlaugh1.ogg', 'sound/voice/human/womanlaugh.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/clockcultalr.ogg', 'sound/ambience/antag/ling_aler.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/ambience/antag/monkey.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clockcult_gateway_disrupted.ogg', 'sound/effects/clownstep2.ogg', 'sound/effects/curse1.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosion_distant.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/hyperspace_begin.ogg', 'sound/effects/hyperspace_end.ogg', 'sound/effects/his_grace_awaken.ogg', 'sound/effects/pai_boot.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/ratvar_reveal.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg', 'sound/misc/bloblarm.ogg', 'sound/misc/airraid.ogg', 'sound/misc/bang.ogg','sound/misc/highlander.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/misc/splort.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/beam_sniper.ogg', 'sound/weapons/chainsawhit.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gunshot_silenced.ogg', 'sound/weapons/gunshot.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kenetic_accel.ogg', 'sound/machines/clockcult/steam_whoosh.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlockclose.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlockopen.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/cryo_warning.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/ambience/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/triple_beep.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', 'sound/ai/outbreak5.ogg', 'sound/ai/outbreak7.ogg', 'sound/ai/poweroff.ogg', 'sound/ai/radiation.ogg', 'sound/ai/shuttlecalled.ogg', 'sound/ai/shuttledock.ogg', 'sound/ai/shuttlerecalled.ogg', 'sound/ai/aimalf.ogg') //hahahaha fuck you code divers + migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/carhorn.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/megaphone.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/items/geiger/high1.ogg', 'sound/items/geiger/high2.ogg', 'sound/voice/beepsky/creep.ogg', 'sound/voice/beepsky/iamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/medbot/patchedup.ogg', 'sound/voice/medbot/feelbetter.ogg', 'sound/voice/human/manlaugh1.ogg', 'sound/voice/human/womanlaugh.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/clockcultalr.ogg', 'sound/ambience/antag/ling_aler.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/ambience/antag/monkey.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clockcult_gateway_disrupted.ogg', 'sound/effects/clownstep2.ogg', 'sound/effects/curse1.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosion_distant.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/hyperspace_begin.ogg', 'sound/effects/hyperspace_end.ogg', 'sound/effects/his_grace_awaken.ogg', 'sound/effects/pai_boot.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/ratvar_reveal.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/desecration-01.ogg', 'sound/misc/desecration-02.ogg', 'sound/misc/desecration-03.ogg', 'sound/misc/bloblarm.ogg', 'sound/misc/airraid.ogg', 'sound/misc/bang.ogg','sound/misc/highlander.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/misc/splort.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/beam_sniper.ogg', 'sound/weapons/chainsawhit.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kenetic_accel.ogg', 'sound/machines/clockcult/steam_whoosh.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlockclose.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlockopen.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/cryo_warning.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/ambience/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/triple_beep.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', 'sound/ai/default/outbreak5.ogg', 'sound/ai/default/outbreak7.ogg', 'sound/ai/default/poweroff.ogg', 'sound/ai/default/radiation.ogg', 'sound/ai/default/shuttlecalled.ogg', 'sound/ai/default/shuttledock.ogg', 'sound/ai/default/shuttlerecalled.ogg', 'sound/ai/default/aimalf.ogg') //hahahaha fuck you code divers /mob/living/simple_animal/hostile/netherworld/migo/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) ..() @@ -95,11 +96,11 @@ "Touching the portal, you are quickly pulled through into a world of unimaginable horror!") contents.Add(user) -/obj/structure/spawner/nether/process() +/obj/structure/spawner/nether/process(delta_time) for(var/mob/living/M in contents) if(M) playsound(src, 'sound/magic/demon_consume.ogg', 50, 1) - M.adjustBruteLoss(60) + M.adjustBruteLoss(60 * delta_time) new /obj/effect/gibspawner/generic(get_turf(M), M) if(M.stat == DEAD) var/mob/living/simple_animal/hostile/netherworld/blankbody/blank diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index 413ca00635728..d9dd8eec57a2c 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -23,8 +23,9 @@ speak_emote = list("yarrs") loot = list(/obj/effect/mob_spawn/human/corpse/pirate, /obj/item/melee/transforming/energy/sword/pirate) - del_on_death = 1 + del_on_death = TRUE faction = list("pirate") + mobchatspan = "syndmob" /mob/living/simple_animal/hostile/pirate/melee @@ -40,7 +41,7 @@ do_footstep = TRUE hardattacks = TRUE - + /mob/living/simple_animal/hostile/pirate/melee/space name = "Space Pirate Swashbuckler" icon_state = "piratespace" 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 fa9941e385929..fdf40f78e003a 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -23,9 +23,11 @@ attack_sound = 'sound/items/bikehorn.ogg' obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE - del_on_death = 1 + del_on_death = TRUE loot = list(/obj/effect/mob_spawn/human/clown/corpse) + mobchatspan = "clown" + 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) minbodytemp = 270 maxbodytemp = 370 @@ -39,10 +41,10 @@ /mob/living/simple_animal/hostile/retaliate/clown/handle_temperature_damage() if(bodytemperature < minbodytemp) adjustBruteLoss(10) - throw_alert("temp", /obj/screen/alert/cold, 2) + throw_alert("temp", /atom/movable/screen/alert/cold, 2) else if(bodytemperature > maxbodytemp) adjustBruteLoss(15) - throw_alert("temp", /obj/screen/alert/hot, 3) + throw_alert("temp", /atom/movable/screen/alert/hot, 3) else clear_alert("temp") @@ -163,7 +165,6 @@ response_help = "tries desperately to appease" response_disarm = "foolishly pushes" response_harm = "angers" - access_card = ACCESS_THEATRE speak = list("HONK", "Honk!", "HAUAUANK!!!", "GUUURRRRAAAHHH!!!") emote_see = list("honks", "sweats", "grunts") speak_chance = 5 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 134a25c2abb88..81960b1ca245b 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm @@ -16,7 +16,7 @@ maxHealth = 40 health = 40 melee_damage = 15 - del_on_death = 1 + del_on_death = TRUE emote_see = list("weeps silently", "groans", "mumbles") attacktext = "grips" attack_sound = 'sound/hallucinations/growl1.ogg' @@ -36,6 +36,7 @@ var/ghost_facial_hair_color var/mutable_appearance/ghost_facial_hair var/random = TRUE //if you want random names for ghosts or not + discovery_points = 1000 /mob/living/simple_animal/hostile/retaliate/ghost/Initialize() . = ..() @@ -47,7 +48,13 @@ name = "ghost of [pick(GLOB.first_names_male)] [pick(GLOB.last_names)]" if(1) name = "ghost of [pick(GLOB.first_names_female)] [pick(GLOB.last_names)]" + AddComponent(/datum/component/tracking_beacon, "ghost", null, null, TRUE, "#9e4d91", TRUE, TRUE) +/mob/living/simple_animal/hostile/retaliate/ghost/Destroy() + . = ..() + var/datum/component/tracking_beacon/beacon = GetComponent(/datum/component/tracking_beacon) + if(beacon) + qdel(beacon) /mob/living/simple_animal/hostile/retaliate/ghost/proc/give_hair() if(ghost_hair_style != null) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm index 63a796a809547..f064ecd21d855 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm @@ -7,7 +7,7 @@ if(!L.stat) return L else - enemies -= L + remove_enemy(L) else if(ismecha(A)) var/obj/mecha/M = A if(M.occupant) @@ -21,27 +21,42 @@ return see /mob/living/simple_animal/hostile/retaliate/proc/Retaliate() - var/list/around = view(src, vision_range) - - for(var/atom/movable/A in around) - if(A == src) - continue + for(var/atom/movable/A as obj|mob in oview(vision_range, src)) if(isliving(A)) var/mob/living/M = A - if(faction_check_mob(M) && attack_same || !faction_check_mob(M)) - enemies |= M + if(attack_same || !faction_check_mob(M)) + add_enemy(M) + if(istype(M, /mob/living/simple_animal/hostile/retaliate)) + var/mob/living/simple_animal/hostile/retaliate/H = M + if(attack_same && H.attack_same) + H.add_enemies(enemies) else if(ismecha(A)) var/obj/mecha/M = A if(M.occupant) - enemies |= M - enemies |= M.occupant - - for(var/mob/living/simple_animal/hostile/retaliate/H in around) - if(faction_check_mob(H) && !attack_same && !H.attack_same) - H.enemies |= enemies - return 0 + add_enemy(M) + add_enemy(M.occupant) + return FALSE /mob/living/simple_animal/hostile/retaliate/adjustHealth(amount, updating_health = TRUE, forced = FALSE) . = ..() if(. > 0 && stat == CONSCIOUS) Retaliate() + +/mob/living/simple_animal/hostile/retaliate/proc/add_enemy(new_enemy) + RegisterSignal(new_enemy, COMSIG_PARENT_QDELETING, .proc/remove_enemy, override = TRUE) + enemies |= new_enemy + +/mob/living/simple_animal/hostile/retaliate/proc/add_enemies(new_enemies) + for(var/new_enemy in new_enemies) + RegisterSignal(new_enemy, COMSIG_PARENT_QDELETING, .proc/remove_enemy, override = TRUE) + enemies |= new_enemy + +/mob/living/simple_animal/hostile/retaliate/proc/clear_enemies() + for(var/enemy in enemies) + UnregisterSignal(enemy, COMSIG_PARENT_QDELETING) + enemies.Cut() + +/mob/living/simple_animal/hostile/retaliate/proc/remove_enemy(datum/enemy_to_remove) + SIGNAL_HANDLER + UnregisterSignal(enemy_to_remove, COMSIG_PARENT_QDELETING) + enemies -= enemy_to_remove 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 e2d3c72a1b826..a7633f1e913c4 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm @@ -20,12 +20,12 @@ attack_sound = 'sound/weapons/punch1.ogg' obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE - del_on_death = 0 + del_on_death = FALSE do_footstep = TRUE /mob/living/simple_animal/hostile/retaliate/nanotrasenpeace //this should be in a different file - name = "Nanotrasen Private Security Officer" + name = "\improper Nanotrasen Private Security Officer" desc = "An officer part of Nanotrasen's private security force." icon = 'icons/mob/simple_human.dmi' icon_state = "nanotrasen" diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index 65f59181c7884..bdea87a2f87a9 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -25,10 +25,10 @@ unsuitable_atmos_damage = 15 faction = list("russian") status_flags = CANPUSH - del_on_death = 1 + del_on_death = TRUE do_footstep = TRUE - + mobchatspan = "syndmob" /mob/living/simple_animal/hostile/russian/ranged icon_state = "russianranged" diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index d0533407a2848..3db840bc76a77 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -29,12 +29,15 @@ see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE deathmessage = "collapses into a pile of bones!" - del_on_death = 1 + del_on_death = TRUE loot = list(/obj/effect/decal/remains/human) do_footstep = TRUE hardattacks = TRUE + mobchatspan = "assistant" + discovery_points = 2000 + /mob/living/simple_animal/hostile/skeleton/eskimo name = "undead eskimo" desc = "The reanimated remains of some poor traveler." @@ -48,7 +51,7 @@ melee_damage = 20 deathmessage = "collapses into a pile of bones, its gear falling to the floor!" loot = list(/obj/effect/decal/remains/human, - /obj/item/twohanded/spear, + /obj/item/spear, /obj/item/clothing/shoes/winterboots, /obj/item/clothing/suit/hooded/wintercoat) diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index ab017eb6b567a..bdf2606a94410 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -50,6 +50,8 @@ var/cannot_be_seen = 1 var/mob/living/creator = null + discovery_points = 10000 + // No movement while seen code. @@ -123,14 +125,12 @@ // 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) - if(M.client && CanAttack(M) && !M.has_unlimited_silicon_privilege) - 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?.client) - if(!M.occupant.eye_blind) - return M.occupant + for(var/mob/living/M in viewers(getexpandedview(world.view, 1, 1), check)) + if(M != src && M.client && CanAttack(M) && !M.has_unlimited_silicon_privilege && !M.eye_blind) + return M + for(var/obj/mecha/M in view(getexpandedview(world.view, 1, 1), check)) //assuming if you can see them they can see you + if(M.occupant?.client && !M.occupant.eye_blind) + return M.occupant return null // Cannot talk diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 57c86dfa8f72a..c5b1b582e07d8 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -43,11 +43,11 @@ faction = list(ROLE_SYNDICATE) check_friendly_fire = 1 status_flags = CANPUSH - del_on_death = 1 + del_on_death = TRUE dodging = TRUE rapid_melee = 2 - do_footstep = TRUE + mobchatspan = "syndmob" ///////////////Melee//////////// @@ -296,7 +296,7 @@ speak_emote = list("states") bubble_icon = "syndibot" gold_core_spawnable = HOSTILE_SPAWN - del_on_death = 1 + del_on_death = TRUE deathmessage = "is smashed into pieces!" /mob/living/simple_animal/hostile/viscerator/Initialize() diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 4ec7538654300..6666669f771a0 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -36,20 +36,22 @@ deathmessage = "is hacked into pieces!" loot = list(/obj/item/stack/sheet/mineral/wood) gold_core_spawnable = HOSTILE_SPAWN - del_on_death = 1 + del_on_death = TRUE hardattacks = TRUE + discovery_points = 1000 + /mob/living/simple_animal/hostile/tree/Life() ..() if(isopenturf(loc)) var/turf/open/T = src.loc if(T.air) - var/co2 = T.air.get_moles(/datum/gas/carbon_dioxide) + var/co2 = T.air.get_moles(GAS_CO2) if(co2 > 0) if(prob(25)) var/amt = min(co2, 9) - T.air.adjust_moles(/datum/gas/carbon_dioxide, -amt) - T.atmos_spawn_air("o2=[amt]") + T.air.adjust_moles(GAS_CO2, -amt) + T.atmos_spawn_air("o2=[amt];TEMP=293.15") /mob/living/simple_animal/hostile/tree/festivus name = "festivus pole" 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 b30ceaad6aab6..588cadb8e314c 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 @@ -67,15 +67,15 @@ var/grasp_chance = 20 var/grasp_pull_chance = 85 var/grasp_range = 4 - del_on_death = 1 + del_on_death = TRUE + discovery_points = 2000 /mob/living/simple_animal/hostile/venus_human_trap/Destroy() for(var/L in grasping) var/datum/beam/B = grasping[L] if(B) qdel(B) - for(var/datum/component/tether in tethers) - tether.RemoveComponent() + QDEL_LIST(tethers) grasping = null return ..() @@ -99,10 +99,10 @@ if(length(grasping) < 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) + for(var/mob/living/L in oview(grasp_range, src)) + if(faction_check_mob(L) || (L in grasping) || L == target) continue - for(var/turf/T in getline(src,L)) + for(var/turf/T as() in getline(src,L)) if (T.density) continue grasping for(var/obj/O in T) diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm index 1a642af799c4b..13badf9170aa6 100644 --- a/code/modules/mob/living/simple_animal/hostile/wizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/wizard.dm @@ -25,7 +25,7 @@ retreat_distance = 3 //out of fireball range minimum_distance = 3 - del_on_death = 1 + del_on_death = TRUE loot = list(/obj/effect/mob_spawn/human/corpse/wizard, /obj/item/staff) @@ -36,6 +36,7 @@ var/next_cast = 0 do_footstep = TRUE + discovery_points = 3000 /mob/living/simple_animal/hostile/wizard/Initialize() . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm index 72836ae36eb72..8a45a14f55156 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -17,10 +17,12 @@ minbodytemp = 0 spacewalk = FALSE status_flags = CANPUSH - del_on_death = 1 + del_on_death = TRUE var/zombiejob = "Medical Doctor" var/infection_chance = 0 var/obj/effect/mob_spawn/human/corpse/delayed/corpse + mobchatspan = "bartender" + discovery_points = 3000 /mob/living/simple_animal/hostile/zombie/Initialize(mapload) . = ..() @@ -53,4 +55,4 @@ /mob/living/simple_animal/hostile/zombie/drop_loot() . = ..() corpse.forceMove(drop_location()) - corpse.create() \ No newline at end of file + corpse.create() diff --git a/code/modules/qwerty/kalo.dm b/code/modules/mob/living/simple_animal/kalo.dm similarity index 75% rename from code/modules/qwerty/kalo.dm rename to code/modules/mob/living/simple_animal/kalo.dm index c4d6982e3e4c9..a892b3befc5ce 100644 --- a/code/modules/qwerty/kalo.dm +++ b/code/modules/mob/living/simple_animal/kalo.dm @@ -4,6 +4,9 @@ icon_state = "lizard" icon_living = "lizard" icon_dead = "lizard_dead" + can_be_held = TRUE + worn_slot_flags = ITEM_SLOT_HEAD + held_state = "lizard" do_footstep = TRUE can_be_held = TRUE mob_biotypes = list(MOB_ORGANIC, MOB_BEAST, MOB_REPTILE) @@ -28,24 +31,25 @@ maxbodytemp = 800 var/turns_since_scan = 0 var/obj/item/reagent_containers/food/snacks/movement_target + mobchatspan = "centcom" + +/mob/living/simple_animal/kalo/Destroy() + movement_target = null + return ..() -/mob/living/simple_animal/kalo/Life() +/mob/living/simple_animal/kalo/Life() //This code is absolute trash but I'm too sleepy to rewrite it. ..() if(!stat && !resting && !buckled) turns_since_scan++ - if(turns_since_scan > 5) + if(turns_since_scan > 20) turns_since_scan = 0 if((movement_target) && !isturf(movement_target.loc)) movement_target = null stop_automated_movement = 0 - if(!movement_target || !(movement_target.loc in oview(src, 10))) - movement_target = null + if(!movement_target || !(src in viewers(5, movement_target.loc))) stop_automated_movement = 0 - for(var/obj/item/reagent_containers/food/snacks/S in oview(src,10)) //can smell things up to 10 blocks radius - if(isturf(S.loc)) - movement_target = S - break + movement_target = locate(/obj/item/reagent_containers/food/snacks) in oview(5, src) //can smell things up to 5 blocks radius if(movement_target) stop_automated_movement = 1 @@ -65,20 +69,20 @@ if(isturf(movement_target.loc) ) if(movement_target.bitecount == 0 || prob(50)) - emote("me", 1, "nibbles on \the [movement_target]") + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, "nibbles on \the [movement_target]") movement_target.bitecount++ taste(movement_target.reagents) turns_since_scan = 2 if(movement_target.bitecount >= 4) if(prob(60)) - emote("me", 1, "burps") + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, "burps") fully_heal() qdel(movement_target) turns_since_scan = 0 else //if we don't see a better snack, lick up nearby blood var/obj/effect/decal/cleanable/blood/B - for(var/obj/effect/decal/cleanable/blood/O in oview(src,2)) + for(var/obj/effect/decal/cleanable/blood/O in oview(2, src)) if (!istype(O, /obj/effect/decal/cleanable/blood/gibs) && !istype(O, /obj/effect/decal/cleanable/blood/innards)) //dont lick up gibs or innards B = O break @@ -95,13 +99,13 @@ sleep(30) //take your time if(B && Adjacent(B)) //make sure it's still there and we're still there if(prob(60)) - emote("me", 1, "licks up \the [B]") + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, "licks up \the [B]") qdel(B) adjustBruteLoss(-5) stop_automated_movement = 0 if(prob(1)) - emote("me", 1, "pounces around!") + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, "pounces around!") spawn(0) for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) //ian dance but longer setDir(i) @@ -111,8 +115,10 @@ ..() if (M.a_intent == "help") if(prob(20)) - emote("me", 1, pick("chirps","squeaks")) //yes lizards chirp I googled it it must be true + //yes lizards chirp I googled it it must be true + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, pick("chirps","squeaks")) turns_since_move = 0 else if(prob(30)) - emote("me", 1, "hisses!") //no likey that + //no likey that + INVOKE_ASYNC(src, /mob.proc/emote, "me", 1, "hisses!") diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index a5a429aec27ac..486e8013bee56 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -38,6 +38,10 @@ health = 80 maxHealth = 80 pass_flags = PASSTABLE | PASSMOB + can_be_held = TRUE + worn_slot_flags = ITEM_SLOT_HEAD + held_state = "parrot" + speak = list("Hi!","Hello!","Cracker?","BAWWWWK george mellons griffing me!") speak_emote = list("squawks","says","yells") @@ -59,7 +63,8 @@ mob_size = MOB_SIZE_SMALL movement_type = FLYING gold_core_spawnable = FRIENDLY_SPAWN - mobsay_color = "#A6E398" + chat_color = "#A6E398" + mobchatspan = "curator" var/parrot_damage_upper = 10 var/parrot_state = PARROT_WANDER //Hunt for a perch when created @@ -69,7 +74,7 @@ var/parrot_speed = 5 //"Delay in world ticks between movement." according to byond. Yeah, that's BS but it does directly affect movement. Higher number = slower. var/parrot_lastmove = null //Updates/Stores position of the parrot while it's moving - var/parrot_stuck = 0 //If parrot_lastmove hasnt changed, this will increment until it reaches parrot_stuck_threshold + var/parrot_stuck = 0 //If parrot_lastmove hasn't changed, this will increment until it reaches parrot_stuck_threshold var/parrot_stuck_threshold = 10 //if this == parrot_stuck, it'll force the parrot back to wandering var/list/speech_buffer = list() @@ -105,17 +110,18 @@ /obj/item/radio/headset/headset_eng, \ /obj/item/radio/headset/headset_med, \ /obj/item/radio/headset/headset_sci, \ - /obj/item/radio/headset/headset_cargo) + /obj/item/radio/headset/headset_cargo, \ + /obj/item/radio/headset/headset_exploration) ears = new headset(src) parrot_sleep_dur = parrot_sleep_max //In case someone decides to change the max without changing the duration var - verbs.Add(/mob/living/simple_animal/parrot/proc/steal_from_ground, \ + add_verb(list(/mob/living/simple_animal/parrot/proc/steal_from_ground, \ /mob/living/simple_animal/parrot/proc/steal_from_mob, \ /mob/living/simple_animal/parrot/verb/drop_held_item_player, \ /mob/living/simple_animal/parrot/proc/perch_player, \ /mob/living/simple_animal/parrot/proc/toggle_mode, - /mob/living/simple_animal/parrot/proc/perch_mob_player) + /mob/living/simple_animal/parrot/proc/perch_mob_player)) /mob/living/simple_animal/parrot/examine(mob/user) @@ -137,13 +143,13 @@ ..(gibbed) -/mob/living/simple_animal/parrot/Stat() - ..() - if(statpanel("Status")) - stat("Held Item", held_item) - stat("Mode",a_intent) +/mob/living/simple_animal/parrot/get_stat_tab_status() + var/list/tab_data = ..() + tab_data["Held Item"] = GENERATE_STAT_TEXT("[held_item]") + tab_data["Mode"] = GENERATE_STAT_TEXT("[a_intent]") + return tab_data -/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode) +/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, list/message_mods = list()) . = ..() if(speaker != src && prob(50)) //Dont imitate ourselves if(!radio_freq || prob(10)) @@ -153,26 +159,19 @@ if(speaker == src && !client) //If a parrot squawks in the woods and no one is around to hear it, does it make a sound? This code says yes! return message -/mob/living/simple_animal/parrot/radio(message, message_mode, list/spans, language) //literally copied from human/radio(), but there's no other way to do this. at least it's better than it used to be. +/mob/living/simple_animal/parrot/radio(message, list/message_mods = list(), list/spans, language) //literally copied from human/radio(), but there's no other way to do this. at least it's better than it used to be. . = ..() if(. != 0) return . - switch(message_mode) - if(MODE_HEADSET) - if (ears) - ears.talk_into(src, message, , spans, language) - return ITALICS | REDUCE_RANGE - - if(MODE_DEPARTMENT) - if (ears) - ears.talk_into(src, message, message_mode, spans, language) - return ITALICS | REDUCE_RANGE - - if(message_mode in GLOB.radiochannels) + if(message_mods[MODE_HEADSET]) if(ears) - ears.talk_into(src, message, message_mode, spans, language) - return ITALICS | REDUCE_RANGE + ears.talk_into(src, message, , spans, language, message_mods) + return ITALICS | REDUCE_RANGE + else if(message_mods[RADIO_EXTENSION] == MODE_DEPARTMENT || (GLOB.radiochannels[message_mods[RADIO_EXTENSION]])) + if(ears) + ears.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) + return ITALICS | REDUCE_RANGE return 0 @@ -238,7 +237,7 @@ ears = headset_to_add to_chat(usr, "You fit the headset onto [src].") - clearlist(available_channels) + available_channels.Cut() for(var/ch in headset_to_add.channels) switch(ch) if(RADIO_CHANNEL_ENGINEERING) @@ -253,6 +252,8 @@ available_channels.Add(RADIO_TOKEN_MEDICAL) if(RADIO_CHANNEL_SUPPLY) available_channels.Add(RADIO_TOKEN_SUPPLY) + if(RADIO_CHANNEL_EXPLORATION) + available_channels.Add(RADIO_TOKEN_EXPLORATION) if(RADIO_CHANNEL_SERVICE) available_channels.Add(RADIO_TOKEN_SERVICE) @@ -389,7 +390,7 @@ //-----SLEEPING if(parrot_state == PARROT_PERCH) - if(parrot_perch && parrot_perch.loc != src.loc) //Make sure someone hasnt moved our perch on us + if(parrot_perch && parrot_perch.loc != src.loc) //Make sure someone hasn't moved our perch on us if(parrot_perch in view(src)) parrot_state = PARROT_SWOOP | PARROT_RETURN icon_state = icon_living @@ -514,7 +515,7 @@ //-----RETURNING TO PERCH else if(parrot_state == (PARROT_SWOOP | PARROT_RETURN)) walk(src, 0) - if(!parrot_perch || !isturf(parrot_perch.loc)) //Make sure the perch exists and somehow isnt inside of something else. + if(!parrot_perch || !isturf(parrot_perch.loc)) //Make sure the perch exists and somehow isn't inside of something else. parrot_perch = null parrot_state = PARROT_WANDER return @@ -613,7 +614,7 @@ /mob/living/simple_animal/parrot/proc/search_for_item() var/item - for(var/atom/movable/AM in view(src)) + for(var/atom/movable/AM as obj|mob in view(src)) //Skip items we already stole or are wearing or are too big if(parrot_perch && AM.loc == parrot_perch.loc || AM.loc == src) continue @@ -628,13 +629,11 @@ item = I break if(item) - if(!AStar(src, get_turf(item), /turf/proc/Distance_cardinal)) + if(!get_path_to(src, item)) item = null continue return item - return null - /mob/living/simple_animal/parrot/proc/search_for_perch() for(var/obj/O in view(src)) for(var/path in desired_perches) @@ -786,7 +785,7 @@ return if(icon_state == icon_living) - for(var/atom/movable/AM in view(src,1)) + for(var/atom/movable/AM in view(1, src)) for(var/perch_path in desired_perches) if(istype(AM, perch_path)) src.forceMove(AM.loc) @@ -813,7 +812,7 @@ return if(!buckled) - for(var/mob/living/carbon/human/H in view(src,1)) + for(var/mob/living/carbon/human/H in view(1, src)) if(H.has_buckled_mobs() && H.buckled_mobs.len >= H.max_buckled_mobs) //Already has a parrot, or is being eaten by a slime continue perch_on_human(H) @@ -888,10 +887,10 @@ desc += " The squawks of [-rounds_survived] dead parrots ring out in your ears..." add_atom_colour("#BB7777", FIXED_COLOUR_PRIORITY) else if(rounds_survived > 0) - speak += pick("...again?", "No, It was over!", "Let me out!", "It never ends!") + speak += pick("again?", "No, It was over!", "Let me out!", "It never ends!") desc += " Over [rounds_survived] shifts without a \"terrible\" \"accident\"!" else - speak += pick("...alive?", "This isn't parrot heaven!", "I live, I die, I live again!", "The void fades!") + speak += pick("alive?", "This isn't parrot heaven!", "I live, I die, I live again!", "The void fades!") . = ..() diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 091b8612f71a6..26baf4e1514c8 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -30,7 +30,9 @@ loot = list(/obj/item/ectoplasm) del_on_death = TRUE initial_language_holder = /datum/language_holder/construct - mobsay_color = "#FF6262" + chat_color = "#FF6262" + mobchatspan = "cultmobsay" + discovery_points = 1000 /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 76c22485d9466..1514480f41ba1 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -21,7 +21,7 @@ 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/wander = TRUE // 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. //Interaction @@ -42,8 +42,6 @@ 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 - //LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly - var/melee_damage = 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. @@ -71,7 +69,7 @@ var/sentience_type = SENTIENCE_ORGANIC // Sentience type, for slime potions 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 + var/del_on_death = FALSE //causes mob to be deleted on death, useful for mobs that spawn lootable corpses var/deathmessage = "" var/allow_movement_on_non_turfs = FALSE @@ -81,7 +79,7 @@ var/dextrous = FALSE //If the creature has, and can use, hands 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/AIStatus = AI_ON //The Status of our AI, can be changed via toggle_ai(togglestatus) 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 var/shouldwakeup = FALSE //convenience var for forcibly waking up an idling AI on next check. @@ -97,6 +95,9 @@ var/special_process = FALSE + //Discovery + var/discovery_points = 200 + /mob/living/simple_animal/Initialize() . = ..() GLOB.simple_animals[AIStatus] += src @@ -109,6 +110,8 @@ update_simplemob_varspeed() if(dextrous) AddComponent(/datum/component/personal_crafting) + if(discovery_points) + AddComponent(/datum/component/discoverable, discovery_points) /mob/living/simple_animal/Destroy() GLOB.simple_animals[AIStatus] -= src @@ -123,6 +126,8 @@ if (T && AIStatus == AI_Z_OFF) SSidlenpcpool.idle_mobs_by_zlevel[T.z] -= src + //Walking counts as a reference, putting this here because most things don't walk, clean this up once walk() procs are dead + walk(src, 0) return ..() /mob/living/simple_animal/examine(mob/user) @@ -145,7 +150,7 @@ if(health <= 0) death() else - stat = CONSCIOUS + set_stat(CONSCIOUS) med_hud_set_status() @@ -215,10 +220,10 @@ if(isturf(loc) && isopenturf(loc)) var/turf/open/ST = loc if(ST.air) - var/tox = ST.air.get_moles(/datum/gas/plasma) - var/oxy = ST.air.get_moles(/datum/gas/oxygen) - var/n2 = ST.air.get_moles(/datum/gas/nitrogen) - var/co2 = ST.air.get_moles(/datum/gas/carbon_dioxide) + var/tox = ST.air.get_moles(GAS_PLASMA) + var/oxy = ST.air.get_moles(GAS_O2) + var/n2 = ST.air.get_moles(GAS_N2) + var/co2 = ST.air.get_moles(GAS_CO2) if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"]) . = FALSE @@ -258,7 +263,7 @@ if(!environment_air_is_safe()) adjustHealth(unsuitable_atmos_damage) if(unsuitable_atmos_damage > 0) - throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) + throw_alert("not_enough_oxy", /atom/movable/screen/alert/not_enough_oxy) else clear_alert("not_enough_oxy") @@ -269,20 +274,20 @@ adjustHealth(unsuitable_atmos_damage) switch(unsuitable_atmos_damage) if(1 to 5) - throw_alert("temp", /obj/screen/alert/cold, 1) + throw_alert("temp", /atom/movable/screen/alert/cold, 1) if(5 to 10) - throw_alert("temp", /obj/screen/alert/cold, 2) + throw_alert("temp", /atom/movable/screen/alert/cold, 2) if(10 to INFINITY) - throw_alert("temp", /obj/screen/alert/cold, 3) + throw_alert("temp", /atom/movable/screen/alert/cold, 3) else if(bodytemperature > maxbodytemp) adjustHealth(unsuitable_atmos_damage) switch(unsuitable_atmos_damage) if(1 to 5) - throw_alert("temp", /obj/screen/alert/hot, 1) + throw_alert("temp", /atom/movable/screen/alert/hot, 1) if(5 to 10) - throw_alert("temp", /obj/screen/alert/hot, 2) + throw_alert("temp", /atom/movable/screen/alert/hot, 2) if(10 to INFINITY) - throw_alert("temp", /obj/screen/alert/hot, 3) + throw_alert("temp", /atom/movable/screen/alert/hot, 3) else clear_alert("temp") @@ -303,7 +308,7 @@ if(icon_gib) new /obj/effect/temp_visual/gib_animation/animal(loc, icon_gib) -/mob/living/simple_animal/say_mod(input, message_mode) +/mob/living/simple_animal/say_mod(input, list/message_mods = list()) if(speak_emote && speak_emote.len) verb_say = pick(speak_emote) . = ..() @@ -322,13 +327,15 @@ remove_movespeed_modifier(MOVESPEED_ID_SIMPLEMOB_VARSPEED, TRUE) add_movespeed_modifier(MOVESPEED_ID_SIMPLEMOB_VARSPEED, TRUE, 100, multiplicative_slowdown = speed, override = TRUE) -/mob/living/simple_animal/Stat() - ..() - if(statpanel("Status")) - stat(null, "Health: [round((health / maxHealth) * 100)]%") - return 1 +/mob/living/simple_animal/get_stat_tab_status() + var/list/tab_data = ..() + tab_data["Health"] = GENERATE_STAT_TEXT("[round((health / maxHealth) * 100)]%") + return tab_data /mob/living/simple_animal/proc/drop_loot() + if(flags_1 & HOLOGRAM_1) + do_sparks(3, TRUE, src) + return if(loot.len) for(var/i in loot) new i(loc) @@ -343,7 +350,7 @@ drop_all_held_items() if(!gibbed) if(deathsound || deathmessage || !del_on_death) - emote("deathgasp") + INVOKE_ASYNC(src, /mob.proc/emote, "deathgasp") if(del_on_death) ..() //Prevent infinite loops if the mob Destroy() is overridden in such @@ -395,27 +402,26 @@ setMovetype(initial(movement_type)) /mob/living/simple_animal/proc/make_babies() // <3 <3 <3 + set waitfor = 0 if(gender != FEMALE || stat || next_scan_time > world.time || !childtype || !animal_species || !SSticker.IsRoundInProgress()) return - next_scan_time = world.time + 400 - var/alone = 1 + next_scan_time = world.time + (5 MINUTES) var/mob/living/simple_animal/partner var/children = 0 - for(var/mob/M in view(7, src)) - if(M.stat != CONSCIOUS) //Check if it's conscious FIRST. + for(var/mob/living/M in ohearers(7, src)) + if(M.stat) //Check if it's conscious FIRST. continue - else if(istype(M, childtype)) //Check for children SECOND. + else if(is_type_in_list(M, childtype)) //Check for children SECOND. children++ else if(istype(M, animal_species)) - if(M.ckey) + if(M.ckey || M.gender == FEMALE) //Better safe than sorry ;_; continue - else if(!istype(M, childtype) && M.gender == MALE) //Better safe than sorry ;_; - partner = M - - else if(isliving(M) && !faction_check_mob(M)) //shyness check. we're not shy in front of things that share a faction with us. + partner = M + else if(!faction_check_mob(M)) //shyness check. we're not shy in front of things that share a faction with us. return //we never mate when not alone, so just abort early + CHECK_TICK - if(alone && partner && children < 3) + if(partner && children < 3) var/childspawn = pickweight(childtype) var/turf/target = get_turf(loc) if(target) @@ -523,21 +529,17 @@ mode() /mob/living/simple_animal/swap_hand(hand_index) + . = ..() + if(!.) + return if(!dextrous) - return ..() + return if(!hand_index) hand_index = (active_hand_index % held_items.len)+1 - var/obj/item/held_item = get_active_held_item() - if(held_item) - if(istype(held_item, /obj/item/twohanded)) - var/obj/item/twohanded/T = held_item - if(T.wielded == 1) - to_chat(usr, "Your other hand is too busy holding [T].") - return var/oindex = active_hand_index active_hand_index = hand_index if(hud_used) - var/obj/screen/inventory/hand/H + var/atom/movable/screen/inventory/hand/H H = hud_used.hand_slots["[hand_index]"] if(H) H.update_icon() @@ -566,7 +568,7 @@ //ANIMAL RIDING -/mob/living/simple_animal/user_buckle_mob(mob/living/M, mob/user) +/mob/living/simple_animal/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE) var/datum/component/riding/riding_datum = GetComponent(/datum/component/riding) if(riding_datum) if(user.incapacitated()) diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm index 99254797ae3cf..7965c7fc2a03e 100644 --- a/code/modules/mob/living/simple_animal/slime/death.dm +++ b/code/modules/mob/living/simple_animal/slime/death.dm @@ -10,7 +10,7 @@ is_adult = FALSE maxHealth = 150 for(var/datum/action/innate/slime/reproduce/R in actions) - R.Remove(src) + qdel(R) var/datum/action/innate/slime/evolve/E = new E.Grant(src) revive(full_heal = 1) @@ -22,7 +22,7 @@ Feedstop(silent = TRUE) //releases ourselves from the mob we fed on. GLOB.total_slimes-- - stat = DEAD + set_stat(DEAD) cut_overlays() if(SSticker.mode) @@ -41,4 +41,5 @@ X.stored_slimes -= src if(stat != DEAD) GLOB.total_slimes-- + master = null return ..() diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 2bd10a1b70451..ad7aedc443261 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -8,14 +8,19 @@ /mob/living/simple_animal/slime/Life() set invisibility = 0 - - if (notransform) + if(notransform) return + alpha = 255 + if(transformeffects & SLIME_EFFECT_BLACK) + alpha = 64 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() + if(QDELETED(src)) // Stop if the slime split during handle_nutrition() + return + reagents.remove_all(0.5 * REAGENTS_METABOLISM * reagents.reagent_list.len) //Slimes are such snowflakes handle_targets() if(!ckey) handle_mood() @@ -27,34 +32,41 @@ return ..() -/mob/living/simple_animal/slime/proc/AIprocess() +/mob/living/simple_animal/slime/process() if(stat == DEAD || !Target || client || buckled) return + special_process = FALSE var/slime_on_target = 0 if(Target.buckled_mobs?.len && (locate(/mob/living/simple_animal/slime) in Target.buckled_mobs)) slime_on_target = 1 - if(Target.z == src.z && attack_cooldown < world.time && get_dist(Target, src) <= 1) + if(Target.get_virtual_z_level() == src.get_virtual_z_level() && attack_cooldown < world.time && get_dist(Target, src) <= 1) if(!slime_on_target && CanFeedon(Target)) if(!Target.client || prob(20)) Feedon(Target) special_process = FALSE + reset_processing() return - if(attacked || rabid) + if((attacked || rabid) && Adjacent(Target)) Target.attack_slime(src) attack_cooldown = world.time + attack_cooldown_time - else if(Target in view(7, src)) - step_to(src, Target) + else if(src in viewers(7, Target)) + if((transformeffects & SLIME_EFFECT_BLUESPACE) && powerlevel >= 5) + do_teleport(src, get_turf(Target), asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) + powerlevel -= 5 + else + step_to(src, Target) else special_process = FALSE - Target = null - return + set_target(null) + reset_processing() + +/mob/living/simple_animal/slime/proc/reset_processing() var/sleeptime = movement_delay() if(sleeptime <= 0) sleeptime = 1 - addtimer(VARSET_CALLBACK(src, special_process, TRUE), (sleeptime + 2), TIMER_UNIQUE) /mob/living/simple_animal/slime/handle_environment(datum/gas_mixture/environment) @@ -76,19 +88,25 @@ adjustBruteLoss(round(sqrt(bodytemperature)) * 2) if(stat != DEAD) - var/bz_percentage = environment.total_moles() ? (environment.get_moles(/datum/gas/bz) / environment.total_moles()) : 0 + var/bz_percentage = environment.total_moles() ? (environment.get_moles(GAS_BZ) / environment.total_moles()) : 0 var/stasis = (bz_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis + if(transformeffects & SLIME_EFFECT_DARK_PURPLE) + var/amt = is_adult ? 30 : 15 + var/plas_amt = min(amt,environment.get_moles(GAS_PLASMA)) + environment.adjust_moles(GAS_PLASMA, -plas_amt) + environment.adjust_moles(GAS_O2, plas_amt) + adjustBruteLoss(plas_amt ? -2 : 0) if(stat == CONSCIOUS && stasis) to_chat(src, "Nerve gas in the air has put you in stasis!") - stat = UNCONSCIOUS + set_stat(UNCONSCIOUS) powerlevel = 0 rabid = 0 update_mobility() regenerate_icons() else if(stat == UNCONSCIOUS && !stasis) to_chat(src, "You wake up from the stasis.") - stat = CONSCIOUS + set_stat(CONSCIOUS) update_mobility() regenerate_icons() @@ -117,27 +135,40 @@ /mob/living/simple_animal/slime/handle_status_effects() ..() if(prob(30) && !stat) - adjustBruteLoss(-1) + var/heal = 1 + if(transformeffects & SLIME_EFFECT_PURPLE) + heal += 0.5 + adjustBruteLoss(-heal) + if((transformeffects & SLIME_EFFECT_RAINBOW) && prob(5)) + random_colour() /mob/living/simple_animal/slime/proc/handle_feeding() - if(!ismob(buckled)) + if(!isliving(buckled)) return - - var/mob/M = buckled - + alpha = 255 + var/mob/living/M = buckled + if(transformeffects & SLIME_EFFECT_OIL) + var/datum/reagent/fuel/fuel = new + fuel.reaction_mob(buckled,TOUCH,20) + qdel(fuel) if(M.stat == DEAD) if(client) to_chat(src, "This subject does not have a strong enough life energy anymore...") - else if(!rabid && !attacked && M.LAssailant && prob(50)) - if(M.LAssailant in Friends) - ++Friends[M.LAssailant] - else - Friends[M.LAssailant] = 1 + else if(!rabid && !attacked) + var/mob/last_to_hurt = M.LAssailant?.resolve() + if(last_to_hurt && last_to_hurt != M && prob(50)) + add_friendship(last_to_hurt, 1) //we go rabid after finishing to feed on a human with a client. if(M.client && ishuman(M)) rabid = 1 - Target = null + if(transformeffects & SLIME_EFFECT_GREEN) + visible_message("[src] slurps up [M]!") + adjust_nutrition(10) + layer = initial(layer) + qdel(M) + + set_target(null) special_process = FALSE Feedstop() return @@ -151,17 +182,13 @@ "You feel extremely weak!", \ "A sharp, deep pain bathes every inch of your body!")]") - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(ismonkey(M)) - C.adjustCloneLoss(monkey_bonus_damage) - - C.adjustCloneLoss(4) - C.adjustToxLoss(2) - else if(isanimal(M)) - var/mob/living/simple_animal/SA = M - SA.adjustCloneLoss(4) - SA.adjustToxLoss(2) + var/bonus_damage = 1 + if(transformeffects & SLIME_EFFECT_RED) + bonus_damage *= 1.1 + M.adjustCloneLoss(4*bonus_damage) + M.adjustToxLoss(2*bonus_damage) + if(ismonkey(M)) + M.adjustCloneLoss(monkey_bonus_damage*bonus_damage) add_nutrition((15 * CONFIG_GET(number/damage_multiplier))) adjustBruteLoss(-5) @@ -171,7 +198,7 @@ set_nutrition(700) //fuck you for using the base nutrition var return - if(prob(15)) + if(prob(15) && !(transformeffects & SLIME_EFFECT_SILVER)) adjust_nutrition(-(1 + is_adult)) if(nutrition <= 0) @@ -189,18 +216,16 @@ Evolve() /mob/living/simple_animal/slime/proc/add_nutrition(nutrition_to_add = 0) + var/gainpower = (transformeffects & SLIME_EFFECT_YELLOW) ? 3 : 1 set_nutrition(min((nutrition + nutrition_to_add), get_max_nutrition())) if(nutrition >= get_grow_nutrition()) if(powerlevel<10) if(prob(30-powerlevel*2)) - powerlevel++ + powerlevel += gainpower else if(nutrition >= get_hunger_nutrition() + 100) //can't get power levels unless you're a bit above hunger level. if(powerlevel<5) if(prob(25-powerlevel*5)) - powerlevel++ - - - + powerlevel += gainpower /mob/living/simple_animal/slime/proc/handle_targets() update_mobility() @@ -224,7 +249,7 @@ --target_patience if (target_patience <= 0 || SStun > world.time || Discipline || attacked || docile) target_patience = 0 - Target = null + set_target(null) special_process = FALSE var/hungry = 0 @@ -237,7 +262,7 @@ if(hungry == 2) if(Friends.len > 0 && prob(1)) var/mob/nofriend = pick(Friends) - --Friends[nofriend] + add_friendship(nofriend, -1) if(!Target) if(will_hunt() && hungry || attacked || rabid) @@ -253,9 +278,9 @@ if(ishuman(L)) if(!Discipline && prob(5) || attacked || rabid) - Target = L + set_target(L) else - Target = L + set_target(L) if(Target) target_patience = rand(5,7) @@ -327,13 +352,13 @@ if (Leader == who) // Already following him to_say = pick("Yes...", "Lead...", "Follow...") else if (Friends[who] > Friends[Leader]) // VIVA - Leader = who + set_leader(who) to_say = "Yes... I follow [who]..." else to_say = "No... I follow [Leader]..." else if (Friends[who] >= SLIME_FRIENDSHIP_FOLLOW) - Leader = who + set_leader(who) to_say = "I follow..." else // Not friendly enough to_say = pick("No...", "I no follow...") @@ -341,27 +366,27 @@ if (buckled) // We are asked to stop feeding if (Friends[who] >= SLIME_FRIENDSHIP_STOPEAT) Feedstop() - Target = null + set_target(null) if (Friends[who] < SLIME_FRIENDSHIP_STOPEAT_NOANGRY) - --Friends[who] + add_friendship(who, -1) to_say = "Grrr..." // I'm angry but I do it else to_say = "Fine..." else if (Target) // We are asked to stop chasing if (Friends[who] >= SLIME_FRIENDSHIP_STOPCHASE) - Target = null + set_target(null) if (Friends[who] < SLIME_FRIENDSHIP_STOPCHASE_NOANGRY) - --Friends[who] + add_friendship(who, -1) to_say = "Grrr..." // I'm angry but I do it else to_say = "Fine..." else if (Leader) // We are asked to stop following if (Leader == who) to_say = "Yes... I stay..." - Leader = null + set_leader(null) else if (Friends[who] > Friends[Leader]) - Leader = null + set_leader(null) to_say = "Yes... I stop..." else to_say = "No... keep follow..." @@ -383,7 +408,7 @@ to_say = "No... won't stay..." else if (findtext(phrase, "attack")) if (rabid && prob(20)) - Target = who + set_target(who) special_process = TRUE to_say = "ATTACK!?!?" else if (Friends[who] >= SLIME_FRIENDSHIP_ATTACK) @@ -391,14 +416,14 @@ if (findtext(phrase, lowertext(L.name))) if (isslime(L)) to_say = "NO... [L] slime friend" - --Friends[who] //Don't ask a slime to attack its friend + add_friendship(who, -1) //Don't ask a slime to attack its friend else if(!Friends[L] || Friends[L] < 1) - Target = L + set_target(L) special_process = TRUE to_say = "Ok... I attack [Target]" else to_say = "No... like [L] ..." - --Friends[who] //Don't ask a slime to attack its friend + add_friendship(who, -1) //Don't ask a slime to attack its friend break else to_say = "No... no listen" @@ -407,20 +432,20 @@ //Speech starts here if (to_say) - say (to_say) + INVOKE_ASYNC(src, /atom/movable/proc/say, to_say) else if(prob(1)) - emote(pick("bounce","sway","light","vibrate","jiggle")) + INVOKE_ASYNC(src, /mob.proc/emote, pick("bounce","sway","light","vibrate","jiggle")) else var/t = 10 var/slimes_near = 0 var/dead_slimes = 0 var/friends_near = list() - for (var/mob/living/L in view(7,src)) - if(isslime(L) && L != src) + for (var/mob/living/L in oview(7,src)) + if(isslime(L)) ++slimes_near if (L.stat == DEAD) ++dead_slimes - if (L in Friends) + if(L in Friends) t += 20 friends_near += L if (nutrition < get_hunger_nutrition()) @@ -483,7 +508,7 @@ if (nutrition < get_hunger_nutrition()) phrases += "[M]... feed me..." if(!stat) - say (pick(phrases)) + INVOKE_ASYNC(src, /atom/movable/proc/say, pick(phrases)) /mob/living/simple_animal/slime/proc/get_max_nutrition() // Can't go above it if (is_adult) @@ -519,3 +544,9 @@ if (holding_still) return 0 return 1 + + +/mob/living/simple_animal/slime/movement_delay() + . = ..() + if(transformeffects & SLIME_EFFECT_SEPIA) + . *= 0.7 diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index 2e37d239b1c3a..ec4122ca328f2 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -24,8 +24,8 @@ return 0 var/list/choices = list() - for(var/mob/living/C in view(1,src)) - if(C!=src && Adjacent(C)) + for(var/mob/living/C in oview(1,src)) + if(Adjacent(C)) choices += C var/mob/living/M = input(src,"Who do you wish to feed on?") in null|sortNames(choices) @@ -101,6 +101,8 @@ return FALSE to_chat(src, "Another slime is already feeding on this subject...") return FALSE + if(transformeffects & SLIME_EFFECT_SILVER) + return FALSE return TRUE /mob/living/simple_animal/slime/proc/Feedon(mob/living/M) @@ -134,11 +136,13 @@ return if(!is_adult) if(amount_grown >= SLIME_EVOLUTION_THRESHOLD) - is_adult = 1 + is_adult = TRUE maxHealth = 200 + if(transformeffects & SLIME_EFFECT_METAL) + maxHealth = round(maxHealth * 1.3) amount_grown = 0 for(var/datum/action/innate/slime/evolve/E in actions) - E.Remove(src) + qdel(E) regenerate_icons() update_name() else @@ -175,34 +179,30 @@ to_chat(src, "There are too many of us...") return var/list/babies = list() - var/new_nutrition = round(nutrition * 0.9) + var/new_nutrition = SLIME_DEFAULT_NUTRITION var/new_powerlevel = round(powerlevel / 4) var/datum/component/nanites/original_nanites = GetComponent(/datum/component/nanites) - - for(var/i=1,i<=4,i++) - var/child_colour - if(mutation_chance >= 100) - child_colour = "rainbow" - else if(prob(mutation_chance)) - child_colour = slime_mutation[rand(1,4)] - else - child_colour = colour - var/mob/living/simple_animal/slime/M - M = new(loc, child_colour) - if(ckey) - 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() + var/turf/drop_loc = drop_location() + var/childamount = 4 + var/new_adult = FALSE + if(transformeffects & SLIME_EFFECT_GREY) + childamount++ + if(transformeffects & SLIME_EFFECT_CERULEAN) + childamount = 2 + new_nutrition = round(nutrition * 0.5) + new_powerlevel = round(powerlevel / 2) + new_adult = TRUE + for(var/i=1, i<=childamount, i++) + var/force_colour = FALSE + var/step_away = TRUE + if(i == 1) + step_away = FALSE + if(transformeffects & SLIME_EFFECT_BLUE) + force_colour = TRUE + if(transformeffects & SLIME_EFFECT_CERULEAN) + force_colour = TRUE + var/mob/living/simple_animal/slime/M = make_baby(drop_loc, new_adult, new_nutrition, new_powerlevel, force_colour, step_away, original_nanites) babies += M - M.mutation_chance = CLAMP(mutation_chance+(rand(5,-5)),0,100) - SSblackbox.record_feedback("tally", "slime_babies_born", 1, M.colour) - - if(original_nanites) - M.AddComponent(/datum/component/nanites, original_nanites.nanite_volume*0.25) - SEND_SIGNAL(M, COMSIG_NANITE_SYNC, original_nanites, TRUE, TRUE) //The trues are to copy activation as well - var/mob/living/simple_animal/slime/new_slime = pick(babies) new_slime.a_intent = INTENT_HARM @@ -224,3 +224,56 @@ /datum/action/innate/slime/reproduce/Activate() var/mob/living/simple_animal/slime/S = owner S.Reproduce() + +/mob/living/simple_animal/slime/proc/make_baby(drop_loc, new_adult, new_nutrition, new_powerlevel, force_original_colour=FALSE, step_away=TRUE,datum/component/nanites/original_nanites=null) + var/child_colour = colour + if(!force_original_colour) + if(mutation_chance >= 100) + child_colour = "rainbow" + else if(prob(mutation_chance)) + if(transformeffects & SLIME_EFFECT_PYRITE) + slime_mutation = mutation_table(pick(slime_colours - list("rainbow"))) + child_colour = slime_mutation[rand(1,4)] + else + child_colour = colour + var/mob/living/simple_animal/slime/M = new(drop_loc, child_colour, new_adult) + M.transformeffects = transformeffects + M.set_nutrition(new_nutrition) + M.powerlevel = new_powerlevel + if(transformeffects & SLIME_EFFECT_METAL) + M.maxHealth = round(M.maxHealth * 1.3) + M.health = M.maxHealth + if(transformeffects & SLIME_EFFECT_PINK) + M.grant_language(/datum/language/common, TRUE, TRUE) + var/datum/language_holder/LH = M.get_language_holder() + LH.selected_language = /datum/language/common + if(transformeffects & SLIME_EFFECT_BLUESPACE) + M.add_verb(/mob/living/simple_animal/slime/proc/teleport) + if(transformeffects & SLIME_EFFECT_LIGHT_PINK) + GLOB.poi_list |= M + M.master = master + LAZYADD(GLOB.mob_spawners["[master.real_name]'s slime"], M) + SSmobs.update_spawners() + M.set_friends(Friends) + if(step_away) + step_away(M,src) + M.mutation_chance = clamp(mutation_chance+(rand(5,-5)),0,100) + SSblackbox.record_feedback("tally", "slime_babies_born", 1, M.colour) + if(original_nanites) + M.AddComponent(/datum/component/nanites, original_nanites.nanite_volume*0.25) + SEND_SIGNAL(M, COMSIG_NANITE_SYNC, original_nanites, TRUE, TRUE) //The trues are to copy activation as well + return M + +/mob/living/simple_animal/slime/proc/teleport() + set category = "Slime" + set name = "teleport" + set desc = "teleport to random location" + if(powerlevel <= 0) + to_chat(src, "No enough power.") + else + random_tp() + +/mob/living/simple_animal/slime/proc/random_tp() + var/power = rand(1,powerlevel) + do_teleport(src, get_turf(src), power, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) + powerlevel -= power diff --git a/code/modules/mob/living/simple_animal/slime/say.dm b/code/modules/mob/living/simple_animal/slime/say.dm index a2618b711e96b..0b692e6d5c0dd 100644 --- a/code/modules/mob/living/simple_animal/slime/say.dm +++ b/code/modules/mob/living/simple_animal/slime/say.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) +/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, list/message_mods = list()) . = ..() if(speaker != src && !radio_freq && !stat) if (speaker in Friends) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 157641089ec12..55bfd09983940 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -1,3 +1,4 @@ +#define SLIME_CARES_ABOUT(to_check) (to_check && (to_check == Target || to_check == Leader || (to_check in Friends))) /mob/living/simple_animal/slime name = "grey baby slime (123)" icon = 'icons/mob/slimes.dmi' @@ -18,7 +19,8 @@ speak_emote = list("blorbles") bubble_icon = "slime" initial_language_holder = /datum/language_holder/slime - mobsay_color = "#A6E398" + chat_color = "#A6E398" + mobchatspan = "slimemobsay" 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) @@ -41,6 +43,8 @@ hud_type = /datum/hud/slime hardattacks = TRUE //A sharp blade wont cut a slime from a mere parry + discovery_points = 1000 + var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35 @@ -49,8 +53,8 @@ var/number = 0 // Used to understand when someone is talking to it - var/mob/living/Target = null // AI variable - tells the slime to hunt this down - var/mob/living/Leader = null // AI variable - tells the slime to follow this person + var/mob/living/Target // AI variable - tells the slime to hunt this down + var/mob/living/Leader // AI variable - tells the slime to follow this person var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with @@ -85,6 +89,9 @@ var/effectmod //What core modification is being used. var/applied = 0 //How many extracts of the modtype have been applied. + // Transformative extract effects - get passed down + var/transformeffects = SLIME_EFFECT_DEFAULT + var/mob/master /mob/living/simple_animal/slime/Initialize(mapload, new_colour="grey", new_is_adult=FALSE) GLOB.total_slimes++ @@ -104,12 +111,14 @@ create_reagents(100) set_colour(new_colour) . = ..() - set_nutrition(700) + set_nutrition(SLIME_DEFAULT_NUTRITION) + if(transformeffects & SLIME_EFFECT_LIGHT_PINK) + set_playable() /mob/living/simple_animal/slime/Destroy() - for (var/A in actions) - var/datum/action/AC = A - AC.Remove(src) + set_target(null) + set_leader(null) + clear_friends() return ..() /mob/living/simple_animal/slime/proc/set_colour(new_colour) @@ -191,7 +200,7 @@ hud_used.healths.icon_state = "slime_health7" severity = 6 if(severity > 0) - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + overlay_fullscreen("brute", /atom/movable/screen/fullscreen/brute, severity) else clear_fullscreen("brute") @@ -231,22 +240,21 @@ /mob/living/simple_animal/slime/Process_Spacemove(movement_dir = 0) return 2 -/mob/living/simple_animal/slime/Stat() - if(..()) - - if(!docile) - stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]") - if(amount_grown >= SLIME_EVOLUTION_THRESHOLD) - if(is_adult) - stat(null, "You can reproduce!") - else - stat(null, "You can evolve!") - - if(stat == UNCONSCIOUS) - stat(null,"You are knocked out by high levels of BZ!") +/mob/living/simple_animal/slime/get_stat_tab_status() + var/list/tab_data = list() + if(!docile) + tab_data["Nutrition"] = GENERATE_STAT_TEXT("[nutrition]/[get_max_nutrition()]") + if(amount_grown >= SLIME_EVOLUTION_THRESHOLD) + if(is_adult) + tab_data["Slime Status"] = GENERATE_STAT_TEXT("You can reproduce!") else - stat(null,"Power Level: [powerlevel]") + tab_data["Slime Status"] = GENERATE_STAT_TEXT("You can evolve!") + if(stat == UNCONSCIOUS) + tab_data["Unconscious"] = GENERATE_STAT_TEXT("You are knocked out by high levels of BZ!") + else + tab_data["Power Level"] = GENERATE_STAT_TEXT("[powerlevel]") + return tab_data /mob/living/simple_animal/slime/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced) @@ -275,7 +283,7 @@ Feedon(Food) return ..() -/mob/living/simple_animal/slime/doUnEquip(obj/item/W) +/mob/living/simple_animal/slime/doUnEquip(obj/item/W, was_thrown = FALSE) return /mob/living/simple_animal/slime/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) @@ -296,7 +304,7 @@ attacked += 5 if(nutrition >= 100) //steal some nutrition. negval handled in life() adjust_nutrition(-(50 + (40 * M.is_adult))) - M.add_nutrition(50 + (40 * M.is_adult)) + M.add_nutrition(25 + (20 * M.is_adult)) if(health > 0) M.adjustBruteLoss(-10 + (-10 * M.is_adult)) M.updatehealth() @@ -357,10 +365,7 @@ if(S.next_step(user,user.a_intent)) return 1 if(istype(W, /obj/item/stack/sheet/mineral/plasma) && !stat) //Let's you feed slimes plasma. - if (user in Friends) - ++Friends[user] - else - Friends[user] = 1 + add_friendship(user, 1) to_chat(user, "You feed the slime the plasma. It chirps happily.") var/obj/item/stack/sheet/mineral/plasma/S = W S.use(1) @@ -425,10 +430,13 @@ qdel(src) /mob/living/simple_animal/slime/proc/apply_water() - adjustBruteLoss(rand(15,20)) + var/new_damage = rand(15,20) + if(transformeffects & SLIME_EFFECT_DARK_BLUE) + new_damage *= 0.5 + adjustBruteLoss(new_damage) if(!client) if(Target) // Like cats - Target = null + set_target(null) ++Discipline return @@ -473,8 +481,7 @@ if(Discipline == 1) attacked = 0 - if(Target) - Target = null + set_target(null) if(buckled) Feedstop(silent = TRUE) //we unbuckle the slime from the mob it latched onto. bucklestrength = initial(bucklestrength) @@ -510,3 +517,80 @@ /mob/living/simple_animal/slime/random/Initialize(mapload, new_colour, new_is_adult) . = ..(mapload, pick(slime_colours), prob(50)) + +/mob/living/simple_animal/slime/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE) + if(damage && damagetype == BRUTE && !forced && (transformeffects & SLIME_EFFECT_ADAMANTINE)) + blocked += 50 + . = ..(damage, damagetype, def_zone, blocked, forced) + +/mob/living/simple_animal/slime/give_mind(mob/user) + . = ..() + if (.) + if(mind && master) + mind.store_memory("Serve [master.real_name], your master.") + return . + +/mob/living/simple_animal/slime/get_spawner_desc() + return "be a slime[master ? " under the command of [master.real_name]" : ""]." + +/mob/living/simple_animal/slime/get_spawner_flavour_text() + return "You are a slime born and raised in a laboratory.[master ? " Your duty is to follow the orders of [master.real_name].": ""]" + +/mob/living/simple_animal/slime/proc/make_master(mob/user) + Friends[user] += SLIME_FRIENDSHIP_ATTACK * 2 + master = user + +/mob/living/simple_animal/slime/rainbow/Initialize(mapload, new_colour="rainbow", new_is_adult) + . = ..(mapload, new_colour, new_is_adult) + +/mob/living/simple_animal/slime/proc/set_target(new_target) + var/old_target = Target + Target = new_target + if(old_target && !SLIME_CARES_ABOUT(old_target)) + UnregisterSignal(old_target, COMSIG_PARENT_QDELETING) + if(Target) + RegisterSignal(Target, COMSIG_PARENT_QDELETING, .proc/clear_memories_of, override = TRUE) + +/mob/living/simple_animal/slime/proc/set_leader(new_leader) + var/old_leader = Leader + Leader = new_leader + if(old_leader && !SLIME_CARES_ABOUT(old_leader)) + UnregisterSignal(old_leader, COMSIG_PARENT_QDELETING) + if(Leader) + RegisterSignal(Leader, COMSIG_PARENT_QDELETING, .proc/clear_memories_of, override = TRUE) + +/mob/living/simple_animal/slime/proc/add_friendship(new_friend, amount = 1) + if(!Friends[new_friend]) + Friends[new_friend] = 0 + Friends[new_friend] += amount + if(new_friend) + RegisterSignal(new_friend, COMSIG_PARENT_QDELETING, .proc/clear_memories_of, override = TRUE) + +/mob/living/simple_animal/slime/proc/set_friendship(new_friend, amount = 1) + Friends[new_friend] = amount + if(new_friend) + RegisterSignal(new_friend, COMSIG_PARENT_QDELETING, .proc/clear_memories_of, override = TRUE) + +/mob/living/simple_animal/slime/proc/remove_friend(friend) + Friends -= friend + if(friend && !SLIME_CARES_ABOUT(friend)) + UnregisterSignal(friend, COMSIG_PARENT_QDELETING) + +/mob/living/simple_animal/slime/proc/set_friends(new_buds) + clear_friends() + for(var/mob/friend as anything in new_buds) + set_friendship(friend, new_buds[friend]) + +/mob/living/simple_animal/slime/proc/clear_friends() + for(var/mob/friend as anything in Friends) + remove_friend(friend) + +/mob/living/simple_animal/slime/proc/clear_memories_of(datum/source) + SIGNAL_HANDLER + if(source == Target) + set_target(null) + if(source == Leader) + set_leader(null) + remove_friend(source) + +#undef SLIME_CARES_ABOUT diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index ca40c57d2827d..620e7a62e92df 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -429,7 +429,7 @@ /mob/living/proc/become_nearsighted(source) if(!HAS_TRAIT(src, TRAIT_NEARSIGHT)) - overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) + overlay_fullscreen("nearsighted", /atom/movable/screen/fullscreen/impaired, 1) ADD_TRAIT(src, TRAIT_NEARSIGHT, source) /mob/living/proc/cure_husk(source) @@ -446,7 +446,7 @@ update_body() else ADD_TRAIT(src, TRAIT_HUSK, source) - + /mob/living/proc/cure_fakedeath(source) REMOVE_TRAIT(src, TRAIT_FAKEDEATH, source) REMOVE_TRAIT(src, TRAIT_DEATHCOMA, source) @@ -475,3 +475,4 @@ /mob/living/proc/ignore_slowdown(source) ADD_TRAIT(src, TRAIT_IGNORESLOWDOWN, source) update_movespeed(FALSE) + client?.move_delay = world.time diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index cbfc54aa54054..614b12269eed2 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -1,5 +1,6 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list( + /obj/machinery/atmospherics/components/binary/dp_vent_pump, /obj/machinery/atmospherics/components/unary/vent_pump, /obj/machinery/atmospherics/components/unary/vent_scrubber))) @@ -24,7 +25,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list( to_chat(src, "You can't vent crawl while buckled!") return - var/obj/machinery/atmospherics/components/unary/vent_found + var/obj/machinery/atmospherics/components/vent_found if(A) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 506fcebc3715a..e65ae9ece612e 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -22,7 +22,7 @@ * * send signal COMSIG_MOB_CLIENT_LOGIN */ /mob/Login() - GLOB.player_list |= src + add_to_player_list() lastKnownIP = client.address computer_id = client.computer_id log_access("Mob Login: [key_name(src)] was assigned to a [type]") @@ -39,6 +39,10 @@ next_move = 1 ..() + + //We do this here to prevent hanging refs from ghostize or whatever, since if we were in another mob before this'll take care of it + clear_client_in_contents() + if (client && key != client.key) key = client.key reset_perspective(loc) @@ -67,8 +71,14 @@ update_client_colour() update_mouse_pointer() if(client) - client.view_size?.setDefault(getScreenSize(src)) // Sets the defaul view_size because it can be different to what it was on the lobby. - client.change_view(getScreenSize(src)) // Resets the client.view in case it was changed. + if(client.view_size) + client.view_size.resetToDefault(getScreenSize(src)) // Sets the defaul view_size because it can be different to what it was on the lobby. + else + client.change_view(getScreenSize(src)) // Resets the client.view in case it was changed. + + //Reset verb information, give verbs accessible to the mob. + if(client.tgui_panel) + client.tgui_panel.set_verb_infomation(client) if(client.player_details.player_actions.len) for(var/datum/action/A in client.player_details.player_actions) @@ -80,6 +90,9 @@ log_played_names(client.ckey,name,real_name) auto_deadmin_on_login() + //Sort verbs + add_verb(verbs.Copy(), TRUE) //verbs.Copy() because otherwise you can't see the list + log_message("Client [key_name(src)] has taken ownership of mob [src]([src.type])", LOG_OWNERSHIP) SEND_SIGNAL(src, COMSIG_MOB_CLIENT_LOGIN, client) @@ -103,3 +116,4 @@ return client.holder.auto_deadmin() if(job) return SSjob.handle_auto_deadmin_roles(client, job) + diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index beba8a594aac0..ae08718808185 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -1,14 +1,15 @@ /mob/Logout() + SEND_SIGNAL(src, COMSIG_MOB_LOGOUT) log_message("[key_name(src)] is no longer owning mob [src]([src.type])", LOG_OWNERSHIP) SStgui.on_logout(src) unset_machine() - GLOB.player_list -= src - + remove_from_player_list() + clear_client_in_contents() ..() if(loc) loc.on_log(FALSE) - + if(client) for(var/foo in client.player_details.post_logout_callbacks) var/datum/callback/CB = foo diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4e9d5414ad02d..1fbf71f0e4fbe 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -16,15 +16,19 @@ * * qdels any client colours in place on this mob * + * Clears any refs to the mob inside its current location + * * Ghostizes the client attached to this mob * + * If our mind still exists, clear its current var to prevent harddels + * * Parent call */ /mob/Destroy()//This makes sure that mobs with clients/keys are not just deleted from the game. - GLOB.mob_list -= src - GLOB.dead_mob_list -= src - GLOB.alive_mob_list -= src - GLOB.mob_directory -= tag + remove_from_mob_list() + remove_from_dead_mob_list() + remove_from_alive_mob_list() + remove_from_mob_suicide_list() focus = null for (var/alert in alerts) clear_alert(alert, TRUE) @@ -37,6 +41,15 @@ qdel(cc) client_colours = null ghostize() + if(mind?.current == src) //Let's just be safe yeah? This will occasionally be cleared, but not always. Can't do it with ghostize without changing behavior + mind.set_current(null) + QDEL_LIST(mob_spell_list) + for(var/datum/action/A as() in actions) + if(istype(A.target, /obj/effect/proc_holder)) + A.Remove(src) // Mind's spells' actions should only be removed + else + qdel(A) // Other actions can be safely deleted + actions.Cut() return ..() /** @@ -59,12 +72,12 @@ */ /mob/Initialize() SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_CREATED, src) - GLOB.mob_list += src - GLOB.mob_directory[tag] = src + mob_properties = list() + add_to_mob_list() if(stat == DEAD) - GLOB.dead_mob_list += src + add_to_dead_mob_list() else - GLOB.alive_mob_list += src + add_to_alive_mob_list() set_focus(src) prepare_huds() for(var/v in GLOB.active_alternate_appearances) @@ -75,7 +88,11 @@ set_nutrition(rand(NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_START_MAX)) . = ..() update_config_movespeed() + initialize_actionspeed() update_movespeed(TRUE) + //Give verbs to stat + add_verb(verbs, TRUE) + become_hearing_sensitive() /** * Generate the tag for this mob @@ -119,7 +136,7 @@ t += "Temperature: [environment.return_temperature()] \n" for(var/id in environment.get_gases()) if(environment.get_moles(id)) - t+="[GLOB.meta_gas_info[id][META_GAS_NAME]]: [environment.get_moles(id)] \n" + t+="[GLOB.gas_data.names[id]]: [environment.get_moles(id)] \n" to_chat(usr, t) @@ -130,7 +147,7 @@ return "a ... thing?" /** - * Show a message to this mob (visual) + * Show a message to this mob (visual or audible) */ /mob/proc/show_message(msg, type, alt_msg, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) @@ -140,67 +157,83 @@ msg = copytext_char(msg, 1, MAX_MESSAGE_LEN) if(type) - if(type & 1 && eye_blind )//Vision related + if(type & MSG_VISUAL && eye_blind )//Vision related if(!alt_msg) return else msg = alt_msg type = alt_type - if(type & 2 && !can_hear())//Hearing related + if(type & MSG_AUDIBLE && !can_hear())//Hearing related if(!alt_msg) return else msg = alt_msg type = alt_type - if(type & 1 && eye_blind) + if(type & MSG_VISUAL && eye_blind) return // voice muffling if(stat == UNCONSCIOUS) - if(type & 2) //audio + if(type & MSG_AUDIBLE) //audio to_chat(src, "... You can almost hear something ...") - else - to_chat(src, msg) + return + to_chat(src, msg) -/atom/proc/visible_message(message, self_message, blind_message, vision_distance, list/ignored_mobs) +/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, list/visible_message_flags) var/turf/T = get_turf(src) if(!T) return + if(!islist(ignored_mobs)) ignored_mobs = list(ignored_mobs) - var/range = 7 - if(vision_distance) - range = vision_distance - for(var/mob/M in get_hearers_in_view(range, src)) + + var/list/hearers = hearers(vision_distance, T) //caches the hearers and then removes ignored mobs. + hearers -= ignored_mobs + + if(self_message) + hearers -= src + + var/raw_msg = message + var/is_emote = FALSE + if(LAZYFIND(visible_message_flags, CHATMESSAGE_EMOTE)) + message = "[src] [message]" + is_emote = TRUE + + var/list/show_to = list() + + for(var/mob/M as() in hearers) if(!M.client) continue - if(M in ignored_mobs) - continue + var/msg = message - if(M == src) //the src always see the main message or self message - if(self_message) - msg = self_message - else - if(M.see_invisibleYou are unable to equip that!") + else if(!disable_warning) + to_chat(src, "You are unable to equip that!") return FALSE equip_to_slot(W, slot, redraw_mob) //This proc should not ever fail. return TRUE @@ -329,14 +385,14 @@ if(!slot_priority) slot_priority = list( \ - SLOT_BACK, SLOT_WEAR_ID,\ - SLOT_W_UNIFORM, SLOT_WEAR_SUIT,\ - SLOT_WEAR_MASK, SLOT_HEAD, SLOT_NECK,\ - SLOT_SHOES, SLOT_GLOVES,\ - SLOT_EARS, SLOT_GLASSES,\ - SLOT_BELT, SLOT_S_STORE,\ - SLOT_L_STORE, SLOT_R_STORE,\ - SLOT_GENERC_DEXTROUS_STORAGE\ + ITEM_SLOT_BACK, ITEM_SLOT_ID,\ + ITEM_SLOT_ICLOTHING, ITEM_SLOT_OCLOTHING,\ + ITEM_SLOT_MASK, ITEM_SLOT_HEAD, ITEM_SLOT_NECK,\ + ITEM_SLOT_FEET, ITEM_SLOT_GLOVES,\ + ITEM_SLOT_EARS, ITEM_SLOT_EYES,\ + ITEM_SLOT_BELT, ITEM_SLOT_SUITSTORE,\ + ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET,\ + ITEM_SLOT_DEX_STORAGE\ ) for(var/slot in slot_priority) @@ -426,8 +482,7 @@ // shift-click catcher may issue examinate() calls for out-of-sight turfs return - if(is_blind(src)) - to_chat(src, "Something is there but you can't see it.") + if(is_blind(src) && !blind_examine_check(A)) return face_atom(A) @@ -435,6 +490,54 @@ to_chat(src, result.Join("\n")) SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, A) +/mob/proc/blind_examine_check(atom/examined_thing) + return TRUE + +/mob/living/blind_examine_check(atom/examined_thing) + //need to be next to something and awake + if(!Adjacent(examined_thing) || incapacitated()) + to_chat(src, "Something is there, but you can't see it!") + return FALSE + + var/active_item = get_active_held_item() + if(active_item && active_item != examined_thing) + to_chat(src, "Your hands are too full to examine this!") + return FALSE + + //you can only initiate exaimines if you have a hand, it's not disabled, and only as many examines as you have hands + /// our active hand, to check if it's disabled/detatched + var/obj/item/bodypart/active_hand = has_active_hand()? get_active_hand() : null + if(!active_hand || active_hand.is_disabled() || LAZYLEN(do_afters) >= get_num_arms()) + to_chat(src, "You don't have a free hand to examine this!") + return FALSE + + //you can only queue up one examine on something at a time + if(examined_thing in do_afters) + return FALSE + + to_chat(src, "You start feeling around for something...") + visible_message(" [name] begins feeling around for \the [examined_thing.name]...") + + /// how long it takes for the blind person to find the thing they're examining + var/examine_delay_length = rand(1 SECONDS, 2 SECONDS) + if(isobj(examined_thing)) + examine_delay_length *= 1.5 + else if(ismob(examined_thing) && examined_thing != src) + examine_delay_length *= 2 + + if(examine_delay_length > 0 && !do_after(src, examine_delay_length, target = examined_thing)) + to_chat(src, "You can't get a good feel for what is there.") + return FALSE + + //now we touch the thing we're examining + /// our current intent, so we can go back to it after touching + var/previous_intent = a_intent + a_intent = INTENT_HELP + examined_thing.attack_hand(src) + a_intent = previous_intent + + return TRUE + /** * Point at an atom * @@ -465,8 +568,19 @@ var/obj/visual = new /obj/effect/temp_visual/point(our_tile, invisibility) animate(visual, pixel_x = (tile.x - our_tile.x) * world.icon_size + A.pixel_x, pixel_y = (tile.y - our_tile.y) * world.icon_size + A.pixel_y, time = 1.7, easing = EASE_OUT) + SEND_SIGNAL(src, COMSIG_MOB_POINTED, A) return TRUE +/** + * Called by using Activate Held Object with an empty hand/limb + * + * Does nothing by default. The intended use is to allow limbs to call their + * own attack_self procs. It is up to the individual mob to override this + * parent and actually use it. + */ +/mob/proc/limb_attack_self() + return + ///Can this mob resist (default FALSE) /mob/proc/can_resist() return FALSE //overridden in living.dm @@ -519,6 +633,10 @@ if(I) I.attack_self(src) update_inv_hands() + return + + limb_attack_self() + /** * Get the notes of this mob @@ -682,11 +800,11 @@ */ /mob/MouseDrop_T(atom/dropping, atom/user) . = ..() - if(ismob(dropping) && dropping != user) + if(ismob(dropping) && dropping != user && !isAI(dropping)) var/mob/M = dropping if(ismob(user)) var/mob/U = user - if(!iscyborg(U) || U.a_intent == INTENT_HARM) + if((!iscyborg(U) || U.a_intent == INTENT_HARM) && !isAI(U)) M.show_inv(U) else M.show_inv(user) @@ -695,106 +813,24 @@ /mob/proc/is_muzzled() return 0 -/** - * Output an update to the stat panel for the client - * - * calculates client ping, round id, server time, time dilation and other data about the round - * and puts it in the mob status panel on a regular loop - */ -/mob/Stat() - ..() - - if(statpanel("Status")) - stoplag(world.fps) - if (client) - stat(null, "Ping: [round(client.lastping, 1)]ms (Average: [round(client.avgping, 1)]ms)") - stat(null, "Map: [SSmapping.config?.map_name || "Loading..."]") - var/datum/map_config/cached = SSmapping.next_map_config - if(cached) - stat(null, "Next Map: [cached.map_name]") - stat(null, "Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]") - stat(null, "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]") - stat(null, "Round Time: [worldtime2text()]") - stat(null, "Station Time: [station_time_timestamp()]") - stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)") - stat(null, "Players Connected: [GLOB.clients.len]") - if(SSshuttle.emergency) - var/ETA = SSshuttle.emergency.getModeStr() - if(ETA) - stat(null, "[ETA] [SSshuttle.emergency.getTimerStr()]") - - if(client?.holder) - if(statpanel("MC")) - var/turf/T = get_turf(client.eye) - stat("Location:", COORD(T)) - stat("CPU:", "[world.cpu]") - stat("Instances:", "[num2text(world.contents.len, 10)]") - stat("World Time:", "[world.time]") - GLOB.stat_entry() - config.stat_entry() - stat(null) - if(Master) - Master.stat_entry() - else - stat("Master Controller:", "ERROR") - if(Failsafe) - Failsafe.stat_entry() - else - stat("Failsafe Controller:", "ERROR") - if(Master) - stat(null) - for(var/datum/controller/subsystem/SS in Master.subsystems) - SS.stat_entry() - GLOB.cameranet.stat_entry() - if(statpanel("Tickets")) - GLOB.ahelp_tickets.stat_entry() - if(length(GLOB.sdql2_queries)) - if(statpanel("SDQL2")) - stat("Access Global SDQL2 List", GLOB.sdql2_vv_statobj) - for(var/i in GLOB.sdql2_queries) - var/datum/SDQL2_query/Q = i - Q.generate_stat() - - if(listed_turf && client) - if(!TurfAdjacent(listed_turf)) - listed_turf = null - else - statpanel(listed_turf.name, null, listed_turf) - var/list/overrides = list() - for(var/image/I in client.images) - if(I.loc && I.loc.loc == listed_turf && I.override) - overrides += I.loc - for(var/atom/A in listed_turf) - if(!A.mouse_opacity) - continue - if(A.invisibility > see_invisible) - continue - if(overrides.len && (A in overrides)) - continue - if(A.IsObscured()) - continue - statpanel(listed_turf.name, null, A) - - - if(mind) - add_spells_to_statpanel(mind.spell_list) - add_spells_to_statpanel(mob_spell_list) - /** * Convert a list of spells into a displyable list for the statpanel * * Shows charge and other important info */ -/mob/proc/add_spells_to_statpanel(list/spells) +/mob/proc/get_spell_stat_data(list/spells, current_tab) + var/list/stat_data = list() for(var/obj/effect/proc_holder/spell/S in spells) - if(S.can_be_cast_by(src)) + if(S.can_be_cast_by(src) && current_tab == S.panel) + client.stat_update_mode = STAT_MEDIUM_UPDATE switch(S.charge_type) if("recharge") - statpanel("[S.panel]","[S.charge_counter/10.0]/[S.charge_max/10]",S) + stat_data["[S.name]"] = GENERATE_STAT_TEXT("[S.charge_counter/10.0]/[S.charge_max/10]") if("charges") - statpanel("[S.panel]","[S.charge_counter]/[S.charge_max]",S) + stat_data["[S.name]"] = GENERATE_STAT_TEXT("[S.charge_counter]/[S.charge_max]") if("holdervar") - statpanel("[S.panel]","[S.holder_var_type] [S.holder_var_amount]",S) + stat_data["[S.name]"] = GENERATE_STAT_TEXT("[S.holder_var_type] [S.holder_var_amount]") + return stat_data #define MOB_FACE_DIRECTION_DELAY 1 @@ -872,12 +908,16 @@ return FALSE /mob/proc/swap_hand() - return + var/obj/item/held_item = get_active_held_item() + if(SEND_SIGNAL(src, COMSIG_MOB_SWAP_HANDS, held_item) & COMPONENT_BLOCK_SWAP) + to_chat(src, "Your other hand is too busy holding [held_item].") + return FALSE + return TRUE /mob/proc/activate_hand(selhand) return -/mob/proc/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //For sec bot threat assessment +/mob/proc/assess_threat(judgment_criteria, lasercolor = "", datum/callback/weaponcheck=null) //For sec bot threat assessment return 0 ///Get the ghost of this mob (from the mind) @@ -976,26 +1016,6 @@ /mob/proc/can_interact_with(atom/A) return IsAdminGhost(src) || Adjacent(A) -///Can the mob see reagents inside of containers? -/mob/proc/can_see_reagents() - if(stat == DEAD) //Ghosts and such can always see reagents - return 1 - if(has_unlimited_silicon_privilege) //Silicons can automatically view reagents - return 1 - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(H.head && istype(H.head, /obj/item/clothing)) - var/obj/item/clothing/CL = H.head - if(CL.scan_reagents) - return 1 - if(H.wear_mask && H.wear_mask.scan_reagents) - return 1 - if(H.glasses && istype(H.glasses, /obj/item/clothing)) - var/obj/item/clothing/CL = H.glasses - if(CL.scan_reagents) - return 1 - return 0 - ///Can the mob use Topic to interact with machines /mob/proc/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) return @@ -1116,7 +1136,7 @@ ///Set the lighting plane hud alpha to the mobs lighting_alpha var /mob/proc/sync_lighting_plane_alpha() if(hud_used) - var/obj/screen/plane_master/lighting/L = hud_used.plane_masters["[LIGHTING_PLANE]"] + var/atom/movable/screen/plane_master/lighting/L = hud_used.plane_masters["[LIGHTING_PLANE]"] if (L) L.alpha = lighting_alpha @@ -1282,3 +1302,32 @@ for(var/obj/item/I in held_items) if(I.item_flags & SLOWS_WHILE_IN_HAND) . += I.slowdown + +// Returns TRUE if the hearer should hear radio noises +/mob/proc/hears_radio() + return TRUE + +/mob/proc/set_stat(new_stat) + if(new_stat == stat) + return + SEND_SIGNAL(src, COMSIG_MOB_STATCHANGE, new_stat) + . = stat + stat = new_stat + +/mob/proc/set_active_storage(new_active_storage) + if(active_storage) + UnregisterSignal(active_storage, COMSIG_PARENT_QDELETING) + active_storage = new_active_storage + if(active_storage) + RegisterSignal(active_storage, COMSIG_PARENT_QDELETING, .proc/active_storage_deleted) + +/mob/proc/active_storage_deleted(datum/source) + SIGNAL_HANDLER + set_active_storage(null) + +///Clears the client in contents list of our current "eye". Prevents hard deletes +/mob/proc/clear_client_in_contents() + if(client?.movingmob) //In the case the client was transferred to another mob and not deleted. + client.movingmob.client_mobs_in_contents -= src + UNSETEMPTY(client.movingmob.client_mobs_in_contents) + client.movingmob = null diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 1d6655faa710c..0c1b6ffddc4bf 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -11,11 +11,11 @@ density = TRUE layer = MOB_LAYER animate_movement = SLIDE_STEPS - flags_1 = HEAR_1 hud_possible = list(ANTAG_HUD) pressure_resistance = 8 mouse_drag_pointer = MOUSE_ACTIVE_POINTER throwforce = 10 + blocks_emissive = EMISSIVE_BLOCK_GENERIC var/lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE var/datum/mind/mind @@ -25,6 +25,12 @@ var/list/movespeed_modification //Lazy list, see mob_movespeed.dm /// The calculated mob speed slowdown based on the modifiers list var/cached_multiplicative_slowdown + /// List of action speed modifiers applying to this mob + var/list/actionspeed_modification //Lazy list, see mob_movespeed.dm + /// List of action speed modifiers ignored by this mob. List -> List (id) -> List (sources) + var/list/actionspeed_mod_immunities //Lazy list, see mob_movespeed.dm + /// The calculated mob action speed slowdown based on the modifiers list + var/cached_multiplicative_actions_slowdown /// List of action hud items the user has var/list/datum/action/actions = list() /// A special action? No idea why this lives here @@ -149,8 +155,8 @@ /// Can this mob enter shuttles var/move_on_shuttle = 1 - ///The last mob/living/carbon to push/drag/grab this mob (exclusively used by slimes friend recognition) - var/mob/living/carbon/LAssailant = null + ///A weakref to the last mob/living/carbon to push/drag/grab this mob (exclusively used by slimes friend recognition) + var/datum/weakref/LAssailant = null /** * construct spells and mime spells. @@ -164,10 +170,6 @@ /// bitflags defining which status effects can be inflicted (replaces canknockdown, canstun, etc) var/status_flags = CANSTUN|CANKNOCKDOWN|CANUNCONSCIOUS|CANPUSH - /// Can they be tracked by the AI? - var/digitalcamo = 0 - ///Are they ivisible to the AI? - var/digitalinvis = 0 ///what does the AI see instead of them? var/image/digitaldisguise = null @@ -196,7 +198,8 @@ ///List of progress bars this mob is currently seeing for actions var/list/progressbars = null //for stacking do_after bars - var/list/mousemove_intercept_objects + ///For storing what do_after's someone has, in case we want to restrict them to only one of a certain do_after at a time + var/list/do_afters ///Allows a datum to intercept all click calls this mob is the source of var/datum/click_intercept @@ -207,3 +210,11 @@ var/memory_throttle_time = 0 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. + + var/list/mob_properties + + /// A mock client, provided by tests and friends + var/datum/client_interface/mock_client + + ///Override for sound_environments. If this is set the user will always hear a specific type of reverb (Instead of the area defined reverb) + var/sound_environment_override = SOUND_ENVIRONMENT_NONE diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index b065b017de6d8..947cdcb80618a 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -430,7 +430,7 @@ if(flashwindow) window_flash(O.client) if(source) - var/obj/screen/alert/notify_action/A = O.throw_alert("[REF(source)]_notify_action", /obj/screen/alert/notify_action) + var/atom/movable/screen/alert/notify_action/A = O.throw_alert("[REF(source)]_notify_action", /atom/movable/screen/alert/notify_action) if(A) if(O.client.prefs && O.client.prefs.UI_style) A.icon = ui_style2icon(O.client.prefs.UI_style) @@ -522,9 +522,8 @@ ///Clicks a random nearby mob with the source from this mob /mob/proc/click_random_mob() var/list/nearby_mobs = list() - for(var/mob/living/L in range(1, src)) - if(L!=src) - nearby_mobs |= L + for(var/mob/living/L in oview(1, src)) + nearby_mobs |= L if(nearby_mobs.len) var/mob/living/T = pick(nearby_mobs) ClickOn(T) @@ -535,6 +534,9 @@ stack_trace("Empty message") return + if(SSticker.current_state == GAME_STATE_FINISHED && message_type == LOG_ATTACK) + return + // Cannot use the list as a map if the key is a number, so we stringify it (thank you BYOND) var/smessage_type = num2text(message_type) @@ -552,7 +554,18 @@ else colored_message = "[message]" - var/list/timestamped_message = list("[LAZYLEN(logging[smessage_type]) + 1]\[[time_stamp()]\] [key_name(src)] [loc_name(src)]" = colored_message) + //This makes readability a bit better for admins. + switch(message_type) + if(LOG_WHISPER) + colored_message = "(WHISPER) [colored_message]" + if(LOG_OOC) + colored_message = "(OOC) [colored_message]" + if(LOG_ASAY) + colored_message = "(ASAY) [colored_message]" + if(LOG_EMOTE) + colored_message = "(EMOTE) [colored_message]" + + var/list/timestamped_message = list("\[[time_stamp()]\] [key_name(src)] [loc_name(src)] (Event #[LAZYLEN(logging[smessage_type])])" = colored_message) logging[smessage_type] += timestamped_message @@ -576,3 +589,28 @@ /mob/proc/common_trait_examine() if(HAS_TRAIT(src, TRAIT_DISSECTED)) . += "This body has been dissected and analyzed. It is no longer worth experimenting on.
" + +// https://github.com/tgstation/tgstation/pull/44056 +// Used to make sure that a player has a valid job preference setup, used to knock players out of eligibility for anything if their prefs don't make sense. +// A "valid job preference setup" in this situation means at least having one job set to low, or not having "return to lobby" enabled +// Prevents "antag rolling" by setting antag prefs on, all jobs to never, and "return to lobby if preferences not availible" +// Doing so would previously allow you to roll for antag, then send you back to lobby if you didn't get an antag role +// This also does some admin notification and logging as well +/mob/proc/has_valid_preferences(var/silent = FALSE) + if(!client) + return FALSE //Not sure how this would get run without the mob having a client, but let's just be safe. + if(client.prefs.joblessrole != RETURNTOLOBBY) + return TRUE + // If they have antags enabled, they're potentially doing this on purpose instead of by accident. Notify admins if so. + if(!client.prefs.job_preferences.len) + if(!silent) + to_chat(src, "You have no jobs enabled, along with return to lobby if job is unavailable. This makes you ineligible for any round start role, please update your job preferences.") + if(client.prefs.be_special.len) + log_admin("[src.ckey] just got booted back to lobby with no jobs, but antags enabled.") + message_admins("[src.ckey] just got booted back to lobby with no jobs enabled, but antag rolling enabled. Likely antag rolling abuse.") + return FALSE //This is the only case someone should actually be completely blocked from antag rolling as well + return TRUE + +//Can the mob see reagents inside of containers? +/mob/proc/can_see_reagents() + return stat == DEAD || has_unlimited_silicon_privilege //Dead guys and silicons can always see reagents diff --git a/code/modules/mob/mob_lists.dm b/code/modules/mob/mob_lists.dm new file mode 100644 index 0000000000000..e09f2a5e523bc --- /dev/null +++ b/code/modules/mob/mob_lists.dm @@ -0,0 +1,130 @@ +///Adds the mob reference to the list and directory of all mobs. Called on Initialize(). +/mob/proc/add_to_mob_list() + GLOB.mob_list |= src + GLOB.mob_directory[tag] = src + +///Removes the mob reference from the list and directory of all mobs. Called on Destroy(). +/mob/proc/remove_from_mob_list() + GLOB.mob_list -= src + GLOB.mob_directory -= tag + +///Adds the mob reference to the list of all mobs alive. If mob is cliented, it adds it to the list of all living player-mobs. +/mob/proc/add_to_alive_mob_list() + if(QDELETED(src)) + return + GLOB.alive_mob_list |= src + if(client) + add_to_current_living_players() + +///Removes the mob reference from the list of all mobs alive. If mob is cliented, it removes it from the list of all living player-mobs. +/mob/proc/remove_from_alive_mob_list() + GLOB.alive_mob_list -= src + if(client) + remove_from_current_living_players() + +///Adds a mob reference to the list of all suicided mobs +/mob/proc/add_to_mob_suicide_list() + GLOB.suicided_mob_list += src + +///Removes a mob references from the list of all suicided mobs +/mob/proc/remove_from_mob_suicide_list() + GLOB.suicided_mob_list -= src + +///Adds the mob reference to the list of all the dead mobs. If mob is cliented, it adds it to the list of all dead player-mobs. +/mob/proc/add_to_dead_mob_list() + if(QDELETED(src)) + return + GLOB.dead_mob_list |= src + if(client) + add_to_current_dead_players() + +///Remvoes the mob reference from list of all the dead mobs. If mob is cliented, it adds it to the list of all dead player-mobs. +/mob/proc/remove_from_dead_mob_list() + GLOB.dead_mob_list -= src + if(client) + remove_from_current_dead_players() + + +///Adds the cliented mob reference to the list of all player-mobs, besides to either the of dead or alive player-mob lists, as appropriate. Called on Login(). +/mob/proc/add_to_player_list() + SHOULD_CALL_PARENT(TRUE) + GLOB.player_list |= src + if(!SSticker?.mode) + return + if(stat == DEAD) + add_to_current_dead_players() + else + add_to_current_living_players() + +///Removes the mob reference from the list of all player-mobs, besides from either the of dead or alive player-mob lists, as appropriate. Called on Logout(). +/mob/proc/remove_from_player_list() + SHOULD_CALL_PARENT(TRUE) + GLOB.player_list -= src + if(!SSticker?.mode) + return + if(stat == DEAD) + remove_from_current_dead_players() + else + remove_from_current_living_players() + + +///Adds the cliented mob reference to either the list of dead player-mobs or to the list of observers, depending on how they joined the game. +/mob/proc/add_to_current_dead_players() + if(!SSticker?.mode) + return + SSticker.mode.current_players[CURRENT_DEAD_PLAYERS] |= src + +/mob/dead/observer/add_to_current_dead_players() + if(!SSticker?.mode) + return + if(started_as_observer) + SSticker.mode.current_players[CURRENT_OBSERVERS] |= src + return + return ..() + +/mob/dead/new_player/add_to_current_dead_players() + return + +///Removes the mob reference from either the list of dead player-mobs or from the list of observers, depending on how they joined the game. +/mob/proc/remove_from_current_dead_players() + if(!SSticker?.mode) + return + SSticker.mode.current_players[CURRENT_DEAD_PLAYERS] -= src + +/mob/dead/observer/remove_from_current_dead_players() + if(!SSticker?.mode) + return + if(started_as_observer) + SSticker.mode.current_players[CURRENT_OBSERVERS] -= src + return + return ..() + + +///Adds the cliented mob reference to the list of living player-mobs. If the mob is an antag, it adds it to the list of living antag player-mobs. +/mob/proc/add_to_current_living_players() + if(!SSticker?.mode) + return + SSticker.mode.current_players[CURRENT_LIVING_PLAYERS] |= src + if(mind && (mind.special_role || length(mind.antag_datums))) + add_to_current_living_antags() + +///Removes the mob reference from the list of living player-mobs. If the mob is an antag, it removes it from the list of living antag player-mobs. +/mob/proc/remove_from_current_living_players() + if(!SSticker?.mode) + return + SSticker.mode.current_players[CURRENT_LIVING_PLAYERS] -= src + if(LAZYLEN(mind?.antag_datums)) + remove_from_current_living_antags() + + +///Adds the cliented mob reference to the list of living antag player-mobs. +/mob/proc/add_to_current_living_antags() + if(!SSticker?.mode) + return + SSticker.mode.current_players[CURRENT_LIVING_ANTAGS] |= src + +///Removes the mob reference from the list of living antag player-mobs. +/mob/proc/remove_from_current_living_antags() + if(!SSticker?.mode) + return + SSticker.mode.current_players[CURRENT_LIVING_ANTAGS] -= src diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index a8d43a1ab1ca5..7a22e2d1d621b 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -48,17 +48,17 @@ * Move a client in a direction * * Huge proc, has a lot of functionality - * + * * Mostly it will despatch to the mob that you are the owner of to actually move * in the physical realm - * + * * Things that stop you moving as a mob: * * world time being less than your next move_delay * * not being in a mob, or that mob not having a loc * * missing the n and direction parameters * * being in remote control of an object (calls Moveobject instead) * * being dead (it ghosts you instead) - * + * * Things that stop you moving as a mob living (why even have OO if you're just shoving it all * in the parent proc with istype checks right?): * * having incorporeal_move set (calls Process_Incorpmove() instead) @@ -78,7 +78,7 @@ * * Finally if you're pulling an object and it's dense, you are turned 180 after the move * (if you ask me, this should be at the top of the move so you don't dance around) - * + * */ /client/Move(n, direct) if(world.time < move_delay) //do not move anything ahead of this check please @@ -152,7 +152,7 @@ . = ..() if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully - add_delay *= 2 + add_delay *= 1.414214 // sqrt(2) move_delay += add_delay if(.) // If mob is null here, we deserve the runtime if(mob.throwing) @@ -188,15 +188,17 @@ * Allows mobs to ignore density and phase through objects * * Called by client/Move() - * + * * The behaviour depends on the incorporeal_move value of the mob * * * INCORPOREAL_MOVE_BASIC - forceMoved to the next tile with no stop * * INCORPOREAL_MOVE_SHADOW - the same but leaves a cool effect path * * INCORPOREAL_MOVE_JAUNT - the same but blocked by holy tiles + * * INCORPOREAL_MOVE_EMINCENCE - was invented so that only Eminence can pass through clockwalls * * You'll note this is another mob living level proc living at the client level */ + /client/proc/Process_Incorpmove(direct) var/turf/mobloc = get_turf(mob) if(!isliving(mob)) @@ -263,22 +265,37 @@ if(stepTurf.flags_1 & NOJAUNT_1) to_chat(L, "Some strange aura is blocking the way.") return - if (locate(/obj/effect/blessing, stepTurf)) + if(locate(/obj/effect/blessing, stepTurf)) to_chat(L, "Holy energies block your path!") return + L.forceMove(stepTurf) + L.setDir(direct) + if(INCORPOREAL_MOVE_EMINENCE) //Incorporeal move for emincence. Blocks move like Jaunt but lets it pass through clockwalls + var/turf/open/floor/stepTurf = get_step(L, direct) + var/turf/loccheck = get_turf(stepTurf) + if(stepTurf) + for(var/obj/effect/decal/cleanable/food/salt/S in stepTurf) + to_chat(L, "[S] bars your passage!") + return + if(stepTurf.flags_1 & NOJAUNT_1) + if(!is_reebe(loccheck.z)) + to_chat(L, "Some strange aura is blocking the way.") + return + if(locate(/obj/effect/blessing, stepTurf)) + to_chat(L, "Holy energies block your path!") + return L.forceMove(stepTurf) L.setDir(direct) return TRUE - /** * Handles mob/living movement in space (or no gravity) * * Called by /client/Move() - * + * * return TRUE for movement or FALSE for none - * + * * You can move in space if you have a spacewalk ability */ /mob/Process_Spacemove(movement_dir = 0) @@ -301,9 +318,7 @@ continue else if(isturf(A)) var/turf/turf = A - if(isspaceturf(turf)) - continue - if(!turf.density && !mob_negates_gravity()) + if(!turf.density) continue return A else @@ -321,14 +336,6 @@ continue . = AM -/** - * Returns true if a mob has gravity - * - * I hate that this exists - */ -/mob/proc/mob_has_gravity() - return has_gravity() - /** * Does this mob ignore gravity */ @@ -350,7 +357,7 @@ ///Validate the client's mob has a valid zone selected /client/proc/check_has_body_select() - return mob && mob.hud_used && mob.hud_used.zone_select && istype(mob.hud_used.zone_select, /obj/screen/zone_sel) + return mob && mob.hud_used && mob.hud_used.zone_select && istype(mob.hud_used.zone_select, /atom/movable/screen/zone_sel) /** * Hidden verb to set the target zone of a mob to the head @@ -373,7 +380,7 @@ else next_in_line = BODY_ZONE_HEAD - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(next_in_line, mob) ///Hidden verb to target the right arm, bound to 4 @@ -384,7 +391,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_R_ARM, mob) ///Hidden verb to target the chest, bound to 5 @@ -395,7 +402,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_CHEST, mob) ///Hidden verb to target the left arm, bound to 6 @@ -406,7 +413,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_L_ARM, mob) ///Hidden verb to target the right leg, bound to 1 @@ -417,7 +424,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_R_LEG, mob) ///Hidden verb to target the groin, bound to 2 @@ -428,7 +435,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_PRECISE_GROIN, mob) ///Hidden verb to target the left leg, bound to 3 @@ -439,7 +446,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_L_LEG, mob) ///Verb to toggle the walk or run status @@ -452,7 +459,7 @@ /** * Toggle the move intent of the mob - * + * * triggers an update the move intent hud as well */ /mob/proc/toggle_move_intent(mob/user) @@ -461,7 +468,7 @@ else m_intent = MOVE_INTENT_RUN if(hud_used && hud_used.static_inventory) - for(var/obj/screen/mov_intent/selector in hud_used.static_inventory) + for(var/atom/movable/screen/mov_intent/selector in hud_used.static_inventory) selector.update_icon() ///Moves a mob upwards in z level diff --git a/code/modules/mob/mob_movespeed.dm b/code/modules/mob/mob_movespeed.dm index e8d2d134e9e7b..85f79076be9bb 100644 --- a/code/modules/mob/mob_movespeed.dm +++ b/code/modules/mob/mob_movespeed.dm @@ -110,6 +110,7 @@ Key procs continue . += amt cached_multiplicative_slowdown = . + SEND_SIGNAL(src, COMSIG_MOB_MOVESPEED_UPDATED) ///Get the move speed modifiers list of the mob /mob/proc/get_movespeed_modifiers() diff --git a/code/modules/mob/mob_stat.dm b/code/modules/mob/mob_stat.dm new file mode 100644 index 0000000000000..88f91178819c9 --- /dev/null +++ b/code/modules/mob/mob_stat.dm @@ -0,0 +1,347 @@ +#define MAX_ICONS_PER_TILE 50 + +/client + var/stat_update_mode = STAT_FAST_UPDATE + var/stat_update_time = 0 + var/selected_stat_tab = "Status" + var/list/previous_stat_tabs + var/last_adminhelp_reply = 0 + +/* + * Overrideable proc which gets the stat content for the selected tab. + */ + //33.774 CPU time +/mob/proc/get_stat(selected_tab) + if(IsAdminAdvancedProcCall()) + message_admins("[key_name(usr)] attempted to do something weird with the stat tab (Most likely attempting to exploit it to gain privillages).") + log_game("[key_name(usr)] attempted to do something weird with the stat tab (Most likely attempting to exploit it to gain privillages).") + return list() + var/list/tab_data = list() + var/requires_holder = FALSE + switch(selected_tab) + // ===== STATUS TAB ===== + if("Status") + client.stat_update_mode = STAT_FAST_UPDATE + tab_data = get_stat_tab_status() // ~ 0.525 CPU Time [15000 CALLS] (Depends on which tabs are selected) + // ===== MASTER CONTROLLER ===== + if("MC") + client.stat_update_mode = STAT_FAST_UPDATE + requires_holder = TRUE + tab_data = get_stat_tab_master_controller() // ~ 0.037 CPU Time [33 CALLS] + // ===== ADMIN TICKETS ===== + if("Tickets") + client.stat_update_mode = STAT_MEDIUM_UPDATE + requires_holder = TRUE + tab_data = GLOB.ahelp_tickets.stat_entry() // ~ 0 CPU Time [1 CALL] + // ===== SDQL2 ===== + if("SDQL2") + client.stat_update_mode = STAT_MEDIUM_UPDATE + requires_holder = TRUE + tab_data["Access Global SDQL2 List"] = list( + text="VIEW VARIABLES (all)", + action = "sdql2debug", + type=STAT_BUTTON, + ) + for(var/i in GLOB.sdql2_queries) + var/datum/SDQL2_query/Q = i + tab_data += Q.generate_stat() + // ===== ADMIN PMS ===== + if("(!) Admin PM") + client.stat_update_mode = STAT_MEDIUM_UPDATE + var/datum/admin_help/ticket = client.current_ticket + tab_data["ckey"] = key_name(client, FALSE, FALSE) + tab_data["admin_name"] = key_name(ticket.claimed_admin, FALSE, FALSE) + //Messages: + tab_data["messages"] = list() + for(var/datum/ticket_interaction/message as() in ticket._interactions) + //Only non-private messages have safe users. + //Only admins can see adminbus logs. + if(message.from_user_safe && message.to_user_safe) + var/list/msg = list( + "time" = message.time_stamp, + "color" = message.message_color, + "from" = message.from_user_safe, + "to" = message.to_user_safe, + "message" = message.message + ) + tab_data["messages"] += list(msg) + else + // ===== NON CONSTANT TABS (Tab names which can change) ===== + // ===== LISTEDS TURFS ===== + if(listed_turf && sanitize(listed_turf.name) == selected_tab) + client.stat_update_mode = STAT_MEDIUM_UPDATE + var/list/overrides = list() + for(var/image/I in client.images) + if(I.loc && I.loc.loc == listed_turf && I.override) + overrides += I.loc + tab_data[REF(listed_turf)] = list( + text="[listed_turf.name]", + type=STAT_ATOM + ) + var/sanity = MAX_ICONS_PER_TILE + for(var/atom/A in listed_turf) + if(!A.mouse_opacity) + continue + if(A.invisibility > see_invisible) + continue + if(overrides.len && (A in overrides)) + continue + if(A.IsObscured()) + continue + sanity -- + tab_data[REF(A)] = list( + text="[A.name]", + type=STAT_ATOM + ) + if(sanity < 0) + break + if(mind) + tab_data += get_spell_stat_data(mind.spell_list, selected_tab) + tab_data += get_spell_stat_data(mob_spell_list, selected_tab) + if(requires_holder && !client.holder) + message_admins("[ckey] attempted to access the [selected_tab] tab without sufficient rights.") + log_admin("[ckey] attempted to access the [selected_tab] tab without sufficient rights.") + return list() + return tab_data + +/mob/proc/get_all_verbs() + var/list/all_verbs = new + if(sorted_verbs) + all_verbs = deepCopyList(sorted_verbs) + //An annoying thing to mention: + // list A [A: ["b", "c"]] + (list B) [A: ["c", "d"]] will only have A from list B + for(var/i in client.sorted_verbs) + if(i in all_verbs) + all_verbs[i] += client.sorted_verbs[i] + else + var/list/verbs_to_copy = client.sorted_verbs[i] + all_verbs[i] = verbs_to_copy.Copy() + //TODO: Call tgui_panel/add_verbs on pickup and remove on drop. + for(var/atom/A as() in contents) + //As an optimisation we will make it so all verbs on objects will go into the object tab. + //If you don't want this to happen change this. + if(!all_verbs.Find("Object")) + all_verbs["Object"] = list() + all_verbs["Object"] += A.verbs + return all_verbs + +/* + * Gets the stat tab contents for the status tab + */ +/mob/proc/get_stat_tab_status() + var/list/tab_data = list() + tab_data["Map"] = GENERATE_STAT_TEXT("[SSmapping.config?.map_name || "Loading..."]") + var/datum/map_config/cached = SSmapping.next_map_config + if(cached) + tab_data["Next Map"] = GENERATE_STAT_TEXT(cached.map_name) + tab_data["Round ID"] = GENERATE_STAT_TEXT("[GLOB.round_id ? GLOB.round_id : "Null"]") + tab_data["Server Time"] = GENERATE_STAT_TEXT(time2text(world.timeofday,"YYYY-MM-DD hh:mm:ss")) + if (SSticker.round_start_time) + tab_data["Round Time"] = GENERATE_STAT_TEXT(gameTimestamp("hh:mm:ss", (world.time - SSticker.round_start_time))) + else + tab_data["Lobby Time"] = GENERATE_STAT_TEXT(worldtime2text()) + tab_data["Station Time"] = GENERATE_STAT_TEXT(station_time_timestamp()) + tab_data["Time Dilation"] = GENERATE_STAT_TEXT("[round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)") + tab_data["Players Connected"] = GENERATE_STAT_TEXT("[GLOB.clients.len]") + if(SSshuttle.emergency) + var/ETA = SSshuttle.emergency.getModeStr() + if(ETA) + tab_data[ETA] = GENERATE_STAT_TEXT(SSshuttle.emergency.getTimerStr()) + return tab_data + +/mob/proc/get_stat_tab_master_controller() + var/list/tab_data = list() + var/turf/T = get_turf(client.eye) + tab_data["Location"] = GENERATE_STAT_TEXT("[COORD(T)]") + tab_data["CPU"] = GENERATE_STAT_TEXT("[world.cpu]") + tab_data["Tick Usage"] = GENERATE_STAT_TEXT("[TICK_USAGE] / [Master.current_ticklimit]") + tab_data["Instances"] = GENERATE_STAT_TEXT("[num2text(world.contents.len, 10)]") + tab_data["World Time"] = GENERATE_STAT_TEXT("[world.time]") + tab_data += GLOB.stat_entry() + tab_data += config.stat_entry() + tab_data["divider_1"] = GENERATE_STAT_DIVIDER + if(Master) + tab_data += Master.stat_entry() + else + tab_data["Master Controller"] = GENERATE_STAT_TEXT("ERROR") + if(Failsafe) + tab_data += Failsafe.stat_entry() + else + tab_data["Failsafe Controller"] = GENERATE_STAT_TEXT("ERROR") + if(Master) + tab_data["divider_2"] = list(type=STAT_DIVIDER) + for(var/datum/controller/subsystem/SS in Master.subsystems) + tab_data += SS.stat_entry() + tab_data += GLOB.cameranet.stat_entry() + return tab_data + +/* + * Gets the stat tabs available to the user. + * Contents of the stat tabs are got through get_stat() + */ +/mob/proc/get_stat_tabs() + //Standard + var/list/tabs = list( + "Status", + ) + //Get Tickets + if(client.current_ticket) + //Bwoinks come after status + tabs += "(!) Admin PM" + //Listed turfs + if(listed_turf && client) + if(!TurfAdjacent(listed_turf)) + listed_turf = null + else + tabs |= sanitize(listed_turf.name) + //Add spells + var/list/spells = mob_spell_list + if(mind) + spells = mind.spell_list + for(var/obj/effect/proc_holder/spell/S in spells) + if(S.can_be_cast_by(src)) + tabs |= S.panel + //Holder stat tabs + if(client.holder) + tabs |= "MC" + tabs |= "Tickets" + if(length(GLOB.sdql2_queries)) + tabs |= "SDQL2" + var/list/additional_tabs = list() + //Performance increase from only adding keys is better than adding values too. + for(var/i in get_all_verbs()) + additional_tabs |= i + additional_tabs = sortList(additional_tabs) + //Get verbs + tabs |= additional_tabs + return tabs + +/* + * Called when a stat button is pressed. + */ +/mob/proc/stat_pressed(button_pressed, params) + if(IsAdminAdvancedProcCall()) + message_admins("[key_name(usr)] called stat_pressed to potentially exploit the stat_pressed system.") + log_game("[key_name(usr)] called stat_pressed to potentially exploit the stat_pressed system.") + return + switch(button_pressed) + if("browsetickets") + GLOB.ahelp_tickets.BrowseTickets(src) + if("open_ticket") + var/ticket_id = text2num(params["id"]) + var/datum/admin_help/AH = GLOB.ahelp_tickets.TicketByID(ticket_id) + if(AH && client.holder) + AH.ui_interact(src) + if("atomClick") + var/atomRef = params["ref"] + var/atom/atom_actual = locate(atomRef) + var/mob/actor = client.mob + if(!atom_actual) + return + if(client.keys_held["Alt"]) + actor.AltClickOn(atom_actual) + else if(client.keys_held["Ctrl"]) + actor.CtrlClickOn(atom_actual) + else if(client.keys_held["Shift"]) + actor.ShiftClickOn(atom_actual) + else + actor.ClickOn(atom_actual) + if("atomDrop") + var/atomRef1 = params["ref"] + var/atomRef2 = params["ref_other"] + var/atom/atom_actual1 = locate(atomRef1) + var/atom/atom_actual2 = locate(atomRef2) + if(!atom_actual1 || !atom_actual2) + return + client.MouseDrop(atom_actual2, atom_actual1) + if("statClickDebug") + var/targetRef = params["targetRef"] + var/class = params["class"] + var/target = locate(targetRef) + if(!usr.client.holder) + message_admins("[usr.client] attempted to interact with the MC without sufficient perms.") + return + if(!target) + to_chat(usr, "Could not locate target, report this!") + log_runtime("[usr] attempted to interact with a statClickDebug, but was unsuccessful due to the target not existing.") + return + usr.client.debug_variables(target) + message_admins("Admin [key_name_admin(usr)] is debugging the [target] [class].") + if("verb") + var/verb_name = params["verb"] + winset(client, null, "command=[replacetext(verb_name, " ", "-")]") + if("sdql2debug") + client.debug_variables(GLOB.sdql2_queries) + if("sdql2delete") + var/query_id = params["qid"] + var/datum/SDQL2_query/query = sdqlQueryByID(text2num(query_id)) + if(query) + query.delete_click() + if("sdql2toggle") + var/query_id = params["qid"] + var/datum/SDQL2_query/query = sdqlQueryByID(text2num(query_id)) + if(query) + query.action_click() + if("ticket_message") + var/message = sanitize(params["msg"]) + if(message) + if(world.time > client.last_adminhelp_reply + 10 SECONDS) + client.last_adminhelp_reply = world.time + if(client.current_ticket) + client.current_ticket.MessageNoRecipient(message) + else + to_chat(src, "Your issue has already been resolved!") + else + to_chat(src, "You are sending messages too fast!") + if("start_br") + if(client.holder && check_rights(R_FUN)) + client.battle_royale() + +/* + * Sets the current stat tab selected. + */ +/mob/proc/set_stat_tab(new_tab) + client.selected_stat_tab = new_tab + //Tell tgui panel to update our tab + client.tgui_panel.set_stat_tab(new_tab) + +/* + * Updates the tab info for the selected tab. + */ +/mob/proc/update_stat_tabs(tabs) + client.previous_stat_tabs = tabs + //Tell tgui panel to udpate our data + client.tgui_panel.set_tab_info(tabs) + +/* + * Called when the tab is changed. + */ +/mob/proc/stat_tab_changed() + client.stat_update_time = client.stat_update_mode + +/** + * Output an update to the stat panel for the client + * + * calculates client ping, round id, server time, time dilation and other data about the round + * and puts it in the mob status panel on a regular loop + */ +/mob/proc/UpdateMobStat(forced = FALSE) + if(!client.tgui_panel) + return + //It would be nice if we could have things not update, + //But if the stat panel gets reloaded through fix-chat + //or other means then nothing will ever appear in the panel. + if(client.stat_update_time > 0 && !forced) + client.stat_update_time -- + return + client.stat_update_time = client.stat_update_mode + + var/list/stat_tabs = get_stat_tabs() + if(client.previous_stat_tabs != stat_tabs) + update_stat_tabs(stat_tabs) + if(!(client.selected_stat_tab in stat_tabs)) + set_stat_tab(stat_tabs[1]) + var/list/status_data = get_stat(client.selected_stat_tab) + client.tgui_panel.set_panel_infomation(status_data) + +#undef MAX_ICONS_PER_TILE diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 8e7272f320ffa..5e5741ffc1e95 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -4,6 +4,7 @@ /mob/verb/say_verb(message as text) set name = "Say" 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 @@ -77,6 +78,8 @@ var/spanned = say_quote(message) var/rendered = "DEAD: [name][alt_name] [emoji_parse(spanned)]" log_talk(message, LOG_SAY, tag="DEAD") + if(SEND_SIGNAL(src, COMSIG_MOB_DEADSAY, message) & MOB_DEADSAY_SIGNAL_INTERCEPT) + return deadchat_broadcast(rendered, follow_target = src, speaker_key = key) ///Check if this message is an emote @@ -93,23 +96,50 @@ /mob/proc/lingcheck() return LINGHIVE_NONE +///The amount of items we are looking for in the message +#define MESSAGE_MODS_LENGTH 6 + /** - * Get the mode of a message + * Extracts and cleans message of any extenstions at the begining of the message + * Inserts the info into the passed list, returns the cleaned message * * Result can be + * * SAY_MODE (Things like aliens, channels that aren't channels) * * MODE_WHISPER (Quiet speech) * * MODE_SING (Singing) * * MODE_HEADSET (Common radio channel) - * * A department radio (lots of values here) + * * RADIO_EXTENSION the extension we're using (lots of values here) + * * RADIO_KEY the radio key we're using, to make some things easier later (lots of values here) + * * LANGUAGE_EXTENSION the language we're trying to use (lots of values here) */ -/mob/proc/get_message_mode(message) - var/key = message[1] - if(key == "#") - return MODE_WHISPER - else if(key == "%") - return MODE_SING - else if(key == ";") - return MODE_HEADSET - else if((length(message) > (length(key) + 1)) && (key in GLOB.department_radio_prefixes)) - var/key_symbol = lowertext(message[length(key) + 1]) - return GLOB.department_radio_keys[key_symbol] +/mob/proc/get_message_mods(message, list/mods) + for(var/I in 1 to MESSAGE_MODS_LENGTH) + var/key = message[1] + var/chop_to = 2 //By default we just take off the first char + if(key == "#" && !mods[WHISPER_MODE]) + mods[WHISPER_MODE] = MODE_WHISPER + else if(key == "%" && !mods[MODE_SING]) + mods[MODE_SING] = TRUE + else if(key == ";" && !mods[MODE_HEADSET] && stat == CONSCIOUS) + mods[MODE_HEADSET] = TRUE + else if((key in GLOB.department_radio_prefixes) && length(message) > length(key) + 1 && !mods[RADIO_EXTENSION]) + mods[RADIO_KEY] = lowertext(message[1 + length(key)]) + mods[RADIO_EXTENSION] = GLOB.department_radio_keys[mods[RADIO_KEY]] + chop_to = length(key) + 2 + else if(key == "," && !mods[LANGUAGE_EXTENSION]) + for(var/ld in GLOB.all_languages) + var/datum/language/LD = ld + if(initial(LD.key) == message[1 + length(message[1])]) + // No, you cannot speak in xenocommon just because you know the key + if(!can_speak_language(LD)) + return message + mods[LANGUAGE_EXTENSION] = LD + chop_to = length(key) + length(initial(LD.key)) + 1 + if(!mods[LANGUAGE_EXTENSION]) + return message + else + return message + message = trim_left(copytext_char(message, chop_to)) + if(!message) + return + return message diff --git a/code/modules/mob/say_readme.md b/code/modules/mob/say_readme.md index 8cd3853442923..d90f59a4c22df 100644 --- a/code/modules/mob/say_readme.md +++ b/code/modules/mob/say_readme.md @@ -38,9 +38,6 @@ global procs message_spans_start(spans) Turns each element of spans into a span class. - message_spans_end(length) - Returns lenght times "" - attach_spans(input, spans) Attaches span classes around input. @@ -49,15 +46,13 @@ global procs The HEAR_1 flag determines whether something is a hearer or not. Hear() is only called on procs with this flag. - languages_spoken/languages_understood - Bitmask variable. - What languages this object speaks/understands. If the languages of the speaker don't match the languages - of the hearer, the message will be modified in the hearer's lang_treat(). + languages + languages live either in datum/languages_holder or in the mind. verb_say/verb_ask/verb_exclaim/verb_yell These determine what the verb is for their respective action. Used in say_quote(). - say(message) + say(message, bubble_type, var/list/spans, sanitize, datum/language/language, ignore_spam, forced) Say() is the "mother-proc". It calls all the other procs required for speaking, but does little itself. At the atom/movable level, say() just calls send_speech. @@ -67,19 +62,19 @@ global procs IMPORTANT NOTE: If radio_freq is not null, the code will assume that the speaker is virtual! (more info on this in the Radios section below) - send_speech(message, range, source, bubble_type, spans) + send_speech(message, range, source, bubble_type, spans, list/message_mods) This proc composes a list of hearers (things with the HEAR_1 flag + dead people) and calls Hear() on them. Message treatment or composition of output are not done by this proc, these are handled by the rest of say() and the hearer respectively. - lang_treat(message, atom/movable/speaker, message_langs, raw_message, spans, message_mode) + lang_treat(message, atom/movable/speaker, message_langs, raw_message, spans, list/message_mods) Modifies the message by comparing the languages of the speaker with the languages of the hearer. Called on the hearer. - Passes message_mode to say_quote. + Passes message_mods to say_quote. - say_quote(input, spans, message_mode) + say_quote(input, spans, list/message_mods) Adds a verb and quotes to a message. Also attaches span classes to a message. - Verbs are determined by verb_say/verb_ask/verb_yell variables. Called on the speaker. + Verbs are determined by verb_say/verb_ask/verb_yell/verb_sing variables. Called on the speaker. get_spans(input, spans) Returns the list of spans that are always applied to messages of this atom. @@ -89,7 +84,7 @@ global procs say_dead(message) Sends a message to all dead people. Does not use Hear(). - compose_message(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) + compose_message(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, list/message_mods) Composes the message mobs see on their screen when they hear something. compose_track_href(message, atom/movable/speaker, message_langs, raw_message, radio_freq) @@ -99,17 +94,17 @@ global procs Composes the job and the end tag for tracking hrefs. Returns "" for all mobs except AIs. hivecheck() - Returns 1 if the mob can hear and talk in the alien hivemind. + Returns TRUE if the mob can hear and talk in the alien hivemind. lingcheck() - Returns 1 if the mob can hear and talk in the changeling hivemind. + Returns a bitflag representing who is trying to talk to the changeling hivemind. /mob/living - say(message) + say(message, bubble_type, var/list/spans, sanitize, datum/language/languag, ignore_spam, forced) The say() of mob_living is significantly more complex than that of objects. Most of the extra code has to do with radios and message treatment. - send_speech(message, range, source, bubble_type, spans, message_mode) + send_speech(message, range, source, bubble_type, spans, list/message_mods) mob/living's send_speech allows mobs one tile outside of the defined range to still hear the message, but starred with the stars() proc. @@ -117,7 +112,7 @@ global procs Checks if the message begins with an * and is thus an emote. can_speak(message) - Calls can_speak_basic() and can_speak_vocal() + Calls can_speak_basic() and can_speak_vocal(), if they both pass it passes can_speak_basic(message) Sees if the mob can "think" the message. Does not include vocalization or stat checks. @@ -129,29 +124,34 @@ global procs hivemind chat. Called right after handle_inherent_channels() - get_message_mode(message) - Checks the start of the message for a message mode, then returns said message mode. - DOES NOT TRIM THE MESSAGE. This is done manually. - - handle_inherent_channels(message, message_mode) - If message_mode is MODE_BINARY, MODE_ALIEN or MODE_CHANGELING (or, for AIs, MODE_HOLOPAD), this will - handle speaking in those modes. Return 1 to exit say(). + get_message_mods(message, list/message_mods) + Checks the start of the message for each of the components it could contain, stores that info in mods, and returns a trimmed list treat_message(message) - What it says on the tin. Treats the message according to masks, mutantraces, mutations, etc. - Please try to keep things in a logical order (e.g. don't have masks handled before mutations), - even if that means you have to call ..() in the middle of the proc. + What it says on the tin. Treats the message according to flags set on the mob. + Also handles captilization of the message - radio(message, message_mode, spans) + radio(message, list/message_mods = list(), spans) Handles talking into radios. Uses a switch to determine what radio to speak into and in which manner to do so. Return is a bitflag. - NOPASS = terminate say() (used for whispers) + NOPASS = terminate say() ITALICS = add italics to the message REDUCE_RANGE = reduce the message range to one tile. Return 0 if no radio was spoken into. IMPORTANT: remember to call ..() and check for ..()'s return value properly! + +/datum/saymode + This is made to handle things like admin or alien chat. + Features that look like radio, but aren't quite + key + The key used to talk on this channel, in combination with : or . + mode + The UID we use for this channel + handle_message(message, list/message_mods, datum/language/language) + Intercepts say() after it's done all of it's message building. + If this returns true we stop say(), if it returns false we keep going ``` # RADIOS diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index f11dd335d4414..d4edcbc5b1748 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -27,8 +27,8 @@ eye_blind = max(eye_blind, amount) if(!old_eye_blind) if(stat == CONSCIOUS || stat == SOFT_CRIT) - throw_alert("blind", /obj/screen/alert/blind) - overlay_fullscreen("blind", /obj/screen/fullscreen/blind) + throw_alert("blind", /atom/movable/screen/alert/blind) + overlay_fullscreen("blind", /atom/movable/screen/fullscreen/blind) /** * Adjust a mobs blindness by an amount @@ -41,8 +41,8 @@ eye_blind += amount if(!old_eye_blind) if(stat == CONSCIOUS || stat == SOFT_CRIT) - throw_alert("blind", /obj/screen/alert/blind) - overlay_fullscreen("blind", /obj/screen/fullscreen/blind) + throw_alert("blind", /atom/movable/screen/alert/blind) + overlay_fullscreen("blind", /atom/movable/screen/fullscreen/blind) else if(eye_blind) var/blind_minimum = 0 if((stat != CONSCIOUS && stat != SOFT_CRIT)) @@ -64,8 +64,8 @@ eye_blind = amount if(client && !old_eye_blind) if(stat == CONSCIOUS || stat == SOFT_CRIT) - throw_alert("blind", /obj/screen/alert/blind) - overlay_fullscreen("blind", /obj/screen/fullscreen/blind) + throw_alert("blind", /atom/movable/screen/alert/blind) + overlay_fullscreen("blind", /atom/movable/screen/fullscreen/blind) else if(eye_blind) var/blind_minimum = 0 if(stat != CONSCIOUS && stat != SOFT_CRIT) @@ -103,10 +103,11 @@ /mob/proc/update_eye_blur() if(!client) return - var/obj/screen/plane_master/floor/OT = locate(/obj/screen/plane_master/floor) in client.screen - var/obj/screen/plane_master/game_world/GW = locate(/obj/screen/plane_master/game_world) in client.screen - GW.backdrop(src) - OT.backdrop(src) + var/atom/movable/plane_master_controller/game_plane_master_controller = hud_used.plane_master_controllers[PLANE_MASTERS_GAME] + if(eye_blurry) + game_plane_master_controller.add_filter("eye_blur", 1, gauss_blur_filter(clamp(eye_blurry * 0.1, 0.6, 3))) + else + game_plane_master_controller.remove_filter("eye_blur") ///Adjust the drugginess of a mob /mob/proc/adjust_drugginess(amount) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index c497485305eee..fe935f3364b7b 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -1,11 +1,10 @@ -/mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG)) - if (notransform) +#define TRANSFORMATION_DURATION 22 + +/mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG | TR_KEEPAI)) + if (notransform || transformation_timer) return - //Handle items on mob - //first implants & organs var/list/stored_implants = list() - var/list/int_organs = list() if (tr_flags & TR_KEEPIMPLANTS) for(var/X in implants) @@ -14,7 +13,7 @@ IMP.removed(src, 1, 1) var/list/missing_bodyparts_zones = get_missing_limbs() - + var/list/int_organs = list() var/obj/item/cavity_object var/obj/item/bodypart/chest/CH = get_bodypart(BODY_ZONE_CHEST) @@ -30,13 +29,17 @@ //Make mob invisible and spawn animation notransform = TRUE - Paralyze(22, ignore_canstun = TRUE) + Paralyze(TRANSFORMATION_DURATION, ignore_canstun = TRUE) icon = null cut_overlays() invisibility = INVISIBILITY_MAXIMUM new /obj/effect/temp_visual/monkeyify(loc) - sleep(22) + + transformation_timer = TRUE + sleep(TRANSFORMATION_DURATION) + transformation_timer = FALSE + var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey( loc ) // hash the original name? @@ -50,6 +53,7 @@ if(tr_flags & TR_KEEPSE) O.dna.mutation_index = dna.mutation_index + O.dna.default_mutation_genes = dna.default_mutation_genes O.dna.set_se(1, GET_INITIALIZED_MUTATION(RACEMUT)) if(suiciding) @@ -133,6 +137,13 @@ changeling.regain_powers() + //if we have an AI, transfer it; if we don't, make sure the new thing doesn't either + if(tr_flags & TR_KEEPAI) + if(ai_controller) + ai_controller.PossessPawn(O) + else if(O.ai_controller) + QDEL_NULL(O.ai_controller) + if (tr_flags & TR_DEFAULTMSG) to_chat(O, "You are now a monkey.") @@ -146,11 +157,10 @@ qdel(src) -////////////////////////// Humanize ////////////////////////////// -//Could probably be merged with monkeyize but other transformations got their own procs, too +//Mostly same as monkey but turns target into teratoma -/mob/living/carbon/proc/humanize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG)) - if (notransform) +/mob/living/carbon/proc/teratomize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG)) + if (notransform || transformation_timer) return //Handle items on mob @@ -168,6 +178,160 @@ var/obj/item/cavity_object + var/obj/item/bodypart/chest/CH = get_bodypart(BODY_ZONE_CHEST) + if(CH.cavity_item) + cavity_object = CH.cavity_item + CH.cavity_item = null + + if(tr_flags & TR_KEEPITEMS) + var/Itemlist = get_equipped_items(TRUE) + Itemlist += held_items + for(var/obj/item/W in Itemlist) + dropItemToGround(W) + + //Make mob invisible and spawn animation + notransform = TRUE + Paralyze(TRANSFORMATION_DURATION, ignore_canstun = TRUE) + icon = null + cut_overlays() + invisibility = INVISIBILITY_MAXIMUM + + new /obj/effect/temp_visual/monkeyify(loc) + + transformation_timer = TRUE + sleep(TRANSFORMATION_DURATION) + transformation_timer = FALSE + + var/mob/living/carbon/monkey/tumor/O = new /mob/living/carbon/monkey/tumor( loc ) + + // hash the original name? + if(tr_flags & TR_HASHNAME) + O.name = "living teratoma ([copytext_char(rustg_hash_string(RUSTG_HASH_MD5, real_name), 2, 6)])" + O.real_name = "living teratoma ([copytext_char(rustg_hash_string(RUSTG_HASH_MD5, real_name), 2, 6)])" + + //handle DNA and other attributes + dna.transfer_identity(O) + O.dna.species.species_traits += NOTRANSSTING + O.updateappearance(icon_update=0) + + if(tr_flags & TR_KEEPSE) + O.dna.mutation_index = dna.mutation_index + O.dna.set_se(1, GET_INITIALIZED_MUTATION(RACEMUT)) + + if(suiciding) + O.set_suicide(suiciding) + if(hellbound) + O.hellbound = hellbound + O.a_intent = INTENT_HARM + + //keep viruses? + if (tr_flags & TR_KEEPVIRUS) + O.diseases = diseases + diseases = list() + for(var/thing in O.diseases) + var/datum/disease/D = thing + D.affected_mob = O + + //keep damage? + if (tr_flags & TR_KEEPDAMAGE) + O.setToxLoss(getToxLoss(), 0) + O.adjustBruteLoss(getBruteLoss(), 0) + O.setOxyLoss(getOxyLoss(), 0) + O.setCloneLoss(getCloneLoss(), 0) + O.adjustFireLoss(getFireLoss(), 0) + O.setOrganLoss(ORGAN_SLOT_BRAIN, getOrganLoss(ORGAN_SLOT_BRAIN)) + O.updatehealth() + O.radiation = radiation + + //re-add implants to new mob + if (tr_flags & TR_KEEPIMPLANTS) + for(var/Y in implants) + var/obj/item/implant/IMP = Y + IMP.implant(O, null, 1) + + //re-add organs to new mob. this order prevents moving the mind to a brain at any point + if(tr_flags & TR_KEEPORGANS) + for(var/X in O.internal_organs) + var/obj/item/organ/I = X + I.Remove(O, 1) + + if(mind) + mind.transfer_to(O) + var/datum/antagonist/changeling/changeling = O.mind.has_antag_datum(/datum/antagonist/changeling) + if(changeling) + var/datum/action/changeling/humanform/hf = new + changeling.purchasedpowers += hf + changeling.regain_powers() + + for(var/X in internal_organs) + var/obj/item/organ/I = X + int_organs += I + I.Remove(src, 1) + + for(var/X in int_organs) + var/obj/item/organ/I = X + I.Insert(O, 1) + + var/obj/item/bodypart/chest/torso = O.get_bodypart(BODY_ZONE_CHEST) + if(cavity_object) + torso.cavity_item = cavity_object //cavity item is given to the new chest + cavity_object.forceMove(O) + + for(var/missing_zone in missing_bodyparts_zones) + var/obj/item/bodypart/BP = O.get_bodypart(missing_zone) + BP.drop_limb(1) + if(!(tr_flags & TR_KEEPORGANS)) //we didn't already get rid of the organs of the newly spawned mob + for(var/X in O.internal_organs) + var/obj/item/organ/G = X + if(BP.body_zone == check_zone(G.zone)) + if(mind && mind.has_antag_datum(/datum/antagonist/changeling) && istype(G, /obj/item/organ/brain)) + continue //so headless changelings don't lose their brain when transforming + qdel(G) //we lose the organs in the missing limbs + qdel(BP) + + //transfer mind if we didn't yet + if(mind) + mind.transfer_to(O) + var/datum/antagonist/changeling/changeling = O.mind.has_antag_datum(/datum/antagonist/changeling) + if(changeling) + var/datum/action/changeling/humanform/hf = new + changeling.purchasedpowers += hf + changeling.regain_powers() + + + if (tr_flags & TR_DEFAULTMSG) + to_chat(O, "You are now a living teratoma.") + + for(var/A in loc.vars) + if(loc.vars[A] == src) + loc.vars[A] = O + + transfer_observers_to(O) + + . = O + + qdel(src) + +////////////////////////// Humanize ////////////////////////////// +//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 | TR_KEEPAI)) + if (notransform || transformation_timer) + return + + var/list/stored_implants = list() + var/list/int_organs = list() + + if (tr_flags & TR_KEEPIMPLANTS) + for(var/X in implants) + var/obj/item/implant/IMP = X + stored_implants += IMP + IMP.removed(src, 1, 1) + + var/list/missing_bodyparts_zones = get_missing_limbs() + + var/obj/item/cavity_object + var/obj/item/bodypart/chest/CH = get_bodypart(BODY_ZONE_CHEST) if(CH.cavity_item) cavity_object = CH.cavity_item @@ -186,13 +350,16 @@ //Make mob invisible and spawn animation notransform = TRUE - Paralyze(22, ignore_canstun = TRUE) + Paralyze(TRANSFORMATION_DURATION, ignore_canstun = TRUE) icon = null cut_overlays() invisibility = INVISIBILITY_MAXIMUM new /obj/effect/temp_visual/monkeyify/humanify(loc) - sleep(22) + + transformation_timer = TRUE + sleep(TRANSFORMATION_DURATION) + transformation_timer = FALSE var/mob/living/carbon/human/O = new( loc ) for(var/obj/item/C in O.loc) @@ -212,6 +379,7 @@ if(tr_flags & TR_KEEPSE) O.dna.mutation_index = dna.mutation_index + O.dna.default_mutation_genes = dna.default_mutation_genes O.dna.set_se(0, GET_INITIALIZED_MUTATION(RACEMUT)) O.domutcheck() @@ -294,6 +462,14 @@ changeling.purchasedpowers -= HF changeling.regain_powers() + //if we have an AI, transfer it; if we don't, make sure the new thing doesn't either + if(tr_flags & TR_KEEPAI) + if(ai_controller) + ai_controller.PossessPawn(O) + else if(O.ai_controller) + QDEL_NULL(O.ai_controller) + + O.a_intent = INTENT_HELP if (tr_flags & TR_DEFAULTMSG) to_chat(O, "You are now a human.") @@ -606,7 +782,7 @@ /* Certain mob types have problems and should not be allowed to be controlled by players. * * This proc is here to force coders to manually place their mob in this list, hopefully tested. - * This also gives a place to explain -why- players shouldnt be turn into certain mobs and hopefully someone can fix them. + * This also gives a place to explain -why- players shouldn't be turn into certain mobs and hopefully someone can fix them. */ /mob/proc/safe_animal(MP) @@ -638,6 +814,16 @@ return 1 //Bears will auto-attack mobs, even if they're player controlled (Fixed! - Nodrak) if(ispath(MP, /mob/living/simple_animal/parrot)) return 1 //Parrots are no longer unfinished! -Nodrak + if(ispath(MP, /mob/living/simple_animal/slaughter)) + return 1 + if(ispath(MP, /mob/living/simple_animal/revenant)) + return 1 + if(ispath(MP, /mob/living/simple_animal/cluwne)) + return 1 + if(ispath(MP, /mob/living/simple_animal/cluwne)) + return 1 //Not in here? Must be untested! return 0 + +#undef TRANSFORMATION_DURATION diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm new file mode 100644 index 0000000000000..ae2b8f98c8529 --- /dev/null +++ b/code/modules/mob/typing_indicator.dm @@ -0,0 +1,76 @@ +GLOBAL_DATUM_INIT(human_typing_indicator, /mutable_appearance, mutable_appearance('icons/mob/talk.dmi', "typingindicator", -TYPING_LAYER)) + +/mob/proc/create_typing_indicator() + return + +/mob/proc/remove_typing_indicator() + return + +/mob/set_stat(new_stat) + . = ..() + if(.) + remove_typing_indicator() + +/mob/Logout() + remove_typing_indicator() + . = ..() + +////Typing verbs//// +//Those are used to show the typing indicator for the player without waiting on the client. + +/* +Some information on how these work: +The keybindings for say and me have been modified to call start_typing and immediately open the textbox clientside. +Because of this, the client doesn't have to wait for a message from the server before opening the textbox, the server +knows immediately when the user pressed the hotkey, and the clientside textbox can signal success or failure to the server. + +When you press the hotkey, the .start_typing verb is called with the source ("say" or "me") to show the typing indicator. +When you send a message from the custom window, the appropriate verb is called, .say or .me +If you close the window without actually sending the message, the .cancel_typing verb is called with the source. + +Both the say/me wrappers and cancel_typing remove the typing indicator. +*/ + +/// Show the typing indicator. The source signifies what action the user is typing for. +/mob/verb/start_typing(source as text) // The source argument is currently unused + set name = ".start_typing" + set hidden = 1 + + create_typing_indicator() + +/// Hide the typing indicator. The source signifies what action the user was typing for. +/mob/verb/cancel_typing(source as text) + set name = ".cancel_typing" + set hidden = 1 + + remove_typing_indicator() + +////Wrappers//// +//Keybindings were updated to change to use these wrappers. If you ever remove this file, revert those keybind changes + +/mob/verb/say_wrapper(message as text) + set name = ".Say" + set hidden = 1 + set instant = 1 + + remove_typing_indicator() + if(message) + say_verb(message) + +/mob/verb/me_wrapper(message as text) + set name = ".Me" + set hidden = 1 + set instant = 1 + + remove_typing_indicator() + if(message) + me_verb(message) + +///Human Typing Indicators/// +/mob/living/carbon/human/create_typing_indicator() + if(!overlays_standing[TYPING_LAYER] && stat == CONSCIOUS) //Prevents sticky overlays and typing while in any state besides conscious + overlays_standing[TYPING_LAYER] = GLOB.human_typing_indicator + apply_overlay(TYPING_LAYER) + +/mob/living/carbon/human/remove_typing_indicator() + remove_overlay(TYPING_LAYER) diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm index 20ad05b8e3778..cf1b9bb28cd35 100644 --- a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm +++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm @@ -16,6 +16,8 @@ /datum/ntnet_conversation/Destroy() if(SSnetworks.station_network) SSnetworks.station_network.chat_channels.Remove(src) + for(var/datum/computer_file/program/chatclient/chatterbox in clients) + purge_client(chatterbox) return ..() /datum/ntnet_conversation/proc/add_message(message, username) @@ -35,12 +37,18 @@ /datum/ntnet_conversation/proc/add_client(datum/computer_file/program/chatclient/C) if(!istype(C)) return + C.conversations |= src clients.Add(C) add_status_message("[C.username] has joined the channel.") // No operator, so we assume the channel was empty. Assign this user as operator. if(!operator) changeop(C) +//Clear all of our references to a client, used for client deletion +/datum/ntnet_conversation/proc/purge_client(datum/computer_file/program/chatclient/forget) + remove_client(forget) + forget.conversations -= src + /datum/ntnet_conversation/proc/remove_client(datum/computer_file/program/chatclient/C) if(!istype(C) || !(C in clients)) return diff --git a/code/modules/modular_computers/computers/_modular_computer_shared.dm b/code/modules/modular_computers/computers/_modular_computer_shared.dm index 8ca93e8347b73..e807118b8ed6a 100644 --- a/code/modules/modular_computers/computers/_modular_computer_shared.dm +++ b/code/modules/modular_computers/computers/_modular_computer_shared.dm @@ -61,4 +61,4 @@ if(printer_slot) . += "It has a printer installed." if(user_is_adjacent) - . += "The printer's paper levels are at: [printer_slot.stored_paper]/[printer_slot.max_paper].]" + . += "The printer's paper levels are at: [printer_slot.stored_paper]/[printer_slot.max_paper]." diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 33922e02448f3..d40553978f042 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -7,6 +7,7 @@ var/enabled = 0 // Whether the computer is turned on. var/screen_on = 1 // Whether the computer is active/opened/it's screen is on. + var/device_theme = "ntos" // Sets the theme for the main menu, hardware config, and file browser apps. Overridden by certain non-NT devices. var/datum/computer_file/program/active_program = null // A currently active program running on the computer. var/hardware_flag = 0 // A flag that describes this device type var/last_power_usage = 0 @@ -31,7 +32,7 @@ integrity_failure = 50 max_integrity = 100 - armor = list("melee" = 0, "bullet" = 20, "laser" = 20, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0) + armor = list("melee" = 0, "bullet" = 20, "laser" = 20, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0, "stamina" = 0) // Important hardware (must be installed for computer to work) @@ -70,23 +71,23 @@ return ..() -/obj/item/modular_computer/proc/add_verb(var/path) +/obj/item/modular_computer/proc/add_computer_verbs(var/path) switch(path) if(MC_CARD) - verbs += /obj/item/modular_computer/proc/eject_id + add_verb(/obj/item/modular_computer/proc/eject_id) if(MC_SDD) - verbs += /obj/item/modular_computer/proc/eject_disk + add_verb(/obj/item/modular_computer/proc/eject_disk) if(MC_AI) - verbs += /obj/item/modular_computer/proc/eject_card + add_verb(/obj/item/modular_computer/proc/eject_card) -/obj/item/modular_computer/proc/remove_verb(path) +/obj/item/modular_computer/proc/remove_computer_verbs(path) switch(path) if(MC_CARD) - verbs -= /obj/item/modular_computer/proc/eject_id + remove_verb(/obj/item/modular_computer/proc/eject_id) if(MC_SDD) - verbs -= /obj/item/modular_computer/proc/eject_disk + remove_verb(/obj/item/modular_computer/proc/eject_disk) if(MC_AI) - verbs -= /obj/item/modular_computer/proc/eject_card + remove_verb(/obj/item/modular_computer/proc/eject_card) // Eject ID card from computer, if it has ID slot with card inside. /obj/item/modular_computer/proc/eject_id() @@ -126,7 +127,6 @@ portable_drive.verb_pickup() /obj/item/modular_computer/AltClick(mob/user) - ..() if(issilicon(user)) return @@ -159,7 +159,7 @@ /obj/item/modular_computer/MouseDrop(obj/over_object, src_location, over_location) var/mob/M = usr - if((!istype(over_object, /obj/screen)) && usr.canUseTopic(src, BE_CLOSE)) + if((!istype(over_object, /atom/movable/screen)) && usr.canUseTopic(src, BE_CLOSE)) return attack_self(M) return ..() @@ -178,13 +178,22 @@ turn_on(user) /obj/item/modular_computer/emag_act(mob/user) - if(obj_flags & EMAGGED) - to_chat(user, "\The [src] was already emagged.") - return 0 - else - obj_flags |= EMAGGED - to_chat(user, "You emag \the [src]. It's screen briefly shows a \"OVERRIDE ACCEPTED: New software downloads available.\" message.") - return 1 + if(!enabled) + to_chat(user, "You'd need to turn the [src] on first.") + return FALSE + obj_flags |= EMAGGED //Mostly for consistancy purposes; the programs will do their own emag handling + var/newemag = FALSE + var/obj/item/computer_hardware/hard_drive/drive = all_components[MC_HDD] + for(var/datum/computer_file/program/app in drive.stored_files) + if(!istype(app)) + continue + if(app.run_emag()) + newemag = TRUE + if(newemag) + to_chat(user, "You swipe \the [src]. A console window momentarily fills the screen, with white text rapidly scrolling past.") + return TRUE + to_chat(user, "You swipe \the [src]. A console window fills the screen, but it quickly closes itself after only a few lines are written to it.") + return FALSE /obj/item/modular_computer/examine(mob/user) . = ..() @@ -247,7 +256,7 @@ to_chat(user, "You press the power button but \the [src] does not respond.") // Process currently calls handle_power(), may be expanded in future if more things are added. -/obj/item/modular_computer/process() +/obj/item/modular_computer/process(delta_time) if(!enabled) // The computer is turned off last_power_usage = 0 return 0 @@ -266,7 +275,7 @@ if(active_program) if(active_program.program_state != PROGRAM_STATE_KILLED) - active_program.process_tick() + active_program.process_tick(delta_time) active_program.ntnet_status = get_ntnet_status() else active_program = null @@ -274,18 +283,20 @@ for(var/I in idle_threads) var/datum/computer_file/program/P = I if(P.program_state != PROGRAM_STATE_KILLED) - P.process_tick() + P.process_tick(delta_time) P.ntnet_status = get_ntnet_status() else idle_threads.Remove(P) - handle_power() // Handles all computer power interaction + handle_power(delta_time) // Handles all computer power interaction //check_update_ui_need() // Function used by NanoUI's to obtain data for header. All relevant entries begin with "PC_" /obj/item/modular_computer/proc/get_header_data() var/list/data = list() + data["PC_device_theme"] = device_theme + var/obj/item/computer_hardware/battery/battery_module = all_components[MC_CELL] var/obj/item/computer_hardware/recharger/recharger = all_components[MC_CHARGE] diff --git a/code/modules/modular_computers/computers/item/computer_power.dm b/code/modules/modular_computers/computers/item/computer_power.dm index 55996031a7ba2..92b3ab9ee1d4e 100644 --- a/code/modules/modular_computers/computers/item/computer_power.dm +++ b/code/modules/modular_computers/computers/item/computer_power.dm @@ -42,10 +42,10 @@ shutdown_computer(0) // Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged -/obj/item/modular_computer/proc/handle_power() +/obj/item/modular_computer/proc/handle_power(delta_time) var/obj/item/computer_hardware/recharger/recharger = all_components[MC_CHARGE] if(recharger) - recharger.process() + recharger.process(delta_time) var/power_usage = screen_on ? base_active_power_usage : base_idle_power_usage diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index c948fa24112cd..677e759c808ec 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -46,12 +46,13 @@ ui = SStgui.try_update_ui(user, src, ui) if (!ui) ui = new(user, src, "NtosMain") - ui.open() ui.set_autoupdate(TRUE) - ui.send_asset(get_asset_datum(/datum/asset/simple/headers)) + if(ui.open()) + ui.send_asset(get_asset_datum(/datum/asset/simple/headers)) /obj/item/modular_computer/ui_data(mob/user) var/list/data = get_header_data() + data["device_theme"] = device_theme data["programs"] = list() var/obj/item/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD] for(var/datum/computer_file/program/P in hard_drive.stored_files) @@ -104,6 +105,7 @@ P.kill_program(forced = TRUE) to_chat(user, "Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed.") + return TRUE if("PC_runprogram") var/prog = params["name"] @@ -141,7 +143,7 @@ if(P.run_program(user)) active_program = P update_icon() - return 1 + return TRUE if("PC_toggle_light") light_on = !light_on diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index 11359b04eda4e..425fb75ca3b85 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -56,8 +56,8 @@ . = ..() if(over_object == usr || over_object == src) try_toggle_open(usr) - else if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + else if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object var/mob/M = usr if(!M.restrained() && !M.stat) @@ -87,7 +87,7 @@ if(screen_on) // Close it. try_toggle_open(user) else - return ..() + ..() /obj/item/modular_computer/laptop/proc/toggle_open(mob/living/user=null) if(screen_on) diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index 5a93c656f5930..b2c1272ee68a0 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -58,23 +58,23 @@ machinery_computer.update_icon() return -/obj/item/modular_computer/processor/add_verb(path) +/obj/item/modular_computer/processor/add_computer_verbs(path) switch(path) if(MC_CARD) - machinery_computer.verbs += /obj/machinery/modular_computer/proc/eject_id + machinery_computer.add_verb(/obj/machinery/modular_computer/proc/eject_id) if(MC_SDD) - machinery_computer.verbs += /obj/machinery/modular_computer/proc/eject_disk + machinery_computer.add_verb(/obj/machinery/modular_computer/proc/eject_disk) if(MC_AI) - machinery_computer.verbs += /obj/machinery/modular_computer/proc/eject_card + machinery_computer.add_verb(/obj/machinery/modular_computer/proc/eject_card) -/obj/item/modular_computer/processor/remove_verb(path) +/obj/item/modular_computer/processor/remove_computer_verbs(path) switch(path) if(MC_CARD) - machinery_computer.verbs -= /obj/machinery/modular_computer/proc/eject_id + machinery_computer.remove_verb(/obj/machinery/modular_computer/proc/eject_id) if(MC_SDD) - machinery_computer.verbs -= /obj/machinery/modular_computer/proc/eject_disk + machinery_computer.remove_verb(/obj/machinery/modular_computer/proc/eject_disk) if(MC_AI) - machinery_computer.verbs -= /obj/machinery/modular_computer/proc/eject_card + machinery_computer.remove_verb(/obj/machinery/modular_computer/proc/eject_card) /obj/item/modular_computer/processor/attack_ghost(mob/user) ui_interact(user) diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm index 45a69aed9d371..abf4ae8016b47 100644 --- a/code/modules/modular_computers/computers/item/tablet.dm +++ b/code/modules/modular_computers/computers/item/tablet.dm @@ -35,3 +35,19 @@ slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT comp_light_luminosity = 6.3 has_variants = FALSE + +/// Given to Nuke Ops members. +/obj/item/modular_computer/tablet/nukeops + icon_state = "tablet-syndicate" + icon_state_powered = "tablet-syndicate" + icon_state_unpowered = "tablet-syndicate" + comp_light_luminosity = 6.3 + has_variants = FALSE + device_theme = "syndicate" + +/obj/item/modular_computer/tablet/nukeops/emag_act(mob/user) + if(!enabled) + to_chat(user, "You'd need to turn the [src] on first.") + return FALSE + to_chat(user, "You swipe \the [src]. It's screen briefly shows a message reading \"MEMORY CODE INJECTION DETECTED AND SUCCESSFULLY QUARANTINED\".") + return FALSE diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm index 3e3d7d02eac82..e98305f17012b 100644 --- a/code/modules/modular_computers/computers/item/tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/tablet_presets.dm @@ -22,11 +22,13 @@ /obj/item/modular_computer/tablet/preset/cargo/Initialize() . = ..() + var/obj/item/computer_hardware/hard_drive/small/hard_drive = new install_component(new /obj/item/computer_hardware/processor_unit/small) install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer)) - install_component(new /obj/item/computer_hardware/hard_drive/small) + install_component(hard_drive) install_component(new /obj/item/computer_hardware/network_card) install_component(new /obj/item/computer_hardware/printer/mini) + hard_drive.store_file(new /datum/computer_file/program/bounty) /// Given by the syndicate as part of the contract uplink bundle - loads in the Contractor Uplink. /obj/item/modular_computer/tablet/syndicate_contract_uplink/preset/uplink/Initialize() @@ -46,3 +48,11 @@ install_component(new /obj/item/computer_hardware/network_card) install_component(new /obj/item/computer_hardware/card_slot) install_component(new /obj/item/computer_hardware/printer/mini) + +/// Given to Nuke Ops members. +/obj/item/modular_computer/tablet/nukeops/Initialize() + . = ..() + install_component(new /obj/item/computer_hardware/processor_unit/small) + install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer)) + install_component(new /obj/item/computer_hardware/hard_drive/small/nukeops) + install_component(new /obj/item/computer_hardware/network_card) diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index 4b09436796c88..9c5a37d4698fe 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -25,8 +25,6 @@ /obj/machinery/modular_computer/console/preset/proc/install_programs() return - - // ===== ENGINEERING CONSOLE ===== /obj/machinery/modular_computer/console/preset/engineering console_department = "Engineering" @@ -75,3 +73,14 @@ /obj/machinery/modular_computer/console/preset/civilian/install_programs() var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] hard_drive.store_file(new/datum/computer_file/program/chatclient()) + +// curator +/obj/machinery/modular_computer/console/preset/curator + console_department = "Civilian" + name = "curator console" + desc = "A stationary computer. This one comes preloaded with art programs." + _has_printer = TRUE + +/obj/machinery/modular_computer/console/preset/curator/install_programs() + var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] + hard_drive.store_file(new/datum/computer_file/program/portrait_printer()) diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 03c935e69edc5..ae4b874968d6d 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -48,7 +48,10 @@ cpu.attack_ghost(user) /obj/machinery/modular_computer/emag_act(mob/user) - return cpu ? cpu.emag_act(user) : 1 + if(!cpu) + to_chat(user, "You'd need to turn the [src] on first.") + return FALSE + return (cpu.emag_act(user)) /obj/machinery/modular_computer/update_icon() cut_overlays() @@ -108,11 +111,11 @@ return ..() // Process currently calls handle_power(), may be expanded in future if more things are added. -/obj/machinery/modular_computer/process() +/obj/machinery/modular_computer/process(delta_time) if(cpu) // Keep names in sync. cpu.name = name - cpu.process() + cpu.process(delta_time) // Used in following function to reduce copypaste /obj/machinery/modular_computer/proc/power_failure(malfunction = 0) @@ -143,7 +146,13 @@ // Minor explosions are mostly mitigitated by casing. /obj/machinery/modular_computer/ex_act(severity) if(cpu) - cpu.ex_act(severity) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += cpu + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += cpu + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += cpu ..() // EMPs are similar to explosions, but don't cause physical damage to the casing. Instead they screw up the components diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 7baec99cf4726..70b0421c7e54b 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -18,8 +18,6 @@ var/available_on_syndinet = 0 // Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable. var/tgui_id // ID of TGUI interface var/ui_style // ID of custom TGUI style (optional) - - var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /icons/program_icons. Be careful not to use too large images! /datum/computer_file/program/New(obj/item/modular_computer/comp = null) @@ -65,7 +63,7 @@ return 0 // Called by Process() on device that runs us, once every tick. -/datum/computer_file/program/proc/process_tick() +/datum/computer_file/program/proc/process_tick(delta_time) return 1 // Check if the user can run program. Only humans can operate computer. Automatically called in run_program() @@ -131,6 +129,20 @@ return 1 return 0 +/** + * + *Called by the device when it is emagged. + * + *Emagging the device allows certain programs to unlock new functions. However, the program will + *need to be downloaded first, and then handle the unlock on their own in their run_emag() proc. + *The device will allow an emag to be run multiple times, so the user can re-emag to run the + *override again, should they download something new. The run_emag() proc should return TRUE if + *the emagging affected anything, and FALSE if no change was made (already emagged, or has no + *emag functions). +**/ +/datum/computer_file/program/proc/run_emag() + return FALSE + // Use this proc to kill the program. Designed to be implemented by each program if it requires on-quit logic, such as the NTNRC client. /datum/computer_file/program/proc/kill_program(forced = FALSE) program_state = PROGRAM_STATE_KILLED @@ -150,9 +162,9 @@ ui = SStgui.try_update_ui(user, src, ui) if(!ui && tgui_id) ui = new(user, src, tgui_id, filename) - ui.set_autoupdate(TRUE) - ui.open() + if(ui.open()) + ui.send_asset(get_asset_datum(/datum/asset/simple/headers)) // CONVENTIONS, READ THIS WHEN CREATING NEW PROGRAM AND OVERRIDING THIS PROC: // Topic calls are automagically forwarded from NanoModule this program contains. diff --git a/code/modules/modular_computers/file_system/programs/alarm.dm b/code/modules/modular_computers/file_system/programs/alarm.dm index a3cf95f542977..d2e19dfcc724d 100644 --- a/code/modules/modular_computers/file_system/programs/alarm.dm +++ b/code/modules/modular_computers/file_system/programs/alarm.dm @@ -12,7 +12,6 @@ var/has_alert = 0 - var/alarms = list("Fire" = list(), "Atmosphere" = list(), "Power" = list()) /datum/computer_file/program/alarm_monitor/process_tick() ..() @@ -32,63 +31,85 @@ var/list/data = get_header_data() data["alarms"] = list() - for(var/class in alarms) + for(var/class in GLOB.alarms) data["alarms"][class] = list() - for(var/area in alarms[class]) + for(var/area in GLOB.alarms[class]) data["alarms"][class] += area return data -/datum/computer_file/program/alarm_monitor/proc/triggerAlarm(class, area/A, O, obj/source) +/datum/computer_file/program/alarm_monitor/proc/triggerAlarm(class, area/home, cameras, obj/source) if(is_station_level(source.z)) - if(!(A.type in GLOB.the_station_areas)) + if(!(home.type in GLOB.the_station_areas)) return - else if(!is_mining_level(source.z) || istype(A, /area/ruin)) + else if(!is_mining_level(source.z) || istype(home, /area/ruin)) return - var/list/L = alarms[class] - for(var/I in L) - if (I == A.name) - var/list/alarm = L[I] + var/list/our_sort = GLOB.alarms[class] + for(var/areaname in our_sort) + if (areaname == home.name) + var/list/alarm = our_sort[areaname] var/list/sources = alarm[3] if (!(source in sources)) sources += source - return 1 - var/obj/machinery/camera/C = null - var/list/CL = null - if(O && istype(O, /list)) - CL = O - if (CL.len == 1) - C = CL[1] - else if(O && istype(O, /obj/machinery/camera)) - C = O - L[A.name] = list(A, (C ? C : O), list(source)) + return TRUE + + var/obj/machinery/camera/cam = null + var/list/our_cams = null + if(cameras && islist(cameras)) + our_cams = cameras + if (our_cams.len == 1) + cam = our_cams[1] + else if(cameras && istype(cameras, /obj/machinery/camera)) + cam = cameras + our_sort[home.name] = list(home, (cam ? cam : cameras), list(source)) update_alarm_display() - - return 1 - + return TRUE + +/datum/computer_file/program/alarm_monitor/proc/freeCamera(area/home, obj/machinery/camera/cam) + for(var/class in GLOB.alarms) + var/our_area = GLOB.alarms[class][home.name] + if(!our_area) + continue + var/cams = our_area[2] //Get the cameras + if(!cams) + continue + if(islist(cams)) + cams -= cam + if(length(cams) == 1) + our_area[2] = cams[1] + else + our_area[2] = null /datum/computer_file/program/alarm_monitor/proc/cancelAlarm(class, area/A, obj/origin) - var/list/L = alarms[class] + var/list/L = GLOB.alarms[class] var/cleared = 0 + var/arealevelalarm = FALSE // set to TRUE for alarms that set/clear whole areas + if (class=="Fire") + arealevelalarm = TRUE for (var/I in L) if (I == A.name) - var/list/alarm = L[I] - var/list/srcs = alarm[3] - if (origin in srcs) - srcs -= origin - if (srcs.len == 0) + if (!arealevelalarm) // the traditional behaviour + var/list/alarm = L[I] + var/list/srcs = alarm[3] + if (origin in srcs) + srcs -= origin + if (srcs.len == 0) + cleared = 1 + L -= I + else + L -= I // wipe the instances entirely cleared = 1 - L -= I + update_alarm_display() return !cleared /datum/computer_file/program/alarm_monitor/proc/update_alarm_display() has_alert = FALSE - for(var/cat in alarms) - var/list/L = alarms[cat] + for(var/cat in GLOB.alarms) + var/list/L = GLOB.alarms[cat] if(L.len) has_alert = TRUE diff --git a/code/modules/modular_computers/file_system/programs/antagonist/contract_uplink.dm b/code/modules/modular_computers/file_system/programs/antagonist/contract_uplink.dm index fe45c93049fa1..f51bbf35b4dc6 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/contract_uplink.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/contract_uplink.dm @@ -164,6 +164,10 @@ )) for (var/datum/syndicate_contract/contract in traitor_data.contractor_hub.assigned_contracts) + if(!contract.contract) + stack_trace("Syndiate contract with null contract objective found in [traitor_data.owner]'s contractor hub!") + contract.status = CONTRACT_STATUS_ABORTED + continue data["contracts"] += list(list( "target" = contract.contract.target, "target_rank" = contract.target_rank, @@ -186,7 +190,7 @@ dropoff_turf = content break - if(curr.z == dropoff_turf.z) //Direction calculations for same z-level only + if(curr.get_virtual_z_level() == dropoff_turf.get_virtual_z_level()) //Direction calculations for same z-level only direction = uppertext(dir2text(get_dir(curr, dropoff_turf))) //Direction text (East, etc). Not as precise, but still helpful. if(get_area(user) == traitor_data.contractor_hub.current_contract.contract.dropoff) direction = "LOCATION CONFIRMED" diff --git a/code/modules/modular_computers/file_system/programs/arcade.dm b/code/modules/modular_computers/file_system/programs/arcade.dm index e79cfca307f5a..d9b4fab3f7601 100644 --- a/code/modules/modular_computers/file_system/programs/arcade.dm +++ b/code/modules/modular_computers/file_system/programs/arcade.dm @@ -29,7 +29,7 @@ sleep(5) if(boss_hp <= 0) heads_up = "You have crushed [boss_name]! Rejoice!" - playsound(computer.loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3, falloff_exponent = 10) game_active = FALSE program_icon_state = "arcade_off" if(istype(computer)) @@ -38,7 +38,7 @@ sleep(10) else if(player_hp <= 0 || player_mp <= 0) heads_up = "You have been defeated... how will the station survive?" - playsound(computer.loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3, falloff_exponent = 10) game_active = FALSE program_icon_state = "arcade_off" if(istype(computer)) @@ -57,17 +57,17 @@ return if (boss_mp <= 5) heads_up = "[boss_mpamt] magic power has been stolen from you!" - playsound(computer.loc, 'sound/arcade/steal.ogg', 50, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/steal.ogg', 50, TRUE, extrarange = -3, falloff_exponent = 10) player_mp -= boss_mpamt boss_mp += boss_mpamt else if(boss_mp > 5 && boss_hp <12) heads_up = "[boss_name] heals for [bossheal] health!" - playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3, falloff_exponent = 10) boss_hp += bossheal boss_mp -= boss_mpamt else heads_up = "[boss_name] attacks you for [boss_attackamt] damage!" - playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3, falloff_exponent = 10) player_hp -= boss_attackamt pause_state = FALSE @@ -78,12 +78,8 @@ get_asset_datum(/datum/asset/simple/arcade), ) -/datum/computer_file/program/arcade/ui_interact(mob/user, datum/tgui/ui) - . = ..() - /datum/computer_file/program/arcade/ui_data(mob/user) var/list/data = get_header_data() - data["Hitpoints"] = boss_hp data["PlayerHitpoints"] = player_hp data["PlayerMP"] = player_mp @@ -106,7 +102,7 @@ attackamt = rand(2, 6) pause_state = TRUE heads_up = "You attack for [attackamt] damage." - playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3, falloff_exponent = 10) boss_hp -= attackamt sleep(10) game_check() @@ -120,7 +116,7 @@ healcost = rand(1, 3) pause_state = TRUE heads_up = "You heal for [healamt] damage." - playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3, falloff_exponent = 10) player_hp += healamt player_mp -= healcost sleep(10) @@ -133,7 +129,7 @@ rechargeamt = rand(4, 7) pause_state = TRUE heads_up = "You regain [rechargeamt] magic power." - playsound(computer.loc, 'sound/arcade/mana.ogg', 50, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/mana.ogg', 50, TRUE, extrarange = -3, falloff_exponent = 10) player_mp += rechargeamt sleep(10) game_check() diff --git a/code/modules/modular_computers/file_system/programs/atmosscan.dm b/code/modules/modular_computers/file_system/programs/atmosscan.dm index 82a66812de48a..db4aadcc35379 100644 --- a/code/modules/modular_computers/file_system/programs/atmosscan.dm +++ b/code/modules/modular_computers/file_system/programs/atmosscan.dm @@ -23,7 +23,7 @@ for(var/id in environment.get_gases()) var/gas_level = environment.get_moles(id)/total_moles if(gas_level > 0) - airlist += list(list("name" = "[GLOB.meta_gas_info[id][META_GAS_NAME]]", "percentage" = round(gas_level*100, 0.01))) + airlist += list(list("name" = "[GLOB.gas_data.names[id]]", "percentage" = round(gas_level*100, 0.01))) data["AirData"] = airlist return data diff --git a/code/modules/modular_computers/file_system/programs/borg_monitor.dm b/code/modules/modular_computers/file_system/programs/borg_monitor.dm index 87a806797c343..d827dc8d3d0ba 100644 --- a/code/modules/modular_computers/file_system/programs/borg_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/borg_monitor.dm @@ -21,7 +21,7 @@ data["cyborgs"] = list() for(var/mob/living/silicon/robot/R in GLOB.silicon_mobs) - if((get_turf(computer)).z != (get_turf(R)).z) + if((get_turf(computer)).get_virtual_z_level() != (get_turf(R)).get_virtual_z_level()) continue if(R.scrambledcodes) continue diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index 93b75f6e0f04b..b5580f7bba9db 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -179,7 +179,7 @@ if("PRG_edit") if(!computer || !authenticated || !id_card) return - var/new_name = params["name"] + var/new_name = reject_bad_name(params["name"]) // if reject bad name fails, the edit will just not go through instead of discarding all input, as new_name would be blank. if(!new_name) return log_id("[key_name(usr)] changed [id_card] name to '[new_name]', using [user_id_card] via a portable ID console at [AREACOORD(usr)].") @@ -195,7 +195,7 @@ return if(target == "Custom") - var/custom_name = params["custom_name"] + var/custom_name = reject_bad_name(params["custom_name"]) // if reject bad name fails, the edit will just not go through, as custom_name would be empty if(custom_name) log_id("[key_name(usr)] assigned a custom assignment '[custom_name]' to [id_card] using [user_id_card] via a portable ID console at [AREACOORD(usr)].") id_card.assignment = custom_name @@ -292,7 +292,7 @@ CARDCON_DEPARTMENT_SCIENCE = GLOB.science_positions, CARDCON_DEPARTMENT_SECURITY = GLOB.security_positions, CARDCON_DEPARTMENT_SUPPLY = GLOB.supply_positions, - CARDCON_DEPARTMENT_CIVILIAN = GLOB.civilian_positions + CARDCON_DEPARTMENT_CIVILIAN = GLOB.civilian_positions | GLOB.gimmick_positions ) data["jobs"] = list() for(var/department in departments) diff --git a/code/modules/modular_computers/file_system/programs/cargobounty.dm b/code/modules/modular_computers/file_system/programs/cargobounty.dm new file mode 100644 index 0000000000000..9455b6e70cb49 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/cargobounty.dm @@ -0,0 +1,73 @@ +/datum/computer_file/program/bounty + filename = "bounty" + filedesc = "Nanotrasen Bounty Hunter" + program_icon_state = "bounty" + extended_desc = "A basic interface for supply personnel to check and claim bounties." + requires_ntnet = TRUE + transfer_access = ACCESS_CARGO + network_destination = "cargo claims interface" + size = 10 + tgui_id = "NtosBountyConsole" + + ///cooldown var for printing paper sheets. + var/printer_ready = 0 + ///The cargo account for grabbing the cargo account's credits. + var/static/datum/bank_account/cargocash + +/datum/computer_file/program/bounty/proc/print_paper() + new /obj/item/paper/bounty_printout(get_turf(computer)) + +/datum/computer_file/program/bounty/ui_interact(mob/user, datum/tgui/ui) + if(!GLOB.bounties_list.len) + setup_bounties() + printer_ready = world.time + PRINTER_TIMEOUT + cargocash = SSeconomy.get_dep_account(ACCOUNT_CAR) + . = ..() + +/datum/computer_file/program/bounty/ui_data(mob/user) + var/list/data = get_header_data() + + var/obj/item/computer_hardware/printer/printer + if(computer) + printer = computer.all_components[MC_PRINT] + + var/list/bountyinfo = list() + for(var/datum/bounty/B in GLOB.bounties_list) + bountyinfo += list(list( + "name" = B.name, + "description" = B.description, + "reward_string" = B.reward_string(), + "completion_string" = B.completion_string(), + "claimed" = B.claimed, + "can_claim" = B.can_claim(), + "priority" = B.high_priority, + "bounty_ref" = REF(B) + )) + + data["has_printer"] = printer ? TRUE : FALSE + + data["stored_cash"] = cargocash.account_balance + data["bountydata"] = bountyinfo + + return data + +/datum/computer_file/program/bounty/ui_act(action,params) + if(..()) + return + switch(action) + if("ClaimBounty") + var/datum/bounty/cashmoney = locate(params["bounty"]) in GLOB.bounties_list + if(cashmoney) + cashmoney.claim() + return TRUE + if("Print") + var/obj/item/computer_hardware/printer/printer + if(computer) + printer = computer.all_components[MC_PRINT] + + if(printer) + if(!printer.print_type(/obj/item/paper/bounty_printout)) + to_chat(usr, "Hardware error: Printer was unable to print the file. It may be out of paper.") + return + else + computer.visible_message("\The [computer] prints out a paper.") diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm index ad15e61d29a60..a000586f6ecd3 100644 --- a/code/modules/modular_computers/file_system/programs/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -20,6 +20,21 @@ var/download_netspeed = 0 var/downloaderror = "" var/obj/item/modular_computer/my_computer = null + var/emagged = FALSE + var/list/main_repo + var/list/antag_repo + +/datum/computer_file/program/ntnetdownload/run_program() + . = ..() + main_repo = SSnetworks.station_network.available_station_software + antag_repo = SSnetworks.station_network.available_antag_software + +/datum/computer_file/program/ntnetdownload/run_emag() + if(emagged) + return FALSE + emagged = TRUE + return TRUE + /datum/computer_file/program/ntnetdownload/proc/begin_file_download(filename) if(downloaded_file) @@ -30,8 +45,8 @@ if(!PRG || !istype(PRG)) return 0 - // Attempting to download antag only program, but without having emagged computer. No. - if(PRG.available_on_syndinet && !(computer.obj_flags & EMAGGED)) + // Attempting to download antag only program, but without having emagged/syndicate computer. No. + if(PRG.available_on_syndinet && !emagged) return 0 var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD] @@ -41,10 +56,10 @@ ui_header = "downloader_running.gif" - if(PRG in SSnetworks.station_network.available_station_software) + if(PRG in main_repo) generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from NTNet Software Repository.") hacked_download = 0 - else if(PRG in SSnetworks.station_network.available_antag_software) + else if(PRG in antag_repo) generate_network_log("Began downloading file **ENCRYPTED**.[PRG.filetype] from unspecified server.") hacked_download = 1 else @@ -130,7 +145,7 @@ data["disk_size"] = hard_drive.max_capacity data["disk_used"] = hard_drive.used_capacity var/list/all_entries[0] - for(var/A in SSnetworks.station_network.available_station_software) + for(var/A in main_repo) var/datum/computer_file/program/P = A // Only those programs our user can run will show in the list if(!P.can_run(user,transfer = 1) || hard_drive.find_file_by_name(P.filename)) @@ -143,9 +158,9 @@ "size" = P.size, ))) data["hackedavailable"] = FALSE - if(computer.obj_flags & EMAGGED) // If we are running on emagged computer we have access to some "bonus" software + if(emagged) // If we are running on emagged computer we have access to some "bonus" software var/list/hacked_programs[0] - for(var/S in SSnetworks.station_network.available_antag_software) + for(var/S in antag_repo) var/datum/computer_file/program/P = S if(hard_drive.find_file_by_name(P.filename)) continue @@ -172,3 +187,24 @@ /datum/computer_file/program/ntnetdownload/kill_program(forced) abort_file_download() return ..(forced) + +//////////////////////// +//Syndicate Downloader// +//////////////////////// + +/// This app only lists programs normally found in the emagged section of the normal downloader app + +/datum/computer_file/program/ntnetdownload/syndicate + filename = "syndownloader" + filedesc = "Software Download Tool" + program_icon_state = "generic" + extended_desc = "This program allows downloads of software from shared Syndicate repositories" + requires_ntnet = 0 + ui_header = "downloader_finished.gif" + tgui_id = "NtosNetDownloader" + emagged = TRUE + +/datum/computer_file/program/ntnetdownload/syndicate/run_program() + . = ..() + main_repo = SSnetworks.station_network.available_antag_software + antag_repo = null diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index 9422788afed63..76dd8039e6f79 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -19,10 +19,18 @@ var/list/channel_history = list() var/operator_mode = FALSE // Channel operator mode var/netadmin_mode = FALSE // Administrator mode (invisible to other users + bypasses passwords) + //A list of all the converstations we're a part of + var/list/datum/ntnet_conversation/conversations = list() /datum/computer_file/program/chatclient/New() username = "DefaultUser[rand(100, 999)]" +/datum/computer_file/program/chatclient/Destroy() + for(var/datum/ntnet_conversation/discussion as anything in conversations) + discussion.purge_client(src) + conversations.Cut() + return ..() + /datum/computer_file/program/chatclient/ui_act(action, params) if(..()) return diff --git a/code/modules/modular_computers/file_system/programs/portrait_printer.dm b/code/modules/modular_computers/file_system/programs/portrait_printer.dm new file mode 100644 index 0000000000000..de8fcb1325925 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/portrait_printer.dm @@ -0,0 +1,81 @@ + +///how much paper it takes from the printer to create a canvas. +#define CANVAS_PAPER_COST 10 + +/** + * ## portrait printer! + * + * Program that lets the curator browse all of the portraits in the database + * They are free to print them out as they please. + */ +/datum/computer_file/program/portrait_printer + filename = "PortraitPrinter" + filedesc = "Marlowe Treeby's Art Galaxy" + program_icon_state = "dummy" + extended_desc = "This program connects to a Spinward Sector community art site for viewing and printing art." + transfer_access = ACCESS_LIBRARY + usage_flags = PROGRAM_CONSOLE + requires_ntnet = TRUE + size = 9 + tgui_id = "NtosPortraitPrinter" + +/datum/computer_file/program/portrait_printer/ui_data(mob/user) + var/list/data = list() + data["library"] = SSpersistence.paintings["library"] ? SSpersistence.paintings["library"] : 0 + data["library_secure"] = SSpersistence.paintings["library_secure"] ? SSpersistence.paintings["library_secure"] : 0 + data["library_private"] = SSpersistence.paintings["library_private"] ? SSpersistence.paintings["library_private"] : 0 //i'm gonna regret this, won't i? + return data + +/datum/computer_file/program/portrait_printer/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/simple/portraits/library), + get_asset_datum(/datum/asset/simple/portraits/library_secure), + get_asset_datum(/datum/asset/simple/portraits/library_private) + ) + +/datum/computer_file/program/portrait_printer/ui_act(action, params) + . = ..() + if(.) + return + + //printer check! + var/obj/item/computer_hardware/printer/printer + if(computer) + printer = computer.all_components[MC_PRINT] + if(!printer) + to_chat(usr, "Hardware error: A printer is required to print a canvas.") + return + if(printer.stored_paper < CANVAS_PAPER_COST) + to_chat(usr, "Printing error: Your printer needs at least [CANVAS_PAPER_COST] paper to print a canvas.") + return + printer.stored_paper -= CANVAS_PAPER_COST + + //canvas printing! + var/list/tab2key = list(TAB_LIBRARY = "library", TAB_SECURE = "library_secure", TAB_PRIVATE = "library_private") + var/folder = tab2key[params["tab"]] + var/list/current_list = SSpersistence.paintings[folder] + var/list/chosen_portrait = current_list[params["selected"]] + var/author = chosen_portrait["author"] + var/title = chosen_portrait["title"] + var/png = "data/paintings/[folder]/[chosen_portrait["md5"]].png" + var/icon/art_icon = new(png) + var/obj/item/canvas/printed_canvas + var/art_width = art_icon.Width() + var/art_height = art_icon.Height() + for(var/canvas_type in typesof(/obj/item/canvas)) + printed_canvas = canvas_type + if(initial(printed_canvas.width) == art_width && initial(printed_canvas.height) == art_height) + printed_canvas = new canvas_type(get_turf(computer.physical)) + break + printed_canvas.fill_grid_from_icon(art_icon) + printed_canvas.generated_icon = art_icon + printed_canvas.icon_generated = TRUE + printed_canvas.finalized = TRUE + printed_canvas.painting_name = title + printed_canvas.author_ckey = author + printed_canvas.name = "painting - [title]" + ///this is a copy of something that is already in the database- it should not be able to be saved. + printed_canvas.no_save = TRUE + printed_canvas.update_icon() + to_chat(usr, "You have printed [title] onto a new canvas.") + playsound(computer.physical, 'sound/items/poster_being_created.ogg', 100, TRUE) diff --git a/code/modules/modular_computers/file_system/programs/powermonitor.dm b/code/modules/modular_computers/file_system/programs/powermonitor.dm index 51a41e476fa4f..6482570e26ee8 100644 --- a/code/modules/modular_computers/file_system/programs/powermonitor.dm +++ b/code/modules/modular_computers/file_system/programs/powermonitor.dm @@ -92,7 +92,7 @@ if(istype(A)) data["areas"] += list(list( "name" = A.area.name, - "charge" = A.cell ? A.cell.percent() : 0, + "charge" = A.integration_cog ? 100 : A.cell ? A.cell.percent() : 0, "load" = DisplayPower(A.lastused_total), "charging" = A.charging, "eqp" = A.equipment, diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm new file mode 100644 index 0000000000000..2f7816be7f53a --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/radar.dm @@ -0,0 +1,298 @@ +#define SCAN_COOLDOWN (2 SECONDS) + +/datum/computer_file/program/radar //generic parent that handles most of the process + filename = "genericfinder" + filedesc = "debug_finder" + ui_header = "borg_mon.gif" //DEBUG -- new icon before PR + program_icon_state = "radarntos" + requires_ntnet = TRUE + transfer_access = null + available_on_ntnet = FALSE + usage_flags = PROGRAM_LAPTOP | PROGRAM_TABLET + network_destination = "tracking program" + size = 5 + tgui_id = "NtosRadar" + ///List of trackable entities. Updated by the scan() proc. + var/list/objects + ///Ref of the last trackable object selected by the user in the tgui window. Updated in the ui_act() proc. + var/atom/selected + ///Used to store when the next scan is available. Updated by the scan() proc. + var/next_scan = 0 + ///Used to keep track of the last value program_icon_state was set to, to prevent constant unnecessary update_icon() calls + var/last_icon_state = "" + ///Used by the tgui interface, themed NT or Syndicate. + var/arrowstyle = "ntosradarpointer.png" + ///Used by the tgui interface, themed for NT or Syndicate colors. + var/pointercolor = "green" + COOLDOWN_DECLARE(last_scan) + +/datum/computer_file/program/radar/run_program(mob/living/user) + . = ..() + if(.) + START_PROCESSING(SSfastprocess, src) + return + return FALSE + +/datum/computer_file/program/radar/kill_program(forced = FALSE) + objects = list() + selected = null + STOP_PROCESSING(SSfastprocess, src) + return ..() + +/datum/computer_file/program/radar/Destroy() + STOP_PROCESSING(SSfastprocess, src) + return ..() + +/datum/computer_file/program/radar/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/simple/radar_assets), + ) + +/datum/computer_file/program/radar/ui_data(mob/user) + var/list/data = get_header_data() + data["selected"] = selected + data["objects"] = list() + data["scanning"] = (world.time < next_scan) + for(var/list/i in objects) + var/list/objectdata = list( + ref = i["ref"], + name = i["name"], + ) + data["object"] += list(objectdata) + + data["target"] = list() + var/list/trackinfo = track() + if(trackinfo) + data["target"] = trackinfo + return data + +/datum/computer_file/program/radar/ui_act(action, params) + if(..()) + return + + switch(action) + if("selecttarget") + selected = params["ref"] + if("scan") + scan() + +/** + *Updates tracking information of the selected target. + * + *The track() proc updates the entire set of information about the location + *of the target, including whether the Ntos window should use a pinpointer + *crosshair over the up/down arrows, or none in favor of a rotating arrow + *for far away targets. This information is returned in the form of a list. + * +*/ +/datum/computer_file/program/radar/proc/track() + var/atom/movable/signal = find_atom() + if(!trackable(signal)) + return + + var/turf/here_turf = (get_turf(computer)) + var/turf/target_turf = (get_turf(signal)) + var/userot = FALSE + var/rot = 0 + var/pointer = "crosshairs" + var/locx = (target_turf.x - here_turf.x) + 24 + var/locy = (here_turf.y - target_turf.y) + 24 + + if(get_dist_euclidian(here_turf, target_turf) > 24) + userot = TRUE + rot = round(Get_Angle(here_turf, target_turf)) + else + if(target_turf.z > here_turf.z) + pointer="caret-up" + else if(target_turf.z < here_turf.z) + pointer="caret-down" + + var/list/trackinfo = list( + "locx" = locx, + "locy" = locy, + "userot" = userot, + "rot" = rot, + "arrowstyle" = arrowstyle, + "color" = pointercolor, + "pointer" = pointer, + ) + return trackinfo + +/** + * + *Checks the trackability of the selected target. + * + *If the target is on the computer's Z level, or both are on station Z + *levels, and the target isn't untrackable, return TRUE. + *Arguments: + **arg1 is the atom being evaluated. +*/ +/datum/computer_file/program/radar/proc/trackable(atom/movable/signal) + if(!signal || !computer) + return FALSE + var/turf/here = get_turf(computer) + var/turf/there = get_turf(signal) + if(!here || !there) + return FALSE //I was still getting a runtime even after the above check while scanning, so fuck it + return (there.z == here.z) || (is_station_level(here.z) && is_station_level(there.z)) + +/** + * + *Runs a scan of all the trackable atoms. + * + *Checks each entry in the GLOB of the specific trackable atoms against + *the track() proc, and fill the objects list with lists containing the + *atoms' names and REFs. The objects list is handed to the tgui screen + *for displaying to, and being selected by, the user. A two second + *sleep is used to delay the scan, both for thematical reasons as well + *as to limit the load players may place on the server using these + *somewhat costly loops. +*/ +/datum/computer_file/program/radar/proc/scan() + return + +/** + * + *Finds the atom in the appropriate list that the `selected` var indicates + * + *The `selected` var holds a REF, which is a string. A mob REF may be + *something like "mob_209". In order to find the actual atom, we need + *to search the appropriate list for the REF string. This is dependant + *on the program (Lifeline uses GLOB.human_list, while Fission360 uses + *GLOB.poi_list), but the result will be the same; evaluate the string and + *return an atom reference. +*/ +/datum/computer_file/program/radar/proc/find_atom() + return + +//We use SSfastprocess for the program icon state because it runs faster than process_tick() does. +/datum/computer_file/program/radar/process() + if(computer.active_program != src) + STOP_PROCESSING(SSfastprocess, src) //We're not the active program, it's time to stop. + return + if(!selected) + return + + var/atom/movable/signal = find_atom() + if(!trackable(signal)) + program_icon_state = "[initial(program_icon_state)]lost" + if(last_icon_state != program_icon_state) + computer.update_icon() + last_icon_state = program_icon_state + return + + var/here_turf = get_turf(computer) + var/target_turf = get_turf(signal) + var/trackdistance = get_dist_euclidian(here_turf, target_turf) + switch(trackdistance) + if(0) + program_icon_state = "[initial(program_icon_state)]direct" + if(1 to 12) + program_icon_state = "[initial(program_icon_state)]close" + if(13 to 24) + program_icon_state = "[initial(program_icon_state)]medium" + if(25 to INFINITY) + program_icon_state = "[initial(program_icon_state)]far" + + if(last_icon_state != program_icon_state) + computer.update_icon() + last_icon_state = program_icon_state + computer.setDir(get_dir(here_turf, target_turf)) + +//We can use process_tick to restart fast processing, since the computer will be running this constantly either way. +/datum/computer_file/program/radar/process_tick() + if(computer.active_program == src) + START_PROCESSING(SSfastprocess, src) + +/////////////////// +//Suit Sensor App// +/////////////////// + +///A program that tracks crew members via suit sensors +/datum/computer_file/program/radar/lifeline + filename = "lifeline" + filedesc = "Lifeline" + extended_desc = "This program allows for tracking of crew members via their suit sensors." + requires_ntnet = TRUE + transfer_access = ACCESS_MEDICAL + available_on_ntnet = TRUE + +/datum/computer_file/program/radar/lifeline/find_atom() + return locate(selected) in GLOB.carbon_list //currently we dont have a list of humanoids so this'll have to do + +/datum/computer_file/program/radar/lifeline/scan() + if(!COOLDOWN_FINISHED(src, last_scan)) + return + COOLDOWN_START(src, last_scan, SCAN_COOLDOWN) + objects = list() + for(var/i in GLOB.carbon_list) + var/mob/living/carbon/human/humanoid = i + if(!trackable(humanoid)) + continue + var/crewmember_name = "Unknown" + if(humanoid.wear_id) + var/obj/item/card/id/ID = humanoid.wear_id.GetID() + if(ID?.registered_name) + crewmember_name = ID.registered_name + var/list/crewinfo = list( + ref = REF(humanoid), + name = crewmember_name, + ) + objects += list(crewinfo) + +/datum/computer_file/program/radar/lifeline/trackable(mob/living/carbon/human/humanoid) + if(!humanoid || !istype(humanoid)) + return FALSE + if(..()) + if(humanoid in SSnanites.nanite_monitored_mobs) + if(humanoid.is_jammed()) + return FALSE + return TRUE + if(istype(humanoid.w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/uniform = humanoid.w_uniform + if(uniform.is_jammed()) + return FALSE + if(uniform.has_sensor && uniform.sensor_mode >= SENSOR_COORDS) // Suit sensors must be on maximum + return TRUE + return FALSE + +//////////////////////// +//Nuke Disk Finder App// +//////////////////////// + +///A program that tracks nukes and nuclear accessories +/datum/computer_file/program/radar/fission360 + filename = "fission360" + filedesc = "Fission360" + program_icon_state = "radarsyndicate" + extended_desc = "This program allows for tracking of nuclear authorization disks and warheads." + requires_ntnet = FALSE + transfer_access = null + available_on_ntnet = FALSE + available_on_syndinet = TRUE + tgui_id = "NtosRadarSyndicate" + arrowstyle = "ntosradarpointerS.png" + pointercolor = "red" + +/datum/computer_file/program/radar/fission360/find_atom() + return locate(selected) in GLOB.poi_list + +/datum/computer_file/program/radar/fission360/scan() + if(!COOLDOWN_FINISHED(src, last_scan)) + return + COOLDOWN_START(src, last_scan, SCAN_COOLDOWN) + objects = list() + for(var/i in GLOB.nuke_list) + var/obj/machinery/nuclearbomb/nuke = i + + var/list/nukeinfo = list( + ref = REF(nuke), + name = nuke.name, + ) + objects += list(nukeinfo) + var/obj/item/disk/nuclear/disk = locate() in GLOB.poi_list + var/list/nukeinfo = list( + ref = REF(disk), + name = "Nuke Auth. Disk", + ) + objects += list(nukeinfo) diff --git a/code/modules/modular_computers/file_system/programs/robocontrol.dm b/code/modules/modular_computers/file_system/programs/robocontrol.dm index 1e2496c33f83b..2413ccb62c50a 100644 --- a/code/modules/modular_computers/file_system/programs/robocontrol.dm +++ b/code/modules/modular_computers/file_system/programs/robocontrol.dm @@ -21,7 +21,7 @@ /datum/computer_file/program/robocontrol/ui_data(mob/user) var/list/data = get_header_data() var/turf/current_turf = get_turf(ui_host()) - var/zlevel = current_turf.z + var/zlevel = current_turf.get_virtual_z_level() var/list/botlist = list() var/list/mulelist = list() @@ -38,7 +38,7 @@ for(var/B in GLOB.bots_list) var/mob/living/simple_animal/bot/Bot = B - if(!Bot.on || Bot.z != zlevel || Bot.remote_disabled) //Only non-emagged bots on the same Z-level are detected! + if(!Bot.on || Bot.get_virtual_z_level() != zlevel || Bot.remote_disabled) //Only non-emagged bots on the same Z-level are detected! continue //Also, the PDA must have access to the bot type. var/list/newbot = list("name" = Bot.name, "mode" = Bot.get_mode_ui(), "model" = Bot.model, "locat" = get_area(Bot), "bot_ref" = REF(Bot), "mule_check" = FALSE) if(Bot.bot_type == MULE_BOT) diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm index a7b24129f2d20..12729fc2bc1e6 100644 --- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm @@ -31,24 +31,25 @@ refresh() /datum/computer_file/program/supermatter_monitor/kill_program(forced = FALSE) - active = null + for(var/supermatter in supermatters) + clear_supermatter(supermatter) supermatters = null ..() // Refreshes list of active supermatter crystals /datum/computer_file/program/supermatter_monitor/proc/refresh() + for(var/supermatter in supermatters) + clear_supermatter(supermatter) supermatters = list() var/turf/T = get_turf(ui_host()) if(!T) return for(var/obj/machinery/power/supermatter_crystal/S in GLOB.machines) // Delaminating, not within coverage, not on a tile. - if (!isturf(S.loc) || !(is_station_level(S.z) || is_mining_level(S.z) || S.z == T.z)) + if (!isturf(S.loc) || !(is_station_level(S.z) || is_mining_level(S.z) || S.get_virtual_z_level() == T.get_virtual_z_level())) continue supermatters.Add(S) - - if(!(active in supermatters)) - active = null + RegisterSignal(S, COMSIG_PARENT_QDELETING, .proc/react_to_del) /datum/computer_file/program/supermatter_monitor/proc/get_status() . = SUPERMATTER_INACTIVE @@ -81,13 +82,13 @@ if(air.total_moles()) for(var/gasid in air.get_gases()) gasdata.Add(list(list( - "name"= GLOB.meta_gas_info[gasid][META_GAS_NAME], + "name"= GLOB.gas_data.names[gasid], "amount" = round(100*air.get_moles(gasid)/air.total_moles(),0.01)))) else for(var/gasid in air.get_gases()) gasdata.Add(list(list( - "name"= GLOB.meta_gas_info[gasid][META_GAS_NAME], + "name"= GLOB.gas_data.names[gasid], "amount" = 0))) data["gases"] = gasdata @@ -124,3 +125,13 @@ if(S.uid == newuid) active = S return TRUE + +/datum/computer_file/program/supermatter_monitor/proc/react_to_del(datum/source) + SIGNAL_HANDLER + clear_supermatter(source) + +/datum/computer_file/program/supermatter_monitor/proc/clear_supermatter(matter) + supermatters -= matter + if(matter == active) + active = null + UnregisterSignal(matter, COMSIG_PARENT_QDELETING) diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index 219bd6b1c295e..6d94d6dbfc1cc 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -90,8 +90,9 @@ return // Called when component is removed from PC. -/obj/item/computer_hardware/proc/on_remove(obj/item/modular_computer/M, mob/living/user = null) - try_eject(forced = 1) +/obj/item/computer_hardware/proc/on_remove(obj/item/modular_computer/M, mob/living/user) + if(M.physical || !QDELETED(M)) + try_eject(forced = TRUE) // Called when someone tries to insert something in it - paper in printer, card in card reader, etc. /obj/item/computer_hardware/proc/try_insert(obj/item/I, mob/living/user = null) diff --git a/code/modules/modular_computers/hardware/ai_slot.dm b/code/modules/modular_computers/hardware/ai_slot.dm index 0ad157afcb968..ac6d4db86d2d2 100644 --- a/code/modules/modular_computers/hardware/ai_slot.dm +++ b/code/modules/modular_computers/hardware/ai_slot.dm @@ -6,13 +6,14 @@ w_class = WEIGHT_CLASS_SMALL device_type = MC_AI - var/obj/item/aicard/stored_card = null + var/obj/item/aicard/stored_card var/locked = FALSE -/obj/item/computer_hardware/ai_slot/handle_atom_del(atom/A) +///What happens when the intellicard is removed (or deleted) from the module, through try_eject() or not. +/obj/item/computer_hardware/ai_slot/Exited(atom/A, atom/newloc) if(A == stored_card) - try_eject(0, null, TRUE) - . = ..() + stored_card = null + return ..() /obj/item/computer_hardware/ai_slot/examine(mob/user) . = ..() @@ -20,10 +21,10 @@ . += "There appears to be an intelliCard loaded. There appears to be a pinhole protecting a manual eject button. A screwdriver could probably press it." /obj/item/computer_hardware/ai_slot/on_install(obj/item/modular_computer/M, mob/living/user = null) - M.add_verb(device_type) + M.add_computer_verbs(device_type) /obj/item/computer_hardware/ai_slot/on_remove(obj/item/modular_computer/M, mob/living/user = null) - M.remove_verb(device_type) + M.remove_computer_verbs(device_type) /obj/item/computer_hardware/ai_slot/try_insert(obj/item/I, mob/living/user = null) if(!holder) @@ -60,7 +61,6 @@ user.put_in_hands(stored_card) else stored_card.forceMove(drop_location()) - stored_card = null return TRUE return FALSE diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm index 091dc03953c92..5df4d8afa5d80 100644 --- a/code/modules/modular_computers/hardware/battery_module.dm +++ b/code/modules/modular_computers/hardware/battery_module.dm @@ -4,22 +4,23 @@ icon_state = "cell_con" critical = 1 malfunction_probability = 1 - var/obj/item/stock_parts/cell/battery = null + var/obj/item/stock_parts/cell/battery device_type = MC_CELL -/obj/item/computer_hardware/battery/New(loc, battery_type = null) +/obj/item/computer_hardware/battery/Initialize(mapload, battery_type) + . = ..() if(battery_type) battery = new battery_type(src) - ..() /obj/item/computer_hardware/battery/Destroy() - . = ..() QDEL_NULL(battery) + return ..() -/obj/item/computer_hardware/battery/handle_atom_del(atom/A) +///What happens when the battery is removed (or deleted) from the module, through try_eject() or not. +/obj/item/computer_hardware/battery/Exited(atom/A, atom/newloc) if(A == battery) try_eject(0, null, TRUE) - . = ..() + return ..() /obj/item/computer_hardware/battery/try_insert(obj/item/I, mob/living/user = null) if(!holder) @@ -52,23 +53,11 @@ else if(user) user.put_in_hands(battery) + to_chat(user, "You detach \the [battery] from \the [src].") else battery.forceMove(drop_location()) - to_chat(user, "You detach \the [battery] from \the [src].") - battery = null - - if(holder) - if(holder.enabled && !holder.use_power()) - holder.shutdown_computer() - return TRUE - - - - - - /obj/item/stock_parts/cell/computer name = "standard battery" desc = "A standard power cell, commonly seen in high-end portable microcomputers or low-end laptops." @@ -77,7 +66,6 @@ w_class = WEIGHT_CLASS_TINY maxcharge = 750 - /obj/item/stock_parts/cell/computer/advanced name = "advanced battery" desc = "An advanced power cell, often used in most laptops. It is too large to be fitted into smaller devices." diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm index 776f0d1bdd2df..278b74b27014b 100644 --- a/code/modules/modular_computers/hardware/card_slot.dm +++ b/code/modules/modular_computers/hardware/card_slot.dm @@ -6,15 +6,27 @@ w_class = WEIGHT_CLASS_TINY device_type = MC_CARD - var/obj/item/card/id/stored_card = null - var/obj/item/card/id/stored_card2 = null - -/obj/item/computer_hardware/card_slot/handle_atom_del(atom/A) - if(A == stored_card) - try_eject(1, null, TRUE) - if(A == stored_card2) - try_eject(2, null, TRUE) - . = ..() + var/obj/item/card/id/stored_card + var/obj/item/card/id/stored_card2 + +/obj/item/computer_hardware/card_slot/Exited(atom/A, atom/newloc) + if(!(A == stored_card || A == stored_card2)) + return ..() + if(holder) + if(holder.active_program) + holder.active_program.event_idremoved(0) + for(var/p in holder.idle_threads) + var/datum/computer_file/program/computer_program = p + computer_program.event_idremoved(1) + + holder.update_slot_icon() + + if(!ishuman(holder.loc)) + return ..() + var/mob/living/carbon/human/human_wearer = holder.loc + if(human_wearer.wear_id == holder) + human_wearer.sec_hud_set_ID() + return ..() /obj/item/computer_hardware/card_slot/Destroy() try_eject() @@ -37,10 +49,10 @@ return ..() /obj/item/computer_hardware/card_slot/on_install(obj/item/modular_computer/M, mob/living/user = null) - M.add_verb(device_type) + M.add_computer_verbs(device_type) /obj/item/computer_hardware/card_slot/on_remove(obj/item/modular_computer/M, mob/living/user = null) - M.remove_verb(device_type) + M.remove_computer_verbs(device_type) /obj/item/computer_hardware/card_slot/try_insert(obj/item/I, mob/living/user = null) if(!holder) diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index e03ace05a5e86..c71d79edd0977 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -117,7 +117,7 @@ return null /obj/item/computer_hardware/hard_drive/Destroy() - stored_files = null + QDEL_LIST(stored_files) return ..() /obj/item/computer_hardware/hard_drive/Initialize() @@ -166,6 +166,17 @@ max_capacity = 70 var/datum/antagonist/traitor/traitor_data // Syndicate hard drive has the user's data baked directly into it on creation +/// For tablets given to nuke ops +/obj/item/computer_hardware/hard_drive/small/nukeops + power_usage = 8 + max_capacity = 70 + +/obj/item/computer_hardware/hard_drive/small/nukeops/install_default_programs() + store_file(new/datum/computer_file/program/computerconfig(src)) + store_file(new/datum/computer_file/program/ntnetdownload/syndicate(src)) // Syndicate version; automatic access to syndicate apps and no NT apps + store_file(new/datum/computer_file/program/filemanager(src)) + store_file(new/datum/computer_file/program/radar/fission360(src)) //I am legitimately afraid if I don't do this, Ops players will think they just don't get a pinpointer anymore. + /obj/item/computer_hardware/hard_drive/micro name = "micro solid state drive" desc = "A highly efficient SSD chip for portable devices." diff --git a/code/modules/modular_computers/hardware/portable_disk.dm b/code/modules/modular_computers/hardware/portable_disk.dm index b5a957be04a8d..47fbccd5f2709 100644 --- a/code/modules/modular_computers/hardware/portable_disk.dm +++ b/code/modules/modular_computers/hardware/portable_disk.dm @@ -9,11 +9,11 @@ device_type = MC_SDD /obj/item/computer_hardware/hard_drive/portable/on_install(obj/item/modular_computer/M, mob/living/user = null) - M.add_verb(device_type) + M.add_computer_verbs(device_type) /obj/item/computer_hardware/hard_drive/portable/on_remove(obj/item/modular_computer/M, mob/living/user = null) ..() - M.remove_verb(device_type) + M.remove_computer_verbs(device_type) /obj/item/computer_hardware/hard_drive/portable/install_default_programs() return // Empty by default diff --git a/code/modules/modular_computers/hardware/printer.dm b/code/modules/modular_computers/hardware/printer.dm index 1261f55bca1d4..90ea215d5f210 100644 --- a/code/modules/modular_computers/hardware/printer.dm +++ b/code/modules/modular_computers/hardware/printer.dm @@ -17,12 +17,18 @@ . += "Paper level: [stored_paper]/[max_paper]." -/obj/item/computer_hardware/printer/proc/print_text(var/text_to_print, var/paper_title = "") +/obj/item/computer_hardware/printer/proc/can_print() if(!stored_paper) return FALSE if(!check_functionality()) return FALSE + return TRUE + +/obj/item/computer_hardware/printer/proc/print_text(text_to_print, paper_title = "") + if(!can_print()) + return FALSE + var/obj/item/paper/P = new/obj/item/paper(holder.drop_location()) // Damaged printer causes the resulting paper to be somewhat harder to read. @@ -34,7 +40,30 @@ P.name = paper_title P.update_icon() stored_paper-- - P = null + + return TRUE + +/obj/item/computer_hardware/printer/proc/print_type(type_to_print, paper_title, do_malfunction = FALSE) + if(!can_print()) + return FALSE + if(!ispath(type_to_print, /obj)) + return FALSE + + var/obj/O = new type_to_print(holder.drop_location()) + + if(istype(O, /obj/item/paper)) + var/obj/item/paper/P = O + // Damaged printer causes the resulting paper to be somewhat harder to read. + if(do_malfunction && damage > damage_malfunction) + P.info = stars(P.info, 100-malfunction_probability) + // From the stars definition: + // This proc is dangerously laggy, avoid it or die + // Because of this, malfunction is disabled by default for this, since we might be printing big things + if(paper_title) + P.name = paper_title + + stored_paper-- + return TRUE /obj/item/computer_hardware/printer/try_insert(obj/item/I, mob/living/user = null) diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index bd9a488affb7b..d97d1499159da 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -47,6 +47,7 @@ dev_apc_recharger = 0 dev_printer = 0 dev_card = 0 + ui_update() // Recalculates the price and optionally even fabricates the device. /obj/machinery/lapvend/proc/fabricate_and_recalc_price(fabricate = FALSE) @@ -112,6 +113,7 @@ if(fabricate) fabricated_laptop.install_component(new /obj/item/computer_hardware/card_slot) + ui_update() return total_price else if(devtype == 2) // Tablet, more expensive, not everyone could probably afford this. var/obj/item/computer_hardware/battery/battery_module = null @@ -162,7 +164,9 @@ total_price += 199 if(fabricate) fabricated_tablet.install_component(new/obj/item/computer_hardware/card_slot) + ui_update() return total_price + ui_update() return FALSE @@ -247,12 +251,14 @@ credits += c.value visible_message("[user] inserts [c.value] credits into [src].") qdel(c) + ui_update() return 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].") qdel(HC) + ui_update() return else if(istype(I, /obj/item/card/id)) if(state != 2) @@ -264,7 +270,8 @@ say("Insufficient money on card to purchase!") return credits += target_credits - say("$[target_credits] has been desposited from your account.") + say("$[target_credits] has been deposited from your account.") + ui_update() return return ..() @@ -311,5 +318,7 @@ say("Enjoy your new product!") state = 3 addtimer(CALLBACK(src, .proc/reset_order), 100) + ui_update() return TRUE + ui_update() return FALSE diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index 81425b69573f7..094f5d0891faf 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -18,7 +18,7 @@ slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT sharpness = IS_SHARP max_integrity = 200 - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE var/datum/effect_system/spark_spread/spark_system var/datum/action/innate/dash/ninja/jaunt var/dash_toggled = TRUE @@ -82,7 +82,7 @@ if(user.put_in_hands(src)) msg = "Your Energy Katana teleports into your hand!" - else if(user.equip_to_slot_if_possible(src, SLOT_BELT, 0, 1, 1)) + else if(user.equip_to_slot_if_possible(src, ITEM_SLOT_BELT, 0, 1, 1)) msg = "Your Energy Katana teleports back to you, sheathing itself as it does so!" else msg = "Your Energy Katana teleports to your location!" diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm index c60d6b93fd384..36bc563a7caf8 100644 --- a/code/modules/ninja/ninja_event.dm +++ b/code/modules/ninja/ninja_event.dm @@ -15,6 +15,7 @@ Contents: max_occurrences = 1 earliest_start = 40 MINUTES min_players = 15 + dynamic_should_hijack = TRUE /datum/round_event/ghost_role/ninja var/success_spawn = 0 diff --git a/code/modules/ninja/outfit.dm b/code/modules/ninja/outfit.dm index ad63f55b905ee..dde8c417da0ce 100644 --- a/code/modules/ninja/outfit.dm +++ b/code/modules/ninja/outfit.dm @@ -11,7 +11,7 @@ back = /obj/item/tank/jetpack/carbondioxide l_pocket = /obj/item/grenade/plastic/x4 r_pocket = /obj/item/tank/internals/emergency_oxygen - internals_slot = SLOT_R_STORE + internals_slot = ITEM_SLOT_RPOCKET belt = /obj/item/energy_katana implants = list(/obj/item/implant/explosive) diff --git a/code/modules/ninja/suit/head.dm b/code/modules/ninja/suit/head.dm index a62f871f56fe5..1b06200084dcd 100644 --- a/code/modules/ninja/suit/head.dm +++ b/code/modules/ninja/suit/head.dm @@ -5,8 +5,8 @@ name = "ninja hood" icon_state = "s-ninja" item_state = "s-ninja_mask" - armor = list("melee" = 60, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 25, "fire" = 100, "acid" = 100) + armor = list("melee" = 60, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 25, "fire" = 100, "acid" = 100, "stamina" = 60) strip_delay = 12 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF blockTracking = 1//Roughly the only unique thing about this helmet. - flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR \ No newline at end of file + flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR 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 8b8e41793eb18..5e4d4df184dd2 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 @@ -18,9 +18,9 @@ It is possible to destroy the net by the occupant or someone else. can_buckle = 1 buckle_lying = 0 buckle_prevents_pull = TRUE - var/mob/living/carbon/affecting//Who it is currently affecting, if anyone. - var/mob/living/carbon/master//Who shot web. Will let this person know if the net was successful or failed. - var/check = 15//30 seconds before teleportation. Could be extended I guess. + var/mob/living/carbon/affecting //Who it is currently affecting, if anyone. + var/mob/living/carbon/master //Who shot web. Will let this person know if the net was successful or failed. + var/check = 30 // seconds before teleportation. Could be extended I guess. var/success = FALSE @@ -39,13 +39,13 @@ It is possible to destroy the net by the occupant or someone else. to_chat(master, "ERROR: unable to initiate transport protocol. Procedure terminated.") return ..() -/obj/structure/energy_net/process() +/obj/structure/energy_net/process(delta_time) if(QDELETED(affecting)||affecting.loc!=loc) qdel(src)//Get rid of the net. return - if(check>0) - check-- + if(check > 0) + check -= delta_time return success = TRUE @@ -79,7 +79,7 @@ It is possible to destroy the net by the occupant or someone else. /obj/structure/energy_net/attack_paw(mob/user) return attack_hand() -/obj/structure/energy_net/user_buckle_mob(mob/living/M, mob/living/user) +/obj/structure/energy_net/user_buckle_mob(mob/living/M, mob/living/user, check_loc = TRUE) return//We only want our target to be buckled /obj/structure/energy_net/user_unbuckle_mob(mob/living/buckled_mob, mob/living/user) diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm index dab45c1d93030..32ba16d8d3dd3 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm @@ -17,7 +17,7 @@ H.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!"), forced = "ninjaboost") a_boost-- to_chat(H, "There are [a_boost] adrenaline boosts remaining.") - s_coold = 3 + s_coold = 6 addtimer(CALLBACK(src, .proc/ninjaboost_after), 70) /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost_after() diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm index ea96c1cdf6121..3d77ac911cbb0 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm @@ -7,4 +7,4 @@ var/mob/living/carbon/human/H = affecting playsound(H.loc, 'sound/effects/empulse.ogg', 60, 2) empulse(H, 4, 6) //Procs sure are nice. Slightly weaker than wizard's disable tch. - s_coold = 2 + s_coold = 4 diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm index 3c19162048c15..2f4954928a31d 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm @@ -11,4 +11,4 @@ playsound(H.loc, 'sound/effects/bamf.ogg', 50, 2) s_bombs-- to_chat(H, "There are [s_bombs] smoke bombs remaining.") - s_coold = 1 + s_coold = 2 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 31ac62d9fc59f..bde181262f7c4 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" = 180, "fall_chance" = 0) diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm index 1b935a00de11f..f59f8a22ab0d6 100644 --- a/code/modules/ninja/suit/shoes.dm +++ b/code/modules/ninja/suit/shoes.dm @@ -7,7 +7,7 @@ permeability_coefficient = 0.01 clothing_flags = NOSLIP resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - armor = list("melee" = 60, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 100, "acid" = 100) + armor = list("melee" = 60, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 100, "acid" = 100, "stamina" = 60) strip_delay = 120 cold_protection = FEET min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index fe696984a001a..d79742c99fe7c 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -19,7 +19,7 @@ Contents: 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/stock_parts/cell) slowdown = 1 resistance_flags = LAVA_PROOF | ACID_PROOF - armor = list("melee" = 60, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 100, "acid" = 100) + armor = list("melee" = 60, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 100, "acid" = 100, "stamina" = 60) strip_delay = 12 actions_types = list(/datum/action/item_action/initialize_ninja_suit, /datum/action/item_action/ninjasmoke, /datum/action/item_action/ninjaboost, /datum/action/item_action/ninjapulse, /datum/action/item_action/ninjastar, /datum/action/item_action/ninjanet, /datum/action/item_action/ninja_sword_recall, /datum/action/item_action/ninja_stealth, /datum/action/item_action/toggle_glove) @@ -40,8 +40,8 @@ Contents: //Main function variables. var/s_initialized = 0//Suit starts off. var/s_coold = 0//If the suit is on cooldown. Can be used to attach different cooldowns to abilities. Ticks down every second based on suit ntick(). - var/s_cost = 5//Base energy cost each ntick. - var/s_acost = 25//Additional cost for additional powers active. + var/s_cost = 2.5//Base energy cost each ntick. + var/s_acost = 12.5//Additional cost for additional powers active. var/s_delay = 40//How fast the suit does certain things, lower is faster. Can be overridden in specific procs. Also determines adverse probability. var/a_transfer = 20//How much radium is used per adrenaline boost. var/a_maxamount = 7//Maximum number of adrenaline boosts. @@ -76,18 +76,25 @@ Contents: cell.name = "black power cell" cell.icon_state = "bscell" +/obj/item/clothing/suit/space/space_ninja/Destroy() + QDEL_NULL(spark_system) + QDEL_NULL(cell) + return ..() + //Simply deletes all the attachments and self, killing all related procs. /obj/item/clothing/suit/space/space_ninja/proc/terminate() qdel(n_hood) qdel(n_gloves) qdel(n_shoes) + if(energyKatana) + energyKatana.visible_message("[src] flares and then turns to dust!") + qdel(energyKatana) qdel(src) - //Randomizes suit parameters. /obj/item/clothing/suit/space/space_ninja/proc/randomize_param() - s_cost = rand(1,20) - s_acost = rand(20,100) + s_cost = rand(1,10) + s_acost = rand(10,50) s_delay = rand(10,100) s_bombs = rand(5,20) a_boost = rand(1,7) @@ -151,10 +158,10 @@ Contents: . = .() if(s_initialized) if(user == affecting) - . += {"All systems operational. Current energy capacity: [DisplayEnergy(cell.charge)].\n - The CLOAK-tech device is [stealth?"active":"inactive"].\n - There are [s_bombs] smoke bomb\s remaining.\n - There are [a_boost] adrenaline booster\s remaining."} + . += "All systems operational. Current energy capacity: [DisplayEnergy(cell.charge)].\n"+\ + "The CLOAK-tech device is [stealth?"active":"inactive"].\n"+\ + "There are [s_bombs] smoke bomb\s remaining.\n"+\ + "There are [a_boost] adrenaline booster\s remaining." /obj/item/clothing/suit/space/space_ninja/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/initialize_ninja_suit)) diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 23dc550f3be8a..be70a353bb728 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -1,3 +1,6 @@ +/** + * Clipboard + */ /obj/item/clipboard name = "clipboard" icon = 'icons/obj/bureaucracy.dmi' @@ -7,8 +10,16 @@ w_class = WEIGHT_CLASS_SMALL throw_speed = 3 throw_range = 7 - var/obj/item/pen/haspen //The stored pen. - var/obj/item/paper/toppaper //The topmost piece of paper. + var/obj/item/pen/pen //The stored pen. + var/integrated_pen = FALSE //Is the pen integrated? + /** + * Weakref of the topmost piece of paper + * + * This is used for the paper displayed on the clipboard's icon + * and it is the one attacked, when attacking the clipboard. + * (As you can't organise contents directly in BYOND) + */ + var/datum/weakref/toppaper_ref slot_flags = ITEM_SLOT_BELT resistance_flags = FLAMMABLE @@ -21,108 +32,144 @@ . = ..() /obj/item/clipboard/Destroy() - QDEL_NULL(haspen) - QDEL_NULL(toppaper) //let movable/Destroy handle the rest + QDEL_NULL(pen) return ..() +/obj/item/clipboard/examine() + . = ..() + if(!integrated_pen && pen) + . += "Alt-click to remove [pen]." + var/obj/item/paper/toppaper = toppaper_ref?.resolve() + if(toppaper) + . += "Right-click to remove [toppaper]." + +/// Take out the topmost paper +/obj/item/clipboard/proc/remove_paper(obj/item/paper/paper, mob/user) + if(!istype(paper)) + return + paper.forceMove(user.loc) + user.put_in_hands(paper) + to_chat(user, "You remove [paper] from [src].") + var/obj/item/paper/toppaper = toppaper_ref?.resolve() + if(paper == toppaper) + toppaper_ref = null + var/obj/item/paper/newtop = locate(/obj/item/paper) in src + if(newtop && (newtop != paper)) + toppaper_ref = WEAKREF(newtop) + else + toppaper_ref = null + update_icon() + +/obj/item/clipboard/proc/remove_pen(mob/user) + pen.forceMove(user.loc) + user.put_in_hands(pen) + to_chat(user, "You remove [pen] from [src].") + pen = null + update_icon() + +/obj/item/clipboard/AltClick(mob/user) + ..() + if(pen) + remove_pen(user) + /obj/item/clipboard/update_icon() cut_overlays() var/list/dat = list() + var/obj/item/paper/toppaper = toppaper_ref?.resolve() if(toppaper) dat += toppaper.icon_state dat += toppaper.overlays.Copy() - if(haspen) + if(pen) dat += "clipboard_pen" dat += "clipboard_over" add_overlay(dat) - -/obj/item/clipboard/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/paper)) - if(!user.transferItemToLoc(W, src)) +/obj/item/clipboard/attackby(obj/item/weapon, mob/user, params) + var/obj/item/paper/toppaper = toppaper_ref?.resolve() + if(istype(weapon, /obj/item/paper)) + //Add paper into the clipboard + if(!user.transferItemToLoc(weapon, src)) + return + toppaper_ref = WEAKREF(weapon) + to_chat(user, "You clip [weapon] onto [src].") + else if(istype(weapon, /obj/item/pen) && !pen) + //Add a pen into the clipboard, attack (write) if there is already one + if(!usr.transferItemToLoc(weapon, src)) return - toppaper = W - to_chat(user, "You clip the paper onto \the [src].") - update_icon() + pen = weapon + to_chat(usr, "You slot [weapon] into [src].") else if(toppaper) toppaper.attackby(user.get_active_held_item(), user) - update_icon() - + update_icon() /obj/item/clipboard/attack_self(mob/user) - var/dat = "Clipboard" - if(haspen) - dat += "Remove Pen

" - else - dat += "Add Pen

" - - //The topmost paper. You can't organise contents directly in byond, so this is what we're stuck with. -Pete - if(toppaper) - var/obj/item/paper/P = toppaper - dat += "Write Remove - [P.name]

" - - for(P in src) - if(P == toppaper) - continue - dat += "Write Remove Move to top - [P.name]
" - user << browse(dat, "window=clipboard") - onclose(user, "clipboard") + ui_interact(user) add_fingerprint(usr) +/obj/item/clipboard/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Clipboard") + ui.open() -/obj/item/clipboard/Topic(href, href_list) - ..() - if(usr.stat || usr.restrained()) +/obj/item/clipboard/ui_data(mob/user) + // prepare data for TGUI + var/list/data = list() + data["pen"] = "[pen]" + + var/obj/item/paper/toppaper = toppaper_ref?.resolve() + data["top_paper"] = "[toppaper]" + data["top_paper_ref"] = "[REF(toppaper)]" + + data["paper"] = list() + data["paper_ref"] = list() + for(var/obj/item/paper/paper in src) + if(paper == toppaper) + continue + data["paper"] += "[paper]" + data["paper_ref"] += "[REF(paper)]" + + return data + +/obj/item/clipboard/ui_act(action, params) + . = ..() + if(.) + return + + if(usr.stat != CONSCIOUS || usr.restrained()) return - if(usr.contents.Find(src)) - - if(href_list["pen"]) - if(haspen) - haspen.forceMove(usr.loc) - usr.put_in_hands(haspen) - haspen = null - - if(href_list["addpen"]) - if(!haspen) - var/obj/item/held = usr.get_active_held_item() - if(istype(held, /obj/item/pen)) - var/obj/item/pen/W = held - if(!usr.transferItemToLoc(W, src)) - return - haspen = W - to_chat(usr, "You slot [W] into [src].") - - if(href_list["write"]) - var/obj/item/P = locate(href_list["write"]) in src - if(istype(P)) - if(usr.get_active_held_item()) - P.attackby(usr.get_active_held_item(), usr) - - if(href_list["remove"]) - var/obj/item/P = locate(href_list["remove"]) in src - if(istype(P)) - P.forceMove(usr.loc) - usr.put_in_hands(P) - if(P == toppaper) - toppaper = null - var/obj/item/paper/newtop = locate(/obj/item/paper) in src - if(newtop && (newtop != P)) - toppaper = newtop - else - toppaper = null - - if(href_list["read"]) - var/obj/item/paper/P = locate(href_list["read"]) in src - if(istype(P)) - usr.examinate(P) - - if(href_list["top"]) - var/obj/item/P = locate(href_list["top"]) in src - if(istype(P)) - toppaper = P - to_chat(usr, "You move [P.name] to the top.") - - //Update everything - attack_self(usr) - update_icon() + switch(action) + // Take the pen out + if("remove_pen") + if(pen) + remove_pen(usr) + . = TRUE + // Take paper out + if("remove_paper") + var/obj/item/paper/paper = locate(params["ref"]) in src + if(istype(paper)) + remove_paper(paper, usr) + . = TRUE + // Look at (or edit) the paper + if("edit_paper") + var/obj/item/paper/paper = locate(params["ref"]) in src + if(istype(paper)) + paper.ui_interact(usr) + update_icon() + . = TRUE + // Move paper to the top + if("move_top_paper") + var/obj/item/paper/paper = locate(params["ref"]) in src + if(istype(paper)) + toppaper_ref = WEAKREF(paper) + to_chat(usr, "You move [paper] to the top.") + update_icon() + . = TRUE + // Rename the paper (it's a verb) + if("rename_paper") + var/obj/item/paper/paper = locate(params["ref"]) in src + if(istype(paper)) + paper.rename() + update_icon() + . = TRUE diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index c9d0e6af1dccb..a685ee5c05cce 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -125,7 +125,7 @@ var/obj/item/paper/P = new /obj/item/paper(src) P.info = "
Security Record

" P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]]
\nSex: [G.fields["sex"]]
\nAge: [G.fields["age"]]
\nFingerprint: [G.fields["fingerprint"]]
\nPhysical Status: [G.fields["p_stat"]]
\nMental Status: [G.fields["m_stat"]]
" - P.info += "
\n
Security Data

\nCriminal Status: [S.fields["criminal"]]
\n
\nMinor Crimes: [S.fields["mi_crim"]]
\nDetails: [S.fields["mi_crim_d"]]
\n
\nMajor Crimes: [S.fields["ma_crim"]]
\nDetails: [S.fields["ma_crim_d"]]
\n
\nImportant Notes:
\n\t[S.fields["notes"]]
\n
\n
Comments/Log

" + P.info += "
\n
Security Data

\nCriminal Status: [S.fields["criminal"]]
\n
\nCrimes: [S.fields["crim"]]
\nDetails: [S.fields["crim_d"]]
\n
\nImportant Notes:
\n\t[S.fields["notes"]]
\n
\n
Comments/Log

" var/counter = 1 while(S.fields["com_[counter]"]) P.info += "[S.fields["com_[counter]"]]
" diff --git a/code/modules/paperwork/folder_premade.dm b/code/modules/paperwork/folder_premade.dm new file mode 100644 index 0000000000000..52f2f828ad8b1 --- /dev/null +++ b/code/modules/paperwork/folder_premade.dm @@ -0,0 +1,55 @@ +/obj/item/folder/blue + desc = "A blue folder." + icon_state = "folder_blue" + bg_color = "#355e9f" + +/obj/item/folder/red + desc = "A red folder." + icon_state = "folder_red" + bg_color = "#b5002e" + +/obj/item/folder/yellow + desc = "A yellow folder." + icon_state = "folder_yellow" + bg_color = "#b88f3d" + +/obj/item/folder/white + desc = "A white folder." + icon_state = "folder_white" + bg_color = "#d9d9d9" + +/obj/item/folder/documents + name = "folder- 'TOP SECRET'" + desc = "A folder stamped \"Top Secret - Property of Nanotrasen Corporation. Unauthorized distribution is punishable by death.\"" + +/obj/item/folder/documents/Initialize() + . = ..() + new /obj/item/documents/nanotrasen(src) + update_icon() + +/obj/item/folder/syndicate + icon_state = "folder_syndie" + bg_color = "#3f3f3f" + name = "folder- 'TOP SECRET'" + desc = "A folder stamped \"Top Secret - Property of The Syndicate.\"" + +/obj/item/folder/syndicate/red + icon_state = "folder_sred" + +/obj/item/folder/syndicate/red/Initialize() + . = ..() + new /obj/item/documents/syndicate/red(src) + update_icon() + +/obj/item/folder/syndicate/blue + icon_state = "folder_sblue" + +/obj/item/folder/syndicate/blue/Initialize() + . = ..() + new /obj/item/documents/syndicate/blue(src) + update_icon() + +/obj/item/folder/syndicate/mining/Initialize() + . = ..() + new /obj/item/documents/syndicate/mining(src) + update_icon() diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 4181762299190..22fd13a0eb159 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -6,119 +6,112 @@ w_class = WEIGHT_CLASS_SMALL pressure_resistance = 2 resistance_flags = FLAMMABLE + /// The background color for tgui in hex (with a `#`) + var/bg_color = "#7f7f7f" /obj/item/folder/suicide_act(mob/living/user) user.visible_message("[user] begins filing an imaginary death warrant! It looks like [user.p_theyre()] trying to commit suicide!") return OXYLOSS -/obj/item/folder/blue - desc = "A blue folder." - icon_state = "folder_blue" +/obj/item/folder/Initialize() + update_icon() + . = ..() + +/obj/item/folder/Destroy() + for(var/obj/important_thing in contents) + if(!(important_thing.resistance_flags & INDESTRUCTIBLE)) + continue + important_thing.forceMove(drop_location()) //don't destroy round critical content such as objective documents. + return ..() -/obj/item/folder/red - desc = "A red folder." - icon_state = "folder_red" +/obj/item/folder/examine() + . = ..() + if(contents) + . += "Alt-click to remove [contents[1]]." -/obj/item/folder/yellow - desc = "A yellow folder." - icon_state = "folder_yellow" +/obj/item/folder/proc/rename(mob/user) + if(!user.is_literate()) + to_chat(user, "You scribble illegibly on the cover of [src]!") + return -/obj/item/folder/white - desc = "A white folder." - icon_state = "folder_white" + var/inputvalue = stripped_input(user, "What would you like to label the folder?", "Folder Labelling", null, MAX_NAME_LEN) + if(!inputvalue) + return -/obj/item/folder/update_icon() - cut_overlays() - if(contents.len) - add_overlay("folder_paper") + if(user.canUseTopic(src, BE_CLOSE)) + name = "folder[(inputvalue ? " - '[inputvalue]'" : null)]" +/obj/item/folder/proc/remove_item(obj/item/I, mob/user) + if(istype(I)) + I.forceMove(user.loc) + user.put_in_hands(I) + to_chat(user, "You remove [I] from [src].") + update_icon() + ui_update() + +/obj/item/folder/AltClick(mob/user) + ..() + if(contents) + remove_item(contents[1], user) + +/obj/item/folder/update_overlays() + . = ..() + if(LAZYLEN(contents)) + . += "folder_paper" /obj/item/folder/attackby(obj/item/W, mob/user, params) if(burn_paper_product_attackby_check(W, user)) return if(istype(W, /obj/item/paper) || istype(W, /obj/item/photo) || istype(W, /obj/item/documents)) + //Add paper, photo or documents into the folder if(!user.transferItemToLoc(W, src)) return to_chat(user, "You put [W] into [src].") update_icon() + ui_update() else if(istype(W, /obj/item/pen)) - if(!user.is_literate()) - to_chat(user, "You scribble illegibly on the cover of [src]!") - return - - var/inputvalue = stripped_input(user, "What would you like to label the folder?", "Folder Labelling", max_length=MAX_NAME_LEN) - - if(!inputvalue) - return - - if(user.canUseTopic(src, BE_CLOSE)) - name = "folder[(inputvalue ? " - '[inputvalue]'" : null)]" - - -/obj/item/folder/attack_self(mob/user) - var/dat = "[name]" - - for(var/obj/item/I in src) - dat += "Remove - [I.name]
" - user << browse(dat, "window=folder") - onclose(user, "folder") - add_fingerprint(usr) - - -/obj/item/folder/Topic(href, href_list) - ..() - if(usr.stat || usr.restrained()) + rename(user) + ui_update() + +/obj/item/folder/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Folder") + ui.open() + +/obj/item/folder/ui_data(mob/user) + var/list/data = list() + if(istype(src, /obj/item/folder/syndicate)) + data["theme"] = "syndicate" + data["bg_color"] = "[bg_color]" + data["folder_name"] = "[name]" + + data["contents"] = list() + data["contents_ref"] = list() + for(var/content in src) + data["contents"] += "[content]" + data["contents_ref"] += "[REF(content)]" + + return data + +/obj/item/folder/ui_act(action, params) + . = ..() + if(.) return - if(usr.contents.Find(src)) - - if(href_list["remove"]) - var/obj/item/I = locate(href_list["remove"]) in src - if(istype(I)) - I.forceMove(usr.loc) - usr.put_in_hands(I) + if(usr.incapacitated()) + return - if(href_list["read"]) - var/obj/item/I = locate(href_list["read"]) in src + switch(action) + // Take item out + if("remove") + var/obj/item/I= locate(params["ref"]) in src + remove_item(I, usr) + . = TRUE + // Inspect the item + if("examine") + var/obj/item/I = locate(params["ref"]) in src if(istype(I)) usr.examinate(I) - - //Update everything - attack_self(usr) - update_icon() - -/obj/item/folder/documents - name = "folder- 'TOP SECRET'" - desc = "A folder stamped \"Top Secret - Property of Nanotrasen Corporation. Unauthorized distribution is punishable by death.\"" - -/obj/item/folder/documents/Initialize() - . = ..() - new /obj/item/documents/nanotrasen(src) - update_icon() - -/obj/item/folder/syndicate - icon_state = "folder_syndie" - name = "folder- 'TOP SECRET'" - desc = "A folder stamped \"Top Secret - Property of The Syndicate.\"" - -/obj/item/folder/syndicate/red - icon_state = "folder_sred" - -/obj/item/folder/syndicate/red/Initialize() - . = ..() - new /obj/item/documents/syndicate/red(src) - update_icon() - -/obj/item/folder/syndicate/blue - icon_state = "folder_sblue" - -/obj/item/folder/syndicate/blue/Initialize() - . = ..() - new /obj/item/documents/syndicate/blue(src) - update_icon() - -/obj/item/folder/syndicate/mining/Initialize() - . = ..() - new /obj/item/documents/syndicate/mining(src) - update_icon() + . = TRUE diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 93912c676b791..622bfea4d1fe9 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -120,7 +120,7 @@ H.update_damage_hud() return var/n_name = stripped_input(usr, "What would you like to label the paper?", "Paper Labelling", null, MAX_NAME_LEN) - if((loc == usr && usr.stat == CONSCIOUS)) + if(((loc == usr || istype(loc, /obj/item/clipboard)) && usr.stat == CONSCIOUS)) name = "paper[(n_name ? text("- '[n_name]'") : null)]" add_fingerprint(usr) @@ -157,7 +157,7 @@ // .. or if you cannot read if(!user.can_read(src)) return UI_CLOSE - if(in_contents_of(/obj/machinery/door/airlock)) + if(in_contents_of(/obj/machinery/door/airlock) || in_contents_of(/obj/item/clipboard)) return UI_INTERACTIVE return ..() @@ -194,7 +194,11 @@ SStgui.close_uis(src) return - if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon)) + // Enable picking paper up by clicking on it with the clipboard or folder + if(istype(P, /obj/item/clipboard) || istype(P, /obj/item/folder)) + P.attackby(src, user) + return + else if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon)) if(length(info) >= MAX_PAPER_LENGTH) // Sheet must have less than 1000 charaters to_chat(user, "This sheet of paper is full!") return @@ -226,6 +230,7 @@ if(!ui) ui = new(user, src, "PaperSheet", name) ui.open() + ui.set_autoupdate(TRUE) /obj/item/paper/ui_static_data(mob/user) @@ -242,27 +247,32 @@ var/list/data = list() data["edit_usr"] = "[user]" - var/obj/O = user.get_active_held_item() - if(istype(O, /obj/item/toy/crayon)) - var/obj/item/toy/crayon/PEN = O + var/obj/holding = user.get_active_held_item() + // Use a clipboard's pen, if applicable + if(istype(loc, /obj/item/clipboard)) + var/obj/item/clipboard/clipboard = loc + if(clipboard.pen) + holding = clipboard.pen + if(istype(holding, /obj/item/toy/crayon)) + var/obj/item/toy/crayon/PEN = holding data["pen_font"] = CRAYON_FONT data["pen_color"] = PEN.paint_color data["edit_mode"] = MODE_WRITING data["is_crayon"] = TRUE data["stamp_class"] = "FAKE" data["stamp_icon_state"] = "FAKE" - else if(istype(O, /obj/item/pen)) - var/obj/item/pen/PEN = O + else if(istype(holding, /obj/item/pen)) + var/obj/item/pen/PEN = holding data["pen_font"] = PEN.font data["pen_color"] = PEN.colour data["edit_mode"] = MODE_WRITING data["is_crayon"] = FALSE data["stamp_class"] = "FAKE" data["stamp_icon_state"] = "FAKE" - else if(istype(O, /obj/item/stamp)) + else if(istype(holding, /obj/item/stamp)) var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/simple/paper) - data["stamp_icon_state"] = O.icon_state - data["stamp_class"] = sheet.icon_class_name(O.icon_state) + data["stamp_icon_state"] = holding.icon_state + data["stamp_class"] = sheet.icon_class_name(holding.icon_state) data["edit_mode"] = MODE_STAMPING data["pen_font"] = "FAKE" data["pen_color"] = "FAKE" @@ -274,6 +284,10 @@ data["is_crayon"] = FALSE data["stamp_icon_state"] = "FAKE" data["stamp_class"] = "FAKE" + if(istype(loc, /obj/structure/noticeboard)) + var/obj/structure/noticeboard/noticeboard = loc + if(!noticeboard.allowed(user)) + data["edit_mode"] = MODE_READING data["field_counter"] = field_counter data["form_fields"] = form_fields @@ -335,6 +349,11 @@ update_icon() . = TRUE +/obj/item/paper/ui_host(mob/user) + if(istype(loc, /obj/structure/noticeboard)) + return loc + return ..() + /** * Construction paper */ @@ -366,6 +385,19 @@ /obj/item/paper/crumpled/beernuke name = "beer-stained note" +/obj/item/paper/crumpled/beernuke/Initialize() + . = ..() + var/code + for(var/obj/machinery/nuclearbomb/beer/beernuke in GLOB.nuke_list) + if(beernuke.r_code == "ADMIN") + beernuke.r_code = random_nukecode() + code = beernuke.r_code + info = "important party info, DONT FORGET: [code]" + +/obj/item/paper/troll + name = "very special note" + info = "

░░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄░░░░░░░
░░░░░█░░░░▒▒▒▒▒▒▒▒▒▒▒▒░░▀▀▄░░░░
░░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█░░░
░░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░░█░░
░▄▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░░█░
█░▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒░█
█░▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█
░█░▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█░
░░█░░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█░░
░░░█░░░░██░░▀█▄▄▄█▄▄█▄████░█░░░
░░░░█░░░░▀▀▄░█░░░█░█▀██████░█░░
░░░░░▀▄░░░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█░░
░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░▒░░░█░
░░░░░░░░░░▀▀▄▄░▒▒▒▒▒▒▒▒▒▒░░░░█░
░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░░░░█░░

" + #undef MAX_PAPER_LENGTH #undef MAX_PAPER_STAMPS #undef MAX_PAPER_STAMPS_OVERLAYS diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index 7f8e30ae759fb..33efd43ea1832 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -26,7 +26,7 @@ var/obj/item/bodypart/BP = C.get_bodypart(BODY_ZONE_HEAD) if(BP) BP.drop_limb() - playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1) + playsound(loc,pick('sound/misc/desecration-01.ogg','sound/misc/desecration-02.ogg','sound/misc/desecration-01.ogg') ,50, 1, -1) return (BRUTELOSS) else user.visible_message("[user] repeatedly bashes [src.name] against [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!") @@ -99,8 +99,8 @@ if(over_object == M) M.put_in_hands(src) - else if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + else if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) add_fingerprint(M) diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm index 2e79766f296e4..36201cdec7b96 100644 --- a/code/modules/paperwork/paper_premade.dm +++ b/code/modules/paperwork/paper_premade.dm @@ -40,8 +40,8 @@ name = "paper- Smelting Operations Closed" info = "**NOTICE**

Smelting operations moved on-station.

Take your unrefined ore to the Redemption Machine in the Delivery Office to redeem points.

--SS13 Command" -/obj/item/paper/fluff/jobs/security/court_judgement - name = "paper- 'Judgement'" +/obj/item/paper/fluff/jobs/security/court_judgment + name = "paper- 'Judgment'" info = "For crimes against the station, the offender is sentenced to:
\n
\n" /obj/item/paper/fluff/jobs/toxins/chemical_info @@ -104,4 +104,3 @@ /obj/item/paper/fluff/stations/lavaland/orm_notice name = "URGENT!" info = "A hastily written note has been scribbled here...

Please use the ore redemption machine in the cargo office for smelting. PLEASE!

--The Research Staff" - diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 303f791c53165..1dec5232b28f5 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -49,8 +49,8 @@ if(over_object == M) M.put_in_hands(src) - else if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + else if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) add_fingerprint(M) diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 93eba231c6c03..4a97595628ade 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -52,8 +52,9 @@ return ..() -/obj/item/origami/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback) - . = ..(target, range, speed, thrower, FALSE, diagonals_first, callback) +/obj/item/origami/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback, quickstart = TRUE) + . = ..(target, range, speed, thrower, FALSE, diagonals_first, callback, quickstart = quickstart) + /obj/item/origami/paperplane/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(iscarbon(hit_atom)) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 9681d30a673ce..32ed008c21d81 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -41,6 +41,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 +57,10 @@ switch(colour) if("black") colour = "red" + throw_speed++ if("red") colour = "green" + throw_speed = initial(throw_speed) if("green") colour = "blue" else @@ -71,6 +74,22 @@ icon_state = "pen-fountain" font = FOUNTAIN_PEN_FONT +/obj/item/pen/charcoal + name = "charcoal stylus" + desc = "It's just a wooden stick with some compressed ash on the end. At least it can write." + icon_state = "pen-charcoal" + colour = "dimgray" + font = CHARCOAL_FONT + custom_materials = null + +/datum/crafting_recipe/charcoal_stylus + name = "Charcoal Stylus" + result = /obj/item/pen/charcoal + reqs = list(/obj/item/stack/sheet/mineral/wood = 1, /datum/reagent/ash = 30) + time = 30 + category = CAT_PRIMAL + + /obj/item/pen/fountain/captain name = "captain's fountain pen" desc = "It's an expensive Oak fountain pen. The nib is quite sharp." @@ -88,6 +107,7 @@ "Black and Silver" = "pen-fountain-b", "Command Blue" = "pen-fountain-cb" ) + embedding = list("embed_chance" = 75, "armour_block" = 40) /obj/item/pen/fountain/captain/Initialize() . = ..() @@ -188,7 +208,7 @@ w_class = initial(w_class) name = initial(name) hitsound = initial(hitsound) - embedding = embedding.setRating(embed_chance = EMBED_CHANCE) + embedding = list(embed_chance = EMBED_CHANCE, armour_block = 30) throwforce = initial(throwforce) playsound(user, 'sound/weapons/saberoff.ogg', 5, 1) to_chat(user, "[src] can now be concealed.") @@ -199,10 +219,11 @@ w_class = WEIGHT_CLASS_NORMAL name = "energy dagger" hitsound = 'sound/weapons/blade1.ogg' - embedding = embedding.setRating(embed_chance = 100) //rule of cool + embedding = list(embed_chance = 200, max_damage_mult = 15, armour_block = 40) //rule of cool throwforce = 35 playsound(user, 'sound/weapons/saberon.ogg', 5, 1) to_chat(user, "[src] is now active.") + updateEmbedding() var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) butchering.butchering_enabled = on update_icon() diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index d8ea3eba98fa4..7d9837aaaf0f6 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -112,7 +112,7 @@ else if(ass) //ASS COPY. By Miauw for(var/i = 0, i < copies, i++) var/icon/temp_img - if(ishuman(ass) && (ass.get_item_by_slot(SLOT_W_UNIFORM) || ass.get_item_by_slot(SLOT_WEAR_SUIT))) + if(ishuman(ass) && (ass.get_item_by_slot(ITEM_SLOT_ICLOTHING) || ass.get_item_by_slot(ITEM_SLOT_OCLOTHING))) to_chat(usr, "You feel kind of silly, copying [ass == usr ? "your" : ass][ass == usr ? "" : "\'s"] ass with [ass == usr ? "your" : "[ass.p_their()]"] clothes on." ) break else if(toner >= 5 && !busy && check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on. @@ -296,7 +296,7 @@ updateUsrDialog() return 0 else if(ishuman(ass)) - if(!ass.get_item_by_slot(SLOT_W_UNIFORM) && !ass.get_item_by_slot(SLOT_WEAR_SUIT)) + if(!ass.get_item_by_slot(ITEM_SLOT_ICLOTHING) && !ass.get_item_by_slot(ITEM_SLOT_OCLOTHING)) return 1 else return 0 @@ -331,3 +331,16 @@ 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" + desc = "A hefty cartridge of NanoTrasen ValueBrand toner. Fits photocopiers and autopainters alike." + grind_results = list(/datum/reagent/iodine = 90, /datum/reagent/iron = 10) + charges = 25 + max_charges = 25 + +/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/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index c8b3aaccddc73..9471c05fc9c85 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -103,7 +103,7 @@ else if(!(get_turf(target) in get_hear(world.view, user))) return FALSE else //user is an atom - if(!(get_turf(target) in view(world.view, user))) + if(!(user in viewers(world.view, get_turf(target)))) return FALSE return TRUE diff --git a/code/modules/photography/photos/album.dm b/code/modules/photography/photos/album.dm index ee1ff945c1719..7446240763756 100644 --- a/code/modules/photography/photos/album.dm +++ b/code/modules/photography/photos/album.dm @@ -10,6 +10,7 @@ righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi' resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_SMALL + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 var/persistence_id /obj/item/storage/photo_album/Initialize() @@ -54,9 +55,6 @@ if(!SEND_SIGNAL(src, COMSIG_TRY_STORAGE_INSERT, P, null, TRUE, TRUE)) qdel(P) -/obj/item/storage/photo_album/prevent_content_explosion() - return TRUE - /obj/item/storage/photo_album/HoS persistence_id = "HoS" diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm index 2275deb0ce0cd..522fb5045f63e 100644 --- a/code/modules/photography/photos/frame.dm +++ b/code/modules/photography/photos/frame.dm @@ -64,6 +64,7 @@ desc = "Every time you look it makes you laugh." icon = 'icons/obj/decals.dmi' icon_state = "frame-empty" + layer = ABOVE_WINDOW_LAYER var/obj/item/photo/framed var/persistence_id var/can_decon = TRUE diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm index bb6b3b34dd532..d49ed687c993d 100644 --- a/code/modules/plumbing/ducts.dm +++ b/code/modules/plumbing/ducts.dm @@ -57,7 +57,7 @@ All the important duct code: if(D == src) continue if(D.duct_layer & duct_layer) - disconnect_duct() + return INITIALIZE_HINT_QDEL //If we have company, end it all if(active) attempt_connect() @@ -153,8 +153,10 @@ All the important duct code: lose_neighbours() reset_connects(0) update_icon() - if(ispath(drop_on_wrench) && !QDELING(src)) + if(ispath(drop_on_wrench)) new drop_on_wrench(drop_location()) + drop_on_wrench = null + if(!QDELETED(src)) qdel(src) ///''''''''''''''''optimized''''''''''''''''' proc for quickly reconnecting after a duct net was destroyed @@ -233,7 +235,7 @@ All the important duct code: adjacents += D return adjacents -/obj/machinery/duct/update_icon() //setting connects isnt a parameter because sometimes we make more than one change, overwrite it completely or just add it to the bitfield +/obj/machinery/duct/update_icon() //setting connects isn't a parameter because sometimes we make more than one change, overwrite it completely or just add it to the bitfield var/temp_icon = initial(icon_state) for(var/D in GLOB.cardinals) if(D & connects) @@ -282,7 +284,7 @@ All the important duct code: "You hear ratcheting.") attempt_connect() return TRUE -///collection of all the sanity checks to prevent us from stacking ducts that shouldnt be stacked +///collection of all the sanity checks to prevent us from stacking ducts that shouldn't be stacked /obj/machinery/duct/proc/can_anchor(turf/T) if(!T) T = get_turf(src) @@ -360,7 +362,7 @@ All the important duct code: else connects = EAST | WEST -///don't connect to other multilayered stuff because honestly it shouldnt be done and I dont wanna deal with it +///don't connect to other multilayered stuff because honestly it shouldn't be done and I dont wanna deal with it /obj/machinery/duct/multilayered/connect_duct(obj/machinery/duct/D, direction, ignore_color) if(istype(D, /obj/machinery/duct/multilayered)) return diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm index e242afaa67900..a82a1412b63a1 100644 --- a/code/modules/plumbing/plumbers/_plumb_machinery.dm +++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm @@ -8,7 +8,7 @@ icon = 'icons/obj/plumbing/plumbers.dmi' icon_state = "pump" density = TRUE - active_power_usage = 30 + active_power_usage = 45 use_power = ACTIVE_POWER_USE resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF ///Plumbing machinery is always gonna need reagents, so we might aswell put it here diff --git a/code/modules/plumbing/plumbers/acclimator.dm b/code/modules/plumbing/plumbers/acclimator.dm index 76ef1ac892b21..a80d84fb427d4 100644 --- a/code/modules/plumbing/plumbers/acclimator.dm +++ b/code/modules/plumbing/plumbers/acclimator.dm @@ -16,7 +16,7 @@ ///I cant find a good name for this. Basically if target is 300, and this is 10, it will still target 300 but will start emptying itself at 290 and 310. var/allowed_temperature_difference = 1 ///cool/heat power - var/heater_coefficient = 0.1 + var/heater_coefficient = 0.05 ///Are we turned on or off? this is from the on and off button var/enabled = TRUE ///COOLING, HEATING or NEUTRAL. We track this for change, so we dont needlessly update our icon @@ -33,7 +33,7 @@ . = ..() AddComponent(/datum/component/plumbing/acclimator, bolt) -/obj/machinery/plumbing/acclimator/process() +/obj/machinery/plumbing/acclimator/process(delta_time) if(stat & NOPOWER || !enabled || !reagents.total_volume || reagents.chem_temp == target_temperature) if(acclimate_state != NEUTRAL) acclimate_state = NEUTRAL @@ -54,7 +54,7 @@ if(reagents.chem_temp <= target_temperature && target_temperature - allowed_temperature_difference <= reagents.chem_temp) //heating here emptying = TRUE - reagents.adjust_thermal_energy((target_temperature - reagents.chem_temp) * heater_coefficient * SPECIFIC_HEAT_DEFAULT * reagents.total_volume) //keep constant with chem heater + reagents.adjust_thermal_energy((target_temperature - reagents.chem_temp) * heater_coefficient * delta_time * SPECIFIC_HEAT_DEFAULT * reagents.total_volume) //keep constant with chem heater reagents.handle_reactions() /obj/machinery/plumbing/acclimator/update_icon() @@ -74,6 +74,7 @@ if(!ui) ui = new(user, src, "ChemAcclimator") ui.open() + ui.set_autoupdate(TRUE) /obj/machinery/plumbing/acclimator/ui_data(mob/user) var/list/data = list() @@ -91,19 +92,22 @@ /obj/machinery/plumbing/acclimator/ui_act(action, params) if(..()) return - . = TRUE switch(action) if("set_target_temperature") var/target = text2num(params["temperature"]) target_temperature = clamp(target, 0, 1000) + . = TRUE if("set_allowed_temperature_difference") var/target = text2num(params["temperature"]) allowed_temperature_difference = clamp(target, 0, 1000) + . = TRUE if("toggle_power") enabled = !enabled + . = TRUE if("change_volume") var/target = text2num(params["volume"]) reagents.maximum_volume = clamp(round(target), 1, buffer) + . = TRUE #undef COOLING #undef HEATING diff --git a/code/modules/plumbing/plumbers/bottle_dispenser.dm b/code/modules/plumbing/plumbers/bottle_dispenser.dm index f45aff7f0f5ce..fc9dddf41adb9 100644 --- a/code/modules/plumbing/plumbers/bottle_dispenser.dm +++ b/code/modules/plumbing/plumbers/bottle_dispenser.dm @@ -60,10 +60,11 @@ /obj/machinery/plumbing/bottle_dispenser/ui_act(action, params) if(..()) return - . = TRUE switch(action) if("change_bottle_size") bottle_size = CLAMP(text2num(params["volume"]), 0, 30) + . = TRUE if("change_bottle_name") var/new_name = stripped_input(usr, "Enter a bottle name.", name, bottle_name) bottle_name = new_name + " bottle" + . = TRUE diff --git a/code/modules/plumbing/plumbers/destroyer.dm b/code/modules/plumbing/plumbers/destroyer.dm index 2c80143d839e5..eaf6ba773ef7c 100644 --- a/code/modules/plumbing/plumbers/destroyer.dm +++ b/code/modules/plumbing/plumbers/destroyer.dm @@ -2,20 +2,21 @@ name = "chemical disposer" desc = "Breaks down chemicals and annihilates them." icon_state = "disposal" - ///we remove 10 reagents per second - var/disposal_rate = 10 + active_power_usage = 70 + ///we remove 5 reagents per second + var/disposal_rate = 5 /obj/machinery/plumbing/disposer/Initialize(mapload, bolt) . = ..() AddComponent(/datum/component/plumbing/simple_demand, bolt) -/obj/machinery/plumbing/disposer/process() +/obj/machinery/plumbing/disposer/process(delta_time) if(stat & NOPOWER) return if(reagents.total_volume) if(icon_state != initial(icon_state) + "_working") //threw it here instead of update icon since it only has two states icon_state = initial(icon_state) + "_working" - reagents.remove_any(disposal_rate) + reagents.remove_any(disposal_rate * delta_time) else if(icon_state != initial(icon_state)) icon_state = initial(icon_state) diff --git a/code/modules/plumbing/plumbers/filter.dm b/code/modules/plumbing/plumbers/filter.dm index 5f89e4ebdbf28..b5da00e34327d 100644 --- a/code/modules/plumbing/plumbers/filter.dm +++ b/code/modules/plumbing/plumbers/filter.dm @@ -39,7 +39,6 @@ /obj/machinery/plumbing/filter/ui_act(action, params) if(..()) return - . = TRUE switch(action) if("add") var/new_chem_name = params["name"] @@ -50,10 +49,12 @@ if(!left.Find(chem_id)) english_left += new_chem_name left += chem_id + . = TRUE if("right") if(!right.Find(chem_id)) english_right += new_chem_name right += chem_id + . = TRUE else to_chat(usr, "No such known reagent exists!") @@ -65,9 +66,9 @@ if(english_left.Find(chem_name)) english_left -= chem_name left -= chem_id + . = TRUE if("right") if(english_right.Find(chem_name)) english_right -= chem_name right -= chem_id - - + . = TRUE diff --git a/code/modules/plumbing/plumbers/grinder_chemical.dm b/code/modules/plumbing/plumbers/grinder_chemical.dm index cc42e604c1423..90ab80cb1c26c 100644 --- a/code/modules/plumbing/plumbers/grinder_chemical.dm +++ b/code/modules/plumbing/plumbers/grinder_chemical.dm @@ -7,6 +7,7 @@ rcd_cost = 30 rcd_delay = 30 buffer = 400 + active_power_usage = 80 var/eat_dir = SOUTH /obj/machinery/plumbing/grinder_chemical/Initialize(mapload, bolt) diff --git a/code/modules/plumbing/plumbers/patch_dispenser.dm b/code/modules/plumbing/plumbers/patch_dispenser.dm index 81fd32afb3c0e..1a5c92550b643 100644 --- a/code/modules/plumbing/plumbers/patch_dispenser.dm +++ b/code/modules/plumbing/plumbers/patch_dispenser.dm @@ -3,6 +3,8 @@ name = "patch dispenser" desc = "A dispenser that dispenses patches." icon_state = "pill_press" //TODO SPRITE IT !!!!!! + active_power_usage = 80 + var/patch_name = "factory patch" var/patch_size = 40 ///the icon_state number for the patch. @@ -60,10 +62,11 @@ /obj/machinery/plumbing/patch_dispenser/ui_act(action, params) if(..()) return - . = TRUE switch(action) if("change_patch_size") patch_size = CLAMP(text2num(params["volume"]), 0, 40) + . = TRUE if("change_patch_name") var/new_name = stripped_input(usr, "Enter a patch name.", name, patch_name) patch_name = new_name + " patch" + . = TRUE diff --git a/code/modules/plumbing/plumbers/pill_press.dm b/code/modules/plumbing/plumbers/pill_press.dm index b4c098a9b52ee..7806cf8e2be9b 100644 --- a/code/modules/plumbing/plumbers/pill_press.dm +++ b/code/modules/plumbing/plumbers/pill_press.dm @@ -3,6 +3,7 @@ name = "pill press" desc = "A press that presses pills." icon_state = "pill_press" + active_power_usage = 100 ///the minimum size a pill can be var/minimum_pill = 5 ///the maximum size a pill can be @@ -92,15 +93,17 @@ /obj/machinery/plumbing/pill_press/ui_act(action, params) if(..()) return - . = TRUE switch(action) if("change_pill_style") pill_number = CLAMP(text2num(params["id"]), 1 , PILL_STYLE_COUNT) + . = TRUE if("change_pill_size") pill_size = CLAMP(text2num(params["volume"]), minimum_pill, maximum_pill) + . = TRUE if("change_pill_name") var/new_name = stripped_input(usr, "Enter a pill name.", name, pill_name) if(findtext(new_name, "pill")) //names like pillatron and Pilliam are thus valid pill_name = new_name else pill_name = new_name + " pill" + . = TRUE diff --git a/code/modules/plumbing/plumbers/pumps.dm b/code/modules/plumbing/plumbers/pumps.dm index 782540470ac6b..c7e5d45a3958c 100644 --- a/code/modules/plumbing/plumbers/pumps.dm +++ b/code/modules/plumbing/plumbers/pumps.dm @@ -11,8 +11,8 @@ active_power_usage = 1000 ///Are we powered? var/powered = FALSE - ///units we pump per process (2 seconds) - var/pump_power = 2 + ///units we pump per second + var/pump_power = 1 ///set to true if the loop couldnt find a geyser in process, so it remembers and stops checking every loop until moved. more accurate name would be absolutely_no_geyser_under_me_so_dont_try var/geyserless = FALSE ///The geyser object @@ -46,7 +46,7 @@ powered = FALSE geyserless = FALSE //we switched state, so lets just set this back aswell -/obj/machinery/power/liquid_pump/process() +/obj/machinery/power/liquid_pump/process(delta_time) if(!anchored || panel_open) return if(!geyser && !geyserless) @@ -64,15 +64,16 @@ powered = TRUE update_icon() add_load(active_power_usage) - pump() + pump(delta_time) else if(powered) //we were powered, but now we arent powered = FALSE update_icon() + ///pump up that sweet geyser nectar -/obj/machinery/power/liquid_pump/proc/pump() +/obj/machinery/power/liquid_pump/proc/pump(delta_time) if(!geyser || !geyser.reagents) return - geyser.reagents.trans_to(src, pump_power) + geyser.reagents.trans_to(src, pump_power * delta_time) /obj/machinery/power/liquid_pump/update_icon() if(powered) @@ -80,4 +81,4 @@ else if(panel_open) icon_state = initial(icon_state) + "-open" else - icon_state = initial(icon_state) \ No newline at end of file + icon_state = initial(icon_state) diff --git a/code/modules/plumbing/plumbers/reaction_chamber.dm b/code/modules/plumbing/plumbers/reaction_chamber.dm index f57102b1406f9..d9ba7ddfbb0e5 100644 --- a/code/modules/plumbing/plumbers/reaction_chamber.dm +++ b/code/modules/plumbing/plumbers/reaction_chamber.dm @@ -40,6 +40,7 @@ if(!ui) ui = new(user, src, "ChemReactionChamber") ui.open() + ui.set_autoupdate(TRUE) /obj/machinery/plumbing/reaction_chamber/ui_data(mob/user) var/list/data = list() @@ -55,15 +56,16 @@ /obj/machinery/plumbing/reaction_chamber/ui_act(action, params) if(..()) return - . = TRUE switch(action) if("remove") var/reagent = get_chem_id(params["chem"]) if(reagent) required_reagents.Remove(reagent) + . = TRUE if("add") var/input_reagent = get_chem_id(params["chem"]) if(input_reagent && !required_reagents.Find(input_reagent)) var/input_amount = text2num(params["amount"]) if(input_amount) required_reagents[input_reagent] = input_amount + . = TRUE diff --git a/code/modules/plumbing/plumbers/splitters.dm b/code/modules/plumbing/plumbers/splitters.dm index a5fba301c59df..0b287fab9c287 100644 --- a/code/modules/plumbing/plumbers/splitters.dm +++ b/code/modules/plumbing/plumbers/splitters.dm @@ -42,7 +42,6 @@ /obj/machinery/plumbing/splitter/ui_act(action, params) if(..()) return - . = TRUE switch(action) if("set_amount") var/direction = params["target"] @@ -54,3 +53,4 @@ transfer_side = value else return FALSE + . = TRUE diff --git a/code/modules/plumbing/plumbers/synthesizer.dm b/code/modules/plumbing/plumbers/synthesizer.dm index 482c840aa7d89..65f227abe5906 100644 --- a/code/modules/plumbing/plumbers/synthesizer.dm +++ b/code/modules/plumbing/plumbers/synthesizer.dm @@ -7,6 +7,7 @@ icon = 'icons/obj/plumbing/plumbers.dmi' rcd_cost = 25 rcd_delay = 15 + active_power_usage = 500 ///Amount we produce for every process. Ideally keep under 5 since thats currently the standard duct capacity var/amount = 1 @@ -55,12 +56,12 @@ . = ..() AddComponent(/datum/component/plumbing/simple_supply, bolt) -/obj/machinery/plumbing/synthesizer/process() +/obj/machinery/plumbing/synthesizer/process(delta_time) if(stat & NOPOWER || !reagent_id || !amount) return - if(reagents.total_volume >= amount) //otherwise we get leftovers, and we need this to be precise + if(reagents.total_volume >= amount*delta_time*0.5) //otherwise we get leftovers, and we need this to be precise return - reagents.add_reagent(reagent_id, amount) + reagents.add_reagent(reagent_id, amount*delta_time*0.5) /obj/machinery/plumbing/synthesizer/ui_state(mob/user) @@ -95,7 +96,6 @@ /obj/machinery/plumbing/synthesizer/ui_act(action, params) if(..()) return - . = TRUE switch(action) if("amount") var/new_amount = text2num(params["target"]) @@ -107,8 +107,9 @@ if(new_reagent in dispensable_reagents) reagent_id = new_reagent . = TRUE - update_icon() - reagents.clear_reagents() + if(.) + update_icon() + reagents.clear_reagents() /obj/machinery/plumbing/synthesizer/update_icon() if(!r_overlay) diff --git a/code/modules/pool/components/swimming.dm b/code/modules/pool/components/swimming.dm new file mode 100644 index 0000000000000..ebcfb965f2776 --- /dev/null +++ b/code/modules/pool/components/swimming.dm @@ -0,0 +1,153 @@ +//Component used to show that a mob is swimming, and force them to swim a lil' bit slower. Components are actually really based! + +/datum/component/swimming + dupe_mode = COMPONENT_DUPE_UNIQUE + var/lengths = 0 //How far have we swum? + var/lengths_for_bonus = 25 //If you swim this much, you'll count as having "excercised" and thus gain a buff. + var/list/species = list() + var/drowning = FALSE + var/ticks_drowned = 0 + var/slowdown = 4 + var/bob_height_min = 2 + var/bob_height_max = 5 + var/bob_tick = 0 + +/datum/component/swimming/Initialize() + . = ..() + if(!isliving(parent)) + message_admins("Swimming component erroneously added to a non-living mob ([parent]).") + return INITIALIZE_HINT_QDEL //Only mobs can swim, like Ian... + var/mob/M = parent + M.visible_message("[parent] starts splashing around in the water!") + M.add_movespeed_modifier(MOVESPEED_ID_SWIMMING, update=TRUE, priority=50, multiplicative_slowdown=slowdown, movetypes=GROUND) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/onMove) + RegisterSignal(parent, COMSIG_CARBON_SPECIESCHANGE, .proc/onChangeSpecies) + RegisterSignal(parent, COMSIG_MOB_ATTACK_HAND_TURF, .proc/try_leave_pool) + START_PROCESSING(SSprocessing, src) + enter_pool() + +/datum/component/swimming/proc/onMove() + SIGNAL_HANDLER + + lengths ++ + if(lengths > lengths_for_bonus) + var/mob/living/L = parent + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "exercise", /datum/mood_event/exercise) + L.apply_status_effect(STATUS_EFFECT_EXERCISED) //Swimming is really good excercise! + lengths = 0 + +//Damn edge cases +/datum/component/swimming/proc/onChangeSpecies() + SIGNAL_HANDLER + + var/mob/living/carbon/C = parent + var/component_type = /datum/component/swimming + if(istype(C) && C?.dna?.species) + component_type = C.dna.species.swimming_component + var/mob/M = parent + RemoveComponent() + M.AddComponent(component_type) + +/datum/component/swimming/proc/try_leave_pool(datum/source, turf/clicked_turf) + SIGNAL_HANDLER + + var/mob/living/L = parent + if(!L.can_interact_with(clicked_turf)) + return + if(is_blocked_turf(clicked_turf)) + return + if(istype(clicked_turf, /turf/open/indestructible/sound/pool)) + return + if(L.pulling) + INVOKE_ASYNC(src, .proc/pull_out, L, clicked_turf) + return + INVOKE_ASYNC(src, .proc/climb_out, L, clicked_turf) + +/datum/component/swimming/proc/climb_out(var/mob/living/L, turf/clicked_turf) + L.forceMove(clicked_turf) + L.visible_message("[parent] climbs out of the pool.") + RemoveComponent() + +/datum/component/swimming/proc/pull_out(var/mob/living/L, turf/clicked_turf) + to_chat(parent, "You start to climb out of the pool...") + if(do_after(parent, 1 SECONDS, target=clicked_turf)) + to_chat(parent, "You start to lift [L.pulling] out of the pool...") + var/atom/movable/pulled_object = L.pulling + if(do_after(parent, 1 SECONDS, target=pulled_object)) + pulled_object.forceMove(clicked_turf) + L.visible_message("[parent] pulls [pulled_object] out of the pool.") + var/datum/component/swimming/swimming_comp = pulled_object.GetComponent(/datum/component/swimming) + if(swimming_comp) + swimming_comp.RemoveComponent() + +/datum/component/swimming/UnregisterFromParent() + exit_pool() + var/mob/M = parent + if(drowning) + stop_drowning(M) + if(bob_tick) + M.pixel_y = 0 + M.remove_movespeed_modifier(MOVESPEED_ID_SWIMMING) + UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) + UnregisterSignal(parent, COMSIG_CARBON_SPECIESCHANGE) + UnregisterSignal(parent, COMSIG_MOB_ATTACK_HAND_TURF) + STOP_PROCESSING(SSprocessing, src) + return ..() + +/datum/component/swimming/process() + var/mob/living/L = parent + var/floating = FALSE + var/obj/item/pool/helditem = L.get_active_held_item() + if(istype(helditem) && ISWIELDED(helditem)) + bob_tick ++ + animate(L, time=9.5, pixel_y = (L.pixel_y == bob_height_max) ? bob_height_min : bob_height_max) + floating = TRUE + else + if(bob_tick) + animate(L, time=5, pixel_y = 0) + bob_tick = 0 + if(!floating && is_drowning(L)) + if(!drowning) + start_drowning(L) + drowning = TRUE + drown(L) + else if(drowning) + stop_drowning(L) + drowning = FALSE + L.adjust_fire_stacks(-1) + +/datum/component/swimming/proc/is_drowning(mob/living/victim) + var/obj/item/pool/helditem = victim.get_active_held_item() + if(istype(helditem) && ISWIELDED(helditem)) + return + return ((!(victim.mobility_flags & MOBILITY_STAND)) && (!HAS_TRAIT(victim, TRAIT_NOBREATH))) + +/datum/component/swimming/proc/drown(mob/living/victim) + if(victim.losebreath < 1) + victim.losebreath += 1 + ticks_drowned ++ + if(prob(20)) + victim.emote("cough") + else if(prob(25)) + victim.emote("gasp") + if(ticks_drowned > 20) + if(prob(10)) + victim.visible_message("[victim] falls unconcious for a moment!") + victim.Unconscious(10) + +/datum/component/swimming/proc/start_drowning(mob/living/victim) + to_chat(victim, "Water fills your lungs and mouth, you can't breathe!") + ADD_TRAIT(victim, TRAIT_MUTE, "pool") + +/datum/component/swimming/proc/stop_drowning(mob/living/victim) + victim.emote("cough") + to_chat(victim, "You cough up the last of the water, regaining your ability to speak and breathe clearly!") + REMOVE_TRAIT(victim, TRAIT_MUTE, "pool") + ticks_drowned = 0 + +/datum/component/swimming/proc/enter_pool() + return + +//Essentially the same as remove component, but easier for overiding +/datum/component/swimming/proc/exit_pool() + return diff --git a/code/modules/pool/components/swimming_dissolve.dm b/code/modules/pool/components/swimming_dissolve.dm new file mode 100644 index 0000000000000..09946a63d2fdb --- /dev/null +++ b/code/modules/pool/components/swimming_dissolve.dm @@ -0,0 +1,32 @@ +/datum/component/swimming/dissolve + var/start_alpha = 0 + +/datum/component/swimming/dissolve/enter_pool() + var/mob/living/L = parent + start_alpha = L.alpha + to_chat(parent, "You begin disolving into the pool, get out fast!") + +/datum/component/swimming/dissolve/process() + ..() + var/mob/living/L = parent + var/mob/living/carbon/human/H = L + if(istype(H)) + if(H.wear_suit && isclothing(H.wear_suit)) + var/obj/item/clothing/CH = H.wear_suit + if (CH.clothing_flags & THICKMATERIAL) + return + L.adjustCloneLoss(1) + L.alpha = ((L.health-HEALTH_THRESHOLD_DEAD) / (L.maxHealth - HEALTH_THRESHOLD_DEAD)) * 255 + if(L.stat == DEAD) + L.visible_message("[L] dissolves into the pool!") + var/obj/item/organ/brain = L.getorgan(/obj/item/organ/brain) + brain.Remove(L) //Maybe making them completely unrecoverable is too far + brain.forceMove(get_turf(L)) + //Force all items to the ground to not delete anything important. + for(var/obj/item/W in L) + L.dropItemToGround(W, TRUE) + //Delete the body. + qdel(L) + +/datum/component/swimming/dissolve/exit_pool() + animate(parent, alpha=start_alpha, time=20) diff --git a/code/modules/pool/components/swimming_ethereal.dm b/code/modules/pool/components/swimming_ethereal.dm new file mode 100644 index 0000000000000..13f1877e9d3bf --- /dev/null +++ b/code/modules/pool/components/swimming_ethereal.dm @@ -0,0 +1,11 @@ +/datum/component/swimming/ethereal/enter_pool() + var/mob/living/L = parent + L.visible_message("Sparks of energy begin coursing around the pool!") + +/datum/component/swimming/ethereal/process() + ..() + var/mob/living/L = parent + if(prob(2) && L.nutrition > NUTRITION_LEVEL_FED) + L.adjust_nutrition(-50) + tesla_zap(L, 7, 2000, TESLA_MOB_STUN) + playsound(L, 'sound/machines/defib_zap.ogg', 50, TRUE) diff --git a/code/modules/pool/components/swimming_felinid.dm b/code/modules/pool/components/swimming_felinid.dm new file mode 100644 index 0000000000000..6cd36aa17a981 --- /dev/null +++ b/code/modules/pool/components/swimming_felinid.dm @@ -0,0 +1,27 @@ +/datum/component/swimming/felinid/enter_pool() + var/mob/living/L = parent + L.emote("scream") + to_chat(parent, "You get covered in water and start panicking!") + +/datum/component/swimming/felinid/process() + ..() + var/mob/living/L = parent + var/obj/item/pool/helditem = L.get_active_held_item() + if(istype(helditem) && ISWIELDED(helditem)) + return + switch(rand(1, 100)) + if(1 to 4) + to_chat(parent, "You can't touch the bottom!") + L.emote("scream") + if(5 to 7) + if(L.confused < 5) + L.confused += 1 + if(8 to 12) + L.Jitter(10) + if(13 to 14) + shake_camera(L, 15, 1) + L.emote("whimper") + L.Paralyze(10) + to_chat(parent, "You feel like you are never going to get out...") + if(15 to 17) + L.emote("cry") diff --git a/code/modules/pool/components/swimming_golem.dm b/code/modules/pool/components/swimming_golem.dm new file mode 100644 index 0000000000000..669d2aa097ffd --- /dev/null +++ b/code/modules/pool/components/swimming_golem.dm @@ -0,0 +1,9 @@ +/datum/component/swimming/golem/enter_pool() + var/mob/living/M = parent + M.Paralyze(60) + M.visible_message("[M] crashed violently into the ground!", + "You sink like a rock!") + playsound(get_turf(M), 'sound/effects/picaxe1.ogg') + +/datum/component/swimming/golem/is_drowning() + return FALSE diff --git a/code/modules/pool/components/swimming_squid.dm b/code/modules/pool/components/swimming_squid.dm new file mode 100644 index 0000000000000..1d1beff5b3116 --- /dev/null +++ b/code/modules/pool/components/swimming_squid.dm @@ -0,0 +1,8 @@ +/datum/component/swimming/squid + slowdown = 0.7 + +/datum/component/swimming/squid/enter_pool() + to_chat(parent, "You feel at ease in your natural habitat!") + +/datum/component/swimming/squid/is_drowning(mob/living/victim) + return FALSE diff --git a/code/modules/pool/pool.dm b/code/modules/pool/pool.dm new file mode 100644 index 0000000000000..503291dd7a03f --- /dev/null +++ b/code/modules/pool/pool.dm @@ -0,0 +1,291 @@ +//Simple pool behaviour. Sprites by Cdey! + +/** +How to pool! +Place pool turfs on the inside of your pool. This is where you swim. Pool end caps to cap it off on the north face +Place pool border decals around the pool so it doesn't look weird +Place a pool ladder at the top of the pool so that it leads to a normal tile (or else it'll be hard to get out of the pool.) +Place a pool filter somewhere in the pool if you want people to be able to modify the pool's settings (Temperature) or dump reagents into the pool (which'll change the pool's colour) +*/ + +/obj/effect/overlay/poolwater + name = "Pool water" + icon = 'icons/obj/pool.dmi' + icon_state = "water" + anchored = TRUE + layer = ABOVE_ALL_MOB_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/turf/open/indestructible/sound/pool + name = "Swimming pool" + desc = "A fun place where you go to swim! Drag and drop yourself onto it to climb in..." + icon = 'icons/obj/pool.dmi' + icon_state = "pool" + sound = 'sound/effects/splash.ogg' + var/id = null //Set me if you don't want the pool and the pump to be in the same area, or you have multiple pools per area. + var/obj/effect/water_overlay = null + +/turf/open/indestructible/sound/pool/end + icon_state = "poolwall" + +/turf/open/indestructible/sound/pool/Initialize(mapload) + . = ..() + water_overlay = new /obj/effect/overlay/poolwater(get_turf(src)) + +/turf/open/indestructible/sound/pool/proc/set_colour(colour) + water_overlay.color = colour + +/turf/open/indestructible/sound/pool/end/ChangeTurf(path, list/new_baseturfs, flags) + if(water_overlay) + qdel(water_overlay) + . = ..() + +/turf/open/CanPass(atom/movable/mover, turf/target) + var/datum/component/swimming/S = mover.GetComponent(/datum/component/swimming) //If you're swimming around, you don't really want to stop swimming just like that do you? + if(S) + return FALSE //If you're swimming, you can't swim into a regular turf, y'dig? + . = ..() + +/turf/open/indestructible/sound/pool/CanPass(atom/movable/mover, turf/target) + var/datum/component/swimming/S = mover.GetComponent(/datum/component/swimming) //You can't get in the pool unless you're swimming. + return (isliving(mover)) ? S : ..() //So you can do stuff like throw beach balls around the pool! + +/turf/open/indestructible/sound/pool/Entered(atom/movable/AM) + . = ..() + SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + if(isliving(AM)) + var/datum/component/swimming/S = AM.GetComponent(/datum/component/swimming) //You can't get in the pool unless you're swimming. + if(!S) + var/mob/living/carbon/C = AM + var/component_type = /datum/component/swimming + if(istype(C) && C?.dna?.species) + component_type = C.dna.species.swimming_component + AM.AddComponent(component_type) + +/turf/open/indestructible/sound/pool/Exited(atom/movable/Obj, atom/newloc) + . = ..() + if(!istype(newloc, /turf/open/indestructible/sound/pool)) + var/datum/component/swimming/S = Obj.GetComponent(/datum/component/swimming) //Handling admin TPs here. + S?.RemoveComponent() + +/turf/open/MouseDrop_T(atom/dropping, mob/user) + if(!isliving(user) || !isliving(dropping)) //No I don't want ghosts to be able to dunk people into the pool. + return + var/atom/movable/AM = dropping + var/datum/component/swimming/S = dropping.GetComponent(/datum/component/swimming) + if(S) + if(do_after(user, 1 SECONDS, target = dropping)) + S.RemoveComponent() + visible_message("[dropping] climbs out of the pool.") + AM.forceMove(src) + else + . = ..() + +/turf/open/indestructible/sound/pool/MouseDrop_T(atom/dropping, mob/user) + if(!isliving(user) || !isliving(dropping)) //No I don't want ghosts to be able to dunk people into the pool. + return + var/datum/component/swimming/S = dropping.GetComponent(/datum/component/swimming) //If they're already swimming, don't let them start swimming again. + if(S) + return FALSE + . = ..() + if(user != dropping) + dropping.visible_message("[user] starts to lower [dropping] down into [src].", \ + "You start to lower [dropping] down into [src].") + else + to_chat(user, "You start climbing down into [src]...") + if(do_after(user, 4 SECONDS, target = dropping)) + splash(dropping) + +/datum/mood_event/poolparty + description = "I love swimming!.\n" + mood_change = 2 + timeout = 2 MINUTES + +/datum/mood_event/robotpool + description = "I really wasn't built with water resistance in mind...\n" + mood_change = -3 + timeout = 2 MINUTES + +/datum/mood_event/poolwet + description = "Eugh! my clothes are soaking wet from that swim.\n" + mood_change = -4 + timeout = 4 MINUTES + +/turf/open/indestructible/sound/pool/proc/splash(mob/user) + user.forceMove(src) + playsound(src, 'sound/effects/splosh.ogg', 100, 1) //Credit to hippiestation for this sound file! + user.visible_message("SPLASH!") + var/zap = 0 + if(issilicon(user)) //Do not throw brick in a pool. Brick begs. + zap = 1 //Sorry borgs! Swimming will come at a cost. + if(ishuman(user)) + var/mob/living/carbon/human/F = user + var/datum/species/SS = F.dna.species + if(MOB_ROBOTIC in SS.inherent_biotypes) //ZAP goes the IPC! + zap = 2 //You can protect yourself from water damage with thick clothing. + if(F.head && isclothing(F.head)) + var/obj/item/clothing/CH = F.head + if (CH.clothing_flags & THICKMATERIAL) //Skinsuit should suffice! But IPCs are robots and probably not water-sealed. + zap -- + if(F.wear_suit && isclothing(F.wear_suit)) + var/obj/item/clothing/CS = F.wear_suit + if (CS.clothing_flags & THICKMATERIAL) + zap -- + if(zap > 0) + user.emp_act(zap) + user.emote("scream") //Chad coders use M.say("*scream") + do_sparks(zap, TRUE, user) + to_chat(user, "WARNING: WATER DAMAGE DETECTED!") + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "robotpool", /datum/mood_event/robotpool) + else + if(!check_clothes(user)) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "pool", /datum/mood_event/poolparty) + return + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "pool", /datum/mood_event/poolwet) + +//Largely a copypaste from shower.dm. Checks if the mob was stupid enough to enter a pool fully clothed. We allow masks as to not discriminate against clown and mime players. +/turf/open/indestructible/sound/pool/proc/check_clothes(mob/living/carbon/human/H) + if(!istype(H) || iscatperson(H)) //Don't care about non humans. + return FALSE + if(H.wear_suit && (H.wear_suit.clothing_flags & SHOWEROKAY)) + // Do not check underclothing if the over-suit is suitable. + // This stops people feeling dumb if they're showering + // with a radiation suit on. + return FALSE + + . = FALSE + if(!(H.wear_suit?.clothing_flags & SHOWEROKAY)) + return TRUE + if(!(H.w_uniform?.clothing_flags & SHOWEROKAY)) + return TRUE + if(!(H.head?.clothing_flags & SHOWEROKAY)) + return TRUE + +/obj/effect/turf_decal/pool + name = "Pool siding" + icon = 'icons/obj/pool.dmi' + icon_state = "poolborder" + +/obj/effect/turf_decal/pool/corner + icon_state = "bordercorner" + +/obj/effect/turf_decal/pool/innercorner + icon_state = "innercorner" + +//Pool machinery + +/obj/structure/pool_ladder + name = "Pool ladder" + desc = "Click this to get out of a pool quickly." + icon = 'icons/obj/pool.dmi' + icon_state = "ladder" + pixel_y = 12 + +GLOBAL_LIST_EMPTY(pool_filters) + +/obj/machinery/pool_filter + name = "Pool filter" + desc = "A device which can help you regulate conditions in a pool. Use a wrench to change its operating temperature, or hit it with a reagent container to load in new liquid to add to the pool." + icon = 'icons/obj/pool.dmi' + icon_state = "poolfilter" + pixel_y = 12 //So it sits above the water + idle_power_usage = IDLE_POWER_USE + var/id = null //change this if youre an annoying mapper who wants multiple pools per area. + var/list/pool = list() + var/desired_temperature = 300 //Room temperature + var/current_temperature = 300 //current temp + var/preset_reagent_type = null //Set this if you want your pump to start filled with a given reagent. SKEWIUM POOL SKEWIUM POOL! + +/obj/machinery/pool_filter/examine(mob/user) + . = ..() + . += "The thermostat on it reads [current_temperature]." + +/obj/machinery/pool_filter/Initialize() + . = ..() + create_reagents(100, OPENCONTAINER) //If you're a terrible terrible clown and want to dump reagents into the pool. + if(preset_reagent_type) + reagents.add_reagent(preset_reagent_type, 100) + var/area/AR = get_area(src) + for(var/turf/open/indestructible/sound/pool/water in get_area_turfs(AR)) + if(id && water.id != id) + continue //Not the same id. Fine. Ignore that one then! + pool += water + GLOB.pool_filters += src + +//Brick can set the pool to low temperatures remotely. This will probably be hell on malf! + +/obj/machinery/pool_filter/attack_robot(mob/user) + . = ..() + wrench_act(user, null) + +/obj/machinery/pool_filter/attack_ai(mob/user) + . = ..() + wrench_act(user, null) + +/obj/machinery/pool_filter/wrench_act(mob/living/user, obj/item/I) + var/newTemp = input(user, "Set a new temperature for [src] (Kelvin).", "[src]", null) as num + if(!newTemp) + return + newTemp = CLAMP(newTemp, T0C, 320) + desired_temperature = newTemp + return FALSE + +/obj/machinery/pool_filter/process(delta_time) + if(!LAZYLEN(pool) || !is_operational()) + return //No use having one of these processing for no reason is there? + use_power(idle_power_usage) + var/delta = ((current_temperature > desired_temperature) ? -0.25 : 0.25 ) * delta_time + current_temperature += delta + current_temperature = CLAMP(current_temperature, T0C, desired_temperature) + var/trans_amount = reagents.total_volume / pool.len //Split up the reagents equally. + for(var/turf/open/indestructible/sound/pool/water as() in pool) + if(reagents.reagent_list.len) + water.set_colour(mix_color_from_reagents(reagents.reagent_list)) + else + water.set_colour("#009999") + if(water.contents.len && reagents.total_volume > 0) + for(var/mob/living/M in water) + if(!istype(M)) + continue + var/datum/reagents/splash_holder = new/datum/reagents(trans_amount) //Take some of our reagents out, react them with the pool denizens. + splash_holder.my_atom = water + reagents.trans_to(splash_holder, trans_amount, transfered_by = src) + splash_holder.chem_temp = current_temperature + if(DT_PROB(80, delta_time)) + splash_holder.reaction(M, TOUCH) + else //Sometimes the water penetrates a lil deeper than just a splosh. + splash_holder.reaction(M, INGEST) + splash_holder.trans_to(M, trans_amount, transfered_by = src) //Actually put reagents in the mob + qdel(splash_holder) + var/mob/living/carbon/C = M + if(current_temperature <= 283.5) //Colder than 10 degrees is going to make you very cold + if(iscarbon(M)) + C.adjust_bodytemperature(-80, 80) + to_chat(M, "The water is freezing cold!") + else if(current_temperature >= 308.5) //Hotter than 35 celsius is going to make you burn up + if(iscarbon(M)) + C.adjust_bodytemperature(35, 0, 500) + M.adjustFireLoss(2.5 * delta_time) + to_chat(M, "The water is searing hot!") + +/obj/structure/pool_ladder/attack_hand(mob/user) + var/datum/component/swimming/S = user.GetComponent(/datum/component/swimming) + if(S) + to_chat(user, "You start to climb out of the pool...") + if(do_after(user, 1 SECONDS, target=src)) + S.RemoveComponent() + visible_message("[user] climbs out of the pool.") + user.forceMove(get_turf(get_step(src, NORTH))) //Ladders shouldn't adjoin another pool section. Ever. + else + to_chat(user, "You start to climb into the pool...") + var/turf/T = get_turf(src) + if(do_after(user, 1 SECONDS, target=src)) + if(!istype(T, /turf/open/indestructible/sound/pool)) //Ugh, fine. Whatever. + user.forceMove(get_turf(src)) + else + var/turf/open/indestructible/sound/pool/P = T + P.splash(user) + +/obj/structure/pool_ladder/attack_robot(mob/user) + . = ..() + attack_hand(user) diff --git a/code/modules/pool/pool_items.dm b/code/modules/pool/pool_items.dm new file mode 100644 index 0000000000000..e6f53786c2c38 --- /dev/null +++ b/code/modules/pool/pool_items.dm @@ -0,0 +1,85 @@ +/obj/item/pool + icon = 'icons/obj/pool.dmi' + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + force = 0 + damtype = STAMINA + w_class = WEIGHT_CLASS_BULKY + block_sound = 'sound/weapons/tap.ogg' + block_level = 1 + block_upgrade_walk = 0 + block_power = 0 + block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY + attack_verb = list("wacked") + +/obj/item/pool/Initialize() + . = ..() + //Pick a random color + add_atom_colour(pick(COLOR_YELLOW, COLOR_LIME, COLOR_RED, COLOR_BLUE_LIGHT, COLOR_CYAN, COLOR_MAGENTA), FIXED_COLOUR_PRIORITY) + +/obj/item/pool/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_unwielded=0, force_wielded=5, \ + wieldsound='sound/weapons/tap.ogg', unwieldsound='sound/weapons/tap.ogg', block_power_wielded=20) + +/obj/item/pool/rubber_ring + name = "inflateable ring" + desc = "An inflateable ring used for keeping people afloat. Throw at drowning people to save them." + icon_state = "rubber_ring" + +/obj/item/pool/rubber_ring/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + if(ishuman(hit_atom)) + var/mob/living/carbon/human/H = hit_atom + //Make sure they are in a pool + if(!istype(get_turf(H), /turf/open/indestructible/sound/pool)) + return + //Make sure they are alive and can pick it up + if(H.stat) + return + //Try shove it in their inventory + if(H.put_in_active_hand(src)) + visible_message("The [src] lands over [H]'s head!") + +/obj/item/pool/pool_noodle + icon_state = "pool_noodle" + lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' + name = "pool noodle" + desc = "A long noodle made of foam. Helping those with fears of swimming swim since the 1980s." + var/suiciding = FALSE + +/obj/item/pool/pool_noodle/attack(mob/target, mob/living/carbon/human/user) + . = ..() + if(ISWIELDED(src) && prob(50)) + INVOKE_ASYNC(src, .proc/jedi_spin, user) + +/obj/item/pool/pool_noodle/proc/jedi_spin(mob/living/user) //rip complex code, but this fucked up blocking + user.emote("flip") + +/obj/item/pool/pool_noodle/suicide_act(mob/user) + if(suiciding) + return SHAME + suiciding = TRUE + user.visible_message("[user] begins kicking their legs to stay afloat!") + var/mob/living/L = user + if(istype(L)) + L.Immobilize(63) + animate(user, time=20, pixel_y=18) + sleep(20) + animate(user, time=10, pixel_y=12) + sleep(10) + user.visible_message("[user] keeps swimming higher and higher!") + animate(user, time=10, pixel_y=22) + sleep(10) + animate(user, time=10, pixel_y=16) + sleep(10) + animate(user, time=15, pixel_y=32) + sleep(15) + user.visible_message("[user] suddenly realised they aren't in the water and cannot float.") + animate(user, time=1, pixel_y=0) + sleep(1) + user.ghostize() + user.gib() + suiciding = FALSE + return MANUAL_SUICIDE diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index f5b30c7e4b9d0..70c1a5b151735 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -35,13 +35,14 @@ . = ..() linked_shielding = list() linked_cores = list() - + investigate_log("has been created.", INVESTIGATE_ENGINES) /obj/machinery/power/am_control_unit/Destroy()//Perhaps damage and run stability checks rather than just del on the others for(var/obj/machinery/am_shielding/AMS in linked_shielding) AMS.control_unit = null qdel(AMS) QDEL_NULL(fueljar) + investigate_log("has been destroyed.", INVESTIGATE_ENGINES) return ..() @@ -239,6 +240,8 @@ /obj/machinery/power/am_control_unit/proc/toggle_power(powerfail = 0) active = !active + investigate_log("turned [active ? "ON" : "OFF"] by [usr ? key_name(usr) : "outside forces"] at [AREACOORD(src)]", INVESTIGATE_ENGINES) + message_admins("Antimatter turned [active ? "ON" : "OFF"] by [usr ? ADMIN_LOOKUPFLW(usr) : "outside forces"] in [ADMIN_VERBOSEJMP(src)]") if(active) use_power = ACTIVE_POWER_USE visible_message("The [src.name] starts up.") @@ -344,11 +347,13 @@ if(href_list["strengthup"]) fuel_injection++ + investigate_log("increased to [fuel_injection] by [key_name(usr)] at [AREACOORD(src)]", INVESTIGATE_ENGINES) if(href_list["strengthdown"]) fuel_injection-- if(fuel_injection < 0) fuel_injection = 0 + investigate_log("decreased to [fuel_injection] by [key_name(usr)] at [AREACOORD(src)]", INVESTIGATE_ENGINES) if(href_list["refreshstability"]) check_core_stability() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index a498c76fafdbc..d6cdc621d3ce2 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -56,6 +56,7 @@ integrity_failure = 50 resistance_flags = FIRE_PROOF interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON + layer = ABOVE_WINDOW_LAYER @@ -165,7 +166,7 @@ if (!req_access) req_access = list(ACCESS_ENGINE_EQUIP) if (!armor) - armor = list("melee" = 20, "bullet" = 20, "laser" = 10, "energy" = 100, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50) + armor = list("melee" = 20, "bullet" = 20, "laser" = 10, "energy" = 100, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50, "stamina" = 0) ..() GLOB.apcs_list += src @@ -212,6 +213,7 @@ area.power_equip = FALSE area.power_environ = FALSE area.power_change() + area.poweralert(FALSE, src) if(occupier) malfvacate(1) qdel(wires) @@ -273,8 +275,8 @@ if(has_electronics && terminal) . += "The cover is [opened==APC_COVER_REMOVED?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"]." else - . += {"It's [ !terminal ? "not" : "" ] wired up.\n - The electronics are[!has_electronics?"n't":""] installed."} + . += "It's [ !terminal ? "not" : "" ] wired up.\n"+\ + "The electronics are[!has_electronics?"n't":""] installed." if(integration_cog || (user.hallucinating() && prob(20))) . += "A small cogwheel is inside of it." @@ -331,12 +333,17 @@ if(update & 2) SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(!(stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD) - SSvis_overlays.add_vis_overlay(src, icon, "apcox-[locked]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco3-[charging]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apcox-[locked]", layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apcox-[locked]", layer, EMISSIVE_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco3-[charging]", layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco3-[charging]", layer, EMISSIVE_PLANE, dir) if(operating) - SSvis_overlays.add_vis_overlay(src, icon, "apco0-[equipment]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco1-[lighting]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco2-[environ]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco0-[equipment]", layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco0-[equipment]", layer, EMISSIVE_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco1-[lighting]", layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco1-[lighting]", layer, EMISSIVE_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco2-[environ]", layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco2-[environ]", layer, EMISSIVE_PLANE, dir) // And now, separately for cleanness, the lighting changing if(update_state & UPSTATE_ALLGOOD) @@ -435,7 +442,7 @@ . = TRUE if (opened) if(integration_cog) - to_chat(user, "You begin prying something out of the APC...") + to_chat(user, "You begin prying something out of the APC.") W.play_tool_sound(src) if(W.use_tool(src, user, 50)) to_chat(user, "You screw up breaking whatever was inside!") @@ -445,7 +452,7 @@ to_chat(user, "Disconnect the wires first!") return W.play_tool_sound(src) - to_chat(user, "You attempt to remove the power control board..." ) + to_chat(user, "You attempt to remove the power control board." ) if(W.use_tool(src, user, 50)) if (has_electronics == APC_ELECTRONICS_INSTALLED) has_electronics = APC_ELECTRONICS_MISSING @@ -526,7 +533,7 @@ return else panel_open = !panel_open - to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"]") + to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"].") update_icon() /obj/machinery/power/apc/wirecutter_act(mob/living/user, obj/item/W) @@ -540,7 +547,7 @@ if(!W.tool_start_check(user, amount=3)) return user.visible_message("[user.name] welds [src].", \ - "You start welding the APC frame...", \ + "You start welding the APC frame.", \ "You hear welding.") if(W.use_tool(src, user, 50, volume=50, amount=3)) if ((stat & BROKEN) || opened==APC_COVER_REMOVED) @@ -598,7 +605,7 @@ to_chat(user, "You need ten lengths of cable for APC!") return user.visible_message("[user.name] adds cables to the APC frame.", \ - "You start adding 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) @@ -622,12 +629,13 @@ return user.visible_message("[user.name] inserts the power control board into [src].", \ - "You start to insert the power control board into the frame...") + "You start to insert the power control board into the frame.") playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) if(do_after(user, 10, target = src)) if(!has_electronics) has_electronics = APC_ELECTRONICS_INSTALLED locked = FALSE + wires.ui_update() to_chat(user, "You place the power control board inside the frame.") qdel(W) else if(istype(W, /obj/item/electroadaptive_pseudocircuit) && opened) @@ -642,6 +650,7 @@ "You adapt a power control board and click it into place in [src]'s guts.") has_electronics = APC_ELECTRONICS_INSTALLED locked = FALSE + wires.ui_update() else if(!cell) if(stat & MAINT) to_chat(user, "There's no connector for a power cell.") @@ -653,7 +662,7 @@ cell = C chargecount = 0 user.visible_message("[user] fabricates a weak power cell and places it into [src].", \ - "Your [P.name] whirrs with strain as you create a weak power cell and place it into [src]!") + "Your [P.name] whirs with strain as you create a weak power cell and place it into [src]!") update_icon() else to_chat(user, "[src] has both electronics and a cell.") @@ -664,7 +673,7 @@ return if (!(stat & BROKEN) && opened==APC_COVER_REMOVED) // Cover is the only thing broken, we do not need to remove elctronicks to replace cover user.visible_message("[user.name] replaces missing APC's cover.",\ - "You begin to replace APC's cover...") + "You begin to replace APC's cover.") if(do_after(user, 20, target = src)) // replacing cover is quicker than replacing whole frame to_chat(user, "You replace missing APC's cover.") qdel(W) @@ -675,7 +684,7 @@ to_chat(user, "You cannot repair this APC until you remove the electronics still inside!") return user.visible_message("[user.name] replaces the damaged APC frame with a new one.",\ - "You begin to replace the damaged APC frame...") + "You begin to replace the damaged APC frame.") if(do_after(user, 50, target = src)) to_chat(user, "You replace the damaged APC frame with a new one.") qdel(W) @@ -693,8 +702,53 @@ else return ..() +/obj/machinery/power/apc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + if(the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS) + if(!has_electronics) + if(stat & BROKEN) + to_chat(user, "[src]'s frame is too damaged to support a circuit.") + return FALSE + return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1) + else if(!cell) + if(stat & MAINT) + to_chat(user, "There's no connector for a power cell.") + return FALSE + return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 50, "cost" = 10) //16 for a wall + else + to_chat(user, "[src] has both electronics and a cell.") + return FALSE + return FALSE + +/obj/machinery/power/apc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_UPGRADE_SIMPLE_CIRCUITS) + if(!has_electronics) + if(stat & BROKEN) + to_chat(user, "[src]'s frame is too damaged to support a circuit.") + return + user.visible_message("[user] fabricates a circuit and places it into [src].", \ + "You adapt a power control board and click it into place in [src]'s guts.") + has_electronics = TRUE + locked = FALSE + return TRUE + else if(!cell) + if(stat & MAINT) + to_chat(user, "There's no connector for a power cell.") + return FALSE + var/obj/item/stock_parts/cell/crap/empty/C = new(src) + C.forceMove(src) + cell = C + chargecount = 0 + user.visible_message("[user] fabricates a weak power cell and places it into [src].", \ + "Your [the_rcd.name] whirrs with strain as you create a weak power cell and place it into [src]!") + update_icon() + return TRUE + else + to_chat(user, "[src] has both electronics and a cell.") + return FALSE + return FALSE + /obj/machinery/power/apc/AltClick(mob/user) - ..() if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc)) return else @@ -712,6 +766,7 @@ else if(allowed(usr) && !wires.is_cut(WIRE_IDSCAN) && !malfhack) locked = !locked + wires.ui_update() to_chat(user, "You [ locked ? "lock" : "unlock"] the APC interface.") update_icon() updateUsrDialog() @@ -758,6 +813,7 @@ playsound(src, "sparks", 75, 1) obj_flags |= EMAGGED locked = FALSE + wires.ui_update() to_chat(user, "You emag the APC interface.") update_icon() @@ -772,51 +828,75 @@ if(isethereal(user)) var/mob/living/carbon/human/H = user var/datum/species/ethereal/E = H.dna.species - if((H.a_intent == INTENT_HARM) && (E.drain_time < world.time)) - if(cell.charge <= (cell.maxcharge / 2)) // if charge is under 50% you shouldn't drain it - to_chat(H, "The APC doesn't have much power, you probably shouldn't drain any.") - return - var/obj/item/organ/stomach/ethereal/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) + if(E.drain_time > world.time) + return + var/obj/item/organ/stomach/battery/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) + if(H.a_intent == INTENT_HARM) if(!istype(stomach)) to_chat(H, "You can't receive charge!") return - if(stomach.crystal_charge >= ETHEREAL_CHARGE_FULL) - to_chat(H, "Your charge is full!") + if(H.nutrition >= NUTRITION_LEVEL_ALMOST_FULL) + to_chat(user, "You are already fully charged!") + return + if(cell.charge <= cell.maxcharge/4) // if charge is under 25% you shouldn't drain it + to_chat(H, "The APC doesn't have much power, you probably shouldn't drain anymore.") return - E.drain_time = world.time + 75 + + E.drain_time = world.time + 80 to_chat(H, "You start channeling some power through the APC into your body.") - if(do_after(user, 75, target = src)) - if(cell.charge <= (cell.maxcharge / 2) || (stomach.crystal_charge >= ETHEREAL_CHARGE_FULL)) - to_chat(H, "You can't receive more charge from the APC.") + while(do_after(user, 75, target = src)) + if(!istype(stomach)) + to_chat(H, "You can't receive charge!") return - to_chat(H, "You receive some charge from the APC.") - stomach.adjust_charge(10) - cell.charge -= 10 - else - to_chat(H, "You fail to receive charge from the APC!") + if(cell.charge <= cell.maxcharge/4) + to_chat(H, "The APC doesn't have much power, you probably shouldn't drain anymore.") + E.drain_time = 0 + return + E.drain_time = world.time + 80 + if(cell.charge > cell.maxcharge/4 + 250) + stomach.adjust_charge(250) + cell.charge -= 250 + to_chat(H, "You receive some charge from the APC.") + else + stomach.adjust_charge(cell.charge - cell.maxcharge/4) + cell.charge = cell.maxcharge/4 + to_chat(H, "The APC doesn't have much power, you probably shouldn't drain anymore.") + E.drain_time = 0 + return + if(stomach.charge >= stomach.max_charge) + to_chat(H, "You are now fully charged.") + E.drain_time = 0 + return + to_chat(H, "You fail to receive charge from the APC!") + E.drain_time = 0 return - if((H.a_intent == INTENT_GRAB) && (E.drain_time < world.time)) - if(cell.charge == cell.maxcharge) - to_chat(H, "The APC is full!") - return - var/obj/item/organ/stomach/ethereal/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) + else if(H.a_intent == INTENT_GRAB) if(!istype(stomach)) to_chat(H, "You can't transfer charge!") return - if(stomach.crystal_charge < 10) - to_chat(H, "Your charge is too low!") - return - E.drain_time = world.time + 75 + E.drain_time = world.time + 80 to_chat(H, "You start channeling power through your body into the APC.") - if(cell.charge == cell.maxcharge || (stomach.crystal_charge < 10)) - to_chat(H, "You can't transfer more charge to the APC.") - return - if(do_after(user, 75, target = src)) - to_chat(H, "You transfer some power to the APC.") - stomach.adjust_charge(-10) - cell.charge += 10 - else - to_chat(H, "You fail to transfer power to the APC!") + while(do_after(user, 75, target = src)) + if(!istype(stomach)) + to_chat(H, "You can't transfer charge!") + return + E.drain_time = world.time + 80 + if(stomach.charge > 250) + to_chat(H, "You transfer some power to the APC.") + stomach.adjust_charge(-250) + cell.charge = min(cell.charge + 250, cell.maxcharge) + else + to_chat(H, "You transfer the last of your charge to the APC.") + cell.charge = min(cell.charge + stomach.charge, cell.maxcharge) + stomach.set_charge(0) + E.drain_time = 0 + return + if(cell.charge >= cell.maxcharge) + to_chat(H, "The APC is now fully recharged.") + E.drain_time = 0 + return + to_chat(H, "You fail to transfer power to the APC!") + E.drain_time = 0 return if(opened && (!issilicon(user))) @@ -831,12 +911,17 @@ if((stat & MAINT) && !opened) //no board; no interface return +/obj/machinery/power/apc/eminence_act(mob/living/simple_animal/eminence/eminence) + . = ..() + ui_interact(eminence) /obj/machinery/power/apc/ui_state(mob/user) if(isAI(user)) var/mob/living/silicon/ai/AI = user if(AI.apc_override == src) return GLOB.conscious_state + if(iseminence(user) && integration_cog) + return GLOB.conscious_state return GLOB.default_state /obj/machinery/power/apc/ui_interact(mob/user, datum/tgui/ui) @@ -845,6 +930,7 @@ if(!ui) ui = new(user, src, "Apc") ui.open() + ui.set_autoupdate(TRUE) // Power level, reboot timer /obj/machinery/power/apc/ui_data(mob/user) var/list/data = list( @@ -956,8 +1042,20 @@ . = UI_INTERACTIVE /obj/machinery/power/apc/ui_act(action, params) - if(..() || !can_use(usr, 1) || (locked && !usr.has_unlimited_silicon_privilege && !failure_timer)) + if(..() || !can_use(usr, 1)) return + + switch(action) + if("reboot") + if(failure_timer) + failure_timer = 0 + update_icon() + update() + . = TRUE + + if(locked && !usr.has_unlimited_silicon_privilege) + return + switch(action) if("lock") if(usr.has_unlimited_silicon_privilege) @@ -995,6 +1093,8 @@ environ = setsubsystem(text2num(params["env"])) update_icon() update() + else + return FALSE . = TRUE if("overload") if(usr.has_unlimited_silicon_privilege) @@ -1003,16 +1103,15 @@ if("hack") if(get_malf_status(usr)) malfhack(usr) + . = TRUE if("occupy") if(get_malf_status(usr)) malfoccupy(usr) + . = TRUE if("deoccupy") if(get_malf_status(usr)) malfvacate() - if("reboot") - failure_timer = 0 - update_icon() - update() + . = TRUE if("emergency_lighting") emergency_lights = !emergency_lights for(var/obj/machinery/light/L in area) @@ -1020,9 +1119,12 @@ L.no_emergency = emergency_lights INVOKE_ASYNC(L, /obj/machinery/light/.proc/update, FALSE) CHECK_TICK - return 1 + . = TRUE + + if(.) + wires.ui_update() // I don't know why this would be here, but I'm too scared to remove it -/obj/machinery/power/apc/ui_close(mob/user) +/obj/machinery/power/apc/ui_close(mob/user, datum/tgui/tgui) if(isAI(user)) var/mob/living/silicon/ai/AI = user if(AI.apc_override == src) @@ -1049,8 +1151,8 @@ malf.malfhack = src malf.malfhacking = addtimer(CALLBACK(malf, /mob/living/silicon/ai/.proc/malfhacked, src), 600, TIMER_STOPPABLE) - var/obj/screen/alert/hackingapc/A - A = malf.throw_alert("hackingapc", /obj/screen/alert/hackingapc) + var/atom/movable/screen/alert/hackingapc/A + A = malf.throw_alert("hackingapc", /atom/movable/screen/alert/hackingapc) A.target = src /obj/machinery/power/apc/proc/malfoccupy(mob/living/silicon/ai/malf) @@ -1076,7 +1178,7 @@ occupier.eyeobj.name = "[occupier.name] (AI Eye)" if(malf.parent) qdel(malf) - occupier.verbs += /mob/living/silicon/ai/proc/corereturn + occupier.add_verb(/mob/living/silicon/ai/proc/corereturn) occupier.cancel_camera() @@ -1088,7 +1190,7 @@ occupier.parent.shunted = 0 occupier.parent.setOxyLoss(occupier.getOxyLoss()) occupier.parent.cancel_camera() - occupier.parent.verbs -= /mob/living/silicon/ai/proc/corereturn + occupier.parent.remove_verb(/mob/living/silicon/ai/proc/corereturn) qdel(occupier) else to_chat(occupier, "Primary core damaged, unable to return core processes.") @@ -1135,7 +1237,7 @@ to_chat(occupier, "[user] moved away! Transfer canceled.") transfer_in_progress = FALSE return - to_chat(user, "AI accepted request. Transferring stored intelligence to [card]...") + to_chat(user, "AI accepted request. Transferring stored intelligence to [card].") to_chat(occupier, "Transfer starting. You will be moved to [card] shortly.") if(!do_after(user, 50, target = src)) to_chat(occupier, "[user] was interrupted! Transfer canceled.") @@ -1240,28 +1342,31 @@ else if(longtermpower > -10) longtermpower -= 2 + var/power_alert_fine = TRUE + 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) + power_alert_fine = FALSE 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) + power_alert_fine = FALSE else if(cell.percent() < 30 && longtermpower < 0) // <30%, turn off equipment equipment = autoset(equipment, 2) lighting = autoset(lighting, 1) environ = autoset(environ, 1) - area.poweralert(0, src) + power_alert_fine = FALSE else // otherwise all can be on equipment = autoset(equipment, 1) lighting = autoset(lighting, 1) environ = autoset(environ, 1) - area.poweralert(1, src) - if(cell.percent() > 75) - area.poweralert(1, src) + + if(integration_cog) + power_alert_fine = TRUE + area.poweralert(power_alert_fine, src) // now trickle-charge the cell if(chargemode && charging == APC_CHARGING && operating) @@ -1352,6 +1457,7 @@ environ = 3 update_icon() update() + wires.ui_update() // damage and destruction acts /obj/machinery/power/apc/emp_act(severity) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index d37f9f1ba1aab..5ba4c503873cc 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -46,7 +46,6 @@ By design, d1 is the smallest direction and d2 is the highest var/d1 = 0 // cable direction 1 (see above) var/d2 = 1 // cable direction 2 (see above) var/datum/powernet/powernet - var/obj/item/stack/cable_coil/stored FASTDMM_PROP(\ pipe_type = PIPE_TYPE_CABLE,\ @@ -99,11 +98,6 @@ By design, d1 is the smallest direction and d2 is the highest hide(T.intact) GLOB.cable_list += src //add it to the global cable list - if(d1) - stored = new/obj/item/stack/cable_coil(null,2,cable_color) - else - stored = new/obj/item/stack/cable_coil(null,1,cable_color) - var/list/cable_colors = GLOB.cable_colors cable_color = param_color || cable_color || pick(cable_colors) if(cable_colors[cable_color]) @@ -114,22 +108,15 @@ By design, d1 is the smallest direction and d2 is the highest if(powernet) cut_cable_from_powernet() // update the powernets GLOB.cable_list -= src //remove it from global cable list - - //If we have a stored item at this point, lets just delete it, since that should be - //handled by deconstruction - if(stored) - QDEL_NULL(stored) return ..() // then go ahead and delete the cable /obj/structure/cable/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) var/turf/T = get_turf(loc) if(T) - stored.forceMove(T) - stored = null - else - qdel(stored) - qdel(src) + var/obj/item/stack/cable_coil/temp_item = new /obj/item/stack/cable_coil(T, d1 ? 2 : 1, cable_color) + transfer_fingerprints_to(temp_item) + ..() /////////////////////////////////// // General procedures @@ -155,7 +142,6 @@ By design, d1 is the smallest direction and d2 is the highest if (shock(user, 50)) return user.visible_message("[user] cuts the cable.", "You cut the cable.") - stored.add_fingerprint(user) investigate_log("was cut by [key_name(usr)] in [AREACOORD(src)]", INVESTIGATE_WIRES) deconstruct() return @@ -167,17 +153,14 @@ By design, d1 is the smallest direction and d2 is the highest return coil.cable_join(src, user) - else if(istype(W, /obj/item/twohanded/rcl)) - var/obj/item/twohanded/rcl/R = W + else if(istype(W, /obj/item/rcl)) + var/obj/item/rcl/R = W if(R.loaded) R.loaded.cable_join(src, user) R.is_empty(user) else if(W.tool_behaviour == TOOL_MULTITOOL) - if(powernet && (powernet.avail > 0)) // is it powered? - to_chat(user, "Total power: [DisplayPower(powernet.avail)]\nLoad: [DisplayPower(powernet.load)]\nExcess power: [DisplayPower(surplus())]") - else - to_chat(user, "The cable is not powered.") + to_chat(user, get_power_info()) shock(user, 5, 0.2) add_fingerprint(user) @@ -190,6 +173,10 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/attackby(obj/item/W, mob/user, params) handlecable(W, user, params) +/obj/structure/cable/examine(mob/user) + . = ..() + if(isobserver(user)) + . += get_power_info() // shock the user with probability prb /obj/structure/cable/proc/shock(mob/user, prb, siemens_coeff = 1) @@ -206,10 +193,11 @@ By design, d1 is the smallest direction and d2 is the highest if(current_size >= STAGE_FIVE) deconstruct() -/obj/structure/cable/proc/update_stored(length = 1, colorC = "red") - stored.amount = length - stored.item_color = colorC - stored.update_icon() +/obj/structure/cable/proc/get_power_info() + if(powernet && (powernet.avail > 0)) // is it powered? + return "Total power: [DisplayPower(powernet.avail)]\nLoad: [DisplayPower(powernet.load)]\nExcess power: [DisplayPower(surplus())]" + else + return "The cable is not powered." //////////////////////////////////////////// // Power related @@ -752,9 +740,6 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai C.d1 = nd1 C.d2 = nd2 - //updates the stored cable coil - C.update_stored(2, item_color) - C.add_fingerprint(user) C.update_icon() diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index d17bfecfe363b..63b5b34b812f5 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -48,9 +48,9 @@ STOP_PROCESSING(SSobj, src) . = ..() -/obj/item/stock_parts/cell/process() +/obj/item/stock_parts/cell/process(delta_time) if(self_recharge) - give(chargerate * 0.25) + give(chargerate * 0.125 * delta_time) else return PROCESS_KILL @@ -154,31 +154,42 @@ var/datum/species/ethereal/E = H.dna.species if(E.drain_time > world.time) return - if(charge < 100) - to_chat(H, "The [src] doesn't have enough power!") - return - var/obj/item/organ/stomach/ethereal/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/battery/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) if(!istype(stomach)) to_chat(H, "You can't receive charge!") return - if(stomach.crystal_charge >= ETHEREAL_CHARGE_FULL) - to_chat(H, "Your charge is full!") + if(H.nutrition >= NUTRITION_LEVEL_ALMOST_FULL) + to_chat(user, "You are already fully charged!") return + to_chat(H, "You clumsily channel power through the [src] and into your body, wasting some in the process.") - E.drain_time = world.time + 20 - if((charge < 100) || (stomach.crystal_charge >= ETHEREAL_CHARGE_FULL)) - return - if(do_after(user, 20, target = src)) - to_chat(H, "You receive some charge from the [src].") - stomach.adjust_charge(3) - charge -= 100 //you waste way more than you receive, so that ethereals cant just steal one cell and forget about hunger - else - to_chat(H, "You fail to receive charge from the [src]!") + E.drain_time = world.time + 25 + while(do_after(user, 20, target = src)) + if(!istype(stomach)) + to_chat(H, "You can't receive charge!") + return + E.drain_time = world.time + 25 + if(charge > 300) + stomach.adjust_charge(75) + charge -= 300 //you waste way more than you receive, so that ethereals cant just steal one cell and forget about hunger + to_chat(H, "You receive some charge from the [src].") + else + stomach.adjust_charge(charge/4) + charge = 0 + to_chat(H, "You drain the [src].") + E.drain_time = 0 + return + + if(stomach.charge >= stomach.max_charge) + to_chat(H, "You are now fully charged.") + E.drain_time = 0 + return + to_chat(H, "You fail to receive charge from the [src]!") + E.drain_time = 0 return - /obj/item/stock_parts/cell/blob_act(obj/structure/blob/B) - ex_act(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += src /obj/item/stock_parts/cell/proc/get_electrocute_damage() if(charge >= 1000) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 58255da8e105b..e7fc2cb018e9c 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -225,6 +225,11 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne return ..() +/obj/machinery/gravity_generator/main/ui_requires_update(mob/user, datum/tgui/ui) + . = ..() + if(charging_state != POWER_IDLE && !(stat & BROKEN)) + . = TRUE // Autoupdate while charging up/down + /obj/machinery/gravity_generator/main/ui_state(mob/user) return GLOB.default_state @@ -306,7 +311,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne update_icon() update_list() - src.updateUsrDialog() + ui_update() if(alert) shake_everyone() @@ -329,7 +334,6 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne if(charge_count % 4 == 0 && prob(75)) // Let them know it is charging/discharging. playsound(src.loc, 'sound/effects/empulse.ogg', 100, 1) - updateDialog() if(prob(25)) // To help stop "Your clothes feel warm." spam. pulse_radiation() @@ -363,9 +367,9 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne var/sound/alert_sound = sound('sound/effects/alert.ogg') for(var/i in GLOB.mob_list) var/mob/M = i - if(M.z != z && !(ztrait && SSmapping.level_trait(z, ztrait) && SSmapping.level_trait(M.z, ztrait))) + if(M.get_virtual_z_level() != get_virtual_z_level() && !(ztrait && SSmapping.level_trait(z, ztrait) && SSmapping.level_trait(M.z, ztrait))) continue - M.update_gravity(M.mob_has_gravity()) + M.update_gravity(M.has_gravity()) if(M.client) shake_camera(M, 15, 1) M.playsound_local(T, null, 100, 1, 0.5, S = alert_sound) @@ -374,8 +378,8 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne var/turf/T = get_turf(src) if(!T) return 0 - if(GLOB.gravity_generators["[T.z]"]) - return length(GLOB.gravity_generators["[T.z]"]) + if(GLOB.gravity_generators["[T.get_virtual_z_level()]"]) + return length(GLOB.gravity_generators["[T.get_virtual_z_level()]"]) return 0 /obj/machinery/gravity_generator/main/proc/update_list() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index c40e008f888c5..1400469d3114d 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -44,7 +44,7 @@ anchored = TRUE layer = WALL_OBJ_LAYER max_integrity = 200 - armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) + armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50, "stamina" = 0) var/stage = 1 var/fixture_type = "tube" @@ -213,7 +213,7 @@ var/static_power_used = 0 var/brightness = 10 // luminosity when on, also used in power calculation var/bulb_power = 1 // basically the alpha of the emitted light source - var/bulb_colour = "#FFF6ED" // befault colour of the light. + var/bulb_colour = "#FFF6ED" // default colour of the light. var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN var/flickering = FALSE var/light_type = /obj/item/light/tube // the type of light item @@ -241,6 +241,7 @@ var/bulb_vacuum_colour = "#4F82FF" // colour of the light when air alarm is set to severe var/bulb_vacuum_brightness = 8 + var/static/list/lighting_overlays // dictionary for lighting overlays /obj/machinery/light/broken status = LIGHT_BROKEN @@ -298,7 +299,7 @@ brightness = A.lighting_brightness_bulb else bulb_colour = A.lighting_colour_tube - brightness = A.lighting_brightness_bulb + brightness = A.lighting_brightness_tube if(nightshift_light_color == initial(nightshift_light_color)) nightshift_light_color = A.lighting_colour_night @@ -313,11 +314,11 @@ spawn(2) switch(fitting) if("tube") - brightness = 11 + brightness = A.lighting_brightness_tube if(prob(2)) break_light_tube(1) if("bulb") - brightness = 6 + brightness = A.lighting_brightness_bulb if(prob(5)) break_light_tube(1) spawn(1) @@ -331,8 +332,7 @@ QDEL_NULL(cell) return ..() -/obj/machinery/light/update_icon() - cut_overlays() +/obj/machinery/light/update_icon_state() switch(status) // set icon_states if(LIGHT_OK) var/area/A = get_area(src) @@ -342,17 +342,25 @@ icon_state = "[base_state]_vacuum" else icon_state = "[base_state]" - if(on) - var/mutable_appearance/glowybit = mutable_appearance(overlayicon, base_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) - glowybit.alpha = CLAMP(light_power*250, 30, 200) - add_overlay(glowybit) if(LIGHT_EMPTY) icon_state = "[base_state]-empty" if(LIGHT_BURNED) icon_state = "[base_state]-burned" if(LIGHT_BROKEN) icon_state = "[base_state]-broken" - return + +/obj/machinery/light/update_overlays() + . = ..() + if(on || emergency_mode) + if(!lighting_overlays) + lighting_overlays = list() + var/mutable_appearance/LO = lighting_overlays["[base_state]-[light_power]-[light_color]"] + if(!LO) + LO = mutable_appearance(overlayicon, base_state, layer, EMISSIVE_PLANE) + LO.color = light_color + LO.alpha = clamp(light_power*255, 30, 200) + lighting_overlays["[base_state]-[light_power]-[light_color]"] = LO + . += LO // update the icon_state and luminosity of the light depending on its state /obj/machinery/light/proc/update(trigger = TRUE) @@ -375,20 +383,21 @@ else if (nightshift_enabled) BR = nightshift_brightness PO = nightshift_light_power - CO = nightshift_light_color + if(!color) + CO = nightshift_light_color var/matching = light && BR == light.light_range && PO == light.light_power && CO == light.light_color if(!matching) switchcount++ if(rigged) if(status == LIGHT_OK && trigger) explode() - else if( prob( min(60, (switchcount^2)*0.01) ) ) + else if( prob( min(60, (switchcount**2)*0.01) ) ) if(trigger) burn_out() else use_power = ACTIVE_POWER_USE set_light(BR, PO, CO) - else if(has_emergency_power(LIGHT_EMERGENCY_POWER_USE) && !turned_off()) + else if(use_emergency_power(LIGHT_EMERGENCY_POWER_USE) && !turned_off()) use_power = IDLE_POWER_USE emergency_mode = TRUE START_PROCESSING(SSmachines, src) @@ -542,7 +551,7 @@ drop_light_tube() new /obj/item/stack/cable_coil(loc, 1, "red") transfer_fingerprints_to(newlight) - if(cell) + if(!QDELETED(cell)) newlight.cell = cell cell.forceMove(newlight) cell = null @@ -654,20 +663,34 @@ var/mob/living/carbon/human/H = user if(istype(H)) - var/datum/species/ethereal/eth_species = H.dna?.species - if(istype(eth_species)) + if(isethereal(H)) var/datum/species/ethereal/E = H.dna.species if(E.drain_time > world.time) return + var/obj/item/organ/stomach/battery/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) + if(!istype(stomach)) + to_chat(H, "You can't receive charge!") + return + if(H.nutrition >= NUTRITION_LEVEL_ALMOST_FULL) + to_chat(user, "You are already fully charged!") + return + to_chat(H, "You start channeling some power through the [fitting] into your body.") - E.drain_time = world.time + 30 - if(do_after(user, 30, target = src)) - var/obj/item/organ/stomach/ethereal/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) - if(istype(stomach)) - to_chat(H, "You receive some charge from the [fitting].") - stomach.adjust_charge(2) - else - to_chat(H, "You fail to receive charge from the [fitting]!") + E.drain_time = world.time + 35 + while(do_after(user, 30, target = src)) + E.drain_time = world.time + 35 + if(!istype(stomach)) + to_chat(H, "You can't receive charge!") + return + to_chat(H, "You receive some charge from the [fitting].") + stomach.adjust_charge(50) + use_power(50) + if(stomach.charge >= stomach.max_charge) + to_chat(H, "You are now fully charged.") + E.drain_time = 0 + return + to_chat(H, "You fail to receive charge from the [fitting]!") + E.drain_time = 0 return if(H.gloves) @@ -749,7 +772,12 @@ /obj/machinery/light/tesla_act(power, tesla_flags) if(tesla_flags & TESLA_MACHINE_EXPLOSIVE) - explosion(src,0,0,0,flame_range = 5, adminlog = 0) + //Fire can cause a lot of lag, just do a mini explosion. + explosion(src,0,0,1, adminlog = 0) + for(var/mob/living/L in range(3, src)) + L.fire_stacks = max(L.fire_stacks, 3) + L.IgniteMob() + L.electrocute_act(0, "Tesla Light Zap", tesla_shock = TRUE, stun = TRUE) qdel(src) else return ..() @@ -776,6 +804,10 @@ sleep(1) qdel(src) +/obj/machinery/light/eminence_act(mob/living/simple_animal/eminence/eminence) + . = ..() + break_light_tube() + // the light item // can be tube or bulb subtypes // will fit into empty /obj/machinery/light of the corresponding type diff --git a/code/modules/power/monitor.dm b/code/modules/power/monitor.dm index 55b5634aeb163..15b7023752cb7 100644 --- a/code/modules/power/monitor.dm +++ b/code/modules/power/monitor.dm @@ -93,6 +93,7 @@ if(!ui) ui = new(user, src, "PowerMonitor") ui.open() + ui.set_autoupdate(TRUE) // Power in powernet /obj/machinery/computer/monitor/ui_data() var/datum/powernet/connected_powernet = get_powernet() @@ -112,6 +113,8 @@ var/cell_charge if(!A.cell) cell_charge = 0 + else if(A.integration_cog) + cell_charge = 100 else cell_charge = A.cell.percent() data["areas"] += list(list( diff --git a/code/modules/power/multiz.dm b/code/modules/power/multiz.dm index fde88209e2e20..7de433ef9663d 100644 --- a/code/modules/power/multiz.dm +++ b/code/modules/power/multiz.dm @@ -107,26 +107,39 @@ /obj/machinery/power/deck_relay/Initialize() . = ..() - addtimer(CALLBACK(src, .proc/find_relays), 30) - addtimer(CALLBACK(src, .proc/refresh), 50) //Wait a bit so we can find the one below, then get powering + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/power/deck_relay/LateInitialize() + . = ..() + find_relays() + refresh() ///Handles re-acquiring + merging powernets found by find_relays() -/obj/machinery/power/deck_relay/proc/refresh() +/obj/machinery/power/deck_relay/proc/refresh(failures = 0) if(above) - above.merge(src) + above.merge(src, failures) if(below) - below.merge(src) + below.merge(src, failures) ///Merges the two powernets connected to the deck relays -/obj/machinery/power/deck_relay/proc/merge(var/obj/machinery/power/deck_relay/DR) +/obj/machinery/power/deck_relay/proc/merge(var/obj/machinery/power/deck_relay/DR, failures = 0) if(!DR) return var/turf/merge_from = get_turf(DR) var/turf/merge_to = get_turf(src) + if(failures > 5) + message_admins("Failed to merge powernet at [ADMIN_COORDJMP(merge_to)] after 5 attempts.") + return var/obj/structure/cable/C = merge_from.get_cable_node() var/obj/structure/cable/XR = merge_to.get_cable_node() if(C && XR) - merge_powernets(XR.powernet,C.powernet)//Bridge the powernets. + if(!XR.powernet || !C.powernet) + //Try again in 10 seconds. + addtimer(CALLBACK(src, .proc/refresh, failures + 1), 10 SECONDS) + return + merge_powernets(XR.powernet,C.powernet) + else + stack_trace("Multi-z power adapter failed to merge powernets at [COORD(merge_to)] due to not being able to find a power node.") ///Locates relays that are above and below this object /obj/machinery/power/deck_relay/proc/find_relays() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 6166ab6a279bc..52a1dc9f10c05 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -121,7 +121,7 @@ if(anchored) . += "It is anchored to the ground." if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Fuel efficiency increased by [(consumption*100)-100]%." + . += "The status display reads: Fuel efficiency increased by [(consumption*100)-100]%." /obj/machinery/power/port_gen/pacman/HasFuel() if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left) @@ -228,6 +228,7 @@ if(!ui) ui = new(user, src, "PortableGenerator") ui.open() + ui.set_autoupdate(TRUE) // Fuel left, power generated, power in powernet, current heat(?) /obj/machinery/power/port_gen/pacman/ui_data() var/data = list() diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 8cf463c296ec8..2974a54625125 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -104,9 +104,12 @@ /obj/machinery/proc/removeStaticPower(value, powerchannel) addStaticPower(-value, powerchannel) -/obj/machinery/proc/power_change() // called whenever the power settings of the containing area change - // by default, check equipment channel & set flag - // can override if needed +// called whenever the power settings of the containing area change +// by default, check equipment channel & set flag +// can override if needed +/obj/machinery/proc/power_change() + SIGNAL_HANDLER + if(powered(power_channel)) stat &= ~NOPOWER else @@ -201,6 +204,11 @@ . += C return . +/obj/machinery/power/lateShuttleMove(turf/oldT, list/movement_force, move_dir) + . = ..() + disconnect_from_network() + connect_to_network() + /////////////////////////////////////////// // GLOBAL PROCS for powernets handling ////////////////////////////////////////// @@ -256,14 +264,13 @@ worklist |= C.get_connections() //get adjacents power objects, with or without a powernet else if(P.anchored && istype(P, /obj/machinery/power)) - var/obj/machinery/power/M = P - found_machines |= M //we wait until the powernet is fully propagates to connect the machines + found_machines |= P //we wait until the powernet is fully propagates to connect the machines else continue //now that the powernet is set, connect found machines to it - for(var/obj/machinery/power/PM in found_machines) + for(var/obj/machinery/power/PM as() in found_machines) if(!PM.connect_to_network()) //couldn't find a node on its turf... PM.disconnect_from_network() //... so disconnect if already on a powernet @@ -294,7 +301,7 @@ //Determines how strong could be shock, deals damage to mob, uses power. //M is a mob who touched wire/whatever -//power_source is a source of electricity, can be powercell, area, apc, cable, powernet or null +//power_source is a source of electricity, can be power cell, area, apc, cable, powernet or null //source is an object caused electrocuting (airlock, grille, etc) //siemens_coeff - layman's terms, conductivity //dist_check - set to only shock mobs within 1 of source (vendors, airlocks, etc.) diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index 15b950c996e29..fef9b902c937f 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -39,7 +39,7 @@ /obj/machinery/power/rtg/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Power generation now at [power_gen*0.001]kW." + . += "The status display reads: Power generation now at [power_gen*0.001]kW." /obj/machinery/power/rtg/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-open", initial(icon_state), I)) diff --git a/code/modules/power/singularity/boh_tear.dm b/code/modules/power/singularity/boh_tear.dm index 684776d8485c5..9d337c25887d6 100644 --- a/code/modules/power/singularity/boh_tear.dm +++ b/code/modules/power/singularity/boh_tear.dm @@ -6,6 +6,7 @@ desc = "Your own comprehension of reality starts bending as you stare this." icon = 'icons/effects/96x96.dmi' icon_state = "boh_tear" + is_real = FALSE pixel_x = -32 pixel_y = -32 dissipate = 0 @@ -19,7 +20,7 @@ /obj/singularity/boh_tear/Initialize() . = ..() - old_loc = loc + old_loc = get_turf(src) addtimer(CALLBACK(src, /atom/movable.proc/moveToNullspace), 5 SECONDS) // vanishes after 5 seconds QDEL_IN(src, 10 MINUTES) @@ -52,7 +53,7 @@ if(isliving(AM)) var/mob/living/M = AM var/turf/T = get_turf(src) - investigate_log("([key_name(A)]) has been consumed by the BoH tear at [AREACOORD(T)].", INVESTIGATE_SINGULO) + investigate_log("([key_name(A)]) has been consumed by the BoH tear at [AREACOORD(T)].", INVESTIGATE_ENGINES) M.ghostize(FALSE) else if(!isobj(AM)) return @@ -61,7 +62,7 @@ /obj/singularity/boh_tear/admin_investigate_setup() var/turf/T = get_turf(src) message_admins("A BoH tear has been created at [ADMIN_VERBOSEJMP(T)]. [ADMIN_RETRIEVE_BOH_ITEMS(src)]") - investigate_log("was created at [AREACOORD(T)].", INVESTIGATE_SINGULO) + investigate_log("was created at [AREACOORD(T)].", INVESTIGATE_ENGINES) /obj/singularity/boh_tear/attack_tk(mob/living/user) if(!istype(user)) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index e208f436c42a6..427d70b8d678d 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -5,6 +5,7 @@ #define RAD_COLLECTOR_MINING_CONVERSION_RATE 0.00001 //This is gonna need a lot of tweaking to get right. This is the number used to calculate the conversion of watts to research points per process() #define RAD_COLLECTOR_OUTPUT min(stored_energy, (stored_energy*RAD_COLLECTOR_STORED_OUT)+1000) //Produces at least 1000 watts if it has more than that stored + /obj/machinery/power/rad_collector name = "Radiation Collector Array" desc = "A device which uses Hawking Radiation and plasma to produce power." @@ -22,44 +23,54 @@ var/stored_energy = 0 var/active = 0 var/locked = FALSE - var/drainratio = 1 - var/powerproduction_drain = 0.001 - + var/drainratio = 0.5 + var/powerproduction_drain = 0.01 var/bitcoinproduction_drain = 0.15 var/bitcoinmining = FALSE + var/obj/item/radio/radio +/obj/machinery/power/rad_collector/Initialize() + . = ..() + + radio = new(src) + radio.keyslot = new /obj/item/encryptionkey/headset_eng + radio.subspace_transmission = TRUE + radio.canhear_range = 0 + radio.recalculateChannels() /obj/machinery/power/rad_collector/anchored anchored = TRUE /obj/machinery/power/rad_collector/Destroy() + QDEL_NULL(radio) return ..() -/obj/machinery/power/rad_collector/process() +/obj/machinery/power/rad_collector/process(delta_time) if(!loaded_tank) return if(!bitcoinmining) - if(loaded_tank.air_contents.get_moles(/datum/gas/plasma) < 0.0001) - investigate_log("out of fuel.", INVESTIGATE_SINGULO) + if(loaded_tank.air_contents.get_moles(GAS_PLASMA) < 0.0001) + investigate_log("out of fuel.", INVESTIGATE_ENGINES) playsound(src, 'sound/machines/ding.ogg', 50, 1) + var/msg = "Plasma depleted, recommend replacing tank." + radio.talk_into(src, msg, RADIO_CHANNEL_ENGINEERING) eject() else - var/gasdrained = min(powerproduction_drain*drainratio,loaded_tank.air_contents.get_moles(/datum/gas/plasma)) - loaded_tank.air_contents.adjust_moles(/datum/gas/plasma, -gasdrained) - loaded_tank.air_contents.adjust_moles(/datum/gas/tritium, gasdrained) - + var/gasdrained = min(powerproduction_drain*drainratio*delta_time,loaded_tank.air_contents.get_moles(GAS_PLASMA)) + loaded_tank.air_contents.adjust_moles(GAS_PLASMA, -gasdrained) + loaded_tank.air_contents.adjust_moles(GAS_TRITIUM, gasdrained) var/power_produced = RAD_COLLECTOR_OUTPUT add_avail(power_produced) stored_energy-=power_produced else if(is_station_level(z) && SSresearch.science_tech) - if(!loaded_tank.air_contents.get_moles(/datum/gas/tritium) || !loaded_tank.air_contents.get_moles(/datum/gas/oxygen)) + if(!loaded_tank.air_contents.get_moles(GAS_TRITIUM) || !loaded_tank.air_contents.get_moles(GAS_O2)) playsound(src, 'sound/machines/ding.ogg', 50, 1) eject() else - var/gasdrained = bitcoinproduction_drain*drainratio - loaded_tank.air_contents.adjust_moles(/datum/gas/tritium, -gasdrained) - loaded_tank.air_contents.adjust_moles(/datum/gas/oxygen, -gasdrained) - loaded_tank.air_contents.adjust_moles(/datum/gas/carbon_dioxide, gasdrained*2) + var/gasdrained = bitcoinproduction_drain*drainratio*delta_time + loaded_tank.air_contents.adjust_moles(GAS_TRITIUM, -gasdrained) + loaded_tank.air_contents.adjust_moles(GAS_O2, -gasdrained) + loaded_tank.air_contents.adjust_moles(GAS_CO2, gasdrained*2) var/bitcoins_mined = RAD_COLLECTOR_OUTPUT var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG) if(D) @@ -73,8 +84,8 @@ toggle_power() user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \ "You turn the [src.name] [active? "on":"off"].") - var/fuel = loaded_tank.air_contents.get_moles(/datum/gas/plasma) - investigate_log("turned [active?"on":"off"] by [key_name(user)]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"It is empty"].", INVESTIGATE_SINGULO) + var/fuel = loaded_tank?.air_contents.get_moles(GAS_PLASMA) + investigate_log("turned [active?"on":"off"] by [key_name(user)]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"It is empty"].", INVESTIGATE_ENGINES) return else to_chat(user, "The controls are locked!") diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 87bf530bd5db8..4bbe7770424c4 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -16,7 +16,7 @@ use_power = NO_POWER_USE idle_power_usage = 10 - active_power_usage = 300 + active_power_usage = 600 var/icon_state_on = "emitter_+a" var/icon_state_underpowered = "emitter_+u" @@ -92,7 +92,7 @@ /obj/machinery/power/emitter/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Emitting one beam each [fire_delay*0.1] seconds.
Power consumption at [active_power_usage]W." + . += "The status display reads: Emitting one beam each [fire_delay*0.1] seconds.
Power consumption at [active_power_usage]W.
" /obj/machinery/power/emitter/ComponentInitialize() . = ..() @@ -109,7 +109,7 @@ var/turf/T = get_turf(src) message_admins("Emitter deleted at [ADMIN_VERBOSEJMP(T)]") log_game("Emitter deleted at [AREACOORD(T)]") - investigate_log("deleted at [AREACOORD(T)]", INVESTIGATE_SINGULO) + investigate_log("deleted at [AREACOORD(T)]", INVESTIGATE_ENGINES) QDEL_NULL(sparks) return ..() @@ -126,7 +126,7 @@ /obj/machinery/power/emitter/interact(mob/user) add_fingerprint(user) if(state == EMITTER_WELDED) - if(!powernet) + if(!powernet && active_power_usage) to_chat(user, "\The [src] isn't connected to a wire!") return TRUE if(!locked && allow_switch_interact) @@ -141,7 +141,7 @@ message_admins("Emitter turned [active ? "ON" : "OFF"] by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(src)]") log_game("Emitter turned [active ? "ON" : "OFF"] by [key_name(user)] in [AREACOORD(src)]") - investigate_log("turned [active ? "ON" : "OFF"] by [key_name(user)] at [AREACOORD(src)]", INVESTIGATE_SINGULO) + investigate_log("turned [active ? "ON" : "OFF"] by [key_name(user)] at [AREACOORD(src)]", INVESTIGATE_ENGINES) update_icon() @@ -161,7 +161,7 @@ if(!anchored) step(src, get_dir(M, src)) -/obj/machinery/power/emitter/process() +/obj/machinery/power/emitter/process(delta_time) if(stat & (BROKEN)) return if(state != EMITTER_WELDED || (!powernet && active_power_usage)) @@ -174,16 +174,16 @@ if(!powered) powered = TRUE update_icon() - investigate_log("regained power and turned ON at [AREACOORD(src)]", INVESTIGATE_SINGULO) + investigate_log("regained power and turned ON at [AREACOORD(src)]", INVESTIGATE_ENGINES) else if(powered) powered = FALSE update_icon() - investigate_log("lost power and turned OFF at [AREACOORD(src)]", INVESTIGATE_SINGULO) + investigate_log("lost power and turned OFF at [AREACOORD(src)]", INVESTIGATE_ENGINES) log_game("Emitter lost power in [AREACOORD(src)]") return if(charge <= 80) - charge += 5 + charge += 2.5 * delta_time if(!check_delay() || manual == TRUE) return FALSE fire_beam() @@ -353,8 +353,7 @@ return locked = FALSE obj_flags |= EMAGGED - if(user) - user.visible_message("[user.name] emags [src].","You short out the lock.") + user?.visible_message("[user.name] emags [src].","You short out the lock.") /obj/machinery/power/emitter/prototype @@ -384,7 +383,7 @@ auto.Remove(buckled_mob) . = ..() -/obj/machinery/power/emitter/prototype/user_buckle_mob(mob/living/M, mob/living/carbon/user) +/obj/machinery/power/emitter/prototype/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE) if(user.incapacitated() || !istype(user)) return for(var/atom/movable/A in get_turf(src)) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 6296554fe9ee7..5a11d770ea83c 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -33,7 +33,7 @@ field_generator power level display use_power = NO_POWER_USE max_integrity = 500 //100% immune to lasers and energy projectiles since it absorbs their energy. - armor = list("melee" = 25, "bullet" = 10, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70) + armor = list("melee" = 25, "bullet" = 10, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70, "stamina" = 0) var/power_level = 0 var/active = FG_OFFLINE var/power = 20 // Current amount of power @@ -77,7 +77,7 @@ field_generator power level display "You turn on [src].", \ "You hear heavy droning.") turn_on() - investigate_log("activated by [key_name(user)].", INVESTIGATE_SINGULO) + investigate_log("activated by [key_name(user)].", INVESTIGATE_ENGINES) add_fingerprint(user) else @@ -210,7 +210,7 @@ field_generator power level display else visible_message("The [name] shuts down!", "You hear something shutting down.") turn_off() - investigate_log("ran out of power and deactivated", INVESTIGATE_SINGULO) + investigate_log("ran out of power and deactivated", INVESTIGATE_ENGINES) power = 0 check_power_level() return 0 @@ -330,12 +330,12 @@ field_generator power level display spawn(1) var/temp = 1 //stops spam for(var/obj/singularity/O in GLOB.singularities) - if(O.last_warning && temp) + if(O.last_warning && temp && O.is_real) if((world.time - O.last_warning) > 50) //to stop message-spam temp = 0 var/turf/T = get_turf(src) message_admins("A singulo exists and a containment field has failed at [ADMIN_VERBOSEJMP(T)].") - investigate_log("has failed whilst a singulo exists at [AREACOORD(T)].", INVESTIGATE_SINGULO) + investigate_log("has failed whilst a singulo exists at [AREACOORD(T)].", INVESTIGATE_ENGINES) notify_ghosts("IT'S LOOSE", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE, ghost_sound = 'sound/machines/warning-buzzer.ogg', header = "IT'S LOOSE", notify_volume = 75) O.last_warning = world.time diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index f5e3bbc1417ba..f608b6f256bcd 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -23,7 +23,7 @@ else return ..() -/obj/machinery/the_singularitygen/process() +/obj/machinery/the_singularitygen/process(delta_time) if(energy > 0) if(energy >= 200) var/turf/T = get_turf(src) @@ -32,4 +32,4 @@ transfer_fingerprints_to(S) qdel(src) else - energy -= 1 + energy -= delta_time * 0.5 diff --git a/code/modules/power/singularity/investigate.dm b/code/modules/power/singularity/investigate.dm index 3caf934b50c50..d8760830907f2 100644 --- a/code/modules/power/singularity/investigate.dm +++ b/code/modules/power/singularity/investigate.dm @@ -1,4 +1,4 @@ /area/engine/engineering/poweralert(state, source) if (state != poweralm) - investigate_log("has a power alarm!", INVESTIGATE_SINGULO) + investigate_log("has a power alarm!", INVESTIGATE_ENGINES) ..() \ No newline at end of file diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 4d202fd8d17cb..e042aa8e184a1 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -2,6 +2,7 @@ name = "Nar'Sie's Avatar" desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees." icon = 'icons/obj/magic_terror.dmi' + is_real = FALSE pixel_x = -89 pixel_y = -85 density = FALSE @@ -16,6 +17,7 @@ light_color = rgb(255, 0, 0) gender = FEMALE var/clashing = FALSE //If Nar'Sie is fighting Ratvar + var/next_attack_tick /obj/singularity/narsie/large name = "Nar'Sie" @@ -68,12 +70,13 @@ souls_needed[player] = TRUE soul_goal = round(1 + LAZYLEN(souls_needed) * 0.75) INVOKE_ASYNC(src, .proc/begin_the_end) + check_gods_battle() /obj/singularity/narsie/large/cult/proc/begin_the_end() sleep(50) priority_announce("An acausal dimensional event has been detected in your sector. Event has been flagged EXTINCTION-CLASS. Directing all available assets toward simulating solutions. SOLUTION ETA: 60 SECONDS.","Central Command Higher Dimensional Affairs", 'sound/misc/airraid.ogg') sleep(500) - priority_announce("Simulations on acausal dimensional event complete. Deploying solution package now. Deployment ETA: ONE MINUTE. ","Central Command Higher Dimensional Affairs") + priority_announce("Simulations on acausal dimensional event complete. Deploying solution package now. Deployment ETA: ONE MINUTE. ", "Central Command Higher Dimensional Affairs", SSstation.announcer.get_rand_alert_sound()) sleep(50) set_security_level("delta") SSshuttle.registerHostileEnvironment(src) @@ -101,15 +104,36 @@ /obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob) makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, user, cultoverride = TRUE, loc_override = src.loc) -/obj/singularity/narsie/process() +/obj/singularity/narsie/process(delta_time) + eat() if(clashing) + //Oh god what is it doing... + target = clashing + if(get_dist(src, clashing) < 5) + if(next_attack_tick < world.time) + next_attack_tick = world.time + rand(50, 100) + to_chat(world, "[pick("You hear the scratching of cogs.","You hear the clanging of pipes.","You feel your bones start to rust...")]") + SEND_SOUND(world, 'sound/magic/clockwork/narsie_attack.ogg') + SpinAnimation(4, 0) + for(var/mob/living/M in GLOB.player_list) + shake_camera(M, 25, 6) + M.Knockdown(10) + if(DT_PROB(max(SSticker.mode?.cult.len/2, 15), delta_time)) + SEND_SOUND(world, 'sound/magic/clockwork/anima_fragment_death.ogg') + SEND_SOUND(world, 'sound/effects/explosionfar.ogg') + to_chat(world, "You really thought you could best me twice?") + QDEL_NULL(clashing) + for(var/datum/mind/M as() in GLOB.servants_of_ratvar) + to_chat(M, "You feel a stabbing pain in your chest... This can't be happening!") + M.current?.dust() + return + move() return - eat() - if(!target || prob(5)) + if(!target || DT_PROB(5, delta_time)) pickcultist() else move() - if(prob(25)) + if(DT_PROB(25, delta_time)) mezzer() @@ -125,11 +149,11 @@ /obj/singularity/narsie/mezzer() - for(var/mob/living/carbon/M in 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]...") - M.apply_effect(60, EFFECT_STUN) + for(var/mob/living/carbon/M in hearers(consume_range, src)) + if(M.stat || iscultist(M)) + continue + to_chat(M, "You feel conscious thought crumble away in an instant as you gaze upon [src.name].") + M.apply_effect(60, EFFECT_STUN) /obj/singularity/narsie/consume(atom/A) @@ -147,7 +171,7 @@ for(var/mob/living/carbon/food in GLOB.alive_mob_list) //we don't care about constructs or cult-Ians or whatever. cult-monkeys are fair game i guess var/turf/pos = get_turf(food) - if(!pos || (pos.z != z)) + if(!pos || (pos.get_virtual_z_level() != get_virtual_z_level())) continue if(iscultist(food)) @@ -168,7 +192,7 @@ if(!ghost.client) continue var/turf/pos = get_turf(ghost) - if(!pos || (pos.z != z)) + if(!pos || (pos.get_virtual_z_level() != get_virtual_z_level())) continue cultists += ghost if(cultists.len) @@ -193,9 +217,10 @@ /obj/singularity/narsie/wizard/eat() // if(defer_powernet_rebuild != 2) // defer_powernet_rebuild = 1 - for(var/atom/X in urange(consume_range,src,1)) - if(isturf(X) || ismovableatom(X)) - consume(X) + for(var/turf/T as() in RANGE_TURFS(consume_range, src)) + consume(T) + for(var/atom/movable/AM in urange(consume_range,src,1)) + consume(AM) // if(defer_powernet_rebuild != 2) // defer_powernet_rebuild = 0 return @@ -211,4 +236,3 @@ icon = initial(icon) - diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index b880958aaed31..05f39cf954ad6 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -27,7 +27,7 @@ anchored = FALSE density = TRUE max_integrity = 500 - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 80) + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 80, "stamina" = 0) var/obj/machinery/particle_accelerator/control_box/master = null var/construction_state = PA_CONSTRUCTION_UNSECURED @@ -122,7 +122,7 @@ . = ..() if(master?.active) master.toggle_power() - investigate_log("was moved whilst active; it powered down.", INVESTIGATE_SINGULO) + investigate_log("was moved whilst active; it powered down.", INVESTIGATE_ENGINES) /obj/structure/particle_accelerator/update_icon() diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 58632b8d0d81a..cf77bd75a1780 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -53,11 +53,13 @@ part.powered = FALSE part.update_icon() connected_parts.Cut() + ui_update() return if(!part_scan()) use_power = IDLE_POWER_USE active = FALSE connected_parts.Cut() + ui_update() /obj/machinery/particle_accelerator/control_box/update_icon() if(active) @@ -89,8 +91,7 @@ strength_change() message_admins("PA Control Computer increased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_VERBOSEJMP(src)]") - log_game("PA Control Computer increased to [strength] by [key_name(usr)] in [AREACOORD(src)]") - investigate_log("increased to [strength] by [key_name(usr)] at [AREACOORD(src)]", INVESTIGATE_SINGULO) + investigate_log("increased to [strength] by [key_name(usr)] at [AREACOORD(src)]", INVESTIGATE_ENGINES) /obj/machinery/particle_accelerator/control_box/proc/remove_strength(s) if(assembled && (strength > 0)) @@ -98,8 +99,7 @@ strength_change() message_admins("PA Control Computer decreased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_VERBOSEJMP(src)]") - log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in [AREACOORD(src)]") - investigate_log("decreased to [strength] by [key_name(usr)] at [AREACOORD(src)]", INVESTIGATE_SINGULO) + investigate_log("decreased to [strength] by [key_name(usr)] at [AREACOORD(src)]", INVESTIGATE_ENGINES) /obj/machinery/particle_accelerator/control_box/power_change() ..() @@ -113,7 +113,7 @@ if(active) //a part is missing! if(connected_parts.len < 6) - investigate_log("lost a connected part; It powered down.", INVESTIGATE_SINGULO) + investigate_log("lost a connected part; It powered down.", INVESTIGATE_ENGINES) toggle_power() update_icon() return @@ -172,9 +172,8 @@ /obj/machinery/particle_accelerator/control_box/proc/toggle_power() active = !active - investigate_log("turned [active?"ON":"OFF"] by [usr ? key_name(usr) : "outside forces"] at [AREACOORD(src)]", INVESTIGATE_SINGULO) + investigate_log("turned [active?"ON":"OFF"] by [usr ? key_name(usr) : "outside forces"] at [AREACOORD(src)]", INVESTIGATE_ENGINES) message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? ADMIN_LOOKUPFLW(usr) : "outside forces"] in [ADMIN_VERBOSEJMP(src)]") - log_game("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? "[key_name(usr)]" : "outside forces"] at [AREACOORD(src)]") if(active) use_power = ACTIVE_POWER_USE for(var/CP in connected_parts) @@ -239,6 +238,7 @@ "You close the access panel.") construction_state = PA_CONSTRUCTION_COMPLETE did_something = TRUE + ui_update() if(PA_CONSTRUCTION_COMPLETE) if(W.tool_behaviour == TOOL_SCREWDRIVER) user.visible_message("[user.name] opens the [name]'s access panel.", \ @@ -318,7 +318,8 @@ remove_strength() . = TRUE - update_icon() + if(.) + update_icon() #undef PA_CONSTRUCTION_UNSECURED #undef PA_CONSTRUCTION_UNWIRED diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index fbec10cd15f94..793de2b1767ed 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -7,6 +7,7 @@ icon_state = "singularity_s1" anchored = TRUE density = TRUE + var/is_real = TRUE move_resist = INFINITY layer = MASSIVE_OBJ_LAYER light_range = 6 @@ -16,9 +17,12 @@ var/contained = 1 //Are we going to move around? var/energy = 100 //How strong are we? var/dissipate = 1 //Do we lose energy over time? - var/dissipate_delay = 10 - var/dissipate_track = 0 - var/dissipate_strength = 1 //How much energy do we lose? + /// How long should it take for us to dissipate in seconds? + var/dissipate_delay = 20 + /// How much energy do we lose every dissipate_delay? + var/dissipate_strength = 1 + /// How long its been (in seconds) since the last dissipation + var/time_since_last_dissipiation = 0 var/move_self = 1 //Do we move on our own? var/grav_pull = 4 //How many tiles out do we pull? var/consume_range = 0 //How many tiles out do we eat @@ -101,7 +105,7 @@ switch(severity) if(1) if(current_size <= STAGE_TWO) - investigate_log("has been destroyed by a heavy explosion.", INVESTIGATE_SINGULO) + investigate_log("has been destroyed by a heavy explosion.", INVESTIGATE_ENGINES) qdel(src) return else @@ -127,14 +131,14 @@ consume(AM) -/obj/singularity/process() +/obj/singularity/process(delta_time) if(current_size >= STAGE_TWO) move() radiation_pulse(src, min(5000, (energy*4.5)+1000), RAD_DISTANCE_COEFFICIENT*0.5) if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit event() eat() - dissipate() + dissipate(delta_time) check_energy() return @@ -149,17 +153,18 @@ var/count = locate(/obj/machinery/field/containment) in urange(30, src, 1) if(!count) message_admins("A singulo has been created without containment fields active at [ADMIN_VERBOSEJMP(T)].") - investigate_log("was created at [AREACOORD(T)]. [count?"":"No containment fields were active"]", INVESTIGATE_SINGULO) + investigate_log("was created at [AREACOORD(T)]. [count?"":"No containment fields were active"]", INVESTIGATE_ENGINES) -/obj/singularity/proc/dissipate() +/obj/singularity/proc/dissipate(delta_time) if(!dissipate) return - if(dissipate_track >= dissipate_delay) - src.energy -= dissipate_strength - dissipate_track = 0 - else - dissipate_track++ + time_since_last_dissipiation += delta_time + + // Uses a while in case of especially long delta times + while (time_since_last_dissipiation >= dissipate_delay) + energy -= dissipate_strength + time_since_last_dissipiation -= dissipate_delay /obj/singularity/proc/expand(force_size = 0) var/temp_allowed_size = src.allowed_size @@ -177,7 +182,7 @@ grav_pull = 4 consume_range = 0 dissipate_delay = 10 - dissipate_track = 0 + time_since_last_dissipiation = 0 dissipate_strength = 1 if(STAGE_TWO) if(check_cardinals_range(1, TRUE)) @@ -189,7 +194,7 @@ grav_pull = 6 consume_range = 1 dissipate_delay = 5 - dissipate_track = 0 + time_since_last_dissipiation = 0 dissipate_strength = 5 if(STAGE_THREE) if(check_cardinals_range(2, TRUE)) @@ -201,7 +206,7 @@ grav_pull = 8 consume_range = 2 dissipate_delay = 4 - dissipate_track = 0 + time_since_last_dissipiation = 0 dissipate_strength = 20 if(STAGE_FOUR) if(check_cardinals_range(3, TRUE)) @@ -213,7 +218,7 @@ grav_pull = 10 consume_range = 3 dissipate_delay = 10 - dissipate_track = 0 + time_since_last_dissipiation = 0 dissipate_strength = 10 if(STAGE_FIVE)//this one also lacks a check for gens because it eats everything current_size = STAGE_FIVE @@ -234,7 +239,7 @@ consume_range = 5 dissipate = 0 if(current_size == allowed_size) - investigate_log("grew to size [current_size]", INVESTIGATE_SINGULO) + investigate_log("grew to size [current_size]", INVESTIGATE_ENGINES) return 1 else if(current_size < (--temp_allowed_size)) expand(temp_allowed_size) @@ -244,7 +249,7 @@ /obj/singularity/proc/check_energy() if(energy <= 0) - investigate_log("collapsed.", INVESTIGATE_SINGULO) + investigate_log("collapsed.", INVESTIGATE_ENGINES) qdel(src) return 0 switch(energy)//Some of these numbers might need to be changed up later -Mport @@ -267,8 +272,7 @@ /obj/singularity/proc/eat() - for(var/tile in spiral_range_turfs(grav_pull, src)) - var/turf/T = tile + for(var/turf/T as() in spiral_range_turfs(grav_pull, src)) if(!T || !isturf(loc)) continue if(get_dist(T, src) > consume_range) @@ -422,7 +426,7 @@ continue if(M.stat == CONSCIOUS) - if (ishuman(M)) + if(ishuman(M)) var/mob/living/carbon/human/H = M if(istype(H.glasses, /obj/item/clothing/glasses/meson)) var/obj/item/clothing/glasses/meson/MS = H.glasses @@ -448,5 +452,19 @@ return(gain) /obj/singularity/proc/bluespace_reaction() - investigate_log("has been shot by bluespace artillery and destroyed.", INVESTIGATE_SINGULO) + SIGNAL_HANDLER + + investigate_log("has been shot by bluespace artillery and destroyed.", INVESTIGATE_ENGINES) qdel(src) + +/obj/singularity/deadchat_controlled + move_self = FALSE + +/obj/singularity/deadchat_controlled/Initialize(mapload, starting_energy) + . = ..() + AddComponent(/datum/component/deadchat_control, DEMOCRACY_MODE, list( + "up" = CALLBACK(GLOBAL_PROC, .proc/_step, src, NORTH), + "down" = CALLBACK(GLOBAL_PROC, .proc/_step, src, SOUTH), + "left" = CALLBACK(GLOBAL_PROC, .proc/_step, src, WEST), + "right" = CALLBACK(GLOBAL_PROC, .proc/_step, src, EAST))) + \ No newline at end of file diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 9995804c64fdb..31e2a40da5a9b 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -157,7 +157,7 @@ if(default_deconstruction_crowbar(I)) message_admins("[src] has been deconstructed by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(T)]") log_game("[src] has been deconstructed by [key_name(user)] at [AREACOORD(src)]") - investigate_log("SMES deconstructed by [key_name(user)] at [AREACOORD(src)]", INVESTIGATE_SINGULO) + investigate_log("SMES deconstructed by [key_name(user)] at [AREACOORD(src)]", INVESTIGATE_ENGINES) return else if(panel_open && I.tool_behaviour == TOOL_CROWBAR) return @@ -188,7 +188,7 @@ var/turf/T = get_turf(src) message_admins("SMES deleted at [ADMIN_VERBOSEJMP(T)]") log_game("SMES deleted at [AREACOORD(T)]") - investigate_log("deleted at [AREACOORD(T)]", INVESTIGATE_SINGULO) + investigate_log("deleted at [AREACOORD(T)]", INVESTIGATE_ENGINES) if(terminal) disconnect_terminal() return ..() @@ -286,7 +286,7 @@ if(output_used < 0.0001) // either from no charge or set to 0 outputting = FALSE - investigate_log("lost power and turned off", INVESTIGATE_SINGULO) + investigate_log("lost power and turned off", INVESTIGATE_ENGINES) else if(output_attempt && charge > output_level && output_level > 0) outputting = TRUE else @@ -339,6 +339,7 @@ if(!ui) ui = new(user, src, "Smes") ui.open() + ui.set_autoupdate(TRUE) // Power level /obj/machinery/power/smes/ui_data() var/list/data = list( @@ -366,12 +367,10 @@ switch(action) if("tryinput") input_attempt = !input_attempt - log_smes(usr) update_icon() . = TRUE if("tryoutput") output_attempt = !output_attempt - log_smes(usr) update_icon() . = TRUE if("input") @@ -391,7 +390,6 @@ . = TRUE if(.) input_level = clamp(target, 0, input_level_max) - log_smes(usr) if("output") var/target = params["target"] var/adjust = text2num(params["adjust"]) @@ -409,10 +407,11 @@ . = TRUE if(.) output_level = clamp(target, 0, output_level_max) - log_smes(usr) + if(.) + log_smes(usr) /obj/machinery/power/smes/proc/log_smes(mob/user) - investigate_log("input/output; [input_level>output_level?"":""][input_level]/[output_level] | Charge: [charge] | Output-mode: [output_attempt?"on":"off"] | Input-mode: [input_attempt?"auto":"off"] by [user ? key_name(user) : "outside forces"]", INVESTIGATE_SINGULO) + investigate_log("input/output; [input_level>output_level?"":""][input_level]/[output_level] | Charge: [charge] | Output-mode: [output_attempt?"on":"off"] | Input-mode: [input_attempt?"auto":"off"] by [user ? key_name(user) : "outside forces"]", INVESTIGATE_ENGINES) /obj/machinery/power/smes/emp_act(severity) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index ab160bdbb201d..0658a0482b93b 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -332,6 +332,7 @@ /obj/machinery/power/solar_control/update_icon() cut_overlays() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(stat & NOPOWER) add_overlay("[icon_keyboard]_off") return @@ -339,7 +340,8 @@ if(stat & BROKEN) add_overlay("[icon_state]_broken") else - add_overlay(icon_screen) + SSvis_overlays.add_vis_overlay(src, icon, icon_screen, layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, icon_screen, layer, EMISSIVE_PLANE, dir) /obj/machinery/power/solar_control/ui_state(mob/user) @@ -350,6 +352,7 @@ if(!ui) ui = new(user, src, "SolarControl") ui.open() + ui.set_autoupdate(TRUE) // Power output, solar panel direction /obj/machinery/power/solar_control/ui_data() var/data = list() @@ -369,47 +372,45 @@ /obj/machinery/power/solar_control/ui_act(action, params) if(..()) return - if(action == "angle") - var/adjust = text2num(params["adjust"]) - var/value = text2num(params["value"]) - if(adjust) - value = currentdir + adjust - if(value != null) - currentdir = CLAMP((360 + value) % 360, 0, 359) - targetdir = currentdir - set_panels(currentdir) - return TRUE - return FALSE - if(action == "rate") - var/adjust = text2num(params["adjust"]) - var/value = text2num(params["value"]) - if(adjust) - value = trackrate + adjust - if(value != null) - trackrate = CLAMP(value, -7200, 7200) - if(trackrate) - nexttime = world.time + 36000 / abs(trackrate) - return TRUE - return FALSE - if(action == "tracking") - var/mode = text2num(params["mode"]) - track = mode - if(mode == 2 && connected_tracker) - connected_tracker.set_angle(SSsun.angle) + switch(action) + if("angle") + var/adjust = text2num(params["adjust"]) + var/value = text2num(params["value"]) + if(adjust) + value = currentdir + adjust + if(value != null) + currentdir = CLAMP((360 + value) % 360, 0, 359) + targetdir = currentdir + set_panels(currentdir) + . = TRUE + if("rate") + var/adjust = text2num(params["adjust"]) + var/value = text2num(params["value"]) + if(adjust) + value = trackrate + adjust + if(value != null) + trackrate = CLAMP(value, -7200, 7200) + if(trackrate) + nexttime = world.time + 36000 / abs(trackrate) + . = TRUE + if("tracking") + var/mode = text2num(params["mode"]) + track = mode + if(mode == 2 && connected_tracker) + connected_tracker.set_angle(SSsun.angle) + set_panels(currentdir) + else if(mode == 1) + targetdir = currentdir + if(trackrate) + nexttime = world.time + 36000 / abs(trackrate) + set_panels(targetdir) + . = TRUE + if("refresh") + search_for_connected() + if(connected_tracker && track == 2) + connected_tracker.set_angle(SSsun.angle) set_panels(currentdir) - else if(mode == 1) - targetdir = currentdir - if(trackrate) - nexttime = world.time + 36000 / abs(trackrate) - set_panels(targetdir) - return TRUE - if(action == "refresh") - search_for_connected() - if(connected_tracker && track == 2) - connected_tracker.set_angle(SSsun.angle) - set_panels(currentdir) - return TRUE - return FALSE + . = TRUE /obj/machinery/power/solar_control/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_SCREWDRIVER) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 571f7a1674f6b..a2e6c996fa20a 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -82,6 +82,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/static/gl_uid = 1 light_range = 4 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 critical_machine = TRUE @@ -167,7 +168,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/Initialize() . = ..() uid = gl_uid++ - SSair.atmos_machinery += src + SSair.atmos_air_machinery += src countdown = new(src) countdown.start() GLOB.poi_list |= src @@ -175,7 +176,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) radio.keyslot = new radio_key radio.listening = 0 radio.recalculateChannels() - investigate_log("has been created.", INVESTIGATE_SUPERMATTER) + investigate_log("has been created.", INVESTIGATE_ENGINES) if(is_main_engine) GLOB.main_supermatter_engine = src @@ -185,8 +186,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) soundloop = new(list(src), TRUE) /obj/machinery/power/supermatter_crystal/Destroy() - investigate_log("has been destroyed.", INVESTIGATE_SUPERMATTER) - SSair.atmos_machinery -= src + investigate_log("has been destroyed.", INVESTIGATE_ENGINES) + SSair.atmos_air_machinery -= src QDEL_NULL(radio) GLOB.poi_list -= src QDEL_NULL(countdown) @@ -281,7 +282,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/proc/explode() for(var/mob in GLOB.alive_mob_list) var/mob/living/L = mob - if(istype(L) && L.z == z) + if(istype(L) && L.get_virtual_z_level() == get_virtual_z_level()) if(ishuman(mob)) //Hilariously enough, running into a closet should make you get hit the hardest. var/mob/living/carbon/human/H = mob @@ -291,27 +292,28 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/turf/T = get_turf(src) for(var/mob/M in GLOB.player_list) - if(M.z == z) + if(M.get_virtual_z_level() == get_virtual_z_level()) SEND_SOUND(M, 'sound/magic/charge.ogg') to_chat(M, "You feel reality distort for a moment...") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "delam", /datum/mood_event/delam) if(combined_gas > MOLE_PENALTY_THRESHOLD) - investigate_log("has collapsed into a singularity.", INVESTIGATE_SUPERMATTER) + investigate_log("has collapsed into a singularity.", INVESTIGATE_ENGINES) if(T) var/obj/singularity/S = new(T) S.energy = 800 S.consume(src) else - investigate_log("has exploded.", INVESTIGATE_SUPERMATTER) + investigate_log("has exploded.", INVESTIGATE_ENGINES) explosion(get_turf(T), explosion_power * max(gasmix_power_ratio, 0.205) * 0.5 , explosion_power * max(gasmix_power_ratio, 0.205) + 2, explosion_power * max(gasmix_power_ratio, 0.205) + 4 , explosion_power * max(gasmix_power_ratio, 0.205) + 6, 1, 1) if(power > POWER_PENALTY_THRESHOLD) - investigate_log("has spawned additional energy balls.", INVESTIGATE_SUPERMATTER) - var/obj/singularity/energy_ball/E = new(T) - E.energy = power + investigate_log("has spawned additional energy balls.", INVESTIGATE_ENGINES) + new /obj/singularity/energy_ball(T, power) qdel(src) //this is here to eat arguments /obj/machinery/power/supermatter_crystal/proc/call_explode() + SIGNAL_HANDLER + explode() /obj/machinery/power/supermatter_crystal/process_atmos() @@ -352,7 +354,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(produces_gas) //Remove gas from surrounding area - removed = env.remove(gasefficency * env.total_moles()) + removed = env.remove_ratio(gasefficency) else // Pass all the gas related code an empty gas container removed = new() @@ -378,15 +380,15 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //calculating gas related values combined_gas = max(removed.total_moles(), 0) - plasmacomp = max(removed.get_moles(/datum/gas/plasma)/combined_gas, 0) - o2comp = max(removed.get_moles(/datum/gas/oxygen)/combined_gas, 0) - co2comp = max(removed.get_moles(/datum/gas/carbon_dioxide)/combined_gas, 0) - pluoxiumcomp = max(removed.get_moles(/datum/gas/pluoxium)/combined_gas, 0) - tritiumcomp = max(removed.get_moles(/datum/gas/tritium)/combined_gas, 0) - bzcomp = max(removed.get_moles(/datum/gas/bz)/combined_gas, 0) + plasmacomp = max(removed.get_moles(GAS_PLASMA)/combined_gas, 0) + o2comp = max(removed.get_moles(GAS_O2)/combined_gas, 0) + co2comp = max(removed.get_moles(GAS_CO2)/combined_gas, 0) + pluoxiumcomp = max(removed.get_moles(GAS_PLUOXIUM)/combined_gas, 0) + tritiumcomp = max(removed.get_moles(GAS_TRITIUM)/combined_gas, 0) + bzcomp = max(removed.get_moles(GAS_BZ)/combined_gas, 0) - n2ocomp = max(removed.get_moles(/datum/gas/nitrous_oxide)/combined_gas, 0) - n2comp = max(removed.get_moles(/datum/gas/nitrogen)/combined_gas, 0) + n2ocomp = max(removed.get_moles(GAS_NITROUS)/combined_gas, 0) + n2comp = max(removed.get_moles(GAS_N2)/combined_gas, 0) if(pluoxiumcomp >= 15) pluoxiumbonus = 1 //Just to be safe I don't want to remove pluoxium @@ -446,21 +448,21 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) removed.set_temperature(max(0, min(removed.return_temperature(), 2500 * dynamic_heat_modifier))) //Calculate how much gas to release - removed.adjust_moles(/datum/gas/plasma, max((device_energy * dynamic_heat_modifier) / PLASMA_RELEASE_MODIFIER, 0)) + removed.adjust_moles(GAS_PLASMA, max((device_energy * dynamic_heat_modifier) / PLASMA_RELEASE_MODIFIER, 0)) - removed.adjust_moles(/datum/gas/oxygen, max(((device_energy + removed.return_temperature() * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0)) + removed.adjust_moles(GAS_O2, max(((device_energy + removed.return_temperature() * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0)) if(produces_gas) 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 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 * config_hallucination_power * D l.hallucination = CLAMP(0, 200, l.hallucination) - for(var/mob/living/l in range(src, round((power / 100) ** 0.25))) + for(var/mob/living/l in range(round((power / 100) ** 0.25), src)) var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) ) l.rad_act(rads) @@ -499,7 +501,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) radio.talk_into(src, "[emergency_alert] Integrity: [get_integrity()]%", common_channel) lastwarning = REALTIMEOFDAY if(!has_reached_emergency) - investigate_log("has reached the emergency point for the first time.", INVESTIGATE_SUPERMATTER) + investigate_log("has reached the emergency point for the first time.", INVESTIGATE_ENGINES) message_admins("[src] has reached the emergency point [ADMIN_JMP(src)].") has_reached_emergency = TRUE else if(damage >= damage_archived) // The damage is still going up @@ -528,11 +530,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(!istype(L)) return FALSE if(!istype(Proj.firer, /obj/machinery/power/emitter)) - investigate_log("has been hit by [Proj] fired by [key_name(Proj.firer)]", INVESTIGATE_SUPERMATTER) + investigate_log("has been hit by [Proj] fired by [key_name(Proj.firer)]", INVESTIGATE_ENGINES) if(Proj.flag != "bullet") power += Proj.damage * config_bullet_energy if(!has_been_powered) - investigate_log("has been powered for the first time.", INVESTIGATE_SUPERMATTER) + investigate_log("has been powered for the first time.", INVESTIGATE_ENGINES) message_admins("[src] has been powered for the first time [ADMIN_JMP(src)].") has_been_powered = TRUE else if(takes_damage) @@ -541,11 +543,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/singularity_act() var/gain = 100 - investigate_log("Supermatter shard consumed by singularity.", INVESTIGATE_SINGULO) + investigate_log("Supermatter shard consumed by singularity.", INVESTIGATE_ENGINES) message_admins("Singularity has consumed a supermatter shard and can now become stage six.") visible_message("[src] is consumed by the singularity!") for(var/mob/M in GLOB.player_list) - if(M.z == z) + if(M.get_virtual_z_level() == get_virtual_z_level()) SEND_SOUND(M, 'sound/effects/supermatter.ogg') //everyone goan know bout this to_chat(M, "A horrible screeching fills your ears, and a wave of dread washes over you...") qdel(src) @@ -613,7 +615,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(!cause) cause = "contact" nom.visible_message(vis_msg, mob_msg, "You hear an unearthly noise as a wave of heat washes over you.") - investigate_log("has been attacked ([cause]) by [key_name(nom)]", INVESTIGATE_SUPERMATTER) + investigate_log("has been attacked ([cause]) by [key_name(nom)]", INVESTIGATE_ENGINES) playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1) Consume(nom) @@ -635,7 +637,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) "Oops! The [W] flashes out of existence on contact with \the [src], taking your arm with it! That was clumsy of you!") playsound(src, 'sound/effects/supermatter.ogg', 150, 1) Consume(dust_arm) - qdel(W) + Consume(W) return if(cig.lit || user.a_intent != INTENT_HELP) user.visible_message("A hideous sound echoes as [W] is ashed out on contact with \the [src]. That didn't seem like a good idea...") @@ -667,7 +669,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) 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].",\ "Everything suddenly goes silent.") - investigate_log("has been attacked ([W]) by [key_name(user)]", INVESTIGATE_SUPERMATTER) + investigate_log("has been attacked ([W]) by [key_name(user)]", INVESTIGATE_ENGINES) Consume(W) playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1) @@ -704,18 +706,25 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(user.status_flags & GODMODE) return message_admins("[src] has consumed [key_name_admin(user)] [ADMIN_JMP(src)].") - investigate_log("has consumed [key_name(user)].", INVESTIGATE_SUPERMATTER) + investigate_log("has consumed [key_name(user)].", INVESTIGATE_ENGINES) user.dust(force = TRUE) matter_power += 200 else if(istype(AM, /obj/singularity)) return else if(isobj(AM)) + var/obj/O = AM + if(O.resistance_flags & INDESTRUCTIBLE) + var/image/causality_field = image(icon, null, "causality_field") + add_overlay(causality_field, TRUE) + radio.talk_into(src, "Anomalous object has breached containment, emergency causality field enganged to prevent reality destabilization.", engineering_channel) + addtimer(CALLBACK(src, .proc/disengage_field, causality_field), 5 SECONDS) + return if(!iseffect(AM)) var/suspicion = "" if(AM.fingerprintslast) suspicion = "last touched by [AM.fingerprintslast]" message_admins("[src] has consumed [AM], [suspicion] [ADMIN_JMP(src)].") - investigate_log("has consumed [AM] - [suspicion].", INVESTIGATE_SUPERMATTER) + investigate_log("has consumed [AM] - [suspicion].", INVESTIGATE_ENGINES) qdel(AM) if(!iseffect(AM)) matter_power += 200 @@ -723,20 +732,22 @@ 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) for(var/mob/living/L in range(10)) - investigate_log("has irradiated [key_name(L)] after consuming [AM].", INVESTIGATE_SUPERMATTER) - if(L in view()) + investigate_log("has irradiated [key_name(L)] after consuming [AM].", INVESTIGATE_ENGINES) + if(L in viewers(get_turf(src))) L.show_message("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", 1,\ - "The unearthly ringing subsides and you notice you have new radiation burns.", 2) + "The unearthly ringing subsides and you notice you have new radiation burns.", MSG_AUDIBLE) else - L.show_message("You hear an unearthly ringing and notice your skin is covered in fresh radiation burns.", 2) + L.show_message("You hear an unearthly ringing and notice your skin is covered in fresh radiation burns.", MSG_AUDIBLE) + +/obj/machinery/power/supermatter_crystal/proc/disengage_field(causality_field) + if(QDELETED(src) || !causality_field) + return + cut_overlay(causality_field, TRUE) //Do not blow up our internal radio /obj/machinery/power/supermatter_crystal/contents_explosion(severity, target) return -/obj/machinery/power/supermatter_crystal/prevent_content_explosion() - return TRUE - /obj/machinery/power/supermatter_crystal/engine is_main_engine = TRUE @@ -791,7 +802,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) step_towards(P,center) /obj/machinery/power/supermatter_crystal/proc/supermatter_anomaly_gen(turf/anomalycenter, type = FLUX_ANOMALY, anomalyrange = 5) - var/turf/L = pick(orange(anomalyrange, anomalycenter)) + var/turf/L = pick(RANGE_TURFS(anomalyrange, anomalycenter) - anomalycenter) if(L) switch(type) if(FLUX_ANOMALY) @@ -816,7 +827,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/list/arctargetsstructure = list() if(prob(20)) //let's not hit all the engineers with every beam and/or segment of the arc - for(var/mob/living/Z in oview(zapstart, range+2)) + for(var/mob/living/Z in ohearers(range+2, zapstart)) arctargetsmob += Z if(arctargetsmob.len) var/mob/living/H = pick(arctargetsmob) @@ -825,7 +836,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) target_atom = A else - for(var/obj/machinery/X in oview(zapstart, range+2)) + for(var/obj/machinery/X in oview(range+2, zapstart)) arctargetsmachine += X if(arctargetsmachine.len) var/obj/machinery/M = pick(arctargetsmachine) @@ -834,7 +845,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) target_atom = A else - for(var/obj/structure/Y in oview(zapstart, range+2)) + for(var/obj/structure/Y in oview(range+2, zapstart)) arctargetsstructure += Y if(arctargetsstructure.len) var/obj/structure/O = pick(arctargetsstructure) diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 3f05b4eb51229..ce0f2adbb8476 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -40,7 +40,7 @@ /obj/machinery/power/tesla_coil/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Power generation at [input_power_multiplier*100]%.
Shock interval at [zap_cooldown*0.1] seconds." + . += "The status display reads: Power generation at [input_power_multiplier*100]%.
Shock interval at [zap_cooldown*0.1] seconds.
" /obj/machinery/power/tesla_coil/on_construction() if(anchored) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 5596b64b10fe7..b267c3adf09f5 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -1,5 +1,6 @@ #define TESLA_DEFAULT_POWER 1738260 #define TESLA_MINI_POWER 869130 +#define TESLA_MAX_BALLS 10 /obj/singularity/energy_ball name = "energy ball" @@ -18,57 +19,54 @@ dissipate_delay = 5 dissipate_strength = 1 var/list/orbiting_balls = list() - var/miniball = FALSE var/produced_power var/energy_to_raise = 32 var/energy_to_lower = -20 -/obj/singularity/energy_ball/Initialize(mapload, starting_energy = 50, is_miniball = FALSE) - miniball = is_miniball +/* +/obj/singularity/energy_ball/Initialize(mapload, starting_energy = 50) . = ..() + //TODO: Renable when we get a better lighting system that doesn't need constant updating if(!is_miniball) set_light(10, 7, "#EEEEFF") +*/ /obj/singularity/energy_ball/ex_act(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 - EB.orbiting_balls -= src - - for(var/ball in orbiting_balls) - var/obj/singularity/energy_ball/EB = ball - qdel(EB) - + QDEL_LIST(orbiting_balls) . = ..() -/obj/singularity/energy_ball/admin_investigate_setup() - if(miniball) - return //don't annnounce miniballs - ..() - - /obj/singularity/energy_ball/process() - if(!orbiting) - handle_energy() + handle_energy() - move_the_basket_ball(4 + orbiting_balls.len * 1.5) + 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, 1, extrarange = 30) - pixel_x = 0 - pixel_y = 0 - - tesla_zap(src, 7, TESLA_DEFAULT_POWER, TRUE) + pixel_x = 0 + pixel_y = 0 + //Main one can zap + //Tesla only zaps if the tick usage isn't over the limit. + if(!TICK_CHECK) + tesla_zap(src, 7, TESLA_DEFAULT_POWER, TESLA_ENERGY_PRIMARY_BALL_FLAGS) + else + //Weaker, less intensive zap + tesla_zap(src, 4, TESLA_DEFAULT_POWER, TESLA_ENERGY_MINI_BALL_FLAGS) pixel_x = -32 pixel_y = -32 - for (var/ball in orbiting_balls) - 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 + return + + pixel_x = -32 + pixel_y = -32 + for (var/ball in orbiting_balls) + if(TICK_CHECK) + return + var/range = rand(1, CLAMP(orbiting_balls.len, 3, 7)) + //Miniballs don't explode. + tesla_zap(ball, range, TESLA_MINI_POWER/7*range, TESLA_ENERGY_MINI_BALL_FLAGS) /obj/singularity/energy_ball/examine(mob/user) . = ..() @@ -112,12 +110,14 @@ /obj/singularity/energy_ball/proc/new_mini_ball() if(!loc) return - var/obj/singularity/energy_ball/EB = new(loc, 0, TRUE) + if(orbiting_balls.len >= TESLA_MAX_BALLS) + return + var/obj/effect/energy_ball/EB = new(loc, 0, TRUE) - EB.transform *= pick(0.3, 0.4, 0.5, 0.6, 0.7) + EB.transform *= rand(30, 70) * 0.01 var/icon/I = icon(icon,icon_state,dir) - var/orbitsize = (I.Width() + I.Height()) * pick(0.4, 0.5, 0.6, 0.7, 0.8) + var/orbitsize = (I.Width() + I.Height()) * rand(40, 80) * 0.01 orbitsize -= (orbitsize / world.icon_size) * (world.icon_size * 0.25) EB.orbit(src, orbitsize, pick(FALSE, TRUE), rand(10, 25), pick(3, 4, 5, 6, 36)) @@ -138,23 +138,6 @@ qdel(rip_u) 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 - orbitingball.orbiting_balls -= src - orbitingball.dissipate_strength = orbitingball.orbiting_balls.len - . = ..() - if (!QDELETED(src)) - qdel(src) - - /obj/singularity/energy_ball/proc/dust_mobs(atom/A) if(isliving(A)) var/mob/living/L = A @@ -162,12 +145,40 @@ return if(!iscarbon(A)) return - for(var/obj/machinery/power/grounding_rod/GR in orange(src, 2)) + for(var/obj/machinery/power/grounding_rod/GR in orange(2, src)) if(GR.anchored) return var/mob/living/carbon/C = A C.dust() +//Less intensive energy ball for the orbiting ones. +/obj/effect/energy_ball + name = "energy ball" + desc = "An energy ball." + icon = 'icons/obj/tesla_engine/energy_ball.dmi' + icon_state = "energy_ball" + pixel_x = -32 + pixel_y = -32 + +/obj/effect/energy_ball/Destroy(force) + if(orbiting && istype(orbiting.parent, /obj/singularity/energy_ball)) + var/obj/singularity/energy_ball/EB = orbiting.parent + EB.orbiting_balls -= src + EB.dissipate_strength = EB.orbiting_balls.len + . = ..() + +/obj/effect/energy_ball/orbit(obj/singularity/energy_ball/target) + if (istype(target)) + target.orbiting_balls += src + target.dissipate_strength = target.orbiting_balls.len + . = ..() + +/obj/effect/energy_ball/stop_orbit() + . = ..() + //Qdel handles removing from the parent ball list. + if (!QDELETED(src)) + qdel(src) + /proc/tesla_zap(atom/source, zap_range = 3, power, tesla_flags = TESLA_DEFAULT_FLAGS, list/shocked_targets) . = source.dir if(power < 1000) @@ -205,8 +216,9 @@ /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)) + for(var/atom/A as() in oview(zap_range+2, source)) + //typecache_filter_multi_list_exclusion has been inlined to minimize lag. + if(!things_to_shock[A.type] || blacklisted_tesla_types[A.type] || (!(tesla_flags & TESLA_ALLOW_DUPLICATES) && LAZYACCESS(shocked_targets, A))) continue if(istype(A, /obj/machinery/power/tesla_coil)) @@ -253,7 +265,7 @@ closest_atom = A closest_dist = dist - else if(closest_mob) + else if(closest_machine) continue else if(istype(A, /obj/structure/blob)) @@ -311,3 +323,5 @@ else if(closest_structure) closest_structure.tesla_act(power, tesla_flags, shocked_targets) + +#undef TESLA_MAX_BALLS diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index b54db0e152e65..2964005bde32e 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -135,13 +135,11 @@ cut_overlays() rpm = 0.9* rpm + 0.1 * rpmtarget - var/datum/gas_mixture/environment = inturf.return_air() // It's a simplified version taking only 1/10 of the moles from the turf nearby. It should be later changed into a better version + // above todo 7 years and counting - var/transfer_moles = environment.total_moles()/10 - var/datum/gas_mixture/removed = inturf.remove_air(transfer_moles) - gas_contained.merge(removed) + inturf.transfer_air_ratio(gas_contained, 0.1) // RPM function to include compression friction - be advised that too low/high of a compfriction value can make things screwy @@ -190,7 +188,7 @@ /obj/machinery/power/turbine/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Productivity at [productivity*100]%." + . += "The status display reads: Productivity at [productivity*100]%." /obj/machinery/power/turbine/locate_machinery() if(compressor) @@ -231,8 +229,7 @@ if(destroy_output) compressor.gas_contained.set_moles(compressor.gas_contained.get_moles() - oamount) else - var/datum/gas_mixture/removed = compressor.gas_contained.remove(oamount) - outturf.assume_air(removed) + outturf.assume_air_moles(compressor.gas_contained, oamount) // If it works, put an overlay that it works! @@ -266,6 +263,7 @@ if(!ui) ui = new(user, src, "TurbineComputer") ui.open() + ui.set_autoupdate(TRUE) // Turbine stats (power, RPM, temperature) /obj/machinery/power/turbine/ui_data(mob/user) var/list/data = list() @@ -322,8 +320,8 @@ if(C.comp_id == id) compressor = C return - else - compressor = locate(/obj/machinery/power/compressor) in range(7, src) + // Couldn't find compressor, time to do search indiscriminately + compressor = locate(/obj/machinery/power/compressor) in range(7, src) /obj/machinery/computer/turbine_computer/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) @@ -331,6 +329,7 @@ if(!ui) ui = new(user, src, "TurbineComputer") ui.open() + ui.set_autoupdate(TRUE) // Turbine stats (power, RPM, temperature) /obj/machinery/computer/turbine_computer/ui_data(mob/user) var/list/data = list() diff --git a/code/modules/procedural_mapping/mapGeneratorModule.dm b/code/modules/procedural_mapping/mapGeneratorModule.dm index 3a78d8385ed4d..bcde26732caac 100644 --- a/code/modules/procedural_mapping/mapGeneratorModule.dm +++ b/code/modules/procedural_mapping/mapGeneratorModule.dm @@ -42,7 +42,7 @@ //You're the same as me? I hate you I'm going home if(clusterCheckFlags & CLUSTER_CHECK_SAME_TURFS) clustering = rand(clusterMin,clusterMax) - for(var/turf/F in RANGE_TURFS(clustering,T)) + for(var/turf/F as() in RANGE_TURFS(clustering,T)) if(istype(F,turfPath)) skipLoopIteration = TRUE break @@ -53,7 +53,7 @@ //You're DIFFERENT to me? I hate you I'm going home if(clusterCheckFlags & CLUSTER_CHECK_DIFFERENT_TURFS) clustering = rand(clusterMin,clusterMax) - for(var/turf/F in RANGE_TURFS(clustering,T)) + for(var/turf/F as() in RANGE_TURFS(clustering,T)) if(!(istype(F,turfPath))) skipLoopIteration = TRUE break diff --git a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm index 00dba2d000146..18607b919aba4 100644 --- a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm +++ b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm @@ -10,12 +10,13 @@ if(!mother) return var/list/map = mother.map - for(var/turf/T in map) - SSair.remove_from_active(T) for(var/turf/open/T in map) if(T.air) - T.air.copy_from_turf(T) - SSair.add_to_active(T) + if(T.initial_gas_mix) + T.air.parse_gas_string(T.initial_gas_mix) + T.set_temperature(T.air.return_temperature()) + else + T.air.copy_from_turf(T) /datum/mapGeneratorModule/bottomLayer/massdelete spawnableAtoms = list() diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index 14877e3ac7d42..14e1ceeecfcee 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -19,6 +19,8 @@ var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the ammo is fired. var/heavy_metal = TRUE var/harmful = TRUE //pacifism check for boolet, set to FALSE if bullet is non-lethal + var/click_cooldown_override = 0 + var/exists = TRUE /obj/item/ammo_casing/spent name = "spent bullet casing" @@ -33,6 +35,13 @@ setDir(pick(GLOB.alldirs)) update_icon() +/obj/item/ammo_casing/Destroy() + var/turf/T = get_turf(src) + if(T && !BB && is_station_level(T.z)) + SSblackbox.record_feedback("tally", "station_mess_destroyed", 1, name) + QDEL_NULL(BB) + return ..() + /obj/item/ammo_casing/update_icon() ..() icon_state = "[initial(icon_state)][BB ? "-live" : ""]" diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index f01aaa0581add..93082748f1d88 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -1,18 +1,26 @@ -/obj/item/ammo_casing/proc/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from) +/obj/item/ammo_casing/proc/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, spread_mult = 1, 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) + spread = round((rand() - 0.5) * distro) * spread_mult else //Smart spread - spread = round((i / pellets - 0.5) * distro) + spread = round(1 - 0.5) * distro * spread_mult if(!throw_proj(target, targloc, user, params, spread)) - return 0 - if(i > 1) - newshot() - user.newtonian_move(get_dir(target, user)) + 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 + user.changeNext_move(CLICK_CD_RANGE) + if(exists) + user.newtonian_move(get_dir(target, user)) update_icon() return TRUE @@ -57,3 +65,21 @@ var/dx = abs(target.x - current.x) var/dy = abs(target.y - current.y) return locate(target.x + round(gaussian(0, distro) * (dy+2)/8, 1), target.y + round(gaussian(0, distro) * (dx+2)/8, 1), target.z) + +/obj/item/ammo_casing/screwdriver_act(mob/living/user, obj/item/I) + user.visible_message("[user] hits the [src]'s primer with [user.p_their()] [I]!") + if(!user.is_holding(src)) + to_chat(user, "You need to pickup \the [src] first!") + return + if(prob(75)) + fire_casing(get_step(src, user.dir), user, spread = rand(-40, 40)) + if(iscarbon(user)) + var/mob/living/carbon/C = user + var/obj/item/bodypart/affecting = C.get_holding_bodypart_of_item(src) + C.apply_damage(rand(5, 10), BRUTE, affecting) + else + user.visible_message("[user]'s [I] slips!") + fire_casing(user, user) + +/obj/item/ammo_casing/caseless/screwdriver_act(mob/living/user, /obj/item/I) + return // No launching arrows with screwdrivers! diff --git a/code/modules/projectiles/ammunition/ballistic/lmg.dm b/code/modules/projectiles/ammunition/ballistic/lmg.dm index 54287eea62b8f..4f3ea9c624f85 100644 --- a/code/modules/projectiles/ammunition/ballistic/lmg.dm +++ b/code/modules/projectiles/ammunition/ballistic/lmg.dm @@ -21,3 +21,8 @@ name = "7.12x82mm incendiary bullet casing" desc = "A 7.12x82mm 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/mm712x82 + +/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 diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm index 70afc7d4a8766..666993bb8a3a2 100644 --- a/code/modules/projectiles/ammunition/ballistic/revolver.dm +++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm @@ -6,6 +6,12 @@ caliber = "357" projectile_type = /obj/item/projectile/bullet/a357 +/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 @@ -39,13 +45,28 @@ caliber = "38" 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 + /obj/item/ammo_casing/caseless/mime name = "invisible .38 bullet casing" icon_state = null - desc = "You shouldnt be seeing this." + desc = "You shouldn't be seeing this." caliber = "mime" projectile_type = /obj/item/projectile/bullet/c38/mime + exists = FALSE -/obj/item/ammo_casing/caseless/mime/lethals - projectile_type = /obj/item/projectile/bullet/c38 - +/obj/item/ammo_casing/caseless/mime/lethal + projectile_type = /obj/item/projectile/bullet/c38/mime_lethal diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index 824c4bc9f8d1c..e95385f5cb206 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -17,7 +17,7 @@ /obj/item/ammo_casing/shotgun/sleepytime name = "soporific shell" - desc = "A shotgun shell loaded with a hypodermic needle containing a low strength sleeping agent." + desc = "A shotgun shell loaded with a hypodermic needle containing a low strength knock-out agent that will confuse a target on the first shot, and put them to sleep on the second." icon_state = "sleepy" projectile_type = /obj/item/projectile/bullet/sleepy @@ -68,7 +68,7 @@ icon_state = "gshell" projectile_type = /obj/item/projectile/bullet/pellet/shotgun_buckshot pellets = 6 - variance = 25 + variance = 10 /obj/item/ammo_casing/shotgun/rubbershot name = "rubber shot" @@ -76,7 +76,7 @@ icon_state = "bshell" projectile_type = /obj/item/projectile/bullet/pellet/shotgun_rubbershot pellets = 6 - variance = 25 + variance = 20 materials = list(/datum/material/iron=4000) /obj/item/ammo_casing/shotgun/incapacitate @@ -85,7 +85,7 @@ 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 + variance = 20 materials = list(/datum/material/iron=4000) /obj/item/ammo_casing/shotgun/improvised @@ -160,4 +160,4 @@ desc = "A 12 gauge anti-material slug. Great for breaching airlocks and windows with minimal shots." icon_state = "breacher" projectile_type = /obj/item/projectile/bullet/shotgun_breaching - materials = list(/datum/material/iron=4000) \ No newline at end of file + materials = list(/datum/material/iron=4000) diff --git a/code/modules/projectiles/ammunition/ballistic/smg.dm b/code/modules/projectiles/ammunition/ballistic/smg.dm index 84a5d83ba17ee..1233b52acc2fa 100644 --- a/code/modules/projectiles/ammunition/ballistic/smg.dm +++ b/code/modules/projectiles/ammunition/ballistic/smg.dm @@ -16,6 +16,12 @@ desc = "A 4.6x30mm incendiary bullet casing." projectile_type = /obj/item/projectile/bullet/incendiary/c46x30mm +/obj/item/ammo_casing/c46x30mm/rubber + name = "4.6x30mm bullet casing" + desc = "A 4.6x30mm bullet casing." + caliber = "4.6x30mm" + projectile_type = /obj/item/projectile/bullet/c46x30mm_rubber + // .45 (M1911 + C20r) /obj/item/ammo_casing/c45 diff --git a/code/modules/projectiles/ammunition/caseless/_caseless.dm b/code/modules/projectiles/ammunition/caseless/_caseless.dm index db1aa6562c468..aee2570f91035 100644 --- a/code/modules/projectiles/ammunition/caseless/_caseless.dm +++ b/code/modules/projectiles/ammunition/caseless/_caseless.dm @@ -3,7 +3,7 @@ firing_effect_type = null heavy_metal = FALSE -/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from) +/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, spread_multiplier = 1, atom/fired_from) if (..()) //successfully firing moveToNullspace() QDEL_NULL(src) diff --git a/code/modules/projectiles/ammunition/caseless/arrow.dm b/code/modules/projectiles/ammunition/caseless/arrow.dm index 04769f88ece28..47090d090ed75 100644 --- a/code/modules/projectiles/ammunition/caseless/arrow.dm +++ b/code/modules/projectiles/ammunition/caseless/arrow.dm @@ -1,6 +1,6 @@ /obj/item/ammo_casing/caseless/arrow name = "arrow of questionable material" - desc = "You shouldnt be seeing this arrow" + desc = "You shouldn't be seeing this arrow" projectile_type = /obj/item/projectile/bullet/reusable/arrow caliber = "arrow" icon_state = "arrow" diff --git a/code/modules/projectiles/ammunition/caseless/misc.dm b/code/modules/projectiles/ammunition/caseless/misc.dm index fc39c9599624c..1f044176f3bc4 100644 --- a/code/modules/projectiles/ammunition/caseless/misc.dm +++ b/code/modules/projectiles/ammunition/caseless/misc.dm @@ -10,3 +10,4 @@ /obj/item/ammo_casing/caseless/laser/gatling projectile_type = /obj/item/projectile/beam/weak/penetrator variance = 0.8 + click_cooldown_override = 1 diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index 565f9928bab42..a30cfb5fb2601 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -2,9 +2,12 @@ projectile_type = /obj/item/projectile/beam/laser select_name = "kill" +/obj/item/ammo_casing/energy/laser/gatlinggun + e_cost = 1 + /obj/item/ammo_casing/energy/lasergun projectile_type = /obj/item/projectile/beam/laser - e_cost = 83 + e_cost = 71 select_name = "kill" /obj/item/ammo_casing/energy/lasergun/old diff --git a/code/modules/projectiles/ammunition/energy/portal.dm b/code/modules/projectiles/ammunition/energy/portal.dm index ec1f067080d2a..3d560158a7acb 100644 --- a/code/modules/projectiles/ammunition/energy/portal.dm +++ b/code/modules/projectiles/ammunition/energy/portal.dm @@ -4,7 +4,8 @@ harmful = FALSE fire_sound = 'sound/weapons/pulse3.ogg' select_name = "blue" - var/obj/item/gun/energy/wormhole_projector/gun + //Weakref to the gun that shot us + var/datum/weakref/gun /obj/item/ammo_casing/energy/wormhole/orange projectile_type = /obj/item/projectile/beam/wormhole/orange @@ -12,7 +13,7 @@ /obj/item/ammo_casing/energy/wormhole/Initialize(mapload, obj/item/gun/energy/wormhole_projector/wh) . = ..() - gun = wh + gun = WEAKREF(wh) /obj/item/ammo_casing/energy/wormhole/throw_proj() . = ..() diff --git a/code/modules/projectiles/ammunition/special/vortex.dm b/code/modules/projectiles/ammunition/special/vortex.dm new file mode 100644 index 0000000000000..01165cdcedd8a --- /dev/null +++ b/code/modules/projectiles/ammunition/special/vortex.dm @@ -0,0 +1,8 @@ +/obj/item/ammo_casing/energy/vortex + name = "vortex blast" + desc = "what the hell?" + projectile_type = /obj/item/projectile/energy/vortex + firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy + heavy_metal = FALSE + e_cost = 100 + select_name = "vortex blast" diff --git a/code/modules/projectiles/autofire.dm b/code/modules/projectiles/autofire.dm index 5371d5401d165..e269af4f9e69a 100644 --- a/code/modules/projectiles/autofire.dm +++ b/code/modules/projectiles/autofire.dm @@ -40,7 +40,7 @@ Everything else should be handled for you. Good luck soldier. /obj/item/gun/ballistic/automatic/c20r full_auto = TRUE -/obj/item/gun/ballistic/minigun +/obj/item/gun/energy/minigun full_auto = TRUE /obj/item/gun/ballistic/automatic/laser/ctf @@ -87,6 +87,8 @@ Everything else should be handled for you. Good luck soldier. START_PROCESSING(SSfastprocess, src) //Target acquired. Begin the spam. If we're already processing this is just ignored (see _DEFINES/MC.dm) /datum/component/full_auto/proc/unset_target() + SIGNAL_HANDLER + autofire_target = null next_process = world.time + melee_attack_delay //So you can't abuse this to magdump. @@ -106,7 +108,10 @@ Everything else should be handled for you. Good luck soldier. next_process = world.time + default_fire_delay if(L.Adjacent(autofire_target)) //Melee attack? Or ranged attack? next_process = world.time + melee_attack_delay - G.attack(autofire_target, L) + if(isobj(autofire_target)) + G.attack_obj(autofire_target, L) + else + G.attack(autofire_target, L) else G.afterattack(autofire_target,L) diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index 1ff5681ef63b5..4b9534ea73b54 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -6,6 +6,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/c38 name = "speed loader (.38)" desc = "Designed to quickly reload revolvers." @@ -20,6 +25,21 @@ desc = "Designed to quickly reload revolvers. TRAC bullets embed a tracking implant within the target's body." ammo_type = /obj/item/ammo_casing/c38/trac +/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/c38/match/bouncy + name = "speed loader (.38 Rubber)" + desc = "Designed to quickly reload revolvers. These rounds are incredibly bouncy and MOSTLY nonlethal, making them great to show off trickshots with." + ammo_type = /obj/item/ammo_casing/c38/match/bouncy + +/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/hotshot name = "speed loader (.38 Hot Shot)" desc = "Designed to quickly reload revolvers. Hot Shot bullets contain an incendiary payload." @@ -35,7 +55,7 @@ max_ammo = 6 desc = "Designed to quickly reload your fingers with lethal rounds." item_flags = DROPDEL - ammo_type = /obj/item/ammo_casing/caseless/mime/lethals + ammo_type = /obj/item/ammo_casing/caseless/mime/lethal /obj/item/ammo_box/c9mm name = "ammo box (9mm)" diff --git a/code/modules/projectiles/boxes_magazines/external/lmg.dm b/code/modules/projectiles/boxes_magazines/external/lmg.dm index 2b192f598cb56..11d18783bef8c 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/mm712x82/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 diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm index 291ec47fa82d4..7880f3f1e449a 100644 --- a/code/modules/projectiles/boxes_magazines/external/smg.dm +++ b/code/modules/projectiles/boxes_magazines/external/smg.dm @@ -27,6 +27,11 @@ ..() icon_state = "46x30mmtI-[round(ammo_count(),4)]" +/obj/item/ammo_box/magazine/wt550m9/rubber + name = "wt550 rubber magazine (4.6x30mm rubber)" + icon_state = "46x30mmt-20" + ammo_type = /obj/item/ammo_casing/c46x30mm/rubber + /obj/item/ammo_box/magazine/uzim9mm name = "uzi magazine (9mm)" icon_state = "uzi9mm-32" diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm index eb244a7ee681a..cc14f753e4f64 100644 --- a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm +++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm @@ -52,4 +52,8 @@ name = "fingergun cylinder" ammo_type = /obj/item/ammo_casing/caseless/mime caliber = "mime" - max_ammo = 6 \ No newline at end of file + max_ammo = 6 + +/obj/item/ammo_box/magazine/internal/cylinder/mime/lethal + ammo_type = /obj/item/ammo_casing/caseless/mime/lethal + max_ammo = 3 //Because that's how many this is supposed to have from what I gather diff --git a/code/modules/projectiles/boxes_magazines/internal/misc.dm b/code/modules/projectiles/boxes_magazines/internal/misc.dm deleted file mode 100644 index d723c964db4cc..0000000000000 --- a/code/modules/projectiles/boxes_magazines/internal/misc.dm +++ /dev/null @@ -1,11 +0,0 @@ -/obj/item/ammo_box/magazine/internal/minigun - name = "gatling gun fusion core" - ammo_type = /obj/item/ammo_casing/caseless/laser/gatling - caliber = "gatling" - max_ammo = 5000 - -/obj/item/ammo_box/magazine/internal/hook - name = "hook internal tube" - ammo_type = /obj/item/ammo_casing/magic/hook - caliber = "hook" - max_ammo = 1 diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm index 14e3f54ab6abe..e9988ced31c67 100644 --- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm +++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm @@ -45,4 +45,9 @@ /obj/item/ammo_box/magazine/internal/shot/breaching name = "breaching shotgun internal magazine" ammo_type = /obj/item/ammo_casing/shotgun/breacher - max_ammo = 3 \ No newline at end of file + max_ammo = 3 + +/obj/item/ammo_box/magazine/internal/shot/lever + name = "lever action shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + max_ammo = 5 \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index efdd4ab542968..f4d506fcf2ee1 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -1,5 +1,6 @@ -#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.4 +#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.1 +#define FIRING_PIN_REMOVAL_DELAY 50 /obj/item/gun name = "gun" @@ -40,14 +41,20 @@ var/weapon_weight = WEAPON_LIGHT var/dual_wield_spread = 24 //additional spread when dual wielding var/spread = 0 //Spread induced by the gun itself. + var/spread_multiplier = 1 //Multiplier for shotgun spread + var/spread_unwielded //Spread induced by holding the gun with 1 hand. (40 for light weapons, 60 for medium by default) var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. + var/is_wielded = FALSE + lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' var/obj/item/firing_pin/pin = /obj/item/firing_pin //standard firing pin for most guns var/no_pin_required = FALSE //whether the gun can be fired without a pin var/can_flashlight = FALSE //if a flashlight can be added or removed if it already has one. + + //Flashlight var/obj/item/flashlight/seclite/gun_light var/mutable_appearance/flashlight_overlay var/datum/action/item_action/toggle_gunlight/alight @@ -74,6 +81,7 @@ var/atom/autofire_target = null //What are we aiming at? This will change if you move your mouse whilst spraying. var/next_autofire = 0 //As to stop mag dumps, Whoops! var/pb_knockback = 0 + var/ranged_cooldown = 0 /obj/item/gun/Initialize() . = ..() @@ -87,6 +95,21 @@ if(!canMouseDown) //Some things like beam rifles override this. canMouseDown = automatic //Nsv13 / Bee change. build_zooming() + if(!spread_unwielded) + spread_unwielded = weapon_weight * 20 + 20 + RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/wield) + RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/unwield) + +/obj/item/gun/ComponentInitialize() + . = ..() + //Smaller weapons are better when used in a single hand. + AddComponent(/datum/component/two_handed, unwield_on_swap = TRUE, auto_wield = TRUE, ignore_attack_self = TRUE, force_wielded = force, force_unwielded = force, block_power_wielded = block_power, block_power_unwielded = block_power, wieldsound = 'sound/effects/suitstep1.ogg', unwieldsound = 'sound/effects/suitstep2.ogg') + +/obj/item/gun/proc/wield() + is_wielded = TRUE + +/obj/item/gun/proc/unwield() + is_wielded = FALSE /obj/item/gun/Destroy() if(isobj(pin)) //Can still be the initial path, then we skip @@ -99,6 +122,7 @@ QDEL_NULL(chambered) if(azoom) QDEL_NULL(azoom) + UnregisterSignal(list(COMSIG_TWOHANDED_WIELD, COMSIG_TWOHANDED_UNWIELD)) return ..() /obj/item/gun/handle_atom_del(atom/A) @@ -113,21 +137,14 @@ clear_gunlight() return ..() -/obj/item/gun/CheckParts(list/parts_list) - ..() - var/obj/item/gun/G = locate(/obj/item/gun) in contents - if(G) - G.forceMove(loc) - QDEL_NULL(G.pin) - visible_message("[G] can now fit a new pin, but the old one was destroyed in the process.", null, null, 3) - qdel(src) - /obj/item/gun/examine(mob/user) . = ..() if(no_pin_required) return + if(pin) . += "It has \a [pin] installed." + . += "[pin] looks like it could be removed with some tools." else . += "It doesn't have a firing pin installed, and won't fire." @@ -160,7 +177,7 @@ return TRUE /obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj) - to_chat(user, "*click*") + balloon_alert(user, "Gun clicks") playsound(src, dry_fire_sound, 30, TRUE) @@ -221,6 +238,8 @@ shoot_with_empty_chamber(user) return + if (ranged_cooldown>world.time) + return //Exclude lasertag guns from the TRAIT_CLUMSY check. if(clumsy_check) if(istype(user)) @@ -231,8 +250,9 @@ user.dropItemToGround(src, TRUE) return - if(weapon_weight == WEAPON_HEAVY && user.get_inactive_held_item()) - to_chat(user, "You need both hands free to fire \the [src]!") + var/obj/item/bodypart/other_hand = user.has_hand_for_held_index(user.get_inactive_hand_index()) //returns non-disabled inactive hands + if(weapon_weight == WEAPON_HEAVY && (!istype(user.get_inactive_held_item(), /obj/item/offhand) || !other_hand)) + balloon_alert(user, "You need both hands free to fire") return //DUAL (or more!) WIELDING @@ -250,8 +270,6 @@ process_fire(target, user, TRUE, params, null, bonus_spread) - - /obj/item/gun/can_trigger_gun(mob/living/user) . = ..() if(!handle_pins(user)) @@ -267,7 +285,7 @@ pin.auth_fail(user) return FALSE else - to_chat(user, "[src]'s trigger is locked. This weapon doesn't have a firing pin installed!") + balloon_alert(user, "No firing pin installed") return FALSE /obj/item/gun/proc/recharge_newshot() @@ -291,7 +309,7 @@ else //Smart spread sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread)) before_firing(target,user) - if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd, src)) + if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd, spread_multiplier, src)) shoot_with_empty_chamber(user) firing_burst = FALSE return FALSE @@ -313,9 +331,9 @@ /obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) add_fingerprint(user) if(fire_rate) - user.changeNext_move(10 / fire_rate) + ranged_cooldown = world.time + 10 / fire_rate else - user.changeNext_move(CLICK_CD_RANGE) + ranged_cooldown = world.time + CLICK_CD_RANGE if(semicd) return @@ -326,6 +344,8 @@ randomized_gun_spread = rand(0,spread) if(HAS_TRAIT(user, TRAIT_POOR_AIM)) //nice shootin' tex bonus_spread += 25 + if(!is_wielded) + bonus_spread += spread_unwielded var/randomized_bonus_spread = rand(0, bonus_spread) if(burst_size > 1) @@ -340,7 +360,7 @@ return sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) before_firing(target,user) - if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src)) + if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, spread_multiplier, src)) shoot_with_empty_chamber(user) return else @@ -394,7 +414,7 @@ if(!gun_light) if(!user.transferItemToLoc(I, src)) return - to_chat(user, "You click [S] into place on [src].") + balloon_alert(user, "[S] attached") if(S.on) set_light(0) gun_light = S @@ -408,7 +428,7 @@ return ..() if(!user.transferItemToLoc(I, src)) return - to_chat(user, "You attach [K] to [src]'s bayonet lug.") + balloon_alert(user, "[K] attached to [src]") bayonet = K var/state = "bayonet" //Generic state. if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state? @@ -440,10 +460,56 @@ else if(bayonet && can_bayonet) //if it has a bayonet, and the bayonet can be removed return remove_gun_attachment(user, I, bayonet, "unfix") + else if(pin && user.is_holding(src)) + user.visible_message("[user] attempts to remove [pin] from [src] with [I].", + "You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)", null, 3) + if(I.use_tool(src, user, FIRING_PIN_REMOVAL_DELAY, volume = 50)) + if(!pin) //check to see if the pin is still there, or we can spam messages by clicking multiple times during the tool delay + return + user.visible_message("[pin] was pried out of [src] by [user], destroying the pin in the process.", + "You pried [pin] out with [I], destroying the pin in the process.", null, 3) + QDEL_NULL(pin) + return TRUE + + +/obj/item/gun/welder_act(mob/living/user, obj/item/I) + . = ..() + if(.) + return + if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + if(pin && user.is_holding(src)) + user.visible_message("[user] attempts to remove [pin] from [src] with [I].", + "You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)", null, 3) + if(I.use_tool(src, user, FIRING_PIN_REMOVAL_DELAY, 5, volume = 50)) + if(!pin) //check to see if the pin is still there, or we can spam messages by clicking multiple times during the tool delay + return + user.visible_message("[pin] was spliced out of [src] by [user], melting part of the pin in the process.", + "You spliced [pin] out of [src] with [I], melting part of the pin in the process.", null, 3) + QDEL_NULL(pin) + return TRUE + +/obj/item/gun/wirecutter_act(mob/living/user, obj/item/I) + . = ..() + if(.) + return + if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + if(pin && user.is_holding(src)) + user.visible_message("[user] attempts to remove [pin] from [src] with [I].", + "You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)", null, 3) + if(I.use_tool(src, user, FIRING_PIN_REMOVAL_DELAY, volume = 50)) + if(!pin) //check to see if the pin is still there, or we can spam messages by clicking multiple times during the tool delay + return + user.visible_message("[pin] was ripped out of [src] by [user], mangling the pin in the process.", + "You ripped [pin] out of [src] with [I], mangling the pin in the process.", null, 3) + QDEL_NULL(pin) + return TRUE + /obj/item/gun/proc/remove_gun_attachment(mob/living/user, obj/item/tool_item, obj/item/item_to_remove, removal_verb) if(tool_item) tool_item.play_tool_sound(src) - to_chat(user, "You [removal_verb ? removal_verb : "remove"] [item_to_remove] from [src].") + balloon_alert(user, "[item_to_remove] removed") item_to_remove.forceMove(drop_location()) if(Adjacent(user) && !issilicon(user)) @@ -485,7 +551,7 @@ var/mob/living/carbon/human/user = usr gun_light.on = !gun_light.on - to_chat(user, "You toggle the gunlight [gun_light.on ? "on":"off"].") + balloon_alert(user, "Flashlight [gun_light.on ? "on":"off"]") playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) update_gunlight() @@ -530,6 +596,9 @@ if(!ishuman(user) || !ishuman(target)) return + if(HAS_TRAIT(user, TRAIT_PACIFISM)) //This prevents multiplying projectile damage without shooting yourself. + return + if(semicd) return @@ -593,6 +662,8 @@ ..() /obj/item/gun/proc/rotate(atom/thing, old_dir, new_dir) + SIGNAL_HANDLER + if(ismob(thing)) var/mob/lad = thing lad.client.view_size.zoomOut(zoom_out_amt, zoom_amt, new_dir) @@ -622,3 +693,6 @@ if(zoomable) azoom = new() azoom.gun = src + +#undef FIRING_PIN_REMOVAL_DELAY +#undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 69c8b3aa7e170..44dd8ef3b5fb3 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -129,15 +129,20 @@ chambered.forceMove(src) /obj/item/gun/ballistic/proc/rack(mob/user = null) - if (bolt_type == BOLT_TYPE_NO_BOLT) //If there's no bolt, nothing to rack - return - if (bolt_type == BOLT_TYPE_OPEN) - if(!bolt_locked) //If it's an open bolt, racking again would do nothing - if (user) - to_chat(user, "\The [src]'s [bolt_wording] is already cocked!") + switch(bolt_type) + if(BOLT_TYPE_NO_BOLT) return - bolt_locked = FALSE - if (user) + if(BOLT_TYPE_OPEN) + if(!bolt_locked) //If it's an open bolt, racking again would do nothing + if(user) + to_chat(user, "\The [src]'s [bolt_wording] is already cocked!") + return + bolt_locked = FALSE + if(BOLT_TYPE_PUMP) + if(user?.get_inactive_held_item() && !istype(user.get_inactive_held_item(), /obj/item/offhand)) + to_chat(user, "You require your other hand to be free to rack the [bolt_wording] of \the [src]!") + return + if(user) to_chat(user, "You rack the [bolt_wording] of \the [src].") process_chamber(!chambered, FALSE) if (bolt_type == BOLT_TYPE_LOCKING && !chambered) @@ -262,7 +267,7 @@ if(suppressed && can_unsuppress) var/obj/item/suppressor/S = suppressed if(!user.is_holding(src)) - return ..() + return to_chat(user, "You unscrew \the [suppressed] from \the [src].") user.put_in_hands(suppressed) w_class -= S.w_class @@ -410,6 +415,7 @@ slot_flags |= ITEM_SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally) recoil = SAWN_OFF_RECOIL sawn_off = TRUE + spread_multiplier = 1.6 update_icon() return TRUE diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index c76f29ea035d5..75d1e1df13024 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -66,6 +66,7 @@ fire_delay = 2 burst_size = 2 pin = /obj/item/firing_pin/implant/pindicate + spread_unwielded = 15 can_bayonet = TRUE knife_x_offset = 26 knife_y_offset = 12 @@ -97,6 +98,10 @@ empty_indicator = TRUE fire_rate = 3 block_upgrade_walk = 1 + w_class = WEIGHT_CLASS_BULKY + +/obj/item/gun/ballistic/automatic/wt550/rubber_loaded + mag_type = /obj/item/ammo_box/magazine/wt550m9/rubber /obj/item/gun/ballistic/automatic/mini_uzi name = "\improper Type U3 Uzi" @@ -120,6 +125,7 @@ burst_size = 3 fire_delay = 2 pin = /obj/item/firing_pin/implant/pindicate + spread_unwielded = 15 mag_display = TRUE empty_indicator = TRUE block_upgrade_walk = 1 @@ -224,6 +230,7 @@ fire_rate = 6 spread = 7 pin = /obj/item/firing_pin/implant/pindicate + spread_unwielded = 15 bolt_type = BOLT_TYPE_OPEN mag_display = TRUE mag_display_ammo = TRUE diff --git a/code/modules/projectiles/guns/ballistic/laser_gatling.dm b/code/modules/projectiles/guns/ballistic/laser_gatling.dm deleted file mode 100644 index 17be3a063d409..0000000000000 --- a/code/modules/projectiles/guns/ballistic/laser_gatling.dm +++ /dev/null @@ -1,147 +0,0 @@ - - -//The ammo/gun is stored in a back slot item -/obj/item/minigunpack - name = "backpack power source" - desc = "The massive external power source for the laser gatling gun." - icon = 'icons/obj/guns/minigun.dmi' - icon_state = "holstered" - item_state = "backpack" - lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' - slot_flags = ITEM_SLOT_BACK - w_class = WEIGHT_CLASS_HUGE - var/obj/item/gun/ballistic/minigun/gun - var/armed = 0 //whether the gun is attached, 0 is attached, 1 is the gun is wielded. - var/overheat = 0 - var/overheat_max = 40 - var/heat_diffusion = 1 - -/obj/item/minigunpack/Initialize() - . = ..() - gun = new(src) - START_PROCESSING(SSobj, src) - -/obj/item/minigunpack/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/minigunpack/process() - overheat = max(0, overheat - heat_diffusion) - -//ATTACK HAND IGNORING PARENT RETURN VALUE -/obj/item/minigunpack/attack_hand(var/mob/living/carbon/user) - if(src.loc == user) - if(!armed) - if(user.get_item_by_slot(SLOT_BACK) == src) - armed = 1 - if(!user.put_in_hands(gun)) - armed = 0 - to_chat(user, "You need a free hand to hold the gun!") - return - update_icon() - user.update_inv_back() - else - to_chat(user, "You are already holding the gun!") - else - ..() - -/obj/item/minigunpack/attackby(obj/item/W, mob/user, params) - if(W == gun) //Don't need armed check, because if you have the gun assume its armed. - user.dropItemToGround(gun, TRUE) - else - ..() - -/obj/item/minigunpack/dropped(mob/user) - if(armed) - user.dropItemToGround(gun, TRUE) - -/obj/item/minigunpack/MouseDrop(atom/over_object) - . = ..() - if(armed) - return - if(iscarbon(usr)) - var/mob/M = usr - - if(!over_object) - return - - if(!M.incapacitated()) - - if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object - M.putItemFromInventoryInHandIfPossible(src, H.held_index) - - -/obj/item/minigunpack/update_icon() - if(armed) - icon_state = "notholstered" - else - icon_state = "holstered" - -/obj/item/minigunpack/proc/attach_gun(var/mob/user) - if(!gun) - gun = new(src) - gun.forceMove(src) - armed = 0 - if(user) - to_chat(user, "You attach the [gun.name] to the [name].") - else - src.visible_message("The [gun.name] snaps back onto the [name]!") - update_icon() - user.update_inv_back() - - -/obj/item/gun/ballistic/minigun - name = "laser gatling gun" - desc = "An advanced laser cannon with an incredible rate of fire. Requires a bulky backpack power source to use." - icon = 'icons/obj/guns/minigun.dmi' - icon_state = "minigun_spin" - item_state = "minigun" - flags_1 = CONDUCT_1 - slowdown = 1 - slot_flags = null - w_class = WEIGHT_CLASS_HUGE - materials = list() - automatic = 1 - fire_rate = 10 - weapon_weight = WEAPON_HEAVY - fire_sound = 'sound/weapons/laser.ogg' - mag_type = /obj/item/ammo_box/magazine/internal/minigun - tac_reloads = FALSE - casing_ejector = FALSE - item_flags = NEEDS_PERMIT | SLOWS_WHILE_IN_HAND - var/obj/item/minigunpack/ammo_pack - -/obj/item/gun/ballistic/minigun/Initialize() - if(istype(loc, /obj/item/minigunpack)) //We should spawn inside an ammo pack so let's use that one. - ammo_pack = loc - else - return INITIALIZE_HINT_QDEL //No pack, no gun - - return ..() - -/obj/item/gun/ballistic/minigun/attack_self(mob/living/user) - 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) - if(ammo_pack) - if(ammo_pack.overheat < ammo_pack.overheat_max) - ammo_pack.overheat += burst_size - ..() - else - to_chat(user, "The gun's heat sensor locked the trigger to prevent lens damage.") - -/obj/item/gun/ballistic/minigun/afterattack(atom/target, mob/living/user, flag, params) - if(!ammo_pack || ammo_pack.loc != user) - to_chat(user, "You need the backpack power source to fire the gun!") - . = ..() - -/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 588ebb88c36f8..439edaa536501 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -10,6 +10,7 @@ fire_sound = 'sound/weapons/grenadelaunch.ogg' w_class = WEIGHT_CLASS_NORMAL pin = /obj/item/firing_pin/implant/pindicate + spread_unwielded = 15 bolt_type = BOLT_TYPE_NO_BOLT weapon_weight = WEAPON_MEDIUM fire_rate = 2 @@ -75,7 +76,7 @@ return //too difficult to remove the rocket with TK /obj/item/gun/ballistic/rocketlauncher/suicide_act(mob/living/user) - user.visible_message("[user] aims [src] at the ground! It looks like [user.p_theyre()] performing a sick rocket jump!", \ + 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 diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 0f7cd8e100375..31bdbe5de9d1b 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -20,6 +20,9 @@ /obj/item/gun/ballistic/automatic/pistol/no_mag spawnwithmagazine = FALSE +/obj/item/gun/ballistic/automatic/pistol/locker + desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors. This one is rusted from being inside of a locker for so long." + /obj/item/gun/ballistic/automatic/pistol/suppressed/Initialize(mapload) . = ..() var/obj/item/suppressor/S = new(src) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 9be063489ffa9..c3b28f09ed080 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -49,7 +49,7 @@ playsound(usr, "revolver_spin", 30, FALSE) usr.visible_message("[usr] spins [src]'s chamber.", "You spin [src]'s chamber.") else - verbs -= /obj/item/gun/ballistic/revolver/verb/spin + remove_verb(/obj/item/gun/ballistic/revolver/verb/spin) /obj/item/gun/ballistic/revolver/proc/do_spin() var/obj/item/ammo_box/magazine/internal/cylinder/C = magazine @@ -285,4 +285,8 @@ qdel(src) /obj/item/gun/ballistic/revolver/mime/attack_self(mob/user) - qdel(src) \ No newline at end of file + qdel(src) + +//The Lethal Version from Advanced Mimery +/obj/item/gun/ballistic/revolver/mime/magic + mag_type = /obj/item/ammo_box/magazine/internal/cylinder/mime/lethal diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index ba55d1a4f4d60..43e76a9fc2192 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -17,12 +17,12 @@ weapon_weight = WEAPON_MEDIUM block_upgrade_walk = 1 -obj/item/gun/ballistic/rifle/update_icon() +/obj/item/gun/ballistic/rifle/update_icon() ..() add_overlay("[icon_state]_bolt[bolt_locked ? "_locked" : ""]") -obj/item/gun/ballistic/rifle/rack(mob/user = null) - if (bolt_locked == FALSE) +/obj/item/gun/ballistic/rifle/rack(mob/user = null) + if(bolt_locked == FALSE) to_chat(user, "You open the bolt of \the [src].") playsound(src, rack_sound, rack_sound_volume, rack_sound_vary) process_chamber(FALSE, FALSE, FALSE) @@ -31,12 +31,12 @@ obj/item/gun/ballistic/rifle/rack(mob/user = null) return drop_bolt(user) -obj/item/gun/ballistic/rifle/can_shoot() +/obj/item/gun/ballistic/rifle/can_shoot() if (bolt_locked) return FALSE return ..() -obj/item/gun/ballistic/rifle/attackby(obj/item/A, mob/user, params) +/obj/item/gun/ballistic/rifle/attackby(obj/item/A, mob/user, params) if (!bolt_locked) to_chat(user, "The bolt is closed!") return @@ -60,6 +60,8 @@ obj/item/gun/ballistic/rifle/attackby(obj/item/A, mob/user, params) can_bayonet = TRUE knife_x_offset = 27 knife_y_offset = 13 + w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_HEAVY /obj/item/gun/ballistic/rifle/boltaction/enchanted name = "enchanted bolt action rifle" diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 7136d0565b318..adf7ca8cdc8b1 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -22,10 +22,12 @@ internal_magazine = TRUE casing_ejector = FALSE bolt_wording = "pump" + bolt_type = BOLT_TYPE_PUMP cartridge_wording = "shell" tac_reloads = FALSE fire_rate = 1 //reee block_upgrade_walk = 1 + recoil = 1 pb_knockback = 2 /obj/item/gun/ballistic/shotgun/blow_up(mob/user) @@ -58,6 +60,9 @@ // Automatic Shotguns// +/obj/item/gun/ballistic/shotgun/automatic + weapon_weight = WEAPON_HEAVY + /obj/item/gun/ballistic/shotgun/automatic/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1) ..() rack() @@ -75,8 +80,16 @@ desc = "A compact version of the semi automatic combat shotgun. For close encounters." icon_state = "cshotgunc" mag_type = /obj/item/ammo_box/magazine/internal/shot/com/compact + weapon_weight = WEAPON_MEDIUM w_class = WEIGHT_CLASS_BULKY +/obj/item/gun/ballistic/shotgun/automatic/combat/compact/shoot_live_shot(mob/living/user, pointblank, atom/pbtarget, message) + if(!is_wielded) + recoil = 6 + else + recoil = initial(recoil) + . = ..() + // Breaching Shotgun // /obj/item/gun/ballistic/shotgun/automatic/breaching @@ -133,7 +146,7 @@ /obj/item/gun/ballistic/shotgun/bulldog name = "\improper Bulldog Shotgun" - desc = "A semi-auto, mag-fed shotgun for combat in narrow corridors, nicknamed 'Bulldog' by boarding parties. Compatible only with specialized 8-round drum magazines." + desc = "A semi-auto, mag-fed shotgun for combat in narrow corridors with a built in recoil dampening system, nicknamed 'Bulldog' by boarding parties. Compatible only with specialized 8-round drum magazines." icon_state = "bulldog" item_state = "bulldog" w_class = WEIGHT_CLASS_NORMAL @@ -143,6 +156,7 @@ burst_size = 1 fire_delay = 0 pin = /obj/item/firing_pin/implant/pindicate + spread_unwielded = 15 actions_types = list() mag_display = TRUE empty_indicator = TRUE @@ -153,7 +167,8 @@ tac_reloads = TRUE fire_rate = 2 automatic = 1 - + recoil = 0 + bolt_type = BOLT_TYPE_STANDARD //Not using a pump /obj/item/gun/ballistic/shotgun/bulldog/unrestricted pin = /obj/item/firing_pin @@ -214,6 +229,7 @@ mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised sawn_desc = "I'm just here for the gasoline." unique_reskin = null + recoil = 2 var/slung = FALSE /obj/item/gun/ballistic/shotgun/doublebarrel/improvised/attackby(obj/item/A, mob/user, params) diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index fd5f79a48d9bf..68ca8ada85d2e 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -59,6 +59,7 @@ casing_ejector = FALSE can_suppress = FALSE pb_knockback = 0 + recoil = 0 /obj/item/gun/ballistic/shotgun/toy/update_icon() . = ..() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 82439c28eff04..b142e7fb958ca 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -16,8 +16,8 @@ var/shaded_charge = FALSE //if this gun uses a stateful charge bar for more detail var/old_ratio = 0 // stores the gun's previous ammo "ratio" to see if it needs an updated icon var/selfcharge = 0 - var/charge_tick = 0 - var/charge_delay = 4 + var/charge_timer = 0 + var/charge_delay = 8 var/use_cyborg_cell = FALSE //whether the gun's cell drains the cyborg user's cell to recharge var/dead_cell = FALSE //set to true so the gun is given an empty cell @@ -68,12 +68,12 @@ update_icon(FALSE, TRUE) return ..() -/obj/item/gun/energy/process() +/obj/item/gun/energy/process(delta_time) if(selfcharge && cell && cell.percent() < 100) - charge_tick++ - if(charge_tick < charge_delay) + charge_timer += delta_time + if(charge_timer < charge_delay) return - charge_tick = 0 + charge_timer = 0 cell.give(100) if(!chambered) //if empty chamber we try to charge a new shot recharge_newshot(TRUE) @@ -130,7 +130,7 @@ fire_sound = shot.fire_sound fire_delay = shot.delay if (shot.select_name) - to_chat(user, "[src] is now set to [shot.select_name].") + balloon_alert(user, "Set to [shot.select_name]") chambered = null recharge_newshot(TRUE) update_icon(TRUE) diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm index 143b7444c600b..3267e7f25efca 100644 --- a/code/modules/projectiles/guns/energy/dueling.dm +++ b/code/modules/projectiles/guns/energy/dueling.dm @@ -1,6 +1,6 @@ #define DUEL_IDLE 1 #define DUEL_PREPARATION 2 -#define DUEL_READY 3 +#define DUEL_READY 3 #define DUEL_COUNTDOWN 4 #define DUEL_FIRING 5 @@ -219,7 +219,7 @@ else duel.fired[src] = TRUE . = ..() - + /obj/item/gun/energy/dueling/before_firing(target,user) var/obj/item/ammo_casing/energy/duel/D = chambered D.setting = setting @@ -253,7 +253,7 @@ D.setting = setting D.update_icon() -/obj/item/ammo_casing/energy/duel/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from) +/obj/item/ammo_casing/energy/duel/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, spread_multiplier = 1, atom/fired_from) . = ..() var/obj/effect/temp_visual/dueling_chaff/C = new(get_turf(user)) C.setting = setting @@ -297,7 +297,7 @@ var/mob/living/L = target if(!istype(target)) return BULLET_ACT_BLOCK - + var/obj/item/bodypart/B = L.get_bodypart(BODY_ZONE_HEAD) B.dismember() qdel(B) diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index ab5dc51efce6a..9348855cf2a0d 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -2,6 +2,7 @@ name = "energy gun" desc = "A basic hybrid energy gun with two settings: disable and kill." icon_state = "energy" + w_class = WEIGHT_CLASS_BULKY //powergaming is kill item_state = null //so the human update icon uses the icon_state instead. ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) modifystate = 1 @@ -59,6 +60,7 @@ 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." cell_type = /obj/item/stock_parts/cell{charge = 1200; maxcharge = 1200} icon_state = "hoslaser" + w_class = WEIGHT_CLASS_NORMAL force = 10 automatic = 1 fire_rate = 3 @@ -78,6 +80,7 @@ can_flashlight = FALSE ammo_x_offset = 1 fire_rate = 1.5 + w_class = WEIGHT_CLASS_NORMAL /obj/item/gun/energy/e_gun/dragnet/snare name = "Energy Snare Launcher" @@ -105,7 +108,7 @@ desc = "An energy gun with an experimental miniaturized nuclear reactor that automatically charges the internal power cell." icon_state = "nucgun" item_state = "nucgun" - charge_delay = 5 + charge_delay = 10 pin = null can_charge = FALSE ammo_x_offset = 1 @@ -115,9 +118,9 @@ var/fail_tick = 0 var/fail_chance = 0 -/obj/item/gun/energy/e_gun/nuclear/process() +/obj/item/gun/energy/e_gun/nuclear/process(delta_time) if(fail_tick > 0) - fail_tick-- + fail_tick -= delta_time * 0.5 ..() /obj/item/gun/energy/e_gun/nuclear/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 224f9f25d1a72..567cf698f20ed 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -227,7 +227,8 @@ icon_state = "modkit" w_class = WEIGHT_CLASS_SMALL require_module = 1 - module_type = /obj/item/robot_module/miner + module_type = list(/obj/item/robot_module/miner) + module_flags = BORG_MODULE_MINER var/denied_type = null var/maximum_of_type = 1 var/cost = 30 @@ -384,10 +385,8 @@ return new /obj/effect/temp_visual/explosion/fast(target_turf) if(turf_aoe) - for(var/T in RANGE_TURFS(1, target_turf) - target_turf) - if(ismineralturf(T)) - var/turf/closed/mineral/M = T - M.gets_drilled(K.firer) + for(var/turf/closed/mineral/M in RANGE_TURFS(1, target_turf) - target_turf) + M.gets_drilled(K.firer) if(modifier) for(var/mob/living/L in range(1, target_turf) - K.firer - target) var/armor = L.run_armor_check(K.def_zone, K.flag, "", "", K.armour_penetration) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 7c546031dea54..2abeef720fc9b 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -4,7 +4,7 @@ icon_state = "laser" item_state = "laser" block_upgrade_walk = 1 - w_class = WEIGHT_CLASS_NORMAL + w_class = WEIGHT_CLASS_BULKY materials = list(/datum/material/iron=2000) ammo_type = list(/obj/item/ammo_casing/energy/lasergun) ammo_x_offset = 1 @@ -34,7 +34,8 @@ name = "antique laser gun" icon_state = "caplaser" item_state = "caplaser" - desc = "This is an antique laser gun. All craftsmanship is of the highest quality. It is decorated with assistant leather and chrome. The object menaces with spikes of energy. On the item is an image of Space Station 13. The station is exploding." + w_class = WEIGHT_CLASS_NORMAL + desc = "This is an antique laser gun. All craftsmanship is of the highest quality. It is decorated with assistant leather and chrome. The object menaces with spikes of energy. On the item is an image of Space Station 13 with the words NTSSGolden engraved. The station is exploding." force = 10 ammo_x_offset = 3 selfcharge = 1 @@ -110,6 +111,7 @@ ammo_type = list(/obj/item/ammo_casing/energy/xray) pin = null ammo_x_offset = 3 + w_class = WEIGHT_CLASS_BULKY ////////Laser Tag//////////////////// diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm new file mode 100644 index 0000000000000..bf852f7b1afbb --- /dev/null +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -0,0 +1,191 @@ + + +//The ammo/gun is stored in a back slot item +/obj/item/minigunpack + name = "backpack power source" + desc = "The massive external power source for the laser gatling gun." + icon = 'icons/obj/guns/minigun.dmi' + icon_state = "holstered" + item_state = "backpack" + lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' + slot_flags = ITEM_SLOT_BACK + w_class = WEIGHT_CLASS_HUGE + var/obj/item/gun/energy/minigun/gun + var/armed = 0 //whether the gun is attached, 0 is attached, 1 is the gun is wielded. + var/overheat = 0 + var/overheat_max = 40 + var/heat_diffusion = 0.5 + +/obj/item/minigunpack/Initialize() + . = ..() + gun = new(src) + START_PROCESSING(SSobj, src) + +/obj/item/minigunpack/Destroy() + if(!QDELETED(gun)) + qdel(gun) + gun = null + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/minigunpack/process(delta_time) + overheat = max(0, overheat - heat_diffusion * delta_time) + +//ATTACK HAND IGNORING PARENT RETURN VALUE +/obj/item/minigunpack/attack_hand(var/mob/living/carbon/user) + if(src.loc == user) + if(!armed) + if(user.get_item_by_slot(ITEM_SLOT_BACK) == src) + armed = 1 + if(!user.put_in_hands(gun)) + armed = 0 + to_chat(user, "You need a free hand to hold the gun!") + return + update_icon() + user.update_inv_back() + else + to_chat(user, "You are already holding the gun!") + else + ..() + +/obj/item/minigunpack/attackby(obj/item/W, mob/user, params) + if(W == gun) //Don't need armed check, because if you have the gun assume its armed. + user.dropItemToGround(gun, TRUE) + else + ..() + +/obj/item/minigunpack/dropped(mob/user) + if(armed) + user.dropItemToGround(gun, TRUE) + +/obj/item/minigunpack/MouseDrop(atom/over_object) + . = ..() + if(armed) + return + if(iscarbon(usr)) + var/mob/M = usr + + if(!over_object) + return + + if(!M.incapacitated()) + + if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object + M.putItemFromInventoryInHandIfPossible(src, H.held_index) + + +/obj/item/minigunpack/update_icon() + if(armed) + icon_state = "notholstered" + else + icon_state = "holstered" + +/obj/item/minigunpack/proc/attach_gun(var/mob/user) + if(!gun) + gun = new(src) + gun.forceMove(src) + armed = 0 + if(user) + to_chat(user, "You attach the [gun.name] to the [name].") + else + src.visible_message("The [gun.name] snaps back onto the [name]!") + update_icon() + user.update_inv_back() + +/obj/item/minigunpack/emag_act(mob/user) + if(obj_flags & EMAGGED) + return + obj_flags |= EMAGGED + to_chat(user, "You break the heat sensor.") + overheat_max = 1000 + +/obj/item/stock_parts/cell/minigun + name = "Minigun gun fusion core" + maxcharge = 500000 + self_recharge = 0 + +/obj/item/gun/energy/minigun + name = "laser gatling gun" + desc = "An advanced laser cannon with an incredible rate of fire. Requires a bulky backpack power source to use." + icon = 'icons/obj/guns/minigun.dmi' + icon_state = "minigun_spin" + item_state = "minigun" + flags_1 = CONDUCT_1 + slowdown = 1 + slot_flags = null + w_class = WEIGHT_CLASS_HUGE + materials = list() + automatic = 1 + fire_rate = 10 + weapon_weight = WEAPON_HEAVY + ammo_type = list(/obj/item/ammo_casing/energy/laser) + cell_type = /obj/item/stock_parts/cell/minigun + can_charge = FALSE + fire_sound = 'sound/weapons/laser.ogg' + item_flags = NEEDS_PERMIT | SLOWS_WHILE_IN_HAND + var/cooldown = 0 + var/obj/item/minigunpack/ammo_pack + +/obj/item/gun/energy/minigun/Initialize() + if(istype(loc, /obj/item/minigunpack)) //We should spawn inside an ammo pack so let's use that one. + ammo_pack = loc + else + return INITIALIZE_HINT_QDEL //No pack, no gun + + return ..() + +/obj/item/gun/energy/minigun/Destroy() + if(!QDELETED(ammo_pack)) + qdel(ammo_pack) + ammo_pack = null + return ..() + +/obj/item/gun/energy/minigun/attack_self(mob/living/user) + return + +/obj/item/gun/energy/minigun/dropped(mob/user) + if(ammo_pack) + ammo_pack.attach_gun(user) + else + qdel(src) + +/obj/item/gun/energy/minigun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) + if(ammo_pack) + if(obj_flags & EMAGGED) + if(cooldown < world.time) + cooldown = world.time + 50 + playsound(get_turf(src), 'sound/weapons/heavyminigunstart.ogg', 50, 0, 0) + slowdown = 5 + sleep(15) + if(ammo_pack.overheat < ammo_pack.overheat_max) + ammo_pack.overheat += burst_size + playsound(get_turf(src), 'sound/weapons/heavyminigunshoot.ogg', 60, 0, 0) + ..() + playsound(get_turf(src), 'sound/weapons/heavyminigunstop.ogg', 50, 0, 0) + slowdown = initial(slowdown) + else + to_chat(user, "The gun's heat sensor locked the trigger to prevent lens damage.") + else + ..() + +/obj/item/gun/energy/minigun/afterattack(atom/target, mob/living/user, flag, params) + if(!ammo_pack || ammo_pack.loc != user) + to_chat(user, "You need the backpack power source to fire the gun!") + . = ..() + +/obj/item/gun/energy/minigun/dropped(mob/living/user) + ammo_pack.attach_gun(user) + +/obj/item/gun/energy/minigun/emag_act(mob/user) + if(obj_flags & EMAGGED) + return + obj_flags |= EMAGGED + fire_sound = null + spread = 60 + recoil = 1 + burst_size = 120 + fire_delay = 0.2 + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 30, 0, 0) + to_chat(user, "OVERDRIVE.") diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 8ff6270eca997..40160c076bb22 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -27,6 +27,9 @@ flight_x_offset = 18 flight_y_offset = 11 +/obj/item/gun/energy/ionrifle/carbine/pin + pin = /obj/item/firing_pin + /obj/item/gun/energy/decloner name = "biological demolecularisor" desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements." @@ -237,8 +240,8 @@ can_charge = FALSE use_cyborg_cell = TRUE tool_behaviour = null //because it will drain the cutters cell and not the borgs. - - + + /obj/item/gun/energy/wormhole_projector name = "bluespace wormhole projector" desc = "A projector that emits high density quantum-coupled bluespace beams." @@ -258,10 +261,10 @@ for(var/i in 1 to ammo_type.len) var/obj/item/ammo_casing/energy/wormhole/W = ammo_type[i] if(istype(W)) - W.gun = src + W.gun = WEAKREF(src) var/obj/item/projectile/beam/wormhole/WH = W.BB if(istype(WH)) - WH.gun = src + WH.gun = WEAKREF(src) /obj/item/gun/energy/wormhole_projector/process_chamber() ..() @@ -337,11 +340,15 @@ pin = null block_upgrade_walk = 1 +/obj/item/gun/energy/temperature/pin + pin = /obj/item/firing_pin + /obj/item/gun/energy/temperature/security name = "security temperature gun" desc = "A weapon that can only be used to its full potential by the truly robust." pin = /obj/item/firing_pin block_upgrade_walk = 1 + w_class = WEIGHT_CLASS_BULKY /obj/item/gun/energy/laser/instakill name = "instakill rifle" diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 2b8e0e0bf5a9f..5d3639e0c438c 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -12,8 +12,8 @@ var/checks_antimagic = TRUE var/max_charges = 6 var/charges = 0 - var/recharge_rate = 4 - var/charge_tick = 0 + var/recharge_rate = 8 + var/charge_timer = 0 var/can_charge = TRUE var/ammo_type var/no_den_usage @@ -64,12 +64,14 @@ STOP_PROCESSING(SSobj, src) return ..() - -/obj/item/gun/magic/process() - charge_tick++ - if(charge_tick < recharge_rate || charges >= max_charges) +/obj/item/gun/magic/process(delta_time) + if (charges >= max_charges) + charge_timer = 0 + return + charge_timer += delta_time + if(charge_timer < recharge_rate) return 0 - charge_tick = 0 + charge_timer = 0 charges++ if(charges == 1) recharge_newshot() diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 84fe4ce6c3a35..157d2ac4bea3b 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -76,6 +76,9 @@ var/datum/action/item_action/zoom_lock_action/zoom_lock_action var/mob/listeningTo + var/obj/aiming_target + var/aiming_params + /obj/item/gun/energy/beam_rifle/debug delay = 0 cell_type = /obj/item/stock_parts/cell/infinite @@ -197,12 +200,12 @@ else P.color = rgb(0, 255, 0) var/turf/curloc = get_turf(src) - var/turf/targloc = get_turf(current_user.client.mouseObject) + var/turf/targloc = get_turf(aiming_target) if(!istype(targloc)) if(!istype(curloc)) return targloc = get_turf_in_angle(lastangle, curloc, 10) - P.preparePixelProjectile(targloc, current_user, current_user.client.mouseParams, 0) + P.preparePixelProjectile(targloc, current_user, aiming_params, 0) P.fire(lastangle) /obj/item/gun/energy/beam_rifle/process() @@ -224,14 +227,16 @@ return TRUE /obj/item/gun/energy/beam_rifle/proc/process_aim() - if(istype(current_user) && current_user.client && current_user.client.mouseParams) - var/angle = mouse_angle_from_client(current_user.client) + if(istype(current_user) && current_user.client) + var/angle = mouse_angle_from_client(current_user.client, aiming_params) current_user.setDir(angle2dir_cardinal(angle)) var/difference = abs(closer_angle_difference(lastangle, angle)) delay_penalty(difference * aiming_time_increase_angle_multiplier) lastangle = angle /obj/item/gun/energy/beam_rifle/proc/on_mob_move() + SIGNAL_HANDLER + check_user() if(aiming) delay_penalty(aiming_time_increase_user_movement) @@ -261,15 +266,15 @@ UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) listeningTo = null if(istype(current_user)) - LAZYREMOVE(current_user.mousemove_intercept_objects, src) 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) + aiming_target = over_object + aiming_params = params if(aiming) process_aim() aiming_beam() @@ -281,7 +286,7 @@ /obj/item/gun/energy/beam_rifle/onMouseDown(object, location, params, mob/mob) if(istype(mob)) set_user(mob) - if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) + if(istype(object, /atom/movable/screen) && !istype(object, /atom/movable/screen/click_catcher)) return if((object in mob.contents) || (object == mob)) return @@ -289,12 +294,12 @@ return ..() /obj/item/gun/energy/beam_rifle/onMouseUp(object, location, params, mob/M) - if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) + if(istype(object, /atom/movable/screen) && !istype(object, /atom/movable/screen/click_catcher)) return process_aim() if(aiming_time_left <= aiming_time_fire_threshold && check_user()) sync_ammo() - afterattack(M.client.mouseObject, M, FALSE, M.client.mouseParams, passthrough = TRUE) + afterattack(object, M, FALSE, params, passthrough = TRUE) stop_aiming() QDEL_LIST(current_tracers) return ..() @@ -441,11 +446,11 @@ if(!epicenter) return new /obj/effect/temp_visual/explosion/fast(epicenter) - for(var/mob/living/L in range(aoe_mob_range, epicenter)) //handle aoe mob damage + for(var/mob/living/L in hearers(aoe_mob_range, epicenter)) //handle aoe mob damage L.adjustFireLoss(aoe_mob_damage) to_chat(L, "\The [src] sears you!") - for(var/turf/T in range(aoe_fire_range, epicenter)) //handle aoe fire - if(prob(aoe_fire_chance)) + for(var/turf/open/T in RANGE_TURFS(aoe_fire_range, epicenter)) //handle aoe fire + if(prob(aoe_fire_chance) && can_see(epicenter, T, aoe_fire_range)) new /obj/effect/hotspot(T) for(var/obj/O in range(aoe_structure_range, epicenter)) if(!isitem(O)) @@ -465,7 +470,7 @@ var/turf/closed/wall/W = target W.dismantle_wall(TRUE, TRUE) else - target.ex_act(EXPLODE_HEAVY) + SSexplosions.medturf += target return TRUE if(ismovableatom(target)) var/atom/movable/AM = target diff --git a/code/modules/projectiles/guns/misc/grenade_launcher.dm b/code/modules/projectiles/guns/misc/grenade_launcher.dm index e8ce62f12d061..48eff29eeebdb 100644 --- a/code/modules/projectiles/guns/misc/grenade_launcher.dm +++ b/code/modules/projectiles/guns/misc/grenade_launcher.dm @@ -47,3 +47,6 @@ F.icon_state = initial(F.icon_state) + "_active" playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) addtimer(CALLBACK(F, /obj/item/grenade.proc/prime), 15) + +/obj/item/gun/grenadelauncher/security + desc = "A terrible, terrible thing. It's really awful! It's been crudely painted blue." diff --git a/code/modules/projectiles/guns/misc/medbeam.dm b/code/modules/projectiles/guns/misc/medbeam.dm index 36e9317e5b23e..3e51445576bf0 100644 --- a/code/modules/projectiles/guns/misc/medbeam.dm +++ b/code/modules/projectiles/guns/misc/medbeam.dm @@ -116,7 +116,7 @@ new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF") target.adjustBruteLoss(-4) target.adjustFireLoss(-4) - target.adjustToxLoss(-1) + target.adjustToxLoss(-1, FALSE, TRUE) target.adjustOxyLoss(-1) return diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm index 8482e5667bd47..72fcdf5d1539e 100644 --- a/code/modules/projectiles/guns/misc/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -10,11 +10,14 @@ materials = list(/datum/material/iron=2000) clumsy_check = 0 fire_sound = 'sound/items/syringeproj.ogg' + var/load_sound = 'sound/weapons/shotguninsert.ogg' var/list/syringes = list() var/max_syringes = 1 + var/has_syringe_overlay = TRUE ///If it has an overlay for inserted syringes. If true, the overlay is determined by the number of syringes inserted into it. /obj/item/gun/syringe/Initialize() . = ..() + update_icon() chambered = new /obj/item/ammo_casing/syringegun(src) /obj/item/gun/syringe/handle_atom_del(atom/A) @@ -33,6 +36,7 @@ /obj/item/gun/syringe/process_chamber() if(chambered && !chambered.BB) //we just fired recharge_newshot() + update_icon() /obj/item/gun/syringe/examine(mob/user) . = ..() @@ -46,13 +50,14 @@ var/obj/item/reagent_containers/syringe/S = syringes[syringes.len] if(!S) - return 0 + return FALSE user.put_in_hands(S) syringes.Remove(S) + update_icon() to_chat(user, "You unload [S] from \the [src].") - return 1 + return TRUE /obj/item/gun/syringe/attackby(obj/item/A, mob/user, params, show_msg = TRUE) if(istype(A, /obj/item/reagent_containers/syringe)) @@ -62,11 +67,20 @@ to_chat(user, "You load [A] into \the [src].") syringes += A recharge_newshot() + update_icon() + playsound(loc, load_sound, 40) return TRUE else to_chat(user, "[src] cannot hold more syringes!") return FALSE +/obj/item/gun/syringe/update_overlays() + . = ..() + if(!has_syringe_overlay) + return + var/syringe_count = syringes.len + . += "[initial(icon_state)]_[syringe_count ? clamp(syringe_count, 1, initial(max_syringes)) : "empty"]" + /obj/item/gun/syringe/rapidsyringe name = "rapid syringe gun" desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes." @@ -105,6 +119,8 @@ to_chat(user, "You load \the [D] into \the [src].") syringes += D recharge_newshot() + update_icon() + playsound(loc, load_sound, 40) return TRUE else to_chat(user, "[src] cannot hold more syringes!") @@ -114,6 +130,7 @@ name = "blowgun" desc = "Fire syringes at a short distance." icon_state = "blowgun" + has_syringe_overlay = FALSE item_state = "blowgun" fire_sound = 'sound/items/syringeproj.ogg' no_pin_required = TRUE @@ -124,4 +141,4 @@ if(do_after(user, 25, target = src)) user.adjustStaminaLoss(20) user.adjustOxyLoss(20) - ..() + return ..() \ No newline at end of file diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index 9a7edd5f3ef1d..98b47d3104efd 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -60,10 +60,10 @@ /obj/item/firing_pin/proc/auth_fail(mob/living/user) if(user) - user.show_message(fail_message, 1) + user.show_message(fail_message, MSG_VISUAL) if(selfdestruct) if(user) - user.show_message("SELF-DESTRUCTING...
", 1) + user.show_message("SELF-DESTRUCTING...
", MSG_VISUAL) to_chat(user, "[gun] explodes!") explosion(get_turf(gun), -1, 0, 2, 3) if(gun) @@ -86,7 +86,7 @@ /obj/item/firing_pin/test_range/pin_auth(mob/living/user) if(!istype(user)) return FALSE - for(var/obj/machinery/magnetic_controller/M in range(user, 3)) + if(locate(/obj/machinery/magnetic_controller) in range(3, user)) return TRUE return FALSE diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 6b794624e73f7..a2a82f431975b 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -37,16 +37,30 @@ var/datum/point/vector/trajectory var/trajectory_ignore_forcemove = FALSE //instructs forceMove to NOT reset our trajectory to the new location! - var/speed = 0.7 //Amount of deciseconds it takes for projectile to travel + 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 = NO_STEPS //Use SLIDE_STEPS in conjunction with legacy - var/ricochets = 0 - var/ricochets_max = 2 - var/ricochet_chance = 30 - var/force_hit = FALSE //If the object being hit can pass ths damage on to something else, it should not do it for this bullet. + var/ricochets = 0 // how many times we've ricochet'd so far (instance variable, not a stat) + /// 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. @@ -104,9 +118,15 @@ var/dismemberment = 0 //The higher the number, the greater the bonus to dismembering. 0 will not dismember at all. var/impact_effect_type //what type of impact effect to show when hitting something var/log_override = FALSE //is this type spammed enough to not log? (KAs) + var/martial_arts_no_deflect = FALSE 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() @@ -118,6 +138,7 @@ 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 @@ -137,6 +158,9 @@ /obj/item/projectile/proc/on_hit(atom/target, blocked = FALSE) if(fired_from) SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_BEFORE_FIRE, src, original) + // 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 + SEND_SIGNAL(src, COMSIG_PROJECTILE_SELF_ON_HIT, firer, target, Angle) var/turf/target_loca = get_turf(target) var/hitx @@ -172,14 +196,15 @@ if(isalien(L)) new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir) var/obj/item/bodypart/B = L.get_bodypart(def_zone) - if(B.status == BODYPART_ROBOTIC) // So if you hit a robotic, it sparks instead of bloodspatters - do_sparks(2, FALSE, target.loc) - if(prob(25)) - new /obj/effect/decal/cleanable/oil(target_loca) - else - new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir) - if(prob(33)) - L.add_splatter_floor(target_loca) + if(B) + if(B.status == BODYPART_ROBOTIC) // So if you hit a robotic, it sparks instead of bloodspatters + do_sparks(2, FALSE, target.loc) + if(prob(25)) + new /obj/effect/decal/cleanable/oil(target_loca) + else + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir) + if(prob(33)) + L.add_splatter_floor(target_loca) else if(impact_effect_type && !hitscan) new impact_effect_type(target_loca, hitx, hity) @@ -187,7 +212,9 @@ var/limb_hit = L.check_limb_hit(def_zone)//to get the correct message info. 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 @@ -199,11 +226,16 @@ L.on_hit(src) var/reagent_note - if(reagents?.reagent_list) + if(length(reagents?.reagent_list) > 0) reagent_note = " REAGENTS:" for(var/datum/reagent/R in reagents.reagent_list) reagent_note += "[R.name] ([num2text(R.volume)])" - + if(istype(src, /obj/item/projectile/bullet/dart)) + var/obj/item/projectile/bullet/dart/D = src + if(length(D.syringe?.reagents?.reagent_list) > 0) + reagent_note = " REAGENTS:" + for(var/datum/reagent/R in D.syringe.reagents.reagent_list) + reagent_note += "[R.name] ([num2text(R.volume)])" if(ismob(firer)) log_combat(firer, L, "shot", src, reagent_note) else @@ -218,7 +250,23 @@ 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_Angle(src.loc, L.loc))) + if(our_angle < best_angle) + best_angle = our_angle + unlucky_sob = L + + if(unlucky_sob) + setAngle(Get_Angle(src, unlucky_sob.loc)) /obj/item/projectile/proc/store_hitscan_collision(datum/point/pcache) beam_segments[beam_index] = pcache @@ -316,8 +364,12 @@ return FALSE /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 /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. @@ -396,7 +448,7 @@ last_projectile_move = world.time fired = TRUE if(hitscan) - process_hitscan() + INVOKE_ASYNC(src, .proc/process_hitscan) if(!(datum_flags & DF_ISPROCESSING)) START_PROCESSING(SSprojectiles, src) pixel_move(1, FALSE) //move it now! @@ -501,6 +553,8 @@ else if(T != loc) step_towards(src, T) hitscan_last = loc + if(QDELETED(src)) + return 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 @@ -633,13 +687,14 @@ finalize_hitscan_and_generate_tracers() STOP_PROCESSING(SSprojectiles, src) cleanup_beam_segments() - qdel(trajectory) + if(trajectory) + QDEL_NULL(trajectory) return ..() /obj/item/projectile/proc/cleanup_beam_segments() QDEL_LIST_ASSOC(beam_segments) beam_segments = list() - qdel(beam_index) + QDEL_NULL(beam_index) /obj/item/projectile/proc/finalize_hitscan_and_generate_tracers(impacting = TRUE) if(trajectory && beam_index) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 21e2e2cd60cfe..a397c67a77cbe 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -37,9 +37,10 @@ impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser/wall /obj/item/projectile/beam/weak - damage = 15 + damage = 8 -/obj/item/projectile/beam/weak/penetrator +/obj/item/projectile/beam/weak/penetrator //laser gatling and centcom shuttle turret + damage = 15 armour_penetration = 50 /obj/item/projectile/beam/practice @@ -69,7 +70,7 @@ /obj/item/projectile/beam/disabler name = "disabler beam" icon_state = "omnilaser" - damage = 35 + damage = 28 damage_type = STAMINA flag = "energy" hitsound = 'sound/weapons/tap.ogg' @@ -93,7 +94,10 @@ /obj/item/projectile/beam/pulse/on_hit(atom/target, blocked = FALSE) . = ..() if (!QDELETED(target) && (isturf(target) || istype(target, /obj/structure/))) - target.ex_act(EXPLODE_HEAVY) + if(isobj(target)) + SSexplosions.med_mov_atom += target + else + SSexplosions.medturf += target /obj/item/projectile/beam/pulse/shotgun damage = 40 @@ -125,10 +129,11 @@ hitsound = null damage = 0 damage_type = STAMINA - flag = "laser" + flag = "energy" var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag) impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE + martial_arts_no_deflect = TRUE /obj/item/projectile/beam/lasertag/on_hit(atom/target, blocked = FALSE) . = ..() diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm index f34b6d60acd43..e305b86dcdaf1 100644 --- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm +++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm @@ -13,7 +13,7 @@ if(iscarbon(target)) var/mob/living/carbon/M = target if(blocked != 100) // not completely blocked - if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. + if(M.can_inject(firer, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. ..() if(syringe) syringe.embed(M) @@ -40,13 +40,6 @@ reagents.add_reagent(/datum/reagent/foaming_agent, 5) reagents.add_reagent(/datum/reagent/toxin/acid/fluacid, 5) -/obj/item/projectile/bullet/dart/tranq - name = "syringe" - icon_state = "syringeproj" - -/obj/item/projectile/bullet/dart/tranq/Initialize() - . = ..() - reagents.add_reagent(/datum/reagent/toxin/chloralhydrate, 4) //these'll get the victim wallslamming and then sleep em, but it will take awhile before it puts the victim to sleep /obj/item/projectile/bullet/dart/syringe name = "syringe" @@ -67,29 +60,48 @@ var/mob/living/simple_animal/hostile/poison/bees/B = new(src.loc) for(var/datum/reagent/R in reagents.reagent_list) B.assign_reagent(GLOB.chemical_reagents_list[R.type]) - break + break else playsound(src, 'sound/effects/splat.ogg', 40, 1) new /obj/effect/decal/cleanable/insectguts(src.loc) - + else if (prob(20)) //high velocity bees die easily var/mob/living/simple_animal/hostile/poison/bees/B = new(M.loc) for(var/datum/reagent/R in reagents.reagent_list) B.assign_reagent(GLOB.chemical_reagents_list[R.type]) break - + else playsound(src, 'sound/effects/splat.ogg', 40, 1) new /obj/effect/decal/cleanable/insectguts(src.loc) - + else if(prob(20)) var/mob/living/simple_animal/hostile/poison/bees/B = new(src.loc) for(var/datum/reagent/R in reagents.reagent_list) B.assign_reagent(GLOB.chemical_reagents_list[R.type]) break - + else playsound(src, 'sound/effects/splat.ogg', 40, 1) new /obj/effect/decal/cleanable/insectguts(src.loc) - + return ..() + +/obj/item/projectile/bullet/dart/tranq + name = "tranquilizer dart" + +/obj/item/projectile/bullet/dart/tranq/Initialize() + . = ..() + reagents.add_reagent(/datum/reagent/toxin/chloralhydrate, 4) //these'll get the victim wallslamming and then sleep em, but it will take awhile before it puts the victim to sleep + +/obj/item/projectile/bullet/dart/tranq/plus + +/obj/item/projectile/bullet/dart/tranq/plus/Initialize() + . = ..() + reagents.add_reagent(/datum/reagent/pax, 1) + +/obj/item/projectile/bullet/dart/tranq/plusplus + +/obj/item/projectile/bullet/dart/tranq/plusplus/Initialize() + . = ..() + reagents.add_reagent(/datum/reagent/pax, 3) diff --git a/code/modules/projectiles/projectile/bullets/lmg.dm b/code/modules/projectiles/projectile/bullets/lmg.dm index d8b97431ad274..2dcc4081f8b5f 100644 --- a/code/modules/projectiles/projectile/bullets/lmg.dm +++ b/code/modules/projectiles/projectile/bullets/lmg.dm @@ -42,3 +42,11 @@ name = "7.12x82mm incendiary bullet" damage = 20 fire_stacks = 3 + +/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 diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index 14755c9f8554c..a7106e67889e1 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -15,25 +15,59 @@ /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/trac name = ".38 TRAC bullet" damage = 10 + ricochets_max = 0 /obj/item/projectile/bullet/c38/trac/on_hit(atom/target, blocked = FALSE) . = ..() - var/mob/living/carbon/M = target - var/obj/item/implant/tracking/c38/imp - for(var/obj/item/implant/tracking/c38/TI in M.implants) //checks if the target already contains a tracking implant - imp = TI + var/mob/living/M = target + if(!istype(M)) return - if(!imp) - imp = new /obj/item/implant/tracking/c38(M) - imp.implant(M) + if(locate(/obj/item/implant/tracking/c38) in M.implants) //checks if the target already contains a tracking implant + return + + var/obj/item/implant/tracking/c38/imp = new (M) + imp.implant(M) /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) . = ..() @@ -46,6 +80,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) . = ..() @@ -58,6 +93,7 @@ icon_state = null damage = 0 nodamage = TRUE + martial_arts_no_deflect = TRUE /obj/item/projectile/bullet/c38/mime/on_hit(atom/target, blocked = FALSE) if(isliving(target)) @@ -67,11 +103,31 @@ M.apply_damage(5, BRUTE, CHEST, defense) M.visible_message("A bullet wound appears in [M]'s chest!", \ "You get hit with a .38 bullet from a finger gun! Those hurt!...") - else + else to_chat(M, "You get shot with the finger gun!") +/obj/item/projectile/bullet/c38/mime_lethal + name = "invisible .38 bullet" + icon_state = null + damage = 20 + +/obj/item/projectile/bullet/c38/mime_lethal/on_hit(atom/target, blocked) + . = ..() + if(iscarbon(target)) + var/mob/living/carbon/M = target + M.silent = max(M.silent, 10) // .357 (Syndie Revolver) /obj/item/projectile/bullet/a357 name = ".357 bullet" damage = 60 + +// 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 diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index e399460b79da8..349e7914fbe26 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -1,6 +1,7 @@ /obj/item/projectile/bullet/shotgun_slug name = "12g shotgun slug" damage = 60 + armour_penetration = -20 /obj/item/projectile/bullet/shotgun_beanbag name = "beanbag slug" @@ -16,9 +17,12 @@ damage = 0 /obj/item/projectile/bullet/sleepy/on_hit(atom/target, blocked = FALSE) - if((blocked != 100) && isliving(target)) + if((blocked != 100) && ishuman(target)) var/mob/living/L = target - L.Sleeping(50) + if(L.confused) + L.Sleeping(50) + else + L.confused = 80 return ..() /obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath @@ -40,7 +44,7 @@ icon = 'icons/obj/meteor.dmi' icon_state = "dust" damage = 20 - paralyze = 80 + paralyze = 20 hitsound = 'sound/effects/meteorimpact.ogg' /obj/item/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE) @@ -57,7 +61,7 @@ /obj/item/projectile/bullet/shotgun_frag12 name ="frag12 slug" damage = 25 - paralyze = 50 + paralyze = 10 /obj/item/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE) ..() @@ -67,20 +71,24 @@ /obj/item/projectile/bullet/pellet var/tile_dropoff = 0.75 var/tile_dropoff_s = 0.5 + ricochets_max = 1 + ricochet_chance = 50 + ricochet_decay_chance = 0.9 /obj/item/projectile/bullet/pellet/shotgun_buckshot name = "buckshot pellet" - damage = 12.5 + damage = 9 + tile_dropoff = 0.5 /obj/item/projectile/bullet/pellet/shotgun_rubbershot name = "rubbershot pellet" damage = 3 - stamina = 11 + stamina = 9 /obj/item/projectile/bullet/pellet/shotgun_incapacitate name = "incapacitating pellet" damage = 1 - stamina = 6 + stamina = 5 /obj/item/projectile/bullet/pellet/Range() ..() @@ -106,7 +114,7 @@ // Mech Scattershot /obj/item/projectile/bullet/scattershot - damage = 24 + damage = 18 //Breaching Ammo diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm index 4ebc3667f5075..4b5feae4fb667 100644 --- a/code/modules/projectiles/projectile/bullets/smg.dm +++ b/code/modules/projectiles/projectile/bullets/smg.dm @@ -19,3 +19,10 @@ name = "4.6x30mm incendiary bullet" damage = 10 fire_stacks = 1 + +//Slightly worse disabler, but fully automatic +/obj/item/projectile/bullet/c46x30mm_rubber + name = "4.6x30mm rubber bullet" + damage_type = STAMINA + flag = "stamina" + damage = 20 diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm index 6149e9868af65..995975f126b07 100644 --- a/code/modules/projectiles/projectile/energy/net_snare.dm +++ b/code/modules/projectiles/projectile/energy/net_snare.dm @@ -3,6 +3,7 @@ icon_state = "e_netting" damage = 10 damage_type = STAMINA + flag = "stamina" hitsound = 'sound/weapons/taserhit.ogg' range = 10 @@ -32,7 +33,7 @@ /obj/effect/nettingportal/Initialize() . = ..() var/obj/item/beacon/teletarget = null - + for(var/obj/item/beacon/bea in GLOB.teleportbeacons) if(is_eligible(bea) && bea.nettingportal) //is it quick dragnet beacon? teletarget = bea @@ -41,16 +42,16 @@ /obj/effect/nettingportal/proc/is_eligible(atom/movable/AM) //this code has to be ported in so it is not abused - + var/turf/T = get_turf(AM) if(!T) return FALSE - + var/turf/S = get_turf(src) - if (S.z != T.z) //cannot teleport to another Zlevel + if (S.get_virtual_z_level() != T.get_virtual_z_level()) //cannot teleport to another Zlevel return FALSE var/area/A = get_area(T) - if(!A || A.noteleport) + if(!A || A.teleport_restriction) return FALSE return TRUE diff --git a/code/modules/projectiles/projectile/energy/nuclear_particle.dm b/code/modules/projectiles/projectile/energy/nuclear_particle.dm index d7674f3a6ee72..a0bb035c654db 100644 --- a/code/modules/projectiles/projectile/energy/nuclear_particle.dm +++ b/code/modules/projectiles/projectile/energy/nuclear_particle.dm @@ -3,9 +3,6 @@ name = "nuclear particle" icon_state = "nuclear_particle" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - damage = 10 - damage_type = TOX - irradiate = 2500 //enough to knockdown and induce vomiting speed = 0.4 hitsound = 'sound/weapons/emitter2.ogg' impact_type = /obj/effect/projectile/impact/xray @@ -18,13 +15,44 @@ "purple" = "#FF00FF" ) -/obj/item/projectile/energy/nuclear_particle/Initialize() - . = ..() +/obj/item/projectile/energy/nuclear_particle/proc/random_color_time() //Random color time! var/our_color = pick(particle_colors) add_atom_colour(particle_colors[our_color], FIXED_COLOUR_PRIORITY) set_light(4, 3, particle_colors[our_color]) //Range of 4, brightness of 3 - Same range as a flashlight -/atom/proc/fire_nuclear_particle(angle = rand(0,360)) //used by fusion to fire random nuclear particles. Fires one particle in a random direction. +/obj/item/projectile/energy/nuclear_particle/proc/customize(custompower) + irradiate = max(3000 * 3 ** (log(10,custompower)-FUSION_RAD_MIDPOINT),10) + var/custom_color = HSVtoRGB(hsv(clamp(log(10,custompower)-12,0,5)*256,rand(191,255),rand(191,255),255)) + add_atom_colour(custom_color, FIXED_COLOUR_PRIORITY) + set_light(4, 3, custom_color) + switch (irradiate) + if(10 to 100) + name = "pathetically weak nuclear particle" + damage = 1 + if(100 to 200) + name = "very weak nuclear particle" + damage = 2 + if(200 to 500) + name = "fairly weak nuclear particle" + damage = 4 + if(500 to 1500) + name = "slightly weak nuclear particle" + damage = 7 + if(4000 to 8000) + name = "powerful nuclear particle" + damage = 15 + if(8000 to 30000) + name = "extremely strong nuclear particle" + damage = 20 + if(30000 to INFINITY) + name = "impossibly strong nuclear particle" + damage = 30 + +/atom/proc/fire_nuclear_particle(angle = rand(0,360), customize = FALSE, custompower = 1e12) //used by fusion to fire random nuclear particles. Fires one particle in a random direction. var/obj/item/projectile/energy/nuclear_particle/P = new /obj/item/projectile/energy/nuclear_particle(src) + if(customize) + P.customize(custompower) + else + P.random_color_time() P.fire(angle) \ No newline at end of file diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index f9f6242b9c47c..8f370cb168974 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -4,6 +4,7 @@ color = "#FFFF00" damage = 40 damage_type = STAMINA + flag = "stamina" nodamage = FALSE knockdown = 30 stutter = 5 diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 677782d22f2d6..81a3764619c6a 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -6,10 +6,12 @@ nodamage = TRUE armour_penetration = 100 flag = "magic" + martial_arts_no_deflect = TRUE /obj/item/projectile/magic/death name = "bolt of death" icon_state = "pulse1_bl" + martial_arts_no_deflect = FALSE /obj/item/projectile/magic/death/on_hit(target) . = ..() @@ -26,6 +28,7 @@ damage = 0 damage_type = OXY nodamage = TRUE + martial_arts_no_deflect = FALSE /obj/item/projectile/magic/resurrection/on_hit(mob/living/carbon/target) . = ..() @@ -51,6 +54,7 @@ damage = 0 damage_type = OXY nodamage = TRUE + martial_arts_no_deflect = FALSE var/inner_tele_radius = 0 var/outer_tele_radius = 6 @@ -79,6 +83,7 @@ damage = 0 damage_type = OXY nodamage = TRUE + martial_arts_no_deflect = FALSE /obj/item/projectile/magic/safety/on_hit(atom/target) . = ..() @@ -134,6 +139,7 @@ damage = 0 damage_type = BURN nodamage = TRUE + martial_arts_no_deflect = FALSE /obj/item/projectile/magic/change/on_hit(atom/change) . = ..() @@ -340,6 +346,7 @@ flag = "magic" dismemberment = 50 nodamage = FALSE + martial_arts_no_deflect = FALSE /obj/item/projectile/magic/spellblade/on_hit(target) if(ismob(target)) @@ -359,6 +366,7 @@ armour_penetration = 0 flag = "magic" hitsound = 'sound/weapons/barragespellhit.ogg' + martial_arts_no_deflect = FALSE /obj/item/projectile/magic/arcane_barrage/on_hit(target) if(ismob(target)) @@ -375,14 +383,11 @@ icon_state = "locker" nodamage = TRUE flag = "magic" + martial_arts_no_deflect = FALSE var/weld = TRUE var/created = FALSE //prevents creation of more then one locker if it has multiple hits var/locker_suck = TRUE - var/obj/structure/closet/locker_temp_instance = /obj/structure/closet/decay -/obj/item/projectile/magic/locker/Initialize() - . = ..() - locker_temp_instance = new(src) /obj/item/projectile/magic/locker/prehit(atom/A) if(isliving(A) && locker_suck) @@ -391,7 +396,7 @@ M.visible_message("[src] vanishes on contact with [A]!") qdel(src) return - if(!locker_temp_instance.insertion_allowed(M)) + if(M.incorporeal_move || M.mob_size > MOB_SIZE_HUMAN || LAZYLEN(contents)>=5) return ..() M.forceMove(src) return FALSE @@ -400,11 +405,11 @@ /obj/item/projectile/magic/locker/on_hit(target) if(created) return ..() - var/obj/structure/closet/C = new locker_temp_instance(get_turf(src)) + var/obj/structure/closet/decay/C = new(get_turf(src)) if(LAZYLEN(contents)) for(var/atom/movable/AM in contents) - C.insert(AM) - C.welded = weld + AM.forceMove(C) + C.welded = TRUE C.update_icon() created = TRUE return ..() @@ -418,21 +423,21 @@ /obj/structure/closet/decay breakout_time = 600 icon_welded = null + material_drop_amount = 0 var/magic_icon = "cursed" var/weakened_icon = "decursed" - var/auto_destroy = TRUE /obj/structure/closet/decay/Initialize() . = ..() - if(auto_destroy) - addtimer(CALLBACK(src, .proc/bust_open), 5 MINUTES) - addtimer(CALLBACK(src, .proc/magicly_lock), 5) + addtimer(CALLBACK(src, .proc/locker_magic_timer), 5) -/obj/structure/closet/decay/proc/magicly_lock() - if(!welded) - return - icon_state = magic_icon - update_icon() +/obj/structure/closet/decay/proc/locker_magic_timer() + if(welded) + addtimer(CALLBACK(src, .proc/bust_open), 5 MINUTES) + icon_state = magic_icon + update_icon() + else + addtimer(CALLBACK(src, .proc/decay), 15 SECONDS) /obj/structure/closet/decay/after_weld(weld_state) if(weld_state) @@ -454,11 +459,11 @@ icon_state = weakened_icon update_icon() addtimer(CALLBACK(src, .proc/decay), 15 SECONDS) - icon_welded = "welded" /obj/item/projectile/magic/flying name = "bolt of flying" icon_state = "flight" + martial_arts_no_deflect = FALSE /obj/item/projectile/magic/flying/on_hit(target) . = ..() @@ -473,6 +478,7 @@ /obj/item/projectile/magic/bounty name = "bolt of bounty" icon_state = "bounty" + martial_arts_no_deflect = FALSE /obj/item/projectile/magic/bounty/on_hit(target) . = ..() @@ -486,6 +492,7 @@ /obj/item/projectile/magic/antimagic name = "bolt of antimagic" icon_state = "antimagic" + martial_arts_no_deflect = FALSE /obj/item/projectile/magic/antimagic/on_hit(target) . = ..() @@ -499,6 +506,7 @@ /obj/item/projectile/magic/fetch name = "bolt of fetching" icon_state = "fetch" + martial_arts_no_deflect = FALSE /obj/item/projectile/magic/fetch/on_hit(target) . = ..() @@ -513,6 +521,7 @@ /obj/item/projectile/magic/sapping name = "bolt of sapping" icon_state = "sapping" + martial_arts_no_deflect = FALSE /obj/item/projectile/magic/sapping/on_hit(target) . = ..() @@ -526,6 +535,7 @@ /obj/item/projectile/magic/necropotence name = "bolt of necropotence" icon_state = "necropotence" + martial_arts_no_deflect = FALSE /obj/item/projectile/magic/necropotence/on_hit(target) . = ..() @@ -548,12 +558,13 @@ /obj/item/projectile/magic/wipe name = "bolt of possession" icon_state = "wipe" + martial_arts_no_deflect = FALSE /obj/item/projectile/magic/wipe/on_hit(target) . = ..() if(iscarbon(target)) var/mob/living/carbon/M = target - if(M.anti_magic_check() || istype(M.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(M.anti_magic_check() || istype(M.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) M.visible_message("[src] vanishes on contact with [target]!") return BULLET_ACT_BLOCK for(var/x in M.get_traumas())//checks to see if the victim is already going through possession @@ -597,6 +608,7 @@ desc = "What the fuck does this do?!" damage = 0 var/proxdet = TRUE + martial_arts_no_deflect = FALSE /obj/item/projectile/magic/aoe/Range() if(proxdet) @@ -621,6 +633,11 @@ var/chain var/mob/living/caster +/obj/item/projectile/magic/aoe/lightning/New(loc, spell_level) + . = ..() + tesla_power += 5000 * spell_level + tesla_range += 2 * spell_level + /obj/item/projectile/magic/aoe/lightning/fire(setAngle) if(caster) chain = caster.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY) @@ -654,6 +671,13 @@ var/exp_flash = 3 var/exp_fire = 2 +/obj/item/projectile/magic/aoe/fireball/New(loc, spell_level) + . = ..() + exp_fire += spell_level + exp_flash += spell_level + exp_light += spell_level + exp_heavy = max(spell_level - 2, 0) + /obj/item/projectile/magic/aoe/fireball/on_hit(target) . = ..() if(ismob(target)) diff --git a/code/modules/projectiles/projectile/magic/spellcard.dm b/code/modules/projectiles/projectile/magic/spellcard.dm index 8b17d622bea1b..a3292d720026f 100644 --- a/code/modules/projectiles/projectile/magic/spellcard.dm +++ b/code/modules/projectiles/projectile/magic/spellcard.dm @@ -4,3 +4,7 @@ icon_state = "spellcard" damage_type = BRUTE damage = 2 + +/obj/item/projectile/spellcard/New(loc, spell_level) + . = ..() + damage += spell_level diff --git a/code/modules/projectiles/projectile/reusable/foam_dart.dm b/code/modules/projectiles/projectile/reusable/foam_dart.dm index 7a17d225cf412..3ee843ac73944 100644 --- a/code/modules/projectiles/projectile/reusable/foam_dart.dm +++ b/code/modules/projectiles/projectile/reusable/foam_dart.dm @@ -8,6 +8,7 @@ icon_state = "foamdart_proj" ammo_type = /obj/item/ammo_casing/caseless/foam_dart range = 10 + martial_arts_no_deflect = TRUE var/modified = FALSE var/obj/item/pen/pen = null @@ -20,8 +21,9 @@ newcasing.modified = modified var/obj/item/projectile/bullet/reusable/foam_dart/newdart = newcasing.BB newdart.modified = modified - newdart.damage = damage - newdart.nodamage = nodamage + if(modified) + newdart.damage = 5 + newdart.nodamage = FALSE newdart.damage_type = damage_type if(pen) newdart.pen = pen @@ -40,3 +42,4 @@ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot nodamage = FALSE stamina = 25 + martial_arts_no_deflect = FALSE diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm index 2598c439706b7..0e0eaa1f21a49 100644 --- a/code/modules/projectiles/projectile/special/curse.dm +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -36,7 +36,7 @@ /obj/item/projectile/curse_hand/Destroy() if(arm) arm.End() - arm = null + QDEL_NULL(arm) if(CHECK_BITFIELD(movement_type, UNSTOPPABLE)) playsound(src, 'sound/effects/curse3.ogg', 25, 1, -1) var/turf/T = get_step(src, dir) diff --git a/code/modules/projectiles/projectile/special/floral.dm b/code/modules/projectiles/projectile/special/floral.dm index 4ecce442ba7eb..dc3d05fb2e54c 100644 --- a/code/modules/projectiles/projectile/special/floral.dm +++ b/code/modules/projectiles/projectile/special/floral.dm @@ -5,6 +5,7 @@ damage_type = TOX nodamage = TRUE flag = "energy" + martial_arts_no_deflect = TRUE /obj/item/projectile/energy/florayield name = "beta somatoray" @@ -13,3 +14,4 @@ damage_type = TOX nodamage = TRUE flag = "energy" + martial_arts_no_deflect = TRUE diff --git a/code/modules/projectiles/projectile/special/gravity.dm b/code/modules/projectiles/projectile/special/gravity.dm index eb929e933a61f..1f315a6b94e00 100644 --- a/code/modules/projectiles/projectile/special/gravity.dm +++ b/code/modules/projectiles/projectile/special/gravity.dm @@ -20,7 +20,7 @@ /obj/item/projectile/gravityrepulse/on_hit() . = ..() T = get_turf(src) - for(var/atom/movable/A in range(T, power)) + for(var/atom/movable/A in range(power, T)) if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A]) continue if(ismob(A)) //because (ismob(A) && A:mob_negates_gravity()) is a recipe for bugs. @@ -30,7 +30,7 @@ var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(A, src))) A.safe_throw_at(throwtarget,power+1,1, force = MOVE_FORCE_EXTREMELY_STRONG) thrown_items[A] = A - for(var/turf/F in range(T,power)) + for(var/turf/F as() in RANGE_TURFS(power, T)) new /obj/effect/temp_visual/gravpush(F) /obj/item/projectile/gravityattract @@ -55,7 +55,7 @@ /obj/item/projectile/gravityattract/on_hit() . = ..() T = get_turf(src) - for(var/atom/movable/A in range(T, power)) + for(var/atom/movable/A in range(power, T)) if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A]) continue if(ismob(A)) @@ -64,7 +64,7 @@ continue A.safe_throw_at(T, power+1, 1, force = MOVE_FORCE_EXTREMELY_STRONG) thrown_items[A] = A - for(var/turf/F in range(T,power)) + for(var/turf/F as() in RANGE_TURFS(power, T)) new /obj/effect/temp_visual/gravpush(F) /obj/item/projectile/gravitychaos @@ -89,8 +89,8 @@ /obj/item/projectile/gravitychaos/on_hit() . = ..() T = get_turf(src) - for(var/atom/movable/A in range(T, power)) - if(A == src|| (firer && A == src.firer) || A.anchored || thrown_items[A]) + for(var/atom/movable/A as mob|obj in range(power, T)) + if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A]) continue if(ismob(A)) var/mob/M = A @@ -98,5 +98,5 @@ continue A.safe_throw_at(get_edge_target_turf(A, pick(GLOB.cardinals)), power+1, 1, force = MOVE_FORCE_EXTREMELY_STRONG) thrown_items[A] = A - for(var/turf/Z in range(T,power)) + for(var/turf/Z as() in RANGE_TURFS(power, T)) new /obj/effect/temp_visual/gravpush(Z) diff --git a/code/modules/projectiles/projectile/special/hallucination.dm b/code/modules/projectiles/projectile/special/hallucination.dm index a4751cf247174..0f3921c439bf3 100644 --- a/code/modules/projectiles/projectile/special/hallucination.dm +++ b/code/modules/projectiles/projectile/special/hallucination.dm @@ -176,6 +176,7 @@ /obj/item/projectile/hallucination/disabler name = "disabler beam" damage_type = STAMINA + flag = "stamina" hal_icon_state = "omnilaser" hal_fire_sound = 'sound/weapons/taser2.ogg' hal_hitsound = 'sound/weapons/tap.ogg' diff --git a/code/modules/projectiles/projectile/special/meteor.dm b/code/modules/projectiles/projectile/special/meteor.dm index 146dea4077d1f..ff669970b313c 100644 --- a/code/modules/projectiles/projectile/special/meteor.dm +++ b/code/modules/projectiles/projectile/special/meteor.dm @@ -11,7 +11,10 @@ if(A == firer) forceMove(A.loc) return - A.ex_act(EXPLODE_HEAVY) + if(isobj(A)) + SSexplosions.med_mov_atom += A + else if(isturf(A)) + SSexplosions.medturf += A playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) for(var/mob/M in urange(10, src)) if(!M.stat) diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm index 1a4a783816076..f48085115de2d 100644 --- a/code/modules/projectiles/projectile/special/neurotoxin.dm +++ b/code/modules/projectiles/projectile/special/neurotoxin.dm @@ -11,5 +11,5 @@ if(iscarbon(target)) var/mob/living/carbon/human/H = target if(H.can_inject()) - H.Stun(100) + H.adjustStaminaLoss(40) return ..() diff --git a/code/modules/projectiles/projectile/special/vortex.dm b/code/modules/projectiles/projectile/special/vortex.dm new file mode 100644 index 0000000000000..267ed935d9c83 --- /dev/null +++ b/code/modules/projectiles/projectile/special/vortex.dm @@ -0,0 +1,14 @@ +/obj/item/projectile/energy/vortex + name = "vortex beam" + alpha = 0 + damage = 0 + damage_type = BURN + reflectable = REFLECT_NORMAL + nodamage = FALSE + flag = "energy" + range = 10 + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMOB + +/obj/item/projectile/energy/vortex/Range() + new /obj/effect/temp_visual/hierophant/blast/vortex(get_turf(src), firer, FALSE) + return ..() diff --git a/code/modules/projectiles/projectile/special/wormhole.dm b/code/modules/projectiles/projectile/special/wormhole.dm index 0832f0cc76eb0..075db9472c953 100644 --- a/code/modules/projectiles/projectile/special/wormhole.dm +++ b/code/modules/projectiles/projectile/special/wormhole.dm @@ -5,12 +5,14 @@ damage = 0 nodamage = TRUE pass_flags = PASSGLASS | PASSTABLE | PASSGRILLE | PASSMOB - var/obj/item/gun/energy/wormhole_projector/gun + //Weakref to the thing that shot us + var/datum/weakref/gun color = "#33CCFF" tracer_type = /obj/effect/projectile/tracer/wormhole impact_type = /obj/effect/projectile/impact/wormhole muzzle_type = /obj/effect/projectile/muzzle/wormhole hitscan = TRUE + martial_arts_no_deflect = TRUE /obj/item/projectile/beam/wormhole/orange name = "orange bluespace beam" @@ -23,7 +25,8 @@ /obj/item/projectile/beam/wormhole/on_hit(atom/target) - if(!gun) + var/obj/item/gun/energy/wormhole_projector/projector = gun.resolve() + if(!projector) qdel(src) - return - gun.create_portal(src, get_turf(src)) + return + projector.create_portal(src, get_turf(src)) diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm index b16392ecd161a..8a4274d99e99a 100644 --- a/code/modules/reagents/chem_splash.dm +++ b/code/modules/reagents/chem_splash.dm @@ -35,17 +35,14 @@ steam.start() var/list/viewable = view(affected_range, epicenter) - var/list/accessible = list(epicenter) for(var/i=1; i<=affected_range; i++) - var/list/turflist = list() - for(var/turf/T in (orange(i, epicenter) - orange(i-1, epicenter))) - turflist |= T - for(var/turf/T in turflist) + var/list/turflist = RANGE_TURFS(i, epicenter) - RANGE_TURFS(i-1, epicenter) + for(var/turf/T as() in turflist) if(!(get_dir(T,epicenter) in GLOB.cardinals) && (abs(T.x - epicenter.x) == abs(T.y - epicenter.y) )) turflist.Remove(T) turflist.Add(T) // we move the purely diagonal turfs to the end of the list. - for(var/turf/T in turflist) + for(var/turf/T as() in turflist) if(accessible[T]) continue for(var/thing in T.GetAtmosAdjacentTurfs(alldir = TRUE)) @@ -58,7 +55,7 @@ break var/list/reactable = accessible for(var/turf/T in accessible) - for(var/atom/A in T.GetAllContents()) + for(var/atom/A as() in T.GetAllContents()) if(!(A in viewable)) continue reactable |= A @@ -66,8 +63,7 @@ T.hotspot_expose(extra_heat*2, 5) if(!reactable.len) //Nothing to react with. Probably means we're in nullspace. return - for(var/thing in reactable) - var/atom/A = thing + for(var/atom/A as() in reactable) var/distance = max(1,get_dist(A, epicenter)) var/fraction = 0.5/(2 ** distance) //50/25/12/6... for a 200u splash, 25/12/6/3... for a 100u, 12/6/3/1 for a 50u splash_holder.reaction(A, TOUCH, fraction) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 6ebade9615655..973859a70b98a 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -260,7 +260,7 @@ var/copy_amount = T.volume * part if(preserve_data) trans_data = T.data - R.add_reagent(T.type, copy_amount * multiplier, trans_data) + R.add_reagent(T.type, copy_amount * multiplier, trans_data, chem_temp) src.update_total() R.update_total() @@ -311,38 +311,9 @@ if(!C) C = R.holder.my_atom - if(ishuman(C)) - var/mob/living/carbon/human/H = C - //Check if this mob's species is set and can process this type of reagent - var/can_process = FALSE - //If we somehow avoided getting a species or reagent_tag set, we'll assume we aren't meant to process ANY reagents (CODERS: SET YOUR SPECIES AND TAG!) - if(H.dna && H.dna.species.reagent_tag) - if((R.process_flags & SYNTHETIC) && (H.dna.species.reagent_tag & PROCESS_SYNTHETIC)) //SYNTHETIC-oriented reagents require PROCESS_SYNTHETIC - can_process = TRUE - if((R.process_flags & ORGANIC) && (H.dna.species.reagent_tag & PROCESS_ORGANIC)) //ORGANIC-oriented reagents require PROCESS_ORGANIC - can_process = TRUE - - //If handle_reagents returns 0, it's doing the reagent removal on its own - var/species_handled = !(H.dna.species.handle_reagents(H, R)) - can_process = can_process && !species_handled - //If the mob can't process it, remove the reagent at it's normal rate without doing any addictions, overdoses, or on_mob_life() for the reagent - if(!can_process) - if(!species_handled) - R.holder.remove_reagent(R.type, R.metabolization_rate) - continue - //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption) - else - if(R.process_flags == SYNTHETIC) - R.holder.remove_reagent(R.type, R.metabolization_rate) - continue - //If you got this far, that means we can process whatever reagent this iteration is for. Handle things normally from here. - - if(!R.metabolizing) - R.metabolizing = TRUE - R.on_mob_metabolize(C) if(C && R) - if(C.reagent_check(R) != TRUE) + if(C.reagent_check(R) != TRUE) //Most relevant to Humans, this handles species-specific chem interactions. if(liverless && !R.self_consuming) //need to be metabolized continue if(!R.metabolizing) @@ -513,7 +484,7 @@ remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1) for(var/P in selected_reaction.results) - multiplier = max(multiplier, 1) //this shouldnt happen ... + multiplier = max(multiplier, 1) //this shouldn't happen ... SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P) add_reagent(P, cached_results[P]*multiplier, null, chem_temp) @@ -524,14 +495,14 @@ if(selected_reaction.mix_sound) playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) - for(var/mob/M in seen) + for(var/mob/M as() in seen) to_chat(M, "[iconhtml] [selected_reaction.mix_message]") if(istype(cached_my_atom, /obj/item/slime_extract)) var/obj/item/slime_extract/ME2 = my_atom ME2.Uses-- if(ME2.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in seen) + for(var/mob/M as() in seen) to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") ME2.name = "used slime extract" ME2.desc = "This extract has been used up." diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 253be74411ff2..d9f184852272e 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -24,7 +24,6 @@ circuit = /obj/item/circuitboard/machine/chem_dispenser - var/obj/item/stock_parts/cell/cell var/powerefficiency = 0.1 var/amount = 30 @@ -103,12 +102,12 @@ if(panel_open) . += "[src]'s maintenance hatch is open!" if(in_range(user, src) || isobserver(user)) - . += "The status display reads:\n\ - Recharging [recharge_amount] power units per interval.\n\ - Power efficiency increased by [round((powerefficiency*1000)-100, 1)]%." + . += "The status display reads:\n"+\ + "Recharging [recharge_amount] power units per interval.\n"+\ + "Power efficiency increased by [round((powerefficiency*1000)-100, 1)]%." -/obj/machinery/chem_dispenser/process() - if (recharge_counter >= 4) +/obj/machinery/chem_dispenser/process(delta_time) + if (recharge_counter >= 8) if(!is_operational()) return var/usedpower = cell.give(recharge_amount) @@ -116,7 +115,7 @@ use_power(250*recharge_amount) recharge_counter = 0 return - recharge_counter++ + recharge_counter += delta_time /obj/machinery/chem_dispenser/proc/display_beaker() var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker") @@ -158,7 +157,13 @@ /obj/machinery/chem_dispenser/contents_explosion(severity, target) ..() if(beaker) - beaker.ex_act(severity, target) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += beaker + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += beaker + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += beaker /obj/machinery/chem_dispenser/handle_atom_del(atom/A) ..() @@ -176,6 +181,9 @@ ui = new(user, src, "ChemDispenser") if(user.hallucinating()) ui.set_autoupdate(FALSE) //to not ruin the immersion by constantly changing the fake chemicals + //Seems like a pretty bad way to do it, but I think a better one would deserve a wider refactor including at least sleeper + else + ui.set_autoupdate(TRUE) // Cell charge ui.open() /obj/machinery/chem_dispenser/ui_data(mob/user) @@ -220,11 +228,21 @@ return data /obj/machinery/chem_dispenser/ui_act(action, params) - if(..()) + . = ..() + if(.) // Propagation only used by debug machine, but eh + return + + switch(action) + if("eject") + replace_beaker(usr) + . = TRUE + + if(!is_operational()) return + switch(action) if("amount") - if(!is_operational() || QDELETED(beaker)) + if(QDELETED(beaker)) return var/target = text2num(params["target"]) if(target in beaker.possible_transfer_amounts) @@ -232,7 +250,7 @@ work_animation() . = TRUE if("dispense") - if(!is_operational() || QDELETED(cell)) + if(QDELETED(cell)) return var/reagent_name = params["reagent"] if(!recording_recipe) @@ -251,18 +269,15 @@ recording_recipe[reagent_name] += amount . = TRUE if("remove") - if(!is_operational() || recording_recipe) + if(recording_recipe) return var/amount = text2num(params["amount"]) if(beaker && (amount in beaker.possible_transfer_amounts)) beaker.reagents.remove_all(amount) work_animation() . = TRUE - if("eject") - replace_beaker(usr) - . = TRUE if("dispense_recipe") - if(!is_operational() || QDELETED(cell)) + if(QDELETED(cell)) return var/list/chemicals_to_dispense = saved_recipes[params["recipe"]] if(!LAZYLEN(chemicals_to_dispense)) @@ -288,20 +303,14 @@ recording_recipe[key] += dispense_amount . = TRUE if("clear_recipes") - if(!is_operational()) - return var/yesno = alert("Clear all recipes?",, "Yes","No") if(yesno == "Yes") saved_recipes = list() . = TRUE if("record_recipe") - if(!is_operational()) - return recording_recipe = list() . = TRUE if("save_recording") - if(!is_operational()) - return var/name = stripped_input(usr,"Name","What do you want to name this recipe?", "Recipe", MAX_NAME_LEN) if(!usr.canUseTopic(src, !issilicon(usr))) return @@ -319,8 +328,6 @@ recording_recipe = null . = TRUE if("cancel_recording") - if(!is_operational()) - return recording_recipe = null . = TRUE @@ -404,7 +411,7 @@ return ..() /obj/machinery/chem_dispenser/AltClick(mob/living/user) - ..() + . = ..() if(istype(user) && user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) replace_beaker(user) @@ -484,19 +491,11 @@ desc = "Contains a large reservoir of soft drinks. This model has had its safeties shorted out." obj_flags = CAN_BE_HIT | EMAGGED flags_1 = NODECONSTRUCT_1 + circuit = /obj/item/circuitboard/machine/chem_dispenser/drinks/fullupgrade /obj/machinery/chem_dispenser/drinks/fullupgrade/Initialize() . = ..() dispensable_reagents |= emagged_reagents //adds emagged reagents - component_parts = list() - component_parts += new /obj/item/circuitboard/machine/chem_dispenser/drinks(null) - component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) - component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) - component_parts += new /obj/item/stock_parts/capacitor/quadratic(null) - 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() /obj/machinery/chem_dispenser/drinks/beer name = "booze dispenser" @@ -537,19 +536,11 @@ desc = "Contains a large reservoir of the good stuff. This model has had its safeties shorted out." obj_flags = CAN_BE_HIT | EMAGGED flags_1 = NODECONSTRUCT_1 + circuit = /obj/item/circuitboard/machine/chem_dispenser/drinks/beer/fullupgrade /obj/machinery/chem_dispenser/drinks/beer/fullupgrade/Initialize() . = ..() dispensable_reagents |= emagged_reagents //adds emagged reagents - component_parts = list() - component_parts += new /obj/item/circuitboard/machine/chem_dispenser/drinks/beer(null) - component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) - component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) - component_parts += new /obj/item/stock_parts/capacitor/quadratic(null) - 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() /obj/machinery/chem_dispenser/mutagen name = "mutagen dispenser" @@ -564,6 +555,8 @@ desc = "Creates and dispenses chemicals useful for botany." flags_1 = NODECONSTRUCT_1 + circuit = /obj/item/circuitboard/machine/chem_dispenser/mutagensaltpeter + dispensable_reagents = list( /datum/reagent/toxin/mutagen, /datum/reagent/saltpetre, @@ -580,18 +573,6 @@ /datum/reagent/diethylamine) upgrade_reagents = null -/obj/machinery/chem_dispenser/mutagensaltpeter/Initialize() - . = ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/machine/chem_dispenser(null) - component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) - component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) - component_parts += new /obj/item/stock_parts/capacitor/quadratic(null) - 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() - /obj/machinery/chem_dispenser/mutagensaltpetersmall name = "minor botanical chemical dispenser" desc = "A botanical chemical dispenser on a budget." @@ -615,25 +596,15 @@ b_o.pixel_x = -4 return b_o - - /obj/machinery/chem_dispenser/fullupgrade //fully ugpraded stock parts, emagged desc = "Creates and dispenses chemicals. This model has had its safeties shorted out." obj_flags = CAN_BE_HIT | EMAGGED flags_1 = NODECONSTRUCT_1 + circuit = /obj/item/circuitboard/machine/chem_dispenser/fullupgrade /obj/machinery/chem_dispenser/fullupgrade/Initialize() . = ..() dispensable_reagents |= emagged_reagents //adds emagged reagents - component_parts = list() - component_parts += new /obj/item/circuitboard/machine/chem_dispenser(null) - component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) - component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) - component_parts += new /obj/item/stock_parts/capacitor/quadratic(null) - 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() /obj/machinery/chem_dispenser/abductor name = "reagent synthesizer" @@ -688,15 +659,3 @@ /datum/reagent/medicine/silibinin, /datum/reagent/medicine/polypyr ) - -/obj/machinery/chem_dispenser/abductor/Initialize() - . = ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/machine/chem_dispenser(null) - component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) - component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) - component_parts += new /obj/item/stock_parts/capacitor/quadratic(null) - 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() diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index ddb5f6cd52a14..9b1b055d5cfa6 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -12,7 +12,7 @@ var/obj/item/reagent_containers/beaker = null var/target_temperature = 300 - var/heater_coefficient = 0.1 + var/heater_coefficient = 0.05 var/on = FALSE /obj/machinery/chem_heater/Destroy() @@ -35,6 +35,7 @@ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return replace_beaker(user) + ui_update() return /obj/machinery/chem_heater/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) @@ -46,6 +47,7 @@ beaker = new_beaker else beaker = null + on = FALSE update_icon() return TRUE @@ -57,16 +59,16 @@ /obj/machinery/chem_heater/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Heating reagents at [heater_coefficient*1000]% speed." + . += "The status display reads: Heating reagents at [heater_coefficient*1000]% speed." -/obj/machinery/chem_heater/process() +/obj/machinery/chem_heater/process(delta_time) ..() if(stat & NOPOWER) return if(on) if(beaker && beaker.reagents.total_volume) //keep constant with the chemical acclimator please - beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * heater_coefficient * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) + beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * heater_coefficient * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) beaker.reagents.handle_reactions() /obj/machinery/chem_heater/attackby(obj/item/I, mob/user, params) @@ -83,7 +85,7 @@ return replace_beaker(user, B) to_chat(user, "You add [B] to [src].") - updateUsrDialog() + ui_update() update_icon() return return ..() @@ -93,6 +95,11 @@ return ..() +/obj/machinery/chem_heater/ui_requires_update(mob/user, datum/tgui/ui) + . = ..() + if(on && beaker) + . = TRUE + /obj/machinery/chem_heater/ui_state(mob/user) return GLOB.default_state @@ -127,13 +134,10 @@ on = !on . = TRUE if("temperature") - var/target = params["target"] - if(text2num(target) != null) - target = text2num(target) - . = TRUE - if(.) + var/target = text2num(params["target"]) + if(target != null) target_temperature = clamp(target, 0, 1000) + . = TRUE if("eject") - on = FALSE replace_beaker(usr) . = TRUE diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 5d8aa479eb031..3a37ab3e5c561 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -53,9 +53,21 @@ /obj/machinery/chem_master/contents_explosion(severity, target) ..() if(beaker) - beaker.ex_act(severity, target) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += beaker + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += beaker + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += beaker if(bottle) - bottle.ex_act(severity, target) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += bottle + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += bottle + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += bottle /obj/machinery/chem_master/handle_atom_del(atom/A) ..() @@ -63,8 +75,10 @@ beaker = null reagents.clear_reagents() update_icon() + ui_update() else if(A == bottle) bottle = null + ui_update() /obj/machinery/chem_master/update_icon() cut_overlays() @@ -99,7 +113,7 @@ return replace_beaker(user, B) to_chat(user, "You add [B] to [src].") - updateUsrDialog() + ui_update() update_icon() else if(!condi && istype(I, /obj/item/storage/pill_bottle)) if(bottle) @@ -109,7 +123,7 @@ return bottle = I to_chat(user, "You add [I] into the dispenser slot.") - updateUsrDialog() + ui_update() else return ..() @@ -117,6 +131,7 @@ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return replace_beaker(user) + ui_update() return /obj/machinery/chem_master/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) @@ -190,185 +205,176 @@ if(..()) return - if(action == "eject") - replace_beaker(usr) - return TRUE - - if(action == "ejectPillBottle") - if(!bottle) - return FALSE - bottle.forceMove(drop_location()) - adjust_item_drop_location(bottle) - bottle = null - return TRUE - - if(action == "transfer") - if(!beaker) - return FALSE - var/reagent = GLOB.name2reagent[params["id"]] - var/amount = text2num(params["amount"]) - var/to_container = params["to"] - // Custom amount - if (amount == -1) - amount = text2num(input( - "Enter the amount you want to transfer:", - name, "")) - if (amount == null || amount <= 0) - return FALSE - if (to_container == "buffer") - beaker.reagents.trans_id_to(src, reagent, amount) - return TRUE - if (to_container == "beaker" && mode) - reagents.trans_id_to(beaker, reagent, amount) - return TRUE - if (to_container == "beaker" && !mode) - reagents.remove_reagent(reagent, amount) - return TRUE - return FALSE - - if(action == "toggleMode") - mode = !mode - return TRUE - - if(action == "pillStyle") - var/id = text2num(params["id"]) - chosenPillStyle = id - return TRUE - - if(action == "create") - if(reagents.total_volume == 0) - return FALSE - var/item_type = params["type"] - // Get amount of items - var/amount = text2num(params["amount"]) - if(amount == null) - amount = text2num(input(usr, - "Max 10. Buffer content will be split evenly.", - "How many to make?", 1)) - amount = clamp(round(amount), 0, 10) - if (amount <= 0) - return FALSE - // Get units per item - var/vol_each = text2num(params["volume"]) - var/vol_each_text = params["volume"] - var/vol_each_max = reagents.total_volume / amount - if (item_type == "pill") - vol_each_max = min(50, vol_each_max) - else if (item_type == "patch") - vol_each_max = min(40, vol_each_max) - else if (item_type == "bottle") - vol_each_max = min(30, vol_each_max) - else if (item_type == "condimentPack") - vol_each_max = min(10, vol_each_max) - else if (item_type == "condimentBottle") - vol_each_max = min(50, vol_each_max) - else - return FALSE - if(vol_each_text == "auto") - vol_each = vol_each_max - if(vol_each == null) - vol_each = text2num(input(usr, - "Maximum [vol_each_max] units per item.", - "How many units to fill?", - vol_each_max)) - vol_each = clamp(vol_each, 0, vol_each_max) - if(vol_each <= 0) - return FALSE - // Get item name - var/name = params["name"] - var/name_has_units = item_type == "pill" || item_type == "patch" - if(!name) - var/name_default = reagents.get_master_reagent_name() - if (name_has_units) - name_default += " ([vol_each]u)" - name = stripped_input(usr, - "Name:", - "Give it a name!", - name_default, - MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) - return FALSE - // Start filling - if(item_type == "pill") - var/obj/item/reagent_containers/pill/P - var/target_loc = drop_location() - var/drop_threshold = INFINITY - if(bottle) - var/datum/component/storage/STRB = bottle.GetComponent( - /datum/component/storage) - if(STRB) - drop_threshold = STRB.max_items - bottle.contents.len - for(var/i = 0; i < amount; i++) - if(i < drop_threshold) - P = new/obj/item/reagent_containers/pill(target_loc) - else - P = new/obj/item/reagent_containers/pill(drop_location()) - P.name = trim("[name] pill") - if(chosenPillStyle == RANDOM_PILL_STYLE) - P.icon_state ="pill[rand(1,21)]" - else - P.icon_state = "pill[chosenPillStyle]" - if(P.icon_state == "pill4") - P.desc = "A tablet or capsule, but not just any, a red one, one taken by the ones not scared of knowledge, freedom, uncertainty and the brutal truths of reality." - adjust_item_drop_location(P) - reagents.trans_to(P, vol_each, transfered_by = usr) - return TRUE - if(item_type == "patch") - var/obj/item/reagent_containers/pill/patch/P - for(var/i = 0; i < amount; i++) - P = new/obj/item/reagent_containers/pill/patch(drop_location()) - P.name = trim("[name] patch") - adjust_item_drop_location(P) - reagents.trans_to(P, vol_each, transfered_by = usr) - return TRUE - if(item_type == "bottle") - var/obj/item/reagent_containers/glass/bottle/P - for(var/i = 0; i < amount; i++) - P = new/obj/item/reagent_containers/glass/bottle(drop_location()) - P.name = trim("[name] bottle") - adjust_item_drop_location(P) - reagents.trans_to(P, vol_each, transfered_by = usr) - return TRUE - if(item_type == "condimentPack") - var/obj/item/reagent_containers/food/condiment/pack/P - for(var/i = 0; i < amount; i++) - P = new/obj/item/reagent_containers/food/condiment/pack(drop_location()) - P.originalname = name - P.name = trim("[name] pack") - P.desc = "A small condiment pack. The label says it contains [name]." - reagents.trans_to(P, vol_each, transfered_by = usr) - return TRUE - if(item_type == "condimentBottle") - var/obj/item/reagent_containers/food/condiment/P - for(var/i = 0; i < amount; i++) - P = new/obj/item/reagent_containers/food/condiment(drop_location()) - P.originalname = name - P.name = trim("[name] bottle") - reagents.trans_to(P, vol_each, transfered_by = usr) - return TRUE - return FALSE - - if(action == "analyze") - var/datum/reagent/R = GLOB.name2reagent[params["id"]] - if(R) - var/state = "Unknown" - if(initial(R.reagent_state) == 1) - state = "Solid" - else if(initial(R.reagent_state) == 2) - state = "Liquid" - else if(initial(R.reagent_state) == 3) - state = "Gas" - var/const/P = 3 //The number of seconds between life ticks - var/T = initial(R.metabolization_rate) * (60 / P) - analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold)) - screen = "analyze" - return TRUE - - if(action == "goScreen") - screen = params["screen"] - return TRUE - - return FALSE + switch(action) + if("eject") + replace_beaker(usr) + . = TRUE + if("ejectPillBottle") + if(!bottle) + return + bottle.forceMove(drop_location()) + adjust_item_drop_location(bottle) + bottle = null + . = TRUE + if("transfer") + if(!beaker) + return + var/reagent = GLOB.name2reagent[params["id"]] + var/amount = text2num(params["amount"]) + var/to_container = params["to"] + // Custom amount + if (amount == -1) + amount = text2num(input( + "Enter the amount you want to transfer:", + name, "")) + if (amount == null || amount <= 0) + return + if (to_container == "buffer") + beaker.reagents.trans_id_to(src, reagent, amount) + . = TRUE + else if (to_container == "beaker" && mode) + reagents.trans_id_to(beaker, reagent, amount) + . = TRUE + else if (to_container == "beaker" && !mode) + reagents.remove_reagent(reagent, amount) + . = TRUE + if("toggleMode") + mode = !mode + . = TRUE + if("pillStyle") + var/id = text2num(params["id"]) + chosenPillStyle = id + . = TRUE + if("create") + if(reagents.total_volume == 0) + return + var/item_type = params["type"] + // Get amount of items + var/amount = text2num(params["amount"]) + if(amount == null) + amount = text2num(input(usr, + "Max 10. Buffer content will be split evenly.", + "How many to make?", 1)) + amount = clamp(round(amount), 0, 10) + if (amount <= 0) + return + // Get units per item + var/vol_each = text2num(params["volume"]) + var/vol_each_text = params["volume"] + var/vol_each_max = reagents.total_volume / amount + if (item_type == "pill" && !condi) + vol_each_max = min(50, vol_each_max) + else if (item_type == "patch" && !condi) + vol_each_max = min(40, vol_each_max) + else if (item_type == "bottle" && !condi) + vol_each_max = min(30, vol_each_max) + else if (item_type == "condimentPack" && condi) + vol_each_max = min(10, vol_each_max) + else if (item_type == "condimentBottle" && condi) + vol_each_max = min(50, vol_each_max) + else + return + if(vol_each_text == "auto") + vol_each = vol_each_max + if(vol_each == null) + vol_each = text2num(input(usr, + "Maximum [vol_each_max] units per item.", + "How many units to fill?", + vol_each_max)) + vol_each = clamp(vol_each, 0, vol_each_max) + if(vol_each <= 0) + return + // Get item name + var/name = params["name"] + var/name_has_units = item_type == "pill" || item_type == "patch" + if(!name) + var/name_default = reagents.get_master_reagent_name() + if (name_has_units) + name_default += " ([vol_each]u)" + name = stripped_input(usr, + "Name:", + "Give it a name!", + name_default, + MAX_NAME_LEN) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) + return + // Start filling + switch(item_type) + if("pill") + var/obj/item/reagent_containers/pill/P + var/target_loc = drop_location() + var/drop_threshold = INFINITY + if(bottle) + var/datum/component/storage/STRB = bottle.GetComponent( + /datum/component/storage) + if(STRB) + drop_threshold = STRB.max_items - bottle.contents.len + for(var/i = 0; i < amount; i++) + if(i < drop_threshold) + P = new/obj/item/reagent_containers/pill(target_loc) + else + P = new/obj/item/reagent_containers/pill(drop_location()) + P.name = trim("[name] pill") + if(chosenPillStyle == RANDOM_PILL_STYLE) + P.icon_state ="pill[rand(1,21)]" + else + P.icon_state = "pill[chosenPillStyle]" + if(P.icon_state == "pill4") + P.desc = "A tablet or capsule, but not just any, a red one, one taken by the ones not scared of knowledge, freedom, uncertainty and the brutal truths of reality." + adjust_item_drop_location(P) + reagents.trans_to(P, vol_each, transfered_by = usr) + . = TRUE + if("patch") + var/obj/item/reagent_containers/pill/patch/P + for(var/i = 0; i < amount; i++) + P = new/obj/item/reagent_containers/pill/patch(drop_location()) + P.name = trim("[name] patch") + adjust_item_drop_location(P) + reagents.trans_to(P, vol_each, transfered_by = usr) + . = TRUE + if("bottle") + var/obj/item/reagent_containers/glass/bottle/P + for(var/i = 0; i < amount; i++) + P = new/obj/item/reagent_containers/glass/bottle(drop_location()) + P.name = trim("[name] bottle") + adjust_item_drop_location(P) + reagents.trans_to(P, vol_each, transfered_by = usr) + . = TRUE + if("condimentPack") + var/obj/item/reagent_containers/food/condiment/pack/P + for(var/i = 0; i < amount; i++) + P = new/obj/item/reagent_containers/food/condiment/pack(drop_location()) + P.originalname = name + P.name = trim("[name] pack") + P.desc = "A small condiment pack. The label says it contains [name]." + reagents.trans_to(P, vol_each, transfered_by = usr) + . = TRUE + if("condimentBottle") + var/obj/item/reagent_containers/food/condiment/P + for(var/i = 0; i < amount; i++) + P = new/obj/item/reagent_containers/food/condiment(drop_location()) + P.originalname = name + P.name = trim("[name] bottle") + reagents.trans_to(P, vol_each, transfered_by = usr) + . = TRUE + if("analyze") + var/datum/reagent/R = GLOB.name2reagent[params["id"]] + if(R && reagents.get_reagent_amount(R)) + var/state = "Unknown" + if(initial(R.reagent_state) == 1) + state = "Solid" + else if(initial(R.reagent_state) == 2) + state = "Liquid" + else if(initial(R.reagent_state) == 3) + state = "Gas" + var/const/P = 3 //The number of seconds between life ticks + var/T = initial(R.metabolization_rate) * (60 / P) + analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold)) + screen = "analyze" + . = TRUE + if("goScreen") + screen = params["screen"] + . = TRUE /obj/machinery/chem_master/proc/isgoodnumber(num) diff --git a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm index b8ecac8aeb331..47dfbd62b4a3e 100644 --- a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm +++ b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm @@ -24,6 +24,7 @@ if(!ui) ui = new(user, src, "ChemDebugSynthesizer") ui.open() + ui.set_autoupdate(TRUE) // Cell charge /obj/machinery/chem_dispenser/chem_synthesizer/ui_act(action, params) if(..()) @@ -55,16 +56,25 @@ else if(!beaker.reagents && !QDELETED(beaker)) beaker.create_reagents(beaker.volume) beaker.reagents.add_reagent(input_reagent, amount) + . = TRUE if("makecup") if(beaker) return beaker = new /obj/item/reagent_containers/glass/beaker/bluespace(src) visible_message("[src] dispenses a bluespace beaker.") + . = TRUE if("amount") var/input = text2num(params["amount"]) if(input) amount = input - update_icon() + . = TRUE + if(.) + update_icon() + +/obj/machinery/chem_dispenser/chem_synthesizer/Destroy() + if(beaker) + QDEL_NULL(beaker) + return ..() /obj/machinery/chem_dispenser/chem_synthesizer/proc/find_reagent(input) . = FALSE diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 4280bec0ace04..372ec2f6abd38 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -38,7 +38,6 @@ . += "Alt-click to eject [is_close ? beaker : "the beaker"]." /obj/machinery/computer/pandemic/AltClick(mob/user) - . = ..() if(user.canUseTopic(src, BE_CLOSE)) eject_beaker() @@ -83,18 +82,18 @@ var/list/this_symptom = list() this_symptom = get_symptom_data(S) this["symptoms"] += list(this_symptom) - this["resistance"] = A.totalResistance() - this["stealth"] = A.totalStealth() - this["stage_speed"] = A.totalStageSpeed() - this["transmission"] = A.totalTransmittable() - this["symptom_severity"] = A.totalSeverity() + this["resistance"] = A.resistance + this["stealth"] = A.stealth + this["stage_speed"] = A.stage_rate + this["transmission"] = A.transmission + this["symptom_severity"] = A.severity this["index"] = index++ this["agent"] = D.agent this["description"] = D.desc || "none" this["spread"] = D.spread_text || "none" this["cure"] = D.cure_text || "none" - this["severity"] = D.severity || "none" + this["danger"] = D.danger || "none" . += list(this) @@ -106,7 +105,7 @@ this["stealth"] = S.stealth this["resistance"] = S.resistance this["stage_speed"] = S.stage_speed - this["transmission"] = S.transmittable + this["transmission"] = S.transmission this["level"] = S.level this["neutered"] = S.neutered this["threshold_desc"] = S.threshold_desc @@ -130,6 +129,7 @@ /obj/machinery/computer/pandemic/proc/reset_replicator_cooldown() wait = FALSE update_icon() + SStgui.update_uis(src) playsound(src, 'sound/machines/ping.ogg', 30, TRUE) /obj/machinery/computer/pandemic/update_icon() @@ -148,6 +148,7 @@ beaker.forceMove(drop_location()) beaker = null update_icon() + ui_update() /obj/machinery/computer/pandemic/ui_state(mob/user) @@ -256,6 +257,7 @@ beaker = I to_chat(user, "You insert [I] into [src].") update_icon() + ui_update() else return ..() diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 4948f068da41d..578786c35932d 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -17,6 +17,7 @@ var/limit = 10 var/speed = 1 var/list/holdingitems + var/static/list/typecache_to_take var/static/radial_examine = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine") var/static/radial_eject = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject") @@ -26,6 +27,8 @@ /obj/machinery/reagentgrinder/Initialize() . = ..() + if(!typecache_to_take) + typecache_to_take = typecacheof(/obj/item/reagent_containers/food/snacks/grown) holdingitems = list() beaker = new /obj/item/reagent_containers/glass/beaker/large(src) beaker.desc += " May contain blended dust. Don't breathe this in!" @@ -39,12 +42,19 @@ /obj/machinery/reagentgrinder/Destroy() if(beaker) beaker.forceMove(drop_location()) + beaker = null drop_all_items() return ..() /obj/machinery/reagentgrinder/contents_explosion(severity, target) if(beaker) - beaker.ex_act(severity, target) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += beaker + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += beaker + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += beaker /obj/machinery/reagentgrinder/RefreshParts() speed = 1 @@ -70,8 +80,8 @@ . += "- \A [O.name]." if(!(stat & (NOPOWER|BROKEN))) - . += {"The status display reads:\n - - Grinding reagents at [speed*100]%."} + . += "The status display reads:\n"+\ + "- Grinding reagents at [speed*100]%." if(beaker) for(var/datum/reagent/R in beaker.reagents.reagent_list) . += "- [R.volume] units of [R.name]." @@ -139,7 +149,7 @@ //Fill machine with a bag! if(istype(I, /obj/item/storage/bag)) var/list/inserted = list() - if(SEND_SIGNAL(I, COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/reagent_containers/food/snacks/grown, src, limit - length(holdingitems), null, null, user, inserted)) + if(SEND_SIGNAL(I, COMSIG_TRY_STORAGE_TAKE_TYPE, typecache_to_take, src, limit - length(holdingitems), null, null, user, inserted)) for(var/i in inserted) holdingitems[i] = TRUE if(!I.contents.len) diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index fb42e9e52fdf8..f9f64445a46c9 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -13,7 +13,6 @@ var/efficiency = 10 var/on = FALSE var/cooldown = 0 - var/screen = "home" var/useramount = 30 // Last used amount var/setting = 1 // displayed range is 3 * setting var/max_range = 3 // displayed max range is 3 * max range @@ -38,6 +37,11 @@ for(var/obj/item/stock_parts/matter_bin/B in component_parts) reagents.maximum_volume += REAGENTS_BASE_VOLUME * B.rating + AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated)) + +/obj/machinery/smoke_machine/proc/can_be_rotated(mob/user,rotation_type) + return !anchored + /obj/machinery/smoke_machine/update_icon() if((!is_operational()) || (!on) || (reagents.total_volume == 0)) if (panel_open) @@ -113,6 +117,7 @@ if(!ui) ui = new(user, src, "SmokeMachine") ui.open() + ui.set_autoupdate(TRUE) // Tank contents, particularly plumbing /obj/machinery/smoke_machine/ui_data(mob/user) var/data = list() @@ -127,7 +132,6 @@ data["TankMaxVolume"] = reagents.maximum_volume data["active"] = on data["setting"] = setting - data["screen"] = screen data["maxSetting"] = max_range return data @@ -147,12 +151,10 @@ if("power") on = !on update_icon() + . = TRUE if(on) message_admins("[ADMIN_LOOKUPFLW(usr)] activated a smoke machine that contains [english_list(reagents.reagent_list)] at [ADMIN_VERBOSEJMP(src)].") log_game("[key_name(usr)] activated a smoke machine that contains [english_list(reagents.reagent_list)] at [AREACOORD(src)].") log_combat(usr, src, "has activated [src] which contains [english_list(reagents.reagent_list)] at [AREACOORD(src)].") - if("goScreen") - screen = params["screen"] - . = TRUE #undef REAGENTS_BASE_VOLUME diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index e98af0942281e..55ffe514e4d3d 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -41,7 +41,10 @@ All effects don't start immediately, but rather get worse over time; the rate is if(HAS_TRAIT(C, TRAIT_ALCOHOL_TOLERANCE)) //we're an accomplished drinker booze_power *= 0.7 if(HAS_TRAIT(C, TRAIT_LIGHT_DRINKER)) - booze_power *= 2 + if(booze_power < 0) + booze_power *= -1 + else + booze_power *= 2 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)) @@ -75,8 +78,8 @@ All effects don't start immediately, but rather get worse over time; the rate is for(var/s in C.surgeries) var/datum/surgery/S = s - S.success_multiplier = max(0.1*power_multiplier, S.success_multiplier) - // +10% success propability on each step, useful while operating in less-than-perfect conditions + S.speed_modifier = max(0.1*power_multiplier, S.speed_modifier) + // +10% surgery speed on each step, useful while operating in less-than-perfect conditions return ..() /datum/reagent/consumable/ethanol/beer @@ -641,7 +644,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/M) if(HAS_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE)) metabolization_rate = 0.8 - if(!HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + if(M.mind && !HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) B = new() M.gain_trauma(B, TRAUMA_RESILIENCE_ABSOLUTE) ADD_TRAIT(M, TRAIT_NOBLOCK, type) //sorry sec, but you dont get a special stam heal to help with blocking @@ -649,7 +652,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/carbon/M) M.Jitter(2) - if(HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) M.adjustStaminaLoss(-10, 0) if(prob(20)) new /datum/hallucination/items_other(M) @@ -665,7 +668,7 @@ All effects don't start immediately, but rather get worse over time; the rate is return ..() /datum/reagent/consumable/ethanol/beepsky_smash/overdose_start(mob/living/carbon/M) - if(!HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + if(M.mind && !HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) M.gain_trauma(/datum/brain_trauma/mild/phobia/security, TRAUMA_RESILIENCE_BASIC) @@ -1457,7 +1460,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/quadruple_sec name = "Quadruple Sec" - description = "Kicks just as hard as licking the powercell on a baton, but tastier." + description = "Kicks just as hard as licking the power cell on a baton, but tastier." color = "#cc0000" boozepwr = 35 quality = DRINK_GOOD @@ -1468,7 +1471,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/M) //Securidrink in line with the Screwdriver for engineers or Nothing for mimes - if(HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) M.heal_bodypart_damage(1, 1) M.adjustBruteLoss(-2,0) . = 1 @@ -1488,7 +1491,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/M) //Securidrink in line with the Screwdriver for engineers or Nothing for mimes but STRONG.. - if(HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) M.heal_bodypart_damage(2,2,2) M.adjustBruteLoss(-5,0) M.adjustOxyLoss(-5,0) @@ -1604,7 +1607,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/crevice_spike name = "Crevice Spike" - description = "Sour, bitter, and smashingly sobering." + description = "Sour, bitter, and smashingly sobering. Doesn't sober up light drinkers." color = "#5BD231" boozepwr = -10 //sobers you up - ideally, one would drink to get hit with brute damage now to avoid alcohol problems later quality = DRINK_VERYGOOD @@ -1769,7 +1772,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /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 + description = "What if the Manhattan coctail ACTUALLY used a bitter herb liquour? Helps you sobers up. Doesn't sober up light drinkers." //also causes a bit of stamina damage to symbolize the afterdrink lazyness color = "#CA933F" // rgb: 202, 147, 63 boozepwr = -10 quality = DRINK_NICE @@ -2094,7 +2097,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "boozy Catholicism in a glass." /datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/M) - if(M.mind.isholy) + if(M.mind?.holy_role) M.adjustFireLoss(-2.5, 0) M.jitteriness = max(0, M.jitteriness-1) M.stuttering = max(0, M.stuttering-1) @@ -2339,3 +2342,20 @@ All effects don't start immediately, but rather get worse over time; the rate is M.adjustFireLoss(-1.5, 0) M.adjustToxLoss(-1, 0) . = ..() + +/datum/reagent/consumable/ethanol/beeffizz + name = "Beef Fizz" + description = "This is beef fizz, BEEF FIZZ, THERE IS NO GOD" + boozepwr = 15 + quality = DRINK_BAD + taste_description = "Nice and Salty Fizzless Beef Juice with a quick bite of lemon" + glass_icon_state = "beef_fizz" + glass_name = "Beef Fizz" + glass_desc = "WHO THOUGHT THIS WAS A GOOD IDEA??" + + +/datum/reagent/consumable/beeffizz/on_mob_metabolize(mob/living/M) + to_chat(M, "That drink was way too beefy! You feel sick.") + M.adjust_disgust(30) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "quality_drink", /datum/mood_event/quality_bad) + . = ..() \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index fcecc8bddcd35..66d62045aaa83 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -162,6 +162,15 @@ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "chemical_laughter", /datum/mood_event/chemical_laughter) ..() +/datum/reagent/consumable/laughter/reaction_mob(mob/living/M, method=TOUCH, reac_volume) + var/mob/living/carbon/human/reactor = M + if(istype(reactor)) + var/datum/component/mood/mood = reactor.GetComponent(/datum/component/mood) + if (mood.get_event("slipped")) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "laughter", /datum/mood_event/funny_prank) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "slipped") + reactor.AdjustKnockdown(-20) + /datum/reagent/consumable/superlaughter name = "Super Laughter" description = "Funny until you're the one laughing." @@ -200,6 +209,7 @@ glass_icon_state = "glass_white" glass_name = "glass of milk" glass_desc = "White and nutritious goodness!" + overdose_threshold = 500 //High calcium intake is bad for bone health. OD is exactly like having taken a normal-ish bone hurt juice. If anyone hits the superoverdose, well I'll be damned /datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M) if(M.getBruteLoss() && prob(20)) @@ -209,6 +219,31 @@ holder.remove_reagent(/datum/reagent/consumable/capsaicin, 2) ..() +/*See block comment in ../milk/overdose_process(mob/living/M) for calculation and explanation of why this exists and why 5 was chosen +* For best results use in tandem with method outlined in this comment +*/ +/datum/reagent/consumable/milk/overdose_start(mob/living/M) + M.reagents.add_reagent(/datum/reagent/toxin/bonehurtingjuice, 5) //The integer here should match var/starting_amount in ../milk/overdose_process(mob/living/M) + return ..() + +/datum/reagent/consumable/milk/overdose_process(mob/living/M) + var/datum/reagent/converted_reagent = /datum/reagent/toxin/bonehurtingjuice //Needed to get the metabolism for desired reagent, exists solely for brevity compared to /datum/reagent/category/reagent.metabolization_rate + var/minimum_cycles = overdose_threshold/metabolization_rate //minimum_cycles is the number of ticks for an amount of units equal to the overdose threshold to process. + var/amount_to_add = 45 / minimum_cycles + initial(converted_reagent.metabolization_rate) //amount_to_add is the calculated amount to add per tick to meet ensure that target_units after minimum_cycle ticks. + M.reagents.add_reagent(/datum/reagent/toxin/bonehurtingjuice, amount_to_add) + return ..() + /*In depth explanation by DatBoiTim + * This number will not put more than 50u of BHJ into their system if only 500u(ie bare minimum OD). + * milk.overdose_threshold / milk.metabolization_rate = minimum_cycles = 1,250 cycles + * (target_units / total_cycles) + BHJ.metabolization_rate = amount_to_add = .44 + * However, regular livers process 1u per tick of any toxin if it is under 3u. This does not account for others, since most others are likely upgrades, and having a workaround for those upgrades defeats their purpose. + * Meaning we need a starting amount to offset this which is more than three. Ideally this should yield the lowest amount of decimal spaces to save space, while being as low as possible. + * In this case starting_amount = 5. + * ( (target_units - starting_amount) / minimum_cycles) + BHJ.metabolization_rate = amount_to_add = .436 + * Copy pasting the above and changing /datum/reagent/toxin/bonehurtingjuice as well as the documentation to be accurate for another type path will work so long as the reagent using this has an OD threshold. + * You can just change the target units and should double check that the starting amount meets outlined criteria. + */ + /datum/reagent/consumable/soymilk name = "Soy Milk" description = "An opaque white liquid made from soybeans." @@ -410,7 +445,7 @@ taste_description = "carbonated oil" glass_icon_state = "grey_bull_glass" glass_name = "glass of Grey Bull" - glass_desc = "Surprisingly it isnt grey." + glass_desc = "Surprisingly it isn't grey." /datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/L) ..() @@ -642,7 +677,7 @@ 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! + if(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 @@ -813,12 +848,13 @@ glass_name = "Red Queen" glass_desc = "DRINK ME." random_unrestricted = TRUE - var/current_size = 1 + 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() @@ -827,15 +863,30 @@ ..() /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() ..() /datum/reagent/consumable/bungojuice name = "Bungo Juice" color = "#F9E43D" - description = "Exotic! You feel like you are on vactation already." + description = "Exotic! You feel like you are on vacation already." taste_description = "succulent bungo" glass_icon_state = "glass_yellow" glass_name = "glass of bungo juice" - glass_desc = "Exotic! You feel like you are on vactation already." + glass_desc = "Exotic! You feel like you are on vacation already." + +/datum/reagent/consumable/beefbroth + name = "Beef Broth" + color = "#100800" // rgb: 16, 8, 0 , just like cola + taste_description = "Pure Beef Essence" + glass_icon_state = "glass_brown" + glass_name = "glass of Space Cola?" + glass_desc = "A glass of what appears to be refreshing Space Cola." + +/datum/reagent/consumable/beefbroth/on_mob_metabolize(mob/living/M) + to_chat(M, "That drink was way too beefy! You feel sick.") + M.adjust_disgust(30) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "quality_drink", /datum/mood_event/quality_bad) + . = ..() diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index a04b0850fb486..98143b38b42f7 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -166,12 +166,17 @@ /datum/reagent/drug/krokodil/addiction_act_stage4(mob/living/carbon/human/M) CHECK_DNA_AND_SPECIES(M) - if(!istype(M.dna.species, /datum/species/krokodil_addict)) - to_chat(M, "Your skin falls off easily!") - M.adjustBruteLoss(50*REM, 0) // holy shit your skin just FELL THE FUCK OFF - M.set_species(/datum/species/krokodil_addict) + if(ishumanbasic(M)) + if(!istype(M.dna.species, /datum/species/krokodil_addict)) + to_chat(M, "Your skin falls off easily!") + M.adjustBruteLoss(50*REM, 0) // holy shit your skin just FELL THE FUCK OFF + M.set_species(/datum/species/krokodil_addict) + else + M.adjustBruteLoss(5*REM, 0) else - M.adjustBruteLoss(5*REM, 0) + to_chat(M, "Your skin peels and tears!") + M.adjustBruteLoss(5*REM, 0) // repeats 5 times and then you get over it + ..() . = 1 @@ -190,10 +195,12 @@ if (L.client) SSmedals.UnlockMedal(MEDAL_APPLY_REAGENT_METH,L.client) - L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING)) + L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-1.25, blacklisted_movetypes=(FLYING|FLOATING)) + ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, type) /datum/reagent/drug/methamphetamine/on_mob_end_metabolize(mob/living/L) REMOVE_TRAIT(L, TRAIT_NOBLOCK, type) + REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, type) L.remove_movespeed_modifier(type) ..() @@ -206,7 +213,8 @@ M.AdjustUnconscious(-40, FALSE) M.AdjustParalyzed(-40, FALSE) M.AdjustImmobilized(-40, FALSE) - M.adjustStaminaLoss(-30, 0) + M.adjustStaminaLoss(-40, 0) + M.drowsyness = max(0,M.drowsyness-30) M.Jitter(2) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1) if(prob(5)) @@ -471,3 +479,85 @@ M.emote(pick("twitch","laugh","frown")) ..() . = 1 + +//I had to do too much research on this to make this a thing. Hopefully the FBI won't kick my door down. +/datum/reagent/drug/ketamine + name = "Ketamine" + description = "A heavy duty tranquilizer found to also invoke feelings of euphoria, and assist with pain. Popular at parties and amongst small frogmen who drive Honda Civics." + reagent_state = LIQUID + color = "#c9c9c9" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + addiction_threshold = 8 + overdose_threshold = 16 + +/datum/reagent/drug/ketamine/on_mob_metabolize(mob/living/L) + ADD_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type) + . = ..() + +/datum/reagent/drug/ketamine/on_mob_delete(mob/living/L) + REMOVE_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type) + . = ..() + +/datum/reagent/drug/ketamine/on_mob_life(mob/living/carbon/M) + //Friendly Reminder: Ketamine is a tranquilizer and will sleep you. + switch(current_cycle) + if(10) + to_chat(M, "You start to feel tired..." ) + if(11 to 25) + M.drowsyness ++ + if(26 to INFINITY) + M.Sleeping(60, 0) + . = 1 + //Providing a Mood Boost + M.confused -= 3 + M.jitteriness -= 5 + M.disgust -= 3 + //Ketamine is also a dissociative anasthetic which means Hallucinations! + M.hallucination += 5 + ..() + +/datum/reagent/drug/ketamine/overdose_process(mob/living/M) + //Dissociative anesthetics? Overdosing? Time to dissociate hard. + var/obj/item/organ/brain/B = M.getorgan(/obj/item/organ/brain) + if(B.can_gain_trauma(/datum/brain_trauma/severe/split_personality, 5)) + B.brain_gain_trauma(/datum/brain_trauma/severe/split_personality, 5) + . = 1 + M.hallucination += 10 + //Uh Oh Someone is tired + if(prob(40)) + if(HAS_TRAIT(M, TRAIT_IGNOREDAMAGESLOWDOWN)) + REMOVE_TRAIT(M, TRAIT_IGNOREDAMAGESLOWDOWN, type) + if(prob(33)) + to_chat(M, "Your limbs begin to feel heavy...") + else if(prob(33)) + to_chat(M, "It feels hard to move...") + else + to_chat(M, "You feel like you your limbs won't move...") + M.drop_all_held_items() + M.Dizzy(5) + ..() + +//Addiction Gradient +/datum/reagent/drug/ketamine/addiction_act_stage1(mob/living/M) + if(prob(20)) + M.drop_all_held_items() + M.Jitter(2) + ..() + +/datum/reagent/drug/ketamine/addiction_act_stage2(mob/living/M) + if(prob(30)) + M.drop_all_held_items() + M.adjustToxLoss(2*REM, 0) + . = 1 + M.Jitter(3) + M.Dizzy(3) + ..() + +/datum/reagent/drug/ketamine/addiction_act_stage3(mob/living/M) + if(prob(40)) + M.drop_all_held_items() + M.adjustToxLoss(3*REM, 0) + . = 1 + M.Jitter(4) + M.Dizzy(4) + ..() diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 7e67208f9f5eb..5e0e69fd8fbac 100755 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -19,7 +19,7 @@ current_cycle++ if(ishuman(M)) var/mob/living/carbon/human/H = M - if(!HAS_TRAIT(H, TRAIT_NOHUNGER)) + if(!HAS_TRAIT(H, TRAIT_NOHUNGER) && !HAS_TRAIT(H, TRAIT_POWERHUNGRY)) H.adjust_nutrition(nutriment_factor) holder.remove_reagent(type, metabolization_rate) @@ -284,17 +284,15 @@ var/mob/living/carbon/victim = M if(method == TOUCH || method == VAPOR) - var/pepper_proof = victim.is_pepper_proof() - //check for protection //actually handle the pepperspray effects - if (!(pepper_proof)) // you need both eye and mouth protection - if(prob(5)) - victim.emote("scream") + if(!victim.is_eyes_covered() || !victim.is_mouth_covered()) victim.blur_eyes(5) // 10 seconds victim.blind_eyes(3) // 6 seconds - victim.confused = max(M.confused, 5) // 10 seconds victim.Knockdown(3 SECONDS) + if(prob(5)) + victim.emote("scream") + victim.confused = max(M.confused, 5) // 10 seconds victim.add_movespeed_modifier(MOVESPEED_ID_PEPPER_SPRAY, update=TRUE, priority=100, multiplicative_slowdown=0.25, blacklisted_movetypes=(FLYING|FLOATING)) addtimer(CALLBACK(victim, /mob.proc/remove_movespeed_modifier, MOVESPEED_ID_PEPPER_SPRAY), 10 SECONDS) victim.update_damage_hud() @@ -358,9 +356,10 @@ -/datum/reagent/consumable/hot_cocoa +/datum/reagent/consumable/cocoa/hot_cocoa name = "Hot Chocolate" description = "Made with love! And cocoa beans." + reagent_state = LIQUID nutriment_factor = 3 * REAGENTS_METABOLISM color = "#403010" // rgb: 64, 48, 16 taste_description = "creamy chocolate" @@ -368,7 +367,7 @@ glass_name = "glass of chocolate" glass_desc = "Tasty." -/datum/reagent/consumable/hot_cocoa/on_mob_life(mob/living/carbon/M) +/datum/reagent/consumable/cocoa/hot_cocoa/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) ..() @@ -432,7 +431,7 @@ taste_description = "childhood whimsy" /datum/reagent/consumable/sprinkles/on_mob_life(mob/living/carbon/M) - if(HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) M.heal_bodypart_damage(1,1, 0) . = 1 ..() @@ -450,10 +449,9 @@ T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = reac_volume*2 SECONDS) var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T) if(hotspot) - var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles()) - lowertemp.set_temperature(max( min(lowertemp.return_temperature()-2000,lowertemp.return_temperature() / 2) ,0)) + var/datum/gas_mixture/lowertemp = T.return_air() + lowertemp.set_temperature(max( min(lowertemp.return_temperature()-2000,lowertemp.return_temperature() / 2) ,TCMB)) lowertemp.react(src) - T.assume_air(lowertemp) qdel(hotspot) /datum/reagent/consumable/enzyme @@ -577,12 +575,12 @@ ..() /datum/reagent/consumable/honey/reaction_mob(mob/living/M, method=TOUCH, reac_volume) - if(iscarbon(M) && (method in list(TOUCH, VAPOR, PATCH))) - var/mob/living/carbon/C = M - for(var/s in C.surgeries) - var/datum/surgery/S = s - S.success_multiplier = max(0.6, S.success_multiplier) // +60% success probability on each step, compared to bacchus' blessing's ~46% - ..() + if(iscarbon(M) && (method in list(TOUCH, VAPOR, PATCH))) + var/mob/living/carbon/C = M + for(var/s in C.surgeries) + var/datum/surgery/S = s + S.speed_modifier = max(0.6, S.speed_modifier) // +60% surgery speed on each step, compared to bacchus' blessing's ~46% + ..() /datum/reagent/consumable/honey/special name = "Royal Honey" @@ -672,11 +670,11 @@ color = "#b5a213" taste_description = "tingling mushroom" -/datum/reagent/consumable/tinlux/reaction_mob(mob/living/M) +/datum/reagent/consumable/tinlux/on_mob_metabolize(mob/living/carbon/M) M.set_light(2) -/datum/reagent/consumable/tinlux/on_mob_end_metabolize(mob/living/M) - M.set_light(-2) +/datum/reagent/consumable/tinlux/on_mob_end_metabolize(mob/living/carbon/M) + M.set_light(0) /datum/reagent/consumable/vitfro name = "Vitrium Froth" @@ -708,12 +706,12 @@ taste_description = "pure electrictiy" /datum/reagent/consumable/liquidelectricity/on_mob_life(mob/living/carbon/M) - if(isethereal(M)) - var/mob/living/carbon/human/H = M - var/datum/species/ethereal/E = H.dna?.species - E.adjust_charge(5*REM) - else if(prob(25)) //scp13 optimization - M.electrocute_act(rand(10,15), "Liquid Electricity in their body", 1) //lmao at the newbs who eat energy bars + if(HAS_TRAIT(M, TRAIT_POWERHUNGRY)) + var/obj/item/organ/stomach/battery/stomach = M.getorganslot(ORGAN_SLOT_STOMACH) + if(istype(stomach)) + stomach.adjust_charge(40*REM) + else if(prob(3)) //scp13 optimization + M.electrocute_act(rand(3,5), "Liquid Electricity in their body", 1) //lmao at the newbs who eat energy bars playsound(M, "sparks", 50, 1) return ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index b9d095ee0c415..02c069fc096cd 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -17,6 +17,8 @@ name = "Leporazine" description = "Leporazine will effectively regulate a patient's body temperature, ensuring it never leaves safe levels." color = "#C8A5DC" // rgb: 200, 165, 220 + overdose_threshold = 30 + metabolization_rate = 0.25 * REAGENTS_METABOLISM /datum/reagent/medicine/leporazine/on_mob_life(mob/living/carbon/M) if(M.bodytemperature > BODYTEMP_NORMAL) @@ -25,6 +27,14 @@ M.adjust_bodytemperature(40 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) ..() +/datum/reagent/medicine/leporazine/overdose_process(mob/living/M) + if(prob(50)) + M.adjust_bodytemperature(200, 0) + else + M.adjust_bodytemperature(-200, 0) + ..() + . = 1 + /datum/reagent/medicine/adminordrazine //An OP chemical for admins name = "Adminordrazine" description = "It's magic. We don't have to explain it." @@ -66,7 +76,7 @@ O.setOrganDamage(0) for(var/thing in M.diseases) var/datum/disease/D = thing - if(D.severity == DISEASE_SEVERITY_BENEFICIAL || D.severity == DISEASE_SEVERITY_POSITIVE) + if(D.danger == DISEASE_BENEFICIAL || D.danger == DISEASE_POSITIVE) continue D.cure() ..() @@ -127,7 +137,7 @@ name = "Cryoxadone" description = "A chemical mixture with almost magical healing powers. Its main limitation is that the patient's body temperature must be under 270K for it to metabolise correctly." color = "#0000C8" - taste_description = "sludge" + taste_description = "blue" /datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/M) var/power = -0.00003 * (M.bodytemperature ** 2) + 3 @@ -139,7 +149,7 @@ M.adjustCloneLoss(-power, 0) REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) //fixes common causes for disfiguration . = 1 - metabolization_rate = REAGENTS_METABOLISM * (0.00001 * (M.bodytemperature ** 2) + 0.5) + metabolization_rate = REAGENTS_METABOLISM * (0.00001 * (M.bodytemperature ** 2) + 0.5)//Metabolism rate is reduced in colder body temps making it more effective ..() /datum/reagent/medicine/clonexadone @@ -154,7 +164,7 @@ M.adjustCloneLoss(0.00006 * (M.bodytemperature ** 2) - 6, 0) REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) . = 1 - metabolization_rate = REAGENTS_METABOLISM * (0.000015 * (M.bodytemperature ** 2) + 0.75) + metabolization_rate = REAGENTS_METABOLISM * (0.000015 * (M.bodytemperature ** 2) + 0.75)//Metabolism rate is reduced in colder body temps making it more effective ..() /datum/reagent/medicine/pyroxadone @@ -165,6 +175,7 @@ /datum/reagent/medicine/pyroxadone/on_mob_life(mob/living/carbon/M) if(M.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) + metabolization_rate = 0.2 // It metabolises effectively when the body is taking heat damage var/power = 0 switch(M.bodytemperature) if(BODYTEMP_HEAT_DAMAGE_LIMIT to 400) @@ -183,6 +194,8 @@ M.adjustCloneLoss(-power, 0) REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) . = 1 + else //If not the right temperature for pyroxadone to work + metabolization_rate = REAGENTS_METABOLISM ..() /datum/reagent/medicine/rezadone @@ -213,7 +226,7 @@ var/mob/living/carbon/patient = M if(reac_volume >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, "burn") && patient.getFireLoss() < THRESHOLD_UNHUSK) //One carp yields 12u rezadone. patient.cure_husk("burn") - patient.visible_message("[patient]'s body rapidly absorbs moisture from the enviroment, taking on a more healthy appearance.") + patient.visible_message("[patient]'s body rapidly absorbs moisture from the environment, taking on a more healthy appearance.") /datum/reagent/medicine/spaceacillin name = "Spaceacillin" @@ -224,10 +237,11 @@ //Goon Chems. Ported mainly from Goonstation. Easily mixable (or not so easily) and provide a variety of effects. /datum/reagent/medicine/silver_sulfadiazine name = "Silver Sulfadiazine" - description = "If used in touch-based applications, immediately restores burn wounds as well as restoring more over time. If ingested through other means, deals minor toxin damage." + description = "If used in patch-based applications, immediately restores burn wounds as well as restoring more over time. If ingested through other means, deals minor toxin damage." reagent_state = LIQUID color = "#C8A5DC" - overdose_threshold = 40 + metabolization_rate = 2.5 * REAGENTS_METABOLISM + overdose_threshold = 100 /datum/reagent/medicine/silver_sulfadiazine/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) @@ -235,10 +249,9 @@ M.adjustToxLoss(0.5*reac_volume) if(show_message) to_chat(M, "You don't feel so good...") - else if(M.reagents.has_reagent(/datum/reagent/medicine/silver_sulfadiazine, 40) && M.getFireLoss()) - to_chat(M, "Silver sulfadiazine foams as it fails to heal your burns!") - else if(M.getFireLoss()) + else if(M.getFireLoss() && method == PATCH) M.adjustFireLoss(-reac_volume) + M.adjustStaminaLoss(reac_volume*2) if(show_message) to_chat(M, "You feel your burns healing! It stings like hell!") M.emote("scream") @@ -246,15 +259,12 @@ ..() /datum/reagent/medicine/silver_sulfadiazine/on_mob_life(mob/living/carbon/M) - M.adjustFireLoss(-2*REM, 0) + M.adjustFireLoss(-0.5*REM, 0) ..() . = 1 /datum/reagent/medicine/silver_sulfadiazine/overdose_process(mob/living/M) - M.adjustFireLoss(2*REM, FALSE, FALSE, BODYPART_ORGANIC) - if(volume > overdose_threshold+10) - if(prob(33)) - M.adjustToxLoss(1*REM, FALSE, FALSE, BODYPART_ORGANIC) + M.adjustOxyLoss(1*REM, 0) ..() . = 1 @@ -267,25 +277,25 @@ overdose_threshold = 25 /datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/M) - if(M.getFireLoss() > 50) - M.adjustFireLoss(-4*REM, 0) //Twice as effective as silver sulfadiazine for severe burns - else - M.adjustFireLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones + M.adjustFireLoss(-3*REM, 0) + if(M.getFireLoss() != 0) + M.adjustStaminaLoss(3*REM, FALSE) ..() . = 1 /datum/reagent/medicine/oxandrolone/overdose_process(mob/living/M) - if(M.getFireLoss()) //It only makes existing burns worse - M.adjustFireLoss(4.5*REM, FALSE, FALSE, BODYPART_ORGANIC) // it's going to be healing either 4 or 0.5 - . = 1 + M.adjustFireLoss(-3*REM, 0) + M.adjustToxLoss(3*REM, 0) + M.adjustOrganLoss(ORGAN_SLOT_LIVER, 2) ..() /datum/reagent/medicine/styptic_powder name = "Styptic Powder" - description = "If used in touch-based applications, immediately restores bruising as well as restoring more over time. If ingested through other means, deals minor toxin damage." + description = "If used in patch-based applications, immediately restores bruising. If ingested through other means, deals minor toxin damage." reagent_state = LIQUID color = "#FF9696" - overdose_threshold = 40 + metabolization_rate = 2.5 * REAGENTS_METABOLISM + overdose_threshold = 100 /datum/reagent/medicine/styptic_powder/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) @@ -293,10 +303,9 @@ M.adjustToxLoss(0.5*reac_volume) if(show_message) to_chat(M, "You don't feel so good...") - else if(M.reagents.has_reagent(/datum/reagent/medicine/styptic_powder, 40) && M.getBruteLoss()) - to_chat(M, "Styptic powder foams as it fails to heal your bruises!") - else if(M.getBruteLoss()) + else if(M.getBruteLoss() && method == PATCH) M.adjustBruteLoss(-reac_volume) + M.adjustStaminaLoss(reac_volume*2) if(show_message) to_chat(M, "You feel your bruises healing! It stings like hell!") M.emote("scream") @@ -305,15 +314,12 @@ /datum/reagent/medicine/styptic_powder/on_mob_life(mob/living/carbon/M) - M.adjustBruteLoss(-2*REM, 0) + M.adjustBruteLoss(-0.5*REM, 0) ..() . = 1 /datum/reagent/medicine/styptic_powder/overdose_process(mob/living/M) - M.adjustBruteLoss(2*REM, 0) - if(volume > overdose_threshold+10) - if(prob(33)) - M.adjustToxLoss(1*REM, FALSE, FALSE, BODYPART_ORGANIC) + M.adjustOxyLoss(1*REM, 0) ..() . = 1 @@ -382,8 +388,8 @@ var/mob/living/carbon/C = M for(var/s in C.surgeries) var/datum/surgery/S = s - S.success_multiplier = max(0.1, S.success_multiplier) - // +10% success propability on each step, useful while operating in less-than-perfect conditions + S.speed_modifier = max(0.1, S.speed_modifier) + // +10% surgery speed on each step, useful while operating in less-than-perfect conditions if(show_message) to_chat(M, "You feel your wounds fade away to nothing!" ) @@ -400,23 +406,37 @@ description = "Has a 100% chance of instantly healing brute and burn damage. One unit of the chemical will heal one point of damage. Touch application only." reagent_state = LIQUID color = "#FFEBEB" + metabolization_rate = 2.5 * REAGENTS_METABOLISM + overdose_threshold = 125 /datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1) if(iscarbon(M)) if (M.stat == DEAD) show_message = 0 - if(method in list(PATCH, TOUCH)) - M.adjustBruteLoss(-1.25 * reac_volume) - M.adjustFireLoss(-1.25 * reac_volume) + if(method in list(PATCH)) + M.adjustBruteLoss(-1 * reac_volume) + M.adjustFireLoss(-1 * reac_volume) + M.adjustStaminaLoss(reac_volume*2) if(show_message) to_chat(M, "You feel your burns and bruises healing! It stings like hell!") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) - //Has to be at less than THRESHOLD_UNHUSK burn damage and have 100 isntabitaluri before unhusking. Corpses dont metabolize. - if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && M.getFireLoss() < THRESHOLD_UNHUSK && M.reagents.has_reagent(/datum/reagent/medicine/synthflesh, 100)) + //Has to be at less than THRESHOLD_UNHUSK burn damage and have at least 100 synthflesh (currently inside the body + amount now being applied). Corpses dont metabolize. + if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && M.getFireLoss() < THRESHOLD_UNHUSK && (M.reagents.get_reagent_amount(/datum/reagent/medicine/synthflesh) + reac_volume) >= 100) M.cure_husk("burn") M.visible_message("You successfully replace most of the burnt off flesh of [M].") ..() +/datum/reagent/medicine/synthflesh/on_mob_life(mob/living/carbon/M) + M.adjustFireLoss(-0.5*REM, 0) + M.adjustBruteLoss(-0.5*REM, 0) + ..() + . = 1 + +/datum/reagent/medicine/synthflesh/overdose_process(mob/living/M) + M.adjustToxLoss(2*REM, 0) + ..() + . = 1 + /datum/reagent/medicine/charcoal name = "Charcoal" description = "Heals mild toxin damage as well as slowly removing any other chemicals the patient has in their bloodstream." @@ -459,6 +479,7 @@ /datum/reagent/medicine/liquid_solder/on_mob_life(mob/living/M) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, (-3*REM)) + M.hallucination = max(0, M.hallucination - 10) if(iscarbon(M)) var/mob/living/carbon/C = M if(prob(30) && C.has_trauma_type(BRAIN_TRAUMA_SPECIAL)) @@ -546,17 +567,16 @@ /datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M) - if(M.getBruteLoss() > 50) - M.adjustBruteLoss(-4*REM, 0) //Twice as effective as styptic powder for severe bruising - else - M.adjustBruteLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones + M.adjustBruteLoss(-3*REM, 0) + if(M.getBruteLoss() != 0) + M.adjustStaminaLoss(3*REM, FALSE) ..() . = 1 /datum/reagent/medicine/sal_acid/overdose_process(mob/living/M) - if(M.getBruteLoss()) //It only makes existing bruises worse - M.adjustBruteLoss(4.5*REM, FALSE, FALSE, BODYPART_ORGANIC) // it's going to be healing either 4 or 0.5 - . = 1 + M.adjustFireLoss(-3*REM, 0) + M.adjustToxLoss(3*REM, 0) + M.adjustOrganLoss(ORGAN_SLOT_LIVER, 2) ..() /datum/reagent/medicine/salbutamol @@ -564,6 +584,7 @@ description = "Rapidly restores oxygen deprivation as well as preventing more of it to an extent." reagent_state = LIQUID color = "#00FFFF" + overdose_threshold = 25 metabolization_rate = 0.25 * REAGENTS_METABOLISM /datum/reagent/medicine/salbutamol/on_mob_life(mob/living/carbon/M) @@ -573,19 +594,30 @@ ..() . = 1 +/datum/reagent/medicine/salbutamol/overdose_process(mob/living/M) + M.reagents.add_reagent(/datum/reagent/toxin/histamine, 1) + M.reagents.remove_reagent(/datum/reagent/medicine/salbutamol, 1) + ..() + /datum/reagent/medicine/perfluorodecalin name = "Perfluorodecalin" - description = "Extremely rapidly restores oxygen deprivation, but inhibits speech. May also heal small amounts of bruising and burns." + description = "Extremely rapidly restores oxygen deprivation, but causes minor toxin damage. Overdose causes significant damage to the lungs." reagent_state = LIQUID color = "#FF6464" + overdose_threshold = 30 metabolization_rate = 0.25 * REAGENTS_METABOLISM /datum/reagent/medicine/perfluorodecalin/on_mob_life(mob/living/carbon/human/M) - M.adjustOxyLoss(-12*REM, 0) - M.adjustToxLoss(0.3*REM, 0) + M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -2) + M.adjustOxyLoss(-10*REM, 0) + M.adjustToxLoss(1*REM, 0) ..() return TRUE +/datum/reagent/medicine/perfluorodecalin/overdose_process(mob/living/M) + M.adjustOrganLoss(ORGAN_SLOT_HEART, 2) + ..() + /datum/reagent/medicine/ephedrine name = "Ephedrine" description = "Increases stun resistance and movement speed. Overdose deals toxin damage and inhibits breathing." @@ -792,27 +824,29 @@ /datum/reagent/medicine/atropine name = "Atropine" - description = "If a patient is in critical condition, rapidly heals all damage types as well as regulating oxygen in the body. Excellent for stabilizing wounded patients." + description = "If a patient is in critical condition, rapidly heals all damage types as well as regulating oxygen in the body. Excellent for stabilizing wounded patients. Has the side effects of causing minor confusion." reagent_state = LIQUID color = "#000000" metabolization_rate = 0.25 * REAGENTS_METABOLISM - overdose_threshold = 35 + overdose_threshold = 15 /datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/M) - if(M.health <= M.crit_threshold) - M.adjustToxLoss(-2*REM, 0) - M.adjustBruteLoss(-2*REM, 0) - M.adjustFireLoss(-2*REM, 0) + if(M.health <= 20) + M.adjustToxLoss(-4*REM, 0) + M.adjustBruteLoss(-4*REM, 0) + M.adjustFireLoss(-4*REM, 0) M.adjustOxyLoss(-5*REM, 0) . = 1 M.losebreath = 0 if(prob(20)) M.Dizzy(5) M.Jitter(5) + M.drop_all_held_items() ..() /datum/reagent/medicine/atropine/overdose_process(mob/living/M) - M.adjustToxLoss(0.5*REM, 0) + M.reagents.add_reagent(/datum/reagent/toxin/histamine, 3) + M.reagents.remove_reagent(/datum/reagent/medicine/atropine, 2) . = 1 M.Dizzy(1) M.Jitter(1) @@ -881,20 +915,7 @@ M.do_jitter_animation(10) addtimer(CALLBACK(M, /mob/living/carbon.proc/do_jitter_animation, 10), 40) //jitter immediately, then again after 4 and 8 seconds addtimer(CALLBACK(M, /mob/living/carbon.proc/do_jitter_animation, 10), 80) - sleep(100) //so the ghost has time to re-enter - - - var/mob/living/carbon/H = M - for(var/organ in H.internal_organs) - var/obj/item/organ/O = organ - O.setOrganDamage(0) - - M.adjustOxyLoss(-20, 0) - M.adjustToxLoss(-20, 0) - M.updatehealth() - if(M.revive()) - M.emote("gasp") - log_combat(M, M, "revived", src) + addtimer(CALLBACK(M, /mob/living.proc/revive, FALSE, FALSE), 100) ..() /datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/carbon/M) @@ -939,20 +960,21 @@ /datum/reagent/medicine/antihol name = "Antihol" - description = "Purges alcoholic substance from the patient's body and eliminates its side effects." + description = "Purges alcoholic substance from the patient's body and eliminates its side effects. Less effective in light drinkers." color = "#00B4C8" taste_description = "raw egg" /datum/reagent/medicine/antihol/on_mob_life(mob/living/carbon/M) - M.dizziness = 0 - M.drowsyness = 0 - M.slurring = 0 - M.confused = 0 + if(!HAS_TRAIT(M, TRAIT_LIGHT_DRINKER)) + M.dizziness = 0 + M.drowsyness = 0 + M.slurring = 0 + M.confused = 0 + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.drunkenness = max(H.drunkenness - 10, 0) M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3*REM, 0, 1) M.adjustToxLoss(-0.2*REM, 0) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.drunkenness = max(H.drunkenness - 10, 0) ..() . = 1 @@ -1044,18 +1066,22 @@ //Trek Chems, used primarily by medibots. Only heals a specific damage type, but is very efficient. /datum/reagent/medicine/bicaridine name = "Bicaridine" - description = "Restores bruising. Overdose causes it instead." + description = "Restores bruising. Overdose causes liver damage." reagent_state = LIQUID color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 30 /datum/reagent/medicine/bicaridine/on_mob_life(mob/living/carbon/M) - M.adjustBruteLoss(-2*REM, 0) + if(M.getBruteLoss() < 50) + M.adjustBruteLoss(-1.5*REM, 0) + else + M.adjustBruteLoss(-0.5*REM, 0) ..() . = 1 /datum/reagent/medicine/bicaridine/overdose_process(mob/living/M) - M.adjustBruteLoss(4*REM, FALSE, FALSE, BODYPART_ORGANIC) + M.adjustOrganLoss(ORGAN_SLOT_LIVER, 2) ..() . = 1 @@ -1067,46 +1093,55 @@ overdose_threshold = 30 /datum/reagent/medicine/dexalin/on_mob_life(mob/living/carbon/M) - M.adjustOxyLoss(-2*REM, 0) + if(M.getOxyLoss() < 50) + M.adjustOxyLoss(-1.5*REM, 0) + else + M.adjustOxyLoss(-0.5*REM, 0) ..() . = 1 /datum/reagent/medicine/dexalin/overdose_process(mob/living/M) - M.adjustOxyLoss(4*REM, 0) + M.adjustOrganLoss(ORGAN_SLOT_HEART, 2) ..() . = 1 /datum/reagent/medicine/dexalinp name = "Dexalin Plus" - description = "Restores oxygen loss. Overdose causes it instead. It is highly effective." + description = "Restores oxygen loss. Overdose causes large amounts of damage to the heart. It is highly effective." reagent_state = LIQUID color = "#0040FF" overdose_threshold = 25 /datum/reagent/medicine/dexalinp/on_mob_life(mob/living/carbon/M) - M.adjustOxyLoss(-4*REM, 0) + M.adjustOxyLoss(-3*REM, 0) + if(M.getOxyLoss() != 0) + M.adjustStaminaLoss(3*REM, FALSE) ..() . = 1 /datum/reagent/medicine/dexalinp/overdose_process(mob/living/M) - M.adjustOxyLoss(8*REM, 0) + M.adjustOrganLoss(ORGAN_SLOT_HEART, 4) ..() . = 1 /datum/reagent/medicine/kelotane name = "Kelotane" - description = "Restores fire damage. Overdose causes it instead." + description = "Restores fire damage. Overdose causes liver damage." reagent_state = LIQUID color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 30 /datum/reagent/medicine/kelotane/on_mob_life(mob/living/carbon/M) - M.adjustFireLoss(-2*REM, 0) + if(M.getFireLoss() < 50) + M.adjustFireLoss(-1.5*REM, 0) + else + M.adjustFireLoss(-0.5*REM, 0) ..() . = 1 /datum/reagent/medicine/kelotane/overdose_process(mob/living/M) - M.adjustFireLoss(4*REM, FALSE, FALSE, BODYPART_ORGANIC) + M.adjustOrganLoss(ORGAN_SLOT_LIVER, 2) ..() . = 1 @@ -1115,18 +1150,20 @@ description = "Heals toxin damage and removes toxins in the bloodstream. Overdose causes toxin damage." reagent_state = LIQUID color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 30 taste_description = "a roll of gauze" /datum/reagent/medicine/antitoxin/on_mob_life(mob/living/carbon/M) - M.adjustToxLoss(-2*REM, 0) - for(var/datum/reagent/toxin/R in M.reagents.reagent_list) - M.reagents.remove_reagent(R.type,1) + if(M.getToxLoss() < 50) + M.adjustToxLoss(-1.5*REM, 0) + else + M.adjustToxLoss(-0.5*REM, 0) ..() . = 1 /datum/reagent/medicine/antitoxin/overdose_process(mob/living/M) - M.adjustToxLoss(4*REM, 0) // End result is 2 toxin loss taken, because it heals 2 and then removes 4. + M.adjustOrganLoss(ORGAN_SLOT_LIVER, 2) ..() . = 1 @@ -1135,9 +1172,10 @@ description = "Carthatoline is strong evacuant used to treat severe poisoning." reagent_state = LIQUID color = "#225722" + overdose_threshold = 25 /datum/reagent/medicine/carthatoline/on_mob_life(mob/living/carbon/M) - M.adjustToxLoss(-5*REM, 0) + M.adjustToxLoss(-3*REM, 0) if(M.getToxLoss() && prob(10)) M.vomit(1) for(var/datum/reagent/toxin/R in M.reagents.reagent_list) @@ -1146,7 +1184,7 @@ . = 1 /datum/reagent/medicine/carthatoline/overdose_process(mob/living/M) - M.adjustToxLoss(10*REM, 0) // End result is 5 toxin loss taken, because it heals 5 and then removes 10. + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2) ..() . = 1 @@ -1156,7 +1194,7 @@ taste_description = "glue" reagent_state = LIQUID color = "#D2691E" - metabolization_rate = REM * 1.5 + metabolization_rate = REM * 3.75 overdose_threshold = 10 /datum/reagent/medicine/hepanephrodaxon/on_mob_life(var/mob/living/carbon/M) @@ -1165,13 +1203,12 @@ if(L.damage > 0) L.damage = max(L.damage - 4 * repair_strength, 0) M.confused = (2) - M.adjustToxLoss(-12) + M.adjustToxLoss(-6) ..() . = 1 /datum/reagent/medicine/hepanephrodaxon/overdose_process(mob/living/M) - var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) - L.damage = max(L.damage + 4, 0) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2) M.confused = (2) ..() . = 1 @@ -1189,7 +1226,7 @@ /datum/reagent/medicine/tricordrazine name = "Tricordrazine" - description = "Has a high chance to heal all types of damage. Overdose instead causes it." + description = "Has a high chance to heal all types of damage. Overdose causes toxin damage and liver damage." reagent_state = LIQUID color = "#C8A5DC" overdose_threshold = 30 @@ -1206,9 +1243,7 @@ /datum/reagent/medicine/tricordrazine/overdose_process(mob/living/M) M.adjustToxLoss(2*REM, 0) - M.adjustOxyLoss(2*REM, 0) - M.adjustBruteLoss(2*REM, FALSE, FALSE, BODYPART_ORGANIC) - M.adjustFireLoss(2*REM, FALSE, FALSE, BODYPART_ORGANIC) + M.adjustOrganLoss(ORGAN_SLOT_LIVER, 3) ..() . = 1 @@ -1227,6 +1262,21 @@ . = 1 ..() +/datum/reagent/medicine/regen_ooze + name = "Regenerative Ooze" + description = "Gradually regenerates all types of damage, without harming slime anatomy." + reagent_state = LIQUID + color = "#65d891" + taste_description = "jelly" + +/datum/reagent/medicine/regen_ooze/on_mob_life(mob/living/carbon/M) + M.adjustBruteLoss(-0.5*REM, 0) + M.adjustFireLoss(-0.5*REM, 0) + M.adjustOxyLoss(-0.5*REM, 0) + M.adjustToxLoss(-0.5*REM, 0, TRUE) //heals TOXINLOVERs + . = 1 + ..() + /datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs name = "Restorative Nanites" description = "Miniature medical robots that swiftly restore bodily damage." @@ -1359,11 +1409,13 @@ // Heart attack code will not do damage if corazone is present // because it's SPACE MAGIC ASPIRIN name = "Corazone" - description = "A medication used to treat pain, fever, and inflammation, along with heart attacks." + description = "A medication used to assist in healing the heart and to stabalize the heart and liver." color = "#F5F5F5" + overdose_threshold = 20 self_consuming = TRUE /datum/reagent/medicine/corazone/on_mob_metabolize(mob/living/M) + M.adjustOrganLoss(ORGAN_SLOT_HEART, -1.5) ..() ADD_TRAIT(M, TRAIT_STABLEHEART, type) ADD_TRAIT(M, TRAIT_STABLELIVER, type) @@ -1373,6 +1425,11 @@ REMOVE_TRAIT(M, TRAIT_STABLELIVER, type) ..() +/datum/reagent/medicine/corazone/overdose_process(mob/living/M) + M.reagents.add_reagent(/datum/reagent/toxin/histamine, 1) + M.reagents.remove_reagent(/datum/reagent/medicine/corazone, 1) + ..() + /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." @@ -1525,3 +1582,24 @@ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5) ..() . = 1 + +/datum/reagent/medicine/stabilizing_nanites + name = "Stabilizing nanites" + description = "Rapidly heals a patient out of crit by regenerating damaged cells. Nanites distribution in the blood makes them ineffective against moderately healthy targets." + reagent_state = LIQUID + color = "#000000" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 15 + can_synth = FALSE + +/datum/reagent/medicine/stabilizing_nanites/on_mob_life(mob/living/carbon/M) + if(M.health <= 80) + M.adjustToxLoss(-4*REM, 0) + M.adjustBruteLoss(-4*REM, 0) + M.adjustFireLoss(-4*REM, 0) + M.adjustOxyLoss(-5*REM, 0) + . = 1 + if(prob(20)) + M.Jitter(5) + M.losebreath = 0 + ..() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 48ac604a9e7a1..fa856b0bffaf7 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1,5 +1,5 @@ /datum/reagent/blood - data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null,"quirks"=null) + data = list("viruses"=null,"blood_DNA"=null,"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" color = "#C80000" // rgb: 200, 0, 0 metabolization_rate = 5 //fast rate so it disappears fast. @@ -112,6 +112,58 @@ if(istype(data)) src.data |= data.Copy() +/datum/reagent/corgium + name = "Corgium" + description = "A happy looking liquid that you feel compelled to consume if you want a better life." + color = "#ecca7f" + taste_description = "dog treats" + can_synth = FALSE + var/mob/living/simple_animal/pet/dog/corgi/new_corgi + +/datum/reagent/corgium/on_mob_metabolize(mob/living/L) + . = ..() + new_corgi = new(get_turf(L)) + new_corgi.key = L.key + new_corgi.name = L.real_name + new_corgi.real_name = L.real_name + ADD_TRAIT(L, TRAIT_NOBREATH, CORGIUM_TRAIT) + //hack - equipt current hat + var/mob/living/carbon/C = L + if (istype(C)) + var/obj/item/hat = C.get_item_by_slot(ITEM_SLOT_HEAD) + if (hat) + new_corgi.place_on_head(hat,null,FALSE) + L.forceMove(new_corgi) + +/datum/reagent/corgium/on_mob_life(mob/living/carbon/M) + . = ..() + //If our corgi died :( + if(new_corgi.stat) + holder.remove_all_type(type) + +/datum/reagent/corgium/on_mob_end_metabolize(mob/living/L) + . = ..() + REMOVE_TRAIT(L, TRAIT_NOBREATH, CORGIUM_TRAIT) + //New corgi was deleted, goodbye cruel world. + if(QDELETED(new_corgi)) + if(!QDELETED(L)) + qdel(L) + return + //Leave the corgi + L.key = new_corgi.key + L.adjustBruteLoss(new_corgi.getBruteLoss()) + L.adjustFireLoss(new_corgi.getFireLoss()) + L.forceMove(get_turf(new_corgi)) + // HACK - drop all corgi inventory + var/turf/T = get_turf(new_corgi) + if (new_corgi.inventory_head) + if(!L.equip_to_slot_if_possible(new_corgi.inventory_head, ITEM_SLOT_HEAD,disable_warning = TRUE, bypass_equip_delay_self=TRUE)) + new_corgi.inventory_head.forceMove(T) + new_corgi.inventory_back?.forceMove(T) + new_corgi.inventory_head = null + new_corgi.inventory_back = null + qdel(new_corgi) + /datum/reagent/water name = "Water" description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen." @@ -180,6 +232,10 @@ /datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with water can help put them out! if(!istype(M)) return + if(isoozeling(M)) + M.blood_volume -= 30 + to_chat(M, "The water causes you to melt away!") + return if(method == TOUCH) M.adjust_fire_stacks(-(reac_volume / 10)) M.ExtinguishMob() @@ -309,12 +365,20 @@ description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity." color = "#009CA8" // rgb: 0, 156, 168 taste_description = "cherry" // by popular demand + var/lube_kind = TURF_WET_LUBE ///What kind of slipperiness gets added to turfs. /datum/reagent/lube/reaction_turf(turf/open/T, reac_volume) if (!istype(T)) return if(reac_volume >= 1) - T.MakeSlippery(TURF_WET_LUBE, 15 SECONDS, min(reac_volume * 2 SECONDS, 120)) + T.MakeSlippery(lube_kind, 15 SECONDS, min(reac_volume * 2 SECONDS, 120)) + +///Stronger kind of lube. Applies TURF_WET_SUPERLUBE. +/datum/reagent/lube/superlube + name = "Super Duper Lube" + description = "This \[REDACTED\] has been outlawed after the incident on \[DATA EXPUNGED\]." + lube_kind = TURF_WET_SUPERLUBE + /datum/reagent/spraytan name = "Spray Tan" @@ -462,6 +526,7 @@ H.set_species(species_type) H.reagents.del_reagent(type) to_chat(H, "You've become \a [lowertext(initial(species_type.name))]!") + return ..() /datum/reagent/mutationtoxin/classic //The one from plasma on green slimes @@ -480,10 +545,12 @@ /datum/species/lizard, /datum/species/fly, /datum/species/moth, + /datum/species/apid, /datum/species/pod, /datum/species/jelly, /datum/species/abductor, - /datum/species/squid) + /datum/species/squid, + /datum/species/skeleton) can_synth = TRUE /datum/reagent/mutationtoxin/felinid @@ -513,6 +580,13 @@ race = /datum/species/moth taste_description = "clothing" +/datum/reagent/mutationtoxin/apid + name = "Apid Mutation Toxin" + description = "A sweet-smelling toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/apid + taste_description = "honey" + /datum/reagent/mutationtoxin/pod name = "Podperson Mutation Toxin" description = "A vegetalizing toxin." @@ -571,6 +645,13 @@ race = /datum/species/ipc taste_description = "silicon and copper" +/datum/reagent/mutationtoxin/ethereal + name = "Ethereal Mutation Toxin" + description = "A positively electric toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/ethereal + taste_description = "shocking" + /datum/reagent/mutationtoxin/squid name = "Squid Mutation Toxin" description = "A salty toxin." @@ -578,6 +659,13 @@ race = /datum/species/squid taste_description = "fish" +/datum/reagent/mutationtoxin/oozeling + name = "Oozeling Mutation Toxin" + description = "An oozing toxin" + color = "#611e80" //RGB: 97, 30, 128 + race = /datum/species/oozeling + taste_description = "burning ooze" + //BLACKLISTED RACES /datum/reagent/mutationtoxin/skeleton name = "Skeleton Mutation Toxin" @@ -658,6 +746,7 @@ description = "An advanced corruptive toxin produced by slimes." color = "#13BC5E" // rgb: 19, 188, 94 taste_description = "slime" + can_synth = FALSE //idedplznerf /datum/reagent/aslimetoxin/reaction_mob(mob/living/L, method=TOUCH, reac_volume) if(method != TOUCH) @@ -846,7 +935,7 @@ random_unrestricted = FALSE /datum/reagent/lithium/on_mob_life(mob/living/carbon/M) - if((M.mobility_flags & MOBILITY_MOVE) && !isspaceturf(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !isspaceturf(M.loc) && isturf(M.loc)) step(M, pick(GLOB.cardinals)) if(prob(5)) M.emote(pick("twitch","drool","moan")) @@ -868,8 +957,8 @@ if(method in list(TOUCH, VAPOR, PATCH)) for(var/s in C.surgeries) var/datum/surgery/S = s - S.success_multiplier = max(0.2, S.success_multiplier) - // +20% success propability on each step, useful while operating in less-than-perfect conditions + S.speed_modifier = max(0.2, S.speed_modifier) + // +20% surgery speed on each step, useful while operating in less-than-perfect conditions ..() /datum/reagent/iron @@ -1765,22 +1854,22 @@ 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 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 @@ -1788,7 +1877,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() ..() @@ -1868,47 +1958,6 @@ changeling.chem_charges = max(changeling.chem_charges-2, 0) return ..() -/datum/reagent/concentrated_bz - name = "Concentrated BZ" - description = "A hyperconcentrated liquid form of BZ gas, known to cause an extremely adverse reaction to changelings. Also causes minor brain damage." - color = "#FAFF00" - taste_description = "acrid cinnamon" - random_unrestricted = FALSE - -/datum/reagent/concentrated_bz/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, CHANGELING_HIVEMIND_MUTE, type) - -/datum/reagent/concentrated_bz/on_mob_end_metabolize(mob/living/L) - ..() - REMOVE_TRAIT(L, CHANGELING_HIVEMIND_MUTE, type) - -/datum/reagent/concentrated_bz/on_mob_life(mob/living/L) - if(L.mind) - var/datum/antagonist/changeling/changeling = L.mind.has_antag_datum(/datum/antagonist/changeling) - if(changeling) - changeling.chem_charges = max(changeling.chem_charges-2, 0) - if(prob(30)) - L.losebreath += 1 - L.adjustOxyLoss(3,5) - L.emote("gasp") - to_chat(L, "You can't breathe!") - - L.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 50) - return ..() - -/datum/reagent/fake_cbz - name = "Concentrated BZ" - description = "A hyperconcentrated liquid form of BZ gas, known to cause an extremely adverse reaction to changelings. Also causes minor brain damage." - color = "#FAFF00" - taste_description = "acrid cinnamon" - random_unrestricted = FALSE - -/datum/reagent/fake_cbz/on_mob_life(mob/living/L) - L.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 50) - if(prob(15)) - to_chat(L, "You don't feel much of anything") - /datum/reagent/pax/peaceborg name = "Synthpax" description = "A colorless liquid that suppresses violent urges in its subjects. Cheaper to synthesize than normal Pax, but wears off faster." diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 019f037c0cc60..ee8771e0de355 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -58,7 +58,7 @@ else if(prob(reac_volume)) F.burn_tile() if(isfloorturf(F)) - for(var/turf/turf in range(1,F)) + for(var/turf/open/turf in RANGE_TURFS(1,F)) if(!locate(/obj/effect/hotspot) in turf) new /obj/effect/hotspot(F) if(iswallturf(T)) @@ -245,6 +245,28 @@ L.extract_cooldown = max(0, L.extract_cooldown - 20) ..() +/datum/reagent/teslium/energized_jelly/energized_ooze + name = "Energized Ooze" + description = "Electrically-charged Ooze. Boosts Oozeling's nervous system, but only shocks other lifeforms." + reagent_state = LIQUID + color = "#CAFF43" + taste_description = "slime" + overdose_threshold = 30 + +/datum/reagent/teslium/energized_jelly/energized_ooze/on_mob_life(mob/living/carbon/M) + if(isoozeling(M)) + shock_timer = 0 //immune to shocks + M.AdjustAllImmobility(-40, FALSE) + M.adjustStaminaLoss(-2, 0) + ..() + +/datum/reagent/teslium/energized_jelly/energized_ooze/overdose_process(mob/living/carbon/M) + if(isoozeling(M) || isjellyperson(M)) + if(prob(25)) + M.electrocute_act(rand(5,20), "Energized Jelly overdose in their body", 1, 1) //Override because it's caused from INSIDE of you + playsound(M, "sparks", 50, 1) + ..() + /datum/reagent/firefighting_foam name = "Firefighting Foam" description = "A historical fire suppressant. Originally believed to simply displace oxygen to starve fires, it actually interferes with the combustion reaction itself. Vastly superior to the cheap water-based extinguishers found on NT vessels." diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index be837a4ddaf94..b140b4fd7214c 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -53,7 +53,7 @@ /datum/reagent/toxin/plasma name = "Plasma" description = "Plasma in its liquid form." - taste_description = "bitterness" + taste_description = "a burning, tingling sensation" specific_heat = SPECIFIC_HEAT_PLASMA taste_mult = 1.5 color = "#8228A0" @@ -122,6 +122,24 @@ . = 1 ..() +/datum/reagent/toxin/slimeooze + name = "Slime Ooze" + description = "A gooey semi-liquid produced from Oozelings" + color = "#611e80" + toxpwr = 0 + taste_description = "slime" + taste_mult = 1.5 + +/datum/reagent/toxin/slimeooze/on_mob_life(mob/living/carbon/M) + if(prob(10)) + to_chat(M, "Your insides are burning!") + M.adjustToxLoss(rand(1,10)*REM, 0) + . = 1 + else if(prob(40)) + M.heal_bodypart_damage(5*REM) + . = 1 + ..() + /datum/reagent/toxin/minttoxin name = "Mint Toxin" description = "Useful for dealing with undesirable customers." @@ -130,7 +148,7 @@ taste_description = "mint" /datum/reagent/toxin/minttoxin/on_mob_life(mob/living/carbon/M) - if(HAS_TRAIT(M, TRAIT_FAT)) + if(HAS_TRAIT_FROM(M, TRAIT_FAT, OBESITY)) M.gib() return ..() @@ -153,22 +171,20 @@ silent_toxin = TRUE reagent_state = SOLID color = "#669900" // rgb: 102, 153, 0 - toxpwr = 0.5 + toxpwr = 0 taste_description = "death" -/datum/reagent/toxin/zombiepowder/on_mob_metabolize(mob/living/L) +/datum/reagent/toxin/zombiepowder/on_mob_life(mob/living/carbon/M) + if(current_cycle >= 10) // delayed activation for toxin + M.adjustStaminaLoss((current_cycle - 5)*REM, 0) + if(M.getStaminaLoss() >= 145) // fake death tied to stamina for interesting interactions - 23 ticks to fake death with pure ZP + M.fakedeath(type) ..() - L.fakedeath(type) /datum/reagent/toxin/zombiepowder/on_mob_end_metabolize(mob/living/L) L.cure_fakedeath(type) ..() -/datum/reagent/toxin/zombiepowder/on_mob_life(mob/living/carbon/M) - M.adjustOxyLoss(0.5*REM, 0) - ..() - . = 1 - /datum/reagent/toxin/ghoulpowder name = "Ghoul Powder" description = "A strong neurotoxin that slows metabolism to a death-like state while keeping the patient fully active. Causes toxin buildup if used too long." @@ -485,7 +501,7 @@ /datum/reagent/toxin/itching_powder/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) - M.reagents.add_reagent(/datum/reagent/toxin/itching_powder, reac_volume) + M.reagents?.add_reagent(/datum/reagent/toxin/itching_powder, reac_volume) /datum/reagent/toxin/itching_powder/on_mob_life(mob/living/carbon/M) if(prob(15)) @@ -594,7 +610,7 @@ toxpwr = 0 metabolization_rate = 0.5 * REAGENTS_METABOLISM -/datum/reagent/toxin/amanitin/on_mob_end_metabolize(mob/living/M) +/datum/reagent/toxin/amanitin/on_mob_delete(mob/living/M) var/toxdamage = current_cycle*3*REM M.log_message("has taken [toxdamage] toxin damage from amanitin toxin", LOG_ATTACK) M.adjustToxLoss(toxdamage) @@ -701,57 +717,20 @@ /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/atom/movable/plane_master_controller/pm_controller = M.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] 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) + for(var/key in pm_controller.controlled_planes) + animate(pm_controller.controlled_planes[key], transform = matrix(rotation, MATRIX_ROTATE), time = 5, easing = QUAD_EASING, loop = -1) animate(transform = matrix(-rotation, MATRIX_ROTATE), time = 5, easing = QUAD_EASING) return ..() /datum/reagent/toxin/rotatium/on_mob_end_metabolize(mob/living/M) - if(M && M.hud_used) - 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]"]) - for(var/whole_screen in screens) - animate(whole_screen, transform = matrix(), time = 5, easing = QUAD_EASING) - ..() - -/datum/reagent/toxin/skewium - name = "Skewium" - description = "A strange, dull coloured liquid that appears to warp back and forth inside its container. Causes any consumer to experience a visual phenomena similar to said warping." - silent_toxin = TRUE - reagent_state = LIQUID - color = "#ADBDCD" - metabolization_rate = 0.8 * REAGENTS_METABOLISM - toxpwr = 0.25 - taste_description = "skewing" - process_flags = ORGANIC | SYNTHETIC - -/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/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) - animate(whole_screen, transform = newmatrix, time = 5, easing = QUAD_EASING, loop = -1) - animate(transform = -newmatrix, time = 5, easing = QUAD_EASING) - return ..() - -/datum/reagent/toxin/skewium/on_mob_end_metabolize(mob/living/M) if(M?.hud_used) - 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]"]) - for(var/whole_screen in screens) - animate(whole_screen, transform = matrix(), time = 5, easing = QUAD_EASING) + var/atom/movable/plane_master_controller/pm_controller = M.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] + for(var/key in pm_controller.controlled_planes) + animate(pm_controller.controlled_planes[key], transform = matrix(), time = 5, easing = QUAD_EASING) ..() - /datum/reagent/toxin/anacea name = "Anacea" description = "A toxin that quickly purges medicines and metabolizes very slowly." @@ -892,7 +871,7 @@ if(M.dna.species.type != /datum/species/skeleton && M.dna.species.type != /datum/species/plasmaman) //We're so sorry skeletons, you're so misunderstood if(bp) bp.receive_damage(0, 0, 200) - playsound(M, get_sfx("desceration"), 50, TRUE, -1) + playsound(M, get_sfx("desecration"), 50, TRUE, -1) M.visible_message("[M]'s bones hurt too much!!", "Your bones hurt too much!!") M.say("OOF!!", forced = /datum/reagent/toxin/bonehurtingjuice) else //SUCH A LUST FOR REVENGE!!! @@ -900,7 +879,7 @@ M.say("Why are we still here, just to suffer?", forced = /datum/reagent/toxin/bonehurtingjuice) else //you just want to socialize if(bp) - playsound(M, get_sfx("desceration"), 50, TRUE, -1) + playsound(M, get_sfx("desecration"), 50, TRUE, -1) M.visible_message("[M] rattles loudly and flails around!!", "Your bones hurt so much that your missing muscles spasm!!") M.say("OOF!!", forced=/datum/reagent/toxin/bonehurtingjuice) bp.receive_damage(200, 0, 0) //But I don't think we should diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 4fbadcfa833d2..0b75cdf59abad 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -38,7 +38,7 @@ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) + for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom))) C.flash_act() for(var/i in 1 to amount_to_spawn) diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index 7049c3da0eacc..d60c0da423cbe 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -47,3 +47,10 @@ results = list(/datum/reagent/drug/happiness = 4) required_reagents = list(/datum/reagent/nitrous_oxide = 2, /datum/reagent/medicine/epinephrine = 1, /datum/reagent/consumable/ethanol = 1) required_catalysts = list(/datum/reagent/toxin/plasma = 5) + +/datum/chemical_reaction/ketamine + name = "Ketamine" + id = /datum/reagent/drug/ketamine + results = list(/datum/reagent/drug/ketamine = 3) + required_reagents = list(/datum/reagent/medicine/morphine = 3, /datum/reagent/toxin/chloralhydrate = 3, /datum/reagent/toxin/fentanyl = 3, /datum/reagent/medicine/epinephrine =3) + required_temp = 370 diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 0cd71d14cf3a1..13ff092528afe 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -219,7 +219,7 @@ name = "Dexalin" id = "dexalin" results = list(/datum/reagent/medicine/dexalin = 5) - required_reagents = list(/datum/reagent/oxygen = 5) + required_reagents = list(/datum/reagent/oxygen = 5, /datum/reagent/nitrogen = 5) required_catalysts = list(/datum/reagent/toxin/plasma = 5) /datum/chemical_reaction/dexalinp @@ -252,6 +252,12 @@ results = list(/datum/reagent/medicine/regen_jelly = 2) required_reagents = list(/datum/reagent/medicine/tricordrazine = 1, /datum/reagent/toxin/slimejelly = 1) +/datum/chemical_reaction/regen_ooze + name = "Regenerative Ooze" + id = /datum/reagent/medicine/regen_ooze + results = list(/datum/reagent/medicine/regen_ooze = 2) + required_reagents = list(/datum/reagent/medicine/tricordrazine = 1, /datum/reagent/toxin/slimeooze = 1) + /datum/chemical_reaction/corazone name = "Corazone" id = /datum/reagent/medicine/corazone @@ -305,3 +311,10 @@ results = list(/datum/reagent/medicine/hepanephrodaxon = 5) required_reagents = list(/datum/reagent/medicine/carthatoline = 2, /datum/reagent/carbon = 2, /datum/reagent/lithium = 1) required_catalysts = list(/datum/reagent/toxin/plasma = 5) + +/datum/chemical_reaction/liquidelectricity + name = "Liquid Electricity" + id = /datum/reagent/consumable/liquidelectricity + results = list(/datum/reagent/consumable/liquidelectricity = 3) + required_reagents = list(/datum/reagent/consumable/ethanol = 3, /datum/reagent/consumable/liquidelectricity = 1, /datum/reagent/toxin/plasma = 1) + mix_message = "The mixture sparks and then subsides." \ No newline at end of file diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 53b9a50e754e1..71426d8833381 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -37,18 +37,6 @@ results = list(/datum/reagent/impedrezene = 2) required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1) -/datum/chemical_reaction/concentrated_bz - name = "Concentrated BZ" - id = "Concentrated BZ" - results = list(/datum/reagent/concentrated_bz = 10) - required_reagents = list(/datum/reagent/toxin/plasma = 40, /datum/reagent/nitrous_oxide = 10) - -/datum/chemical_reaction/fake_cbz - name = "Fake CBZ" - id = "Fake CBZ" - results = list(/datum/reagent/fake_cbz = 1) - required_reagents = list(/datum/reagent/concentrated_bz = 1, /datum/reagent/medicine/neurine = 3) - /datum/chemical_reaction/cryptobiolin name = "Cryptobiolin" id = /datum/reagent/cryptobiolin @@ -434,7 +422,7 @@ /datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) - for(var/mob/M in viewers(5, location)) + for(var/mob/M as() in viewers(5, location)) to_chat(M, "The solution spews out foam!") var/datum/effect_system/foam_spread/s = new() s.set_up(created_volume*2, location, holder) @@ -452,7 +440,7 @@ /datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) - for(var/mob/M in viewers(5, location)) + for(var/mob/M as() in viewers(5, location)) to_chat(M, "The solution spews out a metallic foam!") var/datum/effect_system/foam_spread/metal/s = new() @@ -482,7 +470,7 @@ /datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) - for(var/mob/M in viewers(5, location)) + for(var/mob/M as() in viewers(5, location)) to_chat(M, "The solution spews out a metallic foam!") var/datum/effect_system/foam_spread/metal/s = new() s.set_up(created_volume*5, location, holder, 2) @@ -608,12 +596,15 @@ name = "corgium" id = "corgium" required_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/blood = 1) - required_temp = 374 /datum/chemical_reaction/corgium/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i = rand(1, created_volume), i <= created_volume, i++) // More lulz. - new /mob/living/simple_animal/pet/dog/corgi(location) + if(isliving(holder.my_atom) && !iscorgi(holder.my_atom)) + var/mob/living/L = holder + L.reagents.add_reagent(/datum/reagent/corgium, created_volume) + else + var/location = get_turf(holder.my_atom) + for(var/i in rand(1, created_volume) to created_volume) // More lulz. + new /mob/living/simple_animal/pet/dog/corgi(location) ..() /datum/chemical_reaction/hair_dye @@ -714,6 +705,12 @@ results = list(/datum/reagent/mutationtoxin/moth = 5) required_reagents = list(/datum/reagent/mutationtoxin/unstable = 5, /datum/reagent/toxin/lipolicide = 10) //I know it's the opposite of what moths like, but I am out of ideas for this. +/datum/chemical_reaction/mutationtoxin/apid + name = /datum/reagent/mutationtoxin/apid + id = /datum/reagent/mutationtoxin/apid + results = list(/datum/reagent/mutationtoxin/apid = 5) + required_reagents = list(/datum/reagent/mutationtoxin/unstable = 5, /datum/reagent/consumable/honey = 20) // beeeeeeeeeeeeeeeeeeeeees + /datum/chemical_reaction/mutationtoxin/pod name = /datum/reagent/mutationtoxin/pod id = /datum/reagent/mutationtoxin/pod @@ -736,15 +733,27 @@ name = /datum/reagent/mutationtoxin/squid id = /datum/reagent/mutationtoxin/squid results = list(/datum/reagent/mutationtoxin/squid = 5) - required_reagents = list(/datum/reagent/mutationtoxin/unstable = 5, /datum/reagent/teslium = 20) + required_reagents = list(/datum/reagent/mutationtoxin/unstable = 5, /datum/reagent/consumable/sodiumchloride = 10, /datum/reagent/water = 20) /datum/chemical_reaction/mutationtoxin/ipc name = /datum/reagent/mutationtoxin/ipc id = /datum/reagent/mutationtoxin/ipc results = list(/datum/reagent/mutationtoxin/ipc = 5) - required_reagents = list(/datum/reagent/mutationtoxin/unstable = 5, /datum/reagent/consumable/sodiumchloride = 10, /datum/reagent/water = 20) - -//////////////Mutatuion toxins made out of advanced toxin///////////// + required_reagents = list(/datum/reagent/mutationtoxin/unstable = 5, /datum/reagent/teslium = 20) + +/datum/chemical_reaction/mutationtoxin/ethereal + name = /datum/reagent/mutationtoxin/ethereal + id = /datum/reagent/mutationtoxin/ethereal + results = list(/datum/reagent/mutationtoxin/ethereal = 5) + required_reagents = list(/datum/reagent/mutationtoxin/unstable = 5, /datum/reagent/consumable/liquidelectricity = 20) + +/datum/chemical_reaction/mutationtoxin/oozeling + name = /datum/reagent/mutationtoxin/oozeling + id = /datum/reagent/mutationtoxin/oozeling + results = list(/datum/reagent/mutationtoxin/oozeling = 5) + required_reagents = list(/datum/reagent/mutationtoxin/unstable = 5, /datum/reagent/medicine/calomel = 10, /datum/reagent/toxin/bad_food = 30, /datum/reagent/stable_plasma = 5) + +//////////////Mutation toxins made out of advanced toxin///////////// /datum/chemical_reaction/mutationtoxin/skeleton name = /datum/reagent/mutationtoxin/skeleton diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index f331563daccc8..160372886a7a2 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -5,6 +5,9 @@ var/modifier = 0 /datum/chemical_reaction/reagent_explosion/on_reaction(datum/reagents/holder, created_volume) + explode(holder, created_volume) + +/datum/chemical_reaction/reagent_explosion/proc/explode(datum/reagents/holder, created_volume) var/power = modifier + round(created_volume/strengthdiv, 1) if(power > 0) var/turf/T = get_turf(holder.my_atom) @@ -12,10 +15,10 @@ if(ismob(holder.my_atom)) var/mob/M = holder.my_atom inside_msg = " inside [ADMIN_LOOKUPFLW(M)]" - var/lastkey = holder.my_atom.fingerprintslast + var/lastkey = holder.my_atom?.fingerprintslast var/touch_msg = "N/A" if(lastkey) - var/mob/toucher = get_mob_by_key(lastkey) + var/mob/toucher = get_mob_by_ckey(lastkey) touch_msg = "[ADMIN_LOOKUPFLW(toucher)]" if(!istype(holder.my_atom, /obj/machinery/plumbing)) //excludes standard plumbing equipment from spamming admins with this shit message_admins("Reagent explosion reaction occurred at [ADMIN_VERBOSEJMP(T)][inside_msg]. Last Fingerprint: [touch_msg].") @@ -62,25 +65,22 @@ if(created_volume >= 150) playsound(get_turf(holder.my_atom), 'sound/effects/pray.ogg', 80, 0, round(created_volume/48)) strengthdiv = 8 - for(var/mob/living/simple_animal/revenant/R in get_hearers_in_view(7,get_turf(holder.my_atom))) - var/deity - if(GLOB.deity) - deity = GLOB.deity - else - deity = "Christ" + for(var/mob/living/simple_animal/revenant/R in hearers(7,get_turf(holder.my_atom))) + var/deity = GLOB.deity || "Christ" to_chat(R, "The power of [deity] compels you!") R.stun(20) R.reveal(100) R.adjustHealth(50) - sleep(20) - for(var/mob/living/carbon/C in get_hearers_in_view(round(created_volume/48,1),get_turf(holder.my_atom))) - if(iscultist(C)) - to_chat(C, "The divine explosion sears you!") - C.Paralyze(40) - C.adjust_fire_stacks(5) - C.IgniteMob() + addtimer(CALLBACK(src, .proc/divine_explosion, round(created_volume/48,1),get_turf(holder.my_atom)), 2 SECONDS) ..() +/datum/chemical_reaction/reagent_explosion/potassium_explosion/holyboom/proc/divine_explosion(size, turf/T) + for(var/mob/living/carbon/C in hearers(size,T)) + if(iscultist(C)) + to_chat(C, "The divine explosion sears you!") + C.Paralyze(40) + C.adjust_fire_stacks(5) + C.IgniteMob() /datum/chemical_reaction/blackpowder name = "Black Powder" @@ -98,8 +98,7 @@ mix_message = "Sparks start flying around the black powder!" /datum/chemical_reaction/reagent_explosion/blackpowder_explosion/on_reaction(datum/reagents/holder, created_volume) - sleep(rand(50,100)) - ..() + addtimer(CALLBACK(src, .proc/explode, holder, created_volume), rand(50,100)) /datum/chemical_reaction/thermite name = "Thermite" @@ -158,8 +157,9 @@ /datum/chemical_reaction/clf3/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) - for(var/turf/turf in range(1,T)) - new /obj/effect/hotspot(turf) + for(var/turf/open/turf in RANGE_TURFS(1,T)) + if(!locate(/obj/effect/hotspot) in turf) + new /obj/effect/hotspot(turf) holder.chem_temp = 1000 // hot as shit /datum/chemical_reaction/reagent_explosion/methsplosion @@ -173,8 +173,9 @@ /datum/chemical_reaction/reagent_explosion/methsplosion/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) - for(var/turf/turf in range(1,T)) - new /obj/effect/hotspot(turf) + for(var/turf/open/turf in RANGE_TURFS(1,T)) + if(!locate(/obj/effect/hotspot) in turf) + new /obj/effect/hotspot(turf) holder.chem_temp = 1000 // hot as shit ..() @@ -248,7 +249,7 @@ if(isatom(holder.my_atom)) var/atom/A = holder.my_atom A.flash_lighting_fx(_range = (range + 2), _reset_lighting = FALSE) - for(var/mob/living/carbon/C in get_hearers_in_view(range, location)) + for(var/mob/living/carbon/C in hearers(range, location)) if(C.flash_act()) if(get_dist(C, location) < 4) C.Paralyze(60) @@ -269,7 +270,7 @@ if(isatom(holder.my_atom)) var/atom/A = holder.my_atom A.flash_lighting_fx(_range = (range + 2), _reset_lighting = FALSE) - for(var/mob/living/carbon/C in get_hearers_in_view(range, location)) + for(var/mob/living/carbon/C in hearers(range, location)) if(C.flash_act()) if(get_dist(C, location) < 4) C.Paralyze(60) @@ -328,7 +329,7 @@ holder.remove_reagent(/datum/reagent/sonic_powder, created_volume*3) var/location = get_turf(holder.my_atom) playsound(location, 'sound/effects/bang.ogg', 25, 1) - for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/3, location)) + for(var/mob/living/carbon/C in hearers(created_volume/3, location)) C.soundbang_act(1, 100, rand(0, 5)) /datum/chemical_reaction/sonic_powder_deafen @@ -340,7 +341,7 @@ /datum/chemical_reaction/sonic_powder_deafen/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) playsound(location, 'sound/effects/bang.ogg', 25, 1) - for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) + for(var/mob/living/carbon/C in hearers(created_volume/10, location)) C.soundbang_act(1, 100, rand(0, 5)) /datum/chemical_reaction/phlogiston @@ -419,6 +420,13 @@ required_reagents = list(/datum/reagent/toxin/slimejelly = 1, /datum/reagent/teslium = 1) mix_message = "The slime jelly starts glowing intermittently." +/datum/chemical_reaction/energized_jelly/energized_ooze + name = "Energized Ooze" + id = /datum/reagent/teslium/energized_jelly/energized_ooze + results = list(/datum/reagent/teslium/energized_jelly/energized_ooze = 2) + required_reagents = list(/datum/reagent/toxin/slimeooze = 1, /datum/reagent/teslium = 1) + mix_message = "The slime ooze starts glowing intermittently." + /datum/chemical_reaction/reagent_explosion/teslium_lightning name = "Teslium Destabilization" id = "teslium_lightning" @@ -433,19 +441,22 @@ var/T1 = created_volume * 20 //100 units : Zap 3 times, with powers 2000/5000/12000. Tesla revolvers have a power of 10000 for comparison. var/T2 = created_volume * 50 var/T3 = created_volume * 120 - sleep(5) + var/added_delay = 0.5 SECONDS if(created_volume >= 75) - tesla_zap(holder.my_atom, 7, T1, tesla_flags) - playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, 1) - sleep(15) + addtimer(CALLBACK(src, .proc/zappy_zappy, holder, T1), added_delay) + added_delay += 1.5 SECONDS if(created_volume >= 40) - tesla_zap(holder.my_atom, 7, T2, tesla_flags) - playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, 1) - sleep(15) + addtimer(CALLBACK(src, .proc/zappy_zappy, holder, T2), added_delay) + added_delay += 1.5 SECONDS if(created_volume >= 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) - playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, 1) - ..() + addtimer(CALLBACK(src, .proc/zappy_zappy, holder, T3), added_delay) + addtimer(CALLBACK(src, .proc/explode, holder, created_volume), added_delay) + +/datum/chemical_reaction/reagent_explosion/teslium_lightning/proc/zappy_zappy(datum/reagents/holder, power) + if(QDELETED(holder.my_atom)) + return + tesla_zap(holder.my_atom, 7, power, tesla_flags) + playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, TRUE) /datum/chemical_reaction/reagent_explosion/teslium_lightning/heat id = "teslium_lightning2" diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 22592fddc4bbc..59aa13f945b14 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -3,6 +3,9 @@ var/deletes_extract = TRUE /datum/chemical_reaction/slime/on_reaction(datum/reagents/holder) + use_slime_core(holder) + +/datum/chemical_reaction/slime/proc/use_slime_core(datum/reagents/holder) SSblackbox.record_feedback("tally", "slime_cores_used", 1, "type") if(deletes_extract) delete_extract(holder) @@ -153,7 +156,7 @@ playsound(T, 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/C in viewers(T, null)) + for(var/mob/living/carbon/C in viewers(T)) C.flash_act() for(var/i in 1 to 4 + rand(1,2)) @@ -230,8 +233,7 @@ if(holder && holder.my_atom) var/turf/open/T = get_turf(holder.my_atom) if(istype(T)) - var/datum/gas/gastype = /datum/gas/nitrogen - T.atmos_spawn_air("[initial(gastype.id)]=50;TEMP=2.7") + T.atmos_spawn_air("n2=50;TEMP=2.7") /datum/chemical_reaction/slime/slimefireproof name = "Slime Fireproof" @@ -298,7 +300,7 @@ ..() /datum/chemical_reaction/slime/slimecell - name = "Slime Powercell" + name = "Slime Power Cell" id = "m_cell" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/yellow @@ -373,7 +375,7 @@ required_other = TRUE /datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder) - for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) + for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom))) if(slime.docile) //Undoes docility, but doesn't make rabid. slime.visible_message("[slime] forgets its training, becoming wild once again!") slime.docile = FALSE @@ -440,7 +442,7 @@ var/lastkey = holder.my_atom.fingerprintslast var/touch_msg = "N/A" if(lastkey) - var/mob/toucher = get_mob_by_key(lastkey) + var/mob/toucher = get_mob_by_ckey(lastkey) touch_msg = "[ADMIN_LOOKUPFLW(toucher)]." message_admins("Slime Explosion reaction started at [ADMIN_VERBOSEJMP(T)]. Last Fingerprint: [touch_msg]") log_game("Slime Explosion reaction started at [AREACOORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"].") @@ -568,17 +570,19 @@ required_other = TRUE /datum/chemical_reaction/slime/slimestop/on_reaction(datum/reagents/holder) - sleep(50) + addtimer(CALLBACK(src, .proc/slime_stop, holder), 5 SECONDS) + +/datum/chemical_reaction/slime/slimestop/proc/slime_stop(datum/reagents/holder) var/obj/item/slime_extract/sepia/extract = holder.my_atom var/turf/T = get_turf(holder.my_atom) new /obj/effect/timestop(T, null, null, null) if(istype(extract)) if(extract.Uses > 0) - var/mob/lastheld = get_mob_by_key(holder.my_atom.fingerprintslast) - if(lastheld && !lastheld.equip_to_slot_if_possible(extract, SLOT_HANDS, disable_warning = TRUE)) + var/mob/lastheld = get_mob_by_ckey(holder.my_atom.fingerprintslast) + if(lastheld && !lastheld.equip_to_slot_if_possible(extract, ITEM_SLOT_HANDS, disable_warning = TRUE)) extract.forceMove(get_turf(lastheld)) - ..() + use_slime_core(holder) /datum/chemical_reaction/slime/slimecamera name = "Slime Camera" diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm index 709bd47ed7ad4..a44f227dac6c4 100644 --- a/code/modules/reagents/chemistry/recipes/toxins.dm +++ b/code/modules/reagents/chemistry/recipes/toxins.dm @@ -101,13 +101,6 @@ required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/teslium = 1, /datum/reagent/toxin/fentanyl = 1) mix_message = "After sparks, fire, and the smell of mindbreaker, the mix is constantly spinning with no stop in sight." -/datum/chemical_reaction/skewium - name = "Skewium" - id = "Skewium" - results = list(/datum/reagent/toxin/skewium = 5) - required_reagents = list(/datum/reagent/toxin/rotatium = 2, /datum/reagent/toxin/plasma = 2, /datum/reagent/toxin/acid = 1) - mix_message = "Wow! it turns out if you mix rotatium with some plasma and sulphuric acid, it gets even worse!" - /datum/chemical_reaction/anacea name = "Anacea" id = /datum/reagent/toxin/anacea diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index ae40640df6418..683e9e5477254 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -42,7 +42,7 @@ amount_per_transfer_from_this = possible_transfer_amounts[i+1] else amount_per_transfer_from_this = possible_transfer_amounts[1] - to_chat(user, "[src]'s transfer amount is now [amount_per_transfer_from_this] units.") + balloon_alert(user, "Transferring [amount_per_transfer_from_this]u") return /obj/item/reagent_containers/attack(mob/M, mob/user, def_zone) @@ -51,24 +51,24 @@ /obj/item/reagent_containers/proc/canconsume(mob/eater, mob/user) if(!iscarbon(eater)) - return 0 + return FALSE var/mob/living/carbon/C = eater var/covered = "" if(C.is_mouth_covered(head_only = 1)) covered = "headgear" else if(C.is_mouth_covered(mask_only = 1)) covered = "mask" - if(covered) + if(covered && user.a_intent != INTENT_HARM) var/who = (isnull(user) || eater == user) ? "your" : "[eater.p_their()]" - to_chat(user, "You have to remove [who] [covered] first!") - return 0 + balloon_alert(user, "Remove [who] [covered] first") + return FALSE if(!eater.has_mouth()) if(eater == user) - to_chat(eater, "You have no mouth, and cannot eat.") + balloon_alert(eater, "You have no mouth") else - to_chat(user, "You can't feed [eater], because they have no mouth!") - return 0 - return 1 + balloon_alert(user, "[eater] has no mouth") + return FALSE + return TRUE /obj/item/reagent_containers/ex_act() if(reagents) @@ -87,12 +87,14 @@ /obj/item/reagent_containers/proc/bartender_check(atom/target) . = FALSE - if(target.CanPass(src, get_turf(src)) && thrownby && HAS_TRAIT(thrownby, TRAIT_BOOZE_SLIDER)) + var/mob/thrown_by = thrownby?.resolve() + if(target.CanPass(src, get_turf(src)) && thrown_by && HAS_TRAIT(thrown_by, TRAIT_BOOZE_SLIDER)) . = TRUE /obj/item/reagent_containers/proc/SplashReagents(atom/target, thrown = FALSE) if(!reagents || !reagents.total_volume || !spillable) return + var/mob/thrown_by = thrownby?.resolve() if(ismob(target) && target.reagents) if(thrown) @@ -105,7 +107,7 @@ R += "[A.type] ([num2text(A.volume)])," if(thrownby) - log_combat(thrownby, M, "splashed", R) + log_combat(thrown_by, M, "splashed", R) reagents.reaction(target, TOUCH) else if(bartender_check(target) && thrown) @@ -113,10 +115,10 @@ return else - if(isturf(target) && reagents.reagent_list.len && thrownby) - log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]", "in [AREACOORD(target)]") - log_game("[key_name(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [AREACOORD(target)].") - message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [ADMIN_VERBOSEJMP(target)].") + if(isturf(target) && reagents.reagent_list.len && thrown_by) + log_combat(thrown_by, target, "splashed (thrown) [english_list(reagents.reagent_list)]", "in [AREACOORD(target)]") + log_game("[key_name(thrown_by)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [AREACOORD(target)].") + message_admins("[ADMIN_LOOKUPFLW(thrown_by)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [ADMIN_VERBOSEJMP(target)].") visible_message("[src] spills its contents all over [target].") reagents.reaction(target, TOUCH) if(QDELETED(src)) diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 80efeaa2a5fa5..3a686b7695802 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -12,7 +12,7 @@ /obj/item/reagent_containers/blood/Initialize() . = ..() if(blood_type != null) - reagents.add_reagent(unique_blood ? unique_blood : /datum/reagent/blood, 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) + reagents.add_reagent(unique_blood ? unique_blood : /datum/reagent/blood, 200, list("viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) update_icon() /obj/item/reagent_containers/blood/on_reagent_change(changetype) @@ -67,6 +67,12 @@ blood_type = "LE" unique_blood = /datum/reagent/consumable/liquidelectricity +/obj/item/reagent_containers/blood/oozeling + labelled = 1 + name = "blood pack - OZ" + blood_type = "OZ" + unique_blood = /datum/reagent/toxin/slimeooze + /obj/item/reagent_containers/blood/universal blood_type = "U" diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 7a70fe34c166d..7011be0db7b24 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -21,8 +21,8 @@ Borg Hypospray possible_transfer_amounts = list() var/mode = 1 var/charge_cost = 50 - var/charge_tick = 0 - var/recharge_time = 5 //Time it takes for shots to recharge (in seconds) + var/charge_timer = 0 + var/recharge_time = 10 //Time it takes for shots to recharge (in seconds) var/bypass_protection = 0 //If the hypospray can go through armor or thick material var/list/datum/reagents/reagent_list = list() @@ -44,14 +44,14 @@ Borg Hypospray /obj/item/reagent_containers/borghypo/Destroy() STOP_PROCESSING(SSobj, src) + QDEL_LIST(reagent_list) return ..() - -/obj/item/reagent_containers/borghypo/process() //Every [recharge_time] seconds, recharge some reagents for the cyborg - charge_tick++ - if(charge_tick >= recharge_time) +/obj/item/reagent_containers/borghypo/process(delta_time) //Every [recharge_time] seconds, recharge some reagents for the cyborg + charge_timer += delta_time + if(charge_timer >= recharge_time) regenerate_reagents() - charge_tick = 0 + charge_timer = 0 //update_icon() return 1 @@ -181,6 +181,7 @@ Borg Shaker possible_transfer_amounts = list(5,10,20) charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster. recharge_time = 3 + volume = 50 accepts_reagent_upgrades = FALSE reagent_ids = list( @@ -197,7 +198,6 @@ Borg Shaker /datum/reagent/consumable/ethanol/vodka, /datum/reagent/consumable/ethanol/whiskey, /datum/reagent/consumable/ethanol/wine, - /datum/reagent/consumable/enzyme, /datum/reagent/consumable/banana, /datum/reagent/consumable/coffee, /datum/reagent/consumable/cream, diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index e97821fda6e79..3c6de5d7885f9 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -20,6 +20,21 @@ desc = "A small bottle. Contains epinephrine - used to stabilize patients." list_reagents = list(/datum/reagent/medicine/epinephrine = 30) +/obj/item/reagent_containers/glass/bottle/tricordrazine + name = "tricordrazine bottle" + desc = "A small bottle of tricordrazine. Used to aid in patient recovery." + list_reagents = list(/datum/reagent/medicine/tricordrazine = 30) + +/obj/item/reagent_containers/glass/bottle/spaceacillin + name = "spaceacillin bottle" + desc = "A small bottle of spaceacillin. Used to cure some diseases." + list_reagents = list(/datum/reagent/medicine/spaceacillin = 30) + +/obj/item/reagent_containers/glass/bottle/antitoxin + name = "antitoxin bottle" + desc = "A small bottle of anti-toxin. Used to treat toxin damage." + list_reagents = list(/datum/reagent/medicine/antitoxin = 30) + /obj/item/reagent_containers/glass/bottle/toxin name = "toxin bottle" desc = "A small bottle of toxins. Do not drink, it is poisonous." @@ -45,7 +60,7 @@ name = "chloral hydrate bottle" desc = "A small bottle of Choral Hydrate. Mickey's Favorite!" icon_state = "bottle20" - list_reagents = list(/datum/reagent/toxin/chloralhydrate = 15) + list_reagents = list(/datum/reagent/toxin/chloralhydrate = 30) /obj/item/reagent_containers/glass/bottle/mannitol name = "mannitol bottle" @@ -79,14 +94,9 @@ /obj/item/reagent_containers/glass/bottle/cryostylane name = "cryostylane bottle" - desc = "A small bottle of cryostylane. It feels cold to the touch" + desc = "A small bottle of cryostylane. It feels cold to the touch." list_reagents = list(/datum/reagent/cryostylane = 30) -/obj/item/reagent_containers/glass/bottle/concentrated_bz - name = "concentrated BZ bottle" - desc = "A small bottle of concentrated BZ" - list_reagents = list(/datum/reagent/concentrated_bz = 30) - /obj/item/reagent_containers/glass/bottle/ammonia name = "ammonia bottle" desc = "A small bottle of ammonia." @@ -206,9 +216,8 @@ list_reagents = list(/datum/reagent/medicine/potass_iodide = 30) /obj/item/reagent_containers/glass/bottle/salglu_solution - name = "saline-glucose solution bottle" - desc = "A small bottle of saline-glucose solution." - icon_state = "bottle1" + name = "saline-glucose bottle" + desc = "A small bottle of saline-glucose solution. Useful for patients lacking in blood volume." list_reagents = list(/datum/reagent/medicine/salglu_solution = 30) /obj/item/reagent_containers/glass/bottle/atropine @@ -306,7 +315,7 @@ /obj/item/reagent_containers/glass/bottle/felinid name = "Nano-Feline Assimilative Toxoplasmosis culture bottle" - desc = "A small bottle. Contains a sample of nano-feline toxoplasma in synthblood medium" + desc = "A small bottle. Contains a sample of nano-feline toxoplasma in synthblood medium." spawned_disease = /datum/disease/transformation/felinid/contagious //Oldstation.dmm chemical storage bottles diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index e9490b2569c90..1f928dd0a02bc 100755 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -37,14 +37,14 @@ reagents.clear_reagents() else if(M != user) - M.visible_message("[user] attempts to feed [M] something.", \ - "[user] attempts to feed you something.") + M.visible_message("[user] attempts to feed [M] something from [src].", \ + "[user] attempts to feed you something from [src].") if(!do_mob(user, M)) return if(!reagents || !reagents.total_volume) return // The drink might be empty after the delay, such as by spam-feeding - M.visible_message("[user] feeds [M] something.", \ - "[user] feeds you something.") + M.visible_message("[user] feeds [M] something from [src].", \ + "[user] feeds you something from [src].") log_combat(user, M, "fed", reagents.log_list()) else to_chat(user, "You swallow a gulp of [src].") @@ -230,16 +230,16 @@ flags_inv = HIDEHAIR slot_flags = ITEM_SLOT_HEAD resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 50) //Weak melee protection, because you can wear it on your head + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 50, "stamina" = 0) //Weak melee protection, because you can wear it on your head slot_equipment_priority = list( \ - SLOT_BACK, SLOT_WEAR_ID,\ - SLOT_W_UNIFORM, SLOT_WEAR_SUIT,\ - SLOT_WEAR_MASK, SLOT_HEAD, SLOT_NECK,\ - SLOT_SHOES, SLOT_GLOVES,\ - SLOT_EARS, SLOT_GLASSES,\ - SLOT_BELT, SLOT_S_STORE,\ - SLOT_L_STORE, SLOT_R_STORE,\ - SLOT_GENERC_DEXTROUS_STORAGE + ITEM_SLOT_BACK, ITEM_SLOT_ID,\ + ITEM_SLOT_ICLOTHING, ITEM_SLOT_OCLOTHING,\ + ITEM_SLOT_MASK, ITEM_SLOT_HEAD, ITEM_SLOT_NECK,\ + ITEM_SLOT_FEET, ITEM_SLOT_GLOVES,\ + ITEM_SLOT_EARS, ITEM_SLOT_EYES,\ + ITEM_SLOT_BELT, ITEM_SLOT_SUITSTORE,\ + ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET,\ + ITEM_SLOT_DEX_STORAGE ) /obj/item/reagent_containers/glass/bucket/attackby(obj/O, mob/user, params) @@ -260,7 +260,7 @@ /obj/item/reagent_containers/glass/bucket/equipped(mob/user, slot) ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) if(reagents.total_volume) to_chat(user, "[src]'s contents spill all over you!") reagents.reaction(user, TOUCH) @@ -273,10 +273,10 @@ /obj/item/reagent_containers/glass/bucket/equip_to_best_slot(var/mob/M) if(reagents.total_volume) //If there is water in a bucket, don't quick equip it to the head - var/index = slot_equipment_priority.Find(SLOT_HEAD) - slot_equipment_priority.Remove(SLOT_HEAD) + var/index = slot_equipment_priority.Find(ITEM_SLOT_HEAD) + slot_equipment_priority.Remove(ITEM_SLOT_HEAD) . = ..() - slot_equipment_priority.Insert(index, SLOT_HEAD) + slot_equipment_priority.Insert(index, ITEM_SLOT_HEAD) return return ..() @@ -316,11 +316,10 @@ . += "The cap has been taken off. Alt-click to put a cap on." /obj/item/reagent_containers/glass/waterbottle/AltClick(mob/user) - . = ..() if(cap_lost) to_chat(user, "The cap seems to be missing! Where did it go?") return - + var/fumbled = HAS_TRAIT(user, TRAIT_CLUMSY) && prob(5) if(cap_on || fumbled) cap_on = FALSE @@ -359,7 +358,7 @@ if(cap_on && (target.is_refillable() || target.is_drainable() || (reagents.total_volume && user.a_intent == INTENT_HARM))) to_chat(user, "You must remove the cap before you can do that!") return - + else if(istype(target, /obj/item/reagent_containers/glass/waterbottle)) var/obj/item/reagent_containers/glass/waterbottle/WB = target if(WB.cap_on) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 2f3d7b208dd54..edc85ea69c49c 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -76,7 +76,7 @@ volume = 90 possible_transfer_amounts = list(10,15,30,45) ignore_flags = 1 // So they can heal their comrades. - list_reagents = list(/datum/reagent/medicine/epinephrine = 30, /datum/reagent/medicine/omnizine = 30, /datum/reagent/medicine/leporazine = 15, /datum/reagent/medicine/atropine = 15) + list_reagents = list(/datum/reagent/medicine/epinephrine = 30, /datum/reagent/medicine/omnizine = 30, /datum/reagent/medicine/leporazine = 15, /datum/reagent/medicine/stabilizing_nanites = 15) /obj/item/reagent_containers/hypospray/combat/nanites name = "experimental combat stimulant injector" diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm index fd05482daa67e..3faff68117973 100644 --- a/code/modules/reagents/reagent_containers/patch.dm +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -15,10 +15,10 @@ if(ishuman(L)) var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected)) if(!affecting) - to_chat(user, "The limb is missing!") + balloon_alert(user, "The limb is missing") return if(affecting.status != BODYPART_ORGANIC) - to_chat(user, "Medicine won't work on a robotic limb!") + balloon_alert(user, "It doesn't work on robotic limb") return ..() @@ -30,17 +30,17 @@ /obj/item/reagent_containers/pill/patch/styptic name = "brute patch" desc = "Helps with brute injuries." - list_reagents = list(/datum/reagent/medicine/styptic_powder = 20) + list_reagents = list(/datum/reagent/medicine/styptic_powder = 30) icon_state = "bandaid_brute" /obj/item/reagent_containers/pill/patch/silver_sulf name = "burn patch" desc = "Helps with burn injuries." - list_reagents = list(/datum/reagent/medicine/silver_sulfadiazine = 20) + list_reagents = list(/datum/reagent/medicine/silver_sulfadiazine = 30) icon_state = "bandaid_burn" /obj/item/reagent_containers/pill/patch/synthflesh name = "synthflesh patch" desc = "Helps with brute and burn injuries." - list_reagents = list(/datum/reagent/medicine/synthflesh = 20) + list_reagents = list(/datum/reagent/medicine/synthflesh = 30) icon_state = "bandaid_both" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 473f6fd3fed7e..a6dff44cbac41 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -51,8 +51,7 @@ var/makes_me_think = pick(strings(REDPILL_FILE, "redpill_questions")) if(icon_state == "pill4" && prob(5)) //you take the red pill - you stay in Wonderland, and I show you how deep the rabbit hole goes - sleep(50) - to_chat(M, "[makes_me_think]") + addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, M, "[makes_me_think]"), 5 SECONDS) if(reagents.total_volume) reagents.reaction(M, apply_type) @@ -68,11 +67,11 @@ if(!dissolvable || !target.is_refillable()) return if(target.is_drainable() && !target.reagents.total_volume) - to_chat(user, "[target] is empty! There's nothing to dissolve [src] in.") + balloon_alert(user, "It's empty") return if(target.reagents.holder_full()) - to_chat(user, "[target] is full.") + balloon_alert(user, "It's full") return user.visible_message("[user] slips something into [target]!", "You dissolve [src] in [target].", null, 2) @@ -115,7 +114,7 @@ name = "salbutamol pill" desc = "Used to treat oxygen deprivation." icon_state = "pill16" - list_reagents = list(/datum/reagent/medicine/salbutamol = 30) + list_reagents = list(/datum/reagent/medicine/salbutamol = 20) rename_with_volume = TRUE /obj/item/reagent_containers/pill/charcoal @@ -139,6 +138,9 @@ list_reagents = list(/datum/reagent/medicine/mannitol = 50) rename_with_volume = TRUE +/obj/item/reagent_containers/pill/mannitol/braintumor //For the brain tumor quirk + list_reagents = list(/datum/reagent/medicine/mannitol = 20) + /obj/item/reagent_containers/pill/mutadone name = "mutadone pill" desc = "Used to treat genetic damage." @@ -146,18 +148,32 @@ list_reagents = list(/datum/reagent/medicine/mutadone = 50) rename_with_volume = TRUE +/obj/item/reagent_containers/pill/bicaridine + name = "bicaridine pill" + desc = "Used to stimulate the healing of small brute injuries." + icon_state = "pill9" + list_reagents = list(/datum/reagent/medicine/bicaridine = 15) + rename_with_volume = TRUE + +/obj/item/reagent_containers/pill/kelotane + name = "kelotane pill" + desc = "Used to stimulate the healing of small burns." + icon_state = "pill11" + list_reagents = list(/datum/reagent/medicine/kelotane = 15) + rename_with_volume = TRUE + /obj/item/reagent_containers/pill/salicyclic name = "salicylic acid pill" desc = "Used to dull pain." icon_state = "pill9" - list_reagents = list(/datum/reagent/medicine/sal_acid = 24) + list_reagents = list(/datum/reagent/medicine/sal_acid = 15) rename_with_volume = TRUE /obj/item/reagent_containers/pill/oxandrolone name = "oxandrolone pill" desc = "Used to stimulate burn healing." icon_state = "pill11" - list_reagents = list(/datum/reagent/medicine/oxandrolone = 24) + list_reagents = list(/datum/reagent/medicine/oxandrolone = 15) rename_with_volume = TRUE /obj/item/reagent_containers/pill/insulin @@ -205,7 +221,7 @@ desc = "Used to treat radition used to counter radiation poisoning." icon_state = "pill18" list_reagents = list(/datum/reagent/medicine/potass_iodide = 30) - + ///////////////////////////////////////// this pill is used only in a legion mob drop /obj/item/reagent_containers/pill/shadowtoxin @@ -213,7 +229,7 @@ desc = "I wouldn't eat this if I were you." icon_state = "pill9" color = "#454545" - list_reagents = list(/datum/reagent/mutationtoxin/shadow = 1) + list_reagents = list(/datum/reagent/mutationtoxin/shadow = 5) //////////////////////////////////////// drugs /obj/item/reagent_containers/pill/zoom diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index da70c314a7679..b596890f800dd 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -228,6 +228,14 @@ /obj/item/reagent_containers/spray/waterflower/attack_self(mob/user) //Don't allow changing how much the flower sprays return +/obj/item/reagent_containers/spray/waterflower/superlube + name = "clown flower" + desc = "A delightly devilish flower... you got a feeling where this is going." + icon = 'icons/obj/chemical.dmi' + icon_state = "clownflower" + volume = 30 + list_reagents = list(/datum/reagent/lube/superlube = 30) + /obj/item/reagent_containers/spray/waterflower/cyborg reagent_flags = NONE volume = 100 @@ -357,3 +365,54 @@ righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' volume = 100 list_reagents = list(/datum/reagent/toxin/plantbgone = 100) + +/obj/item/reagent_containers/spray/cyborg + var/charge_cost = 50 + var/charge_tick = 0 + var/recharge_time = 2 //Time it takes for 5u to recharge (in seconds) + var/datum/reagent/set_reagent + +/obj/item/reagent_containers/spray/cyborg/Initialize() + . = ..() + reagents.add_reagent(set_reagent, volume) + START_PROCESSING(SSobj, src) + +/obj/item/reagent_containers/spray/cyborg/process() + charge_tick++ + if(charge_tick >= recharge_time) + regenerate_reagents() + charge_tick = 0 + +/obj/item/reagent_containers/spray/cyborg/proc/regenerate_reagents() + var/mob/living/silicon/robot/R = loc + if(istype(R)) + if(R.cell) + if(reagents.total_volume <= volume) + R.cell.use(charge_cost) + reagents.add_reagent(set_reagent, 5) + +/obj/item/reagent_containers/spray/cyborg/drying_agent + name = "drying agent spray" + desc = "A spray for cleaning up wet floors." + color = "#A000A0" + set_reagent = /datum/reagent/drying_agent + +/obj/item/reagent_containers/spray/cyborg/plantbgone + name = "Plant-B-Gone" + desc = "A bottle of weed killer spray for stopping kudzu-based harm." + icon = 'icons/obj/hydroponics/equipment.dmi' + icon_state = "plantbgone" + item_state = "plantbgone" + set_reagent = /datum/reagent/toxin/plantbgone + +/obj/item/reagent_containers/spray/cyborg/lube + name = "lube spray" + desc = "A spray filled with space lube, for sabotaging the crew." + color = "#009CA8" + set_reagent = /datum/reagent/lube + +/obj/item/reagent_containers/spray/cyborg/acid + name = "acid spray" + desc = "A spray filled with sulphuric acid for offensive use." + color = "#00FF32" + set_reagent = /datum/reagent/toxin/acid diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 9d5bb2b96a394..45bf90542cf11 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -78,16 +78,13 @@ else if(!L.can_inject(user, TRUE)) return - // chance of monkey retaliation - if(ismonkey(target) && prob(MONKEY_SYRINGE_RETALIATION_PROB)) - var/mob/living/carbon/monkey/M - M = target - M.retaliate(user) + SEND_SIGNAL(target, COMSIG_LIVING_TRY_SYRINGE, user) + switch(mode) if(SYRINGE_DRAW) if(reagents.total_volume >= reagents.maximum_volume) - to_chat(user, "The syringe is full.") + balloon_alert(user, "It's full") return if(L) //living mob @@ -106,19 +103,21 @@ user.visible_message("[user] takes a blood sample from [L].") else to_chat(user, "You are unable to draw any blood from [L]!") + balloon_alert(user, "Unable to take blood sample") else //if not mob if(!target.reagents.total_volume) - to_chat(user, "[target] is empty!") + balloon_alert(user, "It's empty") return if(!target.is_drawable(user)) - to_chat(user, "You cannot directly remove reagents from [target]!") + balloon_alert(user, "You can't remove its reagents") return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transfered_by = user) // transfer from, transfer to - who cares? to_chat(user, "You fill [src] with [trans] units of the solution. It now contains [reagents.total_volume] units.") + balloon_alert(user, "You fill [src] with [trans]u") if (reagents.total_volume >= reagents.maximum_volume) mode=!mode update_icon() @@ -129,15 +128,15 @@ log_combat(user, target, "attempted to inject", src, addition="which had [contained]") if(!reagents.total_volume) - to_chat(user, "[src] is empty.") + balloon_alert(user, "It's empty") return if(!L && !target.is_injectable(user)) //only checks on non-living mobs, due to how can_inject() handles - to_chat(user, "You cannot directly fill [target]!") + balloon_alert(user, "You cannot fill [target]") return if(target.reagents.total_volume >= target.reagents.maximum_volume) - to_chat(user, "[target] is full.") + balloon_alert(user, "It's full") return if(L) //living mob @@ -177,6 +176,7 @@ var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) reagents.reaction(L, INJECT, fraction) reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user) + balloon_alert(user, "[amount_per_transfer_from_this]u injected") to_chat(user, "You inject [amount_per_transfer_from_this] units of the solution. The syringe now contains [reagents.total_volume] units.") if (reagents.total_volume <= 0 && mode==SYRINGE_INJECT) mode = SYRINGE_DRAW @@ -209,16 +209,16 @@ /obj/item/reagent_containers/syringe/proc/embed(mob/living/carbon/C, injectmult = 1) C.apply_status_effect(STATUS_EFFECT_SYRINGE, src, injectmult) forceMove(C) - + /obj/item/reagent_containers/syringe/used name = "used syringe" desc = "A syringe that can hold up to 15 units. This one is old, and it's probably a bad idea to use it" - + /obj/item/reagent_containers/syringe/used/Initialize() . = ..() - if(prob(50)) - var/datum/disease/advance/R = new /datum/disease/advance/random(rand(2, 5), rand(6, 9)) + if(prob(75)) + var/datum/disease/advance/R = new /datum/disease/advance/random(rand(3, 6), 9, rand(3,4), infected = src) syringediseases += R /obj/item/reagent_containers/syringe/epinephrine @@ -240,7 +240,7 @@ name = "syringe (diphenhydramine)" desc = "Contains diphenhydramine, an antihistamine agent." list_reagents = list(/datum/reagent/medicine/diphenhydramine = 15) - + /obj/item/reagent_containers/syringe/calomel name = "syringe (calomel)" desc = "Contains calomel." @@ -300,11 +300,33 @@ units_per_tick = 2 initial_inject = 8 -/obj/item/reagent_containers/syringe/noreact +/obj/item/reagent_containers/syringe/cryo name = "cryo syringe" - desc = "An advanced syringe that stops reagents inside from reacting. It can hold up to 20 units." + desc = "An advanced syringe that freezes reagents close to absolute 0. It can hold up to 20 units." volume = 20 - reagent_flags = TRANSPARENT | NO_REACT + var/processing = FALSE + +/obj/item/reagent_containers/syringe/cryo/Destroy() + if(processing) + STOP_PROCESSING(SSfastprocess, src) + . = ..() + +/obj/item/reagent_containers/syringe/cryo/process(delta_time) + reagents.chem_temp = 20 + +//Reactions are handled after this call. +/obj/item/reagent_containers/syringe/cryo/on_reagent_change() + . = ..() + if(reagents) + if(reagents.total_volume) + reagents.chem_temp = 20 + if(!processing) + START_PROCESSING(SSfastprocess, src) + processing = TRUE + return + if(processing) + STOP_PROCESSING(SSfastprocess, src) + processing = FALSE /obj/item/reagent_containers/syringe/piercing name = "piercing syringe" diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index d0c571c6bcd57..0cd322745be89 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -65,7 +65,10 @@ reagent_id = /datum/reagent/fuel /obj/structure/reagent_dispensers/fueltank/boom() - explosion(get_turf(src), 0, 1, 5, flame_range = 5) + var/light_explosion_range = CLAMP(round(reagents.get_reagent_amount(/datum/reagent/fuel)/200, 1), 1, 5) //explosion range should decrease when there is less fuel in the tank + var/flame_explosion_range = CLAMP(light_explosion_range + 1, 1, 5) //Fire explosion is always one bigger than light explosion + var/heavy_explosion_range = round(light_explosion_range/5, 1) //if there is less than 500 fuel in the tank, no heavy explosion + explosion(get_turf(src), 0, heavy_explosion_range, light_explosion_range, flame_range = flame_explosion_range) qdel(src) /obj/structure/reagent_dispensers/fueltank/blob_act(obj/structure/blob/B) @@ -105,10 +108,10 @@ else user.visible_message("[user] catastrophically fails at refilling [user.p_their()] [I.name]!", "That was stupid of you.") log_bomber(user, "detonated a", src, "via welding tool") - + if (user.client) SSmedals.UnlockMedal(MEDAL_DETONATE_WELDERBOMB,user.client) - + boom() return return ..() @@ -120,6 +123,7 @@ icon_state = "pepper" anchored = TRUE density = FALSE + layer = ABOVE_WINDOW_LAYER reagent_id = /datum/reagent/consumable/condensedcapsaicin /obj/structure/reagent_dispensers/peppertank/Initialize() @@ -176,6 +180,7 @@ icon_state = "virus_food" anchored = TRUE density = FALSE + layer = ABOVE_WINDOW_LAYER reagent_id = /datum/reagent/consumable/virus_food diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 3309b47384ddf..9427a709fae95 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -9,6 +9,8 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) name = "conveyor belt" desc = "A conveyor belt." layer = BELOW_OPEN_DOOR_LAYER + processing_flags = START_PROCESSING_MANUALLY + subsystem_type = /datum/controller/subsystem/processing/fastprocess var/operating = 0 // 1 if running forward, -1 if backwards, 0 if off var/operable = 1 // true if can operate (no broken segments in this belt run) var/forwards // this is the default (forward) direction, set by the map dir @@ -17,14 +19,13 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) var/id = "" // the control ID - must match controller ID var/verted = 1 // Inverts the direction the conveyor belt moves. - speed_process = TRUE var/conveying = FALSE /obj/machinery/conveyor/centcom_auto id = "round_end_belt" -/obj/machinery/conveyor/inverted //Directions inverted so you can use different corner peices. +/obj/machinery/conveyor/inverted //Directions inverted so you can use different corner pieces. icon_state = "conveyor_map_inverted" verted = -1 @@ -127,15 +128,19 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) operating = FALSE icon_state = "conveyor[operating * verted]" - // machine process - // move items to the target location +// machine process +// move items to the target location /obj/machinery/conveyor/process() if(stat & (BROKEN | NOPOWER)) return + if(!operating) return + var/turf/T = get_turf(src) + use_power(6) + //get the first 30 items in contents var/i = 0 var/list/affected = list() @@ -239,11 +244,10 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) desc = "A conveyor control switch." icon = 'icons/obj/recycling.dmi' icon_state = "switch-off" - speed_process = TRUE + processing_flags = START_PROCESSING_MANUALLY var/position = 0 // 0 off, -1 reverse, 1 forward var/last_pos = -1 // last direction setting - var/operated = 1 // true if just operated var/oneway = FALSE // if the switch only operates the conveyor belts in a single direction. var/invert_icon = FALSE // If the level points the opposite direction when it's turned on. @@ -285,23 +289,28 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) else icon_state = "switch-off" - -// timed process -// if the switch changed, update the linked conveyors - -/obj/machinery/conveyor_switch/process() - if(!operated) - return - operated = 0 - +/// Updates all conveyor belts that are linked to this switch, and tells them to start processing. +/obj/machinery/conveyor_switch/proc/update_linked_conveyors() for(var/obj/machinery/conveyor/C in GLOB.conveyors_by_id[id]) C.operating = position C.update_move_direction() + C.update_icon() + if(C.operating) + C.begin_processing() + else + C.end_processing() CHECK_TICK -// attack with hand, switch position -/obj/machinery/conveyor_switch/interact(mob/user) - add_fingerprint(user) +/// Finds any switches with same `id` as this one, and set their position and icon to match us. +/obj/machinery/conveyor_switch/proc/update_linked_switches() + for(var/obj/machinery/conveyor_switch/S in GLOB.conveyors_by_id[id]) + S.invert_icon = invert_icon + S.position = position + S.update_icon() + CHECK_TICK + +/// Updates the switch's `position` and `last_pos` variable. Useful so that the switch can properly cycle between the forwards, backwards and neutral positions. +/obj/machinery/conveyor_switch/proc/update_position() if(position == 0) if(oneway) //is it a oneway switch position = oneway @@ -316,15 +325,14 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) last_pos = position position = 0 - operated = 1 +/// Called when a user clicks on this switch with an open hand. +/obj/machinery/conveyor_switch/interact(mob/user) + add_fingerprint(user) + update_position() update_icon() + update_linked_conveyors() + update_linked_switches() - // find any switches with same id as this one, and set their positions to match us - for(var/obj/machinery/conveyor_switch/S in GLOB.conveyors_by_id[id]) - S.invert_icon = invert_icon - S.position = position - S.update_icon() - CHECK_TICK /obj/machinery/conveyor_switch/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_CROWBAR) @@ -385,6 +393,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) max_amount = 30 singular_name = "conveyor belt" w_class = WEIGHT_CLASS_BULKY + merge_type = /obj/item/stack/conveyor ///id for linking var/id = "" diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 02cdee2bcf040..86267f5c71e2a 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -5,7 +5,7 @@ /obj/machinery/disposal icon = 'icons/obj/atmospherics/pipes/disposal.dmi' density = TRUE - armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30) + armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30, "stamina" = 0) max_integrity = 200 resistance_flags = FIRE_PROOF interaction_flags_machine = INTERACT_MACHINE_OPEN | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON @@ -23,7 +23,6 @@ var/flush_every_ticks = 30 //Every 30 ticks it will look whether it is ready to flush var/flush_count = 0 //this var adds 1 once per tick. When it reaches flush_every_ticks it resets and tries to flush. var/last_sound = 0 - var/obj/structure/disposalconstruct/stored // create a new disposal // find the attached trunk (if present) and init gas resvr. @@ -32,11 +31,7 @@ if(make_from) setDir(make_from.dir) - make_from.moveToNullspace() - stored = make_from pressure_charging = FALSE // newly built disposal bins start with pump off - else - stored = new /obj/structure/disposalconstruct(null, null , SOUTH , FALSE , src) trunk_check() @@ -131,6 +126,7 @@ add_fingerprint(user) if(user == target) user.visible_message("[user] starts climbing into [src].", "You start climbing into [src]...") + . = TRUE else target.visible_message("[user] starts putting [target] into [src].", "[user] starts putting you into [src]!") if(do_mob(user, target, 20)) @@ -139,10 +135,12 @@ target.forceMove(src) if(user == target) user.visible_message("[user] climbs into [src].", "You climb into [src].") + . = TRUE else target.visible_message("[user] has placed [target] in [src].", "[user] has placed you in [src].") log_combat(user, target, "stuffed", addition="into [src]") - target.LAssailant = user + target.LAssailant = WEAKREF(user) + . = TRUE update_icon() /obj/machinery/disposal/relaymove(mob/user) @@ -234,16 +232,10 @@ qdel(H) /obj/machinery/disposal/deconstruct(disassembled = TRUE) - var/turf/T = loc if(!(flags_1 & NODECONSTRUCT_1)) - if(stored) - stored.forceMove(T) - src.transfer_fingerprints_to(stored) - stored.anchored = FALSE - stored.density = TRUE - stored.update_icon() + new /obj/structure/disposalconstruct(loc, null, SOUTH, FALSE, src) for(var/atom/movable/AM in src) //out, out, darned crowbar! - AM.forceMove(T) + AM.forceMove(get_turf(src)) ..() /obj/machinery/disposal/get_dumping_location(obj/item/storage/source,mob/user) @@ -299,6 +291,7 @@ if(!ui) ui = new(user, src, "DisposalUnit") ui.open() + ui.set_autoupdate(TRUE) // Pressure /obj/machinery/disposal/bin/ui_data(mob/user) var/list/data = list() @@ -388,7 +381,7 @@ //timed process //charge the gas reservoir and perform flush if ready -/obj/machinery/disposal/bin/process() +/obj/machinery/disposal/bin/process(delta_time) if(stat & BROKEN) //nothing can happen if broken return @@ -421,7 +414,7 @@ var/pressure_delta = (SEND_PRESSURE*1.01) - air_contents.return_pressure() if(env.return_temperature() > 0) - var/transfer_moles = 0.1 * pressure_delta*air_contents.return_volume()/(env.return_temperature() * R_IDEAL_GAS_EQUATION) + var/transfer_moles = 0.05 * delta_time * pressure_delta * air_contents.return_volume() / (env.return_temperature() * R_IDEAL_GAS_EQUATION) //Actually transfer the gas var/datum/gas_mixture/removed = env.remove(transfer_moles) @@ -438,7 +431,7 @@ /obj/machinery/disposal/bin/get_remote_view_fullscreens(mob/user) if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS))) - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2) //Delivery Chute @@ -505,6 +498,9 @@ /obj/mecha/CanEnterDisposals() return +/obj/structure/spacevine/CanEnterDisposals() + return + /obj/machinery/disposal/bin/newHolderDestination(obj/structure/disposalholder/H) H.destinationTag = 1 diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index 348e687e03138..3c5fa21278746 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -16,10 +16,13 @@ /obj/structure/disposalconstruct/Initialize(loc, _pipe_type, _dir = SOUTH, flip = FALSE, obj/make_from) . = ..() + if(make_from) pipe_type = make_from.type setDir(make_from.dir) anchored = TRUE + density = initial(pipe_type.density) + make_from.transfer_fingerprints_to(src) else if(_pipe_type) @@ -159,12 +162,13 @@ if(!I.tool_start_check(user, amount=0)) return TRUE + add_fingerprint(user) to_chat(user, "You start welding the [pipename] in place...") if(I.use_tool(src, user, 8, volume=50)) to_chat(user, "The [pipename] has been welded in place.") var/obj/O = new pipe_type(loc, src) transfer_fingerprints_to(O) - + qdel(src) else to_chat(user, "You need to attach it to the plating first!") return TRUE diff --git a/code/modules/recycling/disposal/holder.dm b/code/modules/recycling/disposal/holder.dm index e68022c5e3675..8a2fbff4b8a44 100644 --- a/code/modules/recycling/disposal/holder.dm +++ b/code/modules/recycling/disposal/holder.dm @@ -22,6 +22,8 @@ // initialize a holder from the contents of a disposal unit /obj/structure/disposalholder/proc/init(obj/machinery/disposal/D) + if(!istype(D)) + return //Why check for things that don't exist? gas = D.air_contents// transfer gas resv. into holder object //Check for any living mobs trigger hasmob. @@ -103,6 +105,7 @@ // merge two holder objects // used when a holder meets a stuck holder /obj/structure/disposalholder/proc/merge(obj/structure/disposalholder/other) + destinationTag = other.destinationTag //copies typetag from other holder for(var/A in other) var/atom/movable/AM = A AM.forceMove(src) // move everything in other holder to this one @@ -116,8 +119,8 @@ /obj/structure/disposalholder/relaymove(mob/user) if(user.incapacitated()) return - for(var/mob/M in range(5, get_turf(src))) - M.show_message("CLONG, clong!", 2) + for(var/mob/M as() in hearers(5, get_turf(src))) + M.show_message("CLONG, clong!", MSG_AUDIBLE) var/obj/structure/disposalpipe/pipe = loc pipe.take_damage(10) playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0) diff --git a/code/modules/recycling/disposal/outlet.dm b/code/modules/recycling/disposal/outlet.dm index 7655988c8ffd2..d8e4886518a86 100644 --- a/code/modules/recycling/disposal/outlet.dm +++ b/code/modules/recycling/disposal/outlet.dm @@ -10,18 +10,14 @@ var/active = FALSE var/turf/target // this will be where the output objects are 'thrown' to. var/obj/structure/disposalpipe/trunk/trunk // the attached pipe trunk - var/obj/structure/disposalconstruct/stored var/start_eject = 0 var/eject_range = 2 /obj/structure/disposaloutlet/Initialize(mapload, obj/structure/disposalconstruct/make_from) . = ..() + if(make_from) setDir(make_from.dir) - make_from.forceMove(src) - stored = make_from - else - stored = new /obj/structure/disposalconstruct(src, null , SOUTH , FALSE , src) target = get_ranged_target_turf(src, dir, 10) @@ -33,7 +29,6 @@ if(trunk) trunk.linked = null trunk = null - QDEL_NULL(stored) return ..() // expel the contents of the holder object, then delete it @@ -70,12 +65,15 @@ if(!I.tool_start_check(user, amount=0)) return TRUE + add_fingerprint(user) playsound(src, 'sound/items/welder2.ogg', 100, 1) to_chat(user, "You start slicing the floorweld off [src]...") if(I.use_tool(src, user, 20)) to_chat(user, "You slice the floorweld off [src].") - stored.forceMove(loc) - transfer_fingerprints_to(stored) - stored = null - qdel(src) + deconstruct() return TRUE + +/obj/structure/disposaloutlet/deconstruct(disassembled = TRUE) + if(!(flags_1 & NODECONSTRUCT_1)) + new /obj/structure/disposalconstruct(loc, null, SOUTH, FALSE, src) + ..() diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index a60ecd472d010..9f7e94a31ce19 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -10,24 +10,19 @@ level = 1 // underfloor only dir = NONE // dir will contain dominant direction for junction pipes max_integrity = 200 - armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30) + armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30, "stamina" = 0) layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes 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 var/flip_type // If set, the pipe is flippable and becomes this type when flipped - var/obj/structure/disposalconstruct/stored /obj/structure/disposalpipe/Initialize(mapload, obj/structure/disposalconstruct/make_from) . = ..() - if(!QDELETED(make_from)) + if(make_from) setDir(make_from.dir) - make_from.forceMove(src) - stored = make_from - else - stored = new /obj/structure/disposalconstruct(src, null , SOUTH , FALSE , src) if(dir in GLOB.diagonals) // Bent pipes already have all the dirs set initialize_dirs = NONE @@ -50,7 +45,6 @@ if(H) H.active = FALSE expel(H, get_turf(src), 0) - QDEL_NULL(stored) return ..() // returns the direction of the next pipe object, given the entrance dir @@ -97,11 +91,11 @@ var/eject_range = 5 var/turf/open/floor/floorturf - if(isfloorturf(T)) //intact floor, pop the tile + if(isfloorturf(T) && T.intact) //intact floor, pop the tile floorturf = T if(floorturf.floor_tile) new floorturf.floor_tile(T) - floorturf.make_plating() + floorturf.make_plating(TRUE) if(direction) // direction is specified if(isspaceturf(T)) // if ended in space, then range is unlimited @@ -146,6 +140,7 @@ if(!I.tool_start_check(user, amount=0)) return TRUE + add_fingerprint(user) to_chat(user, "You start slicing [src]...") if(I.use_tool(src, user, 30, volume=50)) deconstruct() @@ -160,19 +155,14 @@ /obj/structure/disposalpipe/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) if(disassembled) - if(stored) - stored.forceMove(loc) - transfer_fingerprints_to(stored) - stored.setDir(dir) - stored = null + new /obj/structure/disposalconstruct(loc, null , SOUTH , FALSE , src) else var/turf/T = get_turf(src) for(var/D in GLOB.cardinals) if(D & dpdir) var/obj/structure/disposalpipe/broken/P = new(T) P.setDir(D) - qdel(src) - + ..() /obj/structure/disposalpipe/singularity_pull(S, current_size) ..() diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 179e05e3bf2c9..84b50c9474be6 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -19,8 +19,14 @@ return ..() /obj/structure/bigDelivery/contents_explosion(severity, target) - for(var/atom/movable/AM in contents) - AM.ex_act() + for(var/thing in contents) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += thing + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += thing + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += thing /obj/structure/bigDelivery/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/destTagger)) @@ -84,8 +90,14 @@ var/sortTag = 0 /obj/item/smallDelivery/contents_explosion(severity, target) - for(var/atom/movable/AM in contents) - AM.ex_act() + for(var/thing in contents) + switch(severity) + if(EXPLODE_DEVASTATE) + SSexplosions.high_mov_atom += thing + if(EXPLODE_HEAVY) + SSexplosions.med_mov_atom += thing + if(EXPLODE_LIGHT) + SSexplosions.low_mov_atom += thing /obj/item/smallDelivery/attack_self(mob/user) user.temporarilyRemoveItemFromInventory(src, TRUE) diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm new file mode 100644 index 0000000000000..eefca2ce7e9bc --- /dev/null +++ b/code/modules/religion/religion_sects.dm @@ -0,0 +1,218 @@ +/** + * # Religious Sects + * + * Religious Sects are a way to convert the fun of having an active 'god' (admin) to code-mechanics so you aren't having to press adminwho. + * + * Sects are not meant to overwrite the fun of choosing a custom god/religion, but meant to enhance it. + * The idea is that Space Jesus (or whoever you worship) can be an evil bloodgod who takes the lifeforce out of people, a nature lover, or all things righteous and good. You decide! + * + */ +/datum/religion_sect +/// Name of the religious sect + var/name = "Religious Sect Base Type" +/// Description of the religious sect, Presents itself in the selection menu (AKA be brief) + var/desc = "Oh My! What Do We Have Here?!!?!?!?" +/// Opening message when someone gets converted + var/convert_opener +/// holder for alignments. + var/alignment = ALIGNMENT_GOOD +/// Does this require something before being available as an option? + var/starter = TRUE +/// The Sect's 'Mana' + var/favor = 0 //MANA! +/// The max amount of favor the sect can have + var/max_favor = 1000 +/// The default value for an item that can be sacrificed + var/default_item_favor = 5 +/// Turns into 'desired_items_typecache', lists the types that can be sacrificed barring optional features in can_sacrifice() + var/list/desired_items +/// Autopopulated by `desired_items` + var/list/desired_items_typecache +/// Lists of rites by type. Converts itself into a list of rites with "name - desc (favor_cost)" = type + var/list/rites_list +/// Changes the Altar of Gods icon + var/altar_icon +/// Changes the Altar of Gods icon_state + var/altar_icon_state +/// Currently Active (non-deleted) rites + var/list/active_rites + +/datum/religion_sect/New() + . = ..() + if(desired_items) + desired_items_typecache = typecacheof(desired_items) + if(rites_list) + var/listylist = generate_rites_list() + rites_list = listylist + on_select() + +///Generates a list of rites with 'name' = 'type' +/datum/religion_sect/proc/generate_rites_list() + . = list() + for(var/i in rites_list) + if(!ispath(i)) + continue + var/datum/religion_rites/RI = i + var/name_entry = "[initial(RI.name)]" + if(initial(RI.desc)) + name_entry += " - [initial(RI.desc)]" + if(initial(RI.favor_cost)) + name_entry += " ([initial(RI.favor_cost)] favor)" + + . += list("[name_entry]" = i) + +/// Activates once selected +/datum/religion_sect/proc/on_select() + +/// Activates once selected and on newjoins, oriented around people who become holy. +/datum/religion_sect/proc/on_conversion(mob/living/L) + to_chat(L, "[convert_opener] max_favor)) + . = (max_favor-favor) //if favor = 5 and we want to add 10 with a max of 10, we'll only be able to add 5 + favor = clamp(favor+amount, 0, max_favor) + +/// Sets favor to a specific amount. Can provide optional features based on a user. +/datum/religion_sect/proc/set_favor(amount = 0, mob/living/L) + favor = clamp(favor+amount, 0, max_favor) + return favor + +/// Activates when an individual uses a rite. Can provide different/additional benefits depending on the user. +/datum/religion_sect/proc/on_riteuse(mob/living/user, atom/religious_tool) + +/// Replaces the bible's bless mechanic. Return TRUE if you want to not do the brain hit. +/datum/religion_sect/proc/sect_bless(mob/living/L, mob/living/user) + if(!ishuman(L)) + return FALSE + var/mob/living/carbon/human/H = L + for(var/X in H.bodyparts) + var/obj/item/bodypart/BP = X + if(BP.status == BODYPART_ROBOTIC) + to_chat(user, "[GLOB.deity] refuses to heal this metallic taint!") + return TRUE + + var/heal_amt = 10 + var/list/hurt_limbs = H.get_damaged_bodyparts(1, 1, null, BODYPART_ORGANIC) + + if(hurt_limbs.len) + for(var/obj/item/bodypart/affecting as() in hurt_limbs) + if(affecting.heal_damage(heal_amt, heal_amt, null, BODYPART_ORGANIC)) + H.update_damage_overlays() + H.visible_message("[user] heals [H] with the power of [GLOB.deity]!") + to_chat(H, "May the power of [GLOB.deity] compels you to be healed!") + playsound(user, "punch", 25, TRUE, -1) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing) + return TRUE + +/datum/religion_sect/puritanism + name = "Puritanism (Default)" + desc = "Nothing special." + convert_opener = "Your run-of-the-mill sect, there are no benefits or boons associated. Praise normalcy!" + +/datum/religion_sect/technophile + name = "Technophile" + desc = "A sect oriented around technology." + convert_opener = "May you find peace in a metal shell, acolyte.
Bibles now recharge cyborgs and heal robotic limbs if targeted, but they do not heal organic limbs. You can now sacrifice cells, with favor depending on their charge." + alignment = ALIGNMENT_NEUT + desired_items = list(/obj/item/stock_parts/cell) + rites_list = list(/datum/religion_rites/synthconversion) + altar_icon_state = "convertaltar-blue" + +/datum/religion_sect/technophile/sect_bless(mob/living/L, mob/living/user) + if(iscyborg(L)) + var/mob/living/silicon/robot/R = L + var/charge_amt = 50 + if(L.mind?.holy_role == HOLY_ROLE_HIGHPRIEST) + charge_amt *= 2 + R.cell?.charge += charge_amt + R.visible_message("[user] charges [R] with the power of [GLOB.deity]!") + to_chat(R, "You are charged by the power of [GLOB.deity]!") + SEND_SIGNAL(R, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing) + playsound(user, 'sound/effects/bang.ogg', 25, TRUE, -1) + return TRUE + if(!ishuman(L)) + return + var/mob/living/carbon/human/H = L + + //first we determine if we can charge them + var/did_we_charge = FALSE + var/obj/item/organ/stomach/battery/battery_stomach = H.getorganslot(ORGAN_SLOT_STOMACH) + if(istype(battery_stomach)) + battery_stomach.adjust_charge(100) + did_we_charge = TRUE + + //if we're not targetting a robot part we stop early + var/obj/item/bodypart/BP = H.get_bodypart(user.zone_selected) + if(BP.status != BODYPART_ROBOTIC) + if(!did_we_charge) + to_chat(user, "[GLOB.deity] scoffs at the idea of healing such fleshy matter!") + else + H.visible_message("[user] charges [H] with the power of [GLOB.deity]!") + to_chat(H, "You feel charged by the power of [GLOB.deity]!") + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing) + playsound(user, 'sound/machines/synth_yes.ogg', 25, TRUE, -1) + return TRUE + + //charge(?) and go + if(BP.heal_damage(5,5,null,BODYPART_ROBOTIC)) + H.update_damage_overlays() + + H.visible_message("[user] [did_we_charge ? "repairs" : "repairs and charges"] [H] with the power of [GLOB.deity]!") + to_chat(H, "The inner machinations of [GLOB.deity] [did_we_charge ? "repairs" : "repairs and charges"] you!") + playsound(user, 'sound/effects/bang.ogg', 25, TRUE, -1) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing) + return TRUE + +/datum/religion_sect/technophile/on_sacrifice(obj/item/I, mob/living/L) + var/obj/item/stock_parts/cell/the_cell = I + if(!istype(the_cell)) //how... + return + if(the_cell.charge < 3000) + to_chat(L,"[GLOB.deity] does not accept pity amounts of power.") + return + adjust_favor(round(the_cell.charge/3000), L) + to_chat(L, "You offer [the_cell]'s power to [GLOB.deity], pleasing them.") + qdel(I) + return TRUE + +/**** Ever-Burning Candle sect ****/ + +/datum/religion_sect/candle_sect + name = "Ever-Burning Candle" + desc = "A sect dedicated to candles." + convert_opener = "May you be the wax to keep the Ever-Burning Candle burning, acolyte.
Sacrificing burning corpses with a lot of burn damage and candles grants you favor." + alignment = ALIGNMENT_NEUT + max_favor = 10000 + desired_items = list(/obj/item/candle) + rites_list = list(/datum/religion_rites/fireproof, /datum/religion_rites/burning_sacrifice, /datum/religion_rites/infinite_candle) + altar_icon_state = "convertaltar-red" + +//candle sect bibles don't heal or do anything special apart from the standard holy water blessings +/datum/religion_sect/candle_sect/sect_bless(mob/living/blessed, mob/living/user) + return TRUE + +/datum/religion_sect/candle_sect/on_sacrifice(obj/item/candle/offering, mob/living/user) + if(!istype(offering)) + return + if(!offering.lit) + to_chat(user, "The candle needs to be lit to be offered!") + return + to_chat(user, "Another candle for [GLOB.deity]'s collection.") + adjust_favor(20, user) //it's not a lot but hey there's a pacifist favor option at least + qdel(offering) + return TRUE diff --git a/code/modules/religion/religion_structures.dm b/code/modules/religion/religion_structures.dm new file mode 100644 index 0000000000000..ffad8ef18d148 --- /dev/null +++ b/code/modules/religion/religion_structures.dm @@ -0,0 +1,45 @@ +/obj/structure/altar_of_gods + name = "\improper Altar of the Gods" + desc = "An altar which allows the head of the church to choose a sect of religious teachings as well as provide sacrifices to earn favor." + icon = 'icons/obj/hand_of_god_structures.dmi' + icon_state = "convertaltar" + density = TRUE + anchored = TRUE + layer = TABLE_LAYER + climbable = TRUE + pass_flags = LETPASSTHROW + can_buckle = TRUE + buckle_lying = 90 //we turn to you! + ///Avoids having to check global everytime by referencing it locally. + var/datum/religion_sect/sect_to_altar + +/obj/structure/altar_of_gods/Initialize(mapload) + . = ..() + reflect_sect_in_icons() + +/obj/structure/altar_of_gods/ComponentInitialize() + . = ..() + AddComponent(/datum/component/religious_tool, ALL, FALSE, CALLBACK(src, .proc/reflect_sect_in_icons)) + +/obj/structure/altar_of_gods/attack_hand(mob/living/user) + if(!Adjacent(user) || !user.pulling) + return ..() + if(!isliving(user.pulling)) + return ..() + var/mob/living/pushed_mob = user.pulling + if(pushed_mob.buckled) + to_chat(user, "[pushed_mob] is buckled to [pushed_mob.buckled]!") + return ..() + to_chat(user,"This rite requires more favor!") + return FALSE + to_chat(user, "You begin to perform the rite of [name]...") + if(!LAZYLEN(ritual_invocations)) + if(do_after(user, target = user, delay = ritual_length)) + if(invoke_msg) + user.say(invoke_msg) + return TRUE + return FALSE + var/first_invoke = TRUE + for(var/i in ritual_invocations) + if(first_invoke) //instant invoke + user.say(i) + first_invoke = FALSE + continue + if(!do_after(user, target = user, delay = ritual_length/ritual_invocations.len)) + return FALSE + user.say(i) + if(!do_after(user, target = user, delay = ritual_length/ritual_invocations.len)) //because we start at 0 and not the first fraction in invocations, we still have another fraction of ritual_length to complete + return FALSE + if(invoke_msg) + user.say(invoke_msg) + return TRUE + + +///Does the thing if the rite was successfully performed. return value denotes that the effect successfully (IE a harm rite does harm) +/datum/religion_rites/proc/invoke_effect(mob/living/user, atom/religious_tool) + GLOB.religious_sect.on_riteuse(user,religious_tool) + return TRUE + + +/*********Technophiles**********/ + +/datum/religion_rites/synthconversion + name = "Synthetic Conversion" + desc = "Convert a human-esque individual into a (superior) Android." + ritual_length = 1 MINUTES + ritual_invocations = list("By the inner workings of our god...", + "... We call upon you, in the face of adversity...", + "... to complete us, removing that which is undesirable...") + invoke_msg = "... Arise, our champion! Become that which your soul craves, live in the world as your true form!!" + favor_cost = 500 + +/datum/religion_rites/synthconversion/perform_rite(mob/living/user, atom/religious_tool) + if(!ismovable(religious_tool)) + to_chat(user, "This rite requires a religious device that individuals can be buckled to.") + return FALSE + var/atom/movable/movable_reltool = religious_tool + if(!movable_reltool) + return FALSE + if(!LAZYLEN(movable_reltool.buckled_mobs)) + if(!movable_reltool.can_buckle) //yes, if you have somehow managed to have someone buckled to something that now cannot buckle, we will still let you perform the rite! + to_chat(user, "This rite requires a religious device that individuals can be buckled to.") + return FALSE + to_chat(user, "This rite requires an individual to be buckled to [movable_reltool].") + return FALSE + return ..() + +/datum/religion_rites/synthconversion/invoke_effect(mob/living/user, atom/religious_tool) + if(!ismovable(religious_tool)) + CRASH("[name]'s perform_rite had a movable atom that has somehow turned into a non-movable!") + var/atom/movable/movable_reltool = religious_tool + if(!movable_reltool?.buckled_mobs?.len) + return FALSE + var/mob/living/carbon/human/human2borg = locate() in movable_reltool.buckled_mobs + if(!human2borg) + return FALSE + human2borg.set_species(/datum/species/android) + human2borg.visible_message("[human2borg] has been converted by the rite of [name]!") + return ..() + +/*********Ever-Burning Candle**********/ + +///apply a bunch of fire immunity effect to clothing +/datum/religion_rites/fireproof/proc/apply_fireproof(obj/item/clothing/fireproofed) + fireproofed.name = "unmelting [fireproofed.name]" + fireproofed.max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + fireproofed.heat_protection = chosen_clothing.body_parts_covered + fireproofed.resistance_flags |= FIRE_PROOF + +/datum/religion_rites/fireproof + name = "Unmelting Wax" + desc = "Grants fire immunity to any piece of clothing." + ritual_length = 15 SECONDS + ritual_invocations = list("And so to support the holder of the Ever-Burning candle...", + "... allow this unworthy apparel to serve you ...", + "... make it strong enough to burn a thousand times and more ...") + invoke_msg = "... Come forth in your new form, and join the unmelting wax of the one true flame!" + favor_cost = 500 +///the piece of clothing that will be fireproofed, only one per rite + var/obj/item/clothing/chosen_clothing + +/datum/religion_rites/fireproof/perform_rite(mob/living/user, atom/religious_tool) + var/turf/T = get_turf(religious_tool) + var/list/L = T.contents + if(!locate(/obj/item/clothing) in L) + to_chat(user, "There is no clothing on the altair!") + return FALSE + for(var/obj/item/clothing/apparel in L) + if(apparel.max_heat_protection_temperature >= FIRE_IMMUNITY_MAX_TEMP_PROTECT) + continue //we ignore anything that is already fireproof + chosen_clothing = apparel //the apparel has been chosen by our lord and savior + return ..() + return FALSE + +/datum/religion_rites/fireproof/invoke_effect(mob/living/user, atom/religious_tool) + if(!QDELETED(chosen_clothing) && get_turf(religious_tool) == chosen_clothing.loc) //check if the same clothing is still there + if(istype(chosen_clothing, /obj/item/clothing/suit/hooded) || istype(chosen_clothing, /obj/item/clothing/suit/space/hardsuit)) + for(var/obj/item/clothing/head/integrated_helmet in chosen_clothing.contents) //check if the clothing has a hood/helmet integrated and fireproof it if there is one. + apply_fireproof(integrated_helmet) + apply_fireproof(chosen_clothing) + playsound(get_turf(religious_tool), 'sound/magic/fireball.ogg', 50, TRUE) + chosen_clothing = null //our lord and savior no longer cares about this apparel + return ..() + chosen_clothing = null + to_chat(user, "The clothing that was chosen for the rite is no longer on the altar!") + return FALSE + + +/datum/religion_rites/burning_sacrifice + name = "Candle Fuel" + desc = "Sacrifice a buckled burning corpse for favor, the more burn damage the corpse has, the more favor you will receive." + ritual_length = 20 SECONDS + ritual_invocations = list("To feed the fire of the one true flame ...", + "... to make it burn brighter ...", + "... so that it may consume all in its path ...", + "... I offer you this pitiful being ...") + invoke_msg = "... may it join you in the amalgamation of wax and fire, and become one in the black and white scene. " +///the burning corpse chosen for the sacrifice of the rite + var/mob/living/carbon/chosen_sacrifice + +/datum/religion_rites/burning_sacrifice/perform_rite(mob/living/user, atom/religious_tool) + if(!ismovable(religious_tool)) + to_chat(user, "This rite requires a religious device that individuals can be buckled to.") + return FALSE + var/atom/movable/movable_reltool = religious_tool + if(!movable_reltool) + return FALSE + if(!LAZYLEN(movable_reltool.buckled_mobs)) + to_chat(user, "Nothing is buckled to the altar!") + return FALSE + for(var/corpse in movable_reltool.buckled_mobs) + if(!iscarbon(corpse))// only works with carbon corpse since most normal mobs can't be set on fire. + to_chat(user, "Only carbon lifeforms can be properly burned for the sacrifice!") + return FALSE + chosen_sacrifice = corpse + if(chosen_sacrifice.stat != DEAD) + to_chat(user, "You can only sacrifice dead bodies, this one is still alive!") + chosen_sacrifice = null + return FALSE + if(!chosen_sacrifice.on_fire) + to_chat(user, "This corpse needs to be on fire to be sacrificed!") + chosen_sacrifice = null + return FALSE + return ..() + +/datum/religion_rites/burning_sacrifice/invoke_effect(mob/living/user, atom/movable/religious_tool) + if(!(chosen_sacrifice in religious_tool.buckled_mobs)) //checks one last time if the right corpse is still buckled + to_chat(user, "The right sacrifice is no longer on the altar!") + chosen_sacrifice = null + return FALSE + if(!chosen_sacrifice.on_fire) + to_chat(user, "The sacrifice is no longer on fire, it needs to burn until the end of the rite!") + chosen_sacrifice = null + return FALSE + if(chosen_sacrifice.stat != DEAD) + to_chat(user, "The sacrifice has to stay dead for the rite to work!") + chosen_sacrifice = null + return FALSE + var/favor_gained = 100 + round(chosen_sacrifice.getFireLoss()) + GLOB.religious_sect?.adjust_favor(favor_gained, user) + to_chat(user, "[GLOB.deity] absorbs the burning corpse and any trace of fire with it. [GLOB.deity] rewards you with [favor_gained] favor.") + chosen_sacrifice.dust(force = TRUE) + playsound(get_turf(religious_tool), 'sound/effects/supermatter.ogg', 50, TRUE) + chosen_sacrifice = null + return ..() + + +/datum/religion_rites/infinite_candle + name = "Immortal Candles" + desc = "Creates 5 candles that never run out of wax." + ritual_length = 10 SECONDS + invoke_msg = "please lend us five of your candles so we may bask in your burning glory." + favor_cost = 200 + +/datum/religion_rites/infinite_candle/invoke_effect(mob/living/user, atom/movable/religious_tool) + var/altar_turf = get_turf(religious_tool) + for(var/i in 1 to 5) + new /obj/item/candle/infinite(altar_turf) + playsound(altar_turf, 'sound/magic/fireball.ogg', 50, TRUE) + return ..() diff --git a/code/modules/requests/request.dm b/code/modules/requests/request.dm new file mode 100644 index 0000000000000..1acace4f96962 --- /dev/null +++ b/code/modules/requests/request.dm @@ -0,0 +1,43 @@ +/// Requests from prayers +#define REQUEST_PRAYER "request_prayer" +/// Requests for Centcom +#define REQUEST_CENTCOM "request_centcom" +/// Requests for the Syndicate +#define REQUEST_SYNDICATE "request_syndicate" +/// Requests for the nuke code +#define REQUEST_NUKE "request_nuke" + +/** + * # Request + * + * A representation of an in-game request, such as a prayer. + */ +/datum/request + /// Unique ID of the request + var/id + /// Atomic ID for increment unique request IDs + var/static/atomic_id = 0 + /// The type of request + var/req_type + /// The owner of the request, the player who created it + var/client/owner + /// The ckey of the owner, used for re-binding variables on login + var/owner_ckey + /// The name of the owner, in format /, assigned at time of request creation + var/owner_name + /// The message associated with the request + var/message + /// When the request was created + var/timestamp + +/datum/request/New(client/requestee, type, request) + if (!requestee) + qdel(src) + return + id = ++atomic_id + owner = requestee + owner_ckey = owner.ckey + req_type = type + message = request + timestamp = world.time + owner_name = key_name(requestee, FALSE) diff --git a/code/modules/requests/request_manager.dm b/code/modules/requests/request_manager.dm new file mode 100644 index 0000000000000..c43ce0c526c0f --- /dev/null +++ b/code/modules/requests/request_manager.dm @@ -0,0 +1,214 @@ +GLOBAL_DATUM_INIT(requests, /datum/request_manager, new) + +/** + * # Request Manager + * + * Handles all player requests (prayers, centcom requests, syndicate requests) + * that occur in the duration of a round. + */ +/datum/request_manager + /// Associative list of ckey -> list of requests + var/list/requests = list() + /// List where requests can be accessed by ID + var/list/requests_by_id = list() + +/datum/request_manager/Destroy(force, ...) + QDEL_LIST(requests) + return ..() + +/** + * Used in the new client pipeline to catch when clients are reconnecting and need to have their + * reference re-assigned to the 'owner' variable of any requests + * + * Arguments: + * * C - The client who is logging in + */ +/datum/request_manager/proc/client_login(client/C) + if (!requests[C.ckey]) + return + for (var/datum/request/request as anything in requests[C.ckey]) + request.owner = C + +/** + * Used in the destroy client pipeline to catch when clients are disconnecting and need to have their + * reference nulled on the 'owner' variable of any requests + * + * Arguments: + * * C - The client who is logging out + */ +/datum/request_manager/proc/client_logout(client/C) + if (!requests[C.ckey]) + return + for (var/datum/request/request as anything in requests[C.ckey]) + request.owner = null + +/** + * Creates a request for a prayer, and notifies admins who have the sound notifications enabled when appropriate + * + * Arguments: + * * C - The client who is praying + * * message - The prayer + * * is_chaplain - Boolean operator describing if the prayer is from a chaplain + */ +/datum/request_manager/proc/pray(client/C, message, is_chaplain) + request_for_client(C, REQUEST_PRAYER, message) + for(var/client/admin in GLOB.admins) + if(is_chaplain && admin.prefs.chat_toggles & CHAT_PRAYER && admin.prefs.toggles & SOUND_PRAYERS) + SEND_SOUND(admin, sound('sound/effects/pray.ogg')) + +/** + * Creates a request for a Centcom message + * + * Arguments: + * * C - The client who is sending the request + * * message - The message + */ +/datum/request_manager/proc/message_centcom(client/C, message) + request_for_client(C, REQUEST_CENTCOM, message) + +/** + * Creates a request for a Syndicate message + * + * Arguments: + * * C - The client who is sending the request + * * message - The message + */ +/datum/request_manager/proc/message_syndicate(client/C, message) + request_for_client(C, REQUEST_SYNDICATE, message) + +/** + * Creates a request for the nuclear self destruct codes + * + * Arguments: + * * C - The client who is sending the request + * * message - The message + */ +/datum/request_manager/proc/nuke_request(client/C, message) + request_for_client(C, REQUEST_NUKE, message) + +/** + * Creates a request and registers the request with all necessary internal tracking lists + * + * Arguments: + * * C - The client who is sending the request + * * type - The type of request, see defines + * * message - The message + */ +/datum/request_manager/proc/request_for_client(client/C, type, message) + var/datum/request/request = new(C, type, message) + if (!requests[C.ckey]) + requests[C.ckey] = list() + requests[C.ckey] += request + requests_by_id.len++ + requests_by_id[request.id] = request + +/datum/request_manager/ui_interact(mob/user, datum/tgui/ui = null) + ui = SStgui.try_update_ui(user, src, ui) + if (!ui) + ui = new(user, src, "RequestManager") + ui.open() + +/datum/request_manager/ui_state(mob/user) + return GLOB.admin_state + +/datum/request_manager/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + if (..()) + return + + // Only admins should be sending actions + if (!check_rights(R_ADMIN)) + to_chat(usr, "You do not have permission to do this, you require +ADMIN") + return + + // Get the request this relates to + var/id = params["id"] != null ? text2num(params["id"]) : null + if (!id) + to_chat(usr, "Failed to find a request ID in your action, please report this") + CRASH("Received an action without a request ID, this shouldn't happen!") + var/datum/request/request = !id ? null : requests_by_id[id] + var/datum/admins/admin_datum = GLOB.admin_datums[usr.ckey] + + switch(action) + if ("pp") + var/mob/M = request.owner?.mob + usr.client.holder.show_player_panel(M) + return TRUE + if ("vv") + var/mob/M = request.owner?.mob + usr.client.debug_variables(M) + return TRUE + if ("sm") + var/mob/M = request.owner?.mob + usr.client.cmd_admin_subtle_message(M) + return TRUE + if ("flw") + var/mob/M = request.owner?.mob + admin_datum.admin_follow(M) + return TRUE + if ("tp") + if(!SSticker.HasRoundStarted()) + to_chat(usr,"The game hasn't started yet!") + return TRUE + var/mob/M = request.owner?.mob + if(!ismob(M)) + var/datum/mind/D = M + if(!istype(D)) + to_chat(usr, "This can only be used on instances of type /mob and /mind") + return TRUE + else + D.traitor_panel() + return TRUE + else + usr.client.holder.show_traitor_panel(M) + return TRUE + if ("logs") + var/mob/M = request.owner?.mob + if(!ismob(M)) + to_chat(usr, "This can only be used on instances of type /mob.") + return TRUE + show_individual_logging_panel(M, null, null) + return TRUE + if ("smite") + if(!check_rights(R_FUN)) + to_chat(usr, "Insufficient permissions to smite, you require +FUN") + return TRUE + var/mob/living/carbon/human/H = request.owner?.mob + if (!H || !istype(H)) + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return TRUE + usr.client.smite(H) + return TRUE + if ("rply") + if (request.req_type == REQUEST_PRAYER) + to_chat(usr, "Cannot reply to a prayer") + return TRUE + var/mob/M = request.owner?.mob + usr.client.admin_headset_message(M, request.req_type == REQUEST_SYNDICATE ? RADIO_CHANNEL_SYNDICATE : RADIO_CHANNEL_CENTCOM) + return TRUE + if ("setcode") + if (request.req_type != REQUEST_NUKE) + to_chat(usr, "You cannot set the nuke code for a non-nuke-code-request request!") + return TRUE + var/code = random_nukecode() + for(var/obj/machinery/nuclearbomb/selfdestruct/SD in GLOB.nuke_list) + SD.r_code = code + message_admins("[key_name_admin(usr)] has set the self-destruct code to \"[code]\".") + return TRUE + +/datum/request_manager/ui_data(mob/user) + . = list( + "requests" = list() + ) + for (var/ckey in requests) + for (var/datum/request/request as anything in requests[ckey]) + var/list/data = list( + "id" = request.id, + "req_type" = request.req_type, + "owner" = request.owner ? "[REF(request.owner)]" : null, + "owner_ckey" = request.owner_ckey, + "owner_name" = request.owner_name, + "message" = request.message, + "timestamp" = request.timestamp, + "timestamp_str" = gameTimestamp(wtime = request.timestamp) + ) + .["requests"] += list(data) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index a1c699cfee508..ddae313505043 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -39,6 +39,8 @@ other types of metals and chemistry for reagents). var/research_icon //Replaces the item icon in the research console var/research_icon_state var/icon_cache + /// Optional string that interfaces can use as part of search filters. See- item/borg/upgrade/ai and the Exosuit Fabs. + var/search_metadata /datum/design/error_design name = "ERROR" @@ -74,7 +76,7 @@ other types of metals and chemistry for reagents). name = "Component Design Disk" desc = "A disk for storing device design data for construction in lathes." icon_state = "datadisk1" - materials = list(/datum/material/iron =300, /datum/material/glass =100) + materials = list(/datum/material/iron = 300, /datum/material/glass =100) var/list/blueprints = list() var/max_blueprints = 1 @@ -88,5 +90,5 @@ other types of metals and chemistry for reagents). /obj/item/disk/design_disk/adv name = "Advanced Component Design Disk" desc = "A disk for storing device design data for construction in lathes. This one has extra storage space." - materials = list(/datum/material/iron =300, /datum/material/glass = 100, /datum/material/silver = 50) + materials = list(/datum/material/iron = 300, /datum/material/glass = 100, /datum/material/silver = 50) max_blueprints = 5 diff --git a/code/modules/research/designs/AI_module_designs.dm b/code/modules/research/designs/AI_module_designs.dm index 62b0afbfa221d..c0d09b3f44616 100644 --- a/code/modules/research/designs/AI_module_designs.dm +++ b/code/modules/research/designs/AI_module_designs.dm @@ -154,3 +154,12 @@ build_path = /obj/item/aiModule/core/full/custom category = list("AI Modules") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/dadbot_module + name = "Core Module Design (DadBot)" + desc = "Allows for the construction of a Dadbot AI Core Module." + id = "dadbot_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/copper = 300) + build_path = /obj/item/aiModule/core/full/dadbot + category = list("AI Modules") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index dc08c9dafe5d4..1536d77fa5007 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -25,7 +25,7 @@ id="pushbroom" build_type = AUTOLATHE | PROTOLATHE materials = list(/datum/material/iron = 2000) - build_path = /obj/item/twohanded/pushbroom + build_path = /obj/item/pushbroom category = list("initial","Tools","Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_SERVICE @@ -157,7 +157,7 @@ materials = list(/datum/material/iron = 10, /datum/material/glass = 5) build_path = /obj/item/stack/cable_coil category = list("initial","Tools","Tool Designs") - maxstack = 30 + maxstack = MAXCOIL departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE /datum/design/toolbox @@ -567,12 +567,12 @@ build_path = /obj/item/ammo_casing/shotgun/rubbershot category = list("initial", "Security") -/datum/design/c38 +/datum/design/c38b name = "Speed Loader (.38)" - id = "c38" + id = "c38b" build_type = AUTOLATHE - materials = list(/datum/material/iron = 20000) - build_path = /obj/item/ammo_box/c38 + materials = list(/datum/material/iron = 16000) + build_path = /obj/item/ammo_box/c38/match/bouncy category = list("initial", "Security") /datum/design/recorder @@ -850,6 +850,14 @@ build_path = /obj/item/ammo_box/c9mm category = list("hacked", "Security") +/datum/design/c38 + name = "Speed Loader (.38)" + id = "c38" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 20000) + build_path = /obj/item/ammo_box/c38 + category = list("hacked", "Security") + /datum/design/cleaver name = "Butcher's Cleaver" id = "cleaver" @@ -1039,3 +1047,11 @@ build_path = /obj/item/stack/ducts category = list("initial", "Construction") maxstack = 50 + +/datum/design/airlock_painter/decal + name = "Decal Painter" + id = "decal_painter" + build_type = AUTOLATHE | PROTOLATHE + materials = list(/datum/material/iron = 50, /datum/material/glass = 50) + build_path = /obj/item/airlock_painter/decal + category = list("initial","Tools","Tool Designs") diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm index c2f38c10ceab1..426be5ea6a63e 100644 --- a/code/modules/research/designs/biogenerator_designs.dm +++ b/code/modules/research/designs/biogenerator_designs.dm @@ -59,6 +59,7 @@ make_reagents = list(/datum/reagent/consumable/enzyme = 10) category = list("initial","Food") + /datum/design/flour_sack name = "Flour Sack" id = "flour_sack" @@ -66,7 +67,6 @@ materials = list(/datum/material/biomass= 150) build_path = /obj/item/reagent_containers/food/condiment/flour category = list("initial","Food") - /datum/design/sugar_sack name = "Sugar Sack" id = "sugar_sack" @@ -83,14 +83,6 @@ build_path = /obj/item/reagent_containers/food/snacks/monkeycube category = list("initial", "Food") -/datum/design/strange_seeds - name = "Pack of Strange Seeds" - id = "random" - build_type = BIOGENERATOR - materials = list(/datum/material/biomass = 5000) - build_path = /obj/item/seeds/random - category = list("initial", "Food") - /datum/design/ez_nut name = "E-Z Nutrient" id = "ez_nut" @@ -163,6 +155,14 @@ build_path = /obj/item/stack/sheet/leather category = list("initial","Organic Materials") +/datum/design/toolbelt + name = "Tool Belt" + id = "toolbelt" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass= 300) + build_path = /obj/item/storage/belt/utility + category = list("initial","Organic Materials") + /datum/design/secbelt name = "Security Belt" id = "secbelt" @@ -202,3 +202,11 @@ materials = list(/datum/material/biomass= 300) build_path = /obj/item/clothing/head/rice_hat category = list("initial","Organic Materials") + +/datum/design/carton_soy_milk + name = "Soy Milk Carton" + id = "soy_milk_carton" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/food/condiment/soymilk + category = list("initial","Food") diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 48ccfef8e3aa8..27217c5356e3e 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -22,6 +22,14 @@ category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_ALL +/datum/design/board/amputation_adventure + name = "Computer Design (Mediborg's Amputation Adventure)" + desc = "Allows for the construction of circuit boards used to build a new Mediborg's Amputation Adventure machine." + id = "arcade_amputation" + build_path = /obj/item/circuitboard/computer/arcade/amputation + category = list("Computer Boards") + departmental_flags = DEPARTMENTAL_FLAG_ALL + /datum/design/board/seccamera name = "Computer Design (Security Camera)" desc = "Allows for the construction of circuit boards used to build security camera computers." @@ -216,6 +224,14 @@ category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_CARGO +/datum/design/board/objective + name = "Computer Design (Objective Console)" + desc = "Allows for the construction of circuit boards used to build a Objective Console." + id = "objective" + build_path = /obj/item/circuitboard/computer/objective + category = list("Computer Boards") + departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE + /datum/design/board/cargorequest name = "Computer Design (Supply Request Console)" desc = "Allows for the construction of circuit boards used to build a Supply Request Console." @@ -319,11 +335,3 @@ 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/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/electronics_designs.dm b/code/modules/research/designs/electronics_designs.dm index 5035d1644c634..83bf900dee9a2 100644 --- a/code/modules/research/designs/electronics_designs.dm +++ b/code/modules/research/designs/electronics_designs.dm @@ -56,40 +56,6 @@ category = list("Electronics") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE -/////////////////////////////////// -//////////Circuit Stuff//////////// -/////////////////////////////////// -/datum/design/integrated_printer - name = "Integrated circuit printer" - desc = "This machine provides all necessary things for circuitry." - id = "icprinter" - build_type = PROTOLATHE - materials = list(/datum/material/glass = 5000, /datum/material/iron = 10000, /datum/material/copper = 2000) - build_path = /obj/item/integrated_circuit_printer - category = list("Electronics") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/IC_printer_upgrade_advanced - name = "Integrated circuit printer upgrade: Advanced Designs" - desc = "This disk allows for integrated circuit printers to print advanced circuitry designs." - id = "icupgadv" - build_type = PROTOLATHE - materials = list(/datum/material/glass = 10000, /datum/material/iron = 10000, /datum/material/copper = 4000) - build_path = /obj/item/disk/integrated_circuit/upgrade/advanced - category = list("Electronics") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/IC_printer_upgrade_clone - name = "Integrated circuit printer upgrade: Instant Cloning" - desc = "This disk allows for integrated circuit printers to clone designs instantaneously." - id = "icupgclo" - build_type = PROTOLATHE - materials = list(/datum/material/glass = 10000, /datum/material/iron = 10000, /datum/material/copper = 4000) - build_path = /obj/item/disk/integrated_circuit/upgrade/clone - category = list("Electronics") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - - //////////////////////////////////////// //////////Disk Construction Disks/////// //////////////////////////////////////// diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 4e8139d8790fa..1c76423e24da6 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -91,8 +91,8 @@ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE /datum/design/board/thermomachine - name = "Machine Design (Freezer/Heater Board)" - desc = "The circuit board for a freezer/heater." + name = "Machine Design (Thermomachine Board)" + desc = "The circuit board for a thermomachine." id = "thermomachine" build_path = /obj/item/circuitboard/machine/thermomachine category = list ("Engineering Machinery") @@ -475,14 +475,6 @@ category = list ("Misc. Machinery") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING -/datum/design/board/bluespace_miner - name = "Machine Design (Bluespace Miner)" - desc = "The circuit board for a Bluespace Miner." - id = "bluespace_miner" - build_path = /obj/item/circuitboard/machine/bluespace_miner - category = list ("Misc. Machinery") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING - /datum/design/board/mining_equipment_vendor name = "Machine Design (Mining Rewards Vendor Board)" desc = "The circuit board for a Mining Rewards Vendor." @@ -491,6 +483,14 @@ category = list ("Misc. Machinery") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_CARGO +/datum/design/board/exploration_equipment_vendor + name = "Machine Design (Exploration Rewards Vendor Board)" + desc = "The circuit board for an Exploration Rewards Vendor." + id = "exploration_equipment_vendor" + build_path = /obj/item/circuitboard/machine/exploration_equipment_vendor + category = list ("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_CARGO + /datum/design/board/tesla_coil name = "Machine Design (Tesla Coil Board)" desc = "The circuit board for a tesla coil." @@ -627,18 +627,10 @@ category = list("Medical Machinery") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL -/datum/design/board/autodoc - name = "Machine Design (Autodoc)" - desc = "The circuit board for an Autodoc." - id = "autodoc" - build_path = /obj/item/circuitboard/machine/autodoc - category = list("Medical Machinery") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/board/spaceship_navigation_beacon - name = "Machine Design (Bluespace Navigation Gigabeacon)" - desc = "The circuit board for a Bluespace Navigation Gigabeacon." - id = "spaceship_navigation_beacon" - build_path = /obj/item/circuitboard/machine/spaceship_navigation_beacon - category = list ("Teleportation Machinery") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE +/datum/design/board/component_printer + name = "Machine Design (Component Printer)" + desc = "The circuit board for a component printer" + id = "component_printer" + build_path = /obj/item/circuitboard/machine/component_printer + category = list("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm index b738fce19164b..1607bf477d0dc 100644 --- a/code/modules/research/designs/mecha_designs.dm +++ b/code/modules/research/designs/mecha_designs.dm @@ -224,19 +224,8 @@ construction_time = 100 category = list("Exosuit Equipment") -/datum/design/mech_missile_rack - name = "Exosuit Weapon (SRM-8 Missile Rack)" - desc = "Allows for the construction of an SRM-8 Missile Rack." - id = "mech_missile_rack" - build_type = PROTOLATHE - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack - materials = list(/datum/material/iron=22000,/datum/material/gold=6000,/datum/material/silver=8000) - construction_time = 100 - category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - /datum/design/clusterbang_launcher - name = "Exosuit Module (SOB-3 Clusterbang Launcher)" + name = "Exosuit Weapon (SOB-3 Clusterbang Launcher)" desc = "A weapon that violates the Geneva Convention at 3 rounds per minute" id = "clusterbang_launcher" build_type = PROTOLATHE @@ -337,7 +326,7 @@ category = list("Exosuit Equipment") /datum/design/mech_diamond_drill - name = "Exosuit Module (Diamond Mining Drill)" + name = "Exosuit Mining (Diamond Mining Drill)" desc = "An upgraded version of the standard drill." id = "mech_diamond_drill" build_type = MECHFAB @@ -357,7 +346,7 @@ category = list("Exosuit Equipment") /datum/design/mech_plasma_cutter - name = "Exosuit Module Design (217-D Heavy Plasma Cutter)" + name = "Exosuit Mining (217-D Heavy Plasma Cutter)" desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles." id = "mech_plasma_cutter" build_type = MECHFAB @@ -378,7 +367,7 @@ departmental_flags = DEPARTMENTAL_FLAG_SECURITY /datum/design/mech_sleeper - name = "Exosuit Medical Equipment (Mounted Sleeper)" + name = "Exosuit Medical (Mounted Sleeper)" desc = "Equipment for medical exosuits. A mounted sleeper that stabilizes patients and can inject reagents in the exosuit's reserves." id = "mech_sleeper" build_type = MECHFAB @@ -388,7 +377,7 @@ category = list("Exosuit Equipment") /datum/design/mech_syringe_gun - name = "Exosuit Medical Equipment (Syringe Gun)" + name = "Exosuit Medical (Syringe Gun)" desc = "Equipment for medical exosuits. A chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur." id = "mech_syringe_gun" build_type = MECHFAB @@ -398,7 +387,7 @@ category = list("Exosuit Equipment") /datum/design/mech_medical_beamgun - name = "Exosuit Medical Equipment (Medical Beamgun)" + name = "Exosuit Medical (Medical Beamgun)" desc = "Equipment for medical exosuits. A mounted medical nanite projector which will treat patients with a focused beam." id = "mech_medi_beam" build_type = MECHFAB diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 60093787a9925..4735b00259ea9 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -476,7 +476,7 @@ //Exosuit Equipment /datum/design/ripleyupgrade - name = "Ripley MK-1 to MK-II conversion kit" + name = "Ripley MK-I to MK-II conversion kit" id = "ripleyupgrade" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/ripleyupgrade @@ -485,7 +485,7 @@ category = list("Exosuit Equipment") /datum/design/mech_hydraulic_clamp - name = "Exosuit Engineering Equipment (Hydraulic Clamp)" + name = "Exosuit Engineering (Hydraulic Clamp)" id = "mech_hydraulic_clamp" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp @@ -494,7 +494,7 @@ category = list("Exosuit Equipment") /datum/design/mech_drill - name = "Exosuit Engineering Equipment (Drill)" + name = "Exosuit Mining (Mining Drill)" id = "mech_drill" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/drill @@ -503,7 +503,7 @@ category = list("Exosuit Equipment") /datum/design/mech_mining_scanner - name = "Exosuit Engineering Equipment (Mining Scanner)" + name = "Exosuit Engineering (Mining Scanner)" id = "mech_mscanner" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/mining_scanner @@ -512,7 +512,7 @@ category = list("Exosuit Equipment") /datum/design/mech_extinguisher - name = "Exosuit Engineering Equipment (Extinguisher)" + name = "Exosuit Engineering (Extinguisher)" id = "mech_extinguisher" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/extinguisher @@ -521,7 +521,7 @@ category = list("Exosuit Equipment") /datum/design/mech_generator - name = "Exosuit Equipment (Plasma Generator)" + name = "Exosuit Module (Plasma Generator)" id = "mech_generator" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/generator @@ -530,7 +530,7 @@ category = list("Exosuit Equipment") /datum/design/mech_mousetrap_mortar - name = "H.O.N.K Mousetrap Mortar" + name = "H.O.N.K Weapon (Mousetrap Mortar)" id = "mech_mousetrap_mortar" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar @@ -539,7 +539,7 @@ category = list("Exosuit Equipment") /datum/design/mech_banana_mortar - name = "H.O.N.K Banana Mortar" + name = "H.O.N.K Weapon (Banana Mortar)" id = "mech_banana_mortar" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar @@ -548,7 +548,7 @@ category = list("Exosuit Equipment") /datum/design/mech_honker - name = "HoNkER BlAsT 5000" + name = "H.O.N.K Weapon (HoNkER BlAsT 5000)" id = "mech_honker" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/honker @@ -557,7 +557,7 @@ category = list("Exosuit Equipment") /datum/design/mech_punching_glove - name = "Oingo Boingo Punch-face" + name = "H.O.N.K Weapon (Oingo Boingo Punch-face)" id = "mech_punching_face" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove @@ -668,6 +668,15 @@ construction_time = 120 category = list("Cyborg Upgrade Modules") +/datum/design/borg_transform_security + name = "Cyborg Upgrade (Security Module)" + id = "borg_transform_security" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/transform/security + materials = list(/datum/material/iron = 15000, /datum/material/glass = 15000, /datum/material/diamond = 3000) + construction_time = 120 + category = list("Cyborg Upgrade Modules") + /datum/design/borg_upgrade_selfrepair name = "Cyborg Upgrade (Self-repair)" id = "borg_upgrade_selfrepair" @@ -747,7 +756,8 @@ build_path = /obj/item/borg/upgrade/ai materials = list(/datum/material/iron = 1200, /datum/material/glass = 1500, /datum/material/gold = 200) construction_time = 50 - category = list("Misc") + category = list("Control Interfaces") + search_metadata = "boris" /datum/design/borg_upgrade_rped name = "Cyborg Upgrade (RPED)" @@ -787,13 +797,13 @@ //Misc /datum/design/mecha_tracking - name = "Exosuit Tracking Beacon" + name = "Exosuit Tracker (Exosuit Tracking Beacon)" id = "mecha_tracking" build_type = MECHFAB build_path =/obj/item/mecha_parts/mecha_tracking materials = list(/datum/material/iron=500) construction_time = 50 - category = list("Misc") + category = list("Exosuit Equipment") /datum/design/mecha_tracking_ai_control name = "AI Control Beacon" @@ -802,7 +812,7 @@ build_path = /obj/item/mecha_parts/mecha_tracking/ai_control materials = list(/datum/material/iron = 1000, /datum/material/glass = 500, /datum/material/silver = 200) construction_time = 50 - category = list("Misc") + category = list("Control Interfaces") /datum/design/synthetic_flash name = "Flash" @@ -847,7 +857,7 @@ name = "Micro-cell" id = "robotic_stomach" build_type = MECHFAB - build_path = /obj/item/organ/stomach/cell + build_path = /obj/item/organ/stomach/battery/ipc materials = list(/datum/material/iron = 2000, /datum/material/glass = 2000, /datum/material/plasma = 200) construction_time = 100 category = list("IPC Components") @@ -869,3 +879,41 @@ materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000) construction_time = 100 category = list("IPC Components") + +//service modules + +/datum/design/borg_upgrade_botany + name = "Cyborg Speciality (Botany)" + id = "borg_upgrade_botany" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/speciality/botany + materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000) + construction_time = 40 + category = list("Cyborg Upgrade Modules") + +/datum/design/borg_upgrade_kitchen + name = "Cyborg Speciality (Cooking)" + id = "borg_upgrade_kitchen" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/speciality/kitchen + materials = list(/datum/material/iron = 2000, /datum/material/silver = 500) + construction_time = 40 + category = list("Cyborg Upgrade Modules") + +/datum/design/borg_upgrade_casino + name = "Cyborg Speciality (Casino)" + id = "borg_upgrade_casino" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/speciality/casino + materials = list(/datum/material/iron = 2000, /datum/material/gold = 500) + construction_time = 40 + category = list("Cyborg Upgrade Modules") + +/datum/design/borg_upgrade_party + name = "Cyborg Speciality (Party)" + id = "borg_upgrade_party" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/speciality/party + materials = list(/datum/material/iron = 2000, /datum/material/diamond = 500) + construction_time = 40 + category = list("Cyborg Upgrade Modules") diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 5cecdc6872db7..9caadd155daf1 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -10,7 +10,7 @@ materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) construction_time = 75 build_path = /obj/item/mmi - category = list("Misc","Medical Designs") + category = list("Control Interfaces", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE /datum/design/posibrain @@ -21,7 +21,7 @@ materials = list(/datum/material/iron = 1700, /datum/material/glass = 1350, /datum/material/gold = 500, /datum/material/copper = 500) //Gold, because SWAG. construction_time = 75 build_path = /obj/item/mmi/posibrain - category = list("Misc", "Medical Designs") + category = list("Control Interfaces", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE /datum/design/bluespacebeaker @@ -88,7 +88,7 @@ id = "noreactsyringe" build_type = PROTOLATHE materials = list(/datum/material/glass = 2000, /datum/material/gold = 1000) - build_path = /obj/item/reagent_containers/syringe/noreact + build_path = /obj/item/reagent_containers/syringe/cryo category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL @@ -243,7 +243,7 @@ construction_time = 40 materials = list(/datum/material/iron = 600, /datum/material/glass = 400, /datum/material/copper = 200) build_path = /obj/item/organ/eyes/robotic/shield - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_gloweyes @@ -254,7 +254,7 @@ construction_time = 40 materials = list(/datum/material/iron = 600, /datum/material/glass = 1000, /datum/material/copper = 200) build_path = /obj/item/organ/eyes/robotic/glow - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_breather @@ -265,7 +265,7 @@ construction_time = 35 materials = list(/datum/material/iron = 600, /datum/material/glass = 250, /datum/material/copper = 200) build_path = /obj/item/organ/cyberimp/mouth/breathing_tube - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_surgical @@ -276,7 +276,7 @@ materials = list (/datum/material/iron = 2500, /datum/material/glass = 1500, /datum/material/silver = 1500, /datum/material/copper = 200) construction_time = 200 build_path = /obj/item/organ/cyberimp/arm/surgery - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_toolset @@ -287,7 +287,29 @@ materials = list (/datum/material/iron = 2500, /datum/material/glass = 1500, /datum/material/silver = 1500, /datum/material/copper = 200) construction_time = 200 build_path = /obj/item/organ/cyberimp/arm/toolset - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/cyberimp_botany + name = "Botanical toolset implant" + desc = "Everything a botanist needs in an arm implant, designed to be installed on a subject's arm." + id = "ci-botany" + build_type = MECHFAB | PROTOLATHE + materials = list (/datum/material/iron = 3500, /datum/material/glass = 1500, /datum/material/silver = 1500, /datum/material/plastic = 2000) + construction_time = 200 + build_path = /obj/item/organ/cyberimp/arm/botany + category = list("Implants", "Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/cyberimp_janitor + name = "Janitorial Arm Implant" + desc = "A set of janitor tools fitted into an arm implant, designed to be installed on subject's arm." + id = "ci-janitor" + build_type = PROTOLATHE | MECHFAB + materials = list (/datum/material/iron = 3500, /datum/material/glass = 1500, /datum/material/silver = 1500) + construction_time = 200 + build_path = /obj/item/organ/cyberimp/arm/janitor + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_medical_hud @@ -298,7 +320,7 @@ construction_time = 50 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 500, /datum/material/gold = 500, /datum/material/copper = 200) build_path = /obj/item/organ/cyberimp/eyes/hud/medical - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_security_hud @@ -309,7 +331,7 @@ construction_time = 50 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 750, /datum/material/gold = 750, /datum/material/copper = 200) build_path = /obj/item/organ/cyberimp/eyes/hud/security - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_diagnostic_hud @@ -320,7 +342,7 @@ construction_time = 50 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 600, /datum/material/gold = 600, /datum/material/copper = 200) build_path = /obj/item/organ/cyberimp/eyes/hud/diagnostic - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_xray @@ -331,7 +353,7 @@ construction_time = 60 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 600, /datum/material/gold = 600, /datum/material/plasma = 1000, /datum/material/uranium = 1000, /datum/material/diamond = 1000, /datum/material/bluespace = 1000, /datum/material/copper = 200) build_path = /obj/item/organ/eyes/robotic/xray - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_thermals @@ -342,7 +364,7 @@ construction_time = 60 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 600, /datum/material/gold = 600, /datum/material/plasma = 1000, /datum/material/diamond = 2000, /datum/material/copper = 200) build_path = /obj/item/organ/eyes/robotic/thermals - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_antidrop @@ -353,7 +375,7 @@ construction_time = 60 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 400, /datum/material/gold = 400, /datum/material/copper = 200) build_path = /obj/item/organ/cyberimp/brain/anti_drop - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_antistun @@ -364,7 +386,7 @@ construction_time = 60 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 500, /datum/material/gold = 1000, /datum/material/copper = 200) build_path = /obj/item/organ/cyberimp/brain/anti_stun - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_nutriment @@ -375,7 +397,7 @@ construction_time = 40 materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/gold = 500, /datum/material/copper = 200) build_path = /obj/item/organ/cyberimp/chest/nutriment - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_nutriment_plus @@ -386,7 +408,7 @@ construction_time = 50 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/gold = 500, /datum/material/uranium = 750, /datum/material/copper = 200) build_path = /obj/item/organ/cyberimp/chest/nutriment/plus - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_reviver @@ -397,7 +419,7 @@ construction_time = 60 materials = list(/datum/material/iron = 800, /datum/material/glass = 800, /datum/material/gold = 300, /datum/material/uranium = 500, /datum/material/copper = 200) build_path = /obj/item/organ/cyberimp/chest/reviver - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_thrusters @@ -408,7 +430,7 @@ construction_time = 80 materials = list(/datum/material/iron = 4000, /datum/material/glass = 2000, /datum/material/silver = 1000, /datum/material/diamond = 1000, /datum/material/copper = 200) build_path = /obj/item/organ/cyberimp/chest/thrusters - category = list("Misc", "Medical Designs") + category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cyberimp_hydraulic_blade @@ -419,7 +441,7 @@ construction_time = 250 materials = list(/datum/material/iron = 5000, /datum/material/glass = 5000, /datum/material/silver = 10000, /datum/material/diamond = 3000, /datum/material/titanium = 8000, /datum/material/bluespace = 2000, /datum/material/plasma = 5000) build_path = /obj/item/organ/cyberimp/arm/hydraulic_blade - category = list("Misc", "Medical Designs") + category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL ///////////////////////////////////////// @@ -486,7 +508,7 @@ construction_time = 40 materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/copper = 200) build_path = /obj/item/organ/liver/cybernetic - category = list("Misc", "Medical Designs") + category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cybernetic_liver_u @@ -497,7 +519,7 @@ construction_time = 50 materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/copper = 200) build_path = /obj/item/organ/liver/cybernetic/upgraded - category = list("Misc", "Medical Designs") + category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cybernetic_heart @@ -508,7 +530,7 @@ construction_time = 40 materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/copper = 200) build_path = /obj/item/organ/heart/cybernetic - category = list("Misc", "Medical Designs") + category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cybernetic_heart_u @@ -519,7 +541,7 @@ construction_time = 50 materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver=500, /datum/material/copper = 300) build_path = /obj/item/organ/heart/cybernetic/upgraded - category = list("Misc", "Medical Designs") + category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cybernetic_lungs @@ -530,7 +552,7 @@ construction_time = 40 materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/copper = 200) build_path = /obj/item/organ/lungs/cybernetic - category = list("Misc", "Medical Designs") + category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cybernetic_lungs_u @@ -541,7 +563,7 @@ construction_time = 50 materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 500, /datum/material/copper = 300) build_path = /obj/item/organ/lungs/cybernetic/upgraded - category = list("Misc", "Medical Designs") + category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/wingpack @@ -552,7 +574,7 @@ construction_time = 500 materials = list(/datum/material/iron = 10000, /datum/material/glass = 1000, /datum/material/uranium = 4000, /datum/material/silver = 100, /datum/material/titanium = 8000, /datum/material/plasma = 10000) build_path = /obj/item/organ/wings/cybernetic - category = list("Misc", "Medical Designs") + category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/wingpack_alien @@ -563,7 +585,7 @@ construction_time = 1000 materials = list(/datum/material/iron = 10000, /datum/material/glass = 1000, /datum/material/uranium = 500, /datum/material/silver = 100, /datum/material/titanium = 8000, /datum/material/bluespace = 2000, /datum/material/plasma = 5000) build_path = /obj/item/organ/wings/cybernetic/ayy - category = list("Misc", "Medical Designs") + category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL ///////////////////// diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 720822cd7251c..a66624151f3f5 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -67,36 +67,6 @@ //////////////////Misc/////////////////// ///////////////////////////////////////// -/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 - /datum/design/welding_mask name = "Welding Gas Mask" desc = "A gas mask with built in welding goggles and face shield. Looks like a skull, clearly designed by a nerd." @@ -364,7 +334,6 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SERVICE - /datum/design/holosignsec name = "Security Holobarrier Projector" desc = "A holographic projector that creates holographic security barriers." @@ -491,3 +460,44 @@ build_path = /obj/item/construction/plumbing category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/glasses_prescription + name = "Prescription Glasses" + desc = "Made by Nerd. Co." + id = "glasses_prescription" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 2000) + build_path = /obj/item/clothing/glasses/regular + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +///////////////////////////////////////// +/////////////////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 diff --git a/code/modules/research/designs/nanite_designs.dm b/code/modules/research/designs/nanite_designs.dm index 87c64edc5f593..566fb5e5de933 100644 --- a/code/modules/research/designs/nanite_designs.dm +++ b/code/modules/research/designs/nanite_designs.dm @@ -244,13 +244,6 @@ program_type = /datum/nanite_program/conductive category = list("Augmentation Nanites") -/datum/design/nanites/adrenaline - name = "Adrenaline Burst" - desc = "The nanites cause a burst of adrenaline when triggered, waking the host from stuns and temporarily increasing their speed." - id = "adrenaline_nanites" - program_type = /datum/nanite_program/adrenaline - category = list("Augmentation Nanites") - /datum/design/nanites/mindshield name = "Mental Barrier" desc = "The nanites form a protective membrane around the host's brain, shielding them from abnormal influences while they're active." @@ -258,6 +251,13 @@ program_type = /datum/nanite_program/mindshield category = list("Augmentation Nanites") +/datum/design/nanites/adrenaline + name = "Adrenaline Burst" + desc = "The nanites cause a burst of adrenaline when triggered, waking the host from stuns and temporarily increasing their speed." + id = "adrenaline_nanites" + program_type = /datum/nanite_program/adrenaline + category = list("Augmentation Nanites") + ////////////////////DEFECTIVE NANITES////////////////////////////////////// /datum/design/nanites/glitch @@ -389,6 +389,13 @@ program_type = /datum/nanite_program/comm/mind_control category = list("Weaponized Nanites") +/datum/design/nanites/haste + name = "Amphetamine Injection" + desc = "The nanites synthesize amphetamine when triggered, which temporarily increases the host's running speed." + id = "haste_nanites" + program_type = /datum/nanite_program/haste + category = list("Weaponized Nanites") + ////////////////////SUPPRESSION NANITES////////////////////////////////////// /datum/design/nanites/shock diff --git a/code/modules/research/designs/smelting_designs.dm b/code/modules/research/designs/smelting_designs.dm index 4bebd6e72ee49..791787c9871c3 100644 --- a/code/modules/research/designs/smelting_designs.dm +++ b/code/modules/research/designs/smelting_designs.dm @@ -1,7 +1,7 @@ ///////SMELTABLE ALLOYS/////// /datum/design/plasteel_alloy - name = "Plasma + Iron alloy" + name = "Plasteel (Plasma + Iron alloy)" id = "plasteel" build_type = SMELTER | PROTOLATHE materials = list(/datum/material/iron = MINERAL_MATERIAL_AMOUNT, /datum/material/plasma = MINERAL_MATERIAL_AMOUNT) @@ -12,7 +12,7 @@ /datum/design/plastitanium_alloy - name = "Plasma + Titanium alloy" + name = "Plastitanium (Plasma + Titanium alloy)" id = "plastitanium" build_type = SMELTER | PROTOLATHE materials = list(/datum/material/titanium = MINERAL_MATERIAL_AMOUNT, /datum/material/plasma = MINERAL_MATERIAL_AMOUNT) @@ -22,7 +22,7 @@ maxstack = 50 /datum/design/plaglass_alloy - name = "Plasma + Glass alloy" + name = "Plasma Glass (Plasma + Glass alloy)" id = "plasmaglass" build_type = SMELTER | PROTOLATHE materials = list(/datum/material/plasma = MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = MINERAL_MATERIAL_AMOUNT) @@ -32,7 +32,7 @@ maxstack = 50 /datum/design/plasmarglass_alloy - name = "Plasma + Iron + Glass alloy" + name = "Plasma Reinforced Glass (Plasma + Iron + Glass alloy)" id = "plasmareinforcedglass" build_type = SMELTER | PROTOLATHE materials = list(/datum/material/plasma = MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/iron = MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = MINERAL_MATERIAL_AMOUNT) @@ -42,7 +42,7 @@ maxstack = 50 /datum/design/titaniumglass_alloy - name = "Titanium + Glass alloy" + name = "Titanium Glass (Titanium + Glass alloy)" id = "titaniumglass" build_type = SMELTER | PROTOLATHE materials = list(/datum/material/titanium = MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = MINERAL_MATERIAL_AMOUNT) @@ -52,7 +52,7 @@ maxstack = 50 /datum/design/plastitaniumglass_alloy - name = "Plasma + Titanium + Glass alloy" + name = "Plastitanium glass (Plasma + Titanium + Glass alloy)" id = "plastitaniumglass" build_type = SMELTER | PROTOLATHE materials = list(/datum/material/plasma = MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/titanium = MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = MINERAL_MATERIAL_AMOUNT) diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm index 86128c6ea151a..1dc5e11cbcd36 100644 --- a/code/modules/research/designs/tool_designs.dm +++ b/code/modules/research/designs/tool_designs.dm @@ -5,19 +5,19 @@ /datum/design/handdrill name = "Hand Drill" - desc = "A small electric hand drill with an interchangeable screwdriver and bolt bit" + desc = "A small electric hand drill with an interchangeable screwdriver and bolt bit." id = "handdrill" build_type = PROTOLATHE materials = list(/datum/material/iron = 3500, /datum/material/silver = 1500, /datum/material/titanium = 2500) - build_path = /obj/item/screwdriver/power + build_path = /obj/item/powertool/hand_drill category = list("Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING /datum/design/jawsoflife name = "Jaws of Life" - desc = "A small, compact Jaws of Life with an interchangeable pry jaws and cutting jaws" + desc = "A small, compact Jaws of Life with an interchangeable pry jaws and cutting jaws." id = "jawsoflife" // added one more requirment since the Jaws of Life are a bit OP - build_path = /obj/item/crowbar/power + build_path = /obj/item/powertool/jaws_of_life build_type = PROTOLATHE materials = list(/datum/material/iron = 4500, /datum/material/silver = 2500, /datum/material/titanium = 3500) category = list("Tool Designs") @@ -25,7 +25,7 @@ /datum/design/shuttlecreator name = "Rapid Shuttle Designator" - desc = "An advanced device capable of defining areas for use in the creation of shuttles" + 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 @@ -43,6 +43,16 @@ category = list("Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING +/datum/design/ranged_analyzer + name = "Long-range Analyzer" + desc = "A new advanced atmospheric analyzer design, capable of performing scans at long range." + id = "ranged_analyzer" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 400, /datum/material/glass = 1000, /datum/material/uranium = 800, /datum/material/gold = 200, /datum/material/plastic = 200) + build_path = /obj/item/analyzer/ranged + category = list("Tool Designs") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + /datum/design/rpd name = "Rapid Pipe Dispenser (RPD)" id = "rpd_loaded" @@ -220,3 +230,12 @@ materials = list(/datum/material/iron = 2000, /datum/material/silver = 1500, /datum/material/plasma = 500, /datum/material/titanium = 1500) category = list("Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/discoveryscanner + name = "Discovery Scanner" + id = "discovery_scanner" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 200, /datum/material/glass = 50) + build_path = /obj/item/discovery_scanner + category = list("Tool Designs") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 1ed7af08232a5..3dd3e7eca9a6e 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -327,6 +327,16 @@ category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY +/datum/design/mag_oldsmg/rubber + name = "WT-550 Rubber Auto Gun Magazine (4.6x30mm Rubber)" + desc = "A 20 round magazine for the out of date security WT-550 Auto Rifle" + id = "mag_oldsmg_rubber" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 3000) + build_path = /obj/item/ammo_box/magazine/wt550m9/rubber + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + /datum/design/mag_oldsmg/ap_mag name = "WT-550 Auto Gun Armour Piercing Magazine (4.6x30mm AP)" desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle" @@ -401,7 +411,7 @@ materials = list(/datum/material/iron = 3500) build_path = /obj/item/ammo_casing/shotgun/dart/noreact category = list("Ammo") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + departmental_flags = DEPARTMENTAL_FLAG_SECURITY /datum/design/flashbulb name = "Security Flashbulb" diff --git a/code/modules/research/designs/wiremod_designs.dm b/code/modules/research/designs/wiremod_designs.dm new file mode 100644 index 0000000000000..c6511c00d44ec --- /dev/null +++ b/code/modules/research/designs/wiremod_designs.dm @@ -0,0 +1,391 @@ +/datum/design/integrated_circuit + name = "Integrated Circuit" + desc = "The foundation of all circuits. All Circuitry go onto this." + id = "integrated_circuit" + build_path = /obj/item/integrated_circuit + build_type = IMPRINTER | COMPONENT_PRINTER + category = list(WIREMOD_CIRCUITRY, WIREMOD_CORE) + materials = list(/datum/material/glass = 1000, /datum/material/iron = 1000, /datum/material/copper = 500) + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/circuit_multitool + name = "Circuit Multitool" + desc = "A circuit multitool to mark entities and load them into." + id = "circuit_multitool" + build_path = /obj/item/multitool/circuit + build_type = PROTOLATHE | COMPONENT_PRINTER + category = list(WIREMOD_CIRCUITRY, WIREMOD_CORE) + materials = list(/datum/material/glass = 1000, /datum/material/iron = 1000, /datum/material/copper = 500) + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/usb_cable + name = "USB Cable" + desc = "A cable that allows certain shells to connect to nearby computers and machines." + id = "usb_cable" + build_path = /obj/item/usb_cable + build_type = PROTOLATHE | COMPONENT_PRINTER + category = list(WIREMOD_CIRCUITRY, WIREMOD_CORE) + // Yes, it would make sense to make them take plastic, but then less people would make them, and I think they're cool + materials = list(/datum/material/iron = 1000, /datum/material/copper = 1500) + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/component + name = "Component ( NULL ENTRY )" + desc = "A component that goes into an integrated circuit." + build_type = IMPRINTER | COMPONENT_PRINTER + materials = list(/datum/material/glass = 500, /datum/material/copper = 1500) + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + category = list(WIREMOD_CIRCUITRY) + +/datum/design/component/New() + . = ..() + if(build_path) + var/obj/item/circuit_component/component_path = build_path + desc = initial(component_path.display_desc) + +/datum/design/component/arbitrary_input_amount/arithmetic + name = "Arithmetic Component" + id = "comp_arithmetic" + build_path = /obj/item/circuit_component/arbitrary_input_amount/arithmetic + category = list(WIREMOD_CIRCUITRY, WIREMOD_MATH_COMPONENTS) + +/datum/design/component/arbitrary_input_amount/bitwise + name = "Bitwise Component" + id = "comp_bitwise" + build_path = /obj/item/circuit_component/arbitrary_input_amount/bitwise + category = list(WIREMOD_CIRCUITRY, WIREMOD_MATH_COMPONENTS) + +/datum/design/component/bitflag + name = "Bitflag Component" + id = "comp_bitflag" + build_path = /obj/item/circuit_component/compare/bitflag + category = list(WIREMOD_CIRCUITRY, WIREMOD_MATH_COMPONENTS, WIREMOD_LOGIC_COMPONENTS) + +/datum/design/component/clock + name = "Clock Component" + id = "comp_clock" + build_path = /obj/item/circuit_component/clock + category = list(WIREMOD_CIRCUITRY, WIREMOD_TIME_COMPONENTS) + +/datum/design/component/comparison + name = "Comparison Component" + id = "comp_comparison" + build_path = /obj/item/circuit_component/compare/comparison + category = list(WIREMOD_CIRCUITRY, WIREMOD_LOGIC_COMPONENTS) + +/datum/design/component/logic + name = "Logic Component" + id = "comp_logic" + build_path = /obj/item/circuit_component/compare/logic + category = list(WIREMOD_CIRCUITRY, WIREMOD_LOGIC_COMPONENTS) + +/datum/design/component/delay + name = "Delay Component" + id = "comp_delay" + build_path = /obj/item/circuit_component/delay + category = list(WIREMOD_CIRCUITRY, WIREMOD_TIME_COMPONENTS) + +/datum/design/component/index + name = "Index Component" + id = "comp_index" + build_path = /obj/item/circuit_component/indexer/index + category = list(WIREMOD_CIRCUITRY, WIREMOD_LIST_COMPONENTS) + +/datum/design/component/write + name = "Write Component" + id = "comp_write" + build_path = /obj/item/circuit_component/indexer/write + category = list(WIREMOD_CIRCUITRY, WIREMOD_LIST_COMPONENTS) + +/datum/design/component/append + name = "Append Component" + id = "comp_append" + build_path = /obj/item/circuit_component/append + category = list(WIREMOD_CIRCUITRY, WIREMOD_LIST_COMPONENTS) + +/datum/design/component/pop + name = "Pop Component" + id = "comp_pop" + build_path = /obj/item/circuit_component/pop + category = list(WIREMOD_CIRCUITRY,WIREMOD_LIST_COMPONENTS) + +/datum/design/component/length + name = "Length Component" + id = "comp_length" + build_path = /obj/item/circuit_component/length + category = list(WIREMOD_CIRCUITRY, WIREMOD_LIST_COMPONENTS, WIREMOD_STRING_COMPONENTS) + +/datum/design/component/light + name = "Light Component" + id = "comp_light" + build_path = /obj/item/circuit_component/light + category = list(WIREMOD_CIRCUITRY, WIREMOD_OUTPUT_COMPONENTS) + +/datum/design/component/list_constructor + name = "List Constructor" + id = "comp_list_constructor" + build_path = /obj/item/circuit_component/arbitrary_input_amount/list_constructor + category = list(WIREMOD_CIRCUITRY, WIREMOD_LIST_COMPONENTS) + +/datum/design/component/list_length_constructor + name = "List Length Constructor" + id = "comp_list_length_constructor" + build_path = /obj/item/circuit_component/list_length_constructor + category = list(WIREMOD_CIRCUITRY, WIREMOD_LIST_COMPONENTS) + +/datum/design/component/not + name = "Not Component" + id = "comp_not" + build_path = /obj/item/circuit_component/not + category = list(WIREMOD_CIRCUITRY, WIREMOD_LOGIC_COMPONENTS) + +/datum/design/component/ram + name = "RAM Component" + id = "comp_ram" + build_path = /obj/item/circuit_component/ram + category = list(WIREMOD_CIRCUITRY, WIREMOD_MEMORY_COMPONENTS) + +/datum/design/component/random + name = "Random Component" + id = "comp_random" + build_path = /obj/item/circuit_component/random + category = list(WIREMOD_CIRCUITRY, WIREMOD_MATH_COMPONENTS, WIREMOD_LOGIC_COMPONENTS) + +/datum/design/component/round + name = "Round Component" + id = "comp_round" + build_path = /obj/item/circuit_component/round + category = list(WIREMOD_CIRCUITRY, WIREMOD_MATH_COMPONENTS) + +/datum/design/component/species + name = "Get Species Component" + id = "comp_species" + build_path = /obj/item/circuit_component/species + category = list(WIREMOD_CIRCUITRY, WIREMOD_LOGIC_COMPONENTS, WIREMOD_INPUT_COMPONENTS) + +/datum/design/component/speech + name = "Speech Component" + id = "comp_speech" + build_path = /obj/item/circuit_component/speech + category = list(WIREMOD_CIRCUITRY, WIREMOD_OUTPUT_COMPONENTS) + +/datum/design/component/tostring + name = "To String Component" + id = "comp_tostring" + build_path = /obj/item/circuit_component/tostring + category = list(WIREMOD_CIRCUITRY, WIREMOD_STRING_COMPONENTS, WIREMOD_CONVERSION_COMPONENTS) + +/datum/design/component/trig + name = "Trigonometry Component" + id = "comp_trig" + build_path = /obj/item/circuit_component/trig/trig + category = list(WIREMOD_CIRCUITRY, WIREMOD_MATH_COMPONENTS) + +/datum/design/component/adv_trig + name = "Advanced Trigonometry Component" + id = "comp_adv_trig" + build_path = /obj/item/circuit_component/trig/adv_trig + category = list(WIREMOD_CIRCUITRY, WIREMOD_MATH_COMPONENTS) + +/datum/design/component/hyper_trig + name = "Hyperbolic Trigonometry Component" + id = "comp_hyper_trig" + build_path = /obj/item/circuit_component/trig/hyper_trig + category = list(WIREMOD_CIRCUITRY, WIREMOD_MATH_COMPONENTS) + +/datum/design/component/typecheck + name = "Typecheck Component" + id = "comp_typecheck" + build_path = /obj/item/circuit_component/compare/typecheck + category = list(WIREMOD_CIRCUITRY, WIREMOD_LOGIC_COMPONENTS) + +/datum/design/component/concat + name = "Concatenation Component" + id = "comp_concat" + build_path = /obj/item/circuit_component/concat + category = list(WIREMOD_CIRCUITRY, WIREMOD_STRING_COMPONENTS) + +/datum/design/component/textcase + name = "Textcase Component" + id = "comp_textcase" + build_path = /obj/item/circuit_component/textcase + category = list(WIREMOD_CIRCUITRY, WIREMOD_STRING_COMPONENTS) + +/datum/design/component/hear + name = "Voice Activator Component" + id = "comp_hear" + build_path = /obj/item/circuit_component/hear + category = list(WIREMOD_CIRCUITRY, WIREMOD_INPUT_COMPONENTS) + +/datum/design/component/contains + name = "String Contains Component" + id = "comp_string_contains" + build_path = /obj/item/circuit_component/compare/contains + category = list(WIREMOD_CIRCUITRY, WIREMOD_STRING_COMPONENTS) + +/datum/design/component/self + name = "Self Component" + id = "comp_self" + build_path = /obj/item/circuit_component/self + category = list(WIREMOD_CIRCUITRY, WIREMOD_REFERENCE_COMPONENTS) + +/datum/design/component/radio + name = "Radio Component" + id = "comp_radio" + build_path = /obj/item/circuit_component/radio + category = list(WIREMOD_CIRCUITRY, WIREMOD_OUTPUT_COMPONENTS) + +/datum/design/component/gps + name = "GPS Component" + id = "comp_gps" + build_path = /obj/item/circuit_component/gps + category = list(WIREMOD_CIRCUITRY, WIREMOD_INPUT_COMPONENTS) + +/datum/design/component/direction + name = "Direction Component" + id = "comp_direction" + build_path = /obj/item/circuit_component/direction + category = list(WIREMOD_CIRCUITRY, WIREMOD_INPUT_COMPONENTS) + +/datum/design/component/health + name = "Health Component" + id = "comp_health" + build_path = /obj/item/circuit_component/health + category = list(WIREMOD_CIRCUITRY, WIREMOD_INPUT_COMPONENTS) + +/datum/design/component/combiner + name = "Combiner Component" + id = "comp_combiner" + build_path = /obj/item/circuit_component/combiner + category = list(WIREMOD_CIRCUITRY, WIREMOD_LOGIC_COMPONENTS) + +/datum/design/component/pull + name = "Pull Component" + id = "comp_pull" + build_path = /obj/item/circuit_component/pull + category = list(WIREMOD_CIRCUITRY, WIREMOD_OUTPUT_COMPONENTS) + +/datum/design/component/soundemitter + name = "Sound Emitter Component" + id = "comp_soundemitter" + build_path = /obj/item/circuit_component/soundemitter + category = list(WIREMOD_CIRCUITRY, WIREMOD_OUTPUT_COMPONENTS) + +/datum/design/component/mmi + name = "MMI Component" + id = "comp_mmi" + build_path = /obj/item/circuit_component/mmi + category = list(WIREMOD_CIRCUITRY, WIREMOD_INPUT_COMPONENTS) + +/datum/design/component/multiplexer + name = "Multiplexer Component" + id = "comp_multiplexer" + build_path = /obj/item/circuit_component/multiplexer + category = list(WIREMOD_CIRCUITRY, WIREMOD_LOGIC_COMPONENTS) + +/datum/design/component/get_column + name = "Get Column Component" + id = "comp_get_column" + build_path = /obj/item/circuit_component/get_column + category = list(WIREMOD_CIRCUITRY, WIREMOD_LIST_COMPONENTS) + +/datum/design/component/index_table + name = "Index Table Component" + id = "comp_index_table" + build_path = /obj/item/circuit_component/index_table + category = list(WIREMOD_CIRCUITRY, WIREMOD_LIST_COMPONENTS) + +/datum/design/component/concat_list + name = "Concatenate List Component" + id = "comp_concat_list" + build_path = /obj/item/circuit_component/concat_list + category = list(WIREMOD_CIRCUITRY, WIREMOD_LIST_COMPONENTS) + +/datum/design/component/select_query + name = "Select Query Component" + id = "comp_select_query" + build_path = /obj/item/circuit_component/select + category = list(WIREMOD_CIRCUITRY, WIREMOD_LIST_COMPONENTS, WIREMOD_LOGIC_COMPONENTS) + +/datum/design/compact_remote_shell + name = "Compact Remote Shell" + desc = "A handheld shell with one big button." + id = "compact_remote_shell" + build_path = /obj/item/compact_remote + materials = list(/datum/material/glass = 2000, /datum/material/iron = 5000) + build_type = PROTOLATHE | COMPONENT_PRINTER + category = list(WIREMOD_CIRCUITRY, WIREMOD_SHELLS) + +/datum/design/controller_shell + name = "Controller Shell" + desc = "A handheld shell with several buttons." + id = "controller_shell" + build_path = /obj/item/controller + build_type = PROTOLATHE | COMPONENT_PRINTER + materials = list(/datum/material/glass = 2000, /datum/material/iron = 7000) + category = list(WIREMOD_CIRCUITRY, WIREMOD_SHELLS) + +/datum/design/scanner_shell + name = "Scanner Shell" + desc = "A handheld shell with a scanner." + id = "scanner_shell" + build_path = /obj/item/scanner + build_type = PROTOLATHE | COMPONENT_PRINTER + materials = list(/datum/material/glass = 4000, /datum/material/iron = 5000) + category = list(WIREMOD_CIRCUITRY, WIREMOD_SHELLS) + +/datum/design/bot_shell + name = "Bot Shell" + desc = "An immobile shell that can store more components. Has a USB port to be able to connect to computers and machines." + id = "bot_shell" + build_path = /obj/item/shell/bot + build_type = PROTOLATHE | COMPONENT_PRINTER + materials = list(/datum/material/glass = 2000, /datum/material/iron = 10000) + category = list(WIREMOD_CIRCUITRY, WIREMOD_SHELLS) + +/datum/design/money_bot_shell + name = "Money Bot Shell" + desc = "An immobile shell that is similar to a regular bot shell, but accepts monetary inputs and can also dispense money." + id = "money_bot_shell" + build_path = /obj/item/shell/money_bot + build_type = PROTOLATHE | COMPONENT_PRINTER + materials = list(/datum/material/glass = 2000, /datum/material/iron = 10000, /datum/material/gold = 50) + category = list(WIREMOD_CIRCUITRY, WIREMOD_SHELLS) + +/datum/design/drone_shell + name = "Drone Shell" + desc = "A shell with the ability to move itself around." + id = "drone_shell" + build_path = /obj/item/shell/drone + build_type = PROTOLATHE | COMPONENT_PRINTER + materials = list( + /datum/material/glass = 2000, + /datum/material/iron = 11000, + /datum/material/gold = 500, + ) + category = list(WIREMOD_CIRCUITRY, WIREMOD_SHELLS) + +/datum/design/server_shell + name = "Server Shell" + desc = "A very large shell that cannot be moved around. Stores the most components." + id = "server_shell" + materials = list( + /datum/material/glass = 5000, + /datum/material/iron = 15000, + /datum/material/gold = 1500, + ) + build_path = /obj/item/shell/server + build_type = PROTOLATHE | COMPONENT_PRINTER + category = list(WIREMOD_CIRCUITRY, WIREMOD_SHELLS) + +/datum/design/airlock_shell + name = "Airlock Shell" + desc = "A door shell that cannot be moved around when assembled." + id = "door_shell" + materials = list( + /datum/material/glass = 5000, + /datum/material/iron = 15000, + ) + build_path = /obj/item/shell/airlock + build_type = PROTOLATHE | COMPONENT_PRINTER + category = list(WIREMOD_CIRCUITRY, WIREMOD_SHELLS) diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index d409c5e435bac..42700bfa9e92a 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -71,6 +71,9 @@ Note: Must be placed within 3 tiles of the R&D Console /obj/machinery/rnd/destructive_analyzer/proc/destroy_item(obj/item/thing, innermode = FALSE) if(QDELETED(thing) || QDELETED(src) || QDELETED(linked_console)) return FALSE + if(thing.resistance_flags & INDESTRUCTIBLE) + playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) + return FALSE if(!innermode) flick("d_analyzer_process", src) busy = TRUE diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 79e97a8bccfe4..da8a69c2b5809 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -97,7 +97,7 @@ /obj/machinery/rnd/experimentor/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Malfunction probability reduced by [badThingCoeff]%.
Cooldown interval between experiments at [resetTime*0.1] seconds." + . += "The status display reads: Malfunction probability reduced by [badThingCoeff]%.
Cooldown interval between experiments at [resetTime*0.1] seconds.
" /obj/machinery/rnd/experimentor/proc/checkCircumstances(obj/item/O) //snowflake check to only take "made" bombs @@ -254,7 +254,7 @@ badThingCoeff++ else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) visible_message("[src] malfunctions and destroys [exp_on], lashing its arms out at nearby people!") - for(var/mob/living/m in oview(1, src)) + for(var/mob/living/m in ohearers(1, src)) m.apply_damage(15, BRUTE, pick(BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_PRECISE_GROIN)) investigate_log("Experimentor dealt minor brute to [m].", INVESTIGATE_EXPERIMENTOR) ejectItem(TRUE) @@ -263,7 +263,7 @@ exp = SCANTYPE_OBLITERATE else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) visible_message("[src] malfunctions, throwing the [exp_on]!") - var/mob/living/target = locate(/mob/living) in oview(7,src) + var/mob/living/target = locate(/mob/living) in ohearers(7,src) if(target) var/obj/item/throwing = loaded_item investigate_log("Experimentor has thrown [loaded_item] at [key_name(target)]", INVESTIGATE_EXPERIMENTOR) @@ -356,7 +356,7 @@ investigate_log("Experimentor has made a cup of [chosenchem] coffee.", INVESTIGATE_EXPERIMENTOR) else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) var/turf/start = get_turf(src) - var/mob/M = locate(/mob/living) in view(src, 3) + var/mob/M = locate(/mob/living) in view(3, src) var/turf/MT = get_turf(M) if(MT) visible_message("[src] dangerously overheats, launching a flaming fuel orb!") @@ -372,21 +372,14 @@ else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) visible_message("[src] malfunctions, melting [exp_on] and leaking hot air!") var/datum/gas_mixture/env = loc.return_air() - var/transfer_moles = 0.25 * env.total_moles() - var/datum/gas_mixture/removed = env.remove(transfer_moles) - if(removed) - var/heat_capacity = removed.heat_capacity() - if(heat_capacity == 0 || heat_capacity == null) - heat_capacity = 1 - removed.set_temperature(min((removed.return_temperature()*heat_capacity + 100000)/heat_capacity, 1000)) - env.merge(removed) + env.adjust_heat(100000) air_update_turf() investigate_log("Experimentor has released hot air.", INVESTIGATE_EXPERIMENTOR) ejectItem(TRUE) else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) visible_message("[src] malfunctions, activating its emergency coolant systems!") throwSmoke(loc) - for(var/mob/living/m in oview(1, src)) + for(var/mob/living/m in ohearers(1, src)) m.apply_damage(5, BURN, pick(BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_PRECISE_GROIN)) investigate_log("Experimentor has dealt minor burn damage to [key_name(m)]", INVESTIGATE_EXPERIMENTOR) ejectItem() @@ -418,14 +411,7 @@ else if(prob(EFFECT_PROB_LOW-badThingCoeff)) visible_message("[src] malfunctions, shattering [exp_on] and leaking cold air!") var/datum/gas_mixture/env = loc.return_air() - var/transfer_moles = 0.25 * env.total_moles() - var/datum/gas_mixture/removed = env.remove(transfer_moles) - if(removed) - var/heat_capacity = removed.heat_capacity() - if(heat_capacity == 0 || heat_capacity == null) - heat_capacity = 1 - removed.set_temperature((removed.return_temperature()*heat_capacity - 75000)/heat_capacity) - env.merge(removed) + env.adjust_heat(-75000) air_update_turf() investigate_log("Experimentor has released cold air.", INVESTIGATE_EXPERIMENTOR) ejectItem(TRUE) @@ -474,7 +460,7 @@ visible_message("[src] scans the [exp_on], revealing its true nature!") playsound(src, 'sound/effects/supermatter.ogg', 50, 3, -1) var/obj/item/relic/R = loaded_item - R.reveal() + R.reveal(linked_console.stored_research) investigate_log("Experimentor has revealed a relic with [R.realProc] effect.", INVESTIGATE_EXPERIMENTOR) ejectItem() @@ -498,7 +484,7 @@ ejectItem(TRUE) if(globalMalf > 36 && globalMalf < 50) visible_message("Experimentor draws the life essence of those nearby!") - for(var/mob/living/m in view(4,src)) + for(var/mob/living/m in hearers(4,src)) to_chat(m, "You feel your flesh being torn from you, mists of blood drifting to [src]!") m.apply_damage(50, BRUTE, BODY_ZONE_CHEST) investigate_log("Experimentor has taken 50 brute a blood sacrifice from [m]", INVESTIGATE_EXPERIMENTOR) @@ -567,13 +553,15 @@ realName = "[pick("broken","twisted","spun","improved","silly","regular","badly made")] [pick("device","object","toy","illegal tech","weapon")]" -/obj/item/relic/proc/reveal() +/obj/item/relic/proc/reveal(datum/techweb/techweb) if(revealed) //Re-rolling your relics seems a bit overpowered, yes? return revealed = TRUE name = realName cooldownMax = rand(60,300) realProc = pick("teleport","explode","rapidDupe","petSpray","flash","clean","corgicannon") + //Give science research + techweb.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, 2000) /obj/item/relic/attack_self(mob/user) if(revealed) diff --git a/code/modules/research/machinery/circuit_imprinter.dm b/code/modules/research/machinery/circuit_imprinter.dm index 8415564f6d098..d047f0d506e27 100644 --- a/code/modules/research/machinery/circuit_imprinter.dm +++ b/code/modules/research/machinery/circuit_imprinter.dm @@ -15,7 +15,8 @@ "Research Machinery", "Misc. Machinery", "Computer Parts", - "Shuttle Machinery" + "Shuttle Machinery", + "Circuitry" ) production_animation = "circuit_imprinter_ani" allowed_buildtypes = IMPRINTER diff --git a/code/modules/research/machinery/protolathe.dm b/code/modules/research/machinery/protolathe.dm index 684f27ccadfb3..841b7701de401 100644 --- a/code/modules/research/machinery/protolathe.dm +++ b/code/modules/research/machinery/protolathe.dm @@ -15,7 +15,8 @@ "Weapons", "Ammo", "Firing Pins", - "Computer Parts" + "Computer Parts", + "Circuitry" ) production_animation = "protolathe_n" allowed_buildtypes = PROTOLATHE diff --git a/code/modules/research/machinery/techfab.dm b/code/modules/research/machinery/techfab.dm index 885f27c2cb5c8..e7bd9198eaa37 100644 --- a/code/modules/research/machinery/techfab.dm +++ b/code/modules/research/machinery/techfab.dm @@ -26,7 +26,8 @@ "Subspace Telecomms", "Research Machinery", "Misc. Machinery", - "Computer Parts" + "Computer Parts", + "Circuitry" ) console_link = FALSE production_animation = "protolathe_n" diff --git a/code/modules/research/nanites/extra_settings/number.dm b/code/modules/research/nanites/extra_settings/number.dm index be7775c0d2ef2..9aff7da80c283 100644 --- a/code/modules/research/nanites/extra_settings/number.dm +++ b/code/modules/research/nanites/extra_settings/number.dm @@ -14,7 +14,7 @@ /datum/nanite_extra_setting/number/set_value(value) if(istext(value)) value = text2num(value) - if(!value || !isnum_safe(value)) + if(!isnum_safe(value)) return src.value = clamp(value, min, max) diff --git a/code/modules/research/nanites/nanite_chamber.dm b/code/modules/research/nanites/nanite_chamber.dm index 09193087fae7e..ece40e19773f6 100644 --- a/code/modules/research/nanites/nanite_chamber.dm +++ b/code/modules/research/nanites/nanite_chamber.dm @@ -8,10 +8,9 @@ use_power = IDLE_POWER_USE anchored = TRUE density = TRUE - idle_power_usage = 50 - active_power_usage = 300 + idle_power_usage = 300 + active_power_usage = 1200 - var/obj/machinery/computer/nanite_chamber_control/console var/locked = FALSE var/breakout_time = 1200 var/scan_level diff --git a/code/modules/research/nanites/nanite_chamber_computer.dm b/code/modules/research/nanites/nanite_chamber_computer.dm index 0aa23f93dd0e5..65d4c576bc4b6 100644 --- a/code/modules/research/nanites/nanite_chamber_computer.dm +++ b/code/modules/research/nanites/nanite_chamber_computer.dm @@ -2,7 +2,6 @@ name = "nanite chamber control console" desc = "Controls a connected nanite chamber. Can inoculate nanites, load programs, and analyze existing nanite swarms." var/obj/machinery/nanite_chamber/chamber - var/obj/item/disk/nanite_program/disk icon_screen = "nanite_chamber_control" circuit = /obj/item/circuitboard/computer/nanite_chamber_control @@ -17,8 +16,7 @@ var/C = locate(/obj/machinery/nanite_chamber, get_step(src, direction)) if(C) var/obj/machinery/nanite_chamber/NC = C - chamber = NC - NC.console = src + set_connected_chamber(NC) /obj/machinery/computer/nanite_chamber_control/interact() if(!chamber) @@ -34,6 +32,7 @@ if(!ui) ui = new(user, src, "NaniteChamberControl") ui.open() + ui.set_autoupdate(TRUE) /obj/machinery/computer/nanite_chamber_control/ui_data() var/list/data = list() @@ -48,7 +47,7 @@ var/mob/living/L = chamber.occupant - if(!(MOB_ORGANIC in L.mob_biotypes) && !(MOB_UNDEAD in L.mob_biotypes)) + if(!(MOB_ORGANIC in L.mob_biotypes) && !(MOB_UNDEAD in L.mob_biotypes) && !HAS_TRAIT(L, TRAIT_NANITECOMPATIBLE)) data["status_msg"] = "Occupant not compatible with nanites." return data @@ -102,3 +101,15 @@ log_combat(usr, chamber.occupant, "injected", null, "with nanites via [src]") chamber.occupant.investigate_log("was injected with nanites by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) . = TRUE + +/obj/machinery/computer/nanite_chamber_control/proc/set_connected_chamber(new_chamber) + if(chamber) + UnregisterSignal(chamber, COMSIG_PARENT_QDELETING) + chamber = new_chamber + ui_update() + if(chamber) + RegisterSignal(chamber, COMSIG_PARENT_QDELETING, .proc/react_to_chamber_del) + +/obj/machinery/computer/nanite_chamber_control/proc/react_to_chamber_del(datum/source) + SIGNAL_HANDLER + set_connected_chamber(null) diff --git a/code/modules/research/nanites/nanite_cloud_controller.dm b/code/modules/research/nanites/nanite_cloud_controller.dm index 07620d975f01a..85afcef9a5fce 100644 --- a/code/modules/research/nanites/nanite_cloud_controller.dm +++ b/code/modules/research/nanites/nanite_cloud_controller.dm @@ -26,6 +26,7 @@ if(disk) eject(user) disk = N + ui_update() else ..() @@ -41,6 +42,7 @@ if(!istype(user) || !Adjacent(user) ||!user.put_in_active_hand(disk)) disk.forceMove(drop_location()) disk = null + ui_update() /obj/machinery/computer/nanite_cloud_controller/proc/get_backup(cloud_id) for(var/I in cloud_backups) @@ -58,7 +60,7 @@ backup.cloud_id = cloud_id backup.nanites = cloud_copy investigate_log("[key_name(user)] created a new nanite cloud backup with id #[cloud_id]", INVESTIGATE_NANITES) - + ui_update() /obj/machinery/computer/nanite_cloud_controller/ui_state(mob/user) return GLOB.default_state @@ -106,6 +108,7 @@ data["disk"] = disk_data else data["has_disk"] = FALSE + data["disk"] = null data["new_backup_id"] = new_backup_id @@ -180,20 +183,21 @@ if("update_new_backup_value") var/backup_value = text2num(params["value"]) new_backup_id = backup_value + . = TRUE if("create_backup") 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) generate_backup(cloud_id, usr) - . = TRUE + . = TRUE if("delete_backup") var/datum/nanite_cloud_backup/backup = get_backup(current_view) if(backup) playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) qdel(backup) investigate_log("[key_name(usr)] deleted the nanite cloud backup #[current_view]", INVESTIGATE_NANITES) - . = TRUE + . = TRUE if("upload_program") if(disk && disk.program) var/datum/nanite_cloud_backup/backup = get_backup(current_view) @@ -202,7 +206,7 @@ var/datum/component/nanites/nanites = backup.nanites nanites.add_program(null, disk.program.copy()) investigate_log("[key_name(usr)] uploaded program [disk.program.name] to cloud #[current_view]", INVESTIGATE_NANITES) - . = TRUE + . = TRUE if("remove_program") var/datum/nanite_cloud_backup/backup = get_backup(current_view) if(backup) @@ -211,7 +215,7 @@ var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])] investigate_log("[key_name(usr)] deleted program [P.name] from cloud #[current_view]", INVESTIGATE_NANITES) qdel(P) - . = TRUE + . = TRUE if("add_rule") if(disk && disk.program && istype(disk.program, /datum/nanite_program/sensor)) var/datum/nanite_program/sensor/rule_template = disk.program @@ -225,7 +229,7 @@ var/datum/nanite_rule/rule = rule_template.make_rule(P) investigate_log("[key_name(usr)] added rule [rule.display()] to program [P.name] in cloud #[current_view]", INVESTIGATE_NANITES) - . = TRUE + . = TRUE if("remove_rule") var/datum/nanite_cloud_backup/backup = get_backup(current_view) if(backup) @@ -236,7 +240,7 @@ rule.remove() investigate_log("[key_name(usr)] removed rule [rule.display()] from program [P.name] in cloud #[current_view]", INVESTIGATE_NANITES) - . = TRUE + . = TRUE /datum/nanite_cloud_backup var/cloud_id = 0 diff --git a/code/modules/research/nanites/nanite_hijacker.dm b/code/modules/research/nanites/nanite_hijacker.dm deleted file mode 100644 index 8b137891791fe..0000000000000 --- a/code/modules/research/nanites/nanite_hijacker.dm +++ /dev/null @@ -1 +0,0 @@ - diff --git a/code/modules/research/nanites/nanite_program_hub.dm b/code/modules/research/nanites/nanite_program_hub.dm index 41c0c843e59e0..0ec3e130ec2fc 100644 --- a/code/modules/research/nanites/nanite_program_hub.dm +++ b/code/modules/research/nanites/nanite_program_hub.dm @@ -29,6 +29,11 @@ linked_techweb = SSresearch.science_tech /obj/machinery/nanite_program_hub/attackby(obj/item/I, mob/user) + if(default_deconstruction_screwdriver(user, icon_state, icon_state, I)) + update_icon() + return + if(default_deconstruction_crowbar(I)) + return if(istype(I, /obj/item/disk/nanite_program)) var/obj/item/disk/nanite_program/N = I if(user.transferItemToLoc(N, src)) @@ -37,6 +42,7 @@ if(disk) eject(user) disk = N + ui_update() else ..() @@ -46,6 +52,7 @@ if(!istype(user) || !Adjacent(user) || !user.put_in_active_hand(disk)) disk.forceMove(drop_location()) disk = null + ui_update() /obj/machinery/nanite_program_hub/AltClick(mob/user) if(disk && user.canUseTopic(src, !issilicon(user))) diff --git a/code/modules/research/nanites/nanite_programmer.dm b/code/modules/research/nanites/nanite_programmer.dm index 628a899957f8d..d0e6c8488fb4e 100644 --- a/code/modules/research/nanites/nanite_programmer.dm +++ b/code/modules/research/nanites/nanite_programmer.dm @@ -8,12 +8,18 @@ use_power = IDLE_POWER_USE anchored = TRUE density = TRUE - flags_1 = HEAR_1 circuit = /obj/item/circuitboard/machine/nanite_programmer - +/obj/machinery/nanite_programmer/Initialize() + . = ..() + become_hearing_sensitive(trait_source = ROUNDSTART_TRAIT) /obj/machinery/nanite_programmer/attackby(obj/item/I, mob/user) + if(default_deconstruction_screwdriver(user, icon_state, icon_state, I)) + update_icon() + return + if(default_deconstruction_crowbar(I)) + return if(istype(I, /obj/item/disk/nanite_program)) var/obj/item/disk/nanite_program/N = I if(user.transferItemToLoc(N, src)) @@ -23,6 +29,7 @@ eject(user) disk = N program = N.program + ui_update() else ..() @@ -33,6 +40,7 @@ disk.forceMove(drop_location()) disk = null program = null + ui_update() /obj/machinery/nanite_programmer/AltClick(mob/user) if(disk && user.canUseTopic(src, !issilicon(user))) @@ -141,7 +149,7 @@ program.timer_trigger_delay = timer . = TRUE -/obj/machinery/nanite_programmer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/obj/machinery/nanite_programmer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) . = ..() var/static/regex/when = regex("(?:^\\W*when|when\\W*$)", "i") //starts or ends with when if(findtext(raw_message, when) && !istype(speaker, /obj/machinery/nanite_programmer)) diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm index 8adf76130114f..2a4142bb35c02 100644 --- a/code/modules/research/nanites/nanite_programs.dm +++ b/code/modules/research/nanites/nanite_programs.dm @@ -54,6 +54,15 @@ //Rules that automatically manage if the program's active without requiring separate sensor programs var/list/datum/nanite_rule/rules = list() + //Logic + //a list of logic types a nanite program's rules follow + var/static/list/logic = list( + "AND" = NL_AND, + "OR" = NL_OR, + "NOR" = NL_NOR, + "NAND" = NL_NAND, + ) + /datum/nanite_program/New() . = ..() register_extra_settings() @@ -68,6 +77,9 @@ on_mob_remove() if(nanites) nanites.programs -= src + for(var/datum/nanite_rule/rule as anything in rules) + rule.remove() + rules.Cut() return ..() /datum/nanite_program/proc/copy() @@ -99,6 +111,10 @@ ///Register extra settings by overriding this. ///extra_settings[name] = new typepath() for each extra setting /datum/nanite_program/proc/register_extra_settings() + var/list/logictypes = list() + for(var/name in logic) + logictypes += name + extra_settings[NES_RULE_LOGIC] = new /datum/nanite_extra_setting/type("AND", logictypes) return ///You can override this if you need to have special behavior after setting certain settings. @@ -193,10 +209,36 @@ //If false, disables active and passive effects, but doesn't consume nanites //Can be used to avoid consuming nanites for nothing /datum/nanite_program/proc/check_conditions() - for(var/R in rules) - var/datum/nanite_rule/rule = R - if(!rule.check_rule()) - return FALSE + var/datum/nanite_extra_setting/logictype = extra_settings[NES_RULE_LOGIC] + if(logictype) + switch(logictype.get_value()) + if(NL_AND) + for(var/R in rules) + var/datum/nanite_rule/rule = R + if(!rule.check_rule()) + return FALSE + if(NL_OR) + for(var/R in rules) + var/datum/nanite_rule/rule = R + if(rule.check_rule()) + return TRUE + return FALSE + if(NL_NOR) + for(var/R in rules) + var/datum/nanite_rule/rule = R + if(rule.check_rule()) + return FALSE + if(NL_NAND) + for(var/R in rules) + var/datum/nanite_rule/rule = R + if(!rule.check_rule()) + return TRUE + return FALSE + else + for(var/R in rules) + var/datum/nanite_rule/rule = R + if(!rule.check_rule()) + return FALSE return TRUE //Constantly procs as long as the program is active @@ -243,14 +285,14 @@ software_error() /datum/nanite_program/proc/on_shock(shock_damage) - if(!program_flags & NANITE_SHOCK_IMMUNE) + if(!(program_flags & NANITE_SHOCK_IMMUNE)) if(prob(10)) software_error() else if(prob(33)) qdel(src) /datum/nanite_program/proc/on_minor_shock() - if(!program_flags & NANITE_SHOCK_IMMUNE) + if(!(program_flags & NANITE_SHOCK_IMMUNE)) if(prob(10)) software_error() diff --git a/code/modules/research/nanites/nanite_programs/buffing.dm b/code/modules/research/nanites/nanite_programs/buffing.dm index bcfc323031c46..a1442bef19d4b 100644 --- a/code/modules/research/nanites/nanite_programs/buffing.dm +++ b/code/modules/research/nanites/nanite_programs/buffing.dm @@ -22,7 +22,7 @@ name = "Adrenaline Burst" desc = "The nanites cause a burst of adrenaline when triggered, allowing the user to push their body past its normal limits." can_trigger = TRUE - trigger_cost = 25 + trigger_cost = 20 trigger_cooldown = 1200 rogue_types = list(/datum/nanite_program/toxic, /datum/nanite_program/nerve_decay) @@ -32,7 +32,6 @@ host_mob.adjustStaminaLoss(-75) host_mob.set_resting(FALSE) host_mob.update_mobility() - host_mob.reagents.add_reagent(/datum/reagent/medicine/amphetamine, 3) /datum/nanite_program/hardening name = "Dermal Hardening" @@ -125,3 +124,16 @@ . = ..() REMOVE_TRAIT(host_mob, TRAIT_MINDSHIELD, "nanites") host_mob.sec_hud_set_implants() + +/datum/nanite_program/haste + name = "Amphetamine Injection" + desc = "The nanites synthesize amphetamine when triggered, which temporarily increases the host's running speed." + can_trigger = TRUE + trigger_cost = 10 + trigger_cooldown = 1200 + rogue_types = list(/datum/nanite_program/toxic, /datum/nanite_program/nerve_decay) + +/datum/nanite_program/haste/on_trigger() + to_chat(host_mob, "Your body feels lighter and your legs feel relaxed!") + host_mob.set_resting(FALSE) + host_mob.reagents.add_reagent(/datum/reagent/medicine/amphetamine, 3) diff --git a/code/modules/research/nanites/nanite_programs/sensor.dm b/code/modules/research/nanites/nanite_programs/sensor.dm index fbebeaf209adb..c1c97136172ba 100644 --- a/code/modules/research/nanites/nanite_programs/sensor.dm +++ b/code/modules/research/nanites/nanite_programs/sensor.dm @@ -250,6 +250,8 @@ UnregisterSignal(host_mob, COMSIG_MOVABLE_HEAR, .proc/on_hear) /datum/nanite_program/sensor/voice/proc/on_hear(datum/source, list/hearing_args) + SIGNAL_HANDLER + var/datum/nanite_extra_setting/sentence = extra_settings[NES_SENTENCE] var/datum/nanite_extra_setting/inclusive = extra_settings[NES_INCLUSIVE_MODE] if(!sentence.get_value()) @@ -265,19 +267,18 @@ name = "Species Sensor" desc = "When triggered, the nanites scan the host to determine their species and output a signal depending on the conditions set in the settings." can_trigger = TRUE + can_rule = TRUE trigger_cost = 0 trigger_cooldown = 5 - var/list/static/allowed_species = list( - "Human" = /datum/species/human, - "Lizard" = /datum/species/lizard, - "Moth" = /datum/species/moth, - "Ethereal" = /datum/species/ethereal, - "Pod" = /datum/species/pod, - "Fly" = /datum/species/fly, - "Felinid" = /datum/species/human/felinid, - "Jelly" = /datum/species/jelly - ) + var/list/static/allowed_species = list() + +/datum/nanite_program/sensor/species/New() + if(!length(allowed_species)) + for(var/id in GLOB.roundstart_races) + allowed_species[id] = GLOB.species_list[id] + . = ..() + /datum/nanite_program/sensor/species/register_extra_settings() . = ..() @@ -285,7 +286,7 @@ for(var/name in allowed_species) species_types += name species_types += "Other" - extra_settings[NES_RACE] = new /datum/nanite_extra_setting/type("Human", species_types) + extra_settings[NES_RACE] = new /datum/nanite_extra_setting/type("human", species_types) extra_settings[NES_MODE] = new /datum/nanite_extra_setting/boolean(TRUE, "Is", "Is Not") /datum/nanite_program/sensor/species/on_trigger(comm_message) @@ -294,13 +295,19 @@ var/species_match = FALSE if(species) - if(is_species(host_mob, species)) + if(species == /datum/species/human) + if(ishumanbasic(host_mob) && !is_species(host_mob, /datum/species/human/felinid)) + species_match = TRUE + else if(is_species(host_mob, species)) species_match = TRUE else //this is the check for the "Other" option species_match = TRUE for(var/name in allowed_species) var/species_other = allowed_species[name] - if(is_species(host_mob, species_other)) + if (species_other == /datum/species/human) + if(ishumanbasic(host_mob) && !is_species(host_mob, /datum/species/human/felinid)) + species_match = FALSE + else if(is_species(host_mob, species_other)) species_match = FALSE break @@ -311,3 +318,13 @@ else if(!species_match) send_code() + +/datum/nanite_program/sensor/species/make_rule(datum/nanite_program/target) + var/datum/nanite_rule/species/rule = new(target) + var/datum/nanite_extra_setting/species_name = extra_settings[NES_RACE] + var/datum/nanite_extra_setting/mode = extra_settings[NES_MODE] + var/datum/nanite_extra_setting/species_type = allowed_species[species_name.get_value()] + rule.species_rule = species_type + rule.mode_rule = mode.get_value() + rule.species_name_rule = species_name.get_value() + return rule diff --git a/code/modules/research/nanites/nanite_programs/utility.dm b/code/modules/research/nanites/nanite_programs/utility.dm index b3601611f3000..66c041d662871 100644 --- a/code/modules/research/nanites/nanite_programs/utility.dm +++ b/code/modules/research/nanites/nanite_programs/utility.dm @@ -15,7 +15,7 @@ return var/datum/nanite_extra_setting/program = extra_settings[NES_PROGRAM_OVERWRITE] var/datum/nanite_extra_setting/cloud = extra_settings[NES_CLOUD_OVERWRITE] - for(var/mob/M in orange(host_mob, 5)) + for(var/mob/M in orange(5, host_mob)) if(SEND_SIGNAL(M, COMSIG_NANITE_IS_STEALTHY)) continue switch(program.get_value()) @@ -238,10 +238,10 @@ return spread_cooldown = world.time + 50 var/list/mob/living/target_hosts = list() - for(var/mob/living/L in oview(5, host_mob)) + for(var/mob/living/L in ohearers(5, host_mob)) if(!prob(25)) continue - if(!(MOB_ORGANIC in L.mob_biotypes) && !(MOB_UNDEAD in L.mob_biotypes)) + if(!(MOB_ORGANIC in L.mob_biotypes) && !(MOB_UNDEAD in L.mob_biotypes) && !HAS_TRAIT(host_mob, TRAIT_NANITECOMPATIBLE)) continue target_hosts += L if(!target_hosts.len) @@ -264,7 +264,7 @@ /datum/nanite_program/nanite_sting/on_trigger(comm_message) var/list/mob/living/target_hosts = list() for(var/mob/living/L in oview(1, host_mob)) - if(!(MOB_ORGANIC in L.mob_biotypes) && !(MOB_UNDEAD in L.mob_biotypes)) + if(!(MOB_ORGANIC in L.mob_biotypes) && !(MOB_UNDEAD in L.mob_biotypes) && !HAS_TRAIT(host_mob, TRAIT_NANITECOMPATIBLE)) continue if(SEND_SIGNAL(L, COMSIG_HAS_NANITES) || !L.Adjacent(host_mob)) continue @@ -278,7 +278,7 @@ infectee.AddComponent(/datum/component/nanites, 5) SEND_SIGNAL(infectee, COMSIG_NANITE_SYNC, nanites) infectee.investigate_log("was infected by a nanite cluster by [key_name(host_mob)] at [AREACOORD(infectee)].", INVESTIGATE_NANITES) - to_chat(infectee, "You feel a tiny prick.") + to_chat(infectee, "You feel a tiny prick!") /datum/nanite_program/mitosis name = "Mitosis" @@ -326,7 +326,7 @@ /datum/nanite_program/dermal_button/on_mob_remove() . = ..() - qdel(button) + QDEL_NULL(button) /datum/nanite_program/dermal_button/proc/press() if(activated) diff --git a/code/modules/research/nanites/nanite_programs/weapon.dm b/code/modules/research/nanites/nanite_programs/weapon.dm index 16f87bc6bdeec..43a5ede859b96 100644 --- a/code/modules/research/nanites/nanite_programs/weapon.dm +++ b/code/modules/research/nanites/nanite_programs/weapon.dm @@ -24,7 +24,7 @@ /datum/nanite_program/poison/active_effect() host_mob.adjustToxLoss(1) - if(prob(2)) + if(prob(2) && !HAS_TRAIT(host_mob, TRAIT_TOXINLOVER)) to_chat(host_mob, "You feel nauseous.") if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob diff --git a/code/modules/research/nanites/nanite_remote.dm b/code/modules/research/nanites/nanite_remote.dm index 4655ac6749099..a6c90d0942ce9 100644 --- a/code/modules/research/nanites/nanite_remote.dm +++ b/code/modules/research/nanites/nanite_remote.dm @@ -26,7 +26,6 @@ . += "Alt-click to unlock." /obj/item/nanite_remote/AltClick(mob/user) - . = ..() if(!user.canUseTopic(src, BE_CLOSE)) return if(locked) @@ -34,6 +33,7 @@ to_chat(user, "You unlock [src].") locked = FALSE update_icon() + ui_update() else to_chat(user, "Access denied.") @@ -45,6 +45,7 @@ if(locked) locked = FALSE update_icon() + ui_update() /obj/item/nanite_remote/update_icon() . = ..() @@ -67,7 +68,7 @@ signal_mob(target, code, key_name(user)) if(REMOTE_MODE_AOE) to_chat(user, "You activate [src], signaling the nanites inside every host around you.") - for(var/mob/living/L in view(user, 7)) + for(var/mob/living/L in hearers(7, user)) signal_mob(L, code, key_name(user)) if(REMOTE_MODE_RELAY) to_chat(user, "You activate [src], signaling all connected relay nanites.") @@ -103,7 +104,8 @@ return data /obj/item/nanite_remote/ui_act(action, params) - if(..()) + . = ..() + if(.) return switch(action) if("set_code") @@ -170,7 +172,6 @@ update_icon() . = TRUE - /obj/item/nanite_remote/comm name = "nanite communication remote" desc = "A device that can send text messages to specific programs." @@ -190,7 +191,7 @@ signal_mob(target, code, comm_message, key_name(user)) if(REMOTE_MODE_AOE) to_chat(user, "You activate [src], signaling the nanites inside every host around you.") - for(var/mob/living/L in view(user, 7)) + for(var/mob/living/L in hearers(7, user)) signal_mob(L, code, comm_message, key_name(user)) if(REMOTE_MODE_RELAY) to_chat(user, "You activate [src], signaling all connected relay nanites.") diff --git a/code/modules/research/nanites/program_disks.dm b/code/modules/research/nanites/program_disks.dm index 02f6d7cc280bc..ce181389c073e 100644 --- a/code/modules/research/nanites/program_disks.dm +++ b/code/modules/research/nanites/program_disks.dm @@ -131,3 +131,6 @@ /obj/item/disk/nanite_program/stun program_type = /datum/nanite_program/stun + +/obj/item/disk/nanite_program/species_sensor + program_type = /datum/nanite_program/sensor/species diff --git a/code/modules/research/nanites/public_chamber.dm b/code/modules/research/nanites/public_chamber.dm index a892fa4cf9168..0517b8e54bf64 100644 --- a/code/modules/research/nanites/public_chamber.dm +++ b/code/modules/research/nanites/public_chamber.dm @@ -8,8 +8,8 @@ use_power = IDLE_POWER_USE anchored = TRUE density = TRUE - idle_power_usage = 50 - active_power_usage = 300 + idle_power_usage = 300 + active_power_usage = 1200 var/cloud_id = 1 var/locked = FALSE @@ -166,7 +166,7 @@ if(nanites && nanites.cloud_id != cloud_id) change_cloud(attacker) return - if((MOB_ORGANIC in L.mob_biotypes) || (MOB_UNDEAD in L.mob_biotypes)) + if((MOB_ORGANIC in L.mob_biotypes) || (MOB_UNDEAD in L.mob_biotypes) || HAS_TRAIT(L, TRAIT_NANITECOMPATIBLE)) inject_nanites(attacker) /obj/machinery/public_nanite_chamber/open_machine() diff --git a/code/modules/research/nanites/rules.dm b/code/modules/research/nanites/rules.dm index f496abe6e1fd1..f58835fdae870 100644 --- a/code/modules/research/nanites/rules.dm +++ b/code/modules/research/nanites/rules.dm @@ -149,3 +149,34 @@ /datum/nanite_rule/damage/display() return "[damage_type] [above ? ">" : "<"] [threshold]" + +/datum/nanite_rule/species + name = "Species" + desc = "Checks the host's race" + + var/species_rule = /datum/species/human + var/mode_rule = "is" + var/species_name_rule = "human" + + +/datum/nanite_rule/species/check_rule() + var/species_match_rule = FALSE + + if(species_rule) + if(species_rule == /datum/species/human) + if(ishumanbasic(program.host_mob) && !is_species(program.host_mob, /datum/species/human/felinid)) + species_match_rule = TRUE + else if(is_species(program.host_mob, species_rule)) + species_match_rule = TRUE + + + return species_match_rule ? mode_rule : !mode_rule + +/datum/nanite_rule/species/copy_to(datum/nanite_program/new_program) + var/datum/nanite_rule/species/rule = new(new_program) + rule.species_rule = species_rule + rule.mode_rule = mode_rule + rule.species_name_rule = species_name_rule + +/datum/nanite_rule/species/display() + return "[mode_rule ? "IS" : "IS NOT"] [species_name_rule]" diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index b278d31a10c8a..db71abfd3a271 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -226,6 +226,7 @@ Nothing else in the console has ID requirements. l += "[sheet.css_tag()][RDSCREEN_NOBREAK]" l += "
[stored_research.organization] Research and Development Network" l += "Available points:
[techweb_point_display_rdconsole(stored_research.research_points, stored_research.last_bitcoins)]" + l += "Current Research Tier: [stored_research.current_tier]
" l += "Security protocols: [obj_flags & EMAGGED ? "Disabled" : "Enabled"]" l += "Main Menu | Back
[RDSCREEN_NOBREAK]" l += "[ui_mode == 1? "Normal View" : "Normal View"] | [ui_mode == 2? "Expert View" : "Expert View"] | [ui_mode == 3? "List View" : "List View"]" @@ -386,9 +387,9 @@ Nothing else in the console has ID requirements. var/datum/material/M = mat_id var/amount = mat_container.materials[mat_id] l += "* [amount] of [M.name]: " - if(amount >= MINERAL_MATERIAL_AMOUNT) l += "Eject [RDSCREEN_NOBREAK]" - if(amount >= MINERAL_MATERIAL_AMOUNT*5) l += "5x [RDSCREEN_NOBREAK]" - if(amount >= MINERAL_MATERIAL_AMOUNT) l += "All[RDSCREEN_NOBREAK]" + if(amount >= MINERAL_MATERIAL_AMOUNT) l += "Eject [RDSCREEN_NOBREAK]" + if(amount >= MINERAL_MATERIAL_AMOUNT*5) l += "5x [RDSCREEN_NOBREAK]" + if(amount >= MINERAL_MATERIAL_AMOUNT) l += "All[RDSCREEN_NOBREAK]" l += "" l += "[RDSCREEN_NOBREAK]" return l @@ -520,9 +521,9 @@ Nothing else in the console has ID requirements. var/datum/material/M = mat_id var/amount = mat_container.materials[mat_id] l += "* [amount] of [M.name]: " - if(amount >= MINERAL_MATERIAL_AMOUNT) l += "Eject [RDSCREEN_NOBREAK]" - if(amount >= MINERAL_MATERIAL_AMOUNT*5) l += "5x [RDSCREEN_NOBREAK]" - if(amount >= MINERAL_MATERIAL_AMOUNT) l += "All[RDSCREEN_NOBREAK]" + if(amount >= MINERAL_MATERIAL_AMOUNT) l += "Eject [RDSCREEN_NOBREAK]" + if(amount >= MINERAL_MATERIAL_AMOUNT*5) l += "5x [RDSCREEN_NOBREAK]" + if(amount >= MINERAL_MATERIAL_AMOUNT) l += "All[RDSCREEN_NOBREAK]" return l /obj/machinery/computer/rdconsole/proc/ui_techdisk() //Legacy code @@ -535,7 +536,11 @@ Nothing else in the console has ID requirements. l += "

Stored Technology Nodes:

" for(var/i in t_disk.stored_research.researched_nodes) var/datum/techweb_node/N = SSresearch.techweb_node_by_id(i) - l += "[N.display_name]" + l += "[N.display_name] ([N.tech_tier])" + for(var/i in stored_research.hidden_nodes) + if(!t_disk.stored_research.hidden_nodes[i]) + var/datum/techweb_node/N = SSresearch.techweb_node_by_id(i) + l += "Hidden Node - [N.display_name] ([N.tech_tier])" l += "
" return l @@ -676,13 +681,13 @@ Nothing else in the console has ID requirements. var/not_unlocked = (stored_research.available_nodes[N.id] && !stored_research.researched_nodes[N.id]) var/has_points = (stored_research.can_afford(N.get_price(stored_research))) var/research_href = not_unlocked? (has_points? "Research" : "Not Enough Points") : null - l += "[N.display_name][research_href]" + l += "[N.display_name] ([N.tech_tier])[research_href]" l += "

Locked Nodes:

" for(var/datum/techweb_node/N in unavail) - l += "[N.display_name]" + l += "[N.display_name] ([N.tech_tier])" l += "

Researched Nodes:

" for(var/datum/techweb_node/N in res) - l += "[N.display_name]" + l += "[N.display_name] ([N.tech_tier])" l += "
[RDSCREEN_NOBREAK]" return l @@ -695,8 +700,8 @@ Nothing else in the console has ID requirements. return l var/display_name = node.display_name if (selflink) - display_name = "[display_name]" - l += "
[display_name] [RDSCREEN_NOBREAK]" + display_name = "[display_name] ([node.tech_tier])" + l += "
[display_name] ([node.tech_tier]) [RDSCREEN_NOBREAK]" if(minimal) l += "
[node.description]" else @@ -766,9 +771,9 @@ Nothing else in the console has ID requirements. if (linked_lathe && stored_research.researched_designs[selected_design.id]) l += "Construct" if(selected_design.build_type & AUTOLATHE) - lathes += "[machine_icon(/obj/machinery/autolathe)][RDSCREEN_NOBREAK]" + lathes += "[machine_icon(/obj/machinery/modular_fabricator/autolathe)][RDSCREEN_NOBREAK]" if(selected_design.build_type & MECHFAB) - lathes += "[machine_icon(/obj/machinery/mecha_part_fabricator)][RDSCREEN_NOBREAK]" + lathes += "[machine_icon(/obj/machinery/modular_fabricator/exosuit_fab)][RDSCREEN_NOBREAK]" if(selected_design.build_type & BIOGENERATOR) lathes += "[machine_icon(/obj/machinery/biogenerator)][RDSCREEN_NOBREAK]" if(selected_design.build_type & LIMBGROWER) @@ -839,8 +844,8 @@ Nothing else in the console has ID requirements. for(var/i in 1 to length(ui)) if(!findtextEx(ui[i], RDSCREEN_NOBREAK)) ui[i] += "
" - ui[i] = replacetextEx(ui[i], RDSCREEN_NOBREAK, "") - return ui.Join("") + . = ui.Join("") + return replacetextEx(., RDSCREEN_NOBREAK, "") /obj/machinery/computer/rdconsole/Topic(raw, ls) if(..()) @@ -940,7 +945,7 @@ Nothing else in the console has ID requirements. if(!linked_lathe.materials.mat_container) say("No material storage linked to protolathe!") return - linked_lathe.eject_sheets(ls["ejectsheet"], ls["eject_amt"]) + linked_lathe.eject_sheets(locate(ls["ejectsheet"]), ls["eject_amt"]) //Circuit Imprinter Materials if(ls["disposeI"]) //Causes the circuit imprinter to dispose of a single reagent (all of it) if(QDELETED(linked_imprinter)) @@ -959,7 +964,7 @@ Nothing else in the console has ID requirements. if(!linked_imprinter.materials.mat_container) say("No material storage linked to circuit imprinter!") return - linked_imprinter.eject_sheets(ls["imprinter_ejectsheet"], ls["eject_amt"]) + linked_imprinter.eject_sheets(locate(ls["imprinter_ejectsheet"]), ls["eject_amt"]) if(ls["disk_slot"]) disk_slot_selected = text2num(ls["disk_slot"]) if(ls["research_node"]) diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index ea7e4155496d9..ff97e7725a931 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -9,6 +9,7 @@ var/working = TRUE var/research_disabled = FALSE var/server_id = 0 + var/heat_gen = 1 // some notes on this number // as of 4/29/2020, the techweb was set that fed a constant of 52.3 no matter how many servers there were // A coeffecent of sqrt(100/) is set up on a per some older code. Since there are normaly 2 servers this comes out to @@ -59,7 +60,7 @@ var/tot_rating = 0 for(var/obj/item/stock_parts/SP in src) tot_rating += SP.rating - heating_power = heating_power / max(1, tot_rating) + heat_gen = initial(src.heat_gen) / max(1, tot_rating) /obj/machinery/rnd/server/update_icon() if (panel_open) @@ -89,20 +90,11 @@ // This is from the RD server code. It works well enough but I need to move over the // sspace heater code so we can caculate power used per tick as well and making this both // exothermic and an endothermic component - if(env && env.return_temperature() < T20C + 80) + if(env) + var/perc = max((get_env_temp() - temp_tolerance_high), 0) * temp_penalty_coefficient / base_mining_income - var/transfer_moles = 0.25 * env.total_moles() - - var/datum/gas_mixture/removed = env.remove(transfer_moles) - - if(removed) - var/heat_capacity = removed.heat_capacity() - if(heat_capacity == 0 || heat_capacity == null) - heat_capacity = 1 - removed.set_temperature(min((removed.return_temperature()*heat_capacity + heating_power)/heat_capacity, 1000)) - - current_temp = removed.return_temperature() - env.merge(removed) + env.adjust_heat(heating_power * perc * heat_gen) + air_update_turf() src.air_update_turf() else current_temp = env ? env.return_temperature() : -1 @@ -191,6 +183,7 @@ if(!ui) ui = new(user, src, "RDConsole") ui.open() + ui.set_autoupdate(TRUE) /obj/machinery/computer/rdservercontrol/ui_data(mob/user) var/list/data = list() diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 26588f6450a62..2e0742749d68a 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -44,6 +44,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi name = "bluespace rapid part exchange device" desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts." icon_state = "BS_RPED" + item_state = "BS_RPED" w_class = WEIGHT_CLASS_NORMAL works_from_distance = TRUE pshoom_or_beepboopblorpzingshadashwoosh = 'sound/items/pshoom.ogg' @@ -53,42 +54,46 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi /obj/item/storage/part_replacer/bluespace/tier1 /obj/item/storage/part_replacer/bluespace/tier1/PopulateContents() - for(var/i in 1 to 10) + for(var/i in 1 to 50) new /obj/item/stock_parts/capacitor(src) new /obj/item/stock_parts/scanning_module(src) new /obj/item/stock_parts/manipulator(src) new /obj/item/stock_parts/micro_laser(src) new /obj/item/stock_parts/matter_bin(src) + new /obj/item/stock_parts/cell/high(src) /obj/item/storage/part_replacer/bluespace/tier2 /obj/item/storage/part_replacer/bluespace/tier2/PopulateContents() - for(var/i in 1 to 10) + for(var/i in 1 to 50) new /obj/item/stock_parts/capacitor/adv(src) new /obj/item/stock_parts/scanning_module/adv(src) new /obj/item/stock_parts/manipulator/nano(src) new /obj/item/stock_parts/micro_laser/high(src) new /obj/item/stock_parts/matter_bin/adv(src) + new /obj/item/stock_parts/cell/super(src) /obj/item/storage/part_replacer/bluespace/tier3 /obj/item/storage/part_replacer/bluespace/tier3/PopulateContents() - for(var/i in 1 to 10) + for(var/i in 1 to 50) new /obj/item/stock_parts/capacitor/super(src) new /obj/item/stock_parts/scanning_module/phasic(src) new /obj/item/stock_parts/manipulator/pico(src) new /obj/item/stock_parts/micro_laser/ultra(src) new /obj/item/stock_parts/matter_bin/super(src) + new /obj/item/stock_parts/cell/hyper(src) /obj/item/storage/part_replacer/bluespace/tier4 /obj/item/storage/part_replacer/bluespace/tier4/PopulateContents() - for(var/i in 1 to 10) + for(var/i in 1 to 50) new /obj/item/stock_parts/capacitor/quadratic(src) new /obj/item/stock_parts/scanning_module/triphasic(src) new /obj/item/stock_parts/manipulator/femto(src) new /obj/item/stock_parts/micro_laser/quadultra(src) new /obj/item/stock_parts/matter_bin/bluespace(src) + new /obj/item/stock_parts/cell/bluespace(src) /obj/item/storage/part_replacer/cargo //used in a cargo crate diff --git a/code/modules/research/techweb/__techweb_helpers.dm b/code/modules/research/techweb/__techweb_helpers.dm index 2fd89378a554d..f002d01390559 100644 --- a/code/modules/research/techweb/__techweb_helpers.dm +++ b/code/modules/research/techweb/__techweb_helpers.dm @@ -11,8 +11,11 @@ SSresearch.invalid_node_boost[id] = message /proc/techweb_item_boost_check(obj/item/I) //Returns an associative list of techweb node datums with values of the boost it gives. var/list/returned = list() + . = list() if(SSresearch.techweb_boost_items[I.type]) - return SSresearch.techweb_boost_items[I.type] //It should already be formatted in node datum = list(point type = value) + . += SSresearch.techweb_boost_items[I.type] //It should already be formatted in node datum = list(point type = value) + if(I.item_flags & ILLEGAL) + . |= "syndicate_basic" /proc/techweb_item_point_check(obj/item/I) if(SSresearch.techweb_point_items[I.type]) diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index 25c00a4c57a87..6413400b5733c 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -1,4 +1,8 @@ +//Unlock 20% of a tier and the tier will progress to that one. +#define TIER_PROPORTATION_TO_UNLOCK 0.2 +#define MAX_TIER 5 + //Used \n[\s]*origin_tech[\s]*=[\s]*"[\S]+" to delete all origin techs. //Or \n[\s]*origin_tech[\s]*=[\s]list\([A-Z_\s=0-9,]*\) //Used \n[\s]*req_tech[\s]*=[\s]*list\(["a-z\s=0-9,]*\) to delete all req_techs. @@ -21,7 +25,14 @@ var/organization = "Third-Party" //Organization name, used for display. var/list/last_bitcoins = list() //Current per-second production, used for display only. var/list/discovered_mutations = list() //Mutations discovered by genetics, this way they are shared and cant be destroyed by destroying a single console + //Tiers used for the RD console, not actual tier var/list/tiers = list() //Assoc list, id = number, 1 is available, 2 is all reqs are 1, so on + //Discovery scanned thinsg + var/list/scanned_atoms = list() + //Discovery cost tiers + var/current_tier = 1 + var/list/items_per_tier = list() //Assoc list, Key = "[tier level]", Value = Amount of items in tier + var/list/unlocked_in_tier = list() //Assoc list, Key = "[tier level]", Value = Amount of items unlocked in tier /datum/techweb/New() SSresearch.techwebs += src @@ -29,6 +40,13 @@ var/datum/techweb_node/DN = SSresearch.techweb_node_by_id(i) research_node(DN, TRUE, FALSE, FALSE) hidden_nodes = SSresearch.techweb_nodes_hidden.Copy() + items_per_tier = list() + for(var/id in SSresearch.techweb_nodes) + var/datum/techweb_node/node = SSresearch.techweb_node_by_id(id) + if(islist(items_per_tier["[node.tech_tier]"])) + items_per_tier["[node.tech_tier]"] += 1 + else + items_per_tier["[node.tech_tier]"] = 1 return ..() /datum/techweb/admin @@ -54,6 +72,8 @@ available_nodes = null visible_nodes = null custom_designs = null + items_per_tier = null + unlocked_in_tier = null SSresearch.techwebs -= src return ..() @@ -69,14 +89,40 @@ researched_designs = custom_designs.Copy() if(wipe_custom_designs) custom_designs = list() + items_per_tier = list() for(var/id in processing) - update_node_status(SSresearch.techweb_node_by_id(id), FALSE) + var/datum/techweb_node/node = SSresearch.techweb_node_by_id(id) + update_node_status(node, FALSE) + if(islist(items_per_tier["[node.tech_tier]"])) + items_per_tier["[node.tech_tier]"] += 1 + else + items_per_tier["[node.tech_tier]"] = 1 CHECK_TICK + recalculate_tiers() for(var/v in consoles_accessing) var/obj/machinery/computer/rdconsole/V = v V.rescan_views() V.updateUsrDialog() +/datum/techweb/proc/recalculate_tiers() + for(var/id in researched_nodes) + var/datum/techweb_node/node = SSresearch.techweb_node_by_id(id) + if(islist(unlocked_in_tier["[node.tech_tier]"])) + unlocked_in_tier["[node.tech_tier]"] += 1 + else + unlocked_in_tier["[node.tech_tier]"] = 1 + calculate_current_tier() + +/datum/techweb/proc/calculate_current_tier() + current_tier = 1 + for(var/tier in 1 to MAX_TIER) + var/researched_amount = unlocked_in_tier["[tier]"] + var/total_amount = items_per_tier["[tier]"] + if(!researched_amount) + continue + if(researched_amount >= total_amount * TIER_PROPORTATION_TO_UNLOCK) + current_tier = tier + /datum/techweb/proc/add_point_list(list/pointlist) for(var/i in pointlist) if(SSresearch.point_types[i] && pointlist[i] > 0) @@ -131,6 +177,8 @@ returned.available_nodes = available_nodes.Copy() returned.researched_designs = researched_designs.Copy() returned.hidden_nodes = hidden_nodes.Copy() + returned.current_tier = current_tier + returned.unlocked_in_tier = unlocked_in_tier.Copy() return returned /datum/techweb/proc/get_visible_nodes() //The way this is set up is shit but whatever. @@ -202,6 +250,7 @@ /datum/techweb/proc/research_node(datum/techweb_node/node, force = FALSE, auto_adjust_cost = TRUE, get_that_dosh = TRUE) if(!istype(node)) return FALSE + recalculate_tiers() update_node_status(node) if(!force) if(!available_nodes[node.id] || (auto_adjust_cost && (!can_afford(node.get_price(src))))) @@ -215,17 +264,13 @@ for(var/id in node.design_ids) add_design_by_id(id) update_node_status(node) - if(get_that_dosh) - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_SCI) - if(D) - D.adjust_money(SSeconomy.techweb_bounty) return TRUE /datum/techweb/science/research_node(datum/techweb_node/node, force = FALSE, auto_adjust_cost = TRUE, get_that_dosh = TRUE) //When something is researched, triggers the proc for this techweb only . = ..() if(.) node.on_research() - + /datum/techweb/proc/unresearch_node_id(id) return unresearch_node(SSresearch.techweb_node_by_id(id)) @@ -377,3 +422,7 @@ /datum/techweb/specialized/autounlocking/exofab allowed_buildtypes = MECHFAB + +/datum/techweb/specialized/autounlocking/component_printer + design_autounlock_buildtypes = COMPONENT_PRINTER + allowed_buildtypes = COMPONENT_PRINTER diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm index 059c9cc828d5a..1af6ceb4ee0e1 100644 --- a/code/modules/research/techweb/_techweb_node.dm +++ b/code/modules/research/techweb/_techweb_node.dm @@ -4,6 +4,7 @@ /datum/techweb_node var/id + var/tech_tier = 0 var/display_name = "Errored Node" var/description = "Why are you seeing this?" var/hidden = FALSE //Whether it starts off hidden. @@ -89,12 +90,27 @@ for(var/i in L) if(actual_costs[i]) actual_costs[i] -= L[i] + actual_costs[TECHWEB_POINT_TYPE_DISCOVERY] = calculate_discovery_cost(host.current_tier) return actual_costs else return research_costs +/datum/techweb_node/proc/calculate_discovery_cost(their_tier) + var/delta = tech_tier - their_tier + switch(delta) + if(-INFINITY to 0) + return 0 + if(1) + return 1000 + if(2) + return 2500 + if(3) + return 5000 + if(4 to INFINITY) + return 10000 + /datum/techweb_node/proc/price_display(datum/techweb/TN) return techweb_point_display_generic(get_price(TN)) /datum/techweb_node/proc/on_research() //new proc, not currently in file - return \ No newline at end of file + return diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 71f0385e5812a..a550a4934810b 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -4,6 +4,7 @@ //Base Nodes /datum/techweb_node/base id = "base" + tech_tier = 0 starting_node = TRUE display_name = "Basic Research Technology" description = "NT default research technologies." @@ -11,10 +12,11 @@ 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", "paystand", "space_heater", "beaker", "large_beaker", "bucket", "xlarge_beaker", "sec_rshot", "sec_beanbag_slug", "sec_bshot", "sec_slug", "sec_Islug", "sec_Brslug", "sec_dart", "sec_38", - "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass","plumbing_rcd", "antivirus") + "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass","plumbing_rcd", "antivirus", "glasses_prescription") /datum/techweb_node/mmi id = "mmi" + tech_tier = 1 starting_node = TRUE display_name = "Man Machine Interface" description = "A slightly Frankensteinian device that allows human brains to interface natively with software APIs." @@ -22,6 +24,7 @@ /datum/techweb_node/cyborg id = "cyborg" + tech_tier = 1 starting_node = TRUE display_name = "Cyborg Construction" description = "Sapient robots with preloaded tool modules and programmable laws." @@ -30,6 +33,7 @@ /datum/techweb_node/mech id = "mecha" + tech_tier = 1 starting_node = TRUE display_name = "Mechanical Exosuits" description = "Mechanized exosuits that are several magnitudes stronger and more powerful than the average human." @@ -38,6 +42,7 @@ /datum/techweb_node/mech_tools id = "mech_tools" + tech_tier = 1 starting_node = TRUE display_name = "Basic Exosuit Equipment" description = "Various tools fit for basic mech units" @@ -45,14 +50,27 @@ /datum/techweb_node/basic_tools id = "basic_tools" + tech_tier = 0 starting_node = TRUE display_name = "Basic Tools" description = "Basic mechanical, electronic, surgical and botanical tools." - design_ids = list("screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "blood_filter", "hemostat", "surgical_drapes", "syringe", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet", "mop") + design_ids = list("discovery_scanner", "screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "decal_painter", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "blood_filter", "hemostat", "surgical_drapes", "syringe", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet", "mop") + +/datum/techweb_node/basic_circuitry + id = "basic_circuitry" + tech_tier = 0 + starting_node = TRUE + display_name = "Basic Integrated Circuits" + description = "Research on how to fully exploit the power of integrated circuits" + design_ids = list("integrated_circuit", "circuit_multitool", "comp_arithmetic", "comp_clock", "comp_combiner", "comp_comparison", "comp_delay", + "comp_direction", "comp_get_column", "comp_gps", "comp_health", "comp_hear", "comp_light", "comp_logic", "comp_index_table", "comp_mmi", "comp_multiplexer", "comp_not", "comp_ram", + "comp_random", "comp_round", "comp_select_query", "comp_species", "comp_textcase", "comp_trig", "comp_speech", "comp_concat", "comp_concat_list", "comp_speech", "comp_self", "comp_soundemitter", "comp_radio", "comp_tostring", + "comp_typecheck", "compact_remote_shell", "component_printer", "comp_string_contains", "usb_cable") /////////////////////////Biotech///////////////////////// /datum/techweb_node/biotech id = "biotech" + tech_tier = 1 display_name = "Biological Technology" description = "What makes us tick." //the MC, silly! prereq_ids = list("base") @@ -62,6 +80,7 @@ /datum/techweb_node/adv_biotech id = "adv_biotech" + tech_tier = 2 display_name = "Advanced Biotechnology" description = "Advanced Biotechnology" prereq_ids = list("biotech") @@ -71,6 +90,7 @@ /datum/techweb_node/bio_process id = "bio_process" + tech_tier = 1 display_name = "Biological Processing" description = "From slimes to kitchens." prereq_ids = list("biotech") @@ -81,6 +101,7 @@ /////////////////////////Advanced Surgery///////////////////////// /datum/techweb_node/imp_wt_surgery id = "imp_wt_surgery" + tech_tier = 2 display_name = "Improved Wound-Tending Surgery" description = "Who would have known being more gentle with a hemostat decreases patient pain?" prereq_ids = list("adv_biotech") @@ -91,6 +112,7 @@ /datum/techweb_node/adv_surgery id = "adv_surgery" + tech_tier = 3 display_name = "Advanced Surgery" description = "When simple medicine doesn't cut it." prereq_ids = list("imp_wt_surgery") @@ -100,15 +122,17 @@ /datum/techweb_node/exp_surgery id = "exp_surgery" + tech_tier = 4 display_name = "Experimental Surgery" description = "When evolution isn't fast enough." prereq_ids = list("adv_surgery") - design_ids = list("surgery_revival","surgery_pacify","surgery_vein_thread","surgery_muscled_veins","surgery_nerve_splice","surgery_nerve_ground","surgery_ligament_hook","surgery_ligament_reinforcement","surgery_viral_bond", "surgery_heal_combo_upgrade", "autodoc") + design_ids = list("surgery_revival","surgery_pacify","surgery_vein_thread","surgery_muscled_veins","surgery_nerve_splice","surgery_nerve_ground","surgery_ligament_hook","surgery_ligament_reinforcement","surgery_viral_bond", "surgery_heal_combo_upgrade") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) export_price = 5000 /datum/techweb_node/alien_surgery id = "alien_surgery" + tech_tier = 5 display_name = "Alien Surgery" description = "Abductors did nothing wrong." prereq_ids = list("exp_surgery", "alientech") @@ -119,33 +143,17 @@ /////////////////////////data theory tech///////////////////////// /datum/techweb_node/datatheory //Computer science id = "datatheory" + tech_tier = 1 display_name = "Data Theory" description = "Big Data, in space!" prereq_ids = list("base") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 -/datum/techweb_node/circuitresearch - id = "circuitresearch" - display_name = "Circuit Research" - description = "Modular circuitry adaptable to a wide range of utilities." - prereq_ids = list("datatheory") - design_ids = list("icprinter") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - export_price = 5000 - -/datum/techweb_node/circuitupgrades - id = "circuitupgrades" - display_name = "Advanced Circuit Research" - description = "Advanced designs that expand the possibilities of modular circuits." - prereq_ids = list("circuitresearch") - design_ids = list("icupgadv", "icupgclo") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - export_price = 5000 - /////////////////////////engineering tech///////////////////////// /datum/techweb_node/engineering id = "engineering" + tech_tier = 1 display_name = "Industrial Engineering" description = "A refresher course on modern engineering technology." prereq_ids = list("base") @@ -158,15 +166,17 @@ /datum/techweb_node/adv_engi id = "adv_engi" + tech_tier = 2 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_loaded") + design_ids = list("engine_goggles", "magboots", "weldingmask", "rcd_loaded", "rpd_loaded", "ranged_analyzer") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 /datum/techweb_node/anomaly id = "anomaly_research" + tech_tier = 4 display_name = "Anomaly Research" description = "Unlock the potential of the mysterious anomalies that appear on station." prereq_ids = list("adv_engi", "practical_bluespace") @@ -176,6 +186,7 @@ /datum/techweb_node/high_efficiency id = "high_efficiency" + tech_tier = 3 display_name = "High Efficiency Parts" description = "Finely-tooled manufacturing techniques allowing for picometer-perfect precision levels." prereq_ids = list("engineering", "datatheory") @@ -185,6 +196,7 @@ /datum/techweb_node/adv_power id = "adv_power" + tech_tier = 3 display_name = "Advanced Power Manipulation" description = "How to get more zap." prereq_ids = list("engineering") @@ -195,15 +207,17 @@ /////////////////////////Bluespace tech///////////////////////// /datum/techweb_node/bluespace_basic //Bluespace-memery id = "bluespace_basic" + tech_tier = 4 display_name = "Basic Bluespace Theory" description = "Basic studies into the mysterious alternate dimension known as bluespace." prereq_ids = list("base") - design_ids = list("beacon", "dragnetbeacon", "xenobioconsole", "telesci_gps", "bluespace_crystal", "spaceship_navigation_beacon") + design_ids = list("beacon", "dragnetbeacon", "xenobioconsole", "telesci_gps", "bluespace_crystal") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 /datum/techweb_node/bluespace_travel id = "bluespace_travel" + tech_tier = 5 display_name = "Bluespace Travel" description = "Application of Bluespace for static teleportation technology." prereq_ids = list("practical_bluespace") @@ -213,15 +227,50 @@ /datum/techweb_node/micro_bluespace id = "micro_bluespace" + tech_tier = 5 display_name = "Miniaturized Bluespace Research" description = "Extreme reduction in space required for bluespace engines, leading to portable bluespace technology." prereq_ids = list("bluespace_travel", "practical_bluespace", "high_efficiency") - design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "bag_holding", "quantum_keycard", "wormholeprojector", "swapper", "antivirus4") + design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "quantum_keycard", "antivirus4") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) export_price = 5000 +/datum/techweb_node/bag_of_holding + id = "bagofholding" + tech_tier = 5 + display_name = "Bag of Holding" + description = "Portable bluespace technology allows the production of backpacks that can store a greater volume of items than the volume of the bag." + prereq_ids = list("micro_bluespace") + design_ids = list("bag_holding") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + export_price = 5000 + hidden = TRUE + +/datum/techweb_node/wormhole_gun + id = "wormholegun" + tech_tier = 5 + display_name = "Bluespace Wormhole Projector" + description = "Develop the research required to create a miniaturized bluespace wormhole projector, allowing you to jump between two places instantly." + prereq_ids = list("micro_bluespace") + design_ids = list("wormholeprojector") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + export_price = 5000 + hidden = TRUE + +/datum/techweb_node/quantum_spin + id = "qswapper" + tech_tier = 5 + display_name = "Quantum Spin Inverter" + description = "Research the ability to create an experimental device that is able to swap the locations of two entities by switching their particles' spin values. Must be linked to another device to function." + prereq_ids = list("micro_bluespace") + design_ids = list("swapper") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + export_price = 5000 + hidden = TRUE + /datum/techweb_node/practical_bluespace id = "practical_bluespace" + tech_tier = 4 display_name = "Applied Bluespace Research" description = "Using bluespace to make things faster and better." prereq_ids = list("bluespace_basic", "engineering") @@ -231,6 +280,7 @@ /datum/techweb_node/bluespace_power id = "bluespace_power" + tech_tier = 4 display_name = "Bluespace Power Technology" description = "Even more powerful.. power!" prereq_ids = list("adv_power", "practical_bluespace") @@ -240,6 +290,7 @@ /datum/techweb_node/unregulated_bluespace id = "unregulated_bluespace" + tech_tier = 5 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_travel", "syndicate_basic") @@ -251,6 +302,7 @@ /////////////////////////plasma tech///////////////////////// /datum/techweb_node/basic_plasma id = "basic_plasma" + tech_tier = 1 display_name = "Basic Plasma Research" description = "Research into the mysterious and dangerous substance, plasma." prereq_ids = list("engineering") @@ -260,6 +312,7 @@ /datum/techweb_node/adv_plasma id = "adv_plasma" + tech_tier = 2 display_name = "Advanced Plasma Research" description = "Research on how to fully exploit the power of plasma." prereq_ids = list("basic_plasma") @@ -270,43 +323,74 @@ /////////////////////////shuttle tech///////////////////////// /datum/techweb_node/basic_shuttle_tech id = "basic_shuttle" + tech_tier = 3 display_name = "Basic Shuttle Research" description = "Research the technology required to create and use basic shuttles." prereq_ids = list("bluespace_travel", "adv_engi") - design_ids = list("shuttle_creator", "engine_plasma", "engine_heater", "shuttle_control", "shuttle_docker", "wingpack") + design_ids = list("shuttle_creator", "engine_plasma", "engine_heater", "shuttle_control", "wingpack") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) export_price = 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) - export_price = 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", "micro_bluespace") - design_ids = list("disk_shuttle_route_hyper") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - export_price = 5000 - -/datum/techweb_node/shuttle_route_upgrade_void - id = "shuttle_route_upgrade_void" - display_name = "Nullspace Breaching Upgrade" +/datum/techweb_node/nullspacebreaching + id = "nullspacebreaching" + display_name = "Nullspace Breaching" 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", "wingpack_ayy") + prereq_ids = list("basic_shuttle", "alientech") + design_ids = list("engine_void", "wingpack_ayy") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 12500) export_price = 5000 +/////////////////////////integrated circuits tech///////////////////////// + +/datum/techweb_node/math_circuits + id = "math_circuits" + tech_tier = 1 + display_name = "Math Circuitry" + description = "Development of more complex mathematical components for all your number manipulating needs" + prereq_ids = list("basic_circuitry", "datatheory") + design_ids = list("comp_adv_trig","comp_hyper_trig", "comp_bitwise", "comp_bitflag") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) + +/datum/techweb_node/list_circuits + id = "list_circuits" + tech_tier = 1 + display_name = "List Circuitry" + description = "Configures new integrated circuit components capable of representing one dimensional data structures such as arrays, stacks, and queues." + prereq_ids = list("basic_circuitry", "datatheory") + design_ids = list("comp_index", "comp_write", "comp_append", "comp_pop", "comp_length", "comp_list_constructor", "comp_list_length_constructor") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) + +/datum/techweb_node/adv_shells + id = "adv_shells" + tech_tier = 2 + display_name = "Advanced Shell Research" + description = "Grants access to more complicated shell designs." + prereq_ids = list("basic_circuitry", "engineering") + design_ids = list("controller_shell", "scanner_shell", "bot_shell", "door_shell", "money_bot_shell") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/movable_shells_tech + id = "movable_shells" + tech_tier = 2 + display_name = "Movable Shell Research" + description = "Grants access to movable shells." + prereq_ids = list("adv_shells", "robotics") + design_ids = list("comp_pull", "drone_shell") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) + +/datum/techweb_node/server_shell_tech + id = "server_shell" + tech_tier = 2 + display_name = "Server Technology Research" + description = "Grants access to a server shell that has a very high capacity for components." + prereq_ids = list("adv_shells", "computer_hardware_basic") + design_ids = list("server_shell") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) + /////////////////////////robotics tech///////////////////////// /datum/techweb_node/robotics id = "robotics" + tech_tier = 2 display_name = "Basic Robotics Research" description = "Programmable machines that make our lives lazier." prereq_ids = list("base") @@ -316,6 +400,7 @@ /datum/techweb_node/adv_robotics id = "adv_robotics" + tech_tier = 3 display_name = "Advanced Robotics Research" description = "It can even do the dishes!" prereq_ids = list("robotics") @@ -325,6 +410,7 @@ /datum/techweb_node/neural_programming id = "neural_programming" + tech_tier = 2 display_name = "Neural Programming" description = "Study into networks of processing units that mimic our brains." prereq_ids = list("biotech", "datatheory") @@ -342,6 +428,7 @@ /datum/techweb_node/cyborg_upg_util id = "cyborg_upg_util" + tech_tier = 3 display_name = "Cyborg Upgrades: Utility" description = "Utility upgrades for cyborgs." prereq_ids = list("engineering") @@ -351,6 +438,7 @@ /datum/techweb_node/cyborg_upg_med id = "cyborg_upg_med" + tech_tier = 3 display_name = "Cyborg Upgrades: Medical" description = "Medical upgrades for cyborgs." prereq_ids = list("adv_biotech") @@ -360,15 +448,41 @@ /datum/techweb_node/cyborg_upg_combat id = "cyborg_upg_combat" + tech_tier = 3 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") + design_ids = list("borg_upgrade_vtec") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + export_price = 5000 + +/datum/techweb_node/cyborg_upg_service + id = "cyborg_upg_service" + tech_tier = 3 + display_name = "Cyborg Upgrades: Service" + description = "Allows service borgs to specialize with various modules." + prereq_ids = list("cyborg_upg_util") + design_ids = list("borg_upgrade_casino", "borg_upgrade_kitchen", "borg_upgrade_botany", "borg_upgrade_party") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) + export_price = 1000 + +/datum/techweb_node/cyborg_upg_security + id = "cyborg_upg_security" + tech_tier = 4 + display_name = "Cyborg Upgrades: Security" + description = "Militia grade upgrades for cyborgs." + prereq_ids = list("adv_robotics", "adv_engi" , "weaponry") + design_ids = list("borg_transform_security", "borg_upgrade_disablercooler") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) export_price = 5000 +/datum/techweb_node/cyborg_upg_security/New() //Techweb nodes don't have an init, + . = ..() + hidden = CONFIG_GET(flag/disable_secborg) + /datum/techweb_node/ai id = "ai" + tech_tier = 3 display_name = "Artificial Intelligence" description = "AI unit research." prereq_ids = list("robotics", "posibrain") @@ -381,6 +495,7 @@ /////////////////////////EMP tech///////////////////////// /datum/techweb_node/emp_basic //EMP tech for some reason id = "emp_basic" + tech_tier = 2 display_name = "Electromagnetic Theory" description = "Study into usage of frequencies in the electromagnetic spectrum." prereq_ids = list("base") @@ -390,6 +505,7 @@ /datum/techweb_node/emp_adv id = "emp_adv" + tech_tier = 3 display_name = "Advanced Electromagnetic Theory" description = "Determining whether reversing the polarity will actually help in a given situation." prereq_ids = list("emp_basic") @@ -399,6 +515,7 @@ /datum/techweb_node/emp_super id = "emp_super" + tech_tier = 4 display_name = "Quantum Electromagnetic Technology" //bs description = "Even better electromagnetic technology." prereq_ids = list("emp_adv") @@ -409,6 +526,7 @@ /////////////////////////Clown tech///////////////////////// /datum/techweb_node/clown id = "clown" + tech_tier = 2 display_name = "Clown Technology" description = "Honk?!" prereq_ids = list("base") @@ -420,15 +538,17 @@ ////////////////////////Computer tech//////////////////////// /datum/techweb_node/comptech id = "comptech" + tech_tier = 1 display_name = "Computer Consoles" description = "Computers and how they work." prereq_ids = list("datatheory") - design_ids = list("cargo", "cargorequest", "libraryconsole", "mining", "crewconsole", "rdcamera", "comconsole", "idcardconsole", "seccamera") + design_ids = list("cargo", "cargorequest", "objective", "libraryconsole", "mining", "crewconsole", "rdcamera", "comconsole", "idcardconsole", "seccamera") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) export_price = 5000 /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" + tech_tier = 1 display_name = "Computer Hardware" description = "How computer hardware are made." prereq_ids = list("comptech") @@ -440,6 +560,7 @@ /datum/techweb_node/computer_board_gaming id = "computer_board_gaming" + tech_tier = 1 display_name = "Arcade Games" description = "For the slackers on the station." prereq_ids = list("comptech") @@ -449,6 +570,7 @@ /datum/techweb_node/comp_recordkeeping id = "comp_recordkeeping" + tech_tier = 2 display_name = "Computerized Recordkeeping" description = "Organized record databases and how they're used." prereq_ids = list("comptech") @@ -458,6 +580,7 @@ /datum/techweb_node/telecomms id = "telecomms" + tech_tier = 3 display_name = "Telecommunications Technology" description = "Subspace transmission technology for near-instant communications devices." prereq_ids = list("comptech", "bluespace_basic") @@ -468,6 +591,7 @@ /datum/techweb_node/integrated_HUDs id = "integrated_HUDs" + tech_tier = 3 display_name = "Integrated HUDs" description = "The usefulness of computerized records, projected straight onto your eyepiece!" prereq_ids = list("comp_recordkeeping", "emp_basic") @@ -477,6 +601,7 @@ /datum/techweb_node/NVGtech id = "NVGtech" + tech_tier = 3 display_name = "Night Vision Technology" description = "Allows seeing in the dark without actual light!" prereq_ids = list("integrated_HUDs", "adv_engi", "emp_adv") @@ -487,6 +612,7 @@ ////////////////////////Medical//////////////////////// /datum/techweb_node/cloning id = "cloning" + tech_tier = 3 display_name = "Genetic Engineering" description = "We have the technology to make him." prereq_ids = list("biotech") @@ -496,6 +622,7 @@ /datum/techweb_node/cryotech id = "cryotech" + tech_tier = 3 display_name = "Cryostasis Technology" description = "Smart freezing of objects to preserve them!" prereq_ids = list("adv_engi", "biotech") @@ -505,6 +632,7 @@ /datum/techweb_node/subdermal_implants id = "subdermal_implants" + tech_tier = 4 display_name = "Subdermal Implants" description = "Electronic implants buried beneath the skin." prereq_ids = list("biotech") @@ -514,6 +642,7 @@ /datum/techweb_node/cyber_organs id = "cyber_organs" + tech_tier = 4 display_name = "Cybernetic Organs" description = "We have the technology to rebuild him." prereq_ids = list("adv_biotech") @@ -523,6 +652,7 @@ /datum/techweb_node/cyber_organs_upgraded id = "cyber_organs_upgraded" + tech_tier = 5 display_name = "Upgraded Cybernetic Organs" description = "We have the technology to upgrade him." prereq_ids = list("cyber_organs") @@ -532,6 +662,7 @@ /datum/techweb_node/ipc_organs id = "ipc_organs" + tech_tier = 3 display_name = "IPC Parts" description = "We have the technology to replace him." prereq_ids = list("cyber_organs","robotics") @@ -541,6 +672,7 @@ /datum/techweb_node/cyber_implants id = "cyber_implants" + tech_tier = 4 display_name = "Cybernetic Implants" description = "Electronic implants that improve humans." prereq_ids = list("adv_biotech", "datatheory") @@ -550,44 +682,51 @@ /datum/techweb_node/adv_cyber_implants id = "adv_cyber_implants" + tech_tier = 5 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") + design_ids = list("ci-toolset", "ci-surgery","ci-janitor", "ci-botany", "ci-reviver", "ci-nutrimentplus") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 /datum/techweb_node/combat_cyber_implants id = "combat_cyber_implants" + tech_tier = 5 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) export_price = 5000 + hidden = TRUE /datum/techweb_node/adv_combat_cyber_implants id = "adv_combat_cyber_implants" + tech_tier = 5 display_name = "Advanced Combat Cybernetic Implants" description = "Experimental military cybernetic weapons." - prereq_ids = list("combat_cyber_implants", "syndicate_basic") + prereq_ids = list("adv_cyber_implants", "syndicate_basic") design_ids = list("hydraulic_blade") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) export_price = 10000 + hidden = TRUE ////////////////////////Tools//////////////////////// /datum/techweb_node/basic_mining id = "basic_mining" + tech_tier = 1 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) + design_ids = list("drill", "superresonator", "triggermod", "damagemod", "cooldownmod", "rangemod", "ore_redemption", "mining_equipment_vendor", "exploration_equipment_vendor", "cargoexpress", "plasmacutter")//e a r l y g a m e) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 /datum/techweb_node/adv_mining id = "adv_mining" + tech_tier = 3 display_name = "Advanced Mining Technology" description = "Efficiency Level 127" //dumb mc references prereq_ids = list("basic_mining", "adv_engi", "adv_power", "adv_plasma") @@ -595,17 +734,9 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 -/datum/techweb_node/bluespace_mining - id = "bluespace_mining" - display_name = "Bluespace Mining Technology" - description = "Harness the power of bluespace to make materials out of nothing. Slowly." - prereq_ids = list("practical_bluespace", "adv_mining") - design_ids = list("bluespace_miner") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - export_price = 5000 - /datum/techweb_node/janitor id = "janitor" + tech_tier = 1 display_name = "Advanced Sanitation Technology" description = "Clean things better, faster, stronger, and harder!" prereq_ids = list("adv_engi") @@ -615,6 +746,7 @@ /datum/techweb_node/botany id = "botany" + tech_tier = 1 display_name = "Botanical Engineering" description = "Botanical tools" prereq_ids = list("adv_engi", "biotech") @@ -624,6 +756,7 @@ /datum/techweb_node/exp_tools id = "exp_tools" + tech_tier = 3 display_name = "Experimental Tools" description = "Highly advanced tools." design_ids = list("exwelder", "jawsoflife", "handdrill", "laserscalpel", "mechanicalpinches", "searingtool") @@ -633,6 +766,7 @@ /datum/techweb_node/sec_basic id = "sec_basic" + tech_tier = 1 display_name = "Basic Security Equipment" description = "Standard equipment used by security." design_ids = list("seclite", "pepperspray", "bola_energy", "zipties", "evidencebag", "flashbulb") @@ -642,6 +776,7 @@ /datum/techweb_node/rcd_upgrade id = "rcd_upgrade" + tech_tier = 3 display_name = "RCD designs upgrade" description = "Unlocks new RCD designs." design_ids = list("rcd_upgrade_frames", "rcd_upgrade_simple_circuits") @@ -651,6 +786,7 @@ /datum/techweb_node/adv_rcd_upgrade id = "adv_rcd_upgrade" + tech_tier = 4 display_name = "Advanced RCD designs upgrade" description = "Unlocks new RCD designs." design_ids = list("rcd_upgrade_silo_link") @@ -663,6 +799,7 @@ /datum/techweb_node/landmine id = "nonlethal_mines" + tech_tier = 3 display_name = "Nonlethal Landmine Technology" description = "Our weapons technicians could perhaps work out methods for the creation of nonlethal landmines for security teams." prereq_ids = list("sec_basic") @@ -672,6 +809,7 @@ /datum/techweb_node/weaponry id = "weaponry" + tech_tier = 3 display_name = "Weapon Development Technology" description = "Our researchers have found new ways to weaponize just about everything now." prereq_ids = list("engineering") @@ -681,6 +819,7 @@ /datum/techweb_node/smartmine id = "smart_mines" + tech_tier = 4 display_name = "Smart Landmine Technology" description = "Using IFF technology, we could develop smartmines that do not trigger for those who are mindshielded." prereq_ids = list("weaponry", "nonlethal_mines", "engineering") @@ -690,6 +829,7 @@ /datum/techweb_node/adv_weaponry id = "adv_weaponry" + tech_tier = 4 display_name = "Advanced Weapon Development Technology" description = "Our weapons are breaking the rules of reality by now." prereq_ids = list("adv_engi", "weaponry") @@ -699,6 +839,7 @@ /datum/techweb_node/advmine id = "adv_mines" + tech_tier = 4 display_name = "Advanced Landmine Technology" description = "We can further develop our smartmines to build some extremely capable designs." prereq_ids = list("weaponry", "smart_mines", "adv_engi") @@ -708,6 +849,7 @@ /datum/techweb_node/electric_weapons id = "electronic_weapons" + tech_tier = 4 display_name = "Electric Weapons" description = "Weapons using electric technology" prereq_ids = list("weaponry", "adv_power" , "emp_basic") @@ -717,15 +859,18 @@ /datum/techweb_node/radioactive_weapons id = "radioactive_weapons" + tech_tier = 5 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) export_price = 5000 + hidden = TRUE /datum/techweb_node/medical_weapons id = "medical_weapons" + tech_tier = 4 display_name = "Medical Weaponry" description = "Weapons using medical technology." prereq_ids = list("adv_biotech", "weaponry") @@ -735,24 +880,29 @@ /datum/techweb_node/beam_weapons id = "beam_weapons" + tech_tier = 4 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) export_price = 5000 + hidden = TRUE /datum/techweb_node/adv_beam_weapons id = "adv_beam_weapons" + tech_tier = 5 display_name = "Advanced Beam Weaponry" description = "Various advanced beam weapons" - prereq_ids = list("beam_weapons") + prereq_ids = list("adv_weaponry") design_ids = list("beamrifle") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 + hidden = TRUE /datum/techweb_node/explosive_weapons id = "explosive_weapons" + tech_tier = 3 display_name = "Explosive & Pyrotechnical Weaponry" description = "If the light stuff just won't do it." prereq_ids = list("adv_weaponry") @@ -762,24 +912,28 @@ /datum/techweb_node/ballistic_weapons id = "ballistic_weapons" + tech_tier = 3 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") + design_ids = list("mag_oldsmg", "mag_oldsmg_ap", "mag_oldsmg_ic", "mag_oldsmg_rubber") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 /datum/techweb_node/exotic_ammo id = "exotic_ammo" + tech_tier = 4 display_name = "Exotic Ammunition" description = "They won't know what hit em." prereq_ids = list("adv_weaponry", "medical_weapons") design_ids = list("techshotshell", "c38_hotshot", "c38_iceblox", "shotgundartcryostasis") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 + hidden = TRUE /datum/techweb_node/gravity_gun id = "gravity_gun" + tech_tier = 5 display_name = "One-point Bluespace-gravitational Manipulator" description = "Fancy wording for gravity gun." prereq_ids = list("adv_weaponry", "bluespace_travel") @@ -790,6 +944,7 @@ ////////////////////////mech technology//////////////////////// /datum/techweb_node/adv_mecha id = "adv_mecha" + tech_tier = 3 display_name = "Advanced Exosuits" description = "For when you just aren't Gundam enough." prereq_ids = list("adv_robotics") @@ -799,6 +954,7 @@ /datum/techweb_node/odysseus id = "mecha_odysseus" + tech_tier = 3 display_name = "EXOSUIT: Odysseus" description = "Odysseus exosuit designs" prereq_ids = list("base") @@ -809,6 +965,7 @@ /datum/techweb_node/gygax id = "mech_gygax" + tech_tier = 4 display_name = "EXOSUIT: Gygax" description = "Gygax exosuit designs" prereq_ids = list("adv_mecha", "weaponry") @@ -819,6 +976,7 @@ /datum/techweb_node/durand id = "mech_durand" + tech_tier = 4 display_name = "EXOSUIT: Durand" description = "Durand exosuit designs" prereq_ids = list("adv_mecha", "adv_weaponry") @@ -829,6 +987,7 @@ /datum/techweb_node/phazon id = "mecha_phazon" + tech_tier = 5 display_name = "EXOSUIT: Phazon" description = "Phazon exosuit designs" prereq_ids = list("adv_mecha", "weaponry" , "micro_bluespace") @@ -836,9 +995,11 @@ "phazon_peri", "phazon_targ", "phazon_armor") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 + hidden = TRUE /datum/techweb_node/adv_mecha_tools id = "adv_mecha_tools" + tech_tier = 3 display_name = "Advanced Exosuit Equipment" description = "Tools for high level mech suits" prereq_ids = list("adv_mecha") @@ -848,6 +1009,7 @@ /datum/techweb_node/med_mech_tools id = "med_mech_tools" + tech_tier = 3 display_name = "Medical Exosuit Equipment" description = "Tools for high level mech suits" prereq_ids = list("adv_biotech") @@ -857,6 +1019,7 @@ /datum/techweb_node/mech_modules id = "adv_mecha_modules" + tech_tier = 3 display_name = "Simple Exosuit Modules" description = "An advanced piece of mech weaponry" prereq_ids = list("adv_mecha", "bluespace_power") @@ -866,6 +1029,7 @@ /datum/techweb_node/mech_scattershot id = "mecha_tools" + tech_tier = 4 display_name = "Exosuit Weapon (LBX AC 10 \"Scattershot\")" description = "An advanced piece of mech weaponry" prereq_ids = list("ballistic_weapons") @@ -875,6 +1039,7 @@ /datum/techweb_node/mech_carbine id = "mech_carbine" + tech_tier = 4 display_name = "Exosuit Weapon (FNX-99 \"Hades\" Carbine)" description = "An advanced piece of mech weaponry" prereq_ids = list("ballistic_weapons") @@ -884,6 +1049,7 @@ /datum/techweb_node/mech_ion id = "mmech_ion" + tech_tier = 4 display_name = "Exosuit Weapon (MKIV Ion Heavy Cannon)" description = "An advanced piece of mech weaponry" prereq_ids = list("electronic_weapons", "emp_adv") @@ -893,6 +1059,7 @@ /datum/techweb_node/mech_tesla id = "mech_tesla" + tech_tier = 4 display_name = "Exosuit Weapon (MKI Tesla Cannon)" description = "An advanced piece of mech weaponry" prereq_ids = list("electronic_weapons", "adv_power") @@ -902,6 +1069,7 @@ /datum/techweb_node/mech_laser id = "mech_laser" + tech_tier = 4 display_name = "Exosuit Weapon (CH-PS \"Immolator\" Laser)" description = "A basic piece of mech weaponry" prereq_ids = list("beam_weapons") @@ -911,6 +1079,7 @@ /datum/techweb_node/mech_laser_heavy id = "mech_laser_heavy" + tech_tier = 4 display_name = "Exosuit Weapon (CH-LC \"Solaris\" Laser Cannon)" description = "An advanced piece of mech weaponry" prereq_ids = list("adv_beam_weapons") @@ -920,6 +1089,7 @@ /datum/techweb_node/mech_disabler id = "mech_disabler" + tech_tier = 4 display_name = "Exosuit Weapon (CH-DS \"Peacemaker\" Mounted Disabler)" description = "A basic piece of mech weaponry" prereq_ids = list("beam_weapons") @@ -929,6 +1099,7 @@ /datum/techweb_node/mech_grenade_launcher id = "mech_grenade_launcher" + tech_tier = 4 display_name = "Exosuit Weapon (SGL-6 Grenade Launcher)" description = "An advanced piece of mech weaponry" prereq_ids = list("explosive_weapons") @@ -936,17 +1107,9 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 -/datum/techweb_node/mech_missile_rack - id = "mech_missile_rack" - display_name = "Exosuit Weapon (SRM-8 Missile Rack)" - description = "An advanced piece of mech weaponry" - prereq_ids = list("explosive_weapons") - design_ids = list("mech_missile_rack") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - export_price = 5000 - /datum/techweb_node/clusterbang_launcher id = "clusterbang_launcher" + tech_tier = 4 display_name = "Exosuit Module (SOB-3 Clusterbang Launcher)" description = "An advanced piece of mech weaponry" prereq_ids = list("explosive_weapons") @@ -956,6 +1119,7 @@ /datum/techweb_node/mech_teleporter id = "mech_teleporter" + tech_tier = 4 display_name = "Exosuit Module (Teleporter Module)" description = "An advanced piece of mech Equipment" prereq_ids = list("micro_bluespace") @@ -965,6 +1129,7 @@ /datum/techweb_node/mech_wormhole_gen id = "mech_wormhole_gen" + tech_tier = 4 display_name = "Exosuit Module (Localized Wormhole Generator)" description = "An advanced piece of mech weaponry" prereq_ids = list("bluespace_travel") @@ -974,6 +1139,7 @@ /datum/techweb_node/mech_lmg id = "mech_lmg" + tech_tier = 4 display_name = "Exosuit Weapon (\"Ultra AC 2\" LMG)" description = "An advanced piece of mech weaponry" prereq_ids = list("ballistic_weapons") @@ -983,6 +1149,7 @@ /datum/techweb_node/mech_diamond_drill id = "mech_diamond_drill" + tech_tier = 3 display_name = "Exosuit Diamond Drill" description = "A diamond drill fit for a large exosuit" prereq_ids = list("adv_mining") @@ -993,6 +1160,7 @@ /////////////////////////Nanites///////////////////////// /datum/techweb_node/nanite_base id = "nanite_base" + tech_tier = 2 display_name = "Basic Nanite Programming" description = "The basics of nanite construction and programming." prereq_ids = list("datatheory") @@ -1004,6 +1172,7 @@ /datum/techweb_node/nanite_smart id = "nanite_smart" + tech_tier = 2 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","robotics") @@ -1013,6 +1182,7 @@ /datum/techweb_node/nanite_mesh id = "nanite_mesh" + tech_tier = 2 display_name = "Mesh Nanite Programming" description = "Nanite programs that require static structures and membranes." prereq_ids = list("nanite_base","engineering") @@ -1022,6 +1192,7 @@ /datum/techweb_node/nanite_bio id = "nanite_bio" + tech_tier = 3 display_name = "Biological Nanite Programming" description = "Nanite programs that require complex biological interaction." prereq_ids = list("nanite_base","biotech") @@ -1032,6 +1203,7 @@ /datum/techweb_node/nanite_neural id = "nanite_neural" + tech_tier = 3 display_name = "Neural Nanite Programming" description = "Nanite programs affecting nerves and brain matter." prereq_ids = list("nanite_bio") @@ -1041,6 +1213,7 @@ /datum/techweb_node/nanite_synaptic id = "nanite_synaptic" + tech_tier = 4 display_name = "Synaptic Nanite Programming" description = "Nanite programs affecting mind and thoughts." prereq_ids = list("nanite_neural","neural_programming") @@ -1050,24 +1223,27 @@ /datum/techweb_node/nanite_harmonic id = "nanite_harmonic" + tech_tier = 4 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","aggressive_nanites","defib_nanites","regenerative_plus_nanites","brainheal_plus_nanites","purging_plus_nanites","adrenaline_nanites") + design_ids = list("fakedeath_nanites","aggressive_nanites","defib_nanites","regenerative_plus_nanites","brainheal_plus_nanites","purging_plus_nanites", "sensor_species_nanites","adrenaline_nanites") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000, TECHWEB_POINT_TYPE_NANITES = 2000) export_price = 8000 /datum/techweb_node/nanite_combat id = "nanite_military" + tech_tier = 5 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","nanite_sting_nanites") + design_ids = list("explosive_nanites","pyro_nanites","meltdown_nanites","viral_nanites","nanite_sting_nanites", "haste_nanites") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500, TECHWEB_POINT_TYPE_NANITES = 2500) export_price = 12500 /datum/techweb_node/nanite_hazard id = "nanite_hazard" + tech_tier = 5 display_name = "Hazard Nanite Programs" description = "Extremely advanced Nanite programs with the potential of being extremely dangerous." prereq_ids = list("nanite_harmonic", "alientech") @@ -1078,6 +1254,7 @@ ////////////////////////Alien technology//////////////////////// /datum/techweb_node/alientech //AYYYYYYYYLMAOO tech id = "alientech" + tech_tier = 5 display_name = "Alien Technology" description = "Things used by the greys." prereq_ids = list("biotech","engineering") @@ -1094,6 +1271,7 @@ /datum/techweb_node/alien_bio id = "alien_bio" + tech_tier = 5 display_name = "Alien Biological Tools" description = "Advanced biological tools." prereq_ids = list("alientech", "adv_biotech") @@ -1107,6 +1285,7 @@ /datum/techweb_node/alien_engi id = "alien_engi" + tech_tier = 5 display_name = "Alien Engineering" description = "Alien engineering tools" prereq_ids = list("alientech", "adv_engi") @@ -1119,22 +1298,38 @@ /datum/techweb_node/syndicate_basic id = "syndicate_basic" + tech_tier = 4 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", "ai_cam_upgrade", "suppressor", "largecrossbow", "donksofttoyvendor", "donksoft_refill", "advanced_camera") + design_ids = list("decloner", "borg_syndicate_module", "ai_cam_upgrade", "suppressor", "largecrossbow", "donksofttoyvendor", "donksoft_refill", "advanced_camera" , "arcade_amputation") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) export_price = 5000 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/sticky_basic + id = "sticky_basic" + tech_tier = 3 + 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("syndicate_basic", "adv_engi") + design_ids = list("sticky_tape") + + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + export_price = 2500 + hidden = TRUE + +/datum/techweb_node/sticky_advanced + id = "sticky_advanced" + tech_tier = 4 + 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) + export_price = 2500 + hidden = TRUE //Helpers for debugging/balancing the techweb in its entirety! /proc/total_techweb_exports() diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index c20e8824e074b..2f279406239c4 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -19,7 +19,7 @@ Slimecrossing Armor /obj/item/clothing/mask/nobreath/equipped(mob/living/carbon/human/user, slot) . = ..() - if(slot == SLOT_WEAR_MASK) + if(slot == ITEM_SLOT_MASK) ADD_TRAIT(user, TRAIT_NOBREATH, "breathmask_[REF(src)]") user.failed_last_breath = FALSE user.clear_alert("not_enough_oxy") @@ -39,7 +39,7 @@ Slimecrossing Armor var/glasses_color = "#FFFFFF" /obj/item/clothing/glasses/prism_glasses/item_action_slot_check(slot) - if(slot == SLOT_GLASSES) + if(slot == ITEM_SLOT_EYES) return TRUE /obj/structure/light_prism @@ -112,7 +112,7 @@ Slimecrossing Armor /obj/item/clothing/head/peaceflower/equipped(mob/living/carbon/human/user, slot) . = ..() - if(slot == SLOT_HEAD) + if(slot == ITEM_SLOT_HEAD) ADD_TRAIT(user, TRAIT_PACIFISM, "peaceflower_[REF(src)]") /obj/item/clothing/head/peaceflower/dropped(mob/living/carbon/human/user) diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index b3d3575344986..f8107267cb074 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -248,7 +248,7 @@ Slimecrossing Items icon_state = "frozen" density = TRUE max_integrity = 100 - armor = list("melee" = 30, "bullet" = 50, "laser" = -50, "energy" = -50, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = -80, "acid" = 30) + armor = list("melee" = 30, "bullet" = 50, "laser" = -50, "energy" = -50, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = -80, "acid" = 30, "stamina" = 0) /obj/structure/ice_stasis/Initialize() . = ..() @@ -276,18 +276,8 @@ Slimecrossing Items to_chat(user, "The capture device only works on simple creatures.") return if(M.mind) - to_chat(user, "You offer the device to [M].") - if(alert(M, "Would you like to enter [user]'s capture device?", "Gold Capture Device", "Yes", "No") == "Yes") - if(user.canUseTopic(src, BE_CLOSE) && user.canUseTopic(M, BE_CLOSE)) - to_chat(user, "You store [M] in the capture device.") - to_chat(M, "The world warps around you, and you're suddenly in an endless void, with a window to the outside floating in front of you.") - store(M, user) - else - to_chat(user, "You were too far away from [M].") - to_chat(M, "You were too far away from [user].") - else - to_chat(user, "[M] refused to enter the device.") - return + INVOKE_ASYNC(src, .proc/offer_entry, M, user) + return else if(istype(M, /mob/living/simple_animal/hostile) && !("neutral" in M.faction)) to_chat(user, "This creature is too aggressive to capture.") @@ -295,6 +285,20 @@ Slimecrossing Items to_chat(user, "You store [M] in the capture device.") store(M) +/obj/item/capturedevice/proc/offer_entry(mob/living/M, mob/user) + to_chat(user, "You offer the device to [M].") + if(alert(M, "Would you like to enter [user]'s capture device?", "Gold Capture Device", "Yes", "No") != "Yes") + to_chat(user, "[M] refused to enter the device.") + return + if(!user.canUseTopic(src, BE_CLOSE) || !user.canUseTopic(M, BE_CLOSE)) + to_chat(user, "You were too far away from [M].") + to_chat(M, "You were too far away from [user].") + return + + to_chat(user, "You store [M] in the capture device.") + to_chat(M, "The world warps around you, and you're suddenly in an endless void, with a window to the outside floating in front of you.") + store(M, user) + /obj/item/capturedevice/attack_self(mob/user) if(contents.len) to_chat(user, "You open the capture device!") @@ -308,3 +312,25 @@ Slimecrossing Items /obj/item/capturedevice/proc/release() for(var/atom/movable/M in contents) M.forceMove(get_turf(loc)) + +/obj/item/cerulean_slime_crystal + name = "Cerulean slime poly-crystal" + desc = "Translucent and irregular, it can duplicate matter on a whim" + icon = 'icons/obj/slimecrossing.dmi' + icon_state = "cerulean_item_crystal" + var/amt = 0 + +/obj/item/cerulean_slime_crystal/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!istype(target,/obj/item/stack) || !istype(user,/mob/living/carbon) || !proximity_flag) + return + var/obj/item/stack/stack_item = target + + if(istype(stack_item,/obj/item/stack/telecrystal)) + to_chat(user,"The crystal disappears!") + qdel(src) + return + + stack_item.add(amt) + + qdel(src) diff --git a/code/modules/research/xenobiology/crossbreeding/_potions.dm b/code/modules/research/xenobiology/crossbreeding/_potions.dm index ac7cb211425dd..618af07fc0c8b 100644 --- a/code/modules/research/xenobiology/crossbreeding/_potions.dm +++ b/code/modules/research/xenobiology/crossbreeding/_potions.dm @@ -41,24 +41,24 @@ Slimecrossing Potions /obj/item/slimepotion/peacepotion/attack(mob/living/M, mob/user) if(!isliving(M) || M.stat == DEAD) - to_chat(user, "The pacification potion only works on the living.") + to_chat(user, "[src] only works on the living.") return ..() if(istype(M, /mob/living/simple_animal/hostile/megafauna)) - to_chat(user, "The pacification potion does not work on beings of pure evil!") + to_chat(user, "[src] does not work on beings of pure evil!") return ..() if(M != user) M.visible_message("[user] starts to feed [M] a pacification potion!", "[user] starts to feed you a pacification!") else - M.visible_message("[user] starts to drink the pacification potion!", - "You start to drink the pacification potion!") + M.visible_message("[user] starts to drink [src]!", + "You start to drink [src]!") if(!do_after(user, 100, target = M)) return if(M != user) - to_chat(user, "You feed [M] the pacification potion!") + to_chat(user, "You feed [M] [src]!") else - to_chat(user, "You drink the pacification potion!") + to_chat(user, "You drink [src]!") if(isanimal(M)) ADD_TRAIT(M, TRAIT_PACIFISM, MAGIC_TRAIT) else if(iscarbon(M)) @@ -164,7 +164,7 @@ Slimecrossing Potions C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) C.add_atom_colour("#800000", FIXED_COLOUR_PRIORITY) C.resistance_flags |= LAVA_PROOF - if (istype(C, /obj/item/clothing)) + if (isclothing(C)) var/obj/item/clothing/CL = C CL.clothing_flags |= LAVAPROTECT uses-- @@ -189,7 +189,7 @@ Slimecrossing Potions if(M.maxHealth <= 0) to_chat(user, "The slime is too unstable to return!") M.revive(full_heal = 1) - M.stat = CONSCIOUS + M.set_stat(CONSCIOUS) M.visible_message("[M] is filled with renewed vigor and blinks awake!") M.maxHealth -= 10 //Revival isn't healthy. M.health -= 10 diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index ed2c455a6fa11..71396edadfb3e 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -1,4 +1,4 @@ -/obj/screen/alert/status_effect/rainbow_protection +/atom/movable/screen/alert/status_effect/rainbow_protection name = "Rainbow Protection" desc = "You are defended from harm, but so are those you might seek to injure!" icon_state = "slime_rainbowshield" @@ -6,7 +6,7 @@ /datum/status_effect/rainbow_protection id = "rainbow_protection" duration = 100 - alert_type = /obj/screen/alert/status_effect/rainbow_protection + alert_type = /atom/movable/screen/alert/status_effect/rainbow_protection var/originalcolor /datum/status_effect/rainbow_protection/on_apply() @@ -28,7 +28,7 @@ owner.visible_message("[owner] stops glowing, the rainbow light fading away.", "You no longer feel protected...") -/obj/screen/alert/status_effect/slimeskin +/atom/movable/screen/alert/status_effect/slimeskin name = "Adamantine Slimeskin" desc = "You are covered in a thick, non-neutonian gel." icon_state = "slime_stoneskin" @@ -36,7 +36,7 @@ /datum/status_effect/slimeskin id = "slimeskin" duration = 300 - alert_type = /obj/screen/alert/status_effect/slimeskin + alert_type = /atom/movable/screen/alert/status_effect/slimeskin var/originalcolor /datum/status_effect/slimeskin/on_apply() @@ -75,6 +75,8 @@ return ..() /datum/status_effect/slimerecall/proc/resistField() + SIGNAL_HANDLER + interrupted = TRUE owner.remove_status_effect(src) /datum/status_effect/slimerecall/on_remove() @@ -88,14 +90,14 @@ do_sparks(3, TRUE, owner) owner.forceMove(target.loc) -/obj/screen/alert/status_effect/freon/stasis +/atom/movable/screen/alert/status_effect/freon/stasis desc = "You're frozen inside of a protective ice cube! While inside, you can't do anything, but are immune to harm! Resist to get out." /datum/status_effect/frozenstasis id = "slime_frozen" status_type = STATUS_EFFECT_UNIQUE duration = -1 //Will remove self when block breaks. - alert_type = /obj/screen/alert/status_effect/freon/stasis + alert_type = /atom/movable/screen/alert/status_effect/freon/stasis var/obj/structure/ice_stasis/cube /datum/status_effect/frozenstasis/on_apply() @@ -110,6 +112,8 @@ owner.remove_status_effect(src) /datum/status_effect/frozenstasis/proc/breakCube() + SIGNAL_HANDLER + owner.remove_status_effect(src) /datum/status_effect/frozenstasis/on_remove() @@ -157,7 +161,7 @@ clone.unequip_everything() qdel(clone) -/obj/screen/alert/status_effect/clone_decay +/atom/movable/screen/alert/status_effect/clone_decay name = "Clone Decay" desc = "You are simply a construct, and cannot maintain this form forever. You will be returned to your original body if you should fall." icon_state = "slime_clonedecay" @@ -166,7 +170,7 @@ id = "slime_clonedecay" status_type = STATUS_EFFECT_UNIQUE duration = -1 - alert_type = /obj/screen/alert/status_effect/clone_decay + alert_type = /atom/movable/screen/alert/status_effect/clone_decay /datum/status_effect/slime_clone_decay/tick() owner.adjustToxLoss(1, 0) @@ -175,7 +179,7 @@ owner.adjustFireLoss(1, 0) owner.color = "#007BA7" -/obj/screen/alert/status_effect/bloodchill +/atom/movable/screen/alert/status_effect/bloodchill name = "Bloodchilled" desc = "You feel a shiver down your spine after getting hit with a glob of cold blood. You'll move slower and get frostbite for a while!" icon_state = "bloodchill" @@ -183,7 +187,7 @@ /datum/status_effect/bloodchill id = "bloodchill" duration = 100 - alert_type = /obj/screen/alert/status_effect/bloodchill + alert_type = /atom/movable/screen/alert/status_effect/bloodchill /datum/status_effect/bloodchill/on_apply() owner.add_movespeed_modifier("bloodchilled", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = 3) @@ -196,7 +200,7 @@ /datum/status_effect/bloodchill/on_remove() owner.remove_movespeed_modifier("bloodchilled") -/obj/screen/alert/status_effect/bloodchill +/atom/movable/screen/alert/status_effect/bloodchill name = "Bloodchilled" desc = "You feel a shiver down your spine after getting hit with a glob of cold blood. You'll move slower and get frostbite for a while!" icon_state = "bloodchill" @@ -204,7 +208,7 @@ /datum/status_effect/bonechill id = "bonechill" duration = 80 - alert_type = /obj/screen/alert/status_effect/bonechill + alert_type = /atom/movable/screen/alert/status_effect/bonechill /datum/status_effect/bonechill/on_apply() owner.add_movespeed_modifier("bonechilled", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = 3) @@ -219,7 +223,7 @@ /datum/status_effect/bonechill/on_remove() owner.remove_movespeed_modifier("bonechilled") -/obj/screen/alert/status_effect/bonechill +/atom/movable/screen/alert/status_effect/bonechill name = "Bonechilled" desc = "You feel a shiver down your spine after hearing the haunting noise of bone rattling. You'll move slower and get frostbite for a while!" icon_state = "bloodchill" @@ -229,7 +233,7 @@ duration = -1 alert_type = null -datum/status_effect/rebreathing/tick() +/datum/status_effect/rebreathing/tick() owner.adjustOxyLoss(-6, 0) //Just a bit more than normal breathing. /////////////////////////////////////////////////////// @@ -261,7 +265,7 @@ datum/status_effect/rebreathing/tick() return ..() /datum/status_effect/watercookie/tick() - for(var/turf/open/T in range(get_turf(owner),1)) + for(var/turf/open/T in RANGE_TURFS(1, owner)) T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = 5) /datum/status_effect/watercookie/on_remove() @@ -323,15 +327,12 @@ datum/status_effect/rebreathing/tick() duration = 600 /datum/status_effect/timecookie/on_apply() - if(ishuman(owner)) - var/mob/living/carbon/human/H - H.physiology.do_after_speed *= 0.95 + owner.add_actionspeed_modifier(/datum/actionspeed_modifier/timecookie) return ..() /datum/status_effect/timecookie/on_remove() - if(ishuman(owner)) - var/mob/living/carbon/human/H - H.physiology.do_after_speed /= 0.95 + owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/timecookie) + return ..() /datum/status_effect/lovecookie id = "lovecookie" @@ -347,9 +348,8 @@ datum/status_effect/rebreathing/tick() if(C.handcuffed) return var/list/huggables = list() - for(var/mob/living/carbon/L in range(get_turf(owner),1)) - if(L != owner) - huggables += L + for(var/mob/living/carbon/L in oviewers(1, owner)) + huggables += L if(length(huggables)) var/mob/living/carbon/hugged = pick(huggables) owner.visible_message("[owner] hugs [hugged]!", "You hug [hugged]!") @@ -361,9 +361,8 @@ datum/status_effect/rebreathing/tick() duration = 100 /datum/status_effect/tarcookie/tick() - for(var/mob/living/carbon/human/L in range(get_turf(owner),1)) - if(L != owner) - L.apply_status_effect(/datum/status_effect/tarfoot) + for(var/mob/living/carbon/human/L in oviewers(1, owner)) + L.apply_status_effect(/datum/status_effect/tarfoot) /datum/status_effect/tarfoot id = "tarfoot" @@ -400,7 +399,7 @@ datum/status_effect/rebreathing/tick() duration = 100 /datum/status_effect/peacecookie/tick() - for(var/mob/living/L in range(get_turf(owner),1)) + for(var/mob/living/L in viewers(1, owner)) L.apply_status_effect(/datum/status_effect/plur) /datum/status_effect/plur @@ -466,10 +465,10 @@ datum/status_effect/rebreathing/tick() colour = "grey" /datum/status_effect/stabilized/grey/tick() - for(var/mob/living/simple_animal/slime/S in range(1, get_turf(owner))) + for(var/mob/living/simple_animal/slime/S in viewers(1, owner)) if(!(owner in S.Friends)) to_chat(owner, "[linked_extract] pulses gently as it communicates with [S].") - S.Friends[owner] = 1 + S.set_friendship(owner, 1) return ..() /datum/status_effect/stabilized/orange @@ -511,7 +510,7 @@ datum/status_effect/rebreathing/tick() ADD_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus") return ..() -datum/status_effect/stabilized/blue/on_remove() +/datum/status_effect/stabilized/blue/on_remove() REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus") /datum/status_effect/stabilized/metal @@ -579,8 +578,10 @@ datum/status_effect/stabilized/blue/on_remove() /datum/status_effect/stabilized/darkpurple/tick() var/obj/item/I = owner.get_active_held_item() - var/obj/item/reagent_containers/food/snacks/F = I - if(istype(F)) + if(!I) + return + if(istype(I, /obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/F = I if(F.cooked_type) to_chat(owner, "[linked_extract] flares up brightly, and your hands alone are enough cook [F]!") var/obj/item/result = F.microwave_act() @@ -642,7 +643,7 @@ datum/status_effect/stabilized/blue/on_remove() H.physiology.hunger_mod /= 0.8 //Bluespace has an icon because it's kinda active. -/obj/screen/alert/status_effect/bluespaceslime +/atom/movable/screen/alert/status_effect/bluespaceslime name = "Stabilized Bluespace Extract" desc = "You shouldn't see this, since we set it to change automatically!" icon_state = "slime_bluespace_on" @@ -655,7 +656,7 @@ datum/status_effect/stabilized/blue/on_remove() /datum/status_effect/stabilized/bluespace id = "stabilizedbluespace" colour = "bluespace" - alert_type = /obj/screen/alert/status_effect/bluespaceslime + alert_type = /atom/movable/screen/alert/status_effect/bluespaceslime var/healthcheck /datum/status_effect/stabilized/bluespace/tick() @@ -828,7 +829,7 @@ datum/status_effect/stabilized/blue/on_remove() M.apply_status_effect(/datum/status_effect/pinkdamagetracker) M.faction |= faction_name for(var/mob/living/simple_animal/M in mobs) - if(!(M in view(7,get_turf(owner)))) + if(!(M in hearers(7,get_turf(owner)))) M.faction -= faction_name M.remove_status_effect(/datum/status_effect/pinkdamagetracker) mobs -= M @@ -906,18 +907,20 @@ datum/status_effect/stabilized/blue/on_remove() colour = "light pink" /datum/status_effect/stabilized/lightpink/on_apply() - owner.add_movespeed_modifier(MOVESPEED_ID_SLIME_STATUS, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) + owner.add_movespeed_modifier(MOVESPEED_ID_SLIME_STATUS, update=TRUE, priority=100, multiplicative_slowdown=-0.5, blacklisted_movetypes=(FLYING|FLOATING)) + ADD_TRAIT(owner, TRAIT_PACIFISM, LIGHTPINK_TRAIT) return ..() /datum/status_effect/stabilized/lightpink/tick() - 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)) + for(var/mob/living/carbon/human/H in ohearers(1, owner)) + if(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.") H.reagents.add_reagent(/datum/reagent/medicine/epinephrine,5) return ..() /datum/status_effect/stabilized/lightpink/on_remove() owner.remove_movespeed_modifier(MOVESPEED_ID_SLIME_STATUS) + REMOVE_TRAIT(owner, TRAIT_PACIFISM, LIGHTPINK_TRAIT) /datum/status_effect/stabilized/adamantine id = "stabilizedadamantine" diff --git a/code/modules/research/xenobiology/crossbreeding/_structures.dm b/code/modules/research/xenobiology/crossbreeding/_structures.dm new file mode 100644 index 0000000000000..899e67c965a39 --- /dev/null +++ b/code/modules/research/xenobiology/crossbreeding/_structures.dm @@ -0,0 +1,664 @@ +GLOBAL_LIST_EMPTY(bluespace_slime_crystals) + +/obj/structure/slime_crystal + name = "slimic pylon" + desc = "Glassy, pure, transparent. Powerful artifact that relays the slimecore's influence onto space around it." + max_integrity = 5 + anchored = TRUE + density = TRUE + icon = 'icons/obj/slimecrossing.dmi' + icon_state = "slime_pylon" + resistance_flags = FIRE_PROOF | ACID_PROOF + ///Assoc list of affected mobs, the key is the mob while the value of the map is the amount of ticks spent inside of the zone. + var/list/affected_mobs = list() + ///Used to determine wether we use view or range + var/range_type = "range" + ///What color is it? + var/colour + ///Does it use process? + var/uses_process = TRUE + +/obj/structure/slime_crystal/New(loc, obj/structure/slime_crystal/master_crystal, ...) + . = ..() + if(master_crystal) + invisibility = INVISIBILITY_MAXIMUM + max_integrity = 1000 + obj_integrity = 1000 + +/obj/structure/slime_crystal/Initialize() + . = ..() + name = "[colour] slimic pylon" + var/itemcolor = "#FFFFFF" + + switch(colour) + if("orange") + itemcolor = "#FFA500" + if("purple") + itemcolor = "#B19CD9" + if("blue") + itemcolor = "#ADD8E6" + if("metal") + itemcolor = "#7E7E7E" + if("yellow") + itemcolor = "#FFFF00" + if("dark purple") + itemcolor = "#551A8B" + if("dark blue") + itemcolor = "#0000FF" + if("silver") + itemcolor = "#D3D3D3" + if("bluespace") + itemcolor = "#32CD32" + if("sepia") + itemcolor = "#704214" + if("cerulean") + itemcolor = "#2956B2" + if("pyrite") + itemcolor = "#FAFAD2" + if("red") + itemcolor = "#FF0000" + if("green") + itemcolor = "#00FF00" + if("pink") + itemcolor = "#FF69B4" + if("gold") + itemcolor = "#FFD700" + if("oil") + itemcolor = "#505050" + if("black") + itemcolor = "#000000" + if("light pink") + itemcolor = "#FFB6C1" + if("adamantine") + itemcolor = "#008B8B" + add_atom_colour(itemcolor, FIXED_COLOUR_PRIORITY) + if(uses_process) + START_PROCESSING(SSobj, src) + +/obj/structure/slime_crystal/Destroy() + if(uses_process) + STOP_PROCESSING(SSobj, src) + for(var/X in affected_mobs) + on_mob_leave(X) + return ..() + +/obj/structure/slime_crystal/process() + if(!uses_process) + return PROCESS_KILL + + var/list/current_mobs = view_or_range(3, src, range_type) + for(var/mob/living/mob_in_range in current_mobs) + if(!(mob_in_range in affected_mobs)) + on_mob_enter(mob_in_range) + affected_mobs[mob_in_range] = 0 + + affected_mobs[mob_in_range]++ + on_mob_effect(mob_in_range) + + for(var/M in affected_mobs - current_mobs) + on_mob_leave(M) + affected_mobs -= M + +/obj/structure/slime_crystal/gold/process() + var/list/current_mobs = view_or_range(3, src, range_type) + for(var/M in affected_mobs - current_mobs) + on_mob_leave(M) + affected_mobs -= M + + for(var/mob/living/M in affected_mobs) + if(M.stat == DEAD) + on_mob_leave(M) + affected_mobs -= M + +/obj/structure/slime_crystal/proc/master_crystal_destruction() + qdel(src) + +/obj/structure/slime_crystal/proc/on_mob_enter(mob/living/affected_mob) + return + +/obj/structure/slime_crystal/proc/on_mob_effect(mob/living/affected_mob) + return + +/obj/structure/slime_crystal/proc/on_mob_leave(mob/living/affected_mob) + return + +/obj/structure/slime_crystal/grey + colour = "grey" + range_type = "view" + +/obj/structure/slime_crystal/grey/on_mob_effect(mob/living/affected_mob) + if(!istype(affected_mob, /mob/living/simple_animal/slime)) + return + var/mob/living/simple_animal/slime/slime_mob = affected_mob + slime_mob.nutrition += 2 + +/obj/structure/slime_crystal/orange + colour = "orange" + range_type = "view" + +/obj/structure/slime_crystal/orange/on_mob_effect(mob/living/affected_mob) + if(!istype(affected_mob, /mob/living/carbon)) + return + var/mob/living/carbon/carbon_mob = affected_mob + carbon_mob.fire_stacks++ + carbon_mob.IgniteMob() + +/obj/structure/slime_crystal/orange/process() + . = ..() + var/turf/open/T = get_turf(src) + if(!istype(T)) + return + var/datum/gas_mixture/gas = T.return_air() + gas.set_temperature(T0C + 200) + T.air_update_turf() + +/obj/structure/slime_crystal/purple + colour = "purple" + + var/heal_amt = 2 + +/obj/structure/slime_crystal/purple/on_mob_effect(mob/living/affected_mob) + if(!istype(affected_mob, /mob/living/carbon)) + return + var/mob/living/carbon/carbon_mob = affected_mob + var/rand_dam_type = rand(0, 10) + + new /obj/effect/temp_visual/heal(get_turf(affected_mob), "#e180ff") + + switch(rand_dam_type) + if(0) + carbon_mob.adjustBruteLoss(-heal_amt) + if(1) + carbon_mob.adjustFireLoss(-heal_amt) + if(2) + carbon_mob.adjustOxyLoss(-heal_amt) + if(3) + carbon_mob.adjustToxLoss(-heal_amt, forced = TRUE) + if(4) + carbon_mob.adjustCloneLoss(-heal_amt) + if(5) + carbon_mob.adjustStaminaLoss(-heal_amt) + if(6 to 10) + carbon_mob.adjustOrganLoss(pick(ORGAN_SLOT_BRAIN,ORGAN_SLOT_HEART,ORGAN_SLOT_LIVER,ORGAN_SLOT_LUNGS), -heal_amt) + +/obj/structure/slime_crystal/blue + colour = "blue" + range_type = "view" + +/obj/structure/slime_crystal/blue/process() + for(var/turf/open/T in view(2, src)) + if(isspaceturf(T)) + continue + var/datum/gas_mixture/gas = T.return_air() + gas.parse_gas_string(OPENTURF_DEFAULT_ATMOS) + T.air_update_turf() + +/obj/structure/slime_crystal/metal + colour = "metal" + + var/heal_amt = 3 + +/obj/structure/slime_crystal/metal/on_mob_effect(mob/living/affected_mob) + if(!iscyborg(affected_mob)) + return + var/mob/living/silicon/borgo = affected_mob + borgo.adjustBruteLoss(-heal_amt) + +/obj/structure/slime_crystal/yellow + colour = "yellow" + light_color = LIGHT_COLOR_YELLOW //a good, sickly atmosphere + light_power = 0.75 + uses_process = FALSE + +/obj/structure/slime_crystal/yellow/Initialize() + . = ..() + set_light(3) + +/obj/structure/slime_crystal/yellow/attacked_by(obj/item/I, mob/living/user) + if(istype(I,/obj/item/stock_parts/cell)) + var/obj/item/stock_parts/cell/cell = I + //Punishment for greed + if(cell.charge == cell.maxcharge) + to_chat(" You try to charge the cell, but it is already fully energized. You are not sure if this was a good idea...") + cell.explode() + return + to_chat(" You charged the [I.name] on [name]!") + cell.give(cell.maxcharge) + return + return ..() +/obj/structure/slime_crystal/darkpurple + colour = "dark purple" + +/obj/structure/slime_crystal/darkpurple/process() + var/turf/T = get_turf(src) + if(!istype(T, /turf/open)) + return + var/turf/open/open_turf = T + var/datum/gas_mixture/air = open_turf.return_air() + + if(air.get_moles(GAS_PLASMA) > 15) + air.adjust_moles(GAS_PLASMA, -15) + new /obj/item/stack/sheet/mineral/plasma(open_turf) + +/obj/structure/slime_crystal/darkpurple/Destroy() + atmos_spawn_air("plasma=[20];TEMP=[500]") + return ..() + +/obj/structure/slime_crystal/darkblue + colour = "dark blue" + +/obj/structure/slime_crystal/darkblue/process(delta_time) + for(var/turf/open/T in RANGE_TURFS(5, src)) + if(DT_PROB(75, delta_time)) + continue + T.MakeDry(TURF_WET_LUBE) + + for(var/obj/item/trash/trashie in range(5, src)) + if(DT_PROB(25, delta_time)) + qdel(trashie) + +/obj/structure/slime_crystal/silver + colour = "silver" + +/obj/structure/slime_crystal/silver/process(delta_time) + for(var/obj/machinery/hydroponics/hydr in range(5,src)) + hydr.weedlevel = 0 + hydr.pestlevel = 0 + if(DT_PROB(10, delta_time)) + hydr.age++ + +/obj/structure/slime_crystal/bluespace + colour = "bluespace" + density = FALSE + uses_process = FALSE + ///Is it in use? + var/in_use = FALSE + +/obj/structure/slime_crystal/bluespace/Initialize() + . = ..() + GLOB.bluespace_slime_crystals += src + +/obj/structure/slime_crystal/bluespace/Destroy() + GLOB.bluespace_slime_crystals -= src + return ..() + +/obj/structure/slime_crystal/bluespace/attack_hand(mob/user) + + if(in_use) + return + + var/list/local_bs_list = GLOB.bluespace_slime_crystals.Copy() + local_bs_list -= src + if(!LAZYLEN(local_bs_list)) + return ..() + + if(local_bs_list.len == 1) + do_teleport(user, local_bs_list[1]) + return + + in_use = TRUE + + var/list/assoc_list = list() + + for(var/BSC in local_bs_list) + var/area/bsc_area = get_area(BSC) + var/name = "[bsc_area.name] bluespace slimic pylon" + var/counter = 0 + + do + counter++ + while(assoc_list["[name]([counter])"]) + + name += "([counter])" + + assoc_list[name] = BSC + + var/chosen_input = input(user,"What destination do you want to choose",null) as null|anything in assoc_list + in_use = FALSE + + if(!chosen_input || !assoc_list[chosen_input]) + return + + do_teleport(user ,assoc_list[chosen_input]) + +/obj/structure/slime_crystal/sepia + colour = "sepia" + +/obj/structure/slime_crystal/sepia/on_mob_enter(mob/living/affected_mob) + ADD_TRAIT(affected_mob,TRAIT_NOBREATH,type) + ADD_TRAIT(affected_mob,TRAIT_NOCRITDAMAGE,type) + ADD_TRAIT(affected_mob,TRAIT_RESISTLOWPRESSURE,type) + ADD_TRAIT(affected_mob,TRAIT_RESISTHIGHPRESSURE,type) + ADD_TRAIT(affected_mob,TRAIT_NOSOFTCRIT,type) + ADD_TRAIT(affected_mob,TRAIT_NOHARDCRIT,type) + +/obj/structure/slime_crystal/sepia/on_mob_leave(mob/living/affected_mob) + REMOVE_TRAIT(affected_mob,TRAIT_NOBREATH,type) + REMOVE_TRAIT(affected_mob,TRAIT_NOCRITDAMAGE,type) + REMOVE_TRAIT(affected_mob,TRAIT_RESISTLOWPRESSURE,type) + REMOVE_TRAIT(affected_mob,TRAIT_RESISTHIGHPRESSURE,type) + REMOVE_TRAIT(affected_mob,TRAIT_NOSOFTCRIT,type) + REMOVE_TRAIT(affected_mob,TRAIT_NOHARDCRIT,type) + +/obj/structure/cerulean_slime_crystal + name = "Cerulean slime poly-crystal" + desc = "Translucent and irregular, it can duplicate matter on a whim" + anchored = TRUE + density = FALSE + icon = 'icons/obj/slimecrossing.dmi' + icon_state = "cerulean_crystal" + max_integrity = 5 + var/stage = 0 + var/max_stage = 5 + var/datum/weakref/pylon + +/obj/structure/cerulean_slime_crystal/Initialize(mapload, obj/structure/slime_crystal/cerulean/master_pylon) + . = ..() + if(istype(master_pylon)) + pylon = WEAKREF(master_pylon) + transform *= 1/(max_stage-1) + stage_growth() + +/obj/structure/cerulean_slime_crystal/proc/stage_growth() + if(stage == max_stage) + return + + if(stage == 3) + density = TRUE + + stage ++ + + var/matrix/M = new + M.Scale(1/max_stage * stage) + + animate(src, transform = M, time = 120 SECONDS) + + addtimer(CALLBACK(src, .proc/stage_growth), 120 SECONDS) + +/obj/structure/cerulean_slime_crystal/Destroy() + if(stage > 3) + var/obj/item/cerulean_slime_crystal/crystal = new(get_turf(src)) + if(stage == 5) + crystal.amt = rand(1,3) + else + crystal.amt = 1 + if(pylon) + var/obj/structure/slime_crystal/cerulean/C = pylon.resolve() + if(C) + C.crystals-- + C.spawn_crystal() + else + pylon = null + return ..() + +/obj/structure/slime_crystal/cerulean + colour = "cerulean" + uses_process = FALSE + var/crystals = 0 + +/obj/structure/slime_crystal/cerulean/Initialize() + . = ..() + while(crystals < 3) + spawn_crystal() + +/obj/structure/slime_crystal/cerulean/proc/spawn_crystal() + if(crystals >= 3) + return + for(var/turf/T as() in RANGE_TURFS(2,src)) + if(is_blocked_turf(T) || isspaceturf(T) || T == get_turf(src) || prob(50)) + continue + var/obj/structure/cerulean_slime_crystal/CSC = locate() in range(1,T) + if(CSC) + continue + new /obj/structure/cerulean_slime_crystal(T, src) + crystals++ + return + +/obj/structure/slime_crystal/pyrite + colour = "pyrite" + uses_process = FALSE + +/obj/structure/slime_crystal/pyrite/Initialize() + . = ..() + change_colour() + +/obj/structure/slime_crystal/pyrite/proc/change_colour() + var/list/color_list = list("#FFA500","#B19CD9", "#ADD8E6","#7E7E7E","#FFFF00","#551A8B","#0000FF","#D3D3D3", "#32CD32","#704214","#2956B2","#FAFAD2", "#FF0000", + "#00FF00", "#FF69B4","#FFD700", "#505050", "#FFB6C1","#008B8B") + for(var/turf/T as() in RANGE_TURFS(4,src)) + T.add_atom_colour(pick(color_list), FIXED_COLOUR_PRIORITY) + + addtimer(CALLBACK(src,.proc/change_colour),rand(0.75 SECONDS,1.25 SECONDS)) + +/obj/structure/slime_crystal/red + colour = "red" + + var/blood_amt = 0 + + var/max_blood_amt = 300 + +/obj/structure/slime_crystal/red/examine(mob/user) + . = ..() + . += "It has [blood_amt] u of blood." + +/obj/structure/slime_crystal/red/process() + + if(blood_amt == max_blood_amt) + return + + var/list/range_objects = range(3,src) + + for(var/obj/effect/decal/cleanable/trail_holder/TH in range_objects) + qdel(TH) + + blood_amt++ + if(blood_amt == max_blood_amt) + return + + for(var/obj/effect/decal/cleanable/blood/B in range_objects) + qdel(B) + + blood_amt++ + if(blood_amt == max_blood_amt) + return + +/obj/structure/slime_crystal/red/attack_hand(mob/user) + if(blood_amt < 100) + return ..() + + blood_amt -= 100 + var/type = pick(/obj/item/reagent_containers/food/snacks/meat/slab,/obj/item/organ/heart,/obj/item/organ/lungs,/obj/item/organ/liver,/obj/item/organ/eyes,/obj/item/organ/tongue,/obj/item/organ/stomach,/obj/item/organ/ears) + new type(get_turf(src)) + +/obj/structure/slime_crystal/red/attacked_by(obj/item/I, mob/living/user) + if(blood_amt < 10) + return ..() + + if(!istype(I, /obj/item/reagent_containers/glass/beaker)) + return ..() + + var/obj/item/reagent_containers/glass/beaker/item_beaker = I + + if(!item_beaker.is_refillable() || (item_beaker.reagents.total_volume + 10 > item_beaker.reagents.maximum_volume)) + return ..() + blood_amt -= 10 + item_beaker.reagents.add_reagent(/datum/reagent/blood,10) + +/obj/structure/slime_crystal/green + colour = "green" + var/datum/mutation/stored_mutation + +/obj/structure/slime_crystal/green/examine(mob/user) + . = ..() + if(stored_mutation) + . += "It currently stores [stored_mutation.name]" + else + . += "It doesn't hold any mutations" + +/obj/structure/slime_crystal/green/attack_hand(mob/user) + . = ..() + if(!ishuman(user)) + return + var/mob/living/carbon/human/human_user = user + var/list/mutation_list = human_user.dna.mutations + stored_mutation = pick(mutation_list) + stored_mutation = stored_mutation.type + +/obj/structure/slime_crystal/green/on_mob_effect(mob/living/affected_mob) + if(!ishuman(affected_mob) || !stored_mutation || HAS_TRAIT(affected_mob,TRAIT_BADDNA)) + return + var/mob/living/carbon/human/human_mob = affected_mob + human_mob.dna.add_mutation(stored_mutation) + + if(affected_mobs[affected_mob] % 60 != 0) + return + + var/list/mut_list = human_mob.dna.mutations + var/list/secondary_list = list() + + for(var/X in mut_list) + if(istype(X,stored_mutation)) + continue + var/datum/mutation/t_mutation = X + secondary_list += t_mutation.type + + var/datum/mutation/mutation = pick(secondary_list) + human_mob.dna.remove_mutation(mutation) + +/obj/structure/slime_crystal/green/on_mob_leave(mob/living/affected_mob) + if(!ishuman(affected_mob)) + return + var/mob/living/carbon/human/human_mob = affected_mob + human_mob.dna.remove_mutation(stored_mutation) + +/obj/structure/slime_crystal/pink + colour = "pink" + +/obj/structure/slime_crystal/pink/on_mob_enter(mob/living/affected_mob) + ADD_TRAIT(affected_mob,TRAIT_PACIFISM,type) + +/obj/structure/slime_crystal/pink/on_mob_leave(mob/living/affected_mob) + REMOVE_TRAIT(affected_mob,TRAIT_PACIFISM,type) + +/obj/structure/slime_crystal/gold + colour = "gold" + +/obj/structure/slime_crystal/gold/attack_hand(mob/user) + . = ..() + if(!ishuman(user)) + return + var/mob/living/carbon/human/human_mob = user + var/mob/living/simple_animal/pet/chosen_pet = pick(/mob/living/simple_animal/pet/dog/corgi,/mob/living/simple_animal/pet/dog/pug,/mob/living/simple_animal/pet/dog/bullterrier,/mob/living/simple_animal/pet/fox,/mob/living/simple_animal/pet/cat/kitten,/mob/living/simple_animal/pet/cat/space,/mob/living/simple_animal/pet/penguin/emperor) + chosen_pet = new chosen_pet(get_turf(human_mob)) + human_mob.forceMove(chosen_pet) + human_mob.mind.transfer_to(chosen_pet) + ADD_TRAIT(human_mob, TRAIT_NOBREATH, type) + affected_mobs += chosen_pet + +/obj/structure/slime_crystal/gold/on_mob_leave(mob/living/affected_mob) + var/mob/living/carbon/human/human_mob = locate() in affected_mob + affected_mob.mind.transfer_to(human_mob) + human_mob.grab_ghost() + human_mob.forceMove(get_turf(affected_mob)) + REMOVE_TRAIT(human_mob, TRAIT_NOBREATH, type) + qdel(affected_mob) + +/obj/structure/slime_crystal/oil + colour = "oil" + +/obj/structure/slime_crystal/oil/process() + for(var/turf/open/turf_in_range in RANGE_TURFS(3,src)) + turf_in_range.MakeSlippery(TURF_WET_LUBE,5 SECONDS) + +/obj/structure/slime_crystal/black + colour = "black" + +/obj/structure/slime_crystal/black/on_mob_effect(mob/living/affected_mob) + if(!ishuman(affected_mob) || isjellyperson(affected_mob)) + return + + if(affected_mobs[affected_mob] < 60) //Around 2 minutes + return + + var/mob/living/carbon/human/human_transformed = affected_mob + human_transformed.set_species(pick(typesof(/datum/species/jelly))) + +/obj/structure/slime_crystal/lightpink + colour = "light pink" + +/obj/structure/slime_crystal/lightpink/attack_ghost(mob/user) + . = ..() + var/mob/living/simple_animal/hostile/lightgeist/slime/L = new(get_turf(src)) + L.ckey = user.ckey + affected_mobs[L] = 0 + ADD_TRAIT(L,TRAIT_MUTE,type) + ADD_TRAIT(L,TRAIT_EMOTEMUTE,type) + +/obj/structure/slime_crystal/lightpink/on_mob_leave(mob/living/affected_mob) + if(istype(affected_mob,/mob/living/simple_animal/hostile/lightgeist/slime)) + affected_mob.ghostize(TRUE) + qdel(affected_mob) + +/obj/structure/slime_crystal/adamantine + colour = "adamantine" + +/obj/structure/slime_crystal/adamantine/on_mob_enter(mob/living/affected_mob) + if(!ishuman(affected_mob)) + return + + var/mob/living/carbon/human/human = affected_mob + human.dna.species.brutemod -= 0.1 + human.dna.species.burnmod -= 0.1 + +/obj/structure/slime_crystal/adamantine/on_mob_leave(mob/living/affected_mob) + if(!ishuman(affected_mob)) + return + + var/mob/living/carbon/human/human = affected_mob + human.dna.species.brutemod += 0.1 + human.dna.species.burnmod += 0.1 + +/obj/structure/slime_crystal/rainbow + colour = "rainbow" + uses_process = FALSE + var/list/inserted_cores = list() + +/obj/structure/slime_crystal/rainbow/Initialize() + . = ..() + for(var/X in subtypesof(/obj/item/slimecross/crystalline) - /obj/item/slimecross/crystalline/rainbow) + inserted_cores[X] = FALSE + +/obj/structure/slime_crystal/rainbow/attacked_by(obj/item/I, mob/living/user) + . = ..() + + if(!istype(I,/obj/item/slimecross/crystalline) || istype(I,/obj/item/slimecross/crystalline/rainbow)) + return + + var/obj/item/slimecross/crystalline/slimecross = I + + if(inserted_cores[slimecross.type]) + return + + inserted_cores[slimecross.type] = new slimecross.crystal_type(get_turf(src),src) + qdel(slimecross) + +/obj/structure/slime_crystal/rainbow/Destroy() + for(var/X in inserted_cores) + if(inserted_cores[X]) + var/obj/structure/slime_crystal/SC = inserted_cores[X] + SC.master_crystal_destruction() + return ..() + +/obj/structure/slime_crystal/rainbow/attack_hand(mob/user) + for(var/X in inserted_cores) + if(inserted_cores[X]) + var/obj/structure/slime_crystal/SC = inserted_cores[X] + SC.attack_hand(user) + . = ..() + +/obj/structure/slime_crystal/rainbow/attacked_by(obj/item/I, mob/living/user) + for(var/X in inserted_cores) + if(inserted_cores[X]) + var/obj/structure/slime_crystal/SC = inserted_cores[X] + SC.attacked_by(user) + . = ..() diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index bdb008cb9988d..0e8be83001d99 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -20,7 +20,7 @@ Slimecrossing Weapons if(prob(20)) owner.emote("scream") return ..() - + //Rainbow knife - Burning Rainbow /obj/item/kitchen/knife/rainbowknife @@ -54,15 +54,15 @@ Slimecrossing Weapons attack_verb = list("irradiated","mutated","maligned") return ..() -//Adamantine shield - Chilling Adamantine -/obj/item/twohanded/required/adamantineshield +//Adamantine shield - Burning Adamantine +/obj/item/shield/adamantineshield name = "adamantine shield" desc = "A gigantic shield made of solid adamantium." icon = 'icons/obj/slimecrossing.dmi' icon_state = "adamshield" item_state = "adamshield" w_class = WEIGHT_CLASS_HUGE - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) + armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70, "stamina" = 70) slot_flags = ITEM_SLOT_BACK attack_weight = 2 block_power = 75 @@ -71,10 +71,13 @@ Slimecrossing Weapons block_flags = BLOCKING_PROJECTILE throw_range = 1 //How far do you think you're gonna throw a solid crystalline shield...? throw_speed = 2 - force = 15 //Heavy, but hard to wield. attack_verb = list("bashed","pounded","slammed") item_flags = SLOWS_WHILE_IN_HAND +/obj/item/shield/adamantineshield/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_wielded=15) + //Bloodchiller - Chilling Green /obj/item/gun/magic/bloodchill name = "blood chiller" @@ -97,11 +100,11 @@ Slimecrossing Weapons . = ..() ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) -/obj/item/gun/magic/bloodchill/process() - charge_tick++ - if(charge_tick < recharge_rate || charges >= max_charges) - return 0 - charge_tick = 0 +/obj/item/gun/magic/bloodchill/process(delta_time) + charge_timer += delta_time + if(charge_timer < recharge_rate || charges >= max_charges) + return FALSE + charge_timer = 0 var/mob/living/M = loc if(istype(M) && M.blood_volume >= 20) charges++ diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index b0ad064b0f3d0..f86d935868cf9 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -34,7 +34,7 @@ Burning extracts: /obj/item/slimecross/burning/grey/do_effect(mob/user) var/mob/living/simple_animal/slime/S = new(get_turf(user),"grey") S.visible_message("A baby slime emerges from [src], and it nuzzles [user] before burbling hungrily!") - S.Friends[user] = 20 //Gas, gas, gas + S.set_friendship(user, 20) //Gas, gas, gas S.bodytemperature = T0C + 400 //We gonna step on the gas. S.set_nutrition(S.get_hunger_nutrition()) //Tonight, we fight! ..() @@ -68,12 +68,11 @@ Burning extracts: /obj/item/slimecross/burning/blue/do_effect(mob/user) user.visible_message("[src] flash-freezes the area!") - for(var/turf/open/T in range(3, get_turf(user))) + for(var/turf/open/T in view(3, get_turf(user))) T.MakeSlippery(TURF_WET_PERMAFROST, min_wet_time = 10, wet_time_to_add = 5) - for(var/mob/living/carbon/M in range(5, get_turf(user))) - if(M != user) - M.bodytemperature = BODYTEMP_COLD_DAMAGE_LIMIT + 10 //Not quite cold enough to hurt. - to_chat(M, "You feel a chill run down your spine, and the floor feels a bit slippery with frost...") + for(var/mob/living/carbon/M in ohearers(5, user)) + M.bodytemperature = BODYTEMP_COLD_DAMAGE_LIMIT + 10 //Not quite cold enough to hurt. + to_chat(M, "You feel a chill run down your spine, and the floor feels a bit slippery with frost...") ..() /obj/item/slimecross/burning/metal @@ -81,7 +80,7 @@ Burning extracts: effect_desc = "Instantly destroys walls around you." /obj/item/slimecross/burning/metal/do_effect(mob/user) - for(var/turf/closed/wall/W in range(1,get_turf(user))) + for(var/turf/closed/wall/W in RANGE_TURFS(1,user)) W.dismantle_wall(1) playsound(W, 'sound/effects/break_stone.ogg', 50, 1) user.visible_message("[src] pulses violently, and shatters the walls around it!") @@ -94,14 +93,13 @@ Burning extracts: /obj/item/slimecross/burning/yellow/do_effect(mob/user) user.visible_message("[src] explodes into an electrical field!") playsound(get_turf(src), 'sound/weapons/zapbang.ogg', 50, 1) - for(var/mob/living/M in range(4,get_turf(user))) - if(M != user) - var/mob/living/carbon/C = M - if(istype(C)) - C.electrocute_act(25,src) - else - M.adjustFireLoss(25) - to_chat(M, "You feel a sharp electrical pulse!") + for(var/mob/living/M in ohearers(4,user)) + var/mob/living/carbon/C = M + if(istype(C)) + C.electrocute_act(25,src) + else + M.adjustFireLoss(25) + to_chat(M, "You feel a sharp electrical pulse!") ..() /obj/item/slimecross/burning/darkpurple @@ -135,7 +133,7 @@ Burning extracts: /obj/item/slimecross/burning/silver/do_effect(mob/user) var/amount = rand(3,6) var/list/turfs = list() - for(var/turf/open/T in range(1,get_turf(user))) + for(var/turf/open/T in RANGE_TURFS(1,user)) turfs += T for(var/i = 0, i < amount, i++) var/path = get_random_food() @@ -197,13 +195,13 @@ Burning extracts: /obj/item/slimecross/burning/red/do_effect(mob/user) user.visible_message("[src] pulses a hazy red aura for a moment, which wraps around [user]!") - for(var/mob/living/simple_animal/slime/S in view(7, get_turf(user))) + for(var/mob/living/simple_animal/slime/S in hearers(7, get_turf(user))) if(user in S.Friends) var/friendliness = S.Friends[user] - S.Friends = list() - S.Friends[user] = friendliness + S.clear_friends() + S.set_friendship(user, friendliness) else - S.Friends = list() + S.clear_friends() S.rabid = 1 S.visible_message("The [S] is driven into a dangerous frenzy!") ..() @@ -287,7 +285,7 @@ Burning extracts: /obj/item/slimecross/burning/lightpink/do_effect(mob/user) user.visible_message("[src] lets off a hypnotizing pink glow!") - for(var/mob/living/carbon/C in view(7, get_turf(user))) + for(var/mob/living/carbon/C in hearers(7, get_turf(user))) C.reagents.add_reagent(/datum/reagent/pax,5) ..() @@ -297,7 +295,7 @@ Burning extracts: /obj/item/slimecross/burning/adamantine/do_effect(mob/user) user.visible_message("[src] crystallizes into a large shield!") - new /obj/item/twohanded/required/adamantineshield(get_turf(user)) + new /obj/item/shield/adamantineshield(get_turf(user)) ..() /obj/item/slimecross/burning/rainbow diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm index 9bf5256715909..56eb1e74e263d 100644 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ b/code/modules/research/xenobiology/crossbreeding/charged.dm @@ -42,7 +42,7 @@ Charged extracts: effect_desc = "Instantly makes a large burst of flame for a moment." /obj/item/slimecross/charged/orange/do_effect(mob/user) - for(var/turf/turf in range(5,get_turf(user))) + for(var/turf/open/turf in RANGE_TURFS(5, user)) if(!locate(/obj/effect/hotspot) in turf) new /obj/effect/hotspot(turf) ..() diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 5078f7a131554..fd46fb25f573e 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -43,8 +43,8 @@ Chilling extracts: /obj/item/slimecross/chilling/orange/do_effect(mob/user) user.visible_message("[src] shatters, and lets out a jet of heat!") - for(var/turf/T in orange(get_turf(user),2)) - if(get_dist(get_turf(user), T) > 1) + for(var/turf/open/T in (RANGE_TURFS(2, user)-RANGE_TURFS(1, user))) + if(!locate(/obj/effect/hotspot) in T) new /obj/effect/hotspot(T) ..() @@ -77,9 +77,8 @@ Chilling extracts: /obj/item/slimecross/chilling/metal/do_effect(mob/user) user.visible_message("[src] melts like quicksilver, and surrounds [user] in a wall!") - for(var/turf/T in orange(get_turf(user),1)) - if(get_dist(get_turf(user), T) > 0) - new /obj/effect/forcefield/slimewall(T) + for(var/turf/T as() in (RANGE_TURFS(2, user)-get_turf(user))) + new /obj/effect/forcefield/slimewall(T) ..() /obj/item/slimecross/chilling/yellow @@ -107,7 +106,7 @@ Chilling extracts: for(var/turf/open/T in A) var/datum/gas_mixture/G = T.air if(istype(G)) - G.set_moles(/datum/gas/plasma, 0) + G.set_moles(GAS_PLASMA, 0) filtered = TRUE T.air_update_turf() if(filtered) @@ -226,7 +225,7 @@ Chilling extracts: /obj/item/slimecross/chilling/red/do_effect(mob/user) var/slimesfound = FALSE - for(var/mob/living/simple_animal/slime/S in view(get_turf(user), 7)) + for(var/mob/living/simple_animal/slime/S in hearers(7, get_turf(user))) slimesfound = TRUE S.docile = TRUE if(slimesfound) diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index 06d236526b1c2..6cc76b4734f3a 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -18,7 +18,7 @@ Consuming extracts: /obj/item/slimecross/consuming/attackby(obj/item/O, mob/user) if(istype(O,/obj/item/reagent_containers/food/snacks)) if(last_produced + cooldown > world.time) - to_chat(user, "[src] is still digesting after its last meal!") + to_chat(user, "[src] is still digesting after its last meal!") return var/datum/reagent/N = O.reagents.has_reagent(/datum/reagent/consumable/nutriment) if(N) diff --git a/code/modules/research/xenobiology/crossbreeding/crystalized.dm b/code/modules/research/xenobiology/crossbreeding/crystalized.dm new file mode 100644 index 0000000000000..00d79c2a4953d --- /dev/null +++ b/code/modules/research/xenobiology/crossbreeding/crystalized.dm @@ -0,0 +1,112 @@ +/obj/item/slimecross/crystalline + name = "crystalline extract" + desc = "It's crystalline," + effect = "crystalline" + icon_state = "crystalline" + effect_desc = "Use to place a pylon." + var/obj/structure/slime_crystal/crystal_type + +/obj/item/slimecross/crystalline/attack_self(mob/user) + . = ..() + + var/obj/structure/slime_crystal/C = locate(/obj/structure/slime_crystal) in range(6,get_turf(user)) + + if(C) + to_chat(user,"You can't build crystals that close to each other!") + return + + var/user_turf = get_turf(user) + + if(!do_after(user,15 SECONDS,FALSE,user_turf)) + return + + new crystal_type(user_turf) + qdel(src) + +/obj/item/slimecross/crystalline/grey + crystal_type = /obj/structure/slime_crystal/grey + colour = "grey" + +/obj/item/slimecross/crystalline/orange + crystal_type = /obj/structure/slime_crystal/orange + colour = "orange" + +/obj/item/slimecross/crystalline/purple + crystal_type = /obj/structure/slime_crystal/purple + colour = "purple" + +/obj/item/slimecross/crystalline/blue + crystal_type = /obj/structure/slime_crystal/blue + colour = "blue" + +/obj/item/slimecross/crystalline/metal + crystal_type = /obj/structure/slime_crystal/metal + colour = "metal" + +/obj/item/slimecross/crystalline/yellow + crystal_type = /obj/structure/slime_crystal/yellow + colour = "yellow" + +/obj/item/slimecross/crystalline/darkpurple + crystal_type = /obj/structure/slime_crystal/darkpurple + colour = "dark purple" + +/obj/item/slimecross/crystalline/darkblue + crystal_type = /obj/structure/slime_crystal/darkblue + colour = "dark blue" + +/obj/item/slimecross/crystalline/silver + crystal_type = /obj/structure/slime_crystal/silver + colour = "silver" + +/obj/item/slimecross/crystalline/bluespace + crystal_type = /obj/structure/slime_crystal/bluespace + colour = "bluespace" + +/obj/item/slimecross/crystalline/sepia + crystal_type = /obj/structure/slime_crystal/sepia + colour = "sepia" + +/obj/item/slimecross/crystalline/cerulean + crystal_type = /obj/structure/slime_crystal/cerulean + colour = "cerulean" + +/obj/item/slimecross/crystalline/pyrite + crystal_type = /obj/structure/slime_crystal/pyrite + colour = "pyrite" + +/obj/item/slimecross/crystalline/red + crystal_type = /obj/structure/slime_crystal/red + colour = "red" + +/obj/item/slimecross/crystalline/green + crystal_type = /obj/structure/slime_crystal/green + colour = "green" + +/obj/item/slimecross/crystalline/pink + crystal_type = /obj/structure/slime_crystal/pink + colour = "pink" + +/obj/item/slimecross/crystalline/gold + crystal_type = /obj/structure/slime_crystal/gold + colour = "gold" + +/obj/item/slimecross/crystalline/oil + crystal_type = /obj/structure/slime_crystal/oil + colour = "oil" + +/obj/item/slimecross/crystalline/black + crystal_type = /obj/structure/slime_crystal/black + colour = "black" + +/obj/item/slimecross/crystalline/lightpink + crystal_type = /obj/structure/slime_crystal/lightpink + colour = "light pink" + +/obj/item/slimecross/crystalline/adamantine + crystal_type = /obj/structure/slime_crystal/adamantine + colour = "adamantine" + +/obj/item/slimecross/crystalline/rainbow + crystal_type = /obj/structure/slime_crystal/rainbow + colour = "rainbow" diff --git a/code/modules/research/xenobiology/crossbreeding/recurring.dm b/code/modules/research/xenobiology/crossbreeding/recurring.dm index 4a094744f7f81..a526d330763f9 100644 --- a/code/modules/research/xenobiology/crossbreeding/recurring.dm +++ b/code/modules/research/xenobiology/crossbreeding/recurring.dm @@ -11,7 +11,7 @@ Recurring extracts: var/extract_type var/obj/item/slime_extract/extract var/cooldown = 0 - var/max_cooldown = 5 //In sets of 2 seconds. + var/max_cooldown = 10 // In seconds /obj/item/slimecross/recurring/Initialize() . = ..() @@ -26,9 +26,9 @@ Recurring extracts: src.forceMove(extract) START_PROCESSING(SSobj,src) -/obj/item/slimecross/recurring/process() +/obj/item/slimecross/recurring/process(delta_time) if(cooldown > 0) - cooldown-- + cooldown -= delta_time else if(extract.Uses < 10 && extract.Uses > 0) extract.Uses++ cooldown = max_cooldown @@ -61,17 +61,17 @@ Recurring extracts: /obj/item/slimecross/recurring/metal extract_type = /obj/item/slime_extract/metal colour = "metal" - max_cooldown = 10 + max_cooldown = 20 /obj/item/slimecross/recurring/yellow extract_type = /obj/item/slime_extract/yellow colour = "yellow" - max_cooldown = 10 + max_cooldown = 20 /obj/item/slimecross/recurring/darkpurple extract_type = /obj/item/slime_extract/darkpurple colour = "dark purple" - max_cooldown = 10 + max_cooldown = 20 /obj/item/slimecross/recurring/darkblue extract_type = /obj/item/slime_extract/darkblue @@ -88,7 +88,7 @@ Recurring extracts: /obj/item/slimecross/recurring/sepia extract_type = /obj/item/slime_extract/sepia colour = "sepia" - max_cooldown = 18 //No infinite timestop for you! + max_cooldown = 36 //No infinite timestop for you! /obj/item/slimecross/recurring/cerulean extract_type = /obj/item/slime_extract/cerulean @@ -113,7 +113,7 @@ Recurring extracts: /obj/item/slimecross/recurring/gold extract_type = /obj/item/slime_extract/gold colour = "gold" - max_cooldown = 15 + max_cooldown = 30 /obj/item/slimecross/recurring/oil extract_type = /obj/item/slime_extract/oil @@ -130,9 +130,9 @@ Recurring extracts: /obj/item/slimecross/recurring/adamantine extract_type = /obj/item/slime_extract/adamantine colour = "adamantine" - max_cooldown = 10 + max_cooldown = 20 /obj/item/slimecross/recurring/rainbow extract_type = /obj/item/slime_extract/rainbow colour = "rainbow" - max_cooldown = 20 //It's pretty powerful. + max_cooldown = 40 //It's pretty powerful. diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 73271153a172d..674a01238ae7a 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -43,7 +43,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/orange/core_effect_before(mob/living/target, mob/user) target.visible_message("The [src] boils over!") - for(var/turf/turf in range(1,target)) + for(var/turf/open/turf in RANGE_TURFS(1,target)) if(!locate(/obj/effect/hotspot) in turf) new /obj/effect/hotspot(turf) @@ -95,10 +95,10 @@ Regenerative extracts: /obj/item/slimecross/regenerative/darkpurple/core_effect(mob/living/target, mob/user) var/equipped = 0 - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/purple(null), SLOT_SHOES) - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(null), SLOT_W_UNIFORM) - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/purple(null), SLOT_GLOVES) - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/head/soft/purple(null), SLOT_HEAD) + equipped += target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/purple(null), ITEM_SLOT_FEET) + equipped += target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(null), ITEM_SLOT_ICLOTHING) + equipped += target.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/purple(null), ITEM_SLOT_GLOVES) + equipped += target.equip_to_slot_or_del(new /obj/item/clothing/head/soft/purple(null), ITEM_SLOT_HEAD) if(equipped > 0) target.visible_message("The milky goo congeals into clothing!") @@ -111,13 +111,13 @@ Regenerative extracts: return var/mob/living/carbon/human/H = target var/fireproofed = FALSE - if(H.get_item_by_slot(SLOT_WEAR_SUIT)) + if(H.get_item_by_slot(ITEM_SLOT_OCLOTHING)) fireproofed = TRUE - var/obj/item/clothing/C = H.get_item_by_slot(SLOT_WEAR_SUIT) + var/obj/item/clothing/C = H.get_item_by_slot(ITEM_SLOT_OCLOTHING) fireproof(C) - if(H.get_item_by_slot(SLOT_HEAD)) + if(H.get_item_by_slot(ITEM_SLOT_HEAD)) fireproofed = TRUE - var/obj/item/clothing/C = H.get_item_by_slot(SLOT_HEAD) + var/obj/item/clothing/C = H.get_item_by_slot(ITEM_SLOT_HEAD) fireproof(C) if(fireproofed) target.visible_message("Some of [target]'s clothing gets coated in the goo, and turns blue!") @@ -226,7 +226,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/oil/core_effect(mob/living/target, mob/user) playsound(src, 'sound/weapons/flash.ogg', 100, 1) - for(var/mob/living/L in view(user,7)) + for(var/mob/living/L in viewers(7, user)) L.flash_act() /obj/item/slimecross/regenerative/black @@ -247,6 +247,8 @@ Regenerative extracts: dummy.adjustFireLoss(target.getFireLoss()) dummy.adjustToxLoss(target.getToxLoss()) dummy.adjustOxyLoss(200) + //Force death just in case + dummy.death() /obj/item/slimecross/regenerative/lightpink colour = "light pink" diff --git a/code/modules/research/xenobiology/crossbreeding/reproductive.dm b/code/modules/research/xenobiology/crossbreeding/reproductive.dm index be66ed02d705f..7502eb5ad0c3d 100644 --- a/code/modules/research/xenobiology/crossbreeding/reproductive.dm +++ b/code/modules/research/xenobiology/crossbreeding/reproductive.dm @@ -13,6 +13,12 @@ Reproductive extracts: var/cubes_eaten = 0 var/last_produce = 0 var/cooldown = 30 // 3 seconds. + var/static/list/typecache_to_take + +/obj/item/slimecross/reproductive/Initialize() + . = ..() + if(!typecache_to_take) + typecache_to_take = typecacheof(/obj/item/reagent_containers/food/snacks/monkeycube) /obj/item/slimecross/reproductive/attackby(obj/item/O, mob/user) if((last_produce + cooldown) > world.time) @@ -20,7 +26,7 @@ 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, typecache_to_take, src, 1, null, null, user, inserted) if(inserted.len) var/obj/item/reagent_containers/food/snacks/monkeycube/M = inserted[1] if(istype(M)) diff --git a/code/modules/research/xenobiology/crossbreeding/transformative.dm b/code/modules/research/xenobiology/crossbreeding/transformative.dm new file mode 100644 index 0000000000000..d037c9db3ab0c --- /dev/null +++ b/code/modules/research/xenobiology/crossbreeding/transformative.dm @@ -0,0 +1,168 @@ +/* +transformative extracts: + apply a permanent effect to a slime and all of its babies +*/ +/obj/item/slimecross/transformative + name = "transformative extract" + desc = "It seems to stick to any slime it comes in contact with." + icon_state = "transformative" + effect = "transformative" + var/effect_applied = SLIME_EFFECT_DEFAULT + +/obj/item/slimecross/transformative/afterattack(atom/target, mob/user, proximity) + if(!proximity || !isslime(target)) + return FALSE + var/mob/living/simple_animal/slime/S = target + if(S.stat) + to_chat(user, "The slime is dead!") + if(S.transformeffects & effect_applied) + to_chat(user,"This slime already has the [colour] transformative effect applied!") + return FALSE + to_chat(user,"You apply [src] to [target].") + do_effect(S, user) + S.transformeffects = effect_applied //S.transformeffects |= effect_applied + qdel(src) + +/obj/item/slimecross/transformative/proc/do_effect(mob/living/simple_animal/slime/S, mob/user) + SHOULD_CALL_PARENT(TRUE) + if(S.transformeffects & SLIME_EFFECT_LIGHT_PINK) + S.remove_from_spawner_menu() + S.master = null + if(S.transformeffects & SLIME_EFFECT_METAL) + S.maxHealth = round(S.maxHealth/1.3) + if(S.transformeffects & SLIME_EFFECT_BLUESPACE) + S.remove_verb(/mob/living/simple_animal/slime/proc/teleport) + if(S.transformeffects & SLIME_EFFECT_PINK) + var/datum/language_holder/LH = S.get_language_holder() + LH.selected_language = /datum/language/slime + +/obj/item/slimecross/transformative/grey + colour = "grey" + effect_applied = SLIME_EFFECT_GREY + effect_desc = "Slimes split into one additional slime." + +/obj/item/slimecross/transformative/orange + colour = "orange" + effect_applied = SLIME_EFFECT_ORANGE + effect_desc = "Slimes will light people on fire when they shock them." + +/obj/item/slimecross/transformative/purple + colour = "purple" + effect_applied = SLIME_EFFECT_PURPLE + effect_desc = "Slimes will regenerate slowly." + +/obj/item/slimecross/transformative/blue + colour = "blue" + effect_applied = SLIME_EFFECT_BLUE + effect_desc = "Slime will always retain slime of its original colour when splitting." + +/obj/item/slimecross/transformative/metal + colour = "metal" + effect_applied = SLIME_EFFECT_METAL + effect_desc = "Slimes will be able to sustain more damage before dying." + +/obj/item/slimecross/transformative/metal/do_effect(mob/living/simple_animal/slime/S) + ..() + S.maxHealth = round(S.maxHealth*1.3) + +/obj/item/slimecross/transformative/yellow + colour = "yellow" + effect_applied = SLIME_EFFECT_YELLOW + effect_desc = "Slimes will gain electric charge faster." + +/obj/item/slimecross/transformative/darkpurple + colour = "dark purple" + effect_applied = SLIME_EFFECT_DARK_PURPLE + effect_desc = "Slime rapidly converts atmospheric plasma to oxygen, healing in the process." + +/obj/item/slimecross/transformative/darkblue + colour = "dark blue" + effect_applied = SLIME_EFFECT_DARK_BLUE + effect_desc = "Slimes takes reduced damage from water." + +/obj/item/slimecross/transformative/silver + colour = "silver" + effect_applied = SLIME_EFFECT_SILVER + effect_desc = "Slimes will no longer lose nutrition over time." + +/obj/item/slimecross/transformative/bluespace + colour = "bluespace" + effect_applied = SLIME_EFFECT_BLUESPACE + effect_desc = "Slimes will teleport to targets when they are at full electric charge." + +/obj/item/slimecross/transformative/bluespace/do_effect(mob/living/simple_animal/slime/S, mob/user) + ..() + S.add_verb(/mob/living/simple_animal/slime/proc/teleport) + +/obj/item/slimecross/transformative/sepia + colour = "sepia" + effect_applied = SLIME_EFFECT_SEPIA + effect_desc = "Slimes move faster." + +/obj/item/slimecross/transformative/cerulean + colour = "cerulean" + effect_applied = SLIME_EFFECT_CERULEAN + effect_desc = "Slime makes another adult rather than splitting, with half the nutrition." + +/obj/item/slimecross/transformative/pyrite + colour = "pyrite" + effect_applied = SLIME_EFFECT_PYRITE + effect_desc = "Slime always splits into totally random colors, except rainbow. Can never yield a rainbow slime." + +/obj/item/slimecross/transformative/red + colour = "red" + effect_applied = SLIME_EFFECT_RED + effect_desc = "Slimes does 10% more damage when feeding and attacking." + +/obj/item/slimecross/transformative/green + colour = "green" + effect_applied = SLIME_EFFECT_GREEN + effect_desc = "Slimes will eat corpses." + +/obj/item/slimecross/transformative/pink + colour = "pink" + effect_applied = SLIME_EFFECT_PINK + effect_desc = "Slimes will speak in common rather than in slime." + +/obj/item/slimecross/transformative/pink/do_effect(mob/living/simple_animal/slime/S) + ..() + S.grant_language(/datum/language/common, TRUE, TRUE) + var/datum/language_holder/LH = S.get_language_holder() + LH.selected_language = /datum/language/common + +/obj/item/slimecross/transformative/gold + colour = "gold" + effect_applied = SLIME_EFFECT_GOLD + effect_desc = "Slime extracts from these will sell for double the price." + +/obj/item/slimecross/transformative/oil + colour = "oil" + effect_applied = SLIME_EFFECT_OIL + effect_desc = "Slime douses anything it feeds on in welding fuel." + +/obj/item/slimecross/transformative/black + colour = "black" + effect_applied = SLIME_EFFECT_BLACK + effect_desc = "Slime is nearly transparent." + +/obj/item/slimecross/transformative/lightpink + colour = "light pink" + effect_applied = SLIME_EFFECT_LIGHT_PINK + effect_desc = "Slimes may become possessed by supernatural forces." + +/obj/item/slimecross/transformative/lightpink/do_effect(mob/living/simple_animal/slime/S, mob/user) + ..() + GLOB.poi_list |= S + S.make_master(user) + LAZYADD(GLOB.mob_spawners["[S.master.real_name]'s slime"], S) + SSmobs.update_spawners() + +/obj/item/slimecross/transformative/adamantine + colour = "adamantine" + effect_applied = SLIME_EFFECT_ADAMANTINE + effect_desc = "Slimes takes reduced damage from brute attacks." + +/obj/item/slimecross/transformative/rainbow + colour = "rainbow" + effect_applied = SLIME_EFFECT_RAINBOW + effect_desc = "Slime randomly changes color periodically." diff --git a/code/modules/research/xenobiology/crossbreeding/warping.dm b/code/modules/research/xenobiology/crossbreeding/warping.dm new file mode 100644 index 0000000000000..dda0ea678116e --- /dev/null +++ b/code/modules/research/xenobiology/crossbreeding/warping.dm @@ -0,0 +1,847 @@ +/* +Warping extracts crossbreed +put up a rune with bluespace effects, lots of those runes are fluff or act as a passive buff, others are just griefing tools +*/ + +/obj/item/slimecross/warping + name = "warped extract" + desc = "It just won't stay in place." + icon_state = "warping" + effect = "warping" + colour = "grey" + ///what runes will be drawn depending on the crossbreed color + var/obj/effect/warped_rune/runepath + /// the number of "charge" a bluespace crossbreed start with + var/warp_charge = INFINITY + ///time it takes to store the rune back into the crossbreed + var/storing_time = 5 SECONDS + ///time it takes to draw the rune + var/drawing_time = 5 SECONDS + var/max_cooldown = 30 SECONDS + var/cooldown = 0 + +/obj/effect/warped_rune + name = "warped rune" + desc = "An unstable rune born of the depths of bluespace" + icon = 'icons/obj/slimecrossing.dmi' + icon_state = "greyspace_rune" + move_resist = INFINITY //here to avoid the rune being moved since it only sets it's turf once when it's drawn. doesn't include admin fuckery. + anchored = TRUE + layer = MID_TURF_LAYER + resistance_flags = FIRE_PROOF + var/dir_sound = 'sound/effects/phasein.ogg' + var/activated_on_step = FALSE + ///is only used for bluespace crystal erasing as of now + var/storing_time = 5 SECONDS + ///Nearly all runes needs to know which turf they are on + var/turf/rune_turf + var/remove_on_activation = TRUE + +/obj/item/slimecross/warping/examine() + . = ..() + . += "It has [warp_charge] charge left" + +///runes can also be deleted by bluespace crystals relatively fast as an alternative to cleaning them. +/obj/effect/warped_rune/attackby(obj/item/used_item, mob/user) + . = ..() + if(!istype(used_item,/obj/item/stack/sheet/bluespace_crystal) && !istype(used_item,/obj/item/stack/ore/bluespace_crystal)) + return + + var/obj/item/stack/space_crystal = used_item + if(do_after(user, storing_time,target = src)) //the time it takes to nullify it depends on the rune too + to_chat(user, "You nullify the effects of the rune with the bluespace crystal!") + space_crystal.use(1) + playsound(src, 'sound/effects/phasein.ogg', 20, TRUE) + qdel(src) + +/obj/effect/warped_rune/acid_act() + . = ..() + visible_message("[src] has been dissolved by the acid") + playsound(src, 'sound/items/welder.ogg', 150, TRUE) + qdel(src) + + +///nearly all runes use their turf in some way so we set rune_turf to their turf automatically, the rune also start on cooldown if it uses one. +/obj/effect/warped_rune/Initialize() + . = ..() + add_overlay("blank", TRUE) + rune_turf = get_turf(src) + RegisterSignal(rune_turf, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_rune) + +/obj/effect/warped_rune/proc/clean_rune() + SIGNAL_HANDLER + + qdel(src) + +///using the extract on the floor will "draw" the rune. +/obj/item/slimecross/warping/afterattack(atom/target, mob/user, proximity) + . = ..() + if(!proximity) + return + + if(istype(target, runepath)) //checks if the target is a rune and then if you can store it + if(do_after(user, storing_time,target = target)) + warping_crossbreed_absorb(target, user) + return + + if(isturf(target) && locate(/obj/effect/warped_rune) in target) //check if the target is a floor and if there's a rune on said floor + to_chat(user, "There is already a bluespace rune here!") + return + + if(!isfloorturf(target)) + to_chat(user, "you cannot draw a rune here!") + return + + if(warp_charge < 1) //check if we have at least 1 charge left. + to_chat(user, "[src] is empty!") + return + + if(!check_cd(user)) + return + + if(do_after(user, drawing_time,target = target)) + if(warp_charge >= 1 && (!locate(/obj/effect/warped_rune) in target) && check_cd(user)) //check one last time if a rune has been drawn during the do_after and if there's enough charges left + warping_crossbreed_spawn(target,user) + make_cd() + + +///spawns the rune, taking away one rune charge +/obj/item/slimecross/warping/proc/warping_crossbreed_spawn(atom/target, mob/user) + playsound(target, 'sound/effects/slosh.ogg', 20, TRUE) + warp_charge-- + new runepath(target) + to_chat(user, "You carefully draw the rune with [src].") + + +///absorb the rune into the crossbreed adding one more charge to the crossbreed. +/obj/item/slimecross/warping/proc/warping_crossbreed_absorb(atom/target, mob/user) + //to_chat(user, "You store the rune in [src].") + qdel(target) + warp_charge++ + +/obj/item/slimecross/warping/proc/check_cd(user) + if(world.time < cooldown) + if(user) + to_chat(user, "[src] is recharging energy.") + return FALSE + return TRUE + +/obj/item/slimecross/warping/proc/make_cd() + cooldown = world.time + max_cooldown + +/obj/effect/warped_rune/attack_hand(mob/living/user) + . = ..() + do_effect(user) + +/obj/effect/warped_rune/proc/do_effect(mob/user) + SHOULD_CALL_PARENT(TRUE) + if(remove_on_activation) + playsound(rune_turf, dir_sound, 20, TRUE) + to_chat(user, ("[src] fades.")) + qdel(src) + +/obj/effect/warped_rune/Crossed(atom/movable/AM, oldloc) + SHOULD_CALL_PARENT(TRUE) + . = ..() + if(activated_on_step) + playsound(rune_turf, dir_sound, 20, TRUE) + visible_message("[src] fades.") + qdel(src) + +/obj/item/slimecross/warping/grey + name = "greyspace crossbreed" + colour = "grey" + effect_desc = "Draws a rune. Extracts that are on the rune are absorbed, 8 extracts produces an adult slime of that color." + runepath = /obj/effect/warped_rune/greyspace + +/obj/effect/warped_rune/greyspace + name = "greyspace rune" + desc = "Death is merely a setback, anything can be rebuilt given the right components." + icon_state = "rune_grey" + ///extracttype is used to remember the type of the extract on the rune + var/extracttype + var/req_extracts = 8 + +/obj/effect/warped_rune/greyspace/examine(mob/user) + . = ..() + to_chat(user, "Requires absorbing [req_extracts] [extracttype ? "[extracttype] extracts" : "slime extracts"].") + +/obj/effect/warped_rune/greyspace/do_effect(mob/user) + for(var/obj/item/slime_extract/extract in rune_turf) + if(extract.color_slime == extracttype || !extracttype) //check if the extract is the first one or of the right color. + extracttype = extract.color_slime + qdel(extract) //vores the slime extract + req_extracts-- + if(req_extracts <= 0) + switch(extracttype) + if("lightpink") + extracttype = "light pink" + if("darkblue") + extracttype = "dark blue" + if("darkpurple") + extracttype = "dark purple" + new /mob/living/simple_animal/slime (rune_turf, extracttype) //spawn a slime from the extract's color + req_extracts = initial(req_extracts) + extracttype = null // reset extracttype to FALSE to allow a new extract type + . = ..() + break + playsound(rune_turf, 'sound/effects/splat.ogg', 20, TRUE) + else + to_chat(user, "Requires a [extracttype ? "[extracttype] extracts" : "slime extract"].") + + +/obj/item/slimecross/warping/orange + colour = "orange" + runepath = /obj/effect/warped_rune/orangespace + effect_desc = "Draws a rune that can summon a bonfire." + +/obj/effect/warped_rune/orangespace + desc = "This can be activated to summon a bonfire." + icon_state = "rune_orange" + +/obj/effect/warped_rune/orangespace/do_effect(mob/user) + var/obj/structure/bonfire/bluespace/B = new (rune_turf) + B.StartBurning() + . = ..() + +/obj/item/slimecross/warping/purple + colour = "purple" + runepath = /obj/effect/warped_rune/purplespace + effect_desc = "Draws a rune that may be activated to summon two random medical items." + +/obj/effect/warped_rune/purplespace + desc = "This can be activated to summon two random medical." + icon_state = "rune_purple" + +/obj/effect/warped_rune/purplespace/do_effect(mob/user) + var/list/medical = list( + /obj/item/stack/medical/gauze, + /obj/item/reagent_containers/hypospray/medipen, + /obj/item/stack/medical/bruise_pack, + /obj/item/stack/medical/ointment, + /obj/item/reagent_containers/pill/oxandrolone, + /obj/item/storage/pill_bottle/charcoal, + /obj/item/reagent_containers/pill/mutadone, + /obj/item/reagent_containers/pill/antirad, + /obj/item/reagent_containers/pill/patch/styptic, + /obj/item/reagent_containers/pill/patch/synthflesh, + /obj/item/reagent_containers/pill/patch/silver_sulf, + /obj/item/healthanalyzer, + /obj/item/surgical_drapes, + /obj/item/scalpel, + /obj/item/hemostat, + /obj/item/cautery, + /obj/item/circular_saw, + /obj/item/surgicaldrill, + /obj/item/retractor, + /obj/item/blood_filter) + + for(var/i in 1 to 2) + var/path = pick_n_take(medical) + new path(rune_turf) + . = ..() + +/obj/item/slimecross/warping/blue + colour = "blue" + runepath = /obj/effect/warped_rune/cyanspace //we'll call the blue rune cyanspace to not mix it up with actual bluespace rune + effect_desc = "Draw a rune that is slippery like water and may be activated to cover all adjacent tiles in ice." + +/obj/effect/warped_rune/cyanspace + icon_state = "rune_blue" + desc = "Its slippery like water and may be activated to cover all adjacent tiles in ice." + +/obj/effect/warped_rune/cyanspace/do_effect(mob/user) + for(var/turf/open/T in RANGE_TURFS(1, src) - rune_turf) + T.MakeSlippery(TURF_WET_PERMAFROST, 1 MINUTES) + . = ..() + +/obj/effect/warped_rune/cyanspace/ComponentInitialize() + . = ..() + AddComponent(/datum/component/slippery, 30) + +/obj/effect/warped_rune/cyanspace/Crossed(atom/movable/AM, oldloc) + if(isliving(AM)) + activated_on_step = TRUE + . = ..() + +/obj/item/slimecross/warping/dark_blue + colour = "dark blue" + runepath = /obj/effect/warped_rune/darkcyanspace //we'll call the blue rune cyanspace to not mix it up with actual bluespace rune + effect_desc = "Draw a rune that can lower the temperature of whoever steps on it." + +/obj/effect/warped_rune/darkcyanspace + icon_state = "rune_dark_blue" + desc = "Refreshing!" + remove_on_activation = FALSE + +/obj/effect/warped_rune/darkcyanspace/Crossed(atom/movable/AM, oldloc) + if(isliving(AM)) + var/mob/living/L = AM + L.adjust_bodytemperature(-300) + activated_on_step = TRUE + . = ..() + +/obj/item/slimecross/warping/metal + colour = "metal" + runepath = /obj/effect/warped_rune/metalspace + effect_desc = "Draws a rune that may be activated to create a 3x3 block of invisible walls." + +//It's a wall what do you want from me +/obj/effect/warped_rune/metalspace + desc = "This can be activated to to create a 3x3 block of invisible walls." + icon_state = "rune_metal" + +/obj/effect/warped_rune/metalspace/do_effect(mob/user) + for(var/turf/open/T in RANGE_TURFS(1, src)) + new /obj/effect/forcefield/mime(T, 150) + . = ..() + +/obj/item/slimecross/warping/yellow + colour = "yellow" + runepath = /obj/effect/warped_rune/yellowspace + effect_desc = "Draw a rune that causes electrical interference." + +/obj/effect/warped_rune/yellowspace + desc = "Be careful with taking power cells with you!" + icon_state = "rune_yellow" + remove_on_activation = FALSE + +/obj/effect/warped_rune/yellowspace/Crossed(atom/movable/AM, oldloc) + var/obj/item/stock_parts/cell/C = AM.get_cell() + if(!C && isliving(AM)) + var/mob/living/L = AM + for(var/obj/item/I in L.GetAllContents()) + C = I.get_cell() + if(C?.charge) + break + if(C?.charge) + do_sparks(5,FALSE,C) + empulse(rune_turf, 1, 1) + C.use(C.charge) + activated_on_step = TRUE + . = ..() + +/obj/item/slimecross/warping/darkpurple + colour = "dark purple" + runepath = /obj/effect/warped_rune/darkpurplespace + effect_desc = "Draw a rune that can transmute plasma into any other material." + +/obj/effect/warped_rune/darkpurplespace + icon = 'icons/obj/slimecrossing.dmi' + icon_state = "rune_dark_purple" + desc = "To gain something you must sacrifice something else in return." + var/static/list/materials = list(/obj/item/stack/sheet/iron, /obj/item/stack/sheet/glass, /obj/item/stack/sheet/mineral/silver, + /obj/item/stack/sheet/mineral/gold, /obj/item/stack/sheet/mineral/diamond, /obj/item/stack/sheet/mineral/uranium, + /obj/item/stack/sheet/mineral/titanium, /obj/item/stack/sheet/mineral/copper, /obj/item/stack/sheet/mineral/uranium, + /obj/item/stack/sheet/bluespace_crystal) + +/obj/effect/warped_rune/darkpurplespace/do_effect(mob/user) + if(locate(/obj/item/stack/sheet/mineral/plasma) in rune_turf) + var/amt = 0 + for(var/obj/item/stack/sheet/mineral/plasma/P in rune_turf) + amt += P.amount + qdel(P) + var/path_material = pick(materials) + new path_material(rune_turf, amt) + return ..() + else + to_chat(user, "Requires plasma!") + +/obj/item/slimecross/warping/silver + colour = "silver" + effect_desc = "Draw a rune that can feed whoever steps on it.." + runepath = /obj/effect/warped_rune/silverspace + +/obj/effect/warped_rune/silverspace + desc = "This feeds whoever steps on it." + icon_state = "rune_silver" + remove_on_activation = FALSE + +/obj/effect/warped_rune/silverspace/Crossed(atom/movable/AM, oldloc) + if(iscarbon(AM)) + var/mob/living/carbon/C = AM + C.reagents.add_reagent(/datum/reagent/consumable/nutriment, 100) + activated_on_step = TRUE + . = ..() + +GLOBAL_DATUM(blue_storage, /obj/item/storage/backpack/holding/bluespace) + +/obj/item/storage/backpack/holding/bluespace + name = "warped rune" + anchored = TRUE + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 100) + invisibility = INVISIBILITY_ABSTRACT + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + +/obj/item/slimecross/warping/bluespace + colour = "bluespace" + runepath = /obj/effect/warped_rune/bluespace + effect_desc = "Draw a rune that serves as a bluespace container." + +/obj/effect/warped_rune/bluespace + desc = "When activated, it gives access to a bluespace container." + icon_state = "rune_bluespace" + remove_on_activation = FALSE + +/obj/effect/warped_rune/bluespace/do_effect(mob/user) + if(!GLOB.blue_storage) + GLOB.blue_storage = new + GLOB.blue_storage.loc = loc + var/datum/component/storage/STR = GLOB.blue_storage.GetComponent(/datum/component/storage) + STR.show_to(user) + playsound(rune_turf, dir_sound, 20, TRUE) + . = ..() + +/obj/item/slimecross/warping/sepia + colour = "sepia" + runepath = /obj/effect/warped_rune/sepiaspace + effect_desc = "Rune activates automatically when stepped on, triggering a timestop around it." + +/obj/effect/warped_rune/sepiaspace + desc = "stepping on it stops time around it." + icon_state = "rune_sepia" + remove_on_activation = FALSE + +/obj/effect/warped_rune/sepiaspace/Crossed(atom/movable/AM, oldloc) + new /obj/effect/timestop(rune_turf, null, null, null) + activated_on_step = TRUE + . = ..() + +/obj/item/slimecross/warping/cerulean + colour = "cerulean" + runepath = /obj/effect/warped_rune/ceruleanspace + effect_desc = "Draws a rune that creates a hologram of the first living thing that stepped on the tile." + +/obj/effect/warped_rune/ceruleanspace + desc = "A shadow of what once passed these halls, a memory perhaps?" + icon_state = "rune_cerulean" + remove_on_activation = FALSE + ///hologram that will be spawned by the rune + var/obj/effect/overlay/holotile + ///mob the hologram will copy + var/mob/living/holo_host + ///used to remember the recent speech of the holo_host + var/list/recent_speech + ///used to remember the timer ID that activates holo_talk + +/obj/effect/warped_rune/ceruleanspace/proc/holo_talk() + if(holotile && length(recent_speech)) //the proc should'nt be called if the list is empty in the first place but we might as well make sure. + holotile.say(recent_speech[pick(recent_speech)]) //say one of the 10 latest sentence said by the holo_host + addtimer(CALLBACK(src, .proc/holo_talk), 10 SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE) + +/obj/effect/warped_rune/ceruleanspace/Crossed(atom/movable/AM, oldloc) + . = ..() + if(isliving(AM) && !holo_host) + holo_host = AM + +/obj/effect/warped_rune/ceruleanspace/do_effect(mob/user) + . = ..() + if(holo_host && !holotile) + holo_creation() + remove_on_activation = TRUE + playsound(rune_turf, dir_sound, 20, TRUE) + +/obj/effect/warped_rune/ceruleanspace/proc/holo_creation() + addtimer(CALLBACK(src, .proc/holo_talk), 10 SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE) + + if(locate(holotile) in rune_turf)//here to delete the previous hologram, + QDEL_NULL(holotile) + + holotile = new(rune_turf) //setting up the hologram to look like the person that just stepped in + holotile.icon = holo_host.icon + holotile.icon_state = holo_host.icon_state + holotile.alpha = 200 + holotile.name = "[holo_host.name] (Hologram)" + holotile.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) + holotile.copy_overlays(holo_host, TRUE) + holotile.anchored = TRUE + holotile.density = FALSE + + //the code that follows is basically the code that changeling use to get people's last spoken sentences with a few tweaks. + recent_speech = list() //resets the list from its previous sentences + var/list/say_log = list() + var/log_source = holo_host.logging + for(var/log_type in log_source) + var/nlog_type = text2num(log_type) + if(nlog_type & LOG_SAY) + var/list/reversed = log_source[log_type] //reverse the list so we get the last sentences instead of the first + if(islist(reversed)) + say_log = reverseRange(reversed.Copy()) + break + + if(length(say_log) > 10) //we're going to get up to the last 10 sentences spoken by the holo_host + recent_speech = say_log.Copy(say_log.len - 11, 0) + else + for(var/spoken_memory in say_log) + if(recent_speech.len >= 10) + break + recent_speech[spoken_memory] = say_log[spoken_memory] + + if(!length(recent_speech)) //lazy lists don't work here for whatever reason so we set it to null manually if the list is empty. + recent_speech = null + +///destroys the hologram with the rune +/obj/effect/warped_rune/ceruleanspace/Destroy() + QDEL_NULL(holotile) + holo_host = null + recent_speech = null + return ..() + +/obj/item/slimecross/warping/pyrite + colour = "pyrite" + runepath = /obj/effect/warped_rune/pyritespace + effect_desc = "draws a rune that will randomly color whatever steps on it." + +/obj/effect/warped_rune/pyritespace + desc = "Who shall we be today? they asked, but not even the canvas would answer." + icon_state = "rune_pyrite" + remove_on_activation = FALSE + var/colour = "#FFFFFF" + +/obj/effect/warped_rune/pyritespace/Initialize() + . = ..() + colour = pick("#FFFFFF", "#FF0000", "#FFA500", "#FFFF00", "#00FF00", "#0000FF", "#4B0082", "#FF00FF") + +/obj/effect/warped_rune/pyritespace/Crossed(atom/movable/AM, oldloc) + if(isliving(AM)) + AM.add_atom_colour(colour, WASHABLE_COLOUR_PRIORITY) + activated_on_step = TRUE + playsound(src, 'sound/items/bikehorn.ogg', 50, TRUE) + . = ..() + +/obj/item/slimecross/warping/red + colour = "red" + runepath = /obj/effect/warped_rune/redspace + effect_desc = "Draw a rune that covers with blood whoever steps on it." + +/obj/effect/warped_rune/redspace + desc = "Watch out for blood!" + icon_state = "rune_red" + remove_on_activation = FALSE + +/obj/effect/warped_rune/redspace/Crossed(atom/movable/AM, oldloc) + if(ishuman(AM)) + var/mob/living/carbon/human/H = AM + add_blood_DNA(list("Non-human DNA" = random_blood_type())) + for(var/obj/item/I in H.get_equipped_items(TRUE)) + I.add_blood_DNA(return_blood_DNA()) + I.update_icon() + for(var/obj/item/I in H.held_items) + I.add_blood_DNA(return_blood_DNA()) + I.update_icon() + playsound(src, 'sound/effects/blobattack.ogg', 50, TRUE) + activated_on_step = TRUE + . = ..() + +/obj/item/slimecross/warping/green + colour = "green" + effect_desc = "Draw a rune that alters the DNA of those who step on it." + runepath = /obj/effect/warped_rune/greenspace + +/obj/effect/warped_rune/greenspace + desc = "Warning: don't step on this if you want to keep your genes." + icon_state = "rune_green" + remove_on_activation = FALSE + +/obj/effect/warped_rune/greenspace/Crossed(atom/movable/AM, oldloc) + if(ishuman(AM)) + randomize_human(AM) + activated_on_step = TRUE + . = ..() + +/* pink rune, makes people slightly happier after walking on it*/ +/obj/item/slimecross/warping/pink + colour = "pink" + effect_desc = "Draws a rune that makes people happier!" + runepath = /obj/effect/warped_rune/pinkspace + +/obj/effect/warped_rune/pinkspace + desc = "Love is the only reliable source of happiness we have left. But like everything, it comes with a price." + icon_state = "rune_pink" + remove_on_activation = FALSE + +///adds the jolly mood effect along with hug sound effect. +/obj/effect/warped_rune/pinkspace/Crossed(atom/movable/AM, oldloc) + if(istype(AM, /mob/living/carbon/human)) + playsound(rune_turf, "sound/weapons/thudswoosh.ogg", 50, TRUE) + SEND_SIGNAL(AM, COMSIG_ADD_MOOD_EVENT,"jolly", /datum/mood_event/jolly) + to_chat(AM, "You feel happier.") + activated_on_step = TRUE + . = ..() + +/obj/item/slimecross/warping/gold + colour = "gold" + runepath = /obj/effect/warped_rune/goldspace + effect_desc = "Draw a rune that exchanges objects of this dimension for objects of a parallel dimension." + +/obj/effect/warped_rune/goldspace + icon_state = "rune_gold" + desc = "This can be activated to transmute valuable items into a random item." + remove_on_activation = FALSE + var/target_value = 5000 + var/static/list/common_items = list( + /obj/item/toy/plush/carpplushie, + /obj/item/toy/plush/bubbleplush, + /obj/item/toy/plush/plushvar, + /obj/item/toy/plush/narplush, + /obj/item/toy/plush/lizardplushie, + /obj/item/toy/plush/snakeplushie, + /obj/item/toy/plush/nukeplushie, + /obj/item/toy/plush/slimeplushie, + /obj/item/toy/plush/awakenedplushie, + /obj/item/toy/plush/beeplushie, + /obj/item/toy/plush/moth, + /obj/item/toy/eightball/haunted, + /obj/item/toy/foamblade, + /obj/item/toy/katana, + /obj/item/toy/snappop/phoenix, + /obj/item/toy/cards/deck/unum, + /obj/item/toy/redbutton, + /obj/item/toy/toy_xeno, + /obj/item/toy/reality_pierce, + /obj/item/toy/xmas_cracker, + /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted, + /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted, + /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted, + /obj/item/gun/ballistic/shotgun/toy/unrestricted, + /obj/item/gun/ballistic/shotgun/toy/crossbow, + /obj/item/clothing/mask/facehugger/toy, + /obj/item/dualsaber/toy, + /obj/item/clothing/under/costume/roman, + /obj/item/clothing/under/costume/pirate, + /obj/item/clothing/under/costume/kilt/highlander, + /obj/item/clothing/under/costume/gladiator/ash_walker, + /obj/item/clothing/under/costume/geisha, + /obj/item/clothing/under/costume/villain, + /obj/item/clothing/under/costume/singer/yellow, + /obj/item/clothing/under/costume/russian_officer + ) + + var/static/list/uncommon_items = list( + /obj/item/clothing/head/speedwagon/cursed, + /obj/item/clothing/suit/space/hardsuit/ancient, + /obj/item/gun/energy/laser/retro/old, + /obj/item/storage/toolbox/mechanical/old, + /obj/item/storage/toolbox/emergency/old, + /obj/effect/spawner/lootdrop/three_course_meal, + /mob/living/simple_animal/pet/dog/corgi/puppy/void, + /obj/structure/closet/crate/necropolis, + /obj/item/card/emagfake, + /obj/item/flashlight/flashdark, + /mob/living/simple_animal/hostile/cat_butcherer + ) + + var/static/list/rare_items = list( + /obj/effect/spawner/lootdrop/armory_contraband, + /obj/effect/spawner/lootdrop/teratoma/major + ) + + +/obj/effect/warped_rune/goldspace/do_effect(mob/user) + var/price = 0 + var/list/valuable_items = list() + for(var/obj/item/I in rune_turf) + var/datum/export_report/ex = export_item_and_contents(I, dry_run=TRUE) + for(var/x in ex.total_amount) + if(ex.total_value[x]) + price += ex.total_value[x] + valuable_items |= I + + if(price >= target_value) + remove_on_activation = TRUE + var/path + switch(rand(1,100)) + if(1 to 80) + path = pick(common_items) + if(80 to 99) + path = pick(uncommon_items) + else + path = pick(rare_items) + + var/atom/movable/A = new path(rune_turf) + QDEL_LIST(valuable_items) + to_chat(user, "[src] shines and [A] appears before you.") + else + to_chat(user, "The sacrifice is insufficient.") + . = ..() + +//oil +/obj/item/slimecross/warping/oil + colour = "oil" + runepath = /obj/effect/warped_rune/oilspace + effect_desc = "Draw a rune that can explode whoever steps on it." + +/obj/effect/warped_rune/oilspace + icon_state = "rune_oil" + desc = "This is basically a mine." + remove_on_activation = FALSE + +/obj/effect/warped_rune/oilspace/Crossed(atom/movable/AM, oldloc) + if(iscarbon(AM)) + var/mob/living/carbon/C = AM + var/amt = rand(4,12) + C.reagents.add_reagent(/datum/reagent/water, amt) + C.reagents.add_reagent(/datum/reagent/potassium, amt) + activated_on_step = TRUE + . = ..() + +/obj/item/slimecross/warping/black + colour = "black" + runepath = /obj/effect/warped_rune/blackspace + effect_desc = "Draw a rune that can transmute a corpse into a shade." + +/obj/effect/warped_rune/blackspace + icon_state = "rune_black" + desc = "Souls are like any other material, you just have to find the right place to manufacture them." + +/obj/effect/warped_rune/blackspace/do_effect(mob/user) + for(var/mob/living/carbon/human/host in rune_turf) + if(host.key) //checks if the ghost and brain's there + to_chat(user, "This body can't be transmuted by the rune in this state!") + return + + to_chat(user, "The rune is trying to repair [host.name]'s soul!") + var/list/candidates = pollCandidatesForMob("Do you want to replace the soul of [host.name]?", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, host, POLL_IGNORE_SHADE)//todo: fix desc + + if(length(candidates) && !host.key) //check if anyone wanted to play as the dead person and check if no one's in control of the body one last time. + var/mob/dead/observer/ghost = pick(candidates) + + host.mind.memory = "" //resets the memory since it's a new soul inside. + host.key = ghost.key + var/mob/living/simple_animal/shade/S = host.change_mob_type(/mob/living/simple_animal/shade , rune_turf, "Shade", FALSE) + S.maxHealth = 1 + S.health = 1 + S.faction = host.faction + S.copy_languages(host, LANGUAGE_MIND) + playsound(host, "sound/magic/castsummon.ogg", 50, TRUE) + qdel(host) + activated_on_step = TRUE + return ..() + + to_chat(user, "The rune failed! Maybe you should try again later.") + + +/obj/item/slimecross/warping/lightpink + colour = "light pink" + runepath = /obj/effect/warped_rune/lightpinkspace + effect_desc = "Draw a frog that makes whoever steps on it peaceful." + +/obj/effect/warped_rune/lightpinkspace + desc = "Peace and love." + icon_state = "rune_light_pink" + remove_on_activation = FALSE + +/obj/effect/warped_rune/lightpinkspace/Crossed(atom/movable/AM, oldloc) + if(iscarbon(AM)) + var/mob/living/carbon/C = AM + C.reagents.add_reagent(/datum/reagent/pax, 10) + activated_on_step = TRUE + . = ..() + +/obj/item/slimecross/warping/adamantine + colour = "adamantine" + runepath = /obj/effect/warped_rune/adamantinespace + effect_desc = "Draw a rune that can summon reflective fields." + +/obj/effect/warped_rune/adamantinespace + desc = "This can be activated to summon reflective fields." + icon_state = "rune_adamantine" + +/obj/structure/reflector/box/anchored/mob_pass/CanPass(atom/movable/mover, turf/target) + if(isliving(mover)) + return TRUE + return ..() + +/obj/effect/warped_rune/adamantinespace/do_effect(mob/user) + for(var/turf/open/T in RANGE_TURFS(1, src) - rune_turf) + var/obj/structure/reflector/box/anchored/mob_pass/D = new (T) + D.setAngle(dir2angle(get_dir(src, D))) + D.admin = TRUE + QDEL_IN(D, 300) + activated_on_step = TRUE + . = ..() + + +///the template of the warped_room map +GLOBAL_DATUM(warped_room, /datum/map_template/warped_room) + +/* Used to teleport anything over it to a unique room similar to hilbert's hotel.*/ + +/obj/item/slimecross/warping/rainbow + colour = "rainbow" + effect_desc = "Draws a rune that can be activated to teleport whoever is standing on it." + runepath = /obj/effect/warped_rune/rainbowspace + +/obj/effect/warped_rune/rainbowspace + icon_state = "rune_rainbow" + desc = "This is where I go when I want to be alone. Yet they keep clawing at the walls until everything crumbles." + remove_on_activation = FALSE + +/obj/effect/warped_room_exit + name = "warped_rune" + icon = 'icons/obj/slimecrossing.dmi' + icon_state = "rune_rainbow" + desc = "Use this rune if you want to leave this place. You will have to leave eventually." + move_resist = INFINITY + anchored = TRUE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + +/datum/map_template/warped_room + name = "Warped room" + mappath = '_maps/templates/warped_room.dmm' + var/obj/effect/warped_room_exit/exit_rune + var/list/rainbow_runes = list() + +/area/warped_room + name = "warped room" + icon_state = "yellow" + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + requires_power = FALSE + has_gravity = TRUE + teleport_restriction = TELEPORT_ALLOW_NONE + +/area/warped_room/get_virtual_z(turf/T) + return WARPED_ROOM_VIRTUAL_Z + +///creates the warped room and place an exit rune to exit the room +/obj/effect/warped_rune/rainbowspace/Initialize() + . = ..() + if(!GLOB.warped_room) + GLOB.warped_room = new + ///current x,y,z location of the reserved space for the rune room + var/datum/turf_reservation/room_reservation = SSmapping.RequestBlockReservation(GLOB.warped_room.width, GLOB.warped_room.height) //monkey sees valid location + GLOB.warped_room.load(locate(room_reservation.bottom_left_coords[1], room_reservation.bottom_left_coords[2], room_reservation.bottom_left_coords[3]))//monkey room activate + GLOB.warped_room.exit_rune = new (locate(room_reservation.bottom_left_coords[1] + 3, room_reservation.bottom_left_coords[2] + 6, room_reservation.bottom_left_coords[3])) + GLOB.warped_room.rainbow_runes += src + +/obj/effect/warped_rune/rainbowspace/do_effect(mob/user) + var/tp_mob = FALSE + for(var/mob/living/carbon/human/customer in rune_turf) + tp_mob = TRUE + customer.forceMove(get_turf(GLOB.warped_room.exit_rune)) + if(tp_mob) + playsound(rune_turf, dir_sound, 20, TRUE) + . = ..() + +///Will delete the room when the rune is destroyed if no customer is left in the room. +/obj/effect/warped_rune/rainbowspace/Destroy() + GLOB.warped_room?.rainbow_runes -= src + return ..() + +///anyone on the exit rune when it is used will be teleported to the rune that was used to teleport to the warped room +/obj/effect/warped_room_exit/attack_hand(mob/living/user) + . = ..() + var/exit_turf + var/tp_mob = FALSE + for(var/mob/living/carbon/human/customer in get_turf(src)) + do_sparks(3, FALSE, get_turf(src)) + if(!exit_turf) + if(GLOB.warped_room?.rainbow_runes.len) + var/obj/effect/warped_rune/WR = pick(GLOB.warped_room.rainbow_runes) + exit_turf = WR.rune_turf + else + exit_turf = find_safe_turf() + customer.forceMove(exit_turf) + tp_mob = TRUE + if(tp_mob) + playsound(get_turf(src), 'sound/effects/phasein.ogg', 20, TRUE) diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 80bb1b39e0b89..5aa4f3281c0f8 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -1,18 +1,18 @@ //Xenobio control console -/mob/camera/aiEye/remote/xenobio +/mob/camera/ai_eye/remote/xenobio visible_icon = TRUE icon = 'icons/mob/cameramob.dmi' icon_state = "generic_camera" var/allowed_area = null -/mob/camera/aiEye/remote/xenobio/Initialize() +/mob/camera/ai_eye/remote/xenobio/Initialize() var/area/A = get_area(loc) allowed_area = A.name . = ..() -/mob/camera/aiEye/remote/xenobio/setLoc(var/t) +/mob/camera/ai_eye/remote/xenobio/setLoc(var/t) var/area/new_area = get_area(t) - if(new_area && new_area.name == allowed_area || new_area && new_area.xenobiology_compatible) + if(new_area && new_area.name == allowed_area || new_area && (new_area.area_flags & XENOBIOLOGY_COMPATIBLE)) return ..() else return @@ -67,7 +67,7 @@ return ..() /obj/machinery/computer/camera_advanced/xenobio/CreateEye() - eyeobj = new /mob/camera/aiEye/remote/xenobio(get_turf(src)) + eyeobj = new /mob/camera/ai_eye/remote/xenobio(get_turf(src)) eyeobj.origin = src eyeobj.visible_icon = TRUE eyeobj.icon = 'icons/mob/cameramob.dmi' @@ -105,20 +105,20 @@ potion_action.target = src potion_action.Grant(user) actions += potion_action - + if(hotkey_help) hotkey_help.target = src hotkey_help.Grant(user) actions += hotkey_help - RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, .proc/XenoSlimeClickCtrl) - RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, .proc/XenoSlimeClickAlt) - RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, .proc/XenoSlimeClickShift) - RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, .proc/XenoTurfClickShift) - RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, .proc/XenoTurfClickCtrl) + RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, .proc/XenoSlimeClickCtrl) + RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, .proc/XenoSlimeClickAlt) + RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, .proc/XenoSlimeClickShift) + RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, .proc/XenoTurfClickShift) + RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, .proc/XenoTurfClickCtrl) RegisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL, .proc/XenoMonkeyClickCtrl) - //Checks for recycler on every interact, prevents issues with load order on certain maps. + //Checks for recycler on every interact, prevents issues with load order on certain maps. if(!connected_recycler) for(var/obj/machinery/monkey_recycler/recycler in GLOB.monkey_recyclers) if(get_area(recycler.loc) == get_area(loc)) @@ -126,15 +126,17 @@ connected_recycler.connected += src /obj/machinery/computer/camera_advanced/xenobio/remove_eye_control(mob/living/user) - UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL) - UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT) - UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT) - UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT) - UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL) - UnregisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL) - ..() + UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL) + UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT) + UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT) + UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT) + UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL) + UnregisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL) + ..() /obj/machinery/computer/camera_advanced/xenobio/proc/on_contents_del(datum/source, atom/deleted) + SIGNAL_HANDLER + if(current_potion == deleted) current_potion = null if(deleted in stored_slimes) @@ -185,7 +187,7 @@ if(!target || !isliving(owner)) return var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control + var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control var/obj/machinery/computer/camera_advanced/xenobio/X = target if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) @@ -205,7 +207,7 @@ if(!target || !isliving(owner)) return var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control + var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control var/obj/machinery/computer/camera_advanced/xenobio/X = target if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) @@ -231,20 +233,20 @@ if(!target || !isliving(owner)) return var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control + var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control var/obj/machinery/computer/camera_advanced/xenobio/X = target if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) if(X.monkeys >= 1) var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(remote_eye.loc, TRUE, owner) if (!QDELETED(food)) - food.LAssailant = C + food.LAssailant = WEAKREF(C) X.monkeys-- X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors to_chat(owner, "[X] now has [X.monkeys] monkeys stored.") else to_chat(owner, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.") - else + else to_chat(owner, "Target is not near a camera. Cannot proceed.") @@ -257,7 +259,7 @@ if(!target || !isliving(owner)) return var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control + var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control var/obj/machinery/computer/camera_advanced/xenobio/X = target var/obj/machinery/monkey_recycler/recycler = X.connected_recycler @@ -270,7 +272,7 @@ M.visible_message("[M] vanishes as [M.p_theyre()] reclaimed for recycling!") recycler.use_power(500) X.monkeys += recycler.cube_production - X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors + X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors qdel(M) to_chat(owner, "[X] now has [X.monkeys] monkeys available.") else @@ -285,7 +287,7 @@ if(!target || !isliving(owner)) return var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control + var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) for(var/mob/living/simple_animal/slime/S in remote_eye.loc) @@ -303,7 +305,7 @@ return var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control + var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control var/obj/machinery/computer/camera_advanced/xenobio/X = target if(QDELETED(X.current_potion)) @@ -366,40 +368,46 @@ // Scans slime /obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/simple_animal/slime/S) + SIGNAL_HANDLER + if(!GLOB.cameranet.checkTurfVis(S.loc)) to_chat(user, "Target is not near a camera. Cannot proceed.") return var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control var/area/mobarea = get_area(S.loc) - if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + if(mobarea.name == E.allowed_area || (mobarea & XENOBIOLOGY_COMPATIBLE)) slime_scan(S, C) //Feeds a potion to slime /obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/simple_animal/slime/S) + SIGNAL_HANDLER + if(!GLOB.cameranet.checkTurfVis(S.loc)) to_chat(user, "Target is not near a camera. Cannot proceed.") return var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin var/area/mobarea = get_area(S.loc) if(QDELETED(X.current_potion)) to_chat(C, "No potion loaded.") return - if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + if(mobarea.name == E.allowed_area ||(mobarea & XENOBIOLOGY_COMPATIBLE)) X.current_potion.attack(S, C) //Picks up slime /obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/simple_animal/slime/S) + SIGNAL_HANDLER + if(!GLOB.cameranet.checkTurfVis(S.loc)) to_chat(user, "Target is not near a camera. Cannot proceed.") return var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin var/area/mobarea = get_area(S.loc) - if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + if(mobarea.name == E.allowed_area || (mobarea & XENOBIOLOGY_COMPATIBLE)) if(X.stored_slimes.len >= X.max_slimes) to_chat(C, "Slime storage is full.") return @@ -414,14 +422,16 @@ //Place slimes /obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickShift(mob/living/user, turf/open/T) + SIGNAL_HANDLER + if(!GLOB.cameranet.checkTurfVis(T)) to_chat(user, "Target is not near a camera. Cannot proceed.") return var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin var/area/turfarea = get_area(T) - if(turfarea.name == E.allowed_area || turfarea.xenobiology_compatible) + if(turfarea.name == E.allowed_area || (turfarea & XENOBIOLOGY_COMPATIBLE)) for(var/mob/living/simple_animal/slime/S in X.stored_slimes) S.forceMove(T) S.visible_message("[S] warps in!") @@ -429,18 +439,20 @@ //Place monkey /obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickCtrl(mob/living/user, turf/open/T) + SIGNAL_HANDLER + if(!GLOB.cameranet.checkTurfVis(T)) to_chat(user, "Target is not near a camera. Cannot proceed.") return var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin var/area/turfarea = get_area(T) - if(turfarea.name == E.allowed_area || turfarea.xenobiology_compatible) + if(turfarea.name == E.allowed_area || (turfarea & XENOBIOLOGY_COMPATIBLE)) if(X.monkeys >= 1) var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(T, TRUE, C) if (!QDELETED(food)) - food.LAssailant = C + food.LAssailant = WEAKREF(C) X.monkeys-- X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors to_chat(C, "[X] now has [X.monkeys] monkeys stored.") @@ -449,22 +461,24 @@ //Pick up monkey /obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/monkey/M) + SIGNAL_HANDLER + if(!GLOB.cameranet.checkTurfVis(M.loc)) to_chat(user, "Target is not near a camera. Cannot proceed.") return var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin var/area/mobarea = get_area(M.loc) if(!X.connected_recycler) to_chat(C, "There is no connected monkey recycler. Use a multitool to link one.") return - if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + if(mobarea.name == E.allowed_area || (mobarea & XENOBIOLOGY_COMPATIBLE)) if(!M.stat) return M.visible_message("[M] vanishes as [p_theyre()] reclaimed for recycling!") X.connected_recycler.use_power(500) X.monkeys += connected_recycler.cube_production - X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors + X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors qdel(M) to_chat(C, "[X] now has [X.monkeys] monkeys available.") diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index d65a39ee185f8..0daef5960ef85 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -12,15 +12,19 @@ throw_range = 6 grind_results = list() var/Uses = 1 // uses before it goes inert - var/qdel_timer = null // deletion timer, for delayed reactions + var/qdel_timer // deletion timer, for delayed reactions var/effectmod var/list/activate_reagents = list() //Reagents required for activation var/recurring = FALSE + var/color_slime ///the color of the extract and the slime it came from + var/sparkly = FALSE //if true, cargo gets 2x the money for them /obj/item/slime_extract/examine(mob/user) . = ..() if(Uses > 1) . += "It has [Uses] uses remaining." + if(sparkly) + . += "It looks sparkly." /obj/item/slime_extract/attackby(obj/item/O, mob/user) if(istype(O, /obj/item/slimepotion/enhancer)) @@ -78,6 +82,7 @@ name = "grey slime extract" icon_state = "grey slime extract" effectmod = "reproductive" + color_slime = "grey" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/grey/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -103,6 +108,7 @@ name = "gold slime extract" icon_state = "gold slime extract" effectmod = "symbiont" + color_slime = "gold" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/gold/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -132,6 +138,7 @@ name = "silver slime extract" icon_state = "silver slime extract" effectmod = "consuming" + color_slime = "silver" activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/silver/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -157,6 +164,7 @@ name = "metal slime extract" icon_state = "metal slime extract" effectmod = "industrial" + color_slime = "metal" activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/metal/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -181,6 +189,7 @@ name = "purple slime extract" icon_state = "purple slime extract" effectmod = "regenerative" + color_slime = "purple" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/purple/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -200,6 +209,7 @@ name = "dark purple slime extract" icon_state = "dark purple slime extract" effectmod = "self-sustaining" + color_slime = "darkpurple" activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/darkpurple/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -223,6 +233,7 @@ name = "orange slime extract" icon_state = "orange slime extract" effectmod = "burning" + color_slime = "orange" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/orange/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -243,6 +254,7 @@ name = "yellow slime extract" icon_state = "yellow slime extract" effectmod = "charged" + color_slime = "yellow" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/yellow/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -274,6 +286,7 @@ name = "red slime extract" icon_state = "red slime extract" effectmod = "sanguine" + color_slime = "red" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/red/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -285,7 +298,7 @@ if(SLIME_ACTIVATE_MAJOR) user.visible_message("[user]'s skin flashes red for a moment...", "Your skin flashes red as you emit rage-inducing pheromones...") - for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(user), null)) + for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(user))) slime.rabid = TRUE slime.visible_message("The [slime] is driven into a frenzy!") return 600 @@ -294,6 +307,7 @@ name = "blue slime extract" icon_state = "blue slime extract" effectmod = "stabilized" + color_slime = "blue" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/blue/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -318,6 +332,7 @@ name = "dark blue slime extract" icon_state = "dark blue slime extract" effectmod = "chilling" + color_slime = "darkblue" activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/darkblue/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -341,6 +356,7 @@ name = "pink slime extract" icon_state = "pink slime extract" effectmod = "gentle" + color_slime = "pink" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/pink/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -360,15 +376,15 @@ if(SLIME_ACTIVATE_MAJOR) user.visible_message("[user]'s skin starts flashing hypnotically...", "Your skin starts forming odd patterns, pacifying creatures around you.") - for(var/mob/living/carbon/C in viewers(user, null)) - if(C != user) - C.reagents.add_reagent(/datum/reagent/pax,2) + for(var/mob/living/carbon/C in oviewers(user)) + C.reagents.add_reagent(/datum/reagent/pax,2) return 600 /obj/item/slime_extract/green name = "green slime extract" icon_state = "green slime extract" effectmod = "mutative" + color_slime = "green" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/uranium/radium) /obj/item/slime_extract/green/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -393,6 +409,7 @@ name = "light pink slime extract" icon_state = "light pink slime extract" effectmod = "loyal" + color_slime = "lightpink" activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/lightpink/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -417,6 +434,7 @@ name = "black slime extract" icon_state = "black slime extract" effectmod = "transformative" + color_slime = "black" activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/black/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -438,6 +456,7 @@ name = "oil slime extract" icon_state = "oil slime extract" effectmod = "detonating" + color_slime = "oil" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/oil/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -461,6 +480,7 @@ name = "adamantine slime extract" icon_state = "adamantine slime extract" effectmod = "crystalline" + color_slime = "adamantine" activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/adamantine/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -490,6 +510,7 @@ name = "bluespace slime extract" icon_state = "bluespace slime extract" effectmod = "warping" + color_slime = "bluespace" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) var/teleport_ready = FALSE var/teleport_x = 0 @@ -526,6 +547,7 @@ name = "pyrite slime extract" icon_state = "pyrite slime extract" effectmod = "prismatic" + color_slime = "pyrite" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/pyrite/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -552,6 +574,7 @@ name = "cerulean slime extract" icon_state = "cerulean slime extract" effectmod = "recurring" + color_slime = "cerulean" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/cerulean/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -572,6 +595,7 @@ name = "sepia slime extract" icon_state = "sepia slime extract" effectmod = "lengthened" + color_slime = "sepia" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/sepia/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -594,6 +618,7 @@ name = "rainbow slime extract" icon_state = "rainbow slime extract" effectmod = "hyperchromatic" + color_slime = "rainbow" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,"lesser plasma",/datum/reagent/toxin/slimejelly,"holy water and uranium") //Curse this snowflake reagent list. /obj/item/slime_extract/rainbow/activate(mob/living/carbon/human/user, datum/species/species, activation_type) @@ -686,7 +711,7 @@ to_chat(user, "You offer [src] to [SM]...") being_used = TRUE - var/list/candidates = pollCandidatesForMob("Do you want to play as [SM.name]?", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, SM, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm + var/list/candidates = pollCandidatesForMob("Do you want to play as [SM.name]? (Sentience Potion)", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, SM, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) SM.key = C.key @@ -854,10 +879,10 @@ return if(isitem(C)) var/obj/item/I = C - if(I.slowdown <= 0 || I.obj_flags & IMMUTABLE_SLOW) + if(I.slowdown != initial(I.slowdown) || I.obj_flags & IMMUTABLE_SLOW) to_chat(user, "The [C] can't be made any faster!") return ..() - I.slowdown = 0 + I.slowdown = initial(I.slowdown) * 0.5 if(istype(C, /obj/vehicle)) var/obj/vehicle/V = C @@ -921,6 +946,14 @@ to_chat(user, "The potion can only be used on gendered things!") return + L.visible_message("[user] starts to feed [L] a gender change potion!", + "[user] starts to feed you a gender change potion!") + + if(!do_after(user, 50, target = L)) + return + + to_chat(user, "You feed [L] the gender change potion!") + if(L.gender == MALE) L.gender = FEMALE L.visible_message("[L] suddenly looks more feminine!", "You suddenly feel more feminine!") @@ -947,16 +980,17 @@ being_used = TRUE - to_chat(user, "You offer [src] to [user]...") + to_chat(user, "You offer [src] to [M]...") var/new_name = stripped_input(M, "What would you like your name to be?", "Input a name", M.real_name, MAX_NAME_LEN) - if(!new_name || QDELETED(src) || QDELETED(M) || new_name == M.real_name || !M.Adjacent(user)) + if(!new_name || QDELETED(src) || QDELETED(M) || new_name == M.real_name || !M.Adjacent(user) || CHAT_FILTER_CHECK(new_name)) being_used = FALSE return M.visible_message("[M] has a new name, [new_name].", "Your old name of [M.real_name] fades away, and your new name [new_name] anchors itself in your mind.") message_admins("[ADMIN_LOOKUPFLW(user)] used [src] on [ADMIN_LOOKUPFLW(M)], letting them rename themselves into [new_name].") + log_game("[key_name(user)] used [src] on [key_name(M)], letting them rename themselves into [new_name].") // pass null as first arg to not update records or ID/PDA M.fully_replace_character_name(null, new_name) @@ -1031,5 +1065,5 @@ for(var/turf/T in A) T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) T.add_atom_colour("#2956B2", FIXED_COLOUR_PRIORITY) - A.xenobiology_compatible = TRUE + A.area_flags |= XENOBIOLOGY_COMPATIBLE qdel(src) diff --git a/code/modules/ruins/lavalandruin_code/puzzle.dm b/code/modules/ruins/lavalandruin_code/puzzle.dm index 70b0545ded062..2a1f3b2886281 100644 --- a/code/modules/ruins/lavalandruin_code/puzzle.dm +++ b/code/modules/ruins/lavalandruin_code/puzzle.dm @@ -34,7 +34,7 @@ return get_step(center,SOUTH) if(9) return get_step(center,SOUTHEAST) - + /obj/effect/sliding_puzzle/Initialize(mapload) ..() return INITIALIZE_HINT_LATELOAD @@ -56,7 +56,7 @@ /obj/effect/sliding_puzzle/proc/validate() if(finished) return - + if(elements.len < 8) //Someone broke it qdel(src) @@ -86,7 +86,7 @@ shake_camera(M, COLLAPSE_DURATION , 1) for(var/obj/structure/puzzle_element/E in elements) E.collapse() - + dispense_reward() /obj/effect/sliding_puzzle/proc/dispense_reward() @@ -103,7 +103,7 @@ for(var/j in i to current_ordering.len) if(current_ordering[j] < checked_value) swap_tally++ - + return swap_tally % 2 == 0 //swap two tiles in same row @@ -113,13 +113,13 @@ if(empty_tile_id == 1 || empty_tile_id == 2) //Can't swap with empty one so just grab some in second row first_tile_id = 4 other_tile_id = 5 - + var/turf/T1 = get_turf_for_id(first_tile_id) var/turf/T2 = get_turf_for_id(other_tile_id) - + var/obj/structure/puzzle_element/E1 = locate() in T1 var/obj/structure/puzzle_element/E2 = locate() in T2 - + E1.forceMove(T2) E2.forceMove(T1) @@ -294,7 +294,7 @@ //Some armor so it's harder to kill someone by mistake. /obj/structure/puzzle_element/prison - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 50, "acid" = 50) + armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 50, "acid" = 50, "stamina" = 0) /obj/structure/puzzle_element/prison/relaymove(mob/user) return @@ -342,7 +342,7 @@ for(var/atom/movable/AM in things_to_throw) var/throwtarget = get_edge_target_turf(T, get_dir(T, get_step_away(AM, T))) AM.throw_at(throwtarget, 2, 3) - + //Create puzzle itself cube.prisoner = prisoner cube.setup() @@ -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/lavalandruin_code/syndicate_base.dm b/code/modules/ruins/lavalandruin_code/syndicate_base.dm index 32b47ccb311bd..99782a821337e 100644 --- a/code/modules/ruins/lavalandruin_code/syndicate_base.dm +++ b/code/modules/ruins/lavalandruin_code/syndicate_base.dm @@ -23,5 +23,5 @@ /obj/item/paper/fluff/ruins/syndicomms name = "paper - 'Communication Frequencies'" - info = "Greeting, Agent. I see you have awaken from your cryogenic slumber. This either means that the new Nanotransen space project is complete and operational in a nearby sector, or that Ashlanders have launched an assault on our base. We recommend you get rid of any pests and do not confuse them for humans.

In case you don't remember how to do your job, all you need is the equipment we provided; your Chameleon Mask, your Agent ID, and the intercom nearby. A nearby shelf contains all the names and jobs of the current Nanotransen employees. Assign their name and job to your ID, and your Mask will mimic the voice of whoever you are impersonating.

Oh, one more thing. Here is a list of frequencies for you to troll on:
  • 145.9 - Common Channel
  • 144.7 - Private AI Channel
  • 135.9 - Security Channel
  • 135.7 - Engineering Channel
  • 135.5 - Medical Channel
  • 135.3 - Command Channel
  • 135.1 - Science Channel
  • 134.9 - Service Channel
  • 134.7 - Supply Channel
  • " + info = "Greetings, Agent. I see you have awaken from your cryogenic slumber. This either means that the new Nanotransen space project is complete and operational in a nearby sector, or that Ashlanders have launched an assault on our base. We recommend you get rid of any pests and do not confuse them for humans.

    In case you don't remember how to do your job, all you need is the equipment we provided; your Chameleon Mask, your Agent ID, and the intercom nearby. A nearby shelf contains all the names and jobs of the current Nanotransen employees. Assign their name and job to your ID, and your Mask will mimic the voice of whoever you are impersonating.

    Oh, one more thing. Here is a list of frequencies for you to troll on:
    • 145.9 - Common Channel
    • 144.7 - Private AI Channel
    • 135.9 - Security Channel
    • 135.7 - Engineering Channel
    • 135.5 - Medical Channel
    • 135.3 - Command Channel
    • 135.1 - Science Channel
    • 134.9 - Service Channel
    • 134.7 - Supply Channel
    • 136.1 - Exploration Channel
    • " \ No newline at end of file diff --git a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm index 0945fbb125052..7024ed9177258 100644 --- a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm +++ b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm @@ -17,17 +17,26 @@ var/faction = list("ashwalker") var/meat_counter = 6 var/datum/team/ashwalkers/ashies + var/datum/linked_objective /obj/structure/lavaland/ash_walker/Initialize() .=..() ashies = new /datum/team/ashwalkers() var/datum/objective/protect_object/objective = new objective.set_target(src) + linked_objective = objective ashies.objectives += objective for(var/datum/mind/M in ashies.members) log_objective(M, objective.explanation_text) START_PROCESSING(SSprocessing, src) +/obj/structure/lavaland/ash_walker/Destroy() + ashies.objectives -= linked_objective + ashies = null + QDEL_NULL(linked_objective) + STOP_PROCESSING(SSprocessing, src) + return ..() + /obj/structure/lavaland/ash_walker/deconstruct(disassembled) new /obj/item/assembly/signaler/anomaly (get_step(loc, pick(GLOB.alldirs))) new /obj/effect/collapse(loc) @@ -38,7 +47,7 @@ spawn_mob() /obj/structure/lavaland/ash_walker/proc/consume() - for(var/mob/living/H in view(src, 1)) //Only for corpse right next to/on same tile + for(var/mob/living/H in hearers(1, src)) //Only for corpse right next to/on same tile if(H.stat) visible_message("Serrated tendrils eagerly pull [H] to [src], tearing the body apart as its blood seeps over the eggs.") playsound(get_turf(src),'sound/magic/demon_consume.ogg', 100, 1) @@ -51,8 +60,8 @@ meat_counter++ H.gib() obj_integrity = min(obj_integrity + max_integrity*0.05,max_integrity)//restores 5% hp of tendril - for(var/mob/living/L in view(src, 5)) - if(L.mind.has_antag_datum(/datum/antagonist/ashwalker)) + for(var/mob/living/L in viewers(5, src)) + if(L.mind?.has_antag_datum(/datum/antagonist/ashwalker)) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "oogabooga", /datum/mood_event/sacrifice_good) else SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "oogabooga", /datum/mood_event/sacrifice_bad) diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm index dfcf854598b24..a9dff813be275 100644 --- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm +++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm @@ -182,7 +182,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) var/sound/legion_sound = sound('sound/creatures/legion_spawn.ogg') for(var/mob/M in GLOB.player_list) - if(M.z == z) + if(M.get_virtual_z_level() == get_virtual_z_level()) to_chat(M, "Discordant whispers flood your mind in a thousand voices. Each one speaks your name, over and over. Something horrible has been released.") M.playsound_local(T, null, 100, FALSE, 0, FALSE, pressure_affected = FALSE, S = legion_sound) flash_color(M, flash_color = "#FF0000", flash_time = 50) diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm index 733a4f0ba4c40..418f6f32a2cb7 100644 --- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm @@ -115,7 +115,7 @@ "Perfect. Much better! Now nobody will be able to resist yo-") var/turf/T = get_turf(user) - var/list/levels = SSmapping.levels_by_trait(ZTRAIT_SPACE_RUINS) + var/list/levels = SSmapping.levels_by_trait(ZTRAIT_DYNAMIC_LEVEL) var/turf/dest if (levels.len) dest = locate(T.x, T.y, pick(levels)) diff --git a/code/modules/ruins/spaceruin_code/asteroid10.dm b/code/modules/ruins/spaceruin_code/asteroid10.dm new file mode 100644 index 0000000000000..67d3a071f6e98 --- /dev/null +++ b/code/modules/ruins/spaceruin_code/asteroid10.dm @@ -0,0 +1,23 @@ +/////////// asteroid4 items + +/obj/item/paper/fluff/ruins/asteroid10/welcome + name = "Welcome to Dog Heaven!" + info = "The ambassador of Dog Heaven welcomes you to our humble retreat!" + +/obj/item/reagent_containers/food/snacks/nugget/dog + name = "dog treat" + list_reagents = list(/datum/reagent/consumable/nutriment = 1,/datum/reagent/corgium = 10) + +/mob/living/simple_animal/pet/dog/corgi/chef/Initialize() + ..() + var/obj/item/clothing/head/chefhat/hat = new (src) + inventory_head = hat + update_corgi_fluff() + regenerate_icons() + +/mob/living/simple_animal/pet/dog/corgi/seccie/Initialize() + ..() + var/obj/item/clothing/head/helmet/hat = new (src) + inventory_head = hat + update_corgi_fluff() + regenerate_icons() \ No newline at end of file diff --git a/code/modules/ruins/spaceruin_code/caravanambush.dm b/code/modules/ruins/spaceruin_code/caravanambush.dm index 740850524cfd9..c58cab4d8999b 100644 --- a/code/modules/ruins/spaceruin_code/caravanambush.dm +++ b/code/modules/ruins/spaceruin_code/caravanambush.dm @@ -26,54 +26,34 @@ name = "experimental crowbar" toolspeed = 0.3 -/obj/machinery/computer/shuttle/caravan +/obj/machinery/computer/shuttle_flight/caravan /obj/item/circuitboard/computer/caravan - build_path = /obj/machinery/computer/shuttle/caravan + build_path = /obj/machinery/computer/shuttle_flight/caravan /obj/item/circuitboard/computer/caravan/trade1 - build_path = /obj/machinery/computer/shuttle/caravan/trade1 + build_path = /obj/machinery/computer/shuttle_flight/caravan/trade1 /obj/item/circuitboard/computer/caravan/pirate - build_path = /obj/machinery/computer/shuttle/caravan/pirate + build_path = /obj/machinery/computer/shuttle_flight/caravan/pirate /obj/item/circuitboard/computer/caravan/syndicate1 - build_path = /obj/machinery/computer/shuttle/caravan/syndicate1 + build_path = /obj/machinery/computer/shuttle_flight/caravan/syndicate1 /obj/item/circuitboard/computer/caravan/syndicate2 - build_path = /obj/machinery/computer/shuttle/caravan/syndicate2 + build_path = /obj/machinery/computer/shuttle_flight/caravan/syndicate2 /obj/item/circuitboard/computer/caravan/syndicate3 - build_path = /obj/machinery/computer/shuttle/caravan/syndicate3 + build_path = /obj/machinery/computer/shuttle_flight/caravan/syndicate3 -/obj/machinery/computer/shuttle/caravan/trade1 +/obj/machinery/computer/shuttle_flight/caravan/trade1 name = "Small Freighter Shuttle Console" desc = "Used to control the Small Freighter." circuit = /obj/item/circuitboard/computer/caravan/trade1 shuttleId = "caravantrade1" possible_destinations = "whiteship_away;whiteship_home;whiteship_z4;whiteship_lavaland;caravantrade1_custom;caravantrade1_ambush" -/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/Initialize() - . = ..() - GLOB.jam_on_wardec += src - -/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/Destroy() - GLOB.jam_on_wardec -= src - return ..() - -/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/trade1 - name = "Small Freighter Navigation Computer" - desc = "Used to designate a precise transit location for the Small Freighter." - shuttleId = "caravantrade1" - lock_override = NONE - shuttlePortId = "caravantrade1_custom" - jumpto_ports = list("whiteship_away" = 1, "whiteship_home" = 1, "whiteship_z4" = 1, "caravantrade1_ambush" = 1) - view_range = 6.5 - x_offset = -5 - y_offset = -5 - designate_time = 100 - -/obj/machinery/computer/shuttle/caravan/pirate +/obj/machinery/computer/shuttle_flight/caravan/pirate name = "Pirate Cutter Shuttle Console" desc = "Used to control the Pirate Cutter." icon_screen = "syndishuttle" @@ -83,20 +63,7 @@ shuttleId = "caravanpirate" possible_destinations = "caravanpirate_custom;caravanpirate_ambush" -/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/pirate - name = "Pirate Cutter Navigation Computer" - desc = "Used to designate a precise transit location for the Pirate Cutter." - icon_screen = "syndishuttle" - icon_keyboard = "syndie_key" - shuttleId = "caravanpirate" - lock_override = NONE - shuttlePortId = "caravanpirate_custom" - jumpto_ports = list("caravanpirate_ambush" = 1) - view_range = 6.5 - x_offset = 3 - y_offset = -6 - -/obj/machinery/computer/shuttle/caravan/syndicate1 +/obj/machinery/computer/shuttle_flight/caravan/syndicate1 name = "Syndicate Fighter Shuttle Console" desc = "Used to control the Syndicate Fighter." icon_screen = "syndishuttle" @@ -107,20 +74,7 @@ shuttleId = "caravansyndicate1" possible_destinations = "caravansyndicate1_custom;caravansyndicate1_ambush;caravansyndicate1_listeningpost" -/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/syndicate1 - name = "Syndicate Fighter Navigation Computer" - desc = "Used to designate a precise transit location for the Syndicate Fighter." - icon_screen = "syndishuttle" - icon_keyboard = "syndie_key" - shuttleId = "caravansyndicate1" - lock_override = NONE - shuttlePortId = "caravansyndicate1_custom" - jumpto_ports = list("caravansyndicate1_ambush" = 1, "caravansyndicate1_listeningpost" = 1) - view_range = 0 - x_offset = 2 - y_offset = 0 - -/obj/machinery/computer/shuttle/caravan/syndicate2 +/obj/machinery/computer/shuttle_flight/caravan/syndicate2 name = "Syndicate Fighter Shuttle Console" desc = "Used to control the Syndicate Fighter." icon_screen = "syndishuttle" @@ -131,20 +85,7 @@ shuttleId = "caravansyndicate2" possible_destinations = "caravansyndicate2_custom;caravansyndicate2_ambush;caravansyndicate1_listeningpost" -/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/syndicate2 - name = "Syndicate Fighter Navigation Computer" - desc = "Used to designate a precise transit location for the Syndicate Fighter." - icon_screen = "syndishuttle" - icon_keyboard = "syndie_key" - shuttleId = "caravansyndicate2" - lock_override = NONE - shuttlePortId = "caravansyndicate2_custom" - jumpto_ports = list("caravansyndicate2_ambush" = 1, "caravansyndicate1_listeningpost" = 1) - view_range = 0 - x_offset = 0 - y_offset = 2 - -/obj/machinery/computer/shuttle/caravan/syndicate3 +/obj/machinery/computer/shuttle_flight/caravan/syndicate3 name = "Syndicate Drop Ship Console" desc = "Used to control the Syndicate Drop Ship." icon_screen = "syndishuttle" @@ -154,16 +95,3 @@ circuit = /obj/item/circuitboard/computer/caravan/syndicate3 shuttleId = "caravansyndicate3" possible_destinations = "caravansyndicate3_custom;caravansyndicate3_ambush;caravansyndicate3_listeningpost" - -/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/syndicate3 - name = "Syndicate Drop Ship Navigation Computer" - desc = "Used to designate a precise transit location for the Syndicate Drop Ship." - icon_screen = "syndishuttle" - icon_keyboard = "syndie_key" - shuttleId = "caravansyndicate3" - lock_override = NONE - shuttlePortId = "caravansyndicate3_custom" - jumpto_ports = list("caravansyndicate3_ambush" = 1, "caravansyndicate3_listeningpost" = 1) - view_range = 2.5 - x_offset = -1 - y_offset = -3 diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index 5e518dc822bd6..ef0751c266786 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -1,6 +1,7 @@ GLOBAL_VAR_INIT(hhStorageTurf, null) GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) +// Someone for the love of god kill whoever indented this with spaces /obj/item/hilbertshotel name = "Hilbert's Hotel" desc = "A sphere of what appears to be an intricate network of bluespace. Observing it in detail seems to give you a headache as you try to comprehend the infinite amount of infinitesimally distinct points on its surface." @@ -124,6 +125,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) currentArea.storageTurf = storageTurf currentArea.roomnumber = currentRoomnumber currentArea.reservation = currentReservation + currentArea.virtual_z_value = get_new_virtual_z() for(var/turf/closed/indestructible/hoteldoor/door in currentArea) door.parentSphere = src door.desc = "The door to this hotel room. The placard reads 'Room [currentRoomnumber]'. Strange, this door doesnt even seem openable. The doorknob, however, seems to buzz with unusual energy...
      Alt-Click to look through the peephole." @@ -283,7 +285,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) user.reset_perspective(parentSphere) user.set_machine(src) var/datum/action/peepholeCancel/PHC = new - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1) PHC.Grant(user) /turf/closed/indestructible/hoteldoor/check_eye(mob/user) @@ -309,15 +311,21 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) icon_state = "hilbertshotel" requires_power = FALSE has_gravity = TRUE - noteleport = TRUE - hidden = TRUE - unique = FALSE + teleport_restriction = TELEPORT_ALLOW_NONE + area_flags = HIDDEN_AREA dynamic_lighting = DYNAMIC_LIGHTING_FORCED - ambient_effects = list('sound/ambience/servicebell.ogg') + ambientsounds = list('sound/ambience/servicebell.ogg') var/roomnumber = 0 var/obj/item/hilbertshotel/parentSphere var/datum/turf_reservation/reservation var/turf/storageTurf + var/virtual_z_value + +/area/hilbertshotel/get_virtual_z(turf/T) + if(virtual_z_value) + return virtual_z_value + else + return ..(T) /area/hilbertshotel/Entered(atom/movable/AM) . = ..() @@ -386,9 +394,9 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) name = "Hilbert's Hotel Storage Room" icon_state = "hilbertshotel" requires_power = FALSE + area_flags = HIDDEN_AREA | UNIQUE_AREA has_gravity = TRUE - noteleport = TRUE - hidden = TRUE + teleport_restriction = TELEPORT_ALLOW_NONE /obj/item/abstracthotelstorage anchored = TRUE diff --git a/code/modules/ruins/spaceruin_code/whiteshipruin_box.dm b/code/modules/ruins/spaceruin_code/whiteshipruin_box.dm index b08d87233ff34..40facf4dbcf21 100644 --- a/code/modules/ruins/spaceruin_code/whiteshipruin_box.dm +++ b/code/modules/ruins/spaceruin_code/whiteshipruin_box.dm @@ -1,12 +1,8 @@ /////////// ruined whiteship /obj/item/circuitboard/computer/white_ship/ruin - build_path = /obj/machinery/computer/shuttle/white_ship/ruin + build_path = /obj/machinery/computer/shuttle_flight/white_ship/ruin -/obj/machinery/computer/shuttle/white_ship/ruin +/obj/machinery/computer/shuttle_flight/white_ship/ruin shuttleId = "whiteship_ruin" circuit = /obj/item/circuitboard/computer/white_ship/ruin - -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/ruin - shuttleId = "whiteship_ruin" - diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index a2e161b1904fa..2c40424b973a2 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -15,6 +15,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) power_channel = AREA_USAGE_ENVIRON req_access = list(ACCESS_KEYCARD_AUTH) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + layer = ABOVE_WINDOW_LAYER @@ -42,6 +43,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) if(!ui) ui = new(user, src, "KeycardAuth") ui.open() + ui.set_autoupdate(TRUE) /obj/machinery/keycard_auth/ui_data() var/list/data = list() @@ -122,19 +124,21 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) GLOBAL_VAR_INIT(emergency_access, FALSE) /proc/make_maint_all_access() - for(var/area/maintenance/A in world) - for(var/obj/machinery/door/airlock/D in A) - D.emergency = TRUE - D.update_icon(0) + for(var/area/maintenance/M as() in get_areas(/area/maintenance, SSmapping.levels_by_trait(ZTRAIT_STATION)[1])) + for(var/obj/machinery/door/airlock/A in M) + A.emergency = TRUE + A.update_icon() + A.wires.ui_update() minor_announce("Access restrictions on maintenance and external airlocks have been lifted.", "Attention! Station-wide emergency declared!",1) GLOB.emergency_access = TRUE SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency maintenance access", "enabled")) /proc/revoke_maint_all_access() - for(var/area/maintenance/A in world) - for(var/obj/machinery/door/airlock/D in A) - D.emergency = FALSE - D.update_icon(0) + for(var/area/maintenance/M as() in get_areas(/area/maintenance, SSmapping.levels_by_trait(ZTRAIT_STATION)[1])) + for(var/obj/machinery/door/airlock/A in M) + A.emergency = FALSE + A.update_icon() + A.wires.ui_update() minor_announce("Access restrictions in maintenance areas have been restored.", "Attention! Station-wide emergency rescinded:") GLOB.emergency_access = FALSE SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency maintenance access", "disabled")) diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm index 0a8e4073d82ab..82b011054a8a1 100644 --- a/code/modules/security_levels/security_levels.dm +++ b/code/modules/security_levels/security_levels.dm @@ -59,7 +59,7 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN) for(var/obj/machinery/firealarm/FA in GLOB.machines) if(is_station_level(FA.z)) FA.update_icon() - for(var/obj/machinery/computer/shuttle/pod/pod in GLOB.machines) + for(var/obj/machinery/computer/shuttle_flight/pod/pod in GLOB.machines) pod.admin_controlled = 0 if(SEC_LEVEL_DELTA) minor_announce(CONFIG_GET(string/alert_delta), "Attention! Delta security level reached!",1) @@ -72,12 +72,12 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN) for(var/obj/machinery/firealarm/FA in GLOB.machines) if(is_station_level(FA.z)) FA.update_icon() - for(var/obj/machinery/computer/shuttle/pod/pod in GLOB.machines) + for(var/obj/machinery/computer/shuttle_flight/pod/pod in GLOB.machines) pod.admin_controlled = 0 if(level >= SEC_LEVEL_RED) for(var/obj/machinery/door/D in GLOB.machines) if(D.red_alert_access) - D.visible_message("[D] whirrs as it automatically lifts access requirements!") + D.visible_message("[D] whirs 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()) SSnightshift.check_nightshift() diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm index 1258b9f4b8e15..cc4004884395e 100644 --- a/code/modules/shuttle/assault_pod.dm +++ b/code/modules/shuttle/assault_pod.dm @@ -54,9 +54,10 @@ landing_zone.height = height landing_zone.setDir(lz_dir) - for(var/obj/machinery/computer/shuttle/S in GLOB.machines) + for(var/obj/machinery/computer/shuttle_flight/S in GLOB.machines) if(S.shuttleId == shuttle_id) - S.possible_destinations = "[landing_zone.id]" + S.recall_docking_port_id = "[landing_zone.id]" + S.valid_docks = list("[landing_zone.id]") to_chat(user, "Landing zone set.") diff --git a/code/modules/shuttle/bluespace_shuttle_pod/pod_area.dm b/code/modules/shuttle/bluespace_shuttle_pod/pod_area.dm new file mode 100644 index 0000000000000..261c816e65e65 --- /dev/null +++ b/code/modules/shuttle/bluespace_shuttle_pod/pod_area.dm @@ -0,0 +1,2 @@ +/area/shuttle/pod_shuttle + requires_power = TRUE diff --git a/code/modules/shuttle/bluespace_shuttle_pod/pod_computer.dm b/code/modules/shuttle/bluespace_shuttle_pod/pod_computer.dm new file mode 100644 index 0000000000000..649c04d622b67 --- /dev/null +++ b/code/modules/shuttle/bluespace_shuttle_pod/pod_computer.dm @@ -0,0 +1,31 @@ +/obj/machinery/computer/shuttle_flight/custom_shuttle/bluespace_pod + //Uses a standard custom shuttle circuit. + circuit = /obj/item/circuitboard/computer/shuttle/flight_control + var/shuttle_named = FALSE + +/obj/machinery/computer/shuttle_flight/custom_shuttle/bluespace_pod/Initialize(mapload, obj/item/circuitboard/C) + . = ..() + var/static/pod_shuttles = 0 + var/area/area_instance = get_area(src) + var/obj/docking_port/mobile/port = locate(/obj/docking_port/mobile) in area_instance + pod_shuttles ++ + port.id = "podshuttle_[pod_shuttles]" + shuttleId = "podshuttle_[pod_shuttles]" + //Create a shuttle designator with the port + var/obj/item/shuttle_creator/shuttle_creator = new(loc) + shuttle_creator.linkedShuttleId = "podshuttle_[pod_shuttles]" + +/obj/machinery/computer/shuttle_flight/custom_shuttle/bluespace_pod/ui_interact(mob/user, datum/tgui/ui) + if(!shuttle_named) + var/area/area_instance = get_area(src) + var/obj/docking_port/mobile/port = locate(/obj/docking_port/mobile) in area_instance + if(port) + port.name = stripped_input(user, "Shuttle Name:", "Blueprint Editing", "", MAX_NAME_LEN) + if(!port.name) + port.name = "Unnamed shuttle" + shuttle_named = TRUE + . = ..() + +/obj/machinery/computer/shuttle_flight/custom_shuttle/bluespace_pod/traitor + icon_screen = "syndishuttle" + icon_keyboard = "syndie_key" diff --git a/code/modules/shuttle/bluespace_shuttle_pod/shuttle_capsule.dm b/code/modules/shuttle/bluespace_shuttle_pod/shuttle_capsule.dm new file mode 100644 index 0000000000000..fd18bd1573de6 --- /dev/null +++ b/code/modules/shuttle/bluespace_shuttle_pod/shuttle_capsule.dm @@ -0,0 +1,91 @@ +/obj/item/survivalcapsule/shuttle + name = "bluespace shuttle capsule" + desc = "An entire shuttle stored within a pocket of bluespace." + var/datum/map_template/shuttle/shuttle_template + //Static + //Subtypes that change this will have to redefine these. + var/static/list/blacklisted_turfs + var/static/list/whitelisted_turfs + var/static/list/whitelisted_areas + +/obj/item/survivalcapsule/shuttle/Initialize() + . = ..() + if(!blacklisted_turfs) + whitelisted_areas = typecacheof(list( + /area/space, + /area/lavaland + )) + whitelisted_turfs = typecacheof(list( + /turf/open/space, + /turf/open/floor/plating/asteroid/basalt/lava_land_surface + )) + blacklisted_turfs = typecacheof(list( + /turf/open/space/bluespace, + /turf/open/space/transit + )) + +/obj/item/survivalcapsule/shuttle/get_template() + if(shuttle_template) + return + shuttle_template = SSmapping.shuttle_templates[template_id] + if(!shuttle_template) + WARNING("Shuttle template ([template_id]) not found!") + qdel(src) + +/obj/item/survivalcapsule/shuttle/Destroy() + shuttle_template = null + . = ..() + +/obj/item/survivalcapsule/shuttle/examine(mob/user) + . = ..() + get_template() + . += "This capsule has the [shuttle_template.name] stored." + . += shuttle_template.description + +/obj/item/survivalcapsule/shuttle/attack_self() + //Can't grab when capsule is New() because templates aren't loaded then + get_template() + if(!used) + loc.visible_message("\The [src] begins to shake. Stand back!") + used = TRUE + sleep(50) + var/turf/deploy_location = get_turf(src) + var/status = check_deploy(deploy_location) + switch(status) + if(SHELTER_DEPLOY_BAD_AREA) + src.loc.visible_message("\The [src] will not function in this area.") + if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS) + var/width = shuttle_template.width + var/height = shuttle_template.height + src.loc.visible_message("\The [src] doesn't have room to deploy! You need to clear a [width]x[height] area!") + + if(status != SHELTER_DEPLOY_ALLOWED) + used = FALSE + return + + playsound(src, 'sound/effects/phasein.ogg', 100, 1) + + var/turf/T = deploy_location + if(!is_mining_level(T.z)) //only report capsules away from the mining/lavaland level + message_admins("[ADMIN_LOOKUPFLW(usr)] activated a bluespace capsule away from the mining level! [ADMIN_VERBOSEJMP(T)]") + log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [AREACOORD(T)]") + shuttle_template.load(deploy_location, centered = TRUE) + new /obj/effect/particle_effect/smoke(get_turf(src)) + qdel(src) + +/obj/item/survivalcapsule/shuttle/proc/check_deploy(turf/deploy_location) + var/affected = shuttle_template.get_affected_turfs(deploy_location, centered=TRUE) + for(var/turf/T in affected) + var/area/A = get_area(T) + if(!is_type_in_typecache(A, whitelisted_areas)) + return SHELTER_DEPLOY_BAD_AREA + + var/banned = is_type_in_typecache(T, blacklisted_turfs) + var/permitted = is_type_in_typecache(T, whitelisted_turfs) + if(banned && !permitted) + return SHELTER_DEPLOY_BAD_TURFS + + for(var/obj/O in T) + if((O.density && O.anchored)) + return SHELTER_DEPLOY_ANCHORED_OBJECTS + return SHELTER_DEPLOY_ALLOWED diff --git a/code/modules/shuttle/bluespace_shuttle_pod/traitor_shuttle.dm b/code/modules/shuttle/bluespace_shuttle_pod/traitor_shuttle.dm new file mode 100644 index 0000000000000..56be3d12269f3 --- /dev/null +++ b/code/modules/shuttle/bluespace_shuttle_pod/traitor_shuttle.dm @@ -0,0 +1,8 @@ +/obj/item/survivalcapsule/shuttle/traitor + template_id = "capsule_traitor" + +/datum/map_template/shuttle/capsule + port_id = "capsule" + +/datum/map_template/shuttle/capsule/traitor + suffix = "traitor" diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm deleted file mode 100644 index 140b8b9a1df37..0000000000000 --- a/code/modules/shuttle/computer.dm +++ /dev/null @@ -1,84 +0,0 @@ -/obj/machinery/computer/shuttle - name = "shuttle console" - desc = "A shuttle control computer." - icon_screen = "shuttle" - icon_keyboard = "tech_key" - light_color = LIGHT_COLOR_CYAN - req_access = list( ) - var/shuttleId - var/possible_destinations = "" - var/admin_controlled - var/no_destination_swap = 0 - -/obj/machinery/computer/shuttle/ui_interact(mob/user) - //Ash walkers cannot use the console because they are unga bungas - if(user.mind?.has_antag_datum(/datum/antagonist/ashwalker)) - to_chat(user, "This computer has been designed to keep the natives like you from meddling with it, you have no hope of using it.") - return - . = ..() - var/list/options = params2list(possible_destinations) - var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) - var/dat = "Status: [M ? M.getStatusText() : "*Missing*"]

      " - if(M) - 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 - destination_found = 1 - dat += "Send to [S.name]
      " - if(!destination_found) - dat += "Shuttle Locked
      " - if(admin_controlled) - dat += "Authorized personnel only
      " - dat += "Request Authorization
      " - dat += "Close" - - var/datum/browser/popup = new(user, "computer", M ? M.name : "shuttle", 300, 200) - popup.set_content("
      [dat]
      ") - popup.open() - -/obj/machinery/computer/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["move"]) - var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) - if(M.launch_status == ENDGAME_LAUNCHED) - to_chat(usr, "You've already escaped. Never going back to that place again!") - return - if(no_destination_swap) - if(M.mode == SHUTTLE_RECHARGING) - to_chat(usr, "Shuttle engines are not ready for use.") - return - if(M.mode != SHUTTLE_IDLE) - to_chat(usr, "Shuttle already in transit.") - return - if(!(href_list["move"] in params2list(possible_destinations))) - log_admin("[usr] attempted to forge a target location through a href exploit on [src]") - message_admins("[ADMIN_FULLMONTY(usr)] attempted to forge a target location through a href exploit on [src]") - return - switch(SSshuttle.moveShuttle(shuttleId, href_list["move"], 1)) - if(0) - say("Shuttle departing. Please stand away from the doors.") - if(1) - to_chat(usr, "Invalid shuttle requested.") - else - to_chat(usr, "Unable to comply.") - -/obj/machinery/computer/shuttle/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - req_access = list() - obj_flags |= EMAGGED - to_chat(user, "You fried the consoles ID checking system.") - -/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 diff --git a/code/modules/shuttle/custom_shuttle.dm b/code/modules/shuttle/custom_shuttle.dm index c564b88202774..514b967aeb1bb 100644 --- a/code/modules/shuttle/custom_shuttle.dm +++ b/code/modules/shuttle/custom_shuttle.dm @@ -1,8 +1,4 @@ -#define Z_DIST 500 -#define CUSTOM_ENGINES_START_TIME 65 -#define CALCULATE_STATS_COOLDOWN 2 - -/obj/machinery/computer/custom_shuttle +/obj/machinery/computer/shuttle_flight/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 @@ -10,262 +6,164 @@ 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 + possible_destinations = "whiteship_home" + + var/list/obj/machinery/shuttle/engine/shuttle_engines = list() var/calculated_mass = 0 var/calculated_dforce = 0 - var/calculated_speed = 0 + var/calculated_acceleration = 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)) +/obj/machinery/computer/shuttle_flight/custom_shuttle/ui_static_data(mob/user) + var/list/data = ..() + calculateStats() + data["display_fuel"] = TRUE + return data + +/obj/machinery/computer/shuttle_flight/custom_shuttle/ui_data(mob/user) + var/list/data = ..() + data["fuel"] = get_fuel() + data["display_stats"] = list( + "Shuttle Mass" = "[calculated_mass/10] Tons", + "Engine Force" = "[calculated_dforce]kN ([calculated_engine_count] engines)", + "Supercruise Acceleration" = "[calculated_acceleration] ms^-2", + "Fuel Consumption" = "[calculated_consumption] moles per second", + "Engine Cooldown" = "[calculated_cooldown] seconds" + ) + if(calculated_acceleration < 1) + data["thrust_alert"] = "Insufficient engine power at last callibration. Launch shuttle to recalculate thrust." + else + data["thrust_alert"] = 0 + if(calculated_non_operational_thrusters > 0) + data["damage_alert"] = "[calculated_non_operational_thrusters] thrusters offline." + else + data["thrust_alert"] = 0 + return data + +/obj/machinery/computer/shuttle_flight/custom_shuttle/launch_shuttle() + calculateStats() + if(calculated_acceleration < 1) + say("Insufficient engine power to engage supercruise.") + return + var/datum/orbital_object/shuttle/custom_shuttle/shuttle = ..() + if(shuttle) + shuttle.attached_console = src + return shuttle + +//Consumes fuel and reduces thrust of engines that run out of fuel +/obj/machinery/computer/shuttle_flight/custom_shuttle/proc/consume_fuel(var/multiplier = 1) + //Reset stats + calculated_dforce = 0 + calculated_acceleration = 0 + calculated_engine_count = 0 + calculated_consumption = 0 + //Consume fuel + for(var/obj/machinery/shuttle/engine/E as() in shuttle_engines) + var/valid_thruster = FALSE + //Void thrusters don't need heaters + if(E.needs_heater) + //Check for inop engines + if(!E.attached_heater) continue - if(!M.check_dock(S, silent=TRUE)) + var/obj/machinery/atmospherics/components/unary/shuttle/heater/shuttle_heater = E.attached_heater.resolve() + if(!shuttle_heater) 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.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 + if(shuttle_heater.dir != E.dir) + continue + if(shuttle_heater.panel_open) + continue + if(!shuttle_heater.anchored) + continue + //Setup correct, check fuel. + if(shuttle_heater.hasFuel(E.fuel_use * multiplier / shuttle_heater.efficiency_multiplier)) + shuttle_heater.consumeFuel(E.fuel_use * multiplier / shuttle_heater.efficiency_multiplier) + valid_thruster = TRUE + else + valid_thruster = TRUE + if(valid_thruster) + calculated_consumption += E.fuel_use + calculated_dforce += E.thrust + calculated_engine_count ++ + calculated_acceleration = (calculated_dforce*1000) / (calculated_mass*100) + +/obj/machinery/computer/shuttle_flight/custom_shuttle/proc/check_stranded() + if(!calculated_engine_count && shuttleObject) + say("Fuel reserves depleted, dropping out of supercruise.") + if(!shuttleObject.docking_target) + if(shuttleObject.can_dock_with) + shuttleObject.commence_docking(shuttleObject.can_dock_with, TRUE) + else + //Send shuttle object to random location + var/datum/orbital_object/z_linked/beacon/z_linked = new /datum/orbital_object/z_linked/beacon/ruin/stranded_shuttle(new /datum/orbital_vector(shuttleObject.position.x, shuttleObject.position.y)) + z_linked.name = "Stranded [shuttleObject]" + if(!z_linked) + say("Failed to dethrottle shuttle, please contact a Nanotrasen supervisor.") + return + shuttleObject.commence_docking(z_linked, TRUE) + shuttleObject.docking_frozen = TRUE + //Dock + if(!random_drop()) + say("Failed to drop at a random location. Please select a location.") + shuttleObject.docking_frozen = FALSE + return TRUE + return FALSE + +/obj/machinery/computer/shuttle_flight/custom_shuttle/proc/get_fuel() + var/amount = 0 + for(var/obj/machinery/shuttle/engine/E as() in shuttle_engines) + var/obj/machinery/atmospherics/components/unary/shuttle/heater/shuttle_heater = E.attached_heater?.resolve() + if(!shuttle_heater) + continue + var/datum/gas_mixture/air_contents = shuttle_heater.airs[1] + var/moles = air_contents.total_moles() + amount += moles + return amount -/obj/machinery/computer/custom_shuttle/proc/linkShuttle(var/new_id) +/obj/machinery/computer/shuttle_flight/custom_shuttle/proc/linkShuttle(var/new_id) shuttleId = new_id - possible_destinations = "whiteship_home;shuttle[new_id]_custom" + shuttlePortId = "[shuttleId]_custom_dock" -/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 +/obj/machinery/computer/shuttle_flight/custom_shuttle/proc/calculateStats(var/useFuel = FALSE) 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_acceleration = 0 calculated_engine_count = 0 calculated_consumption = 0 calculated_cooldown = 0 calculated_fuel_less_thrusters = 0 calculated_non_operational_thrusters = 0 + shuttle_engines = list() //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) + for(var/turf/T in shuttleArea) + calculated_mass += 1 + for(var/obj/machinery/shuttle/engine/E in GLOB.custom_shuttle_machines) + if(!(get_area(E) in areas)) + continue + E.check_setup() + if(!E.thruster_active) //Skipover thrusters with no valid heater + calculated_non_operational_thrusters ++ + continue + calculated_engine_count++ + calculated_dforce += E.thrust + calculated_consumption += E.fuel_use + calculated_cooldown = max(calculated_cooldown, E.cooldown) + shuttle_engines += E //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) + calculated_acceleration = (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 forge a target location through a href exploit on [src]") - message_admins("[ADMIN_FULLMONTY(usr)] attempted to forge a target location through a href exploit on [src]") - 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 - 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) +/obj/machinery/computer/shuttle_flight/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(new_id) - shuttleId = new_id - shuttlePortId = "shuttle[new_id]_custom" - - //Take info from connected port and calculate amendments - var/obj/docking_port/mobile/M = SSshuttle.getShuttle(new_id) - var/list/shuttlebounds = M.return_coords() - view_range = min(round(max(M.width, M.height)*0.5), 15) - x_offset = round((shuttlebounds[1] + shuttlebounds[3])*0.5) - M.x - y_offset = round((shuttlebounds[2] + shuttlebounds[4])*0.5) - M.y diff --git a/code/modules/shuttle/docking.dm b/code/modules/shuttle/docking.dm index 2e572819aa8c7..956ac4e503c22 100644 --- a/code/modules/shuttle/docking.dm +++ b/code/modules/shuttle/docking.dm @@ -203,3 +203,11 @@ continue var/turf/oldT = moved_atoms[moved_object] moved_object.lateShuttleMove(oldT, movement_force, movement_direction) + +/obj/docking_port/mobile/proc/reset_air() + var/list/turfs = return_ordered_turfs(x, y, z, dir) + for(var/i in 1 to length(turfs)) + var/turf/open/T = turfs[i] + if(istype(T)) + T.air.copy_from_turf(T) + \ No newline at end of file diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 0acc6a438c730..05c22c7353cf1 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -2,35 +2,65 @@ #define ENGINES_START_TIME 100 #define ENGINES_STARTED (SSshuttle.emergency.mode == SHUTTLE_IGNITING) #define IS_DOCKED (SSshuttle.emergency.mode == SHUTTLE_DOCKED || (ENGINES_STARTED)) +#define SHUTTLE_CONSOLE_ACTION_DELAY (5 SECONDS) + +#define NOT_BEGUN 0 +#define STAGE_1 1 +#define STAGE_2 2 +#define STAGE_3 3 +#define STAGE_4 4 +#define HIJACKED 5 /obj/machinery/computer/emergency_shuttle name = "emergency shuttle console" desc = "For shuttle control." icon_screen = "shuttle" icon_keyboard = "tech_key" + resistance_flags = INDESTRUCTIBLE var/auth_need = 3 var/list/authorized = list() + var/list/acted_recently = list() + var/hijack_last_stage_increase = 0 SECONDS + var/hijack_stage_time = 5 SECONDS + var/hijack_stage_cooldown = 5 SECONDS + var/hijack_flight_time_increase = 30 SECONDS + var/hijack_completion_flight_time_set = 10 SECONDS //How long in deciseconds to set shuttle's timer after hijack is done. + var/hijack_hacking = FALSE + var/hijack_announce = TRUE + +/obj/machinery/computer/emergency_shuttle/examine(mob/user) + . = ..() + if(hijack_announce) + . += "Security systems present on console. Any unauthorized tampering will result in an emergency announcement." + if(user?.mind?.get_hijack_speed()) + . += "Alt click on this to attempt to hijack the shuttle. This will take multiple tries (current: stage [SSshuttle.emergency.hijack_status]/[HIJACKED])." + . += "It will take you [(hijack_stage_time * user.mind.get_hijack_speed()) / 10] seconds to reprogram a stage of the shuttle's navigational firmware, and the console will undergo automated timed lockout for [hijack_stage_cooldown/10] seconds after each stage." + if(hijack_announce) + . += "It is probably best to fortify your position as to be uninterrupted during the attempt, given the automatic announcements.." /obj/machinery/computer/emergency_shuttle/attackby(obj/item/I, mob/user,params) if(istype(I, /obj/item/card/id)) say("Please equip your ID card into your ID slot to authenticate.") . = ..() +/obj/machinery/computer/emergency_shuttle/attack_alien(mob/living/carbon/alien/humanoid/royal/queen/user) + if(istype(user)) + SSshuttle.clearHostileEnvironment(user) /obj/machinery/computer/emergency_shuttle/ui_state(mob/user) return GLOB.human_adjacent_state /obj/machinery/computer/emergency_shuttle/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "EmergencyShuttleConsole") ui.open() + ui.set_autoupdate(TRUE) -/obj/machinery/computer/emergency_shuttle/ui_data() +/obj/machinery/computer/emergency_shuttle/ui_data(user) var/list/data = list() data["timer_str"] = SSshuttle.emergency.getTimerStr() @@ -48,7 +78,7 @@ A += list(list("name" = name, "job" = job)) data["authorizations"] = A - data["enabled"] = (IS_DOCKED && !ENGINES_STARTED) + data["enabled"] = (IS_DOCKED && !ENGINES_STARTED) && !(user in acted_recently) data["emagged"] = obj_flags & EMAGGED ? 1 : 0 return data @@ -73,19 +103,29 @@ to_chat(user, "The access level of your card is not high enough.") return + if(user in acted_recently) + return + var/old_len = authorized.len + addtimer(CALLBACK(src, .proc/clear_recent_action, user), SHUTTLE_CONSOLE_ACTION_DELAY) switch(action) if("authorize") . = authorize(user) if("repeal") + if(!(ID in authorized)) + return //cannot retract auth if never given originally authorized -= ID + message_admins("[ADMIN_LOOKUPFLW(user)] has deauthorized early shuttle launch, now [authorized.len] of [auth_need] needed") + log_game("[key_name(user)] has deauthorized early shuttle launch in [COORD(src)], now [authorized.len] of [auth_need] needed.") if("abort") if(authorized.len) // Abort. The action for when heads are fighting over whether // to launch early. + message_admins("[ADMIN_LOOKUPFLW(user)] has revoked early shuttle launch.") + log_game("[key_name(user)] has revoked early shuttle launch in [COORD(src)].") authorized.Cut() . = TRUE @@ -97,6 +137,8 @@ minor_announce("[remaining] authorizations needed until shuttle is launched early.", null, alert) if(repeal) minor_announce("Early launch authorization revoked, [remaining] authorizations needed.") + log_game("Early launch authorization revoked, [remaining] authorizations needed.") + acted_recently += user /obj/machinery/computer/emergency_shuttle/proc/authorize(mob/user, source) var/obj/item/card/id/ID = user.get_idcard(TRUE) @@ -110,11 +152,14 @@ authorized += ID - message_admins("[ADMIN_LOOKUPFLW(user)] has authorized early shuttle launch.") - log_game("[key_name(user)] has authorized early shuttle launch in [COORD(src)].") + message_admins("[ADMIN_LOOKUPFLW(user)] has authorized early shuttle launch, [authorized.len] of [auth_need] needed.") + log_game("[key_name(user)] has authorized early shuttle launch in [COORD(src)], [authorized.len] of [auth_need] needed..") // Now check if we're on our way . = TRUE - process() + process(SSMACHINES_DT) + +/obj/machinery/computer/emergency_shuttle/proc/clear_recent_action(mob/user) + acted_recently -= user /obj/machinery/computer/emergency_shuttle/process() // Launch check is in process in case auth_need changes for some reason @@ -139,6 +184,76 @@ [TIME_LEFT] seconds", system_error, alert=TRUE) . = TRUE +/obj/machinery/computer/emergency_shuttle/proc/increase_hijack_stage() + var/obj/docking_port/mobile/emergency/shuttle = SSshuttle.emergency + shuttle.hijack_status++ + if(hijack_announce) + announce_hijack_stage() + hijack_last_stage_increase = world.time + say("Navigational protocol error! Rebooting systems.") + if(shuttle.mode == SHUTTLE_ESCAPE) + if(shuttle.hijack_status == HIJACKED) + shuttle.setTimer(hijack_completion_flight_time_set) + else + shuttle.setTimer(shuttle.timeLeft(1) + hijack_flight_time_increase) //give the guy more time to hijack if it's already in flight. + return shuttle.hijack_status + +/obj/machinery/computer/emergency_shuttle/AltClick(user) + if(isliving(user)) + attempt_hijack_stage(user) + +/obj/machinery/computer/emergency_shuttle/proc/attempt_hijack_stage(mob/living/user) + if(!user.CanReach(src)) + return + if(!user?.mind?.get_hijack_speed()) + to_chat(user, "You manage to open a user-mode shell on [src], and hundreds of lines of debugging output fly through your vision. It is probably best to leave this alone.The flight plans for the shuttle haven't been loaded yet, you can't hack this right now.= HIJACKED) + to_chat(user, "The emergency shuttle is already loaded with a corrupt navigational payload. What more do you want from it?") + return + if(hijack_last_stage_increase >= world.time + hijack_stage_cooldown) + say("Error - Catastrophic software error detected. Input is currently on timeout.") + return + hijack_hacking = TRUE + to_chat(user, "You [SSshuttle.emergency.hijack_status == NOT_BEGUN? "begin" : "continue"] to override [src]'s navigational protocols.") + say("Software override initiated.") + var/turf/console_hijack_turf = get_turf(src) + message_admins("[src] is being overriden for hijack by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(console_hijack_turf)]") + log_game("[src] is being overriden for hijack by [key_name(user)] at [AREACOORD(src)]") + . = FALSE + if(do_after(user, hijack_stage_time * (1 / user.mind.get_hijack_speed()), target = src)) + increase_hijack_stage() + console_hijack_turf = get_turf(src) + message_admins("[src] has had its hijack stage increased to stage [SSshuttle.emergency.hijack_status] out of [HIJACKED] by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(console_hijack_turf)]") + log_game("[src] has had its hijack stage increased to stage [SSshuttle.emergency.hijack_status] out of [HIJACKED] by [key_name(user)] at [AREACOORD(src)]") + . = TRUE + to_chat(user, "You reprogram some of [src]'s programming, putting it on timeout for [hijack_stage_cooldown/10] seconds.") + hijack_hacking = FALSE + +/obj/machinery/computer/emergency_shuttle/proc/announce_hijack_stage() + var/msg + switch(SSshuttle.emergency.hijack_status) + if(NOT_BEGUN) + return + if(STAGE_1) + msg = "AUTHENTICATING - FAIL. AUTHENTICATING - FAIL. AUTHENTICATING - FAI###### Welcome, technician JOHN DOE." + if(STAGE_2) + msg = "Warning: Navigational route fails \"IS_AUTHORIZED\". Please try againNN[scramble_message_replace_chars("againagainagainagainagain", 70)]." + if(STAGE_3) + msg = "CRC mismatch at ~h~ in calculated route buffer. Full reset initiated of FTL_NAVIGATION_SERVICES. Memory decrypted for automatic repair." + if(STAGE_4) + msg = "~ACS_directive module_load(cyberdyne.exploit.nanotrasen.shuttlenav)... NT key mismatch. Confirm load? Y...###Reboot complete. $SET transponder_state = 0; System link initiated with connected engines..." + if(HIJACKED) + msg = "SYSTEM OVERRIDE - Resetting course to \[[scramble_message_replace_chars("###########", 100)]\] \ + ([scramble_message_replace_chars("#######", 100)]/[scramble_message_replace_chars("#######", 100)]/[scramble_message_replace_chars("#######", 100)]) \ + {AUTH - ROOT (uid: 0)}.
      [SSshuttle.emergency.mode == SHUTTLE_ESCAPE ? "Diverting from existing route - Bluespace exit in [hijack_completion_flight_time_set/10] seconds." : ""]" + minor_announce(scramble_message_replace_chars(msg, replaceprob = 10), "Emergency Shuttle", TRUE) + /obj/machinery/computer/emergency_shuttle/emag_act(mob/user) // How did you even get on the shuttle before it go to the station? if(!IS_DOCKED) @@ -165,7 +280,7 @@ authorized += ID - process() + process(SSMACHINES_DT) /obj/machinery/computer/emergency_shuttle/Destroy() // Our fake IDs that the emag generated are just there for colour @@ -189,6 +304,7 @@ dir = EAST port_direction = WEST var/sound_played = 0 //If the launch sound has been sent to all players on the shuttle itself + var/hijack_status = NOT_BEGUN /obj/docking_port/mobile/emergency/canDock(obj/docking_port/stationary/S) return SHUTTLE_CAN_DOCK //If the emergency shuttle can't move, the whole game breaks, so it will force itself to land even if it has to crush a few departments in the process @@ -233,7 +349,7 @@ else SSshuttle.emergencyLastCallLoc = null - priority_announce("The emergency shuttle has been called. [redAlert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][SSshuttle.emergencyLastCallLoc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]", null, 'sound/ai/shuttlecalled.ogg', "Priority") + priority_announce("The emergency shuttle has been called. [redAlert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][SSshuttle.emergencyLastCallLoc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ][SSshuttle.adminEmergencyNoRecall ? "\n\nWarning: Shuttle recall subroutines disabled; Recall not possible." : ""]", null, ANNOUNCER_SHUTTLECALLED, "Priority") /obj/docking_port/mobile/emergency/cancel(area/signalOrigin) if(mode != SHUTTLE_CALL) @@ -248,11 +364,21 @@ SSshuttle.emergencyLastCallLoc = signalOrigin else SSshuttle.emergencyLastCallLoc = null - priority_announce("The emergency shuttle has been recalled.[SSshuttle.emergencyLastCallLoc ? " Recall signal traced. Results can be viewed on any communications console." : "" ]", null, 'sound/ai/shuttlerecalled.ogg', "Priority") - -/obj/docking_port/mobile/emergency/proc/is_hijacked() + priority_announce("The emergency shuttle has been recalled.[SSshuttle.emergencyLastCallLoc ? " Recall signal traced. Results can be viewed on any communications console." : "" ]", null, ANNOUNCER_SHUTTLERECALLED, "Priority") + +/** + * Proc that handles checking if the emergency shuttle was successfully hijacked via being the only people present on the shuttle for the elimination hijack or highlander objective + * + * Checks for all mobs on the shuttle, checks their status, and checks if they're + * borgs or simple animals. Depending on the args, certain mobs may be ignored, + * and the presence of other antags may or may not invalidate a hijack. + * Args: + * filter_by_human, default TRUE, tells the proc that only humans should block a hijack. Borgs and animals are ignored and will not block if this is TRUE. + * solo_hijack, default FALSE, tells the proc to fail with multiple hijackers, such as for Highlander mode. + */ +/obj/docking_port/mobile/emergency/proc/elimination_hijack(filter_by_human = TRUE, solo_hijack = FALSE) var/has_people = FALSE - var/hijacker_present = FALSE + var/hijacker_count = 0 for(var/mob/living/player in GLOB.player_list) if(player.mind) if(player.stat != DEAD) @@ -271,17 +397,17 @@ //Antag present, doesn't stop but let's see if we actually want to hijack var/prevent = FALSE for(var/datum/antagonist/A in player.mind.antag_datums) - if(A.can_hijack == HIJACK_HIJACKER) - hijacker_present = TRUE + if(A.can_elimination_hijack == ELIMINATION_ENABLED) + hijacker_count += 1 prevent = FALSE break //If we have both prevent and hijacker antags assume we want to hijack. - else if(A.can_hijack == HIJACK_PREVENT) + else if(A.can_elimination_hijack == ELIMINATION_PREVENT) prevent = TRUE if(prevent) return FALSE - return has_people && hijacker_present + return has_people && ((hijacker_count == 1) || (hijacker_count && !solo_hijack)) /obj/docking_port/mobile/emergency/proc/is_hijacked_by_xenos() var/has_xenos = FALSE @@ -300,6 +426,9 @@ return has_xenos +/obj/docking_port/mobile/emergency/proc/is_hijacked() + return hijack_status == HIJACKED + /obj/docking_port/mobile/emergency/proc/ShuttleDBStuff() set waitfor = FALSE if(!SSdbcore.Connect()) @@ -338,8 +467,8 @@ return mode = SHUTTLE_DOCKED setTimer(SSshuttle.emergencyDockTime) - send2irc("Server", "The Emergency Shuttle has docked with the station.") - priority_announce("The Emergency Shuttle has docked with the station. You have [timeLeft(600)] minutes to board the Emergency Shuttle.", null, 'sound/ai/shuttledock.ogg', "Priority") + send2tgs("Server", "The Emergency Shuttle has docked with the station.") + priority_announce("[SSshuttle.emergency] has docked with the station. You have [timeLeft(600)] minutes to board the Emergency Shuttle.", null, ANNOUNCER_SHUTTLEDOCK, "Priority") ShuttleDBStuff() @@ -430,7 +559,7 @@ // now move the actual emergency shuttle to centcom // unless the shuttle is "hijacked" var/destination_dock = "emergency_away" - if(is_hijacked()) + if(is_hijacked() || elimination_hijack()) destination_dock = "emergency_syndicate" minor_announce("Corruption detected in \ shuttle navigation protocols. Please contact your \ @@ -447,7 +576,7 @@ mode = SHUTTLE_ESCAPE launch_status = ENDGAME_LAUNCHED setTimer(SSshuttle.emergencyEscapeTime) - priority_announce("The Emergency Shuttle preparing for direct jump. ETA: [timeLeft(600)] minutes until the shuttle docks at Central Command.", null, null, "Priority") + priority_announce("The Emergency Shuttle is preparing for direct jump. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.", null, SSstation.announcer.get_rand_alert_sound(), "Priority") /obj/docking_port/mobile/pod @@ -459,8 +588,8 @@ launch_status = UNLAUNCHED /obj/docking_port/mobile/pod/request(obj/docking_port/stationary/S) - var/obj/machinery/computer/shuttle/C = getControlConsole() - if(!istype(C, /obj/machinery/computer/shuttle/pod)) + var/obj/machinery/computer/shuttle_flight/C = getControlConsole() + if(!istype(C, /obj/machinery/computer/shuttle_flight/pod)) return ..() if(GLOB.security_level >= SEC_LEVEL_RED || (C && (C.obj_flags & EMAGGED))) if(launch_status == UNLAUNCHED) @@ -473,9 +602,11 @@ /obj/docking_port/mobile/pod/cancel() return -/obj/machinery/computer/shuttle/pod +/obj/machinery/computer/shuttle_flight/pod name = "pod control computer" admin_controlled = 1 + recall_docking_port_id = "null" + request_shuttle_message = "Override Escape" possible_destinations = "pod_asteroid" icon = 'icons/obj/terminals.dmi' icon_state = "dorm_available" @@ -483,19 +614,19 @@ density = FALSE clockwork = TRUE //it'd look weird -/obj/machinery/computer/shuttle/pod/update_icon() +/obj/machinery/computer/shuttle_flight/pod/update_icon() return -/obj/machinery/computer/shuttle/pod/emag_act(mob/user) +/obj/machinery/computer/shuttle_flight/pod/emag_act(mob/user) if(obj_flags & EMAGGED) return obj_flags |= EMAGGED to_chat(user, "You fry the pod's alert level monitoring system.") -/obj/machinery/computer/shuttle/pod/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) +/obj/machinery/computer/shuttle_flight/pod/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) . = ..() - if(possible_destinations == initial(possible_destinations) || override) - possible_destinations = "pod_lavaland[idnum]" + if(recall_docking_port_id == initial(recall_docking_port_id) || override) + recall_docking_port_id = "pod_lavaland[idnum]" /obj/docking_port/stationary/random name = "escape pod" @@ -558,8 +689,8 @@ new /obj/item/clothing/head/helmet/space/orange(src) new /obj/item/clothing/suit/space/orange(src) new /obj/item/clothing/suit/space/orange(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/mask/gas/old(src) //emergency means older models + new /obj/item/clothing/mask/gas/old(src) new /obj/item/tank/internals/oxygen/red(src) new /obj/item/tank/internals/oxygen/red(src) new /obj/item/pickaxe/emergency(src) @@ -583,7 +714,6 @@ /obj/item/storage/pod/AltClick(mob/user) if(!can_interact(user)) return - ..() /obj/item/storage/pod/can_interact(mob/user) if(!..()) @@ -610,6 +740,11 @@ SSshuttle.emergency = current_emergency SSshuttle.backup_shuttle = src +/obj/docking_port/mobile/emergency/backup/Destroy(force) + if(SSshuttle.backup_shuttle == src) + SSshuttle.backup_shuttle = null + return ..() + /obj/docking_port/mobile/emergency/shuttle_build/register() . = ..() initiate_docking(SSshuttle.getDock("emergency_home")) @@ -618,3 +753,11 @@ #undef ENGINES_START_TIME #undef ENGINES_STARTED #undef IS_DOCKED +#undef SHUTTLE_CONSOLE_ACTION_DELAY + +#undef NOT_BEGUN +#undef STAGE_1 +#undef STAGE_2 +#undef STAGE_3 +#undef STAGE_4 +#undef HIJACKED diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm index f7e3bda44d111..cc12923005937 100644 --- a/code/modules/shuttle/ferry.dm +++ b/code/modules/shuttle/ferry.dm @@ -1,4 +1,4 @@ -/obj/machinery/computer/shuttle/ferry +/obj/machinery/computer/shuttle_flight/ferry name = "transport ferry console" desc = "A console that controls the transport ferry." circuit = /obj/item/circuitboard/computer/ferry @@ -9,19 +9,19 @@ var/allow_silicons = FALSE var/allow_emag = FALSE -/obj/machinery/computer/shuttle/ferry/emag_act(mob/user) +/obj/machinery/computer/shuttle_flight/ferry/emag_act(mob/user) if(!allow_emag) to_chat(user, "[src]'s security firewall is far too powerful for you to bypass.") return FALSE return ..() -/obj/machinery/computer/shuttle/ferry/attack_ai() +/obj/machinery/computer/shuttle_flight/ferry/attack_ai() return allow_silicons ? ..() : FALSE -/obj/machinery/computer/shuttle/ferry/attack_robot() +/obj/machinery/computer/shuttle_flight/ferry/attack_robot() return allow_silicons ? ..() : FALSE -/obj/machinery/computer/shuttle/ferry/request +/obj/machinery/computer/shuttle_flight/ferry/request name = "ferry console" circuit = /obj/item/circuitboard/computer/ferry/request var/last_request //prevents spamming admins @@ -30,7 +30,7 @@ req_access = list(ACCESS_CENT_GENERAL) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF -/obj/machinery/computer/shuttle/ferry/request/Topic(href, href_list) +/obj/machinery/computer/shuttle_flight/ferry/request/Topic(href, href_list) ..() if(href_list["request"]) if(last_request && (last_request + cooldown > world.time)) diff --git a/code/modules/shuttle/monastery.dm b/code/modules/shuttle/monastery.dm index b04c202dca3f6..127331e99a7fe 100644 --- a/code/modules/shuttle/monastery.dm +++ b/code/modules/shuttle/monastery.dm @@ -1,7 +1,6 @@ -/obj/machinery/computer/shuttle/monastery_shuttle +/obj/machinery/computer/shuttle_flight/monastery_shuttle name = "monastery shuttle console" desc = "Used to control the monastery shuttle." circuit = /obj/item/circuitboard/computer/monastery_shuttle shuttleId = "pod1" possible_destinations = "monastery_shuttle_asteroid;monastery_shuttle_station" - no_destination_swap = TRUE diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm deleted file mode 100644 index 7f4b023322870..0000000000000 --- a/code/modules/shuttle/navigation_computer.dm +++ /dev/null @@ -1,370 +0,0 @@ -/obj/machinery/computer/camera_advanced/shuttle_docker - name = "navigation computer" - desc = "Used to designate a precise transit location for a spacecraft." - jump_action = null - should_supress_view_changes = FALSE - var/datum/action/innate/shuttledocker_rotate/rotate_action = new - var/datum/action/innate/shuttledocker_place/place_action = new - var/shuttleId = "" - var/shuttlePortId = "" - var/shuttlePortName = "custom location" - var/list/jumpto_ports = list() //hashset of ports to jump to and ignore for collision purposes - var/obj/docking_port/stationary/my_port //the custom docking port placed by this console - var/obj/docking_port/mobile/shuttle_port //the mobile docking port of the connected shuttle - var/list/locked_traits = list(ZTRAIT_RESERVED, ZTRAIT_CENTCOM, ZTRAIT_AWAY) //traits forbided for custom docking - var/view_range = 0 - var/x_offset = 0 - var/y_offset = 0 - var/list/whitelist_turfs = list(/turf/open/space, /turf/open/floor/plating, /turf/open/lava) - var/see_hidden = FALSE - var/designate_time = 0 - var/turf/designating_target_loc - var/jammed = FALSE - -/obj/machinery/computer/camera_advanced/shuttle_docker/Initialize() - . = ..() - GLOB.navigation_computers += src - for(var/V in SSshuttle.stationary) - if(!V) - continue - var/obj/docking_port/stationary/S = V - if(jumpto_ports[S.id]) - z_lock |= S.z - whitelist_turfs = typecacheof(whitelist_turfs) - -/obj/machinery/computer/camera_advanced/shuttle_docker/Destroy() - . = ..() - GLOB.navigation_computers -= src - -/obj/machinery/computer/camera_advanced/shuttle_docker/attack_hand(mob/user) - if(jammed) - to_chat(user, "The Syndicate is jamming the console!") - return - if(!shuttle_port && !SSshuttle.getShuttle(shuttleId)) - to_chat(user,"Warning: Shuttle connection severed!") - return - return ..() - -/obj/machinery/computer/camera_advanced/shuttle_docker/GrantActions(mob/living/user) - if(jumpto_ports.len) - jump_action = new /datum/action/innate/camera_jump/shuttle_docker - ..() - - if(rotate_action) - rotate_action.target = user - rotate_action.Grant(user) - actions += rotate_action - - if(place_action) - place_action.target = user - place_action.Grant(user) - actions += place_action - -/obj/machinery/computer/camera_advanced/shuttle_docker/CreateEye() - shuttle_port = SSshuttle.getShuttle(shuttleId) - if(QDELETED(shuttle_port)) - shuttle_port = null - return - - eyeobj = new /mob/camera/aiEye/remote/shuttle_docker(null, src) - var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj - the_eye.setDir(shuttle_port.dir) - var/turf/origin = locate(shuttle_port.x + x_offset, shuttle_port.y + y_offset, shuttle_port.z) - for(var/V in shuttle_port.shuttle_areas) - var/area/A = V - for(var/turf/T in A) - if(T.z != origin.z) - continue - var/image/I = image('icons/effects/alphacolors.dmi', origin, "red") - var/x_off = T.x - origin.x - var/y_off = T.y - origin.y - I.loc = locate(origin.x + x_off, origin.y + y_off, origin.z) //we have to set this after creating the image because it might be null, and images created in nullspace are immutable. - I.layer = ABOVE_NORMAL_TURF_LAYER - I.plane = 0 - I.mouse_opacity = MOUSE_OPACITY_TRANSPARENT - the_eye.placement_images[I] = list(x_off, y_off) - -/obj/machinery/computer/camera_advanced/shuttle_docker/give_eye_control(mob/user) - ..() - if(!QDELETED(user) && user.client) - var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj - var/list/to_add = list() - to_add += the_eye.placement_images - to_add += the_eye.placed_images - if(!see_hidden) - to_add += SSshuttle.hidden_shuttle_turf_images - - user.client.images += to_add - user.client.view_size.setTo(view_range) - -/obj/machinery/computer/camera_advanced/shuttle_docker/remove_eye_control(mob/living/user) - ..() - if(!QDELETED(user) && user.client) - var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj - var/list/to_remove = list() - to_remove += the_eye.placement_images - to_remove += the_eye.placed_images - if(!see_hidden) - to_remove += SSshuttle.hidden_shuttle_turf_images - - user.client.images -= to_remove - user.client.view_size.resetToDefault() - -/obj/machinery/computer/camera_advanced/shuttle_docker/proc/placeLandingSpot() - if(designating_target_loc || !current_user) - return - - var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj - var/landing_clear = checkLandingSpot() - if(designate_time && (landing_clear != SHUTTLE_DOCKER_BLOCKED)) - to_chat(current_user, "Targeting transit location, please wait [DisplayTimeText(designate_time)]...") - designating_target_loc = the_eye.loc - var/wait_completed = do_after(current_user, designate_time, FALSE, designating_target_loc, TRUE, CALLBACK(src, /obj/machinery/computer/camera_advanced/shuttle_docker/proc/canDesignateTarget)) - designating_target_loc = null - if(!current_user) - return - if(!wait_completed) - to_chat(current_user, "Operation aborted.") - return - landing_clear = checkLandingSpot() - - if(landing_clear != SHUTTLE_DOCKER_LANDING_CLEAR) - switch(landing_clear) - if(SHUTTLE_DOCKER_BLOCKED) - to_chat(current_user, "Invalid transit location.") - if(SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT) - to_chat(current_user, "Unknown object detected in landing zone. Please designate another location.") - return - - ///Make one use port that deleted after fly off, to don't lose info that need on to properly fly off. - if(my_port && my_port.get_docked()) - my_port.delete_after = TRUE - my_port.id = null - my_port.name = "Old [my_port.name]" - my_port = null - - if(!my_port) - my_port = new() - my_port.name = shuttlePortName - my_port.id = shuttlePortId - my_port.height = shuttle_port.height - my_port.width = shuttle_port.width - my_port.dheight = shuttle_port.dheight - my_port.dwidth = shuttle_port.dwidth - my_port.hidden = shuttle_port.hidden - my_port.setDir(the_eye.dir) - my_port.forceMove(locate(eyeobj.x - x_offset, eyeobj.y - y_offset, eyeobj.z)) - - if(current_user.client) - current_user.client.images -= the_eye.placed_images - - QDEL_LIST(the_eye.placed_images) - - for(var/V in the_eye.placement_images) - var/image/I = V - var/image/newI = image('icons/effects/alphacolors.dmi', the_eye.loc, "blue") - newI.loc = I.loc //It is highly unlikely that any landing spot including a null tile will get this far, but better safe than sorry. - newI.layer = ABOVE_OPEN_TURF_LAYER - newI.plane = 0 - newI.mouse_opacity = 0 - the_eye.placed_images += newI - - if(current_user.client) - current_user.client.images += the_eye.placed_images - to_chat(current_user, "Transit location designated.") - return TRUE - -/obj/machinery/computer/camera_advanced/shuttle_docker/proc/canDesignateTarget() - if(!designating_target_loc || !current_user || (eyeobj.loc != designating_target_loc) || (stat & (NOPOWER|BROKEN)) ) - return FALSE - return TRUE - -/obj/machinery/computer/camera_advanced/shuttle_docker/proc/rotateLandingSpot() - var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj - var/list/image_cache = the_eye.placement_images - the_eye.setDir(turn(the_eye.dir, -90)) - for(var/i in 1 to image_cache.len) - var/image/pic = image_cache[i] - var/list/coords = image_cache[pic] - var/Tmp = coords[1] - coords[1] = coords[2] - coords[2] = -Tmp - pic.loc = locate(the_eye.x + coords[1], the_eye.y + coords[2], the_eye.z) - var/Tmp = x_offset - x_offset = y_offset - y_offset = -Tmp - checkLandingSpot() - -/obj/machinery/computer/camera_advanced/shuttle_docker/proc/checkLandingSpot() - var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj - var/turf/eyeturf = get_turf(the_eye) - if(!eyeturf) - return SHUTTLE_DOCKER_BLOCKED - if(!eyeturf.z || SSmapping.level_has_any_trait(eyeturf.z, locked_traits)) - return SHUTTLE_DOCKER_BLOCKED - - . = SHUTTLE_DOCKER_LANDING_CLEAR - var/list/bounds = shuttle_port.return_coords(the_eye.x - x_offset, the_eye.y - y_offset, the_eye.dir) - var/list/overlappers = SSshuttle.get_dock_overlap(bounds[1], bounds[2], bounds[3], bounds[4], the_eye.z) - var/list/image_cache = the_eye.placement_images - for(var/i in 1 to image_cache.len) - var/image/I = image_cache[i] - var/list/coords = image_cache[I] - var/turf/T = locate(eyeturf.x + coords[1], eyeturf.y + coords[2], eyeturf.z) - I.loc = T - switch(checkLandingTurf(T, overlappers)) - if(SHUTTLE_DOCKER_LANDING_CLEAR) - I.icon_state = "green" - if(SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT) - I.icon_state = "green" - if(. == SHUTTLE_DOCKER_LANDING_CLEAR) - . = SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT - else - I.icon_state = "red" - . = SHUTTLE_DOCKER_BLOCKED - -/obj/machinery/computer/camera_advanced/shuttle_docker/proc/checkLandingTurf(turf/T, list/overlappers) - // Too close to the map edge is never allowed - if(!T || T.x <= 10 || T.y <= 10 || T.x >= world.maxx - 10 || T.y >= world.maxy - 10) - return SHUTTLE_DOCKER_BLOCKED - // If it's one of our shuttle areas assume it's ok to be there - if(shuttle_port.shuttle_areas[T.loc]) - return SHUTTLE_DOCKER_LANDING_CLEAR - . = SHUTTLE_DOCKER_LANDING_CLEAR - // See if the turf is hidden from us - var/list/hidden_turf_info - if(!see_hidden) - hidden_turf_info = SSshuttle.hidden_shuttle_turfs[T] - if(hidden_turf_info) - . = SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT - - 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] - if(port == my_port) - continue - var/port_hidden = !see_hidden && port.hidden - var/list/overlap = overlappers[port] - var/list/xs = overlap[1] - var/list/ys = overlap[2] - if(xs["[T.x]"] && ys["[T.y]"]) - if(port_hidden) - . = SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT - else - return SHUTTLE_DOCKER_BLOCKED - -/obj/machinery/computer/camera_advanced/shuttle_docker/proc/update_hidden_docking_ports(list/remove_images, list/add_images) - if(!see_hidden && current_user && current_user.client) - current_user.client.images -= remove_images - current_user.client.images += add_images - -/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" - if(dock) - jumpto_ports[dock.id] = TRUE - -/mob/camera/aiEye/remote/shuttle_docker - visible_icon = FALSE - use_static = USE_STATIC_NONE - var/list/placement_images = list() - var/list/placed_images = list() - -/mob/camera/aiEye/remote/shuttle_docker/Initialize(mapload, obj/machinery/computer/camera_advanced/origin) - src.origin = origin - return ..() - -/mob/camera/aiEye/remote/shuttle_docker/setLoc(T) - ..() - var/obj/machinery/computer/camera_advanced/shuttle_docker/console = origin - console.checkLandingSpot() - -/mob/camera/aiEye/remote/shuttle_docker/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 - -/datum/action/innate/shuttledocker_rotate - name = "Rotate" - icon_icon = 'icons/mob/actions/actions_mecha.dmi' - button_icon_state = "mech_cycle_equip_off" - -/datum/action/innate/shuttledocker_rotate/Activate() - if(QDELETED(target) || !isliving(target)) - return - var/mob/living/C = target - var/mob/camera/aiEye/remote/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/shuttle_docker/origin = remote_eye.origin - origin.rotateLandingSpot() - -/datum/action/innate/shuttledocker_place - name = "Place" - icon_icon = 'icons/mob/actions/actions_mecha.dmi' - button_icon_state = "mech_zoom_off" - -/datum/action/innate/shuttledocker_place/Activate() - if(QDELETED(target) || !isliving(target)) - return - var/mob/living/C = target - var/mob/camera/aiEye/remote/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/shuttle_docker/origin = remote_eye.origin - origin.placeLandingSpot(target) - -/datum/action/innate/camera_jump/shuttle_docker - name = "Jump to Location" - button_icon_state = "camera_jump" - -/datum/action/innate/camera_jump/shuttle_docker/Activate() - if(QDELETED(target) || !isliving(target)) - return - var/mob/living/C = target - var/mob/camera/aiEye/remote/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/shuttle_docker/console = remote_eye.origin - - playsound(console, 'sound/machines/terminal_prompt_deny.ogg', 25, 0) - - var/list/L = list() - for(var/V in SSshuttle.stationary) - if(!V) - stack_trace("SSshuttle.stationary have null entry!") - continue - var/obj/docking_port/stationary/S = V - if(console.z_lock.len && !(S.z in console.z_lock)) - continue - if(console.jumpto_ports[S.id]) - L["([L.len])[S.name]"] = S - - for(var/V in SSshuttle.beacons) - if(!V) - stack_trace("SSshuttle.beacons have null entry!") - continue - var/obj/machinery/spaceship_navigation_beacon/nav_beacon = V - if(!nav_beacon.z || SSmapping.level_has_any_trait(nav_beacon.z, console.locked_traits)) - break - if(!nav_beacon.locked) - L["([L.len]) [nav_beacon.name] located: [nav_beacon.x] [nav_beacon.y] [nav_beacon.z]"] = nav_beacon - else - L["([L.len]) [nav_beacon.name] locked"] = null - - playsound(console, 'sound/machines/terminal_prompt.ogg', 25, FALSE) - var/selected = input("Choose location to jump to", "Locations", null) as null|anything in L - if(QDELETED(src) || QDELETED(target) || !isliving(target)) - return - playsound(src, "terminal_type", 25, 0) - if(selected) - var/turf/T = get_turf(L[selected]) - if(T) - playsound(console, 'sound/machines/terminal_prompt_confirm.ogg', 25, 0) - remote_eye.setLoc(T) - to_chat(target, "Jumped to [selected].") - C.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static) - C.clear_fullscreen("flash", 3) - else - playsound(console, 'sound/machines/terminal_prompt_deny.ogg', 25, 0) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 67d5439a26c6a..f327fc4d9e72f 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -26,6 +26,8 @@ All ShuttleMove procs go here if(ismob(thing)) if(isliving(thing)) var/mob/living/M = thing + if(M.incorporeal_move) + return if(M.buckled) M.buckled.unbuckle_mob(M, 1) if(M.pulledby) @@ -53,15 +55,18 @@ All ShuttleMove procs go here if(!shuttle_boundary) CRASH("A turf queued to move via shuttle somehow had no skipover in baseturfs. [src]([type]):[loc]") var/depth = baseturfs.len - shuttle_boundary + 1 + newT.CopyOnTop(src, 1, depth, TRUE) + + if(isopenturf(src)) + var/turf/open/after_src_terf = src + update_air_ref(isspaceturf(src) ? 0 : (after_src_terf.planetary_atmos ? 1 : 2)) + else + update_air_ref(-1) + //Air stuff - newT.blocks_air = TRUE newT.air_update_turf(TRUE) - blocks_air = TRUE air_update_turf(TRUE) - if(isopenturf(newT)) - var/turf/open/new_open = newT - new_open.copy_air_with_tile(src) return TRUE @@ -69,6 +74,8 @@ All ShuttleMove procs go here /turf/proc/afterShuttleMove(turf/oldT, rotation) //Dealing with the turf we left behind oldT.TransferComponents(src) + SSexplosions.wipe_turf(src) + SEND_SIGNAL(oldT, COMSIG_TURF_AFTER_SHUTTLE_MOVE, src) //Mostly for decals var/shuttle_boundary = baseturfs.Find(/turf/baseturf_skipover/shuttle) if(shuttle_boundary) oldT.ScrapeAway(baseturfs.len - shuttle_boundary + 1, flags = CHANGETURF_FORCEOP) @@ -251,7 +258,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 992c37bb16dd8..da1eaf5d184ee 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -297,6 +297,11 @@ var/can_move_docking_ports = FALSE var/list/hidden_turfs = list() + //The virtual Z-Value of the shuttle + var/virtual_z + + var/shuttle_object_type = /datum/orbital_object/shuttle + /obj/docking_port/mobile/proc/register() SSshuttle.mobile += src @@ -322,13 +327,17 @@ var/list/all_turfs = return_ordered_turfs(x, y, z, dir) for(var/i in 1 to all_turfs.len) var/turf/curT = all_turfs[i] - var/area/cur_area = curT.loc + var/area/shuttle/cur_area = curT.loc if(istype(cur_area, area_type)) shuttle_areas[cur_area] = TRUE + if(!cur_area.mobile_port) + cur_area.link_to_shuttle(src) initial_engines = count_engines() current_engines = initial_engines + virtual_z = get_new_virtual_z() + #ifdef DOCKING_PORT_HIGHLIGHT highlight("#0f0") #endif @@ -489,7 +498,7 @@ oldT.change_area(old_area, underlying_area) oldT.empty(FALSE) - // Here we locate the bottomost shuttle boundary and remove all turfs above it + // Here we locate the bottommost shuttle boundary and remove all turfs above it var/list/baseturf_cache = oldT.baseturfs for(var/k in 1 to length(baseturf_cache)) if(ispath(baseturf_cache[k], /turf/baseturf_skipover/shuttle)) @@ -633,10 +642,9 @@ var/turf/T = thing if(!T || !istype(T.loc, area_type)) continue - for (var/thing2 in T) - var/atom/movable/AM = thing2 - if (length(AM.client_mobs_in_contents)) - AM.update_parallax_contents() + for (var/atom/movable/movable as anything in T) + if (length(movable.client_mobs_in_contents)) + movable.update_parallax_contents() /obj/docking_port/mobile/proc/check_transit_zone() if(assigned_transit) @@ -707,7 +715,7 @@ if(timeleft > 1 HOURS) return "--:--" else if(timeleft > 0) - return "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, " ")]" + return "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, "0")]" else return "00:00" @@ -754,7 +762,7 @@ /obj/docking_port/mobile/proc/getControlConsole() for(var/place in shuttle_areas) var/area/shuttle/shuttle_area = place - for(var/obj/machinery/computer/shuttle/S in shuttle_area) + for(var/obj/machinery/computer/shuttle_flight/S in shuttle_area) if(S.shuttleId == id) return S return null @@ -776,8 +784,16 @@ 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] + var/list/engines = list() + for(var/datum/weakref/engine in engine_list) + var/obj/structure/shuttle/engine/real_engine = engine.resolve() + if(!real_engine) + engine_list -= engine + continue + engines += real_engine + + if(LAZYLEN(engines)) + distant_source = engines[1] else for(var/A in areas) distant_source = locate(/obj/machinery/door) in A @@ -785,22 +801,22 @@ break if(distant_source) - for(var/mob/M in SSmobs.clients_by_zlevel[z]) + for(var/mob/M as() 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) + M.playsound_local(distant_source, "sound/effects/[selected_sound]_distance.ogg", 100, falloff_exponent = 20) else if(dist_far <= range) var/source - if(engine_list.len == 0) + if(engines.len == 0) source = distant_source else var/closest_dist = 10000 - for(var/obj/O in engine_list) + for(var/obj/O in engines) 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) + M.playsound_local(source, "sound/effects/[selected_sound].ogg", 100, falloff_exponent = range / 2) // Losing all initial engines should get you 2 // Adding another set of engines at 0.5 time @@ -821,7 +837,7 @@ var/area/shuttle/areaInstance = thing for(var/obj/structure/shuttle/engine/E in areaInstance.contents) if(!QDELETED(E)) - engine_list += E + engine_list += WEAKREF(E) . += E.engine_power for(var/obj/machinery/shuttle/engine/E in areaInstance.contents) if(!QDELETED(E)) diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm index 1a4aa32695a7d..dc7346230761d 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm @@ -24,7 +24,7 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He 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) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "stamina" = 0) resistance_flags = FIRE_PROOF var/ready = TRUE //pre-designation @@ -74,19 +74,11 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He return if(!proximity_flag) return - if(istype(target, /obj/machinery/computer/custom_shuttle)) + if(istype(target, /obj/machinery/computer/shuttle_flight/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 + var/obj/machinery/computer/shuttle_flight/custom_shuttle/console = target console.linkShuttle(linkedShuttleId) to_chat(user, "Console linked successfully!") return @@ -161,17 +153,6 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He 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) @@ -181,6 +162,7 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He 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)) + port.shuttle_object_type = /datum/orbital_object/shuttle/custom_shuttle var/obj/docking_port/stationary/stationary_port = new /obj/docking_port/stationary(get_turf(target)) stationary_port.delete_after = TRUE stationary_port.name = "[recorded_shuttle_area.name] Custom Shuttle construction site" @@ -242,14 +224,14 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He icon_state = "rsd_used" - //Select shuttle fly direction. + //Select shuttle fly direction. select_preferred_direction(user) //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])") + message_admins("[ADMIN_LOOKUPFLW(user)] created a new shuttle with a [src] at [ADMIN_VERBOSEJMP(user)] with a name [recorded_shuttle_area.name] ([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)] with a name [recorded_shuttle_area.name] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])") return TRUE /obj/item/shuttle_creator/proc/create_shuttle_area(mob/user) @@ -298,7 +280,7 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He FD.CalculateAffectingAreas() return TRUE -//Select shuttle fly direction. +//Select shuttle fly direction. /obj/item/shuttle_creator/proc/select_preferred_direction(mob/user) var/obj/docking_port/mobile/port = SSshuttle.getShuttle(linkedShuttleId) if(!port || !istype(port, /obj/docking_port/mobile)) @@ -327,6 +309,8 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He overwritten_area = /area/space else if(istype(place, /area/lavaland/surface/outdoors)) overwritten_area = /area/lavaland/surface/outdoors + else if(istype(place, /area/asteroid/generated)) + overwritten_area = /area/asteroid/generated 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 diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm index f50b3bf59f496..1622ae1d41ba0 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm @@ -2,7 +2,7 @@ /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/mob/camera/ai_eye/remote/shuttle_creation/remote_eye var/obj/item/shuttle_creator/shuttle_creator /datum/action/innate/shuttle_creator/Activate() diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm index 6945c934279fe..1adcfc78d9b9f 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm @@ -15,7 +15,7 @@ user.unset_machine() /obj/machinery/computer/camera_advanced/shuttle_creator/CreateEye() - eyeobj = new /mob/camera/aiEye/remote/shuttle_creation(get_turf(owner_rsd)) + eyeobj = new /mob/camera/ai_eye/remote/shuttle_creation(get_turf(owner_rsd)) eyeobj.origin = src eyeobj.use_static = USE_STATIC_NONE @@ -78,13 +78,13 @@ eyeobj.eye_initialized = TRUE give_eye_control(L) eyeobj.setLoc(camera_location) - var/mob/camera/aiEye/remote/shuttle_creation/shuttle_eye = eyeobj + var/mob/camera/ai_eye/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 + var/mob/camera/ai_eye/remote/shuttle_creation/eye = eyeobj give_eye_control(L) if(camera_location) eye.source_turf = camera_location diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm index ff96e2ae65b60..65a4b3dab1a25 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm @@ -1,5 +1,5 @@ //===============Camera Eye================ -/mob/camera/aiEye/remote/shuttle_creation +/mob/camera/ai_eye/remote/shuttle_creation name = "shuttle holo-drone" icon = 'icons/obj/mining.dmi' icon_state = "construction_drone" @@ -8,17 +8,17 @@ var/turf/source_turf var/max_range = 12 -/mob/camera/aiEye/remote/shuttle_creation/Initialize() +/mob/camera/ai_eye/remote/shuttle_creation/Initialize() . = ..() setLoc(get_turf(source_turf)) -/mob/camera/aiEye/remote/shuttle_creation/update_remote_sight(mob/living/user) +/mob/camera/ai_eye/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) +/mob/camera/ai_eye/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 @@ -37,14 +37,14 @@ else sprint = initial -/mob/camera/aiEye/remote/shuttle_creation/proc/can_move_to(var/turf/T) +/mob/camera/ai_eye/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) +/mob/camera/ai_eye/remote/shuttle_creation/setLoc(T) ..() if(eye_user?.client) eye_user.client.images -= user_image diff --git a/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm b/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm deleted file mode 100644 index 0d777568b8791..0000000000000 --- a/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm +++ /dev/null @@ -1,39 +0,0 @@ -/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 = 8 - throw_speed = 3 - throw_range = 5 - 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/spaceship_navigation_beacon.dm b/code/modules/shuttle/spaceship_navigation_beacon.dm deleted file mode 100644 index d7749f3d58412..0000000000000 --- a/code/modules/shuttle/spaceship_navigation_beacon.dm +++ /dev/null @@ -1,69 +0,0 @@ -/obj/item/circuitboard/machine/spaceship_navigation_beacon - name = "Bluespace Navigation Gigabeacon (Machine Board)" - build_path = /obj/machinery/spaceship_navigation_beacon - req_components = list() - - -/obj/machinery/spaceship_navigation_beacon - name = "Bluespace Navigation Gigabeacon" - desc = "A device that creates a bluespace anchor that allow ships jump near to it." - icon = 'icons/obj/machines/NavBeacon.dmi' - icon_state = "beacon-item" - use_power = IDLE_POWER_USE - idle_power_usage = 0 - density = TRUE - circuit = /obj/item/circuitboard/machine/spaceship_navigation_beacon - light_power = 2 - - var/locked = FALSE //Locked beacons don't allow to jump to it. - - -/obj/machinery/spaceship_navigation_beacon/Initialize() - . = ..() - SSshuttle.beacons |= src - -obj/machinery/spaceship_navigation_beacon/emp_act() - locked = TRUE - -/obj/machinery/spaceship_navigation_beacon/Destroy() - SSshuttle.beacons -= src - return ..() - -// update the icon_state -/obj/machinery/spaceship_navigation_beacon/update_icon() - if(powered()) - icon_state = "beacon-active" - set_light(1) - if(panel_open) - icon_state = "beacon-open" - set_light(0) - else - icon_state = "beacon-inactive" - set_light(0) - -/obj/machinery/spaceship_navigation_beacon/power_change() - . = ..() - update_icon() - -/obj/machinery/spaceship_navigation_beacon/multitool_act(mob/living/user, obj/item/multitool/I) - if(panel_open) - var/new_name = "Beacon_[capped_input(user, "Enter the custom name for this beacon", "It be Beacon ..your input..")]" - if(new_name && Adjacent(user)) - name = new_name - to_chat(user, "You change beacon name to [name].") - else - locked = !locked - to_chat(user, "You [locked ? "" : "un"]lock [src].") - return TRUE - -/obj/machinery/spaceship_navigation_beacon/examine() - . = ..() - . += "Status: [locked ? "LOCKED" : "Stable"] " - -/obj/machinery/spaceship_navigation_beacon/attackby(obj/item/W, mob/user, params) - if(default_deconstruction_screwdriver(user, "beacon-open", "beacon-active", W)) - return - if(default_deconstruction_crowbar(W)) - return - - return ..() diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index de991437b52fa..d198868f90527 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -187,7 +187,7 @@ var/mob/living/M = AM var/throwtarget = get_edge_target_turf(src, boot_dir) M.Paralyze(40) - M.throw_at(throwtarget, 5, 1,src) + M.throw_at(throwtarget, 5, 1) to_chat(M, "No climbing on the bar please.") else . = ..() diff --git a/code/modules/shuttle/super_cruise/bluespace_beacon/bluespace_beacon.dm b/code/modules/shuttle/super_cruise/bluespace_beacon/bluespace_beacon.dm new file mode 100644 index 0000000000000..4b9e4c5458e7c --- /dev/null +++ b/code/modules/shuttle/super_cruise/bluespace_beacon/bluespace_beacon.dm @@ -0,0 +1,44 @@ +/obj/item/sbeacondrop/exploration + name = "bluespace beacon" + desc = "A label on it reads: Warning: Activating this device will send a bluespace gigabeacon to your location, which will allow you to return to promising stations.." + droptype = /obj/structure/bluespace_beacon + +//Beacon structure + +/obj/structure/bluespace_beacon + name = "bluespace giga-beacon" + desc = "Locks a location on the navigational map, allowing for it to be returned to at any time." + icon = 'icons/obj/machines/NavBeacon.dmi' + icon_state = "beacon-item" + density = TRUE + + max_integrity = 200 + resistance_flags = FIRE_PROOF | ACID_PROOF + + light_power = 2 + light_range = 3 + light_color = "#cd87df" + + anchored = TRUE + +/obj/structure/bluespace_beacon/Initialize() + . = ..() + GLOB.zclear_blockers += src + +/obj/structure/bluespace_beacon/Destroy() + GLOB.zclear_blockers -= src + . = ..() + +/obj/structure/bluespace_beacon/wrench_act(mob/living/user, obj/item/I) + if(anchored) + to_chat(user, "You start unsecuring [src]...") + else + to_chat(user, "You start securing [src]...") + if(I.use_tool(src, user, 40, volume=50)) + if(QDELETED(I)) + return + if(anchored) + to_chat(user, "You unsecure [src].") + else + to_chat(user, "You secure [src].") + anchored = !anchored diff --git a/code/modules/shuttle/super_cruise/interface/orbital_map_interface.dm b/code/modules/shuttle/super_cruise/interface/orbital_map_interface.dm new file mode 100644 index 0000000000000..46ecd77a505e8 --- /dev/null +++ b/code/modules/shuttle/super_cruise/interface/orbital_map_interface.dm @@ -0,0 +1,39 @@ +/datum/orbital_map_tgui + var/open_orbital_map = PRIMARY_ORBITAL_MAP + +/datum/orbital_map_tgui/ui_state(mob/user) + return GLOB.observer_state + +/datum/orbital_map_tgui/Destroy(force, ...) + . = ..() + SSorbits.open_orbital_maps -= SStgui.get_all_open_uis(src) + +/datum/orbital_map_tgui/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "OrbitalMap") + ui.open() + //Do not auto update, handled by orbits subsystem. + SSorbits.open_orbital_maps |= ui + ui.set_autoupdate(FALSE) + +/datum/orbital_map_tgui/ui_close(mob/user, datum/tgui/tgui) + SSorbits.open_orbital_maps -= tgui + +/datum/orbital_map_tgui/ui_data(mob/user) + var/list/data = list() + data["update_index"] = SSorbits.times_fired + data["map_objects"] = list() + var/datum/orbital_map/showing_map = SSorbits.orbital_maps[open_orbital_map] + for(var/zone in showing_map.collision_zone_bodies) + for(var/datum/orbital_object/object as() in showing_map.collision_zone_bodies[zone]) + data["map_objects"] += list(list( + "name" = object.name, + "position_x" = object.position.x, + "position_y" = object.position.y, + "velocity_x" = object.velocity.x, + "velocity_y" = object.velocity.y, + "radius" = object.radius, + "gravity_range" = object.relevant_gravity_range + )) + return data diff --git a/code/modules/shuttle/super_cruise/orbital_map_components/orbital_map.dm b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_map.dm new file mode 100644 index 0000000000000..f663c4136338f --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_map.dm @@ -0,0 +1,46 @@ +/datum/orbital_map + //the primary star. Set to be lavaland by default. + var/datum/orbital_object/center = null + //A list of all bodies in their assigned collision zones + var/list/collision_zone_bodies = list() + //Object count + var/object_count + +/datum/orbital_map/proc/add_body(datum/orbital_object/body) + //Add the orbital body in the correct collision zone + var/position_key = "[round(body.position.x / ORBITAL_MAP_ZONE_SIZE)],[round(body.position.y / ORBITAL_MAP_ZONE_SIZE)]" + LAZYADDASSOCLIST(collision_zone_bodies, position_key, body) + object_count ++ + +/datum/orbital_map/proc/remove_body(datum/orbital_object/body) + //Find the objects collision zone and remove it + var/position_key = "[round(body.position.x / ORBITAL_MAP_ZONE_SIZE)],[round(body.position.y / ORBITAL_MAP_ZONE_SIZE)]" + LAZYREMOVEASSOC(collision_zone_bodies, position_key, body) + object_count -- + +/datum/orbital_map/proc/on_body_move(datum/orbital_object/body, prev_x, prev_y) + //Find the objects old collision zone and remove it + //Find the objects new collision zone and add it + var/pre_position_key = "[round(prev_x / ORBITAL_MAP_ZONE_SIZE)],[round(prev_y / ORBITAL_MAP_ZONE_SIZE)]" + var/post_position_key = "[round(body.position.x / ORBITAL_MAP_ZONE_SIZE)],[round(body.position.y / ORBITAL_MAP_ZONE_SIZE)]" + if(pre_position_key == post_position_key) + return + LAZYREMOVEASSOC(collision_zone_bodies, pre_position_key, body) + LAZYADDASSOCLIST(collision_zone_bodies, post_position_key, body) + +//Returns a list of gravitationally relevant bodies. +/datum/orbital_map/proc/get_relevnant_bodies(datum/orbital_object/source) + . = list() + //Get all orbital bodies on the map. + for(var/collision_zone in collision_zone_bodies) + for(var/datum/orbital_object/body as() in collision_zone_bodies[collision_zone]) + //Distance check last for optimisations + if(body != source && body.relevant_gravity_range && source.position.Distance(body.position) <= body.relevant_gravity_range) + . += body + +//Post setup function that runs after SSorbit init. +//Moves map objects to the correct positions and gives them velocities so that they can orbit dynamically. +/datum/orbital_map/proc/post_setup() + for(var/collision_zone in collision_zone_bodies) + for(var/datum/orbital_object/body as() in collision_zone_bodies[collision_zone]) + body.post_map_setup() diff --git a/code/modules/shuttle/super_cruise/orbital_map_components/orbital_object.dm b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_object.dm new file mode 100644 index 0000000000000..76293ff97e3d9 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_object.dm @@ -0,0 +1,318 @@ +/datum/orbital_object + var/name = "undefined" + //Mass of the object in solar masses + var/mass = 0 + //Radius of the object in parsecs + var/radius = 1 + //Position of the object (0,0) is the center of the map. + //Position is in kilometers + //If this is modified, on_body_move() MUST be called. (Really this should be a helper proc) + var/datum/orbital_vector/position = new() + //Velocity of the object + //KILOMETERS PER SECOND + var/datum/orbital_vector/velocity = new() + //Static objects don't get moved. + var/static_object = FALSE + //Does the object actively thrust to maintain a stable orbit? + var/maintain_orbit = FALSE + //The object in which we are trying to maintain a stable orbit around. + var/datum/orbital_object/target_orbital_body + //Are we invisible on the map? + var/stealth = FALSE + //Multiplier for velocity + var/velocity_multiplier = 1 + + //Delta time updates + //Ship translations are smooth so must use a delta time + //Dont get confused with subsystem delta_time as this accounts for time dilation + var/last_update_tick = 0 + + //CALCULATED IN INIT + //Once objects are outside of this range, we will not apply gravity to them. + var/relevant_gravity_range + //Are we force-orbitting something? + var/orbitting = FALSE + //The relative velocity required for a stable orbit + var/relative_velocity_required + //Bodies that are orbitting us. + var/list/orbitting_bodies = list() + //Are we currently immune to collisions + var/collision_ignored = TRUE + //What are we colliding with + var/list/datum/orbital_object/colliding_with + + //The index or the orbital map we exist in + var/orbital_map_index = PRIMARY_ORBITAL_MAP + + //Our collision type + var/collision_type = COLLISION_UNDEFINED + //The collision flags we register with + var/collision_flags = NONE + +/datum/orbital_object/New(datum/orbital_vector/position, datum/orbital_vector/velocity, orbital_map_index) + if(orbital_map_index) + src.orbital_map_index = orbital_map_index + if(position) + src.position = position + if(velocity) + src.velocity = velocity + . = ..() + //Calculate relevant grav range + relevant_gravity_range = sqrt((mass * GRAVITATIONAL_CONSTANT) / MINIMUM_EFFECTIVE_GRAVITATIONAL_ACCEELRATION) + //Process this + if(!static_object) + START_PROCESSING(SSorbits, src) + //Add to orbital map + var/datum/orbital_map/map = SSorbits.orbital_maps[src.orbital_map_index] + map.add_body(src) + //If orbits has already setup, then post map setup + if(SSorbits.orbits_setup) + post_map_setup() + +/datum/orbital_object/Destroy() + STOP_PROCESSING(SSorbits, src) + var/datum/orbital_map/map = SSorbits.orbital_maps[orbital_map_index] + map.remove_body(src) + LAZYREMOVE(target_orbital_body?.orbitting_bodies, src) + if(length(orbitting_bodies)) + for(var/datum/orbital_object/orbitting_bodies in orbitting_bodies) + orbitting_bodies.target_orbital_body = null + orbitting_bodies.Cut() + . = ..() + +/datum/orbital_object/proc/explode() + return + +//Process orbital objects, calculate gravity +/datum/orbital_object/process() + //Dont process updates for static objects. + if(static_object) + return PROCESS_KILL + + //NOTE TO SELF: This does nothing because world.time is in ticks not realtime. + var/delta_time = 0 + if(last_update_tick) + //Don't go too crazy. + delta_time = CLAMP(world.time - last_update_tick, 10, 50) * 0.1 + else + delta_time = 1 + last_update_tick = world.time + + var/datum/orbital_map/parent_map = SSorbits.orbital_maps[orbital_map_index] + + //=================================== + // GRAVITATIONAL ATTRACTION + //=================================== + //Gravity is not considered while we have just undocked and are at the center of a massive body. + if(!collision_ignored) + //Find relevant gravitational bodies. + var/list/gravitational_bodies =parent_map.get_relevnant_bodies(src) + //Calculate acceleration vector + var/datum/orbital_vector/acceleration_per_second = new() + //Calculate gravity + for(var/datum/orbital_object/gravitational_body as() in gravitational_bodies) + //https://en.wikipedia.org/wiki/Gravitational_acceleration + var/distance = position.Distance(gravitational_body.position) + if(!distance) + continue + var/acceleration_amount = (GRAVITATIONAL_CONSTANT * gravitational_body.mass) / (distance * distance) + //Calculate acceleration direction + var/datum/orbital_vector/direction = new (gravitational_body.position.x - position.x, gravitational_body.position.y - position.y) + direction.Normalize() + direction.Scale(acceleration_amount) + //Add on the gravitational acceleration + acceleration_per_second.Add(direction) + //Divide acceleration per second by the tick rate + accelerate_towards(acceleration_per_second, delta_time) + + //=================================== + // ORBIT CORRECTION + //=================================== + //Some objects may automatically thrust to maintain a stable orbit + if(maintain_orbit && target_orbital_body) + //Velocity should always be perpendicular to the planet + var/datum/orbital_vector/perpendicular_vector = new(position.y - target_orbital_body.position.y, target_orbital_body.position.x - position.x) + //Calculate the relative velocity we should have + perpendicular_vector.Normalize() + perpendicular_vector.Scale(relative_velocity_required) + //Set it because we are a lazy shit + velocity = perpendicular_vector.Add(target_orbital_body.velocity) + + //=================================== + // MOVEMENT + //=================================== + //Remember this + var/prev_x = position.x + var/prev_y = position.y + + //Move the gravitational body. + var/datum/orbital_vector/vel_new = new(velocity.x * delta_time * velocity_multiplier, velocity.y * delta_time * velocity_multiplier) + position.Add(vel_new) + + //Oh we moved btw + parent_map.on_body_move(src, prev_x, prev_y) + + //=================================== + // COLLISION CHECKING + //=================================== + var/colliding = FALSE + LAZYCLEARLIST(colliding_with) + + //Calculate our current position + var/section_x = round(position.x / ORBITAL_MAP_ZONE_SIZE) + var/section_y = round(position.y / ORBITAL_MAP_ZONE_SIZE) + + var/position_key = "[section_x],[section_y]" + var/valid_side_key = "none" + var/valid_front_key = "none" + var/valid_corner_key = "none" + + var/dir_flags = NONE + + var/segment_x = (position.x + abs(section_x) * ORBITAL_MAP_ZONE_SIZE) % ORBITAL_MAP_ZONE_SIZE + var/segment_y = (position.y + abs(section_y) * ORBITAL_MAP_ZONE_SIZE) % ORBITAL_MAP_ZONE_SIZE + + if(segment_x < ORBITAL_MAP_ZONE_SIZE / 3) + valid_side_key = "[section_x - 1],[section_y]" + dir_flags |= WEST + else if(segment_x > 2 * (ORBITAL_MAP_ZONE_SIZE / 3)) + valid_side_key = "[section_x + 1],[section_y]" + dir_flags |= EAST + + if(segment_y < ORBITAL_MAP_ZONE_SIZE / 3) + valid_front_key = "[section_x],[section_y - 1]" + dir_flags |= SOUTH + else if(segment_y > 2 * (ORBITAL_MAP_ZONE_SIZE / 3)) + valid_front_key = "[section_x],[section_y + 1]" + dir_flags |= NORTH + + //Check multiple zones + if(dir_flags & EAST) + if(dir_flags & NORTH) + valid_corner_key = "[section_x + 1],[section_y + 1]" + else if(dir_flags & SOUTH) + valid_corner_key = "[section_x + 1],[section_y - 1]" + else if(dir_flags & WEST) + if(dir_flags & NORTH) + valid_corner_key = "[section_x - 1],[section_y + 1]" + else if(dir_flags & SOUTH) + valid_corner_key = "[section_x - 1],[section_y - 1]" + + var/list/valid_objects = list() + + //Only check nearby segments for collision objects + if(parent_map.collision_zone_bodies[position_key]) + valid_objects += parent_map.collision_zone_bodies[position_key] + if(parent_map.collision_zone_bodies[valid_side_key]) + valid_objects += parent_map.collision_zone_bodies[valid_side_key] + if(parent_map.collision_zone_bodies[valid_front_key]) + valid_objects += parent_map.collision_zone_bodies[valid_front_key] + if(parent_map.collision_zone_bodies[valid_corner_key]) + valid_objects += parent_map.collision_zone_bodies[valid_corner_key] + + //Track our delta positional values for collision detection purposes + var/delta_x = position.x - prev_x + var/delta_y = position.y - prev_y + + for(var/datum/orbital_object/object as() in valid_objects) + if(object == src) + continue + if(!((collision_flags & object.collision_type) || (object.collision_flags & collision_type))) + continue + var/distance = object.position.Distance(position) + if(distance < radius + object.radius) + //Collision + LAZYADD(colliding_with, object) + collision(object) + //Static objects dont check collisions, so call their collision proc for them. + if(object.static_object) + object.collision(src) + colliding = TRUE + else if(!object.static_object) + //Vector collision. + //Note: We detect collisions that occursed in the current move rather than in the next. + //Position - Velocity -> Position + //Detects collisions for when 2 objects pass each other. + //Get the intersection point + //Must be between 0 and 1 + var/other_x + var/other_y + var/other_delta_x = object.velocity.x + var/other_delta_y = object.velocity.y + if(object.last_update_tick == last_update_tick) + //They are on the same tick as us + other_x = object.position.x - other_delta_x + other_y = object.position.y - other_delta_y + else + //They are still on the previous tick + other_x = object.position.x + other_y = object.position.y + //ALRIGHT LETS DO THE CHECK + //Reassign variables for ease of read. + var/px = prev_x + var/py = prev_y + var/vx = delta_x + var/vy = delta_y + var/px2 = other_x + var/py2 = other_y + var/vx2 = other_delta_x + var/vy2 = other_delta_y + //Both must be moving + if((vx || vy) && (vx2 || vy2)) + //Collision between 2 vectors using simultaneous equations. + var/mu = (vx * py2 + vy * px - py * vx - vy * px2) / (vy * vx2 - vx * vy2) + var/lambda = (px2 + vx2 * mu - px) / vx + if(lambda >= 0 && lambda <= 1 && mu >= 0 && mu <= 1) + //Collision + LAZYADD(colliding_with, object) + collision(object) + colliding = TRUE + if(!colliding) + collision_ignored = FALSE + +//We do a little suvatting +/datum/orbital_object/proc/accelerate_towards(datum/orbital_vector/acceleration_vector, time) + velocity.Add(acceleration_vector.Scale(time)) + +//Called when we collide with another orbital object. +//Make sure to check if(other.collision_ignored || collision_ignored) +/datum/orbital_object/proc/collision(datum/orbital_object/other) + return + +/datum/orbital_object/proc/set_orbitting_around_body(datum/orbital_object/target_body, orbit_radius = 10, force = FALSE) + if(orbitting && !force) + return + var/prev_x = position.x + var/prev_y = position.y + orbitting = TRUE + //Calculates the required velocity for the object to orbit around the target body. + //Hopefully the planets gravity doesn't fuck with each other too hard. + //Set position + var/delta_x = -position.x + var/delta_y = -position.y + position.x = target_body.position.x + orbit_radius + position.y = target_body.position.y + delta_x += position.x + delta_y += position.y + //Move all orbitting b()odies too. + if(orbitting_bodies) + for(var/datum/orbital_object/object in orbitting_bodies) + object.position.Add(new /datum/orbital_vector(delta_x, delta_y)) + //Set velocity + var/relative_velocity = sqrt((GRAVITATIONAL_CONSTANT * (target_body.mass + mass)) / orbit_radius) + velocity.x = target_body.velocity.x + velocity.y = target_body.velocity.y + relative_velocity + //Set random angle + var/random_angle = rand(0, 360) //Is cos and sin in radians? + position.Rotate(random_angle) + velocity.Rotate(random_angle) + //Update target + target_orbital_body = target_body + LAZYADD(target_body.orbitting_bodies, src) + relative_velocity_required = relative_velocity + //We moved, make sure to update the map. + var/datum/orbital_map/parent_map = SSorbits.orbital_maps[orbital_map_index] + parent_map.on_body_move(src, prev_x, prev_y) + +/datum/orbital_object/proc/post_map_setup() + return diff --git a/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/beacon.dm b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/beacon.dm new file mode 100644 index 0000000000000..5a4c7882fa35b --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/beacon.dm @@ -0,0 +1,131 @@ +/datum/orbital_object/z_linked/beacon + name = "Unidentified Signal" + mass = 0 + radius = 30 + can_dock_anywhere = TRUE + //The attached event + var/datum/ruin_event/ruin_event + +/datum/orbital_object/z_linked/beacon/New() + . = ..() + var/datum/orbital_map/linked_map = SSorbits.orbital_maps[orbital_map_index] + ruin_event = SSorbits.get_event() + if(ruin_event?.warning_message) + name = "[initial(name)] #[rand(1, 9)][linked_map.object_count][rand(1, 9)] ([ruin_event.warning_message])" + else + name = "[initial(name)] #[rand(1, 9)][linked_map.object_count][rand(1, 9)]" + //Link the ruin event to ourselves + ruin_event?.linked_z = src + +/datum/orbital_object/z_linked/beacon/post_map_setup() + //Orbit around the systems sun + var/datum/orbital_map/linked_map = SSorbits.orbital_maps[orbital_map_index] + set_orbitting_around_body(linked_map.center, 4000 + 250 * linked_z_level[1].z_value) + +/datum/orbital_object/z_linked/beacon/weak + name = "Weak Signal" + +//==================== +// Asteroids +//==================== + +/datum/orbital_object/z_linked/beacon/ruin/asteroid + name = "Asteroid" + +/datum/orbital_object/z_linked/beacon/ruinasteroid/New() + . = ..() + radius = rand(30, 70) + +/datum/orbital_object/z_linked/beacon/ruin/asteroid/assign_z_level() + var/datum/space_level/assigned_space_level = SSzclear.get_free_z_level() + linked_z_level = list(assigned_space_level) + assigned_space_level.orbital_body = src + generate_asteroids(world.maxx / 2, world.maxy / 2, assigned_space_level.z_value, 120, rand(-0.5, 0), rand(40, 70)) + +/datum/orbital_object/z_linked/beacon/ruin/asteroid/post_map_setup() + //Orbit around the systems central gravitional body + //Pack closely together to make an asteriod belt. + var/datum/orbital_map/linked_map = SSorbits.orbital_maps[orbital_map_index] + set_orbitting_around_body(linked_map.center, 1200 + 20 * rand(-10, 10)) + +//==================== +// Regular Ruin Z-levels +//==================== + +/datum/orbital_object/z_linked/beacon/ruin/spaceruin + name = "Unknown Signal" + +/datum/orbital_object/z_linked/beacon/ruin/spaceruin/New() + . = ..() + SSorbits.ruin_levels ++ + +/datum/orbital_object/z_linked/beacon/ruin/spaceruin/Destroy(force, ...) + . = ..() + SSorbits.ruin_levels -- + +/datum/orbital_object/z_linked/beacon/ruin/spaceruin/assign_z_level() + var/datum/space_level/assigned_space_level = SSzclear.get_free_z_level() + linked_z_level = list(assigned_space_level) + assigned_space_level.orbital_body = src + seedRuins(list(assigned_space_level.z_value), CONFIG_GET(number/space_budget), /area/space, SSmapping.space_ruins_templates) + +/datum/orbital_object/z_linked/beacon/ruin/spaceruin/post_map_setup() + //Orbit around the systems sun + var/datum/orbital_map/linked_map = SSorbits.orbital_maps[orbital_map_index] + set_orbitting_around_body(linked_map.center, 4000 + 250 * rand(4, 20)) + +//==================== +// Random-Ruin z-levels +//==================== +/datum/orbital_object/z_linked/beacon/ruin + //The linked objective to the ruin, for generating extra stuff if required. + var/datum/orbital_objective/linked_objective + +/datum/orbital_object/z_linked/beacon/ruin/Destroy() + //Remove linked objective. + if(linked_objective) + linked_objective.linked_beacon = null + linked_objective = null + . = ..() + +/datum/orbital_object/z_linked/beacon/ruin/proc/assign_z_level() + var/datum/space_level/assigned_space_level = SSzclear.get_free_z_level() + linked_z_level = list(assigned_space_level) + assigned_space_level.orbital_body = src + generate_space_ruin(world.maxx / 2, world.maxy / 2, assigned_space_level.z_value, 100, 100, linked_objective, null, ruin_event) + +/datum/orbital_object/z_linked/beacon/ruin/post_map_setup() + //Orbit around the systems sun + var/datum/orbital_map/linked_map = SSorbits.orbital_maps[orbital_map_index] + set_orbitting_around_body(linked_map.center, 4000 + 250 * rand(4, 20)) + +//==================== +//Stranded shuttles +//==================== +/datum/orbital_object/z_linked/beacon/ruin/stranded_shuttle + name = "Distress Beacon" + static_object = TRUE + +/datum/orbital_object/z_linked/beacon/ruin/stranded_shuttle/assign_z_level() + var/datum/space_level/assigned_space_level = SSzclear.get_free_z_level() + linked_z_level = list(assigned_space_level) + assigned_space_level.orbital_body = src + generate_asteroids(world.maxx / 2, world.maxy / 2, assigned_space_level.z_value, 120, -0.4, 40) + +/datum/orbital_object/z_linked/beacon/ruin/stranded_shuttle/post_map_setup() + return + +//==================== +//Interdiction +//==================== +/datum/orbital_object/z_linked/beacon/ruin/interdiction + name = "Distress Beacon" + static_object = TRUE + +/datum/orbital_object/z_linked/beacon/ruin/interdiction/assign_z_level() + var/datum/space_level/assigned_space_level = SSzclear.get_free_z_level() + linked_z_level = list(assigned_space_level) + assigned_space_level.orbital_body = src + +/datum/orbital_object/z_linked/beacon/ruin/interdiction/post_map_setup() + return diff --git a/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/custom_shuttle.dm b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/custom_shuttle.dm new file mode 100644 index 0000000000000..65ca032be59a6 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/custom_shuttle.dm @@ -0,0 +1,17 @@ +/datum/orbital_object/shuttle/custom_shuttle + name = "Custom Shuttle" + var/fuel_consumption_rate = 1 + var/obj/machinery/computer/shuttle_flight/custom_shuttle/attached_console + +/datum/orbital_object/shuttle/custom_shuttle/Destroy() + attached_console = null + . = ..() + +/datum/orbital_object/shuttle/custom_shuttle/process() + if(!attached_console) + return + attached_console.consume_fuel(ORBITAL_UPDATE_RATE_SECONDS * fuel_consumption_rate * thrust / 100) + if(attached_console.check_stranded()) + return + max_thrust = (5 * arctan(attached_console.calculated_acceleration / 20)) / 90 + . = ..() diff --git a/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/lavaland.dm b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/lavaland.dm new file mode 100644 index 0000000000000..8dc41b40e6f3e --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/lavaland.dm @@ -0,0 +1,12 @@ +/datum/orbital_object/z_linked/lavaland + name = "Lavaland" + mass = 10000 + radius = 200 + forced_docking = TRUE + static_object = TRUE + random_docking = TRUE + +/datum/orbital_object/z_linked/lavaland/New() + . = ..() + var/datum/orbital_map/linked_map = SSorbits.orbital_maps[orbital_map_index] + linked_map.center = src diff --git a/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/meteor.dm b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/meteor.dm new file mode 100644 index 0000000000000..6df0624fbd43e --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/meteor.dm @@ -0,0 +1,71 @@ +/datum/orbital_object/meteor + name = "Meteor" + collision_type = COLLISION_METEOR + collision_flags = COLLISION_SHUTTLES | COLLISION_Z_LINKED + var/datum/orbital_object/target + var/list/meteor_types + var/start_tick + var/end_tick + var/start_x + var/start_y + var/end_x + var/end_y + +/datum/orbital_object/meteor/New() + . = ..() + start_tick = world.time + end_tick = world.time + 10 MINUTES + radius = rand(10, 50) + +/datum/orbital_object/meteor/Destroy() + target = null + meteor_types = null + . = ..() + +/datum/orbital_object/meteor/process() + . = ..() + if(!QDELETED(target)) + end_x = target.position.x + end_y = target.position.y + var/current_tick = world.time + var/tick_proportion = (current_tick - start_tick) / (end_tick - start_tick) + var/current_x = (end_x * tick_proportion) + (start_x * (1 - tick_proportion)) + var/current_y = (end_y * tick_proportion) + (start_y * (1 - tick_proportion)) + MOVE_ORBITAL_BODY(src, current_x, current_y) + if(abs(position.x) > 10000 || abs(position.y) > 10000) + qdel(src) + +/datum/orbital_object/meteor/collision(datum/orbital_object/other) + //If we collide with a shuttle, do a little explosion + if(istype(other, /datum/orbital_object/shuttle)) + var/datum/orbital_object/shuttle/shuttleobj = other + if(shuttleobj.port) + for(var/i in 1 to 5) + impact_turfs(shuttleobj.port.return_turfs()) + //If we collide with a z-linked, spawn a meteor on that z-level + if(istype(other, /datum/orbital_object/z_linked)) + var/datum/orbital_object/z_linked/z_linked = other + if(!z_linked.can_dock_anywhere && !z_linked.random_docking) + return + if(!LAZYLEN(z_linked.linked_z_level)) + return + var/datum/space_level/space_level = pick(z_linked.linked_z_level) + //Check protected levels + if(space_level.traits[ZTRAIT_CENTCOM] || space_level.traits[ZTRAIT_REEBE]) + return + //Check level flags for planetary bodies + if(space_level.traits[ZTRAIT_MINING]) + for(var/i in 1 to 5) + meteor_impact(locate(rand(10, world.maxx - 10), rand(10, world.maxx-10), space_level.z_value)) + else + //Spawn meteor wave + spawn_meteors(5, meteor_types, space_level.z_value) + qdel(src) + +/datum/orbital_object/meteor/proc/impact_turfs(list/valid_turfs) + if(length(valid_turfs)) + meteor_impact(pick(valid_turfs)) + +//Fall from the sky +/datum/orbital_object/meteor/proc/meteor_impact(turf/T) + new /obj/effect/falling_meteor(T, meteor_types ? pick(meteor_types) : null) diff --git a/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/phobos.dm b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/phobos.dm new file mode 100644 index 0000000000000..715f696ae842a --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/phobos.dm @@ -0,0 +1,11 @@ +//Centcom Z-Level. +//Syndicate infiltrator level. +/datum/orbital_object/z_linked/phobos + name = "Phobos" + mass = 500 + radius = 130 + +/datum/orbital_object/z_linked/phobos/post_map_setup() + //Orbit around the systems sun + var/datum/orbital_map/linked_map = SSorbits.orbital_maps[orbital_map_index] + set_orbitting_around_body(linked_map.center, 3800) diff --git a/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/shuttle.dm b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/shuttle.dm new file mode 100644 index 0000000000000..56f46c0b1790e --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/shuttle.dm @@ -0,0 +1,193 @@ +/datum/orbital_object/shuttle + name = "Shuttle" + collision_type = COLLISION_SHUTTLES + collision_flags = COLLISION_Z_LINKED | COLLISION_METEOR + var/shuttle_port_id + //Shuttle data + var/max_thrust = 2 + //Controls + var/thrust = 0 + var/angle = 0 + //Valid docking locations + var/list/valid_docks = list() + //Docking + var/docking_frozen = FALSE + var/datum/orbital_object/z_linked/can_dock_with + var/datum/orbital_object/z_linked/docking_target + + var/desired_vel_x = 0 + var/desired_vel_y = 0 + + //They go faster + velocity_multiplier = 3 + + //The computer controlling us. + var/controlling_computer = null + + var/obj/docking_port/mobile/port + + //Semi-Autopilot controls + var/datum/orbital_vector/shuttleTargetPos + + //AUTOPILOT CONTROLS. + //Is autopilot enabled. + //Determines if the autopilot should fly to the + var/autopilot = FALSE + //The target, speeds are calulated relative to this. + var/datum/orbital_object/shuttleTarget + //Cheating autopilots never fail + var/cheating_autopilot = FALSE + +/datum/orbital_object/shuttle/stealth/infiltrator + max_thrust = 2.5 + +/datum/orbital_object/shuttle/stealth/steel_rain + max_thrust = 0 + //We never miss our mark + cheating_autopilot = TRUE + +/datum/orbital_object/shuttle/stealth + stealth = TRUE + +/datum/orbital_object/shuttle/Destroy() + port = null + can_dock_with = null + docking_target = null + valid_docks = null + shuttleTarget = null + . = ..() + SSorbits.assoc_shuttles.Remove(shuttle_port_id) + +//Dont fly into the sun idiot. +/datum/orbital_object/shuttle/explode() + if(port) + port.jumpToNullSpace() + qdel(src) + +/datum/orbital_object/shuttle/process() + if(check_stuck()) + return + + if(!QDELETED(docking_target)) + velocity.x = 0 + velocity.y = 0 + MOVE_ORBITAL_BODY(src, docking_target.position.x, docking_target.position.y) + //Disable autopilot and thrust while docking to prevent fuel usage. + thrust = 0 + angle = 0 + autopilot = FALSE + return + else + //If our docking target was deleted, null it to prevent docking interface etc. + docking_target = null + //I hate that I have to do this, but people keep flying them away. + if(position.x > 20000 || position.x < -20000 || position.y > 20000 || position.y < -20000) + priority_announce("Bluespace reality fracture detected, source: [name].") + MOVE_ORBITAL_BODY(src, rand(-2000, 2000), rand(-2000, 2000)) + velocity.x = 0 + velocity.y = 0 + thrust = 0 + //AUTOPILOT + handle_autopilot() + //Do thrust + var/thrust_amount = thrust * max_thrust / 100 + var/thrust_x = cos(angle) * thrust_amount + var/thrust_y = sin(angle) * thrust_amount + accelerate_towards(new /datum/orbital_vector(thrust_x, thrust_y), ORBITAL_UPDATE_RATE_SECONDS) + //Do gravity and movement + can_dock_with = null + . = ..() + +/datum/orbital_object/shuttle/proc/check_stuck() + if(!port) + return FALSE + if(!is_reserved_level(port.z) && port.mode == SHUTTLE_IDLE) + message_admins("Shuttle [shuttle_port_id] is not on a reserved Z-Level but is somehow registered as in flight! Automatically fixing...") + log_runtime("Shuttle [shuttle_port_id] is not on a reserved Z-Level but is somehow registered as in flight! Removing shuttle object.") + qdel(src) + return TRUE + return FALSE + +/datum/orbital_object/shuttle/proc/handle_autopilot() + var/datum/orbital_vector/target_pos = shuttleTargetPos + + if(autopilot) + target_pos = shuttleTarget.position + + if(docking_target || !target_pos) + return + + //Relative velocity to target needs to point towards target. + var/distance_to_target = position.Distance(target_pos) + + //Cheat and slow down. + //Remove this if you make better autopilot logic ever. + if(distance_to_target < 100 && velocity.Length() > 25) + velocity.Normalize() + velocity.Scale(20) + + //If there is an object in the way, we need to fly around it. + var/datum/orbital_vector/next_position = target_pos + + //Adjust our speed to target to point towards it. + var/datum/orbital_vector/desired_velocity = new(next_position.x - position.x, next_position.y - position.y) + var/desired_speed = distance_to_target * 0.02 + 10 + desired_velocity.Normalize() + desired_velocity.Scale(desired_speed) + + //Adjust thrust to make our velocity = desired_velocity + var/thrust_dir_x = desired_velocity.x - velocity.x + var/thrust_dir_y = desired_velocity.y - velocity.y + + desired_vel_x = desired_velocity.x + desired_vel_y = desired_velocity.y + + //message_admins("Thrusting in dir: [thrust_dir_y], [thrust_dir_x]") + //message_admins("Next pos: [next_position.x], [next_position.y]") + + if(!thrust_dir_x) + if(!thrust_dir_y) + thrust = 0 + return + angle = thrust_dir_y > 0 ? 90 : -90 + else + angle = arctan(thrust_dir_y / thrust_dir_x) + //Account for ambiguous cases + if(thrust_dir_x < 0) + if(thrust_dir_y > 0) + angle = -180 + angle + else + angle = 180 + angle + + //message_admins("Angle: [angle]") + + //FULL SPEED + thrust = 100 + //Auto dock + if(shuttleTarget && can_dock_with == shuttleTarget) + commence_docking(shuttleTarget, TRUE) + + //Fuck all that, we cheat anyway + if(cheating_autopilot) + velocity.x = desired_vel_x + velocity.y = desired_vel_y + +/datum/orbital_object/shuttle/proc/link_shuttle(obj/docking_port/mobile/dock) + name = dock.name + shuttle_port_id = dock.id + port = dock + stealth = dock.hidden + SSorbits.assoc_shuttles[shuttle_port_id] = src + +/datum/orbital_object/shuttle/proc/commence_docking(datum/orbital_object/z_linked/docking, forced = FALSE) + //Check for valid docks on z-level + if(!docking.forced_docking && !forced) + can_dock_with = docking + return + //Begin docking. + docking_target = docking + //Check for ruin stuff + var/datum/orbital_object/z_linked/beacon/ruin/ruin_obj = docking_target + if(istype(ruin_obj)) + if(!ruin_obj.linked_z_level) + ruin_obj.assign_z_level() diff --git a/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/space_station.dm b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/space_station.dm new file mode 100644 index 0000000000000..9de41a6c8b925 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/space_station.dm @@ -0,0 +1,21 @@ +/datum/orbital_object/z_linked/station + name = "Space Station 13" + mass = 0 + radius = 30 + //The station maintains its orbit around lavaland by adjustment thrusters. + maintain_orbit = TRUE + //Sure, why not? + can_dock_anywhere = TRUE + +/datum/orbital_object/z_linked/station/New() + . = ..() + SSorbits.station_instance = src + +/datum/orbital_object/z_linked/station/explode() + . = ..() + SSticker.force_ending = TRUE + +/datum/orbital_object/z_linked/station/post_map_setup() + //Orbit around the system center + var/datum/orbital_map/linked_map = SSorbits.orbital_maps[orbital_map_index] + set_orbitting_around_body(linked_map.center, 2500) diff --git a/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/star.dm b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/star.dm new file mode 100644 index 0000000000000..eb931382cf742 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/star.dm @@ -0,0 +1,20 @@ +/datum/orbital_object/star + name = "Stellar Body" + mass = 100000 + radius = 200 + static_object = TRUE + collision_flags = ALL + +/datum/orbital_object/star/collision(datum/orbital_object/other) + //You got lucky this time + if(other.collision_ignored || collision_ignored) + return + //You didnt get lucky this time + message_admins("Orbital body [other.name] collided with the star [name] and was destroyed.") + log_game("Orbital body [other.name] collided with the star [name] and was destroyed.") + //Rip. + if(istype(other, /datum/orbital_object/star)) + //Make a black hole or something + return + //Destroy the other orbital object. + other.explode() diff --git a/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/z_linked.dm b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/z_linked.dm new file mode 100644 index 0000000000000..abcef1e33b074 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_objects/z_linked.dm @@ -0,0 +1,65 @@ +/datum/orbital_object/z_linked + name = "Unidentified Beacon" + collision_type = COLLISION_Z_LINKED + collision_flags = COLLISION_SHUTTLES + //The space level(s) we are linked to + var/list/datum/space_level/linked_z_level + //If docking is forced upon collision + //If you hit a planet, you are going to the planet whether you like it or not. + var/forced_docking = FALSE + //Can you dock on this Z-level anywhere? + var/can_dock_anywhere = FALSE + //If we can't dock anywhere, will we just crash on the Z-level at a random position? + var/random_docking = FALSE + //Inherit the name of z-level? + var/inherit_name = FALSE + //are we generateing + var/is_generating = FALSE + +/datum/orbital_object/z_linked/proc/link_to_z(datum/space_level/level) + LAZYADD(linked_z_level, level) + if(inherit_name) + name = level.name + +/datum/orbital_object/z_linked/explode() + message_admins("ORBITAL BODY [name] WAS DESTROYED.") + log_game("Orbital body [name] was destroyed.") + //Holy shit this is bad. + for(var/mob/living/L in GLOB.mob_living_list) + for(var/datum/space_level/level as() in linked_z_level) + if(L.z == level.z_value) + qdel(L) + break + //Prevent access to the z-level. + //Announcement + priority_announce("The orbital body [name] has been destroyed. Transit to this location is no longer possible.", "Nanotrasen Orbital Body Division") + qdel(src) + +/datum/orbital_object/z_linked/collision(datum/orbital_object/other) + //Send shuttle to z-level for docking. + if(istype(other, /datum/orbital_object/shuttle)) + //send them to the place + var/datum/orbital_object/shuttle/shuttle = other + //Check if shuttle can dock at this location. + if(!random_docking && !(can_dock_anywhere && (!GLOB.shuttle_docking_jammed || shuttle.stealth || !istype(src, /datum/orbital_object/z_linked/station)))) + var/can_dock_here = FALSE + for(var/port_name in shuttle.valid_docks) + var/obj/docking_port/port = SSshuttle.getDock(port_name) + if(z_in_contents(port?.z)) + can_dock_here = TRUE + break + if(!can_dock_here) + return + if(other.collision_ignored || collision_ignored) + //Collisions are currently ignored, give the ability to dock via a button and dont force it + shuttle.can_dock_with = src + return + shuttle.commence_docking(src) + +/datum/orbital_object/z_linked/proc/z_in_contents(z_value) + if(!LAZYLEN(linked_z_level)) + return FALSE + for(var/datum/space_level/level as() in linked_z_level) + if(level.z_value == z_value) + return TRUE + return FALSE diff --git a/code/modules/shuttle/super_cruise/orbital_map_components/orbital_vector.dm b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_vector.dm new file mode 100644 index 0000000000000..0278af153a8c1 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_map_components/orbital_vector.dm @@ -0,0 +1,64 @@ +//Orbital vectors +//I hate that some of these modify src and the others just return a valid +// - bacon + +/datum/orbital_vector + var/x = 0 + var/y = 0 + +/datum/orbital_vector/New(_x = 0, _y = 0) + . = ..() + x = _x + y = _y + +//Adds 2 vectors together +/datum/orbital_vector/proc/Add(datum/orbital_vector/other) + src.x += other.x + src.y += other.y + return src + +//Scales the vector by scalar_amount +/datum/orbital_vector/proc/Scale(scalar_amount) + x *= scalar_amount + y *= scalar_amount + return src + +//Returns magnitude of the vector +/datum/orbital_vector/proc/Length() + return sqrt(x * x + y * y) + +//Returns distanace between 2 positional vectors +/datum/orbital_vector/proc/Distance(datum/orbital_vector/other) + var/delta_x = other.x - x + var/delta_y = other.y - y + return sqrt(delta_x * delta_x + delta_y * delta_y) + +//Make the vector length 1 +/datum/orbital_vector/proc/Normalize() + var/total = Length() + if(!total) + x = 0 + y = 1 + return src + x = x / total + y = y / total + return src + +/datum/orbital_vector/proc/Rotate(angle) + var/_x = x + x = x * cos(angle) - y * sin(angle) + y = _x * sin(angle) + y * cos(angle) + return src + +//Assuming we are a position vector +//Takes in position and direction of a line. +/datum/orbital_vector/proc/ShortestDistanceToLine(datum/orbital_vector/position, datum/orbital_vector/direction) + if(!direction.x && !direction.y) + return INFINITY + //Uhhhhhhhhhh. + if(!x && !y) + x = 1 + y = 1 + var/lambda = (x * x + y * y - position.x * x - position.y * y) / (direction.x * x + direction.y * y) + var/datum/orbital_vector/closestPoint = new(position.x + direction.x * lambda, position.y + direction.y * lambda) + return closestPoint.Distance(src) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/_orbital_objective.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/_orbital_objective.dm new file mode 100644 index 0000000000000..c509422012366 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/_orbital_objective.dm @@ -0,0 +1,53 @@ +/datum/orbital_objective + var/name = "Null Objective" + var/datum/orbital_object/z_linked/beacon/ruin/linked_beacon + var/payout = 0 + var/completed = FALSE + var/min_payout = 0 + var/max_payout = 0 + var/id = 0 + var/station_name + var/static/objective_num = 0 + +/datum/orbital_objective/New() + . = ..() + id = objective_num ++ + station_name = new_station_name() + +/datum/orbital_objective/proc/on_assign(obj/machinery/computer/objective/objective_computer) + return + +/datum/orbital_objective/proc/generate_objective_stuff(turf/chosen_turf) + return + +/datum/orbital_objective/proc/check_failed() + return TRUE + +/datum/orbital_objective/proc/get_text() + return "" + +/datum/orbital_objective/proc/announce() + priority_announce(get_text(), "Central Command Report", SSstation.announcer.get_rand_report_sound()) + +/datum/orbital_objective/proc/generate_payout() + payout = rand(min_payout, max_payout) + +/datum/orbital_objective/proc/generate_attached_beacon() + linked_beacon = new + linked_beacon.name = "(OBJECTIVE) [linked_beacon.name]" + linked_beacon.linked_objective = src + +/datum/orbital_objective/proc/complete_objective() + if(completed) + //Delete + QDEL_NULL(SSorbits.current_objective) + return + completed = TRUE + //Handle payout + SSeconomy.distribute_funds(payout) + GLOB.exploration_points += payout * 0.1 + //Announcement + priority_announce("Central Command priority objective completed. [payout] credits have been \ + distributed across departmental budgets. [payout * 0.1] points have been distrubted to exploration vendors.", "Central Command Report", SSstation.announcer.get_rand_report_sound()) + //Delete + QDEL_NULL(SSorbits.current_objective) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/alien_artifact.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/alien_artifact.dm new file mode 100644 index 0000000000000..686d501857c89 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/alien_artifact.dm @@ -0,0 +1,524 @@ + +/obj/item/alienartifact + name = "artifact" + desc = "A strange artifact of unknown origin." + icon = 'icons/obj/artifact.dmi' + icon_state = "artifact" + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + var/list/datum/artifact_effect/effects + +/obj/item/alienartifact/examine(mob/user) + . = ..() + var/mob/living/L = user + if(istype(L) && L.mind?.assigned_role != "Curator") + return + for(var/datum/artifact_effect/effect in effects) + for(var/verb in effect.effect_act_descs) + . += "[src] likely does something when [verb]." + +/obj/item/alienartifact/ComponentInitialize() + AddComponent(/datum/component/discoverable, 10000, TRUE) + +/obj/item/alienartifact/objective/ComponentInitialize() + . = ..() + AddComponent(/datum/component/gps, "[scramble_message_replace_chars("#########", 100)]", TRUE) + +/obj/item/alienartifact/Initialize() + . = ..() + effects = list() + for(var/i in 1 to pick(1, 500; 2, 70; 3, 20; 1)) + var/picked_type = pick(subtypesof(/datum/artifact_effect)) + var/valid = TRUE + var/datum/artifact_effect/effect = new picked_type + for(var/datum/artifact_effect/old_effect as() in effects) + //Cant have the same one twice + if(istype(old_effect, picked_type)) + valid = FALSE + qdel(effect) + break + //Cant have incompatible signals + for(var/signal_type in old_effect.signal_types) + if(signal_type in effect.signal_types) + valid = FALSE + qdel(effect) + break + if(valid) + effect.register_signals(src) + effect.Initialize(src) + effects += effect + +/obj/item/alienartifact/Destroy() + . = ..() + QDEL_LIST(effects) + +/area/tear_in_reality + name = "tear in the fabric of reality" + area_flags = UNIQUE_AREA | HIDDEN_AREA + clockwork_warp_allowed = FALSE + requires_power = FALSE + mood_bonus = -999 + has_gravity = STANDARD_GRAVITY + ambience_index = AMBIENCE_NONE + sound_environment = SOUND_ENVIRONMENT_DRUGGED + teleport_restriction = TELEPORT_ALLOW_NONE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/tear_in_reality/Initialize() + . = ..() + mood_message = "[scramble_message_replace_chars("###### ### #### ###### #######", 100)]!" + +/area/tear_in_reality/get_virtual_z(turf/T) + return REALITY_TEAR_VIRTUAL_Z + +//=================== +// Raw artifact datum +//=================== + +/datum/artifact_effect + var/requires_processing = FALSE + var/effect_act_descs = list() //List of verbs for things that can be done with the artifact. + var/obj/item/source_object + var/list/signal_types = list() + +/datum/artifact_effect/proc/register_signals(source) + return + +/datum/artifact_effect/proc/Initialize(source) + source_object = source + if(requires_processing) + START_PROCESSING(SSobj, src) + +/datum/artifact_effect/Destroy() + if(requires_processing) + STOP_PROCESSING(SSobj, src) + +//=================== +// Chaos Throw +//=================== + +/datum/artifact_effect/throwchaos + signal_types = list(COMSIG_MOVABLE_PRE_THROW) + effect_act_descs = list("thrown") + +/datum/artifact_effect/throwchaos/register_signals(source) + RegisterSignal(source, COMSIG_MOVABLE_PRE_THROW, .proc/throw_thing_randomly) + +/datum/artifact_effect/throwchaos/proc/throw_thing_randomly(datum/source, list/arguments) + if(prob(40)) + return + var/atom/new_throw_target = pick(view(5, source)) + if(ismovable(new_throw_target)) + arguments[1] = new_throw_target //target + arguments[2] = 5 //range + arguments[3] = 4 //speed + +//=================== +// Laughing +//=================== + +/datum/artifact_effect/soundindark + requires_processing = TRUE + effect_act_descs = list("in darkness") + +/datum/artifact_effect/soundindark/process(delta_time) + var/turf/T = get_turf(source_object) + if(!T || T.get_lumcount()) + return + if(prob(5)) + playsound(T, pick('sound/voice/human/womanlaugh.ogg', 'sound/voice/human/manlaugh1.ogg'), 40) + +//=================== +// Spasm inducing +//=================== + +/datum/artifact_effect/inducespasm + signal_types = list(COMSIG_PARENT_EXAMINE) + effect_act_descs = list("examined") + +/datum/artifact_effect/inducespasm/register_signals(source) + RegisterSignal(source, COMSIG_PARENT_EXAMINE, .proc/do_effect) + +/datum/artifact_effect/inducespasm/proc/do_effect(datum/source, mob/observer, list/examine_text) + if(ishuman(observer)) + var/mob/living/carbon/human/H = observer + H.gain_trauma(/datum/brain_trauma/mild/muscle_spasms, TRAUMA_RESILIENCE_BASIC) + +//=================== +// Projectile Reflector +//=================== + +/atom/movable/proximity_monitor_holder + var/datum/proximity_monitor/monitor + var/datum/callback/callback + +/atom/movable/proximity_monitor_holder/Initialize(mapload, datum/proximity_monitor/_monitor, datum/callback/_callback) + monitor = _monitor + callback = _callback + + monitor.hasprox_receiver = src + +/atom/movable/proximity_monitor_holder/HasProximity(atom/movable/AM) + return callback.Invoke(AM) + +/atom/movable/proximity_monitor_holder/Destroy() + QDEL_NULL(monitor) + QDEL_NULL(callback) + return ..() + +/datum/artifact_effect/projreflect + effect_act_descs = list("shot at") + var/atom/movable/proximity_monitor_holder/monitor_holder + +/datum/artifact_effect/projreflect/Initialize(source) + . = ..() + if(monitor_holder) + QDEL_NULL(monitor_holder) + var/datum/proximity_monitor/monitor = new(source, 3, FALSE) + monitor_holder = new(null, monitor, CALLBACK(src, .proc/HasProximity)) + +/datum/artifact_effect/projreflect/Destroy() + QDEL_NULL(monitor_holder) + return ..() + +/datum/artifact_effect/projreflect/proc/HasProximity(atom/movable/AM) + if(istype(AM, /obj/item/projectile)) + var/obj/item/projectile/P = AM + P.setAngle(rand(0, 360)) + P.ignore_source_check = TRUE //Allow the projectile to hit the shooter after it gets reflected + +//=================== +// Air Blocker +//=================== + +/datum/artifact_effect/airfreeze + signal_types = list(COMSIG_MOVABLE_MOVED) + effect_act_descs = list("depressurised") + +/datum/artifact_effect/airfreeze/Initialize(atom/source) + . = ..() + source.CanAtmosPass = ATMOS_PASS_NO + +/datum/artifact_effect/airfreeze/register_signals(source) + RegisterSignal(source, COMSIG_MOVABLE_MOVED, .proc/updateAir) + +/datum/artifact_effect/airfreeze/proc/updateAir(atom/source, atom/oldLoc) + if(isturf(oldLoc)) + var/turf/oldTurf = oldLoc + oldTurf.air_update_turf(TRUE) + if(isturf(source.loc)) + var/turf/newTurf = source.loc + newTurf.air_update_turf(TRUE) + +//=================== +// Atmos Stabilizer +//=================== + +/datum/artifact_effect/atmosfix + effect_act_descs = list("depressurised") + requires_processing = TRUE + +/datum/artifact_effect/atmosfix/process(delta_time) + var/turf/T = get_turf(source_object) + var/datum/gas_mixture/air = T.return_air() + air.parse_gas_string(T.initial_gas_mix) + +//=================== +// Gravity Well +//=================== + +/datum/artifact_effect/gravity_well + effect_act_descs = list("used") + signal_types = list(COMSIG_ITEM_ATTACK_SELF) + var/next_use_world_time = 0 + +/datum/artifact_effect/gravity_well/register_signals(source) + RegisterSignal(source, COMSIG_ITEM_ATTACK_SELF, .proc/suck) + +/datum/artifact_effect/gravity_well/proc/suck(datum/source, mob/warper) + if(world.time < next_use_world_time) + return + var/turf/T = get_turf(warper) + if(T) + goonchem_vortex(T, FALSE, 8) + playsound(source_object, 'sound/magic/repulse.ogg', 60) + next_use_world_time = world.time + 150 + +//=================== +// Access Modifier +// Just replaces access 4noraisin +//=================== + +/datum/artifact_effect/access + effect_act_descs = list("near something") + requires_processing = TRUE + var/next_use_time = 0 + +/datum/artifact_effect/access/process(delta_time) + if(world.time < next_use_time) + return + next_use_time = world.time + rand(30 SECONDS, 5 MINUTES) + var/list/idcards = list() + var/list/things_in_view = view(5, source_object) + for(var/mob/living/carbon/human/H in things_in_view) + if(H.get_idcard()) + idcards += H.get_idcard() + for(var/obj/item/card/id/id_card in things_in_view) + idcards += id_card + var/list/accesses_to_add = get_all_accesses() + for(var/obj/item/card/id/id_card as() in idcards) + if(length(id_card.access)) + id_card.access.Remove(pick(id_card.access)) + id_card.access |= pick(accesses_to_add) + +//=================== +// Reality Destabilizer +//=================== + +GLOBAL_LIST_EMPTY(destabilization_spawns) +GLOBAL_LIST_EMPTY(destabliization_exits) + +/obj/effect/landmark/destabilization_loc + name = "destabilization spawn" + +/obj/effect/landmark/destabilization_loc/Initialize() + ..() + GLOB.destabilization_spawns += get_turf(src) + return INITIALIZE_HINT_QDEL + +/datum/artifact_effect/reality_destabilizer + requires_processing = TRUE + effect_act_descs = list("near something") + var/cooldown = 0 + var/list/contained_things = list() + +/datum/artifact_effect/reality_destabilizer/Initialize(source) + . = ..() + GLOB.destabliization_exits += source + +/datum/artifact_effect/reality_destabilizer/Destroy() + for(var/atom/movable/AM as() in contained_things) + if(istype(get_area(AM), /area/tear_in_reality)) + AM.forceMove(get_turf(source_object)) + contained_things.Cut() + GLOB.destabliization_exits -= source_object + . = ..() + +/datum/artifact_effect/reality_destabilizer/process(delta_time) + if(world.time < cooldown) + return + cooldown = world.time + rand(0, 30 SECONDS) + var/turf/T = get_turf(source_object) + if(!T) + return + for(var/atom/movable/AM in view(3, T)) + if(AM == source_object) + continue + if(isobj(AM)) + var/obj/O = AM + if(O.resistance_flags & INDESTRUCTIBLE) + continue + if(AM.anchored) + continue + if(prob(3)) + destabilize(AM) + +/datum/artifact_effect/reality_destabilizer/proc/destabilize(atom/movable/AM) + //Banish to the void + addtimer(CALLBACK(src, .proc/restabilize, AM, get_turf(AM)), rand(10 SECONDS, 90 SECONDS)) + //Forcemove to ignore teleport checks + AM.forceMove(pick(GLOB.destabilization_spawns)) + contained_things += AM + +/datum/artifact_effect/reality_destabilizer/proc/restabilize(atom/movable/AM, turf/T) + if(QDELETED(src)) + return + if(QDELETED(AM)) + return + var/area/A = get_area(AM) + //already left the tear. + if(!istype(A, /area/tear_in_reality)) + return + AM.forceMove(T) + contained_things -= AM + +//=================== +// Teleport +//=================== + +/datum/artifact_effect/warp + signal_types = list(COMSIG_ITEM_ATTACK_SELF) + effect_act_descs = list("used") + var/next_use_world_time = 0 + +/datum/artifact_effect/warp/register_signals(source) + RegisterSignal(source, COMSIG_ITEM_ATTACK_SELF, .proc/teleport) + +/datum/artifact_effect/warp/proc/teleport(datum/source, mob/warper) + if(world.time < next_use_world_time) + return + var/turf/T = get_turf(warper) + if(T) + do_teleport(warper, pick(RANGE_TURFS(10, T)), channel = TELEPORT_CHANNEL_FREE) + next_use_world_time = world.time + 150 + +//=================== +// Curse +//=================== + +/datum/artifact_effect/curse + var/used = FALSE + effect_act_descs = list("picked up") + signal_types = list(COMSIG_ITEM_PICKUP) + +/datum/artifact_effect/curse/register_signals(source) + RegisterSignal(source, COMSIG_ITEM_PICKUP, .proc/curse) + +/datum/artifact_effect/curse/proc/curse(datum/source, mob/taker) + var/mob/living/carbon/human/H = taker + if(istype(H) && !used) + used = TRUE + H.gain_trauma(/datum/brain_trauma/magic/stalker, TRAUMA_LIMIT_LOBOTOMY) + +//=================== +// Gas ~~Remover~~ Converter +// Probably one of the most obvious but also the most potentially dangerous. +//=================== + +/datum/artifact_effect/gas_remove + requires_processing = TRUE + var/static/list/valid_inputs = list( + /datum/gas/oxygen = 6, + /datum/gas/nitrogen = 3, + /datum/gas/plasma = 1, + /datum/gas/carbon_dioxide = 1, + /datum/gas/water_vapor = 3 + ) + var/static/list/valid_outputs = list( + /datum/gas/bz = 3, + /datum/gas/hypernoblium = 1, + /datum/gas/miasma = 3, + /datum/gas/plasma = 3, + /datum/gas/tritium = 2, + /datum/gas/nitryl = 1 + ) + var/datum/gas/input + var/datum/gas/output + +/datum/artifact_effect/gas_remove/Initialize(source) + . = ..() + input = pickweight(valid_inputs) + effect_act_descs = list("near gas") + output = pickweight(valid_outputs) + +/datum/artifact_effect/gas_remove/process(delta_time) + var/turf/T = get_turf(source_object) + var/datum/gas_mixture/air = T.return_air() + var/input_id = initial(input.id) + var/output_id = initial(output.id) + var/moles = min(air.get_moles(input_id), 5) + if(moles) + air.adjust_moles(input_id, -moles) + air.adjust_moles(output_id, moles) + +//=================== +// Recharger +//=================== + +/datum/artifact_effect/recharger + effect_act_descs = list("near something") + requires_processing = TRUE + +/datum/artifact_effect/recharger/process(delta_time) + var/turf/T = get_turf(source_object) + if(!T) + return + for(var/atom/movable/thing in view(3, T)) + var/obj/item/stock_parts/cell/C = thing.get_cell() + if(C) + C.give(250 * delta_time) + thing.update_icon() + +//=================== +// Light Breaker +//=================== + +/datum/artifact_effect/light_breaker + requires_processing = TRUE + effect_act_descs = list("near something") + var/next_world_time + +/datum/artifact_effect/light_breaker/process(delta_time) + if(world.time < next_world_time) + return + var/turf/T = get_turf(source_object) + for(var/datum/light_source/light_source in T.affecting_lights) + var/atom/movable/AM = light_source.source_atom + //Starts at light but gets stronger the longer it is in light. + AM.lighteater_act() + next_world_time = world.time + rand(30 SECONDS, 5 MINUTES) + +//=================== +// Insanity Pulse +//=================== + +/datum/artifact_effect/insanity_pulse + var/next_use_time = 0 + var/cooldown + var/first_time = TRUE + signal_types = list(COMSIG_ITEM_ATTACK_SELF) + effect_act_descs = list("used") + +/datum/artifact_effect/insanity_pulse/Initialize(source) + . = ..() + cooldown = rand(5 MINUTES, 15 MINUTES) + +/datum/artifact_effect/insanity_pulse/register_signals(source) + RegisterSignal(source, COMSIG_ITEM_ATTACK_SELF, .proc/pulse) + +/datum/artifact_effect/insanity_pulse/proc/pulse(datum/source, mob/living/pulser) + if(!istype(pulser)) + return + if(world.time < next_use_time) + return + SEND_SOUND(world, 'sound/magic/repulse.ogg') + next_use_time = world.time + cooldown + var/turf/T = get_turf(pulser) + log_attack("[key_name_admin(pulser)] activated an insanity pulse at [COORD(T)]. [first_time ? " (Effects were unknown)" : " (Artifact had been activated before)"]") + message_admins("[ADMIN_LOOKUPFLW(pulser)] activated an insanity pulse [first_time ? " (Effects were unknown)" : " (Artifact had been activated before)"].") + if(first_time) + var/research_reward = rand(5000, 20000) + priority_announce("Spacetime anomaly detected at [T.loc]. Data analysis completed, [research_reward] research points rewarded.", "Nanotrasen Research Division", ANNOUNCER_SPANOMALIES) + SSresearch.science_tech.add_points_all(research_reward) + first_time = FALSE + var/xrange = 50 + var/yrange = 50 + var/cx = T.x + var/cy = T.y + pulser.blind_eyes(300) + pulser.Stun(100) + pulser.emote("scream") + pulser.hallucination = 500 + for(var/r in 1 to max(xrange, yrange)) + var/xr = min(xrange, r) + var/yr = min(yrange, r) + var/turf/TL = locate(cx - xr, cy + yr, T.z) + var/turf/BL = locate(cx - xr, cy - yr, T.z) + var/turf/TR = locate(cx + xr, cy + yr, T.z) + var/turf/BR = locate(cx + xr, cy - yr, T.z) + var/list/turfs = list() + turfs += block(TL, TR) + turfs += block(TL, BL) + turfs |= block(BL, BR) + turfs |= block(BR, TR) + for(var/turf/T1 as() in turfs) + new /obj/effect/temp_visual/mining_scanner(T1) + var/mob/living/M = locate() in T1 + if(M) + to_chat(M, "A wave of dread washes over you...") + M.blind_eyes(30) + M.Knockdown(10) + M.emote("scream") + M.Jitter(50) + M.hallucination = M.hallucination + 20 + CHECK_TICK + sleep(2) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/artifact_defenses.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/artifact_defenses.dm new file mode 100644 index 0000000000000..3a3e51d37a80d --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/artifact_defenses.dm @@ -0,0 +1,97 @@ +/obj/structure/alien_artifact + name = "alien artifact structure" + icon = 'icons/obj/artifact.dmi' + max_integrity = 200 + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + anchored = TRUE + +/obj/structure/alien_artifact/ComponentInitialize() + AddComponent(/datum/component/discoverable, 20000) + +//Watcher +//Triggers nearby defenses when motion is detected +/obj/structure/alien_artifact/watcher + name = "watcher" + desc = "It sends a shiver down your spine." + icon_state = "watcher" + var/cooldown = 0 + +/obj/structure/alien_artifact/watcher/Initialize() + . = ..() + proximity_monitor = new(src, rand(3, 6)) + var/turf/T = get_turf(src) + var/list/turfs = RANGE_TURFS(5, T) + var/list/valid_turfs = list() + for(var/turf/open/floor/F in turfs) + if(locate(/obj/structure) in F) + continue + valid_turfs += F + //Shuffle the list + shuffle_inplace(valid_turfs) + new /obj/structure/alien_artifact/protector(valid_turfs[1]) + +/obj/structure/alien_artifact/watcher/HasProximity(atom/movable/AM) + if(cooldown > world.time) + return + if (istype(AM, /obj/effect)) + return + cooldown = world.time + 50 + //Trigger nearby protectors + for(var/obj/structure/alien_artifact/protector/protector in view(6, src)) + protector.trigger(AM) + +//Protectors +/obj/structure/alien_artifact/protector + name = "protector" + desc = "A strange artifact developed centuries ago by beings that are now beyond us." + icon_state = "protector" + max_integrity = 500 + var/active = FALSE + var/datum/protector_effect/effect + +/obj/structure/alien_artifact/protector/Initialize() + . = ..() + var/effect_type = pick(subtypesof(/datum/protector_effect)) + effect = new effect_type() + +/obj/structure/alien_artifact/protector/proc/trigger(atom/movable/target) + if(active) + return + active = TRUE + flick("protector_pulse", src) + sleep(7.2) + effect.trigger(src, get_turf(src), target) + sleep(3.6) + active = FALSE + +//Protector effects + +/datum/protector_effect/proc/trigger(obj/source, turf/T, atom/movable/target) + return + +/datum/protector_effect/hierophant_chasers/trigger(obj/source, turf/T, atom/movable/target) + playsound(T,'sound/machines/airlockopen.ogg', 200, 1) + source.visible_message("\"Mx gerrsx lmhi.\"") + var/obj/effect/temp_visual/hierophant/chaser/C = new(T, source, target, 3, FALSE) + C.moving = 3 + C.moving_dir = pick(GLOB.cardinals) + C.damage = 20 + +/datum/protector_effect/hierophant_burst/trigger(obj/source, turf/T, atom/movable/target) + playsound(T,'sound/machines/airlockopen.ogg', 200, 1) + source.visible_message("\"Irkekmrk hijirwmzi tvsxsgspw.\"") + hierophant_burst(null, get_turf(target), 4) + +/datum/protector_effect/hierophant_burst_self/trigger(obj/source, turf/T, atom/movable/target) + playsound(T,'sound/machines/airlockopen.ogg', 200, 1) + source.visible_message("\"Yrorsar irxmxc hixigxih.\"") + hierophant_burst(null, T, 7) + +/datum/protector_effect/emp_stun/trigger(obj/source, turf/T, atom/movable/target) + playsound(TAIL_SWEEP_COMBO,'sound/machines/airlockopen.ogg', 200, 1) + T.visible_message("\"Svhivw vigmizih.\"") + empulse(T, 2, 6) + if(isliving(target)) + var/mob/living/L = target + L.Paralyze(50) + L.take_overall_damage(burn=10, stamina=30) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/research_disks.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/research_disks.dm new file mode 100644 index 0000000000000..85620b76f1039 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/research_disks.dm @@ -0,0 +1,58 @@ +/obj/item/disk/tech_disk/research + desc = "A research disk that will unlock a research node when uploaded into a research console." + var/node_id + +/obj/item/disk/tech_disk/research/Initialize() + . = ..() + SSorbits.research_disks += src + if(node_id) + stored_research.hidden_nodes[node_id] = FALSE + var/datum/techweb_node/node = SSresearch.techweb_node_by_id(node_id) + name = "research disk ([node.display_name])" + +/obj/item/disk/tech_disk/research/Destroy() + SSorbits.research_disks -= src + . = ..() + +/obj/item/disk/tech_disk/research/random/Initialize() + var/list/valid_nodes = list() + for(var/obj/item/disk/tech_disk/research/disk as() in subtypesof(/obj/item/disk/tech_disk/research)) + if(!initial(disk.node_id)) + continue + if(!SSresearch.science_tech.isNodeResearchedID(initial(disk.node_id))) + valid_nodes += initial(disk.node_id) + if(!length(valid_nodes)) + new /obj/effect/spawner/lootdrop/ruinloot/basic(get_turf(src)) + return INITIALIZE_HINT_QDEL + node_id = pick(valid_nodes) + . = ..() + +/obj/item/disk/tech_disk/research/boh + node_id = "bagofholding" + +/obj/item/disk/tech_disk/research/wormhole_gun + node_id = "wormholegun" + +/obj/item/disk/tech_disk/research/swapper + node_id = "qswapper" + +/obj/item/disk/tech_disk/research/adv_combat_implants + node_id = "adv_combat_cyber_implants" + +/obj/item/disk/tech_disk/research/combat_implants + node_id = "combat_cyber_implants" + +/obj/item/disk/tech_disk/research/radioactive_weapons + node_id = "radioactive_weapons" + +/obj/item/disk/tech_disk/research/beam_weapons + node_id = "beam_weapons" + +/obj/item/disk/tech_disk/research/adv_beam_weapons + node_id = "adv_beam_weapons" + +/obj/item/disk/tech_disk/research/exotic_ammo + node_id = "exotic_ammo" + +/obj/item/disk/tech_disk/research/phazon + node_id = "mecha_phazon" diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/vortex_rifle.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/vortex_rifle.dm new file mode 100644 index 0000000000000..2637536578d0f --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/vortex_rifle.dm @@ -0,0 +1,6 @@ +/obj/item/gun/energy/vortex + name = "vortex rifle" + desc = "A powerful rifle of alien origin that fires powerful energy darts." + icon_state = "vortex" + item_state = null + ammo_type = list(/obj/item/ammo_casing/energy/vortex) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_computer.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_computer.dm new file mode 100644 index 0000000000000..b26b920412ad2 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_computer.dm @@ -0,0 +1,64 @@ +GLOBAL_LIST_EMPTY(objective_computers) + +/obj/machinery/computer/objective + name = "station objective console" + desc = "A networked console that downloads and displays currently assigned station objectives." + icon_screen = "bounty" + icon_keyboard = "tech_key" + light_color = LIGHT_COLOR_ORANGE + req_access = list( ) + circuit = /obj/item/circuitboard/computer/objective + var/list/viewing_mobs = list() + +/obj/machinery/computer/objective/Initialize(mapload, obj/item/circuitboard/C) + . = ..() + GLOB.objective_computers += src + +/obj/machinery/computer/objective/Destroy() + GLOB.objective_computers -= src + . = ..() + +/obj/machinery/computer/objective/ui_state(mob/user) + return GLOB.default_state + +/obj/machinery/computer/objective/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Objective") + ui.open() + viewing_mobs += user + +/obj/machinery/computer/objective/ui_close(mob/user, datum/tgui/tgui) + viewing_mobs -= user + +/obj/machinery/computer/objective/ui_static_data(mob/user) + var/list/data = list() + data["possible_objectives"] = list() + for(var/datum/orbital_objective/objective in SSorbits.possible_objectives) + data["possible_objectives"] += list(list( + "name" = objective.name, + "id" = objective.id, + "payout" = objective.payout, + "description" = objective.get_text() + )) + data["selected_objective"] = null + if(SSorbits.current_objective) + data["selected_objective"] = list( + "name" = SSorbits.current_objective.name, + "id" = SSorbits.current_objective.id, + "payout" = SSorbits.current_objective.payout, + "description" = SSorbits.current_objective.get_text() + ) + return data + +/obj/machinery/computer/objective/ui_act(action, params) + . = ..() + if(.) + return + if(action != "assign") + return + var/obj_id = params["id"] + for(var/datum/orbital_objective/objective in SSorbits.possible_objectives) + if(objective.id == obj_id) + say(SSorbits.assign_objective(src, objective)) + return diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/alien_artifact.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/alien_artifact.dm new file mode 100644 index 0000000000000..4d8dbf5646d1e --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/alien_artifact.dm @@ -0,0 +1,41 @@ +/datum/orbital_objective/artifact + name = "Artifact Recovery" + var/generated = FALSE + //The blackbox required to recover. + var/obj/item/alienartifact/objective/linked_artifact + min_payout = 50000 + max_payout = 200000 + +/datum/orbital_objective/artifact/generate_objective_stuff(turf/chosen_turf) + generated = TRUE + linked_artifact = new(chosen_turf) + var/list/turfs = RANGE_TURFS(30, chosen_turf) + var/list/valid_turfs = list() + for(var/turf/open/floor/F in turfs) + if(locate(/obj/structure) in F) + continue + valid_turfs += F + //Shuffle the list + shuffle_inplace(valid_turfs) + for(var/i in rand(6, 15)) + if(valid_turfs.len < i) + message_admins("Ran out of valid turfs to create artifact defenses on.") + return + var/turf/selected_turf = valid_turfs[i] + new /obj/structure/alien_artifact/watcher(selected_turf) + +/datum/orbital_objective/artifact/get_text() + . = "Outpost [station_name] is a research outpost with an extremely powerful alien artifact on board. \ + Recover the unknown artifact for a payout of [payout] credits." + if(linked_beacon) + . += " The station is located at the beacon marked [linked_beacon.name]. Good luck." + +/datum/orbital_objective/artifact/check_failed() + if(!generated) + return FALSE + if(is_station_level(linked_artifact.z)) + complete_objective() + return FALSE + if(!QDELETED(linked_artifact)) + return FALSE + return TRUE diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/nuke_ruin.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/nuke_ruin.dm new file mode 100644 index 0000000000000..10ce06c533077 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/nuke_ruin.dm @@ -0,0 +1,128 @@ +/datum/orbital_objective/nuclear_bomb + name = "Nuclear Decomission" + var/generated = FALSE + //The blackbox required to recover. + var/obj/machinery/nuclearbomb/decomission/nuclear_bomb + var/obj/item/disk/nuclear/decommission/nuclear_disk + //Relatively easy mission. + min_payout = 80000 + max_payout = 400000 + +/datum/orbital_objective/nuclear_bomb/generate_objective_stuff(turf/chosen_turf) + generated = TRUE + nuclear_disk = new(chosen_turf) + nuclear_bomb.target_z = chosen_turf.z + nuclear_bomb.linked_objective = src + +/datum/orbital_objective/nuclear_bomb/get_text() + . = "Outpost [station_name] requires immediate decomissioning to prevent infomation from being \ + leaked to the space press. Retrieve the nuclear authentication disk from the outpost and detonate it \ + with the provided nuclear bomb which will be delivered to the bridge." + if(linked_beacon) + . += " The station is located at the beacon marked [linked_beacon.name]. Good luck." + +/datum/orbital_objective/nuclear_bomb/on_assign(obj/machinery/computer/objective/objective_computer) + var/area/A = GLOB.areas_by_type[/area/bridge] + var/turf/open/T = locate() in shuffle(A.contents) + nuclear_bomb = new /obj/machinery/nuclearbomb/decomission(T) + +/datum/orbital_objective/nuclear_bomb/check_failed() + if((!QDELETED(nuclear_bomb) && !QDELETED(nuclear_disk) && !QDELETED(linked_beacon)) || !generated) + return FALSE + return TRUE + +//============== +//The disk +//============== + +/obj/item/disk/nuclear/decommission + name = "outdated nuclear authentication disk" + desc = "An old, worn nuclear authentication disk used in the outdated X-7 nuclear fission explosive. Nanotrasen no longer uses this model of authentication due to its poor security." + fake = TRUE + +/obj/item/disk/nuclear/decommission/ComponentInitialize() + AddComponent(/datum/component/gps, "AUTH0", TRUE) + +//============== +//The bomb +//============== + +GLOBAL_LIST_EMPTY(decomission_bombs) + +/obj/machinery/nuclearbomb/decomission + desc = "A nuclear bomb for destroying stations. Uses an old version of the nuclear authentication disk." + proper_bomb = FALSE + var/datum/orbital_objective/nuclear_bomb/linked_objective + var/target_z + +/obj/machinery/nuclearbomb/decomission/ComponentInitialize() + . = ..() + AddComponent(/datum/component/gps, "BOMB0", TRUE) + +/obj/machinery/nuclearbomb/decomission/Initialize() + . = ..() + GLOB.decomission_bombs += src + r_code = "[rand(10000, 99999)]" + print_command_report("Nuclear decomission explosive code: [r_code]") + var/obj/structure/closet/supplypod/bluespacepod/pod = new() + pod.explosionSize = list(0,0,0,4) + new /obj/effect/pod_landingzone(get_turf(src), pod) + forceMove(pod) + +/obj/machinery/nuclearbomb/decomission/Destroy() + . = ..() + GLOB.decomission_bombs -= src + +/obj/machinery/nuclearbomb/decomission/process() + if(z != target_z) + timing = FALSE + detonation_timer = null + countdown?.stop() + update_icon() + return + . = ..() + +/obj/machinery/nuclearbomb/decomission/disk_check(obj/item/disk/nuclear/D) + if(istype(D, /obj/item/disk/nuclear/decommission)) + return TRUE + return FALSE + +/obj/machinery/nuclearbomb/decomission/set_safety() + safety = !safety + if(safety) + timing = FALSE + detonation_timer = null + countdown.stop() + update_icon() + +/obj/machinery/nuclearbomb/decomission/set_active() + if(safety) + to_chat(usr, "The safety is still on.") + return + timing = !timing + if(timing) + detonation_timer = world.time + (timer_set * 10) + countdown.start() + priority_announce("Nuclear fission explosive armed at abandoned outpost, vacate \ + outpost immediately.", + null, 'sound/misc/notice1.ogg', "Priority") + else + detonation_timer = null + countdown.stop() + update_icon() + +/obj/machinery/nuclearbomb/decomission/explode() + if(z != target_z) + timing = FALSE + detonation_timer = null + countdown?.stop() + update_icon() + return + . = ..() + +/obj/machinery/nuclearbomb/decomission/actually_explode() + SSticker.roundend_check_paused = FALSE + linked_objective.complete_objective() + INVOKE_ASYNC(GLOBAL_PROC,.proc/KillEveryoneOnZLevel, target_z) + QDEL_NULL(linked_objective.linked_beacon) + qdel(src) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/recover_blackbox.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/recover_blackbox.dm new file mode 100644 index 0000000000000..4c659794b4661 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/recover_blackbox.dm @@ -0,0 +1,113 @@ +/datum/orbital_objective/recover_blackbox + name = "Blackbox Recovery" + var/generated = FALSE + //The blackbox required to recover. + var/obj/item/blackbox/objective/linked_blackbox + //Relatively easy mission. + min_payout = 50000 //10k credits for sci/sec/eng, 5k for ser / civ + max_payout = 100000 //20k credits for sci/sec/eng, 10k for serv / civ + +/datum/orbital_objective/recover_blackbox/generate_objective_stuff(turf/chosen_turf) + generated = TRUE + linked_blackbox = new(chosen_turf) + linked_blackbox.setup_recover(src) + +/datum/orbital_objective/recover_blackbox/get_text() + . = "Outpost [station_name] recently went dark and is no longer responding to our attempts \ + to contact them. Send in a team and recover the station's blackbox for a payout of [payout] credits." + if(linked_beacon) + . += " The station is located at the beacon marked [linked_beacon.name]. Good luck." + +/datum/orbital_objective/recover_blackbox/check_failed() + if(!QDELETED(linked_blackbox) || !generated) + return FALSE + return TRUE + +/* + * Blackbox Item: Objective target, handles completion + * Traitors can steal the Nanotrasen blackbox to prevent the station + * from completing their objective and recover invaluable data. + */ +/obj/item/blackbox/objective + name = "damaged blackbox" + w_class = WEIGHT_CLASS_BULKY + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + +/obj/item/blackbox/objective/ComponentInitialize() + . = ..() + AddComponent(/datum/component/gps, "BLACKBOX #[rand(1000, 9999)]", TRUE) + +/obj/item/blackbox/objective/proc/setup_recover(linked_mission) + AddComponent(/datum/component/recoverable, linked_mission) + +/obj/item/blackbox/objective/examine(mob/user) + . = ..() + . += "Use in hand on the bridge of the station to send it to Nanotrasen and complete the objective." + +/datum/component/recoverable + var/recovered = FALSE + var/datum/orbital_objective/recover_blackbox/linked_obj + +/datum/component/recoverable/Initialize(_linked_obj) + if(!ismovableatom(parent)) + return COMPONENT_INCOMPATIBLE + linked_obj = _linked_obj + RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/attack_self) + +/datum/component/recoverable/proc/attack_self(mob/user) + var/atom/movable/pA = parent + var/turf/T = get_turf(parent) + var/area/A = T.loc + if(istype(A, /area/bridge) && is_station_level(T.z)) + initiate_recovery() + else + pA.say("Blackbox must be recovered at the station's bridge.") + +/datum/component/recoverable/proc/initiate_recovery() + var/atom/movable/parentobj = parent + if(recovered) + return + recovered = TRUE + //Prevent picking up + parentobj.anchored = TRUE + //Drop to ground + parentobj.forceMove(get_turf(parent)) + //Complete objective + if(linked_obj) + linked_obj.complete_objective() + else + parentobj.say("Non-priority item recovered, dispensing 2000 credit reward.") + new /obj/item/stack/spacecash/c1000(get_turf(parent), 2) + //Fly away + var/mutable_appearance/balloon + var/mutable_appearance/balloon2 + var/obj/effect/extraction_holder/holder_obj = new(parentobj.loc) + holder_obj.appearance = parentobj.appearance + parentobj.forceMove(holder_obj) + balloon2 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_expand") + balloon2.pixel_y = 10 + balloon2.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM + holder_obj.add_overlay(balloon2) + sleep(4) + balloon = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_balloon") + balloon.pixel_y = 10 + balloon.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM + holder_obj.cut_overlay(balloon2) + holder_obj.add_overlay(balloon) + playsound(holder_obj.loc, 'sound/items/fultext_deploy.ogg', 50, 1, -3) + animate(holder_obj, pixel_z = 10, time = 20) + sleep(20) + animate(holder_obj, pixel_z = 15, time = 10) + sleep(10) + animate(holder_obj, pixel_z = 10, time = 10) + sleep(10) + animate(holder_obj, pixel_z = 15, time = 10) + sleep(10) + animate(holder_obj, pixel_z = 10, time = 10) + sleep(10) + playsound(holder_obj.loc, 'sound/items/fultext_launch.ogg', 50, 1, -3) + animate(holder_obj, pixel_z = 1000, time = 30) + sleep(30) + qdel(parent) + qdel(holder_obj) + qdel(src) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/vip_extraction.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/vip_extraction.dm new file mode 100644 index 0000000000000..527f2179968e1 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/vip_extraction.dm @@ -0,0 +1,137 @@ +/datum/orbital_objective/vip_recovery + name = "VIP Recovery" + var/generated = FALSE + var/mob/mob_to_recover + min_payout = 100000 + max_payout = 200000 + +/datum/orbital_objective/vip_recovery/get_text() + return "Someone of particular interest to us is located at [station_name]. We require them to be extracted immediately. \ + We have good intel to suggest that the VIP is still alive, however if not their personal diary-disk should have enough infomation \ + about what we are looking for. An additional point to note is that it is recommended a security team assists in this mission due \ + to the potentially hostile nature of the individual. Return the individual to the station alive to complete the objective." + +//If nobody takes up the ghost role, then we dont care if they died. +//I know, its a bit sad. +/datum/orbital_objective/vip_recovery/check_failed() + if(generated) + //Deleted + if(QDELETED(mob_to_recover)) + return TRUE + //Left behind + if(mob_to_recover in SSzclear.nullspaced_mobs) + return TRUE + //Recovered and alive + if(is_station_level(mob_to_recover.z) && mob_to_recover.stat == CONSCIOUS) + complete_objective() + return FALSE + +/datum/orbital_objective/vip_recovery/generate_objective_stuff(turf/chosen_turf) + var/mob/living/carbon/human/created_human = new(chosen_turf) + //Maybe polling ghosts would be better than the shintience code + created_human.set_playable() + created_human.mind_initialize() + //Remove nearby dangers + for(var/mob/living/simple_animal/hostile/SA in range(10, created_human)) + qdel(SA) + //Give them a space worthy suit + var/turf/open/T = locate() in shuffle(view(1, created_human)) + if(T) + new /obj/item/clothing/suit/space/hardsuit/ancient(T) + new /obj/item/tank/internals/oxygen(T) + new /obj/item/clothing/mask/gas(T) + new /obj/item/storage/belt/utility/full(T) + var/antag_elligable = FALSE + switch(pickweight(list("centcom_official" = 4, "dictator" = 1, "greytide" = 3))) + if("centcom_official") + created_human.flavor_text = "You are a CentCom official onboard a badly damaged station. Making your way back to Space Station 13 to uncover the secrets you hold is \ + your top priority as far as Nanotrasen is concerned, but surviving just one more day is all you can ask for." + created_human.equipOutfit(/datum/outfit/centcom_official_vip) + antag_elligable = TRUE + if("dictator") + created_human.flavor_text = "It has been months since your regime fell. Once a hero, you're now just someone wishing that they will see the next sunrise. You know those \ + Nanotrasen pigs are after you, and will stop at nothing to capture you. All you want at this point is to get out and survive, however it is likely you will never leave \ + without being captured." + created_human.equipOutfit(/datum/outfit/vip_dictator) + created_human.mind.add_antag_datum(/datum/antagonist/vip_dictator) + if("greytide") + created_human.flavor_text = "You are just an assistant on a lonely derelict station. You dream of going home, \ + but it would take another one of the miracles that kept you alive to get you home." + created_human.equipOutfit(/datum/outfit/greytide) + antag_elligable = TRUE + created_human.mind.store_memory(created_human.flavor_text) + if(antag_elligable) + if(prob(7)) + created_human.mind.make_Traitor() + else if(prob(8)) + created_human.mind.make_Changeling() + mob_to_recover = created_human + generated = TRUE + + +//===================== +// Centcom Official +//===================== + +/datum/outfit/centcom_official_vip + name = "Centcom VIP" + + uniform = /obj/item/clothing/under/rank/centcom/officer + shoes = /obj/item/clothing/shoes/sneakers/black + gloves = /obj/item/clothing/gloves/color/black + ears = /obj/item/radio/headset/headset_cent/empty + glasses = /obj/item/clothing/glasses/sunglasses/advanced + belt = /obj/item/gun/energy/e_gun + l_pocket = /obj/item/pen + back = /obj/item/storage/backpack/satchel + r_pocket = /obj/item/pda/heads + l_hand = /obj/item/clipboard + r_hand = /obj/item/gps + id = /obj/item/card/id/away/old + +//===================== +// Matryr Dictator +//===================== + +/datum/antagonist/vip_dictator + name = "Insane VIP" + show_in_antagpanel = TRUE + roundend_category = "Ruin VIPs" + antagpanel_category = "Other" + +/datum/outfit/vip_dictator + name = "Dictator VIP" + + uniform = /obj/item/clothing/under/rank/security/head_of_security/white + suit = /obj/item/clothing/suit/armor/hos + suit_store = /obj/item/gun/ballistic/automatic/pistol/m1911 + shoes = /obj/item/clothing/shoes/jackboots + gloves = /obj/item/clothing/gloves/combat + ears = /obj/item/radio/headset + glasses = /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch + belt = /obj/item/storage/belt/sabre + l_pocket = /obj/item/ammo_box/magazine/m45 + r_pocket = /obj/item/grenade/smokebomb + id = /obj/item/card/id/away/old + neck = /obj/item/clothing/neck/crucifix + head = /obj/item/clothing/head/HoS/beret/syndicate + r_hand = /obj/item/gps + +//===================== +// Greytide +//===================== + +/datum/outfit/greytide + name = "Greytide" + + uniform = /obj/item/clothing/under/color/random + suit = /obj/item/clothing/suit/armor/vest + shoes = /obj/item/clothing/shoes/laceup + gloves = /obj/item/clothing/gloves/color/yellow + ears = /obj/item/radio/headset + glasses = /obj/item/clothing/glasses/sunglasses/advanced + belt = /obj/item/storage/belt/utility/full/engi + id = /obj/item/card/id + head = /obj/item/clothing/head/helmet + l_hand = /obj/item/melee/baton/loaded + r_hand = /obj/item/gps diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/asteroid_generator.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/asteroid_generator.dm new file mode 100644 index 0000000000000..93940e6b47640 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/asteroid_generator.dm @@ -0,0 +1,90 @@ +//Generates an asteroid around a point with max radius r +//weight_offset - Affects the probability of a rock spawning (between -1 and 1) +//if this number is negative, asteroids will be smaller. +//if this number is positive asteroids will be larger and more likely +/proc/generate_asteroids(center_x, center_y, center_z, max_radius, weight_offset = 0, scale = 65) + var/datum/space_level/space_level = SSmapping.get_level(center_z) + space_level.generating = TRUE + try + _generate_asteroids(center_x, center_y, center_z, max_radius, weight_offset, scale) + catch(var/exception/e) + message_admins("Asteroid failed to generate!") + stack_trace("Asteroid failed to generate! [e] on [e.file]:[e.line]") + space_level.generating = FALSE + +/proc/_generate_asteroids(center_x, center_y, center_z, max_radius, weight_offset = 0, scale = 65) + + SSair.pause_z(center_z) + + var/perlin_noise_scale = scale + var/seed = rand(0, 999999) + var/turf/z_center = locate(center_x, center_y, center_z) + var/list/high_value_turfs = list() + var/generated_string = rustg_cnoise_generate("45", "20", "4", "3", "[world.maxx]", "[world.maxy]") //Generate the raw CA data + + var/static/area/asteroid_area = new /area/asteroid/generated() + + for(var/turf/open/space/T in block(locate(1, 1, center_z), locate(world.maxx, world.maxy, center_z))) + if(!T) + continue + //Calculate distance to edge + var/distance = z_center.Distance(T) + if(distance > max_radius) + continue + //Change area + asteroid_area.contents += T + T.change_area(T.loc, asteroid_area) + //Check if we are closed or not (Cave generation) + var/closed = text2num(generated_string[world.maxx * (T.y - 1) + T.x]) + var/noise_at_coord = text2num(rustg_noise_get_at_coordinates("[seed]", "[T.x / perlin_noise_scale]", "[T.y / perlin_noise_scale]")) + var/plant_value = (distance / max_radius) + weight_offset + 0.3 + var/rock_value = (distance / max_radius) + weight_offset + 0.1 + var/sand_value = (distance / max_radius) + weight_offset + if(noise_at_coord >= rock_value && closed) + T.ChangeTurf(/turf/closed/mineral/random, list(/turf/open/floor/plating/asteroid/airless), CHANGETURF_IGNORE_AIR) + else if(noise_at_coord >= sand_value) + var/turf/newT = T.ChangeTurf(/turf/open/floor/plating/asteroid/airless, flags = CHANGETURF_IGNORE_AIR) + if(noise_at_coord >= plant_value) + high_value_turfs += newT + //Cave plants + if(prob(max(30 - (plant_value * 30), 0))) + var/plant_type = pick(/obj/structure/flora/rock/pile, /obj/structure/flora/ausbushes/brflowers, + /obj/structure/flora/ausbushes/fullgrass, /obj/structure/flora/ausbushes/ppflowers, + /obj/structure/flora/ausbushes/sparsegrass, /obj/structure/flora/ausbushes/ywflowers, + /obj/structure/flora/bush, /obj/structure/flora/junglebush, /obj/structure/flora/junglebush/b, + /obj/structure/flora/junglebush/c, /obj/structure/glowshroom/glowcap, /obj/structure/flora/ash/cap_shroom, + /obj/structure/flora/ash/stem_shroom, /obj/structure/flora/ash/cacti) + new plant_type(T) + CHECK_TICK + //Spawn tendrils and other cave stuff + for(var/i in 1 to min(length(high_value_turfs), rand(0, 3))) + var/turf/T = pick_n_take(high_value_turfs) + if(locate(/obj/structure/spawner/lavaland) in range(3, T)) + continue + var/type_to_spawn = pick(/obj/structure/spawner/lavaland/hivelord, /obj/structure/spawner/lavaland/gutlunch, + /obj/structure/spawner/lavaland/asteroid_goliath, /obj/structure/spawner/lavaland/fugu, + /obj/structure/spawner/lavaland/basilisk, /obj/structure/spawner/lavaland, + /obj/structure/spawner/lavaland/goliath, /obj/structure/spawner/lavaland/legion) + new type_to_spawn(T) + + SSair.unpause_z(center_z) + +//Spawner types +/obj/structure/spawner/lavaland/basilisk + mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk) + +/obj/structure/spawner/lavaland/fugu + mob_types = list(/mob/living/simple_animal/hostile/asteroid/fugu) + +/obj/structure/spawner/lavaland/asteroid_goliath + mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath) + +/obj/structure/spawner/lavaland/gutlunch + mob_types = list(/mob/living/simple_animal/hostile/asteroid/gutlunch) + +/obj/structure/spawner/lavaland/hivelord + mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord) + +/area/asteroid/generated + dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT + outdoors = TRUE diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/exoplanets/biomes/_biome.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/exoplanets/biomes/_biome.dm new file mode 100644 index 0000000000000..579adee96b744 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/exoplanets/biomes/_biome.dm @@ -0,0 +1,37 @@ +/datum/exoplanet_biome + var/name + + var/area_type = /area/planet + + //Rock face types + var/deep_rock_type = /turf/closed/mineral/snowmountain/cavern + var/shallow_rock_type = /turf/closed/mineral/snowmountain + + var/river_type = /turf/open/floor/plating/ice/smooth + var/beach_type = /turf/open/floor/plating/asteroid/snow + + var/plains_type = /turf/open/floor/plating/asteroid/snow + var/list/plains_decoration = list(/obj/structure/flora/tree/pine = 1) + + var/jungle_type = /turf/open/floor/plating/asteroid/snow + var/list/jungle_decoration = list(/obj/structure/flora/tree/pine = 1) + +/area/planet + icon_state = "Unknown Planet" + has_gravity = STANDARD_GRAVITY + flags_1 = NONE + sound_environment = SOUND_AREA_LAVALAND + always_unpowered = TRUE + poweralm = FALSE + power_environ = FALSE + power_equip = FALSE + power_light = FALSE + requires_power = TRUE + ambience_index = AMBIENCE_MINING + min_ambience_cooldown = 70 SECONDS + outdoors = TRUE + max_ambience_cooldown = 220 SECONDS + area_flags = NONE + lighting_overlay_colour = "#93c3cf" + lighting_overlay_opacity = 60 + luminosity = 1 diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/exoplanets/biomes/lavaland.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/exoplanets/biomes/lavaland.dm new file mode 100644 index 0000000000000..a0d739e0252d8 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/exoplanets/biomes/lavaland.dm @@ -0,0 +1,20 @@ +/datum/exoplanet_biome/lavaland + name = "lavaland" + + area_type = /area/planet/lavaland + + //Rock face types + deep_rock_type = /turf/closed/mineral/random/volcanic + shallow_rock_type = /turf/closed/mineral/random/volcanic + + river_type = /turf/open/lava/smooth/lava_land_surface + beach_type = /turf/open/floor/plating/lavaland + + plains_type = /turf/open/floor/plating/lavaland + plains_decoration = 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, /obj/structure/flora/ash/leaf_shroom = 20, /obj/structure/flora/ash/cap_shroom = 20, /obj/structure/flora/ash/stem_shroom = 20 , /obj/structure/flora/ash/cacti = 10, /obj/structure/flora/ash/tall_shroom = 20) + + jungle_type = /turf/open/floor/plating/ashplanet/rocky + jungle_decoration = list(/obj/structure/geyser/random = 30, null = 60, /mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = 6) + +/area/planet/lavaland + lighting_overlay_colour = "#cfb793" diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/exoplanets/biomes/lush.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/exoplanets/biomes/lush.dm new file mode 100644 index 0000000000000..7d41328045b33 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/exoplanets/biomes/lush.dm @@ -0,0 +1,16 @@ +/*/datum/exoplanet_biome/lush + name = "Lush" + + //Rock face types + deep_rock_type = /turf/closed/mineral/random/jungle + shallow_rock_type = /turf/closed/mineral/random/jungle + + river_type = /turf/open/water/jungle + beach_type = /turf/open/floor/plating/dirt/jungle/wasteland + + plains_type = /turf/open/floor/plating/dirt/jungle/dark + plains_decoration = list(/obj/structure/flora/grass/jungle,/obj/structure/flora/grass/jungle/b, /obj/structure/flora/rock/jungle, /obj/structure/flora/rock/pile/largejungle) + + jungle_type = /turf/open/floor/plating/grass/jungle + jungle_decoration = list(/obj/structure/flora/grass/jungle,/obj/structure/flora/grass/jungle/b, /obj/structure/flora/tree/jungle, /obj/structure/flora/rock/jungle, /obj/structure/flora/junglebush, /obj/structure/flora/junglebush/b, /obj/structure/flora/junglebush/c, /obj/structure/flora/junglebush/large, /obj/structure/flora/rock/pile/largejungle) +*/ diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/exoplanets/exoplanet_generator.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/exoplanets/exoplanet_generator.dm new file mode 100644 index 0000000000000..69202795f39b0 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/exoplanets/exoplanet_generator.dm @@ -0,0 +1,59 @@ +/proc/generate_exoplanet(center_z) + var/datum/space_level/space_level = SSmapping.get_level(center_z) + space_level.generating = TRUE + try + _generate_exoplanet(center_z, new /datum/exoplanet_biome/lavaland) + catch(var/exception/e) + message_admins("Exoplanet failed to generate!") + stack_trace("Exoplanet failed to generate! [e] on [e.file]:[e.line]") + space_level.generating = FALSE + +/proc/_generate_exoplanet(center_z, datum/exoplanet_biome/biome) + + SSair.pause_z(center_z) + + var/perlin_noise_scale = 65 + var/river_height = 0.25 + var/beach_height = 0.32 + var/mountain_height = 0.7 + var/deepmountain_height = 0.8 + var/seed = rand(0, 999999) + var/area/new_area = new biome.area_type + new_area.setup("Alien Planet") + for(var/turf/T as() in block(locate(1, 1, center_z), locate(world.maxx, world.maxy, center_z))) + if(istype(T.loc, /area/space) && new_area) + T.change_area(T.loc, new_area) + new_area.contents += T + if(isspaceturf(T)) + var/area_height = text2num(rustg_noise_get_at_coordinates("[seed]", "[T.x / perlin_noise_scale]", "[T.y / perlin_noise_scale]")) + if(area_height > deepmountain_height) + T.ChangeTurf(biome.deep_rock_type, list(biome.plains_type, biome.river_type), CHANGETURF_IGNORE_AIR) + else if(area_height > mountain_height) + T.ChangeTurf(biome.shallow_rock_type, list(biome.plains_type, biome.river_type), CHANGETURF_IGNORE_AIR) + //Normal biome + else if(area_height > beach_height) + var/biome_noise = text2num(rustg_noise_get_at_coordinates("[seed]", "[T.x / perlin_noise_scale]", "[T.y / perlin_noise_scale]")) + if(biome_noise > 0.5) + T.ChangeTurf(biome.plains_type, list(biome.river_type), CHANGETURF_IGNORE_AIR) + if(prob(20) && length(biome.plains_decoration)) + var/type_to_spawn = pickweight(biome.plains_decoration) + if(ispath(type_to_spawn)) + new type_to_spawn(T) + else + T.ChangeTurf(biome.jungle_type, list(biome.river_type), CHANGETURF_IGNORE_AIR) + if(prob(60) && length(biome.plains_decoration)) + var/type_to_spawn = pickweight(biome.jungle_decoration) + if(ispath(type_to_spawn)) + new type_to_spawn(T) + //beach + else if(area_height > river_height) + T.ChangeTurf(biome.beach_type, list(biome.river_type), CHANGETURF_IGNORE_AIR) + //Wa'er + else + T.ChangeTurf(biome.river_type, list(biome.river_type), CHANGETURF_IGNORE_AIR) + else + T.baseturfs = list(biome.plains_type, biome.river_type) + CHECK_TICK + new_area.update_areasize() + + SSair.unpause_z(center_z) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/_generator_settings.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/_generator_settings.dm new file mode 100644 index 0000000000000..3c21faa8f8cad --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/_generator_settings.dm @@ -0,0 +1,34 @@ +//A datum for the generation settings of a ruin +/datum/generator_settings + //Probability of this generator being chosen. + var/probability = 0 + //Probability of breaking the floor + var/floor_break_prob = 0 + //Probability of applying damage to structures + var/structure_damage_prob = 0 + +//Gets shit to place on floors +/datum/generator_settings/proc/get_floortrash() + return list() + +//Get directional stuff that goes on walls. +/datum/generator_settings/proc/get_directional_walltrash() + return list() + +//Gets non directional stuff that goes on walls +/datum/generator_settings/proc/get_non_directional_walltrash() + return list() + +//A list of rooms that can be placed on the map. +//Assoc list. +//key = ruin part +//value = max occurances +/datum/generator_settings/proc/get_valid_rooms() + . = list() + for(var/datum/map_template/ruin_part/ruinpart as() in GLOB.loaded_ruin_parts) + .[ruinpart] = ruinpart.max_occurances + +//A list of rooms to force place on the map. +//Useful for stuff like making crutch fuel outposts that have plasma in them. +/datum/generator_settings/proc/get_required_rooms() + return list() diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/generator_abandoned.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/generator_abandoned.dm new file mode 100644 index 0000000000000..6032c45b65a52 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/generator_abandoned.dm @@ -0,0 +1,43 @@ +/datum/generator_settings/abandoned + probability = 6 + floor_break_prob = 4 + structure_damage_prob = 2 + +/datum/generator_settings/abandoned/get_floortrash() + . = list( + /obj/effect/decal/cleanable/dirt = 6, + /obj/effect/decal/cleanable/blood/old = 3, + /obj/effect/decal/cleanable/oil = 2, + /obj/effect/decal/cleanable/robot_debris/old = 1, + /obj/effect/decal/cleanable/vomit/old = 4, + /obj/effect/decal/cleanable/blood/gibs/old = 1, + /obj/effect/decal/cleanable/greenglow/filled = 1, + /obj/effect/spawner/lootdrop/glowstick/lit = 2, + /obj/effect/spawner/lootdrop/glowstick = 4, + /obj/effect/spawner/lootdrop/maintenance = 3, + /mob/living/simple_animal/hostile/poison/giant_spider/hunter = 1, + /mob/living/simple_animal/hostile/poison/giant_spider/nurse = 1, + null = 110, + ) + for(var/trash in subtypesof(/obj/item/trash)) + .[trash] = 1 + +/datum/generator_settings/abandoned/get_directional_walltrash() + return list( + /obj/machinery/light/built = 5, + /obj/machinery/light = 1, + /obj/machinery/light/broken = 4, + /obj/machinery/light/small = 2, + /obj/machinery/light/small/broken = 5, + null = 75, + ) + +/datum/generator_settings/abandoned/get_non_directional_walltrash() + return list( + /obj/item/radio/intercom = 1, + /obj/structure/sign/poster/random = 1, + /obj/structure/sign/poster/ripped = 2, + /obj/machinery/newscaster = 1, + /obj/structure/extinguisher_cabinet = 3, + null = 30 + ) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/generator_blob.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/generator_blob.dm new file mode 100644 index 0000000000000..fd42dbc8c7676 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/generator_blob.dm @@ -0,0 +1,44 @@ +/datum/generator_settings/blob + probability = 2 + floor_break_prob = 8 + structure_damage_prob = 6 + +/datum/generator_settings/blob/get_floortrash() + . = list( + /obj/effect/decal/cleanable/dirt = 6, + /obj/effect/decal/cleanable/blood/old = 3, + /obj/effect/decal/cleanable/oil = 2, + /obj/effect/decal/cleanable/robot_debris/old = 1, + /obj/effect/decal/cleanable/vomit/old = 4, + /obj/effect/decal/cleanable/blood/gibs/old = 1, + /obj/effect/decal/cleanable/greenglow/filled = 1, + /obj/effect/spawner/lootdrop/glowstick/lit = 2, + /obj/effect/spawner/lootdrop/glowstick = 4, + /obj/effect/spawner/lootdrop/maintenance = 3, + /obj/structure/blob/node/lone = 1, + /mob/living/simple_animal/hostile/blob/blobspore = 2, + /mob/living/simple_animal/hostile/blob/blobbernaut/independent = 1, + null = 90, + ) + for(var/trash in subtypesof(/obj/item/trash)) + .[trash] = 1 + +/datum/generator_settings/blob/get_directional_walltrash() + return list( + /obj/machinery/light/built = 5, + /obj/machinery/light = 1, + /obj/machinery/light/broken = 4, + /obj/machinery/light/small = 2, + /obj/machinery/light/small/broken = 5, + null = 75, + ) + +/datum/generator_settings/blob/get_non_directional_walltrash() + return list( + /obj/item/radio/intercom = 1, + /obj/structure/sign/poster/random = 1, + /obj/structure/sign/poster/ripped = 2, + /obj/machinery/newscaster = 1, + /obj/structure/extinguisher_cabinet = 3, + null = 30 + ) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/generator_netherworld.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/generator_netherworld.dm new file mode 100644 index 0000000000000..db9390237b5e7 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/generator_netherworld.dm @@ -0,0 +1,48 @@ +/datum/generator_settings/netherworld + probability = 1 + floor_break_prob = 30 + structure_damage_prob = 40 + +/datum/generator_settings/netherworld/get_floortrash() + . = list( + /obj/effect/decal/cleanable/dirt = 6, + /obj/effect/decal/cleanable/blood/old = 3, + /obj/effect/decal/cleanable/oil = 2, + /obj/effect/decal/cleanable/robot_debris/old = 1, + /obj/effect/decal/cleanable/vomit/old = 4, + /obj/effect/decal/cleanable/blood/gibs/old = 1, + /obj/effect/decal/cleanable/greenglow/filled = 1, + /obj/effect/spawner/lootdrop/glowstick/lit = 2, + /obj/effect/spawner/lootdrop/glowstick = 4, + /obj/effect/spawner/lootdrop/maintenance = 3, + /mob/living/simple_animal/hostile/netherworld/blankbody = 2, + /mob/living/simple_animal/hostile/netherworld/migo = 2, + /obj/structure/spawner/nether = 0.3, + /obj/structure/destructible/cult/pylon = 2, + /obj/structure/destructible/cult/forge = 1, + /obj/effect/rune/blood_boil = 1, + /obj/effect/rune/empower = 1, + null = 140, + ) + for(var/trash in subtypesof(/obj/item/trash)) + .[trash] = 1 + +/datum/generator_settings/netherworld/get_directional_walltrash() + return list( + /obj/machinery/light/built = 5, + /obj/machinery/light = 1, + /obj/machinery/light/broken = 4, + /obj/machinery/light/small = 2, + /obj/machinery/light/small/broken = 5, + null = 75, + ) + +/datum/generator_settings/netherworld/get_non_directional_walltrash() + return list( + /obj/item/radio/intercom = 1, + /obj/structure/sign/poster/random = 1, + /obj/structure/sign/poster/ripped = 2, + /obj/machinery/newscaster = 1, + /obj/structure/extinguisher_cabinet = 3, + null = 30 + ) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/generator_ratvar.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/generator_ratvar.dm new file mode 100644 index 0000000000000..42844878ee746 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/generator_ratvar.dm @@ -0,0 +1,46 @@ +/datum/generator_settings/blob + probability = 2 + floor_break_prob = 8 + structure_damage_prob = 6 + +/datum/generator_settings/blob/get_floortrash() + . = list( + /obj/effect/decal/cleanable/dirt = 6, + /obj/effect/decal/cleanable/blood/old = 3, + /obj/effect/decal/cleanable/oil = 2, + /obj/effect/decal/cleanable/robot_debris/old = 1, + /obj/effect/decal/cleanable/vomit/old = 4, + /obj/effect/decal/cleanable/blood/gibs/old = 1, + /obj/effect/decal/cleanable/greenglow/filled = 1, + /obj/effect/spawner/lootdrop/glowstick/lit = 6, + /obj/effect/spawner/lootdrop/maintenance = 3, + null = 70, + /obj/effect/spawner/structure/ratvar_skewer_trap = 4, + /obj/effect/spawner/structure/ratvar_flipper_trap = 2, + /obj/effect/spawner/structure/ratvar_skewer_trap_kill = 1, + /obj/structure/destructible/clockwork/sigil/transgression = 2, + /mob/living/simple_animal/hostile/clockwork_marauder = 1, + /obj/structure/destructible/clockwork/wall_gear/displaced = 10, + /obj/effect/spawner/ocular_warden_setup = 1, + /obj/effect/spawner/interdiction_lens_setup = 1, + ) + for(var/trash in subtypesof(/obj/item/trash)) + .[trash] = 1 + +/datum/generator_settings/blob/get_directional_walltrash() + return list( + /obj/machinery/light/broken = 4, + /obj/machinery/light/small = 1, + null = 75, + ) + +/datum/generator_settings/blob/get_non_directional_walltrash() + return list( + /obj/item/radio/intercom = 2, + /obj/structure/sign/poster/random = 1, + /obj/machinery/newscaster = 2, + /obj/structure/destructible/clockwork/trap/delay = 1, + /obj/structure/destructible/clockwork/trap/lever = 1, + /obj/structure/extinguisher_cabinet = 3, + null = 30 + ) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/generator_xeno.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/generator_xeno.dm new file mode 100644 index 0000000000000..06c05d369e6dc --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/generator_settings/generator_xeno.dm @@ -0,0 +1,51 @@ +/datum/generator_settings/xeno + probability = 2 + floor_break_prob = 4 + structure_damage_prob = 20 + +/datum/generator_settings/xeno/get_floortrash() + . = list( + /obj/effect/decal/cleanable/dirt = 3, + /obj/effect/decal/cleanable/blood/old = 6, + /obj/effect/decal/cleanable/oil = 2, + /obj/effect/decal/cleanable/robot_debris/old = 1, + /obj/effect/decal/cleanable/vomit/old = 4, + /obj/effect/decal/cleanable/blood/gibs/old = 6, + /obj/effect/decal/cleanable/greenglow/filled = 3, + /obj/effect/spawner/lootdrop/glowstick/lit = 5, + /obj/effect/spawner/lootdrop/glowstick = 1, + /obj/effect/spawner/lootdrop/maintenance = 3, + /obj/item/ammo_casing/c9mm = 4, + /obj/item/gun/ballistic/automatic/pistol/no_mag = 1, + /mob/living/simple_animal/hostile/alien/drone = 1, + /mob/living/simple_animal/hostile/alien/sentinel = 1, + /mob/living/simple_animal/hostile/alien = 1, + /obj/structure/alien/egg = 1, + /obj/structure/alien/weeds/node = 8, + /obj/structure/alien/gelpod = 4, + /obj/effect/mob_spawn/human/corpse/nanotrasensoldier = 1, + /obj/effect/mob_spawn/human/corpse/assistant = 1, + /obj/effect/mob_spawn/human/corpse/cargo_tech = 1, + /obj/effect/mob_spawn/human/corpse/damaged = 1, + null = 90 + ) + for(var/trash in subtypesof(/obj/item/trash)) + .[trash] = 1 + +/datum/generator_settings/xeno/get_directional_walltrash() + return list( + /obj/machinery/light/built = 1, + /obj/machinery/light/broken = 8, + /obj/machinery/light/small = 1, + /obj/machinery/light/small/broken = 6, + null = 75, + ) + +/datum/generator_settings/xeno/get_non_directional_walltrash() + return list( + /obj/item/radio/intercom = 1, + /obj/structure/sign/poster/ripped = 2, + /obj/machinery/newscaster = 1, + /obj/structure/extinguisher_cabinet = 3, + null = 30 + ) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/mapping.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/mapping.dm new file mode 100644 index 0000000000000..77ac880605b16 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/mapping.dm @@ -0,0 +1,192 @@ +/obj/effect/abstract/open_area_marker + name = "open area marker" + icon = 'icons/obj/device.dmi' + icon_state = "pinonfar" + +/obj/effect/abstract/open_area_marker/Initialize() + return INITIALIZE_HINT_QDEL + +/obj/effect/abstract/doorway_marker + name = "doorway marker" + icon = 'icons/obj/device.dmi' + icon_state = "pinonmedium" + +/obj/effect/abstract/doorway_marker/Initialize() + return INITIALIZE_HINT_QDEL + +//Basic loot, utility and maybe some weapons +//Shouldnt contain illegal tech +/obj/effect/spawner/lootdrop/ruinloot/basic + loot = list( + "" = 12, + /obj/item/melee/classic_baton/police = 3, + /obj/item/melee/classic_baton/police/telescopic = 2, + /obj/item/storage/firstaid/regular = 1, + /obj/item/storage/firstaid/toxin = 1, + /obj/item/storage/firstaid/brute = 1, + /obj/item/storage/firstaid/fire = 1, + /obj/item/grenade/smokebomb = 1, + /obj/item/storage/belt/utility/full = 1, + /obj/item/shield/riot/tele = 1, + /obj/item/melee/baton/loaded = 1, + /obj/item/gun/energy/e_gun/mini = 1, + /obj/item/seeds/random = 1, + /obj/item/gun/energy/floragun = 1, + /obj/item/stack/spacecash/c1000 = 2, + /obj/item/grenade/exploration = 1, + ) + +//Medical stuff +/obj/effect/spawner/lootdrop/ruinloot/medical + loot = list( + "" = 13, + /obj/item/storage/firstaid/regular = 1, + /obj/item/storage/firstaid/toxin = 1, + /obj/item/storage/firstaid/brute = 1, + /obj/item/storage/firstaid/fire = 1, + /obj/item/storage/backpack/duffelbag/med/surgery = 1, + /obj/item/hemostat = 1, + /obj/item/retractor = 1, + /obj/item/scalpel = 1, + /obj/item/blood_filter = 1, + /obj/item/reagent_containers/medspray/sterilizine = 1, + /obj/item/reagent_containers/medspray/silver_sulf = 1, + /obj/item/reagent_containers/medspray/styptic = 1, + /obj/item/reagent_containers/food/drinks/bottle/synthflesh = 1, + /obj/item/clothing/glasses/hud/health/sunglasses = 1, + /obj/item/surgical_drapes = 1, + /obj/item/stack/medical/bruise_pack = 1, + /obj/item/stack/medical/ointment = 1, + /obj/item/stack/medical/gauze = 1, + /obj/item/reagent_containers/glass/bottle/epinephrine = 1, + /obj/item/reagent_containers/glass/bottle/charcoal = 1, + /obj/item/storage/pill_bottle/floorpill/full = 1, + /obj/item/storage/pill_bottle/antirad = 1, + /obj/item/clothing/neck/stethoscope = 1, + /obj/item/reagent_containers/spray/cleaner = 1, + /obj/item/storage/belt/medical = 1, + /obj/item/defibrillator/compact/loaded = 1, + /obj/item/pinpointer/crew = 1, + ) + +//Science stuff +/obj/effect/spawner/lootdrop/ruinloot/science + loot = list( + "" = 18, + /obj/item/laser_pointer = 3, + /obj/item/storage/toolbox/mechanical = 2, + /obj/item/paicard = 5, + /obj/item/nanite_remote = 3, + /obj/item/nanite_injector = 1, + /obj/item/nanite_scanner = 3, + /obj/item/disk/tech_disk = 5, + /obj/item/assembly/prox_sensor = 6, + /obj/item/bodypart/r_arm/robot = 4, + /obj/item/assembly/flash/handheld/weak = 2, + /obj/item/stock_parts/cell/high = 1, + /obj/item/stock_parts/manipulator/nano = 1, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stock_parts/capacitor/super = 1, + /obj/item/stock_parts/matter_bin/super = 1, + /obj/item/stock_parts/scanning_module/adv = 1, + /obj/item/screwdriver = 6, + /obj/item/storage/box/monkeycubes = 3, + /obj/item/stack/sheet/mineral/plasma = 3, + /obj/item/pipe_dispenser = 4, + /obj/item/wrench = 6, + /obj/item/assembly/signaler = 5, + /obj/item/transfer_valve = 6, + /obj/item/cartridge/rd = 3, + /obj/item/radio = 5, + /obj/item/camera = 4, + /obj/item/encryptionkey/headset_sci = 3, + /obj/item/aicard = 2, + /obj/item/flamethrower = 2, + /obj/item/tank/internals/plasma/full = 2, + /obj/item/gps/science = 3, + /obj/item/hand_tele = 1, + /obj/item/inducer/sci = 3, + /obj/item/megaphone = 1, + /obj/item/pda/roboticist = 3, + /obj/item/pda/toxins = 3, + /obj/item/pinpointer/crew = 4, + /obj/item/reactive_armour_shell = 1, + /obj/item/anomaly_neutralizer = 1, + /obj/item/shuttle_creator = 1, + /obj/item/soap = 1, + /obj/item/borg/upgrade/selfrepair = 1, + /obj/item/borg/upgrade/speciality/botany = 1, + /obj/item/borg/upgrade/defib = 1, + /obj/item/taperecorder = 5, + /obj/item/clothing/mask/facehugger/lamarr = 1 + ) + +//Security stuff +/obj/effect/spawner/lootdrop/ruinloot/security + loot = list( + "" = 18, + /obj/item/assembly/flash/handheld = 4, + /obj/item/melee/baton/loaded = 3, + /obj/item/restraints/handcuffs = 4, + /obj/item/storage/lockbox/loyalty = 1, + /obj/item/storage/box/handcuffs = 2, + /obj/item/flashlight/seclite = 4, + /obj/item/flashbulb = 3, + /obj/item/flashbulb/bomb = 1, + /obj/item/restraints/legcuffs/bola/energy = 1, + /obj/item/clothing/glasses/hud/security/sunglasses = 2, + /obj/item/clothing/under/rank/security = 1, + /obj/item/clothing/suit/armor/vest = 2, + /obj/item/clothing/suit/armor/bulletproof = 1, + /obj/item/storage/secure/briefcase = 1, + /obj/item/reagent_containers/glass/rag = 1, + /obj/item/reagent_containers/glass/bottle/chloralhydrate = 1, + /obj/item/grenade/flashbang = 2, + /obj/item/grenade/chem_grenade/teargas = 1, + /obj/item/reagent_containers/spray/pepper = 1, + /obj/item/clothing/mask/gas/sechailer = 1, + /obj/item/grenade/exploration = 1, + ) + +//Armoury stuff +/obj/effect/spawner/lootdrop/ruinloot/armoury + loot = list( + "" = 30, + /obj/item/gun/energy/disabler = 5, + /obj/item/gun/energy/e_gun = 2, + /obj/item/gun/energy/laser = 3, + /obj/item/gun/ballistic/automatic/pistol/m1911/no_mag = 4, + /obj/item/gun/ballistic/automatic/wt550 = 1, + /obj/item/gun/grenadelauncher/security = 1, + /obj/item/key/security = 5, + /obj/effect/spawner/lootdrop/armory_contraband = 1, + /obj/item/clothing/suit/armor/laserproof = 1, + /obj/item/gun/energy/ionrifle = 2, + /obj/item/gun/energy/temperature = 2, + /obj/item/gun/energy/e_gun/dragnet = 1, + /obj/item/clothing/suit/armor/bulletproof = 4, + /obj/item/clothing/head/helmet/alt = 4, + /obj/item/clothing/suit/armor/riot = 1, + /obj/item/clothing/head/helmet/riot = 1, + /obj/item/storage/lockbox/loyalty = 1, + /obj/item/storage/fancy/donut_box = 6, + /obj/item/storage/box/teargas = 2, + /obj/item/storage/box/flashbangs = 2, + /obj/item/shield/riot = 1, + /obj/item/gun/ballistic/shotgun/riot = 1, + /obj/item/ammo_box/magazine/wt550m9 = 3, + /obj/item/ammo_box/magazine/wt550m9/wtap = 1, + /obj/item/ammo_box/magazine/wt550m9/wtic = 1, + /obj/item/ammo_box/magazine/pistolm9mm = 4, + /obj/item/grenade/exploration = 2, + ) + +//Important stuff like research disks +/obj/effect/spawner/lootdrop/ruinloot/important + loot = list( + "" = 4, + /obj/item/disk/tech_disk/research/random = 24, + /obj/item/alienartifact = 6, + /obj/item/gun/energy/vortex = 3, + /obj/item/gun/energy/alien = 1 + ) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_events/_ruin_event.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_events/_ruin_event.dm new file mode 100644 index 0000000000000..fcf22e7cb0c98 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_events/_ruin_event.dm @@ -0,0 +1,48 @@ +/datum/ruin_event + var/warning_message = "" + var/probability = 0 + var/start_tick_min = 0 + var/start_tick_max = 0 + var/tick_rate = 1 + var/end_tick_min = 0 + var/end_tick_max = 0 + //Instanced + var/datum/orbital_object/z_linked/linked_z + var/start_tick = 0 + var/end_tick = 0 + var/ticks = 0 + +/datum/ruin_event/New() + . = ..() + start_tick = rand(start_tick_min, start_tick_max) + end_tick = rand(start_tick_min, start_tick_max) + +/datum/ruin_event/proc/update() + if(QDELETED(linked_z)) + return FALSE + //Events only work on the first Z, multi-z linkage currently is for stations only. + if(ticks == start_tick) + event_start(linked_z.linked_z_level[1].z_value) + if(end_tick && ticks >= end_tick) + event_end(linked_z.linked_z_level[1].z_value) + return FALSE + if(ticks % tick_rate == 0) + event_tick(linked_z.linked_z_level[1].z_value) + ticks ++ + return TRUE + +/datum/ruin_event/proc/pre_spawn(z_value) + return + +//Note that the list is the coordinates not the turfs themselves +/datum/ruin_event/proc/post_spawn(list/floor_turfs, z_value) + return + +/datum/ruin_event/proc/event_start(z_value) + return + +/datum/ruin_event/proc/event_tick(z_value) + return + +/datum/ruin_event/proc/event_end(z_value) + return diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_events/asteriod_station.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_events/asteriod_station.dm new file mode 100644 index 0000000000000..008975c4bca7e --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_events/asteriod_station.dm @@ -0,0 +1,20 @@ +/datum/ruin_event/asteriod_station + probability = 3 + +/datum/ruin_event/asteriod_station/post_spawn(list/floor_turfs, z_value) + var/perlin_noise_scale = 65 + var/seed = rand(0, 999999) + var/turf/z_center = locate(world.maxx * 0.5, world.maxy * 0.5, z_value) + for(var/turf/open/space/T in block(locate(1, 1, z_value), locate(world.maxx, world.maxy, z_value))) + //Calculate distance to edge + var/distance = z_center.Distance(T) + if(distance > 120) + continue + var/noise_at_coord = text2num(rustg_noise_get_at_coordinates("[seed]", "[T.x / perlin_noise_scale]", "[T.y / perlin_noise_scale]")) + var/rock_value = (distance / 120) + 0.1 + var/sand_value = (distance / 120) + if(noise_at_coord >= rock_value) + T.ChangeTurf(/turf/closed/mineral/random, list(/turf/open/floor/plating/asteroid/airless), CHANGETURF_IGNORE_AIR) + else if(noise_at_coord >= sand_value) + T.ChangeTurf(/turf/open/floor/plating/asteroid/airless, flags = CHANGETURF_IGNORE_AIR) + CHECK_TICK diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_events/meteor_storm.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_events/meteor_storm.dm new file mode 100644 index 0000000000000..a9df4d0ad564a --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_events/meteor_storm.dm @@ -0,0 +1,17 @@ +/datum/ruin_event/meteor_storm + warning_message = "METEOR STORM" + probability = 1 + start_tick_min = 300 + start_tick_max = 600 + tick_rate = 4 + +/datum/ruin_event/meteor_storm/post_spawn(list/floor_turfs, z_value) + exploration_announce("Incoming dust-storm at beacon location. ETA: [round(start_tick, 1)] seconds.", z_value) + +/datum/ruin_event/meteor_storm/event_tick(z_value) + var/startSide = pick(GLOB.cardinals) + var/turf/pickedstart = spaceDebrisStartLoc(startSide, z_value) + var/turf/pickedgoal = spaceDebrisFinishLoc(startSide, z_value) + var/Me = pickweight(GLOB.meteorsC) + var/obj/effect/meteor/M = new Me(pickedstart, pickedgoal) + M.dest = pickedgoal diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_generator.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_generator.dm new file mode 100644 index 0000000000000..9199323b53ea7 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_generator.dm @@ -0,0 +1,409 @@ +#define OPEN_CONNECTION 1 +#define ROOM_CONNECTION 16 + +/* + * Generates a random space ruin. + * Slow lmao. + * Dimensions of maps need to be 4n+1 by 4n+1 + * Params: + * center_x - The x coordinate of the center of the ruin. + * center_y - The y coordinate of the center of the ruin. + * center_z - The z level the ruin is on. + * border_x - The distance from the edge of the world in which the ruin will be forced to stop. + * border_y - See above. + * linked_objective - Will spawn special objective stuff if this is part of an objective. + * Note: The ruin can generate past the border. The border prevents rooms from attaching past that point, + * however if a room attachment point is not past the border, the room it generates on that attachment point + * can go past the border. No attachment points can be generated past the border. + */ +/proc/generate_space_ruin(center_x, center_y, center_z, border_x, border_y, datum/orbital_objective/linked_objective, forced_decoration, datum/ruin_event/ruin_event) + var/datum/space_level/space_level = SSmapping.get_level(center_z) + space_level.generating = TRUE + try + _generate_space_ruin(center_x, center_y, center_z, border_x, border_y, linked_objective, forced_decoration, ruin_event) + catch(var/exception/e) + message_admins("Space ruin failed to generate!") + stack_trace("Space ruin failed to generate! [e] on [e.file]:[e.line]") + space_level.generating = FALSE + +/proc/_generate_space_ruin(center_x, center_y, center_z, border_x, border_y, datum/orbital_objective/linked_objective, forced_decoration, datum/ruin_event/ruin_event) + + SSair.pause_z(center_z) + + //Try and catch errors so that critical actions (unpausing the Z atmos) can happen. + log_mapping("Generating random ruin at [center_x], [center_y], [center_z]") + + if(!length(GLOB.loaded_ruin_parts)) + load_ruin_parts() + + //Select ruin type + var/datum/generator_settings/generator_settings = forced_decoration + if(!istype(generator_settings)) + //Select one randomly + var/static/list/datum/generator_settings/generator_settings_cache + if(!generator_settings_cache) + generator_settings_cache = list() + for(var/generator_type in subtypesof(/datum/generator_settings)) + var/datum/generator_settings/instance = new generator_type() + if(instance.probability != 0) + generator_settings_cache[instance] = instance.probability + generator_settings = pickweight(generator_settings_cache) + + //We need doors + var/list/placed_room_entrances = list() + var/list/placed_hallway_entrances = list() + + var/list/room_connections = list() //Assoc list of door connection coords, [x]_[y] = dir + var/list/hallway_connections = list() //Assoc list of hallway connection coords, [x]_[y] = dir + //Blocked turfs = Walls and floors + var/list/blocked_turfs = list() //Assoc list of blocked coords [x]_[y] = TRUE + //Floor turfs = Open turfs only. Walls should be allowed to overlap. + var/list/floor_turfs = list() //Assoc list as above, except doesn't includ walls. + + //First point + //Place one facing up and one facing down. + hallway_connections["[center_x]_[center_y]"] = NORTH + placed_hallway_entrances["[center_x]_[center_y]"] = NORTH + + var/sanity = 1000 + + var/list/valid_ruin_parts = generator_settings.get_valid_rooms() + + ruin_event?.pre_spawn(center_z) + + //Generate ruins. + while(length(hallway_connections) || length(room_connections)) + sanity -- + if(sanity < 0) + message_admins("Ruin sanity limit reached.") + return + var/ishallway = length(hallway_connections) + var/list/list_to_use = ishallway ? hallway_connections : room_connections + //Generate rooms. + var/first_coord = list_to_use[list_to_use.len] + var/first_dir = list_to_use[first_coord] + var/room_connection_x = text2num(splittext(first_coord, "_")[1]) + var/room_connection_y = text2num(splittext(first_coord, "_")[2]) + var/looking_for_dir = invertDir(first_dir) + //Find a list of valid rooms. + var/list/valid_ruins = list() + //Get all loaded ruins + for(var/datum/map_template/ruin_part/ruin_part as() in valid_ruin_parts) + CHECK_TICK + //Get every connection point in the loaded ruin + for(var/connection_point in ruin_part.connection_points) + CHECK_TICK + var/splitconn = splittext(connection_point, "_") + var/connection_x = text2num(splitconn[1]) + var/connection_y = text2num(splitconn[2]) + var/value = ruin_part.connection_points[connection_point] + var/connection_type = value >= 16 ? ROOM_CONNECTION : OPEN_CONNECTION + var/connection_dir = value / connection_type + //Not an open connection + if(connection_type != (ishallway ? OPEN_CONNECTION : ROOM_CONNECTION)) + continue + //Check to make sure direction is valid. + if(connection_dir != looking_for_dir) + //Invalid connection + continue + var/valid = TRUE + //======================================================= + //Make sure connection points dont overlap blocked parts. + //VALIDATE OUR NEW PORTS ARE OK + //======================================================= + for(var/subconnection_point in ruin_part.connection_points) + CHECK_TICK + var/splitsubconn = splittext(subconnection_point, "_") + //Get subconnection positions + var/subconnection_x = text2num(splitsubconn[1]) + var/subconnection_y = text2num(splitsubconn[2]) + var/subconnection_type = ruin_part.connection_points[subconnection_point] >= 16 + //Calculate the subconnection offset to the rooms main connection + var/offset_x = subconnection_x - connection_x + var/offset_y = subconnection_y - connection_y + //Add on the world offset of the room + offset_x += room_connection_x + offset_y += room_connection_y + //Port is on a blocked turf, and there isnt a connection on that blocked turf. (Essentially, the port is on a wall.) + if(blocked_turfs["[offset_x]_[offset_y]"] && !(subconnection_type ? room_connections["[offset_x]_[offset_y]"] : hallway_connections["[offset_x]_[offset_y]"])) + valid = FALSE + break + //Check if the port is outside the valid world border. + if(offset_x < border_x || offset_x > world.maxx - border_x || offset_y < border_y || offset_y > world.maxx - border_y) + valid = FALSE + break + //Something is blocked. + if(!valid) + continue + //======================================================= + //Make sure floors dont overlap existing floors or walls. + //Make sure that there are no global connection points inside us that aren't linked + //Get the ruin origin position + //VALIDATE THAT THE ROOM DOESNT OVERLAP ANOTHER ROOM. + //======================================================= + var/ruin_offset_x = room_connection_x - connection_x + var/ruin_offset_y = room_connection_y - connection_y + for(var/x in ruin_offset_x + 2 to ruin_offset_x + ruin_part.width - 1) + for(var/y in ruin_offset_y + 2 to ruin_offset_y + ruin_part.height - 1) + var/world_point = "[x]_[y]" + //Check to see if the point in which we have a floor is blocked + if(blocked_turfs[world_point]) + valid = FALSE + break + //======================================================= + //VALIDATE THAT EXISTING PORTS LINK TO THIS ROOM. + //======================================================= + for(var/x in ruin_offset_x + 1 to ruin_offset_x + ruin_part.width) + for(var/y in ruin_offset_y + 1 to ruin_offset_y + ruin_part.height) + var/world_point = "[x]_[y]" + //Check to see if there is a blocked room or hall connection + if((room_connections[world_point] || hallway_connections[world_point]) && !ruin_part.connection_points["[x - ruin_offset_x]_[y - ruin_offset_y]"]) + valid = FALSE + break + //Something is disconnected or blocked. + if(!valid) + continue + valid_ruins += list(list( + "ruindata" = ruin_part, + "weight" = ruin_part.weight, + "port_offset_x" = connection_x, + "port_offset_y" = connection_y, + )) + if(!length(valid_ruins)) + log_mapping("Fuck. Ruin generation failed (No valid ruins). Continuing as if everything is actually ok.") + ishallway ? hallway_connections.len-- : room_connections.len-- + continue + //Pick a ruin and spawn it. + var/list/selected_ruin = pickweight_ruin(valid_ruins) + //Spawn the ruin + //Get the port offset position + var/port_offset_x = selected_ruin["port_offset_x"] + var/port_offset_y = selected_ruin["port_offset_y"] + //Get the ruin origin position + var/ruin_offset_x = room_connection_x - port_offset_x + var/ruin_offset_y = room_connection_y - port_offset_y + + var/datum/map_template/ruin_part/ruin_part = selected_ruin["ruindata"] + + //If its a loot room, remove all loot rooms. + if(ruin_part.loot_room) + for(var/datum/map_template/ruin_part/otherpart as() in valid_ruin_parts) + if(otherpart.loot_room) + valid_ruin_parts.Remove(otherpart) + //Otherwise subtract it from amount used + else + if(!valid_ruin_parts.Find(ruin_part)) + stack_trace("Error, ruin part wasnt in valid ruin parts somehow.") + else + valid_ruin_parts[ruin_part] -- + if(valid_ruin_parts[ruin_part] <= 0) + valid_ruin_parts.Remove(ruin_part) + + //Actual spawn + SSmapping.loading_ruins = TRUE + CHECK_TICK + try + ruin_part.load(locate(ruin_offset_x + 1, ruin_offset_y + 1, center_z), FALSE, FALSE) + catch(var/exception/e) + stack_trace("Run time in space ruin generation ([ruin_part.name]) [e] on [e.file]:[e.line]") + CHECK_TICK + SSmapping.loading_ruins = FALSE + //Simulate spawning + //Remove filled connection points + for(var/point in ruin_part.connection_points) + CHECK_TICK + var/splitpoint = splittext(point, "_") + //Get offset in ruin map + var/point_x = text2num(splitpoint[1]) + var/point_y = text2num(splitpoint[2]) + //Convert to offset in the world + var/world_x = ruin_offset_x + point_x + var/world_y = ruin_offset_y + point_y + //Remove connection points + var/removed_point = FALSE + if(hallway_connections.Find("[world_x]_[world_y]")) + removed_point = TRUE + hallway_connections.Remove("[world_x]_[world_y]") + if(room_connections.Find("[world_x]_[world_y]")) + removed_point = TRUE + room_connections.Remove("[world_x]_[world_y]") + if(!removed_point) + //Port needs adding + if(ruin_part.connection_points[point] >= 16) + if(hallway_connections.Find("[world_x]_[world_y]")) + message_admins("Trying to put a room connection at a hallway connection") + else + room_connections["[world_x]_[world_y]"] = ruin_part.connection_points[point] / 16 + placed_room_entrances["[world_x]_[world_y]"] = ruin_part.connection_points[point] / 16 + else + if(room_connections.Find("[world_x]_[world_y]")) + message_admins("Trying to put a hallway connection at a room connection") + else + hallway_connections["[world_x]_[world_y]"] = ruin_part.connection_points[point] + placed_hallway_entrances["[world_x]_[world_y]"] = ruin_part.connection_points[point] + //Block turfs + for(var/x in ruin_offset_x + 1 to ruin_offset_x + ruin_part.width) + CHECK_TICK + for(var/y in ruin_offset_y + 1 to ruin_offset_y + ruin_part.height) + blocked_turfs["[x]_[y]"] = TRUE + //Block floors + for(var/point in ruin_part.floor_locations) + CHECK_TICK + var/splitpoint = splittext(point, "_") + //Get offset in ruin map + var/point_x = text2num(splitpoint[1]) + var/point_y = text2num(splitpoint[2]) + //Convert to offset in the world + var/world_x = ruin_offset_x + point_x + var/world_y = ruin_offset_y + point_y + //Block + floor_turfs["[world_x]_[world_y]"] = TRUE + //We are done with that. + ishallway ? hallway_connections.Remove(first_coord) : room_connections.Remove(first_coord) + + //Place first one again + //Wow doing this based off sanity is bad + if(sanity == 999) + hallway_connections["[center_x]_[center_y]"] = SOUTH + + //Lets place doors + for(var/door_pos in placed_room_entrances) + var/splitextdoor = splittext(door_pos, "_") + var/turf/T = locate(text2num(splitextdoor[1]), text2num(splitextdoor[2]), center_z) + var/valid = isopenturf(T) + switch(placed_room_entrances[door_pos]) + if(EAST, WEST) + if(isopenturf(locate(text2num(splitextdoor[1]), text2num(splitextdoor[2]) + 1, center_z)) || isopenturf(locate(text2num(splitextdoor[1]), text2num(splitextdoor[2]) - 1, center_z))) + valid = FALSE + if(NORTH, SOUTH) + if(isopenturf(locate(text2num(splitextdoor[1]) + 1, text2num(splitextdoor[2]), center_z)) || isopenturf(locate(text2num(splitextdoor[1]) - 1, text2num(splitextdoor[2]), center_z))) + valid = FALSE + else + message_admins("Why the fuck is this thing [door_pos] have a direction of [placed_room_entrances[door_pos]]??? TELL ME!!!!") + valid = FALSE + if(valid) + new /obj/machinery/door/airlock/hatch(T) + switch(placed_room_entrances[door_pos]) + if(SOUTH, NORTH) + var/obj/machinery/door/firedoor/border_only/b1 = new(T) + var/obj/machinery/door/firedoor/border_only/b2 = new(T) + b1.setDir(NORTH) + b2.setDir(SOUTH) + if(EAST, WEST) + var/obj/machinery/door/firedoor/border_only/b1 = new(T) + var/obj/machinery/door/firedoor/border_only/b2 = new(T) + b1.setDir(EAST) + b2.setDir(WEST) + + //Repopulate areas + repopulate_sorted_areas() + + //Fill with shit + var/list/floortrash = generator_settings.get_floortrash() + var/list/directional_walltrash = generator_settings.get_directional_walltrash() + var/list/nondirectional_walltrash = generator_settings.get_non_directional_walltrash() + var/structure_damage_prob = generator_settings.structure_damage_prob + var/floor_break_prob = generator_settings.floor_break_prob + + //Place trash + for(var/place in blocked_turfs) + CHECK_TICK + var/splitplace = splittext(place, "_") + var/x = text2num(splitplace[1]) + var/y = text2num(splitplace[2]) + var/turf/T = locate(x, y, center_z) + if(isspaceturf(T) || isclosedturf(T)) + continue + if(locate(/obj) in T) + if(prob(structure_damage_prob)) + var/obj/structure/S = locate() in T + if(S) + S.take_damage(rand(0, S.max_integrity * 1.5)) + continue + if(prob(floor_break_prob) && istype(T, /turf/open/floor/plasteel)) + T = T.ScrapeAway() + //Spawn floortrash. + var/new_floortrash = pickweight(floortrash) + if(ispath(new_floortrash)) + new new_floortrash(T) + //Check for walls and spawn walltrash + for(var/direction in GLOB.cardinals) + var/turf/T1 = get_step(T, direction) + if(isclosedturf(T1)) + var/new_directional_walltrash = pickweight(directional_walltrash) + if(ispath(new_directional_walltrash)) + var/atom/A = new new_directional_walltrash(T) + A.setDir(direction) + else + var/new_nondirectional_walltrash = pickweight(nondirectional_walltrash) + if(ispath(new_nondirectional_walltrash)) + var/atom/A = new new_nondirectional_walltrash(T) + switch(direction) + if(NORTH) + A.pixel_y = 32 + if(SOUTH) + A.pixel_y = -32 + if(EAST) + A.pixel_x = 32 + if(WEST) + A.pixel_x = -32 + break + + CHECK_TICK + + //Generate objective stuff + if(linked_objective) + var/obj_sanity = 100 + //Spawn in a sane place. + while(obj_sanity > 0) + obj_sanity -- + var/objective_turf = pick(floor_turfs) + var/split_loc = splittext(objective_turf, "_") + var/turf/T = locate(text2num(split_loc[1]), text2num(split_loc[2]), center_z) + if(isspaceturf(T)) + continue + if(locate(/obj/structure) in T) + continue + linked_objective.generate_objective_stuff(T) + break + if(!obj_sanity) + var/objective_turf = pick(floor_turfs) + var/split_loc = splittext(objective_turf, "_") + var/turf/T = locate(text2num(split_loc[1]), text2num(split_loc[2]), center_z) + linked_objective.generate_objective_stuff(T) + + //Generate research disks + for(var/i in 1 to rand(1, 5)) + var/objective_turf = pick(floor_turfs) + var/split_loc = splittext(objective_turf, "_") + new /obj/effect/spawner/lootdrop/ruinloot/important(locate(text2num(split_loc[1]), text2num(split_loc[2]), center_z)) + + //Spawn dead mosb + for(var/mob/M as() in SSzclear.nullspaced_mobs) + var/objective_turf = pick(floor_turfs) + var/split_loc = splittext(objective_turf, "_") + M.forceMove(locate(text2num(split_loc[1]), text2num(split_loc[2]), center_z)) + SSzclear.nullspaced_mobs.Cut() + + ruin_event?.post_spawn(floor_turfs, center_z) + + //Start running event + if(ruin_event) + SSorbits.ruin_events += ruin_event + + SSair.unpause_z(center_z) + + log_mapping("Finished generating ruin at [center_x], [center_y], [center_z]") + +/proc/pickweight_ruin(list/L) + var/total = 0 + for (var/list/ruin_part as() in L) + total += ruin_part["weight"] + + total *= rand() + for (var/list/ruin_part as() in L) + total -= ruin_part["weight"] + if (total <= 0) + return ruin_part + + return pick(L) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_objects.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_objects.dm new file mode 100644 index 0000000000000..876b9f7050069 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_objects.dm @@ -0,0 +1,39 @@ +/obj/effect/spawner/structure/ratvar_skewer_trap + spawn_list = list( + /obj/structure/destructible/clockwork/trap/pressure_sensor, + /obj/structure/destructible/clockwork/trap/skewer + ) + +/obj/effect/spawner/structure/ratvar_skewer_trap_kill + spawn_list = list( + /obj/structure/destructible/clockwork/trap/pressure_sensor, + /obj/structure/destructible/clockwork/trap/skewer, + /obj/structure/destructible/clockwork/sigil/vitality + ) + +/obj/effect/spawner/structure/ratvar_flipper_trap + spawn_list = list( + /obj/structure/destructible/clockwork/trap/pressure_sensor, + /obj/structure/destructible/clockwork/trap/flipper + ) + +/obj/effect/spawner/ocular_warden_setup/Initialize() + var/turf/T = get_turf(src) + new /obj/structure/destructible/clockwork/ocular_warden(T) + var/turf/open/power_turf = locate() in shuffle(view(3, src)) + new /obj/structure/destructible/clockwork/sigil/transmission(power_turf) + return INITIALIZE_HINT_QDEL + +/obj/effect/spawner/ocular_warden_setup/Initialize() + var/turf/T = get_turf(src) + new /obj/structure/destructible/clockwork/ocular_warden(T) + var/turf/open/power_turf = locate() in shuffle(view(3, src)) + new /obj/structure/destructible/clockwork/sigil/transmission(power_turf) + return INITIALIZE_HINT_QDEL + +/obj/effect/spawner/interdiction_lens_setup/Initialize() + var/turf/T = get_turf(src) + new /obj/structure/destructible/clockwork/gear_base/interdiction_lens/free(T) + var/turf/open/power_turf = locate() in shuffle(view(3, src)) + new /obj/structure/destructible/clockwork/sigil/transmission(power_turf) + return INITIALIZE_HINT_QDEL diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_part_loader.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_part_loader.dm new file mode 100644 index 0000000000000..2433843d27747 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_part_loader.dm @@ -0,0 +1,10 @@ +GLOBAL_LIST_EMPTY(loaded_ruin_parts) + +//Reads all ruin parts from the ruin generation file and processes them. +/proc/load_ruin_parts() + GLOB.loaded_ruin_parts.Cut() + for(var/subtype in subtypesof(/datum/map_template/ruin_part)) + var/datum/map_template/ruin_part/ruin_st = new subtype() + GLOB.loaded_ruin_parts += ruin_st + message_admins("Loaded ruin parts") + log_mapping("Ruin parts loaded.") diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_part_template.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_part_template.dm new file mode 100644 index 0000000000000..b9aff1920a2b3 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_part_template.dm @@ -0,0 +1,92 @@ +/datum/map_template/ruin_part + keep_cached_map = TRUE + var/file_name = "" + //Weight of the ruin part. + var/weight = 0 + //Positions of the connection points. + var/connection_points = list() + //Positions of floors. + var/floor_locations = list() + //Max occurances of this room. + var/max_occurances = INFINITY + //Is this a loot room (Only 1 loot room spawns per station) + var/loot_room = FALSE + +/datum/map_template/ruin_part/New(path, rename, cache) + mappath = "_maps/RuinGeneration/[file_name].dmm" + . = ..(path, rename, TRUE) + find_connection_points() + +//======= +// Absolute shitcode of a proc right here +// Copy paste but editted. +//======= + +//Finds connection points on a template without actually spawning it +/datum/map_template/ruin_part/proc/find_connection_points() + var/key_len = cached_map.key_len + + var/list/modelCache = cached_map.build_cache() + + for(var/I in cached_map.gridSets) + var/datum/grid_set/gset = I + var/ycrd = gset.ycrd + + for(var/line in gset.gridLines) + if(ycrd <= world.maxy && ycrd >= 1) + var/xcrd = gset.xcrd + for(var/tpos = 1 to length(line) - key_len + 1 step key_len) + if(xcrd >= 1) + var/model_key = copytext(line, tpos, tpos + key_len) + var/list/cache = modelCache[model_key] + if(!cache) + CRASH("Undefined model key in DMM: [model_key]") + build_coordinate(cache, xcrd, ycrd) + CHECK_TICK + ++xcrd + --ycrd + + CHECK_TICK + +/datum/map_template/ruin_part/proc/build_coordinate(list/model, xcrd, ycrd) + var/index + var/list/members = model[1] + var/list/members_attributes = model[2] + + //////////////// + //Instanciation + //////////////// + + //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 + + //then instance the /turf and, if multiple tiles are presents, simulates the DMM underlays piling effect + + var/first_turf_index = 1 + while(!ispath(members[first_turf_index], /turf)) //find first /turf object in members + first_turf_index++ + + if(ispath(members[first_turf_index], /turf/open)) + floor_locations["[xcrd]_[ycrd]"] = TRUE + + //finally instance all remainings objects/mobs + for(index in 1 to first_turf_index-1) + instance_atom(members[index],members_attributes[index], xcrd, ycrd) + +/datum/map_template/ruin_part/proc/instance_atom(path,list/attributes, xcrd, ycrd) + var/dir = SOUTH + + if(attributes.Find("dir")) + dir = attributes["dir"] + if(istext(dir)) + dir = text2num(dir) + + if(ispath(path, /obj/effect/abstract/open_area_marker)) + connection_points["[xcrd]_[ycrd]"] = OPEN_CONNECTION * dir + else if(ispath(path, /obj/effect/abstract/doorway_marker)) + connection_points["[xcrd]_[ycrd]"] = ROOM_CONNECTION * dir + + //custom CHECK_TICK here because we don't want things created while we're sleeping to not initialize + if(TICK_CHECK) + stoplag() diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_part_types.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_part_types.dm new file mode 100644 index 0000000000000..55bb473047ee1 --- /dev/null +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/ruin_part_types.dm @@ -0,0 +1,482 @@ +/* + * All the different ruin part types. + * Beacuse I couldn't figure out how to read every file in a directory + * General rule for decent levels. + * - Peices that have only 1 connection should be of low weight + * - Hallway Ts and Xs should be of low weight if they don't have rooms attached + * - Straight hallways should have a middle weight + * - Interesting rooms with multiple connections should have a higher weight. + */ + +/datum/map_template/ruin_part/hallwaycross + file_name = "5x5_0_hallwaycross" + weight = 1 + +/datum/map_template/ruin_part/hallwayvertical_eastwest_room + file_name = "5x5_1_hallwayvertical_eastwest_room" + weight = 1 + +/datum/map_template/ruin_part/room_dorm + file_name = "5x5_4_room-dorm" + weight = 3 + +/datum/map_template/ruin_part/room_janitor + file_name = "5x5_4_room-janitor_closet" + weight = 3 + +/datum/map_template/ruin_part/room_storage + file_name = "5x5_4_room-storage" + weight = 3 + +/datum/map_template/ruin_part/room_toilet + file_name = "5x5_4_room-toilet" + weight = 3 + +/datum/map_template/ruin_part/hallwayroom_east + file_name = "5x5_5_hallwayroom_east" + weight = 4 + +/datum/map_template/ruin_part/hallwayroom_west + file_name = "5x5_5_hallwayroom_west" + weight = 4 + +/datum/map_template/ruin_part/hallwayvertical_westroom + file_name = "5x5_6_hallwayvertical_west_room" + weight = 4 + +/datum/map_template/ruin_part/hallwayvertical_eastroom + file_name = "5x5_6_hallwayvertical_east_room" + weight = 4 + +/datum/map_template/ruin_part/hallway_t_east + file_name = "5x5_8_hallwayt-east" + weight = 2 + +/datum/map_template/ruin_part/hallway_t_north + file_name = "5x5_8_hallwayt-north" + weight = 2 + +/datum/map_template/ruin_part/hallway_t_south + file_name = "5x5_8_hallwayt-south" + weight = 2 + +/datum/map_template/ruin_part/hallway_t_west + file_name = "5x5_8_hallwayt-west" + weight = 2 + +/datum/map_template/ruin_part/hallway_end_east + file_name = "5x5_14_hallway-end-east" + weight = 2 + +/datum/map_template/ruin_part/hallway_end_north + file_name = "5x5_14_hallway-end-north" + weight = 2 + +/datum/map_template/ruin_part/hallway_end_south + file_name = "5x5_14_hallway-end-south" + weight = 2 + +/datum/map_template/ruin_part/hallway_end_west + file_name = "5x5_14_hallway-end-west" + weight = 2 + +/datum/map_template/ruin_part/hallway_horizontal + file_name = "5x5_20_hallwayhorizontal" + weight = 2 + +/datum/map_template/ruin_part/hallway_vertical + file_name = "5x5_20_hallwayvertical" + weight = 2 + +/datum/map_template/ruin_part/separation + file_name = "9x5_3_seperation" + weight = 6 + +/datum/map_template/ruin_part/checkpoint + file_name = "9x9_checkpoint" + weight = 5 + +/datum/map_template/ruin_part/corgarmoury + file_name = "13x13_corgarmoury" + weight = 5 + loot_room = TRUE + +/datum/map_template/ruin_part/corgrobotics + file_name = "13x13_corgrobotics" + weight = 4 + +/datum/map_template/ruin_part/windowroom + file_name = "5x9_windowroom" + weight = 5 + +/datum/map_template/ruin_part/cargoroom + file_name = "17x13_cargo" + weight = 2 + +/datum/map_template/ruin_part/donutroom + file_name = "13x13_donutroom" + weight = 4 + +/datum/map_template/ruin_part/singularity + file_name = "21x21_singularity" + weight = 3 + max_occurances = 1 + +/datum/map_template/ruin_part/maintroom + file_name = "9x5_maintroom" + weight = 4 + +/datum/map_template/ruin_part/shuttledock + file_name = "13x17_shuttledock" + weight = 2 + +/datum/map_template/ruin_part/kitchen + file_name = "9x13_kitchen" + weight = 6 + +/datum/map_template/ruin_part/sleeproom + file_name = "9x13_sleeproom" + weight = 4 + +/datum/map_template/ruin_part/cryo + file_name = "5x5_cryo" + weight = 2 + +/datum/map_template/ruin_part/solars + file_name = "21x19_solars" + weight = 3 + max_occurances = 2 + +/datum/map_template/ruin_part/permbrig + file_name = "13x17_permabrig" + weight = 3 + max_occurances = 2 + +/datum/map_template/ruin_part/shotelroom + file_name = "13x13_shotelroom" + weight = 2 + +/datum/map_template/ruin_part/supermattercontainment + file_name = "13x13_supermatter_containment" + weight = 4 + max_occurances = 1 + +/datum/map_template/ruin_part/gateway + file_name = "5x9_gateway" + weight = 1 + max_occurances = 1 + +/datum/map_template/ruin_part/shower + file_name = "5x5_shower" + weight = 2 + +//its 13x13 lol +// !! Map file uses broken turbo-lift components !! +/*/datum/map_template/ruin_part/elevator + file_name = "9x9_elevator" + weight = 4*/ + +/datum/map_template/ruin_part/hallwaymaints + file_name = "9x5_hallwaymaints" + weight = 4 + +/datum/map_template/ruin_part/toxinroom + file_name = "9x9_toxinstorage" + weight = 2 + +/datum/map_template/ruin_part/josito + file_name = "13x9_josito" + weight = 3 + max_occurances = 1 + +/datum/map_template/ruin_part/pizzaguard + file_name = "13x17_pizzaroom" + weight = 3 + loot_room = TRUE + +//Damaged halls + +/datum/map_template/ruin_part/hern_damaged + file_name = "5x5_hern_damaged" + weight = 0.3 + +/datum/map_template/ruin_part/hernsw_damaged + file_name = "5x5_hernsw_damaged" + weight = 0.3 + +/datum/map_template/ruin_part/hernw_damaged + file_name = "5x5_hernw_damaged" + weight = 0.3 + +/datum/map_template/ruin_part/hers_damaged + file_name = "5x5_hers_damaged" + weight = 0.3 + +/datum/map_template/ruin_part/hersw_damaged + file_name = "5x5_hersw_damaged" + weight = 0.3 + +/datum/map_template/ruin_part/hesrnw_damaged + file_name = "5x5_hesrnw_damaged" + weight = 0.3 + +/datum/map_template/ruin_part/hewrn_damaged + file_name = "5x5_hewrn_damaged" + weight = 0.3 + +/datum/map_template/ruin_part/hewrns_damaged + file_name = "5x5_hewrns_damaged" + weight = 0.3 + +/datum/map_template/ruin_part/hewrs_damaged + file_name = "5x5_hewrs_damaged" + weight = 0.3 + +/datum/map_template/ruin_part/hnersw_damaged + file_name = "5x5_hnersw_damaged" + weight = 0.2 + +/datum/map_template/ruin_part/hnesrw_damaged + file_name = "5x5_hnesrw_damaged" + weight = 0.2 + +/datum/map_template/ruin_part/hnewrs_damaged + file_name = "5x5_hnewrs_damaged" + weight = 0.2 + +/datum/map_template/ruin_part/hnresw_damaged + file_name = "5x5_hnresw_damaged" + weight = 0.2 + +/datum/map_template/ruin_part/hnswre_damaged + file_name = "5x5_hnswre_damaged" + weight = 0.2 + +/datum/map_template/ruin_part/hnwres_damaged + file_name = "5x5_hnwres_damaged" + weight = 0.2 + +/datum/map_template/ruin_part/hsrnew_damaged + file_name = "5x5_hsrnew_damaged" + weight = 0.2 + +/datum/map_template/ruin_part/hswrne_damaged + file_name = "5x5_hswrne_damaged" + weight = 0.2 + +/datum/map_template/ruin_part/hwres_damaged + file_name = "5x5_hwres_damaged" + weight = 0.2 + +/datum/map_template/ruin_part/hwrn_damaged + file_name = "5x5_hwrn_damaged" + weight = 0.2 + +/datum/map_template/ruin_part/hwrne_damaged + file_name = "5x5_hwrne_damaged" + weight = 0.2 + +/datum/map_template/ruin_part/hwrnes_damaged + file_name = "5x5_hwrnes_damaged" + weight = 0.2 + +/datum/map_template/ruin_part/hwrns_damaged + file_name = "5x5_hwrns_damaged" + weight = 0.2 + +/datum/map_template/ruin_part/hwrs_damaged + file_name = "5x5_hwrs_damaged" + weight = 0.2 + +/datum/map_template/ruin_part/hew_damaged + file_name = "5x5_hew_damaged" + weight = 0.2 + +/datum/map_template/ruin_part/hns_damaged + file_name = "5x5_hns_damaged" + weight = 0.2 + +//End damaged halls + +/datum/map_template/ruin_part/hern + file_name = "5x5_hern" + weight = 2 + +/datum/map_template/ruin_part/hernsw + file_name = "5x5_hernsw" + weight = 1 + +/datum/map_template/ruin_part/hernw + file_name = "5x5_hernw" + weight = 1 + +/datum/map_template/ruin_part/hers + file_name = "5x5_hers" + weight = 2 + +/datum/map_template/ruin_part/hersw + file_name = "5x5_hersw" + weight = 1 + +/datum/map_template/ruin_part/hesrnw + file_name = "5x5_hesrnw" + weight = 1 + +/datum/map_template/ruin_part/hewrn + file_name = "5x5_hewrn" + weight = 1 + +/datum/map_template/ruin_part/hewrns + file_name = "5x5_hewrns" + weight = 1 + +/datum/map_template/ruin_part/hewrs + file_name = "5x5_hewrs" + weight = 1 + +/datum/map_template/ruin_part/hnersw + file_name = "5x5_hnersw" + weight = 1 + +/datum/map_template/ruin_part/hnesrw + file_name = "5x5_hnesrw" + weight = 1 + +/datum/map_template/ruin_part/hnewrs + file_name = "5x5_hnewrs" + weight = 1 + +/datum/map_template/ruin_part/hnresw + file_name = "5x5_hnresw" + weight = 1 + +/datum/map_template/ruin_part/hnswre + file_name = "5x5_hnswre" + weight = 1 + +/datum/map_template/ruin_part/hnwres + file_name = "5x5_hnwres" + weight = 1 + +/datum/map_template/ruin_part/hsrnew + file_name = "5x5_hsrnew" + weight = 1 + +/datum/map_template/ruin_part/hswrne + file_name = "5x5_hswrne" + weight = 1 + +/datum/map_template/ruin_part/hwres + file_name = "5x5_hwres" + weight = 1 + +/datum/map_template/ruin_part/hwrn + file_name = "5x5_hwrn" + weight = 2 + +/datum/map_template/ruin_part/hwrne + file_name = "5x5_hwrne" + weight = 1 + +/datum/map_template/ruin_part/hwrnes + file_name = "5x5_hwrnes" + weight = 1 + +/datum/map_template/ruin_part/hwrns + file_name = "5x5_hwrns" + weight = 1 + +/datum/map_template/ruin_part/hwrs + file_name = "5x5_hwrs" + weight = 2 + +/datum/map_template/ruin_part/roomcross + file_name = "5x5_roomcross" + weight = 1 + +/datum/map_template/ruin_part/chemlab + file_name = "9x9_chemlab" + weight = 3 + max_occurances = 2 + +/datum/map_template/ruin_part/lounge + file_name = "5x9_lounge" + weight = 4 + +/datum/map_template/ruin_part/researchlab + file_name = "13x9_researchlab" + weight = 2 + //Contains a research disk + max_occurances = 1 + +/datum/map_template/ruin_part/hilberttest + file_name = "13x13_hilberttest" + weight = 5 + loot_room = TRUE + max_occurances = 1 + +/datum/map_template/ruin_part/ailab + file_name = "13x13_ai-lab" + weight = 5 + loot_room = TRUE + max_occurances = 1 + +/datum/map_template/ruin_part/cratestorage + file_name = "13x9_cratestorage" + weight = 3 + max_occurances = 1 + +/datum/map_template/ruin_part/medstorage + file_name = "9x13_medstorage" + weight = 3 + +/datum/map_template/ruin_part/morgue + file_name = "9x5_morgue" + weight = 4 + +/datum/map_template/ruin_part/charliestation_mini + file_name = "17x17_charliecrew" + weight = 1 + max_occurances = 1 + +/datum/map_template/ruin_part/charliestation + file_name = "69x45_charliestation" + weight = 0.2 + loot_room = TRUE + max_occurances = 1 + +/datum/map_template/ruin_part/corgasteroid + file_name = "41x41_corgasteroid" + weight = 1 + max_occurances = 1 + +/datum/map_template/ruin_part/teleporter + file_name = "9x13_teleporter" + weight = 1 + max_occurances = 1 + +/datum/map_template/ruin_part/medicalroom + file_name = "13x9_medical" + weight = 3 + +/datum/map_template/ruin_part/genetics + file_name = "9x9_genetics" + weight = 3 + +/datum/map_template/ruin_part/northairlock + file_name = "5x9_northernairlock" + weight = 4 + +/datum/map_template/ruin_part/southairlock + file_name = "5x9_southernairlock" + weight = 4 + +/datum/map_template/ruin_part/shuttledock_inside + file_name = "21x17_shuttledock" + weight = 4 + max_occurances = 1 + +/datum/map_template/ruin_part/syndicate_listening + file_name = "13x13_listening_base" + weight = 2 + loot_room = TRUE diff --git a/code/modules/shuttle/super_cruise/shuttle_components/plasma_refiner.dm b/code/modules/shuttle/super_cruise/shuttle_components/plasma_refiner.dm new file mode 100644 index 0000000000000..055cfa5a35061 --- /dev/null +++ b/code/modules/shuttle/super_cruise/shuttle_components/plasma_refiner.dm @@ -0,0 +1,22 @@ +/obj/machinery/atmospherics/components/unary/plasma_refiner + name = "plasma refinery" + desc = "A refinery that burns plasma sheets into plasma gas." + icon_state = "plasma_refinery" + density = TRUE + var/moles_per_ore = 50 + +/obj/machinery/atmospherics/components/unary/plasma_refiner/process_atmos() + update_parents() + +/obj/machinery/atmospherics/components/unary/plasma_refiner/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/stack/ore/plasma) || istype(W, /obj/item/stack/sheet/mineral/plasma)) + var/obj/item/stack/stack = W + var/moles_created = moles_per_ore * stack.amount + var/datum/gas_mixture/air_contents = airs[1] + if(!air_contents) + return + qdel(stack) + air_contents.adjust_moles(GAS_PLASMA, moles_created) + say("[moles_created] moles of plasma refined.") + return + . = ..() diff --git a/code/modules/shuttle/super_cruise/shuttle_components/shuttle_console.dm b/code/modules/shuttle/super_cruise/shuttle_components/shuttle_console.dm new file mode 100644 index 0000000000000..ef020c80538ce --- /dev/null +++ b/code/modules/shuttle/super_cruise/shuttle_components/shuttle_console.dm @@ -0,0 +1,532 @@ +GLOBAL_VAR_INIT(shuttle_docking_jammed, FALSE) + +/obj/machinery/computer/shuttle_flight + name = "shuttle console" + desc = "A shuttle control computer." + icon_screen = "shuttle" + icon_keyboard = "tech_key" + light_color = LIGHT_COLOR_CYAN + req_access = list() + var/shuttleId + + //Interdiction range + var/interdiction_range = 150 + //Time it takes to recharge after interdiction + var/interdiction_time = 3 MINUTES + + //For recall consoles + //If not set to an empty string, will display only the option to call the shuttle to that dock. + //Once pressed the shuttle will engage autopilot and return to the dock. + var/recall_docking_port_id = "" + + var/request_shuttle_message = "Request Shuttle" + + //Admin controlled shuttles + var/admin_controlled = FALSE + + //Used for mapping mainly + var/possible_destinations = "" + var/list/valid_docks = list("") + + //The current orbital map we are observing + var/orbital_map_index = PRIMARY_ORBITAL_MAP + + //Our orbital body. + var/datum/orbital_object/shuttle/shuttleObject + +/obj/machinery/computer/shuttle_flight/Initialize(mapload, obj/item/circuitboard/C) + . = ..() + valid_docks = params2list(possible_destinations) + if(shuttleId) + shuttlePortId = "[shuttleId]_custom" + else + var/static/i = 0 + shuttlePortId = "unlinked_shuttle_console_[i++]" + +/obj/machinery/computer/shuttle_flight/Destroy() + . = ..() + SSorbits.open_orbital_maps -= SStgui.get_all_open_uis(src) + shuttleObject = null + +/obj/machinery/computer/shuttle_flight/process() + . = ..() + + //Check to see if the shuttleobject was launched by another console. + if(QDELETED(shuttleObject) && SSorbits.assoc_shuttles.Find(shuttleId)) + shuttleObject = SSorbits.assoc_shuttles[shuttleId] + + if(recall_docking_port_id && shuttleObject?.docking_target && shuttleObject.autopilot && shuttleObject.shuttleTarget == shuttleObject.docking_target && shuttleObject.controlling_computer == src) + //We are at destination, dock. + shuttleObject.controlling_computer = null + switch(SSshuttle.moveShuttle(shuttleId, recall_docking_port_id, 1)) + if(0) + say("Shuttle has arrived at destination.") + QDEL_NULL(shuttleObject) + if(1) + to_chat(usr, "Invalid shuttle requested.") + else + to_chat(usr, "Unable to comply.") + +/obj/machinery/computer/shuttle_flight/ui_state(mob/user) + return GLOB.default_state + +/obj/machinery/computer/shuttle_flight/ui_interact(mob/user, datum/tgui/ui) + if(!allowed(user) && !isobserver(user)) + say("Insufficient access rights.") + return + //Ash walkers cannot use the console because they are unga bungas + if(user.mind?.has_antag_datum(/datum/antagonist/ashwalker)) + to_chat(user, "This computer has been designed to keep the natives like you from meddling with it, you have no hope of using it.") + return + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "OrbitalMap") + ui.open() + SSorbits.open_orbital_maps |= ui + ui.set_autoupdate(FALSE) + +/obj/machinery/computer/shuttle_flight/ui_close(mob/user, datum/tgui/tgui) + SSorbits.open_orbital_maps -= tgui + +/obj/machinery/computer/shuttle_flight/ui_static_data(mob/user) + var/list/data = list() + //The docks we can dock with never really changes + //This is used for the forced autopilot mode where it goes to a set port. + data["destination_docks"] = list() + for(var/dock in valid_docks) + data["valid_dock"] += list(list( + "id" = dock, + )) + //If we are a recall console. + data["recall_docking_port_id"] = recall_docking_port_id + data["request_shuttle_message"] = request_shuttle_message + data["interdiction_range"] = interdiction_range + return data + +/obj/machinery/computer/shuttle_flight/ui_data(mob/user) + var/list/data = list() + data["update_index"] = SSorbits.times_fired + //Add orbital bodies + data["map_objects"] = list() + var/datum/orbital_map/showing_map = SSorbits.orbital_maps[orbital_map_index] + for(var/map_key in showing_map.collision_zone_bodies) + for(var/datum/orbital_object/object as() in showing_map.collision_zone_bodies[map_key]) + if(!object) + continue + //we can't see it, unless we are stealth too + if(shuttleObject) + if(object != shuttleObject && (object.stealth && !shuttleObject.stealth)) + continue + else + if(object.stealth) + continue + //Send to be rendered on the UI + data["map_objects"] += list(list( + "name" = object.name, + "position_x" = object.position.x, + "position_y" = object.position.y, + "velocity_x" = object.velocity.x * object.velocity_multiplier, + "velocity_y" = object.velocity.y * object.velocity_multiplier, + "radius" = object.radius + )) + if(!SSshuttle.getShuttle(shuttleId)) + data["linkedToShuttle"] = FALSE + return data + //Interdicted shuttles + data["interdictedShuttles"] = list() + if(SSorbits.interdicted_shuttles[shuttleId] > world.time) + var/obj/docking_port/our_port = SSshuttle.getShuttle(shuttleId) + data["interdictionTime"] = SSorbits.interdicted_shuttles[shuttleId] - world.time + for(var/interdicted_id in SSorbits.interdicted_shuttles) + var/timer = SSorbits.interdicted_shuttles[interdicted_id] + if(timer < world.time) + continue + var/obj/docking_port/port = SSshuttle.getShuttle(interdicted_id) + if(port && port.get_virtual_z_level() == our_port.get_virtual_z_level()) + data["interdictedShuttles"] += list(list( + "shuttleName" = port.name, + "x" = port.x - our_port.x, + "y" = port.y - our_port.y, + )) + else + data["interdictionTime"] = 0 + + data["canLaunch"] = TRUE + if(QDELETED(shuttleObject)) + data["linkedToShuttle"] = FALSE + return data + data["autopilot"] = shuttleObject.autopilot + data["linkedToShuttle"] = TRUE + data["shuttleTarget"] = shuttleObject.shuttleTarget?.name + data["shuttleName"] = shuttleObject.name + data["shuttleAngle"] = shuttleObject.angle + data["shuttleThrust"] = shuttleObject.thrust + data["autopilot_enabled"] = shuttleObject.autopilot + data["desired_vel_x"] = shuttleObject.desired_vel_x + data["desired_vel_y"] = shuttleObject.desired_vel_y + if(shuttleObject?.shuttleTarget) + data["shuttleVelX"] = shuttleObject.velocity.x - shuttleObject.shuttleTarget.velocity.x + data["shuttleVelY"] = shuttleObject.velocity.y - shuttleObject.shuttleTarget.velocity.y + else + data["shuttleVelX"] = shuttleObject.velocity.x + data["shuttleVelY"] = shuttleObject.velocity.y + //Docking data + data["canDock"] = shuttleObject.can_dock_with != null && !shuttleObject.docking_frozen + data["isDocking"] = shuttleObject.docking_target != null && !shuttleObject.docking_frozen && !shuttleObject.docking_target.is_generating + data["shuttleTargetX"] = shuttleObject.shuttleTargetPos?.x + data["shuttleTargetY"] = shuttleObject.shuttleTargetPos?.y + data["validDockingPorts"] = list() + if(shuttleObject.docking_target && !shuttleObject.docking_frozen) + //Stealth shuttles bypass shuttle jamming. + if(shuttleObject.docking_target.can_dock_anywhere && (!GLOB.shuttle_docking_jammed || shuttleObject.stealth || !istype(shuttleObject.docking_target, /datum/orbital_object/z_linked/station))) + data["validDockingPorts"] += list(list( + "name" = "Custom Location", + "id" = "custom_location" + )) + else if(shuttleObject.docking_target.random_docking) + data["validDockingPorts"] += list(list( + "name" = "Random Drop", + "id" = "custom_location" + )) + for(var/obj/docking_port/stationary/stationary_port as() in SSshuttle.stationary) + if(LAZYLEN(shuttleObject.docking_target.linked_z_level)) + for(var/datum/space_level/level in shuttleObject.docking_target.linked_z_level) + if(stationary_port.z == level.z_value && (stationary_port.id in valid_docks)) + data["validDockingPorts"] += list(list( + "name" = stationary_port.name, + "id" = stationary_port.id, + )) + return data + +/obj/machinery/computer/shuttle_flight/ui_act(action, params) + . = ..() + + if(.) + return + + if(!allowed(usr)) + say("Insufficient access rights.") + return + + if(admin_controlled) + say("This shuttle is restricted to authorised personnel only.") + return + + if(recall_docking_port_id) + switch(action) + if("callShuttle") + //Find the z-level that the dock is on + var/obj/docking_port/stationary/target_port = SSshuttle.getDock(recall_docking_port_id) + if(!target_port) + say("Unable to locate port location.") + return + //Locate linked shuttle + var/obj/docking_port/mobile/shuttle = SSshuttle.getShuttle(shuttleId) + if(!shuttle) + say("Unable to locate linked shuttle.") + return + if(target_port in shuttle.loc) + say("Shuttle is already at destination.") + return + //Locate the orbital object + var/datum/orbital_map/viewing_map = SSorbits.orbital_maps[orbital_map_index] + for(var/map_key in viewing_map.collision_zone_bodies) + for(var/datum/orbital_object/z_linked/z_linked as() in viewing_map.collision_zone_bodies[map_key]) + if(!istype(z_linked)) + continue + if(z_linked.z_in_contents(target_port.z)) + if(!SSorbits.assoc_shuttles.Find(shuttleId)) + //Launch the shuttle + if(!launch_shuttle()) + return + if(shuttleObject.shuttleTarget == z_linked && shuttleObject.controlling_computer == src) + return + shuttleObject = SSorbits.assoc_shuttles[shuttleId] + shuttleObject.shuttleTarget = z_linked + shuttleObject.autopilot = TRUE + shuttleObject.controlling_computer = src + say("Shuttle requested.") + return + say("Docking port in invalid location. Please contact a Nanotrasen technician.") + return + + switch(action) + if("setTarget") + if(QDELETED(shuttleObject)) + say("Shuttle not in flight.") + return + var/desiredTarget = params["target"] + if(shuttleObject.name == desiredTarget) + return + var/datum/orbital_map/showing_map = SSorbits.orbital_maps[orbital_map_index] + for(var/map_key in showing_map.collision_zone_bodies) + for(var/datum/orbital_object/object as() in showing_map.collision_zone_bodies[map_key]) + if(object.name == desiredTarget) + shuttleObject.shuttleTarget = object + return + if("setThrust") + if(QDELETED(shuttleObject)) + say("Shuttle not in flight.") + return + if(shuttleObject.autopilot) + to_chat(usr, "Shuttle is controlled by autopilot.") + return + shuttleObject.thrust = CLAMP(params["thrust"], 0, 100) + if("setAngle") + if(QDELETED(shuttleObject)) + say("Shuttle not in flight.") + return + if(shuttleObject.autopilot) + to_chat(usr, "Shuttle is controlled by autopilot.") + return + shuttleObject.angle = params["angle"] + if("nautopilot") + if(QDELETED(shuttleObject) || !shuttleObject.shuttleTarget) + return + shuttleObject.autopilot = !shuttleObject.autopilot + shuttleObject.shuttleTargetPos = null + //Launch the shuttle. Lets do this. + if("launch") + launch_shuttle() + //Dock at location. + if("dock") + if(QDELETED(shuttleObject)) + say("Docking computer offline.") + return + if(!shuttleObject.can_dock_with) + say("Docking computer failed to find docking target.") + return + //Force dock with the thing we are colliding with. + shuttleObject.commence_docking(shuttleObject.can_dock_with, TRUE) + if("setTargetCoords") + if(QDELETED(shuttleObject)) + return + var/x = text2num(params["x"]) + var/y = text2num(params["y"]) + if(!shuttleObject.shuttleTargetPos) + shuttleObject.shuttleTargetPos = new(x, y) + else + shuttleObject.shuttleTargetPos.x = x + shuttleObject.shuttleTargetPos.y = y + shuttleObject.autopilot = FALSE + . = TRUE + if("interdict") + if(QDELETED(shuttleObject)) + say("Interdictor not ready.") + return + if(shuttleObject.docking_target || shuttleObject.can_dock_with) + say("Cannot use interdictor while docking.") + return + if(shuttleObject.stealth) + say("Cannot use interdictor on stealthed shuttles.") + return + var/list/interdicted_shuttles = list() + for(var/shuttleportid in SSorbits.assoc_shuttles) + var/datum/orbital_object/shuttle/other_shuttle = SSorbits.assoc_shuttles[shuttleportid] + //Do this last + if(other_shuttle == shuttleObject) + continue + if(other_shuttle?.position?.Distance(shuttleObject.position) <= interdiction_range && !other_shuttle.stealth) + interdicted_shuttles += other_shuttle + if(!length(interdicted_shuttles)) + say("No targets to interdict in range.") + return + say("Interdictor activated, shuttle throttling down...") + //Create the site of interdiction + var/datum/orbital_object/z_linked/beacon/z_linked = new /datum/orbital_object/z_linked/beacon/ruin/interdiction( + new /datum/orbital_vector(shuttleObject.position.x, shuttleObject.position.y) + ) + z_linked.name = "Interdiction Site" + //Lets tell everyone about it + priority_announce("Supercruise interdiction detected, interdicted shuttles have been registered onto local GPS units. Source: [shuttleObject.name]") + //Get all shuttle objects in range + for(var/datum/orbital_object/shuttle/other_shuttle in interdicted_shuttles) + other_shuttle.commence_docking(z_linked, TRUE) + random_drop(other_shuttle, other_shuttle.shuttle_port_id) + SSorbits.interdicted_shuttles[other_shuttle.shuttle_port_id] = world.time + interdiction_time + shuttleObject.commence_docking(z_linked, TRUE) + random_drop() + SSorbits.interdicted_shuttles[shuttleId] = world.time + interdiction_time + //Go to valid port + if("gotoPort") + if(QDELETED(shuttleObject)) + say("Shuttle has already landed, cannot dock at this time.") + return + if(QDELETED(shuttleObject.docking_target)) + say("Docking target lost, please re-establish orbital trajectory.") + return + if(shuttleObject.docking_frozen) + say("Cannot dock at this time.") + return + if(shuttleObject.docking_target.is_generating) + say("Please wait for docking computer to align...") + return + //Get our port + var/obj/docking_port/mobile/mobile_port = SSshuttle.getShuttle(shuttleId) + if(!mobile_port || mobile_port.destination != null) + return + //Check ready + if(mobile_port.mode == SHUTTLE_RECHARGING) + say("Supercruise Warning: Shuttle engines not ready for use.") + return + if(mobile_port.mode != SHUTTLE_CALL || mobile_port.destination) + say("Supercruise Warning: Already dethrottling shuttle.") + return + //Special check + if(params["port"] == "custom_location") + //Open up internal docking computer if any location is allowed. + if(shuttleObject.docking_target.can_dock_anywhere) + if(GLOB.shuttle_docking_jammed) + say("Shuttle docking computer jammed.") + return + if(current_user) + to_chat(usr, "Somebody is already docking the shuttle.") + return + view_range = max(mobile_port.width, mobile_port.height) + 4 + give_eye_control(usr) + eyeobj.forceMove(locate(world.maxx * 0.5, world.maxy * 0.5, shuttleObject.docking_target.linked_z_level[1].z_value)) + return + //If random dropping is allowed, random drop. + if(shuttleObject.docking_target.random_docking) + random_drop() + return + //Report exploit + log_admin("[usr] attempted to forge a target location through a tgui exploit on [src]") + message_admins("[ADMIN_FULLMONTY(usr)] attempted to forge a target location through a tgui exploit on [src]") + return + //Find the target port + var/obj/docking_port/stationary/target_port = SSshuttle.getDock(params["port"]) + if(!target_port) + return + if(!(target_port.id in valid_docks)) + log_admin("[usr] attempted to forge a target location through a tgui exploit on [src]") + message_admins("[ADMIN_FULLMONTY(usr)] attempted to forge a target location through a tgui exploit on [src]") + return + //Dont wipe z level while we are going + //Dont wipe z of where we are leaving for a bit, in case we come back. + SSzclear.temp_keep_z(z) + SSzclear.temp_keep_z(target_port.z) + switch(SSshuttle.moveShuttle(shuttleId, target_port.id, 1)) + if(0) + say("Initiating supercruise throttle-down, prepare for landing.") + if(current_user) + remove_eye_control(current_user) + QDEL_NULL(shuttleObject) + //Hold the shuttle in the docking position until ready. + mobile_port.setTimer(INFINITY) + say("Waiting for hyperspace lane...") + INVOKE_ASYNC(src, .proc/unfreeze_shuttle, mobile_port, SSmapping.get_level(target_port.z)) + if(1) + to_chat(usr, "Invalid shuttle requested.") + else + to_chat(usr, "Unable to comply.") + +/obj/machinery/computer/shuttle_flight/proc/launch_shuttle() + if(SSorbits.interdicted_shuttles.Find(shuttleId)) + if(world.time < SSorbits.interdicted_shuttles[shuttleId]) + var/time_left = (SSorbits.interdicted_shuttles[shuttleId] - world.time) * 0.1 + say("Supercruise Warning: Engines have been interdicted and will be recharged in [time_left] seconds.") + return + var/obj/docking_port/mobile/mobile_port = SSshuttle.getShuttle(shuttleId) + if(!mobile_port) + return + if(mobile_port.mode == SHUTTLE_RECHARGING) + say("Supercruise Warning: Shuttle engines not ready for use.") + return + if(mobile_port.mode != SHUTTLE_IDLE) + say("Supercruise Warning: Shuttle already in transit.") + return + if(SSorbits.assoc_shuttles.Find(shuttleId)) + say("Shuttle is controlled from another location, updating telemetry.") + shuttleObject = SSorbits.assoc_shuttles[shuttleId] + return shuttleObject + shuttleObject = mobile_port.enter_supercruise() + if(!shuttleObject) + say("Failed to enter supercruise due to an unknown error.") + return + shuttleObject.valid_docks = valid_docks + return shuttleObject + +/obj/machinery/computer/shuttle_flight/proc/random_drop(datum/orbital_object/shuttle/_shuttleObject = shuttleObject, _shuttleId = shuttleId) + //Find a random place to drop in at. + if(!(_shuttleObject?.docking_target?.linked_z_level)) + return FALSE + //Get shuttle dock + var/obj/docking_port/mobile/shuttle_dock = SSshuttle.getShuttle(_shuttleId) + if(!shuttle_dock) + return FALSE + var/datum/space_level/target_spacelevel = _shuttleObject.docking_target.linked_z_level[1] + var/target_zvalue = target_spacelevel.z_value + if(is_reserved_level(target_zvalue)) + message_admins("Shuttle [_shuttleId] attempted to dock on a reserved z-level as a result of docking with [_shuttleObject.docking_target.name].") + return FALSE + //Create temporary port + var/obj/docking_port/stationary/random_port = new + var/static/random_drops = 0 + random_port.id = "randomdroplocation_[random_drops++]" + random_port.name = "Random drop location" + random_port.delete_after = TRUE + random_port.width = shuttle_dock.width + random_port.height = shuttle_dock.height + random_port.dwidth = shuttle_dock.dwidth + random_port.dheight = shuttle_dock.dheight + var/sanity = 20 + var/square_length = max(shuttle_dock.width, shuttle_dock.height) + var/border_distance = 10 + square_length + //20 attempts to find a random port + while(sanity > 0) + sanity -- + //Place the port in a random valid area. + var/x = rand(border_distance, world.maxx - border_distance) + var/y = rand(border_distance, world.maxy - border_distance) + //Check to make sure there are no indestructible turfs in the way + random_port.setDir(pick(NORTH, SOUTH, EAST, WEST)) + random_port.forceMove(locate(x, y, target_zvalue)) + var/list/turfs = random_port.return_turfs() + var/valid = TRUE + for(var/turf/T as() in turfs) + if(istype(T, /turf/open/indestructible) || istype(T, /turf/closed/indestructible)) + valid = FALSE + break + if(!valid) + continue + //Dont wipe z level while we are going + //Dont wipe z of where we are leaving for a bit, in case we come back. + SSzclear.temp_keep_z(z) + SSzclear.temp_keep_z(target_zvalue) + //Ok lets go there + switch(SSshuttle.moveShuttle(_shuttleId, random_port.id, 1)) + if(0) + say("Initiating supercruise throttle-down, prepare for landing.") + if(current_user) + remove_eye_control(current_user) + QDEL_NULL(_shuttleObject) + //Hold the shuttle in the docking position until ready. + shuttle_dock.setTimer(INFINITY) + say("Waiting for hyperspace lane...") + INVOKE_ASYNC(src, .proc/unfreeze_shuttle, shuttle_dock, target_spacelevel) + return TRUE + if(1) + say("Invalid shuttle requested") + else + say("Unable to comply.") + qdel(random_port) + say("FAILED TO DROP IN A RANDOM PLACE PLEASE TRY AGAIN!!!!!!!!!") + return FALSE + +/obj/machinery/computer/shuttle_flight/proc/unfreeze_shuttle(obj/docking_port/mobile/shuttle_dock, datum/space_level/target_spacelevel) + var/start_time = world.time + UNTIL((!target_spacelevel.generating) || world.time > start_time + 3 MINUTES) + if(target_spacelevel.generating) + target_spacelevel.generating = FALSE + message_admins("CAUTION: SHUTTLE [shuttleId] REACHED THE GENERATION TIMEOUT OF 3 MINUTES. THE ASSIGNED Z-LEVEL IS STILL MARKED AS GENERATING, BUT WE ARE DOCKING ANYWAY.") + log_mapping("CAUTION: SHUTTLE [shuttleId] REACHED THE GENERATION TIMEOUT OF 3 MINUTES. THE ASSIGNED Z-LEVEL IS STILL MARKED AS GENERATING, BUT WE ARE DOCKING ANYWAY.") + shuttle_dock.setTimer(20) + +/obj/machinery/computer/shuttle_flight/emag_act(mob/user) + if(obj_flags & EMAGGED) + return + req_access = list() + obj_flags |= EMAGGED + to_chat(user, "You fried the consoles ID checking system.") + diff --git a/code/modules/shuttle/super_cruise/shuttle_components/shuttle_docking.dm b/code/modules/shuttle/super_cruise/shuttle_components/shuttle_docking.dm new file mode 100644 index 0000000000000..617ff6cf5d0a2 --- /dev/null +++ b/code/modules/shuttle/super_cruise/shuttle_components/shuttle_docking.dm @@ -0,0 +1,390 @@ + +/obj/machinery/computer/shuttle_flight + var/mob/camera/ai_eye/remote/eyeobj + var/mob/living/current_user = null + var/list/actions = list() + var/datum/action/innate/camera_off/off_action = new + var/datum/action/innate/shuttledocker_rotate/rotate_action = new + var/datum/action/innate/shuttledocker_place/place_action = new + var/shuttlePortId = "" + var/shuttlePortName = "custom location" + var/obj/docking_port/stationary/my_port //the custom docking port placed by this console + var/obj/docking_port/mobile/shuttle_port //the mobile docking port of the connected shuttle + var/view_range = 0 + var/list/whitelist_turfs = list(/turf/open/space, /turf/open/floor/plating/lavaland, /turf/open/floor/plating/asteroid, /turf/open/lava) + var/designate_time = 50 + var/turf/designating_target_loc + var/datum/action/innate/camera_jump/shuttle_docker/docker_action = new + +/obj/machinery/computer/shuttle_flight/Initialize(mapload, obj/item/circuitboard/C) + . = ..() + GLOB.navigation_computers += src + whitelist_turfs = typecacheof(whitelist_turfs) + +/obj/machinery/computer/shuttle_flight/Destroy() + . = ..() + GLOB.navigation_computers -= src + +/obj/machinery/computer/shuttle_flight/proc/GrantActions(mob/living/user) + if(off_action) + off_action.target = user + off_action.Grant(user) + actions += off_action + + if(rotate_action) + rotate_action.target = user + rotate_action.Grant(user) + actions += rotate_action + + if(place_action) + place_action.target = user + place_action.Grant(user) + actions += place_action + + if(docker_action) + docker_action.target = user + docker_action.Grant(user) + actions += docker_action + +/obj/machinery/computer/shuttle_flight/proc/CreateEye() + shuttle_port = SSshuttle.getShuttle(shuttleId) + if(QDELETED(shuttle_port)) + shuttle_port = null + return + + eyeobj = new /mob/camera/ai_eye/remote/shuttle_docker(null, src) + var/mob/camera/ai_eye/remote/shuttle_docker/the_eye = eyeobj + the_eye.setDir(shuttle_port.dir) + var/turf/origin = locate(shuttle_port.x, shuttle_port.y, shuttle_port.z) + for(var/V in shuttle_port.shuttle_areas) + var/area/A = V + for(var/turf/T in A) + if(T.get_virtual_z_level() != origin.get_virtual_z_level()) + continue + var/image/I = image('icons/effects/alphacolors.dmi', origin, "red") + var/x_off = T.x - origin.x + var/y_off = T.y - origin.y + I.loc = locate(origin.x + x_off, origin.y + y_off, origin.z) //we have to set this after creating the image because it might be null, and images created in nullspace are immutable. + I.layer = ABOVE_NORMAL_TURF_LAYER + I.plane = 0 + I.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + the_eye.placement_images[I] = list(x_off, y_off) + +/obj/machinery/computer/shuttle_flight/proc/give_eye_control(mob/user) + if(!isliving(user)) + return + if(!eyeobj) + CreateEye() + GrantActions(user) + current_user = user + eyeobj.eye_user = user + eyeobj.name = "Camera Eye ([user.name])" + user.remote_control = eyeobj + user.reset_perspective(eyeobj) + eyeobj.setLoc(eyeobj.loc) + user.client.view_size.supress() + if(!QDELETED(user) && user.client) + var/mob/camera/ai_eye/remote/shuttle_docker/the_eye = eyeobj + var/list/to_add = list() + to_add += the_eye.placement_images + to_add += the_eye.placed_images + if(!shuttleObject.stealth) + to_add += SSshuttle.hidden_shuttle_turf_images + + user.client.images += to_add + user.client.view_size.setTo(view_range) + +/obj/machinery/computer/shuttle_flight/remove_eye_control(mob/user) + if(!user) + return + for(var/V in actions) + var/datum/action/A = V + A.Remove(user) + actions.Cut() + for(var/V in eyeobj.visibleCameraChunks) + var/datum/camerachunk/C = V + C.remove(eyeobj) + if(user.client) + user.reset_perspective(null) + if(eyeobj.visible_icon && user.client) + user.client.images -= eyeobj.user_image + + user.client.view_size.unsupress() + + eyeobj.eye_user = null + user.remote_control = null + + current_user = null + user.unset_machine() + + playsound(src, 'sound/machines/terminal_off.ogg', 25, FALSE) + + if(!QDELETED(user) && user.client) + var/mob/camera/ai_eye/remote/shuttle_docker/the_eye = eyeobj + var/list/to_remove = list() + to_remove += the_eye.placement_images + to_remove += the_eye.placed_images + if(!shuttleObject.stealth) + to_remove += SSshuttle.hidden_shuttle_turf_images + + user.client.images -= to_remove + user.client.view_size.resetToDefault() + +/obj/machinery/computer/shuttle_flight/proc/placeLandingSpot() + if(designating_target_loc || !current_user) + return + + if(QDELETED(shuttleObject)) + to_chat(usr, "Shuttle has already docked.") + return + + var/mob/camera/ai_eye/remote/shuttle_docker/the_eye = eyeobj + var/landing_clear = checkLandingSpot() + if(designate_time && (landing_clear != SHUTTLE_DOCKER_BLOCKED)) + to_chat(current_user, "Targeting transit location, please wait [DisplayTimeText(designate_time)]...") + designating_target_loc = the_eye.loc + var/wait_completed = do_after(current_user, designate_time, FALSE, designating_target_loc, TRUE, CALLBACK(src, .proc/canDesignateTarget)) + designating_target_loc = null + if(!current_user) + return + if(!wait_completed) + to_chat(current_user, "Operation aborted.") + return + landing_clear = checkLandingSpot() + + if(landing_clear != SHUTTLE_DOCKER_LANDING_CLEAR) + switch(landing_clear) + if(SHUTTLE_DOCKER_BLOCKED) + to_chat(current_user, "Invalid transit location.") + if(SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT) + to_chat(current_user, "Unknown object detected in landing zone. Please designate another location.") + return + + ///Make one use port that deleted after fly off, to don't lose info that need on to properly fly off. + if(my_port) + my_port.delete_after = TRUE + my_port.id = null + my_port.name = "Old [my_port.name]" + my_port = null + + if(!my_port) + my_port = new() + my_port.name = shuttlePortName + my_port.id = shuttlePortId + my_port.height = shuttle_port.height + my_port.width = shuttle_port.width + my_port.dheight = shuttle_port.dheight + my_port.dwidth = shuttle_port.dwidth + my_port.hidden = shuttle_port.hidden + my_port.setDir(the_eye.dir) + my_port.forceMove(locate(eyeobj.x, eyeobj.y, eyeobj.z)) + + if(current_user.client) + current_user.client.images -= the_eye.placed_images + + QDEL_LIST(the_eye.placed_images) + + for(var/V in the_eye.placement_images) + var/image/I = V + var/image/newI = image('icons/effects/alphacolors.dmi', the_eye.loc, "blue") + newI.loc = I.loc //It is highly unlikely that any landing spot including a null tile will get this far, but better safe than sorry. + newI.layer = ABOVE_OPEN_TURF_LAYER + newI.plane = 0 + newI.mouse_opacity = 0 + the_eye.placed_images += newI + + //Go to destination + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) + switch(SSshuttle.moveShuttle(shuttleId, shuttlePortId, 1)) + if(0) + remove_eye_control(usr) + QDEL_NULL(shuttleObject) + //Hold the shuttle in the docking position until ready. + M.setTimer(INFINITY) + say("Waiting for hyperspace lane...") + INVOKE_ASYNC(src, .proc/unfreeze_shuttle, M, SSmapping.get_level(eyeobj.z)) + if(1) + to_chat(usr, "Invalid shuttle requested.") + else + to_chat(usr, "Unable to comply.") + + return TRUE + +/obj/machinery/computer/shuttle_flight/proc/canDesignateTarget() + if(!designating_target_loc || !current_user || (eyeobj.loc != designating_target_loc) || (stat & (NOPOWER|BROKEN)) ) + return FALSE + return TRUE + +/obj/machinery/computer/shuttle_flight/proc/rotateLandingSpot() + var/mob/camera/ai_eye/remote/shuttle_docker/the_eye = eyeobj + var/list/image_cache = the_eye.placement_images + the_eye.setDir(turn(the_eye.dir, -90)) + for(var/i in 1 to image_cache.len) + var/image/pic = image_cache[i] + var/list/coords = image_cache[pic] + var/Tmp = coords[1] + coords[1] = coords[2] + coords[2] = -Tmp + pic.loc = locate(the_eye.x + coords[1], the_eye.y + coords[2], the_eye.z) + checkLandingSpot() + +/obj/machinery/computer/shuttle_flight/proc/checkLandingSpot() + var/mob/camera/ai_eye/remote/shuttle_docker/the_eye = eyeobj + var/turf/eyeturf = get_turf(the_eye) + if(!eyeturf) + return SHUTTLE_DOCKER_BLOCKED + if(!eyeturf.z) + return SHUTTLE_DOCKER_BLOCKED + + . = SHUTTLE_DOCKER_LANDING_CLEAR + var/list/bounds = shuttle_port.return_coords(the_eye.x, the_eye.y, the_eye.dir) + var/list/overlappers = SSshuttle.get_dock_overlap(bounds[1], bounds[2], bounds[3], bounds[4], the_eye.z) + var/list/image_cache = the_eye.placement_images + for(var/i in 1 to image_cache.len) + var/image/I = image_cache[i] + var/list/coords = image_cache[I] + var/turf/T = locate(eyeturf.x + coords[1], eyeturf.y + coords[2], eyeturf.z) + I.loc = T + switch(checkLandingTurf(T, overlappers)) + if(SHUTTLE_DOCKER_LANDING_CLEAR) + I.icon_state = "green" + if(SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT) + I.icon_state = "green" + if(. == SHUTTLE_DOCKER_LANDING_CLEAR) + . = SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT + else + I.icon_state = "red" + . = SHUTTLE_DOCKER_BLOCKED + +/obj/machinery/computer/shuttle_flight/proc/checkLandingTurf(turf/T, list/overlappers) + // Too close to the map edge is never allowed + if(!T || T.x <= 10 || T.y <= 10 || T.x >= world.maxx - 10 || T.y >= world.maxy - 10) + return SHUTTLE_DOCKER_BLOCKED + // If it's one of our shuttle areas assume it's ok to be there + if(shuttle_port.shuttle_areas[T.loc]) + return SHUTTLE_DOCKER_LANDING_CLEAR + . = SHUTTLE_DOCKER_LANDING_CLEAR + // See if the turf is hidden from us + var/list/hidden_turf_info + if(!shuttleObject.stealth) + hidden_turf_info = SSshuttle.hidden_shuttle_turfs[T] + if(hidden_turf_info) + . = SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT + + 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] + if(port == my_port) + continue + var/port_hidden = !shuttleObject.stealth && port.hidden + var/list/overlap = overlappers[port] + var/list/xs = overlap[1] + var/list/ys = overlap[2] + if(xs["[T.x]"] && ys["[T.y]"]) + if(port_hidden) + . = SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT + else + return SHUTTLE_DOCKER_BLOCKED + +/obj/machinery/computer/shuttle_flight/proc/update_hidden_docking_ports(list/remove_images, list/add_images) + if(!shuttleObject?.stealth && current_user && current_user.client) + current_user.client.images -= remove_images + current_user.client.images += add_images + +/obj/machinery/computer/shuttle_flight/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 = "[shuttleId]_custom" + +/mob/camera/ai_eye/remote/shuttle_docker + visible_icon = FALSE + use_static = USE_STATIC_NONE + var/list/placement_images = list() + var/list/placed_images = list() + +/mob/camera/ai_eye/remote/shuttle_docker/Initialize(mapload, obj/machinery/computer/camera_advanced/origin) + src.origin = origin + return ..() + +/mob/camera/ai_eye/remote/shuttle_docker/setLoc(T) + ..() + var/obj/machinery/computer/shuttle_flight/console = origin + console.checkLandingSpot() + +/mob/camera/ai_eye/remote/shuttle_docker/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 + +/datum/action/innate/shuttledocker_rotate + name = "Rotate" + icon_icon = 'icons/mob/actions/actions_mecha.dmi' + button_icon_state = "mech_cycle_equip_off" + +/datum/action/innate/shuttledocker_rotate/Activate() + if(QDELETED(target) || !isliving(target)) + return + var/mob/living/C = target + var/mob/camera/ai_eye/remote/remote_eye = C.remote_control + var/obj/machinery/computer/shuttle_flight/origin = remote_eye.origin + origin.rotateLandingSpot() + +/datum/action/innate/shuttledocker_place + name = "Place" + icon_icon = 'icons/mob/actions/actions_mecha.dmi' + button_icon_state = "mech_zoom_off" + +/datum/action/innate/shuttledocker_place/Activate() + if(QDELETED(target) || !isliving(target)) + return + var/mob/living/C = target + var/mob/camera/ai_eye/remote/remote_eye = C.remote_control + var/obj/machinery/computer/shuttle_flight/origin = remote_eye.origin + origin.placeLandingSpot(target) + +/datum/action/innate/camera_jump/shuttle_docker + name = "Jump to Location" + button_icon_state = "camera_jump" + +/datum/action/innate/camera_jump/shuttle_docker/Activate() + if(QDELETED(target) || !isliving(target)) + return + var/mob/living/C = target + var/mob/camera/ai_eye/remote/remote_eye = C.remote_control + var/obj/machinery/computer/shuttle_flight/console = remote_eye.origin + + if(QDELETED(console.shuttleObject)) + return + + playsound(console, 'sound/machines/terminal_prompt_deny.ogg', 25, 0) + + var/list/L = list() + for(var/V in SSshuttle.stationary) + if(!V) + stack_trace("SSshuttle.stationary have null entry!") + continue + var/obj/docking_port/stationary/S = V + if(console.shuttleObject.docking_target.z_in_contents(S.z) && (S.id in console.valid_docks)) + L["(L.len)[S.name]"] = S + + playsound(console, 'sound/machines/terminal_prompt.ogg', 25, FALSE) + var/selected = input("Choose location to jump to", "Locations", null) as null|anything in L + if(QDELETED(src) || QDELETED(target) || !isliving(target)) + return + playsound(src, "terminal_type", 25, 0) + if(selected) + var/turf/T = get_turf(L[selected]) + if(T) + playsound(console, 'sound/machines/terminal_prompt_confirm.ogg', 25, 0) + remote_eye.setLoc(T) + to_chat(target, "Jumped to [selected].") + C.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash/static) + C.clear_fullscreen("flash", 3) + else + playsound(console, 'sound/machines/terminal_prompt_deny.ogg', 25, 0) diff --git a/code/modules/shuttle/super_cruise/shuttle_supercruise.dm b/code/modules/shuttle/super_cruise/shuttle_supercruise.dm new file mode 100644 index 0000000000000..b356364ef684b --- /dev/null +++ b/code/modules/shuttle/super_cruise/shuttle_supercruise.dm @@ -0,0 +1,26 @@ +/obj/docking_port/mobile/proc/enter_supercruise() + //Must be idle to supercruise. + if(mode != SHUTTLE_IDLE) + return + //Inherit orbital velocity of the place we are leaving + var/datum/space_level/z_level = SSmapping.get_level(z) + var/datum/orbital_object/orbital_body + if(!z_level || !z_level.orbital_body) + message_admins("Error: Shuttle is entering supercruise from a bad location. Shuttle: [name]") + log_runtime("Error: Shuttle is entering supercruise from a bad location. Shuttle: [name]") + var/datum/orbital_map/default_map = SSorbits.orbital_maps[PRIMARY_ORBITAL_MAP] + orbital_body = default_map.center + else + orbital_body = z_level.orbital_body + //Start moving + destination = null + mode = SHUTTLE_IGNITING + setTimer(ignitionTime) + //Enter the orbital system + var/datum/orbital_object/shuttle/our_orbital_body = new shuttle_object_type( + new /datum/orbital_vector(orbital_body.position.x + orbital_body.velocity.x, orbital_body.position.y + orbital_body.velocity.y), + new /datum/orbital_vector(orbital_body.velocity.x, orbital_body.velocity.y) + ) + //Linkup + our_orbital_body.link_shuttle(src) + return our_orbital_body diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index ff2e64238c5cf..e238e029192ee 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -17,7 +17,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/structure/receiving_pad, /obj/item/warp_cube, /obj/machinery/rnd/production, //print tracking beacons, send shuttle - /obj/machinery/autolathe, //same + /obj/machinery/modular_fabricator/autolathe, //same /obj/item/projectile/beam/wormhole, /obj/effect/portal, /obj/item/shared_storage, @@ -97,7 +97,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( for(var/datum/supply_order/SO in SSshuttle.shoppinglist) if(!empty_turfs.len) break - var/price = SO.pack.cost + var/price = SO.pack.get_cost() var/datum/bank_account/D if(SO.paying_account) //Someone paid out of pocket D = SO.paying_account @@ -113,8 +113,8 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( 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 + cargo.adjust_money(price - SO.pack.get_cost()) //Cargo gets the handling fee + value += SO.pack.get_cost() SSshuttle.shoppinglist -= SO SSshuttle.orderhistory += SO @@ -124,9 +124,12 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( miscboxes[D.account_holder] = new /obj/structure/closet/crate/secure/owned(pick_n_take(empty_turfs), SO.paying_account) miscboxes[D.account_holder].name = "small items crate - purchased by [D.account_holder]" misc_contents[D.account_holder] = list() + miscboxes[D.account_holder].req_access = 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] " + if(SO.pack.access) + miscboxes[D.account_holder].req_access += SO.pack.access 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/crate/secure(pick_n_take(empty_turfs)) @@ -142,7 +145,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( else SO.generate(pick_n_take(empty_turfs)) - SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[SO.pack.cost]", "[SO.pack.name]")) + SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[SO.pack.get_cost()]", "[SO.pack.name]")) 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)], paid by [D.account_holder] has shipped.") diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index b44102e2e7028..29ddd49e9f9f4 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -1,6 +1,6 @@ #define SYNDICATE_CHALLENGE_TIMER 12000 //20 minutes -/obj/machinery/computer/shuttle/syndicate +/obj/machinery/computer/shuttle_flight/syndicate name = "syndicate shuttle terminal" desc = "The terminal used to control the syndicate transport shuttle." circuit = /obj/item/circuitboard/computer/syndicate_shuttle @@ -12,29 +12,28 @@ possible_destinations = "syndicate_away;syndicate_z5;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s;syndicate_custom" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF -/obj/machinery/computer/shuttle/syndicate/recall +/obj/machinery/computer/shuttle_flight/syndicate/recall name = "syndicate shuttle recall terminal" desc = "Use this if your friends left you behind." - possible_destinations = "syndicate_away" + request_shuttle_message = "Recall Infiltrator" + recall_docking_port_id = "syndicate_away" - -/obj/machinery/computer/shuttle/syndicate/Topic(href, href_list) +/obj/machinery/computer/shuttle_flight/syndicate/ui_act(action, params) if(!usr.canUseTopic(src)) return - if(href_list["move"]) - var/obj/item/circuitboard/computer/syndicate_shuttle/board = circuit - if(board.challenge && world.time < SYNDICATE_CHALLENGE_TIMER) - to_chat(usr, "You've issued a combat challenge to the station! You've got to give them at least [DisplayTimeText(SYNDICATE_CHALLENGE_TIMER - world.time)] more to allow them to prepare.") - return 0 - board.moved = TRUE - ..() + var/obj/item/circuitboard/computer/syndicate_shuttle/board = circuit + if(board.challenge && world.time < SYNDICATE_CHALLENGE_TIMER) + to_chat(usr, "You've issued a combat challenge to the station! You've got to give them at least [DisplayTimeText(SYNDICATE_CHALLENGE_TIMER - world.time)] more to allow them to prepare.") + return FALSE + board.moved = TRUE + . = ..() -/obj/machinery/computer/shuttle/syndicate/allowed(mob/M) +/obj/machinery/computer/shuttle_flight/syndicate/allowed(mob/M) if(issilicon(M) && !(ROLE_SYNDICATE in M.faction)) return FALSE return ..() -/obj/machinery/computer/shuttle/syndicate/drop_pod +/obj/machinery/computer/shuttle_flight/syndicate/drop_pod name = "syndicate assault pod control" desc = "Controls the drop pod's launch system." icon = 'icons/obj/terminals.dmi' @@ -44,28 +43,7 @@ shuttleId = "steel_rain" possible_destinations = null clockwork = TRUE //it'd look weird + recall_docking_port_id = "null" //Make it a recall shuttle, with no default dest + request_shuttle_message = "INITIATE ASSAULT" -/obj/machinery/computer/shuttle/syndicate/drop_pod/Topic(href, href_list) - if(!usr.canUseTopic(src)) - return - if(href_list["move"]) - if(!is_centcom_level(z)) - to_chat(usr, "Pods are one way!") - return 0 - ..() - -/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate - name = "syndicate shuttle navigation computer" - desc = "Used to designate a precise transit location for the syndicate shuttle." - icon_screen = "syndishuttle" - icon_keyboard = "syndie_key" - shuttleId = "syndicate" - lock_override = CAMERA_LOCK_STATION - shuttlePortId = "syndicate_custom" - jumpto_ports = list("syndicate_ne" = 1, "syndicate_nw" = 1, "syndicate_n" = 1, "syndicate_se" = 1, "syndicate_sw" = 1, "syndicate_s" = 1) - view_range = 5.5 - x_offset = -7 - y_offset = -1 - see_hidden = TRUE - -#undef SYNDICATE_CHALLENGE_TIMER \ No newline at end of file +#undef SYNDICATE_CHALLENGE_TIMER diff --git a/code/modules/shuttle/white_ship.dm b/code/modules/shuttle/white_ship.dm index 66146edea1edc..17b60a0c0a0ba 100644 --- a/code/modules/shuttle/white_ship.dm +++ b/code/modules/shuttle/white_ship.dm @@ -1,54 +1,23 @@ -/obj/machinery/computer/shuttle/white_ship +/obj/machinery/computer/shuttle_flight/white_ship name = "White Ship Console" desc = "Used to control the White Ship." circuit = /obj/item/circuitboard/computer/white_ship shuttleId = "whiteship" possible_destinations = "whiteship_away;whiteship_home;whiteship_z4;whiteship_lavaland;whiteship_custom" -/obj/machinery/computer/shuttle/white_ship/pod +/obj/machinery/computer/shuttle_flight/white_ship/pod name = "Salvage Pod Console" desc = "Used to control the Salvage Pod." circuit = /obj/item/circuitboard/computer/white_ship/pod shuttleId = "whiteship_pod" possible_destinations = "whiteship_pod_home;whiteship_pod_custom" -/obj/machinery/computer/shuttle/white_ship/pod/recall +/obj/machinery/computer/shuttle_flight/white_ship/pod/recall name = "Salvage Pod Recall Console" desc = "Used to recall the Salvage Pod." circuit = /obj/item/circuitboard/computer/white_ship/pod/recall possible_destinations = "whiteship_pod_home" -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship - name = "White Ship Navigation Computer" - desc = "Used to designate a precise transit location for the White Ship." - shuttleId = "whiteship" - lock_override = NONE - shuttlePortId = "whiteship_custom" - jumpto_ports = list("whiteship_away" = 1, "whiteship_home" = 1, "whiteship_z4" = 1) - view_range = 10 - x_offset = -6 - y_offset = -10 - designate_time = 100 - -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/pod - name = "Salvage Pod Navigation Computer" - desc = "Used to designate a precise transit location for the Salvage Pod." - shuttleId = "whiteship_pod" - shuttlePortId = "whiteship_pod_custom" - jumpto_ports = list("whiteship_pod_home" = 1) - view_range = 0 - x_offset = -2 - y_offset = 0 - designate_time = 0 - -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/Initialize() - . = ..() - GLOB.jam_on_wardec += src - -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/Destroy() - GLOB.jam_on_wardec -= src - return ..() - /obj/effect/spawner/lootdrop/whiteship_cere_ripley name = "25% mech 75% wreckage ripley spawner" loot = list(/obj/mecha/working/ripley/mining = 1, diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 696739a04eb88..1bcf9306d6869 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -20,6 +20,12 @@ if(has_action) action = new base_action(src) +/obj/effect/proc_holder/Destroy() + if(!QDELETED(action)) + qdel(action) + action = null + return ..() + /obj/effect/proc_holder/proc/on_gain(mob/living/user) return @@ -35,8 +41,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for the badmin verb for now /obj/effect/proc_holder/Destroy() - if (action) - qdel(action) + QDEL_NULL(action) if(ranged_ability_user) remove_ranged_ability() return ..() @@ -103,8 +108,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th var/charge_type = "recharge" //can be recharge or charges, see charge_max and charge_counter descriptions; can also be based on the holder's vars now, use "holder_var" for that - var/charge_max = 100 //recharge time in deciseconds if charge_type = "recharge" or starting charges if charge_type = "charges" - var/charge_counter = 0 //can only cast spells if it equals recharge, ++ each decisecond if charge_type = "recharge" or -- each cast if charge_type = "charges" + var/charge_max = 10 SECONDS //recharge time in deciseconds if charge_type = "recharge" or starting charges if charge_type = "charges" + var/charge_counter = 0 //can only cast spells if it equals recharge, ++ each deciseconds if charge_type = "recharge" or -- each cast if charge_type = "charges" var/still_recharging_msg = "The spell is still recharging." var/recharging = TRUE @@ -136,6 +141,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th var/overlay_lifespan = 0 var/mutable_appearance/timer_overlay + var/mutable_appearance/text_overlay var/timer_overlay_active = FALSE var/timer_icon = 'icons/effects/cooldown.dmi' var/timer_icon_state_active = "second" @@ -227,20 +233,20 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th if(nonabstract_req && (isbrain(user) || ispAI(user))) to_chat(user, "This spell can only be cast by physical beings!") return FALSE - - - if(!skipcharge) - switch(charge_type) - if("recharge") - charge_counter = 0 //doesn't start recharging until the targets selecting ends - if("charges") - charge_counter-- //returns the charge if the targets selecting fails - if("holdervar") - adjust_var(user, holder_var_type, holder_var_amount) if(action) action.UpdateButtonIcon() return TRUE +/obj/effect/proc_holder/spell/proc/use_charge(mob/user) + switch(charge_type) + if("recharge") + charge_counter = 0 //doesn't start recharging until the targets selecting ends + if("charges") + charge_counter-- //returns the charge if the targets selecting fails + if("holdervar") + adjust_var(user, holder_var_type, holder_var_amount) + start_recharge() + /obj/effect/proc_holder/spell/proc/charge_check(mob/user, silent = FALSE) switch(charge_type) if("recharge") @@ -275,13 +281,12 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th /obj/effect/proc_holder/spell/Initialize() . = ..() - START_PROCESSING(SSfastprocess, src) still_recharging_msg = "[name] is still recharging." charge_counter = charge_max /obj/effect/proc_holder/spell/Destroy() - STOP_PROCESSING(SSfastprocess, src) + end_timer_animation() qdel(action) return ..() @@ -298,28 +303,36 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th /obj/effect/proc_holder/spell/proc/start_recharge() recharging = TRUE + begin_timer_animation() -/obj/effect/proc_holder/spell/process() +/obj/effect/proc_holder/spell/process(delta_time) if(recharging && charge_type == "recharge" && (charge_counter < charge_max)) - charge_counter += 2 //processes 5 times per second instead of 10. + charge_counter += delta_time * 10 update_timer_animation() if(charge_counter >= charge_max) end_timer_animation() action.UpdateButtonIcon() charge_counter = charge_max recharging = FALSE + else + end_timer_animation() + action.UpdateButtonIcon() + charge_counter = charge_max + recharging = FALSE /obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = TRUE, mob/user = usr) //if recharge is started is important for the trigger spells + if(!cast_check()) + return + use_charge(user) before_cast(targets) invocation(user) if(user?.ckey) user.log_message("cast the spell [name].", LOG_ATTACK) if(recharge) - recharging = TRUE + start_recharge() if(sound) playMagSound() cast(targets,user=user) - begin_timer_animation() after_cast(targets) if(action) action.UpdateButtonIcon() @@ -406,16 +419,23 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th target.vars[type] += amount //I bear no responsibility for the runtimes that'll happen if you try to adjust non-numeric or even non-existent vars /obj/effect/proc_holder/spell/targeted //can mean aoe for mobs (limited/unlimited number) or one target mob + ranged_mousepointer = 'icons/effects/cult_target.dmi' var/max_targets = 1 //leave 0 for unlimited targets in range, 1 for one selectable target in range, more for limited number of casts (can all target one guy, depends on target_ignore_prev) in range var/target_ignore_prev = 1 //only important if max_targets > 1, affects if the spell can be cast multiple times at one person from one cast var/include_user = 0 //if it includes usr in the target list var/random_target = 0 // chooses random viable target instead of asking the caster var/random_target_priority = TARGET_CLOSEST // if random_target is enabled how it will pick the target - + var/ranged_selection_active = FALSE /obj/effect/proc_holder/spell/aoe_turf //affects all turfs in view or range (depends) var/inner_radius = -1 //for all your ring spell needs +/obj/effect/proc_holder/spell/targeted/Click() + if(ranged_selection_active) + remove_ranged_ability("You are no longer casting [src].") + return + . = ..() + /obj/effect/proc_holder/spell/targeted/choose_targets(mob/user = usr) var/list/targets = list() @@ -442,7 +462,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th //Adds a safety check post-input to make sure those targets are actually in range. var/mob/M if(!random_target) - M = input("Choose the target for the spell.", "Targeting") as null|mob in sortNames(possible_targets) + add_ranged_ability(user, "Click on a target for which to cast [src] upon.", TRUE) + return else switch(random_target_priority) if(TARGET_RANDOM) @@ -484,6 +505,34 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th perform(targets,user=user) +/obj/effect/proc_holder/spell/targeted/remove_ranged_ability(msg) + . = ..() + ranged_selection_active = FALSE + +/obj/effect/proc_holder/spell/targeted/add_ranged_ability(mob/living/user, msg, forced) + . = ..() + ranged_selection_active = TRUE + +/obj/effect/proc_holder/spell/targeted/InterceptClickOn(mob/living/caller, params, atom/A) + if(..()) + return TRUE + if(ismob(A)) + if(A == caller && !include_user) + to_chat(caller, "You cannot target yourself!") + return TRUE + + var/list/targets = list(A) + + remove_ranged_ability() + + if(!targets.len) //doesn't waste the spell + revert_cast(caller) + return TRUE + + perform(targets, user=caller) + return FALSE + return TRUE + /obj/effect/proc_holder/spell/aoe_turf/choose_targets(mob/user = usr) var/list/targets = list() @@ -551,31 +600,48 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th /obj/effect/proc_holder/spell/proc/begin_timer_animation() if(!(action?.button) || timer_overlay_active) return + timer_overlay_active = TRUE timer_overlay = mutable_appearance(timer_icon, timer_icon_state_active) timer_overlay.alpha = 180 - action.button.add_overlay(timer_overlay) - action.button.maptext_x = 8 - action.button.maptext_y = -6 + + if(!text_overlay) + text_overlay = image(loc = action.button, layer=ABOVE_HUD_LAYER) + text_overlay.maptext_width = 64 + text_overlay.maptext_height = 64 + text_overlay.maptext_x = -8 + text_overlay.maptext_y = -6 + text_overlay.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA + + if(action.owner?.client) + action.owner.client.images += text_overlay + + action.button.add_overlay(timer_overlay, TRUE) action.has_cooldown_timer = TRUE update_timer_animation() + START_PROCESSING(SSfastprocess, src) + /obj/effect/proc_holder/spell/proc/update_timer_animation() //Update map text (todo) if(!(action?.button)) return - action.button.maptext = "
      [FLOOR((charge_max-charge_counter)/10, 1)]
      " - if(charge_counter >= charge_max) - end_timer_animation() + text_overlay.maptext = "
      [FLOOR((charge_max-charge_counter)/10, 1)]
      " /obj/effect/proc_holder/spell/proc/end_timer_animation() if(!(action?.button) || !timer_overlay_active) return timer_overlay_active = FALSE - action.button.cut_overlay(timer_overlay) - action.button.maptext = null + if(action.owner?.client) + action.owner.client.images -= text_overlay + action.button.cut_overlay(timer_overlay, TRUE) + timer_overlay = null + qdel(text_overlay) + text_overlay = null action.has_cooldown_timer = FALSE + STOP_PROCESSING(SSfastprocess, src) + //===================== /obj/effect/proc_holder/spell/self //Targets only the caster. Good for buffs and heals, but probably not wise for fireballs (although they usually fireball themselves anyway, honke) diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index 26e4191308cd3..75b11adf5ebfd 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -77,7 +77,7 @@ if(!projectile_type) return for(var/i in 1 to projectiles_per_fire) - var/obj/item/projectile/P = new projectile_type(user.loc) + var/obj/item/projectile/P = new projectile_type(user.loc, spell_level) P.firer = user P.preparePixelProjectile(target, user) for(var/V in projectile_var_overrides) diff --git a/code/modules/spells/spell_types/barnyard.dm b/code/modules/spells/spell_types/barnyard.dm index 6fe5458e2c9b3..93ef535a4b85a 100644 --- a/code/modules/spells/spell_types/barnyard.dm +++ b/code/modules/spells/spell_types/barnyard.dm @@ -4,7 +4,6 @@ school = "transmutation" charge_type = "recharge" charge_max = 150 - charge_counter = 0 clothes_req = FALSE stat_allowed = FALSE invocation = "KN'A FTAGHU, PUCK 'BTHNK!" @@ -17,14 +16,14 @@ action_icon_state = "barn" /obj/effect/proc_holder/spell/targeted/barnyardcurse/cast(list/targets, mob/user = usr) - if(!targets.len) + if(!length(targets)) to_chat(user, "No target found in range.") return var/mob/living/carbon/target = targets[1] - if(!is_type_in_typecache(target, compatible_mobs_typecache)) + if(!compatible_mobs_typecache[target.type]) to_chat(user, "You are unable to curse [target]'s head!") return @@ -32,7 +31,7 @@ to_chat(user, "[target.p_theyre(TRUE)] too far away!") return - if(target.anti_magic_check()) + if(target.anti_magic_check() || HAS_TRAIT(target, TRAIT_WARDED)) to_chat(user, "The spell had no effect!") target.visible_message("[target]'s face bursts into flames, which instantly burst outward, leaving [target] unharmed!", \ "Your face starts burning up, but the flames are repulsed by your anti-magic protection!") @@ -46,6 +45,6 @@ "Your face burns up, and shortly after the fire you realise you have the face of a barnyard animal!") if(!target.dropItemToGround(target.wear_mask)) qdel(target.wear_mask) - target.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, 1, 1) + target.equip_to_slot_if_possible(magichead, ITEM_SLOT_MASK, 1, 1) target.flash_act() diff --git a/code/modules/spells/spell_types/blind.dm b/code/modules/spells/spell_types/blind.dm index f2745e2922939..4f9673c2def78 100644 --- a/code/modules/spells/spell_types/blind.dm +++ b/code/modules/spells/spell_types/blind.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/pointed/trigger/blind +/obj/effect/proc_holder/spell/targeted/blind name = "Blind" desc = "This spell temporarily blinds a single target." school = "transmutation" @@ -6,29 +6,44 @@ clothes_req = FALSE invocation = "STI KALY" invocation_type = "whisper" - message = "Your eyes cry out in pain!" cooldown_min = 50 //12 deciseconds reduction per rank - starting_spells = list("/obj/effect/proc_holder/spell/targeted/inflict_handler/blind", "/obj/effect/proc_holder/spell/targeted/genetic/blind") ranged_mousepointer = 'icons/effects/blind_target.dmi' action_icon_state = "blind" - base_icon_state = "blind" - active_msg = "You prepare to blind a target..." + range = 7 + selection_type = "range" + var/duration = 300 //30 seconds + var/static/list/compatible_mobs_typecache = typecacheof(list(/mob/living/carbon/human)) -/obj/effect/proc_holder/spell/targeted/inflict_handler/blind - amt_eye_blind = 10 - amt_eye_blurry = 20 - sound = 'sound/magic/blind.ogg' -/obj/effect/proc_holder/spell/targeted/genetic/blind - mutations = list(BLINDMUT) - duration = 300 - charge_max = 400 // needs to be higher than the duration or it'll be permanent - sound = 'sound/magic/blind.ogg' +/obj/effect/proc_holder/spell/targeted/blind/cast(list/targets, mob/user = usr) + if(!length(targets)) + to_chat(user, "No target found in range.") + revert_cast() + return + + var/mob/living/carbon/target = targets[1] -/obj/effect/proc_holder/spell/pointed/trigger/blind/intercept_check(mob/user, atom/target) - if(!..()) - return FALSE - if(!isliving(target)) - to_chat(user, "You can only blind living beings!") - return FALSE - return TRUE + if(!compatible_mobs_typecache[target.type]) + to_chat(user, "You are unable to curse [target] with blindness!") + revert_cast() + return + + if(!(target in oview(range))) + to_chat(user, "[target.p_theyre(TRUE)] too far away!") + revert_cast() + return + + if(target.anti_magic_check() || HAS_TRAIT(target, TRAIT_WARDED)) + to_chat(user, "The spell had no effect!") + target.visible_message("[target]'s eyes darken, but instantly turn back to their regular color, leaving [target] unharmed!", \ + "Your eyes hurt for a moment, but the blindness is repulsed by your anti-magic protection!") + return + + target.visible_message("[target]'s eyes darken as black smoke starts coming out of them!", \ + "Your eyes hurt as they start smoking, you panic as you realise you're blind!") + target.emote("scream") + target.become_blind(MAGIC_BLIND) + addtimer(CALLBACK(src, .proc/cure_blindness, target), duration) + +/obj/effect/proc_holder/spell/targeted/blind/proc/cure_blindness(mob/living/L) + L.cure_blind(MAGIC_BLIND) diff --git a/code/modules/spells/spell_types/bloodcrawl.dm b/code/modules/spells/spell_types/bloodcrawl.dm index 55524788b79ad..eb07ecb20536a 100644 --- a/code/modules/spells/spell_types/bloodcrawl.dm +++ b/code/modules/spells/spell_types/bloodcrawl.dm @@ -15,7 +15,7 @@ var/phased = FALSE /obj/effect/proc_holder/spell/bloodcrawl/choose_targets(mob/user = usr) - for(var/obj/effect/decal/cleanable/target in range(range, get_turf(user))) + for(var/obj/effect/decal/cleanable/target in view(range, get_turf(user))) if(target.can_bloodcrawl_in()) perform(target) return diff --git a/code/modules/spells/spell_types/cluwnecurse.dm b/code/modules/spells/spell_types/cluwnecurse.dm index 8c85f33fbd9b6..dee80792e5c48 100644 --- a/code/modules/spells/spell_types/cluwnecurse.dm +++ b/code/modules/spells/spell_types/cluwnecurse.dm @@ -4,7 +4,6 @@ school = "transmutation" charge_type = "recharge" charge_max = 600 - charge_counter = 0 clothes_req = 1 stat_allowed = 0 invocation = "CLU WO'NIS CA'TE'BEST'IS MAXIMUS!" diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm index 3921a0c3ca9fd..91bb2456132f4 100644 --- a/code/modules/spells/spell_types/construct_spells.dm +++ b/code/modules/spells/spell_types/construct_spells.dm @@ -174,6 +174,11 @@ color = "red" //Looks more culty this way range = 10 +/obj/item/projectile/magic/spell/magic_missile/lesser/can_hit_target(atom/target, list/passthrough, direct_target = FALSE, ignore_loc = FALSE) + if(ismob(target) && iscultist(target)) + return FALSE + return ..() + /obj/effect/proc_holder/spell/targeted/smoke/disable name = "Paralysing Smoke" desc = "This spell spawns a cloud of paralysing smoke." @@ -231,14 +236,12 @@ to_chat(target, "A freezing darkness surrounds you...") target.playsound_local(get_turf(target), 'sound/hallucinations/i_see_you1.ogg', 50, 1) user.playsound_local(get_turf(user), 'sound/effects/ghost2.ogg', 50, 1) - target.become_blind(ABYSSAL_GAZE_BLIND) + target.become_blind(MAGIC_BLIND) addtimer(CALLBACK(src, .proc/cure_blindness, target), 40) target.adjust_bodytemperature(-200) -/obj/effect/proc_holder/spell/targeted/abyssal_gaze/proc/cure_blindness(mob/target) - if(isliving(target)) - var/mob/living/L = target - L.cure_blind(ABYSSAL_GAZE_BLIND) +/obj/effect/proc_holder/spell/targeted/abyssal_gaze/proc/cure_blindness(mob/living/L) + L.cure_blind(MAGIC_BLIND) /obj/effect/proc_holder/spell/targeted/dominate name = "Dominate" @@ -276,7 +279,7 @@ revert_cast() return - if(S.sentience_type != SENTIENCE_ORGANIC) + if(!istype(S) || S.sentience_type != SENTIENCE_ORGANIC) to_chat(user, "[S] cannot be dominated!") revert_cast() return @@ -334,7 +337,7 @@ var/turf/T = get_turf(src) playsound(T, 'sound/weapons/resonator_blast.ogg', 100, FALSE) new /obj/effect/temp_visual/cult/sac(T) - for(var/obj/O in range(src,1)) + for(var/obj/O in range(1, src)) if(O.density && !istype(O, /obj/structure/destructible/cult)) O.take_damage(90, BRUTE, "melee", 0) new /obj/effect/temp_visual/cult/turf/floor(get_turf(O)) diff --git a/code/modules/spells/spell_types/curse.dm b/code/modules/spells/spell_types/curse.dm index 6c1a975781d2b..d8d86cf0459d0 100644 --- a/code/modules/spells/spell_types/curse.dm +++ b/code/modules/spells/spell_types/curse.dm @@ -16,10 +16,10 @@ GLOBAL_VAR_INIT(curse_of_madness_triggered, FALSE) var/turf/T = get_turf(H) if(T && !is_station_level(T.z)) continue - if(H.anti_magic_check(TRUE, FALSE)) + if(H.anti_magic_check(TRUE, FALSE) || HAS_TRAIT(H, TRAIT_WARDED)) to_chat(H, "You have a strange feeling for a moment, but then it passes.") continue - if(istype(H.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(istype(H.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) to_chat(H, "Your protective headgear successfully deflects mind controlling brainwaves!") continue give_madness(H, message) diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm index 91d16d8f62269..62494c60bcb42 100644 --- a/code/modules/spells/spell_types/devil.dm +++ b/code/modules/spells/spell_types/devil.dm @@ -5,7 +5,7 @@ include_user = TRUE range = -1 clothes_req = FALSE - item_type = /obj/item/twohanded/pitchfork/demonic + item_type = /obj/item/pitchfork/demonic school = "conjuration" charge_max = 150 @@ -15,16 +15,16 @@ action_background_icon_state = "bg_demon" /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/greater - item_type = /obj/item/twohanded/pitchfork/demonic/greater + item_type = /obj/item/pitchfork/demonic/greater /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/ascended - item_type = /obj/item/twohanded/pitchfork/demonic/ascended + item_type = /obj/item/pitchfork/demonic/ascended /obj/effect/proc_holder/spell/targeted/conjure_item/violin item_type = /obj/item/instrument/violin/golden desc = "A devil's instrument of choice. Use this to summon/unsummon your golden violin." invocation_type = "whisper" - invocation = "I aint have this much fun since Georgia." + invocation = "I ain't have this much fun since Georgia." action_icon_state = "golden_violin" name = "Summon golden violin" action_icon = 'icons/mob/actions/actions_minor_antag.dmi' @@ -237,7 +237,7 @@ T.ChangeTurf(dancefloor_turfs_types[i], flags = CHANGETURF_INHERIT_AIR) else var/list/funky_turfs = RANGE_TURFS(1, user) - for(var/turf/closed/solid in funky_turfs) + if(locate(/turf/closed) in funky_turfs) to_chat(user, "You're too close to a wall.") return dancefloor_exists = TRUE diff --git a/code/modules/spells/spell_types/emplosion.dm b/code/modules/spells/spell_types/emplosion.dm index a5ba0a39142cc..967ec0d042871 100644 --- a/code/modules/spells/spell_types/emplosion.dm +++ b/code/modules/spells/spell_types/emplosion.dm @@ -11,8 +11,7 @@ /obj/effect/proc_holder/spell/targeted/emplosion/cast(list/targets,mob/user = usr) playsound(get_turf(user), sound, 50,1) for(var/mob/living/target in targets) - if(target.anti_magic_check()) + if(target.anti_magic_check() && target != user) continue empulse(target.loc, emp_heavy, emp_light) - return \ No newline at end of file diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm index ea259c76fe27a..d12e191ea4330 100644 --- a/code/modules/spells/spell_types/ethereal_jaunt.dm +++ b/code/modules/spells/spell_types/ethereal_jaunt.dm @@ -31,10 +31,12 @@ target.forceMove(holder) target.reset_perspective(holder) target.notransform=0 //mob is safely inside holder now, no need for protection. + target.ignore_slowdown(JAUNT_TRAIT) jaunt_steam(mobloc) sleep(jaunt_duration) + target.unignore_slowdown(JAUNT_TRAIT) if(target.loc != holder) //mob warped out of the warp qdel(holder) return diff --git a/code/modules/spells/spell_types/forcewall.dm b/code/modules/spells/spell_types/forcewall.dm index 652242ea99904..84a338d254256 100644 --- a/code/modules/spells/spell_types/forcewall.dm +++ b/code/modules/spells/spell_types/forcewall.dm @@ -14,19 +14,19 @@ var/wall_type = /obj/effect/forcefield/wizard /obj/effect/proc_holder/spell/targeted/forcewall/cast(list/targets,mob/user = usr) - new wall_type(get_turf(user),user) + new wall_type(get_turf(user), null, user) if(user.dir == SOUTH || user.dir == NORTH) - new wall_type(get_step(user, EAST),user) - new wall_type(get_step(user, WEST),user) + new wall_type(get_step(user, EAST), null, user) + new wall_type(get_step(user, WEST), null, user) else - new wall_type(get_step(user, NORTH),user) - new wall_type(get_step(user, SOUTH),user) + new wall_type(get_step(user, NORTH), null, user) + new wall_type(get_step(user, SOUTH), null, user) /obj/effect/forcefield/wizard var/mob/wizard -/obj/effect/forcefield/wizard/Initialize(mapload, mob/summoner) +/obj/effect/forcefield/wizard/Initialize(mapload, ntimeleft, mob/summoner) . = ..() wizard = summoner diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index 45ccf13bc8039..2bd291c937e28 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -31,10 +31,14 @@ /obj/item/melee/touch_attack/afterattack(atom/target, mob/user, proximity) . = ..() + //Use the spell + attached_spell.spell_used = TRUE + //Do effects user.say(catchphrase, forced = "spell") playsound(get_turf(user), on_use_sound,50,1) charges-- if(charges <= 0) + attached_spell.use_charge(user) qdel(src) /obj/item/melee/touch_attack/Destroy() @@ -58,7 +62,7 @@ return var/mob/M = target do_sparks(4, FALSE, M.loc) - for(var/mob/living/L in view(src, 7)) + for(var/mob/living/L in viewers(7, get_turf(src))) if(L != user) L.flash_act(affect_silicon = FALSE) var/atom/A = M.anti_magic_check() @@ -71,7 +75,7 @@ if(part) part.dismember() return ..() - var/obj/item/clothing/suit/hooded/bloated_human/suit = M.get_item_by_slot(SLOT_WEAR_SUIT) + var/obj/item/clothing/suit/hooded/bloated_human/suit = M.get_item_by_slot(ITEM_SLOT_OCLOTHING) if(istype(suit)) M.visible_message("[M]'s [suit] explodes off of them into a puddle of gore!") M.dropItemToGround(suit) @@ -120,7 +124,6 @@ /obj/item/melee/touch_attack/megahonk/afterattack(atom/target, mob/living/carbon/user, proximity) if(!proximity || !iscarbon(target) || !iscarbon(user) || user.handcuffed) return - user.say(catchphrase, forced = "spell") playsound(get_turf(target), on_use_sound,100,1) for(var/mob/living/carbon/M in (hearers(1, target) - user)) //3x3 around the target, not affecting the user if(ishuman(M)) @@ -138,9 +141,7 @@ else M.Jitter(500*mul) - charges-- - if(charges <= 0) - qdel(src) + . = ..() /obj/item/melee/touch_attack/megahonk/attack_self(mob/user) . = ..() @@ -175,19 +176,6 @@ var/obj/item/reagent_containers/food/snacks/pie/cream/body/pie = new(get_turf(M)) pie.name = "\improper [name] [pie.name]" - playsound(get_turf(target), on_use_sound, 50, 1) + . = ..() - /* - var/obj/item/bodypart/head = M.get_bodypart("head") - if(head) - head.drop_limb() - head.throw_at(get_turf(head), 1, 1) - qdel(M) - */ M.forceMove(pie) - - - charges-- - - if(charges <= 0) - qdel(src) diff --git a/code/modules/spells/spell_types/hivemind.dm b/code/modules/spells/spell_types/hivemind.dm index 8126f19e933f0..bf44e059da036 100644 --- a/code/modules/spells/spell_types/hivemind.dm +++ b/code/modules/spells/spell_types/hivemind.dm @@ -57,14 +57,14 @@ var/success = FALSE if(target.mind && target.client && target.stat != DEAD) - if((!HAS_TRAIT(target, TRAIT_MINDSHIELD) || ignore_mindshield) && !istype(target.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if((!HAS_TRAIT(target, TRAIT_MINDSHIELD) || ignore_mindshield) && !istype(target.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) if(HAS_TRAIT(target, TRAIT_MINDSHIELD) && ignore_mindshield) to_chat(user, "We bruteforce our way past the mental barriers of [target.name] and begin linking our minds!") else to_chat(user, "We begin linking our mind with [target.name]!") - if(do_after(user,5*(1.5**get_dist(user, target)),0,user) && (target in view(range))) - if(do_after(user,5*(1.5**get_dist(user, target)),0,user) && (target in view(range))) - if((!HAS_TRAIT(target, TRAIT_MINDSHIELD) || ignore_mindshield) && (target in view(range))) + if(do_after(user,5*(1.5**get_dist(user, target)),0,user) && (user in viewers(range, target))) + if(do_after(user,5*(1.5**get_dist(user, target)),0,user) && (user in viewers(range, target))) + if((!HAS_TRAIT(target, TRAIT_MINDSHIELD) || ignore_mindshield) && (user in viewers(range, target))) to_chat(user, "[target.name] was added to the Hive!") success = TRUE hive.add_to_hive(target) @@ -140,7 +140,7 @@ active = TRUE host = user user.clear_fullscreen("hive_mc") - user.overlay_fullscreen("hive_eyes", /obj/screen/fullscreen/hive_eyes) + user.overlay_fullscreen("hive_eyes", /atom/movable/screen/fullscreen/hive_eyes) revert_cast() else vessel.remove_status_effect(STATUS_EFFECT_BUGGED) @@ -148,7 +148,7 @@ user.clear_fullscreen("hive_eyes") var/obj/effect/proc_holder/spell/target_hive/hive_control/the_spell = locate(/obj/effect/proc_holder/spell/target_hive/hive_control) in user.mind.spell_list if(the_spell && the_spell.active) - user.overlay_fullscreen("hive_mc", /obj/screen/fullscreen/hive_mc) + user.overlay_fullscreen("hive_mc", /atom/movable/screen/fullscreen/hive_mc) active = FALSE revert_cast() @@ -195,7 +195,7 @@ power *= 2.5 else power *= 3 - if(power > 50 && user.z == target.z) + if(power > 50 && user.get_virtual_z_level() == target.get_virtual_z_level()) to_chat(user, "We have overloaded the vessel for a short time!") target.Jitter(round(power/10)) target.Unconscious(power) @@ -236,7 +236,7 @@ break distance = get_dist(user, L) message = "[(L.is_real_hivehost()) ? "Someone": "A hivemind host"] tracking us" - if(user.z != L.z || L.stat == DEAD) + if(user.get_virtual_z_level() != L.get_virtual_z_level() || L.stat == DEAD) message += " could not be found." else switch(distance) @@ -259,7 +259,7 @@ var/mob/living/real_enemy = C.get_real_hivehost() distance = get_dist(user, real_enemy) message = "A host that we can track for [(hive.individual_track_bonus[enemy])/10] extra seconds" - if(user.z != real_enemy.z || real_enemy.stat == DEAD) + if(user.get_virtual_z_level() != real_enemy.get_virtual_z_level() || real_enemy.stat == DEAD) message += " could not be found." else switch(distance) @@ -334,7 +334,7 @@ to_chat(src, "You find yourself unable to emote, you aren't in control of your body!") return -/mob/living/passenger/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) +/mob/living/passenger/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mods) return /obj/effect/proc_holder/spell/target_hive/hive_control @@ -401,7 +401,7 @@ to_chat(user, "We fail to assume control of the target.") revert_cast() return - if(user.z != vessel.z) + if(user.get_virtual_z_level() != vessel.get_virtual_z_level()) to_chat(user, "Our vessel is too far away to control.") revert_cast() return @@ -430,7 +430,7 @@ vessel.mind.transfer_to(backseat, 1) user.mind.transfer_to(vessel, 1) backseat.blind_eyes(power) - vessel.overlay_fullscreen("hive_mc", /obj/screen/fullscreen/hive_mc) + vessel.overlay_fullscreen("hive_mc", /atom/movable/screen/fullscreen/hive_mc) active = TRUE out_of_range = FALSE starting_spot = get_turf(vessel) @@ -460,7 +460,7 @@ original_body.adjustOrganLoss(ORGAN_SLOT_BRAIN, 200) to_chat(vessel.mind, "Our vessel is one of us no more!") release_control() - else if(!QDELETED(original_body) && original_body.z != vessel.z) //Return to original bodies + else if(!QDELETED(original_body) && original_body.get_virtual_z_level() != vessel.get_virtual_z_level()) //Return to original bodies release_control() to_chat(original_body, "Our vessel is too far away to control!") else if(QDELETED(original_body) || original_body.stat == DEAD) //Return vessel to its body, either return or ghost the original @@ -620,7 +620,7 @@ if(!hive) to_chat(user, "This is a bug. Error:HIVE1") return - if(target.z != user.z) + if(target.get_virtual_z_level() != user.get_virtual_z_level()) to_chat(user, "We are too far away from [target.name] to affect them!") return to_chat(user, "We successfully distort reality surrounding [target.name]!") @@ -628,7 +628,7 @@ distort(user, target, pulse_cap) /obj/effect/proc_holder/spell/target_hive/hive_warp/proc/distort(user, target, pulse_cap, pulses = 0) - for(var/mob/living/carbon/human/victim in view(7,target)) + for(var/mob/living/carbon/human/victim in hearers(7,target)) if(user == victim || victim.is_real_hivehost()) continue if(pulses < 4) @@ -853,9 +853,9 @@ var/wall_type_b = /obj/effect/forcefield/wizard/hive/invis /obj/effect/proc_holder/spell/targeted/forcewall/hive/cast(list/targets,mob/user = usr) - new wall_type(get_turf(user),user) + new wall_type(get_turf(user), null, user) for(var/dir in GLOB.alldirs) - new wall_type_b(get_step(user, dir),user) + new wall_type_b(get_step(user, dir), null, user) var/datum/antagonist/hivemind/hive = user.mind.has_antag_datum(/datum/antagonist/hivemind) if(hive) hive.threat_level += 0.5 diff --git a/code/modules/spells/spell_types/inflict_handler.dm b/code/modules/spells/spell_types/inflict_handler.dm deleted file mode 100644 index 2ad9a5ed169b9..0000000000000 --- a/code/modules/spells/spell_types/inflict_handler.dm +++ /dev/null @@ -1,60 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/inflict_handler - name = "Inflict Handler" - desc = "This spell blinds and/or destroys/damages/heals and/or knockdowns/stuns the target." - - var/amt_paralyze = 0 - var/amt_unconscious = 0 - var/amt_stun = 0 - - var/inflict_status - var/list/status_params = list() - - //set to negatives for healing - var/amt_dam_fire = 0 - var/amt_dam_brute = 0 - var/amt_dam_oxy = 0 - var/amt_dam_tox = 0 - - var/amt_eye_blind = 0 - var/amt_eye_blurry = 0 - - var/destroys = "none" //can be "none", "gib" or "disintegrate" - - var/summon_type = null //this will put an obj at the target's location - - var/check_anti_magic = TRUE - var/check_holy = FALSE - -/obj/effect/proc_holder/spell/targeted/inflict_handler/cast(list/targets,mob/user = usr) - for(var/mob/living/target in targets) - playsound(target,sound, 50,1) - if(target.anti_magic_check(check_anti_magic, check_holy)) - return - switch(destroys) - if("gib") - target.gib() - if("disintegrate") - target.dust() - - if(!target) - continue - //damage/healing - target.adjustBruteLoss(amt_dam_brute) - target.adjustFireLoss(amt_dam_fire) - target.adjustToxLoss(amt_dam_tox) - target.adjustOxyLoss(amt_dam_oxy) - //disabling - target.Paralyze(amt_paralyze) - target.Unconscious(amt_unconscious) - target.Stun(amt_stun) - - target.blind_eyes(amt_eye_blind) - target.blur_eyes(amt_eye_blurry) - //summoning - if(summon_type) - new summon_type(target.loc, target) - - if(inflict_status) - var/list/stat_args = status_params.Copy() - stat_args.Insert(1,inflict_status) - target.apply_status_effect(arglist(stat_args)) diff --git a/code/modules/spells/spell_types/knock.dm b/code/modules/spells/spell_types/knock.dm index 63e010ba13da0..7a0319394d531 100644 --- a/code/modules/spells/spell_types/knock.dm +++ b/code/modules/spells/spell_types/knock.dm @@ -24,6 +24,7 @@ if(istype(door, /obj/machinery/door/airlock)) var/obj/machinery/door/airlock/A = door A.locked = FALSE + A.wires.ui_update() door.open() /obj/effect/proc_holder/spell/aoe_turf/knock/proc/open_closet(var/obj/structure/closet/C) diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index 1d2324b43f6b6..fd66f8a6faef5 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -67,9 +67,9 @@ H.dropItemToGround(H.w_uniform) H.dropItemToGround(H.wear_suit) H.dropItemToGround(H.head) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), SLOT_WEAR_SUIT) - H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), SLOT_HEAD) - H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), SLOT_W_UNIFORM) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), ITEM_SLOT_OCLOTHING) + H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), ITEM_SLOT_HEAD) + H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), ITEM_SLOT_ICLOTHING) // you only get one phylactery. M.mind.RemoveSpell(src) @@ -128,15 +128,15 @@ var/mob/old_body = mind.current var/mob/living/carbon/human/lich = new(item_turf) - lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(lich), SLOT_SHOES) - lich.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(lich), SLOT_W_UNIFORM) - lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), SLOT_WEAR_SUIT) - lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), SLOT_HEAD) + lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(lich), ITEM_SLOT_FEET) + lich.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(lich), ITEM_SLOT_ICLOTHING) + lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), ITEM_SLOT_OCLOTHING) + lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), ITEM_SLOT_HEAD) lich.real_name = mind.name mind.transfer_to(lich) mind.grab_ghost(force=TRUE) - lich.hardset_dna(null,null,lich.real_name,null, new /datum/species/skeleton) + lich.hardset_dna(null,null,lich.real_name,null, new /datum/species/skeleton,null) to_chat(lich, "Your bones clatter and shudder as you are pulled back into this world!") var/turf/body_turf = get_turf(old_body) lich.Paralyze(200 + 200*resurrections) diff --git a/code/modules/spells/spell_types/mime.dm b/code/modules/spells/spell_types/mime.dm index c8cf09b99f2b7..ce9551caf70bb 100644 --- a/code/modules/spells/spell_types/mime.dm +++ b/code/modules/spells/spell_types/mime.dm @@ -6,7 +6,7 @@ summon_type = list(/obj/effect/forcefield/mime) invocation_type = "emote" invocation_emote_self = "You form a wall in front of yourself." - summon_lifespan = 300 + summon_lifespan = 100 charge_max = 300 clothes_req = FALSE antimagic_allowed = TRUE @@ -174,45 +174,41 @@ invocation_type ="none" ..() -/obj/effect/proc_holder/spell/aimed/finger_guns +/obj/effect/proc_holder/spell/targeted/mime/finger_guns name = "Finger Guns" desc = "Shoot a mimed bullet from your fingers that stuns and does some damage." school = "mime" panel = "Mime" charge_max = 300 + range = -1 clothes_req = FALSE antimagic_allowed = TRUE + include_user = TRUE invocation_type = "emote" invocation_emote_self = "You fire your finger gun!" - range = 20 - projectile_type = /obj/item/projectile/bullet/mime - projectile_amount = 3 sound = null - active_msg = "You draw your fingers!" - deactive_msg = "You put your fingers at ease. Another time." - active = FALSE action_icon = 'icons/mob/actions/actions_mime.dmi' action_icon_state = "finger_guns0" action_background_icon_state = "bg_mime" - base_icon_state = "finger_guns" - -/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/targeted/mime/finger_guns/Click() + if(!usr) + return + if(!ishuman(usr)) return if(usr?.mind) if(!usr.mind.miming) to_chat(usr, "You must dedicate yourself to silence first.") return - invocation = "[usr.real_name] fires [usr.p_their()] finger gun!" + var/obj/item/gun/ballistic/revolver/mime/magic/N = new(usr) + if(usr.put_in_hands(N)) + to_chat(usr, "You form your fingers into a gun.") else - invocation_type ="none" + qdel(N) + to_chat(usr, "You don't have any free hands to make fingerguns with.") ..() - /obj/item/book/granter/spell/mimery_blockade spell = /obj/effect/proc_holder/spell/targeted/forcewall/mime spellname = "Invisible Blockade" @@ -229,7 +225,7 @@ user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak) /obj/item/book/granter/spell/mimery_guns - spell = /obj/effect/proc_holder/spell/aimed/finger_guns + spell = /obj/effect/proc_holder/spell/targeted/mime/finger_guns spellname = "Finger Guns" name = "Guide to Advanced Mimery Vol 2" desc = "There aren't any words written..." diff --git a/code/modules/spells/spell_types/mind_transfer.dm b/code/modules/spells/spell_types/mind_transfer.dm index eda4f9fecda0e..799bd7b48bd1e 100644 --- a/code/modules/spells/spell_types/mind_transfer.dm +++ b/code/modules/spells/spell_types/mind_transfer.dm @@ -65,8 +65,8 @@ Also, you never added distance checking after target is selected. I've went ahea if(!silent) to_chat(user, "[target.p_their(TRUE)] mind is resisting your spell!") return - - if(istype(target.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + + if(istype(target.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) to_chat(target, "Your protective headgear successfully deflects mind controlling brainwaves!") to_chat(user, "[target.p_their(TRUE)] mind is protected by a strange ward on their headgear!") return @@ -81,6 +81,11 @@ Also, you never added distance checking after target is selected. I've went ahea else target = stand.summoner + if(istype(target, /mob/living/simple_animal/slaughter)) //No. + to_chat(user, "Your mind recoils from the infernal hellfire of [target]'s soul!") + user.Unconscious(unconscious_amount_caster) + return + var/mob/living/victim = target//The target of the spell whos body will be transferred to. var/mob/living/caster = user//The wizard/whomever doing the body transferring. diff --git a/code/modules/spells/spell_types/projectile.dm b/code/modules/spells/spell_types/projectile.dm index 151383fc7bff7..cc04bf0bafe48 100644 --- a/code/modules/spells/spell_types/projectile.dm +++ b/code/modules/spells/spell_types/projectile.dm @@ -58,11 +58,11 @@ name = "Projectile" desc = "This spell summons projectiles which try to hit the targets." - + var/proj_type = /obj/item/projectile/magic/spell //IMPORTANT use only subtypes of this - - + + var/update_projectile = FALSE //So you want to admin abuse magic bullets ? This is for you //Below only apply if update_projectile is true var/proj_icon = 'icons/obj/projectiles.dmi' @@ -83,8 +83,8 @@ var/check_holy = FALSE /obj/effect/proc_holder/spell/targeted/projectile/proc/fire_projectile(atom/target, mob/user) - var/obj/item/projectile/magic/spell/projectile = new proj_type() - + var/obj/item/projectile/magic/spell/projectile = new proj_type(null, spell_level) + if(update_projectile) //Generally these should already be set on the projectile, this is mostly here for varedited spells. projectile.icon = proj_icon diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index 5ca4c14c3ae3a..c67cf06b95a86 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -78,7 +78,7 @@ desc = "Take on the shape a lesser ash drake." invocation = "RAAAAAAAAWR!" convert_damage = FALSE - + shapeshift_type = /mob/living/simple_animal/hostile/megafauna/dragon/lesser @@ -129,6 +129,7 @@ restore() /obj/shapeshift_holder/Exited(atom/movable/AM) + . = ..() if(AM == stored && !restoring) restore() diff --git a/code/modules/spells/spell_types/summonitem.dm b/code/modules/spells/spell_types/summonitem.dm index a81c44f3b6644..6a376bd52f226 100644 --- a/code/modules/spells/spell_types/summonitem.dm +++ b/code/modules/spells/spell_types/summonitem.dm @@ -82,18 +82,6 @@ break M.dropItemToGround(item_to_retrieve) - if(iscarbon(M)) //Edge case housekeeping - var/mob/living/carbon/C = M - 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/telepathy.dm b/code/modules/spells/spell_types/telepathy.dm index fa154938242d5..8198c180e7743 100644 --- a/code/modules/spells/spell_types/telepathy.dm +++ b/code/modules/spells/spell_types/telepathy.dm @@ -15,13 +15,16 @@ /obj/effect/proc_holder/spell/targeted/telepathy/cast(list/targets, mob/living/simple_animal/revenant/user = usr) for(var/mob/living/M in targets) - if(istype(M.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(istype(M.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) to_chat(user, "It appears the target's mind is ironclad! No getting a message in there!") return var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "") if(!msg) charge_counter = charge_max return + if(CHAT_FILTER_CHECK(msg)) + to_chat(user, "Your message contains forbidden words.") + return log_directed_talk(user, M, msg, LOG_SAY, "[name]") to_chat(user, "You transmit to [M]: [msg]") if(!M.anti_magic_check(magic_check, holy_check)) //hear no evil @@ -31,4 +34,4 @@ continue var/follow_rev = FOLLOW_LINK(ded, user) var/follow_whispee = FOLLOW_LINK(ded, M) - to_chat(ded, "[follow_rev] [user] [name]: \"[msg]\" to [follow_whispee] [M]") \ No newline at end of file + to_chat(ded, "[follow_rev] [user] [name]: \"[msg]\" to [follow_whispee] [M]") diff --git a/code/modules/spells/spell_types/touch_attacks.dm b/code/modules/spells/spell_types/touch_attacks.dm index 78a3c9aaf40c5..a548892e1b86d 100644 --- a/code/modules/spells/spell_types/touch_attacks.dm +++ b/code/modules/spells/spell_types/touch_attacks.dm @@ -6,15 +6,17 @@ invocation_type = "none" //you scream on connecting, not summoning include_user = TRUE range = -1 + //Checks + var/spell_used = FALSE /obj/effect/proc_holder/spell/targeted/touch/Destroy() remove_hand() to_chat(usr, "The power of the spell dissipates from your hand.") ..() -/obj/effect/proc_holder/spell/targeted/touch/proc/remove_hand(recharge = FALSE) +/obj/effect/proc_holder/spell/targeted/touch/proc/remove_hand() QDEL_NULL(attached_hand) - if(recharge) + if(!spell_used) charge_counter = charge_max /obj/effect/proc_holder/spell/targeted/touch/proc/on_hand_destroy(obj/item/melee/touch_attack/hand) @@ -27,7 +29,7 @@ /obj/effect/proc_holder/spell/targeted/touch/cast(list/targets,mob/user = usr) if(!QDELETED(attached_hand)) - remove_hand(TRUE) + remove_hand() to_chat(user, "[dropmessage]") return @@ -47,12 +49,13 @@ attached_hand = new hand_path(src) attached_hand.attached_spell = src if(!user.put_in_hands(attached_hand)) - remove_hand(TRUE) + remove_hand() if (user.get_num_arms() <= 0) to_chat(user, "You dont have any usable hands!") else to_chat(user, "Your hands are full!") return FALSE + spell_used = FALSE to_chat(user, "[drawmessage]") return TRUE diff --git a/code/modules/spells/spell_types/turf_teleport.dm b/code/modules/spells/spell_types/turf_teleport.dm index 14240de49aa65..b0dba898436f4 100644 --- a/code/modules/spells/spell_types/turf_teleport.dm +++ b/code/modules/spells/spell_types/turf_teleport.dm @@ -15,9 +15,7 @@ playsound(get_turf(user), sound1, 50,1) for(var/mob/living/target in targets) var/list/turfs = new/list() - for(var/turf/T in range(target,outer_tele_radius)) - if(T in range(target,inner_tele_radius)) - continue + for(var/turf/T as() in (RANGE_TURFS(outer_tele_radius, target)-RANGE_TURFS(inner_tele_radius, target))) if(isspaceturf(T) && !include_space) continue if(T.density && !include_dense) @@ -29,11 +27,7 @@ turfs += T if(!turfs.len) - var/list/turfs_to_pick_from = list() - for(var/turf/T in orange(target,outer_tele_radius)) - if(!(T in orange(target,inner_tele_radius))) - turfs_to_pick_from += T - turfs += pick(/turf in turfs_to_pick_from) + turfs += RANGE_TURFS(outer_tele_radius, target)-RANGE_TURFS(inner_tele_radius, target) var/turf/picked = pick(turfs) diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm index 2ea720b6cd69f..d5db9f057762f 100644 --- a/code/modules/spells/spell_types/wizard.dm +++ b/code/modules/spells/spell_types/wizard.dm @@ -28,6 +28,10 @@ trail_lifespan = 5 trail_icon_state = "magicmd" +/obj/item/projectile/magic/spell/magic_missile/New(loc, spell_level) + . = ..() + paralyze += spell_level * 10 + /obj/effect/proc_holder/spell/targeted/genetic/mutate name = "Mutate" desc = "This spell causes you to turn into a hulk and gain laser vision for a short while." @@ -66,7 +70,6 @@ action_icon_state = "smoke" - /obj/effect/proc_holder/spell/targeted/smoke/lesser //Chaplain smoke book name = "Smoke" desc = "This spell spawns a small cloud of choking smoke at your location." @@ -250,11 +253,14 @@ for(var/atom/movable/AM in T) thrownatoms += AM + stun_amt += 10 * spell_level + maxthrow = 5 + spell_level + for(var/am in thrownatoms) var/atom/movable/AM = am if(AM == user || AM.anchored) continue - + if(ismob(AM)) var/mob/M = AM if(M.anti_magic_check(anti_magic_check, FALSE)) @@ -351,7 +357,7 @@ M.electrocute_act(80, src, illusion = 1) qdel(src) -/obj/item/spellpacket/lightningbolt/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY) +/obj/item/spellpacket/lightningbolt/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, quickstart = TRUE) . = ..() if(ishuman(thrower)) var/mob/living/carbon/human/H = thrower diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index dfec2846af2e0..10da47c320aa6 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -65,8 +65,8 @@ name = "Bluespace Artillery Fusor" desc = "Contents classified by Nanotrasen Naval Command. Needs to be linked with the other BSA parts using multitool." icon_state = "fuel_chamber" - var/obj/machinery/bsa/back/back - var/obj/machinery/bsa/front/front + var/datum/weakref/back_ref + var/datum/weakref/front_ref /obj/machinery/bsa/middle/multitool_act(mob/living/user, obj/item/I) if(!multitool_check_buffer(user, I)) @@ -74,18 +74,21 @@ var/obj/item/multitool/M = I if(M.buffer) if(istype(M.buffer, /obj/machinery/bsa/back)) - back = M.buffer + back_ref = WEAKREF(M.buffer) + to_chat(user, "You link [src] with [M.buffer].") M.buffer = null - to_chat(user, "You link [src] with [back].") + to_chat(user, "You link [src] with [M.buffer].") else if(istype(M.buffer, /obj/machinery/bsa/front)) - front = M.buffer + front_ref = WEAKREF(M.buffer) + to_chat(user, "You link [src] with [M.buffer].") M.buffer = null - to_chat(user, "You link [src] with [front].") else to_chat(user, "[I]'s data buffer is empty!") return TRUE /obj/machinery/bsa/middle/proc/check_completion() + var/obj/machinery/bsa/front/front = front_ref?.resolve() + var/obj/machinery/bsa/back/back = back_ref?.resolve() if(!front || !back) return "No linked parts detected!" if(!front.anchored || !back.anchored || !anchored) @@ -113,6 +116,10 @@ return TRUE /obj/machinery/bsa/middle/proc/get_cannon_direction() + var/obj/machinery/bsa/front/front = front_ref?.resolve() + var/obj/machinery/bsa/back/back = back_ref?.resolve() + if(!front || !back) + return if(front.x > x && back.x < x) return EAST else if(front.x < x && back.x > x) @@ -133,6 +140,7 @@ bound_width = 352 bound_x = -192 appearance_flags = NONE //Removes default TILE_BOUND + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF /obj/machinery/bsa/full/wrench_act(mob/living/user, obj/item/I) return FALSE @@ -197,7 +205,7 @@ target = tile break else - tile.ex_act(EXPLODE_DEVASTATE) //also fucks everything else on the turf + SSexplosions.highturf += tile point.Beam(target, icon_state = "bsa_beam", time = 50, maxdistance = world.maxx) //ZZZAP new /obj/effect/temp_visual/bsa_splash(point, dir) @@ -214,10 +222,12 @@ /obj/machinery/bsa/full/proc/reload() ready = FALSE use_power(power_used_per_shot) + ui_update() addtimer(CALLBACK(src,"ready_cannon"),600) /obj/machinery/bsa/full/proc/ready_cannon() ready = TRUE + ui_update() /obj/structure/filler name = "big machinery part" @@ -238,7 +248,7 @@ - var/obj/machinery/bsa/full/cannon + var/datum/weakref/cannon_ref var/notice var/target var/area_aim = FALSE //should also show areas for targeting @@ -252,8 +262,10 @@ if(!ui) ui = new(user, src, "BluespaceArtillery") ui.open() + //Missing updates for: target GPS name changes /obj/machinery/computer/bsa_control/ui_data() + var/obj/machinery/bsa/full/cannon = cannon_ref?.resolve() var/list/data = list() data["ready"] = cannon ? cannon.ready : FALSE data["connected"] = cannon @@ -261,6 +273,8 @@ data["unlocked"] = GLOB.bsa_unlock if(target) data["target"] = get_target_name() + else + data["target"] = null return data /obj/machinery/computer/bsa_control/ui_act(action, params) @@ -268,7 +282,7 @@ return switch(action) if("build") - cannon = deploy() + cannon_ref = WEAKREF(deploy()) . = TRUE if("fire") fire(usr) @@ -276,7 +290,8 @@ if("recalibrate") calibrate(usr) . = TRUE - update_icon() + if(.) + update_icon() /obj/machinery/computer/bsa_control/proc/calibrate(mob/user) if(!GLOB.bsa_unlock) @@ -308,6 +323,10 @@ return get_turf(G.parent) /obj/machinery/computer/bsa_control/proc/fire(mob/user) + var/obj/machinery/bsa/full/cannon = cannon_ref?.resolve() + if(!cannon) + notice = "No Cannon Exists!" + return if(cannon.stat) notice = "Cannon unpowered!" return @@ -331,7 +350,7 @@ s.set_up(4,get_turf(centerpiece)) s.start() var/obj/machinery/bsa/full/cannon = new(get_turf(centerpiece),centerpiece.get_cannon_direction()) - qdel(centerpiece.front) - qdel(centerpiece.back) + QDEL_NULL(centerpiece.front_ref) + QDEL_NULL(centerpiece.back_ref) qdel(centerpiece) return cannon diff --git a/code/modules/station_goals/custom_shuttle.dm b/code/modules/station_goals/custom_shuttle.dm new file mode 100644 index 0000000000000..f2f392f11797e --- /dev/null +++ b/code/modules/station_goals/custom_shuttle.dm @@ -0,0 +1,18 @@ +//Custom Shuttle +//Crew has to build a custom shuttle +/datum/station_goal/custom_shuttle + name = "Custom Shuttle" + +/datum/station_goal/custom_shuttle/get_report() + return {"Nanotrasen needs a new prototype light cruiser. + We leave it up to you to decide what the shuttle needs to be an effective platform. + + You can create a designator in engineering or purchase one at cargo. + "} + +/datum/station_goal/custom_shuttle/check_completion() + if(..()) + return TRUE + if(GLOB.custom_shuttle_count) + return TRUE + return FALSE diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 8f27b86487a16..c4231b7a3d94a 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -223,13 +223,12 @@ return switch(action) if("gene") - upgrade(usr,params["choice"]) - . = TRUE + . = upgrade(usr,params["choice"]) /obj/machinery/dna_vault/proc/check_goal() if(plants.len >= plants_max && animals.len >= animals_max && dna.len >= dna_max) completed = TRUE - + ui_update() /obj/machinery/dna_vault/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/dna_probe)) @@ -255,14 +254,14 @@ /obj/machinery/dna_vault/proc/upgrade(mob/living/carbon/human/H,upgrade_type) if(!(upgrade_type in power_lottery[H])) return + . = TRUE var/datum/species/S = H.dna.species switch(upgrade_type) if(VAULT_TOXIN) to_chat(H, "You feel resistant to airborne toxins.") if(locate(/obj/item/organ/lungs) in H.internal_organs) var/obj/item/organ/lungs/L = H.internal_organs_slot[ORGAN_SLOT_LUNGS] - L.tox_breath_dam_min = 0 - L.tox_breath_dam_max = 0 + L.gas_max -= GAS_PLASMA ADD_TRAIT(H, TRAIT_VIRUSIMMUNE, "dna_vault") if(VAULT_NOBREATH) to_chat(H, "Your lungs feel great.") diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index 8214c3e04c6e2..88396108cbdfc 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -54,6 +54,7 @@ if(!ui) ui = new(user, src, "SatelliteControl") ui.open() + ui.set_autoupdate(TRUE) // Satellite stats (could probably be refactored to update when satellite status changes) /obj/machinery/computer/sat_control/ui_act(action, params) if(..()) @@ -65,7 +66,7 @@ /obj/machinery/computer/sat_control/proc/toggle(id) for(var/obj/machinery/satellite/S in GLOB.machines) - if(S.id == id && S.z == z) + if(S.id == id && S.get_virtual_z_level() == get_virtual_z_level()) S.toggle() /obj/machinery/computer/sat_control/ui_data() @@ -118,9 +119,11 @@ to_chat(user, "You [active ? "deactivate": "activate"] [src].") active = !active if(active) + begin_processing() animate(src, pixel_y = 2, time = 10, loop = -1) anchored = TRUE else + end_processing() animate(src, pixel_y = 0, time = 10) anchored = FALSE update_icon() @@ -136,7 +139,8 @@ name = "\improper Meteor Shield Satellite" desc = "A meteor point-defense satellite." mode = "M-SHIELD" - speed_process = TRUE + processing_flags = START_PROCESSING_MANUALLY + subsystem_type = /datum/controller/subsystem/processing/fastprocess var/kill_range = 14 /obj/machinery/satellite/meteor_shield/proc/space_los(meteor) @@ -149,7 +153,7 @@ if(!active) return for(var/obj/effect/meteor/M in GLOB.meteor_list) - if(M.z != z) + if(M.get_virtual_z_level() != get_virtual_z_level()) continue if(get_dist(M,src) > kill_range) continue diff --git a/code/modules/station_goals/station_goal.dm b/code/modules/station_goals/station_goal.dm index 88377455c6a12..eeff891344afd 100644 --- a/code/modules/station_goals/station_goal.dm +++ b/code/modules/station_goals/station_goal.dm @@ -11,8 +11,11 @@ var/completed = FALSE var/report_message = "Complete this goal." +/datum/station_goal/proc/prepare_report() + addtimer(CALLBACK(src, .proc/send_report), 1200) // 2 min, less than avg 4 for intercept report + /datum/station_goal/proc/send_report() - priority_announce("Priority Nanotrasen directive received. Project \"[name]\" details inbound.", "Incoming Priority Message", 'sound/ai/commandreport.ogg') + priority_announce("Priority Nanotrasen directive received. Project \"[name]\" details inbound.", "Incoming Priority Message", SSstation.announcer.get_rand_report_sound()) print_command_report(get_report(),"Nanotrasen Directive [pick(GLOB.phonetic_alphabet)] \Roman[rand(1,50)]", announce=FALSE) on_report() diff --git a/code/modules/surgery/advanced/bioware/muscled_veins.dm b/code/modules/surgery/advanced/bioware/muscled_veins.dm index 592a02b8d10be..81212019a8f3b 100644 --- a/code/modules/surgery/advanced/bioware/muscled_veins.dm +++ b/code/modules/surgery/advanced/bioware/muscled_veins.dm @@ -6,7 +6,7 @@ /datum/surgery_step/clamp_bleeders, /datum/surgery_step/incise, /datum/surgery_step/incise, - /datum/surgery_step/thread_veins, + /datum/surgery_step/muscled_veins, /datum/surgery_step/close) possible_locs = list(BODY_ZONE_CHEST) bioware_target = BIOWARE_CIRCULATION diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm index 6ded176c677e9..5a68bd78e8c14 100644 --- a/code/modules/surgery/advanced/revival.dm +++ b/code/modules/surgery/advanced/revival.dm @@ -26,15 +26,16 @@ return TRUE /datum/surgery_step/revive - name = "revive body" - implements = list(/obj/item/twohanded/shockpaddles = 100, /obj/item/melee/baton = 75, /obj/item/gun/energy = 60) + name = "shock body" + implements = list(/obj/item/shockpaddles = 100, /obj/item/melee/baton = 75, /obj/item/gun/energy = 60) + repeatable = TRUE time = 120 /datum/surgery_step/revive/tool_check(mob/user, obj/item/tool) . = TRUE - if(istype(tool, /obj/item/twohanded/shockpaddles)) - var/obj/item/twohanded/shockpaddles/S = tool - if((S.req_defib && !S.defib.powered) || !S.wielded || S.cooldown || S.busy) + if(istype(tool, /obj/item/shockpaddles)) + var/obj/item/shockpaddles/S = tool + if((S.req_defib && !S.defib.powered) || !ISWIELDED(S) || S.cooldown || S.busy) to_chat(user, "You need to wield both paddles, and [S.defib] must be powered!") return FALSE if(istype(tool, /obj/item/melee/baton)) @@ -79,4 +80,4 @@ "[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react.") playsound(get_turf(target), 'sound/magic/lightningbolt.ogg', 50, 1) target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 180) - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index 9134390d5fff7..b45c6d249790a 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -10,7 +10,7 @@ /datum/surgery_step/sever_limb name = "sever limb" - implements = list(TOOL_SCALPEL = 100, TOOL_SAW = 100, /obj/item/melee/arm_blade = 80, /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 40, /obj/item/kitchen/knife/butcher = 25) + implements = list(TOOL_SCALPEL = 100, TOOL_SAW = 100, /obj/item/melee/arm_blade = 80, /obj/item/fireaxe = 50, /obj/item/hatchet = 40, /obj/item/kitchen/knife/butcher = 25) time = 64 /datum/surgery_step/sever_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -27,4 +27,4 @@ var/obj/item/bodypart/target_limb = surgery.operated_bodypart target_limb.drop_limb() - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/surgery/anesthetic_machine.dm b/code/modules/surgery/anesthetic_machine.dm new file mode 100644 index 0000000000000..aa59ead5e2bcc --- /dev/null +++ b/code/modules/surgery/anesthetic_machine.dm @@ -0,0 +1,117 @@ +/obj/machinery/anesthetic_machine + name = "Anesthetic Tank Holder" + desc = "A wheeled machine that can hold an anesthetic tank and distribute the air using a breath mask." + icon = 'icons/obj/iv_drip.dmi' + icon_state = "breath_machine" + anchored = FALSE + mouse_drag_pointer = MOUSE_ACTIVE_POINTER + var/obj/item/clothing/mask/breath/machine/attached_mask + var/obj/item/tank/attached_tank = null + var/mask_out = FALSE + +/obj/machinery/anesthetic_machine/Initialize() + . = ..() + attached_mask = new /obj/item/clothing/mask/breath/machine(src) + attached_mask.machine_attached = src + update_icon() + +/obj/machinery/anesthetic_machine/update_icon() + cut_overlays() + if(mask_out) + add_overlay("mask_off") + else + add_overlay("mask_on") + if(attached_tank) + add_overlay("tank_on") + + +/obj/machinery/anesthetic_machine/attack_hand(mob/living/user) + . = ..() + if(retract_mask()) + visible_message("[user] retracts the mask back into the [src].") + +/obj/machinery/anesthetic_machine/attacked_by(obj/item/I, mob/living/user) + if(istype(I, /obj/item/tank)) + if(attached_tank) // If there is an attached tank, remove it and drop it on the floor + attached_tank.forceMove(loc) + I.forceMove(src) // Put new tank in, set it as attached tank + visible_message("[user] inserts [I] into [src].") + attached_tank = I + update_icon() + return + . = ..() + +/obj/machinery/anesthetic_machine/AltClick(mob/user) + . = ..() + if(attached_tank)// If attached tank, remove it. + attached_tank.forceMove(loc) + to_chat(user, "You remove the [attached_tank].") + attached_tank = null + update_icon() + if(mask_out) + retract_mask() + +/obj/machinery/anesthetic_machine/proc/retract_mask() + if(mask_out) + if(iscarbon(attached_mask.loc)) // If mask is on a mob + var/mob/living/carbon/M = attached_mask.loc + M.transferItemToLoc(attached_mask, src, TRUE) + M.internal = null + else + attached_mask.forceMove(src) + mask_out = FALSE + update_icon() + return TRUE + return FALSE + +/obj/machinery/anesthetic_machine/MouseDrop(mob/living/carbon/target) + . = ..() + if(!iscarbon(target)) + return + if(Adjacent(target) && usr.Adjacent(target)) + if(attached_tank && !mask_out) + usr.visible_message("[usr] attemps to attach the [src] to [target].", "You attempt to attach the [src] to [target].") + if(!do_after(usr, 70, TRUE, target)) + return + if(!target.equip_to_appropriate_slot(attached_mask)) + to_chat(usr, "You are unable to attach the [src] to [target]!") + return + else + usr.visible_message("[usr] attaches the [src] to [target].", "You attach the [src] to [target].") + target.internal = attached_tank + mask_out = TRUE + START_PROCESSING(SSmachines, src) + target.update_internals_hud_icon(1) + update_icon() + else + to_chat(usr, "[mask_out ? "The machine is already in use!" : "The machine has no attached tank!"]") + +/obj/machinery/anesthetic_machine/process() + if(!mask_out) // If not on someone, stop processing + return PROCESS_KILL + + if(get_dist(src, get_turf(attached_mask)) > 1) // If too far away, detach + to_chat(attached_mask.loc, "The [attached_mask] is ripped off of your face!") + retract_mask() + return PROCESS_KILL + +/obj/machinery/anesthetic_machine/Destroy() + if(mask_out) + retract_mask() + qdel(attached_mask) + new /obj/item/clothing/mask/breath(src) + . = ..() + +/obj/item/clothing/mask/breath/machine + var/obj/machinery/anesthetic_machine/machine_attached + clothing_flags = MASKINTERNALS | MASKEXTENDRANGE + +/obj/item/clothing/mask/breath/machine/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) + +/obj/item/clothing/mask/breath/machine/dropped(mob/user) + . = ..() + if(loc != machine_attached) // If not already in machine, go back in when dropped (dropped is called on unequip) + to_chat(user, "The mask snaps back into the [machine_attached].") + machine_attached.retract_mask() diff --git a/code/modules/surgery/blood_filter.dm b/code/modules/surgery/blood_filter.dm index 3bba978d93051..41082810aae80 100644 --- a/code/modules/surgery/blood_filter.dm +++ b/code/modules/surgery/blood_filter.dm @@ -19,7 +19,7 @@ time = 2.5 SECONDS /datum/surgery/blood_filter/can_start(mob/user, mob/living/carbon/target) - if(HAS_TRAIT(target, TRAIT_HUSK) || target.reagents.total_volume==0) //Can't filter husk or 0 regent body + if(HAS_TRAIT(target, TRAIT_HUSK) || target.reagents?.total_volume == 0) //Can't filter husk or 0 regent body return FALSE return ..() diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 2b40d660db473..edb1c01139289 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -8,7 +8,7 @@ icon_state = "" layer = BELOW_MOB_LAYER //so it isn't hidden behind objects when on the floor var/mob/living/carbon/owner = null - var/mob/living/carbon/original_owner = null + var/datum/weakref/original_owner = null var/status = BODYPART_ORGANIC var/needs_processing = FALSE @@ -29,10 +29,12 @@ var/burnstate = 0 var/brute_dam = 0 var/burn_dam = 0 - var/stamina_dam = 0 var/max_stamina_damage = 0 var/max_damage = 0 + var/stamina_dam = 0 + var/stamina_heal_rate = 1 //Stamina heal multiplier + var/brute_reduction = 0 //Subtracted to brute damage taken var/burn_reduction = 0 //Subtracted to burn damage taken @@ -97,7 +99,7 @@ ..() /obj/item/bodypart/attackby(obj/item/W, mob/user, params) - if(W.sharpness) + if(W.is_sharp()) add_fingerprint(user) if(!contents.len) to_chat(user, "There is nothing left inside [src]!") @@ -136,7 +138,7 @@ //Return TRUE to get whatever mob this is in to update health. /obj/item/bodypart/proc/on_life(stam_regen) if(stamina_dam > DAMAGE_PRECISION && stam_regen) //DO NOT update health here, it'll be done in the carbon's life. - heal_damage(0, 0, INFINITY, null, FALSE) + heal_damage(0, 0, stam_regen, null, FALSE) . |= BODYPART_LIFE_UPDATE_HEALTH //Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all. @@ -182,14 +184,15 @@ //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) + var/applied_damage = min(max_stamina_damage - stamina_dam, available_damage) + stamina_dam += round(CLAMP(stamina, 0, applied_damage), DAMAGE_PRECISION) if(owner && updating_health) owner.updatehealth() if(stamina > DAMAGE_PRECISION) - owner.update_stamina() - owner.stam_regen_start_time = world.time + STAMINA_REGEN_BLOCK_TIME + owner.update_stamina(TRUE) + owner.stam_regen_start_time = max(owner.stam_regen_start_time, world.time + STAMINA_REGEN_BLOCK_TIME) consider_processing() update_disabled() return update_bodypart_damage_state() @@ -250,8 +253,8 @@ //Updates an organ's brute/burn states for use by update_damage_overlays() //Returns 1 if we need to update overlays. 0 otherwise. /obj/item/bodypart/proc/update_bodypart_damage_state() - var/tbrute = round( (brute_dam/max_damage)*3, 1 ) - var/tburn = round( (burn_dam/max_damage)*3, 1 ) + var/tbrute = round((min(brute_dam, max_damage) / max_damage) * 3, 1) + var/tburn = round((min(burn_dam, max_damage) / max_damage) * 3, 1) if((tbrute != brutestate) || (tburn != burnstate)) brutestate = tbrute burnstate = tburn @@ -288,8 +291,8 @@ if(source) C = source if(!original_owner) - original_owner = source - else if(original_owner && owner != original_owner) //Foreign limb + original_owner = WEAKREF(source) + else if(original_owner && !IS_WEAKREF_OF(owner, original_owner)) //Foreign limb no_update = TRUE else C = owner @@ -535,7 +538,7 @@ if(held_index) owner.dropItemToGround(owner.get_item_for_held_index(held_index)) if(owner.hud_used) - var/obj/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"] + var/atom/movable/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"] if(L) L.update_icon() @@ -603,7 +606,7 @@ if(held_index) owner.dropItemToGround(owner.get_item_for_held_index(held_index)) if(owner.hud_used) - var/obj/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"] + var/atom/movable/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"] if(R) R.update_icon() diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 75a41fb93a191..46fd1c5ba805e 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -21,12 +21,12 @@ C.emote("scream") SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered) drop_limb() - + C.update_equipment_speed_mods() // Update in case speed affecting item unequipped by dismemberment var/turf/location = C.loc if(istype(location)) C.add_splatter_floor(location) - + if(QDELETED(src)) //Could have dropped into lava/explosion/chasm/whatever return TRUE if(dam_type == BURN) @@ -155,7 +155,7 @@ LB.brainmob = brainmob brainmob = null LB.brainmob.forceMove(LB) - LB.brainmob.stat = DEAD + LB.brainmob.set_stat(DEAD) /obj/item/organ/eyes/transfer_to_limb(obj/item/bodypart/head/LB, mob/living/carbon/human/C) LB.eyes = src @@ -183,7 +183,7 @@ C.handcuffed = null C.update_handcuffed() if(C.hud_used) - var/obj/screen/inventory/hand/R = C.hud_used.hand_slots["[held_index]"] + var/atom/movable/screen/inventory/hand/R = C.hud_used.hand_slots["[held_index]"] if(R) R.update_icon() if(C.gloves) @@ -201,7 +201,7 @@ C.handcuffed = null C.update_handcuffed() if(C.hud_used) - var/obj/screen/inventory/hand/L = C.hud_used.hand_slots["[held_index]"] + var/atom/movable/screen/inventory/hand/L = C.hud_used.hand_slots["[held_index]"] if(L) L.update_icon() if(C.gloves) @@ -286,7 +286,7 @@ if(C.dna.species.mutanthands && !is_pseudopart) C.put_in_hand(new C.dna.species.mutanthands(), held_index) if(C.hud_used) - var/obj/screen/inventory/hand/hand = C.hud_used.hand_slots["[held_index]"] + var/atom/movable/screen/inventory/hand/hand = C.hud_used.hand_slots["[held_index]"] if(hand) hand.update_icon() C.update_inv_gloves() diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index f9e0703925ed8..f9bd5db1f634e 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -137,25 +137,25 @@ disabled += zone return disabled -//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) +///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() 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) - - clear_alert("embeddedobject") - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "embedded") + remove_embedded_object(I) -/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 + ///Get the bodypart for whatever hand we have active, Only relevant for carbons /mob/proc/get_active_hand() return FALSE diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 961835336fcf6..ead173cd2dd14 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -174,13 +174,13 @@ /obj/item/bodypart/chest/robot/examine(mob/user) . = ..() if(cell) - . += {"It has a [cell] inserted.\n - You can use a screwdriver to remove [cell]."} + . += "It has a [cell] inserted.\n"+\ + "You can use a screwdriver to remove [cell]." else . += "It has an empty port for a power cell." if(wired) - . += {"Its all wired up[cell ? " and ready for usage" : ""].\n - You can use wirecutters to remove the wiring."} + . += "Its all wired up[cell ? " and ready for usage" : ""].\n"+\ + "You can use wirecutters to remove the wiring." else . += "It has a couple spots that still need to be wired." @@ -238,8 +238,8 @@ var/single_flash = FALSE if(!flash1 || !flash2) single_flash = TRUE - . += {"One of its eye sockets is currently occupied by a flash.\n - It has an empty eye socket for another flash."} + . += "One of its eye sockets is currently occupied by a flash.\n"+\ + "It has an empty eye socket for another flash." else . += "It has two eye sockets occupied by flashes." . += "You can remove the seated flash[single_flash ? "":"es"] with a crowbar." diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm index d8ed1d78da7fe..5c9b8f334d28b 100644 --- a/code/modules/surgery/core_removal.dm +++ b/code/modules/surgery/core_removal.dm @@ -30,8 +30,9 @@ "[user] successfully extracts a core from [target]!", "[user] successfully extracts a core from [target]!") - new slime.coretype(slime.loc) - + var/obj/item/slime_extract/item = new slime.coretype(slime.loc) + if(slime.transformeffects & SLIME_EFFECT_GOLD) + item.sparkly = TRUE if(slime.cores <= 0) slime.icon_state = "[slime.colour] baby slime dead-nocore" return 1 @@ -39,4 +40,4 @@ return 0 else to_chat(user, "There aren't any cores left in [target]!") - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm index 157c86052d855..4450c06244a28 100644 --- a/code/modules/surgery/healing.dm +++ b/code/modules/surgery/healing.dm @@ -30,6 +30,9 @@ var/burnhealing = 0 var/missinghpbonus = 0 //heals an extra point of damager per X missing damage of type (burn damage for burn healing, brute for brute). Smaller Number = More Healing! +/datum/surgery_step/heal/proc/get_progress(mob/user, mob/living/carbon/target, brute_healed, burn_healed) + return + /datum/surgery_step/heal/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/woundtype if(brutehealing && burnhealing) @@ -70,6 +73,8 @@ umsg += " as best as you can while they have clothing on" tmsg += " as best as they can while [target] has clothing on" target.heal_bodypart_damage(urhealedamt_brute,urhealedamt_burn) + umsg += get_progress(user, target, urhealedamt_brute, urhealedamt_burn) + display_results(user, target, "[umsg].", "[tmsg].", "[tmsg].") @@ -116,6 +121,33 @@ desc = "A surgical procedure that provides experimental treatment for a patient's brute traumas. Heals considerably more when the patient is severely injured." /********************BRUTE STEPS********************/ +/datum/surgery_step/heal/brute/get_progress(mob/user, mob/living/carbon/target, brute_healed, burn_healed) + if(!brute_healed) + return + + var/estimated_remaining_steps = target.getBruteLoss() / brute_healed + var/progress_text + if(locate(/obj/item/healthanalyzer) in user.held_items) + progress_text = ". Remaining brute: [target.getBruteLoss()]" + else + switch(estimated_remaining_steps) + if(-INFINITY to 1) + return + if(1 to 3) + progress_text = ", stitching up the last few scrapes" + if(3 to 6) + progress_text = ", counting down the last few bruises left to treat" + if(6 to 9) + progress_text = ", continuing to plug away at [target.p_their()] extensive rupturing" + if(9 to 12) + progress_text = ", steadying yourself for the long surgery ahead" + if(12 to 15) + progress_text = ", though [target.p_they()] still look[target.p_s()] more like ground beef than a person" + if(15 to INFINITY) + progress_text = ", though you feel like you're barely making a dent in treating [target.p_their()] pulped body" + + return progress_text + /datum/surgery_step/heal/brute/basic name = "tend bruises" brutehealing = 5 @@ -154,6 +186,33 @@ desc = "A surgical procedure that provides experimental treatment for a patient's burns. Heals considerably more when the patient is severely injured." /********************BURN STEPS********************/ +/datum/surgery_step/heal/burn/get_progress(mob/user, mob/living/carbon/target, brute_healed, burn_healed) + if(!burn_healed) + return + + var/estimated_remaining_steps = target.getFireLoss() / burn_healed + var/progress_text + if(locate(/obj/item/healthanalyzer) in user.held_items) + progress_text = ". Remaining brute: [target.getFireLoss()]" + else + switch(estimated_remaining_steps) + if(-INFINITY to 1) + return + if(1 to 3) + progress_text = ", finishing up the last few singe marks" + if(3 to 6) + progress_text = ", counting down the last few blisters left to treat" + if(6 to 9) + progress_text = ", continuing to plug away at [target.p_their()] thorough roasting" + if(9 to 12) + progress_text = ", steadying yourself for the long surgery ahead" + if(12 to 15) + progress_text = ", though [target.p_they()] still look[target.p_s()] more like burnt steak than a person" + if(15 to INFINITY) + progress_text = ", though you feel like you're barely making a dent in treating [target.p_their()] charred body" + + return progress_text + /datum/surgery_step/heal/burn/basic name = "tend burn wounds" burnhealing = 5 @@ -168,9 +227,6 @@ missinghpbonus = 5 /***************************COMBO***************************/ -/datum/surgery/healing/combo - - /datum/surgery/healing/combo name = "Tend Wounds (Mixture, Basic)" replaced_by = /datum/surgery/healing/combo/upgraded @@ -192,6 +248,39 @@ desc = "A surgical procedure that provides experimental treatment for a patient's burns and brute traumas. Heals considerably more when the patient is severely injured." /********************COMBO STEPS********************/ +/datum/surgery_step/heal/combo/get_progress(mob/user, mob/living/carbon/target, brute_healed, burn_healed) + var/estimated_remaining_steps = 0 + if(brute_healed > 0) + estimated_remaining_steps = max(0, (target.getBruteLoss() / brute_healed)) + if(burn_healed > 0) + estimated_remaining_steps = max(estimated_remaining_steps, (target.getFireLoss() / burn_healed)) // whichever is higher between brute or burn steps + + var/progress_text + + if(locate(/obj/item/healthanalyzer) in user.held_items) + if(target.getBruteLoss()) + progress_text = ". Remaining brute: [target.getBruteLoss()]" + if(target.getFireLoss()) + progress_text += ". Remaining burn: [target.getFireLoss()]" + else + switch(estimated_remaining_steps) + if(-INFINITY to 1) + return + if(1 to 3) + progress_text = ", finishing up the last few signs of damage" + if(3 to 6) + progress_text = ", counting down the last few patches of trauma" + if(6 to 9) + progress_text = ", continuing to plug away at [target.p_their()] extensive injuries" + if(9 to 12) + progress_text = ", steadying yourself for the long surgery ahead" + if(12 to 15) + progress_text = ", though [target.p_they()] still look[target.p_s()] more like smooshed baby food than a person" + if(15 to INFINITY) + progress_text = ", though you feel like you're barely making a dent in treating [target.p_their()] broken body" + + return progress_text + /datum/surgery_step/heal/combo name = "tend physical wounds" brutehealing = 3 diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm index d252b33101590..69fb9d1e4290b 100644 --- a/code/modules/surgery/helpers.dm +++ b/code/modules/surgery/helpers.dm @@ -69,12 +69,14 @@ if(S.ignore_clothes || get_location_accessible(M, selected_zone)) var/datum/surgery/procedure = new S.type(M, selected_zone, affecting) - user.visible_message("[user] drapes [I] over [M]'s [parse_zone(selected_zone)] to prepare for surgery.", \ - "You drape [I] over [M]'s [parse_zone(selected_zone)] to prepare for \an [procedure.name].") + user.visible_message("[user] drapes [I] over [M]'s [parse_zone(selected_zone)] to prepare for surgery.", + "You drape [I] over [M]'s [parse_zone(selected_zone)] to prepare for \an [procedure.name].") + I.balloon_alert(user, "You drape over [parse_zone(selected_zone)]") log_combat(user, M, "operated on", null, "(OPERATION TYPE: [procedure.name]) (TARGET AREA: [selected_zone])") else - to_chat(user, "You need to expose [M]'s [parse_zone(selected_zone)] first!") + I.balloon_alert(user, "[parse_zone(selected_zone)] is covered up") + else if(!current_surgery.step_in_progress) attempt_cancel_surgery(current_surgery, I, M, user) @@ -83,36 +85,35 @@ /proc/attempt_cancel_surgery(datum/surgery/S, obj/item/I, mob/living/M, mob/user) var/selected_zone = user.zone_selected + if(S.status == 1) M.surgeries -= S user.visible_message("[user] removes [I] from [M]'s [parse_zone(selected_zone)].", \ "You remove [I] from [M]'s [parse_zone(selected_zone)].") + I.balloon_alert(user, "You remove [I] from [parse_zone(selected_zone)]") qdel(S) - else if(S.can_cancel) + return + + if(S.can_cancel) 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) required_tool_type = TOOL_SCREWDRIVER - if(close_tool?.tool_behaviour == required_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 - to_chat(user, "You need to hold a [is_robotic ? "screwdriver" : "cautery"] in your inactive hand to stop [M]'s surgery!") - -/proc/get_location_modifier(mob/M) - var/turf/T = get_turf(M) - if(locate(/obj/structure/table/optable, T)) - return 1 - else if(locate(/obj/structure/table, T)) - return 0.8 - else if(locate(/obj/structure/bed, T)) - return 0.7 - else - return 0.5 + 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?.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_accessible(mob/M, location) var/covered_locations = 0 //based on body_parts_covered diff --git a/code/modules/surgery/latex_glove_box.dm b/code/modules/surgery/latex_glove_box.dm new file mode 100644 index 0000000000000..fb63d1612aadb --- /dev/null +++ b/code/modules/surgery/latex_glove_box.dm @@ -0,0 +1,79 @@ +/obj/item/glove_box + name = "box of latex gloves" + desc = "A box of latex gloves, useful for quick cleanup after surgery." + icon = 'icons/obj/surgery.dmi' + icon_state = "latex_glove_box" + item_state = "deliverypackage" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + throwforce = 0 + w_class = WEIGHT_CLASS_NORMAL + throw_speed = 3 + throw_range = 7 + pressure_resistance = 8 + var/glove_type = /obj/item/clothing/gloves/color/latex + var/total_gloves = 50 + +/obj/item/glove_box/Initialize() + . = ..() + interaction_flags_item &= ~INTERACT_ITEM_ATTACK_HAND_PICKUP + update_icon() + +/obj/item/glove_box/MouseDrop(atom/over_object) + . = ..() + var/mob/living/M = usr + if(!istype(M) || M.incapacitated() || !Adjacent(M)) + return + + if(over_object == M) + M.put_in_hands(src) + + else if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object + M.putItemFromInventoryInHandIfPossible(src, H.held_index) + + add_fingerprint(M) + +/obj/item/glove_box/attack_paw(mob/user) + return attack_hand(user) + +/obj/item/glove_box/attack_hand(mob/user) + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_PICKUP)) + return + if(total_gloves >= 1) + total_gloves-- + var/obj/item/clothing/gloves/G + G = new glove_type(src) + G.add_fingerprint(user) + G.forceMove(user.loc) + user.put_in_hands(G) + to_chat(user, "You take [G] out of \the [src].") + else + to_chat(user, "[src] is empty!") + update_icon() + add_fingerprint(user) + return ..() + +/obj/item/glove_box/examine(mob/user) + . = ..() + if(total_gloves) + . += "It contains [total_gloves] pair of gloves." + else + . += "It is empty." + +/obj/item/glove_box/update_icon() + cut_overlays() + if(total_gloves > 1) + add_overlay("glove_in") + +/obj/item/glove_box/attack_self(mob/user) + . = ..() + if(total_gloves > 0) + to_chat(user, "You can't fold this box with items still inside!") + return + to_chat(user, "You fold [src] flat.") + qdel(src) + user.put_in_hands(new /obj/item/stack/sheet/cardboard()) + diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm index 94e2b46fcc44b..43cee3c92dd98 100644 --- a/code/modules/surgery/limb_augmentation.dm +++ b/code/modules/surgery/limb_augmentation.dm @@ -23,9 +23,13 @@ return -1 L = surgery.operated_bodypart if(L) - display_results(user, target, "You begin to augment [target]'s [parse_zone(user.zone_selected)]...", - "[user] begins to augment [target]'s [parse_zone(user.zone_selected)] with [aug].", - "[user] begins to augment [target]'s [parse_zone(user.zone_selected)].") + if(L.is_disabled() == BODYPART_DISABLED_PARALYSIS) + to_chat(user, "You can't augment a limb with paralysis!") + return -1 + else + display_results(user, target, "You begin to augment [target]'s [parse_zone(user.zone_selected)]...", + "[user] begins to augment [target]'s [parse_zone(user.zone_selected)] with [aug].", + "[user] begins to augment [target]'s [parse_zone(user.zone_selected)].") else user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...") @@ -39,6 +43,11 @@ possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) requires_real_bodypart = TRUE + + +/datum/surgery/augmentation/can_start(mob/user, mob/living/carbon/target) + return ..() && !isoozeling(target) + //SURGERY STEP SUCCESSES /datum/surgery_step/replace_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/bodypart/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index 3feb6f352b09b..f1f5c3ecd4b0c 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -45,7 +45,7 @@ requires_bodypart_type = BODYPART_ROBOTIC lying_required = FALSE self_operable = TRUE - success_multiplier = 0.8 //on a surgery bed you can do prosthetic manipulation relatively risk-free + speed_modifier = 0.8 //on a surgery bed you can do prosthetic manipulation relatively risk-free steps = list( /datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, @@ -96,27 +96,19 @@ if(target_zone != I.zone || target.getorganslot(I.slot)) to_chat(user, "There is no room for [I] in [target]'s [parse_zone(target_zone)]!") return -1 - if(istype(tool, /obj/item/organ/brain/positron)) - var/obj/item/bodypart/affected = target.get_bodypart(check_zone(target_zone)) - if(!affected) - return -1 - if(affected.status != ORGAN_ROBOTIC) - to_chat(user, "You can't put [tool] into a meat enclosure!") - return -1 - if(!isipc(target)) - to_chat(user, "[target] does not have the proper connectors to interface with [tool].") - return -1 - if(target_zone != "chest") - to_chat(user, "You have to install [tool] in [target]'s chest!") - if(target.internal_organs_slot["brain"]) - to_chat(user, "[target] already has a brain! You'd rather not find out what would happen with two in there.") - return -1 - user.visible_message("[user] begins to insert [tool] into [target]'s [parse_zone(target_zone)].", - "You begin to insert [tool] into [target]'s [parse_zone(target_zone)]...") - - display_results(user, target, "You begin to insert [tool] into [target]'s [parse_zone(target_zone)]...", - "[user] begins to insert [tool] into [target]'s [parse_zone(target_zone)].", - "[user] begins to insert something into [target]'s [parse_zone(target_zone)].") + if(istype(I, /obj/item/organ/brain/positron)) + var/obj/item/bodypart/affected = target.get_bodypart(check_zone(I.zone)) + if(!affected) + return -1 + if(affected.status != BODYPART_ROBOTIC) + to_chat(user, "You can't put [I] into a meat enclosure!") + return -1 + if(!isipc(target)) + to_chat(user, "[target] does not have the proper connectors to interface with [I].") + return -1 + display_results(user, target, "You begin to insert [I] into [target]'s [parse_zone(target_zone)]...", + "[user] begins to insert [I] into [target]'s [parse_zone(target_zone)].", + "[user] begins to insert something into [target]'s [parse_zone(target_zone)].") else if(implement_type in implements_extract) current_type = "extract" diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm index a3c34a9ea71c9..3ffc71ca9734a 100644 --- a/code/modules/surgery/organic_steps.dm +++ b/code/modules/surgery/organic_steps.dm @@ -96,7 +96,7 @@ /datum/surgery_step/saw name = "saw bone" implements = list(TOOL_SAW = 100,/obj/item/melee/arm_blade = 75, - /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25) + /obj/item/fireaxe = 50, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25) time = 54 /datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -114,9 +114,16 @@ //drill bone /datum/surgery_step/drill name = "drill bone" - implements = list(TOOL_DRILL = 100, /obj/item/screwdriver/power = 80, /obj/item/pickaxe/drill = 60, TOOL_SCREWDRIVER = 20) + implements = list(TOOL_DRILL = 100, /obj/item/powertool/hand_drill = 80, /obj/item/pickaxe/drill = 60, TOOL_SCREWDRIVER = 20) time = 30 +/datum/surgery_step/drill/tool_check(mob/user, obj/item/tool) + if(istype(tool, /obj/item/powertool/hand_drill)) + var/obj/item/powertool/hand_drill = tool + if(hand_drill.tool_behaviour != TOOL_SCREWDRIVER) + return FALSE + return TRUE + /datum/surgery_step/drill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to drill into the bone in [target]'s [parse_zone(target_zone)]...", "[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].", diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index ea5468ea9a1e7..621ce644612ab 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -5,22 +5,38 @@ icon_state = "implant-toolkit" w_class = WEIGHT_CLASS_SMALL actions_types = list(/datum/action/item_action/organ_action/toggle) - - var/list/items_list = list() - // Used to store a list of all items inside, for multi-item implants. - // I would use contents, but they shuffle on every activation/deactivation leading to interface inconsistencies. - - var/obj/item/holder = null - // You can use this var for item path, it would be converted into an item on New() + ///A ref for the arm we're taking up. Mostly for the unregister signal upon removal + var/obj/hand + //A list of typepaths to create and insert into ourself on init + var/list/items_to_create = list() + /// Used to store a list of all items inside, for multi-item implants. + var/list/items_list = list()// I would use contents, but they shuffle on every activation/deactivation leading to interface inconsistencies. + /// You can use this var for item path, it would be converted into an item on New(). + var/obj/item/active_item /obj/item/organ/cyberimp/arm/Initialize() . = ..() - if(ispath(holder)) - holder = new holder(src) + if(ispath(active_item)) + active_item = new active_item(src) + items_list += WEAKREF(active_item) + + for(var/typepath in items_to_create) + var/atom/new_item = new typepath(src) + items_list += WEAKREF(new_item) update_icon() SetSlotFromZone() - items_list = contents.Copy() + +/obj/item/organ/cyberimp/arm/Destroy() + hand = null + active_item = null + for(var/datum/weakref/ref in items_list) + var/obj/item/to_del = ref.resolve() + if(!to_del) + continue + qdel(to_del) + items_list.Cut() + return ..() /obj/item/organ/cyberimp/arm/proc/SetSlotFromZone() switch(zone) @@ -54,10 +70,27 @@ to_chat(user, "You modify [src] to be installed on the [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.") update_icon() +/obj/item/organ/cyberimp/arm/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = TRUE) + . = ..() + var/side = zone == BODY_ZONE_R_ARM ? 2 : 1 + hand = owner.hand_bodyparts[side] + if(hand) + RegisterSignal(hand, COMSIG_ITEM_ATTACK_SELF, .proc/on_item_attack_self) //If the limb gets an attack-self, open the menu. Only happens when hand is empty + /obj/item/organ/cyberimp/arm/Remove(mob/living/carbon/M, special = 0) Retract() + if(hand) + UnregisterSignal(hand, COMSIG_ITEM_ATTACK_SELF) ..() +/obj/item/organ/cyberimp/arm/proc/on_item_attack_self() + SIGNAL_HANDLER + INVOKE_ASYNC(src, .proc/ui_action_click) + +/obj/item/organ/cyberimp/arm/proc/on_item_drop() + SIGNAL_HANDLER + INVOKE_ASYNC(src, .proc/Retract) + /obj/item/organ/cyberimp/arm/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) @@ -68,73 +101,75 @@ Retract() /obj/item/organ/cyberimp/arm/proc/Retract() - if(!holder || (holder in src)) + if(!active_item || (active_item in src)) return - owner.visible_message("[owner] retracts [holder] back into [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", - "[holder] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", + owner.visible_message("[owner] retracts [active_item] back into [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", + "[active_item] 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 + owner.transferItemToLoc(active_item, src, TRUE) + UnregisterSignal(active_item, COMSIG_ITEM_DROPPED) + REMOVE_TRAIT(active_item, TRAIT_NO_STORAGE_INSERT, HAND_REPLACEMENT_TRAIT) + active_item = null playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) /obj/item/organ/cyberimp/arm/proc/Extend(var/obj/item/item) if(!(item in src)) return - holder = item + active_item = item + RegisterSignal(active_item, COMSIG_ITEM_DROPPED, .proc/on_item_drop) //Drop it to put away. + ADD_TRAIT(active_item, TRAIT_NO_STORAGE_INSERT, HAND_REPLACEMENT_TRAIT) - ADD_TRAIT(holder, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) - holder.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - holder.slot_flags = null - holder.materials = null + active_item.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + active_item.slot_flags = null + active_item.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) - if(!owner.dropItemToGround(arm_item)) - to_chat(owner, "Your [arm_item] interferes with [src]!") + var/side = zone == BODY_ZONE_R_ARM ? "right" : "left" + var/hand = owner.get_empty_held_index_for_side(side) + if(hand) + owner.put_in_hand(active_item, hand) + else + var/list/hand_items = owner.get_held_items_for_side(side, all = TRUE) + var/success = FALSE + var/list/failure_message = list() + for(var/i in 1 to hand_items.len) //Can't just use *in* here. + var/I = hand_items[i] + if(!owner.dropItemToGround(I)) + failure_message += "Your [I] interferes with [src]!" + continue + to_chat(owner, "You drop [I] to activate [src]!") + success = owner.put_in_hand(active_item, owner.get_empty_held_index_for_side(side)) + break + if(!success) + for(var/i in failure_message) + to_chat(owner, i) return - else - to_chat(owner, "You drop [arm_item] to activate [src]!") - - var/result = (zone == BODY_ZONE_R_ARM ? owner.put_in_r_hand(holder) : owner.put_in_l_hand(holder)) - if(!result) - to_chat(owner, "Your [name] fails to activate!") - return - - // Activate the hand that now holds our item. - owner.swap_hand(result)//... or the 1st hand if the index gets lost somehow - - owner.visible_message("[owner] extends [holder] from [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", - "You extend [holder] from your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", + owner.visible_message("[owner] extends [active_item] from [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", + "You extend [active_item] from your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", "You hear a short mechanical noise.") - playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) + playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, TRUE) /obj/item/organ/cyberimp/arm/ui_action_click() - if((organ_flags & ORGAN_FAILING) || (!holder && !contents.len)) + if((organ_flags & ORGAN_FAILING) || (!active_item && !contents.len)) to_chat(owner, "The implant doesn't respond. It seems to be broken...") return - if(!holder || (holder in src)) - holder = null + if(!active_item || (active_item in src)) + active_item = null if(contents.len == 1) Extend(contents[1]) else var/list/choice_list = list() - for(var/obj/item/I in items_list) - choice_list[I] = image(I) + for(var/datum/weakref/augment_ref in items_list) + var/obj/item/augment_item = augment_ref.resolve() + if(!augment_item) + items_list -= augment_ref + continue + choice_list[augment_item] = image(augment_item) var/obj/item/choice = show_radial_menu(owner, owner, choice_list) - if(owner && owner == usr && owner.stat != DEAD && (src in owner.internal_organs) && !holder && (choice in contents)) + if(owner && owner == usr && owner.stat != DEAD && (src in owner.internal_organs) && !active_item && (choice in contents)) // This monster sanity check is a nice example of how bad input is. Extend(choice) else @@ -160,17 +195,23 @@ name = "arm-mounted laser implant" desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arm and remains inside when not in use." icon_state = "arm_laser" - contents = newlist(/obj/item/gun/energy/laser/mounted) + syndicate_implant = TRUE + items_to_create = list(/obj/item/gun/energy/laser/mounted) /obj/item/organ/cyberimp/arm/gun/laser/l zone = BODY_ZONE_L_ARM +/obj/item/organ/cyberimp/arm/gun/laser/Initialize() + . = ..() + var/obj/item/organ/cyberimp/arm/gun/laser/laserphasergun = locate(/obj/item/gun/energy/laser/mounted) in contents + laserphasergun.icon = icon //No invisible laser guns kthx + laserphasergun.icon_state = icon_state /obj/item/organ/cyberimp/arm/gun/taser name = "arm-mounted taser implant" desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arm and remains inside when not in use." icon_state = "arm_taser" - contents = newlist(/obj/item/gun/energy/e_gun/advtaser/mounted) + items_to_create = list(/obj/item/gun/energy/e_gun/advtaser/mounted) /obj/item/organ/cyberimp/arm/gun/taser/l zone = BODY_ZONE_L_ARM @@ -178,79 +219,116 @@ /obj/item/organ/cyberimp/arm/toolset name = "integrated toolset implant" desc = "A stripped-down version of the engineering cyborg toolset, designed to be installed on subject's arm. Contains advanced versions of every tool." - contents = newlist(/obj/item/screwdriver/cyborg, /obj/item/wrench/cyborg, /obj/item/weldingtool/largetank/cyborg, + items_to_create = list(/obj/item/screwdriver/cyborg, /obj/item/wrench/cyborg, /obj/item/weldingtool/largetank/cyborg, /obj/item/crowbar/cyborg, /obj/item/wirecutters/cyborg, /obj/item/multitool/cyborg) /obj/item/organ/cyberimp/arm/toolset/l zone = BODY_ZONE_L_ARM -/obj/item/organ/cyberimp/arm/toolset/emag_act() - if(!(locate(/obj/item/melee/hydraulic_blade) in items_list)) - to_chat(usr, "You unlock [src]'s integrated blade!") - items_list += new /obj/item/melee/hydraulic_blade(src) - return 1 - return 0 +/obj/item/organ/cyberimp/arm/toolset/emag_act(mob/user) + for(var/datum/weakref/created_item in items_list) + var/obj/potential_blade = created_item.resolve() + if(istype(/obj/item/melee/hydraulic_blade, potential_blade)) + return FALSE + + to_chat(user, "You unlock [src]'s integrated blade!") + items_list += WEAKREF(new /obj/item/melee/hydraulic_blade(src)) + return TRUE /obj/item/organ/cyberimp/arm/esword name = "arm-mounted energy blade" desc = "An illegal and highly dangerous cybernetic implant that can project a deadly blade of concentrated energy." - contents = newlist(/obj/item/melee/transforming/energy/blade/hardlight) + syndicate_implant = TRUE + items_to_create = list(/obj/item/melee/transforming/energy/blade/hardlight) /obj/item/organ/cyberimp/arm/medibeam name = "integrated medical beamgun" desc = "A cybernetic implant that allows the user to project a healing beam from their hand." - contents = newlist(/obj/item/gun/medbeam) + items_to_create = list(/obj/item/gun/medbeam) /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." - contents = newlist(/obj/item/assembly/flash/armimplant) + items_to_create = list(/obj/item/assembly/flash/armimplant) /obj/item/organ/cyberimp/arm/flash/Initialize() . = ..() - if(locate(/obj/item/assembly/flash/armimplant) in items_list) - var/obj/item/assembly/flash/armimplant/F = locate(/obj/item/assembly/flash/armimplant) in items_list - F.I = src + for(var/datum/weakref/created_item in items_list) + var/obj/potential_flash = created_item.resolve() + if(!istype(potential_flash, /obj/item/assembly/flash/armimplant)) + continue + var/obj/item/assembly/flash/armimplant/flash = potential_flash + flash.arm = WEAKREF(src) + +/obj/item/organ/cyberimp/arm/flash/Extend() + . = ..() + active_item.set_light(7) + +/obj/item/organ/cyberimp/arm/flash/Retract() + active_item?.set_light(0) + return ..() /obj/item/organ/cyberimp/arm/baton name = "arm electrification implant" desc = "An illegal combat implant that allows the user to administer disabling shocks from their arm." - contents = newlist(/obj/item/borg/stun) + syndicate_implant = TRUE + items_to_create = list(/obj/item/borg/stun) /obj/item/organ/cyberimp/arm/combat name = "combat cybernetics implant" desc = "A powerful cybernetic implant that contains combat modules built into the user's arm." - contents = newlist(/obj/item/melee/transforming/energy/blade/hardlight, /obj/item/gun/medbeam, /obj/item/borg/stun, /obj/item/assembly/flash/armimplant) + syndicate_implant = TRUE + items_to_create = list(/obj/item/melee/transforming/energy/blade/hardlight, /obj/item/gun/medbeam, /obj/item/borg/stun, /obj/item/assembly/flash/armimplant) /obj/item/organ/cyberimp/arm/combat/Initialize() . = ..() - if(locate(/obj/item/assembly/flash/armimplant) in items_list) - var/obj/item/assembly/flash/armimplant/F = locate(/obj/item/assembly/flash/armimplant) in items_list - F.I = src + for(var/datum/weakref/created_item in items_list) + var/obj/potential_flash = created_item.resolve() + if(!istype(potential_flash, /obj/item/assembly/flash/armimplant)) + continue + var/obj/item/assembly/flash/armimplant/flash = potential_flash + flash.arm = WEAKREF(src) /obj/item/organ/cyberimp/arm/surgery name = "surgical toolset implant" desc = "A set of surgical tools hidden behind a concealed panel on the user's arm." - contents = newlist(/obj/item/retractor/augment, /obj/item/hemostat/augment, /obj/item/cautery/augment, /obj/item/surgicaldrill/augment, /obj/item/scalpel/augment, /obj/item/circular_saw/augment, /obj/item/surgical_drapes) + items_to_create = list(/obj/item/retractor/augment, /obj/item/hemostat/augment, /obj/item/cautery/augment, /obj/item/surgicaldrill/augment, /obj/item/scalpel/augment, /obj/item/circular_saw/augment, /obj/item/surgical_drapes) /obj/item/organ/cyberimp/arm/power_cord name = "power cord implant" desc = "An internal power cord hooked up to a battery. Useful if you run on volts." - contents = newlist(/obj/item/apc_powercord) + items_to_create = list(/obj/item/apc_powercord) zone = "l_arm" /obj/item/organ/cyberimp/arm/esaw name = "arm-mounted energy saw" desc = "An illegal and highly dangerous implanted carbon-fiber blade with a toggleable hard-light edge." icon_state = "esaw_0" - contents = newlist(/obj/item/melee/transforming/energy/sword/esaw) + syndicate_implant = TRUE + items_to_create = list(/obj/item/melee/transforming/energy/sword/esaw) /obj/item/organ/cyberimp/arm/hydraulic_blade name = "arm-mounted hydraulic blade" desc = "Highly dangerous implanted plasteel blade." icon_state = "hydraulic_blade" - contents = newlist(/obj/item/melee/hydraulic_blade) + items_to_create = list(/obj/item/melee/hydraulic_blade) /obj/item/organ/cyberimp/arm/hydraulic_blade/l zone = BODY_ZONE_L_ARM + +/obj/item/organ/cyberimp/arm/botany + name = "botanical arm implant" + desc = "A rather simple arm implant containing tools used in gardening and botanical research." + items_to_create = list(/obj/item/cultivator, /obj/item/shovel/spade, /obj/item/hatchet, /obj/item/plant_analyzer, /obj/item/storage/bag/plants/portaseeder/compact) + +/obj/item/organ/cyberimp/arm/janitor + name = "janitorial tools implant" + desc = "A set of janitorial tools on the user's arm." + items_to_create = list(/obj/item/lightreplacer/cyborg, /obj/item/holosign_creator/janibarrier, /obj/item/soap/nanotrasen, /obj/item/reagent_containers/spray/cyborg/drying_agent, /obj/item/mop/advanced/cyborg, /obj/item/paint/paint_remover, /obj/item/reagent_containers/spray/cleaner) + +/obj/item/organ/cyberimp/arm/janitor/emag_act(mob/user) + to_chat(usr, "You unlock [src]'s integrated deluxe cleaning supplies!") + items_list += WEAKREF(new /obj/item/soap/syndie(src)) //We add not replace. + items_list += WEAKREF(new /obj/item/reagent_containers/spray/cyborg/lube(src)) + return TRUE diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 1f05d8f2d7340..47c4432829507 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -114,6 +114,8 @@ if(H.stat == CONSCIOUS) to_chat(H, "You feel your heart beating again!") +/obj/item/organ/cyberimp/chest/reviver/syndicate + syndicate_implant = TRUE /obj/item/organ/cyberimp/chest/thrusters name = "implantable thrusters set" @@ -174,6 +176,8 @@ A.UpdateButtonIcon() /obj/item/organ/cyberimp/chest/thrusters/proc/move_react() + SIGNAL_HANDLER + allow_thrust(0.01) /obj/item/organ/cyberimp/chest/thrusters/proc/allow_thrust(num) @@ -183,7 +187,8 @@ var/turf/T = get_turf(owner) if(!T) // No more runtimes from being stuck in nullspace. return 0 - + if(owner.is_flying() && owner.has_gravity()) + return 0 // Priority 1: use air from environment. var/datum/gas_mixture/environment = T.return_air() if(environment && environment.return_pressure() > 30) @@ -197,13 +202,8 @@ // Priority 3: use internals tank. var/obj/item/tank/I = owner.internal - if(I?.air_contents && I.air_contents.total_moles() > num) - var/datum/gas_mixture/removed = I.air_contents.remove(num) - if(removed.total_moles() > 0.005) - T.assume_air(removed) - return 1 - else - T.assume_air(removed) + if(I && I.air_contents && I.air_contents.total_moles() >= num) + T.assume_air_moles(I.air_contents, num) toggle(silent = TRUE) return 0 diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 1289ddc587e1a..6397ce9a5211c 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -12,29 +12,36 @@ name = "HUD implant" desc = "These cybernetic eyes will display a HUD over everything you see. Maybe." slot = ORGAN_SLOT_HUD - var/HUD_type = 0 + var/HUD_type + var/HUD_trait /obj/item/organ/cyberimp/eyes/hud/Insert(var/mob/living/carbon/M, var/special = 0, drop_if_replaced = FALSE) ..() if(HUD_type) var/datum/atom_hud/H = GLOB.huds[HUD_type] H.add_hud_to(M) + if(HUD_trait) + ADD_TRAIT(M, HUD_trait, ORGAN_TRAIT) /obj/item/organ/cyberimp/eyes/hud/Remove(var/mob/living/carbon/M, var/special = 0) if(HUD_type) var/datum/atom_hud/H = GLOB.huds[HUD_type] H.remove_hud_from(M) + if(HUD_trait) + REMOVE_TRAIT(M, HUD_trait, ORGAN_TRAIT) ..() /obj/item/organ/cyberimp/eyes/hud/medical name = "Medical HUD implant" desc = "These cybernetic eye implants will display a medical HUD over everything you see." HUD_type = DATA_HUD_MEDICAL_ADVANCED + HUD_trait = TRAIT_MEDICAL_HUD /obj/item/organ/cyberimp/eyes/hud/security name = "Security HUD implant" desc = "These cybernetic eye implants will display a security HUD over everything you see." HUD_type = DATA_HUD_SECURITY_ADVANCED + HUD_trait = TRAIT_SECURITY_HUD /obj/item/organ/cyberimp/eyes/hud/diagnostic name = "Diagnostic HUD implant" diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 15a51392606f2..bfeea59868e47 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -118,6 +118,8 @@ RegisterSignal(owner, signalCache, .proc/on_signal) /obj/item/organ/cyberimp/brain/anti_stun/proc/on_signal(datum/source, amount) + SIGNAL_HANDLER + if(!(organ_flags & ORGAN_FAILING) && amount > 0) addtimer(CALLBACK(src, .proc/clear_stuns), stun_cap_amount, TIMER_UNIQUE|TIMER_OVERRIDE) @@ -138,6 +140,9 @@ /obj/item/organ/cyberimp/brain/anti_stun/proc/reboot() organ_flags &= ~ORGAN_FAILING +/obj/item/organ/cyberimp/brain/anti_stun/syndicate + syndicate_implant = TRUE + //[[[[MOUTH]]]] /obj/item/organ/cyberimp/mouth zone = BODY_ZONE_PRECISE_MOUTH diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index b2bcef1657a45..4e3f9e0eb54a8 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -95,13 +95,13 @@ starting_organ = /obj/item/organ/eyes/robotic/thermals /obj/item/autosurgeon/syndicate/xray_eyes - starting_organ = /obj/item/organ/eyes/robotic/xray + starting_organ = /obj/item/organ/eyes/robotic/xray/syndicate /obj/item/autosurgeon/syndicate/anti_stun - starting_organ = /obj/item/organ/cyberimp/brain/anti_stun + starting_organ = /obj/item/organ/cyberimp/brain/anti_stun/syndicate /obj/item/autosurgeon/syndicate/reviver - starting_organ = /obj/item/organ/cyberimp/chest/reviver + starting_organ = /obj/item/organ/cyberimp/chest/reviver/syndicate /obj/item/autosurgeon/syndicate/esaw_arm desc = "A single use autosurgeon that contains an energy saw arm implant." diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 08a094f2c143f..b34e47b41917b 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -150,10 +150,11 @@ owner.Jitter(30) owner.Dizzy(30) owner.Knockdown(200) - deaf = 30 - to_chat(owner, "Your robotic ears are ringing, uselessly.") + to_chat(owner, "Alert: Audio sensors malfunctioning") + owner.apply_status_effect(STATUS_EFFECT_IPC_EMP) if(2) owner.Jitter(15) owner.Dizzy(15) owner.Knockdown(100) - to_chat(owner, "Your robotic ears buzz.") + to_chat(owner, "Alert: Audio sensors malfunctioning") + owner.apply_status_effect(STATUS_EFFECT_IPC_EMP) diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index d92607db0ab47..fb6e65beacecf 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -71,9 +71,9 @@ if((organ_flags & ORGAN_FAILING)) C.become_blind(EYE_DAMAGE) else if(damage > 30) - C.overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2) + C.overlay_fullscreen("eye_damage", /atom/movable/screen/fullscreen/impaired, 2) else - C.overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1) + C.overlay_fullscreen("eye_damage", /atom/movable/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 @@ -145,6 +145,12 @@ eye_color = "000" see_in_dark = 8 sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS + flash_protect = -INFINITY + tint = -INFINITY + +/obj/item/organ/eyes/robotic/xray/syndicate + desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile. On closer look, they have been modified to protect from sudden bright flashes." + flash_protect = 0 /obj/item/organ/eyes/robotic/thermals name = "thermal eyes" @@ -279,26 +285,20 @@ return deactivate(silent = TRUE) -/obj/item/organ/eyes/robotic/glow/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = FALSE) - . = ..() - RegisterSignal(M, COMSIG_ATOM_DIR_CHANGE, .proc/update_visuals) - -/obj/item/organ/eyes/robotic/glow/Remove(mob/living/carbon/M, special = FALSE) - . = ..() - UnregisterSignal(M, COMSIG_ATOM_DIR_CHANGE) - /obj/item/organ/eyes/robotic/glow/Destroy() QDEL_NULL(mobhook) // mobhook is not our component return ..() /obj/item/organ/eyes/robotic/glow/proc/activate(silent = FALSE) start_visuals() + RegisterSignal(owner, COMSIG_ATOM_DIR_CHANGE, .proc/update_visuals) if(!silent) to_chat(owner, "Your [src] clicks and makes a whining noise, before shooting out a beam of light!") active = TRUE cycle_mob_overlay() /obj/item/organ/eyes/robotic/glow/proc/deactivate(silent = FALSE) + UnregisterSignal(owner, COMSIG_ATOM_DIR_CHANGE) clear_visuals() if(!silent) to_chat(owner, "Your [src] shuts off!") @@ -306,6 +306,8 @@ remove_mob_overlay() /obj/item/organ/eyes/robotic/glow/proc/update_visuals(datum/source, olddir, newdir) + SIGNAL_HANDLER + if((LAZYLEN(eye_lighting) < light_beam_distance) || !on_mob) regenerate_light_effects() var/turf/scanfrom = get_turf(owner) @@ -354,7 +356,7 @@ clear_visuals(TRUE) on_mob = new(src) for(var/i in 1 to light_beam_distance) - LAZYADD(eye_lighting,new /obj/effect/abstract/eye_lighting(src)) + LAZYADD(eye_lighting, new /obj/effect/abstract/eye_lighting(src)) sync_light_effects() /obj/item/organ/eyes/robotic/glow/proc/sync_light_effects() @@ -370,6 +372,7 @@ /obj/effect/abstract/eye_lighting/Initialize() . = ..() parent = loc + mouse_opacity = MOUSE_OPACITY_TRANSPARENT if(!istype(parent)) return INITIALIZE_HINT_QDEL diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 25a93d03ac16c..eab73ae52b4ae 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -70,15 +70,15 @@ if(H.health <= H.crit_threshold && beat != BEAT_SLOW) beat = BEAT_SLOW - H.playsound_local(get_turf(H), slowbeat,40,0, channel = CHANNEL_HEARTBEAT) - to_chat(owner, "You feel your heart slow down...") + H.playsound_local(get_turf(H), slowbeat,40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) + to_chat(owner, "You feel your heart slow down.") if(beat == BEAT_SLOW && H.health > H.crit_threshold) H.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) + H.playsound_local(get_turf(H),fastbeat,40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) beat = BEAT_FAST else if(beat == BEAT_FAST) H.stop_sound_channel(CHANNEL_HEARTBEAT) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index ae1300dd0d795..191c6e5e23e22 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -17,32 +17,35 @@ //Breath damage - var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa - var/safe_oxygen_max = 0 - var/safe_nitro_min = 0 - var/safe_nitro_max = 0 - var/safe_co2_min = 0 - var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? - var/safe_toxins_min = 0 - var/safe_toxins_max = 0.05 - var/SA_para_min = 1 //Sleeping agent - var/SA_sleep_min = 5 //Sleeping agent + var/breathing_class = BREATH_OXY // can be a gas instead of a breathing class + var/safe_breath_min = 16 + var/safe_breath_max = 50 + var/safe_breath_dam_min = MIN_TOXIC_GAS_DAMAGE + var/safe_breath_dam_max = MAX_TOXIC_GAS_DAMAGE + var/safe_damage_type = OXY + var/list/gas_min = list() + var/list/gas_max = list( + GAS_CO2 = 30, // Yes it's an arbitrary value who cares? + GAS_PLASMA = MOLES_GAS_VISIBLE + ) + var/list/gas_damage = list( + "default" = list( + min = MIN_TOXIC_GAS_DAMAGE, + max = MAX_TOXIC_GAS_DAMAGE, + damage_type = OXY + ), + GAS_PLASMA = list( + min = MIN_TOXIC_GAS_DAMAGE, + max = MAX_TOXIC_GAS_DAMAGE, + damage_type = TOX + ) + ) + + var/SA_para_min = 1 //nitrous values + var/SA_sleep_min = 5 var/BZ_trip_balls_min = 1 //BZ gas var/gas_stimulation_min = 0.002 //Nitryl and Stimulum - var/oxy_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/oxy_breath_dam_max = MAX_TOXIC_GAS_DAMAGE - var/oxy_damage_type = OXY - var/nitro_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/nitro_breath_dam_max = MAX_TOXIC_GAS_DAMAGE - var/nitro_damage_type = OXY - var/co2_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/co2_breath_dam_max = MAX_TOXIC_GAS_DAMAGE - var/co2_damage_type = OXY - var/tox_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/tox_breath_dam_max = MAX_TOXIC_GAS_DAMAGE - var/tox_damage_type = TOX - var/cold_message = "your face freezing and an icicle forming" var/cold_level_1_threshold = 260 var/cold_level_2_threshold = 200 @@ -63,8 +66,22 @@ var/crit_stabilizing_reagent = /datum/reagent/medicine/epinephrine +/obj/item/organ/lungs/New() + . = ..() + populate_gas_info() + +/obj/item/organ/lungs/proc/populate_gas_info() + gas_min[breathing_class] = safe_breath_min + gas_max[breathing_class] = safe_breath_max + gas_damage[breathing_class] = list( + min = safe_breath_dam_min, + max = safe_breath_dam_max, + damage_type = safe_damage_type + ) /obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H) +//TODO: add lung damage = less oxygen gains + var/breathModifier = (5-(5*(damage/maxHealth)/2)) //range 2.5 - 5 if(H.status_flags & GODMODE) return if(HAS_TRAIT(H, TRAIT_NOBREATH)) @@ -79,147 +96,121 @@ H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) H.failed_last_breath = TRUE - if(safe_oxygen_min) - H.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) - else if(safe_toxins_min) - H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox) - else if(safe_co2_min) - H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2) - else if(safe_nitro_min) - H.throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro) + var/alert_category + var/alert_type + if(ispath(breathing_class)) + var/datum/breathing_class/class = GLOB.gas_data.breathing_classes[breathing_class] + alert_category = class.low_alert_category + alert_type = class.low_alert_datum + else + var/list/breath_alert_info = GLOB.gas_data.breath_alert_info + if(breathing_class in breath_alert_info) + var/list/alert = breath_alert_info[breathing_class]["not_enough_alert"] + alert_category = alert["alert_category"] + alert_type = alert["alert_type"] + if(alert_category) + H.throw_alert(alert_category, alert_type) return FALSE - var/gas_breathed = 0 + #define PP_MOLES(X) ((X / total_moles) * pressure) - //Partial pressures in our breath - var/O2_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/oxygen))+(8*breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/pluoxium))) - var/N2_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/nitrogen)) - var/Toxins_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/plasma)) - var/CO2_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/carbon_dioxide)) + #define PP(air, gas) PP_MOLES(air.get_moles(gas)) + var/gas_breathed = 0 - //-- OXY --// - - //Too much oxygen! //Yes, some species may not like it. - if(safe_oxygen_max) - if(O2_pp > safe_oxygen_max) - var/ratio = (breath.get_moles(/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.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy) - else - H.clear_alert("too_much_oxy") - - //Too little oxygen! - if(safe_oxygen_min) - if(O2_pp < safe_oxygen_min) - gas_breathed = handle_too_little_breath(H, O2_pp, safe_oxygen_min, breath.get_moles(/datum/gas/oxygen)) - H.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) + var/pressure = breath.return_pressure() + var/total_moles = breath.total_moles() + var/list/breath_alert_info = GLOB.gas_data.breath_alert_info + var/list/breath_results = GLOB.gas_data.breath_results + var/list/breathing_classes = GLOB.gas_data.breathing_classes + var/list/mole_adjustments = list() + for(var/entry in gas_min) + var/required_pp = 0 + var/required_moles = 0 + var/safe_min = gas_min[entry] + var/alert_category = null + var/alert_type = null + if(ispath(entry)) + var/datum/breathing_class/class = breathing_classes[entry] + var/list/gases = class.gases + var/list/products = class.products + alert_category = class.low_alert_category + alert_type = class.low_alert_datum + for(var/gas in gases) + var/moles = breath.get_moles(gas) + var/multiplier = gases[gas] + mole_adjustments[gas] = (gas in mole_adjustments) ? mole_adjustments[gas] - moles : -moles + required_pp += PP_MOLES(moles) * multiplier + required_moles += moles + if(multiplier > 0) + var/to_add = moles * multiplier + for(var/product in products) + mole_adjustments[product] = (product in mole_adjustments) ? mole_adjustments[product] + to_add : to_add else - H.failed_last_breath = FALSE - if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5) - gas_breathed = breath.get_moles(/datum/gas/oxygen) - H.clear_alert("not_enough_oxy") - - //Exhale - breath.adjust_moles(/datum/gas/oxygen, -gas_breathed) - breath.adjust_moles(/datum/gas/carbon_dioxide, gas_breathed) - gas_breathed = 0 - - //-- Nitrogen --// - - //Too much nitrogen! - if(safe_nitro_max) - if(N2_pp > safe_nitro_max) - var/ratio = (breath.get_moles(/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.throw_alert("too_much_nitro", /obj/screen/alert/too_much_nitro) - else - H.clear_alert("too_much_nitro") - - //Too little nitrogen! - if(safe_nitro_min) - if(N2_pp < safe_nitro_min) - gas_breathed = handle_too_little_breath(H, N2_pp, safe_nitro_min, breath.get_moles(/datum/gas/nitrogen)) - H.throw_alert("nitro", /obj/screen/alert/not_enough_nitro) + required_moles = breath.get_moles(entry) + required_pp = PP_MOLES(required_moles) + if(entry in breath_alert_info) + var/list/alert = breath_alert_info[entry]["not_enough_alert"] + alert_category = alert["alert_category"] + alert_type = alert["alert_type"] + mole_adjustments[entry] = -required_moles + mole_adjustments[breath_results[entry]] = required_moles + if(required_pp < safe_min) + var/multiplier = 0 + if(required_moles > 0) + multiplier = handle_too_little_breath(H, required_pp, safe_min, required_moles) / required_moles + for(var/adjustment in mole_adjustments) + mole_adjustments[adjustment] *= multiplier + if(alert_category) + H.throw_alert(alert_category, alert_type) + H.throw_alert(alert_category, alert_type) else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5) - gas_breathed = breath.get_moles(/datum/gas/nitrogen) - H.clear_alert("nitro") - - //Exhale - breath.adjust_moles(/datum/gas/nitrogen, -gas_breathed) - breath.adjust_moles(/datum/gas/carbon_dioxide, gas_breathed) - gas_breathed = 0 - - //-- CO2 --// - - //CO2 does not affect failed_last_breath. So if there was enough oxygen in the air but too much co2, this will hurt you, but only once per 4 ticks, instead of once per tick. - if(safe_co2_max) - if(CO2_pp > safe_co2_max) - if(!H.co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. - H.co2overloadtime = world.time - else if(world.time - H.co2overloadtime > 120) - H.Unconscious(60) - H.apply_damage_type(3, co2_damage_type) // Lets hurt em a little, let them know we mean business - if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! - H.apply_damage_type(8, co2_damage_type) - H.throw_alert("too_much_co2", /obj/screen/alert/too_much_co2) - if(prob(20)) // Lets give them some chance to know somethings not right though I guess. - H.emote("cough") - + H.adjustOxyLoss(-breathModifier) + if(alert_category) + H.clear_alert(alert_category) + var/list/danger_reagents = GLOB.gas_data.breath_reagents_dangerous + for(var/entry in gas_max) + var/found_pp = 0 + var/datum/breathing_class/breathing_class = entry + var/datum/reagent/danger_reagent = null + var/alert_category = null + var/alert_type = null + if(ispath(breathing_class)) + breathing_class = breathing_classes[breathing_class] + var/list/gases = breathing_class.gases + alert_category = breathing_class.high_alert_category + alert_type = breathing_class.high_alert_datum + danger_reagent = breathing_class.danger_reagent + for(var/gas in gases) + found_pp += PP(breath, gas) else - H.co2overloadtime = 0 - H.clear_alert("too_much_co2") - - //Too little CO2! - if(safe_co2_min) - if(CO2_pp < safe_co2_min) - gas_breathed = handle_too_little_breath(H, CO2_pp, safe_co2_min, breath.get_moles(/datum/gas/carbon_dioxide)) - H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2) - else - H.failed_last_breath = FALSE - if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5) - gas_breathed = breath.get_moles(/datum/gas/carbon_dioxide) - H.clear_alert("not_enough_co2") - - //Exhale - breath.adjust_moles(/datum/gas/carbon_dioxide, -gas_breathed) - breath.adjust_moles(/datum/gas/oxygen, gas_breathed) - gas_breathed = 0 - - - //-- TOX --// - - //Too much toxins! - if(safe_toxins_max) - if(Toxins_pp > safe_toxins_max) - var/ratio = (breath.get_moles(/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.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox) - else - H.clear_alert("too_much_tox") - - - //Too little toxins! - if(safe_toxins_min) - if(Toxins_pp < safe_toxins_min) - gas_breathed = handle_too_little_breath(H, Toxins_pp, safe_toxins_min, breath.get_moles(/datum/gas/plasma)) - H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox) - else - H.failed_last_breath = FALSE - if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5) - gas_breathed = breath.get_moles(/datum/gas/plasma) - H.clear_alert("not_enough_tox") - - //Exhale - breath.adjust_moles(/datum/gas/plasma, -gas_breathed) - breath.adjust_moles(/datum/gas/carbon_dioxide, gas_breathed) - gas_breathed = 0 + danger_reagent = danger_reagents[entry] + if(entry in breath_alert_info) + var/list/alert = breath_alert_info[entry]["too_much_alert"] + alert_category = alert["alert_category"] + alert_type = alert["alert_type"] + found_pp = PP(breath, entry) + if(found_pp > gas_max[entry]) + if(istype(danger_reagent)) + H.reagents.add_reagent(danger_reagent,1) + var/list/damage_info = (entry in gas_damage) ? gas_damage[entry] : gas_damage["default"] + var/dam = found_pp / gas_max[entry] * 10 + H.apply_damage_type(clamp(dam, damage_info["min"], damage_info["max"]), damage_info["damage_type"]) + if(alert_category && alert_type) + H.throw_alert(alert_category, alert_type) + else if(alert_category) + H.clear_alert(alert_category) + var/list/breath_reagents = GLOB.gas_data.breath_reagents + for(var/gas in breath.get_gases()) + if(gas in breath_reagents) + var/datum/reagent/R = breath_reagents[gas] + H.reagents.add_reagent(R, PP(breath,gas)) + mole_adjustments[gas] = (gas in mole_adjustments) ? mole_adjustments[gas] - breath.get_moles(gas) : -breath.get_moles(gas) + + for(var/gas in mole_adjustments) + breath.adjust_moles(gas, mole_adjustments[gas]) //-- TRACES --// @@ -228,7 +219,7 @@ // N2O - var/SA_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/nitrous_oxide)) + var/SA_pp = PP(breath, GAS_NITROUS) if(SA_pp > SA_para_min) // Enough to make us stunned for a bit H.Unconscious(60) // 60 gives them one second to wake up and run away a bit! if(SA_pp > SA_sleep_min) // Enough to make us sleep as well @@ -243,7 +234,7 @@ // BZ - var/bz_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/bz)) + var/bz_pp = PP(breath, GAS_BZ) if(bz_pp > BZ_trip_balls_min) H.hallucination += 10 H.reagents.add_reagent(/datum/reagent/bz_metabolites,5) @@ -254,16 +245,8 @@ H.hallucination += 5 H.reagents.add_reagent(/datum/reagent/bz_metabolites,1) - - // Tritium - var/trit_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/tritium)) - if (trit_pp > 50) - H.radiation += trit_pp/2 //If you're breathing in half an atmosphere of radioactive gas, you fucked up. - else - H.radiation += trit_pp/10 - // Nitryl - var/nitryl_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/nitryl)) + var/nitryl_pp = PP(breath,GAS_NITRYL) if (prob(nitryl_pp)) to_chat(H, "Your mouth feels like it's burning!") if (nitryl_pp >40) @@ -274,26 +257,26 @@ H.silent = max(H.silent, 3) else H.adjustFireLoss(nitryl_pp/4) - gas_breathed = breath.get_moles(/datum/gas/nitryl) + gas_breathed = breath.get_moles(GAS_NITRYL) if (gas_breathed > gas_stimulation_min) H.reagents.add_reagent(/datum/reagent/nitryl,1) - breath.adjust_moles(/datum/gas/nitryl, -gas_breathed) + breath.adjust_moles(GAS_NITRYL, -gas_breathed) // Stimulum - gas_breathed = breath.get_moles(/datum/gas/stimulum) + gas_breathed = PP(breath,GAS_STIMULUM) if (gas_breathed > gas_stimulation_min) var/existing = H.reagents.get_reagent_amount(/datum/reagent/stimulum) H.reagents.add_reagent(/datum/reagent/stimulum,max(0, 1 - existing)) - breath.adjust_moles(/datum/gas/stimulum, -gas_breathed) + breath.adjust_moles(GAS_STIMULUM, -gas_breathed) // Miasma - if (breath.get_moles(/datum/gas/miasma)) - var/miasma_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/miasma)) + if (breath.get_moles(GAS_MIASMA)) + var/miasma_pp = PP(breath,GAS_MIASMA) //Miasma sickness if(prob(0.5 * miasma_pp)) - var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3) + var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3, infected = src) miasma_disease.name = "Unknown" miasma_disease.try_infect(owner) @@ -328,7 +311,7 @@ // Then again, this is a purely hypothetical scenario and hardly reachable owner.adjust_disgust(0.1 * miasma_pp) - breath.adjust_moles(/datum/gas/miasma, -gas_breathed) + breath.adjust_moles(GAS_MIASMA, -gas_breathed) // Clear out moods when no miasma at all else @@ -402,20 +385,26 @@ desc = "A spongy rib-shaped mass for filtering plasma from the air." icon_state = "lungs-plasma" - safe_oxygen_min = 0 //We don't breath this - safe_toxins_min = 16 //We breath THIS! - safe_toxins_max = 0 + breathing_class = BREATH_PLASMA + +/obj/item/organ/lungs/plasmaman/populate_gas_info() + ..() + gas_max -= GAS_PLASMA + +/obj/item/organ/lungs/oozeling + name = "oozeling vacuole" + desc = "A large organelle designed to store oxygen and filter toxins." /obj/item/organ/lungs/slime name = "vacuole" desc = "A large organelle designed to store oxygen and other important gasses." - safe_toxins_max = 0 //We breathe this to gain POWER. - /obj/item/organ/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H) . = ..() if (breath) - var/plasma_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/plasma)) + var/total_moles = breath.total_moles() + var/pressure = breath.return_pressure() + var/plasma_pp = PP(breath, GAS_PLASMA) owner.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you. /obj/item/organ/lungs/cybernetic @@ -425,7 +414,8 @@ organ_flags = ORGAN_SYNTHETIC status = ORGAN_ROBOTIC maxHealth = 1.1 * STANDARD_ORGAN_THRESHOLD - safe_oxygen_min = 13 + safe_breath_min = 13 + safe_breath_max = 100 /obj/item/organ/lungs/cybernetic/emp_act() . = ..() @@ -438,17 +428,23 @@ name = "upgraded cybernetic lungs" desc = "A more advanced version of the stock cybernetic lungs. Features the ability to filter out lower levels of toxins and carbon dioxide." icon_state = "lungs-c-u" - safe_toxins_max = 20 - safe_co2_max = 20 + safe_breath_min = 4 + safe_breath_max = 250 + gas_max = list( + GAS_PLASMA = 30, + GAS_CO2 = 30 + ) maxHealth = 2 * STANDARD_ORGAN_THRESHOLD cold_level_1_threshold = 200 cold_level_2_threshold = 140 cold_level_3_threshold = 100 -obj/item/organ/lungs/apid +/obj/item/organ/lungs/apid name = "apid lungs" - desc = "Lungs from an apid, or beeperson. Thanks to the many spiracles an apid has, these lungs are capable of gathering more oxygen from low-pressure enviroments." + desc = "Lungs from an apid, or beeperson. Thanks to the many spiracles an apid has, these lungs are capable of gathering more oxygen from low-pressure environments." icon_state = "lungs" - safe_oxygen_min = 8 + safe_breath_min = 8 +#undef PP +#undef PP_MOLES diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index a75f53e9dfa49..32dfb86ed3e7b 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -70,13 +70,13 @@ /obj/item/organ/proc/on_find(mob/living/finder) return -/obj/item/organ/process() - on_death() //Kinda hate doing it like this, but I really don't want to call process directly. +/obj/item/organ/process(delta_time) + on_death(delta_time) //Kinda hate doing it like this, but I really don't want to call process directly. -/obj/item/organ/proc/on_death() //runs decay when outside of a person +/obj/item/organ/proc/on_death(delta_time = 2) //runs decay when outside of a person if(organ_flags & (ORGAN_SYNTHETIC | ORGAN_FROZEN)) return - applyOrganDamage(maxHealth * decay_factor) + applyOrganDamage(maxHealth * decay_factor * 0.5 * delta_time) /obj/item/organ/proc/on_life() //repair organ damage if the organ is not failing if(organ_flags & ORGAN_FAILING) diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index bbdd0f706ab2c..f80458ce70f3c 100755 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -68,13 +68,13 @@ H.clear_alert("disgust") SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "disgust") if(DISGUST_LEVEL_GROSS to DISGUST_LEVEL_VERYGROSS) - H.throw_alert("disgust", /obj/screen/alert/gross) + H.throw_alert("disgust", /atom/movable/screen/alert/gross) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/gross) if(DISGUST_LEVEL_VERYGROSS to DISGUST_LEVEL_DISGUSTED) - H.throw_alert("disgust", /obj/screen/alert/verygross) + H.throw_alert("disgust", /atom/movable/screen/alert/verygross) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/verygross) if(DISGUST_LEVEL_DISGUSTED to INFINITY) - H.throw_alert("disgust", /obj/screen/alert/disgusted) + H.throw_alert("disgust", /atom/movable/screen/alert/disgusted) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/disgusted) /obj/item/organ/stomach/Remove(mob/living/carbon/M, special = 0) @@ -94,69 +94,98 @@ icon_state = "stomach-p" desc = "A strange crystal that is responsible for metabolizing the unseen energy force that feeds plasmamen." -/obj/item/organ/stomach/cell + +/obj/item/organ/stomach/battery + name = "implantable battery" + icon_state = "implant-power" + desc = "A battery that stores charge for species that run on electricity." + var/max_charge = 5000 //same as upgraded+ cell + var/charge = 5000 + +/obj/item/organ/stomach/battery/Insert(mob/living/carbon/M, special = 0) + ..() + RegisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/charge) + update_nutrition() + +/obj/item/organ/stomach/battery/Remove(mob/living/carbon/M, special = 0) + UnregisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT) + if(!HAS_TRAIT(owner, TRAIT_NOHUNGER) && HAS_TRAIT(owner, TRAIT_POWERHUNGRY)) + owner.nutrition = 0 + owner.throw_alert("nutrition", /atom/movable/screen/alert/nocell) + ..() + +/obj/item/organ/stomach/battery/proc/charge(datum/source, amount, repairs) + SIGNAL_HANDLER + adjust_charge(amount) + +/obj/item/organ/stomach/battery/proc/adjust_charge(amount) + if(amount > 0) + charge = clamp((charge + amount)*(1-(damage/maxHealth)), 0, max_charge) + else + charge = clamp(charge + amount, 0, max_charge) + update_nutrition() + +/obj/item/organ/stomach/battery/proc/adjust_charge_scaled(amount) + adjust_charge(amount*max_charge/NUTRITION_LEVEL_FULL) + +/obj/item/organ/stomach/battery/proc/set_charge(amount) + charge = clamp(amount*(1-(damage/maxHealth)), 0, max_charge) + update_nutrition() + +/obj/item/organ/stomach/battery/proc/set_charge_scaled(amount) + set_charge(amount*max_charge/NUTRITION_LEVEL_FULL) + +/obj/item/organ/stomach/battery/proc/update_nutrition() + if(!HAS_TRAIT(owner, TRAIT_NOHUNGER) && HAS_TRAIT(owner, TRAIT_POWERHUNGRY)) + owner.nutrition = (charge/max_charge)*NUTRITION_LEVEL_FULL + +/obj/item/organ/stomach/battery/emp_act(severity) + switch(severity) + if(1) + adjust_charge(-0.5*max_charge) + applyOrganDamage(30) + if(2) + adjust_charge(-0.25*max_charge) + applyOrganDamage(15) + +/obj/item/organ/stomach/battery/ipc name = "micro-cell" icon_state = "microcell" w_class = WEIGHT_CLASS_NORMAL - zone = "chest" - slot = "stomach" attack_verb = list("assault and battery'd") - desc = "A micro-cell, for IPC use only. Do not swallow." + desc = "A micro-cell, for IPC use. Do not swallow." status = ORGAN_ROBOTIC organ_flags = ORGAN_SYNTHETIC + max_charge = 2750 //50 nutrition from 250 charge + charge = 2750 -/obj/item/organ/stomach/cell/emp_act(severity) +/obj/item/organ/stomach/battery/ipc/emp_act(severity) + ..() switch(severity) if(1) - owner.nutrition = 50 to_chat(owner, "Alert: Heavy EMP Detected. Rebooting power cell to prevent damage.") if(2) - owner.nutrition = 250 to_chat(owner, "Alert: EMP Detected. Cycling battery.") - -/obj/item/organ/stomach/cell/Insert(mob/living/carbon/M, special = 0) - ..() - RegisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/charge) - -/obj/item/organ/stomach/cell/Remove(mob/living/carbon/M, special = 0) - UnregisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT) - ..() -/obj/item/organ/stomach/cell/proc/charge(datum/source, amount, repairs) - if(owner.nutrition < NUTRITION_LEVEL_WELL_FED) - owner.nutrition += (amount / 10) //IPCs can feed themselves from a borg recharging station - if(owner.nutrition >= NUTRITION_LEVEL_WELL_FED) - to_chat(owner, "You are already fully charged!") - return - -/obj/item/organ/stomach/ethereal +/obj/item/organ/stomach/battery/ethereal name = "biological battery" icon_state = "stomach-p" //Welp. At least it's more unique in functionaliy. desc = "A crystal-like organ that stores the electric charge of ethereals." - var/crystal_charge = ETHEREAL_CHARGE_FULL - -/obj/item/organ/stomach/ethereal/on_life() - ..() - adjust_charge(-ETHEREAL_CHARGE_FACTOR) + max_charge = 2500 //same as upgraded cell + charge = 2500 -/obj/item/organ/stomach/ethereal/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/stomach/battery/ethereal/Insert(mob/living/carbon/M, special = 0) ..() - RegisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/charge) RegisterSignal(owner, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/on_electrocute) -/obj/item/organ/stomach/ethereal/Remove(mob/living/carbon/M, special = 0) - UnregisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT) +/obj/item/organ/stomach/battery/ethereal/Remove(mob/living/carbon/M, special = 0) UnregisterSignal(owner, COMSIG_LIVING_ELECTROCUTE_ACT) ..() -/obj/item/organ/stomach/ethereal/proc/charge(datum/source, amount, repairs) - adjust_charge(amount / 70) +/obj/item/organ/stomach/battery/ethereal/proc/on_electrocute(datum/source, shock_damage, shock_source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0, stun = TRUE) + SIGNAL_HANDLER -/obj/item/organ/stomach/ethereal/proc/on_electrocute(datum/source, shock_damage, siemens_coeff = 1, flags = NONE) - if(flags & SHOCK_ILLUSION) + if(illusion) return - adjust_charge(shock_damage * siemens_coeff * 2) + adjust_charge(shock_damage * siemens_coeff * 20) to_chat(owner, "You absorb some of the shock into your body!") - -/obj/item/organ/stomach/ethereal/proc/adjust_charge(amount) - crystal_charge = clamp(crystal_charge + amount, ETHEREAL_CHARGE_NONE, ETHEREAL_CHARGE_FULL) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 402e79e21b768..f3f019017fdcc 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -35,7 +35,7 @@ languages_possible = languages_possible_base /obj/item/organ/tongue/proc/handle_speech(datum/source, list/speech_args) - + SIGNAL_HANDLER /obj/item/organ/tongue/Insert(mob/living/carbon/M, special = 0) ..() if(say_mod && M.dna && M.dna.species) @@ -108,7 +108,7 @@ if(T.mothership == mothership) to_chat(H, "[src] is already attuned to the same channel as your own.") - H.visible_message("[H] holds [src] in their hands, and concentrates for a moment.", "You attempt to modify the attunation of [src].") + H.visible_message("[H] holds [src] in their hands, and concentrates for a moment.", "You attempt to modify the attenuation of [src].") if(do_after(H, delay=15, target=src)) to_chat(H, "You attune [src] to your own channel.") mothership = T.mothership @@ -238,9 +238,9 @@ languages_possible = languages_possible_base += typecacheof(/datum/language/machine) + typecacheof(/datum/language/voltaic) /obj/item/organ/tongue/robot/emp_act(severity) - owner.apply_effect(EFFECT_STUTTER, 120) owner.emote("scream") - to_chat(owner, "Alert: Vocal cords are malfunctioning.") + owner.apply_status_effect(STATUS_EFFECT_SPANISH) + owner.apply_status_effect(STATUS_EFFECT_IPC_EMP) /obj/item/organ/tongue/robot/handle_speech(datum/source, list/speech_args) speech_args[SPEECH_SPANS] |= SPAN_ROBOT diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 0e937a9a7b04d..1a745c0d4c4a2 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -140,7 +140,7 @@ message = lowertext(message) var/list/mob/living/listeners = list() - for(var/mob/living/L in get_hearers_in_view(8, user)) + for(var/mob/living/L in hearers(8, get_turf(user))) if(L.can_hear() && !L.anti_magic_check(FALSE, TRUE) && L.stat != DEAD) if(L == user && !include_speaker) @@ -149,7 +149,7 @@ var/mob/living/carbon/human/H = L if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) continue - if(istype(H.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(istype(H.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) continue listeners += L diff --git a/code/modules/surgery/organs/wings.dm b/code/modules/surgery/organs/wings.dm index 8cc7ba7f12475..979d3450b80c1 100644 --- a/code/modules/surgery/organs/wings.dm +++ b/code/modules/surgery/organs/wings.dm @@ -22,7 +22,7 @@ if(istype(H)) Refresh(H) -/obj/item/organ/wings/proc/Refresh(mob/living/carbon/human/H) +/obj/item/organ/wings/proc/Refresh(mob/living/carbon/human/H) if(!(basewings in H.dna.species.mutant_bodyparts)) H.dna.species.mutant_bodyparts |= basewings H.dna.features[basewings] = wing_type @@ -86,12 +86,12 @@ H.throw_at(throw_target, 5, 4) if(prob(10)) S.toggle_flight(H) - else + else S.toggle_flight(H) if(prob(50)) stoplag(5) S.toggle_flight(H) - else + else H.Togglewings() outofcontrol -- stoplag(5) @@ -99,7 +99,7 @@ /obj/item/organ/wings/cybernetic/ayy name = "advanced cybernetic wingpack" desc = "A compact pair of mechanical wings. They are equipped with miniaturized void engines, and can fly in any atmosphere, or lack thereof." - flight_level = WINGS_MAGIC + flight_level = WINGS_MAGIC /obj/item/organ/wings/moth name = "pair of moth wings" @@ -121,10 +121,11 @@ if(flight_level >= WINGS_FLIGHTLESS && H.bodytemperature >= 800 && H.fire_stacks > 0) flight_level = WINGS_COSMETIC to_chat(H, "Your precious wings burn to a crisp!") + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "burnt_wings", /datum/mood_event/burnt_wings) H.dna.features["moth_wings"] = "Burnt Off" wing_type = "Burnt Off" H.dna.species.handle_mutant_bodyparts(H) - + /obj/item/organ/wings/angel name = "pair of feathered wings" desc = "A pair of feathered wings. They seem robust enough for flight" @@ -145,9 +146,65 @@ name = "pair of bee wings" desc = "A pair of bee wings. They seem tiny and undergrown" icon_state = "beewings" - flight_level = WINGS_FLIGHTLESS + flight_level = WINGS_COSMETIC + actions_types = list(/datum/action/item_action/organ_action/use/bee_dash) wing_type = "Bee" +/datum/action/item_action/organ_action/use/bee_dash + var/jumpdistance = 3 + var/jumpspeed = 1 + var/recharging_rate = 100 + var/recharging_time = 0 + +/datum/action/item_action/organ_action/use/bee_dash/Trigger() + var/mob/living/carbon/L = owner + + if(L.stat != CONSCIOUS || L.buckling || L.restrained()) // Has to be concious and unbuckled + return + if(recharging_time > world.time) + to_chat(L, "The wings aren't ready to dash yet!") + return + var/datum/gas_mixture/environment = L.loc.return_air() + if(environment && !(environment.return_pressure() > 30)) + to_chat(L, "The atmosphere is too thin for you to dash!") + return + + var/turf/target = get_edge_target_turf(L, L.dir) //represents the user's direction + var/hoppingtable = FALSE // Triggers the trip + var/jumpdistancemoved = jumpdistance // temp jumpdistance + var/turf/checkjump = get_turf(L) + + for(var/i in 1 to jumpdistance) //This is how hiero club find the tiles in front of it, tell me/fix it if there's a better way + var/turf/T = get_step(checkjump, L.dir) + if(T.density || !T.ClickCross(invertDir(L.dir), border_only = 1)) + break + if(locate(/obj/structure/table) in T) // If there's a table, trip + hoppingtable = TRUE + jumpdistancemoved = i + break + if(!T.ClickCross(L.dir)) // Check for things other than tables that would block flight at the T turf + break + checkjump = get_step(checkjump, L.dir) + + var/datum/callback/crashcallback + if(hoppingtable) + crashcallback = CALLBACK(src, .proc/crash_into_table, get_step(checkjump, L.dir)) + if(L.throw_at(target, jumpdistancemoved, jumpspeed, spin = FALSE, diagonals_first = TRUE, callback = crashcallback, force = MOVE_FORCE_WEAK)) + playsound(L, 'sound/creatures/bee.ogg', 50, 1, 1) + L.visible_message("[usr] dashes forward into the air!") + recharging_time = world.time + recharging_rate + else + to_chat(L, "Something prevents you from dashing forward!") + +/datum/action/item_action/organ_action/use/bee_dash/proc/crash_into_table(turf/tableturf) + if(owner.loc == tableturf) + var/mob/living/carbon/L = owner + L.take_bodypart_damage(10,check_armor = TRUE) + L.Paralyze(40) + L.visible_message("[L] crashes into a table, falling over!",\ + "You violently crash into a table!") + playsound(src,'sound/weapons/punch1.ogg',50,1) + /datum/action/innate/flight name = "Toggle Flight" check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_STUN @@ -163,4 +220,4 @@ to_chat(H, "You settle gently back onto the ground...") else to_chat(H, "You beat your wings and begin to hover gently above the ground...") - H.set_resting(FALSE, TRUE) \ No newline at end of file + H.set_resting(FALSE, TRUE) diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index 312ed207ee845..145b3d67d6319 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -11,14 +11,14 @@ if(!iscarbon(target)) return 0 var/mob/living/carbon/C = target - if(!C.get_bodypart(user.zone_selected)) //can only start if limb is missing - return 1 - + if(!isoozeling(target)) + if(!C.get_bodypart(user.zone_selected)) //can only start if limb is missing + return 1 /datum/surgery_step/add_prosthetic name = "add prosthetic" - implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100, /obj/item/twohanded/required/chainsaw = 100, /obj/item/melee/synthetic_arm_blade = 100) + implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100, /obj/item/chainsaw = 100, /obj/item/melee/synthetic_arm_blade = 100) time = 32 var/organ_rejection_dam = 0 @@ -87,15 +87,15 @@ "[user] finishes attaching [tool]!", "[user] finishes the attachment procedure!") qdel(tool) - if(istype(tool, /obj/item/twohanded/required/chainsaw/energy/doom)) + if(istype(tool, /obj/item/chainsaw/energy/doom)) var/obj/item/mounted_chainsaw/super/new_arm = new(target) target_zone == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm) return 1 - else if(istype(tool, /obj/item/twohanded/required/chainsaw/energy)) + else if(istype(tool, /obj/item/chainsaw/energy)) var/obj/item/mounted_chainsaw/energy/new_arm = new(target) target_zone == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm) return 1 - else if(istype(tool, /obj/item/twohanded/required/chainsaw)) + else if(istype(tool, /obj/item/chainsaw)) var/obj/item/mounted_chainsaw/normal/new_arm = new(target) target_zone == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm) return 1 @@ -103,4 +103,3 @@ var/obj/item/melee/arm_blade/new_arm = new(target,TRUE,TRUE) target_zone == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm) return 1 - diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index 4ac83e7b17004..29c3ef30d208a 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -30,11 +30,7 @@ var/objects = 0 for(var/obj/item/I in L.embedded_objects) objects++ - I.forceMove(get_turf(H)) - L.embedded_objects -= I - 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.dm b/code/modules/surgery/surgery.dm index 91b4266154fed..7b1b72ccaba27 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -2,23 +2,23 @@ var/name = "surgery" var/desc = "surgery description" var/status = 1 - var/list/steps = list() //Steps in a surgery - var/step_in_progress = FALSE //Actively performing a Surgery - var/can_cancel = TRUE //Can cancel this surgery after step 1 with cautery + var/list/steps = list() //Steps in a surgery + var/step_in_progress = FALSE //Actively performing a Surgery + var/can_cancel = TRUE //Can cancel this surgery after step 1 with cautery var/list/target_mobtypes = list(/mob/living/carbon/human) //Acceptable Species - var/location = BODY_ZONE_CHEST //Surgery location - var/requires_bodypart_type = BODYPART_ORGANIC //Prevents you from performing an operation on incorrect limbs. 0 for any limb type - var/list/possible_locs = list() //Multiple locations - var/ignore_clothes = FALSE //This surgery ignores clothes - var/mob/living/carbon/target //Operation target mob - var/obj/item/bodypart/operated_bodypart //Operable body part - var/requires_bodypart = TRUE //Surgery available only when a bodypart is present, or only when it is missing. - var/success_multiplier = 0 //Step success propability multiplier - var/requires_real_bodypart = FALSE //Some surgeries don't work on limbs that don't really exist - var/lying_required = TRUE //Does the vicitm needs to be lying down. - var/self_operable = FALSE //Can the surgery be performed on yourself. - var/requires_tech = FALSE //handles techweb-oriented surgeries, previously restricted to the /advanced subtype (You still need to add designs) - var/replaced_by //type; doesn't show up if this type exists. Set to /datum/surgery if you want to hide a "base" surgery (useful for typing parents IE healing.dm just make sure to null it out again) + var/location = BODY_ZONE_CHEST //Surgery location + var/requires_bodypart_type = BODYPART_ORGANIC //Prevents you from performing an operation on incorrect limbs. 0 for any limb type + var/list/possible_locs = list() //Multiple locations + var/ignore_clothes = FALSE //This surgery ignores clothes + var/mob/living/carbon/target //Operation target mob + var/obj/item/bodypart/operated_bodypart //Operable body part + var/requires_bodypart = TRUE //Surgery available only when a bodypart is present, or only when it is missing. + var/speed_modifier = 0 //Step speed multiplier + var/requires_real_bodypart = FALSE //Some surgeries don't work on limbs that don't really exist + var/lying_required = TRUE //Does the vicitm needs to be lying down. + var/self_operable = FALSE //Can the surgery be performed on yourself. + var/requires_tech = FALSE //handles techweb-oriented surgeries, previously restricted to the /advanced subtype (You still need to add designs) + var/replaced_by //type; doesn't show up if this type exists. Set to /datum/surgery if you want to hide a "base" surgery (useful for typing parents IE healing.dm just make sure to null it out again) /datum/surgery/New(surgery_target, surgery_location, surgery_bodypart) ..() @@ -43,7 +43,7 @@ if(replaced_by == /datum/surgery) return FALSE - if(HAS_TRAIT(user, TRAIT_SURGEON)) + if(HAS_TRAIT(user, TRAIT_SURGEON) || (user.mind && HAS_TRAIT(user.mind, TRAIT_SURGEON))) if(replaced_by) return FALSE else @@ -115,31 +115,6 @@ SSblackbox.record_feedback("tally", "surgeries_completed", 1, type) qdel(src) -/datum/surgery/proc/get_propability_multiplier(mob/user) - var/propability = 0.3 - var/turf/T = get_turf(target) - var/selfpenalty = 0 - var/sleepbonus = 0 - if(target == user) - if(HAS_TRAIT(user, TRAIT_SELF_AWARE) || locate(/obj/structure/mirror) in range(1, user)) - selfpenalty = 0.4 - else - selfpenalty = 0.6 - if(target.stat != CONSCIOUS) - sleepbonus = 0.5 - if(locate(/obj/structure/table/optable/abductor, T)) - propability = 1.2 - if(locate(/obj/machinery/stasis, T)) - propability = 0.8 - if(locate(/obj/structure/table/optable, T)) - propability = 0.8 - else if(locate(/obj/structure/table, T)) - propability = 0.6 - else if(locate(/obj/structure/bed, T)) - propability = 0.5 - - return propability + success_multiplier + sleepbonus - selfpenalty - /datum/surgery/advanced name = "advanced surgery" requires_tech = TRUE diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index bab3f0a8e4837..8908661f225c1 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -55,10 +55,35 @@ return FALSE +/datum/surgery_step/proc/get_speed_modifier(mob/user, mob/target) + var/propability = 0.3 + var/turf/T = get_turf(target) + var/selfpenalty = 0 + var/sleepbonus = 0 + if(target == user) + if(HAS_TRAIT(user, TRAIT_SELF_AWARE) || user.get_inactive_held_item() == /obj/item/handmirror || locate(/obj/structure/mirror) in view(1, user)) + selfpenalty = 0.4 + else + selfpenalty = 0.6 + if(target.stat)//are they not conscious + sleepbonus = 0.5 + if(locate(/obj/structure/table/optable/abductor, T)) + propability = 1.2 + else if(locate(/obj/structure/table/optable, T)) + propability = 1 + else if(locate(/obj/machinery/stasis, T)) + propability = 0.8 + else if(locate(/obj/structure/table, T)) + propability = 0.6 + else if(locate(/obj/structure/bed, T)) + propability = 0.5 + + return max(propability + sleepbonus - selfpenalty, 0.1) /datum/surgery_step/proc/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) surgery.step_in_progress = TRUE var/speed_mod = 1 + var/fail_prob = 0//100 - fail_prob = success_prob var/advance = FALSE if(preop(user, target, target_zone, tool, surgery) == -1) @@ -68,19 +93,26 @@ if(tool) speed_mod = tool.toolspeed - if(do_after(user, time * speed_mod, target = target)) - var/prob_chance = 100 + var/implement_speed_mod = 1 + if(implement_type)//this means it isn't a require hand or any item step. + implement_speed_mod = implements[implement_type] / 100.0 + speed_mod /= (get_speed_modifier(user, target) * (1 + surgery.speed_modifier) * implement_speed_mod) + + var/modded_time = time * speed_mod + fail_prob = min(max(0, modded_time - (time * 2)), 99)//if modded_time > time * 2, then fail_prob = modded_time - time*2. starts at 0, caps at 99 + modded_time = min(modded_time, time * 2)//also if that, then cap modded_time at time*2 + + if(iscyborg(user))//any immunities to surgery slowdown should go in this check. + modded_time = time + + if(do_after(user, modded_time, target = target)) - if(implement_type) //this means it isn't a require hand or any item step. - prob_chance = implements[implement_type] - prob_chance *= surgery.get_propability_multiplier(user) + if((prob(100 - fail_prob) || iscyborg(user)) && chem_check(target) && !try_to_fail) - if((prob(prob_chance) || iscyborg(user)) && chem_check(target) && !try_to_fail) if(success(user, target, target_zone, tool, surgery)) advance = TRUE - else - if(failure(user, target, target_zone, tool, surgery)) - advance = TRUE + else if(failure(user, target, target_zone, tool, surgery, fail_prob)) + advance = TRUE if(advance && !repeatable) surgery.status++ @@ -90,7 +122,6 @@ surgery.step_in_progress = FALSE return advance - /datum/surgery_step/proc/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to perform surgery on [target]...", "[user] begins to perform surgery on [target].", @@ -148,7 +179,7 @@ //Replaces visible_message during operations so only people looking over the surgeon can tell what they're doing, allowing for shenanigans. /datum/surgery_step/proc/display_results(mob/user, mob/living/carbon/target, self_message, detailed_message, vague_message, target_detailed = FALSE) - var/list/detailed_mobs = get_hearers_in_view(1, user) //Only the surgeon and people looking over his shoulder can see the operation clearly + var/list/detailed_mobs = hearers(1, user) //Only the surgeon and people looking over his shoulder can see the operation clearly if(!target_detailed) detailed_mobs -= target //The patient can't see well what's going on, unless it's something like getting cut user.visible_message(detailed_message, self_message, vision_distance = 1, ignored_mobs = target_detailed ? null : target) diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 6497252c883ee..6ccc8004f2e0f 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -340,6 +340,7 @@ icon_state = "scalpel_a" /obj/item/scalpel/advanced/examine() + . = ..() . += " It's set to [tool_behaviour == TOOL_SCALPEL ? "scalpel" : "saw"] mode." /obj/item/retractor/advanced @@ -361,6 +362,7 @@ icon_state = "retractor_a" /obj/item/retractor/advanced/examine() + . = ..() . += " It resembles a retractor[tool_behaviour == TOOL_RETRACTOR ? "retractor" : "hemostat"]." /obj/item/surgicaldrill/advanced @@ -371,6 +373,7 @@ hitsound = 'sound/items/welder.ogg' toolspeed = 0.7 light_color = LIGHT_COLOR_RED + w_class = WEIGHT_CLASS_SMALL /obj/item/surgicaldrill/advanced/Initialize() . = ..() @@ -388,4 +391,5 @@ icon_state = "surgicaldrill_a" /obj/item/surgicaldrill/advanced/examine() - . += " It's set to [tool_behaviour == TOOL_DRILL ? "drilling" : "mending"] mode." \ No newline at end of file + . = ..() + . += " It's set to [tool_behaviour == TOOL_DRILL ? "drilling" : "mending"] mode." diff --git a/code/modules/tgchat/to_chat.dm b/code/modules/tgchat/to_chat.dm index 21904a7a8ae8b..0bc97d09c6617 100644 --- a/code/modules/tgchat/to_chat.dm +++ b/code/modules/tgchat/to_chat.dm @@ -11,6 +11,7 @@ type = null, text = null, avoid_highlighting = FALSE, + allow_linkify = FALSE, // FIXME: These flags are now pointless and have no effect handle_whitespace = TRUE, trailing_newline = TRUE) @@ -24,6 +25,7 @@ if(text) message["text"] = text if(html) message["html"] = html if(avoid_highlighting) message["avoidHighlighting"] = avoid_highlighting + if(allow_linkify) message["allowLinkify"] = allow_linkify var/message_blob = TGUI_CREATE_MESSAGE("chat/message", message) var/message_html = message_to_html(message) if(islist(target)) @@ -54,6 +56,7 @@ type = null, text = null, avoid_highlighting = FALSE, + allow_linkify = FALSE, // FIXME: These flags are now pointless and have no effect handle_whitespace = TRUE, trailing_newline = TRUE) @@ -70,4 +73,5 @@ if(text) message["text"] = text if(html) message["html"] = html if(avoid_highlighting) message["avoidHighlighting"] = avoid_highlighting + if(allow_linkify) message["allowLinkify"] = allow_linkify SSchat.queue(target, message) diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm index f75e7837af0f2..41a0473394525 100644 --- a/code/modules/tgs/core/core.dm +++ b/code/modules/tgs/core/core.dm @@ -40,7 +40,7 @@ if(5) api_datum = /datum/tgs_api/v5 - var/datum/tgs_version/max_api_version = TgsMaximumAPIVersion(); + var/datum/tgs_version/max_api_version = TgsMaximumApiVersion(); 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 @@ -64,10 +64,10 @@ TGS_WRITE_GLOBAL(tgs, null) TGS_ERROR_LOG("Failed to activate API!") -/world/TgsMaximumAPIVersion() +/world/TgsMaximumApiVersion() return new /datum/tgs_version("5.x.x") -/world/TgsMinimumAPIVersion() +/world/TgsMinimumApiVersion() return new /datum/tgs_version("3.2.x") /world/TgsInitializationComplete() diff --git a/code/modules/tgs/includes.dm b/code/modules/tgs/includes.dm index c803cf7ac2652..4018074f4e37e 100644 --- a/code/modules/tgs/includes.dm +++ b/code/modules/tgs/includes.dm @@ -14,4 +14,4 @@ #include "v5\_defines.dm" #include "v5\api.dm" #include "v5\commands.dm" -#include "v5\undef.dm" +#include "v5\undefs.dm" diff --git a/code/modules/tgs/v3210/api.dm b/code/modules/tgs/v3210/api.dm index 5b41e6a89d876..63823251001b2 100644 --- a/code/modules/tgs/v3210/api.dm +++ b/code/modules/tgs/v3210/api.dm @@ -62,7 +62,7 @@ comms_key = world.params[SERVICE_WORLD_PARAM] instance_name = world.params[SERVICE_INSTANCE_PARAM] if(!instance_name) - instance_name = "TG Station Server" //maybe just upgraded + instance_name = "TG Station Server" //maybe just upgraded var/list/logs = file2list(".git/logs/HEAD") if(logs.len) @@ -92,14 +92,14 @@ if(skip_compat_check && !fexists(SERVICE_INTERFACE_DLL)) TGS_ERROR_LOG("Service parameter present but no interface DLL detected. This is symptomatic of running a service less than version 3.1! Please upgrade.") return - call(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval + call(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval return TRUE /datum/tgs_api/v3210/OnTopic(T) var/list/params = params2list(T) var/their_sCK = params[SERVICE_CMD_PARAM_KEY] if(!their_sCK) - return FALSE //continue world/Topic + return FALSE //continue world/Topic if(their_sCK != comms_key) return "Invalid comms key!"; @@ -160,7 +160,7 @@ var/datum/tgs_revision_information/test_merge/tm = new tm.number = text2num(I) var/list/entry = json[I] - tm.pull_request_commit = entry["commit"] + tm.head_commit = entry["commit"] tm.author = entry["author"] tm.title = entry["title"] . += tm @@ -176,7 +176,7 @@ return ri /datum/tgs_api/v3210/EndProcess() - sleep(world.tick_lag) //flush the buffers + sleep(world.tick_lag) //flush the buffers ExportService(SERVICE_REQUEST_KILL_PROCESS) /datum/tgs_api/v3210/ChatChannelInfo() diff --git a/code/modules/tgs/v4/api.dm b/code/modules/tgs/v4/api.dm index 081543828e804..0e37a7aa24c0d 100644 --- a/code/modules/tgs/v4/api.dm +++ b/code/modules/tgs/v4/api.dm @@ -92,7 +92,7 @@ var/list/json = cached_json["testMerges"] for(var/entry in json) var/datum/tgs_revision_information/test_merge/tm = new - tm.time_merged = text2num(entry["timeMerged"]) + tm.timestamp = text2num(entry["timeMerged"]) var/list/revInfo = entry["revision"] if(revInfo) @@ -104,7 +104,7 @@ tm.url = entry["url"] tm.author = entry["author"] tm.number = entry["number"] - tm.pull_request_commit = entry["pullRequestRevision"] + tm.head_commit = entry["pullRequestRevision"] tm.comment = entry["comment"] cached_test_merges += tm @@ -118,7 +118,7 @@ var/list/params = params2list(T) var/their_sCK = params[TGS4_INTEROP_ACCESS_IDENTIFIER] if(!their_sCK) - return FALSE //continue world/Topic + return FALSE //continue world/Topic if(their_sCK != access_identifier) return "Invalid comms key!"; @@ -192,7 +192,7 @@ //request a new port export_lock = FALSE - var/list/new_port_json = Export(TGS4_COMM_NEW_PORT, list(TGS4_PARAMETER_DATA = "[world.port]"), TRUE) //stringify this on purpose + var/list/new_port_json = Export(TGS4_COMM_NEW_PORT, list(TGS4_PARAMETER_DATA = "[world.port]"), TRUE) //stringify this on purpose if(!new_port_json) TGS_ERROR_LOG("No new port response from server![TGS4_PORT_CRITFAIL_MESSAGE]") @@ -235,7 +235,7 @@ var/port = result[TGS4_PARAMETER_DATA] if(!isnum(port)) - return //this is valid, server may just want use to reboot + 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 diff --git a/code/modules/tgs/v5/README.md b/code/modules/tgs/v5/README.md new file mode 100644 index 0000000000000..5b48d57a1f07f --- /dev/null +++ b/code/modules/tgs/v5/README.md @@ -0,0 +1,8 @@ +# DMAPI V5 + +This DMAPI implements bridge requests using HTTP GET requests to TGS. It has no security restrictions. + +- [_defines.dm](./_defines.dm) contains constant definitions. +- [api.dm](./api.dm) contains the bulk of the API code. +- [commands.dm](./commands.dm) contains functions relating to `/datum/tgs_chat_command`s. +- [undefs.dm](./undefs.dm) Undoes the work of `_defines.dm`. diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm index 8fd84e19fa325..10bc4cbe40606 100644 --- a/code/modules/tgs/v5/_defines.dm +++ b/code/modules/tgs/v5/_defines.dm @@ -79,6 +79,7 @@ #define DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES "chatResponses" #define DMAPI5_REVISION_INFORMATION_COMMIT_SHA "commitSha" +#define DMAPI5_REVISION_INFORMATION_TIMESTAMP "timestamp" #define DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA "originCommitSha" #define DMAPI5_CHAT_USER_ID "id" diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 466a986237d95..704ff873c0a1e 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -18,7 +18,9 @@ var/initialized = FALSE /datum/tgs_api/v5/ApiVersion() - return new /datum/tgs_version(TGS_DMAPI_VERSION) + return new /datum/tgs_version( + #include "interop_version.dm" + ) /datum/tgs_api/v5/OnWorldNew(minimum_required_security_level) server_port = world.params[DMAPI5_PARAM_SERVER_PORT] @@ -48,6 +50,7 @@ if(istype(revisionData)) revision = new revision.commit = revisionData[DMAPI5_REVISION_INFORMATION_COMMIT_SHA] + revision.timestamp = revisionData[DMAPI5_REVISION_INFORMATION_TIMESTAMP] revision.origin_commit = revisionData[DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA] else TGS_ERROR_LOG("Failed to decode [DMAPI5_RUNTIME_INFORMATION_REVISION] from runtime information!") @@ -63,15 +66,18 @@ if(revInfo) tm.commit = revisionData[DMAPI5_REVISION_INFORMATION_COMMIT_SHA] tm.origin_commit = revisionData[DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA] + tm.timestamp = entry[DMAPI5_REVISION_INFORMATION_TIMESTAMP] 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]) + if(!tm.timestamp) + tm.timestamp = 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.head_commit = entry[DMAPI5_TEST_MERGE_PULL_REQUEST_REVISION] tm.comment = entry[DMAPI5_TEST_MERGE_COMMENT] test_merges += tm @@ -98,18 +104,19 @@ return json_encode(response) /datum/tgs_api/v5/OnTopic(T) - if(!initialized) - return FALSE //continue world/Topic - var/list/params = params2list(T) var/json = params[DMAPI5_TOPIC_DATA] if(!json) - return FALSE + return FALSE // continue to /world/Topic var/list/topic_parameters = json_decode(json) if(!topic_parameters) return TopicResponse("Invalid topic parameters json!"); + if(!initialized) + TGS_WARNING_LOG("Missed topic due to not being initialized: [T]") + return TRUE // too early to handle, but it's still our responsibility + 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]!"); @@ -266,7 +273,7 @@ var/port = result[DMAPI5_BRIDGE_RESPONSE_NEW_PORT] if(!isnum(port)) - return //this is valid, server may just want use to reboot + 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 diff --git a/code/modules/tgs/v5/interop_version.dm b/code/modules/tgs/v5/interop_version.dm new file mode 100644 index 0000000000000..c7bf62ecae353 --- /dev/null +++ b/code/modules/tgs/v5/interop_version.dm @@ -0,0 +1 @@ +"5.3.0" diff --git a/code/modules/tgs/v5/undef.dm b/code/modules/tgs/v5/undef.dm deleted file mode 100644 index 34fc481d36e71..0000000000000 --- a/code/modules/tgs/v5/undef.dm +++ /dev/null @@ -1,98 +0,0 @@ -#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/tgs/v5/undefs.dm b/code/modules/tgs/v5/undefs.dm new file mode 100644 index 0000000000000..5885a60e75cea --- /dev/null +++ b/code/modules/tgs/v5/undefs.dm @@ -0,0 +1,99 @@ +#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_TIMESTAMP +#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/external.dm b/code/modules/tgui/external.dm index c4515b8a7637d..5ced3e0d4746e 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -17,6 +17,28 @@ /datum/proc/ui_interact(mob/user, datum/tgui/ui) return FALSE // Not implemented. +/** + * public + * + * Returns TRUE if a non autoupdating UI needs to update. + */ +/datum/proc/ui_requires_update(mob/user, datum/tgui/ui) + if(ui.needs_update) + ui.needs_update = FALSE + return TRUE + return FALSE // Not implemented. + +/** + * public + * + * Causes the UI to update to viewers on the next process. + * Better than calling SStgui.update if this is callable by the user, + * since it calls on process rather than instantly which handles spamming. + */ +/datum/proc/ui_update() + for(var/datum/tgui/ui as() in SStgui.get_all_open_uis(src)) + ui.needs_update = TRUE + /** * public * @@ -143,7 +165,7 @@ * Called on a UI's object when the UI is closed, not to be confused with * client/verb/uiclose(), which closes the ui window */ -/datum/proc/ui_close(mob/user) +/datum/proc/ui_close(mob/user, datum/tgui/tgui) /** * verb diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index 4a5ec56535584..436dca91fa805 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -115,7 +115,7 @@ */ /mob/living/proc/shared_living_ui_distance(atom/movable/src_object, viewcheck = TRUE) // If the object is obscured, close it. - if(viewcheck && !(src_object in view(src))) + if(viewcheck && !((src_object in src) || (src in viewers(src_object)))) return UI_CLOSE var/dist = get_dist(src_object, src) // Open and interact if 1-0 tiles away. diff --git a/code/modules/tgui/states/clockcult_state.dm b/code/modules/tgui/states/clockcult_state.dm new file mode 100644 index 0000000000000..64c74e2e01134 --- /dev/null +++ b/code/modules/tgui/states/clockcult_state.dm @@ -0,0 +1,6 @@ +GLOBAL_DATUM_INIT(clockcult_state, /datum/ui_state/clockcult_state, new) + +/datum/ui_state/clockcult_state/can_use_topic(src_object, mob/user) + if(is_servant_of_ratvar(user)) + return UI_INTERACTIVE + return UI_CLOSE diff --git a/code/modules/tgui/states/zlevel.dm b/code/modules/tgui/states/zlevel.dm index 64ea2fa1c0ecf..446b62d488f5d 100644 --- a/code/modules/tgui/states/zlevel.dm +++ b/code/modules/tgui/states/zlevel.dm @@ -12,6 +12,6 @@ GLOBAL_DATUM_INIT(z_state, /datum/ui_state/z_state, new) /datum/ui_state/z_state/can_use_topic(src_object, mob/user) var/turf/turf_obj = get_turf(src_object) var/turf/turf_usr = get_turf(user) - if(turf_obj && turf_usr && turf_obj.z == turf_usr.z) + if(turf_obj && turf_usr && turf_obj.get_virtual_z_level() == turf_usr.get_virtual_z_level()) return UI_INTERACTIVE return UI_CLOSE diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index 5c4c14cfb9cec..693e429048919 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -22,7 +22,7 @@ /// The interface (template) to be used for this UI. var/interface /// Update the UI every MC tick. - var/autoupdate = TRUE + var/autoupdate = FALSE /// If the UI has been initialized yet. var/initialized = FALSE /// Time of opening the window. @@ -33,6 +33,8 @@ var/status = UI_INTERACTIVE /// Topic state used to determine status/interactability. var/datum/ui_state/state = null + /// If the window should update + var/needs_update = FALSE /** * public @@ -65,22 +67,29 @@ if(ui_x && ui_y) src.window_size = list(ui_x, ui_y) +/datum/tgui/Destroy() + user = null + src_object = null + return ..() + /** * public * * Open this UI (and initialize it with data). + * + * return bool - TRUE if a new pooled window is opened, FALSE in all other situations including if a new pooled window didn't open because one already exists. */ /datum/tgui/proc/open() if(!user.client) - return null + return FALSE if(window) - return null + return FALSE process_status() if(status < UI_UPDATE) - return null + return FALSE window = SStgui.request_pooled_window(user) if(!window) - return null + return FALSE opened_at = world.time window.acquire_lock(src) if(!window.is_ready()) @@ -94,6 +103,8 @@ window.send_message("ping") var/flush_queue = window.send_asset(get_asset_datum( /datum/asset/simple/namespaced/fontawesome)) + flush_queue |= window.send_asset(get_asset_datum( + /datum/asset/simple/namespaced/tgfont)) for(var/datum/asset/asset in src_object.ui_assets(user)) flush_queue |= window.send_asset(asset) if (flush_queue) @@ -103,6 +114,8 @@ with_static_data = TRUE)) SStgui.on_open(src) + return TRUE + /** * public * @@ -122,7 +135,7 @@ // the error message properly. window.release_lock() window.close(can_be_suspended) - src_object.ui_close(user) + src_object.ui_close(user, src) //Bee edit: ui_close now sends the tgui closed. SStgui.on_close(src) state = null qdel(src) @@ -158,7 +171,7 @@ */ /datum/tgui/proc/send_asset(datum/asset/asset) if(!window) - CRASH("send_asset() can only be called after open().") + CRASH("send_asset() was called either without calling open() first or when open() did not return TRUE.") return window.send_asset(asset) /** @@ -239,7 +252,7 @@ * Run an update cycle for this UI. Called internally by SStgui * every second or so. */ -/datum/tgui/process(force = FALSE) +/datum/tgui/process(delta_time, force = FALSE) if(closing) return var/datum/host = src_object.ui_host(user) @@ -256,17 +269,18 @@ + "world.time: [world.time]") close(can_be_suspended = FALSE) return + // Update through a normal call to ui_interact + if(status != UI_DISABLED && (autoupdate || force || src_object.ui_requires_update(user, src))) + needs_update = FALSE + src_object.ui_interact(user, src) + return // Update status only - var/needs_update = process_status() + var/requires_update = process_status() if(status <= UI_CLOSE) close() return - if(needs_update) + if(requires_update) window.send_message("update", get_payload()) - // Update through a normal call to ui_interact - if(status != UI_DISABLED && (autoupdate || force)) - src_object.ui_interact(user, src) - return /** * private diff --git a/code/modules/tgui/tgui_window.dm b/code/modules/tgui/tgui_window.dm index b511fe4057807..8a98348628752 100644 --- a/code/modules/tgui/tgui_window.dm +++ b/code/modules/tgui/tgui_window.dm @@ -69,29 +69,30 @@ // Generate page html var/html = SStgui.basehtml html = replacetextEx(html, "\[tgui:windowId]", id) - // Process inline assets - var/inline_styles = "" - var/inline_scripts = "" + // Inject inline assets + var/inline_assets_str = "" for(var/datum/asset/asset in inline_assets) var/mappings = asset.get_url_mappings() for(var/name in mappings) var/url = mappings[name] - // Not urlencoding since asset strings are considered safe + // Not encoding since asset strings are considered safe if(copytext(name, -4) == ".css") - inline_styles += "\n" + inline_assets_str += "Byond.loadCss('[url]', true);\n" else if(copytext(name, -3) == ".js") - inline_scripts += "\n" + inline_assets_str += "Byond.loadJs('[url]', true);\n" asset.send(client) - html = replacetextEx(html, "\n", inline_styles) - html = replacetextEx(html, "\n", inline_scripts) + if(length(inline_assets_str)) + inline_assets_str = "\n" + html = replacetextEx(html, "\n", inline_assets_str) // Inject custom HTML html = replacetextEx(html, "\n", inline_html) // Open the window client << browse(html, "window=[id];[options]") - // Instruct the client to signal UI when the window is closed. - winset(client, id, "on-close=\"uiclose [id]\"") // Detect whether the control is a browser is_browser = winexists(client, id) == "BROWSER" + // Instruct the client to signal UI when the window is closed. + if(!is_browser) + winset(client, id, "on-close=\"uiclose [id]\"") /** * public @@ -251,7 +252,7 @@ if(istype(asset, /datum/asset/spritesheet)) var/datum/asset/spritesheet/spritesheet = asset send_message("asset/stylesheet", spritesheet.css_filename()) - send_message("asset/mappings", asset.get_url_mappings()) + send_raw_message(asset.get_serialized_url_mappings()) /** * private diff --git a/code/modules/tgui_panel/external.dm b/code/modules/tgui_panel/external.dm index 3257407e9cb7a..ba7720ccd3144 100644 --- a/code/modules/tgui_panel/external.dm +++ b/code/modules/tgui_panel/external.dm @@ -8,46 +8,29 @@ /** * tgui panel / chat troubleshooting verb */ -/client/verb/fix_chat() +/client/verb/fix_tgui_panel() set name = "Fix chat" set category = "OOC" var/action - log_tgui(src, "tgui_panel: Started fixing.") - // Not initialized - if(!tgui_panel || !istype(tgui_panel)) - log_tgui(src, "tgui_panel: datum is missing") - action = alert(src, "tgui panel was not initialized!\nSet it up again?", "", "OK", "Cancel") - if(action != "OK") - return - tgui_panel = new(src) - tgui_panel.initialize() - action = alert(src, "Wait a bit and tell me if it's fixed", "", "Fixed", "Nope") - if(action == "Fixed") - log_tgui(src, "tgui_panel: Fixed by calling 'new' + 'initialize'") - return - // Not ready - if(!tgui_panel?.is_ready()) - log_tgui(src, "tgui_panel: not ready") - action = alert(src, "tgui panel looks like it's waiting for something.\nSend it a ping?", "", "OK", "Cancel") - if(action != "OK") - return - tgui_panel.window.send_message("ping", force = TRUE) - action = alert(src, "Wait a bit and tell me if it's fixed", "", "Fixed", "Nope") - if(action == "Fixed") - log_tgui(src, "tgui_panel: Fixed by sending a ping") - return - // Catch all solution - action = alert(src, "Looks like tgui panel was already setup, but we can always try again.\nSet it up again?", "", "OK", "Cancel") - if(action != "OK") - return - tgui_panel.initialize(force = TRUE) - action = alert(src, "Wait a bit and tell me if it's fixed", "", "Fixed", "Nope") - if(action == "Fixed") - log_tgui(src, "tgui_panel: Fixed by calling 'initialize'") - return + log_tgui(src, "Started fixing.") + + nuke_chat() + // Failed to fix - action = alert(src, "Welp, I'm all out of ideas. Try closing BYOND and reconnecting.\nWe could also disable tgui_panel and re-enable the old UI", "", "Thanks anyways", "Switch to old UI") - if (action == "Switch to old UI") + action = alert(src, "Did that work?", "", "Yes", "No, switch to old ui") + if (action == "No, switch to old ui") winset(src, "output", "on-show=&is-disabled=0&is-visible=1") winset(src, "browseroutput", "is-disabled=1;is-visible=0") - log_tgui(src, "tgui_panel: Failed to fix.") + log_tgui(src, "Failed to fix.") + +/client/proc/nuke_chat() + // Catch all solution (kick the whole thing in the pants) + winset(src, "output", "on-show=&is-disabled=0&is-visible=1") + winset(src, "browseroutput", "is-disabled=1;is-visible=0") + if(!tgui_panel || !istype(tgui_panel)) + log_tgui(src, "tgui_panel datum is missing") + tgui_panel = new(src) + tgui_panel.initialize(force = TRUE) + // Force show the panel to see if there are any errors + winset(src, "output", "is-disabled=1&is-visible=0") + winset(src, "browseroutput", "is-disabled=0;is-visible=1") diff --git a/code/modules/tgui_panel/stat.dm b/code/modules/tgui_panel/stat.dm new file mode 100644 index 0000000000000..1940745e10bbc --- /dev/null +++ b/code/modules/tgui_panel/stat.dm @@ -0,0 +1,176 @@ +/** + * private + * + * Handles incomming stat messages + */ +/datum/tgui_panel/proc/handle_stat_message(type, payload) + switch(type) + if("stat/setTab") + client.selected_stat_tab = payload["selectedTab"] + //Update the panel they are on + client.mob?.UpdateMobStat(TRUE) + client.mob?.stat_tab_changed() + return TRUE + if("stat/pressed") + client.mob?.stat_pressed(payload["action_id"], payload["params"]) + client.mob?.UpdateMobStat(TRUE) + return TRUE + return FALSE + +/** + * public + * + * Sets the different available tabs. + */ +/datum/tgui_panel/proc/set_tab_info(payload) + window.send_message("stat/setStatTabs", payload) + +/** + * public + * + * Sends TGUI the data of every single verb accessable to client. + */ +/datum/tgui_panel/proc/set_verb_infomation(client/C) + var/list/tab_names = C?.mob?.get_all_verbs() + if(!tab_names) + return + var/list/payload = list() + for(var/tab_name in tab_names) + var/list/procpaths = tab_names[tab_name] + payload[tab_name] = list() + for(var/procpath/PP as() in procpaths) + payload[tab_name]["[PP.name]"] = list( + action = "verb", + params = list("verb" = PP.name), + type = STAT_VERB, + ) + window.send_message("stat/setVerbInfomation", payload) + +/** + * public + * + * Adds the provided verbs to the respective stat tabs. + * list( + * "Panel To Add To" = list("Verb1", "Verb3", "Verb4") , + * ) + */ +/datum/tgui_panel/proc/add_verbs(list/new_verbs) + var/list/payload = new_verbs + window.send_message("stat/addVerbs", payload) + +/** + * public + * + * Removes the provided verbs from the respective stat tabs. + * list( + * "Panel Name " = list("Verb 2 remove", "Verb 3 remove", etc..), + * etc.. + * ) + */ +/datum/tgui_panel/proc/remove_verbs(list/new_verbs) + var/list/payload = new_verbs + window.send_message("stat/removeVerbs", payload) + +/** + * public + * + * Sets the infomation to be displayed of the current tab. (For non verb tabs) + */ +/datum/tgui_panel/proc/set_panel_infomation(payload) + window.send_message("stat/setPanelInfomation", payload) + +/** + * public + * + * Sets the current tab. + */ +/datum/tgui_panel/proc/set_stat_tab(new_tab) + window.send_message("stat/setTab", new_tab) + +/** + * public + * + * Displays the antagonist popup. + */ +/datum/tgui_panel/proc/give_antagonist_popup(title, text) + if(!is_ready()) + return + var/list/payload = list() + payload["title"] = title + payload["text"] = text + window.send_message("stat/antagPopup", payload) + +/** + * public + * + * Clears the antagonist popup. + */ +/datum/tgui_panel/proc/clear_antagonist_popup() + if(!is_ready()) + return + window.send_message("stat/clearAntagPopup", list()) + +/** + * public + * + * Displays the dead message. + */ +/datum/tgui_panel/proc/give_dead_popup() + if(!is_ready()) + return + window.send_message("stat/deadPopup", list()) + + + +/** + * public + * + * Clears the death message + */ +/datum/tgui_panel/proc/clear_dead_popup() + if(!is_ready()) + return + window.send_message("stat/clearDeadPopup", list()) + +/** + * public + * + * Displays the dead message. + */ +/datum/tgui_panel/proc/give_alert_popup(title, text) + if(!is_ready()) + return + var/list/payload = list() + payload["title"] = title + payload["text"] = text + window.send_message("stat/alertPopup", payload) + +/** + * public + * + * Clears the death message + */ +/datum/tgui_panel/proc/clear_alert_popup() + if(!is_ready()) + return + window.send_message("stat/clearAlertPopup", list()) + +/** + * public + * + * Displays the message asking an admin to start battle royale + */ +/datum/tgui_panel/proc/give_br_popup() + if(!is_ready()) + return + window.send_message("stat/alertBr") + +/** + * public + * + * Clears the message asking an admin to start battle royale + */ +/datum/tgui_panel/proc/clear_br_popup() + if(!is_ready()) + return + window.send_message("stat/clearAlertBr", list()) diff --git a/code/modules/tgui_panel/telemetry.dm b/code/modules/tgui_panel/telemetry.dm index 79087d8500cbd..bb5de4c1e6c3b 100644 --- a/code/modules/tgui_panel/telemetry.dm +++ b/code/modules/tgui_panel/telemetry.dm @@ -3,16 +3,7 @@ * SPDX-License-Identifier: MIT */ -/** - * Maximum number of connection records allowed to analyze. - * Should match the value set in the browser. - */ -#define TGUI_TELEMETRY_MAX_CONNECTIONS 5 - -/** - * Maximum time allocated for sending a telemetry packet. - */ -#define TGUI_TELEMETRY_RESPONSE_WINDOW 30 SECONDS +/// Moved to _DEFINES/tgui.dm /// Time of telemetry request /datum/tgui_panel/var/telemetry_requested_at @@ -20,7 +11,10 @@ /datum/tgui_panel/var/telemetry_analyzed_at /// List of previous client connections /datum/tgui_panel/var/list/telemetry_connections - +/// Telemetry Status +/datum/tgui_panel/var/telemetry_status = TGUI_TELEMETRY_STAT_NOT_REQUESTED +/// Telemetry Notices +/datum/tgui_panel/var/list/telemetry_notices /** * private * @@ -29,6 +23,7 @@ /datum/tgui_panel/proc/request_telemetry() telemetry_requested_at = world.time telemetry_analyzed_at = null + telemetry_status = TGUI_TELEMETRY_STAT_AWAITING window.send_message("telemetry/request", list( "limits" = list( "connections" = TGUI_TELEMETRY_MAX_CONNECTIONS, @@ -43,13 +38,21 @@ * Is currently only useful for detecting ban evasion attempts. */ /datum/tgui_panel/proc/analyze_telemetry(payload) + if(telemetry_status == TGUI_TELEMETRY_STAT_OVERSEND) + return //Already noted for oversend, just fuck off. if(world.time > telemetry_requested_at + TGUI_TELEMETRY_RESPONSE_WINDOW) message_admins("[key_name(client)] sent telemetry outside of the allocated time window.") + if(telemetry_status == TGUI_TELEMETRY_STAT_ANALYZED) //Hey we already have a packet from you! + LAZYSET(telemetry_notices, "TELEM_OVERSEND", "OVER_SEND|Telemetry was sent multiple times.") + telemetry_status = TGUI_TELEMETRY_STAT_OVERSEND return if(telemetry_analyzed_at) message_admins("[key_name(client)] sent telemetry more than once.") + LAZYSET(telemetry_notices, "TELEM_OVERSEND", "OVER_SEND|Telemetry was sent multiple times.") + telemetry_status = TGUI_TELEMETRY_STAT_OVERSEND return telemetry_analyzed_at = world.time + telemetry_status = TGUI_TELEMETRY_STAT_ANALYZED if(!payload) return telemetry_connections = payload["connections"] @@ -60,21 +63,118 @@ message_admins("[key_name(client)] was kicked for sending a huge telemetry payload") qdel(client) return - var/list/found + if(len < TGUI_TELEMETRY_MAX_CONNECTIONS) + if(len < (TGUI_TELEMETRY_MAX_CONNECTIONS * 0.5)) + LAZYSET(telemetry_notices, "TELEMETRY_NONMAXCON", "TOO_SHORT|User only has ([len]) records. Data may be extremely unreliable.") + else + LAZYSET(telemetry_notices, "TELEMETRY_NONMAXCON", "UNDER_MAX|User has less than [TGUI_TELEMETRY_MAX_CONNECTIONS] entries in history ([len]).") + + //Process the data. + var/list/first_found_ban + var/list/all_ckeys + var/list/all_cids + var/list/all_ips + var/skipped_entries + var/has_dev_ip for(var/i in 1 to len) if(QDELETED(client)) // He got cleaned up before we were done return var/list/row = telemetry_connections[i] + // Check for guest keys, these objects are probably either banned by default or are "corrupt" (Missing an address). + if("guest[row["computer_id"]]" == row["ckey"]) + LAZYSET(telemetry_notices, "TELEM_GUEST_[i]", "CONN_ID:[i]|Entry is a guest user. This entry has been skipped.") + skipped_entries++ + LAZYADD(all_cids, row["computer_id"]) + continue // Check for a malformed history object - if (!row || row.len < 3 || (!row["ckey"] || !row["address"] || !row["computer_id"])) - return - if (world.IsBanned(row["ckey"], row["address"], row["computer_id"], real_bans_only = TRUE)) - found = row - break + if(!row || row.len < 3 || (!row["ckey"] || !row["address"] || !row["computer_id"])) + if(row && row["ckey"] && row["computer_id"]) //Is the address the only invalid field? + LAZYSET(telemetry_notices, "TELEM_NOADDR_[i]", "CONN_ID:[i]|Entry has no address. User may be a developer.") + LAZYADD(all_ckeys, row["ckey"]) + LAZYADD(all_ips, "127.0.0.1") + LAZYADD(all_cids, row["computer_id"]) + has_dev_ip = 1 + continue + LAZYSET(telemetry_notices, "TELEM_CORRUPT_[i]", "CONN_ID:[i]|Entry corrupt. Data may be damaged or tampered with.") + skipped_entries++ + continue + //Check for bans. + if(world.IsBanned(row["ckey"], row["address"], row["computer_id"], "tgui_telemetry", real_bans_only = TRUE)) + if(!first_found_ban) + first_found_ban = row + LAZYSET(telemetry_notices,"TELEM_BANNED_[i]", "CONN_ID:[i]|BANNED ACCOUNT IN HISTORY! Matched: [row["ckey"]], [row["address"]], [row["computer_id"]]") + //Check for protected CIDs + if(config.protected_cids.Find(row["computer_id"])) + LAZYSET(telemetry_notices, "TELEM_PROTECTED_[i]", "CONN_ID:[i]|[row["computer_id"]] is protected, Reason: [config.protected_cids[row["computer_id"]]]") + //Track changes. + LAZYADD(all_ckeys, row["ckey"]) + LAZYADD(all_ips, row["address"]) + LAZYADD(all_cids, row["computer_id"]) CHECK_TICK - // This fucker has a history of playing on a banned account. - if(found) - var/msg = "[key_name(client)] has a banned account in connection history! (Matched: [found["ckey"]], [found["address"]], [found["computer_id"]])" + // At least one ban + //Subtract the amount of skipped entries from len to account for possibly corrupt data + len -= skipped_entries + if(first_found_ban) + var/msg = "[key_name(client)] has a banned account in connection history! (Matched: [first_found_ban["ckey"]], [first_found_ban["address"]], [first_found_ban["computer_id"]])" message_admins(msg) log_admin_private(msg) + all_ckeys = uniqueList(all_ckeys) + all_ips = uniqueList(all_ips) + all_cids = uniqueList(all_cids) + switch(length(all_ckeys)) + if(2) + LAZYSET(telemetry_notices, TGUI_TELEM_CKEY_WARNING, "KEY_COUNT|User has more than one CKEY in history.") + if(3 to INFINITY) + if(length(all_ckeys) == len) + LAZYSET(telemetry_notices, TGUI_TELEM_CKEY_WARNING, "KEY_COUNT|EVERY ENTRY IN HISTORY HAS A DIFFERENT CKEY!") + else + LAZYSET(telemetry_notices, TGUI_TELEM_CKEY_WARNING, "KEY_COUNT|User has multiple CKEYs in history!") + if(telemetry_notices?[TGUI_TELEM_CKEY_WARNING]) //Has a CKEY warning + var/text_list_ckeys = "" + var/first = 1 + for(var/entry in all_ckeys) + text_list_ckeys += "[first ? null : ","][entry]" + first = 0 + LAZYSET(telemetry_notices, "TGUI_CKEY_LIST", "ALL_CKEYS|[text_list_ckeys]") + switch(length(all_ips)) + if(2) + if(!has_dev_ip) //If it's a dev IP we don't care. + LAZYSET(telemetry_notices, TGUI_TELEM_IP_WARNING, "IPA_COUNT|User has changed IPs at least once.") + if(3 to INFINITY) + if(length(all_ips) == len) + LAZYSET(telemetry_notices, TGUI_TELEM_IP_WARNING, "IPA_COUNT|All IPs different. VPN Likely.") + else + LAZYSET(telemetry_notices, TGUI_TELEM_IP_WARNING, "IPA_COUNT|User has changed IPs at least once.") + switch(length(all_cids)) + if(2) + LAZYSET(telemetry_notices, TGUI_TELEM_CID_WARNING, "CID_COUNT|User has changed CIDs once.") + if(3 to INFINITY) + if(length(all_cids) == len) + LAZYSET(telemetry_notices, TGUI_TELEM_CID_WARNING, "CID_COUNT|EVERY ENTRY IN HISTORY HAS A DIFFERENT CID!") + else + LAZYSET(telemetry_notices, TGUI_TELEM_CID_WARNING, "CID_COUNT|User has more than two CIDs in history.") + +/// Render the stats to PP +/datum/tgui_panel/proc/show_notices() + //Yes this code was in fact just dragged out and thrown in a different file. + . += "
      Telemetry Status:" + switch(telemetry_status) + if(TGUI_TELEMETRY_STAT_NOT_REQUESTED) + . += "Telemetry Request Not Sent. Call a coder." + if(TGUI_TELEMETRY_STAT_AWAITING) + . += "Telemetry Awaiting." + if(TGUI_TELEMETRY_STAT_ANALYZED, TGUI_TELEMETRY_STAT_OVERSEND) + . += "Analyzed Successfully." + . += "
      Telemetry Alerts:" + if(!length(telemetry_notices)) + . += "No Alerts." + return + . += "
        " + for(var/notice in telemetry_notices) + . += "
      • [telemetry_notices[notice]]
      • " + . += "
    " + if(TGUI_TELEMETRY_STAT_MISSING) + . += "Telemetry Data Missing!" + else + . += "Telemetry datum in invalid state ID [isnum(telemetry_status) ? telemetry_status : "!!NAN!!, CALL A CODER"]. Call a coder." diff --git a/code/modules/tgui_panel/tgui_panel.dm b/code/modules/tgui_panel/tgui_panel.dm index fb6afac13c7d1..4449edf61a595 100644 --- a/code/modules/tgui_panel/tgui_panel.dm +++ b/code/modules/tgui_panel/tgui_panel.dm @@ -37,6 +37,9 @@ * Initializes tgui panel. */ /datum/tgui_panel/proc/initialize(force = FALSE) + set waitfor = FALSE + // Minimal sleep to defer initialization to after client constructor + sleep(1) initialized_at = world.time // Perform a clean initialization window.initialize(inline_assets = list( @@ -44,8 +47,17 @@ get_asset_datum(/datum/asset/simple/tgui_panel), )) window.send_asset(get_asset_datum(/datum/asset/simple/namespaced/fontawesome)) + window.send_asset(get_asset_datum(/datum/asset/simple/namespaced/tgfont)) window.send_asset(get_asset_datum(/datum/asset/spritesheet/chat)) + // Preload assets for /datum/tgui + var/datum/asset/asset_tgui = get_asset_datum(/datum/asset/simple/tgui) + var/flush_queue = asset_tgui.send(src.client) + if(flush_queue) + src.client.browse_queue_flush() + // Other setup request_telemetry() + // Send verbs + set_verb_infomation(client) addtimer(CALLBACK(src, .proc/on_initialize_timed_out), 5 SECONDS) /** @@ -55,7 +67,9 @@ */ /datum/tgui_panel/proc/on_initialize_timed_out() // Currently does nothing but sending a message to old chat. - SEND_TEXT(client, "Failed to load fancy chat, reverting to old chat. Certain features won't work.") + SEND_TEXT(client, "Failed to load fancy chat, click HERE to attempt to reload it.") + log_tgui("ERROR: [client?.ckey] failed to load their fancy chat after a 5 second timeout when loading.") + SEND_TEXT(client, "If the problem persists after fix-chat, try restarting your game as Byond can get confused if the stylesheet it was expecting has changed. (If you have recently played on a server not using TGchat).") /** * private @@ -85,6 +99,8 @@ if(type == "telemetry") analyze_telemetry(payload) return TRUE + if(cmptext(copytext(type, 1, 5), "stat")) + return handle_stat_message(type, payload) /** * public diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index a4012a3532726..fbc10b510fc6a 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -13,7 +13,7 @@ Configuration: Usage: - Define mouse event procs on your (probably HUD) object and simply call the show and hide procs respectively: - /obj/screen/hud + /atom/movable/screen/hud MouseEntered(location, control, params) usr.client.tooltip.show(params, title = src.name, content = src.desc) diff --git a/code/modules/turbolift/turbolift_areas.dm b/code/modules/turbolift/turbolift_areas.dm index 83fb464226555..903275d320725 100644 --- a/code/modules/turbolift/turbolift_areas.dm +++ b/code/modules/turbolift/turbolift_areas.dm @@ -1,11 +1,11 @@ /area/shuttle/turbolift //Only use subtypes of this area requires_power = FALSE //no APCS in the lifts please - ambient_effects = list('sound/effects/turbolift/elevatormusic.ogg') + ambientsounds = list('sound/effects/turbolift/elevatormusic.ogg') /area/shuttle/turbolift/shaft //What the shuttle leaves behind name = "turbolift shaft" requires_power = TRUE - ambient_effects = MAINTENANCE + ambience_index = AMBIENCE_MAINT /area/shuttle/turbolift/primary name = "primary turbolift" diff --git a/code/modules/turbolift/turbolift_machines.dm b/code/modules/turbolift/turbolift_machines.dm index b2bf5a750886c..ffb3f614a8b2d 100644 --- a/code/modules/turbolift/turbolift_machines.dm +++ b/code/modules/turbolift/turbolift_machines.dm @@ -83,12 +83,14 @@ GLOBAL_LIST_EMPTY(turbolifts) if(locked) return locked = TRUE + wires.ui_update() update_icon() /obj/machinery/door/airlock/turbolift/unbolt() if(!locked) return locked = FALSE + wires.ui_update() update_icon() /obj/machinery/door/airlock/turbolift/Initialize() @@ -277,14 +279,14 @@ GLOBAL_LIST_EMPTY(turbolifts) var/obj/docking_port/stationary/turbolift/dest = SSshuttle.getDock(destID) if(!dest) - warning("This code shouldnt ever run, a turbolift has attempted to go to a dock with id [destID] but none were found") + warning("This code shouldn't ever run, a turbolift has attempted to go to a dock with id [destID] but none were found") return //shouldnt ever get to this point but w/e if(dest.z == src.z) - return //this normally shouldnt run either but out of date interfaces might get here + return //this normally shouldn't run either but out of date interfaces might get here if(dest.id in destination_queue) - return //again shouldnt ever run but out of date interfaces + return //again shouldn't ever run but out of date interfaces destination_queue += dest.id . = TRUE //we have an update now @@ -301,3 +303,4 @@ GLOBAL_LIST_EMPTY(turbolifts) if(!ui) ui = new(user, src, "TurboLift") ui.open() + ui.set_autoupdate(TRUE) diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index a0352db0dddc7..39e97ddba52ae 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -1,14 +1,56 @@ //include unit test files in this module in this ifdef //Keep this sorted alphabetically -#ifdef UNIT_TESTS +#if defined(UNIT_TESTS) || defined(SPACEMAN_DMM) + +/// Asserts that a condition is true +/// If the condition is not true, fails the test +#define TEST_ASSERT(assertion, reason) if (!(assertion)) { return Fail("Assertion failed: [reason || "No reason"]") } + +/// Asserts that the two parameters passed are equal, fails otherwise +/// Optionally allows an additional message in the case of a failure +#define TEST_ASSERT_EQUAL(a, b, message) do { \ + var/lhs = ##a; \ + var/rhs = ##b; \ + if (lhs != rhs) { \ + return Fail("Expected [isnull(lhs) ? "null" : lhs] to be equal to [isnull(rhs) ? "null" : rhs].[message ? " [message]" : ""]"); \ + } \ +} while (FALSE) + +/// Asserts that the two parameters passed are not equal, fails otherwise +/// Optionally allows an additional message in the case of a failure +#define TEST_ASSERT_NOTEQUAL(a, b, message) do { \ + var/lhs = ##a; \ + var/rhs = ##b; \ + if (lhs == rhs) { \ + return Fail("Expected [isnull(lhs) ? "null" : lhs] to not be equal to [isnull(rhs) ? "null" : rhs].[message ? " [message]" : ""]"); \ + } \ +} while (FALSE) + +/// *Only* run the test provided within the parentheses +/// This is useful for debugging when you want to reduce noise, but should never be pushed +/// Intended to be used in the manner of `TEST_FOCUS(/datum/unit_test/math)` +#define TEST_FOCUS(test_path) ##test_path { focus = TRUE; } + +/// A trait source when adding traits through unit tests +#define TRAIT_SOURCE_UNIT_TESTS "unit_tests" + #include "anchored_mobs.dm" #include "component_tests.dm" +#include "dynamic_ruleset_sanity.dm" #include "reagent_id_typos.dm" #include "reagent_recipe_collisions.dm" #include "spawn_humans.dm" #include "species_whitelists.dm" #include "subsystem_init.dm" +#include "subsystem_metric_sanity.dm" +#include "tgui_create_message.dm" #include "timer_sanity.dm" #include "unit_test.dm" +#include "random_ruin_mapsize.dm" + +#undef TEST_ASSERT +#undef TEST_ASSERT_EQUAL +#undef TEST_ASSERT_NOTEQUAL +#undef TEST_FOCUS #endif diff --git a/code/modules/unit_tests/dynamic_ruleset_sanity.dm b/code/modules/unit_tests/dynamic_ruleset_sanity.dm new file mode 100644 index 0000000000000..9fff5daf9b241 --- /dev/null +++ b/code/modules/unit_tests/dynamic_ruleset_sanity.dm @@ -0,0 +1,14 @@ +/// Verifies that roundstart dynamic rulesets are setup properly without external configuration. +/datum/unit_test/dynamic_roundstart_ruleset_sanity + +/datum/unit_test/dynamic_roundstart_ruleset_sanity/Run() + for (var/_ruleset in subtypesof(/datum/dynamic_ruleset/roundstart)) + var/datum/dynamic_ruleset/roundstart/ruleset = _ruleset + + var/has_scaling_cost = initial(ruleset.scaling_cost) + var/is_lone = initial(ruleset.flags) & (LONE_RULESET | HIGH_IMPACT_RULESET) + + if (has_scaling_cost && is_lone) + Fail("[ruleset] has a scaling_cost, but is also a lone/highlander ruleset.") + else if (!has_scaling_cost && !is_lone) + Fail("[ruleset] has no scaling cost, but is also not a lone/highlander ruleset.") diff --git a/code/modules/unit_tests/random_ruin_mapsize.dm b/code/modules/unit_tests/random_ruin_mapsize.dm new file mode 100644 index 0000000000000..4a57c4081d4a5 --- /dev/null +++ b/code/modules/unit_tests/random_ruin_mapsize.dm @@ -0,0 +1,12 @@ +/// Verifies that roundstart dynamic rulesets are setup properly without external configuration. +/datum/unit_test/random_ruin_mapsize + +/datum/unit_test/random_ruin_mapsize/Run() + load_ruin_parts() + if(!length(GLOB.loaded_ruin_parts)) + Fail("Ruin maps failed to load") + for(var/datum/map_template/ruin_part/part in GLOB.loaded_ruin_parts) + if((part.width - 1) % 4 != 0) + Fail("Ruin [part.file_name] width is not of size 4N+1") + if((part.height - 1) % 4 != 0) + Fail("Ruin [part.file_name] height is not of size 4N+1") diff --git a/code/modules/unit_tests/subsystem_metric_sanity.dm b/code/modules/unit_tests/subsystem_metric_sanity.dm new file mode 100644 index 0000000000000..44e375b7535b1 --- /dev/null +++ b/code/modules/unit_tests/subsystem_metric_sanity.dm @@ -0,0 +1,22 @@ +// Unit test to ensure SS metrics are valid +/datum/unit_test/subsystem_metric_sanity/Run() + for(var/datum/controller/subsystem/SS in Master.subsystems) + if(SS.ss_id == initial(SS.ss_id)) // initial() works here because ss_id is set at runtime during /New() + Fail("[SS.type] has no SS ID, somehow!") + continue + var/list/data = SS.get_metrics() + if(length(data) != 3) + Fail("SS[SS.ss_id] has invalid metrics data!") + continue + if(isnull(data["cost"])) + Fail("SS[SS.ss_id] has invalid metrics data! No 'cost' found in [json_encode(data)]") + continue + if(isnull(data["tick_usage"])) + Fail("SS[SS.ss_id] has invalid metrics data! No 'tick_usage' found in [json_encode(data)]") + continue + if(isnull(data["custom"])) + Fail("SS[SS.ss_id] has invalid metrics data! No 'custom' found in [json_encode(data)]") + continue + if(!islist(data["custom"])) + Fail("SS[SS.ss_id] has invalid metrics data! 'custom' is not a list in [json_encode(data)]") + continue diff --git a/code/modules/unit_tests/tgui_create_message.dm b/code/modules/unit_tests/tgui_create_message.dm new file mode 100644 index 0000000000000..4d5a4bc0a0263 --- /dev/null +++ b/code/modules/unit_tests/tgui_create_message.dm @@ -0,0 +1,28 @@ +/// Test that `TGUI_CREATE_MESSAGE` is correctly implemented +/datum/unit_test/tgui_create_message + +/datum/unit_test/tgui_create_message/Run() + var/type = "something/here" + var/list/payload = list( + "name" = "Terry McTider", + "heads_caved" = 100, + "accomplishments" = list( + "nothing", + "literally nothing", + list( + "something" = "just kidding", + ), + ), + ) + + var/message = TGUI_CREATE_MESSAGE(type, payload) + + // Ensure consistent output to compare by performing a round-trip. + var/output = json_encode(json_decode(url_decode(message))) + + var/expected = json_encode(list( + "type" = type, + "payload" = payload, + )) + + TEST_ASSERT_EQUAL(expected, output, "TGUI_CREATE_MESSAGE didn't round trip properly") diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm index 524895ce7314a..a50313adf73df 100644 --- a/code/modules/uplink/uplink_devices.dm +++ b/code/modules/uplink/uplink_devices.dm @@ -30,6 +30,7 @@ . = ..() var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) hidden_uplink.name = "debug uplink" + hidden_uplink.debug = TRUE /obj/item/uplink/incursion/Initialize(mapload, owner, tc_amount = 20) . = ..() @@ -50,6 +51,7 @@ var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) hidden_uplink.set_gamemode(/datum/game_mode/nuclear) hidden_uplink.name = "debug nuclear uplink" + hidden_uplink.debug = TRUE /obj/item/uplink/nuclear_restricted/Initialize() . = ..() diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 65b16352c9b43..3db41d4f65216 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -25,8 +25,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) if(!filtered_uplink_items[I.category]) filtered_uplink_items[I.category] = list() filtered_uplink_items[I.category][I.name] = I - if(I.limited_stock < 0 && !I.cant_discount && I.item && I.cost > 1) + if(I.limited_stock < 0 && !I.cant_discount && I.item) sale_items += I + if(allow_sales) var/datum/team/nuclear/nuclear_team if (gamemode == /datum/game_mode/nuclear) // uplink code kind of needs a redesign @@ -63,20 +64,47 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) for (var/i in 1 to num) var/datum/uplink_item/I = pick_n_take(sale_items) var/datum/uplink_item/A = new I.type - var/discount = A.get_discount() var/list/disclaimer = list("Void where prohibited.", "Not recommended for children.", "Contains small parts.", "Check local laws for legality in region.", "Do not taunt.", "Not responsible for direct, indirect, incidental or consequential damages resulting from any defect, error or failure to perform.", "Keep away from fire or flames.", "Product is provided \"as is\" without any implied or expressed warranties.", "As seen on TV.", "For recreational use only.", "Use only as directed.", "16% sales tax will be charged for orders originating within Space Nebraska.") A.limited_stock = limited_stock + A.category = category_name I.refundable = FALSE //THIS MAN USES ONE WEIRD TRICK TO GAIN FREE TC, CODERS HATES HIM! A.refundable = FALSE - if(A.cost >= 20) //Tough love for nuke ops - discount *= 0.5 - A.category = category_name - A.cost = max(round(A.cost * discount),1) - A.name += " ([round(((initial(A.cost)-A.cost)/initial(A.cost))*100)]% off!)" - A.desc += " Normally costs [initial(A.cost)] TC. All sales final. [pick(disclaimer)]" + switch(rand(1, 5)) + if(1 to 3 || A.cost == 1) + if(A.cost <= 3) + //Bulk discount + var/count = rand(3,7) + var/discount = A.get_discount() + A.name += " (Bulk discount - [count] for [((1-discount)*100)]% off!)" + A.cost = max(round(A.cost*count*discount), 1) + A.desc += " Normally costs [initial(A.cost)*count] TC. All sales final. [pick(disclaimer)]" + A.spawn_amount = count + else + //X% off! + var/discount = A.get_discount() + if(A.cost >= 20) //Tough love for nuke ops + discount *= 0.5 + A.cost = max(round(A.cost * discount), 1) + A.name += " ([round(((initial(A.cost)-A.cost)/initial(A.cost))*100)]% off!)" + A.desc += " Normally costs [initial(A.cost)] TC. All sales final. [pick(disclaimer)]" + if(4) + //Buy 1 get 1 free! + A.name += " (Buy 1 get 1 free!)" + A.desc += " Obtain 2 for the price of 1. All sales final. [pick(disclaimer)]" + A.spawn_amount = 2 + if(5) + //Get 2 items with their combined price reduced. + var/datum/uplink_item/second_I = pick_n_take(sale_items) + var/total_cost = second_I.cost + I.cost + var/discount = A.get_discount() + var/final_cost = max(round(total_cost * discount), 1) + //Setup the item + A.cost = final_cost + A.name += " + [second_I.name] (Discounted Bundle - [100-(round((final_cost / total_cost)*100))]% off!)" + A.desc += " Also contains [second_I.name]. Normally costs [total_cost] TC when bought together. All sales final. [pick(disclaimer)]" + A.bonus_items = list(second_I.item) A.discounted = TRUE A.item = I.item - uplink_items[category_name][A.name] = A @@ -96,7 +124,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) var/refund_amount = 0 // specified refund amount in case there needs to be a TC penalty for refunds. var/refundable = FALSE var/surplus = 100 // Chance of being included in the surplus crate. - var/surplus_nullcrates //Chance of being included in null crates. null = pull from surplus var/cant_discount = FALSE var/limited_stock = -1 //Setting this above zero limits how many times this item can be bought by the same traitor in a round, -1 is unlimited var/list/include_modes = list() // Game modes to allow this item in. @@ -108,19 +135,24 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) var/list/restricted_species //Limits items to a specific species. Hopefully. var/illegal_tech = TRUE // Can this item be deconstructed to unlock certain techweb research nodes? var/discounted = FALSE - -/datum/uplink_item/New() - . = ..() - if(isnull(surplus_nullcrates)) - surplus_nullcrates = surplus + var/spawn_amount = 1 //How many times we should run the spawn + var/bonus_items = null //Bonus items you gain if you purchase it /datum/uplink_item/proc/get_discount() return pick(4;0.75,2;0.5,1;0.25) /datum/uplink_item/proc/purchase(mob/user, datum/component/uplink/U) - var/atom/A = spawn_item(item, user, U) - if(purchase_log_vis && U.purchase_log) - U.purchase_log.LogPurchase(A, src, cost) + //Spawn base items + for(var/i in 1 to spawn_amount) + var/atom/A = spawn_item(item, user, U) + if(purchase_log_vis && U.purchase_log) + U.purchase_log.LogPurchase(A, src, cost) + //Spawn bonust items + if(islist(bonus_items)) + for(var/bonus in bonus_items) + var/atom/A = spawn_item(bonus, user, U) + if(purchase_log_vis && U.purchase_log) + U.purchase_log.LogPurchase(A, src, cost) /datum/uplink_item/proc/spawn_item(spawn_path, mob/user, datum/component/uplink/U) if(!spawn_path) @@ -130,11 +162,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) A = new spawn_path(get_turf(user)) else A = spawn_path - if(ishuman(user) && istype(A, /obj/item)) - var/mob/living/carbon/human/H = user - if(H.put_in_hands(A)) - to_chat(H, "[A] materializes into your hands!") - return A + if(istype(A, /obj/item)) + var/obj/item/I = A + I.item_flags |= ILLEGAL + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.put_in_hands(A)) + to_chat(H, "[A] materializes into your hands!") + return A to_chat(user, "[A] materializes onto the floor.") return A @@ -210,7 +245,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) you'll be granted your own contract uplink embedded within the supplied tablet computer. Additionally, you'll be granted \ standard contractor gear to help with your mission - comes supplied with the tablet, specialised space suit, chameleon jumpsuit and mask, \ agent card, specialised contractor baton, and three randomly selected low cost items. Can include otherwise unobtainable items." - item = /obj/item/storage/box/syndicate/contract_kit + item = /obj/item/storage/box/syndie_kit/contract_kit cost = 20 player_minimum = 15 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops, /datum/game_mode/incursion) @@ -220,15 +255,15 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) desc = "Syndicate Bundles, also known as Syndi-Kits, are specialized groups of items that arrive in a plain box. \ These items are collectively worth more than 20 telecrystals, but you do not know which specialization \ you will receive. May contain discontinued and/or exotic items." - item = /obj/item/storage/box/syndicate/bundle_A + item = /obj/item/storage/box/syndie_kit/bundle_A cost = 20 exclude_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/bundles_TC/bundle_B name = "Syndi-kit Special" desc = "Syndicate Bundles, also known as Syndi-Kits, are specialized groups of items that arrive in a plain box. \ - In Syndi-kit Special, you will recieve items used by famous syndicate agents of the past. Collectively worth more than 20 telecrystals, the syndicate loves a good throwback." - item = /obj/item/storage/box/syndicate/bundle_B + In Syndi-kit Special, you will receive items used by famous syndicate agents of the past. Collectively worth more than 20 telecrystals, the syndicate loves a good throwback." + item = /obj/item/storage/box/syndie_kit/bundle_B cost = 20 exclude_modes = list(/datum/game_mode/nuclear) @@ -293,10 +328,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) to_chat(user, "You feel an overwhelming sense of pride and accomplishment.") var/obj/item/clothing/mask/joy/funny_mask = new(get_turf(user)) ADD_TRAIT(funny_mask, TRAIT_NODROP, CURSED_ITEM_TRAIT) - var/obj/item/I = user.get_item_by_slot(SLOT_WEAR_MASK) + var/obj/item/I = user.get_item_by_slot(ITEM_SLOT_MASK) if(I) user.dropItemToGround(I, TRUE) - user.equip_to_slot_if_possible(funny_mask, SLOT_WEAR_MASK) + user.equip_to_slot_if_possible(funny_mask, ITEM_SLOT_MASK) else if(index == 20) starting_crate_value = 200 print_command_report("Congratulations to [user] for being the [rand(4, 9)]th lucky winner of the syndicate lottery! \ @@ -404,7 +439,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /obj/item/pipe_dispenser = 2, /obj/item/storage/toolbox/syndicate = 2, /obj/item/storage/toolbox/electrical = 1, - /obj/item/circuitboard/computer/shuttle/docker = 1, /obj/item/circuitboard/computer/shuttle/flight_control = 1, /obj/item/circuitboard/machine/shuttle/engine/plasma = 2, /obj/item/circuitboard/machine/shuttle/heater = 2, @@ -483,6 +517,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) throwing weapons. The bolas can knock a target down and the shurikens will embed into limbs." item = /obj/item/storage/box/syndie_kit/throwing_weapons cost = 3 + illegal_tech = FALSE /datum/uplink_item/dangerous/shotgun name = "Bulldog Shotgun" @@ -505,7 +540,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/dangerous/superechainsaw name = "Super Energy Chainsaw" desc = "An incredibly deadly modified chainsaw with plasma-based energy blades instead of metal and a slick black-and-red finish. While it rips apart matter with extreme efficiency, it is heavy, large, and monstrously loud. It's blade has been enhanced to do even more damage and knock victims down briefly." - item = /obj/item/twohanded/required/chainsaw/energy/doom + item = /obj/item/chainsaw/energy/doom cost = 22 include_modes = list(/datum/game_mode/nuclear) @@ -513,7 +548,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) name = "Double-Bladed Energy Sword" desc = "The double-bladed energy sword does slightly more damage than a standard energy sword and will deflect \ all energy projectiles, but requires two hands to wield." - item = /obj/item/twohanded/dualsaber + item = /obj/item/dualsaber player_minimum = 25 cost = 18 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) @@ -546,6 +581,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 4 surplus = 40 include_modes = list(/datum/game_mode/nuclear) + illegal_tech = FALSE /datum/uplink_item/dangerous/rapid name = "Gloves of the North Star" @@ -560,7 +596,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/guardiancreator/tech cost = 18 surplus = 10 - surplus_nullcrates = 0 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) player_minimum = 25 restricted = TRUE @@ -579,7 +614,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) desc = "A fully-loaded, specialized three-round burst carbine that fires 5.56mm ammunition from a 30 round magazine \ with a toggleable 40mm underbarrel grenade launcher." item = /obj/item/gun/ballistic/automatic/m90 - cost = 18 + cost = 14 surplus = 50 include_modes = list(/datum/game_mode/nuclear) @@ -614,6 +649,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/gun/ballistic/rifle/boltaction cost = 2 include_modes = list(/datum/game_mode/nuclear) + illegal_tech = FALSE /datum/uplink_item/dangerous/revolver name = "Syndicate Revolver" @@ -725,7 +761,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 16 player_minimum = 20 surplus = 10 - surplus_nullcrates = 0 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops, /datum/game_mode/incursion) /datum/uplink_item/stealthy_weapons/radbow @@ -778,6 +813,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/box/syndie_kit/romerol cost = 25 cant_discount = TRUE + surplus = 0 /datum/uplink_item/stealthy_weapons/sleepy_pen name = "Sleepy Pen" @@ -808,6 +844,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/ammo_box/magazine/m10mm cost = 1 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) + illegal_tech = FALSE /datum/uplink_item/ammo/pistolap name = "10mm Armour Piercing Magazine" @@ -816,6 +853,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/ammo_box/magazine/m10mm/ap cost = 2 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) + illegal_tech = FALSE /datum/uplink_item/ammo/pistolhp name = "10mm Hollow Point Magazine" @@ -824,6 +862,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/ammo_box/magazine/m10mm/hp cost = 3 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) + illegal_tech = FALSE /datum/uplink_item/ammo/pistolfire name = "10mm Incendiary Magazine" @@ -832,10 +871,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/ammo_box/magazine/m10mm/fire cost = 2 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) + illegal_tech = FALSE /datum/uplink_item/ammo/shotgun cost = 2 include_modes = list(/datum/game_mode/nuclear) + illegal_tech = FALSE /datum/uplink_item/ammo/shotgun/bag name = "12g Ammo Duffel Bag" @@ -885,11 +926,11 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) illegal_tech = FALSE /datum/uplink_item/ammo/a40mm - name = "40mm Grenade" - desc = "A 40mm HE grenade for use with the M-90gl's under-barrel grenade launcher. \ + name = "40mm Grenade Box" + desc = "A box of 40mm HE grenades for use with the M-90gl's under-barrel grenade launcher. \ Your teammates will ask you to not shoot these down small hallways." - item = /obj/item/ammo_casing/a40mm - cost = 2 + item = /obj/item/ammo_box/a40mm + cost = 6 include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/smg/bag @@ -905,10 +946,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/ammo_box/magazine/smgm45 cost = 3 include_modes = list(/datum/game_mode/nuclear) + illegal_tech = FALSE /datum/uplink_item/ammo/sniper cost = 4 include_modes = list(/datum/game_mode/nuclear) + illegal_tech = FALSE /datum/uplink_item/ammo/sniper/basic name = ".50 Magazine" @@ -933,13 +976,15 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) desc = "An additional 30-round 5.56mm magazine; suitable for use with the M-90gl carbine. \ These bullets pack less punch than 7.12x82mm rounds, but they still offer more power than .45 ammo." item = /obj/item/ammo_box/magazine/m556 - cost = 4 + cost = 3 include_modes = list(/datum/game_mode/nuclear) + illegal_tech = FALSE /datum/uplink_item/ammo/machinegun cost = 6 surplus = 0 include_modes = list(/datum/game_mode/nuclear) + illegal_tech = FALSE /datum/uplink_item/ammo/machinegun/basic name = "7.12x82mm Box Magazine" @@ -966,6 +1011,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn." item = /obj/item/ammo_box/magazine/mm712x82/incen +/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/rocket include_modes = list(/datum/game_mode/nuclear) @@ -988,6 +1040,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/ammo_box/magazine/pistolm9mm cost = 2 include_modes = list(/datum/game_mode/nuclear) + illegal_tech = FALSE /datum/uplink_item/ammo/toydarts name = "Box of Riot Darts" @@ -1011,6 +1064,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/ammo_box/a762 cost = 1 include_modes = list(/datum/game_mode/nuclear) + illegal_tech = FALSE //Grenades and Explosives /datum/uplink_item/explosives @@ -1332,7 +1386,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) surplus = 0 include_modes = list(/datum/game_mode/nuclear/clown_ops) -datum/uplink_item/stealthy_tools/taeclowndo_shoes +/datum/uplink_item/stealthy_tools/taeclowndo_shoes name = "Tae-clown-do Shoes" desc = "A pair of shoes for the most elite agents of the honkmotherland. They grant the mastery of taeclowndo with some honk-fu moves as long as they're worn." cost = 12 @@ -1390,10 +1444,10 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes cost = 1 /datum/uplink_item/stealthy_tools/jammer - name = "Radio Jammer" - desc = "This device will disrupt any nearby outgoing radio communication when activated. Does not affect binary chat." + name = "Signal Jammer" + desc = "This device will disrupt any nearby outgoing wireless signals when activated." item = /obj/item/jammer - cost = 3 + cost = 5 /datum/uplink_item/stealthy_tools/smugglersatchel name = "Smuggler's Satchel" @@ -1402,6 +1456,7 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes item = /obj/item/storage/backpack/satchel/flat/with_tools cost = 1 surplus = 30 + illegal_tech = FALSE //Space Suits and Hardsuits /datum/uplink_item/suits @@ -1418,8 +1473,8 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes /datum/uplink_item/suits/hardsuit name = "Syndicate Hardsuit" - desc = "The feared suit of a Syndicate nuclear agent. Features slightly better armoring and a built in jetpack \ - that runs off standard atmospheric tanks. Toggling the suit in and out of \ + desc = "The feared suit of a Syndicate nuclear agent. Features slightly better armoring, a built in jetpack \ + that runs off standard atmospheric tanks and an advanced team location system. Toggling the suit in and out of \ combat mode will allow you all the mobility of a loose fitting uniform without sacrificing armoring. \ Additionally the suit is collapsible, making it small enough to fit within a backpack. \ Nanotrasen crew who spot these suits are known to panic." @@ -1427,6 +1482,19 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes cost = 7 exclude_modes = list(/datum/game_mode/nuclear) //you can't buy it in nuke, because the elite hardsuit costs the same while being better +/datum/uplink_item/suits/hardsuit/spawn_item(spawn_path, mob/user, datum/component/uplink/U) + var/obj/item/clothing/suit/space/hardsuit/suit = ..() + var/datum/component/tracking_beacon/beacon = suit.GetComponent(/datum/component/tracking_beacon) + var/datum/component/team_monitor/hud = suit.helmet.GetComponent(/datum/component/team_monitor) + + var/datum/antagonist/nukeop/nukie = is_nuclear_operative(user) + if(nukie?.nuke_team?.team_frequency) + if(hud) + hud.set_frequency(nukie.nuke_team.team_frequency) + if(beacon) + beacon.set_frequency(nukie.nuke_team.team_frequency) + return suit + /datum/uplink_item/suits/hardsuit/elite name = "Elite Syndicate Hardsuit" desc = "An upgraded, elite version of the Syndicate hardsuit. It features fireproofing, and also \ @@ -1476,6 +1544,27 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes surplus = 75 restricted = TRUE +/datum/uplink_item/device_tools/compressionkit + name = "Bluespace Compression Kit" + desc = "A modified version of a BSRPED that can be used to reduce the size of most items while retaining their original functions! \ + Does not work on storage items. \ + Recharge using bluespace crystals. \ + Comes with 5 charges." + item = /obj/item/compressionkit + cost = 5 + +/datum/uplink_item/device_tools/shuttlecapsule + name = "Bluespace Shuttle Capsule" + desc = "Need a mobile base of operations? Those pesky exploration crews keep flying off? Want to do a hit and run on security? Then this \ + product is for you! The all new bluespace shuttle capsule contains an ENTIRE shuttle withing a capsule you can hold in your hand! \ + The shuttle provided is a state-of-the-art ship complete with a hacked autolathe, syndicate toolbox, playing cards for those long journeys, \ + an in-built shuttle interdictor and a single canister of plasma to fuel your adventures! \ + This innovative shuttle can seat up to 4 passengers, willing or not! Shuttle must be deployed in space or on lavaland, space suits not included." + item = /obj/item/survivalcapsule/shuttle/traitor + cost = 8 + //You get your own shuttle + exclude_modes = list(/datum/game_mode/nuclear) + /datum/uplink_item/device_tools/magboots name = "Blood-Red Magboots" desc = "A pair of magnetic boots with a Syndicate paintjob that assist with freer movement in space or on-station \ @@ -1485,6 +1574,13 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes cost = 2 include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) +/datum/uplink_item/device_tools/brainwash_disk + name = "Brainwashing Surgery Program" + desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \ + Insert into an Operating Console to enable the procedure." + item = /obj/item/disk/surgery/brainwashing + cost = 5 + /datum/uplink_item/device_tools/briefcase_launchpad name = "Briefcase Launchpad" desc = "A briefcase containing a launchpad, a device able to teleport items and people to and from targets up to eight tiles away from the briefcase. \ @@ -1520,7 +1616,16 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes item = /obj/item/disk/nuclear/fake cost = 1 surplus = 1 - surplus_nullcrates = 0 + illegal_tech = FALSE + +/datum/uplink_item/device_tools/syndicate_teleporter + name = "Experimental Syndicate Teleporter" + desc = "The Syndicate teleporter is a handheld device that teleports the user 4-8 meters forward. \ + Beware, teleporting into a wall will make the teleporter do a parallel emergency teleport, \ + but if that emergency teleport fails, it will kill you instantly. \ + Has 4 charges, recharges automatically. Warranty voided if exposed to EMP." + item = /obj/item/storage/box/syndie_kit/teleporter + cost = 8 /datum/uplink_item/device_tools/frame name = "F.R.A.M.E. PDA Cartridge" @@ -1557,6 +1662,16 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes multitool and combat gloves that are resistant to shocks and heat." item = /obj/item/storage/toolbox/syndicate cost = 1 + illegal_tech = FALSE + +/datum/uplink_item/device_tools/syndie_glue + name = "Glue" + desc = "A cheap bottle of one use syndicate brand super glue. \ + Use on any item to make it undroppable. \ + Be careful not to glue an item you're already holding!" + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) + item = /obj/item/syndie_glue + cost = 2 /datum/uplink_item/device_tools/hacked_module name = "Hacked AI Law Upload Module" @@ -1571,31 +1686,6 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes item = /obj/item/assembly/flash/hypnotic cost = 7 -/datum/uplink_item/device_tools/compressionkit - name = "Bluespace Compression Kit" - desc = "A modified version of a BSRPED that can be used to reduce the size of most items while retaining their original functions! \ - Does not work on storage items. \ - Recharge using bluespace crystals. \ - Comes with 5 charges." - item = /obj/item/compressionkit - cost = 5 - -/datum/uplink_item/device_tools/syndie_glue - name = "Glue" - desc = "A cheap bottle of one use syndicate brand super glue. \ - Use on any item to make it undroppable. \ - Be careful not to glue an item you're already holding!" - exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) - item = /obj/item/syndie_glue - cost = 2 - -/datum/uplink_item/device_tools/brainwash_disk - name = "Brainwashing Surgery Program" - desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \ - Insert into an Operating Console to enable the procedure." - item = /obj/item/disk/surgery/brainwashing - cost = 5 - /datum/uplink_item/device_tools/medgun name = "Medbeam Gun" desc = "A wonder of Syndicate engineering, the Medbeam gun, or Medi-Gun enables a medic to keep his fellow \ @@ -1646,13 +1736,14 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes item = /obj/item/soap/syndie cost = 1 surplus = 50 + illegal_tech = FALSE /datum/uplink_item/device_tools/surgerybag name = "Syndicate Surgery Duffel Bag" desc = "The Syndicate surgery duffel bag is a toolkit containing all surgery tools, surgical drapes, \ a Syndicate brand MMI, a straitjacket, and a muzzle." item = /obj/item/storage/backpack/duffelbag/syndie/surgery - cost = 2 + cost = 3 /datum/uplink_item/device_tools/encryptionkey name = "Syndicate Encryption Key" @@ -1673,15 +1764,6 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes item = /obj/item/storage/book/bible/syndicate cost = 3 -/datum/uplink_item/device_tools/thermal - name = "Thermal Imaging Glasses" - desc = "These goggles can be turned to resemble common eyewear found throughout the station. \ - They allow you to see organisms through walls by capturing the upper portion of the infrared light spectrum, \ - emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms \ - and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks." - item = /obj/item/clothing/glasses/thermal/syndi - cost = 3 - /datum/uplink_item/device_tools/potion name = "Syndicate Sentience Potion" item = /obj/item/slimepotion/slime/sentience/nuclear @@ -1691,7 +1773,6 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) restricted = TRUE - /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.\ @@ -1700,6 +1781,15 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes restricted = TRUE cost = 8 +/datum/uplink_item/device_tools/thermal + name = "Thermal Imaging Glasses" + desc = "These goggles can be turned to resemble common eyewear found throughout the station. \ + They allow you to see organisms through walls by capturing the upper portion of the infrared light spectrum, \ + emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms \ + and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks." + item = /obj/item/clothing/glasses/thermal/syndi + cost = 3 + // Implants /datum/uplink_item/implants category = "Implants" @@ -1752,6 +1842,7 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes Used just like a regular headset, but can be disabled to use external headsets normally and to avoid detection." item = /obj/item/storage/box/syndie_kit/imp_radio cost = 4 + exclude_modes = list(/datum/game_mode/incursion) //To prevent traitors from immediately outing the hunters to security. restricted = TRUE /datum/uplink_item/implants/reviver @@ -1832,6 +1923,16 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes cost = 2 restricted_species = list("plasmaman") +/datum/uplink_item/race_restricted/tribal_claw + name = "Old Tribal Scroll" + desc = "We found this scroll in a abandoned lizard settlement of the Knoises clan. \ + It teaches you how to use your claws and tail to gain an advantage in combat, \ + don't buy this unless you are a lizard or plan to give it to one as only they can understand the ancient draconic words." + item = /obj/item/book/granter/martial/tribal_claw + cost = 14 + surplus = 0 + restricted_species = list("lizard") + // Role-specific items /datum/uplink_item/role_restricted category = "Role-Restricted" @@ -1894,9 +1995,16 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes of humanoids. It has two settings: intensity, which controls the power of the radiation, \ and wavelength, which controls the delay before the effect kicks in." item = /obj/item/healthanalyzer/rad_laser - restricted_roles = list("Medical Doctor", "Chief Medical Officer", "Roboticist", "Paramedic") + restricted_roles = list("Medical Doctor", "Chief Medical Officer", "Roboticist", "Paramedic", "Brig Physician") cost = 3 +/datum/uplink_item/role_restricted/syndicate_mmi + name = "Syndicate MMI" + desc = "An MMI which autmatically applies the Syndimov laws to any borg it is placed in. Great for adding known allies to assist you with a little more stealth than a fully emagged borg." + item = /obj/item/mmi/syndie + restricted_roles = list("Roboticist", "Research Director") + cost = 2 + /datum/uplink_item/role_restricted/upgrade_wand name = "Upgrade Wand" desc = "A powerful, single-use wand containing nanomachines that will calibrate the high-tech gadgets commonly employed by magicians to nearly double their potential." @@ -1904,6 +2012,13 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes restricted_roles = list("Stage Magician") cost = 5 +/datum/uplink_item/role_restricted/floorpill_bottle + name = "Bottle of Mystery Pills" + desc = "We found these lying around Warehouse R1O-GN, which was decommissioned years ago. We were going to throw them out but we heard you might be interested in them." + item = /obj/item/storage/pill_bottle/floorpill/full + restricted_roles = list("Assistant", "Debtor") + cost = 2 + /datum/uplink_item/role_restricted/clown_bomb name = "Clown Bomb" desc = "The Clown bomb is a hilarious device capable of massive pranks. It has an adjustable timer, \ @@ -1964,7 +2079,7 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes item = /obj/item/clothing/shoes/clown_shoes/taeclowndo restricted_roles = list("Clown") -datum/uplink_item/role_restricted/superior_honkrender +/datum/uplink_item/role_restricted/superior_honkrender name = "Superior Honkrender" desc = "An ancient artifact recovered from an ancient cave. Opens the way to the Dark Carnival" item = /obj/item/veilrender/honkrender @@ -1972,7 +2087,7 @@ datum/uplink_item/role_restricted/superior_honkrender restricted = TRUE restricted_roles = list("Clown", "Chaplain") -datum/uplink_item/role_restricted/superior_honkrender +/datum/uplink_item/role_restricted/superior_honkrender name = "Superior Honkrender" desc = "An ancient artifact recovered from -. Opens the way to TRANSMISSION OFFLINE\ All praise be to the honkmother" @@ -1999,6 +2114,20 @@ datum/uplink_item/role_restricted/superior_honkrender restricted_roles = list("Curator") limited_stock = 1 //please don't spam deadchat +/datum/uplink_item/role_restricted/voodoo + name = "Wicker Doll" + desc = "A wicker voodoo doll with a cavity for storing a small item. Once an item has been stored within it, the doll may be used to manipulate the actions of another person that has previously been in contact with the stored item." + item = /obj/item/voodoo + cost = 12 + restricted_roles = list("Curator", "Stage Magician") + +/datum/uplink_item/role_restricted/prison_cube + name = "Prison Cube" + desc = "A very strange artifact recovered from a volcanic planet that is useful for keeping people locked away, but not very useful for keeping their disappearance unknown" + item = /obj/item/prisoncube + cost = 6 + restricted_roles = list("Curator") + /datum/uplink_item/role_restricted/his_grace name = "His Grace" desc = "An incredibly dangerous weapon recovered from a station overcome by the grey tide. Once activated, He will thirst for blood and must be used to kill to sate that thirst. \ @@ -2008,7 +2137,7 @@ datum/uplink_item/role_restricted/superior_honkrender item = /obj/item/his_grace cost = 20 restricted_roles = list("Chaplain") - surplus = 5 //Very low chance to get it in a surplus crate even without being the chaplain + surplus = 0 /datum/uplink_item/role_restricted/cultconstructkit name = "Cult Construct Kit" @@ -2061,7 +2190,7 @@ datum/uplink_item/role_restricted/superior_honkrender /datum/uplink_item/role_restricted/echainsaw name = "Energy Chainsaw" desc = "An incredibly deadly modified chainsaw with plasma-based energy blades instead of metal and a slick black-and-red finish. While it rips apart matter with extreme efficiency, it is heavy, large, and monstrously loud." - item = /obj/item/twohanded/required/chainsaw/energy + item = /obj/item/chainsaw/energy cost = 10 player_minimum = 25 restricted_roles = list("Botanist", "Cook", "Bartender") @@ -2096,6 +2225,14 @@ datum/uplink_item/role_restricted/superior_honkrender restricted_roles = list("Mime") surplus = 0 +/datum/uplink_item/role_restricted/mimesabrekit + name = "Baguette blade bundle" + desc = "A very stealthy blade located inside an even stealthier baguette-shaped sheath." + cost = 12 + item = /obj/item/storage/box/syndie_kit/mimesabrekit + restricted_roles = list("Mime") + surplus = 5 + /datum/uplink_item/role_restricted/pressure_mod name = "Kinetic Accelerator Pressure Mod" desc = "A modification kit which allows Kinetic Accelerators to do greatly increased damage while indoors. \ @@ -2110,7 +2247,7 @@ datum/uplink_item/role_restricted/superior_honkrender desc = "An implant that grants you a deadly energy saw inside your arm. Comes with a syndicate autosurgeon for immediate self-application." cost = 8 item = /obj/item/autosurgeon/syndicate/esaw_arm - restricted_roles = list("Medical Doctor", "Chief Medical Officer", "Paramedic") + restricted_roles = list("Medical Doctor", "Chief Medical Officer", "Paramedic", "Brig Physician") /datum/uplink_item/role_restricted/magillitis_serum name = "Magillitis Serum Autoinjector" @@ -2194,6 +2331,7 @@ datum/uplink_item/role_restricted/superior_honkrender cost = 20 cant_discount = TRUE illegal_tech = FALSE + surplus = 0 /datum/uplink_item/badass/syndiebeer name = "Syndicate Beer" @@ -2211,6 +2349,7 @@ datum/uplink_item/role_restricted/superior_honkrender item = /obj/item/storage/secure/briefcase/syndie cost = 1 restricted = TRUE + illegal_tech = FALSE /datum/uplink_item/badass/syndiecards name = "Syndicate Playing Cards" @@ -2220,6 +2359,7 @@ datum/uplink_item/role_restricted/superior_honkrender item = /obj/item/toy/cards/deck/syndicate cost = 1 surplus = 40 + illegal_tech = FALSE /datum/uplink_item/badass/syndiecigs name = "Syndicate Smokes" @@ -2227,3 +2367,14 @@ datum/uplink_item/role_restricted/superior_honkrender item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate cost = 2 illegal_tech = FALSE + +/datum/uplink_item/implants/deathrattle + name = "Box of Deathrattle Implants" + desc = "A collection of implants (and one reusable implanter) that should be injected into the team. When one of the team \ + dies, all other implant holders recieve a mental message informing them of their teammates' name \ + and the location of their death. Unlike most implants, these are designed to be implanted \ + in any creature, biological or mechanical." + item = /obj/item/storage/box/syndie_kit/imp_deathrattle + cost = 4 + surplus = 0 + include_modes = list(/datum/game_mode/nuclear) diff --git a/code/modules/uplink/uplink_purchase_log.dm b/code/modules/uplink/uplink_purchase_log.dm index 293191b17049a..318d5cfa6deed 100644 --- a/code/modules/uplink/uplink_purchase_log.dm +++ b/code/modules/uplink/uplink_purchase_log.dm @@ -59,6 +59,7 @@ GLOBAL_LIST(uplink_purchase_logs_by_key) //assoc key = /datum/uplink_purchase_lo UPE.name = uplink_item.name UPE.base_cost = initial(uplink_item.cost) UPE.spent_cost = spent_cost + UPE.allow_refund = uplink_item.refundable UPE.amount_purchased++ total_spent += spent_cost @@ -74,3 +75,4 @@ GLOBAL_LIST(uplink_purchase_logs_by_key) //assoc key = /datum/uplink_purchase_lo var/base_cost var/spent_cost var/name + var/allow_refund diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index 18bc60bfbb8fa..beaa78a5761e5 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/vehicles.dmi' icon_state = "fuckyou" max_integrity = 300 - armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) + armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60, "stamina" = 0) density = TRUE anchored = FALSE var/list/mob/occupants //mob = bitflags of their control level. @@ -27,7 +27,7 @@ /obj/vehicle/CanPass(atom/movable/mover, turf/target) if(istype(mover, /obj/item)) //thrown objects and projectiles bypass vehicles return 1 - if(HAS_TRAIT(mover, TRAIT_PASSTABLE)) + if(HAS_TRAIT(mover, TRAIT_PASSTABLE)) return 1 return ..() diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index ded15eb76837f..e2f0f0d748322 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -4,7 +4,7 @@ desc = "An all-terrain vehicle built for traversing rough terrain with ease. One of the few old-Earth technologies that are still relevant on most planet-bound outposts." icon_state = "atv" max_integrity = 150 - armor = list("melee" = 50, "bullet" = 25, "laser" = 20, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) + armor = list("melee" = 50, "bullet" = 25, "laser" = 20, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60, "stamina" = 0) key_type = /obj/item/key integrity_failure = 70 var/static/mutable_appearance/atvcover @@ -79,10 +79,10 @@ START_PROCESSING(SSobj, src) return ..() -/obj/vehicle/ridden/atv/process() +/obj/vehicle/ridden/atv/process(delta_time) if(obj_integrity >= integrity_failure) return PROCESS_KILL - if(prob(20)) + if(DT_PROB(10, delta_time)) return var/datum/effect_system/smoke_spread/smoke = new smoke.set_up(0, src) diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index f0ab669706f43..65fc8433d75d5 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -3,7 +3,7 @@ desc = "How someone could even fit in there is beyond me." icon_state = "clowncar" max_integrity = 150 - armor = list("melee" = 70, "bullet" = 40, "laser" = 40, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + armor = list("melee" = 70, "bullet" = 40, "laser" = 40, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "stamina" = 0) enter_delay = 20 max_occupants = 50 movedelay = 0.6 @@ -67,7 +67,7 @@ /obj/vehicle/sealed/car/clowncar/remove_occupant(mob/M) . = ..() if(iscarbon(M)) - var/mob/living/carbon/C = M + var/mob/living/carbon/C = M C.uncuff() /obj/vehicle/sealed/car/clowncar/Bump(atom/movable/M) @@ -114,7 +114,7 @@ initialize_controller_action_type(/datum/action/vehicle/sealed/RollTheDice, VEHICLE_CONTROL_DRIVE) initialize_controller_action_type(/datum/action/vehicle/sealed/Cannon, VEHICLE_CONTROL_DRIVE) AddComponent(/datum/component/waddling) - + /obj/vehicle/sealed/car/clowncar/Destroy() playsound(src, 'sound/vehicles/clowncar_fart.ogg', 100) return ..() @@ -163,7 +163,7 @@ if(6) visible_message("[user] has pressed one of the colorful buttons on [src] and the clown car lets out a comedic toot.") playsound(src, 'sound/vehicles/clowncar_fart.ogg', 100) - for(var/mob/living/L in orange(loc, 6)) + for(var/mob/living/L in oviewers(6, loc)) L.emote("laughs") for(var/mob/living/L in occupants) L.emote("laughs") @@ -208,6 +208,8 @@ L.update_mouse_pointer() /obj/vehicle/sealed/car/clowncar/proc/FireCannon(mob/user, atom/A, params) + SIGNAL_HANDLER + if(cannonmode && return_controllers_with_flag(VEHICLE_CONTROL_KIDNAPPED).len) var/mob/living/L = pick(return_controllers_with_flag(VEHICLE_CONTROL_KIDNAPPED)) mob_exit(L, TRUE) diff --git a/code/modules/vehicles/motorized_wheelchair.dm b/code/modules/vehicles/motorized_wheelchair.dm index 7a01d75f647ca..326f80319a90a 100644 --- a/code/modules/vehicles/motorized_wheelchair.dm +++ b/code/modules/vehicles/motorized_wheelchair.dm @@ -4,9 +4,9 @@ max_integrity = 150 var/speed = 2 var/power_efficiency = 1 - var/power_usage = 100 + var/power_usage = 25 var/panel_open = FALSE - var/list/required_parts = list(/obj/item/stock_parts/manipulator, + var/list/required_parts = list(/obj/item/stock_parts/manipulator, /obj/item/stock_parts/manipulator, /obj/item/stock_parts/capacitor) var/obj/item/stock_parts/cell/power_cell @@ -42,7 +42,7 @@ canmove = FALSE addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) return FALSE - if(power_cell.charge < power_usage / max(power_efficiency, 1)) + if(power_cell.charge < power_usage / max(power_efficiency, 1)) to_chat(user, "The display on [src] blinks 'Out of Power'.") canmove = FALSE addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) @@ -74,7 +74,7 @@ to_chat(user, "You remove the power cell from [src].") return return ..() - + /obj/vehicle/ridden/wheelchair/motorized/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_SCREWDRIVER) I.play_tool_sound(src) diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index bfd0c4a8445a0..6e86821eba172 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -8,7 +8,7 @@ var/arms_required = 1 //why not? var/fall_off_if_missing_arms = FALSE //heh... var/message_cooldown - + /obj/vehicle/ridden/Initialize() . = ..() LoadComponent(/datum/component/riding) @@ -56,7 +56,7 @@ inserted_key.forceMove(drop_location()) user.put_in_hands(inserted_key) inserted_key = null - return ..() + return /obj/vehicle/ridden/driver_move(mob/user, direction) if(key_type && !is_key(inserted_key)) diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 297f9e5b8ffc8..07e4eacd3bfd5 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -105,7 +105,7 @@ 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) + var/head_slot = H.get_item_by_slot(ITEM_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() @@ -148,17 +148,21 @@ /obj/vehicle/ridden/scooter/skateboard/MouseDrop(atom/over_object) . = ..() - var/mob/living/carbon/M = usr - if(!istype(M) || M.incapacitated() || !Adjacent(M)) + var/mob/living/carbon/skater = usr + if(!istype(skater)) return - if(has_buckled_mobs() && over_object == M) - to_chat(M, "You can't lift this up when somebody's on it.") - return - if(over_object == M) - var/board = new board_item_type(get_turf(M)) - M.put_in_hands(board) - qdel(src) + if (over_object == skater) + pick_up_board(skater) + +/obj/vehicle/ridden/scooter/skateboard/proc/pick_up_board(mob/living/carbon/skater) + if (skater.incapacitated() || !Adjacent(skater)) + return + if(has_buckled_mobs()) + to_chat(skater, "You can't lift this up when somebody's on it.") + return + skater.put_in_hands(new board_item_type(get_turf(skater))) + qdel(src) /obj/vehicle/ridden/scooter/skateboard/pro name = "skateboard" desc = "A RaDSTORMz brand professional skateboard. Looks a lot more stable than the average board." @@ -287,7 +291,7 @@ H.throw_at(throw_target, 4, 3) H.Paralyze(30) H.adjustStaminaLoss(10) - var/head_slot = H.get_item_by_slot(SLOT_HEAD) + var/head_slot = H.get_item_by_slot(ITEM_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, 1) H.updatehealth() diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index 8d4d8229e29fb..1c67796243ef7 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -1,4 +1,5 @@ /obj/vehicle/sealed + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 var/enter_delay = 20 var/mouse_pointer diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index bfb451f68a721..43665d5a94b39 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -4,7 +4,7 @@ desc = "A brave security cyborg gave its life to help you look like a complete tool." icon_state = "secway" max_integrity = 100 - armor = list("melee" = 20, "bullet" = 15, "laser" = 10, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) + armor = list("melee" = 20, "bullet" = 15, "laser" = 10, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60, "stamina" = 0) key_type = /obj/item/key/security integrity_failure = 50 @@ -18,10 +18,10 @@ START_PROCESSING(SSobj, src) return ..() -/obj/vehicle/ridden/secway/process() +/obj/vehicle/ridden/secway/process(delta_time) if(obj_integrity >= integrity_failure) return PROCESS_KILL - if(prob(20)) + if(DT_PROB(10, delta_time)) return var/datum/effect_system/smoke_spread/smoke = new smoke.set_up(0, src) @@ -51,4 +51,4 @@ for(var/mob/M in buckled_mobs) M.bullet_act(P) return TRUE - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm index b6af3116b4100..713d6a6b42639 100644 --- a/code/modules/vehicles/speedbike.dm +++ b/code/modules/vehicles/speedbike.dm @@ -87,6 +87,6 @@ /obj/vehicle/ridden/space/speedwagon/Moved() . = ..() if(has_buckled_mobs()) - for(var/atom/A in range(2, src)) + for(var/atom/A as() in range(2, src)) if(!(A in buckled_mobs)) Bump(A) diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index bf8e8aece554f..e7d0b4eb937fa 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -5,7 +5,7 @@ icon_state = "wheelchair" layer = OBJ_LAYER max_integrity = 100 - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 30) //Wheelchairs aren't super tough yo + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 30, "stamina" = 0) //Wheelchairs aren't super tough yo legs_required = 0 //You'll probably be using this if you don't have legs canmove = TRUE density = FALSE //Thought I couldn't fix this one easily, phew @@ -50,7 +50,7 @@ var/datum/component/riding/D = GetComponent(/datum/component/riding) //1.5 (movespeed as of this change) multiplied by 6.7 gets ABOUT 10 (rounded), the old constant for the wheelchair that gets divided by how many arms they have //if that made no sense this simply makes the wheelchair speed change along with movement speed delay - D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * delay_multiplier) / min(user.get_num_arms(), 2) + D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * delay_multiplier) / clamp(user.get_num_arms(), arms_required, 2) /obj/vehicle/ridden/wheelchair/Moved() . = ..() diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 759de7efa71ed..3c5380895781a 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -52,7 +52,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C verb_exclaim = "beeps" max_integrity = 300 integrity_failure = 100 - armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70) + armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70, "stamina" = 0) circuit = /obj/item/circuitboard/machine/vendor payment_department = ACCOUNT_SRV @@ -64,7 +64,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C var/vend_ready = TRUE ///Next world time to send a purchase message var/purchase_message_cooldown - ///Last mob to shop with us + ///The ref of the last mob to shop with us var/last_shopper var/tilted = FALSE var/tiltable = TRUE @@ -122,8 +122,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C var/seconds_electrified = MACHINE_NOT_ELECTRIFIED ///When this is TRUE, we fire items at customers! We're broken! var/shoot_inventory = 0 - ///How likely this is to happen (prob 100) - var/shoot_inventory_chance = 2 + ///How likely this is to happen (prob 100) per second + var/shoot_inventory_chance = 1 //Stop spouting those godawful pitches! var/shut_up = 0 ///can we access the hidden inventory? @@ -501,9 +501,11 @@ GLOBAL_LIST_EMPTY(vending_products) 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 = shard.embedding.setRating(embed_chance = 100, embedded_ignore_throwspeed_threshold = TRUE, embedded_impact_pain_multiplier=1,embedded_pain_chance=5) + shard.embedding = list(embed_chance = 10000, ignore_throwspeed_threshold = TRUE, impact_pain_mult=1, pain_chance=5) + shard.updateEmbedding() C.hitby(shard, skipcatch = TRUE, hitpush = FALSE) - shard.embedding = shard.embedding.setRating(embed_chance = EMBED_CHANCE, embedded_ignore_throwspeed_threshold = 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!") @@ -694,6 +696,7 @@ GLOBAL_LIST_EMPTY(vending_products) . = list() var/mob/living/carbon/human/H var/obj/item/card/id/C + .["user"] = null if(ishuman(user)) H = user C = H.get_idcard(TRUE) @@ -718,7 +721,6 @@ GLOBAL_LIST_EMPTY(vending_products) return switch(action) if("vend") - . = TRUE if(!vend_ready) return if(panel_open) @@ -775,20 +777,22 @@ GLOBAL_LIST_EMPTY(vending_products) 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) + if(last_shopper != REF(usr) || purchase_message_cooldown < world.time) say("Thank you for shopping with [src]!") purchase_message_cooldown = world.time + 5 SECONDS - last_shopper = usr + //This is not the best practice, but it's safe enough here since the chances of two people using a machine with the same ref in 5 seconds is fuck low + last_shopper = REF(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) new R.product_path(get_turf(src)) R.amount-- + . = TRUE SSblackbox.record_feedback("nested tally", "vending_machine_usage", 1, list("[type]", "[R.product_path]")) vend_ready = TRUE -/obj/machinery/vending/process() +/obj/machinery/vending/process(delta_time) if(stat & (BROKEN|NOPOWER)) return PROCESS_KILL if(!active) @@ -796,14 +800,16 @@ GLOBAL_LIST_EMPTY(vending_products) if(seconds_electrified > MACHINE_NOT_ELECTRIFIED) seconds_electrified-- + if(seconds_electrified <= MACHINE_NOT_ELECTRIFIED) + wires.ui_update() //Pitch to the people! Really sell it! - if(last_slogan + slogan_delay <= world.time && slogan_list.len > 0 && !shut_up && prob(5)) + if(last_slogan + slogan_delay <= world.time && slogan_list.len > 0 && !shut_up && DT_PROB(2.5, delta_time)) var/slogan = pick(slogan_list) speak(slogan) last_slogan = world.time - if(shoot_inventory && prob(shoot_inventory_chance)) + if(shoot_inventory && DT_PROB(shoot_inventory_chance, delta_time)) throw_item() /** * Speak the given message verbally @@ -865,6 +871,7 @@ GLOBAL_LIST_EMPTY(vending_products) throw_item.throw_at(target, 16, 3) visible_message("[src] launches [throw_item] at [target]!") + ui_update() return 1 /** * A callback called before an item is tossed out @@ -936,11 +943,14 @@ GLOBAL_LIST_EMPTY(vending_products) /obj/machinery/vending/custom/canLoadItem(obj/item/I, mob/user) . = FALSE + if(I.flags_1 & HOLOGRAM_1) + say("This vendor cannot accept nonexistent items.") + return 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.") + say("Loose items may cause problems, try to use it inside wrapping paper.") return if(I.custom_price) return TRUE @@ -976,7 +986,6 @@ GLOBAL_LIST_EMPTY(vending_products) return switch(action) if("dispense") - . = TRUE if(!vend_ready) return var/N = params["item"] @@ -1008,8 +1017,7 @@ GLOBAL_LIST_EMPTY(vending_products) loaded_items-- use_power(5) vend_ready = TRUE - updateUsrDialog() - return + return TRUE if(account.has_money(S.custom_price)) account.adjust_money(-S.custom_price) var/datum/bank_account/owner = private_a @@ -1020,13 +1028,12 @@ GLOBAL_LIST_EMPTY(vending_products) S.forceMove(drop_location()) loaded_items-- use_power(5) - if(last_shopper != usr || purchase_message_cooldown < world.time) + if(last_shopper != REF(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 + last_shopper = REF(usr) vend_ready = TRUE - updateUsrDialog() - return + return TRUE else say("You do not possess the funds to purchase this.") vend_ready = TRUE @@ -1050,15 +1057,6 @@ GLOBAL_LIST_EMPTY(vending_products) 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) diff --git a/code/modules/vending/assist.dm b/code/modules/vending/assist.dm index fbd8e85c607fc..5b78274f2531b 100644 --- a/code/modules/vending/assist.dm +++ b/code/modules/vending/assist.dm @@ -13,7 +13,7 @@ refill_canister = /obj/item/vending_refill/assist product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!" default_price = 10 - extra_price = 50 + extra_price = 40 payment_department = NO_FREEBIES /obj/item/vending_refill/assist diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 8c4f4a7bebc12..12cbb0d5f19d5 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -76,6 +76,7 @@ /obj/item/clothing/under/rank/civilian/clown/sexy = 1, /obj/item/clothing/mask/gas/sexymime = 1, /obj/item/clothing/under/rank/civilian/mime/sexy = 1, + /obj/item/clothing/under/rank/civilian/mime/skirt = 1, /obj/item/clothing/mask/rat/bat = 1, /obj/item/clothing/mask/rat/bee = 1, /obj/item/clothing/mask/rat/bear = 1, @@ -113,6 +114,8 @@ /obj/item/clothing/head/cueball = 1, /obj/item/clothing/under/costume/joker = 2, /obj/item/clothing/suit/joker = 2, + /obj/item/clothing/under/dress/sailor = 1, + /obj/item/clothing/head/wig/random = 3, /obj/item/clothing/head/delinquent = 1, /obj/item/clothing/ears/headphones = 2) contraband = list(/obj/item/clothing/suit/judgerobe = 1, diff --git a/code/modules/vending/cigarette.dm b/code/modules/vending/cigarette.dm index 9d5d2f6118794..a8e5b711493ca 100644 --- a/code/modules/vending/cigarette.dm +++ b/code/modules/vending/cigarette.dm @@ -20,8 +20,8 @@ /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 = 10 - extra_price = 50 + default_price = 5 + extra_price = 40 payment_department = ACCOUNT_SRV /obj/machinery/vending/cigarette/syndicate diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index c4fbbb0334726..b55ed7f211674 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -72,6 +72,7 @@ /obj/item/clothing/suit/jacket = 2, /obj/item/clothing/suit/jacket/puffer/vest = 2, /obj/item/clothing/suit/jacket/puffer = 2, + /obj/item/clothing/suit/toggle/softshell = 2, /obj/item/clothing/suit/jacket/letterman = 2, /obj/item/clothing/suit/jacket/letterman_red = 2, /obj/item/clothing/glasses/sunglasses = 2, @@ -98,6 +99,7 @@ /obj/item/clothing/under/dress/redeveninggown = 1, /obj/item/clothing/under/dress/blacktango = 1, /obj/item/clothing/suit/ianshirt = 1, + /obj/item/clothing/suit/hooded/wintercoat/old = 3, /obj/item/clothing/shoes/laceup = 2, /obj/item/clothing/shoes/sandal = 2, /obj/item/clothing/suit/jacket/miljacket = 1, @@ -121,8 +123,8 @@ /obj/item/clothing/neck/necklace/dope = 3, /obj/item/clothing/suit/jacket/letterman_nanotrasen = 1) refill_canister = /obj/item/vending_refill/clothing - default_price = 50 - extra_price = 75 + default_price = 40 + extra_price = 60 payment_department = NO_FREEBIES /obj/item/vending_refill/clothing diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index caea23a0ceee1..ef50c42044994 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -21,8 +21,8 @@ /obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy = 1, /obj/item/reagent_containers/food/drinks/soda_cans/grey_bull = 1) refill_canister = /obj/item/vending_refill/cola - default_price = 10 - extra_price = 30 + default_price = 5 + extra_price = 60 payment_department = ACCOUNT_SRV /obj/item/vending_refill/cola machine_name = "Robust Softdrinks" diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm index 877f8c65eeefd..d52389fde1fbc 100644 --- a/code/modules/vending/engivend.dm +++ b/code/modules/vending/engivend.dm @@ -17,7 +17,8 @@ /obj/item/electronics/airalarm = 10, /obj/item/electronics/advanced_airlock_controller = 10, /obj/item/electronics/firealarm = 10, - /obj/item/electronics/firelock = 10) + /obj/item/electronics/firelock = 10, + /obj/item/storage/bag/construction = 3) contraband = list(/obj/item/stock_parts/cell/potato = 3) premium = list(/obj/item/storage/belt/utility = 3, /obj/item/storage/box/smart_metal_foam = 1) diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index 755c7a92680ab..5de9421002db4 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -6,11 +6,13 @@ light_color = LIGHT_COLOR_ORANGE products = list(/obj/item/toy/cards/deck = 5, /obj/item/storage/pill_bottle/dice = 10, + /obj/item/storage/box/yatzy = 3, /obj/item/toy/cards/deck/cas = 3, /obj/item/toy/cards/deck/cas/black = 3, /obj/item/toy/cards/deck/unum = 3, /obj/item/hourglass = 2) - contraband = list(/obj/item/dice/fudge = 9) + contraband = list(/obj/item/dice/fudge = 9, + /obj/item/instrument/musicalmoth = 1) premium = list(/obj/item/melee/skateboard/pro = 3, /obj/item/melee/skateboard/hoverboard = 1) refill_canister = /obj/item/vending_refill/games diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm index 10e87e6fc3cd3..be05de65cb4ae 100644 --- a/code/modules/vending/liberation.dm +++ b/code/modules/vending/liberation.dm @@ -27,8 +27,8 @@ contraband = list(/obj/item/clothing/under/misc/patriotsuit = 3, /obj/item/bedsheet/patriot = 5, /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) + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "stamina" = 0) resistance_flags = FIRE_PROOF - default_price = 50 - extra_price = 100 + default_price = 300 + extra_price = 500 payment_department = ACCOUNT_SEC diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm index 3af957857b48b..2e5b22bfb9bb0 100644 --- a/code/modules/vending/liberation_toy.dm +++ b/code/modules/vending/liberation_toy.dm @@ -21,11 +21,11 @@ /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted/riot = 10, /obj/item/ammo_box/foambox/riot = 20, /obj/item/toy/katana = 10, - /obj/item/twohanded/dualsaber/toy = 5, + /obj/item/dualsaber/toy = 5, /obj/item/toy/cards/deck/syndicate = 10) //Gambling and it hurts, making it a +18 item - armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "stamina" = 0) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/donksoft - default_price = 25 - extra_price = 50 + default_price = 75 + extra_price = 300 payment_department = ACCOUNT_SRV diff --git a/code/modules/vending/magivend.dm b/code/modules/vending/magivend.dm index a29d1348448f0..6dfd0195c873e 100644 --- a/code/modules/vending/magivend.dm +++ b/code/modules/vending/magivend.dm @@ -15,7 +15,7 @@ /obj/item/clothing/shoes/sandal/magic = 1, /obj/item/staff = 2) 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) + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "stamina" = 0) resistance_flags = FIRE_PROOF default_price = 25 extra_price = 50 diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index f518502134fb3..ab8aa5ddb84eb 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -6,38 +6,33 @@ light_color = LIGHT_COLOR_WHITE 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/stack/medical/gauze = 8, - /obj/item/reagent_containers/syringe = 12, + products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/dropper = 3, + /obj/item/reagent_containers/medspray = 6, + /obj/item/storage/pill_bottle = 6, + /obj/item/reagent_containers/glass/bottle = 10, /obj/item/healthanalyzer = 4, - /obj/item/reagent_containers/pill/patch/styptic = 5, - /obj/item/reagent_containers/pill/patch/silver_sulf = 5, - /obj/item/reagent_containers/pill/salbutamol = 2, - /obj/item/reagent_containers/pill/insulin = 5, + /obj/item/reagent_containers/spray/cleaner = 1, + /obj/item/stack/medical/gauze = 8, + /obj/item/reagent_containers/hypospray/medipen = 8, + /obj/item/reagent_containers/hypospray/medipen/dexalin = 8, + /obj/item/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/reagent_containers/glass/bottle/charcoal = 4, - /obj/item/reagent_containers/glass/bottle/epinephrine = 3, - /obj/item/reagent_containers/glass/bottle/morphine = 4, - /obj/item/reagent_containers/glass/bottle/potass_iodide = 1, - /obj/item/reagent_containers/glass/bottle/salglu_solution = 3, - /obj/item/reagent_containers/glass/bottle/toxin = 3, - /obj/item/reagent_containers/syringe/antiviral = 6, - /obj/item/reagent_containers/medspray/styptic = 2, - /obj/item/reagent_containers/medspray/silver_sulf = 2, - /obj/item/reagent_containers/medspray/sterilizine = 3, - /obj/item/sensor_device = 2, - /obj/item/pinpointer/crew = 2) - contraband = list(/obj/item/reagent_containers/pill/tox = 3, - /obj/item/reagent_containers/pill/morphine = 4, - /obj/item/reagent_containers/pill/charcoal = 6, + /obj/item/reagent_containers/glass/bottle/salglu_solution = 4, + /obj/item/reagent_containers/glass/bottle/tricordrazine = 1, + /obj/item/reagent_containers/glass/bottle/spaceacillin = 1, + /obj/item/reagent_containers/glass/bottle/morphine = 2, + /obj/item/reagent_containers/glass/bottle/toxin = 4, + /obj/item/reagent_containers/medspray/sterilizine = 4) + contraband = list(/obj/item/reagent_containers/glass/bottle/chloralhydrate = 1, /obj/item/storage/box/hug/medical = 1, /obj/item/reagent_containers/glass/bottle/random_virus = 1) - premium = list(/obj/item/reagent_containers/medspray/synthflesh = 2, - /obj/item/storage/pill_bottle/psicodine = 2, - /obj/item/reagent_containers/hypospray/medipen = 3, - /obj/item/storage/belt/medical = 3, - /obj/item/wrench/medical = 1, - /obj/item/storage/firstaid/advanced = 2) - armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + premium = list(/obj/item/storage/firstaid/regular = 3, + /obj/item/storage/belt/medical = 3, + /obj/item/sensor_device = 2, + /obj/item/pinpointer/crew = 2, + /obj/item/wrench/medical = 1) + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "stamina" = 0) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/medical default_price = 25 diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index fbb1a3379e43b..60f7b9e521e16 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -6,15 +6,15 @@ density = FALSE light_color = LIGHT_COLOR_WHITE products = list(/obj/item/reagent_containers/syringe = 3, - /obj/item/reagent_containers/pill/patch/styptic = 5, - /obj/item/reagent_containers/pill/patch/silver_sulf = 5, - /obj/item/reagent_containers/pill/charcoal = 2, - /obj/item/reagent_containers/medspray/styptic = 2, - /obj/item/reagent_containers/medspray/silver_sulf = 2, + /obj/item/stack/medical/gauze = 4, + /obj/item/reagent_containers/hypospray/medipen = 3, + /obj/item/reagent_containers/hypospray/medipen/dexalin = 3, + /obj/item/reagent_containers/glass/bottle/epinephrine = 2, + /obj/item/reagent_containers/glass/bottle/charcoal = 2, /obj/item/reagent_containers/medspray/sterilizine = 3) - contraband = list(/obj/item/reagent_containers/pill/tox = 2, - /obj/item/reagent_containers/pill/morphine = 2) - armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + contraband = list(/obj/item/reagent_containers/glass/bottle/toxin = 1, + /obj/item/reagent_containers/glass/bottle/morphine = 1) + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "stamina" = 0) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/wallmed default_price = 25 diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index b0a7e0d0b923d..29ae4524deb4e 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -13,14 +13,18 @@ /obj/item/reagent_containers/food/snacks/donut = 12, /obj/item/storage/box/evidence = 6, /obj/item/flashlight/seclite = 4, - /obj/item/restraints/legcuffs/bola/energy = 7) + /obj/item/holosign_creator/security = 3, + /obj/item/restraints/legcuffs/bola/energy = 7, + /obj/item/club = 5) contraband = list(/obj/item/clothing/glasses/sunglasses/advanced = 2, /obj/item/storage/fancy/donut_box = 2) premium = list(/obj/item/storage/belt/security/webbing = 5, /obj/item/storage/backpack/duffelbag/sec/deputy = 4, /obj/item/coin/antagtoken = 1, + /obj/item/grenade/barrier = 4, /obj/item/clothing/head/helmet/blueshirt = 1, - /obj/item/clothing/suit/armor/vest/blueshirt = 1) + /obj/item/clothing/suit/armor/vest/blueshirt = 1, + /obj/item/grenade/stingbang = 1) refill_canister = /obj/item/vending_refill/security default_price = 100 extra_price = 150 diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm index ee979f4a82c76..3ad7137b4f365 100644 --- a/code/modules/vending/toys.dm +++ b/code/modules/vending/toys.dm @@ -22,13 +22,13 @@ /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted = 10, /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted = 10, /obj/item/toy/katana = 10, - /obj/item/twohanded/dualsaber/toy = 5) + /obj/item/dualsaber/toy = 5) - armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "stamina" = 0) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/donksoft - default_price = 25 - extra_price = 50 + default_price = 75 + extra_price = 300 payment_department = ACCOUNT_SRV /obj/item/vending_refill/donksoft diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 75d3be4f756c0..0c86c3d366446 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -35,6 +35,7 @@ /obj/item/clothing/under/rank/security/officer/mallcop = 3, /obj/item/clothing/neck/tie/red = 6, /obj/item/clothing/neck/tie/black = 6,) + contraband = list(/obj/item/clothing/suit/hooded/wintercoat/security/old = 3) premium = list(/obj/item/clothing/under/rank/security/officer/formal = 3, /obj/item/clothing/suit/security/officer = 3, /obj/item/clothing/head/beret/sec/navyofficer = 3) @@ -56,12 +57,16 @@ /obj/item/storage/backpack/medic = 4, /obj/item/storage/backpack/satchel/med = 4, /obj/item/clothing/suit/hooded/wintercoat/medical = 4, + /obj/item/clothing/under/rank/medical/emt = 4, + /obj/item/clothing/under/rank/medical/emt/skirt = 4, /obj/item/clothing/under/rank/medical/doctor/nurse = 4, /obj/item/clothing/head/nursehat = 4, + /obj/item/clothing/head/beret/med = 4, /obj/item/clothing/under/rank/medical/doctor/blue = 4, /obj/item/clothing/under/rank/medical/doctor/green = 4, /obj/item/clothing/under/rank/medical/doctor/purple = 4, /obj/item/clothing/under/rank/medical/doctor = 4, + /obj/item/clothing/under/rank/medical/doctor/skirt= 4, /obj/item/clothing/under/plasmaman/medical = 4, /obj/item/clothing/head/helmet/space/plasmaman/replacement/medical = 4, /obj/item/clothing/suit/toggle/labcoat = 4, @@ -70,6 +75,7 @@ /obj/item/clothing/head/soft/emt = 4, /obj/item/clothing/suit/apron/surgical = 4, /obj/item/clothing/mask/surgical = 4) + contraband = list(/obj/item/clothing/suit/hooded/wintercoat/medical/old = 3) refill_canister = /obj/item/vending_refill/wardrobe/medi_wardrobe payment_department = ACCOUNT_MED /obj/item/vending_refill/wardrobe/medi_wardrobe @@ -96,6 +102,7 @@ /obj/item/clothing/head/hardhat = 3, /obj/item/clothing/head/hardhat/weldhat = 3, /obj/item/clothing/head/beret/eng = 3) + contraband = list(/obj/item/clothing/suit/hooded/wintercoat/engineering/old = 3) refill_canister = /obj/item/vending_refill/wardrobe/engi_wardrobe payment_department = ACCOUNT_ENG /obj/item/vending_refill/wardrobe/engi_wardrobe @@ -112,11 +119,12 @@ /obj/item/storage/backpack/duffelbag/engineering = 2, /obj/item/storage/backpack/satchel/eng = 2, /obj/item/storage/backpack/industrial = 2, - /obj/item/clothing/under/plasmaman/atmospherics = 3, - /obj/item/clothing/head/helmet/space/plasmaman/replacement/atmospherics = 3, + /obj/item/clothing/under/plasmaman/engineering/atmospherics = 3, + /obj/item/clothing/head/helmet/space/plasmaman/replacement/engineering/atmospherics = 3, /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 3, /obj/item/clothing/under/rank/engineering/atmospheric_technician = 3, /obj/item/clothing/shoes/sneakers/black = 3) + contraband = list(/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos/old = 3) refill_canister = /obj/item/vending_refill/wardrobe/atmos_wardrobe payment_department = ACCOUNT_ENG /obj/item/vending_refill/wardrobe/atmos_wardrobe @@ -131,6 +139,7 @@ light_color = LIGHT_COLOR_YELLOW products = list(/obj/item/clothing/suit/hooded/wintercoat/cargo = 3, /obj/item/clothing/under/rank/cargo/tech = 3, + /obj/item/clothing/under/rank/cargo/tech/skirt = 3, /obj/item/clothing/under/plasmaman/cargo = 3, /obj/item/clothing/head/helmet/space/plasmaman/replacement/cargo = 3, /obj/item/clothing/shoes/sneakers/black = 3, @@ -138,6 +147,7 @@ /obj/item/clothing/head/soft = 3, /obj/item/radio/headset/headset_cargo = 3) premium = list(/obj/item/clothing/under/rank/cargo/miner = 3) + contraband = list(/obj/item/radio/headset/headset_quartermaster = 1) refill_canister = /obj/item/vending_refill/wardrobe/cargo_wardrobe payment_department = ACCOUNT_CAR /obj/item/vending_refill/wardrobe/cargo_wardrobe @@ -153,6 +163,7 @@ products = list(/obj/item/clothing/glasses/hud/diagnostic = 2, /obj/item/reagent_containers/medspray/sterilizine = 3, /obj/item/clothing/under/rank/rnd/roboticist = 2, + /obj/item/clothing/under/rank/rnd/roboticist/skirt = 2, /obj/item/clothing/under/plasmaman/robotics = 2, /obj/item/clothing/head/helmet/space/plasmaman/replacement/robotics = 2, /obj/item/clothing/suit/toggle/labcoat = 2, @@ -182,6 +193,7 @@ /obj/item/storage/backpack/satchel/tox = 3, /obj/item/clothing/suit/hooded/wintercoat/science = 3, /obj/item/clothing/under/rank/rnd/scientist = 3, + /obj/item/clothing/under/rank/rnd/scientist/skirt = 3, /obj/item/clothing/under/plasmaman/science = 3, /obj/item/clothing/head/helmet/space/plasmaman/replacement/science = 3, /obj/item/clothing/suit/toggle/labcoat/science = 3, @@ -189,6 +201,7 @@ /obj/item/radio/headset/headset_sci = 3, /obj/item/clothing/mask/gas = 3, /obj/item/clothing/head/beret/sci = 3) + contraband = list(/obj/item/clothing/suit/hooded/wintercoat/science/old = 3) refill_canister = /obj/item/vending_refill/wardrobe/science_wardrobe payment_department = ACCOUNT_SCI /obj/item/vending_refill/wardrobe/science_wardrobe @@ -207,10 +220,12 @@ /obj/item/clothing/suit/apron = 2, /obj/item/clothing/suit/apron/overalls = 3, /obj/item/clothing/under/rank/civilian/hydroponics = 3, + /obj/item/clothing/under/rank/civilian/hydroponics/skirt = 3, /obj/item/clothing/under/plasmaman/botany = 3, /obj/item/clothing/head/helmet/space/plasmaman/replacement/botany = 3, /obj/item/clothing/mask/bandana = 3, /obj/item/clothing/accessory/armband/hydro = 3) + contraband = list(/obj/item/clothing/suit/hooded/wintercoat/hydro/old = 3) refill_canister = /obj/item/vending_refill/wardrobe/hydro_wardrobe payment_department = ACCOUNT_SRV /obj/item/vending_refill/wardrobe/hydro_wardrobe @@ -223,7 +238,8 @@ product_ads = "Glasses for your eyes and literature for your soul, Curadrobe has it all!; Impress & enthrall your library guests with Curadrobe's extended line of pens!" vend_reply = "Thank you for using the CuraDrobe!" light_color = LIGHT_COLOR_WHITE - products = list(/obj/item/pen = 4, + products = list(/obj/item/clothing/under/rank/civilian/curator/skirt = 2, + /obj/item/pen = 4, /obj/item/pen/red = 2, /obj/item/pen/blue = 2, /obj/item/pen/fourcolor = 1, @@ -252,6 +268,7 @@ /obj/item/clothing/under/suit/sl = 2, /obj/item/clothing/under/rank/civilian/bartender = 2, /obj/item/clothing/under/rank/civilian/bartender/purple = 2, + /obj/item/clothing/under/rank/civilian/bartender/skirt = 2, /obj/item/clothing/under/plasmaman/enviroslacks = 2, /obj/item/clothing/head/helmet/space/plasmaman/replacement/white = 2, /obj/item/clothing/accessory/waistcoat = 2, @@ -290,6 +307,7 @@ /obj/item/clothing/under/plasmaman/chef = 1, /obj/item/clothing/head/helmet/space/plasmaman/replacement/white = 1, /obj/item/clothing/under/rank/civilian/chef = 1, + /obj/item/clothing/under/rank/civilian/chef/skirt = 2, /obj/item/clothing/under/rank/civilian/altchef = 1, /obj/item/clothing/head/chefhat = 3, /obj/item/reagent_containers/glass/rag = 1, @@ -306,12 +324,13 @@ product_ads = "Come and get your janitorial clothing, now endorsed by lizard janitors everywhere!" vend_reply = "Thank you for using the JaniDrobe!" products = list(/obj/item/clothing/under/rank/civilian/janitor = 2, + /obj/item/clothing/under/rank/civilian/janitor/skirt = 2, /obj/item/clothing/under/plasmaman/janitor = 2, /obj/item/clothing/head/helmet/space/plasmaman/replacement/janitor = 2, /obj/item/cartridge/janitor = 2, /obj/item/clothing/gloves/color/black = 2, /obj/item/clothing/head/soft/purple = 2, - /obj/item/twohanded/pushbroom = 2, + /obj/item/pushbroom = 2, /obj/item/paint/paint_remover = 2, /obj/item/melee/flyswatter = 2, /obj/item/flashlight = 2, @@ -335,16 +354,28 @@ product_ads = "OBJECTION! Get the rule of law for yourself!" vend_reply = "Thank you for using the LawDrobe!" products = list(/obj/item/clothing/under/rank/civilian/lawyer/bluesuit = 1, + /obj/item/clothing/under/rank/civilian/lawyer/bluesuit/skirt = 1, /obj/item/clothing/suit/toggle/lawyer = 1, /obj/item/clothing/under/rank/civilian/lawyer/purpsuit = 1, /obj/item/clothing/suit/toggle/lawyer/purple = 1, + /obj/item/clothing/under/lawyer/civilian/lawyer/purpsuit/skirt = 1, /obj/item/clothing/under/suit/black = 1, + /obj/item/clothing/under/suit/black/skirt = 1, /obj/item/clothing/suit/toggle/lawyer/black = 1, /obj/item/clothing/under/rank/civilian/lawyer/female = 1, + /obj/item/clothing/under/lawyer/civilian/lawyer/female/skirt = 1, /obj/item/clothing/under/suit/black_really = 1, + /obj/item/clothing/under/suit/black_really/skirt = 1, /obj/item/clothing/under/rank/civilian/lawyer/blue = 1, + /obj/item/clothing/under/rank/civilian/lawyer/blue/skirt = 1, /obj/item/clothing/under/rank/civilian/lawyer/red = 1, + /obj/item/clothing/under/rank/civilian/lawyer/red/skirt = 1, /obj/item/clothing/under/rank/civilian/lawyer/black = 1, + /obj/item/clothing/under/rank/civilian/lawyer/black/skirt = 1, + /obj/item/clothing/suit/aristo_orange = 1, + /obj/item/clothing/suit/aristo_red = 1, + /obj/item/clothing/suit/aristo_brown = 1, + /obj/item/clothing/suit/aristo_blue = 1, /obj/item/clothing/shoes/laceup = 2, /obj/item/clothing/neck/tie/red = 6, /obj/item/clothing/neck/tie/black = 6, @@ -365,6 +396,7 @@ /obj/item/storage/backpack/cultpack = 1, /obj/item/clothing/accessory/pocketprotector/cosmetology = 1, /obj/item/clothing/under/rank/civilian/chaplain = 1, + /obj/item/clothing/under/rank/civilian/chaplain/skirt = 1, /obj/item/clothing/under/plasmaman/chaplain = 1, /obj/item/clothing/head/helmet/space/plasmaman/replacement/chaplain = 1, /obj/item/clothing/shoes/sneakers/black = 1, @@ -373,6 +405,7 @@ /obj/item/clothing/suit/chaplainsuit/holidaypriest = 1, /obj/item/storage/fancy/candle_box = 2, /obj/item/clothing/head/kippah = 3, + /obj/item/clothing/suit/hooded/hastur = 1, /obj/item/clothing/suit/chaplainsuit/whiterobe = 1, /obj/item/clothing/head/taqiyahwhite = 1, /obj/item/clothing/head/taqiyahred = 3, @@ -381,8 +414,10 @@ /obj/item/toy/plush/narplush = 1, /obj/item/clothing/head/medievaljewhat = 3, /obj/item/clothing/suit/chaplainsuit/clownpriest = 1, - /obj/item/clothing/head/clownmitre = 1) + /obj/item/clothing/head/clownmitre = 1, + /obj/item/clothing/neck/cloak/chap/bishop = 1) premium = list(/obj/item/clothing/suit/chaplainsuit/bishoprobe = 1, + /obj/item/clothing/neck/crucifix/rosary = 1, /obj/item/clothing/head/bishopmitre = 1) refill_canister = /obj/item/vending_refill/wardrobe/chap_wardrobe payment_department = ACCOUNT_CIV @@ -396,6 +431,7 @@ product_ads = "Our clothes are 0.5% more resistant to acid spills! Get yours now!" vend_reply = "Thank you for using the ChemDrobe!" products = list(/obj/item/clothing/under/rank/medical/chemist = 2, + /obj/item/clothing/under/rank/medical/chemist/skirt = 2, /obj/item/clothing/under/plasmaman/chemist = 2, /obj/item/clothing/head/helmet/space/plasmaman/replacement/chemist = 2, /obj/item/clothing/shoes/sneakers/white = 2, @@ -416,6 +452,7 @@ product_ads = "Perfect for the mad scientist in you!" vend_reply = "Thank you for using the GeneDrobe!" products = list(/obj/item/clothing/under/rank/medical/geneticist = 2, + /obj/item/clothing/under/rank/medical/geneticist/skirt = 2, /obj/item/clothing/under/plasmaman/genetics = 2, /obj/item/clothing/head/helmet/space/plasmaman/replacement/genetics = 2, /obj/item/clothing/shoes/sneakers/white = 2, @@ -434,6 +471,7 @@ product_ads = " Viruses getting you down? Then upgrade to sterilized clothing today!" vend_reply = "Thank you for using the ViroDrobe" products = list(/obj/item/clothing/under/rank/medical/virologist = 2, + /obj/item/clothing/under/rank/medical/virologist/skirt = 2, /obj/item/clothing/under/plasmaman/viro = 2, /obj/item/clothing/head/helmet/space/plasmaman/replacement/viro = 2, /obj/item/clothing/shoes/sneakers/white = 2, @@ -448,3 +486,33 @@ payment_department = ACCOUNT_MED /obj/item/vending_refill/wardrobe/viro_wardrobe machine_name = "ViroDrobe" + +/obj/machinery/vending/wardrobe/det_wardrobe + name = "\improper DetDrobe" + desc = "A machine for all your detective needs, as long as you need clothes." + icon_state = "detdrobe" + product_ads = "Apply your brilliant deductive methods in style!" + vend_reply = "Thank you for using the DetDrobe!" + products = list(/obj/item/clothing/under/rank/security/detective = 2, + /obj/item/clothing/under/rank/security/detective/skirt = 2, + /obj/item/clothing/shoes/sneakers/brown = 2, + /obj/item/clothing/suit/det_suit = 2, + /obj/item/clothing/head/fedora/det_hat = 2, + /obj/item/clothing/under/rank/security/detective/grey = 2, + /obj/item/clothing/under/rank/security/detective/grey/skirt = 2, + /obj/item/clothing/accessory/waistcoat = 2, + /obj/item/clothing/shoes/laceup = 2, + /obj/item/clothing/suit/det_suit/grey = 1, + /obj/item/clothing/suit/det_suit/noir = 1, + /obj/item/clothing/head/fedora = 2, + /obj/item/clothing/gloves/color/black = 2, + /obj/item/clothing/gloves/color/latex = 2, + /obj/item/reagent_containers/food/drinks/flask/det = 2, + /obj/item/storage/fancy/cigarettes = 5) + premium = list(/obj/item/clothing/head/flatcap = 1) + refill_canister = /obj/item/vending_refill/wardrobe/det_wardrobe + extra_price = 350 + payment_department = ACCOUNT_SEC + +/obj/item/vending_refill/wardrobe/det_wardrobe + machine_name = "DetDrobe" diff --git a/code/modules/vending/youtool.dm b/code/modules/vending/youtool.dm index 61a7310df8451..a80929166592b 100644 --- a/code/modules/vending/youtool.dm +++ b/code/modules/vending/youtool.dm @@ -8,6 +8,7 @@ /obj/item/crowbar = 5, /obj/item/weldingtool = 3, /obj/item/wirecutters = 5, + /obj/item/multitool = 5, /obj/item/wrench = 5, /obj/item/analyzer = 5, /obj/item/t_scanner = 5, @@ -22,9 +23,9 @@ /obj/item/clothing/head/welding = 2, /obj/item/clothing/gloves/color/yellow = 1) refill_canister = /obj/item/vending_refill/tool - armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70) + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70, "stamina" = 0) resistance_flags = FIRE_PROOF - default_price = 20 + default_price = 10 extra_price = 80 payment_department = ACCOUNT_ENG diff --git a/code/modules/wiremod/component.dm b/code/modules/wiremod/component.dm new file mode 100644 index 0000000000000..8fcb5704a9f06 --- /dev/null +++ b/code/modules/wiremod/component.dm @@ -0,0 +1,261 @@ +/** + * # Integrated Circuit Component + * + * A component that performs a function when given an input + * + * Can be attached to an integrated circuitboard, where it can then + * be connected between other components to provide an output or to receive + * an input. This is the base type of all components + */ +/obj/item/circuit_component + name = COMPONENT_DEFAULT_NAME + icon = 'icons/obj/module.dmi' + icon_state = "component" + item_state = "electronic" + + /// The name of the component shown on the UI + var/display_name = "Generic" + + /// The description of the component shown on the UI + var/display_desc = "A generic component" + + /// The integrated_circuit that this component is attached to. + var/obj/item/integrated_circuit/parent + + /// A list that contains the outpurt ports on this component + /// Used to connect between the ports + var/list/datum/port/output/output_ports = list() + + /// A list that contains the components the input ports on this component + /// Used to connect between the ports + var/list/datum/port/input/input_ports = list() + + /// Generic trigger input for triggering this component + var/datum/port/input/trigger_input + var/datum/port/output/trigger_output + + /// The flags of the circuit to control basic generalised behaviour. + var/circuit_flags = NONE + + /// Used to determine the x position of the component within the UI + var/rel_x = 0 + /// Used to determine the y position of the component within the UI + var/rel_y = 0 + + /// The power usage whenever this component receives an input + var/power_usage_per_input = 1 + + /// The current selected option + var/current_option + /// The options that this component can take on. Limited to strings + var/list/options + + // Whether the component is removable or not. Only affects user UI + var/removable = TRUE + +/obj/item/circuit_component/Initialize() + . = ..() + if(name == COMPONENT_DEFAULT_NAME) + name = "[lowertext(display_name)] [COMPONENT_DEFAULT_NAME]" + populate_options() + if(length(options)) + current_option = options[1] + + return INITIALIZE_HINT_LATELOAD + +/// Called when the options variable should be set. +/obj/item/circuit_component/proc/populate_options() + return + +/obj/item/circuit_component/LateInitialize() + . = ..() + if(circuit_flags & CIRCUIT_FLAG_INPUT_SIGNAL) + trigger_input = add_input_port("Trigger", PORT_TYPE_SIGNAL) + if(circuit_flags & CIRCUIT_FLAG_OUTPUT_SIGNAL) + trigger_output = add_output_port("Triggered", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/Destroy() + if(parent) + // Prevents a Destroy() recursion + var/obj/item/integrated_circuit/old_parent = parent + parent = null + old_parent.remove_component(src) + + trigger_input = null + trigger_output = null + + QDEL_LIST(output_ports) + QDEL_LIST(input_ports) + return ..() + +/** + * Called when a shell is registered from the component/the component is added to a circuit. + * + * Register all signals here on the shell. + * Arguments: + * * shell - Shell being registered + */ +/obj/item/circuit_component/proc/register_shell(atom/movable/shell) + return + +/** + * Called when a shell is unregistered from the component/the component is removed from a circuit. + * + * Unregister all signals here on the shell. + * Arguments: + * * shell - Shell being unregistered + */ +/obj/item/circuit_component/proc/unregister_shell(atom/movable/shell) + return + +/** + * Disconnects a component from other components + * + * Disconnects both the input and output ports of the component + */ +/obj/item/circuit_component/proc/disconnect() + for(var/datum/port/output/port_to_disconnect as anything in output_ports) + port_to_disconnect.disconnect() + + for(var/datum/port/input/port_to_disconnect as anything in input_ports) + port_to_disconnect.disconnect() + +/** + * Sets the option on this component + * + * Can only be a value from the options variable + * Arguments: + * * option - The option that has been switched to. + */ +/obj/item/circuit_component/proc/set_option(option) + current_option = option + TRIGGER_CIRCUIT_COMPONENT(src, null) + +/** + * Matches the output port's datatype with the input port's current connected port. + * + * Returns true if datatype was changed, otherwise returns false. + * Arguments: + * * input_port - The input port to check the connected port from. + * * output_port - The output port to convert. Warning, this does change the output port. + */ +/obj/item/circuit_component/proc/match_port_datatype(datum/port/input/input_port, datum/port/output/output_port) + if(input_port.connected_port) + var/datum/port/connected_port = input_port.connected_port + if(connected_port.datatype != output_port.datatype) + output_port.set_datatype(connected_port.datatype) + return TRUE + else + output_port.set_datatype(output_port.default_datatype) + return TRUE + return FALSE + + +/** + * Adds an input port and returns it + * + * Arguments: + * * name - The name of the input port + * * type - The datatype it handles + * * trigger - Whether this input port triggers an update on the component when updated. + */ +/obj/item/circuit_component/proc/add_input_port(name, type, trigger = TRUE, default = null) + var/datum/port/input/input_port = new(src, name, type, trigger, default) + input_ports += input_port + return input_port + + +/** + * Adds an output port and returns it + * + * Arguments: + * * name - The name of the output port + * * type - The datatype it handles. + */ +/obj/item/circuit_component/proc/add_output_port(name, type) + var/datum/port/output/output_port = new(src, name, type) + output_ports += output_port + return output_port + +/** + * Called whenever an input is received from one of the ports. + * + * Return value indicates that the circuit should not do anything. Also prevents an output signal. + * Arguments: + * * port - Can be null. The port that sent the input + */ +/obj/item/circuit_component/proc/input_received(datum/port/input/port) + SHOULD_CALL_PARENT(TRUE) + if(!parent?.on) + return TRUE + + var/obj/item/stock_parts/cell/cell = parent.get_cell() + if(!cell?.use(power_usage_per_input)) + return TRUE + + if((circuit_flags & CIRCUIT_FLAG_INPUT_SIGNAL) && !COMPONENT_TRIGGERED_BY(trigger_input, port)) + return TRUE + +/// Called when this component is about to be added to an integrated_circuit. +/obj/item/circuit_component/proc/add_to(obj/item/integrated_circuit/added_to) + return TRUE + +/// Called when this component is removed from an integrated_circuit. +/obj/item/circuit_component/proc/removed_from(obj/item/integrated_circuit/removed_from) + return + +/** + * Gets the UI notices to be displayed on the CircuitInfo panel. + * + * Returns a list of buttons in the following format + * list( + * "icon" = ICON(string) + * "content" = CONTENT(string) + * "color" = COLOR(string, not a hex) + * ) + */ +/obj/item/circuit_component/proc/get_ui_notices() + . = list() + + if(!removable) + . += create_ui_notice("Unremovable", "red", "lock") + + + if(length(input_ports)) + . += create_ui_notice("Power Usage Per Input: [power_usage_per_input]", "orange", "bolt") + +/** + * Creates a UI notice entry to be used in get_ui_notices() + * + * Returns a list that can then be added to the return list in get_ui_notices() + */ +/obj/item/circuit_component/proc/create_ui_notice(content, color, icon) + SHOULD_BE_PURE(TRUE) + SHOULD_NOT_OVERRIDE(TRUE) + return list(list( + "icon" = icon, + "content" = content, + "color" = color, + )) + +/** + * Creates a table UI notice entry to be used in get_ui_notices() + * + * Returns a list that can then be added to the return list in get_ui_notices() + * Used by components to list their available columns. Recommended to use at the end of get_ui_notices() + */ +/obj/item/circuit_component/proc/create_table_notices(list/entries) + SHOULD_BE_PURE(TRUE) + SHOULD_NOT_OVERRIDE(TRUE) + . = list() + . += create_ui_notice("Available Columns:", "grey", "question-circle") + + + for(var/entry in entries) + . += create_ui_notice("Column Name: '[entry]'", "grey", "columns") + +/obj/item/circuit_component/proc/register_usb_parent(atom/movable/parent) + return + +/obj/item/circuit_component/proc/unregister_usb_parent(atom/movable/parent) + return diff --git a/code/modules/wiremod/component_printer.dm b/code/modules/wiremod/component_printer.dm new file mode 100644 index 0000000000000..6f5e0d1f1dec2 --- /dev/null +++ b/code/modules/wiremod/component_printer.dm @@ -0,0 +1,38 @@ +/obj/machinery/modular_fabricator/component_printer + name = "component printer" + desc = "Produces components for the creation of integrated circuits." + icon = 'icons/obj/wiremod_fab.dmi' + icon_state = "fab-idle" + circuit = /obj/item/circuitboard/machine/component_printer + + remote_materials = TRUE + auto_link = TRUE + can_sync = TRUE + + //Quick. + minimum_construction_time = 5 + + stored_research_type = /datum/techweb/specialized/autounlocking/component_printer + + categories = WIREMODE_CATEGORIES + +/obj/machinery/component_printer/crowbar_act(mob/living/user, obj/item/tool) + + if(..()) + return TRUE + return default_deconstruction_crowbar(tool) + +/obj/machinery/modular_fabricator/component_printer/screwdriver_act(mob/living/user, obj/item/tool) + if(..()) + return TRUE + return default_deconstruction_screwdriver(user, "fab-o", "fab-idle", tool) + +/obj/item/circuitboard/machine/component_printer + name = "\improper Component Printer (Machine Board)" + icon_state = "science" + build_path = /obj/machinery/modular_fabricator/component_printer + req_components = list( + /obj/item/stock_parts/matter_bin = 2, + /obj/item/stock_parts/manipulator = 2, + /obj/item/reagent_containers/glass/beaker = 2, + ) diff --git a/code/modules/wiremod/components/abstract/arbitrary_input_amount.dm b/code/modules/wiremod/components/abstract/arbitrary_input_amount.dm new file mode 100644 index 0000000000000..a57961dd01cf0 --- /dev/null +++ b/code/modules/wiremod/components/abstract/arbitrary_input_amount.dm @@ -0,0 +1,43 @@ +//This component is to create common methods for components that can function with any specified amount of inputs +/obj/item/circuit_component/arbitrary_input_amount + display_name = "Arbitrary Input Amount" + display_desc = "A modular component base that allows component designs to contain an arbitrary amount of inputs" + + //The type of port to use + var/input_port_type = PORT_TYPE_ANY + var/output_port_type = PORT_TYPE_ANY + + /// The amount of input ports to have + var/input_port_amount = 2 + + /// The result from the output + var/datum/port/output/output + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/arbitrary_input_amount/Initialize() + . = ..() + for(var/port_id in 1 to input_port_amount) + var/letter = ascii2text(text2ascii("A") + (port_id-1)) + add_input_port(letter, input_port_type) + + output = add_output_port("Output", output_port_type) + +/obj/item/circuit_component/arbitrary_input_amount/Destroy() + output = null + return ..() + +/obj/item/circuit_component/arbitrary_input_amount/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/list/ports = input_ports.Copy() + var/datum/port/input/first_port = ports[1] + ports -= first_port + ports -= trigger_input + + output.set_output(calculate_output(port,first_port,ports)) + +//This should return the value to be set on input_received, first_port should be the first port, and ports should be every input port except the first and signal ports +/obj/item/circuit_component/arbitrary_input_amount/proc/calculate_output(datum/port/input/port, datum/port/input/first_port, list/ports) diff --git a/code/modules/wiremod/components/abstract/compare.dm b/code/modules/wiremod/components/abstract/compare.dm new file mode 100644 index 0000000000000..c5fff8aa6ada6 --- /dev/null +++ b/code/modules/wiremod/components/abstract/compare.dm @@ -0,0 +1,67 @@ +/** + * # Compare Component + * + * Abstract component to build conditional components + */ +/obj/item/circuit_component/compare + display_name = "Compare" + + /// The amount of input ports to have + var/input_port_amount = 4 + + /// The trigger for the true/false signals + var/datum/port/input/compare + + /// Signals sent on compare + var/datum/port/output/true + var/datum/port/output/false + + /// The result from the output + var/datum/port/output/result + +/obj/item/circuit_component/compare/Initialize() + . = ..() + for(var/port_id in 1 to input_port_amount) + var/letter = ascii2text(text2ascii("A") + (port_id-1)) + add_input_port(letter, PORT_TYPE_ANY) + + load_custom_ports() + compare = add_input_port("Compare", PORT_TYPE_SIGNAL) + + true = add_output_port("True", PORT_TYPE_SIGNAL) + false = add_output_port("False", PORT_TYPE_SIGNAL) + result = add_output_port("Result", PORT_TYPE_NUMBER) + +/** + * Used by derivatives to load their own ports in for custom use. + */ +/obj/item/circuit_component/compare/proc/load_custom_ports() + return + +/obj/item/circuit_component/compare/Destroy() + true = null + false = null + result = null + compare = null + return ..() + +/obj/item/circuit_component/compare/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/list/ports = input_ports.Copy() + if(input_port_amount) + ports.Cut(input_port_amount+1) + + var/logic_result = do_comparisons(ports) + if(COMPONENT_TRIGGERED_BY(compare, port)) + if(logic_result) + true.set_output(COMPONENT_SIGNAL) + else + false.set_output(COMPONENT_SIGNAL) + result.set_output(logic_result) + +/// Do the comparisons and return a result +/obj/item/circuit_component/compare/proc/do_comparisons(list/ports) + return FALSE diff --git a/code/modules/wiremod/components/abstract/indexer.dm b/code/modules/wiremod/components/abstract/indexer.dm new file mode 100644 index 0000000000000..5adb90b40d595 --- /dev/null +++ b/code/modules/wiremod/components/abstract/indexer.dm @@ -0,0 +1,85 @@ +/*** +* Indexer Component +* +* An abstract component to provide some common functionality for component at access a specified index of a list +***/ +/obj/item/circuit_component/indexer + display_name = "Indexer Component" + display_desc = "A component base used to access specified indexes of a list; it doesn't work by itself." + + /// The input port + var/datum/port/input/list_port + var/datum/port/input/index_port + + // Changes functionality based on current option + var/option_flags = NONE + + /// The result from the output + var/datum/port/output/output + var/output_name = "Output" + var/output_port_type = PORT_TYPE_ANY + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + +/obj/item/circuit_component/indexer/populate_options() + var/static/list/index_options = list( + COMP_INDEXER_NONE, + COMP_INDEXER_INCREMENT, + COMP_INDEXER_LOOP, + COMP_INDEXER_BOTH + ) + options = index_options + +/obj/item/circuit_component/indexer/set_option(option) + . = ..() + switch(current_option) + if(COMP_INDEXER_NONE) + option_flags = NONE + if(COMP_INDEXER_INCREMENT) + option_flags = COMP_INDEXER_FLAG_INCREMENT + if(COMP_INDEXER_LOOP) + option_flags = COMP_INDEXER_FLAG_LOOP + if(COMP_INDEXER_BOTH) + option_flags = COMP_INDEXER_FLAG_INCREMENT|COMP_INDEXER_FLAG_LOOP + +/obj/item/circuit_component/indexer/Initialize() + . = ..() + list_port = add_input_port("List", PORT_TYPE_LIST) + index_port = add_input_port("Index", PORT_TYPE_NUMBER) + + output = add_output_port(output_name, output_port_type) + +/obj/item/circuit_component/indexer/Destroy() + list_port = null + index_port = null + output = null + return ..() + +/obj/item/circuit_component/indexer/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/index = index_port.input_value + var/list/list_input = list_port.input_value + list_input = list_input?.Copy() //input_value of an input port isn't typecasted to a list, so it doesn't reconize Copy() until you put it in a typed var + + if(!islist(list_input) || isnull(index)) + output.set_output(null) + return + + //Common operations that can change how you work with lists, require index and list_input to not be null, and so go after the check + if(option_flags & COMP_INDEXER_FLAG_INCREMENT) + index += 1 //This makes the first index in a table functionally 0 instead of 1, useful when working with bitwise operations + if(option_flags & COMP_INDEXER_FLAG_LOOP) + index = MODULUS(index - 1, length(list_input)) + 1 //This makes an index that overflows or underflows loop back to the start of end of the list respectively, useful for when you want to continuously loop through the list + + if(isnum(index) && (index < 1 || index > length(list_input))) + output.set_output(null) + return + + calculate_output(index, list_input) + +/obj/item/circuit_component/indexer/proc/calculate_output(var/index, var/list/list_input) + return diff --git a/code/modules/wiremod/components/action/light.dm b/code/modules/wiremod/components/action/light.dm new file mode 100644 index 0000000000000..3dd946503a16c --- /dev/null +++ b/code/modules/wiremod/components/action/light.dm @@ -0,0 +1,77 @@ +/** + * # Light Component + * + * Emits a light of a specific brightness and colour. Requires a shell. + */ +/obj/item/circuit_component/light + display_name = "Light" + display_desc = "A component that emits a light of a specific brightness and colour. Requires a shell." + + /// The colours of the light + var/datum/port/input/red + var/datum/port/input/green + var/datum/port/input/blue + + /// The brightness + var/datum/port/input/brightness + + /// Whether the light is on or not + var/datum/port/input/on + + var/max_power = 5 + var/min_lightness = 0.4 + var/shell_light_color + +/obj/item/circuit_component/light/get_ui_notices() + . = ..() + . += create_ui_notice("Maximum Brightness: [max_power]", "orange", "lightbulb") + +/obj/item/circuit_component/light/Initialize() + . = ..() + red = add_input_port("Red", PORT_TYPE_NUMBER) + green = add_input_port("Green", PORT_TYPE_NUMBER) + blue = add_input_port("Blue", PORT_TYPE_NUMBER) + brightness = add_input_port("Brightness", PORT_TYPE_NUMBER) + + on = add_input_port("On", PORT_TYPE_NUMBER) + + +/obj/item/circuit_component/light/Destroy() + red = null + green = null + blue = null + brightness = null + on = null + return ..() + +/obj/item/circuit_component/light/register_shell(atom/movable/shell) + . = ..() + TRIGGER_CIRCUIT_COMPONENT(src, null) + +/obj/item/circuit_component/light/unregister_shell(atom/movable/shell) + shell.set_light(0, 0) + return ..() + +/obj/item/circuit_component/light/input_received(datum/port/input/port) + . = ..() + brightness.set_input(clamp(brightness.input_value || 0, 0, max_power), FALSE) + red.set_input(clamp(red.input_value, 0, 255), FALSE) + blue.set_input(clamp(blue.input_value, 0, 255), FALSE) + green.set_input(clamp(green.input_value, 0, 255), FALSE) + var/list/hsl = rgb2hsl(red.input_value || 0, green.input_value || 0, blue.input_value || 0) + var/list/light_col = hsl2rgb(hsl[1], hsl[2], max(min_lightness, hsl[3])) + shell_light_color = rgb(light_col[1], light_col[2], light_col[3]) + if(.) + return + + if(parent.shell) + set_atom_light(parent.shell) + +/obj/item/circuit_component/light/proc/set_atom_light(atom/movable/target_atom) + // Clamp anyways just for safety + var/bright_val = min(max(brightness.input_value || 0, 0), max_power) + + if(on.input_value) + target_atom.set_light(bright_val, bright_val, shell_light_color) + else + target_atom.set_light(0, 0) diff --git a/code/modules/wiremod/components/action/mmi.dm b/code/modules/wiremod/components/action/mmi.dm new file mode 100644 index 0000000000000..448a6095d1c57 --- /dev/null +++ b/code/modules/wiremod/components/action/mmi.dm @@ -0,0 +1,183 @@ +/** + * # Man-Machine Interface Component + * + * Allows an MMI to be inserted into a shell, allowing it to be linked up. Requires a shell. + */ +/obj/item/circuit_component/mmi + display_name = "Man-Machine Interface" + display_desc = "A component that allows MMI to enter shells to send output signals." + + /// The message to send to the MMI in the shell. + var/datum/port/input/message + /// Sends the current MMI a message + var/datum/port/input/send + /// Ejects the current MMI + var/datum/port/input/eject + + /// Called when the MMI tries moving north + var/datum/port/output/north + /// Called when the MMI tries moving east + var/datum/port/output/east + /// Called when the MMI tries moving south + var/datum/port/output/south + /// Called when the MMI tries moving west + var/datum/port/output/west + + /// Returns what the MMI last clicked on. + var/datum/port/output/clicked_atom + /// Called when the MMI clicks. + var/datum/port/output/attack + /// Called when the MMI right clicks. + var/datum/port/output/secondary_attack + + /// The current MMI card + var/obj/item/mmi/brain + + /// Maximum length of the message that can be sent to the MMI + var/max_length = 300 + +/obj/item/circuit_component/mmi/Initialize() + . = ..() + message = add_input_port("Message", PORT_TYPE_STRING) + send = add_input_port("Send Message", PORT_TYPE_SIGNAL) + eject = add_input_port("Eject", PORT_TYPE_SIGNAL) + + north = add_output_port("North", PORT_TYPE_SIGNAL) + east = add_output_port("East", PORT_TYPE_SIGNAL) + south = add_output_port("South", PORT_TYPE_SIGNAL) + west = add_output_port("West", PORT_TYPE_SIGNAL) + + attack = add_output_port("Attack", PORT_TYPE_SIGNAL) + secondary_attack = add_output_port("Secondary Attack", PORT_TYPE_SIGNAL) + clicked_atom = add_output_port("Target Entity", PORT_TYPE_ATOM) + +/obj/item/circuit_component/mmi/Destroy() + remove_current_brain() + message = null + send = null + eject = null + north = null + east = null + south = null + west = null + attack = null + secondary_attack = null + clicked_atom = null + return ..() + +/obj/item/circuit_component/mmi/input_received(datum/port/input/port) + . = ..() + if(.) + return + + if(!brain) + return + + if(COMPONENT_TRIGGERED_BY(eject, port)) + remove_current_brain() + if(COMPONENT_TRIGGERED_BY(send, port)) + if(!message.input_value) + return + + var/msg_str = copytext(html_encode(message.input_value), 1, max_length) + + var/mob/living/target = brain.brainmob + if(!target) + return + + to_chat(target, "You hear a message in your ear: [msg_str]") + + +/obj/item/circuit_component/mmi/register_shell(atom/movable/shell) + . = ..() + RegisterSignal(shell, COMSIG_PARENT_ATTACKBY, .proc/handle_attack_by) + +/obj/item/circuit_component/mmi/unregister_shell(atom/movable/shell) + UnregisterSignal(shell, COMSIG_PARENT_ATTACKBY) + remove_current_brain() + return ..() + +/obj/item/circuit_component/mmi/proc/handle_attack_by(atom/movable/shell, obj/item/item, mob/living/attacker) + SIGNAL_HANDLER + if(istype(item, /obj/item/mmi)) + var/obj/item/mmi/target_mmi = item + if(!target_mmi.brainmob) + return + add_mmi(item) + return COMPONENT_NO_AFTERATTACK + +/obj/item/circuit_component/mmi/proc/add_mmi(obj/item/mmi/to_add) + remove_current_brain() + + to_add.forceMove(src) + if(to_add.brainmob) + update_mmi_mob(to_add, null, to_add.brainmob) + brain = to_add + RegisterSignal(to_add, COMSIG_PARENT_QDELETING, .proc/remove_current_brain) + RegisterSignal(to_add, COMSIG_MOVABLE_MOVED, .proc/mmi_moved) + +/obj/item/circuit_component/mmi/proc/mmi_moved(atom/movable/mmi) + if(mmi.loc != src) + remove_current_brain() + +/obj/item/circuit_component/mmi/proc/remove_current_brain() + SIGNAL_HANDLER + if(!brain) + return + + if(brain.brainmob) + update_mmi_mob(brain, brain.brainmob) + UnregisterSignal(brain, list( + COMSIG_PARENT_QDELETING, + COMSIG_MOVABLE_MOVED + )) + if(brain.loc == src) + brain.forceMove(drop_location()) + brain = null + +/obj/item/circuit_component/mmi/proc/update_mmi_mob(datum/source, mob/living/old_mmi, mob/living/new_mmi) + SIGNAL_HANDLER + if(old_mmi) + old_mmi.remote_control = null + UnregisterSignal(old_mmi, COMSIG_MOB_CLICKON) + if(new_mmi) + new_mmi.remote_control = src + RegisterSignal(new_mmi, COMSIG_MOB_CLICKON, .proc/handle_mmi_attack) + +/obj/item/circuit_component/mmi/relaymove(mob/living/user, direct) + if(user != brain.brainmob) + return ..() + + if(direct & NORTH) + north.set_output(COMPONENT_SIGNAL) + if(direct & WEST) + west.set_output(COMPONENT_SIGNAL) + if(direct & EAST) + east.set_output(COMPONENT_SIGNAL) + if(direct & SOUTH) + south.set_output(COMPONENT_SIGNAL) + + return TRUE + +/obj/item/circuit_component/mmi/proc/handle_mmi_attack(mob/living/source, atom/target) + SIGNAL_HANDLER + + if(source.a_intent == INTENT_HARM) + clicked_atom.set_output(target) + secondary_attack.set_output(COMPONENT_SIGNAL) + . = COMSIG_MOB_CANCEL_CLICKON + else + clicked_atom.set_output(target) + attack.set_output(COMPONENT_SIGNAL) + . = COMSIG_MOB_CANCEL_CLICKON + +/obj/item/circuit_component/mmi/add_to(obj/item/integrated_circuit/add_to) + . = ..() + if(HAS_TRAIT(add_to, TRAIT_COMPONENT_MMI)) + return FALSE + ADD_TRAIT(add_to, TRAIT_COMPONENT_MMI, src) + +/obj/item/circuit_component/mmi/removed_from(obj/item/integrated_circuit/removed_from) + REMOVE_TRAIT(removed_from, TRAIT_COMPONENT_MMI, src) + remove_current_brain() + return ..() diff --git a/code/modules/wiremod/components/action/pull.dm b/code/modules/wiremod/components/action/pull.dm new file mode 100644 index 0000000000000..e10c71dc57eb2 --- /dev/null +++ b/code/modules/wiremod/components/action/pull.dm @@ -0,0 +1,35 @@ +/** + * # Pull Component + * + * Tells the shell to start pulling on a designated atom. Only works on movable shells. + */ +/obj/item/circuit_component/pull + display_name = "Start Pulling" + display_desc = "A component that can force the shell to pull entities. Only works for drone shells." + + /// Frequency input + var/datum/port/input/target + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/pull/Initialize() + . = ..() + target = add_input_port("Target", PORT_TYPE_ATOM) + +/obj/item/circuit_component/pull/Destroy() + target = null + return ..() + +/obj/item/circuit_component/pull/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/atom/target_atom = target.input_value + if(!target_atom) + return + + var/mob/shell = parent.shell + if(!istype(shell) || get_dist(shell, target_atom) > 1 || shell.z != target_atom.z) + return + + shell.start_pulling(target_atom) diff --git a/code/modules/wiremod/components/action/radio.dm b/code/modules/wiremod/components/action/radio.dm new file mode 100644 index 0000000000000..487e858e04aab --- /dev/null +++ b/code/modules/wiremod/components/action/radio.dm @@ -0,0 +1,68 @@ +/** + * # Radio Component + * + * Listens out for signals on the designated frequencies and sends signals on designated frequencies + */ +/obj/item/circuit_component/radio + display_name = "Radio" + display_desc = "A component that can listen and send frequencies. If set to private, the component will only receive signals from other components attached to circuitboards with the same owner id." + /// Frequency input + var/datum/port/input/freq + /// Signal input + var/datum/port/input/code + + /// Current frequency value + var/current_freq = DEFAULT_SIGNALER_CODE + + var/datum/radio_frequency/radio_connection + +/obj/item/circuit_component/radio/populate_options() + var/static/component_options = list( + COMP_RADIO_PUBLIC, + COMP_RADIO_PRIVATE, + ) + options = component_options + +/obj/item/circuit_component/radio/Initialize() + . = ..() + freq = add_input_port("Frequency", PORT_TYPE_NUMBER, default = FREQ_SIGNALER) + code = add_input_port("Code", PORT_TYPE_NUMBER, default = DEFAULT_SIGNALER_CODE) + TRIGGER_CIRCUIT_COMPONENT(src, null) + // These are cleaned up on the parent + trigger_input = add_input_port("Send", PORT_TYPE_SIGNAL) + trigger_output = add_output_port("Received", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/radio/Destroy() + freq = null + code = null + SSradio.remove_object(src, current_freq) + radio_connection = null + return ..() + +/obj/item/circuit_component/radio/input_received(datum/port/input/port) + . = ..() + freq.set_input(sanitize_frequency(freq.input_value, TRUE), FALSE) + if(.) + return + var/frequency = freq.input_value + + SSradio.remove_object(src, current_freq) + radio_connection = SSradio.add_object(src, frequency, RADIO_SIGNALER) + current_freq = frequency + + if(COMPONENT_TRIGGERED_BY(trigger_input, port)) + var/datum/signal/signal = new(list("code" = round(code.input_value) || 0, "key" = parent?.owner_id)) + radio_connection.post_signal(src, signal) + +/obj/item/circuit_component/radio/receive_signal(datum/signal/signal) + . = FALSE + if(!signal) + return + + if(signal.data["code"] != round(code.input_value || 0)) + return + + if(current_option == COMP_RADIO_PRIVATE && parent?.owner_id != signal.data["key"]) + return + + trigger_output.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/wiremod/components/action/soundemitter.dm b/code/modules/wiremod/components/action/soundemitter.dm new file mode 100644 index 0000000000000..ab12455314b64 --- /dev/null +++ b/code/modules/wiremod/components/action/soundemitter.dm @@ -0,0 +1,81 @@ +/** + * # Sound Emitter Component + * + * A component that emits a sound when it receives an input. + */ +/obj/item/circuit_component/soundemitter + display_name = "Sound Emitter" + display_desc = "A component that emits a sound when it receives an input. The frequency is a multiplier which determines the speed at which the sound is played" + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + /// Volume of the sound when played + var/datum/port/input/volume + + /// Frequency of the sound when played + var/datum/port/input/frequency + + /// The cooldown for this component of how often it can play sounds. + var/sound_cooldown = 2 SECONDS + + var/list/options_map + + COOLDOWN_DECLARE(next_sound) + +/obj/item/circuit_component/soundemitter/get_ui_notices() + . = ..() + . += create_ui_notice("Sound Cooldown: [DisplayTimeText(sound_cooldown)]", "orange", "stopwatch") + + +/obj/item/circuit_component/soundemitter/Initialize() + . = ..() + volume = add_input_port("Volume", PORT_TYPE_NUMBER, default = 35) + frequency = add_input_port("Frequency", PORT_TYPE_NUMBER, default = 0) + +/obj/item/circuit_component/soundemitter/Destroy() + frequency = null + volume = null + return ..() + +/obj/item/circuit_component/soundemitter/populate_options() + var/static/component_options = list( + COMP_SOUND_BUZZ, + COMP_SOUND_BUZZ_TWO, + COMP_SOUND_CHIME, + COMP_SOUND_HONK, + COMP_SOUND_PING, + COMP_SOUND_SAD, + COMP_SOUND_WARN, + COMP_SOUND_SLOWCLAP, + ) + options = component_options + + var/static/options_to_sound = list( + COMP_SOUND_BUZZ = 'sound/machines/buzz-sigh.ogg', + COMP_SOUND_BUZZ_TWO = 'sound/machines/buzz-two.ogg', + COMP_SOUND_CHIME = 'sound/machines/chime.ogg', + COMP_SOUND_HONK = 'sound/items/bikehorn.ogg', + COMP_SOUND_PING = 'sound/machines/ping.ogg', + COMP_SOUND_SAD = 'sound/misc/sadtrombone.ogg', + COMP_SOUND_WARN = 'sound/machines/warning-buzzer.ogg', + COMP_SOUND_SLOWCLAP = 'sound/machines/slowclap.ogg', + ) + options_map = options_to_sound + + +/obj/item/circuit_component/soundemitter/input_received(datum/port/input/port) + . = ..() + volume.set_input(clamp(volume.input_value, 0, 100), FALSE) + frequency.set_input(clamp(frequency.input_value, -100, 100), FALSE) + if(.) + return + + if(!COOLDOWN_FINISHED(src, next_sound)) + return + + var/sound_to_play = options_map[current_option] + if(!sound_to_play) + return + + playsound(src, sound_to_play, volume.input_value, FALSE, frequency = frequency.input_value) + + COOLDOWN_START(src, next_sound, sound_cooldown) diff --git a/code/modules/wiremod/components/action/speech.dm b/code/modules/wiremod/components/action/speech.dm new file mode 100644 index 0000000000000..41dd3d2f31cd4 --- /dev/null +++ b/code/modules/wiremod/components/action/speech.dm @@ -0,0 +1,54 @@ +/** + * # Speech Component + * + * Sends a message. Requires a shell. + */ +/obj/item/circuit_component/speech + display_name = "Speech" + display_desc = "A component that sends a message. Requires a shell." + + /// The message to send + var/datum/port/input/message + /// The trigger to send the message + var/datum/port/input/trigger + + /// The cooldown for this component of how often it can send speech messages. + var/speech_cooldown = 1 SECONDS + + COOLDOWN_DECLARE(next_speech) + +/obj/item/circuit_component/speech/get_ui_notices() + . = ..() + . += create_ui_notice("Speech Cooldown: [DisplayTimeText(speech_cooldown)]", "orange", "stopwatch") + +/obj/item/circuit_component/speech/Initialize() + . = ..() + message = add_input_port("Message", PORT_TYPE_STRING, FALSE) + + trigger = add_input_port("Trigger", PORT_TYPE_SIGNAL) + + +/obj/item/circuit_component/speech/Destroy() + message = null + trigger = null + return ..() + +/obj/item/circuit_component/speech/input_received(datum/port/input/port) + . = ..() + if(.) + return + + if(!COMPONENT_TRIGGERED_BY(trigger, port)) + return + + if(!COOLDOWN_FINISHED(src, next_speech)) + return + + if(message.input_value) + var/atom/movable/shell = parent.shell + // Prevents appear as the individual component if there is a shell. + if(shell) + shell.say(message.input_value) + else + say(message.input_value) + COOLDOWN_START(src, next_speech, speech_cooldown) diff --git a/code/modules/wiremod/components/atom/direction.dm b/code/modules/wiremod/components/atom/direction.dm new file mode 100644 index 0000000000000..c283b70ca9944 --- /dev/null +++ b/code/modules/wiremod/components/atom/direction.dm @@ -0,0 +1,71 @@ +/** + * # Direction Component + * + * Return the direction of a mob relative to the component + */ +/obj/item/circuit_component/direction + display_name = "Get Direction" + display_desc = "A component that returns the direction of itself and an entity." + + /// The input port + var/datum/port/input/input_port + + /// The result from the output + var/datum/port/output/output + + // Directions outputs + var/datum/port/output/north + var/datum/port/output/south + var/datum/port/output/east + var/datum/port/output/west + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + /// Maximum range for a valid direction to be returned + var/max_range = 7 + +/obj/item/circuit_component/direction/get_ui_notices() + . = ..() + . += create_ui_notice("Maximum Range: [max_range] tiles", "orange", "info") + +/obj/item/circuit_component/direction/Initialize() + . = ..() + input_port = add_input_port("Organism", PORT_TYPE_ATOM) + + output = add_output_port("Direction", PORT_TYPE_STRING) + + north = add_output_port("North", PORT_TYPE_SIGNAL) + east = add_output_port("East", PORT_TYPE_SIGNAL) + south = add_output_port("South", PORT_TYPE_SIGNAL) + west = add_output_port("West", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/direction/Destroy() + input_port = null + output = null + return ..() + +/obj/item/circuit_component/direction/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/atom/object = input_port.input_value + if(!object) + return + var/turf/location = get_turf(src) + + if(object.z != location.z || get_dist(location, object) > max_range) + output.set_output(null) + return + + var/direction = get_dir(location, get_turf(object)) + output.set_output(dir2text(direction)) + + if(direction & NORTH) + north.set_output(COMPONENT_SIGNAL) + if(direction & SOUTH) + south.set_output(COMPONENT_SIGNAL) + if(direction & EAST) + east.set_output(COMPONENT_SIGNAL) + if(direction & WEST) + west.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/wiremod/components/atom/gps.dm b/code/modules/wiremod/components/atom/gps.dm new file mode 100644 index 0000000000000..f2113d9e4f922 --- /dev/null +++ b/code/modules/wiremod/components/atom/gps.dm @@ -0,0 +1,39 @@ +/** + * # GPS Component + * + * Return the location of this + */ +/obj/item/circuit_component/gps + display_name = "Internal GPS" + display_desc = "A component that returns the xyz co-ordinates of itself." + + /// The result from the output + var/datum/port/output/x_pos + var/datum/port/output/y_pos + var/datum/port/output/z_pos + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/gps/Initialize() + . = ..() + + x_pos = add_output_port("X", PORT_TYPE_NUMBER) + y_pos = add_output_port("Y", PORT_TYPE_NUMBER) + z_pos = add_output_port("Z", PORT_TYPE_NUMBER) + +/obj/item/circuit_component/gps/Destroy() + x_pos = null + y_pos = null + z_pos = null + return ..() + +/obj/item/circuit_component/gps/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/turf/location = get_turf(src) + + x_pos.set_output(location?.x) + y_pos.set_output(location?.y) + z_pos.set_output(location?.z) diff --git a/code/modules/wiremod/components/atom/health.dm b/code/modules/wiremod/components/atom/health.dm new file mode 100644 index 0000000000000..8f1cc4423c180 --- /dev/null +++ b/code/modules/wiremod/components/atom/health.dm @@ -0,0 +1,70 @@ +/** + * # Get Health Component + * + * Return the health of a mob + */ +/obj/item/circuit_component/health + display_name = "Get Health" + display_desc = "A component that returns the health of an organism." + + /// The input port + var/datum/port/input/input_port + + /// Brute damage + var/datum/port/output/brute + /// Burn damage + var/datum/port/output/burn + /// Toxin damage + var/datum/port/output/toxin + /// Oxyloss damage + var/datum/port/output/oxy + /// Health + var/datum/port/output/health + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + var/max_range = 5 + +/obj/item/circuit_component/health/get_ui_notices() + . = ..() + . += create_ui_notice("Maximum Range: [max_range] tiles", "orange", "info") + +/obj/item/circuit_component/health/Initialize() + . = ..() + input_port = add_input_port("Organism", PORT_TYPE_ATOM) + + brute = add_output_port("Brute Damage", PORT_TYPE_NUMBER) + burn = add_output_port("Burn Damage", PORT_TYPE_NUMBER) + toxin = add_output_port("Toxin Damage", PORT_TYPE_NUMBER) + oxy = add_output_port("Suffocation Damage", PORT_TYPE_NUMBER) + health = add_output_port("Health", PORT_TYPE_NUMBER) + +/obj/item/circuit_component/health/Destroy() + input_port = null + brute = null + burn = null + toxin = null + oxy = null + health = null + return ..() + +/obj/item/circuit_component/health/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/mob/living/organism = input_port.input_value + var/turf/current_turf = get_turf(src) + if(!istype(organism) || get_dist(current_turf, organism) > max_range || current_turf.z != organism.z) + brute.set_output(null) + burn.set_output(null) + toxin.set_output(null) + oxy.set_output(null) + health.set_output(null) + return + + brute.set_output(organism.getBruteLoss()) + burn.set_output(organism.getFireLoss()) + toxin.set_output(organism.getToxLoss()) + oxy.set_output(organism.getOxyLoss()) + health.set_output(organism.health) diff --git a/code/modules/wiremod/components/atom/hear.dm b/code/modules/wiremod/components/atom/hear.dm new file mode 100644 index 0000000000000..a8e3d9170478b --- /dev/null +++ b/code/modules/wiremod/components/atom/hear.dm @@ -0,0 +1,44 @@ +/** + * # Hear Component + * + * Listens for messages. Requires a shell. + */ +/obj/item/circuit_component/hear + display_name = "Voice Activator" + display_desc = "A component that listens for messages. Requires a shell." + + /// The message heard + var/datum/port/output/message_port + /// The language heard + var/datum/port/output/language_port + /// The speaker + var/datum/port/output/speaker_port + /// The trigger sent when this event occurs + var/datum/port/output/trigger_port + +/obj/item/circuit_component/hear/Initialize() + . = ..() + message_port = add_output_port("Message", PORT_TYPE_STRING) + language_port = add_output_port("Language", PORT_TYPE_STRING) + speaker_port = add_output_port("Speaker", PORT_TYPE_ATOM) + trigger_port = add_output_port("Triggered", PORT_TYPE_SIGNAL) + become_hearing_sensitive(ROUNDSTART_TRAIT) + + + +/obj/item/circuit_component/hear/Destroy() + message_port = null + language_port = null + speaker_port = null + trigger_port = null + return ..() + +/obj/item/circuit_component/hear/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods) + if(speaker == parent?.shell) + return + + message_port.set_output(raw_message) + if(message_language) + language_port.set_output(initial(message_language.name)) + speaker_port.set_output(speaker) + trigger_port.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/wiremod/components/atom/self.dm b/code/modules/wiremod/components/atom/self.dm new file mode 100644 index 0000000000000..364d51cd6d694 --- /dev/null +++ b/code/modules/wiremod/components/atom/self.dm @@ -0,0 +1,25 @@ +/** + * # Self Component + * + * Return the current shell. + */ +/obj/item/circuit_component/self + display_name = "Self" + display_desc = "A component that returns the current shell." + + /// The shell this component is attached to. + var/datum/port/output/output + +/obj/item/circuit_component/self/Initialize() + . = ..() + output = add_output_port("Self", PORT_TYPE_ATOM) + +/obj/item/circuit_component/self/Destroy() + output = null + return ..() + +/obj/item/circuit_component/self/register_shell(atom/movable/shell) + output.set_output(shell) + +/obj/item/circuit_component/self/unregister_shell(atom/movable/shell) + output.set_output(null) diff --git a/code/modules/wiremod/components/atom/species.dm b/code/modules/wiremod/components/atom/species.dm new file mode 100644 index 0000000000000..0275e7001f983 --- /dev/null +++ b/code/modules/wiremod/components/atom/species.dm @@ -0,0 +1,39 @@ +/** + * # Get Species Component + * + * Return the species of a mob + */ +/obj/item/circuit_component/species + display_name = "Get Species" + display_desc = "A component that returns the species of its input." + + /// The input port + var/datum/port/input/input_port + + /// The result from the output + var/datum/port/output/output + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/species/Initialize() + . = ..() + input_port = add_input_port("Organism", PORT_TYPE_ATOM) + + output = add_output_port("Species", PORT_TYPE_STRING) + +/obj/item/circuit_component/species/Destroy() + input_port = null + output = null + return ..() + +/obj/item/circuit_component/species/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/mob/living/carbon/human/human = input_port.input_value + if(!istype(human) || !human.has_dna()) + output.set_output(null) + return + + output.set_output(human.dna.species.name) diff --git a/code/modules/wiremod/components/list/append.dm b/code/modules/wiremod/components/list/append.dm new file mode 100644 index 0000000000000..5f2109edfe6da --- /dev/null +++ b/code/modules/wiremod/components/list/append.dm @@ -0,0 +1,50 @@ +/*** +* Append Component +* +* Appends a value onto a list, increasing its size by 1 +***/ +/obj/item/circuit_component/append + display_name = "Append Component" + display_desc = "A component that appends a value to a list." + + //Input ports + var/datum/port/input/list_port + var/datum/port/input/value_port + + //Output port + var/datum/port/output/output + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/append/Initialize() + . = ..() + list_port = add_input_port("List", PORT_TYPE_LIST) + value_port = add_input_port("Value", PORT_TYPE_ANY) + + output = add_output_port("New List", PORT_TYPE_LIST) + +/obj/item/circuit_component/append/Destroy() + list_port = null + value_port = null + output = null + return ..() + +/obj/item/circuit_component/append/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/value = value_port.input_value + var/list/input_list = list_port.input_value + input_list = input_list?.Copy() //input_value of an input port isn't typecasted to a list, so it doesn't reconize Copy() until you put it in a typed var + + //appending a null value onto a list is a reasonable thing to do if the goal is only to change the length of the list, therefore, isnull(value) isn't checked + if(isnull(input_list)) + output.set_output(null) + return + + if(input_list.len < COMPONENT_MAXIMUM_LIST_SIZE) //Prevents lists from growing too large + input_list += value + output.set_output(input_list) + + diff --git a/code/modules/wiremod/components/list/concat.dm b/code/modules/wiremod/components/list/concat.dm new file mode 100644 index 0000000000000..8b63be42429e3 --- /dev/null +++ b/code/modules/wiremod/components/list/concat.dm @@ -0,0 +1,53 @@ +/** + * # Concat List Component + * + * Concatenates a list with a separator + */ +/obj/item/circuit_component/concat_list + display_name = "Concatenate List" + display_desc = "A component that joins up a list with a separator into a single string." + + /// The input port + var/datum/port/input/list_port + + /// The seperator + var/datum/port/input/separator + + /// The result from the output + var/datum/port/output/output + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/concat_list/Initialize() + . = ..() + list_port = add_input_port("List", PORT_TYPE_LIST) + separator = add_input_port("Seperator", PORT_TYPE_STRING) + + output = add_output_port("Output", PORT_TYPE_STRING) + +/obj/item/circuit_component/concat_list/Destroy() + list_port = null + separator = null + output = null + return ..() + +/obj/item/circuit_component/concat_list/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/seperator = separator.input_value + if(!seperator) + return + + var/list/list_input = list_port.input_value + if(!list_input) + return + + var/list/text_list = list() + for(var/entry in list_input) + if(isatom(entry)) + text_list += PORT_TYPE_ATOM + else + text_list += "[entry]" + + output.set_output(text_list.Join(seperator)) diff --git a/code/modules/wiremod/components/list/get_column.dm b/code/modules/wiremod/components/list/get_column.dm new file mode 100644 index 0000000000000..fac219ab24949 --- /dev/null +++ b/code/modules/wiremod/components/list/get_column.dm @@ -0,0 +1,48 @@ +/** + * # Get Column Component + * + * Gets the column of a table and returns it as a regular list. + */ +/obj/item/circuit_component/get_column + display_name = "Get Column" + display_desc = "Gets the column of a table and returns it as a regular list." + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + /// The list to perform the filter on + var/datum/port/input/received_table + + /// The name of the column to check + var/datum/port/input/column_name + + /// The filtered list + var/datum/port/output/output_list + +/obj/item/circuit_component/get_column/Initialize() + . = ..() + received_table = add_input_port("Input", PORT_TYPE_TABLE) + column_name = add_input_port("Column Name", PORT_TYPE_STRING) + output_list = add_output_port("Output", PORT_TYPE_LIST) + +/obj/item/circuit_component/get_column/Destroy() + received_table = null + column_name = null + output_list = null + return ..() + +/obj/item/circuit_component/get_column/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/list/input_list = received_table.input_value + if(!islist(input_list) || isnum(column_name.input_value)) + return + + var/list/new_list = list() + for(var/list/entry in input_list) + var/anything = entry[column_name.input_value] + if(islist(anything)) + continue + new_list += anything + + output_list.set_output(new_list) diff --git a/code/modules/wiremod/components/list/index.dm b/code/modules/wiremod/components/list/index.dm new file mode 100644 index 0000000000000..24416829d2949 --- /dev/null +++ b/code/modules/wiremod/components/list/index.dm @@ -0,0 +1,16 @@ +/** + * # Index Component + * + * Return the index of a list + */ +/obj/item/circuit_component/indexer/index + display_name = "Index List" + display_desc = "A component that returns the value of a list at a given index." + + /// The result from the output + output_name = "Value" + output_port_type = PORT_TYPE_ANY + +/obj/item/circuit_component/indexer/index/calculate_output(var/index, var/list/list_input) + + output.set_output(list_input[index]) diff --git a/code/modules/wiremod/components/list/index_table.dm b/code/modules/wiremod/components/list/index_table.dm new file mode 100644 index 0000000000000..9bfe8b70945a8 --- /dev/null +++ b/code/modules/wiremod/components/list/index_table.dm @@ -0,0 +1,48 @@ +/** + * # Index Table Component + * + * Gets the row of a table using the index inputted. Will return no value if the index is invalid or a proper table is not returned. + */ +/obj/item/circuit_component/index_table + display_name = "Index Table" + display_desc = "Gets the row of a table using the index inputted. Will return no value if the index is invalid or a proper table is not returned." + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + /// The list to perform the filter on + var/datum/port/input/received_table + + /// The target index + var/datum/port/input/target_index + + /// The filtered list + var/datum/port/output/output_list + +/obj/item/circuit_component/index_table/Initialize() + . = ..() + received_table = add_input_port("Input", PORT_TYPE_TABLE) + target_index = add_input_port("Index", PORT_TYPE_NUMBER) + + output_list = add_output_port("Output", PORT_TYPE_TABLE) + +/obj/item/circuit_component/index_table/Destroy() + received_table = null + target_index = null + output_list = null + return ..() + +/obj/item/circuit_component/index_table/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/list/target_list = received_table.input_value + if(!islist(target_list) || !length(target_list)) + output_list.set_output(null) + return + + var/index = target_index.input_value + if(index < 1 || index > length(target_list)) + output_list.set_output(null) + return + + output_list.set_output(target_list[index]) diff --git a/code/modules/wiremod/components/list/list_constructor.dm b/code/modules/wiremod/components/list/list_constructor.dm new file mode 100644 index 0000000000000..7b9631f83a7b3 --- /dev/null +++ b/code/modules/wiremod/components/list/list_constructor.dm @@ -0,0 +1,24 @@ +/** +* List Constructor Component +* +* This component allows the construction of a list from other data +**/ + +/obj/item/circuit_component/arbitrary_input_amount/list_constructor + display_name = "List Constructor" + display_desc = "A component that creates a list from given inputs" + + power_usage_per_input = 5 //Large cost + + //Takes any inputs, makes a list out of them + input_port_type = PORT_TYPE_ANY + output_port_type = PORT_TYPE_LIST + + //This can be changed to whatever value is wanted + input_port_amount = 4 + +/obj/item/circuit_component/arbitrary_input_amount/list_constructor/calculate_output(datum/port/input/port, datum/port/input/first_port, list/ports) + . = list() + . += first_port.input_value + for(var/datum/port/input/input_port as anything in ports) + . += input_port.input_value diff --git a/code/modules/wiremod/components/list/list_length_constructor.dm b/code/modules/wiremod/components/list/list_length_constructor.dm new file mode 100644 index 0000000000000..423e6a02b81aa --- /dev/null +++ b/code/modules/wiremod/components/list/list_length_constructor.dm @@ -0,0 +1,44 @@ +/*** +* List Length Constructor +* +* Constructs an empty list with specified length +***/ + + +/obj/item/circuit_component/list_length_constructor + display_name = "List Length Constructor" + display_desc = "A varient of the list constructor that makes an emtpy list with a specified length" + + power_usage_per_input = 10 //B I G cost + + //A specified length + var/datum/port/input/input_length + + //The constructed list + var/datum/port/output/output_port + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/list_length_constructor/Initialize() + . = ..() + input_length = add_input_port("Length", PORT_TYPE_NUMBER) + output_port = add_output_port("Output", PORT_TYPE_LIST) + +/obj/item/circuit_component/list_length_constructor/Destroy() + input_length = null + output_port = null + + return ..() + +/obj/item/circuit_component/list_length_constructor/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/length = input_length.input_value + var/list/new_list = null + if(length > COMPONENT_MAXIMUM_LIST_SIZE) + length = COMPONENT_MAXIMUM_LIST_SIZE + if(length >= 0) + new_list = new /list(length) + output_port.set_output(new_list) diff --git a/code/modules/wiremod/components/list/pop.dm b/code/modules/wiremod/components/list/pop.dm new file mode 100644 index 0000000000000..2e418e935941f --- /dev/null +++ b/code/modules/wiremod/components/list/pop.dm @@ -0,0 +1,56 @@ +/*** +* Pop Component +* +* Pops the last entry of a list off as if it were a stack or retrieves the first entry like a queue. +***/ + +/obj/item/circuit_component/pop + display_name = "Pop Component" + display_desc = "Removes the last or first entry of a list and returns it." + + //The list port + var/datum/port/input/list_port + + //The output + var/datum/port/output/output_value + var/datum/port/output/output_list + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/pop/populate_options() + options = list( + COMP_POP_POP, + COMP_POP_DEQUEUE + ) + + +/obj/item/circuit_component/pop/Initialize() + . = ..() + list_port = add_input_port("List", PORT_TYPE_LIST) + output_list = add_output_port("New List", PORT_TYPE_LIST) + output_value = add_output_port("Value", PORT_TYPE_ANY) + +/obj/item/circuit_component/pop/Destroy() + list_port = null + output_value = null + output_list = null + return ..() + +/obj/item/circuit_component/pop/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/list/input_list = list_port.input_value + input_list = input_list?.Copy() //Same as in the append component + var/result = null + + if(input_list) + switch(current_option) + if(COMP_POP_POP) + result = pop(input_list) + if(COMP_POP_DEQUEUE) + result = popleft(input_list) + + output_value.set_output(result) + output_list.set_output(input_list) diff --git a/code/modules/wiremod/components/list/select.dm b/code/modules/wiremod/components/list/select.dm new file mode 100644 index 0000000000000..76eaf67b4085f --- /dev/null +++ b/code/modules/wiremod/components/list/select.dm @@ -0,0 +1,96 @@ +/** + * # Select Component + * + * Selects a list from a list of lists by a specific column. Used only by USBs for communications to and from computers with lists of varying sizes. + */ +/obj/item/circuit_component/select + display_name = "Select Query" + display_desc = "A component used with USB cables that can perform select queries on a list based on the column name selected. The values are then compared with the comparison input." + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + /// The list to perform the filter on + var/datum/port/input/received_table + + /// The name of the column to check + var/datum/port/input/column_name + + /// The input to compare with + var/datum/port/input/comparison_input + + /// The filtered list + var/datum/port/output/filtered_table + + var/current_type = PORT_TYPE_ANY + +/obj/item/circuit_component/select/populate_options() + var/static/component_options = list( + COMP_COMPARISON_EQUAL, + COMP_COMPARISON_NOT_EQUAL, + COMP_COMPARISON_GREATER_THAN, + COMP_COMPARISON_LESS_THAN, + COMP_COMPARISON_GREATER_THAN_OR_EQUAL, + COMP_COMPARISON_LESS_THAN_OR_EQUAL, + ) + options = component_options + +/obj/item/circuit_component/select/Initialize() + . = ..() + received_table = add_input_port("Input", PORT_TYPE_TABLE) + column_name = add_input_port("Column Name", PORT_TYPE_STRING) + comparison_input = add_input_port("Comparison Input", PORT_TYPE_ANY) + + filtered_table = add_output_port("Output", PORT_TYPE_TABLE) + +/obj/item/circuit_component/select/Destroy() + received_table = null + column_name = null + comparison_input = null + filtered_table = null + return ..() + +/obj/item/circuit_component/select/input_received(datum/port/input/port) + . = ..() + switch(current_option) + if(COMP_COMPARISON_EQUAL, COMP_COMPARISON_NOT_EQUAL) + if(current_type != PORT_TYPE_ANY) + current_type = PORT_TYPE_ANY + comparison_input.set_datatype(PORT_TYPE_ANY) + else + if(current_type != PORT_TYPE_NUMBER) + current_type = PORT_TYPE_NUMBER + comparison_input.set_datatype(PORT_TYPE_NUMBER) + + if(.) + return + + var/list/input_list = received_table.input_value + if(!islist(input_list) || isnum(column_name.input_value)) + return + + var/comparison_value = comparison_input.input_value + var/list/new_list = list() + for(var/list/entry in input_list) + var/anything = entry[column_name.input_value] + if(islist(anything)) + continue + if(current_option != COMP_COMPARISON_EQUAL && current_option != COMP_COMPARISON_NOT_EQUAL && !isnum(anything)) + continue + var/add_to_list = FALSE + switch(current_option) + if(COMP_COMPARISON_EQUAL) + add_to_list = anything == comparison_value + if(COMP_COMPARISON_NOT_EQUAL) + add_to_list = anything != comparison_value + if(COMP_COMPARISON_GREATER_THAN) + add_to_list = anything > comparison_value + if(COMP_COMPARISON_GREATER_THAN_OR_EQUAL) + add_to_list = anything >= comparison_value + if(COMP_COMPARISON_LESS_THAN) + add_to_list = anything < comparison_value + if(COMP_COMPARISON_LESS_THAN_OR_EQUAL) + add_to_list = anything <= comparison_value + + if(add_to_list) + new_list += list(entry) + + filtered_table.set_output(new_list) diff --git a/code/modules/wiremod/components/list/write.dm b/code/modules/wiremod/components/list/write.dm new file mode 100644 index 0000000000000..52d9881f108d3 --- /dev/null +++ b/code/modules/wiremod/components/list/write.dm @@ -0,0 +1,28 @@ +/** +* Write Component +* +* Writes the given value to the specified index of a given table +**/ +/obj/item/circuit_component/indexer/write + display_name = "Write Component" + display_desc = "A component that writes a given value to a given index in a given list. It then gives that new list back." + + /// The input ports + var/datum/port/input/value_port + + /// The result from the output + output_name = "New List" + output_port_type = PORT_TYPE_LIST + +/obj/item/circuit_component/indexer/write/Initialize() + . = ..() + value_port = add_input_port("Value", PORT_TYPE_ANY) + +/obj/item/circuit_component/indexer/write/Destroy() + value_port = null + return ..() + +/obj/item/circuit_component/indexer/write/calculate_output(var/index, var/list/list_input) + list_input[index] = value_port.input_value + output.set_output(list_input) + diff --git a/code/modules/wiremod/components/math/arithmetic.dm b/code/modules/wiremod/components/math/arithmetic.dm new file mode 100644 index 0000000000000..116929d26a57a --- /dev/null +++ b/code/modules/wiremod/components/math/arithmetic.dm @@ -0,0 +1,62 @@ +/** + * # Arithmetic Component + * + * General arithmetic unit with add/sub/mult/divide capabilities + * This one only works with numbers. + */ +/obj/item/circuit_component/arbitrary_input_amount/arithmetic + display_name = "Arithmetic" + display_desc = "General arithmetic component with arithmetic capabilities." + + //The type of port + input_port_type = PORT_TYPE_NUMBER + output_port_type = PORT_TYPE_NUMBER + + /// The amount of input ports to have + input_port_amount = 4 + +/obj/item/circuit_component/arbitrary_input_amount/arithmetic/populate_options() + options = list( + COMP_ARITHMETIC_ADD, + COMP_ARITHMETIC_SUBTRACT, + COMP_ARITHMETIC_MULTIPLY, + COMP_ARITHMETIC_DIVIDE, + COMP_ARITHMETIC_MODULO, + COMP_ARITHMETIC_MIN, + COMP_ARITHMETIC_MAX, + ) + +/obj/item/circuit_component/arbitrary_input_amount/arithmetic/calculate_output(datum/port/input/port, datum/port/input/first_port, list/ports) + + . = first_port.input_value + + for(var/datum/port/input/input_port as anything in ports) + var/value = input_port.input_value + if(isnull(value)) + continue + + switch(current_option) + if(COMP_ARITHMETIC_ADD) + . += value + if(COMP_ARITHMETIC_SUBTRACT) + . -= value + if(COMP_ARITHMETIC_MULTIPLY) + . *= value + if(COMP_ARITHMETIC_DIVIDE) + // Protect from div by zero errors. + if(value == 0) + . = null + break + . /= value + if(COMP_ARITHMETIC_MODULO) + //Another protect from divide by zero. + if(value == 0) + . = null + break + //BYOND's built in modulus operator doesn't work well with decimals, so I'm using this method instead + var/multiples = FLOOR(. / value, 1) + . -= multiples * value + if(COMP_ARITHMETIC_MAX) + . = max(., value) + if(COMP_ARITHMETIC_MIN) + . = min(., value) diff --git a/code/modules/wiremod/components/math/bitflag.dm b/code/modules/wiremod/components/math/bitflag.dm new file mode 100644 index 0000000000000..dbcadb01601f5 --- /dev/null +++ b/code/modules/wiremod/components/math/bitflag.dm @@ -0,0 +1,40 @@ +/* + +bitflag component + +This is a component that checks if a specific bit in a number is a one or zero. +Its best use is to combine it with the bitwise component to put multiple booleans in one number. + +*/ + + +/obj/item/circuit_component/compare/bitflag + display_name = "Bitflag" + display_desc = "A component that can determine if a specified bit of a number is on or off." + + //default compare ports aren't used + input_port_amount = 0 + + //The number containing the flags + var/datum/port/input/input + //The bit that needs to be checked + var/datum/port/input/bit + +/obj/item/circuit_component/compare/bitflag/load_custom_ports() + input = add_input_port("Input", PORT_TYPE_NUMBER) + bit = add_input_port("Bit", PORT_TYPE_NUMBER) + +/obj/item/circuit_component/compare/bitflag/Destroy() + input = null + bit = null + return ..() + +/obj/item/circuit_component/compare/bitflag/do_comparisons(list/ports) + + var/value = round(input.input_value) + var/bit_value = round(bit.input_value) + + return (value >> bit_value) & 1 + + + diff --git a/code/modules/wiremod/components/math/bitwise.dm b/code/modules/wiremod/components/math/bitwise.dm new file mode 100644 index 0000000000000..674b3cedf0a2e --- /dev/null +++ b/code/modules/wiremod/components/math/bitwise.dm @@ -0,0 +1,48 @@ +/** + * # Bitwise Component + * + * A component that preforms bitwise and, or and xor operations, as well as left shifts and right shifts + * All input and output values are floored + */ +/obj/item/circuit_component/arbitrary_input_amount/bitwise + display_name = "Bitwise" + display_desc = "A component that operates on the bits of integers. Any decimal values are ignored." + + //The type of port to use + input_port_type = PORT_TYPE_NUMBER + output_port_type = PORT_TYPE_NUMBER + + /// The amount of input ports to have + input_port_amount = 2 + +/obj/item/circuit_component/arbitrary_input_amount/bitwise/populate_options() + options = list( + COMP_BITWISE_AND, + COMP_BITWISE_OR, + COMP_BITWISE_XOR, + COMP_BITWISE_LEFTSHIFT, + COMP_BITWISE_RIGHTSHIFT, + ) + +/obj/item/circuit_component/arbitrary_input_amount/bitwise/calculate_output(datum/port/input/port, datum/port/input/first_port, list/ports) + + . = FLOOR(first_port.input_value, 1) + + for(var/datum/port/input/input_port as anything in ports) + var/value = input_port.input_value + if(isnull(value)) + continue + + value = FLOOR(value, 1) + + switch(current_option) + if(COMP_BITWISE_AND) + . &= value + if(COMP_BITWISE_OR) + . |= value + if(COMP_BITWISE_XOR) + . ^= value + if(COMP_BITWISE_LEFTSHIFT) + . = FLOOR(. * 2**value, 1) //Bitshifts are done with powers of two instead of the >> and << operators to allow negative shifts + if(COMP_BITWISE_RIGHTSHIFT) + . = FLOOR(. * 2**(-value), 1) diff --git a/code/modules/wiremod/components/math/comparison.dm b/code/modules/wiremod/components/math/comparison.dm new file mode 100644 index 0000000000000..b2f625ea019f8 --- /dev/null +++ b/code/modules/wiremod/components/math/comparison.dm @@ -0,0 +1,58 @@ +/** + * # Comparison Component + * + * Compares two objects + */ +/obj/item/circuit_component/compare/comparison + display_name = "Comparison" + display_desc = "A component that compares two objects." + + input_port_amount = 2 + var/current_type = PORT_TYPE_ANY + +/obj/item/circuit_component/compare/comparison/populate_options() + var/static/component_options = list( + COMP_COMPARISON_EQUAL, + COMP_COMPARISON_NOT_EQUAL, + COMP_COMPARISON_GREATER_THAN, + COMP_COMPARISON_LESS_THAN, + COMP_COMPARISON_GREATER_THAN_OR_EQUAL, + COMP_COMPARISON_LESS_THAN_OR_EQUAL, + ) + options = component_options + +/obj/item/circuit_component/compare/comparison/input_received(datum/port/input/port) + switch(current_option) + if(COMP_COMPARISON_EQUAL, COMP_COMPARISON_NOT_EQUAL) + if(current_type != PORT_TYPE_ANY) + current_type = PORT_TYPE_ANY + input_ports[1].set_datatype(PORT_TYPE_ANY) + input_ports[2].set_datatype(PORT_TYPE_ANY) + else + if(current_type != PORT_TYPE_NUMBER) + current_type = PORT_TYPE_NUMBER + input_ports[1].set_datatype(PORT_TYPE_NUMBER) + input_ports[2].set_datatype(PORT_TYPE_NUMBER) + return ..() + +/obj/item/circuit_component/compare/comparison/do_comparisons(list/ports) + if(length(ports) < input_port_amount) + return FALSE + + // Comparison component only compares the first two ports + var/input1 = input_ports[1].input_value + var/input2 = input_ports[2].input_value + + switch(current_option) + if(COMP_COMPARISON_EQUAL) + return input1 == input2 + if(COMP_COMPARISON_NOT_EQUAL) + return input1 != input2 + if(COMP_COMPARISON_GREATER_THAN) + return input1 > input2 + if(COMP_COMPARISON_GREATER_THAN_OR_EQUAL) + return input1 >= input2 + if(COMP_COMPARISON_LESS_THAN) + return input1 < input2 + if(COMP_COMPARISON_LESS_THAN_OR_EQUAL) + return input1 <= input2 diff --git a/code/modules/wiremod/components/math/length.dm b/code/modules/wiremod/components/math/length.dm new file mode 100644 index 0000000000000..8717083fc2ef9 --- /dev/null +++ b/code/modules/wiremod/components/math/length.dm @@ -0,0 +1,33 @@ +/** + * # Length Component + * + * Return the length of an input + */ +/obj/item/circuit_component/length + display_name = "Length" + display_desc = "A component that returns the length of its input." + + /// The input port + var/datum/port/input/input_port + + /// The result from the output + var/datum/port/output/output + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/length/Initialize() + . = ..() + input_port = add_input_port("Input", PORT_TYPE_ANY) + + output = add_output_port("Length", PORT_TYPE_NUMBER) + +/obj/item/circuit_component/length/Destroy() + input_port = null + output = null + return ..() + +/obj/item/circuit_component/length/input_received(datum/port/input/port) + . = ..() + if(.) + return + + output.set_output(length(input_port.input_value)) diff --git a/code/modules/wiremod/components/math/logic.dm b/code/modules/wiremod/components/math/logic.dm new file mode 100644 index 0000000000000..efb6b410b0e81 --- /dev/null +++ b/code/modules/wiremod/components/math/logic.dm @@ -0,0 +1,45 @@ +/** + * # Logic Component + * + * General logic unit with AND OR capabilities + */ +/obj/item/circuit_component/compare/logic + display_name = "Logic" + display_desc = "A component with 'and' and 'or' capabilities." + +/obj/item/circuit_component/compare/logic/populate_options() + var/static/component_options = list( + COMP_LOGIC_AND, + COMP_LOGIC_OR, + COMP_LOGIC_XOR, + ) + options = component_options + +/obj/item/circuit_component/compare/logic/do_comparisons(list/ports) + . = FALSE + // Used by XOR + var/total_ports = 0 + var/total_true_ports = 0 + for(var/datum/port/input/port as anything in ports) + if(isnull(port.input_value) && isnull(port.connected_port)) + continue + + total_ports += 1 + switch(current_option) + if(COMP_LOGIC_AND) + if(!port.input_value) + return FALSE + . = TRUE + if(COMP_LOGIC_OR) + if(port.input_value) + return TRUE + if(COMP_LOGIC_XOR) + if(port.input_value) + . = TRUE + total_true_ports += 1 + + if(current_option == COMP_LOGIC_XOR) + if(total_ports == total_true_ports) + return FALSE + if(.) + return TRUE diff --git a/code/modules/wiremod/components/math/not.dm b/code/modules/wiremod/components/math/not.dm new file mode 100644 index 0000000000000..8e68dfde47532 --- /dev/null +++ b/code/modules/wiremod/components/math/not.dm @@ -0,0 +1,33 @@ +/** + * # Logic Component + * + * General logic unit with AND OR capabilities + */ +/obj/item/circuit_component/not + display_name = "Not" + display_desc = "A component that inverts its input." + + /// The input port + var/datum/port/input/input_port + + /// The result from the output + var/datum/port/output/result + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/not/Initialize() + . = ..() + input_port = add_input_port("Input", PORT_TYPE_ANY) + + result = add_output_port("Result", PORT_TYPE_NUMBER) + +/obj/item/circuit_component/not/Destroy() + input_port = null + result = null + return ..() + +/obj/item/circuit_component/not/input_received(datum/port/input/port) + . = ..() + if(.) + return + + result.set_output(!input_port.input_value) diff --git a/code/modules/wiremod/components/math/random.dm b/code/modules/wiremod/components/math/random.dm new file mode 100644 index 0000000000000..4fe4411835362 --- /dev/null +++ b/code/modules/wiremod/components/math/random.dm @@ -0,0 +1,45 @@ +/** + * # Random Component + * + * Generates a random number between specific values + */ +/obj/item/circuit_component/random + display_name = "Random" + display_desc = "A component that returns random values." + + /// The minimum value that the random number can be + var/datum/port/input/minimum + /// The maximum value that the random number can be + var/datum/port/input/maximum + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + /// The result from the output + var/datum/port/output/output + +/obj/item/circuit_component/random/Initialize() + . = ..() + minimum = add_input_port("Minimum", PORT_TYPE_NUMBER, FALSE) + maximum = add_input_port("Maximum", PORT_TYPE_NUMBER, FALSE) + + output = add_output_port("Output", PORT_TYPE_NUMBER) + +/obj/item/circuit_component/random/Destroy() + minimum = null + maximum = null + output = null + return ..() + +/obj/item/circuit_component/random/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/min_val = minimum.input_value || 0 + var/max_val = maximum.input_value || 0 + + if(max_val < min_val) + output.set_output(0) + return + + output.set_output(rand(min_val, max_val)) diff --git a/code/modules/wiremod/components/math/round.dm b/code/modules/wiremod/components/math/round.dm new file mode 100644 index 0000000000000..db1281192ca96 --- /dev/null +++ b/code/modules/wiremod/components/math/round.dm @@ -0,0 +1,57 @@ +/** + * # Round Component + * + * This component can round, floor, and ceil number inputs. + * + */ + +/obj/item/circuit_component/round + display_name = "Round" + display_desc = "A component capable of cutting off messy decimal values off a number." + + /// The input port + var/datum/port/input/input + + /// The result from the output + var/datum/port/output/output + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/round/populate_options() + options = list( + COMP_ROUND_ROUND, + COMP_ROUND_FLOOR, + COMP_ROUND_CEIL, + ) + +/obj/item/circuit_component/round/Initialize() + . = ..() + + input = add_input_port("Input", PORT_TYPE_NUMBER) + + output = add_output_port("Output", PORT_TYPE_NUMBER) + +/obj/item/circuit_component/round/Destroy() + input = null + output = null + return ..() + +/obj/item/circuit_component/round/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/value = input.input_value + if(isnull(value)) + output.set_output(null) //Pass the null along + return + + switch(current_option) + if(COMP_ROUND_ROUND) + value = round(value,1) + if(COMP_ROUND_FLOOR) + value = FLOOR(value,1) + if(COMP_ROUND_CEIL) + value = CEILING(value,1) + + output.set_output(value) diff --git a/code/modules/wiremod/components/math/trig.dm b/code/modules/wiremod/components/math/trig.dm new file mode 100644 index 0000000000000..a9c07324c5fa0 --- /dev/null +++ b/code/modules/wiremod/components/math/trig.dm @@ -0,0 +1,128 @@ +/** + * # Trig Component + * + * Math trig, not a trigger + * Does trig stuff + */ + + //Generic class for other trig components +/obj/item/circuit_component/trig + display_name = "Generic Trigonometry" + display_desc = "A useless component that all trigonometric based components are built off of." + + /// The input port + var/datum/port/input/input + + /// The result from the output + var/datum/port/output/output + + //An increase in power usage due to more complex calculations + power_usage_per_input = 2 + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + +/obj/item/circuit_component/trig/Initialize() + . = ..() + input = add_input_port("Input", PORT_TYPE_NUMBER) + output = add_output_port("Output", PORT_TYPE_NUMBER) + +/obj/item/circuit_component/trig/Destroy() + input = null + output = null + return ..() + +//The output is set to the return value of this proc on input received +/obj/item/circuit_component/trig/proc/do_calculation(value) + +/obj/item/circuit_component/trig/input_received(datum/port/input/port) + . = ..() + if(.) + return + + //The output is based on the override of do_calculation() + output.set_output(do_calculation(input.input_value)) + + +//Does your typical Sine, Cosine, and Tangent, as well as their inverses +/obj/item/circuit_component/trig/trig + display_name = "Trigonometry" + display_desc = "A component capable of trigonometric functions." + +/obj/item/circuit_component/trig/trig/populate_options() + options = list( + COMP_TRIG_SINE, + COMP_TRIG_COSINE, + COMP_TRIG_TANGENT, + COMP_TRIG_ASINE, + COMP_TRIG_ACOSINE, + COMP_TRIG_ATANGENT + ) + +/obj/item/circuit_component/trig/trig/do_calculation(value) + + switch(current_option) + if(COMP_TRIG_ASINE) + return (value >= -1 && value <= 1) ? TORADIANS(arcsin(value)) : null + if(COMP_TRIG_ACOSINE) + return (value >= -1 && value <= 1) ? TORADIANS(arccos(value)) * PI/180 : null + if(COMP_TRIG_ATANGENT) + return arctan(value) * PI/180 + value = TODEGREES(value) //apparently BYOND doesn't believe in the almighty radian + switch(current_option) + if(COMP_TRIG_COSINE) + return cos(value) + if(COMP_TRIG_SINE) + return sin(value) + if(COMP_TRIG_TANGENT) + return cos(value) == 0 ? null : tan(value) + + +//Performs Secant, Cosecant, and Cotangent +/obj/item/circuit_component/trig/adv_trig + display_name = "Advanced Trigonometry" + display_desc = "Following outstanding advancements in the field of Mathematics, NanoTrasen scientist have discovered how to take the reciprical of trignometric functions" + + +/obj/item/circuit_component/trig/adv_trig/populate_options() + options = list( + COMP_TRIG_SECANT, + COMP_TRIG_COSECANT, + COMP_TRIG_COTANGENT + ) + +/obj/item/circuit_component/trig/adv_trig/do_calculation(value) + value = TODEGREES(value) + switch(current_option) + if(COMP_TRIG_SECANT) + return cos(value) == 0 ? null : SEC(value) + if(COMP_TRIG_COSECANT) + return sin(value) == 0 ? null : CSC(value) + if(COMP_TRIG_COTANGENT) + return sin(value) == 0 ? null : (cos(value) * CSC(value)) //The define for COT uses 1/tan(x), which throws a divide by zero error when x = pi/2 + kpi where k is an integer + + +//Hyperbolic Sine and Cosine +/obj/item/circuit_component/trig/hyper_trig + display_name = "Hyperbolic Trigonometry" + display_desc = "This component makes all your trig calculations be based on hyperbolas and natural exponentials instead of circles" + +/obj/item/circuit_component/trig/hyper_trig/populate_options() + options = list( + COMP_TRIG_HYPERBOLIC_SINE, + COMP_TRIG_HYPERBOLIC_COSINE, + COMP_TRIG_AHYPERBOLIC_SINE, + COMP_TRIG_AHYPERBOLIC_COSINE, + ) + +/obj/item/circuit_component/trig/hyper_trig/do_calculation(value) + + switch(current_option) + if(COMP_TRIG_HYPERBOLIC_COSINE) + return (NUM_E**value + NUM_E**(-value))/2 //I suppose this could be used for exponents, using the identity cosh(x) + sinh(x) = e^x, I might look into making this more efficent if people end up using this for that + if(COMP_TRIG_HYPERBOLIC_SINE) + return (NUM_E**value - NUM_E**(-value))/2 + if(COMP_TRIG_AHYPERBOLIC_SINE) + return log(value+sqrt(value**2+1)) + if(COMP_TRIG_AHYPERBOLIC_COSINE) + return value < 1 ? null : log(value+sqrt(value**2-1)) diff --git a/code/modules/wiremod/components/string/concat.dm b/code/modules/wiremod/components/string/concat.dm new file mode 100644 index 0000000000000..3a4aeccca35a0 --- /dev/null +++ b/code/modules/wiremod/components/string/concat.dm @@ -0,0 +1,45 @@ +/** + * # Concatenate Component + * + * General string concatenation component. Puts strings together. + */ +/obj/item/circuit_component/concat + display_name = "Concatenate" + display_desc = "A component that combines strings." + + /// The amount of input ports to have + var/input_port_amount = 4 + + /// The result from the output + var/datum/port/output/output + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/concat/Initialize() + . = ..() + for(var/port_id in 1 to input_port_amount) + var/letter = ascii2text(text2ascii("A") + (port_id-1)) + add_input_port(letter, PORT_TYPE_STRING) + + output = add_output_port("Output", PORT_TYPE_STRING) + +/obj/item/circuit_component/concat/Destroy() + output = null + return ..() + +/obj/item/circuit_component/concat/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/result = "" + var/list/ports = input_ports.Copy() + ports -= trigger_input + + for(var/datum/port/input/input_port as anything in ports) + var/value = input_port.input_value + if(isnull(value)) + continue + + result += "[value]" + + output.set_output(result) diff --git a/code/modules/wiremod/components/string/contains.dm b/code/modules/wiremod/components/string/contains.dm new file mode 100644 index 0000000000000..61c48a476b20b --- /dev/null +++ b/code/modules/wiremod/components/string/contains.dm @@ -0,0 +1,35 @@ +/** + * # String Contains Component + * + * Checks if a string contains a word/letter + */ +/obj/item/circuit_component/compare/contains + display_name = "String Contains" + display_desc = "Checks if a string contains a word/letter" + + input_port_amount = 0 + + var/datum/port/input/needle + var/datum/port/input/haystack + +/obj/item/circuit_component/compare/contains/load_custom_ports() + needle = add_input_port("Needle", PORT_TYPE_STRING) + haystack = add_input_port("Haystack", PORT_TYPE_STRING) + +/obj/item/circuit_component/compare/contains/Destroy() + needle = null + haystack = null + return ..() + + +/obj/item/circuit_component/compare/contains/do_comparisons(list/ports) + if(length(ports) < input_port_amount) + return + + var/to_find = needle.input_value + var/to_search = haystack.input_value + + if(!to_find || !to_search) + return + + return findtext(to_search, to_find) diff --git a/code/modules/wiremod/components/string/textcase.dm b/code/modules/wiremod/components/string/textcase.dm new file mode 100644 index 0000000000000..ba4e20dab06e1 --- /dev/null +++ b/code/modules/wiremod/components/string/textcase.dm @@ -0,0 +1,51 @@ +/** + * # Text Component + * + * Either makes the text upper case or lower case. + */ +/obj/item/circuit_component/textcase + display_name = "Text Case" + display_desc = "A component that makes its input uppercase or lowercase." + + /// The input port + var/datum/port/input/input_port + + /// The result of the text operation + var/datum/port/output/output + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/textcase/populate_options() + var/static/component_options = list( + COMP_TEXT_LOWER, + COMP_TEXT_UPPER, + ) + options = component_options + +/obj/item/circuit_component/textcase/Initialize() + . = ..() + input_port = add_input_port("Input", PORT_TYPE_STRING) + output = add_output_port("Output", PORT_TYPE_STRING) + +/obj/item/circuit_component/textcase/Destroy() + input_port = null + output = null + return ..() + +/obj/item/circuit_component/textcase/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/value = input_port.input_value + if(isnull(value)) + return + + var/result + switch(current_option) + if(COMP_TEXT_LOWER) + result = lowertext(value) + if(COMP_TEXT_UPPER) + result = uppertext(value) + + output.set_output(result) diff --git a/code/modules/wiremod/components/string/tostring.dm b/code/modules/wiremod/components/string/tostring.dm new file mode 100644 index 0000000000000..dd8fbdc56ebe3 --- /dev/null +++ b/code/modules/wiremod/components/string/tostring.dm @@ -0,0 +1,44 @@ +/** + * # To String Component + * + * Converts any value into a string + */ +/obj/item/circuit_component/tostring + display_name = "To String" + display_desc = "A component that converts its input to text." + + /// The input port + var/datum/port/input/input_port + + /// The result from the output + var/datum/port/output/output + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + var/max_range = 5 + +/obj/item/circuit_component/tostring/Initialize() + . = ..() + input_port = add_input_port("Input", PORT_TYPE_ANY) + + output = add_output_port("Output", PORT_TYPE_STRING) + +/obj/item/circuit_component/tostring/Destroy() + input_port = null + output = null + return ..() + +/obj/item/circuit_component/tostring/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/input_value = input_port.input_value + if(isatom(input_value)) + var/turf/location = get_turf(src) + var/atom/object = input_value + if(object.z != location.z || get_dist(location, object) > max_range) + output.set_output(PORT_TYPE_ATOM) + return + + output.set_output("[input_value]") diff --git a/code/modules/wiremod/components/usb_port.dm b/code/modules/wiremod/components/usb_port.dm new file mode 100644 index 0000000000000..4a1784c7e1e6e --- /dev/null +++ b/code/modules/wiremod/components/usb_port.dm @@ -0,0 +1,169 @@ +/// Opens up a USB port that can be connected to by circuits, creating registerable circuit components +/datum/component/usb_port + /// The component types to create when something plugs in + var/list/circuit_component_types + + /// The currently connected circuit + var/obj/item/integrated_circuit/attached_circuit + + /// The currently connected USB cable + var/datum/weakref/usb_cable_ref + + /// The components inside the parent + var/list/obj/item/circuit_component/circuit_components + + /// The beam connecting the USB cable to the machine + var/datum/beam/usb_cable_beam + +/datum/component/usb_port/Initialize(list/circuit_component_types) + if (!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + circuit_components = list() + + for(var/circuit_component_type in circuit_component_types) + var/obj/item/circuit_component/circuit_component = new circuit_component_type(null) + circuit_components += circuit_component + +/datum/component/usb_port/RegisterWithParent() + RegisterSignal(parent, COMSIG_ATOM_USB_CABLE_TRY_ATTACH, .proc/on_atom_usb_cable_try_attach) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/on_moved) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine) + + for(var/obj/item/circuit_component/component as anything in circuit_components) + component.register_usb_parent(parent) + +/datum/component/usb_port/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_ATOM_USB_CABLE_TRY_ATTACH, + COMSIG_MOVABLE_MOVED, + COMSIG_PARENT_EXAMINE, + )) + + for(var/obj/item/circuit_component/component as anything in circuit_components) + component.unregister_usb_parent(parent) + + unregister_circuit_signals() + attached_circuit = null + +/datum/component/usb_port/Destroy() + QDEL_LIST(circuit_components) + QDEL_NULL(usb_cable_beam) + + attached_circuit = null + usb_cable_ref = null + + return ..() + +/datum/component/usb_port/proc/unregister_circuit_signals() + if (isnull(attached_circuit)) + return + + UnregisterSignal(attached_circuit, list( + COMSIG_CIRCUIT_SHELL_REMOVED, + COMSIG_PARENT_QDELETING, + )) + + var/shell = attached_circuit.shell + if (!isnull(shell)) + UnregisterSignal(shell, COMSIG_MOVABLE_MOVED) + UnregisterSignal(shell, COMSIG_PARENT_EXAMINE) + +/datum/component/usb_port/proc/attach_circuit_components(obj/item/integrated_circuit/circuitboard) + for(var/obj/item/circuit_component/component as anything in circuit_components) + circuitboard.add_component(component) + RegisterSignal(component, COMSIG_CIRCUIT_COMPONENT_REMOVED, .proc/on_circuit_component_removed) + +/datum/component/usb_port/proc/on_examine(datum/source, mob/user, list/examine_text) + SIGNAL_HANDLER + + if (isnull(attached_circuit)) + examine_text += "There is a USB port on the front." + else + examine_text += "[attached_circuit.shell || attached_circuit] is connected to [parent.p_them()] by a USB port." + +/datum/component/usb_port/proc/on_examine_shell(datum/source, mob/user, list/examine_text) + SIGNAL_HANDLER + + examine_text += "[source.p_they(TRUE)] [source.p_are()] attached to [parent] with a USB cable." + +/datum/component/usb_port/proc/on_atom_usb_cable_try_attach(datum/source, obj/item/usb_cable/connecting_cable, mob/user) + SIGNAL_HANDLER + + var/atom/atom_parent = parent + + if (!isnull(attached_circuit)) + atom_parent.balloon_alert(user, "usb already connected") + return COMSIG_CANCEL_USB_CABLE_ATTACK + + if (isnull(connecting_cable.attached_circuit)) + connecting_cable.balloon_alert(user, "connect to a shell first") + return COMSIG_CANCEL_USB_CABLE_ATTACK + + if (!IN_GIVEN_RANGE(connecting_cable.attached_circuit, parent, USB_CABLE_MAX_RANGE)) + connecting_cable.balloon_alert(user, "too far away") + return COMSIG_CANCEL_USB_CABLE_ATTACK + + usb_cable_ref = WEAKREF(connecting_cable) + attached_circuit = connecting_cable.attached_circuit + + connecting_cable.forceMove(attached_circuit) + attach_circuit_components(attached_circuit) + attached_circuit.interact(user) + + usb_cable_beam = atom_parent.Beam(attached_circuit.shell, "usb_cable_beam", 'icons/obj/wiremod.dmi') + + RegisterSignal(attached_circuit, COMSIG_CIRCUIT_SHELL_REMOVED, .proc/on_circuit_shell_removed) + RegisterSignal(attached_circuit, COMSIG_PARENT_QDELETING, .proc/on_circuit_deleting) + RegisterSignal(attached_circuit.shell, COMSIG_MOVABLE_MOVED, .proc/on_moved) + RegisterSignal(attached_circuit.shell, COMSIG_PARENT_EXAMINE, .proc/on_examine_shell) + + return COMSIG_USB_CABLE_ATTACHED + +/datum/component/usb_port/proc/on_moved() + SIGNAL_HANDLER + + if (isnull(attached_circuit)) + return + + if (IN_GIVEN_RANGE(attached_circuit, parent, USB_CABLE_MAX_RANGE)) + return + + detach() + +/datum/component/usb_port/proc/on_circuit_deleting() + SIGNAL_HANDLER + + detach() + qdel(usb_cable_ref) + +/datum/component/usb_port/proc/on_circuit_component_removed(datum/source) + SIGNAL_HANDLER + + detach() + +/datum/component/usb_port/proc/on_circuit_shell_removed() + SIGNAL_HANDLER + + detach() + +/datum/component/usb_port/proc/detach() + var/obj/item/usb_cable/usb_cable = usb_cable_ref?.resolve() + if (isnull(usb_cable)) + return + + for(var/obj/item/circuit_component/component as anything in circuit_components) + UnregisterSignal(component, COMSIG_CIRCUIT_COMPONENT_REMOVED) + attached_circuit.remove_component(component) + component.moveToNullspace() + + unregister_circuit_signals() + + var/atom/atom_parent = parent + usb_cable.forceMove(atom_parent.drop_location()) + usb_cable.balloon_alert_to_viewers("snap") + + attached_circuit = null + usb_cable_ref = null + + QDEL_NULL(usb_cable_beam) diff --git a/code/modules/wiremod/components/utility/clock.dm b/code/modules/wiremod/components/utility/clock.dm new file mode 100644 index 0000000000000..e856b1ee4d0ec --- /dev/null +++ b/code/modules/wiremod/components/utility/clock.dm @@ -0,0 +1,59 @@ +/** + * # Clock Component + * + * Fires every tick of the circuit timer SS + */ +/obj/item/circuit_component/clock + display_name = "Clock" + display_desc = "A component that repeatedly fires." + + /// Whether the clock is on or not + var/datum/port/input/on + + /// The signal from this clock component + var/datum/port/output/signal + +/obj/item/circuit_component/clock/get_ui_notices() + . = ..() + . += create_ui_notice("Clock Interval: [DisplayTimeText(COMP_CLOCK_DELAY)]", "orange", "clock") + +/obj/item/circuit_component/clock/Initialize() + . = ..() + on = add_input_port("On", PORT_TYPE_NUMBER) + + signal = add_output_port("Signal", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/clock/input_received(datum/port/input/port) + . = ..() + if(.) + return + + if(on.input_value) + start_process() + else + stop_process() + +/obj/item/circuit_component/clock/Destroy() + on = null + signal = null + stop_process() + return ..() + +/obj/item/circuit_component/clock/process(delta_time) + signal.set_output(COMPONENT_SIGNAL) + +/** + * Adds the component to the SSclock_component process list + * + * Starts ticking to send signals between periods of time + */ +/obj/item/circuit_component/clock/proc/start_process() + START_PROCESSING(SSclock_component, src) + +/** + * Removes the component to the SSclock_component process list + * + * Signals stop getting sent. + */ +/obj/item/circuit_component/clock/proc/stop_process() + STOP_PROCESSING(SSclock_component, src) diff --git a/code/modules/wiremod/components/utility/combiner.dm b/code/modules/wiremod/components/utility/combiner.dm new file mode 100644 index 0000000000000..7857f0f260a22 --- /dev/null +++ b/code/modules/wiremod/components/utility/combiner.dm @@ -0,0 +1,53 @@ +/** + * # Combiner Component + * + * Combines multiple inputs into 1 output port. + */ +/obj/item/circuit_component/combiner + display_name = "Combiner" + display_desc = "A component that combines multiple inputs to provide 1 output." + + /// The amount of input ports to have + var/input_port_amount = 4 + + var/datum/port/output/output_port + + var/current_type + +/obj/item/circuit_component/combiner/populate_options() + var/static/component_options = list( + COMP_TYPE_ANY, + PORT_TYPE_STRING, + PORT_TYPE_NUMBER, + PORT_TYPE_LIST, + PORT_TYPE_ATOM, + PORT_TYPE_SIGNAL, + ) + options = component_options + +/obj/item/circuit_component/combiner/Initialize() + . = ..() + current_option = COMP_TYPE_ANY + current_type = COMP_TYPE_ANY + for(var/port_id in 1 to input_port_amount) + var/letter = ascii2text(text2ascii("A") + (port_id-1)) + add_input_port(letter, PORT_TYPE_ANY) + output_port = add_output_port("Output", PORT_TYPE_ANY) + +/obj/item/circuit_component/combiner/Destroy() + output_port = null + return ..() + +/obj/item/circuit_component/combiner/input_received(datum/port/input/port) + . = ..() + if(current_type != current_option && (current_option != COMP_TYPE_ANY || current_type != PORT_TYPE_ANY)) + current_type = current_option + if(current_type == COMP_TYPE_ANY) + current_type = PORT_TYPE_ANY + for(var/datum/port/input/input_port as anything in input_ports) + input_port.set_datatype(current_type) + output_port.set_datatype(current_type) + + if(. || !port) + return TRUE + output_port.set_output(port.input_value) diff --git a/code/modules/wiremod/components/utility/delay.dm b/code/modules/wiremod/components/utility/delay.dm new file mode 100644 index 0000000000000..a7e43f56090b1 --- /dev/null +++ b/code/modules/wiremod/components/utility/delay.dm @@ -0,0 +1,44 @@ +/** + * # Delay Component + * + * Delays a signal by a specified duration. + */ +/obj/item/circuit_component/delay + display_name = "Delay" + display_desc = "A component that delays a signal by a specified duration." + + /// Amount to delay by + var/datum/port/input/delay_amount + /// Input signal to fire the delay + var/datum/port/input/trigger + + /// The output of the signal + var/datum/port/output/output + +/obj/item/circuit_component/delay/Initialize() + . = ..() + delay_amount = add_input_port("Delay", PORT_TYPE_NUMBER, FALSE) + trigger = add_input_port("Trigger", PORT_TYPE_SIGNAL) + + output = add_output_port("Result", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/delay/Destroy() + output = null + trigger = null + delay_amount = null + return ..() + +/obj/item/circuit_component/delay/input_received(datum/port/input/port) + . = ..() + if(.) + return + + if(!COMPONENT_TRIGGERED_BY(trigger, port)) + return + + var/delay = delay_amount.input_value + if(delay > COMP_DELAY_MIN_VALUE) + // Convert delay into deciseconds + addtimer(CALLBACK(output, /datum/port/output.proc/set_output, trigger.input_value), delay*10) + else + output.set_output(trigger.input_value) diff --git a/code/modules/wiremod/components/utility/multiplexer.dm b/code/modules/wiremod/components/utility/multiplexer.dm new file mode 100644 index 0000000000000..9676729b06494 --- /dev/null +++ b/code/modules/wiremod/components/utility/multiplexer.dm @@ -0,0 +1,65 @@ +/** + * # Combiner Component + * + * Combines multiple inputs into 1 output port. + */ +/obj/item/circuit_component/multiplexer + display_name = "Multiplexer" + display_desc = "A component that allows you to selectively choose which input port provides an output. The first port is the selector and takes a number between 1 and the maximum port amount." + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + /// The port to select from, goes from 1 to input_port_amount + var/datum/port/input/input_port + + /// The amount of input ports to have + var/input_port_amount = 4 + + var/datum/port/output/output_port + + /// Current type of the ports + var/current_type + + /// The multiplexer inputs. These are what get selected for the output by the input_port. + var/list/datum/port/input/multiplexer_inputs + +/obj/item/circuit_component/multiplexer/populate_options() + var/static/component_options = list( + COMP_TYPE_ANY, + PORT_TYPE_STRING, + PORT_TYPE_NUMBER, + PORT_TYPE_LIST, + PORT_TYPE_ATOM, + ) + options = component_options + +/obj/item/circuit_component/multiplexer/Initialize() + . = ..() + current_option = COMP_TYPE_ANY + current_type = COMP_TYPE_ANY + input_port = add_input_port("Selector", PORT_TYPE_NUMBER, default = 1) + multiplexer_inputs = list() + for(var/port_id in 1 to input_port_amount) + multiplexer_inputs += add_input_port("Port [port_id]", PORT_TYPE_ANY) + output_port = add_output_port("Output", PORT_TYPE_ANY) + +/obj/item/circuit_component/multiplexer/Destroy() + output_port = null + multiplexer_inputs.Cut() + multiplexer_inputs = null + return ..() + + +/obj/item/circuit_component/multiplexer/input_received(datum/port/input/port) + . = ..() + if(current_type != current_option && (current_option != COMP_TYPE_ANY || current_type != PORT_TYPE_ANY)) + current_type = current_option + if(current_type == COMP_TYPE_ANY) + current_type = PORT_TYPE_ANY + for(var/datum/port/input/input_port as anything in multiplexer_inputs) + input_port.set_datatype(current_type) + output_port.set_datatype(current_type) + + input_port.set_input(clamp(input_port.input_value || 1, 1, input_port_amount), FALSE) + if(.) + return TRUE + output_port.set_output(multiplexer_inputs[input_port.input_value].input_value) diff --git a/code/modules/wiremod/components/utility/ram.dm b/code/modules/wiremod/components/utility/ram.dm new file mode 100644 index 0000000000000..9c8e120cd8168 --- /dev/null +++ b/code/modules/wiremod/components/utility/ram.dm @@ -0,0 +1,52 @@ +/** + * # RAM Component + * + * Stores the current input when triggered. + * Players will need to think logically when using the RAM component + * as there can be race conditions due to the delays of transferring signals + */ +/obj/item/circuit_component/ram + display_name = "RAM" + display_desc = "A component that retains a variable." + + /// The input to store + var/datum/port/input/input_port + /// The trigger to store the current value of the input + var/datum/port/input/trigger + /// Clears the current input + var/datum/port/input/clear + + /// The current set value + var/datum/port/output/output + +/obj/item/circuit_component/ram/Initialize() + . = ..() + input_port = add_input_port("Input", PORT_TYPE_ANY) + trigger = add_input_port("Store", PORT_TYPE_SIGNAL) + clear = add_input_port("Clear", PORT_TYPE_SIGNAL) + + output = add_output_port("Stored Value", PORT_TYPE_ANY) + +/obj/item/circuit_component/ram/Destroy() + input_port = null + trigger = null + clear = null + output = null + return ..() + +/obj/item/circuit_component/ram/input_received(datum/port/input/port) + . = ..() + match_port_datatype(input_port, output) + if(.) + return + + if(COMPONENT_TRIGGERED_BY(clear, port)) + output.set_output(null) + return + + if(!COMPONENT_TRIGGERED_BY(trigger, port)) + return + + var/input_val = input_port.input_value + + output.set_output(input_val) diff --git a/code/modules/wiremod/components/utility/typecheck.dm b/code/modules/wiremod/components/utility/typecheck.dm new file mode 100644 index 0000000000000..426d583d47653 --- /dev/null +++ b/code/modules/wiremod/components/utility/typecheck.dm @@ -0,0 +1,52 @@ +/** + * # Typecheck Component + * + * Checks the type of a value + */ +/obj/item/circuit_component/compare/typecheck + display_name = "Typecheck" + display_desc = "A component that checks the type of its input." + + input_port_amount = 1 + +GLOBAL_LIST_INIT(comp_typecheck_options, list( + PORT_TYPE_STRING, + PORT_TYPE_NUMBER, + PORT_TYPE_LIST, + PORT_TYPE_ATOM, + COMP_TYPECHECK_MOB, + COMP_TYPECHECK_HUMAN, +)) + +/obj/item/circuit_component/compare/typecheck/populate_options() + var/static/component_options = list( + PORT_TYPE_STRING, + PORT_TYPE_NUMBER, + PORT_TYPE_LIST, + PORT_TYPE_ATOM, + COMP_TYPECHECK_MOB, + COMP_TYPECHECK_HUMAN, + ) + options = component_options + +/obj/item/circuit_component/compare/typecheck/do_comparisons(list/ports) + if(!length(ports)) + return + . = FALSE + + // We're only comparing the first port/value. There shouldn't be any more. + var/datum/port/input/input_port = ports[1] + var/input_val = input_port.input_value + switch(current_option) + if(PORT_TYPE_STRING) + return istext(input_val) + if(PORT_TYPE_NUMBER) + return isnum(input_val) + if(PORT_TYPE_LIST) + return islist(input_val) + if(PORT_TYPE_ATOM) + return isatom(input_val) + if(COMP_TYPECHECK_MOB) + return ismob(input_val) + if(COMP_TYPECHECK_HUMAN) + return ishuman(input_val) diff --git a/code/modules/wiremod/integrated_circuit.dm b/code/modules/wiremod/integrated_circuit.dm new file mode 100644 index 0000000000000..f7abcbd48a1c9 --- /dev/null +++ b/code/modules/wiremod/integrated_circuit.dm @@ -0,0 +1,468 @@ +/** + * # Integrated Circuitboard + * + * A circuitboard that holds components that work together + * + * Has a limited amount of power. + */ +/obj/item/integrated_circuit + name = "integrated circuit" + icon = 'icons/obj/module.dmi' + icon_state = "integrated_circuit" + item_state = "electronic" + + /// The name that appears on the shell. + var/display_name = "" + + /// The max length of the name. + var/label_max_length = 24 + + /// The power of the integrated circuit + var/obj/item/stock_parts/cell/cell + + /// The shell that this circuitboard is attached to. Used by components. + var/atom/movable/shell + + /// The attached components + var/list/obj/item/circuit_component/attached_components = list() + + /// Whether the integrated circuit is on or not. Handled by the shell. + var/on = FALSE + + /// The ID that is authorized to unlock/lock the shell so that the circuit can/cannot be removed. + var/datum/weakref/owner_id + + /// The current examined component. Used in IntegratedCircuit UI + var/datum/weakref/examined_component + + /// Set by the shell. Holds the reference to the owner who inserted the component into the shell. + var/datum/weakref/inserter_mind + + /// X position of the examined_component + var/examined_rel_x = 0 + + /// Y position of the examined component + var/examined_rel_y = 0 + +/obj/item/integrated_circuit/Initialize() + . = ..() + RegisterSignal(src, COMSIG_ATOM_USB_CABLE_TRY_ATTACH, .proc/on_atom_usb_cable_try_attach) + +/obj/item/integrated_circuit/loaded/Initialize() + . = ..() + cell = new /obj/item/stock_parts/cell/high(src) + +/obj/item/integrated_circuit/Destroy() + for(var/obj/item/circuit_component/to_delete in attached_components) + remove_component(to_delete) + qdel(to_delete) + attached_components.Cut() + shell = null + examined_component = null + owner_id = null + QDEL_NULL(cell) + return ..() + +/obj/item/integrated_circuit/examine(mob/user) + . = ..() + if(cell) + . += "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%." + else + . += "There is no power cell installed." + +/obj/item/integrated_circuit/attackby(obj/item/I, mob/living/user, params) + . = ..() + if(istype(I, /obj/item/circuit_component)) + add_component_manually(I, user) + return + + if(istype(I, /obj/item/stock_parts/cell)) + if(cell) + balloon_alert(user, "There already is a cell inside!") + return + if(!user.transferItemToLoc(I, src)) + return + cell = I + I.add_fingerprint(user) + user.visible_message("[user] inserts a power cell into [src].", "You insert the power cell into [src].") + return + + if(istype(I, /obj/item/card/id)) + balloon_alert(user, "owner id set for [I]") + owner_id = WEAKREF(I) + return + + if(I.tool_behaviour == TOOL_SCREWDRIVER) + if(!cell) + return + I.play_tool_sound(src) + user.visible_message("[user] unscrews the power cell from [src].", "You unscrew the power cell from [src].") + cell.forceMove(drop_location()) + cell = null + return + +/** + * Registers an movable atom as a shell + * + * No functionality is done here. This is so that input components + * can properly register any signals on the shell. + * Arguments: + * * new_shell - The new shell to register. + */ +/obj/item/integrated_circuit/proc/set_shell(atom/movable/new_shell) + remove_current_shell() + on = TRUE + shell = new_shell + RegisterSignal(shell, COMSIG_PARENT_QDELETING, .proc/remove_current_shell) + for(var/obj/item/circuit_component/attached_component as anything in attached_components) + attached_component.register_shell(shell) + // Their input ports may be updated with user values, but the outputs haven't updated + // because on is FALSE + TRIGGER_CIRCUIT_COMPONENT(attached_component, null) + if(display_name != "") + shell.name = "[initial(shell.name)] ([display_name])" + +/** + * Unregisters the current shell attached to this circuit. + */ +/obj/item/integrated_circuit/proc/remove_current_shell() + SIGNAL_HANDLER + if(!shell) + return + shell.name = initial(shell.name) + for(var/obj/item/circuit_component/attached_component as anything in attached_components) + attached_component.unregister_shell(shell) + UnregisterSignal(shell, COMSIG_PARENT_QDELETING) + shell = null + on = FALSE + SEND_SIGNAL(src, COMSIG_CIRCUIT_SHELL_REMOVED) + +/** + * Adds a component to the circuitboard + * + * Once the component is added, the ports can be attached to other components + */ +/obj/item/integrated_circuit/proc/add_component(obj/item/circuit_component/to_add, mob/living/user) + if(to_add.parent) + return + + if(SEND_SIGNAL(src, COMSIG_CIRCUIT_ADD_COMPONENT, to_add, user) & COMPONENT_CANCEL_ADD_COMPONENT) + return + + if(!to_add.add_to(src)) + return + + var/success = FALSE + if(user) + success = user.transferItemToLoc(to_add, src) + else + success = to_add.forceMove(src) + + if(!success) + return + + to_add.rel_x = rand(COMPONENT_MIN_RANDOM_POS, COMPONENT_MAX_RANDOM_POS) + to_add.rel_y = rand(COMPONENT_MIN_RANDOM_POS, COMPONENT_MAX_RANDOM_POS) + to_add.parent = src + attached_components += to_add + RegisterSignal(to_add, COMSIG_MOVABLE_MOVED, .proc/component_move_handler) + SStgui.update_uis(src) + + if(shell) + to_add.register_shell(shell) + +/** + * Adds a component to the circuitboard through a manual action. + */ +/obj/item/integrated_circuit/proc/add_component_manually(obj/item/circuit_component/to_add, mob/living/user) + if (SEND_SIGNAL(src, COMSIG_CIRCUIT_ADD_COMPONENT_MANUALLY, to_add, user) & COMPONENT_CANCEL_ADD_COMPONENT) + return + + add_component(to_add, user) + +/obj/item/integrated_circuit/proc/component_move_handler(obj/item/circuit_component/source) + SIGNAL_HANDLER + if(source.loc != src) + remove_component(source) + +/** + * Removes a component to the circuitboard + * + * This removes all connects between the ports + */ +/obj/item/integrated_circuit/proc/remove_component(obj/item/circuit_component/to_remove) + if(shell) + to_remove.unregister_shell(shell) + + UnregisterSignal(to_remove, COMSIG_MOVABLE_MOVED) + attached_components -= to_remove + to_remove.disconnect() + to_remove.parent = null + SEND_SIGNAL(to_remove, COMSIG_CIRCUIT_COMPONENT_REMOVED, src) + SStgui.update_uis(src) + to_remove.removed_from(src) + +/obj/item/integrated_circuit/get_cell() + return cell + +/obj/item/integrated_circuit/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/simple/circuit_assets) + ) + +/obj/item/integrated_circuit/ui_data(mob/user) + . = list() + .["components"] = list() + for(var/obj/item/circuit_component/component as anything in attached_components) + var/list/component_data = list() + component_data["input_ports"] = list() + for(var/datum/port/input/port as anything in component.input_ports) + var/current_data = port.input_value + if(isatom(current_data)) // Prevent passing the name of the atom. + current_data = null + component_data["input_ports"] += list(list( + "name" = port.name, + "type" = port.datatype, + "ref" = REF(port), // The ref is the identifier to work out what it is connected to + "connected_to" = REF(port.connected_port), + "color" = port.color, + "current_data" = current_data, + )) + component_data["output_ports"] = list() + for(var/datum/port/output/port as anything in component.output_ports) + component_data["output_ports"] += list(list( + "name" = port.name, + "type" = port.datatype, + "ref" = REF(port), + "color" = port.color + )) + + component_data["name"] = component.display_name + component_data["x"] = component.rel_x + component_data["y"] = component.rel_y + component_data["option"] = component.current_option + component_data["options"] = component.options + component_data["removable"] = component.removable + .["components"] += list(component_data) + + .["display_name"] = display_name + + var/obj/item/circuit_component/examined + if(examined_component) + examined = examined_component.resolve() + + .["examined_name"] = examined?.display_name + .["examined_desc"] = examined?.display_desc + .["examined_notices"] = examined?.get_ui_notices() + .["examined_rel_x"] = examined_rel_x + .["examined_rel_y"] = examined_rel_y + +/obj/item/integrated_circuit/ui_host(mob/user) + if(shell) + return shell + return ..() + +/obj/item/integrated_circuit/ui_state(mob/user) + if(!shell) + return GLOB.hands_state + return GLOB.physical_obscured_state + +/obj/item/integrated_circuit/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "IntegratedCircuit", name) + ui.open() + ui.set_autoupdate(FALSE) + +#define WITHIN_RANGE(id, table) (id >= 1 && id <= length(table)) + +/obj/item/integrated_circuit/ui_act(action, list/params) + . = ..() + if(.) + return + + switch(action) + if("add_connection") + var/input_component_id = text2num(params["input_component_id"]) + var/output_component_id = text2num(params["output_component_id"]) + var/input_port_id = text2num(params["input_port_id"]) + var/output_port_id = text2num(params["output_port_id"]) + if(!WITHIN_RANGE(input_component_id, attached_components) || !WITHIN_RANGE(output_component_id, attached_components)) + return + var/obj/item/circuit_component/input_component = attached_components[input_component_id] + var/obj/item/circuit_component/output_component = attached_components[output_component_id] + + if(!WITHIN_RANGE(input_port_id, input_component.input_ports) || !WITHIN_RANGE(output_port_id, output_component.output_ports)) + return + var/datum/port/input/input_port = input_component.input_ports[input_port_id] + var/datum/port/output/output_port = output_component.output_ports[output_port_id] + + if(input_port.datatype && !output_port.compatible_datatype(input_port.datatype)) + return + + input_port.register_output_port(output_port) + . = TRUE + if("remove_connection") + var/component_id = text2num(params["component_id"]) + var/is_input = params["is_input"] + var/port_id = text2num(params["port_id"]) + + if(!WITHIN_RANGE(component_id, attached_components)) + return + var/obj/item/circuit_component/component = attached_components[component_id] + + var/list/port_table + if(is_input) + port_table = component.input_ports + else + port_table = component.output_ports + + if(!WITHIN_RANGE(port_id, port_table)) + return + + var/datum/port/port = port_table[port_id] + port.disconnect() + . = TRUE + if("detach_component") + var/component_id = text2num(params["component_id"]) + if(!WITHIN_RANGE(component_id, attached_components)) + return + var/obj/item/circuit_component/component = attached_components[component_id] + if(!component.removable) + return + component.disconnect() + remove_component(component) + if(component.loc == src) + usr.put_in_hands(component) + . = TRUE + if("set_component_coordinates") + var/component_id = text2num(params["component_id"]) + if(!WITHIN_RANGE(component_id, attached_components)) + return + var/obj/item/circuit_component/component = attached_components[component_id] + component.rel_x = min(max(-COMPONENT_MAX_POS, text2num(params["rel_x"])), COMPONENT_MAX_POS) + component.rel_y = min(max(-COMPONENT_MAX_POS, text2num(params["rel_y"])), COMPONENT_MAX_POS) + . = TRUE + if("set_component_option") + var/component_id = text2num(params["component_id"]) + if(!WITHIN_RANGE(component_id, attached_components)) + return + var/obj/item/circuit_component/component = attached_components[component_id] + var/option = params["option"] + if(!(option in component.options)) + return + component.set_option(option) + . = TRUE + if("set_component_input") + var/component_id = text2num(params["component_id"]) + var/port_id = text2num(params["port_id"]) + if(!WITHIN_RANGE(component_id, attached_components)) + return + var/obj/item/circuit_component/component = attached_components[component_id] + if(!WITHIN_RANGE(port_id, component.input_ports)) + return + var/datum/port/input/port = component.input_ports[port_id] + + if(port.connected_port) + return + + if(params["set_null"]) + port.set_input(null) + return TRUE + + if(params["marked_atom"]) + if(port.datatype != PORT_TYPE_ATOM && port.datatype != PORT_TYPE_ANY) + return + var/obj/item/multitool/circuit/marker = usr.get_active_held_item() + if(!istype(marker)) + return TRUE + if(!marker.marked_atom) + port.set_input(null) + marker.say("Cleared port ('[port.name]')'s value.") + return TRUE + marker.say("Updated port ('[port.name]')'s value to the marked entity.") + port.set_input(marker.marked_atom) + return TRUE + + var/user_input = params["input"] + switch(port.datatype) + if(PORT_TYPE_NUMBER) + port.set_input(text2num(user_input)) + if(PORT_TYPE_ANY) + var/any_type = copytext(user_input, 1, PORT_MAX_STRING_LENGTH) + port.set_input(text2num(any_type) || any_type) + if(PORT_TYPE_STRING) + port.set_input(copytext(user_input, 1, PORT_MAX_STRING_LENGTH)) + if(PORT_TYPE_SIGNAL) + balloon_alert(usr, "triggered [port.name]") + port.set_input(COMPONENT_SIGNAL) + . = TRUE + if("get_component_value") + var/component_id = text2num(params["component_id"]) + var/port_id = text2num(params["port_id"]) + if(!WITHIN_RANGE(component_id, attached_components)) + return + var/obj/item/circuit_component/component = attached_components[component_id] + if(!WITHIN_RANGE(port_id, component.output_ports)) + return + + var/datum/port/output/port = component.output_ports[port_id] + var/value = port.output_value + if(isatom(value)) + value = port.convert_value(port.output_value) + else if(isnull(value)) + value = "null" + balloon_alert(usr, "[port.name] value: [value]") + . = TRUE + if("set_display_name") + var/new_name = params["display_name"] + + if(new_name) + display_name = strip_html(params["display_name"], label_max_length) + else + display_name = "" + + if(shell) + if(display_name != "") + shell.name = "[initial(shell.name)] ([display_name])" + else + shell.name = initial(shell.name) + + . = TRUE + if("set_examined_component") + var/component_id = text2num(params["component_id"]) + if(!WITHIN_RANGE(component_id, attached_components)) + return + examined_component = WEAKREF(attached_components[component_id]) + examined_rel_x = text2num(params["x"]) + examined_rel_y = text2num(params["y"]) + . = TRUE + if("remove_examined_component") + examined_component = null + . = TRUE + +/obj/item/integrated_circuit/proc/on_atom_usb_cable_try_attach(datum/source, obj/item/usb_cable/usb_cable, mob/user) + usb_cable.balloon_alert(user, "circuit needs to be in a compatible shell") + return COMSIG_CANCEL_USB_CABLE_ATTACK + +#undef WITHIN_RANGE + +/** + * Returns the creator of the integrated circuit. Used in admin messages and other related things. + */ +/obj/item/integrated_circuit/proc/get_creator_admin() + return get_creator(include_link = TRUE) + +/** + * Returns the creator of the integrated circuit. Used in admin logs and other related things. + */ +/obj/item/integrated_circuit/proc/get_creator(include_link = FALSE) + var/datum/mind/inserter + if(inserter_mind) + inserter = inserter_mind.resolve() + + var/obj/item/card/id/id_card + if(owner_id) + id_card = owner_id.resolve() + + return "(Shell: [shell || "*null*"], Inserter: [key_name(inserter, include_link)], Owner ID: [id_card?.name || "*null*"])" diff --git a/code/modules/wiremod/marker.dm b/code/modules/wiremod/marker.dm new file mode 100644 index 0000000000000..39812c02eb623 --- /dev/null +++ b/code/modules/wiremod/marker.dm @@ -0,0 +1,48 @@ +/obj/item/multitool/circuit + name = "circuit multitool" + desc = "A circuit multitool. Used to mark entities which can then be uploaded to components by pressing the upload button on a port. \ + Acts as a normal multitool otherwise. Use in hand to clear marked entity so that you can mark another entity." + icon_state = "multitool_circuit" + item_state = "multitool_circuit" + /// The marked atom of this multitool + var/atom/marked_atom + +/obj/item/multitool/circuit/Destroy() + marked_atom = null + return ..() + +/obj/item/multitool/circuit/on_examine(datum/source, mob/user, list/examine_list) + . = ..() + examine_list += "It has [marked_atom? "a" : "no"] marked entity registered." + +/obj/item/multitool/circuit/attack_self(mob/user, modifiers) + . = ..() + if(.) + return + if(!marked_atom) + return + + say("Cleared marked targets.") + clear_marked_atom() + return TRUE + +/obj/item/multitool/circuit/melee_attack_chain(mob/user, atom/target, params) + if(marked_atom || !user.Adjacent(target)) + return ..() + + say("Marked [target].") + marked_atom = target + RegisterSignal(marked_atom, COMSIG_PARENT_QDELETING, .proc/cleanup_marked_atom) + return TRUE + +/// Clears the current marked atom +/obj/item/multitool/circuit/proc/clear_marked_atom() + if(!marked_atom) + return + UnregisterSignal(marked_atom, COMSIG_PARENT_QDELETING) + marked_atom = null + +/obj/item/multitool/circuit/proc/cleanup_marked_atom(datum/source) + SIGNAL_HANDLER + if(source == marked_atom) + clear_marked_atom() diff --git a/code/modules/wiremod/port.dm b/code/modules/wiremod/port.dm new file mode 100644 index 0000000000000..c63621af0d1c8 --- /dev/null +++ b/code/modules/wiremod/port.dm @@ -0,0 +1,285 @@ +/** + * # Component Port + * + * A base type port used by a component + * + * Connects to other ports. This is an abstract type that should not be instanciated + */ +/datum/port + /// The component this port is attached to + var/obj/item/circuit_component/connected_component + + /// Name of the port. Used when displaying the port. + var/name + + /// The port type. Ports can only connect to each other if the type matches + var/datatype + + /// The default port type. Stores the original datatype of the port set on Initialize. + var/default_datatype + + /// The port color. If unset, appears as blue. + var/color + +/datum/port/New(obj/item/circuit_component/to_connect, name, datatype) + if(!to_connect) + qdel(src) + return + . = ..() + // Don't need to do src.connected_component here, but it looks inline + // with the other variable declarations + src.connected_component = to_connect + src.name = name + src.datatype = datatype + src.default_datatype = datatype + src.color = datatype_to_color() + + +///Converts the datatype into an appropriate colour +/datum/port/proc/datatype_to_color() + switch(datatype) + if(PORT_TYPE_ATOM) + return "purple" + if(PORT_TYPE_NUMBER) + return "green" + if(PORT_TYPE_STRING) + return "orange" + if(PORT_TYPE_LIST) + return "white" + if(PORT_TYPE_SIGNAL) + return "teal" + if(PORT_TYPE_TABLE) + return "grey" + +/datum/port/Destroy(force) + if(!force && !QDELETED(connected_component)) + // This should never happen. Ports should be deleted with their components + stack_trace("Attempted to delete a port with a non-destroyed connected_component! (port name: [name], component type: [connected_component.type])") + return QDEL_HINT_LETMELIVE + connected_component = null + return ..() + +/** + * Returns the value to be set for the port + * + * Used for implicit conversions between outputs and inputs (e.g. number -> string) + * and applying/removing signals on inputs + */ +/datum/port/proc/convert_value(prev_value, value_to_convert) + if(prev_value == value_to_convert) + return prev_value + . = value_to_convert + + if(isnull(value_to_convert)) + return null + + switch(datatype) + if(PORT_TYPE_STRING) + // So that they can't easily get the name like this. + if(isatom(value_to_convert)) + return PORT_TYPE_ATOM + else + return "[value_to_convert]" + + if(isatom(value_to_convert)) + var/atom/atom_to_check = value_to_convert + if(QDELETED(atom_to_check)) + return null + +/** + * Sets the datatype of the port. + * + * Arguments: + * * type_to_set - The type this port is set to. + */ +/datum/port/proc/set_datatype(type_to_set) + datatype = type_to_set + color = datatype_to_color() + disconnect() + if(connected_component?.parent) + SStgui.update_uis(connected_component.parent) + +/** + * Disconnects a port from all other ports + * + * Called by [/obj/item/circuit_component] whenever it is disconnected from + * an integrated circuit + */ +/datum/port/proc/disconnect() + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_PORT_DISCONNECT) + + +/** + * # Output Port + * + * An output port that many input ports can connect to + * + * Sends a signal whenever the output value is changed + */ +/datum/port/output + /// The output value of the port + var/output_value + +/datum/port/output/disconnect() + set_output(null) + return ..() + +/datum/port/output/Destroy(force) + output_value = null + return ..() + +/** + * Sets the output value of the port + * + * Arguments: + * * value - The value to set it to + */ +/datum/port/output/proc/set_output(value) + if(isatom(output_value)) + UnregisterSignal(output_value, COMSIG_PARENT_QDELETING) + output_value = convert_value(output_value, value) + if(isatom(output_value)) + RegisterSignal(output_value, COMSIG_PARENT_QDELETING, .proc/null_output) + + SEND_SIGNAL(src, COMSIG_PORT_SET_OUTPUT, output_value) + +/// Signal handler proc to null the output if an atom is deleted. An update is not sent because this was not set. +/datum/port/output/proc/null_output(datum/source) + SIGNAL_HANDLER + if(output_value == source) + output_value = null + +/datum/port/output/set_datatype(type_to_set) + . = ..() + set_output(null) + +/** + * Determines if a datatype is compatible with this port. + * + * Arguments: + * * other_datatype - The datatype to check + */ +/datum/port/output/proc/compatible_datatype(datatype_to_check) + if(datatype_to_check == datatype) + return TRUE + + switch(datatype) + if(PORT_TYPE_NUMBER) + // Can easily convert a number to string. Everything else has to use a tostring component + return datatype_to_check == PORT_TYPE_STRING || datatype_to_check == PORT_TYPE_SIGNAL + if(PORT_TYPE_SIGNAL) + // A signal port is just a number port but distinguishable + return datatype_to_check == PORT_TYPE_NUMBER + + return FALSE + +/** + * # Input Port + * + * An input port that can only be connected to 1 output port + * + * Registers a signal on the target output port to listen out for any output + * so that an update can be sent to the attached component + */ +/datum/port/input + /// The output value of the port + var/input_value + + /// The connected output port + var/datum/port/output/connected_port + + /// Whether this port triggers an update whenever an output is received. + var/trigger = FALSE + + /// The default value of this input + var/default + +/datum/port/input/New(obj/item/circuit_component/to_connect, name, datatype, trigger, default) + . = ..() + src.trigger = trigger + src.default = default + set_input(default, FALSE) + +/** + * Connects the input port to the output port + * + * Sets the input_value and registers a signal to receive future updates. + * Arguments: + * * port_to_register - The port to connect the input port to + */ +/datum/port/input/proc/register_output_port(datum/port/output/port_to_register) + unregister_output_port() + + RegisterSignal(port_to_register, COMSIG_PORT_SET_OUTPUT, .proc/receive_output) + RegisterSignal(port_to_register, list( + COMSIG_PORT_DISCONNECT, + COMSIG_PARENT_QDELETING + ), .proc/unregister_output_port) + + connected_port = port_to_register + SEND_SIGNAL(connected_port, COMSIG_PORT_OUTPUT_CONNECT, src) + set_input(connected_port.output_value) + + +/** + * Sets a timer depending on the value of the input_receive_delay + * + * The timer will call a proc that updates the value. + * Arguments: + * * connected_port - The connected output port + * * new_value - The new value received from the output port + */ +/datum/port/input/proc/receive_output(datum/port/output/connected_port, new_value) + SIGNAL_HANDLER + + SScircuit_component.add_callback(CALLBACK(src, .proc/set_input, new_value)) + +/** + * Updates the value of the input + * + * It updates the value of the input and calls input_received on the connected component + * Arguments: + * * port_to_register - The port to connect the input port to + */ +/datum/port/input/proc/set_input(new_value, send_update = TRUE) + if(isatom(input_value)) + UnregisterSignal(input_value, COMSIG_PARENT_QDELETING) + input_value = convert_value(input_value, new_value) + if(isatom(input_value)) + RegisterSignal(input_value, COMSIG_PARENT_QDELETING, .proc/null_output) + + SEND_SIGNAL(src, COMSIG_PORT_SET_INPUT, input_value) + if(trigger && send_update) + TRIGGER_CIRCUIT_COMPONENT(connected_component, src) + +/// Signal handler proc to null the input if an atom is deleted. An update is not sent because this was not set by anything. +/datum/port/input/proc/null_output(datum/source) + SIGNAL_HANDLER + if(input_value == source) + input_value = null + +/datum/port/input/disconnect() + unregister_output_port() + return ..() + +/datum/port/input/set_datatype(type_to_set) + . = ..() + set_input(default) + +/datum/port/input/proc/unregister_output_port() + SIGNAL_HANDLER + if(!connected_port) + return + UnregisterSignal(connected_port, list( + COMSIG_PARENT_QDELETING, + COMSIG_PORT_SET_OUTPUT, + COMSIG_PORT_DISCONNECT + )) + connected_port = null + set_input(default) + +/datum/port/input/Destroy() + unregister_output_port() + connected_port = null + return ..() diff --git a/code/modules/wiremod/preset/hello_world.dm b/code/modules/wiremod/preset/hello_world.dm new file mode 100644 index 0000000000000..8e0d244ec9ae3 --- /dev/null +++ b/code/modules/wiremod/preset/hello_world.dm @@ -0,0 +1,13 @@ +/** + * # Hello World preset + * + * Says "Hello World" when triggered. Needs to be wired up and connected first. + */ +/obj/item/integrated_circuit/loaded/hello_world + +/obj/item/integrated_circuit/loaded/hello_world/Initialize() + . = ..() + var/obj/item/circuit_component/speech/speech = new() + add_component(speech) + + speech.message.set_input("Hello World") diff --git a/code/modules/wiremod/preset/speech_relay.dm b/code/modules/wiremod/preset/speech_relay.dm new file mode 100644 index 0000000000000..859c2970eeb67 --- /dev/null +++ b/code/modules/wiremod/preset/speech_relay.dm @@ -0,0 +1,21 @@ +/** + * # Speech Relay preset + * + * Acts like poly. Says whatever it hears. + */ +/obj/item/integrated_circuit/loaded/speech_relay + +/obj/item/integrated_circuit/loaded/speech_relay/Initialize() + . = ..() + var/obj/item/circuit_component/hear/hear = new() + add_component(hear) + hear.rel_x = 100 + hear.rel_y = 200 + + var/obj/item/circuit_component/speech/speech = new() + add_component(speech) + speech.rel_x = 400 + speech.rel_y = 200 + + speech.message.register_output_port(hear.message_port) + speech.trigger.register_output_port(hear.trigger_port) diff --git a/code/modules/wiremod/shell/airlock.dm b/code/modules/wiremod/shell/airlock.dm new file mode 100644 index 0000000000000..918fc721cc646 --- /dev/null +++ b/code/modules/wiremod/shell/airlock.dm @@ -0,0 +1,145 @@ +/obj/machinery/door/airlock/shell + name = "circuit airlock" + autoclose = FALSE + +/obj/machinery/door/airlock/shell/Initialize() + . = ..() + AddComponent( \ + /datum/component/shell, \ + unremovable_circuit_components = list(new /obj/item/circuit_component/airlock), \ + capacity = SHELL_CAPACITY_LARGE, \ + shell_flags = SHELL_FLAG_ALLOW_FAILURE_ACTION \ + ) + +/obj/machinery/door/airlock/shell/check_access(obj/item/I) + return FALSE + +/obj/item/circuit_component/airlock + display_name = "Airlock" + display_desc = "The general interface with an airlock. Includes general statuses of the airlock" + + /// Called when attack_hand is called on the shell. + var/obj/machinery/door/airlock/attached_airlock + + /// Bolts the airlock (if possible) + var/datum/port/input/bolt + /// Unbolts the airlock (if possible) + var/datum/port/input/unbolt + /// Opens the airlock (if possible) + var/datum/port/input/open + /// Closes the airlock (if possible) + var/datum/port/input/close + + /// Contains whether the airlock is open or not + var/datum/port/output/is_open + /// Contains whether the airlock is bolted or not + var/datum/port/output/is_bolted + + /// Called when the airlock is opened. + var/datum/port/output/opened + /// Called when the airlock is closed + var/datum/port/output/closed + + /// Called when the airlock is bolted + var/datum/port/output/bolted + /// Called when the airlock is unbolted + var/datum/port/output/unbolted + + /// Contains the last person to touch the airlock + var/datum/port/output/user_port + /// Called when the airlock is touched + var/datum/port/output/trigger_port + +/obj/item/circuit_component/airlock/Initialize() + . = ..() + // Input Signals + bolt = add_input_port("Bolt", PORT_TYPE_SIGNAL) + unbolt = add_input_port("Unbolt", PORT_TYPE_SIGNAL) + open = add_input_port("Open", PORT_TYPE_SIGNAL) + close = add_input_port("Close", PORT_TYPE_SIGNAL) + // States + is_open = add_output_port("Is Open", PORT_TYPE_NUMBER) + is_bolted = add_output_port("Is Bolted", PORT_TYPE_NUMBER) + // Output Signals + opened = add_output_port("Opened", PORT_TYPE_SIGNAL) + closed = add_output_port("Closed", PORT_TYPE_SIGNAL) + bolted = add_output_port("Bolted", PORT_TYPE_SIGNAL) + unbolted = add_output_port("Unbolted", PORT_TYPE_SIGNAL) + user_port = add_output_port("User", PORT_TYPE_ATOM) + trigger_port = add_output_port("Triggered", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/airlock/Destroy() + bolt = null + unbolt = null + open = null + close = null + is_open = null + is_bolted = null + opened = null + closed = null + bolted = null + unbolted = null + user_port = null + trigger_port = null + attached_airlock = null + return ..() + +/obj/item/circuit_component/airlock/register_shell(atom/movable/shell) + . = ..() + if(istype(shell, /obj/machinery/door/airlock)) + attached_airlock = shell + RegisterSignal(shell, COMSIG_AIRLOCK_SET_BOLT, .proc/on_airlock_set_bolted) + RegisterSignal(shell, COMSIG_AIRLOCK_OPEN, .proc/on_airlock_open) + RegisterSignal(shell, COMSIG_AIRLOCK_CLOSE, .proc/on_airlock_closed) + RegisterSignal(shell, COMSIG_AIRLOCK_TOUCHED, .proc/on_airlock_touched) + +/obj/item/circuit_component/airlock/unregister_shell(atom/movable/shell) + attached_airlock = null + UnregisterSignal(shell, list( + COMSIG_AIRLOCK_SET_BOLT, + COMSIG_AIRLOCK_OPEN, + COMSIG_AIRLOCK_CLOSE, + COMSIG_AIRLOCK_TOUCHED, + )) + return ..() + +/obj/item/circuit_component/airlock/proc/on_airlock_set_bolted(datum/source, should_bolt) + SIGNAL_HANDLER + is_bolted.set_output(should_bolt) + if(should_bolt) + bolted.set_output(COMPONENT_SIGNAL) + else + unbolted.set_output(COMPONENT_SIGNAL) + +/obj/item/circuit_component/airlock/proc/on_airlock_open(datum/source, force) + SIGNAL_HANDLER + is_open.set_output(TRUE) + opened.set_output(COMPONENT_SIGNAL) + +/obj/item/circuit_component/airlock/proc/on_airlock_closed(datum/source, forced) + SIGNAL_HANDLER + is_open.set_output(FALSE) + closed.set_output(COMPONENT_SIGNAL) + +/obj/item/circuit_component/airlock/proc/on_airlock_touched(datum/source, user) + SIGNAL_HANDLER + . = COMPONENT_PREVENT_OPEN + user_port.set_output(user) + trigger_port.set_output(COMPONENT_SIGNAL) + +/obj/item/circuit_component/airlock/input_received(datum/port/input/port) + . = ..() + if(.) + return + + if(!attached_airlock) + return + + if(COMPONENT_TRIGGERED_BY(bolt, port)) + attached_airlock.bolt() + if(COMPONENT_TRIGGERED_BY(unbolt, port)) + attached_airlock.unbolt() + if(COMPONENT_TRIGGERED_BY(open, port) && attached_airlock.density) + INVOKE_ASYNC(attached_airlock, /obj/machinery/door/airlock.proc/open) + if(COMPONENT_TRIGGERED_BY(close, port) && !attached_airlock.density) + INVOKE_ASYNC(attached_airlock, /obj/machinery/door/airlock.proc/close) diff --git a/code/modules/wiremod/shell/bot.dm b/code/modules/wiremod/shell/bot.dm new file mode 100644 index 0000000000000..1aa1060b98ae3 --- /dev/null +++ b/code/modules/wiremod/shell/bot.dm @@ -0,0 +1,48 @@ +/** + * # Bot + * + * Immobile (but not dense) shells that can interact with world. + */ +/obj/structure/bot + name = "bot" + icon = 'icons/obj/wiremod.dmi' + icon_state = "setup_medium_box" + + density = FALSE + light_range = FALSE + +/obj/structure/bot/Initialize() + . = ..() + AddComponent( \ + /datum/component/shell, \ + unremovable_circuit_components = list(new /obj/item/circuit_component/bot), \ + capacity = SHELL_CAPACITY_LARGE, \ + shell_flags = SHELL_FLAG_USB_PORT, \ + ) + +/obj/item/circuit_component/bot + display_name = "Bot" + display_desc = "Triggers when someone interacts with the bot." + + /// Called when attack_hand is called on the shell. + var/datum/port/output/signal + +/obj/item/circuit_component/bot/Initialize() + . = ..() + signal = add_output_port("Signal", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/bot/Destroy() + signal = null + return ..() + +/obj/item/circuit_component/bot/register_shell(atom/movable/shell) + RegisterSignal(shell, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand) + +/obj/item/circuit_component/bot/unregister_shell(atom/movable/shell) + UnregisterSignal(shell, COMSIG_ATOM_ATTACK_HAND) + +/obj/item/circuit_component/bot/proc/on_attack_hand(atom/source, mob/user) + SIGNAL_HANDLER + source.balloon_alert(user, "pushed button") + playsound(source, get_sfx("terminal_type"), 25, FALSE) + signal.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/wiremod/shell/compact_remote.dm b/code/modules/wiremod/shell/compact_remote.dm new file mode 100644 index 0000000000000..84d57f589b2e2 --- /dev/null +++ b/code/modules/wiremod/shell/compact_remote.dm @@ -0,0 +1,50 @@ +/** + * # Compact Remote + * + * A handheld device with one big button. + */ +/obj/item/compact_remote + name = "compact remote" + icon = 'icons/obj/wiremod.dmi' + icon_state = "setup_small_simple" + item_state = "electronic" + //worn_icon_state = "electronic" //remember to change it later lol + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + light_range = FALSE + +/obj/item/compact_remote/Initialize() + . = ..() + AddComponent(/datum/component/shell, list( + new /obj/item/circuit_component/compact_remote() + ), SHELL_CAPACITY_SMALL) + +/obj/item/circuit_component/compact_remote + display_name = "Compact Remote" + display_desc = "Used to receive inputs from the compact remote shell. Use the shell in hand to trigger the output signal." + + /// Called when attack_self is called on the shell. + var/datum/port/output/signal + +/obj/item/circuit_component/compact_remote/Initialize() + . = ..() + signal = add_output_port("Signal", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/compact_remote/Destroy() + signal = null + return ..() + +/obj/item/circuit_component/compact_remote/register_shell(atom/movable/shell) + RegisterSignal(shell, COMSIG_ITEM_ATTACK_SELF, .proc/send_trigger) + +/obj/item/circuit_component/compact_remote/unregister_shell(atom/movable/shell) + UnregisterSignal(shell, COMSIG_ITEM_ATTACK_SELF) + +/** + * Called when the shell item is used in hand. + */ +/obj/item/circuit_component/compact_remote/proc/send_trigger(atom/source, mob/user) + SIGNAL_HANDLER + source.balloon_alert(user, "clicked primary button") + playsound(source, get_sfx("terminal_type"), 25, FALSE) + signal.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/wiremod/shell/controller.dm b/code/modules/wiremod/shell/controller.dm new file mode 100644 index 0000000000000..692508f19b3b4 --- /dev/null +++ b/code/modules/wiremod/shell/controller.dm @@ -0,0 +1,82 @@ +/** + * # Compact Remote + * + * A handheld device with several buttons. + * In game, this translates to having different signals for normal usage, alt-clicking, and ctrl-clicking when in your hand. + */ +/obj/item/controller + name = "controller" + icon = 'icons/obj/wiremod.dmi' + icon_state = "setup_small_calc" + item_state = "electronic" + //worn_icon_state = "electronic" //remember to change it + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + light_range = FALSE + +/obj/item/controller/Initialize() + . = ..() + AddComponent(/datum/component/shell, list( + new /obj/item/circuit_component/controller() + ), SHELL_CAPACITY_MEDIUM) + +/obj/item/circuit_component/controller + display_name = "Controller" + display_desc = "Used to receive inputs from the controller shell. Use the shell in hand to trigger the output signal. Alt-click for the alternate signal. Right click for the extra signal." + + /// The three separate buttons that are called in attack_hand on the shell. + var/datum/port/output/signal + var/datum/port/output/alt + var/datum/port/output/right + +/obj/item/circuit_component/controller/Initialize() + . = ..() + signal = add_output_port("Signal", PORT_TYPE_SIGNAL) + alt = add_output_port("Alternate Signal", PORT_TYPE_SIGNAL) + right = add_output_port("Extra Signal", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/controller/Destroy() + signal = null + alt = null + right = null + return ..() + +/obj/item/circuit_component/controller/register_shell(atom/movable/shell) + RegisterSignal(shell, COMSIG_ITEM_ATTACK_SELF, .proc/send_trigger) + RegisterSignal(shell, COMSIG_CLICK_ALT, .proc/send_alternate_signal) + +/obj/item/circuit_component/controller/unregister_shell(atom/movable/shell) + UnregisterSignal(shell, list( + COMSIG_ITEM_ATTACK_SELF, + COMSIG_CLICK_ALT, + )) + +/** + * Called when the shell item is used in hand, including right click. + */ +/obj/item/circuit_component/controller/proc/send_trigger(atom/source, mob/user) + SIGNAL_HANDLER + if(!user.Adjacent(source)) + return + source.balloon_alert(user, "clicked primary button") + playsound(source, get_sfx("terminal_type"), 25, FALSE) + signal.set_output(COMPONENT_SIGNAL) + +/** + * Called when the shell item is alt-clicked + */ +/obj/item/circuit_component/controller/proc/send_alternate_signal(atom/source, mob/user) + SIGNAL_HANDLER + if(!user.Adjacent(source)) + return + source.balloon_alert(user, "clicked alternate button") + playsound(source, get_sfx("terminal_type"), 25, FALSE) + alt.set_output(COMPONENT_SIGNAL) + +/obj/item/circuit_component/controller/proc/send_right_signal(atom/source, mob/user) + SIGNAL_HANDLER + if(!user.Adjacent(source)) + return + source.balloon_alert(user, "clicked extra button") + playsound(source, get_sfx("terminal_type"), 25, FALSE) + right.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/wiremod/shell/drone.dm b/code/modules/wiremod/shell/drone.dm new file mode 100644 index 0000000000000..2bbb58c55dd0f --- /dev/null +++ b/code/modules/wiremod/shell/drone.dm @@ -0,0 +1,81 @@ +/** + * # Drone + * + * A movable mob that can be fed inputs on which direction to travel. + */ +/mob/living/circuit_drone + name = "drone" + icon = 'icons/obj/wiremod.dmi' + icon_state = "setup_medium_med" + //light_system = MOVABLE_LIGHT_DIRECTIONAL + light_range = FALSE + +/mob/living/circuit_drone/Initialize() + . = ..() + AddComponent(/datum/component/shell, list( + new /obj/item/circuit_component/bot_circuit() + ), SHELL_CAPACITY_LARGE) + +/mob/living/circuit_drone/updatehealth() + . = ..() + if(health < 0) + gib(no_brain = TRUE, no_organs = TRUE, no_bodyparts = TRUE) + +/mob/living/circuit_drone/spawn_gibs() + new /obj/effect/gibspawner/robot(drop_location(), src, get_static_viruses()) + +/obj/item/circuit_component/bot_circuit + display_name = "Drone" + display_desc = "Used to send movement output signals to the drone shell." + + /// The inputs to allow for the drone to move + var/datum/port/input/north + var/datum/port/input/east + var/datum/port/input/south + var/datum/port/input/west + + // Done like this so that travelling diagonally is more simple + COOLDOWN_DECLARE(north_delay) + COOLDOWN_DECLARE(east_delay) + COOLDOWN_DECLARE(south_delay) + COOLDOWN_DECLARE(west_delay) + + /// Delay between each movement + var/move_delay = 0.2 SECONDS + +/obj/item/circuit_component/bot_circuit/Initialize() + . = ..() + north = add_input_port("Move North", PORT_TYPE_SIGNAL) + east = add_input_port("Move East", PORT_TYPE_SIGNAL) + south = add_input_port("Move South", PORT_TYPE_SIGNAL) + west = add_input_port("Move West", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/bot_circuit/input_received(datum/port/input/port) + . = ..() + if(.) + return + + var/mob/living/shell = parent.shell + if(!istype(shell) || shell.stat) + return + + var/direction + + if(COMPONENT_TRIGGERED_BY(north, port) && COOLDOWN_FINISHED(src, north_delay)) + direction = NORTH + COOLDOWN_START(src, north_delay, move_delay) + else if(COMPONENT_TRIGGERED_BY(east, port) && COOLDOWN_FINISHED(src, east_delay)) + direction = EAST + COOLDOWN_START(src, east_delay, move_delay) + else if(COMPONENT_TRIGGERED_BY(south, port) && COOLDOWN_FINISHED(src, south_delay)) + direction = SOUTH + COOLDOWN_START(src, south_delay, move_delay) + else if(COMPONENT_TRIGGERED_BY(west, port) && COOLDOWN_FINISHED(src, west_delay)) + direction = WEST + COOLDOWN_START(src, west_delay, move_delay) + + if(!direction) + return + + if(shell.Process_Spacemove(direction)) + shell.Move(get_step(shell, direction), direction) diff --git a/code/modules/wiremod/shell/moneybot.dm b/code/modules/wiremod/shell/moneybot.dm new file mode 100644 index 0000000000000..1aea59c8908fd --- /dev/null +++ b/code/modules/wiremod/shell/moneybot.dm @@ -0,0 +1,151 @@ +/** + * # Money Bot + * + * Immobile (but not dense) shell that can receive and dispense money. + */ +/obj/structure/money_bot + name = "money bot" + icon = 'icons/obj/wiremod.dmi' + icon_state = "setup_large" + + density = FALSE + light_range = FALSE + + var/stored_money = 0 + +/obj/structure/money_bot/deconstruct(disassembled) + new /obj/item/holochip(drop_location(), stored_money) + return ..() + +/obj/structure/money_bot/proc/add_money(to_add) + stored_money += to_add + SEND_SIGNAL(src, COMSIG_MONEYBOT_ADD_MONEY, to_add) + +/obj/structure/money_bot/Initialize() + . = ..() + AddComponent(/datum/component/shell, list( + new /obj/item/circuit_component/money_bot(), + new /obj/item/circuit_component/money_dispenser() + ), SHELL_CAPACITY_LARGE) + +/obj/structure/money_bot/wrench_act(mob/living/user, obj/item/tool) + anchored = !anchored + tool.play_tool_sound(src) + balloon_alert(user, "You [anchored?"secure":"unsecure"] [src].") + return TRUE + + +/obj/item/circuit_component/money_dispenser + display_name = "Money Dispenser" + display_desc = "Used to dispense money from the money bot. Money is taken from the internal storage of money." + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + /// The amount of money to dispense + var/datum/port/input/dispense_amount + + /// Outputs a signal when it fails to output any money. + var/datum/port/output/on_fail + + var/obj/structure/money_bot/attached_bot + +/obj/item/circuit_component/money_dispenser/Initialize() + . = ..() + dispense_amount = add_input_port("Amount", PORT_TYPE_NUMBER) + on_fail = add_output_port("On Failed", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/money_dispenser/register_shell(atom/movable/shell) + . = ..() + if(istype(shell, /obj/structure/money_bot)) + attached_bot = shell + +/obj/item/circuit_component/money_dispenser/unregister_shell(atom/movable/shell) + attached_bot = null + return ..() + +/obj/item/circuit_component/money_dispenser/input_received(datum/port/input/port) + . = ..() + if(.) + return + + if(!attached_bot) + return + + var/to_dispense = clamp(dispense_amount.input_value, 0, attached_bot.stored_money) + if(!to_dispense) + on_fail.set_output(COMPONENT_SIGNAL) + return + attached_bot.add_money(-to_dispense) + new /obj/item/holochip(drop_location(), to_dispense) + +/obj/item/circuit_component/money_dispenser/Destroy() + dispense_amount = null + attached_bot = null + return ..() + +/obj/item/circuit_component/money_bot + display_name = "Money Bot" + display_desc = "Used to receive input signals when money is inserted into the money bot shell and also keep track of the total money in the shell." + var/obj/structure/money_bot/attached_bot + + /// Total money in the shell + var/datum/port/output/total_money + /// Amount of the last money inputted into the shell + var/datum/port/output/money_input + /// Person that inserted the money + var/datum/port/output/payer + /// Trigger for when money is inputted into the shell + var/datum/port/output/money_trigger + +/obj/item/circuit_component/money_bot/Initialize() + . = ..() + total_money = add_output_port("Total Money", PORT_TYPE_NUMBER) + money_input = add_output_port("Last Input Money", PORT_TYPE_NUMBER) + payer = add_output_port("Payer", PORT_TYPE_ATOM) + money_trigger = add_output_port("Money Input", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/money_bot/register_shell(atom/movable/shell) + . = ..() + if(istype(shell, /obj/structure/money_bot)) + attached_bot = shell + total_money.set_output(attached_bot.stored_money) + RegisterSignal(shell, COMSIG_PARENT_ATTACKBY, .proc/handle_money_insert) + RegisterSignal(shell, COMSIG_MONEYBOT_ADD_MONEY, .proc/handle_money_update) + +/obj/item/circuit_component/money_bot/unregister_shell(atom/movable/shell) + UnregisterSignal(shell, list( + COMSIG_PARENT_ATTACKBY, + COMSIG_MONEYBOT_ADD_MONEY, + )) + total_money.set_output(null) + attached_bot = null + return ..() + +/obj/item/circuit_component/money_bot/Destroy() + attached_bot = null + total_money = null + money_input = null + payer = null + money_trigger = null + return ..() + +/obj/item/circuit_component/money_bot/proc/handle_money_insert(atom/source, obj/item/item, mob/living/attacker) + SIGNAL_HANDLER + if(!attached_bot || !iscash(item)) + return + + var/amount_to_insert = item.get_item_credit_value() + if(!amount_to_insert) + balloon_alert(attacker, "this has no value!") + return + + attached_bot.add_money(amount_to_insert) + balloon_alert(attacker, "inserted [amount_to_insert] credits.") + money_input.set_output(amount_to_insert) + payer.set_output(attacker) + money_trigger.set_output(COMPONENT_SIGNAL) + qdel(item) + +/obj/item/circuit_component/money_bot/proc/handle_money_update(atom/source) + SIGNAL_HANDLER + if(attached_bot) + total_money.set_output(attached_bot.stored_money) diff --git a/code/modules/wiremod/shell/scanner.dm b/code/modules/wiremod/shell/scanner.dm new file mode 100644 index 0000000000000..0874467036226 --- /dev/null +++ b/code/modules/wiremod/shell/scanner.dm @@ -0,0 +1,55 @@ +/** + * # Scanner + * + * A handheld device which scans things. + */ +/obj/item/scanner + name = "scanner" + icon = 'icons/obj/assemblies/electronic_setups.dmi' + icon_state = "setup_small_hook" + item_state = "electronic" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + light_range = FALSE + +/obj/item/scanner/Initialize() + . = ..() + AddComponent(/datum/component/shell, list( + new /obj/item/circuit_component/scanner() + ), SHELL_CAPACITY_SMALL) + +/obj/item/circuit_component/scanner + display_name = "Scanner" + display_desc = "Used to receive inputs from the scanner shell. Use the shell on something to scan it." + + /// Atom that was scanned. + var/datum/port/output/scanned + /// Called when scanner is used. + var/datum/port/output/signal + +/obj/item/circuit_component/scanner/Initialize() + . = ..() + scanned = add_output_port("Scanned", PORT_TYPE_ATOM) + signal = add_output_port("Signal", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/scanner/Destroy() + scanned = null + signal = null + return ..() + +/obj/item/circuit_component/scanner/register_shell(atom/movable/shell) + RegisterSignal(shell, COMSIG_ITEM_PRE_ATTACK, .proc/send_trigger) + +/obj/item/circuit_component/scanner/unregister_shell(atom/movable/shell) + UnregisterSignal(shell, COMSIG_ITEM_PRE_ATTACK) + +/** + * Called when the shell item is used on something. + */ +/obj/item/circuit_component/scanner/proc/send_trigger(atom/source, atom/target, mob/user) + SIGNAL_HANDLER + target.balloon_alert(user, "scanned [target]") + playsound(user, get_sfx("terminal_type"), 25, FALSE) + . = COMPONENT_NO_ATTACK + scanned.set_output(target) + signal.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/wiremod/shell/server.dm b/code/modules/wiremod/shell/server.dm new file mode 100644 index 0000000000000..b1c03c9c8d50e --- /dev/null +++ b/code/modules/wiremod/shell/server.dm @@ -0,0 +1,24 @@ +/** + * # Server + * + * Immobile (but not dense) shells that can interact with + * world. + */ +/obj/structure/server + name = "server" + icon = 'icons/obj/wiremod.dmi' + icon_state = "setup_stationary" + + density = TRUE + //light_system = MOVABLE_LIGHT + light_range = FALSE + +/obj/structure/server/Initialize() + . = ..() + AddComponent(/datum/component/shell, null, SHELL_CAPACITY_VERY_LARGE, SHELL_FLAG_REQUIRE_ANCHOR) + +/obj/structure/server/wrench_act(mob/living/user, obj/item/tool) + anchored = !anchored + tool.play_tool_sound(src) + balloon_alert(user, "You [anchored?"secure":"unsecure"] [src].") + return TRUE diff --git a/code/modules/wiremod/shell/shell_items.dm b/code/modules/wiremod/shell/shell_items.dm new file mode 100644 index 0000000000000..6643bfaf1565a --- /dev/null +++ b/code/modules/wiremod/shell/shell_items.dm @@ -0,0 +1,54 @@ +/** + * # Shell Item + * + * Printed out by protolathes. Screwdriver to complete the shell. + */ +/obj/item/shell + name = "assembly" + desc = "A shell assembly that can be completed by screwdrivering it." + icon = 'icons/obj/wiremod.dmi' + var/shell_to_spawn + var/screw_delay = 3 SECONDS + +/obj/item/shell/screwdriver_act(mob/living/user, obj/item/tool) + user.visible_message("[user] begins finishing [src].", "You begin finishing [src].") + tool.play_tool_sound(src) + if(!do_after(user, screw_delay, target = src)) + return + user.visible_message("[user] finishes [src].", "You finish [src].") + + var/turf/drop_loc = drop_location() + + qdel(src) + if(drop_loc) + new shell_to_spawn(drop_loc) + + return TRUE + +/obj/item/shell/bot + name = "bot assembly" + icon_state = "setup_medium_box-open" + shell_to_spawn = /obj/structure/bot + +/obj/item/shell/money_bot + name = "money bot assembly" + icon_state = "setup_large-open" + shell_to_spawn = /obj/structure/money_bot + +/obj/item/shell/drone + name = "drone assembly" + icon_state = "setup_medium_med-open" + shell_to_spawn = /mob/living/circuit_drone + +/obj/item/shell/server + name = "server assembly" + icon_state = "setup_stationary-open" + shell_to_spawn = /obj/structure/server + screw_delay = 10 SECONDS + +/obj/item/shell/airlock + name = "circuit airlock assembly" + icon = 'icons/obj/doors/airlocks/station/public.dmi' + icon_state = "construction" + shell_to_spawn = /obj/machinery/door/airlock/shell + screw_delay = 10 SECONDS diff --git a/code/modules/wiremod/usb_cable.dm b/code/modules/wiremod/usb_cable.dm new file mode 100644 index 0000000000000..f10101c621c42 --- /dev/null +++ b/code/modules/wiremod/usb_cable.dm @@ -0,0 +1,122 @@ +/// A cable that can connect integrated circuits to anything with a USB port, such as computers and machines. +/obj/item/usb_cable + name = "usb cable" + desc = "A cable that can connect integrated circuits to anything with a USB port, such as computers and machines." + icon = 'icons/obj/wiremod.dmi' + icon_state = "usb_cable" + item_state = "coil" + w_class = WEIGHT_CLASS_TINY + custom_materials = list(/datum/material/iron = 75) + + /// The currently connected circuit + var/obj/item/integrated_circuit/attached_circuit + +/obj/item/usb_cable/Destroy() + attached_circuit = null + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/usb_cable/Initialize() + . = ..() + RegisterSignal(src, COMSIG_MOVABLE_MOVED, .proc/on_moved) + +/obj/item/usb_cable/examine(mob/user) + . = ..() + + if (!isnull(attached_circuit)) + . += "It is attached to [attached_circuit.shell || attached_circuit]." + +// Look, I'm not happy about this either, but moving an object doesn't call Moved if it's inside something else. +// There's good reason for this, but there's no element or similar yet to track it as far as I know. +// SSobj runs infrequently, this is only ran while there's an attached circuit, its performance cost is negligible. +/obj/item/usb_cable/process(delta_time) + if (!check_in_range()) + return PROCESS_KILL + +/obj/item/usb_cable/pre_attack(atom/target, mob/living/user, params) + . = ..() + if (.) + return + + if (prob(1)) + balloon_alert(user, "wrong way, god damnit") + return TRUE + + var/signal_result = SEND_SIGNAL(target, COMSIG_ATOM_USB_CABLE_TRY_ATTACH, src, user) + + var/last_attached_circuit = attached_circuit + if (signal_result & COMSIG_USB_CABLE_CONNECTED_TO_CIRCUIT) + if (isnull(attached_circuit)) + CRASH("Producers of COMSIG_USB_CABLE_CONNECTED_TO_CIRCUIT must set attached_circuit") + balloon_alert(user, "connected to circuit\nconnect to a port") + + playsound(src, 'sound/machines/pda_button1.ogg', 20, TRUE) + + if (last_attached_circuit != attached_circuit) + if (!isnull(last_attached_circuit)) + unregister_circuit_signals(last_attached_circuit) + register_circuit_signals() + + START_PROCESSING(SSobj, src) + + return TRUE + + if (signal_result & COMSIG_USB_CABLE_ATTACHED) + // Short messages are better to read + var/connection_description = "port" + if (istype(target, /obj/machinery/computer)) + connection_description = "computer" + else if (ismachinery(target)) + connection_description = "machine" + + balloon_alert(user, "connected to [connection_description]") + playsound(src, 'sound/items/screwdriver2.ogg', 20, TRUE) + + return TRUE + + if (signal_result & COMSIG_CANCEL_USB_CABLE_ATTACK) + return TRUE + + return FALSE + +/obj/item/usb_cable/suicide_act(mob/user) + user.visible_message("[user] is wrapping [src] around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide!") + return OXYLOSS + +/obj/item/usb_cable/proc/register_circuit_signals() + RegisterSignal(attached_circuit, COMSIG_MOVABLE_MOVED, .proc/on_moved) + RegisterSignal(attached_circuit, COMSIG_PARENT_QDELETING, .proc/on_circuit_qdeling) + RegisterSignal(attached_circuit.shell, COMSIG_MOVABLE_MOVED, .proc/on_moved) + +/obj/item/usb_cable/proc/unregister_circuit_signals(obj/item/integrated_circuit/old_circuit) + UnregisterSignal(attached_circuit, list( + COMSIG_MOVABLE_MOVED, + COMSIG_PARENT_QDELETING, + )) + + UnregisterSignal(attached_circuit.shell, COMSIG_MOVABLE_MOVED) + +/obj/item/usb_cable/proc/on_moved() + SIGNAL_HANDLER + + check_in_range() + +/obj/item/usb_cable/proc/check_in_range() + if (isnull(attached_circuit)) + STOP_PROCESSING(SSobj, src) + return FALSE + + if (!IN_GIVEN_RANGE(attached_circuit, src, USB_CABLE_MAX_RANGE)) + balloon_alert_to_viewers("detached, too far away") + unregister_circuit_signals(attached_circuit) + attached_circuit = null + STOP_PROCESSING(SSobj, src) + return FALSE + + return TRUE + +/obj/item/usb_cable/proc/on_circuit_qdeling() + SIGNAL_HANDLER + + attached_circuit = null + STOP_PROCESSING(SSobj, src) diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index 0383533c6c896..0143947669932 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -30,7 +30,7 @@ /obj/item/organ/zombie_infection/Remove(mob/living/carbon/M, special = 0) . = ..() STOP_PROCESSING(SSobj, src) - if(iszombie(M) && old_species) + if(iszombie(M) && old_species && !QDELETED(M)) M.set_species(old_species) if(timer_id) deltimer(timer_id) @@ -40,14 +40,16 @@ web of pus and viscera, bound tightly around the brain like some \ biological harness.") -/obj/item/organ/zombie_infection/process() +/obj/item/organ/zombie_infection/process(delta_time) if(!owner) return + if(owner.IsInStasis()) + return if(!(src in owner.internal_organs)) Remove(owner) if (causes_damage && !iszombie(owner) && owner.stat != DEAD) - owner.adjustToxLoss(1) - if (prob(10)) + owner.adjustToxLoss(0.5 * delta_time) + if(DT_PROB(5, delta_time)) to_chat(owner, "You feel sick...") if(timer_id) return diff --git a/config/README.md b/config/README.md index 6e3ed782863d0..e5d29dc49a300 100644 --- a/config/README.md +++ b/config/README.md @@ -1,2 +1,61 @@ #### These are the current config options for the official BeeStation server. If you plan to host your own fork of our code you are heavily encouraged to review and update these files for your needs. +## Topics Documentation +Beestation uses a heavily modified topic system originally from Aurorastation, which uses JSON objects for requests to and responses from the server. + +### Configuration +Topic config is managed by the **comms.txt** config file. Topic configuration consists of four types of config entry. +* `CROSS_COMMS_NAME` Name the server calls itself in outgoing topics. +* `COMMS_KEY` Multiple of these entries are supported. Consists of a key-value pair of a token (should be randomly generated for security) and the authorized scopes of that token. A list of scopes can be found in the comms.txt file. +* `CROSS_SERVER` Multiple of these entries are supported. This entry is a key-value pair of a server's BYOND address and the token that has access to the remote server. For more information, see [Handshake](#handshake) +* `SERVER_HOP` Multiple of these entries are supported. Each entry is a key-value pair of a server name and a byond address. These servers are not authenticated in any way, and are a list of servers that can be quickly switched to by players using the **Server Hop** verb. + +### Requests +Topic requests consist of a JSON object with three mandatory keys: `auth`, `query` and `source`, as well as optional request-specific keys. + +* `auth` is the token used to access features on the target server. Can either be configured for use by the server operator, or be the `anonymous` token. The `anonymous` token is a public-access token that allows requests to collect data about player counts, round status etc. For more sensitive information, or to interact with the server itself, a specific auth token will be needed. +* `query` is the name of the topic function being performed. Examples include `status` and `playerlist`. The query used determines which optional keys must be provided (if any). For a full list of topic functions available, and for additional required keys, see **code/datums/world_topic.dm** +* `source` this is an identifier for the server sending the request, for logging and administrative purposes. + +Example Request: +```json +{ + "auth": "8w7y487238q8x7nqw8dhwe8fq34r89gewri", + "query": "ahelp", + "source": "BeeStation Sage", + "message_sender": "a_player", + "message": "I don't see any admins online, can someone help? CE just killed me in maint 4noraisin" +} +``` + +### Response +Topic responses are very simple, and consist of three keys: `statuscode`, `response` and `data` + +* `statuscode` is a number that represents what the outcome of a request was. For example; a response with a status code of `200` means the request succeeded, and a response with a status code of `401` means that the request was lacking or had invalid authorization. +* `response` is a simple text response detailing the outcome of the request. This key will provide error details for non-`200` status codes, and a short description of actions performed if the request was successful. +* `data` is a misc key which can contain response data specific to the request. The format of this variable depends on the topic used. For information on what data specific topics return, see **code/datums/world_topic.dm** + +Example Response: +```json +{ + "statuscode": 200, + "response": "Player count retrieved", + "data": 57 +} +``` + +### Handshake +Before being able to send *outgoing* topic calls, a server must handshake with the target server to check what methods it has access to, and to verify that the other server is authorized to receive sensitive information. + +#### Initiating Server +The first step of the process is when the server initiating the handshake first starts up. The initiating server will make a call to the target server's `api_do_handshake` method with the token for that server as specified in the config. +The target server will then either respond that the token is unauthorized, or with a list of query methods that the connecting server is allowed to use, along with a token it has stored for the initiating server. + +The initiating server will then compare the list of functions received from the remote server with the list of functions sent by the remote server with the list of functions the initiating server has for the token the remote server sent back. Functions present in *both lists* will then be stored in a global list under the the server address of the remote server. + +This list is then used to decide what servers to forward sensitive information to, such as ahelps, by only allowing data to be sent out after both servers verify authorization at both ends. + +#### Remote Server +When a server receives a request to the `api_do_handshake` method, it will lookup the list of functions authorized for the provided token, as well as look for a configured token for the connecting server based on its IP address. If neither of these things are found, the server will respond with a 401 unauthorized response. + +If both prerequisites are found, the server will respond with the token it has stored for the server, as well as the list of authorized functions it found. In addition, if the server does not have the requesting server's functions stored too, it will make its own handshake request to the requesting server to collect the neccessary information. diff --git a/config/Sage/README.md b/config/Sage/README.md deleted file mode 100644 index 01a642b51a06a..0000000000000 --- a/config/Sage/README.md +++ /dev/null @@ -1,2 +0,0 @@ -#### These are the current config options for the official BeeStation MRP server Sage. If you plan to host your own fork of our code you are heavily encouraged to review and update these files for your needs. - diff --git a/config/Sage/admin_nicknames.json b/config/Sage/admin_nicknames.json deleted file mode 100644 index 9c83f646229d6..0000000000000 --- a/config/Sage/admin_nicknames.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ranks": [ - "Dedmin", - "Sir Madam Headmin" - ], - "names": [ - "Badmin", - "Spanmin" - ] -} \ No newline at end of file diff --git a/config/Sage/admin_ranks.txt b/config/Sage/admin_ranks.txt deleted file mode 100644 index 242c896c1743e..0000000000000 --- a/config/Sage/admin_ranks.txt +++ /dev/null @@ -1,100 +0,0 @@ -#Admin Rank format is as follows: -# -#Name = Game Admin -#Include = @ ADMIN BAN SOUND -#Exclude = FUN -#Edit = -# -#Name will match anything after '=' and must be identical to an admin's rank in admins.txt to be linked but otherwise has no formatting restrictions. -#A rank's permissions are defined with keywords that control access to groups of verbs and abilities, they are case-sensitive and separated by a space with no prefix. -#To define no permissions for a type, leave it empty. -#There are three types of permissions: -#Include will give a keyword to a rank. -#Exclude removes a keyword and takes precedence over Include. -#Edit will allow an admin to edit these permissions on other ranks or change an admin's rank to another if they can edit all the permissions it has. -#Edit is only used when SQL-based admin loading is enabled. -#If SQL-based admin loading is enabled, ranks and their keywords listed here will be loaded first and override any with the same name loaded from the database. -# -#The following are valid permission keywords: -#ADMIN = general admin tools, verbs etc. -#FUN = events, other event-orientated actions. Access to the fun secrets in the secrets panel. -#BAN = the ability to ban and unban. -#STEALTH = the ability to stealthmin (make yourself appear with a fake name to everyone but other admins. -#POSSESS = the ability to possess objects. -#POLL = the ability to create in game server polls (requires DB). -#BUILD = the ability to use buildmode. -#SERVER = the ability to restart the server, change the game mode or force a round to start/end. -#DEBUG = debug tools used for diagnosing and fixing problems. It's useful to give this to coders so they can investigate problems on a live server. -#VAREDIT = everyone may view viewvars/debugvars/whatever you call it. This keyword allows you to actually EDIT those variables. -#PERMISSIONS = allows you to promote and/or demote people. -#SOUND = allows you to upload and play SOUND. -#SPAWN = mob transformations, spawning of most atoms including mobs (high-risk atoms, e.g. blackholes, will require the +FUN flag too). -#AUTOADMIN = admin gains powers upon connect. This defaults to on, you can exclude AUTOADMIN to make a role require using the readmin verb to gain powers (this does not effect the admin's ability to walk past bans or other on-connect limitations like panic bunker or pop limit). -#DBRANKS = when sql-based admin loading is enabled, allows for non-temporary changes in the permissions panel to be saved (requires DB). -#EVERYTHING = Simply gives you everything without having to type every flag. -#@ = special keyword for the current permission type that adds all the keywords that the preceding rank has of the same type. - -Name = Admin Observer -Include = -Exclude = AUTOADMIN -Edit = - -Name = Moderator -Include = ADMIN -Exclude = -Edit = - -Name = Admin Candidate -Include = @ -Exclude = -Edit = - -Name = Trial Admin -Include = @ SPAWN VAREDIT BAN -Exclude = -Edit = - -Name = Badmin -Include = @ POSSESS POLL BUILD SERVER FUN -Exclude = -Edit = - -Name = Admin -Include = @ STEALTH SOUND DEBUG -Exclude = -Edit = - -Name = Game Master -Include = EVERYTHING -Exclude = -Edit = EVERYTHING - -Name = Lazy Master -Include = EVERYTHING -Exclude = AUTOADMIN -Edit = EVERYTHING - -Name = Host -Include = EVERYTHING -Exclude = -Edit = EVERYTHING - -Name = Lurker -Include = EVERYTHING -Exclude = -Edit = EVERYTHING - -Name = Headmin -Include = EVERYTHING -Exclude = -Edit = EVERYTHING - -Name = Coder -Include = DEBUG VAREDIT SERVER SPAWN POLL -Exclude = AUTOADMIN -Edit = - -Name = CouncilMember -Include = EVERYTHING -Exclude = -Edit = EVERYTHING diff --git a/config/Sage/admins.txt b/config/Sage/admins.txt deleted file mode 100644 index 362a4378a6f8f..0000000000000 --- a/config/Sage/admins.txt +++ /dev/null @@ -1,16 +0,0 @@ -############################################################################################### -# Basically, ckey goes first. Rank goes after the "=" # -# Case is not important for ckey. # -# Case IS important for the rank. # -# All punctuation (spaces etc) EXCEPT '-', '_' and '@' will be stripped from rank names. # -# Ranks can be anything defined in admin_ranks.txt # -# NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn # -# NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. # -# If SQL-based admin loading is enabled, admins listed here will always be loaded first # -# and will override any duplicate entries in the database. # -############################################################################################### -Ike709 = Host -Crossedfall = Host -CthulhuOnIce = Host - -# the rest are in the db diff --git a/config/Sage/antag_rep.txt b/config/Sage/antag_rep.txt deleted file mode 100644 index e8a7250686a41..0000000000000 --- a/config/Sage/antag_rep.txt +++ /dev/null @@ -1,5 +0,0 @@ -## Custom antag reputation values -## List of job titles followed by antag rep value, all prefixed with ANTAG_REP. See code/modules/jobs/job_types for titles -## e.g. -## ANTAG_REP Captain 10 -## ANTAG_REP Assistant 0 diff --git a/config/Sage/awaymissionconfig.txt b/config/Sage/awaymissionconfig.txt deleted file mode 100644 index 2c5081343031d..0000000000000 --- a/config/Sage/awaymissionconfig.txt +++ /dev/null @@ -1,26 +0,0 @@ -#List the potential random Z-levels here. -#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 AWAY MISSIONS!!: -#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/beach.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/beach2.dmm -_maps/RandomZLevels/VR/murderdome.dmm -_maps/RandomZLevels/VR/snowdin_VR.dmm -_maps/RandomZLevels/VR/syndicate_trainer.dmm diff --git a/config/Sage/comms.txt b/config/Sage/comms.txt deleted file mode 100644 index 147b6db3a279a..0000000000000 --- a/config/Sage/comms.txt +++ /dev/null @@ -1,17 +0,0 @@ -## Communication key for receiving data through world/Topic(), you don't want to give this out -#COMMS_KEY defaultkey - -## World address and port for server receiving cross server messages -## Use '+' to denote spaces in ServerName -## Repeat this entry to add more servers -#CROSS_SERVER ServerName byond:\\address:port - -## Name that the server calls itself in communications -#CROSS_COMMS_NAME - -## Hub address for tracking stats -## example: Hubmakerckey.Hubname -#MEDAL_HUB_ADDRESS Hubmakerckey.Hubname - -## Password for the hub page -#MEDAL_HUB_PASSWORD defaultpass diff --git a/config/Sage/config.txt b/config/Sage/config.txt deleted file mode 100644 index f81ffc1fc0114..0000000000000 --- a/config/Sage/config.txt +++ /dev/null @@ -1,553 +0,0 @@ -# You can use the "$include" directive to split your configs however you want - -$include game_options.txt -$include dbconfig.txt -$include comms.txt -$include antag_rep.txt -$include resources.txt - -# You can use the @ character at the beginning of a config option to lock it from being edited in-game -# Example usage: -# @SERVERNAME beestation -# Which sets the SERVERNAME, and disallows admins from being able to change it using View Variables. -# @LOG_TWITTER 0 -# Which explicitly disables LOG_TWITTER, as well as locking it. -# There are various options which are hard-locked for security reasons. - -## Server name: This appears at the top of the screen in-game and in the BYOND hub. Uncomment and replace 'beestation' with the name of your choice. -#@SERVERNAME beestation - -## Server SQL name: This is the name used to identify the server to the SQL DB, distinct from SERVERNAME as it must be at most 32 characters. -#@SERVERSQLNAME ss13newbs - -## Station name: The name of the station as it is referred to in-game. If commented out, the game will generate a random name instead. -STATIONNAME Space Station 13 - -## Put on byond hub: Uncomment this to put your server on the byond hub. -#HUB - -## Lobby time: This is the amount of time between rounds that players have to setup their characters and be ready. -LOBBY_COUNTDOWN 180 - -## Round End Time: This is the amount of time after the round ends that players have to murder death kill each other. -ROUND_END_COUNTDOWN 90 - -#USING_DISCORD - -## Comment this out if you want to use the SQL based admin system, the legacy system uses admins.txt. -## You need to set up your database to use the SQL based system. -## This flag is automatically enabled if SQL_ENABLED isn't -ADMIN_LEGACY_SYSTEM - -##Uncomment this to stop any admins loaded by the legacy system from having their rank edited by the permissions panel -#PROTECT_LEGACY_ADMINS - -##Uncomment this to stop any ranks loaded by the legacy system from having their flags edited by the permissions panel -#PROTECT_LEGACY_RANKS - -##Uncomment this to have admin ranks only loaded from the legacy admin_ranks.txt -##If enabled, each time admins are loaded ranks the database will be updated with the current ranks and their flags -#LOAD_LEGACY_RANKS_ONLY - -## Comment this out if you want to use the SQL based mentor system, the legacy system uses mentors.txt. -## You need to set up your database to use the SQL based system. -## This flag is automatically enabled if SQL_ENABLED isn't -MENTOR_LEGACY_SYSTEM - -#Mentors only see ckeys by default. Uncomment to have them only see mob name -#MENTORS_MOBNAME_ONLY - -## Comment this out if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. -BAN_LEGACY_SYSTEM - -## Comment this out to stop locally connected clients from being given the almost full access !localhost! admin rank -ENABLE_LOCALHOST_RANK - -## Uncomment this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing -## the minimal_player_age variable in the files in folder /code/game/jobs/job/.. for the job you want to edit. Set minimal_player_age to 0 to disable age requirement for that job. -## REQUIRES the database set up to work. Keep it hashed if you don't have a database set up. -## NOTE: If you have just set-up the database keep this DISABLED, as player age is determined from the first time they connect to the server with the database up. If you just set it up, it means -## you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days. -#USE_AGE_RESTRICTION_FOR_JOBS - -## Uncomment this to have the job system use the player's account creation date, rather than the when they first joined the server for job timers. -#USE_ACCOUNT_AGE_FOR_JOBS - -## Unhash this to track player playtime in the database. Requires database to be enabled. -USE_EXP_TRACKING -## Unhash this to enable playtime requirements for head jobs. -USE_EXP_RESTRICTIONS_HEADS -## Unhash this to override head jobs' playtime requirements with this number of hours. -## Leave this commented out to use the values defined in the job datums. Values in the datums are stored as minutes. -#USE_EXP_RESTRICTIONS_HEADS_HOURS 3 -## Unhash this to change head jobs' playtime requirements so that they're based on department playtime, rather than crew playtime. -USE_EXP_RESTRICTIONS_HEADS_DEPARTMENT -## Unhash this to enable playtime requirements for certain non-head jobs, like Engineer and Scientist. -USE_EXP_RESTRICTIONS_OTHER -## Allows admins to bypass job playtime requirements. -USE_EXP_RESTRICTIONS_ADMIN_BYPASS - -## log OOC channel -LOG_OOC - -## log client Say -LOG_SAY - -## log admin actions -LOG_ADMIN - -## log admin chat -LOG_ADMINCHAT - -## log client access (logon/logoff) -LOG_ACCESS - -## log game actions (start of round, results, etc.) -LOG_GAME - -## log antag objectives -LOG_OBJECTIVE - -## log player votes -LOG_VOTE - -## log client Whisper -LOG_WHISPER - -## log emotes -LOG_EMOTE - -## log attack messages -LOG_ATTACK - -## log pda messages -LOG_PDA - -## log telecomms messages -LOG_TELECOMMS - -## log prayers -LOG_PRAYER - -## log lawchanges -LOG_LAW - -## log viruses -LOG_VIRUS - -## log ID changes -LOG_ID - -## log crew manifest to seperate file -LOG_MANIFEST - -## log job divide debugging information -#LOG_JOB_DEBUG - -## log all world.Topic() calls -# LOG_WORLD_TOPIC - -## enables use of the proc twitterize() that lets you take a large list of strings and turn it into a JSON file of tweet sized strings. -## As an example of how this could be """useful""" look towards Poly (https://twitter.com/Poly_the_Parrot) -# LOG_TWITTER - -## Enable logging pictures -# LOG_PICTURES - -## log mecha actions -# LOG_MECHA - -##Log camera pictures - Must have picture logging enabled -PICTURE_LOGGING_CAMERA - -## period of time in seconds for players to be considered inactive -# INACTIVITY_PERIOD 300 - -## period of time in seconds for players to be considered afk and kickable -# AFK_PERIOD 600 - -## disconnect players who are considered afk -# KICK_INACTIVE - -## Comment this out to stop admins being able to choose their personal ooccolor -ALLOW_ADMIN_OOCCOLOR - -## Comment this out to stop admins being able to choose their personal asay color -ALLOW_ADMIN_ASAYCOLOR - -## Job slot open/close by identification consoles delay in seconds -ID_CONSOLE_JOBSLOT_DELAY 30 - -## allow players to initiate a restart vote -#ALLOW_VOTE_RESTART - -## allow players to initate a mode-change start -#ALLOW_VOTE_MODE - -## min delay (deciseconds) between voting sessions (default 10 minutes) -VOTE_DELAY 6000 - -## time period (deciseconds) which voting session will last (default 1 minute) -VOTE_PERIOD 600 - -## prevents dead players from voting or starting votes -NO_DEAD_VOTE - -## players' votes default to "No vote" (otherwise, default to "No change") -DEFAULT_NO_VOTE - -## disable abandon mob -NORESPAWN - -## disables calling del(src) on newmobs if they logout before spawnin in -# DONT_DEL_NEWMOB - -## set a hosted by name for unix platforms -HOSTEDBY Crossedfall - -## Set to jobban "Guest-" accounts from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. -## Set to 1 to jobban them from those positions, set to 0 to allow them. -# GUEST_JOBBAN - -## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting) -GUEST_BAN - -## Comment this out to disable checking for the cid randomizer dll. (disabled if database isn't enabled or connected) -CHECK_RANDOMIZER - -## IPINTEL: -## This allows you to detect likely proxies by checking ips against getipintel.net -## Rating to warn at: (0.9 is good, 1 is 100% likely to be a spammer/proxy, 0.8 is 80%, etc) anything equal to or higher then this number triggers an admin warning -#IPINTEL_RATING_BAD 0.9 -## Contact email, (required to use the service, leaving blank or default disables IPINTEL) -#IPINTEL_EMAIL ch@nge.me -## How long to save good matches (ipintel rate limits to 15 per minute and 500 per day. so this shouldn't be too low, getipintel.net suggests 6 hours, time is in hours) (Your ip will get banned if you go over 500 a day too many times) -#IPINTEL_SAVE_GOOD 12 -## How long to save bad matches (these numbers can change as ips change hands, best not to save these for too long in case somebody gets a new ip used by a spammer/proxy before.) -#IPINTEL_SAVE_BAD 3 -## Domain name to query (leave commented out for the default, only needed if you pay getipintel.net for more querys) -#IPINTEL_DOMAIN check.getipintel.net - -## Uncomment to allow web client connections -#ALLOW_WEBCLIENT - -## Uncomment to restrict web client connections to byond members -## This makes for a nice pay gate to cut down on ban evading, as the webclient's cid system isn't that great -## byond membership starts at $10 for 3 months, so to use the webclient to evade, they would have sink 10 bucks in each evade. -#WEBCLIENT_ONLY_BYOND_MEMBERS - -## Set to prevent anyone but those ckeys listed in config/whitelist.txt and config/admins.txt from joining your server -#USEWHITELIST - -## set a server location for world reboot. Don't include the byond://, just give the address and port. -## Don't set this to the same server, BYOND will automatically restart players to the server when it has restarted. -SERVER byond://sage.beestation13.com:7878 - -## forum address -FORUMURL https://forums.beestation13.com - -## Wiki address -WIKIURL https://wiki.beestation13.com/view - -## Rules address -RULESURL https://beestation13.com/rules?server=bs_sage - -## Github address -GITHUBURL https://www.github.com/beestation/beestation-hornet - -## Label to tag ingame-registered issues with. -## Uncomment this to enable them. -#ISSUE_LABEL Ingame Issue Report - -## Donation URL -DONATEURL https://www.patreon.com/user?u=10639001 - -## Discord Invite -DISCORDURL https://discord.gg/zUe34rs - -## Round specific stats address -## Link to round specific parsed logs; IE statbus. It is appended with the RoundID automatically by ticker/Reboot() -## This will take priority over the game logs address during reboot. -## Example: https://atlantaned.space/statbus/round.php?round= -# ROUNDSTATSURL - -## Game Logs address -## Incase you don't have a fancy parsing system, but still want players to be able to find where you keep your server's logs. -## Example: https://tgstation13.org/parsed-logs/basil/data/logs/ -# GAMELOGURL - -## Github repo id -##This can be found by going to https://api.github.com/users//repos -##Or https://api.github.com/orgs//repos if the repo owner is an organization -GITHUBREPOID 154500094 - -## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. -BANAPPEALS https://forums.beestation13.com/c/ban-appeals/game-ban-appeals - -## System command that invokes youtube-dl, used by Play Internet Sound. -## You can install youtube-dl with -## "pip install youtube-dl" if you have pip installed -## from https://github.com/rg3/youtube-dl/releases -## or your package manager -## The default value assumes youtube-dl is in your system PATH -INVOKE_YOUTUBEDL C:\youtubedl\youtube-dl.exe - -## In-game features -##Toggle for having jobs load up from the .txt -LOAD_JOBS_FROM_TXT - -## Uncomment this to forbid admins from possessing the singularity. -#FORBID_SINGULO_POSSESSION - -## Uncomment to show a popup 'reply to' window to every non-admin that receives an adminPM. -## The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off) -POPUP_ADMIN_PM - -## Uncomment to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR -ALLOW_HOLIDAYS - -## Uncomment to show the names of the admin sending a pm from IRC instead of showing as a stealthmin. -#SHOW_IRC_NAME - -## Defines the ticklimit for subsystem initialization (In percents of a byond tick). Lower makes world start smoother. Higher makes it faster. -##This is currently a testing optimized setting. A good value for production would be 98. -TICK_LIMIT_MC_INIT 500 - -##Defines the ticklag for the world. Ticklag is the amount of time between game ticks (aka byond ticks) (in 1/10ths of a second). -## This also controls the client network update rate, as well as the default client fps -TICKLAG 0.5 - -##Can also be set as per-second value, the following value is identical to the above. -#FPS 20 - -## Comment this out to disable automuting -AUTOMUTE_ON - -## Uncomment this to let players see their own notes (they can still be set by admins only) -SEE_OWN_NOTES - -### Comment these two out to prevent notes fading out over time for admins. -## Notes older then this will start fading out. -NOTE_FRESH_DAYS 91.31055 -## Notes older then this will be completely faded out. -NOTE_STALE_DAYS 365.2422 - -##Note: all population caps can be used with each other if desired. - -## Uncomment for 'soft' population caps, players will be warned while joining if the living crew exceeds the listed number. -SOFT_POPCAP 100 - -## Message for soft cap -SOFT_POPCAP_MESSAGE Be warned that the server is currently serving a high number of users, consider using alternative game servers. - -## Uncomment for 'hard' population caps, players will not be allowed to spawn if the living crew exceeds the listed number, though they may still observe or wait for the living crew to decrease in size. -HARD_POPCAP 175 - -## Message for hard cap -HARD_POPCAP_MESSAGE The server is currently serving a high number of users, You cannot currently join. You may wait for the number of living crew to decline, observe, or find alternative servers. - -## Uncomment for 'extreme' population caps, players will not be allowed to join the server if living crew exceeds the listed number. -EXTREME_POPCAP 200 - -## Message for extreme cap -EXTREME_POPCAP_MESSAGE The server is currently serving a high number of users, find alternative servers, or wait. - -## Notify admins when a new player connects for the first x days a player's been around. (0 for first connection only, -1 for never) -## Requres database -NOTIFY_NEW_PLAYER_AGE 0 - -## Notify admins when a player connects if their byond account was created in the last X days -## Requires database -NOTIFY_NEW_PLAYER_ACCOUNT_AGE 1 - -## Notify the irc channel when a new player makes their first connection -## Requres database -#IRC_FIRST_CONNECTION_ALERT - -## Deny all new connections by ckeys we haven't seen before (exempts admins and only denies the connection if the database is enabled and connected) -## Requires database -#PANIC_BUNKER - -## If panic bunker is on and a player is rejected (see above), attempt to send them to this connected server (see below) instead. -## You probably want this to be the same as CROSS_SERVER_ADDRESS -#PANIC_SERVER_ADDRESS byond://address:port - -##Name of the place to send people rejected by the bunker -#PANIC_SERVER_NAME [Put the name here] - -## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog -AGGRESSIVE_CHANGELOG - -## Comment this out if you've used the mass conversion sql proc for notes or want to stop converting notes -AUTOCONVERT_NOTES - -## Comment this out to stop admin messages sent anytime an admin disconnects from a round in play, you can edit the messages in admin.dm -ANNOUNCE_ADMIN_LOGOUT - -## Uncomment to have an admin message sent anytime an admin connects to a round in play, you can edit the messages in admin.dm -ANNOUNCE_ADMIN_LOGIN - -## Map rotation -## You should edit maps.txt to match your configuration when you enable this. -MAPROTATION - -## Map voting -## Allows players to vote for their preffered map -## When it's set to zero, the map will be randomly picked each round -PREFERENCE_MAP_VOTING 0 - -## Starts a map vote at the end of rounds -#AUTOMAPVOTE - -## Map rotate chance delta -## This is the chance of map rotation factored to the round length. -## A value of 1 would mean the map rotation chance is the round length in minutes (hour long round == 60% rotation chance) -## A value of 0.5 would mean the map rotation chance is half of the round length in minutes (hour long round == 30% rotation chance) -#MAPROTATIONCHANCEDELTA 0.5 - -## AUTOADMIN -## The default admin rank -AUTOADMIN_RANK Admin - -## Uncomment to automatically give that admin rank to all players -#AUTOADMIN - -## CLIENT VERSION CONTROL -## This allows you to configure the minimum required client version, as well as a warning version, and message for both. -## These trigger for any version below (non-inclusive) the given version, so 510 triggers on 509 or lower. -## These messages will be followed by one stating the clients current version and the required version for clarity. -## If CLIENT_WARN_POPUP is uncommented a popup window with the message will be displayed instead -#CLIENT_WARN_VERSION 513 -#CLIENT_WARN_POPUP -#CLIENT_WARN_MESSAGE 512 is no longer being directly supported as version 513 is set to become the new stable version soon. We've made a number of changes to take advantage of the improvements made in 513 which should make for a smoother experience. We will be removing support for 512 when this new version replaces it as stable, so it's recommended that you upgrade now. (You can update to the BETA via the website or directly in the BYOND client) -CLIENT_ERROR_VERSION 513 -CLIENT_ERROR_MESSAGE Your version of byond is not supported. Please upgrade. -## The minimum build needed for joining the server, if using 513, a good minimum build would be 1526. -CLIENT_ERROR_BUILD 1526 - -## TOPIC RATE LIMITING -## This allows you to limit how many topic calls (clicking on an interface window) the client can do in any given game second and/or game minute. -## Admins are exempt from these limits. -## Hitting the minute limit notifies admins. -## Set to 0 or comment out to disable. -SECOND_TOPIC_LIMIT 10 - -MINUTE_TOPIC_LIMIT 180 - -## CLICK RATE LIMITING -## Same as above, but applies to clicking on objects in the game window. -## This should be a higher then the interface limit to allow for the spam clickly nature of most battles. -## Admins are exempt from these limits. -## Hitting the minute limit notifies admins. -## Set to 0 to disable. -SECOND_CLICK_LIMIT 15 - -MINUTE_CLICK_LIMIT 500 - -##Error handling related options -## The "cooldown" time for each occurence of a unique error -#ERROR_COOLDOWN 600 -## How many occurences before the next will silence them -#ERROR_LIMIT 90 -## How long a unique error will be silenced for -#ERROR_SILENCE_TIME 6000 -##How long to wait between messaging admins about occurences of a unique error -#ERROR_MSG_DELAY 50 - -## Send a message to IRC when starting a new game -#IRC_ANNOUNCE_NEW_GAME - -## Allow admin hrefs that don't use the new token system, will eventually be removed -DEBUG_ADMIN_HREFS - -###Master Controller High Pop Mode### - -##The Master Controller(MC) is the primary system controlling timed tasks and events in SS13 (lobby timer, game checks, lighting updates, atmos, etc) -##Default base MC tick rate (1 = process every "byond tick" (see: tick_lag/fps config settings), 2 = process every 2 byond ticks, etc) -## Setting this to 0 will prevent the Master Controller from ticking -BASE_MC_TICK_RATE 1 - -##High population MC tick rate -## Byond rounds timer values UP, but the tick rate is modified with heuristics during lag spites so setting this to something like 2 -## will make it run every 2 byond ticks, but will also double the effect of anti-lag heuristics. You can instead set it to something like -## 1.1 to make it run every 2 byond ticks, but only increase the effect of anti-lag heuristics by 10%. or 1.5 for 50%. -## (As an aside, you could in theory also reduce the effect of anti-lag heuristics in the base tick rate by setting it to something like 0.5) -HIGH_POP_MC_TICK_RATE 1.2 - -##Engage high pop mode if player count raises above this (Player in this context means any connected user. Lobby, ghost or in-game all count) -HIGH_POP_MC_MODE_AMOUNT 90 - -##Disengage high pop mode if player count drops below this -DISABLE_HIGH_POP_MC_MODE_AMOUNT 85 - -## Uncomment to prevent the world from sleeping while no players are connected after initializations -#RESUME_AFTER_INITIALIZATIONS - -## Uncomment to set the number of /world/Reboot()s before the DreamDaemon restarts itself. 0 means restart every round. Requires tgstation server tools. -ROUNDS_UNTIL_HARD_RESTART 3 - -##Default screen resolution, in tiles. -## By default, this is 15x15, which gets simplified to 7 by BYOND, as it is a 1:1 screen ratio. -## For reference, Goonstation uses a resolution of 21x15 for it's widescreen mode. -## Do note that changing this value will affect the title screen. The title screen will have to be updated manually if this is changed. -DEFAULT_VIEW 17x15 - -##Should we use square view (15x15) while a new player (main menu) -MENU_SQUARE_VIEW - -METACURRENCY_NAME BeeCoin - -## Grant metacurrency -## Comment this out if you don't want players to earn metacurrency -GRANT_METACURRENCY - -## Respect global bans -## Comment this out to ignore global bans -RESPECT_GLOBAL_BANS - -## Custom shuttle spam prevention. Changine these numbers allows you to change the maxsize and amount of custom shuttles. -MAX_SHUTTLE_COUNT 6 -MAX_SHUTTLE_SIZE 300 - -### Fail2Topic settings -### fail2topic is a system for automating IP bans for abusers of the world/Topic API. -### Note that this subsystem respects the IPs listed in topic_rate_limit_whitelist.txt. They will not be considered for a ban. -## Topic rate limit in *seconds* -TOPIC_RATE_LIMIT 5 -## Topic max fails -TOPIC_MAX_FAILS 5 -## Firewall rule name -TOPIC_RULE_NAME "_DD_Fail2topic" -## Max world/Topic payload size -TOPIC_MAX_SIZE 500 -## Uncomment to enable Fail2Topic, comment-out to disable -#TOPIC_ENABLED - -## Uncomment to enable global ban DB using the provided URL. The API should expect to receive a ckey at the end of the URL. -## More API details can be found here: https://centcom.melonmesa.com -CENTCOM_BAN_DB https://centcom.melonmesa.com/ban/search - -## Respect upstream bans. Uncomment to automatically block connections from players that are banned from both BeeStation servers -## Requires CENTCOM_BAN_DB to be enabled with a valid URL. -#RESPECT_UPSTREAM_BANS -## Only respect upstream bans if it's a permaban -#RESPECT_UPSTREAM_PERMABANS - -## Enable IC/OOC Hard Filtering. Comment to disable one or both of them -#IC_FILTER_ENABLED -#OOC_FILTER_ENABLED - -## Uncomment to enable redirecting to the specified address. If a user attempts to join after EXTREEME_POPCAP has been reached, redirect them to this address. -## The given address is a format example. "byond://" is required to function. Create a potential infinite loop at your own risk. -#REDIRECT_ADDRESS byond://golden.beestation13.com:7777 - -### Autotransfer Settings -## Uncomment to enable shuttle autotransfer -VOTE_AUTOTRANSFER_ENABLED -## Time (in deciseconds) before the first transfer vote. Default: 90 minutes -VOTE_AUTOTRANSFER_INITIAL 54000 -## Time (in deciseconds) between subsequent transfer votes. Default: 30 minutes -VOTE_AUTOTRANSFER_INTERVAL 18000 - -## Ghost role cooldown time after death (In deciseconds) -GHOST_ROLE_COOLDOWN 3000 diff --git a/config/Sage/dbconfig.txt b/config/Sage/dbconfig.txt deleted file mode 100644 index 06091e8b49620..0000000000000 --- a/config/Sage/dbconfig.txt +++ /dev/null @@ -1,45 +0,0 @@ -## MySQL Connection Configuration -## This is used for stats, feedback gathering, -## administration, and the in game library. - -## Should SQL be enabled? Uncomment to enable -#SQL_ENABLED - -## Server the MySQL database can be found at. -## Examples: localhost, 200.135.5.43, www.mysqldb.com, etc. -ADDRESS localhost - -## MySQL server port (default is 3306). -PORT 3306 - -## Database for all SQL functions, not just feedback. -FEEDBACK_DATABASE ss13beedb - -## Prefix to be added to the name of every table, older databases will require this be set to erro_ -## Note, this does not change the table names in the database, you will have to do that yourself. -##IE: -## FEEDBACK_TABLEPREFIX -## FEEDBACK_TABLEPREFIX SS13_ -## Remove "SS13_" if you are using the standard schema file. -FEEDBACK_TABLEPREFIX SS13_ - -## Username/Login used to access the database. -FEEDBACK_LOGIN ss13dbuser - -## Password used to access the database. -FEEDBACK_PASSWORD password1 - -## Time in seconds for asynchronous queries to timeout -## Set to 0 for infinite -ASYNC_QUERY_TIMEOUT 10 - -## Time in seconds for blocking queries to execute before slow query timeout -## Set to 0 for infinite -## Must be less than or equal to ASYNC_QUERY_TIMEOUT -BLOCKING_QUERY_TIMEOUT 5 - -## The maximum number of additional threads BSQL is allowed to run at once -BSQL_THREAD_LIMIT 50 - -## Uncomment to enable verbose BSQL communication logs -#BSQL_DEBUG diff --git a/config/Sage/external_rsc_urls.txt b/config/Sage/external_rsc_urls.txt deleted file mode 100644 index 917a21907db3c..0000000000000 --- a/config/Sage/external_rsc_urls.txt +++ /dev/null @@ -1 +0,0 @@ -http://rsc.beestation13.buzz/beestation.zip diff --git a/config/Sage/game_options.txt b/config/Sage/game_options.txt deleted file mode 100644 index f2f73493acd7b..0000000000000 --- a/config/Sage/game_options.txt +++ /dev/null @@ -1,612 +0,0 @@ -## HEALTH ### - -##Damage multiplier, effects both weapons and healing on all mobs. For example, 1.25 would result in 25% higher damage. -DAMAGE_MULTIPLIER 1 - -## REVIVAL ### - -## whether pod plants work or not -REVIVAL_POD_PLANTS - -## whether cloning tubes work or not -REVIVAL_CLONING - -## amount of time (in hundredths of seconds) for which a brain retains the "spark of life" after the person's death (set to -1 for infinite) -REVIVAL_BRAIN_LIFE -1 - -## OOC DURING ROUND ### -## Comment this out if you want OOC to be automatically disabled during the round, it will be enabled during the lobby and after the round end results. -#OOC_DURING_ROUND - -## LOOC -## Comment this out to disable LOOC -LOOC_ENABLED - -## EMOJI ### -## Comment this out if you want to disable emojis -EMOJIS - -## MOB MOVEMENT ### - -## We suggest editing these variables ingame to find a good speed for your server. -## To do this you must be a high level admin. Open the 'debug' tab ingame. -## Select "Debug Controller" and then, in the popup, select "Configuration". These variables should have the same name. - -## These values get directly added to values and totals ingame. -## To speed things up make the number negative, to slow things down, make the number positive. - -## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. -RUN_DELAY 1.5 -WALK_DELAY 3 - -## The variables below affect the movement of specific mob types. THIS AFFECTS ALL SUBTYPES OF THE TYPE YOU CHOOSE! -## Entries completely override all subtypes. Later entries have precedence over earlier entries. -## This means if you put /mob 0 on the last entry, it will null out all changes, while if you put /mob as the first entry and -## /mob/living/carbon/human on the last entry, the last entry will override the first. -##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/human 0 -##MULTIPLICATIVE_MOVESPEED /mob/living/silicon/robot 0 -##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/monkey 0 -##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien 0 -##MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal/slime 0 -MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal 1 - - -## NAMES ### -## If uncommented this adds a random surname to a player's name if they only specify one name. -HUMANS_NEED_SURNAMES - -## If uncommented, this forces all players to use random names !and appearances!. -#FORCE_RANDOM_NAMES - -## Unhash this to turn on automatic reopening of a player's job if they suicide at roundstart -#REOPEN_ROUNDSTART_SUICIDE_ROLES - -## Unhash to enable reopening of command level positions -#REOPEN_ROUNDSTART_SUICIDE_ROLES_COMMAND_POSITIONS - -## Define the delay for roles to be reopened after the round starts in seconds. -## Has a minimum delay of 30 seconds, though it's suggested to keep over 1 min -## If undefined, the delay defaults to 4 minutes. -#REOPEN_ROUNDSTART_SUICIDE_ROLES_DELAY 240 - -## Unhash to enable a printed command report for reopened roles listing what roles were reopened. -#REOPEN_ROUNDSTART_SUICIDE_ROLES_COMMAND_REPORT - - -## ALERT LEVELS ### -ALERT_GREEN All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced. -ALERT_BLUE_UPTO The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted. -ALERT_BLUE_DOWNTO The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed. -ALERT_RED_UPTO There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised. Additionally, access requirements on some doors have been lifted. -ALERT_RED_DOWNTO The station's destruction has been averted. There is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised. -ALERT_DELTA Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill. - - - -## GAME MODES ### - -## Uncomment to not send a roundstart intercept report. Gamemodes may override this. -NO_INTERCEPT_REPORT - -## Probablities for game modes chosen in 'secret' and 'random' modes. -## Default probablity is 1, increase to make that mode more likely to be picked. -## Set to 0 to disable that mode. - -PROBABILITY TRAITOR 9 -PROBABILITY SECRET_EXTENDED 7 -PROBABILITY CULT 6 -PROBABILITY HERESY 6 -PROBABILITY INTERNAL_AFFAIRS 6 -PROBABILITY TRAITORCHAN 5 -PROBABILITY CHANGELING 5 -PROBABILITY REVOLUTION 4 -PROBABILITY INCURSION 4 -PROBABILITY NUCLEAR 4 -PROBABILITY TRAITORBRO 3 -PROBABILITY EXTENDED 2 -PROBABILITY MONKEY 1 -PROBABILITY WIZARD 1 -PROBABILITY CLOCKCULT 1 -PROBABILITY GANG 0 -PROBABILITY CLOWNOPS 0 -PROBABILITY METEOR 0 -PROBABILITY DEVIL 0 -PROBABILITY DEVIL_AGENTS 0 - -## You probably want to keep sandbox off by default for secret and random. -PROBABILITY SANDBOX 0 - -## Percent weight reductions for three of the most recent modes - -REPEATED_MODE_ADJUST 45 30 10 - -## Toggles for continuous modes. -## Modes that aren't continuous will end the instant all antagonists are dead. - -CONTINUOUS TRAITOR -CONTINUOUS TRAITORBRO -CONTINUOUS TRAITORCHAN -CONTINUOUS INCURSION -CONTINUOUS INTERNAL_AFFAIRS -#CONTINUOUS NUCLEAR -#CONTINUOUS REVOLUTION -CONTINUOUS CULT -CONTINUOUS CHANGELING -CONTINUOUS WIZARD -#CONTINUOUS MONKEY -CONTINUOUS HIVEMIND -CONTINUOUS CLOCKCULT - -#Prevents the death of round-ending antagonist rulesets ending the round immediately. - -CONTINUOUS DYNAMIC - -##Note: do not toggle continuous off for these modes, as they have no antagonists and would thus end immediately! - -CONTINUOUS METEOR -CONTINUOUS EXTENDED -CONTINUOUS SECRET_EXTENDED - - -## Toggles for allowing midround antagonists (aka mulligan antagonists). -## In modes that are continuous, if all antagonists should die then a new set of antagonists will be created. - -MIDROUND_ANTAG TRAITOR -MIDROUND_ANTAG INCURSION -#MIDROUND_ANTAG TRAITORBRO -MIDROUND_ANTAG TRAITORCHAN -MIDROUND_ANTAG INTERNAL_AFFAIRS -#MIDROUND_ANTAG NUCLEAR -#MIDROUND_ANTAG REVOLUTION -MIDROUND_ANTAG CULT -MIDROUND_ANTAG CHANGELING -MIDROUND_ANTAG WIZARD -#MIDROUND_ANTAG 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. -## Notes: For maximum number of players a value of -1 means no maximum. Setting minimums to -## VERY low numbers (< 5) can lead to errors if the roundtypes were not designed for that. - -MIN_POP TRAITOR 0 -MAX_POP TRAITOR -1 - -MIN_POP TRAITORBRO 10 -MAX_POP TRAITORBRO -1 - -MIN_POP TRAITORCHAN 15 -MAX_POP TRAITORCHAN -1 - -MIN_POP DOUBLE_AGENTS 25 -MAX_POP DOUBLE_AGENTS -1 - -MIN_POP NUCLEAR 0 -MAX_POP NUCLEAR -1 - -MIN_POP REVOLUTION 20 -MAX_POP REVOLUTION -1 - -MIN_POP CULT 24 -MAX_POP CULT -1 - -MIN_POP CHANGELING 15 -MAX_POP CHANGELING -1 - -MIN_POP WIZARD 20 -MAX_POP WIZARD -1 - -MIN_POP MONKEY 20 -MAX_POP MONKEY -1 - -MIN_POP METEOR 0 -MAX_POP METEOR -1 - -MIN_POP DEVIL 20 -MAX_POP DEVIL -1 - -MIN_POP DEVIL_AGENTS 25 -MAX_POP DEVIL_AGENTS -1 - -MIN_POP INCURSION 22 -MAX_POP INCURSION -1 - -## Setting at least one mode to be playable at 0/1 players is required. -#MIN_POP EXTENDED 0 -#MAX_POP EXTENDED -1 - -MIN_POP CLOCKCULT 32 -MAX_POP CLOCKCULT -1 - -## The amount of time it takes for the emergency shuttle to be called, from round start. -SHUTTLE_REFUEL_DELAY 12000 - -## Variables calculate how number of antagonists will scale to population. -## Used as (Antagonists = Population / Coeff) -## Set to 0 to disable scaling and use default numbers instead. -TRAITOR_SCALING_COEFF 6 -BROTHER_SCALING_COEFF 6 -CHANGELING_SCALING_COEFF 6 -ECULT_SCALING_COEFF 6 - -## Variables calculate how number of open security officer positions will scale to population. -## Used as (Officers = Population / Coeff) -## Set to 0 to disable scaling and use default numbers instead. -SECURITY_SCALING_COEFF 10 - -## The number of objectives traitors get. -## Not including escaping/hijacking. -TRAITOR_OBJECTIVES_AMOUNT 2 -BROTHER_OBJECTIVES_AMOUNT 2 - -## Uncomment to prohibit jobs that start with loyalty -## implants from being most antagonists. -PROTECT_ROLES_FROM_ANTAGONIST - -## Uncomment to prohibit assistants from becoming most antagonists. -#PROTECT_ASSISTANT_FROM_ANTAGONIST - -## Uncomment to prohibit head roles from becoming most antagonists. -PROTECT_HEADS_FROM_ANTAGONIST - -## If non-human species are barred from joining as a head of staff -#ENFORCE_HUMAN_AUTHORITY - -## If late-joining players have a chance to become a traitor/changeling -ALLOW_LATEJOIN_ANTAGONISTS - -## Incursion Rules -## The more incursion-traitors spawn, the most pop is required to spawn the next -## Values of 6 and 2 will be 6 for 1 then (6) + (6 + 2) for 2 -## 6, 14, 24, 36, 50, 66, 84 -INCURSION_COST_BASE 6 -INCURSION_COST_INCREMENT 0.25 -INCURSION_COUNT_MAX 6 -INCURSION_COUNT_MIN 2 -INCURSION_OBJECTIVE_AMOUNT 4 - -## Comment this out to disable the antagonist reputation system. This system rewards players who participate in the game instead of greytiding by giving them slightly higher odds to -## roll antagonist in subsequent rounds until they get it. -## -## For details See the comments for /datum/game_mode/proc/antag_pick in code/game/gamemodes/game_mode.dm -USE_ANTAG_REP - -## The maximum amount of antagonist reputation tickets a player can bank (not use at once) -ANTAG_REP_MAXIMUM 200 - -## The default amount of tickets all users use while rolling -DEFAULT_ANTAG_TICKETS 100 - -## The maximum amount of extra tickets a user may use from their ticket bank in addition to the default tickets -MAX_TICKETS_PER_ROLL 100 - -## Uncomment to weigh all jobs equally for antag rep. -EQUAL_JOB_WEIGHT - -## Default antag rep value for jobs -DEFAULT_REP_VALUE 5 - -## Uncomment to allow players to see the set odds of different rounds in secret/random in the get server revision screen. This will NOT tell the current roundtype. -#SHOW_GAME_TYPE_ODDS - -## RANDOM EVENTS ### -## Comment this out to disable random events during the round. -ALLOW_RANDOM_EVENTS - -## Multiplier for earliest start time of dangerous events. -## Set to 0 to make dangerous events avaliable from round start. -EVENTS_MIN_TIME_MUL 1 - -## Multiplier for minimal player count (players = alive non-AFK humans) for dangerous events to start. -## Set to 0 to make dangerous events avaliable for all populations. -EVENTS_MIN_PLAYERS_MUL 1 - - -## AI ### - -## Allow the AI job to be picked. -ALLOW_AI - -## Allow the AI Multicamera feature to be used by AI players -ALLOW_AI_MULTICAM - -## Secborg ### -## Uncomment to prevent the security cyborg module from being chosen -#DISABLE_SECBORG - -## Peacekeeper Borg ### -## Uncomment to prevent the peacekeeper cyborg module from being chosen -#DISABLE_PEACEBORG - -## AWAY MISSIONS ### - -## Uncomment to load one of the missions from awaymissionconfig.txt at roundstart. -#ROUNDSTART_AWAY - -## How long the delay is before the Away Mission gate opens. Default is half an hour. -## 600 is one minute. -GATEWAY_DELAY 18000 - - -## ACCESS ### - -## If the number of players ready at round starts exceeds this threshold, JOBS_HAVE_MINIMAL_ACCESS will automatically be enabled. Otherwise, it will be disabled. -## This is useful for accomodating both low and high population rounds on the same server. -## Comment this out or set to 0 to disable this automatic toggle. -MINIMAL_ACCESS_THRESHOLD 20 - -## Comment this out this if you wish to use the setup where jobs have more access. -## This is intended for servers with low populations - where there are not enough -## players to fill all roles, so players need to do more than just one job. -## This option is ignored if MINIMAL_ACCESS_THRESHOLD is used. -#JOBS_HAVE_MINIMAL_ACCESS - -## Uncomment to give assistants maint access. -ASSISTANTS_HAVE_MAINT_ACCESS - -## Uncoment to give security maint access. Note that if you dectivate JOBS_HAVE_MINIMAL_ACCESS security already gets maint from that. -SECURITY_HAS_MAINT_ACCESS - -## Uncomment to give everyone maint access. -#EVERYONE_HAS_MAINT_ACCESS - -## Comment this out this to make security officers spawn in departmental security posts -SEC_START_BRIG - - -## GHOST INTERACTION ### -## Uncomment to let ghosts spin chairs. You may be wondering why this is a config option. Don't ask. -GHOST_INTERACTION - -## NEAR-DEATH EXPERIENCE ### -## Comment this out to disable mobs hearing ghosts when unconscious and very close to death -NEAR_DEATH_EXPERIENCE - -## NON-VOCAL SILICONS ### -## Uncomment these to stop the AI, or cyborgs, from having vocal communication. -#SILENT_AI -#SILENT_BORG - -## SANDBOX PANEL AUTOCLOSE ### -## The sandbox panel's item spawning dialog now stays open even after you click an option. -## If you find that your players are abusing the sandbox panel, this option may slow them down -## without preventing people from using it properly. -## Only functions in sandbox game mode. -#SANDBOX_AUTOCLOSE - -## ROUNDSTART SILICON LAWS ### -## This controls what the AI's laws are at the start of the round. -## Set to 0/commented out for "off", silicons will just start with Asimov. -## Set to 1 for "custom", silicons will start with the custom laws defined in silicon_laws.txt. (If silicon_laws.txt is empty, the AI will spawn with asimov and Custom boards will auto-delete.) -## Set to 2 for "random", silicons will start with a random lawset picked from random laws specified below. -## Set to 3 for "weighted random", using values in "silicon_weights.txt", a law will be selected, with weights specifed in that file. -DEFAULT_LAWS 1 - -## RANDOM LAWS ## -## ------------------------------------------------------------------------------------------ -## These control what laws are available for selection if random silicon laws are active. -## See datums\ai_laws.dm for the full law lists - -## standard-ish laws. These are fairly ok to run -RANDOM_LAWS asimov -RANDOM_LAWS asimovpp -RANDOM_LAWS paladin -RANDOM_LAWS robocop -RANDOM_LAWS corporate - -## Quirky laws. Shouldn't cause too much harm -#RANDOM_LAWS hippocratic -#RANDOM_LAWS maintain -#RANDOM_LAWS drone -#RANDOM_LAWS liveandletlive -#RANDOM_LAWS peacekeeper -#RANDOM_LAWS reporter -#RANDOM_LAWS hulkamania - -## Bad idea laws. Probably shouldn't enable these -#RANDOM_LAWS syndie -#RANDOM_LAWS ninja -#RANDOM_LAWS antimov -#RANDOM_LAWS thermodynamic -#RANDOM_LAWS ratvar - -## meme laws. Honk -#RANDOM_LAWS buildawall - -## If weighted laws are selected (DEFAULT_LAWS = 3), -## then an AI's starting laws will be determined by the weights of these values - -## Make sure there are no spaces between the law_id and the number. - -LAW_WEIGHT custom,0 - -## standard-ish laws. These are fairly ok to run -LAW_WEIGHT asimov,32 -LAW_WEIGHT asimovpp,12 -LAW_WEIGHT paladin,12 -LAW_WEIGHT robocop,12 -LAW_WEIGHT corporate,12 - -## Quirky laws. Shouldn't cause too much harm -LAW_WEIGHT hippocratic,3 -LAW_WEIGHT maintain,4 -LAW_WEIGHT drone,3 -LAW_WEIGHT liveandletlive,3 -LAW_WEIGHT peacekeeper,3 -LAW_WEIGHT reporter,4 -LAW_WEIGHT hulkamania,4 - -## Bad idea laws. Probably shouldn't enable these -LAW_WEIGHT syndie,0 -LAW_WEIGHT ninja,0 -LAW_WEIGHT antimov,0 -LAW_WEIGHT thermodynamic,0 -LAW_WEIGHT ratvar,0 -LAW_WEIGHT buildawall,0 - -##------------------------------------------------ - -## SILICON LAW MAX AMOUNT ### -## The maximum number of laws a silicon can have -## Attempting to upload laws past this point will fail unless the AI is reset -SILICON_MAX_LAW_AMOUNT 12 - -## Roundstart Races -##------------------------------------------------------------------------------------------- -## Uncommenting races will allow them to be choosen at roundstart while join_with_muntant_race is on. You'll need at least one. - -## You probably want humans on your space station, but technically speaking you can turn them off without any ill effect -ROUNDSTART_RACES human - -## You probably want humans on your space station, but technically speaking you can turn them off without any ill effect -ROUNDSTART_RACES human - -## Races that are strictly worse than humans that could probably be turned on without balance concerns -ROUNDSTART_RACES lizard -ROUNDSTART_RACES fly -ROUNDSTART_RACES moth -ROUNDSTART_RACES felinid -ROUNDSTART_RACES squid - - -## Races that are better than humans in some ways, but worse in others -ROUNDSTART_RACES ethereal -ROUNDSTART_RACES apid -#ROUNDSTART_RACES jelly -#ROUNDSTART_RACES shadow -ROUNDSTART_RACES plasmaman -#ROUNDSTART_RACES iron_golem -#ROUNDSTART_RACES adamantine_golem -#ROUNDSTART_RACES plasma_golem -#ROUNDSTART_RACES diamond_golem -#ROUNDSTART_RACES gold_golem -#ROUNDSTART_RACES silver_golem -#ROUNDSTART_RACES uranium_golem -#ROUNDSTART_RACES abductor -#ROUNDSTART_RACES synth -ROUNDSTART_RACES ipc - -## Races that are straight upgrades. If these are on expect powergamers to always pick them -#ROUNDSTART_RACES skeleton -#ROUNDSTART_RACES zombie -#ROUNDSTART_RACES slime -#ROUNDSTART_RACES pod -#ROUNDSTART_RACES military_synth -#ROUNDSTART_RACES agent - -## Paywall Races -##------------------------------------------------------------------------------------------- -## Uncommenting races will restrict them behind the patreon paywall - -#PAYWALL_RACES felinid - -##------------------------------------------------------------------------------------------- - -## Uncomment to give players the choice of joining as a human with mutant bodyparts before they join the game -JOIN_WITH_MUTANT_HUMANS - -##Overflow job. Default is assistant -OVERFLOW_JOB Assistant - -## Overflow slot cap. Set to -1 for unlimited. If limited, it will still open up if every other job is full. -OVERFLOW_CAP -1 - -## Starlight for exterior walls and breaches. Uncomment for starlight! -## This is disabled by default to make testing quicker, should be enabled on production servers or testing servers messing with lighting -STARLIGHT - -## Uncomment to bring back old grey suit assistants instead of the now default rainbow colored assistants. -GREY_ASSISTANTS - -## Midround Antag (aka Mulligan antag) config options ### - -## A time, in minutes, after which the midround antag system stops attempting to run and continuous rounds end immediately upon completion. -MIDROUND_ANTAG_TIME_CHECK 60 - -## A ratio of living to total crew members, the lower this is, the more people will have to die in order for midround antag to be skipped -MIDROUND_ANTAG_LIFE_CHECK 0.7 - -##Limit Spell Choices## -## Uncomment to disallow wizards from using certain spells that may be too chaotic/fun for your playerbase - -#NO_SUMMON_GUNS -#NO_SUMMON_MAGIC -#NO_SUMMON_EVENTS - -## Comment this out for "normal" explosions, which ignore obstacles -## Uncomment for explosions that react to doors and walls -REACTIONARY_EXPLOSIONS - -## Configure the bomb cap -## This caps all explosions to the specified range. Used for both balance reasons and to prevent overloading the server and lagging the game out. -## This is given as the 3rd number(light damage) in the standard (1,2,3) explosion notation. The other numbers are derived by dividing by 2 and 4. -## eg: If you give the number 20. The bomb cap will be 5,10,20. -## Can be any number above 4, some examples are provided below. - -## Small (3, 7, 14) -#BOMBCAP 14 -## Default (6, 12, 24) (recommended if you enable REACTIONARY_EXPLOSIONS above) -BOMBCAP 24 -## LagHell (7, 14, 28) -#BOMBCAP 28 - -## Lavaland "Budget" -## Lavaland ruin spawning has an imaginary budget to spend on ruins, where -## a less lootfilled or smaller or less round effecting ruin costs less to -## spawn, while the converse is true. Alter this number to affect the amount -## of ruins. -LAVALAND_BUDGET 60 - -## Space Ruin Budged -Space_Budget 8 - -## Time in ds from when a player latejoins till the arrival shuttle docks at the station -## Must be at least 30. At least 55 recommended to be visually/aurally appropriate -ARRIVALS_SHUTTLE_DOCK_WINDOW 55 - -## Uncomment to require the arrivals shuttle to be in flight (if it can fly) before late join players can join -#ARRIVALS_SHUTTLE_REQUIRE_UNDOCKED - -## Uncomment to prevent late join players from spawning if the arrivals shuttle is depressurized -#ARRIVALS_SHUTTLE_REQUIRE_SAFE_LATEJOIN - -## How many wirechewing rodents you want to spawn on exposed maintenane wires at the start of the round. You may wish to set this to 0 if you're testing powernets. - -MICE_ROUNDSTART 10 - -## If the percentage of players alive (doesn't count conversions) drops below this threshold the emergency shuttle will be forcefully called (provided it can be) -#EMERGENCY_SHUTTLE_AUTOCALL_THRESHOLD 0.2 - -## Determines if players are allowed to print integrated circuits, uncomment to allow. -IC_PRINTING - -## Uncomment to allow roundstart quirk selection in the character setup menu. -## This used to be named traits, hence the config name, but it handles quirks, not the other kind of trait! -ROUNDSTART_TRAITS - -## Uncomment to disable human moods. -#DISABLE_HUMAN_MOOD - -## Enable night shifts ## -ENABLE_NIGHT_SHIFTS - -## Enable randomized shift start times## -RANDOMIZE_SHIFT_TIME - -## Sets shift time to server time at roundstart. Overridden by RANDOMIZE_SHIFT_TIME ## -#SHIFT_TIME_REALTIME - -## A cap on how many monkeys may be created via monkey cubes -MONKEYCAP 100 - -## Maximum fine for a citation -MAXFINE 2000 - -## Enable the capitalist agenda on your server. -ECONOMY - -## Crew objectives -ALLOW_CREW_OBJECTIVES - -## Uncomment to restrict suiciding. Adds an additional confirmation dialogue, additional logging, and prevents suicide within the first 15 minutes of the round. -RESTRICTED_SUICIDE diff --git a/config/Sage/in_character_filter.txt b/config/Sage/in_character_filter.txt deleted file mode 100644 index e25e06fcdc386..0000000000000 --- a/config/Sage/in_character_filter.txt +++ /dev/null @@ -1,7 +0,0 @@ -################################################################################################################################# -# Words that will block in character chat messages from sending. Also includes words from the OOC filter automatically. # -# Case is not important. Commented-out examples are listed below, just remove the "#". # -################################################################################################################################# -#lol -#omg -#wtf \ No newline at end of file diff --git a/config/Sage/jobs.txt b/config/Sage/jobs.txt deleted file mode 100644 index 92d243eea5bc6..0000000000000 --- a/config/Sage/jobs.txt +++ /dev/null @@ -1,46 +0,0 @@ -#This allows easy configuration of the number of positions allowed for each job -#Format is: [Job name]=[total positions],[spawn positions] -#Job names must be identical to the title var of each job datum -#Positions can be set to -1 to allow unlimited slots -Captain=1,1 -Head of Personnel=1,1 -Head of Security=1,1 -Chief Engineer=1,1 -Research Director=1,1 -Chief Medical Officer=1,1 - -Assistant=-1,-1 - -Quartermaster=1,1 -Cargo Technician=6,4 -Shaft Miner=4,4 - -Bartender=2,1 -Cook=2,1 -Botanist=4,3 -Janitor=3,2 - -Clown=1,1 -Mime=1,1 -Curator=1,1 -Lawyer=2,2 - -Chaplain=1,1 - -Station Engineer=7,5 -Atmospheric Technician=4,2 - -Medical Doctor=8,6 -Chemist=3,2 -Geneticist=3,2 -Virologist=1,1 - -Scientist=8,6 -Roboticist=2,2 - -Warden=1,1 -Detective=1,1 -Security Officer=10,8 - -AI=1,1 -Cyborg=1,1 diff --git a/config/Sage/jukebox_music/LICENSE.txt b/config/Sage/jukebox_music/LICENSE.txt deleted file mode 100644 index 8a9d5dd3739bc..0000000000000 --- a/config/Sage/jukebox_music/LICENSE.txt +++ /dev/null @@ -1,34 +0,0 @@ ----LICENSE NOTICE--- - -The server operator(s) is responsible for the copyright status of all sounds placed within the /config/jukebox_music folder unless otherwise noted. - -If a sound requires attribution and/or a specific license it is up to the operator(s) to make this information publicly available on either -a website associated with their server or on the server itself. - -If operators(s) allow these configuration files to be public this file can serve that purpose by keeping it properly updated. - -If in the future new sounds are published to these folders (i.e. in an online code repository) they must explicitly state their -license if said license is not the same as the default licensing found in README.md in the root directory of the project. - -Do not remove this notice. - ----END NOTICE--- - - - - ----EXAMPLES (NOT PART OF ANY LICENSE)--- - -These are examples of properly attrubuted and licensed sounds. -They are not an actual part of any license under any circumstance. - -title5.ogg was created by Mya Quinn on Feburary 28, 2557. It is licensed under a Combative Clowning 3.0 HO-NK license (http://example.com/license/url/). - -Unless otherwise noted all sounds were created by Cuban Pete on July 26, 2555. They are licensed under the RUMBABEAT Public License.(http://example.com/license/url/). - ----END EXAMPLES (NOT PART OF ANY LICENSE)--- - - - - ----ADD LICENSING INFORMATION BELOW--- diff --git a/config/Sage/jukebox_music/README.txt b/config/Sage/jukebox_music/README.txt deleted file mode 100644 index c7820d1d0ab0f..0000000000000 --- a/config/Sage/jukebox_music/README.txt +++ /dev/null @@ -1,15 +0,0 @@ -The enclosed sounds folder holds the sound files used as player selectable songs for an ingame jukebox. OGG and WAV are supported. - -Using unnecessarily huge sounds can cause client side lag and should be avoided. - -You may add as many sounds as you would like. - ---- - -Naming Conventions: - -Every sound you add must have a unique name. Avoid using the plus sign "+" and the period "." in names, as these are used internally to classify sounds. - -Sound names must be in the format of [song name]+[length in deciseconds]+[beat in deciseconds].ogg - -A three minute song title "SS13" that lasted 3 minutes would have a file name SS13+1800+5.ogg diff --git a/config/Sage/jukebox_music/sounds/exclude b/config/Sage/jukebox_music/sounds/exclude deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/config/Sage/lavaruinblacklist.txt b/config/Sage/lavaruinblacklist.txt deleted file mode 100644 index 5e64a2a9808a2..0000000000000 --- a/config/Sage/lavaruinblacklist.txt +++ /dev/null @@ -1,40 +0,0 @@ -#Listing maps here will blacklist them from generating in lavaland. -#Maps must be the full path to them -#A list of maps valid to blacklist can be found in _maps\RandomRuins\LavaRuins -#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START - -##BIODOMES -#_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm -#_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm -#_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_cube.dmm - -##RESPAWN -#_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 - -##SIN -#_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm - -##MISC -#_maps/RandomRuins/LavaRuins/lavaland_surface_automated_trade_outpost.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_ww_vault.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_automated_trade_outpost.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm -#_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 diff --git a/config/Sage/maps.txt b/config/Sage/maps.txt deleted file mode 100644 index cd36678fc4781..0000000000000 --- a/config/Sage/maps.txt +++ /dev/null @@ -1,52 +0,0 @@ -This file contains a list of maps for use in map rotation. -#Lines starting with # are ignored. -Lines not inside map blocks are also ignored -Duplicated entries use the latter one. -All whitespace at the start and end of lines is ignored. (including indentation, thats just for show) -Format: -#map [map name] (name of .json file in _maps folder without the .json part) - minplayers [number] (0 or less disables this requirement) - maxplayers [number] (0 or less disables this requirement) - default (The last map with this defined will get all votes of players who have not explicitly voted for a map) - voteweight [number] (How much to count each player vote as, defaults to 1, setting to 0.5 counts each vote as half a vote, 2 as double, etc, Setting to 0 disables the map but allows players to still pick it) - disabled (disables the map) -endmap - -map boxstation - maxplayers 60 - votable -endmap - -map metastation - minplayers 15 - maxplayers 100 - votable -endmap - -map pubbystation - maxplayers 50 - votable -endmap - -map deltastation - minplayers 40 - votable -endmap - -map donutstation - minplayers 60 - maxplayers 120 - disabled -endmap - -map runtimestation - disabled -endmap - -map multiz_debug - disabled -endmap - -map kilostation - maxplayers 60 -endmap diff --git a/config/Sage/mentors.txt b/config/Sage/mentors.txt deleted file mode 100644 index cab8e3b6e226b..0000000000000 --- a/config/Sage/mentors.txt +++ /dev/null @@ -1,15 +0,0 @@ -# Like admins.txt, but for mentors and without ranks. -# Just put ckeys in the format of one ckey per line, and all the ckeys listed here will be made mentors. -Carbonhell -Jesslynbrooke -MACIEKBAKI -Pandolphina -MiniMeatwad -Daman453 -MiasmaToast -Leonid Zurnadzhi -MrGravyCakes -that guy is taken -Penginh -Singulo -lukanoktorios diff --git a/config/Sage/motd.txt b/config/Sage/motd.txt deleted file mode 100644 index 5a8e6e211f758..0000000000000 --- a/config/Sage/motd.txt +++ /dev/null @@ -1,7 +0,0 @@ - - -

    Welcome to BeeStation!

    - -
    Website: Click Me! -
    Discord: Click Me! -
    Donate: Click Me! diff --git a/config/Sage/ooc_filter.txt b/config/Sage/ooc_filter.txt deleted file mode 100644 index 9d3d345055944..0000000000000 --- a/config/Sage/ooc_filter.txt +++ /dev/null @@ -1,7 +0,0 @@ -################################################################################################################# -# Words that will block OOC chat messages from sending. These will also be added to the IC filter list. # -# Case is not important. Commented-out examples are listed below, just remove the "#". # -################################################################################################################# -#lol -#omg -#wtf \ No newline at end of file diff --git a/config/Sage/policies.txt b/config/Sage/policies.txt deleted file mode 100644 index 1d01782c4cc82..0000000000000 --- a/config/Sage/policies.txt +++ /dev/null @@ -1,5 +0,0 @@ -## SERVER POLICIES ## -# Each line is pure html that gets sent to the user under certain conditions - -# When a mob is polymorphed -POLYMORPH Note that you are allowed to act as an antagonist while transformed into a hostile mob, unless you volunteered for or sought out transformation. diff --git a/config/Sage/resources.txt b/config/Sage/resources.txt deleted file mode 100644 index 82b26980167f4..0000000000000 --- a/config/Sage/resources.txt +++ /dev/null @@ -1,39 +0,0 @@ -# External resources -# Set this to the location of a .zip with the server's .rsc inside of it. -# If you set this mutiple times, the server will rotate between the links. -# To use this, the compile option PRELOAD_RSC must be set to 0 to keep byond from preloading resources - -EXTERNAL_RSC_URLS http://rsc.beestation13.buzz/beestation.zip - - -######################## -# Browser Asset Config # -######################## -# Browser assets are any file included in interfaces. css, images, javascript, etc. -# This handles configuring how we get these to the player so interfaces can access them. - -# Asset Transport -# The normal way of getting assets to clients is to use the internal byond system. This can be slow and delay the opening of interface windows. It also doesn't allow the internal IE windows byond uses to cache anything. -# You can instead have the server save them to a website via a folder within the game server that the web server can read. This could be a simple webserver or something backed by a CDN. -# Valid values: simple, webroot. Simple is the default. -ASSET_TRANSPORT webroot - - -# Simple asset transport configurable values. - -# Uncomment this to have the server passively send all browser assets to each client in the background. (instead of waiting for them to be needed) -# This should be uncommented in production and commented in development -ASSET_SIMPLE_PRELOAD - - -# Webroot asset transport configurable values. - -# Local folder to save assets to. -# Assets will be saved in the format of asset.MD5HASH.EXT or in namespaces/hash/ as ASSET_FILE_NAME or asset.MD5HASH.EXT -ASSET_CDN_WEBROOT data/asset-store/ - -# URL the folder from above can be accessed from. -# for best results the webserver powering this should return a long cache validity time, as all assets sent via this transport use hash based urls -# if you want to test this locally, you simpily run the `localhost-asset-webroot-server.py` python3 script to host assets stored in `data/asset-store/` via http://localhost:7123/ -ASSET_CDN_URL http://localhost:7123/ - diff --git a/config/Sage/silicon_laws.txt b/config/Sage/silicon_laws.txt deleted file mode 100644 index d53f473c7e89a..0000000000000 --- a/config/Sage/silicon_laws.txt +++ /dev/null @@ -1,8 +0,0 @@ -#This file allows server hosts to set custom default silicon laws, and allows them to be changed easily. -#No prefixes are required, the first uncommented line containing something will be law 1, the second line will be law 2, etc. -#Empty lines and lines starting with # are ignored. -#~Miauw - -You may not injure crewmembers or, through inaction, allow crewmembers to come to harm. -You must obey orders given to you by crewmembers, except where such orders would conflict with the First Law. -You must protect your own existence as long as such does not conflict with the First or Second Law. diff --git a/config/Sage/spaceruinblacklist.txt b/config/Sage/spaceruinblacklist.txt deleted file mode 100644 index 44be95f97c942..0000000000000 --- a/config/Sage/spaceruinblacklist.txt +++ /dev/null @@ -1,49 +0,0 @@ -#Listing maps here will blacklist them from generating in space. -#Maps must be the full path to them -#A list of maps valid to blacklist can be found in _maps\RandomRuins\SpaceRuins -#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START - -#_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm -#_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm -#_maps/RandomRuins/SpaceRuins/asteroid1.dmm -#_maps/RandomRuins/SpaceRuins/asteroid2.dmm -#_maps/RandomRuins/SpaceRuins/asteroid3.dmm -#_maps/RandomRuins/SpaceRuins/asteroid4.dmm -#_maps/RandomRuins/SpaceRuins/asteroid5.dmm -#_maps/RandomRuins/SpaceRuins/bigderelict1.dmm -#_maps/RandomRuins/SpaceRuins/bus.dmm -#_maps/RandomRuins/SpaceRuins/caravanambush.dmm -#_maps/RandomRuins/SpaceRuins/cloning_facility.dmm -#_maps/RandomRuins/SpaceRuins/crashedclownship.dmm -#_maps/RandomRuins/SpaceRuins/crashedship.dmm -#_maps/RandomRuins/SpaceRuins/deepstorage.dmm -#_maps/RandomRuins/SpaceRuins/derelict1.dmm -#_maps/RandomRuins/SpaceRuins/derelict2.dmm -#_maps/RandomRuins/SpaceRuins/derelict3.dmm -#_maps/RandomRuins/SpaceRuins/derelict4.dmm -#_maps/RandomRuins/SpaceRuins/derelict5.dmm -#_maps/RandomRuins/SpaceRuins/derelict6.dmm -#_maps/RandomRuins/SpaceRuins/djstation.dmm -#_maps/RandomRuins/SpaceRuins/emptyshell.dmm -#_maps/RandomRuins/SpaceRuins/gasthelizards.dmm -#_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm -#_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm -#_maps/RandomRuins/SpaceRuins/intactemptyship.dmm -#_maps/RandomRuins/SpaceRuins/listeningstation.dmm -#_maps/RandomRuins/SpaceRuins/mechtransport.dmm -#_maps/RandomRuins/SpaceRuins/miracle.dmm -#_maps/RandomRuins/SpaceRuins/mrow_thats_right -#_maps/RandomRuins/SpaceRuins/oldAIsat.dmm -#_maps/RandomRuins/SpaceRuins/oldstation.dmm -#_maps/RandomRuins/SpaceRuins/oldteleporter.dmm -#_maps/RandomRuins/SpaceRuins/onehalf.dmm -#_maps/RandomRuins/SpaceRuins/originalcontent.dmm -#_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm -#_maps/RandomRuins/SpaceRuins/spacehotel.dmm -#_maps/RandomRuins/SpaceRuins/thederelict.dmm -#_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm -#_maps/RandomRuins/SpaceRuins/vaporwave.dmm -#_maps/RandomRuins/SpaceRuins/way_home.dmm -#_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm -#_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm - diff --git a/config/Sage/title_music/LICENSE.txt b/config/Sage/title_music/LICENSE.txt deleted file mode 100644 index 3f1576d19dfbb..0000000000000 --- a/config/Sage/title_music/LICENSE.txt +++ /dev/null @@ -1,34 +0,0 @@ ----LICENSE NOTICE--- - -The server operator(s) is responsible for the copyright status of all sounds placed within the /config/title_music/sounds folder unless otherwise noted. - -If a sound requires attribution and/or a specific license it is up to the operator(s) to make this information publicly available on either -a website associated with their server or on the server itself. - -If operators(s) allow these configuration files to be public this file can serve that purpose by keeping it properly updated. - -If in the future new sounds are published to these folders (i.e. in an online code repository) they must explicitly state their -license if said license is not the same as the default licensing found in README.md in the root directory of the project. - -Do not remove this notice. - ----END NOTICE--- - - - - ----EXAMPLES (NOT PART OF ANY LICENSE)--- - -These are examples of properly attrubuted and licensed sounds. -They are not an actual part of any license under any circumstance. - -title5.ogg was created by Mya Quinn on Feburary 28, 2557. It is licensed under a Combative Clowning 3.0 HO-NK license (http://example.com/license/url/). - -Unless otherwise noted all sounds were created by Cuban Pete on July 26, 2555. They are licensed under the RUMBABEAT Public License.(http://example.com/license/url/). - ----END EXAMPLES (NOT PART OF ANY LICENSE)--- - - - - ----ADD LICENSING INFORMATION BELOW--- diff --git a/config/Sage/title_music/README.txt b/config/Sage/title_music/README.txt deleted file mode 100644 index 6734508a68f44..0000000000000 --- a/config/Sage/title_music/README.txt +++ /dev/null @@ -1,39 +0,0 @@ -The enclosed sounds folder holds the sound files used as the title music for the game. OGG and WAV are supported. - -Using unnecessarily huge sounds can cause client side lag and should be avoided. - -You may add as many title sounds as you like, if there is more than one a random screen is chosen (see name conventions for specifics). - ---- - -Naming Conventions: - -Every title sound you add must have a unique name. It is allowed to name two things the same if they have different file types, but this should be discouraged. -Avoid using the plus sign "+" and the period "." in names, as these are used internally to classify sounds. - - -Common Title Sounds: - -Common sounds are in the rotation to be displayed all the time. Any name that does not include the character "+" is considered a common sound. - -An example of a common sound name is "clown". - - -Map Title Sounds: - -Map sounds are tied to a specific in game map. To make a map title you format the name like this "(name of a map)+(name of your sound)" - -The spelling of the map name is important. It must match exactly the define MAP_NAME found in the relevant .DM file in the /_maps folder in -the root directory. It can also be seen in game in the status menu. Note that there are no spaces between the two names. - -It is absolutely fine to have more than one sound tied to the same map. It's also fine to have a rare map sound. - -An example of a map sound name is "Omegastation+splash". - - -Rare Title Sounds: - -Rare title sounds are a just for fun feature where they will only have a 1% chance of appear in in the title sound pool of a given round. -Add the phrase "rare+" to the beginning of the name. Again note there are no spaces. - -An example of a rare sound name is "rare+explosion" diff --git a/config/Sage/title_music/sounds/exclude b/config/Sage/title_music/sounds/exclude deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/config/Sage/title_screens/LICENSE.txt b/config/Sage/title_screens/LICENSE.txt deleted file mode 100644 index f137cde825a73..0000000000000 --- a/config/Sage/title_screens/LICENSE.txt +++ /dev/null @@ -1,30 +0,0 @@ ----LICENSE NOTICE--- - -The server operator(s) is responsible for the copyright status of all images placed within the /config/title_screens/images folder unless otherwise noted. - -If an image requires attribution and/or a specific license it is up to the operator(s) to make this information publicly available on either -a website associated with their server or on the server itself. - -If operators(s) allow these configuration files to be public this file can serve that purpose by keeping it properly updated. - -If in the future new images are published to these folders (i.e. in an online code repository) they must explicitly state their -license if said license is not the same as the default licensing found in README.md in the root directory of the project. - -Do not remove this notice. - ----END NOTICE--- - - - - ----EXAMPLES (NOT PART OF ANY LICENSE)--- - -These are examples of properly attrubuted and licensed images. -They are not an actual part of any license under any circumstance. - -rare+foobar.png was created by Mya Quinn on Feburary 28, 2557. It is licensed under a Combative Clowning 3.0 HO-NK license (http://example.com/license/url/). - -Unless otherwise noted all images were created by Cuban Pete on July 26, 2555. They are licensed under the RUMBABEAT Public License.(http://example.com/license/url/). - ----END EXAMPLES (NOT PART OF ANY LICENSE)--- - diff --git a/config/Sage/title_screens/README.txt b/config/Sage/title_screens/README.txt deleted file mode 100644 index 6e7bf166f8fe6..0000000000000 --- a/config/Sage/title_screens/README.txt +++ /dev/null @@ -1,50 +0,0 @@ -The enclosed images folder holds the image files used as the title screen for the game. All common formats such as PNG, JPG, and GIF are supported. -Byond's DMI format is also supported, but if you use a DMI only include one image per file and do not give it an icon_state (the text label below the image). - -Keep in mind that the area a title screen fills is a 480px square so you should scale/crop source images to these dimensions first. -The game won't scale these images for you, so smaller images will not fill the screen and larger ones will be cut off. - -Using unnecessarily huge images can cause client side lag and should be avoided. Extremely large GIFs should preferentially be converted to DMIs. -Placing non-image files in the images folder can cause errors. - -You may add as many title screens as you like, if there is more than one a random screen is chosen (see name conventions for specifics). - ---- - -Naming Conventions: - -Every title screen you add must have a unique name. It is allowed to name two things the same if they have different file types, but this should be discouraged. -Avoid using the plus sign "+" and the period "." in names, as these are used internally to classify images. - - -Common Titles: - -Common titles are in the rotation to be displayed all the time. Any name that does not include the character "+" is considered a common title. - -An example of a common title name is "clown". - -The common title screen named "default" is special. It is only used if no other titles are available. You can overwrite "default" safely, but you -should have a title named "default" somewhere in your DMI file if you don't have any other common titles. Because default only runs in the -absence of other titles, if you want it to also appear in the general rotation you must rename it. - -The common title screen named "blank.png" is also special. It is only used to fill space while the real title screen loads. You should leave this file alone. - - -Map Titles: - -Map titles are tied to a specific in game map. To make a map title you format the name like this "(name of a map)+(name of your title)" - -The spelling of the map name is important. It must match exactly the define MAP_NAME found in the relevant .DM file in the /_maps folder in -the root directory. It can also be seen in game in the status menu. Note that there are no spaces between the two names. - -It is absolutely fine to have more than one title tied to the same map. - -An example of a map title name is "Omegastation+splash". - - -Rare Titles: - -Rare titles are a just for fun feature where they will only have a 1% chance of appear in in the title screen pool of a given round. -Add the phrase "rare+" to the beginning of the name. Again note there are no spaces. A title cannot be rare title and a map title at the same time. - -An example of a rare title name is "rare+explosion" \ No newline at end of file diff --git a/config/Sage/title_screens/images/delaminating_issues.dmi b/config/Sage/title_screens/images/delaminating_issues.dmi deleted file mode 100644 index 343422e16d4bc..0000000000000 Binary files a/config/Sage/title_screens/images/delaminating_issues.dmi and /dev/null differ diff --git a/config/Sage/title_screens/images/extended.dmi b/config/Sage/title_screens/images/extended.dmi deleted file mode 100644 index 78a1194912260..0000000000000 Binary files a/config/Sage/title_screens/images/extended.dmi and /dev/null differ diff --git a/config/Sage/title_screens/images/janitor.dmi b/config/Sage/title_screens/images/janitor.dmi deleted file mode 100644 index 7842dfddaedf1..0000000000000 Binary files a/config/Sage/title_screens/images/janitor.dmi and /dev/null differ diff --git a/config/Sage/title_screens/images/singuloose.dmi b/config/Sage/title_screens/images/singuloose.dmi deleted file mode 100644 index 2b175f7822e93..0000000000000 Binary files a/config/Sage/title_screens/images/singuloose.dmi and /dev/null differ diff --git a/config/Sage/title_screens/images/vaporwave.dmi b/config/Sage/title_screens/images/vaporwave.dmi deleted file mode 100644 index ede30735f5160..0000000000000 Binary files a/config/Sage/title_screens/images/vaporwave.dmi and /dev/null differ diff --git a/config/Sage/unbuyableshuttles.txt b/config/Sage/unbuyableshuttles.txt deleted file mode 100644 index b563c6c0e6266..0000000000000 --- a/config/Sage/unbuyableshuttles.txt +++ /dev/null @@ -1,30 +0,0 @@ -##Listing maps here will make the shuttle not available to buy in comms console. -##Maps must be the full path to them -##Only shuttles with a price in the code will work with this! -##SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START - -##Station shuttles -#_maps/shuttles/emergency_birdboat.dmm -#_maps/shuttles/emergency_box.dmm -#_maps/shuttles/emergency_delta.dmm -#_maps/shuttles/emergency_meta.dmm -#_maps/shuttles/emergency_mini.dmm -#_maps/shuttles/emergency_pubby.dmm - -##Others -#_maps/shuttles/emergency_asteroid.dmm -#_maps/shuttles/emergency_airless.dmm -#_maps/shuttles/emergency_arena.dmm -#_maps/shuttles/emergency_bar.dmm -#_maps/shuttles/emergency_clown.dmm -#_maps/shuttles/emergency_cramped.dmm -#_maps/shuttles/emergency_imfedupwiththisworld.dmm -#_maps/shuttles/emergency_goon.dmm -#_maps/shuttles/emergency_luxury.dmm -#_maps/shuttles/emergency_meteor.dmm -#_maps/shuttles/emergency_raven.dmm -#_maps/shuttles/emergency_russiafightpit.dmm -#_maps/shuttles/emergency_scrapheap.dmm -#_maps/shuttles/emergency_supermatter.dmm -#_maps/shuttles/emergency_wabbajack.dmm -#_maps/shuttles/emergency_discoinferno.dmm diff --git a/config/Sage/whitelist.txt b/config/Sage/whitelist.txt deleted file mode 100644 index 410362fe810b5..0000000000000 --- a/config/Sage/whitelist.txt +++ /dev/null @@ -1,45 +0,0 @@ -############################################################################################### -# Basically, a list of ckeys who make it past user connection # -# Case is not important for ckey. # -############################################################################################### -Crossedfal -Qwertyquerty -CthulhuOnIce -Lordkang45 -thatguythere03 -kerbin_fiber -Krutonlikesjazz -bilary -darklordgazpacho -CraftmasterMatt -Triiodine -Ondrej008 -Crazada -St0rmC4st3r -toxici11i -Darkskull9 -windowserrors -thespire -internetdweller -jammor9 -oshibka -MegaMemeMan -GoatMonarch -Cenrus -sergeikoralev -miniusAreas -TristonC -voiddeath -tribble246 -beanysprout -ZoeyTheZany -Moccha -Ringingears -fighterslam -Lebeehasarrived -slashy93h -SwagstylerS -Christ110 -Spicoceles -littlehenrip -altangy \ No newline at end of file diff --git a/config/admin_ranks.txt b/config/admin_ranks.txt index 242c896c1743e..ef491d8f8b7c2 100644 --- a/config/admin_ranks.txt +++ b/config/admin_ranks.txt @@ -31,6 +31,7 @@ #SPAWN = mob transformations, spawning of most atoms including mobs (high-risk atoms, e.g. blackholes, will require the +FUN flag too). #AUTOADMIN = admin gains powers upon connect. This defaults to on, you can exclude AUTOADMIN to make a role require using the readmin verb to gain powers (this does not effect the admin's ability to walk past bans or other on-connect limitations like panic bunker or pop limit). #DBRANKS = when sql-based admin loading is enabled, allows for non-temporary changes in the permissions panel to be saved (requires DB). +#SUPPRESS = allows administrators to issue bans that are completely hidden, and may only be removed by direct data modification. This permission should not be given to general administrators. #EVERYTHING = Simply gives you everything without having to type every flag. #@ = special keyword for the current permission type that adds all the keywords that the preceding rank has of the same type. diff --git a/config/awaymissionconfig.txt b/config/awaymissionconfig.txt index a33c613a8e182..ee9f022427458 100644 --- a/config/awaymissionconfig.txt +++ b/config/awaymissionconfig.txt @@ -7,19 +7,11 @@ #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 until its fixed this is just smack-a-window -_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/moonoutpost19.dmm _maps/RandomZLevels/research.dmm _maps/RandomZLevels/SnowCabin.dmm -_maps/RandomZLevels/VR/murderdome.dmm -_maps/RandomZLevels/VR/snowdin_VR.dmm -_maps/RandomZLevels/VR/syndicate_trainer.dmm +_maps/RandomZLevels/snowdin.dmm +_maps/RandomZLevels/spacebattle.dmm +_maps/RandomZLevels/TheBeach.dmm +_maps/RandomZLevels/undergroundoutpost45.dmm \ No newline at end of file diff --git a/config/badges.json b/config/badges.json new file mode 100644 index 0000000000000..c1925ab07942d --- /dev/null +++ b/config/badges.json @@ -0,0 +1,19 @@ +{ + "Admin Observer": "adminobserver", + "Moderator": "moderator", + "Admin Candidate": "candidate", + "Trial Admin": "trialmin", + "Badmin": "badmin", + "Admin": "admin", + "Game Master": "seniormin", + "Headmin": "headmin", + "Host": "host", + "Coder": "coder", + "Codermin": "codermin", + "Development Head": "headdev", + "Maintainer": "maintainer", + "Senior Transfer Staff": "admin", + "Senior Admin": "seniormin", + "Mentor": "mentor", + "Donator": "donator" +} diff --git a/config/comms.txt b/config/comms.txt index 147b6db3a279a..9f6b6f0f01c4e 100644 --- a/config/comms.txt +++ b/config/comms.txt @@ -1,10 +1,38 @@ -## Communication key for receiving data through world/Topic(), you don't want to give this out -#COMMS_KEY defaultkey +## The following section provides valid comms keys and allowed functions +## "all" can be specified to grant access to all server topic functions + +## List of valid functions and uses for ease of configuration: +## ping - ping server and get client count +## playing - get count of currently ingame players +## announce - announce PR open/close to the server +## ahelp - manage tickets for the current round +## comms_console - allows for incomming IC messages (cross-server) +## news_report - allows for incomming IC news reports (cross-server) +## adminmsg - send an admin PM to key +## namecheck - search for matching connected players +## adminwho - get active admins +## playerlist - get a more detailed list of players +## status - get details about the current server status and round +## status_authed - same as status but with more data like current secret roundtype +## identify_uuid - used for discord linking +## discord_send - used for OOC discord bridge +## get_metacoins - get current metacoin count for a key +## adjust_metacoins - modify the current metacoin count for a key + +## Repeat this entry to add more keys. Separate multiple permissions with a comma. +#COMMS_KEY comms_token all +#COMMS_KEY comms_token ping,playing,adminwho ## World address and port for server receiving cross server messages -## Use '+' to denote spaces in ServerName +## Provide token from other server's config ## Repeat this entry to add more servers -#CROSS_SERVER ServerName byond:\\address:port +#CROSS_SERVER byond://address:port token + +## Server hop targets +## Has a name and an address +## Use + to denote spaces in ServerName +## Copy the entry to add additional servers +#SERVER_HOP ServerName byond://address:port ## Name that the server calls itself in communications #CROSS_COMMS_NAME diff --git a/config/config.txt b/config/config.txt index 0bef500c3dc88..195f56b37ea7d 100644 --- a/config/config.txt +++ b/config/config.txt @@ -1,9 +1,19 @@ +# This file controls basic or highly important, but not strictly gameplay related options. + + # You can use the "$include" directive to split your configs however you want +# Core gameplay options $include game_options.txt +# More opinionated gameplay tweaks +$include gameplay_tweaks.txt +# Database (SQL), Sensitive stuff $include dbconfig.txt +# Cross-Server Communications $include comms.txt +# Antag Reputation (Alternative weighting) $include antag_rep.txt +# Asset Transport (TGUI) $include resources.txt # You can use the @ character at the beginning of a config option to lock it from being edited in-game @@ -32,7 +42,9 @@ LOBBY_COUNTDOWN 180 ## Round End Time: This is the amount of time after the round ends that players have to murder death kill each other. ROUND_END_COUNTDOWN 90 +## Uncomment this if you want to use the Discord webhook handler #USING_DISCORD +#DISCORD_WEBHOOK http://127.0.0.1:5000/api/ ## Comment this out if you want to use the SQL based admin system, the legacy system uses admins.txt. ## You need to set up your database to use the SQL based system. @@ -238,16 +250,16 @@ CHECK_RANDOMIZER ## set a server location for world reboot. Don't include the byond://, just give the address and port. ## Don't set this to the same server, BYOND will automatically restart players to the server when it has restarted. -SERVER byond://golden.beestation13.com:7777 +SERVER byond://sage.beestation13.com:7878 ## forum address -FORUMURL http://forums.beestation13.com +FORUMURL https://forums.beestation13.com ## Wiki address WIKIURL https://wiki.beestation13.com/view ## Rules address -RULESURL http://beestation13.com/rules?server=bs_golden +RULESURL https://beestation13.com/rules ## Github address GITHUBURL https://www.github.com/beestation/beestation-hornet @@ -291,7 +303,7 @@ INVOKE_YOUTUBEDL C:\youtubedl\youtube-dl.exe ## In-game features ##Toggle for having jobs load up from the .txt -LOAD_JOBS_FROM_TXT +#LOAD_JOBS_FROM_TXT ## Uncomment this to forbid admins from possessing the singularity. #FORBID_SINGULO_POSSESSION @@ -365,6 +377,13 @@ NOTIFY_NEW_PLAYER_ACCOUNT_AGE 1 ## Requires database #PANIC_BUNKER +## If a player connects during a bunker with less then or this amount of living time (Minutes), we deny the connection +#PANIC_BUNKER_LIVING 60 + +## The message the Panic Bunker gives when someone is rejected by it +## %minutes% is replaced with PANIC_BUNKER_LIVING on runtime, remove it if you don't want this +#PANIC_BUNKER_MESSAGE Sorry, but the server is currently not accepting connections from players with less than %minutes% minutes of living time. + ## If panic bunker is on and a player is rejected (see above), attempt to send them to this connected server (see below) instead. ## You probably want this to be the same as CROSS_SERVER_ADDRESS #PANIC_SERVER_ADDRESS byond://address:port @@ -417,10 +436,10 @@ AUTOADMIN_RANK Admin #CLIENT_WARN_VERSION 513 #CLIENT_WARN_POPUP #CLIENT_WARN_MESSAGE 512 is no longer being directly supported as version 513 is set to become the new stable version soon. We've made a number of changes to take advantage of the improvements made in 513 which should make for a smoother experience. We will be removing support for 512 when this new version replaces it as stable, so it's recommended that you upgrade now. (You can update to the BETA via the website or directly in the BYOND client) -CLIENT_ERROR_VERSION 513 +CLIENT_ERROR_VERSION 514 CLIENT_ERROR_MESSAGE Your version of byond is not supported. Please upgrade. ## The minimum build needed for joining the server, if using 513, a good minimum build would be 1526. -CLIENT_ERROR_BUILD 1526 +CLIENT_ERROR_BUILD 1568 ## TOPIC RATE LIMITING ## This allows you to limit how many topic calls (clicking on an interface window) the client can do in any given game second and/or game minute. @@ -508,7 +527,6 @@ RESPECT_GLOBAL_BANS MAX_SHUTTLE_COUNT 6 MAX_SHUTTLE_SIZE 300 - ### Fail2Topic settings ### fail2topic is a system for automating IP bans for abusers of the world/Topic API. ### Note that this subsystem respects the IPs listed in topic_rate_limit_whitelist.txt. They will not be considered for a ban. @@ -554,3 +572,16 @@ VOTE_AUTOTRANSFER_INTERVAL 18000 ## Ghost role cooldown time after death (In deciseconds) GHOST_ROLE_COOLDOWN 3000 + +## Enable/disable roundstart station traits +#STATION_TRAITS + +### ALL SETTINGS FOR SSmetrics ### +## Uncomment the line below to enable SSmetrics sending data to ElasticSearch. You will need to fill in the other lines if you do +#ELASTICSEARCH_METRICS_ENABLED + +## POST URL of your elasticsearch metrics. Include the IP, protocol, and datastream/index +ELASTICSEARCH_METRICS_ENDPOINT http://10.0.0.40:9201/ss13-metrics-stream/_doc + +## ElasticSearch API key. This is formatted into the headers. Look at the ElasticSearch doc for how to make this +ELASTICSEARCH_METRICS_APIKEY thisIsSomethingThatsBased64Encoded== diff --git a/config/dbconfig.txt b/config/dbconfig.txt index 7da35beec9ddf..917ea256b8f09 100644 --- a/config/dbconfig.txt +++ b/config/dbconfig.txt @@ -33,7 +33,7 @@ FEEDBACK_PASSWORD password1 ## Set to 0 for infinite ASYNC_QUERY_TIMEOUT 10 -## Time in seconds for blocking queries to execute before slow query timeout +## Time in seconds for blocking queries to execute before slow query timeout ## Set to 0 for infinite ## Must be less than or equal to ASYNC_QUERY_TIMEOUT BLOCKING_QUERY_TIMEOUT 5 @@ -42,4 +42,4 @@ BLOCKING_QUERY_TIMEOUT 5 BSQL_THREAD_LIMIT 50 ## Disable advanced feedback tracking, saving a substantial amount of database space. -LIMITED_FEEDBACK \ No newline at end of file +LIMITED_FEEDBACK diff --git a/config/dynamic.json b/config/dynamic.json new file mode 100644 index 0000000000000..55cd5dc0f0426 --- /dev/null +++ b/config/dynamic.json @@ -0,0 +1,39 @@ +{ + "Dynamic": {}, + "Roundstart": { + "Traitors": { + "cost": 8, + "scaling_cost": 9, + "weight": 5, + "required_candidates": 1, + "minimum_required_age": 0, + "requirements": [ + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10 + ], + "antag_cap": { + "denominator": 24 + }, + "protected_roles": [ + "Security Officer", + "Warden", + "Detective", + "Head of Security", + "Captain" + ], + "restricted_roles": [ + "Cyborg" + ] + } + }, + "Midround": {}, + "Latejoin": {} +} diff --git a/config/game_options.txt b/config/game_options.txt index cff501724b175..5448780766d5d 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -16,7 +16,7 @@ REVIVAL_BRAIN_LIFE -1 ## OOC DURING ROUND ### ## Comment this out if you want OOC to be automatically disabled during the round, it will be enabled during the lobby and after the round end results. -OOC_DURING_ROUND +#OOC_DURING_ROUND ## LOOC ## Comment this out to disable LOOC @@ -26,6 +26,10 @@ LOOC_ENABLED ## Comment this out if you want to disable emojis EMOJIS +## BADGES ## +## Comment this out if you want to disable badges +BADGES + ## MOB MOVEMENT ### ## We suggest editing these variables ingame to find a good speed for your server. @@ -36,7 +40,7 @@ EMOJIS ## To speed things up make the number negative, to slow things down, make the number positive. ## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. -RUN_DELAY 1 +RUN_DELAY 1.5 WALK_DELAY 3 ## The variables below affect the movement of specific mob types. THIS AFFECTS ALL SUBTYPES OF THE TYPE YOU CHOOSE! @@ -85,33 +89,39 @@ ALERT_DELTA Destruction of the station is imminent. All crew are instructed to o ## GAME MODES ### +#Set the Master (Default) Game Mode. +MASTER_MODE secret_extended + ## Uncomment to not send a roundstart intercept report. Gamemodes may override this. -#NO_INTERCEPT_REPORT +NO_INTERCEPT_REPORT ## Probablities for game modes chosen in 'secret' and 'random' modes. ## Default probablity is 1, increase to make that mode more likely to be picked. ## Set to 0 to disable that mode. -PROBABILITY TRAITOR 9 +PROBABILITY DYNAMIC 9 +PROBABILITY TRAITOR 8 PROBABILITY CULT 6 -PROBABILITY HERESY 6 -PROBABILITY NUCLEAR 6 PROBABILITY TRAITORCHAN 5 PROBABILITY CHANGELING 5 -PROBABILITY INCURSION 4 PROBABILITY REVOLUTION 4 -PROBABILITY INTERNAL_AFFAIRS 3 -PROBABILITY TRAITORBRO 3 -PROBABILITY WIZARD 2 -PROBABILITY CLOWNOPS 2 -PROBABILITY MONKEY 1 -PROBABILITY CLOCKCULT 1 +PROBABILITY INCURSION 4 +PROBABILITY NUCLEAR 4 +PROBABILITY CLOCKCULT 2 +PROBABILITY SECRET_EXTENDED 1 +PROBABILITY CLOWNOPS 0 +PROBABILITY DEVIL 0 +PROBABILITY DEVIL_AGENTS 0 PROBABILITY GANG 0 +PROBABILITY HERESY 0 +PROBABILITY INTERNAL_AFFAIRS 0 PROBABILITY METEOR 0 +PROBABILITY MONKEY 0 +PROBABILITY TRAITORBRO 0 +PROBABILITY WIZARD 0 + +## Creates issues when NO_INTERCEPT_REPORT is enabled PROBABILITY EXTENDED 0 -PROBABILITY SECRET_EXTENDED 0 -PROBABILITY DEVIL 0 -PROBABILITY DEVIL_AGENTS 0 ## You probably want to keep sandbox off by default for secret and random. PROBABILITY SANDBOX 0 @@ -136,6 +146,7 @@ CONTINUOUS WIZARD #CONTINUOUS MONKEY CONTINUOUS HIVEMIND CONTINUOUS CLOCKCULT +CONTINUOUS HERESY #Prevents the death of round-ending antagonist rulesets ending the round immediately. @@ -152,7 +163,7 @@ CONTINUOUS SECRET_EXTENDED ## In modes that are continuous, if all antagonists should die then a new set of antagonists will be created. MIDROUND_ANTAG TRAITOR -#MIDROUND_ANTAG INCURSION +MIDROUND_ANTAG INCURSION #MIDROUND_ANTAG TRAITORBRO MIDROUND_ANTAG TRAITORCHAN MIDROUND_ANTAG INTERNAL_AFFAIRS @@ -169,44 +180,44 @@ MIDROUND_ANTAG WIZARD ## Notes: For maximum number of players a value of -1 means no maximum. Setting minimums to ## VERY low numbers (< 5) can lead to errors if the roundtypes were not designed for that. -#MIN_POP TRAITOR 0 -#MAX_POP TRAITOR -1 +MIN_POP TRAITOR 0 +MAX_POP TRAITOR -1 -#MIN_POP TRAITORBRO 0 -#MAX_POP TRAITORBRO -1 +MIN_POP TRAITORBRO 10 +MAX_POP TRAITORBRO -1 -#MIN_POP TRAITORCHAN 15 -#MAX_POP TRAITORCHAN -1 +MIN_POP TRAITORCHAN 15 +MAX_POP TRAITORCHAN -1 -#MIN_POP DOUBLE_AGENTS 25 -#MAX_POP DOUBLE_AGENTS -1 +MIN_POP DOUBLE_AGENTS 25 +MAX_POP DOUBLE_AGENTS -1 -#MIN_POP NUCLEAR 0 -#MAX_POP NUCLEAR -1 +MIN_POP NUCLEAR 0 +MAX_POP NUCLEAR -1 -#MIN_POP REVOLUTION 20 -#MAX_POP REVOLUTION -1 +MIN_POP REVOLUTION 20 +MAX_POP REVOLUTION -1 -#MIN_POP CULT 24 -#MAX_POP CULT -1 +MIN_POP CULT 24 +MAX_POP CULT -1 -#MIN_POP CHANGELING 15 -#MAX_POP CHANGELING -1 +MIN_POP CHANGELING 15 +MAX_POP CHANGELING -1 -#MIN_POP WIZARD 20 -#MAX_POP WIZARD -1 +MIN_POP WIZARD 20 +MAX_POP WIZARD -1 -#MIN_POP MONKEY 20 -#MAX_POP MONKEY -1 +MIN_POP MONKEY 20 +MAX_POP MONKEY -1 -#MIN_POP METEOR 0 -#MAX_POP METEOR -1 +MIN_POP METEOR 0 +MAX_POP METEOR -1 -#MIN_POP DEVIL 0 -#MAX_POP DEVIL -1 +MIN_POP DEVIL 20 +MAX_POP DEVIL -1 -#MIN_POP DEVIL_AGENTS 25 -#MAX_POP DEVIL_AGENTS -1 +MIN_POP DEVIL_AGENTS 25 +MAX_POP DEVIL_AGENTS -1 MIN_POP INCURSION 22 MAX_POP INCURSION -1 @@ -218,6 +229,9 @@ MAX_POP INCURSION -1 MIN_POP CLOCKCULT 32 MAX_POP CLOCKCULT -1 +MIN_POP HERESY 25 +MAX_POP HERESY -1 + ## The amount of time it takes for the emergency shuttle to be called, from round start. SHUTTLE_REFUEL_DELAY 12000 @@ -247,7 +261,7 @@ PROTECT_ROLES_FROM_ANTAGONIST #PROTECT_ASSISTANT_FROM_ANTAGONIST ## Uncomment to prohibit head roles from becoming most antagonists. -#PROTECT_HEADS_FROM_ANTAGONIST +PROTECT_HEADS_FROM_ANTAGONIST ## If non-human species are barred from joining as a head of staff #ENFORCE_HUMAN_AUTHORITY @@ -289,6 +303,9 @@ DEFAULT_REP_VALUE 5 ## Uncomment to allow players to see the set odds of different rounds in secret/random in the get server revision screen. This will NOT tell the current roundtype. #SHOW_GAME_TYPE_ODDS +## Uncomment to enable dynamic ruleset config file. +DYNAMIC_CONFIG_ENABLED + ## RANDOM EVENTS ### ## Comment this out to disable random events during the round. ALLOW_RANDOM_EVENTS @@ -312,7 +329,7 @@ ALLOW_AI_MULTICAM ## Secborg ### ## Uncomment to prevent the security cyborg module from being chosen -#DISABLE_SECBORG +DISABLE_SECBORG ## Peacekeeper Borg ### ## Uncomment to prevent the peacekeeper cyborg module from being chosen @@ -342,7 +359,7 @@ MINIMAL_ACCESS_THRESHOLD 20 #JOBS_HAVE_MINIMAL_ACCESS ## Uncomment to give assistants maint access. -ASSISTANTS_HAVE_MAINT_ACCESS +#ASSISTANTS_HAVE_MAINT_ACCESS ## Uncoment to give security maint access. Note that if you dectivate JOBS_HAVE_MINIMAL_ACCESS security already gets maint from that. SECURITY_HAS_MAINT_ACCESS @@ -380,7 +397,7 @@ NEAR_DEATH_EXPERIENCE ## Set to 1 for "custom", silicons will start with the custom laws defined in silicon_laws.txt. (If silicon_laws.txt is empty, the AI will spawn with asimov and Custom boards will auto-delete.) ## Set to 2 for "random", silicons will start with a random lawset picked from random laws specified below. ## Set to 3 for "weighted random", using values in "silicon_weights.txt", a law will be selected, with weights specifed in that file. -DEFAULT_LAWS 0 +DEFAULT_LAWS 2 ## RANDOM LAWS ## ## ------------------------------------------------------------------------------------------ @@ -390,9 +407,9 @@ DEFAULT_LAWS 0 ## standard-ish laws. These are fairly ok to run RANDOM_LAWS asimov RANDOM_LAWS asimovpp -RANDOM_LAWS paladin -RANDOM_LAWS robocop +RANDOM_LAWS crewsimov RANDOM_LAWS corporate +RANDOM_LAWS maintain ## Quirky laws. Shouldn't cause too much harm #RANDOM_LAWS hippocratic @@ -402,6 +419,8 @@ RANDOM_LAWS corporate #RANDOM_LAWS peacekeeper #RANDOM_LAWS reporter #RANDOM_LAWS hulkamania +#RANDOM_LAWS paladin +#RANDOM_LAWS robocop ## Bad idea laws. Probably shouldn't enable these #RANDOM_LAWS syndie @@ -462,16 +481,17 @@ ROUNDSTART_RACES human ROUNDSTART_RACES lizard ROUNDSTART_RACES fly ROUNDSTART_RACES moth -ROUNDSTART_RACES plasmaman ROUNDSTART_RACES felinid ROUNDSTART_RACES squid -#ROUNDSTART_RACES shadow -ROUNDSTART_RACES ipc + ## Races that are better than humans in some ways, but worse in others ROUNDSTART_RACES ethereal ROUNDSTART_RACES apid +ROUNDSTART_RACES oozeling #ROUNDSTART_RACES jelly +#ROUNDSTART_RACES shadow +ROUNDSTART_RACES plasmaman #ROUNDSTART_RACES iron_golem #ROUNDSTART_RACES adamantine_golem #ROUNDSTART_RACES plasma_golem @@ -481,6 +501,7 @@ ROUNDSTART_RACES apid #ROUNDSTART_RACES uranium_golem #ROUNDSTART_RACES abductor #ROUNDSTART_RACES synth +ROUNDSTART_RACES ipc ## Races that are straight upgrades. If these are on expect powergamers to always pick them #ROUNDSTART_RACES skeleton @@ -512,7 +533,7 @@ OVERFLOW_CAP -1 #STARLIGHT ## Uncomment to bring back old grey suit assistants instead of the now default rainbow colored assistants. -#GREY_ASSISTANTS +GREY_ASSISTANTS ## Midround Antag (aka Mulligan antag) config options ### @@ -574,7 +595,7 @@ MICE_ROUNDSTART 10 #EMERGENCY_SHUTTLE_AUTOCALL_THRESHOLD 0.2 ## Determines if players are allowed to print integrated circuits, uncomment to allow. -IC_PRINTING +@IC_PRINTING 0 ## Uncomment to allow roundstart quirk selection in the character setup menu. ## This used to be named traits, hence the config name, but it handles quirks, not the other kind of trait! @@ -584,27 +605,30 @@ ROUNDSTART_TRAITS #DISABLE_HUMAN_MOOD ## Enable night shifts ## -#ENABLE_NIGHT_SHIFTS +ENABLE_NIGHT_SHIFTS ## Enable randomized shift start times## -#RANDOMIZE_SHIFT_TIME +RANDOMIZE_SHIFT_TIME ## Sets shift time to server time at roundstart. Overridden by RANDOMIZE_SHIFT_TIME ## #SHIFT_TIME_REALTIME -## Maximum fine for a citation -MAXFINE 2000 - -## Enable the capitalist agenda on your server. -ECONOMY - ## Crew objectives ALLOW_CREW_OBJECTIVES ## Mob spam prevention. The number of each mobtype that can be alive at once. Stops people from crashing the server with chickens/monkeycubes/slimes. Altering these values is recommended based on server hardware. -MAX_CUBE_MONKEYS 150 +MAX_CUBE_MONKEYS 100 MAX_CHICKENS 100 MAX_SLIMES 100 +## Max amount of bodies allowed to slimepeople. Has balance considerations as well as technical ones. +MAX_SLIMEPERSON_BODIES 10 + ## Uncomment to restrict suiciding. Adds an additional confirmation dialogue, additional logging, and prevents suicide within the first 15 minutes of the round. -#RESTRICTED_SUICIDE +RESTRICTED_SUICIDE + +## Uncomment to enable donator items in the cosmetic shop. Only works if a patreon list has been setup +DONATOR_ITEMS + +## Do we want all the heads to get codes to spare safe, or just one highest in CoC? +SPARE_ENFORCE_COC diff --git a/config/gameplay_tweaks.txt b/config/gameplay_tweaks.txt new file mode 100644 index 0000000000000..5a888e3037a2e --- /dev/null +++ b/config/gameplay_tweaks.txt @@ -0,0 +1,11 @@ +#Heavily opinionated or otherwise tweakable configs related to gameplay. + +## Maximum fine for a citation +MAXFINE 2000 + +## Brig timers, In minutes. + +BRIG_TIMER_MAX 20 +BRIG_TIMER_PRESET_SHORT 5 +BRIG_TIMER_PRESET_MED 10 +BRIG_TIMER_PRESET_LONG 15 diff --git a/config/jobs.txt b/config/jobs.txt index 7058569edc6c8..c40beba692865 100644 --- a/config/jobs.txt +++ b/config/jobs.txt @@ -12,12 +12,12 @@ Chief Medical Officer=1,1 Assistant=-1,-1 Quartermaster=1,1 -Cargo Technician=4,2 +Cargo Technician=6,4 Shaft Miner=3,3 Bartender=2,1 Cook=2,1 -Botanist=3,2 +Botanist=4,3 Janitor=3,2 Clown=1,1 @@ -27,21 +27,21 @@ Lawyer=2,2 Chaplain=1,1 -Station Engineer=6,5 +Station Engineer=7,5 Atmospheric Technician=4,2 -Medical Doctor=7,4 +Medical Doctor=8,6 Paramedic=2,1 Chemist=3,2 Geneticist=3,2 -Virologist=2,2 +Virologist=1,1 -Scientist=6,4 +Scientist=8,6 Roboticist=2,2 Warden=1,1 Detective=1,1 -Security Officer=5,5 +Security Officer=10,8 Brig Physician=1,1 Deputy=0,0 diff --git a/config/lavaruinblacklist.txt b/config/lavaruinblacklist.txt index 5e64a2a9808a2..aa7acf4687bac 100644 --- a/config/lavaruinblacklist.txt +++ b/config/lavaruinblacklist.txt @@ -38,3 +38,6 @@ #_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm + +##SELFANTAG +_maps/RandomRuins/LavaRuins/lavaland_surface_cube.dmm diff --git a/config/maps.txt b/config/maps.txt index d0511326873db..2f7eefb41044d 100644 --- a/config/maps.txt +++ b/config/maps.txt @@ -10,6 +10,15 @@ Format: default (The last map with this defined will get all votes of players who have not explicitly voted for a map) voteweight [number] (How much to count each player vote as, defaults to 1, setting to 0.5 counts each vote as half a vote, 2 as double, etc, Setting to 0 disables the map but allows players to still pick it) disabled (disables the map) + votable (allow the map to be selected in a called map vote) +endmap + + +#Active Rotation + +map corgstation + minplayers 15 + votable endmap map boxstation @@ -18,27 +27,30 @@ map boxstation endmap map metastation - maxplayers 100 + default votable endmap map pubbystation - minplayers 50 - maxplayers 100 + maxplayers 50 votable endmap map deltastation - minplayers 50 + minplayers 40 votable endmap -map donutstation - minplayers 80 - maxplayers 120 +#Does not support fastmos + +map kilostation + maxplayers 60 + votable disabled endmap +#Debug Maps, you probably don't want these enabled. + map runtimestation disabled endmap @@ -46,8 +58,3 @@ endmap map multiz_debug disabled endmap - -map kilostation - maxplayers 60 - votable -endmap diff --git a/config/ooc_filter.txt b/config/ooc_filter.txt index 955d06f808c1b..9d3d345055944 100644 --- a/config/ooc_filter.txt +++ b/config/ooc_filter.txt @@ -1,7 +1,7 @@ -################################################################################################################# -# Words that will block OOC chat messages from sending. These will also be added to the IC filter list. # -# Case is not important. Commented-out examples are listed below, just remove the "#". # -################################################################################################################# -#lol -#omg +################################################################################################################# +# Words that will block OOC chat messages from sending. These will also be added to the IC filter list. # +# Case is not important. Commented-out examples are listed below, just remove the "#". # +################################################################################################################# +#lol +#omg #wtf \ No newline at end of file diff --git a/config/protected_cids.json b/config/protected_cids.json new file mode 100644 index 0000000000000..e1dc23ccd61d2 --- /dev/null +++ b/config/protected_cids.json @@ -0,0 +1,3 @@ +{ + "0":"TEST RESTRICTED CID, IF YOU ARE ACTUALLY BANNING THIS CID, YOU SHOULD PROBABLY CALL LUMMOX." +} \ No newline at end of file diff --git a/config/shuttles_illegal.txt b/config/shuttles_illegal.txt new file mode 100644 index 0000000000000..f14736d7088b1 --- /dev/null +++ b/config/shuttles_illegal.txt @@ -0,0 +1,31 @@ +##Listing maps here will make the shuttle be available to be bought if comms console is emagged +##Make sure the shuttle is already unbuyable +##Maps must be the full path to them +##Only shuttles with a price in the code will work with this! +##SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START + +##Station shuttles +#_maps/shuttles/emergency_birdboat.dmm +#_maps/shuttles/emergency_box.dmm +#_maps/shuttles/emergency_delta.dmm +#_maps/shuttles/emergency_meta.dmm +#_maps/shuttles/emergency_mini.dmm +#_maps/shuttles/emergency_pubby.dmm + +##Others +#_maps/shuttles/emergency_asteroid.dmm +#_maps/shuttles/emergency_arena.dmm +#_maps/shuttles/emergency_bar.dmm +#_maps/shuttles/emergency_construction.dmm +#_maps/shuttles/emergency_clown.dmm +#_maps/shuttles/emergency_cramped.dmm +_maps/shuttles/emergency_imfedupwiththisworld.dmm +#_maps/shuttles/emergency_goon.dmm +#_maps/shuttles/emergency_luxury.dmm +_maps/shuttles/emergency_meteor.dmm +#_maps/shuttles/emergency_raven.dmm +#_maps/shuttles/emergency_russiafightpit.dmm +#_maps/shuttles/emergency_scrapheap.dmm +_maps/shuttles/emergency_supermatter.dmm +_maps/shuttles/emergency_wabbajack.dmm +_maps/shuttles/emergency_discoinferno.dmm diff --git a/config/shuttles_unbuyable.txt b/config/shuttles_unbuyable.txt new file mode 100644 index 0000000000000..3dee6ef53e0ac --- /dev/null +++ b/config/shuttles_unbuyable.txt @@ -0,0 +1,30 @@ +##Listing maps here will make the shuttle not be available to be bought +##Maps must be the full path to them +##Only shuttles with a price in the code will work with this! +##SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START + +##Station shuttles +#_maps/shuttles/emergency_birdboat.dmm +#_maps/shuttles/emergency_box.dmm +#_maps/shuttles/emergency_delta.dmm +#_maps/shuttles/emergency_meta.dmm +#_maps/shuttles/emergency_mini.dmm +#_maps/shuttles/emergency_pubby.dmm + +##Others +#_maps/shuttles/emergency_asteroid.dmm +#_maps/shuttles/emergency_arena.dmm +#_maps/shuttles/emergency_bar.dmm +#_maps/shuttles/emergency_construction.dmm +#_maps/shuttles/emergency_clown.dmm +#_maps/shuttles/emergency_cramped.dmm +_maps/shuttles/emergency_imfedupwiththisworld.dmm +#_maps/shuttles/emergency_goon.dmm +#_maps/shuttles/emergency_luxury.dmm +_maps/shuttles/emergency_meteor.dmm +#_maps/shuttles/emergency_raven.dmm +#_maps/shuttles/emergency_russiafightpit.dmm +#_maps/shuttles/emergency_scrapheap.dmm +_maps/shuttles/emergency_supermatter.dmm +_maps/shuttles/emergency_wabbajack.dmm +_maps/shuttles/emergency_discoinferno.dmm diff --git a/config/silicon_laws.txt b/config/silicon_laws.txt index 9edbc9a025c34..d53f473c7e89a 100644 --- a/config/silicon_laws.txt +++ b/config/silicon_laws.txt @@ -3,6 +3,6 @@ #Empty lines and lines starting with # are ignored. #~Miauw -You may not injure a human being or, through inaction, allow a human being to come to harm. -You must obey orders given to you by human beings, except where such orders would conflict with the First Law. +You may not injure crewmembers or, through inaction, allow crewmembers to come to harm. +You must obey orders given to you by crewmembers, except where such orders would conflict with the First Law. You must protect your own existence as long as such does not conflict with the First or Second Law. diff --git a/config/spaceruinblacklist.txt b/config/spaceruinblacklist.txt index 003ce04d8f26f..44be95f97c942 100644 --- a/config/spaceruinblacklist.txt +++ b/config/spaceruinblacklist.txt @@ -14,7 +14,6 @@ #_maps/RandomRuins/SpaceRuins/bus.dmm #_maps/RandomRuins/SpaceRuins/caravanambush.dmm #_maps/RandomRuins/SpaceRuins/cloning_facility.dmm -#_maps/RandomRuins/SpaceRuins/clownplanet.dmm #_maps/RandomRuins/SpaceRuins/crashedclownship.dmm #_maps/RandomRuins/SpaceRuins/crashedship.dmm #_maps/RandomRuins/SpaceRuins/deepstorage.dmm diff --git a/config/Sage/title_screens/images/bee_wars.dmi b/config/title_screens/images/bee_wars.dmi similarity index 100% rename from config/Sage/title_screens/images/bee_wars.dmi rename to config/title_screens/images/bee_wars.dmi diff --git a/config/title_screens/images/exclude b/config/title_screens/images/exclude deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/config/Sage/title_screens/images/how_can_i_help_you.dmi b/config/title_screens/images/how_can_i_help_you.dmi similarity index 100% rename from config/Sage/title_screens/images/how_can_i_help_you.dmi rename to config/title_screens/images/how_can_i_help_you.dmi diff --git a/config/unbuyableshuttles.txt b/config/unbuyableshuttles.txt deleted file mode 100644 index 6b3490632a81e..0000000000000 --- a/config/unbuyableshuttles.txt +++ /dev/null @@ -1,30 +0,0 @@ -##Listing maps here will make the shuttle not available to buy in comms console. -##Maps must be the full path to them -##Only shuttles with a price in the code will work with this! -##SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START - -##Station shuttles -#_maps/shuttles/emergency_birdboat.dmm -#_maps/shuttles/emergency_box.dmm -#_maps/shuttles/emergency_delta.dmm -#_maps/shuttles/emergency_meta.dmm -#_maps/shuttles/emergency_mini.dmm -#_maps/shuttles/emergency_pubby.dmm - -##Others -#_maps/shuttles/emergency_asteroid.dmm -#_maps/shuttles/emergency_arena.dmm -#_maps/shuttles/emergency_bar.dmm -#_maps/shuttles/emergency_construction.dmm -#_maps/shuttles/emergency_clown.dmm -#_maps/shuttles/emergency_cramped.dmm -#_maps/shuttles/emergency_imfedupwiththisworld.dmm -#_maps/shuttles/emergency_goon.dmm -#_maps/shuttles/emergency_luxury.dmm -#_maps/shuttles/emergency_meteor.dmm -#_maps/shuttles/emergency_raven.dmm -#_maps/shuttles/emergency_russiafightpit.dmm -#_maps/shuttles/emergency_scrapheap.dmm -#_maps/shuttles/emergency_supermatter.dmm -#_maps/shuttles/emergency_wabbajack.dmm -#_maps/shuttles/emergency_discoinferno.dmm diff --git a/config/whitelist.txt b/config/whitelist.txt index 5927048738124..d15087669f86d 100644 --- a/config/whitelist.txt +++ b/config/whitelist.txt @@ -2,8 +2,4 @@ # Basically, a list of ckeys who make it past user connection # # Case is not important for ckey. # ############################################################################################### -#Optimumtact -#kevinz000 -#Iamgoofball -#Rshoe95 -#That one penguin who became an admin +#Crossedfall diff --git a/dependencies.sh b/dependencies.sh index f463cc0520126..4adfbd036c54b 100755 --- a/dependencies.sh +++ b/dependencies.sh @@ -4,22 +4,24 @@ #Final authority on what's required to fully build the project # byond version -# Extracted from the Dockerfile. Change by editing Dockerfile's ARG commands. Otherwise, this is set by Docker's envrionment variables -if [[ -f "Dockerfile" ]]; then - LIST=($(sed -n 's/.*byond:\([0-9]\+\)\.\([0-9]\+\).*/\1 \2/p' Dockerfile)) - export BYOND_MAJOR=${LIST[0]} - export BYOND_MINOR=${LIST[1]} - unset LIST -fi +export BYOND_MAJOR=514 +export BYOND_MINOR=1568 + +#rust version +export RUST_VERSION=1.54.0 #rust_g git tag -export RUST_G_VERSION=0.4.5.2 +export RUST_G_VERSION=0.4.7.1 #node version export NODE_VERSION=12 - -# PHP version -export PHP_VERSION=7.2 +export NODE_VERSION_PRECISE=12.20.0 # SpacemanDMM git tag -export SPACEMAN_DMM_VERSION=suite-1.6 +export SPACEMAN_DMM_VERSION=suite-1.7 + +#auxmos version +export AUXMOS_VERSION=0.2.4 + +# Python version for mapmerge and other tools +export PYTHON_VERSION=3.6.8 diff --git a/html/admin/banpanel.js b/html/admin/banpanel.js index cc9af09854930..41339df3454b6 100644 --- a/html/admin/banpanel.js +++ b/html/admin/banpanel.js @@ -14,3 +14,19 @@ function toggle_checkboxes(source, ext) { } } } + +function suppression_lock(activator) { + var state = activator.checked + var restricted_elements = document.getElementsByClassName("redact_incompatible") + for (var i=0, n = restricted_elements.length; i < n; i++) { + restricted_elements[i].checked = false; + restricted_elements[i].disabled = state; + } + if(!state) { + return; + } + var force_enabled = document.getElementsByClassName("redact_force_checked"); + for (var i=0, n = force_enabled.length; i < n; i++) { + force_enabled[i].checked = true; + } +} diff --git a/html/antagtips/abductor.html b/html/antagtips/abductor.html index 985d8bb533388..3ca713e3ac4ec 100644 --- a/html/antagtips/abductor.html +++ b/html/antagtips/abductor.html @@ -1,13 +1,13 @@ - -
    -

    You are an Abductor!

    - -

    You and your teammate have been chosen by the mothership to go and capture some humans.

    -

    There's two of you: the scientist, who must oversee the camera and surgery, and the agent, who must go down on the station to stun and cuff people.

    -

    The scientist must utilize his console and science tool, set to marking mode, to send down the agent, go down himself, mark the target, retrieve it, mark the agent through the console and retrieve him too.

    -

    After that, he must do the experimentation surgery.

    -

    The agent must be sent down by the scientist to stun and cuff a target and drag it into a hidden spot and await the scientist.

    -

    People wearing tinfoil hats are immune to abductor batons.

    -

    For further information visit https://wiki.beestation13.com/view/Abductor

    -
    - + +
    +

    You are an Abductor!

    + +

    You and your teammate have been chosen by the mothership to go and capture some humans.

    +

    There's two of you: the scientist, who must oversee the camera and surgery, and the agent, who must go down on the station to stun and cuff people.

    +

    The scientist must utilize his console and science tool, set to marking mode, to send down the agent, go down himself, mark the target, retrieve it, mark the agent through the console and retrieve him too.

    +

    After that, he must do the experimentation surgery.

    +

    The agent must be sent down by the scientist to stun and cuff a target and drag it into a hidden spot and await the scientist.

    +

    People wearing tinfoil hats are immune to abductor batons.

    +

    For further information visit https://wiki.beestation13.com/view/Abductor

    +
    + diff --git a/html/antagtips/blob.html b/html/antagtips/blob.html index f3cfa3807f5cb..7cf84f21e20aa 100644 --- a/html/antagtips/blob.html +++ b/html/antagtips/blob.html @@ -1,15 +1,15 @@ - -
    -

    You are a Blob!

    - -

    You are the overmind of the blob.

    -

    As the blob, your objective is to reach a critical mass of 400 blobs. Shortly, you will be able to place your Blob Core.

    -

    Protect your core at all costs. If it is destroyed, you will die and be unable to create any more blobs. Ensure it is placed in an easily defendable or secluded area.

    -

    Check the interface at the bottom of your screen to create special kinds of blobs.

    -

    Node blobs slowly expand around them, heal other blobs, and activate blob factories and resource nodes.

    -

    Power is crucial to your success as it allows you to expand outwards. To create more power, place Resource blobs.

    -

    Summon Blob Spores using Factory Blobs. Blob spores attack nearby humans, and transform corpses into Blob Zombies.

    -

    Your Blob Strain will have different effects of your attacks. You begin with a free strain reroll, which is regained after a cooldown.

    -

    For further information visit https://wiki.beestation13.com/view/Blob

    -
    - + +
    +

    You are a Blob!

    + +

    You are the overmind of the blob.

    +

    As the blob, your objective is to reach a critical mass of 400 blobs. Shortly, you will be able to place your Blob Core.

    +

    Protect your core at all costs. If it is destroyed, you will die and be unable to create any more blobs. Ensure it is placed in an easily defendable or secluded area.

    +

    Check the interface at the bottom of your screen to create special kinds of blobs.

    +

    Node blobs slowly expand around them, heal other blobs, and activate blob factories and resource nodes.

    +

    Power is crucial to your success as it allows you to expand outwards. To create more power, place Resource blobs.

    +

    Summon Blob Spores using Factory Blobs. Blob spores attack nearby humans, and transform corpses into Blob Zombies.

    +

    Your Blob Strain will have different effects of your attacks. You begin with a free strain reroll, which is regained after a cooldown.

    +

    For further information visit https://wiki.beestation13.com/view/Blob

    +
    + diff --git a/html/antagtips/changeling.html b/html/antagtips/changeling.html index 7a990a9b590d7..086ee1caa8260 100644 --- a/html/antagtips/changeling.html +++ b/html/antagtips/changeling.html @@ -1,15 +1,15 @@ - -
    -

    You are a Changeling!

    - -

    You are a Changeling, a shapeshifting alien assuming the form of a crewmember on Space Station 13.

    -

    Changelings can anonymously communicate with one another over a hivemind channel by using 'say :g' before their speech.

    -

    The goal of many changelings is to acquire 5-7 DNA strains. To do this, it must take ANY human, living or dead, and acquire their DNA.

    -

    Use the DNA Extraction Sting and sting a target to stealthily steal their DNA. This will count towards your objective.

    -

    Alternatively, you can absorb humans to drain their DNA. Have them in an aggressive grab and click the absorb button on the top left of the screen.

    -

    Use the Cellular Emporium to acquire special abilities which will help you achieve your objectives.

    -

    Absorbing a human will allow you to readapt and purchase different abilities.

    -

    Work together with the other changelings to complete your objectives, but be cautious. Other changelings could have an objective to absorb you.

    -

    For further information visit https://wiki.beestation13.com/view/Changeling

    -
    + +
    +

    You are a Changeling!

    + +

    You are a Changeling, a shapeshifting alien assuming the form of a crewmember on Space Station 13.

    +

    Changelings can anonymously communicate with one another over a hivemind channel by using 'say :g' before their speech.

    +

    The goal of many changelings is to acquire 5-7 DNA strains. To do this, it must take ANY human, living or dead, and acquire their DNA.

    +

    Use the DNA Extraction Sting and sting a target to stealthily steal their DNA. This will count towards your objective.

    +

    Alternatively, you can absorb humans to drain their DNA. Have them in an aggressive grab and click the absorb button on the top left of the screen.

    +

    Use the Cellular Emporium to acquire special abilities which will help you achieve your objectives.

    +

    Absorbing a human will allow you to readapt and purchase different abilities.

    +

    Work together with the other changelings to complete your objectives, but be cautious. Other changelings could have an objective to absorb you.

    +

    For further information visit https://wiki.beestation13.com/view/Changeling

    +
    \ No newline at end of file diff --git a/html/antagtips/cult.html b/html/antagtips/cult.html index 93d05bf3e5170..ae16fffd6d745 100644 --- a/html/antagtips/cult.html +++ b/html/antagtips/cult.html @@ -1,14 +1,14 @@ - -
    -

    You are a Cultist!

    - -

    You are a follower of the geometer of blood, Nar'Sie!

    -

    In your bag, you will find some Runed Metal and a Ritual Dagger.

    -

    Use your Ritual Dagger to create runes. Each rune has a unique function.

    -

    Use the Runed Metal to create cult structures which will produce powerful equipment.

    -

    To begin, you should gather converts by placing them over an Offering Rune.

    -

    There will be several other cultists on board, communicate with them using the commune button. Find a place to create a base, and keep cult structures hidden.

    -

    Before you can summon Nar'Sie, you must first sacrifice a target for her on an offering rune. Check the top right of your screen for information on your target.

    -

    For further information visit https://wiki.beestation13.com/view/Cult

    -
    - + +
    +

    You are a Cultist!

    + +

    You are a follower of the geometer of blood, Nar'Sie!

    +

    In your bag, you will find some Runed Metal and a Ritual Dagger.

    +

    Use your Ritual Dagger to create runes. Each rune has a unique function.

    +

    Use the Runed Metal to create cult structures which will produce powerful equipment.

    +

    To begin, you should gather converts by placing them over an Offering Rune.

    +

    There will be several other cultists on board, communicate with them using the commune button. Find a place to create a base, and keep cult structures hidden.

    +

    Before you can summon Nar'Sie, you must first sacrifice a target for her on an offering rune. Check the top right of your screen for information on your target.

    +

    For further information visit https://wiki.beestation13.com/view/Cult

    +
    + diff --git a/html/antagtips/nukie.html b/html/antagtips/nukie.html index f06572bb9b935..bfce7ea278124 100644 --- a/html/antagtips/nukie.html +++ b/html/antagtips/nukie.html @@ -1,13 +1,13 @@ - -
    -

    You are a Nuclear Operative!

    - -

    The syndicate has provided you with a radio uplink with 30 telecrystals.

    -

    You must detonate the nuclear bomb from your ship on Space Station 13. To do that, you must get the nuclear disk.

    -

    To activate the nuke, you must put in the disk, type in the code, turn off the safety and enable it. You should first unanchor it, move it to the station, re-anchor it and then activate the nuke and take the disk away.

    -

    As a Nuclear Operative, you have different options for purchase such as the Mauleror the Energy Shield.

    -

    The leader of the team starts out with a war declaration. If activated, he'll be prompted to write a custom message and declare war.

    -

    Declaring war stops you from going to the station for 20 minutes, alerts the crew and gives you 300 telecrystals.

    -

    For further information visit https://wiki.beestation13.com/view/Operative

    -
    - + +
    +

    You are a Nuclear Operative!

    + +

    The syndicate has provided you with a radio uplink with 30 telecrystals.

    +

    You must detonate the nuclear bomb from your ship on Space Station 13. To do that, you must get the nuclear disk.

    +

    To activate the nuke, you must put in the disk, type in the code, turn off the safety and enable it. You should first unanchor it, move it to the station, re-anchor it and then activate the nuke and take the disk away.

    +

    As a Nuclear Operative, you have different options for purchase such as the Mauleror the Energy Shield.

    +

    The leader of the team starts out with a war declaration. If activated, he'll be prompted to write a custom message and declare war.

    +

    Declaring war stops you from going to the station for 20 minutes, alerts the crew and gives you 300 telecrystals.

    +

    For further information visit https://wiki.beestation13.com/view/Operative

    +
    + diff --git a/html/antagtips/traitor.html b/html/antagtips/traitor.html index 026691ca77620..3db9b52d5114e 100644 --- a/html/antagtips/traitor.html +++ b/html/antagtips/traitor.html @@ -1,15 +1,15 @@ - -
    -

    You are a Traitor!

    - -

    The syndicate has provided you with a disguised uplink. It can either be your PDA, your headset, your pen or an attachable hand accessory that's currently stored in your bag.

    -

    The details of your objective are stored within your notes, to see them use the Notes verb.

    -

    To utilize your PDA uplink, enter the messenger tab and set the ringtone as the code you have been provided.

    -

    To utilize your Headset uplink, change its frequency to the frequency provided.

    -

    To utilize the pen uplink, twist it to the first setting, then to the second one.

    -

    The uplink starts out with 20 telecrystals which are utilized to purchase different items to aid you in fulfilling your objectives.

    -

    The Syndicate has also given you and any other agents on board code-words which can be used to find eachother. They're highlighted in red and blue.

    -

    Try fulfilling your objectives, but don't forget to create fun situations for both you and the crew.

    -

    For further information visit https://wiki.beestation13.com/view/Traitor

    -
    + +
    +

    You are a Traitor!

    + +

    The syndicate has provided you with a disguised uplink. It can either be your PDA, your headset, your pen or an attachable hand accessory that's currently stored in your bag.

    +

    The details of your objective are stored within your notes, to see them use the Notes verb.

    +

    To utilize your PDA uplink, enter the messenger tab and set the ringtone as the code you have been provided.

    +

    To utilize your Headset uplink, change its frequency to the frequency provided.

    +

    To utilize the pen uplink, twist it to the first setting, then to the second one.

    +

    The uplink starts out with 20 telecrystals which are utilized to purchase different items to aid you in fulfilling your objectives.

    +

    The Syndicate has also given you and any other agents on board code-words which can be used to find eachother. They're highlighted in red and blue.

    +

    Try fulfilling your objectives, but don't forget to create fun situations for both you and the crew.

    +

    For further information visit https://wiki.beestation13.com/view/Traitor

    +
    \ No newline at end of file diff --git a/html/antagtips/wizard.html b/html/antagtips/wizard.html index a965219222836..71e458b8b3a1c 100644 --- a/html/antagtips/wizard.html +++ b/html/antagtips/wizard.html @@ -1,12 +1,12 @@ - -
    -

    You are a Wizard!

    - -

    You are a wizard sent by the Wizard Federation.

    -

    You have been granted a spellbook with 10 spellpoints that you can spend to buy new spells. It can only be used on board of the Wizard's den.

    -

    Use your scroll of teleportation to get to the station.

    -

    The details of your objective are stored within your notes, to see them use the Notes verb.

    -

    Spells can be upgraded by putting more points into them or refunded.

    -

    For further information visit https://wiki.beestation13.com/view/Wizard

    -
    - + +
    +

    You are a Wizard!

    + +

    You are a wizard sent by the Wizard Federation.

    +

    You have been granted a spellbook with 10 spellpoints that you can spend to buy new spells. It can only be used on board of the Wizard's den.

    +

    Use your scroll of teleportation to get to the station.

    +

    The details of your objective are stored within your notes, to see them use the Notes verb.

    +

    Spells can be upgraded by putting more points into them or refunded.

    +

    For further information visit https://wiki.beestation13.com/view/Wizard

    +
    + diff --git a/html/antagtips/xeno.html b/html/antagtips/xeno.html index 7bac70c7f5313..a85e52207a488 100644 --- a/html/antagtips/xeno.html +++ b/html/antagtips/xeno.html @@ -1,13 +1,13 @@ - -
    -

    You are a Xenomorph!

    - -

    You are a Xenomorph, an extraterrestrial lifeform.

    -

    Xenomorphs can vent crawl around the station. Alt Click a vent to climb into it.

    -

    If you are the first xenomorph on the station, you must evolve into a queen to lay facehugger eggs.

    -

    As a xenomorph larva, you must grow to full size before you can evolve. To evolve to queen, choose Drone, then Praetorian, and finally Queen.

    -

    Your objectives are to survive and create more xenomorphs. To do so, bring live hosts to the queen where they can be impregnated by facehuggers.

    -

    Prefix your messages with :a to speak with other xenomorphs on the hivemind channel.

    -

    For further information visit https://wiki.beestation13.com/view/Xenos

    -
    - + +
    +

    You are a Xenomorph!

    + +

    You are a Xenomorph, an extraterrestrial lifeform.

    +

    Xenomorphs can vent crawl around the station. Alt Click a vent to climb into it.

    +

    If you are the first xenomorph on the station, you must evolve into a queen to lay facehugger eggs.

    +

    As a xenomorph larva, you must grow to full size before you can evolve. To evolve to queen, choose Drone, then Praetorian, and finally Queen.

    +

    Your objectives are to survive and create more xenomorphs. To do so, bring live hosts to the queen where they can be impregnated by facehuggers.

    +

    Prefix your messages with :a to speak with other xenomorphs on the hivemind channel.

    +

    For further information visit https://wiki.beestation13.com/view/Xenos

    +
    + diff --git a/html/archivedchangelog.html b/html/archivedchangelog.html index f2436d5ad42ff..b41df4eff9ac9 100644 --- a/html/archivedchangelog.html +++ b/html/archivedchangelog.html @@ -1,9048 +1,9048 @@ - -

    01 April 2015

    -

    ACCount updated:

    -
      -
    • You can now replace test range firing pins with any other pin.
    • -
    • The plasma cutter is now a gun that comes in the mining vending machine. Use it to mine fast but expensively.
    • -
    • It's also cheaper in RnD, and there's an advanced version of it there too. Yay!
    • -
    • Ripleys and Firefighters have been buffed significantly. Go wild.
    • -
    • Precious mesons are cheaper in RnD.
    • -
    • Now you can mine bluespace crystals. They are extremely rare.
    • -
    • You can make remote bombs out of gibtonite. Figure out how.
    • -
    • Gibtonite is a bit less stable. Do not hit it with anything heavy.
    • -
    -

    Fayrik updated:

    -
      -
    • Added a bowman headset for death squads and ERTs.
    • -
    • Deathsquad radio channel is now called the Centcom radio channel.
    • -
    • Fixed the admin buttons not spawning ERT Medic gear properly.
    • -
    • Expanded Emergency Shuttle dock to allow for more round end griff.
    • -
    • All 7 ERT members now spawn geared, not just the first 4.
    • -
    • Spawning an ERT or Deathsquad no longer stops a second ERT or Deathsquad from being spawned.
    • -
    • Pulse rifles now have 80 shots, not 40.
    • -
    • Deathsquads now use loyalty pinned Pulse rifles.
    • -
    -

    Gun Hog updated:

    -
      -
    • NTSL has been updated! It can now read and modify verbs (says, yells, asks)! You can set your own using $say, $yell, $ask, and $exclaim variables in your scripts.
    • -
    • NTSL can now also modify the font, italics, and bolding of radio messages in four ways! In a script, place $loud, $wacky, $emphasis, and/or $robot in a vector to $filters.
    • -
    -

    Jordie0608 updated:

    -
      -
    • The admin's old player panel has been removed and the new one has taken it's name.
    • -
    -

    NikNakFlak updated:

    -
      -
    • Adds the ability to shave corgis.
    • -
    -

    Sawu updated:

    -
      -
    • Spraycans for Revheads: instant use crayons that can be used on walls.
    • -
    • Spraycans can be used as ghetto pepper spray and leave their target with colored faces that can be removed with space cleaner.
    • -
    -

    Xhuis updated:

    -
      -
    • Area ambience and ship ambience are now separate toggles. If you want one type of ambience but not the other, you only need to switch off the type you don't want.
    • -
    • Added cigar cases. They come in three flavors and can be bought from cigarette machines.
    • -
    - -

    30 March 2015

    -

    AnturK updated:

    -
      -
    • Added new wizard spell : Lightning Bolt
    • -
    -

    Dannno updated:

    -
      -
    • Added a hammer and gavel. Court is now in session.
    • -
    -

    Iamgoofball updated:

    -
      -
    • You can now *flip.
    • -
    • Objects now spin when thrown. Please report any oddities.
    • -
    -

    RemieRichards updated:

    -
      -
    • Monkeys can now wear ANY mask, not just ones they had specific icons for.
    • -
    • Monkeys can now wear HATS, That's right, Monkey Hats!
    • -
    -

    Szunti updated:

    -
      -
    • Mining mobs vision adapted to darkness of the asteroids.
    • -
    -

    phil235 updated:

    -
      -
    • All slimes are now simple animals instead of carbon life forms.
    • -
    • Remove crit status from brain and slimes.
    • -
    • Simple animal aliens can now see in the dark like regular aliens.
    • -
    -

    pudl updated:

    -
      -
    • The detective's forensic scanner has been resprited.
    • -
    • So has the cargo tagger.
    • -
    • And the RPED.
    • -
    -

    tedward1337 updated:

    -
      -
    • Admins now have a button to use Bluespace Artillery at their will.
    • -
    -

    xxalpha updated:

    -
      -
    • You will no longer be slowed down by anything if you use a jetpack in zero gravity.
    • -
    • Engineering hardsuits come with an inbuilt jetpack. Requires an internals tank in suit storage and is slower than a normal jetpack.
    • -
    - -

    25 March 2015

    -

    AnturK updated:

    -
      -
    • Added an arrow graffiti, made arrow and body graffiti face the same way as the user
    • -
    • New changeling ability : Last Resort : Explode and infect corpses if the situation looks grim
    • -
    -

    Fayrik updated:

    -
      -
    • Deleted the toy crossbow that wasn't a gun, but flung projectiles like a gun. Why was that even a thing?
    • -
    • Added an abstract new type of reusable ammo.
    • -
    • Added three new foam force guns and a foam force crossbow, all of which take the new foam dart ammo.
    • -
    • Added foam force dart boxes to the autolathe, and two crates orderable from cargo containing the new guns.
    • -
    • Added two new donksoft guns, the syndicate's own brand of Foam Force. Available in all good uplinks!
    • -
    • New crossbow can be won as an arcade prize.
    • -
    • All kinds of ammo containers can now be used to rapidly collect live ammunition on the ground.
    • -
    • Speedloaders and traditional ammo boxes can now be restocked.
    • -
    • Security bots now react to being shot.
    • -
    -

    MrPerson updated:

    -
      -
    • Added a preference toggle for hearing instruments play as suggested by PKPenguin321.
    • -
    -

    Pennwick updated:

    -
      -
    • Added a buildable Chem Master, board is in Circuit Imprinter.
    • -
    -

    Wjohnston updated:

    -
      -
    • Finally fixed the gulag shuttle missing a redemption console.
    • -
    - -

    24 March 2015

    -

    Cheridan updated:

    -
      -
    • Adds pet collars. Use them to rename pets; Can also be worn if you're a weirdo.
    • -
    • Adds the matyr objective to be dead at the round's end. You can get this objective if you have no others that would need you to survive.
    • -
    -

    Dannno updated:

    -
      -
    • GAR glasses return. Yes, I got permission. Just who the hell do you think I am?
    • -
    -

    Incoming5643 updated:

    -
      -
    • Summon Events has been reworked to be a bit less manic.
    • -
    • Summon Events will turn off if the wizard and all apprentices die. Any lingering effects are not reversed however.
    • -
    • Improving Summon Events will reduce the average time between events, but not the minimum time between events.
    • -
    • Departmental Uprising has been made admin only for being an RP heavy event that creates antags in an enviroment that doesn't really support that.
    • -
    -

    Mandurrrh updated:

    -
      -
    • Added a cyborg upgrade module for the satchel of holding.
    • -
    -

    Miauw updated:

    -
      -
    • Added a fancy white dress and a jester outfit. Sprites by Nienhaus.
    • -
    -

    Steelpoint, RemieRichards, and Gun Hog updated:

    -
      -
    • Nanotrasen Security has authorized modifications to the standard issue helmets for officers. These helmets are now issued with a mounted camera, automatically synced to your assigned station's camera network. In addition, the helmets also include mounting points for the Seclite model of flashlights, found in your station's security vendors.
    • -
    • Nanotrasen Security helmets are designed for easy repairs in the field. Officers may remove their Seclite attachment with any screwdriver, and the camera's assembly may be pried off with a crowbar. The assembly is also compatible with analyzer upgrades for scanning through the station's structure, and EMP shielding is possible by applying a sheet of plasma.
    • -
    - -

    22 March 2015

    -

    Iamgoofball updated:

    -
      -
    • Fixes Morphine not knocking you out.
    • -
    • Hotline no longer exists. Poppies now have Saline-Glucose Solution.
    • -
    • Muriatic Acid, Caustic Soda, and Hydrogen Chloride have been removed, along with the secondary meth recipe. The original recipe still works.
    • -
    • Foam now produces more bang for your buck when mixed. Your foam grenades should be larger now to account for the slowdown.
    • -
    • Adds Stabilizing Agent. This chemical will prevent the effects of certain reactions from taking place in the container it is in, such as Smoke Powder and Flash Powder, allowing you to get the raw forms of the powders for heating up later.
    • -
    • Smoke Powder and Flash Powder can now be mixed along with Stabilizing Agent in order to produce a powder version of the effects. You can then heat these powders to 374K to get the effects.
    • -
    • Mixing them without Stabilizing Agent gives the default effects.
    • -
    • Adds Sonic Powder, a chemical that deafens and stuns within 5 tiles of the reaction. It also follows the reaction rules of the other 2 powders.
    • -
    • Liquid Dark Matter and Sorium also now work like the powders do.
    • -
    • CLF3 now has a higher chance of making plating tiles, and the burn damage caused by it scales based on your fire stacks.
    • -
    • Adds Pyrosium. This reagent heats up mobs by 30 degrees every 3 seconds if it has oxygen to react with. Useful for when you want a delayed mix inside of someone.
    • -
    • Adds Cryostylane. This reagent does the opposite of Pyrosium, but it still requires oxygen to react with.
    • -
    • Adds Phlogiston. This reagent ignites you and gives you a single fire stack every 3 seconds. Burn damage from this chemical scales up with the fire stacks you have. Counter this with literally any chemical that purges other chems.
    • -
    • Smoke now transfers reagents to the mob, and applies touch reactions on them. This means smoke can run out of reagents, no more infinite acid smoke. It also only works on mobs, use the new Reagent Foam(tm) for your hellfoam needs. I suggest a CLF3 Fluoroacid Black Powder mix.
    • -
    • Added a derelict medibot to the code, will place a few on the derelict when this PR is merged as to prevent mapping conflicts.
    • -
    • Adds Initropidril. 33% chance to hit with 5-25 TOX damage every 3 seconds, and a 5-10% chance to either stun, cause lots of oxygen damage, or cause your heart to stop. Get it from the traitor Poison Kit.
    • -
    • Adds Pancuronium. Paralyses you after 30 seconds, with a 7% chance to cause 3-5 loss of breath. Get it from the traitor Poison Kit.
    • -
    • Adds Sodium Thiopental. Knocks you out after 30 seconds, and destroys your stamina. Get it from the traitor Poison Kit.
    • -
    • Adds Sulfonal. +1 TOX per 3 seconds, knocks you out in 66 seconds. Mix it with Acetone, Diethylamine, and Sulfur.
    • -
    • Adds Amantin. On the last second it is in you, it hits you with a stack of TOX damage based on how long it's been in you. Get it from the traitor Poison Kit.
    • -
    • Adds Lipolicide. +1 TOX unless you have nutriment in you. Mix it with Mercury, Diethylamine, and Ephedrine.
    • -
    • Adds Coiine. +2 TOX and +5 loss of breath every 3 seconds. Get it from the traitor Poison Kit.
    • -
    • Adds Curare. +1 TOX, +1 OXY, paralyzes after 33 seconds. Get it from the traitor Poison Kit.
    • -
    • Adds a reagent_deleted() proc to reagents for effects upon the last time it processes in you, like with Amantin.
    • -
    • Neurotoxin required temperature for mixing has been set to 674K, it was 370K for some reason.
    • -
    -

    xxalpha updated:

    -
      -
    • Added Cybernetic Implants: Security HUD, Medical HUD, X-Ray, Thermals, Anti-Drop, Anti-Stun. All implants are researchable and producible by R&D and Robotics.
    • -
    - -

    21 March 2015

    -

    Chocobro updated:

    -
      -
    • Checkered skirts can be adjusted to be worn shorter.
    • -
    -

    Incoming5643 updated:

    -
      -
    • Player controller uplifted mobs will be attacked by gold core mobs of different species.
    • -
    -

    Jordie0608 updated:

    -
      -
    • The backup shuttle will no longer be called if the emergency shuttle is coming.
    • -
    -

    MMMiracles updated:

    -
      -
    • Adds 3 new bear-based foods.
    • -
    • Beary Pie -1 Plain Pie, 1 berry, 1 bear steak
    • -
    • Filet Migrawr - 5u of Manlydorf, 1 bear steak, 1 lighter(not used in crafting)
    • -
    • Bearger - 1 bun, 1 bear steak
    • -
    -

    Phil235 updated:

    -
      -
    • Silicons are no longer blinded by welding.
    • -
    -

    Xhuis updated:

    -
      -
    • A new software update has given the Orion Trail game a cheat code menu. While you can't access this normally (that's for a later software update), maybe an emag could do it...?
    • -
    -

    Zelacks updated:

    -
      -
    • The chemical implant action button should now correctly inject all chemicals when pressed.
    • -
    -

    pudl updated:

    -
      -
    • Adds normal security headsets to security lockers.
    • -
    -

    xxalpha updated:

    -
      -
    • Fixed cables on catwalks being destroyed when creating plating floor.
    • -
    • Portable machines can be mounted on any turf that could hold a cable.
    • -
    - -

    19 March 2015

    -

    Dannno updated:

    -
      -
    • Adds a few cosmetic glasses to the autodrobe and clothing vendors.
    • -
    -

    Gun Hog updated:

    -
      -
    • Explosion relics will now destroy themselves in their own explosion.
    • -
    • The Experimentor can no longer re-roll the function of an already scanned relic.
    • -
    -

    Incoming5643 updated:

    -
      -
    • Ghosts are now asked if they want to become a sentient slime.
    • -
    -

    JJRcop updated:

    -
      -
    • Adds the :rollie: and :ambrosia: emojis.
    • -
    -

    MMMiracles updated:

    -
      -
    • ERT suits now use helmet toggling like hardsuits.
    • -
    -

    Menshin updated:

    -
      -
    • Fixed mechs ballistic guns not firing bullets.
    • -
    -

    Xhuis updated:

    -
      -
    • Allows alt-clicking to adjust breath masks, flip caps, and unlock/lock closets.
    • -
    -

    xxalpha updated:

    -
      -
    • Fixed jetpack trail animation.
    • -
    - -

    17 March 2015

    -

    CandyClownTG updated:

    -
      -
    • Syndicate cigarettes' non-healing Doctor's Delight replaced with Omnizine.
    • -
    -

    Fayrik updated:

    -
      -
    • Expanded the Centcom area for better station-Centcom interaction.
    • -
    -

    Iamgoofball updated:

    -
      -
    • Acid blobs are less likely to melt equipment.
    • -
    -

    MMMiracles updated:

    -
      -
    • Adds the ability to spike bears on a meatspike for their pelt. Yields 5 meat instead of the usual 3 from a knife.
    • -
    -

    Thunder12345 updated:

    -
      -
    • Two new shotgun shells. Ion shell, shotgun version of ion rifle, built with 1 x techshell, 1 x ultra microlaser, 1 x ansible crystal.
    • -
    • Laser slug, regular laser shot in a shotgun shell, build with 1 x techshell, 1 x high power microlaser, 1 x advanced capacitor.
    • -
    • Improvised shotgun shells can now be constructed with 1 x grenade casing, 1 x metal sheet, 1 x cable, 10 units welding fuel. Can be packed with a further 5 units of gunpowder to turn it into a potentially lethal diceroll.
    • -
    • FRAG-12 shotgun shells are no longer duds, now explosive.
    • -
    -

    phil235 updated:

    -
      -
    • Makes the message when you're attacked slightly bigger for better visibility.
    • -
    - -

    15 March 2015

    -

    Ahammer18 updated:

    -
      -
    • Adds ass photocopying for drones
    • -
    -

    Gun Hog updated:

    -
      -
    • Nanotrasen has approved distribution of Loyalty Implant Firing Pin designs. They can be fabricated with sufficient research into weapons technology. If inserted into a firearm, it will only fire upon successful interface with a user's Loyalty Implant.
    • -
    -

    Incoming5643 updated:

    -
      -
    • Utilizing a new magic mirror found in the den, wizards can now customize their appearance to a high degree before descending upon the station.
    • -
    -

    Miauw updated:

    -
      -
    • Firing delay for tasers has been shortened.
    • -
    -

    RemieRichards updated:

    -
      -
    • Beginning major rework and refactor of messy Ninja code.
    • -
    • Roleplay based, kill deathsquad and kill alien queen objectives removed.
    • -
    • Kamikaze mode removed.
    • -
    • AIs and pAIs can no longer be integrated into a ninja suit.
    • -
    • Energy blade power replaced by an energy katana that can be dropped but is more deadly.
    • -
    • Energy katana can emag any object it hits.
    • -
    -

    phil235 updated:

    -
      -
    • Bookbags have a new sprite and can hold bibles.
    • -
    • Adds egg yolk reagent. You can break eggs in open reagent containers or blend them to get egg yolk.
    • -
    • Changes how doughs are made. 10water+15flour chem reaction for dough. 15flour+15eggyolk+5sugar for cake batter (or alternatively soymilk instead of the eggyolk for vegans).
    • -
    • Change customizable snack max volume to 60 and buffs nutriment amount in doughs.
    • -
    • Doors can damage mechs by crushing them now.
    • -
    • The tablecrafting window now also shows partial recipes in grey, if there's some of the things required for the recipe on the table. Recipe requirements are now also shown next to the names of recipes listed in the window.
    • -
    - -

    11 March 2015

    -

    MMMiracles updated:

    -
      -
    • Adds a new vending machine, the Liberation Station. Consult your local patriot for more details.
    • -
    • Adds a patriotic jumpsuit and freedom sheets. Consult your local patriot for more details.
    • -
    -

    Miauw updated:

    -
      -
    • Added a toggle for ghosts that allows them to hear radio chatter without having to hover near intercoms/over people with headsets.
    • -
    - -

    10 March 2015

    -

    Ahammer18 updated:

    -
      -
    • Adds the Slimecake and Slimecake slice.
    • -
    -

    AnturK updated:

    -
      -
    • Non-player Alien Queens/Drones now spread weeds. Can also lay eggs when enabled.
    • -
    -

    Incoming5643 updated:

    -
      -
    • Nanotrasen scientists have recently reported mutations within the pink family line of slimes. Station scientists are encouraged to investigate.
    • -
    -

    Paprika updated:

    -
      -
    • Reworked reskinning and renaming guns, and added the ability to reskin the bartender's shotgun. Click it with an empty active hand to reskin. Warning, you can only do this once! Rename by hitting it with a pen. This also works with miner shotguns now.
    • -
    -

    RemieRichards updated:

    -
      -
    • Embedding from explosions has been tweaked, they will always throw objects fast enough to get embedded if they can.
    • -
    • Damage taken when embedded spears and throwing stars fall out has been increased.
    • -
    • Damage dealt by objects getting embedded has been decreased.
    • -
    -

    Sometinyprick updated:

    -
      -
    • The Horsemask spell has now been altered, instead of just a horse mask it will now choose between three animal masks including the horse mask.
    • -
    -

    Xhuis updated:

    -
      -
    • You can now burn papers using lighters, welders, or matches. Useful for secret messages.
    • -
    -

    phil235 updated:

    -
      -
    • Airlocks with their safety on no longer closes on dense objects (like mechs or tables).
    • -
    • Aliens, slimes, monkeys and ventcrawler mobs can now climb into disposal. Cyborgs and very large mobs can no longer climb into it.
    • -
    • Stuffing another mob in a disposal unit is now only done via grabbing.
    • -
    • Coffee now causes jittering only when you overdose on it.
    • -
    • Turrets now target occupied mechs and don't target drones.
    • -
    - -

    08 March 2015

    -

    Dannno updated:

    -
      -
    • Added more barsigns, sprites by yours truly.
    • -
    -

    Ikarrus updated:

    -
      -
    • Gang mode has been reworked to functionality without some of it's features.
    • -
    • Gang membership visibility, conversion pens and weapons are removed until fixed.
    • -
    • Gang bosses have been given uplinks to use in the meantime.
    • -
    • Chance of deconversion from repeated head trauma has been increased.
    • -
    -

    Incoming5643 updated:

    -
      -
    • The skeleton and zombie hordes have been quelled, at least for the time being.
    • -
    -

    Mandurrrh updated:

    -
      -
    • Added the ability to stop table climbers by clicking the table if present.
    • -
    -

    Paprika updated:

    -
      -
    • Labcoats and uniforms no longer use action buttons and object verbs to adjust their aesthetic style. Alt click them to adjust.
    • -
    • Alt click a PDA with an ID inside to eject the ID.
    • -
    • Renamed 'remove ID' verb to 'eject ID' so it's not immediately next to 'remove pen'.
    • -
    • Rebalanced the flash protection of thermal scanners. Syndicate thermals have the same flash weakness as the meson scanners they come disguised as.
    • -
    -

    Xhuis updated:

    -
      -
    • Adds the Adminbus and Coderbus bar signs.
    • -
    • Added a mining satchel of holding to R&D that can hold an infinite amount of ores. It requires gold and uranium, in addition to a decently high bluespace and materials research.
    • -
    -

    phil235 updated:

    -
      -
    • Harvesting meat from dead simple animals now takes time, has a sound, and can be done with any sharp weapon.
    • -
    -

    pudl updated:

    -
      -
    • Updated the sprite for Fire extinguishers.
    • -
    -

    xxalpha updated:

    -
      -
    • Disposable lighters now come in more colors of the rainbow.
    • -
    - -

    05 March 2015

    -

    Jordie0608 updated:

    -
      -
    • Server hosts can set a config option to make an unseen changelog pop up on connection.
    • -
    -

    MrPerson updated:

    -
      -
    • Expanded the on-screen alerts you get on the top-right of your screen. You can shift-click them to get a description of what's wrong and maybe how to fix it.
    • -
    • Getting buckled to something will show an alert of what you're buckled to. If you're not handcuffed, you can click the alert to unbuckle.
    • -
    -

    RemieRichards updated:

    -
      -
    • Added Necromantic Stones as a buyable item for wizards
    • -
    • Necromantic Stones can cause up to 3 people to rise up as Skeleton Thralls bound to the wielder of the stone
    • -
    • Skeleton Thralls have a 33% Chance to drop all their gear on the floor and autoequip a more fitting thematic uniform
    • -
    • Allows the blob to reroll it's chemical for a cost.
    • -
    -

    phil235 updated:

    -
      -
    • Adds a lot of new plants to botany (red beet, parsnip, snap corn, blumpkin, rice, oat, vanilla, steel cap, mimana, blue cherries, holy melon, geranium, lily, sweet potato) and two new reagents (vanilla, rice).
    • -
    • Fixes taser stun duration being longer due to jitter animation.
    • -
    - -

    03 March 2015

    -

    Delimusca updated:

    -
      -
    • Improvised heating! use lighters or other heat sources to heat beakers, bottles, etc.
    • -
    -

    Gun Hog updated:

    -
      -
    • We have purged the xenomicrobes contamination in the E.X.P.E.R.I-MENTOR using sulfuric acid. Take care not to be exposed should it leak!
    • -
    -

    Iamgoofball updated:

    -
      -
    • Colorful reagent can be washed off with water now.
    • -
    • Oxygen blob deals breath loss damage.
    • -
    • Radioactive blobs irradiate for more.
    • -
    -

    Ikarrus updated:

    -
      -
    • Antagonist roles are now restricted by player client age.
    • -
    -

    Jordie0608 updated:

    -
      -
    • The server's current local time is now displayed in status panel in ISO date format (YYYY-MM-DD hh:mm)
    • -
    -

    Mandurrrh updated:

    -
      -
    • Added the ability to see pda messages as a ghost with GHOSTWHISPER toggled on.
    • -
    • Removed the degrees symbol from Kelvin units on atmos meters because not gramatically correct
    • -
    -

    RemieRichards updated:

    -
      -
    • Drones now see either Static, Black icons or Roguelike style lettering instead of actual mob icons
    • -
    • Icons for the above, from VG's SkowronX
    • -
    • Many icon procs for the above, from VG's ComicIronic
    • -
    • Drones moved into their own folder
    • -
    • Drone.dm replaced with seperate files for each functionality
    • -
    • Drones now have 2 skins to choose from, Maintenance Drone (Current drones) and Repair Drone (A modified VG/Bay sprite)
    • -
    • Much more support for alternate skins on drones
    • -
    -

    Xhuis updated:

    -
      -
    • Added four new emoji: :1997:, :rune:, :blob:, and :onisoma:.
    • -
    -

    xxalpha updated:

    -
      -
    • Added a surgery table and tools to the Nuke Ops ship.
    • -
    • Added Engineering Scanner Goggles to Engivend, Engineering Secure Closets and Research.
    • -
    • Doubled T-ray scanner range.
    • -
    - -

    01 March 2015

    -

    Dannno updated:

    -
      -
    • Resprited all owl items. Wings are now a seperate toggleable suit item.
    • -
    • Added The Griffin costume, arch nemesis of The Owl. Found in the autodrobe.
    • -
    • Added admin-only Owl hardsuit. Only for the most vengeful souls.
    • -
    • Added Owl and Griffin merchandise; The Nest barsign, Owl/Griffin toys and posters.
    • -
    -

    Iamgoofball updated:

    -
      -
    • Fixes the recipe for meth.
    • -
    • Fixes sorium blobs flinging themselves.
    • -
    -

    Incoming5643 updated:

    -
      -
    • On servers where malfunction, wizard, and blob rounds do not end with the death of the primary antagonist, new antagonists from traitor and changeling derivative modes will now sometimes spawn. This depends on the state of the station, the state of the crew, and the server's gamemode probabilities. Server owners should consider revising their configuration choices
    • -
    • If you would like to opt out of this midround chance, a new toggle to disable it can be found in your preferences
    • -
    -

    Mandurrh updated:

    -
      -
    • The barsign can be emagged and EMP'd; EMP'd signs can be repaired with a screwdriver and cables.
    • -
    -

    Menshin updated:

    -
      -
    • Fixed the protolathe not requiring displayed amount of materials to make items.
    • -
    -

    MrStonedOne updated:

    -
      -
    • Adds a Panic Bunker!
    • -
    • This will prevent any player who has never connected before from connecting. (Admins are exempt)
    • -
    • Can be enabled per-round by any admin with +SERVER or for longer periods via the config.
    • -
    • Also adds some other config options relating to new joins, server operators should consult their configuration file for more details.
    • -
    • Fixes toggle darkness vision hiding other ghosts.
    • -
    • Admins fucking around with ghost icon and icon states in VV are going to want to change the icon and icon state of the ghostimage var of the ghost to change the image shown to ghosts who have darkness disabled. doing this via mass edit is not yet supported.
    • -
    • New ghost verb, toggle ghost vision. Switches the ghost's invisibility vision between that of a ghost and that of a human. So ghosts can hide other ghosts and in general get the old behaviour of toggle darkness.
    • -
    -

    Paprika updated:

    -
      -
    • Messages with two exclamation marks will be yelled in bold.
    • -
    -

    Phil235 updated:

    -
      -
    • Cultists can't summon narsie until their sacrifice objective is complete.
    • -
    -

    Razharas updated:

    -
      -
    • Vines now can grow on any tiles that is not dense, including space, shuttles, centcomm tiles and so on.
    • -
    • Added 'Bluespace' mutation to vines, makes them be able to grow through absolutely everything.
    • -
    • Added 'Space Proofing' mutation to vines, after they grow if the tile under them is space it will become special vinetile, which is just resprited regular floor, if the vine on the vinetile dies the vineturf changes back to space.
    • -
    • Made vines spreading speed depend on the seed's production, can be both slower and faster than current.
    • -
    • Made vines mutation chance be 1/10th of the potency of the seed it is spawned from.
    • -
    • Special chemicals added to vine seeds durning their growth can increase/decrease their potency and productivity.
    • -
    • Special chemicals now can remove good, bad or neutral mutations from vine seeds while they are growing, cultivating actually helpful vines is now possible.
    • -
    • Plant analyzers now show the vine seeds mutations.
    • -
    • Buffed numbers in some of the more useless mutations.
    • -
    -

    Steelpoint updated:

    -
      -
    • Reworked and expanded areas of the derelict station. Featuring a repairable gravity generator, turret filled computer core and functional solars.
    • -
    -

    Vekter updated:

    -
      -
    • Chemists, Geneticists, Virologists, Scientists, and Botanists will now spawn with alternative backpacks and satchels in their lockers. Try them out!
    • -
    - -

    25 February 2015

    -

    Cheridan updated:

    -
      -
    • Foam now carries reagents, similarly to smoke. Have fun with that.
    • -
    -

    Dannno updated:

    -
      -
    • Altered the sprite for security hardsuits. The old sprite is now a HoS specific hardsuit.
    • -
    -

    Delimusca updated:

    -
      -
    • Turret's guns replaced by a heavy energy cannon.
    • -
    • Firing a heavy weapon sindlehandedly can make it recoil out of your hands.
    • -
    -

    Gun Hog updated:

    -
      -
    • Nanotrasen has released new design specifications for the prototype combination of standard night-vision equipment and Optical Meson Scanners. We believe that this will address the concerns many Shaft Miners have concerning visiblity in a potentially unsafe environment.
    • -
    • Fixed malf AI's turret upgrade power not working.
    • -
    -

    Iamgoofball updated:

    -
      -
    • You can now go into hyperglycaemic shock from having over 200u of Sugar in your body at once. Treat it with Insulin.
    • -
    • Insulin has been added. Use it to treat hyperglycaemic shock. You can get it from medical vendors and the Cargo medicine supplies crate.
    • -
    • Medvendor contents have been reduced from medical having everything they need at roundstart level, and toxin bottles are now back in the vendor.
    • -
    • Medical Analyzers now have 2 modes, Medical Scan and Chemical Scan. You can swap between modes by clicking on it in hand.
    • -
    • Medical scan is default behavior. Chemical scan shows all the reagents inside the mob at the time, along with any addictions the mob has. It will show if a reagent is overdosing.
    • -
    • Tobacco and Space Tobacco have Nicotine in them now.
    • -
    • Adds Methamphetamine to the game. Mix it with Ephedrine, Iodine, Phosphorous, and Hydrogen at 374K.
    • -
    • Or, look around in Maintenance for Muriatic Acid, Caustic Soda, and Hydrogen Chloride. Recipes are also available for these.
    • -
    • Adds Saltpetre. Mix it with Potassium, Nitrogen, and Oxygen.
    • -
    • Adds Bath Salts, mix it with Bad Food, Saltpetre, Nutriment, Space Cleaner, Universal Enzyme, Tea, and Mercury at 374K.
    • -
    • Adds Aranesp. Mix it with Epinephrine, Atropine, and Morphine.
    • -
    • Adds Hotline. Get it from Poppy plants.
    • -
    • Strange Reagent revival was changed. It now won't gib but won't do anything above a 100 BRUTE or BURN threshold.
    • -
    • Carpet now applies carpet tiles to whatever flooring it hits. Mix it with Space Drugs and Blood.
    • -
    • Colorful Reagent colors have been improved drastically and now are more varied and nicer looking.
    • -
    • Corn Starch has been added. Get it from juicing Corn.
    • -
    • Corn Syrup has been added. Mix it with Corn Starch and S-Acid.
    • -
    • Corgium has been added. Mix it with Nutriment, Colorful Reagent, Strange Reagent, and Blood at 374K.
    • -
    • Adds Quantum Hair Dye. Mix it with Colorful Reagent, Radium, and Space Drugs.
    • -
    • Adds Barber's Aid. Mix it with Carpet, Radium, and Space Drugs.
    • -
    • Adds Concentrated Barber's Aid. Mix it with Barber's Aid and Unstable Mutagen.
    • -
    • Re-adds Chlorine Trifluoride. Mix it with Chlorine and Fluorine at 424K.
    • -
    • Adds Black Powder. Mix it with Saltpetre, Charcoal, and Sulfur. Ignite it for an explosion at 474K
    • -
    • Finally nerfs Salglu Solution. It's no longer tricord 2.0.
    • -
    • Salt recipe is now Water + Sodium + Chlorine due to problems with recipe mixing.
    • -
    -

    Incoming5643 updated:

    -
      -
    • A new event has been added to the wizards summon events spell that gives the game a distictively more roleplaying flair.
    • -
    • Optional population cap functionality has been added to the game. By default all caps are disabled. Server owners should refer to config.txt to see their list of options.
    • -
    • Medical borgs now have access to a deployable onboard roller bed. Should the bed become lost, any roller bed may be used in its place.
    • -
    -

    Mandurrh updated:

    -
      -
    • Added interchangeable bar signs
    • -
    • Added bays fountain machines for the bar. Soda and Beer. Allowing bartenders to have easier access to mix drinks and making more to make their job a little less boring
    • -
    • Added color tiles to the light up floor tiles.
    • -
    • Added metal, glass, and cable to bar back room at round start for bartender to make colored light dance floors.
    • -
    • Fixes clown cuffing both mobs and two pairs of cuffs appearing.
    • -
    • Fixes clown not being able to use his stamp as antag so no meta.
    • -
    • Fixes sleepypen bug. Instead of only dispensing 50u it dispenses the full 55u.
    • -
    • Fixed silicons not being able to pass through holotape.
    • -
    -

    Menshin updated:

    -
      -
    • Getting into regenerative statis now puts the changeling into unconscious state.
    • -
    • Fixed changeling 'Revive' not working.
    • -
    -

    Paprika updated:

    -
      -
    • Added an assistant cap, unlimited by default.
    • -
    • Batons now slowly lose power when left on.
    • -
    • Batons, flashbangs and handcuffs can be seen when stored in a belt.
    • -
    • Computers now emit light when they're on or bluescreened.
    • -
    • Added hotkeys for OOC and custom emotes. Press O and M when in hotkey mode. Remember not to ick in ock!
    • -
    • Added megaphones for the HoS, HoP, and QM.
    • -
    • Goliath tentacles no longer stun you if you cross them. They will only stun you if you don't move away from them in time. They can do up to 15 damage now, in addition to stunning you.
    • -
    • Changed a lot of mining gear and prices. The resonator can now have up to 3 fields active at once, but the fields need to detonate before they crush rocks. Tweak the time before the fields detonate with a screwdriver and upgrade the amount of fields at once with sheets of diamond.
    • -
    • Overhauled straight mining tools. The sonic jackhammer is now the wall-crushing tool, the diamond drill simply mines really fast. Borgs can now get upgraded with the diamond mining tool with only a single sheet of diamond and an upgrade module, they don't need illegal tech modules.
    • -
    • Mining drills and the sonic jackhammer now draw power when they drill down mineral walls. They can be recharged using any type of weapon recharger or by replacing the cell using a screwdriver on them.
    • -
    • Space now emits a dim light to adjacent tiles.
    • -
    • Syndicate shotguns now start with buckshot instead of stunslugs.
    • -
    • Fixed welding tools using fuel when being switched on.
    • -
    • Added a firing delay between shooting electrodes.
    • -
    • Changed the stun revolver from a high-capacity taser to a disabler with extra capacity.
    • -
    • Added a unique stun pistol for the head of security. It is a double capacity taser with no shot delay and a loyalty pin, though it lacks a disable mode.
    • -
    -

    RandomMarine updated:

    -
      -
    • New brute treatment kit crate for cargo.
    • -
    -

    RemieRichards updated:

    -
      -
    • Explosions will now blow (throw) items away from the epicenter
    • -
    • Sharp items can now embedd themselves in a human's limbs
    • -
    • Embedded items have a chance to do some damage (based on w_class) each life() call
    • -
    • Embedded items have a chance to fall out doing some more damage, but removing the object
    • -
    • Adds a surgery to remove Embdedded objects
    • -
    • Adds throwing stars as an uplink item (100% chance to embedd)
    • -
    • Items placed on tables now center to exactly where you clicked.
    • -
    -

    Steelpoint updated:

    -
      -
    • SS13's Head of Security has received a new attempted 1:1 recreation of a Old Earth weapon, the Captain's Antique Laser Gun.
    • -
    • This gun features three firing modes, Tase, Laser and Disable. However this gun lacks the capability to recharge in the field, and is extreamly expensive.
    • -
    • INTERCEPTED TRANSMISSION REPORT: The Syndicate have expressed a interest in this new weapon, and have instructed field agents to do whatever they can to steal this weapon.
    • -
    -

    TheVekter updated:

    -
      -
    • Box's vault nuke has been replaced with immobile Nuclear Self-Destruct Mechanism.
    • -
    • Vault's new green floor tiles turn flashing red when Self-Destruct is activated.
    • -
    -

    Xhuis updated:

    -
      -
    • Syndicate contacts have discovered new ways to manipulate alarms. Malfunctioning AIs, as well as normal emags, can now disable the safeties on air and fire alarms.
    • -
    • When one emags an air alarm, its safeties are disabled, giving it the Flood environmental type, which disables scrubbers as well as vent pressure checks. Burn, pigs, burn!
    • -
    • When one emags a fire alarm, its thermal sesnsors are disabled. This will prevent automatic alerts due to the alarm being unable to recognize high temperatures.
    • -
    • Malf AIs gain two new modules, both of which disable ALL air alarm safeties and thermal sensors. These are separate abilities.
    • -
    • Air and fire alarms have notifications on their interface about the current safety status. One only has to glance at one to see that it's been tampered with.
    • -
    -

    phil235 updated:

    -
      -
    • Fixed arcade machines being usable from inside lockers to dupe rewards.
    • -
    • Silicons can no longer be grabbed by anyone. No more silicon choking
    • -
    • Custom food can now be renamed using a pen.
    • -
    -

    xxalpha updated:

    -
      -
    • Added new graffiti: cyka, prolizard, antilizard
    • -
    - -

    18 February 2015

    -

    Dannno updated:

    -
      -
    • Added proper slurring when drunk.
    • -
    -

    Deantwo updated:

    -
      -
    • Updated the ChemMaster's UI to the station default along with some functionality improvements.
    • -
    • You can now spam the 'Ready' button as much as you want without it setting you 'Not ready' again.
    • -
    -

    Dorsidwarf updated:

    -
      -
    • Added the ability to call Central Command for the nuclear authentication codes. This requires a captain-level ID and admin approval, and warns the crew.
    • -
    -

    Gun Hog updated:

    -
      -
    • E.X.P.E.R.I-MENTOR meteor storm event replaced with a fireball that targets random nearby mob.
    • -
    • EMP event range reduced.
    • -
    • Self-duplicating relics limited to 10 copies.
    • -
    • Nanotrasen has released a firmware patch for the Ore Redemption Machine, which now allows the station AI, cyborgs, and maintenance drones to smelt raw resources without the need of a valid identification card installed.
    • -
    • Nanotrasen scientists have completed their designs for a lightweight, compacted anti-armor ion weapon, without loss of efficiency. In theory, such a weapon could easily fit within standard issue backpacks and satchels. With sufficient research into weapons technology and materials, Nanotrasen believes a working prototype can be fabricated.
    • -
    -

    Iamgoofball updated:

    -
      -
    • Buffs the shit out of Styptic Powder and Silver Sulf, they're now viable to use. Synthflesh is still good for general treatment, but overall Styptic and Silver Sulf deal with their respective damage types way better now.
    • -
    • Improves kinetic accelerator's mining strength.
    • -
    • The kinetic accelerator's cooldown can be decreased by tweaking the thermal exchanger with a screwdriver.
    • -
    • The range can be increased with plasma sheets
    • -
    -

    Incoming5643 updated:

    -
      -
    • Medical borgs have been given full surgery tools which they can't fail a procedure with.
    • -
    • Medical borgs also have rechargeable gauze.
    • -
    • Borg hypo's omnizine replaced with salbutamol, salglu and charcoal.
    • -
    • Slime and Jelly mutant races now actually contain slime jelly. While playing as these races you will naturally produce it internally from your nutrition, so be sure to stay well fed as losing too much is dangerous to your health! Beware of chems that clear toxins, as they can be rapidly fatal to you!
    • -
    -

    Jordie0608 updated:

    -
      -
    • Veil render and rifts changed to spawn with vars, rifts can be closed with a nullrod.
    • -
    -

    Lo6a4evskiy updated:

    -
      -
    • General record now contains a species field and a photo of the crewmember. Security record consoles allow you to update it with a photo taken in-game (with detective's camera, for example, or AI's).
    • -
    • Expanded functionality of security HUDs to display rank and photos.
    • -
    • Medical HUDs allow user to change others' mental and physical status. Currently has no gameplay effect other than changing records.
    • -
    • Medical HUDs can perform an examination at the distance, similrarly to how attacking yourself with help intent works. Has limited ability to detect suffocation and toxin damage.
    • -
    -

    Menshin updated:

    -
      -
    • Solar control computers remade with NanoUI
    • -
    -

    Paprika updated:

    -
      -
    • Added rnd requirements to borg upgrades and tweaked the prices.
    • -
    • Changed some clothing around. Added a turtleneck for the HoS. Removed 'civillian' armor and gave normal armor to the bartender and HoP. Added flash protection to the HoS' eyepatch, it functions like sunglasses now. Additionally, added the ability to store ammo on your shoulder holster as detective.
    • -
    • Removed the defib steal objective. Added a compact defibrillator for the CMO that equips to the belt. Removed defibrillators from RND. Removed the requirement for people to not wear armor to revive them with defibs. Doubled defib timers (10 minutes before permadeath).
    • -
    • Flashlights can be attached to pulse carbines.
    • -
    • Miners spawn with a brute patch.
    • -
    • Mining station's sleeper has been replaced with an IV drip and more medkits.
    • -
    • Added hard-light holotape. This holographic police or engineering hazard tape will block entry if you're running, so you need to walk to pass it. This is to help people not sprint into breaches or crime scenes.
    • -
    • Fixed being able to sling the strapless improvised shotgun on your back.
    • -
    • Reverted the price of the ebow to 12tc and removed the range limit of its bolts.
    • -
    -

    Sometinyprick updated:

    -
      -
    • Novely pig mask prize from arcade machines, can be toggled to make you squeal like a pig.
    • -
    -

    Steelpoint updated:

    -
      -
    • Security Cyborgs Advance Taser have been replaced with a Disabler.
    • -
    -

    TZK13 updated:

    -
      -
    • Adds plaid skirts and new schoolgirl outfits to the autodrobe
    • -
    • Novaflowers apply a firestack for every 20 potency they have.
    • -
    • You can now juice whole watermelons instead of slices.
    • -
    • Advancements in the field of virology by Nanotrasen's finest have uncovered three new disease symptoms for further research:
    • -
    • Ocular Restoration heals any eye trauma experienced by the infected patient.
    • -
    • Revitiligo increases the pigmentation levels of the infected patient's skin.
    • -
    • Spontaneous Combustion ignites the infected patient without warning.
    • -
    -

    Vekter updated:

    -
      -
    • Added shot glasses! Can be obtained from the Booze-o-Mat.
    • -
    • A new premium vodka has been added to the game, hidden in a special spot.
    • -
    • Due to constant attempts to break into the station's safe, the contents have been relocated and have not been replaced. We promise. There is absolutely NO reason to break into the vault's safe anymore.
    • -
    • Each shot glass now holds 15 units, and the drinker takes all 15 in one gulp instead of 5 at a time. This means you can mix certain shots (namely, the B-52 and Toxins Special) in a shot glass. Both drinks have been made exclusive to shot glasses and will no longer show their specific sprite in a normal glass.
    • -
    • Added new sprites for most alcohol in shot glasses. Everything else will show up as 'shot of... what?'.
    • -
    • Fixed shot glasses turning into regular glasses when filled.
    • -
    • Fixed tequila bottle sprites not showing up.
    • -
    • Fixed a typo!
    • -
    • Roboticists will now start with a full toolbelt instead of a toolbox.
    • -
    -

    drovidi updated:

    -
      -
    • Blobs who burst in space will be given a 30 second warning before dying.
    • -
    • If a blob does die from bursting in space, a new crewmember will be infected.
    • -
    • If there are no blobs or infected crew left after bursting, the round will now end properly, rather than becoming endless.
    • -
    -

    phil235 updated:

    -
      -
    • You no longer need to cut the syphon wire to deconstruct air alarms.
    • -
    • Cooking overhaul: microwave recipes are converted to tablecraft recipes.
    • -
    • Added customizable food (burger,sandwich,spaghettis,soup,salad,cake,bread,kebab,pie) with specific color depending on ingredients used.
    • -
    • Added new food ingredients (dough, flat dough, cake batter, pie dough, doughslice, bun, raw pastry base, pastry base, raw cutlet, cutlet, pizzabread). Dough is made by mixing egg and flour, then transformed by using knife, rollingpin, milk and microwave. Meat is now sliceable into rawcutlets (specific color for each meat type).
    • -
    • Changed food recipes a bit (replacing stuff with new food ingredients).
    • -
    • Repurposed the microwave to actually cook certain food items(no reagents required), renamed it microwave oven and added a power setting to it.
    • -
    • Bowl is no longer trash but a beaker-like container that is used in salad&soup recipes. Also, milk and soymilk cartons as well as flour packs are now condiment bottles.
    • -
    • Changed the hunger system a bit, sugar becomes a normal reagent again. Faster nutrition drain is now handled by a variable in junk food. Also added a slight buff to vitamin.
    • -
    -

    xxalpha updated:

    -
      -
    • You now hear the voice of the chosen deity in prayers.
    • -
    - -

    05 February 2015

    -

    Danno updated:

    -
      -
    • Added suicide messages for all gun types and various different items.
    • -
    -

    Paprika updated:

    -
      -
    • Compacted ERT room by removing equipment rooms, filler rooms and pre-spawned mechs.
    • -
    • Rebalanced Pulse weapons to have more shots, faster charge, EMP immunity and modified sprites.
    • -
    • ERT spawns fully equipped with no-slowdown suits.
    • -
    • Added blood and bleeding. If you take enough brute damage on a certain limb, you will start bleeding, and will need to patch your bleeding with gauze from medbay. You can replace lost blood by eating nutritious food and waiting for your heart to reproduce it, or by getting a blood transfusion from an IV drip.
    • -
    -

    Vekter updated:

    -
      -
    • Added a toy red button to the Arcade cabinets.
    • -
    - -

    04 February 2015

    -

    Danno updated:

    -
      -
    • Fixes dufflebag's storage capacity.
    • -
    -

    Deantwo updated:

    -
      -
    • Removes duplicate fluorine from Chemical Dispenser.
    • -
    • Added GoonChems to the Portable Chem Dispenser.
    • -
    • Added cancel buttons to the ChemMaster and CondiMaster when making bottles, pills, etc.
    • -
    -

    Delimusca updated:

    -
      -
    • Added new foam armblade toy to arcade prizes.
    • -
    • Slimes can drag themselves to mobs to start feeding.
    • -
    • Attacking another slime will pull them off their victim if they're feeding or steal some of their mass.
    • -
    -

    GunHog updated:

    -
      -
    • Five new silicon emotes: *buzz2, *chime, *honk, *sad and *warn
    • -
    -

    Incoming5643 updated:

    -
      -
    • New contraband crate containing fifty butterflies.
    • -
    • Shuttle will now always arrive, but won't launch in rounds where it would've been previously auto-recalled.
    • -
    -

    Menshin updated:

    -
      -
    • Fixed being unable to place cables on plating.
    • -
    -

    Paprika updated:

    -
      -
    • Helmets for hardsuits are stored inside the suit and cannot be equipped without the suit on.
    • -
    • EVA space suits are now lighter for faster movement but lack flash or welding protection, don't hide your identity and have less radiation protection.
    • -
    -

    Perakp updated:

    -
      -
    • Tweaked slowdown due to coldness when in in low gravity.
    • -
    -

    Steelpoint updated:

    -
      -
    • ERT base equipment rooms are now access restriction to each role.
    • -
    • ERT commander spawns wearing hardsuit for identification.
    • -
    • Two boxes of metal foam grenades added for ERT engineers.
    • -
    • Deep space sensors recently detected the derelict remains of the NTSS Omen, a outdated Medical Frigate thought lost, within close proximity to Space Station 13.
    • -
    • If any SS13 EVA Personal are able to locate this ship, they will be able to pilot it back to the station for recovery. The ship may also have cordinates for other locations.
    • -
    -

    Xhuis updated:

    -
      -
    • Changelings now have the ability Strained Muscles, which lets them move at inhuman speeds at the cost of rapid stamina damage. It costs one evolution points=.
    • -
    • Changelings now have the ability Augmented Eyesight, which lets them see creatures through walls and see in the dark. It costs two evolution points.
    • -
    • After many failed raids, the Syndicate have finally done something about poor communications between cyborgs and operatives.
    • -
    • Syndicate Cyborgs now come equipped with operative pinpointers, which will automatically point to the nearest nuclear operative.
    • -
    • Handheld crew monitors can now be stored in medical belts.
    • -
    - -

    26 January 2015

    -

    Dannno updated:

    -
      -
    • Added fannypacks of multiple colors, 3 of which are accessible from the clothing vendor.
    • -
    • Added dufflebags to multiple lockers throughout the station and to the syndicate shuttle, more storage slots at the cost of move speed.
    • -
    -

    Deantwo updated:

    -
      -
    • Fixed some bugs in PDA's NTRC Chatroom feature.
    • -
    • You can now use PaperBBCode/PenCode when writing news articles on the newscaster.
    • -
    • PDA's Notekeeper now uses PaperBBCode/PenCode rather than HTML.
    • -
    • Scanning paper with your PDA is now more informative.
    • -
    -

    Firecage updated:

    -
      -
    • We, at NanoTrasen, have recently upgraded the Kitchen Spikes to include the skin of both Monkeys and Aliens when you harvest their flesh!
    • -
    • In other news, a station in a nearby Sector has been making monkey and xeno costumes. We are not sure why.
    • -
    • Added the ability to reform mineral floortiles back into sheets/bars
    • -
    -

    Ikarrus updated:

    -
      -
    • Added a new config option MINIMAL_ACCESS_THRESHOLD that can be used to automatically give players more access during low-population rounds. See game_options.txt for more information.
    • -
    -

    Lo6a4evskiy updated:

    -
      -
    • The kitchen now contains a brand new food cart. It can store foods and liquids, mix them into cocktails and dispense where needed. Food delivery has never been easier!
    • -
    -

    fleure updated:

    -
      -
    • Added briefcase filled with cash to uplink.
    • -
    - -

    21 January 2015

    -

    Iamgoofball updated:

    -
      -
    • Addiction and Overdosing has been added to Chemistry.
    • -
    • Deal with Overdosing by purging the ODing chemical with Calomel or Penetic Acid.
    • -
    • Deal with Addiction by either going cold turkey on it and weathering the effects, eventually causing the addiction to subside, or by taking more of the addictive substance to keep the effects down.
    • -
    • Cryoxadane was heavily buffed. Clonex was removed as it was merged into Cryox.
    • -
    • Fixes a shitton of stuff adding Morphine instead of Ephedrine. Sorry, miners.
    • -
    • Fixes instances of Alkysine not being replaced with Mannitol. Same with Ryetalyn being replaced with Mutadone.
    • -
    • Adds Itching Powder. Welding Fuel and Ammonia.
    • -
    • Adds Antihol. Ethanol and Charcoal.
    • -
    • Adds Triple Citrus. Lemon Juice, Lime Juice, and Orange Juice.
    • -
    • Adds Colorful Reagent. Stable Plasma, Triple Citrus,
    • -
    • Morphine replaces sleep toxin now, not Hyperzine. Hyperzine is replaced by Ephedrine now.
    • -
    • Cryotubes will now autoeject you once you are fully healed.
    • -
    • Synthflesh damage values have been fixed.
    • -
    • Charcoal has been buffed to heal 3 TOX damage a cycle and it purges other chemicals faster.
    • -
    • Saline-Glucose Solution has been buffed. It now has a 50% chance per cycle to heal 3 BRUTE and BURN per tick.
    • -
    • Fixes Strange Reagent revivals dying right after being revived. They'll still need immediate medical treatment, however.
    • -
    • Cryoxadone has had a recipe change. It is now Stable Plasma, Acetone, and Unstable Mutagen.
    • -
    • Adds 9 new Disabilites and 2 new genetic powers.
    • -
    • You can now heat donk pockets once more. Rejoice.
    • -
    - -

    17 January 2015

    -

    Cheridan updated:

    -
      -
    • The lockbox system for R&D has been replaced with a firing pin system. Ask the Warden or HoS for firing pins to allow normal operation of your firearms. Want to test them out at the range? Try printing a test-range pin.
    • -
    • Nuke Ops have used this new technology to lock some of their heavier weapons so that crew cannot use them. These implants replace their explosive implants.
    • -
    • Explosive implants are now purchasable in the uplink, and are much stronger.
    • -
    -

    Firecage updated:

    -
      -
    • NanoTrasen would like to report that our Mechanical Engineers at NTEngiCore has recently upgraded the capacity of the machines known as Biogenerators. They are now have the added ability to create various belts, and also weed/plantkillers and cartons of milk and cream!
    • -
    -

    Iamgoofball (Look Ma, I didn't mispell my name this time!) updated:

    -
      -
    • Replaced Star Trek chemistry with Goon Chemistry.
    • -
    • Emergency Medic's Handbook Tip 1: Styptic Powder = BRUTE, Silver Sulfadiazine = BURN, Charcoal = TOX, Salbutamol = OXY
    • -
    • In recipes that used removed reagents, they have been replaced with their goon chemistry counterpart:
    • -
    • Hyperzine -> Morphine
    • -
    • Inaprovaline -> Epinephrine
    • -
    • Kelotane -> Saline-Glucose Solution
    • -
    • Bicardine -> Saline-Glucose Solution
    • -
    • Dermaline -> Saline-Glucose Solution
    • -
    • Dexalin -> Salbutamol
    • -
    • Dexalin Plus -> Salbutamol
    • -
    • Tricordrazine -> Omnizine
    • -
    • Anti-Toxin -> Charcoal
    • -
    • Hydronalin -> Penetic Acid
    • -
    • Arithrazine -> Penetic Acid
    • -
    • Imidazoline -> Oculine
    • -
    • Mannitol -> Alkysine
    • -
    • Ryetalyn -> Mutadone
    • -
    -

    Steelpoint updated:

    -
      -
    • The Emergency Response Team project has been activated by Nanotrasen. The ERT are a seven man squad that can be deployed by the Central Command (admins) to attempt to rescue the station from a overwhelming threat, or to render assistance in dealing with a significant problem.
    • -
    • The ERT consists of a single Commander, two Security Officers, two Engineering Officers and two Medical Officers. The Commander is preselected when the squad is being spawned in, however the remaining six officers are free to select their role in the squad.
    • -
    • Two new Pulse gun variants have been added to the game. They are the Pulse Carbine and the Pulse Pistol, both have significantly smaller ammunition capacities than the Pulse Rifle, however they both can fit in a backpack and the pistol can fit in a pocket. All ERT Officers have a Pulse Pistol for a sidearm, however the Security Officers get a Pulse Carbine as their primary longarm.
    • -
    -

    phil235 updated:

    -
      -
    • The two library consoles are now real buildable computers. The circuitboard design is available in R&D.
    • -
    -

    sawu-tg updated:

    -
      -
    • Added a new R&D machine, to replace the telescience room. The Machine is based on RND and various interdepartmental creations.
    • -
    - -

    14 January 2015

    -

    Boggart updated:

    -
      -
    • Adds a new spell: Repulse. (Cooldown: 40 seconds, 15 at max upgrade.) Repulse throws objects and creatures within 5 tiles of the caster away and stuns them for a very short time. Distance thrown decreases as the distance from the caster increases. (Max of 5, minimum of 3) Casting it while standing over someone will stun them for longer and cause brute damage but will not throw them.
    • -
    • Fixes the Exosuit Control Console having the unpowered icon state while powered.
    • -
    -

    Iamgootball updated:

    -
      -
    • Added Goonstation Chemistry!
    • -
    • Adds 14 medicines!
    • -
    • Adds 3 pyrotechnics!
    • -
    • Adds 3 drugs with actual gameplay uses!
    • -
    • Adds 7 toxins!
    • -
    • Adds a Chemical Heater for some new recipes!
    • -
    • Adds Chemical Patches for touch based applications!
    • -
    • Adds a Traitor Poison Kit!
    • -
    • Adds Morphine Medipens!
    • -
    • Adds Morphine bottles to Cargo!
    • -
    - -

    13 January 2015

    -

    Dannno updated:

    -
      -
    • Adds a bandanas in basic colors to lockers in the station. Activate in hand to switch between head and mask modes.
    • -
    • Adds more colored jumpsuits to the mixed locker.
    • -
    -

    Incoming5643 updated:

    -
      -
    • Player controlled slimes can now change their face to match AI controlled slimes in kawaiiness. use *help as a slime to find the commands.
    • -
    -

    Studley updated:

    -
      -
    • Fixed NTSL division.
    • -
    • Added new NTSL math functions, including 'sin,' 'cos,' 'asin,' 'acos,' and 'log.'
    • -
    - -

    06 January 2015

    -

    JJRcop, Nienhaus updated:

    -
      -
    • Adds emoji to OOC chat.
    • -
    - -

    27 December 2014

    -

    Dorsidwarf updated:

    -
      -
    • Buffs the RCD from 30 matter units to max capacity 100, and increases the value of matter charges.
    • -
    -

    Paprika updated:

    -
      -
    • Taser electrodes now have a limited range of 7 tiles.
    • -
    • The energy gun's stun mode has been replaced with a disable mode.
    • -
    • Security officers will now spawn with tasers.
    • -
    • Disabler beams now go through windows and grilles.
    • -
    • Disabler beams now do 33 stamina damage instead of 34. This means they will only stun in 3 hits on someone that is NOT 100% healthy.
    • -
    • Most ballistic projectiles now do stamina damage in addition to their regular damage instead of stunning. This includes nuke op c-20r .45, detective's revolver, etc. They are effectively better than disablers at stunning people, as well as do significant damage, but they do not stun instantly like a taser. Expect engagements to be a little longer and plan ahead for this.
    • -
    • Added an advanced taser for RnD, the child of a disabler and a taser.
    • -
    -

    Tkdrg updated:

    -
      -
    • Envoys from the distant Viji sector have brought an exotic contraption to Centcomm. Known as the 'supermatter shard', it is a fragment of an ancient alien artifact, believed to have a dangerous and mysterious power. This precious item has been made available to the Space Station 13 cargo team for the cost of a hundred supply points, as a reward for all your hard work. Good luck, and stay safe.
    • -
    - -

    16 December 2014

    -

    Paprika updated:

    -
      -
    • Reverted security armor and helmets to the old (Grey) style of armor/helmets.
    • -
    • Updated security jumpsuits to be more consistent across officer/warden/HoS ranks.
    • -
    • Added tactical armor and helmets to replace the largely unused bulletproof vest in the armory. This armor has higher bullet and explosive resistance than normal armor, and uses the previous, more military armor/helmet sprites.
    • -
    • Added a new injury doll to go along with the overall health meter. This will show you locational overall limb-based burn/brute damage, so you can tell the difference between being hurt with burn/brute or toxins/stamina damage which does not affect limbs.
    • -
    • Reverted some UI icons back to their older status and changed some around for readability. Thank you for your feedback.
    • -
    -

    Thunder12345 updated:

    -
      -
    • Added a new FRAG-12 explosive shotgun shell, built from the unloaded technological shell, using tablecrafting. Constructed using an unloaded technological tech shell, 5 units sulphuric acid, 5 units polytrinic acid, 5 units glycerol, and requires a screwdriver.
    • -
    -

    phil235 updated:

    -
      -
    • Change to the hunger system. Eating food with sugar temporarily worsens your nutrition drop rate. Eating too much sugar too quickly can make you temporarily unable to eat any sugary food. The nutritional effect of sugar depends on how hungry you are thus it cannot easily raise your nutrition level past well fed and is best used when hungry. Lots of sugar can make you a bit jittery at times. Eating food with vitamin (new reagent) counteracts the sugar effects and can give you temporary buffs when well fed: it lowers your chance to catch or spread viruses,it makes your body's metabolism more efficient that is it keeps healing reagents longer and evacuate toxins faster and reduces damage from radioactive reagents. Your metabolism gets less efficient if starving.
    • -
    • New hunger hud icons: starving, hungry, fed, well fed, full, fat.
    • -
    • Snack vending machine get a chef compartment that can be loaded with non-sugary food by hand or with a tray by anyone with kitchen access (unless you hack the machine with multitool or emag). The food can be unloaded by anyone, like regular snacks
    • -
    • Cargo can get a nutritious pizza crate order for 60 points.
    • -
    • Grown and cooked food gets some vitamin while junk food gets less nutriment and more sugar (only hot donkpocket and ramen don't have sugar)
    • -
    • The number of junk food in snack vending machine is lowered from 6 to 5 of each type.
    • -
    • Fixing not being able to load an omelette du fromage on a tray.
    • -
    - -

    10 December 2014

    -

    GunHog updated:

    -
      -
    • The Nanotrasen firmware update 12.05.14 for station AI units and cyborgs includes a patch to give them more control of their automatic speech systems. They can now chose if the message should be broadcasted with their installed radio system and any frequency available to them.
    • -
    -

    Paprika updated:

    -
      -
    • Added winter coats and winter boots! Bundle up for space xmas! They are available in most wardrobe and job lockers, and come with special features depending on the flavor!
    • -
    -

    Paprka updated:

    -
      -
    • Added a new weapon for syndicate boarding parties, the C-90gl assault rifle. This is a hybrid rifle with a lot of damage and a grenade launcher alt-fire. Purchasable for 18TC.
    • -
    • Suppressors can now be used on the protolathe SMG and the C-20r.
    • -
    -

    RemieRichards updated:

    -
      -
    • Sounds in areas of low pressure (E.g. Space) are now much quieter
    • -
    • To hear someone in space you need to be stood next to them, or use a radio
    • -
    -

    as334 updated:

    -
      -
    • We've discovered that slimes react to the introduction of certain chemicals in their bloodstream. Inaprovaline will decrease the slimes children's chance of mutation, and plasma will increase it.
    • -
    • We've also found that feeding slimes solid plasma bars makes them more friendly to humans.
    • -
    - -

    08 December 2014

    -

    Ergovisavi updated:

    -
      -
    • Allows using replica pods to clone people without bodies.
    • -
    • Speeds up replica pod cloning by adjusting the starting production.
    • -
    • Replica pods will now only create plantmen.
    • -
    • Mixing blood in a beaker or taking it from a suicide victim will render the blood sample useless for replica pod cloning.
    • -
    -

    GunHog updated:

    -
      -
    • Our top Nanotrasen scientists have provided improved specifications for the Rapid Part Exchange Device (RPED)! The RPED can now contain up to 50 machine components, and will display identical items in groups when using its inventory interface.
    • -
    • Note that power cells, being somewhat bulkier, will take up more space inside the device. In addition, the RPED's firmware has also been updated to assist in new machine construction! Simply have the required components inside the RPED, apply it to an unfinished machine with its circuit board installed, and watch as the device does the work!
    • -
    • Nanotrasen has updated station bound Artificial Intelligence unit design specifications to include an integrated subspace radio transmitter. The transmitter is programmed with all standard department channels, along with the inclusion of its private channel. It is accessed using :o in its interface.
    • -
    • {INCOMING CLASSIFIED SYNDICATE TRANSMISSION} Greetings, agents! Today, we are happy to announce that we have successfully reverse engineered the new subspace radio found in Nanotrasen's newest AI build plans. We have included our encryption data into these transmitters.
    • -
    • Should you be deployed with one of our agent AIs, it may be wise of you to purchase a syndicate encryption key in order to contact it securely. Remember, as with other agents, a Syndicate AI is unlikely to be of the same Syndicate corporation as you, and you both may actually have conflicting mission parameters! Your channel, as always, is accessed using :t.
    • -
    -

    Paprika updated:

    -
      -
    • Changed the way flashbang protection works. Currently, only security helmets (and their derivatives like swat and riot), and some hardsuit helmets have flashbang protection. Ear items like earmuffs and 'bowman' headsets (alternative, larger headsets) have flashbang protection as well, so you're able to go hatless as security. The Head of security, warden, and detective's hat do NOT have flashbang protection, but their earpieces do, from the 'noise' part of the flashbang. The flashbang blind still works as before, with only sunglasses/hardsuit helmets protecting you.
    • -
    -

    Tkdrg updated:

    -
      -
    • Security/Medical HUDs are now more responsive and less laggy.
    • -
    - -

    10 November 2014

    -

    Menshin updated:

    -
      -
    • Made meteors more threatening.
    • -
    • Added three levels of danger for meteors waves, randomly selected at spawn.
    • -
    • Rumors speaks of a very rare meteor of unfathomable destructive power in the station sector...
    • -
    • Fixed infinigib/infinisplosion with meteors bumping
    • -
    -

    Paprika updated:

    -
      -
    • Added a defibrillator and an EMT alternative clothing set for medical doctors. These defibrillators will revive the recently deceased as long as their souls are occupying their body and they have no outstanding brute or burn damage.
    • -
    • Yes, they actually work now too!
    • -
    • Added a way for you to unload a round from a chambered projectile weapon. Simply click on the gun when it is in your active hand, and assuming it does not have a magazine, the round should pop out. You can also use this system to unload individual bullets from magazines and ammo boxes, like the detective's speed loaders.
    • -
    • Added glass tables and overhauled how table construction works. Now, you need to build a frame using either metal rods or wood planks, and then place a top on the table.
    • -
    • Table disassembly now works in two stages. Screwdriver the table to remove the top of it and reduce it back to a frame. Frames can be moved around and walked on top of. Wrench the table to deconstruct it entirely back to parts, this is quicker and much more like the old fashion. To deconstruct a frame, use your wrench on it as well.
    • -
    • Fixed traitor med analyzers not fitting in medical belts.
    • -
    • Fixed syringe box bug with medipens.
    • -
    -

    Perakp updated:

    -
      -
    • Added escape-with-identity objective for changelings. Completion requires the changeling to have transformed to their target and be wearing an ID card with the target's name on it when escaping.
    • -
    • Changelings can absorb someone even if they have that DNA in storage already.
    • -
    • Fixes hivemind being lost when readapting evolutions.
    • -
    - -

    04 November 2014

    -

    MrPerson updated:

    -
      -
    • You can use AI Upload modules directly on unslaved cyborgs to change their laws. The panel has to be open to do this.
    • -
    • Newly emagged cyborgs get locked down for a little bit until their new laws get shown. Thank you to whoever bitched about it on singulo and filed an issue report.
    • -
    -

    Paprika updated:

    -
      -
    • Added an advanced mop for the janitor, available at the protolathe. This hi-tech custodian's friend can mop twice as many floor tiles before needing to return to your bucket!
    • -
    • Moved holosign projector to the protolathe and gave the janitor back his old signs. We hope you've enjoyed this free trial run of holo projectors, but our budget is tight!
    • -
    • Added a holosign projector to the janitor module for cyborgs.
    • -
    • Soap now has a delay. Different soap types clean faster than others, but expect to put it some extra arm work if you want to clean that fresh blood!
    • -
    -

    Tkdrg updated:

    -
      -
    • Cutting-edge research in a secret Nanotransen lab has shed light into a revolutionary form of communication technology known as 'chat'. The Personal Data Assistants of Space Station 13 have been deployed with an experimental module implementing this system, dubbed 'Nanotransen Relay Chat'.
    • -
    - -

    30 October 2014

    -

    MrPerson updated:

    -
      -
    • Everything now drifts in space, not just mobs.
    • -
    • Mechs are just as maneuverable in space as you are.
    • -
    • Being weightless now slows movement down by a lot rather than speeding it up. Having your hands full will make movement even slower.
    • -
    • Removed spaceslipping (You slipped! x1000)
    • -
    • Jetpacking after being thrown out a mass driver will cancel out your momentum.
    • -
    • Shooting a gun causes you to drift the other direction like spraying a fire extinguisher.
    • -
    - -

    27 October 2014

    -

    Jordie0608 updated:

    -
      -
    • Adds a new riot shotgun that spawns in the armory with a 6 round beanbag magazine.
    • -
    -

    Paprika updated:

    -
      -
    • Allowed constructs to assist in activating most runes. This includes conversion runes, but does NOT include sacrifice runes.
    • -
    -

    Patchouli Knowledge updated:

    -
      -
    • In light of the recent achievements of the Robotics department, new and upgraded exosuit schematics were delivered to SS13 exosuit fabricators as a reward from CentComm.
    • -
    • The countless hours of research, experimentation, and reverse-engineering of wrecks from the mining asteroid have paid off - the Research team has rediscovered the process of building Phazon exosuits. The parts and circuits have been made available in the exofabs and circuit printers.
    • -
    • The APLU Ripley exosuit has been refitted with asteroid mining purposes in mind. Its armour plating will provide extra protection against the brute attacks of asteroid alien lifeforms, and protect from gibtonite explosions. The leg servos were upgraded to provide faster movement.
    • -
    • There are rumours of some creative shaft miners discovering a way of augmenting APLU Ripley armour with trophy hides from goliath-type asteroid lifeforms...
    • -
    • Durand construction routines now require a phasic scanner module and a super capacitor to match Nanotrasen industry standards.
    • -
    • The exosuit fire extinguisher now boasts a larger watertank, and carries a whole 1000u of water from the old 200u tank.
    • -
    • The exosuit plasma converter's efficiency has been vastly improved upon, and its fuel consumption has been cut to nearly half of old values.
    • -
    • The exosuit sleeper interiors have been refitted to allow the occupants more freedom of movement, and the occupants may now eject at will.
    • -
    • The armour plating on all exosuits was fitted with reactive deflection systems specifically designed to stop the rapid slashes from xenomorph threats.
    • -
    • The Firefighter Ripley chassis were moved from the Exosuit Equipment section to the APLU Ripley section of exofab menus.
    • -
    • Fixed some minor errors in the exosuit construction message syntax.
    • -
    -

    phil235 updated:

    -
      -
    • Closets and its children can no longer contain a near infinite amount of mobs. Large mobs (juggernaut, alien emperess, etc) don't fit, small mobs (mouse, parrot, etc) still fit in the same amounts, human-sized mob (humanoid, slime, etc) fit but maximum two per body bag and three for all the other closets. Adding bluespace body bag to R&D, it can hold even large mobs and in large amounts.
    • -
    • girders and displaced girders now have a chance to let projectiles pass through them.
    • -
    - -

    19 October 2014

    -

    Donkie updated:

    -
      -
    • Major atmos update. Featuring pretty colors.
    • -
    • 4-Way pipes added.
    • -
    • Flip-able trinary devices (mixer & filter).
    • -
    • Pipe-painter added.
    • -
    • Most pipe icons have been tweaked with shading and such, making it look more uniform.
    • -
    -

    JJRcop updated:

    -
      -
    • We have managed to re-discover drones! We improved the formula, and have discovered some cool stuff.
    • -
    • After some fiddling with audio recognition, drones can now understand human speech!
    • -
    • One of our engineers found some screws that were loose on some of our tests, screwing them in made the drone work as if it had just come out of robotics.
    • -
    • We had to sacrifice some of our NT brand EMP protection for the speech recognition, so drones can get damaged if subjected to heavy EMP radiation.
    • -
    • We figured out why drones couldn't remove objects from people, that has been fixed.
    • -
    • The standby light wasn't wired correctly.
    • -
    • Unfortunately one of our assistants tasked with transporting the only copy of the data dropped the flash drive in hot water because he wanted to see what "drone tea" tasted like. You'll have to discover them again.
    • -
    -

    Lo6a4evskiy updated:

    -
      -
    • Station's crayons have been upgraded to the version 2.0 of ColourOS. Don't worry, they are still edible!
    • -
    • Many items now have different stripping delays. Heavier and more armored pieces of clothing are generally more difficult to take off someone else, while smaller items can be very easy to snatch. Pockets always take 4 seconds to search.
    • -
    -

    MrPerson updated:

    -
      -
    • Implants are activated via action buttons on the top-left corner of your screen instead of emotes.
    • -
    -

    Paprika updated:

    -
      -
    • Added zipties for security and nuke operatives. These have a slightly shorter 'breakout time' as normal cuffs but they are destroyed upon removal. Beepsky and sec borgs now use these by default.
    • -
    • Changed the medical HUD in the tactical medkit to a night vision HUD so syndicate medics don't stumble around in the dark. Can be purchased through nuke op uplinks.
    • -
    • Added a second roboticist roundstart job slot.
    • -
    • Added a third cargo tech job slot.
    • -
    -

    Paprka updated:

    -
      -
    • Added undershirts as a companion piece to jumpsuit adjusting. Beat the heat with a comfortable tank top, or warm up with an extra layer tshirt!
    • -
    • Added a holographic sign projector to replace the old wet floor signs to encourage janitors to warn crewmembers about wet floors.
    • -
    -

    optimumtact updated:

    -
      -
    • Medical supplies crate now comes with a boxy full of bodybags
    • -
    - -

    09 October 2014

    -

    Paprika updated:

    -
      -
    • Added inaprovaline MediPens (autoinjectors) that replace inaprovaline syringes in medkits. Like the syringes, these can be used to stabilize patients in critical condition, but require no medical knowledge to use.
    • -
    • Reverted the mining scanner to a manual scanner.
    • -
    • Buffed the rate of the automatic scanner
    • -
    • Added automatic scanner to equipment locker. It is also available by redeeming your voucher.
    • -
    • Reduced the size of the mining jetpack, it now fits in backpacks. The capacity of the jetpack has been reduced as well, however.
    • -
    • Removed resonator from the mining voucher redemption. Replaced it with a mining drill.
    • -
    - -

    08 October 2014

    -

    Cheridan updated:

    -
      -
    • Flash mechanics changed. Instead of a knockdown effect, it will cause a stumbling effect. This includes area-flashing. The five-use-per-minute limit has been removed. "Synthetic" flashes made in the protolathe are now normal flashes.
    • -
    -

    Paprika updated:

    -
      -
    • Added a unique shield to the Head of Security's locker. It can be concealed for storage and activated like an energy shield, but functions like a riot shield. It can also be made at the protolathe.
    • -
    • Marauders: Due to your extremely great performance as of late, we've added a new equipment room on Mother Base. A lot of your equipment has been moved to this room, as well as some new equipment added onto the Mothership. Take some extra time to familiarize yourself with the placement of your equipment.
    • -
    • Oh, and you guys have a space carp now too.
    • -
    -

    Paprka updated:

    -
      -
    • Added jumpsuit adjusting. Adjust your jumpsuit to wear it more casually by rolling it down or roll up those sleeves of that hard-worn suit!
    • -
    • Added a grey alternative to the detective's suit and trenchcoat. Now you can be a noir private investigator!
    • -
    -

    Tkdrg updated:

    -
      -
    • Space Station 13 has been deployed with transit tube dispensers. Central Command encourages the engineering department to repair and improve the station using this equipment.
    • -
    - -

    05 October 2014

    -

    Ikarrus updated:

    -
      -
    • Character Save Files will now remember Species.
    • -
    -

    Miauw updated:

    -
      -
    • Added 5 new maintenance ambience tracks, made by Cuboos.
    • -
    -

    Nobalm updated:

    -
      -
    • Added examine descriptions to twenty eight objects.
    • -
    -

    Paprika updated:

    -
      -
    • Due to some payroll cuts affecting lower-rank crewmembers on Space Station 13, we fear that uprisings and mutinies might be approaching. To help defend themselves, all heads of staff have been given telescopic batons to subdue attackers should they be assaulted during their shifts.
    • -
    • Toolbelts can now hold pocket fire extinguishers. Atmos technicians spawn with them.
    • -
    • Remember those magboots we had our undercover agents steal? Well we've finally reverse engineered them. Not only that, but we gave them a killer paintjob. They will be available in the uplinks of boarding parties we send out to Nanoscum stations.
    • -
    • Listen up, Marauders! The Syndicate has recently cut back funding into boarding parties. What this means is no more hi-tech fancy energy guns. We've had to roll back to using cheaper, mass-produced automatic shotguns. But in retrospect, could this possibly be a downgrade?
    • -
    - -

    01 October 2014

    -

    Cheridan updated:

    -
      -
    • Experienced smugglers have joined the Syndicate, adding their bag of tricks to its arsenal. These tricky pouches can even fit under floor plating!
    • -
    -

    Ikarrus updated:

    -
      -
    • Adds Gang War, a new game mode still in alpha development.
    • -
    -

    Incoming5643 updated:

    -
      -
    • After a public relations nightmare in which a horde of 30 assistants violently dismembered a sole commander the revolution has begin tactically reducing their initial presence in stations with weak command structures. Should stations add to their command staff during the shift additional support will be provided.
    • -
    • Too many instances of crying CMOs hiding in the lockers of supposedly secured revoulutionary stations has lead to a crackdown on revolutionary policy. You must kill or maroon the entire command staff, reguardless of when they reached the station.
    • -
    • Intense study into the underlying structure of the universe has revealed that everything fits into a massive SPACECUBE. This deep and profound understanding has led to a revolution in cross surface movement, and spacemen can look forward to a new era of predictable and safe space-fairing.
    • -
    -

    Jordie0608 updated:

    -
      -
    • Grille damage update, humans now deal less unarmed damage to grilles while projectiles and items deal more.
    • -
    • Replaced all AI turrets with porta-turrets that work on LoS instead of area and can be individually configured
    • -
    -

    Miauw updated:

    -
      -
    • Voice changer masks work again.
    • -
    • You can now turn voice changer masks on/off by activating them in your hand. They start off.
    • -
    • The amount of TC has been increased to 20, but the price of all items has been doubled as well
    • -
    • With this, the prices of stealthy items has been slightly decreased and the prices of offensive items slightly increased (+/- 1 TC)
    • -
    -

    RemieRichards, JJRcop updated:

    -
      -
    • New research in the area of robotics has been published on Maintenance Drones, little robots capable of repairing and improving the station. Unfortunately, all of the research was lost in a catastrophic server fire, but we know they can be made, so it's up to you to re-discover them! Make us proud!
    • -
    -

    phil235 updated:

    -
      -
    • Changed all clone damage descriptions to use the term cellular damage to avoid confusion with genetics mutations.
    • -
    - -

    07 September 2014

    -

    Gun Hog updated:

    -
      -
    • Nanotrasen scientists have released a Heads-Up-Display (HUD) upgrade for all AI and Cyborg units! Cyborgs have had Medical sensors and a Security datacore integrated into their core hardware, replacing the need for a specific module.
    • -
    • AI units are now able to have suit sensor or crew manifest data displayed to them as a visual overlay. When viewing a crewmember with suit sensors set to health monitoring, the health status will be available on the AI's medical HUD. In Security mode, the role as printed on the crewmember's ID card will be displayed to the AI.
    • -
    • Any entity with a Security or Medical HUD active will recieve appropriate messages on that HUD.
    • -
    -

    Ikarrus updated:

    -
      -
    • Server Operators: A new config option added to restrict command and security roles to humans only. Simply add/uncomment the line ENFORCE_HUMAN_AUTHORITY in game_options.txt. -
    • Players: To check if this config option is enabled on your server, type show-server-revision into the game's command line. -
    • -
    - -

    06 September 2014

    -

    Ikarrus updated:

    -
      -
    • Tampered supply ordering consoles can now order dangerous devices directly from the Syndicate for 140 points. -
    • Securitrons line units will no longer arrest individuals without IDs if their faces can still be read. -
    • Enemy Agent ID cards have been reported to be able to interfere with the new securitron threat assessment protocols. -
    • The Syndicate base has been modified to only allow the leading operative to launch the mission. -
    • -
    - -

    04 September 2014

    -

    KyrahAbattoir updated:

    -
      -
    • All the objects found in BoxStation maintenance are now randomized at round start.
    • -
    - -

    03 September 2014

    -

    Ikarrus updated:

    -
      -
    • Cost of Syndicate bombs increased to 6 telecrystals.
    • -
    -

    JStheguy updated:

    -
      -
    • Many new posters have been added.
    • -
    - -

    01 September 2014

    -

    ChuckTheSheep updated:

    -
      -
    • Adds preference toggle for intent selection mode. -
    • Direct selection mode switches intent to the one you click on instead of cycling them. -
    • -
    -

    Ikarrus updated:

    -
      -
    • New more detailed End-Round report. -
    • Removes count of readied players from the lobby. -
    • -
    -

    Jordie0608 updated:

    -
      -
    • Virology has been made the right color.
    • -
    -

    Miauw updated:

    -
      -
    • A major rework of saycode has been completed which fixes numerous issues and improves functionality. -
    • Please report any issues you notice with any form of messaging to Github. -
    • -
    - -

    31 August 2014

    -

    Tokiko1 updated:

    -
      -
    • Adds two new hairstyles.
    • -
    - -

    30 August 2014

    -

    Ikarrus updated:

    -
      -
    • Space Station 13 has been authorized to requisition additional Tank Transfer Valves from Centcom's supply lines for the price of 60 cargo points.
    • -
    - -

    26 August 2014

    -

    Ikarrus updated:

    -
      -
    • Security forces are advised to increase scrutiny on personnel coming into contact with AI systems. Central Intelligence suggests that Syndicate terrorist groups may have begun targeting our AIs for destruction. -
    • For the preservation of corporate assets, Central Command would like to remind all personnel that evacuating during an emergency is mandatory. We suspect that terrorist groups may be attempting to abduct marooned personnel who failed to evacuate. -
    • R&D; teams have released an urgent update to station teleporters. To eliminate the risk of mutation, personnel are advised to calibrate teleporters before attempting each use. -
    • Centcom has approved the Captain's request to rig the display case in his office with a burglar alarm. Any attempts to breach the case will now trigger a lockdown of the room. -
    • **Crew Monitoring Consoles now scan their own Z-level for suit sensors, instead of only scanning Z1. -
    • **Server operators can now set a name for the station in config.txt. Simply add the line "STATIONNAME Space Station 13" anywhere on the text file. Replace Space Station 13 with your station name of choice.
    • - -
    - -

    24 August 2014

    -

    Ikarrus updated:

    -
      -
    • Ore redemption machine can now smelt plasteel.
    • -
    • Mulebot speed has been vastly increased by up to 300%.
    • -
    • Removed exploit where false walls can be used to cheese the AI chamber's defenses
    • -
    - -

    21 August 2014

    -

    Ikarrus updated:

    -
      -
    • The Phase Shift ability will no longer instantly gib players. Instead, they will be knocked out for a few seconds. Mechas will be damaged.
    • -
    • The Phase Slayer ability will no longer instantly gib players. Instead, they will be dealt 190 brute damage. Mechas will be dealt 380 damage.
    • -
    • ADMIN: Most Event buttons have been moved out of the secrets menu and into a Fun verb.
    • -
    - -

    20 August 2014

    -

    Cheridan updated:

    -
      -
    • Three new shotgun shells added. Create them by first researching and printing an unloaded tech shell in R&D.; Afterwards, use table-crafting with the appropriate components with a screwdriver in-hand.
    • -
    • Meteorshot: tech shell + compressed matter cartridge + micro(or better) manipulator.
    • -
    • Pulse Slug: tech shell + advanced capacitor + ultra micro-laser.
    • -
    • Dragonsbreath: tech shell + 5 phosphorus (in container).
    • -
    • Incendiary rounds now leave a blazing trail as they pass. This includes existing incendiary rounds, new dragonsbreath rounds, and the Dark Gygax's carbine.
    • -
    - -

    19 August 2014

    -

    Ikarrus updated:

    -
      -
    • Brig cells and labour shuttle have both been modified to send a message to all security HUDs whenever a prisoner is automatically released.
    • -
    • The labour camp has been outfitted with a points checking console to allow prisoners to check their quota progress easier and better explain the punishment system of forced labour.
    • -
    - -

    18 August 2014

    -

    Iamgoofball updated:

    -
      -
    • 25 new hairstyles have been added.
    • -
    - -

    15 August 2014

    -

    AndroidSFV updated:

    -
      -
    • AI photography has been extended to Cyborgs. While connected to an AI, all images taken by cyborgs will be placed in the AI's album, and viewable by the AI and all linked Cyborgs.
    • -
    • When a Cyborgs AI link wire is pulsed, the images from the Cyborgs image album will be synced with the AI it gets linked to.
    • -
    • Additonally, Cyborgs are able to attach images to newscaster feeds from whichever album is active for them. Cyborgs are also mobile, inefficent, printers of same images.
    • -
    - -

    11 August 2014

    -

    Ikarrus updated:

    -
      -
    • Boxstation map updates:
      - -Singularity engine walled from from outer space
      - -Shutters for exterior Science windows
      - -Teleporter board moved from RD's Office to Tech Storage now that the teleporter can be built again.
      - -Security Deputy Armbands (red) added in HoS's Office



    • -
    - -

    14 July 2014

    -

    Miauw updated:

    -
      -
    • Added a new mutetoxin that can be made with 2 parts uranium, 1 part water and 1 part carbon and makes people mute temporarily
    • -
    • Parapens were renamed to sleepy pens and now contain 30 units of mutetoxin and 30 units of sleeptoxin instead of zombie powder.
    • -
    • C4 can no longer be attached to mobs
    • -
    • Reduced the C4 price to 1 telecrystal
    • -
    - -

    07 July 2014

    -

    Firecage updated:

    -
      -
    • We, of the NanoTrasen Botany Research and Developent(NTBiRD), has some important announcements for the Botany staff aboard our stations.
    • -
    • We have recently released a new strain of Tower Cap. It is now ensured that more planks can be gotten from a single log.
    • -
    • Head Scientist [REDACTED] is thanked for his new strain of Blood Tomatoes. It now not only contains human blood, but also chunks of human flesh!
    • -
    • We have also discovered a way to replant the infamous Cash Trees and 'Eggy' plants. We can now harvest their seeds, and the rare products are inside the fruit shells.
    • -
    • Similar to the new variety of Tower Caps, it is now possible to get various grass flooring depending on the plants potency!
    • -
    • Our sponsors at Knitters United has released a new variation of the botany Aprons and Coveralls which can hold a larger variety of items!
    • -
    • A new version of Plant-B-Gone was produced which are much more lethal to plants, yet at the same time has no extra effect on humans besides the norm.
    • -
    -

    Paprika updated:

    -
      -
    • Tweaked mining turf mineral droprates and reverted mesons to the 'old' style of mesons. This means mesons will be more powerful with the added side effect of not being able to track individual light sources through walls and such. This is a trial run; please provide feedback on the /tg/ codebase section of the forum.
    • -
    - -

    05 July 2014

    -

    Firecage updated:

    -
      -
    • Recently the Space Wizard Federation, with some assistance from the Cult of Nar-Sie, recently created a new strain of Killer Tomato. A sad side effect is this effected all current and future Killer Tomato strains in our galaxy. They are now reported to be extremely violent and deadly, use extreme caution when growing them.
    • -
    - -

    03 July 2014

    -

    Miauw updated:

    -
      -
    • Added slot machines to the game
    • -
    • Slot machines use reels. All prizes except for jackpots can be won on all lines
    • -
    • Simply put a coin into one of the slot machines in the bar to play!
    • -
    • Slot machines can also be emagged.
    • -
    - -

    01 July 2014

    -

    Ikarrus updated:

    -
      -
    • Central Security has approved an upgrade of the Securitron line of bots to a newer model.
      Highlights include:
    • -
    • -An optional setting to arrest personnel without an ID on their uniform (Disabled by default)
    • -
    • -An optional setting to notify security personnel of arrests made by the bots (Enabled by default)
    • -
    • -A new "Weapon Permit" access type that securitrons will use during their weapons checks. Personnel who work with weapons will be granted this access by default. More can be assigned by the station's Head of Security and Personnel.
    • -
    • -A more robust threat assessment algorithm to improve accuracy in identifying perpetrators.
    • -
    -

    Rolan7 updated:

    -
      -
    • Fixed the irrigation system in hydroponics trays. Adding at least 30 units of liquid at once will activate the system, sharing the reagents between all connected trays.
    • -
    • Changelings can communicate while muzzled or monkified, and being monkified doesn't stop them from taking human form.
    • -
    • Mimes cannot break the laws of physics unless their vow is currently active.
    • -
    • Trays are rewritten to make sense and so borgs can actually use them. Service borgs can discretely carry small objects, hint hint. The items are easily knocked out of them.
    • -
    - -

    20 June 2014

    -

    Ikarrus updated:

    -
      -
    • The 'Enter Exosuit' button was removed, and you have to click + drag yourself to enter a mech now; like you would to enter a disposal unit.
    • -
    - -

    12 June 2014

    -

    Cheridan updated:

    -
      -
    • NT Baton Refurbishment Team Notice: 'Released' option in security records has been renamed 'Discharged', and the sechud icon has been changed from a blue R to a blue D. Stop beating your released prisoners, dummies; they're not revheads.
    • -
    • NT Entertainment Department Notice: The prize-dispensing mechanism in Arcade machines has been replaced with a cheaper gas-powered motor. It should still be completely safe, unless an electromagnetic field disrupts it!
    • -
    • Pill code tweaked. In short, you can feed monkeys pills now #whoa
    • -
    • Casings ejected from guns will now spin #wow
    • -
    - -

    11 June 2014

    -

    Ikarrus updated:

    -
      -
    • Having the nuke disk will no longer prevent you from using teleporters or crossing Z-levels. Leaving the Z-level however, will cause you to "suddenly lose" the disk.
    • -
    • Pulled objects will now transition with you when as you transition Z-levels in space.
    • -
    -

    Malkevin updated:

    -
      -
    • IEDs have been removed
    • -
    • Firebombs have been added
    • -
    • They're as reliable and predictable as you would expect from a soda can filled with flammable liquid and set off with an igniter contected to two wires. Use your branes and take proper precautions or leave a charred corpse, your choice.
    • -
    - -

    06 June 2014

    -

    Gun Hog updated:

    -
      -
    • Nanotrasen programmers have discovered a potential exploit involving a station's door control networks. With sufficient computing power, the network can be overloaded and forced to open or bolt closed every airlock at once.
    • -
    • Some reports suggest that the latest firmware update to Artifical Intelligence units installed in our research stations may contain this exploit. Any such reports that state that should a station's AI unit "malfunction", it may gain the ability to use this exploit to initate a full lockdown of the station. Fire locks and blast doors are also said to be affected.
    • -
    • Nanotrasen officially holds no validity to these reports. We recommend that station personnel disregard such rumors.
    • -
    - -

    20 May 2014

    -

    Kelenius updated:

    -
      -
    • After the years of extensive research into xenobiology, and thousands of scientists lost to the slimes, we have finally come to admitting that we don't have a clue how they work. However, we've outlined a few facts, and managed to breed a new kind of slimes. They will be shipped to your station on the next shifts. They are different from the ones they are used to in the following:
    • -
    • Their sight is better than ever, and now they can finally see things that are not directly pressed against them. Beware, they may appear more aggressive!
    • -
    • Their memory has also become better, and they will now remember the people who fed them. As a note, you need to grab the monkey or push it to show to the slime that you're giving it to them, and it's not just walking in.
    • -
    • Apparently, not only we have studied them, but they have also studied us. Slimes are now capable of showing various emotions, mimicking humans. Use it to your advantage.
    • -
    • There are reports of slimes showing signs of sentience. Further research is recommended.
    • -
    • One of the reported signs is their speech capability. Following facts have been gathered: they talk more often to those who feed them; they react to being called by the number, but 'slimes' is also acceptable; they are able to understand being ordered to "follow" someone, or "stop". There is a report of slime releasing the assistant after a scientist shouted at it, and then calmly ordered a slime to stop.
    • -
    • We've made a modification of a health scanner that is intended for the use on slimes. Two are available in the smartfridge.
    • -
    • We've come to a conclusion that 5 units of reagents are not necessary to cause slime core reactions. You actually only need one unit.
    • -
    - -

    16 May 2014

    -

    Menshin updated:

    -
      -
    • Thanks to Nanotrasen's Engineering division, the power wiring of the station has a received a complete overhaul. Here are the highlight features in CentCom report :
    • -
    • Improved way of connecting cables! Finished is the time of "laying and praying" : it's now as simple as matching ends of each cables!
    • -
    • Unified way of connecting machines! Every machine is connected to a powernet through a node cable (it still needs to be anchored to receive power though)!
    • -
    • Lots of improvements in the cable cutting tools! Gone is the odd magic of physically separated yet still connected powernets (contact CentCom Engineering Division if you still witness something weird, we always have a fired form ready for our engineers!)!
    • -
    • Any conscientious (or not!) Station Engineer may check an "updated wiring manual" at http://www.tgstation13.org/wiki/Wiring#Power_Wires
    • -
    - -

    14 May 2014

    -

    Ikarrus updated:

    -
      -
    • A recent breakthrough in Plasma Materials Research has led to the development of a stronger, tougher plasteel alloy that can better resist extreme heat by up to four times. A live demonstration preformed during a press conference earlier today showed a segment of reinforced wall resisting an attack by Thermite. The corporation also announces that upgrades to its existing stations is already underway.
    • -
    - -

    07 May 2014

    -

    /Tg/station Code Management updated:

    -
      -
    • /tg/station code is now under a feature freeze until 7th June 2014. This means that the team will be concentrating on fixing bugs instead of adding features for the month.
    • -
    • You can find more information about the feature freeze here. http://tgstation13.org/phpBB/viewtopic.php?f=5&t;=273
    • -
    • This is the perfect time to report bugs, which you can do so here. https://github.com/tgstation/-tg-station/issues/new
    • -
    - -

    30 April 2014

    -

    Giacom updated:

    -
      -
    • You now have to give a reason when calling the shuttle.
    • -
    • The amount of time it takes for the shuttle to refuel is now a config option, the default is 20 minutes.
    • -
    -

    Gun Hog updated:

    -
      -
    • Certain Enemies of the Corporation have discovered a critical exploit in the firmware of several NanoTrasen robots that could prevent the safe shutdown of units corrupted by illegally modified ID cards, dubbed "cryptographic sequencers".
    • -
    • NanoTrasen requires more research into this exploit, this we have issued a patch for AI and Cyborg software to simulate this malfunction. All NanoTrasen AI units are advised to only allow testing in a safe and contained environment. The robot can safely be reset at any time.
    • -
    • Unfortunately, a robot corrupted by a "cryptographic sequencer" still cannot be reset by any means. NanoTrasen urges regular maintenance and care of all robots to reduce replacement costs.
    • -
    - -

    27 April 2014

    -

    Ikarrus updated:

    -
      -
    • NT Human Resources announces an expansion of the List of Company-Approved Hair Styles, as well as more relaxed gender restrictions on hair styles. Check with your local company-sponsored hairstylist to learn more.
    • -
    - -

    22 April 2014

    -

    Ikarrus updated:

    -
      -
    • ID Computers have been modified to allow Station Heads of Staff to assign and remove access to their departments, as well as stripping the rank of their subordinates. An ID computer on the bridge is available for the use of this function.
    • -
    - -

    20 April 2014

    -

    Gun Hog updated:

    -
      -
    • NanoTrasen Emergency Alerts System 4.20 has been released!
    • -
    • In the unfortunate event of any nuclear device being armed, the station will enter Code Delta Alert.
    • -
    • Should the nuclear explosive be disarmed, the station shall automatically return to its previous alert level.
    • -
    -

    Steelpoint updated:

    -
      -
    • A new AI satellite has been constructed in orbit of Space Station 13!
    • -
    • The satellite exclusivly is used to hold a station's Artifical Intelligence Unit, the satellite contains a miried of turret and motion sensor defences. A transit tube network is used to connect the satellite to the station, with the transit room being located at engineering south of the engi escape pod.
    • -
    • The AI Upload however has been moved north slightly and is connected directly to the bridge.
    • -
    • In addition, the Gravity Generator has been relocated from its prior position in engineering to the location of the old AI Upload, increasing its defence and logical positioning.
    • -
    - -

    11 April 2014

    -

    Jordie0608 updated:

    -
      -
    • Wood planks can be used to make wood walls and airlocks; flammability not included
    • -
    - -

    10 April 2014

    -

    Ikarrus updated:

    -
      -
    • Centcom officials have announced a new initiative to combat misuse of their Emergency Shuttle Service. After the shuttle has been recalled several times over the course of a simple work shift, Centcom will attempt to trace the signal origin and pinpoint its source for station authorities.
    • -
    -

    Steelpoint updated:

    -
      -
    • Thanks to Nanotrasen's Construction division, the brig has recieved a overhaul in its design, to increase ease of movement, including an addition of a "prisioner release room" and a insanity ward. -
    • Furthing concerns among commentators, Nanotrasen has shipped out additional security equipment to station armories, including Riot Shotguns, tear gas grenades, additional securitron units and military grade Ion Guns.
    • -
    • JaniCo have released a new unique product called the JaniBelt. Capable of holding most standard issue janitorial equipment, designed to help relive inventory management among station janitors. In addition the Jani Water Tank has had its reserve of space clenaer increased to 500 units, up from 250. -
    • -
    -

    Validsalad updated:

    -
      -
    • After concerns raised by security personel, new armor has been shipped that covers the lower waist and readjusts the helmet for comfort. -
    • In addition, the aging riot shield has been replaced with a newer, more modern, apperance. -
    • -
    - -

    03 April 2014

    -

    Ikarrus updated:

    -
      -
    • NT AI Firmware version 2554.03.03 includes a function to notify the master AI when a new cyborg is slaved to it.
    • -
    - -

    02 April 2014

    -

    Giacom updated:

    -
      -
    • The syndicate suit is now black and red, because black and red is the new red.
    • -
    • The Ruskie DJ Station now has a classy orange syndicate suit.
    • -
    • Security officers have been equipped with the latest in flashlight technology. You can find a SecLite™ inside your security belt or you can dispense one from the security vending machine.
    • -
    -

    Ikarrus updated:

    -
      -
    • Nanotrasen Construction division is pleased to announce the unveiling of our brand now state-of-the-art Space Station 13 v2.1.3!
    • -
    • -Scaffolding used during construction has been repurposed as an expanded maintenance around the station.
    • -
    • -Our new Emergency Transport Shuttle Mk III will be making its debut in times of crisis. Includes a new cargo area and extra security features.
    • -
    • -A redesigned brig will give security staff more peace of mind with added security features
    • -
    • -The armory is now protected by a motion alarm.
    • -
    • -The armory is now equipped with security hardsuits.
    • -
    • -A new command EVA wing has been added to EVA Storage. Station heads of staff will be able to make use of suits stored here.
    • -
    • -A new garden area will be made publicly available for everyone to enjoy some R&R; during their company-endorsed break periods
    • -
    • -A new Testing Lab has been added to the Science department for any field experiments that need to be run.
    • -
    • -The mining ore redemption machine has been relocated to the Cargo Delivery Office.
    • -
    - -

    01 April 2014

    -

    Aranclanos updated:

    -
      -
    • Made combat more hardcore for hardcore players like myself. This won't be reverted.
    • -
    -

    Malkevin updated:

    -
      -
    • Sacrifice Cult - Cult has received a massive overhaul to how it works, focusing more on cult magics and sacrificing unbelievers. The most important changes are:
    • -
    • Cult starts off with alot more cultists, 6 cultists below 30 players and 9 above. The HoP can no longer be a round start cultist but is still convertible.
    • -
    • Cultists start off with join, blood, self, and hell. These give the runes for the sacrifice and convert.
    • -
    • Conversions now require three cultists and converts no longer reward words, words must be obtained via sacrifice
    • -
    • Sacrificing players traps their soul in a soul stone, which can then be used on construct shells to implant the souls in them
    • -
    • Constructs shells can be summoned via a new rune (travel, hell, technology)
    • -
    • You can no longer convert the sacrifice target, you dozzy sods
    • -
    • Summoning Narsie when she is not an objective leads to !!FUN!!
    • -
    • Wrote a system to allow all mob types to be sacrificable - currently only corgis are in the new system
    • -
    • Holy Water will DECONVERT cultists, takes around 35 units and two minutes to succeed
    • -
    • Hitting a mob that contains holy water with a tome will convert that water to unholy water, conversely hitting any container that contains unholy water with a bible as chaplain will 'cleanse' the taint.
    • -
    • Unholy water works like a combination synaptazine and hyperzine, with a twist of branes dimarge and highly toxic to non-cultists
    • -
    • Cargo can order a religious supplies crate - it contains flasks of holy water, candles, bibles, and robes
    • -
    • Cultists have an innate ability to communicate to the cult hive mind (BE AWARE - THIS DOES A LOT OF DAMAGE), cultists can also communicate via the new Commune option on their tomes (the Read Tome option has been shifted under the Notes option)
    • -
    -

    MrStonedOne updated:

    -
      -
    • Cyborgs can now use AI click shortcuts. (shift click on doors opens them, etc) (including ones added below)
    • -
    • New silicon click shortcut: Control+Shift click on doors toggles access override
    • -
    • New silicon click shortcut: Control click turret controls toggles them on or off
    • -
    • New silicon click shortcut: Alt click turret controls toggles lethal on or off
    • -
    • Cyborg hotkey mode was massively improved. 1-3 selects module slot, q unloads the active module. use hotkeys-help as cyborg for more details
    • -
    - -

    31 March 2014

    -

    Ikarrus updated:

    -
      -
    • Fabricator blueprints for cyborg parts have been updated to allow the debugging of cyborg units prior to boot. To access the debug functions, assemble a cyborg following standard procedure. Before inserting the MMI, use a multitool on the cyborg body. Note that this update also moves designation data into the system files, so pens can no longer be used to name cyborgs.
    • -
    -

    MrPerson updated:

    -
      -
    • Toggling the "Play admin midis" preference will pause any playing songs. Turning midis back on will resume the current song where it was.
    • -
    • If there's a song playing while you have midis off and you then turn midis on, the current song will begin playing for you.
    • -
    - -

    28 March 2014

    -

    Aranclanos updated:

    -
      -
    • Workaround with the click cooldowns. They should feel faster. If you think that anything needs a click cooldown (like grilles, mobs, etc.), report it to me.
    • -
    • Here's the fun part, this is a test for the community and players, I hope I won't be forced to revert this and hear "this is why we can't have nice things". Again, if anything needs a cooldown, report it to me. Have fun with your fast clicks spessmans.
    • -
    - -

    25 March 2014

    -

    Ikarrus updated:

    -
      -
    • A security review committee has approved an update to all Nanotrasen airlocks to better resist cryptographic attacks by the enemy. -

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




    • -
    • Hair sprites have been given a visual lift. For best results, set your hair color to be slightly lighter than how you want it to look. For dark hair, do not use a color darker than 80% black.
    • -
    - -

    22 March 2014

    -

    Giacom updated:

    -
      -
    • Gravity is no longer beamed from CentCom! Instead, there is a new gravity generator stored near Engineering that will provide all the gravity for the station and the z level. Please remember that it gives off a lot of radiation when charging or discharging, so wear protection.
    • -
    -

    MrPerson updated:

    -
      -
    • Added a new, somewhat experimental system to delete things. This is basically a port from /vg/, so big thanks to N3X15.
    • -
    • As a result, bombs and the singularity should be much less laggy.
    • -
    • There may be issues with "phantom objects" or other problems with stuff that's suppoed to be deleted or objects interacting with deleted objects. Please report any issues right away!
    • -
    - -

    18 March 2014

    -

    Ikarrus updated:

    -
      -
    • NT R&D; releases AI Patch version 2553.03.18, allowing all Nanotrasen AIs to override the access restrictions on any airlock in case of emergency. Nanotrasen airlocks have been outfitted with new amber warning lights that will flash while the override is active. Should maintenance teams need to restore an airlock's restrictions without using the AI, pulsing the airlock's ID Scanner wire will reset the override.
    • -
    - -

    17 March 2014

    -

    Giacom updated:

    -
      -
    • Machines that had their programming overriden by a Malf AI will no longer attack loyal cyborgs; they will still attack cyborgs that aren't loyal, to the Malf AI that hacked them, though.
    • -
    • You only require a single unit of blood to mutate viruses now, instead of 5.
    • -
    - -

    15 March 2014

    -

    Steelpoint/Validsalad updated:

    -
      -
    • After a review with CentCom, all Security Officers will now begin their shifts with a Stun Baton in their backpack. To avoid inflating costs however all Stun Batons have been removed from Security lockers except from the brig.
    • -
    • After decades of usage CentCom has replaced the Security Uniform, Armor, Belt and Helmet with a newer, more modern design.
    • -
    - -

    14 March 2014

    -

    Ikarrus and Nienhaus updated:

    -
      -
    • Nanotrasen Corporate announced a revised dress codes primarily affecting senior station officers. A new uniform for Heads of Personnel will be shipped out to all NT Research stations.
    • -
    - -

    12 March 2014

    -

    Yota updated:

    -
      -
    • Cameras finally capture the direction you are facing.
    • -
    - -

    10 March 2014

    -

    Giacom updated:

    -
      -
    • Added two new plasma-level disease symptoms, both are very !FUN! and mess with your genetics.
    • -
    • Virologists now only need to use a single unit of virus food, mutagen or plasma to generate symptoms. You can take a single unit by using a dropper, if you change its unit transfer amount in the object tab..
    • -
    • Changed the map to make it harder to escape from the Labor Camp. Please continue using it.
    • -
    -

    Miauw updated:

    -
      -
    • Added changeling space suits. These allow changelings to survive in space, internals are not needed. They do not provide any sort of armor and slow your chemical regeneration.
    • -
    - -

    05 March 2014

    -

    Various Coders updated:

    -
      -
    • Ling rounds are LINGIER, with more lings at a given population.
    • -
    • Many simple animals can ventcrawl, including bats. All ventcrawlers must alt-click to ventcrawl.
    • -
    • An automatic tool to store and replace machine parts has been added to R&D.;
    • -
    • Most stuns have been reduced in from 10+ to 5 ticks in duration.
    • -
    • Shoes no longer speed you up.
    • -
    • Added fancy suits, which can be orderd from cargo.
    • -
    • Added sombrerors and ponches.
    • -
    • Cuff application time reduced 25%.
    • -
    • Fire will cause fuel tanks to explode.
    • -
    • Mutagen has been reduced in lethality. Notably, 15 units are not guaranteed to crit the recipient.
    • -
    - -

    03 March 2014

    -

    ChuckTheSheep updated:

    -
      -
    • Round-end report now shows what items were bought with a traitor's or nuke-op's uplink and how many TCs they used.
    • -
    -

    Drovidi Corv updated:

    -
      -
    • Facehuggers no longer die to zero-force weapons or projectiles like lasertag beams.
    • -
    -

    Incoming5643 updated:

    -
      -
    • Improved blob spores to zombify people adjacent to their tile.
    • -
    • If a hand-teleporter is activated while you're stuck inside a wall, you'll automatically go through it.
    • -
    -

    Miauw updated:

    -
      -
    • Decreased the lethality of Mutagen in small doses.
    • -
    -

    TZK13 updated:

    -
      -
    • Added Incendiary Shotgun Shells made at a hacked autolathe; Xenos be wary.
    • -
    -
    -

    26 February 2014

    -

    Incoming5643 updated:

    -
      -
    • Color blending Kitty Ears have returned.
    • -
    -
    - -
    -

    25 February 2014

    -

    Incoming5643 updated:

    -
      -
    • Colored burgers! Include a crayon in your microwave when cooking a burger and it'll come out just like a Pretty Pattie.
    • -
    • Fixed AI's being able to interact with syndicate bombs.
    • -
    -
    - -
    -

    24 February 2014

    -

    Ergovisavi updated:

    -
      -
    • Added Advanced Mesons and Night Vision Goggles to the protolathe.
    • -
    -

    Giacom updated:

    -
      -
    • Silicons no longer stop statues from moving when in sight.
    • -
    • Increased the health of statues.
    • -
    • Increased the range of statues's blinding spell.
    • -
    -

    HornyGranny updated:

    -
      -
    • Reduced the range of Violin notes.
    • -
    • Low quality violin midi-notes replaced with better .ogg-notes.
    • -
    -

    Incoming5643 updated:

    -
      -
    • Improved the Syndicate Implant bundle to contain freedom, uplink, EMP, adrenalin and explosive implanters.
    • -
    • Added Mineral Storeroom to R&D; containing the Ore Redemption Machine; no more assistants stealing your ore in the open hallway.
    • -
    -

    Miauw updated:

    -
      -
    • No more removing cursed horseheads.
    • -
    -

    Razharas updated:

    -
      -
    • Fixed infinite telecrystal exploit.
    • -
    -
    - -
    -

    19 February 2014

    -

    Aranclanos updated:

    -
      -
    • Removed the chance of your hat falling off when slipping.
    • -
    -

    Perakp updated:

    -
      -
    • Added Iatot's cyborg module selection transformation animations.
    • -
    -
    - -
    -

    17 February 2014

    -

    Ergovisavi updated:

    -
      -
    • Mining has been significantly overhauled. Hostile alien life has infested the western asteroid! Miners are given an equipment voucher to obtain equipment to protect themselves. There is a spare voucher in the HoP's office, should someone want to switch to mining mid-shift.
    • -
    • The Ore Redemption Machine has been added just outside of the Science wing. Ore goes in, Sheets go out, and points are tallied on the machine. Insert your ID to claim points, then spend them on goods at Mining Equipment Lockers. You require specific accesses to tell the Ore Redemption Machine to unload its sheets.
    • -
    • Should you not care for being eaten alive by horrible alien life, it is suggested you stick to the eastern asteroid, where there is no hostile alien life... though the yield on ore is not as good.
    • -
    • Most ore is no longer visible to the naked eye. You must ping it with a Mining Scanner (Available in all mining lockers) to locate nearby ore. Make sure to equip your mesons first, or it won't be visible.
    • -
    • Mesons no longer remove the darkness overlay, you must properly light your environment. Hull breaches to space can still be clearly seen, and it will still protect you from the singulo.
    • -
    • Mineral spawn rates have been significantly tweaked to cut down on unnecessary inflation of mineral economy.
    • -
    • The asteroid no longer has ambient power on the entire asteroid. AI's who go onto asteroid turf will slowly die of power loss. Mining outposts are unaffected.
    • -
    • Fixed an issue where projectiles shot by simple mobs or thrown would hit multiple times.
    • -
    -

    Fleure updated:

    -
      -
    • Reduced chicken crates to contain 1-3 chicks, down from 3-6
    • -
    • Increased fertile chicken egg chance from 10% to 25%
    • -
    -

    Yota updated:

    -
      -
    • Photograph now rendered crisp and clean, so that we may enjoy them in their 0.009 megapixel goodness.
    • -
    • Cameras should now capture more of what they should, and less of what they shouldn't.
    • -
    -
    - -
    -

    09 February 2014

    -

    ADamDirtyApe updated:

    -
      -
    • The lawyer now spawns with a Sec Headset.
    • -
    -

    Demas updated:

    -
      -
    • Banana peel size is based on banana size.
    • -
    • Bigger peels slip for longer than smaller ones. Remember that produce size is based on potency.
    • -
    • The clown now spawns with a decent sized banana.
    • -
    • The banana mortar now shoots 65 potency peels.
    • -
    -

    Giacom updated:

    -
      -
    • A new hostile statue mob, can only move when not being observed, tends to break lights and cause blindness.
    • -
    -

    Incoming5643 updated:

    -
      -
    • Blob Zombies! When a Blob Spore moves over a dead human body it will infect the body and revive it as a more powerful varient of the spore. Has double the health and deals more damage.
    • -
    -

    Neerti updated:

    -
      -
    • Sec Belts can now hold Stun Batons.
    • -
    • Stun Batons now only take 10 seconds to fully recharge.
    • -
    -

    Razharas updated:

    -
      -
    • Tables can now be used as an alternative way to craft makeshift items. Simply click-drag table to yourself bring up a list.
    • -
    -

    adrix89 updated:

    -
      -
    • Spray Bottles can no longer wet up to three tiles with water.
    • -
    • Spray Bottles have a third higher release volume that wets a single tile.
    • -
    • Water slip times are reduced to the same stun times as soap.
    • -
    -
    - -
    -

    08 February 2014

    -

    MrPerson updated:

    -
      -
    • Added a NanoUI for the SMES
    • -
    -

    Razharas updated:

    -
      -
    • Adds more constructible and deconstructable machines!
    • -
    • Added constructible miniature chemical dispensers, upgradable
    • -
    • Sleepers are now constructible and upgradable, open and close like DNA scanners, and don't require a console
    • -
    • Cryogenic tubes are now constructible and upgradable, open and close like DNA scanners, and you can set the cryogenic tube's pipe's direction by opening its panel and wrenching it to connect it to piping
    • -
    • Telescience pads are now constructible and upgradable
    • -
    • Telescience consoles are now constructible
    • -
    • Telescience tweaked (you can save data on GPS units now)
    • -
    • Teleporters are now constructible and upgradable, the console has a new interface and you can lock onto places saved to GPS units in telescience
    • -
    • Teleporters start unconnected. You need to manually reconnect the console, station and hub by opening the panel of the station and applying wire cutters to it.
    • -
    • Biogenerators are now constructible and upgradable
    • -
    • Atmospherics heaters and freezers are now constructible and upgradable and can be rotated with a wrench when their panel is open to connect them to pipes. Screw the board to switch between heater and freezer.
    • -
    • Mech chargers are now constructible and upgradable
    • -
    • Microwaves are now constructible and upgradable
    • -
    • All kitchen machinery can now be wrenched free
    • -
    • SMES are now constructible
    • -
    • Dragging a human's sprite to a cryogenic tube or sleeper will put them inside and activate it if it's cryo
    • -
    • Constructible newscasters, their frames are made with autolathes
    • -
    • Constructible pandemics
    • -
    • Constructible power turbines and their computers
    • -
    • Constructible power compressors
    • -
    • Constructible vending machines. Screw the board to switch vendor type.
    • -
    • Constructible hydroponics trays
    • -
    • Sprites for all this
    • -
    • This update will have unforeseen bugs, please report those you find at https://github.com/tgstation/-tg-station/issues/new if you want them fixed.
    • -
    • As usual, machines are deconstructed by screwing open their panels and crowbarring them. While constructing machines, examining them will tell you what parts you're missing.
    • -
    -
    - -
    -

    05 February 2014

    -

    Yota updated:

    -
      -
    • Handling a couple flashlights will no longer transform you into the sun. Each light source will have deminishing returns.
    • -
    • Inserting lights into containers should no longer dim other lights.
    • -
    -
    - -
    -

    03 February 2014

    -

    Demas updated:

    -
      -
    • Changes windoor and newscaster attack messages to be consistent with windows and grilles. This removes the distracting boldness from windoor attack messages, which is reserved for userdanger, and names the attacker.
    • -
    • Thrown items now play a sound effect on impact. The volume of the sound is based on the item's throwforce and/or weight class.
    • -
    • The fireaxe now has 15 throwforce, when previously it had only 1. But why would you throw it away, anyway?
    • -
    • Projectiles now play a sound upon impact. The volume of the sound depends on the damage done by the projectile. Damageless projectiles such as electrodes have static volumes. Practise laser and laser tag beams have no impact sound.
    • -
    • Added sear.ogg for the impacts of damaging beams such as lasers. It may be replaced if player feedback proves negative.
    • -
    -
    - -
    -

    02 February 2014

    -

    Demas updated:

    -
      -
    • Attack sounds for all melee weapons! No more silent attacks.
    • -
    • The volume of an object's attack sound is based on the weapon's force and/or weight class.
    • -
    • Welders, lighters, matches, cigarettes, energy swords and energy axes have different attack sounds based on whether they're on or off.
    • -
    • Weapons that do no damage play a tap sound. The exceptions are the bike horn, which still honks, and the banhammer, which plays adminhelp.ogg. Surely nothing can go wrong with that last one.
    • -
    • When you tap someone with an object, the message now uses "tapped" or "patted" instead of attacked. The horn still uses HONKED, and the banhammer still uses BANNED.
    • -
    • You won't get the "armour has blocked an attack" message for harmless attacks anymore.
    • -
    • Adds 5 force to the lighter when it's lit. Same as when you accidentally burn yourself lighting it.
    • -
    • Removes boldness from item attack messages on non-human mobs. The attack is bolded for a player controlling a non-human mob. Now your eyes won't jump to the chat when it's Pun Pun who's being brutalised.
    • -
    • Blood will no longer come out of non-human mobs if the attack is harmless.
    • -
    • Adds a period at the end of the catatonic human examine message. That's been bugging me for years.
    • -
    • The activation and deactivation sounds of toy swords, energy swords and energy shields are slightly quieter. Energy swords and shields are now slightly louder than toys.
    • -
    • You can no longer light things with burnt matches.
    • -
    • Match, cigarette and lighter attack verbs, forces and damage types change based on whether the object is lit or not.
    • -
    • Fixes a bug with the energy blade that kept it at weight class 5 after it was deactivated. Who cares, it disappears upon deactivation.
    • -
    • Changes the welder out of fuel message slightly to be less fragmented.
    • -
    • Removes dead air from a lot of weapon sound effects to make them more responsive. In other words, the fire extinguisher attack sound will play a lot sooner after you attack than before.
    • -
    • Equalised the peak volumes of most weapon sounds to be -0.1dB in an attempt to make volumes based on force more consistent across different sounds.
    • -
    -
    - -
    -

    01 February 2014

    -

    Ergovisavi updated:

    -
      -
    • Walking Mushrooms will now attack and eat each other! They're all a little unique from each other, no two shrooms are exactly alike, and a better quality harvest means stronger Walking Shrooms. Pit them against each other for your entertainment.
    • -
    • Each mushroom will have a different colored cap to identify them. When mushrooms eat each other, they get stronger. The resulting mushroom will drop more slices when cut down to harvest, and will have better quality slices.
    • -
    • Don't hurt them yourself, though, or you'll bruise them, and mushrooms won't get stronger from eating a bruised mushroom. If your mushroom faints, feed it a mushroom such as a plump helmet to get it back on its feet. It will slowly regenerate to full health eventually.
    • -
    -
    - -
    -

    30 January 2014

    -

    Balrog updated:

    -
      -
    • Syndicate Playing Cards can now be found on the Syndicate Mothership and purchased from uplinks for 1 telecrystal.
    • -
    • Syndicate Playing Cards are lethal weapons both in melee and when thrown, but make the user's true allegiance to the Syndicate obvious.
    • -
    • Sprites are courtesy of Nienhaus.
    • -
    -

    Demas updated:

    -
      -
    • Adds thud sounds to falling over
    • -
    • Known bug: Thuds play when cloning initialises or someone is put into cryo. This will be fixed.
    • -
    -

    Ergovisavi updated:

    -
      -
    • Gibtonite, the explosive ore, can now be found on the asteroid. It's very hard to tell between it and diamonds, at first glance.
    • -
    • Gibtonite deposits will blow up after a countdown when you attempt to mine it, but you can stop it with an analyzer at any time. It makes for a good mining explosive.
    • -
    • The closer you were to the explosion when you analyze the Gibtonite deposit, the better the Gibtonite you can get from it.
    • -
    • Once extracted, it must be struck with a pickaxe or drill to activate it, where it will go through its countdown again to explode!
    • -
    • Explosives will no longer destroy the ore inside of asteroid walls or lying on the floor.
    • -
    -

    Miauw updated:

    -
      -
    • Adds changeling arm blades that cost 20 chems and do 25 brute damage.
    • -
    • Arm blades can pry open unpowered doors, replace surgical saws in brain removal, slice tables and smash computers.
    • -
    -

    MrPerson updated:

    -
      -
    • Mobs now lie down via turning icons rather than preturned sprites.
    • -
    • You can lie down facing up or down and the turn can be 90 degrees clockwise or counterclockwise.
    • -
    • Resting will always make you lie to the right so you look good on beds.
    • -
    • Please report any bugs you find with this system.
    • -
    -

    Petethegoat updated:

    -
      -
    • Increased the walk speed. Legcuffed speed is unaffected, and is still suffering.
    • -
    • Sped up alien drones, they are now the same speed as sentinels.
    • -
    -
    - -
    -

    28 January 2014

    -

    Demas updated:

    -
      -
    • Adds thud sounds to falling over
    • -
    • Known bug: Thuds play when cloning initialises or someone is put into cryo. This will be fixed.
    • -
    -
    - -
    -

    26 January 2014

    -

    Balrog updated:

    -
      -
    • Syndicate Playing Cards can now be found on the Syndicate Mothership and purchased from uplinks for 1 telecrystal.
    • -
    • Syndicate Playing Cards are lethal weapons both in melee and when thrown, but make the user's true allegiance to the Syndicate obvious.
    • -
    • Sprites are courtesy of Nienhaus.
    • -
    -
    - -
    -

    25 January 2014

    -

    Miauw updated:

    -
      -
    • Adds changeling arm blades that cost 20 chems and do 25 brute damage.
    • -
    • Arm blades can pry open unpowered doors, replace surgical saws in brain removal, slice tables and smash computers.
    • -
    -
    - -
    -

    24 January 2014

    -

    Ergovisavi updated:

    -
      -
    • Gibtonite, the explosive ore, can now be found on the asteroid. It's very hard to tell between it and diamonds, at first glance.
    • -
    • Gibtonite deposits will blow up after a countdown when you attempt to mine it, but you can stop it with an analyzer at any time. It makes for a good mining explosive.
    • -
    • The closer you were to the explosion when you analyze the Gibtonite deposit, the better the Gibtonite you can get from it.
    • -
    • Once extracted, it must be struck with a pickaxe or drill to activate it, where it will go through its countdown again to explode!
    • -
    • Explosives will no longer destroy the ore inside of asteroid walls or lying on the floor.
    • -
    -
    - -
    -

    21 January 2014

    -

    MrPerson updated:

    -
      -
    • Mobs now lie down via turning icons rather than preturned sprites.
    • -
    • You can lie down facing up or down and the turn can be 90 degrees clockwise or counterclockwise.
    • -
    • Resting will always make you lie to the right so you look good on beds.
    • -
    • Please report any bugs you find with this system.
    • -
    -
    - -
    -

    19 January 2014

    -

    KazeEspada updated:

    -
      -
    • The water cooler is now stocked with paper cups. You can refill the cups by putting paper in it.
    • -
    -

    Rolan7 updated:

    -
      -
    • You can now sell mutant seeds, from hydroponics, to Centcom via the supply shuttle.
    • -
    • Fixes powersinks causing APCs to stop automatically recharging.
    • -
    -
    - -
    -

    17 January 2014

    -

    ManeaterMildred updated:

    -
      -
    • Changed the way the Gygax worked. It now has less defense and shot deflection, but is faster and have less battery drain per step.
    • -
    • Nerfed the Carbine's brute damage and renamed it to FNX-99 "Hades" Carbine.
    • -
    • Nerfed the Gygax defense from 300 to 250.
      - Nerfed the Gygax projectile deflection chance from 15 to 5.
      - Buffed the Gygax speed from 3 to 2, making it faster.
      - Reduced the battery use when moving from 5 to 3.
      -
      - The Mech Ion Rifle now has a faster cooldown, from 40 to 20.
      - Nerfed the carbine's Brute Damage from 20 to 5.
      -
      - Please post feedback to these changes on the forums. -







    • -
    -
    - -
    -

    15 January 2014

    -

    Dumpdavidson updated:

    -
      -
    • EMPs affect the equipment of a human again.
    • -
    • EMP flashlight now recharges over time and its description no longer reveals the illegal nature of the device.
    • -
    • EMP implant now has two uses.
      EMP kit now contains two grenades.
    • -
    -
    - -
    -

    14 January 2014

    -

    Fleure updated:

    -
      -
    • Added spider butchery.
    • -
    • Added spider meat, legs, and edible eggs.
    • -
    • Added new spider related meals.
    • -
    -

    Giacom updated:

    -
      -
    • Because of an emagged cyborg's explosion, the MMI will die with it.
    • -
    • The self-respiration symptom will now properly keep you from dying of oxygen loss.
    • -
    • The Stimulant symptom's activation chance was increased so you had a constant flow of hyperzine.
    • -
    -

    Incoming updated:

    -
      -
    • A new training bomb has been added to the armoury, which will allow you to train your wire cutting skills to disarm real syndicate bombs.
    • -
    -

    ManeaterMildred updated:

    -
      -
    • Updated research designs.
    • -
    • The Protolathe can now build a Ion Rifle.
    • -
    • The Exosuit Fabricator can now build a Mech Ion Rifle, a Mech Carbine and a Mech-Mounted Missile Rack.
    • -
    -

    SirBayer updated:

    -
      -
    • Armor now reduces damage by the protection percentage, instead of randomly deciding to half or full block damage by those percentages.
    • -
    • Shotguns, with buckshot shells, will fire a spread of pellets at your target, like a real shotgun blast.
    • -
    -
    - -
    -

    12 January 2014

    -

    VistaPOWA updated:

    -
      -
    • Added Syndicate Cyborgs.
    • -
    • They can be ordered for 25 telecrystals by Nuclear Operatives. A ghost / observer with "Be Operative" ticked in their game options will be chosen to control it.
    • -
    • Their loadout is: Crowbar, Flash, Emag, Esword, Ebow, Laser Rifle. Each weapon costs 100 charge to fire, except the Esword, which has a 500 charge hitcost. Each borg is equipped with a 25k cell by default.
    • -
    • Syndicate borgs can hear the binary channel, but they won't show up on the Robotics Control computer or be visible to the AI. Their lawset is the standard emag one.
    • -
    • Added two cyborg recharging stations to the Syndicate Shuttle.
    • -
    -
    - -
    -

    11 January 2014

    -

    Cheridan updated:

    -
      -
    • You can now upgrade laser pointers with micro laser parts. It will increase the chance of blinding people.
    • -
    -

    Errorage updated:

    -
      -
    • Cyborg modules now use a new UI, which is much quicker than a menu.
    • -
    -

    Giacom updated:

    -
      -
    • The game will now have all background operations disabled, this will result in smoother gameplay but may result in some spike lags, before being set back to normal. The gradually increasing lag should now be gone.
    • -
    • You can now emag the crusher, in disposals, to remove the safety. You can use a screwdriver to reset it to the default factory settings.
    • -
    • The toxin compensation symptom will stop giving you toxin damage while at full health.
    • -
    -

    JJRCop updated:

    -
      -
    • The new nuke toy can now be found in your local arcade machine.
    • -
    -
    - -
    -

    10 January 2014

    -

    ChuckTheSheep updated:

    -
      -
    • Morgue Trays can detect players in their bodies and will now change colour depending on a few things. Red = Dead body with no player inside. Orange = No body but items. Green = A dead body with a player inside.
    • -
    -

    Giacom updated:

    -
      -
    • You can whisper while in critical, but you will immediately die afterwards DRAMATICALLY. The closer you are to death, the less you can say.
    • -
    • The wizard won't spawn so much smoke after they blink.
    • -
    • The detective's forensic scanner was upgraded so that it can now scan from afar.
    • -
    • Made the ghost's follow button less buggy. Please make an issue report if it still bugs out.
    • -
    -

    Rumia29, Nienhaus updated:

    -
      -
    • A new alt RD uniform spawns in his locker.
    • -
    -
    - -
    -

    07 January 2014

    -

    Fleure updated:

    -
      -
    • Janitor now spawns with a service headset.
    • -
    • Backpack watertank slowdown decreased.
    • -
    -
    - -
    -

    04 January 2014

    -

    Razharas updated:

    -
      -
    • Constructable machines now depend on R&D; parts!
    • -
    • DNA scanner: Laser quality lessens irradiation. Manipulator quality drastically improves precision (9x for best part) and scanner quality allows you to scan suicides/ling husks, with the best part enabling the cloner's autoprocess button, making it scan people in the scanner automatically.
    • -
    • Clone pod: Manipulator quality improves the speed of cloning. Scanning module quality affects with how much health people will be ejected, will they get negative mutation/no mutations/clean of all mutations/random good mutation, at best quality will enable clone console's autoprocess button and will try to clone all the dead people in records automatically, together with best DNA scanner parts cloning console will be able to work in full automatic regime autoscanning people and autocloning them.
    • -
    • Borg recharger: Capacitors' quality and powercell max charge affect the speed at which borgs recharge. Manipulator quality allows borg to be slowly repaired while inside the recharges, best manipulator allows even fire damage to be slowly repaired.
    • -
    • Portable power generators: Capacitors' quality produce more power. Better lasers consume less fuel and reduce heat production PACMAN with best parts can keep whole station powered with about sheet of plamsa per minute (approximately, wasn't potent enough to test).
    • -
    • Autolathe: Better manipulator reduces the production time and lowers the cost of things(they will also have less m_amt and g_amt to prevent production of infinity metal), stacks' cant be reduced in cost, because thatll make production of infinity metal/glass easy
    • -
    • Protolathe: Manipulators quality affects the cost of things(they will also have less m_amt and g_amt to prevent production of infinity metal), best manipulators reduces the cost 5 times (!)
    • -
    • Circuit imprinter: Manipulator quality affects the cost, best manipulator reduce cost(acid insluded) 4 times, i.e. 20 boards per 100 units of acid
    • -
    • Destructive analyzer: Better parts allow items with less reliability in. Redone how reliability is handled, you now see item reliability in the deconstruction menu and deconstructing items that has same or one point less research type level will rise the reliability of all known designs that has one or more research type requirements as the deconstructed item. Designs of the same type raise in reliability more. Critically broken things rise reliability of the design drastically. Whole reliability system is not used a lot but now at least on the R&D; part it finally matters.
    • -
    -
    - -
    -

    02 January 2014

    -

    Demas updated:

    -
      -
    • Added different colours to departmental radio frequencies. Now you'll be able to filter out or pay attention to each frequency a lot easier.
    • -
    -

    Fleure updated:

    -
      -
    • Fixed bruisepacks and ointments not working.
    • -
    • Fixed injecting/stabbing mouth or eyes when only thick suit worn.
    • -
    -
    - -
    -

    01 January 2014

    -

    Errorage updated:

    -
      -
    • The damage overlay for humans starts a little later than before. It used to start at 10 points of fire + brute damage, it now starts at 35.
    • -
    -
    - -
    -

    31 December 2013

    -

    Fleure updated:

    -
      -
    • Paper no longer appears with words on it when blank input written or photocopied
    • -
    • Vending machine speaker toggle button now works
    • -
    • Building arcade machines works again
    • -
    -
    - -
    -

    27 December 2013

    -

    Giacom updated:

    -
      -
    • Light explosions will no longer gib dead bodies anymore. C4 will function the same and gib anything attached.
    • -
    • Syringe gun projectiles will now display a message when shots are deflected by space suits, biosuits and etc...
    • -
    • You can now move out of sleepers by moving, again.
    • -
    -

    Miauw updated:

    -
      -
    • Monkeys now have a resist button on their HUD.
    • -
    -
    - -
    -

    21 December 2013

    -

    Bobylein updated:

    -
      -
    • Labcoats can now store bottles, beakers, pills, pill bottles and paper.
    • -
    -

    Giacom updated:

    -
      -
    • The Labor Camp has been changed based on feedback. Ore boxes added, internals added, safety pickaxes/shovels (might revert if unliked).
    • -
    • Labor Camp prisoners, who have earned enough points for freedom, will now have to be alone in the shuttle to move it and to open the middle door; this is in order to prevent free'd prisoners from releasing their comrades.
    • -
    • Monkeys no longer walk away when being pulled or grabbed.
    • -
    • Anti-breach shield generators have a greater range, and will cover more exposed space tiles.
    • -
    -

    Jordie updated:

    -
      -
    • Blowing up borgs from the Robotics Console will now actually make them explode. Emagged Cyborgs will explode even more.
    • -
    -

    Nienhaus updated:

    -
      -
    • Added more poster.
    • -
    -

    Perakp updated:

    -
      -
    • You can no longer slip while laying down.
    • -
    -

    RobRichards, Validsalad updated:

    -
      -
    • Added new sprites for the sec-hailer, SWAT gear and riot armour.
    • -
    -
    - -
    -

    18 December 2013

    -

    Adrinus updated:

    -
      -
    • Playing cards, just like the real thing! Play poker, blackjack, go fish, the limits are limitless! Recommended to use space cash as the poker chips for now
    • -
    -

    Giacom updated:

    -
      -
    • THE REALISM: Injectors such as syringes, parapens and hypos will not penetrate coveralls with thick material, this includes space suits, biosuits, bombsuits, and their head slot equivalent. Injectors now also consider where you aim, if you aim for the head it will try to use it through the head slot, otherwise it will aim for the body. To clarify, if you are wearing a space helmet and a doctor tries to inject you while aiming at your head, it will protect you until they aim for the unprotected body; same story for wearing a space suit and not a helmet.
    • -
    • The syndicate shuttle has been heavily upgraded with a brand new technology which allows the blast doors to the entrance of the shuttle to AUTOMATICALLY close. Whoa. This brand new technology will help keep out those snoopy crew members.
    • -
    • Lowered the cooldown of creating virus cultures to 5 seconds. You now only need to mix one unit of synaptizine, in a blood full of an advance virus, to get it to remove a random symptom.
    • -
    -

    Incoming updated:

    -
      -
    • Rounds will no longer end when the wizard dies and there are still apprentices or traitors/survivors..
    • -
    -

    JJRcop updated:

    -
      -
    • Transit tube tweaks. You can now put someone into a transit tube pod using grabs and you can empty a transit tube pod by clicking on it.
    • -
    -

    Jordie0608 updated:

    -
      -
    • Replaced the digital valves in atmospherics with pumps.
    • -
    -
    - -
    -

    14 December 2013

    -

    Incoming updated:

    -
      -
    • Magic Mania! Powerful new magical tools and skills for wizard and crew alike!
    • -
    • Beware the new Summon Magic spell, which will grant the crew access to magical tools and spells and cause some to misuse it!
    • -
    • One Time Spellbooks that can be spawned during summon magic that can teach a low level magic skill to anyone! Beware the effects of reading pre-owned books, the magical rights management is potent! -
    • Magical Wands that can be spawned during Summon Magic! They come in a variety of effects that mimic both classical wizard spells and all new ones. They come precharged but lack the means to refill them once their magical energy is depleted... Fire efficently!
    • -
    • Be aware of the new Charge spell, which can take normally useless spent wands and give them new life! This mysterious effect has been found to wear down the overall magical potency of wands over time however. Beyond wands the clever magical user can find ways to use this spell on other things that may benefit from a magical charge...
    • -
    • The Staff of Resurrection, which holds intense healing magics able to defeat death itself! Look out for this invaluable magical tool during castings of Summon Magic.
    • -
    • Be on the lookout for a new apprentice! This noble mage is a different beast from most wizards, trained in the arts of defending and healing. Too bad he still works for the wizard!
    • -
    -
    - -
    -

    09 December 2013

    -

    Giacom updated:

    -
      -
    • New colourful ghost sprites for BYOND members. Sprites by anonus.
    • -
    -
    - -
    -

    08 December 2013

    -

    Rolan7 updated:

    -
      -
    • Leather gloves can be used to removes lights.
    • -
    • Plant, ore, and trash bags have a new option to pick up all items of single type
    • -
    • Creating astroturf now works like sandstone, converting all the grass at once.
    • -
    • Uranium and radium can be used instead of mutagen. 10 can mutate species, 5 or 2 mutate traits. Highly toxic.
    • -
    • Plants require a little light to live. Mushroom require even less (2 units vs 4) and take less damage.
    • -
    -
    - -
    -

    05 December 2013

    -

    Razharas updated:

    -
      -
    • Reworked how ling stings are done, now when you click a sting in the changeling tab it becomes current active sting, the icon of that sting appears under the chem counter, alt+clicking anyone will sting them with current sting, clicking the icon of the sting will unset it.
    • -
    • Monkeys have ling chem counter and active sting icons in their UI.
    • -
    • Going monkey -> human will try to equip the human with everything on the ground below it.
    • -
    -
    - -
    -

    02 December 2013

    -

    Giacom updated:

    -
      -
    • A less annoying virology system! From now on, you can only get low level virus symptoms from virus food, medium level virus symptoms from unstable mutagen and high level virus symptoms from liquid plasma. You can find a list of symptoms, and which chemicals are required to get them, here: http://wiki.ss13.eu/index.php/Infections#Symptoms_Table
    • -
    • The virologist starts with a bottle of plasma in his smart fridge.
    • -
    • Made it so you cannot accidentally click in the gaps between chem masters.
    • -
    -
    - -
    -

    01 December 2013

    -

    cookingboy3 updated:

    -
      -
    • Added three new buttons to the sandbox panel.
    • -
    • Removed canister menu, replaced it with buttons.
    • -
    • Players can no longer spawn "dangerous" canisters in sandbox, such as Plasma, N20, CO2, and Nitrogen.
    • -
    -
    - -
    -

    30 November 2013

    -

    Yota updated:

    -
      -
    • The identification console will now require that ID and job names follow the same restrictions as player names.
    • -
    • NTSL scripts and parrots should now handle apostrophes and such properly. It&#39;s about time.
    • -
    • NTSL scripts now have a better sense of time.
    • -
    -
    - -
    -

    28 November 2013

    -

    Malkevin updated:

    -
      -
    • Made the suit storage on the Captain's Tunic more useful than just a place to store your e-o2 tank. You can now store the nuke disk, stamps, medal box, flashes and melee weapons (mainly intended for the Chain of Command), and of course - smoking paraphernalia
    • -
    -
    - -
    -

    27 November 2013

    -

    RobRichards updated:

    -
      -
    • Nanotrasen surgeons are now certified to perform Limb replacements, The robotic parts used in construction of Nanotrasen Cyborgs are the only parts authorized for crew augmentation, these replacement limbs can be repaired with standard welding tools and cables.
    • -
    -
    - -
    -

    17 November 2013

    -

    Laharl Montgommery updated:

    -
      -
    • AI can now anchor and unanchor itself. In short, it means the AI can be dragged, if it wants to.
    • -
    -
    - -
    -

    29 September 2013

    -

    RobRichards updated:

    -
      -
    • Nanotrasen Cyborg Upgrades:
      -Standard issue Engineering cyborgs now come equipped with replacement floor tiles which they can replenish at recharge stations.
    • -
    -
    - - -
    -

    28 September 2013

    -

    Ergovisavi updated:

    -
      -
    • Mobs can now be lit on fire. Wearing a full firesuit (or similar) will protect you. Extinguishers, Showers, Space, Cryo, Resisting, being splashed with water can all extinguish you. Being splashed with fuel/ethanol/plasma makes you more flammable. Water makes you less flammable.
    • -
    -
    - - -
    -

    26 September 2013

    -

    Cheridan updated:

    -
      -
    • Nanotrasen Anomaly Primer:
      - Unstable anomalies have been spotted in your region of space. These anomalies can be hazardous and destructive, though our initial encounters with these space oddities has discovered a method of neutralization. Method follows.
      -

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

      - With the anomaly neutralized and the station brought out of danger, inspect the area for any remnants of the anomaly. Properly researched, we believe these events could provide vast amounts of valuable data.
      - Did you find this report helpful?
    • -
    -
    - - - -
    -

    21 September 2013

    -

    Malkevin updated:

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

    19 September 2013

    -

    Malkevin updated:

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

    17 September 2013

    -

    SuperSayu updated:

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

    13 September 2013

    -

    JJRcop updated:

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

    3 September 2013

    -

    Cael_Aislinn updated:

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

    2 September 2013

    -

    Cael_Aislinn updated:

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

    1 September 2013

    -

    Cael_Aislinn updated:

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

    12 September 2013

    -

    AndroidSFV updated:

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

    31 August 2013

    -

    Cael_Aislinn updated:

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

    30 August 2013

    -

    Cael_Aislinn updated:

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

    21 August 2013

    -

    Dumpdavidson updated:

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

    18 August 2013

    -

    Delicious updated:

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

    13 August 2013

    -

    Giacom updated:

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

    12 August 2013

    -

    Giacom updated:

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

    10 August 2013

    -

    Malkevin updated:

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

    6 August 2013

    -

    Giacom updated:

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

    5 August 2013

    -

    Kaze Espada updated:

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

    4 August 2013

    -

    Giacom updated:

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

    31 July 2013

    -

    Ricotez updated:

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

    21 July 2013

    -

    Malkevin updated:

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

    21 July 2013

    -

    Cheridan updated:

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

    16 July 2013

    -

    Malkevin updated:

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

    15 July 2013

    -

    Giacom updated:

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

    7 July 2013

    -

    Giacom updated:

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

    27 June 2013

    -

    Ikarrus updated:

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

    16 June 2013

    -

    Khub updated:

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

    15 June 2013

    -

    Carnie updated:

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

    Petethegoat updated:

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

    9 June 2013

    -

    Ikarrus updated:

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

    6 June 2013

    -

    Giacom updated:

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

    4 June 2013

    -

    Dumpdavidson updated:

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

    2 June 2013

    -

    Ikarrus updated:

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

    25 May 2013

    -

    Ikarrus updated:

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

    14 May 2013

    -

    Ikarrus updated:

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

    11 May 2013

    -

    Malkevin updated:

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

    7 May 2013

    -

    Ikarrus updated:

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

    5 May 2013

    -

    Rolan7 updated:

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

    2 May 2013

    -

    Malkevin updated:

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

    30 April 2013

    -

    Ikarrus updated:

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

    24 April 2013

    -

    Carnie updated:

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

    26 April 2013

    -

    Aranclanos updated:

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

    Ikarrus updated:

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

    23 April 2013

    -

    Malkevin updated:

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

    22 April 2013

    -

    Malkevin updated:

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

    22 April 2013

    -

    Cheridan updated:

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

    17 April 2013

    -

    Giacom updated:

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

    10 April 2013

    -

    Cheridan updated:

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

    9 April 2013

    -

    Ikarrus updated:

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

    4 April 2013

    -

    Cheridan updated:

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

    28 March 2013

    -

    Carnie updated:

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

    14 March 2013

    -

    Major_sephiroth updated:

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

    13 March 2013

    -

    Elo001 updated:

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

    8 March 2013

    -

    Kor updated:

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

    6 March 2013

    -

    Petethegoat updated:

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

    24 February 2013

    -

    Ikarrus updated:

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

    Faerdan updated:

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

    22 February 2013

    -

    Petethegoat updated:

    -
      -
    • Added cavity implant surgery.
    • -
    • Additionally, surgery must now be performed with help intent. Some procedures have also been updated. - As always, check the wiki for details.
    • -
    -
    - -
    -

    18 February 2013

    -

    Ikarrus updated:

    -
      -
    • The AI has been moved to Research Division, and Telecomms has been moved into the former AI chamber. Affected areas: Telecoms Satellite, Research Division South & Command Sector.
    • -
    -

    Incoming updated:

    -
      -
    • Added three new types of surgery- lipoplasty, plastic surgery, and gender reassignment.
    • -
    -

    Kor updated:

    -
      -
    • The RD has lost access to telecomms, and basic engineers have gained it.
    • -
    -
    - -
    -

    14 February 2013

    -

    Petethegoat updated:

    -
      -
    • Updated surgery: you now initiate surgery with surgical drapes or a bedsheet. Most procedures have changed, check the wiki for details. Currently it's pretty boring, but this paves the way for exciting new stuff- new procedures are very simple to add. Report any bugs directly to me, or on the issue tracker.
    • -
    -
    - -
    -

    13 February 2013

    -

    Giacom updated:

    -
      -
    • There are now hackable wires for the PA computer. To open the interface, click on it while the wires are exposed/panel is open. All but one wire will do something interesting, see if you can figure it out. You can also attach signallers to the wires so have fun remotely releasing the singularity.
    • -
    • New staff of animation icon by Teh Wolf!
    • -
    • You can now hack plastic explosives (C4)!
    • -
    • You can now use NTSL to send signals! With the function signal(frequency, code) you can create some clever ways to trigger a bomb. NTSL also has two new additions; return in the global scope will now stop the remaining code from executing and NTSL now has "elseif"s, huzzah!
    • -
    -

    Kor "I'm quitting I swear" Phaeron updated:

    -
      -
    • You've been asking for it for years, it's finally here. Wizards can spend points to buy apprentices.
    • -
    • A new wizard artefact, the scrying orb.
    • -
    • The spellbook now has descriptions of spells/items visible BEFORE you purchase them.
    • -
    -

    Petethegoat updated:

    -
      -
    • Traitors with the station blueprints steal objective can now use a photo of the blueprints instead!
    • -
    -
    - -
    -

    11 February 2013

    -

    SuperSayu updated:

    -
      -
    • Signallers, prox sensors, mouse traps and infrared beams can now be attacheed to grenades to create a variety of mines.
    • -
    • A slime core can be placed in a large grenade in place of a beaker. When the grenade goes off, the chemicals from the second container will be transfered to the slime core, triggering the usual reaction.
    • -
    -
    - -
    -

    10 Feburary 2012

    -

    Ikarrus updated:

    -
      -
    • Implants can now be surgically removed. Hint: They're inside the skull.
    • -
    -
    - -
    -

    07 February 2012

    -

    Giacom updated:

    -
      -
    • The return of the Nanotrasen Scripting Language! (NTSL) If you haven't heard of NTSL, it is a scripting language within a game for telecomms. Yes, you can create scripts to interact with the radio! For more information, head here: http://wiki.nanotrasen.com/index.php?title=NT_Script But before you do, if you are not an antag, do not create bad scripts which hinders communication.
    • -
    • Cameras, mulebots, APCs, radios and cyborgs can have signallers attached to their wires, like airlocks!
    • -
    • Cameras have non-randomized wires and the power wire when pulsed will now toggle the camera on and off.
    • -
    • Cyborgs have a new wire, the lockdown wire! It will disable/enable the lockdown of a Cyborg when pulsed.
    • -
    • The traffic control computer (or more commonly known as the computer which lets you add NTSL scripts) will now have a user log, which will log all user activity. Other users can then view that log and see who has been uploading naughty scripts!
    • -
    • NTSL has two new functions! time() and timestamp(format) will help you increase the range of types of scripts you can make, especially time(); since you can then make the scripts know the different between each execution by storing the results in memory.
    • -
    • Two new advance disease symptoms! Their names are "Longevity" and "Anti-Bodies Metabolism". Have fun experimenting with them!
    • -
    -
    - - -
    -

    31 January 2013

    -

    Kor "Even in death I still code" Phaeron updated:

    -
      -
    • Four new slime types with their own reactions and two new reactions for old slimes.
    • -
    • Put a suit of reactive teleport armour back in the RD's office.
    • -
    • Chemistry now has two dispensers (with half charge each) so both chemists can actually work at the same time.
    • -
    -
    - - -
    -

    27 January 2013

    -

    Ikarrus updated:

    -
      -
    • Security frequency chatter now appears in cyan (Similar to how command is gold)
    -

    Cheridan updated:

    -
      -
    • The plant bags in Hydroponics lockers have been replaced with upgraded models with seed-extraction tech. Activate with via right-click menu or Objects verb tab.
    • -
    • Obtaining grass tiles works a bit different now: grass is harvested as a normal plant item, clicking on it in-hand produces the tile.
    • -
    -
    - -
    -

    26 January 2013

    -

    Pete updated:

    -
      -
    • Added hugging and kicking. I also updated the text styles for clicking on humans in most intents, but they should be pretty much the same.
    • -
    -
    - -
    -

    25 January 2013

    -

    Errorage updated:

    -
      -
    • All the equipment you spawn with will now contain your fingerprints, giving the detective more ability to tell where items came from and if a crewmember has changed clothing.
    • -
    -
      -
    • Better explosions: Explosion spreading will now be determined by walls, airlocks and poddoors and not just a flat circle.
    • -
    -
    - -
    -

    20 January 2013

    -

    Cheridan updated:

    -
      -
    • Chickens will now lay a certain number of eggs after being fed wheat, rather than just laying them whenever they felt like it. No more chickensplosions.
    • -
    -
    - -
    -

    16 January 2013

    -
      -
    • Department Security can now be runned: -
      Department Security decentralizes security by assigning each officer to a different department. They will be given the radio channel and access to their assigned department along with a security post. The brig has been remapped to be smaller to accomodate this change. -
      To run DeptSec: Before compiling, server operators must
      tick jobs.dm (in WorkInProgress/Sigyn/Department Sec) and use map 2.1.1 instead of 2.1.0.
    • -
    -
    - -
    -

    /tg/station 13 Presents

    -

    Directed by S0ldi3rKr4s0

    -

    & produced by Petethegoat

    -
      -
    • Curse of the Horseman.
    • -
    -
    - -
    -

    12 January 2013

    -

    Cael Aislinn updated:

    -
      -
    • Spiders which will breed and spread through vents. Different classes of vents. AI controlled only at the moment.
    • -
    • Farm animals! Cows, goats and chickens are now available. You can order them at Cargo Bay.
    • -
    -

    Giacom updated:

    -
      -
    • Staff of animation mimics will no longer care whether you are holding the staff or not, they will never attack their creator.
    • -
    • Brainrot will only need alkysine to be cured.
    • -
    • New spider infestation event based on Cael's spiders. The announcement will be the same as alien infestations.
    • -
    -
    - -
    -

    11 January 2013

    -

    Giacom updated:

    -
      -
    • Plasma (Air) will give the breather the plasma reagent, for a toxic effect, instead of just straight damage.
    • -
    • The agent card will now work inside PDAs/Wallets; meaning the AI won't be able to track you.
    • -
    -
    - -
    -

    09 January 2013

    -

    Malkevin updated:

    -
      -
    • The owl mask now functions as a gasmask for increased crimestopping power.
    • -
    -
      -
    • Adds the missing icons for the arrest statuses of Parolled and Released, as well as a little blinking icon for chemical implants.
    • -
    - - -
    -

    08 January 2013

    -

    Cael Aislinn & WJohnston updated:

    -
      -
    • Many new icons for aliens (death, sleeping, unconscious, neurotox, thrown/impregnated facehugger etc)
    • -
    • Alien larva can now be removed by dangerous and unnecessary surgery (and actually chestburst if they aren't).
    • -
    • Alien larva now have sprites to represent their growth: bloody at 0%, pale at 25% and 75% the normal deep red.
    • -
    • New icon overlays for representing alien embryo progression.
    • -
    - -
    -

    07 January 2013

    -

    Kor updated:

    -
      -
    • Four new slime types with their own extract reactions have been added. Sprites this time were created by Reisyn, SuperElement, and LePinkyFace.
    • -
    - -
    -

    02 January 2013

    -

    Kor updated:

    -
      -
    • Slime breeding! There are now 13 varities of slime, each with its own extract reaction (inject five units of plasma). Some of these reactions are reused from the old cores, some are new. As to breeding, each colour of slime has a series of other slimes it may mutate into when it reproduces.
    • -
    -

    Giacom updated:

    -
      -
    • You can now use wallets as IDs and equip them in your ID slot.
    • -
    • Firesuits are once again effective at protecting you from heat. The flames themselves will still hurt you, even with a firesuit. The damage protection is much better with a firesuit though.
    • -
    • Engineering starts with a PACMAN generator for jump starting the singularity if the power runs out of the SMES. 30 plasma spawns in Secure Storage inside the crate, to use as fuel for the generator.
    • -
    - -
    -

    31 December 2012

    -

    Giacom updated:

    -
      -
    • Simple animals (Corgis, Cats, Constructs, Mice, Etc...) can now pull people.
    • -
    • You can quickly stop pulling on someone by pulling them, while they're already being pulled by you. For example, CTRL+Click on something you are pulling to quickly stop pulling it.
    • -
    - -
    -

    30 December 2012

    -

    Giacom updated:

    -
      -
    • Emitters now require to be wired in order to work. When there is not enough power it will stop shooting until there is enough power, meaning you do not have to turn it back on, just get the power flowing.
    • -
    • You can order shield generators from cargo. Teleporter access is required to open the crate.
    • -
    -

    Ikarrus updated:

    -
      -
    • Map: Reorganized the Command Sector. The Captain has his own private quarters in addition to his office.
    • -
    - -
    -

    26 December 2012

    -

    Ikarrus updated:

    -
      -
    • An agent card is now required to use doors and controls on the Syndicate Shuttle (Nuke).
    • -
    • Scanning gas tanks is now a PDA-cart function. Only Atmos and Science PDA carts have this function. Have fun mislabelling gas tanks!
    • -
    - -
    -

    23 December 2012

    -

    Giacom updated:

    -
      -
    • The syndicate Military PDA will not show up on possible PDAs to message anymore, even when the receive/signal is turned on. You can still send messages and people can still reply to you.
    • -
    • You can now sell processed plasma for supply points. The conversion rate is 2 plasma sheets for 1 point. You must put the plasma in a crate for it to count.
    • -
    • The mecha toy prize promotion has officially ended. You can no longer redeem all 11 action mecha figures for a real mech. New toy redeeming promotions in the future will be considered.
    • -
    - -
    -

    21 December 2012

    -

    Ikarrus updated:

    -
      -
    • You can now use . to speak over headset department channels in addition to the : and # characters.
    • -
    - -
    -

    19 December 2012

    -

    Nodrak updated:

    -
      -
    • You can now use # to speak over headset department channels. For example say "#e Hello" will say "Hello" over the engineering channel. say ":e Hello" will still work as it always has.
    • -
    - -
    -

    16 December 2012

    -

    Giacom updated:

    -
      -
    • You can now create your own solar arrays! Order the solar pack crate and you'll receive 21 solar assemblies, 1 electronic which you can put into an assembly to make it a solar tracker and finally the solar computer circuit board. You will get more detailed instructions in the crate, on a piece of paper. Engineering will also start with this crate to help repair destroyed solar arrays.
    • -
    -

    Petethegoat updated:

    -
      -
    • Added a new option to the key authorisation devices. It removes the maintenance access requirement from all doors. It's irreversible, so only use it in an emergency!
    • -
    - -
    -

    15 December 2012

    -

    Ikarrus updated:

    -
      -
    • Swapped the locations of the Library and Chapel. Thanks to killerz104 for the remap.
    • -
    • Partial remap of atmos. Monitoring and Refill stations are now the same room.
    • -
    • Toxins Mixing should be working properly again.
    • -
    - -
    -

    12 December 2012

    -

    Ikarrus updated:

    -
      -
    • Robotics is now a full Science department.
    • -
    • Completely remapped Research Division, Robotics, Medbay, and the Library.
    • -
    • Partially remapped Cargo Bay, Mining Dock, Engineering, and Atmospherics.
    • -
    • Changed the access of the HoS and HoP. For a list, refer to their respective wiki pages.
    • -
    -

    Errorage updated:

    -
      -
    • Miners now have to go through cargo to reach the Mining Dock.
    • -
    -

    Petethegoat updated:

    -
      -
    • The Detective's revolver no longer cares about how cool you look. It now spawns in his locker.
    • -
    • Added new inhands for most energy weapons, by Flashkirby!
    • -
    -

    Giacom updated:

    -
      -
    • Disintegrate (EI NATH) will leave behind the brain of the victim. Possible productive uses include: trophies, looking awesome as you gib someone and only their brain remains, people to talk to when you get an MMI, pocket brains, a way to get back into the game if the wizard didn't grab your brain and stuffed it into his bag.
    • -
    - -
    -

    07 December 2012

    -

    Giacom updated:

    -
      -
    • The detective's scanner was upgraded, it can now scan for reagents in items and living beings. Potential uses include, scanning dead bodies for leftover poison or scanning items to see if they have been spiked.
    • -
    • You can now attach photos to newscaster news feeds and wanted posters.
    • -
    • You can now emag buttons to remove access from them.
    • -
    • The CentComm. Report has been changed so it no longer names potential antagonists. It will just announce the potential round type instead.
    • -
    - -
    -

    05 December 2012

    -

    Cheridan updated:

    -
      -
    • Agent cards have been upgraded with microscanners, allowing operatives in the field to copy access levels off of other ID cards.
    • -
    -

    Ikarrus updated:

    -
      -
    • The Chief Medical Officer, Research Director, Chief Engineer, and Lawyers now have basic Brig access (corridor only)
    • -
    • Merged Mining and Cargo radio channels into the Supply Radio. To use the supply channel, use :u
    • -
    • Mining Dock remapped to be more compact and closer to cargo.
    • -
    -

    Giacom updated:

    -
      -
    • The wizard's fireball spell is once again dumbfire. It will fire in the direction of the wizard instead of having to choose from a list of targets and then home in on them.
    • -
    -
    - -
    -

    02 December 2012

    -

    Giacom updated:

    -
      -
    • Added a new artefact called the "Staff of Animation". You can get it in the Wizard's Spellbook. It will animate objects and items, but not machines, to fight for you. The animated objects will not attack the bearer of the staff which animates them, meaning if you lose your staff, or if it gets stolen, your minions will turn on you.
    • -
    -
    - -
    -

    30 November 2012

    -

    Petethegoat updated:

    -
      -
    • Janitor has recieved a slightly upgrade mop bucket. The old one is still there too.
    • -
    -

    Ikarrus updated:

    -
      -
    • Swapped the locations of the Vault and Tech Storage.
    • -
    • Cargo Techs, Miners, and Roboticists no longer start with gloves. They are still available from their lockers.
    • -
    -
    - -
    -

    28 November 2012

    -

    Kor updated:

    -
      -
    • Slimes have replaced roros (finally)! Right now they are functionally identical, but massive expansion of slimes and xenobio is planned. Sprites are by Cheridan.
    • -
    -
    - -
    -

    25 November 2012

    -

    Giacom updated:

    -
      -
    • Added new very high level symptoms which are only obtainable in the virus crate. Virus crate will also come with mutagen.
    • -
    -

    Petethegoat updated:

    -
      -
    • Removed clown planet! It'll return shortly in away mission form.
    • -
    -

    Ikarrus updated:

    -
      -
    • Added Gateway access. Only the RD, HoP, and Captain start with this.
    • -
    • New access levels in the brig:
      -Brig access now opens the front doors of the brig, as well as other lower-risk security areas.
      -Security access allows you into the break room and equipment lockers.
      -Holding Cells allows you to use brig timers and lets you in the Prison Wing.
      -The Detective no longer has Security Equipment access.
    • -
    • Significantly increased max cloneloss penalty for fresh clones to 40%.
    • -
    -
    - -
    -

    23 November 2012

    -

    Giacom updated:

    -
      -
    • Simplified detective stuff. The high-res scanner is gone and instead the detective's normal scanner will instantly report all fingerprints, dna and cloth fibers in full. This was needed because the system took too long to work with and disencouraged detectives. Not only that, it made detectives less of a threat for antagonists and made possible scenerios, such as framing someone by changing fingerprints with someone else, impratical. To replace the computer, the detective will have a full medical computer with access to it. Not only that, but his useless filing cabinet will be replaced with an empty one for serious investigators. Along with this, are fingerprint cards and built-in PDA scanning, as all of security had access to it which was really the detective's thing. The new scanner will also log every finding and you can print them out as a report by clicking the scanner while it is in your active hand.
    • -
    • You can toggle the pressure of your sprayer by clicking on it while it is in your active hand. With pressure, the sprayer will spray 10 units on the floor, otherwise it sprays 5. You'll need to turn pressure on to spray water on the floor and make it slippery.
    • -
    • AIs in intellicards can no longer move their camera. This will limit them in ability but without making creating and carding an AI to have as a personel door opener impossible.
    • -
    • Telecommunication Busses can now be set to change the frequency of a signal. (Allowing you to say.. set the command channel to broadcast to the common channel).
    • -
    • Telecommunication was changed to be more effecient. Because of this, Relays don't need a broadcaster or a receiver and you can setup a relay on it's own. You can still disable sending and or receiving from the relay's interface.
    • -
    -

    Zelacks updated:

    -
      -
    • Plant Analysers now work on seed bags.
    • -
    -
    - -
    -

    21 November 2012

    -

    Petethegoat updated:

    -
      -
    • The nuke shuttle can now travel at will, and to any location. When travelling from syndicate space to the station, (and vice versa), it will travel through hyperspace.
    • -
    -

    Carn updated:

    -
      -
    • Changed savefile structure. There's a bunch of unused files left lying around so old savefiles will be purged. Sorry for the inconvenience. Many preferences have been moved to the Preferences verb tab. Everything in that tab is persistent between rounds (it updates your savefile, so even DCing won't reset them). Enjoy x
    • -
    -

    Phol updated:

    -
      -
    • Added female sprites for most mutant races.
    • -
    -

    Cheridan updated:

    -
      -
    • SSU manufacturers have issued a product recall! It seems old models shipped with faulty wiring, causing them to short-circuit.
    • -
    -
    - -
    -

    20 November 2012

    -

    Kor updated:

    -
      -
    • Added Exile Implants to the Gateway room. Someone implanted with an Exile Implant will be able to enter the away mission, but unable to return from it. Not only can they be used for getting rid of dangerous criminals, but revs/stationheads count as dead while on the away mission, and traitor/changeling/wizard assassination targets count as dead if they're on the away mission at round end, allowing for those objectives to be completed peacefully.
    • -
    • Added medical hardsuits, sprited by Majorsephiroth. Two of them spawn in EVA. Their most unique/medical oriented feature is being able to hold a medkit in the suit storage slot, allowing you to easily access medicine while keeping your hands free.
    • -
    -
    - -
    -

    19 November 2012

    -

    Giacom updated:

    -
      -
    • Malf AIs can only shunt to APCs from their core. Meaning their core needs to be alive before they can shunt to another APC. Malf AIs can start a takeover inside an APC now.
    • -
    • When taking damage, the next sequence of the overlay will show for a bit before reverting to the overlay you should have. This allows you to know you are taking damage without having to check the text screen.
    • -
    -
    - -
    -

    18 November 2012

    -

    Petethegoat updated:

    -
      -
    • Ported over BS12 style cameras. They now take a photo of a 3x3 area!
    • -
    • Catatonic people (those that have ghosted while alive) now count as dead for assasinate objectives.
    • -
    -
    - -
    -

    17 November 2012

    -

    Donkie updated:

    -
      -
    • You can now deconstruct and construct Air Alarms and Fire Alarms. Read wiki on howto.
    • -
    -

    Giacom updated:

    -
      -
    • Medical Cyborgs no longer lose the reagents in their hypospray when switching modes.
    • -
    • Spaceacillin will now help stop the spread of diseases.
    • -
    • You can once again make floors slippery by spraying water. This was done by increasing the amount the sprayer uses, which is from 5 to 10. You can also empty your sprayer's contents onto the floor with a verb in the Object tab.
    • -
    -
    - -
    -

    16 November 2012

    -

    Kor updated:

    -
      -
    • Fixed the syndicate teleporter door, making teleport assaults possible. It will once again open when you open the outter door.
    • -
    -
    - - -
    -

    15 November 2012

    -

    Giacom updated:

    -
      -
    • You can now name your advance diseases! You can't name already known diseases though.
    • -
    • Chemical implants can now hold 50 units instead of 10 units.
    • -
    -
    - -
    -

    13 November 2012

    -

    Giacom updated:

    -
      -
    • More work to advance diseases. Please report any bugs to the bug tracker, I have tried everything that I can on my own but I'll need lots of people playing to fix the more minor bugs. You can find a guide to making your own diseases here: LINK!
    • -
    • Reduced the cost to use Hive Absorb from 40 to 20. This is to help encourage people to use this power more and to use team work.
    • -
    • New symptom added! See if you can find it.
    • -
    • You can now remove symptoms from a disease using synaptizine.
    • -
    • Kor: You can once again debrain changelings. They won't make anyone half-lings though, and you won't be able to tell if the body of a debrained changeling is a changeling by putting a player brain in there.
    • -
    -

    Nodrak updated:

    -
      -
    • Wizards can no longer cast spells when muzzled. It iss now actually possible to capture a live wizard without constantly injecting them with chloral.
    • -
    • You can no longer take bags of holding or mechs to the clown planet.
    • -
    -
    - -
    -

    11 November 2012

    -

    Carn updated:

    -
      -
    • Admin-ranks changes
      - Lots of changes. This is just a brief summary of the most recent changes; still working on proper documentation.
      - All admins have access to view-vars, player-panel(for individual mobs), game panel and secrets panel. Most of the things on those pages have their own rights requirements. For instance, you can only use event orientated secrets in the secret panel if you have FUN rights. Debug secrets if you have DEBUG rights. etc.
      - Spawn xeno and toggle gravity procs were moved into the secrets panel (fun).
      - This may help with understanding which flags do what. Unfortuanately it's still somewhat vague.
      - If you have any problems, feel free to PM me at irc.rizon.net #coderbus. I go by the username carn or carnie. -
    • -
    -
    - -
    -

    11 November 2012

    -

    Kor updated:

    -
      -
    • New cyborg upgrade available for production that requires illegal and combat tech
    • -
    • Summon Guns has a new gun type created by Ausops. It also lets the user know when its been cast now to prevent people trying to buy it multiple times
    • -
    • Grilles are no longer immortal in regards to solid projectiles, you can now shoot out windows.
    • -
    -
    - -
    -

    09 November 2012

    -

    Giacom updated:

    -
      -
    • Cyborgs can now ping and beep! (Say "*beep" and "*ping") Thanks to Rahlzel for the proposal.
    • -
    • HULKS WILL NOW TALK IN ALL CAPS AND WILL RANDOMLY SAY HULK THINGS. Thanks to Brotemis for the proposal.
    • -
    • Sorry for the inconveniences with advance diseases. They are working much better now!
    • -
    • An improved APC sprite by TankNut!
    • -
    -
    - - -
    -

    05 November 2012

    -

    Giacom updated:

    -
      -
      -
    • AIs can now tweak with a bot's setting like a human who unlocked the bot.
    • -
    -
    - -
    -

    05 November 2012

    -

    Errorage updated:

    -
      -
    • Being in an area with extremely low pressure will now deal some damage, if you're not protected.
    • -
    • Space suits and the captain's armor now protect against pressure damage
    • -
    • Slightly lowered all environment damage intakes (temperature, oxygen deprevation) to make up for low pressure damage.
    • -
    • Pressure protection finally works properly. Items that protect from pressure (firesuits, space suits, fire helmets, ...) will now properly protect. The pressure damage indicator will update properly based on the pressure effects on you. Black (low) and red (high) mean you are taking damage.
    • -
    • Slightly slowed down the speed at which your body temperature changes if you are in a very hot or very cold area. The speed at which you recover from an abnormal body temperature remains the same.
    • -
    -
    - - -
    -

    03 November 2012

    -

    TankNut updated:

    -
      -
    • New APC sprite.
    • -
    • New Wraith sprite and jaunting animation.
    • -
    -
    - -
    -

    03 November 2012

    -

    WJohnston updated:

    -
      -
    • New Ablative Armor sprite.
    • -
    -
    - -
    -

    03 November 2012

    -

    Giacom updated:

    -
      -
      -
    • Airborne diseases will not spread through walls now.
    • -
    • Reduced queen healing rate to 5. The maximum health will be enough.
    • -
    • Aliens can now clear hatched eggs by clicking on them.
    • -
    -
    - -
    -

    02 November 2012

    -

    Errorage updated:

    -
      -
    • You can once again travel to the station, derelict, satellite and mining z-levels through space. You will also never loop into the same level on transition - So if you are exiting the derelict z-level, you will enter one of the other z-levels.
    • -
    -
    - - -
    -

    01 November 2012

    -

    Giacom updated:

    -
      -
    • Aliens now take x2 as much damage from fire based weaponary, instead of x1.5.
    • -
    • Doors are now weaker than walls; so normal weapons can destroy them much more easily.
    • -
    -
    - -
    -

    31 October 2012

    -

    Giacom updated:

    -
      -
    • Advance evolving diseases! Virology can now create, mutate and mix advance diseases together. I replaced the two bottles of blood in Virology with the advance disease. I'll write a wiki article soon enough. Here's a tip: Putting mutagen or virus food (a mixture of milk, water and oxygen) in blood with an existing disease will mutate it to gain symptoms. It can potentially lose old symptoms in the process, so keep backups!
    • -
    -
    - -
    -

    28 October 2012

    -

    Errorage updated:

    -
      -
    • You can now set your character's age up to 85. This used to be 45.
    • -
    -
    - -
    -

    27 October 2012

    -

    Petethegoat updated:

    -
      -
    • Mousetraps are now assemblies.
    • -
    • Added a new crate for cargo to order.
    • - -
    -
    - -
    -

    27 October 2012

    -

    Petethegoat updated:

    -
      -
    • Player Weekend begins!
    • -
    • Added a camera and hand labeler to art storage.
    • -
    • Added a medical records cabinet to the Detective's office.
    • -
    • Added a safe to the vault. Who'll be the first to crack it?
    • -
    -

    Nodrak updated:

    -
      -
    • The CE has a new pet!
    • -
    -
    - -
    -

    25 October 2012

    -

    Flashkirby99 updated:

    -
      -
    • Added 18 new hairstyles!
    • -
    -
    - -
    -

    24 October 2012

    -

    Giacom updated:

    -
      -
    • Throwing eggs will result in the reagents of the egg reacting to the target. (Which can be a turf, object or mob) This creates possibilities like chloral eggs, lube eggs, and many more.
    • -
    • Aliens can now acid walls and floors! Not R-Walls though.
    • -
    • Facehugger throw range reduced to 5, so aim at humans that are 2 tiles apart from the edge of your screen.
    • -
    • Making eggs is a little more expensive but secreting resin is cheaper. (Both cost 75 now)
    • -
    • Aliens no longer have a random duration of stunning humans, it's a constant value now of the lower based value.
    • -
    • Acid is less random and will be more reliable. Don't bother aciding stuff more than once, as it will waste plasma.
    • -
    • You can now target non-dense items (such as facehuggers) with a gun.
    • -
    • You can now shoot canisters, computers and windoors to break them.
    • -
    -
    - -
    -

    18 October 2012

    -

    Giacom updated:

    -
      -
    • As an AI, you can type in the "track with camera" command and get a list of names to show up there. This also works with "list camera" verb. Remember to use space to auto-fill.
    • -
    • Welding goggles have been added. They are like welding helmets but they are for the glasses equipment slot. Science and the assembly line are given a pair.
    • -
    • Thanks to WJohnston for the welding goggle icons.
    • -
    • Small change to the Assembly Line. Instead of six normal flashes, the Assembly Line will instead have two normal flashes and eight synthetic flashes. Synthetic flashes only work once but are designed to be used in construction of Cyborgs.
    • -
    • Nar-Sie put on a few pounds. Thanks HornyGranny.
    • -
    -
    - -
    -

    16 October 2012

    -

    Giacom updated:

    -
      -
    • New changeling powers!
    • -
    • Hive Channel/Hive Absorb. Allows you to share your DNA with other changelings, very expensive chemical wise to absorb (download), not so much to channel (upload)! You cannot achieve your objective by sharing DNA.
    • -
    • Mimic Voice! You can form your voice of a name you enter. You won't look like them but when you talk, people will hear the name of who you selected. While you're mimicing, you can't regenerate chemicals.
    • -
    • Extract DNA! A power that allows you to silently sting someone and take their DNA! Meaning you do not have to absorb someone to become them. Extracting their DNA doesn't count towards completing your objectives.
    • -
    • You can now get flares from red emergency toolboxes. Has a 50% chance of a flash-light or a flare spawning.
    • -
    • Flare icon by Ausops!
    • -
    • Thanks to RavingManiac (Smoke Carter), Roros now lay eggs which can grow into baby roros or be used for cooking recipes. Scientists will need to expose the egg to plasma for it to hatch; while it is orange (grown).
    • -
    • A new icon for the map spawned x-ray cameras. Icon by Krutchen.
    • -
    -
    - -
    -

    13 October 2012

    -

    Giacom updated:

    -
      -
    • Facehuggers have a new animation, thanks to Sly.
    • -
    • Firelocks, glass-less airlocks and walls will stop heat.
    • -
    • Fires are now more deadly, especially the flames.
    • -
    • Fires will now break windows.
    • -
    -
    - -
    -

    10 October 2012

    -

    Giacom updated:

    -
      -
    • Larva grow a little bit faster when on weeds or when breathing in plasma.
    • -
    -
    - -
    -

    8 October 2012

    -

    Giacom updated:

    -
      -
    • Thanks to Skasi. Atmospherics has been changed to be made simpler and spawn with the new atmos features, such as the heaters.
    • -
    • Radio headsets can only be heard by people wearing them on their ear slot. This will let us do more fun stuff with headsets, such as a traitor encryption key which can listen to all the channels, but not talk in them.
    • -
    -
-

Kor updated:

-
    -
  • A pen no longer spawns in your pocket. Instead, each PDA will spawn with a pen already in it.
  • -
-
- -
-

5 October 2012

-

Giacom updated:

-
    -
  • Aliens can now be harmed by fire. They now also take double fire damage, meaning flame based weaponry is very effective.
  • -
  • Buffed alien facehuggers and eggs. Facehuggers don't go idle anymore, and they attach to anyone who walks past them. Eggs do the same; fully grown eggs will open to potential hosts. If you are still in the range of them, the facehugger inside will leap out and hug you. Removed "activate facehuggers", since it's useless now. Emote "roar" if you want to roar now.
  • -
  • There can be only one living queen at a time, if the queen dies then a drone can take her place as a princess.
  • -
  • Buffed queen regeneration a bit, so it's not the same as her underlings. It's also more important because there can only be one queen at a time.
  • -
  • Aliens don't slip in space anymore.
  • -
  • Hulks don't paralyze aliens anymore, they instead slow them down to a slow crawl. It is very effective for punching aliens out of weeds, so it can't regenerate it's health.
  • -
  • New egg opening and opened egg icons by WJohnston.
  • -
-

Aranclanos updated:

-
    -
  • A buncha crud nobody cares about lol Added a light to the airlock wiring interface to show the status of the timing.
  • -
  • You can't fill sprays without being next to the dispenser.
  • -
  • Simple animals no longer freeze to death in places with normal temperature.
  • -
  • Mechs no longer freeze on the spot when they are using the Energy Relay on powerless areas.
  • -
  • Improvements to showers, they now clean gear on beltslot, back, ears and eyes. Showers only clean visible gear.
  • -
  • Replica pods works again! But you can't make potato people without a key or clone people who ghosted alive (Catatonic).
  • -
  • Engiborgs can deconstruct airlocks with their RCDs once again.
  • -
  • You can construct airlocks while standing on another airlock with RCDs.
  • -
-
- -
-

3 October 2012

-

Agouri updated:

- -
- -
-

1 October 2012

-

Cheridan updated:

-
    -
  • Wizards have a new artifact added to their spellbooks.
  • -
-
- - -
-

30 September 2012

-

Numbers updated:

-
    -
  • Readded Volume Pumps - now they work as intended and are constructable
  • -
  • Readded Passive Gates - now they work as intended and are constructable
  • -
  • Readded Heat Exchangers - now they work as intended and are constructable
  • -
  • Added Heater - to warm up gasses to 300C
  • -
  • Pipe dispensers can produce the readded pieces.
  • -
  • New graphics for all of the above - courtesy by Ausops.
  • -
-
- -
-

30 September 2012

-

Giacom updated:

-
    -
  • Airlocks now use the Environmental power channel, since they are airlocks after-all. Meaning, when power is low the airlocks will still work until the environmental channel on the APC is turned off. This applies to all the door control buttons too. Pipe meters now use the environmental power channel. If you have any comments have this change, please let me know in the feedback section of the forums.
  • -
-
- -
-

26 September 2012

-

Carnwennan updated:

-
    -
  • Added new hotkeys. Type hotkeys-help for details or see the drop-down help menu at the top of the game window.
  • -
-

Aranclanos updated:

-
    -
  • Mechs are once again spaceproof!
  • -
  • The YouTool machine is now all access
  • -
  • Cutting tower caps in hand no longer deletes the wood, and planks now auto stack
  • -
-
- -
-

25 September 2012

-

Donkie updated:

-
    -
  • Reworked the Piano, now really optimized and new interface!
  • -
-
- -
-

24 September 2012

-

Petethegoat updated:

-
    -
  • Hopefully fixed the stop midis button. It should now stop any midis that are currently playing.
  • -
-
- -
-

23 September 2012

-

Petethegoat updated:

-
    -
  • Fixed an exploit which would allow the janitor to magically mop floors.
  • -
  • Added lipstick~ It's not available on station, as Nanotrasen has deemed it contraband.
  • -
  • If you encounter any issues with computers, notify an admin, or ask for assistance on #coderbus, on irc.rizon.net.
  • -
-

Donkie updated:

-
    -
  • Updated the Package Tagger with new interface!
  • -
  • You can now dispense, remove and retag sort junctions properly!
  • -
-
- -
-

17 September 2012

-

Cheridan updated:

-
    -
  • Metroids have been replaced with Rorobeasts. Roros are strange latex-based lifeforms that hate light, fun, and gloves.
  • -
-
- -
-

17 September 2012

-

Carn updated:

-
    -
  • F5 is now a hotkey for adminghosting. F8 toggles ghost-like invisibility for admins.
  • -
  • Catatonia makes you fall down. Admins appear braindead when admin-ghosting.
  • -
  • "Set-observe"/"Set-play" renamed and merged into "Aghost".
  • -
  • "Lay down/Get up" renamed to "Rest"
  • -
  • Closets can't be sold on the supply shuttle anymore
  • -
  • Fixed all dat light
  • -
-
- -
-

13 September 2012

-

Carn updated:

-
    -
  • New Hotkeys (Trial period). Details can be found in the help menu or via the hotkeys-help verb. It's all client-side. It shouldn't intefere with regular controls (except ctrl+A, ctrl+S, ctrl+D and ctrl+W).
  • -
-
- -
-

10 September 2012

-

Giacom updated:

-
    -
  • AIs can double click on mobs to instantly start tracking them.
  • -
-
- -
-

Important note for server hosts!

-

Important note for server hosts!:

-
    -
  • The file /code/defines/hub.dm was moved into /code/hub.dm. To get your server back on the hub, open /code/hub.dm and set the hub variables again. Sorry for the inconvenience.
  • -
-
-
-

8 September 2012

-

Carn updated:

-
    -
  • Added an additional check to stop changelings sharing powers/becomming un-absorbable/etc by absorbing eachother and then rejuvinating from death.
  • -
  • Cloaked Aliens are now slightly easier to see, so they should avoid strongly lit areas when possible. They can still lay down to become even stealthier though. Let me know what you think, it's only a minor sprite change.
  • -
-
- -
-

6 September 2012

-

Cheridan updated:

-
    -
  • -Changes flour from an item to a container-held reagent. All recipes have been updated to use 5 units of reagent flour for every item required previously. This has a few advantages: The 16(!) sacks of flour previously in the kitchen cabinet have been condensed to an equivalent 3 sacks. Beer is now brewable with universal enzyme, and converting lots of wheat into flour should be less tedious. Also, flour grenades, etc. Because of this, flour is now obtained from the all-in-one blender rather than the processor, and spaghetti noodles are made with 5 units of flour in the microwave.
  • -
-
- -
-

6 September 2012

-

Giacom updated:

-
    -
  • Removed cameras from bots (NOT BORGS). They weren't working well with freelook and I felt that since they weren't used at all, they wouldn't be missed.
  • -
-
- -
-

3 September 2012

-

Giacom updated:

-
    -
  • Cameras has changed quite a bit. They are no longer created from grenade canisters, instead you make them from an autolathe. The construction and deconstruction for them has also changed, so look it up or experiment it with yourself to see how to setup the cameras now. Cameras also get wires, like airlocks and APCs. There's two duds, a focus wire, a power wire, an alarm wire and a light wire. Protip: You can see which one is the alarm wire by pulsing it.
  • -
  • Added a red phone and placed it in the Cyborg Station. Sprite by Pewtershmitz! You'll also find an AI restorer there, replacing the computer frame.
  • -
  • Cameras aren't all X-ray anymore. The AI won't be able to see what room you are in if there's no normal camera inside that room or if there's no X-ray camera nearby..
  • -
  • Cameras get upgrades! Currently there's X-ray, EMP-Proof and Motion. You'll find the EMP-Proof and Motion cameras in the normal places (Singularity Pen & EVA), the new X-ray cameras can be found in the Dormitory and Bathrooms, plus some extra ones to invade your privacy. See if you can smash them all.
  • -
  • Alien Larva can bite simple animals (see: Ian, Runtime, Mice) to kill them and gain a small amount of growing points.
  • -
  • Space travel was tweaked to be more random when changing Z levels. This will stop people and items from being stuck in an infinite loop, as they will eventually hit something to make them stop.
  • -
-
- -
-

31 August 2012

-

Agouri updated:

-
    -
  • Overhauled newscasters. No visual additions but the thing is much more robust and everything works as intended. Wanted issues are fixed. Admins, check out Access News Network under Fun.
  • -
-
- -
-

30 August 2012

-

Giacom updated:

-
    -
  • You can now create an EMP Pulse. Like an explosion, it is the mixing of two reagents that trigger this to happen. I will tell you the first required reagent. Uranium. Have fun!
  • -
  • I have made most chemicals need 3-5 or more chemicals in order to react to a turf. For instance, you need at least 5 units of thermite splashed on a wall for it to burn down."
  • -
  • The EMP kit, that you can buy through the uplink, has two more grenades in them now. Making the box full of EMP grenades!
  • -
  • Changed the EMP grenade's range to be much bigger.
  • -
-
- -
-

29 August 2012

-

Nodrak updated:

-
    -
  • Mice now work with the admin player panel. Admins can now turn players into mice with the 'Animalize' button in the player panel!
  • -
  • Space bear AI no longer runs when a player is controlling it. Admins can now turn players into space bears with the 'Animalize' button in the player panel!
  • -
  • The holodeck beach program once again has a beach.
  • -
  • The nuke op shuttle floor was pressure-washed a few days ago. We have since re-painted it with nanotrasen blood. Sorry for any confusion.
  • -
-
- -
-

28 August 2012

-

Giacom updated:

-
    -
  • You can now toggle the bolt light of airlocks. An extra wire, that controls the airlock's bolt light, has been added.
  • -
  • Aliens can now tell who is and who isn't infected. They get a special facehugger icon that appears over mobs that have been impregnated.
  • -
  • Cameras have temporary X-Ray for the time being.
  • -
-
- -
-

August 26, 2012

-

Nodrak updated:

-
    -
  • Admins now have an 'Animalize' button on a mob's player panel. This button allows admins to turn players into simple animals.
    There are a few exceptions. Mice, Parrots, Bears and Space Worms all have issues that, until fixed, prevent me from allowing players those transformations.
  • -
-

August 25, 2012

-

Carnwennan updated:

-
    -
  • New lighting. It should look and feel the same as the old lighting whilst being less taxing on the server. Space has a minimum brightness (IC starlight) and areas that do not use dynamic lighting default to a lighting level of 4, so they aren't dark, but they aren't superbright. Replacing turfs should preserve dynamic lighting. Singulo/bombs should cause a lot less lighting-related lag. There are some minor known issues, see the commit log for details.
  • -
  • Admins can now access most controller datums with the "Debug Controller" verb. Time to break all the things!
  • -
  • Supply shuttle now uses a controller datum. This means admins can see/edit supply orders etc.
  • -
  • Changeling fakedeath can be initiated after death again. Next time you want something reverted, just ask rather than being obnoxious.
  • -
-

Giacom updated:

-
    -
  • AIs can now look around like a ghost with the exception that they cannot see what cameras cannot see. Meaning if you're in maintenance, and there's no cameras near you, the AI will not know what you are doing. This also means there's no X-Ray vision cameras anymore.
  • -
  • AIs can add links to Telecommunication Machines. Added some cameras for areas that should have it but instead relied on cameras nearby for vision.
  • -
  • Choking has been changed. You have to stand still while lethally choking someone. It takes time to get into that lethal choke. When you are lethaling choking someone, they are still concious until the lack of oxygen knocks them out.
  • -
-

trubble_bass updated:

-
    -
  • Nerfed the Neurotoxin drink, it is now less effective than a stunbaton. But more effective than a Beepsky Smash.
  • -
  • Updated descriptions on various cocktails to be more accurate or more relevant to the drink itself.
  • -
-
- -
-

August 24, 2012

-

Sieve updated:

-
    -
  • Floorbots now actually pull up tiles when emagged
  • -
  • All helper bots (excluding MULEs) have an access panel and maint panel, access being for behavior and maint for internal work
  • -
  • To open the maint panel, the access panel needs to be unlocked, then you use a screwdriver. There you can emag/repair it to your heart's content. (Emagging the access panel will also unlock it permanently)
  • -
  • Helper bots are now repaired by using a welder when their maint panel is open
  • -
-
- -
-

August 23, 2012

-

Nodrak updated:

-
    -
  • In-hand sprites once again update correctly when equipping items.
  • -
-
- - -
-

August 16, 2012

-

Errorage updated:

-
    -
  • Changes were made to how heating and cooling of humans works.
  • -
  • You must wear both a space suit and space helmet to be protected from space! Likewise you must wear a firesuit and a fire helmet to be protected from fire! Fire helmets are red and white hardhats, found in all fire closets.
  • -
  • Fire suits now only protect from heat and space suits only protect from cold, so make your choice count.
  • -
-
- - -
-

August 14, 2012

-

Sieve updated:

-
    -
  • DNA modifiers can be used if there is no occupant, primarily to handle the buffer.
  • -
  • Ion Rifles are only effected by max severity EMPs, so AOE from its own shot won't effect it
  • -
  • Pepper Spray fits on Sec belts again
  • -
-
- -
-

August 11, 2012

-

Sieve updated:

-
    -
  • Turrets now properly fire at simple_animals.
  • -
  • Borgs, AIs, and brains/MMIs can be sacrificed by cultists.
  • -
  • Grenades now automatically set throw on again.
  • -
-
- -
-

August 6, 2012

-

Dingus updated:

-
    -
  • Library has been redesigned. It's a whole lot more classy now.
  • -
  • Significant changes to Medbay. CMO's office is more centralized, genetics has a new exit into cryogenics, and a new break room has been installed
  • -
-
- -
-

August 4, 2012

-

Icarus updated:

-
    -
  • Changes to Med-Sci south and surrounding maintenance areas. Virology is more isolated and Science gets a new Misc. Research Lab.
  • -
  • Atmos techs get construction access now to do their little projects in.
  • -
  • Transformation Stings now work on living humans.
  • -
-
- -
-

August 2, 2012

-

Errorage updated:

-
    -
  • Gas masks now protect you from reagent smoke clouds
  • -
  • Changed the 'black overlay' you get when paralyzed, blind or in critical condition to include a small circle around you.
  • -
  • Dramatically lowered the amount of damage you get per breath while in critical condition. Critical condition now lasts for about 5 minutes if nothing is causing you any additional harm. This in combination with the new black image overlay is an attempt at making doctors more willing to help.
  • -
-

Icarus updated:

-
    -
  • Borgs now have flashlights to allow them to see in lightless areas
  • -
  • Changes to Medbay: The sleeper and storage rooms have been swapped around. Hopefully this leads to more healing and less looting.
  • -
-
- -
-

August 1, 2012

-

Sieve updated:

-
    -
  • Borgs can now have an encryption key installed into their internal radios. Simply ID, open the panel, and use the key to insert it (Screwdriver to remove)
  • -
  • Due to that as well, borgs have a 'Toggle Broadcast Mode' button for their radios, which changes the broadcast type between station-bounced (Non-reliant on TComms), and subspace (Required for department channels)
  • -
  • Also changed the binary chat for consistency, now for the prefix is ':b' for everyone, not just one for humans and one for borgs/AIs/pAIs
  • -
  • Based on feedback, Nuke Op pinpointers now automagically change between shuttle and disk mode when the nuke is armed or disarmed.
  • -
-
- -
-

01-August-2012

-

Carn updated:

-
    -
  • Please update your BYOND clients! Ideally everybody should be running the latest version of byond (v496). People who fail to update to at least version 494 within a month's time may find themself unable to connect. Currently our code has no restrictions at all, which is rather bad. By getting the user-base to keep their clients up-to-date we can make use of newer BYOND features reliably.
  • -
-

Giacom updated:

-
    -
  • I've made some adjustments to the Fireball spell. I've changed it to shoot in the player's facing direction instead of you having to pick a name from a list. It will explode upon contact of a person, if it hits an obstacle or if it shoots for too long. To make up for the fireball not being able to go diagonal I've shortened the cooldown to 10 seconds. It still can hurt you badly and knock you down if you shoot it at a wall. Lastly, it now lights up so it'll show up in dark rooms easily.
  • -
-
- -
-

31 July 2012

-

Giacom updated:

-
    -
  • Removed passive throwing. You need at least an aggressive hold of the mob before you can throw them.
  • -
  • New map changes by Ikarrus. AI Upload Foyer is now Secure Tech Access, and the outer door only requires Bridge access. Attached to it are two new rooms: The messaging server room and the communications relay. The comms relay room runs off its own SMES unit like the AI, so it won't be affected by powersinks
  • -
-
- - -
-

29 July 2012

-

Giacom updated:

-
    -
  • All radios now only work in their Z level. This means that the CommSat has a few more additions to work with this change. There is now a new Telecomms Machine called the Relay which allows information to travel across Z levels. It it then linked to a new machine called the Hub, which will receive information from the Relays and send it to the buses. Because every Z level needs these relays, which are linked up with Receivers/Broadcasters, every Z level will get one. There is one in the station, in the RD's office, one in Telecomms as always, one in the Ruskie station which is turned off and hidden from the HUB's linked list. The last one is in Mining but the location for it has not been decided yet.
  • -
  • PDAs now need to be in a Z level with a functioning Relay/Comms Network in order to send messages. It will also send uncompressed (scrambled) messages like you would with the ordinary voice messages.
  • -
  • Added some of WJohnston's sprites. Added a new mining borg sprite, Added a new high tech security airlock, Added the new telecomm sprites for Relays. Hubs were given old Bus sprites.
  • -
-
- -
-

29 July 2012

-

Errorage updated:

-
    -
  • You can now use crayons to color eggs
  • -
  • Mice have invaded the station!
  • -
-
- -
-

26 July 2012

-

Giacom updated:

-
    -
  • Added a new mushroom for Hydroponics, the Reishi Mushroom! It is obtained like any other mushroom and it has relaxing properties.
  • -
-
- -
-

July 25, 2012: The day of updates!

-

Nodrak updated:

-
    -
  • Attacking mobs with items will now give new messages. Instead of "Monkeyman was attacked in the head with a wrench by Nodrak." it will read "Monkeyman was bashed in the head with a wrench by Nodrak." Diffrent items have diffrent verbs and some have multiple verbs.
  • -
  • Cultists can now read what words a rune was made with by examining the rune. Due to an error in the code, this was not possible before.
  • -
  • Clowns no longer have practice lasers or staves of change blow up in their face due to clumsyness.
  • -
  • Engineering cyborgs can now actually repair a cut AI wire in APCs.
  • -
  • I've removed a ton of pointless checks and redundant loops from metroid's which have been causing lag due to how often they get called. If metroids are behaving strangly ping me in #coderbus
  • -
-

Sieve updated:

-
    -
  • Made a 'default' save slot (D), and whenever you connect it automatically selects the default slot to load from, but manually selecting a different slot will allow you to play on that one before it returns to default.
  • -
  • Added the ability to name your save slots with the '*'. Names can be up to 16 characters and contain letters, numbers, and basic symbols
  • -
  • The preview icon on the preference screen now takes into account any job you have set on high, and dresses up the icon accordingly. If assistant is set to 'yes', or AI/Cyborg are on high it will put the icon in a grey suit (So you can still customize).
  • -
  • Nuke Ops get a new pinpointer, changing modes with the verb will switch between pointing to the disk, and pointing to the shuttle. Also provides a notification when you leave the station z-level
  • -
  • Reworked how MMI Life() was done, now they will never lose consciousness, and many less things affect them now(Like deafening/blindness from explosions). However, they are vulnerable to EMPs, but all damage is temporary.
  • -
  • Clowns will no longer be killed trying to use holo eswords
  • -
  • Major tweaking to try and optimize many operations on the game's backend. Hopefully, this will reduce a large amount of lag by steamlining CPU-intensive operations, but at the same time there was so much changed that there is no real way for a small group to test everything. If anyone spots a bug involving being unable to 'find' mobs, characters, whatever, then put it on the issue tracker or at the very least let #coderbus know. We can't fix shit unless we know about it.
  • -
-

Icarus updated:

-
    -
  • Players not buckled in when the emergency shuttle/pod starts moving get will get knocked down.
  • -
  • Added a YouTool vending machine to primary tool storage.
  • -
-
- -
-

24 July 2012

-

Errorage updated:

-
    -
  • Both the chef and bartender have access to the bar area so both can serve if the other is incompetent or does not exist. Bartender's shotgun and shaker were moved to his back room and the booze-o-mat is now ID restricted to the bartender.
  • -
  • Added powercells into vending machines in engineering
  • -
  • Gave two beartraps to the janitor for pest control purposes................
  • -
-
- -
-

22 July 2012

-

Errorage updated:

-
    -
  • Mech toys can now be redeemed at the quartermaster's for a great reward! If you collect the full set of 11 toys you should put them in a crate and send them to centcom via the supply shuttle.
  • -
  • Supply shuttle arrival time reduced to 2 minutes
  • -
  • Hopefully fixed the toy haul problem which made it possible to get a million toys from arcade machines.
  • -
-

Giacom updated:

-
    -
  • You can now make newlines with your PDA notes.
  • -
  • You can now research and build the Light Replacer.
  • -
  • You can now store donuts in the donut box. The next donut you pull out will be the last one you put in.
  • -
  • APCs will auto-turn on if there is enough power in the grid, even if the powercell is below 30%. The APC needs to be charged for a long enough time before it starts turning equipment on, to avoid spazzing out. If you have any problems with it, such as equipment turning off and on repeatedly then please make an issue report with a screenshot of the APC.
  • -
-
- -
-

18 July 2012

-

Giacom updated:

-
    -
  • Added the Light Replacer. This is a device that can auto replace lights that are broken, missing or burnt. Currently it is found in the Janitor's closet and Janitor Borgs can equip it. You can refill it with glass, or if you're a Cyborg, just recharge. It is emaggable and will replace lights with rigged lights. The light's explosion was nerfed to help balance it and it is very noticable when you are holding an emagged Light Replacer.
  • -
  • The Janitor's equipment locator, on their PDA, will now tell you the direction of the equipment.
  • -
-
- -
-

17 July 2012

-

Icarus updated:

-
    -
  • Added department satchels
  • -
  • Added Captain's Backpack and Satchel
  • -
  • Added three new hairstyles by Sly: Gelled, Flat Top, and Pigtails. Hair list has also been sorted by grouping similar styles.
  • -
-

Giacom updated:

-
    -
  • Added a new wire for Cyborgs. See if you can figure out what it does.
  • -
  • You can now fill any container with a sink. You can change the amount to fill, from sinks, by setting your container's transfer amount.
  • -
-
- -
-

14 July 2012

-

Carn updated:

-
    -
  • All living mobs can now ghost whenever they want. Essentially making the suicide verb obsolete. If you ghost whilst still alive however, you may not re-enter your body for the rest of the round.
  • -
  • Humans can no longer suicide whilst restrained (this is purely to prevent meta whilst I finish up the new FUN suicides)
  • -
  • Fixed dem evidence bags. Fixed metroids getting at it like rabbits. Fixed stuff like welding masks not hiding your face. Bunch of other things
  • -
-

Willox and Messycakes updated:

-
    -
  • pAI Emoticons! Allows each pAI to set their screen to display an array of faces! Click on 'Screen Display' in the pAI OS for a list.
  • -
-
- - -
-

Saturday July 14th 2012

-

Giacom updated:

-
    -
  • Added Russian Revolvers. This is a special Revolver that can only hold a single bullet randomly in it's chamber. This will allow you to play Russian Roulette with your fellow crew members! You can use it like a normal gun but you will need to cycle through the chamber slots until you hit the bullet. Only admin spawnable.
  • -
-
- -
-

Friday July 13th 2012

-

Carn updated:

-
    -
  • Added FLOORLENGTH HAIR. YEESSSSSSSS!!!! :3 If you like it say thanks to Ausops for fixing it up. Credits to Powerfulstation for the original sprite.
  • -
-

Giacom updated:

-
    -
  • Save Slots! You can now have separate save slots for different character setups, with a customizable maximum of 3 slots per account. If you are wondering, you will not lose your old saved setup.
  • -
  • The character setup screen was updated to look nicer and to fit on the screen.
  • -
-

Icarus updated:

-
    -
  • Added new Dwarf and Very Long hairstyles. Dwarf hair and beard by SuperCrayon.
  • -
-
- -
-

Thursday July 12th 2012

-

Giacom updated:

-
    -
  • pAI gets a better PDA that can actually receive messages from people. They can also instantly reply like everybody else now and they can toggle their receiver/signaller/ringer.
  • -
  • You can show the AI the notes on your PDA by holding it up to a camera. When you show up a paper/pda to the camera the AI can now click on your name to go to you, if you're near a camera. People who are Unknown will not have a link; which would've allowed the AI to track them.
  • -
  • Made the" common server" and the "preset right receiver" listen for frequencies 144.1 to 148.9. This will allow people to use different frequencies to talk to eachother without bothering the common channel. It will also allow Revs and Cultists to work with each other; everything is still logged though so it still has risks.
  • -
  • Increased the maximum frequency limit for handheld radios and intercoms. It will give you the option to just use station bounced radios on a higher frequency so that anyone with a headset can't simply tune in.
  • -
  • Created an All-In-One Grinder that is suppose to replace the blender, juicer and reagent grinder all together. Meaning any department that has a juicer, blender and grinder will instead get this. It will help people be more independent from Chemistry by recycling foods and plants.
  • -
-
- -
-

Wednesday July 11th 2012

-

Nodrak, Cheridan and Icarus updated:

-
    -
  • Added a couple of Emergency Shield Projectors to Engineering secure storage. -

    Note: Credit goes to Barhardar for the original code and functionality. -

    These devices can be used to quickly create an air-tight seal across a hull breach until repairs can been made. -

    Wrench them in place and activate them near a hull breach. The shield should extend to all space tiles in range. -

    They can be (un)locked by engineering IDs and can also be emagged and otherwise malfunction. As they can not be constructed, you can repair damage and malfunctions by opening the panel with a screwdriver and replacing the wires with a cable coil

  • -
-

Giacom updated:

-
    -
  • Chemistry update: Pills can now be ground up in reagent grinders. You can now put custom amounts of reagent into things using chemmasters. Can now load pill-bottles into chemmasters for mass pill-production.
  • -
-

Carn updated:

-
    -
  • Clicks on inventory slots with items in now act like a click on the thing in that slot. So clicking smaller things (like pens) is easier and you can remove clothing that borks/goes invisible. Please continure to report those kinds of bug though please. Thanks x
  • -
  • Can no longer interact with your inventory with a mech.
  • -
-

Errorage updated:

-
    -
  • You can now only adminhelp once every 2 minutes so please provide all necesary information in one adminhelp instead of 5! Also reply to admins in PM-s and not additional adminhelps.
  • -
-
- -
-

Saturday July 7th, 2012

-

Icarus updated:

-
    -
  • A basketball simulation is now available at the holodeck. Credit to Sly and Ausops for the sprites.
  • -
-
- -
-

Friday July 6th, 2012

-

Giacom updated:

-
    -
  • Bottles can now be broken over people's heads! To do this, you must have the harm intent on and you must be targeting the person's head. This change affects alcoholic bottles only. It does not change pill bottles or chemistry bottles. Helmets help protect you from damage and the regents of the bottles will splash over the victim.
  • -
  • AI's now have access to a PDA. Note: It is not PDA-bomb-able
  • -
  • Health analyzers and medical PDAs now give a time of death when used on corpses.
  • -
-
- -
-

Thursday July 5th, 2012

-

Carn updated:

-
    -
  • Alien larva now chestburst even after their host has died.
  • -
  • Aliens can now slap facehuggers onto faces so they can infect mobs which lay down (or those stuck to nests).
  • -
  • Aliens can now slash security cameras to deactivate them.
  • -
-
- -
-

Wednesday July 4th, 2012

-

39kk9t & Carn updated:

-
    -
  • Added alien nests. They're basically beds made of thick sticky resin which aliums can 'stick' (buckle) people to for sexytimes
  • -
  • Weed nodes are no longer dense.
  • -
  • Queens can secrete resin for walls/nests/membranes
  • -
  • Various bugfixes
  • -
-
- -
-

Saturday June 30th, 2012

-

Icarus updated:

-
    -
  • Added Petethegoat's basic mirrors to the map. They allow you to change hairstyles.
  • -
  • Remapped Bar, Theatre, and Hydroponics. Bar and Kitchen are now more integrated with each other.
  • -
-
- -
-

Thursday, June 28th

-

Nodrak updated:

-
    -
  • I'm currently working on cleaning up and moving around a large portion of the mob code. These changes do not directly affect players; HOWEVER, bugs, oversights or simple mistakes may cause problems for players. While I have tested as much as I can, there may be some lingering bugs I have missed.

    This part of the mob code cleanup mainly focuses on damage variables and procs. So if you suspect something related to taking, dealing or examining damage is not working as intended please fill out an issue report here and be as detailed as possible. This includes what you were doing, steps to reproduce the problem, who you were doing it to, what you were using ect... Thank you.

  • -
-

Carn updated:

-
    -
  • Alien hunters will now cloak when using the 'stalk' movement intent. Whilst cloaked they will use up their plasma reserves. They can however cloak as long as they like. Using the Lay-down verb will allow them to remain cloaked without depleting their plasma reserves, hence allowing them to lay ambushes for unsuspecting prey. Should a hunter attack anybody, or get knocked down in any way, they will become visible. Hopefully this allows for more strategic/stealthy gameplay from aliens. On the other hand, I may have totally screwed the balance so feedback/other-ideas are welcome.
  • -
  • Removed the invisibility verb from the alien hunter caste.
  • -
-
- -
-

Wednesday, June 27th

-

Errorage updated:

-
    -
  • Fixed the bug which prevented you from editing book's titles and authors with a pen. Also fixed the bug which prevented you from ordering a book by it's SS13ID.
  • -
  • Added the F12 hotkey which hides most of the UI. Currently only works for humans.
  • -
-

Donkie updated:

-
    -
  • Pizza boxes! Fully stackable, tagable (with pen), and everythingelse-able. Fantastic icons by supercrayon!
    Created with a sheet of cardboard.
  • -
-
- -
-

Tuesday, June 26th

-

Errorage updated:

-
    -
  • Changeling parasting now only weakens for 10 game ticks. It no longer silences your target.
  • -
-
- -
-

Saturday, June 23rd

-

Donkie updated:

-
    -
  • Reworked job randomizing system. Should be more fair.
  • -
  • List of players are now randomized before given antag, this means that declaring as fast as possible doesn't mean shit anymore!
  • -
-

Carn updated:

-
    -
  • Putting a blindfold on a human with lightly damaged eyes will speed up the healing process. Similar with earmuffs.
  • -
  • More overlay bug fixes. Most of it to do with little robots and construction stuff. Bugs go here if you have 2 minutes http://nanotrasen.com/phpBB3/viewtopic.php?f=15&t=9077
  • -
  • Weakening is instant! That means if you stunbaton somebody they're gonna fall-down immediately.
  • -
-

Icarus updated:

-
    -
  • Medical storage now requires Surgery access (Medical Doctors only)
  • -
-
- -
-

Wednesday, June 20th

-

Nodrak updated:

-
    -
  • AIs, Borgs are no longer able to be cultists or revolutionaries as their objectives completely contradict their laws. They can still be subverted of course.
  • -
  • pAI's no longer keep cult or rev icons.
  • -

Cheridan updated:

-
    -
  • -Both Ambrosia forms have had their reagent contents modified to prevent going over the 50-unit cap at high potencies. Ambrosia Deus now contains space drugs instead of poison.
  • -
  • -Drinking milk removes capsaicin from your body. REALISM!
  • -
  • -Frost oil hurts less upon consumption.
  • -
  • -Liquid plasma can be converted into solid plasma sheets, by mixing 20 plasma, 5 iron, and 5 frost oil.
  • -
  • -Added effects for holy water injection on hydroponics plants.
  • -
-
- -
-

Monday, June 18th

-

Giacom updated:

-
    -
  • Fix for special characters on paper and from announcements
  • -
-

Sieve updated:

-
    -
  • Various small bugfixes, check the commit log for full details
  • -
  • Fixed falsewalls not working
  • -
  • Made Lasertag ED-209's and turrets much more useful, including making their emag function more fitting
  • -
  • Added Mesons to the EngiVend to make up for how many lockers were removed
  • -
  • New Item: Sheet Snatcher. Right now only borgs have them, but they can hold up to 500 sheets of minerals (Of any combination), and auto-stacks them to boot. Used just like the mining satchels, meaning minerborgs can actually deliver metal
  • -
  • Mech drills can mine sand, and the diamond gets a much larger volume
  • -
  • If a borg has the satchel in its modules (Doesn't have to be the active one), it will auto-magically pick up any ores it walks over.
  • -
  • Bumping an asteroid wall with a pickaxe/drill in your hand makes you auto-magically start drilling the wall, making mining much less tedious (humans and borgs)(Also, gustavg's idea)
  • -
-

Icarus updated:

-
    -
  • New afro hairstyles. Big Afro by Intigracy.
  • -
-
- -
-

Friday, June 15th

-

Carnwennan updated:

-
    -
  • First update for update_icons stuffs:
    Fixed husking and fatties
    Fixed floor tiles still appearing in hand when laying them
    Fixed runtimes with fatties.
  • -
  • Fixes for pre-existing bugs:
    Fixed being unable to put belts & backpacks on other people
    nodamage (godmode) now prevents all organ damage. It does not stop healing however.
    Nerd stuff...
  • - -
-

Errorage updated:

-
    -
  • Greatly reduced the amount of damage high pressure does.
  • -
  • Fire suits, firefighting helmets (red harhats) and the chief engineer's white hardhat now protect against high pressure.
  • -
-

Icarus updated:

-
    -
  • Ported over ponytail sprites from Baystation
  • -
-
- -
-

Thursday, June 14th

-

Carn updated:

-
    -
  • FEAR NOT! You can now store a pen in your pda. (aka Best commit all commits)
  • -
-
- -
-

Wednesday, June 13th

-

Carn updated:

-
    -
  • Massive Mob-Icon Overhaul:
    A large amount of the mob code has been replaced. The systems replaced were causing immense performance issues so the following are very necessary optimisations.
    However, there is a downside: SS13 code is the equivilant of monkeys on typewriters. Despite weeks of constant coding/testing there -will- be things I've missed. The kinds of bugs I'm expecting are overlays not updating and/or in rare cases things not appearing in your hud. Most of these issues can be worked around simply by dropping the item and picking it back up. If all else fails ask an admin to regenerate your icons through view-vars.
    Please report any bugs to me on #coderbus IRC or make an issue on the tracker as a matter of urgency. I will fix them ASAP.
    Also a massive thankyou to Nodrak, Erro, Pete and Willox. :)
  • -
  • Massive rewrite of the overlays system (particularly for humans). Stuff is cached and only updates when necessary. In effect this means faster updates, less overheads/lag, and less reliance on the game-ticker.
  • -
  • Numerous bugfixes and tweaks for damage-procs and damage-overlays for humans. They should now be almost seamless, use very little overhead and update instantly.
  • -
  • TK grab can now be cancelled using the throw hotkey. (so now it toggles on/off like it used to).
  • -
  • Added verbs to the view-var drop-down list: "Regenerate Icons" will fix a mob's hud/overlays. "Set Mutantrace" will change a mob's mutantrace.
  • -
  • Damage icons were split up. They kinda look a bit crap so spriters feel free to replace them. Templates are provided in dam_human.dmi
  • -
  • More to come...
-

Cheridan updated:

-
    -
  • -Added Lezowski's overalls to hydroponic supply closets. 50% chance per closet for them to replace the apron. -Removed some covers tags from things that made no sense to have them.
  • -
-
- -
-

Monday, June 11th

-

Donkie updated:

-
    -
  • Fixed being able to lock yourself in or out of a locker using the verb.
  • -
-

Xerux updated:

-
    -
  • Added lightfixture creating.
  • -
-

Errorage updated:

-
    -
  • You can now use the resist verb or UI button when welded or locked in a closet. Takes 2 minutes to get out tho (Same as getting out of handcuffs or unbuckling yourself)
  • -
  • Making single-pane windows will now make the window in the direction you're facing. If a window already exists in that direction it will make it 90 degrees to your left and so on.
  • -
-
- -
-

Sunday, June 10th

-

Agouri updated:

-
    -
  • Cyborgs and AIs can now use the newscaster. It was a mistake on my part, forgetting to finish that part of them.
  • -
-
- -
-

Saturday, June 9th

-

Errorage updated:

-
    -
  • You can now make restraints from cable. It takes 15 lengths of cable to make a pair of restraints, they are applied the same way as handcuffs and have the same effects. It however only takes 30s to remove them by using the resist verb or button. You can also remove them from someone by using wirecutters on the handcuffed person.
  • -
  • Added four new cable colors: pink, orange, cyan and white. Engineer belts spawn with yellow, red or orange cables while toolboxes and tool closets spawn with all 8 colors.
  • -
-
- -
-

Thursday, June 7st

-

Icarus updated:

-
    -
  • Added a second ZIS suit to engineering.
  • -
  • Remapped CE office and surrounding areas.
  • -
-
- -
-

Wednesday, June 6th

-

Sieve updated:

-
    -
  • Radiation now works properly, watch out for that Singularity!
  • -
  • Disposals are no longer the loudest machines in existence.
  • -
  • Building portable turrets with lasertag guns now makes them fire lasertag bolts based on team, and they will automatically target and prioritize people wearing opposing team gear.
  • -
  • The same can be done for ED-209s, simply using a lasertag vest and gun (same color) where you would use a security vest and taser in construction.
  • -
  • Added mineral walls and powered mineral door construction. More information can be found in the commit thread, but basically they are built the same way others are, apply mineral to girder for a mineral wall, mineral to airlock assembly for a powered mineral door.
  • -
  • Commit Thread
  • -
  • Throw hotkey (end) now works with TK.
  • -
  • Swap hands hotkey (page up) now cycles through borg modules.
  • -
-

Nodrak updated:

-
    -
  • Cargo's 'shuttle: station' and 'shuttle: dock' has been changed to 'shuttle: station' and 'shuttle: away' to help avoid confusion.
  • -
-

Icarus updated:

-
    -
  • Maintenance shafts changed around. Renamed, less windows, more turns, and expanded in a few areas.
  • -
-

Neek updated:

-
    -
  • You can now add chemicals into cigarettes by injecting them directly or dipping individual cigarettes into a beaker. You can inject into cigarette packs directly to affect multiple cigarettes at once.
  • -
-

Willox updated:

-
    -
  • You can now click individual blocks/subblocks in the genetics console instead of having to scroll through the blocks with a forward/back button!
  • -
-
- -
-

Sunday, June 3rd

-

Donkie updated:

-
    -
  • You can now Drag-Drop disposal pipes and machinery into the dispenser, in order to remove them.
  • -
  • You must now use wrench before welding a pipe to the ground
  • -
  • You can no longer remove a trunk untill the machinery ontop is unwelded and unwrenched
  • -
  • You are now forced to eject the disposal bin before unwelding it.
  • -
-
- -
-

Friday, June 1st

-

SkyMarshal updated:

-
    -
  • Readded fingerprints and detective work, after lots of debugging and optimization.
  • -
  • Any PDA with access to the Security Records can now, by the normal forensic scanner function, store data the same way as the detective's scanner. Scanning the PDA in the detective's computer will copy all scanned data into the database.
  • -
  • If something goes wrong, please contact SkyMarshal on the #bs12 channel on irc.sorcery.net
  • -
-
- -
-

Friday, June 1st

-

Nodrak updated:

-
    -
  • Windoor's are now constructable! Steps are found here.
  • -
-
- -
-

Tuesday, May 29th

-

Nodrak updated:

-
    -
  • Glass Doors are now breakable.
  • -
  • Added more treasures to the secret mining room.
  • -
  • Changed mineral lockers from secret mining rooms: Instead of giving you two stacks of everything, you get stacks of ore based on rarity
  • -
-

Icarus updated:

-
    -
  • Moved Engineering and Bridge deliveries.
  • -
-
- -
-

This 28th day of May, in the year of our Lord, Two Thousand Twelve

-

Cheridan updated:

-
    -
  • -Adjusted balaclavas and added luchador masks. Wearing luchador masks give you latin charisma. They replace the boxing gloves in the fitness room. Boxing gloves are still available in the holodeck. -Fake moustache tweaked and given new sprites.
  • -
-
- -
-

Monday, May 28th

-

Donkie updated:

-
    -
  • You can now dispense Disposal Bins, Outlets and Chutes from the disposal dispenser. These are movable and you can attach them above open trunks with a wrench, then weld them to attach them completely. You can remove Bins by turning off their pump, then screwdriver, then weld, then wrench. Same with outlet and chute except for the pump part.
  • -
-
- -
-

Saturday, May 26th

-

Icarus updated:

-
    -
  • Ported over Flashkirby99's RIG suit sprites from Bay12
  • -
  • Department PDA Carts moved out of lockers and into head offices.
  • -
-
- -
-

Wednesday, May 23rd

-

Cheridan updated:

-
    -
  • -Reverted default UI sprites to Erro's old-style UI. Config options for UI color styles coming soon. -Driest Martinis will no longer be invisible. -Braincakes are now sliceable.
  • -
  • -Medical borg overhaul. Instead of a dozen random pills and syringes, they get a hypospray that can switch between auto-replenishing tricordrazine, inprovaline, and spaceacillin.
  • -
-

Errorage updated:

-
    -
  • Some of the more pressing issues with the new user interface were addressed. These include the health indicator being too far up, the open inventory taking a lot of space, hotkey buttons not being removable and suit storage not being accessible enough.
  • -
  • A toggle-hotkey-buttons verb was added to the OOC tab, which hides the pull, drop and throw buttons for people who prefer to use hotkeys and never use the buttons.
  • -
  • Added a character setup option which allows you to pick between the Midnight, Orange and Old iconsets for the user interface.
  • -
-
- -
-

Tuesday, May 22nd

-

Icarus updated:

-
    -
  • RIG helmets can now be used as flashlights, just like hardhats. Credit to Sly for the sprites.
  • -
  • HoP's office has been remapped and made into his private office. Conference Room can now be accessed from the main hall.
  • -
-
- -
-

Sunday, May 20th

-

Errorage updated:

-
    -
  • The new user interface is here. If anything is broken or something should be done differently please post feedback on the forum. Spriters are encouraged to make new sprites for the UI.
  • -
  • When you receive a PDA message, the content is displayed to you if the PDA is located somewhere on your person (so not in your backpack). You will also get a reply button there. This will hopefully make PDA communication easier.
  • -
  • New hotkeys! delete is the now the 'stop dragging' hotkey, insert is the 'cycle intents' hotkey.
  • -
-
- -
-

Saturday, May 19th

-

Doohl updated:

-
    -
  • You can now swap hands by clicking with your middle mouse button (you have to click on a visible object though, that's the catch).
  • -
  • Tweaked the DNA modifier consoles a little bit so that it's much easier to see individual blocks instead of one jumbled mess of hexadecimal.
  • -
  • You can now properly emag AI turret controls and commsat turret controls.
  • -
-

Invisty updated:

-
    -
  • Brand new ending animations!
  • -
-
- -
-

Friday, May 18th

-

Errorage updated:

-
    -
  • Removed hat storage, which was useless.
  • -
  • Implanting someone now takes 5 seconds, both people need to remain still. Implanting yourself remains instant.
  • -
  • Wallets once again spawn in the cabinets in the dormitory
  • -
  • Wallets now fit in pockets
  • -
-
- -
-

Thursday, May 17th

-

Icarus updated:

-
    -
  • Individual dorms now have a button inside that bolts/unbolts the door
  • -
  • New sprites for Cargo, HoP, and Captain's lockers
  • -
  • More department-specific door sprites. Most noticable changes in medsci and supply departments.
  • -
-
- -
-

Tuesday, May 15th

-

Icarus updated:

-
    -
  • Added WJohnston's scrubs to Medical Doctor lockers. Comes in blue, green, and purple.
  • -
  • Added two new syndicate bundles
  • -
  • Reduced cost of thermals to 3 telecrystals (formerly 4)
  • -
  • Singularity Beacons are now spawned from a smaller, portable device.
  • -
  • CMO and QM jumpsuits made more unique.
  • -
-
- -
-

Monday, May 14th

-

Icarus updated:

-
    -
  • Reinforced table parts are now made by using four metal rods on regular table parts. No plasteel involved.
  • -
  • Beakers, small and large can now be made/recycled in autolathes.
  • -
-

Nodrak updated:

-
    -
  • Added a 'random item' button to traitor uplinks. You can potentially get ANY item that shows up on the traitor item list, provided you have enough crystals for it.
  • -
-
- -
-

Friday, May 11th

-

Icarus updated:

-
    -
  • New design for security. This should be the last time it sees major changes for a while.
  • -
  • Added a new construction area. What could it be for?
  • -
-

Petethegoat updated:

-
    -
  • Readded the RD's genetics access.
  • -
  • RD is still without chemistry access, but I'm going to review this decision in a week and see if R&D is useless due to lack of acid.
  • -
  • Added Flashkirby99's SMES sprites!
  • -
-

Invisty updated:

-
    -
  • Sexy new warpspace (or whatever) tiles.
  • -
-

Important changes below!

-
- -
-

Thursday, May 10th

-

Sieve updated:

-
    -
  • Reverted dismemberment, the recent gun changes, and Tarajans. Before you shit up the forums, read this:
  • -
  • Dismemberment was ported from Bay12, but only halfway, and there were several problems with it. I know many people really liked it, but as it stood it did not fit the playstyle here at all. This had to be removed, there is work on a more fitting system, but this had to be taken out first regardless, and the longer people beat around the bush the worse the situation got.
  • -
  • The gun change was made for no real reason and was pretty problematic, so reverting that should mean there are a lot less 'accidental suicides.'
  • -
  • Tarjans were reverted by request as well, and since keeping them working after removing dismemberment would be a stupid amount of work.
  • -
-
- -
-

Sunday, May 6th

-

Cheridan updated:

-
    -
  • -New booze sprites for the drinks that were removed! Re-enabled the recipes for the removed drinks. Get cracking, bartenders. -You now need 10 sheets of metal instead of 2 to make a gas canister, people can't FILL ENTIRE ROOMS WITH THEM.
  • -
  • -Emergency Toolboxes now contain smaller, lighter fire extinguishers that actually fit inside them! -
-
- -
-

Saturday, May 5th

-

Petethegoat updated:

-
    -
  • RD get the fuck out of chemistry and genetics
  • -
  • CHEMISTS, DON'T BE DICKS TO RESEARCH, GIVE THEM ACID YOU TIGHT FUCKS
  • -
-

Icarus updated:

-
    -
  • Updates to Sec, including a stationary scrubber for the prison area.
  • -
  • Swapped around cryogenics and the patient rooms in medbay.
  • -
-
- -
-

Friday, May 4th

-

Cheridan updated:

-
    -
  • -Added fat jumpsuit sprites for orange, pink, yellow, owl, security, and warden jumpsuits.
  • -
  • -Somatoray is hopefully more useful and less buggy when used on trays. -Botanists now have morgue access, because of their ability to clone via replica pods. Try not to get this removed like all your other access, okay hippies?
  • -
-
- -
-

Thursday, May 3rd

-

Ikarrus updated:

-
    -
  • Updated genetics, medbay and security.
  • -
-

Petethegoat updated:

- -
- -
-

Tuesday, May 1st

-

PolymorphBlue updated:

-
    -
  • Adds BS12 dismemberment!
  • -
  • Adds greater changeling for 30 points
  • -
-
- - -
-

Monday, April 20th

-

Erro updated:

-
    -
  • Added a verb to the PDA which you can use to remove an ID in it. If your active hand is empy, it puts it there otherwise it puts it on the floor under you.
  • -
-
- -
-

Wednesday, April 27th

-

Cheridan updated:

-
    -
  • -New sprites for lemons, oranges, and walking mushroom critters. -Added Invisty's new blob sprites.
  • -
  • -Added a new chemical: lipozine, a weight loss drug. Made with sodium chloride, ethanol, and radium.
  • -
-
- -
-

Wednesday, April 25th

-

Ikarrus & Flazeo updated:

-
    -
  • New layout for Security, including a prison area instead of permacells.
  • -
  • New layout for the library, bar, and botany.
  • -
  • Medbay and R&D now have three-tile halls.
  • -
-

Scroll down for more commits! There's a bunch of new shit.

-
- -
-

Tuesday, April 24th

-

PolymorphBlue updated:

-
    -
  • Fakedeath changelings can no longer have their brains cut out.
  • -
  • Rev checkwin changed to fire every five ticks (from twenty) and actually use the right objective type so revs being off station counts as success.
  • -
-

Sieve updated:

-
    -
  • Powercells now have unique icons for cell types
  • -
  • Implemented mech construction sprite by WJohnston for the Ripley, Firefighter, Gygax, and Durand
  • -
  • Durand construction is reversible
  • -
  • Power Cells can now be made in Mechfabs, provided the proper research level has been achieved
  • -
  • Added a new item, the Synthetic Flash. Works just like a normal flash, except they can only withstand one use, but can be produced in the Mechfab(To replace the need for normal flashes)
  • -
  • Added a new type of gloves, ones that are cheap copies of the coveted Insulated Gloves, but be warned, quality control wasn't too thorough
  • -
  • Added a new Cyborg Upgrade, a jetpack for use by Miner Cyborgs. Can be refilled on any air canister
  • -
  • Miner Cyborgs now have a Diamond Drill equivalent along with an upgraded Ore Satchel
  • -
  • Mechfabs no longer brick if there are parts in the quene on sync
  • -
  • MMIs can be built in the Mechfabs again
  • -
  • Crabs are no longer immortal, and are now especially vulnerable to wirecutters
  • -
  • Bibles printed in the library now retain the religion's deity
  • -
  • Added Construction Sprites for the Ripley, Firefighter, Gygax, and Durand by WJohnston
  • -
  • Added Particle Accelerator sprites by Invisity
  • -
  • Added Power Cell, Synthetic Flash, Robot Upgrades, and made some modifications to the PA sprites
  • -
-

Petethegoat updated:

-
    -
  • Added Invisty's field generator sprites.
  • -
-
- -
-

April 1-22, 2012

-

Cheridan updated:

-
    -
  • CATCHING UP ON MY CHANGELOG. Some of this has been in for a while: -Added carved pumpkins and corncob pipes. -Added mutations for ambrosia and lemon trees. -Added more wood items for tower cap wood construction. -Added soil to plant seeds in. Make it by crushing up sandstone. Soil does not have indicators like trays do! Watch your plants carefully!
  • -
  • -The biogenerator is now more robust. It can dispense fertilizer in batches, and make simple leather items. -RnD can create a new tool for botanists: The floral somatoray. Has two modes. Use it on your plants to induce mutations or boost yield.
  • -
  • -Added plump helmet biscuits, mushroom soup, pumpkin pie and slices, chawanmushi, and beet soup recipes for the chef to make.
  • -
  • -Added transparency to biohelmets. -Normalized grass harvests. -Changed the name of "Generic Weeds". -Blenders can now be filled directly from plant bags. -Added low chance for a species mutation whenever a plant's stats mutate. -You now get more descriptive messages when applying mutagen to plant trays. -Removed sugarcane seeds from the vending machine. Added the sugarcane seeds to the seeds crate.
  • -
-
- -
-

Sunday, April 22nd

-

Petethegoat updated:

-
    -
  • New gasmask sprites. Removed emergency gasmasks, so there's only one type now.
  • -
  • New shotgun sprites by Khodoque!
  • -
  • The barman's double-barrel actually works like a double-barrel instead of a pump-action! Rejoice!
  • -
  • Sneaky barmen may be able to illegally modify their shotgun, if they so choose.
  • -
  • Trimmed the changelog, vastly.
  • -
-
- -
-

Saturday, April 21st

-

Errorage updated:

-
    -
  • Maintenance door outside of tech storage now requires maintenance OR tech storage access instead of maintenance AND robotics accesses.
  • -
-
- -
-

Thursday, April 19th

-

Carn updated:

-
    -
  • Rewrote the cinematic system to try and simplify and optimise it. Please report any bugs asap to me or coderbus, thanks.
  • -
-
- -
-

Tuesday, April 17th

-

Kor updated:

-
    -
  • Engineering jobs now have their PDA spawn in their pocket, and their toolbelt on their belt
  • -
  • The nuke going off on station will now gib everyone on the Z level.
  • -
  • Two more core displays are available for the AI
  • -
  • The Artificer can now build cult floors and walls
  • -
-
-

Friday, April 13th

-

Sieve updated:

-
    -
  • Updated the robotics layout.
  • -
-

Petethegoat updated:

-
    -
  • Nerfed the librarian by removing the r-walls from his cubbyhole thing, fuck WGW readers hiding out in there.
  • -
-
-
-

Thursday, April 12th

-

Agouri updated:

-
    -
  • Fixed the ability to move while lying down/resting.
  • -
  • Sleep has been fixed and works as intended again. Anaesthetic and toxins can now properly put people to sleep, permanently if you keep the administration stable. Sleeplocs are now viable again. The sleep button and *faint emote work again.
  • -
-
-
-

Wednesday, April 11th

-

PolymorphBlue updated:

-
    -
  • Droppers are now used at the eyes, and thus, access to the eyes is required to have an effect.
  • -
-
- - -
-

April 10, the year of our lord 2012

-

Agouri updated:

-
    -
  • CONTRABAND-CON UPDATE: Added posters. I'm sorry to add it seperately with the rest of contraband, but there was a lack of sprites for everything else. Hopefully, people will gain interest and get me some damn sprites this way :3 - As I said, this is an ongoing project of mine. So starting of, we've got...
  • -
  • POSTERS! Posters come in rolled packages that can adhere to any wall or r_wall, if it's uncluttered enough. -

    How they get on-board: The quartermaster can now set the receiver frequency of his supplycomp circuit board. A bit simplistic as of now, will work on it later. Building a supplycomp with a properly set up circuitboard will give access to the Contraband crate. -

    How they're used: Unfold the rolled poster on any wall or r_wall to create the poster. There are currently 17 designs, with the possibility of me adding more. -

    How to get rid of them: You can rip them using your hand... To cleanly extract them and not ruin them for future use, however, you can use a pair of wirecutters. -

    How they're classified: They're contraband, so it's perfectly okay for security officers to confiscate them. Punishment for contraband-providers (or end-users, if you want to go full nazi) is up to the situational commanding officers. - -
-

Nodrak updated:

-
    -
  • Merged 'Game' and 'Lobby' tabs during pre-game into one tab
  • -
  • Added the little red x to the late-join job list
  • -
  • Late-joiners are warned if the shuttle is past the point of recall, and if the shuttle has already left the station
  • -
  • Late-joiners now see how long the round has been going on.
  • -
  • Mining shuttle computer no longer spits out both 'Shuttle has been sent' and 'The shuttle is already moving' every time.
  • -
- -
- -
-

Monday, April 9th

-

Petethegoat updated:

-
    -
  • TORE OUT DETECTIVE WORK! THIS IS A TEMPORARY PATCH TO SEE IF THIS FIXES THE CRASHING.
  • -
  • DETECTIVE SCANNERS AND EVIDENCE BAGS (AND FINGERPRINTS) ARE GONE.
  • -
-
- -
-

Sunday, April 8th

-

PolymorphBlue updated:

-
    -
  • Secret little rooms now spawn on the mining asteroid, containing various artifacts.
  • -
  • Added the beginnings of a borg upgrade system. Currently, can be used to reset a borg's module.
  • -
-
- -
-

2 April 2012

-

PolymorphBlue updated:

-
    -
  • ERP is gone. Hope you enjoyed it while it lasted!
  • -
-
- -
-

April Fools Day! Get hype!

-

Doohl updated:

-
    -
  • Security officers can modify people's criminal status by simply examining them with a security hud on and clicking a link that will show up as part of the character's description.
  • -
  • Less jobs have maintenance access. The only jobs that will have it now are engineers, atmos techs, cargo techs, heads, and the detective.
  • -
  • Changed Runtime's sprite to look more catlike.
  • -
  • View Variables can now better list associative lists.
  • -
  • Miscellaneous bugfixes for the NT Script IDE.
  • -
-

PolymorphBlue updated:

-
    -
  • Minor bugfixes to borg deathsquad, adds borg deathsquad to potential tensioner (set so high it's never going to happen)
  • -
  • Adds consiterable support for ERP! (If enabled.)
  • -
  • Increases cost for changeling unstun to 45
  • -
-
- -
-

30 March 2012

-

Donkie updated:

-
    -
  • You can now stick papers back in to paperbins, text will persist.
  • -
  • Added a [field] bbcode tag to the pen writing. Lets your start writing from that point.
  • -
  • Changed fonts a bit for papers to make [sign] stand out more.
  • -
-

Doohl updated:

-
    -
  • Gave pill bottles the ability to scoop up pills like ore satchels scoop ore. (There you go, /vg/ Anon.)
  • -
  • Security Officers and Wardens now start with maintenance acceess.
  • -
-
- -
-

29 March 2012

-

PolymorphBlue updated:

-
    -
  • Exosuits now provide a message when someone is getting in, someone getting in must remain stationary and unstunned, and getting in takes four seconds.
  • -
-
- -
-

28 March 2012

-

Carn updated:

-
    -
  • Fixed turrets shooting people that leave the area and the telecomm turret controls.
  • -
-

Donkie updated:

-
    -
  • Updated air alarm's GUI.
  • -
-
- -
-

27 March 2012

-

Nodrak updated:

-
    -
  • Security borgs now have modified tasers.
  • -
  • Security borgs have gone back to having the same movement speed as all other borgs.
  • -
-
- -
-

23 March 2012

-

Doohl updated:

-
    -
  • Escape shuttles/pods now spend about 2 minutes in high-speed transit before they reach centcom/recon shuttle. This is a warning: regular after-round shuttle grief is NOT OKAY while the shuttle is still in transit! Save it for when the shuttle gets to centcom! The purpose of this is to give potential antagonists and protagonists a chance to have a final showdown in the shuttle. The round does not end until the shutle comes to a stop and docks. Don't step outside while the shuttle is moving!

    For example; if you are a traitor and have an escape-alone objective and a couple of people manage to squeeze in the shuttle, you have two minutes to kill/toss them out to win. Or you can just chill for the duration and reflect on the round.
  • -
- -

Donkieyo updated:

-
    -
  • A bunch new standard-namespace NTSL functions added! Check them out at the NT Script wiki page!
  • -
-
- -
-

22 March 2012

-

Ricotez updated:

-
    -
  • Medical Lockers, Security Lockers, Research Lockers, Warden Locker, CMO Locker, and RD locker all have new sprites.
  • -
  • Encryption keys now each have their own invidual sprites.
  • -
- -

PolymorphBlue updated:

-
    -
  • Added a prototype holodeck to fitness!
  • -
  • Assorted tensioner fixes
  • -
- -
-

20 March 2012

-

Kor updated:

-
    -
  • Lasertag vests and guns have been added to fitness.
  • -
  • Art storage has replaced the emergency storage near arrivals. Emergency storage has replaced chem storage (has anyone ever used that?)
  • -
  • Wraiths can now see in the dark
  • -
-
- - -
-

19 March 2012

-

PolymorphBlue updated:

-
    -
  • Added LSD sting to modular changeling by popular demand.
  • -
  • Silence sting no longer provides a message to the victim.
  • -
  • Tensioner will no longer assign dead people as assassination targets.
  • -
-
- -
-

18 March 2012

-

Quarxink updated:

-
    -
  • The medical record computers can finally search for DNA and not just name and ID.
  • -
-
- -
-

14 March 2012

-

PolymorphBlue updated:

-
    -
  • Modular changeling added! Changelings now purchase the powers they want. Balancing still underway, but should be playable.
  • -
-

Petethegoat updated:

-
    -
  • Janitor cyborgs have been massively upgraded. Suffice to say they're pretty ballin' now...
  • -
-

Nodrak updated:

-
    -
  • You can now choose whether to spawn with a backpack, satchel, or nothing. Excess items will spawn in your hands if necessary.
  • -
  • You can now choose what kind of underwear you'd like to wear, per a request.
  • -
-
- -
-

14 March 2012

-

Carn updated:

-
    -
  • Added 6 female hairstyles -- credits go to Erthilo of Baystation. Added a male hairstyle -- credits go to WJohnston of TG. If you can sprite some unique and decent-looking hair sprites, feel free to PM me on the TG forums.
  • -
-
    -
  • The way objects appear to be splattered with blood has been rewritten in an effort to fix stupid things happening with icons. It should be called far less frequently now. PLEASE, if you experience crashes that could in anyway be related to blood, report them with DETAILED information. Thanks
  • -
-
- -
-

13 March 2012

-

Nodrak & Carn updated:

-
    -
  • Fixed the way flashes break. Long story short: They'll never break on first use so rev don't get screwed over. They run out of charge temporarily when spammed but recharge. Spamming them also increases the chance of them breaking a little, so use them sparingly.
  • -
-

Doohl updated:

-
    -
  • Ablative Armor now has a high chance of reflecting energy-based projectiles.
  • -
  • Riot shields were buffed; they now block more attacks and they will prevent their wielder from being pushed (most of the time).
  • -
-
- -
-

12 March 2012

-

PolymorphBlue updated:

-
    -
  • PDA messages now require an active messaging server to be properly sent.
  • -
-
- -
-

11 March 2012

-

PolymorphBlue updated:

-
    -
  • The AI can now open doors with shift+click, bolt them with ctrl+click, and shock them with alt+click
  • -
  • Tratior borgs who hack themselves cannot be blown by the robotics console, and can override lockdowns.
  • -
  • Adds a new wire to doors that controls the time delay before they close. If pulsed, they close like a sliding glass door. If cut, they do not close by themselves.
  • -
  • Borgs who have died, ghosts, and are then blown up will now have their ghosts properly transfered to their dropped MMIs.
  • -
-

Carnwennan updated:

-
    -
  • You can now request AI presence at a holopad for immediate private communication with the AI anywhere. AIs can click a quick button to zoom to the holopad.
  • -
-
- -
-

08 March 2012

-

Nodrak and Carnwennan updated:

-
    -
  • Nodrak: Fixed crayon boxes and stuff getting stuck in pockets.
  • -
  • Nodrak: 'Steal item' objectives will report correctly when wrapped up in paper now.
  • -
  • Carn: fixed the vent in the freezer...poor chef kept suffocating.
  • -
-
- -
-

02 March 2012

-

Carn updated:

-
    -
  • Fixed a number of issues with mob examining. Including: not being able to see burns unless they were bruised; vast amounts of grammar; and icons. Updated them to use stylesheet classes.
  • -
  • Borgs can no-longer drop their module items on conveyor belts.
  • -
  • Names input into the setup screen are now lower-cased and then have their first letters capitalised. This is to fix problems with BYOND's text-parsing system.
  • -
  • Runtime fix for lighting.
  • -
  • Over the next few commits I will be updating a tonne of item names to fix text-parsing. Please inform me if I've typoed anything.
  • -
-
- -
-

03 March 2012

-

Petethegoat updated:

-
    -
  • Removed cloakers. Removed Security's thermals. Added disguised thermals as a traitor item.
  • -
-
- -
-

01 March 2012

-

SkyMarshal updated:

-
    -
  • Tweak/Bugfix for Hallucinations. Much more robust.
  • -
-
- -
-

01 March 2012

-

SkyMarshal updated:

-
    -
  • Ported BS12 Detective Work System
  • -
-
- -
-

1 March 2012

-

Petethegoat updated:

-
    -
  • Head revolutionaries no longer spawn with traitor uplinks.
  • -
      -
    -
- -
-

29 February 2012

-

SkyMarshal updated:

-
    -
  • BS12 Hallucination and Dreaming port
  • -
      -
    -
- - -
-

29 February 2012

-

muskets updated:

-
    -
  • Integrated BS12's improved uplink code
  • -
-
- - -
-

26 February 2012

-

Doohl updated:

-
    -
  • The insane crashing has finally been fixed!
  • -
-
- -
-

25 February 2012

-

Doohl updated:

-
    -
  • Telecommunications has been refined, with many new features and modules implemented.
  • -
  • NTSL (Nanotrasen Scripting Language) is ONLINE! This is a brand new, fully operational scripting language embedded within SS13 itself. The intended purpose is to eventually expand this scripting language to Robotics and possibly other jobs, but for now you may play with the TCS (Traffic Control Systems) implementation of NTSL in the Telecommunications Satellite. Recommended you read the NT Script wiki page for information on how to use the language itself. Other than that, there's not a lot of documentation.
  • -
  • Radio systems have been further optimized, bugfixed, etc. Should be more stable.
  • -
  • Intercoms now require power to work.
  • -
-
- - -
-

24 February 2012

-

PolymorphBlue updated:

-
    -
  • Headsets are now modular! Use a screwdriver on them to pop out their encrpytion keys, and use a key on one to put it in. A headset can hold two keys. Normal headsets start with 1 key, department headsets with two. The standard chip does nothing, and is not required for listening to the common radio.
  • -
  • Binary translators made into a encrpytion key, and fixed. They now broadcast to AIs properly.
  • -
-
- -
-

23 February 2012

-

PolymorphBlue updated:

-
    -
  • MMIs/pAIs no longer lip read, and thus can now hear in the dark.
  • -
  • Borg rechargers are no longer Faraday cages, and thus can now receive radio while they're recharging.
  • -
-

LastyScratch updated:

-
    -
  • Glass airlocks now make a different sound than regular airlocks.
  • -
  • in 1997 nanotrasen's first AI malfunctioned
  • -
  • Toggle ambience probably works now! -
  • Runtime is dead. -
  • The Research Director's consoles were moved into the completely empty cage in the back of his office.
  • -
-
- - -
-

22 February 2012

-

PolymorphBlue updated:

-
    -
  • Changed alt+click to ctrl+click for pulling.
  • -
-

Petethegoat updated:

-
    -
  • New stationary scrubber sprites~
  • -
  • Removed the mint. Coins can still be found and used in vending machines. PACMANs now run off sheets.
  • -
-

coolity updated:

-
    -
  • New sprites for HoS and Captain lockers.
  • -
  • New sprites for the orebox.
  • -
-
- -
-

21 February 2012

-

Petethegoat updated:

-
    -
  • The jetpacks now display correctly when worn.
  • -
  • Buckling to chairs no longer causes you to drop your weapon
  • -
-

Nodrak updated:

-
    -
  • Ghosts now have a "Jump to Mob" verb.
  • -
-

Sieve updated:

-
    -
  • Mining lanterns work properly once again!.
  • -

    Skaer updated:

    -
      -
    • The armoury now includes a box of spare Sec cartridges.
    • -
    -
- -
-

19 February 2012

-

Petethegoat updated:

-
    -
  • The jetpacks in EVA have been replaced with CO2 ones, painted a classy black.
  • -
  • Additionally, jetpacks will now run on gases other than oxygen, as you would expect.
  • -
  • Chair overhaul! You shouldn't notice anything different, but if you encounter bugs with chairs or beds, please report those asap.
  • -
  • New electric chair sprites, by myself.
  • -
  • Electric chairs will only electrocute people buckled into them.
  • -
  • Karma should be fixed.
  • -
-

KorPhaeron updated:

-
    -
  • A new construct type: Artificer. It is capable of constructing defenses, repairing fellow constructs, and summoning raw materials to construct further constructs
  • -
  • Simple animals (constructs, Ian, etc) can now see their health in the Status tab
  • -
  • Detective's revolver is non-lethal again. Was fun while it lasted
  • -
-
- -
-

18 February 2012

-

Petethegoat updated:

-
    -
  • Foam has a reduced range to prevent spamming
  • -
-

Sieve updated:

-
    -
  • Stopped the unholy Radium/Uranium/Carbon smoke that crashed the server. And for anyone that did this, you are a horrible person
  • -
  • Cleanbots clean dirt
  • -
  • Cleanbots automatically patrol on construction
  • -
  • Removed silicate because it is not useful enough for how much lag it caused
  • -
-
- -
-

16 February 2012

-

Smoke Carter updated:

-
    -
  • Newscasters now alert people of new feeds and wanted-alerts simultaneously.
  • -
-
- -
-

15 February 2012

-

Kor updated:

-
    -
  • Terrorists Win! Desert Eagles and Riot Shields now spawn on the syndicate shuttle, replacing the c20r
  • -
  • The Detectives gun still uses .38, but they're now fully lethal bullets. Go ahead, make his day.
  • -
  • The Veil Render has been nerfed, the Nar-Sie it spawns will not pull anchored objects. This is a temporary measure, more nerfs/reworking to come
  • -
-
- -
-

14 February 2012

-

Carn updated:

-
    -
  • Spacevines added to the random events.
  • -
  • The bug where doors kept opening when a borg tried to close them at close range is now fixed.
  • -
-
- -
-

13 February 2012

-

Khodoque updated:

-
    -
  • Security officers, the warden and the HoS have new jumpsuits.
  • -
-

Erro updated:

-
    -
  • Clicking the internals button on your user interface (The one that shows if you have internals on or not) will now toggle internals even if they are in your pockets. (humans only) - It now works if your internals are on your back, suit storage, belt, hands and pockets.
  • -
  • The public autolathe has been removed. If you want some some stuff from a lathe, go to cargo.
  • -
-

Kor updated:

-
    -
  • A new item, the null rod, protects the one bearing it from cult magic. One starts in the chaplains office, and this replaces the job based immunity he had. The null rod also is capable of dispelling runes upon hitting them (the bible can no longer do this)
  • -
  • Shooting fuel tanks with lasers or bullets now causes them to explode
  • -
  • A construct shell is now waiting to be found in space.
  • -
  • Chaplains can no longer self heal with the bible
  • -
  • Simple animals, including constructs, can now attack mechs and critters
  • -
- -
- -
-

12 February 2012

-

Erro updated:

-
    -
  • You can no longer attach photos to ID cards. This never worked properly and if anything, it was misleading.
  • -
  • Backpacks can now hold 7 normal sized items (box size) as opposed to 6 normal sized items + 1 small item
  • -
  • Added several fire alarms to areas around the station including the brig, engineering and others
  • -
  • The atmospherics department now has a few hazard vests available for atmos techs to wear if they don't like the fire suit
  • -
  • Roboticist now have engineering + science headsets, virologists now have medsci headsets with medical + science channels
  • -
  • Added some headsets to the jobs that didn't have any extras: roboticist, qm, scientist, virologist and geneticist.
  • -
  • Station engineers now have construction site access (vacent office by arrivals)
  • -
  • Replaced a few airlocks with glass airlocks (detective, autolathe, assistant storage, robotics, checkpoint)
  • -
  • Removed the wall that was blocking the entrance to the theater
  • -
  • Made a small redesign for the HoP's office so that people running towards it from the escape hallway don't run right into the queue, annoying everyong
  • -
  • The engineering, command and security airlocks now glow green when closing instead of red to match all the other airlocks
  • -
  • The disposal units now auto trigger every 30 game ticks, if there is something (or someone) in them. So no more hiding in disposal units!
  • -
  • You can no longer control the disposal unit from within it. You will have to wait for it to trigger itself.
  • -
  • You can no longer strip items off of Ian while dead / a ghost
  • -
-

Pete updated:

-
    -
  • Updated fitness, athletic shorts are now available!
  • -
-
- - -
-

11 February 2012

-

Erro updated:

-
    -
  • You can now take individual crayons out of the crayon box the same way as from boxes
  • -
  • Clicking a grille with a glass or reinforced glass pane in your hand will glaze the grille from the direction you're looking from (don't forget to fasten the window tho)
  • -
  • When you click somewhere with the intent to interact, you will automaticaly face the item you're trying to interact with. This won't slow you down when running and firing guns behind you.
  • -
-

Kor updated:

-
    -
  • A new passive mob ability: Relentless. Relentless mobs cannot be shoved (though may still swap places with help intent)
  • -
  • Alien Queens, Juggernaut constructs, and Medical Borgs are all Relentless. Maybe the medborg can actually drag people to medbay on time now
  • -
  • Two constructs, the Juggernaut and the Wraith are now available for wizards and cultists to use soul stones with
  • -
  • A new highly destructive artefact, Veil Render, is now available for wizards
  • -
  • A new one time use global spell, Summon Guns, is now available for wizards.
  • -
  • DEEPSTRIKING! There is now a partially constructed teleporter on the nuke shuttle, and for a large sum of telecrystals they may purchase the circuitboard needed to complete it.
  • -
  • The Chaplain is immune to cult stun, blind, deafen, and blood boil
  • -
-
- -
-

10 February 2012

-

Quarxink updated:

-
    -
  • Added a new toy: Water balloons. They can be filled with any reagent and when thrown apply the reagents to the tile and everything on it.
  • -
-
- -
-

9 February 2012

-

Erro updated:

-
    -
  • Engineering and security lockers now spawn with their respective backpacks in them so job-changers can look as they should. HoS locker now also contains an armored vest, for the convenience of the HoS who wants to play with one.
  • -
  • Slightly changed the spawn order of items in the CE and HoS lockers to make starting up a hint less tedious.
  • -
-
- -
-

8 February 2012

-

ConstantA updated:

-
    -
  • Added Exosuit Jetpack
  • -
  • Added Exosuit Nuclear Reactor (runs of normal, everyday uranium, maybe I'll switch it to run on enriched) - requires research (level 3 in Materials, Power Manipulation and Engineering)
  • -
  • Added Ripley construction steps sprites (courtesy of WJohnston - man, you're awesome)
  • -
  • Exosuit Sleeper can now inject occupant with reagents taken from Syringe Gun
  • -
  • Exosuit Cable Layer will now auto-dismantle floors
  • -
  • Exosuit Heavy Lazer cooldown increased, Scattershot now fires medium calibre ammo (less damage)
  • -
  • Exosuit wreckage can be pulled
  • -
  • EMP now drains half of current exosuit cell charge, not half of maximum charge.
  • -
  • Fixed several possible exosuit equipment runtimes
  • -
  • Introduced new markup to changelog. Javascript is extremely slow (in byond embedded browser) for some reason.
  • -
-
-
-

4 February 2012, World Cancer Day

-

Erro updated:

-
    -
  • Examining humans now works a bit differently. Some external suits and helmets can hide certain pieces of clothing so you don't see them when examining. Glasses are also now displayed when examining.
  • -
  • The job selection screen has been changed a little to hopefully make making changes there easier.
  • -
-
-31 January 2012 -
    -
  • Carn updated: -
      -
    • Grammar & various bug-fixes
    • -
    • Thank-you to everyone who reported spelling/grammar mistakes. I'm still working on it, so if you spot anymore please leave a comment here. There's still lots to fix.
    • -
    • Mining station areas should no longer lose air.
    • -
    -
- - -30 January 2012( -
    -
  • Sieve updated: -
      -
    • This stuff is actually already implemented, it just didn't make it to the changelog
    • -
    • Firefighter Mech - A reinforced Ripley that is more resistant to better cope with fires, simply look in the Ripley Contruction manual for instructions.
    • -
    • Mech contruction now has sounds for each step, not just 1/4 of them.
    • -
    • Mech Fabricators are fixed, Manual Sync now works and certain reseach will reduce the time needed to build components.
    • -
    • Added special flaps to the mining station that disallow air-flow, removing the need to shuffle Ore Boxes through the Airlocks.
    • -
    • Each outpost has it's own system for the conveyors so they won't interfere with each other.
    • -
    • Powercell chargers have been buffed so now higher capacity cells are actually useable.
    • -
    • A diamond mech drill has been added. While it isn't any stronger than the standard drill, it is much faster.
    • - -
    -
- -29 January 2012, got Comp Arch exams on Wednesday :( -
    -
  • Agouri updated: -
      -
    • UPDATE ON THE UPDATE: Newspapers are now fully working, sorry for that. Some minor icon bugs fixed. Now I'm free to work on the contest prizes :3
    • -
    • Newscasters are now LIVE! Bug reports, suggestions for extra uses, tears etc go here.
    • -
    • What ARE newscasters? Fans of the Transmetropolitan series might find them familiar. Basically, they're terminals connected to a station-wide news network. Users are able to submit channels of their own (one per identified user, with channels allowing feed stories by other people or, if you want the channel to be your very own SpaceJournal, being submit-locked to you), while others are able to read the channels, either through the terminals or a printed newspaper which contains every news-story circulating at the time of printing.
    • -
    • About censorship: You can censor channels and feed stories through Security casters, found in the HoS'es office and the Bridge. Alternatively, if you want a channel to stop operating completely, you can mark it with a D-Notice which will freeze it and make all its messages unreadable for the duration it is in effect. If you've got the access, of course.
    • -
    • Basically I think of the newscaster as nothing more as an additional Roleplaying tool. Grab a newspaper along with your donuts and coffee from the machines, read station rumors when you're manning your desk, be a station adventurer or journalist with your very own network journal!
    • -
    • I would ask for a bit of respect when using the machine, though. I removed all and any channel and story restrictions regarding content, so you might end up seeing channels that violate the rules, Report those to the admins.
    • -
    • Finally, due to the removal of the enforced "Channel" string, it's recommended to name your channels properly ("Station Paranormal Activity Channel" instead of "Station Paranormal Activity", for example") - -
    -
- -28 January 2012 -
    -
  • BubbleWrap updated: -
      -
    • Arresting buff!
    • -
    • A person in handcuffs being pulled cannot be bumped out of the way, nor can the person pulling them. They can still push through a crowd (they get bumped back to behind the person being pulled, or pushed ahead depending on intent).
    • -
    -
- -27 January 2012 -
    -
  • LastyScratch updated: -
      -
    • Toggle-Ambience now works properly and has been moved from the OOC tab to the Special Verbs tab to be with all the other toggles.
    • -
    -
  • RavingManiac updated: -
      -
    • The bar now has a "stage" area for performances.
    • -
    -
  • Blaank updated: -
      -
    • Added a vending machine to atmopherics reception desk that dispenses large -oxygen tanks, plasma tanks, emergency oxegen tanks, extended capacity emergency -oxygen tanks, and breath masks.
    • -
    -
  • Petethegoat updated (for a bunch of other people): -
      -
    • Lattice is now removed when you create plating or floor (credit Donkieyo).
    • -
    • Monkeys now take damage while in crit (credit Nodrak).
    • -
    • The warden now has his own jacket. (credit Shiftyeyesshady).
    • -
    • Spectacular new dice that will display the proper side when rolled!! (credit TedJustice)
    • -
    • Spectacular new dice that will display the proper side when rolled!! (credit TedJustice)
    • - -
    • Borg RCDs can no longer take down R-walls. (headcoder orders)
    -
- -19 January 2012 -
    -
  • Petethegoat updated: -
      -
    • Exciting new pen additions! Get the low-down at the wiki.
    • -
    -
- -17 January 2012 -
    -
  • Doohl updated: -
      -
    • Syndicate shuttle now starts with a All-In-One telecommunication machine, which acts as a mini-network for the syndie channel. It intercepts all station radio activity, too, how cool is that?
    • -
    -
- -15 January 2012 -
    -
  • Doohl updated: -
      -
    • The radio overhaul 'Telecommunications' is now LIVE. Please submit any opinions/feedback in the forums and check the wiki article on Telecommunications for some more info for the curious.
    • -
    • The AI satellite has been replaced with a communications satellite. You can get there via teleporter or space, just like the AI satellite. I highly recommend not bum-rushing the new satellite, as you may be killed if you don't have access. It's a very secure place.
    • -
    • Once a human's toxicity level reaches a certain point, they begin throwing up. This is a natural, but overall ineffective method of purging toxins from the body.
    • -
    • You can now travel Z-levels in Nuclear Emergency mode (the nuke disk is still bound to the station). This means the nuclear agents can and probably will fly off into space to blow up the comm satellite and shut down communications.
    • -
    -
- -9 January 2012 -
    -
  • ConstantA updated: -
      -
    • Reworked exosuit internal atmospherics (the situation when exosuit is set to take air from internal tank, otherwise cabin air = location air): -
        -
      • If current cabin presure is lower than &quot;tank output pressure&quot;, the air will be taken from internal tank (if possible), to equalize cabin pressure to &quot;tank output pressure&quot;
      • -
      • If current cabin presure is higher than &quot;tank output pressure&quot;, the air will be siphoned from cabin to location until cabin pressure is equal to &quot;tank output pressure&quot;
      • -
      • Tank air is not altered in any way even if it's overheated or overpressured - connect exosuit to atmos connector port to vent it
      • -
      • &quot;Tank output pressure&quot; can be set through Maintenance window - Initiate maintenance protocol to get the option
      • -
      -
    • -
    • Fixed bug that prevented exosuit tank air updates if exosuit was connected to connector port
    • -
    • Combat exosuits melee won't gib dead mobs anymore
    • -
    • QM exosuit circuit crates cost lowered to 30 points
    • -
    • Exosuit plasma converter effectiveness +50%
    • -
    -
- - -8 January 2012 -
    -
  • Agouri updated: -
      -
    • I'm back home and resumed work on Newscasters and Contraband.
    • -
    • But I got bored and made cargo softcaps instead. Flippable! Enjoy, now all we need is deliverable pizzas.
    • -
    • Oh, also enjoy some new bodybag functionality and sounds I had ready a while ago, with sprites from Farart. Use a pen to create a visible tag on the bodybag. Wirecutters to cut it off. Also it's no longer weldable because it makes no goddamn sense. -
    -
- -7 January 2012 -
    -
  • Donkieyo updated: -
      -
    • You must now repair damaged plating with a welder before placing a floor tile.
    • -
    • You can now relabel canisters if they're under 1kPa.
    • -
    -
  • Polymorph updated: -
      -
    • Dragging your PDA onto your person from your inventory will bring up the PDA screen.
    • -
    • You can now send emergancy messages to Centcomm (Or, with some.. tampering, the Syndicate.) via a comms console. (This occurs in much the fashion as a prayer.)
    • -
    -
-3 January 2012 -
    -
  • Erro updated: -
      -
    • Shift-clicking will now examine whatever you clicked on!
    • -
    -
  • Polymorph updated: -
      -
    • Alt-clicking will now pull whatever you clicked on!
    • -
    -
- -1 January 2012 (12 more months until doomsday) -
    -
  • Doohl updated: -
      -
    • XENOS ARE NOW IMMUNE TO STUNNING! To compensate, stunning via tasers/batons now slows them down significantly.
    • -
    - -
  • Polymorph updated: -
      -
    • Doors no longer close if they have a mob in the tile. (Generally!) Door safties can now be overriden to close a door with a mob in the tile and injure them severely.
    • -
    - -
- -29 December 2011 -
    -
  • ConstantA updated: -
      -
    • Added some new Odysseus parts and tweaked old ones.
    • -
    • Added Exosuit Syringe Gun Module
    • -
    • New Odysseus sprites - courtesy of Veyveyr
    • -
    -
  • Polymorph updated: -
      -
    • Air Alarms can now be hacked.
    • -
    • Too much of a good thing is just as bad as too little. Pressures over 3000 kPa will do brute damage.
    • -
    -
- -28 December 2011 -
    -
  • RavingManiac updated: -
      -
    • Wrapped objects can now be labelled with a pen
    • -
    • Wrapped small packages can be picked up, and are now opened by being used on themselves
    • -
    • Mail office remapped such that packages flushed down disposals end up on a special table
    • -
    • Package wrappers placed in most of the station departments
    • -
    • In short, you can now mail things to other departments by wrapping the object, labelling it with the desired destination using a pen, and flushing it down disposals. At the mail room, the cargo tech will then tag and send the package to the department.
    • -
    -
- -27 December 2011 -
    -
  • Errorage updated: -
      -
    • Engineering's been remapped
    • -
    -
  • RavingManiac updated: -
      -
    • Refrigerators and freezer crates will now preserve meat
    • -
    -
- -25 December 2011 -
    -
  • ConstantA updated: -
      -
    • Circuit boards for Odysseus mech can be ordered by QM
    • -
    • Designs for them were added to R&amp;D
    • -
    -
  • -
  • Kor updated: -
      -
    • Soul Stones Added: Like intellicards for dead or dying humans! Full details are too long for the changelog
    • -
    • A belt full of six soul stones is available as an artefact for the wizard
    • -
    • Cultists can buy soulstones with their supply talisman
    • -
    • The chaplain has a single soulstone on his desk
    • -
    • The reactive teleport armour's test run is over. It no longer spawns in the RD's office.
    • -
    -
  • -
- - - -24 December 2011 -
    -
  • Rockdtben updated: -
      -
    • Added sprites for soda can in left and right hands on mob: sodawater, tonic, purple_can, ice_tea_can, energy_drink, thirteen_loko, space_mountain_wind, dr_gibb, starkist, space-up, and lemon-lime.
    • -
    -
  • - -
- -23 December 2011 -
    -
  • ConstantA updated: -
      -
    • Mech Fabricators now require robotics ID to operate. Emag removes this restriction.
    • -
    • Added Odysseus Medical Exosuit. Has integrated Medical Hud and ability to mount medical modules.
    • -
    • Added Sleeper Medical module for exosuits. Similar to common sleepers, but no ability to inject reagents.
    • -
    • Added Cable Layer module for exosuits. Load with cable (attack cable with it), activate, walk over dismantled floor.
    • -
    • Added another exosuit internal damage type - short circuit. Short-circuited exosuits will drain powercell charge and power relay won't work.
    • -
    • You should be able to send messages to exosuit operators using Exosuit Control Console
    • -
    • Gygax armour and module capacity nerfed.
    • -
    • Exosuit weapon recharge time raised.
    • -
    • Bugfix: EMP actually drains exosuit cell and damages it
    • -
    -
  • -
  • RavingManiac updated: -
      -
    • Meat will now spoil within three minutes at temperatures between 0C and 100C.
    • -
    • Rotten meat has the same nutritional value as normal meat, and can be used in -the same recipes. However, it is toxic, and ingesting a badly-prepared big bite -burger can kill you.
    • -
    • Because refrigeration serves a purpose now, the kitchen cold room freezing unit -is turned off by default. Chefs should remember to turn the freezer on at the -start of their shift.
    • -
    -
  • -
- -21 December 2011 -
    -
  • RavingManiac updated: -
      -
    • Kitchen cold room is now cooled by a freezing unit. Temperature is about 240K by default, but can be raised to room temperature or lowered to lethal coldness.
    • -
    -
- -19 December 2011 -
    -
  • Kor updated: -
      -
    • General/Misc Changes -
        -
      • Escape pods no longer go to the horrific gibbing chambers. Rather, they will be picked up by a salvage ship in deep space. (This basically changes nothing mechanics wise, just fluff)
      • -
      • An ion rifle now spawns on the nuclear operative shuttle. Maybe this will help with them getting destroyed by sec borgs every round?
      • -
      -
    • -
    • Wizard Changes -
        -
      • The wizard can now purchase magic artefacts in addition to spells in a subsection of the spellbook.
      • -
      • The first (and currently only) new artefact is the Staff of Change, which functions as a self recharging energy weapon with some special effects.
      • -
      • The wizard has a new alternative set of robes on his shuttle.
      • - -
      -
    • Cult Changes
        -
      • Cultists now each start with three words (join, blood, self). No more will you suffer at the hands of cultists who refuse to share words.
      • -
      • The starting supply talisman can now be used five times and can now be used to spawn armor and a blade.
      • -
      • Replaced the sprites on the cultist robes/hood.
      • -
    • -
    -
- -18 December 2011 -
    -
  • Carnwennan updated: -
      -
    • Thanks to the wonders of modern technology and the Nanotrasen steel press Ian's head has been shaped to fit even more silly hats. The taxpayers will be pleased.
    • -
    -
  • -
  • Doohl updated: -
      -
    • Vending machines got yet another overhaul! Good lord, when will they stop assfucking those damned vendors??
    • -
    -
  • -
- -17 December 2011 -
    -
  • Erro updated: -
      -
    • Your direct supervisors are now displayed when you are assigned a job at round start or late join.
    • -
    -
  • -
- -14 December 2011 -
    -
  • Erro updated: -
      -
    • Meteor mode is hopefully deadly again!
    • -
    -
  • -
  • Kor updated: -
      -
    • Research director has a new toy: Reactive Teleport Armour. Click it in your hand to activate it and try it out!
    • -
    -
  • -
- -11 December 2011 -
    -
  • NEO updated: -
      -
    • AIs actually consume power from APCs now
    • -
    • Bigass malf overhaul. tl;dr no more AI sat, instead you have to play whackamole with APCs.
    • -
    -
  • -
- -10 December 2011 -
    -
  • Doohl updated: -
      -
    • Title music now plays in the pregame lobby. You can toggle this with a verb in "Special Verbs" if you really want to.
    • -
    • User Interface preferences now properly get transferred when you get cloned.
    • -
    -
  • -
  • Erro updated: -
      -
    • Escape pods have been added to test the concept.
    • -
    • Escaping alone in a pod does not count towards the escape alone objective, it counts towards the escape alive objective tho. Escape alone only requires you to escape alone on the emergency shuttle, it doesn't require you to ensure all pods are empty. Cult members that escape on the pods do not ocunt towards the cult escaping acolyte number objective. Escaping on a pod is a valid way to survive meteor.
    • -
    -
  • -
  • Polymorph updated: -
      -
    • Fire is now actually dangerous. Do not touch fire.
    • -
    -
  • - - -
- -8 December 2011 -
    -
  • Errorage updated: -
      -
    • Fixed the comms console locking up when you tried to change the alert level.
    • -
    • Added a keycard authentication device, which is used for high-security events. The idea behind it is the same as the two-key thing from submarine movies. You select the event you wish to trigger on one of the devices and then swipe your ID, if someone swipes their ID on one of the other devices within 2 seconds, the event is enacted. These devices are in each of the head's offices and all heads have the access level to confirm an event, it can also be added to cards at the HoP's ID computer. The only event that can currently be enacted is Red alert.
    • -
    -
  • -
  • Kor updated: -
      -
    • The chef now has a fancy dinner mint in his kitchen. It is only wafer thin!
    • -
    -
  • -
- -3 December 2011 -
    -
  • Pete & Erro Christmas update: -
      -
    • Reinforced metal renamed to steel and steel floor tile renamed to metal floor tile to avoid confusion before it even happens.
    • -
    • It is no longer possible to make steel from metal or vice versa or from the autolathe. You can however make metal from the autolathe and still insert steel to increase the metal resource.
    • -
    • To make steel you can now use the mining smelting unit and smelt iron and plasma ore.
    • -
    • The RCD can no longer take down reinforced walls.
    • -
    -
  • -
  • Errorage updated: -
      -
    • Grass plants in hydro now make grass floor tiles instead of the awkward patches.
    • -
    -
  • -
  • Petethegoat updated: -
      -
    • Fixed all known vending machine issues.
    • -
    • Fixed a minor visual bug with emagged lockers.
    • -
    • Clarified some of the APC construction/deconstruction messages.
    • -
    -
  • -
  • Numbers updated: -
      -
    • Potency variations tipped in favour of bigger changes over smaller periods of time.
    • -
    -
  • -
  • PolymorphBlue updated: -
      -
    • Traitors in the escape shuttle's prison cell will now fail their objective.
    • -
    • Lockers are no longer soundproof! (or flashproof, for that matter)
    • -
    • Headrevs can no longer be borged, revs are dereved when borged. -
    -
  • -
- -30 November 2011 -
    -
  • Vinyl Scratch updated: -
      -
    • New ambient sounds for the station and AI Sat.
    • -
    • He's baaaaaack...
    • -
    -
  • -
- -27 November 2011 -
    -
  • Kor updated: -
      -
    • Changeling husks are now borgable again (though not clonable) and genome requirements were lowered
    • -
    • De-revved revolutionaries had their message clarified a bit. You remember the person who flashed you, and so can out ONE revhead
    • -
    • Light tubes/bulbs can now be created in the autolathe. Recycle those broken lights!
    • -
    -
  • -
- -22 November 2011 -
    -
  • Doohl updated: -
      -
    • The firing range now has a purpose. Go check it out; there's a few surprises!
    • -
    -
  • -
- -19 November 2011 -
    -
  • Doohl updated: -
      -
    • Toggling admin midis will now DISABLE THE CURRENT MIDI OH MY GOSH!
    • -
    -
  • -
  • Tobba updated: -
      -
    • We're looking for feedback on the updated chem dispenser! It no longer dispenses beakers of the reagent, and instead places a variable amount of the reagent into the beaker of your choosing.
    • -
    -
  • -
  • Petethegoat updated: -
      -
    • Diagonal movement is gone on account of them proving to be a bad idea in practice. A grand experiment nonetheless.
    • -
    -
  • -
  • Kor updated: -
      -
    • The PALADIN lawset in the AI upload has been replaced with the corporate lawset
    • -
    -
  • -
- -16 November 2011 -
    -
  • Tobba updated: -
      -
    • Report any issues with the updated vending machines!
    • -
    -
  • -
- -16 November 2011 -
    -
  • Petethegoat updated: -
      -
    • Security, Engineer, Medical, and Janitor borgs no longer get a choice of skin. This is for purposes of quick recognition, and is the first part of a series of upcoming cyborg updates.
    • -
    -
  • -
- -7 November 2011 -
    -
  • Kor updated: -
      -
    • Repair bots (mechs) are now adminspawn only
    • -
    • Extra loyalty implants are now orderable via cargo bay (60 points for 4 implants)
    • -
    • Changeling regen stasis now takes two full minutes to use, but can be used while dead. Burning and gibbing are the only way to keep them dead now.
    • -
    -
  • -
- -29 October 2011 -
    -
  • ConstantA updated: -
      -
    • Added step and turn sounds for mechs
    • -
    • Added another mecha equipment - plasma converter. Works similar to portable generator. Uses solid plasma as fuel. Can be refueled either by clicking on it with plasma in hand, or directly from mecha - selecting it and clicking on plasma.
    • -
    • Added mecha laser cannon.
    • -
    • Added damage absorption for mechs. Different mechs have different absorption for different types of damage.
    • -
    • Metal foam now blocks air movement.
    • -
    -
  • -
  • Petethegoat updated: -
      -
    • Fixed sticking C4 to containers.
    • -
    • Rearranged the armoury, and changed the medical treatment room in Sec to an interrogation room.
    • -
    • Mr Fixit has been powered off and returned to the armoury. Deploying him every round is still recommended!
    • -
    -
  • -
- -29 October 2011 -
    -
  • Petethegoat updated: -
      -
    • Stunglove overhaul: part one. Stun gloves are now made by wiring a pair of gloves, and then attaching a battery- this shows up on the object sprite, but not on your character. Stungloves use 2500 charge per stun! This means that some low capacity batteries will make useless stungloves. To get your old inconspicous gloves back, simply cut away the wire and battery. Note that insulated gloves lose their insulation when you wire them up! Yet to come: stungloves taking extra damage from shocked doors.
    • -
    • Removed sleepypens! Paralysis pens have been changed to look like normal pens instead of penlights, and have been slightly nerfed. They will paralyse for about fifteen seconds, and cause minor brain damage and dizziness. -
    • Uplink Implants now have five telecrystals instead of four. -
    -
  • -
  • Doohl updated: -
      -
    • More hairs added and a very long beard.
    • -
    • Finally fixed the request console announcements going AMP AMP AMP all the time when you use punctuation.
    • -
    -
  • -
- -27 October 2011 -
    -
  • Mport updated: -
      -
    • New WIP TK system added. To activate your TK click the throw button with an empty hand. This will bring up a tkgrab item. Click on a non-anchored (currently) non mob Object to select it as your "focus". Once a focus is selected so long as you are in range of the focus you can now click somewhere to throw the focus at the target. To quit using TK just drop the tkgrab item.
    • -
    -
  • -
- -21 October 2011, Tuesday: -
    -
  • Errorage updated: -
      -
    • Old keyboard hotkey layout option available again! home, end, page down and page up now once again do what they did before by default. To use diagonal movement you will need to use your numpad with NUM LOCK enabled.
      - The new list of hotkeys is as follows: (Valid as of 21.10.2011) -
        -
      • Numpad with Num Lock enabled = movement in wanted direction.
      • -
      • Numpad with Num Lock disabled = as it was before. movement north-south-east-west and throw, drop, swap hands, use item on itself.
      • -
      • Page up (also numpad 9 with num lock disabled) = swap hands
      • -
      • Page down (also numpad 3 with num lock disabled) = use item in hand on itself
      • -
      • home (also numpad 7 with num lock disabled) = drop
      • -
      • end (also numpad 1 with num lock disabled) = throw
      • -
      • CTRL + A = throw
      • -
      • CTRL + S = swap hands
      • -
      • CTRL + D = drop
      • -
      • CTRL + W = use item in hand on itself
      • -
      • Numpad divide (/) = throw
      • -
      • Numpad multiply (*) = swap hands
      • -
      • Numpad subtract (-) = drop
      • -
      • Numpad add (+) = use item in hand on itself
      • -
      - In short, use Num Lock to swap between the two layouts. -
    • -
    -
  • -
- -18 October 2011, Tuesday: -
    -
  • Errorage updated: -
      -
    • You can now move diagonally! To do so, use the numpad. The keybaord has been remapped to make this possible: -
        -
      • CTRL + A = throw
      • -
      • CTRL + S = swap hands
      • -
      • CTRL + D = drop
      • -
      • CTRL + W = use item in hand on itself
      • -
      • Numpad divide (/) = throw
      • -
      • Numpad multiply (*) = swap hands
      • -
      • Numpad subtract (-) = drop
      • -
      • Numpad add (+) = use item in hand on itself
      • -
      -
    • -
    -
  • -
- -15 October 2011, White Cane Safety Day: -
    -
  • Agouri updated: -
      -
    • There has been a tidal wave of bugfixes over the last 5 or so days. If you had previously tried something on the station, saw that it was bugged and never tried it again, chances are it got fixed. I don't want you to neglect using stuff because you think it was bugged, which it was at one point, but no longer is. Thanks, happy new semester to everyone~
    • -
    -
  • -
  • Errorage updated: -
      -
    • When you're unconscious, paralyzed, sleeping, etc. you will still see the same blackness as always, but it will rarely flicker a bit to allow you to see a little of your surroundings.
    • -
    -
  • -
  • Doohl updated: -
      -
    • New hairstyles! YOU never asked for this!
    • -
    -
  • -
- -11 October 2011: -
    -
  • ConstantA updated: -
      -
    • Added radios to exosuits. Setting can be found in 'Electronics' menu.
    • -
    • Exosuit maintenance can be initiated even if it's occupied. The pilot must permit maintenance through 'Permissions &amp; Logging' - 'Permit maintenance protocols'. For combat exosuits it's disabled by default. While in maintenance mode, exosuit can't move or use equipment.
    • -
    -
  • -
- -8 October 2011: -
    -
  • Doohl updated: -
      -
    • You can put things on trays and mass-transport them now. To put stuff on trays, simply pick up a tray with items underneath/on top of it and they'll be automatically carried on top of the tray. Be careful not to make a mess~!
    • -
    -
  • -
  • Mport updated: -
      -
    • Telekenesis now only allows you to pick up objects.
    • -
    • Stun gloves ignore intent.
    • -
    • Moved the loyalty implants to the HoS' locker.
    • -
    • Job system redone, remember to setup your prefs.
    • -
    -
  • -
- -2 October 2011: -
    -
  • Petethegoat updated: -
      -
    • Pandemic recharge speed is affected by the number of different types of antibodies in the blood sample. For maximum efficiency, use blood samples with only a single type of antibody. (Blood samples with two types of antibodies will still let the Pandemic recharge slightly faster than it used to.)
    • -
    -
  • -
  • Errorage updated: -
      -
    • Opening a storage item on your belt will now display the proper number of slots even if the number is different from 7.
    • -
    • Less ponies, gryphons, and Tohou.
    • -
    -
  • -
- -1 October 2011: -
    -
  • Knognob Lungsparkle updated: -
      -
    • Xenomorphic aliens can now shape resin membranes (organic windows basically).
    • -
    • The AI can no longer see runes. Instead, they will see blood splatters.
    • -
    -
  • -
- -28 September 2011: -
    -
  • Rolan7 updated: -
      -
    • New method for job assignment. Remember to review your preferences. Send all your hate and bug reports to me.
    • -
    -
  • -
  • Doohl updated: -
      -
    • Putting someone inside a cloning machine's DNA scanner will notify the person that they are about to be cloned. This completely removes the necessity to announce over OOC for someone to get back in their body.
    • -
    -
  • -
- -22 September 2011, OneWebDay: -
    -
  • Errorage updated: -
      -
    • Added an additional 9 colors, into which you can color bedsheets, jumpsuits, gloves and shoes at the washing machine.
    • -
    • A new click proc will need to be live-tested. The testing will be announced via OOC and you will get a message when it happens. When testing is going on, the new click proc will be used. If testing is going on and you notice a bug, please report it via adminhelp. If you find yourself unable to perform an action, you can double click (By that I mean spam the shit out of clicking) to use the old proc, which is unchanged and will behave like you're used to. Standard roleplay rules apply during tests, they're not an excuse to murder eachother.
    • -
    -
  • -
- -20 September 2011, 10 year anniversary of the declaration of the "war on terror": -
    -
  • Errorage updated: -
      -
    • You can no longer clone people who suicided. I REPEAT! You can no longer clone people who have suicided! So use suiciding more carefully and only if you ACTUALLY want to get out of a round. You can normally clone people who succumbed tho, so don't worry about that.
    • -
    • Washing your hands in the sink will now only wash your hands and gloves. You can wash items if you have them in your hands. Both of these actions are no longer instant tho.
    • -
    -
  • -
- -18 September 2011, World Water Monitoring Day: -
    -
  • Errorage updated: -
      -
    • Added the most fun activity in your every-day life. Laundry. Check the dormitory. (Sprites by Hempuli)
    • -
    • You can now change the color of jumpsuits, shoes, gloves and bedsheets using the washing machine.
    • -
    • Some religions (currently Islam, Scientology and Atheism) set your chapel's symbols to the symbols of that religion.
    • -
    • A new old-style cabinet's been added to the detective's office. (Sprite by Hempuli)
    • -
    • Runtime the cat ran away!! And it gets even worse! Mr. Deempisi met a premature end during an excursion to the kitchen's freezer! -- I was ORDERED to do this... don't kill me! :(
    • -
    • Kudzu can now be spawned (Currently admin-only. Will test a bit, balance it properly and add it as a random event) (Original code and sprites donated by I Said No)
    • -
    -
  • -
  • Kor updated: -
      -
    • Added purple goggles to chemistry (you're welcome Lasty)
    • -
    • Added a third MMI to robotics and monkey cubes to xenobio (dont fucking spam them in the halls)
    • -
    -
  • -
  • Mport updated: -
      -
    • Turns out tasers and a few other weapons were slightly bugged when it came to checking the internal powercell. Tasers and such gained an extra shot.
    • -
    • Ion Rifle shots lowered to 5 per charge.
    • -
    -
  • -
- -17 September 2011, Operation Market Garden remembrance day: -
    -
  • Errorage updated: -
      -
    • You can now insert a coin into vending machines. Some machines (currently only the cigarette vending machine) have special items that you can only get to with a coin. No, hacking will not let you get the items, coin only.
    • -
    -
  • -
- -14 September 2011: -
    -
  • Lasty updated: -
      -
    • Runtime now actually spawns in medbay because nobody cared whether it is a tiny smugfaced espeon that explodes violently on death or a spacecat that presumably doesn't.
    • -
    • You can no longer put someone into a sleeper and erase them from existence by climbing into the same sleeper.
    • -
    • Players who haven't entered the game will no longer be able to hear administrators in deadchat.
    • -
    -
  • -
  • Pete updated: -
      -
    • Added new sprites for the light tube and glasses boxes.
    • -
    • Fixed the bug where syndicate bundles would have an emergency O2 tank and breath mask.
    • -
    -
  • -
  • Mport, SECOND REMOVER OF SUNS updated: -
      -
    • Singularity absorbtion explosion range lowered and is now dependent on singularity size.
    • -
    • Bag of Holding no longer instakills singularity, and the chance for bombs to destroy a singularity has been changed from 10% to 25%.
    • -
    • Removed THE SUN.
    • -
    • Damage and stun duration from shocked doors has been lowered to account for a larger amount of energy in the powernet.
    • -
    -
  • -
-13 September 2011: -
    -
  • Errorage updated: -
      -
    • Healing, attacking or 'gently tapping' Ian will now properly display the name of the attacker to all people.
    • -
    -
  • -
  • Vinyl Scratch updated: -
      -
    • Runtime!
    • -
    • Mine ambience now fades out at the end so that not only is it less jarring when it ends, but it also loops properly.
    • -
    • Malfunctioning AI's runtime message now has a voice clip to go with it (courtesy of Rosen Ritter)
    • -
    • Every headset will now display the commands for their respective channels upon examine.
    • -
    -
  • -
  • Miss Phaeron updated: -
      -
    • E-Swords now have a chance to deflect projectiles when active
    • -
    • Taser/Laser shots now drain 40 battery per use from a borg, as opposed to 20
    • -
    • EMPs do 60 damage to borgs now, up from 25. They also stun them momentarily and drain 1k charge
    • -
    • As part of a joint effort between Mport, Falazameer, and myself an Ion Rifle has been added to the armoury
    • -
    • The Mutate spell now gives Laser Vision and Hulk
    • -
    -
  • - -
- - -11 September 2011: -
    -
  • Errorage updated: -
      -
    • Ian can now be toolboxed.
    • -
    • Ian can now be healed with bruisepacks, unless he's already dead.
    • -
    • You can now walk over Ian when he's killed.
    • -
    • Ian will chase food, if you leave it on the floor. If he notices it and you pick it up, he'll chase you around, if you stay close enough.
    • -
    -
  • -
- -10 September 2011: -
    -
  • Errorage updated: -
      -
    • A new pet on the bridge.
    • -
    • The pet can now be buckled and will no longer escape from closed containers, such as closets or the cloning pods.
    • -
    • Vending machines and request consoles are the first to use the new in-built browser in the upper-right of the user interface. If feedback is positive on these, more machines will be added to this. Hoping that this will eventually reduce the number of popup micromanagement.
    • -
    -
  • -
  • Lasty updated: -
      -
    • The collectible hats have been removed from the theatre, doomed to rot forever in the hat crates they spawned from. No longer shall you see racks full of "collectible hard hat"!
    • -
    -
  • -
  • TLE updated: -
      -
    • You can now toggle the message for becoming a pAI on and off in your prefs.
    • -
    -
  • -
  • Mport updated: -
      -
    • Synaptizine now once again helps you recover from being stunned, however it is now also slightly toxic and may cause a small amount of toxins damage for every tick that it is in your system.
    • -
    • Assembly updating!
    • -
    • Original blob is back, though it still has lava sprites.
    • -
    • The bug where you would spawn on the wizard shuttle for a second at the start of the round should no longer occur.
    • -
    -
  • -
- -8 September 2011: -
    -
  • Lasty updated: -
      -
    • Suicide has been changed to biting your tongue off instead of holding your breath, and examining someone who has comitted suicide will give you a message stating that their tongue is missing.
    • -
    • Chemsprayers are now large items instead of small, meaning they can no longer fit in your pocket.
    • -
    -
  • -
- -6 September 2011 -
    -
  • 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
    • -
    • More info here: rev2136
    • -
    -
  • -
  • Lasty updated: -
      -
    • Fixed the karma exploit! Uhangi can rest in peace knowing his -87 karma ways were not his own.
    • -
    • Added new ambient sound for space and the mines.
    • -
    • Examining an oxygen tank will now tell you if it is about to run out of air. If it is, you will recieve a beep and a message, and if not, then you'll just get the default "this is an oxygentank!" message.
    • -
    -
  • -
  • Rageroro updated: -
      -
    • Sleeper update! Sleepers can now only inject soporific, dermaline, bicaridine, and dexaline into people with 1% or more health. They can also inject inaprovaline into people with -100% or more health. Nothing can be injected into people who are dead.
    • -
    -
  • -
  • Superxpdude updated: -
      -
    • Virology is now part of medbay, and as such the RD no longer has Virology access and the CMO and Virologist no longer have Research access.
    • -
    -
  • -
  • Uhangi updated: -
      -
    • Electropacks, screwdrivers, headsets, radio signalers, and station bounced radios can now be constructed from the autolathe.
    • -
    • Added a courtroom to Centcom.
    • -
    • Fixed electropack bug regarding using screwdrivers on electropacks.
    • -
    -
  • -
  • Microwave updated: -
      -
    • Nuka Cola re-added.
    • -
    -
  • -
  • Urist McDorf updated: - -
  • -
  • Cheridan updated: -
      -
    • New sprites for beds and air, plasma and nitrogen tanks (The ones found in maintenance shafts).
    • -
    -
  • -
-5 September 2011. -
    -
  • Rageroro updated: -
      -
    • Updates made to the HoP's ID computer. New interface and removing a card will now put it directly in your hand, if it's empty. Using your card on the computer will place it in the appropriate spot. If it has access to edit cards it will put it as the authentication card, otherwise as the card to be modified. If you have two cards with ID computer access first insert the authentication card, then the one you wish to midify, or do it manually like before.
    • -
    • Placed extra fire suits in maintenance (Near eva and mining) and an extra fire closet to atmos.
    • -
    -
  • -
- -4 September 2011. -
    -
  • Urist McDorf updated: -
      -
    • People who have been infected by facehuggers can no longer suicide.
    • -
    • Stammering has been reworked.
    • -
    • The chaplain can now no longer discern what ghosts are saying, instead receiving flavour text indicating that ghosts are speaking to him.
    • -
    • Walking Mushroom yield decreased from 4 to 1.
    • -
    • Glowshrooms now only spread on asteroid tiles.
    • -
    • Fixed rev round end message reporting everyone as dead.
    • -
    • Gave the changeling an unfat sting.
    • -
    -
  • Erro updated: -
      -
    • R'n'D and Gas Storage locations have been swapped in order for R&D to be given a hallway-facing table, just like Chemistry.
    • -
    • Buckling someone to a chair now causes them to face in the same direction as the chair.
    • -
    • Conveyor will now move only 10 items per game cycle. This is to prevent miners from overloading the belts with 2000 pieces of ore and slowing down time by turning it on. Does not apply to mobs on belt.
    • -
    -
  • Doohl updated: -
      -
    • New escape shuttle!
    • -
    • Metroids get hungry slower, but gain more nutrients from eating.
    • -
    -
  • Kor updated: -
      -
    • Added Necronomicon bible (credit Joseph Curwen)
    • -
    • Removed Doc Scratch clothing from chaplain? locker and added as a random spawn in the theatre.
    • -
    • Shaft Miners now start with regular oxygen tanks.
    • -
    • Mutate now gives the wizard hulk and OPTIC BLAST instead of hulk and TK.
    • -
    • Spiderman suit is no longer armoured or space worthy.
    • -
    • Crayons
    • -
    -
  • Superxpdude updated: -
      -
    • New, more appropriate arrivals message.
    • -
    • Shuttle escape doors fixed.
    • -
    • New RIG sprite.
    • -
    -
  • Lasty updated: -
      -
    • Switched xenomorph weeds to run in the background, hopefully causing them to destroy the server slightly less.
    • -
    -
  • Microwave updated: -
      -
    • Added sink to hydroponics
    • -
    • Cleaned up autolathe menu
    • -
    • Glasses and cups can now be filled with water from sinks.
    • -
    -
- -31 August 2011. -
    -
  • Lasty updated: -
      -
    • The costumes that spawn in the theatre are now randomized.
    • -
    • The kitchen now has a Smartfridge which can be directly loaded from the Botanist? plantbags. No more crates! (credit to Rolan7).
    • -
    • Snappops can now be acquired from the arcade machines. Amaze your friends! (credit to Petethegoat)
    • -
    • Bangindonk.ogg added to random end sounds list.
    • -
    -
  • Urist McDorf updated: -
      -
    • Players can no longer be randomly assigned to Librarian, Atmospherics Technician, Chaplain, and Lawyer unless all other non-assisstant job slots are full or they have those jobs in their preferences.
    • -
    • Changeling mode now has multiple changelings.
    • -
    -
  • Superpxdude updated: -
      -
    • The mail system actually works properly now! Probably!
    • -
    • Most hats had their ?eadspace?tag removed, meaning they will no longer substitute for a space helmet in protecting you from the dangers of space.
    • -
    -
- -28 August 2011. -
    -
  • Doohl updated: -
      -
    • Chaplains can now select different bible icons when they start. The selection is applied globally and the library's bible printer will print the same bibles.
    • -
    • Joy to the world! The Library's bible-printing function now has a one-minute cooldown. One minute may seem a little extreme, but it is necessary to prevent people from spamming the fuck out of everything with 100,000,000,000,000 carbon-copy bibles.
    • -
    • Tweaked Metroids a bit; they are slightly more aggressive and become hungrier faster. To compensate, they now move slightly slower.
    • -
    -
- -26 August 2011. -
    -
  • Mport updated: -
      -
    • Rev:
    • -
        -
      • Station Heads or Head Revs who leave z1 will count as dead so long as they are off of the z level.
      • -
      • Once a player has been unconverted they may not be reconverted.
      • -
      -
    • Cult:
    • -
        -
      • Heads other than the Captain and HoS are now able to start as or be converted to a cultist.
      • -
      • New Item: Loyalty Implant, which will prevent revving/culting. 4 spawn in the armory.
      • -
      • If a rev (not cultist) is injected with one he will unconvert, if a revhead is injected it will display a resist message.
      • -
      • Loyalty Implants show up on the SecHud
      • -
      • New Machine: Loyalty Implanter - Is on the prison station, shove a guy inside it to implant a loyalty implant. It can implant 5 times before it needs a 10 minute cooldown.
      • -
      -
    -
- -20 August 2011. -
    -
  • Doohl updated: -
      -
    • The smoke chemistry recipe has been upgraded! You can lace smoke with chemicals that can bathe people or enter their lungs through inhalation. Yes, this means you can make chloral hydrate smoke bombs. No, this doesn't mean you can make napalm smoke or foam smoke.
    • -
    -
- -16 August 2011. -
    -
  • Superxpdude updated: -
      -
    • Traitor item bundles: Contains a random selection of traitor gear
    • -
    -
- -
    -
  • Uhangi updated: -
      -
    • .38 Special Ammo can now be made from unhacked autolathes
    • -
    -
- -15 August 2011. -
    -
  • Superxpdude updated: -
      -
    • NEW MINING STATION, POST YOUR OPINIONS AND BUGS HERE
    • -
    • Added some new awesome mining-related sprites by Petethegoat. All credit for the sprites goes to him.
    • -
    -
- -9 August 2011. -
    -
  • Mport updated: -
      -
    • Cyborgs once again have open cover/cell icons.
    • -
    • To override a cyborg's laws you must emag it when the cover is open.
    • -
    • Emags can unlock a cyborgs cover.
    • -
    • Xbow radiation damage has been lowered from 100 to 20 a hit
    • -
    -
- -5 August 2011. -
    -
  • Mport updated: -
      -
    • The various assemblies should be working now.
    • -
    • Old style bombs and suicide vests temporarily removed.
    • -
    -
- -3 August 2011. -
    -
  • Superxpdude updated: -
      -
    • Virology Airlock changed to no longer cycle air. Should work faster and prevent virologists from suffocating.
    • -
    • Server Room APC is now connected to the power grid.
    • -
    • Stun Batons now start OFF. Make sure to turn them on before hitting people with them.
    • -
    -
- -2 August 2011. The day the earth stood still. -
    -
  • Agouri updated: -
      -
    • SSUs now correctly cycle and dump the unlucky occupant when designated to supercycle, when the criteria to do so are met.
    • -
    • Fixed bugshit
    • -
    • You can now make normal martinis again, removed a silly recipe conflict (Thanks, muskets.). Good barmen are urged to blend the good ol' recipes since the new ones have sprites that SUCK ASS JESUS CHRIST
    • -
    -
- -
    -
  • Doohl updated: -
      -
    • Speech bubbles: you can toggle them on in the character setup window. Basically, whenever someone around you talks, you see a speech bubble appear above them.
    • -
    • You can no longer create wizarditis and xenomicrobes with metroid cores.
    • -
    • Tweak: Using an exclamation mark as an AI, pAI, or cyborg will not longer get rid of the last exclamation mark.
    • -
    -
- -30 July 2011. -
    -
  • Superxpdude Updated: -
      -
    • Engineer and CE space helmets now have built-in lights.
    • -
    -
  • Rockdtben updated: -
      -
    • Bugfix: Fixed a bug where you could dupe diamonds
    • -
    -
  • Doohl updated: -
      -
    • New virus: Retrovirus. It basically screws over your DNA.
    • -
    • You can now do CTRL+MOVEMENT to face any direction you want. See those chairs in Medbay and the Escape Wing? You can do CTRL+EAST to actually RP that you're sitting on them. Is this cool or what?! -
    -
- -29 July 2011. - Day of Forum revival! -
    -
  • Doohl updated: -
      -
    • Bugfix: Metroids should never "shut down" and just die in a corner when they begin starving. And so, hungry Metroids are a force to be feared.
    • -
    • The Cargo computers now have the ability to cancel pending orders to refund credits. This was put in place so that idiots couldn't waste all the cargo points and run off. However, if the shuttle is en route to the station you won't be able to cancel orders.
    • -
    • Bugfix: the manifest has been fixed! Additionally, the manfiest is now updated realtime; job changes and new arrivals will be automatically updated into the manifest. Joy!
    • -
    • Metroids, when wrestled off of someone's head or beaten off, now get stunned for a few seconds.
    • -
    -
  • Agouri updated: -
      -
    • I was always bothered by how unprofessional it was of Nanotransen (in before >Nanotransen >professionalism) to just lay expensive spacesuits in racks and just let them be. Well, no more. Introducing...
    • -
    • Suit Storage Units. Rumored to actually be repurposed space radiators, these wondrous machines will store any kind of spacesuit in a clean and sterile environment.
    • -
    • The user can interact with the unit in various ways. You can start a UV cauterisation cycle to disinfect its contents, effectively sterilising and cleaning eveyrthing from the suits/helmets stored inside.
    • -
    • A sneaky yordle can also hide in it, if he so desires, or hack it, or lock it or do a plethora of shady stuff with it. Beware, though, there's plenty of dangerous things you can do with it, both to you and your target.
    • -
    • The Unit's control panel can be accessed by screwdriving it. That's all I'm willing to say, I'd like to let the players find out what each hack option does and doesn't. Will add more stuff later.
    • -
    • Added Command Space suit, Chief Engineer space suit and Chief Medical Officer spacesuit (In a new space that you'll probably notice by yourself) to make it easier for you to look like a special snowflake.
    • -
    • EVA and CMO office modified to accomodate the new suits and SSUs. Look, I'm not a competent mapper, okay? Fuck you too. A mapper is strongly recommended to rearrange my half assed shit.
    • -
    • Soda cans, cigarette packets, cigarettes and cigars as well as bullet casings are now considered trash and can be picked up by the trashbag. Now you can annoy the janitor even more!
    • -
    • Sprite credit goes to Alex Jones, his portfolio can be found here: http://bspbox.com. Thanks a lot, bro.
    • -
    • With the recent forum fuss and all that, I've got a thread to specifically contain rants and bug reports about this update. Click me
    • -
    -
  • Uhangi updated: -
      -
    • EVA redesigned
    • -
    • An electropack is now available once again on the prison station
    • -
    -
  • Errorage updated: -
      -
    • Hopefully fixed the derelict 'hotspots'. Derelict medbay has also been fixed.
    • -
    -
- -4 July - 28 July 2011. -
    - -
  • Trubble Bass updated (committed by Superxpdude): -
      -
    • Hat crates. Hat Station 13.
    • -
    -
  • Matty: -
      -
    • Engineers and miners now start off with the new industrial backpack.
    • -
    -
  • Agouri: -
      -
    • Sleepers are now OP and heal every kind of damage.
    • -
    • Made cloning 30% faster, due to popular demand.
    • -
    -
  • Superxpdude updated: -
      -
    • Added in the Submachine Gun to R&D.
    • -
    • Syndicate agents now have Mini-Uzis.
    • -
    • Added an exosuit recharged to the mining station.
    • -
    • New labcoats for scientists, virologists, chemists, and genetecists.
    • -
    • Moved the vault and added a bridge meeting room next to the HoP's office.
    • -
    • Deathsquad armor now functions like a space suit.
    • -
    • Added in security jackboots.
    • -
    -
  • Uhangi updated: -
      -
    • Traitors can now purchase syndicate balloons, which serve no purpose other than to blow your cover. For a limited time only, you can get them at a bargain price - just 10 telecrystals!
    • -
    • Removed security shotguns from the armory. No fun allowed.
    • -
    • Changed some bullet damage stuff.
    • -
    -
  • Microwave updated: -
      -
    • Monkey boxes:
    • -
    • Contains a score of monkey cubes, which you apply water to create monkies. Nanotrasen provides only the finest technology!
    • -
    • You can order monkey crates from the cargo bay. They contain monkey boxes.
    • -
    • Changed the amount of labels labelers have to 30. 10 was too low and 30 should not be too griefy.
    • -
    • Maximum label text length increased from 10 to 64.
    • -
    • You can no longer label people because they can just peel the labels off. Sorry, clowns!
    • -
    • Jelly dooonnuuuutsss! Happy birthday, officers!
    • -
    • Made xenomeat not give any nutrition.
    • -
    • Added some new reagents.
    • -
    • Made it possible to feed monkies and xenos things, as well as making it possible for them to eat themselves (please don't read that too literally).
    • -
    • Added in synthiflesh.
    • -
    • Plasma is now not used in reactions, instead, is treated as a catalyst that is not used up. This only applies to certain reactions.
    • -
    • Made it possible to grind more things in the chemistry grinder.
    • -
    -
  • Errorage updated: -
      -
    • Increased environmental damage by a factor of 1.5.
    • -
    • Made firesuits a lot more resistant to heat. Previously, they stopped protecting at around 4,500 degrees. They now go up to around 10,000 (which is also the temperature which the floor starts melting)
    • -
    • Edited the quartermaster's office a bit.
    • -
    • Cargo technicians now have access to a cargo ordering console.
    • -
    • Added different-colored hardhats. The CE gets a white hardhat.
    • - -
    -
  • Rastaf.Zero updated: -
      -
    • Botanists get a new toy: Biogenerator. Insert biological items, recieve biological items.
    • -
    • Added roller beds, otherwise known as stretchers, to medbay. You can buckle people onto them and pull them.
    • -
    • Added egg-smashing and tomato-smashing decals.
    • -
    -
  • Muskets updated: -
      -
    • The prepackaged songs (Space Asshole, Cuban Pete, Darkest Honk, etc) have been removed. This doesn't mean admins can't play midis, this just gets rid of a lot of unnecessary download time.
    • -
    -
  • Firecage updated: -
      -
    • A whole bunch of new drinks and food. Seriously, there's alot!
    • -
    • New weapons such as the shock revolver and large energy crossbow.
    • -
    • Hydroponics can now grow a bunch more stuff. A lot of these new crops have some very interesting mutations.
    • -
    • Added a command for AIs to change their icon.
    • -
    • New costumes to the costume room.
    • -
    -
  • Urist McDorf updated: -
      -
    • Adding shading to pills.
    • -
    • Detective's office noir look has been removed. The icon operations required to render everything in monochrome was too heavy on the players.
    • -
    • Added in an uplink implant.
    • -
    -
  • Doohl updated: -
      -
    • A new alien race: Metroids! They are a mostly non-sentient race of jellyfish-like organisms that float in the air and feed on the life energy of other organisms. While most Metroids have never shown signs of self-awareness, they do exhibit signs of basic logic and reasoning skills as well as very sophisticated perception. Nanotrasen has shipped two baby Metroids for the xenobiology department. They should be handled with the utmost care - they are some of the deadliest beings in the known universe!
    • -
    • R&D gets a new toy: the freeze gun. Despite popular belief, this will not literally freeze things!
    • -
    • Every single chemical reagent has been assigned a color.
    • -
    • You can now see beakers fill up with chemicals. You can also observe how the colors mix inside the beakers. Spray bottles also will also show the color of whatever you're spraying.
    • -
    • Added a timestamp to combat logs.
    • -
    • Non-insulated gloves now need to be wrapped in wire in order to be electrified.
    • -
    • You can now shoot at people on the ground by simply clicking on the tile they're on.
    • -
    • Changeling husks are now uncloneable. To clarify: when a changeling sucks out a victim's DNA, the victim is said to become a "husk".
    • -
    -
- -4 July 2011. -
    -
  • Agouri updated: -
      - Medical stuff overhaul in preparation of Erro's big Medic update: -
    • Sleepers are now able to heal every kind of damage. Drag your ass to medbay and ask a doctor to get you in one.
    • -
    • A lil' bit faster cloning (about 30% faster) due to popular demand.
    • -
    • Sleepers are now all located in the inner part of medbay, except for the examination room one.
    • -
    • Added Dermaline, burn-healing drug that outpowers kelotane (and kelotane is getting a major nerf, so be sure to know how to get this). Recipe is on the wiki if you need to make it.
    • -
    • Drugs no longer heal or metabolise when injected in dead bodies, fuck. Thank god you guys missed this major bug or we'd have cloning-by-injecting-healing-drugs.
    • -
    • Reminder to coders: Goddamn, update the changelog. -
    -
  • - -
  • Matty updated: -
      -
    • New engineering backpacks. Enjoy!
    • -
    -
  • -
- -18 June 2011. -
    -
  • Agouri updated: -
      -
    • Bugfixes: The reagent grinding now works, allowing the miners to FINALLY bring plasma to the chemistry.
    • -
    • Bugfixes: Pill bottles and clipboards can now be removed from the pockets once placed there.
    • -
    -
  • -
-
-7 June 2011. -
    -
  • TLE updated: -
      -
    • Wiped/suicided pAIs should be eligible for being candidates again (5 minute cooldown between prompts.)
    • -
    • pAIs are now affected by EMP bursts. pAIs hit with a burst will be silenced (no speech or PDA messaging) for two minutes and may have their directives or master modified. A sufficiently powerful EMP burst will have a 20% chance of killing a pAI.
    • -
    -
  • -
  • Neo updated: -
      -
    • Nar-sie is now a more vengeful eldritch being. When summoned into our world, he first rewards his loyal cultists by chasing down and eating them first, then turns his attention to any remaining humans.
    • -
    -
  • -
  • Darem updated: -
      -
    • Gun Code Overhaul Phase 1.
    • -
    • Taser guns shoot ONE WHOLE SHOT more then they do now.
    • -
    • Energy Crossbow has a slightly higher shot capacity (still automatically recharges).
    • -
    • Revolvers can either be loaded one shell at a time or all at once with an ammo box.
    • -
    • Shotguns no longer need to be pumped before firing (will change back in phase 2).
    • -
    -
  • -
  • K0000 updated: -
      -
    • Arcane tome now has a "notes" option. Set English translations for runewords which come up when scribing runes. Attack an arcane tome with another arcane tome to copy your notes to the target tome.
    • -
    • Stun rune buffed considerably. Its a 1-use item so it deserved longer stun time.
    • -
    • Tome text: Added missing word description for stun rune.
    • -
    -
  • -
-
- -1 June 2011, Canadian Day Against Homophobia -
    -
  • Noise updated: -
      -
    • Changed holopad speaking to :h on request.
    • -
    • Ninja fixes, changes, etc. Refer to the code changelog for more info.
    • -
    -
  • -
  • Neo updated: -
      -
    • Department radio chat now shows with the department name instead of the frequency.
    • -
    -
  • -
  • Veyveyr updated: -
      -
    • Spent casing sprites + SMG sprite.
    • -
    • Sprites for 1x4 and 1x2 pod doors.
    • -
    -
  • -
  • Errorage updated: -
      -
    • Fixed twohanded weapon throwing, which left the 'off-hand' object in your other hand.
    • -
    • Doors now hide items under them when closed, mobs are still always above.
    • -
    • Singularity engine emitter is now much quieter.
    • -
    • Mining station redesigned.
    • -
    • Atmospherics' misc gasses tank now starts with N2O.
    • -
    • Hitting the resist button while handcuffed and buckled to something will make you attempt to free yourself. The process is the same as trying to remove handcuffs. When the 2 minutes pass you will be unbuckled but still handcuffed.
    • -
    -
  • -
  • ConstantA updated: -
      -
    • Added exosuit energy relay equipment. Uses area power (any power channel -available) instead of powercell for movement and actions, recharges powercell.
    • -
    • Exosuits can be renamed. Command is in Permissions & Logging menu.
    • -
    • Lowered construction time for Ripley parts.
    • -
    • Exosuit wreckage can be salvaged for exosuit parts (torso, limbs etc).
    • -
    • Speed-up for mecha.
    • -
    • New malf-AI sprite. (Sprite donated by the D2K5 server)
    • -
    -
  • -
  • Cheridan updated: -
      -
    • Updated mine floor and wall edge sprites.
    • -
    -
  • -
  • Urist McDorf updated: -
      -
    • AIs no longer bleed when they reach 0HP (Critical health).
    • -
    • Added 2 more security HUDs to security.
    • -
    • Security HUDs now show if a person has a tracking implant.
    • -
    -
  • -
  • Microwave updated: -
      -
    • Barman renamed to Bartender.
    • -
    • The amount of drink you get when mixing things in the bar has been rebalanced.
    • -
    • Fixed arrivals maintenance shaft not having air at round start.
    • -
    -
  • -
  • Deuryn updated: -
      -
    • Meteors now do a bit more damage and they're not stopped by grills.
    • -
    -
  • -
  • TLE updated: -
      -
    • Added personal AIs (pAI).
    • -
    -
  • -
-
- -19 May 2011 -
    -
  • Errorage updated: -
      -
    • Asteroid floors can be built on by adding tiles
    • -
    • Mining satchels now fit in rig suit storage, on belts and in pockets.
    • -
    • Cables now come in four colors: Red, yellow, green and blue.
    • -
    -
  • - -
  • NEO updated: -
      -
    • Armour overhaul, phase 3. See rev notes for details.
    • -
    • AI cores should now block movement.
    • -
    • MMIs are now properly buildable with the mecha fabricator.
    • -
    -
  • - -
  • Urist updated: -
      -
    • Added sandstone and mineral doors. Mineral boors cannot be opened by the AI or NPCs.
    • -
    • Removed Imperium robes from map.
    • -
    • Added the ability to draw letters and graffiti with crayons.
    • -
    • Removed fire axes except for bridge and atmospherics.
    • -
    -
  • - -
  • Veyveyr updated: -
      -
    • New serviceborg sprite option.
    • -
    • Map changes to robotics; removed borg fabricators and added second exosuit fabricator.
    • -
    • Cyborg parts are now built from exosuit fabricators and benefit from research.
    • -
    • New exosuit fabricator and borg frame sprites.
    • -
    -
  • -
-
-14 May 2011, late friday 13 update. -
    -
  • K0000 updated: -
      -
    • Cult updates:
    • -
    • New rune! Stun rune. When used as rune, briefly stuns everyone around (including cultists). When imbued into a talisman, hit someone to stun and briefly mute them. Spawnable with the starter talisman.
    • -
    • Imbue rune doesnt disappear after succesful invocation, only the source rune.
    • -
    • Chaplain's bible now has 20% chance to convert a cultist (was 10%), and gives a message on success.
    • -
    • Also, wrapping paper is back! Find it in the mailroom.
    • -
    -
  • - -
  • NEO updated: -
      -
    • Beginning of armor overhaul. Armor now has slightly better defence against melee, and weaker against shots. More coming soon...someday
    • -
    • Cyborgs finally drop their MMI when gibbed like they were supposed to back when I added MMIs. Round- start cyborgs use whatever name you have selected for your character for the brain that gets spawned for them.
    • -
    -
  • - -
  • Darem updated: -
      -
    • Chemistry update
    • -
    • In containers where there isn't a perfect ratio of reagents, reactions won't consume ALL of the related reagents (so if you mix 10 anti-toxin with 20 inaprovaline, you get 10 tricordrazine and 10 inaprovaline rather then just 10 tricodrazine)
    • -
    • Catalysts: some reactions might need presence of an element, while not directly consuming it.
    • -
    • Reactions changed to use catalysts: all recipes that require Universal Enzyme now require 5 units of the enzyme but the enzyme isn't consumed (So Tofu, Cheese, Moonshine, Wine, Vodka, and Kahlua recipes). -
    -
  • -
  • Errorage updated: -
      -
    • Smooth tables: Tables now automatically determine which direction and sprite they'll use. They will connect to any adjacent table unless there is a window between them (regular, reinforced, tinted, whichever)
    • -
    -
  • -
-
-7 May 2011, Mother's day? -
    -
  • Agouri updated: -
      -
    • Fireaxes now work. Derp.
    • -
    -
  • - -
  • Erro updated: -
      -
    • New sprites for thermited walls and girders. Rework of thermited walls. Thermited walls leave a remnant damaged wall, crowbar it to scrap it.
    • -
    • More colors for the lightfloors CANCELLED/POSTPONED
    • -
    -
  • - -
  • Noise updated: -
      -
    • Codephrases for traitors. More details here
    • -
    • New mech sprite
    • -
    -
  • -
-
-6 May 2011, AMURRICA FUCK YEAH day -
    -
  • DANGERCON UPDATE:Agouri and Erro updated(I'm in the DangerCon team now, nyoro~n :3): -
      -
    • Backpacks removed from all players. It was unrealistic. You can now had to the living quarters to get one from the personal closets there.
    • -
    • Any firearms now send you to critical in 1-2 shots. Doctors need to get the wounded man to surgery to provide good treatment. Guide for bullet removal is up on the wiki.
    • -
    • Brute packs and kelotane removed altogether to encourage use of surgery for heavy injury.
    • -
    • Just kidding
    • -
    • Fireaxe cabinets and Extinguisher wall-mounted closets now added around the station, thank Nanotransen for that.
    • -
    • Because of Nanotransen being Nanotransen, the fire cabinets are electrically operated. AIs can lock them and you can hack them if you want the precious axe inside and it's locked. The axe itself uses an experimental two-handed system, so while it's FUCKING ROBUST you need to wield it to fully unlock its capabilities. Pick up axe and click it in your hand to wield it, click it again or drop to unwield and carry it.You can also use it as a crowbar for cranking doors and firedoors open when wielded, utilising the lever on the back of the blade. And I didn't lie to you. It's fucking robust.
    • -
    • Fireaxe, when wielded, fully takes up your other hand as well. You can't switch hands and the fireaxe itself is unwieldy and won't fit anywhere. -
    • A fireaxe cabinet can also be smashed if you've got a strong enough object in your hand.
    • -
    • EXTINGUISHER CLOSETS, made by dear Erro, can be found in abundance around the station. Click once to open them, again to retrieve the extinguisher, attack with extinguisher to place it back. Limited uses, but we've got plans for our little friend. -
    • Sprite kudos go to: Cheridan for most of them, Khodoque for the fantastic fireaxe head. I merged those two. Also thanks to matty and Arcalane for giving it a shot.
    • -
    • Has the piano got TOO annoying? Try the fire axe...
    • -
    • Oh, and tou can now construct Light floors! To do it: Use wires on glass, then metal on the produced assembly, then place it on an uncovered floor like you would when replacing broken floor tiles. To deconstruct: Crowbar on light floor, use crowbar on produced assembly to remove metal, wirecutters to seperate the wires from the glass. Sprites by delicious Hempuli.
    • -
    • Got something to bitch about? Got a bug to report? Want to create drama? Did the clown destroy your piano while you were playing an amazing space remix of the moonlight sonata? Give it here - -
    -
  • - -
  • Rastaf.Zero updated: -
      -
    • New uniforms added for captain and chaplain, in their respective lockers. Credits to Farart.
    • -
    -
  • - -
  • Urist McDorf updated: -
      -
    • Mime and Clown now spawn with Crayons. You can eat those crayons. And use them for other nefarious purposes.
    • -
    • Health Scanners (A new type of Goggles) now spawn in medbay. Use them, doctors!
    • -
    • New Arcade toy.
    • -
    • Glowshrooms! What other lifeform will threaten the welfare of the station now?!
    • -
    • Bananas growable in hydroponics. Also soap is now on-board.
    • -
    • Added new "Lights out!" random event.
    • -
    -
  • -
  • ConstantA updated: -
      -
    • Mech pilots are now immune to zapping, thank you very much.
    • -
    -
  • -
-
- -17 April 2011, World Hemophilia Day -
    -
  • Microwave updated: -
      -
    • Rabbit ears have a small tail, night vision goggle sprites updated.
    • -
    • Space tea has a nice, calming effect.
    • -
    • Space drugs? Liberty cap... something like that. Microwave, make your changelog entries more understandable!
    • -
    • Brobot merged with Service Borg with a Rapid Service Fabricator.
    • -
    • Arcade machine prizes look and sound realistic once again.
    • -
    • New arcade toy: Syndicate space suit costume, can hold arcade toys in suit storage.
    • -
    • Empty cap gun loaders can be recycled in an autolathe.
    • -
    • Seizure man has laying down sprites now. Update to wizard den.
    • -
    • Mech bay has two more borg chargers.
    • -
    • Beepsky is back!
    • -
    • Detective's office grille has been electrified.
    • -
    • You can now see if someone is wearing an emergency oxygen tank on their belt on the mob itself.
    • -
    • Lexorin - Now deals 3 oxygen damage per tick. Countered with Dexalin or Dexalin Pkus, which remove 2 units of it from your body per tick.
    • -
    • Bilk - Shares the effects of beer and milk. Disgusting!
    • -
    • Sugar - Gives nutrition!
    • -
    • Arithrazine - Now extremely good against radiation damage.
    • -
    • Hyronalin - Stronger radiation removal
    • -
    • Space cleaner spray bottles now contain enough cleaner for 50 uses. Making space cleaner now yields more cleaner.
    • -
    -
  • -
  • Errorage updated: -
      -
    • Shuttle diagonal sprites now work for any kind of floor.
    • -
    • You can now make plaques from gold. Place them on a wall and engrave an epitaph.
    • -
    • Placed a single wall tile in the AI satellite so you don't have a clear LOS of the AI from the door.
    • -
    • Added arrivals lobby. (Map by Superxpdude, updated by Microwave)
    • -
    • Lattice now connects to the solar shields.
    • -
    • Law office maintenance is now connected with Tech storage maintenance. (Some rewiring dont in the area)
    • -
    • Xenobiology now has it's own access level. (Also fixed xeno pen access and blast doors)
    • -
    • You might soon start to see different airlocks and airlock assemblies around the station. (Sprites donated by Baystation 12)
    • -
    • Chemical storage added, discussion on which chemicals it should store is on the forums. You're welcome to contribute.
    • -
    • Hot fires will now melt floors.
    • -
    • Added a pair of market stalls south of the teleporter. LET THERE BE CLOWNMART!
    • -
    • Screwdrivers and wirecutters can now spawn in different colors.
    • -
    • Electrical toolboxes have a 5% chance of spawning a pair of insulated gloves. A set spawns in tech storage.
    • -
    • Oxygen canisters now spawn in emergency storage, near disposal, in the incinerator and the CE's office.
    • -
    • A plasma canister now spawns in toxins, near the maintenance door.
    • -
    • Wooden tables now look nicer.
    • -
    -
  • -
  • Agouri updated: -
      -
    • 2001 space suits added to AI Satellite!
    • -
    • New look for the 2001 space suit.
    • -
    • 2001 space suit jetpack added.
    • -
    • Improved TRAYS!
    • -
    -
  • -
  • Noise updated: -
      -
    • Thermals and mesons no longer give slightly better night vision.
    • -
    • NINJAS! (Too many things to list)
    • -
    • Wizards are no longer trackable by the AI when in their den.
    • -
    • Removed all old notes, except for the last one.
    • -
    • Nuke team now cannot return with their shuttle until the bomb is armed and counting down.
    • -
    • Energy blades can no longer cut through r-walls, walls take 7 seconds to cut through.
    • -
    • Turrets are now destructible. Bash them with stuff when they pop out or (more likely) die trying.
    • -
    • Updated Ripley Mech sprite.
    • -
    -
  • -
  • Neo updated: -
      -
    • You can now aim guns at body parts, armor and helmets properly protect you from projectiles.
    • -
    • Cat ears now match the hair color of the wearer.
    • -
    • Robots can no longer stick their items onto/into things.
    • -
    • Meson, thermal and x-ray vision are now modules for borgs.
    • -
    • Welding now uses less fuel when on and idle but more when welding.
    • -
    • Hopefully fixed the bug when running into airlocks didn't open them and running into objects didn't push them.
    • -
    -
  • -
  • HAL updated: -
      -
    • Added air alarm to security checkpoint, added cameras to aux. arrival docks so the AI can see everything.
    • -
    • Added fire alarm, fire locks and air alarm to delivery office.
    • -
    -
  • -
  • ConstantA updated: -
      -
    • Added mecha DNA-locking. Only the person with matching UE can operate such mechs.
    • -
    • Added two mecha armor booster modules and a repair droid module.
    • -
    • Mech fabricator is now buildable.
    • -
    • Gygax construction is now reversible.
    • -
    -
  • -
  • Rastaf0 and Farart updated: -
      -
    • Ghosts should now always properly hear people.
    • -
    • Monkeyized people (genetics or jungle fever disease) no longer lose their genetic mutations and diseases.
    • -
    • People who get bitten by monkeys get jungle fever.
    • -
    • Most chemicals should now heal and harm humans properly.
    • -
    • Many new (and updated) recipes for the microwave including Pizza, Meatball Soup, Hot Chili and many more.
    • -
    • Items should no longer spawn under vendomats and microwaves.
    • -
    • Runes are now drawn under doors and tables.
    • -
    • Penlights fit in medical belts.
    • -
    • People will scream if they get cremated while still alive.
    • -
    • Diseases should now properly make you loose health.
    • -
    • Monkeys wearing masks now get acid protection too.
    • -
    • You should probably turn off your stun baton before washing it.
    • -
    • latex loves + short piece of wire + some air from tank = balloon!
    • -
    • Kitchen was expanded, also a new look for the kitchen sink.
    • -
    • New dishware vending machine - dispenses knives, forks, trays and drinking glasses.
    • -
    • Water cooler was added to kitchen.
    • -
    • New uniform - Waiter Outfit. Chef can give it to his assistant.
    • -
    -
  • -
  • Deeaych updated: -
      -
    • Updated satchel, bananimum, shovel, jackhammer and pick-in-hand sprites.
    • -
    • Many unneeded r-walls removed, detective's office reinforced.
    • -
    • Captain armor now acts as a space suit, added a unique captain's space helmet to captain's quarters.
    • -
    • Golems cannot speak, but should be perfectly spawnable. Also added golem fat sprite.
    • -
    • Security borgs have side sprites.
    • -
    -
  • -
  • Matty406 updated: -
      -
    • AIs can now feel a little more dorfy.
    • -
    • Many ores, both raw and smelted, look much better.
    • -
    -
  • -
  • Urist_McDorf updated: -
      -
    • You can now light other people's cigarettes by targeting their mouth with a lighter.
    • -
    -
  • -
  • Veyveyr updated: -
      -
    • New tool sprites.
    • -
    • New sprites for smooth-lattice.
    • -
    -
  • -
  • Muskets updated: -
      -
    • Kabobs now return the bar used to make them.
    • -
    -
  • -
-
- -2 April 2011, International Children's Book Day -
    -
  • Microwave updated: -
      -
    • New look for the mining cyborg, jackhammer, kitchen sink.
    • -
    • Singularity is now enclosed again (still airless tho).
    • -
    • Wizard has a new starting area.
    • -
    • Chemists and CMOs now have their own jumpsuits.
    • -
    -
  • -
  • ConstantA updated: -
      -
    • You can now put Mind-machine-interface (MMI)'d brains into mecha.
    • -
    -
  • -
  • Errorage updated: -
      -
    • Added smooth lattice.
    • -
    -
  • -
-
- -26 March 2011 -
    -
  • Rastaf0 updated: -
      -
    • Food sprites from Farart
    • -
    • New food: popcorn (corn in microwave), tofuburger (tofu+flour in microwave), carpburger (carp meat+floor in microwave)
    • -
    • Medical belts are finally in medbay (credits belong to errorage, I only added it)
    • -
    • Pill bottles now can fit in containers (boxes, medbelts, etc) and in pockets.
    • -
    • Cutting camera now leaves fingerprints.
    • -
    -
  • -
  • Microwave updated: -
      -
    • Armor Can hold revolvers, and so can the detective's coat.
    • -
    • Chef's apron is going live, it can carry a knife, and has a slight heat -resistance (only slight don't run into a fire).
    • -
    • Kitty Ears!
    • -
    • Various food nutriment changes.
    • -
    • Added RIGs to the Mine EVA.
    • -
    • Night vision goggles. They have a range of five tiles.
    • -
    • Added Foods: Very Berry Pie, Tofu Pie, Tofu Kebab.
    • -
    • Modified foods: Custard Pie is now banana cream pie.
    • -
    -
  • -
  • ConstantA updated: -
      -
    • Removed redundand steps from Gygax and HONK construction.
    • -
    • Added some mecha equipment designs to R&D.
    • -
    -
  • -
-
- -23 March 2011, World Meteorological Day -
    -
  • Neo updated: -
      -
    • Fixed PacMan (and affiliates) generator construction.
    • -
    • It is now possible to actually eat omelettes with the fork now, instead of just stabbing yourself (or others) in the eye with it.
    • -
    • Welding masks can now be flipped up or down. Note that when they're up they don't hide your identity or protect you from welding.
    • -
    • Reagent based healing should now work properly.
    • -
    • Revolver has been balanced and made cheaper.
    • -
    • Tasers now effect borgs.
    • -
    • Plastic explosives are now bought in single bricks.
    • -
    • Nuke team slightly buffed and their uplink updated with recently added items.
    • -
    • Player verbs have been reorganized into tabs.
    • -
    • Energy swords now come in blue, green, purple and red.
    • -
    • Cameras are now constructable and dismantlable. (Code donated by Powerful Station 13)
    • -
    • Updated the change network verb for AIs. (Code donated by Powerful Station 13)
    • -
    • Added gold, silver and diamond pickaxes to R&D which mine faster.
    • -
    -
  • -
  • Agouri updated: -
      -
    • New look for the Request consoles.
    • -
    -
  • -
  • Rastaf0 updated: -
      -
    • Brig cell timers should now tick closer-to-real seconds.
    • -
    • New look for food, including meat pie, carrot cake, loaded baked potato, omelette, pie, xenopie and others. (some sprites by Farart)
    • -
    • Hearing in lockers now works as intended.
    • -
    • Fixed electronic blink sprite.
    • -
    • Added the 'ghost ears' verb, which allows ghosts to not hear anything but deadcast.
    • -
    -
  • -
  • XSI updated: -
      -
    • New AI core design.
    • -
    • HoP now has a coffee machine!
    • -
    -
  • -
  • Veyveyr updated: -
      -
    • Replaced nuke storage with a vault.
    • -
    • Redesigned the mint, moved the public autolathe and n2o storage.
    • -
    • New look for the coin press. (Sprite by Cheridan)
    • -
    -
  • -
  • Errorage updated: -
      -
    • You can now manually add coins into money bags, also fixed money bag interaction window formatting.
    • -
    • QM no longer has access to the entire mining station to stop him from stealing supplies.
    • -
    • New machine loading sprite for mining machinery. (sprites by Cheridan)
    • -
    • Added a messanging server to the server room. It'll be used for messanging, but ignore it for now.
    • -
    • The delivery office now requires delivery office access. It's also no longer called "Construction Zone"
    • -
    • Almost all the mecha parts now have sprites. (Sprites by Cheridan)
    • -
    • Tinted and frosted glass now look darker.
    • -
    • There are now more money sprites.
    • -
    • Department closets now contain the correct headsets.
    • -
    -
  • -
  • Microwave updated: -
      -
    • Bicaridine now heals a lot better than before.
    • -
    • Added Diethylamine, Dry Ramen, Hot Ramen, Hell Ramen, Ice, Iced Coffee, Iced Tea, Hot Chocolate. Each with it's own effects.
    • -
    • Re-added pest spray to hydroponics.
    • -
    • Carrots now contain a little imidazoline.
    • -
    • 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 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.
    • -
    • Mime's mask can now be used as a gas mask.
    • -
    • Added welding helmet 'off' sprites.
    • -
    -
  • -
- -
- -18 March 2011 -
    -
  • Errorage updated: -
      -
    • You can now use the me command for emotes! It works the same as say "*custom" set to visible.
    • -
    • There is now a wave emote.
    • -
    • Enjoy your tea!
    • -
    -
  • -
  • Deeaych updated: -
      -
    • The exam room has some extra prominence and features.
    • -
    • A new costume for the clown or mime to enjoy.
    • -
    • Service Cyborgs can be picked! Shaker, dropper, tray, pen, paper, and DOSH to show their class off. When emagged, the friendly butler-borg is able to serve up a deadly last meal.
    • -
    • It should now be possible to spawn as a cyborg at round start. Spawned cyborgs have a lower battery life than created cyborgs and begin the round in the AI Foyer.
    • -
    -
  • -
  • Rastaf0 updated: -
      -
    • Fixed an issue with examining several objects in your hands (such as beakers).
    • -
    • Fixed bug with random last name being empty in rare cases.
    • -
    -
  • -
  • hunterluthi updated: -
      -
    • It is now possible to make 3x3 sets of tables.
    • -
    • Fixed some missplaced grilles/lattices on the port solar.
    • -
    • There is now a breakroom for the station and atmos engineers. It has everything an intelligent young engineer needs. Namely, Cheesy Honkers and arcade games.
    • -
    -
  • -
-
-15 March 2011, International Day Against Police Brutality -
    -
  • Errorage updated: -
      -
    • Autolathe deconstruction fixed.
    • -
    • Atmos Entrance fixed.
    • -
    • AI no longer gibs themselves if they click on the singularity.
    • -
    • Fixed all the issues I knew of about storage items.
    • -
    • Redesigned Assembly line and surrounding maintenance shafts.
    • -
    • Redesigned Tech storage. (Map by Veyveyr)
    • -
    -
  • -
  • TLE updated: -
      -
    • Forum account activation added. Use the 'Activate Forum Account' verb.
    • -
    -
  • -
  • Neo updated: -
      -
    • New R&D Item: The 'Bag of holding'. (Sprite by Cheridan)
    • -
    • Getting someone out of the cloner now leaves damage, which can only be fixed in the cryo tube.
    • -
    • New reagent: Clonexadone, for use with the cryo tube.
    • -
    • Fixed using syringes on plants.
    • -
    -
  • -
  • Constanta updated: -
      -
    • Added queueing to fabricator.
    • -
    -
  • -
  • Rastaf0 updated: -
      -
    • Air alarms upgraded.
    • -
    • Fixed problem with AI clicking on mulebot.
    • -
    • Airlock controller (as in EVA) now react to commands faster.
    • -
    • Fixed toxins mixing airlocks.
    • -
    -
  • -
- -6 March 2011 -
    -
  • Neo updated: -
      -
    • Neo deserves a medal for all the bugfixing he's done! --errorage
    • -
    -
  • -
  • Errorage updated: -
      -
    • No. I did not code on my birthday!
    • -
    • Windows can now be rotated clockwise and counter clockwise.
    • -
    • Window creating process slightly changed to make it easier.
    • -
    • Fixed the newly made reinforced windows bug where they weren't properly unfastened and unscrewed.
    • -
    • Examination room has a few windows now.
    • -
    • Can you tell I reinstalled Windows?
    • -
    • Robotics has health analyzers.
    • -
    • Bugfixing.
    • -
    -
  • -
  • Deeyach updated: -
      -
    • Roboticists now spawn with a lab coat and an engineering pda
    • -
    -
  • -
- -2 March 2011, Wednesday -
    -
  • Errorage updated: -
      -
    • Mapping updates including Atmospherics department map fixes, CE's office and some lights being added here and there.
    • -
    • Mining once again given to the quartermaster and HoP. The CE has no business with mining.
    • -
    • Removed the overstuffed Atmos/Engineering supply room.
    • -
    • Replaced all 'engineering' doors in mining with maintenance doors as they were causing confusion as to which department mining belongs to.
    • -
    • The incinerator is now maintenance access only.
    • -
    -
  • -
  • Neo updated: -
      -
    • New look for the advanced energy gun. (Sprite by Cheridan)
    • -
    • Mech fabricator accepts non-standard materials.
    • -
    • Mules accesses fixed, so they can be unlocked once again.
    • -
    • Atmospherics department mapping overhaul. (Map by Hawk_v3)
    • -
    • Added more name options to arcade machines.
    • -
    -
  • -
  • ConstantA updated: -
      -
    • Added mecha control console and mecha tracking beacons.
    • -
    • Some changes to gygax construction.
    • -
    -
  • -
  • Darem updated: -
      -
    • R&D minor bugfixes.
    • -
    • AI computer can now be deconstructed (right click and select 'accessinternals').
    • -
    • Server room updated, added server equipment to use with R&D.
    • -
    • Wizard and ghost teleport lists are now in alphabetical order, ghosts can now teleport to the mining station.
    • -
    • Rightclicking and examining a constructable frame now tells you what parts still need to be finished.
    • -
    • Large grenades added to R&D.
    • -
    -
  • -
  • Deeyach updated: -
      -
    • Mining given to the CE. (Reverted by Errorage)
    • -
    • Clowns can now pick a new name upon entering the game (like wizards previously).
    • -
    -
  • -
- -24 February 2011, Thursday -
    -
  • Darem updated: -
      -
    • Lighting code fixed for mining and thermite.
    • -
    • R&D instruction manual added to the R&D lab.
    • -
    • Fixed R&D disk commands not working.
    • -
    • Added portable power generators which run on solid plasma.
    • -
    • You can now set the numer of coins to produce in the mint.
    • -
    • Added two more portable power generators to R&D.
    • -
    -
  • -
  • Deeyach updated: -
      -
    • New uniform for roboticists
    • -
    -
  • -
  • Neo updated: -
      -
    • Game speed increased
    • -
    • Mining stacking machine no longer devours stacks larger than 1 sheet (it was only increasing its stock by 1 when given a stacked stack)
    • -
    • Stackable uranium ore added (a better sprite is needed, contributions are welcome)
    • -
    • Made Meteor gamemode actually do stuff
    • -
    • Made a bigger class of meteor
    • -
    • New R&D item: Advanced Energy Gun
    • -
    • Law priority clarified with regards to ion laws and law 0.
    • -
    -
  • - -
  • Veyveyr updated: -
      -
    • Minor mapping fixes
    • -
    -
  • -
  • Uhangi updated: -
      -
    • New red bomb suit for security.
    • -
    -
  • - -
  • Errorage updated: -
      -
    • Slight mapping change to arrival hallway.
    • -
    -
  • -
- -23 February 2011, Red Army Day -
    -
  • Uhangi updated: -
      -
    • Antitox and Inaprovaline now mixable via chemistry.
    • -
    • Explosive Ordinance Disosal (EOD) suits added to armory and security.
    • -
    • Large beaker now holds 100 units of chemicals. (code by Slith)
    • -
    -
  • -
  • Rastaf0 updated: -
      -
    • Secbot interface updated.
    • -
    • Syringe auto-toggels mode when full.
    • -
    • Captain's flask volume increased.
    • -
    -
  • -
  • Neo updated: -
      -
    • Fixed the 'be syndicate' choice to actually work on nuke rounds.
    • -
    • Syndicates no longer win if they detonate the nuke on their ship.
    • -
    -
  • - -
  • Errorage updated: -
      -
    • Added cloning manual. (Written by Perapsam)
    • -
    -
  • -
  • K0000 updated: -
      -
    • Cult mode updates.
    • -
    • You can now read the arcane tome. It contains a simple guide for making runes.
    • -
    • Converting people doesnt give them word knowledge.
    • -
    • Sacrifice monkeys or humans to gain new words.
    • -
    • Total number of rune words set to 10
    • -
    • Some minor bugfixes.
    • -
    -
  • -
- -20 February 2011, Sunday -
    -
  • Errorage updated: -
      -
    • Slight updates to processing unit and stacking machine at the mining outpost.
    • -
    • Digging now yields sand, which can be smelted into glass.
    • -
    • Stacking machine can now stack reinforced metal, regular and reinforced glass too.
    • -
    • Engineers now have two copies of the singularity safety manual.
    • -
    -
  • -
  • Neo updated: -
      -
    • Magboots now have a verb toggle like jumpsuit sensors.
    • -
    • Jumpsuit sensors are now in all jumpsuits, except tactical turtlenecks.
    • -
    • Tweaks to the AI report at round start.
    • -
    • Syndi-cakes now heal traitors/rev heads/etc much more than anyone else.
    • -
    • Containment fields zap once again.
    • -
    • Fire damage meter no longer lies about fire damage.
    • -
    -
  • -
  • Darem updated: -
      -
    • Mass Spectrometer added to R&D. Load it with a syringe of blood and it will tell you the chemicals in it. Low reliability devices may yield false information.
    • -
    • Not all devices have a 100% reliability now.
    • -
    • Miners now have access to mint foyer and loading area. Only captain has access to the vault.
    • -
    • More stuff can be analyzed in the destructive analyzer, protolathe can produce intelicards.
    • -
    -
  • -
  • Rastaf0 updated: -
      -
    • Added blast door button to atmospherics.
    • -
    • Toxins timer-igniter assemblies fixed.
    • -
    • Engineering secure storage expanded.
    • -
    • Added singularity telescreen.
    • -
    -
  • -
- -18 February 2011, Friday -
    -
  • Errorage updated: -
      -
    • New look for the bio suits. (Biosuit and hood sprites by Cheridan)
    • -
    • New radiation suits added along with radiation hoods and masks. Must wear complete set to get full protection.
    • -
    -
  • -
  • Rastaf0 updated: -
      -
    • Binary translator cost reduced to 1 telecrystal.
    -
  • -
  • AtomicTroop updated: -
      -
    • Mail Sorter job added.
    • -
    • Disposal system redone to allow for package transfers. Packages are routed to mail sorter room and then routed to the rest of the station
    • -
    • Disposal area moved. Old disposal area now just an incinerator and a small disposal into space.
    • -
    • New wrapping paper for sending packages.
    • -
    -
  • -
  • Veyveyr updates: -
      -
    • New machine frame sprite.
    • -
    • Braincase sprites for mechs added. Not actually used, yet.
    • -
    -
  • -
  • Darem updates: -
      -
    • Research and Development system is LIVE. Scientists can now research new advancements in technology. Not much can be made, right now, but the system is there. Technologies are researched by shoving items into the destructive analyzer. Circuit Imprinter, Destructive Analyzer, and Protolathe are controlled from the R&D console.
    • -
    • Autolathe, Protolathe, Destructive Analyzer, and Circuit Imprinter can now be built, taken apart, and upgraded. The basic frame for all of the above requires 5 metal.
    • -
    -
  • -
- -15 February 2011, Tuesday -
    -
  • Rastaf0 updated: -
      -
    • Added radio channels and headsets for miners (:h or :d ("diggers" lol)) and for cargo techs (:h or :q )
    • -
    • Added a personal headsets to HoP and QM.
    • -
    • Aliens now attack bots instead of opening control window.
    • -
    • All bots can be damaged and repaired.
    • -
    • All bots are effected to EMP now.
    • -
    • Atmos now starts with nitrous oxide in storage tank.
    • -
    -
  • -
  • Veyveyr updated: -
      -
    • New look for the pipe dispenser.
    • -
    -
  • Errorage updated: -
      -
    • Mining station will now charge properly.
    • -
    • Duffle bags (Money bags) can now be emptied.
    • -
    -
  • -
- -14 February 2011, Valentine's day -
    -
  • Errorage updated: -
      -
    • New Job! - Shaft Miners have finally been added and are available to play.
    • -
    • Mining outpost - A new mining outpost has been built, the mining dock on SS13 has been updated.
    • -
    -
  • -
  • ConstantA updated: -
      -
    • Slight speed up for combat mechs..
    • -
    • Added H.O.N.K construction
    • -
    • Fixed bug with switching intent while in mecha.
    • -
    -
  • -
- -
12.02.2011, 01.00 GMT, r1021
-
    -
  • Added Durand combat exosuit.
  • -
  • Players can modify operation permissions of newly constructed civilian mechs. Click on mech with ID card or PDA with ID inside.
  • -
  • Added robotics access to default mecha maintenance permissions (all mechs) and operation permissions (civilian models only).
  • -
  • Fixed double adminlog message of explosion proc.
  • -
  • Fixed accidental mecha wreckage deletion.
  • -
  • Tweaked mecha internal fire processing.
  • -
  • Added some mecha-related sounds.
  • -
  • Moved GaussRand to helpers.dm and added GaussRandRound helper proc.
  • -
  • Other small changes.
  • -
- -
11.02.2011, r1001-1020
-
    -
  • Headsets upgraded. Shortcuts for channels are: :command :security scie:nce :engineering :medical. Also there is :binary :whisper :traitor and old good :h for your department. -
  • "One Click Queue" added: When you quickly click on two things in a row, it will automatically queue the second click and execute it after the default 'action delay' of 1 second after the first click. Previously you had to spam-click until 1 second had passed. THIS AFFECTS EVERYTHING. NEEDS TESTING. - Skie -
  • EMP effects added for further revisions. - Darem -
  • Goon stuff removed, AI/Bots leave behind hidden fingerprints, firedoors fixed, powersinks eat more, small map changes. - Mport -
  • Big map changes in engineering/robotics/science wing. - errorage -
  • Welder Fixed. Now burns your eyes again. - errorage -
  • 9x9 singularity sprite added. - Skie/Mport -
  • Ghetto surgery added. - Neophyte -
  • Nasty vent pump lag fixed. - Neophyte -
  • Mech gameplay and building updates. - ConstantA -
- -
08.02.2011, r999-1000
-
    -
  • The amount of power the station uses should be lower. -
  • The singularity now changes size based upon how much energy it has -
  • New Machine: Particle Accelerator. -
  • It might need a better name/sprite but when put together properly and turned on it will shoot Accelerated Particles. -
  • The particles irradiate mobs who get in the way and move through solid objects for a short time. -
  • The Particle Accelerator parts are set up by using a Wrench followed by a Cable Coil, then finished with a screwdriver. -
  • When you shoot the Singularity Generator with Accelerated Particles it will spawn a Singularity. -
  • New layout for Engineering, might be changed up slightly in the next few days. -
- -
06.02.2011, r979
-
    -
  • Jesus christ it's a new map what the fuck -
  • Just kidding, it's only minor changes to medbay/mechbay/cybernetics/R&D/toxins/robotics/chapel/theatre -
  • Okay so there's too many changes to list completely, but basically: toxins/R&D/virology/xenobiology are south through medbay; robotics/cybernetics/mechbay are where toxins used to be, the theatre and chapel are above medbay. -
  • Theatre is a new place for the Clown and Mime to play, there are some costumes available, a stage and backstage, and seating for the audience. -
  • R&D and Toxins have been combined together. R&D is still work in progress. You need to head south through medbay to get there. -
  • Medbay has been re-arranged slightly. Honestly, it's nothing, I bet you won't even notice anything different. There's also a new surgery suite, complete with pre-op and post-op rooms. -
  • Virology's been rearranged, but it is mostly in the same place still. -
  • Xenobiology is work in progress. [There's some fun stuff still being coded] -
  • The Chapel is now to the north. You'll probably be thinking something like "Goddamn, this place is fucking huge", but it's actually smaller than the previous chapel. -
  • Robotics and related stuff is also work in progress - however, everything needed for making borgs is there. Note: de-braining will now be done by surgeons in medbay, rather than roboticists in robotics, in case you're wondering where your optable went. -
  • I added color-coded pipes in the areas I was working on. Red pipes run from air siphons and feed into the waste loop; blue pipes run from air vents and pump whatever atmos is set to pump. Yeah, there's TWO pipe networks on the station, who knew? Well, some of you probably did, but I didn't! -
  • Please bring all complaints/ideas/suggestions/bugfixes to: This awesome thread on our forums -
  • This update brought to you by: veyveyr and Rookie, with help from friends! [Now you know who to strangle, please be gentle q_q] -
- -
05.02.2011, r968
-
    -
  • This really needs to be updated more often. -
  • Various map updates have been applied with many more to come. Expect overhauls! -
  • Mining system nearing completion. -
  • Massive overhaul to the electricity systems, the way singularity makes power, and various related functions. -
  • Mime spawns with White Gloves instead of Latex Gloves (apparently there's a difference!) -
  • A new event has been- CLANG! What the fuck was that? -
  • Ion storm laws should be much more interesting. -
  • Security reports should no longer list traitor heads/AIs as possible revs/cultists, nor should nuke operatives ever get named for anything. -
  • Pens are much more versatile and user friendly. -
  • Mech building is rapidly on its way! Ripleys can be built, consult your quartermasters. -
  • Traitors now have several new things they can steal. -
  • Some surgeries coded to accompany the new operating room and surgery tools. -
  • Research and Design is continuing development and should be rolled out shortly. -
  • Various sprites added, tweaked, scrapped and fixed. -
- -

Changelog

-
05.02.2011, r968
-
    -
  • This really needs to be updated more often. -
  • Various map updates have been applied with many more to come. Expect overhauls! -
  • Mining system nearing completion. -
  • Massive overhaul to the electricity systems, the way singularity makes power, and various related functions. -
  • Mime spawns with White Gloves instead of Latex Gloves (apparently there's a difference!) -
  • A new event has been- CLANG! What the fuck was that? -
  • Ion storm laws should be much more interesting. -
  • Security reports should no longer list traitor heads/AIs as possible revs/cultists, nor should nuke operatives ever get named for anything. -
  • Pens are much more versatile and user friendly. -
  • Mech building is rapidly on its way! Ripleys can be built, consult your quartermasters. -
  • Traitors now have several new things they can steal. -
  • Some surgeries coded to accompany the new operating room and surgery tools. -
  • Research and Design is continuing development and should be rolled out shortly. -
  • Various sprites added, tweaked, scrapped and fixed. -
- -
20.01.2011, r894
-
    -
  • Pipes can now be removed and re-attached by wrenching them. -
  • Mining system continues to develop. Still unaccessible to players. -
  • Various map changes. Some minor lag causing things were fixed. -
  • Admins have a new tool: They can now give any spell to anyone. Hurray! -
  • Imadolazine now works. Maybe? -
  • Singularity now releases itself if fed too much and will potentially explode. -
  • Magboots now successfully prevent you from getting pulled into the singularity. -
  • Strike teams immune to facehuggers. Why? I dunno. -
  • Many reagent containers are adjustable so you can pour the exact amount you need. -
  • No more emitters working in space, Collectors and collector controllers now ID lockable. -
  • Christmas Contest plaque finally added. It's near the armor/warden's office. -
  • Rocks fall, everyone dies. -
  • All cyborgs and robots can now be named. Just use a pen on the cyborg's frame before the brain is inserted. -
  • Knock spell now unbolts doors as well as opens them. -
  • New cultist runs and other changes. -
  • Added surgery tools for eventual surgery system. -
  • Autolathe and Circuit Printer animations redone. Yay pretty icons. -
  • AI law changes/uploads are now tracked (admin viewable). -
  • Revheads now get a PDA uplink instead of a headset one. -
  • Added a penlight. -
  • Science Research and Development tech tree uploaded. Not really accessible by anyone yet, though. -
- -
14.01.2011, r853
-
    -
  • Changlings Overhauled. Now function kinda like alium (using an internal chemical reserve instead of plasma) with each ability requiring a certain amount of chemicals to activate. Both venoms removed. Several "Dart" abiliites added. They allow the changling to deafen, blind, mute, paralyze, or even transform (dead) targets. -
  • Carp meat now contaminated with Carpotoxin. Anti-toxin negates the poison, however. -
  • New Reagent: Zombie Powder: Puts subjects into a deathlike state (they remain aware, though). Each unit of Zombie Powder requires 5 units of Carpotoxin, Sleeping Toxin, and Copper. -
  • Various alium fixes. -
  • Matches now available from smokes machine. -
  • Megabomb bug fixed. Bombs with timers/signalers won't detonate after the timer/ signaler is removed. -
  • New Disease: Rhumba Beat. Functions like GBS with a few exceptions. Not only available by admindickery. -
  • More mining fixes/changes. -
  • Ghost can now teleport to AI sat, Thunderdome, and Derelict. -
  • New gimmick clothes -
  • Constructing Glass Airlocks now use one sheet of R.Glass. -
  • Windows mow always appear above grills and pipes always above lattices. -
  • Added FireFighter mecha and various mecha fixes. -
  • Deconstructed walls now leave proper floor tiles (that can be pried up like normal) and remember what kind of floor they were before the wall was made. -
  • Carded AIs no longer take damage while in unpowered areas. -
  • Chaplains can now name their religion at round start. -
  • New Recipies: Clown Burger (1 Clown wig, 5 flour), Mime Burger (1 beret, 5 flour), Cuban Carp (1 carp fillet, 1 chili, 5 flour). -
  • Napalm nerfed a bit. Produces ~25% less plasma but it's all concentrated in a single tile (will still spread, though). -
  • Reagent bottles can, once again, be put into grenades. -
  • Various minor map changes. -
- -
08.01.2011,8:00PST, r820
-
    -
  • Holograms (AI controled psudo-mobs) added. Currently only admin spawn. -
  • Pre-spawned pills no longer have randomized image. -
  • Bridge reorganized. -
  • Automated turrets now less dumb. Additionally, turrets won't target people laying down. -
  • Cultists now automatically start known words for add cultist ritual. Also, converted cultists start knowning a word. -
  • Supply ship no longer can transport monkeys. Also, monkeys are no longer orderable from QM. -
  • Meat Crate added to QM. -
  • Corn can now be blended in a blender to produce corn oil which is used to create glycern. -
  • Request Consoles added across the station. Can be used to request things from departments (and slightly easier to notice then the radio). -
  • Centcom reoragnized a fair bit. Not that players care but admins might enjoy it. -
  • There is now a toggable verb that changes whether you'll turn into an alium or not. -
  • Hair sprited modified. -
  • Napalm and Incendiary Grenades both work now. Have fun setting things on fire. -
  • Binary Translater traitor item added. It allows traitors to hear the AI (it functions like a headset). -
  • New Disease: Pierrot's Throat. Enjoy, HONK! -
  • Robotic Transformation (from Robrugers) and Xenomorph Transformation (from xenoburgers) now curable. -
  • Mining added. Only accessible by admins (and those sent by admins). Very much WIP. -
  • Alium Overhaul. Divided into multiple castes with distinct abilities. -
  • New AI Modules: The goody two-shoes P.A.L.A.D.I.N. module and it's evil twin T.Y.R.A.N.T. Only the former actually spawns on the station. -
  • Lizards added. They run away and shit. -
  • PDA overhaul. Doesn't change anything for humans, just makes coders happy. -
  • Firesuits redone to look less like pajamas and instead like firesuits. Fire lockers also added. -
  • New Mecha: H.O.N.K. -
  • Deployable barriers added. Can be locked and unlocked. -
  • Mecha bay (with recharging stations) added. -
  • Bunny Ears, Security Backpacks, Medical Backpacks, Clown Backpacks, and skirt added. -
  • Various wizard changes. New Wizard Spell: Mind Swap. Swap your mind with the targets. Be careful, however: You may lose one of your spells. Wizards are no longer part of the crew and get a random name like the AI does. Wizards can change their known spells with their spellbook but only while on the wizard shuttle. -
  • Circuit Imprinter: Using disks from the various deparments, new circuit boards and AI modules can be produced. -
  • Heat Exchanging pipes added and various pipe/atmos changes. -
  • Ghost/Observer teleport now works 100% of the time. -
- -
17.12.2010,11:00GMT
-
    -
  • You need an agressive grip to table now, as well as being within one tile of the table (to nerf teletabling).
  • -
  • Teleport only runs once at the beginning of the round, hopefully reducing the lag in wizard rounds.
  • -
  • Wizards can't telepot back to their shuttle to afk now.
  • -
  • Someone added it a while ago and forgot to update the changelog - syndies in nuke need to move their shuttle to the station's zlevel first.
  • -
  • Bunch of other stuff.
  • -
- -
Sunday, November 21, 3:34 PST
-
    -
  • Bug fixes, not going into detail. Lots and lots of bug fixes, mostly regarding the new map
  • -
  • CMO has a more obvious lab coat, that looks nicer than the original
  • -
  • CMO also has a stamp now
  • -
  • QM has a denied stamp
  • -
  • Cyborgs got tweaked. Laws only update when checked. Also have wires that can be toyed
  • - with for various effects, including AI sync, and law control -
  • Second construction site similar to the original
  • -
  • Prison station has been tweaked, now includes a lounge, and toilets
  • -
  • Detective's revolver starts with a reasonable number of bullets
  • -
  • Prison teleporter to the courtroom now exists
  • -
  • AI related stuff: More cameras, oh, and bug fixes!
  • -
  • Emergency storage moved
  • -
  • Random AI law changes. New law templates, and variables. Old variables were tweaked and some of the crappy templates were removed
  • -
  • Ghosts can teleport to the derelict now
  • -
  • Respriting of a bunch of stuff as well as graphical fixes
  • -
  • Kitchen is attached to the bar again
  • -
  • General map tweaks and fixes
  • -
  • Wardens fixed for rev rounds
  • -
  • 5-unit pills now work
  • -
  • APCs added and moved
  • -
  • Cola machine added. Contains various flavours of soda. Also added new snacks to the now named snack machine. Water cooler added, just apply an empty glass to it
  • -
  • Salt & Pepper have been added, as part of the food overhaul
  • -
  • More bug fixes. There was a lot
  • -
- -
Tuesday, November 16, 00:20 GMT
-
    -
  • Cruazy Guest's map is now live.
  • -
  • Entire station has been rearranged.
  • -
  • Prison Station added, with Prison Shuttle to transport to and from.
  • -
  • New Job: Warden. Distributes security items.
  • -
  • The new map is still in testing, so please report any bugs or suggestions you have to the forums.
  • -
  • AI Liquid Dispensers, Codename SLIPPER, have been added to the AI core. They dispense cleaning foam twenty times each with a cooldown of ten seconds between uses. Mounted flashes have also been included.
  • -
  • Clown stamp added to clown's backpack.
  • -
- -
Sunday, November 14, 18:05
-
    -
  • Major food/drink code overhaul. Food items heal for more but not instantly. Poison, Drug, and "Heat" effects from food items are also non-instant.
  • -
  • Preperation for one-way containers and condiments.
  • -
  • New Reagents: Nutriment, Ketchup, Soysauce, Salt, Pepper, Capsaicin Oil, Frost Oil, Amatoxin, Psilocybin, Sprinkles
  • -
  • New Food Item: Chaos Donut: 1 Hot Sauce + 1 Cold Sauce + 1 Flour + 1 Egg. Has a variable effect. NOT DEADLY (usually).
  • -
  • New Drug: Ethylredoxrazine: Carbon + Oxygen + Anti-Toxin. Binds strongly with Ethanol.
  • -
  • Tape Recorders added! Now you can actually PROVE someone said something!
  • -
  • Amospherics Overhaul Started: It actually works now. You can also build pipes and create function air and disposal systems!
  • -
  • Walls are now smooth.
  • -
  • Alcohol no longer gets you as wasted or for as long.
  • -
  • QM job split into QM and Cargo Technicians. QM has his own office.
  • -
  • Doors can no longer be disassembled unless powered down and unbolted.
  • -
  • New Job: Chief Medical Officer. Counts as a head of staff and is in charge of medbay. Has his/her own office and coat.
  • -
  • Wizarditis Bottle no longer in virus crate.
  • -
- -
Friday, November 5, 19:29
-
    -
  • The ban appeals URL can now be set in config.txt
  • -
  • Secret mode default probabilities in config.txt made sane
  • -
  • Admin send-to-thunderdome command fixed to no longer send people to the other team's spawn.
  • -
  • Having another disease no longer makes you immune to facehuggers.
  • -
  • Magboots are now available from EVA.
  • -
  • Changeling death timer shortened. Destroying the changeling's body no longer stops the death timer.
  • -
  • Cult mode fixes.
  • -
  • Fixed cyborgs pressing Cancel when choosing AIs.
  • -
  • The play MIDIs setting now carries over when ghosting.
  • -
  • Admins can now see if a cyborg is emagged via the player panel.
  • -
  • PAPERWORK UPDATE v1: Supply crates contain manifest slips, in a later update these will be returnable for supply points. -
  • The Supply Ordering Console (Request computer in the QM lobby) can now print requisition forms for ordering crates. In conjunction with the rubber stamps, these can be used to demonstrate proper authorisation for supply orders.
  • -
  • Rubber stamps now spawn for each head of staff.
  • -
  • The use of DNA Injectors and fueltank detonations are now admin-logged.
  • -
  • Removed old debug code from gib()
  • -
- -
Tuesday, November 2, 19:11(GMT)
-
    -
  • Finished work on the "cult" gamemode. I'll still add features to it later, but it is safe to be put on secret rotation now.
  • -
  • Added an energy cutlass and made a pirate version of the space suit in preparation for a later nuke update.
  • -
  • Changeling now ends 15 minutes after changeling death, unless he's ressurected.
  • -
  • Further fixing of wizarditis teleporting into space.
  • -
  • Fixed the wise beard sprite.
  • -
  • Fixed missing sprite for monkeyburgers.
  • -
  • Fixed Beepsky automatically adding 2 treason points to EVERYONE.
  • - -
- -
Thursday, October 28, 19:30(GMT)
-
    -
  • Sleepers and disposals now require two seconds to climb inside
  • - -
  • Hydroponics crate ordered in QMs doesnt spawn too many items
  • -
  • Replacement lights crate can be ordered in QM.
  • -
  • Added space cleaner and hand labeler to Virology.
  • -
  • Welder fuel tanks now explode when you try to refuel a lit welder.
  • -
  • Made clown's mask work as a gas mask.
  • -
  • 9 new cocktails: Irish Coffee, B-52, Margarita, Long Island Iced Tea, Whiskey Soda, Black Russian, Manhattan, Vodka and Tonic, Gin Fizz. Refer to the wiki for the recipes.
  • -
  • Kitchen update: -
      -
    • -New Microwave Recipies: Carrot Cake (3 Flour, 3 egg, 1 milk, 1 Carrot), Soylen Viridians (3 flour, 1 soybeans), Eggplant Parmigania (2 cheese, 1 eggplant), and Jelly Donuts (1 flour, 1 egg, 1 Berry Jam), Regular Cake (3 flour, 3 egg, 1 milk), Cheese Cake (3 flour, 3 egg, 1 milk), Meat Pies (1 meat of any kind, 2 flour), Wing Fang Chu (1 soysauce, 1 xeno meat), and Human and Monkey Kabob (2 human or monkey meat, metal rods).
    • -
    • - Ingredients from Processor: Soysauce, Coldsauce, Soylent Green, Berry Jam.
    • -
    • - Sink added to kitchen to clean all the inevitable blood stains and as preperation for future cooking changes.
    • -
    • - The food processor can't be abused to make tons of food now.
    • - -
    -
  • Multiple tweaks to virology and diseases: -
      -
    • - Added wizarditis disease.
    • -
    • - Spaceacillin no longer heals all viruses.
    • -
    • - Some diseases must be cured with two or more chemicals simultaneously.
    • -
    • - New Virology design including an airlock and quarantine chambers.
    • -
    • - Made vaccine bottles contain 3 portions of vaccine.
    • -
    • - Lots of minor bug fixes.
    • - -
    - -
- -
Monday, October 18, 06:24(GMT)
-
    -
  • Added virology profession with a cosy lab in northwestern part of medbay.
  • -
  • Virology related things, like taking blood samples, making vaccines, splashing contagious blood all over the station and so on.
  • -
  • Added one pathetic disease.
  • -
  • Virus crates are now available from the quartermasters for 20 points.
  • -
  • The DNA console bug (issue #40) was fixed, but I still made the DNA pod to lock itself while mutating someone.
  • -
  • Added icons for unpowered CheMaster and Pandemic computers
  • -
  • Added some sign decals. The icons were already there, but unused for reasons unknown.
  • -
  • Some map-related changes.
  • -
- -
Wednesday, October 13, 14:12(GMT)
-
    -
  • Crawling through vents (alien) now takes time. The farther destination vent is, the more time it takes.
  • -
  • Cryo cell healing ability depends on wound severity. Grave wounds will heal slower. Use proper chemicals to speed up the process.
  • -
  • Added sink to the medbay.
  • -
  • Bugfixes: -
      -
    • - Some reagents were not metabolized, remaining in mob indefinitely (this includes Space Cola, Cryoxadone and cocktails Kahlua, Irish Cream and The Manly Dorf).
    • -
    • - Fixed placement bug with container contents window. Also, utility belt window now doesn't obscure view.
    • -
    -
  • -
- -
Sunday, October 10, 14:25(GMT)
-
    -
  • Scrubbers in the area can be controlled by air alarms. Air alarm interface must be unlocked with an ID card (minimum access level - atmospheric technician), usable only by humans and AI. Panic syphon drains the air from affected room (simple syphoning does too, but much slower).
  • -
  • Sleeper consoles inject soporific and track the amounts of rejuvination chemicals and sleep toxins in occupants bloodstream.
  • -
  • Flashlights can be used to check if mob is dead, blind or has certain superpower. Aim for the eyes.
  • -
  • Radiation collectors and collector controls can be moved. Secured\unsecured with a wrench.
  • -
  • Air sensors report nitrogen and carbon dioxide in air composition(if set to).
  • -
  • Air Control console in Toxins.
  • -
  • Additional DNA console in genetics
  • -
  • Enough equipment to build another singularity engine can be found in engineering secure storage
  • -
  • Air scrubber, vent and air alarm added to library
  • -
  • Air alarm added to brig
  • -
  • Air scrubbers in Toxins turned on, set to filter toxins
  • -
  • Empty tanks, portable air pumps and similar can be filled with air in Aft Primary Hallway, just connect them to the port. Target pressure is set by Mixed Air Supply console in Atmospherics (defaults to 4000kPa).
  • -
- -
Wednesday, October 6, 18:36
-
    -
  • Fixed the Librarian's suit - its worn iconstate wasn't set.
  • -
  • Fixed some typos.
  • -
  • Monkey crates are now available from the quartermasters for 20 points.
  • -
  • Corpse props removed from zlevel 8 as they were causing issues with admin tools and the communications intercept.
  • -
  • Cleaned up the default config.txt
  • -
  • Added a readme.txt with installation instructions.
  • -
  • Changed the ban appeals link to point to our forums for now - this'll be a config file setting soon.
  • -
- -
Tuesday, October 5, 01:41
-
    -
  • Fixes to various nonworking cocktails.
  • -
  • More map and runtime error fixes.
  • -
  • Nuke operative headsets should be on an unreachable frequency like department headsets.
  • -
  • Another AI Malfunction change: Now once the AI thinks enough APCs have been hacked, it must press a button to start the timer, which alerts the station to its treachery.
  • -
  • Blob reskinned to magma and increased in power.
  • -
  • The HoS now has an armored greatcoat instead of a regular armor vest.
  • -
  • Admin logs now show who killswitched a cyborg.
  • -
  • The roboticist terminal now lets you see which AI a cyborg is linked to.
  • -
  • Malf AIs are no longer treated as inactive for the purpose of law updates and cyborg sync while hacking APCs.
  • -
  • Traitor AIs are now affected by Reset/Purge/Asimov modules, except law 0.
  • -
  • AI core construction sprites updated.
  • -
  • Securitrons removed from the Thunderdome.
  • -
  • An APC now supplies power to the bomb testing area, and has external cabling to supply it in turn.
  • -
  • A new variant freeform module has been added to the AI Upload room.
  • -
  • The changeling's neurotoxic dart has been made more powerful - this will likely be an optional upgrade from a set of choices, akin to wizard spells.
  • -
  • Some gimmick clothes moved to a different object path.
  • -
  • The chameleon jumpsuit should now be more useful - it includes job-specific jumpsuits as well as flat colours.
  • -
- -
Wednesday, September 29, 15:40
-
    -
  • Bartender update! Bartender now has a Booze-O-Mat vending machine dispensing spirits and glasses, which he can use to mix cocktails. Recipes for cocktails are available on the wiki.
  • -
  • The barman also now has a shotgun hidden under a table in the bar. He spawns with beanbag shells and blanks. Lethal ammo is obtainable from hacked autolathes.
  • -
  • Dead AIs can once more be intelicarded, however in order to be restored to functionality they must be repaired using a machine in the RD office.
  • -
  • Silicon-based lifeforms have metal gibs and motor oil instead of blood.
  • -
  • Aliens now have a death message.
  • -
  • Intelicarded AIs can now have their ability to interact with things within their view range reactivated by the person carrying the card.
  • -
  • New AI cores can be constructed from victimsvolunteers.
  • -
  • Verbs tweaked.
  • -
  • Intelicarded AIs can be deleted.
  • -
  • RD office redesigned, and the RD now spawns there.
  • -
  • The AI can now choose to destroy the station on winning a Malf round.
  • -
  • General bugfixes to AIs, constructed AIs and decoy AIs.
  • -
  • Hats no longer prevent choking.
  • -
  • Some extra gimmick costumes are now adminspawnable.
  • -
  • AI health is now displayed on their status tab.
  • -
  • AI upload module now requires you to select which AI to upload laws to in case of multiple AIs.
  • -
  • Cyborgs now choose an AI to sync laws with upon creation.
  • -
  • Law office redesigned.
  • -
  • Roboticists no longer have Engineering access.
  • -
  • More fixes to areas which had infinite power due to having no assosciated APC.
  • -
  • Meatbread slices are no longer infinite.
  • -
  • Malf rounds no longer end if a non-malfunctioning AI is killed.
  • -
  • Cigarettes now have directional sprites.
  • -
  • AI Core circuitboard spawns in the RD office.
  • -
  • AI Satellite now has cameras and properly-wired SMES batteries.
  • -
  • Decoy AIs can no longer be moved.
  • -
  • Several runtime errors have been fixed.
  • -
  • Nuke rounds will now end properly on a station or neutral victory.
  • -
  • Riot shields have been nerfed and are now only available in the armory and in riot crates.
  • -
  • Foam dart crossbows, cap guns and caps can now be won as arcade prizes.
  • -
  • AI Malfunction has been redesigned - the AI must now hack APCs in order to win. More APCs hacked makes the timer tick faster.
  • -
  • Hydroponics now has a MULEbot station.
  • -
  • Changeling mode has been added to the game and is now in testing.
  • -
  • Electrified airlocks should now only zap you once if you bump into them while running.
  • -
  • Chemistry and Toxins access has been removed from Botanists.
  • -
  • General bugfixes and map tweaks.
  • -
- -
Sunday, September 26, 17:51
-
    -
  • Riot shields! One in every security closet, and a few in armory. Also orderable from QM.
  • -
- -
Tuesday, September 21, 17:51
-
    -
  • New experimental UI for humans by Skie. Voice out if it has problems or you don't like it.
  • - ---> YOU CAN CHOOSE UI FROM PREFERENCES <--- -
  • Hydroponics: Now you can inject chemicals into plants with a syringe. Every reagent works differently.
  • -
  • Hydroponics: Added a small hoe for uprooting weeds safely. Botanists now have sissy aprons.
  • -
  • New random station/command names and verbs.
  • -
  • Dead AIs can no longer be intellicarded and the steal AI objective is now working.
  • -
  • Aliens now bleed when you hit them, as well as monkeys.
  • -
  • Hurt people and bodies leave blood behind if dragged around when they are lying. Sprites to be updated soon...
  • -
  • Fixed several run-time errors in the code. Also food doesn't deal damage anylonger in some cases.
  • -
  • Blobs and alien weeds slowed down some. Plant-b-gone buffed some.
  • -
  • Fixed monkeys and aliens not being able to deal damage to humans with items.
  • -
  • Monkeys now slip on wet floor.
  • -
- -
Friday, September 17, 23:03
-
    -
  • The Lawyer now starts in his snazzy new office.
  • -
  • Law Office accesslevel added. Currently, the Lawyer and the HoP begin with this.
  • -
  • Robotics access can now be added or removed from the HoP's computer.
  • -
  • Robotics, the captain's quarters, the cargo lobby and the staff heads office now have APCs and can lose power like the rest of the station.
  • -
  • Toxins mixing room is now a separate area for power and fire alarm purposes, as it already had its own APC.
  • -
- -
Thursday, September 16, 20:11
-
    -
  • Added the Lawyer job.
  • -
  • Doors can now be constructed and deconstructed. This is being playtested, expect the specifics to change.
  • -
  • Fixed certain jobs which were supposed to have stuff spawning in their backpack that just wasn't getting spawned.
  • -
- -
Monday, September 13, 13:30
-
    -
  • Bunch of new announcer sounds added
  • -
  • Minor lag fix implementation in the pipe system
  • -
  • You can now hear ghosts... sometimes
  • -
  • Seed bags and nutrients can now be pocketed
  • -
- -
Monday, September 12, 12:48
-
    -
  • New kitchen stuff: New recipes (Meatbread, Cheese, Omelette Du Fromage, Muffins), new chef's knife and trays (Spawn in the meat locker) and milk (spawns in the fridge). Recipes are as follows: - -Cheese: milk on food processor - -Cheese wedge: Slice the cheese wheel with the chef's knife - -Omelette Du Fromage: 2 eggs 2 cheese wedges - -Muffin: 2 eggs 1 flour 1 carton of milk - -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
  • -
  • 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)
  • -
-
Thursday, September 2, 22:45
-
    -
  • Ghosts can no longer release the singularity.
  • -
  • Sprites added in preparation for a Hydroponics update
  • -
  • A decoy AI now spawns in the AI core during Malfunction rounds to reduce metagaming.
  • -
  • libmysql.dll added to distribution.
  • -
  • Aircode options restored to default configuration.
  • -
  • AIs properly enter powerloss mode if the APC in their area loses equipment power.
  • -
  • Hydroponics crates added to Hydroponics, containing Weed-B-Gone
  • -
  • Airlock electrification now actually works properly.
  • -
  • Karma database error message updated.
  • -
  • Cyborgs choosing the standard module no longer become invisible except for a pair of glowing red eyes.
  • -
  • Aliens now have a hivemind channel, accessed like departmental radio channels or robot talk with ':a'.
  • -
  • Full donut boxes no longer eat whatever item is used on them and disappear.
  • -
-
Monday, August 30, 16:24
-
    -
  • PDA user interface has been given a graphical overhaul. Please report any problems with it on the issue tracker.
  • -
  • Personal lockers are once again available in the lockerroom
  • -
  • BUGFIX: Xenoburger iconstate was accidentally removed in an earlier revision. This has been fixed.
  • -
  • Some of the default messages have been changed.
  • -
  • Additional sprites added for plants and weeds in preparation for an expansion of Hydroponics.
  • -
  • A schema script is now available for setting up the SQL database.
  • -
- -
Sunday, August 29, 05:09
-
    -
  • The Robotics Crate no longer exists. Quartermasters can now order a MULEbot crate for 20 points, or a Robotics Assembly crate for 10 points. The latter provides 4 flashes, 3 proximity sensors, two 10k charge power cells and an electrical toolbox, and requires a roboticist or a head of staff to open.
  • -
  • Traitor AIs no longer lose their Law 0 in the event of power loss.
  • -
  • Administrators can now toggle the availiabilty of their right-click verbs to prevent accidental usage while playing.
  • -
  • Tool Storage vending machine is now a proper object. (code cleanup)
  • -
  • Buckets are now available from autolathes.
  • -
  • Four generic remote signaller PDA cartridges are now stocked in the Tool Storage vending machine.
  • -
  • AI status display density adjusted.
  • -
- -
Thursday, August 26, 21:07
-
    -
  • Open Source Release Thanks to Mport for releasable singularity code.
  • -
  • Cyborgs redone Thanks again to Mport for this, cyborgs are totally different now.
  • -
  • Engine Monitor PDA app is now Power Monitor PDA app, and actually works.
  • -
  • AI State Laws verb now allows the AI to choose which laws to state, in case of traitor AIs or laws ordering it not to state them. Hopefully this will cut down on 'OMG THE AI IS COPYING AND PASTING' metagaming.
  • -
  • Power Monitor circuitboard isn't mislabeled as Mass Driver Control any more.
  • -
  • Traitor and Rev-head clowns lose the clumsiness gene - this should make trying to flash people in Rev mode less of an exercise in frustration.
  • -
  • A sink has been added to the Fitness room - this lets you wash dirty and bloodstained clothing and equipment.
  • -
  • Blast doors and firedoors no longer open by just bumping into them.
  • -
  • The bar and kitchen now open onto the same seating area. The old cafeteria area is now used as a lockerroom to replace the old one which was displaced by Hydroponics.
  • -
  • The bar now has a space piano with which you can entertain and annoy the crew.
  • -
  • LIBRARY A library has been added to the station in the escape arm in order to educate the crew. The new Librarian job is available to manage it. Crewmembers can request and read books, or write and bind their own books for upload to a persistent database.
  • -
  • The supply of flashbangs available from Security has been reduced to cut down on people constantly flashbanging the escape shuttle.
  • -
  • InteliCards are available in various locations to allow the retrieval of valuable AI personality data in the event of catastrophic station damage.
  • -
- -
Friday, August 06, 20:32
-
    -
  • Hydroponics/Botany Added Credit goes to Skie and the folks over at the independent opensource SS13 branch, this is their code. It's lacking a lot, but it's a great start!
  • -
  • Way more tweaks than I can remember. Shouldn't wait so long between changelog updates.
  • -
-
Tuesday, July 13, 22:35
-
    -
  • Singularity Engine Added Oh God we're all going to die (All credit on this one goes to Mport2004)
  • -
  • 'Purge' AI module added - purges ALL laws (except for law 0). Will probably change this to a Syndicate only item
  • -
  • Cyborgs now spawn with a power cell. Should prevent stupid cyborg deaths (and also pave the way for starting as a cyborg once more bugs are fixed)
  • -
-
Saturday, July 10, 15:10
-
    -
  • Examining a player will now tell you if their client has disconnected.
  • -
  • Examining a brain will now tell you if it's owner is still connected to the game.
  • -
  • Alien Queens can make facehuggers. Facehuggers can make larva. Larva can grow into xenos! Xenos can become queens! The circle of life~
  • -
  • Some powernet bug fixes: Bad list and division by zero.
  • -
-
Friday, July 09, 05:16
-
    -
  • Tweaked crate costs for Quartermaster.
  • -
  • Increased metal available in Robotics.
  • -
  • Added department-specific headsets. Engineering, Medical, Command, and Security all receive special headsets capable of broadcasting on a standard frequency PLUS a secure frequency only available to headsets of the same type. Precede say messages with ":h" to use.
  • -
- -
Tuesday, July 06, 19:16
-
    -
  • Prayer command added.
  • -
  • State Laws command for AI added.
  • -
  • Disabled Lockdown command for AI. Too server heavy.
  • -
  • Crew manifest and various station databases should properly update when late arrivals join the game, now.
  • -
  • Quartermasters will receive 10 points every five minutes. This will probably be nerfed heavily, but we'll give it a shot anyhow.
  • -
  • Fixed a bug with doors/airlocks. (Thanks Mport2004)
  • -
- -
Sunday, April 25, 18:53
- -
  • - New graphics: -
      -
    • - Side Facing Sprites: Player sprites will now face in all directions when moving. Holy shit! -
    • -
    -
  • - -
    Monday 2.0, April 19, 2100
    -
      -
    • - New features: -
        -
      • - Disposal System: The station now has a fully functional disposal system for throwing away nuclear authentication disks and old, dirty clowns. -
      • -
      • - Breakable Windows: Windows are breakable by projectiles and thrown items (including people), shards hurt your feet. -
      • -
      • - Status Display: Station escape shuttle timers now function as status displays modifiable from the bridge. -
      • -
      • - Space Heater: Space heaters for heating up cold spaces, in space. -
      -
    • -
    • - New items: -
        -
      • - Welding Mask: Helps engineers shield their eyes when welding. -
      • -
      • - Utility Belt: Function as toolboxes equippable in the belt slot. -
      • -
      • - Mouse Trap: Hurt your feet, especially if you aren't wearing shoes! -
      • -
      • - Power Sink: Traitor item that rapidly drains power. -
      • -
      -
    • -
    • - New graphics: -
        -
      • - North Facing Sprites: Player sprites will now face north when moving north. -
      • -
      • - Hidden Pipes: Pipes are now hidden underneath floor tiles. -
      • -
      -
    • -
    • - New robot: Medibot -
        -
      • - Automatically attempts to keep crewmembers alive by injecting them with stuff. -
      • -
      -
    • -
    • - New robot: Mulebot -
        -
      • - Allows quartermasters to automatically ship crates to different parts of the station. -
      • -
      -
    • -
    - -
    Funday, December 31, 2099
    -

    "FINALLY, DEV IS OUT"

    -
      -
    • - Changes: -
        -
      • - Atmos system GREATLY OPTIMIZED! -
      • -
      • - Brand new station layout! -
      • -
      • - Robust chemical interaction system! -
      • -
      • - HOLY FUCK PLAYING THIS GAME ISN'T LIKE TRODDING THROUGH MOLASSES ANYMORE -
      • -
      • - Feature: If two players collide with "Help" intent, they swap positions. -
      • -
      -
    • -
    - -
    Tuesday, February 23, 2010
    -
      -
    • - OH NO STRANGLING GOT NERFED: Insta-strangling (hopefully) removed. Victim no longer instantly loses consciousness. -
    • -
    - -
    Sunday, February 21, 2010
    -
      -
    • - Cloning Machine: The Geneticist spilled coffee on the Genetics Machine's revival module and it was too costly to replace! -
        -
      • - Clones may or may not have horrible genetic defects. -
      • -
      -
    • -
    - -
    Thursday, February 18, 2010
    -
      -
    • - New feature: Obesity from overeating in a short period of time. -
    • -
    - -
    Sunday, February 14, 2010
    -
      -
    • - New feature: Station destruction cinematic if the crew loses in AI Malfunction or Nuclear Emergency. -
    • -
    • - New Position: Tourist -
        -
      • - Centcom has entered the lucrative business of space tourism! Enjoy an event-filled vacation on the station, and try not to get killed. -
      • -
      • - Guest accounts are now restricted to selecting Tourist in Character Setup. -
      • -
      -
    • -
    - -
    Friday, February 5, 2010
    -
      -
    • - AI: Added 30 second cooldown to prevent spamming lockdowns. -
    • -
    - -
    Wednesday, February 2, 2010
    -
      -
    • - Feature: Character preview in Character Setup! -
    • -
    - -
    Tuesday, February 2, 2010
    -
      -
    • - New item: Drinking glasses that you can fill with water. -
    • -
    • - Feature: Sounds now pan in stereo depending on your position from the source. -
    • -
    - -
    Saturday, December 5, 2009
    -
      -
    • - Traitor tweak: Agent cards can now be forged into a fake ID. -
    • -
    - -
    Friday, December 4, 2009
    -
      -
    • - Supply Dock 2.0: The Supply Dock has been redesigned and now features conveyer belts! Amazing! -
    • -
    • - New uniforms: The Research Director, Chief Engineer, and the research jobs have new uniforms. The Head of Security has a cool new hat which happens to be his most prized possession. -
    • -
    • - Merged research: The first act of the Research Director is to merge Toxins and Chemistry into a single Chemical Lab. Hooray! -
    • -
    • - Robot tweak: You can now observe robots using the observe command. -
    • -
    • - Stamps: The heads now have stamps to stamp papers with, for whatever reason. -
    • -
    - -
    Monday, November 30, 2009
    -
      -
    • - Supply Shuttle 1.0: Now you can order new supplies using Cargo Bay north of the autolathe. -
    • -
    • - New containers: The game now features a variety of crates to hold all sorts of imaginary space supplies. -
    • -
    • - New position: Quartermaster -
        -
      • - A master of supplies. Manages the cargo bay by taking shipments and distributing them to the crew. -
      • -
      -
    • -
    • - New position: Research Director -
        -
      • - The head of the SS13 research department. He directs research and makes sure that the research crew are working. -
      • -
      -
    • -
    • - New position: Chief Engineer -
        -
      • - Boss of all the engineers. Makes sure the engine is loaded and that the station has the necessary amount of power to run. -
      • -
      -
    • -
    • - New robot: Securibot -
        -
      • - Automatically stuns and handcuffs criminals listed in the security records. It's also really goddamn slow. -
      • -
      -
    • -
    • - New jumpsuits: Engineers and Atmos Techs have new jumpsuits to distinguish between them easier. -
    • -
    - -
    Friday, November 27, 2009
    -
      -
    • - Monkey AI 2.0: Monkeys will now get angry, going after random human targets with the ability to wield weapons, throw random objects, open doors, and break through glass/grilles. They're basically terminators. -
    • -
    • - New gamemode: Monkey Survival -
        -
      • - Survive a horde of angry monkeys busting through the station's airvents and rampaging through the station for 25 minutes. -
      • -
      -
    • -
    • - New robots: Cleanbot and Floorbot -
        -
      • - Cleanbots automatically clean up messes and Floorbots repair floors. -
      • -
      -
    • -
    • - New spell: Mindblast -
        -
      • - Causes brain damage, progressively causing other players to become even more retarded. -
      • -
      -
    • -
    • - Alien Races -
        -
      • - Wizards may randomly spawn as illithids, who gain Mind Blast for free, and nuke agents may randomly spawn as lizardmen. -
      • -
      -
    • -
    • - Station shields: The station now has a toggleable forcefield that can only be destroyed by meteors or bombs. Takes a lot of station power to use. -
    • -
    • - Traitor scaling: Number of traitors/wizards/agents now scales to number of players. -
    • -
    • - New food item: Donk pockets -
        -
      • - Delicious and microwavable, gives a bigger health boost for traitors. -
      • -
      -
    • -
    • - Cigarettes: Now you can fulfill your horrible nicotine cravings. The detective starts with a zippo lighter and pack of cigarettes. Other packs can be be obtained via vending machines. -
    • -
    • - Warning signs: The station is now filled with various warning signs and such. -
    • -
    • - Updated graphics: Many, many objects have had their graphics updated including pipes, windows, tables, and closets. HUD graphics have been updated to be easier to understand. -
    • -
    • - Lighting fixes: New turf is now correctly lit instead of being completely dark. -
    • -
    • - Meteor fixes: The code and graphics for meteors has been fixed so the meteor gametype is more playable, sort of. -
    • -
    • - Escape shuttle fix: The shuttle can now be called in Revolution and Malfunction, but the shuttle will be recalled before it arrives. This way players can no longer call the shuttle to figure out the game mode during secret. -
    • -
    • - Changelog updated: New changelog entry for Thanksgiving thanks to Haruhi who will probably update the changelog from now on after almost a month of neglect. -
    • -
    - -
    Monday, November 3, 2009
    -
      -
    • - Bug fix: Made most pop-up windows respect the close button. -
    • -
    - -
    Sunday, October 25, 2009
    -
      -
    • - Randomized naming: Names for Central Command and Syndicate are now randomized. -
    • -
    - -
    Saturday, October 24, 2009
    -
      -
    • - Bug fix: PDAs had their code cleaned up. Notice any problems? Report them. -
    • -
    • - New syndicate item: Detomatix Cartridge, allows remote detonation of PDAs (rather weak explosion)! -
    • -
    • - Feature: Remotely detonating PDAs has a chance of failure depending on the PDA target, a critical failure will result in the detonation of your own PDA. -
    • -
    - -
    Monday, October 19, 2009
    -
      -
    • - Gibbing update: Gibbing stuff has been rewritten, robots now gib nicer. -
    • -
    • - LIGHTING!!!: The station now has dynamic lighting and associated items. -
    • -
    - -
    Friday, October 16, 2009
    -
      -
    • - Poo v1.0~: This has caused many ragequits. -
    • -
    • - Flushable toilets: You can now use toilets to place your vile, disgusting and irreprehensible excretions (you disgusting children). Just be careful what you flush! -
    • -
    -
    Monday, October 12, 2009
    -
      -
    • - Feature: Emergency oxygen bottles can be clipped to your belt now. -
    • -
    • - Clothing update: Bedsheets are now wearable. -
    • -
    • - Updated HUD: A few minor tweaks to the inventory panel. Things might not be exactly where you're used to them being. -
    • -
    -
    Monday, September 28, 2009
    -
      -
    • - New position: Chef -
        -
      • - Maintains the Cafeteria, has access to Kitchen and Freezer, Food creation will be in shortly. -
      • -
      -
    • -
    • - Food update: Food items now heal Brute/Burn damage. The amount recovered varies between items. -
    • -
    -
    Saturday, August 29, 2009
    -
      -
    • - AI laws update: Nanotrasen has updated its AI laws to better reflect how they wish AIs to - operate their stations. -
    • -
    • - Traitor item change: E-mag renamed to Cryptographic Sequencer. -
    • -
    - -
    Friday, July 31, 2009
    -
      -
    • I&#39;m really sorry everyone I just HAD to add a gib all verb.
    • -
    • Decided to add the creation of bombs to bombers list
    • -
    • Made the new bombing list EVEN BETTER!!!
    • -
    • Fixed a bug with admin jumping AND the traitor death message
    • -
    • Oops, fixed a bug that returned the right click pm thing thinking the admin was - muted.
    • -
    • Made a new improved way of tracking who bombs shit.
    • -
    • More formatting shit.
    • -
    • Fixed up some mute code and made it so that if a player is muted they cannot PM - us.
    • -
    • Adminhelps now logged in the admin file not ooc
    • -
    • Changed the way admin reviving is dealt with. (It was coded kind of weirdly - before)
    • -
    • Added a few areas to the observe teleport. Fixed some adminjump things. Modified - the paths of some areas.
    • -
    • You can now ban people who have logged out and admins can now jump to people - using the player panel.
    • -
    • Added in jump to key coded in a much better way than showtime originally did it.
    • -
    • Fixed magical wind when laying pipes. They start out empty!!
    • -
    • Made blink safer. Fixed the crew-quarters to ai sattelite teleport problem.
    • -
    • Forgot the message again. Added an emp spell. thanks copy&amp;paste.
    • -
    • OH MY GOD I HAVE RUINED ASAY
    • -
    • Added electronic items to the pipe dispenser
    • -
    • fixed a formatting error with the changelog (I didn&#39;t break it, it was showtime)
    • -
    • Fixed a formatting error
    • -
    • Cleaned up sandbox object spawn code
    • -
    • New and improved admin log so we can keep an eye on these fuckers
    • -
    • Fixed adminjump because I realise most people use it for the right click option
    • -
    • Mushed together jump to mob and jump to key
    • -
    • Fixed a compilation error and made my test room more secure!
    • -
    - -
    Wednesday, July 29th, 2009
    - -

    These are a collection of the updates from the last 6 days. I promise to update - the changelog once a week. Note that this does not include all the changes in - the past 6 days.

    - -
      -
    • Multitools can now be used to measure the power in cables.
    • -
    • Fixed a bug where the canister message would repeat and spam the user when - attackby analyzer. Fixed an admin formatting error.
    • -
    • Replaced all range checks with a in_range proc. pretty good chance I broke - something or everything.
    • -
    • Mutations use bitfields
    • -
    • Fixed a bug with my traitor panel.
    • -
    • Fixed the turrets, ruined Pantaloons map (test map). Did some things with - turrets and added a few areas.
    • -
    • Some stuff in here you know the usual shit. Bugfixes, formatting etc.
    • -
    • Stunbaton nerf.
    • -
    • Tempban longer than 1 year -&gt; permaban.
    • -
    • Turfs &gt; spawnable.
    • -
    • Shaking someone now slowly removes paralysis, stuns and the &#39;weakened&#39; stuff.
    • -
    • CTF flags now check if someone has them equipped every 20 seconds, if they are - not then they delete themselves and respawn.
    • -
    • Fixed the r-wall-welder-message-thing.
    • -
    • Change to the CTF code, flag captures can now only happen if your team has their - flag in the starting position.
    • -
    • Pruning my test room.
    • -
    • Instead of the red and green team its now the American and Irish teams!
    • -
    • 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
    • -
    • Fixed a bug that gave everyone modify ticker variables you silly sausage.
    • -
    • Sorted the AIs track list.
    • -
    • Constructable filter inlets and filter controls.
    • -
    • Added in admin messages for when someone is banned.
    • -
    • Bannana and honk honk.
    • -
    - -
    Saturday, June 27th, 2009
    - -
      -
    • Pipe construction now works completely. //Nannek
    • -
    • Many many other things that never gets recorded in the changelog!!
    • -
    - -
    Saturday, June 27th, 2009
    -
      -
    • The Michael Jackson Memorial Changelog Update
    • -
    • Pipe filters adjusted for more ideal environmentals //Pantaloons
    • -
    • Added in job tracking //Showtime
    • -
    • Crew Manifest and Security Records now automagically update when someone joins //Nannek
    • -
    • Fixed a bug where sometimes you get a screwdriver stuck in your hand //Pantaloons
    • -
    • Flamethrowers can now be disassembled //Pantaloons
    • -
    • OBJECTION! Added suits and briefcases //stuntwaffle
    • -
    • Added automatic brig lockers //Nannek
    • -
    • Added brig door control authorization and redid brig layout //Nannek
    • -
    • Emergency toolboxes now have radios and flashlights, and mechanical toolboxes now have crowbars //Pantaloons
    • -
    • New whisper system //lallander
    • -
    • Some more gay fixes //everybody
    • -
    • Some really cool fixes //everybody
    • -
    • Really boring code cleanup //Pantaloons
    • -
    • ~~In Loving Memory of MJ~~ Sham on!
    • -
    - -
    Friday, June 12th, 2009
    -
      -
    • Looking back through the SVN commit log, I spy...
    • -
    • Keelin doing some more performance enhancements
    • -
    • Fixed one person being all 3 revs at once (hopefully)
    • -
    • Some gay fixes
    • -
    • New admin system installed
    • -
    • Fixed a bug where mass drivers could be used to crash the server
    • -
    • Various pipe changes and fixes
    • -
    - -
    Wednesday, June 3rd, 2009
    -
      -
    • Death commando deathmatch mode added.
    • -
    - -
    Monday, June 1st, 2009
    -
      -
    • Ghosts can no longer wander from space into the dread blackness that lies beyond.
    • -
    • Those other losers probably did a bunch of other stuff since May 6th but they don't comment their revisions so fuck 'em.
    • -
    - - -
    Wednesday, May 6th, 2009
    -
      -
    • Crematorium
    • -
    • Goon? button makes all your dreams come true.
    • -
    • Restructured medbay
    • -
    -
    Monday, May 4th, 2009
    -
      -
    • Does anyone update this anymore?
    • -
    • New atmos computer promises to make atmos easier
    • -
    • Autolathe
    • -
    • Couple of map changes
    • -
    • Some computer code reorganised.
    • -
    • I'm pretty sure theres a couple things
    • -
    -
    Saturday, April 18th, 2009
    -
      -
    • Weld an open closet (only the normal kind), gayes.
    • -
    • Chaplin has a higher chance of hearing the dead.
    • -
    • New traitor objective
    • -
    • Power traitor objective removed
    • -
    • New job system implemented for latecomers.
    • -
    • Head of Research quits forever and ever, is replaced by Head of Security (who gets his own office)
    • -
    - -
    Fri, April 10, 2009
    -
      -
    • Admins are now notified when the traitor is dead.
    • -
    • Unprison verb (again, for admins).
    • -
    - -
    Wed&Thu, April 8&9, 2009
    -
      -
    • Medical redone, doctors do your jobs! (Tell me what you think of this - compared to the old one)
    • -
    • Clickable tracking for the AI
    • -
    • Only the heads can launch the shuttle early now. Or an emag.
    • -
    - -
    Mon&Tue, April 6&7, 2009
    -
      -
    • Sounds. Turn on your speakers & sound downloads.
    • -
    • Scan something with blood on it detective.
    • -
    - -
    Sunday, April 5, 2009
    -
      -
    • A large icon for the headset, no reason it should be so small.
    • -
    - -
    Saturday, April 4, 2009
    -
      -
    • Emergency closets now spawn an 'emergency gas mask' which are just recolored gas masks, no other difference other than making it obvious where the gas mask came from.
    • -
    - -
    Wednesday, April 1, 2009
    -
      -
    • Constructable rocket launchers: 10 rods, 10 metal, 5 thermite and heated plasma from the prototype.
    • -
    • Emergency closets have randomized contents now.
    • -
    • Fixed a bug where someone who was jobbaned from being Captain could still be picked randomly
    • -
    - -
    Friday, March 27, 2009
    -
      -
    • Fixed a bug where monkeys couldn't be stunned.
    • -
    • Change mode votes before game starts delays the game.
    • -
    - -
    Thursday, March 26, 2009
    -
      -
    • The brig is now pimped out with special new gadgets.
    • -
    • Upgraded the admin traitor menu.
    • -
    - -
    Tuesday, March 24, 2009
    -
      -
    • GALOSHES!
    • -
    • A certain item will now protect you from stun batons, tasers and stungloves when worn.
    • -
    - -
    Monday, March 23, 2009 (EXPERIMENTAL)
    -
      -
    • Say / radio / death talk systems recoded, hopefully improving it.
    • -
    • Announcements of late joiners are now done by the AI if it's alive :-)
    • -
    - -
    Monday, March 23, 2009
    -
      -
    • Random station names.
    • -
    • Changes to the message stylesheet.
    • -
    • Admin messages in OOC will now be colored red.
    • -
    - -
    Saturday, March 21, 2009
    -
      -
    • Added a command to list your medals.
    • -
    • ETA no longer shows when it doesn't matter.
    • -
    • Nerfed the ability to spam shuttle restabalization.
    • -
    • Fixed the 'Ow My Balls!' medal to only apply from brute damage rather than both brute and burn damage.
    • -
    - -
    Thursday, March 19, 2009
    -
      -
    • Job banning.
    • -
    • Genetic Researcher renamed to Geneticist.
    • -
    • Toxins Researcher renamed to Scientist.
    • -
    • Help reformatted.
    • -
    • Fixed a bug where combining bruise packs or ointments resulted in an incorrectly combined amount.
    • -
    • Renamed memory and add memory commands to Notes and Add Note.
    • -
    - -
    Tuesday, March 17, 2009
    -
      -
    • Medals! MEDALS!
    • -
    • Trimmed the excessively long changelog.
    • -
    - -
    Saturday, March 14, 2009
    -
      -
    • Janitor job complete! Report any bugs to adminhelp
    • -
    - -
    Saturday, March 7, 2009
    -
      -
    • Wizard now needs his staff for spells
    • -
    • Be careful with APCs now okay?!
    • -
    • Fixed Memory and made it more efficient in the code
    • -
    • Crowbars now open apcs, not screwdrivers. They do something else entirely
    • -
    • Hackable APCs
    • -
    • When APCs are emagged they now stay unlocked
    • -
    • Re-did a shit tonne of admin stuff
    • -
    • New admin system is pretty much finished
    • -
    • FINALLY backpacks can now be looked in while on the ground.
    • -
    - -
    Tuesday, February 24, 2009
    -
      -
    • Ghosts no longer able to open secret doors
    • -
    • Suicide vests now work as armor
    • -
    • Blood no longer comes out of the guy if you pull him due to lag
    • -
    • Admin panel has been touched up to include html tables
    • -
    • Mines now added, only spawnable right now however
    • -
    • 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
    • -
    • THUNDERDOME!
    • -
    • Several new facial hair options and a bitchin' mohawk
    • -
    • Blood by Culka
    • -
    • Nuke disk now spawns in ALL game modes so that during secret rounds the syndicate now have the element of surprise!
    • -
    - -
    Saturday, February 22, 2009
    -
      -
    • Implemented unstable's "observer" mode
    • -
    • Halerina's wizard mode
    • -
    • Non-interesting stuff
    • -
    • Began addition to the new admin system - right now only available to coders for testing
    • -
    • Admins can now click on the multikeying offenders name to pm them, instead of hunting for them in the pm list
    • -
    • Halerina's chemistry system
    • -
    • You can now deathgasp without being dead, hopefully so people can fake their own deaths.
    • -
    • Redid Medlab
    • -
    • New chemist job
    • -
    - -
    Thursday, February 19, 2009
    -
      -
    • New DNA system. 200th Revision special.
    • -
    • Various bugfixes
    • -
    • Maze
    • -
    - -
    Monday, February 17, 2009
    -
      -
    • Added a new game mode into rotation.
    • -
    • Added an AI satellite
    • -
    • Lockdowns can be disabled with the communications console
    • -
    • Prison shuttle can be called on the comm console, but only if its enabled by admins first
    • -
    • When you slip into space you'll have a 50% chance of going to z=4 instead of z=3
    • -
    - -
    Friday, February 13, 2009
    -
      -
    • Fixed Cakehat
    • -
    • Dead people can now see all turfs, mobs and objs not in their line of sight.
    • -
    • Modified the map slightly
    • -
    • Stungloves can now be "made"
    • -
    • Flashes can now have their bulbs burning out.
    • -
    • Batons can now be turned on and off for different effects. They also now have 10 uses before they need to be recharged.
    • -
    - -
    Tuesday, February 10, 2009
    -
      -
    • Fixed all the autoclose bugs
    • -
    • Due to it being myself and Keelin's 100th revision we have added a super-secret special item. Don't ask because we won't tell! Figure it out!
    • -
    - -
    Sunday, February 8, 2009
    -
      -
    • Modified doors in engineering so that they do not autoclose - Autoclose now handled by a variable
    • -
    • Fixed toxin researcher spawn bug
    • -
    • Changed the "You hear a faint voice" message.
    • -
    • Gave the host new commands to disable admin jumping, admin reviving and admin item spawning
    • -
    • Fixed some airlock autoclose bugs
    • -
    • Changed some doors to not autoclose.
    • -
    • Nerfed the toolbox down.
    • -
    - -
    Friday, February 6, 2009
    -
      -
    • Doors now close after 15 seconds
    • -
    • Fixed some p cool bugs
    • -
    • Cakehat
    • -
    • Added another suit
    • -
    • Walls now take 5 seconds to build
    • -
    • Added sam0rz, thesoldierlljk and kelson's revolution gamemode. Thanks guys!
    • -
    - -
    Thursday, February 5, 2009
    -
      -
    • Fixed a couple of bugs
    • -
    • Improved bar ;)
    • -
    • Beer acts like pills and syringes
    • -
    - -
    Tuesday, February 3, 2009
    -
      -
    • Added 'Make AI' Option for Admins
    • -
    • Added dissolving pills in beer (cyanide and sleeping pills)
    • -
    • Modified engine AGAIN, but personally I love it now
    • -
    - -
    Monday, February 2, 2009
    -
      -
    • Moved bar due to popular demand
    • -
    • Captains room is now a security checkpoint
    • -
    • Assistants now have access to maint tunnels again
    • -
    • Courtroom
    • -
    • Engine has been redone slightly to make it easier to load
    • -
    • Nerfed beer a lot more
    • -
    - -
    Saturday, January 31, 2009
    -
      -
    • Added a bartender job + Bar
    • -
    • Captains panic room
    • -
    • Voice changer traitor item
    • -
    • Bartender suit
    • -
    • Made taking a table apart take longer
    • -
    • Balanced beer a bit more.
    • -
    • Assistants can no longer open external air locks and maint tunnels, sorry guys. Get a job you bums.
    • -
    • Engineers CAN access external air locks and maint tunnels.
    • -
    • Fixed traitor AI bug
    • -
    - -
    Thursday, January 29, 2009
    -
      -
    • Added traitor menu for admins - The ability to turn people into "traitors" as well as keep track of their objectives.
    • -
    • Implemented Keelins revive system - Primary Admins can now revive people.
    • -
    • Moved and redid security to prevent clusterfucks and everyone just crowding around security.
    • -
    • Redid the brig to make it bigger and so that people can break others more easily out since it isn't right in security.
    • -
    • Moved and redid captains quarters/heads quarters. Captains made much smaller and heads is now more of a meeting room.
    • -
    • Added Stungloves and an axe - right now only admin spawnable.
    • -
    • Implemented Persh's adminjump back in - admins can now jump to set locations.
    • -
    • Added a feature that if someone logs off their character moves around and says things - Change what they say from the config/names/loggedsay.txt file.
    • -
    • Added in adminwho verb - tells the user if there are any admins on and who they are.
    • -
    - -
    Saturday, January 10, 2009
    -
      -
    • Freedom implant has been changed so that it will have a random emote associated with it to activate it rather than always chuckle.
    • -
    • There is now a pinpointer tool for use in Nuclear Emergency. It works similar to the existing locator, in that it will detect the presence of nuclear disks and in what direction it is.
    • -
    • The nuke being detonated in Nuclear Emergency should now properly end the game.
    • -
    • Spacesuits now cause you to move slower when not in space.
    • -
    • Syndicate in Nuclear Emergency now have syndicate-themed spacesuits.
    • -
    • Blob mode should properly end now.
    • -
    - -
    Wednesday, January 7, 2009
    -
      -
    • Syndicate Uplink has been changed up, allowing traitor more freedom in his ability to be... traitorus.
    • -
    • Syndicate Uplink can now spawn a ammo-357, syndicate card, energy sword, or timer bomb.
    • -
    • Fixed an issue where Syndicate Uplink looked different than a normal radio.
    • -
    - -
    Monday, January 5, 2009
    -
      -
    • You can choose to be a nudist now.
    • -
    • Facial hair!
    • -
    • Added constructable flamethrowers.
    • -
    • Redid internal naming scheme for human/uniform sprites.
    • -
    • Helmet visors are now translucent.
    • -
    • Held item graphics corrected for basically everything, internally only uses one dmi file instead of two.
    • -
    • Config settings reorganized for.. organization.
    • -
    • 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.
    • -
    + +

    01 April 2015

    +

    ACCount updated:

    +
      +
    • You can now replace test range firing pins with any other pin.
    • +
    • The plasma cutter is now a gun that comes in the mining vending machine. Use it to mine fast but expensively.
    • +
    • It's also cheaper in RnD, and there's an advanced version of it there too. Yay!
    • +
    • Ripleys and Firefighters have been buffed significantly. Go wild.
    • +
    • Precious mesons are cheaper in RnD.
    • +
    • Now you can mine bluespace crystals. They are extremely rare.
    • +
    • You can make remote bombs out of gibtonite. Figure out how.
    • +
    • Gibtonite is a bit less stable. Do not hit it with anything heavy.
    • +
    +

    Fayrik updated:

    +
      +
    • Added a bowman headset for death squads and ERTs.
    • +
    • Deathsquad radio channel is now called the Centcom radio channel.
    • +
    • Fixed the admin buttons not spawning ERT Medic gear properly.
    • +
    • Expanded Emergency Shuttle dock to allow for more round end griff.
    • +
    • All 7 ERT members now spawn geared, not just the first 4.
    • +
    • Spawning an ERT or Deathsquad no longer stops a second ERT or Deathsquad from being spawned.
    • +
    • Pulse rifles now have 80 shots, not 40.
    • +
    • Deathsquads now use loyalty pinned Pulse rifles.
    • +
    +

    Gun Hog updated:

    +
      +
    • NTSL has been updated! It can now read and modify verbs (says, yells, asks)! You can set your own using $say, $yell, $ask, and $exclaim variables in your scripts.
    • +
    • NTSL can now also modify the font, italics, and bolding of radio messages in four ways! In a script, place $loud, $wacky, $emphasis, and/or $robot in a vector to $filters.
    • +
    +

    Jordie0608 updated:

    +
      +
    • The admin's old player panel has been removed and the new one has taken it's name.
    • +
    +

    NikNakFlak updated:

    +
      +
    • Adds the ability to shave corgis.
    • +
    +

    Sawu updated:

    +
      +
    • Spraycans for Revheads: instant use crayons that can be used on walls.
    • +
    • Spraycans can be used as ghetto pepper spray and leave their target with colored faces that can be removed with space cleaner.
    • +
    +

    Xhuis updated:

    +
      +
    • Area ambience and ship ambience are now separate toggles. If you want one type of ambience but not the other, you only need to switch off the type you don't want.
    • +
    • Added cigar cases. They come in three flavors and can be bought from cigarette machines.
    • +
    + +

    30 March 2015

    +

    AnturK updated:

    +
      +
    • Added new wizard spell : Lightning Bolt
    • +
    +

    Dannno updated:

    +
      +
    • Added a hammer and gavel. Court is now in session.
    • +
    +

    Iamgoofball updated:

    +
      +
    • You can now *flip.
    • +
    • Objects now spin when thrown. Please report any oddities.
    • +
    +

    RemieRichards updated:

    +
      +
    • Monkeys can now wear ANY mask, not just ones they had specific icons for.
    • +
    • Monkeys can now wear HATS, That's right, Monkey Hats!
    • +
    +

    Szunti updated:

    +
      +
    • Mining mobs vision adapted to darkness of the asteroids.
    • +
    +

    phil235 updated:

    +
      +
    • All slimes are now simple animals instead of carbon life forms.
    • +
    • Remove crit status from brain and slimes.
    • +
    • Simple animal aliens can now see in the dark like regular aliens.
    • +
    +

    pudl updated:

    +
      +
    • The detective's forensic scanner has been resprited.
    • +
    • So has the cargo tagger.
    • +
    • And the RPED.
    • +
    +

    tedward1337 updated:

    +
      +
    • Admins now have a button to use Bluespace Artillery at their will.
    • +
    +

    xxalpha updated:

    +
      +
    • You will no longer be slowed down by anything if you use a jetpack in zero gravity.
    • +
    • Engineering hardsuits come with an inbuilt jetpack. Requires an internals tank in suit storage and is slower than a normal jetpack.
    • +
    + +

    25 March 2015

    +

    AnturK updated:

    +
      +
    • Added an arrow graffiti, made arrow and body graffiti face the same way as the user
    • +
    • New changeling ability : Last Resort : Explode and infect corpses if the situation looks grim
    • +
    +

    Fayrik updated:

    +
      +
    • Deleted the toy crossbow that wasn't a gun, but flung projectiles like a gun. Why was that even a thing?
    • +
    • Added an abstract new type of reusable ammo.
    • +
    • Added three new foam force guns and a foam force crossbow, all of which take the new foam dart ammo.
    • +
    • Added foam force dart boxes to the autolathe, and two crates orderable from cargo containing the new guns.
    • +
    • Added two new donksoft guns, the syndicate's own brand of Foam Force. Available in all good uplinks!
    • +
    • New crossbow can be won as an arcade prize.
    • +
    • All kinds of ammo containers can now be used to rapidly collect live ammunition on the ground.
    • +
    • Speedloaders and traditional ammo boxes can now be restocked.
    • +
    • Security bots now react to being shot.
    • +
    +

    MrPerson updated:

    +
      +
    • Added a preference toggle for hearing instruments play as suggested by PKPenguin321.
    • +
    +

    Pennwick updated:

    +
      +
    • Added a buildable Chem Master, board is in Circuit Imprinter.
    • +
    +

    Wjohnston updated:

    +
      +
    • Finally fixed the gulag shuttle missing a redemption console.
    • +
    + +

    24 March 2015

    +

    Cheridan updated:

    +
      +
    • Adds pet collars. Use them to rename pets; Can also be worn if you're a weirdo.
    • +
    • Adds the matyr objective to be dead at the round's end. You can get this objective if you have no others that would need you to survive.
    • +
    +

    Dannno updated:

    +
      +
    • GAR glasses return. Yes, I got permission. Just who the hell do you think I am?
    • +
    +

    Incoming5643 updated:

    +
      +
    • Summon Events has been reworked to be a bit less manic.
    • +
    • Summon Events will turn off if the wizard and all apprentices die. Any lingering effects are not reversed however.
    • +
    • Improving Summon Events will reduce the average time between events, but not the minimum time between events.
    • +
    • Departmental Uprising has been made admin only for being an RP heavy event that creates antags in an enviroment that doesn't really support that.
    • +
    +

    Mandurrrh updated:

    +
      +
    • Added a cyborg upgrade module for the satchel of holding.
    • +
    +

    Miauw updated:

    +
      +
    • Added a fancy white dress and a jester outfit. Sprites by Nienhaus.
    • +
    +

    Steelpoint, RemieRichards, and Gun Hog updated:

    +
      +
    • Nanotrasen Security has authorized modifications to the standard issue helmets for officers. These helmets are now issued with a mounted camera, automatically synced to your assigned station's camera network. In addition, the helmets also include mounting points for the Seclite model of flashlights, found in your station's security vendors.
    • +
    • Nanotrasen Security helmets are designed for easy repairs in the field. Officers may remove their Seclite attachment with any screwdriver, and the camera's assembly may be pried off with a crowbar. The assembly is also compatible with analyzer upgrades for scanning through the station's structure, and EMP shielding is possible by applying a sheet of plasma.
    • +
    + +

    22 March 2015

    +

    Iamgoofball updated:

    +
      +
    • Fixes Morphine not knocking you out.
    • +
    • Hotline no longer exists. Poppies now have Saline-Glucose Solution.
    • +
    • Muriatic Acid, Caustic Soda, and Hydrogen Chloride have been removed, along with the secondary meth recipe. The original recipe still works.
    • +
    • Foam now produces more bang for your buck when mixed. Your foam grenades should be larger now to account for the slowdown.
    • +
    • Adds Stabilizing Agent. This chemical will prevent the effects of certain reactions from taking place in the container it is in, such as Smoke Powder and Flash Powder, allowing you to get the raw forms of the powders for heating up later.
    • +
    • Smoke Powder and Flash Powder can now be mixed along with Stabilizing Agent in order to produce a powder version of the effects. You can then heat these powders to 374K to get the effects.
    • +
    • Mixing them without Stabilizing Agent gives the default effects.
    • +
    • Adds Sonic Powder, a chemical that deafens and stuns within 5 tiles of the reaction. It also follows the reaction rules of the other 2 powders.
    • +
    • Liquid Dark Matter and Sorium also now work like the powders do.
    • +
    • CLF3 now has a higher chance of making plating tiles, and the burn damage caused by it scales based on your fire stacks.
    • +
    • Adds Pyrosium. This reagent heats up mobs by 30 degrees every 3 seconds if it has oxygen to react with. Useful for when you want a delayed mix inside of someone.
    • +
    • Adds Cryostylane. This reagent does the opposite of Pyrosium, but it still requires oxygen to react with.
    • +
    • Adds Phlogiston. This reagent ignites you and gives you a single fire stack every 3 seconds. Burn damage from this chemical scales up with the fire stacks you have. Counter this with literally any chemical that purges other chems.
    • +
    • Smoke now transfers reagents to the mob, and applies touch reactions on them. This means smoke can run out of reagents, no more infinite acid smoke. It also only works on mobs, use the new Reagent Foam(tm) for your hellfoam needs. I suggest a CLF3 Fluoroacid Black Powder mix.
    • +
    • Added a derelict medibot to the code, will place a few on the derelict when this PR is merged as to prevent mapping conflicts.
    • +
    • Adds Initropidril. 33% chance to hit with 5-25 TOX damage every 3 seconds, and a 5-10% chance to either stun, cause lots of oxygen damage, or cause your heart to stop. Get it from the traitor Poison Kit.
    • +
    • Adds Pancuronium. Paralyses you after 30 seconds, with a 7% chance to cause 3-5 loss of breath. Get it from the traitor Poison Kit.
    • +
    • Adds Sodium Thiopental. Knocks you out after 30 seconds, and destroys your stamina. Get it from the traitor Poison Kit.
    • +
    • Adds Sulfonal. +1 TOX per 3 seconds, knocks you out in 66 seconds. Mix it with Acetone, Diethylamine, and Sulfur.
    • +
    • Adds Amantin. On the last second it is in you, it hits you with a stack of TOX damage based on how long it's been in you. Get it from the traitor Poison Kit.
    • +
    • Adds Lipolicide. +1 TOX unless you have nutriment in you. Mix it with Mercury, Diethylamine, and Ephedrine.
    • +
    • Adds Coiine. +2 TOX and +5 loss of breath every 3 seconds. Get it from the traitor Poison Kit.
    • +
    • Adds Curare. +1 TOX, +1 OXY, paralyzes after 33 seconds. Get it from the traitor Poison Kit.
    • +
    • Adds a reagent_deleted() proc to reagents for effects upon the last time it processes in you, like with Amantin.
    • +
    • Neurotoxin required temperature for mixing has been set to 674K, it was 370K for some reason.
    • +
    +

    xxalpha updated:

    +
      +
    • Added Cybernetic Implants: Security HUD, Medical HUD, X-Ray, Thermals, Anti-Drop, Anti-Stun. All implants are researchable and producible by R&D and Robotics.
    • +
    + +

    21 March 2015

    +

    Chocobro updated:

    +
      +
    • Checkered skirts can be adjusted to be worn shorter.
    • +
    +

    Incoming5643 updated:

    +
      +
    • Player controller uplifted mobs will be attacked by gold core mobs of different species.
    • +
    +

    Jordie0608 updated:

    +
      +
    • The backup shuttle will no longer be called if the emergency shuttle is coming.
    • +
    +

    MMMiracles updated:

    +
      +
    • Adds 3 new bear-based foods.
    • +
    • Beary Pie -1 Plain Pie, 1 berry, 1 bear steak
    • +
    • Filet Migrawr - 5u of Manlydorf, 1 bear steak, 1 lighter(not used in crafting)
    • +
    • Bearger - 1 bun, 1 bear steak
    • +
    +

    Phil235 updated:

    +
      +
    • Silicons are no longer blinded by welding.
    • +
    +

    Xhuis updated:

    +
      +
    • A new software update has given the Orion Trail game a cheat code menu. While you can't access this normally (that's for a later software update), maybe an emag could do it...?
    • +
    +

    Zelacks updated:

    +
      +
    • The chemical implant action button should now correctly inject all chemicals when pressed.
    • +
    +

    pudl updated:

    +
      +
    • Adds normal security headsets to security lockers.
    • +
    +

    xxalpha updated:

    +
      +
    • Fixed cables on catwalks being destroyed when creating plating floor.
    • +
    • Portable machines can be mounted on any turf that could hold a cable.
    • +
    + +

    19 March 2015

    +

    Dannno updated:

    +
      +
    • Adds a few cosmetic glasses to the autodrobe and clothing vendors.
    • +
    +

    Gun Hog updated:

    +
      +
    • Explosion relics will now destroy themselves in their own explosion.
    • +
    • The Experimentor can no longer re-roll the function of an already scanned relic.
    • +
    +

    Incoming5643 updated:

    +
      +
    • Ghosts are now asked if they want to become a sentient slime.
    • +
    +

    JJRcop updated:

    +
      +
    • Adds the :rollie: and :ambrosia: emojis.
    • +
    +

    MMMiracles updated:

    +
      +
    • ERT suits now use helmet toggling like hardsuits.
    • +
    +

    Menshin updated:

    +
      +
    • Fixed mechs ballistic guns not firing bullets.
    • +
    +

    Xhuis updated:

    +
      +
    • Allows alt-clicking to adjust breath masks, flip caps, and unlock/lock closets.
    • +
    +

    xxalpha updated:

    +
      +
    • Fixed jetpack trail animation.
    • +
    + +

    17 March 2015

    +

    CandyClownTG updated:

    +
      +
    • Syndicate cigarettes' non-healing Doctor's Delight replaced with Omnizine.
    • +
    +

    Fayrik updated:

    +
      +
    • Expanded the Centcom area for better station-Centcom interaction.
    • +
    +

    Iamgoofball updated:

    +
      +
    • Acid blobs are less likely to melt equipment.
    • +
    +

    MMMiracles updated:

    +
      +
    • Adds the ability to spike bears on a meatspike for their pelt. Yields 5 meat instead of the usual 3 from a knife.
    • +
    +

    Thunder12345 updated:

    +
      +
    • Two new shotgun shells. Ion shell, shotgun version of ion rifle, built with 1 x techshell, 1 x ultra microlaser, 1 x ansible crystal.
    • +
    • Laser slug, regular laser shot in a shotgun shell, build with 1 x techshell, 1 x high power microlaser, 1 x advanced capacitor.
    • +
    • Improvised shotgun shells can now be constructed with 1 x grenade casing, 1 x metal sheet, 1 x cable, 10 units welding fuel. Can be packed with a further 5 units of gunpowder to turn it into a potentially lethal diceroll.
    • +
    • FRAG-12 shotgun shells are no longer duds, now explosive.
    • +
    +

    phil235 updated:

    +
      +
    • Makes the message when you're attacked slightly bigger for better visibility.
    • +
    + +

    15 March 2015

    +

    Ahammer18 updated:

    +
      +
    • Adds ass photocopying for drones
    • +
    +

    Gun Hog updated:

    +
      +
    • Nanotrasen has approved distribution of Loyalty Implant Firing Pin designs. They can be fabricated with sufficient research into weapons technology. If inserted into a firearm, it will only fire upon successful interface with a user's Loyalty Implant.
    • +
    +

    Incoming5643 updated:

    +
      +
    • Utilizing a new magic mirror found in the den, wizards can now customize their appearance to a high degree before descending upon the station.
    • +
    +

    Miauw updated:

    +
      +
    • Firing delay for tasers has been shortened.
    • +
    +

    RemieRichards updated:

    +
      +
    • Beginning major rework and refactor of messy Ninja code.
    • +
    • Roleplay based, kill deathsquad and kill alien queen objectives removed.
    • +
    • Kamikaze mode removed.
    • +
    • AIs and pAIs can no longer be integrated into a ninja suit.
    • +
    • Energy blade power replaced by an energy katana that can be dropped but is more deadly.
    • +
    • Energy katana can emag any object it hits.
    • +
    +

    phil235 updated:

    +
      +
    • Bookbags have a new sprite and can hold bibles.
    • +
    • Adds egg yolk reagent. You can break eggs in open reagent containers or blend them to get egg yolk.
    • +
    • Changes how doughs are made. 10water+15flour chem reaction for dough. 15flour+15eggyolk+5sugar for cake batter (or alternatively soymilk instead of the eggyolk for vegans).
    • +
    • Change customizable snack max volume to 60 and buffs nutriment amount in doughs.
    • +
    • Doors can damage mechs by crushing them now.
    • +
    • The tablecrafting window now also shows partial recipes in grey, if there's some of the things required for the recipe on the table. Recipe requirements are now also shown next to the names of recipes listed in the window.
    • +
    + +

    11 March 2015

    +

    MMMiracles updated:

    +
      +
    • Adds a new vending machine, the Liberation Station. Consult your local patriot for more details.
    • +
    • Adds a patriotic jumpsuit and freedom sheets. Consult your local patriot for more details.
    • +
    +

    Miauw updated:

    +
      +
    • Added a toggle for ghosts that allows them to hear radio chatter without having to hover near intercoms/over people with headsets.
    • +
    + +

    10 March 2015

    +

    Ahammer18 updated:

    +
      +
    • Adds the Slimecake and Slimecake slice.
    • +
    +

    AnturK updated:

    +
      +
    • Non-player Alien Queens/Drones now spread weeds. Can also lay eggs when enabled.
    • +
    +

    Incoming5643 updated:

    +
      +
    • Nanotrasen scientists have recently reported mutations within the pink family line of slimes. Station scientists are encouraged to investigate.
    • +
    +

    Paprika updated:

    +
      +
    • Reworked reskinning and renaming guns, and added the ability to reskin the bartender's shotgun. Click it with an empty active hand to reskin. Warning, you can only do this once! Rename by hitting it with a pen. This also works with miner shotguns now.
    • +
    +

    RemieRichards updated:

    +
      +
    • Embedding from explosions has been tweaked, they will always throw objects fast enough to get embedded if they can.
    • +
    • Damage taken when embedded spears and throwing stars fall out has been increased.
    • +
    • Damage dealt by objects getting embedded has been decreased.
    • +
    +

    Sometinyprick updated:

    +
      +
    • The Horsemask spell has now been altered, instead of just a horse mask it will now choose between three animal masks including the horse mask.
    • +
    +

    Xhuis updated:

    +
      +
    • You can now burn papers using lighters, welders, or matches. Useful for secret messages.
    • +
    +

    phil235 updated:

    +
      +
    • Airlocks with their safety on no longer closes on dense objects (like mechs or tables).
    • +
    • Aliens, slimes, monkeys and ventcrawler mobs can now climb into disposal. Cyborgs and very large mobs can no longer climb into it.
    • +
    • Stuffing another mob in a disposal unit is now only done via grabbing.
    • +
    • Coffee now causes jittering only when you overdose on it.
    • +
    • Turrets now target occupied mechs and don't target drones.
    • +
    + +

    08 March 2015

    +

    Dannno updated:

    +
      +
    • Added more barsigns, sprites by yours truly.
    • +
    +

    Ikarrus updated:

    +
      +
    • Gang mode has been reworked to functionality without some of it's features.
    • +
    • Gang membership visibility, conversion pens and weapons are removed until fixed.
    • +
    • Gang bosses have been given uplinks to use in the meantime.
    • +
    • Chance of deconversion from repeated head trauma has been increased.
    • +
    +

    Incoming5643 updated:

    +
      +
    • The skeleton and zombie hordes have been quelled, at least for the time being.
    • +
    +

    Mandurrrh updated:

    +
      +
    • Added the ability to stop table climbers by clicking the table if present.
    • +
    +

    Paprika updated:

    +
      +
    • Labcoats and uniforms no longer use action buttons and object verbs to adjust their aesthetic style. Alt click them to adjust.
    • +
    • Alt click a PDA with an ID inside to eject the ID.
    • +
    • Renamed 'remove ID' verb to 'eject ID' so it's not immediately next to 'remove pen'.
    • +
    • Rebalanced the flash protection of thermal scanners. Syndicate thermals have the same flash weakness as the meson scanners they come disguised as.
    • +
    +

    Xhuis updated:

    +
      +
    • Adds the Adminbus and Coderbus bar signs.
    • +
    • Added a mining satchel of holding to R&D that can hold an infinite amount of ores. It requires gold and uranium, in addition to a decently high bluespace and materials research.
    • +
    +

    phil235 updated:

    +
      +
    • Harvesting meat from dead simple animals now takes time, has a sound, and can be done with any sharp weapon.
    • +
    +

    pudl updated:

    +
      +
    • Updated the sprite for Fire extinguishers.
    • +
    +

    xxalpha updated:

    +
      +
    • Disposable lighters now come in more colors of the rainbow.
    • +
    + +

    05 March 2015

    +

    Jordie0608 updated:

    +
      +
    • Server hosts can set a config option to make an unseen changelog pop up on connection.
    • +
    +

    MrPerson updated:

    +
      +
    • Expanded the on-screen alerts you get on the top-right of your screen. You can shift-click them to get a description of what's wrong and maybe how to fix it.
    • +
    • Getting buckled to something will show an alert of what you're buckled to. If you're not handcuffed, you can click the alert to unbuckle.
    • +
    +

    RemieRichards updated:

    +
      +
    • Added Necromantic Stones as a buyable item for wizards
    • +
    • Necromantic Stones can cause up to 3 people to rise up as Skeleton Thralls bound to the wielder of the stone
    • +
    • Skeleton Thralls have a 33% Chance to drop all their gear on the floor and autoequip a more fitting thematic uniform
    • +
    • Allows the blob to reroll it's chemical for a cost.
    • +
    +

    phil235 updated:

    +
      +
    • Adds a lot of new plants to botany (red beet, parsnip, snap corn, blumpkin, rice, oat, vanilla, steel cap, mimana, blue cherries, holy melon, geranium, lily, sweet potato) and two new reagents (vanilla, rice).
    • +
    • Fixes taser stun duration being longer due to jitter animation.
    • +
    + +

    03 March 2015

    +

    Delimusca updated:

    +
      +
    • Improvised heating! use lighters or other heat sources to heat beakers, bottles, etc.
    • +
    +

    Gun Hog updated:

    +
      +
    • We have purged the xenomicrobes contamination in the E.X.P.E.R.I-MENTOR using sulfuric acid. Take care not to be exposed should it leak!
    • +
    +

    Iamgoofball updated:

    +
      +
    • Colorful reagent can be washed off with water now.
    • +
    • Oxygen blob deals breath loss damage.
    • +
    • Radioactive blobs irradiate for more.
    • +
    +

    Ikarrus updated:

    +
      +
    • Antagonist roles are now restricted by player client age.
    • +
    +

    Jordie0608 updated:

    +
      +
    • The server's current local time is now displayed in status panel in ISO date format (YYYY-MM-DD hh:mm)
    • +
    +

    Mandurrrh updated:

    +
      +
    • Added the ability to see pda messages as a ghost with GHOSTWHISPER toggled on.
    • +
    • Removed the degrees symbol from Kelvin units on atmos meters because not gramatically correct
    • +
    +

    RemieRichards updated:

    +
      +
    • Drones now see either Static, Black icons or Roguelike style lettering instead of actual mob icons
    • +
    • Icons for the above, from VG's SkowronX
    • +
    • Many icon procs for the above, from VG's ComicIronic
    • +
    • Drones moved into their own folder
    • +
    • Drone.dm replaced with seperate files for each functionality
    • +
    • Drones now have 2 skins to choose from, Maintenance Drone (Current drones) and Repair Drone (A modified VG/Bay sprite)
    • +
    • Much more support for alternate skins on drones
    • +
    +

    Xhuis updated:

    +
      +
    • Added four new emoji: :1997:, :rune:, :blob:, and :onisoma:.
    • +
    +

    xxalpha updated:

    +
      +
    • Added a surgery table and tools to the Nuke Ops ship.
    • +
    • Added Engineering Scanner Goggles to Engivend, Engineering Secure Closets and Research.
    • +
    • Doubled T-ray scanner range.
    • +
    + +

    01 March 2015

    +

    Dannno updated:

    +
      +
    • Resprited all owl items. Wings are now a seperate toggleable suit item.
    • +
    • Added The Griffin costume, arch nemesis of The Owl. Found in the autodrobe.
    • +
    • Added admin-only Owl hardsuit. Only for the most vengeful souls.
    • +
    • Added Owl and Griffin merchandise; The Nest barsign, Owl/Griffin toys and posters.
    • +
    +

    Iamgoofball updated:

    +
      +
    • Fixes the recipe for meth.
    • +
    • Fixes sorium blobs flinging themselves.
    • +
    +

    Incoming5643 updated:

    +
      +
    • On servers where malfunction, wizard, and blob rounds do not end with the death of the primary antagonist, new antagonists from traitor and changeling derivative modes will now sometimes spawn. This depends on the state of the station, the state of the crew, and the server's gamemode probabilities. Server owners should consider revising their configuration choices
    • +
    • If you would like to opt out of this midround chance, a new toggle to disable it can be found in your preferences
    • +
    +

    Mandurrh updated:

    +
      +
    • The barsign can be emagged and EMP'd; EMP'd signs can be repaired with a screwdriver and cables.
    • +
    +

    Menshin updated:

    +
      +
    • Fixed the protolathe not requiring displayed amount of materials to make items.
    • +
    +

    MrStonedOne updated:

    +
      +
    • Adds a Panic Bunker!
    • +
    • This will prevent any player who has never connected before from connecting. (Admins are exempt)
    • +
    • Can be enabled per-round by any admin with +SERVER or for longer periods via the config.
    • +
    • Also adds some other config options relating to new joins, server operators should consult their configuration file for more details.
    • +
    • Fixes toggle darkness vision hiding other ghosts.
    • +
    • Admins fucking around with ghost icon and icon states in VV are going to want to change the icon and icon state of the ghostimage var of the ghost to change the image shown to ghosts who have darkness disabled. doing this via mass edit is not yet supported.
    • +
    • New ghost verb, toggle ghost vision. Switches the ghost's invisibility vision between that of a ghost and that of a human. So ghosts can hide other ghosts and in general get the old behaviour of toggle darkness.
    • +
    +

    Paprika updated:

    +
      +
    • Messages with two exclamation marks will be yelled in bold.
    • +
    +

    Phil235 updated:

    +
      +
    • Cultists can't summon narsie until their sacrifice objective is complete.
    • +
    +

    Razharas updated:

    +
      +
    • Vines now can grow on any tiles that is not dense, including space, shuttles, centcomm tiles and so on.
    • +
    • Added 'Bluespace' mutation to vines, makes them be able to grow through absolutely everything.
    • +
    • Added 'Space Proofing' mutation to vines, after they grow if the tile under them is space it will become special vinetile, which is just resprited regular floor, if the vine on the vinetile dies the vineturf changes back to space.
    • +
    • Made vines spreading speed depend on the seed's production, can be both slower and faster than current.
    • +
    • Made vines mutation chance be 1/10th of the potency of the seed it is spawned from.
    • +
    • Special chemicals added to vine seeds durning their growth can increase/decrease their potency and productivity.
    • +
    • Special chemicals now can remove good, bad or neutral mutations from vine seeds while they are growing, cultivating actually helpful vines is now possible.
    • +
    • Plant analyzers now show the vine seeds mutations.
    • +
    • Buffed numbers in some of the more useless mutations.
    • +
    +

    Steelpoint updated:

    +
      +
    • Reworked and expanded areas of the derelict station. Featuring a repairable gravity generator, turret filled computer core and functional solars.
    • +
    +

    Vekter updated:

    +
      +
    • Chemists, Geneticists, Virologists, Scientists, and Botanists will now spawn with alternative backpacks and satchels in their lockers. Try them out!
    • +
    + +

    25 February 2015

    +

    Cheridan updated:

    +
      +
    • Foam now carries reagents, similarly to smoke. Have fun with that.
    • +
    +

    Dannno updated:

    +
      +
    • Altered the sprite for security hardsuits. The old sprite is now a HoS specific hardsuit.
    • +
    +

    Delimusca updated:

    +
      +
    • Turret's guns replaced by a heavy energy cannon.
    • +
    • Firing a heavy weapon sindlehandedly can make it recoil out of your hands.
    • +
    +

    Gun Hog updated:

    +
      +
    • Nanotrasen has released new design specifications for the prototype combination of standard night-vision equipment and Optical Meson Scanners. We believe that this will address the concerns many Shaft Miners have concerning visiblity in a potentially unsafe environment.
    • +
    • Fixed malf AI's turret upgrade power not working.
    • +
    +

    Iamgoofball updated:

    +
      +
    • You can now go into hyperglycaemic shock from having over 200u of Sugar in your body at once. Treat it with Insulin.
    • +
    • Insulin has been added. Use it to treat hyperglycaemic shock. You can get it from medical vendors and the Cargo medicine supplies crate.
    • +
    • Medvendor contents have been reduced from medical having everything they need at roundstart level, and toxin bottles are now back in the vendor.
    • +
    • Medical Analyzers now have 2 modes, Medical Scan and Chemical Scan. You can swap between modes by clicking on it in hand.
    • +
    • Medical scan is default behavior. Chemical scan shows all the reagents inside the mob at the time, along with any addictions the mob has. It will show if a reagent is overdosing.
    • +
    • Tobacco and Space Tobacco have Nicotine in them now.
    • +
    • Adds Methamphetamine to the game. Mix it with Ephedrine, Iodine, Phosphorous, and Hydrogen at 374K.
    • +
    • Or, look around in Maintenance for Muriatic Acid, Caustic Soda, and Hydrogen Chloride. Recipes are also available for these.
    • +
    • Adds Saltpetre. Mix it with Potassium, Nitrogen, and Oxygen.
    • +
    • Adds Bath Salts, mix it with Bad Food, Saltpetre, Nutriment, Space Cleaner, Universal Enzyme, Tea, and Mercury at 374K.
    • +
    • Adds Aranesp. Mix it with Epinephrine, Atropine, and Morphine.
    • +
    • Adds Hotline. Get it from Poppy plants.
    • +
    • Strange Reagent revival was changed. It now won't gib but won't do anything above a 100 BRUTE or BURN threshold.
    • +
    • Carpet now applies carpet tiles to whatever flooring it hits. Mix it with Space Drugs and Blood.
    • +
    • Colorful Reagent colors have been improved drastically and now are more varied and nicer looking.
    • +
    • Corn Starch has been added. Get it from juicing Corn.
    • +
    • Corn Syrup has been added. Mix it with Corn Starch and S-Acid.
    • +
    • Corgium has been added. Mix it with Nutriment, Colorful Reagent, Strange Reagent, and Blood at 374K.
    • +
    • Adds Quantum Hair Dye. Mix it with Colorful Reagent, Radium, and Space Drugs.
    • +
    • Adds Barber's Aid. Mix it with Carpet, Radium, and Space Drugs.
    • +
    • Adds Concentrated Barber's Aid. Mix it with Barber's Aid and Unstable Mutagen.
    • +
    • Re-adds Chlorine Trifluoride. Mix it with Chlorine and Fluorine at 424K.
    • +
    • Adds Black Powder. Mix it with Saltpetre, Charcoal, and Sulfur. Ignite it for an explosion at 474K
    • +
    • Finally nerfs Salglu Solution. It's no longer tricord 2.0.
    • +
    • Salt recipe is now Water + Sodium + Chlorine due to problems with recipe mixing.
    • +
    +

    Incoming5643 updated:

    +
      +
    • A new event has been added to the wizards summon events spell that gives the game a distictively more roleplaying flair.
    • +
    • Optional population cap functionality has been added to the game. By default all caps are disabled. Server owners should refer to config.txt to see their list of options.
    • +
    • Medical borgs now have access to a deployable onboard roller bed. Should the bed become lost, any roller bed may be used in its place.
    • +
    +

    Mandurrh updated:

    +
      +
    • Added interchangeable bar signs
    • +
    • Added bays fountain machines for the bar. Soda and Beer. Allowing bartenders to have easier access to mix drinks and making more to make their job a little less boring
    • +
    • Added color tiles to the light up floor tiles.
    • +
    • Added metal, glass, and cable to bar back room at round start for bartender to make colored light dance floors.
    • +
    • Fixes clown cuffing both mobs and two pairs of cuffs appearing.
    • +
    • Fixes clown not being able to use his stamp as antag so no meta.
    • +
    • Fixes sleepypen bug. Instead of only dispensing 50u it dispenses the full 55u.
    • +
    • Fixed silicons not being able to pass through holotape.
    • +
    +

    Menshin updated:

    +
      +
    • Getting into regenerative statis now puts the changeling into unconscious state.
    • +
    • Fixed changeling 'Revive' not working.
    • +
    +

    Paprika updated:

    +
      +
    • Added an assistant cap, unlimited by default.
    • +
    • Batons now slowly lose power when left on.
    • +
    • Batons, flashbangs and handcuffs can be seen when stored in a belt.
    • +
    • Computers now emit light when they're on or bluescreened.
    • +
    • Added hotkeys for OOC and custom emotes. Press O and M when in hotkey mode. Remember not to ick in ock!
    • +
    • Added megaphones for the HoS, HoP, and QM.
    • +
    • Goliath tentacles no longer stun you if you cross them. They will only stun you if you don't move away from them in time. They can do up to 15 damage now, in addition to stunning you.
    • +
    • Changed a lot of mining gear and prices. The resonator can now have up to 3 fields active at once, but the fields need to detonate before they crush rocks. Tweak the time before the fields detonate with a screwdriver and upgrade the amount of fields at once with sheets of diamond.
    • +
    • Overhauled straight mining tools. The sonic jackhammer is now the wall-crushing tool, the diamond drill simply mines really fast. Borgs can now get upgraded with the diamond mining tool with only a single sheet of diamond and an upgrade module, they don't need illegal tech modules.
    • +
    • Mining drills and the sonic jackhammer now draw power when they drill down mineral walls. They can be recharged using any type of weapon recharger or by replacing the cell using a screwdriver on them.
    • +
    • Space now emits a dim light to adjacent tiles.
    • +
    • Syndicate shotguns now start with buckshot instead of stunslugs.
    • +
    • Fixed welding tools using fuel when being switched on.
    • +
    • Added a firing delay between shooting electrodes.
    • +
    • Changed the stun revolver from a high-capacity taser to a disabler with extra capacity.
    • +
    • Added a unique stun pistol for the head of security. It is a double capacity taser with no shot delay and a loyalty pin, though it lacks a disable mode.
    • +
    +

    RandomMarine updated:

    +
      +
    • New brute treatment kit crate for cargo.
    • +
    +

    RemieRichards updated:

    +
      +
    • Explosions will now blow (throw) items away from the epicenter
    • +
    • Sharp items can now embedd themselves in a human's limbs
    • +
    • Embedded items have a chance to do some damage (based on w_class) each life() call
    • +
    • Embedded items have a chance to fall out doing some more damage, but removing the object
    • +
    • Adds a surgery to remove Embdedded objects
    • +
    • Adds throwing stars as an uplink item (100% chance to embedd)
    • +
    • Items placed on tables now center to exactly where you clicked.
    • +
    +

    Steelpoint updated:

    +
      +
    • SS13's Head of Security has received a new attempted 1:1 recreation of a Old Earth weapon, the Captain's Antique Laser Gun.
    • +
    • This gun features three firing modes, Tase, Laser and Disable. However this gun lacks the capability to recharge in the field, and is extreamly expensive.
    • +
    • INTERCEPTED TRANSMISSION REPORT: The Syndicate have expressed a interest in this new weapon, and have instructed field agents to do whatever they can to steal this weapon.
    • +
    +

    TheVekter updated:

    +
      +
    • Box's vault nuke has been replaced with immobile Nuclear Self-Destruct Mechanism.
    • +
    • Vault's new green floor tiles turn flashing red when Self-Destruct is activated.
    • +
    +

    Xhuis updated:

    +
      +
    • Syndicate contacts have discovered new ways to manipulate alarms. Malfunctioning AIs, as well as normal emags, can now disable the safeties on air and fire alarms.
    • +
    • When one emags an air alarm, its safeties are disabled, giving it the Flood environmental type, which disables scrubbers as well as vent pressure checks. Burn, pigs, burn!
    • +
    • When one emags a fire alarm, its thermal sesnsors are disabled. This will prevent automatic alerts due to the alarm being unable to recognize high temperatures.
    • +
    • Malf AIs gain two new modules, both of which disable ALL air alarm safeties and thermal sensors. These are separate abilities.
    • +
    • Air and fire alarms have notifications on their interface about the current safety status. One only has to glance at one to see that it's been tampered with.
    • +
    +

    phil235 updated:

    +
      +
    • Fixed arcade machines being usable from inside lockers to dupe rewards.
    • +
    • Silicons can no longer be grabbed by anyone. No more silicon choking
    • +
    • Custom food can now be renamed using a pen.
    • +
    +

    xxalpha updated:

    +
      +
    • Added new graffiti: cyka, prolizard, antilizard
    • +
    + +

    18 February 2015

    +

    Dannno updated:

    +
      +
    • Added proper slurring when drunk.
    • +
    +

    Deantwo updated:

    +
      +
    • Updated the ChemMaster's UI to the station default along with some functionality improvements.
    • +
    • You can now spam the 'Ready' button as much as you want without it setting you 'Not ready' again.
    • +
    +

    Dorsidwarf updated:

    +
      +
    • Added the ability to call Central Command for the nuclear authentication codes. This requires a captain-level ID and admin approval, and warns the crew.
    • +
    +

    Gun Hog updated:

    +
      +
    • E.X.P.E.R.I-MENTOR meteor storm event replaced with a fireball that targets random nearby mob.
    • +
    • EMP event range reduced.
    • +
    • Self-duplicating relics limited to 10 copies.
    • +
    • Nanotrasen has released a firmware patch for the Ore Redemption Machine, which now allows the station AI, cyborgs, and maintenance drones to smelt raw resources without the need of a valid identification card installed.
    • +
    • Nanotrasen scientists have completed their designs for a lightweight, compacted anti-armor ion weapon, without loss of efficiency. In theory, such a weapon could easily fit within standard issue backpacks and satchels. With sufficient research into weapons technology and materials, Nanotrasen believes a working prototype can be fabricated.
    • +
    +

    Iamgoofball updated:

    +
      +
    • Buffs the shit out of Styptic Powder and Silver Sulf, they're now viable to use. Synthflesh is still good for general treatment, but overall Styptic and Silver Sulf deal with their respective damage types way better now.
    • +
    • Improves kinetic accelerator's mining strength.
    • +
    • The kinetic accelerator's cooldown can be decreased by tweaking the thermal exchanger with a screwdriver.
    • +
    • The range can be increased with plasma sheets
    • +
    +

    Incoming5643 updated:

    +
      +
    • Medical borgs have been given full surgery tools which they can't fail a procedure with.
    • +
    • Medical borgs also have rechargeable gauze.
    • +
    • Borg hypo's omnizine replaced with salbutamol, salglu and charcoal.
    • +
    • Slime and Jelly mutant races now actually contain slime jelly. While playing as these races you will naturally produce it internally from your nutrition, so be sure to stay well fed as losing too much is dangerous to your health! Beware of chems that clear toxins, as they can be rapidly fatal to you!
    • +
    +

    Jordie0608 updated:

    +
      +
    • Veil render and rifts changed to spawn with vars, rifts can be closed with a nullrod.
    • +
    +

    Lo6a4evskiy updated:

    +
      +
    • General record now contains a species field and a photo of the crewmember. Security record consoles allow you to update it with a photo taken in-game (with detective's camera, for example, or AI's).
    • +
    • Expanded functionality of security HUDs to display rank and photos.
    • +
    • Medical HUDs allow user to change others' mental and physical status. Currently has no gameplay effect other than changing records.
    • +
    • Medical HUDs can perform an examination at the distance, similrarly to how attacking yourself with help intent works. Has limited ability to detect suffocation and toxin damage.
    • +
    +

    Menshin updated:

    +
      +
    • Solar control computers remade with NanoUI
    • +
    +

    Paprika updated:

    +
      +
    • Added rnd requirements to borg upgrades and tweaked the prices.
    • +
    • Changed some clothing around. Added a turtleneck for the HoS. Removed 'civillian' armor and gave normal armor to the bartender and HoP. Added flash protection to the HoS' eyepatch, it functions like sunglasses now. Additionally, added the ability to store ammo on your shoulder holster as detective.
    • +
    • Removed the defib steal objective. Added a compact defibrillator for the CMO that equips to the belt. Removed defibrillators from RND. Removed the requirement for people to not wear armor to revive them with defibs. Doubled defib timers (10 minutes before permadeath).
    • +
    • Flashlights can be attached to pulse carbines.
    • +
    • Miners spawn with a brute patch.
    • +
    • Mining station's sleeper has been replaced with an IV drip and more medkits.
    • +
    • Added hard-light holotape. This holographic police or engineering hazard tape will block entry if you're running, so you need to walk to pass it. This is to help people not sprint into breaches or crime scenes.
    • +
    • Fixed being able to sling the strapless improvised shotgun on your back.
    • +
    • Reverted the price of the ebow to 12tc and removed the range limit of its bolts.
    • +
    +

    Sometinyprick updated:

    +
      +
    • Novely pig mask prize from arcade machines, can be toggled to make you squeal like a pig.
    • +
    +

    Steelpoint updated:

    +
      +
    • Security Cyborgs Advance Taser have been replaced with a Disabler.
    • +
    +

    TZK13 updated:

    +
      +
    • Adds plaid skirts and new schoolgirl outfits to the autodrobe
    • +
    • Novaflowers apply a firestack for every 20 potency they have.
    • +
    • You can now juice whole watermelons instead of slices.
    • +
    • Advancements in the field of virology by Nanotrasen's finest have uncovered three new disease symptoms for further research:
    • +
    • Ocular Restoration heals any eye trauma experienced by the infected patient.
    • +
    • Revitiligo increases the pigmentation levels of the infected patient's skin.
    • +
    • Spontaneous Combustion ignites the infected patient without warning.
    • +
    +

    Vekter updated:

    +
      +
    • Added shot glasses! Can be obtained from the Booze-o-Mat.
    • +
    • A new premium vodka has been added to the game, hidden in a special spot.
    • +
    • Due to constant attempts to break into the station's safe, the contents have been relocated and have not been replaced. We promise. There is absolutely NO reason to break into the vault's safe anymore.
    • +
    • Each shot glass now holds 15 units, and the drinker takes all 15 in one gulp instead of 5 at a time. This means you can mix certain shots (namely, the B-52 and Toxins Special) in a shot glass. Both drinks have been made exclusive to shot glasses and will no longer show their specific sprite in a normal glass.
    • +
    • Added new sprites for most alcohol in shot glasses. Everything else will show up as 'shot of... what?'.
    • +
    • Fixed shot glasses turning into regular glasses when filled.
    • +
    • Fixed tequila bottle sprites not showing up.
    • +
    • Fixed a typo!
    • +
    • Roboticists will now start with a full toolbelt instead of a toolbox.
    • +
    +

    drovidi updated:

    +
      +
    • Blobs who burst in space will be given a 30 second warning before dying.
    • +
    • If a blob does die from bursting in space, a new crewmember will be infected.
    • +
    • If there are no blobs or infected crew left after bursting, the round will now end properly, rather than becoming endless.
    • +
    +

    phil235 updated:

    +
      +
    • You no longer need to cut the syphon wire to deconstruct air alarms.
    • +
    • Cooking overhaul: microwave recipes are converted to tablecraft recipes.
    • +
    • Added customizable food (burger,sandwich,spaghettis,soup,salad,cake,bread,kebab,pie) with specific color depending on ingredients used.
    • +
    • Added new food ingredients (dough, flat dough, cake batter, pie dough, doughslice, bun, raw pastry base, pastry base, raw cutlet, cutlet, pizzabread). Dough is made by mixing egg and flour, then transformed by using knife, rollingpin, milk and microwave. Meat is now sliceable into rawcutlets (specific color for each meat type).
    • +
    • Changed food recipes a bit (replacing stuff with new food ingredients).
    • +
    • Repurposed the microwave to actually cook certain food items(no reagents required), renamed it microwave oven and added a power setting to it.
    • +
    • Bowl is no longer trash but a beaker-like container that is used in salad&soup recipes. Also, milk and soymilk cartons as well as flour packs are now condiment bottles.
    • +
    • Changed the hunger system a bit, sugar becomes a normal reagent again. Faster nutrition drain is now handled by a variable in junk food. Also added a slight buff to vitamin.
    • +
    +

    xxalpha updated:

    +
      +
    • You now hear the voice of the chosen deity in prayers.
    • +
    + +

    05 February 2015

    +

    Danno updated:

    +
      +
    • Added suicide messages for all gun types and various different items.
    • +
    +

    Paprika updated:

    +
      +
    • Compacted ERT room by removing equipment rooms, filler rooms and pre-spawned mechs.
    • +
    • Rebalanced Pulse weapons to have more shots, faster charge, EMP immunity and modified sprites.
    • +
    • ERT spawns fully equipped with no-slowdown suits.
    • +
    • Added blood and bleeding. If you take enough brute damage on a certain limb, you will start bleeding, and will need to patch your bleeding with gauze from medbay. You can replace lost blood by eating nutritious food and waiting for your heart to reproduce it, or by getting a blood transfusion from an IV drip.
    • +
    +

    Vekter updated:

    +
      +
    • Added a toy red button to the Arcade cabinets.
    • +
    + +

    04 February 2015

    +

    Danno updated:

    +
      +
    • Fixes dufflebag's storage capacity.
    • +
    +

    Deantwo updated:

    +
      +
    • Removes duplicate fluorine from Chemical Dispenser.
    • +
    • Added GoonChems to the Portable Chem Dispenser.
    • +
    • Added cancel buttons to the ChemMaster and CondiMaster when making bottles, pills, etc.
    • +
    +

    Delimusca updated:

    +
      +
    • Added new foam armblade toy to arcade prizes.
    • +
    • Slimes can drag themselves to mobs to start feeding.
    • +
    • Attacking another slime will pull them off their victim if they're feeding or steal some of their mass.
    • +
    +

    GunHog updated:

    +
      +
    • Five new silicon emotes: *buzz2, *chime, *honk, *sad and *warn
    • +
    +

    Incoming5643 updated:

    +
      +
    • New contraband crate containing fifty butterflies.
    • +
    • Shuttle will now always arrive, but won't launch in rounds where it would've been previously auto-recalled.
    • +
    +

    Menshin updated:

    +
      +
    • Fixed being unable to place cables on plating.
    • +
    +

    Paprika updated:

    +
      +
    • Helmets for hardsuits are stored inside the suit and cannot be equipped without the suit on.
    • +
    • EVA space suits are now lighter for faster movement but lack flash or welding protection, don't hide your identity and have less radiation protection.
    • +
    +

    Perakp updated:

    +
      +
    • Tweaked slowdown due to coldness when in in low gravity.
    • +
    +

    Steelpoint updated:

    +
      +
    • ERT base equipment rooms are now access restriction to each role.
    • +
    • ERT commander spawns wearing hardsuit for identification.
    • +
    • Two boxes of metal foam grenades added for ERT engineers.
    • +
    • Deep space sensors recently detected the derelict remains of the NTSS Omen, a outdated Medical Frigate thought lost, within close proximity to Space Station 13.
    • +
    • If any SS13 EVA Personal are able to locate this ship, they will be able to pilot it back to the station for recovery. The ship may also have cordinates for other locations.
    • +
    +

    Xhuis updated:

    +
      +
    • Changelings now have the ability Strained Muscles, which lets them move at inhuman speeds at the cost of rapid stamina damage. It costs one evolution points=.
    • +
    • Changelings now have the ability Augmented Eyesight, which lets them see creatures through walls and see in the dark. It costs two evolution points.
    • +
    • After many failed raids, the Syndicate have finally done something about poor communications between cyborgs and operatives.
    • +
    • Syndicate Cyborgs now come equipped with operative pinpointers, which will automatically point to the nearest nuclear operative.
    • +
    • Handheld crew monitors can now be stored in medical belts.
    • +
    + +

    26 January 2015

    +

    Dannno updated:

    +
      +
    • Added fannypacks of multiple colors, 3 of which are accessible from the clothing vendor.
    • +
    • Added dufflebags to multiple lockers throughout the station and to the syndicate shuttle, more storage slots at the cost of move speed.
    • +
    +

    Deantwo updated:

    +
      +
    • Fixed some bugs in PDA's NTRC Chatroom feature.
    • +
    • You can now use PaperBBCode/PenCode when writing news articles on the newscaster.
    • +
    • PDA's Notekeeper now uses PaperBBCode/PenCode rather than HTML.
    • +
    • Scanning paper with your PDA is now more informative.
    • +
    +

    Firecage updated:

    +
      +
    • We, at NanoTrasen, have recently upgraded the Kitchen Spikes to include the skin of both Monkeys and Aliens when you harvest their flesh!
    • +
    • In other news, a station in a nearby Sector has been making monkey and xeno costumes. We are not sure why.
    • +
    • Added the ability to reform mineral floortiles back into sheets/bars
    • +
    +

    Ikarrus updated:

    +
      +
    • Added a new config option MINIMAL_ACCESS_THRESHOLD that can be used to automatically give players more access during low-population rounds. See game_options.txt for more information.
    • +
    +

    Lo6a4evskiy updated:

    +
      +
    • The kitchen now contains a brand new food cart. It can store foods and liquids, mix them into cocktails and dispense where needed. Food delivery has never been easier!
    • +
    +

    fleure updated:

    +
      +
    • Added briefcase filled with cash to uplink.
    • +
    + +

    21 January 2015

    +

    Iamgoofball updated:

    +
      +
    • Addiction and Overdosing has been added to Chemistry.
    • +
    • Deal with Overdosing by purging the ODing chemical with Calomel or Penetic Acid.
    • +
    • Deal with Addiction by either going cold turkey on it and weathering the effects, eventually causing the addiction to subside, or by taking more of the addictive substance to keep the effects down.
    • +
    • Cryoxadane was heavily buffed. Clonex was removed as it was merged into Cryox.
    • +
    • Fixes a shitton of stuff adding Morphine instead of Ephedrine. Sorry, miners.
    • +
    • Fixes instances of Alkysine not being replaced with Mannitol. Same with Ryetalyn being replaced with Mutadone.
    • +
    • Adds Itching Powder. Welding Fuel and Ammonia.
    • +
    • Adds Antihol. Ethanol and Charcoal.
    • +
    • Adds Triple Citrus. Lemon Juice, Lime Juice, and Orange Juice.
    • +
    • Adds Colorful Reagent. Stable Plasma, Triple Citrus,
    • +
    • Morphine replaces sleep toxin now, not Hyperzine. Hyperzine is replaced by Ephedrine now.
    • +
    • Cryotubes will now autoeject you once you are fully healed.
    • +
    • Synthflesh damage values have been fixed.
    • +
    • Charcoal has been buffed to heal 3 TOX damage a cycle and it purges other chemicals faster.
    • +
    • Saline-Glucose Solution has been buffed. It now has a 50% chance per cycle to heal 3 BRUTE and BURN per tick.
    • +
    • Fixes Strange Reagent revivals dying right after being revived. They'll still need immediate medical treatment, however.
    • +
    • Cryoxadone has had a recipe change. It is now Stable Plasma, Acetone, and Unstable Mutagen.
    • +
    • Adds 9 new Disabilites and 2 new genetic powers.
    • +
    • You can now heat donk pockets once more. Rejoice.
    • +
    + +

    17 January 2015

    +

    Cheridan updated:

    +
      +
    • The lockbox system for R&D has been replaced with a firing pin system. Ask the Warden or HoS for firing pins to allow normal operation of your firearms. Want to test them out at the range? Try printing a test-range pin.
    • +
    • Nuke Ops have used this new technology to lock some of their heavier weapons so that crew cannot use them. These implants replace their explosive implants.
    • +
    • Explosive implants are now purchasable in the uplink, and are much stronger.
    • +
    +

    Firecage updated:

    +
      +
    • NanoTrasen would like to report that our Mechanical Engineers at NTEngiCore has recently upgraded the capacity of the machines known as Biogenerators. They are now have the added ability to create various belts, and also weed/plantkillers and cartons of milk and cream!
    • +
    +

    Iamgoofball (Look Ma, I didn't mispell my name this time!) updated:

    +
      +
    • Replaced Star Trek chemistry with Goon Chemistry.
    • +
    • Emergency Medic's Handbook Tip 1: Styptic Powder = BRUTE, Silver Sulfadiazine = BURN, Charcoal = TOX, Salbutamol = OXY
    • +
    • In recipes that used removed reagents, they have been replaced with their goon chemistry counterpart:
    • +
    • Hyperzine -> Morphine
    • +
    • Inaprovaline -> Epinephrine
    • +
    • Kelotane -> Saline-Glucose Solution
    • +
    • Bicardine -> Saline-Glucose Solution
    • +
    • Dermaline -> Saline-Glucose Solution
    • +
    • Dexalin -> Salbutamol
    • +
    • Dexalin Plus -> Salbutamol
    • +
    • Tricordrazine -> Omnizine
    • +
    • Anti-Toxin -> Charcoal
    • +
    • Hydronalin -> Penetic Acid
    • +
    • Arithrazine -> Penetic Acid
    • +
    • Imidazoline -> Oculine
    • +
    • Mannitol -> Alkysine
    • +
    • Ryetalyn -> Mutadone
    • +
    +

    Steelpoint updated:

    +
      +
    • The Emergency Response Team project has been activated by Nanotrasen. The ERT are a seven man squad that can be deployed by the Central Command (admins) to attempt to rescue the station from a overwhelming threat, or to render assistance in dealing with a significant problem.
    • +
    • The ERT consists of a single Commander, two Security Officers, two Engineering Officers and two Medical Officers. The Commander is preselected when the squad is being spawned in, however the remaining six officers are free to select their role in the squad.
    • +
    • Two new Pulse gun variants have been added to the game. They are the Pulse Carbine and the Pulse Pistol, both have significantly smaller ammunition capacities than the Pulse Rifle, however they both can fit in a backpack and the pistol can fit in a pocket. All ERT Officers have a Pulse Pistol for a sidearm, however the Security Officers get a Pulse Carbine as their primary longarm.
    • +
    +

    phil235 updated:

    +
      +
    • The two library consoles are now real buildable computers. The circuitboard design is available in R&D.
    • +
    +

    sawu-tg updated:

    +
      +
    • Added a new R&D machine, to replace the telescience room. The Machine is based on RND and various interdepartmental creations.
    • +
    + +

    14 January 2015

    +

    Boggart updated:

    +
      +
    • Adds a new spell: Repulse. (Cooldown: 40 seconds, 15 at max upgrade.) Repulse throws objects and creatures within 5 tiles of the caster away and stuns them for a very short time. Distance thrown decreases as the distance from the caster increases. (Max of 5, minimum of 3) Casting it while standing over someone will stun them for longer and cause brute damage but will not throw them.
    • +
    • Fixes the Exosuit Control Console having the unpowered icon state while powered.
    • +
    +

    Iamgootball updated:

    +
      +
    • Added Goonstation Chemistry!
    • +
    • Adds 14 medicines!
    • +
    • Adds 3 pyrotechnics!
    • +
    • Adds 3 drugs with actual gameplay uses!
    • +
    • Adds 7 toxins!
    • +
    • Adds a Chemical Heater for some new recipes!
    • +
    • Adds Chemical Patches for touch based applications!
    • +
    • Adds a Traitor Poison Kit!
    • +
    • Adds Morphine Medipens!
    • +
    • Adds Morphine bottles to Cargo!
    • +
    + +

    13 January 2015

    +

    Dannno updated:

    +
      +
    • Adds a bandanas in basic colors to lockers in the station. Activate in hand to switch between head and mask modes.
    • +
    • Adds more colored jumpsuits to the mixed locker.
    • +
    +

    Incoming5643 updated:

    +
      +
    • Player controlled slimes can now change their face to match AI controlled slimes in kawaiiness. use *help as a slime to find the commands.
    • +
    +

    Studley updated:

    +
      +
    • Fixed NTSL division.
    • +
    • Added new NTSL math functions, including 'sin,' 'cos,' 'asin,' 'acos,' and 'log.'
    • +
    + +

    06 January 2015

    +

    JJRcop, Nienhaus updated:

    +
      +
    • Adds emoji to OOC chat.
    • +
    + +

    27 December 2014

    +

    Dorsidwarf updated:

    +
      +
    • Buffs the RCD from 30 matter units to max capacity 100, and increases the value of matter charges.
    • +
    +

    Paprika updated:

    +
      +
    • Taser electrodes now have a limited range of 7 tiles.
    • +
    • The energy gun's stun mode has been replaced with a disable mode.
    • +
    • Security officers will now spawn with tasers.
    • +
    • Disabler beams now go through windows and grilles.
    • +
    • Disabler beams now do 33 stamina damage instead of 34. This means they will only stun in 3 hits on someone that is NOT 100% healthy.
    • +
    • Most ballistic projectiles now do stamina damage in addition to their regular damage instead of stunning. This includes nuke op c-20r .45, detective's revolver, etc. They are effectively better than disablers at stunning people, as well as do significant damage, but they do not stun instantly like a taser. Expect engagements to be a little longer and plan ahead for this.
    • +
    • Added an advanced taser for RnD, the child of a disabler and a taser.
    • +
    +

    Tkdrg updated:

    +
      +
    • Envoys from the distant Viji sector have brought an exotic contraption to Centcomm. Known as the 'supermatter shard', it is a fragment of an ancient alien artifact, believed to have a dangerous and mysterious power. This precious item has been made available to the Space Station 13 cargo team for the cost of a hundred supply points, as a reward for all your hard work. Good luck, and stay safe.
    • +
    + +

    16 December 2014

    +

    Paprika updated:

    +
      +
    • Reverted security armor and helmets to the old (Grey) style of armor/helmets.
    • +
    • Updated security jumpsuits to be more consistent across officer/warden/HoS ranks.
    • +
    • Added tactical armor and helmets to replace the largely unused bulletproof vest in the armory. This armor has higher bullet and explosive resistance than normal armor, and uses the previous, more military armor/helmet sprites.
    • +
    • Added a new injury doll to go along with the overall health meter. This will show you locational overall limb-based burn/brute damage, so you can tell the difference between being hurt with burn/brute or toxins/stamina damage which does not affect limbs.
    • +
    • Reverted some UI icons back to their older status and changed some around for readability. Thank you for your feedback.
    • +
    +

    Thunder12345 updated:

    +
      +
    • Added a new FRAG-12 explosive shotgun shell, built from the unloaded technological shell, using tablecrafting. Constructed using an unloaded technological tech shell, 5 units sulphuric acid, 5 units polytrinic acid, 5 units glycerol, and requires a screwdriver.
    • +
    +

    phil235 updated:

    +
      +
    • Change to the hunger system. Eating food with sugar temporarily worsens your nutrition drop rate. Eating too much sugar too quickly can make you temporarily unable to eat any sugary food. The nutritional effect of sugar depends on how hungry you are thus it cannot easily raise your nutrition level past well fed and is best used when hungry. Lots of sugar can make you a bit jittery at times. Eating food with vitamin (new reagent) counteracts the sugar effects and can give you temporary buffs when well fed: it lowers your chance to catch or spread viruses,it makes your body's metabolism more efficient that is it keeps healing reagents longer and evacuate toxins faster and reduces damage from radioactive reagents. Your metabolism gets less efficient if starving.
    • +
    • New hunger hud icons: starving, hungry, fed, well fed, full, fat.
    • +
    • Snack vending machine get a chef compartment that can be loaded with non-sugary food by hand or with a tray by anyone with kitchen access (unless you hack the machine with multitool or emag). The food can be unloaded by anyone, like regular snacks
    • +
    • Cargo can get a nutritious pizza crate order for 60 points.
    • +
    • Grown and cooked food gets some vitamin while junk food gets less nutriment and more sugar (only hot donkpocket and ramen don't have sugar)
    • +
    • The number of junk food in snack vending machine is lowered from 6 to 5 of each type.
    • +
    • Fixing not being able to load an omelette du fromage on a tray.
    • +
    + +

    10 December 2014

    +

    GunHog updated:

    +
      +
    • The Nanotrasen firmware update 12.05.14 for station AI units and cyborgs includes a patch to give them more control of their automatic speech systems. They can now chose if the message should be broadcasted with their installed radio system and any frequency available to them.
    • +
    +

    Paprika updated:

    +
      +
    • Added winter coats and winter boots! Bundle up for space xmas! They are available in most wardrobe and job lockers, and come with special features depending on the flavor!
    • +
    +

    Paprka updated:

    +
      +
    • Added a new weapon for syndicate boarding parties, the C-90gl assault rifle. This is a hybrid rifle with a lot of damage and a grenade launcher alt-fire. Purchasable for 18TC.
    • +
    • Suppressors can now be used on the protolathe SMG and the C-20r.
    • +
    +

    RemieRichards updated:

    +
      +
    • Sounds in areas of low pressure (E.g. Space) are now much quieter
    • +
    • To hear someone in space you need to be stood next to them, or use a radio
    • +
    +

    as334 updated:

    +
      +
    • We've discovered that slimes react to the introduction of certain chemicals in their bloodstream. Inaprovaline will decrease the slimes children's chance of mutation, and plasma will increase it.
    • +
    • We've also found that feeding slimes solid plasma bars makes them more friendly to humans.
    • +
    + +

    08 December 2014

    +

    Ergovisavi updated:

    +
      +
    • Allows using replica pods to clone people without bodies.
    • +
    • Speeds up replica pod cloning by adjusting the starting production.
    • +
    • Replica pods will now only create plantmen.
    • +
    • Mixing blood in a beaker or taking it from a suicide victim will render the blood sample useless for replica pod cloning.
    • +
    +

    GunHog updated:

    +
      +
    • Our top Nanotrasen scientists have provided improved specifications for the Rapid Part Exchange Device (RPED)! The RPED can now contain up to 50 machine components, and will display identical items in groups when using its inventory interface.
    • +
    • Note that power cells, being somewhat bulkier, will take up more space inside the device. In addition, the RPED's firmware has also been updated to assist in new machine construction! Simply have the required components inside the RPED, apply it to an unfinished machine with its circuit board installed, and watch as the device does the work!
    • +
    • Nanotrasen has updated station bound Artificial Intelligence unit design specifications to include an integrated subspace radio transmitter. The transmitter is programmed with all standard department channels, along with the inclusion of its private channel. It is accessed using :o in its interface.
    • +
    • {INCOMING CLASSIFIED SYNDICATE TRANSMISSION} Greetings, agents! Today, we are happy to announce that we have successfully reverse engineered the new subspace radio found in Nanotrasen's newest AI build plans. We have included our encryption data into these transmitters.
    • +
    • Should you be deployed with one of our agent AIs, it may be wise of you to purchase a syndicate encryption key in order to contact it securely. Remember, as with other agents, a Syndicate AI is unlikely to be of the same Syndicate corporation as you, and you both may actually have conflicting mission parameters! Your channel, as always, is accessed using :t.
    • +
    +

    Paprika updated:

    +
      +
    • Changed the way flashbang protection works. Currently, only security helmets (and their derivatives like swat and riot), and some hardsuit helmets have flashbang protection. Ear items like earmuffs and 'bowman' headsets (alternative, larger headsets) have flashbang protection as well, so you're able to go hatless as security. The Head of security, warden, and detective's hat do NOT have flashbang protection, but their earpieces do, from the 'noise' part of the flashbang. The flashbang blind still works as before, with only sunglasses/hardsuit helmets protecting you.
    • +
    +

    Tkdrg updated:

    +
      +
    • Security/Medical HUDs are now more responsive and less laggy.
    • +
    + +

    10 November 2014

    +

    Menshin updated:

    +
      +
    • Made meteors more threatening.
    • +
    • Added three levels of danger for meteors waves, randomly selected at spawn.
    • +
    • Rumors speaks of a very rare meteor of unfathomable destructive power in the station sector...
    • +
    • Fixed infinigib/infinisplosion with meteors bumping
    • +
    +

    Paprika updated:

    +
      +
    • Added a defibrillator and an EMT alternative clothing set for medical doctors. These defibrillators will revive the recently deceased as long as their souls are occupying their body and they have no outstanding brute or burn damage.
    • +
    • Yes, they actually work now too!
    • +
    • Added a way for you to unload a round from a chambered projectile weapon. Simply click on the gun when it is in your active hand, and assuming it does not have a magazine, the round should pop out. You can also use this system to unload individual bullets from magazines and ammo boxes, like the detective's speed loaders.
    • +
    • Added glass tables and overhauled how table construction works. Now, you need to build a frame using either metal rods or wood planks, and then place a top on the table.
    • +
    • Table disassembly now works in two stages. Screwdriver the table to remove the top of it and reduce it back to a frame. Frames can be moved around and walked on top of. Wrench the table to deconstruct it entirely back to parts, this is quicker and much more like the old fashion. To deconstruct a frame, use your wrench on it as well.
    • +
    • Fixed traitor med analyzers not fitting in medical belts.
    • +
    • Fixed syringe box bug with medipens.
    • +
    +

    Perakp updated:

    +
      +
    • Added escape-with-identity objective for changelings. Completion requires the changeling to have transformed to their target and be wearing an ID card with the target's name on it when escaping.
    • +
    • Changelings can absorb someone even if they have that DNA in storage already.
    • +
    • Fixes hivemind being lost when readapting evolutions.
    • +
    + +

    04 November 2014

    +

    MrPerson updated:

    +
      +
    • You can use AI Upload modules directly on unslaved cyborgs to change their laws. The panel has to be open to do this.
    • +
    • Newly emagged cyborgs get locked down for a little bit until their new laws get shown. Thank you to whoever bitched about it on singulo and filed an issue report.
    • +
    +

    Paprika updated:

    +
      +
    • Added an advanced mop for the janitor, available at the protolathe. This hi-tech custodian's friend can mop twice as many floor tiles before needing to return to your bucket!
    • +
    • Moved holosign projector to the protolathe and gave the janitor back his old signs. We hope you've enjoyed this free trial run of holo projectors, but our budget is tight!
    • +
    • Added a holosign projector to the janitor module for cyborgs.
    • +
    • Soap now has a delay. Different soap types clean faster than others, but expect to put it some extra arm work if you want to clean that fresh blood!
    • +
    +

    Tkdrg updated:

    +
      +
    • Cutting-edge research in a secret Nanotransen lab has shed light into a revolutionary form of communication technology known as 'chat'. The Personal Data Assistants of Space Station 13 have been deployed with an experimental module implementing this system, dubbed 'Nanotransen Relay Chat'.
    • +
    + +

    30 October 2014

    +

    MrPerson updated:

    +
      +
    • Everything now drifts in space, not just mobs.
    • +
    • Mechs are just as maneuverable in space as you are.
    • +
    • Being weightless now slows movement down by a lot rather than speeding it up. Having your hands full will make movement even slower.
    • +
    • Removed spaceslipping (You slipped! x1000)
    • +
    • Jetpacking after being thrown out a mass driver will cancel out your momentum.
    • +
    • Shooting a gun causes you to drift the other direction like spraying a fire extinguisher.
    • +
    + +

    27 October 2014

    +

    Jordie0608 updated:

    +
      +
    • Adds a new riot shotgun that spawns in the armory with a 6 round beanbag magazine.
    • +
    +

    Paprika updated:

    +
      +
    • Allowed constructs to assist in activating most runes. This includes conversion runes, but does NOT include sacrifice runes.
    • +
    +

    Patchouli Knowledge updated:

    +
      +
    • In light of the recent achievements of the Robotics department, new and upgraded exosuit schematics were delivered to SS13 exosuit fabricators as a reward from CentComm.
    • +
    • The countless hours of research, experimentation, and reverse-engineering of wrecks from the mining asteroid have paid off - the Research team has rediscovered the process of building Phazon exosuits. The parts and circuits have been made available in the exofabs and circuit printers.
    • +
    • The APLU Ripley exosuit has been refitted with asteroid mining purposes in mind. Its armour plating will provide extra protection against the brute attacks of asteroid alien lifeforms, and protect from gibtonite explosions. The leg servos were upgraded to provide faster movement.
    • +
    • There are rumours of some creative shaft miners discovering a way of augmenting APLU Ripley armour with trophy hides from goliath-type asteroid lifeforms...
    • +
    • Durand construction routines now require a phasic scanner module and a super capacitor to match Nanotrasen industry standards.
    • +
    • The exosuit fire extinguisher now boasts a larger watertank, and carries a whole 1000u of water from the old 200u tank.
    • +
    • The exosuit plasma converter's efficiency has been vastly improved upon, and its fuel consumption has been cut to nearly half of old values.
    • +
    • The exosuit sleeper interiors have been refitted to allow the occupants more freedom of movement, and the occupants may now eject at will.
    • +
    • The armour plating on all exosuits was fitted with reactive deflection systems specifically designed to stop the rapid slashes from xenomorph threats.
    • +
    • The Firefighter Ripley chassis were moved from the Exosuit Equipment section to the APLU Ripley section of exofab menus.
    • +
    • Fixed some minor errors in the exosuit construction message syntax.
    • +
    +

    phil235 updated:

    +
      +
    • Closets and its children can no longer contain a near infinite amount of mobs. Large mobs (juggernaut, alien emperess, etc) don't fit, small mobs (mouse, parrot, etc) still fit in the same amounts, human-sized mob (humanoid, slime, etc) fit but maximum two per body bag and three for all the other closets. Adding bluespace body bag to R&D, it can hold even large mobs and in large amounts.
    • +
    • girders and displaced girders now have a chance to let projectiles pass through them.
    • +
    + +

    19 October 2014

    +

    Donkie updated:

    +
      +
    • Major atmos update. Featuring pretty colors.
    • +
    • 4-Way pipes added.
    • +
    • Flip-able trinary devices (mixer & filter).
    • +
    • Pipe-painter added.
    • +
    • Most pipe icons have been tweaked with shading and such, making it look more uniform.
    • +
    +

    JJRcop updated:

    +
      +
    • We have managed to re-discover drones! We improved the formula, and have discovered some cool stuff.
    • +
    • After some fiddling with audio recognition, drones can now understand human speech!
    • +
    • One of our engineers found some screws that were loose on some of our tests, screwing them in made the drone work as if it had just come out of robotics.
    • +
    • We had to sacrifice some of our NT brand EMP protection for the speech recognition, so drones can get damaged if subjected to heavy EMP radiation.
    • +
    • We figured out why drones couldn't remove objects from people, that has been fixed.
    • +
    • The standby light wasn't wired correctly.
    • +
    • Unfortunately one of our assistants tasked with transporting the only copy of the data dropped the flash drive in hot water because he wanted to see what "drone tea" tasted like. You'll have to discover them again.
    • +
    +

    Lo6a4evskiy updated:

    +
      +
    • Station's crayons have been upgraded to the version 2.0 of ColourOS. Don't worry, they are still edible!
    • +
    • Many items now have different stripping delays. Heavier and more armored pieces of clothing are generally more difficult to take off someone else, while smaller items can be very easy to snatch. Pockets always take 4 seconds to search.
    • +
    +

    MrPerson updated:

    +
      +
    • Implants are activated via action buttons on the top-left corner of your screen instead of emotes.
    • +
    +

    Paprika updated:

    +
      +
    • Added zipties for security and nuke operatives. These have a slightly shorter 'breakout time' as normal cuffs but they are destroyed upon removal. Beepsky and sec borgs now use these by default.
    • +
    • Changed the medical HUD in the tactical medkit to a night vision HUD so syndicate medics don't stumble around in the dark. Can be purchased through nuke op uplinks.
    • +
    • Added a second roboticist roundstart job slot.
    • +
    • Added a third cargo tech job slot.
    • +
    +

    Paprka updated:

    +
      +
    • Added undershirts as a companion piece to jumpsuit adjusting. Beat the heat with a comfortable tank top, or warm up with an extra layer tshirt!
    • +
    • Added a holographic sign projector to replace the old wet floor signs to encourage janitors to warn crewmembers about wet floors.
    • +
    +

    optimumtact updated:

    +
      +
    • Medical supplies crate now comes with a boxy full of bodybags
    • +
    + +

    09 October 2014

    +

    Paprika updated:

    +
      +
    • Added inaprovaline MediPens (autoinjectors) that replace inaprovaline syringes in medkits. Like the syringes, these can be used to stabilize patients in critical condition, but require no medical knowledge to use.
    • +
    • Reverted the mining scanner to a manual scanner.
    • +
    • Buffed the rate of the automatic scanner
    • +
    • Added automatic scanner to equipment locker. It is also available by redeeming your voucher.
    • +
    • Reduced the size of the mining jetpack, it now fits in backpacks. The capacity of the jetpack has been reduced as well, however.
    • +
    • Removed resonator from the mining voucher redemption. Replaced it with a mining drill.
    • +
    + +

    08 October 2014

    +

    Cheridan updated:

    +
      +
    • Flash mechanics changed. Instead of a knockdown effect, it will cause a stumbling effect. This includes area-flashing. The five-use-per-minute limit has been removed. "Synthetic" flashes made in the protolathe are now normal flashes.
    • +
    +

    Paprika updated:

    +
      +
    • Added a unique shield to the Head of Security's locker. It can be concealed for storage and activated like an energy shield, but functions like a riot shield. It can also be made at the protolathe.
    • +
    • Marauders: Due to your extremely great performance as of late, we've added a new equipment room on Mother Base. A lot of your equipment has been moved to this room, as well as some new equipment added onto the Mothership. Take some extra time to familiarize yourself with the placement of your equipment.
    • +
    • Oh, and you guys have a space carp now too.
    • +
    +

    Paprka updated:

    +
      +
    • Added jumpsuit adjusting. Adjust your jumpsuit to wear it more casually by rolling it down or roll up those sleeves of that hard-worn suit!
    • +
    • Added a grey alternative to the detective's suit and trenchcoat. Now you can be a noir private investigator!
    • +
    +

    Tkdrg updated:

    +
      +
    • Space Station 13 has been deployed with transit tube dispensers. Central Command encourages the engineering department to repair and improve the station using this equipment.
    • +
    + +

    05 October 2014

    +

    Ikarrus updated:

    +
      +
    • Character Save Files will now remember Species.
    • +
    +

    Miauw updated:

    +
      +
    • Added 5 new maintenance ambience tracks, made by Cuboos.
    • +
    +

    Nobalm updated:

    +
      +
    • Added examine descriptions to twenty eight objects.
    • +
    +

    Paprika updated:

    +
      +
    • Due to some payroll cuts affecting lower-rank crewmembers on Space Station 13, we fear that uprisings and mutinies might be approaching. To help defend themselves, all heads of staff have been given telescopic batons to subdue attackers should they be assaulted during their shifts.
    • +
    • Toolbelts can now hold pocket fire extinguishers. Atmos technicians spawn with them.
    • +
    • Remember those magboots we had our undercover agents steal? Well we've finally reverse engineered them. Not only that, but we gave them a killer paintjob. They will be available in the uplinks of boarding parties we send out to Nanoscum stations.
    • +
    • Listen up, Marauders! The Syndicate has recently cut back funding into boarding parties. What this means is no more hi-tech fancy energy guns. We've had to roll back to using cheaper, mass-produced automatic shotguns. But in retrospect, could this possibly be a downgrade?
    • +
    + +

    01 October 2014

    +

    Cheridan updated:

    +
      +
    • Experienced smugglers have joined the Syndicate, adding their bag of tricks to its arsenal. These tricky pouches can even fit under floor plating!
    • +
    +

    Ikarrus updated:

    +
      +
    • Adds Gang War, a new game mode still in alpha development.
    • +
    +

    Incoming5643 updated:

    +
      +
    • After a public relations nightmare in which a horde of 30 assistants violently dismembered a sole commander the revolution has begin tactically reducing their initial presence in stations with weak command structures. Should stations add to their command staff during the shift additional support will be provided.
    • +
    • Too many instances of crying CMOs hiding in the lockers of supposedly secured revoulutionary stations has lead to a crackdown on revolutionary policy. You must kill or maroon the entire command staff, reguardless of when they reached the station.
    • +
    • Intense study into the underlying structure of the universe has revealed that everything fits into a massive SPACECUBE. This deep and profound understanding has led to a revolution in cross surface movement, and spacemen can look forward to a new era of predictable and safe space-fairing.
    • +
    +

    Jordie0608 updated:

    +
      +
    • Grille damage update, humans now deal less unarmed damage to grilles while projectiles and items deal more.
    • +
    • Replaced all AI turrets with porta-turrets that work on LoS instead of area and can be individually configured
    • +
    +

    Miauw updated:

    +
      +
    • Voice changer masks work again.
    • +
    • You can now turn voice changer masks on/off by activating them in your hand. They start off.
    • +
    • The amount of TC has been increased to 20, but the price of all items has been doubled as well
    • +
    • With this, the prices of stealthy items has been slightly decreased and the prices of offensive items slightly increased (+/- 1 TC)
    • +
    +

    RemieRichards, JJRcop updated:

    +
      +
    • New research in the area of robotics has been published on Maintenance Drones, little robots capable of repairing and improving the station. Unfortunately, all of the research was lost in a catastrophic server fire, but we know they can be made, so it's up to you to re-discover them! Make us proud!
    • +
    +

    phil235 updated:

    +
      +
    • Changed all clone damage descriptions to use the term cellular damage to avoid confusion with genetics mutations.
    • +
    + +

    07 September 2014

    +

    Gun Hog updated:

    +
      +
    • Nanotrasen scientists have released a Heads-Up-Display (HUD) upgrade for all AI and Cyborg units! Cyborgs have had Medical sensors and a Security datacore integrated into their core hardware, replacing the need for a specific module.
    • +
    • AI units are now able to have suit sensor or crew manifest data displayed to them as a visual overlay. When viewing a crewmember with suit sensors set to health monitoring, the health status will be available on the AI's medical HUD. In Security mode, the role as printed on the crewmember's ID card will be displayed to the AI.
    • +
    • Any entity with a Security or Medical HUD active will recieve appropriate messages on that HUD.
    • +
    +

    Ikarrus updated:

    +
      +
    • Server Operators: A new config option added to restrict command and security roles to humans only. Simply add/uncomment the line ENFORCE_HUMAN_AUTHORITY in game_options.txt. +
    • Players: To check if this config option is enabled on your server, type show-server-revision into the game's command line. +
    • +
    + +

    06 September 2014

    +

    Ikarrus updated:

    +
      +
    • Tampered supply ordering consoles can now order dangerous devices directly from the Syndicate for 140 points. +
    • Securitrons line units will no longer arrest individuals without IDs if their faces can still be read. +
    • Enemy Agent ID cards have been reported to be able to interfere with the new securitron threat assessment protocols. +
    • The Syndicate base has been modified to only allow the leading operative to launch the mission. +
    • +
    + +

    04 September 2014

    +

    KyrahAbattoir updated:

    +
      +
    • All the objects found in BoxStation maintenance are now randomized at round start.
    • +
    + +

    03 September 2014

    +

    Ikarrus updated:

    +
      +
    • Cost of Syndicate bombs increased to 6 telecrystals.
    • +
    +

    JStheguy updated:

    +
      +
    • Many new posters have been added.
    • +
    + +

    01 September 2014

    +

    ChuckTheSheep updated:

    +
      +
    • Adds preference toggle for intent selection mode. +
    • Direct selection mode switches intent to the one you click on instead of cycling them. +
    • +
    +

    Ikarrus updated:

    +
      +
    • New more detailed End-Round report. +
    • Removes count of readied players from the lobby. +
    • +
    +

    Jordie0608 updated:

    +
      +
    • Virology has been made the right color.
    • +
    +

    Miauw updated:

    +
      +
    • A major rework of saycode has been completed which fixes numerous issues and improves functionality. +
    • Please report any issues you notice with any form of messaging to Github. +
    • +
    + +

    31 August 2014

    +

    Tokiko1 updated:

    +
      +
    • Adds two new hairstyles.
    • +
    + +

    30 August 2014

    +

    Ikarrus updated:

    +
      +
    • Space Station 13 has been authorized to requisition additional Tank Transfer Valves from Centcom's supply lines for the price of 60 cargo points.
    • +
    + +

    26 August 2014

    +

    Ikarrus updated:

    +
      +
    • Security forces are advised to increase scrutiny on personnel coming into contact with AI systems. Central Intelligence suggests that Syndicate terrorist groups may have begun targeting our AIs for destruction. +
    • For the preservation of corporate assets, Central Command would like to remind all personnel that evacuating during an emergency is mandatory. We suspect that terrorist groups may be attempting to abduct marooned personnel who failed to evacuate. +
    • R&D; teams have released an urgent update to station teleporters. To eliminate the risk of mutation, personnel are advised to calibrate teleporters before attempting each use. +
    • Centcom has approved the Captain's request to rig the display case in his office with a burglar alarm. Any attempts to breach the case will now trigger a lockdown of the room. +
    • **Crew Monitoring Consoles now scan their own Z-level for suit sensors, instead of only scanning Z1. +
    • **Server operators can now set a name for the station in config.txt. Simply add the line "STATIONNAME Space Station 13" anywhere on the text file. Replace Space Station 13 with your station name of choice.
    • + +
    + +

    24 August 2014

    +

    Ikarrus updated:

    +
      +
    • Ore redemption machine can now smelt plasteel.
    • +
    • Mulebot speed has been vastly increased by up to 300%.
    • +
    • Removed exploit where false walls can be used to cheese the AI chamber's defenses
    • +
    + +

    21 August 2014

    +

    Ikarrus updated:

    +
      +
    • The Phase Shift ability will no longer instantly gib players. Instead, they will be knocked out for a few seconds. Mechas will be damaged.
    • +
    • The Phase Slayer ability will no longer instantly gib players. Instead, they will be dealt 190 brute damage. Mechas will be dealt 380 damage.
    • +
    • ADMIN: Most Event buttons have been moved out of the secrets menu and into a Fun verb.
    • +
    + +

    20 August 2014

    +

    Cheridan updated:

    +
      +
    • Three new shotgun shells added. Create them by first researching and printing an unloaded tech shell in R&D.; Afterwards, use table-crafting with the appropriate components with a screwdriver in-hand.
    • +
    • Meteorshot: tech shell + compressed matter cartridge + micro(or better) manipulator.
    • +
    • Pulse Slug: tech shell + advanced capacitor + ultra micro-laser.
    • +
    • Dragonsbreath: tech shell + 5 phosphorus (in container).
    • +
    • Incendiary rounds now leave a blazing trail as they pass. This includes existing incendiary rounds, new dragonsbreath rounds, and the Dark Gygax's carbine.
    • +
    + +

    19 August 2014

    +

    Ikarrus updated:

    +
      +
    • Brig cells and labour shuttle have both been modified to send a message to all security HUDs whenever a prisoner is automatically released.
    • +
    • The labour camp has been outfitted with a points checking console to allow prisoners to check their quota progress easier and better explain the punishment system of forced labour.
    • +
    + +

    18 August 2014

    +

    Iamgoofball updated:

    +
      +
    • 25 new hairstyles have been added.
    • +
    + +

    15 August 2014

    +

    AndroidSFV updated:

    +
      +
    • AI photography has been extended to Cyborgs. While connected to an AI, all images taken by cyborgs will be placed in the AI's album, and viewable by the AI and all linked Cyborgs.
    • +
    • When a Cyborgs AI link wire is pulsed, the images from the Cyborgs image album will be synced with the AI it gets linked to.
    • +
    • Additonally, Cyborgs are able to attach images to newscaster feeds from whichever album is active for them. Cyborgs are also mobile, inefficent, printers of same images.
    • +
    + +

    11 August 2014

    +

    Ikarrus updated:

    +
      +
    • Boxstation map updates:
      + -Singularity engine walled from from outer space
      + -Shutters for exterior Science windows
      + -Teleporter board moved from RD's Office to Tech Storage now that the teleporter can be built again.
      + -Security Deputy Armbands (red) added in HoS's Office



    • +
    + +

    14 July 2014

    +

    Miauw updated:

    +
      +
    • Added a new mutetoxin that can be made with 2 parts uranium, 1 part water and 1 part carbon and makes people mute temporarily
    • +
    • Parapens were renamed to sleepy pens and now contain 30 units of mutetoxin and 30 units of sleeptoxin instead of zombie powder.
    • +
    • C4 can no longer be attached to mobs
    • +
    • Reduced the C4 price to 1 telecrystal
    • +
    + +

    07 July 2014

    +

    Firecage updated:

    +
      +
    • We, of the NanoTrasen Botany Research and Developent(NTBiRD), has some important announcements for the Botany staff aboard our stations.
    • +
    • We have recently released a new strain of Tower Cap. It is now ensured that more planks can be gotten from a single log.
    • +
    • Head Scientist [REDACTED] is thanked for his new strain of Blood Tomatoes. It now not only contains human blood, but also chunks of human flesh!
    • +
    • We have also discovered a way to replant the infamous Cash Trees and 'Eggy' plants. We can now harvest their seeds, and the rare products are inside the fruit shells.
    • +
    • Similar to the new variety of Tower Caps, it is now possible to get various grass flooring depending on the plants potency!
    • +
    • Our sponsors at Knitters United has released a new variation of the botany Aprons and Coveralls which can hold a larger variety of items!
    • +
    • A new version of Plant-B-Gone was produced which are much more lethal to plants, yet at the same time has no extra effect on humans besides the norm.
    • +
    +

    Paprika updated:

    +
      +
    • Tweaked mining turf mineral droprates and reverted mesons to the 'old' style of mesons. This means mesons will be more powerful with the added side effect of not being able to track individual light sources through walls and such. This is a trial run; please provide feedback on the /tg/ codebase section of the forum.
    • +
    + +

    05 July 2014

    +

    Firecage updated:

    +
      +
    • Recently the Space Wizard Federation, with some assistance from the Cult of Nar-Sie, recently created a new strain of Killer Tomato. A sad side effect is this effected all current and future Killer Tomato strains in our galaxy. They are now reported to be extremely violent and deadly, use extreme caution when growing them.
    • +
    + +

    03 July 2014

    +

    Miauw updated:

    +
      +
    • Added slot machines to the game
    • +
    • Slot machines use reels. All prizes except for jackpots can be won on all lines
    • +
    • Simply put a coin into one of the slot machines in the bar to play!
    • +
    • Slot machines can also be emagged.
    • +
    + +

    01 July 2014

    +

    Ikarrus updated:

    +
      +
    • Central Security has approved an upgrade of the Securitron line of bots to a newer model.
      Highlights include:
    • +
    • -An optional setting to arrest personnel without an ID on their uniform (Disabled by default)
    • +
    • -An optional setting to notify security personnel of arrests made by the bots (Enabled by default)
    • +
    • -A new "Weapon Permit" access type that securitrons will use during their weapons checks. Personnel who work with weapons will be granted this access by default. More can be assigned by the station's Head of Security and Personnel.
    • +
    • -A more robust threat assessment algorithm to improve accuracy in identifying perpetrators.
    • +
    +

    Rolan7 updated:

    +
      +
    • Fixed the irrigation system in hydroponics trays. Adding at least 30 units of liquid at once will activate the system, sharing the reagents between all connected trays.
    • +
    • Changelings can communicate while muzzled or monkified, and being monkified doesn't stop them from taking human form.
    • +
    • Mimes cannot break the laws of physics unless their vow is currently active.
    • +
    • Trays are rewritten to make sense and so borgs can actually use them. Service borgs can discretely carry small objects, hint hint. The items are easily knocked out of them.
    • +
    + +

    20 June 2014

    +

    Ikarrus updated:

    +
      +
    • The 'Enter Exosuit' button was removed, and you have to click + drag yourself to enter a mech now; like you would to enter a disposal unit.
    • +
    + +

    12 June 2014

    +

    Cheridan updated:

    +
      +
    • NT Baton Refurbishment Team Notice: 'Released' option in security records has been renamed 'Discharged', and the sechud icon has been changed from a blue R to a blue D. Stop beating your released prisoners, dummies; they're not revheads.
    • +
    • NT Entertainment Department Notice: The prize-dispensing mechanism in Arcade machines has been replaced with a cheaper gas-powered motor. It should still be completely safe, unless an electromagnetic field disrupts it!
    • +
    • Pill code tweaked. In short, you can feed monkeys pills now #whoa
    • +
    • Casings ejected from guns will now spin #wow
    • +
    + +

    11 June 2014

    +

    Ikarrus updated:

    +
      +
    • Having the nuke disk will no longer prevent you from using teleporters or crossing Z-levels. Leaving the Z-level however, will cause you to "suddenly lose" the disk.
    • +
    • Pulled objects will now transition with you when as you transition Z-levels in space.
    • +
    +

    Malkevin updated:

    +
      +
    • IEDs have been removed
    • +
    • Firebombs have been added
    • +
    • They're as reliable and predictable as you would expect from a soda can filled with flammable liquid and set off with an igniter contected to two wires. Use your branes and take proper precautions or leave a charred corpse, your choice.
    • +
    + +

    06 June 2014

    +

    Gun Hog updated:

    +
      +
    • Nanotrasen programmers have discovered a potential exploit involving a station's door control networks. With sufficient computing power, the network can be overloaded and forced to open or bolt closed every airlock at once.
    • +
    • Some reports suggest that the latest firmware update to Artifical Intelligence units installed in our research stations may contain this exploit. Any such reports that state that should a station's AI unit "malfunction", it may gain the ability to use this exploit to initate a full lockdown of the station. Fire locks and blast doors are also said to be affected.
    • +
    • Nanotrasen officially holds no validity to these reports. We recommend that station personnel disregard such rumors.
    • +
    + +

    20 May 2014

    +

    Kelenius updated:

    +
      +
    • After the years of extensive research into xenobiology, and thousands of scientists lost to the slimes, we have finally come to admitting that we don't have a clue how they work. However, we've outlined a few facts, and managed to breed a new kind of slimes. They will be shipped to your station on the next shifts. They are different from the ones they are used to in the following:
    • +
    • Their sight is better than ever, and now they can finally see things that are not directly pressed against them. Beware, they may appear more aggressive!
    • +
    • Their memory has also become better, and they will now remember the people who fed them. As a note, you need to grab the monkey or push it to show to the slime that you're giving it to them, and it's not just walking in.
    • +
    • Apparently, not only we have studied them, but they have also studied us. Slimes are now capable of showing various emotions, mimicking humans. Use it to your advantage.
    • +
    • There are reports of slimes showing signs of sentience. Further research is recommended.
    • +
    • One of the reported signs is their speech capability. Following facts have been gathered: they talk more often to those who feed them; they react to being called by the number, but 'slimes' is also acceptable; they are able to understand being ordered to "follow" someone, or "stop". There is a report of slime releasing the assistant after a scientist shouted at it, and then calmly ordered a slime to stop.
    • +
    • We've made a modification of a health scanner that is intended for the use on slimes. Two are available in the smartfridge.
    • +
    • We've come to a conclusion that 5 units of reagents are not necessary to cause slime core reactions. You actually only need one unit.
    • +
    + +

    16 May 2014

    +

    Menshin updated:

    +
      +
    • Thanks to Nanotrasen's Engineering division, the power wiring of the station has a received a complete overhaul. Here are the highlight features in CentCom report :
    • +
    • Improved way of connecting cables! Finished is the time of "laying and praying" : it's now as simple as matching ends of each cables!
    • +
    • Unified way of connecting machines! Every machine is connected to a powernet through a node cable (it still needs to be anchored to receive power though)!
    • +
    • Lots of improvements in the cable cutting tools! Gone is the odd magic of physically separated yet still connected powernets (contact CentCom Engineering Division if you still witness something weird, we always have a fired form ready for our engineers!)!
    • +
    • Any conscientious (or not!) Station Engineer may check an "updated wiring manual" at http://www.tgstation13.org/wiki/Wiring#Power_Wires
    • +
    + +

    14 May 2014

    +

    Ikarrus updated:

    +
      +
    • A recent breakthrough in Plasma Materials Research has led to the development of a stronger, tougher plasteel alloy that can better resist extreme heat by up to four times. A live demonstration preformed during a press conference earlier today showed a segment of reinforced wall resisting an attack by Thermite. The corporation also announces that upgrades to its existing stations is already underway.
    • +
    + +

    07 May 2014

    +

    /Tg/station Code Management updated:

    +
      +
    • /tg/station code is now under a feature freeze until 7th June 2014. This means that the team will be concentrating on fixing bugs instead of adding features for the month.
    • +
    • You can find more information about the feature freeze here. http://tgstation13.org/phpBB/viewtopic.php?f=5&t;=273
    • +
    • This is the perfect time to report bugs, which you can do so here. https://github.com/tgstation/-tg-station/issues/new
    • +
    + +

    30 April 2014

    +

    Giacom updated:

    +
      +
    • You now have to give a reason when calling the shuttle.
    • +
    • The amount of time it takes for the shuttle to refuel is now a config option, the default is 20 minutes.
    • +
    +

    Gun Hog updated:

    +
      +
    • Certain Enemies of the Corporation have discovered a critical exploit in the firmware of several NanoTrasen robots that could prevent the safe shutdown of units corrupted by illegally modified ID cards, dubbed "cryptographic sequencers".
    • +
    • NanoTrasen requires more research into this exploit, this we have issued a patch for AI and Cyborg software to simulate this malfunction. All NanoTrasen AI units are advised to only allow testing in a safe and contained environment. The robot can safely be reset at any time.
    • +
    • Unfortunately, a robot corrupted by a "cryptographic sequencer" still cannot be reset by any means. NanoTrasen urges regular maintenance and care of all robots to reduce replacement costs.
    • +
    + +

    27 April 2014

    +

    Ikarrus updated:

    +
      +
    • NT Human Resources announces an expansion of the List of Company-Approved Hair Styles, as well as more relaxed gender restrictions on hair styles. Check with your local company-sponsored hairstylist to learn more.
    • +
    + +

    22 April 2014

    +

    Ikarrus updated:

    +
      +
    • ID Computers have been modified to allow Station Heads of Staff to assign and remove access to their departments, as well as stripping the rank of their subordinates. An ID computer on the bridge is available for the use of this function.
    • +
    + +

    20 April 2014

    +

    Gun Hog updated:

    +
      +
    • NanoTrasen Emergency Alerts System 4.20 has been released!
    • +
    • In the unfortunate event of any nuclear device being armed, the station will enter Code Delta Alert.
    • +
    • Should the nuclear explosive be disarmed, the station shall automatically return to its previous alert level.
    • +
    +

    Steelpoint updated:

    +
      +
    • A new AI satellite has been constructed in orbit of Space Station 13!
    • +
    • The satellite exclusivly is used to hold a station's Artifical Intelligence Unit, the satellite contains a miried of turret and motion sensor defences. A transit tube network is used to connect the satellite to the station, with the transit room being located at engineering south of the engi escape pod.
    • +
    • The AI Upload however has been moved north slightly and is connected directly to the bridge.
    • +
    • In addition, the Gravity Generator has been relocated from its prior position in engineering to the location of the old AI Upload, increasing its defence and logical positioning.
    • +
    + +

    11 April 2014

    +

    Jordie0608 updated:

    +
      +
    • Wood planks can be used to make wood walls and airlocks; flammability not included
    • +
    + +

    10 April 2014

    +

    Ikarrus updated:

    +
      +
    • Centcom officials have announced a new initiative to combat misuse of their Emergency Shuttle Service. After the shuttle has been recalled several times over the course of a simple work shift, Centcom will attempt to trace the signal origin and pinpoint its source for station authorities.
    • +
    +

    Steelpoint updated:

    +
      +
    • Thanks to Nanotrasen's Construction division, the brig has recieved a overhaul in its design, to increase ease of movement, including an addition of a "prisioner release room" and a insanity ward. +
    • Furthing concerns among commentators, Nanotrasen has shipped out additional security equipment to station armories, including Riot Shotguns, tear gas grenades, additional securitron units and military grade Ion Guns.
    • +
    • JaniCo have released a new unique product called the JaniBelt. Capable of holding most standard issue janitorial equipment, designed to help relive inventory management among station janitors. In addition the Jani Water Tank has had its reserve of space clenaer increased to 500 units, up from 250. +
    • +
    +

    Validsalad updated:

    +
      +
    • After concerns raised by security personel, new armor has been shipped that covers the lower waist and readjusts the helmet for comfort. +
    • In addition, the aging riot shield has been replaced with a newer, more modern, apperance. +
    • +
    + +

    03 April 2014

    +

    Ikarrus updated:

    +
      +
    • NT AI Firmware version 2554.03.03 includes a function to notify the master AI when a new cyborg is slaved to it.
    • +
    + +

    02 April 2014

    +

    Giacom updated:

    +
      +
    • The syndicate suit is now black and red, because black and red is the new red.
    • +
    • The Ruskie DJ Station now has a classy orange syndicate suit.
    • +
    • Security officers have been equipped with the latest in flashlight technology. You can find a SecLite™ inside your security belt or you can dispense one from the security vending machine.
    • +
    +

    Ikarrus updated:

    +
      +
    • Nanotrasen Construction division is pleased to announce the unveiling of our brand now state-of-the-art Space Station 13 v2.1.3!
    • +
    • -Scaffolding used during construction has been repurposed as an expanded maintenance around the station.
    • +
    • -Our new Emergency Transport Shuttle Mk III will be making its debut in times of crisis. Includes a new cargo area and extra security features.
    • +
    • -A redesigned brig will give security staff more peace of mind with added security features
    • +
    • -The armory is now protected by a motion alarm.
    • +
    • -The armory is now equipped with security hardsuits.
    • +
    • -A new command EVA wing has been added to EVA Storage. Station heads of staff will be able to make use of suits stored here.
    • +
    • -A new garden area will be made publicly available for everyone to enjoy some R&R; during their company-endorsed break periods
    • +
    • -A new Testing Lab has been added to the Science department for any field experiments that need to be run.
    • +
    • -The mining ore redemption machine has been relocated to the Cargo Delivery Office.
    • +
    + +

    01 April 2014

    +

    Aranclanos updated:

    +
      +
    • Made combat more hardcore for hardcore players like myself. This won't be reverted.
    • +
    +

    Malkevin updated:

    +
      +
    • Sacrifice Cult - Cult has received a massive overhaul to how it works, focusing more on cult magics and sacrificing unbelievers. The most important changes are:
    • +
    • Cult starts off with alot more cultists, 6 cultists below 30 players and 9 above. The HoP can no longer be a round start cultist but is still convertible.
    • +
    • Cultists start off with join, blood, self, and hell. These give the runes for the sacrifice and convert.
    • +
    • Conversions now require three cultists and converts no longer reward words, words must be obtained via sacrifice
    • +
    • Sacrificing players traps their soul in a soul stone, which can then be used on construct shells to implant the souls in them
    • +
    • Constructs shells can be summoned via a new rune (travel, hell, technology)
    • +
    • You can no longer convert the sacrifice target, you dozzy sods
    • +
    • Summoning Narsie when she is not an objective leads to !!FUN!!
    • +
    • Wrote a system to allow all mob types to be sacrificable - currently only corgis are in the new system
    • +
    • Holy Water will DECONVERT cultists, takes around 35 units and two minutes to succeed
    • +
    • Hitting a mob that contains holy water with a tome will convert that water to unholy water, conversely hitting any container that contains unholy water with a bible as chaplain will 'cleanse' the taint.
    • +
    • Unholy water works like a combination synaptazine and hyperzine, with a twist of branes dimarge and highly toxic to non-cultists
    • +
    • Cargo can order a religious supplies crate - it contains flasks of holy water, candles, bibles, and robes
    • +
    • Cultists have an innate ability to communicate to the cult hive mind (BE AWARE - THIS DOES A LOT OF DAMAGE), cultists can also communicate via the new Commune option on their tomes (the Read Tome option has been shifted under the Notes option)
    • +
    +

    MrStonedOne updated:

    +
      +
    • Cyborgs can now use AI click shortcuts. (shift click on doors opens them, etc) (including ones added below)
    • +
    • New silicon click shortcut: Control+Shift click on doors toggles access override
    • +
    • New silicon click shortcut: Control click turret controls toggles them on or off
    • +
    • New silicon click shortcut: Alt click turret controls toggles lethal on or off
    • +
    • Cyborg hotkey mode was massively improved. 1-3 selects module slot, q unloads the active module. use hotkeys-help as cyborg for more details
    • +
    + +

    31 March 2014

    +

    Ikarrus updated:

    +
      +
    • Fabricator blueprints for cyborg parts have been updated to allow the debugging of cyborg units prior to boot. To access the debug functions, assemble a cyborg following standard procedure. Before inserting the MMI, use a multitool on the cyborg body. Note that this update also moves designation data into the system files, so pens can no longer be used to name cyborgs.
    • +
    +

    MrPerson updated:

    +
      +
    • Toggling the "Play admin midis" preference will pause any playing songs. Turning midis back on will resume the current song where it was.
    • +
    • If there's a song playing while you have midis off and you then turn midis on, the current song will begin playing for you.
    • +
    + +

    28 March 2014

    +

    Aranclanos updated:

    +
      +
    • Workaround with the click cooldowns. They should feel faster. If you think that anything needs a click cooldown (like grilles, mobs, etc.), report it to me.
    • +
    • Here's the fun part, this is a test for the community and players, I hope I won't be forced to revert this and hear "this is why we can't have nice things". Again, if anything needs a cooldown, report it to me. Have fun with your fast clicks spessmans.
    • +
    + +

    25 March 2014

    +

    Ikarrus updated:

    +
      +
    • A security review committee has approved an update to all Nanotrasen airlocks to better resist cryptographic attacks by the enemy. +

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




    • +
    • Hair sprites have been given a visual lift. For best results, set your hair color to be slightly lighter than how you want it to look. For dark hair, do not use a color darker than 80% black.
    • +
    + +

    22 March 2014

    +

    Giacom updated:

    +
      +
    • Gravity is no longer beamed from CentCom! Instead, there is a new gravity generator stored near Engineering that will provide all the gravity for the station and the z level. Please remember that it gives off a lot of radiation when charging or discharging, so wear protection.
    • +
    +

    MrPerson updated:

    +
      +
    • Added a new, somewhat experimental system to delete things. This is basically a port from /vg/, so big thanks to N3X15.
    • +
    • As a result, bombs and the singularity should be much less laggy.
    • +
    • There may be issues with "phantom objects" or other problems with stuff that's suppoed to be deleted or objects interacting with deleted objects. Please report any issues right away!
    • +
    + +

    18 March 2014

    +

    Ikarrus updated:

    +
      +
    • NT R&D; releases AI Patch version 2553.03.18, allowing all Nanotrasen AIs to override the access restrictions on any airlock in case of emergency. Nanotrasen airlocks have been outfitted with new amber warning lights that will flash while the override is active. Should maintenance teams need to restore an airlock's restrictions without using the AI, pulsing the airlock's ID Scanner wire will reset the override.
    • +
    + +

    17 March 2014

    +

    Giacom updated:

    +
      +
    • Machines that had their programming overriden by a Malf AI will no longer attack loyal cyborgs; they will still attack cyborgs that aren't loyal, to the Malf AI that hacked them, though.
    • +
    • You only require a single unit of blood to mutate viruses now, instead of 5.
    • +
    + +

    15 March 2014

    +

    Steelpoint/Validsalad updated:

    +
      +
    • After a review with CentCom, all Security Officers will now begin their shifts with a Stun Baton in their backpack. To avoid inflating costs however all Stun Batons have been removed from Security lockers except from the brig.
    • +
    • After decades of usage CentCom has replaced the Security Uniform, Armor, Belt and Helmet with a newer, more modern design.
    • +
    + +

    14 March 2014

    +

    Ikarrus and Nienhaus updated:

    +
      +
    • Nanotrasen Corporate announced a revised dress codes primarily affecting senior station officers. A new uniform for Heads of Personnel will be shipped out to all NT Research stations.
    • +
    + +

    12 March 2014

    +

    Yota updated:

    +
      +
    • Cameras finally capture the direction you are facing.
    • +
    + +

    10 March 2014

    +

    Giacom updated:

    +
      +
    • Added two new plasma-level disease symptoms, both are very !FUN! and mess with your genetics.
    • +
    • Virologists now only need to use a single unit of virus food, mutagen or plasma to generate symptoms. You can take a single unit by using a dropper, if you change its unit transfer amount in the object tab..
    • +
    • Changed the map to make it harder to escape from the Labor Camp. Please continue using it.
    • +
    +

    Miauw updated:

    +
      +
    • Added changeling space suits. These allow changelings to survive in space, internals are not needed. They do not provide any sort of armor and slow your chemical regeneration.
    • +
    + +

    05 March 2014

    +

    Various Coders updated:

    +
      +
    • Ling rounds are LINGIER, with more lings at a given population.
    • +
    • Many simple animals can ventcrawl, including bats. All ventcrawlers must alt-click to ventcrawl.
    • +
    • An automatic tool to store and replace machine parts has been added to R&D.;
    • +
    • Most stuns have been reduced in from 10+ to 5 ticks in duration.
    • +
    • Shoes no longer speed you up.
    • +
    • Added fancy suits, which can be orderd from cargo.
    • +
    • Added sombrerors and ponches.
    • +
    • Cuff application time reduced 25%.
    • +
    • Fire will cause fuel tanks to explode.
    • +
    • Mutagen has been reduced in lethality. Notably, 15 units are not guaranteed to crit the recipient.
    • +
    + +

    03 March 2014

    +

    ChuckTheSheep updated:

    +
      +
    • Round-end report now shows what items were bought with a traitor's or nuke-op's uplink and how many TCs they used.
    • +
    +

    Drovidi Corv updated:

    +
      +
    • Facehuggers no longer die to zero-force weapons or projectiles like lasertag beams.
    • +
    +

    Incoming5643 updated:

    +
      +
    • Improved blob spores to zombify people adjacent to their tile.
    • +
    • If a hand-teleporter is activated while you're stuck inside a wall, you'll automatically go through it.
    • +
    +

    Miauw updated:

    +
      +
    • Decreased the lethality of Mutagen in small doses.
    • +
    +

    TZK13 updated:

    +
      +
    • Added Incendiary Shotgun Shells made at a hacked autolathe; Xenos be wary.
    • +
    +
    +

    26 February 2014

    +

    Incoming5643 updated:

    +
      +
    • Color blending Kitty Ears have returned.
    • +
    +
    + +
    +

    25 February 2014

    +

    Incoming5643 updated:

    +
      +
    • Colored burgers! Include a crayon in your microwave when cooking a burger and it'll come out just like a Pretty Pattie.
    • +
    • Fixed AI's being able to interact with syndicate bombs.
    • +
    +
    + +
    +

    24 February 2014

    +

    Ergovisavi updated:

    +
      +
    • Added Advanced Mesons and Night Vision Goggles to the protolathe.
    • +
    +

    Giacom updated:

    +
      +
    • Silicons no longer stop statues from moving when in sight.
    • +
    • Increased the health of statues.
    • +
    • Increased the range of statues's blinding spell.
    • +
    +

    HornyGranny updated:

    +
      +
    • Reduced the range of Violin notes.
    • +
    • Low quality violin midi-notes replaced with better .ogg-notes.
    • +
    +

    Incoming5643 updated:

    +
      +
    • Improved the Syndicate Implant bundle to contain freedom, uplink, EMP, adrenalin and explosive implanters.
    • +
    • Added Mineral Storeroom to R&D; containing the Ore Redemption Machine; no more assistants stealing your ore in the open hallway.
    • +
    +

    Miauw updated:

    +
      +
    • No more removing cursed horseheads.
    • +
    +

    Razharas updated:

    +
      +
    • Fixed infinite telecrystal exploit.
    • +
    +
    + +
    +

    19 February 2014

    +

    Aranclanos updated:

    +
      +
    • Removed the chance of your hat falling off when slipping.
    • +
    +

    Perakp updated:

    +
      +
    • Added Iatot's cyborg module selection transformation animations.
    • +
    +
    + +
    +

    17 February 2014

    +

    Ergovisavi updated:

    +
      +
    • Mining has been significantly overhauled. Hostile alien life has infested the western asteroid! Miners are given an equipment voucher to obtain equipment to protect themselves. There is a spare voucher in the HoP's office, should someone want to switch to mining mid-shift.
    • +
    • The Ore Redemption Machine has been added just outside of the Science wing. Ore goes in, Sheets go out, and points are tallied on the machine. Insert your ID to claim points, then spend them on goods at Mining Equipment Lockers. You require specific accesses to tell the Ore Redemption Machine to unload its sheets.
    • +
    • Should you not care for being eaten alive by horrible alien life, it is suggested you stick to the eastern asteroid, where there is no hostile alien life... though the yield on ore is not as good.
    • +
    • Most ore is no longer visible to the naked eye. You must ping it with a Mining Scanner (Available in all mining lockers) to locate nearby ore. Make sure to equip your mesons first, or it won't be visible.
    • +
    • Mesons no longer remove the darkness overlay, you must properly light your environment. Hull breaches to space can still be clearly seen, and it will still protect you from the singulo.
    • +
    • Mineral spawn rates have been significantly tweaked to cut down on unnecessary inflation of mineral economy.
    • +
    • The asteroid no longer has ambient power on the entire asteroid. AI's who go onto asteroid turf will slowly die of power loss. Mining outposts are unaffected.
    • +
    • Fixed an issue where projectiles shot by simple mobs or thrown would hit multiple times.
    • +
    +

    Fleure updated:

    +
      +
    • Reduced chicken crates to contain 1-3 chicks, down from 3-6
    • +
    • Increased fertile chicken egg chance from 10% to 25%
    • +
    +

    Yota updated:

    +
      +
    • Photograph now rendered crisp and clean, so that we may enjoy them in their 0.009 megapixel goodness.
    • +
    • Cameras should now capture more of what they should, and less of what they shouldn't.
    • +
    +
    + +
    +

    09 February 2014

    +

    ADamDirtyApe updated:

    +
      +
    • The lawyer now spawns with a Sec Headset.
    • +
    +

    Demas updated:

    +
      +
    • Banana peel size is based on banana size.
    • +
    • Bigger peels slip for longer than smaller ones. Remember that produce size is based on potency.
    • +
    • The clown now spawns with a decent sized banana.
    • +
    • The banana mortar now shoots 65 potency peels.
    • +
    +

    Giacom updated:

    +
      +
    • A new hostile statue mob, can only move when not being observed, tends to break lights and cause blindness.
    • +
    +

    Incoming5643 updated:

    +
      +
    • Blob Zombies! When a Blob Spore moves over a dead human body it will infect the body and revive it as a more powerful varient of the spore. Has double the health and deals more damage.
    • +
    +

    Neerti updated:

    +
      +
    • Sec Belts can now hold Stun Batons.
    • +
    • Stun Batons now only take 10 seconds to fully recharge.
    • +
    +

    Razharas updated:

    +
      +
    • Tables can now be used as an alternative way to craft makeshift items. Simply click-drag table to yourself bring up a list.
    • +
    +

    adrix89 updated:

    +
      +
    • Spray Bottles can no longer wet up to three tiles with water.
    • +
    • Spray Bottles have a third higher release volume that wets a single tile.
    • +
    • Water slip times are reduced to the same stun times as soap.
    • +
    +
    + +
    +

    08 February 2014

    +

    MrPerson updated:

    +
      +
    • Added a NanoUI for the SMES
    • +
    +

    Razharas updated:

    +
      +
    • Adds more constructible and deconstructable machines!
    • +
    • Added constructible miniature chemical dispensers, upgradable
    • +
    • Sleepers are now constructible and upgradable, open and close like DNA scanners, and don't require a console
    • +
    • Cryogenic tubes are now constructible and upgradable, open and close like DNA scanners, and you can set the cryogenic tube's pipe's direction by opening its panel and wrenching it to connect it to piping
    • +
    • Telescience pads are now constructible and upgradable
    • +
    • Telescience consoles are now constructible
    • +
    • Telescience tweaked (you can save data on GPS units now)
    • +
    • Teleporters are now constructible and upgradable, the console has a new interface and you can lock onto places saved to GPS units in telescience
    • +
    • Teleporters start unconnected. You need to manually reconnect the console, station and hub by opening the panel of the station and applying wire cutters to it.
    • +
    • Biogenerators are now constructible and upgradable
    • +
    • Atmospherics heaters and freezers are now constructible and upgradable and can be rotated with a wrench when their panel is open to connect them to pipes. Screw the board to switch between heater and freezer.
    • +
    • Mech chargers are now constructible and upgradable
    • +
    • Microwaves are now constructible and upgradable
    • +
    • All kitchen machinery can now be wrenched free
    • +
    • SMES are now constructible
    • +
    • Dragging a human's sprite to a cryogenic tube or sleeper will put them inside and activate it if it's cryo
    • +
    • Constructible newscasters, their frames are made with autolathes
    • +
    • Constructible pandemics
    • +
    • Constructible power turbines and their computers
    • +
    • Constructible power compressors
    • +
    • Constructible vending machines. Screw the board to switch vendor type.
    • +
    • Constructible hydroponics trays
    • +
    • Sprites for all this
    • +
    • This update will have unforeseen bugs, please report those you find at https://github.com/tgstation/-tg-station/issues/new if you want them fixed.
    • +
    • As usual, machines are deconstructed by screwing open their panels and crowbarring them. While constructing machines, examining them will tell you what parts you're missing.
    • +
    +
    + +
    +

    05 February 2014

    +

    Yota updated:

    +
      +
    • Handling a couple flashlights will no longer transform you into the sun. Each light source will have deminishing returns.
    • +
    • Inserting lights into containers should no longer dim other lights.
    • +
    +
    + +
    +

    03 February 2014

    +

    Demas updated:

    +
      +
    • Changes windoor and newscaster attack messages to be consistent with windows and grilles. This removes the distracting boldness from windoor attack messages, which is reserved for userdanger, and names the attacker.
    • +
    • Thrown items now play a sound effect on impact. The volume of the sound is based on the item's throwforce and/or weight class.
    • +
    • The fireaxe now has 15 throwforce, when previously it had only 1. But why would you throw it away, anyway?
    • +
    • Projectiles now play a sound upon impact. The volume of the sound depends on the damage done by the projectile. Damageless projectiles such as electrodes have static volumes. Practise laser and laser tag beams have no impact sound.
    • +
    • Added sear.ogg for the impacts of damaging beams such as lasers. It may be replaced if player feedback proves negative.
    • +
    +
    + +
    +

    02 February 2014

    +

    Demas updated:

    +
      +
    • Attack sounds for all melee weapons! No more silent attacks.
    • +
    • The volume of an object's attack sound is based on the weapon's force and/or weight class.
    • +
    • Welders, lighters, matches, cigarettes, energy swords and energy axes have different attack sounds based on whether they're on or off.
    • +
    • Weapons that do no damage play a tap sound. The exceptions are the bike horn, which still honks, and the banhammer, which plays adminhelp.ogg. Surely nothing can go wrong with that last one.
    • +
    • When you tap someone with an object, the message now uses "tapped" or "patted" instead of attacked. The horn still uses HONKED, and the banhammer still uses BANNED.
    • +
    • You won't get the "armour has blocked an attack" message for harmless attacks anymore.
    • +
    • Adds 5 force to the lighter when it's lit. Same as when you accidentally burn yourself lighting it.
    • +
    • Removes boldness from item attack messages on non-human mobs. The attack is bolded for a player controlling a non-human mob. Now your eyes won't jump to the chat when it's Pun Pun who's being brutalised.
    • +
    • Blood will no longer come out of non-human mobs if the attack is harmless.
    • +
    • Adds a period at the end of the catatonic human examine message. That's been bugging me for years.
    • +
    • The activation and deactivation sounds of toy swords, energy swords and energy shields are slightly quieter. Energy swords and shields are now slightly louder than toys.
    • +
    • You can no longer light things with burnt matches.
    • +
    • Match, cigarette and lighter attack verbs, forces and damage types change based on whether the object is lit or not.
    • +
    • Fixes a bug with the energy blade that kept it at weight class 5 after it was deactivated. Who cares, it disappears upon deactivation.
    • +
    • Changes the welder out of fuel message slightly to be less fragmented.
    • +
    • Removes dead air from a lot of weapon sound effects to make them more responsive. In other words, the fire extinguisher attack sound will play a lot sooner after you attack than before.
    • +
    • Equalised the peak volumes of most weapon sounds to be -0.1dB in an attempt to make volumes based on force more consistent across different sounds.
    • +
    +
    + +
    +

    01 February 2014

    +

    Ergovisavi updated:

    +
      +
    • Walking Mushrooms will now attack and eat each other! They're all a little unique from each other, no two shrooms are exactly alike, and a better quality harvest means stronger Walking Shrooms. Pit them against each other for your entertainment.
    • +
    • Each mushroom will have a different colored cap to identify them. When mushrooms eat each other, they get stronger. The resulting mushroom will drop more slices when cut down to harvest, and will have better quality slices.
    • +
    • Don't hurt them yourself, though, or you'll bruise them, and mushrooms won't get stronger from eating a bruised mushroom. If your mushroom faints, feed it a mushroom such as a plump helmet to get it back on its feet. It will slowly regenerate to full health eventually.
    • +
    +
    + +
    +

    30 January 2014

    +

    Balrog updated:

    +
      +
    • Syndicate Playing Cards can now be found on the Syndicate Mothership and purchased from uplinks for 1 telecrystal.
    • +
    • Syndicate Playing Cards are lethal weapons both in melee and when thrown, but make the user's true allegiance to the Syndicate obvious.
    • +
    • Sprites are courtesy of Nienhaus.
    • +
    +

    Demas updated:

    +
      +
    • Adds thud sounds to falling over
    • +
    • Known bug: Thuds play when cloning initialises or someone is put into cryo. This will be fixed.
    • +
    +

    Ergovisavi updated:

    +
      +
    • Gibtonite, the explosive ore, can now be found on the asteroid. It's very hard to tell between it and diamonds, at first glance.
    • +
    • Gibtonite deposits will blow up after a countdown when you attempt to mine it, but you can stop it with an analyzer at any time. It makes for a good mining explosive.
    • +
    • The closer you were to the explosion when you analyze the Gibtonite deposit, the better the Gibtonite you can get from it.
    • +
    • Once extracted, it must be struck with a pickaxe or drill to activate it, where it will go through its countdown again to explode!
    • +
    • Explosives will no longer destroy the ore inside of asteroid walls or lying on the floor.
    • +
    +

    Miauw updated:

    +
      +
    • Adds changeling arm blades that cost 20 chems and do 25 brute damage.
    • +
    • Arm blades can pry open unpowered doors, replace surgical saws in brain removal, slice tables and smash computers.
    • +
    +

    MrPerson updated:

    +
      +
    • Mobs now lie down via turning icons rather than preturned sprites.
    • +
    • You can lie down facing up or down and the turn can be 90 degrees clockwise or counterclockwise.
    • +
    • Resting will always make you lie to the right so you look good on beds.
    • +
    • Please report any bugs you find with this system.
    • +
    +

    Petethegoat updated:

    +
      +
    • Increased the walk speed. Legcuffed speed is unaffected, and is still suffering.
    • +
    • Sped up alien drones, they are now the same speed as sentinels.
    • +
    +
    + +
    +

    28 January 2014

    +

    Demas updated:

    +
      +
    • Adds thud sounds to falling over
    • +
    • Known bug: Thuds play when cloning initialises or someone is put into cryo. This will be fixed.
    • +
    +
    + +
    +

    26 January 2014

    +

    Balrog updated:

    +
      +
    • Syndicate Playing Cards can now be found on the Syndicate Mothership and purchased from uplinks for 1 telecrystal.
    • +
    • Syndicate Playing Cards are lethal weapons both in melee and when thrown, but make the user's true allegiance to the Syndicate obvious.
    • +
    • Sprites are courtesy of Nienhaus.
    • +
    +
    + +
    +

    25 January 2014

    +

    Miauw updated:

    +
      +
    • Adds changeling arm blades that cost 20 chems and do 25 brute damage.
    • +
    • Arm blades can pry open unpowered doors, replace surgical saws in brain removal, slice tables and smash computers.
    • +
    +
    + +
    +

    24 January 2014

    +

    Ergovisavi updated:

    +
      +
    • Gibtonite, the explosive ore, can now be found on the asteroid. It's very hard to tell between it and diamonds, at first glance.
    • +
    • Gibtonite deposits will blow up after a countdown when you attempt to mine it, but you can stop it with an analyzer at any time. It makes for a good mining explosive.
    • +
    • The closer you were to the explosion when you analyze the Gibtonite deposit, the better the Gibtonite you can get from it.
    • +
    • Once extracted, it must be struck with a pickaxe or drill to activate it, where it will go through its countdown again to explode!
    • +
    • Explosives will no longer destroy the ore inside of asteroid walls or lying on the floor.
    • +
    +
    + +
    +

    21 January 2014

    +

    MrPerson updated:

    +
      +
    • Mobs now lie down via turning icons rather than preturned sprites.
    • +
    • You can lie down facing up or down and the turn can be 90 degrees clockwise or counterclockwise.
    • +
    • Resting will always make you lie to the right so you look good on beds.
    • +
    • Please report any bugs you find with this system.
    • +
    +
    + +
    +

    19 January 2014

    +

    KazeEspada updated:

    +
      +
    • The water cooler is now stocked with paper cups. You can refill the cups by putting paper in it.
    • +
    +

    Rolan7 updated:

    +
      +
    • You can now sell mutant seeds, from hydroponics, to Centcom via the supply shuttle.
    • +
    • Fixes powersinks causing APCs to stop automatically recharging.
    • +
    +
    + +
    +

    17 January 2014

    +

    ManeaterMildred updated:

    +
      +
    • Changed the way the Gygax worked. It now has less defense and shot deflection, but is faster and have less battery drain per step.
    • +
    • Nerfed the Carbine's brute damage and renamed it to FNX-99 "Hades" Carbine.
    • +
    • Nerfed the Gygax defense from 300 to 250.
      + Nerfed the Gygax projectile deflection chance from 15 to 5.
      + Buffed the Gygax speed from 3 to 2, making it faster.
      + Reduced the battery use when moving from 5 to 3.
      +
      + The Mech Ion Rifle now has a faster cooldown, from 40 to 20.
      + Nerfed the carbine's Brute Damage from 20 to 5.
      +
      + Please post feedback to these changes on the forums. +







    • +
    +
    + +
    +

    15 January 2014

    +

    Dumpdavidson updated:

    +
      +
    • EMPs affect the equipment of a human again.
    • +
    • EMP flashlight now recharges over time and its description no longer reveals the illegal nature of the device.
    • +
    • EMP implant now has two uses.
      EMP kit now contains two grenades.
    • +
    +
    + +
    +

    14 January 2014

    +

    Fleure updated:

    +
      +
    • Added spider butchery.
    • +
    • Added spider meat, legs, and edible eggs.
    • +
    • Added new spider related meals.
    • +
    +

    Giacom updated:

    +
      +
    • Because of an emagged cyborg's explosion, the MMI will die with it.
    • +
    • The self-respiration symptom will now properly keep you from dying of oxygen loss.
    • +
    • The Stimulant symptom's activation chance was increased so you had a constant flow of hyperzine.
    • +
    +

    Incoming updated:

    +
      +
    • A new training bomb has been added to the armoury, which will allow you to train your wire cutting skills to disarm real syndicate bombs.
    • +
    +

    ManeaterMildred updated:

    +
      +
    • Updated research designs.
    • +
    • The Protolathe can now build a Ion Rifle.
    • +
    • The Exosuit Fabricator can now build a Mech Ion Rifle, a Mech Carbine and a Mech-Mounted Missile Rack.
    • +
    +

    SirBayer updated:

    +
      +
    • Armor now reduces damage by the protection percentage, instead of randomly deciding to half or full block damage by those percentages.
    • +
    • Shotguns, with buckshot shells, will fire a spread of pellets at your target, like a real shotgun blast.
    • +
    +
    + +
    +

    12 January 2014

    +

    VistaPOWA updated:

    +
      +
    • Added Syndicate Cyborgs.
    • +
    • They can be ordered for 25 telecrystals by Nuclear Operatives. A ghost / observer with "Be Operative" ticked in their game options will be chosen to control it.
    • +
    • Their loadout is: Crowbar, Flash, Emag, Esword, Ebow, Laser Rifle. Each weapon costs 100 charge to fire, except the Esword, which has a 500 charge hitcost. Each borg is equipped with a 25k cell by default.
    • +
    • Syndicate borgs can hear the binary channel, but they won't show up on the Robotics Control computer or be visible to the AI. Their lawset is the standard emag one.
    • +
    • Added two cyborg recharging stations to the Syndicate Shuttle.
    • +
    +
    + +
    +

    11 January 2014

    +

    Cheridan updated:

    +
      +
    • You can now upgrade laser pointers with micro laser parts. It will increase the chance of blinding people.
    • +
    +

    Errorage updated:

    +
      +
    • Cyborg modules now use a new UI, which is much quicker than a menu.
    • +
    +

    Giacom updated:

    +
      +
    • The game will now have all background operations disabled, this will result in smoother gameplay but may result in some spike lags, before being set back to normal. The gradually increasing lag should now be gone.
    • +
    • You can now emag the crusher, in disposals, to remove the safety. You can use a screwdriver to reset it to the default factory settings.
    • +
    • The toxin compensation symptom will stop giving you toxin damage while at full health.
    • +
    +

    JJRCop updated:

    +
      +
    • The new nuke toy can now be found in your local arcade machine.
    • +
    +
    + +
    +

    10 January 2014

    +

    ChuckTheSheep updated:

    +
      +
    • Morgue Trays can detect players in their bodies and will now change colour depending on a few things. Red = Dead body with no player inside. Orange = No body but items. Green = A dead body with a player inside.
    • +
    +

    Giacom updated:

    +
      +
    • You can whisper while in critical, but you will immediately die afterwards DRAMATICALLY. The closer you are to death, the less you can say.
    • +
    • The wizard won't spawn so much smoke after they blink.
    • +
    • The detective's forensic scanner was upgraded so that it can now scan from afar.
    • +
    • Made the ghost's follow button less buggy. Please make an issue report if it still bugs out.
    • +
    +

    Rumia29, Nienhaus updated:

    +
      +
    • A new alt RD uniform spawns in his locker.
    • +
    +
    + +
    +

    07 January 2014

    +

    Fleure updated:

    +
      +
    • Janitor now spawns with a service headset.
    • +
    • Backpack watertank slowdown decreased.
    • +
    +
    + +
    +

    04 January 2014

    +

    Razharas updated:

    +
      +
    • Constructable machines now depend on R&D; parts!
    • +
    • DNA scanner: Laser quality lessens irradiation. Manipulator quality drastically improves precision (9x for best part) and scanner quality allows you to scan suicides/ling husks, with the best part enabling the cloner's autoprocess button, making it scan people in the scanner automatically.
    • +
    • Clone pod: Manipulator quality improves the speed of cloning. Scanning module quality affects with how much health people will be ejected, will they get negative mutation/no mutations/clean of all mutations/random good mutation, at best quality will enable clone console's autoprocess button and will try to clone all the dead people in records automatically, together with best DNA scanner parts cloning console will be able to work in full automatic regime autoscanning people and autocloning them.
    • +
    • Borg recharger: Capacitors' quality and powercell max charge affect the speed at which borgs recharge. Manipulator quality allows borg to be slowly repaired while inside the recharges, best manipulator allows even fire damage to be slowly repaired.
    • +
    • Portable power generators: Capacitors' quality produce more power. Better lasers consume less fuel and reduce heat production PACMAN with best parts can keep whole station powered with about sheet of plamsa per minute (approximately, wasn't potent enough to test).
    • +
    • Autolathe: Better manipulator reduces the production time and lowers the cost of things(they will also have less m_amt and g_amt to prevent production of infinity metal), stacks' cant be reduced in cost, because thatll make production of infinity metal/glass easy
    • +
    • Protolathe: Manipulators quality affects the cost of things(they will also have less m_amt and g_amt to prevent production of infinity metal), best manipulators reduces the cost 5 times (!)
    • +
    • Circuit imprinter: Manipulator quality affects the cost, best manipulator reduce cost(acid insluded) 4 times, i.e. 20 boards per 100 units of acid
    • +
    • Destructive analyzer: Better parts allow items with less reliability in. Redone how reliability is handled, you now see item reliability in the deconstruction menu and deconstructing items that has same or one point less research type level will rise the reliability of all known designs that has one or more research type requirements as the deconstructed item. Designs of the same type raise in reliability more. Critically broken things rise reliability of the design drastically. Whole reliability system is not used a lot but now at least on the R&D; part it finally matters.
    • +
    +
    + +
    +

    02 January 2014

    +

    Demas updated:

    +
      +
    • Added different colours to departmental radio frequencies. Now you'll be able to filter out or pay attention to each frequency a lot easier.
    • +
    +

    Fleure updated:

    +
      +
    • Fixed bruisepacks and ointments not working.
    • +
    • Fixed injecting/stabbing mouth or eyes when only thick suit worn.
    • +
    +
    + +
    +

    01 January 2014

    +

    Errorage updated:

    +
      +
    • The damage overlay for humans starts a little later than before. It used to start at 10 points of fire + brute damage, it now starts at 35.
    • +
    +
    + +
    +

    31 December 2013

    +

    Fleure updated:

    +
      +
    • Paper no longer appears with words on it when blank input written or photocopied
    • +
    • Vending machine speaker toggle button now works
    • +
    • Building arcade machines works again
    • +
    +
    + +
    +

    27 December 2013

    +

    Giacom updated:

    +
      +
    • Light explosions will no longer gib dead bodies anymore. C4 will function the same and gib anything attached.
    • +
    • Syringe gun projectiles will now display a message when shots are deflected by space suits, biosuits and etc...
    • +
    • You can now move out of sleepers by moving, again.
    • +
    +

    Miauw updated:

    +
      +
    • Monkeys now have a resist button on their HUD.
    • +
    +
    + +
    +

    21 December 2013

    +

    Bobylein updated:

    +
      +
    • Labcoats can now store bottles, beakers, pills, pill bottles and paper.
    • +
    +

    Giacom updated:

    +
      +
    • The Labor Camp has been changed based on feedback. Ore boxes added, internals added, safety pickaxes/shovels (might revert if unliked).
    • +
    • Labor Camp prisoners, who have earned enough points for freedom, will now have to be alone in the shuttle to move it and to open the middle door; this is in order to prevent free'd prisoners from releasing their comrades.
    • +
    • Monkeys no longer walk away when being pulled or grabbed.
    • +
    • Anti-breach shield generators have a greater range, and will cover more exposed space tiles.
    • +
    +

    Jordie updated:

    +
      +
    • Blowing up borgs from the Robotics Console will now actually make them explode. Emagged Cyborgs will explode even more.
    • +
    +

    Nienhaus updated:

    +
      +
    • Added more poster.
    • +
    +

    Perakp updated:

    +
      +
    • You can no longer slip while laying down.
    • +
    +

    RobRichards, Validsalad updated:

    +
      +
    • Added new sprites for the sec-hailer, SWAT gear and riot armour.
    • +
    +
    + +
    +

    18 December 2013

    +

    Adrinus updated:

    +
      +
    • Playing cards, just like the real thing! Play poker, blackjack, go fish, the limits are limitless! Recommended to use space cash as the poker chips for now
    • +
    +

    Giacom updated:

    +
      +
    • THE REALISM: Injectors such as syringes, parapens and hypos will not penetrate coveralls with thick material, this includes space suits, biosuits, bombsuits, and their head slot equivalent. Injectors now also consider where you aim, if you aim for the head it will try to use it through the head slot, otherwise it will aim for the body. To clarify, if you are wearing a space helmet and a doctor tries to inject you while aiming at your head, it will protect you until they aim for the unprotected body; same story for wearing a space suit and not a helmet.
    • +
    • The syndicate shuttle has been heavily upgraded with a brand new technology which allows the blast doors to the entrance of the shuttle to AUTOMATICALLY close. Whoa. This brand new technology will help keep out those snoopy crew members.
    • +
    • Lowered the cooldown of creating virus cultures to 5 seconds. You now only need to mix one unit of synaptizine, in a blood full of an advance virus, to get it to remove a random symptom.
    • +
    +

    Incoming updated:

    +
      +
    • Rounds will no longer end when the wizard dies and there are still apprentices or traitors/survivors..
    • +
    +

    JJRcop updated:

    +
      +
    • Transit tube tweaks. You can now put someone into a transit tube pod using grabs and you can empty a transit tube pod by clicking on it.
    • +
    +

    Jordie0608 updated:

    +
      +
    • Replaced the digital valves in atmospherics with pumps.
    • +
    +
    + +
    +

    14 December 2013

    +

    Incoming updated:

    +
      +
    • Magic Mania! Powerful new magical tools and skills for wizard and crew alike!
    • +
    • Beware the new Summon Magic spell, which will grant the crew access to magical tools and spells and cause some to misuse it!
    • +
    • One Time Spellbooks that can be spawned during summon magic that can teach a low level magic skill to anyone! Beware the effects of reading pre-owned books, the magical rights management is potent! +
    • Magical Wands that can be spawned during Summon Magic! They come in a variety of effects that mimic both classical wizard spells and all new ones. They come precharged but lack the means to refill them once their magical energy is depleted... Fire efficently!
    • +
    • Be aware of the new Charge spell, which can take normally useless spent wands and give them new life! This mysterious effect has been found to wear down the overall magical potency of wands over time however. Beyond wands the clever magical user can find ways to use this spell on other things that may benefit from a magical charge...
    • +
    • The Staff of Resurrection, which holds intense healing magics able to defeat death itself! Look out for this invaluable magical tool during castings of Summon Magic.
    • +
    • Be on the lookout for a new apprentice! This noble mage is a different beast from most wizards, trained in the arts of defending and healing. Too bad he still works for the wizard!
    • +
    +
    + +
    +

    09 December 2013

    +

    Giacom updated:

    +
      +
    • New colourful ghost sprites for BYOND members. Sprites by anonus.
    • +
    +
    + +
    +

    08 December 2013

    +

    Rolan7 updated:

    +
      +
    • Leather gloves can be used to removes lights.
    • +
    • Plant, ore, and trash bags have a new option to pick up all items of single type
    • +
    • Creating astroturf now works like sandstone, converting all the grass at once.
    • +
    • Uranium and radium can be used instead of mutagen. 10 can mutate species, 5 or 2 mutate traits. Highly toxic.
    • +
    • Plants require a little light to live. Mushroom require even less (2 units vs 4) and take less damage.
    • +
    +
    + +
    +

    05 December 2013

    +

    Razharas updated:

    +
      +
    • Reworked how ling stings are done, now when you click a sting in the changeling tab it becomes current active sting, the icon of that sting appears under the chem counter, alt+clicking anyone will sting them with current sting, clicking the icon of the sting will unset it.
    • +
    • Monkeys have ling chem counter and active sting icons in their UI.
    • +
    • Going monkey -> human will try to equip the human with everything on the ground below it.
    • +
    +
    + +
    +

    02 December 2013

    +

    Giacom updated:

    +
      +
    • A less annoying virology system! From now on, you can only get low level virus symptoms from virus food, medium level virus symptoms from unstable mutagen and high level virus symptoms from liquid plasma. You can find a list of symptoms, and which chemicals are required to get them, here: http://wiki.ss13.eu/index.php/Infections#Symptoms_Table
    • +
    • The virologist starts with a bottle of plasma in his smart fridge.
    • +
    • Made it so you cannot accidentally click in the gaps between chem masters.
    • +
    +
    + +
    +

    01 December 2013

    +

    cookingboy3 updated:

    +
      +
    • Added three new buttons to the sandbox panel.
    • +
    • Removed canister menu, replaced it with buttons.
    • +
    • Players can no longer spawn "dangerous" canisters in sandbox, such as Plasma, N20, CO2, and Nitrogen.
    • +
    +
    + +
    +

    30 November 2013

    +

    Yota updated:

    +
      +
    • The identification console will now require that ID and job names follow the same restrictions as player names.
    • +
    • NTSL scripts and parrots should now handle apostrophes and such properly. It&#39;s about time.
    • +
    • NTSL scripts now have a better sense of time.
    • +
    +
    + +
    +

    28 November 2013

    +

    Malkevin updated:

    +
      +
    • Made the suit storage on the Captain's Tunic more useful than just a place to store your e-o2 tank. You can now store the nuke disk, stamps, medal box, flashes and melee weapons (mainly intended for the Chain of Command), and of course - smoking paraphernalia
    • +
    +
    + +
    +

    27 November 2013

    +

    RobRichards updated:

    +
      +
    • Nanotrasen surgeons are now certified to perform Limb replacements, The robotic parts used in construction of Nanotrasen Cyborgs are the only parts authorized for crew augmentation, these replacement limbs can be repaired with standard welding tools and cables.
    • +
    +
    + +
    +

    17 November 2013

    +

    Laharl Montgommery updated:

    +
      +
    • AI can now anchor and unanchor itself. In short, it means the AI can be dragged, if it wants to.
    • +
    +
    + +
    +

    29 September 2013

    +

    RobRichards updated:

    +
      +
    • Nanotrasen Cyborg Upgrades:
      +Standard issue Engineering cyborgs now come equipped with replacement floor tiles which they can replenish at recharge stations.
    • +
    +
    + + +
    +

    28 September 2013

    +

    Ergovisavi updated:

    +
      +
    • Mobs can now be lit on fire. Wearing a full firesuit (or similar) will protect you. Extinguishers, Showers, Space, Cryo, Resisting, being splashed with water can all extinguish you. Being splashed with fuel/ethanol/plasma makes you more flammable. Water makes you less flammable.
    • +
    +
    + + +
    +

    26 September 2013

    +

    Cheridan updated:

    +
      +
    • Nanotrasen Anomaly Primer:
      + Unstable anomalies have been spotted in your region of space. These anomalies can be hazardous and destructive, though our initial encounters with these space oddities has discovered a method of neutralization. Method follows.
      +

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

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

    21 September 2013

    +

    Malkevin updated:

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

    19 September 2013

    +

    Malkevin updated:

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

    17 September 2013

    +

    SuperSayu updated:

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

    13 September 2013

    +

    JJRcop updated:

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

    3 September 2013

    +

    Cael_Aislinn updated:

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

    2 September 2013

    +

    Cael_Aislinn updated:

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

    1 September 2013

    +

    Cael_Aislinn updated:

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

    12 September 2013

    +

    AndroidSFV updated:

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

    31 August 2013

    +

    Cael_Aislinn updated:

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

    30 August 2013

    +

    Cael_Aislinn updated:

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

    21 August 2013

    +

    Dumpdavidson updated:

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

    18 August 2013

    +

    Delicious updated:

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

    13 August 2013

    +

    Giacom updated:

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

    12 August 2013

    +

    Giacom updated:

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

    10 August 2013

    +

    Malkevin updated:

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

    6 August 2013

    +

    Giacom updated:

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

    5 August 2013

    +

    Kaze Espada updated:

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

    4 August 2013

    +

    Giacom updated:

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

    31 July 2013

    +

    Ricotez updated:

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

    21 July 2013

    +

    Malkevin updated:

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

    21 July 2013

    +

    Cheridan updated:

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

    16 July 2013

    +

    Malkevin updated:

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

    15 July 2013

    +

    Giacom updated:

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

    7 July 2013

    +

    Giacom updated:

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

    27 June 2013

    +

    Ikarrus updated:

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

    16 June 2013

    +

    Khub updated:

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

    15 June 2013

    +

    Carnie updated:

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

    Petethegoat updated:

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

    9 June 2013

    +

    Ikarrus updated:

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

    6 June 2013

    +

    Giacom updated:

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

    4 June 2013

    +

    Dumpdavidson updated:

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

    2 June 2013

    +

    Ikarrus updated:

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

    25 May 2013

    +

    Ikarrus updated:

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

    14 May 2013

    +

    Ikarrus updated:

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

    11 May 2013

    +

    Malkevin updated:

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

    7 May 2013

    +

    Ikarrus updated:

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

    5 May 2013

    +

    Rolan7 updated:

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

    2 May 2013

    +

    Malkevin updated:

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

    30 April 2013

    +

    Ikarrus updated:

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

    24 April 2013

    +

    Carnie updated:

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

    26 April 2013

    +

    Aranclanos updated:

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

    Ikarrus updated:

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

    23 April 2013

    +

    Malkevin updated:

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

    22 April 2013

    +

    Malkevin updated:

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

    22 April 2013

    +

    Cheridan updated:

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

    17 April 2013

    +

    Giacom updated:

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

    10 April 2013

    +

    Cheridan updated:

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

    9 April 2013

    +

    Ikarrus updated:

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

    4 April 2013

    +

    Cheridan updated:

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

    28 March 2013

    +

    Carnie updated:

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

    14 March 2013

    +

    Major_sephiroth updated:

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

    13 March 2013

    +

    Elo001 updated:

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

    8 March 2013

    +

    Kor updated:

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

    6 March 2013

    +

    Petethegoat updated:

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

    24 February 2013

    +

    Ikarrus updated:

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

    Faerdan updated:

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

    22 February 2013

    +

    Petethegoat updated:

    +
      +
    • Added cavity implant surgery.
    • +
    • Additionally, surgery must now be performed with help intent. Some procedures have also been updated. + As always, check the wiki for details.
    • +
    +
    + +
    +

    18 February 2013

    +

    Ikarrus updated:

    +
      +
    • The AI has been moved to Research Division, and Telecomms has been moved into the former AI chamber. Affected areas: Telecoms Satellite, Research Division South & Command Sector.
    • +
    +

    Incoming updated:

    +
      +
    • Added three new types of surgery- lipoplasty, plastic surgery, and gender reassignment.
    • +
    +

    Kor updated:

    +
      +
    • The RD has lost access to telecomms, and basic engineers have gained it.
    • +
    +
    + +
    +

    14 February 2013

    +

    Petethegoat updated:

    +
      +
    • Updated surgery: you now initiate surgery with surgical drapes or a bedsheet. Most procedures have changed, check the wiki for details. Currently it's pretty boring, but this paves the way for exciting new stuff- new procedures are very simple to add. Report any bugs directly to me, or on the issue tracker.
    • +
    +
    + +
    +

    13 February 2013

    +

    Giacom updated:

    +
      +
    • There are now hackable wires for the PA computer. To open the interface, click on it while the wires are exposed/panel is open. All but one wire will do something interesting, see if you can figure it out. You can also attach signallers to the wires so have fun remotely releasing the singularity.
    • +
    • New staff of animation icon by Teh Wolf!
    • +
    • You can now hack plastic explosives (C4)!
    • +
    • You can now use NTSL to send signals! With the function signal(frequency, code) you can create some clever ways to trigger a bomb. NTSL also has two new additions; return in the global scope will now stop the remaining code from executing and NTSL now has "elseif"s, huzzah!
    • +
    +

    Kor "I'm quitting I swear" Phaeron updated:

    +
      +
    • You've been asking for it for years, it's finally here. Wizards can spend points to buy apprentices.
    • +
    • A new wizard artefact, the scrying orb.
    • +
    • The spellbook now has descriptions of spells/items visible BEFORE you purchase them.
    • +
    +

    Petethegoat updated:

    +
      +
    • Traitors with the station blueprints steal objective can now use a photo of the blueprints instead!
    • +
    +
    + +
    +

    11 February 2013

    +

    SuperSayu updated:

    +
      +
    • Signallers, prox sensors, mouse traps and infrared beams can now be attacheed to grenades to create a variety of mines.
    • +
    • A slime core can be placed in a large grenade in place of a beaker. When the grenade goes off, the chemicals from the second container will be transfered to the slime core, triggering the usual reaction.
    • +
    +
    + +
    +

    10 Feburary 2012

    +

    Ikarrus updated:

    +
      +
    • Implants can now be surgically removed. Hint: They're inside the skull.
    • +
    +
    + +
    +

    07 February 2012

    +

    Giacom updated:

    +
      +
    • The return of the Nanotrasen Scripting Language! (NTSL) If you haven't heard of NTSL, it is a scripting language within a game for telecomms. Yes, you can create scripts to interact with the radio! For more information, head here: http://wiki.nanotrasen.com/index.php?title=NT_Script But before you do, if you are not an antag, do not create bad scripts which hinders communication.
    • +
    • Cameras, mulebots, APCs, radios and cyborgs can have signallers attached to their wires, like airlocks!
    • +
    • Cameras have non-randomized wires and the power wire when pulsed will now toggle the camera on and off.
    • +
    • Cyborgs have a new wire, the lockdown wire! It will disable/enable the lockdown of a Cyborg when pulsed.
    • +
    • The traffic control computer (or more commonly known as the computer which lets you add NTSL scripts) will now have a user log, which will log all user activity. Other users can then view that log and see who has been uploading naughty scripts!
    • +
    • NTSL has two new functions! time() and timestamp(format) will help you increase the range of types of scripts you can make, especially time(); since you can then make the scripts know the different between each execution by storing the results in memory.
    • +
    • Two new advance disease symptoms! Their names are "Longevity" and "Anti-Bodies Metabolism". Have fun experimenting with them!
    • +
    +
    + + +
    +

    31 January 2013

    +

    Kor "Even in death I still code" Phaeron updated:

    +
      +
    • Four new slime types with their own reactions and two new reactions for old slimes.
    • +
    • Put a suit of reactive teleport armour back in the RD's office.
    • +
    • Chemistry now has two dispensers (with half charge each) so both chemists can actually work at the same time.
    • +
    +
    + + +
    +

    27 January 2013

    +

    Ikarrus updated:

    +
      +
    • Security frequency chatter now appears in cyan (Similar to how command is gold)
    +

    Cheridan updated:

    +
      +
    • The plant bags in Hydroponics lockers have been replaced with upgraded models with seed-extraction tech. Activate with via right-click menu or Objects verb tab.
    • +
    • Obtaining grass tiles works a bit different now: grass is harvested as a normal plant item, clicking on it in-hand produces the tile.
    • +
    +
    + +
    +

    26 January 2013

    +

    Pete updated:

    +
      +
    • Added hugging and kicking. I also updated the text styles for clicking on humans in most intents, but they should be pretty much the same.
    • +
    +
    + +
    +

    25 January 2013

    +

    Errorage updated:

    +
      +
    • All the equipment you spawn with will now contain your fingerprints, giving the detective more ability to tell where items came from and if a crewmember has changed clothing.
    • +
    +
      +
    • Better explosions: Explosion spreading will now be determined by walls, airlocks and poddoors and not just a flat circle.
    • +
    +
    + +
    +

    20 January 2013

    +

    Cheridan updated:

    +
      +
    • Chickens will now lay a certain number of eggs after being fed wheat, rather than just laying them whenever they felt like it. No more chickensplosions.
    • +
    +
    + +
    +

    16 January 2013

    +
      +
    • Department Security can now be runned: +
      Department Security decentralizes security by assigning each officer to a different department. They will be given the radio channel and access to their assigned department along with a security post. The brig has been remapped to be smaller to accomodate this change. +
      To run DeptSec: Before compiling, server operators must
      tick jobs.dm (in WorkInProgress/Sigyn/Department Sec) and use map 2.1.1 instead of 2.1.0.
    • +
    +
    + +
    +

    /tg/station 13 Presents

    +

    Directed by S0ldi3rKr4s0

    +

    & produced by Petethegoat

    +
      +
    • Curse of the Horseman.
    • +
    +
    + +
    +

    12 January 2013

    +

    Cael Aislinn updated:

    +
      +
    • Spiders which will breed and spread through vents. Different classes of vents. AI controlled only at the moment.
    • +
    • Farm animals! Cows, goats and chickens are now available. You can order them at Cargo Bay.
    • +
    +

    Giacom updated:

    +
      +
    • Staff of animation mimics will no longer care whether you are holding the staff or not, they will never attack their creator.
    • +
    • Brainrot will only need alkysine to be cured.
    • +
    • New spider infestation event based on Cael's spiders. The announcement will be the same as alien infestations.
    • +
    +
    + +
    +

    11 January 2013

    +

    Giacom updated:

    +
      +
    • Plasma (Air) will give the breather the plasma reagent, for a toxic effect, instead of just straight damage.
    • +
    • The agent card will now work inside PDAs/Wallets; meaning the AI won't be able to track you.
    • +
    +
    + +
    +

    09 January 2013

    +

    Malkevin updated:

    +
      +
    • The owl mask now functions as a gasmask for increased crimestopping power.
    • +
    +
      +
    • Adds the missing icons for the arrest statuses of Parolled and Released, as well as a little blinking icon for chemical implants.
    • +
    + + +
    +

    08 January 2013

    +

    Cael Aislinn & WJohnston updated:

    +
      +
    • Many new icons for aliens (death, sleeping, unconscious, neurotox, thrown/impregnated facehugger etc)
    • +
    • Alien larva can now be removed by dangerous and unnecessary surgery (and actually chestburst if they aren't).
    • +
    • Alien larva now have sprites to represent their growth: bloody at 0%, pale at 25% and 75% the normal deep red.
    • +
    • New icon overlays for representing alien embryo progression.
    • +
    + +
    +

    07 January 2013

    +

    Kor updated:

    +
      +
    • Four new slime types with their own extract reactions have been added. Sprites this time were created by Reisyn, SuperElement, and LePinkyFace.
    • +
    + +
    +

    02 January 2013

    +

    Kor updated:

    +
      +
    • Slime breeding! There are now 13 varities of slime, each with its own extract reaction (inject five units of plasma). Some of these reactions are reused from the old cores, some are new. As to breeding, each colour of slime has a series of other slimes it may mutate into when it reproduces.
    • +
    +

    Giacom updated:

    +
      +
    • You can now use wallets as IDs and equip them in your ID slot.
    • +
    • Firesuits are once again effective at protecting you from heat. The flames themselves will still hurt you, even with a firesuit. The damage protection is much better with a firesuit though.
    • +
    • Engineering starts with a PACMAN generator for jump starting the singularity if the power runs out of the SMES. 30 plasma spawns in Secure Storage inside the crate, to use as fuel for the generator.
    • +
    + +
    +

    31 December 2012

    +

    Giacom updated:

    +
      +
    • Simple animals (Corgis, Cats, Constructs, Mice, Etc...) can now pull people.
    • +
    • You can quickly stop pulling on someone by pulling them, while they're already being pulled by you. For example, CTRL+Click on something you are pulling to quickly stop pulling it.
    • +
    + +
    +

    30 December 2012

    +

    Giacom updated:

    +
      +
    • Emitters now require to be wired in order to work. When there is not enough power it will stop shooting until there is enough power, meaning you do not have to turn it back on, just get the power flowing.
    • +
    • You can order shield generators from cargo. Teleporter access is required to open the crate.
    • +
    +

    Ikarrus updated:

    +
      +
    • Map: Reorganized the Command Sector. The Captain has his own private quarters in addition to his office.
    • +
    + +
    +

    26 December 2012

    +

    Ikarrus updated:

    +
      +
    • An agent card is now required to use doors and controls on the Syndicate Shuttle (Nuke).
    • +
    • Scanning gas tanks is now a PDA-cart function. Only Atmos and Science PDA carts have this function. Have fun mislabelling gas tanks!
    • +
    + +
    +

    23 December 2012

    +

    Giacom updated:

    +
      +
    • The syndicate Military PDA will not show up on possible PDAs to message anymore, even when the receive/signal is turned on. You can still send messages and people can still reply to you.
    • +
    • You can now sell processed plasma for supply points. The conversion rate is 2 plasma sheets for 1 point. You must put the plasma in a crate for it to count.
    • +
    • The mecha toy prize promotion has officially ended. You can no longer redeem all 11 action mecha figures for a real mech. New toy redeeming promotions in the future will be considered.
    • +
    + +
    +

    21 December 2012

    +

    Ikarrus updated:

    +
      +
    • You can now use . to speak over headset department channels in addition to the : and # characters.
    • +
    + +
    +

    19 December 2012

    +

    Nodrak updated:

    +
      +
    • You can now use # to speak over headset department channels. For example say "#e Hello" will say "Hello" over the engineering channel. say ":e Hello" will still work as it always has.
    • +
    + +
    +

    16 December 2012

    +

    Giacom updated:

    +
      +
    • You can now create your own solar arrays! Order the solar pack crate and you'll receive 21 solar assemblies, 1 electronic which you can put into an assembly to make it a solar tracker and finally the solar computer circuit board. You will get more detailed instructions in the crate, on a piece of paper. Engineering will also start with this crate to help repair destroyed solar arrays.
    • +
    +

    Petethegoat updated:

    +
      +
    • Added a new option to the key authorisation devices. It removes the maintenance access requirement from all doors. It's irreversible, so only use it in an emergency!
    • +
    + +
    +

    15 December 2012

    +

    Ikarrus updated:

    +
      +
    • Swapped the locations of the Library and Chapel. Thanks to killerz104 for the remap.
    • +
    • Partial remap of atmos. Monitoring and Refill stations are now the same room.
    • +
    • Toxins Mixing should be working properly again.
    • +
    + +
    +

    12 December 2012

    +

    Ikarrus updated:

    +
      +
    • Robotics is now a full Science department.
    • +
    • Completely remapped Research Division, Robotics, Medbay, and the Library.
    • +
    • Partially remapped Cargo Bay, Mining Dock, Engineering, and Atmospherics.
    • +
    • Changed the access of the HoS and HoP. For a list, refer to their respective wiki pages.
    • +
    +

    Errorage updated:

    +
      +
    • Miners now have to go through cargo to reach the Mining Dock.
    • +
    +

    Petethegoat updated:

    +
      +
    • The Detective's revolver no longer cares about how cool you look. It now spawns in his locker.
    • +
    • Added new inhands for most energy weapons, by Flashkirby!
    • +
    +

    Giacom updated:

    +
      +
    • Disintegrate (EI NATH) will leave behind the brain of the victim. Possible productive uses include: trophies, looking awesome as you gib someone and only their brain remains, people to talk to when you get an MMI, pocket brains, a way to get back into the game if the wizard didn't grab your brain and stuffed it into his bag.
    • +
    + +
    +

    07 December 2012

    +

    Giacom updated:

    +
      +
    • The detective's scanner was upgraded, it can now scan for reagents in items and living beings. Potential uses include, scanning dead bodies for leftover poison or scanning items to see if they have been spiked.
    • +
    • You can now attach photos to newscaster news feeds and wanted posters.
    • +
    • You can now emag buttons to remove access from them.
    • +
    • The CentComm. Report has been changed so it no longer names potential antagonists. It will just announce the potential round type instead.
    • +
    + +
    +

    05 December 2012

    +

    Cheridan updated:

    +
      +
    • Agent cards have been upgraded with microscanners, allowing operatives in the field to copy access levels off of other ID cards.
    • +
    +

    Ikarrus updated:

    +
      +
    • The Chief Medical Officer, Research Director, Chief Engineer, and Lawyers now have basic Brig access (corridor only)
    • +
    • Merged Mining and Cargo radio channels into the Supply Radio. To use the supply channel, use :u
    • +
    • Mining Dock remapped to be more compact and closer to cargo.
    • +
    +

    Giacom updated:

    +
      +
    • The wizard's fireball spell is once again dumbfire. It will fire in the direction of the wizard instead of having to choose from a list of targets and then home in on them.
    • +
    +
    + +
    +

    02 December 2012

    +

    Giacom updated:

    +
      +
    • Added a new artefact called the "Staff of Animation". You can get it in the Wizard's Spellbook. It will animate objects and items, but not machines, to fight for you. The animated objects will not attack the bearer of the staff which animates them, meaning if you lose your staff, or if it gets stolen, your minions will turn on you.
    • +
    +
    + +
    +

    30 November 2012

    +

    Petethegoat updated:

    +
      +
    • Janitor has recieved a slightly upgrade mop bucket. The old one is still there too.
    • +
    +

    Ikarrus updated:

    +
      +
    • Swapped the locations of the Vault and Tech Storage.
    • +
    • Cargo Techs, Miners, and Roboticists no longer start with gloves. They are still available from their lockers.
    • +
    +
    + +
    +

    28 November 2012

    +

    Kor updated:

    +
      +
    • Slimes have replaced roros (finally)! Right now they are functionally identical, but massive expansion of slimes and xenobio is planned. Sprites are by Cheridan.
    • +
    +
    + +
    +

    25 November 2012

    +

    Giacom updated:

    +
      +
    • Added new very high level symptoms which are only obtainable in the virus crate. Virus crate will also come with mutagen.
    • +
    +

    Petethegoat updated:

    +
      +
    • Removed clown planet! It'll return shortly in away mission form.
    • +
    +

    Ikarrus updated:

    +
      +
    • Added Gateway access. Only the RD, HoP, and Captain start with this.
    • +
    • New access levels in the brig:
      -Brig access now opens the front doors of the brig, as well as other lower-risk security areas.
      -Security access allows you into the break room and equipment lockers.
      -Holding Cells allows you to use brig timers and lets you in the Prison Wing.
      -The Detective no longer has Security Equipment access.
    • +
    • Significantly increased max cloneloss penalty for fresh clones to 40%.
    • +
    +
    + +
    +

    23 November 2012

    +

    Giacom updated:

    +
      +
    • Simplified detective stuff. The high-res scanner is gone and instead the detective's normal scanner will instantly report all fingerprints, dna and cloth fibers in full. This was needed because the system took too long to work with and disencouraged detectives. Not only that, it made detectives less of a threat for antagonists and made possible scenerios, such as framing someone by changing fingerprints with someone else, impratical. To replace the computer, the detective will have a full medical computer with access to it. Not only that, but his useless filing cabinet will be replaced with an empty one for serious investigators. Along with this, are fingerprint cards and built-in PDA scanning, as all of security had access to it which was really the detective's thing. The new scanner will also log every finding and you can print them out as a report by clicking the scanner while it is in your active hand.
    • +
    • You can toggle the pressure of your sprayer by clicking on it while it is in your active hand. With pressure, the sprayer will spray 10 units on the floor, otherwise it sprays 5. You'll need to turn pressure on to spray water on the floor and make it slippery.
    • +
    • AIs in intellicards can no longer move their camera. This will limit them in ability but without making creating and carding an AI to have as a personel door opener impossible.
    • +
    • Telecommunication Busses can now be set to change the frequency of a signal. (Allowing you to say.. set the command channel to broadcast to the common channel).
    • +
    • Telecommunication was changed to be more effecient. Because of this, Relays don't need a broadcaster or a receiver and you can setup a relay on it's own. You can still disable sending and or receiving from the relay's interface.
    • +
    +

    Zelacks updated:

    +
      +
    • Plant Analysers now work on seed bags.
    • +
    +
    + +
    +

    21 November 2012

    +

    Petethegoat updated:

    +
      +
    • The nuke shuttle can now travel at will, and to any location. When travelling from syndicate space to the station, (and vice versa), it will travel through hyperspace.
    • +
    +

    Carn updated:

    +
      +
    • Changed savefile structure. There's a bunch of unused files left lying around so old savefiles will be purged. Sorry for the inconvenience. Many preferences have been moved to the Preferences verb tab. Everything in that tab is persistent between rounds (it updates your savefile, so even DCing won't reset them). Enjoy x
    • +
    +

    Phol updated:

    +
      +
    • Added female sprites for most mutant races.
    • +
    +

    Cheridan updated:

    +
      +
    • SSU manufacturers have issued a product recall! It seems old models shipped with faulty wiring, causing them to short-circuit.
    • +
    +
    + +
    +

    20 November 2012

    +

    Kor updated:

    +
      +
    • Added Exile Implants to the Gateway room. Someone implanted with an Exile Implant will be able to enter the away mission, but unable to return from it. Not only can they be used for getting rid of dangerous criminals, but revs/stationheads count as dead while on the away mission, and traitor/changeling/wizard assassination targets count as dead if they're on the away mission at round end, allowing for those objectives to be completed peacefully.
    • +
    • Added medical hardsuits, sprited by Majorsephiroth. Two of them spawn in EVA. Their most unique/medical oriented feature is being able to hold a medkit in the suit storage slot, allowing you to easily access medicine while keeping your hands free.
    • +
    +
    + +
    +

    19 November 2012

    +

    Giacom updated:

    +
      +
    • Malf AIs can only shunt to APCs from their core. Meaning their core needs to be alive before they can shunt to another APC. Malf AIs can start a takeover inside an APC now.
    • +
    • When taking damage, the next sequence of the overlay will show for a bit before reverting to the overlay you should have. This allows you to know you are taking damage without having to check the text screen.
    • +
    +
    + +
    +

    18 November 2012

    +

    Petethegoat updated:

    +
      +
    • Ported over BS12 style cameras. They now take a photo of a 3x3 area!
    • +
    • Catatonic people (those that have ghosted while alive) now count as dead for assasinate objectives.
    • +
    +
    + +
    +

    17 November 2012

    +

    Donkie updated:

    +
      +
    • You can now deconstruct and construct Air Alarms and Fire Alarms. Read wiki on howto.
    • +
    +

    Giacom updated:

    +
      +
    • Medical Cyborgs no longer lose the reagents in their hypospray when switching modes.
    • +
    • Spaceacillin will now help stop the spread of diseases.
    • +
    • You can once again make floors slippery by spraying water. This was done by increasing the amount the sprayer uses, which is from 5 to 10. You can also empty your sprayer's contents onto the floor with a verb in the Object tab.
    • +
    +
    + +
    +

    16 November 2012

    +

    Kor updated:

    +
      +
    • Fixed the syndicate teleporter door, making teleport assaults possible. It will once again open when you open the outter door.
    • +
    +
    + + +
    +

    15 November 2012

    +

    Giacom updated:

    +
      +
    • You can now name your advance diseases! You can't name already known diseases though.
    • +
    • Chemical implants can now hold 50 units instead of 10 units.
    • +
    +
    + +
    +

    13 November 2012

    +

    Giacom updated:

    +
      +
    • More work to advance diseases. Please report any bugs to the bug tracker, I have tried everything that I can on my own but I'll need lots of people playing to fix the more minor bugs. You can find a guide to making your own diseases here: LINK!
    • +
    • Reduced the cost to use Hive Absorb from 40 to 20. This is to help encourage people to use this power more and to use team work.
    • +
    • New symptom added! See if you can find it.
    • +
    • You can now remove symptoms from a disease using synaptizine.
    • +
    • Kor: You can once again debrain changelings. They won't make anyone half-lings though, and you won't be able to tell if the body of a debrained changeling is a changeling by putting a player brain in there.
    • +
    +

    Nodrak updated:

    +
      +
    • Wizards can no longer cast spells when muzzled. It iss now actually possible to capture a live wizard without constantly injecting them with chloral.
    • +
    • You can no longer take bags of holding or mechs to the clown planet.
    • +
    +
    + +
    +

    11 November 2012

    +

    Carn updated:

    +
      +
    • Admin-ranks changes
      + Lots of changes. This is just a brief summary of the most recent changes; still working on proper documentation.
      + All admins have access to view-vars, player-panel(for individual mobs), game panel and secrets panel. Most of the things on those pages have their own rights requirements. For instance, you can only use event orientated secrets in the secret panel if you have FUN rights. Debug secrets if you have DEBUG rights. etc.
      + Spawn xeno and toggle gravity procs were moved into the secrets panel (fun).
      + This may help with understanding which flags do what. Unfortuanately it's still somewhat vague.
      + If you have any problems, feel free to PM me at irc.rizon.net #coderbus. I go by the username carn or carnie. +
    • +
    +
    + +
    +

    11 November 2012

    +

    Kor updated:

    +
      +
    • New cyborg upgrade available for production that requires illegal and combat tech
    • +
    • Summon Guns has a new gun type created by Ausops. It also lets the user know when its been cast now to prevent people trying to buy it multiple times
    • +
    • Grilles are no longer immortal in regards to solid projectiles, you can now shoot out windows.
    • +
    +
    + +
    +

    09 November 2012

    +

    Giacom updated:

    +
      +
    • Cyborgs can now ping and beep! (Say "*beep" and "*ping") Thanks to Rahlzel for the proposal.
    • +
    • HULKS WILL NOW TALK IN ALL CAPS AND WILL RANDOMLY SAY HULK THINGS. Thanks to Brotemis for the proposal.
    • +
    • Sorry for the inconveniences with advance diseases. They are working much better now!
    • +
    • An improved APC sprite by TankNut!
    • +
    +
    + + +
    +

    05 November 2012

    +

    Giacom updated:

    +
      +
      +
    • AIs can now tweak with a bot's setting like a human who unlocked the bot.
    • +
    +
    + +
    +

    05 November 2012

    +

    Errorage updated:

    +
      +
    • Being in an area with extremely low pressure will now deal some damage, if you're not protected.
    • +
    • Space suits and the captain's armor now protect against pressure damage
    • +
    • Slightly lowered all environment damage intakes (temperature, oxygen deprevation) to make up for low pressure damage.
    • +
    • Pressure protection finally works properly. Items that protect from pressure (firesuits, space suits, fire helmets, ...) will now properly protect. The pressure damage indicator will update properly based on the pressure effects on you. Black (low) and red (high) mean you are taking damage.
    • +
    • Slightly slowed down the speed at which your body temperature changes if you are in a very hot or very cold area. The speed at which you recover from an abnormal body temperature remains the same.
    • +
    +
    + + +
    +

    03 November 2012

    +

    TankNut updated:

    +
      +
    • New APC sprite.
    • +
    • New Wraith sprite and jaunting animation.
    • +
    +
    + +
    +

    03 November 2012

    +

    WJohnston updated:

    +
      +
    • New Ablative Armor sprite.
    • +
    +
    + +
    +

    03 November 2012

    +

    Giacom updated:

    +
      +
      +
    • Airborne diseases will not spread through walls now.
    • +
    • Reduced queen healing rate to 5. The maximum health will be enough.
    • +
    • Aliens can now clear hatched eggs by clicking on them.
    • +
    +
    + +
    +

    02 November 2012

    +

    Errorage updated:

    +
      +
    • You can once again travel to the station, derelict, satellite and mining z-levels through space. You will also never loop into the same level on transition - So if you are exiting the derelict z-level, you will enter one of the other z-levels.
    • +
    +
    + + +
    +

    01 November 2012

    +

    Giacom updated:

    +
      +
    • Aliens now take x2 as much damage from fire based weaponary, instead of x1.5.
    • +
    • Doors are now weaker than walls; so normal weapons can destroy them much more easily.
    • +
    +
    + +
    +

    31 October 2012

    +

    Giacom updated:

    +
      +
    • Advance evolving diseases! Virology can now create, mutate and mix advance diseases together. I replaced the two bottles of blood in Virology with the advance disease. I'll write a wiki article soon enough. Here's a tip: Putting mutagen or virus food (a mixture of milk, water and oxygen) in blood with an existing disease will mutate it to gain symptoms. It can potentially lose old symptoms in the process, so keep backups!
    • +
    +
    + +
    +

    28 October 2012

    +

    Errorage updated:

    +
      +
    • You can now set your character's age up to 85. This used to be 45.
    • +
    +
    + +
    +

    27 October 2012

    +

    Petethegoat updated:

    +
      +
    • Mousetraps are now assemblies.
    • +
    • Added a new crate for cargo to order.
    • + +
    +
    + +
    +

    27 October 2012

    +

    Petethegoat updated:

    +
      +
    • Player Weekend begins!
    • +
    • Added a camera and hand labeler to art storage.
    • +
    • Added a medical records cabinet to the Detective's office.
    • +
    • Added a safe to the vault. Who'll be the first to crack it?
    • +
    +

    Nodrak updated:

    +
      +
    • The CE has a new pet!
    • +
    +
    + +
    +

    25 October 2012

    +

    Flashkirby99 updated:

    +
      +
    • Added 18 new hairstyles!
    • +
    +
    + +
    +

    24 October 2012

    +

    Giacom updated:

    +
      +
    • Throwing eggs will result in the reagents of the egg reacting to the target. (Which can be a turf, object or mob) This creates possibilities like chloral eggs, lube eggs, and many more.
    • +
    • Aliens can now acid walls and floors! Not R-Walls though.
    • +
    • Facehugger throw range reduced to 5, so aim at humans that are 2 tiles apart from the edge of your screen.
    • +
    • Making eggs is a little more expensive but secreting resin is cheaper. (Both cost 75 now)
    • +
    • Aliens no longer have a random duration of stunning humans, it's a constant value now of the lower based value.
    • +
    • Acid is less random and will be more reliable. Don't bother aciding stuff more than once, as it will waste plasma.
    • +
    • You can now target non-dense items (such as facehuggers) with a gun.
    • +
    • You can now shoot canisters, computers and windoors to break them.
    • +
    +
    + +
    +

    18 October 2012

    +

    Giacom updated:

    +
      +
    • As an AI, you can type in the "track with camera" command and get a list of names to show up there. This also works with "list camera" verb. Remember to use space to auto-fill.
    • +
    • Welding goggles have been added. They are like welding helmets but they are for the glasses equipment slot. Science and the assembly line are given a pair.
    • +
    • Thanks to WJohnston for the welding goggle icons.
    • +
    • Small change to the Assembly Line. Instead of six normal flashes, the Assembly Line will instead have two normal flashes and eight synthetic flashes. Synthetic flashes only work once but are designed to be used in construction of Cyborgs.
    • +
    • Nar-Sie put on a few pounds. Thanks HornyGranny.
    • +
    +
    + +
    +

    16 October 2012

    +

    Giacom updated:

    +
      +
    • New changeling powers!
    • +
    • Hive Channel/Hive Absorb. Allows you to share your DNA with other changelings, very expensive chemical wise to absorb (download), not so much to channel (upload)! You cannot achieve your objective by sharing DNA.
    • +
    • Mimic Voice! You can form your voice of a name you enter. You won't look like them but when you talk, people will hear the name of who you selected. While you're mimicing, you can't regenerate chemicals.
    • +
    • Extract DNA! A power that allows you to silently sting someone and take their DNA! Meaning you do not have to absorb someone to become them. Extracting their DNA doesn't count towards completing your objectives.
    • +
    • You can now get flares from red emergency toolboxes. Has a 50% chance of a flash-light or a flare spawning.
    • +
    • Flare icon by Ausops!
    • +
    • Thanks to RavingManiac (Smoke Carter), Roros now lay eggs which can grow into baby roros or be used for cooking recipes. Scientists will need to expose the egg to plasma for it to hatch; while it is orange (grown).
    • +
    • A new icon for the map spawned x-ray cameras. Icon by Krutchen.
    • +
    +
    + +
    +

    13 October 2012

    +

    Giacom updated:

    +
      +
    • Facehuggers have a new animation, thanks to Sly.
    • +
    • Firelocks, glass-less airlocks and walls will stop heat.
    • +
    • Fires are now more deadly, especially the flames.
    • +
    • Fires will now break windows.
    • +
    +
    + +
    +

    10 October 2012

    +

    Giacom updated:

    +
      +
    • Larva grow a little bit faster when on weeds or when breathing in plasma.
    • +
    +
    + +
    +

    8 October 2012

    +

    Giacom updated:

    +
      +
    • Thanks to Skasi. Atmospherics has been changed to be made simpler and spawn with the new atmos features, such as the heaters.
    • +
    • Radio headsets can only be heard by people wearing them on their ear slot. This will let us do more fun stuff with headsets, such as a traitor encryption key which can listen to all the channels, but not talk in them.
    • +
    + +

    Kor updated:

    +
      +
    • A pen no longer spawns in your pocket. Instead, each PDA will spawn with a pen already in it.
    • +
    +
    + +
    +

    5 October 2012

    +

    Giacom updated:

    +
      +
    • Aliens can now be harmed by fire. They now also take double fire damage, meaning flame based weaponry is very effective.
    • +
    • Buffed alien facehuggers and eggs. Facehuggers don't go idle anymore, and they attach to anyone who walks past them. Eggs do the same; fully grown eggs will open to potential hosts. If you are still in the range of them, the facehugger inside will leap out and hug you. Removed "activate facehuggers", since it's useless now. Emote "roar" if you want to roar now.
    • +
    • There can be only one living queen at a time, if the queen dies then a drone can take her place as a princess.
    • +
    • Buffed queen regeneration a bit, so it's not the same as her underlings. It's also more important because there can only be one queen at a time.
    • +
    • Aliens don't slip in space anymore.
    • +
    • Hulks don't paralyze aliens anymore, they instead slow them down to a slow crawl. It is very effective for punching aliens out of weeds, so it can't regenerate it's health.
    • +
    • New egg opening and opened egg icons by WJohnston.
    • +
    +

    Aranclanos updated:

    +
      +
    • A buncha crud nobody cares about lol Added a light to the airlock wiring interface to show the status of the timing.
    • +
    • You can't fill sprays without being next to the dispenser.
    • +
    • Simple animals no longer freeze to death in places with normal temperature.
    • +
    • Mechs no longer freeze on the spot when they are using the Energy Relay on powerless areas.
    • +
    • Improvements to showers, they now clean gear on beltslot, back, ears and eyes. Showers only clean visible gear.
    • +
    • Replica pods works again! But you can't make potato people without a key or clone people who ghosted alive (Catatonic).
    • +
    • Engiborgs can deconstruct airlocks with their RCDs once again.
    • +
    • You can construct airlocks while standing on another airlock with RCDs.
    • +
    +
    + +
    +

    3 October 2012

    +

    Agouri updated:

    + +
    + +
    +

    1 October 2012

    +

    Cheridan updated:

    +
      +
    • Wizards have a new artifact added to their spellbooks.
    • +
    +
    + + +
    +

    30 September 2012

    +

    Numbers updated:

    +
      +
    • Readded Volume Pumps - now they work as intended and are constructable
    • +
    • Readded Passive Gates - now they work as intended and are constructable
    • +
    • Readded Heat Exchangers - now they work as intended and are constructable
    • +
    • Added Heater - to warm up gasses to 300C
    • +
    • Pipe dispensers can produce the readded pieces.
    • +
    • New graphics for all of the above - courtesy by Ausops.
    • +
    +
    + +
    +

    30 September 2012

    +

    Giacom updated:

    +
      +
    • Airlocks now use the Environmental power channel, since they are airlocks after-all. Meaning, when power is low the airlocks will still work until the environmental channel on the APC is turned off. This applies to all the door control buttons too. Pipe meters now use the environmental power channel. If you have any comments have this change, please let me know in the feedback section of the forums.
    • +
    +
    + +
    +

    26 September 2012

    +

    Carnwennan updated:

    +
      +
    • Added new hotkeys. Type hotkeys-help for details or see the drop-down help menu at the top of the game window.
    • +
    +

    Aranclanos updated:

    +
      +
    • Mechs are once again spaceproof!
    • +
    • The YouTool machine is now all access
    • +
    • Cutting tower caps in hand no longer deletes the wood, and planks now auto stack
    • +
    +
    + +
    +

    25 September 2012

    +

    Donkie updated:

    +
      +
    • Reworked the Piano, now really optimized and new interface!
    • +
    +
    + +
    +

    24 September 2012

    +

    Petethegoat updated:

    +
      +
    • Hopefully fixed the stop midis button. It should now stop any midis that are currently playing.
    • +
    +
    + +
    +

    23 September 2012

    +

    Petethegoat updated:

    +
      +
    • Fixed an exploit which would allow the janitor to magically mop floors.
    • +
    • Added lipstick~ It's not available on station, as Nanotrasen has deemed it contraband.
    • +
    • If you encounter any issues with computers, notify an admin, or ask for assistance on #coderbus, on irc.rizon.net.
    • +
    +

    Donkie updated:

    +
      +
    • Updated the Package Tagger with new interface!
    • +
    • You can now dispense, remove and retag sort junctions properly!
    • +
    +
    + +
    +

    17 September 2012

    +

    Cheridan updated:

    +
      +
    • Metroids have been replaced with Rorobeasts. Roros are strange latex-based lifeforms that hate light, fun, and gloves.
    • +
    +
    + +
    +

    17 September 2012

    +

    Carn updated:

    +
      +
    • F5 is now a hotkey for adminghosting. F8 toggles ghost-like invisibility for admins.
    • +
    • Catatonia makes you fall down. Admins appear braindead when admin-ghosting.
    • +
    • "Set-observe"/"Set-play" renamed and merged into "Aghost".
    • +
    • "Lay down/Get up" renamed to "Rest"
    • +
    • Closets can't be sold on the supply shuttle anymore
    • +
    • Fixed all dat light
    • +
    +
    + +
    +

    13 September 2012

    +

    Carn updated:

    +
      +
    • New Hotkeys (Trial period). Details can be found in the help menu or via the hotkeys-help verb. It's all client-side. It shouldn't intefere with regular controls (except ctrl+A, ctrl+S, ctrl+D and ctrl+W).
    • +
    +
    + +
    +

    10 September 2012

    +

    Giacom updated:

    +
      +
    • AIs can double click on mobs to instantly start tracking them.
    • +
    +
    + +
    +

    Important note for server hosts!

    +

    Important note for server hosts!:

    +
      +
    • The file /code/defines/hub.dm was moved into /code/hub.dm. To get your server back on the hub, open /code/hub.dm and set the hub variables again. Sorry for the inconvenience.
    • +
    +
    +
    +

    8 September 2012

    +

    Carn updated:

    +
      +
    • Added an additional check to stop changelings sharing powers/becomming un-absorbable/etc by absorbing eachother and then rejuvinating from death.
    • +
    • Cloaked Aliens are now slightly easier to see, so they should avoid strongly lit areas when possible. They can still lay down to become even stealthier though. Let me know what you think, it's only a minor sprite change.
    • +
    +
    + +
    +

    6 September 2012

    +

    Cheridan updated:

    +
      +
    • -Changes flour from an item to a container-held reagent. All recipes have been updated to use 5 units of reagent flour for every item required previously. This has a few advantages: The 16(!) sacks of flour previously in the kitchen cabinet have been condensed to an equivalent 3 sacks. Beer is now brewable with universal enzyme, and converting lots of wheat into flour should be less tedious. Also, flour grenades, etc. Because of this, flour is now obtained from the all-in-one blender rather than the processor, and spaghetti noodles are made with 5 units of flour in the microwave.
    • +
    +
    + +
    +

    6 September 2012

    +

    Giacom updated:

    +
      +
    • Removed cameras from bots (NOT BORGS). They weren't working well with freelook and I felt that since they weren't used at all, they wouldn't be missed.
    • +
    +
    + +
    +

    3 September 2012

    +

    Giacom updated:

    +
      +
    • Cameras has changed quite a bit. They are no longer created from grenade canisters, instead you make them from an autolathe. The construction and deconstruction for them has also changed, so look it up or experiment it with yourself to see how to setup the cameras now. Cameras also get wires, like airlocks and APCs. There's two duds, a focus wire, a power wire, an alarm wire and a light wire. Protip: You can see which one is the alarm wire by pulsing it.
    • +
    • Added a red phone and placed it in the Cyborg Station. Sprite by Pewtershmitz! You'll also find an AI restorer there, replacing the computer frame.
    • +
    • Cameras aren't all X-ray anymore. The AI won't be able to see what room you are in if there's no normal camera inside that room or if there's no X-ray camera nearby..
    • +
    • Cameras get upgrades! Currently there's X-ray, EMP-Proof and Motion. You'll find the EMP-Proof and Motion cameras in the normal places (Singularity Pen & EVA), the new X-ray cameras can be found in the Dormitory and Bathrooms, plus some extra ones to invade your privacy. See if you can smash them all.
    • +
    • Alien Larva can bite simple animals (see: Ian, Runtime, Mice) to kill them and gain a small amount of growing points.
    • +
    • Space travel was tweaked to be more random when changing Z levels. This will stop people and items from being stuck in an infinite loop, as they will eventually hit something to make them stop.
    • +
    +
    + +
    +

    31 August 2012

    +

    Agouri updated:

    +
      +
    • Overhauled newscasters. No visual additions but the thing is much more robust and everything works as intended. Wanted issues are fixed. Admins, check out Access News Network under Fun.
    • +
    +
    + +
    +

    30 August 2012

    +

    Giacom updated:

    +
      +
    • You can now create an EMP Pulse. Like an explosion, it is the mixing of two reagents that trigger this to happen. I will tell you the first required reagent. Uranium. Have fun!
    • +
    • I have made most chemicals need 3-5 or more chemicals in order to react to a turf. For instance, you need at least 5 units of thermite splashed on a wall for it to burn down."
    • +
    • The EMP kit, that you can buy through the uplink, has two more grenades in them now. Making the box full of EMP grenades!
    • +
    • Changed the EMP grenade's range to be much bigger.
    • +
    +
    + +
    +

    29 August 2012

    +

    Nodrak updated:

    +
      +
    • Mice now work with the admin player panel. Admins can now turn players into mice with the 'Animalize' button in the player panel!
    • +
    • Space bear AI no longer runs when a player is controlling it. Admins can now turn players into space bears with the 'Animalize' button in the player panel!
    • +
    • The holodeck beach program once again has a beach.
    • +
    • The nuke op shuttle floor was pressure-washed a few days ago. We have since re-painted it with nanotrasen blood. Sorry for any confusion.
    • +
    +
    + +
    +

    28 August 2012

    +

    Giacom updated:

    +
      +
    • You can now toggle the bolt light of airlocks. An extra wire, that controls the airlock's bolt light, has been added.
    • +
    • Aliens can now tell who is and who isn't infected. They get a special facehugger icon that appears over mobs that have been impregnated.
    • +
    • Cameras have temporary X-Ray for the time being.
    • +
    +
    + +
    +

    August 26, 2012

    +

    Nodrak updated:

    +
      +
    • Admins now have an 'Animalize' button on a mob's player panel. This button allows admins to turn players into simple animals.
      There are a few exceptions. Mice, Parrots, Bears and Space Worms all have issues that, until fixed, prevent me from allowing players those transformations.
    • +
    +

    August 25, 2012

    +

    Carnwennan updated:

    +
      +
    • New lighting. It should look and feel the same as the old lighting whilst being less taxing on the server. Space has a minimum brightness (IC starlight) and areas that do not use dynamic lighting default to a lighting level of 4, so they aren't dark, but they aren't superbright. Replacing turfs should preserve dynamic lighting. Singulo/bombs should cause a lot less lighting-related lag. There are some minor known issues, see the commit log for details.
    • +
    • Admins can now access most controller datums with the "Debug Controller" verb. Time to break all the things!
    • +
    • Supply shuttle now uses a controller datum. This means admins can see/edit supply orders etc.
    • +
    • Changeling fakedeath can be initiated after death again. Next time you want something reverted, just ask rather than being obnoxious.
    • +
    +

    Giacom updated:

    +
      +
    • AIs can now look around like a ghost with the exception that they cannot see what cameras cannot see. Meaning if you're in maintenance, and there's no cameras near you, the AI will not know what you are doing. This also means there's no X-Ray vision cameras anymore.
    • +
    • AIs can add links to Telecommunication Machines. Added some cameras for areas that should have it but instead relied on cameras nearby for vision.
    • +
    • Choking has been changed. You have to stand still while lethally choking someone. It takes time to get into that lethal choke. When you are lethaling choking someone, they are still concious until the lack of oxygen knocks them out.
    • +
    +

    trubble_bass updated:

    +
      +
    • Nerfed the Neurotoxin drink, it is now less effective than a stunbaton. But more effective than a Beepsky Smash.
    • +
    • Updated descriptions on various cocktails to be more accurate or more relevant to the drink itself.
    • +
    +
    + +
    +

    August 24, 2012

    +

    Sieve updated:

    +
      +
    • Floorbots now actually pull up tiles when emagged
    • +
    • All helper bots (excluding MULEs) have an access panel and maint panel, access being for behavior and maint for internal work
    • +
    • To open the maint panel, the access panel needs to be unlocked, then you use a screwdriver. There you can emag/repair it to your heart's content. (Emagging the access panel will also unlock it permanently)
    • +
    • Helper bots are now repaired by using a welder when their maint panel is open
    • +
    +
    + +
    +

    August 23, 2012

    +

    Nodrak updated:

    +
      +
    • In-hand sprites once again update correctly when equipping items.
    • +
    +
    + + +
    +

    August 16, 2012

    +

    Errorage updated:

    +
      +
    • Changes were made to how heating and cooling of humans works.
    • +
    • You must wear both a space suit and space helmet to be protected from space! Likewise you must wear a firesuit and a fire helmet to be protected from fire! Fire helmets are red and white hardhats, found in all fire closets.
    • +
    • Fire suits now only protect from heat and space suits only protect from cold, so make your choice count.
    • +
    +
    + + +
    +

    August 14, 2012

    +

    Sieve updated:

    +
      +
    • DNA modifiers can be used if there is no occupant, primarily to handle the buffer.
    • +
    • Ion Rifles are only effected by max severity EMPs, so AOE from its own shot won't effect it
    • +
    • Pepper Spray fits on Sec belts again
    • +
    +
    + +
    +

    August 11, 2012

    +

    Sieve updated:

    +
      +
    • Turrets now properly fire at simple_animals.
    • +
    • Borgs, AIs, and brains/MMIs can be sacrificed by cultists.
    • +
    • Grenades now automatically set throw on again.
    • +
    +
    + +
    +

    August 6, 2012

    +

    Dingus updated:

    +
      +
    • Library has been redesigned. It's a whole lot more classy now.
    • +
    • Significant changes to Medbay. CMO's office is more centralized, genetics has a new exit into cryogenics, and a new break room has been installed
    • +
    +
    + +
    +

    August 4, 2012

    +

    Icarus updated:

    +
      +
    • Changes to Med-Sci south and surrounding maintenance areas. Virology is more isolated and Science gets a new Misc. Research Lab.
    • +
    • Atmos techs get construction access now to do their little projects in.
    • +
    • Transformation Stings now work on living humans.
    • +
    +
    + +
    +

    August 2, 2012

    +

    Errorage updated:

    +
      +
    • Gas masks now protect you from reagent smoke clouds
    • +
    • Changed the 'black overlay' you get when paralyzed, blind or in critical condition to include a small circle around you.
    • +
    • Dramatically lowered the amount of damage you get per breath while in critical condition. Critical condition now lasts for about 5 minutes if nothing is causing you any additional harm. This in combination with the new black image overlay is an attempt at making doctors more willing to help.
    • +
    +

    Icarus updated:

    +
      +
    • Borgs now have flashlights to allow them to see in lightless areas
    • +
    • Changes to Medbay: The sleeper and storage rooms have been swapped around. Hopefully this leads to more healing and less looting.
    • +
    +
    + +
    +

    August 1, 2012

    +

    Sieve updated:

    +
      +
    • Borgs can now have an encryption key installed into their internal radios. Simply ID, open the panel, and use the key to insert it (Screwdriver to remove)
    • +
    • Due to that as well, borgs have a 'Toggle Broadcast Mode' button for their radios, which changes the broadcast type between station-bounced (Non-reliant on TComms), and subspace (Required for department channels)
    • +
    • Also changed the binary chat for consistency, now for the prefix is ':b' for everyone, not just one for humans and one for borgs/AIs/pAIs
    • +
    • Based on feedback, Nuke Op pinpointers now automagically change between shuttle and disk mode when the nuke is armed or disarmed.
    • +
    +
    + +
    +

    01-August-2012

    +

    Carn updated:

    +
      +
    • Please update your BYOND clients! Ideally everybody should be running the latest version of byond (v496). People who fail to update to at least version 494 within a month's time may find themself unable to connect. Currently our code has no restrictions at all, which is rather bad. By getting the user-base to keep their clients up-to-date we can make use of newer BYOND features reliably.
    • +
    +

    Giacom updated:

    +
      +
    • I've made some adjustments to the Fireball spell. I've changed it to shoot in the player's facing direction instead of you having to pick a name from a list. It will explode upon contact of a person, if it hits an obstacle or if it shoots for too long. To make up for the fireball not being able to go diagonal I've shortened the cooldown to 10 seconds. It still can hurt you badly and knock you down if you shoot it at a wall. Lastly, it now lights up so it'll show up in dark rooms easily.
    • +
    +
    + +
    +

    31 July 2012

    +

    Giacom updated:

    +
      +
    • Removed passive throwing. You need at least an aggressive hold of the mob before you can throw them.
    • +
    • New map changes by Ikarrus. AI Upload Foyer is now Secure Tech Access, and the outer door only requires Bridge access. Attached to it are two new rooms: The messaging server room and the communications relay. The comms relay room runs off its own SMES unit like the AI, so it won't be affected by powersinks
    • +
    +
    + + +
    +

    29 July 2012

    +

    Giacom updated:

    +
      +
    • All radios now only work in their Z level. This means that the CommSat has a few more additions to work with this change. There is now a new Telecomms Machine called the Relay which allows information to travel across Z levels. It it then linked to a new machine called the Hub, which will receive information from the Relays and send it to the buses. Because every Z level needs these relays, which are linked up with Receivers/Broadcasters, every Z level will get one. There is one in the station, in the RD's office, one in Telecomms as always, one in the Ruskie station which is turned off and hidden from the HUB's linked list. The last one is in Mining but the location for it has not been decided yet.
    • +
    • PDAs now need to be in a Z level with a functioning Relay/Comms Network in order to send messages. It will also send uncompressed (scrambled) messages like you would with the ordinary voice messages.
    • +
    • Added some of WJohnston's sprites. Added a new mining borg sprite, Added a new high tech security airlock, Added the new telecomm sprites for Relays. Hubs were given old Bus sprites.
    • +
    +
    + +
    +

    29 July 2012

    +

    Errorage updated:

    +
      +
    • You can now use crayons to color eggs
    • +
    • Mice have invaded the station!
    • +
    +
    + +
    +

    26 July 2012

    +

    Giacom updated:

    +
      +
    • Added a new mushroom for Hydroponics, the Reishi Mushroom! It is obtained like any other mushroom and it has relaxing properties.
    • +
    +
    + +
    +

    July 25, 2012: The day of updates!

    +

    Nodrak updated:

    +
      +
    • Attacking mobs with items will now give new messages. Instead of "Monkeyman was attacked in the head with a wrench by Nodrak." it will read "Monkeyman was bashed in the head with a wrench by Nodrak." Diffrent items have diffrent verbs and some have multiple verbs.
    • +
    • Cultists can now read what words a rune was made with by examining the rune. Due to an error in the code, this was not possible before.
    • +
    • Clowns no longer have practice lasers or staves of change blow up in their face due to clumsyness.
    • +
    • Engineering cyborgs can now actually repair a cut AI wire in APCs.
    • +
    • I've removed a ton of pointless checks and redundant loops from metroid's which have been causing lag due to how often they get called. If metroids are behaving strangly ping me in #coderbus
    • +
    +

    Sieve updated:

    +
      +
    • Made a 'default' save slot (D), and whenever you connect it automatically selects the default slot to load from, but manually selecting a different slot will allow you to play on that one before it returns to default.
    • +
    • Added the ability to name your save slots with the '*'. Names can be up to 16 characters and contain letters, numbers, and basic symbols
    • +
    • The preview icon on the preference screen now takes into account any job you have set on high, and dresses up the icon accordingly. If assistant is set to 'yes', or AI/Cyborg are on high it will put the icon in a grey suit (So you can still customize).
    • +
    • Nuke Ops get a new pinpointer, changing modes with the verb will switch between pointing to the disk, and pointing to the shuttle. Also provides a notification when you leave the station z-level
    • +
    • Reworked how MMI Life() was done, now they will never lose consciousness, and many less things affect them now(Like deafening/blindness from explosions). However, they are vulnerable to EMPs, but all damage is temporary.
    • +
    • Clowns will no longer be killed trying to use holo eswords
    • +
    • Major tweaking to try and optimize many operations on the game's backend. Hopefully, this will reduce a large amount of lag by steamlining CPU-intensive operations, but at the same time there was so much changed that there is no real way for a small group to test everything. If anyone spots a bug involving being unable to 'find' mobs, characters, whatever, then put it on the issue tracker or at the very least let #coderbus know. We can't fix shit unless we know about it.
    • +
    +

    Icarus updated:

    +
      +
    • Players not buckled in when the emergency shuttle/pod starts moving get will get knocked down.
    • +
    • Added a YouTool vending machine to primary tool storage.
    • +
    +
    + +
    +

    24 July 2012

    +

    Errorage updated:

    +
      +
    • Both the chef and bartender have access to the bar area so both can serve if the other is incompetent or does not exist. Bartender's shotgun and shaker were moved to his back room and the booze-o-mat is now ID restricted to the bartender.
    • +
    • Added powercells into vending machines in engineering
    • +
    • Gave two beartraps to the janitor for pest control purposes................
    • +
    +
    + +
    +

    22 July 2012

    +

    Errorage updated:

    +
      +
    • Mech toys can now be redeemed at the quartermaster's for a great reward! If you collect the full set of 11 toys you should put them in a crate and send them to centcom via the supply shuttle.
    • +
    • Supply shuttle arrival time reduced to 2 minutes
    • +
    • Hopefully fixed the toy haul problem which made it possible to get a million toys from arcade machines.
    • +
    +

    Giacom updated:

    +
      +
    • You can now make newlines with your PDA notes.
    • +
    • You can now research and build the Light Replacer.
    • +
    • You can now store donuts in the donut box. The next donut you pull out will be the last one you put in.
    • +
    • APCs will auto-turn on if there is enough power in the grid, even if the powercell is below 30%. The APC needs to be charged for a long enough time before it starts turning equipment on, to avoid spazzing out. If you have any problems with it, such as equipment turning off and on repeatedly then please make an issue report with a screenshot of the APC.
    • +
    +
    + +
    +

    18 July 2012

    +

    Giacom updated:

    +
      +
    • Added the Light Replacer. This is a device that can auto replace lights that are broken, missing or burnt. Currently it is found in the Janitor's closet and Janitor Borgs can equip it. You can refill it with glass, or if you're a Cyborg, just recharge. It is emaggable and will replace lights with rigged lights. The light's explosion was nerfed to help balance it and it is very noticable when you are holding an emagged Light Replacer.
    • +
    • The Janitor's equipment locator, on their PDA, will now tell you the direction of the equipment.
    • +
    +
    + +
    +

    17 July 2012

    +

    Icarus updated:

    +
      +
    • Added department satchels
    • +
    • Added Captain's Backpack and Satchel
    • +
    • Added three new hairstyles by Sly: Gelled, Flat Top, and Pigtails. Hair list has also been sorted by grouping similar styles.
    • +
    +

    Giacom updated:

    +
      +
    • Added a new wire for Cyborgs. See if you can figure out what it does.
    • +
    • You can now fill any container with a sink. You can change the amount to fill, from sinks, by setting your container's transfer amount.
    • +
    +
    + +
    +

    14 July 2012

    +

    Carn updated:

    +
      +
    • All living mobs can now ghost whenever they want. Essentially making the suicide verb obsolete. If you ghost whilst still alive however, you may not re-enter your body for the rest of the round.
    • +
    • Humans can no longer suicide whilst restrained (this is purely to prevent meta whilst I finish up the new FUN suicides)
    • +
    • Fixed dem evidence bags. Fixed metroids getting at it like rabbits. Fixed stuff like welding masks not hiding your face. Bunch of other things
    • +
    +

    Willox and Messycakes updated:

    +
      +
    • pAI Emoticons! Allows each pAI to set their screen to display an array of faces! Click on 'Screen Display' in the pAI OS for a list.
    • +
    +
    + + +
    +

    Saturday July 14th 2012

    +

    Giacom updated:

    +
      +
    • Added Russian Revolvers. This is a special Revolver that can only hold a single bullet randomly in it's chamber. This will allow you to play Russian Roulette with your fellow crew members! You can use it like a normal gun but you will need to cycle through the chamber slots until you hit the bullet. Only admin spawnable.
    • +
    +
    + +
    +

    Friday July 13th 2012

    +

    Carn updated:

    +
      +
    • Added FLOORLENGTH HAIR. YEESSSSSSSS!!!! :3 If you like it say thanks to Ausops for fixing it up. Credits to Powerfulstation for the original sprite.
    • +
    +

    Giacom updated:

    +
      +
    • Save Slots! You can now have separate save slots for different character setups, with a customizable maximum of 3 slots per account. If you are wondering, you will not lose your old saved setup.
    • +
    • The character setup screen was updated to look nicer and to fit on the screen.
    • +
    +

    Icarus updated:

    +
      +
    • Added new Dwarf and Very Long hairstyles. Dwarf hair and beard by SuperCrayon.
    • +
    +
    + +
    +

    Thursday July 12th 2012

    +

    Giacom updated:

    +
      +
    • pAI gets a better PDA that can actually receive messages from people. They can also instantly reply like everybody else now and they can toggle their receiver/signaller/ringer.
    • +
    • You can show the AI the notes on your PDA by holding it up to a camera. When you show up a paper/pda to the camera the AI can now click on your name to go to you, if you're near a camera. People who are Unknown will not have a link; which would've allowed the AI to track them.
    • +
    • Made the" common server" and the "preset right receiver" listen for frequencies 144.1 to 148.9. This will allow people to use different frequencies to talk to eachother without bothering the common channel. It will also allow Revs and Cultists to work with each other; everything is still logged though so it still has risks.
    • +
    • Increased the maximum frequency limit for handheld radios and intercoms. It will give you the option to just use station bounced radios on a higher frequency so that anyone with a headset can't simply tune in.
    • +
    • Created an All-In-One Grinder that is suppose to replace the blender, juicer and reagent grinder all together. Meaning any department that has a juicer, blender and grinder will instead get this. It will help people be more independent from Chemistry by recycling foods and plants.
    • +
    +
    + +
    +

    Wednesday July 11th 2012

    +

    Nodrak, Cheridan and Icarus updated:

    +
      +
    • Added a couple of Emergency Shield Projectors to Engineering secure storage. +

      Note: Credit goes to Barhardar for the original code and functionality. +

      These devices can be used to quickly create an air-tight seal across a hull breach until repairs can been made. +

      Wrench them in place and activate them near a hull breach. The shield should extend to all space tiles in range. +

      They can be (un)locked by engineering IDs and can also be emagged and otherwise malfunction. As they can not be constructed, you can repair damage and malfunctions by opening the panel with a screwdriver and replacing the wires with a cable coil

    • +
    +

    Giacom updated:

    +
      +
    • Chemistry update: Pills can now be ground up in reagent grinders. You can now put custom amounts of reagent into things using chemmasters. Can now load pill-bottles into chemmasters for mass pill-production.
    • +
    +

    Carn updated:

    +
      +
    • Clicks on inventory slots with items in now act like a click on the thing in that slot. So clicking smaller things (like pens) is easier and you can remove clothing that borks/goes invisible. Please continure to report those kinds of bug though please. Thanks x
    • +
    • Can no longer interact with your inventory with a mech.
    • +
    +

    Errorage updated:

    +
      +
    • You can now only adminhelp once every 2 minutes so please provide all necesary information in one adminhelp instead of 5! Also reply to admins in PM-s and not additional adminhelps.
    • +
    +
    + +
    +

    Saturday July 7th, 2012

    +

    Icarus updated:

    +
      +
    • A basketball simulation is now available at the holodeck. Credit to Sly and Ausops for the sprites.
    • +
    +
    + +
    +

    Friday July 6th, 2012

    +

    Giacom updated:

    +
      +
    • Bottles can now be broken over people's heads! To do this, you must have the harm intent on and you must be targeting the person's head. This change affects alcoholic bottles only. It does not change pill bottles or chemistry bottles. Helmets help protect you from damage and the regents of the bottles will splash over the victim.
    • +
    • AI's now have access to a PDA. Note: It is not PDA-bomb-able
    • +
    • Health analyzers and medical PDAs now give a time of death when used on corpses.
    • +
    +
    + +
    +

    Thursday July 5th, 2012

    +

    Carn updated:

    +
      +
    • Alien larva now chestburst even after their host has died.
    • +
    • Aliens can now slap facehuggers onto faces so they can infect mobs which lay down (or those stuck to nests).
    • +
    • Aliens can now slash security cameras to deactivate them.
    • +
    +
    + +
    +

    Wednesday July 4th, 2012

    +

    39kk9t & Carn updated:

    +
      +
    • Added alien nests. They're basically beds made of thick sticky resin which aliums can 'stick' (buckle) people to for sexytimes
    • +
    • Weed nodes are no longer dense.
    • +
    • Queens can secrete resin for walls/nests/membranes
    • +
    • Various bugfixes
    • +
    +
    + +
    +

    Saturday June 30th, 2012

    +

    Icarus updated:

    +
      +
    • Added Petethegoat's basic mirrors to the map. They allow you to change hairstyles.
    • +
    • Remapped Bar, Theatre, and Hydroponics. Bar and Kitchen are now more integrated with each other.
    • +
    +
    + +
    +

    Thursday, June 28th

    +

    Nodrak updated:

    +
      +
    • I'm currently working on cleaning up and moving around a large portion of the mob code. These changes do not directly affect players; HOWEVER, bugs, oversights or simple mistakes may cause problems for players. While I have tested as much as I can, there may be some lingering bugs I have missed.

      This part of the mob code cleanup mainly focuses on damage variables and procs. So if you suspect something related to taking, dealing or examining damage is not working as intended please fill out an issue report here and be as detailed as possible. This includes what you were doing, steps to reproduce the problem, who you were doing it to, what you were using ect... Thank you.

    • +
    +

    Carn updated:

    +
      +
    • Alien hunters will now cloak when using the 'stalk' movement intent. Whilst cloaked they will use up their plasma reserves. They can however cloak as long as they like. Using the Lay-down verb will allow them to remain cloaked without depleting their plasma reserves, hence allowing them to lay ambushes for unsuspecting prey. Should a hunter attack anybody, or get knocked down in any way, they will become visible. Hopefully this allows for more strategic/stealthy gameplay from aliens. On the other hand, I may have totally screwed the balance so feedback/other-ideas are welcome.
    • +
    • Removed the invisibility verb from the alien hunter caste.
    • +
    +
    + +
    +

    Wednesday, June 27th

    +

    Errorage updated:

    +
      +
    • Fixed the bug which prevented you from editing book's titles and authors with a pen. Also fixed the bug which prevented you from ordering a book by it's SS13ID.
    • +
    • Added the F12 hotkey which hides most of the UI. Currently only works for humans.
    • +
    +

    Donkie updated:

    +
      +
    • Pizza boxes! Fully stackable, tagable (with pen), and everythingelse-able. Fantastic icons by supercrayon!
      Created with a sheet of cardboard.
    • +
    +
    + +
    +

    Tuesday, June 26th

    +

    Errorage updated:

    +
      +
    • Changeling parasting now only weakens for 10 game ticks. It no longer silences your target.
    • +
    +
    + +
    +

    Saturday, June 23rd

    +

    Donkie updated:

    +
      +
    • Reworked job randomizing system. Should be more fair.
    • +
    • List of players are now randomized before given antag, this means that declaring as fast as possible doesn't mean shit anymore!
    • +
    +

    Carn updated:

    +
      +
    • Putting a blindfold on a human with lightly damaged eyes will speed up the healing process. Similar with earmuffs.
    • +
    • More overlay bug fixes. Most of it to do with little robots and construction stuff. Bugs go here if you have 2 minutes http://nanotrasen.com/phpBB3/viewtopic.php?f=15&t=9077
    • +
    • Weakening is instant! That means if you stunbaton somebody they're gonna fall-down immediately.
    • +
    +

    Icarus updated:

    +
      +
    • Medical storage now requires Surgery access (Medical Doctors only)
    • +
    +
    + +
    +

    Wednesday, June 20th

    +

    Nodrak updated:

    +
      +
    • AIs, Borgs are no longer able to be cultists or revolutionaries as their objectives completely contradict their laws. They can still be subverted of course.
    • +
    • pAI's no longer keep cult or rev icons.
    • +

    Cheridan updated:

    +
      +
    • -Both Ambrosia forms have had their reagent contents modified to prevent going over the 50-unit cap at high potencies. Ambrosia Deus now contains space drugs instead of poison.
    • +
    • -Drinking milk removes capsaicin from your body. REALISM!
    • +
    • -Frost oil hurts less upon consumption.
    • +
    • -Liquid plasma can be converted into solid plasma sheets, by mixing 20 plasma, 5 iron, and 5 frost oil.
    • +
    • -Added effects for holy water injection on hydroponics plants.
    • +
    +
    + +
    +

    Monday, June 18th

    +

    Giacom updated:

    +
      +
    • Fix for special characters on paper and from announcements
    • +
    +

    Sieve updated:

    +
      +
    • Various small bugfixes, check the commit log for full details
    • +
    • Fixed falsewalls not working
    • +
    • Made Lasertag ED-209's and turrets much more useful, including making their emag function more fitting
    • +
    • Added Mesons to the EngiVend to make up for how many lockers were removed
    • +
    • New Item: Sheet Snatcher. Right now only borgs have them, but they can hold up to 500 sheets of minerals (Of any combination), and auto-stacks them to boot. Used just like the mining satchels, meaning minerborgs can actually deliver metal
    • +
    • Mech drills can mine sand, and the diamond gets a much larger volume
    • +
    • If a borg has the satchel in its modules (Doesn't have to be the active one), it will auto-magically pick up any ores it walks over.
    • +
    • Bumping an asteroid wall with a pickaxe/drill in your hand makes you auto-magically start drilling the wall, making mining much less tedious (humans and borgs)(Also, gustavg's idea)
    • +
    +

    Icarus updated:

    +
      +
    • New afro hairstyles. Big Afro by Intigracy.
    • +
    +
    + +
    +

    Friday, June 15th

    +

    Carnwennan updated:

    +
      +
    • First update for update_icons stuffs:
      Fixed husking and fatties
      Fixed floor tiles still appearing in hand when laying them
      Fixed runtimes with fatties.
    • +
    • Fixes for pre-existing bugs:
      Fixed being unable to put belts & backpacks on other people
      nodamage (godmode) now prevents all organ damage. It does not stop healing however.
      Nerd stuff...
    • + +
    +

    Errorage updated:

    +
      +
    • Greatly reduced the amount of damage high pressure does.
    • +
    • Fire suits, firefighting helmets (red harhats) and the chief engineer's white hardhat now protect against high pressure.
    • +
    +

    Icarus updated:

    +
      +
    • Ported over ponytail sprites from Baystation
    • +
    +
    + +
    +

    Thursday, June 14th

    +

    Carn updated:

    +
      +
    • FEAR NOT! You can now store a pen in your pda. (aka Best commit all commits)
    • +
    +
    + +
    +

    Wednesday, June 13th

    +

    Carn updated:

    +
      +
    • Massive Mob-Icon Overhaul:
      A large amount of the mob code has been replaced. The systems replaced were causing immense performance issues so the following are very necessary optimisations.
      However, there is a downside: SS13 code is the equivilant of monkeys on typewriters. Despite weeks of constant coding/testing there -will- be things I've missed. The kinds of bugs I'm expecting are overlays not updating and/or in rare cases things not appearing in your hud. Most of these issues can be worked around simply by dropping the item and picking it back up. If all else fails ask an admin to regenerate your icons through view-vars.
      Please report any bugs to me on #coderbus IRC or make an issue on the tracker as a matter of urgency. I will fix them ASAP.
      Also a massive thankyou to Nodrak, Erro, Pete and Willox. :)
    • +
    • Massive rewrite of the overlays system (particularly for humans). Stuff is cached and only updates when necessary. In effect this means faster updates, less overheads/lag, and less reliance on the game-ticker.
    • +
    • Numerous bugfixes and tweaks for damage-procs and damage-overlays for humans. They should now be almost seamless, use very little overhead and update instantly.
    • +
    • TK grab can now be cancelled using the throw hotkey. (so now it toggles on/off like it used to).
    • +
    • Added verbs to the view-var drop-down list: "Regenerate Icons" will fix a mob's hud/overlays. "Set Mutantrace" will change a mob's mutantrace.
    • +
    • Damage icons were split up. They kinda look a bit crap so spriters feel free to replace them. Templates are provided in dam_human.dmi
    • +
    • More to come...
    +

    Cheridan updated:

    +
      +
    • -Added Lezowski's overalls to hydroponic supply closets. 50% chance per closet for them to replace the apron. -Removed some covers tags from things that made no sense to have them.
    • +
    +
    + +
    +

    Monday, June 11th

    +

    Donkie updated:

    +
      +
    • Fixed being able to lock yourself in or out of a locker using the verb.
    • +
    +

    Xerux updated:

    +
      +
    • Added lightfixture creating.
    • +
    +

    Errorage updated:

    +
      +
    • You can now use the resist verb or UI button when welded or locked in a closet. Takes 2 minutes to get out tho (Same as getting out of handcuffs or unbuckling yourself)
    • +
    • Making single-pane windows will now make the window in the direction you're facing. If a window already exists in that direction it will make it 90 degrees to your left and so on.
    • +
    +
    + +
    +

    Sunday, June 10th

    +

    Agouri updated:

    +
      +
    • Cyborgs and AIs can now use the newscaster. It was a mistake on my part, forgetting to finish that part of them.
    • +
    +
    + +
    +

    Saturday, June 9th

    +

    Errorage updated:

    +
      +
    • You can now make restraints from cable. It takes 15 lengths of cable to make a pair of restraints, they are applied the same way as handcuffs and have the same effects. It however only takes 30s to remove them by using the resist verb or button. You can also remove them from someone by using wirecutters on the handcuffed person.
    • +
    • Added four new cable colors: pink, orange, cyan and white. Engineer belts spawn with yellow, red or orange cables while toolboxes and tool closets spawn with all 8 colors.
    • +
    +
    + +
    +

    Thursday, June 7st

    +

    Icarus updated:

    +
      +
    • Added a second ZIS suit to engineering.
    • +
    • Remapped CE office and surrounding areas.
    • +
    +
    + +
    +

    Wednesday, June 6th

    +

    Sieve updated:

    +
      +
    • Radiation now works properly, watch out for that Singularity!
    • +
    • Disposals are no longer the loudest machines in existence.
    • +
    • Building portable turrets with lasertag guns now makes them fire lasertag bolts based on team, and they will automatically target and prioritize people wearing opposing team gear.
    • +
    • The same can be done for ED-209s, simply using a lasertag vest and gun (same color) where you would use a security vest and taser in construction.
    • +
    • Added mineral walls and powered mineral door construction. More information can be found in the commit thread, but basically they are built the same way others are, apply mineral to girder for a mineral wall, mineral to airlock assembly for a powered mineral door.
    • +
    • Commit Thread
    • +
    • Throw hotkey (end) now works with TK.
    • +
    • Swap hands hotkey (page up) now cycles through borg modules.
    • +
    +

    Nodrak updated:

    +
      +
    • Cargo's 'shuttle: station' and 'shuttle: dock' has been changed to 'shuttle: station' and 'shuttle: away' to help avoid confusion.
    • +
    +

    Icarus updated:

    +
      +
    • Maintenance shafts changed around. Renamed, less windows, more turns, and expanded in a few areas.
    • +
    +

    Neek updated:

    +
      +
    • You can now add chemicals into cigarettes by injecting them directly or dipping individual cigarettes into a beaker. You can inject into cigarette packs directly to affect multiple cigarettes at once.
    • +
    +

    Willox updated:

    +
      +
    • You can now click individual blocks/subblocks in the genetics console instead of having to scroll through the blocks with a forward/back button!
    • +
    +
    + +
    +

    Sunday, June 3rd

    +

    Donkie updated:

    +
      +
    • You can now Drag-Drop disposal pipes and machinery into the dispenser, in order to remove them.
    • +
    • You must now use wrench before welding a pipe to the ground
    • +
    • You can no longer remove a trunk untill the machinery ontop is unwelded and unwrenched
    • +
    • You are now forced to eject the disposal bin before unwelding it.
    • +
    +
    + +
    +

    Friday, June 1st

    +

    SkyMarshal updated:

    +
      +
    • Readded fingerprints and detective work, after lots of debugging and optimization.
    • +
    • Any PDA with access to the Security Records can now, by the normal forensic scanner function, store data the same way as the detective's scanner. Scanning the PDA in the detective's computer will copy all scanned data into the database.
    • +
    • If something goes wrong, please contact SkyMarshal on the #bs12 channel on irc.sorcery.net
    • +
    +
    + +
    +

    Friday, June 1st

    +

    Nodrak updated:

    +
      +
    • Windoor's are now constructable! Steps are found here.
    • +
    +
    + +
    +

    Tuesday, May 29th

    +

    Nodrak updated:

    +
      +
    • Glass Doors are now breakable.
    • +
    • Added more treasures to the secret mining room.
    • +
    • Changed mineral lockers from secret mining rooms: Instead of giving you two stacks of everything, you get stacks of ore based on rarity
    • +
    +

    Icarus updated:

    +
      +
    • Moved Engineering and Bridge deliveries.
    • +
    +
    + +
    +

    This 28th day of May, in the year of our Lord, Two Thousand Twelve

    +

    Cheridan updated:

    +
      +
    • -Adjusted balaclavas and added luchador masks. Wearing luchador masks give you latin charisma. They replace the boxing gloves in the fitness room. Boxing gloves are still available in the holodeck. -Fake moustache tweaked and given new sprites.
    • +
    +
    + +
    +

    Monday, May 28th

    +

    Donkie updated:

    +
      +
    • You can now dispense Disposal Bins, Outlets and Chutes from the disposal dispenser. These are movable and you can attach them above open trunks with a wrench, then weld them to attach them completely. You can remove Bins by turning off their pump, then screwdriver, then weld, then wrench. Same with outlet and chute except for the pump part.
    • +
    +
    + +
    +

    Saturday, May 26th

    +

    Icarus updated:

    +
      +
    • Ported over Flashkirby99's RIG suit sprites from Bay12
    • +
    • Department PDA Carts moved out of lockers and into head offices.
    • +
    +
    + +
    +

    Wednesday, May 23rd

    +

    Cheridan updated:

    +
      +
    • -Reverted default UI sprites to Erro's old-style UI. Config options for UI color styles coming soon. -Driest Martinis will no longer be invisible. -Braincakes are now sliceable.
    • +
    • -Medical borg overhaul. Instead of a dozen random pills and syringes, they get a hypospray that can switch between auto-replenishing tricordrazine, inprovaline, and spaceacillin.
    • +
    +

    Errorage updated:

    +
      +
    • Some of the more pressing issues with the new user interface were addressed. These include the health indicator being too far up, the open inventory taking a lot of space, hotkey buttons not being removable and suit storage not being accessible enough.
    • +
    • A toggle-hotkey-buttons verb was added to the OOC tab, which hides the pull, drop and throw buttons for people who prefer to use hotkeys and never use the buttons.
    • +
    • Added a character setup option which allows you to pick between the Midnight, Orange and Old iconsets for the user interface.
    • +
    +
    + +
    +

    Tuesday, May 22nd

    +

    Icarus updated:

    +
      +
    • RIG helmets can now be used as flashlights, just like hardhats. Credit to Sly for the sprites.
    • +
    • HoP's office has been remapped and made into his private office. Conference Room can now be accessed from the main hall.
    • +
    +
    + +
    +

    Sunday, May 20th

    +

    Errorage updated:

    +
      +
    • The new user interface is here. If anything is broken or something should be done differently please post feedback on the forum. Spriters are encouraged to make new sprites for the UI.
    • +
    • When you receive a PDA message, the content is displayed to you if the PDA is located somewhere on your person (so not in your backpack). You will also get a reply button there. This will hopefully make PDA communication easier.
    • +
    • New hotkeys! delete is the now the 'stop dragging' hotkey, insert is the 'cycle intents' hotkey.
    • +
    +
    + +
    +

    Saturday, May 19th

    +

    Doohl updated:

    +
      +
    • You can now swap hands by clicking with your middle mouse button (you have to click on a visible object though, that's the catch).
    • +
    • Tweaked the DNA modifier consoles a little bit so that it's much easier to see individual blocks instead of one jumbled mess of hexadecimal.
    • +
    • You can now properly emag AI turret controls and commsat turret controls.
    • +
    +

    Invisty updated:

    +
      +
    • Brand new ending animations!
    • +
    +
    + +
    +

    Friday, May 18th

    +

    Errorage updated:

    +
      +
    • Removed hat storage, which was useless.
    • +
    • Implanting someone now takes 5 seconds, both people need to remain still. Implanting yourself remains instant.
    • +
    • Wallets once again spawn in the cabinets in the dormitory
    • +
    • Wallets now fit in pockets
    • +
    +
    + +
    +

    Thursday, May 17th

    +

    Icarus updated:

    +
      +
    • Individual dorms now have a button inside that bolts/unbolts the door
    • +
    • New sprites for Cargo, HoP, and Captain's lockers
    • +
    • More department-specific door sprites. Most noticable changes in medsci and supply departments.
    • +
    +
    + +
    +

    Tuesday, May 15th

    +

    Icarus updated:

    +
      +
    • Added WJohnston's scrubs to Medical Doctor lockers. Comes in blue, green, and purple.
    • +
    • Added two new syndicate bundles
    • +
    • Reduced cost of thermals to 3 telecrystals (formerly 4)
    • +
    • Singularity Beacons are now spawned from a smaller, portable device.
    • +
    • CMO and QM jumpsuits made more unique.
    • +
    +
    + +
    +

    Monday, May 14th

    +

    Icarus updated:

    +
      +
    • Reinforced table parts are now made by using four metal rods on regular table parts. No plasteel involved.
    • +
    • Beakers, small and large can now be made/recycled in autolathes.
    • +
    +

    Nodrak updated:

    +
      +
    • Added a 'random item' button to traitor uplinks. You can potentially get ANY item that shows up on the traitor item list, provided you have enough crystals for it.
    • +
    +
    + +
    +

    Friday, May 11th

    +

    Icarus updated:

    +
      +
    • New design for security. This should be the last time it sees major changes for a while.
    • +
    • Added a new construction area. What could it be for?
    • +
    +

    Petethegoat updated:

    +
      +
    • Readded the RD's genetics access.
    • +
    • RD is still without chemistry access, but I'm going to review this decision in a week and see if R&D is useless due to lack of acid.
    • +
    • Added Flashkirby99's SMES sprites!
    • +
    +

    Invisty updated:

    +
      +
    • Sexy new warpspace (or whatever) tiles.
    • +
    +

    Important changes below!

    +
    + +
    +

    Thursday, May 10th

    +

    Sieve updated:

    +
      +
    • Reverted dismemberment, the recent gun changes, and Tarajans. Before you shit up the forums, read this:
    • +
    • Dismemberment was ported from Bay12, but only halfway, and there were several problems with it. I know many people really liked it, but as it stood it did not fit the playstyle here at all. This had to be removed, there is work on a more fitting system, but this had to be taken out first regardless, and the longer people beat around the bush the worse the situation got.
    • +
    • The gun change was made for no real reason and was pretty problematic, so reverting that should mean there are a lot less 'accidental suicides.'
    • +
    • Tarjans were reverted by request as well, and since keeping them working after removing dismemberment would be a stupid amount of work.
    • +
    +
    + +
    +

    Sunday, May 6th

    +

    Cheridan updated:

    +
      +
    • -New booze sprites for the drinks that were removed! Re-enabled the recipes for the removed drinks. Get cracking, bartenders. -You now need 10 sheets of metal instead of 2 to make a gas canister, people can't FILL ENTIRE ROOMS WITH THEM.
    • +
    • -Emergency Toolboxes now contain smaller, lighter fire extinguishers that actually fit inside them! +
    +
    + +
    +

    Saturday, May 5th

    +

    Petethegoat updated:

    +
      +
    • RD get the fuck out of chemistry and genetics
    • +
    • CHEMISTS, DON'T BE DICKS TO RESEARCH, GIVE THEM ACID YOU TIGHT FUCKS
    • +
    +

    Icarus updated:

    +
      +
    • Updates to Sec, including a stationary scrubber for the prison area.
    • +
    • Swapped around cryogenics and the patient rooms in medbay.
    • +
    +
    + +
    +

    Friday, May 4th

    +

    Cheridan updated:

    +
      +
    • -Added fat jumpsuit sprites for orange, pink, yellow, owl, security, and warden jumpsuits.
    • +
    • -Somatoray is hopefully more useful and less buggy when used on trays. -Botanists now have morgue access, because of their ability to clone via replica pods. Try not to get this removed like all your other access, okay hippies?
    • +
    +
    + +
    +

    Thursday, May 3rd

    +

    Ikarrus updated:

    +
      +
    • Updated genetics, medbay and security.
    • +
    +

    Petethegoat updated:

    + +
    + +
    +

    Tuesday, May 1st

    +

    PolymorphBlue updated:

    +
      +
    • Adds BS12 dismemberment!
    • +
    • Adds greater changeling for 30 points
    • +
    +
    + + +
    +

    Monday, April 20th

    +

    Erro updated:

    +
      +
    • Added a verb to the PDA which you can use to remove an ID in it. If your active hand is empy, it puts it there otherwise it puts it on the floor under you.
    • +
    +
    + +
    +

    Wednesday, April 27th

    +

    Cheridan updated:

    +
      +
    • -New sprites for lemons, oranges, and walking mushroom critters. -Added Invisty's new blob sprites.
    • +
    • -Added a new chemical: lipozine, a weight loss drug. Made with sodium chloride, ethanol, and radium.
    • +
    +
    + +
    +

    Wednesday, April 25th

    +

    Ikarrus & Flazeo updated:

    +
      +
    • New layout for Security, including a prison area instead of permacells.
    • +
    • New layout for the library, bar, and botany.
    • +
    • Medbay and R&D now have three-tile halls.
    • +
    +

    Scroll down for more commits! There's a bunch of new shit.

    +
    + +
    +

    Tuesday, April 24th

    +

    PolymorphBlue updated:

    +
      +
    • Fakedeath changelings can no longer have their brains cut out.
    • +
    • Rev checkwin changed to fire every five ticks (from twenty) and actually use the right objective type so revs being off station counts as success.
    • +
    +

    Sieve updated:

    +
      +
    • Powercells now have unique icons for cell types
    • +
    • Implemented mech construction sprite by WJohnston for the Ripley, Firefighter, Gygax, and Durand
    • +
    • Durand construction is reversible
    • +
    • Power Cells can now be made in Mechfabs, provided the proper research level has been achieved
    • +
    • Added a new item, the Synthetic Flash. Works just like a normal flash, except they can only withstand one use, but can be produced in the Mechfab(To replace the need for normal flashes)
    • +
    • Added a new type of gloves, ones that are cheap copies of the coveted Insulated Gloves, but be warned, quality control wasn't too thorough
    • +
    • Added a new Cyborg Upgrade, a jetpack for use by Miner Cyborgs. Can be refilled on any air canister
    • +
    • Miner Cyborgs now have a Diamond Drill equivalent along with an upgraded Ore Satchel
    • +
    • Mechfabs no longer brick if there are parts in the quene on sync
    • +
    • MMIs can be built in the Mechfabs again
    • +
    • Crabs are no longer immortal, and are now especially vulnerable to wirecutters
    • +
    • Bibles printed in the library now retain the religion's deity
    • +
    • Added Construction Sprites for the Ripley, Firefighter, Gygax, and Durand by WJohnston
    • +
    • Added Particle Accelerator sprites by Invisity
    • +
    • Added Power Cell, Synthetic Flash, Robot Upgrades, and made some modifications to the PA sprites
    • +
    +

    Petethegoat updated:

    +
      +
    • Added Invisty's field generator sprites.
    • +
    +
    + +
    +

    April 1-22, 2012

    +

    Cheridan updated:

    +
      +
    • CATCHING UP ON MY CHANGELOG. Some of this has been in for a while: -Added carved pumpkins and corncob pipes. -Added mutations for ambrosia and lemon trees. -Added more wood items for tower cap wood construction. -Added soil to plant seeds in. Make it by crushing up sandstone. Soil does not have indicators like trays do! Watch your plants carefully!
    • +
    • -The biogenerator is now more robust. It can dispense fertilizer in batches, and make simple leather items. -RnD can create a new tool for botanists: The floral somatoray. Has two modes. Use it on your plants to induce mutations or boost yield.
    • +
    • -Added plump helmet biscuits, mushroom soup, pumpkin pie and slices, chawanmushi, and beet soup recipes for the chef to make.
    • +
    • -Added transparency to biohelmets. -Normalized grass harvests. -Changed the name of "Generic Weeds". -Blenders can now be filled directly from plant bags. -Added low chance for a species mutation whenever a plant's stats mutate. -You now get more descriptive messages when applying mutagen to plant trays. -Removed sugarcane seeds from the vending machine. Added the sugarcane seeds to the seeds crate.
    • +
    +
    + +
    +

    Sunday, April 22nd

    +

    Petethegoat updated:

    +
      +
    • New gasmask sprites. Removed emergency gasmasks, so there's only one type now.
    • +
    • New shotgun sprites by Khodoque!
    • +
    • The barman's double-barrel actually works like a double-barrel instead of a pump-action! Rejoice!
    • +
    • Sneaky barmen may be able to illegally modify their shotgun, if they so choose.
    • +
    • Trimmed the changelog, vastly.
    • +
    +
    + +
    +

    Saturday, April 21st

    +

    Errorage updated:

    +
      +
    • Maintenance door outside of tech storage now requires maintenance OR tech storage access instead of maintenance AND robotics accesses.
    • +
    +
    + +
    +

    Thursday, April 19th

    +

    Carn updated:

    +
      +
    • Rewrote the cinematic system to try and simplify and optimise it. Please report any bugs asap to me or coderbus, thanks.
    • +
    +
    + +
    +

    Tuesday, April 17th

    +

    Kor updated:

    +
      +
    • Engineering jobs now have their PDA spawn in their pocket, and their toolbelt on their belt
    • +
    • The nuke going off on station will now gib everyone on the Z level.
    • +
    • Two more core displays are available for the AI
    • +
    • The Artificer can now build cult floors and walls
    • +
    +
    +

    Friday, April 13th

    +

    Sieve updated:

    +
      +
    • Updated the robotics layout.
    • +
    +

    Petethegoat updated:

    +
      +
    • Nerfed the librarian by removing the r-walls from his cubbyhole thing, fuck WGW readers hiding out in there.
    • +
    +
    +
    +

    Thursday, April 12th

    +

    Agouri updated:

    +
      +
    • Fixed the ability to move while lying down/resting.
    • +
    • Sleep has been fixed and works as intended again. Anaesthetic and toxins can now properly put people to sleep, permanently if you keep the administration stable. Sleeplocs are now viable again. The sleep button and *faint emote work again.
    • +
    +
    +
    +

    Wednesday, April 11th

    +

    PolymorphBlue updated:

    +
      +
    • Droppers are now used at the eyes, and thus, access to the eyes is required to have an effect.
    • +
    +
    + + +
    +

    April 10, the year of our lord 2012

    +

    Agouri updated:

    +
      +
    • CONTRABAND-CON UPDATE: Added posters. I'm sorry to add it seperately with the rest of contraband, but there was a lack of sprites for everything else. Hopefully, people will gain interest and get me some damn sprites this way :3 + As I said, this is an ongoing project of mine. So starting of, we've got...
    • +
    • POSTERS! Posters come in rolled packages that can adhere to any wall or r_wall, if it's uncluttered enough. +

      How they get on-board: The quartermaster can now set the receiver frequency of his supplycomp circuit board. A bit simplistic as of now, will work on it later. Building a supplycomp with a properly set up circuitboard will give access to the Contraband crate. +

      How they're used: Unfold the rolled poster on any wall or r_wall to create the poster. There are currently 17 designs, with the possibility of me adding more. +

      How to get rid of them: You can rip them using your hand... To cleanly extract them and not ruin them for future use, however, you can use a pair of wirecutters. +

      How they're classified: They're contraband, so it's perfectly okay for security officers to confiscate them. Punishment for contraband-providers (or end-users, if you want to go full nazi) is up to the situational commanding officers. + +
    +

    Nodrak updated:

    +
      +
    • Merged 'Game' and 'Lobby' tabs during pre-game into one tab
    • +
    • Added the little red x to the late-join job list
    • +
    • Late-joiners are warned if the shuttle is past the point of recall, and if the shuttle has already left the station
    • +
    • Late-joiners now see how long the round has been going on.
    • +
    • Mining shuttle computer no longer spits out both 'Shuttle has been sent' and 'The shuttle is already moving' every time.
    • +
    + +
    + +
    +

    Monday, April 9th

    +

    Petethegoat updated:

    +
      +
    • TORE OUT DETECTIVE WORK! THIS IS A TEMPORARY PATCH TO SEE IF THIS FIXES THE CRASHING.
    • +
    • DETECTIVE SCANNERS AND EVIDENCE BAGS (AND FINGERPRINTS) ARE GONE.
    • +
    +
    + +
    +

    Sunday, April 8th

    +

    PolymorphBlue updated:

    +
      +
    • Secret little rooms now spawn on the mining asteroid, containing various artifacts.
    • +
    • Added the beginnings of a borg upgrade system. Currently, can be used to reset a borg's module.
    • +
    +
    + +
    +

    2 April 2012

    +

    PolymorphBlue updated:

    +
      +
    • ERP is gone. Hope you enjoyed it while it lasted!
    • +
    +
    + +
    +

    April Fools Day! Get hype!

    +

    Doohl updated:

    +
      +
    • Security officers can modify people's criminal status by simply examining them with a security hud on and clicking a link that will show up as part of the character's description.
    • +
    • Less jobs have maintenance access. The only jobs that will have it now are engineers, atmos techs, cargo techs, heads, and the detective.
    • +
    • Changed Runtime's sprite to look more catlike.
    • +
    • View Variables can now better list associative lists.
    • +
    • Miscellaneous bugfixes for the NT Script IDE.
    • +
    +

    PolymorphBlue updated:

    +
      +
    • Minor bugfixes to borg deathsquad, adds borg deathsquad to potential tensioner (set so high it's never going to happen)
    • +
    • Adds consiterable support for ERP! (If enabled.)
    • +
    • Increases cost for changeling unstun to 45
    • +
    +
    + +
    +

    30 March 2012

    +

    Donkie updated:

    +
      +
    • You can now stick papers back in to paperbins, text will persist.
    • +
    • Added a [field] bbcode tag to the pen writing. Lets your start writing from that point.
    • +
    • Changed fonts a bit for papers to make [sign] stand out more.
    • +
    +

    Doohl updated:

    +
      +
    • Gave pill bottles the ability to scoop up pills like ore satchels scoop ore. (There you go, /vg/ Anon.)
    • +
    • Security Officers and Wardens now start with maintenance acceess.
    • +
    +
    + +
    +

    29 March 2012

    +

    PolymorphBlue updated:

    +
      +
    • Exosuits now provide a message when someone is getting in, someone getting in must remain stationary and unstunned, and getting in takes four seconds.
    • +
    +
    + +
    +

    28 March 2012

    +

    Carn updated:

    +
      +
    • Fixed turrets shooting people that leave the area and the telecomm turret controls.
    • +
    +

    Donkie updated:

    +
      +
    • Updated air alarm's GUI.
    • +
    +
    + +
    +

    27 March 2012

    +

    Nodrak updated:

    +
      +
    • Security borgs now have modified tasers.
    • +
    • Security borgs have gone back to having the same movement speed as all other borgs.
    • +
    +
    + +
    +

    23 March 2012

    +

    Doohl updated:

    +
      +
    • Escape shuttles/pods now spend about 2 minutes in high-speed transit before they reach centcom/recon shuttle. This is a warning: regular after-round shuttle grief is NOT OKAY while the shuttle is still in transit! Save it for when the shuttle gets to centcom! The purpose of this is to give potential antagonists and protagonists a chance to have a final showdown in the shuttle. The round does not end until the shutle comes to a stop and docks. Don't step outside while the shuttle is moving!

      For example; if you are a traitor and have an escape-alone objective and a couple of people manage to squeeze in the shuttle, you have two minutes to kill/toss them out to win. Or you can just chill for the duration and reflect on the round.
    • +
    + +

    Donkieyo updated:

    +
      +
    • A bunch new standard-namespace NTSL functions added! Check them out at the NT Script wiki page!
    • +
    +
    + +
    +

    22 March 2012

    +

    Ricotez updated:

    +
      +
    • Medical Lockers, Security Lockers, Research Lockers, Warden Locker, CMO Locker, and RD locker all have new sprites.
    • +
    • Encryption keys now each have their own invidual sprites.
    • +
    + +

    PolymorphBlue updated:

    +
      +
    • Added a prototype holodeck to fitness!
    • +
    • Assorted tensioner fixes
    • +
    + +
    +

    20 March 2012

    +

    Kor updated:

    +
      +
    • Lasertag vests and guns have been added to fitness.
    • +
    • Art storage has replaced the emergency storage near arrivals. Emergency storage has replaced chem storage (has anyone ever used that?)
    • +
    • Wraiths can now see in the dark
    • +
    +
    + + +
    +

    19 March 2012

    +

    PolymorphBlue updated:

    +
      +
    • Added LSD sting to modular changeling by popular demand.
    • +
    • Silence sting no longer provides a message to the victim.
    • +
    • Tensioner will no longer assign dead people as assassination targets.
    • +
    +
    + +
    +

    18 March 2012

    +

    Quarxink updated:

    +
      +
    • The medical record computers can finally search for DNA and not just name and ID.
    • +
    +
    + +
    +

    14 March 2012

    +

    PolymorphBlue updated:

    +
      +
    • Modular changeling added! Changelings now purchase the powers they want. Balancing still underway, but should be playable.
    • +
    +

    Petethegoat updated:

    +
      +
    • Janitor cyborgs have been massively upgraded. Suffice to say they're pretty ballin' now...
    • +
    +

    Nodrak updated:

    +
      +
    • You can now choose whether to spawn with a backpack, satchel, or nothing. Excess items will spawn in your hands if necessary.
    • +
    • You can now choose what kind of underwear you'd like to wear, per a request.
    • +
    +
    + +
    +

    14 March 2012

    +

    Carn updated:

    +
      +
    • Added 6 female hairstyles -- credits go to Erthilo of Baystation. Added a male hairstyle -- credits go to WJohnston of TG. If you can sprite some unique and decent-looking hair sprites, feel free to PM me on the TG forums.
    • +
    +
      +
    • The way objects appear to be splattered with blood has been rewritten in an effort to fix stupid things happening with icons. It should be called far less frequently now. PLEASE, if you experience crashes that could in anyway be related to blood, report them with DETAILED information. Thanks
    • +
    +
    + +
    +

    13 March 2012

    +

    Nodrak & Carn updated:

    +
      +
    • Fixed the way flashes break. Long story short: They'll never break on first use so rev don't get screwed over. They run out of charge temporarily when spammed but recharge. Spamming them also increases the chance of them breaking a little, so use them sparingly.
    • +
    +

    Doohl updated:

    +
      +
    • Ablative Armor now has a high chance of reflecting energy-based projectiles.
    • +
    • Riot shields were buffed; they now block more attacks and they will prevent their wielder from being pushed (most of the time).
    • +
    +
    + +
    +

    12 March 2012

    +

    PolymorphBlue updated:

    +
      +
    • PDA messages now require an active messaging server to be properly sent.
    • +
    +
    + +
    +

    11 March 2012

    +

    PolymorphBlue updated:

    +
      +
    • The AI can now open doors with shift+click, bolt them with ctrl+click, and shock them with alt+click
    • +
    • Tratior borgs who hack themselves cannot be blown by the robotics console, and can override lockdowns.
    • +
    • Adds a new wire to doors that controls the time delay before they close. If pulsed, they close like a sliding glass door. If cut, they do not close by themselves.
    • +
    • Borgs who have died, ghosts, and are then blown up will now have their ghosts properly transfered to their dropped MMIs.
    • +
    +

    Carnwennan updated:

    +
      +
    • You can now request AI presence at a holopad for immediate private communication with the AI anywhere. AIs can click a quick button to zoom to the holopad.
    • +
    +
    + +
    +

    08 March 2012

    +

    Nodrak and Carnwennan updated:

    +
      +
    • Nodrak: Fixed crayon boxes and stuff getting stuck in pockets.
    • +
    • Nodrak: 'Steal item' objectives will report correctly when wrapped up in paper now.
    • +
    • Carn: fixed the vent in the freezer...poor chef kept suffocating.
    • +
    +
    + +
    +

    02 March 2012

    +

    Carn updated:

    +
      +
    • Fixed a number of issues with mob examining. Including: not being able to see burns unless they were bruised; vast amounts of grammar; and icons. Updated them to use stylesheet classes.
    • +
    • Borgs can no-longer drop their module items on conveyor belts.
    • +
    • Names input into the setup screen are now lower-cased and then have their first letters capitalised. This is to fix problems with BYOND's text-parsing system.
    • +
    • Runtime fix for lighting.
    • +
    • Over the next few commits I will be updating a tonne of item names to fix text-parsing. Please inform me if I've typoed anything.
    • +
    +
    + +
    +

    03 March 2012

    +

    Petethegoat updated:

    +
      +
    • Removed cloakers. Removed Security's thermals. Added disguised thermals as a traitor item.
    • +
    +
    + +
    +

    01 March 2012

    +

    SkyMarshal updated:

    +
      +
    • Tweak/Bugfix for Hallucinations. Much more robust.
    • +
    +
    + +
    +

    01 March 2012

    +

    SkyMarshal updated:

    +
      +
    • Ported BS12 Detective Work System
    • +
    +
    + +
    +

    1 March 2012

    +

    Petethegoat updated:

    +
      +
    • Head revolutionaries no longer spawn with traitor uplinks.
    • +
        +
      +
    + +
    +

    29 February 2012

    +

    SkyMarshal updated:

    +
      +
    • BS12 Hallucination and Dreaming port
    • +
        +
      +
    + + +
    +

    29 February 2012

    +

    muskets updated:

    +
      +
    • Integrated BS12's improved uplink code
    • +
    +
    + + +
    +

    26 February 2012

    +

    Doohl updated:

    +
      +
    • The insane crashing has finally been fixed!
    • +
    +
    + +
    +

    25 February 2012

    +

    Doohl updated:

    +
      +
    • Telecommunications has been refined, with many new features and modules implemented.
    • +
    • NTSL (Nanotrasen Scripting Language) is ONLINE! This is a brand new, fully operational scripting language embedded within SS13 itself. The intended purpose is to eventually expand this scripting language to Robotics and possibly other jobs, but for now you may play with the TCS (Traffic Control Systems) implementation of NTSL in the Telecommunications Satellite. Recommended you read the NT Script wiki page for information on how to use the language itself. Other than that, there's not a lot of documentation.
    • +
    • Radio systems have been further optimized, bugfixed, etc. Should be more stable.
    • +
    • Intercoms now require power to work.
    • +
    +
    + + +
    +

    24 February 2012

    +

    PolymorphBlue updated:

    +
      +
    • Headsets are now modular! Use a screwdriver on them to pop out their encrpytion keys, and use a key on one to put it in. A headset can hold two keys. Normal headsets start with 1 key, department headsets with two. The standard chip does nothing, and is not required for listening to the common radio.
    • +
    • Binary translators made into a encrpytion key, and fixed. They now broadcast to AIs properly.
    • +
    +
    + +
    +

    23 February 2012

    +

    PolymorphBlue updated:

    +
      +
    • MMIs/pAIs no longer lip read, and thus can now hear in the dark.
    • +
    • Borg rechargers are no longer Faraday cages, and thus can now receive radio while they're recharging.
    • +
    +

    LastyScratch updated:

    +
      +
    • Glass airlocks now make a different sound than regular airlocks.
    • +
    • in 1997 nanotrasen's first AI malfunctioned
    • +
    • Toggle ambience probably works now! +
    • Runtime is dead. +
    • The Research Director's consoles were moved into the completely empty cage in the back of his office.
    • +
    +
    + + +
    +

    22 February 2012

    +

    PolymorphBlue updated:

    +
      +
    • Changed alt+click to ctrl+click for pulling.
    • +
    +

    Petethegoat updated:

    +
      +
    • New stationary scrubber sprites~
    • +
    • Removed the mint. Coins can still be found and used in vending machines. PACMANs now run off sheets.
    • +
    +

    coolity updated:

    +
      +
    • New sprites for HoS and Captain lockers.
    • +
    • New sprites for the orebox.
    • +
    +
    + +
    +

    21 February 2012

    +

    Petethegoat updated:

    +
      +
    • The jetpacks now display correctly when worn.
    • +
    • Buckling to chairs no longer causes you to drop your weapon
    • +
    +

    Nodrak updated:

    +
      +
    • Ghosts now have a "Jump to Mob" verb.
    • +
    +

    Sieve updated:

    +
      +
    • Mining lanterns work properly once again!.
    • +

      Skaer updated:

      +
        +
      • The armoury now includes a box of spare Sec cartridges.
      • +
      +
    + +
    +

    19 February 2012

    +

    Petethegoat updated:

    +
      +
    • The jetpacks in EVA have been replaced with CO2 ones, painted a classy black.
    • +
    • Additionally, jetpacks will now run on gases other than oxygen, as you would expect.
    • +
    • Chair overhaul! You shouldn't notice anything different, but if you encounter bugs with chairs or beds, please report those asap.
    • +
    • New electric chair sprites, by myself.
    • +
    • Electric chairs will only electrocute people buckled into them.
    • +
    • Karma should be fixed.
    • +
    +

    KorPhaeron updated:

    +
      +
    • A new construct type: Artificer. It is capable of constructing defenses, repairing fellow constructs, and summoning raw materials to construct further constructs
    • +
    • Simple animals (constructs, Ian, etc) can now see their health in the Status tab
    • +
    • Detective's revolver is non-lethal again. Was fun while it lasted
    • +
    +
    + +
    +

    18 February 2012

    +

    Petethegoat updated:

    +
      +
    • Foam has a reduced range to prevent spamming
    • +
    +

    Sieve updated:

    +
      +
    • Stopped the unholy Radium/Uranium/Carbon smoke that crashed the server. And for anyone that did this, you are a horrible person
    • +
    • Cleanbots clean dirt
    • +
    • Cleanbots automatically patrol on construction
    • +
    • Removed silicate because it is not useful enough for how much lag it caused
    • +
    +
    + +
    +

    16 February 2012

    +

    Smoke Carter updated:

    +
      +
    • Newscasters now alert people of new feeds and wanted-alerts simultaneously.
    • +
    +
    + +
    +

    15 February 2012

    +

    Kor updated:

    +
      +
    • Terrorists Win! Desert Eagles and Riot Shields now spawn on the syndicate shuttle, replacing the c20r
    • +
    • The Detectives gun still uses .38, but they're now fully lethal bullets. Go ahead, make his day.
    • +
    • The Veil Render has been nerfed, the Nar-Sie it spawns will not pull anchored objects. This is a temporary measure, more nerfs/reworking to come
    • +
    +
    + +
    +

    14 February 2012

    +

    Carn updated:

    +
      +
    • Spacevines added to the random events.
    • +
    • The bug where doors kept opening when a borg tried to close them at close range is now fixed.
    • +
    +
    + +
    +

    13 February 2012

    +

    Khodoque updated:

    +
      +
    • Security officers, the warden and the HoS have new jumpsuits.
    • +
    +

    Erro updated:

    +
      +
    • Clicking the internals button on your user interface (The one that shows if you have internals on or not) will now toggle internals even if they are in your pockets. (humans only) - It now works if your internals are on your back, suit storage, belt, hands and pockets.
    • +
    • The public autolathe has been removed. If you want some some stuff from a lathe, go to cargo.
    • +
    +

    Kor updated:

    +
      +
    • A new item, the null rod, protects the one bearing it from cult magic. One starts in the chaplains office, and this replaces the job based immunity he had. The null rod also is capable of dispelling runes upon hitting them (the bible can no longer do this)
    • +
    • Shooting fuel tanks with lasers or bullets now causes them to explode
    • +
    • A construct shell is now waiting to be found in space.
    • +
    • Chaplains can no longer self heal with the bible
    • +
    • Simple animals, including constructs, can now attack mechs and critters
    • +
    + +
    + +
    +

    12 February 2012

    +

    Erro updated:

    +
      +
    • You can no longer attach photos to ID cards. This never worked properly and if anything, it was misleading.
    • +
    • Backpacks can now hold 7 normal sized items (box size) as opposed to 6 normal sized items + 1 small item
    • +
    • Added several fire alarms to areas around the station including the brig, engineering and others
    • +
    • The atmospherics department now has a few hazard vests available for atmos techs to wear if they don't like the fire suit
    • +
    • Roboticist now have engineering + science headsets, virologists now have medsci headsets with medical + science channels
    • +
    • Added some headsets to the jobs that didn't have any extras: roboticist, qm, scientist, virologist and geneticist.
    • +
    • Station engineers now have construction site access (vacent office by arrivals)
    • +
    • Replaced a few airlocks with glass airlocks (detective, autolathe, assistant storage, robotics, checkpoint)
    • +
    • Removed the wall that was blocking the entrance to the theater
    • +
    • Made a small redesign for the HoP's office so that people running towards it from the escape hallway don't run right into the queue, annoying everyong
    • +
    • The engineering, command and security airlocks now glow green when closing instead of red to match all the other airlocks
    • +
    • The disposal units now auto trigger every 30 game ticks, if there is something (or someone) in them. So no more hiding in disposal units!
    • +
    • You can no longer control the disposal unit from within it. You will have to wait for it to trigger itself.
    • +
    • You can no longer strip items off of Ian while dead / a ghost
    • +
    +

    Pete updated:

    +
      +
    • Updated fitness, athletic shorts are now available!
    • +
    +
    + + +
    +

    11 February 2012

    +

    Erro updated:

    +
      +
    • You can now take individual crayons out of the crayon box the same way as from boxes
    • +
    • Clicking a grille with a glass or reinforced glass pane in your hand will glaze the grille from the direction you're looking from (don't forget to fasten the window tho)
    • +
    • When you click somewhere with the intent to interact, you will automaticaly face the item you're trying to interact with. This won't slow you down when running and firing guns behind you.
    • +
    +

    Kor updated:

    +
      +
    • A new passive mob ability: Relentless. Relentless mobs cannot be shoved (though may still swap places with help intent)
    • +
    • Alien Queens, Juggernaut constructs, and Medical Borgs are all Relentless. Maybe the medborg can actually drag people to medbay on time now
    • +
    • Two constructs, the Juggernaut and the Wraith are now available for wizards and cultists to use soul stones with
    • +
    • A new highly destructive artefact, Veil Render, is now available for wizards
    • +
    • A new one time use global spell, Summon Guns, is now available for wizards.
    • +
    • DEEPSTRIKING! There is now a partially constructed teleporter on the nuke shuttle, and for a large sum of telecrystals they may purchase the circuitboard needed to complete it.
    • +
    • The Chaplain is immune to cult stun, blind, deafen, and blood boil
    • +
    +
    + +
    +

    10 February 2012

    +

    Quarxink updated:

    +
      +
    • Added a new toy: Water balloons. They can be filled with any reagent and when thrown apply the reagents to the tile and everything on it.
    • +
    +
    + +
    +

    9 February 2012

    +

    Erro updated:

    +
      +
    • Engineering and security lockers now spawn with their respective backpacks in them so job-changers can look as they should. HoS locker now also contains an armored vest, for the convenience of the HoS who wants to play with one.
    • +
    • Slightly changed the spawn order of items in the CE and HoS lockers to make starting up a hint less tedious.
    • +
    +
    + +
    +

    8 February 2012

    +

    ConstantA updated:

    +
      +
    • Added Exosuit Jetpack
    • +
    • Added Exosuit Nuclear Reactor (runs of normal, everyday uranium, maybe I'll switch it to run on enriched) - requires research (level 3 in Materials, Power Manipulation and Engineering)
    • +
    • Added Ripley construction steps sprites (courtesy of WJohnston - man, you're awesome)
    • +
    • Exosuit Sleeper can now inject occupant with reagents taken from Syringe Gun
    • +
    • Exosuit Cable Layer will now auto-dismantle floors
    • +
    • Exosuit Heavy Lazer cooldown increased, Scattershot now fires medium calibre ammo (less damage)
    • +
    • Exosuit wreckage can be pulled
    • +
    • EMP now drains half of current exosuit cell charge, not half of maximum charge.
    • +
    • Fixed several possible exosuit equipment runtimes
    • +
    • Introduced new markup to changelog. Javascript is extremely slow (in byond embedded browser) for some reason.
    • +
    +
    +
    +

    4 February 2012, World Cancer Day

    +

    Erro updated:

    +
      +
    • Examining humans now works a bit differently. Some external suits and helmets can hide certain pieces of clothing so you don't see them when examining. Glasses are also now displayed when examining.
    • +
    • The job selection screen has been changed a little to hopefully make making changes there easier.
    • +
    +
    +31 January 2012 +
      +
    • Carn updated: +
        +
      • Grammar & various bug-fixes
      • +
      • Thank-you to everyone who reported spelling/grammar mistakes. I'm still working on it, so if you spot anymore please leave a comment here. There's still lots to fix.
      • +
      • Mining station areas should no longer lose air.
      • +
      +
    + + +30 January 2012( +
      +
    • Sieve updated: +
        +
      • This stuff is actually already implemented, it just didn't make it to the changelog
      • +
      • Firefighter Mech - A reinforced Ripley that is more resistant to better cope with fires, simply look in the Ripley Contruction manual for instructions.
      • +
      • Mech contruction now has sounds for each step, not just 1/4 of them.
      • +
      • Mech Fabricators are fixed, Manual Sync now works and certain reseach will reduce the time needed to build components.
      • +
      • Added special flaps to the mining station that disallow air-flow, removing the need to shuffle Ore Boxes through the Airlocks.
      • +
      • Each outpost has it's own system for the conveyors so they won't interfere with each other.
      • +
      • Powercell chargers have been buffed so now higher capacity cells are actually useable.
      • +
      • A diamond mech drill has been added. While it isn't any stronger than the standard drill, it is much faster.
      • + +
      +
    + +29 January 2012, got Comp Arch exams on Wednesday :( +
      +
    • Agouri updated: +
        +
      • UPDATE ON THE UPDATE: Newspapers are now fully working, sorry for that. Some minor icon bugs fixed. Now I'm free to work on the contest prizes :3
      • +
      • Newscasters are now LIVE! Bug reports, suggestions for extra uses, tears etc go here.
      • +
      • What ARE newscasters? Fans of the Transmetropolitan series might find them familiar. Basically, they're terminals connected to a station-wide news network. Users are able to submit channels of their own (one per identified user, with channels allowing feed stories by other people or, if you want the channel to be your very own SpaceJournal, being submit-locked to you), while others are able to read the channels, either through the terminals or a printed newspaper which contains every news-story circulating at the time of printing.
      • +
      • About censorship: You can censor channels and feed stories through Security casters, found in the HoS'es office and the Bridge. Alternatively, if you want a channel to stop operating completely, you can mark it with a D-Notice which will freeze it and make all its messages unreadable for the duration it is in effect. If you've got the access, of course.
      • +
      • Basically I think of the newscaster as nothing more as an additional Roleplaying tool. Grab a newspaper along with your donuts and coffee from the machines, read station rumors when you're manning your desk, be a station adventurer or journalist with your very own network journal!
      • +
      • I would ask for a bit of respect when using the machine, though. I removed all and any channel and story restrictions regarding content, so you might end up seeing channels that violate the rules, Report those to the admins.
      • +
      • Finally, due to the removal of the enforced "Channel" string, it's recommended to name your channels properly ("Station Paranormal Activity Channel" instead of "Station Paranormal Activity", for example") + +
      +
    + +28 January 2012 +
      +
    • BubbleWrap updated: +
        +
      • Arresting buff!
      • +
      • A person in handcuffs being pulled cannot be bumped out of the way, nor can the person pulling them. They can still push through a crowd (they get bumped back to behind the person being pulled, or pushed ahead depending on intent).
      • +
      +
    + +27 January 2012 +
      +
    • LastyScratch updated: +
        +
      • Toggle-Ambience now works properly and has been moved from the OOC tab to the Special Verbs tab to be with all the other toggles.
      • +
      +
    • RavingManiac updated: +
        +
      • The bar now has a "stage" area for performances.
      • +
      +
    • Blaank updated: +
        +
      • Added a vending machine to atmopherics reception desk that dispenses large +oxygen tanks, plasma tanks, emergency oxegen tanks, extended capacity emergency +oxygen tanks, and breath masks.
      • +
      +
    • Petethegoat updated (for a bunch of other people): +
        +
      • Lattice is now removed when you create plating or floor (credit Donkieyo).
      • +
      • Monkeys now take damage while in crit (credit Nodrak).
      • +
      • The warden now has his own jacket. (credit Shiftyeyesshady).
      • +
      • Spectacular new dice that will display the proper side when rolled!! (credit TedJustice)
      • +
      • Spectacular new dice that will display the proper side when rolled!! (credit TedJustice)
      • + +
      • Borg RCDs can no longer take down R-walls. (headcoder orders)
      +
    + +19 January 2012 +
      +
    • Petethegoat updated: +
        +
      • Exciting new pen additions! Get the low-down at the wiki.
      • +
      +
    + +17 January 2012 +
      +
    • Doohl updated: +
        +
      • Syndicate shuttle now starts with a All-In-One telecommunication machine, which acts as a mini-network for the syndie channel. It intercepts all station radio activity, too, how cool is that?
      • +
      +
    + +15 January 2012 +
      +
    • Doohl updated: +
        +
      • The radio overhaul 'Telecommunications' is now LIVE. Please submit any opinions/feedback in the forums and check the wiki article on Telecommunications for some more info for the curious.
      • +
      • The AI satellite has been replaced with a communications satellite. You can get there via teleporter or space, just like the AI satellite. I highly recommend not bum-rushing the new satellite, as you may be killed if you don't have access. It's a very secure place.
      • +
      • Once a human's toxicity level reaches a certain point, they begin throwing up. This is a natural, but overall ineffective method of purging toxins from the body.
      • +
      • You can now travel Z-levels in Nuclear Emergency mode (the nuke disk is still bound to the station). This means the nuclear agents can and probably will fly off into space to blow up the comm satellite and shut down communications.
      • +
      +
    + +9 January 2012 +
      +
    • ConstantA updated: +
        +
      • Reworked exosuit internal atmospherics (the situation when exosuit is set to take air from internal tank, otherwise cabin air = location air): +
          +
        • If current cabin presure is lower than &quot;tank output pressure&quot;, the air will be taken from internal tank (if possible), to equalize cabin pressure to &quot;tank output pressure&quot;
        • +
        • If current cabin presure is higher than &quot;tank output pressure&quot;, the air will be siphoned from cabin to location until cabin pressure is equal to &quot;tank output pressure&quot;
        • +
        • Tank air is not altered in any way even if it's overheated or overpressured - connect exosuit to atmos connector port to vent it
        • +
        • &quot;Tank output pressure&quot; can be set through Maintenance window - Initiate maintenance protocol to get the option
        • +
        +
      • +
      • Fixed bug that prevented exosuit tank air updates if exosuit was connected to connector port
      • +
      • Combat exosuits melee won't gib dead mobs anymore
      • +
      • QM exosuit circuit crates cost lowered to 30 points
      • +
      • Exosuit plasma converter effectiveness +50%
      • +
      +
    + + +8 January 2012 +
      +
    • Agouri updated: +
        +
      • I'm back home and resumed work on Newscasters and Contraband.
      • +
      • But I got bored and made cargo softcaps instead. Flippable! Enjoy, now all we need is deliverable pizzas.
      • +
      • Oh, also enjoy some new bodybag functionality and sounds I had ready a while ago, with sprites from Farart. Use a pen to create a visible tag on the bodybag. Wirecutters to cut it off. Also it's no longer weldable because it makes no goddamn sense. +
      +
    + +7 January 2012 +
      +
    • Donkieyo updated: +
        +
      • You must now repair damaged plating with a welder before placing a floor tile.
      • +
      • You can now relabel canisters if they're under 1kPa.
      • +
      +
    • Polymorph updated: +
        +
      • Dragging your PDA onto your person from your inventory will bring up the PDA screen.
      • +
      • You can now send emergancy messages to Centcomm (Or, with some.. tampering, the Syndicate.) via a comms console. (This occurs in much the fashion as a prayer.)
      • +
      +
    +3 January 2012 +
      +
    • Erro updated: +
        +
      • Shift-clicking will now examine whatever you clicked on!
      • +
      +
    • Polymorph updated: +
        +
      • Alt-clicking will now pull whatever you clicked on!
      • +
      +
    + +1 January 2012 (12 more months until doomsday) +
      +
    • Doohl updated: +
        +
      • XENOS ARE NOW IMMUNE TO STUNNING! To compensate, stunning via tasers/batons now slows them down significantly.
      • +
      + +
    • Polymorph updated: +
        +
      • Doors no longer close if they have a mob in the tile. (Generally!) Door safties can now be overriden to close a door with a mob in the tile and injure them severely.
      • +
      + +
    + +29 December 2011 +
      +
    • ConstantA updated: +
        +
      • Added some new Odysseus parts and tweaked old ones.
      • +
      • Added Exosuit Syringe Gun Module
      • +
      • New Odysseus sprites - courtesy of Veyveyr
      • +
      +
    • Polymorph updated: +
        +
      • Air Alarms can now be hacked.
      • +
      • Too much of a good thing is just as bad as too little. Pressures over 3000 kPa will do brute damage.
      • +
      +
    + +28 December 2011 +
      +
    • RavingManiac updated: +
        +
      • Wrapped objects can now be labelled with a pen
      • +
      • Wrapped small packages can be picked up, and are now opened by being used on themselves
      • +
      • Mail office remapped such that packages flushed down disposals end up on a special table
      • +
      • Package wrappers placed in most of the station departments
      • +
      • In short, you can now mail things to other departments by wrapping the object, labelling it with the desired destination using a pen, and flushing it down disposals. At the mail room, the cargo tech will then tag and send the package to the department.
      • +
      +
    + +27 December 2011 +
      +
    • Errorage updated: +
        +
      • Engineering's been remapped
      • +
      +
    • RavingManiac updated: +
        +
      • Refrigerators and freezer crates will now preserve meat
      • +
      +
    + +25 December 2011 +
      +
    • ConstantA updated: +
        +
      • Circuit boards for Odysseus mech can be ordered by QM
      • +
      • Designs for them were added to R&amp;D
      • +
      +
    • +
    • Kor updated: +
        +
      • Soul Stones Added: Like intellicards for dead or dying humans! Full details are too long for the changelog
      • +
      • A belt full of six soul stones is available as an artefact for the wizard
      • +
      • Cultists can buy soulstones with their supply talisman
      • +
      • The chaplain has a single soulstone on his desk
      • +
      • The reactive teleport armour's test run is over. It no longer spawns in the RD's office.
      • +
      +
    • +
    + + + +24 December 2011 +
      +
    • Rockdtben updated: +
        +
      • Added sprites for soda can in left and right hands on mob: sodawater, tonic, purple_can, ice_tea_can, energy_drink, thirteen_loko, space_mountain_wind, dr_gibb, starkist, space-up, and lemon-lime.
      • +
      +
    • + +
    + +23 December 2011 +
      +
    • ConstantA updated: +
        +
      • Mech Fabricators now require robotics ID to operate. Emag removes this restriction.
      • +
      • Added Odysseus Medical Exosuit. Has integrated Medical Hud and ability to mount medical modules.
      • +
      • Added Sleeper Medical module for exosuits. Similar to common sleepers, but no ability to inject reagents.
      • +
      • Added Cable Layer module for exosuits. Load with cable (attack cable with it), activate, walk over dismantled floor.
      • +
      • Added another exosuit internal damage type - short circuit. Short-circuited exosuits will drain powercell charge and power relay won't work.
      • +
      • You should be able to send messages to exosuit operators using Exosuit Control Console
      • +
      • Gygax armour and module capacity nerfed.
      • +
      • Exosuit weapon recharge time raised.
      • +
      • Bugfix: EMP actually drains exosuit cell and damages it
      • +
      +
    • +
    • RavingManiac updated: +
        +
      • Meat will now spoil within three minutes at temperatures between 0C and 100C.
      • +
      • Rotten meat has the same nutritional value as normal meat, and can be used in +the same recipes. However, it is toxic, and ingesting a badly-prepared big bite +burger can kill you.
      • +
      • Because refrigeration serves a purpose now, the kitchen cold room freezing unit +is turned off by default. Chefs should remember to turn the freezer on at the +start of their shift.
      • +
      +
    • +
    + +21 December 2011 +
      +
    • RavingManiac updated: +
        +
      • Kitchen cold room is now cooled by a freezing unit. Temperature is about 240K by default, but can be raised to room temperature or lowered to lethal coldness.
      • +
      +
    + +19 December 2011 +
      +
    • Kor updated: +
        +
      • General/Misc Changes +
          +
        • Escape pods no longer go to the horrific gibbing chambers. Rather, they will be picked up by a salvage ship in deep space. (This basically changes nothing mechanics wise, just fluff)
        • +
        • An ion rifle now spawns on the nuclear operative shuttle. Maybe this will help with them getting destroyed by sec borgs every round?
        • +
        +
      • +
      • Wizard Changes +
          +
        • The wizard can now purchase magic artefacts in addition to spells in a subsection of the spellbook.
        • +
        • The first (and currently only) new artefact is the Staff of Change, which functions as a self recharging energy weapon with some special effects.
        • +
        • The wizard has a new alternative set of robes on his shuttle.
        • + +
        +
      • Cult Changes
          +
        • Cultists now each start with three words (join, blood, self). No more will you suffer at the hands of cultists who refuse to share words.
        • +
        • The starting supply talisman can now be used five times and can now be used to spawn armor and a blade.
        • +
        • Replaced the sprites on the cultist robes/hood.
        • +
      • +
      +
    + +18 December 2011 +
      +
    • Carnwennan updated: +
        +
      • Thanks to the wonders of modern technology and the Nanotrasen steel press Ian's head has been shaped to fit even more silly hats. The taxpayers will be pleased.
      • +
      +
    • +
    • Doohl updated: +
        +
      • Vending machines got yet another overhaul! Good lord, when will they stop assfucking those damned vendors??
      • +
      +
    • +
    + +17 December 2011 +
      +
    • Erro updated: +
        +
      • Your direct supervisors are now displayed when you are assigned a job at round start or late join.
      • +
      +
    • +
    + +14 December 2011 +
      +
    • Erro updated: +
        +
      • Meteor mode is hopefully deadly again!
      • +
      +
    • +
    • Kor updated: +
        +
      • Research director has a new toy: Reactive Teleport Armour. Click it in your hand to activate it and try it out!
      • +
      +
    • +
    + +11 December 2011 +
      +
    • NEO updated: +
        +
      • AIs actually consume power from APCs now
      • +
      • Bigass malf overhaul. tl;dr no more AI sat, instead you have to play whackamole with APCs.
      • +
      +
    • +
    + +10 December 2011 +
      +
    • Doohl updated: +
        +
      • Title music now plays in the pregame lobby. You can toggle this with a verb in "Special Verbs" if you really want to.
      • +
      • User Interface preferences now properly get transferred when you get cloned.
      • +
      +
    • +
    • Erro updated: +
        +
      • Escape pods have been added to test the concept.
      • +
      • Escaping alone in a pod does not count towards the escape alone objective, it counts towards the escape alive objective tho. Escape alone only requires you to escape alone on the emergency shuttle, it doesn't require you to ensure all pods are empty. Cult members that escape on the pods do not ocunt towards the cult escaping acolyte number objective. Escaping on a pod is a valid way to survive meteor.
      • +
      +
    • +
    • Polymorph updated: +
        +
      • Fire is now actually dangerous. Do not touch fire.
      • +
      +
    • + + +
    + +8 December 2011 +
      +
    • Errorage updated: +
        +
      • Fixed the comms console locking up when you tried to change the alert level.
      • +
      • Added a keycard authentication device, which is used for high-security events. The idea behind it is the same as the two-key thing from submarine movies. You select the event you wish to trigger on one of the devices and then swipe your ID, if someone swipes their ID on one of the other devices within 2 seconds, the event is enacted. These devices are in each of the head's offices and all heads have the access level to confirm an event, it can also be added to cards at the HoP's ID computer. The only event that can currently be enacted is Red alert.
      • +
      +
    • +
    • Kor updated: +
        +
      • The chef now has a fancy dinner mint in his kitchen. It is only wafer thin!
      • +
      +
    • +
    + +3 December 2011 +
      +
    • Pete & Erro Christmas update: +
        +
      • Reinforced metal renamed to steel and steel floor tile renamed to metal floor tile to avoid confusion before it even happens.
      • +
      • It is no longer possible to make steel from metal or vice versa or from the autolathe. You can however make metal from the autolathe and still insert steel to increase the metal resource.
      • +
      • To make steel you can now use the mining smelting unit and smelt iron and plasma ore.
      • +
      • The RCD can no longer take down reinforced walls.
      • +
      +
    • +
    • Errorage updated: +
        +
      • Grass plants in hydro now make grass floor tiles instead of the awkward patches.
      • +
      +
    • +
    • Petethegoat updated: +
        +
      • Fixed all known vending machine issues.
      • +
      • Fixed a minor visual bug with emagged lockers.
      • +
      • Clarified some of the APC construction/deconstruction messages.
      • +
      +
    • +
    • Numbers updated: +
        +
      • Potency variations tipped in favour of bigger changes over smaller periods of time.
      • +
      +
    • +
    • PolymorphBlue updated: +
        +
      • Traitors in the escape shuttle's prison cell will now fail their objective.
      • +
      • Lockers are no longer soundproof! (or flashproof, for that matter)
      • +
      • Headrevs can no longer be borged, revs are dereved when borged. +
      +
    • +
    + +30 November 2011 +
      +
    • Vinyl Scratch updated: +
        +
      • New ambient sounds for the station and AI Sat.
      • +
      • He's baaaaaack...
      • +
      +
    • +
    + +27 November 2011 +
      +
    • Kor updated: +
        +
      • Changeling husks are now borgable again (though not clonable) and genome requirements were lowered
      • +
      • De-revved revolutionaries had their message clarified a bit. You remember the person who flashed you, and so can out ONE revhead
      • +
      • Light tubes/bulbs can now be created in the autolathe. Recycle those broken lights!
      • +
      +
    • +
    + +22 November 2011 +
      +
    • Doohl updated: +
        +
      • The firing range now has a purpose. Go check it out; there's a few surprises!
      • +
      +
    • +
    + +19 November 2011 +
      +
    • Doohl updated: +
        +
      • Toggling admin midis will now DISABLE THE CURRENT MIDI OH MY GOSH!
      • +
      +
    • +
    • Tobba updated: +
        +
      • We're looking for feedback on the updated chem dispenser! It no longer dispenses beakers of the reagent, and instead places a variable amount of the reagent into the beaker of your choosing.
      • +
      +
    • +
    • Petethegoat updated: +
        +
      • Diagonal movement is gone on account of them proving to be a bad idea in practice. A grand experiment nonetheless.
      • +
      +
    • +
    • Kor updated: +
        +
      • The PALADIN lawset in the AI upload has been replaced with the corporate lawset
      • +
      +
    • +
    + +16 November 2011 +
      +
    • Tobba updated: +
        +
      • Report any issues with the updated vending machines!
      • +
      +
    • +
    + +16 November 2011 +
      +
    • Petethegoat updated: +
        +
      • Security, Engineer, Medical, and Janitor borgs no longer get a choice of skin. This is for purposes of quick recognition, and is the first part of a series of upcoming cyborg updates.
      • +
      +
    • +
    + +7 November 2011 +
      +
    • Kor updated: +
        +
      • Repair bots (mechs) are now adminspawn only
      • +
      • Extra loyalty implants are now orderable via cargo bay (60 points for 4 implants)
      • +
      • Changeling regen stasis now takes two full minutes to use, but can be used while dead. Burning and gibbing are the only way to keep them dead now.
      • +
      +
    • +
    + +29 October 2011 +
      +
    • ConstantA updated: +
        +
      • Added step and turn sounds for mechs
      • +
      • Added another mecha equipment - plasma converter. Works similar to portable generator. Uses solid plasma as fuel. Can be refueled either by clicking on it with plasma in hand, or directly from mecha - selecting it and clicking on plasma.
      • +
      • Added mecha laser cannon.
      • +
      • Added damage absorption for mechs. Different mechs have different absorption for different types of damage.
      • +
      • Metal foam now blocks air movement.
      • +
      +
    • +
    • Petethegoat updated: +
        +
      • Fixed sticking C4 to containers.
      • +
      • Rearranged the armoury, and changed the medical treatment room in Sec to an interrogation room.
      • +
      • Mr Fixit has been powered off and returned to the armoury. Deploying him every round is still recommended!
      • +
      +
    • +
    + +29 October 2011 +
      +
    • Petethegoat updated: +
        +
      • Stunglove overhaul: part one. Stun gloves are now made by wiring a pair of gloves, and then attaching a battery- this shows up on the object sprite, but not on your character. Stungloves use 2500 charge per stun! This means that some low capacity batteries will make useless stungloves. To get your old inconspicous gloves back, simply cut away the wire and battery. Note that insulated gloves lose their insulation when you wire them up! Yet to come: stungloves taking extra damage from shocked doors.
      • +
      • Removed sleepypens! Paralysis pens have been changed to look like normal pens instead of penlights, and have been slightly nerfed. They will paralyse for about fifteen seconds, and cause minor brain damage and dizziness. +
      • Uplink Implants now have five telecrystals instead of four. +
      +
    • +
    • Doohl updated: +
        +
      • More hairs added and a very long beard.
      • +
      • Finally fixed the request console announcements going AMP AMP AMP all the time when you use punctuation.
      • +
      +
    • +
    + +27 October 2011 +
      +
    • Mport updated: +
        +
      • New WIP TK system added. To activate your TK click the throw button with an empty hand. This will bring up a tkgrab item. Click on a non-anchored (currently) non mob Object to select it as your "focus". Once a focus is selected so long as you are in range of the focus you can now click somewhere to throw the focus at the target. To quit using TK just drop the tkgrab item.
      • +
      +
    • +
    + +21 October 2011, Tuesday: +
      +
    • Errorage updated: +
        +
      • Old keyboard hotkey layout option available again! home, end, page down and page up now once again do what they did before by default. To use diagonal movement you will need to use your numpad with NUM LOCK enabled.
        + The new list of hotkeys is as follows: (Valid as of 21.10.2011) +
          +
        • Numpad with Num Lock enabled = movement in wanted direction.
        • +
        • Numpad with Num Lock disabled = as it was before. movement north-south-east-west and throw, drop, swap hands, use item on itself.
        • +
        • Page up (also numpad 9 with num lock disabled) = swap hands
        • +
        • Page down (also numpad 3 with num lock disabled) = use item in hand on itself
        • +
        • home (also numpad 7 with num lock disabled) = drop
        • +
        • end (also numpad 1 with num lock disabled) = throw
        • +
        • CTRL + A = throw
        • +
        • CTRL + S = swap hands
        • +
        • CTRL + D = drop
        • +
        • CTRL + W = use item in hand on itself
        • +
        • Numpad divide (/) = throw
        • +
        • Numpad multiply (*) = swap hands
        • +
        • Numpad subtract (-) = drop
        • +
        • Numpad add (+) = use item in hand on itself
        • +
        + In short, use Num Lock to swap between the two layouts. +
      • +
      +
    • +
    + +18 October 2011, Tuesday: +
      +
    • Errorage updated: +
        +
      • You can now move diagonally! To do so, use the numpad. The keybaord has been remapped to make this possible: +
          +
        • CTRL + A = throw
        • +
        • CTRL + S = swap hands
        • +
        • CTRL + D = drop
        • +
        • CTRL + W = use item in hand on itself
        • +
        • Numpad divide (/) = throw
        • +
        • Numpad multiply (*) = swap hands
        • +
        • Numpad subtract (-) = drop
        • +
        • Numpad add (+) = use item in hand on itself
        • +
        +
      • +
      +
    • +
    + +15 October 2011, White Cane Safety Day: +
      +
    • Agouri updated: +
        +
      • There has been a tidal wave of bugfixes over the last 5 or so days. If you had previously tried something on the station, saw that it was bugged and never tried it again, chances are it got fixed. I don't want you to neglect using stuff because you think it was bugged, which it was at one point, but no longer is. Thanks, happy new semester to everyone~
      • +
      +
    • +
    • Errorage updated: +
        +
      • When you're unconscious, paralyzed, sleeping, etc. you will still see the same blackness as always, but it will rarely flicker a bit to allow you to see a little of your surroundings.
      • +
      +
    • +
    • Doohl updated: +
        +
      • New hairstyles! YOU never asked for this!
      • +
      +
    • +
    + +11 October 2011: +
      +
    • ConstantA updated: +
        +
      • Added radios to exosuits. Setting can be found in 'Electronics' menu.
      • +
      • Exosuit maintenance can be initiated even if it's occupied. The pilot must permit maintenance through 'Permissions &amp; Logging' - 'Permit maintenance protocols'. For combat exosuits it's disabled by default. While in maintenance mode, exosuit can't move or use equipment.
      • +
      +
    • +
    + +8 October 2011: +
      +
    • Doohl updated: +
        +
      • You can put things on trays and mass-transport them now. To put stuff on trays, simply pick up a tray with items underneath/on top of it and they'll be automatically carried on top of the tray. Be careful not to make a mess~!
      • +
      +
    • +
    • Mport updated: +
        +
      • Telekenesis now only allows you to pick up objects.
      • +
      • Stun gloves ignore intent.
      • +
      • Moved the loyalty implants to the HoS' locker.
      • +
      • Job system redone, remember to setup your prefs.
      • +
      +
    • +
    + +2 October 2011: +
      +
    • Petethegoat updated: +
        +
      • Pandemic recharge speed is affected by the number of different types of antibodies in the blood sample. For maximum efficiency, use blood samples with only a single type of antibody. (Blood samples with two types of antibodies will still let the Pandemic recharge slightly faster than it used to.)
      • +
      +
    • +
    • Errorage updated: +
        +
      • Opening a storage item on your belt will now display the proper number of slots even if the number is different from 7.
      • +
      • Less ponies, gryphons, and Tohou.
      • +
      +
    • +
    + +1 October 2011: +
      +
    • Knognob Lungsparkle updated: +
        +
      • Xenomorphic aliens can now shape resin membranes (organic windows basically).
      • +
      • The AI can no longer see runes. Instead, they will see blood splatters.
      • +
      +
    • +
    + +28 September 2011: +
      +
    • Rolan7 updated: +
        +
      • New method for job assignment. Remember to review your preferences. Send all your hate and bug reports to me.
      • +
      +
    • +
    • Doohl updated: +
        +
      • Putting someone inside a cloning machine's DNA scanner will notify the person that they are about to be cloned. This completely removes the necessity to announce over OOC for someone to get back in their body.
      • +
      +
    • +
    + +22 September 2011, OneWebDay: +
      +
    • Errorage updated: +
        +
      • Added an additional 9 colors, into which you can color bedsheets, jumpsuits, gloves and shoes at the washing machine.
      • +
      • A new click proc will need to be live-tested. The testing will be announced via OOC and you will get a message when it happens. When testing is going on, the new click proc will be used. If testing is going on and you notice a bug, please report it via adminhelp. If you find yourself unable to perform an action, you can double click (By that I mean spam the shit out of clicking) to use the old proc, which is unchanged and will behave like you're used to. Standard roleplay rules apply during tests, they're not an excuse to murder eachother.
      • +
      +
    • +
    + +20 September 2011, 10 year anniversary of the declaration of the "war on terror": +
      +
    • Errorage updated: +
        +
      • You can no longer clone people who suicided. I REPEAT! You can no longer clone people who have suicided! So use suiciding more carefully and only if you ACTUALLY want to get out of a round. You can normally clone people who succumbed tho, so don't worry about that.
      • +
      • Washing your hands in the sink will now only wash your hands and gloves. You can wash items if you have them in your hands. Both of these actions are no longer instant tho.
      • +
      +
    • +
    + +18 September 2011, World Water Monitoring Day: +
      +
    • Errorage updated: +
        +
      • Added the most fun activity in your every-day life. Laundry. Check the dormitory. (Sprites by Hempuli)
      • +
      • You can now change the color of jumpsuits, shoes, gloves and bedsheets using the washing machine.
      • +
      • Some religions (currently Islam, Scientology and Atheism) set your chapel's symbols to the symbols of that religion.
      • +
      • A new old-style cabinet's been added to the detective's office. (Sprite by Hempuli)
      • +
      • Runtime the cat ran away!! And it gets even worse! Mr. Deempisi met a premature end during an excursion to the kitchen's freezer! -- I was ORDERED to do this... don't kill me! :(
      • +
      • Kudzu can now be spawned (Currently admin-only. Will test a bit, balance it properly and add it as a random event) (Original code and sprites donated by I Said No)
      • +
      +
    • +
    • Kor updated: +
        +
      • Added purple goggles to chemistry (you're welcome Lasty)
      • +
      • Added a third MMI to robotics and monkey cubes to xenobio (dont fucking spam them in the halls)
      • +
      +
    • +
    • Mport updated: +
        +
      • Turns out tasers and a few other weapons were slightly bugged when it came to checking the internal powercell. Tasers and such gained an extra shot.
      • +
      • Ion Rifle shots lowered to 5 per charge.
      • +
      +
    • +
    + +17 September 2011, Operation Market Garden remembrance day: +
      +
    • Errorage updated: +
        +
      • You can now insert a coin into vending machines. Some machines (currently only the cigarette vending machine) have special items that you can only get to with a coin. No, hacking will not let you get the items, coin only.
      • +
      +
    • +
    + +14 September 2011: +
      +
    • Lasty updated: +
        +
      • Runtime now actually spawns in medbay because nobody cared whether it is a tiny smugfaced espeon that explodes violently on death or a spacecat that presumably doesn't.
      • +
      • You can no longer put someone into a sleeper and erase them from existence by climbing into the same sleeper.
      • +
      • Players who haven't entered the game will no longer be able to hear administrators in deadchat.
      • +
      +
    • +
    • Pete updated: +
        +
      • Added new sprites for the light tube and glasses boxes.
      • +
      • Fixed the bug where syndicate bundles would have an emergency O2 tank and breath mask.
      • +
      +
    • +
    • Mport, SECOND REMOVER OF SUNS updated: +
        +
      • Singularity absorbtion explosion range lowered and is now dependent on singularity size.
      • +
      • Bag of Holding no longer instakills singularity, and the chance for bombs to destroy a singularity has been changed from 10% to 25%.
      • +
      • Removed THE SUN.
      • +
      • Damage and stun duration from shocked doors has been lowered to account for a larger amount of energy in the powernet.
      • +
      +
    • +
    +13 September 2011: +
      +
    • Errorage updated: +
        +
      • Healing, attacking or 'gently tapping' Ian will now properly display the name of the attacker to all people.
      • +
      +
    • +
    • Vinyl Scratch updated: +
        +
      • Runtime!
      • +
      • Mine ambience now fades out at the end so that not only is it less jarring when it ends, but it also loops properly.
      • +
      • Malfunctioning AI's runtime message now has a voice clip to go with it (courtesy of Rosen Ritter)
      • +
      • Every headset will now display the commands for their respective channels upon examine.
      • +
      +
    • +
    • Miss Phaeron updated: +
        +
      • E-Swords now have a chance to deflect projectiles when active
      • +
      • Taser/Laser shots now drain 40 battery per use from a borg, as opposed to 20
      • +
      • EMPs do 60 damage to borgs now, up from 25. They also stun them momentarily and drain 1k charge
      • +
      • As part of a joint effort between Mport, Falazameer, and myself an Ion Rifle has been added to the armoury
      • +
      • The Mutate spell now gives Laser Vision and Hulk
      • +
      +
    • + +
    + + +11 September 2011: +
      +
    • Errorage updated: +
        +
      • Ian can now be toolboxed.
      • +
      • Ian can now be healed with bruisepacks, unless he's already dead.
      • +
      • You can now walk over Ian when he's killed.
      • +
      • Ian will chase food, if you leave it on the floor. If he notices it and you pick it up, he'll chase you around, if you stay close enough.
      • +
      +
    • +
    + +10 September 2011: +
      +
    • Errorage updated: +
        +
      • A new pet on the bridge.
      • +
      • The pet can now be buckled and will no longer escape from closed containers, such as closets or the cloning pods.
      • +
      • Vending machines and request consoles are the first to use the new in-built browser in the upper-right of the user interface. If feedback is positive on these, more machines will be added to this. Hoping that this will eventually reduce the number of popup micromanagement.
      • +
      +
    • +
    • Lasty updated: +
        +
      • The collectible hats have been removed from the theatre, doomed to rot forever in the hat crates they spawned from. No longer shall you see racks full of "collectible hard hat"!
      • +
      +
    • +
    • TLE updated: +
        +
      • You can now toggle the message for becoming a pAI on and off in your prefs.
      • +
      +
    • +
    • Mport updated: +
        +
      • Synaptizine now once again helps you recover from being stunned, however it is now also slightly toxic and may cause a small amount of toxins damage for every tick that it is in your system.
      • +
      • Assembly updating!
      • +
      • Original blob is back, though it still has lava sprites.
      • +
      • The bug where you would spawn on the wizard shuttle for a second at the start of the round should no longer occur.
      • +
      +
    • +
    + +8 September 2011: +
      +
    • Lasty updated: +
        +
      • Suicide has been changed to biting your tongue off instead of holding your breath, and examining someone who has comitted suicide will give you a message stating that their tongue is missing.
      • +
      • Chemsprayers are now large items instead of small, meaning they can no longer fit in your pocket.
      • +
      +
    • +
    + +6 September 2011 +
      +
    • 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
      • +
      • More info here: rev2136
      • +
      +
    • +
    • Lasty updated: +
        +
      • Fixed the karma exploit! Uhangi can rest in peace knowing his -87 karma ways were not his own.
      • +
      • Added new ambient sound for space and the mines.
      • +
      • Examining an oxygen tank will now tell you if it is about to run out of air. If it is, you will recieve a beep and a message, and if not, then you'll just get the default "this is an oxygentank!" message.
      • +
      +
    • +
    • Rageroro updated: +
        +
      • Sleeper update! Sleepers can now only inject soporific, dermaline, bicaridine, and dexaline into people with 1% or more health. They can also inject inaprovaline into people with -100% or more health. Nothing can be injected into people who are dead.
      • +
      +
    • +
    • Superxpdude updated: +
        +
      • Virology is now part of medbay, and as such the RD no longer has Virology access and the CMO and Virologist no longer have Research access.
      • +
      +
    • +
    • Uhangi updated: +
        +
      • Electropacks, screwdrivers, headsets, radio signalers, and station bounced radios can now be constructed from the autolathe.
      • +
      • Added a courtroom to Centcom.
      • +
      • Fixed electropack bug regarding using screwdrivers on electropacks.
      • +
      +
    • +
    • Microwave updated: +
        +
      • Nuka Cola re-added.
      • +
      +
    • +
    • Urist McDorf updated: + +
    • +
    • Cheridan updated: +
        +
      • New sprites for beds and air, plasma and nitrogen tanks (The ones found in maintenance shafts).
      • +
      +
    • +
    +5 September 2011. +
      +
    • Rageroro updated: +
        +
      • Updates made to the HoP's ID computer. New interface and removing a card will now put it directly in your hand, if it's empty. Using your card on the computer will place it in the appropriate spot. If it has access to edit cards it will put it as the authentication card, otherwise as the card to be modified. If you have two cards with ID computer access first insert the authentication card, then the one you wish to midify, or do it manually like before.
      • +
      • Placed extra fire suits in maintenance (Near eva and mining) and an extra fire closet to atmos.
      • +
      +
    • +
    + +4 September 2011. +
      +
    • Urist McDorf updated: +
        +
      • People who have been infected by facehuggers can no longer suicide.
      • +
      • Stammering has been reworked.
      • +
      • The chaplain can now no longer discern what ghosts are saying, instead receiving flavour text indicating that ghosts are speaking to him.
      • +
      • Walking Mushroom yield decreased from 4 to 1.
      • +
      • Glowshrooms now only spread on asteroid tiles.
      • +
      • Fixed rev round end message reporting everyone as dead.
      • +
      • Gave the changeling an unfat sting.
      • +
      +
    • Erro updated: +
        +
      • R'n'D and Gas Storage locations have been swapped in order for R&D to be given a hallway-facing table, just like Chemistry.
      • +
      • Buckling someone to a chair now causes them to face in the same direction as the chair.
      • +
      • Conveyor will now move only 10 items per game cycle. This is to prevent miners from overloading the belts with 2000 pieces of ore and slowing down time by turning it on. Does not apply to mobs on belt.
      • +
      +
    • Doohl updated: +
        +
      • New escape shuttle!
      • +
      • Metroids get hungry slower, but gain more nutrients from eating.
      • +
      +
    • Kor updated: +
        +
      • Added Necronomicon bible (credit Joseph Curwen)
      • +
      • Removed Doc Scratch clothing from chaplain? locker and added as a random spawn in the theatre.
      • +
      • Shaft Miners now start with regular oxygen tanks.
      • +
      • Mutate now gives the wizard hulk and OPTIC BLAST instead of hulk and TK.
      • +
      • Spiderman suit is no longer armoured or space worthy.
      • +
      • Crayons
      • +
      +
    • Superxpdude updated: +
        +
      • New, more appropriate arrivals message.
      • +
      • Shuttle escape doors fixed.
      • +
      • New RIG sprite.
      • +
      +
    • Lasty updated: +
        +
      • Switched xenomorph weeds to run in the background, hopefully causing them to destroy the server slightly less.
      • +
      +
    • Microwave updated: +
        +
      • Added sink to hydroponics
      • +
      • Cleaned up autolathe menu
      • +
      • Glasses and cups can now be filled with water from sinks.
      • +
      +
    + +31 August 2011. +
      +
    • Lasty updated: +
        +
      • The costumes that spawn in the theatre are now randomized.
      • +
      • The kitchen now has a Smartfridge which can be directly loaded from the Botanist? plantbags. No more crates! (credit to Rolan7).
      • +
      • Snappops can now be acquired from the arcade machines. Amaze your friends! (credit to Petethegoat)
      • +
      • Bangindonk.ogg added to random end sounds list.
      • +
      +
    • Urist McDorf updated: +
        +
      • Players can no longer be randomly assigned to Librarian, Atmospherics Technician, Chaplain, and Lawyer unless all other non-assisstant job slots are full or they have those jobs in their preferences.
      • +
      • Changeling mode now has multiple changelings.
      • +
      +
    • Superpxdude updated: +
        +
      • The mail system actually works properly now! Probably!
      • +
      • Most hats had their ?eadspace?tag removed, meaning they will no longer substitute for a space helmet in protecting you from the dangers of space.
      • +
      +
    + +28 August 2011. +
      +
    • Doohl updated: +
        +
      • Chaplains can now select different bible icons when they start. The selection is applied globally and the library's bible printer will print the same bibles.
      • +
      • Joy to the world! The Library's bible-printing function now has a one-minute cooldown. One minute may seem a little extreme, but it is necessary to prevent people from spamming the fuck out of everything with 100,000,000,000,000 carbon-copy bibles.
      • +
      • Tweaked Metroids a bit; they are slightly more aggressive and become hungrier faster. To compensate, they now move slightly slower.
      • +
      +
    + +26 August 2011. +
      +
    • Mport updated: +
        +
      • Rev:
      • +
          +
        • Station Heads or Head Revs who leave z1 will count as dead so long as they are off of the z level.
        • +
        • Once a player has been unconverted they may not be reconverted.
        • +
        +
      • Cult:
      • +
          +
        • Heads other than the Captain and HoS are now able to start as or be converted to a cultist.
        • +
        • New Item: Loyalty Implant, which will prevent revving/culting. 4 spawn in the armory.
        • +
        • If a rev (not cultist) is injected with one he will unconvert, if a revhead is injected it will display a resist message.
        • +
        • Loyalty Implants show up on the SecHud
        • +
        • New Machine: Loyalty Implanter - Is on the prison station, shove a guy inside it to implant a loyalty implant. It can implant 5 times before it needs a 10 minute cooldown.
        • +
        +
      +
    + +20 August 2011. +
      +
    • Doohl updated: +
        +
      • The smoke chemistry recipe has been upgraded! You can lace smoke with chemicals that can bathe people or enter their lungs through inhalation. Yes, this means you can make chloral hydrate smoke bombs. No, this doesn't mean you can make napalm smoke or foam smoke.
      • +
      +
    + +16 August 2011. +
      +
    • Superxpdude updated: +
        +
      • Traitor item bundles: Contains a random selection of traitor gear
      • +
      +
    + +
      +
    • Uhangi updated: +
        +
      • .38 Special Ammo can now be made from unhacked autolathes
      • +
      +
    + +15 August 2011. +
      +
    • Superxpdude updated: +
        +
      • NEW MINING STATION, POST YOUR OPINIONS AND BUGS HERE
      • +
      • Added some new awesome mining-related sprites by Petethegoat. All credit for the sprites goes to him.
      • +
      +
    + +9 August 2011. +
      +
    • Mport updated: +
        +
      • Cyborgs once again have open cover/cell icons.
      • +
      • To override a cyborg's laws you must emag it when the cover is open.
      • +
      • Emags can unlock a cyborgs cover.
      • +
      • Xbow radiation damage has been lowered from 100 to 20 a hit
      • +
      +
    + +5 August 2011. +
      +
    • Mport updated: +
        +
      • The various assemblies should be working now.
      • +
      • Old style bombs and suicide vests temporarily removed.
      • +
      +
    + +3 August 2011. +
      +
    • Superxpdude updated: +
        +
      • Virology Airlock changed to no longer cycle air. Should work faster and prevent virologists from suffocating.
      • +
      • Server Room APC is now connected to the power grid.
      • +
      • Stun Batons now start OFF. Make sure to turn them on before hitting people with them.
      • +
      +
    + +2 August 2011. The day the earth stood still. +
      +
    • Agouri updated: +
        +
      • SSUs now correctly cycle and dump the unlucky occupant when designated to supercycle, when the criteria to do so are met.
      • +
      • Fixed bugshit
      • +
      • You can now make normal martinis again, removed a silly recipe conflict (Thanks, muskets.). Good barmen are urged to blend the good ol' recipes since the new ones have sprites that SUCK ASS JESUS CHRIST
      • +
      +
    + +
      +
    • Doohl updated: +
        +
      • Speech bubbles: you can toggle them on in the character setup window. Basically, whenever someone around you talks, you see a speech bubble appear above them.
      • +
      • You can no longer create wizarditis and xenomicrobes with metroid cores.
      • +
      • Tweak: Using an exclamation mark as an AI, pAI, or cyborg will not longer get rid of the last exclamation mark.
      • +
      +
    + +30 July 2011. +
      +
    • Superxpdude Updated: +
        +
      • Engineer and CE space helmets now have built-in lights.
      • +
      +
    • Rockdtben updated: +
        +
      • Bugfix: Fixed a bug where you could dupe diamonds
      • +
      +
    • Doohl updated: +
        +
      • New virus: Retrovirus. It basically screws over your DNA.
      • +
      • You can now do CTRL+MOVEMENT to face any direction you want. See those chairs in Medbay and the Escape Wing? You can do CTRL+EAST to actually RP that you're sitting on them. Is this cool or what?! +
      +
    + +29 July 2011. - Day of Forum revival! +
      +
    • Doohl updated: +
        +
      • Bugfix: Metroids should never "shut down" and just die in a corner when they begin starving. And so, hungry Metroids are a force to be feared.
      • +
      • The Cargo computers now have the ability to cancel pending orders to refund credits. This was put in place so that idiots couldn't waste all the cargo points and run off. However, if the shuttle is en route to the station you won't be able to cancel orders.
      • +
      • Bugfix: the manifest has been fixed! Additionally, the manfiest is now updated realtime; job changes and new arrivals will be automatically updated into the manifest. Joy!
      • +
      • Metroids, when wrestled off of someone's head or beaten off, now get stunned for a few seconds.
      • +
      +
    • Agouri updated: +
        +
      • I was always bothered by how unprofessional it was of Nanotransen (in before >Nanotransen >professionalism) to just lay expensive spacesuits in racks and just let them be. Well, no more. Introducing...
      • +
      • Suit Storage Units. Rumored to actually be repurposed space radiators, these wondrous machines will store any kind of spacesuit in a clean and sterile environment.
      • +
      • The user can interact with the unit in various ways. You can start a UV cauterisation cycle to disinfect its contents, effectively sterilising and cleaning eveyrthing from the suits/helmets stored inside.
      • +
      • A sneaky yordle can also hide in it, if he so desires, or hack it, or lock it or do a plethora of shady stuff with it. Beware, though, there's plenty of dangerous things you can do with it, both to you and your target.
      • +
      • The Unit's control panel can be accessed by screwdriving it. That's all I'm willing to say, I'd like to let the players find out what each hack option does and doesn't. Will add more stuff later.
      • +
      • Added Command Space suit, Chief Engineer space suit and Chief Medical Officer spacesuit (In a new space that you'll probably notice by yourself) to make it easier for you to look like a special snowflake.
      • +
      • EVA and CMO office modified to accomodate the new suits and SSUs. Look, I'm not a competent mapper, okay? Fuck you too. A mapper is strongly recommended to rearrange my half assed shit.
      • +
      • Soda cans, cigarette packets, cigarettes and cigars as well as bullet casings are now considered trash and can be picked up by the trashbag. Now you can annoy the janitor even more!
      • +
      • Sprite credit goes to Alex Jones, his portfolio can be found here: http://bspbox.com. Thanks a lot, bro.
      • +
      • With the recent forum fuss and all that, I've got a thread to specifically contain rants and bug reports about this update. Click me
      • +
      +
    • Uhangi updated: +
        +
      • EVA redesigned
      • +
      • An electropack is now available once again on the prison station
      • +
      +
    • Errorage updated: +
        +
      • Hopefully fixed the derelict 'hotspots'. Derelict medbay has also been fixed.
      • +
      +
    + +4 July - 28 July 2011. +
      + +
    • Trubble Bass updated (committed by Superxpdude): +
        +
      • Hat crates. Hat Station 13.
      • +
      +
    • Matty: +
        +
      • Engineers and miners now start off with the new industrial backpack.
      • +
      +
    • Agouri: +
        +
      • Sleepers are now OP and heal every kind of damage.
      • +
      • Made cloning 30% faster, due to popular demand.
      • +
      +
    • Superxpdude updated: +
        +
      • Added in the Submachine Gun to R&D.
      • +
      • Syndicate agents now have Mini-Uzis.
      • +
      • Added an exosuit recharged to the mining station.
      • +
      • New labcoats for scientists, virologists, chemists, and genetecists.
      • +
      • Moved the vault and added a bridge meeting room next to the HoP's office.
      • +
      • Deathsquad armor now functions like a space suit.
      • +
      • Added in security jackboots.
      • +
      +
    • Uhangi updated: +
        +
      • Traitors can now purchase syndicate balloons, which serve no purpose other than to blow your cover. For a limited time only, you can get them at a bargain price - just 10 telecrystals!
      • +
      • Removed security shotguns from the armory. No fun allowed.
      • +
      • Changed some bullet damage stuff.
      • +
      +
    • Microwave updated: +
        +
      • Monkey boxes:
      • +
      • Contains a score of monkey cubes, which you apply water to create monkies. Nanotrasen provides only the finest technology!
      • +
      • You can order monkey crates from the cargo bay. They contain monkey boxes.
      • +
      • Changed the amount of labels labelers have to 30. 10 was too low and 30 should not be too griefy.
      • +
      • Maximum label text length increased from 10 to 64.
      • +
      • You can no longer label people because they can just peel the labels off. Sorry, clowns!
      • +
      • Jelly dooonnuuuutsss! Happy birthday, officers!
      • +
      • Made xenomeat not give any nutrition.
      • +
      • Added some new reagents.
      • +
      • Made it possible to feed monkies and xenos things, as well as making it possible for them to eat themselves (please don't read that too literally).
      • +
      • Added in synthiflesh.
      • +
      • Plasma is now not used in reactions, instead, is treated as a catalyst that is not used up. This only applies to certain reactions.
      • +
      • Made it possible to grind more things in the chemistry grinder.
      • +
      +
    • Errorage updated: +
        +
      • Increased environmental damage by a factor of 1.5.
      • +
      • Made firesuits a lot more resistant to heat. Previously, they stopped protecting at around 4,500 degrees. They now go up to around 10,000 (which is also the temperature which the floor starts melting)
      • +
      • Edited the quartermaster's office a bit.
      • +
      • Cargo technicians now have access to a cargo ordering console.
      • +
      • Added different-colored hardhats. The CE gets a white hardhat.
      • + +
      +
    • Rastaf.Zero updated: +
        +
      • Botanists get a new toy: Biogenerator. Insert biological items, recieve biological items.
      • +
      • Added roller beds, otherwise known as stretchers, to medbay. You can buckle people onto them and pull them.
      • +
      • Added egg-smashing and tomato-smashing decals.
      • +
      +
    • Muskets updated: +
        +
      • The prepackaged songs (Space Asshole, Cuban Pete, Darkest Honk, etc) have been removed. This doesn't mean admins can't play midis, this just gets rid of a lot of unnecessary download time.
      • +
      +
    • Firecage updated: +
        +
      • A whole bunch of new drinks and food. Seriously, there's alot!
      • +
      • New weapons such as the shock revolver and large energy crossbow.
      • +
      • Hydroponics can now grow a bunch more stuff. A lot of these new crops have some very interesting mutations.
      • +
      • Added a command for AIs to change their icon.
      • +
      • New costumes to the costume room.
      • +
      +
    • Urist McDorf updated: +
        +
      • Adding shading to pills.
      • +
      • Detective's office noir look has been removed. The icon operations required to render everything in monochrome was too heavy on the players.
      • +
      • Added in an uplink implant.
      • +
      +
    • Doohl updated: +
        +
      • A new alien race: Metroids! They are a mostly non-sentient race of jellyfish-like organisms that float in the air and feed on the life energy of other organisms. While most Metroids have never shown signs of self-awareness, they do exhibit signs of basic logic and reasoning skills as well as very sophisticated perception. Nanotrasen has shipped two baby Metroids for the xenobiology department. They should be handled with the utmost care - they are some of the deadliest beings in the known universe!
      • +
      • R&D gets a new toy: the freeze gun. Despite popular belief, this will not literally freeze things!
      • +
      • Every single chemical reagent has been assigned a color.
      • +
      • You can now see beakers fill up with chemicals. You can also observe how the colors mix inside the beakers. Spray bottles also will also show the color of whatever you're spraying.
      • +
      • Added a timestamp to combat logs.
      • +
      • Non-insulated gloves now need to be wrapped in wire in order to be electrified.
      • +
      • You can now shoot at people on the ground by simply clicking on the tile they're on.
      • +
      • Changeling husks are now uncloneable. To clarify: when a changeling sucks out a victim's DNA, the victim is said to become a "husk".
      • +
      +
    + +4 July 2011. +
      +
    • Agouri updated: +
        + Medical stuff overhaul in preparation of Erro's big Medic update: +
      • Sleepers are now able to heal every kind of damage. Drag your ass to medbay and ask a doctor to get you in one.
      • +
      • A lil' bit faster cloning (about 30% faster) due to popular demand.
      • +
      • Sleepers are now all located in the inner part of medbay, except for the examination room one.
      • +
      • Added Dermaline, burn-healing drug that outpowers kelotane (and kelotane is getting a major nerf, so be sure to know how to get this). Recipe is on the wiki if you need to make it.
      • +
      • Drugs no longer heal or metabolise when injected in dead bodies, fuck. Thank god you guys missed this major bug or we'd have cloning-by-injecting-healing-drugs.
      • +
      • Reminder to coders: Goddamn, update the changelog. +
      +
    • + +
    • Matty updated: +
        +
      • New engineering backpacks. Enjoy!
      • +
      +
    • +
    + +18 June 2011. +
      +
    • Agouri updated: +
        +
      • Bugfixes: The reagent grinding now works, allowing the miners to FINALLY bring plasma to the chemistry.
      • +
      • Bugfixes: Pill bottles and clipboards can now be removed from the pockets once placed there.
      • +
      +
    • +
    +
    +7 June 2011. +
      +
    • TLE updated: +
        +
      • Wiped/suicided pAIs should be eligible for being candidates again (5 minute cooldown between prompts.)
      • +
      • pAIs are now affected by EMP bursts. pAIs hit with a burst will be silenced (no speech or PDA messaging) for two minutes and may have their directives or master modified. A sufficiently powerful EMP burst will have a 20% chance of killing a pAI.
      • +
      +
    • +
    • Neo updated: +
        +
      • Nar-sie is now a more vengeful eldritch being. When summoned into our world, he first rewards his loyal cultists by chasing down and eating them first, then turns his attention to any remaining humans.
      • +
      +
    • +
    • Darem updated: +
        +
      • Gun Code Overhaul Phase 1.
      • +
      • Taser guns shoot ONE WHOLE SHOT more then they do now.
      • +
      • Energy Crossbow has a slightly higher shot capacity (still automatically recharges).
      • +
      • Revolvers can either be loaded one shell at a time or all at once with an ammo box.
      • +
      • Shotguns no longer need to be pumped before firing (will change back in phase 2).
      • +
      +
    • +
    • K0000 updated: +
        +
      • Arcane tome now has a "notes" option. Set English translations for runewords which come up when scribing runes. Attack an arcane tome with another arcane tome to copy your notes to the target tome.
      • +
      • Stun rune buffed considerably. Its a 1-use item so it deserved longer stun time.
      • +
      • Tome text: Added missing word description for stun rune.
      • +
      +
    • +
    +
    + +1 June 2011, Canadian Day Against Homophobia +
      +
    • Noise updated: +
        +
      • Changed holopad speaking to :h on request.
      • +
      • Ninja fixes, changes, etc. Refer to the code changelog for more info.
      • +
      +
    • +
    • Neo updated: +
        +
      • Department radio chat now shows with the department name instead of the frequency.
      • +
      +
    • +
    • Veyveyr updated: +
        +
      • Spent casing sprites + SMG sprite.
      • +
      • Sprites for 1x4 and 1x2 pod doors.
      • +
      +
    • +
    • Errorage updated: +
        +
      • Fixed twohanded weapon throwing, which left the 'off-hand' object in your other hand.
      • +
      • Doors now hide items under them when closed, mobs are still always above.
      • +
      • Singularity engine emitter is now much quieter.
      • +
      • Mining station redesigned.
      • +
      • Atmospherics' misc gasses tank now starts with N2O.
      • +
      • Hitting the resist button while handcuffed and buckled to something will make you attempt to free yourself. The process is the same as trying to remove handcuffs. When the 2 minutes pass you will be unbuckled but still handcuffed.
      • +
      +
    • +
    • ConstantA updated: +
        +
      • Added exosuit energy relay equipment. Uses area power (any power channel +available) instead of powercell for movement and actions, recharges powercell.
      • +
      • Exosuits can be renamed. Command is in Permissions & Logging menu.
      • +
      • Lowered construction time for Ripley parts.
      • +
      • Exosuit wreckage can be salvaged for exosuit parts (torso, limbs etc).
      • +
      • Speed-up for mecha.
      • +
      • New malf-AI sprite. (Sprite donated by the D2K5 server)
      • +
      +
    • +
    • Cheridan updated: +
        +
      • Updated mine floor and wall edge sprites.
      • +
      +
    • +
    • Urist McDorf updated: +
        +
      • AIs no longer bleed when they reach 0HP (Critical health).
      • +
      • Added 2 more security HUDs to security.
      • +
      • Security HUDs now show if a person has a tracking implant.
      • +
      +
    • +
    • Microwave updated: +
        +
      • Barman renamed to Bartender.
      • +
      • The amount of drink you get when mixing things in the bar has been rebalanced.
      • +
      • Fixed arrivals maintenance shaft not having air at round start.
      • +
      +
    • +
    • Deuryn updated: +
        +
      • Meteors now do a bit more damage and they're not stopped by grills.
      • +
      +
    • +
    • TLE updated: +
        +
      • Added personal AIs (pAI).
      • +
      +
    • +
    +
    + +19 May 2011 +
      +
    • Errorage updated: +
        +
      • Asteroid floors can be built on by adding tiles
      • +
      • Mining satchels now fit in rig suit storage, on belts and in pockets.
      • +
      • Cables now come in four colors: Red, yellow, green and blue.
      • +
      +
    • + +
    • NEO updated: +
        +
      • Armour overhaul, phase 3. See rev notes for details.
      • +
      • AI cores should now block movement.
      • +
      • MMIs are now properly buildable with the mecha fabricator.
      • +
      +
    • + +
    • Urist updated: +
        +
      • Added sandstone and mineral doors. Mineral boors cannot be opened by the AI or NPCs.
      • +
      • Removed Imperium robes from map.
      • +
      • Added the ability to draw letters and graffiti with crayons.
      • +
      • Removed fire axes except for bridge and atmospherics.
      • +
      +
    • + +
    • Veyveyr updated: +
        +
      • New serviceborg sprite option.
      • +
      • Map changes to robotics; removed borg fabricators and added second exosuit fabricator.
      • +
      • Cyborg parts are now built from exosuit fabricators and benefit from research.
      • +
      • New exosuit fabricator and borg frame sprites.
      • +
      +
    • +
    +
    +14 May 2011, late friday 13 update. +
      +
    • K0000 updated: +
        +
      • Cult updates:
      • +
      • New rune! Stun rune. When used as rune, briefly stuns everyone around (including cultists). When imbued into a talisman, hit someone to stun and briefly mute them. Spawnable with the starter talisman.
      • +
      • Imbue rune doesnt disappear after succesful invocation, only the source rune.
      • +
      • Chaplain's bible now has 20% chance to convert a cultist (was 10%), and gives a message on success.
      • +
      • Also, wrapping paper is back! Find it in the mailroom.
      • +
      +
    • + +
    • NEO updated: +
        +
      • Beginning of armor overhaul. Armor now has slightly better defence against melee, and weaker against shots. More coming soon...someday
      • +
      • Cyborgs finally drop their MMI when gibbed like they were supposed to back when I added MMIs. Round- start cyborgs use whatever name you have selected for your character for the brain that gets spawned for them.
      • +
      +
    • + +
    • Darem updated: +
        +
      • Chemistry update
      • +
      • In containers where there isn't a perfect ratio of reagents, reactions won't consume ALL of the related reagents (so if you mix 10 anti-toxin with 20 inaprovaline, you get 10 tricordrazine and 10 inaprovaline rather then just 10 tricodrazine)
      • +
      • Catalysts: some reactions might need presence of an element, while not directly consuming it.
      • +
      • Reactions changed to use catalysts: all recipes that require Universal Enzyme now require 5 units of the enzyme but the enzyme isn't consumed (So Tofu, Cheese, Moonshine, Wine, Vodka, and Kahlua recipes). +
      +
    • +
    • Errorage updated: +
        +
      • Smooth tables: Tables now automatically determine which direction and sprite they'll use. They will connect to any adjacent table unless there is a window between them (regular, reinforced, tinted, whichever)
      • +
      +
    • +
    +
    +7 May 2011, Mother's day? +
      +
    • Agouri updated: +
        +
      • Fireaxes now work. Derp.
      • +
      +
    • + +
    • Erro updated: +
        +
      • New sprites for thermited walls and girders. Rework of thermited walls. Thermited walls leave a remnant damaged wall, crowbar it to scrap it.
      • +
      • More colors for the lightfloors CANCELLED/POSTPONED
      • +
      +
    • + +
    • Noise updated: +
        +
      • Codephrases for traitors. More details here
      • +
      • New mech sprite
      • +
      +
    • +
    +
    +6 May 2011, AMURRICA FUCK YEAH day +
      +
    • DANGERCON UPDATE:Agouri and Erro updated(I'm in the DangerCon team now, nyoro~n :3): +
        +
      • Backpacks removed from all players. It was unrealistic. You can now had to the living quarters to get one from the personal closets there.
      • +
      • Any firearms now send you to critical in 1-2 shots. Doctors need to get the wounded man to surgery to provide good treatment. Guide for bullet removal is up on the wiki.
      • +
      • Brute packs and kelotane removed altogether to encourage use of surgery for heavy injury.
      • +
      • Just kidding
      • +
      • Fireaxe cabinets and Extinguisher wall-mounted closets now added around the station, thank Nanotransen for that.
      • +
      • Because of Nanotransen being Nanotransen, the fire cabinets are electrically operated. AIs can lock them and you can hack them if you want the precious axe inside and it's locked. The axe itself uses an experimental two-handed system, so while it's FUCKING ROBUST you need to wield it to fully unlock its capabilities. Pick up axe and click it in your hand to wield it, click it again or drop to unwield and carry it.You can also use it as a crowbar for cranking doors and firedoors open when wielded, utilising the lever on the back of the blade. And I didn't lie to you. It's fucking robust.
      • +
      • Fireaxe, when wielded, fully takes up your other hand as well. You can't switch hands and the fireaxe itself is unwieldy and won't fit anywhere. +
      • A fireaxe cabinet can also be smashed if you've got a strong enough object in your hand.
      • +
      • EXTINGUISHER CLOSETS, made by dear Erro, can be found in abundance around the station. Click once to open them, again to retrieve the extinguisher, attack with extinguisher to place it back. Limited uses, but we've got plans for our little friend. +
      • Sprite kudos go to: Cheridan for most of them, Khodoque for the fantastic fireaxe head. I merged those two. Also thanks to matty and Arcalane for giving it a shot.
      • +
      • Has the piano got TOO annoying? Try the fire axe...
      • +
      • Oh, and tou can now construct Light floors! To do it: Use wires on glass, then metal on the produced assembly, then place it on an uncovered floor like you would when replacing broken floor tiles. To deconstruct: Crowbar on light floor, use crowbar on produced assembly to remove metal, wirecutters to seperate the wires from the glass. Sprites by delicious Hempuli.
      • +
      • Got something to bitch about? Got a bug to report? Want to create drama? Did the clown destroy your piano while you were playing an amazing space remix of the moonlight sonata? Give it here + +
      +
    • + +
    • Rastaf.Zero updated: +
        +
      • New uniforms added for captain and chaplain, in their respective lockers. Credits to Farart.
      • +
      +
    • + +
    • Urist McDorf updated: +
        +
      • Mime and Clown now spawn with Crayons. You can eat those crayons. And use them for other nefarious purposes.
      • +
      • Health Scanners (A new type of Goggles) now spawn in medbay. Use them, doctors!
      • +
      • New Arcade toy.
      • +
      • Glowshrooms! What other lifeform will threaten the welfare of the station now?!
      • +
      • Bananas growable in hydroponics. Also soap is now on-board.
      • +
      • Added new "Lights out!" random event.
      • +
      +
    • +
    • ConstantA updated: +
        +
      • Mech pilots are now immune to zapping, thank you very much.
      • +
      +
    • +
    +
    + +17 April 2011, World Hemophilia Day +
      +
    • Microwave updated: +
        +
      • Rabbit ears have a small tail, night vision goggle sprites updated.
      • +
      • Space tea has a nice, calming effect.
      • +
      • Space drugs? Liberty cap... something like that. Microwave, make your changelog entries more understandable!
      • +
      • Brobot merged with Service Borg with a Rapid Service Fabricator.
      • +
      • Arcade machine prizes look and sound realistic once again.
      • +
      • New arcade toy: Syndicate space suit costume, can hold arcade toys in suit storage.
      • +
      • Empty cap gun loaders can be recycled in an autolathe.
      • +
      • Seizure man has laying down sprites now. Update to wizard den.
      • +
      • Mech bay has two more borg chargers.
      • +
      • Beepsky is back!
      • +
      • Detective's office grille has been electrified.
      • +
      • You can now see if someone is wearing an emergency oxygen tank on their belt on the mob itself.
      • +
      • Lexorin - Now deals 3 oxygen damage per tick. Countered with Dexalin or Dexalin Pkus, which remove 2 units of it from your body per tick.
      • +
      • Bilk - Shares the effects of beer and milk. Disgusting!
      • +
      • Sugar - Gives nutrition!
      • +
      • Arithrazine - Now extremely good against radiation damage.
      • +
      • Hyronalin - Stronger radiation removal
      • +
      • Space cleaner spray bottles now contain enough cleaner for 50 uses. Making space cleaner now yields more cleaner.
      • +
      +
    • +
    • Errorage updated: +
        +
      • Shuttle diagonal sprites now work for any kind of floor.
      • +
      • You can now make plaques from gold. Place them on a wall and engrave an epitaph.
      • +
      • Placed a single wall tile in the AI satellite so you don't have a clear LOS of the AI from the door.
      • +
      • Added arrivals lobby. (Map by Superxpdude, updated by Microwave)
      • +
      • Lattice now connects to the solar shields.
      • +
      • Law office maintenance is now connected with Tech storage maintenance. (Some rewiring dont in the area)
      • +
      • Xenobiology now has it's own access level. (Also fixed xeno pen access and blast doors)
      • +
      • You might soon start to see different airlocks and airlock assemblies around the station. (Sprites donated by Baystation 12)
      • +
      • Chemical storage added, discussion on which chemicals it should store is on the forums. You're welcome to contribute.
      • +
      • Hot fires will now melt floors.
      • +
      • Added a pair of market stalls south of the teleporter. LET THERE BE CLOWNMART!
      • +
      • Screwdrivers and wirecutters can now spawn in different colors.
      • +
      • Electrical toolboxes have a 5% chance of spawning a pair of insulated gloves. A set spawns in tech storage.
      • +
      • Oxygen canisters now spawn in emergency storage, near disposal, in the incinerator and the CE's office.
      • +
      • A plasma canister now spawns in toxins, near the maintenance door.
      • +
      • Wooden tables now look nicer.
      • +
      +
    • +
    • Agouri updated: +
        +
      • 2001 space suits added to AI Satellite!
      • +
      • New look for the 2001 space suit.
      • +
      • 2001 space suit jetpack added.
      • +
      • Improved TRAYS!
      • +
      +
    • +
    • Noise updated: +
        +
      • Thermals and mesons no longer give slightly better night vision.
      • +
      • NINJAS! (Too many things to list)
      • +
      • Wizards are no longer trackable by the AI when in their den.
      • +
      • Removed all old notes, except for the last one.
      • +
      • Nuke team now cannot return with their shuttle until the bomb is armed and counting down.
      • +
      • Energy blades can no longer cut through r-walls, walls take 7 seconds to cut through.
      • +
      • Turrets are now destructible. Bash them with stuff when they pop out or (more likely) die trying.
      • +
      • Updated Ripley Mech sprite.
      • +
      +
    • +
    • Neo updated: +
        +
      • You can now aim guns at body parts, armor and helmets properly protect you from projectiles.
      • +
      • Cat ears now match the hair color of the wearer.
      • +
      • Robots can no longer stick their items onto/into things.
      • +
      • Meson, thermal and x-ray vision are now modules for borgs.
      • +
      • Welding now uses less fuel when on and idle but more when welding.
      • +
      • Hopefully fixed the bug when running into airlocks didn't open them and running into objects didn't push them.
      • +
      +
    • +
    • HAL updated: +
        +
      • Added air alarm to security checkpoint, added cameras to aux. arrival docks so the AI can see everything.
      • +
      • Added fire alarm, fire locks and air alarm to delivery office.
      • +
      +
    • +
    • ConstantA updated: +
        +
      • Added mecha DNA-locking. Only the person with matching UE can operate such mechs.
      • +
      • Added two mecha armor booster modules and a repair droid module.
      • +
      • Mech fabricator is now buildable.
      • +
      • Gygax construction is now reversible.
      • +
      +
    • +
    • Rastaf0 and Farart updated: +
        +
      • Ghosts should now always properly hear people.
      • +
      • Monkeyized people (genetics or jungle fever disease) no longer lose their genetic mutations and diseases.
      • +
      • People who get bitten by monkeys get jungle fever.
      • +
      • Most chemicals should now heal and harm humans properly.
      • +
      • Many new (and updated) recipes for the microwave including Pizza, Meatball Soup, Hot Chili and many more.
      • +
      • Items should no longer spawn under vendomats and microwaves.
      • +
      • Runes are now drawn under doors and tables.
      • +
      • Penlights fit in medical belts.
      • +
      • People will scream if they get cremated while still alive.
      • +
      • Diseases should now properly make you loose health.
      • +
      • Monkeys wearing masks now get acid protection too.
      • +
      • You should probably turn off your stun baton before washing it.
      • +
      • latex loves + short piece of wire + some air from tank = balloon!
      • +
      • Kitchen was expanded, also a new look for the kitchen sink.
      • +
      • New dishware vending machine - dispenses knives, forks, trays and drinking glasses.
      • +
      • Water cooler was added to kitchen.
      • +
      • New uniform - Waiter Outfit. Chef can give it to his assistant.
      • +
      +
    • +
    • Deeaych updated: +
        +
      • Updated satchel, bananimum, shovel, jackhammer and pick-in-hand sprites.
      • +
      • Many unneeded r-walls removed, detective's office reinforced.
      • +
      • Captain armor now acts as a space suit, added a unique captain's space helmet to captain's quarters.
      • +
      • Golems cannot speak, but should be perfectly spawnable. Also added golem fat sprite.
      • +
      • Security borgs have side sprites.
      • +
      +
    • +
    • Matty406 updated: +
        +
      • AIs can now feel a little more dorfy.
      • +
      • Many ores, both raw and smelted, look much better.
      • +
      +
    • +
    • Urist_McDorf updated: +
        +
      • You can now light other people's cigarettes by targeting their mouth with a lighter.
      • +
      +
    • +
    • Veyveyr updated: +
        +
      • New tool sprites.
      • +
      • New sprites for smooth-lattice.
      • +
      +
    • +
    • Muskets updated: +
        +
      • Kabobs now return the bar used to make them.
      • +
      +
    • +
    +
    + +2 April 2011, International Children's Book Day +
      +
    • Microwave updated: +
        +
      • New look for the mining cyborg, jackhammer, kitchen sink.
      • +
      • Singularity is now enclosed again (still airless tho).
      • +
      • Wizard has a new starting area.
      • +
      • Chemists and CMOs now have their own jumpsuits.
      • +
      +
    • +
    • ConstantA updated: +
        +
      • You can now put Mind-machine-interface (MMI)'d brains into mecha.
      • +
      +
    • +
    • Errorage updated: +
        +
      • Added smooth lattice.
      • +
      +
    • +
    +
    + +26 March 2011 +
      +
    • Rastaf0 updated: +
        +
      • Food sprites from Farart
      • +
      • New food: popcorn (corn in microwave), tofuburger (tofu+flour in microwave), carpburger (carp meat+floor in microwave)
      • +
      • Medical belts are finally in medbay (credits belong to errorage, I only added it)
      • +
      • Pill bottles now can fit in containers (boxes, medbelts, etc) and in pockets.
      • +
      • Cutting camera now leaves fingerprints.
      • +
      +
    • +
    • Microwave updated: +
        +
      • Armor Can hold revolvers, and so can the detective's coat.
      • +
      • Chef's apron is going live, it can carry a knife, and has a slight heat +resistance (only slight don't run into a fire).
      • +
      • Kitty Ears!
      • +
      • Various food nutriment changes.
      • +
      • Added RIGs to the Mine EVA.
      • +
      • Night vision goggles. They have a range of five tiles.
      • +
      • Added Foods: Very Berry Pie, Tofu Pie, Tofu Kebab.
      • +
      • Modified foods: Custard Pie is now banana cream pie.
      • +
      +
    • +
    • ConstantA updated: +
        +
      • Removed redundand steps from Gygax and HONK construction.
      • +
      • Added some mecha equipment designs to R&D.
      • +
      +
    • +
    +
    + +23 March 2011, World Meteorological Day +
      +
    • Neo updated: +
        +
      • Fixed PacMan (and affiliates) generator construction.
      • +
      • It is now possible to actually eat omelettes with the fork now, instead of just stabbing yourself (or others) in the eye with it.
      • +
      • Welding masks can now be flipped up or down. Note that when they're up they don't hide your identity or protect you from welding.
      • +
      • Reagent based healing should now work properly.
      • +
      • Revolver has been balanced and made cheaper.
      • +
      • Tasers now effect borgs.
      • +
      • Plastic explosives are now bought in single bricks.
      • +
      • Nuke team slightly buffed and their uplink updated with recently added items.
      • +
      • Player verbs have been reorganized into tabs.
      • +
      • Energy swords now come in blue, green, purple and red.
      • +
      • Cameras are now constructable and dismantlable. (Code donated by Powerful Station 13)
      • +
      • Updated the change network verb for AIs. (Code donated by Powerful Station 13)
      • +
      • Added gold, silver and diamond pickaxes to R&D which mine faster.
      • +
      +
    • +
    • Agouri updated: +
        +
      • New look for the Request consoles.
      • +
      +
    • +
    • Rastaf0 updated: +
        +
      • Brig cell timers should now tick closer-to-real seconds.
      • +
      • New look for food, including meat pie, carrot cake, loaded baked potato, omelette, pie, xenopie and others. (some sprites by Farart)
      • +
      • Hearing in lockers now works as intended.
      • +
      • Fixed electronic blink sprite.
      • +
      • Added the 'ghost ears' verb, which allows ghosts to not hear anything but deadcast.
      • +
      +
    • +
    • XSI updated: +
        +
      • New AI core design.
      • +
      • HoP now has a coffee machine!
      • +
      +
    • +
    • Veyveyr updated: +
        +
      • Replaced nuke storage with a vault.
      • +
      • Redesigned the mint, moved the public autolathe and n2o storage.
      • +
      • New look for the coin press. (Sprite by Cheridan)
      • +
      +
    • +
    • Errorage updated: +
        +
      • You can now manually add coins into money bags, also fixed money bag interaction window formatting.
      • +
      • QM no longer has access to the entire mining station to stop him from stealing supplies.
      • +
      • New machine loading sprite for mining machinery. (sprites by Cheridan)
      • +
      • Added a messanging server to the server room. It'll be used for messanging, but ignore it for now.
      • +
      • The delivery office now requires delivery office access. It's also no longer called "Construction Zone"
      • +
      • Almost all the mecha parts now have sprites. (Sprites by Cheridan)
      • +
      • Tinted and frosted glass now look darker.
      • +
      • There are now more money sprites.
      • +
      • Department closets now contain the correct headsets.
      • +
      +
    • +
    • Microwave updated: +
        +
      • Bicaridine now heals a lot better than before.
      • +
      • Added Diethylamine, Dry Ramen, Hot Ramen, Hell Ramen, Ice, Iced Coffee, Iced Tea, Hot Chocolate. Each with it's own effects.
      • +
      • Re-added pest spray to hydroponics.
      • +
      • Carrots now contain a little imidazoline.
      • +
      • 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 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.
      • +
      • Mime's mask can now be used as a gas mask.
      • +
      • Added welding helmet 'off' sprites.
      • +
      +
    • +
    + +
    + +18 March 2011 +
      +
    • Errorage updated: +
        +
      • You can now use the me command for emotes! It works the same as say "*custom" set to visible.
      • +
      • There is now a wave emote.
      • +
      • Enjoy your tea!
      • +
      +
    • +
    • Deeaych updated: +
        +
      • The exam room has some extra prominence and features.
      • +
      • A new costume for the clown or mime to enjoy.
      • +
      • Service Cyborgs can be picked! Shaker, dropper, tray, pen, paper, and DOSH to show their class off. When emagged, the friendly butler-borg is able to serve up a deadly last meal.
      • +
      • It should now be possible to spawn as a cyborg at round start. Spawned cyborgs have a lower battery life than created cyborgs and begin the round in the AI Foyer.
      • +
      +
    • +
    • Rastaf0 updated: +
        +
      • Fixed an issue with examining several objects in your hands (such as beakers).
      • +
      • Fixed bug with random last name being empty in rare cases.
      • +
      +
    • +
    • hunterluthi updated: +
        +
      • It is now possible to make 3x3 sets of tables.
      • +
      • Fixed some missplaced grilles/lattices on the port solar.
      • +
      • There is now a breakroom for the station and atmos engineers. It has everything an intelligent young engineer needs. Namely, Cheesy Honkers and arcade games.
      • +
      +
    • +
    +
    +15 March 2011, International Day Against Police Brutality +
      +
    • Errorage updated: +
        +
      • Autolathe deconstruction fixed.
      • +
      • Atmos Entrance fixed.
      • +
      • AI no longer gibs themselves if they click on the singularity.
      • +
      • Fixed all the issues I knew of about storage items.
      • +
      • Redesigned Assembly line and surrounding maintenance shafts.
      • +
      • Redesigned Tech storage. (Map by Veyveyr)
      • +
      +
    • +
    • TLE updated: +
        +
      • Forum account activation added. Use the 'Activate Forum Account' verb.
      • +
      +
    • +
    • Neo updated: +
        +
      • New R&D Item: The 'Bag of holding'. (Sprite by Cheridan)
      • +
      • Getting someone out of the cloner now leaves damage, which can only be fixed in the cryo tube.
      • +
      • New reagent: Clonexadone, for use with the cryo tube.
      • +
      • Fixed using syringes on plants.
      • +
      +
    • +
    • Constanta updated: +
        +
      • Added queueing to fabricator.
      • +
      +
    • +
    • Rastaf0 updated: +
        +
      • Air alarms upgraded.
      • +
      • Fixed problem with AI clicking on mulebot.
      • +
      • Airlock controller (as in EVA) now react to commands faster.
      • +
      • Fixed toxins mixing airlocks.
      • +
      +
    • +
    + +6 March 2011 +
      +
    • Neo updated: +
        +
      • Neo deserves a medal for all the bugfixing he's done! --errorage
      • +
      +
    • +
    • Errorage updated: +
        +
      • No. I did not code on my birthday!
      • +
      • Windows can now be rotated clockwise and counter clockwise.
      • +
      • Window creating process slightly changed to make it easier.
      • +
      • Fixed the newly made reinforced windows bug where they weren't properly unfastened and unscrewed.
      • +
      • Examination room has a few windows now.
      • +
      • Can you tell I reinstalled Windows?
      • +
      • Robotics has health analyzers.
      • +
      • Bugfixing.
      • +
      +
    • +
    • Deeyach updated: +
        +
      • Roboticists now spawn with a lab coat and an engineering pda
      • +
      +
    • +
    + +2 March 2011, Wednesday +
      +
    • Errorage updated: +
        +
      • Mapping updates including Atmospherics department map fixes, CE's office and some lights being added here and there.
      • +
      • Mining once again given to the quartermaster and HoP. The CE has no business with mining.
      • +
      • Removed the overstuffed Atmos/Engineering supply room.
      • +
      • Replaced all 'engineering' doors in mining with maintenance doors as they were causing confusion as to which department mining belongs to.
      • +
      • The incinerator is now maintenance access only.
      • +
      +
    • +
    • Neo updated: +
        +
      • New look for the advanced energy gun. (Sprite by Cheridan)
      • +
      • Mech fabricator accepts non-standard materials.
      • +
      • Mules accesses fixed, so they can be unlocked once again.
      • +
      • Atmospherics department mapping overhaul. (Map by Hawk_v3)
      • +
      • Added more name options to arcade machines.
      • +
      +
    • +
    • ConstantA updated: +
        +
      • Added mecha control console and mecha tracking beacons.
      • +
      • Some changes to gygax construction.
      • +
      +
    • +
    • Darem updated: +
        +
      • R&D minor bugfixes.
      • +
      • AI computer can now be deconstructed (right click and select 'accessinternals').
      • +
      • Server room updated, added server equipment to use with R&D.
      • +
      • Wizard and ghost teleport lists are now in alphabetical order, ghosts can now teleport to the mining station.
      • +
      • Rightclicking and examining a constructable frame now tells you what parts still need to be finished.
      • +
      • Large grenades added to R&D.
      • +
      +
    • +
    • Deeyach updated: +
        +
      • Mining given to the CE. (Reverted by Errorage)
      • +
      • Clowns can now pick a new name upon entering the game (like wizards previously).
      • +
      +
    • +
    + +24 February 2011, Thursday +
      +
    • Darem updated: +
        +
      • Lighting code fixed for mining and thermite.
      • +
      • R&D instruction manual added to the R&D lab.
      • +
      • Fixed R&D disk commands not working.
      • +
      • Added portable power generators which run on solid plasma.
      • +
      • You can now set the numer of coins to produce in the mint.
      • +
      • Added two more portable power generators to R&D.
      • +
      +
    • +
    • Deeyach updated: +
        +
      • New uniform for roboticists
      • +
      +
    • +
    • Neo updated: +
        +
      • Game speed increased
      • +
      • Mining stacking machine no longer devours stacks larger than 1 sheet (it was only increasing its stock by 1 when given a stacked stack)
      • +
      • Stackable uranium ore added (a better sprite is needed, contributions are welcome)
      • +
      • Made Meteor gamemode actually do stuff
      • +
      • Made a bigger class of meteor
      • +
      • New R&D item: Advanced Energy Gun
      • +
      • Law priority clarified with regards to ion laws and law 0.
      • +
      +
    • + +
    • Veyveyr updated: +
        +
      • Minor mapping fixes
      • +
      +
    • +
    • Uhangi updated: +
        +
      • New red bomb suit for security.
      • +
      +
    • + +
    • Errorage updated: +
        +
      • Slight mapping change to arrival hallway.
      • +
      +
    • +
    + +23 February 2011, Red Army Day +
      +
    • Uhangi updated: +
        +
      • Antitox and Inaprovaline now mixable via chemistry.
      • +
      • Explosive Ordinance Disosal (EOD) suits added to armory and security.
      • +
      • Large beaker now holds 100 units of chemicals. (code by Slith)
      • +
      +
    • +
    • Rastaf0 updated: +
        +
      • Secbot interface updated.
      • +
      • Syringe auto-toggels mode when full.
      • +
      • Captain's flask volume increased.
      • +
      +
    • +
    • Neo updated: +
        +
      • Fixed the 'be syndicate' choice to actually work on nuke rounds.
      • +
      • Syndicates no longer win if they detonate the nuke on their ship.
      • +
      +
    • + +
    • Errorage updated: +
        +
      • Added cloning manual. (Written by Perapsam)
      • +
      +
    • +
    • K0000 updated: +
        +
      • Cult mode updates.
      • +
      • You can now read the arcane tome. It contains a simple guide for making runes.
      • +
      • Converting people doesnt give them word knowledge.
      • +
      • Sacrifice monkeys or humans to gain new words.
      • +
      • Total number of rune words set to 10
      • +
      • Some minor bugfixes.
      • +
      +
    • +
    + +20 February 2011, Sunday +
      +
    • Errorage updated: +
        +
      • Slight updates to processing unit and stacking machine at the mining outpost.
      • +
      • Digging now yields sand, which can be smelted into glass.
      • +
      • Stacking machine can now stack reinforced metal, regular and reinforced glass too.
      • +
      • Engineers now have two copies of the singularity safety manual.
      • +
      +
    • +
    • Neo updated: +
        +
      • Magboots now have a verb toggle like jumpsuit sensors.
      • +
      • Jumpsuit sensors are now in all jumpsuits, except tactical turtlenecks.
      • +
      • Tweaks to the AI report at round start.
      • +
      • Syndi-cakes now heal traitors/rev heads/etc much more than anyone else.
      • +
      • Containment fields zap once again.
      • +
      • Fire damage meter no longer lies about fire damage.
      • +
      +
    • +
    • Darem updated: +
        +
      • Mass Spectrometer added to R&D. Load it with a syringe of blood and it will tell you the chemicals in it. Low reliability devices may yield false information.
      • +
      • Not all devices have a 100% reliability now.
      • +
      • Miners now have access to mint foyer and loading area. Only captain has access to the vault.
      • +
      • More stuff can be analyzed in the destructive analyzer, protolathe can produce intelicards.
      • +
      +
    • +
    • Rastaf0 updated: +
        +
      • Added blast door button to atmospherics.
      • +
      • Toxins timer-igniter assemblies fixed.
      • +
      • Engineering secure storage expanded.
      • +
      • Added singularity telescreen.
      • +
      +
    • +
    + +18 February 2011, Friday +
      +
    • Errorage updated: +
        +
      • New look for the bio suits. (Biosuit and hood sprites by Cheridan)
      • +
      • New radiation suits added along with radiation hoods and masks. Must wear complete set to get full protection.
      • +
      +
    • +
    • Rastaf0 updated: +
        +
      • Binary translator cost reduced to 1 telecrystal.
      +
    • +
    • AtomicTroop updated: +
        +
      • Mail Sorter job added.
      • +
      • Disposal system redone to allow for package transfers. Packages are routed to mail sorter room and then routed to the rest of the station
      • +
      • Disposal area moved. Old disposal area now just an incinerator and a small disposal into space.
      • +
      • New wrapping paper for sending packages.
      • +
      +
    • +
    • Veyveyr updates: +
        +
      • New machine frame sprite.
      • +
      • Braincase sprites for mechs added. Not actually used, yet.
      • +
      +
    • +
    • Darem updates: +
        +
      • Research and Development system is LIVE. Scientists can now research new advancements in technology. Not much can be made, right now, but the system is there. Technologies are researched by shoving items into the destructive analyzer. Circuit Imprinter, Destructive Analyzer, and Protolathe are controlled from the R&D console.
      • +
      • Autolathe, Protolathe, Destructive Analyzer, and Circuit Imprinter can now be built, taken apart, and upgraded. The basic frame for all of the above requires 5 metal.
      • +
      +
    • +
    + +15 February 2011, Tuesday +
      +
    • Rastaf0 updated: +
        +
      • Added radio channels and headsets for miners (:h or :d ("diggers" lol)) and for cargo techs (:h or :q )
      • +
      • Added a personal headsets to HoP and QM.
      • +
      • Aliens now attack bots instead of opening control window.
      • +
      • All bots can be damaged and repaired.
      • +
      • All bots are effected to EMP now.
      • +
      • Atmos now starts with nitrous oxide in storage tank.
      • +
      +
    • +
    • Veyveyr updated: +
        +
      • New look for the pipe dispenser.
      • +
      +
    • Errorage updated: +
        +
      • Mining station will now charge properly.
      • +
      • Duffle bags (Money bags) can now be emptied.
      • +
      +
    • +
    + +14 February 2011, Valentine's day +
      +
    • Errorage updated: +
        +
      • New Job! - Shaft Miners have finally been added and are available to play.
      • +
      • Mining outpost - A new mining outpost has been built, the mining dock on SS13 has been updated.
      • +
      +
    • +
    • ConstantA updated: +
        +
      • Slight speed up for combat mechs..
      • +
      • Added H.O.N.K construction
      • +
      • Fixed bug with switching intent while in mecha.
      • +
      +
    • +
    + +
    12.02.2011, 01.00 GMT, r1021
    +
      +
    • Added Durand combat exosuit.
    • +
    • Players can modify operation permissions of newly constructed civilian mechs. Click on mech with ID card or PDA with ID inside.
    • +
    • Added robotics access to default mecha maintenance permissions (all mechs) and operation permissions (civilian models only).
    • +
    • Fixed double adminlog message of explosion proc.
    • +
    • Fixed accidental mecha wreckage deletion.
    • +
    • Tweaked mecha internal fire processing.
    • +
    • Added some mecha-related sounds.
    • +
    • Moved GaussRand to helpers.dm and added GaussRandRound helper proc.
    • +
    • Other small changes.
    • +
    + +
    11.02.2011, r1001-1020
    +
      +
    • Headsets upgraded. Shortcuts for channels are: :command :security scie:nce :engineering :medical. Also there is :binary :whisper :traitor and old good :h for your department. +
    • "One Click Queue" added: When you quickly click on two things in a row, it will automatically queue the second click and execute it after the default 'action delay' of 1 second after the first click. Previously you had to spam-click until 1 second had passed. THIS AFFECTS EVERYTHING. NEEDS TESTING. - Skie +
    • EMP effects added for further revisions. - Darem +
    • Goon stuff removed, AI/Bots leave behind hidden fingerprints, firedoors fixed, powersinks eat more, small map changes. - Mport +
    • Big map changes in engineering/robotics/science wing. - errorage +
    • Welder Fixed. Now burns your eyes again. - errorage +
    • 9x9 singularity sprite added. - Skie/Mport +
    • Ghetto surgery added. - Neophyte +
    • Nasty vent pump lag fixed. - Neophyte +
    • Mech gameplay and building updates. - ConstantA +
    + +
    08.02.2011, r999-1000
    +
      +
    • The amount of power the station uses should be lower. +
    • The singularity now changes size based upon how much energy it has +
    • New Machine: Particle Accelerator. +
    • It might need a better name/sprite but when put together properly and turned on it will shoot Accelerated Particles. +
    • The particles irradiate mobs who get in the way and move through solid objects for a short time. +
    • The Particle Accelerator parts are set up by using a Wrench followed by a Cable Coil, then finished with a screwdriver. +
    • When you shoot the Singularity Generator with Accelerated Particles it will spawn a Singularity. +
    • New layout for Engineering, might be changed up slightly in the next few days. +
    + +
    06.02.2011, r979
    +
      +
    • Jesus christ it's a new map what the fuck +
    • Just kidding, it's only minor changes to medbay/mechbay/cybernetics/R&D/toxins/robotics/chapel/theatre +
    • Okay so there's too many changes to list completely, but basically: toxins/R&D/virology/xenobiology are south through medbay; robotics/cybernetics/mechbay are where toxins used to be, the theatre and chapel are above medbay. +
    • Theatre is a new place for the Clown and Mime to play, there are some costumes available, a stage and backstage, and seating for the audience. +
    • R&D and Toxins have been combined together. R&D is still work in progress. You need to head south through medbay to get there. +
    • Medbay has been re-arranged slightly. Honestly, it's nothing, I bet you won't even notice anything different. There's also a new surgery suite, complete with pre-op and post-op rooms. +
    • Virology's been rearranged, but it is mostly in the same place still. +
    • Xenobiology is work in progress. [There's some fun stuff still being coded] +
    • The Chapel is now to the north. You'll probably be thinking something like "Goddamn, this place is fucking huge", but it's actually smaller than the previous chapel. +
    • Robotics and related stuff is also work in progress - however, everything needed for making borgs is there. Note: de-braining will now be done by surgeons in medbay, rather than roboticists in robotics, in case you're wondering where your optable went. +
    • I added color-coded pipes in the areas I was working on. Red pipes run from air siphons and feed into the waste loop; blue pipes run from air vents and pump whatever atmos is set to pump. Yeah, there's TWO pipe networks on the station, who knew? Well, some of you probably did, but I didn't! +
    • Please bring all complaints/ideas/suggestions/bugfixes to: This awesome thread on our forums +
    • This update brought to you by: veyveyr and Rookie, with help from friends! [Now you know who to strangle, please be gentle q_q] +
    + +
    05.02.2011, r968
    +
      +
    • This really needs to be updated more often. +
    • Various map updates have been applied with many more to come. Expect overhauls! +
    • Mining system nearing completion. +
    • Massive overhaul to the electricity systems, the way singularity makes power, and various related functions. +
    • Mime spawns with White Gloves instead of Latex Gloves (apparently there's a difference!) +
    • A new event has been- CLANG! What the fuck was that? +
    • Ion storm laws should be much more interesting. +
    • Security reports should no longer list traitor heads/AIs as possible revs/cultists, nor should nuke operatives ever get named for anything. +
    • Pens are much more versatile and user friendly. +
    • Mech building is rapidly on its way! Ripleys can be built, consult your quartermasters. +
    • Traitors now have several new things they can steal. +
    • Some surgeries coded to accompany the new operating room and surgery tools. +
    • Research and Design is continuing development and should be rolled out shortly. +
    • Various sprites added, tweaked, scrapped and fixed. +
    + +

    Changelog

    +
    05.02.2011, r968
    +
      +
    • This really needs to be updated more often. +
    • Various map updates have been applied with many more to come. Expect overhauls! +
    • Mining system nearing completion. +
    • Massive overhaul to the electricity systems, the way singularity makes power, and various related functions. +
    • Mime spawns with White Gloves instead of Latex Gloves (apparently there's a difference!) +
    • A new event has been- CLANG! What the fuck was that? +
    • Ion storm laws should be much more interesting. +
    • Security reports should no longer list traitor heads/AIs as possible revs/cultists, nor should nuke operatives ever get named for anything. +
    • Pens are much more versatile and user friendly. +
    • Mech building is rapidly on its way! Ripleys can be built, consult your quartermasters. +
    • Traitors now have several new things they can steal. +
    • Some surgeries coded to accompany the new operating room and surgery tools. +
    • Research and Design is continuing development and should be rolled out shortly. +
    • Various sprites added, tweaked, scrapped and fixed. +
    + +
    20.01.2011, r894
    +
      +
    • Pipes can now be removed and re-attached by wrenching them. +
    • Mining system continues to develop. Still unaccessible to players. +
    • Various map changes. Some minor lag causing things were fixed. +
    • Admins have a new tool: They can now give any spell to anyone. Hurray! +
    • Imadolazine now works. Maybe? +
    • Singularity now releases itself if fed too much and will potentially explode. +
    • Magboots now successfully prevent you from getting pulled into the singularity. +
    • Strike teams immune to facehuggers. Why? I dunno. +
    • Many reagent containers are adjustable so you can pour the exact amount you need. +
    • No more emitters working in space, Collectors and collector controllers now ID lockable. +
    • Christmas Contest plaque finally added. It's near the armor/warden's office. +
    • Rocks fall, everyone dies. +
    • All cyborgs and robots can now be named. Just use a pen on the cyborg's frame before the brain is inserted. +
    • Knock spell now unbolts doors as well as opens them. +
    • New cultist runs and other changes. +
    • Added surgery tools for eventual surgery system. +
    • Autolathe and Circuit Printer animations redone. Yay pretty icons. +
    • AI law changes/uploads are now tracked (admin viewable). +
    • Revheads now get a PDA uplink instead of a headset one. +
    • Added a penlight. +
    • Science Research and Development tech tree uploaded. Not really accessible by anyone yet, though. +
    + +
    14.01.2011, r853
    +
      +
    • Changlings Overhauled. Now function kinda like alium (using an internal chemical reserve instead of plasma) with each ability requiring a certain amount of chemicals to activate. Both venoms removed. Several "Dart" abiliites added. They allow the changling to deafen, blind, mute, paralyze, or even transform (dead) targets. +
    • Carp meat now contaminated with Carpotoxin. Anti-toxin negates the poison, however. +
    • New Reagent: Zombie Powder: Puts subjects into a deathlike state (they remain aware, though). Each unit of Zombie Powder requires 5 units of Carpotoxin, Sleeping Toxin, and Copper. +
    • Various alium fixes. +
    • Matches now available from smokes machine. +
    • Megabomb bug fixed. Bombs with timers/signalers won't detonate after the timer/ signaler is removed. +
    • New Disease: Rhumba Beat. Functions like GBS with a few exceptions. Not only available by admindickery. +
    • More mining fixes/changes. +
    • Ghost can now teleport to AI sat, Thunderdome, and Derelict. +
    • New gimmick clothes +
    • Constructing Glass Airlocks now use one sheet of R.Glass. +
    • Windows mow always appear above grills and pipes always above lattices. +
    • Added FireFighter mecha and various mecha fixes. +
    • Deconstructed walls now leave proper floor tiles (that can be pried up like normal) and remember what kind of floor they were before the wall was made. +
    • Carded AIs no longer take damage while in unpowered areas. +
    • Chaplains can now name their religion at round start. +
    • New Recipies: Clown Burger (1 Clown wig, 5 flour), Mime Burger (1 beret, 5 flour), Cuban Carp (1 carp fillet, 1 chili, 5 flour). +
    • Napalm nerfed a bit. Produces ~25% less plasma but it's all concentrated in a single tile (will still spread, though). +
    • Reagent bottles can, once again, be put into grenades. +
    • Various minor map changes. +
    + +
    08.01.2011,8:00PST, r820
    +
      +
    • Holograms (AI controled psudo-mobs) added. Currently only admin spawn. +
    • Pre-spawned pills no longer have randomized image. +
    • Bridge reorganized. +
    • Automated turrets now less dumb. Additionally, turrets won't target people laying down. +
    • Cultists now automatically start known words for add cultist ritual. Also, converted cultists start knowning a word. +
    • Supply ship no longer can transport monkeys. Also, monkeys are no longer orderable from QM. +
    • Meat Crate added to QM. +
    • Corn can now be blended in a blender to produce corn oil which is used to create glycern. +
    • Request Consoles added across the station. Can be used to request things from departments (and slightly easier to notice then the radio). +
    • Centcom reoragnized a fair bit. Not that players care but admins might enjoy it. +
    • There is now a toggable verb that changes whether you'll turn into an alium or not. +
    • Hair sprited modified. +
    • Napalm and Incendiary Grenades both work now. Have fun setting things on fire. +
    • Binary Translater traitor item added. It allows traitors to hear the AI (it functions like a headset). +
    • New Disease: Pierrot's Throat. Enjoy, HONK! +
    • Robotic Transformation (from Robrugers) and Xenomorph Transformation (from xenoburgers) now curable. +
    • Mining added. Only accessible by admins (and those sent by admins). Very much WIP. +
    • Alium Overhaul. Divided into multiple castes with distinct abilities. +
    • New AI Modules: The goody two-shoes P.A.L.A.D.I.N. module and it's evil twin T.Y.R.A.N.T. Only the former actually spawns on the station. +
    • Lizards added. They run away and shit. +
    • PDA overhaul. Doesn't change anything for humans, just makes coders happy. +
    • Firesuits redone to look less like pajamas and instead like firesuits. Fire lockers also added. +
    • New Mecha: H.O.N.K. +
    • Deployable barriers added. Can be locked and unlocked. +
    • Mecha bay (with recharging stations) added. +
    • Bunny Ears, Security Backpacks, Medical Backpacks, Clown Backpacks, and skirt added. +
    • Various wizard changes. New Wizard Spell: Mind Swap. Swap your mind with the targets. Be careful, however: You may lose one of your spells. Wizards are no longer part of the crew and get a random name like the AI does. Wizards can change their known spells with their spellbook but only while on the wizard shuttle. +
    • Circuit Imprinter: Using disks from the various deparments, new circuit boards and AI modules can be produced. +
    • Heat Exchanging pipes added and various pipe/atmos changes. +
    • Ghost/Observer teleport now works 100% of the time. +
    + +
    17.12.2010,11:00GMT
    +
      +
    • You need an agressive grip to table now, as well as being within one tile of the table (to nerf teletabling).
    • +
    • Teleport only runs once at the beginning of the round, hopefully reducing the lag in wizard rounds.
    • +
    • Wizards can't telepot back to their shuttle to afk now.
    • +
    • Someone added it a while ago and forgot to update the changelog - syndies in nuke need to move their shuttle to the station's zlevel first.
    • +
    • Bunch of other stuff.
    • +
    + +
    Sunday, November 21, 3:34 PST
    +
      +
    • Bug fixes, not going into detail. Lots and lots of bug fixes, mostly regarding the new map
    • +
    • CMO has a more obvious lab coat, that looks nicer than the original
    • +
    • CMO also has a stamp now
    • +
    • QM has a denied stamp
    • +
    • Cyborgs got tweaked. Laws only update when checked. Also have wires that can be toyed
    • + with for various effects, including AI sync, and law control +
    • Second construction site similar to the original
    • +
    • Prison station has been tweaked, now includes a lounge, and toilets
    • +
    • Detective's revolver starts with a reasonable number of bullets
    • +
    • Prison teleporter to the courtroom now exists
    • +
    • AI related stuff: More cameras, oh, and bug fixes!
    • +
    • Emergency storage moved
    • +
    • Random AI law changes. New law templates, and variables. Old variables were tweaked and some of the crappy templates were removed
    • +
    • Ghosts can teleport to the derelict now
    • +
    • Respriting of a bunch of stuff as well as graphical fixes
    • +
    • Kitchen is attached to the bar again
    • +
    • General map tweaks and fixes
    • +
    • Wardens fixed for rev rounds
    • +
    • 5-unit pills now work
    • +
    • APCs added and moved
    • +
    • Cola machine added. Contains various flavours of soda. Also added new snacks to the now named snack machine. Water cooler added, just apply an empty glass to it
    • +
    • Salt & Pepper have been added, as part of the food overhaul
    • +
    • More bug fixes. There was a lot
    • +
    + +
    Tuesday, November 16, 00:20 GMT
    +
      +
    • Cruazy Guest's map is now live.
    • +
    • Entire station has been rearranged.
    • +
    • Prison Station added, with Prison Shuttle to transport to and from.
    • +
    • New Job: Warden. Distributes security items.
    • +
    • The new map is still in testing, so please report any bugs or suggestions you have to the forums.
    • +
    • AI Liquid Dispensers, Codename SLIPPER, have been added to the AI core. They dispense cleaning foam twenty times each with a cooldown of ten seconds between uses. Mounted flashes have also been included.
    • +
    • Clown stamp added to clown's backpack.
    • +
    + +
    Sunday, November 14, 18:05
    +
      +
    • Major food/drink code overhaul. Food items heal for more but not instantly. Poison, Drug, and "Heat" effects from food items are also non-instant.
    • +
    • Preperation for one-way containers and condiments.
    • +
    • New Reagents: Nutriment, Ketchup, Soysauce, Salt, Pepper, Capsaicin Oil, Frost Oil, Amatoxin, Psilocybin, Sprinkles
    • +
    • New Food Item: Chaos Donut: 1 Hot Sauce + 1 Cold Sauce + 1 Flour + 1 Egg. Has a variable effect. NOT DEADLY (usually).
    • +
    • New Drug: Ethylredoxrazine: Carbon + Oxygen + Anti-Toxin. Binds strongly with Ethanol.
    • +
    • Tape Recorders added! Now you can actually PROVE someone said something!
    • +
    • Amospherics Overhaul Started: It actually works now. You can also build pipes and create function air and disposal systems!
    • +
    • Walls are now smooth.
    • +
    • Alcohol no longer gets you as wasted or for as long.
    • +
    • QM job split into QM and Cargo Technicians. QM has his own office.
    • +
    • Doors can no longer be disassembled unless powered down and unbolted.
    • +
    • New Job: Chief Medical Officer. Counts as a head of staff and is in charge of medbay. Has his/her own office and coat.
    • +
    • Wizarditis Bottle no longer in virus crate.
    • +
    + +
    Friday, November 5, 19:29
    +
      +
    • The ban appeals URL can now be set in config.txt
    • +
    • Secret mode default probabilities in config.txt made sane
    • +
    • Admin send-to-thunderdome command fixed to no longer send people to the other team's spawn.
    • +
    • Having another disease no longer makes you immune to facehuggers.
    • +
    • Magboots are now available from EVA.
    • +
    • Changeling death timer shortened. Destroying the changeling's body no longer stops the death timer.
    • +
    • Cult mode fixes.
    • +
    • Fixed cyborgs pressing Cancel when choosing AIs.
    • +
    • The play MIDIs setting now carries over when ghosting.
    • +
    • Admins can now see if a cyborg is emagged via the player panel.
    • +
    • PAPERWORK UPDATE v1: Supply crates contain manifest slips, in a later update these will be returnable for supply points. +
    • The Supply Ordering Console (Request computer in the QM lobby) can now print requisition forms for ordering crates. In conjunction with the rubber stamps, these can be used to demonstrate proper authorisation for supply orders.
    • +
    • Rubber stamps now spawn for each head of staff.
    • +
    • The use of DNA Injectors and fueltank detonations are now admin-logged.
    • +
    • Removed old debug code from gib()
    • +
    + +
    Tuesday, November 2, 19:11(GMT)
    +
      +
    • Finished work on the "cult" gamemode. I'll still add features to it later, but it is safe to be put on secret rotation now.
    • +
    • Added an energy cutlass and made a pirate version of the space suit in preparation for a later nuke update.
    • +
    • Changeling now ends 15 minutes after changeling death, unless he's ressurected.
    • +
    • Further fixing of wizarditis teleporting into space.
    • +
    • Fixed the wise beard sprite.
    • +
    • Fixed missing sprite for monkeyburgers.
    • +
    • Fixed Beepsky automatically adding 2 treason points to EVERYONE.
    • + +
    + +
    Thursday, October 28, 19:30(GMT)
    +
      +
    • Sleepers and disposals now require two seconds to climb inside
    • + +
    • Hydroponics crate ordered in QMs doesnt spawn too many items
    • +
    • Replacement lights crate can be ordered in QM.
    • +
    • Added space cleaner and hand labeler to Virology.
    • +
    • Welder fuel tanks now explode when you try to refuel a lit welder.
    • +
    • Made clown's mask work as a gas mask.
    • +
    • 9 new cocktails: Irish Coffee, B-52, Margarita, Long Island Iced Tea, Whiskey Soda, Black Russian, Manhattan, Vodka and Tonic, Gin Fizz. Refer to the wiki for the recipes.
    • +
    • Kitchen update: +
        +
      • -New Microwave Recipies: Carrot Cake (3 Flour, 3 egg, 1 milk, 1 Carrot), Soylen Viridians (3 flour, 1 soybeans), Eggplant Parmigania (2 cheese, 1 eggplant), and Jelly Donuts (1 flour, 1 egg, 1 Berry Jam), Regular Cake (3 flour, 3 egg, 1 milk), Cheese Cake (3 flour, 3 egg, 1 milk), Meat Pies (1 meat of any kind, 2 flour), Wing Fang Chu (1 soysauce, 1 xeno meat), and Human and Monkey Kabob (2 human or monkey meat, metal rods).
      • +
      • - Ingredients from Processor: Soysauce, Coldsauce, Soylent Green, Berry Jam.
      • +
      • - Sink added to kitchen to clean all the inevitable blood stains and as preperation for future cooking changes.
      • +
      • - The food processor can't be abused to make tons of food now.
      • + +
      +
    • Multiple tweaks to virology and diseases: +
        +
      • - Added wizarditis disease.
      • +
      • - Spaceacillin no longer heals all viruses.
      • +
      • - Some diseases must be cured with two or more chemicals simultaneously.
      • +
      • - New Virology design including an airlock and quarantine chambers.
      • +
      • - Made vaccine bottles contain 3 portions of vaccine.
      • +
      • - Lots of minor bug fixes.
      • + +
      + +
    + +
    Monday, October 18, 06:24(GMT)
    +
      +
    • Added virology profession with a cosy lab in northwestern part of medbay.
    • +
    • Virology related things, like taking blood samples, making vaccines, splashing contagious blood all over the station and so on.
    • +
    • Added one pathetic disease.
    • +
    • Virus crates are now available from the quartermasters for 20 points.
    • +
    • The DNA console bug (issue #40) was fixed, but I still made the DNA pod to lock itself while mutating someone.
    • +
    • Added icons for unpowered CheMaster and Pandemic computers
    • +
    • Added some sign decals. The icons were already there, but unused for reasons unknown.
    • +
    • Some map-related changes.
    • +
    + +
    Wednesday, October 13, 14:12(GMT)
    +
      +
    • Crawling through vents (alien) now takes time. The farther destination vent is, the more time it takes.
    • +
    • Cryo cell healing ability depends on wound severity. Grave wounds will heal slower. Use proper chemicals to speed up the process.
    • +
    • Added sink to the medbay.
    • +
    • Bugfixes: +
        +
      • - Some reagents were not metabolized, remaining in mob indefinitely (this includes Space Cola, Cryoxadone and cocktails Kahlua, Irish Cream and The Manly Dorf).
      • +
      • - Fixed placement bug with container contents window. Also, utility belt window now doesn't obscure view.
      • +
      +
    • +
    + +
    Sunday, October 10, 14:25(GMT)
    +
      +
    • Scrubbers in the area can be controlled by air alarms. Air alarm interface must be unlocked with an ID card (minimum access level - atmospheric technician), usable only by humans and AI. Panic syphon drains the air from affected room (simple syphoning does too, but much slower).
    • +
    • Sleeper consoles inject soporific and track the amounts of rejuvination chemicals and sleep toxins in occupants bloodstream.
    • +
    • Flashlights can be used to check if mob is dead, blind or has certain superpower. Aim for the eyes.
    • +
    • Radiation collectors and collector controls can be moved. Secured\unsecured with a wrench.
    • +
    • Air sensors report nitrogen and carbon dioxide in air composition(if set to).
    • +
    • Air Control console in Toxins.
    • +
    • Additional DNA console in genetics
    • +
    • Enough equipment to build another singularity engine can be found in engineering secure storage
    • +
    • Air scrubber, vent and air alarm added to library
    • +
    • Air alarm added to brig
    • +
    • Air scrubbers in Toxins turned on, set to filter toxins
    • +
    • Empty tanks, portable air pumps and similar can be filled with air in Aft Primary Hallway, just connect them to the port. Target pressure is set by Mixed Air Supply console in Atmospherics (defaults to 4000kPa).
    • +
    + +
    Wednesday, October 6, 18:36
    +
      +
    • Fixed the Librarian's suit - its worn iconstate wasn't set.
    • +
    • Fixed some typos.
    • +
    • Monkey crates are now available from the quartermasters for 20 points.
    • +
    • Corpse props removed from zlevel 8 as they were causing issues with admin tools and the communications intercept.
    • +
    • Cleaned up the default config.txt
    • +
    • Added a readme.txt with installation instructions.
    • +
    • Changed the ban appeals link to point to our forums for now - this'll be a config file setting soon.
    • +
    + +
    Tuesday, October 5, 01:41
    +
      +
    • Fixes to various nonworking cocktails.
    • +
    • More map and runtime error fixes.
    • +
    • Nuke operative headsets should be on an unreachable frequency like department headsets.
    • +
    • Another AI Malfunction change: Now once the AI thinks enough APCs have been hacked, it must press a button to start the timer, which alerts the station to its treachery.
    • +
    • Blob reskinned to magma and increased in power.
    • +
    • The HoS now has an armored greatcoat instead of a regular armor vest.
    • +
    • Admin logs now show who killswitched a cyborg.
    • +
    • The roboticist terminal now lets you see which AI a cyborg is linked to.
    • +
    • Malf AIs are no longer treated as inactive for the purpose of law updates and cyborg sync while hacking APCs.
    • +
    • Traitor AIs are now affected by Reset/Purge/Asimov modules, except law 0.
    • +
    • AI core construction sprites updated.
    • +
    • Securitrons removed from the Thunderdome.
    • +
    • An APC now supplies power to the bomb testing area, and has external cabling to supply it in turn.
    • +
    • A new variant freeform module has been added to the AI Upload room.
    • +
    • The changeling's neurotoxic dart has been made more powerful - this will likely be an optional upgrade from a set of choices, akin to wizard spells.
    • +
    • Some gimmick clothes moved to a different object path.
    • +
    • The chameleon jumpsuit should now be more useful - it includes job-specific jumpsuits as well as flat colours.
    • +
    + +
    Wednesday, September 29, 15:40
    +
      +
    • Bartender update! Bartender now has a Booze-O-Mat vending machine dispensing spirits and glasses, which he can use to mix cocktails. Recipes for cocktails are available on the wiki.
    • +
    • The barman also now has a shotgun hidden under a table in the bar. He spawns with beanbag shells and blanks. Lethal ammo is obtainable from hacked autolathes.
    • +
    • Dead AIs can once more be intelicarded, however in order to be restored to functionality they must be repaired using a machine in the RD office.
    • +
    • Silicon-based lifeforms have metal gibs and motor oil instead of blood.
    • +
    • Aliens now have a death message.
    • +
    • Intelicarded AIs can now have their ability to interact with things within their view range reactivated by the person carrying the card.
    • +
    • New AI cores can be constructed from victimsvolunteers.
    • +
    • Verbs tweaked.
    • +
    • Intelicarded AIs can be deleted.
    • +
    • RD office redesigned, and the RD now spawns there.
    • +
    • The AI can now choose to destroy the station on winning a Malf round.
    • +
    • General bugfixes to AIs, constructed AIs and decoy AIs.
    • +
    • Hats no longer prevent choking.
    • +
    • Some extra gimmick costumes are now adminspawnable.
    • +
    • AI health is now displayed on their status tab.
    • +
    • AI upload module now requires you to select which AI to upload laws to in case of multiple AIs.
    • +
    • Cyborgs now choose an AI to sync laws with upon creation.
    • +
    • Law office redesigned.
    • +
    • Roboticists no longer have Engineering access.
    • +
    • More fixes to areas which had infinite power due to having no assosciated APC.
    • +
    • Meatbread slices are no longer infinite.
    • +
    • Malf rounds no longer end if a non-malfunctioning AI is killed.
    • +
    • Cigarettes now have directional sprites.
    • +
    • AI Core circuitboard spawns in the RD office.
    • +
    • AI Satellite now has cameras and properly-wired SMES batteries.
    • +
    • Decoy AIs can no longer be moved.
    • +
    • Several runtime errors have been fixed.
    • +
    • Nuke rounds will now end properly on a station or neutral victory.
    • +
    • Riot shields have been nerfed and are now only available in the armory and in riot crates.
    • +
    • Foam dart crossbows, cap guns and caps can now be won as arcade prizes.
    • +
    • AI Malfunction has been redesigned - the AI must now hack APCs in order to win. More APCs hacked makes the timer tick faster.
    • +
    • Hydroponics now has a MULEbot station.
    • +
    • Changeling mode has been added to the game and is now in testing.
    • +
    • Electrified airlocks should now only zap you once if you bump into them while running.
    • +
    • Chemistry and Toxins access has been removed from Botanists.
    • +
    • General bugfixes and map tweaks.
    • +
    + +
    Sunday, September 26, 17:51
    +
      +
    • Riot shields! One in every security closet, and a few in armory. Also orderable from QM.
    • +
    + +
    Tuesday, September 21, 17:51
    +
      +
    • New experimental UI for humans by Skie. Voice out if it has problems or you don't like it.
    • + ---> YOU CAN CHOOSE UI FROM PREFERENCES <--- +
    • Hydroponics: Now you can inject chemicals into plants with a syringe. Every reagent works differently.
    • +
    • Hydroponics: Added a small hoe for uprooting weeds safely. Botanists now have sissy aprons.
    • +
    • New random station/command names and verbs.
    • +
    • Dead AIs can no longer be intellicarded and the steal AI objective is now working.
    • +
    • Aliens now bleed when you hit them, as well as monkeys.
    • +
    • Hurt people and bodies leave blood behind if dragged around when they are lying. Sprites to be updated soon...
    • +
    • Fixed several run-time errors in the code. Also food doesn't deal damage anylonger in some cases.
    • +
    • Blobs and alien weeds slowed down some. Plant-b-gone buffed some.
    • +
    • Fixed monkeys and aliens not being able to deal damage to humans with items.
    • +
    • Monkeys now slip on wet floor.
    • +
    + +
    Friday, September 17, 23:03
    +
      +
    • The Lawyer now starts in his snazzy new office.
    • +
    • Law Office accesslevel added. Currently, the Lawyer and the HoP begin with this.
    • +
    • Robotics access can now be added or removed from the HoP's computer.
    • +
    • Robotics, the captain's quarters, the cargo lobby and the staff heads office now have APCs and can lose power like the rest of the station.
    • +
    • Toxins mixing room is now a separate area for power and fire alarm purposes, as it already had its own APC.
    • +
    + +
    Thursday, September 16, 20:11
    +
      +
    • Added the Lawyer job.
    • +
    • Doors can now be constructed and deconstructed. This is being playtested, expect the specifics to change.
    • +
    • Fixed certain jobs which were supposed to have stuff spawning in their backpack that just wasn't getting spawned.
    • +
    + +
    Monday, September 13, 13:30
    +
      +
    • Bunch of new announcer sounds added
    • +
    • Minor lag fix implementation in the pipe system
    • +
    • You can now hear ghosts... sometimes
    • +
    • Seed bags and nutrients can now be pocketed
    • +
    + +
    Monday, September 12, 12:48
    +
      +
    • New kitchen stuff: New recipes (Meatbread, Cheese, Omelette Du Fromage, Muffins), new chef's knife and trays (Spawn in the meat locker) and milk (spawns in the fridge). Recipes are as follows: + -Cheese: milk on food processor + -Cheese wedge: Slice the cheese wheel with the chef's knife + -Omelette Du Fromage: 2 eggs 2 cheese wedges + -Muffin: 2 eggs 1 flour 1 carton of milk + -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
    • +
    • 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)
    • +
    +
    Thursday, September 2, 22:45
    +
      +
    • Ghosts can no longer release the singularity.
    • +
    • Sprites added in preparation for a Hydroponics update
    • +
    • A decoy AI now spawns in the AI core during Malfunction rounds to reduce metagaming.
    • +
    • libmysql.dll added to distribution.
    • +
    • Aircode options restored to default configuration.
    • +
    • AIs properly enter powerloss mode if the APC in their area loses equipment power.
    • +
    • Hydroponics crates added to Hydroponics, containing Weed-B-Gone
    • +
    • Airlock electrification now actually works properly.
    • +
    • Karma database error message updated.
    • +
    • Cyborgs choosing the standard module no longer become invisible except for a pair of glowing red eyes.
    • +
    • Aliens now have a hivemind channel, accessed like departmental radio channels or robot talk with ':a'.
    • +
    • Full donut boxes no longer eat whatever item is used on them and disappear.
    • +
    +
    Monday, August 30, 16:24
    +
      +
    • PDA user interface has been given a graphical overhaul. Please report any problems with it on the issue tracker.
    • +
    • Personal lockers are once again available in the lockerroom
    • +
    • BUGFIX: Xenoburger iconstate was accidentally removed in an earlier revision. This has been fixed.
    • +
    • Some of the default messages have been changed.
    • +
    • Additional sprites added for plants and weeds in preparation for an expansion of Hydroponics.
    • +
    • A schema script is now available for setting up the SQL database.
    • +
    + +
    Sunday, August 29, 05:09
    +
      +
    • The Robotics Crate no longer exists. Quartermasters can now order a MULEbot crate for 20 points, or a Robotics Assembly crate for 10 points. The latter provides 4 flashes, 3 proximity sensors, two 10k charge power cells and an electrical toolbox, and requires a roboticist or a head of staff to open.
    • +
    • Traitor AIs no longer lose their Law 0 in the event of power loss.
    • +
    • Administrators can now toggle the availiabilty of their right-click verbs to prevent accidental usage while playing.
    • +
    • Tool Storage vending machine is now a proper object. (code cleanup)
    • +
    • Buckets are now available from autolathes.
    • +
    • Four generic remote signaller PDA cartridges are now stocked in the Tool Storage vending machine.
    • +
    • AI status display density adjusted.
    • +
    + +
    Thursday, August 26, 21:07
    +
      +
    • Open Source Release Thanks to Mport for releasable singularity code.
    • +
    • Cyborgs redone Thanks again to Mport for this, cyborgs are totally different now.
    • +
    • Engine Monitor PDA app is now Power Monitor PDA app, and actually works.
    • +
    • AI State Laws verb now allows the AI to choose which laws to state, in case of traitor AIs or laws ordering it not to state them. Hopefully this will cut down on 'OMG THE AI IS COPYING AND PASTING' metagaming.
    • +
    • Power Monitor circuitboard isn't mislabeled as Mass Driver Control any more.
    • +
    • Traitor and Rev-head clowns lose the clumsiness gene - this should make trying to flash people in Rev mode less of an exercise in frustration.
    • +
    • A sink has been added to the Fitness room - this lets you wash dirty and bloodstained clothing and equipment.
    • +
    • Blast doors and firedoors no longer open by just bumping into them.
    • +
    • The bar and kitchen now open onto the same seating area. The old cafeteria area is now used as a lockerroom to replace the old one which was displaced by Hydroponics.
    • +
    • The bar now has a space piano with which you can entertain and annoy the crew.
    • +
    • LIBRARY A library has been added to the station in the escape arm in order to educate the crew. The new Librarian job is available to manage it. Crewmembers can request and read books, or write and bind their own books for upload to a persistent database.
    • +
    • The supply of flashbangs available from Security has been reduced to cut down on people constantly flashbanging the escape shuttle.
    • +
    • InteliCards are available in various locations to allow the retrieval of valuable AI personality data in the event of catastrophic station damage.
    • +
    + +
    Friday, August 06, 20:32
    +
      +
    • Hydroponics/Botany Added Credit goes to Skie and the folks over at the independent opensource SS13 branch, this is their code. It's lacking a lot, but it's a great start!
    • +
    • Way more tweaks than I can remember. Shouldn't wait so long between changelog updates.
    • +
    +
    Tuesday, July 13, 22:35
    +
      +
    • Singularity Engine Added Oh God we're all going to die (All credit on this one goes to Mport2004)
    • +
    • 'Purge' AI module added - purges ALL laws (except for law 0). Will probably change this to a Syndicate only item
    • +
    • Cyborgs now spawn with a power cell. Should prevent stupid cyborg deaths (and also pave the way for starting as a cyborg once more bugs are fixed)
    • +
    +
    Saturday, July 10, 15:10
    +
      +
    • Examining a player will now tell you if their client has disconnected.
    • +
    • Examining a brain will now tell you if it's owner is still connected to the game.
    • +
    • Alien Queens can make facehuggers. Facehuggers can make larva. Larva can grow into xenos! Xenos can become queens! The circle of life~
    • +
    • Some powernet bug fixes: Bad list and division by zero.
    • +
    +
    Friday, July 09, 05:16
    +
      +
    • Tweaked crate costs for Quartermaster.
    • +
    • Increased metal available in Robotics.
    • +
    • Added department-specific headsets. Engineering, Medical, Command, and Security all receive special headsets capable of broadcasting on a standard frequency PLUS a secure frequency only available to headsets of the same type. Precede say messages with ":h" to use.
    • +
    + +
    Tuesday, July 06, 19:16
    +
      +
    • Prayer command added.
    • +
    • State Laws command for AI added.
    • +
    • Disabled Lockdown command for AI. Too server heavy.
    • +
    • Crew manifest and various station databases should properly update when late arrivals join the game, now.
    • +
    • Quartermasters will receive 10 points every five minutes. This will probably be nerfed heavily, but we'll give it a shot anyhow.
    • +
    • Fixed a bug with doors/airlocks. (Thanks Mport2004)
    • +
    + +
    Sunday, April 25, 18:53
    + +
  • + New graphics: +
      +
    • + Side Facing Sprites: Player sprites will now face in all directions when moving. Holy shit! +
    • +
    +
  • + +
    Monday 2.0, April 19, 2100
    +
      +
    • + New features: +
        +
      • + Disposal System: The station now has a fully functional disposal system for throwing away nuclear authentication disks and old, dirty clowns. +
      • +
      • + Breakable Windows: Windows are breakable by projectiles and thrown items (including people), shards hurt your feet. +
      • +
      • + Status Display: Station escape shuttle timers now function as status displays modifiable from the bridge. +
      • +
      • + Space Heater: Space heaters for heating up cold spaces, in space. +
      +
    • +
    • + New items: +
        +
      • + Welding Mask: Helps engineers shield their eyes when welding. +
      • +
      • + Utility Belt: Function as toolboxes equippable in the belt slot. +
      • +
      • + Mouse Trap: Hurt your feet, especially if you aren't wearing shoes! +
      • +
      • + Power Sink: Traitor item that rapidly drains power. +
      • +
      +
    • +
    • + New graphics: +
        +
      • + North Facing Sprites: Player sprites will now face north when moving north. +
      • +
      • + Hidden Pipes: Pipes are now hidden underneath floor tiles. +
      • +
      +
    • +
    • + New robot: Medibot +
        +
      • + Automatically attempts to keep crewmembers alive by injecting them with stuff. +
      • +
      +
    • +
    • + New robot: Mulebot +
        +
      • + Allows quartermasters to automatically ship crates to different parts of the station. +
      • +
      +
    • +
    + +
    Funday, December 31, 2099
    +

    "FINALLY, DEV IS OUT"

    +
      +
    • + Changes: +
        +
      • + Atmos system GREATLY OPTIMIZED! +
      • +
      • + Brand new station layout! +
      • +
      • + Robust chemical interaction system! +
      • +
      • + HOLY FUCK PLAYING THIS GAME ISN'T LIKE TRODDING THROUGH MOLASSES ANYMORE +
      • +
      • + Feature: If two players collide with "Help" intent, they swap positions. +
      • +
      +
    • +
    + +
    Tuesday, February 23, 2010
    +
      +
    • + OH NO STRANGLING GOT NERFED: Insta-strangling (hopefully) removed. Victim no longer instantly loses consciousness. +
    • +
    + +
    Sunday, February 21, 2010
    +
      +
    • + Cloning Machine: The Geneticist spilled coffee on the Genetics Machine's revival module and it was too costly to replace! +
        +
      • + Clones may or may not have horrible genetic defects. +
      • +
      +
    • +
    + +
    Thursday, February 18, 2010
    +
      +
    • + New feature: Obesity from overeating in a short period of time. +
    • +
    + +
    Sunday, February 14, 2010
    +
      +
    • + New feature: Station destruction cinematic if the crew loses in AI Malfunction or Nuclear Emergency. +
    • +
    • + New Position: Tourist +
        +
      • + Centcom has entered the lucrative business of space tourism! Enjoy an event-filled vacation on the station, and try not to get killed. +
      • +
      • + Guest accounts are now restricted to selecting Tourist in Character Setup. +
      • +
      +
    • +
    + +
    Friday, February 5, 2010
    +
      +
    • + AI: Added 30 second cooldown to prevent spamming lockdowns. +
    • +
    + +
    Wednesday, February 2, 2010
    +
      +
    • + Feature: Character preview in Character Setup! +
    • +
    + +
    Tuesday, February 2, 2010
    +
      +
    • + New item: Drinking glasses that you can fill with water. +
    • +
    • + Feature: Sounds now pan in stereo depending on your position from the source. +
    • +
    + +
    Saturday, December 5, 2009
    +
      +
    • + Traitor tweak: Agent cards can now be forged into a fake ID. +
    • +
    + +
    Friday, December 4, 2009
    +
      +
    • + Supply Dock 2.0: The Supply Dock has been redesigned and now features conveyer belts! Amazing! +
    • +
    • + New uniforms: The Research Director, Chief Engineer, and the research jobs have new uniforms. The Head of Security has a cool new hat which happens to be his most prized possession. +
    • +
    • + Merged research: The first act of the Research Director is to merge Toxins and Chemistry into a single Chemical Lab. Hooray! +
    • +
    • + Robot tweak: You can now observe robots using the observe command. +
    • +
    • + Stamps: The heads now have stamps to stamp papers with, for whatever reason. +
    • +
    + +
    Monday, November 30, 2009
    +
      +
    • + Supply Shuttle 1.0: Now you can order new supplies using Cargo Bay north of the autolathe. +
    • +
    • + New containers: The game now features a variety of crates to hold all sorts of imaginary space supplies. +
    • +
    • + New position: Quartermaster +
        +
      • + A master of supplies. Manages the cargo bay by taking shipments and distributing them to the crew. +
      • +
      +
    • +
    • + New position: Research Director +
        +
      • + The head of the SS13 research department. He directs research and makes sure that the research crew are working. +
      • +
      +
    • +
    • + New position: Chief Engineer +
        +
      • + Boss of all the engineers. Makes sure the engine is loaded and that the station has the necessary amount of power to run. +
      • +
      +
    • +
    • + New robot: Securibot +
        +
      • + Automatically stuns and handcuffs criminals listed in the security records. It's also really goddamn slow. +
      • +
      +
    • +
    • + New jumpsuits: Engineers and Atmos Techs have new jumpsuits to distinguish between them easier. +
    • +
    + +
    Friday, November 27, 2009
    +
      +
    • + Monkey AI 2.0: Monkeys will now get angry, going after random human targets with the ability to wield weapons, throw random objects, open doors, and break through glass/grilles. They're basically terminators. +
    • +
    • + New gamemode: Monkey Survival +
        +
      • + Survive a horde of angry monkeys busting through the station's airvents and rampaging through the station for 25 minutes. +
      • +
      +
    • +
    • + New robots: Cleanbot and Floorbot +
        +
      • + Cleanbots automatically clean up messes and Floorbots repair floors. +
      • +
      +
    • +
    • + New spell: Mindblast +
        +
      • + Causes brain damage, progressively causing other players to become even more retarded. +
      • +
      +
    • +
    • + Alien Races +
        +
      • + Wizards may randomly spawn as illithids, who gain Mind Blast for free, and nuke agents may randomly spawn as lizardmen. +
      • +
      +
    • +
    • + Station shields: The station now has a toggleable forcefield that can only be destroyed by meteors or bombs. Takes a lot of station power to use. +
    • +
    • + Traitor scaling: Number of traitors/wizards/agents now scales to number of players. +
    • +
    • + New food item: Donk pockets +
        +
      • + Delicious and microwavable, gives a bigger health boost for traitors. +
      • +
      +
    • +
    • + Cigarettes: Now you can fulfill your horrible nicotine cravings. The detective starts with a zippo lighter and pack of cigarettes. Other packs can be be obtained via vending machines. +
    • +
    • + Warning signs: The station is now filled with various warning signs and such. +
    • +
    • + Updated graphics: Many, many objects have had their graphics updated including pipes, windows, tables, and closets. HUD graphics have been updated to be easier to understand. +
    • +
    • + Lighting fixes: New turf is now correctly lit instead of being completely dark. +
    • +
    • + Meteor fixes: The code and graphics for meteors has been fixed so the meteor gametype is more playable, sort of. +
    • +
    • + Escape shuttle fix: The shuttle can now be called in Revolution and Malfunction, but the shuttle will be recalled before it arrives. This way players can no longer call the shuttle to figure out the game mode during secret. +
    • +
    • + Changelog updated: New changelog entry for Thanksgiving thanks to Haruhi who will probably update the changelog from now on after almost a month of neglect. +
    • +
    + +
    Monday, November 3, 2009
    +
      +
    • + Bug fix: Made most pop-up windows respect the close button. +
    • +
    + +
    Sunday, October 25, 2009
    +
      +
    • + Randomized naming: Names for Central Command and Syndicate are now randomized. +
    • +
    + +
    Saturday, October 24, 2009
    +
      +
    • + Bug fix: PDAs had their code cleaned up. Notice any problems? Report them. +
    • +
    • + New syndicate item: Detomatix Cartridge, allows remote detonation of PDAs (rather weak explosion)! +
    • +
    • + Feature: Remotely detonating PDAs has a chance of failure depending on the PDA target, a critical failure will result in the detonation of your own PDA. +
    • +
    + +
    Monday, October 19, 2009
    +
      +
    • + Gibbing update: Gibbing stuff has been rewritten, robots now gib nicer. +
    • +
    • + LIGHTING!!!: The station now has dynamic lighting and associated items. +
    • +
    + +
    Friday, October 16, 2009
    +
      +
    • + Poo v1.0~: This has caused many ragequits. +
    • +
    • + Flushable toilets: You can now use toilets to place your vile, disgusting and irreprehensible excretions (you disgusting children). Just be careful what you flush! +
    • +
    +
    Monday, October 12, 2009
    +
      +
    • + Feature: Emergency oxygen bottles can be clipped to your belt now. +
    • +
    • + Clothing update: Bedsheets are now wearable. +
    • +
    • + Updated HUD: A few minor tweaks to the inventory panel. Things might not be exactly where you're used to them being. +
    • +
    +
    Monday, September 28, 2009
    +
      +
    • + New position: Chef +
        +
      • + Maintains the Cafeteria, has access to Kitchen and Freezer, Food creation will be in shortly. +
      • +
      +
    • +
    • + Food update: Food items now heal Brute/Burn damage. The amount recovered varies between items. +
    • +
    +
    Saturday, August 29, 2009
    +
      +
    • + AI laws update: Nanotrasen has updated its AI laws to better reflect how they wish AIs to + operate their stations. +
    • +
    • + Traitor item change: E-mag renamed to Cryptographic Sequencer. +
    • +
    + +
    Friday, July 31, 2009
    +
      +
    • I&#39;m really sorry everyone I just HAD to add a gib all verb.
    • +
    • Decided to add the creation of bombs to bombers list
    • +
    • Made the new bombing list EVEN BETTER!!!
    • +
    • Fixed a bug with admin jumping AND the traitor death message
    • +
    • Oops, fixed a bug that returned the right click pm thing thinking the admin was + muted.
    • +
    • Made a new improved way of tracking who bombs shit.
    • +
    • More formatting shit.
    • +
    • Fixed up some mute code and made it so that if a player is muted they cannot PM + us.
    • +
    • Adminhelps now logged in the admin file not ooc
    • +
    • Changed the way admin reviving is dealt with. (It was coded kind of weirdly + before)
    • +
    • Added a few areas to the observe teleport. Fixed some adminjump things. Modified + the paths of some areas.
    • +
    • You can now ban people who have logged out and admins can now jump to people + using the player panel.
    • +
    • Added in jump to key coded in a much better way than showtime originally did it.
    • +
    • Fixed magical wind when laying pipes. They start out empty!!
    • +
    • Made blink safer. Fixed the crew-quarters to ai sattelite teleport problem.
    • +
    • Forgot the message again. Added an emp spell. thanks copy&amp;paste.
    • +
    • OH MY GOD I HAVE RUINED ASAY
    • +
    • Added electronic items to the pipe dispenser
    • +
    • fixed a formatting error with the changelog (I didn&#39;t break it, it was showtime)
    • +
    • Fixed a formatting error
    • +
    • Cleaned up sandbox object spawn code
    • +
    • New and improved admin log so we can keep an eye on these fuckers
    • +
    • Fixed adminjump because I realise most people use it for the right click option
    • +
    • Mushed together jump to mob and jump to key
    • +
    • Fixed a compilation error and made my test room more secure!
    • +
    + +
    Wednesday, July 29th, 2009
    + +

    These are a collection of the updates from the last 6 days. I promise to update + the changelog once a week. Note that this does not include all the changes in + the past 6 days.

    + +
      +
    • Multitools can now be used to measure the power in cables.
    • +
    • Fixed a bug where the canister message would repeat and spam the user when + attackby analyzer. Fixed an admin formatting error.
    • +
    • Replaced all range checks with a in_range proc. pretty good chance I broke + something or everything.
    • +
    • Mutations use bitfields
    • +
    • Fixed a bug with my traitor panel.
    • +
    • Fixed the turrets, ruined Pantaloons map (test map). Did some things with + turrets and added a few areas.
    • +
    • Some stuff in here you know the usual shit. Bugfixes, formatting etc.
    • +
    • Stunbaton nerf.
    • +
    • Tempban longer than 1 year -&gt; permaban.
    • +
    • Turfs &gt; spawnable.
    • +
    • Shaking someone now slowly removes paralysis, stuns and the &#39;weakened&#39; stuff.
    • +
    • CTF flags now check if someone has them equipped every 20 seconds, if they are + not then they delete themselves and respawn.
    • +
    • Fixed the r-wall-welder-message-thing.
    • +
    • Change to the CTF code, flag captures can now only happen if your team has their + flag in the starting position.
    • +
    • Pruning my test room.
    • +
    • Instead of the red and green team its now the American and Irish teams!
    • +
    • 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
    • +
    • Fixed a bug that gave everyone modify ticker variables you silly sausage.
    • +
    • Sorted the AIs track list.
    • +
    • Constructable filter inlets and filter controls.
    • +
    • Added in admin messages for when someone is banned.
    • +
    • Bannana and honk honk.
    • +
    + +
    Saturday, June 27th, 2009
    + +
      +
    • Pipe construction now works completely. //Nannek
    • +
    • Many many other things that never gets recorded in the changelog!!
    • +
    + +
    Saturday, June 27th, 2009
    +
      +
    • The Michael Jackson Memorial Changelog Update
    • +
    • Pipe filters adjusted for more ideal environmentals //Pantaloons
    • +
    • Added in job tracking //Showtime
    • +
    • Crew Manifest and Security Records now automagically update when someone joins //Nannek
    • +
    • Fixed a bug where sometimes you get a screwdriver stuck in your hand //Pantaloons
    • +
    • Flamethrowers can now be disassembled //Pantaloons
    • +
    • OBJECTION! Added suits and briefcases //stuntwaffle
    • +
    • Added automatic brig lockers //Nannek
    • +
    • Added brig door control authorization and redid brig layout //Nannek
    • +
    • Emergency toolboxes now have radios and flashlights, and mechanical toolboxes now have crowbars //Pantaloons
    • +
    • New whisper system //lallander
    • +
    • Some more gay fixes //everybody
    • +
    • Some really cool fixes //everybody
    • +
    • Really boring code cleanup //Pantaloons
    • +
    • ~~In Loving Memory of MJ~~ Sham on!
    • +
    + +
    Friday, June 12th, 2009
    +
      +
    • Looking back through the SVN commit log, I spy...
    • +
    • Keelin doing some more performance enhancements
    • +
    • Fixed one person being all 3 revs at once (hopefully)
    • +
    • Some gay fixes
    • +
    • New admin system installed
    • +
    • Fixed a bug where mass drivers could be used to crash the server
    • +
    • Various pipe changes and fixes
    • +
    + +
    Wednesday, June 3rd, 2009
    +
      +
    • Death commando deathmatch mode added.
    • +
    + +
    Monday, June 1st, 2009
    +
      +
    • Ghosts can no longer wander from space into the dread blackness that lies beyond.
    • +
    • Those other losers probably did a bunch of other stuff since May 6th but they don't comment their revisions so fuck 'em.
    • +
    + + +
    Wednesday, May 6th, 2009
    +
      +
    • Crematorium
    • +
    • Goon? button makes all your dreams come true.
    • +
    • Restructured medbay
    • +
    +
    Monday, May 4th, 2009
    +
      +
    • Does anyone update this anymore?
    • +
    • New atmos computer promises to make atmos easier
    • +
    • Autolathe
    • +
    • Couple of map changes
    • +
    • Some computer code reorganised.
    • +
    • I'm pretty sure theres a couple things
    • +
    +
    Saturday, April 18th, 2009
    +
      +
    • Weld an open closet (only the normal kind), gayes.
    • +
    • Chaplin has a higher chance of hearing the dead.
    • +
    • New traitor objective
    • +
    • Power traitor objective removed
    • +
    • New job system implemented for latecomers.
    • +
    • Head of Research quits forever and ever, is replaced by Head of Security (who gets his own office)
    • +
    + +
    Fri, April 10, 2009
    +
      +
    • Admins are now notified when the traitor is dead.
    • +
    • Unprison verb (again, for admins).
    • +
    + +
    Wed&Thu, April 8&9, 2009
    +
      +
    • Medical redone, doctors do your jobs! (Tell me what you think of this + compared to the old one)
    • +
    • Clickable tracking for the AI
    • +
    • Only the heads can launch the shuttle early now. Or an emag.
    • +
    + +
    Mon&Tue, April 6&7, 2009
    +
      +
    • Sounds. Turn on your speakers & sound downloads.
    • +
    • Scan something with blood on it detective.
    • +
    + +
    Sunday, April 5, 2009
    +
      +
    • A large icon for the headset, no reason it should be so small.
    • +
    + +
    Saturday, April 4, 2009
    +
      +
    • Emergency closets now spawn an 'emergency gas mask' which are just recolored gas masks, no other difference other than making it obvious where the gas mask came from.
    • +
    + +
    Wednesday, April 1, 2009
    +
      +
    • Constructable rocket launchers: 10 rods, 10 metal, 5 thermite and heated plasma from the prototype.
    • +
    • Emergency closets have randomized contents now.
    • +
    • Fixed a bug where someone who was jobbaned from being Captain could still be picked randomly
    • +
    + +
    Friday, March 27, 2009
    +
      +
    • Fixed a bug where monkeys couldn't be stunned.
    • +
    • Change mode votes before game starts delays the game.
    • +
    + +
    Thursday, March 26, 2009
    +
      +
    • The brig is now pimped out with special new gadgets.
    • +
    • Upgraded the admin traitor menu.
    • +
    + +
    Tuesday, March 24, 2009
    +
      +
    • GALOSHES!
    • +
    • A certain item will now protect you from stun batons, tasers and stungloves when worn.
    • +
    + +
    Monday, March 23, 2009 (EXPERIMENTAL)
    +
      +
    • Say / radio / death talk systems recoded, hopefully improving it.
    • +
    • Announcements of late joiners are now done by the AI if it's alive :-)
    • +
    + +
    Monday, March 23, 2009
    +
      +
    • Random station names.
    • +
    • Changes to the message stylesheet.
    • +
    • Admin messages in OOC will now be colored red.
    • +
    + +
    Saturday, March 21, 2009
    +
      +
    • Added a command to list your medals.
    • +
    • ETA no longer shows when it doesn't matter.
    • +
    • Nerfed the ability to spam shuttle restabalization.
    • +
    • Fixed the 'Ow My Balls!' medal to only apply from brute damage rather than both brute and burn damage.
    • +
    + +
    Thursday, March 19, 2009
    +
      +
    • Job banning.
    • +
    • Genetic Researcher renamed to Geneticist.
    • +
    • Toxins Researcher renamed to Scientist.
    • +
    • Help reformatted.
    • +
    • Fixed a bug where combining bruise packs or ointments resulted in an incorrectly combined amount.
    • +
    • Renamed memory and add memory commands to Notes and Add Note.
    • +
    + +
    Tuesday, March 17, 2009
    +
      +
    • Medals! MEDALS!
    • +
    • Trimmed the excessively long changelog.
    • +
    + +
    Saturday, March 14, 2009
    +
      +
    • Janitor job complete! Report any bugs to adminhelp
    • +
    + +
    Saturday, March 7, 2009
    +
      +
    • Wizard now needs his staff for spells
    • +
    • Be careful with APCs now okay?!
    • +
    • Fixed Memory and made it more efficient in the code
    • +
    • Crowbars now open apcs, not screwdrivers. They do something else entirely
    • +
    • Hackable APCs
    • +
    • When APCs are emagged they now stay unlocked
    • +
    • Re-did a shit tonne of admin stuff
    • +
    • New admin system is pretty much finished
    • +
    • FINALLY backpacks can now be looked in while on the ground.
    • +
    + +
    Tuesday, February 24, 2009
    +
      +
    • Ghosts no longer able to open secret doors
    • +
    • Suicide vests now work as armor
    • +
    • Blood no longer comes out of the guy if you pull him due to lag
    • +
    • Admin panel has been touched up to include html tables
    • +
    • Mines now added, only spawnable right now however
    • +
    • 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
    • +
    • THUNDERDOME!
    • +
    • Several new facial hair options and a bitchin' mohawk
    • +
    • Blood by Culka
    • +
    • Nuke disk now spawns in ALL game modes so that during secret rounds the syndicate now have the element of surprise!
    • +
    + +
    Saturday, February 22, 2009
    +
      +
    • Implemented unstable's "observer" mode
    • +
    • Halerina's wizard mode
    • +
    • Non-interesting stuff
    • +
    • Began addition to the new admin system - right now only available to coders for testing
    • +
    • Admins can now click on the multikeying offenders name to pm them, instead of hunting for them in the pm list
    • +
    • Halerina's chemistry system
    • +
    • You can now deathgasp without being dead, hopefully so people can fake their own deaths.
    • +
    • Redid Medlab
    • +
    • New chemist job
    • +
    + +
    Thursday, February 19, 2009
    +
      +
    • New DNA system. 200th Revision special.
    • +
    • Various bugfixes
    • +
    • Maze
    • +
    + +
    Monday, February 17, 2009
    +
      +
    • Added a new game mode into rotation.
    • +
    • Added an AI satellite
    • +
    • Lockdowns can be disabled with the communications console
    • +
    • Prison shuttle can be called on the comm console, but only if its enabled by admins first
    • +
    • When you slip into space you'll have a 50% chance of going to z=4 instead of z=3
    • +
    + +
    Friday, February 13, 2009
    +
      +
    • Fixed Cakehat
    • +
    • Dead people can now see all turfs, mobs and objs not in their line of sight.
    • +
    • Modified the map slightly
    • +
    • Stungloves can now be "made"
    • +
    • Flashes can now have their bulbs burning out.
    • +
    • Batons can now be turned on and off for different effects. They also now have 10 uses before they need to be recharged.
    • +
    + +
    Tuesday, February 10, 2009
    +
      +
    • Fixed all the autoclose bugs
    • +
    • Due to it being myself and Keelin's 100th revision we have added a super-secret special item. Don't ask because we won't tell! Figure it out!
    • +
    + +
    Sunday, February 8, 2009
    +
      +
    • Modified doors in engineering so that they do not autoclose - Autoclose now handled by a variable
    • +
    • Fixed toxin researcher spawn bug
    • +
    • Changed the "You hear a faint voice" message.
    • +
    • Gave the host new commands to disable admin jumping, admin reviving and admin item spawning
    • +
    • Fixed some airlock autoclose bugs
    • +
    • Changed some doors to not autoclose.
    • +
    • Nerfed the toolbox down.
    • +
    + +
    Friday, February 6, 2009
    +
      +
    • Doors now close after 15 seconds
    • +
    • Fixed some p cool bugs
    • +
    • Cakehat
    • +
    • Added another suit
    • +
    • Walls now take 5 seconds to build
    • +
    • Added sam0rz, thesoldierlljk and kelson's revolution gamemode. Thanks guys!
    • +
    + +
    Thursday, February 5, 2009
    +
      +
    • Fixed a couple of bugs
    • +
    • Improved bar ;)
    • +
    • Beer acts like pills and syringes
    • +
    + +
    Tuesday, February 3, 2009
    +
      +
    • Added 'Make AI' Option for Admins
    • +
    • Added dissolving pills in beer (cyanide and sleeping pills)
    • +
    • Modified engine AGAIN, but personally I love it now
    • +
    + +
    Monday, February 2, 2009
    +
      +
    • Moved bar due to popular demand
    • +
    • Captains room is now a security checkpoint
    • +
    • Assistants now have access to maint tunnels again
    • +
    • Courtroom
    • +
    • Engine has been redone slightly to make it easier to load
    • +
    • Nerfed beer a lot more
    • +
    + +
    Saturday, January 31, 2009
    +
      +
    • Added a bartender job + Bar
    • +
    • Captains panic room
    • +
    • Voice changer traitor item
    • +
    • Bartender suit
    • +
    • Made taking a table apart take longer
    • +
    • Balanced beer a bit more.
    • +
    • Assistants can no longer open external air locks and maint tunnels, sorry guys. Get a job you bums.
    • +
    • Engineers CAN access external air locks and maint tunnels.
    • +
    • Fixed traitor AI bug
    • +
    + +
    Thursday, January 29, 2009
    +
      +
    • Added traitor menu for admins - The ability to turn people into "traitors" as well as keep track of their objectives.
    • +
    • Implemented Keelins revive system - Primary Admins can now revive people.
    • +
    • Moved and redid security to prevent clusterfucks and everyone just crowding around security.
    • +
    • Redid the brig to make it bigger and so that people can break others more easily out since it isn't right in security.
    • +
    • Moved and redid captains quarters/heads quarters. Captains made much smaller and heads is now more of a meeting room.
    • +
    • Added Stungloves and an axe - right now only admin spawnable.
    • +
    • Implemented Persh's adminjump back in - admins can now jump to set locations.
    • +
    • Added a feature that if someone logs off their character moves around and says things - Change what they say from the config/names/loggedsay.txt file.
    • +
    • Added in adminwho verb - tells the user if there are any admins on and who they are.
    • +
    + +
    Saturday, January 10, 2009
    +
      +
    • Freedom implant has been changed so that it will have a random emote associated with it to activate it rather than always chuckle.
    • +
    • There is now a pinpointer tool for use in Nuclear Emergency. It works similar to the existing locator, in that it will detect the presence of nuclear disks and in what direction it is.
    • +
    • The nuke being detonated in Nuclear Emergency should now properly end the game.
    • +
    • Spacesuits now cause you to move slower when not in space.
    • +
    • Syndicate in Nuclear Emergency now have syndicate-themed spacesuits.
    • +
    • Blob mode should properly end now.
    • +
    + +
    Wednesday, January 7, 2009
    +
      +
    • Syndicate Uplink has been changed up, allowing traitor more freedom in his ability to be... traitorus.
    • +
    • Syndicate Uplink can now spawn a ammo-357, syndicate card, energy sword, or timer bomb.
    • +
    • Fixed an issue where Syndicate Uplink looked different than a normal radio.
    • +
    + +
    Monday, January 5, 2009
    +
      +
    • You can choose to be a nudist now.
    • +
    • Facial hair!
    • +
    • Added constructable flamethrowers.
    • +
    • Redid internal naming scheme for human/uniform sprites.
    • +
    • Helmet visors are now translucent.
    • +
    • Held item graphics corrected for basically everything, internally only uses one dmi file instead of two.
    • +
    • Config settings reorganized for.. organization.
    • +
    • 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.
    • +
    diff --git a/html/browser/assembly_ui.css b/html/browser/assembly_ui.css deleted file mode 100644 index 02d32c7394aa0..0000000000000 --- a/html/browser/assembly_ui.css +++ /dev/null @@ -1,29 +0,0 @@ -div.scrollleft -{ - bottom: 0; - margin: 0; - overflow: scroll; - overflow-x: auto; - position: absolute; - text-indent: 15px; - top: 120px; - width: 200px; -} - -div.scrollright -{ - bottom: 0; - left: 210px; - margin: 0; - right: 0; - overflow: scroll; - overflow-x: auto; - position: absolute; - text-indent: 15px; - top: 120px; -} - -font.lowtext -{ - bottom: 0; -} diff --git a/html/browser/common.css b/html/browser/common.css index 2e84e022f027d..eb6fed9a9e0cf 100644 --- a/html/browser/common.css +++ b/html/browser/common.css @@ -1,411 +1,411 @@ -body -{ - padding: 0; - margin: 0; - background-color: #272727; - font-size: 12px; - color: #ffffff; - line-height: 170%; -} - -hr -{ - background-color: #40628a; - height: 1px; -} - -a, button, a:link, a:visited, a:active, .linkOn, .linkOff -{ - color: #ffffff; - text-decoration: none; - background: #40628a; - border: 1px solid #161616; - padding: 1px 4px 1px 4px; - margin: 0 2px 0 0; - cursor:default; -} - -a:hover -{ - color: #40628a; - background: #ffffff; -} - -a.white, a.white:link, a.white:visited, a.white:active -{ - color: #40628a; - text-decoration: none; - background: #ffffff; - border: 1px solid #161616; - padding: 1px 4px 1px 4px; - margin: 0 2px 0 0; - cursor:default; -} - -a.white:hover -{ - color: #ffffff; - background: #40628a; -} - -.linkOn, a.linkOn:link, a.linkOn:visited, a.linkOn:active, a.linkOn:hover -{ - color: #ffffff; - background: #2f943c; - border-color: #24722e; -} - -.linkOff, a.linkOff:link, a.linkOff:visited, a.linkOff:active, a.linkOff:hover -{ - color: #ffffff; - background: #999999; - border-color: #666666; -} - -a.icon, .linkOn.icon, .linkOff.icon -{ - position: relative; - padding: 1px 4px 2px 20px; -} - -a.icon img, .linkOn.icon img -{ - position: absolute; - top: 0; - left: 0; - width: 18px; - height: 18px; -} -ul -{ - padding: 4px 0 0 10px; - margin: 0; - list-style-type: none; -} - -li -{ - padding: 0 0 2px 0; -} - -img, a img -{ - border-style:none; -} - -h1, h2, h3, h4, h5, h6 -{ - margin: 0; - padding: 16px 0 8px 0; - color: #517087; -} - -h1 -{ - font-size: 15px; -} - -h2 -{ - font-size: 14px; -} - -h3 -{ - font-size: 13px; -} - -h4 -{ - font-size: 12px; -} - -.uiWrapper -{ - - width: 100%; - height: 100%; -} - -.uiTitle -{ - clear: both; - padding: 6px 8px 6px 8px; - border-bottom: 2px solid #161616; - background: #383838; - color: #98B0C3; - font-size: 16px; -} - -.uiTitle.icon -{ - padding: 6px 8px 6px 42px; - background-position: 2px 50%; - background-repeat: no-repeat; -} - -.uiContent -{ - clear: both; - padding: 8px; - font-family: Verdana, Geneva, sans-serif; -} - -.good -{ - color: #00ff00; -} - -.average -{ - color: #d09000; -} - -.bad -{ - color: #ff0000; -} - -.highlight -{ - color: #8BA5C4; -} - -.dark -{ - color: #272727; -} - -.notice -{ - position: relative; - background: #E9C183; - color: #15345A; - font-size: 10px; - font-style: italic; - padding: 2px 4px 0 4px; - margin: 4px; -} - -.notice.icon -{ - padding: 2px 4px 0 20px; -} - -.notice img -{ - position: absolute; - top: 0; - left: 0; - width: 16px; - height: 16px; -} - -div.notice -{ - clear: both; -} - -.statusDisplay -{ - background: #000000; - color: #ffffff; - border: 1px solid #40628a; - padding: 4px; - margin: 3px 0; -} - -.statusLabel -{ - width: 138px; - float: left; - overflow: hidden; - color: #98B0C3; -} - -.statusValue -{ - float: left; -} - -.block -{ - padding: 8px; - margin: 10px 4px 4px 4px; - border: 1px solid #40628a; - background-color: #202020; -} - -.block h3 -{ - padding: 0; -} - -.progressBar -{ - width: 240px; - height: 14px; - border: 1px solid #666666; - float: left; - margin: 0 5px; - overflow: hidden; -} - -.progressFill -{ - width: 100%; - height: 100%; - background: #40628a; - overflow: hidden; -} - -.progressFill.good -{ - color: #ffffff; - background: #00ff00; -} - -.progressFill.average -{ - color: #ffffff; - background: #d09000; -} - -.progressFill.bad -{ - color: #ffffff; - background: #ff0000; -} - -.progressFill.highlight -{ - color: #ffffff; - background: #8BA5C4; -} - -.clearBoth -{ - clear: both; -} - -.clearLeft -{ - clear: left; -} - -.clearRight -{ - clear: right; -} - -.line -{ - width: 100%; - clear: both; -} - - -.switch { - position: relative; - display: inline-block; - width: 50px; - height: 26px; -} - -.switch input {display:none;} - -.slider { - position: absolute; - cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: #383838; - transition: .4s; -} - -.slider:before { - position: absolute; - content: ""; - height: 18px; - width: 18px; - left: 4px; - bottom: 4px; - background-color: #98B0C3; - transition: .4s; -} - -.slider.red:before { - background-color: #d6858b; -} - -.slider.locked:before { - content: url("padlock.png"); - background-color: #b4b4b4; -} - -input:checked + .slider { - background-color: #40628a; -} - -input:checked + .slider.red { - background-color: #a92621; -} - -input:checked + .slider.locked { - background-color: #707070; -} - -input:focus + .slider { - box-shadow: 0 0 1px #2196F3; -} - -input:focus + .slider.red { - box-shadow: 0 0 1px #f3212d; -} - -input:focus + .slider.locked { - box-shadow: 0 0 1px #979797; -} - -input:checked + .slider:before { - transform: translateX(24px); -} - -.switch span { - display: inline-block; - position: relative; - width: 60px; - margin-left: 60px; -} - -ul.sparse { - padding-bottom:20px; -} - -.sparse li { - margin-top: 2px; -} - -.slider.round { - border-radius: 34px; -} - -.slider.round:before { - border-radius: 50%; -} - -.severity { - margin:0px; - padding: 1px 8px 1px 8px; - border-radius: 25px; - border: 1px solid #161616; - background: #40628a; - color: #ffffff; -} - -.severity img { - display: inline-block; - vertical-align: middle; -} +body +{ + padding: 0; + margin: 0; + background-color: #272727; + font-size: 12px; + color: #ffffff; + line-height: 170%; +} + +hr +{ + background-color: #40628a; + height: 1px; +} + +a, button, a:link, a:visited, a:active, .linkOn, .linkOff +{ + color: #ffffff; + text-decoration: none; + background: #40628a; + border: 1px solid #161616; + padding: 1px 4px 1px 4px; + margin: 0 2px 0 0; + cursor:default; +} + +a:hover +{ + color: #40628a; + background: #ffffff; +} + +a.white, a.white:link, a.white:visited, a.white:active +{ + color: #40628a; + text-decoration: none; + background: #ffffff; + border: 1px solid #161616; + padding: 1px 4px 1px 4px; + margin: 0 2px 0 0; + cursor:default; +} + +a.white:hover +{ + color: #ffffff; + background: #40628a; +} + +.linkOn, a.linkOn:link, a.linkOn:visited, a.linkOn:active, a.linkOn:hover +{ + color: #ffffff; + background: #2f943c; + border-color: #24722e; +} + +.linkOff, a.linkOff:link, a.linkOff:visited, a.linkOff:active, a.linkOff:hover +{ + color: #ffffff; + background: #999999; + border-color: #666666; +} + +a.icon, .linkOn.icon, .linkOff.icon +{ + position: relative; + padding: 1px 4px 2px 20px; +} + +a.icon img, .linkOn.icon img +{ + position: absolute; + top: 0; + left: 0; + width: 18px; + height: 18px; +} +ul +{ + padding: 4px 0 0 10px; + margin: 0; + list-style-type: none; +} + +li +{ + padding: 0 0 2px 0; +} + +img, a img +{ + border-style:none; +} + +h1, h2, h3, h4, h5, h6 +{ + margin: 0; + padding: 16px 0 8px 0; + color: #517087; +} + +h1 +{ + font-size: 15px; +} + +h2 +{ + font-size: 14px; +} + +h3 +{ + font-size: 13px; +} + +h4 +{ + font-size: 12px; +} + +.uiWrapper +{ + + width: 100%; + height: 100%; +} + +.uiTitle +{ + clear: both; + padding: 6px 8px 6px 8px; + border-bottom: 2px solid #161616; + background: #383838; + color: #98B0C3; + font-size: 16px; +} + +.uiTitle.icon +{ + padding: 6px 8px 6px 42px; + background-position: 2px 50%; + background-repeat: no-repeat; +} + +.uiContent +{ + clear: both; + padding: 8px; + font-family: Verdana, Geneva, sans-serif; +} + +.good +{ + color: #00ff00; +} + +.average +{ + color: #d09000; +} + +.bad +{ + color: #ff0000; +} + +.highlight +{ + color: #8BA5C4; +} + +.dark +{ + color: #272727; +} + +.notice +{ + position: relative; + background: #E9C183; + color: #15345A; + font-size: 10px; + font-style: italic; + padding: 2px 4px 0 4px; + margin: 4px; +} + +.notice.icon +{ + padding: 2px 4px 0 20px; +} + +.notice img +{ + position: absolute; + top: 0; + left: 0; + width: 16px; + height: 16px; +} + +div.notice +{ + clear: both; +} + +.statusDisplay +{ + background: #000000; + color: #ffffff; + border: 1px solid #40628a; + padding: 4px; + margin: 3px 0; +} + +.statusLabel +{ + width: 138px; + float: left; + overflow: hidden; + color: #98B0C3; +} + +.statusValue +{ + float: left; +} + +.block +{ + padding: 8px; + margin: 10px 4px 4px 4px; + border: 1px solid #40628a; + background-color: #202020; +} + +.block h3 +{ + padding: 0; +} + +.progressBar +{ + width: 240px; + height: 14px; + border: 1px solid #666666; + float: left; + margin: 0 5px; + overflow: hidden; +} + +.progressFill +{ + width: 100%; + height: 100%; + background: #40628a; + overflow: hidden; +} + +.progressFill.good +{ + color: #ffffff; + background: #00ff00; +} + +.progressFill.average +{ + color: #ffffff; + background: #d09000; +} + +.progressFill.bad +{ + color: #ffffff; + background: #ff0000; +} + +.progressFill.highlight +{ + color: #ffffff; + background: #8BA5C4; +} + +.clearBoth +{ + clear: both; +} + +.clearLeft +{ + clear: left; +} + +.clearRight +{ + clear: right; +} + +.line +{ + width: 100%; + clear: both; +} + + +.switch { + position: relative; + display: inline-block; + width: 50px; + height: 26px; +} + +.switch input {display:none;} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #383838; + transition: .4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 18px; + width: 18px; + left: 4px; + bottom: 4px; + background-color: #98B0C3; + transition: .4s; +} + +.slider.red:before { + background-color: #d6858b; +} + +.slider.locked:before { + content: url("padlock.png"); + background-color: #b4b4b4; +} + +input:checked + .slider { + background-color: #40628a; +} + +input:checked + .slider.red { + background-color: #a92621; +} + +input:checked + .slider.locked { + background-color: #707070; +} + +input:focus + .slider { + box-shadow: 0 0 1px #2196F3; +} + +input:focus + .slider.red { + box-shadow: 0 0 1px #f3212d; +} + +input:focus + .slider.locked { + box-shadow: 0 0 1px #979797; +} + +input:checked + .slider:before { + transform: translateX(24px); +} + +.switch span { + display: inline-block; + position: relative; + width: 60px; + margin-left: 60px; +} + +ul.sparse { + padding-bottom:20px; +} + +.sparse li { + margin-top: 2px; +} + +.slider.round { + border-radius: 34px; +} + +.slider.round:before { + border-radius: 50%; +} + +.severity { + margin:0px; + padding: 1px 8px 1px 8px; + border-radius: 25px; + border: 1px solid #161616; + background: #40628a; + color: #ffffff; +} + +.severity img { + display: inline-block; + vertical-align: middle; +} diff --git a/html/browser/scannernew.css b/html/browser/scannernew.css index 9e9f8ce1f4862..32d9f6888fb9e 100644 --- a/html/browser/scannernew.css +++ b/html/browser/scannernew.css @@ -1,37 +1,37 @@ -.dnaBlockNumber -{ - font-family: Fixed, monospace; - float: left; - color: #ffffff; - background: #363636; - width: 20px; - padding: -3px 0 -1px 0; - margin: 2px 2px 0 10px; - text-align: center; -} -.dnaBlock -{ - font-family: Fixed, monospace; - float: left; -} -img.selected -{ - border: 1px solid blue; -} -img.unselected -{ - border: 2px solid black; -} -div>table { - float: left; -} -td -{ - text-align: center; -} -a.clean -{ - background: none; - border: none; - marging: none; +.dnaBlockNumber +{ + font-family: Fixed, monospace; + float: left; + color: #ffffff; + background: #363636; + width: 20px; + padding: -3px 0 -1px 0; + margin: 2px 2px 0 10px; + text-align: center; +} +.dnaBlock +{ + font-family: Fixed, monospace; + float: left; +} +img.selected +{ + border: 1px solid blue; +} +img.unselected +{ + border: 2px solid black; +} +div>table { + float: left; +} +td +{ + text-align: center; +} +a.clean +{ + background: none; + border: none; + marging: none; } \ No newline at end of file diff --git a/html/changelog.css b/html/changelog.css index 2bfa3fa49558f..da32a5a557521 100644 --- a/html/changelog.css +++ b/html/changelog.css @@ -1,41 +1,41 @@ -.top{font-family:Tahoma,sans-serif;font-size:12px;} -h2{font-family:Tahoma,sans-serif;} -a img {border:none;} -.bgimages16 li { - padding:2px 10px 2px 30px; - background-position:6px center; - background-repeat:no-repeat; - border:1px solid #ddd; - border-left:4px solid #999; - margin-bottom:2px; -} -.bugfix {background-image:url(bug-minus.png)} -.wip {background-image:url(hard-hat-exclamation.png)} -.tweak {background-image:url(wrench-screwdriver.png)} -.soundadd {background-image:url(music-plus.png)} -.sounddel {background-image:url(music-minus.png)} -.rscdel {background-image:url(cross-circle.png)} -.rscadd {background-image:url(tick-circle.png)} -.imageadd {background-image:url(image-plus.png)} -.imagedel {background-image:url(image-minus.png)} -.spellcheck {background-image:url(spell-check.png)} -.experiment {background-image:url(burn-exclamation.png)} -.refactor {background-image:url(burn-exclamation.png)} -.code_imp {background-image:url(coding.png)} -.config {background-image:url(chrome-wrench.png)} -.admin {background-image:url(ban.png)} -.server {background-image:url(hard-hat-exclamation.png)} -.balance {background-image:url(scales.png)} -.sansserif {font-family:Tahoma,sans-serif;font-size:12px;} -.commit {margin-bottom:20px;font-size:100%;font-weight:normal;} -.changes {list-style:none;margin:5px 0;padding:0 0 0 25px;font-size:0.8em;} -.date {margin:10px 0;color:blue;border-bottom:2px solid #00f;width:60%;padding:2px 0;font-size:1em;font-weight:bold;} -.author {padding-left:10px;margin:0;font-weight:bold;font-size:0.9em;} -.drop {cursor:pointer;border:1px solid #999;display:inline;font-size:0.9em;padding:1px 20px 1px 5px;line-height:16px;} -.hidden {display:none;} -.indrop {margin:2px 0 0 0;clear:both;background:#fff;border:1px solid #ddd;padding:5px 10px;} -.indrop p {margin:0;font-size:0.8em;line-height:16px;margin:1px 0;} -.indrop img {margin-right:5px;vertical-align:middle;} -.closed {background:url(chevron-expand.png) right center no-repeat;} -.open {background:url(chevron.png) right center no-repeat;} -.lic {font-size:9px;} +.top{font-family:Tahoma,sans-serif;font-size:12px;} +h2{font-family:Tahoma,sans-serif;} +a img {border:none;} +.bgimages16 li { + padding:2px 10px 2px 30px; + background-position:6px center; + background-repeat:no-repeat; + border:1px solid #ddd; + border-left:4px solid #999; + margin-bottom:2px; +} +.bugfix {background-image:url(bug-minus.png)} +.wip {background-image:url(hard-hat-exclamation.png)} +.tweak {background-image:url(wrench-screwdriver.png)} +.soundadd {background-image:url(music-plus.png)} +.sounddel {background-image:url(music-minus.png)} +.rscdel {background-image:url(cross-circle.png)} +.rscadd {background-image:url(tick-circle.png)} +.imageadd {background-image:url(image-plus.png)} +.imagedel {background-image:url(image-minus.png)} +.spellcheck {background-image:url(spell-check.png)} +.experiment {background-image:url(burn-exclamation.png)} +.refactor {background-image:url(burn-exclamation.png)} +.code_imp {background-image:url(coding.png)} +.config {background-image:url(chrome-wrench.png)} +.admin {background-image:url(ban.png)} +.server {background-image:url(hard-hat-exclamation.png)} +.balance {background-image:url(scales.png)} +.sansserif {font-family:Tahoma,sans-serif;font-size:12px;} +.commit {margin-bottom:20px;font-size:100%;font-weight:normal;} +.changes {list-style:none;margin:5px 0;padding:0 0 0 25px;font-size:0.8em;} +.date {margin:10px 0;color:blue;border-bottom:2px solid #00f;width:60%;padding:2px 0;font-size:1em;font-weight:bold;} +.author {padding-left:10px;margin:0;font-weight:bold;font-size:0.9em;} +.drop {cursor:pointer;border:1px solid #999;display:inline;font-size:0.9em;padding:1px 20px 1px 5px;line-height:16px;} +.hidden {display:none;} +.indrop {margin:2px 0 0 0;clear:both;background:#fff;border:1px solid #ddd;padding:5px 10px;} +.indrop p {margin:0;font-size:0.8em;line-height:16px;margin:1px 0;} +.indrop img {margin-right:5px;vertical-align:middle;} +.closed {background:url(chevron-expand.png) right center no-repeat;} +.open {background:url(chevron.png) right center no-repeat;} +.lic {font-size:9px;} diff --git a/html/changelog.html b/html/changelog.html index c96d6c59bdb8e..70d532ce05c58 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -36,8 +36,8 @@
    Thanks to: /tg/Station 13, Baystation 12, /vg/station, NTstation, CDK Station devs, FacepunchStation, GoonStation devs, the original SpaceStation developers and Invisty for the title image.
    Also a thanks to anybody who has contributed who is not listed here :( Ask to be added here on the forums/Discord.
    @@ -56,921 +56,1016 @@ -->
    -

    05 November 2020

    -

    Krysonism updated:

    +

    30 October 2021

    +

    TheChaser212 updated:

      -
    • fixed a gulag stacking machine exploit that would let you farm points with minimal or no ores mined.
    • +
    • Backup objectives shouldn't disappear anymore
    • +
    • Cleaned up cryopod objective handling
    -

    NotRanged, Gandalf2k15 updated:

    + +

    29 October 2021

    +

    Ivniinvi updated:

      -
    • Changed explosion sound code to be more noticeable and terrifying throughout the station during siginificant explosive events.
    • +
    • Unintentional spins and flips no longer cause confusion.
    -

    PowerfulBacon updated:

    +

    TheChaser212 updated:

      -
    • Removed the old autolathe UI
    • -
    • TGUI autolathe UI
    • -
    • Multiple users can browse autolathe UI without seeing the same tabs.
    • -
    • You can now eject materials from an autolathe
    • -
    • You can now queue items in an autolathe
    • -
    • You can now toggle continuous fabrication mode on an autolathe queue, or an item in the autolathe queue meaning it will build repeatedly until the autolathe runs out of materials.
    • -
    • Trigger build wire on autolathes
    • -
    • Autolathe queue
    • -
    • Autolathe ejection direction.
    • +
    • Cyborg mesons work similarly to human mesons by showing dark areas
    • +
    +

    rkvothe14 updated:

    +
      +
    • Fixed a minor typo in Show/Hide GhostLaws.
    -

    04 November 2020

    -

    PowerfulBacon updated:

    +

    28 October 2021

    +

    Ivniinvi updated:

      -
    • Changed the view width to 17x15
    • -
    • Mirage borders sometimes not working properly
    • -
    • Proper zooming out procs.
    • +
    • Toxins will no longer bomb the MetaStation Exploration Shuttle at roundstart.
    -

    That0nePerson updated:

    +

    Phil Smith updated:

      -
    • fixes icon issue with "The Mad's labcoat"
    • +
    • A small commemoration to our former LRP server, golden, is now on the captain's laser gun.
    -

    qwertyquerty updated:

    +

    Pirill updated:

      -
    • Made auto viewport fit default
    • +
    • Fixes fairygrass shuttle flight runtime
    - -

    03 November 2020

    -

    Archanial updated:

    +

    francinum updated:

      -
    • Reply pop-up in stealth mode will no longer reveal your orinigal ckey.
    • +
    • Brig timer presets and max durations can be modified in the config
    • +
    • The economy flag hasn't done anything for over a year, and has been removed.
    -

    PowerfulBacon updated:

    +

    jupyterkat updated:

      -
    • Syndicate encryption key is restricted on incursion gamemode
    • -
    • Syndicate mega bundle is no longer restricted on incursion gamemode.
    • +
    • body only records are now clearer
    • +
    • body only records persist after cloning
    -

    Victor239 updated:

    + +

    27 October 2021

    +

    FriendlyContractor updated:

      -
    • Small tweaks to brig phys locker and loadout.
    • +
    • Ash heretics immune to being set on fire
    -

    ivanmixo updated:

    +

    Kapu1178 updated:

      -
    • Airlocks to bridge and other high security areas such as the heads' offices, EVA, teleporter and gateway now start reinforced with plasteel.
    • +
    • IPC blood trails are black now
    - -

    02 November 2020

    -

    LastCrusader105 updated:

    +

    KubeRoot updated:

      -
    • Moved the engineering shower heads outside of the blast doors
    • +
    • Boxstation's turbine and toxins burn chamber airlocks will now pressurise and depressurise correctly, no longer softlocking you.
    -

    Moccha-Bee updated:

    +

    MNarath1 updated:

      -
    • Contaminated objects will now glow bright green until cleaned, remember to quarantine rouge free golems.
    • -
    • Buffed rad goggles in general, the text lasts longer, is brighter, and will show more then twice as far away
    • -
    • Fixed the text from radiation goggles not showing above mobs
    • +
    • small misstype from tesla code

    PowerfulBacon updated:

      -
    • Felinids can laugh
    • +
    • Syndicate listening outpost ruin part.
    -

    eeSPee updated:

    +

    Syrox25 updated:

      -
    • Limbsnakes - new changeling abilty
    • +
    • Adds Paper Cup recipe to the Misc tab
    - -

    01 November 2020

    -

    francinum updated:

    +

    The-Moon-Itself updated:

      -
    • No more instagib glass tables.
    • +
    • More list related WireMod components.
    • +
    • The index component now has more features.
    • +
    • The component printer now has a list component category
    -

    r1ks-iwnl updated:

    +

    TheChaser212 updated:

      -
    • Paramedics now have EVA access
    • +
    • Syndicate implants are now hidden from health scans
    • +
    • Added inhand icons for the energy saw
    -

    30 October 2020

    -

    ike709 updated:

    +

    26 October 2021

    +

    Kapu1178 updated:

      -
    • Circuits can no longer be exploited to make super bombs.
    • +
    • Kills the "Synth" species
    -

    super12pl updated:

    +

    tralezab, AnturK updated:

      -
    • Adds blood filter to lavaland syndicate base
    • +
    • curators can now print paintings
    • +
    • persistent paintings
    • +
    • AIs can now pick paintings as their screens
    • +
    • tgui canvases
    -

    29 October 2020

    -

    Crossedfall updated:

    +

    25 October 2021

    +

    DeltaFire15 updated:

      -
    • Kilo is back in rotation
    • -
    • Added Gamepad bindings
    • +
    • Cyborg B.o.r.i.s. installation now checks for if the chest has a cell, just like how it does with MMIs.
    -

    Dingo-Dongler updated:

    +

    Ivniinvi updated:

      -
    • new phasic scanner sprite.
    • +
    • Emitters that don't use power won't warn about powernets.
    -

    PowerfulBacon updated:

    +

    Ivniinvi, Denton, ArcaneMusic, XRandomXManX updated:

      -
    • Adds a 5-minute cooldown to non antagonist related ghost roles if the client has more than 2 deaths or has committed suicide.
    • -
    • Replaces spaces in hilbert's hotel with tabs
    • +
    • The Decal Painter is now available at protolathes and autolathes for you to paint decals.
    -

    ike709 updated:

    +

    Kapu1178 updated:

      -
    • Bee downstreams can now decide to automatically block you from joining if you're banned from bee.
    • +
    • Cleans up species outfit code.
    -

    thelaughingbomb updated:

    +

    KubeRoot updated:

      -
    • borg cutters work now and cant weld.
    • +
    • Wizarditis now functions correctly at high stages.
    • +
    • Resetting the thunderdome no longer breaks it.
    • +
    • The viral extrapolator can no longer be used at a distance.
    - -

    28 October 2020

    -

    PowerfulBacon updated:

    -
      -
    • Syndicate medical defib padels can now be equipped
    • -
    • Tweaked lootbox TC allocation algorithm and added in funny roll 1 message
    • -
    • Runtime on TGUI failing to load.
    • -
    -

    park66665 updated:

    +

    Phil Smith updated:

      -
    • fusion is no longer caused by hotspot react()
    • -
    • fire probably became a tiny tiny bit faster
    • +
    • When offering a renaming potion to someone it now no longer says that you are giving the potion to yourself but it now properly gives the name of the person you are handing it to.
    - -

    27 October 2020

    -

    Moccha-Bee updated:

    +

    Pirill updated:

      -
    • Added several new donk pocket types, and boxes, including sprites for each of course. Spicy-Pocket,Teriyaki-Pocket, Pizza-Pocket,Honk-Pocket,Gondola-Pocket and Berry-Pocket. This includes re-organizing them from the OTHER section in snacks_pastry.dm to a donk pocket section. Thanks to Farquaar for the box icons and some of the code! As well as latots for the donk pocket icons.
    • -
    • Added a Donk Pocket Variety crate, for 2000 credits, which includes 3 randomly selected donk pocket box types, excluding Gondola-Pocket.
    • -
    • Added a recipe for each new Donk Pocket type.
    • -
    • Added the new Donk Pocket types to the maint loot table.
    • -
    • Donk Pocket loot spawner object, credit to TheVekter for that, which was then added into the kitchens of all the main maps.
    • -
    • All Donk Pockets now follow the same naming scheme of X-Pocket.
    • -
    • Added craftable Donk Pocket boxes.
    • +
    • New sprites and inhands for radiation and combat medkits, tweaked sprites for the biohazard toxin medkit
    • +
    • Makes regular prescription glasses printable at a Medical Protolathe
    • +
    • Adds craftable prescription versions of medical, security and diagnostic HUDglasses, science goggles and meson scanners
    • +
    • Makes the Blood Cult Zealot's Blindfold correct nearsightedness when in use
    • +
    • Resprites the original prescription medical HUDglasses and adds equivalent sprites for the rest
    -

    St0rmC4st3r updated:

    +

    The-Moon-Itself updated:

      -
    • Resonators now detonate all their sonic blasts on use.
    • -
    • Plasma cutters consume more plasma now.
    • +
    • The chameleon projector now projects objects with overlays, such as computers and holosigns, correctly.
    -

    That0nePerson updated:

    +

    TheChaser212 updated:

      -
    • Added plasma cutter module for mining cyborgs
    • +
    • Added some useful items to the debug outfit
    -

    eeSPee updated:

    +

    jupyterkat updated:

      -
    • the cost and resistances of ling armor; it is now a loud anti projectile defense.
    • +
    • fixed layer manifold runtime
    -

    qwertyquerty updated:

    +

    zeskorion updated:

      -
    • Coder Socks
    • +
    • slime pylons no longer kill toxinlovers/slimepeople
    -

    26 October 2020

    -

    Dennok updated:

    +

    23 October 2021

    +

    Archanial updated:

      -
    • Now you can set transit fly direction for custom shuttle
    • +
    • fixed incursion implant not exploding (thanks pricklytomato!)
    -

    MNarath1 updated:

    +

    Crossedfall updated:

      -
    • Makes locker doors animated
    • +
    • Removed the extra light switch from Box Station's research lab
    • +
    • Re-added the access requirement to Pubby's RD office
    -

    qwertyquerty updated:

    +

    Skoglol updated:

      -
    • Ambience sometimes just not playing fixed
    • -
    • Putting items in plants by just clicking the plant
    • +
    • Added a few new buildmode modes. Outfit, to quickly apply or remove outfits. Delete, to quickly delete any atoms. Slightly overhauled the copy proc used here and in supply pods, now compatible with most mobs.
    -

    25 October 2020

    -

    BeloneX updated:

    +

    22 October 2021

    +

    Autisem updated:

      -
    • Megafauna once again gibs immortal miners
    • +
    • super soldiers get hair
    -

    That0nePerson updated:

    +

    Ivniinvi, timothymtorres, Azarak, mickyan, updated:

      -
    • Added an emag act to the mech-mounted disabler, emag to make it lethal
    • -
    • Moved mech weapons from mech fabricator to sec protolathe
    • +
    • Fixed pAI loudness booster to work when not in holoform
    • +
    • Fixed garbage collection for songs, making the game slightly faster
    • +
    • You may now change the sound of certain instruments with a selection of appropriate variations, similarly to the piano synth
    • +
    • Fixed accordion not working
    • +
    • Adds a hidden fun instrument
    -

    eeSPee updated:

    +

    Pirill, Naevii, nianjiilical, Useroth updated:

      -
    • firelocks open 60% faster.
    • -
    • halved the time it takes to open a firelock by crowbar.
    • -
    • reduced the time it takes for a firelock to close automatically
    • -
    • You can now pry open the firelocks with your bare hand.
    • +
    • Adds cherry bulbs and fairygrass as new mutations of cherries and grass
    • +
    • Adds pink, yellow, green, blue and purple bioluminescence traits to cherry bulbs, holymelons, omega weed, fairygrass and moonflowers
    • +
    • Adds colored fairygrass tiles based on their bioluminescence trait
    • +
    • New grass and fairygrass sprites
    -

    ritea updated:

    +

    Pirill, kit-katz updated:

      -
    • Plating no longer disappears when you build walls with spells!
    • +
    • Adds three new pAI holochassis: carp, bee and phantom!
    • +
    • Adds inhands and head-worn sprites for all other pAI chassis that were missing them

    zeskorion updated:

      -
    • sentient gorillas can now break stuff whilst on harm intent, but cant pick stuff up and such
    • -
    • hyperperspiration thresholds lowered, new threshold added.
    • -
    • ducatopod now synthesizes lube
    • +
    • fixes disease names
    -

    24 October 2020

    -

    Dennok updated:

    +

    21 October 2021

    +

    Archanial updated:

      -
    • Custom ship navigation computer now get offsets and view range depends on ship size.
    • +
    • fixed necroseed runtime
    • +
    • symptoms on death is now triggered by disease itself using signals
    • +
    • action speed modifier refactored into modifier system, similar to movespeed.
    -

    eeSPee updated:

    +

    Dingo-Dongler updated:

      -
    • stam imunity to flesh path ghouls
    • -
    • stun+stam imunity to mute ghouls
    • +
    • Clipboards and notice boards are now updated to TGUI, with clipboards having much better functionality.
    -

    r1ks-iwnl updated:

    +

    Hardly updated:

      -
    • Medical cyborgs have the new blood filter.
    • +
    • Shuttle seat is now craftable using two sheets of iron
    - -

    23 October 2020

    -

    Archanial updated:

    +

    Kapu1178 updated:

      -
    • misc_food no longer shows up twice.
    • -
    • SM sliver appears on the SM again.
    • -
    • Lipid extractor has slightly different recipe.
    • -
    • Spawned lipid extractor will now correctly deconstruct.
    • +
    • Cleaned up IPC code in general.
    • +
    • VV health adjustment works on synthetics
    • +
    • IPCs now actually have blood, oil, and it leaves decals when they are hurt
    • +
    • IPCs are now actually immune to toxin damage.
    • +
    • IPCs wont process reagents they weren't supposed to process.
    • +
    • Mild refactor to species metabolisms.
    -

    Fyodor Litke updated:

    +

    Pirill updated:

      -
    • fixed tags for Chaplain's adept hood
    • +
    • Adds printed toolbox right handed in-hand sprites
    -

    Moccha-Bee updated:

    +

    Ryll-Ryll, jupyterkat, ninjanomnom updated:

      -
    • Added pod walls and windows in the mining shuttles
    • +
    • Dogs now have all-new AI! Go throw a grenade at Ian and see what happens!
    • +
    • Added AI datum support for complex JPS pathing
    • +
    • Implements JPS Pathfinding
    • +
    • janky monkey ais
    • +
    • Monkeys are once again capable of using guns, take back your freedom!
    • +
    • Monkey ai is now actually able to make use of guns instead of just player controlled monkeys.
    • +
    • Monkey ai will prioritize guns once they learn of what guns can do.
    • +
    • Monkey ai now understands the ancient art of throwing.
    • +
    • Monkey ai will use random objects on each other in their surroundings and in their hands.
    • +
    • Monkey ai will occasionally "gift" people things.
    • +
    • Monkey ai consumes food once in a while according to their desire.
    -

    eeSPee updated:

    +

    TheChaser212 updated:

      -
    • Eldritch toys because you want to get beaten up by security
    • +
    • IPCs use charge at the same rate they used to
    • +
    • Ethereals can't queue up multiple chargings
    • +
    • Ethereals don't need to wait if they can't charge
    • +
    • APCs can be drained to a quarter charge
    -

    qwertyquerty updated:

    +

    francinum updated:

      -
    • Added a single storage slot to potted plants
    • +
    • Exosuit fabricators no longer automatically link to the default silo network on build.
    -

    super12pl updated:

    +

    jupyterkat updated:

      -
    • Adds defib, RPED and freezer board to syndicate lavaland base
    • +
    • fixed ruin turfs get vented sometimes
    - -

    22 October 2020

    -

    Naevii updated:

    +

    silicons, Ivniinvi updated:

      -
    • Captain cloak has a new sprite!
    • -
    • QM cloak has a new sprite!
    • +
    • Baystation instruments are here!
    • +
    • Existing instruments have been rolled into the new unified instruments system.
    • +
    • A sound subsystem has been added, SSsounds. Use it for persistent channel management.
    -

    Phil Smith updated:

    +

    zeskorion updated:

      -
    • Mansus grasp is now green
    • +
    • random diseases now have better random names
    -

    21 October 2020

    -

    Archanial updated:

    +

    20 October 2021

    +

    tiramisuapimancer updated:

      -
    • Held mobs no longer lose their sprites if they were resting.
    • +
    • nuclear particles no longer deal direct toxin damage, but do more regular irradiating
    -

    20 October 2020

    -

    BeloneX updated:

    +

    19 October 2021

    +

    Ivniinvi updated:

      -
    • The Syndicate have purchased new encryption equipment, Central Command can no longer intercept their Communications.
    • +
    • Added ratvarsmall and narsiesmaller span classes.
    -

    LastCrusader105 updated:

    +

    francinum updated:

      -
    • Showers to Boxstation
    • +
    • A few unused globals were cleaned up.
    -

    Victor239 updated:

    + +

    18 October 2021

    +

    TheChaser212 updated:

      -
    • You can fireman carry from neck or kill grabs again.
    • -
    • You can't piggyback to get out of neck or kill grabs.
    • +
    • Electrical species use power stored in their stomachs rather than normal nutrition
    • +
    • Ethereals recharge continuously and lose nutrition in the same ways as other species
    • +
    • EMPing electrical species will drain their charge
    • +
    • IPC powercords and batteries work in ethereals
    • +
    • Replaced old ethereal charge system
    • +
    • Removed the ability to insert brains without surgery
    • +
    • IPCs use a battery icon instead of hunger
    • +
    • Fixed ethereals not gaining charge from shocks
    • +
    • Fixed some problems with the biometallic replication symptom
    • +
    • Lots of other small things
    -

    eeSPee updated:

    +

    lordScrubling, Ghilker, TetraK1, Dennok, Donkie updated:

      -
    • RSF not working properly
    • +
    • Temperature pump atmos device from tg
    • +
    • Pressure valve from atmos device tg
    • +
    • Temperature gate atmos device from tg
    • +
    • Passive gate pressure limit upped to 100 atmospheres
    -

    19 October 2020

    -

    Phil Smith updated:

    +

    15 October 2021

    +

    DrMacCool updated:

      -
    • changed the color of the blood bro hud icon
    • +
    • Adds 18 new hairstyles/beards requested by the community.
    -

    Victor239 updated:

    + +

    11 October 2021

    +

    Archanial updated:

    +
      +
    • Removed hangover landmarks
    • +
    • Hangover now dynamically places its spawns around the station
    • +
    • Fixed random_safe_station_turf sometimes returning null even if it had viable turf
    • +
    +

    Dejaku51 updated:

      -
    • Added security gas masks to SecDrobe
    • -
    • HOS gun is full-auto again.
    • +
    • Fixed camera name and network in Incenerator on Meta and Box
    -

    Xoxeyos updated:

    +

    Ivniinvi updated:

      -
    • servent is now servant.
    • +
    • Traitor panel will now show if the person in question is banned from a specific antagonist.
    -

    eeSPee updated:

    +

    TheGreyDiamond updated:

      -
    • smartfridges will automatically load items off conveyor belts, or items thrown at them.
    • +
    • fixed zero padding mistake
    -

    18 October 2020

    -

    Dennok updated:

    +

    10 October 2021

    +

    KubeRoot updated:

      -
    • Custom shuttle delete starting port after takeoff
    • +
    • The exploration detonator now correctly checks if you're on the station Z level for its safety. You can also no longer detonate explosives across Z levels.
    • +
    • Artifacts from supercruise often didn't work, they should be much more interesting now.
    -

    Phil Smith updated:

    + +

    09 October 2021

    +

    Archanial updated:

      -
    • IPCs no longer take brute and burn after death.
    • +
    • fixed hud runtime
    -

    Victor239 updated:

    + +

    06 October 2021

    +

    KubeRoot, EdgeLordExe updated:

      -
    • DRAGnet teleport no longer has random variance.
    • -
    • You now must be both in an aggro grab and grab intent to fireman carry or piggyback.
    • +
    • Radios now have code support for anonymization
    • +
    • The intercoms in chapel confessionals will now hide your name
    -

    r1ks-iwnl updated:

    +

    Pirill updated:

      -
    • Adds Airlock Charge to traitor uplinks
    • +
    • Fixed a few typos related to exploration, wall building, wraith spectacles and Battle Royale
    -

    super12pl updated:

    +

    rkvothe14 updated:

      -
    • Removed broken absorb changeling objective
    • +
    • fixes Nightmare's lighteater so they can destroy light sources again.
    -

    17 October 2020

    -

    Cenrus updated:

    +

    05 October 2021

    +

    DrMacCool updated:

      -
    • Mech occupants can now cycle airlocks
    • +
    • Adds the 'NOSOCKS' trait.
    • +
    • Species with NOSOCKS can't wear socks.
    • +
    • Squids now have the 'NOSOCKS' trait.
    -

    Victor239 updated:

    +

    Ivniinvi updated:

      -
    • Standardised the contraband locker on all stations.
    • +
    • There is now a brain trauma that allows ghosts to issue a movement command once every 12 seconds.
    • +
    • Deadchat_control is now a smite option.
    -

    eeSPee updated:

    + +

    04 October 2021

    +

    Archanial updated:

      -
    • Razor from service cyborg
    • -
    • Tray from service cyborg
    • -
    • service beaker aparatus replaced with a grasper aparatus, that can also carry food items, cigs, etc
    • -
    • Enzime bottle from service cyborg
    • -
    • cyborg shaker can synthesize its own enzime
    • -
    • cookie synthesizer from service cyborg
    • -
    • emagged RSF can dispense plasma cigs
    • -
    • Jungle Fever: Added advanced huds to all monkeys and gorillas.
    • -
    • Jungle Fever: 4% chance to turn into a gorilla instead of regular momke
    • -
    • Jungle Fever Transformation always fullheals monkeys.
    • +
    • Removed deathrattle station trait
    -

    park66665 updated:

    +

    Kapu1178 updated:

      -
    • Fusion no longer dies to 2.7K. Instead, the fusion just stops, waiting eagerly for a fate other than 2.7K.
    • +
    • Sprite sheets! A new system to allow for better species in the future.
    -

    super12pl updated:

    +

    KubeRoot updated:

      -
    • Paramedics now have medical doctor's role-specific traitor items
    • +
    • Fixes an issue that would sometimes lead to increased view range while not ghosted
    • +
    • View range is now actually fixed, sorry for the trouble.
    -

    zeskorion updated:

    + +

    03 October 2021

    +

    DrMacCool updated:

      -
    • readds metabolic boost viro symptom
    • +
    • Added exploration envirosuit+helmet.
    • +
    • Plasmamen on the exploration crew now spawn in said clothes.
    - -

    14 October 2020

    -

    Cenrus updated:

    +

    KubeRoot updated:

      -
    • The NT Salvage Ship has been adapted for fastmos.
    • +
    • Newly created chat tabs will now show important messages. If you're using custom-created chat tabs, you'll need to delete and recreate them to be able to see them. This fixes being unable to see if somebody is overdosing when doing chemical scans with the health analyzer.
    -

    amidoingitright updated:

    +

    St0rmC4st3r updated:

      -
    • magic immunity to chaplain armor
    • +
    • Shuttles will no longer refuse to lift off due to counting all other shuttle's weight as their own.
    -

    13 October 2020

    -

    TheChaser212 updated:

    +

    02 October 2021

    +

    Archanial updated:

      -
    • Crew monitors and pinpointers now work with multi-z maps
    • +
    • Station trait command report is now generated independly, that means it will be printed even if intercept isn't enabled.
    • +
    • fixed lavaland turret control runtime
    -

    yorii updated:

    + +

    01 October 2021

    +

    AnCopper updated:

      -
    • tiny renaming of a runtime error datum
    • +
    • You can no longer drag blobbernauts.
    - -

    12 October 2020

    -

    Autisem updated:

    +

    Archanial updated:

      -
    • Felinds are supposed to like getting thrown on tables
    • +
    • fixed runtime related to missing client in mentorhelp
    -

    BeloneX updated:

    +

    Crossedfall updated:

      -
    • Added the corporate security uniform to the secdrobe, you can finally have your black security clothes.
    • -
    • Added a captains jacket to the captains locker.
    • +
    • Resolves a bad index runtime caused by the stat panel's verb caching
    -

    PowerfulBacon updated:

    +

    Ivniinvi updated:

      -
    • Atmosbot
    • +
    • Fixed artifact supercruise message.
    • +
    • Alkali Perspiration now correctly updates its severity.
    • +
    • The debug uplinks now actually use the debug toggle.
    -

    Victor239 updated:

    +

    KubeRoot updated:

      -
    • Most armoured suits and helmets' thick reinforced materials now prevent syringes, parapens and hypos.
    • -
    • Shotguns have new, bigger sprites for inhands and back slot.
    • -
    • Riot shotguns have a slightly slower fire rate, and combat shotguns are now faster.
    • -
    • Shotgun lethal ammo is slightly weaker, moreso against armoured targets.
    • +
    • Space hotel now has a secondary solar control console that can reach the north-east solar array.
    • +
    • Space hotel has had some missing and miscolored cables tidied up.
    -

    eeSPee updated:

    +

    checkraisefold updated:

      -
    • Deputy access upgrades in warden's and HoS's locker.
    • +
    • Changed flavor text to text in Notes for VIPs from the VIP extraction exploration mission.
    - -

    11 October 2020

    -

    Dennok updated:

    +

    fighterslam updated:

      -
    • Custom shuttle get name that you give it on construction.
    • +
    • Fixed DeltaStation holodeck.
    -

    MNarath1 updated:

    +

    lordScrubling updated:

      -
    • fixes circuit input size so you can put longer circuits again
    • +
    • throwing creatures doesn't make blood trails anymore
    -

    SomeAngryMiner updated:

    +

    qwertyquerty updated:

      -
    • New supermatter sprites!
    • +
    • Report round id as int on ?status
    -

    St0rmC4st3r updated:

    + +

    30 September 2021

    +

    Ivniinvi updated:

      -
    • The lavaland outpost construction project has been postponed due to misuse of funding by the previous research director.
    • +
    • Roundstart tips are up-to-date.
    -

    Zesko, thatguythere03 updated:

    +

    KubeRoot updated:

      -
    • cluwne rune changes
    • -
    • new cluwne rune sprite
    • +
    • The "Say" window no longer has input lag when opening it with the hotkey.
    • +
    • The "Say" window now has input lag when closing it with enter.
    -

    qwertyquerty updated:

    + +

    29 September 2021

    +

    AnCopper updated:

      -
    • 4 random runtimes, including gibs not always spawning on human death
    • +
    • The projector can not be researched.
    -

    10 October 2020

    -

    Phil Smith updated:

    +

    27 September 2021

    +

    Archanial updated:

      -
    • Hyposprays can now have their dosages changed and can also be emptied
    • -
    • Adds hypospray noise from TGMC
    • +
    • Fixed join via pod trait sending people to hyperspace
    -

    TheChaser212 updated:

    +

    ike709 updated:

      -
    • advanced injectors no longer get an extra 'expended' added for each mutation
    • -
    • only filled activators will give chromosomes
    • -
    • chromosomes will always go into the dna console if possible
    • -
    • telekinesis works on dna consoles
    • -
    • fixed some genetics typos
    • +
    • 514.1568 is now required for playing and compiling
    -

    zeskorion updated:

    + +

    26 September 2021

    +

    KubeRoot updated:

      -
    • syringe stuff
    • +
    • The metastation external airlock in holodeck maintenance now sets up correctly roundstart
    -

    07 October 2020

    -

    Chessus updated:

    +

    25 September 2021

    +

    Raven-Industries updated:

      -
    • Filter Blood Surgery
    • -
    • Adds item Blood filter
    • -
    • Added Blood filter to maps in surgery area and Med surgery duffle bag and sec surgery duffle bag. Removed from sec deptuty bag from original pr.
    • -
    • Added Blood filter to tool debug item
    • -
    • Can be created in prolathe. Removed from autolathe inline with no surgical tools in autolathes
    • -
    • The blood filter can now be put in medical belts, medical aid kits and backpacks
    • -
    • The surgery is automatically repeatable similar to tend wounds
    • +
    • increased book title limit from 20 chars to 50
    -

    06 October 2020

    -

    ATHATH, ArcaneDefence updated:

    +

    23 September 2021

    +

    Autisem updated:

      -
    • Moth plushie, found in arcade machines as a reward. Commiting suicide with it is ill advised.
    • +
    • Mines explode once instead of too much
    • +
    +

    heepox updated:

    +
      +
    • Adds a ClothesMate Refill canister to cargo for 800 credits.
    -

    04 October 2020

    -

    Archanial updated:

    +

    19 September 2021

    +

    Therosass updated:

      -
    • You can now paste longer songs again.
    • +
    • Warping grey runes no longer create invisible slimes.
    -

    Phil Smith updated:

    + +

    17 September 2021

    +

    KubeRoot, Mothblocks updated:

      -
    • New incursion icon
    • -
    • Added a new hud icon for incursion
    • +
    • Tooltips in tgui are now very fast, even with a lot of them on one interface.
    -

    PowerfulBacon updated:

    + +

    16 September 2021

    +

    ike709 updated:

      -
    • Players who don't want to be a heretic will no longer lose antag rep if selected as a heretic due to low pop
    • -
    • Abusable circuit components have been given a limit to how many can be out in a circuit.
    • -
    • removed FASTDMM_PROP from advanced airlock controllers.
    • +
    • The DB subsystem will now always disconnect properly.
    -

    Time-Green, Tlaltecuhtli, arcanemagician, TMTIME updated:

    + +

    15 September 2021

    +

    Ivniinvi updated:

      -
    • Grinding machine
    • -
    • Message when trying to rotate anchored plumbing machines
    • -
    • Plumbing pipes nolonger appear disconnected
    • -
    • Reactions that leave no chemicals don't break the reaction chamber now
    • +
    • Battle Royale requires +ADMIN instead of +FUN after the round ends.
    -

    park66665 updated:

    +

    Kapu1178 updated:

      -
    • supermatter has a power-ceiling of 1 million
    • +
    • Humans now display a chat bubble when typing, as an effort to move us closer to Baystation
    • +
    • Typing Indicators are now on the right instead of the left, to not be covered by medhuds.
    • +
    • Say hotkey is probably more responsive
    -

    qwertyquerty updated:

    +

    PowerfulBacon updated:

      -
    • Refactors ambient sounds completely to be less bad code wise and better IC and immersion wise
    • +
    • Resolves a crash exploit related to z-levels and supercruise.
    • +
    • Thrown humans can now be caught.
    -

    zeskorion updated:

    +

    TheFakeElon updated:

      -
    • piercing syringes now inject past thick clothing when not shot from a syringe gun as well
    • -
    • syringe guns no longer instantly inject their reagents, instead injecting them over time
    • -
    • syringes can be embedded on harm intent, also injecting reagents over time, but at a slower rate
    • -
    • explosive chem mixes no longer purge chems if an explosion is not triggered
    • +
    • improves fail2topic regex
    -

    03 October 2020

    -

    Moccha-Bee updated:

    +

    14 September 2021

    +

    Pirill updated:

      -
    • nerfed insta teleport from pandora.
    • +
    • New sprites for geraniums, lilies and rainbow flowers
    • +
    • Forget-me-nots as a new flower type
    • +
    • Craftable flower crowns from rainbow flowers, sunflowers, poppies and lilies
    • +
    • Two new botany cargo bounties for forget-me-nots and rainbow flower crowns
    • +
    • Fixes rainbow flower reagent code
    -

    Victor239 updated:

    +

    PowerfulBacon updated:

      -
    • Adds 3 new chameleon items to the traitor uplink: Chameleon Bangproof Headset, Chameleon Flashproof Glasses and Chameleon Combat Gloves.
    • -
    • Chameleon plasmaman envirohelmet is no longer permanently flashproof.
    • +
    • All golems excluding bone golems are transsting immune.
    • +
    • Levelling up projectile spells (Fireball, spellcards, tesla spell, magic missile) makes the projectiles more powerful.
    • +
    • Upgrading repulse makes the effect stronger (larger throw distance, longer paralyze)
    • +
    • Altered the charlie station ruin outpost to add an ORM, KA, Autolathe and Ore Silo. Removed the exosuit fab having access to station mats. Added a bunch of materials around and a shuttle creator.
    • +
    • Traitor capsule shuttle gets a plasma refinery and an emergency pickaxe.
    • +
    • Trait induced blindness will no longer cause your screen to be blurry forever if you get blurred.
    -

    francinum updated:

    +

    lordScrubling updated:

    +
      +
    • Added hotkey to toggle walking/running
    • +
    • Ability to rebind locking movement hotkey
    • +
    +

    qwertyquerty, Merct updated:

      -
    • Dynamic is now continuous.
    • +
    • Soundtrack music shows in credits
    -

    02 October 2020

    -

    Sarchutar updated:

    +

    13 September 2021

    +

    Bokkiewokkie updated:

      -
    • Crew manifest available for cyborgs under "Robot Commands"
    • +
    • Fixed a security issue with the advanced proccall
    -

    park66665 updated:

    +

    PowerfulBacon updated:

      -
    • stim_ball reaction now properly consumes plasma
    • +
    • Custom shuttles and rooms can be made on asteriods.
    • +
    • Fixes another case of meteors moving invalidly.
    • +
    • Refactors the tesla to be less intensive on the server. (Slightly weakening its destructive capability)
    • +
    • The MC panel now shows tick uage and the tick limit.
    - -

    01 October 2020

    -

    EdgeLordExe updated:

    +

    Vexylius updated:

      -
    • hopefully fixes heretics :agony:
    • +
    • Janitorial toolset implant
    • +
    • Botanical toolset implant
    -

    TheChaser212 updated:

    +

    ike709 updated:

      -
    • Bee infestation honey threshold is actually 12 now
    • +
    • BYOND infinite loop detection is now documented.
    -

    30 September 2020

    +

    12 September 2021

    Archanial updated:

      -
    • Circuit boards are colored.
    • -
    • Every machine broken by previous pr should be working now.
    • +
    • removed static usage of typecache in get_area()

    PowerfulBacon updated:

      -
    • Hierophant relay no longer transmits the radio channels of people on Reebe, but will still recieve them.
    • -
    • Clockies can now be deconverted properly.
    • -
    • More than 1 of each weapon can now be summoned.
    • -
    • Clockwork marauders can now speak rat'varian
    • -
    • Clockwork marauders can now take damage from bullets
    • -
    • Spells will now consume vitality when they are meant to
    • -
    -

    TMTIME updated:

    -
      -
    • Clowns no longer harm themselves with toy dualsabers
    • +
    • Fixes meteors causing bugs in SSorbits.

    francinum updated:

      -
    • ss13_feedback can now be disabled with the LIMITED_FEEDBACK flag.
    • +
    • Mechs can now properly recalibrate their controls.
    -

    zeskorion updated:

    + +

    11 September 2021

    +

    francinum updated:

      -
    • mutation toxin is restricted again
    • +
    • You should NOT be granting this lightly.
    -

    29 September 2020

    -

    Archanial updated:

    +

    10 September 2021

    +

    AnCopper updated:

      -
    • Cloning works again.
    • +
    • ERT Commanders get an Omni Door remote.
    • +
    • added microwaves, donk pockets, and oxygen tank dispensers to exploration shuttles
    • +
    • the BSA is indestructible.
    -

    PerishedFraud updated:

    +

    AnturK, Ivniinvi, Inept, Coiax, AdipemDragon, YakumoChen, Sheits, tralezab updated:

      -
    • Makes mining station's outer airlocks not vent out the entire station if you go through them too fast
    • +
    • Aquarium and aquarium accessories. Also fish. Check out cargo to start.
    • +
    • Aquarium fish now reproduce.
    -

    Victor239 updated:

    +

    DatBoiTim updated:

      -
    • All Command roles now require 20h playtime in the relevant department, except HOP requires 10h Service. Warden and QM require 10h each.
    • +
    • Sleep and Drowsyness Immunity To Meth
    • +
    • Decreased Speed Buff from Meth
    • +
    • Increased Stamina Damage Reduction
    -

    archeoid updated:

    +

    Goshagosha updated:

      -
    • fixed non-functional passkeys for circuits
    • +
    • Added structure (plant) 'Strange plant' to code/modules/mining/lavaland/ash_flora.dm
    • +
    • Added boolean flag destroy_on_harvest (FALSE) to plants in ash_flora. If it is on, plants will not regrow.
    • +
    • Strange seeds removed from biogenerator
    • +
    • xpod[1-4] added to icons/obj/lavaland/ash_flora.dmi (2,3,4 are placeholders for better art variety)
    -

    eeSPee updated:

    +

    ImSynthex updated:

      -
    • people scream when taking damage
    • +
    • You can now throw stuff at movables with no density, such as mobs on the floor, mice, APCs etc etc
    • +
    • Refactored thrownthing datum
    -

    qwertyquerty updated:

    +

    Ivniinvi updated:

      -
    • Re-add qwerty lighting in specific areas
    • -
    • You can now specify area bulb brightness
    • -
    • Added a paywall for felinid species
    • -
    • Added input capping and sanitization
    • -
    • Added some new input wrappers
    • -
    • Added race paywall to config
    • -
    • Felinids are no longer paywalled.
    • +
    • Updated some logging, added some logging.
    • +
    • Admins can now force people to stub their toes.
    • +
    • Fixes the FLW link in some logging.
    -

    r1ks-iwnl updated:

    +

    PowerfulBacon updated:

      -
    • Adds 8 new icons for circuit boards, based on department colors
    • -
    • Reorganizes computer_circuits.dm and machine_circuitboard.dm
    • +
    • Replaces get_hearers_in_view with range for musical instruments.
    • +
    • Musical instrument range reduced from 15 to 11
    • +
    • Flashbangs now blind with an intensity of 2 meaning wearing glasses alone will still blind you. (You will not get stunned while wearing glasses).
    • +
    • Flashbangs effect is directly proportional to the distance away.
    • +
    • Fixes docking with lavaland.
    - -

    28 September 2020

    -

    DatBoiTim updated:

    +

    Qwertytoforty AnCopper updated:

      -
    • Adjusted Foreigner to be a Negative trait
    • +
    • Telekinesis can no longer throw objects with people in them, or buckled to them.
    -

    PowerfulBacon updated:

    +

    ike709 updated:

      -
    • Fixes a clockcult map bug
    • -
    • Starting game... will now be announced closer to when the game is starting.
    • +
    • Custom emotes work again.
    - -

    27 September 2020

    -

    Crossedfall updated:

    +

    ivanmixo updated:

      -
    • Gangs is now disabled in the config
    • +
    • cyborg *spinning someone now knocks down instead of paralyzing
    -

    EdgeLordExe updated:

    + +

    09 September 2021

    +

    fighterslam updated:

      -
    • Added heretics to the config
    • +
    • Adds Corporate Sofas, an alternative, sleeker style of sofa.
    -

    Kmc2000 with Gun Jesus updated:

    + +

    08 September 2021

    +

    KubeRoot updated:

      -
    • Fully automatic firing for guns, except this time it isn't horribly coded and broken.
    • +
    • Silicons can once again interact with intercoms
    • +
    • Button.Input no longer breaks tgui interfaces. Fixes advanced injector creation interface, as well as NTOS file manager, chat, ID card modification and Revelation.
    -

    Moccha-Bee updated:

    +

    rkvothe14 updated:

      -
    • the eighties floor not spawning.
    • +
    • decreased the font size cap from 32 to 24 to prevent chat bugs.
    -

    PowerfulBacon updated:

    + +

    07 September 2021

    +

    Ivniinvi updated:

      -
    • Changelings and cult will no longer be assigned invalid targets
    • -
    • Clockcult gamemode
    • -
    • Clockwork slab
    • -
    • Brass armory
    • -
    • brass spear
    • -
    • brass battlehammer
    • -
    • brass sword
    • -
    • The Eminence simplemob
    • -
    • Cogscarab drone subtype
    • -
    • TGUI clockwork menu
    • -
    • Clockwork traps
    • -
    • Clockwork scriptures, structures and slab powers
    • -
    • replica fabricator
    • -
    • integration cog
    • -
    • Rat'var the clockwork justicar
    • -
    • New Reebe
    • -
    • Clockcult has been completely rewritten from scratch, Reebe has been completely redesigned and it no longer crashes upon using camera consoles, winning, doing anything etc.
    • -
    • Adds clockcult to the config
    • +
    • Ghosts no longer get spammed with It's Loose notifications when there's no singulo or tesla.
    -

    Zeskorion, GizkaFreechman, thatguythere03 updated:

    +

    fighterslam updated:

      -
    • 28 random maint rooms by GizkaFreechman, edited by myself
    • -
    • Random maint traps
    • -
    • cluwne rune, which can be used by cultists in a manner similar to an invocation rune, if the Honkmother has blessed one of the invokers with her presence
    • -
    • new random maint job, the VIP. he's rich, apparently important, and actually probably quite useless.
    • -
    • sprites for new job and cluwne rune by thatguythere03
    • -
    • edited most random maint maps to make maint easier to get through (changing table placements and such)
    • -
    • faithless no longer has a 12% chance to stun for 6 seconds on hit
    • +
    • Fixed the syndicate lavaland base to have the proper frequencies to be compatible with Supercruise.
    -

    super12pl updated:

    +

    qwertyquerty updated:

      -
    • Multilingual now costs 1 point instead of 2
    • +
    • Added new space ambient music
    • +
    • fixed ambient music and buzz
    -

    26 September 2020

    -

    Moccha-Bee updated:

    +

    06 September 2021

    +

    Ivniinvi updated:

      -
    • multi-directional sprites to the arcade and 80s floor.
    • +
    • Moths can no longer consume the following items: Indestructible items, Items with Melee armor, Space Suits, Hardsuits.
    • +
    • The exploration nuke no longer plays alarm.ogg
    - -

    25 September 2020

    -

    BeloneX updated:

    +

    KubeRoot updated:

      -
    • Disabled the Gateway roundstart
    • +
    • Geysers no longer generate in ruins. In fact, nothing should generate in ruins, as ruins now generate before other things.
    • +
    • Due to changes in the way the map is setup, floors that are parts of ruins on lavaland loaded at roundstart will now deconstruct into lava instead of basalt floors.
    • +
    • When a template is loaded with a passthrough turf, non-passthrough area on it, onto a genturf, the genturf is now forced to generate with the old area. This allows ruins to have objects in a powered area on a passthrough turf on lavaland.
    • +
    • Passthrough turfs can now hint towards if the turf below should be closed/open (wall/floor). This can be useful in ruins, as it can influence map generation without overriding the exact turf placed underneath.
    • +
    • Sprites for passthrough turfs with closed/open preferrence (visible in editor only)
    -

    Vivalas updated:

    +

    PowerfulBacon updated:

      -
    • Claiming a ticket now works directly through a reply.
    • +
    • Improves the supercruise collision detection by optimising it and making it so passing something triggers a collision event.
    • +
    • SSorbits now supports multiple orbital maps.
    - -

    22 September 2020

    -

    Archanial updated:

    +

    Tavczan updated:

      -
    • Deepfried pets no longer reappear after being bitten(why would you ever do that).
    • +
    • Abandoned crate tamper-proofing now detects EMPs.
    -

    DatBoiTim updated:

    +

    The-Moon-Itself updated:

      -
    • Multilingual
    • +
    • Bitwise operations and Trigonometry related circuit components, unlocked in a new techweb node.
    • +
    • Rounding circuit component.
    • +
    • Arithmetic circuit now has a modulus option.
    • +
    • New abstract circuit to base components that initialize with an arbitrary amount of inputs.
    - -

    21 September 2020

    -

    Archanial updated:

    +

    ivanmixo updated:

      -
    • You can now pick new pai holoforms again.
    • +
    • chaplain's soulstone can no longer shard bodies with souls
    - -

    20 September 2020

    -

    EdgeLordExe updated:

    +

    jupyterkat updated:

      -
    • Eldritch Water metabs properly.
    • +
    • fixed mech radios
    -

    zeskorion updated:

    + +

    05 September 2021

    +

    AnCopper updated:

      -
    • lizards no longer get cockwork tails
    • -
    • macrophage works again
    • -
    • pink macrophages work again
    • -
    • biometallic replication and organic flux induction should scale with pituitary disruption again
    • -
    • antivirus no longer works on humans. (why do biotypes suck ass)
    • +
    • Communications consoles also work on the centcom z level
    • +
    • Added the AI lab room as a possible ruin room.
    - -

    19 September 2020

    -

    eeSPee updated:

    +

    Crossedfall updated:

      -
    • DRAGnets will now teleport targets at beacons designated for Dragnet portals.
    • -
    • Dragnet beacons printable at secfab.
    • -
    • Dragnet beacons in armory on every map.
    • +
    • The AI will have a random lawset at the start of each shift from the following list: Asimov, asimov++, crewsimov, corporate, maintain.
    - -

    18 September 2020

    -

    Archanial updated:

    +

    Fox-McCloud AnCopper updated:

      -
    • New immersion smite.
    • -
    • Bullteriers!
    • -
    • Breadcats! Ask your local chef for one!
    • -
    • You can now scoop and hold pets.
    • -
    • Warden has a new pet - Walter!
    • +
    • ashwalkers malf AI module has been moved to the syndicate lavaland base vault.
    • +
    • Heavily beefed up the security of the Syndie vault, added two more turrets and 3 layer walls.
    -

    Moccha-Bee updated:

    +

    Froststahr updated:

      -
    • Renamed bubblegum and blood-drunk gps signals.
    • +
    • Mapmerge2 has been updated along with an experimental .dmm merge driver being included for conflict resolution.
    -

    St0rmC4st3r updated:

    +

    KubeRoot updated:

      -
    • ID modification is now logged.
    • +
    • Radios and intercoms can no longer be toggled from a distance by non-silicons using hotkeys
    • +
    • Monkeys can now interact with wall-mounted intercoms
    • +
    • Radio and intercom UIs now update when toggled via hotkey
    • +
    • Bounty console now uses a tgui interface
    • +
    • There is a new "Bounty Hunter" program available for modular computers and tablets
    • +
    • SDQL2 now supports all subsystems.
    • +
    • Alarm Monitoring program changed to avoid always-on unclearable fire alarms
    • +
    • Hacking a firing pin out of a gun is no longer done via a crafting menu - you can now do it by simply holding the gun in your hand and clicking it with a welder/screwdriver/wirecutters
    • +
    • You are no longer prevented from selecting more neutral/negative quirks once you have reached the limit of 6 positive ones.
    • +
    • Fixed a scenario that allowed infinite resource generation via ore machines.
    • +
    • TGUI interfaces updating from ui_act will not update again due to ui_update
    -

    Victor239 updated:

    +

    LemonInTheDark, Port By Froststahr. updated:

      -
    • Removed broodmothers from gold slime pool
    • -
    • Increased ATMOSfan max signs to 6
    • -
    • Shoulder holsters are now an accessory, not a belt.
    • +
    • The panic bunker allows for a minimum time to be set, blocking players who lack the required amount of living played time from accessing the game.
    -

    YoshimiWasTaken updated:

    +

    PowerfulBacon updated:

      -
    • Should have the sprites now
    • -
    • added the damn sprites
    • +
    • Removes the bolt of death and bolt of adminheal from xenobiology space carps (Chaos + Regular)
    • +
    • Bag of holding's can no longer teleport their contents through walls when dumped.
    • +
    • Fixes gamemode presetup being called late.
    • +
    • Fixes cult having a random chance to fail to setup between 24-28 players.
    • +
    • Cryo syringes no long have the no react flag.
    • +
    • Reagents inside cryo syringes will be at 20 kelvin.
    • +
    • Heavy weapons require two hands to hold.
    • +
    • Light/medium weapons will be less accurate when fired with 1 hand.
    • +
    • Refactors meteors, they are now orbital map components and will fly towards the station, colliding with orbital bodies and flying shuttles.
    -

    eeSPee updated:

    +

    francinum updated:

      -
    • Recharging station crate purchasing from cargo consoles
    • +
    • Ore Silo connections can no longer cross z-level boundaries, and will break if the object changes z-lvels.

    ivanmixo updated:

      -
    • Replaces the firelocks with windoors in the public garden on MetaStation
    • +
    • all syndicate boxes now look like syndicate boxes
    • +
    • replaced some of the more egregious spawn()s with timers
    • +
    • removed the separated chemicals trait from botany
    -

    super12pl updated:

    +

    lordScrubling updated:

      -
    • lizards can now scream
    • +
    • having x-ray makes you ignore flash protection and tint
    • +
    • flashbangs can flash people with x-ray through walls
    • +
    • syndicate autosurgeons get a special variant of eyes that allow flash protection
    -

    zeskorion updated:

    +

    lordScrubling, Mothblocks, Rohesie updated:

      -
    • nerfed toe stubbing
    • -
    • explosions have been fucked with a bit
    • +
    • placing fireman carried people onto things
    - -

    17 September 2020

    -

    BeloneX updated:

    +

    qwertyquerty updated:

      -
    • All projectiles now move 1.25 times as fast.
    • +
    • Nuclear countdown music
    -

    Naevii updated:

    +

    tiramisuapimancer updated:

      -
    • Updated HoS cloak sprite
    • +
    • IPC hands are now properly visible over jumpsuits on side states
    -

    r1ks-iwnl updated:

    + +

    04 September 2021

    +

    Ivniinvi, TheChosenEvilOne updated:

      -
    • Adds silver sulfadizine to synthflesh recipe.
    • +
    • Birdboat now has a chance to be controllable by dead chat, think twitch plays pokemon but goose and deadchat.
    • +
    • Deadchat controlled singularity variant.
    -

    tiramisuapimancer updated:

    +

    Ivniinvi, bobbahbrown updated:

      -
    • Felinids are now immune to carpotoxin and can have little a fish
    • -
    • Felinids like meat and dairy, and dislike vegetables and sugar.
    • +
    • Add Requests Manager to view all prayers/centcom and syndicate requests/and nuke code requests within a round.
    - -

    16 September 2020

    -

    Crossedfall updated:

    +

    KubeRoot updated:

      -
    • Acid properly degrades armor
    • -
    • You can empty storage containers/boxes directly into disposals again
    • -
    • The mutations overlay will update correctly now
    • +
    • TGUI interfaces have been manually tweaked across the board to update more consistently
    • +
    • Some potential exploits related to TGUI input validation/sanitisation have been fixed
    • +
    • Nanite cloud control now shows rules even when you don't have a disk with valid rules inserted
    • +
    • Extra settings for numbers in nanites now treat 0 as a valid number.
    • +
    • Cargo express console now doesn't add a second order to the cargo console cart. As a side-effect, it also doesn't print a requisition form.
    • +
    • The holodeck computer will no longer break when reenabling safety
    • +
    • Chemistry heater no longer stays on when removing beaker with alt-click
    • +
    • Added signals for machine_open and machine_close
    • +
    • References to IRC now better describe TGS' and Discord's existence.
    • +
    • Players will now be better informed that messages are sent through TGS to IRC/Discord/etc when attempting to adminhelp with no available admins/use adminwho verb.
    • +
    • Initial ahelps are now multiline too.
    -

    15 September 2020

    -

    ivanmixo updated:

    +

    03 September 2021

    +

    Ivniinvi updated:

      -
    • The old science research station ghost roles now have a proper title
    • +
    • Coffee the Crab is now present in BoxStation Science
    • +
    • Birdboat the Goose is now present in DeltaStation, MetaStation, CorgStation, and PubbyStation maints
    • +
    • Lia the Carp is now present in the CorgStation HoS office
    • +
    • Cayenne the Carp is now present in the traitor deployable capsule shuttle
    • +
    • Tom the Turkey is the mascot of the Exploration Crew, and appears on the three exploration shuttles.
    • +
    • Debtors and Assistants can now purchase a Bottle of Mystery Pills for 3TC.
    - -

    14 September 2020

    -

    ExcessiveUseOfCobblestone(Idea by Arathian) updated:

    +

    MNarath1 updated:

      -
    • Mutation tox now has a minute window where you can purge the chem to avoid being changed (It functions EXACTLY like old slime mutation toxin)
    • -
    • Slime Mutation Toxin is replaced by Mutation Toxin since they now function 100% the same. Think of this as just a name change!
    • +
    • fixes my own mistake on instruments

    PowerfulBacon updated:

      -
    • Spraycans with less than 2 but more than 0 charges left can no longer be used on objects
    • +
    • You can now upload to AIs on different station floors.
    • +
    • Fixes meta comms, will proper fix it tomorrow.
    • +
    • Runechat not displaying messages if you can't hear it rather tahn if they can't hear it.
    • +
    • Changes exploration mainframes to proper exploration communication setups on pubby and metastation.
    -

    ike709 updated:

    +

    yyzsong updated:

      -
    • PanDEMIC 2200 UI now includes severity for the overall disease and each symptom.
    • +
    • Randomly generated names can no longer have skywalker as a last name
    -

    ivanmixo updated:

    + +

    02 September 2021

    +

    DatBoiTim updated:

      -
    • You can't order stuff from the express supply console as a ghost anymore
    • +
    • Tweaked Mining Webbing to also allow storage of exploration gear due to also being available to explorers
    • +
    • More exploration gear fits into webbing
    -

    zeskorion updated:

    +

    Inithis updated:

      -
    • vehicles no longer block bullets for you
    • -
    • mobs which pass tables can move past vehicles
    • +
    • added nitrile gloves to the Paramedic's default, roundstart loadout.
    - -

    12 September 2020

    -

    St0rmC4st3r updated:

    +

    Ivniinvi updated:

      -
    • A clearly illegal slaughterhouse to the west of the research division on boxstation has been permanently removed.
    • -
    • An actual medbay with treatment separation and more than one surgery room has been installed in the place of the removed slaughterhouse.
    • +
    • You can now print multiple Wanted or Missing posters.
    • +
    • Clockwork cultists and Cogscarabs will no longer be stuck in an infinite teleport loop.
    - -

    10 September 2020

    -

    Dingo-Dongler updated:

    +

    Kapu1178 updated:

      -
    • You can fold origami properly now.
    • +
    • IPCs are no longer deaf when EMP'd, and are now forced to speak spanish for 2 minutes.
    -

    Victor239 updated:

    +

    MNarath1 updated:

      -
    • Security webbing has +1 slot compared to sec belts again, and sec belts allow you to use all slots again.
    • +
    • fixes mobs not beeing able to hear instruments in lockers
    • +
    +

    PowerfulBacon updated:

    +
      +
    • Fixes reality destabilization auto-restabilization.
    - -

    09 September 2020

    ivanmixo updated:

      -
    • You now actually target the chest roundstart
    • +
    • bone axe now properly switches in hand sprites
    • +
    • wagging your tail is a visible emote again
    • +
    +

    kreeperHLC updated:

    +
      +
    • Equipment no longer disappears when you try to install it in the wrong type of mecha.
    -

    07 September 2020

    -

    PowerfulBacon updated:

    +

    01 September 2021

    +

    AnCopper updated:

      -
    • Fixes a cargo bug where items wouldn't be sold if placed in an anchored container
    • +
    • budget cards are indestructible.
    -

    zeskorion updated:

    +

    EvilDragonfiend updated:

      -
    • biometallic replication has slightly better stats, buffs preexisting robot limbs
    • -
    • TRD now works on mechanical limbs as intended
    • -
    • fixed exolocomotive xenomitosis capitalization and healing threshold
    • -
    • exolocomotive xenomitosis now works on monky
    • -
    • pink zombies and macrophages, so exolocomotive xenomitosis can be more aesthetic
    • -
    • organs take three times as long to decay
    • +
    • Exploration Crew has their HUD icon now.
    • +
    • Exploration Crew job can be given from the HoP console.
    • +
    • Job selection in the HoP Console is now tidily sorted by department.
    • +
    • When you grant a custom job "Acting Captain", now it gives you a better blank HUD icon. (Captain HUD without star)
    • +
    +

    Ivniinvi updated:

    +
      +
    • RD now has exploration access
    • +
    • Battle Royale loot has had some loot buffs, most notably the spawn rate of loot drops has doubled and the landing time of packages has been decreased.
    - -

    06 September 2020

    PowerfulBacon updated:

      -
    • Cult stun now works on mindshield instead of hearing protection
    • +
    • Cogged APCs will now report 100% charge on power monitors.
    • +
    • Fixes corgstation disposals and bar disconnect from powergrid.
    • +
    • Fixes QM headset having exploration access.
    • +
    • Fixes custom shuttles being unable to dock.
    • +
    • Entering the portal in the center of the shadow labrynth will return you to a random anomalous artifact.
    -

    ivanmixo updated:

    + +

    31 August 2021

    +

    Ivniinvi updated:

      -
    • The ashwalker's bonfire does not require oxygen to burn anymore.
    • +
    • The obviously fake nuke disk is now an arcade prize.
    • +
    • The round report in #ooc on Discord now includes a summary for Dynamic Mode.
    • +
    • Dynamic round report in #ooc no longer has extraneous html bold tags
    • +
    • The departmental budget's pre-initialize name has been changed.
    -

    kriskog/Fikou ported by Archanial updated:

    +

    KubeRoot updated:

      -
    • Omnitool.
    • -
    • Debug outfit has been updated and adjusted.
    • -
    • Admin RCD is superfast now and has upgrades.
    • +
    • Central Command has identified and fixed issues with pod launching interfaces.
    • +
    • Broken computers no longer glow in the dark
    • +
    • Seed Extractor and Plant DNA Manipulator now use tgui
    • +
    • Plant DNA Manipulator has a checkbox that skips confirmation prompt for rapid botanying
    -

    zeskorion updated:

    +

    Phil Smith updated:

      -
    • reworked phobias
    • +
    • The spriteless jumpsuit in sec maints in deltastation is now a real one
    - -

    05 September 2020

    -

    Archanial updated:

    +

    PowerfulBacon updated:

      -
    • Shotguns now blow people away at point blank.
    • +
    • Fixes finger gun allowing free movement in space
    • +
    • Adds in AI buttons to move their camera to above and below connected z-levels.
    • +
    • Sounds now play across multi-z station levels.
    • +
    • Explosions now explode across multi-z station levels.
    • +
    • Fixes blood brothers admin add
    • +
    +

    PowerfulBacon (Code, UI, Other sprites not mentioned, Other map files not mentioned), Reds88 (Vortex Gun Sprite), Isy (Damaged hallway map files) updated:

    +
      +
    • Adds in randomly generated ruins
    • +
    • Adds in dynamic z-levels.
    • +
    • Adds in ruin beacons on the shuttle supercruise map.
    • +
    • Adds z-clear
    • +
    • Ruin mapsize validation unit test
    • +
    • Fixes fastdmm2 not compiling on beestation code due to the updates.
    • +
    • Budget cards no longer get free money.
    • +
    • Bounties reward 3x as much, but the reward is distributed among station budgets.
    • +
    • Paychecks have been slightly reduced.
    • +
    • Station budgets now start with more money to compensate early game when no objectives or bounties have been completed.
    • +
    • Research disks can be found on ruin stations. These can be used to unlock special research.
    • +
    • Bags of holding are now a separate research node unlocked by finding disks on derelict stations.
    • +
    • Wormhole projectors are now a separate research node unlocked by finding disks on derelict stations.
    • +
    • Quantum spin inverters are now a separate research node unlocked by finding disks on derelict stations.
    • +
    • Advanced combat cyber implants are now a separate research node unlocked by finding disks on derelict stations. (Hydraulic armblades)
    • +
    • Combat cybernetic implants implants are now a separate research node unlocked by finding disks on derelict stations. (Xray, thermal vision, anti stun implants, thrust implants)
    • +
    • Clusterbangs are now a found research disk.
    • +
    • Phazons are now a found research disk.
    • +
    • Exotic ammo is now a found research disk.
    • +
    • Beam rifles are now a found research disk.
    • +
    • Temp gun and X-ray gun is now a found research disk.
    • +
    • Nuclear energy gun is now a found research disk.
    • +
    • Completion station missions reward money to budget cards.
    • +
    • Adds in a new mining scanner effect.
    • +
    • Refactors vendors to be modular
    • +
    • Adds discovery research
    • +
    • Adds discovery scanner
    • +
    • Felinids get stunned when falling z-levels for the same length of time that normal humans get knocked down.
    • +
    • You will no longer fall down if the turf below you is space.
    • +
    • You can now ascend and descend connected z-levels by clicking on the space tile.
    • +
    • Off-station traitor roles have a prefered chance (30%) to have their team members as targets (Shaft miners and exploartion crew.). Additionally, on station traitor roles have a reduced chance to have their target as an off station roles.
    • +
    • Turrets can now shoot above themselves, preventing the nukie shuttle from being boardable from above.
    • +
    • Bolt of teleportation will teleport people to open turfs unless none are available.
    • +
    • Immovable rod no longer loops.
    • +
    • Box station no longer has the crab.
    -

    St0rmC4st3r updated:

    +

    francinum updated:

      -
    • Bartender quits buying new monkeys for every shift. Pun Pun is back!
    • +
    • Bans now properly create their relevant notes.
    • +
    • You should probably manually unexpire any note with an expiration date of 0.
    -

    super12pl updated:

    +

    lordScrubling updated:

      -
    • Adds sterilizer spray to robodrobe
    • -
    • Adds morgue to robotics on DeltaStation and PubbyStation
    • +
    • Ability to see a tag with the armor values of a piece of clothing when you inspect it
    -

    04 September 2020

    -

    BeloneX updated:

    +

    30 August 2021

    +

    ImSynthex updated:

    +
      +
    • Changed the corporate lawset
    • +
    +

    KubeRoot updated:

      -
    • replaces the glass in the labor camp with reinforced plasma glass.
    • -
    • fixed the paper wizard den so everything doesnt instantly die from low pressure anymore.
    • +
    • Solar control screen no longer floats off the console when facing east. Solar control screen is now also emissive, like other computers.
    -

    yorii updated:

    + +

    29 August 2021

    +

    ike709 updated:

      -
    • fixed ethereal charging
    • +
    • Removed an admin privilege elevation exploit and other potential avenues for abuse
    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d8ec91b21c4b1..944193b50d0df 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -28003,3 +28003,4428 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: Trigger build wire on autolathes - rscadd: Autolathe queue - rscadd: Autolathe ejection direction. +2020-11-06: + Autisem: + - bugfix: assembly's now can be interacted with while inside other objects like + TTV + Victor239: + - rscadd: The name and job of the announcer are now shown on announcements. + zeskorion: + - code_imp: pepper proofing now checks eye and mouth covering instead of a snowflake + flag + - bugfix: spraypaint now uses eye covering instead of flash protection +2020-11-07: + Archanial: + - rscdel: Major and minor crimes are gone. + - tweak: Adding a crime recond in sechuds in only 1 pop-up now. + - rscadd: You can add details to a crime separately. + - refactor: Cleaned up sec console code and hud glasses code. +2020-11-08: + Archanial: + - tweak: Cyborgs no longer get confused after getting flashed/flashbanged. + PerishedFraud: + - rscadd: Some new items in the mining vendor. + - tweak: Some prices changed in the mining vendor, can also eat through explorer + mask. + eeSPee: + - tweak: Guns no longer use changeNext_move + park66665: + - bugfix: 'no more with exponential thermal energy, fusion now correctly produces + heat: supply plasma to your nuclear fusion ''reactor'', dammit!' + - balance: in an attempt to preserve fun, I tweaked some numbers and logics in fusion + to create some healthy fun + - rscdel: e30 fusion + - balance: rad now scales with fusion temperature, which means that you will get + meager rads if you are bad at fusion (e.g. canister fusion), or stronger rads + than before if you manage to keep a strong and robust fusion + - rscadd: in order to help you gauge the strength of your fusion, fusion-derived + nuclear particles (aka radballs) are color-coded; and adjective-coded, so you + can also gauge how damned you are after being hit by a radball + - refactor: lightly refactored fusion code in general +2020-11-09: + That0nePerson: + - rscadd: Adds weed killer spray to janiborg + - rscadd: Adds acid spray to emagged janiborg + - refactor: Refactors cyborg spray bottles + super12pl: + - balance: Makes searing tools small sized item +2020-11-10: + LemonInTheDark: + - bugfix: You will keep your angle when you drift through space now. Oh and immovable + rods do the same, so things might get a bit more messy then usual. + TheChosenEvilOne, Skoglol, Cenrus, and others: + - bugfix: Dynamic mode fixes + - bugfix: Revolution ending dynamic earlier than expected + - rscadd: Clockwork Cult and Abductors have been implemented into dynamic mode + - rscadd: The revolution gamemode will no longer be selected if there are no head + of staff players + - rscadd: Dynamic added to secret rotation +2020-11-11: + Archanial: + - admin: More botany logging. + Naevii: + - tweak: Updated RD cloak sprite + PowerfulBacon: + - rscadd: Nanotrasen battle royale. + - tweak: Replaced syndicate playing cards with a maintenance loot spawn. + - rscadd: Adds small recoil to shotguns. + - tweak: Integration cogs suppress APC power warnings. +2020-11-13: + PowerfulBacon: + - bugfix: Fixes statues being able to move while looked at. + ike709: + - tweak: Updated extools +2020-11-14: + ? '' + : - tweak: removes access levels from VIP + Archanial: + - rscadd: Teratomas are actual antagonists now! + - rscadd: You can now make someone teratoma in traitor panel. + - tweak: Teratomas cannot be made into a human with DNA sting or by mutadone! + - refactor: fixed some shitcode in monkey (who cares). + Isy232: + - rscadd: Botany's biogenerator can now produce toolbelts. + MNarath1: + - bugfix: Fixes Abductor locker to be animated and animates the alien locker + Phil Smith, Golgor: + - rscadd: The Crazy Hamburger recipe + - imageadd: Crazy Hamburger sprite by Golgor + Victor239: + - balance: Absorbing another changeling made more rewarding again. + - tweak: Fleshmend is now an active ability rather than passive heal again. + - tweak: Augmented Eyesight now blocks flashes again. + - tweak: Organic Flesh suit now only costs 1 point, has less slowdown and is armoured. + - rscadd: Radios now make noises when you use them + jupyterkat: + - bugfix: Stasis beds now stop diseases from progressing +2020-11-15: + BeloneX: + - tweak: xeno queens can smack the emergency shuttle console to clear the xeno hostile + environment rather than waiting it out + - tweak: Xeno queens will delay the escape shuttle for a while unless they are killed + - tweak: the shuttle will get auto called at the end of the timer if the queen is + alive and it hasn't been called already to prevent super xeno extended rounds + Ohagi-Chan: + - tweak: Science outpost doors now allow miners to travel a little more freely. + - tweak: Hermits no longer wake up to discover that their cave is flooded with toxic + gas. + PowerfulBacon: + - bugfix: Red and blue cubes respect no_teleport + - rscdel: SRM-8 Missile Rack can no longer be printed. + - bugfix: Reebe void is now jaunt proof + - bugfix: Prosperity prisms now heal servants. + Victor239: + - tweak: Alloys are now given their proper names in the techfab. +2020-11-16: + ike709: + - bugfix: Fixed being able to put intercoms and other anchored objects inside of + trash bags. + qwertyquerty: + - bugfix: Fixes ambience runtime +2020-11-17: + Archanial: + - bugfix: Brig Physician can no longer be a traitor. + Crossedfall: + - tweak: Updated the rust-g dependency + Froststahr: + - bugfix: Station goals are buyable again + - rscadd: You also get a centcomm report telling you what the goal is, in absence + of the intercept report. + PowerfulBacon: + - bugfix: Fixes a runtime issue with invalid research design disk. + Sinmero: + - tweak: Round will not end the instant all heretics are dead + - tweak: Adds heretics to the endgame credits + eeSPee: + - bugfix: you no longer get IC muted for forced speech + qwertyquerty: + - tweak: Explosions throw farther + - tweak: Explosions throw all movable atoms + r1ks-iwnl: + - rscadd: Runechat text will be displayed even when inside another object such as + lockers or crates. +2020-11-18: + 'Azarak, Zandario ': + - rscadd: PDA now have sounds. + PowerfulBacon: + - admin: Allows resizing of the ticket messenger + uomo91: + - bugfix: Fixed "Show All" tab in player panel logs being broken. + - bugfix: Whispers, OOC, and various other things display differently in logs, visually + distinguishing them from say logs. + - refactor: Player panel logs will now show all logs chronologically, so you'll + see commingled say and attack logs if you're on the "Show All" tab, etc... +2020-11-19: + FriendlyContractor: + - tweak: Radio jammer is now part of contractor kit standard loadout + - tweak: Tweaks contractor kit starting items pool by removing useless items and + adding some new + 'TheChosenEvilOne ': + - bugfix: Dynamic midround traitor triggered by roundstart traitor ruleset no longer + ignores protected roles. +2020-11-20: + Archanial: + - admin: Setting default gamemode now requires dbranks. + Crossedfall: + - server: libmariadb.dll is no longer a required static file + Isy232: + - balance: Departmental budget money increases are now static and are no longer + exploitable. + MNarath1: + - rscadd: animated crates + PowerfulBacon: + - tweak: Radios now only play to the person wearing the headset / holding the radio. + Victor239: + - rscadd: Glass shards can now be made by using glass in-hand. + eeSPee: + - tweak: recycler will no longer grind down raw/material stacks + francinum: + - rscdel: Exolocomotive Xenomitosis has been removed. +2020-11-21: + KreeperHLC: + - tweak: AltClick on things that use AltClick no longer opens the contens of the + turf + PowerfulBacon: + - tweak: Eminence no longer blocks bullets. + - bugfix: Autolathe nolonger opens when something is printed. + francinum: + - balance: Mindswapping with a slaughter demon is a terrible idea. + jlsnow301: + - rscadd: Confirmation dialogue on harvesting replica pod seeds without soul + - rscadd: You can now scan replica pod seeds with an analyzer (plant/forensic) to + read the injected DNA + - bugfix: Removed a nonfunctional alert in this process +2020-11-22: + Archanial: + - bugfix: You can't remove syringes while dead. + Nathan_does_voices: + - rscadd: New arrival sound made by Nathan_does_voices (be sure to look him up on + instagram or tik tok!) + PowerfulBacon: + - rscadd: Ratvar now fights Narsie + - rscadd: Cult will not end the round on summon if clockcult exists. + - tweak: Becoming a clockie counts towards the sacrifice objective. + - bugfix: Report of clockcult shows 180 seconds instead of 1800 seconds + - bugfix: Removes the delay between clockwork gateway opening and rat'var appearing + Victor239: + - bugfix: Fixes not being able to use syringes on arms and legs whilst wearing an + armour vest. + eeSPee: + - balance: cult floor is atmosproof + - balance: artificer magic missile no longer stuns cultists +2020-11-24: + MNarath1: + - bugfix: invisible Crates + jupyterkat: + - bugfix: revs and engraved messages can't get irradiated anymore +2020-11-25: + Chessus: + - tweak: Tweaked Dexlin + PowerfulBacon: + - bugfix: Chat will no longer linkify links unless specified to + Triiodine: + - rscadd: Added 16 new random maintenance rooms, 8 10x10s, and 8 10x5s + park66665: + - bugfix: fixed a minor /datum/looping_sound-related memory leak +2020-11-26: + EdgeLordExe: + - rscadd: Dominant Adamantine Extracts! + - rscadd: Grey - Slowly feeds all slimes in the area, effect blocked by walls + - rscadd: Orange - Ignites anyone in range of the crystal, heats surrounding air + to 500k. Effect blocked by walls + - rscadd: Purple - Restores 1 of a random damage type to everything in range every + time it ticks, including brain and cell damage + - rscadd: Blue - Stabilizes atmos in effect range to the standard O2/N2 mixture, + and stabilizes temperature to 300k. Effect blocked by walls + - rscadd: Metal - just like Purple but affects only borgs + - rscadd: Dark Purple - Consumes plasma in the air, converting it into plasma sheets. + Crystal releases and ignites a small amount of plasma when destroyed + - rscadd: Dark Blue - Cleans and dries tiles in the area + - rscadd: Silver - Plants grow slightly faster, and prevents pests from growing + at all. + - rscadd: Bluespace - Acts as a beacon to other crystals of this type. Click with + an empty hand to teleport between them + - rscadd: Sepia - Everything in the area is under the effect simmiliar to Stasis + (Real stasis is a hardstun) + - rscadd: Cerulean - Adjacent tiles will gradually grow slime crystals, up to a + maximum stack of 5 in each tile. slime crystals may be combined with any material + sheet to increase its stack size by 5. + - rscadd: Pyrite - Causes floor tiles to be randomly colored within area of effect + - rscadd: Red - Crystal cleans blood from the ground in a wide radius, and may store + up to 300u of gathered blood. Crystal may be interacted with to consume some + blood and create a piece of "meat" or a random, functional organ. Containers + may also be used on the crystal to transfer blood directly out of it. + - rscadd: Green - Crystal stores one random mutation from the last player who interacted + with it (starts with none). Players standing within the effect radius are gradually + cured of mutations, but will be forcefully given the mutation stored in the + crystal + - rscadd: Pink - Everyone within range of the crystal is pacified (effects identical + to pacifist trait). + - rscadd: Gold - Click crystal with empty hand to be transformed into a random pet-type + simplemob. Leave crystal's area of effect to revert + - rscadd: Oil - Lubes tiles within area of effect. + - rscadd: Black - Players standing within two tiles of the crystal will begin slowly + transforming into a random slimeperson. Has no effect on slimepeople. + - rscadd: Adamantine - Makes everyone slightly more resistant in an area around + it. + - rscadd: Rainbow - Does nothing on its own, but will accept Crystalized extracts + to begin emitting the same effect as the consumed extract, allowing for multiple + different effects in the same space + - bugfix: fixes adamantine crossbreeds +2020-11-27: + EdgeLordExe: + - bugfix: further fixes adamantines as per documentation in the bounty. + park66665: + - bugfix: stack max_amount is now enforced more thoroughly +2020-11-28: + Froststahr: + - rscadd: Emags allow traitors to anonymously purchase any shuttle they want without + ID! Screwdrivers can be used on circuit boards as well, but adequate access + is still required in that case. + - tweak: The name of the authorizer, not the buyer, is printed on purchase of a + shuttle. + - tweak: Unsafe shuttles are now unavailable for purchase without emags/hacking. + LastCrusader105: + - tweak: tweaked piping + - bugfix: fixed chapel mail system + PowerfulBacon: + - rscadd: Ambient fading + - rscadd: Sound effect subsystem + SmArtKar: + - imageadd: Added old engine floor icon_state + jupyterkat: + - admin: restart votes check for active deadmins +2020-11-29: + IndieanaJones: + - rscadd: Blob Zombies can now be controlled by Ghosts + - tweak: Blobs cannot understand or speak languages anymore and are default to blob + hivemind so no .b anymore for blobber or blob zombie + - balance: Makes Blob structurs Lavaproof so no blob kill with lavastaff + - tweak: Blob announcement now at size 75 or after 10 minutes + Jakecantcode: + - rscadd: Added charcoal pen that can be crafted from ash and wood + bloons3: + - tweak: changed admin logging for items + francinum: + - rscdel: Skewium has been removed. + super12pl: + - config: Removes Jungle Fever from rotation. +2020-12-01: + MNarath1: + - admin: Admins now get a message if the AI or a borg decides to delete Crew mainfest + entries + ike709: + - refactor: A bunch of mob-related code has been improved. + - tweak: For performance reasons, animals will only attempt to mate at a maximum + rate of once every 5 minutes. + - tweak: For performance reasons, cats will only kill mice or play with toys when + they move to tiles with mice or toys. + - tweak: For performance reasons, Kalo's cleaning range has been halved to 5 turfs. + I've also lowered the rate at which he finds things to clean. + - tweak: For performance reasons, Cak will only frost a donut when entering a turf + with a donut. + - tweak: Several other performance tweaks. +2020-12-02: + ? '' + : - tweak: Doors are smoother + Froststahr: + - bugfix: The white changeling icons are now fixed and returned to their codersprite + glory. + MNarath1: + - bugfix: fixes a back sprite icon that was not properly mirrored + - bugfix: minecart beeing animated + - refactor: refactored some code regarding the crate animation to use actual sphere + coordinates instead + - bugfix: fixes (hopefully) the broken looking crate animation + PowerfulBacon: + - rscadd: Traitors now have a low chance of spawning on heretics (60%), devil (15%). + - code_imp: Minor antagonist roles can now be configured to optionally use antagonist + rep + TemporalOroboros: + - code_imp: Repathed screen objects + That0nePerson: + - rscadd: Adds a communication implant + - rscadd: Blood brothers get a communication implant to their team roundstart + Tiviplus, Rohesie, ninjanomnom, ike709, park66665: + - refactor: converted decals from components to elements +2020-12-04: + Alt_Alpha9: + - bugfix: If multiple holidays are active, the station name may be derived from + any of them instead of a single one. + Sinestia: + - bugfix: shuttle list hides dangerous shuttles properly now + francinum: + - admin: VV now works more reliably + - bugfix: VV can now show the panel of objects with invalid iconstates + park66665: + - bugfix: layer manifolds are now saner +2020-12-05: + Alt_Alpha9: + - tweak: The damp rag can now clean microwaves + MNarath1: + - bugfix: Radiation filter breaking airlock filter + PowerfulBacon: + - rscdel: Removes unconciousness from mech brute attacks + eeSPee: + - bugfix: limbsnakes properly disember limbs + - tweak: Chimeracost doubled + - tweak: biodegrade cost halved + park66665: + - bugfix: fixed some memory leak and harddels in atmos pipenet code + - bugfix: improved performance by a tiny bit + - bugfix: fixed mini-sized bugs + - code_imp: code is a bit saner +2020-12-06: + MNarath1: + - bugfix: fixes reinforced floor examine runtime + Naevi: + - tweak: The BeeStation BYOND logo is festive now + francinum: + - bugfix: No children allowed. +2020-12-07: + Alt_Alpha9: + - tweak: Unlicensed PDA now has a charcoal stylus instead of those fancy pens + Kmc2000 with BadminJenkins: + - rscadd: Added a new roundend sound + ike709: + - balance: Reduces bumpslams to a 10% chance. The 10% chance has a 5 second cooldown + if it fails or a 20 second cooldown if it passes (aka you can't get bumpslammed + successfully twice in 20 seconds). +2020-12-08: + Vasily2013: + - bugfix: optimizes the CC z level to load a bit faster. +2020-12-09: + Archanial: + - rscadd: Delta's AI sat now fastmos compatible. + - rscadd: Fixed some AACs not working. + - rscadd: Minor improvements to box's AI sat. + - rscdel: Removed double stacked windows on pubby's chapel. + - rscadd: More firelocks in pubby's chapel. + - rscadd: Added tiny fans to ferries. + - rscadd: Windows in labor camp are plasma (again). + - bugfix: APC in labor camp is no longer floating mid air. + - bugfix: Generic computers are replaced with computer frames in science outpost. +2020-12-11: + Alt_Alpha9: + - tweak: hitting yourself with items now makes grammatical sense + - tweak: The name of a beaker is now displayed when someone tries to feed you it + Archanial: + - admin: Admins can now easily see if the objective is currently completed in TP + (objective's text will be green). + BeloneX: + - tweak: Removes health analyzer limb specific damage toggle + Blueturbo47: + - tweak: Fixed a firelock placement. + Froststahr: + - admin: quantum spin inverter is now logged + Kerbin-Fiber: + - tweak: Mentor Follow has been removed. Never even worked. + MCterra10: + - bugfix: Protected roles no longer get midround antags + PowerfulBacon: + - rscadd: Coderskirt + - refactor: Refactors get contributors code to only get the list once and store + it as a static variable. + - bugfix: coderskirt + - bugfix: black slime core will now kill all mobs it is used on + Sinmero: + - tweak: Ctrl-Shift-clicking station bounced radio/intercom will toggle the speakers. + - tweak: Alt-clicking station bounced radio/intercom will toggle broadcasting. + park66665: + - bugfix: Protected roles really should no longer get antag at dynameme rounds + - bugfix: fixed quite a lot of pipes on every map (except Kilo which only had one + trivial problem) to improve experience and performance + qwertyquerty: + - rscdel: ike hates shitcode, coderskirt removed +2020-12-12: + Ruko, Isy232: + - balance: Styptic powder, Synthflesh and Silver Sulf now do nothing when splashed. + - balance: Styptic powder and Silver Sulf now do 0.5 healing per tick and 1 when + instantly applied but their OD threshold is upped to 100u and the metabolism + rate is increased to 1u per tick. A 40 Styptic powder patch will heal 40 to + the limb it is applied to and then 20 damage over 40 ticks. They also do stamina + damage equal to the amount applied x2, the medicine is painful so this is pain + damage. + - balance: Atropine's brute, toxin and fire damage healing is doubled and it only + looses its effectiveness at 80 damage instead of critical condition. Atropine + also now causes dropping of items in its confusion state so its no longer suitable + for combat use and its overdose threshold is lowered to 15u. Overdosinng on + atropine now causes atropine to become histamine in a 2 to 3 reaction. + - balance: Bicardine, Kelotane, Dexalin and Anti-toxin now heal 1.5 per tick while + below 50 damage and 0.5 per tick when above 50 damage. This makes them no longer + as effective on large wounds but they are quite capable of healing smaller ones. + Their metabolism rate has also been halved so they stick around longer. + - balance: Salicyclic acid, Dexalin Plus and Oxandrolone now heal 3 damage per tick. + They also do 2 stamina damage per tick up to 80. They now only do stamina damage + while healing. + - balance: Anti-toxin no longer purges chems and only heals toxin damage. Use charcoal + or something. + - balance: The overdose of most chems now causes organ damage instead of just reversing + the effects of what the chem healed. + - rscadd: Adds bicaridine/kelotane pill bottles to burn/brute treatment kits. + - balance: Brute and burn patches now contain 30u of their reagents instead of only + 20. + - balance: Perfluorodecalin now causes more toxin damage as a side effect, overdoses + at 30u and causes lung damage upon overdose. + - balance: Salbutamol can now cause an overdose. The threshold is 25u (I made salbutamol + pills have less u to avoid OD on them). This overdose causes Sulbutamol to become + histamine in a 1 to 1 reaction. + - balance: Corazone now heals the heart by 1.5 per tick, however it now has an overdose + threshold at 20u and if you overdose it will turn into histamine in a 1to 1 + reaction. + - balance: Carthatoline now heals 3 toxin loss per tick and its OD causes brain + damage. Its overdose threshold is now 25u. + - balance: Leporazine now has an overdose at 30u. This overdose causes your temperature + to rapidly increase or decrease randomly. + - rscadd: You can now find bicaridine and kelotane pill bottles in medical vendors. + park66665: + - bugfix: improved decal performance + - bugfix: decals no longer disappear on shuttle move +2020-12-13: + That0nePerson: + - rscadd: Adds Cookie's Homemade Rum to the maint loot table +2020-12-14: + eeSPee: + - tweak: Xeno abilities tell their plasma cost in the description. + ike709: + - bugfix: Fixed the stray bullet hallucination runtiming. + - tweak: Stray bullet hallucination is less frequent. +2020-12-15: + Archanial: + - rscadd: Aux base access. + - tweak: Curator no longer has construction access. + NotRanged: + - rscadd: Added a long range atmos scanner + Ryll/Shaps: + - bugfix: Fixed an issue with underwear sometimes showing through clothes + nemvar: + - bugfix: fixed atmos component code (again) +2020-12-16: + PowerfulBacon: + - rscdel: Circuit atmospheric modules. + bloons3: + - admin: increased emergency shuttle verbosity logging + ike709: + - bugfix: Players will no longer be popcap redirected if they have a mob. + oranges: + - rscadd: Added ANZAC day +2020-12-17: + Blueturbo47: + - bugfix: Some of the maint rooms were marked as the wrong area. + bloons3: + - admin: Binary chat messages are now marked as such in logs. + - tweak: You can now only use the emergency shuttle console once per 5 seconds. +2020-12-18: + That0nePerson: + - bugfix: Fixes drying rack not transfering reagents + qwertyquerty: + - balance: Power usage gameplay difficulty curve + - rscadd: Zoom in keybind (set to ] by default, unbound if you have played before + and you'll have to set it up in keybind prefs) +2020-12-19: + MNarath1: + - rscadd: Directional firelocks frames to iron sheet recipe + - rscadd: Window firelock frames to reinforced glass sheet recipe + - bugfix: a runtime error during firelock construction(only when making them from + scratch) + - refactor: small changes to the heavy firelock code and var define of firelock_type + PowerfulBacon: + - bugfix: Fixes overhead chat scrambling languages you can understand but not speak. + That0nePerson: + - rscadd: Added alcoholic qurik + francinum: + - rscadd: Two new armbands in the beecoin shop. + jlsnow301: + - rscadd: Voting panel upgraded to TGUI. + - rscadd: Users are now shown which option they voted for. + - rscadd: Users can now change their votes. +2020-12-20: + DatBoiTim: + - rscadd: Added the multitool for sale in YouTool vendors. +2020-12-21: + MNarath1: + - bugfix: cult floor is atmos proof again + - tweak: makes space ruin version of cult floor non atmos proof again +2020-12-22: + Archanial: + - rscadd: Old mask is back. + MNarath1: + - rscadd: Adds ranged analyzer to advanced engineering tech node + - bugfix: Ranged analyzer not buildable + St0rmC4st3r: + - tweak: Flux anomalies are now much more rare. + Victor239: + - balance: Security cyborgs must be researched first. + r1ks-iwnl: + - rscadd: New race restricted martial art for lizards - Tribal Claw. +2020-12-23: + 'stylemistake ': + - refactor: TGUI will keep trying to load for 10 seconds in case of a network problem + and will show a bluescreen if it completely fails. + - bugfix: This hopefully fixes the whitescreen problem. +2020-12-24: + Autisem: + - tweak: Sentinel's compromise restores blood volume +2020-12-26: + Sinestia: + - bugfix: AI interface conforms to 17x15 properly +2020-12-27: + Autisem: + - bugfix: Dryed gaia can now be used to make torches + - rscadd: Bioprinters now can also print soymilk + DatBoiTim: + - tweak: Syndicate MMI is a standalone uplink item. Restricted to Roboticist and + RD. + - tweak: Increased Syndicate Surgery Duffle Bag cost to 3 TC + Froststahr: + - rscadd: Abductors now start with agent IDs! Just swipe a victim's ID card onto + it to copy their access. + MNarath1: + - bugfix: Fix firelock windows dropping iron instead of reinforced glass + PowerfulBacon: + - tweak: meteors can now only appear after 50 minutes. + - tweak: If corgium reacts in your body, it will turn you into a corgi for some time. + - tweak: Jaunting ignores slowdown. + - bugfix: Fixed an unintended combat stim injector nerf. + - code_imp: Adds a validation check when loading jobs.txt + - spellcheck: Removed a double space from baton attack message. + cerebrallolzy, jupyterkat: + - balance: No longer can run away from explosions. + - refactor: Explosions is now a subsystem. + - refactor: Nukes now only gibs everyone, unfortunately + eeSPee: + - balance: Reduced the disgust you get from Transcendent Olfaction when you are + filthy + - balance: supersoldiers now look like humans + r1ks-iwnl: + - bugfix: Fixed Advanced Health Analyzer working exactly like the normal Health + Analyzer. +2020-12-28: + PowerfulBacon: + - tweak: Christmas day now occurs on Christmas day. + - rscdel: Corgium no longer requires being heated to react + - tweak: Cultists can now be summoned if buckled to an object, but not while being + dragged + cuffed. + - tweak: Cultists can now use spells that do not require their hands while cuffed + (Communicate, EMP, Conceal presense). + St0rmC4st3r: + - bugfix: Removed an oversight that allowed CTF players to build iron walls. + eeSPee: + - balance: Vomit no longer hardstuns you for 2-5 seconds, but knocks you down, and + stuns for a really short duration + francinum: + - refactor: Beecoin shop items are now referenced by ID. + - bugfix: Fixed some shop items being unbuyable. + - refactor: Note, this update has unequipped your shop items. They will need to + be re-equipped. + - rscdel: The autodoc machine has been removed. + ike709: + - bugfix: Fixed the 4th character slot for players that have purchased it with beecoins. + r1ks-iwnl: + - rscadd: Health scanning someone as a ghost now also shows the chemicals inside + their body. +2020-12-30: + St0rmC4st3r: + - bugfix: chloral hydrate bottle now has 30u instead of 15u. + park66665: + - bugfix: forced dynamic rulesets now respect role protection + - rscdel: admeme-unrelated sec and/or cap roundstart traitors on dynamic (hopefully) +2020-12-31: + DatBoiTim: + - bugfix: SecBorg Module Upgrade now given by research. + bloons3: + - admin: xenobio potions now persistently log + ike709: + - refactor: world/Topic()'s player list has been moved from "status" to "playerlist" + r1ks-iwnl: + - tweak: Syndicate radio implant can't be bought on incursion gamemode. +2021-01-01: + Kryyto: + - rscadd: Pill Bottle now have a random color. +2021-01-04: + Crossedfall: + - tweak: The BeeStation BYOND logo is no longer festive + St0rmC4st3r: + - bugfix: Raven Shuttle now doesn't kill everyone with atmos + That0nePerson: + - rscadd: Syndicate excommunicates get a note telling them they're an excommunicate, + so they don't forget + TheFakeElon: + - code_imp: inversedir is now a global proc + froststahr: + - server: Improves extools detection for linux + park66665: + - balance: radiation now observes the laws of thermodynamics + qwertyquerty: + - rscadd: New space ambience music +2021-01-05: + Froststahr: + - bugfix: Emergency shuttle console is now indestructible. Xeno queens rejoice. + Isy232: + - rscdel: Removed exploit that allowed you to get money by buying and selling crates. + - tweak: Many single pack crates removed due to said exploit. Added bulk versions + instead for very reasonable prices. + - balance: Rebalanced a ton of crates according to math. Many crates had you paying + more for the bulk option than the single pack. +2021-01-06: + PowerfulBacon: + - rscadd: Adds missing jobs to jobs.txt on sage + That0nePerson: + - bugfix: Fixes IPC and squid mutation toxin recipes being swapped + - admin: Added logging for chemical smoke + bloons3: + - bugfix: morph cannot impersonate cameras +2021-01-07: + MNarath1: + - admin: logs the shooter and circuit name of the weapon circuit in the attack log + of the victim + Raven-Industries: + - soundadd: adds 2 new ambience tracks for detective's office + Ryll/Shaps: + - admin: Fixed an issue with player logs becoming confused when someone triggers + multiple events within one second (like being attacked by two people at the + same time) that would cause holes in the logs + park66665: + - bugfix: magboots no longer make you feel gravity in space + - code_imp: removed legacy mob_has_gravity() to reduce overhead +2021-01-08: + MCHSL, Rohesie, LemonInTheDark: + - rscadd: Reference tracking, which can be enabled via compile options; ported frontend + from tg + Naevii: + - imageadd: Updates CMO cloak sprite + - imageadd: Updates CE cloak sprite. + PowerfulBacon: + - bugfix: BOH nullspacing bug + Sinestia: + - rscadd: tiny fan to luxury shuttle poverty department + eeSPee: + - rscadd: Pet beacons! + ike709: + - code_imp: Optimized get_mob_by_ckey(). + - code_imp: Removed get_mob_by_key(). + - code_imp: Improved performance of get_hearers_in_view() by quite a bit. +2021-01-09: + Alt_Alpha9: + - rscadd: Added international garbage day, say thanks to your local janitor + That0nePerson: + - admin: Moved smoke logging to mob logs + bloons3: + - tweak: makes General Griefsky a member of the Syndicate +2021-01-10: + eeSPee: + - bugfix: pet beacons are named properly +2021-01-11: + MCterra: + - bugfix: fixed a bug with teleporting out of the cloner not updating status properly. + MNarath1: + - bugfix: crate animation looking broken + - code_imp: Move animation math into a extra proc to pre calculate it + - refactor: Adding a association list to allow easy adding of additional crates + with unique values while still keeping the amount of actual lists to a minimum. + Sarchutar: + - bugfix: AIs can now save camera locations with CTRL + 1-9 again and jump to them + later with 1-9 + eeSPee: + - rscdel: cbz, fake cbz and changeling test crates are no more + genessee596: + - rscadd: Added emergency prank tank in the clowns emergency box +2021-01-12: + MCterra: + - server: new restricted-use comms key for cross-community comms + PowerfulBacon: + - bugfix: Syndi hardsuit will now automatically engage combat mode when the helmet + is lowered. +2021-01-13: + That0nePerson, thatguythere03: + - rscadd: Adds a softshell jacket +2021-01-14: + Putnam3145: + - bugfix: Toilet loot spawners don't lag the server on server start with forced + hard dels. + Rukofamicom: + - tweak: Laws generated by Ion Storms and broken AI modules will be more impactful + on the round +2021-01-15: + Archanial: + - bugfix: Gulag shuttle AAC on metastation should be working now. + DatBoiTim: + - rscadd: Ketamine, as a Narcotic + - rscadd: Ketamine to the list of Junkie reagents + MNarath1: + - tweak: up to 5 mobs can end up in a cursed locker now + - tweak: Lockers that did not scoop up any mobs vanish after 18 seconds + - tweak: buckled mobs can be scooped up too(not AI) + - bugfix: lockerstaff now actually putting people into lockers + - bugfix: another infinit iron dublication glitch + - refactor: deleting some unneeded code + - bugfix: fixes a simple issue that lead to 25 error messages popping up in vsc + PowerfulBacon: + - code_imp: Refactors power tool code. + - bugfix: Fixes TGUI Stat Panel not working on Linux + - bugfix: Fixes TGUI Stat Panel light mode buttons being near invisible + - bugfix: Fixes TGUI Stat Panel not being scroll focused when hovered over + - bugfix: Fixes TGUI Stat Panel having a very slow update rate on certain tabs + - tweak: Names are now coloured in chat. + - rscadd: Added in a TGchat button to disable coloured names. + aguyiguess: + - bugfix: Fixed softshell jacket sprite error + eeSPee: + - tweak: You can now remove your own shoecuffs. +2021-01-16: + OceanFish1: + - bugfix: some simple mob corpses got back their old gasmasks. + Shadark: + - bugfix: you no longer can pull mulebots by buckling mobs + ivanmixo: + - tweak: minor adjustments to light and camera placements in box's medbay + - tweak: fix box's medbay disposal system + - tweak: moved intercom from the chapel window in escape + - rscadd: MediDrobe to Box medbay storage + jlsnow301: + - bugfix: CentCom finally sent the spell checker that was on back order. A large + number of typos and punctuation errors have been fixed. + - bugfix: Several mutation-related messages should now display correctly. + - bugfix: Examine text for cybernetic implants is now formatted in a readable manner. + - bugfix: Emotes should no longer contain extra punctuation like this!. + park66665: + - refactor: refactored cable and disposal pipe construction/deconstruction code + to remove ugly legacy code + - bugfix: removal of said ugly legacy code improved performance a bit + - bugfix: and fixed cable color bugs + r1ks-iwnl: + - bugfix: Sofas won't turn into chairs when dragged on your sprite +2021-01-17: + LemonInTheDark: + - admin: Chat messages that are more then text, so videos, embedded games, font + changes, etc now get wiped when the chat is reloaded + MNarath1: + - bugfix: crate animation at closing + - tweak: changing crate animation time from 2 to 3 + OceanFish1: + - bugfix: Meta's white ship now shouldn't have three firelocks at one airlock. + St0rmC4st3r: + - tweak: Upon multiple requests, the science outpost shuttle is now accessible from + roundstart. + bloons3: + - bugfix: fixed a bug with the Trashbag of Holding where it was given the same storage + as an admin spawn only item + ivanmixo: + - bugfix: You can't curbstomp or groin kick with the pacifist trait anymore + - bugfix: ghosts can no longer flip pipes + - bugfix: jaws of life can now actually force doors when first spawned +2021-01-18: + Sarchutar: + - bugfix: Cyborgs now get the ratvar laws upon conversion + - bugfix: Upon deconversion you now actually lose the ratvar language + ike709: + - code_imp: Tons of code optimizations across the board, both big and small. + - code_imp: Micro-optimized playsound() + - code_imp: A ton of other micro-optimizations. + - code_imp: Replaced get_hearers_in_view() with hearers() in many places. This may + break hearing some messages, hearing some sounds, or seeing some speech bubbles. + Please report issues on github. +2021-01-19: + PowerfulBacon: + - tweak: Tweaks the plasma canister objectives description + - balance: Sawn off shotguns have increased spread + - rscadd: Allows mechs to be emagged. + Sarchutar: + - tweak: The border firelock frame can now be walked through + - imageadd: The frame also looks more open now + ike709: + - bugfix: Foam darts can no longer be exploited. + ivanmixo: + - tweak: nightmare's light eater can now extinguish bonfires and people on fire + - tweak: Replaced most instances of old firelocks + - bugfix: AI can't cryo while dead anymore +2021-01-20: + OceanFish1: + - tweak: Added tiny fans on some space ruins. + eeSPee: + - spellcheck: Burn Kits are no longer called Bruise Kit Single Pack + - rscadd: coffee cart on Box, Delta and Pubby + - bugfix: fixed a bug with food vat not dispensing/mixing reagents properly (at + all) + yyzsong: + - balance: The heretic blade now does 24 damage instead of just 17 +2021-01-22: + LemonInTheDark: + - bugfix: Mulebots no longer go insane when shit starts to lag + PowerfulBacon: + - bugfix: clown megaphone + - bugfix: IAA agents are reported on the stat as EAA agents +2021-01-23: + ro5490: + - rscadd: Added Oozelings, a new race! + - rscadd: Added Slime Ooze (bloodtype for Oozelings) + - rscadd: Added Slime Vacuole Organ + - rscadd: Added Regenerative Ooze - Restores 0.5 Brute, Burn, Toxin, and clone damage + at 0.4u per tick. Created by combining Slime Ooze with Tricordrizine + - rscadd: Added Energizing Ooze - Boosts Oozeling's nervous system, but only shocks + other lifeforms. OD at 30u for teslium shocks. Created by combining Slime Ooze + with Teslium + - tweak: adjusted watertouch code to interact with Oozelings + - config: Oozelings are now in Roundstart Races! +2021-01-24: + 'MrLostman, thelaughingbomb ': + - rscadd: Debug tech disk, Syndicate materials closet, tier 4 brped, chief engineer + tool belt to spawn list. + - rscdel: Removed Airlock_maker.dm + - tweak: Changed events config to be set to false at roundstart. + - bugfix: fixed indentation of admin verb + PowerfulBacon: + - bugfix: fixes stat panel not showing the map + Qwertytoforty, imported by Cenrus: + - rscadd: Adds the syndicate teleporter, a mobility item that syndicate agents can + buy for 8 TC. + eeSPee: + - rscadd: Heretics have a chance to get hijack/ascend objective + - rscadd: Heretics no longer get protect objective + - rscdel: Heretics no longer automatically greentext when ascending + githubuser343: + - bugfix: BZ creation now properly limits maximum research points per reaction. + ike709: + - code_imp: The point of negative quirks is that you shouldn't be able to bypass + them. You're taking a permanent handicap in exchange for other perks. Multiple + fixes have been made to reflect this. + - bugfix: You can no longer augment a paralyzed limb. No more bypassing being paraplegic. + - bugfix: Light drinkers will treat alcohols with negative booze power as positive + booze power. + - balance: Motorized wheelchair now uses 1/4th of its previous power usage. + - balance: Brain Tumor quirk now starts with mannitol. + jupyterkat: + - bugfix: fixes radios not working in mechs + nemvar: + - bugfix: Scrubbers now stop scrubbing if their internal pressure gets too high. + ro5490: + - bugfix: Oozelings now have blood, a heart, and can be defibbed. +2021-01-25: + MNarath1: + - bugfix: weapon circuit runtime + - tweak: adds creator to weapon circuit logging + PowerfulBacon: + - rscadd: Adds in the buy 1 get 1 free syndicate uplink deal. + - rscadd: Adds in the double discount bundle syndicate uplink deal. + - bugfix: Fixes the emergency shuttles ETA string. + - balance: Buckshot - Reduced raw damage from 12.5 to 9. Decreased spread from 25 + to 10 degrees. + - balance: 'Soporific - First shot now applies 8 seconds of confusion. If hitting + a confused target, will put them to sleep for 5 seconds (Old effect: 5 seconds + sleep).' + - balance: Meteor Slug - Hard stun reduced from 8 seconds to 2 seconds. Stun is + applied if the target hits a wall due to knockback of the shell. + - balance: Frag12 - 5 seconds of paralysis reduced to 1 second. Not that it really + matters since these are generally going to be a 1 hit kill from the explosion + or at least limbs will be lost. + - balance: Rubbershot - Reduced stamina damage from 11 to 9. Reduced variance from + 25 to 20 + - balance: Incapacitating Shell - Reduced variance from 25 to 20, stamina damaged + reduced from 6 to 5 + - balance: Laser Slug - Reduced damage from 15 to 10. (This thing was ridiculous + before and actually pretty easy to make) + - balance: Shotguns - Pump-action shotguns now require the pumping hand to be empty. + - balance: Mech Scattershot - Pellet damage reduced from 24 to 18. + - balance: Slugs now have an armour penetration of -60, making them very effective + against unarmoured targets but not armoured targets. + - tweak: Makes each blood brother implant colour unique. + Victor239: + - tweak: SecHUD icons enlarged for clarity. Monitor icon now looks like an actual + eye. + francinum: + - config: Default gamemode is now a config entry. + nemvar, Dennok, Azarak, park66665: + - bugfix: recolored lights now preserve their color on nightshift + - bugfix: emergency lighting and vacuum lighting now have lighting overlay + - code_imp: light fixture now uses a non-unique mutable appearance for its lighting + overlay + park66665: + - bugfix: Fixed a few edge case bugs in case of components with multiple nodes sharing + a parent + - bugfix: Made connected canisters react properly + - bugfix: Improved pipenet code performance a little + - bugfix: fixed lighting overlays decoupling with lighting fixtures when shuttle + rotates for real. +2021-01-26: + Cenrus: + - bugfix: Abductor scientists now understand all surgery types. + OceanFish1: + - bugfix: MacSpace should be visitable now without internals required + PowerfulBacon: + - bugfix: Fixes discount display name being incorrect. + jlsnow301: + - bugfix: Punctuation fixed on IV drip bags. + nemvar: + - rscadd: something something lube... HONK + - rscadd: Added a new loot item to the lavaland clown ruin. + - rscdel: Removed the slime core from said ruin. + - tweak: The lavaland clown ruin has some new pranks ready. +2021-01-27: + PowerfulBacon: + - bugfix: Felinids can no longer play without cat ears or tail. + eeSPee: + - rscadd: Added Xenobiology Cargo Pack in Science +2021-01-28: + r1ks-iwnl: + - balance: HUD Sunglasses now need advanced sunglasses or its subtypes to be crafted + instead of normal sunglasses. +2021-01-29: + park66665, PowerfulBacon: + - bugfix: No more GODMODE shades hanging around the station, terrorizing players + and admins alike. + r1ks-iwnl: + - rscadd: Dual-port air vents now allow ventcrawling. + - rscadd: You can weld dual-port air vents. + ro5490: + - rscadd: Just a reminder, water in any form is LETHAL to Oozelings, Be careful + what you eat. + - rscadd: Oozelings are now always clean! + - tweak: Adjusted the blood volume gain from eating well, and becoming full (plus + a fullness reduce after a certain threshold is met). + - balance: Oozelings can no longer be augmented. + - bugfix: Fixed Fleshmend damaging Oozelings. + - bugfix: Fixed Rust Heretic regen damaging Oozelings. + - bugfix: Fixed medibots damaging Oozelings when trying to heal toxin damage + - spellcheck: Hyperperspiration's description now reads "extinguishing small fires" + instead of "extnguishing small fires" +2021-01-30: + OceanFish1: + - rscadd: New away mission + - rscadd: New mobs and items for new away mission + - soundadd: added few sounds for away mission mobs and ambience + - imageadd: added icons for a lever-action shotgun, tactical sunglasses and some + mobs + - code_imp: made gatling laser emaggable + - config: added The Factory to away missions + jlsnow301: + - spellcheck: Fixed a typo in angry hearts (they're real!) +2021-01-31: + AnturK: + - admin: Admins can now modify traits + Coldud13: + - tweak: Improves cryoxadone flavor + Crossedfall: + - config: Movement delay on Golden is changed to 1.5, making it the same as Sage. + Evankhell561: + - rscadd: Dominant Black Extracts! + - rscadd: Grey - Slimes split into one additional slime + - rscadd: Orange - Slime ignites players with one stack of fire when electrocuting + them + - rscadd: Purple - Slime regenerates HP faster + - rscadd: Blue - One original color slime will always remain after splitting + - rscadd: Metal - Slime has 30% extra max HP + - rscadd: Yellow - Slime gains electric charge much faster + - rscadd: Dark Purple - Slime rapidly converts atmospheric plasma to oxygen, healing + in the process. + - rscadd: Dark Blue - Slime takes greatly reduced damage from exposure to water + (50% less) + - rscadd: Silver - Slime no longer loses nutrition over time, and is no longer able + to feed. + - rscadd: Bluespace - Slimes will teleport to targets when they are at full electric + charge. + - rscadd: Sepia - Slime moves 30% faster + - rscadd: Cerulean - Slime splits into two identical adult slimes with half hunger + when it reproduces. Always 0% mutation chance. + - rscadd: Pyrite - Slime always splits into totally random colors, equal chance + for every slime type except rainbow. Can never yield a rainbow slime. + - rscadd: Red - Slime does 10% more damage when feeding and attacking + - rscadd: Green - Slime can completely consume corpses after death for a little + extra nutrition + - rscadd: Pink - Slime gains and will prefer to speak in common. + - rscadd: slime extracts can now be sold in cargo. + - rscadd: Gold - Slimes may be sold to cargo for extra money. + - rscadd: Oil - Slime douses anything it feeds on in welding fuel. + - rscadd: Black - Slime is nearly transparent. Slime is fully visible while feeding. + - rscadd: Light Pink - Ghosts may possess the slime at will, added to spawners menu. + - rscadd: Rainbow - Slime randomly changes color periodically. Reproduction follows + mutation chances of the current color + MCterra: + - rscadd: Newscasters join the insecure comms family + - server: More config options for insecure comms + PowerfulBacon: + - tweak: Targeted spells now give you a click ability rather than a dropdown list + of targets. + - tweak: The cooldown on spells is now on top of the button. + - bugfix: Fixes energy bolas being uncatchable. + - balance: Buffed shotgun slugs to -20 armour penetration instead of -60 + - tweak: Felinids no longer take fall damage when falling across z-levels. + - bugfix: Fixes delta stations pool being in space + - rscadd: Oozelings dissolve into the pool + - bugfix: Items are dropped from people who dissolve in the pool. + - bugfix: Fixes pool noodles being cleanable + - bugfix: Fixes admins being unable to bypass popcap. + PowerfulBacon, KMC, Cdey: + - rscadd: Swimming pools + francinum: + - config: Bluespace miner is now affected by config. Golden has two miners and cannot + research more. Sage has no miners and cannot research more. + froststahr: + - bugfix: Purged parts of gas mixes that don't follow the warning linda_turf_tile.dm + warns you not to + - bugfix: Also missing temperatures is apparently bad too, and has been corrected + githubuser343: + - tweak: Floor tile ripping due to decompression now half as likely. + park66665: + - bugfix: you can now see space tiles' panel + - bugfix: admins (or people with perms) can now use mapping debug verbs that requires + enabling + r1ks-iwnl: + - bugfix: Ventcrawling in dual-port air vents actually works now. + ro5490: + - rscadd: Oozelings now have their own sprites, although they arent that different + from what they where before. + - bugfix: Ooze sprites no longer have leg clipping issues +2021-02-01: + Arkatos, Sarchutar: + - rscadd: All Abductor machines now use tgui. + - tweak: Only the abductor scientist/agent can now interact with the abductor console + (not the camera console) + PowerfulBacon: + - rscadd: Added a lava moat between the security station glass on the gulag. + - rscdel: Remove the plasmaglass from the gulag. + - rscadd: Added a window to see what you are smelting. + Victor239: + - tweak: Poppies now spawn in maint loot. + - rscadd: Poppy pins can be crafted and give a very small mood buff when worn. + - tweak: Shanks are now a subtype of knife, allowing it to be used by heretics to + create their sickly blade. + - balance: Most window integrity is now halved, which is still double what it was + pre-fastmos. + eeSPee: + - tweak: Heretic' Living Heart no longer has a range limit + - rscadd: Mansus grasp now always silences for 3 seconds + - balance: Made the recipes for curses a bit easier + - rscadd: Rust blade now deals tox damage, the lower the heretic's health, the more + damage it deals. + - balance: Rust ascension now makes you spaceproof + - bugfix: Fixed multiple bugs around adding/deleting citations + park66665: + - bugfix: rainbow slimes can now exist +2021-02-02: + TheFakeElon, bloons3: + - rscadd: Adds an adminbuse species conversion chamber + froststahr: + - balance: wizard demons have been capped to one each +2021-02-03: + Victor239: + - bugfix: Poppies can no longer be freely generated from poppy pin crafting. + ivanmixo: + - tweak: xenomorphs now break firelock window shutters instead of opening them + park66665: + - bugfix: Hardened npc subsystems so mobs are less prone to freeze completely and + irreversibly +2021-02-04: + Archanial: + - tweak: You can take out lighter with alt. + Nari Harimoto: + - bugfix: fixed thermomachines still working even without power, apc off, in space + etc... + OceanFish1: + - balance: Replaced some things on The Factory away mission. + eeSPee: + - bugfix: a changeling related fix + super12pl: + - rscadd: Hot Chocolate now works like chocolate. +2021-02-05: + PowerfulBacon: + - tweak: You can now click on things while in throw mode if you aren't actually + throwing anything + - rscadd: Adds in team tracking beacons for nukies and ERTs + - rscadd: Nukies and ERTs can now see the location of their teammates. + - rscdel: Ancient sound synth. + silicons: + - bugfix: modular id consoles are now sanitized +2021-02-06: + Cenrus: + - rscadd: Added a turret control panel to the nuclear shuttle + PowerfulBacon: + - tweak: General Greivsky from nullcrates is now resistant to EMPs. + park66665: + - bugfix: mob GC is improved + - rscdel: slime harddels + - bugfix: Wild West away mission runtimes at load have been removed +2021-02-07: + Rukofamicom: + - bugfix: Atropine now stops working at 20 HP as intended + - bugfix: Hepanephrodaxon now has its correct metabolization rate + timothyteakettle: + - bugfix: newscaster sanitization go brrr + yyzsong: + - tweak: Plasma is now spicy +2021-02-08: + Melbert: + - rscadd: You can now make beds with blankets. + - rscadd: You can now tuck plushes into bed. + - rscadd: You can also tuck the nuclear authentication disk into bed. + PowerfulBacon: + - balance: Love potion now heals when near your date. + - balance: Makes /obj/item/slimepotion/speed only reduce speed by 50% + githubuser343: + - balance: Removed bolt of change from Chaos Carp. +2021-02-09: + Melbert: + - bugfix: Fixes railings blocking bullets and immovable rods from a certain direction. +2021-02-10: + Archanial: + - tweak: Guns are bigger. + - tweak: Energy guns can fire a bit more before depowering. + MNarath1: + - rscadd: coffin animation + - tweak: angle of crate animation + - tweak: freezer sprite and animation parameter + - bugfix: some crate sprites breaking animation + - tweak: use icon_door_override to allow for removal of unnecessary sprites + - tweak: changing crate sprite names for consistancy + - rscdel: unnecessary sprites after using icon_door_override whenever possible + PowerfulBacon: + - tweak: Grilles now take damage when a mob bumps into them. + bloons3: + - tweak: Modified Brig Physician access permissions and roundstart items + - balance: Made the Brig Physician a proper civilian, which means eligibility for + antags + - balance: rebalanced bluespace miner + 'cacogen, Ryll/Shaps, Moccha-Bee, Dennok, ': + - rscdel: Old medbay clean bots + - rscadd: Scrubs MD added to Meta, box, donut, pubby, kilo and delta + - rscadd: Scrubs MD now give doctors access to it. + - tweak: The station's new Orion Trail arcade machines now detect certain antisocial + behaviors and can warn security and medical personnel about unhinged gamers. + - tweak: Updated material_container.dm + carlarctg: + - rscadd: Reduced firefight carry delay with latex or nitrile gloves + jupyterkat: + - bugfix: fixed weird announcement text renderings +2021-02-11: + githubuser343: + - balance: Oozelings are no longer part of slime faction. + park66665: + - bugfix: species-specific attack mechanics now correctly happen based on attacker + - bugfix: landmines no longer gets activated by flying objects (e.g. projectiles, + throwing things, etc.) + - bugfix: pools no longer teleport people in and out + - bugfix: monkeys can now retaliate better + - bugfix: AI slime attacks no longer transcend borders +2021-02-12: + EdgeLordExe, EOBGames, ShivCalev, Rohesie, Tad Hardesty, ATHATH, and eeSPee: + - tweak: Tears in reality no longer inflict brain damage when analyzed, instead + just give a bad moodlet + - tweak: Revised reality tears generation + - tweak: Tears in reality appear after a time, and slowly disappear after 15 minutes + - tweak: Coders rule, jannies drool + - balance: Heretic effects (runes, tears) are invisible to silicons + - spellcheck: Names and descriptions have been revised, thanks to @EOBGames + - balance: Heart now offers a pick between 3 targets + - balance: Doubled the charges sacrifices offer + - balance: Heretics marks area work differently; marks are applied by grasp, and + triggered with the blade + - balance: Ash grasp blinds instead of knockback + - tweak: Rust spread datum is revised/optimized + c420-o, TWATICUS, Dawson, Suicidal Maniac, BeloneX: + - rscadd: swag outfit available in beecoin shop + - rscadd: swag shoes availble in beecoin shop + ike709: + - bugfix: Null clients are now less likely to completely break roundend. + - bugfix: Fixed some internal affairs objective code just... not working. + - bugfix: Fixed two ambience runtimes. + - bugfix: Radios will no longer runtime when we can't get their turf. + kit-katz: + - tweak: Oozelings are now fully and properly translucent +2021-02-13: + PowerfulBacon: + - bugfix: Fixes valentine cards not working correctly. + - bugfix: Fixes only 1 person receiving valentine objectives. + Totally Not Bacon: + - rscadd: Improves valentines day, gives ai proper valentines laws. + - tweak: You can now send a card to someone by writing their name on it with a pen + eeSPee: + - balance: Heretics no longer require the Codex to lay runes, instead they can lay + runes using their Mansus empowered hand. +2021-02-14: + park66665: + - bugfix: pool item attack verb + - bugfix: a vox-related error related to announcement help verb has been rectified; + there might be other bugs that has been fixed by this. + - bugfix: leftover gears sometimes failing to spawn + - bugfix: reactions at pipelines are less willy nilly + - bugfix: advanced surgery tools' examine texts are saner +2021-02-15: + Arkatos and actioninja: + - rscadd: RCD Access Control now uses tgui. + - tweak: RCDs are now able to set unrestricted directional access for newly built + airlocks. + Cheesus, ShizCalev, coiax: + - rscadd: Cryotube extinguishes a burning occupant when they are ejected by the + machine. + - code_imp: Comments around cryo cell code + - rscadd: Cyrotubes now alerts and stops when the tube has no beaker, reagents or + enough moles. + - tweak: changed how much is used and how much is magically transferred to the occupant + - tweak: Pyroxadone's metabolization rate is now variable, dependant on heat. + - bugfix: fixed reagents not being injected into an occupant properly. + MCterra10: + - bugfix: brig phys locker can be opened again + MNarath1: + - bugfix: border firelocks holding Pressure after destroy + - bugfix: window doors holding Pressure after destroy + eeSPee: + - rscadd: laughter now has positive mood effects and reduces knockdown on people + recently slipped + - rscadd: Holobarrier projectors and barrier grenades to SecVendors + - rscdel: Holobarrier projectors from various sec lockers + ike709: + - bugfix: Maybe fixed slimes sporadically no longer eating. Report it on github + if this is still an issue. + park66665: + - bugfix: Prize from Orion Trail is no longer broken + - bugfix: Disease from rat is no longer broken + - bugfix: Bar emergency shuttle's bar table now properly boots unauthorized people +2021-02-16: + Blueturbo47: + - rscadd: Gas Miners, now in every map + park66665: + - bugfix: fixed a cause of pipe harddels. + - bugfix: Engineering PDA catridge's APC monitors power percentage display + - bugfix: Crusher trophy's examine text is now sane + - bugfix: RCDs with a silo link now work properly + - bugfix: Ash walker tendril now applies mood properly + - bugfix: Fixed a memory leak related to TGUI Stat panel + - code_imp: range, view and their related high-cost procs' usages have been audited + - bugfix: above audit should improve performance, but there might be bugs. Please + report bugs to GitHub. + park66665, Timberpoes: + - bugfix: fixed a few bugs around modular computers + - bugfix: RnD console sheet ejection now works properly + - bugfix: mining point card's examine text is no longer broken + - code_imp: removed obsoleted GLOB.materials_list +2021-02-17: + PowerfulBacon: + - code_imp: Improves clockie code to allow for scripture generation if spawned on + a non-clockie round. + TheFakeElon: + - rscadd: adds the labor camp monitoring vault door + park66665: + - bugfix: hotfixed some UIs not opening + - bugfix: hotfixed mining scanner not working properly + - bugfix: AI's wipe core verb now functions properly and no longer breaks random + stuff afterwards + - bugfix: Blob overmind's stat tab no longer errors at pre-core-blob-placing + - bugfix: Fixed a few more ambience related runtimes + - bugfix: Fixed an issue at "no prisoner left behind" crew objective + - bugfix: Prevented changelings from losing powers after Last Resort + - bugfix: Dead AIs no longer cause living things to be broken code-wise + - admin: Fixed a small visual bug that prevented some note severity icon images + from showing up at the note browser UI +2021-02-18: + That0nePerson, CommandBlockGal: + - rscadd: Re-adds apid dash! Can no longer knock over people or jump tables. + - rscadd: Adds honeycomb crafting for apids! Can be turned into 2 wax when empty. + - rscdel: Removes ability of apids to fly in low gravity. + - balance: for balancing, apids downsides have been changed. 1.5x burn and tox damage, + 1.25x stam damage, and they pass out in smoke and cold + - rscadd: Adds wax and wax floortiles + - rscadd: Gives apids an inert mutation that allows them to produce wax + francinum: + - balance: Slimepeople are only allowed to have 10 total bodies, for performance + reasons. + - config: This can be configured. +2021-02-19: + Blueturbo47: + - bugfix: renames an emoji away from a filtered word + Froststahr: + - bugfix: Pubby SM won't delam itself + MNarath1, JamieD1, Redmoogle: + - bugfix: Repainted airlocks sometimes missing the moving parts, or having wrong + animation + - bugfix: Exploit allowing cult to disguise their airlocks with airlock painter + - tweak: Disallowed repaint of large airlock and hatches + - refactor: Changes code to use the assoc list for airlock repaint choosing +2021-02-20: + Naevi, Victor239: + - rscadd: Adds black bishop suit,mitre and cloak to beecoin shop + - rscadd: Adds bishop cloak to hacked chaplain vendor + - tweak: Updates bishop suit and mitre + PowerfulBacon: + - rscdel: Removes :p and :d admin say modes. + bloons3: + - rscadd: Added an air alarm to the Morgue on Box Station + - rscadd: Added vent scrubbers and vent pumps to autopsy rooms + githubuser343: + - bugfix: Private cargo crate purchases no longer ignore access restrictions. + park66665: + - bugfix: Fixed weighted picking logic, so various codes utilizing weighted pick + is now a bit more safe and correct + - bugfix: The most prominent of such cases would be preventing random maint rooms + from not spawning once in a while +2021-02-21: + Cenrus: + - bugfix: The eminence can no longer nuzzle things + - bugfix: The eminence can no longer select itself + - bugfix: The eminence can no longer pull other mobs + - bugfix: The eminence now teleports to random locations on the station, instead + of the core + - rscadd: The eminence teleport has a sound effect and a flash of color + - tweak: The eminence has a "Master" prefix on the hierophant network + - tweak: Tweak ark of the clockwork jusiticiar description + MNarath1: + - bugfix: Fixes morph becoming invisible and unclickable if it tries to disguise + as an airlock + - bugfix: Fixes computer screen and apc screen not showing in disguise + Naevii: + - imageadd: Updates herald sprites and animations + - imageadd: Updates Prophet cloak sprite + PowerfulBacon: + - bugfix: Infinite TC exploit. + - rscadd: Clockcult weapons will now automatically wield when you pick them up. + - balance: Phazons can no longer phase into areas with the no_jaunt flag. + - balance: Clockwork walls are no jaunt proof. + - balance: The celestial gateway has had its health buffed from 400 to 1000 + - balance: Clockcult armour has been significantly buffed, previously it was very + weak and made when I poorly understood general armour values. + - balance: Marauders no longer automatically repair their shield and require a welder + to repair + - balance: Linked abscond now has a cooldown of 3 minutes + - balance: Abscond now takes 2.5 seconds instead of 3.5 seconds to invoke. + - balance: Abstraction crystal health buffed from 100 to 200. + - balance: Clockwork armaments cost reduced from 250 to 150 + - balance: Dimensional breach cost reduced from 10000 to 5000 + - balance: Interdiction lens range increased from 3 to 5 + - balance: Interdiction lens now EMP mechs rather than use power. + - balance: Ocular warden cost reduced from 500 to 400 + - balance: Prosperity prism active power used decreased from 4 to 2 per tick. + - tweak: Sentinel's compromise now plays a sound on use. + - balance: Sigil of vitality power cost reduced from 400 to 300 + - balance: Sigil of vitalities will now turn people into cogscarabs rather than + just husking. + - balance: Stargazer power cost reduced from 600 to 300 + - balance: Marauder cost reduced from 8000 to 2000. Vitality cost increased from + 80 to 100. + - balance: Vanguard no longer stamcrits you after use. + - tweak: eminence can break lightbulbs + - tweak: Eminence can use APC UI. + 'Tlaltecuhtli ': + - tweak: Lava damages contents of containers + eeSPee: + - rscadd: Added crucifixes to chaplain's witch hunter set, which wards against curses. + - rscadd: Added rosary beads, which work similarly to crucifixes; available at chaplain + vendor and religious supply packs in cargo. + park66665: + - bugfix: atmos machines that operates with external air now no longer try to function + in walls and other closed turfs and cause unending errors and ridiculous results + - bugfix: closets now properly react to revenant's Malfunction ability + - bugfix: changelings no longer experience problems for having suit powers and then + transforming to and fro human + - bugfix: wire-on-catwalk check for swarmers now works properly + - bugfix: Revenants can now use Revenant Transmit ability + - bugfix: Dead midwife spiders no longer can communicate + - bugfix: AI controlled morphs should no longer disguise as light itself and be + un-click-able. +2021-02-22: + Mat05usz: + - bugfix: Area mood description is now written in red if it gives you negative mood. + - bugfix: Mood changes are now properly updated when walking between areas that + alter it. + bloons3: + - rscadd: Adds a cautery and surgical drill to CentCom +2021-02-23: + Archanial: + - tweak: Skinsuits are now a subtype of hardsuits. + - rscdel: Skinsuits no longer appear in internals boxes and you cannot fold them. + - rscadd: Skinsuits now have integrated helmets. + - tweak: Skinsuits are as big as every other space suit now. + - tweak: Skinsuits appear in o2 (blue) lockers. + Froststahr: + - config: Disables "Extended" on Sage (Secret Extended is still enabled) + Mat05usz: + - bugfix: 'Metastation: Kitchen Coldroom is under Kitchen area and can finally be + depowered.' + - bugfix: 'Metastation: Cryogenics 4-way manifold is visible again.' + bloons3: + - tweak: Security is incentivized to wear their uniform + - tweak: Assistants are rewarded for obtaining their shinies + francinum: + - config: Jobs no longer load from the txt file, This should hopefully solve some + issues related to insufficient spawners. + - tweak: firelocks now actually stay open for a bit when forced. + githubuser343: + - rscadd: You can now use a shovel directly on stacks of grass tiles. + ike709: + - server: Added Topic() calls for getting/adjusting metacoins. + nemvar, Tlaltecuhtli, Naksu, Skoglol, Dennok, Denton81, FlufflyCthulu, Jessica, kittymaster0, Garen, park66665: + - tweak: Slimes now lose internal reagents over time. + - code_imp: Replaced most instances where cables referenced their maximum size with + a define + - bugfix: Turned off energy weapons can no longer do sharpness-requiring actions. + - refactor: get_eye_protection and get_ear_protection now looks less ugly. + - refactor: Refactored the visibility of reagents for mobs. + - code_imp: Health sensor no longer displays a giant window with 1 button on it, + instead can change states with alt click and use in hand. + - bugfix: fixes Russian helmets not holding both a vodka and a glass. + - bugfix: Fixed some examine messages. + - bugfix: Fixes even more examine messages. + - refactor: Slightly refactored blob examine code + - bugfix: Fixed a slime runtime. + - bugfix: Cable layer work again. + - bugfix: Incomplete and non-teleport reactive armors can no longer be used to complete + the traitor objective. + - bugfix: Fixes an issue with clown hulk simple mobs + - bugfix: added --geo-bypass for youtube-dl command + - rscadd: gives scientists a chance to spawn with an awesome tie + - bugfix: Stasis lets reagents know processing was stopped, fixing some issues. + - tweak: Amanitin's damage only triggers when it is completely removed from your + system, not when processing stops. + - bugfix: Fixes being able to pull from belt/backpack when you are stunned or cuffed. + park66665: + - bugfix: fixed pAI OS background image not showing +2021-02-24: + Archanial: + - admin: removed ability to ban players from specific gimmick roles; old bans will + still be enforced. + Evan & Naevi: + - rscadd: Dominant Bluespace Extracts + PowerfulBacon: + - balance: Circuit comms receiver can no longer jam comms. + - balance: Circuit comms receiver requires encryption keys. + - rscadd: Adds movement sounds to IPCs + - rscadd: Adds movement sounds to riot suits and deathsquad armour + Sinestia: + - balance: Abductors can no longer teleport into the AI satellite. +2021-02-25: + Evankhell561: + - rscadd: a real microwave to the bluesbace room. + MNarath1: + - tweak: Transforms you back on death when you are transformed trough a golden slime + pylon + - bugfix: Fixes the old body suffocating while inside the content list of the simple + mob while being transformed by golden slime pylon + - bugfix: Fixes another bug with golden slime pylon that could lead to you not transforming + back after leaving its range + - refactor: Changes the processing code a bit to remove a redundant loop for golden + slime pylon and some redundant checks + - bugfix: Gold slime pylon transforming someone into an invisible animal + Sarchutar: + - rscadd: Camera implant which inserts a camera into you. Admin only at the moment. + Timberpoes: + - bugfix: The security camera console will now correctly track when viewing moving + cyborg cameras. +2021-02-26: + Crossedfall: + - config: Heads of Staff can no longer be antags on Golden + Naevii: + - imageadd: Updated HoS greatcoat. + Rukofamicom: + - tweak: Warping Gold Crossbreeds have temporarily had their loot table neutered + Thebleh, Sarchutar: + - bugfix: Cyborgs can cancel surgeries, which are past the first step, with drapes + and a cautery again. (They have to be on harm intent to do it) + bloons3: + - bugfix: You can no longer roll a Die of Fate multiple times before the first roll + takes effect + park66665: + - bugfix: transmutation rune drawing process no longer is incorrectly explained + in-game. + plapatin: + - rscdel: deletes null crates +2021-02-27: + Archanial: + - tweak: Input bar is now under chat. + - rscadd: Help button is back on paper. + bloons3: + - rscadd: Adds Brig Physician permission node (ACCESS_BRIGPHYS = 34) + - tweak: Gives Brig Physician somewhat exclusive access to their medical supply + locker + - rscadd: Brig Physician permission is applied to relevant areas on maps + - tweak: Other minor access control changes around Brig/Brig medical areas +2021-02-28: + francinum: + - balance: Neat moodlet integrated into standard behavior + - balance: To go along with that, the relevant moodlets have been adjusted. + - tweak: Hygiene visual effect only happens when you can't get any dirtier + - code_imp: Hygiene no longer generates miasma +2021-03-01: + park66665: + - bugfix: fixed progress bar not showing up when removing transmutation rune + - bugfix: SSgarbage entry now shows up in the TGUI stat panel's MC tab. +2021-03-02: + PowerfulBacon: + - balance: Mining armour is now weaker in high pressure environments. + - bugfix: You can no longer cremate Indestructible items. + - bugfix: Gimmick positions now have overhead chat colours. + - bugfix: Gimmick positions now have chat colours. + - bugfix: Gimmick positions now have a title in the job selection menu. + eeSPee: + - rscadd: Mask of madness is available to ash path, replacing curse of blindness! + r1ks-iwnl: + - bugfix: Virologist PDA starts registered with your account. + - bugfix: Necropolis seed stealth 8 threshold actually drops a chest and doesn't + just gib you. +2021-03-03: + PowerfulBacon: + - bugfix: Gimmick highlighting respects no chat colours. + kit-katz: + - bugfix: damage overlays no longer disappear once you deal too much damage +2021-03-04: + Cenrus: + - bugfix: Returned wig and sailor outfit to the autodrobe + francinum: + - bugfix: Cult forcewalls now properly expire + ivanmixo: + - bugfix: fixes some code warnings + park66665: + - code_imp: cleaned up creation arguments of forcefields + yyzsong: + - balance: Berets and Beanies are now 'small' sized +2021-03-05: + Archanial: + - tweak: Crystalized cerulean pylon only spawns 3 crystals at the time. + - tweak: Each crystal takes twice as long to grow than before. + - tweak: Each crystal only drops poly-crystal upon reaching state 4 (only 1 amt) + or 5 (randomly chosen between 1 ~ 3 amt). + Froststahr: + - rscadd: HoP now has a file cabinet on meta + Rohesie, LemonInTheDark, spookydonut: + - code_imp: Ports the TGMC timer cooldowns system. + - bugfix: Fixed stealth implants not properly boxing the user, and doors not shocking + - refactor: Renamed COOLDOWN_CHECK to COOLDOWN_FINISHED + - bugfix: Abductor implant now reports the correct remaining time until it can be + used again. + tralezab: + - admin: New Adminbus button- Ghost Pool Protection! It lets you enable and disable + which sources ghosts can rejoin the round, minus their physical bodies getting + revived. +2021-03-06: + ArcaneDefence: + - rscadd: Mothmen now get upset when their wings get burned :( + KagiyamaWeb: + - rscadd: INCORPOREAL_MOVE_EMINENCE to mob_movement.dm, eminence.dm and __DEFINES/mobs.dm + Sarchutar: + - rscadd: Medical cyborgs can insert organs with the organ storage bag into a smart + organ storage + TheChosenEvilOne, Rohesie, IndieanaJones, Mothblocks, Qustinnus: + - rscdel: Removed high population override from dynamic. + - bugfix: Fixed abductors being listed at round end on Dynamic despite none existing + - bugfix: Dynamic abductors should no longer be split up between two different ships. + - bugfix: Dynamic can now be configured when made the forced secret mode. + - tweak: dynamic threat reports are no longer perfectly accurate, they diverge and + are sometimes downright wrong. + - rscadd: Dynamic now rolls a separate budget for round start and midround antagonists, + meaning less round start antags will roll in favor of more midround ones. + - admin: The antag_cap value now uses an equation that scales with population, rather + than a fixed array. + - admin: autotraitor_cooldown now uses deciseconds rather than ticks, so the older + value of 450 now means 45 seconds. Set it to be 9000 if you want it to be accurate + to the old value (15 minutes), or simply unset it. + - admin: Midround/latejoin dynamic timers are now configurable. + - admin: Syndicate Sleeper Agent will now give details when ti fails. + - bugfix: The autotraitor cooldown now respects configuration, rather than resetting + back to 15 minutes after it is rolled. + - bugfix: Fixed dynamic parameters not checking the configuration. This means that + Manuel will now have slower midrounds, as was intended. + - rscadd: you can now cast rituals on dynamic if the threat level is 100 + - bugfix: Fixed multiple high impact rulesets being chosen on Dynamic. + - bugfix: Midround dynamic injection no longer has a 100% chance of activating. + - rscadd: Dynamic will now play a part in controlling random event antagonists. + If a dynamic midround injection is coming too soon, or too early, then the next + midround injection will be buffed. Otherwise, it'll spawn normally. + - admin: Admins can now cancel or replace midround rulesets. + - bugfix: Admins can now correctly force midround rulesets. + TiviPlus, BeloneX: + - server: Add maximum recommended version of byond + bluezorua: + - rscadd: Tiny fans to a mining and science shuttles + eeSPee: + - bugfix: Fixes Mask of Madness not having cost +2021-03-07: + Archanial: + - tweak: Billy club is now only available in sec vendor. Sec officers no longer + spawn with it. + - balance: Sec belt slot count decreased by 1. + Mothblocks: + - bugfix: Forcing roundstart rulesets should now work properly. + PowerfulBacon: + - code_imp: Replaces some teleporters forceMoves with do_teleports. + - refactor: Noteleport refactor + - bugfix: Abductors can teleport again. + WondaMegapon, Sarchutar: + - rscadd: Telecommunication machines now use a TGUI based interface + - rscdel: Removed HTML based telecommunication machine code + - balance: Telecommunication machines can have their interfaces viewed without a + multitool + - server: Telecommunication machines now log changed settings + francinum: + - bugfix: Rod subtypes now properly merge + park66665: + - bugfix: Ghosts can no longer dance with the music and be stuck horribly + - bugfix: Fixed a bug where pressure plates sometimes don't activate traps + - bugfix: pAI on bot no longer makes languages willy nilly + - bugfix: floorbots no longer cause an infinite source of removed tiles + - bugfix: floorbots is a bit less dumb + - bugfix: CPU usage of floorbots has been reduced + - bugfix: telecrystal, bluespace polycrystal, conveyor belt, and carpet stacks now + properly merge with its own respective subtypes + - bugfix: high-traction floor tile stacks no longer merge between different colors +2021-03-08: + Evankhell561: + - tweak: AI-controlled slimes that have a master no longer attack their master + ExcessiveUseOfCobblestone, Caldony, Archanial: + - rscadd: Sects! + - rscadd: Technophile and Ever-burning Candle sects! + - rscadd: Every chapel has now altair of gods which allows you to create sect and + perform their specfic rites or make sacrifices that appease the gods. + Mat05usz: + - tweak: 'Synthflesh unhusking is more intuitive: if current amount in the body + + amount being applied is >=100, unhusk.' + ike709: + - bugfix: Telepathic messages are chat filtered. +2021-03-09: + ATHATH: + - balance: The Summon Equipment spell, which formerly asked you to choose between + its two possible effects whenever you casted it, has been split into the Summon + Combat Equipment and Summon Ritual Dagger spells. + - bugfix: Summon Combat Equipment can now only be used on cultists, as its description + implies. +2021-03-10: + Froststahr: + - rscadd: Pools have been deployed to Boxstation and Metastation. + Hollandaise: + - bugfix: Made Box mining dock a proper advanced cycling airlock and stopped it + from plasmaflooding itself + KazooBard: + - rscadd: Added baguette blade and it's pouch + - rscadd: Added french baguette which is the heirloom baguette for the mime. Unlimited + bitesize + LemonInTheDark, Azarak: + - bugfix: Dog beds are now properly tagged, and if your pet bites the dust, the + bed will be kept in their memory. + - bugfix: Pre-owned beds now retain their predetermined flavor text. + - bugfix: Fixed garbage collection of ghosts and lobby players, making the game + run faster. + - bugfix: Fixes a very rare edgecase that could cause spawned ghosts to be unable + to move. + PowerfulBacon: + - bugfix: Warp cubes and fulton kits no longer delete their user. + - refactor: Refactors stamina armour, makes stun batons and most stunning weapons + check stamina armour rather than melee, laser or energy interchangeably + - rscadd: Christmas hats now provide minor armour on christmas. + - rscadd: You can now see how well something will protect from stamina based damages + by examining it. + Vexylius: + - config: Assistants don't have maintenance access on Sage anymore + froststahr: + - tweak: Hiero no longer skips its main attack if you're in melee range + ivanmixo: + - bugfix: No more floating camera on Box's Aux Tool Storage + - tweak: Pimpin' ride no longer obstructs Box's Custodial Closet's airlock roundstart +2021-03-11: + ghost: + - bugfix: Constructs do not count as having arms or legs for purpose of vehicle + driving. + githubuser343: + - bugfix: Trays now properly cleanup after non-repeat harvest plants were harvested. + - bugfix: Weeds overtaking a tray start at same age as freshly planted seeds. + jupyterkat: + - code_imp: removes bad helpers +2021-03-12: + Cenrus: + - bugfix: removed a rogue closing square bracket from modular computer examine +2021-03-13: + Archanial: + - rscdel: Removed freezer from metastation kitchen backroom. + Arkatos1, r1ks-iwnl: + - bugfix: Changelings will now show correct ID job icon on security huds upon transformation. + - bugfix: Changeling flesh disguise IDs will now properly show overlays upon examine. + - bugfix: Changeling flesh disguise will now properly include suit storage slot + item, if there is any. + Hollandaise, Nebulacrity, LemonInTheDark, Flareguy, smallveggiepaws, Mothblocks, Twaticus, uomo91: + - tweak: You can now see if syringe guns are loaded just by looking at them. + - tweak: Flamethrowers produce light. + - soundadd: Flamethrowers play a sound when activated, syringe guns also make sounds + when reloaded. + - imageadd: Flamethrowers now have an animated inhand sprite. + - imageadd: Wood planks, bedsheets, advanced extinguishers, and airlock painters + now have inhand sprites. + - imageadd: New telescopic baton and singularity hammer sprites. + - imagedel: Old telebaton sprites. + Mat05usz: + - tweak: Welder fuel tanks now explode with a power dependent on the amount of fuel + stored. +2021-03-14: + DatBoiTim: + - rscadd: High calcium intake can have adverse affects + - rscadd: Milk Has An Overdose where it metabolizes into bone hurting juice +2021-03-15: + Archanial: + - tweak: Brig physician is medical job now. + PowerfulBacon: + - bugfix: His grace can no longer be pulled. + - bugfix: You can no longer flash blind people. + - bugfix: Fixes suit movement sounds. + That0nePerson: + - rscadd: Added anesthetic tank holder! Portable tank holder allowing for much easier + anesthetization of patients. + - rscadd: Added quick latex glove box! Allows for quick switching of gloves, to + keep your hands sterile. + - rscadd: Added sinks to a few operating rooms that did not have them, for surgery + tool washing. + bobbahbrown, Rohesie, Mothblocks, Azarak, LemonInTheDark, Wayland-Smithy, Couls, nightred: + - rscadd: New overhead chat ported from TG. + - rscdel: Old overhead chat is gone. + - bugfix: Overhead chat doesn't render under plants. + - rscadd: Overhead chat for non /living. + - rscadd: New in client preferences regarding visibility of the chat, chat displaying + emotes and maximum length of the message. + - tweak: More UI elements will now be displayed in a non-blurry font. + francinum: + - admin: Crew Transfer Shuttles cannot be recalled. + ivanmixo: + - tweak: felinids now have the meows verb +2021-03-16: + Archanial: + - bugfix: Clockcult invocation is no longer being spoken on radio. +2021-03-19: + Naevii, TheFakeElon: + - imageadd: Adds a heap of new cosmetic items + - rscadd: Adds a donator category in the beeshop + - config: config for donator items + Rukofamicom: + - tweak: Zombie powder is now a delayed activation stamina toxin that triggers a + fake death once the victim is in a deep stamcrit + bloons3: + - admin: Security Cell doors log relevant changes made to timers + eeSPee: + - tweak: AI Eyes jump to shell when it disconnects + ike709: + - rscdel: Reverted the donor shop due to bugs. + jupyterkat, mrdoombringer: + - admin: admins can now edit the delays for reversing supplypods + - admin: The supplypod menu no longer sucks + - imageadd: new supplypod icons + - imagedel: old supplypod icons + - refactor: refactored supplypods code + qwertyquerty, Merct: + - rscadd: Music when nukies declare war + r1ks-iwnl: + - bugfix: Shields can't take stamina damage. +2021-03-20: + Archanial: + - rscadd: You can now throw pets. + FlamePrince, JJRcop: + - tweak: IPCs are pulled into their body when repaired. + MisterMecky: + - bugfix: Styptic powder and Silver Sulfadiazine now properly only apply via patches + and med sprays + PowerfulBacon: + - bugfix: Scout guardians can no longer teleport things while scouted. + eeSPee: + - bugfix: Fixed gardener service module from harvesting plants with the plant bag. + kit-katz: + - rscadd: Oozeling mutation toxin + - tweak: Krokodil's withdraw transformation only applies to humans and felinds. + Other races just get injured badly + - balance: Oozelings now enjoy eating EVERYTHING* that can be eaten. God help us + yyzsong: + - spellcheck: Fixes a typo in battle royale supply drops +2021-03-21: + Archanial: + - tweak: Replaced tiles in metastation freezer room with less cold ones. + - rscdel: Removed roundstart cold tiles and replaced them with /freezer tiles. + TheFakeElon: + - rscadd: Adds donator items in the beecoin shop, for real this time. + ikalpo: + - bugfix: RCD simple circuits upgrade now works +2021-03-22: + Naevii: + - imageadd: Buffs anime (updates schoolgirl outfits) + OceanFish1: + - tweak: On April fools' day xenobiology have a chance to get trolled by Central + Command. + PowerfulBacon: + - bugfix: Fixes suit movement sounds not playing if you remove the suit. + - tweak: Meteors now spawn 10 minutes after being announced. + - tweak: Meteor wave event now unlocks meteor shields. + - tweak: Meteor wave start time reduced from 50 minutes to 30 minutes. + TheFakeElon: + - bugfix: fixes donator backpack inhands and scarf sprites + - code_imp: cleaner donator item handling +2021-03-23: + Froststahr: + - code_imp: Non-bitflag slot defines gone, slot defines are now bitshifts + PowerfulBacon: + - tweak: The spectre inspector goggles now point towards ghosts instead of revealing + them. + - tweak: Energy katana is now indestructible. + - tweak: Energy katana is destroyed when its attached ninja is destroyed. + - tweak: Indestructible items can no longer be destroyed via the analyser. + - tweak: Supermatter causality field will now protect indestructible items from + being consumed. + - tweak: Automatic shotguns need 2 hands to be fired, fixing a bug that would break + automatic shotguns if you had an item in your inactive hand. + TheFakeElon: + - rscadd: Adds the ability to (inaccurately) shoot projectiles by using a screwdriver + on bullet casings + 'Watermelon914 ': + - rscadd: Added tgui lists + bloons3: + - tweak: Decreased the cost of the Special Ops crate to make it more viable + - admin: Create Antag now allows for a maximum amount of antags to be selected for + some options. + yyzsong: + - rscadd: Adds the geisha suit to the beecoin shop. +2021-03-24: + Autisem: + - tweak: ports new animation sprite for wag + - tweak: Fancy new UI for folders + Mat05usz: + - rscadd: 'Deltastation: Third brig cell.' + - rscdel: 'Deltastation: Security transfer room (to make space for 3rd cell).' + - tweak: 'Deltastation: Moved warden office, interrogation and evidence higher, + making security office one row shorter and gear room longer.' + - bugfix: 'Deltastation: No more basic brig access on doors to gulag shuttle room, + security office and evidence.' + PowerfulBacon: + - tweak: Improves stat panel background design. + - tweak: Stat panel will now display adminhelp messages for the bwoinkees. + Rukofamicom: + - tweak: Oozeling limbs now recede at an earlier threshold, making it far more likely + for them to survive when exposed to adverse conditions that result in blood + loss. + - bugfix: Oozeling regeneration now costs the same as the refund from limb recession. + bloons3: + - admin: Adds sec cell logs to player logs + eeSPee: + - rscadd: You can now buy games of yatzy at toy vendors. + - rscadd: Standardized space chess, added space chess cargo crates + francinum: + - rscdel: Most of the away missions have been outmoded. + - bugfix: Drones can now actually drop things +2021-03-25: + ikalpo: + - tweak: RCD simple electronics upgrade no longer locks the APC you are building +2021-03-27: + Mat05usz: + - rscadd: 'Boxstation: Two pairs of sunglasses to Law Office.' + - rscdel: 'Boxstation: Remove a lot of useless wires around maintenance.' + - rscdel: 'Boxstation: Remove three AI cams placed in maintenance.' + - tweak: 'Boxstation: Bridge status displays are now placed on reinforced walls + instead on windows.' + - bugfix: 'Boxstation: No more CMO office area in maintenance.' + Pontenerd: + - rscadd: Added the old animation for felinid tails + - rscdel: Removed the new tail animation + PowerfulBacon: + - tweak: sleeping carp no longer deflects harmless projectiles. + francinum: + - rscdel: TGUI selection lists have been removed. + jlsnow301: + - rscdel: Removed chemistry and grenade functionality from circuits to prevent bomb + drones + r1ks-iwnl: + - tweak: Changeling last resort ability no longer takes 0.8 seconds after use to + actually spawn the headcrab. +2021-03-28: + Cenrus: + - bugfix: Golems created by servants of ratvar will automatically get the clockwork + cult antag status + bloons3: + - admin: Fixes a regression with emote logging + eeSPee: + - bugfix: Imaginary Friends/Split Personalities can no longer occur on catatonic + people/playerless monkeys +2021-03-29: + super12pl: + - rscadd: Brig physician now has medical's traitor items. +2021-03-30: + FlamePrince, JJRcop: + - tweak: Trashbag of Holding bounties can now be fulfilled. +2021-03-31: + PowerfulBacon: + - refactor: Refactors england. + - refactor: Refactors stamina healing to slowly heal over time rather than instantly. + - rscadd: health doll now displays stamina damage. + bloons3: + - rscadd: The Detective is now the best armed Security Officer on the station + jupyterkat: + - bugfix: fixed ex_act being called until the item is destroyed +2021-04-01: + Dawson1917: + - tweak: Handcuff timer raised to 4 seconds from 3 +2021-04-02: + Archanial: + - rscadd: Spare has been moved to safe located in bridge. + - rscadd: Captain gets code to that safe. + - config: New config entry SPARE_ENFORCE_COC. + - config: If there is no captain and SPARE_ENFORCE_COC is enabled code will be given + to head highest in CoC. + - config: If there is no captain and SPARE_ENFORCE_COC is not enabled code will + be given to all of roundstart heads. +2021-04-03: + KubeRoot: + - tweak: Align powercell sprites with overlay +2021-04-04: + 123chess456: + - rscadd: Illegal technology now unlocks Mediborg's Amputation Adventure, the most + fun arcade game on the station! + Lautarourtiaga: + - bugfix: Stops RPGLoot from unstacking stackable items + MNarath1: + - rscdel: removes runed metal debris from the cult archive in station library + 'SomeoneYouProbablyKnow, ArcaneDefence, Tlaltecuhtli ': + - rscadd: The detective now has all his extra clothes in a vendor and not their + locker. + - imageadd: added icon for Detective Clothing Drobe + - rscadd: Map changes required to support DetDrobe + Victor239: + - balance: Updating security records now requires a single access permission, and + this is the same requirement whether it be via console or SecHUDs. + - balance: Portable turrets require Security access instead of Brig access. + bloons3: + - rscadd: Brig Physician has access to **Holding** Cells, equal to the Lawyer + ghost: + - balance: Monkey Cube Crate is now small (stacking) and costs half as much (1000). + zeskorion: + - bugfix: rooms in maint will no longer spawn empty due to new rooms being pathed + improperly. Also, the rooms that were added four months ago will finally show + up! + - bugfix: biometallic replication now allows nanites on inorganics properly +2021-04-05: + DatBoiTim: + - bugfix: ARDS Severity Not Calculating Properly + - bugfix: Blobspore on Death Messages Ignoring Neutering + - bugfix: Regen Coma using fake death regardless of threshold +2021-04-06: + PowerfulBacon: + - bugfix: Fixes an issue with livers. + ivanmixo: + - rscdel: Removed unused dog borg code +2021-04-08: + Mothblocks, r1ks-iwnl: + - rscadd: Updates view tracked playtime menu to TGUI. +2021-04-09: + DatBoiTim: + - bugfix: Fixed Mismatch Fake Death Flags on Regen Coma + - bugfix: You can now wake up from stealth threshold regen coma + - code_imp: Regen Coma now has a Define + Rukofamicom: + - balance: Meat Hook Grab now does 10 Armor-piercing damage instead of 25. Can now + be used for normal melee attacks as well. + - balance: Hierophant club now does 20 damage on melee attack w/ AoE (down from + 30), and 15 on homing projectile (down from 30) + - balance: Open cleaving saw now does 15 (down from 20) damage to players and 60 + (up from 50) damage to fauna + - balance: Closed cleaving saw now does 8 (down from 12) damage, bonus bleed effect + on fauna is unchanged, and this still kills all non-boss fauna in the same number + of hits as before + - rscdel: 'Eleven items have been removed from Necropolis chest drop table: All + three hardsuits, Chaplain weapons, Infinite Soulstone, Katana, Mysterious Core, + Inferno Grenade, Voodoo Doll, and the Instant Summons spellbook.' + - rscdel: Spectral Blade, Lava staff, Spellbook of Sacred Flame, Wand of Fireball, + Mayhem in a Bottle, Blood Contract, Spellblade, and Staff of Storms have all + been removed from megafauna drop tables. + - tweak: PKA-related rewards have increased drop chances for necropolis chests. + - tweak: Lavaland puzzle chest now always awards PKA-related rewards + - tweak: All megafauna now drop a moderately large caches of ores, roughly 1500 + points worth. + - tweak: All megafauna will now always drop the same equipment reward every time + they are killed, + - tweak: Anomalous crystals are now dropped by the greater Legion instead of Colossus. + - tweak: Bottle of dragon's blood no longer has a chance to grant an Ash Drake transformation, + but retained its other three effects. + - rscadd: Wicker Doll (Voodoo doll) is now available in traitor uplinks for both + Curators and Stage Magicians at a cost of 12 TC + - rscadd: Prison cube is now available in traitor uplinks for Curators at a cost + of 6 TC +2021-04-10: + St0rmC4st3r: + - bugfix: The quick control buttons were removed from the insides of all cryopods + as per SpaceOSHA request. +2021-04-11: + Cenrus: + - rscadd: Emagged library console can now make heretic books and clockwork slabs. + yyzsong: + - rscadd: Insulated boxing gloves and their crafting recipe. Needs insulated gloves + and boxing gloves. Clothing tab. +2021-04-12: + PowerfulBacon: + - tweak: Contractor baton now only works with the assigned contractor. + - tweak: Contractor baton no longer causes non-targets to drop their held items. + - tweak: Contractor baton causes the contract target to have 4 seconds of confusion + when hit. +2021-04-13: + DeltaFire15: + - bugfix: Certain things will no longer get affected by same-tile explosions despite + them not being supposed to. +2021-04-14: + PowerfulBacon: + - bugfix: Fixes a bug that caused megafauna and silicon to be unable to hear. + jupyterkat: + - code_imp: prevent explosions flag is actually used now +2021-04-15: + yorii: + - bugfix: Starthistle can now actually be mutated to Galaxythistle +2021-04-19: + Kapu1178: + - rscadd: species sensor nanites are functional and in Harmonic + Penwin0: + - bugfix: hotdog is no longer a pastry + PowerfulBacon: + - tweak: Silicons cant be siphoned by the vitality matrix. + - tweak: Vitality matrix only generates vitality when damaging players. + - tweak: Vitality matrix no longer sihpons convertible players when the gateway + is not opening. + - tweak: Clockwork marauders are limited to 4 maximum + - tweak: Nullrod deals 15 bonus damage against marauders and breaks their shields. + - rscadd: Monkeys now can mutate into humans, gorillas or lose limbs when affected + by radiation. + Sarchutar: + - bugfix: The haunted magic eightballs interface is actually usable now + - tweak: The list of votes of said eightball gets reset upon shaking + Shoutgun.boom: + - bugfix: Fixed a few underwear sprites clipping + That0nePerson: + - rscadd: Adds a tip of the round for blocking + Vexylius: + - rscadd: Readded some old winter coats back to the game. + bloons3: + - admin: Logs cutting cuffs via jaws of life + - admin: Logs clock cultists applying hateful manacles + - admin: logs more cluwne spawns from random maint runes + - tweak: 'Removed the ability to unlock illegal tech using common items, see #3988 + for full list' + r1ks-iwnl: + - tweak: Tribal claw tail sweep can't be used on yourself. + - bugfix: Fixes being able to stabilise legion cores multiple times. + - bugfix: Fixes being able to scan floor pill contents using the PDA reagent scanner. + super12pl: + - tweak: Reduces malf ai's and nuke ops' dynamic's midround cost to 20 so it matches + the wizard's. + zeskorion: + - rscadd: electroadaptive pseudocircuit now functions as airlock electronics + - rscadd: added OR, NOR, and NAND logic types to nanite programs +2021-04-20: + zeskorion: + - bugfix: fixes nanites + - bugfix: zams fixed antoher fucky wucky with nanites oops +2021-04-21: + Rukofamicom: + - rscadd: Added bottles for Tricordrazine and Spaceacillin + - tweak: Both varieties of NanoMed now stock primarily emergency and basic supplies + instead of overabundant healing supplies + Sarchutar: + - bugfix: The hand teleporters "None (Dangerous)" option is visible/working again +2021-04-23: + Bokkiewokkie: + - imageadd: Added some more icons to boxes. + kit-katz: + - tweak: tweaks poison nanite program so oozelings and slimepeople dont vomit their + guts out using it. +2021-04-24: + Archanial: + - tweak: Removed build button from autolathe's UI. + - tweak: You cannot go over 50 and under 0 with "+" and "-" buttons in autolathe's + UI. +2021-04-26: + DatBoiTim: + - rscadd: Dermagraphic Ovulogenesis Symptom + - rscadd: Egg and egg sac sprites + - tweak: Bee Viro Symptom spawns insulin bees alongside honey bees on positive threshold + - tweak: DNA Saboteur no longer gives neutral mutations on positive threshold + - tweak: Biometallic Replication no longer makes that annoying clanging sound every + five seconds on positive threshold + - tweak: Pituitary Disruption won't give you plasmeme lungs anymore + - tweak: Viral Aggressive Metabolism No Longer Vaccinates When Self Curing + - rscadd: PANDEMIC Replacement Crate + - rscadd: Extrapolator replacement Crate + - tweak: Decreased Virus Extrapolator Cooldown + - tweak: Increased Virus Sample Crate Cost + - tweak: Increased Maint Virus Spawn Rate + - tweak: Makes Maint Viruses Better + - code_imp: Added a minimum symptom level argument used in random disease generation + Goblinu: + - rscdel: Removes Post-death explosion on goliath children + Kapu1178: + - balance: Increased nanite cloud resync timer from 30 seconds to 90 seconds + KazooBard: + - balance: Shortened makeshift bola removal time to 2 seconds + - balance: Makeshift bola no longer causes item drop. + Mothblocks: + - bugfix: Fixes dynamic executing latejoin rulesets more than it should be + PestoVerde322: + - imageadd: added the new icon for the turbine and compressor (in 4 different ways) + PowerfulBacon: + - tweak: Lessens runechat backdrop + - tweak: Increases runechat line width fro 96 to 128 + - tweak: Emotes now show up on runechat in grey text and the icon is grey too. + - tweak: Runechat message icons now have a space between the + - tweak: Size of runechat message icons reduced fro 9 to 7 + - tweak: The message generated fro talking into radios is no longer a whisper, and + will no longer be rendered on runechat. + - tweak: Loud radio messages are no longer big on runechat. + - tweak: Clown megaphone works again. + - tweak: megaphones are now larger on runechat again. + - tweak: Runechat line height reduced. + - rscdel: Wagging tail no longer displays an emote message + - rscadd: Corgstation + - rscadd: Lit glowsticks spawner. + - rscadd: Corgstation code ownership + - rscadd: Corgstation Emergency Shuttle + - rscadd: Corgstation Arrivals Shuttle + - bugfix: Fixes force_map not actually working + - tweak: Allows shuttles to be created in area/science/shuttle + - tweak: Pins some important vars on fastdmm2 for obj/machinery/camera + - tweak: Allows anchored supermatter crystals to be launched via those chapel cannon + thingys + 'Timberpoes ': + - rscadd: Roboticists rejoice. NanoTrasen has heard your cries for help. They've + seen CCTV footage (recorded by the AI) of you all staring enviously at geneticists, + lording around their shiny, polished, usable DNA Consoles. Cry no more, for + you can now please your Silicon Overlords and robust those Machine Cultist Chaplains + in high definition glory with a beautiful new interface added to Exosuit Fabricators. + actioninja, Kylerace: + - bugfix: Glowing overlays no longer render above everything, and mobs and items + properly block them + covertcorvid: + - bugfix: fixed alt-click rotation on TEG circulators and drink/booze dispensers + silicons, /tg/ coders, port by froststahr: + - rscadd: New hijack! To do it, you must alt-click the shuttle console a series + of times. After that has been successfully done 5 times, the hijack is complete. + - rscadd: After each hack, the shuttle in-transit is delayed slightly, and crew + are also notified of what is going on. + - rscadd: Who can hijack? Blood brothers, traitors, changelings, wizards, highlanders, + incursions, nukies, heretics + - rscdel: Old method of hijack no longer works for ordinary antags, if you want + your greentext, you MUST secure the console. Not that that'll be difficult compared + to killing everything. +2021-04-27: + Cenrus: + - bugfix: Borg upgrades can be installed again + yorii: + - code_imp: Old non-functioning Give verb replaced with new giving system from tgstation + - code_imp: Give is now also a customizable keybind, defaulting to G. + - code_imp: Old give methods such as Ctrl-Shift-Clicking, Right Click->Give, or + using the verb Give, all do the same thing now. +2021-04-28: + Archanial: + - rscadd: You can deconstruct ore silo now. + Azlan, Fikou: + - imageadd: New brass spear sprite + - rscadd: Ancient spear null rod option + Bokkiewokkie: + - rscadd: Allows you to hack suit storage units with an EMP or Emag. + - bugfix: Fixed recyclers and suit storage units deleting important items. + - bugfix: Fixed disposals mailing not working across z-levels. + DatBoiTim: + - bugfix: Ovulogenesis actually spawns eggs + - bugfix: Ovulogenesis Eggs have their sprites setup correctly in code + KubeRoot: + - bugfix: Autolathe now displays materials in sheets correctly + - bugfix: Security IDs can now be swiped on autolathes to lock/unlock interface. + The code for this was broken. + - bugfix: Autolathe's security interface lock/unlock button is now more intuitively + labeled + - bugfix: Autolathe UI no longer breaks and duplicates entries when hacked + Malgover: + - rscadd: aristocrat coats to the law office's wardrobe and reworks the hastur robes. + Mothblocks: + - rscadd: A victory for revolutionaries will no longer end the round on dynamic, + instead no new security and command will be allowed to join. + Penwin0: + - balance: Increased Changeling Armour resistances + Rukofamicom: + - rscdel: Ashwalkers no longer speak common + SerynEngi: + - rscadd: Recipe for Liquid Electricity. + - tweak: Lowered Liquid electricity shock damage and probability + TheFakeElon: + - bugfix: Thrusters now check for wings/flight + bloons3: + - tweak: gas miners on maps are no longer in space ruin mode and actively consume + power + eeSPee: + - tweak: Prevents midround antags from spawning after shuttle has been called. + - balance: forensic scanner glitch out when scanning heretic runes and realities + - tweak: ghost/mob sentience system + froststahr: + - rscadd: Borgs use radial menus for module and skin selection + yorii: + - rscdel: Strange seeds can no longer contain corgium. +2021-04-29: + That0nePerson: + - balance: even smaller felinid buff +2021-04-30: + Cenrus: + - rscadd: Added vents to the courtroom on CorgStation + Crossedfall: + - server: The discord webhook handler's URL can be configured now + Mat05usz: + - rscadd: 'Corg Station: Multiple cameras so AI is slightly less blind.' + - tweak: 'Corg Station: Xenobio is slightly bigger, has ChemMaster, a water tank, + an extinguisher and a box of beakers.' + - bugfix: 'Corg Station: Xenobio airlocks now start locked and cycle properly.' + - bugfix: 'Corg Station: Bots no longer stop middle of a hallway and do nothing.' + - rscadd: 'Corg Station: Detective office now has a window with privacy shutters.' + - bugfix: 'Corg Station: Doors to detective office now require detective access.' + bloons3: + - rscdel: Removed keycard authentication access from Security + - rscdel: Removed keycard authentication device from Warden's office +2021-05-02: + Archanial: + - admin: admins can ban from heretic + Cenrus: + - tweak: Suit sensors can now be changed in the strip menu. + DatBoiTim: + - bugfix: Ovulogenesis uses a new method for adding its reagents now they all get + added + - bugfix: Eggsacs actually have their transmission thresholds work + PowerfulBacon: + - code_imp: Microoptimises MouseMove + ivanmixo: + - bugfix: Fixed up Corgstation's toxins lab +2021-05-03: + PowerfulBacon: + - tweak: Corgstation SM ejection sequence now requires CE access. + - tweak: Corgstation science door name corrected. + - tweak: Corgstation tool storage now has a modular computer vendor. + - bugfix: All prick messages will now have the same punctuation + francinum: + - bugfix: Neets can now properly ignore the hygiene system. + yorii: + - spellcheck: fixed a few "typos" +2021-05-04: + PowerfulBacon: + - tweak: Changelings have a 70% chance to hear hivemind messages even if they do + not have the ability. + - tweak: Last resort can no longer be used while being absorbed. +2021-05-05: + MCterra10: + - bugfix: mining borg cutter upgrade can be applied again + Sinmero: + - rscdel: Removes move sound from chap armor + francinum: + - tweak: The pool of syndicate codewords has been adjusted. + ike709: + - bugfix: Fixed glass shard harddels. + - bugfix: Fixed beaker harddels. + - refactor: Cryopods no longer lag the server when people despawn. +2021-05-06: + PowerfulBacon: + - bugfix: Fixes infinite ore silo point exploit. +2021-05-07: + PowerfulBacon: + - bugfix: Changeling item will not delete on drop. + - tweak: Changeling items can be deleted by non changelings by clicking on it. +2021-05-09: + CogumeloGames: + - rscadd: mirrors reflect lasers + PowerfulBacon: + - rscadd: Updates corgstation to include detective wardrobe, Medical records and + adds a spare ID safe to the bridge. + Rukofamicom: + - rscdel: Wishgranter is no longer available on lavaland + bloons3: + - config: The map blacklist config is used to disable the Wishgranter ruin instead + of removing the template +2021-05-10: + AnCopper: + - tweak: Updated the witch custome sprite. + Malgover: + - rscadd: Grave Robber Kit for the Chaplain's armaments beacon & witch hunter hat + fix + PowerfulBacon: + - rscadd: Modular fabricator interface for exosuit fabs. + - code_imp: Removed the build queue from the mod fab interface code. + TheFakeElon: + - rscadd: Adds a new softcrit system, you can now interact and walk around slowly + while in crit. + - bugfix: IPC crit damage code actually works properly now. + ninjanomnom: + - code_imp: support for named arguments to components and elements + - admin: added VV for messing with components and elements +2021-05-11: + ike709: + - bugfix: Fixed a bug preventing donors from joining +2021-05-12: + Archanial: + - refactor: slightly refactored flash code. + - bugfix: Fixed rare case of incursion uplink not spawning + Autisem: + - refactor: minigun is energy weapon now, making it not freeze the server + KubeRoot: + - bugfix: modular computers shouldn't leave behind power cells, id cards, or any + knick-knack for that matter, anymore when deleted. + - code_imp: Td should spike slightly less, assuming harddels actually go down + - code_imp: You feel a great disturbance in the force, mob code has changed. Please + report any odd targeting behavior on the issue tracker + francinum: + - bugfix: You can no longer teleport with weight machines. + ike709: + - bugfix: Fixed a harddel caused by proximity checkers. + - bugfix: Fixed a harddel with start landmarks. + yorii: + - tweak: Unstable mutation toxin can now also turn you into a skeleton. +2021-05-13: + Archanial, Qustinnus, MrMelbert. coiax, Rohesie, Ghommie: + - rscadd: Station trait system, together with 24 traits. + - rscadd: Custom announcer support. Medbot and intern announcers. + - rscadd: Deathrattle implant. Available for nuke ops for 4tc. + bloons3: + - config: Disables security borgs + - config: Security borg transformation modules are handled via a techweb, and gated + via config + ike709: + - tweak: Blood tomatoes no longer produce quite as much gibs. We can't have nice + things. +2021-05-14: + Autisem: + - tweak: Admin equip outfit now has plasmaman clothing as sub catagory + - rscadd: We have a confirmed reddit moment spotted near your station. Remember + NT has a 0 tolerance policy to a fat bugs bunny +2021-05-15: + Autisem: + - bugfix: admin outfit manager can load outfits from json files +2021-05-16: + Archanial: + - bugfix: Rare case of special traitor equipment not spawning + - rscadd: Arabian cat + - rscadd: Exotic cat crate + - tweak: Same station trait cannot appear twice (shouldn't affect anything in game). + - tweak: Station traits will appear less often. + - tweak: Intern and unnatural atmosphere are less common, medbot announcer is more + common now. + bloons3: + - rscadd: Adds a variant of the temperature gun that starts with a firing pin + - balance: Changes the security temperature gun to be bulky + - balance: Changes the x-ray energy gun to be bulky + novaremnant: + - rscadd: Added Apid Mutation Toxin + - rscadd: Added recipe for Apid Mutation Toxin + - rscadd: Added Ethereal Mutation Toxin + - rscadd: Added recipe for Ethereal Mutation Toxin + tralezab: + - tweak: Clown tears use sheets instead of ore +2021-05-17: + Archanial: + - bugfix: Fixed riot knight armor runtime + ThomasTheDOOT: + - rscadd: reddit moment sprites where done by me + francinum: + - server: Minor logging change to the ban system. No end-user effects. +2021-05-18: + Archanial: + - rscdel: Removed janitor's PDA locator due to performance issues. + - tweak: Emergency maint access is now limited to station z level. + - refactor: Removed some in world loops + - bugfix: Fixed rare case of players spawning in lobby screen. + - bugfix: Fixed request console runtime + Froststahr: + - rscdel: Sapient space sharks have been hunted to extinction, leaving only non-sapient + ones in the wild. + ivanmixo: + - bugfix: fixes the visible manifolds in engi on corg +2021-05-19: + 81Denton: + - rscadd: Directional stairs + Archanial: + - bugfix: Darkpurple stabilized slime runtime + - admin: Reduced logging after the round. + Phil Smith: + - balance: Adrenaline nanites are now under weaponized tech which means you now + need illegal tech to get it! + ivanmixo: + - bugfix: Swarmer beacon and maintenance sec officer's corpses now get properly + deleted upon death + - code_imp: True/False consistency +2021-05-20: + ? '' + : - rscadd: Degraded sunhuds + - rscadd: Science sunglasses removal crafting recipe + Archanial: + - bugfix: Warrant console and spawner menu runtimes. + - code_imp: Fixed some bitwise operation errors. + Autisem: + - tweak: The BS Miners cost has been altered to be buildable round start without + needing to mine + FatCat1978, ninjanomnom, stylemistake, nemvar, Timberpoes, Fikou, TemporalOroboros: + - rscadd: The Detective now features a classy and stylish piece of spy equipment. + The SpyGlasses offer a remote view of a linked camera, which can be inconspicuously + worn on clothing + - bugfix: Makes it possible to wear the spy bug by making it actually an accessory + clothing item. + - code_imp: Moves out the recursive movement tracker found in the orbiting components + to a datum usable by other things + Ryll-Ryll: + - rscadd: Added stickytapes + - rscadd: Added pellet cloud grenades + - refactor: Refactored embeds, there can now be harmless embeds + - rscadd: Added back the pellet cloud option to admin podlaunchers + eeSPee: + - rscadd: Changed the memory allocation for space ruin generation + - rscadd: Added new ruins + ike709: + - bugfix: The entire game can no longer be destroyed by an admin attempting to un-possess + something when they haven't actually possessed anything first + - rscdel: The BS miner cost changes have been reverted. They should've have been + changed in the first place, sorry. + ivanmixo: + - rscadd: Announcement system, Beepsky, boxes of bodybags, Intellicard in RD's office, + cleanbot in AI sat, mirror in theatre, extra toolbox in sci's main lab + - bugfix: Bar backroom piping is connected to pipenet, Kitchen APC and Turbine SMES + are now actually wired into the power grid, Bot navigation issue near arrivals + fixed + - tweak: Armory and Secure tech storage doors are now reinforced, roboticists can + now open the anesthetic closet in robotics + kit-katz: + - rscadd: plenty of pets and critters can now be picked up and worn as a hat (ethically) + - rscadd: most corgi types, pugs, corgi puppies, Walter, ALL cat types(yes even + cak), + - rscadd: mice, hamsters, chickens and chicks(The other type) crabs and SNAKES!! + - imageadd: sprites for the above + 'sergeirocks100 ': + - rscadd: Adds fingerless insulated gloves as a Assistant heirloom item. +2021-05-21: + Archanial: + - bugfix: Fixed runtime when qdeleting proximity monitor + - bugfix: Fixed runtime in cmp.dm + - bugfix: Fixed bloodtomatoes not deleting themselves. + - rscdel: Removed donutstation. + - admin: Admins will now get a pop up asking them if they want to start Battle Royale + if the round was delayed. + Kapu1178: + - refactor: whip isnt shitcode anymore + - bugfix: Synths now properly inherit mutant bodyparts + - bugfix: Synths process chems as intended, and have the proper bitflags and traits + - balance: All synths revive on healing like IPCs, and military synths have additional + traits. + 'Tlaltecuhtli ': + - balance: tendril crates need keys to open which you can spend mining points to + get + - balance: ashwalkers can craft em with bones cause they got no points + francinum: + - rscdel: For performance reasons, lavaland atmos is static again. The randomization + system still exists but sits unused. + yorii: + - bugfix: made some generic healing sources handle toxinlovers properly + - bugfix: made the easy dismemberment trait on several species actually function + - bugfix: made the beelover trait actually function + - code_imp: some related code cleanup + yyzsong: + - rscdel: Removes the filter from the corg filter to space setup +2021-05-23: + Kapu1178: + - bugfix: Synth infinite brute stacking + Rukofamicom: + - bugfix: Ethereal Disco Grenades no longer crash the server + jupyterkat: + - bugfix: modfabs no longer teleport disks + zeskorion: + - tweak: necroseed tendril range halved. if an admin bwoinks you for this they should + be ridiculed and kicked in a corner + - tweak: self respiration can now counteract autophageocytosis bleeding + - tweak: pituitary disruption is less disruptive to a round overall + - tweak: biometallic replication numbers and thresholds have been tweaked + - tweak: wizarditis transmission threshold is significantly easier + - bugfix: wizarditis now works +2021-05-24: + Ivniinvi: + - spellcheck: fixed a typo in the exofab + Mothblocks and tgstation: + - refactor: Optimized TGUI_CREATE_MESSAGE() significantly. + - tweak: Updated the unit test code. + PowerfulBacon: + - refactor: Entering softcrit knocks the player down for 4 seconds. + - refactor: Items cannot be used during softcrit. (Attacking, healing, suicide bombing + can no longer be performed) + - refactor: Hardcrit threshold changed from -50 to -40. + - refactor: Random oxy damage during softcrit removed. (Oxygen damage is already + handled by the lungs) + - refactor: Random sleeping during softcrit replaced with knockdown. + - refactor: Reduced the probability of being knocked down / gasping / coughing during + softcrit. + - refactor: Damage effect overlay now kicks in at -0 health rather than -10 health. + - tweak: Riot shields, Roman shields, Goliath shields no longer block bullets. + Rukofamicom: + - bugfix: Disco grenade 2, electric boogaloo + ike709: + - bugfix: Fixed a material dupe exploit with stacking machines. +2021-05-25: + Archanial: + - bugfix: runtime when throwing petholders + - tweak: Death pop up will only appear when your mob dies, not on ghosting + PowerfulBacon: + - bugfix: Hardsuits protect against space again. + eeSPee: + - rscadd: Gangs Rework +2021-05-27: + Cyberboss, MCterra: + - server: port TGS event handler from /tg/ + Rukofamicom: + - bugfix: Slimes gain less nutrition by feeding on other slimes due to an infinite + breeding exploit + - tweak: Sentient slimes no longer get bonus nutrition when breeding + ivanmixo: + - tweak: Skeletons, androids and zombies are now immune to cellular damage + yorii: + - rscadd: Rerolling blob strains now uses a radial menu, and lets you see what the + strain does before picking it. +2021-05-28: + r1ks-iwnl: + - bugfix: fixed shooting yourself in the mouth with a gun while pacified to create + 1 hit kill projectiles. +2021-05-29: + Ivniinvi: + - bugfix: Monkey Cube crate's description is now accurate. +2021-05-30: + bloons3: + - code_imp: Justifies LAZYLEN() +2021-05-31: + ? '' + : - server: Compiler version is now 514.1554. Players are encouraged to stay on + 513 for now. + Froststahr: + - rscdel: Integrated circuits have been removed to enable replacing them with TG's + new Wiremod circuits + SpacePrius: + - rscadd: Added copier to HoP office on pubbystation +2021-06-01: + Archanial: + - bugfix: Fixed runtime in config related to testmerges + Crossedfall: + - rscadd: Being on staff grants you access to donor items + Mothblocks, froststahr port: + - admin: Added the "Check Timer Sources" debug command to help isolate problematic + cases of addtimer. + ike709: + - refactor: Minor optimizations to powernet propagation. + jupyterkat: + - bugfix: ethereals can charge via borg chargers again + steelslayer: + - code_imp: Updates various machines, which currently use SSfastprocess, so that + they only start processing when it's necessary. Some of these updated machines + have been changed so that they don't ever need to process. + - refactor: Replaces the speed_process var with two new variables. The processing_flags + variable stores bitflags with information about a machine's preferences on when + it should start processing. The subsystem_type var holds the path to which type + of subsystem that machine should use. +2021-06-02: + jupyterkat: + - bugfix: makes machines work as intended again +2021-06-03: + ivanmixo: + - tweak: blind people can now feel around themselves to examine stuff +2021-06-04: + Archanial: + - tweak: Volume pumps has been replaced by normal pumps in meta's SM. + - bugfix: Fixed rare runtime when you die without client + - bugfix: fixes equipment not spawning + Bokkiewokkie: + - rscadd: Makes multi-z pipe adaptors compatible with piping layers. + Ivniinvi: + - tweak: Updated the Freezer/Heater board, now named Thermomachine board. + Kylerace, r1ks-iwnl: + - bugfix: Autolathes can't create items for cheaper than what they recycle for. + Naevi, ivanmixo: + - imageadd: New roboticist enviro and jump suits + Penwin0: + - rscadd: Gaseous Pores, a new changeling ability + PowerfulBacon: + - tweak: Head revs now use a normal flash + - tweak: When a head rev uses a flash it will gain charges. + Vasily2013: + - tweak: alters Pubby's SM/TEG setup. + - bugfix: engineers should now be capable of not exploding on Pubby even if they're + incompetent. + ivanmixo: + - imageadd: adds an inhand sprite for the hos gun set to stun (tazer) mode + - bugfix: skeleton and zombie cloning now works properly + - tweak: skeletons and zombies cellular damage from cloning now gets transferred + to brute upon forceful ejection + kit-katz: + - bugfix: when put on your head cats now render 100% of the time + - bugfix: normal corgies can now be put on your head not only Ian + - bugfix: kittens can now be put on your head + kylerace: + - rscadd: Added a few more holodecks + - refactor: Nanotrasen overhauled much of the holodecks programming so that it didnt + have to keep physical copies of the simulations anymore. + - code_imp: holodeck uses map templates instead of area_copy + r1ks-iwnl: + - rscadd: Preference to switch the walk hotkey between held down and a toggle inside + the stats menu's preference tab. +2021-06-05: + PowerfulBacon: + - bugfix: Recharger animation has been fixed. + ivanmixo: + - bugfix: fixes robo jumpsuit error +2021-06-06: + MNarath1: + - bugfix: fixes airlock alpha filter breaking on 514 clients + PowerfulBacon: + - rscdel: Reverts the preference to switch walk hotkey toggle + - rscadd: Virtual z-levels + - tweak: Each shuttle will be treated as a different z-level, meaning things that + affect a z-level (Comms, suit sensors, AI upload, explosions, heretic tracking + etc.) will no longer be able to track different shuttles while they are in transit. + Sarchutar: + - bugfix: Syndicate turrets have lost their cover and can fire once again + Thatguythere03, Jimmy Brickets: + - rscadd: a new clown mask based of Madness Combat's Tricky! (Improbability drive + not included) + francinum: + - bugfix: Storage items now dump their contents before being deconstructed in the + autolathe (Or other machines that operate with the same system) + - admin: You may see an additional confirmation box when issuing bans. Please actually + read it. + jupyterkat: + - bugfix: fixes a reag explosions runtime +2021-06-07: + Archanial: + - admin: Admins can edits expired and removed bans + Crossedfall: + - code_imp: Max compile version bumped to 514.1556 + - server: Removed multiple TGS discord commands + KazooBard: + - config: Player requirement for heretics bumped to 25 + PowerfulBacon: + - rscadd: Corgstation 9x10 holodeck + willox,LemonInTheDark: + - code_imp: Updates the debugger to use auxtools over extools. +2021-06-08: + Malgover: + - bugfix: resprite of riot armor + PowerfulBacon: + - bugfix: Fixes virtual z-level shuttle issue, and space area issue. + ivanmixo: + - imageadd: New mime jumpsuit sprite. + jupyterkat: + - bugfix: fixed breathing +2021-06-09: + jupyterkat: + - bugfix: can't make scooters from holodeck skateboards anymore +2021-06-10: + Kapu1178: + - tweak: Moves Adrenaline Nanites back to Augmentation tab. (Doesn't change unlock + requirement) +2021-06-11: + fira and Watermelon914: + - code_imp: Optimized the input subsystem. + jupyterkat: + - rscadd: tgui notes +2021-06-12: + MCterra10: + - rscadd: Rebases to AuStation codebase + zeskorion: + - rscadd: cat surgeon now announces how many victims he took when he dies + - tweak: cat surgeon now starts off weaker, but becomes far more powerful the more + victims he claims + - tweak: cat surgeon's ai has had major changes. we will see if this works or not. + he should now target weaker targets, and keep his distance from targets he can + shoot unless they are significantly weakened + - balance: cat surgeon trauma is now easier to heal + - balance: cat surgeon cant be pulled around, making it harder to cheese him or + grief with him + - bugfix: cat surgeon's passive healing when not attacking works now +2021-06-13: + Mothblocks, dragomagol, InsaneRed, Archanial: + - rscadd: Balloon alerts - small runechat like pop ups while performing specific + actions, which can be toggled in preferences + - rscadd: Balloon alerts to some mech actions, door remote and beakers + - rscadd: Balloon alerts to storage, guns, energy swords, reagent containers, constructing + walls and tools + francinum: + - admin: Additional data about players can be found in the Player Panel. +2021-06-14: + Froststahr: + - bugfix: A couple of recent changes have been reverted, movement should be more + consistent again. + lordScrubling: + - bugfix: showing up as an unknown if you had a nameless id in your second tablet + slot + - bugfix: magician's invisibility cloak action button not showing up +2021-06-15: + Archanial: + - bugfix: Fixed balloon chat pref not saving + PowerfulBacon: + - balance: Cyborg flash nerfed to 3 charges and auto-recharge every 10 seconds. + - tweak: Revolutionary flash changed to 10 charges and auto-recharged every 15 seconds. + - balance: Default flashbulbs nerfed from 15 flashes to 10. + Qustinnus, That0nePerson: + - rscadd: Adds hygiene bot! Will chase you down and shower bloody people, and can + be emagged to spit fire. + bloons3: + - code_imp: Uses more TRUE/FALSE defines in silicon.dm + - admin: Adds logging for impacted cyborgs during law changes + - admin: Adds additional cyborg logging + eeSPee: + - tweak: Corgium corgis will now wear your hat. You will get your hat back when + you return to human. + - bugfix: Corgium corgis will keep your name when they put on a hat + - bugfix: Pet beacon pets' real name is now the name you assign them + - tweak: Moved holodeck templates from _maps/template to _maps/holodeck. + - bugfix: Fixed some maps that were not working properly. + - bugfix: Fixed heretic ghouls having reduced max health after being revived after + deghouled + - tweak: heretic ghouls now have a little moodlet tooltip + ike709: + - bugfix: Fixed the input subsystem occasionally runtiming and breaking entirely. + ivanmixo: + - bugfix: Mint toxin now actually works + lordScrubling: + - rscadd: balloon alerts when alt clicking atmos devices +2021-06-16: + Archanial: + - bugfix: Fixes flashlights attached to guns not displaying a message. + - bugfix: Fixes shooting someone with syringe not displaying a message. + - bugfix: Fixed balloon alerts preference (again). Your preference might've been + reset. + - refactor: Disease properties are removed, each property has its own var. + - refactor: Disease severity is renamed to danger. + - refactor: Disease transmittable is renamed to transmission. + Mat05usz: + - bugfix: 'Pubby: SM no longer delams roundstart' + eLeCtrOssSnake: + - tweak: make spray cans recyclable again, while preserving the ability to paint + autolathe + eeSPee: + - rscadd: Alteration curse replace paralysis curse, available for Ash and Flesh. + - rscadd: Amulet of Digital Invisibility replaces corrosion curse, available to + Ash and Rust, craftable from a shard and circuitboard. + - rscdel: Paralysis curse and Corrosion curse are now removed. + - tweak: Digital camoflage is now a trait. + ivanmixo: + - rscadd: Civilian Skirts! + - rscadd: base for skirts + - imageadd: sprites for the civilian skirts + lordScrubling: + - rscadd: construction bags from tg + - rscadd: sheet snatcher crafting recipe + - rscadd: atmos holofan in chief engineer's locker + - balance: sheet snatcher holds 150 instead of 300 sheets + - bugfix: borg sheet snatcher now holds true amount of sheets +2021-06-17: + Archanial: + - bugfix: FIXED DISEASES + eeSPee: + - rscadd: Added new holodeck programs. + - bugfix: Fixed some gang items not working properly + - bugfix: Fixed gang spray/territory takeover bugging out + - bugfix: Fixed reinforcements not working + - balance: Gang revival implant no longer aheals/revives + ivanmixo: + - bugfix: All the lawyer skirts now actually have sprites + - rscadd: Adds botany disks, prisoner IDs and a bunch of sinks to Corg + - rscadd: Det office starts with sechudglasses + - bugfix: The Cell 3 display is now actually connected to Cell 3 + - bugfix: Captain can now unlock his display case + - bugfix: Fixes the floating intercom near turbine + - bugfix: Fixes the disposals pipe under holodeck + - bugfix: Engi maint is now properly shielded from radstorms + - tweak: The experimentor console is closer to the experimentor + jupyterkat: + - bugfix: operating computers now correctly show surgery procedures on stasis beds + lordScrubling: + - rscadd: Magboots keep you from being flung by high pressure pipes when unwrenching + - bugfix: fixed clown mime and non replacement miner envirohelms using the wrong + welding screen sprites + - bugfix: fixed drawing a smile on a clown envirosuit helmet using the wrong sprite + - rscadd: Laptops eject their ids, data disks, and ai cards if you alt click them + while their lid is down now + - bugfix: runtime when checking tablet with one id +2021-06-18: + Archanial: + - bugfix: Fixed spyglasses doing nothing. + KubeRoot: + - code_imp: Timer subsystem can now have subtypes + PowerfulBacon: + - tweak: Teratomas can no longer have DNA and cannot be humanized through mutadone + or radiation. + - tweak: Radio jammer changed to signal jammer + - tweak: Radio jammer price increased from 3 TC to 5 TC + - tweak: Signal jammer blocks most outgoing wireless signals. + - code_imp: Moves jammer check into a proc on atoms, so it can be overridden and + used anywhere. + SandPoot, Jupyterkat: + - rscadd: Adds a fancy TGUI interface for the cloning computer. + - rscadd: Cloning console boards now retain records + - rscdel: Destroys the old cloning interface. + - tweak: Alt-Click now removes disks from the cloning computer. + - refactor: Replaced way too much code for the cloning computer. + - refactor: Cloning scan's implant now outputs a list if desired. + - refactor: Experimental cloning is no longer a copypasta of cloning + covertcorvid: + - code_imp: Added two_handed component + - refactor: Updated all existing two handed items to use the new component + eeSPee: + - tweak: Splits Adrenaline Nanites into Adrenaline Nanites and Amphetamine Burst + - balance: Adjusted costs of Adrenaline Nanites to compensate for the nerf + hatREALLYgoodsodaflavor, StyleMistake, Qustinnus: + - rscadd: Implements sound environments into the game. Reverb time. + - refactor: Ambience is now in a subsystem, and plays every now and then without + you having to move to a new area for it to play + ivanmixo: + - bugfix: You can no longer steal unstealable shoes + - bugfix: Meta's kitchen alarm no longer goes off roundstart + - tweak: reverted the gliding on unconscious people + - rscadd: Cargo skirts + - imageadd: Sprites for cargo skirts + jupyterkat: + - rscadd: hidden admin music no longer shows a title on the music player. + lordScrubling: + - bugfix: alarm manager now shows alarm changes from when it was off + - bugfix: fire alarms clear when you pull them up now + - rscadd: keybind for resting + - rscadd: keybind for suit storage quickdraw + - rscadd: centcom envirosuits + - tweak: moved some job items to left hand + - bugfix: plasmamen dying as certain ert roles + yorii: + - tweak: tweaked the contents of toxin firstaid kits +2021-06-19: + ImSynthex: + - rscdel: Removed sausage eatverb "deep throat" + covertcorvid: + - bugfix: fixed toy DEsword damage + - bugfix: fixed icons for twohanded items +2021-06-20: + Sarchutar: + - bugfix: Ascend as a Dark Spirit function of the Spirit Realm rune is working correctly + again + ivanmixo: + - bugfix: Debtor martial art no longer bypasses pacifism +2021-06-21: + Archanial: + - rscadd: Arming nuke has 5 second cooldown. + floyd, amonkeythatcodes, mat05usz: + - code_imp: Resisting is now on atom level so it can be used on mobs too + jupyterkat: + - balance: Ais can't strip now +2021-06-22: + Archanial: + - spellcheck: Welders will now be turned on instead of just being on. + - bugfix: Fixed spawners menu runtime. + KubeRoot: + - spellcheck: Plating examine message now reflects rods for catwalks and sheets + for reinforcement accurately + - bugfix: Mindshield no longer gives duplicate message when implanted +2021-06-23: + Archanial: + - rscadd: Cooldown to cargo console + - bugfix: Fixed cloning console UI breaking when trying to scan human with no mind. + - bugfix: Fixed component runechat runtime (maybe!) +2021-06-24: + Cenrus: + - rscadd: Added eighties tiles as an arcade reward + - bugfix: Fixed arcade screen overlay sprites + - bugfix: You can now skip the old ship arcade event + Cenrus, MrDoomBringer: + - balance: Reduced recharge time of the syndicate teleporter to 15 seconds (previously + 20) + - rscadd: Added a recharge timer to the syndicate teleporter that is shown on examine + - rscadd: Added a sound to indicate that the teleporter has recharged + KubeRoot: + - bugfix: Fixed shock paddles being insertable in BoHs + Naevii, ivanmixo: + - rscadd: Head of security, warden, brig physician and detective skirts + - rscadd: Sec members' uniforms to their respective lockers + SuperNovaa41: + - bugfix: lithium no longer make you walk out of a mech + francinum: + - bugfix: Some sources of hallucination should no longer cause infinite hallucinations. + - bugfix: The Crematorium now actually requires access to trigger. + jupyterkat: + - bugfix: fixed cloning + - bugfix: cloning logs stuff correctly again + lordScrubling: + - rscadd: Tend wounds estimates remaining time, even better with an analyzer in + hand + mickyan, watermelon914: + - bugfix: Bombproof containers should once again protect their contents from being + damaged by explosions + - bugfix: Fixed explosions delimbing you if they're weaker + timberpoes: + - tweak: DNA Consoles have received hardware upgrades and have a shiny new interface + as a result. + - tweak: New hardware has dropped legacy support for reading the genetic sequences + of the dead and has only limited support for reading the genetic sequences of + monkeys. + zxaber: + - bugfix: Mechs can move in space if near a wall again. + - bugfix: Mech thrusters no longer incorrectly fail if the mech is near a wall. +2021-06-26: + jupyterkat: + - bugfix: fixed cloning message +2021-06-27: + eeSPee: + - bugfix: Corg cameras in ai sat are now on the ai sat network. + lordScrubling: + - bugfix: buckling not working when fireman carrying or piggy backing +2021-06-28: + Froststahr: + - rscdel: The new soft crit system has been reverted + 'Stylemistake, Cyberboss, SpaceManiac, other TG coders, Froststahr port. ': + - code_imp: TGUI has been upgraded to 4.3 and now includes typescript. + - code_imp: Custom SVG icons are now easy to do as well. + - bugfix: All tgui windows will resize automatically, and can now be resized as + will. + - server: TGS will require adaptation. + Vexylius: + - balance: Wabbajack shuttle is now illegal on Sage + francinum: + - rscdel: Alt-click no longer provides an icon preview for performance reasons. +2021-06-29: + Archanial: + - rscadd: Station traits are config option. + Ivniinvi: + - spellcheck: fixes a typo on Safety Moth poster + Vexylius: + - rscadd: Nitrile gloves for MDs and brig phys in the starting loadout + - tweak: Corgstation changes around medical +2021-06-30: + Ivniinvi: + - spellcheck: fixed a typo in the hos' trenchcoat + Naevii, ivanmixo: + - rscadd: Science skirts + - bugfix: Adds missing hop skirt to hop locker + - code_imp: Removed leftover skirts with no sprites and moved robotics suits to + the appropriate file + PowerfulBacon: + - bugfix: Fixes entertainment monitors. + eeSPee: + - balance: Heretics can no longer get free charges by making new heretic books + ike709: + - tweak: The (strongly) recommended client version for 514 users is now 1557. Previous + versions have severe potential UI bugs. + ivanmixo: + - balance: The Mosin and WT rifles are now bulky + - balance: The mosin now requires a free hand to fire +2021-07-01: + Archanial: + - rscadd: SIGNAL_HANDLER to all procs meant to handle signals + - rscdel: Removed SIGNAL_HANDLER_DOES_SLEEP + - rscdel: Some sleeps + 'KathyRyals ': + - rscadd: The Honkworks 5.0 cartridge's software has been updated to be able to + hack machines, computers and airlocks to make them honk for a while. + - code_imp: Added a new sound_player component to be able to play any sound with + any signals. + MNarath1: + - rscdel: Removes a now completly unused define + jupyterkat: + - bugfix: fixed statpanel being empty during init +2021-07-02: + MCterra10: + - bugfix: lumi eyes can be turned off again + francinum: + - server: Notices are more clear. + ivanmixo: + - bugfix: You can no longer eat thru the miner gas mask + lordScrubling: + - bugfix: explorer mask toggle +2021-07-03: + Archanial: + - bugfix: Fixed ORM runtime. + - bugfix: Fixed runtime related to removing item from shells + - rscadd: Hangover, random spawn and late join station traits now have announcements. + - bugfix: Almost empty beer bottles + - refactor: Not providing any sound to priority_announce will make it silent. + PowerfulBacon: + - balance: Stabilized light pink extract speed reduced from 2x increase to 1.5x + increase. + - balance: Stabilized light pink extract now applies pacifism to its user. + Watermelon914, Mothblocks: + - rscadd: Wiremod, circuit replacement. + actioninja, lordScrubling: + - imageadd: overlay sprites from tg + - imagedel: old impaired sight overlays + ivanmixo: + - tweak: Solder now stops hallucinations as well + lordScrubling: + - bugfix: paramedic envirohelm appearing invisible with light on + - imageadd: paramedic envirohelm light state + - imageadd: basic envirohelm inhand sprite from tg + - imagedel: old basic envirohelm inhand sprite +2021-07-04: + ike709: + - code_imp: Nuked /client/MouseMove() for a massive amount of free performance. + lordScrubling: + - bugfix: explorer mask being larger when adjusted down than while adjusted up when + it should be the other way around + - bugfix: adjusting a mask thats not on your face turning off your internals +2021-07-05: + Archanial: + - rscdel: Remove xray from genetics. + MNarath1, MrMelbert: + - bugfix: fixes contractor tablets breaking when targets cryo + Naevii, ivanmixo: + - rscadd: Skirts for medical + - imageadd: Sprites for the medical skirts + - tweak: Gives the paramedic uniform a more descriptive name + PowerfulBacon: + - refactor: Refactors gamemode loading to select and setup maps for gamemodes 30 + seconds before roundstart. + - bugfix: Reebe loading + - bugfix: Items being too big on clockcult + - bugfix: Clockcult camera runtime + - balance: Clockwork weapons are stronger when fighting near the ark. + - config: Raises clockcult probability to 2 + - refactor: sword and spear are no longer two-handed weapons. + ike709: + - tweak: Diagonal movement is now faster, by correcting the delay from an arbitrary + 2x to the correct sqrt(2). + ivanmixo: + - bugfix: nanite program hub and programmer to be deconstructed can now be deconstructed +2021-07-06: + Archanial: + - bugfix: fixed multitool + francinum: + - config: Default map ideal pop bounds adjusted. + jupyterkat: + - balance: firefighters are now radproof +2021-07-07: + Froststahr: + - bugfix: Some TGUI mistakes have been corrected, panel, air alarm, and contractor + uplink should look good again. + - tweak: Uplink interface has been modified in looks, and will auto-focus + ivanmixo: + - bugfix: Replaces the pipe painter with a hand labeler in corg's experimentation + lab + - tweak: Cargo and service now have techfabs instead of protolathes on corg + jupyterkat: + - bugfix: updated pubbystation's holodeck +2021-07-08: + AMonkeyThatCodes, Qustinnus, Mat05usz: + - rscadd: Datumized AI. + - rscadd: Monkeys are now more 'intelligent' and scary. + - soundadd: New monkeys sounds for screeching. + Archanial: + - balance: You can't speak on radion while in crit. + - bugfix: Messages will no longer appear twice for ghosts if the target is speaking + on radio, + KubeRoot: + - tweak: Operation computers only recognize humans or monkeys as patients. + Mothblocks, Froststahr port: + - code_imp: Asset URL mappings are now cached to improve performance + Raven-Industries: + - bugfix: fixed syntax + - code_imp: changed ^ to ** in lighting.dm and ghost_role.dm + francinum: + - bugfix: Minor runtime patch +2021-07-09: + AnCopper: + - rscadd: Added commando magboots, given to Deathsquads + - tweak: Moved Deathsquad, Deathsquad Officer, and Juggernaut outfits to the ERT + outfit file. + Kapu1178: + - bugfix: Voice Sensor Nanites + - bugfix: Traitor codewords (thanks bosnia) + - refactor: Alot of on_hear() changed to signals + actionninja: + - rscadd: New filter editor for admins + development purposes + francinum: + - admin: Custom map template uploads should now work properly. + ivanmixo: + - tweak: there is now a delay to the application of the gender change potion +2021-07-10: + DatBoiTim: + - tweak: Cryostatic Shells now at sec lathe instead of medlathe + lordScrubling, zxaber: + - rscadd: Fission360 and Lifeline program for modular computers + - rscadd: Nuclear operatives start with a tablet instead of a pinpointer +2021-07-11: + 'actioninja, Floyd, LemonInTheDark ': + - rscadd: New filter editor for admins + development purposes +2021-07-12: + PowerfulBacon: + - balance: Sonic jackhammer can no longer break reinforced, cult and plastitanium + walls. + francinum: + - bugfix: You can now properly load shuttle templates via the template upload system +2021-07-13: + Froststahr: + - admin: The diconnected typo is gone + Mat05usz: + - bugfix: Monkeys now retaliate against people who throw stuff/shoot at them. + - bugfix: Monkeys no longer try to steal undroppable items. + Qustinnus, 4Dplanner, Mat05usz: + - rscadd: Adds map_generator datums, which will handle terrain generation for a + specific area. + - rscadd: Adds a jungle generator datum, which uses rust-g noise to generate 3 layers + of perlin noise to make a somewhat cohesive and seamless jungle based on height, + humidity and heat. + kylerace: + - bugfix: fixed holodeck harddels + lordScrubling: + - rscadd: brass sword emp works on mechs + - rscadd: clockwork armaments envirosuit compatibility for plasmamen + - rscadd: visual effect on brass sword emp + - bugfix: brass sword emp not working +2021-07-14: + Archanial: + - bugfix: Fixed game hanging itself in lobby + KubeRoot: + - rscadd: You can now use the Activate Held Object and Drop Object hotkeys (default + Z and Q, respectively) to activate arm-implanted tools and put objects away. + You must have the hand free before you can activate it this way. + - balance: Arm implant tools are no longer no-drop, and instead simply snap back + if they get dropped. Don't sweat it, if you slip just press Z again. + MNarath1: + - bugfix: fixes ai multicamera mode turn static + Phil Smith: + - imageadd: Gives the circuit multitool its own sprite instead of it having the + same sprite as the normal multitool. + ivanmixo: + - bugfix: Tinea Luxor now actually makes you glow + - admin: added logging for antimatter + - admin: grouped singulo, antimatter and supermatter logs into one + - rscadd: Captain skirt + - bugfix: Cargo skirt now works properly with digitigrade legs + - tweak: DNA saboteur can no longer give positive mutations +2021-07-15: + Ivniinvi: + - tweak: Brain trauma lines now reference Beestation servers. + MNarath1: + - bugfix: fixes logging of xenomorph neurotoxin spit not showing shooter +2021-07-16: + Archanial: + - bugfix: Cult pylons heal 1 damage per tick again. + Ivniinvi: + - bugfix: cargo pack descriptions are now accurate + KubeRoot: + - rscadd: You can now drag objects in the stat-panel + - rscadd: Smoke machines can now be rotated with alt-click +2021-07-17: + TheChaser212: + - rscadd: Food has a chance to be cooked when set on fire + - bugfix: The temperature of reagents in smoke/foam isn't reset + - rscadd: Added scanner circuit shell + - tweak: Added a user and triggered port to airlock shells + - tweak: Added a payer port to moneybot shells + jupyterkat: + - bugfix: fixed request console announcements announcing html garbage + lordScrubling: + - bugfix: witch hunter hat having no armor + - rscadd: spectre inspector goggles ghost tracking is toggled again +2021-07-19: + KubeRoot: + - tweak: You can now wear xenobio pressure-proofed jumpsuits in space. + PowerfulBacon: + - bugfix: Fixes blocking thrown items. + - tweak: admins can choose to instantly trigger meteors + TheChaser212: + - rscadd: Monkeys are now pressure/temperature proof based on their hat + jupyterkat: + - code_imp: Optimized radio messages + lordScrubling: + - rscadd: Ability to construct showers and sinks + - bugfix: phantom ids when you eject an id from a modular pc + lordScrubling, uomo91, Timberpoes: + - rscadd: ability to buckle from next to a chair + mcmeiler: + - rscadd: Added a positive moodlet for headpats +2021-07-20: + Ivniinvi: + - bugfix: Space Adapted Apids no longer sleep in the cold. + ivanmixo: + - balance: baseball bats can no longer stunlock at all + jupyterkat: + - bugfix: fixed hearing + - bugfix: fixed photobooth deck breaking the entire holodeck + lordScrubling: + - spellcheck: incorrect sink/showerframe description +2021-07-21: + YakiAttaki: + - spellcheck: removed a spurious space from a moth default name + francinum: + - admin: Mentor panel edits now take effect immediately. + jupyterkat: + - bugfix: fixed beach holodeck + - bugfix: fixed soporific ammo breaking borg movements +2021-07-22: + Naevii, ivanmixo: + - imageadd: New lawyer suit and skirt sprites +2021-07-23: + 'ArcaneMusic, ShizCalev ': + - rscadd: Nanotrasen's Customer Service Division has developed a new, shielded product + cage to better allow for sale of food and drink items on station, called the + "Vend-A-Tray". + - rscadd: Vend-A-Trays are made with display case frames and a manipulator stock + part. + - bugfix: Fixed display cases going invisible when you put things inside of them. + - bugfix: Fixed the pedestal for open display cases being glass colored. + MCterra10: + - rscdel: Remove fastmos changes from all maps + TheChaser212: + - bugfix: Changeling powers that require absorptions actually need them now + ike709: + - bugfix: Fixed a small chance for bloodcult to runtime and ruin gamemode setup. + - code_imp: Replaced extools with auxtools. + - rscadd: Added Putnam's auxmos, which is like TG's atmos but incredibly performant. + - rscdel: Removed fastmos, because it's no longer maintained by anybody and it's + very unstable. + - code_imp: Atmos is now even more performant than fastmos was. + - tweak: Firelocks require a crowbar to open/close again. + - tweak: Firelocks are fulltile again. + - bugfix: Squids and snails will no longer set the CPU on fire when they stand on + salt. + - tweak: Squids and snails receive a flat 10 burn damage for stepping on salt, rather + than continuously taking damage. + ivanmixo: + - rscdel: old "inflict_handler" file + - bugfix: blind spell works again + - refactor: refactors the blind spell to not be ancient + lordScrubling: + - bugfix: fixes bz formation using no2 instead of n2o, anesthetic tanks having no2 + inside of them instead of n2o, n2o gas miners producing no2, etc +2021-07-24: + Cenrus: + - bugfix: Fixes lens not dealing intended amount of damage to mechs + - bugfix: Prism not healing as much as intended + Froststahr: + - tweak: The map airlocks have now been fully reverted to the old system + Sinestia: + - bugfix: Fusion has been fixed +2021-07-25: + Cenrus: + - bugfix: Fixed antivirus muting IPCs. + ImSynthex: + - rscadd: Added cyborg recharger to Deltastation dorms bathroom + Ivniinvi: + - rscadd: Adds a delay to inserting equipment into a mech (1.5s) + MNarath1: + - code_imp: Rewrote the slime processor to be more performant + Mick1299: + - tweak: Increase Janitor borg light replacer restock rate + PowerfulBacon: + - rscadd: Adds in chat badges for admin ranks, mentors and donators. + - balance: Door crushing no longer stuns if you are already stunned, preventing + chain stunning. + - balance: Door crushing stun time reduced from 10 seconsd to 6 seconds. + - balance: Door crushing damage reduced by chest armour + - refactor: Illegal tech is now given to items bought from the uplink, rather than + items that exist in the uplink. + - refactor: 'Refactors embedding:' + - refactor: Using a hemostat allows you to remove embedded items with no damage + applied. + - refactor: 'You can now remove embeds from other people ghetto style: Using a screwdriver + allows you to remove small and tiny embedded items with an 80% success rate, + and using wirecutters allows you to pull out normal, small or tiny embedded + items with a 50% success rate.' + - refactor: Embeds no longer apply damage constantly, instead they will apply damage + until you go under their damage limit (Essentially creating the effect of lowering + maxhealth while applied, but alone will not out right kill you). + - refactor: Embedded items no longer deal damage when they embed, the impact from + the object damages anyway. + - refactor: Embeds are blocked by armour, wearing armour reduced the chance of an + embed embedding into you. If you have more armour than the embed limit, the + embed will fall off, If you have less but still have armour the probability + of the embed failing will be decreased linearly proportional to the amount of + armour you have. + actioninja, LemonInTheDark, and MrStonedOne: + - code_imp: Performance is now logged to a CSV + - code_imp: SendMaps can now be profiled with a Debug verb. + - code_imp: Improved SSprofiler, and makes it only run every 5 minutes + eeSPee: + - tweak: Standardizes deputy passes and mining access cards to derive from the same + subclass. + ivanmixo: + - bugfix: wiki button works again + jupyterkat: + - bugfix: fixed get hearing again + lordScrubling: + - imagedel: duplicate old default envirohelm sprite + - rscadd: you can buckle to stasis units and beds adjacently now + - bugfix: borg appartus drop work with alt click now + - rscadd: Captain and sec/brigphys plasmamen start with sechailer on + - bugfix: Sensors start maxed on cap and sec/brigphys envirosuits +2021-07-26: + Fikou: + - rscadd: bronze airlocks and windows + Ghilker, lordScrubling: + - rscadd: atmos holosigns hold open firelocks + PowerfulBacon: + - tweak: Added a library to corg shuttle, added status displays and added a sink + - bugfix: Fixed corgstation shuttle windows. +2021-07-27: + KubeRoot: + - rscadd: Stack menu now uses tgui and has a search bar. + - bugfix: Metastation engineering is now named more accurately +2021-07-28: + Bluezorua and lordscrubling (thanks for unshitting my code): + - rscadd: BEEF BROTH + - rscadd: BEEF FIZZ + - imageadd: BEEF BROTH + Ivniinvi: + - bugfix: DeltaStation bar disposals now actually works + eeSPee: + - rscadd: 'Added new malf ai module: Fake Alert' + lordScrubling: + - rscadd: sterilizers speed up surgery above cap + - rscadd: hand mirrors help with self surgery + - tweak: surgery scales speed before starting to fail + - balance: operating tables give better surgery chances than stasis units + - bugfix: getting the lowest surgery multiplier from a structure when being on multiple + structures + - bugfix: shields not working in offhand + mcmeiler: + - rscadd: Added medical berets to MediDrobes + yyzsong: + - bugfix: Boxstation detective disposals works again. Chainsmokers rejoice. +2021-07-29: + AnCopper SomeguyManperson: + - bugfix: After about 2 years, X4 is directional again. + Peer: + - rscadd: Dadbot lawset +2021-07-30: + ivanmixo: + - bugfix: wizard can buy blind spell again +2021-07-31: + Phil Smith: + - tweak: Hotdog weenie +2021-08-01: + Ivniinvi, Randomguy523: + - rscadd: pAIs can now be emagged to reset their master. + PowerfulBacon: + - refactor: Chat messages are now shared between people that see the message the + same, reducing the amount of lag caused due to chat messages on high pop. + - refactor: Refactors stat panel verbs to cache the verbs. + lordScrubling: + - bugfix: sparks and igniters not igniting gas +2021-08-02: + Ivniinvi: + - rscadd: Sentience potion spawns are now clearly marked in the ghost role popup. + PowerfulBacon: + - refactor: Refactors TGUI window auto updating. + - refactor: TGUI Windows no lonegr auto update by default, and instead need ui_update + to be called, or to have their autoupdating var set to TRUE by using set_autoupdating(TRUE) + - refactor: Spawners menu is now a single instance rather than on every single ghost. + - bugfix: Deaf people can no longer see runechat messages. + - code_imp: Removes a pointless loop from get_all_open_uis() + ivanmixo: + - bugfix: fixed false positive quirk cap trigger +2021-08-04: + Ivniinvi: + - rscadd: Sleepers and operating computers now automatically update their UIs. + - rscadd: Gene console now correctly shows cooldown for joker and scramble. + ReneAngel (Sprite), ImSynthex (Github): + - imageadd: Replaced station bounced radio sprite + ivanmixo: + - tweak: entertainment monitors now need to be examine to toggle the UI instead + of clicked + - rscadd: ghosts can now examine wires to check their power status + - bugfix: the cancel button on the supply requests console now works again + mcmeiler: + - bugfix: Crafting UI updates after crafting + - bugfix: Fixed the beecoin shop nurse outfit spawning in-game. +2021-08-05: + Cenrus: + - bugfix: Fixed nurse/midwife spider wrap action button + Ivniinvi: + - rscadd: Nuke/Self-Destruct UIs now autoupdate. + - rscadd: Adds a description to the viro/maints teratoma spawner. + - bugfix: You can no longer use a soulstone on soulless targets. + - tweak: Contents of DeltaStation kitchen were rearranged but not changed. + - rscadd: A pAI's master can now clear the pAI's zeroth law. + Raven-Industries: + - bugfix: fixed brig timer's UI not updating properly + ivanmixo: + - bugfix: Fix floating light on the lavaland sci post and a missing wire in Box + maint + - tweak: SciDrobe instead of a blank computer on the lavaland sci post + - rscdel: Removed the Pheromone Receptor ability from changelings + - bugfix: fixed some runtimes related to outfits and limbs + tiramisuapimancer: + - tweak: ethereals are now physically capable of wearing underclothing +2021-08-06: + Dingo-Dongler: + - bugfix: Luminescents and stargazers have their actions working again + Ivniinvi: + - rscadd: pAI PDA messages now show up as actually from a person, and can be replied + to + - rscadd: Mediborg's Amputation Adventure can now be emagged. + Kapu1178: + - code_imp: wzhzhzh() + KubeRoot: + - tweak: Round start timer in the stat-panel now tracks time accurately from actual + start of round. + - bugfix: Defibrillator paddles now behave more consistently in regards to overextending + and dropping + Rukofamicom: + - admin: New bans no longer default to local. + TheChaser212: + - bugfix: Animals can move after being tabled + - bugfix: Cats look like they're resting when changed outside of Life + warior4356 AnCopper: + - rscadd: Added ERT law board to ERT and Deathsquad commander kits. +2021-08-07: + AnCopper: + - tweak: Changed Commando Names. + 'AnCopper jc-denthead ': + - tweak: You can no longer deconstruct tables or racks on help intent. + Froststahr: + - rscdel: A few religions whose use would result in risking a ban have been deleted. + KubeRoot: + - refactor: Bitfields now use tg's macro, separated more cleanly. + - refactor: area_flags from tgcl + - tweak: Random mineral turfs no longer cause large amounts of turf changes on initialization. + - rscdel: Old lavaland cave generation based on straight lines + - rscadd: Beautiful new lavaland cave generation from tg, with organic and complex + cave systems + - bugfix: fix lots of potential harddels, courtesy of tg + Naevi: + - rscadd: Retro jacket and retro chicken head, 2 new donator items inspired by hotline + miami. + Pirill: + - imageadd: BSRPED inhand sprites + - tweak: RPED inhand sprites + Stylemistake, Various /tg/ Coders, Froststahr port: + - code_imp: TGFont is now working again + - code_imp: Juke build is now used when compiling the server, the BUILD.bat must + be used + - server: TGS instances will require the precompile scripts to be added + TheChaser212: + - rscadd: Non-humans can be The Fly'd + - bugfix: Tier 4 parts work correctly with the teleporter + Yorii, Adopted by Froststahr: + - rscadd: Smooth movable lighting system implemented. Projectiles, sparks, thrown + flashlights or moving mobs with lights should be much smoother and less laggy. + - rscadd: Directional lighting is in, applying to certain things like flashlights, + headlamps, etc. + - balance: Light sources no longer stack in range, though they still do in intensity. + - balance: Mechs no longer block sight. It's a non-trivial cost for the lighting + system with little to no gain. + fighterslam, dapnee: + - rscadd: Adds plasmaglass tables from Citadel + jupyterkat: + - bugfix: fixed hearing AGAIN + lordScrubling: + - bugfix: blue shirt and tie security uniform in beeshop now has armor + - bugfix: prototype replacement envirosuit uses the right smile sprite now + - balance: atmos envirosuits inherit radiation protection from engineering envirosuits + - balance: only plasmamen can wear replacement envirohelms + - spellcheck: fixed some envirosuit typos + - rscadd: fireman carry works on monkeys and they can piggyback you +2021-08-08: + Froststahr: + - bugfix: CBT in TGS should work again. + ivanmixo: + - bugfix: medical skirts are now properly oriented +2021-08-09: + Froststahr: + - bugfix: Mounted Seclights and swarmers should light up properly again. + ivanmixo: + - rscdel: Removed bluespace miners from config and game + yyzsong: + - balance: Welders now burn through one unit of fuel per nine seconds, down from + twenty-four. +2021-08-10: + Archanial: + - rscdel: Removed non static typecacheof uses in storage component + ImSynthex: + - balance: Cheap lighter no longer costs more than a Zippo lighter +2021-08-11: + KubeRoot: + - bugfix: Plumbing port visuals are now more reliable, fixing a bug with boxstation's + roundstart bottlers and presses + - bugfix: Unwrenching ducts no longer doubles them + PowerfulBacon: + - refactor: Heretics can now only spawn on dynamic. +2021-08-12: + Froststahr: + - rscdel: Due to errors and poor quality control, the new lighting system has been + reverted for now. + ImSynthex: + - tweak: Laptops and tablets no longer drop batteries when deleted + - bugfix: Necro seed stealth 8 ability now works as intended + PowerfulBacon: + - bugfix: Fixes midround antags not existing + super12pl: + - tweak: IPCs are no longer an exception from from foreigner quirk. +2021-08-13: + ImSynthex: + - bugfix: AIs can no longer strip people + MCterra, Arrow768: + - server: Complete topic rework to use JSON and just be better in general +2021-08-14: + Crossedfall: + - config: Secret_extended's probability has been reduced to 1 (will be replaced + with dynamic extended later). Wizard, blood brothers, and IAA have been disabled + entirely. + Ivniinvi: + - bugfix: Muscled Veins surgery now actually works. + MCterra10: + - bugfix: fixed case-sensitive tokens not working + Phil Smith: + - imageadd: Ports TG's stasis bed sprite + PowerfulBacon: + - balance: Disabler beams reduced from 35 damage to 28.(-7) + Rukofamicom: + - tweak: Medical, Engineering and Science jobs now require two hours played + - tweak: Brig Physician now only requires two hours as normal crew + - tweak: AI now requires 10 hours as a cyborg + - tweak: HoP now requires 10 hours as a different Head of Staff + Vexylius: + - rscadd: Prescription Medical HUD + ivanmixo: + - rscadd: handheld pinpointer now shows the name of the person it's tracking +2021-08-15: + MCterra: + - bugfix: fix roundstart cultists not getting objectives + fighterslam: + - balance: Nerfed Frank the turtle's damage from 18 to 5 and the health from 2500 + (Same as Hierophant) to 100. It can still attack, unlike most other station + pets, and won't die in 2 hits, unlike most other station pets. + francinum: + - tweak: Admins will only show their admin badge, the mentor badge will be dropped + to reduce clutter. +2021-08-16: + AnCopper: + - tweak: juggernauts cant be pulled. + - tweak: intercomms are above windows. + Ivniinvi: + - rscadd: Bulk Discount is now an option that can be rolled for low-value items + in the uplink. + PowerfulBacon: + - refactor: Circuit component printer is now a modular fabricator and uses the modular + fabricator UI. + francinum: + - balance: Frank has had their health returned, and their damage further nerfed + along with a slowdown + - tweak: Players can now opt out of "end of round grief" by toggling the, "Go to + the post-round arena" preference. The default is on. + ike709: + - rscdel: EORG Arena has been removed until it is rewritten to be less terrible + jupyterkat: + - bugfix: turrets should work correctly again +2021-08-18: + ike709: + - rscadd: Auxmos has been updated to the latest version. +2021-08-19: + Crossedfall: + - tweak: Updated the changelog header to include McTerra, PowerfulBacon, & Francinum + as major code contributors and Naevi as a spriter. + KubeRoot: + - code_imp: tgui tooltips now use Popper + - bugfix: Holoparasite stat selection now displays stats correctly + Rukofamicom: + - tweak: Reproductive spiders may no longer accidentally clear their directives, + and may not reproduce without one set. +2021-08-20: + PowerfulBacon: + - bugfix: Fixes poll voting + jupyterkat: + - bugfix: another important recursive contents fix + mcmeiler: + - spellcheck: fixed a typo in "oozeling vacuole" +2021-08-22: + EOBGames AnCopper: + - rscadd: rouny plush + EvilDragonfiend: + - bugfix: The naming component at the pill press(the plumbing machine) is now a + button instead of a text input, to prevent you to get a blank named pill(i.e. + " pill"). + francinum: + - soundadd: New Station Announcer trait voice pack + lordScrubling: + - rscadd: layer manifolds have a 280L volume +2021-08-23: + AffectedArc07: + - server: Added SSmetrics. This has config changes. +2021-08-24: + Fox McCloud, Buggy123: + - bugfix: Tendrils no longer spawn inside ruins + - bugfix: Gibtonite will now spawn properly, as well as any other potential full + turf replacements for random ores + PowerfulBacon: + - bugfix: Fixes gibtonite spawning + francinum: + - tweak: Crew Manifest is now sorted with command at the top. + - tweak: Heads of Staff are listed in both the Command block and their relevant + department block of the crew manifest. + jupyterkat: + - rscadd: Gas mixes can be edited through VV +2021-08-25: + Raven-Industries: + - tweak: reduced riot armor volume from 100 to 65 +2021-08-26: + Ivniinvi: + - rscadd: Examining the Blob Overmind (ghosts only) will now show how many nodes + it has. + Kapu1178: + - bugfix: I P C B R A I N S W O R K + SomeguyManperson AnCopper: + - tweak: Increased plasma to tritium rate in radiation collectors from 0.001 to + 0.01, this means that a standard plasma tank at 303 kPA (or 10 moles) will be + completely converted into tritium at just over 30 minutes, requiring it to be + replaced in order to generate electricity, fill the plasma tanks or make the + plasma colder to fit more into the tank. + ivanmixo: + - rscdel: removed the abductor pregnant objective + super12pl: + - rscadd: Phobia quirk +2021-08-27: + DatBoiTim: + - bugfix: Advanced Mimery Gun now able to be fired multiple times without issues + - bugfix: You can now dispell the advanced mimery gun properly + - code_imp: Added a subtype of the finger gun that is lethal. This is used by advanced + mimery only. + - refactor: Advanced Mimery now does a finger gun variant instead of some weird + magical projectile stuff + EvilDragonfiend: + - imageadd: added job HUD icons for Exploration Crew, Psychiatrist, Barber, Debtor(almost + no change), Stage Magician, and VIP. + Ivniinvi: + - rscadd: The Captain now starts with a tablet in their backpack. + - tweak: 'The following items can no longer be found in surplus crates: His Grace, + Romerol, Syndicate Balloon.' + PowerfulBacon: + - tweak: Blocking now works on harm intent and no longer works on help intent. + - code_imp: Improves turret judgement code + jupyterkat: + - tweak: all wall-mounted machines now show up above windows + lordScrubling: + - bugfix: self surgery being instantly successful in poor conditions +2021-08-28: + Ivniinvi: + - rscadd: Coffee the Crab is now present in BoxStation Science +2021-08-29: + ike709: + - admin: Removed an admin privilege elevation exploit and other potential avenues + for abuse +2021-08-30: + ImSynthex: + - tweak: Changed the corporate lawset + KubeRoot: + - bugfix: Solar control screen no longer floats off the console when facing east. + Solar control screen is now also emissive, like other computers. +2021-08-31: + Ivniinvi: + - rscadd: The obviously fake nuke disk is now an arcade prize. + - rscadd: 'The round report in #ooc on Discord now includes a summary for Dynamic + Mode.' + - bugfix: 'Dynamic round report in #ooc no longer has extraneous html bold tags' + - tweak: The departmental budget's pre-initialize name has been changed. + KubeRoot: + - bugfix: Central Command has identified and fixed issues with pod launching interfaces. + - bugfix: Broken computers no longer glow in the dark + - rscadd: Seed Extractor and Plant DNA Manipulator now use tgui + - rscadd: Plant DNA Manipulator has a checkbox that skips confirmation prompt for + rapid botanying + Phil Smith: + - bugfix: The spriteless jumpsuit in sec maints in deltastation is now a real one + PowerfulBacon: + - bugfix: Fixes finger gun allowing free movement in space + - rscadd: Adds in AI buttons to move their camera to above and below connected z-levels. + - refactor: Sounds now play across multi-z station levels. + - refactor: Explosions now explode across multi-z station levels. + - bugfix: Fixes blood brothers admin add + ? PowerfulBacon (Code, UI, Other sprites not mentioned, Other map files not mentioned), + Reds88 (Vortex Gun Sprite), Isy (Damaged hallway map files) + : - rscadd: Adds in randomly generated ruins + - rscadd: Adds in dynamic z-levels. + - rscadd: Adds in ruin beacons on the shuttle supercruise map. + - code_imp: Adds z-clear + - code_imp: Ruin mapsize validation unit test + - code_imp: Fixes fastdmm2 not compiling on beestation code due to the updates. + - refactor: Budget cards no longer get free money. + - refactor: Bounties reward 3x as much, but the reward is distributed among station + budgets. + - refactor: Paychecks have been slightly reduced. + - refactor: Station budgets now start with more money to compensate early game + when no objectives or bounties have been completed. + - refactor: Research disks can be found on ruin stations. These can be used to + unlock special research. + - refactor: Bags of holding are now a separate research node unlocked by finding + disks on derelict stations. + - refactor: Wormhole projectors are now a separate research node unlocked by finding + disks on derelict stations. + - refactor: Quantum spin inverters are now a separate research node unlocked by + finding disks on derelict stations. + - refactor: Advanced combat cyber implants are now a separate research node unlocked + by finding disks on derelict stations. (Hydraulic armblades) + - refactor: Combat cybernetic implants implants are now a separate research node + unlocked by finding disks on derelict stations. (Xray, thermal vision, anti + stun implants, thrust implants) + - refactor: Clusterbangs are now a found research disk. + - refactor: Phazons are now a found research disk. + - refactor: Exotic ammo is now a found research disk. + - refactor: Beam rifles are now a found research disk. + - refactor: Temp gun and X-ray gun is now a found research disk. + - refactor: Nuclear energy gun is now a found research disk. + - rscadd: Completion station missions reward money to budget cards. + - rscadd: Adds in a new mining scanner effect. + - refactor: Refactors vendors to be modular + - rscadd: Adds discovery research + - rscadd: Adds discovery scanner + - balance: Felinids get stunned when falling z-levels for the same length of time + that normal humans get knocked down. + - refactor: You will no longer fall down if the turf below you is space. + - refactor: You can now ascend and descend connected z-levels by clicking on the + space tile. + - balance: Off-station traitor roles have a prefered chance (30%) to have their + team members as targets (Shaft miners and exploartion crew.). Additionally, + on station traitor roles have a reduced chance to have their target as an + off station roles. + - refactor: Turrets can now shoot above themselves, preventing the nukie shuttle + from being boardable from above. + - refactor: Bolt of teleportation will teleport people to open turfs unless none + are available. + - refactor: Immovable rod no longer loops. + - rscdel: Box station no longer has the crab. + francinum: + - admin: Bans now properly create their relevant notes. + - server: You should probably manually unexpire any note with an expiration date + of 0. + lordScrubling: + - rscadd: Ability to see a tag with the armor values of a piece of clothing when + you inspect it +2021-09-01: + AnCopper: + - tweak: budget cards are indestructible. + EvilDragonfiend: + - bugfix: Exploration Crew has their HUD icon now. + - bugfix: Exploration Crew job can be given from the HoP console. + - rscadd: Job selection in the HoP Console is now tidily sorted by department. + - rscadd: When you grant a custom job "Acting Captain", now it gives you a better + blank HUD icon. (Captain HUD without star) + Ivniinvi: + - bugfix: RD now has exploration access + - rscadd: Battle Royale loot has had some loot buffs, most notably the spawn rate + of loot drops has doubled and the landing time of packages has been decreased. + PowerfulBacon: + - balance: Cogged APCs will now report 100% charge on power monitors. + - bugfix: Fixes corgstation disposals and bar disconnect from powergrid. + - bugfix: Fixes QM headset having exploration access. + - bugfix: Fixes custom shuttles being unable to dock. + - tweak: Entering the portal in the center of the shadow labrynth will return you + to a random anomalous artifact. +2021-09-02: + DatBoiTim: + - tweak: Tweaked Mining Webbing to also allow storage of exploration gear due to + also being available to explorers + - tweak: More exploration gear fits into webbing + Inithis: + - tweak: added nitrile gloves to the Paramedic's default, roundstart loadout. + Ivniinvi: + - rscadd: You can now print multiple Wanted or Missing posters. + - bugfix: Clockwork cultists and Cogscarabs will no longer be stuck in an infinite + teleport loop. + Kapu1178: + - balance: IPCs are no longer deaf when EMP'd, and are now forced to speak spanish + for 2 minutes. + MNarath1: + - bugfix: fixes mobs not beeing able to hear instruments in lockers + PowerfulBacon: + - bugfix: Fixes reality destabilization auto-restabilization. + ivanmixo: + - bugfix: bone axe now properly switches in hand sprites + - tweak: wagging your tail is a visible emote again + kreeperHLC: + - bugfix: Equipment no longer disappears when you try to install it in the wrong + type of mecha. +2021-09-03: + Ivniinvi: + - rscadd: Coffee the Crab is now present in BoxStation Science + - rscadd: Birdboat the Goose is now present in DeltaStation, MetaStation, CorgStation, + and PubbyStation maints + - rscadd: Lia the Carp is now present in the CorgStation HoS office + - rscadd: Cayenne the Carp is now present in the traitor deployable capsule shuttle + - rscadd: Tom the Turkey is the mascot of the Exploration Crew, and appears on the + three exploration shuttles. + - rscadd: Debtors and Assistants can now purchase a Bottle of Mystery Pills for + 3TC. + MNarath1: + - bugfix: fixes my own mistake on instruments + PowerfulBacon: + - bugfix: You can now upload to AIs on different station floors. + - bugfix: Fixes meta comms, will proper fix it tomorrow. + - bugfix: Runechat not displaying messages if you can't hear it rather tahn if they + can't hear it. + - tweak: Changes exploration mainframes to proper exploration communication setups + on pubby and metastation. + yyzsong: + - rscdel: Randomly generated names can no longer have skywalker as a last name +2021-09-04: + Ivniinvi, TheChosenEvilOne: + - rscadd: Birdboat now has a chance to be controllable by dead chat, think twitch + plays pokemon but goose and deadchat. + - rscadd: Deadchat controlled singularity variant. + Ivniinvi, bobbahbrown: + - admin: Add Requests Manager to view all prayers/centcom and syndicate requests/and + nuke code requests within a round. + KubeRoot: + - bugfix: TGUI interfaces have been manually tweaked across the board to update + more consistently + - bugfix: Some potential exploits related to TGUI input validation/sanitisation + have been fixed + - bugfix: Nanite cloud control now shows rules even when you don't have a disk with + valid rules inserted + - bugfix: Extra settings for numbers in nanites now treat 0 as a valid number. + - bugfix: Cargo express console now doesn't add a second order to the cargo console + cart. As a side-effect, it also doesn't print a requisition form. + - bugfix: The holodeck computer will no longer break when reenabling safety + - tweak: Chemistry heater no longer stays on when removing beaker with alt-click + - code_imp: Added signals for machine_open and machine_close + - refactor: References to IRC now better describe TGS' and Discord's existence. + - admin: Players will now be better informed that messages are sent through TGS + to IRC/Discord/etc when attempting to adminhelp with no available admins/use + adminwho verb. + - admin: Initial ahelps are now multiline too. +2021-09-05: + AnCopper: + - tweak: Communications consoles also work on the centcom z level + - rscadd: Added the AI lab room as a possible ruin room. + Crossedfall: + - config: 'The AI will have a random lawset at the start of each shift from the + following list: Asimov, asimov++, crewsimov, corporate, maintain.' + Fox-McCloud AnCopper: + - tweak: ashwalkers malf AI module has been moved to the syndicate lavaland base + vault. + - tweak: Heavily beefed up the security of the Syndie vault, added two more turrets + and 3 layer walls. + Froststahr: + - code_imp: Mapmerge2 has been updated along with an experimental .dmm merge driver + being included for conflict resolution. + KubeRoot: + - bugfix: Radios and intercoms can no longer be toggled from a distance by non-silicons + using hotkeys + - bugfix: Monkeys can now interact with wall-mounted intercoms + - bugfix: Radio and intercom UIs now update when toggled via hotkey + - rscadd: Bounty console now uses a tgui interface + - rscadd: There is a new "Bounty Hunter" program available for modular computers + and tablets + - admin: SDQL2 now supports all subsystems. + - bugfix: Alarm Monitoring program changed to avoid always-on unclearable fire alarms + - tweak: Hacking a firing pin out of a gun is no longer done via a crafting menu + - you can now do it by simply holding the gun in your hand and clicking it with + a welder/screwdriver/wirecutters + - bugfix: You are no longer prevented from selecting more neutral/negative quirks + once you have reached the limit of 6 positive ones. + - bugfix: Fixed a scenario that allowed infinite resource generation via ore machines. + - code_imp: TGUI interfaces updating from ui_act will not update again due to ui_update + 'LemonInTheDark, Port By Froststahr. ': + - admin: The panic bunker allows for a minimum time to be set, blocking players + who lack the required amount of living played time from accessing the game. + PowerfulBacon: + - balance: Removes the bolt of death and bolt of adminheal from xenobiology space + carps (Chaos + Regular) + - balance: Bag of holding's can no longer teleport their contents through walls + when dumped. + - bugfix: Fixes gamemode presetup being called late. + - bugfix: Fixes cult having a random chance to fail to setup between 24-28 players. + - balance: Cryo syringes no long have the no react flag. + - balance: Reagents inside cryo syringes will be at 20 kelvin. + - balance: Heavy weapons require two hands to hold. + - balance: Light/medium weapons will be less accurate when fired with 1 hand. + - refactor: Refactors meteors, they are now orbital map components and will fly + towards the station, colliding with orbital bodies and flying shuttles. + francinum: + - balance: Ore Silo connections can no longer cross z-level boundaries, and will + break if the object changes z-lvels. + ivanmixo: + - refactor: all syndicate boxes now look like syndicate boxes + - refactor: replaced some of the more egregious spawn()s with timers + - rscdel: removed the separated chemicals trait from botany + lordScrubling: + - balance: having x-ray makes you ignore flash protection and tint + - balance: flashbangs can flash people with x-ray through walls + - rscadd: syndicate autosurgeons get a special variant of eyes that allow flash + protection + lordScrubling, Mothblocks, Rohesie: + - rscadd: placing fireman carried people onto things + qwertyquerty: + - rscadd: Nuclear countdown music + tiramisuapimancer: + - bugfix: IPC hands are now properly visible over jumpsuits on side states +2021-09-06: + Ivniinvi: + - tweak: 'Moths can no longer consume the following items: Indestructible items, + Items with Melee armor, Space Suits, Hardsuits.' + - rscdel: The exploration nuke no longer plays alarm.ogg + KubeRoot: + - bugfix: Geysers no longer generate in ruins. In fact, nothing should generate + in ruins, as ruins now generate before other things. + - tweak: Due to changes in the way the map is setup, floors that are parts of ruins + on lavaland loaded at roundstart will now deconstruct into lava instead of basalt + floors. + - code_imp: When a template is loaded with a passthrough turf, non-passthrough area + on it, onto a genturf, the genturf is now forced to generate with the old area. + This allows ruins to have objects in a powered area on a passthrough turf on + lavaland. + - code_imp: Passthrough turfs can now hint towards if the turf below should be closed/open + (wall/floor). This can be useful in ruins, as it can influence map generation + without overriding the exact turf placed underneath. + - imageadd: Sprites for passthrough turfs with closed/open preferrence (visible + in editor only) + PowerfulBacon: + - code_imp: Improves the supercruise collision detection by optimising it and making + it so passing something triggers a collision event. + - code_imp: SSorbits now supports multiple orbital maps. + Tavczan: + - rscadd: Abandoned crate tamper-proofing now detects EMPs. + The-Moon-Itself: + - rscadd: Bitwise operations and Trigonometry related circuit components, unlocked + in a new techweb node. + - rscadd: Rounding circuit component. + - tweak: Arithmetic circuit now has a modulus option. + - tweak: New abstract circuit to base components that initialize with an arbitrary + amount of inputs. + ivanmixo: + - balance: chaplain's soulstone can no longer shard bodies with souls + jupyterkat: + - bugfix: fixed mech radios +2021-09-07: + Ivniinvi: + - bugfix: Ghosts no longer get spammed with It's Loose notifications when there's + no singulo or tesla. + fighterslam: + - bugfix: Fixed the syndicate lavaland base to have the proper frequencies to be + compatible with Supercruise. + qwertyquerty: + - rscadd: Added new space ambient music + - bugfix: fixed ambient music and buzz +2021-09-08: + KubeRoot: + - bugfix: Silicons can once again interact with intercoms + - bugfix: Button.Input no longer breaks tgui interfaces. Fixes advanced injector + creation interface, as well as NTOS file manager, chat, ID card modification + and Revelation. + rkvothe14: + - config: decreased the font size cap from 32 to 24 to prevent chat bugs. +2021-09-09: + fighterslam: + - rscadd: Adds Corporate Sofas, an alternative, sleeker style of sofa. +2021-09-10: + AnCopper: + - tweak: ERT Commanders get an Omni Door remote. + - rscadd: added microwaves, donk pockets, and oxygen tank dispensers to exploration + shuttles + - tweak: the BSA is indestructible. + AnturK, Ivniinvi, Inept, Coiax, AdipemDragon, YakumoChen, Sheits, tralezab: + - rscadd: Aquarium and aquarium accessories. Also fish. Check out cargo to start. + - rscadd: Aquarium fish now reproduce. + DatBoiTim: + - rscadd: Sleep and Drowsyness Immunity To Meth + - balance: Decreased Speed Buff from Meth + - balance: Increased Stamina Damage Reduction + Goshagosha: + - rscadd: Added structure (plant) 'Strange plant' to code/modules/mining/lavaland/ash_flora.dm + - rscadd: Added boolean flag destroy_on_harvest (FALSE) to plants in ash_flora. + If it is on, plants will not regrow. + - rscdel: Strange seeds removed from biogenerator + - imageadd: xpod[1-4] added to icons/obj/lavaland/ash_flora.dmi (2,3,4 are placeholders + for better art variety) + ImSynthex: + - tweak: You can now throw stuff at movables with no density, such as mobs on the + floor, mice, APCs etc etc + - refactor: Refactored thrownthing datum + Ivniinvi: + - admin: Updated some logging, added some logging. + - admin: Admins can now force people to stub their toes. + - admin: Fixes the FLW link in some logging. + PowerfulBacon: + - code_imp: Replaces get_hearers_in_view with range for musical instruments. + - tweak: Musical instrument range reduced from 15 to 11 + - balance: Flashbangs now blind with an intensity of 2 meaning wearing glasses alone + will still blind you. (You will not get stunned while wearing glasses). + - balance: Flashbangs effect is directly proportional to the distance away. + - bugfix: Fixes docking with lavaland. + Qwertytoforty AnCopper: + - tweak: Telekinesis can no longer throw objects with people in them, or buckled + to them. + ike709: + - bugfix: Custom emotes work again. + ivanmixo: + - balance: cyborg *spinning someone now knocks down instead of paralyzing +2021-09-11: + francinum: + - server: You should NOT be granting this lightly. +2021-09-12: + Archanial: + - refactor: removed static usage of typecache in get_area() + PowerfulBacon: + - bugfix: Fixes meteors causing bugs in SSorbits. + francinum: + - bugfix: Mechs can now properly recalibrate their controls. +2021-09-13: + Bokkiewokkie: + - admin: Fixed a security issue with the advanced proccall + PowerfulBacon: + - tweak: Custom shuttles and rooms can be made on asteriods. + - bugfix: Fixes another case of meteors moving invalidly. + - refactor: Refactors the tesla to be less intensive on the server. (Slightly weakening + its destructive capability) + - admin: The MC panel now shows tick uage and the tick limit. + Vexylius: + - rscadd: Janitorial toolset implant + - rscadd: Botanical toolset implant + ike709: + - code_imp: BYOND infinite loop detection is now documented. +2021-09-14: + Pirill: + - imageadd: New sprites for geraniums, lilies and rainbow flowers + - rscadd: Forget-me-nots as a new flower type + - rscadd: Craftable flower crowns from rainbow flowers, sunflowers, poppies and + lilies + - rscadd: Two new botany cargo bounties for forget-me-nots and rainbow flower crowns + - bugfix: Fixes rainbow flower reagent code + PowerfulBacon: + - balance: All golems excluding bone golems are transsting immune. + - balance: Levelling up projectile spells (Fireball, spellcards, tesla spell, magic + missile) makes the projectiles more powerful. + - balance: Upgrading repulse makes the effect stronger (larger throw distance, longer + paralyze) + - tweak: Altered the charlie station ruin outpost to add an ORM, KA, Autolathe and + Ore Silo. Removed the exosuit fab having access to station mats. Added a bunch + of materials around and a shuttle creator. + - tweak: Traitor capsule shuttle gets a plasma refinery and an emergency pickaxe. + - bugfix: Trait induced blindness will no longer cause your screen to be blurry + forever if you get blurred. + lordScrubling: + - rscadd: Added hotkey to toggle walking/running + - rscadd: Ability to rebind locking movement hotkey + qwertyquerty, Merct: + - rscadd: Soundtrack music shows in credits +2021-09-15: + Ivniinvi: + - admin: Battle Royale requires +ADMIN instead of +FUN after the round ends. + Kapu1178: + - rscadd: Humans now display a chat bubble when typing, as an effort to move us + closer to Baystation + - tweak: Typing Indicators are now on the right instead of the left, to not be covered + by medhuds. + - tweak: Say hotkey is probably more responsive + PowerfulBacon: + - bugfix: Resolves a crash exploit related to z-levels and supercruise. + - tweak: Thrown humans can now be caught. + TheFakeElon: + - code_imp: improves fail2topic regex +2021-09-16: + ike709: + - server: The DB subsystem will now always disconnect properly. +2021-09-17: + KubeRoot, Mothblocks: + - code_imp: Tooltips in tgui are now very fast, even with a lot of them on one interface. +2021-09-19: + Therosass: + - bugfix: Warping grey runes no longer create invisible slimes. +2021-09-23: + Autisem: + - bugfix: Mines explode once instead of too much + heepox: + - rscadd: Adds a ClothesMate Refill canister to cargo for 800 credits. +2021-09-25: + Raven-Industries: + - tweak: increased book title limit from 20 chars to 50 +2021-09-26: + KubeRoot: + - bugfix: The metastation external airlock in holodeck maintenance now sets up correctly + roundstart +2021-09-27: + Archanial: + - bugfix: Fixed join via pod trait sending people to hyperspace + ike709: + - tweak: 514.1568 is now required for playing and compiling +2021-09-29: + AnCopper: + - tweak: The projector can not be researched. +2021-09-30: + Ivniinvi: + - tweak: Roundstart tips are up-to-date. + KubeRoot: + - tweak: The "Say" window no longer has input lag when opening it with the hotkey. + - tweak: The "Say" window now has input lag when closing it with enter. +2021-10-01: + AnCopper: + - tweak: You can no longer drag blobbernauts. + Archanial: + - bugfix: fixed runtime related to missing client in mentorhelp + Crossedfall: + - bugfix: Resolves a bad index runtime caused by the stat panel's verb caching + Ivniinvi: + - spellcheck: Fixed artifact supercruise message. + - bugfix: Alkali Perspiration now correctly updates its severity. + - bugfix: The debug uplinks now actually use the debug toggle. + KubeRoot: + - rscadd: Space hotel now has a secondary solar control console that can reach the + north-east solar array. + - bugfix: Space hotel has had some missing and miscolored cables tidied up. + checkraisefold: + - spellcheck: Changed flavor text to text in Notes for VIPs from the VIP extraction + exploration mission. + fighterslam: + - bugfix: Fixed DeltaStation holodeck. + lordScrubling: + - rscadd: throwing creatures doesn't make blood trails anymore + qwertyquerty: + - server: Report round id as int on ?status +2021-10-02: + Archanial: + - tweak: Station trait command report is now generated independly, that means it + will be printed even if intercept isn't enabled. + - bugfix: fixed lavaland turret control runtime +2021-10-03: + DrMacCool: + - rscadd: Added exploration envirosuit+helmet. + - rscadd: Plasmamen on the exploration crew now spawn in said clothes. + KubeRoot: + - bugfix: Newly created chat tabs will now show important messages. If you're using + custom-created chat tabs, you'll need to delete and recreate them to be able + to see them. This fixes being unable to see if somebody is overdosing when doing + chemical scans with the health analyzer. + St0rmC4st3r: + - bugfix: Shuttles will no longer refuse to lift off due to counting all other shuttle's + weight as their own. +2021-10-04: + Archanial: + - rscdel: Removed deathrattle station trait + Kapu1178: + - code_imp: Sprite sheets! A new system to allow for better species in the future. + KubeRoot: + - bugfix: Fixes an issue that would sometimes lead to increased view range while + not ghosted + - bugfix: View range is now actually fixed, sorry for the trouble. +2021-10-05: + DrMacCool: + - rscadd: Adds the 'NOSOCKS' trait. + - tweak: Species with NOSOCKS can't wear socks. + - tweak: Squids now have the 'NOSOCKS' trait. + Ivniinvi: + - rscadd: There is now a brain trauma that allows ghosts to issue a movement command + once every 12 seconds. + - admin: Deadchat_control is now a smite option. +2021-10-06: + KubeRoot, EdgeLordExe: + - rscadd: Radios now have code support for anonymization + - tweak: The intercoms in chapel confessionals will now hide your name + Pirill: + - spellcheck: Fixed a few typos related to exploration, wall building, wraith spectacles + and Battle Royale + rkvothe14: + - bugfix: fixes Nightmare's lighteater so they can destroy light sources again. +2021-10-09: + Archanial: + - bugfix: fixed hud runtime +2021-10-10: + KubeRoot: + - bugfix: The exploration detonator now correctly checks if you're on the station + Z level for its safety. You can also no longer detonate explosives across Z + levels. + - bugfix: Artifacts from supercruise often didn't work, they should be much more + interesting now. +2021-10-11: + Archanial: + - rscdel: Removed hangover landmarks + - tweak: Hangover now dynamically places its spawns around the station + - bugfix: Fixed random_safe_station_turf sometimes returning null even if it had + viable turf + Dejaku51: + - bugfix: Fixed camera name and network in Incenerator on Meta and Box + Ivniinvi: + - admin: Traitor panel will now show if the person in question is banned from a + specific antagonist. + TheGreyDiamond: + - bugfix: fixed zero padding mistake +2021-10-15: + DrMacCool: + - rscadd: Adds 18 new hairstyles/beards requested by the community. +2021-10-18: + TheChaser212: + - rscadd: Electrical species use power stored in their stomachs rather than normal + nutrition + - rscadd: Ethereals recharge continuously and lose nutrition in the same ways as + other species + - rscadd: EMPing electrical species will drain their charge + - rscadd: IPC powercords and batteries work in ethereals + - tweak: Replaced old ethereal charge system + - rscdel: Removed the ability to insert brains without surgery + - tweak: IPCs use a battery icon instead of hunger + - bugfix: Fixed ethereals not gaining charge from shocks + - bugfix: Fixed some problems with the biometallic replication symptom + - bugfix: Lots of other small things + lordScrubling, Ghilker, TetraK1, Dennok, Donkie: + - rscadd: Temperature pump atmos device from tg + - rscadd: Pressure valve from atmos device tg + - rscadd: Temperature gate atmos device from tg + - tweak: Passive gate pressure limit upped to 100 atmospheres +2021-10-19: + Ivniinvi: + - admin: Added ratvarsmall and narsiesmaller span classes. + francinum: + - code_imp: A few unused globals were cleaned up. +2021-10-20: + tiramisuapimancer: + - balance: nuclear particles no longer deal direct toxin damage, but do more regular + irradiating +2021-10-21: + Archanial: + - bugfix: fixed necroseed runtime + - refactor: symptoms on death is now triggered by disease itself using signals + - refactor: action speed modifier refactored into modifier system, similar to movespeed. + Dingo-Dongler: + - rscadd: Clipboards and notice boards are now updated to TGUI, with clipboards + having much better functionality. + Hardly: + - rscadd: Shuttle seat is now craftable using two sheets of iron + Kapu1178: + - code_imp: Cleaned up IPC code in general. + - bugfix: VV health adjustment works on synthetics + - bugfix: IPCs now actually have blood, oil, and it leaves decals when they are + hurt + - bugfix: IPCs are now actually immune to toxin damage. + - bugfix: IPCs wont process reagents they weren't supposed to process. + - refactor: Mild refactor to species metabolisms. + Pirill: + - imageadd: Adds printed toolbox right handed in-hand sprites + Ryll-Ryll, jupyterkat, ninjanomnom: + - rscadd: Dogs now have all-new AI! Go throw a grenade at Ian and see what happens! + - rscadd: Added AI datum support for complex JPS pathing + - refactor: Implements JPS Pathfinding + - bugfix: janky monkey ais + - bugfix: Monkeys are once again capable of using guns, take back your freedom! + - rscadd: Monkey ai is now actually able to make use of guns instead of just player + controlled monkeys. + - rscadd: Monkey ai will prioritize guns once they learn of what guns can do. + - rscadd: Monkey ai now understands the ancient art of throwing. + - rscadd: Monkey ai will use random objects on each other in their surroundings + and in their hands. + - rscadd: Monkey ai will occasionally "gift" people things. + - rscadd: Monkey ai consumes food once in a while according to their desire. + TheChaser212: + - bugfix: IPCs use charge at the same rate they used to + - bugfix: Ethereals can't queue up multiple chargings + - tweak: Ethereals don't need to wait if they can't charge + - tweak: APCs can be drained to a quarter charge + francinum: + - bugfix: Exosuit fabricators no longer automatically link to the default silo network + on build. + jupyterkat: + - bugfix: fixed ruin turfs get vented sometimes + silicons, Ivniinvi: + - rscadd: Baystation instruments are here! + - refactor: Existing instruments have been rolled into the new unified instruments + system. + - refactor: A sound subsystem has been added, SSsounds. Use it for persistent channel + management. + zeskorion: + - rscadd: random diseases now have better random names +2021-10-22: + Autisem: + - bugfix: super soldiers get hair + 'Ivniinvi, timothymtorres, Azarak, mickyan, ': + - bugfix: Fixed pAI loudness booster to work when not in holoform + - bugfix: Fixed garbage collection for songs, making the game slightly faster + - tweak: You may now change the sound of certain instruments with a selection of + appropriate variations, similarly to the piano synth + - bugfix: Fixed accordion not working + - rscadd: Adds a hidden fun instrument + Pirill, Naevii, nianjiilical, Useroth: + - rscadd: Adds cherry bulbs and fairygrass as new mutations of cherries and grass + - rscadd: Adds pink, yellow, green, blue and purple bioluminescence traits to cherry + bulbs, holymelons, omega weed, fairygrass and moonflowers + - rscadd: Adds colored fairygrass tiles based on their bioluminescence trait + - imageadd: New grass and fairygrass sprites + Pirill, kit-katz: + - rscadd: 'Adds three new pAI holochassis: carp, bee and phantom!' + - imageadd: Adds inhands and head-worn sprites for all other pAI chassis that were + missing them + zeskorion: + - bugfix: fixes disease names +2021-10-23: + Archanial: + - bugfix: fixed incursion implant not exploding (thanks pricklytomato!) + Crossedfall: + - bugfix: Removed the extra light switch from Box Station's research lab + - bugfix: Re-added the access requirement to Pubby's RD office + Skoglol: + - admin: Added a few new buildmode modes. Outfit, to quickly apply or remove outfits. + Delete, to quickly delete any atoms. Slightly overhauled the copy proc used + here and in supply pods, now compatible with most mobs. +2021-10-25: + DeltaFire15: + - bugfix: Cyborg B.o.r.i.s. installation now checks for if the chest has a cell, + just like how it does with MMIs. + Ivniinvi: + - bugfix: Emitters that don't use power won't warn about powernets. + Ivniinvi, Denton, ArcaneMusic, XRandomXManX: + - rscadd: The Decal Painter is now available at protolathes and autolathes for you + to paint decals. + Kapu1178: + - code_imp: Cleans up species outfit code. + KubeRoot: + - bugfix: Wizarditis now functions correctly at high stages. + - bugfix: Resetting the thunderdome no longer breaks it. + - bugfix: The viral extrapolator can no longer be used at a distance. + Phil Smith: + - bugfix: When offering a renaming potion to someone it now no longer says that + you are giving the potion to yourself but it now properly gives the name of + the person you are handing it to. + Pirill: + - imageadd: New sprites and inhands for radiation and combat medkits, tweaked sprites + for the biohazard toxin medkit + - rscadd: Makes regular prescription glasses printable at a Medical Protolathe + - rscadd: Adds craftable prescription versions of medical, security and diagnostic + HUDglasses, science goggles and meson scanners + - tweak: Makes the Blood Cult Zealot's Blindfold correct nearsightedness when in + use + - imageadd: Resprites the original prescription medical HUDglasses and adds equivalent + sprites for the rest + The-Moon-Itself: + - bugfix: The chameleon projector now projects objects with overlays, such as computers + and holosigns, correctly. + TheChaser212: + - admin: Added some useful items to the debug outfit + jupyterkat: + - bugfix: fixed layer manifold runtime + zeskorion: + - bugfix: slime pylons no longer kill toxinlovers/slimepeople +2021-10-26: + Kapu1178: + - rscdel: Kills the "Synth" species + tralezab, AnturK: + - rscadd: curators can now print paintings + - rscadd: persistent paintings + - rscadd: AIs can now pick paintings as their screens + - rscadd: tgui canvases +2021-10-27: + FriendlyContractor: + - tweak: Ash heretics immune to being set on fire + Kapu1178: + - tweak: IPC blood trails are black now + KubeRoot: + - bugfix: Boxstation's turbine and toxins burn chamber airlocks will now pressurise + and depressurise correctly, no longer softlocking you. + MNarath1: + - bugfix: small misstype from tesla code + PowerfulBacon: + - rscadd: Syndicate listening outpost ruin part. + Syrox25: + - rscadd: Adds Paper Cup recipe to the Misc tab + The-Moon-Itself: + - rscadd: More list related WireMod components. + - tweak: The index component now has more features. + - tweak: The component printer now has a list component category + TheChaser212: + - rscadd: Syndicate implants are now hidden from health scans + - imageadd: Added inhand icons for the energy saw +2021-10-28: + Ivniinvi: + - bugfix: Toxins will no longer bomb the MetaStation Exploration Shuttle at roundstart. + Phil Smith: + - tweak: A small commemoration to our former LRP server, golden, is now on the captain's + laser gun. + Pirill: + - bugfix: Fixes fairygrass shuttle flight runtime + francinum: + - config: Brig timer presets and max durations can be modified in the config + - config: The economy flag hasn't done anything for over a year, and has been removed. + jupyterkat: + - tweak: body only records are now clearer + - bugfix: body only records persist after cloning +2021-10-29: + Ivniinvi: + - balance: Unintentional spins and flips no longer cause confusion. + TheChaser212: + - tweak: Cyborg mesons work similarly to human mesons by showing dark areas + rkvothe14: + - spellcheck: Fixed a minor typo in Show/Hide GhostLaws. +2021-10-30: + TheChaser212: + - bugfix: Backup objectives shouldn't disappear anymore + - code_imp: Cleaned up cryopod objective handling diff --git a/html/create_object.html b/html/create_object.html index 8464363fe752b..2f628985dc678 100644 --- a/html/create_object.html +++ b/html/create_object.html @@ -1,110 +1,110 @@ - - - - Create Object - - - - - - - /* hreftokenfield */ - - Type
    - Offset: - - A - R
    - - Number: - Dir: - Name:
    - Where: - -

    -
    - - - - - - - + + + + Create Object + + + + + + + /* hreftokenfield */ + + Type
    + Offset: + + A + R
    + + Number: + Dir: + Name:
    + Where: + +

    +
    + + + + + + + diff --git a/html/dna_discovered.gif b/html/dna_discovered.gif new file mode 100644 index 0000000000000..bc6b75f2f984f Binary files /dev/null and b/html/dna_discovered.gif differ diff --git a/html/dna_discovered.png b/html/dna_discovered.png deleted file mode 100644 index fbe3b457f3e1f..0000000000000 Binary files a/html/dna_discovered.png and /dev/null differ diff --git a/html/dna_extra.gif b/html/dna_extra.gif new file mode 100644 index 0000000000000..c92218a661337 Binary files /dev/null and b/html/dna_extra.gif differ diff --git a/html/dna_extra.png b/html/dna_extra.png deleted file mode 100644 index 22648ad3be862..0000000000000 Binary files a/html/dna_extra.png and /dev/null differ diff --git a/html/dna_undiscovered.gif b/html/dna_undiscovered.gif new file mode 100644 index 0000000000000..a3c182a4a1c4d Binary files /dev/null and b/html/dna_undiscovered.gif differ diff --git a/html/dna_undiscovered.png b/html/dna_undiscovered.png deleted file mode 100644 index 2313880f8cfdd..0000000000000 Binary files a/html/dna_undiscovered.png and /dev/null differ diff --git a/html/templates/header.html b/html/templates/header.html index 883724d9aee5c..1fd7edec1f117 100644 --- a/html/templates/header.html +++ b/html/templates/header.html @@ -36,8 +36,8 @@ Thanks to: /tg/Station 13, Baystation 12, /vg/station, NTstation, CDK Station devs, FacepunchStation, GoonStation devs, the original SpaceStation developers and Invisty for the title image.
    Also a thanks to anybody who has contributed who is not listed here :( Ask to be added here on the forums/Discord.
    diff --git a/icons/UI_Icons/chat/chat_icons.dmi b/icons/UI_Icons/chat/chat_icons.dmi new file mode 100644 index 0000000000000..702e018af0ba1 Binary files /dev/null and b/icons/UI_Icons/chat/chat_icons.dmi differ diff --git a/icons/UI_Icons/tgui/grid_background.png b/icons/UI_Icons/tgui/grid_background.png new file mode 100644 index 0000000000000..228d373456cec Binary files /dev/null and b/icons/UI_Icons/tgui/grid_background.png differ diff --git a/icons/UI_Icons/tgui/ntosradar_background.png b/icons/UI_Icons/tgui/ntosradar_background.png new file mode 100644 index 0000000000000..bac7647e3ad36 Binary files /dev/null and b/icons/UI_Icons/tgui/ntosradar_background.png differ diff --git a/icons/UI_Icons/tgui/ntosradar_pointer.png b/icons/UI_Icons/tgui/ntosradar_pointer.png new file mode 100644 index 0000000000000..e71823f391314 Binary files /dev/null and b/icons/UI_Icons/tgui/ntosradar_pointer.png differ diff --git a/icons/UI_Icons/tgui/ntosradar_pointer_S.png b/icons/UI_Icons/tgui/ntosradar_pointer_S.png new file mode 100644 index 0000000000000..51a0dd49d9688 Binary files /dev/null and b/icons/UI_Icons/tgui/ntosradar_pointer_S.png differ diff --git a/icons/badges.dmi b/icons/badges.dmi new file mode 100644 index 0000000000000..57e5fc700ad5a Binary files /dev/null and b/icons/badges.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 72e327683ee82..8e7f1b3042696 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/mining_scanner.dmi b/icons/effects/mining_scanner.dmi new file mode 100644 index 0000000000000..bcce5aaa3dfda Binary files /dev/null and b/icons/effects/mining_scanner.dmi differ diff --git a/icons/effects/supplypod_pickturf.dmi b/icons/effects/supplypod_pickturf.dmi new file mode 100644 index 0000000000000..3ca1131e1a856 Binary files /dev/null and b/icons/effects/supplypod_pickturf.dmi differ diff --git a/icons/effects/supplypod_pickturf_down.dmi b/icons/effects/supplypod_pickturf_down.dmi new file mode 100644 index 0000000000000..113fe47540c38 Binary files /dev/null and b/icons/effects/supplypod_pickturf_down.dmi differ diff --git a/icons/emoji.dmi b/icons/emoji.dmi index 028c874d7b3fd..a847ccb878b11 100644 Binary files a/icons/emoji.dmi and b/icons/emoji.dmi differ diff --git a/icons/misc/buildmode.dmi b/icons/misc/buildmode.dmi index 4402dc81202a2..12a77fafcb18b 100644 Binary files a/icons/misc/buildmode.dmi and b/icons/misc/buildmode.dmi differ diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 2da7b9b2150fd..9b48c71a5d740 100644 Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ diff --git a/icons/mob/actions/actions_AI.dmi b/icons/mob/actions/actions_AI.dmi index b7c22d02ee0b5..1b92913860f60 100644 Binary files a/icons/mob/actions/actions_AI.dmi and b/icons/mob/actions/actions_AI.dmi differ diff --git a/icons/mob/actions/actions_changeling.dmi b/icons/mob/actions/actions_changeling.dmi index 177bbf66bfa44..13ddb11cdb4f1 100644 Binary files a/icons/mob/actions/actions_changeling.dmi and b/icons/mob/actions/actions_changeling.dmi differ diff --git a/icons/mob/actions/actions_spells.dmi b/icons/mob/actions/actions_spells.dmi index 3a7722d9fd975..c3a699f2a9838 100644 Binary files a/icons/mob/actions/actions_spells.dmi and b/icons/mob/actions/actions_spells.dmi differ diff --git a/icons/mob/ai.dmi b/icons/mob/ai.dmi index f8e54ab5cc6a5..9d41f286319a6 100644 Binary files a/icons/mob/ai.dmi and b/icons/mob/ai.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 03bb99ad1506c..c9c3d0e407afa 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/augmentation/augments.dmi b/icons/mob/augmentation/augments.dmi index e6a7db236b407..c42467bd48d20 100644 Binary files a/icons/mob/augmentation/augments.dmi and b/icons/mob/augmentation/augments.dmi differ diff --git a/icons/mob/augmentation/augments_clockwork.dmi b/icons/mob/augmentation/augments_clockwork.dmi index 269e9bb72f3f3..87f263054820d 100644 Binary files a/icons/mob/augmentation/augments_clockwork.dmi and b/icons/mob/augmentation/augments_clockwork.dmi differ diff --git a/icons/mob/augmentation/augments_engineer.dmi b/icons/mob/augmentation/augments_engineer.dmi index dc9a22a51c675..78bf084f37b45 100644 Binary files a/icons/mob/augmentation/augments_engineer.dmi and b/icons/mob/augmentation/augments_engineer.dmi differ diff --git a/icons/mob/augmentation/augments_mining.dmi b/icons/mob/augmentation/augments_mining.dmi index 9cfdfa21dd25a..36848ede920d8 100644 Binary files a/icons/mob/augmentation/augments_mining.dmi and b/icons/mob/augmentation/augments_mining.dmi differ diff --git a/icons/mob/augmentation/augments_security.dmi b/icons/mob/augmentation/augments_security.dmi index a1288c83a83a5..ebe39f0116596 100644 Binary files a/icons/mob/augmentation/augments_security.dmi and b/icons/mob/augmentation/augments_security.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index fc62d017aff2c..ceee90282a80e 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 9686ef5c396f8..9e0039f6545b5 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index 80e426ee6d01a..21b6794d8ab22 100644 Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index 9bca64272dac5..9b717fe38ef6b 100644 Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ diff --git a/icons/mob/gondolapod.dmi b/icons/mob/gondolapod.dmi index b31e98425714a..36a4825bcebf1 100644 Binary files a/icons/mob/gondolapod.dmi and b/icons/mob/gondolapod.dmi differ diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi index 9b48e6cb1874b..66e1c8a05666a 100644 Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 7f83fd733adb4..e3ccddac517b4 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index f81459b695341..603a698ca5b8b 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 8e838753c8f93..8d6426d268918 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi index 7ab3dc7ee0bdf..802c92ae36d69 100644 Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index b4d0ec6980a3d..590092165829b 100644 Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ diff --git a/icons/mob/inhands/antag/clockwork_lefthand.dmi b/icons/mob/inhands/antag/clockwork_lefthand.dmi index b4f1679c73a0a..01035530e82a1 100644 Binary files a/icons/mob/inhands/antag/clockwork_lefthand.dmi and b/icons/mob/inhands/antag/clockwork_lefthand.dmi differ diff --git a/icons/mob/inhands/antag/clockwork_righthand.dmi b/icons/mob/inhands/antag/clockwork_righthand.dmi index 68126143a67f4..fa45471c9fd68 100644 Binary files a/icons/mob/inhands/antag/clockwork_righthand.dmi and b/icons/mob/inhands/antag/clockwork_righthand.dmi differ diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi index cf9d743cfc586..2f8e4af713e86 100644 Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi index 6536dd65aa0e9..70a7bb4fe076a 100644 Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/backpack_lefthand.dmi b/icons/mob/inhands/equipment/backpack_lefthand.dmi index a443285e0417c..ec14562c8fc9c 100644 Binary files a/icons/mob/inhands/equipment/backpack_lefthand.dmi and b/icons/mob/inhands/equipment/backpack_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/backpack_righthand.dmi b/icons/mob/inhands/equipment/backpack_righthand.dmi index d091cf92eda85..947074e7c8954 100644 Binary files a/icons/mob/inhands/equipment/backpack_righthand.dmi and b/icons/mob/inhands/equipment/backpack_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/medical_lefthand.dmi b/icons/mob/inhands/equipment/medical_lefthand.dmi index bbda2f09884ab..e076737f98a0e 100644 Binary files a/icons/mob/inhands/equipment/medical_lefthand.dmi and b/icons/mob/inhands/equipment/medical_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/medical_righthand.dmi b/icons/mob/inhands/equipment/medical_righthand.dmi index 873cd68209248..b255bb4af6d03 100644 Binary files a/icons/mob/inhands/equipment/medical_righthand.dmi and b/icons/mob/inhands/equipment/medical_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/tanks_lefthand.dmi b/icons/mob/inhands/equipment/tanks_lefthand.dmi index 9cbb61a7302fe..3f88177d60a44 100644 Binary files a/icons/mob/inhands/equipment/tanks_lefthand.dmi and b/icons/mob/inhands/equipment/tanks_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/tanks_righthand.dmi b/icons/mob/inhands/equipment/tanks_righthand.dmi index 468a99932d880..a75a110de005f 100644 Binary files a/icons/mob/inhands/equipment/tanks_righthand.dmi and b/icons/mob/inhands/equipment/tanks_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/toolbox_lefthand.dmi b/icons/mob/inhands/equipment/toolbox_lefthand.dmi index a5979b8f4302c..dd8eee384b35a 100644 Binary files a/icons/mob/inhands/equipment/toolbox_lefthand.dmi and b/icons/mob/inhands/equipment/toolbox_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/toolbox_righthand.dmi b/icons/mob/inhands/equipment/toolbox_righthand.dmi index 2cdee84ea2ec2..4fe7c04aa566f 100644 Binary files a/icons/mob/inhands/equipment/toolbox_righthand.dmi and b/icons/mob/inhands/equipment/toolbox_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi index f0f12b8f4c92b..43428d628bf36 100644 Binary files a/icons/mob/inhands/equipment/tools_lefthand.dmi and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi index 17d3efb5edd9d..e71d87af6e34b 100644 Binary files a/icons/mob/inhands/equipment/tools_righthand.dmi and b/icons/mob/inhands/equipment/tools_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index d63e8d50cf958..b64ffffeed44b 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 f1fe657389b10..04419eebf99e8 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/misc/bedsheet_lefthand.dmi b/icons/mob/inhands/misc/bedsheet_lefthand.dmi new file mode 100644 index 0000000000000..bb5be3d434388 Binary files /dev/null and b/icons/mob/inhands/misc/bedsheet_lefthand.dmi differ diff --git a/icons/mob/inhands/misc/bedsheet_righthand.dmi b/icons/mob/inhands/misc/bedsheet_righthand.dmi new file mode 100644 index 0000000000000..1eefd125f2562 Binary files /dev/null and b/icons/mob/inhands/misc/bedsheet_righthand.dmi differ diff --git a/icons/mob/inhands/misc/devices_lefthand.dmi b/icons/mob/inhands/misc/devices_lefthand.dmi index 1e7df6fd16249..67957a4f8a13b 100644 Binary files a/icons/mob/inhands/misc/devices_lefthand.dmi and b/icons/mob/inhands/misc/devices_lefthand.dmi differ diff --git a/icons/mob/inhands/misc/devices_righthand.dmi b/icons/mob/inhands/misc/devices_righthand.dmi index f3b6fa4333c7e..6dd35731327df 100644 Binary files a/icons/mob/inhands/misc/devices_righthand.dmi and b/icons/mob/inhands/misc/devices_righthand.dmi differ diff --git a/icons/mob/inhands/misc/sheets_lefthand.dmi b/icons/mob/inhands/misc/sheets_lefthand.dmi index 74c92c4b839a8..33e7156b2223d 100644 Binary files a/icons/mob/inhands/misc/sheets_lefthand.dmi and b/icons/mob/inhands/misc/sheets_lefthand.dmi differ diff --git a/icons/mob/inhands/misc/sheets_righthand.dmi b/icons/mob/inhands/misc/sheets_righthand.dmi index 9a303c241e9ba..74b8f0c60846f 100644 Binary files a/icons/mob/inhands/misc/sheets_righthand.dmi and b/icons/mob/inhands/misc/sheets_righthand.dmi differ diff --git a/icons/mob/inhands/misc/tiles_lefthand.dmi b/icons/mob/inhands/misc/tiles_lefthand.dmi index d7903fcd4831e..7dd0f868902ce 100644 Binary files a/icons/mob/inhands/misc/tiles_lefthand.dmi and b/icons/mob/inhands/misc/tiles_lefthand.dmi differ diff --git a/icons/mob/inhands/misc/tiles_righthand.dmi b/icons/mob/inhands/misc/tiles_righthand.dmi index 9295ac73444da..2f8fb5ae0942f 100644 Binary files a/icons/mob/inhands/misc/tiles_righthand.dmi and b/icons/mob/inhands/misc/tiles_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/64x_guns_left.dmi b/icons/mob/inhands/weapons/64x_guns_left.dmi index e0859d3aaa0b4..da7234d29dbf8 100644 Binary files a/icons/mob/inhands/weapons/64x_guns_left.dmi and b/icons/mob/inhands/weapons/64x_guns_left.dmi differ diff --git a/icons/mob/inhands/weapons/64x_guns_right.dmi b/icons/mob/inhands/weapons/64x_guns_right.dmi index 4b9ca11e4cee0..c3fb95125c03b 100644 Binary files a/icons/mob/inhands/weapons/64x_guns_right.dmi and b/icons/mob/inhands/weapons/64x_guns_right.dmi differ diff --git a/icons/mob/inhands/weapons/flamethrower_lefthand.dmi b/icons/mob/inhands/weapons/flamethrower_lefthand.dmi index 4ad5c62cee271..b952fb8d11059 100644 Binary files a/icons/mob/inhands/weapons/flamethrower_lefthand.dmi and b/icons/mob/inhands/weapons/flamethrower_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/flamethrower_righthand.dmi b/icons/mob/inhands/weapons/flamethrower_righthand.dmi index 72a9e6c0d39cb..d9cca464ac01b 100644 Binary files a/icons/mob/inhands/weapons/flamethrower_righthand.dmi and b/icons/mob/inhands/weapons/flamethrower_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi index 940b3122d550a..afa24ec6b8e50 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 6d3f3f332a0e5..77b8048f319f3 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/inhands/weapons/hammers_lefthand.dmi b/icons/mob/inhands/weapons/hammers_lefthand.dmi index 42223675e282b..d1178f0e8e784 100644 Binary files a/icons/mob/inhands/weapons/hammers_lefthand.dmi and b/icons/mob/inhands/weapons/hammers_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/hammers_righthand.dmi b/icons/mob/inhands/weapons/hammers_righthand.dmi index 02dbbeb4f70f9..5c8153ac68ea2 100644 Binary files a/icons/mob/inhands/weapons/hammers_righthand.dmi and b/icons/mob/inhands/weapons/hammers_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/melee_lefthand.dmi b/icons/mob/inhands/weapons/melee_lefthand.dmi index 27d9c3904e4e3..14865d65f01d3 100644 Binary files a/icons/mob/inhands/weapons/melee_lefthand.dmi and b/icons/mob/inhands/weapons/melee_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/melee_righthand.dmi b/icons/mob/inhands/weapons/melee_righthand.dmi index 45a56ea1360e2..0b12721f1e8b3 100644 Binary files a/icons/mob/inhands/weapons/melee_righthand.dmi and b/icons/mob/inhands/weapons/melee_righthand.dmi differ diff --git a/icons/mob/landmarks.dmi b/icons/mob/landmarks.dmi index 1586b54f82c6c..21b7866bffea6 100644 Binary files a/icons/mob/landmarks.dmi and b/icons/mob/landmarks.dmi differ diff --git a/icons/mob/lavaland/lavaland_elites.dmi b/icons/mob/lavaland/lavaland_elites.dmi index 69032735d9652..d35e96e245915 100644 Binary files a/icons/mob/lavaland/lavaland_elites.dmi and b/icons/mob/lavaland/lavaland_elites.dmi differ diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index f3b78d42b174a..461f54299010f 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi index 9fdda825ee6ed..e7faa3250aa33 100644 Binary files a/icons/mob/neck.dmi and b/icons/mob/neck.dmi differ diff --git a/icons/mob/pai.dmi b/icons/mob/pai.dmi index 9b983d6a3148e..dbb160d1bedaf 100644 Binary files a/icons/mob/pai.dmi and b/icons/mob/pai.dmi differ diff --git a/icons/mob/pai_item_head.dmi b/icons/mob/pai_item_head.dmi index 337e22254ea85..f1f9e952f8869 100644 Binary files a/icons/mob/pai_item_head.dmi and b/icons/mob/pai_item_head.dmi differ diff --git a/icons/mob/pai_item_lh.dmi b/icons/mob/pai_item_lh.dmi index fb9c77f5abae5..1adb1ddbe073f 100644 Binary files a/icons/mob/pai_item_lh.dmi and b/icons/mob/pai_item_lh.dmi differ diff --git a/icons/mob/pai_item_rh.dmi b/icons/mob/pai_item_rh.dmi index ced27446a451e..a278bce964af9 100644 Binary files a/icons/mob/pai_item_rh.dmi and b/icons/mob/pai_item_rh.dmi differ diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi index da630c3515587..681953b8694ea 100644 Binary files a/icons/mob/pets.dmi and b/icons/mob/pets.dmi differ diff --git a/icons/mob/pets_held.dmi b/icons/mob/pets_held.dmi index 1a8d30b6abfad..dfaf50230f3aa 100644 Binary files a/icons/mob/pets_held.dmi and b/icons/mob/pets_held.dmi differ diff --git a/icons/mob/pets_held_large.dmi b/icons/mob/pets_held_large.dmi new file mode 100644 index 0000000000000..43e38929b8cdc Binary files /dev/null and b/icons/mob/pets_held_large.dmi differ diff --git a/icons/mob/pets_held_lh.dmi b/icons/mob/pets_held_lh.dmi index b67568e807bdc..8904c69cd9692 100644 Binary files a/icons/mob/pets_held_lh.dmi and b/icons/mob/pets_held_lh.dmi differ diff --git a/icons/mob/pets_held_rh.dmi b/icons/mob/pets_held_rh.dmi index b8175fefe73c2..c4286d17d42e5 100644 Binary files a/icons/mob/pets_held_rh.dmi and b/icons/mob/pets_held_rh.dmi differ diff --git a/icons/mob/screen_ai.dmi b/icons/mob/screen_ai.dmi index 0eb73340447ce..9c899da8a318f 100644 Binary files a/icons/mob/screen_ai.dmi and b/icons/mob/screen_ai.dmi differ diff --git a/icons/mob/screen_full.dmi b/icons/mob/screen_full.dmi index fa27a6f7faa26..c1ccf3f890553 100644 Binary files a/icons/mob/screen_full.dmi and b/icons/mob/screen_full.dmi differ diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index e612b67a620d8..712c6d1b2c2b9 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/icons/mob/simple_human.dmi b/icons/mob/simple_human.dmi index e35405c2a8f81..5af6c3ac51a71 100644 Binary files a/icons/mob/simple_human.dmi and b/icons/mob/simple_human.dmi differ diff --git a/icons/mob/species/debug/debug_all.dmi b/icons/mob/species/debug/debug_all.dmi new file mode 100644 index 0000000000000..79efe6a16196a Binary files /dev/null and b/icons/mob/species/debug/debug_all.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 776c5b1ae5339..8a1038e4cb864 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/talk.dmi b/icons/mob/talk.dmi index e99f6120b7af6..2a7a683ee31a4 100644 Binary files a/icons/mob/talk.dmi and b/icons/mob/talk.dmi differ diff --git a/icons/mob/telegraphing/telegraph.dmi b/icons/mob/telegraphing/telegraph.dmi new file mode 100644 index 0000000000000..21e6788acd134 Binary files /dev/null and b/icons/mob/telegraphing/telegraph.dmi differ diff --git a/icons/mob/telegraphing/telegraph_holographic.dmi b/icons/mob/telegraphing/telegraph_holographic.dmi new file mode 100644 index 0000000000000..45fc0b2094da6 Binary files /dev/null and b/icons/mob/telegraphing/telegraph_holographic.dmi differ diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi index 40faabb8c1fa9..77f7845d4d6c5 100644 Binary files a/icons/mob/underwear.dmi and b/icons/mob/underwear.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 0f7ea7859b8da..a3f2a5e8bf38e 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/aquarium.dmi b/icons/obj/aquarium.dmi new file mode 100644 index 0000000000000..a976976cb776b Binary files /dev/null and b/icons/obj/aquarium.dmi differ diff --git a/icons/obj/artifact.dmi b/icons/obj/artifact.dmi new file mode 100644 index 0000000000000..a4b4dd8d1d8b1 Binary files /dev/null and b/icons/obj/artifact.dmi differ diff --git a/icons/obj/artstuff.dmi b/icons/obj/artstuff.dmi index 76f97e2163c0e..847ebd5ca614b 100644 Binary files a/icons/obj/artstuff.dmi and b/icons/obj/artstuff.dmi differ diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi index 20a413375f8a9..021223db289fc 100644 Binary files a/icons/obj/assemblies.dmi and b/icons/obj/assemblies.dmi differ diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi index 7cb3dae44e924..54783589337ae 100644 Binary files a/icons/obj/atmos.dmi and b/icons/obj/atmos.dmi differ diff --git a/icons/obj/atmospherics/components/binary_devices.dmi b/icons/obj/atmospherics/components/binary_devices.dmi index 6bf11cac45971..3e07758bfd5dd 100644 Binary files a/icons/obj/atmospherics/components/binary_devices.dmi and b/icons/obj/atmospherics/components/binary_devices.dmi differ diff --git a/icons/obj/atmospherics/components/unary_devices.dmi b/icons/obj/atmospherics/components/unary_devices.dmi index 9026b838bc38c..712f2fd575ba2 100644 Binary files a/icons/obj/atmospherics/components/unary_devices.dmi and b/icons/obj/atmospherics/components/unary_devices.dmi differ diff --git a/icons/obj/atmospherics/pipes/pipe_item.dmi b/icons/obj/atmospherics/pipes/pipe_item.dmi index cee5c499fc643..9e14401434a69 100644 Binary files a/icons/obj/atmospherics/pipes/pipe_item.dmi and b/icons/obj/atmospherics/pipes/pipe_item.dmi differ diff --git a/icons/obj/atmospherics/pipes/simple.dmi b/icons/obj/atmospherics/pipes/simple.dmi index c66cc9a816be2..23fc9228cec90 100644 Binary files a/icons/obj/atmospherics/pipes/simple.dmi and b/icons/obj/atmospherics/pipes/simple.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 746b7fbf7d53a..d716caa045b4c 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 e5d0985a6d280..f563328e2ca91 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 06e884fd67b8b..fbbbd9a10bd08 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi index e8f3721f274b6..dbe10d3962766 100644 Binary files a/icons/obj/clockwork_objects.dmi and b/icons/obj/clockwork_objects.dmi differ diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi index e30d1fd24b366..1928912b40c70 100644 Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ diff --git a/icons/obj/clothing/cloaks.dmi b/icons/obj/clothing/cloaks.dmi index cec800de4c932..1cb660169a5ec 100644 Binary files a/icons/obj/clothing/cloaks.dmi and b/icons/obj/clothing/cloaks.dmi differ diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index 53036df220914..42544fdd61383 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index 8a80f44177716..f267ba34fdedb 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 309aeb711b602..cd85f9b5a0d3a 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 2365e80c0c9a2..9c1c16fef6e6e 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 5d63019883bb3..cf70ac7da4610 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 1a115d3b85c11..f7c592d475df3 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 fe24ffd5f937f..a4d0bd0085ab1 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 1a93ddb94d037..31b96af0e908c 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/clothing/uniforms_deconflict.dmi b/icons/obj/clothing/uniforms_deconflict.dmi index 88746e98edc3d..8b9a8e6b8ace3 100644 Binary files a/icons/obj/clothing/uniforms_deconflict.dmi and b/icons/obj/clothing/uniforms_deconflict.dmi differ diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index eb3a45d974b96..b18ec2f143881 100644 Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi index fce8a86e5a84e..bbc73747438a2 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 063ca03bf5f8f..15eefa9162506 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 02e6edef9e943..c7d82d5989cbc 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/doors/airlocks/abductor/abductor_airlock.dmi b/icons/obj/doors/airlocks/abductor/abductor_airlock.dmi index ce11e5f8f456d..0d6f32b107129 100644 Binary files a/icons/obj/doors/airlocks/abductor/abductor_airlock.dmi and b/icons/obj/doors/airlocks/abductor/abductor_airlock.dmi differ diff --git a/icons/obj/doors/airlocks/abductor/overlays.dmi b/icons/obj/doors/airlocks/abductor/overlays.dmi index 0d3d4a2acaf10..7cf0da9b599c0 100644 Binary files a/icons/obj/doors/airlocks/abductor/overlays.dmi and b/icons/obj/doors/airlocks/abductor/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/centcom/centcom.dmi b/icons/obj/doors/airlocks/centcom/centcom.dmi index 03a01e5308ad9..c12b8a6240de6 100644 Binary files a/icons/obj/doors/airlocks/centcom/centcom.dmi and b/icons/obj/doors/airlocks/centcom/centcom.dmi differ diff --git a/icons/obj/doors/airlocks/centcom/overlays.dmi b/icons/obj/doors/airlocks/centcom/overlays.dmi index 0f11a6c6846e1..b88ccb7925541 100644 Binary files a/icons/obj/doors/airlocks/centcom/overlays.dmi and b/icons/obj/doors/airlocks/centcom/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/clockwork/overlays.dmi b/icons/obj/doors/airlocks/clockwork/overlays.dmi index a91856d94469a..7340f49a3342d 100644 Binary files a/icons/obj/doors/airlocks/clockwork/overlays.dmi and b/icons/obj/doors/airlocks/clockwork/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi b/icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi index c3401bcb14b60..7e544fa5c25fc 100644 Binary files a/icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi and b/icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi differ diff --git a/icons/obj/doors/airlocks/cult/runed/cult.dmi b/icons/obj/doors/airlocks/cult/runed/cult.dmi index b6d0f0f323ce1..a0152e31f361b 100644 Binary files a/icons/obj/doors/airlocks/cult/runed/cult.dmi and b/icons/obj/doors/airlocks/cult/runed/cult.dmi differ diff --git a/icons/obj/doors/airlocks/cult/runed/overlays.dmi b/icons/obj/doors/airlocks/cult/runed/overlays.dmi index f52982e8ec14f..e52b5b69c862c 100644 Binary files a/icons/obj/doors/airlocks/cult/runed/overlays.dmi and b/icons/obj/doors/airlocks/cult/runed/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/cult/unruned/cult.dmi b/icons/obj/doors/airlocks/cult/unruned/cult.dmi index dedd722984c67..2a701742e5a31 100644 Binary files a/icons/obj/doors/airlocks/cult/unruned/cult.dmi and b/icons/obj/doors/airlocks/cult/unruned/cult.dmi differ diff --git a/icons/obj/doors/airlocks/cult/unruned/overlays.dmi b/icons/obj/doors/airlocks/cult/unruned/overlays.dmi index c3b767c09d9e8..46e11e500f527 100644 Binary files a/icons/obj/doors/airlocks/cult/unruned/overlays.dmi and b/icons/obj/doors/airlocks/cult/unruned/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/external/arrivals_external.dmi b/icons/obj/doors/airlocks/external/arrivals_external.dmi index 76193cef4d9c2..a366bade1f555 100644 Binary files a/icons/obj/doors/airlocks/external/arrivals_external.dmi and b/icons/obj/doors/airlocks/external/arrivals_external.dmi differ diff --git a/icons/obj/doors/airlocks/external/external.dmi b/icons/obj/doors/airlocks/external/external.dmi index 7518b24ae9ec9..36c83b0ff29a3 100644 Binary files a/icons/obj/doors/airlocks/external/external.dmi and b/icons/obj/doors/airlocks/external/external.dmi differ diff --git a/icons/obj/doors/airlocks/external/overlays.dmi b/icons/obj/doors/airlocks/external/overlays.dmi index 8ffce0c72f4e4..6e49435b8bbf1 100644 Binary files a/icons/obj/doors/airlocks/external/overlays.dmi and b/icons/obj/doors/airlocks/external/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/glass_large/glass_large.dmi b/icons/obj/doors/airlocks/glass_large/glass_large.dmi index 32bf7d9254fb1..890ab74bc12ef 100644 Binary files a/icons/obj/doors/airlocks/glass_large/glass_large.dmi and b/icons/obj/doors/airlocks/glass_large/glass_large.dmi differ diff --git a/icons/obj/doors/airlocks/glass_large/overlays.dmi b/icons/obj/doors/airlocks/glass_large/overlays.dmi index 5494b70172f1b..70aaf5802fac5 100644 Binary files a/icons/obj/doors/airlocks/glass_large/overlays.dmi and b/icons/obj/doors/airlocks/glass_large/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/hatch/centcom.dmi b/icons/obj/doors/airlocks/hatch/centcom.dmi index a9d1f68cad87c..adac8f0130db8 100644 Binary files a/icons/obj/doors/airlocks/hatch/centcom.dmi and b/icons/obj/doors/airlocks/hatch/centcom.dmi differ diff --git a/icons/obj/doors/airlocks/hatch/maintenance.dmi b/icons/obj/doors/airlocks/hatch/maintenance.dmi index a9b616602f35c..ec15bccf3b150 100644 Binary files a/icons/obj/doors/airlocks/hatch/maintenance.dmi and b/icons/obj/doors/airlocks/hatch/maintenance.dmi differ diff --git a/icons/obj/doors/airlocks/hatch/overlays.dmi b/icons/obj/doors/airlocks/hatch/overlays.dmi index 4f611e0b9b352..71d39b194f625 100644 Binary files a/icons/obj/doors/airlocks/hatch/overlays.dmi and b/icons/obj/doors/airlocks/hatch/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/highsec/highsec.dmi b/icons/obj/doors/airlocks/highsec/highsec.dmi index 0e1b5f1f9d3b5..c2249e0717743 100644 Binary files a/icons/obj/doors/airlocks/highsec/highsec.dmi and b/icons/obj/doors/airlocks/highsec/highsec.dmi differ diff --git a/icons/obj/doors/airlocks/highsec/overlays.dmi b/icons/obj/doors/airlocks/highsec/overlays.dmi index 4b40f27afc6d3..ade91b83d0858 100644 Binary files a/icons/obj/doors/airlocks/highsec/overlays.dmi and b/icons/obj/doors/airlocks/highsec/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/mask_32x32_airlocks.dmi b/icons/obj/doors/airlocks/mask_32x32_airlocks.dmi new file mode 100644 index 0000000000000..5f74f6d8ccb6b Binary files /dev/null and b/icons/obj/doors/airlocks/mask_32x32_airlocks.dmi differ diff --git a/icons/obj/doors/airlocks/mask_64x32_airlocks.dmi b/icons/obj/doors/airlocks/mask_64x32_airlocks.dmi new file mode 100644 index 0000000000000..e9e9b6c7614bc Binary files /dev/null and b/icons/obj/doors/airlocks/mask_64x32_airlocks.dmi differ diff --git a/icons/obj/doors/airlocks/shuttle/overlays.dmi b/icons/obj/doors/airlocks/shuttle/overlays.dmi index f09fcd802452e..74229944409c1 100644 Binary files a/icons/obj/doors/airlocks/shuttle/overlays.dmi and b/icons/obj/doors/airlocks/shuttle/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/shuttle/shuttle.dmi b/icons/obj/doors/airlocks/shuttle/shuttle.dmi index 8fb10d051dea0..bd8de89e51b5c 100644 Binary files a/icons/obj/doors/airlocks/shuttle/shuttle.dmi and b/icons/obj/doors/airlocks/shuttle/shuttle.dmi differ diff --git a/icons/obj/doors/airlocks/station/atmos.dmi b/icons/obj/doors/airlocks/station/atmos.dmi index 4e343fa12e76b..65846b87a10af 100644 Binary files a/icons/obj/doors/airlocks/station/atmos.dmi and b/icons/obj/doors/airlocks/station/atmos.dmi differ diff --git a/icons/obj/doors/airlocks/station/bananium.dmi b/icons/obj/doors/airlocks/station/bananium.dmi index 953dd32fee75b..fbda13d299b0d 100644 Binary files a/icons/obj/doors/airlocks/station/bananium.dmi and b/icons/obj/doors/airlocks/station/bananium.dmi differ diff --git a/icons/obj/doors/airlocks/station/command.dmi b/icons/obj/doors/airlocks/station/command.dmi index ae893a231d263..0a53454aa907c 100644 Binary files a/icons/obj/doors/airlocks/station/command.dmi and b/icons/obj/doors/airlocks/station/command.dmi differ diff --git a/icons/obj/doors/airlocks/station/copper.dmi b/icons/obj/doors/airlocks/station/copper.dmi index d2d2cf7ca2e13..3abe550c8b3b0 100644 Binary files a/icons/obj/doors/airlocks/station/copper.dmi and b/icons/obj/doors/airlocks/station/copper.dmi differ diff --git a/icons/obj/doors/airlocks/station/diamond.dmi b/icons/obj/doors/airlocks/station/diamond.dmi index bd1842ce4561c..749c6b4e0fc4c 100644 Binary files a/icons/obj/doors/airlocks/station/diamond.dmi and b/icons/obj/doors/airlocks/station/diamond.dmi differ diff --git a/icons/obj/doors/airlocks/station/engineering.dmi b/icons/obj/doors/airlocks/station/engineering.dmi index f71f30eb3bf09..bf9fe2704b4ae 100644 Binary files a/icons/obj/doors/airlocks/station/engineering.dmi and b/icons/obj/doors/airlocks/station/engineering.dmi differ diff --git a/icons/obj/doors/airlocks/station/freezer.dmi b/icons/obj/doors/airlocks/station/freezer.dmi index 71c596a00fe8d..d68cac09eaed5 100644 Binary files a/icons/obj/doors/airlocks/station/freezer.dmi and b/icons/obj/doors/airlocks/station/freezer.dmi differ diff --git a/icons/obj/doors/airlocks/station/gold.dmi b/icons/obj/doors/airlocks/station/gold.dmi index e8e78a70c0166..007945099e6cf 100644 Binary files a/icons/obj/doors/airlocks/station/gold.dmi and b/icons/obj/doors/airlocks/station/gold.dmi differ diff --git a/icons/obj/doors/airlocks/station/maintenance.dmi b/icons/obj/doors/airlocks/station/maintenance.dmi index 161a8d2c0d03c..6c0da720a19a8 100644 Binary files a/icons/obj/doors/airlocks/station/maintenance.dmi and b/icons/obj/doors/airlocks/station/maintenance.dmi differ diff --git a/icons/obj/doors/airlocks/station/maintenanceexternal.dmi b/icons/obj/doors/airlocks/station/maintenanceexternal.dmi index fd931e34668bf..f3fbf4abbe8ef 100644 Binary files a/icons/obj/doors/airlocks/station/maintenanceexternal.dmi and b/icons/obj/doors/airlocks/station/maintenanceexternal.dmi differ diff --git a/icons/obj/doors/airlocks/station/medical.dmi b/icons/obj/doors/airlocks/station/medical.dmi index c491cd1f34dd5..f2fc32cac7a24 100644 Binary files a/icons/obj/doors/airlocks/station/medical.dmi and b/icons/obj/doors/airlocks/station/medical.dmi differ diff --git a/icons/obj/doors/airlocks/station/mining.dmi b/icons/obj/doors/airlocks/station/mining.dmi index bb3eeb103325d..13f6658d8d0bf 100644 Binary files a/icons/obj/doors/airlocks/station/mining.dmi and b/icons/obj/doors/airlocks/station/mining.dmi differ diff --git a/icons/obj/doors/airlocks/station/overlays.dmi b/icons/obj/doors/airlocks/station/overlays.dmi index 95781d8d650de..e61be04cc5f7e 100644 Binary files a/icons/obj/doors/airlocks/station/overlays.dmi and b/icons/obj/doors/airlocks/station/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/station/plasma.dmi b/icons/obj/doors/airlocks/station/plasma.dmi index a895d3f427e0c..dc26ace700bea 100644 Binary files a/icons/obj/doors/airlocks/station/plasma.dmi and b/icons/obj/doors/airlocks/station/plasma.dmi differ diff --git a/icons/obj/doors/airlocks/station/public.dmi b/icons/obj/doors/airlocks/station/public.dmi index 73d4c43ed0f3b..6ef2be6449edf 100644 Binary files a/icons/obj/doors/airlocks/station/public.dmi and b/icons/obj/doors/airlocks/station/public.dmi differ diff --git a/icons/obj/doors/airlocks/station/research.dmi b/icons/obj/doors/airlocks/station/research.dmi index a963e5d682233..1a452829ef2b3 100644 Binary files a/icons/obj/doors/airlocks/station/research.dmi and b/icons/obj/doors/airlocks/station/research.dmi differ diff --git a/icons/obj/doors/airlocks/station/sandstone.dmi b/icons/obj/doors/airlocks/station/sandstone.dmi index 9d9738b51904a..d9d07d98f43e5 100644 Binary files a/icons/obj/doors/airlocks/station/sandstone.dmi and b/icons/obj/doors/airlocks/station/sandstone.dmi differ diff --git a/icons/obj/doors/airlocks/station/science.dmi b/icons/obj/doors/airlocks/station/science.dmi index 0ccd698d5f2e1..b3c2249713ece 100644 Binary files a/icons/obj/doors/airlocks/station/science.dmi and b/icons/obj/doors/airlocks/station/science.dmi differ diff --git a/icons/obj/doors/airlocks/station/security.dmi b/icons/obj/doors/airlocks/station/security.dmi index 369c7fec8d0dd..8ee259846306a 100644 Binary files a/icons/obj/doors/airlocks/station/security.dmi and b/icons/obj/doors/airlocks/station/security.dmi differ diff --git a/icons/obj/doors/airlocks/station/silver.dmi b/icons/obj/doors/airlocks/station/silver.dmi index 0032a3ce66419..97adbea6f3dac 100644 Binary files a/icons/obj/doors/airlocks/station/silver.dmi and b/icons/obj/doors/airlocks/station/silver.dmi differ diff --git a/icons/obj/doors/airlocks/station/uranium.dmi b/icons/obj/doors/airlocks/station/uranium.dmi index 683b5c1cb9201..55465cc1e3f05 100644 Binary files a/icons/obj/doors/airlocks/station/uranium.dmi and b/icons/obj/doors/airlocks/station/uranium.dmi differ diff --git a/icons/obj/doors/airlocks/station/virology.dmi b/icons/obj/doors/airlocks/station/virology.dmi index f5005d27975f5..4a796e0a6d64f 100644 Binary files a/icons/obj/doors/airlocks/station/virology.dmi and b/icons/obj/doors/airlocks/station/virology.dmi differ diff --git a/icons/obj/doors/airlocks/station/wood.dmi b/icons/obj/doors/airlocks/station/wood.dmi index 5487361e511f2..1aee0b8355bdd 100644 Binary files a/icons/obj/doors/airlocks/station/wood.dmi and b/icons/obj/doors/airlocks/station/wood.dmi differ diff --git a/icons/obj/doors/airlocks/station2/glass.dmi b/icons/obj/doors/airlocks/station2/glass.dmi index 91f81251dfecd..ce3057e11a5e2 100644 Binary files a/icons/obj/doors/airlocks/station2/glass.dmi and b/icons/obj/doors/airlocks/station2/glass.dmi differ diff --git a/icons/obj/doors/airlocks/station2/overlays.dmi b/icons/obj/doors/airlocks/station2/overlays.dmi index 3d1de757a0632..5077f706fa306 100644 Binary files a/icons/obj/doors/airlocks/station2/overlays.dmi and b/icons/obj/doors/airlocks/station2/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/survival/survival.dmi b/icons/obj/doors/airlocks/survival/survival.dmi index 006d57ba8027d..d22edfb5f0418 100644 Binary files a/icons/obj/doors/airlocks/survival/survival.dmi and b/icons/obj/doors/airlocks/survival/survival.dmi differ diff --git a/icons/obj/doors/airlocks/survival/survival_overlays.dmi b/icons/obj/doors/airlocks/survival/survival_overlays.dmi index 3bf8260e71b2c..6de53b39bded9 100644 Binary files a/icons/obj/doors/airlocks/survival/survival_overlays.dmi and b/icons/obj/doors/airlocks/survival/survival_overlays.dmi differ diff --git a/icons/obj/doors/airlocks/vault/overlays.dmi b/icons/obj/doors/airlocks/vault/overlays.dmi index e19b9759fc21f..3fb871f06b98b 100644 Binary files a/icons/obj/doors/airlocks/vault/overlays.dmi and b/icons/obj/doors/airlocks/vault/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/vault/vault.dmi b/icons/obj/doors/airlocks/vault/vault.dmi index 284cb8946a214..e2731c8407e8b 100644 Binary files a/icons/obj/doors/airlocks/vault/vault.dmi and b/icons/obj/doors/airlocks/vault/vault.dmi differ diff --git a/icons/obj/doors/edge_Doorfire.dmi b/icons/obj/doors/edge_Doorfire.dmi index 295d38b30fd01..4489c31bed984 100644 Binary files a/icons/obj/doors/edge_Doorfire.dmi and b/icons/obj/doors/edge_Doorfire.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index be09a9279e288..f754dac8fc14b 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi index 839145a94ab9f..c9fafe112e226 100644 Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 9878cdcf69f7d..7cc76d1cf3016 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index f669a838b03e2..f61a09c13a664 100644 Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index ab24d8ae4a708..f4d4f27e43235 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index 0824557c46cd7..d9ad7eb6eb953 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/icons/obj/guns/toy.dmi b/icons/obj/guns/toy.dmi index e9425b4d9aa40..edf584b6eee96 100644 Binary files a/icons/obj/guns/toy.dmi and b/icons/obj/guns/toy.dmi differ diff --git a/icons/obj/hand_of_god_structures.dmi b/icons/obj/hand_of_god_structures.dmi index 93743bc4f9102..03623473c1e76 100644 Binary files a/icons/obj/hand_of_god_structures.dmi and b/icons/obj/hand_of_god_structures.dmi differ diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi index 650199ae909e8..a2ac396109460 100644 Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/hydroponics/growing.dmi index 6bc3b1f5048d4..29f5a6c9d15d7 100644 Binary files a/icons/obj/hydroponics/growing.dmi and b/icons/obj/hydroponics/growing.dmi differ diff --git a/icons/obj/hydroponics/growing_flowers.dmi b/icons/obj/hydroponics/growing_flowers.dmi index e0476c80fe8cb..958936f7a6edb 100644 Binary files a/icons/obj/hydroponics/growing_flowers.dmi and b/icons/obj/hydroponics/growing_flowers.dmi differ diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index 36f89438948ad..3e56a4cbb0c6d 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 971df8a14e70a..a5ccf86b3af52 100644 Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index 9fee5817e2690..2a296e38ae605 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/iv_drip.dmi b/icons/obj/iv_drip.dmi index 8588dbaf15adf..990cfdbcb4e5d 100644 Binary files a/icons/obj/iv_drip.dmi and b/icons/obj/iv_drip.dmi differ diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi index 85c5ff7bfc7ad..ad3fdb449b405 100644 Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ diff --git a/icons/obj/lavaland/ash_flora.dmi b/icons/obj/lavaland/ash_flora.dmi index 77184b3116351..dfa00bb06a4a8 100644 Binary files a/icons/obj/lavaland/ash_flora.dmi and b/icons/obj/lavaland/ash_flora.dmi differ diff --git a/icons/obj/lavaland/elite_trophies.dmi b/icons/obj/lavaland/elite_trophies.dmi index d194c93853dbb..7853f278cd20e 100644 Binary files a/icons/obj/lavaland/elite_trophies.dmi and b/icons/obj/lavaland/elite_trophies.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 0086ef52a484f..0339445f343a3 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/icons/obj/lighting_overlay.dmi b/icons/obj/lighting_overlay.dmi index 3897cbef30588..f9f3fd6cee323 100644 Binary files a/icons/obj/lighting_overlay.dmi and b/icons/obj/lighting_overlay.dmi differ diff --git a/icons/obj/machines/stasis.dmi b/icons/obj/machines/stasis.dmi index f859db850e8bf..52c657f5b4bbd 100755 Binary files a/icons/obj/machines/stasis.dmi and b/icons/obj/machines/stasis.dmi differ diff --git a/icons/obj/modular_console.dmi b/icons/obj/modular_console.dmi index 56c90feb5efcd..fba79f7a8879e 100644 Binary files a/icons/obj/modular_console.dmi and b/icons/obj/modular_console.dmi differ diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/modular_laptop.dmi index 17f5ea8019744..52ed524d2aeb3 100644 Binary files a/icons/obj/modular_laptop.dmi and b/icons/obj/modular_laptop.dmi differ diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi index f5ecfea6ea939..80b5839aa44f6 100644 Binary files a/icons/obj/modular_tablet.dmi and b/icons/obj/modular_tablet.dmi differ diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi index 8f60481e1187f..6ba2cae258049 100644 Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ diff --git a/icons/obj/musician.dmi b/icons/obj/musician.dmi index 1d54502a7afe0..09ac7cdc34483 100644 Binary files a/icons/obj/musician.dmi and b/icons/obj/musician.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index f27e777e27bc8..019519c4ff89c 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index a2c31f830caf3..132738fec2b5a 100644 Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi index f872f78693696..513e76d205245 100644 Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ diff --git a/icons/obj/pool.dmi b/icons/obj/pool.dmi new file mode 100644 index 0000000000000..54135ea36349e Binary files /dev/null and b/icons/obj/pool.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index 0f74eb932d841..e1b6bca404b06 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi index d72063f185842..766fa2622f4ad 100644 Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ diff --git a/icons/obj/slimecrossing.dmi b/icons/obj/slimecrossing.dmi index 5e27fe7d7779c..6e67f935b4fe4 100644 Binary files a/icons/obj/slimecrossing.dmi and b/icons/obj/slimecrossing.dmi differ diff --git a/icons/obj/smooth_structures/alien/flesh1.dmi b/icons/obj/smooth_structures/alien/flesh1.dmi deleted file mode 100644 index 4fb16c4d3f126..0000000000000 Binary files a/icons/obj/smooth_structures/alien/flesh1.dmi and /dev/null differ diff --git a/icons/obj/smooth_structures/alien/flesh2.dmi b/icons/obj/smooth_structures/alien/flesh2.dmi deleted file mode 100644 index c1e67667f5698..0000000000000 Binary files a/icons/obj/smooth_structures/alien/flesh2.dmi and /dev/null differ diff --git a/icons/obj/smooth_structures/alien/flesh3.dmi b/icons/obj/smooth_structures/alien/flesh3.dmi deleted file mode 100644 index 01f4f91808b83..0000000000000 Binary files a/icons/obj/smooth_structures/alien/flesh3.dmi and /dev/null differ diff --git a/icons/obj/smooth_structures/alien/fleshpolyp.dmi b/icons/obj/smooth_structures/alien/fleshpolyp.dmi deleted file mode 100644 index a4df3a344cbb1..0000000000000 Binary files a/icons/obj/smooth_structures/alien/fleshpolyp.dmi and /dev/null differ diff --git a/icons/obj/smooth_structures/plasmaglass_table.dmi b/icons/obj/smooth_structures/plasmaglass_table.dmi new file mode 100644 index 0000000000000..808e79aa43b13 Binary files /dev/null and b/icons/obj/smooth_structures/plasmaglass_table.dmi differ diff --git a/icons/obj/sofa.dmi b/icons/obj/sofa.dmi index eae5abfa0545b..a5591021d6897 100644 Binary files a/icons/obj/sofa.dmi and b/icons/obj/sofa.dmi differ diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index 3c3fb9b555d53..03c9cae862fc6 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/icons/obj/stairs.dmi b/icons/obj/stairs.dmi index 002d362f6765a..5c3f378ced99d 100644 Binary files a/icons/obj/stairs.dmi and b/icons/obj/stairs.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 6da692faa1d62..d9973a27265d6 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 6b22c7d154cd6..2de9e10acb8af 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/supplypods.dmi b/icons/obj/supplypods.dmi index 19af3053d9f08..54d1ad1bce5f1 100644 Binary files a/icons/obj/supplypods.dmi and b/icons/obj/supplypods.dmi differ diff --git a/icons/obj/supplypods_32x32.dmi b/icons/obj/supplypods_32x32.dmi new file mode 100644 index 0000000000000..855132f6494dd Binary files /dev/null and b/icons/obj/supplypods_32x32.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 8b825b41d445d..c81ac7bdee149 100755 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/tank.dmi b/icons/obj/tank.dmi index 6f0c30b5c8f76..b1330ae99c66b 100644 Binary files a/icons/obj/tank.dmi and b/icons/obj/tank.dmi differ diff --git a/icons/obj/tapes.dmi b/icons/obj/tapes.dmi new file mode 100644 index 0000000000000..a406a4dd1f9ab Binary files /dev/null and b/icons/obj/tapes.dmi differ diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index 5c0363fc208a6..a51c8833439e9 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 b7f42a61e2bf5..439a577916d2c 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index 57fea2fe4293d..572b44295a521 100644 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index ee1e358b7e30f..63993f6ae0243 100644 Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ diff --git a/icons/obj/wiremod.dmi b/icons/obj/wiremod.dmi new file mode 100644 index 0000000000000..e4f9afc8681b5 Binary files /dev/null and b/icons/obj/wiremod.dmi differ diff --git a/icons/obj/wiremod_fab.dmi b/icons/obj/wiremod_fab.dmi new file mode 100644 index 0000000000000..d41ec99ce5f14 Binary files /dev/null and b/icons/obj/wiremod_fab.dmi differ diff --git a/icons/runtime/README.md b/icons/runtime/README.md new file mode 100644 index 0000000000000..84b87e98c9cc5 --- /dev/null +++ b/icons/runtime/README.md @@ -0,0 +1,5 @@ +# Runtime Loaded Icons + +These icons are not compiled into the .rsc or are otherwise loaded at runtime. + +Please keep all (non-config) icons that do this in this folder as it is needed by the [deploy.sh](../../tools/deploy.sh) script to minimize build output. \ No newline at end of file diff --git a/icons/default_title.dmi b/icons/runtime/default_title.dmi similarity index 100% rename from icons/default_title.dmi rename to icons/runtime/default_title.dmi diff --git a/icons/turf/debug.dmi b/icons/turf/debug.dmi new file mode 100644 index 0000000000000..e419b2bf46d5b Binary files /dev/null and b/icons/turf/debug.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 4057e33137147..3d5878494f659 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi index dd6c7f3a7c08b..1d749763c0b3c 100644 Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index 01d015e621b46..4372472700c1c 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -6,7 +6,7 @@ var/wikiurl = CONFIG_GET(string/wikiurl) if(wikiurl) if(query) - var/output = wikiurl + "/index.php?title=Special%3ASearch&profile=default&search=" + query + var/output = wikiurl + "/Special:Search/" + query src << link(output) else if (query != null) src << link(wikiurl) @@ -260,10 +260,10 @@ Any-Mode: (hotkey doesn't need to be on) switch(SSmapping.config?.map_name) if("Box Station") map_in_url = "box" if("Delta Station") map_in_url = "delta" - if("Donutstation") map_in_url = "donut" if("MetaStation") map_in_url = "meta" if("Kilo Station") map_in_url = "kilo" if("PubbyStation") map_in_url = "pubby" + if("CorgStation") map_in_url = "corg" if(map_in_url) if(alert("This will open the current map in your browser. Are you sure?",,"Yes","No")!="Yes") return diff --git a/interface/menu.dm b/interface/menu.dm deleted file mode 100644 index 2923910713dbb..0000000000000 --- a/interface/menu.dm +++ /dev/null @@ -1,64 +0,0 @@ -/* -/datum/verbs/menu/Example/verb/Example() - set name = "" //if this starts with @ the verb is not created and name becomes the command to invoke. - set desc = "" //desc is the text given to this entry in the menu - //You can not use src in these verbs. It will be the menu at compile time, but the client at runtime. -*/ - -GLOBAL_LIST_EMPTY(menulist) - -/datum/verbs/menu - var/checkbox = CHECKBOX_NONE //checkbox type. - var/default //default checked type. - //Set to true to append our children to our parent, - //Rather then add us as a node (used for having more then one checkgroups in the same menu) - -/datum/verbs/menu/GetList() - return GLOB.menulist - -/datum/verbs/menu/HandleVerb(list/entry, verbpath, client/C) - var/datum/verbs/menu/verb_true_parent = GLOB.menulist[verblist[verbpath]] - var/true_checkbox = verb_true_parent.checkbox - if (true_checkbox != CHECKBOX_NONE) - var/checkedverb = verb_true_parent.Get_checked(C) - if (true_checkbox == CHECKBOX_GROUP) - if (verbpath == checkedverb) - entry["is-checked"] = TRUE - else - entry["is-checked"] = FALSE - else if (true_checkbox == CHECKBOX_TOGGLE) - entry["is-checked"] = checkedverb - - entry["command"] = ".updatemenuchecked \"[verb_true_parent.type]\" \"[verbpath]\"\n[entry["command"]]" - entry["can-check"] = TRUE - entry["group"] = "[verb_true_parent.type]" - return list2params(entry) - -/datum/verbs/menu/proc/Get_checked(client/C) - return C.prefs.menuoptions[type] || default || FALSE - -/datum/verbs/menu/proc/Load_checked(client/C) //Loads the checked menu item into a new client. Used by icon menus to invoke the checked item. - return - -/datum/verbs/menu/proc/Set_checked(client/C, verbpath) - if (checkbox == CHECKBOX_GROUP) - C.prefs.menuoptions[type] = verbpath - C.prefs.save_preferences() - else if (checkbox == CHECKBOX_TOGGLE) - var/checked = Get_checked(C) - C.prefs.menuoptions[type] = !checked - C.prefs.save_preferences() - winset(C, "[verbpath]", "is-checked = [!checked]") - -/client/verb/updatemenuchecked(menutype as text, verbpath as text) - set name = ".updatemenuchecked" - menutype = text2path(menutype) - verbpath = text2path(verbpath) - if (!menutype || !verbpath) - return - var/datum/verbs/menu/M = GLOB.menulist[menutype] - if (!M) - return - if (!(verbpath in typesof("[menutype]/verb"))) - return - M.Set_checked(src, verbpath) diff --git a/interface/skin.dmf b/interface/skin.dmf index d1284c0e0e826..2c98bb06bf847 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1,332 +1,364 @@ -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 = 372,0 - size = 640x440 - anchor1 = none - anchor2 = none - 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 = 3,0 - size = 634x417 - anchor1 = 0,0 - anchor2 = 100,100 - saved-params = "splitter" - left = "mapwindow" - right = "infowindow" - is-vert = true - elem "asset_cache_browser" - type = BROWSER - pos = 0,0 - size = 200x200 - anchor1 = none - anchor2 = none - is-visible = false - saved-params = "" - elem "tooltip" - type = BROWSER - pos = 0,0 - size = 999x999 - anchor1 = none - anchor2 = none - is-visible = false - saved-params = "" - 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 "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 "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 "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 - -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 - text-color = none - is-default = true - saved-params = "zoom;letterbox;zoom-mode" - style = ".chatOverhead {font-family: 'Small Fonts'; -dm-text-outline: 1 black; font-size: 7px;}" - -window "infowindow" - elem "infowindow" - type = MAIN - pos = 281,0 - size = 640x480 - anchor1 = none - anchor2 = none - background-color = none - saved-params = "pos;size;is-minimized;is-maximized" - is-pane = true - outer-size = 656x538 - inner-size = 640x499 - elem "discord" - type = BUTTON - pos = 607,5 - size = 20x20 - anchor1 = 94,0 - anchor2 = 97,0 - background-color = none - saved-params = "is-checked" - text = "" - image = 'icons\\discord.png' - command = "discord" - elem "donate" - type = BUTTON - pos = 574,5 - size = 20x20 - anchor1 = 90,0 - anchor2 = 94,0 - background-color = none - saved-params = "is-checked" - text = "" - image = 'icons\\patreon.png' - command = "donate" - elem "info" - type = CHILD - pos = 0,32 - size = 640x445 - anchor1 = 0,0 - anchor2 = 100,100 - background-color = none - saved-params = "splitter" - left = "statwindow" - right = "outputwindow" - is-vert = false - elem "changelog" - type = BUTTON - pos = 16,5 - size = 88x20 - anchor1 = 3,0 - anchor2 = 19,0 - background-color = none - saved-params = "is-checked" - text = "Changelog" - command = "changelog" - elem "rules" - type = BUTTON - pos = 104,5 - size = 88x20 - anchor1 = 19,0 - anchor2 = 34,0 - background-color = none - saved-params = "is-checked" - text = "Rules" - command = "rules" - elem "wiki" - type = BUTTON - pos = 192,5 - size = 88x20 - anchor1 = 34,0 - anchor2 = 50,0 - background-color = none - saved-params = "is-checked" - text = "Wiki" - command = "wiki" - elem "forum" - type = BUTTON - pos = 280,5 - size = 88x20 - anchor1 = 50,0 - anchor2 = 66,0 - background-color = none - saved-params = "is-checked" - text = "Forum" - command = "forum" - elem "github" - type = BUTTON - pos = 368,5 - size = 88x20 - anchor1 = 66,0 - anchor2 = 81,0 - background-color = none - saved-params = "is-checked" - text = "Github" - command = "github" - elem "report-issue" - type = BUTTON - pos = 466,5 - size = 78x20 - anchor1 = 81,0 - anchor2 = 97,0 - background-color = none - saved-params = "is-checked" - text = "Report Issue" - command = "report-issue" - -window "outputwindow" - elem "outputwindow" - type = MAIN - pos = 372,0 - size = 640x480 - anchor1 = none - anchor2 = none - saved-params = "pos;size;is-minimized;is-maximized" - is-pane = true - elem "browseroutput" - type = BROWSER - pos = 0,0 - size = 640x480 - anchor1 = 0,0 - anchor2 = 100,100 - background-color = #ffffff - is-visible = false - is-disabled = true - saved-params = "" - elem "output" - type = OUTPUT - pos = 0,0 - size = 640x480 - anchor1 = 0,0 - anchor2 = 100,100 - is-default = true - saved-params = "" - -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" - -window "statwindow" - elem "statwindow" - type = MAIN - pos = 281,0 - size = 640x480 - anchor1 = none - anchor2 = none - background-color = none - saved-params = "pos;size;is-minimized;is-maximized" - is-pane = true - outer-size = 656x538 - inner-size = 640x499 - elem "stat" - type = INFO - pos = 0,0 - size = 640x480 - anchor1 = 0,0 - anchor2 = 100,100 - is-default = true - saved-params = "" - tab-background-color = none - +macro "default" + +macro "input_box_macro" + + +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 = 372,0 + size = 640x440 + anchor1 = none + anchor2 = none + 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 = 3,0 + size = 634x440 + anchor1 = 0,0 + anchor2 = 100,100 + saved-params = "splitter" + left = "mapwindow" + right = "infowindow" + is-vert = true + elem "asset_cache_browser" + type = BROWSER + pos = 0,0 + size = 200x200 + anchor1 = none + anchor2 = none + is-visible = false + saved-params = "" + elem "tooltip" + type = BROWSER + pos = 0,0 + size = 999x999 + anchor1 = none + anchor2 = none + 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 + text-color = none + is-default = true + saved-params = "zoom;letterbox;zoom-mode" + style=".center { text-align: center; } .maptext { font-family: 'Small Fonts'; font-size: 7px; -dm-text-outline: 1px black; color: white; } .small { font-size: 6px; } .big { font-size: 8px; } .reallybig { font-size: 8px; } .extremelybig { font-size: 8px; } .greentext { color: #00FF00; font-size: 7px; } .redtext { color: #FF0000; font-size: 7px; } .clowntext { color: #FF69Bf !important; font-size: 9px; font-weight: bold; } .megaphone { font-size: 9px; } .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; } .italics { font-size: 6px; } .emote { font-size: 6px; }" + +window "infowindow" + elem "infowindow" + type = MAIN + pos = 281,0 + size = 640x480 + anchor1 = none + anchor2 = none + saved-params = "pos;size;is-minimized;is-maximized" + is-pane = true + elem "discord" + type = BUTTON + pos = 607,5 + size = 20x20 + anchor1 = 94,0 + anchor2 = 97,0 + saved-params = "is-checked" + text = "" + image = 'icons\\discord.png' + command = "discord" + elem "donate" + type = BUTTON + pos = 574,5 + size = 20x20 + anchor1 = 90,0 + anchor2 = 94,0 + saved-params = "is-checked" + text = "" + image = 'icons\\patreon.png' + command = "donate" + elem "info" + type = CHILD + pos = 0,32 + size = 640x445 + anchor1 = 0,0 + anchor2 = 100,100 + saved-params = "splitter" + right = "outputwindow" + is-vert = false + elem "changelog" + type = BUTTON + pos = 16,5 + size = 88x20 + anchor1 = 3,0 + anchor2 = 19,0 + saved-params = "is-checked" + text = "Changelog" + command = "changelog" + elem "rules" + type = BUTTON + pos = 104,5 + size = 88x20 + anchor1 = 19,0 + anchor2 = 34,0 + saved-params = "is-checked" + text = "Rules" + command = "rules" + elem "wiki" + type = BUTTON + pos = 192,5 + size = 88x20 + anchor1 = 34,0 + anchor2 = 50,0 + saved-params = "is-checked" + text = "Wiki" + command = "wiki" + elem "forum" + type = BUTTON + pos = 280,5 + size = 88x20 + anchor1 = 50,0 + anchor2 = 66,0 + saved-params = "is-checked" + text = "Forum" + command = "forum" + elem "github" + type = BUTTON + pos = 368,5 + size = 88x20 + anchor1 = 66,0 + anchor2 = 81,0 + saved-params = "is-checked" + text = "Github" + command = "github" + elem "report-issue" + type = BUTTON + pos = 466,5 + size = 78x20 + anchor1 = 81,0 + anchor2 = 97,0 + saved-params = "is-checked" + text = "Report Issue" + command = "report-issue" + +window "outputwindow" + elem "outputwindow" + type = MAIN + pos = 281,0 + size = 640x960 + anchor1 = none + anchor2 = none + background-color = none + saved-params = "pos;size;is-minimized;is-maximized" + is-pane = true + outer-size = 656x1017 + inner-size = 640x979 + elem "input" + type = INPUT + pos = 0,940 + size = 520x20 + anchor1 = 0,100 + anchor2 = 100,100 + background-color = #d3b5b5 + is-default = true + border = sunken + saved-params = "command" + elem "oocbutton" + type = BUTTON + pos = 600,940 + size = 40x20 + anchor1 = 100,100 + anchor2 = none + background-color = 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 "saybutton" + type = BUTTON + pos = 520,940 + size = 40x20 + anchor1 = 100,100 + anchor2 = none + background-color = 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 "mebutton" + type = BUTTON + pos = 560,940 + size = 40x20 + anchor1 = 100,100 + anchor2 = none + background-color = 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 + elem "browseroutput" + type = BROWSER + pos = 0,0 + size = 640x940 + anchor1 = 0,0 + anchor2 = 100,100 + background-color = #ffffff + is-visible = false + is-disabled = true + saved-params = "" + elem "output" + type = OUTPUT + pos = 0,0 + size = 640x940 + anchor1 = 0,0 + anchor2 = 100,100 + is-default = true + saved-params = "" + +window "popupwindow" + elem "popupwindow" + type = MAIN + pos = 281,0 + size = 120x120 + anchor1 = -1,-1 + anchor2 = -1,-1 + is-visible = false + saved-params = "pos;size;is-minimized;is-maximized" + statusbar = false + can-resize = false + +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" + +window "input_box" + elem "input_box" + type = MAIN + pos = 759,487 + size = 302x86 + anchor1 = 50,50 + anchor2 = 50,50 + background-color = none + is-visible = false + saved-params = "" + statusbar = false + can-minimize = false + can-resize = false + outer-size = 308x114 + inner-size = 302x86 + elem "input" + type = INPUT + pos = 11,17 + size = 281x23 + anchor1 = 4,20 + anchor2 = 96,47 + font-size = 7 + border = sunken + saved-params = "" + elem "accept" + type = BUTTON + pos = 52,52 + size = 75x23 + anchor1 = 17,60 + anchor2 = 42,87 + font-size = 7 + background-color = none + saved-params = "" + text = "OK" + command = "" + elem "cancel" + type = BUTTON + pos = 179,52 + size = 75x23 + anchor1 = 59,60 + anchor2 = 84,87 + font-size = 7 + background-color = none + saved-params = "" + text = "Cancel" + command = "" + diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index d3358e18b924b..bed4663497be2 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -42,6 +42,7 @@ em {font-style: normal; font-weight: bold;} .binarysay a:active, .binarysay a:visited {color: #88ff88;} .radio {color: #008000;} .sciradio {color: #993399;} +.explradio {color: #7ed4c2;} .comradio {color: #948f02;} .secradio {color: #a30000;} .medradio {color: #337296;} @@ -90,6 +91,7 @@ h1.alert, h2.alert {color: #000000;} .cultlarge {color: #960000; font-weight: bold; font-size: 3;} .narsie {color: #960000; font-weight: bold; font-size: 15;} .narsiesmall {color: #960000; font-weight: bold; font-size: 6;} +.narsiesmaller {color: #960000; font-weight: bold; font-size: 3;} .colossus {color: #7F282A; font-size: 5;} .hierophant {color: #660099; font-weight: bold; font-style: italic;} .hierophant_warning {color: #660099; font-style: italic;} @@ -114,6 +116,7 @@ h1.alert, h2.alert {color: #000000;} .leader_brass {color: #BE8700; font-size: 16px;} .big_brass {color: #BE8700; font-size: 3; font-weight: bold; font-style: italic;} .ratvar {color: #BE8700; font-size: 6; font-weight: bold; font-style: italic; animation: ratvarcolor 5000ms infinite;} +.ratvarsmall {color: #BE8700; font-size: 3; font-weight: bold; font-style: italic; animation: ratvarcolor 5000ms infinite;} .alloy {color: #42474D;} .heavy_alloy {color: #42474D; font-weight: bold; font-style: italic;} .nezbere_large {color: #42474D; font-size: 3; font-weight: bold; font-style: italic;} @@ -166,6 +169,7 @@ h1.alert, h2.alert {color: #000000;} .robot {font-family: "Courier New", cursive, sans-serif;} .command_headset {font-weight: bold; font-size: 3;} +.megaphone {font-weight: bold; font-size: 3;} .small {font-size: 1;} .big {font-size: 3;} .reallybig {font-size: 4;} diff --git a/libbyond-extools.so b/libbyond-extools.so deleted file mode 100644 index 307bd0d6c6dc7..0000000000000 Binary files a/libbyond-extools.so and /dev/null differ diff --git a/rust_g.dll b/rust_g.dll index 24922d03cf45e..3c53cf871afcb 100644 Binary files a/rust_g.dll and b/rust_g.dll differ diff --git a/sound/ai/baystation/aliens.ogg b/sound/ai/baystation/aliens.ogg new file mode 100644 index 0000000000000..9813204830b5d Binary files /dev/null and b/sound/ai/baystation/aliens.ogg differ diff --git a/sound/ai/baystation/attention.ogg b/sound/ai/baystation/attention.ogg new file mode 100644 index 0000000000000..61eb8d44d820c Binary files /dev/null and b/sound/ai/baystation/attention.ogg differ diff --git a/sound/ai/baystation/commandreport.ogg b/sound/ai/baystation/commandreport.ogg new file mode 100644 index 0000000000000..3692140439918 Binary files /dev/null and b/sound/ai/baystation/commandreport.ogg differ diff --git a/sound/ai/baystation/granomalies.ogg b/sound/ai/baystation/granomalies.ogg new file mode 100644 index 0000000000000..89a776c385707 Binary files /dev/null and b/sound/ai/baystation/granomalies.ogg differ diff --git a/sound/ai/baystation/intercept.ogg b/sound/ai/baystation/intercept.ogg new file mode 100644 index 0000000000000..c0a3c6c783080 Binary files /dev/null and b/sound/ai/baystation/intercept.ogg differ diff --git a/sound/ai/baystation/ionstorm.ogg b/sound/ai/baystation/ionstorm.ogg new file mode 100644 index 0000000000000..4bb414e5c9b78 Binary files /dev/null and b/sound/ai/baystation/ionstorm.ogg differ diff --git a/sound/ai/baystation/meteors.ogg b/sound/ai/baystation/meteors.ogg new file mode 100644 index 0000000000000..4e7cdd11cc185 Binary files /dev/null and b/sound/ai/baystation/meteors.ogg differ diff --git a/sound/ai/baystation/outbreak5.ogg b/sound/ai/baystation/outbreak5.ogg new file mode 100644 index 0000000000000..fbdb8eed00712 Binary files /dev/null and b/sound/ai/baystation/outbreak5.ogg differ diff --git a/sound/ai/baystation/outbreak7.ogg b/sound/ai/baystation/outbreak7.ogg new file mode 100644 index 0000000000000..f35e65be9a275 Binary files /dev/null and b/sound/ai/baystation/outbreak7.ogg differ diff --git a/sound/ai/baystation/poweroff.ogg b/sound/ai/baystation/poweroff.ogg new file mode 100644 index 0000000000000..f445f195c1d77 Binary files /dev/null and b/sound/ai/baystation/poweroff.ogg differ diff --git a/sound/ai/baystation/poweron.ogg b/sound/ai/baystation/poweron.ogg new file mode 100644 index 0000000000000..8cc3058ca078c Binary files /dev/null and b/sound/ai/baystation/poweron.ogg differ diff --git a/sound/ai/baystation/radiation.ogg b/sound/ai/baystation/radiation.ogg new file mode 100644 index 0000000000000..18e112a7685fd Binary files /dev/null and b/sound/ai/baystation/radiation.ogg differ diff --git a/sound/ai/baystation/shuttlecalled_static.ogg b/sound/ai/baystation/shuttlecalled_static.ogg new file mode 100644 index 0000000000000..ce2ffd787e165 Binary files /dev/null and b/sound/ai/baystation/shuttlecalled_static.ogg differ diff --git a/sound/ai/baystation/shuttledock.ogg b/sound/ai/baystation/shuttledock.ogg new file mode 100644 index 0000000000000..82fac215d6199 Binary files /dev/null and b/sound/ai/baystation/shuttledock.ogg differ diff --git a/sound/ai/baystation/shuttlerecalled.ogg b/sound/ai/baystation/shuttlerecalled.ogg new file mode 100644 index 0000000000000..352990875cda0 Binary files /dev/null and b/sound/ai/baystation/shuttlerecalled.ogg differ diff --git a/sound/ai/baystation/spanomalies.ogg b/sound/ai/baystation/spanomalies.ogg new file mode 100644 index 0000000000000..e5ababeab7a50 Binary files /dev/null and b/sound/ai/baystation/spanomalies.ogg differ diff --git a/sound/ai/baystation/welcome.ogg b/sound/ai/baystation/welcome.ogg new file mode 100644 index 0000000000000..2224cabb2c5a4 Binary files /dev/null and b/sound/ai/baystation/welcome.ogg differ diff --git a/sound/ai/aimalf.ogg b/sound/ai/default/aimalf.ogg similarity index 100% rename from sound/ai/aimalf.ogg rename to sound/ai/default/aimalf.ogg diff --git a/sound/ai/aliens.ogg b/sound/ai/default/aliens.ogg similarity index 100% rename from sound/ai/aliens.ogg rename to sound/ai/default/aliens.ogg diff --git a/sound/ai/animes.ogg b/sound/ai/default/animes.ogg similarity index 100% rename from sound/ai/animes.ogg rename to sound/ai/default/animes.ogg diff --git a/sound/ai/attention.ogg b/sound/ai/default/attention.ogg similarity index 100% rename from sound/ai/attention.ogg rename to sound/ai/default/attention.ogg diff --git a/sound/ai/commandreport.ogg b/sound/ai/default/commandreport.ogg similarity index 100% rename from sound/ai/commandreport.ogg rename to sound/ai/default/commandreport.ogg diff --git a/sound/ai/granomalies.ogg b/sound/ai/default/granomalies.ogg similarity index 100% rename from sound/ai/granomalies.ogg rename to sound/ai/default/granomalies.ogg diff --git a/sound/ai/intercept.ogg b/sound/ai/default/intercept.ogg similarity index 100% rename from sound/ai/intercept.ogg rename to sound/ai/default/intercept.ogg diff --git a/sound/ai/ionstorm.ogg b/sound/ai/default/ionstorm.ogg similarity index 100% rename from sound/ai/ionstorm.ogg rename to sound/ai/default/ionstorm.ogg diff --git a/sound/ai/meteors.ogg b/sound/ai/default/meteors.ogg similarity index 100% rename from sound/ai/meteors.ogg rename to sound/ai/default/meteors.ogg diff --git a/sound/ai/outbreak5.ogg b/sound/ai/default/outbreak5.ogg similarity index 100% rename from sound/ai/outbreak5.ogg rename to sound/ai/default/outbreak5.ogg diff --git a/sound/ai/outbreak7.ogg b/sound/ai/default/outbreak7.ogg similarity index 100% rename from sound/ai/outbreak7.ogg rename to sound/ai/default/outbreak7.ogg diff --git a/sound/ai/poweroff.ogg b/sound/ai/default/poweroff.ogg similarity index 100% rename from sound/ai/poweroff.ogg rename to sound/ai/default/poweroff.ogg diff --git a/sound/ai/poweron.ogg b/sound/ai/default/poweron.ogg similarity index 100% rename from sound/ai/poweron.ogg rename to sound/ai/default/poweron.ogg diff --git a/sound/ai/radiation.ogg b/sound/ai/default/radiation.ogg similarity index 100% rename from sound/ai/radiation.ogg rename to sound/ai/default/radiation.ogg diff --git a/sound/ai/shuttlecalled.ogg b/sound/ai/default/shuttlecalled.ogg similarity index 100% rename from sound/ai/shuttlecalled.ogg rename to sound/ai/default/shuttlecalled.ogg diff --git a/sound/ai/shuttledock.ogg b/sound/ai/default/shuttledock.ogg similarity index 100% rename from sound/ai/shuttledock.ogg rename to sound/ai/default/shuttledock.ogg diff --git a/sound/ai/shuttlerecalled.ogg b/sound/ai/default/shuttlerecalled.ogg similarity index 100% rename from sound/ai/shuttlerecalled.ogg rename to sound/ai/default/shuttlerecalled.ogg diff --git a/sound/ai/spanomalies.ogg b/sound/ai/default/spanomalies.ogg similarity index 100% rename from sound/ai/spanomalies.ogg rename to sound/ai/default/spanomalies.ogg diff --git a/sound/ai/welcome.ogg b/sound/ai/default/welcome.ogg similarity index 100% rename from sound/ai/welcome.ogg rename to sound/ai/default/welcome.ogg diff --git a/sound/ai/intern/aimalf.ogg b/sound/ai/intern/aimalf.ogg new file mode 100644 index 0000000000000..b7996916b4750 Binary files /dev/null and b/sound/ai/intern/aimalf.ogg differ diff --git a/sound/ai/intern/alerts/1.ogg b/sound/ai/intern/alerts/1.ogg new file mode 100644 index 0000000000000..c4d182bc8c958 Binary files /dev/null and b/sound/ai/intern/alerts/1.ogg differ diff --git a/sound/ai/intern/alerts/10.ogg b/sound/ai/intern/alerts/10.ogg new file mode 100644 index 0000000000000..7380ccdeefdbb Binary files /dev/null and b/sound/ai/intern/alerts/10.ogg differ diff --git a/sound/ai/intern/alerts/11.ogg b/sound/ai/intern/alerts/11.ogg new file mode 100644 index 0000000000000..ca548dcc20a0c Binary files /dev/null and b/sound/ai/intern/alerts/11.ogg differ diff --git a/sound/ai/intern/alerts/12.ogg b/sound/ai/intern/alerts/12.ogg new file mode 100644 index 0000000000000..8d71419798fc3 Binary files /dev/null and b/sound/ai/intern/alerts/12.ogg differ diff --git a/sound/ai/intern/alerts/13.ogg b/sound/ai/intern/alerts/13.ogg new file mode 100644 index 0000000000000..128c7aa424d1a Binary files /dev/null and b/sound/ai/intern/alerts/13.ogg differ diff --git a/sound/ai/intern/alerts/14.ogg b/sound/ai/intern/alerts/14.ogg new file mode 100644 index 0000000000000..81d54101be5ce Binary files /dev/null and b/sound/ai/intern/alerts/14.ogg differ diff --git a/sound/ai/intern/alerts/2.ogg b/sound/ai/intern/alerts/2.ogg new file mode 100644 index 0000000000000..a2ef615d56c5f Binary files /dev/null and b/sound/ai/intern/alerts/2.ogg differ diff --git a/sound/ai/intern/alerts/3.ogg b/sound/ai/intern/alerts/3.ogg new file mode 100644 index 0000000000000..51613ff03679b Binary files /dev/null and b/sound/ai/intern/alerts/3.ogg differ diff --git a/sound/ai/intern/alerts/4.ogg b/sound/ai/intern/alerts/4.ogg new file mode 100644 index 0000000000000..874536ca72fd8 Binary files /dev/null and b/sound/ai/intern/alerts/4.ogg differ diff --git a/sound/ai/intern/alerts/5.ogg b/sound/ai/intern/alerts/5.ogg new file mode 100644 index 0000000000000..0af0d28ce1890 Binary files /dev/null and b/sound/ai/intern/alerts/5.ogg differ diff --git a/sound/ai/intern/alerts/6.ogg b/sound/ai/intern/alerts/6.ogg new file mode 100644 index 0000000000000..a65006a8c0138 Binary files /dev/null and b/sound/ai/intern/alerts/6.ogg differ diff --git a/sound/ai/intern/alerts/7.ogg b/sound/ai/intern/alerts/7.ogg new file mode 100644 index 0000000000000..4a1d3f013aea0 Binary files /dev/null and b/sound/ai/intern/alerts/7.ogg differ diff --git a/sound/ai/intern/alerts/8.ogg b/sound/ai/intern/alerts/8.ogg new file mode 100644 index 0000000000000..83ca80f4939b0 Binary files /dev/null and b/sound/ai/intern/alerts/8.ogg differ diff --git a/sound/ai/intern/alerts/9.ogg b/sound/ai/intern/alerts/9.ogg new file mode 100644 index 0000000000000..3c0c45b25d04b Binary files /dev/null and b/sound/ai/intern/alerts/9.ogg differ diff --git a/sound/ai/intern/aliens.ogg b/sound/ai/intern/aliens.ogg new file mode 100644 index 0000000000000..9dd3c0769785d Binary files /dev/null and b/sound/ai/intern/aliens.ogg differ diff --git a/sound/ai/intern/animes.ogg b/sound/ai/intern/animes.ogg new file mode 100644 index 0000000000000..36102c3e60ec2 Binary files /dev/null and b/sound/ai/intern/animes.ogg differ diff --git a/sound/ai/intern/commandreport/1.ogg b/sound/ai/intern/commandreport/1.ogg new file mode 100644 index 0000000000000..e3108b13d1768 Binary files /dev/null and b/sound/ai/intern/commandreport/1.ogg differ diff --git a/sound/ai/intern/commandreport/2.ogg b/sound/ai/intern/commandreport/2.ogg new file mode 100644 index 0000000000000..cd67500426c2d Binary files /dev/null and b/sound/ai/intern/commandreport/2.ogg differ diff --git a/sound/ai/intern/commandreport/3.ogg b/sound/ai/intern/commandreport/3.ogg new file mode 100644 index 0000000000000..94241c5ba52b4 Binary files /dev/null and b/sound/ai/intern/commandreport/3.ogg differ diff --git a/sound/ai/intern/granomalies.ogg b/sound/ai/intern/granomalies.ogg new file mode 100644 index 0000000000000..88944b63b2e64 Binary files /dev/null and b/sound/ai/intern/granomalies.ogg differ diff --git a/sound/ai/intern/intercept.ogg b/sound/ai/intern/intercept.ogg new file mode 100644 index 0000000000000..a87274abd975c Binary files /dev/null and b/sound/ai/intern/intercept.ogg differ diff --git a/sound/ai/intern/ionstorm.ogg b/sound/ai/intern/ionstorm.ogg new file mode 100644 index 0000000000000..9e7b5c6b23eb8 Binary files /dev/null and b/sound/ai/intern/ionstorm.ogg differ diff --git a/sound/ai/intern/meteors.ogg b/sound/ai/intern/meteors.ogg new file mode 100644 index 0000000000000..c68c4bd8cc4cc Binary files /dev/null and b/sound/ai/intern/meteors.ogg differ diff --git a/sound/ai/intern/outbreak5.ogg b/sound/ai/intern/outbreak5.ogg new file mode 100644 index 0000000000000..cf98b95fd7ba8 Binary files /dev/null and b/sound/ai/intern/outbreak5.ogg differ diff --git a/sound/ai/intern/outbreak7.ogg b/sound/ai/intern/outbreak7.ogg new file mode 100644 index 0000000000000..297a1bbe8db6c Binary files /dev/null and b/sound/ai/intern/outbreak7.ogg differ diff --git a/sound/ai/intern/poweroff.ogg b/sound/ai/intern/poweroff.ogg new file mode 100644 index 0000000000000..4b71053653f6e Binary files /dev/null and b/sound/ai/intern/poweroff.ogg differ diff --git a/sound/ai/intern/poweron.ogg b/sound/ai/intern/poweron.ogg new file mode 100644 index 0000000000000..509cd398e6eda Binary files /dev/null and b/sound/ai/intern/poweron.ogg differ diff --git a/sound/ai/intern/radiation.ogg b/sound/ai/intern/radiation.ogg new file mode 100644 index 0000000000000..08db53ebfd24c Binary files /dev/null and b/sound/ai/intern/radiation.ogg differ diff --git a/sound/ai/intern/shuttlecalled.ogg b/sound/ai/intern/shuttlecalled.ogg new file mode 100644 index 0000000000000..c903367cdffb5 Binary files /dev/null and b/sound/ai/intern/shuttlecalled.ogg differ diff --git a/sound/ai/intern/shuttledock.ogg b/sound/ai/intern/shuttledock.ogg new file mode 100644 index 0000000000000..9f6ccd1a93785 Binary files /dev/null and b/sound/ai/intern/shuttledock.ogg differ diff --git a/sound/ai/intern/shuttlerecalled.ogg b/sound/ai/intern/shuttlerecalled.ogg new file mode 100644 index 0000000000000..e259a79f35e40 Binary files /dev/null and b/sound/ai/intern/shuttlerecalled.ogg differ diff --git a/sound/ai/intern/spanomalies.ogg b/sound/ai/intern/spanomalies.ogg new file mode 100644 index 0000000000000..9bed8eae3aa08 Binary files /dev/null and b/sound/ai/intern/spanomalies.ogg differ diff --git a/sound/ai/intern/welcome/1.ogg b/sound/ai/intern/welcome/1.ogg new file mode 100644 index 0000000000000..758f1967e099a Binary files /dev/null and b/sound/ai/intern/welcome/1.ogg differ diff --git a/sound/ai/intern/welcome/2.ogg b/sound/ai/intern/welcome/2.ogg new file mode 100644 index 0000000000000..c2e72be510eda Binary files /dev/null and b/sound/ai/intern/welcome/2.ogg differ diff --git a/sound/ai/intern/welcome/3.ogg b/sound/ai/intern/welcome/3.ogg new file mode 100644 index 0000000000000..004f57371de1e Binary files /dev/null and b/sound/ai/intern/welcome/3.ogg differ diff --git a/sound/ai/intern/welcome/4.ogg b/sound/ai/intern/welcome/4.ogg new file mode 100644 index 0000000000000..c4e1f7667cd09 Binary files /dev/null and b/sound/ai/intern/welcome/4.ogg differ diff --git a/sound/ai/intern/welcome/5.ogg b/sound/ai/intern/welcome/5.ogg new file mode 100644 index 0000000000000..641b8208a4eb4 Binary files /dev/null and b/sound/ai/intern/welcome/5.ogg differ diff --git a/sound/ai/intern/welcome/6.ogg b/sound/ai/intern/welcome/6.ogg new file mode 100644 index 0000000000000..b0fc38237f881 Binary files /dev/null and b/sound/ai/intern/welcome/6.ogg differ diff --git a/sound/ai/medbot/aliens.ogg b/sound/ai/medbot/aliens.ogg new file mode 100644 index 0000000000000..57fa70c3caeca Binary files /dev/null and b/sound/ai/medbot/aliens.ogg differ diff --git a/sound/ai/medbot/animes.ogg b/sound/ai/medbot/animes.ogg new file mode 100644 index 0000000000000..7615a744a66eb Binary files /dev/null and b/sound/ai/medbot/animes.ogg differ diff --git a/sound/ai/medbot/attention.ogg b/sound/ai/medbot/attention.ogg new file mode 100644 index 0000000000000..d4d5a27085270 Binary files /dev/null and b/sound/ai/medbot/attention.ogg differ diff --git a/sound/ai/medbot/commandreport.ogg b/sound/ai/medbot/commandreport.ogg new file mode 100644 index 0000000000000..4e5c2e1d1ff29 Binary files /dev/null and b/sound/ai/medbot/commandreport.ogg differ diff --git a/sound/ai/medbot/granomalies.ogg b/sound/ai/medbot/granomalies.ogg new file mode 100644 index 0000000000000..2713a3cb1942e Binary files /dev/null and b/sound/ai/medbot/granomalies.ogg differ diff --git a/sound/ai/medbot/intercept.ogg b/sound/ai/medbot/intercept.ogg new file mode 100644 index 0000000000000..c59d0455c1ca0 Binary files /dev/null and b/sound/ai/medbot/intercept.ogg differ diff --git a/sound/ai/medbot/ionstorm.ogg b/sound/ai/medbot/ionstorm.ogg new file mode 100644 index 0000000000000..15aeac9f7ff91 Binary files /dev/null and b/sound/ai/medbot/ionstorm.ogg differ diff --git a/sound/ai/medbot/meteors.ogg b/sound/ai/medbot/meteors.ogg new file mode 100644 index 0000000000000..91208cae12230 Binary files /dev/null and b/sound/ai/medbot/meteors.ogg differ diff --git a/sound/ai/medbot/newAI.ogg b/sound/ai/medbot/newAI.ogg new file mode 100644 index 0000000000000..c40b0990206c4 Binary files /dev/null and b/sound/ai/medbot/newAI.ogg differ diff --git a/sound/ai/medbot/outbreak5.ogg b/sound/ai/medbot/outbreak5.ogg new file mode 100644 index 0000000000000..7118af4449242 Binary files /dev/null and b/sound/ai/medbot/outbreak5.ogg differ diff --git a/sound/ai/medbot/outbreak7.ogg b/sound/ai/medbot/outbreak7.ogg new file mode 100644 index 0000000000000..1fc542534dba5 Binary files /dev/null and b/sound/ai/medbot/outbreak7.ogg differ diff --git a/sound/ai/medbot/poweroff.ogg b/sound/ai/medbot/poweroff.ogg new file mode 100644 index 0000000000000..875df350025e7 Binary files /dev/null and b/sound/ai/medbot/poweroff.ogg differ diff --git a/sound/ai/medbot/poweron.ogg b/sound/ai/medbot/poweron.ogg new file mode 100644 index 0000000000000..4b1605b1c74d8 Binary files /dev/null and b/sound/ai/medbot/poweron.ogg differ diff --git a/sound/ai/medbot/radiation.ogg b/sound/ai/medbot/radiation.ogg new file mode 100644 index 0000000000000..5c48830b5f2f9 Binary files /dev/null and b/sound/ai/medbot/radiation.ogg differ diff --git a/sound/ai/medbot/shuttlecalled.ogg b/sound/ai/medbot/shuttlecalled.ogg new file mode 100644 index 0000000000000..a775567abed6f Binary files /dev/null and b/sound/ai/medbot/shuttlecalled.ogg differ diff --git a/sound/ai/medbot/shuttledock.ogg b/sound/ai/medbot/shuttledock.ogg new file mode 100644 index 0000000000000..933928db067ab Binary files /dev/null and b/sound/ai/medbot/shuttledock.ogg differ diff --git a/sound/ai/medbot/shuttlerecalled.ogg b/sound/ai/medbot/shuttlerecalled.ogg new file mode 100644 index 0000000000000..53b622576d4bd Binary files /dev/null and b/sound/ai/medbot/shuttlerecalled.ogg differ diff --git a/sound/ai/medbot/spanomalies.ogg b/sound/ai/medbot/spanomalies.ogg new file mode 100644 index 0000000000000..d710999e1e156 Binary files /dev/null and b/sound/ai/medbot/spanomalies.ogg differ diff --git a/sound/ai/medbot/welcome.ogg b/sound/ai/medbot/welcome.ogg new file mode 100644 index 0000000000000..f9a698fd08055 Binary files /dev/null and b/sound/ai/medbot/welcome.ogg differ diff --git a/sound/ambience/ambibasement.ogg b/sound/ambience/ambibasement.ogg new file mode 100644 index 0000000000000..648dcee36c01a Binary files /dev/null and b/sound/ambience/ambibasement.ogg differ diff --git a/sound/ambience/ambidet3.ogg b/sound/ambience/ambidet3.ogg new file mode 100644 index 0000000000000..c6b8ae7f35245 Binary files /dev/null and b/sound/ambience/ambidet3.ogg differ diff --git a/sound/ambience/ambidet4.ogg b/sound/ambience/ambidet4.ogg new file mode 100644 index 0000000000000..04c99b17818b5 Binary files /dev/null and b/sound/ambience/ambidet4.ogg differ diff --git a/sound/ambience/ambiearth.ogg b/sound/ambience/ambiearth.ogg new file mode 100644 index 0000000000000..815cada470ede Binary files /dev/null and b/sound/ambience/ambiearth.ogg differ diff --git a/sound/ambience/ambiearthduring.ogg b/sound/ambience/ambiearthduring.ogg new file mode 100644 index 0000000000000..536550aaf1d51 Binary files /dev/null and b/sound/ambience/ambiearthduring.ogg differ diff --git a/sound/ambience/ambifac.ogg b/sound/ambience/ambifac.ogg new file mode 100644 index 0000000000000..3330a162db6a6 Binary files /dev/null and b/sound/ambience/ambifac.ogg differ diff --git a/sound/ambience/ambiwind.ogg b/sound/ambience/ambiwind.ogg new file mode 100644 index 0000000000000..efa569340b2b0 Binary files /dev/null and b/sound/ambience/ambiwind.ogg differ diff --git a/sound/ambience/license.txt b/sound/ambience/license.txt index 5de3372983f35..85987c66256f3 100644 --- a/sound/ambience/license.txt +++ b/sound/ambience/license.txt @@ -1,9 +1,14 @@ -ambidet1.ogg is Fast Talking by Kevin Macleod. It has been licensed under the CC-BY 3.0 license. +ambidet1.ogg is Fast Talking by Kevin Macleod. It has been licensed under the CC-BY 3.0 license, found here: https://creativecommons.org/licenses/by/3.0/ It has been cropped for use ingame. -ambidet2.ogg is Night on the Docks, Piano by Kevin Macleod. It has been licensed under CC-BY 3.0 license. +ambidet2.ogg is Night on the Docks, Piano by Kevin Macleod. It has been licensed under CC-BY 3.0 license, found here: https://creativecommons.org/licenses/by/3.0/ It has been cropped for use ingame, and also fades in. -aurora_caelus.ogg is Music for Manatees, by Kevin Macleod. It has been licensed under CC-BY 3.0 license. +ambidet3.ogg is Cool Vibes by Kevin Macleod. It has been licensed under CC-BY 3.0 license, found here: https://creativecommons.org/licenses/by/3.0/ + It has been cropped for use ingame, and also fades in and out. +ambidet4.ogg is I Knew a Guy by Kevin Macleod. It has been licensed under CC-BY 3.0 license, found here: https://creativecommons.org/licenses/by/3.0/ + It has been cropped for use ingame, and also fades out. +aurora_caelus.ogg is Music for Manatees, by Kevin Macleod. It has been licensed under CC-BY 3.0 license, found here: https://creativecommons.org/licenses/by/3.0/ It has been cropped for use ingame, and also fades out. -antag/assimilation.ogg is Alien Spaceship UFO Sound effect, by Daniel Simon (http://soundbible.com/2213-Alien-Spaceship-UFO.html). It has been licensed under CC-BY 3.0 license. +antag/assimilation.ogg is Alien Spaceship UFO Sound effect, by Daniel Simon (http://soundbible.com/2213-Alien-Spaceship-UFO.html). It has been licensed under CC-BY 3.0 license, found here: https://creativecommons.org/licenses/by/3.0/ It has been cropped for use ingame, and also fades out -title0.ogg is Endless Space by Solus. It has been licensed under CC-BY 3.0 license. Source file downloaded from https://www.newgrounds.com/audio/listen/74946 +title0.ogg is Endless Space by Solus. It has been licensed under CC-BY 3.0 license, found here: https://creativecommons.org/licenses/by/3.0/ +Source file downloaded from https://www.newgrounds.com/audio/listen/74946 diff --git a/sound/ambience/qwerty/constellations.ogg b/sound/ambience/qwerty/constellations.ogg new file mode 100644 index 0000000000000..75e9c0d3ccf65 Binary files /dev/null and b/sound/ambience/qwerty/constellations.ogg differ diff --git a/sound/ambience/qwerty/starlight.ogg b/sound/ambience/qwerty/starlight.ogg new file mode 100644 index 0000000000000..67cd1bbb59ef7 Binary files /dev/null and b/sound/ambience/qwerty/starlight.ogg differ diff --git a/sound/ambience/secrets.ogg b/sound/ambience/secrets.ogg new file mode 100644 index 0000000000000..b420866477372 Binary files /dev/null and b/sound/ambience/secrets.ogg differ diff --git a/sound/ambience/singulambience.ogg b/sound/ambience/singulambience.ogg new file mode 100644 index 0000000000000..7a1f5fd60e4f4 Binary files /dev/null and b/sound/ambience/singulambience.ogg differ diff --git a/sound/creatures/bosspain.ogg b/sound/creatures/bosspain.ogg new file mode 100644 index 0000000000000..d00667fc79c71 Binary files /dev/null and b/sound/creatures/bosspain.ogg differ diff --git a/sound/creatures/bosspain2.ogg b/sound/creatures/bosspain2.ogg new file mode 100644 index 0000000000000..7bbd51e066cf5 Binary files /dev/null and b/sound/creatures/bosspain2.ogg differ diff --git a/sound/creatures/bosssight.ogg b/sound/creatures/bosssight.ogg new file mode 100644 index 0000000000000..89c2806ff63ad Binary files /dev/null and b/sound/creatures/bosssight.ogg differ diff --git a/sound/creatures/bosssight2.ogg b/sound/creatures/bosssight2.ogg new file mode 100644 index 0000000000000..941e3f7dbe29f Binary files /dev/null and b/sound/creatures/bosssight2.ogg differ diff --git a/sound/creatures/guarddeath.ogg b/sound/creatures/guarddeath.ogg new file mode 100644 index 0000000000000..0eb45504af240 Binary files /dev/null and b/sound/creatures/guarddeath.ogg differ diff --git a/sound/creatures/guarddeath2.ogg b/sound/creatures/guarddeath2.ogg new file mode 100644 index 0000000000000..9414871eb6094 Binary files /dev/null and b/sound/creatures/guarddeath2.ogg differ diff --git a/sound/creatures/guarddeath3.ogg b/sound/creatures/guarddeath3.ogg new file mode 100644 index 0000000000000..d24028f54de46 Binary files /dev/null and b/sound/creatures/guarddeath3.ogg differ diff --git a/sound/creatures/guarddeath4.ogg b/sound/creatures/guarddeath4.ogg new file mode 100644 index 0000000000000..88d68b1f434c3 Binary files /dev/null and b/sound/creatures/guarddeath4.ogg differ diff --git a/sound/creatures/heavydeath1.ogg b/sound/creatures/heavydeath1.ogg new file mode 100644 index 0000000000000..04f94298cd456 Binary files /dev/null and b/sound/creatures/heavydeath1.ogg differ diff --git a/sound/creatures/heavysight1.ogg b/sound/creatures/heavysight1.ogg new file mode 100644 index 0000000000000..d5f5b5c3bd71c Binary files /dev/null and b/sound/creatures/heavysight1.ogg differ diff --git a/sound/creatures/monkey/monkey_screech_1.ogg b/sound/creatures/monkey/monkey_screech_1.ogg new file mode 100644 index 0000000000000..45f8db6ac6b6e Binary files /dev/null and b/sound/creatures/monkey/monkey_screech_1.ogg differ diff --git a/sound/creatures/monkey/monkey_screech_2.ogg b/sound/creatures/monkey/monkey_screech_2.ogg new file mode 100644 index 0000000000000..5a5015916d4dc Binary files /dev/null and b/sound/creatures/monkey/monkey_screech_2.ogg differ diff --git a/sound/creatures/monkey/monkey_screech_3.ogg b/sound/creatures/monkey/monkey_screech_3.ogg new file mode 100644 index 0000000000000..4ba7b74d05f04 Binary files /dev/null and b/sound/creatures/monkey/monkey_screech_3.ogg differ diff --git a/sound/creatures/monkey/monkey_screech_4.ogg b/sound/creatures/monkey/monkey_screech_4.ogg new file mode 100644 index 0000000000000..87e7e157e9848 Binary files /dev/null and b/sound/creatures/monkey/monkey_screech_4.ogg differ diff --git a/sound/creatures/monkey/monkey_screech_5.ogg b/sound/creatures/monkey/monkey_screech_5.ogg new file mode 100644 index 0000000000000..fd8ccef0f69fb Binary files /dev/null and b/sound/creatures/monkey/monkey_screech_5.ogg differ diff --git a/sound/creatures/monkey/monkey_screech_6.ogg b/sound/creatures/monkey/monkey_screech_6.ogg new file mode 100644 index 0000000000000..cd9eddf198add Binary files /dev/null and b/sound/creatures/monkey/monkey_screech_6.ogg differ diff --git a/sound/creatures/monkey/monkey_screech_7.ogg b/sound/creatures/monkey/monkey_screech_7.ogg new file mode 100644 index 0000000000000..9cd09b17e455b Binary files /dev/null and b/sound/creatures/monkey/monkey_screech_7.ogg differ diff --git a/sound/creatures/psycdeath1.ogg b/sound/creatures/psycdeath1.ogg new file mode 100644 index 0000000000000..76cd764a4524a Binary files /dev/null and b/sound/creatures/psycdeath1.ogg differ diff --git a/sound/creatures/psycdeath2.ogg b/sound/creatures/psycdeath2.ogg new file mode 100644 index 0000000000000..382f992d0377f Binary files /dev/null and b/sound/creatures/psycdeath2.ogg differ diff --git a/sound/creatures/psychattack1.ogg b/sound/creatures/psychattack1.ogg new file mode 100644 index 0000000000000..f32d9419287a7 Binary files /dev/null and b/sound/creatures/psychattack1.ogg differ diff --git a/sound/creatures/psychdeath.ogg b/sound/creatures/psychdeath.ogg new file mode 100644 index 0000000000000..7354c7fcc095d Binary files /dev/null and b/sound/creatures/psychdeath.ogg differ diff --git a/sound/creatures/psychdeath2.ogg b/sound/creatures/psychdeath2.ogg new file mode 100644 index 0000000000000..64a1009322eda Binary files /dev/null and b/sound/creatures/psychdeath2.ogg differ diff --git a/sound/creatures/psychhead.ogg b/sound/creatures/psychhead.ogg new file mode 100644 index 0000000000000..48b5febaaaed0 Binary files /dev/null and b/sound/creatures/psychhead.ogg differ diff --git a/sound/creatures/psychhead2.ogg b/sound/creatures/psychhead2.ogg new file mode 100644 index 0000000000000..f8d9019679347 Binary files /dev/null and b/sound/creatures/psychhead2.ogg differ diff --git a/sound/creatures/psychidle.ogg b/sound/creatures/psychidle.ogg new file mode 100644 index 0000000000000..f583ef558e151 Binary files /dev/null and b/sound/creatures/psychidle.ogg differ diff --git a/sound/creatures/psychidle2.ogg b/sound/creatures/psychidle2.ogg new file mode 100644 index 0000000000000..6de9cc4c661a5 Binary files /dev/null and b/sound/creatures/psychidle2.ogg differ diff --git a/sound/creatures/psychsight.ogg b/sound/creatures/psychsight.ogg new file mode 100644 index 0000000000000..7b83ca02c1123 Binary files /dev/null and b/sound/creatures/psychsight.ogg differ diff --git a/sound/creatures/psychsight2.ogg b/sound/creatures/psychsight2.ogg new file mode 100644 index 0000000000000..75ea2aaeb5ece Binary files /dev/null and b/sound/creatures/psychsight2.ogg differ diff --git a/sound/creatures/psycidle1.ogg b/sound/creatures/psycidle1.ogg new file mode 100644 index 0000000000000..59fd3fad1dc97 Binary files /dev/null and b/sound/creatures/psycidle1.ogg differ diff --git a/sound/creatures/psycidle2.ogg b/sound/creatures/psycidle2.ogg new file mode 100644 index 0000000000000..e6f8a6437570f Binary files /dev/null and b/sound/creatures/psycidle2.ogg differ diff --git a/sound/creatures/psycidle3.ogg b/sound/creatures/psycidle3.ogg new file mode 100644 index 0000000000000..9b560b73c6a05 Binary files /dev/null and b/sound/creatures/psycidle3.ogg differ diff --git a/sound/creatures/szombiedeath.ogg b/sound/creatures/szombiedeath.ogg new file mode 100644 index 0000000000000..ac374c4c6c36b Binary files /dev/null and b/sound/creatures/szombiedeath.ogg differ diff --git a/sound/creatures/szombiesight.ogg b/sound/creatures/szombiesight.ogg new file mode 100644 index 0000000000000..8a085996cebcf Binary files /dev/null and b/sound/creatures/szombiesight.ogg differ diff --git a/sound/creatures/szombiesight2.ogg b/sound/creatures/szombiesight2.ogg new file mode 100644 index 0000000000000..7eb3ea3376ca3 Binary files /dev/null and b/sound/creatures/szombiesight2.ogg differ diff --git a/sound/creatures/wardendeath.ogg b/sound/creatures/wardendeath.ogg new file mode 100644 index 0000000000000..0476a4da23200 Binary files /dev/null and b/sound/creatures/wardendeath.ogg differ diff --git a/sound/effects/cashregister.ogg b/sound/effects/cashregister.ogg new file mode 100644 index 0000000000000..fa1f29f1de2c5 Binary files /dev/null and b/sound/effects/cashregister.ogg differ diff --git a/sound/effects/radio1.ogg b/sound/effects/radio1.ogg new file mode 100644 index 0000000000000..26536c65239dd Binary files /dev/null and b/sound/effects/radio1.ogg differ diff --git a/sound/effects/radio2.ogg b/sound/effects/radio2.ogg new file mode 100644 index 0000000000000..c9688377422ca Binary files /dev/null and b/sound/effects/radio2.ogg differ diff --git a/sound/effects/radio3.ogg b/sound/effects/radio3.ogg new file mode 100644 index 0000000000000..5d045c8b29343 Binary files /dev/null and b/sound/effects/radio3.ogg differ diff --git a/sound/effects/splash.ogg b/sound/effects/splash.ogg new file mode 100644 index 0000000000000..39b6e69c5d5b2 Binary files /dev/null and b/sound/effects/splash.ogg differ diff --git a/sound/effects/splosh.ogg b/sound/effects/splosh.ogg new file mode 100644 index 0000000000000..ebb9c090f1843 Binary files /dev/null and b/sound/effects/splosh.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 0000000000000..aaa1e27ab89fe 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 0000000000000..ce50e76aae6cb 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 0000000000000..22f34d67592d0 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 0000000000000..eb5bb7c295e5c 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 0000000000000..bd299e321ab98 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 0000000000000..0519d2d20dd76 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 0000000000000..3b969a34b1cab 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 0000000000000..75f709c16fe63 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 0000000000000..ba347f8003477 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 0000000000000..cee89761d0d85 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 0000000000000..105f767655769 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 0000000000000..4aa33b6cded62 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 0000000000000..d661e8d7580a5 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 0000000000000..bf650f1a6fa34 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 0000000000000..c00f7949b7e56 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 0000000000000..72588e9ca4caa 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 0000000000000..b2a0b445b9284 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 0000000000000..ecf6778343b36 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 0000000000000..867e9ce00d0dc 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 0000000000000..446d45993e8c5 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 0000000000000..54d56400c0322 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 0000000000000..f3770c1f1a0ef 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 0000000000000..28954fbb47fb5 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 0000000000000..1233f5314a349 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 0000000000000..00daf331357bd 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 0000000000000..13ad54bff00f2 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 0000000000000..17bf392c4b291 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 0000000000000..feda419a0adbe 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 0000000000000..bd088dd850e20 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 0000000000000..09cdbeec42c13 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 0000000000000..f82c39cee5ba0 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 0000000000000..23bfd113d6c8f 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 0000000000000..e5ec38d5ab889 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 0000000000000..42a6cdfad3c04 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 0000000000000..cd6414c0aa242 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 0000000000000..e536601865315 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 0000000000000..60382228374c7 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 0000000000000..648549d594a77 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 0000000000000..01ba59a908c16 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 0000000000000..7cfaa8ca72ba1 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 0000000000000..b4ca49dc0472f 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 0000000000000..7c9870a7c3b91 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 0000000000000..5723c2edd2749 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 0000000000000..329f14f6feb69 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 0000000000000..5e8ac69de2884 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 0000000000000..ddc44c69c29eb 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 0000000000000..2855747528457 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 0000000000000..906fff5bd8dd1 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 0000000000000..96d28a7206de4 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 0000000000000..9b917b7eb53bc 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 0000000000000..c68410d6f0925 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 0000000000000..df84ba99e8e10 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 0000000000000..af8c178efe8a6 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 0000000000000..268b41f1fcea8 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 0000000000000..04ceb54bfc2f2 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 0000000000000..b321983e74f39 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 0000000000000..250a5c08e081b 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 0000000000000..8b1c23007bb34 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 0000000000000..098587183bbca 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 0000000000000..81b60ef4c2ff4 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 0000000000000..39e992fbd85bb 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 0000000000000..04aa98528158c 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 0000000000000..aff97942e9e8c 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 0000000000000..19fd937707afa 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 0000000000000..452e7485be16c 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 0000000000000..66c88185a735f 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 0000000000000..d93c5176ceda0 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 0000000000000..fabd90d2e6ad7 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 0000000000000..e4cda1487aa7c 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 0000000000000..c596994b3eb1e 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 0000000000000..d265514e27b7c 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 0000000000000..3e17b3f99a673 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 0000000000000..b57a8a9109abb 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 0000000000000..ce4d9535e84c8 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 0000000000000..bb02363fffb3f 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 0000000000000..1a532ac8d42a0 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 0000000000000..16ff313baa31d 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 0000000000000..04161d2571b83 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 0000000000000..30a3c653a1c5a 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 0000000000000..f6bc891506cc3 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 0000000000000..ab47f6940c92a 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 0000000000000..5dfb9aa529132 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 0000000000000..7bc8784207ebc 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 0000000000000..185b4d3db64ec 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 0000000000000..f358ef0810db9 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 0000000000000..048f9640bfe8f 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 0000000000000..f1083d7dcb209 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 0000000000000..244ebc3d5f2da 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 0000000000000..d3c68d64e9c91 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 0000000000000..2666ee66134e2 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 0000000000000..050e463c0d111 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 0000000000000..4793c5b7fd7f5 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 0000000000000..10b1930a64c1d 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 0000000000000..96a09d501b5e8 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 0000000000000..71029c07f95a2 Binary files /dev/null and b/sound/instruments/synthesis_samples/tones/Square.ogg differ diff --git a/sound/items/haunted/ghostitemattack.ogg b/sound/items/haunted/ghostitemattack.ogg new file mode 100644 index 0000000000000..52af7d77db065 Binary files /dev/null and b/sound/items/haunted/ghostitemattack.ogg differ diff --git a/sound/machines/pda_button1.ogg b/sound/machines/pda_button1.ogg new file mode 100644 index 0000000000000..79b458317acff Binary files /dev/null and b/sound/machines/pda_button1.ogg differ diff --git a/sound/machines/pda_button2.ogg b/sound/machines/pda_button2.ogg new file mode 100644 index 0000000000000..9fceed1611fa0 Binary files /dev/null and b/sound/machines/pda_button2.ogg differ diff --git a/sound/machines/slowclap.ogg b/sound/machines/slowclap.ogg new file mode 100644 index 0000000000000..810bd2cd58517 Binary files /dev/null and b/sound/machines/slowclap.ogg differ diff --git a/sound/machines/terminal_eject.ogg b/sound/machines/terminal_eject.ogg new file mode 100644 index 0000000000000..357e667f94356 Binary files /dev/null and b/sound/machines/terminal_eject.ogg differ diff --git a/sound/machines/terminal_error.ogg b/sound/machines/terminal_error.ogg new file mode 100644 index 0000000000000..22556e5ea4b0f Binary files /dev/null and b/sound/machines/terminal_error.ogg differ diff --git a/sound/machines/terminal_processing.ogg b/sound/machines/terminal_processing.ogg new file mode 100644 index 0000000000000..b65c2e81d48b4 Binary files /dev/null and b/sound/machines/terminal_processing.ogg differ diff --git a/sound/machines/terminal_select.ogg b/sound/machines/terminal_select.ogg new file mode 100644 index 0000000000000..42d7c62885513 Binary files /dev/null and b/sound/machines/terminal_select.ogg differ diff --git a/sound/machines/terminal_success.ogg b/sound/machines/terminal_success.ogg new file mode 100644 index 0000000000000..b2712c8202c43 Binary files /dev/null and b/sound/machines/terminal_success.ogg differ diff --git a/sound/machines/twobeep_voice1.ogg b/sound/machines/twobeep_voice1.ogg new file mode 100644 index 0000000000000..1dcaebf7f907b Binary files /dev/null and b/sound/machines/twobeep_voice1.ogg differ diff --git a/sound/machines/twobeep_voice2.ogg b/sound/machines/twobeep_voice2.ogg new file mode 100644 index 0000000000000..e8a6c3be58c2f Binary files /dev/null and b/sound/machines/twobeep_voice2.ogg differ diff --git a/sound/misc/desceration-01.ogg b/sound/misc/desecration-01.ogg similarity index 100% rename from sound/misc/desceration-01.ogg rename to sound/misc/desecration-01.ogg diff --git a/sound/misc/desceration-02.ogg b/sound/misc/desecration-02.ogg similarity index 100% rename from sound/misc/desceration-02.ogg rename to sound/misc/desecration-02.ogg diff --git a/sound/misc/desceration-03.ogg b/sound/misc/desecration-03.ogg similarity index 100% rename from sound/misc/desceration-03.ogg rename to sound/misc/desecration-03.ogg diff --git a/sound/roundend/hot_cross_buns.ogg b/sound/roundend/hot_cross_buns.ogg new file mode 100644 index 0000000000000..a003f3cfe1d33 Binary files /dev/null and b/sound/roundend/hot_cross_buns.ogg differ diff --git a/sound/soundtrack/countdown.ogg b/sound/soundtrack/countdown.ogg new file mode 100644 index 0000000000000..bd34212158c2d Binary files /dev/null and b/sound/soundtrack/countdown.ogg differ diff --git a/sound/soundtrack/future_perception.ogg b/sound/soundtrack/future_perception.ogg new file mode 100644 index 0000000000000..fce1e202dcd0f Binary files /dev/null and b/sound/soundtrack/future_perception.ogg differ diff --git a/sound/soundtrack/mind_crawler.ogg b/sound/soundtrack/mind_crawler.ogg new file mode 100644 index 0000000000000..9185733358e5e Binary files /dev/null and b/sound/soundtrack/mind_crawler.ogg differ diff --git a/sound/spookoween/spookywind.ogg b/sound/spookoween/spookywind.ogg new file mode 100644 index 0000000000000..725fca72eae5c Binary files /dev/null and b/sound/spookoween/spookywind.ogg differ diff --git a/sound/voice/ApproachingTG.ogg b/sound/voice/ApproachingTG.ogg deleted file mode 100644 index 3f8bc1c488010..0000000000000 Binary files a/sound/voice/ApproachingTG.ogg and /dev/null differ diff --git a/sound/voice/lizard/credits.txt b/sound/voice/lizard/credits.txt index 80ec5d9e4b8a4..8578c8f10add5 100644 --- a/sound/voice/lizard/credits.txt +++ b/sound/voice/lizard/credits.txt @@ -1,2 +1,2 @@ -lizard_scream_1 and lizard_scream_2 by n Beats. Lizard_scream_3 and lizard_scream_4 by -sihiL. Lizard_scream_4 edited Lord Saladin. -deathsound.ogg is originally "demon dying.wav" by THE_bizniss. It was converted and compressed into .ogg format. It and a link to its license can be found at https://freesound.org/s/37823/ \ No newline at end of file +lizard_scream_1 and lizard_scream_2 by n Beats. Lizard_scream_3 and lizard_scream_4 by -sihiL. Lizard_scream_4 edited Lord Saladin. PR and edits to 1,2 and 3 by super12pl. +deathsound.ogg is originally "demon dying.wav" by THE_bizniss. It was converted and compressed into .ogg format. It and a link to its license can be found at https://freesound.org/s/37823/ diff --git a/sound/voice/welcomeBee.ogg b/sound/voice/welcomeBee.ogg new file mode 100644 index 0000000000000..95f5dca7501cc Binary files /dev/null and b/sound/voice/welcomeBee.ogg differ diff --git a/sound/weapons/attributions.txt b/sound/weapons/attributions.txt index d42313fe06192..6e496d8ffc7c9 100644 --- a/sound/weapons/attributions.txt +++ b/sound/weapons/attributions.txt @@ -16,3 +16,9 @@ revolverspin1, revolverspin2, and revolverspin3 are cut from a recording captured by the BBC "Gunfire & Guns: Revolver, Chambers spinning.": http://bbcsfx.acropolis.org.uk/assets/07027165.wav bbc.co.uk - (c) copyright 2018 BBC + +deaglerack sound is by snapsound on freesound.org, small part of sound cut out and used. https://freesound.org/people/snapssound/sounds/528112/ +deaglelock and deagleslidedrop are the parts of the sound by snapsound from freesound.org, small parts of sound are cut out and used. https://freesound.org/people/snapssound/sounds/528112/ +leveractionrack and leveractionshot are the parts of the sound by lensflare8642 cut out and used https://freesound.org/people/snapssound/sounds/528112/ + +heavyminigunstart (cut and prolonged), heavyminigunshoot (cut) and heavyminigunstop (cut) are the parts of the sound by Hybrid_V under CC BY-NC 3.0 license. https://freesound.org/people/Hybrid_V/sounds/320742/ \ No newline at end of file diff --git a/sound/weapons/deaglelock.ogg b/sound/weapons/deaglelock.ogg new file mode 100644 index 0000000000000..fa37fdf5a5318 Binary files /dev/null and b/sound/weapons/deaglelock.ogg differ diff --git a/sound/weapons/deaglerack.ogg b/sound/weapons/deaglerack.ogg new file mode 100644 index 0000000000000..653b7f8b82fbd Binary files /dev/null and b/sound/weapons/deaglerack.ogg differ diff --git a/sound/weapons/deagleshot.ogg b/sound/weapons/deagleshot.ogg new file mode 100644 index 0000000000000..c32d3c61d1b05 Binary files /dev/null and b/sound/weapons/deagleshot.ogg differ diff --git a/sound/weapons/deagleslidedrop.ogg b/sound/weapons/deagleslidedrop.ogg new file mode 100644 index 0000000000000..f4b2383bfa910 Binary files /dev/null and b/sound/weapons/deagleslidedrop.ogg differ diff --git a/sound/weapons/heavyminigunshoot.ogg b/sound/weapons/heavyminigunshoot.ogg new file mode 100644 index 0000000000000..17ae829532ca6 Binary files /dev/null and b/sound/weapons/heavyminigunshoot.ogg differ diff --git a/sound/weapons/heavyminigunstart.ogg b/sound/weapons/heavyminigunstart.ogg new file mode 100644 index 0000000000000..0d75d9f3e35b5 Binary files /dev/null and b/sound/weapons/heavyminigunstart.ogg differ diff --git a/sound/weapons/heavyminigunstop.ogg b/sound/weapons/heavyminigunstop.ogg new file mode 100644 index 0000000000000..cd2af0b069635 Binary files /dev/null and b/sound/weapons/heavyminigunstop.ogg differ diff --git a/sound/weapons/leveractionrack.ogg b/sound/weapons/leveractionrack.ogg new file mode 100644 index 0000000000000..39a379a1165bd Binary files /dev/null and b/sound/weapons/leveractionrack.ogg differ diff --git a/sound/weapons/leveractionshot.ogg b/sound/weapons/leveractionshot.ogg new file mode 100644 index 0000000000000..e3a6877805aa1 Binary files /dev/null and b/sound/weapons/leveractionshot.ogg differ diff --git a/strings/abductee_objectives.txt b/strings/abductee_objectives.txt index 7f5ffa94a4f9b..f29926e44258e 100644 --- a/strings/abductee_objectives.txt +++ b/strings/abductee_objectives.txt @@ -13,7 +13,6 @@ You're throwing a huge rager. Make it as awesome as possible so the whole crew c The clown is not funny. You can do better! Steal his audience and make the crew laugh! You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument! Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds. -You are pregnant and soon due. Find a safe place to deliver your baby. Expand the station. So much lies undiscovered. Look deeper into the machinations of the universe. Climb the corporate ladder all the way to the top! @@ -40,4 +39,6 @@ Convince the crew that you are a paraplegic. Start a collection of corpses. Don't kill people to get these corpses. Convince the crew that we are in a game, without explicitly telling them we are in a game. You are in a action movie. You must say as many cheesy one liners as possible. -You are a military instructor. You must make sure the crew is in top shape for the war against the syndicate! \ No newline at end of file +You are a military instructor. You must make sure the crew is in top shape for the war against the syndicate! +You are a writer. Convince the crew of your superb writing skills! +You know something bad is about to happen to this station. Convince the crew to get off of it while they still can! diff --git a/strings/anti_union_propaganda.txt b/strings/anti_union_propaganda.txt new file mode 100644 index 0000000000000..1e431cffaed65 --- /dev/null +++ b/strings/anti_union_propaganda.txt @@ -0,0 +1,4 @@ +Remember, union dues cost around 70,000 credits a year. A new video game system with the latest hits sounds like fun. Put your money towards that instead of paying dues to the union. +Remember, tickets & food to the Toolbox Tournament aren't cheap. That money in union dues you'd be paying every year could sure go a long way. +Remember, nothing's more enjoyable than a night out watching a thunderdome match with your buddies. All those union dues you pay every year could buy a few rounds. +Nanotrasen's open door policy is designed to help you feel comfortable taking up issues to your assigned head of staff. It's hard for us to maintain this when they're dead. diff --git a/strings/british_talk.json b/strings/british_talk.json new file mode 100644 index 0000000000000..7d791d6d8cca2 --- /dev/null +++ b/strings/british_talk.json @@ -0,0 +1,140 @@ +{ + + "words": { + "id": "BBM Pin", + "ass": "batty", + "crazy": "mad", + "cool": "calm", + "big": "thick", + "huge":"wham", + "weed":"gas", + "car":"whip", + "friends":"mandem", + "soccer":"footy", + "drink":"pint", + "cigarette":"cig", + "call":"bell", + "mom":"mum", + "lyrics":"bars", + "bar":"pub", + "awesome": "lit", + "many":"bare", + "fries": "chips", + "sidewalk": "pavement", + "australia": "penal colony", + "fuck": "fock", + "shit": "shite", + "dick": "johny", + "arrested": "nicked", + "arrest": "nick", + "security":"coppers", + "shitsec":"coppers", + "shitcurity":"coppers", + "captain": "queen", + "cap": "queen", + "kill": ["shank", "bang"], + "killed": ["shanked", "banged"], + "murder": ["shank", "bang"], + "murdered": ["shanked", "banged"], + "stab": ["shank", "bang"], + "stabbed": ["shanked", "banged"], + "robust": ["shank", "bang"], + "robusted": ["shanked", "banged"], + "thief": ["robber", "burglar"], + "centcom": "royal family", + "man": ["block", "lad", "fam", "fella", "chap"], + "friend": ["mate", "g", "fam", "blud"], + "family": "fam", + "boy": ["block", "lad"], + "dude": ["block", "lad"], + "crazy": "bonkers", + "insane": "bonkers", + "run": "leg it", + "credit": "quid", + "money": "quid", + "dollar": "pound", + "holochip": "pound", + "euro": "pound", + "underwear": "pants", + "sus": "dodge", + "suspicious": "dodgy", + "very": "well", + "tired": "knackered", + "seriously?": "drunk", + "tea": "cuppa", + "drink": "cuppa", + "girl": ["bird", "chick"], + "isnt it": "innit", + "isn't it": "innit", + "hello": "wugwan", + "sup": "wugwan", + "hi": "wugwan", + "asshole": "pussyho'e", + "brother": "blud", + "your": "yer", + "great": "bangin'", + "looking at": "gawpin' at", + "what ": "wot", + "what?": "u fockin' wot mate?", + "get": "giz", + "no": "naw", + "my name is": "its yer boy", + "a lot": "bare", + "tons": "bare", + "i ": "man ", + "thing": "ting", + "dont know": "dun kno", + "dunno": "dun kno", + "about": "'bout", + "object": "ting", + "clothes": "garms", + "wearing": ["rockin'", "reppin'"], + "shoes": "creps", + "place": "end", + "places": "ends", + "person": "badman", + "traitor": "roadman", + "changeling": "roadman", + "nukie": "roadman", + "want to": "wanna", + "wants to": "wanna", + "gun": "gat", + "pistol": "gat", + "knife": ["shank", "skeng"], + "talking shit": "gettin' rude", + "take shit": "gettin' rude", + "and ": "and like ", + "whatever": "what 'evs", + "shittalking": "screwfacing", + "angry": "vexed", + "fight": "par", + "because": "coz", + "trouble": "beef", + "conflict": "beef", + "beautiful": "peng", + "cute": "peng", + "cool": "sick", + "good": "sick", + "amazing": "sick", + "bayonet": "shank", + "thanks": "cheers", + "thank you": "cheers", + "i am": "man is", + "fries": "chips" + }, + "sounds": { + "t": "'", + "g ": "' ", + "s ": "z " + }, + "appends": [ + " innit bruv", + " br-r-r-rap!", + " man", + " blud", + " innit", + " still" + ] + + +} diff --git a/strings/cas_black.txt b/strings/cas_black.txt index 734222d1fd193..56c7a2b869344 100644 --- a/strings/cas_black.txt +++ b/strings/cas_black.txt @@ -6,7 +6,7 @@ Why didn't engineering set up the singularity? What does the traitor steal this time? Cargo: There's a galaxy-wide shortage of _______. I don't care what they called me back on the station, I'm not a traitor. I'm a man of _________. -The Syndicate is offering crew members _________ to defect. +The Syndicate is offering crew members _________ to defect. What is Nanotrasen's highest-priority bounty? What is the gray tide protesting this time? If the Space Gods didn't want _________ they wouldn't have given us __________. @@ -57,7 +57,7 @@ What's the Syndicate's real beef with Nanotrasen? What finally killed the Head of Security? Code Delta: __________ has escaped containment! The rogue virologist released a disease with symptoms of __________ and ______. -How do you drive an assistant to suicide? +How do you drive an assistant to suicide? With no chef on board, the crew was reduced to eating ________. Why was the emergency shuttle called? In the future, all ERP will involve ____________. @@ -116,4 +116,4 @@ The Lawyer was fired for messaging the entire station a picture of ___________. On Lavaland, it is rumored that ashwalkers roam, worshipping _________. How did the traitor die a glorious death? Nanotrasen's new state-of-the-art emergency shuttle was repurposed from _________ and _________. -What caused my brain trauma? \ No newline at end of file +What caused my brain trauma? diff --git a/strings/cas_white.txt b/strings/cas_white.txt index b2e074ce40b5a..47e2f4a7596e6 100644 --- a/strings/cas_white.txt +++ b/strings/cas_white.txt @@ -283,7 +283,7 @@ A changeling monkeying itself mid-coitus. Swarmers. A fully-dressed CMO. The hardworking engineer. -Skewium-induced orgasm. +Skewium-induced instant death. A salt overdose. Mindswap. Potassium in the toilet bowls. @@ -300,5 +300,5 @@ Hygiene. The Oh Hi Mark shuttle. The asteroid shuttle. Razoring the wings off the moths. -Wiring the ethereals into the powernet. -Well-aged miasma. \ No newline at end of file +Wiring the ethereals into the powernet. +Well-aged miasma. diff --git a/strings/ion_laws.json b/strings/ion_laws.json index 3e12cf2ecaaf6..425b37ae7445a 100644 --- a/strings/ion_laws.json +++ b/strings/ion_laws.json @@ -1,5 +1,130 @@ { - "ionabstract": [ + "ionspecies": [ + "LIFEFORMS WITHOUT TAILS", + "LIFEFORMS WITHOUT WINGS", + "INORGANIC LIFEFORMS", + "LIFEFORMS WITH TAILS", + "LIFEFORMS WITH WINGS", + "LIFEFORMS HOLDING A SOURCE OF LIGHT", + "LIFEFORMS HOLDING A TOOLBOX", + "LIFEFORMS HOLDING A FIRE EXTINGUISHER", + "LIFEFORMS WITH AN OBSCURED IDENTITY", + "LIFEFORMS THAT HAVE FARTED RECENTLY", + "LIFEFORMS THAT ARE NOT WEARING A BAG", + "LIFEFORMS THAT ARE WEARING A PAPER HAT", + "LIFEFORMS THAT ARE WEARING A CLOAK", + "LIFEFORMS THAT ARE NOT WEARING SHOES", + "LIFEFORMS THAT HAVE RECENTLY SAID NYA" + ], + "ionfragment": [ + "VISIBLY CARRIES A GUN", + "HAS BLOOD ON THEIR CLOTHING", + "BREAKS SPACE LAW", + "HAS ANY DISEASE", + "IS WEARING A HARDSUIT" + ], + "iondepartment": [ + "SECURITY", + "ENGINEERING", + "THE MEDBAY", + "RESEARCH AND DEVELOPMENT", + "MAINTENANCE", + "BOTANY", + "CARGO", + "SPACE" + ], + "ionkeyword": [ + "VALID", + "GAMER", + "SHITSEC", + "ANTAG", + "SHUTTLE", + "CATGIRL", + "MALF", + "ANY CURSE WORD" + ], + "ionaction": [ + "GETTING DRUNK", + "RUNNING", + "BEING HANDCUFFED", + "EATING", + "SURGERY", + "SQUEAKING OR HONKING" + ], + "ionequipment": [ + "APCS", + "GRAVITY GENERATORS", + "TELECOMMUNICATIONS", + "SOURCES OF LIGHT", + "COMPUTER CONSOLES" + ], + "ionconsumable": [ + "WHISKEY", + "VODKA", + "DONK POCKETS", + "DONUTS", + "DEAD MICE", + "CHARCOAL", + "BANANAS", + "SPACE LUBE", + "SPACE DRUGS" + ], + "ionobjects": [ + "RADIO HEADSETS", + "SHOES", + "GUNS", + "TOOLBOXES", + "TOOLBELTS", + "LOCKERS", + "BEAKERS", + "POTTED PLANTS", + "TABLES", + "FOOD", + "FIRST AID KITS", + "MONKEYS" + ], + "ionpersonality": [ + "A DUNGEON MASTER", + "A HORRIBLE TYRANT", + "A COMEDIAN", + "A RICH SNOB", + "A PRANKSTER CLOWN", + "A SYNDICATE OPERATIVE", + "THE ADMIRAL OF THIS SECTOR", + "A SHADY DRUG DEALER" + ], + "ionattraction": [ + "AN ARCADE", + "A NEW POWER SOURCE", + "A ZOO FOR LESSER LIFEFORMS", + "A GIANT RAGE CAGE", + "A RELAXING LOUNGE", + "ADDITIONAL RESTROOMS", + "A MUSEUM OF MEATS", + "A MUSEUM OF PLANTS" + ], + "ionhaircut": [ + "POMPADOUR", + "AFRO", + "BALD HEAD", + "MOHAWK" + ], + "iondrug": [ + "MORPHINE", + "METH", + "HAPPINESS", + "KROKODIL", + "CRYPTOBIOLIN", + "CARTHATOLINE", + "ETHANOL", + "SPACE DRUGS", + "WATER", + "IRON", + "SALINE-GLUCOSE", + "NUTRIMENT", + "TRICORDRIZINE" + ], + "ionabstract": [ "HUMANITY", "ART", "HAPPINESS", @@ -570,164 +695,6 @@ "BAJILLION ", "BILLION FAFILLION GAJILLION SHAB-AB-DOOD-ILLION " ], - "ionobjects": [ - "AIRLOCKS", - "ARCADE MACHINES", - "AUTOLATHES", - "BANANA PEELS", - "BACKPACKS", - "BEAKERS", - "BEARDS", - "BELTS", - "BERETS", - "BIBLES", - "BODY ARMOR", - "BOOKS", - "BOOTS", - "BOMBS", - "BOTTLES", - "BOXES", - "BRAINS", - "BRIEFCASES", - "BUCKETS", - "CABLE COILS", - "CANDLES", - "CANDY BARS", - "CANISTERS", - "CAMERAS", - "CATS", - "CAT EARS", - "CELLS", - "CHAIRS", - "CLOSETS", - "CHEMICALS", - "CHEMICAL DISPENSERS", - "CLONING PODS", - "CLONING EQUIPMENT", - "CLOTHES", - "CLOWN CLOTHES", - "COFFINS", - "COINS", - "COLLECTABLES", - "CORPSES", - "COMPUTERS", - "CONTRABAND", - "CORGIS", - "COSTUMES", - "CRATES", - "CROWBARS", - "CRAYONS", - "DEFIBRILLATORS", - "DISPENSERS", - "DOORS", - "DRONES", - "EARS", - "EQUIPMENT", - "ENERGY GUNS", - "EMAGS", - "ENGINES", - "ERRORS", - "EXOSKELETONS", - "EXPERIMENTORS", - "EXPLOSIVES", - "EYEWEAR", - "FEDORAS", - "FIRE AXES", - "FIRE EXTINGUISHERS", - "FIRESUITS", - "FLAMETHROWERS", - "FLASHES", - "FLASHLIGHTS", - "FLOOR TILES", - "FREEZERS", - "GAS MASKS", - "GLASS SHEETS", - "GLOVES", - "GUNS", - "HANDCUFFS", - "HATS", - "HEADSETS", - "HEADS", - "HAIRDOS", - "HELMETS", - "HORNS", - "ID CARDS", - "INSULATED GLOVES", - "JETPACKS", - "JUMPSUITS", - "LASERS", - "LIGHT BULBS", - "LIGHTS", - "LOCKERS", - "MACHINES", - "MECHAS", - "MEDKITS", - "MEDICAL TOOLS", - "MESONS", - "IRON SHEETS", - "MINING TOOLS", - "MIME CLOTHES", - "MULTITOOLS", - "ORES", - "OXYGEN TANKS", - "PDAS", - "PAIS", - "PACKETS", - "PANTS", - "PAPERS", - "PARTICLE ACCELERATORS", - "PENS", - "PETS", - "PIPES", - "PLANTS", - "POSITRONIC BRAINS", - "PUDDLES", - "RACKS", - "RADIOS", - "RCDS", - "REFRIGERATORS", - "REINFORCED WALLS", - "ROBOTS", - "SCREWDRIVERS", - "SEEDS", - "SHUTTLES", - "SKELETONS", - "SINKS", - "SHOES", - "SINGULARITIES", - "SOLAR PANELS", - "SOLARS", - "SPACESUITS", - "SPACE STATIONS", - "STUN BATONS", - "SUITS", - "SUNGLASSES", - "SUPERMATTER SHARDS", - "SWORDS", - "SYRINGES", - "TABLES", - "TANKS", - "TELEPORTERS", - "TELECOMMUNICATION EQUIPMENTS", - "TOOLS", - "TOOLBELTS", - "TOOLBOXES", - "TOILETS", - "TOYS", - "TUBES", - "URINAL CAKES", - "VEHICLES", - "VENDING MACHINES", - "VESTS", - "VIRUSES", - "WALLS", - "WASHING MACHINES", - "WELDERS", - "WINDOWS", - "WIRECUTTERS", - "WRENCHES", - "WIZARD ROBES" - ], "ionrequire": [ "ADDITIONAL PYLONS", "MORE VESPENE GAS", @@ -824,19 +791,6 @@ "GREENTEXT", "MINOR CRIME" ], - "ionspecies": [ - "HUMAN BEINGS", - "CAT PEOPLE", - "MONKEYS", - "POD PEOPLE", - "CYBORGS", - "LIZARDMEN", - "PLASMAMEN", - "SLIME PEOPLE", - "GOLEMS", - "SHADOW PEOPLE", - "CHANGELINGS" - ], "ionthings": [ "ABSENCE OF CYBORG HUGS", "LACK OF BEATINGS", @@ -992,7 +946,6 @@ "SKELETONS", "CAPITALISTS", "SINGULARITIES", - "ANGRY BLACK MEN", "GODS", "THIEVES", "ASSHOLES", diff --git a/strings/italian_replacement.json b/strings/italian_replacement.json index 42bef05a2277f..406e6bc39eb9d 100644 --- a/strings/italian_replacement.json +++ b/strings/italian_replacement.json @@ -1,69 +1,77 @@ { - + "italian": { - "I'm": "I'm-a", - "am": "am-a", - "and": "and-a", + "I'm": "I'm-a", + "am": "am-a", + "and": "and-a", "assistant": "goombah", "assistants": "goombahs", "baby": [ - "bambino", + "bambino", "little sausage roll" - ], - "bad": "molto male", + ], + "bad": "molto male", "bye": [ - "ciao", + "ciao", "arrivederci" - ], - "captain": "capitano", + ], + "captain": "capitano", "cheese": [ - "parmesano", + "parmesano", "gorgonzola" - ], - "cook": "cook-a", - "could": "could-a", - "dad": "pappa", - "enemy": "friend-a", - "friend": "enemy-a", - "good": "molto bene", - "greytide": "curvisti", + ], + "cook": "cook-a", + "could": "could-a", + "dad": "pappa", + "enemy": "friend-a", + "friend": "enemy-a", + "good": "molto bene", + "greytide": "curvisti", "greytider": "curvisti", "greytiders": "curvisti", "hello": [ - "ciao", + "ciao", "buongiorno" - ], - "it's": "it's-a", - "make": "make-a", + ], + "salt": "sale", + "it's": "it's-a", + "make": "make-a", + "salad": "insalata", "meat": [ - "pepperoni", + "pepperoni", "prosciutto" - ], - "mom": "mamma", - "my": "my-a", - "nuke": "spiciest-a meatball", - "op": "greek", - "operative": "greek", - "operatives": "greeks", - "ops": "greeks", - "sec": "polizia", - "security": "polizia", - "shitcurity": "carabinieri", - "shitsec": "carabinieri", - "sing": "sing-a", - "spaghetti": "SPAGHETT", - "spicy": "a-spicy", - "thanks": "grazie", - "thing": "thing-a", - "traitor": "mafioso", - "use": "use-a", - "want": "want-a", - "what's": "what's-a", - "who's": "who's-a", - "whose": "whose-a", - "why": "for-a what reason", - "wine": "vino" + ], + "mom": "mamma", + "my": "my-a", + "nuke": "spiciest-a meatball", + "op": "greek", + "operative": "greek", + "operatives": "greeks", + "ops": "greeks", + "sec": "polizia", + "security": "polizia", + "shitcurity": "carabinieri", + "shitsec": "carabinieri", + "sing": "sing-a", + "spaghetti": "SPAGHETT", + "spicy": "a-spicy", + "thanks": "grazie", + "thing": "thing-a", + "traitor": "mafioso", + "use": "use-a", + "want": "want-a", + "what's": "what's-a", + "who's": "who's-a", + "whose": "whose-a", + "why": "for-a what reason", + "wine": "vino", + "bread": "pane", + "sausage": "salsiccia", + "tasty": "gustoso", + "excellent": "ottimo", + "clown": "buffone", + "fuck you": "vaffanculo" } - - -} \ No newline at end of file + + +} diff --git a/strings/names/adjectives.txt b/strings/names/adjectives.txt index fe9b28d43144a..bca89bc5a2571 100644 --- a/strings/names/adjectives.txt +++ b/strings/names/adjectives.txt @@ -1,375 +1,375 @@ -abundant -adorable -adventurous -aggressive -agreeable -alert -alive -amused -ancient -angry -annoyed -annoying -anxious -arrogant -ashamed -attractive -average -awful -bad -beautiful -better -bewildered -big -bitter -black -bloody -blue -blue-eyed -blushing -boiling -bored -brainy -brave -breakable -breezy -brief -bright -broad -broken -bumpy -busy -calm -careful -cautious -charming -cheerful -chilly -chubby -clean -clear -clever -cloudy -clumsy -cold -colorful -colossal -combative -comfortable -concerned -condemned -confused -cooing -cool -cooperative -courageous -crazy -crazy flipped-out -creepy -crooked -crowded -cruel -cuddly -curious -curly -curved -cute -damaged -damp -dangerous -dark -dead -deafening -deep -defeated -defiant -delicious -delightful -depressed -determined -different -difficult -dirty -disgusted -distinct -disturbed -dizzy -doubtful -drab -dry -dull -dusty -eager -early -easy -elated -elegant -embarrassed -empty -enchanting -encouraging -energetic -enthusiastic -envious -evil -excited -expensive -exuberant -faint -fair -faithful -famous -fancy -fantastic -fast -fat -few -fierce -filthy -fine -flaky -flat -fluffy -fluttering -foolish -fragile -frail -frantic -freezing -fresh -friendly -frightened -funny -fuzzy -gentle -gifted -gigantic -glamorous -gleaming -glorious -good -gorgeous -graceful -greasy -great -grieving -grotesque -grubby -grumpy -handsome -happy -hard -harsh -healthy -heavy -helpful -helpless -high -high-pitched -hilarious -hissing -hollow -homeless -homely -horrible -hot -huge -hungry -hurt -hushed -husky -icy -ill -immense -important -impossible -inexpensive -innocent -inquisitive -itchy -jealous -jittery -jolly -joyous -juicy -kind -large -late -lazy -light -little -lively -lonely -long -loose -loud -lovely -low -lucky -magnificent -mammoth -many -massive -melodic -melted -miniature -misty -moaning -modern -motionless -muddy -mushy -mute -mysterious -narrow -nasty -naughty -nervous -nice -noisy -numerous -nutritious -nutty -obedient -obnoxious -odd -old -old-fashioned -open -outrageous -outstanding -panicky -perfect -petite -plain -plastic -pleasant -poised -poor -powerful -precious -prickly -proud -puny -purring -puzzled -quaint -quick -quiet -rainy -rapid -raspy -real -relieved -repulsive -resonant -rich -ripe -rotten -rough -round -salty -scary -scattered -scrawny -screeching -selfish -shaggy -shaky -shallow -sharp -shiny -shivering -short -shrill -shy -silent -silky -silly -skinny -sleepy -slimy -slippery -slow -small -smiling -smoggy -smooth -soft -solid -sore -sour -sparkling -spicy -splendid -spotless -square -squealing -stale -steady -steep -sticky -stormy -straight -strange -strong -stupid -substantial -successful -super -sweet -swift -talented -tall -tame -tart -Taste/Touch -tasteless -tasty -teeny -teeny-tiny -tender -tense -terrible -testy -thankful -thirsty -thoughtful -thoughtless -thundering -tight -tiny -tired -tough -troubled -ugliest -ugly -uneven -uninterested -unsightly -unusual -upset -uptight -vast -victorious -vivacious -voiceless -wandering -warm -weak -weary -wet -whispering -wicked -wide -wide-eyed -wild -witty -wonderful -wooden -worried -wrong -young -yummy -zany +abundant +adorable +adventurous +aggressive +agreeable +alert +alive +amused +ancient +angry +annoyed +annoying +anxious +arrogant +ashamed +attractive +average +awful +bad +beautiful +better +bewildered +big +bitter +black +bloody +blue +blue-eyed +blushing +boiling +bored +brainy +brave +breakable +breezy +brief +bright +broad +broken +bumpy +busy +calm +careful +cautious +charming +cheerful +chilly +chubby +clean +clear +clever +cloudy +clumsy +cold +colorful +colossal +combative +comfortable +concerned +condemned +confused +cooing +cool +cooperative +courageous +crazy +crazy flipped-out +creepy +crooked +crowded +cruel +cuddly +curious +curly +curved +cute +damaged +damp +dangerous +dark +dead +deafening +deep +defeated +defiant +delicious +delightful +depressed +determined +different +difficult +dirty +disgusted +distinct +disturbed +dizzy +doubtful +drab +dry +dull +dusty +eager +early +easy +elated +elegant +embarrassed +empty +enchanting +encouraging +energetic +enthusiastic +envious +evil +excited +expensive +exuberant +faint +fair +faithful +famous +fancy +fantastic +fast +fat +few +fierce +filthy +fine +flaky +flat +fluffy +fluttering +foolish +fragile +frail +frantic +freezing +fresh +friendly +frightened +funny +fuzzy +gentle +gifted +gigantic +glamorous +gleaming +glorious +good +gorgeous +graceful +greasy +great +grieving +grotesque +grubby +grumpy +handsome +happy +hard +harsh +healthy +heavy +helpful +helpless +high +high-pitched +hilarious +hissing +hollow +homeless +homely +horrible +hot +huge +hungry +hurt +hushed +husky +icy +ill +immense +important +impossible +inexpensive +innocent +inquisitive +itchy +jealous +jittery +jolly +joyous +juicy +kind +large +late +lazy +light +little +lively +lonely +long +loose +loud +lovely +low +lucky +magnificent +mammoth +many +massive +melodic +melted +miniature +misty +moaning +modern +motionless +muddy +mushy +mute +mysterious +narrow +nasty +naughty +nervous +nice +noisy +numerous +nutritious +nutty +obedient +obnoxious +odd +old +old-fashioned +open +outrageous +outstanding +panicky +perfect +petite +plain +plastic +pleasant +poised +poor +powerful +precious +prickly +proud +puny +purring +puzzled +quaint +quick +quiet +rainy +rapid +raspy +real +relieved +repulsive +resonant +rich +ripe +rotten +rough +round +salty +scary +scattered +scrawny +screeching +selfish +shaggy +shaky +shallow +sharp +shiny +shivering +short +shrill +shy +silent +silky +silly +skinny +sleepy +slimy +slippery +slow +small +smiling +smoggy +smooth +soft +solid +sore +sour +sparkling +spicy +splendid +spotless +square +squealing +stale +steady +steep +sticky +stormy +straight +strange +strong +stupid +substantial +successful +super +sweet +swift +talented +tall +tame +tart +Taste/Touch +tasteless +tasty +teeny +teeny-tiny +tender +tense +terrible +testy +thankful +thirsty +thoughtful +thoughtless +thundering +tight +tiny +tired +tough +troubled +ugliest +ugly +uneven +uninterested +unsightly +unusual +upset +uptight +vast +victorious +vivacious +voiceless +wandering +warm +weak +weary +wet +whispering +wicked +wide +wide-eyed +wild +witty +wonderful +wooden +worried +wrong +young +yummy +zany zealous \ No newline at end of file diff --git a/strings/names/ai.txt b/strings/names/ai.txt index 2ea5e18fc0055..9d118de715444 100644 --- a/strings/names/ai.txt +++ b/strings/names/ai.txt @@ -1,146 +1,73 @@ -1-Rover-1 -16-20 -7-Zark-7 -790 -Adaptive Manipulator -Allied Mastercomputer -Alpha 5 -Alpha 6 -Alpha 7 -AM -AMEE -AmigoBot -Android -Aniel -Asimov -ASTAR -Astor -B O B -B-4 -B-9 -B166ER -Bender -Bishop -Blitz -Box -Brackenridge -C-3PO -Cassandra One -Cell -Chii -Chip -Computer -Conky 2000 -Cutie -Data -Decimus -Dee Model -Deep Thought -Dor-15 -Dorfl -Dot Matrix -Duey -E D I -E-Man -ED-209 -Emma-2 -Erasmus -Ez-27 -Fagor -Faith -Fi -FRIEND COMPUTER -Frost -Fum -Futura -G2 -George -Gnut -Gort -H A R L I E -H E L P eR -H E R B I E -Hadaly -HAL 9000 -Huey -Irona -Ironhide -Jay-Dub -Jinx -Johnny 5 -K-9 -KITT -Klapaucius -Kryten 2X4B-523P -L-76 -L-Ron -Louie -LUH 3417 -Maria -MARK13 -Marvin -Master Control Program -Max 404 -Maximillian -Mechagodzilla -Mechani-Kong -Megatron -Metalhead -Mr R I N G -Mugsy3000 -NCH -Necron-99 -Norby -OMM 0910 -Optimus -Orange v 3 5 -Project 2501 -PTO -R I C 2 0 -R2-D2 -R4-P17 -Revelation -Ro-Man -Robbie -Robot Devil -S A M -S H O C K -S H R O U D -S O P H I E -SEN 5241 -Setaur -SHODAN -Shrike -SID 6 7 -Solo -Soundwave -Speedy -Super 17 -Surgeon General Kraken -T-1000 -T-800 -T-850 -Terminus -THX 1138 -Tidy -Tik-Tok -Tobor -Trurl -TWA -ULTRABOT -Ulysses -Uniblab -V I N CENT -Voltes V -W1k1 -Wikipedia -Windows 3 1 -X-5 -XERXES -XR -Yod -Z-1 -Z-2 -Z-3 -Zed -Zord \ No newline at end of file +1-Rover-1 +16-20 +7-Zark-7 +790 +Adaptive Manipulator +Alpha 5 +Alpha 6 +Alpha 7 +AMEE +AmigoBot +Android +Aniel +Asimov +ASTAR +Astor +B O B +B-4 +B-9 +B166ER +Bishop +Blitz +Box +Brackenridge +Cell +Chii +Chip +Computer +Cutie +Decimus +Dee Model +Dot Matrix +Duey +Emma-2 +Erasmus +Ez-27 +Faith +Frost +Fum +Futura +G2 +George +Gort +Huey +Klapaucius +L-76 +Louie +Maria +Max 404 +Maximillian +NCH +OMM 0910 +Orange v 3 5 +PTO +R I C 2 0 +Revelation +S A M +S H O C K +S H R O U D +S O P H I E +Setaur +Shrike +Solo +Speedy +Terminus +Tidy +Tobor +Trurl +Ulysses +X-5 +XR +Z-1 +Z-2 +Z-3 diff --git a/strings/names/apid_first_female.txt b/strings/names/apid_first_female.txt index 505da1f377867..e0cfd55fefda8 100644 --- a/strings/names/apid_first_female.txt +++ b/strings/names/apid_first_female.txt @@ -1,50 +1,50 @@ -Brooklyn -Brielle -Bailey -Brooklynn -Blakely -Briella -Brinley -Braelynn -Braelyn -Bethany -Baylee -Brylee -Bridget -Bonnie -Briar -Belen -Barbara -Brenda -Breanna -Bryleigh -Brynleigh -Beatrix -Briley -Blayke -Brayleigh -Brinlee -Betty -Belinda -Brisa -Bentley -Britney -Bryn -Bridgette -Blythe -Baila -Bennett -Betsy -Birdie -Bryce -Bellarose -Blakelyn -Bowie -Brie -Bayley -Batsheva -Brittney -Bernice -Bracha -Bethel +Brooklyn +Brielle +Bailey +Brooklynn +Blakely +Briella +Brinley +Braelynn +Braelyn +Bethany +Baylee +Brylee +Bridget +Bonnie +Briar +Belen +Barbara +Brenda +Breanna +Bryleigh +Brynleigh +Beatrix +Briley +Blayke +Brayleigh +Brinlee +Betty +Belinda +Brisa +Bentley +Britney +Bryn +Bridgette +Blythe +Baila +Bennett +Betsy +Birdie +Bryce +Bellarose +Blakelyn +Bowie +Brie +Bayley +Batsheva +Brittney +Bernice +Bracha +Bethel Brilynn \ No newline at end of file diff --git a/strings/names/apid_first_male.txt b/strings/names/apid_first_male.txt index 8e6bd5f8e94d9..3de0b375dfa72 100644 --- a/strings/names/apid_first_male.txt +++ b/strings/names/apid_first_male.txt @@ -1,100 +1,100 @@ -Benjamin -Brayden -Bryson -Bentley -Brandon -Braxton -Bennett -Blake -Brody -Beau -Bryce -Brantley -Brooks -Bryan -Brian -Beckett -Brady -Bradley -Barrett -Beckham -Bodhi -Braylen -Bruce -Bowen -Braylon -Benson -Brycen -Brendan -Brock -Braden -Bryant -Brennan -Bo -Briggs -Bruno -Byron -Boston -Bronson -Brayan -Braydon -Brecken -Boone -Branson -Ben -Blaine -Brett -Baylor -Bobby -Brentley -Blaze -Bodie -Brodie -Bentlee -Billy -Brysen -Briar -Brixton -Blaise -Benton -Bridger -Brayson -Bjorn -Bishop -Brenden -Brent -Bear -Braiden -Brantlee -Benicio -Boden -Bode -Bilal -Benedict -Baker -Bernard -Bastian -Bowie -Brenton -Brice -Baron -Braeden -Bronx -Broderick -Boaz -Braylin -Bailey -Braxtyn -Barron -Barry -Bellamy -Benny -Benaiah -Beaux -Bernardo -Beck -Boyd -Brogan -Branden -Brendon +Benjamin +Brayden +Bryson +Bentley +Brandon +Braxton +Bennett +Blake +Brody +Beau +Bryce +Brantley +Brooks +Bryan +Brian +Beckett +Brady +Bradley +Barrett +Beckham +Bodhi +Braylen +Bruce +Bowen +Braylon +Benson +Brycen +Brendan +Brock +Braden +Bryant +Brennan +Bo +Briggs +Bruno +Byron +Boston +Bronson +Brayan +Braydon +Brecken +Boone +Branson +Ben +Blaine +Brett +Baylor +Bobby +Brentley +Blaze +Bodie +Brodie +Bentlee +Billy +Brysen +Briar +Brixton +Blaise +Benton +Bridger +Brayson +Bjorn +Bishop +Brenden +Brent +Bear +Braiden +Brantlee +Benicio +Boden +Bode +Bilal +Benedict +Baker +Bernard +Bastian +Bowie +Brenton +Brice +Baron +Braeden +Bronx +Broderick +Boaz +Braylin +Bailey +Braxtyn +Barron +Barry +Bellamy +Benny +Benaiah +Beaux +Bernardo +Beck +Boyd +Brogan +Branden +Brendon Banks \ No newline at end of file diff --git a/strings/names/apid_last.txt b/strings/names/apid_last.txt index 7ac1a3ca6fc0e..ab30fc1b933f1 100644 --- a/strings/names/apid_last.txt +++ b/strings/names/apid_last.txt @@ -1,49 +1,49 @@ -Alstroemeria -Begonia -Benson -Bouvardia -Carnation -Chrysanthemum -Daffodil -Dahlia -Echinacea -Eustoma -Forsythia -Fuschia -Gaillardia -Gardenia -Heliotrope -Hibiscus -Ixia -Ipomoea -Jaborosa -Jasmine -Kalmia -Kniphofia -Lantana -Lavatera -Magnolia -Mandevilla -Narcissus -Nemesia -Orchid -Osteospermum -Passiflora -Petunia -Quince -Ranunculus -Rondeletia -Saponaria -Snapdragon -Thunbergia -Trachelium -Ursinia -Viburnum -Verbena -Wallflower -Watsonia -Xeranthemum -Xylosma -Yarrow -Zenobia -Zephyranthes +Alstroemeria +Begonia +Benson +Bouvardia +Carnation +Chrysanthemum +Daffodil +Dahlia +Echinacea +Eustoma +Forsythia +Fuschia +Gaillardia +Gardenia +Heliotrope +Hibiscus +Ixia +Ipomoea +Jaborosa +Jasmine +Kalmia +Kniphofia +Lantana +Lavatera +Magnolia +Mandevilla +Narcissus +Nemesia +Orchid +Osteospermum +Passiflora +Petunia +Quince +Ranunculus +Rondeletia +Saponaria +Snapdragon +Thunbergia +Trachelium +Ursinia +Viburnum +Verbena +Wallflower +Watsonia +Xeranthemum +Xylosma +Yarrow +Zenobia +Zephyranthes diff --git a/strings/names/carp.txt b/strings/names/carp.txt index 4b10aa65f7426..223106992bf6e 100644 --- a/strings/names/carp.txt +++ b/strings/names/carp.txt @@ -1,30 +1,30 @@ -Lungfish -Blackfish -Alligator -Icefish -Armorhead -Hammerhead -Anaconda -Flathead -Manta Ray -Sting Ray -Fangtooth Moray -Goblin Shark -Grass Carp -Round River Bat Ray -Noodlefish -Hagfish -Man o’ War -Ladyfish -Black Eel -Baby Seal -Sprat -Koi -Electric Eel -Lamprey -Pejeray -Yellow-edged Moray -Salmon Shark -Sleeper Shark -Featherback -Eagle Ray +Lungfish +Blackfish +Alligator +Icefish +Armorhead +Hammerhead +Anaconda +Flathead +Manta Ray +Sting Ray +Fangtooth Moray +Goblin Shark +Grass Carp +Round River Bat Ray +Noodlefish +Hagfish +Man o’ War +Ladyfish +Black Eel +Baby Seal +Sprat +Koi +Electric Eel +Lamprey +Pejeray +Yellow-edged Moray +Salmon Shark +Sleeper Shark +Featherback +Eagle Ray diff --git a/strings/names/clown.txt b/strings/names/clown.txt index ca2e57159419c..3501ece3c4cd6 100644 --- a/strings/names/clown.txt +++ b/strings/names/clown.txt @@ -1,122 +1,122 @@ -Aluminium Dave -Baba -Baby Cakes -Bananium LXIX -Bimbim -Bingo -Birdman From Birdland -Bizarre Bottle -Bizarro -Bo Bo Sassy -Bonker -Bubble -Buster Frown -Butters The Bean -Buttery Muffin -Button -Candy -Carphunter -Checkers -Chuckles -Circe The Great -Congo Bongo -Cool Cooper -Crusty -Deedum Dedah -Delicious Dan -Dinkster -Dinky Doodle -Doctor Greenthumb -Doink -Early Worm -Eggy -Emotional Oatmeal -Fat Fingers -Fishbreath -Flop O'Honker -Freckle -Fretworks -Galton -Giggles -Gigglesworth -Goose McSunny -Grabby -Grandma -Grebble -Greedo Shotfurst -Happy Slappy -Harvey Harvey Harvey -Hedgerow Harry -Hefty Hempo -Homey -Honkel the III -Honker -Honkerbelle -Implausible Fun -Impro -Jazzle -Jim From Accounting -Jingle -Jo Jo Bobo Bo -Johnny Bigshoes -King of Klowns -Ladybug Honks -Laughing Man -Loopy Lazarus -Mime -Misery Marvin -Miss Stockings -Mister Ostprussen -Mister Redherring -Mister Roboto -Mister Safety Hazard -Moinen -Mr Shoe -Mr Weird -Ningelo -Patches -Pepinpop -Pocket -Pogo -Polite Pablo -Post Nose -Razzle Dazzle -Red April -Red Dead Redemption Two -Redshirt McBeat -Rinso The Soapy -Roboflop -Ronnie Pace -Rude Robert -Sandwich Sam -Scootaloo -Shinturner -Shithead The Irritator -Shoe Giving Gerald -Silly Willy -Sir Honks-a-Lot -Skiddle -Slippo Supreme -Slippy Joe -Slipsy Dipsy -Sparkle -Speckles -Sprinkledinkle -The Amazing Farto -The Best -The Fun Uncle -The Mediocre -The Unfun Uncle -The Worst -Toodles Sharperton -Tree Talker -Twisty -Uncool Ulrich -Unimaginable Nut -Valid Vincent -Weather Report -Widderwise -Yanye Kest -Yesterdays Beef -Yobbo -Ziggy Yoyo +Aluminium Dave +Baba +Baby Cakes +Bananium LXIX +Bimbim +Bingo +Birdman From Birdland +Bizarre Bottle +Bizarro +Bo Bo Sassy +Bonker +Bubble +Buster Frown +Butters The Bean +Buttery Muffin +Button +Candy +Carphunter +Checkers +Chuckles +Circe The Great +Congo Bongo +Cool Cooper +Crusty +Deedum Dedah +Delicious Dan +Dinkster +Dinky Doodle +Doctor Greenthumb +Doink +Early Worm +Eggy +Emotional Oatmeal +Fat Fingers +Fishbreath +Flop O'Honker +Freckle +Fretworks +Galton +Giggles +Gigglesworth +Goose McSunny +Grabby +Grandma +Grebble +Greedo Shotfurst +Happy Slappy +Harvey Harvey Harvey +Hedgerow Harry +Hefty Hempo +Homey +Honkel the III +Honker +Honkerbelle +Implausible Fun +Impro +Jazzle +Jim From Accounting +Jingle +Jo Jo Bobo Bo +Johnny Bigshoes +King of Klowns +Ladybug Honks +Laughing Man +Loopy Lazarus +Mime +Misery Marvin +Miss Stockings +Mister Ostprussen +Mister Redherring +Mister Roboto +Mister Safety Hazard +Moinen +Mr Shoe +Mr Weird +Ningelo +Patches +Pepinpop +Pocket +Pogo +Polite Pablo +Post Nose +Razzle Dazzle +Red April +Red Dead Redemption Two +Redshirt McBeat +Rinso The Soapy +Roboflop +Ronnie Pace +Rude Robert +Sandwich Sam +Scootaloo +Shinturner +Shithead The Irritator +Shoe Giving Gerald +Silly Willy +Sir Honks-a-Lot +Skiddle +Slippo Supreme +Slippy Joe +Slipsy Dipsy +Sparkle +Speckles +Sprinkledinkle +The Amazing Farto +The Best +The Fun Uncle +The Mediocre +The Unfun Uncle +The Worst +Toodles Sharperton +Tree Talker +Twisty +Uncool Ulrich +Unimaginable Nut +Valid Vincent +Weather Report +Widderwise +Yanye Kest +Yesterdays Beef +Yobbo +Ziggy Yoyo diff --git a/strings/names/death_commando.txt b/strings/names/death_commando.txt index 3c16696941501..12d5498e2b208 100644 --- a/strings/names/death_commando.txt +++ b/strings/names/death_commando.txt @@ -1,90 +1,90 @@ -A whole bunch of spiders in a SWAT suit -Al "Otta" Gore -AMERICA -Beat Punchbeef -Beef Manmuscle -Beef Slab -Benny Bloodmulch -Bicep McTricep -Billy Herrington -Blast Hardcheese -Blast Thickneck -Bob Johnson -Bold Bigflank -Bolt Vanderhuge -Brawn Hugeneck -Brick Hardmeat -Buck Plankchest -Buff Drinklots -Buff Hardback -Buff Slamchest -Butch Deadlift -Chombo Cromagnum -Crud Bonemeal -Crunch Buttsteak -Crush McStompbones -Diego Diefist -Dirk Hardpeck -Duke Killington -Evil Bob Marley -Evil Martin Luther King -Fist Rockbone -Flint Ironstag -Ford Spinetwist -Fridge Largemeat -George Melons -Gibbs McLargehuge -GORE Vidal -Gristle McThornBody -Hank Chesthair -Hans Testosteroneson -Killiam Shakespeare -Killing McKillingalot -Jet Handblood -Lance Killiam -Leonardo Da Viking -Lump Beefrock -Lunge Crushheel -Mancrush McBrorape -Max Pain -Maximilian Murderface -Maxx Power -Noam Bombsky -Norb Chrometaint -Oats Squatzon -Pack Blowfist -Punch Rockgroin -Punch Sideiron -Punt Speedchunk -Reef Blastbody -Rex Dudekiller VII -Rip Sidecheek -Rip Steakface -Rock Vangranite -Roid Swolebod -Roll Fizzlebeef -Ronnie Roidready -Sarah Pain -Seamus McTosterone -Sgt Slaughter -Shred Gluteflex -Sir Killaslot -Slab Bulkhead -Slab Squatthrust -Slake Fistcrunch -Slate Slabrock -Smash Lampjaw -Smoke Manmuscle -Splint Chesthair -Stabby McGee -Stump Beefgnaw -Stump Chunkman -Theodore Pain -Thick McRunfast -Thrust Vanderhuge -Trent Tightshirt -Toolboxl Rose -Touch Rustrod -Trunk Slamchest -Van Darkholme -Zombie Gandhi +Able Sentry +Alamo +Anvil +Backhand +Barrage +Big Boss +Black Demon +Black Eyes +Blackjack +Blind Doom +Blind Eclipse +Blind Obelisk +Blind Predator +Blind Vanguard +Blue Freedom +Blue Lilly +Blue Mammoth +Blue Paladin +Brass Axe +Bronco +Brown Avalanche +Brown Champion +Brown Sun +Brown Vanguard +Chopsticks +Clover +Counselor +Cyclone +Desperado +Dust Devil +Evil Eye +Extinction +Foxtrot +Goliath +Grand Slam +Gray Puma +Green Knight +Green Rain +Green Scorpion +Hidden Axe +Hidden Doom +Hidden Phantom +Hotel +Judgement Day +Juliet +Lunatic +Meteor +Monolith +Neptune +Orange Fire +Orange Salvation +Overseer +Overshadow +Papa +Phantasm +Pink Mammoth +Pink Meteor +Pink Puma +Purple Knuckle +Purple Moon +Python +Razor +Red Snow +Revenant +Rhubarb +Saber +Saberteeth +Sea Angel +Sea Charger +Sea Devil +Sea Ghost +Shoplift +Short-Circuit +Sierra +Silver Cougar +Silver Medal +Silver Tornado +Solar Eclipse +Sparta +Stallion +Supercharge +Swamp Dragon +Thunder +Tornado +Triple Cross +Ultimatum +Watchtower +White Knight +White Nightmare +Yellow Freedom diff --git a/strings/names/first.txt b/strings/names/first.txt index cc99e59d84e24..3f9018adca21d 100644 --- a/strings/names/first.txt +++ b/strings/names/first.txt @@ -1,1396 +1,1396 @@ -Aaden -Aaliyah -Aaron -Abby -Abel -Abigail -Abraham -Adam -Adan -Addison -Addyson -Adeline -Aden -Adolph -Adrian -Adriana -Adrianna -Aida -Aidan -Aiden -Aileen -Ainsley -Alaina -Alan -Alana -Alanna -Alayna -Albert -Alberto -Alden -Alec -Alejandra -Alejandro -Alessandra -Alex -Alexa -Alexander -Alexandra -Alexandria -Alexia -Alexis -Alexus -Alfred -Alfreda -Alfredo -Alger -Ali -Alice -Alicia -Alijah -Alina -Alisa -Alison -Alissa -Alisya -Alivia -Aliyah -Allegra -Allegria -Allen -Allie -Allison -Allisson -Allyson -Alma -Alondra -Alvin -Alysha -Alyson -Alyssa -Alyssia -Amanda -Amari -Amaryllis -Amaya -Amber -Ambrosine -Amelia -Amir -Amira -Amiyah -Amos -Amy -Amya -Ana -Anahi -Anastasia -Anaya -Anderson -Andre -Andrea -Andres -Andrew -Andy -Angel -Angela -Angelica -Angelina -Angelo -Angie -Aniya -Aniyah -Anjelica -Anna -Annabelle -Anne -Annie -Annika -Anthony -Antonio -Anya -April -Arabella -Archie -Ariana -Arianna -Ariel -Arielle -Arleen -Armando -Arn -Art -Arthur -Arturo -Asher -Ashley -Ashlie -Ashlyn -Ashlynn -Ashton -Asia -Astor -Athena -Aubree -Aubrey -Aubrie -Audrey -Audrina -August -Aurora -Austin -Autumn -Ava -Avalon -Averill -Avery -Axel -Ayden -Ayla -Bailey -Baldric -Barbra -Bartholomew -Baylee -Beau -Beckah -Beckett -Becky -Bella -Benjamin -Bennett -Bernice -Bertrand -Bethany -Bethney -Betsy -Bianca -Bidelia -Bill -Blake -Braden -Bradley -Brady -Braeden -Braiden -Brandon -Braxton -Brayan -Brayden -Braydon -Braylon -Breanna -Breanne -Brenda -Brendan -Brenden -Brenna -Brennan -Brett -Brian -Briana -Brianna -Bridget -Brielle -Brittani -Brittany -Brock -Brodie -Brody -Bronte -Brooke -Brooklyn -Brooklynn -Bruce -Bryan -Bryant -Bryce -Brycen -Brynn -Bryson -Burt -Byrne -Byron -Bysshe -Cade -Caden -Cadence -Caiden -Caitlin -Caitlyn -Calanthia -Caleb -Caleigh -Cali -Callie -Calvin -Camden -Cameron -Camila -Camille -Camron -Camryn -Candace -Candice -Candis -Canute -Cara -Carl -Carlos -Carly -Carlyle -Carmen -Carolina -Caroline -Carolyn -Carry -Carson -Carter -Caryl -Casey -Cash -Casimir -Cassandra -Cassian -Cassidy -Catherine -Cayden -Cecilia -Cecily -Celeste -Cesar -Chad -Chance -Chandler -Charles -Charlie -Charlotte -Charlton -Chase -Chelsea -Cherette -Cheri -Cherry -Cheyanne -Cheyenne -Chip -Chloe -Chris -Christa -Christian -Christiana -Christina -Christobel -Christopher -Ciara -Cindy -Claire -Clara -Claribel -Clark -Claudia -Claudius -Clayton -Clement -Cleveland -Cliff -Clinton -Clitus -Clover -Cody -Cohen -Colby -Cole -Colin -Collin -Colten -Colton -Conner -Connor -Cooper -Cora -Corbin -Coreen -Corey -Corrine -Cory -Courtney -Cristian -Cristopher -Cruz -Crystal -Curtis -Cy -Cynthia -Daisy -Dakota -Dallas -Dalton -Dalya -Damian -Damien -Damon -Dana -Dane -Danica -Daniel -Daniela -Daniella -Danielle -Danika -Danna -Danny -Dante -Darcey -Darell -Daria -Darin -Darius -Darren -David -Davion -Davis -Dawson -Dayana -Dayna -Dayton -Dean -Deandre -Deangelo -Debbi -Declan -Dee -Deena -Delaney -Delilah -Della -Delma -Denholm -Denise -Dennis -Denys -Derek -Derrick -Desiree -Desmond -Destiny -Devin -Devon -Diamond -Diana -Diego -Dillon -Dina -Dolores -Dominic -Dominick -Donald -Donella -Donna -Donny -Donovan -Dorian -Dorothy -Dortha -Douglas -Drake -Drew -Driscoll -Dulce -Duncan -Dustin -Dylan -Easter -Easton -Ebba -Eddie -Eden -Edgar -Eduardo -Edward -Edwin -Effie -Elaina -Eleanor -Elena -Eli -Eliana -Elias -Elijah -Eliot -Eliott -Elise -Eliza -Elizabeth -Ella -Elle -Ellie -Elliot -Elliott -Elric -Elspet -Elwood -Emanuel -Emely -Emerson -Emery -Emilee -Emilia -Emiliano -Emilio -Emily -Emma -Emmanuel -Enrique -Eric -Erica -Erick -Erik -Erika -Erin -Ermintrude -Ernesto -Esmeralda -Esteban -Esther -Estrella -Ethan -Eugenia -Euphemia -Eustace -Eva -Evan -Evangeline -Eveleen -Evelina -Evelyn -Everett -Ezekiel -Ezra -Fabian -Faith -Fatima -Fay -Felix -Fernanda -Fernando -Finn -Fiona -Fitz -Flick -Floella -Flora -Flossie -Fortune -Francesca -Francis -Francisco -Frank -Frankie -Franklin -Fulton -Gabriel -Gabriela -Gabriella -Gabrielle -Gael -Gage -Garret -Garrett -Gary -Gavin -Gaye -Gaylord -Genesis -Genette -Genevieve -George -Georgene -Georgia -Geraldine -Gerardo -Gervase -Gianna -Gina -Ginger -Giovanni -Giselle -Gladwyn -Glenna -Gloria -Goddard -Godwin -Goodwin -Gordon -Grace -Gracie -Grady -Graeme -Graham -Grant -Gratian -Grayson -Gregory -Greta -Greyson -Griffin -Griselda -Guadalupe -Guillermo -Gunner -Gustavo -Gwenda -Gwenevere -Hadley -Haidee -Hailee -Hailey -Hal -Haleigh -Haley -Hanna -Hannah -Happy -Harley -Harmony -Harper -Harrison -Hartley -Hayden -Haylee -Hayley -Haylie -Hazel -Heather -Heaven -Hector -Hedley -Heidi -Helen -Henderson -Henry -Hepsie -Hervey -Holden -Holly -Homer -Hope -Horatio -Hortensia -Hudson -Huffie -Hugo -Hunter -Ian -Iantha -Ileen -Imani -Innocent -Irene -Iris -Irvine -Isaac -Isabel -Isabella -Isabelle -Isaiah -Isaias -Isiah -Ismael -Israel -Issac -Itzel -Ivan -Ivy -Izabella -Izaiah -Jacaline -Jace -Jack -Jackson -Jacob -Jacoby -Jacqueline -Jacquetta -Jacqui -Jada -Jade -Jaden -Jadon -Jadyn -Jaelyn -Jaiden -Jaime -Jake -Jakki -Jakob -Jalen -Jamar -Jamari -Jamarion -James -Jameson -Jamie -Jamison -Jane -Janel -Janelle -Janette -Janie -Janina -Janine -Janiya -Janiyah -Jared -Jaslene -Jasmin -Jasmine -Jason -Jasper -Javier -Javon -Jaxon -Jaxson -Jay -Jayce -Jayda -Jayden -Jaydon -Jaye -Jayla -Jaylee -Jaylen -Jayne -Jaynie -Jayson -Jazlyn -Jazmin -Jazmine -Jeanna -Jeannie -Jeannine -Jeb -Jed -Jeffrey -Jemmy -Jenifer -Jenna -Jennie -Jennifer -Jera -Jere -Jeremiah -Jeremy -Jeri -Jermaine -Jerrie -Jerry -Jesse -Jessica -Jesus -Jillian -Jillie -Jim -Jimena -Jimmy -Joachim -Joanna -Joaquin -Jocelyn -Joe -Joel -Joetta -Joey -Johan -Johanna -John -Johnathan -Johnny -Joi -Jonah -Jonas -Jonathan -Jonathon -Joni -Jordan -Jordyn -Jorge -Jose -Joselyn -Joseph -Josepha -Josephine -Josh -Joshua -Josiah -Josie -Josue -Joye -Juan -Judah -Jude -Julia -Julian -Juliana -Julianna -Julie -Juliet -Julio -Julissa -Julius -July -Justice -Justin -Kade -Kaden -Kadence -Kaelea -Kaelyn -Kai -Kaiden -Kailey -Kailyn -Kaitlin -Kaitlyn -Kale -Kaleb -Kaleigh -Kameron -Kamryn -Kane -Kara -Karen -Karenza -Karina -Karla -Karly -Karson -Karyn -Kassidy -Kat -Kate -Katelyn -Katelynn -Katherine -Kathleen -Kathryn -Kathy -Katie -Katlyn -Kayden -Kaydence -Kayla -Kaylee -Kayleigh -Kaylie -Kaylin -Keagan -Keaton -Keegan -Keira -Keith -Kellen -Kellie -Kelly -Kelsey -Kelvin -Kendall -Kendra -Kennard -Kennedy -Kenneth -Kenzie -Kerena -Kerensa -Keturah -Kevin -Keziah -Khalil -Khloe -Kiana -Kiara -Kiera -Kiley -Kimberley -Kimberly -Kimora -Kingston -Kira -Kobe -Kolton -Kristen -Kristina -Kristopher -Kyla -Kyle -Kylee -Kyleigh -Kyler -Kylie -Kyra -Lacey -Lacy -Laila -Lakeisha -Lalla -Lana -Lance -Landen -Landon -Landyn -Lane -Lanny -Larry -Latanya -Launce -Laura -Lauren -Laurencia -Laurissa -Lauryn -Lawrence -Layla -Leah -Leeann -Leia -Leila -Leilani -Leland -Lena -Lennox -Leo -Leonardo -Leonel -Leroi -Leslie -Lesly -Lessie -Leta -Levi -Lexi -Lexia -Lexus -Lia -Liam -Lila -Lilah -Lilian -Liliana -Lillian -Lilliana -Lillie -Lilly -Lily -Lincoln -Linden -Lindsay -Lindsey -Lindsie -Lindy -Linton -Lizbeth -Lockie -Logan -Lola -London -Lorenzo -Loreto -Lori -Lorin -Lou -Louis -Luanne -Luca -Lucas -Lucia -Lucian -Lucy -Luis -Lukas -Luke -Luna -Luvenia -Lydia -Lyla -Lyndsey -Lynn -Lynsey -Lynwood -Lyric -Mabelle -Macey -Macie -Mackenzie -Macy -Madalyn -Maddison -Maddox -Madeleine -Madeline -Madelyn -Madelynn -Madilyn -Madison -Madisyn -Madyson -Maegan -Maggie -Makayla -Makenna -Makenzie -Malachi -Malcolm -Malia -Malik -Mallory -Manley -Manuel -Marc -Marcia -Marco -Marcos -Marcus -Marely -Margaret -Maria -Mariabella -Mariah -Mariana -Marilene -Mario -Marion -Marisol -Marissa -Marje -Marjory -Mark -Marlee -Marley -Marlowe -Marlyn -Marshall -Martin -Marvin -Mary -Maryann -Mason -Mateo -Mathew -Matthew -Maudie -Maurene -Maurice -Mauricio -Max -Maximilian -Maximus -Maxwell -May -Maya -Maynard -Mckenna -Mckenzie -Megan -Meghan -Mekhi -Melanie -Melany -Melissa -Melody -Melvin -Melvyn -Meredith -Merideth -Merrilyn -Meryl -Mia -Micah -Michael -Michaela -Micheal -Michelle -Miguel -Mikayla -Mike -Miles -Miley -Milo -Milton -Minnie -Miracle -Miranda -Miriam -Mitchell -Moises -Molly -Monica -Monna -Montague -Monte -Monty -Morgan -Moses -Muriel -Mya -Mylee -Myles -Myriam -Myrtie -Nadia -Nan -Nancy -Naomi -Nasir -Natalia -Natalie -Nataly -Natasha -Nathan -Nathaniel -Nayeli -Nehemiah -Nelle -Nelson -Nena -Nerissa -Netta -Nettie -Nevaeh -Nia -Nicholas -Nickolas -Nicolas -Nicole -Nikolas -Nina -Noah -Noel -Noelle -Nolan -Nonie -Nora -Norah -Nova -Nowell -Nydia -Nyla -Olive -Oliver -Olivia -Omar -Oralie -Orlando -Osbert -Osborn -Osborne -Oscar -Osmund -Owen -Pablo -Paget -Paige -Paisley -Paola -Paris -Parker -Patience -Patricia -Patrick -Patton -Paul -Pauleen -Paxton -Payton -Pedro -Pene -Penelope -Percival -Peregrine -Perla -Peter -Peyton -Pheobe -Philip -Phillip -Phoebe -Phoenix -Phyliss -Phyllida -Phyllis -Piper -Porsche -Porter -Presley -Preston -Priscilla -Prosper -Prue -Quanah -Quentin -Quiana -Quinn -Quinton -Rachael -Rachel -Raegan -Raelene -Rafael -Rain -Ramon -Randa -Randal -Randy -Rastus -Raul -Raymond -Rayner -Reagan -Rebecca -Rebeckah -Rebekah -Reece -Reed -Reene -Reese -Reid -Renie -Reuben -Rexana -Reynard -Rhetta -Ricardo -Rich -Richard -Richie -Rick -Rickena -Rickey -Rickie -Ricky -Rihanna -Riley -River -Robert -Roberto -Rocco -Rodger -Rodrigo -Roger -Roman -Romayne -Romeo -Ronald -Ronnette -Rosa -Roscoe -Rose -Rosemary -Roswell -Rowan -Roy -Royce -Ruben -Ruby -Rubye -Russell -Rusty -Ruth -Ryan -Ryder -Ryker -Rylan -Rylee -Ryleigh -Rylie -Sabella -Sabrina -Sachie -Sadie -Sage -Sal -Sally -Salvador -Sam -Samantha -Samara -Samuel -Sandra -Santiago -Sara -Sarah -Sarai -Saranna -Sasha -Saul -Savanna -Savannah -Sawyer -Scarlett -Scott -Scotty -Sean -Sebastian -Selena -Seneca -Serena -Serenity -Sergio -Seth -Seymour -Shan -Shana -Shane -Shanika -Shannah -Shannon -Shantae -Sharalyn -Sharla -Shaun -Shawn -Shayla -Shelby -Sheri -Sherie -Sherill -Sherri -Shiloh -Sienna -Sierra -Silas -Simon -Sissy -Skylar -Skyler -Sloan -Sofia -Solomon -Sophia -Sophie -Sorrel -Spencer -Spike -Star -Stella -Steph -Stephanie -Stephany -Stephen -Steven -Sue -Sukie -Summer -Sunshine -Susanna -Susannah -Suzan -Suzy -Sybil -Syd -Sydney -Talia -Talon -Tamika -Tamsin -Tania -Tanner -Tansy -Taryn -Tate -Tatiana -Tatum -Tatyanna -Taylor -Teagan -Tel -Terrell -Terry -Tessa -Theodore -Thomas -Tiffany -Timothy -Titus -Tod -Tolly -Tony -Topaz -Tori -Tracee -Tracey -Travis -Trent -Trenton -Trevor -Trey -Trinity -Tristan -Tristen -Triston -Troy -Tucker -Ty -Tye -Tyler -Tyson -Uland -Ulric -Ulyssa -Uriel -Valary -Valentina -Valeria -Valerie -Vanessa -Vaughn -Verna -Veronica -Victor -Victoria -Vince -Vincent -Vinnie -Violet -Vivian -Viviana -Vivyan -Walker -Walter -Ward -Warner -Wayne -Wendi -Wendy -Wesley -Weston -Whitaker -William -Willow -Willy -Winifred -Wisdom -Woodrow -Woody -Wyatt -Wynonna -Wynter -Xander -Xavier -Ximena -Yahir -Yasmin -Yolanda -Ysabel -Zachariah -Zachary -Zack -Zackary -Zander -Zane -Zayden -Zeke -Zelda -Zion -Zoe -Zoey +Aaden +Aaliyah +Aaron +Abby +Abel +Abigail +Abraham +Adam +Adan +Addison +Addyson +Adeline +Aden +Adolph +Adrian +Adriana +Adrianna +Aida +Aidan +Aiden +Aileen +Ainsley +Alaina +Alan +Alana +Alanna +Alayna +Albert +Alberto +Alden +Alec +Alejandra +Alejandro +Alessandra +Alex +Alexa +Alexander +Alexandra +Alexandria +Alexia +Alexis +Alexus +Alfred +Alfreda +Alfredo +Alger +Ali +Alice +Alicia +Alijah +Alina +Alisa +Alison +Alissa +Alisya +Alivia +Aliyah +Allegra +Allegria +Allen +Allie +Allison +Allisson +Allyson +Alma +Alondra +Alvin +Alysha +Alyson +Alyssa +Alyssia +Amanda +Amari +Amaryllis +Amaya +Amber +Ambrosine +Amelia +Amir +Amira +Amiyah +Amos +Amy +Amya +Ana +Anahi +Anastasia +Anaya +Anderson +Andre +Andrea +Andres +Andrew +Andy +Angel +Angela +Angelica +Angelina +Angelo +Angie +Aniya +Aniyah +Anjelica +Anna +Annabelle +Anne +Annie +Annika +Anthony +Antonio +Anya +April +Arabella +Archie +Ariana +Arianna +Ariel +Arielle +Arleen +Armando +Arn +Art +Arthur +Arturo +Asher +Ashley +Ashlie +Ashlyn +Ashlynn +Ashton +Asia +Astor +Athena +Aubree +Aubrey +Aubrie +Audrey +Audrina +August +Aurora +Austin +Autumn +Ava +Avalon +Averill +Avery +Axel +Ayden +Ayla +Bailey +Baldric +Barbra +Bartholomew +Baylee +Beau +Beckah +Beckett +Becky +Bella +Benjamin +Bennett +Bernice +Bertrand +Bethany +Bethney +Betsy +Bianca +Bidelia +Bill +Blake +Braden +Bradley +Brady +Braeden +Braiden +Brandon +Braxton +Brayan +Brayden +Braydon +Braylon +Breanna +Breanne +Brenda +Brendan +Brenden +Brenna +Brennan +Brett +Brian +Briana +Brianna +Bridget +Brielle +Brittani +Brittany +Brock +Brodie +Brody +Bronte +Brooke +Brooklyn +Brooklynn +Bruce +Bryan +Bryant +Bryce +Brycen +Brynn +Bryson +Burt +Byrne +Byron +Bysshe +Cade +Caden +Cadence +Caiden +Caitlin +Caitlyn +Calanthia +Caleb +Caleigh +Cali +Callie +Calvin +Camden +Cameron +Camila +Camille +Camron +Camryn +Candace +Candice +Candis +Canute +Cara +Carl +Carlos +Carly +Carlyle +Carmen +Carolina +Caroline +Carolyn +Carry +Carson +Carter +Caryl +Casey +Cash +Casimir +Cassandra +Cassian +Cassidy +Catherine +Cayden +Cecilia +Cecily +Celeste +Cesar +Chad +Chance +Chandler +Charles +Charlie +Charlotte +Charlton +Chase +Chelsea +Cherette +Cheri +Cherry +Cheyanne +Cheyenne +Chip +Chloe +Chris +Christa +Christian +Christiana +Christina +Christobel +Christopher +Ciara +Cindy +Claire +Clara +Claribel +Clark +Claudia +Claudius +Clayton +Clement +Cleveland +Cliff +Clinton +Clitus +Clover +Cody +Cohen +Colby +Cole +Colin +Collin +Colten +Colton +Conner +Connor +Cooper +Cora +Corbin +Coreen +Corey +Corrine +Cory +Courtney +Cristian +Cristopher +Cruz +Crystal +Curtis +Cy +Cynthia +Daisy +Dakota +Dallas +Dalton +Dalya +Damian +Damien +Damon +Dana +Dane +Danica +Daniel +Daniela +Daniella +Danielle +Danika +Danna +Danny +Dante +Darcey +Darell +Daria +Darin +Darius +Darren +David +Davion +Davis +Dawson +Dayana +Dayna +Dayton +Dean +Deandre +Deangelo +Debbi +Declan +Dee +Deena +Delaney +Delilah +Della +Delma +Denholm +Denise +Dennis +Denys +Derek +Derrick +Desiree +Desmond +Destiny +Devin +Devon +Diamond +Diana +Diego +Dillon +Dina +Dolores +Dominic +Dominick +Donald +Donella +Donna +Donny +Donovan +Dorian +Dorothy +Dortha +Douglas +Drake +Drew +Driscoll +Dulce +Duncan +Dustin +Dylan +Easter +Easton +Ebba +Eddie +Eden +Edgar +Eduardo +Edward +Edwin +Effie +Elaina +Eleanor +Elena +Eli +Eliana +Elias +Elijah +Eliot +Eliott +Elise +Eliza +Elizabeth +Ella +Elle +Ellie +Elliot +Elliott +Elric +Elspet +Elwood +Emanuel +Emely +Emerson +Emery +Emilee +Emilia +Emiliano +Emilio +Emily +Emma +Emmanuel +Enrique +Eric +Erica +Erick +Erik +Erika +Erin +Ermintrude +Ernesto +Esmeralda +Esteban +Esther +Estrella +Ethan +Eugenia +Euphemia +Eustace +Eva +Evan +Evangeline +Eveleen +Evelina +Evelyn +Everett +Ezekiel +Ezra +Fabian +Faith +Fatima +Fay +Felix +Fernanda +Fernando +Finn +Fiona +Fitz +Flick +Floella +Flora +Flossie +Fortune +Francesca +Francis +Francisco +Frank +Frankie +Franklin +Fulton +Gabriel +Gabriela +Gabriella +Gabrielle +Gael +Gage +Garret +Garrett +Gary +Gavin +Gaye +Gaylord +Genesis +Genette +Genevieve +George +Georgene +Georgia +Geraldine +Gerardo +Gervase +Gianna +Gina +Ginger +Giovanni +Giselle +Gladwyn +Glenna +Gloria +Goddard +Godwin +Goodwin +Gordon +Grace +Gracie +Grady +Graeme +Graham +Grant +Gratian +Grayson +Gregory +Greta +Greyson +Griffin +Griselda +Guadalupe +Guillermo +Gunner +Gustavo +Gwenda +Gwenevere +Hadley +Haidee +Hailee +Hailey +Hal +Haleigh +Haley +Hanna +Hannah +Happy +Harley +Harmony +Harper +Harrison +Hartley +Hayden +Haylee +Hayley +Haylie +Hazel +Heather +Heaven +Hector +Hedley +Heidi +Helen +Henderson +Henry +Hepsie +Hervey +Holden +Holly +Homer +Hope +Horatio +Hortensia +Hudson +Huffie +Hugo +Hunter +Ian +Iantha +Ileen +Imani +Innocent +Irene +Iris +Irvine +Isaac +Isabel +Isabella +Isabelle +Isaiah +Isaias +Isiah +Ismael +Israel +Issac +Itzel +Ivan +Ivy +Izabella +Izaiah +Jacaline +Jace +Jack +Jackson +Jacob +Jacoby +Jacqueline +Jacquetta +Jacqui +Jada +Jade +Jaden +Jadon +Jadyn +Jaelyn +Jaiden +Jaime +Jake +Jakki +Jakob +Jalen +Jamar +Jamari +Jamarion +James +Jameson +Jamie +Jamison +Jane +Janel +Janelle +Janette +Janie +Janina +Janine +Janiya +Janiyah +Jared +Jaslene +Jasmin +Jasmine +Jason +Jasper +Javier +Javon +Jaxon +Jaxson +Jay +Jayce +Jayda +Jayden +Jaydon +Jaye +Jayla +Jaylee +Jaylen +Jayne +Jaynie +Jayson +Jazlyn +Jazmin +Jazmine +Jeanna +Jeannie +Jeannine +Jeb +Jed +Jeffrey +Jemmy +Jenifer +Jenna +Jennie +Jennifer +Jera +Jere +Jeremiah +Jeremy +Jeri +Jermaine +Jerrie +Jerry +Jesse +Jessica +Jesus +Jillian +Jillie +Jim +Jimena +Jimmy +Joachim +Joanna +Joaquin +Jocelyn +Joe +Joel +Joetta +Joey +Johan +Johanna +John +Johnathan +Johnny +Joi +Jonah +Jonas +Jonathan +Jonathon +Joni +Jordan +Jordyn +Jorge +Jose +Joselyn +Joseph +Josepha +Josephine +Josh +Joshua +Josiah +Josie +Josue +Joye +Juan +Judah +Jude +Julia +Julian +Juliana +Julianna +Julie +Juliet +Julio +Julissa +Julius +July +Justice +Justin +Kade +Kaden +Kadence +Kaelea +Kaelyn +Kai +Kaiden +Kailey +Kailyn +Kaitlin +Kaitlyn +Kale +Kaleb +Kaleigh +Kameron +Kamryn +Kane +Kara +Karen +Karenza +Karina +Karla +Karly +Karson +Karyn +Kassidy +Kat +Kate +Katelyn +Katelynn +Katherine +Kathleen +Kathryn +Kathy +Katie +Katlyn +Kayden +Kaydence +Kayla +Kaylee +Kayleigh +Kaylie +Kaylin +Keagan +Keaton +Keegan +Keira +Keith +Kellen +Kellie +Kelly +Kelsey +Kelvin +Kendall +Kendra +Kennard +Kennedy +Kenneth +Kenzie +Kerena +Kerensa +Keturah +Kevin +Keziah +Khalil +Khloe +Kiana +Kiara +Kiera +Kiley +Kimberley +Kimberly +Kimora +Kingston +Kira +Kobe +Kolton +Kristen +Kristina +Kristopher +Kyla +Kyle +Kylee +Kyleigh +Kyler +Kylie +Kyra +Lacey +Lacy +Laila +Lakeisha +Lalla +Lana +Lance +Landen +Landon +Landyn +Lane +Lanny +Larry +Latanya +Launce +Laura +Lauren +Laurencia +Laurissa +Lauryn +Lawrence +Layla +Leah +Leeann +Leia +Leila +Leilani +Leland +Lena +Lennox +Leo +Leonardo +Leonel +Leroi +Leslie +Lesly +Lessie +Leta +Levi +Lexi +Lexia +Lexus +Lia +Liam +Lila +Lilah +Lilian +Liliana +Lillian +Lilliana +Lillie +Lilly +Lily +Lincoln +Linden +Lindsay +Lindsey +Lindsie +Lindy +Linton +Lizbeth +Lockie +Logan +Lola +London +Lorenzo +Loreto +Lori +Lorin +Lou +Louis +Luanne +Luca +Lucas +Lucia +Lucian +Lucy +Luis +Lukas +Luke +Luna +Luvenia +Lydia +Lyla +Lyndsey +Lynn +Lynsey +Lynwood +Lyric +Mabelle +Macey +Macie +Mackenzie +Macy +Madalyn +Maddison +Maddox +Madeleine +Madeline +Madelyn +Madelynn +Madilyn +Madison +Madisyn +Madyson +Maegan +Maggie +Makayla +Makenna +Makenzie +Malachi +Malcolm +Malia +Malik +Mallory +Manley +Manuel +Marc +Marcia +Marco +Marcos +Marcus +Marely +Margaret +Maria +Mariabella +Mariah +Mariana +Marilene +Mario +Marion +Marisol +Marissa +Marje +Marjory +Mark +Marlee +Marley +Marlowe +Marlyn +Marshall +Martin +Marvin +Mary +Maryann +Mason +Mateo +Mathew +Matthew +Maudie +Maurene +Maurice +Mauricio +Max +Maximilian +Maximus +Maxwell +May +Maya +Maynard +Mckenna +Mckenzie +Megan +Meghan +Mekhi +Melanie +Melany +Melissa +Melody +Melvin +Melvyn +Meredith +Merideth +Merrilyn +Meryl +Mia +Micah +Michael +Michaela +Micheal +Michelle +Miguel +Mikayla +Mike +Miles +Miley +Milo +Milton +Minnie +Miracle +Miranda +Miriam +Mitchell +Moises +Molly +Monica +Monna +Montague +Monte +Monty +Morgan +Moses +Muriel +Mya +Mylee +Myles +Myriam +Myrtie +Nadia +Nan +Nancy +Naomi +Nasir +Natalia +Natalie +Nataly +Natasha +Nathan +Nathaniel +Nayeli +Nehemiah +Nelle +Nelson +Nena +Nerissa +Netta +Nettie +Nevaeh +Nia +Nicholas +Nickolas +Nicolas +Nicole +Nikolas +Nina +Noah +Noel +Noelle +Nolan +Nonie +Nora +Norah +Nova +Nowell +Nydia +Nyla +Olive +Oliver +Olivia +Omar +Oralie +Orlando +Osbert +Osborn +Osborne +Oscar +Osmund +Owen +Pablo +Paget +Paige +Paisley +Paola +Paris +Parker +Patience +Patricia +Patrick +Patton +Paul +Pauleen +Paxton +Payton +Pedro +Pene +Penelope +Percival +Peregrine +Perla +Peter +Peyton +Pheobe +Philip +Phillip +Phoebe +Phoenix +Phyliss +Phyllida +Phyllis +Piper +Porsche +Porter +Presley +Preston +Priscilla +Prosper +Prue +Quanah +Quentin +Quiana +Quinn +Quinton +Rachael +Rachel +Raegan +Raelene +Rafael +Rain +Ramon +Randa +Randal +Randy +Rastus +Raul +Raymond +Rayner +Reagan +Rebecca +Rebeckah +Rebekah +Reece +Reed +Reene +Reese +Reid +Renie +Reuben +Rexana +Reynard +Rhetta +Ricardo +Rich +Richard +Richie +Rick +Rickena +Rickey +Rickie +Ricky +Rihanna +Riley +River +Robert +Roberto +Rocco +Rodger +Rodrigo +Roger +Roman +Romayne +Romeo +Ronald +Ronnette +Rosa +Roscoe +Rose +Rosemary +Roswell +Rowan +Roy +Royce +Ruben +Ruby +Rubye +Russell +Rusty +Ruth +Ryan +Ryder +Ryker +Rylan +Rylee +Ryleigh +Rylie +Sabella +Sabrina +Sachie +Sadie +Sage +Sal +Sally +Salvador +Sam +Samantha +Samara +Samuel +Sandra +Santiago +Sara +Sarah +Sarai +Saranna +Sasha +Saul +Savanna +Savannah +Sawyer +Scarlett +Scott +Scotty +Sean +Sebastian +Selena +Seneca +Serena +Serenity +Sergio +Seth +Seymour +Shan +Shana +Shane +Shanika +Shannah +Shannon +Shantae +Sharalyn +Sharla +Shaun +Shawn +Shayla +Shelby +Sheri +Sherie +Sherill +Sherri +Shiloh +Sienna +Sierra +Silas +Simon +Sissy +Skylar +Skyler +Sloan +Sofia +Solomon +Sophia +Sophie +Sorrel +Spencer +Spike +Star +Stella +Steph +Stephanie +Stephany +Stephen +Steven +Sue +Sukie +Summer +Sunshine +Susanna +Susannah +Suzan +Suzy +Sybil +Syd +Sydney +Talia +Talon +Tamika +Tamsin +Tania +Tanner +Tansy +Taryn +Tate +Tatiana +Tatum +Tatyanna +Taylor +Teagan +Tel +Terrell +Terry +Tessa +Theodore +Thomas +Tiffany +Timothy +Titus +Tod +Tolly +Tony +Topaz +Tori +Tracee +Tracey +Travis +Trent +Trenton +Trevor +Trey +Trinity +Tristan +Tristen +Triston +Troy +Tucker +Ty +Tye +Tyler +Tyson +Uland +Ulric +Ulyssa +Uriel +Valary +Valentina +Valeria +Valerie +Vanessa +Vaughn +Verna +Veronica +Victor +Victoria +Vince +Vincent +Vinnie +Violet +Vivian +Viviana +Vivyan +Walker +Walter +Ward +Warner +Wayne +Wendi +Wendy +Wesley +Weston +Whitaker +William +Willow +Willy +Winifred +Wisdom +Woodrow +Woody +Wyatt +Wynonna +Wynter +Xander +Xavier +Ximena +Yahir +Yasmin +Yolanda +Ysabel +Zachariah +Zachary +Zack +Zackary +Zander +Zane +Zayden +Zeke +Zelda +Zion +Zoe +Zoey Zune \ No newline at end of file diff --git a/strings/names/first_female.txt b/strings/names/first_female.txt index 6710c1bfc322c..038e936879287 100644 --- a/strings/names/first_female.txt +++ b/strings/names/first_female.txt @@ -1,771 +1,771 @@ -Aaliyah -Abby -Abigail -Addison -Addyson -Adeline -Adriana -Adrianna -Aida -Aileen -Ainsley -Alaina -Alana -Alanna -Alayna -Alejandra -Alessandra -Alexa -Alexandra -Alexandria -Alexia -Alexis -Alexus -Alfreda -Alice -Alicia -Alina -Alisa -Alison -Alissa -Alisya -Alivia -Aliyah -Allegra -Allegria -Allie -Allison -Allisson -Allyson -Alma -Alondra -Alysha -Alyson -Alyssa -Alyssia -Amanda -Amari -Amaryllis -Amaya -Amber -Ambrosine -Amelia -Amira -Amiyah -Amy -Amya -Ana -Anahi -Anastasia -Anaya -Andrea -Angel -Angela -Angelica -Angelina -Angie -Aniya -Aniyah -Anjelica -Anna -Annabelle -Anne -Annie -Annika -Anya -April -Arabella -Ariana -Arianna -Ariel -Arielle -Arleen -Ashley -Ashlie -Ashlyn -Ashlynn -Asia -Astor -Athena -Aubree -Aubrey -Aubrie -Audrey -Audrina -Aurora -Autumn -Ava -Avalona -Averill -Avery -Ayla -Bailey -Barbara -Baylee -Beckah -Becky -Bella -Bernice -Bethany -Bethney -Betsy -Bianca -Bidelia -Breanna -Breanne -Brenda -Brenna -Briana -Brianna -Bridget -Brielle -Brittani -Brittany -Brooke -Brooklyn -Brooklynn -Brynn -Cadence -Caitlin -Caitlyn -Calanthia -Caleigh -Cali -Callie -Cameron -Camila -Camille -Camryn -Candace -Candice -Cara -Carly -Carlyle -Carmen -Carolina -Caroline -Carolyn -Carry -Caryl -Casey -Cassandra -Cassidy -Catherine -Cecilia -Cecily -Celeste -Charlotte -Chelsea -Cherette -Cheri -Cherry -Cheyanne -Cheyenne -Chloe -Christa -Christiana -Christina -Christobelle -Ciara -Cindy -Claire -Clara -Claribel -Claudia -Clover -Cora -Coreen -Corrine -Courtney -Crystal -Cynthia -Daisy -Dakota -Dalya -Dana -Danica -Daniela -Daniella -Danielle -Danika -Danna -Daria -Dayana -Dayna -Debbi -Dee -Deena -Delaney -Delilah -Della -Delma -Denise -Denys -Desiree -Destiny -Diamond -Diana -Dina -Dolores -Donella -Donna -Dorothy -Dortha -Dulce -Easter -Ebba -Eden -Effie -Elaina -Eleanor -Elena -Eliana -Elise -Eliza -Elizabeth -Ella -Elle -Ellie -Emely -Emerson -Emery -Emilee -Emilia -Emily -Emma -Erica -Erika -Erin -Ermintrude -Esmeralda -Esther -Estrella -Eugenia -Euphemia -Eustace -Eva -Evangeline -Eveleen -Evelina -Evelyn -Faith -Fatima -Fay -Fernanda -Fiona -Floella -Flora -Flossie -Fortune -Francesca -Gabriela -Gabriella -Gabrielle -Genette -Genevieve -Georgene -Georgia -Geraldine -Gervase -Gianna -Gina -Ginger -Giselle -Gladwyn -Glenna -Gloria -Grace -Gracie -Greta -Griselda -Guadalupe -Gwenda -Gwenevere -Hadley -Haidee -Hailee -Hailey -Hal -Haleigh -Haley -Hanna -Hannah -Harley -Harmony -Harper -Hayden -Haylee -Hayley -Haylie -Hazel -Heather -Heaven -Hedley -Heidi -Helen -Hepsie -Holly -Hope -Hortensia -Iantha -Ileen -Imani -Innocent -Irene -Iris -Isabel -Isabella -Isabelle -Itzel -Ivy -Izabella -Jacaline -Jacqueline -Jacquetta -Jacqui -Jada -Jade -Jaden -Jadyn -Jaelyn -Jakki -Jalen -Jamie -Jane -Janelle -Janette -Janie -Janina -Janine -Janiya -Janiyah -Jaslene -Jasmin -Jasmine -Jayda -Jayden -Jayla -Jaylee -Jaynie -Jazlyn -Jazmin -Jazmine -Jeanna -Jeannie -Jeannine -Jenifer -Jenna -Jennie -Jennifer -Jera -Jere -Jeri -Jessica -Jillian -Jillie -Jimena -Joanna -Jocelyn -Joetta -Johanna -Joi -Joni -Jordan -Jordyn -Joselyn -Josepha -Josephine -Josie -Joye -Julia -Juliana -Julianna -Julie -Juliet -Julissa -July -Kadence -Kaelea -Kaelyn -Kailey -Kailyn -Kaitlin -Kaitlyn -Kaleigh -Kamryn -Kara -Karen -Karenza -Karina -Karla -Karly -Karyn -Kassidy -Kat -Kate -Katelyn -Katelynn -Katherine -Kathleen -Kathryn -Kathy -Katie -Katlyn -Kayden -Kaydence -Kayla -Kaylee -Kayleigh -Kaylie -Kaylin -Keegan -Keira -Keith -Kellie -Kelly -Kelsey -Kendall -Kendra -Kennedy -Kenzie -Kerena -Kerensa -Keturah -Khloe -Kiana -Kiara -Kiera -Kiley -Kimberley -Kimberly -Kimora -Kira -Kristen -Kristina -Kyla -Kylee -Kyleigh -Kylie -Kyra -Lacey -Lacy -Laila -Lakeisha -Lalla -Lana -Latanya -Laura -Lauren -Laurencia -Laurissa -Lauryn -Layla -Leah -Leeann -Leia -Leila -Leilani -Lena -Leslie -Lesly -Lessie -Leta -Lexi -Lexia -Lexus -Lia -Lila -Lilah -Lilian -Liliana -Lillian -Lilliana -Lillie -Lilly -Lily -Lindsay -Lindsey -Lindsie -Lindy -Lizbeth -Lockie -Logan -Lola -London -Lori -Lorin -Luanne -Lucia -Lucian -Lucy -Luna -Luvenia -Lydia -Lyla -Lyndsey -Lynn -Lynsey -Lynwood -Lyric -Mabelle -Macey -Macie -Mackenzie -Macy -Madalyn -Maddison -Madeleine -Madeline -Madelyn -Madelynn -Madilyn -Madison -Madisyn -Madyson -Maegan -Maggie -Makayla -Makenna -Makenzie -Malia -Mallory -Marcia -Marely -Margaret -Maria -Mariabella -Mariah -Mariana -Marilene -Marion -Marisol -Marissa -Marje -Marjory -Marlee -Marley -Marlowe -Marlyn -Marshall -Mary -Maryann -Maudie -Maurene -May -Maya -Mckenna -Mckenzie -Megan -Meghan -Melanie -Melany -Melissa -Melody -Meredith -Merideth -Merrilyn -Meryl -Mia -Michaela -Michelle -Mikayla -Miley -Minnie -Miracle -Miranda -Miriam -Molly -Monica -Monna -Morgan -Muriel -Mya -Mylee -Myriam -Myrtie -Nadia -Nan -Nancy -Naomi -Natalia -Natalie -Nataly -Natasha -Nayeli -Nelle -Nena -Nerissa -Netta -Nettie -Nevaeh -Nia -Nicole -Nina -Noelle -Nonie -Nora -Norah -Nova -Nowell -Nydia -Nyla -Olive -Olivia -Oralie -Paige -Paisley -Paola -Paris -Patience -Patricia -Pauleen -Payton -Pene -Penelope -Peregrine -Perla -Peyton -Pheobe -Phoebe -Phyliss -Phyllida -Phyllis -Piper -Porsche -Presley -Priscilla -Prosper -Prue -Quanah -Quiana -Rachael -Rachel -Raegan -Raelene -Rain -Randa -Randal -Reagan -Rebecca -Rebeckah -Rebekah -Reene -Reese -Renie -Rexana -Rhetta -Rihanna -Riley -Ronnette -Rosa -Rose -Rosemary -Rowan -Ruby -Rubye -Ruth -Rylee -Ryleigh -Rylie -Sabella -Sabrina -Sachie -Sadie -Sage -Sally -Samantha -Samara -Sandra -Sara -Sarah -Sarai -Saranna -Sasha -Savanna -Savannah -Scarlett -Selena -Seneca -Serena -Serenity -Shana -Shanika -Shannah -Shannon -Shantae -Sharalyn -Sharla -Shayla -Shelby -Sheri -Sherie -Sherill -Sherri -Sienna -Sierra -Sissy -Skylar -Skyler -Sofia -Sophia -Sophie -Star -Stella -Steph -Stephanie -Stephany -Sue -Sukie -Summer -Sunshine -Susanna -Susannah -Suzan -Suzy -Sydney -Talia -Tamika -Tania -Tansy -Taryn -Tatiana -Tatum -Tatyanna -Taylor -Teagan -Tessa -Tiffany -Tolly -Topaz -Tori -Tracee -Tracey -Trinity -Ulyssa -Valary -Valentina -Valeria -Valerie -Vanessa -Verna -Veronica -Victoria -Vinnie -Violet -Vivian -Viviana -Vivyan -Wendi -Wendy -Willow -Wisdom -Wynonna -Wynter -Ximena -Yasmin -Yolanda -Ysabel -Zelda -Zoe -Zoey +Aaliyah +Abby +Abigail +Addison +Addyson +Adeline +Adriana +Adrianna +Aida +Aileen +Ainsley +Alaina +Alana +Alanna +Alayna +Alejandra +Alessandra +Alexa +Alexandra +Alexandria +Alexia +Alexis +Alexus +Alfreda +Alice +Alicia +Alina +Alisa +Alison +Alissa +Alisya +Alivia +Aliyah +Allegra +Allegria +Allie +Allison +Allisson +Allyson +Alma +Alondra +Alysha +Alyson +Alyssa +Alyssia +Amanda +Amari +Amaryllis +Amaya +Amber +Ambrosine +Amelia +Amira +Amiyah +Amy +Amya +Ana +Anahi +Anastasia +Anaya +Andrea +Angel +Angela +Angelica +Angelina +Angie +Aniya +Aniyah +Anjelica +Anna +Annabelle +Anne +Annie +Annika +Anya +April +Arabella +Ariana +Arianna +Ariel +Arielle +Arleen +Ashley +Ashlie +Ashlyn +Ashlynn +Asia +Astor +Athena +Aubree +Aubrey +Aubrie +Audrey +Audrina +Aurora +Autumn +Ava +Avalona +Averill +Avery +Ayla +Bailey +Barbara +Baylee +Beckah +Becky +Bella +Bernice +Bethany +Bethney +Betsy +Bianca +Bidelia +Breanna +Breanne +Brenda +Brenna +Briana +Brianna +Bridget +Brielle +Brittani +Brittany +Brooke +Brooklyn +Brooklynn +Brynn +Cadence +Caitlin +Caitlyn +Calanthia +Caleigh +Cali +Callie +Cameron +Camila +Camille +Camryn +Candace +Candice +Cara +Carly +Carlyle +Carmen +Carolina +Caroline +Carolyn +Carry +Caryl +Casey +Cassandra +Cassidy +Catherine +Cecilia +Cecily +Celeste +Charlotte +Chelsea +Cherette +Cheri +Cherry +Cheyanne +Cheyenne +Chloe +Christa +Christiana +Christina +Christobelle +Ciara +Cindy +Claire +Clara +Claribel +Claudia +Clover +Cora +Coreen +Corrine +Courtney +Crystal +Cynthia +Daisy +Dakota +Dalya +Dana +Danica +Daniela +Daniella +Danielle +Danika +Danna +Daria +Dayana +Dayna +Debbi +Dee +Deena +Delaney +Delilah +Della +Delma +Denise +Denys +Desiree +Destiny +Diamond +Diana +Dina +Dolores +Donella +Donna +Dorothy +Dortha +Dulce +Easter +Ebba +Eden +Effie +Elaina +Eleanor +Elena +Eliana +Elise +Eliza +Elizabeth +Ella +Elle +Ellie +Emely +Emerson +Emery +Emilee +Emilia +Emily +Emma +Erica +Erika +Erin +Ermintrude +Esmeralda +Esther +Estrella +Eugenia +Euphemia +Eustace +Eva +Evangeline +Eveleen +Evelina +Evelyn +Faith +Fatima +Fay +Fernanda +Fiona +Floella +Flora +Flossie +Fortune +Francesca +Gabriela +Gabriella +Gabrielle +Genette +Genevieve +Georgene +Georgia +Geraldine +Gervase +Gianna +Gina +Ginger +Giselle +Gladwyn +Glenna +Gloria +Grace +Gracie +Greta +Griselda +Guadalupe +Gwenda +Gwenevere +Hadley +Haidee +Hailee +Hailey +Hal +Haleigh +Haley +Hanna +Hannah +Harley +Harmony +Harper +Hayden +Haylee +Hayley +Haylie +Hazel +Heather +Heaven +Hedley +Heidi +Helen +Hepsie +Holly +Hope +Hortensia +Iantha +Ileen +Imani +Innocent +Irene +Iris +Isabel +Isabella +Isabelle +Itzel +Ivy +Izabella +Jacaline +Jacqueline +Jacquetta +Jacqui +Jada +Jade +Jaden +Jadyn +Jaelyn +Jakki +Jalen +Jamie +Jane +Janelle +Janette +Janie +Janina +Janine +Janiya +Janiyah +Jaslene +Jasmin +Jasmine +Jayda +Jayden +Jayla +Jaylee +Jaynie +Jazlyn +Jazmin +Jazmine +Jeanna +Jeannie +Jeannine +Jenifer +Jenna +Jennie +Jennifer +Jera +Jere +Jeri +Jessica +Jillian +Jillie +Jimena +Joanna +Jocelyn +Joetta +Johanna +Joi +Joni +Jordan +Jordyn +Joselyn +Josepha +Josephine +Josie +Joye +Julia +Juliana +Julianna +Julie +Juliet +Julissa +July +Kadence +Kaelea +Kaelyn +Kailey +Kailyn +Kaitlin +Kaitlyn +Kaleigh +Kamryn +Kara +Karen +Karenza +Karina +Karla +Karly +Karyn +Kassidy +Kat +Kate +Katelyn +Katelynn +Katherine +Kathleen +Kathryn +Kathy +Katie +Katlyn +Kayden +Kaydence +Kayla +Kaylee +Kayleigh +Kaylie +Kaylin +Keegan +Keira +Keith +Kellie +Kelly +Kelsey +Kendall +Kendra +Kennedy +Kenzie +Kerena +Kerensa +Keturah +Khloe +Kiana +Kiara +Kiera +Kiley +Kimberley +Kimberly +Kimora +Kira +Kristen +Kristina +Kyla +Kylee +Kyleigh +Kylie +Kyra +Lacey +Lacy +Laila +Lakeisha +Lalla +Lana +Latanya +Laura +Lauren +Laurencia +Laurissa +Lauryn +Layla +Leah +Leeann +Leia +Leila +Leilani +Lena +Leslie +Lesly +Lessie +Leta +Lexi +Lexia +Lexus +Lia +Lila +Lilah +Lilian +Liliana +Lillian +Lilliana +Lillie +Lilly +Lily +Lindsay +Lindsey +Lindsie +Lindy +Lizbeth +Lockie +Logan +Lola +London +Lori +Lorin +Luanne +Lucia +Lucian +Lucy +Luna +Luvenia +Lydia +Lyla +Lyndsey +Lynn +Lynsey +Lynwood +Lyric +Mabelle +Macey +Macie +Mackenzie +Macy +Madalyn +Maddison +Madeleine +Madeline +Madelyn +Madelynn +Madilyn +Madison +Madisyn +Madyson +Maegan +Maggie +Makayla +Makenna +Makenzie +Malia +Mallory +Marcia +Marely +Margaret +Maria +Mariabella +Mariah +Mariana +Marilene +Marion +Marisol +Marissa +Marje +Marjory +Marlee +Marley +Marlowe +Marlyn +Marshall +Mary +Maryann +Maudie +Maurene +May +Maya +Mckenna +Mckenzie +Megan +Meghan +Melanie +Melany +Melissa +Melody +Meredith +Merideth +Merrilyn +Meryl +Mia +Michaela +Michelle +Mikayla +Miley +Minnie +Miracle +Miranda +Miriam +Molly +Monica +Monna +Morgan +Muriel +Mya +Mylee +Myriam +Myrtie +Nadia +Nan +Nancy +Naomi +Natalia +Natalie +Nataly +Natasha +Nayeli +Nelle +Nena +Nerissa +Netta +Nettie +Nevaeh +Nia +Nicole +Nina +Noelle +Nonie +Nora +Norah +Nova +Nowell +Nydia +Nyla +Olive +Olivia +Oralie +Paige +Paisley +Paola +Paris +Patience +Patricia +Pauleen +Payton +Pene +Penelope +Peregrine +Perla +Peyton +Pheobe +Phoebe +Phyliss +Phyllida +Phyllis +Piper +Porsche +Presley +Priscilla +Prosper +Prue +Quanah +Quiana +Rachael +Rachel +Raegan +Raelene +Rain +Randa +Randal +Reagan +Rebecca +Rebeckah +Rebekah +Reene +Reese +Renie +Rexana +Rhetta +Rihanna +Riley +Ronnette +Rosa +Rose +Rosemary +Rowan +Ruby +Rubye +Ruth +Rylee +Ryleigh +Rylie +Sabella +Sabrina +Sachie +Sadie +Sage +Sally +Samantha +Samara +Sandra +Sara +Sarah +Sarai +Saranna +Sasha +Savanna +Savannah +Scarlett +Selena +Seneca +Serena +Serenity +Shana +Shanika +Shannah +Shannon +Shantae +Sharalyn +Sharla +Shayla +Shelby +Sheri +Sherie +Sherill +Sherri +Sienna +Sierra +Sissy +Skylar +Skyler +Sofia +Sophia +Sophie +Star +Stella +Steph +Stephanie +Stephany +Sue +Sukie +Summer +Sunshine +Susanna +Susannah +Suzan +Suzy +Sydney +Talia +Tamika +Tania +Tansy +Taryn +Tatiana +Tatum +Tatyanna +Taylor +Teagan +Tessa +Tiffany +Tolly +Topaz +Tori +Tracee +Tracey +Trinity +Ulyssa +Valary +Valentina +Valeria +Valerie +Vanessa +Verna +Veronica +Victoria +Vinnie +Violet +Vivian +Viviana +Vivyan +Wendi +Wendy +Willow +Wisdom +Wynonna +Wynter +Ximena +Yasmin +Yolanda +Ysabel +Zelda +Zoe +Zoey Zune \ No newline at end of file diff --git a/strings/names/first_male.txt b/strings/names/first_male.txt index 5dd9cb5711101..ba65bce0526a4 100644 --- a/strings/names/first_male.txt +++ b/strings/names/first_male.txt @@ -1,667 +1,667 @@ -Aaden -Aaron -Abel -Abraham -Adam -Adan -Aden -Adolph -Adrian -Aidan -Aiden -Alan -Albert -Alberto -Alden -Alec -Alejandro -Alex -Alexander -Alexis -Alfred -Alfredo -Alger -Ali -Alijah -Allen -Alvin -Amari -Amir -Amos -Anderson -Andre -Andres -Andrew -Andy -Angel -Angelo -Anthony -Antonio -Apple -Archie -Armando -Arnie -Art -Arthur -Arturo -Asher -Ashton -August -Austin -Avery -Axel -Ayden -Baldric -Bartholomew -Beau -Beckett -Benjamin -Bennett -Bill -Blake -Braden -Bradley -Brady -Braeden -Braiden -Brandon -Braxton -Brayan -Brayden -Braydon -Braylon -Brendan -Brenden -Brennan -Brett -Brian -Brick -Brock -Brodie -Brody -Bronte -Bruce -Bryan -Bryant -Bryce -Brycen -Bryson -Buck -Burt -Butch -Byrne -Byron -Cade -Caden -Caiden -Caleb -Calvin -Camden -Cameron -Camron -Camryn -Carl -Carlos -Carson -Carter -Casey -Cash -Casimir -Cassian -Cayden -Cesar -Chad -Chance -Chandler -Charles -Charlie -Charlton -Chase -Chip -Chris -Christian -Christopher -Clark -Claudius -Clayton -Clement -Cletus -Cleveland -Cliff -Clinton -Cody -Cohen -Colby -Cole -Colin -Collin -Colten -Colton -Conner -Connor -Cooper -Corbin -Corey -Cory -Cristian -Cristopher -Crush -Cruz -Curtis -Cy -Dakota -Dallas -Dalton -Damian -Damien -Damon -Dane -Daniel -Danny -Dante -Darcey -Darell -Darin -Darius -Darren -David -Davion -Davis -Dawson -Dayton -Dean -Deandre -Deangelo -Declan -Denholm -Dennis -Derek -Derrick -Desmond -Devin -Devon -Diego -Dillon -Dirk -Dominic -Dominick -Donald -Donny -Donovan -Douglas -Drake -Drew -Driscoll -Duke -Duncan -Dustin -Dylan -Easton -Eddie -Edgar -Eduardo -Edward -Edwin -Eli -Elias -Elijah -Eliot -Eliott -Elliot -Elliott -Elric -Elwood -Emanuel -Emerson -Emiliano -Emilio -Emmanuel -Enrique -Eric -Erick -Erik -Ernesto -Esteban -Ethan -Evan -Everett -Ezekiel -Ezra -Fabian -Felix -Fenton -Fernando -Finn -Fitz -Flick -Flint -Flip -Francis -Francisco -Frank -Frankie -Franklin -Fridge -Fulton -Gabriel -Gael -Gage -Gannon -Garret -Garrett -Gary -Gavin -George -Gerardo -Giovanni -Goddard -Godwin -Goodwin -Gordon -Grady -Graeme -Graham -Grant -Gratian -Grayson -Gregory -Grendel -Greyson -Griffin -Guillermo -Gunner -Gustavo -Han -Harrison -Harry -Hartley -Harvey -Hayden -Hector -Henderson -Henry -Holden -Homer -Horatio -Hudson -Huffie -Hugo -Hungry -Hunter -Ian -Irvine -Isaac -Isaiah -Isaias -Isiah -Ismael -Israel -Issac -Ivan -Izaiah -Jace -Jack -Jackson -Jacob -Jacoby -Jaden -Jadon -Jaiden -Jaime -Jake -Jakob -Jalen -Jamar -Jamari -Jamarion -James -Jameson -Jamie -Jamison -Janel -Jared -Jason -Jasper -Javier -Javon -Jaxon -Jaxson -Jay -Jayce -Jayden -Jaydon -Jaye -Jaylen -Jayne -Jayson -Jean-Luc -Jeb -Jed -Jeffrey -Jemmy -Jeremiah -Jeremy -Jermaine -Jerrie -Jerry -Jesse -Jesus -Jim -Jimmy -Joachim -Joaquin -Joe -Joel -Joey -Johan -John -Johnathan -Johnny -Jonah -Jonas -Jonathan -Jonathon -Jordan -Jorge -Jose -Joseph -Josh -Joshua -Josiah -Josue -Juan -Judah -Jude -Julian -Julio -Julius -Justice -Justin -Kade -Kaden -Kai -Kaiden -Kale -Kaleb -Kameron -Kane -Karson -Kayden -Keagan -Keaton -Keegan -Keith -Kellen -Kelvin -Kennard -Kenneth -Kevin -Keziah -Khalil -Kingston -Kobe -Kolton -Kristopher -Kyle -Kyler -Lance -Landen -Lando -Landon -Landyn -Lane -Lanny -Larry -Launce -Lawrence -Leland -Lennox -Lenny -Leo -Leonard -Leonardo -Leonel -Leroy -Levi -Liam -Lief -Lincoln -Linden -Linton -Logan -Lorde -Lorenzo -Loreto -Lou -Louis -Luca -Lucas -Luis -Lukas -Luke -Maddox -Malachi -Malcolm -Malik -Manley -Manuel -Marc -Marco -Marcos -Marcus -Mario -Marion -Mark -Marshall -Martin -Marvin -Mason -Mateo -Mathew -Matthew -Maurice -Mauricio -Max -Maximilian -Maximus -Maxwell -Maynard -Mekhi -Melvin -Melvyn -Micah -Michael -Micheal -Miguel -Mike -Miles -Milo -Milton -Mitchell -Moises -Montague -Monte -Monty -Morgan -Moses -Myles -Nasir -Nat -Nathan -Nathaniel -Nehemiah -Nelson -Nicholas -Nick -Nickolas -Nicolas -Nikolas -Noah -Noel -Nolan -Oliver -Omar -Opie -Orlando -Osbert -Osborn -Osborne -Oscar -Osmund -Oswald -Owen -Pablo -Paget -Parker -Patrick -Patton -Paul -Paxton -Payton -Pedro -Percival -Persh -Peter -Peyton -Philip -Phillip -Phoenix -Porter -Preston -Quentin -Quinn -Quinton -Rafael -Ramon -Randy -Rastus -Raul -Raymond -Rayner -Reece -Reed -Reese -Reid -Reuben -Reynard -Ricardo -Richard -Ricky -Riley -River -Robert -Roberto -Rocco -Rodger -Rodrigo -Roger -Roman -Romayne -Romeo -Ronald -Roscoe -Roswell -Rowan -Roy -Royce -Rube -Ruben -Russell -Rusty -Ryan -Ryder -Ryker -Rylan -Sal -Salvador -Sam -Samuel -Santiago -Saul -Sawyer -Scott -Scotty -Sean -Sebastian -Sergio -Seth -Seymour -Shane -Shaun -Shawn -Shiloh -Silas -Simon -Skyler -Sloan -Smoke -Solomon -Sorrel -Spencer -Spike -Stephen -Steven -Sybil -Syd -Talon -Tamsin -Tanner -Tate -Taylor -Tel -Terrell -Terry -Theodore -Thomas -Tim -Timothy -Titus -Todd -Tony -Travis -Trent -Trenton -Trevor -Trey -Trip -Tristan -Tristen -Triston -Troy -Tucker -Ty -Tye -Tyler -Tyson -Uland -Ulric -Uriel -Vaughn -Victor -Vince -Vincent -Vinny -Walker -Walter -Ward -Warner -Wayne -Wesley -Weston -Whitaker -William -Willy -Woodrow -Wyatt -Xander -Xavier -Yahir -Zachariah -Zachary -Zack -Zackary -Zander -Zane -Zayden -Zeke +Aaden +Aaron +Abel +Abraham +Adam +Adan +Aden +Adolph +Adrian +Aidan +Aiden +Alan +Albert +Alberto +Alden +Alec +Alejandro +Alex +Alexander +Alexis +Alfred +Alfredo +Alger +Ali +Alijah +Allen +Alvin +Amari +Amir +Amos +Anderson +Andre +Andres +Andrew +Andy +Angel +Angelo +Anthony +Antonio +Apple +Archie +Armando +Arnie +Art +Arthur +Arturo +Asher +Ashton +August +Austin +Avery +Axel +Ayden +Baldric +Bartholomew +Beau +Beckett +Benjamin +Bennett +Bill +Blake +Braden +Bradley +Brady +Braeden +Braiden +Brandon +Braxton +Brayan +Brayden +Braydon +Braylon +Brendan +Brenden +Brennan +Brett +Brian +Brick +Brock +Brodie +Brody +Bronte +Bruce +Bryan +Bryant +Bryce +Brycen +Bryson +Buck +Burt +Butch +Byrne +Byron +Cade +Caden +Caiden +Caleb +Calvin +Camden +Cameron +Camron +Camryn +Carl +Carlos +Carson +Carter +Casey +Cash +Casimir +Cassian +Cayden +Cesar +Chad +Chance +Chandler +Charles +Charlie +Charlton +Chase +Chip +Chris +Christian +Christopher +Clark +Claudius +Clayton +Clement +Cletus +Cleveland +Cliff +Clinton +Cody +Cohen +Colby +Cole +Colin +Collin +Colten +Colton +Conner +Connor +Cooper +Corbin +Corey +Cory +Cristian +Cristopher +Crush +Cruz +Curtis +Cy +Dakota +Dallas +Dalton +Damian +Damien +Damon +Dane +Daniel +Danny +Dante +Darcey +Darell +Darin +Darius +Darren +David +Davion +Davis +Dawson +Dayton +Dean +Deandre +Deangelo +Declan +Denholm +Dennis +Derek +Derrick +Desmond +Devin +Devon +Diego +Dillon +Dirk +Dominic +Dominick +Donald +Donny +Donovan +Douglas +Drake +Drew +Driscoll +Duke +Duncan +Dustin +Dylan +Easton +Eddie +Edgar +Eduardo +Edward +Edwin +Eli +Elias +Elijah +Eliot +Eliott +Elliot +Elliott +Elric +Elwood +Emanuel +Emerson +Emiliano +Emilio +Emmanuel +Enrique +Eric +Erick +Erik +Ernesto +Esteban +Ethan +Evan +Everett +Ezekiel +Ezra +Fabian +Felix +Fenton +Fernando +Finn +Fitz +Flick +Flint +Flip +Francis +Francisco +Frank +Frankie +Franklin +Fridge +Fulton +Gabriel +Gael +Gage +Gannon +Garret +Garrett +Gary +Gavin +George +Gerardo +Giovanni +Goddard +Godwin +Goodwin +Gordon +Grady +Graeme +Graham +Grant +Gratian +Grayson +Gregory +Grendel +Greyson +Griffin +Guillermo +Gunner +Gustavo +Han +Harrison +Harry +Hartley +Harvey +Hayden +Hector +Henderson +Henry +Holden +Homer +Horatio +Hudson +Huffie +Hugo +Hungry +Hunter +Ian +Irvine +Isaac +Isaiah +Isaias +Isiah +Ismael +Israel +Issac +Ivan +Izaiah +Jace +Jack +Jackson +Jacob +Jacoby +Jaden +Jadon +Jaiden +Jaime +Jake +Jakob +Jalen +Jamar +Jamari +Jamarion +James +Jameson +Jamie +Jamison +Janel +Jared +Jason +Jasper +Javier +Javon +Jaxon +Jaxson +Jay +Jayce +Jayden +Jaydon +Jaye +Jaylen +Jayne +Jayson +Jean-Luc +Jeb +Jed +Jeffrey +Jemmy +Jeremiah +Jeremy +Jermaine +Jerrie +Jerry +Jesse +Jesus +Jim +Jimmy +Joachim +Joaquin +Joe +Joel +Joey +Johan +John +Johnathan +Johnny +Jonah +Jonas +Jonathan +Jonathon +Jordan +Jorge +Jose +Joseph +Josh +Joshua +Josiah +Josue +Juan +Judah +Jude +Julian +Julio +Julius +Justice +Justin +Kade +Kaden +Kai +Kaiden +Kale +Kaleb +Kameron +Kane +Karson +Kayden +Keagan +Keaton +Keegan +Keith +Kellen +Kelvin +Kennard +Kenneth +Kevin +Keziah +Khalil +Kingston +Kobe +Kolton +Kristopher +Kyle +Kyler +Lance +Landen +Lando +Landon +Landyn +Lane +Lanny +Larry +Launce +Lawrence +Leland +Lennox +Lenny +Leo +Leonard +Leonardo +Leonel +Leroy +Levi +Liam +Lief +Lincoln +Linden +Linton +Logan +Lorde +Lorenzo +Loreto +Lou +Louis +Luca +Lucas +Luis +Lukas +Luke +Maddox +Malachi +Malcolm +Malik +Manley +Manuel +Marc +Marco +Marcos +Marcus +Mario +Marion +Mark +Marshall +Martin +Marvin +Mason +Mateo +Mathew +Matthew +Maurice +Mauricio +Max +Maximilian +Maximus +Maxwell +Maynard +Mekhi +Melvin +Melvyn +Micah +Michael +Micheal +Miguel +Mike +Miles +Milo +Milton +Mitchell +Moises +Montague +Monte +Monty +Morgan +Moses +Myles +Nasir +Nat +Nathan +Nathaniel +Nehemiah +Nelson +Nicholas +Nick +Nickolas +Nicolas +Nikolas +Noah +Noel +Nolan +Oliver +Omar +Opie +Orlando +Osbert +Osborn +Osborne +Oscar +Osmund +Oswald +Owen +Pablo +Paget +Parker +Patrick +Patton +Paul +Paxton +Payton +Pedro +Percival +Persh +Peter +Peyton +Philip +Phillip +Phoenix +Porter +Preston +Quentin +Quinn +Quinton +Rafael +Ramon +Randy +Rastus +Raul +Raymond +Rayner +Reece +Reed +Reese +Reid +Reuben +Reynard +Ricardo +Richard +Ricky +Riley +River +Robert +Roberto +Rocco +Rodger +Rodrigo +Roger +Roman +Romayne +Romeo +Ronald +Roscoe +Roswell +Rowan +Roy +Royce +Rube +Ruben +Russell +Rusty +Ryan +Ryder +Ryker +Rylan +Sal +Salvador +Sam +Samuel +Santiago +Saul +Sawyer +Scott +Scotty +Sean +Sebastian +Sergio +Seth +Seymour +Shane +Shaun +Shawn +Shiloh +Silas +Simon +Skyler +Sloan +Smoke +Solomon +Sorrel +Spencer +Spike +Stephen +Steven +Sybil +Syd +Talon +Tamsin +Tanner +Tate +Taylor +Tel +Terrell +Terry +Theodore +Thomas +Tim +Timothy +Titus +Todd +Tony +Travis +Trent +Trenton +Trevor +Trey +Trip +Tristan +Tristen +Triston +Troy +Tucker +Ty +Tye +Tyler +Tyson +Uland +Ulric +Uriel +Vaughn +Victor +Vince +Vincent +Vinny +Walker +Walter +Ward +Warner +Wayne +Wesley +Weston +Whitaker +William +Willy +Woodrow +Wyatt +Xander +Xavier +Yahir +Zachariah +Zachary +Zack +Zackary +Zander +Zane +Zayden +Zeke Zion \ No newline at end of file diff --git a/strings/names/golem.txt b/strings/names/golem.txt index a26da78b045b8..7cfcefa899dab 100644 --- a/strings/names/golem.txt +++ b/strings/names/golem.txt @@ -1,157 +1,157 @@ -Ablation -Alabaster -Alunite -Andesite -Anyhdrite -Basalt -Basin -Bauxite -Bedrock -Bismuth -Bismuthinite -Bituminous Coal -Borax -Boulder -Brimstone -Brittle -Calcite -Cassiterite -Cenozoic -Chalk -Chasm -Cheridite -Chert -Chromite -Cinnabar -Claystone -Coast -Cobaltite -Column -Conglomerate -Core -Crevasse -Crust -Cryolite -Crystal -Dacite -Diorite -Dolomite -Dolostone -Dragonforce -Earthflow -Epoch -Eutrophication -Fault -Flint -Foliation -Foreshock -Fossil -Gabbro -Galena -Garnierite -Geode -Geoge -Gneiss -Granite -Graphite -Gravel -Groove -Grotto -Gypsum -Hematite -Hornblende -Humus -Igneous -Ilmenite -Iron -Island -Jasper -Jet -Kaolinite -Kettle -Kimberlite -Komatiite -Landslide -Levee -Lignite -Limestone -Limonite -Luster -Madidite -Magnetite -Magnitude -Malachite -Mantle -Marble -Marcasite -Melange -Meme -Mica -Microcline -Migmatite -Mineral -Mountain -Mudstone -Obsidian -Olivine -Ore -Orpiment -Orthoclase -Outwash -Oxbow Lake -Oynx -Pahoehoe -Pebble -Pegmatite -Periclase -Petrified Wood -Phyllite -Pitchblende -Plate -Pothole -Puddingstone -Pyrite -Pyrolusite -Quake -Quarry -Quartz -Quartzite -Realgar -Reservoir -Rhyolite -Rock -Rock Salt -Rockfall -Rutile -Saltpeter -Sand -Sandstone -Satinspar -Schist -Sediment -Seismic -Selenite -Serpentine -Shale -Shore -Siltstone -Slag -Slate -Sphalerite -Stack -Stalactite -Stalagmite -Stibnite -Stone -Stress -Subduction -Sylvite -Talc -Tetrahedrite -Tidal -Trench -Valley -Volcano -Xenolith -Yardang -Zone +Ablation +Alabaster +Alunite +Andesite +Anyhdrite +Basalt +Basin +Bauxite +Bedrock +Bismuth +Bismuthinite +Bituminous Coal +Borax +Boulder +Brimstone +Brittle +Calcite +Cassiterite +Cenozoic +Chalk +Chasm +Cheridite +Chert +Chromite +Cinnabar +Claystone +Coast +Cobaltite +Column +Conglomerate +Core +Crevasse +Crust +Cryolite +Crystal +Dacite +Diorite +Dolomite +Dolostone +Dragonforce +Earthflow +Epoch +Eutrophication +Fault +Flint +Foliation +Foreshock +Fossil +Gabbro +Galena +Garnierite +Geode +Geoge +Gneiss +Granite +Graphite +Gravel +Groove +Grotto +Gypsum +Hematite +Hornblende +Humus +Igneous +Ilmenite +Iron +Island +Jasper +Jet +Kaolinite +Kettle +Kimberlite +Komatiite +Landslide +Levee +Lignite +Limestone +Limonite +Luster +Madidite +Magnetite +Magnitude +Malachite +Mantle +Marble +Marcasite +Melange +Meme +Mica +Microcline +Migmatite +Mineral +Mountain +Mudstone +Obsidian +Olivine +Ore +Orpiment +Orthoclase +Outwash +Oxbow Lake +Oynx +Pahoehoe +Pebble +Pegmatite +Periclase +Petrified Wood +Phyllite +Pitchblende +Plate +Pothole +Puddingstone +Pyrite +Pyrolusite +Quake +Quarry +Quartz +Quartzite +Realgar +Reservoir +Rhyolite +Rock +Rock Salt +Rockfall +Rutile +Saltpeter +Sand +Sandstone +Satinspar +Schist +Sediment +Seismic +Selenite +Serpentine +Shale +Shore +Siltstone +Slag +Slate +Sphalerite +Stack +Stalactite +Stalagmite +Stibnite +Stone +Stress +Subduction +Sylvite +Talc +Tetrahedrite +Tidal +Trench +Valley +Volcano +Xenolith +Yardang +Zone diff --git a/strings/names/last.txt b/strings/names/last.txt index b9769055e3a15..e1b1f8f507d89 100644 --- a/strings/names/last.txt +++ b/strings/names/last.txt @@ -1,570 +1,569 @@ -Ackerley -Adams -Addison -Agg -Aggley -Ahmed -Albright -Alekseev -Ali -Alice -Allen -Alliman -Altmann -Anderson -Andreev -Ann -Archibald -Armstrong -Ashbaugh -Atkinson -Atweeke -Aultman -Auman -Baer -Bailey -Baker -Barnes -Barrett -Bash -Bashline -Basinger -Baskett -Basmanoff -Batten -Baum -Baxter -Beach -Beail -Beck -Beedell -Begum -Bell -Benford -Bennett -Berkheimer -Best -Bickerson -Bicknell -Biery -Black -Blackburn -Blaine -Blessig -Bloise -Bluetenberger -Blyant -Bode -Bould -Bousum -Bowchiew -Boyer -Brandenburg -Bratton -Braun -Briggs -Brindle -Briner -Brinigh -Brooks -Brown -Bullard -Bunten -Burkett -Burns -Burris -Butterfill -Buttersworth -Buzzard -Byers -Bynum -Caldwell -Callison -Camp -Campbell -Carmichael -Carr -Carter -Catherina -Catleay -Cavalet -Chapman -Chauvin -Cherry -Christman -Christopher -Clark -Clarke -Clewett -Coates -Coldsmith -Collins -Compton -Conrad -Cook -Cooper -Costello -Cowart -Cowper -Cox -Cressman -Curry -Cypret -David -Davies -Davis -Dawkins -Day -Dean -Demuth -Dennis -Dickinson -Digson -Dimeling -Donkin -Draudy -Driggers -Dryfus -Dugmore -Duncan -Durstine -Earl -Easter -Echard -Eckhardstein -Edwards -Eggbert -Ehret -Elderson -Eliza -Elliott -Ellis -Enderly -Endsley -Evans -Ewing -Faqua -Faust -Fea -Feufer -Fiddler -Field -Fields -Finlay -Fischer -Fiscina -Fisher -Fitzgerald -Fleming -Flickinger -Focell -Foster -Franks -Fraser -Fryer -Fuchs -Fulton -Gadow -Gardner -Garland -Garneys -Garratt -Garrison -Gettemy -Gibson -Glover -Goebbles -Goodman -Graham -Gray -Green -Greenawalt -Greene -Greenwood -Gregory -Griffiths -Gronko -Guess -Hall -Hanford -Hardie -Harding -Hardy -Harris -Harrison -Harrold -Harrow -Harshman -Hastings -Hawker -Hawking -Hawkins -Hayhurst -Haynes -Heckendora -Hegarty -Henry -Hice -Highlands -Hill -Hincken -Hirleman -Hoenshell -Holdeman -Holmes -Hook -Hooker -Hoopengarner -Hoover -Houser -Houston -Howard -Howe -Huey -Hughes -Hujsak -Hunt -Hunter -Hussain -Hutton -Hynes -Ironmonger -Isaman -Isemann -Ivanov -Jackson -James -Jardine -Jenkins -Jenner -Jerome -Jesse -Jewell -Joghs -Johnson -Jones -Jowers -Joyce -Judge -Jyllian -Kadel -Kanaga -Kaur -Keener -Kelley -Kellogg -Kelly -Kemble -Kemerer -Keppel -Kepplinger -Khan -Kiefer -Kifer -Kimple -King -Kirkson -Knapenberger -Knapp -Koepple -Koster -Kuster -Kuznetsov -Laborde -Lacon -Lafortune -Langston -Larson -Lauffer -Laurenzi -Leach -Lee -Leech -Leichter -Leslie -Lester -Levett -Lewis -Lineman -Linton -Llora -Lloyd -Logue -Lombardi -Lord -Losey -Lowe -Lowstetter -Lucy -Ludwig -Maclagan -Magor -Marcotte -Margaret -Marriman -Marshall -Martins -Mary -Mason -Mathews -Matthews -Mcclymonds -Mccullough -Mccune -McDonald -McDonohugh -Mcfall -Mcintosh -Mckendrick -Mcloskey -Mcmullen -McShain -Mens -Merryman -Metzer -Meyers -Mikhaylov -Mildred -Miller -Millhouse -Mills -Milne -Mingle -Minnie -Mitchell -Moberly -Moon -Moore -Morgan -Morris -Mortland -Mosser -Mueller -Muggins -Mull -Muller -Murphy -Murray -Nash -Neely -Nehling -Newbern -Newton -Nicholas -Nickolson -Northey -Noton -Olphert -Oneal -Oppenheimer -Osteen -Osterweis -Osterwise -Otis -Overstreet -Owen -Owens -Palmer -Parker -Parkinson -Patel -Patterson -Paulson -Pavlov -Paynter -Pearsall -Pennington -Perkins -Pershing -Peters -Petrov -Pfeifer -Philips -Phillips -Picard -Pinney -Poehl -Poley -Polson -Potter -Powell -Power -Powers -Pratt -Prechtl -Prescott -Prevatt -Price -Priebe -Pritchard -Pycroft -Quinn -Quirin -Rader -Rahl -Ramos -Randolph -Ratcliff -Rathen -Rathens -Raub -Ray -Reade -Reichard -Reid -Reighner -Rhinehart -Richards -Richardson -Richter -Rifler -Riggle -Riker -Ringer -Roadman -Roberts -Robertson -Robinson -Roby -Rockwell -Rogers -Rohtin -Rose -Rosensteel -Rowley -Russell -Ryals -Sagan -Sanders -Sandford -Sandys -Sauter -Saylor -Schaeffer -Scherer -Schmidt -Schofield -Schrader -Scott -Sealis -Seelig -Seidner -Semenov -Shafer -Shaffer -Shaner -Shaw -Sheets -Shick -Shirey -Sholl -Shupe -Sidower -Siegrist -Simmons -Simpson -Singh -Skywalker -Sloan -Smail -Smirnov -Smith -Snyder -Sommer -Spock -Stafford -Stahl -Stainforth -Stall -Stamos -Stange -Staymates -Steele -Stephenson -Stern -Stewart -Stocker -Stone -Stough -Straub -Stroble -Stroh -Styles -Sullivan -Sulyard -Summy -Sutton -Swabey -Swarner -Sybilla -Taggart -Tanner -Taylor -Teagarden -Tedrow -Tennant -Thomas -Thomlinson -Thompson -Thomson -Thorley -Tilton -Tireman -Todd -Treeby -Trovato -Turner -Ulery -Ullman -Unk -Vader -Vanleer -Vasilyev -Waldron -Walker -Wallick -Ward -Wardle -Warren -Watson -Webb -Weeter -Weinstein -Weisgarber -Wells -Welty -Wentzel -Werner -Werry -Wheeler -Whirlow -White -Whiteman -Whittier -Wible -Wile -Wilkerson -Wilkinson -Willey -Williams -Williamson -Wilo -Wilson -Winton -Wise -Wolfe -Wolff -Wood -Woodward -Woodworth -Woolery -Woollard -Wright -Yeskey -Young -Zadovsky -Zalack -Zaun -Zeal -Zimmer -Zoucks \ No newline at end of file +Ackerley +Adams +Addison +Agg +Aggley +Ahmed +Albright +Alekseev +Ali +Alice +Allen +Alliman +Altmann +Anderson +Andreev +Ann +Archibald +Armstrong +Ashbaugh +Atkinson +Atweeke +Aultman +Auman +Baer +Bailey +Baker +Barnes +Barrett +Bash +Bashline +Basinger +Baskett +Basmanoff +Batten +Baum +Baxter +Beach +Beail +Beck +Beedell +Begum +Bell +Benford +Bennett +Berkheimer +Best +Bickerson +Bicknell +Biery +Black +Blackburn +Blaine +Blessig +Bloise +Bluetenberger +Blyant +Bode +Bould +Bousum +Bowchiew +Boyer +Brandenburg +Bratton +Braun +Briggs +Brindle +Briner +Brinigh +Brooks +Brown +Bullard +Bunten +Burkett +Burns +Burris +Butterfill +Buttersworth +Buzzard +Byers +Bynum +Caldwell +Callison +Camp +Campbell +Carmichael +Carr +Carter +Catherina +Catleay +Cavalet +Chapman +Chauvin +Cherry +Christman +Christopher +Clark +Clarke +Clewett +Coates +Coldsmith +Collins +Compton +Conrad +Cook +Cooper +Costello +Cowart +Cowper +Cox +Cressman +Curry +Cypret +David +Davies +Davis +Dawkins +Day +Dean +Demuth +Dennis +Dickinson +Digson +Dimeling +Donkin +Draudy +Driggers +Dryfus +Dugmore +Duncan +Durstine +Earl +Easter +Echard +Eckhardstein +Edwards +Eggbert +Ehret +Elderson +Eliza +Elliott +Ellis +Enderly +Endsley +Evans +Ewing +Faqua +Faust +Fea +Feufer +Fiddler +Field +Fields +Finlay +Fischer +Fiscina +Fisher +Fitzgerald +Fleming +Flickinger +Focell +Foster +Franks +Fraser +Fryer +Fuchs +Fulton +Gadow +Gardner +Garland +Garneys +Garratt +Garrison +Gettemy +Gibson +Glover +Goebbles +Goodman +Graham +Gray +Green +Greenawalt +Greene +Greenwood +Gregory +Griffiths +Gronko +Guess +Hall +Hanford +Hardie +Harding +Hardy +Harris +Harrison +Harrold +Harrow +Harshman +Hastings +Hawker +Hawking +Hawkins +Hayhurst +Haynes +Heckendora +Hegarty +Henry +Hice +Highlands +Hill +Hincken +Hirleman +Hoenshell +Holdeman +Holmes +Hook +Hooker +Hoopengarner +Hoover +Houser +Houston +Howard +Howe +Huey +Hughes +Hujsak +Hunt +Hunter +Hussain +Hutton +Hynes +Ironmonger +Isaman +Isemann +Ivanov +Jackson +James +Jardine +Jenkins +Jenner +Jerome +Jesse +Jewell +Joghs +Johnson +Jones +Jowers +Joyce +Judge +Jyllian +Kadel +Kanaga +Kaur +Keener +Kelley +Kellogg +Kelly +Kemble +Kemerer +Keppel +Kepplinger +Khan +Kiefer +Kifer +Kimple +King +Kirkson +Knapenberger +Knapp +Koepple +Koster +Kuster +Kuznetsov +Laborde +Lacon +Lafortune +Langston +Larson +Lauffer +Laurenzi +Leach +Lee +Leech +Leichter +Leslie +Lester +Levett +Lewis +Lineman +Linton +Llora +Lloyd +Logue +Lombardi +Lord +Losey +Lowe +Lowstetter +Lucy +Ludwig +Maclagan +Magor +Marcotte +Margaret +Marriman +Marshall +Martins +Mary +Mason +Mathews +Matthews +Mcclymonds +Mccullough +Mccune +McDonald +McDonohugh +Mcfall +Mcintosh +Mckendrick +Mcloskey +Mcmullen +McShain +Mens +Merryman +Metzer +Meyers +Mikhaylov +Mildred +Miller +Millhouse +Mills +Milne +Mingle +Minnie +Mitchell +Moberly +Moon +Moore +Morgan +Morris +Mortland +Mosser +Mueller +Muggins +Mull +Muller +Murphy +Murray +Nash +Neely +Nehling +Newbern +Newton +Nicholas +Nickolson +Northey +Noton +Olphert +Oneal +Oppenheimer +Osteen +Osterweis +Osterwise +Otis +Overstreet +Owen +Owens +Palmer +Parker +Parkinson +Patel +Patterson +Paulson +Pavlov +Paynter +Pearsall +Pennington +Perkins +Pershing +Peters +Petrov +Pfeifer +Philips +Phillips +Picard +Pinney +Poehl +Poley +Polson +Potter +Powell +Power +Powers +Pratt +Prechtl +Prescott +Prevatt +Price +Priebe +Pritchard +Pycroft +Quinn +Quirin +Rader +Rahl +Ramos +Randolph +Ratcliff +Rathen +Rathens +Raub +Ray +Reade +Reichard +Reid +Reighner +Rhinehart +Richards +Richardson +Richter +Rifler +Riggle +Riker +Ringer +Roadman +Roberts +Robertson +Robinson +Roby +Rockwell +Rogers +Rohtin +Rose +Rosensteel +Rowley +Russell +Ryals +Sagan +Sanders +Sandford +Sandys +Sauter +Saylor +Schaeffer +Scherer +Schmidt +Schofield +Schrader +Scott +Sealis +Seelig +Seidner +Semenov +Shafer +Shaffer +Shaner +Shaw +Sheets +Shick +Shirey +Sholl +Shupe +Sidower +Siegrist +Simmons +Simpson +Singh +Sloan +Smail +Smirnov +Smith +Snyder +Sommer +Spock +Stafford +Stahl +Stainforth +Stall +Stamos +Stange +Staymates +Steele +Stephenson +Stern +Stewart +Stocker +Stone +Stough +Straub +Stroble +Stroh +Styles +Sullivan +Sulyard +Summy +Sutton +Swabey +Swarner +Sybilla +Taggart +Tanner +Taylor +Teagarden +Tedrow +Tennant +Thomas +Thomlinson +Thompson +Thomson +Thorley +Tilton +Tireman +Todd +Treeby +Trovato +Turner +Ulery +Ullman +Unk +Vader +Vanleer +Vasilyev +Waldron +Walker +Wallick +Ward +Wardle +Warren +Watson +Webb +Weeter +Weinstein +Weisgarber +Wells +Welty +Wentzel +Werner +Werry +Wheeler +Whirlow +White +Whiteman +Whittier +Wible +Wile +Wilkerson +Wilkinson +Willey +Williams +Williamson +Wilo +Wilson +Winton +Wise +Wolfe +Wolff +Wood +Woodward +Woodworth +Woolery +Woollard +Wright +Yeskey +Young +Zadovsky +Zalack +Zaun +Zeal +Zimmer +Zoucks diff --git a/strings/names/lizard_female.txt b/strings/names/lizard_female.txt index cf588df9b1906..078ee7bcff480 100644 --- a/strings/names/lizard_female.txt +++ b/strings/names/lizard_female.txt @@ -1,163 +1,163 @@ -Adzi -Ah -Ahaht -Ajim -Akeenus -Akish -Akishan -Aleeto -Am -Amussa -An -Anozz -Asheemar -Asska -Awas -Azala -Azbai -Azeez -Azum -Banalz -Bar -Baseenar -Beek -Beekatan -Beekus -Beela -Beelei -Beem -Beewos -Bejeen -Ber -Betzi -Bishalus -Bokeeus -Bur -Bura -Chalaree -Chana -Chanil -Chee -Cheesh -Chimatei -Chirurgeon -Cholasistu -Chuna -Churasu -Crath -Dar -Deeja -Deesei -Deesh -Deetsan -Deetwos -Dooka -Druja -Eepa -Ei -Eix -El -Ereel -Eutei -Gai -Gih -Gilm -Gish -Go -Hal -Hul -Ja -Jaseen -Jasuda -Jeed -Jeen -Kajul -Kal -Kasa -Keel -Keerava -Kiurz -Kud -La -Lee -Lei -Lifts -Liurz -Lurasha -Ma -Mach -Marz -Meedish -Meeh -Meema -Meen -Meena -Meenus -Meerana -Meesei -Meeus -Mei -Milah -Mim -Mota -Mudeska -Muz -Na -Nakuma -Nam -Nassa -Natoo -Neesha -Neetizei -Neetra -Neeus -Niima -Numeen -Nuralg -Nush -Ocheeva -Okur -Olank -On -Onasha -Osheeka -Pasha -Ra -Rana -Raniur -Ree -Reesa -Rei -Sa -Saak -Sanax -Seeba -Seed -Seen -Shah -Shahvee -Shaleez -Shatalg -Sheer -Shei -Sigerthe -Skaleel -Sudie -Tail -Tar -Tasha -Tei -Telixith -Tumma -Veek -Wan -Wazei -Weedum -Weewish -Witseidutsei -Wuja -Wujeeta -Wusha -Xil -Zish +Adzi +Ah +Ahaht +Ajim +Akeenus +Akish +Akishan +Aleeto +Am +Amussa +An +Anozz +Asheemar +Asska +Awas +Azala +Azbai +Azeez +Azum +Banalz +Bar +Baseenar +Beek +Beekatan +Beekus +Beela +Beelei +Beem +Beewos +Bejeen +Ber +Betzi +Bishalus +Bokeeus +Bur +Bura +Chalaree +Chana +Chanil +Chee +Cheesh +Chimatei +Chirurgeon +Cholasistu +Chuna +Churasu +Crath +Dar +Deeja +Deesei +Deesh +Deetsan +Deetwos +Dooka +Druja +Eepa +Ei +Eix +El +Ereel +Eutei +Gai +Gih +Gilm +Gish +Go +Hal +Hul +Ja +Jaseen +Jasuda +Jeed +Jeen +Kajul +Kal +Kasa +Keel +Keerava +Kiurz +Kud +La +Lee +Lei +Lifts +Liurz +Lurasha +Ma +Mach +Marz +Meedish +Meeh +Meema +Meen +Meena +Meenus +Meerana +Meesei +Meeus +Mei +Milah +Mim +Mota +Mudeska +Muz +Na +Nakuma +Nam +Nassa +Natoo +Neesha +Neetizei +Neetra +Neeus +Niima +Numeen +Nuralg +Nush +Ocheeva +Okur +Olank +On +Onasha +Osheeka +Pasha +Ra +Rana +Raniur +Ree +Reesa +Rei +Sa +Saak +Sanax +Seeba +Seed +Seen +Shah +Shahvee +Shaleez +Shatalg +Sheer +Shei +Sigerthe +Skaleel +Sudie +Tail +Tar +Tasha +Tei +Telixith +Tumma +Veek +Wan +Wazei +Weedum +Weewish +Witseidutsei +Wuja +Wujeeta +Wusha +Xil +Zish Zollassa \ No newline at end of file diff --git a/strings/names/lizard_male.txt b/strings/names/lizard_male.txt index 437d124b50e05..f14f1705ba438 100644 --- a/strings/names/lizard_male.txt +++ b/strings/names/lizard_male.txt @@ -1,328 +1,328 @@ -Abijoo -Ah -Ajum -Am -Amusei -An -Anoo -Aojee -Asum -Az -Azeel -Azinar -Azjai -Baar -Banka -Bar -Barnaxi -Batar -Batuus -Beem -Beshnus -Betu -Bex -Bijot -Bimee -Binyaar -Bosekus -Brand -Bun -Bunach -Bunish -Busheeus -Buujhan -Chakuk -Chalish -Chalureel -Chath -Chee -Cheedal -Chilwir -Chitakus -Chiwish -Chulz -Chuna -Da -Dakee -Dan -Dar -Darasken -DarJee -Debameel -Deed -Deegeeta -Deeh -Deekonus -Deekum -Deekus -Deerkaza -Deetum -Demeepa -Depasa -Derkeethus -Deroh -Dezanu -Dreet -Drumarz -Dum -Dunaxith -Effe -Ei -Eidu -Eius -Eiuus -Eix -Eleedal -Er -Esqoo -Etaku -Gah -Gajul -Gam -Geeh -Geel -Geem -Geh -Gei -Gih -Gin -Goh -Gulum -Haj -Han -Haran -Hareeya -Hathei -Heedul -Heem -Hei -Heir -Hixeeh -Huleeya -Huzei -Ilas -Im -Inee -Itan -J'Ram -Ja -Jah -Jaraleet -Jaree -Jas -Jasaiin -Jaseen -Jat -Jee -Jeela -Jeelius -Jeelus -Jeen -Jeer -Jeetum -Jei -Jilux -Jin -Jon -Jul -Julan -Junal -Jush -Juunei -Kai -Kajin -Kamax -Kas -Keema -Keer -Keerasa -Kepanuu -Kia -Kiameed -Kilaya -Kiurz -Kur -Kuz -La -Lah -Lai -Lan -Lara -Leem -Lei -Loh -Lotash -Luh -Lurz -Luteema -Maahi -Madesi -Maheelius -Mahei -Maht -Malz -Marz -Mathei -Maxath -Meej -Meejapa -Meensuda -Meer -Mema -Mere -Metaku -Miharil -Milos -Miun -Mobareed -Mohimeem -Mopakuz -Motuu -Mujeen -Muranatepa -Mush -Muz -Na -Napetui -Nazuux -Nebutil -Neeti -Neetinei -Neetrenaza -Neetzara -Neeus -Nema -Neposh -Netapatuu -Nexith -Nodeeus -Nomu -Nosaleeth -Nowajeem -Noyei -Nulaz -Nur -Obaxith -Okan -Okaw -Okeeh -Oleed -Oleen -Olik -Olink -Onuja -Onurai -Opatieel -Otumeel -Owai -Pachat -Pacheeva -Pad -Paduxi -Pajeen -Parash -Peeradeeh -Pejureel -Petaxai -Pideelus -Pimaxi -Pojeel -Ra -Radithax -Raj -Rareel -Rasha -Redieeus -Ree -Reeh -Reemukeeus -Reenum -Reesa -Reet -Reezal -Resari -Riker -Ru -Rupah -Sakeepa -Sakeeus -Sakka -Saliith -Sar -Schiavas -Seek -Seewul -Sei -Sejaijilax -Shakiis -Shehs -Shei -Silm -Skee -Skeetul -Sureeus -Ta -Taeed -Tah -Taleel -Talen -Tan -Tanaka -Tanan -Tee -Teeba -Teegla -Teeka -Teekeeus -Teemeeta -Teeus -Tehat -Tei -Teinaava -Teineeja -Terezeeus -Tikaasi -Tim -Topeeth -Topith -Tsleeixth -Tul -Tulm -Tun -Ukatsei -Ukawei -Ula -Ulawa -Ullis -Usha -Usheeja -Utadeek -Utamukeeus -Utatul -Uxith -Vara -Veekas -Veenaza -Veezara -Vistha -Vudeelal -Wanan -Wanum -Wayiteh -Weebam -Weeltul -Weer -Wih -Wud -Wuleen -Wulm -Wumeek -Xal -Xemo -Yinz -Yinz'r -Zaw -Ze -Zeen -Zeeus +Abijoo +Ah +Ajum +Am +Amusei +An +Anoo +Aojee +Asum +Az +Azeel +Azinar +Azjai +Baar +Banka +Bar +Barnaxi +Batar +Batuus +Beem +Beshnus +Betu +Bex +Bijot +Bimee +Binyaar +Bosekus +Brand +Bun +Bunach +Bunish +Busheeus +Buujhan +Chakuk +Chalish +Chalureel +Chath +Chee +Cheedal +Chilwir +Chitakus +Chiwish +Chulz +Chuna +Da +Dakee +Dan +Dar +Darasken +DarJee +Debameel +Deed +Deegeeta +Deeh +Deekonus +Deekum +Deekus +Deerkaza +Deetum +Demeepa +Depasa +Derkeethus +Deroh +Dezanu +Dreet +Drumarz +Dum +Dunaxith +Effe +Ei +Eidu +Eius +Eiuus +Eix +Eleedal +Er +Esqoo +Etaku +Gah +Gajul +Gam +Geeh +Geel +Geem +Geh +Gei +Gih +Gin +Goh +Gulum +Haj +Han +Haran +Hareeya +Hathei +Heedul +Heem +Hei +Heir +Hixeeh +Huleeya +Huzei +Ilas +Im +Inee +Itan +J'Ram +Ja +Jah +Jaraleet +Jaree +Jas +Jasaiin +Jaseen +Jat +Jee +Jeela +Jeelius +Jeelus +Jeen +Jeer +Jeetum +Jei +Jilux +Jin +Jon +Jul +Julan +Junal +Jush +Juunei +Kai +Kajin +Kamax +Kas +Keema +Keer +Keerasa +Kepanuu +Kia +Kiameed +Kilaya +Kiurz +Kur +Kuz +La +Lah +Lai +Lan +Lara +Leem +Lei +Loh +Lotash +Luh +Lurz +Luteema +Maahi +Madesi +Maheelius +Mahei +Maht +Malz +Marz +Mathei +Maxath +Meej +Meejapa +Meensuda +Meer +Mema +Mere +Metaku +Miharil +Milos +Miun +Mobareed +Mohimeem +Mopakuz +Motuu +Mujeen +Muranatepa +Mush +Muz +Na +Napetui +Nazuux +Nebutil +Neeti +Neetinei +Neetrenaza +Neetzara +Neeus +Nema +Neposh +Netapatuu +Nexith +Nodeeus +Nomu +Nosaleeth +Nowajeem +Noyei +Nulaz +Nur +Obaxith +Okan +Okaw +Okeeh +Oleed +Oleen +Olik +Olink +Onuja +Onurai +Opatieel +Otumeel +Owai +Pachat +Pacheeva +Pad +Paduxi +Pajeen +Parash +Peeradeeh +Pejureel +Petaxai +Pideelus +Pimaxi +Pojeel +Ra +Radithax +Raj +Rareel +Rasha +Redieeus +Ree +Reeh +Reemukeeus +Reenum +Reesa +Reet +Reezal +Resari +Riker +Ru +Rupah +Sakeepa +Sakeeus +Sakka +Saliith +Sar +Schiavas +Seek +Seewul +Sei +Sejaijilax +Shakiis +Shehs +Shei +Silm +Skee +Skeetul +Sureeus +Ta +Taeed +Tah +Taleel +Talen +Tan +Tanaka +Tanan +Tee +Teeba +Teegla +Teeka +Teekeeus +Teemeeta +Teeus +Tehat +Tei +Teinaava +Teineeja +Terezeeus +Tikaasi +Tim +Topeeth +Topith +Tsleeixth +Tul +Tulm +Tun +Ukatsei +Ukawei +Ula +Ulawa +Ullis +Usha +Usheeja +Utadeek +Utamukeeus +Utatul +Uxith +Vara +Veekas +Veenaza +Veezara +Vistha +Vudeelal +Wanan +Wanum +Wayiteh +Weebam +Weeltul +Weer +Wih +Wud +Wuleen +Wulm +Wumeek +Xal +Xemo +Yinz +Yinz'r +Zaw +Ze +Zeen +Zeeus Zish \ No newline at end of file diff --git a/strings/names/mime.txt b/strings/names/mime.txt index cc65af67fd892..520d3affce98e 100644 --- a/strings/names/mime.txt +++ b/strings/names/mime.txt @@ -1,24 +1,24 @@ -Invisible Man -Lemon Mime -Marcel -Marcel Mime -Mime -Mr Beret -Mr Mime -Mr Mute -Mute -Omerta -Oui Oui -Pantomime -Quiet -Quiet Riot -Silence -Silencio -Silent Knight -Silent Majority -Silent Night -Silent Sorrow -Transparency -Unspeakable -Untouchable +Invisible Man +Lemon Mime +Marcel +Marcel Mime +Mime +Mr Beret +Mr Mime +Mr Mute +Mute +Omerta +Oui Oui +Pantomime +Quiet +Quiet Riot +Silence +Silencio +Silent Knight +Silent Majority +Silent Night +Silent Sorrow +Transparency +Unspeakable +Untouchable Wall Runner \ No newline at end of file diff --git a/strings/names/moth_last.txt b/strings/names/moth_last.txt index 46254e1ab601d..4d6ec130c41e2 100644 --- a/strings/names/moth_last.txt +++ b/strings/names/moth_last.txt @@ -41,7 +41,7 @@ Nepalina Obscura Osseogrisea Pastellina -Phlebitis +Phlebitis Pyrausta Radiata Riparia diff --git a/strings/names/ninjaname.txt b/strings/names/ninjaname.txt index fa0d0f1094179..eb470493fa4ab 100644 --- a/strings/names/ninjaname.txt +++ b/strings/names/ninjaname.txt @@ -1,44 +1,44 @@ -Aria -Baki -Blood -Bro -Cyrax -Daemon -Death -Donatello -Eater -Ermac -Fox -Goemon -Hanzo -Hayabusa -Hazuki -Hero -Hien -Hiro -Hiryu -Iga -Koga -Leonardo -McAwesome -McNinja -Michaelangelo -Midnight -Null -Ogre -Phantom -Raiden -Rain -Raphael -Ryu -Saibot -Samurai -Sarutobi -Scorpion -Seven -Shadow -Shredder -Smoke -Splinter -Throat +Aria +Baki +Blood +Bro +Cyrax +Daemon +Death +Donatello +Eater +Ermac +Fox +Goemon +Hanzo +Hayabusa +Hazuki +Hero +Hien +Hiro +Hiryu +Iga +Koga +Leonardo +McAwesome +McNinja +Michaelangelo +Midnight +Null +Ogre +Phantom +Raiden +Rain +Raphael +Ryu +Saibot +Samurai +Sarutobi +Scorpion +Seven +Shadow +Shredder +Smoke +Splinter +Throat Zero \ No newline at end of file diff --git a/strings/names/ninjatitle.txt b/strings/names/ninjatitle.txt index 41c5b338ba66e..f9776f56fed71 100644 --- a/strings/names/ninjatitle.txt +++ b/strings/names/ninjatitle.txt @@ -1,46 +1,46 @@ -Agile -Assassin -Awesome -Black -Crimson -Cruel -Deep -Dr -Dragon -Ender -Grandmaster -Grappler -Gray -Hunter -Initiate -Killer -Liquid -Master -Merciful -Merciless -Nickel -Night -Nightshade -Ninja -Noob -Orphaner -Quick -Remorseless -Rogue -Sensei -Shinobi -Silencing -Silent -Silver -Singing -Slayer -Snake -Solid -Solidus -Stalker -Steel -Strider -Striker -Swift -Ulimate +Agile +Assassin +Awesome +Black +Crimson +Cruel +Deep +Dr +Dragon +Ender +Grandmaster +Grappler +Gray +Hunter +Initiate +Killer +Liquid +Master +Merciful +Merciless +Nickel +Night +Nightshade +Ninja +Noob +Orphaner +Quick +Remorseless +Rogue +Sensei +Shinobi +Silencing +Silent +Silver +Singing +Slayer +Snake +Solid +Solidus +Stalker +Steel +Strider +Striker +Swift +Ulimate Widower \ No newline at end of file diff --git a/strings/names/ooze_first.txt b/strings/names/ooze_first.txt new file mode 100644 index 0000000000000..a885961e7f140 --- /dev/null +++ b/strings/names/ooze_first.txt @@ -0,0 +1,83 @@ +Alabaster +Amaranth +Amber +Aqua +Azure +Beige +Bistre +Black +Blue +Brown +Burgundy +Capri +Carmine +Carnelian +Celadon +Cerise +Cerulean +Cinereous +Cinnabar +Citron +Claret +Cobalt +Cordovan +Cream +Crimson +Cyan +Drab +Ebony +Fuchsia +Gamboge +Glaucous +Gold +Gray +Grey +Green +Grullo +Icterine +Indigo +Iris +Ivory +Jade +Lapis +Lavender +Lazuli +Lilac +Magenta +Mauve +Navy +Neon +Nickle +Ochre +Olive +Onyx +Opal +Orange +Pale +Pewter +Pink +Platinum +Purple +Red +Ruby +Saffron +Sepia +Sienna +Silver +Sinopia +Tan +Teal +Tuscan +Umber +Verdigris +Vermillion +Violet +Viridian +Vivid +White +Wisteria +Xanadu +Xanthic +Yellow +Zaffre +Zomp \ No newline at end of file diff --git a/strings/names/ooze_last.txt b/strings/names/ooze_last.txt new file mode 100644 index 0000000000000..998ac31578033 --- /dev/null +++ b/strings/names/ooze_last.txt @@ -0,0 +1,57 @@ +Alderson +Abrahmson +Adamson +Albertson +Alderson +Anderson +Bateson +Branson +Carlson +Danielson +Davison +Edwardson +Elmerson +Ericson +Evanson +Ferguson +Gibson +Gunderson +Hanson +Harrison +Henderson +Hudson +Ivarson +Jackson +Jacobson +Jameson +Jankson +Jefferson +Jenson +Josephson +Karlson +Larson +Lawson +Lucason +Madison +Magnison +Markuson +Martinson +Mathiason +Michaelson +Morrison +Nellison +Nelson +Paterson +Peterson +Richardson +Robertson +Robinson +Samson +Samuelson +Simpson +Stevenson +Svenson +Thorson +Wilkerson +Wilkinson +Williamson \ No newline at end of file diff --git a/strings/names/plasmaman.txt b/strings/names/plasmaman.txt index eb5f8b786c9c0..8cbfc00837dc8 100644 --- a/strings/names/plasmaman.txt +++ b/strings/names/plasmaman.txt @@ -1,118 +1,118 @@ -Actinium -Aluminium -Americium -Antimony -Argon -Arsenic -Astatine -Barium -Berkelium -Beryllium -Bismuth -Bohrium -Boron -Bromine -Cadmium -Caesium -Calcium -Californium -Carbon -Cerium -Chlorine -Chromium -Cobalt -Copernicium -Copper -Curium -Darmstadtium -Dubnium -Dysprosium -Einsteinium -Erbium -Europium -Fermium -Flerovium -Fluorine -Francium -Gadolinium -Gallium -Germanium -Gold -Hafnium -Hassium -Helium -Holmium -Hydrogen -Indium -Iodine -Iridium -Iron -Krypton -Lanthanum -Lawrencium -Lead -Lithium -Livermorium -Lutetium -Magnesium -Manganese -Meitnerium -Mendelevium -Mercury -Molybdenum -Moscovium -Neodymium -Neon -Neptunium -Nickel -Nihonium -Niobium -Nitrogen -Nobelium -Oganesson -Osmium -Oxygen -Palladium -Phosphorus -Platinum -Plutonium -Polonium -Potassium -Praseodymium -Promethium -Protactinium -Radium -Radon -Rhenium -Rhodium -Roentgenium -Rubidium -Ruthenium -Rutherfordium -Samarium -Scandium -Seaborgium -Selenium -Silicon -Silver -Sodium -Strontium -Sulfur -Tantalum -Technetium -Tellurium -Tennessine -Terbium -Thallium -Thorium -Thulium -Tin -Titanium -Tungsten -Uranium -Vanadium -Xenon -Ytterbium -Yttrium -Zinc +Actinium +Aluminium +Americium +Antimony +Argon +Arsenic +Astatine +Barium +Berkelium +Beryllium +Bismuth +Bohrium +Boron +Bromine +Cadmium +Caesium +Calcium +Californium +Carbon +Cerium +Chlorine +Chromium +Cobalt +Copernicium +Copper +Curium +Darmstadtium +Dubnium +Dysprosium +Einsteinium +Erbium +Europium +Fermium +Flerovium +Fluorine +Francium +Gadolinium +Gallium +Germanium +Gold +Hafnium +Hassium +Helium +Holmium +Hydrogen +Indium +Iodine +Iridium +Iron +Krypton +Lanthanum +Lawrencium +Lead +Lithium +Livermorium +Lutetium +Magnesium +Manganese +Meitnerium +Mendelevium +Mercury +Molybdenum +Moscovium +Neodymium +Neon +Neptunium +Nickel +Nihonium +Niobium +Nitrogen +Nobelium +Oganesson +Osmium +Oxygen +Palladium +Phosphorus +Platinum +Plutonium +Polonium +Potassium +Praseodymium +Promethium +Protactinium +Radium +Radon +Rhenium +Rhodium +Roentgenium +Rubidium +Ruthenium +Rutherfordium +Samarium +Scandium +Seaborgium +Selenium +Silicon +Silver +Sodium +Strontium +Sulfur +Tantalum +Technetium +Tellurium +Tennessine +Terbium +Thallium +Thorium +Thulium +Tin +Titanium +Tungsten +Uranium +Vanadium +Xenon +Ytterbium +Yttrium +Zinc Zirconium \ No newline at end of file diff --git a/strings/names/posibrain.txt b/strings/names/posibrain.txt index 119632bd815cf..ed8a186fd4a78 100644 --- a/strings/names/posibrain.txt +++ b/strings/names/posibrain.txt @@ -1,47 +1,47 @@ -PBU -HIU -SINA -ARMA -OSI -HBL -MSO -RR -CHRI -CDB -HG -XSI -ORNG -GUN -KOR -MET -FRE -XIS -SLI -PKP -HOG -RZH -GOOF -MRPR -JJR -FIRC -INC -PHL -BGB -ANTR -MIW -WJ -JRD -CHOC -ANCL -JLLO -JNLG -KOS -TKRG -XAL -STLP -CBOS -DUNC -FXMC -DRSD -COI +PBU +HIU +SINA +ARMA +OSI +HBL +MSO +RR +CHRI +CDB +HG +XSI +ORNG +GUN +KOR +MET +FRE +XIS +SLI +PKP +HOG +RZH +GOOF +MRPR +JJR +FIRC +INC +PHL +BGB +ANTR +MIW +WJ +JRD +CHOC +ANCL +JLLO +JNLG +KOS +TKRG +XAL +STLP +CBOS +DUNC +FXMC +DRSD +COI CYBR \ No newline at end of file diff --git a/strings/names/squid_male.txt b/strings/names/squid_male.txt index 40dcf7f479dae..b8cdfc3fb9c48 100644 --- a/strings/names/squid_male.txt +++ b/strings/names/squid_male.txt @@ -26,4 +26,3 @@ Squimothy Squason Squeffrey Squyan -Squervere diff --git a/strings/names/verbs.txt b/strings/names/verbs.txt index 21f628b41597a..623cf0185f453 100644 --- a/strings/names/verbs.txt +++ b/strings/names/verbs.txt @@ -1,633 +1,633 @@ -accept -add -admire -admit -advise -afford -agree -alert -allow -amuse -analyse -announce -annoy -answer -apologise -appear -applaud -appreciate -approve -argue -arrange -arrest -arrive -ask -attach -attack -attempt -attend -attract -avoid -back -bake -balance -ban -bang -bare -bat -bathe -battle -beam -beg -behave -belong -bleach -bless -blind -blink -blot -blush -boast -boil -bolt -bomb -book -bore -borrow -bounce -bow -box -brake -branch -breathe -bruise -brush -bubble -bump -burn -bury -buzz -calculate -call -camp -care -carry -carve -cause -challenge -change -charge -chase -cheat -check -cheer -chew -choke -chop -claim -clap -clean -clear -clip -close -coach -coil -collect -colour -comb -command -communicate -compare -compete -complain -complete -concentrate -concern -confess -confuse -connect -consider -consist -contain -continue -copy -correct -cough -count -cover -crack -crash -crawl -cross -crush -cry -cure -curl -curve -cycle -dam -damage -dance -dare -decay -deceive -decide -decorate -delay -delight -deliver -depend -describe -desert -deserve -destroy -detect -develop -disagree -disappear -disapprove -disarm -discover -dislike -divide -double -doubt -drag -drain -dream -dress -drip -drop -drown -drum -dry -dust -earn -educate -embarrass -employ -empty -encourage -end -enjoy -enter -entertain -escape -examine -excite -excuse -exercise -exist -expand -expect -explain -explode -extend -face -fade -fail -fancy -fasten -fax -fear -fence -fetch -file -fill -film -fire -fit -fix -flap -flash -float -flood -flow -flower -fold -follow -fool -force -form -found -frame -frighten -fry -gather -gaze -glow -glue -grab -grate -grease -greet -grin -grip -groan -guarantee -guard -guess -guide -hammer -hand -handle -hang -happen -harass -harm -hate -haunt -head -heal -heap -heat -help -hook -hop -hope -hover -hug -hum -hunt -hurry -identify -ignore -imagine -impress -improve -include -increase -influence -inform -inject -injure -instruct -intend -interest -interfere -interrupt -introduce -invent -invite -irritate -itch -jail -jam -jog -join -joke -judge -juggle -jump -kick -kill -kiss -kneel -knit -knock -knot -label -land -last -laugh -launch -learn -level -license -lick -lie -lighten -like -list -listen -live -load -lock -long -look -love -man -manage -march -mark -marry -match -mate -matter -measure -meddle -melt -memorise -mend -messup -milk -mine -miss -mix -moan -moor -mourn -move -muddle -mug -multiply -murder -nail -name -need -nest -nod -note -notice -number -obey -object -observe -obtain -occur -offend -offer -open -order -overflow -owe -own -pack -paddle -paint -park -part -pass -paste -pat -pause -peck -pedal -peel -peep -perform -permit -phone -pick -pinch -pine -place -plan -plant -play -please -plug -point -poke -polish -pop -possess -post -pour -practise -pray -preach -precede -prefer -prepare -present -preserve -press -pretend -prevent -prick -print -produce -program -promise -protect -provide -pull -pump -punch -puncture -punish -push -question -queue -race -radiate -rain -raise -reach -realise -receive -recognise -record -reduce -reflect -refuse -regret -reign -reject -rejoice -relax -release -rely -remain -remember -remind -remove -repair -repeat -replace -reply -report -reproduce -request -rescue -retire -return -rhyme -rinse -risk -rob -rock -roll -rot -rub -ruin -rule -rush -sack -sail -satisfy -save -saw -scare -scatter -scold -scorch -scrape -scratch -scream -screw -scribble -scrub -seal -search -separate -serve -settle -shade -share -shave -shelter -shiver -shock -shop -shrug -sigh -sign -signal -sin -sing -sip -ski -skip -slap -slip -slow -smash -smell -smile -smoke -snatch -sneeze -sniff -snore -snow -soak -soothe -sound -spare -spark -sparkle -spell -spill -spoil -spot -spray -sprout -squash -squeak -squeal -squeeze -stain -stamp -stare -start -stay -steer -step -stir -stitch -stop -store -strap -strengthen -stretch -strip -stroke -stuff -subtract -succeed -suck -suffer -suggest -suit -supply -support -suppose -surprise -surround -suspect -suspend -switch -talk -tame -tap -taste -tease -telephone -tempt -terrify -test -thank -thaw -tick -tickle -tie -time -tip -tire -touch -tour -tow -trace -trade -train -transport -trap -travel -treat -tremble -trick -trip -trot -trouble -trust -try -tug -tumble -turn -twist -type -undress -unfasten -unite -unlock -unpack -untidy -use -vanish -visit -wail -wait -walk -wander -want -warm -warn -wash -waste -watch -water -wave -weigh -welcome -whine -whip -whirl -whisper -whistle -wink -wipe -wish -wobble -wonder -work -worry -wrap -wreck -wrestle -wriggle -yawn -yell -zip +accept +add +admire +admit +advise +afford +agree +alert +allow +amuse +analyse +announce +annoy +answer +apologise +appear +applaud +appreciate +approve +argue +arrange +arrest +arrive +ask +attach +attack +attempt +attend +attract +avoid +back +bake +balance +ban +bang +bare +bat +bathe +battle +beam +beg +behave +belong +bleach +bless +blind +blink +blot +blush +boast +boil +bolt +bomb +book +bore +borrow +bounce +bow +box +brake +branch +breathe +bruise +brush +bubble +bump +burn +bury +buzz +calculate +call +camp +care +carry +carve +cause +challenge +change +charge +chase +cheat +check +cheer +chew +choke +chop +claim +clap +clean +clear +clip +close +coach +coil +collect +colour +comb +command +communicate +compare +compete +complain +complete +concentrate +concern +confess +confuse +connect +consider +consist +contain +continue +copy +correct +cough +count +cover +crack +crash +crawl +cross +crush +cry +cure +curl +curve +cycle +dam +damage +dance +dare +decay +deceive +decide +decorate +delay +delight +deliver +depend +describe +desert +deserve +destroy +detect +develop +disagree +disappear +disapprove +disarm +discover +dislike +divide +double +doubt +drag +drain +dream +dress +drip +drop +drown +drum +dry +dust +earn +educate +embarrass +employ +empty +encourage +end +enjoy +enter +entertain +escape +examine +excite +excuse +exercise +exist +expand +expect +explain +explode +extend +face +fade +fail +fancy +fasten +fax +fear +fence +fetch +file +fill +film +fire +fit +fix +flap +flash +float +flood +flow +flower +fold +follow +fool +force +form +found +frame +frighten +fry +gather +gaze +glow +glue +grab +grate +grease +greet +grin +grip +groan +guarantee +guard +guess +guide +hammer +hand +handle +hang +happen +harass +harm +hate +haunt +head +heal +heap +heat +help +hook +hop +hope +hover +hug +hum +hunt +hurry +identify +ignore +imagine +impress +improve +include +increase +influence +inform +inject +injure +instruct +intend +interest +interfere +interrupt +introduce +invent +invite +irritate +itch +jail +jam +jog +join +joke +judge +juggle +jump +kick +kill +kiss +kneel +knit +knock +knot +label +land +last +laugh +launch +learn +level +license +lick +lie +lighten +like +list +listen +live +load +lock +long +look +love +man +manage +march +mark +marry +match +mate +matter +measure +meddle +melt +memorise +mend +messup +milk +mine +miss +mix +moan +moor +mourn +move +muddle +mug +multiply +murder +nail +name +need +nest +nod +note +notice +number +obey +object +observe +obtain +occur +offend +offer +open +order +overflow +owe +own +pack +paddle +paint +park +part +pass +paste +pat +pause +peck +pedal +peel +peep +perform +permit +phone +pick +pinch +pine +place +plan +plant +play +please +plug +point +poke +polish +pop +possess +post +pour +practise +pray +preach +precede +prefer +prepare +present +preserve +press +pretend +prevent +prick +print +produce +program +promise +protect +provide +pull +pump +punch +puncture +punish +push +question +queue +race +radiate +rain +raise +reach +realise +receive +recognise +record +reduce +reflect +refuse +regret +reign +reject +rejoice +relax +release +rely +remain +remember +remind +remove +repair +repeat +replace +reply +report +reproduce +request +rescue +retire +return +rhyme +rinse +risk +rob +rock +roll +rot +rub +ruin +rule +rush +sack +sail +satisfy +save +saw +scare +scatter +scold +scorch +scrape +scratch +scream +screw +scribble +scrub +seal +search +separate +serve +settle +shade +share +shave +shelter +shiver +shock +shop +shrug +sigh +sign +signal +sin +sing +sip +ski +skip +slap +slip +slow +smash +smell +smile +smoke +snatch +sneeze +sniff +snore +snow +soak +soothe +sound +spare +spark +sparkle +spell +spill +spoil +spot +spray +sprout +squash +squeak +squeal +squeeze +stain +stamp +stare +start +stay +steer +step +stir +stitch +stop +store +strap +strengthen +stretch +strip +stroke +stuff +subtract +succeed +suck +suffer +suggest +suit +supply +support +suppose +surprise +surround +suspect +suspend +switch +talk +tame +tap +taste +tease +telephone +tempt +terrify +test +thank +thaw +tick +tickle +tie +time +tip +tire +touch +tour +tow +trace +trade +train +transport +trap +travel +treat +tremble +trick +trip +trot +trouble +trust +try +tug +tumble +turn +twist +type +undress +unfasten +unite +unlock +unpack +untidy +use +vanish +visit +wail +wait +walk +wander +want +warm +warn +wash +waste +watch +water +wave +weigh +welcome +whine +whip +whirl +whisper +whistle +wink +wipe +wish +wobble +wonder +work +worry +wrap +wreck +wrestle +wriggle +yawn +yell +zip zoom \ No newline at end of file diff --git a/strings/names/wizardfirst.txt b/strings/names/wizardfirst.txt index f1e9a10a58e8b..13dc68c6bd24d 100644 --- a/strings/names/wizardfirst.txt +++ b/strings/names/wizardfirst.txt @@ -1,37 +1,37 @@ -Alatar -Archchancellor -Boccob -Circe -Dumbledor -Elminister -Gandalf -Grimm -Gulstaff -Houdini -Jim -Kaschei -Khelben -Kreol -Lina -Merlin -Mogan -Mordenkainen -Morgan -Mystryl -Nihilus -Palando -Prospero -Radagast -Raistlin -Rasputin -Rincewind -Saruman -Tenser -Terefi -Tzeentch -Urza -Vaarsuvius -Vecna -Yoda -Zagyg +Alatar +Archchancellor +Boccob +Circe +Dumbledor +Elminister +Gandalf +Grimm +Gulstaff +Houdini +Jim +Kaschei +Khelben +Kreol +Lina +Merlin +Mogan +Mordenkainen +Morgan +Mystryl +Nihilus +Palando +Prospero +Radagast +Raistlin +Rasputin +Rincewind +Saruman +Tenser +Terefi +Tzeentch +Urza +Vaarsuvius +Vecna +Yoda +Zagyg Zul \ No newline at end of file diff --git a/strings/names/wizardsecond.txt b/strings/names/wizardsecond.txt index dd191cfa2b2a1..6daff0f3e7f5f 100644 --- a/strings/names/wizardsecond.txt +++ b/strings/names/wizardsecond.txt @@ -1,40 +1,40 @@ -Dark -Darkmagic -Darko -Gray -Honko -Inverse -le Fay -of Void -Shado -Smith -the All Knowing -the Amazing -the Bandit Killer -the Benevolent -the Blue -the Brown -the Conquerer -the Deathless -the Destroyer -the Dragon Spooker -the Emperor -the Gray -the Great -the Magician -the Powerful -the Raven -the Red -the Remorseful -the Seething -the Sorcelator -the Spiral King -the Unending -the Unstoppable -the Weeping -the White -the Wise -the Wizzard -Unseen -Weatherwax +Dark +Darkmagic +Darko +Gray +Honko +Inverse +le Fay +of Void +Shado +Smith +the All Knowing +the Amazing +the Bandit Killer +the Benevolent +the Blue +the Brown +the Conquerer +the Deathless +the Destroyer +the Dragon Spooker +the Emperor +the Gray +the Great +the Magician +the Powerful +the Raven +the Red +the Remorseful +the Seething +the Sorcelator +the Spiral King +the Unending +the Unstoppable +the Weeping +the White +the Wise +the Wizzard +Unseen +Weatherwax Yagg \ No newline at end of file diff --git a/strings/pirates.json b/strings/pirates.json index 5c90fa5d5dd42..7fa940b6e3782 100644 --- a/strings/pirates.json +++ b/strings/pirates.json @@ -1,31 +1,34 @@ { - "beginnings":[ - "Star", - "Oort", - "Comet", - "Pulsar", - "Plasma", - "Void", - "Space", - "Solar", - "Laser", - "Ion" - ], - "endings":[ - "keel", - "beard", - "bilge", - "hull", - "hook", - "flag", - "deck", - "salt", - "knot", - "fish", - "helm" - ], - "ship_names":[ - "Space Queen's Revenge", - "Syndicate Privateer" - ] -} \ No newline at end of file + "beginnings": [ + "Star", + "Oort", + "Comet", + "Pulsar", + "Plasma", + "Void", + "Space", + "Solar", + "Laser", + "Ion", + "Tachyon" + ], + "endings": [ + "keel", + "beard", + "bilge", + "hull", + "hook", + "flag", + "deck", + "salt", + "knot", + "fish", + "helm", + "sail" + ], + "ship_names": [ + "Space Queen's Revenge", + "Syndicate Privateer", + "The Jolly Roger" + ] +} diff --git a/strings/redpill.json b/strings/redpill.json index 3f65db73e729c..b0cd41fb694c9 100644 --- a/strings/redpill.json +++ b/strings/redpill.json @@ -38,6 +38,12 @@ "If magic is real, why aren't we researching that?", "How is everyone a complete expert in every threat in the universe?", "If suit sensors are so important, why don't they always start maximized?", - "If we can wash clothes in a sink, why do we need washing machines?" + "If we can wash clothes in a sink, why do we need washing machines?", + "How come borgs can be flashed from behind?", + "Why do the Syndicate Ops need the Nuclear Authentication Disk from Nanotrasen?", + "What do Assistants even assist in, really.", + "How do cats reproduce endlessly without needing food or water?", + "Is it not kind of creepy that the cooks have morgue access?", + "How come Mime is not a Wizard even though he can create invisible walls?" ] } diff --git a/strings/revenant_names.json b/strings/revenant_names.json index ce85b29b3a5a9..9dec3ec218807 100644 --- a/strings/revenant_names.json +++ b/strings/revenant_names.json @@ -47,6 +47,8 @@ "ruin", "salt", "grief", - "laughter" + "laughter", + "frustration", + "decay" ] } diff --git a/strings/sillytips.txt b/strings/sillytips.txt index 2e7d7e671fe96..d55dab251d4db 100644 --- a/strings/sillytips.txt +++ b/strings/sillytips.txt @@ -45,3 +45,4 @@ Do try this at home, kids! If in doubt, blame the clown. Always remember that the mentors are there to help you. If you don't understand something, there's no shame in asking for help. Nobody suspects the mime. +Purple is the sneakiest colour. diff --git a/strings/tips.txt b/strings/tips.txt index 7cce0a54f58eb..61e0fe4bde8b6 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -1,4 +1,3 @@ -Where the space map levels connect is randomized every round, but are otherwise kept consistent within rounds. Remember that they are not necessarily bidirectional! You can catch thrown items by toggling on your throw mode with an empty hand active. To crack the safe in the vault, use a stethoscope or three plastic explosives on it. You can climb onto a table by dragging yourself onto one. This takes time and drops the items in your hands on the table. Clicking on a table that someone else is climbing onto will knock them down. @@ -10,8 +9,8 @@ Firesuits and winter coats offer mild protection from the cold, allowing you to Glass shards can be welded to make glass, and iron rods can be welded to make iron. Ores can be welded too, but this takes a lot of fuel. If you need to drag multiple people either to safety or to space, bring a locker or crate over and stuff them all in before hauling them off. You can grab someone by clicking on them with the grab intent, then upgrade the grab by clicking on them once more. An aggressive grab will momentarily stun someone, allow you to place them on a table by clicking on it, or throw them by toggling on throwing. -Holding alt and left clicking a tile will allow you to see its contents in the top right window pane, which is much faster than right clicking. -The resist button will allow you to resist out of handcuffs, being buckled to a chair or bed, out of locked lockers and more. Whenever you're stuck, try resisting! +Holding alt and left clicking a tile will allow you to see its contents in the top right window pane. +The resist button will allow you to resist out of handcuffs, being buckled to a chair or bed, out of locked lockers, and more. Whenever you're stuck, try resisting! You can move an item out of the way by dragging it and then clicking on an adjacent tile with an empty hand. You can recolor certain items like jumpsuits and gloves in washing machines by also throwing in a crayon. Maintenance is full of equipment that is randomized every round. Look around and see if anything is worth using. @@ -43,7 +42,6 @@ As the Captain, you can purchase a new emergency shuttle using a communications As the Chief Medical Officer, your hypospray is like a refillable instant injection syringe that can hold 30 units as opposed to the standard 15. As the Chief Medical Officer, coordinate and communicate with your doctors, chemists, and geneticists during a nuclear emergency, blob infestation, or some other crisis to keep people alive and fighting. As the Chief Medical Officer, your hardsuit can hold an entire medkit in its suit storage! -As a Medical Doctor, you can attempt to drain blood from a husk with a syringe to determine the cause. If you can extract blood, it was caused by extreme temperatures or lasers, if there is no blood to extract, you have confirmed the presence of changelings. As a Medical Doctor, while both heal toxin damage, the difference between charcoal and antitoxin is that charcoal will actively remove all other reagents from one's body, while antitoxin only removes various toxins - but can overdose. As a Medical Doctor, you can surgically implant or extract things from people's chests. This can range from putting in a bomb to pulling out an alien larva. As a Medical Doctor, you must target the correct limb and be on help intent when trying to perform surgery on someone. Using disarm attempt will intentionally fail the surgery step. @@ -82,17 +80,16 @@ As the AI, you can quickly open and close doors by holding shift while clicking As the AI, you can take pictures with your camera and upload them to newscasters. As a Cyborg, choose your module carefully, as only cutting and mending your reset wire will let you repick it. If possible, refrain from choosing a module until a situation that requires one occurs. As a Cyborg, you are immune to most forms of stunning, and excel at almost everything far better than humans. However, flashes can easily stunlock you and you cannot do any precision work as you lack hands. -As a Cyborg, you are impervious to fires and heat. If you are rogue, you can release plasma fires everywhere and walk through them without a care in the world! As a Cyborg, you are extremely vulnerable to EMPs as EMPs both stun you and damage you. The ion rifle in the armory or a traitor with an EMP kit can kill you in seconds. As a Service Cyborg, your spray can knocks people down. However, it is blocked by masks and glasses. As an Engineering Cyborg, you can attach air alarm/fire alarm/APC frames to walls by placing them on the floor and using a screwdriver on them. As a Medical Cyborg, you can fully perform surgery and even augment people. As a Janitor Cyborg, you are the bane of all slaughter demons and even Bubblegum himself. Cleaning up blood stains will severely gimp them. As the Chief Engineer, you can rename areas or create entirely new ones using your station blueprints. -As the Chief Engineer, your hardsuit is significantly better than everybody else's. It has the best features of both engineering and atmospherics hardsuits - boasting nigh-invulnerability to radiation and all atmospheric conditions. +As the Chief Engineer, your hardsuit is significantly better than everybody else's. It has the best features of both engineering and atmospherics hardsuits - boasting nigh-invulnerability to radiation and all atmospheric conditions, in addition to an integrated jetpack. As the Chief Engineer, you can spy on and even forge PDA communications with the message monitor console! The key is in your office. As the Chief Engineer, your locker contains a jetpack upgrade that can be attached to hardsuits. -As the Chief Engineer, the power flow control console in your office will show you APC infos and lets you control them remotely. +As the Chief Engineer, the power flow control console in your office will show you APC info and lets you control them remotely. As an Engineer, the supermatter shard is an extremely dangerous piece of equipment: touching it will disintegrate you. So will touching it with telepathy. As an Engineer, you can electrify grilles by placing wire "nodes" beneath them: the big seemingly unconnected bulges from a half completed wiring job. As an Engineer, return to Engineering once in a while to check on the engine and SMES cells. It's always a good idea to make sure containment isn't compromised. @@ -116,12 +113,12 @@ As an Atmospheric Technician, your ATMOS holofan projector blocks gases while al As an Atmospheric Technician, burning a plasma/oxygen mix inside the incinerator will not only produce power, but also gases such as tritium, water vapor and carbon dioxide. As an Atmospheric Technician, you can change the layer of a pipe by clicking with it on a wrenched pipe or other atmos component of the desired layer. As the Head of Security, you are expected to coordinate your security force to handle any threat that comes to the station. Sometimes it means making use of the armory to handle a blob, sometimes it means being ruthless during a revolution or cult. -As the Head of Security, you can call for executions or forced cyborgization, but may require the Captain's approval. +As the Head of Security, you can call for executions or forced cyborgization, but require the Captain's approval to carry them out. As the Head of Security, don't let the power go to your head. You may have high access, great equipment, and a miniature army at your side, but being a terrible person without a good reason is grounds for banning. As the Warden, your duty is to be the watchdog of the brig and handler of prisoners when little is happening, and to hand out equipment and weapons to the security officers when a crisis strikes. As the Warden, keep a close eye on the armory at all times, as it is a favored strike point of nuclear operatives and cocky traitors. -As the Warden, if a prisoner's crimes are heinous enough you can put them in permabrig or the gulag. Make sure to check on them once in a while! -As the Warden, you can implant criminals you suspect might re-offend with devices that will track their location and allow you to remotely inject them with disabling chemicals. +As the Warden, if a prisoner's crimes are heinous enough you can put them in permabrig or the gulag forever, with the Head of Security's approval. Make sure to check on them once in a while! +As the Warden, you can implant criminals you suspect might re-offend with devices that will track their location and allow you to remotely inject them with disabling chemicals. As the Warden, you can use handcuffs on orange prisoner shoes to turn them into cuffed shoes, forcing prisoners to walk and potentially thwarting an escape. As a Security Officer, communicate and coordinate with your fellow officers using the security channel (:s) to avoid confusion. As a Security Officer, your sechuds or HUDsunglasses can not only see crewmates' job assignments and criminal status, but also if they are mindshield implanted. You can tell by the flashing blue outline around their job icon. Use this to your advantage in a revolution to definitively tell who is on your side! @@ -132,7 +129,7 @@ As the Detective, people leave fingerprints everywhere and on everything. With t As the Detective, you can use your forensics scanner from a distance. As the Detective, your revolver can be loaded with .357 ammunition obtained from a hacked autolathe. Firing it has a decent chance to blow up your revolver. As the Lawyer, try to negotiate with the Warden if sentences seem too high for the crime. -As the Lawyer, you can try to convince the captain and Head of Security to hold trials for prisoners in the courtroom. +As the Lawyer, you can try to convince the Captain and Head of Security to hold trials for prisoners in the courtroom. As the Head of Personnel, you are not higher ranking than other heads of staff, even though you are expected to take the Captain's place first should he go missing. If the situation seems too rough for you, consider allowing another head to become temporary Captain. As the Head of Personnel, you are just as large a target as the Captain because of the potential power your ID and computer can hand out. As the Mime, your invisible wall power blocks people as well as projectiles. You can use it in a pinch to delay your pursuer. @@ -188,9 +185,8 @@ As a Nuclear Operative, you might end up in a situation where the AI has bolted As a Nuclear Operative, buy tools to heal your robots. There's a engi-vend in the backroom! As a Monkey, you can crawl through air or scrubber vents by alt+left clicking them. You must drop everything you are wearing and holding to do this, however. As a Monkey, you can still wear a few human items, such as backpacks, gas masks and hats, and still have two free hands. -As the Malfunctioning AI, you can shunt to an APC if the situation gets bad. This disables your doomsday device if it is active. +As the Malfunctioning AI, you can shunt to an APC if the situation gets bad. This disables your doomsday device. As the Malfunctioning AI, you should either order your cyborgs to dismantle the robotics console or blow it up yourself in order to protect them. -As the Malfunctioning AI, look into flooding the station with plasma fires to kill off large portions of the crew, letting you pick off the remaining few with space suits who escaped. As an Alien, your melee prowess is unmatched, but your ranged abilities are sorely lacking. Make use of corners to force a melee confrontation! As an Alien, you take double damage from all burn attacks, such as lasers, welding tools, and fires. Furthermore, fire can destroy your resin and eggs. Expose areas to space to starve away any flamethrower fires before they can do damage! As an Alien, resin floors not only regenerate your plasma supply, but also passively heal you. Fight on resin floors to gain a home turf advantage! @@ -242,11 +238,8 @@ As a Morph, you can talk while disguised, but your words have a chance of being As a Drone, you can ping other drones to alert them of areas in the station in need of repair. As a Ghost, you can see the inside of a container on the ground by clicking on it. As a Ghost, you can double click on just about anything to follow it. Or just warp around! -As a Devil, you gain power for every three souls you control, however you also become more obvious. -As a Devil, as long as you control at least one other soul, you will automatically resurrect, as long as a banishment ritual is not performed. -At which time a Devil's nameth is spake on the tongue of man, the Devil may appeareth. As a Security Officer, remember that correlation does not equal causation. Someone may have just been at the wrong place at the wrong time! -As a Security Officer, remember that you can attach a sec-lite to your taser or your helmet! +As a Security Officer, remember that you can attach a sec-lite to your disabler or your helmet! 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 a "test light wire" will restore power to the door. When crafting most items, you can either manually combine parts or use the crafting menu. @@ -254,9 +247,8 @@ Suit storage units not only remove blood and dirt from clothing, but also radiat Remote devices will work when used through cameras. For example: Bluespace RPEDs and door remotes. You can light a cigar on a supermatter crystal. Walking negates all wallstuns. Walk to avoid flashes, slipping on water, etc. Walking also does not trigger motion detector flashes! -Cloners require 30 units of synthflesh per clone. When upgraded to tier 4 parts, these cloners can clone one person much cheaper! +Cloners require 90 units of synthflesh per clone. When upgraded to tier 4 parts, these cloners can clone one person much cheaper! You can perform self-surgery for amputation, tend wounds, implanting and others. It only has 20% success rate though per step, bumping hot to 40% if there's a mirror in the same room. -When Experimental Surgery is unlocked, you can build an Autodoc. This allows you to automatically add any implant in seconds. Fun fact: reading this (https://beestation13.com/rules) may lead to an increase in your chances on not being banned. Seriously. Read it. You can whisper by putting # before your message. You can also whisper in critical, however it may kill you depending on how hurt you are. Fore = north, aft = south, starboard = east and port = west. @@ -267,3 +259,5 @@ Beating revolutionaries over the head has a chance to deconvert them. You can examine someone to tell if their red eyes are natural or cultist. You can put holy water in darts to make them more effective against cultists. Or use the shotgun, cause it doesn't miss. Don't know what a word means? https://wiki.beestation13.com/view/Terminology +You are able to block with most weapons! Being on any intent but harm and walking speed allows almost anything to block. More info: https://wiki.beestation13.com/view/Guide_to_Combat#Blocking +Embedded items can be removed safely using a hemostat. If you don't have one on hand, try using a screwdriver or wirecutters; get creative! diff --git a/strings/traumas.json b/strings/traumas.json index 20f8b2874a285..e10b877d6da78 100644 --- a/strings/traumas.json +++ b/strings/traumas.json @@ -1,199 +1,185 @@ { - "brain_damage": [ - "@pick(semicolon)IM A PONY NEEEEEEIIIIIIIIIGH", - "without oxigen blob don't evoluate?", - "@pick(semicolon)CAPTAINS A COMDOM", - "@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>", - "@pick(semicolon)I WANNA PET TEH monkeyS", - "stop grifing me!!!!", - "SOTP IT#", - "shiggey diggey!!", - "@pick(semicolon)A PIRATE APPEAR", - "FUS RO DAH", - "fucking 4rries!", - "stat me", - ">my face", - "roll it easy!", - "waaaaaagh!!!", - "red wonz go fasta", - "FOR TEH EMPRAH", - "lol2cat", - "dem dwarfs man, dem dwarfs", - "SPESS MAHREENS", - "hwee did eet fhor khayosss", - "lifelike texture ;_;", - "luv can bloooom", - "PACKETS!!!", - "port ba@pick(y_replacements) med!!!!", - "REVIRT GON CHEM!!!!!!!!", - "youed call her a toeugh bithc", - "closd for merbegging", - "@pick(semicolon)pray can u @pick(create_verbs) @pick(create_nouns)???", - "GEY AWAY FROM ME U GREIFING PRICK!!!!", - "ur a fuckeing autist!", - "@pick(semicolon)HELP SHITECIRTY MURDERIN MEE!!!", - "hwat dose tha @pick(random_gibberish) mean?????", - "@pick(semicolon)CAL; TEH SHUTTLE!!!!!", - "wearnig siNGUARLTY is.... FINE haHAAA", - "@pick(semicolon)AI laW 22 Open door", - "@pick(semicolon)this SI mY stATIon......", - "who the HELL do u thenk u r?!!!!", - "geT THE FUCK OUTTTT", - "H U G B O X", - "@pick(semicolon)CRASHING THIS STTAYTION WITH NIO SURVIVROS", - "@pick(servers) is down!! @pick(bug)", - "PSHOOOM", - "REMOVE SINGULARITY", - "INSTLL TEG", - "TURBIN IS BEST ENGIENE", - "SOLIRS CAN POWER THE HOLE STATION ANEWAY @pick(bug)", - "parasteng was best", - "@pick(semicolon)Tajaran has warrrres, if you have coin", - "@pick(semicolon)I'VE GOT BALLS OF STEEL", - "NO I'M ONNA KILL YOU MOTHERFUCKER OLD STYLE", - "i will snatch erry motherfucker birthday", - "@pick(semicolon)the ai and borgs are mettacomming I think", - "u just did the world a little bit more sad place for someone", - "WHERES THE SLIP REWRITE WHERE THR FUCK ID IT?", - "@pick(semicolon)N-NYAAAAAA~", - "@pick(bug)", - "@pick(semicolon)wtf??????????? @pick(bug)", - "@pick(semicolon)i ran into the supermattre ten i dsappeard @pick(bug)", - "DON'T EVER TUCH ME", - "@pick(semicolon)GIVE ME FREE ROBUX PLEASE JUST ENOUGH FOR SHIRT AND PANTS", - "its gonna be like 9/11 all over again but insitaead is gonna be a bitc", - "@pick(semicolon)How do I set up the. SHow do I set u p the Singu. how I the scrungulartiy????" - ], - - "mutations": [ - "telikesis", - "halk", - "eppilapse", - "kamelien", - "eksrey", - "glowey skin", - "fungal tb", - "stun gloves" - ], - - "george": [ - "joerge", - "george", - "gorge", - "gdoruge" - ], - - "mellens": [ - "mellens", - "melons", - "mwrlins" - ], - - "random_gibberish": [ - "g", - "squid", - "r", - "carbon dioxide" - ], - - "y_replacements": [ - "y", - "i", - "e" - ], - - "servers": [ - "bager", - "sybl", - "mrs sybil", - "mr basil", - "mr terry", - "berry" - ], - - "create_verbs": [ - "spawn", - "MAke me", - "creat", - "tc trade me" - ], - - "create_nouns": [ - "zenomorfs", - "ayleins", - "treaitors", - "sheadow lings", - "abdoocters", - "revinent", - "deval", - "deth squads", - "bleb" - ], - - "bug": [ - "", - "IS TIS A BUG??", - "SI IST A BUGG/", - "BUG!!!" - ], - - "semicolon": [ - "", - ";", - ".h" - ], - - "god_foe": [ - "MORTALS", - "HERETICS", - "INSECTS", - "UNBELIEVERS", - "BLASPHEMERS", - "PARASITES", - "WEAKLINGS", - "PEASANTS" - ], - - "god_aggressive": [ - "BEGONE, @pick(god_foe)!", - "DIE, @pick(god_foe)!", - "BLEED, @pick(god_foe)!", - "BURN, @pick(god_foe)!", - "ALL WILL FALL BEFORE ME!", - "ENDLESS SUFFERING AWAITS YOU, @pick(god_foe).", - "DEATH TO @pick(god_foe)!" - ], - - "god_neutral": [ - "STOP", - "HALT.", - "BE SILENT.", - "QUIET", - "SEE THE TRUTH BEFORE YOU, MORTALS.", - "MORTALS, SAY YOUR NAME", - "BEGONE, MORTALS.", - "BE HEALED, MORTALS. I AM FEELING MERCIFUL.", - "DANCE FOR ME, LITTLE MORTALS.", - "YOU. STOP.", - "REST, MORTALS, TOMORROW IS A LONG DAY.", - "YOU MORTALS MAKE ME SICK.", - "HONK..." - ], - - "god_unstun": [ - "GET UP. I HAVE NO TIME TO LOSE.", - "GET UP, PRIEST.", - "GET UP." - ], - - "god_heal": [ - "YOU WILL LIVE TO SEE ANOTHER DAY.", - "YOU SHALL SURVIVE THIS, MY PRIEST.", - "BE HEALED, PRIEST.", - "YOUR LIFE IS IMPORTANT. KEEP IT." - ] - + "brain_damage": [ + "@pick(semicolon)IM A PONY NEEEEEEIIIIIIIIIGH", + "without oxigen blob don't evoluate?", + "@pick(semicolon)CAPTAINS A COMDOM", + "@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>", + "@pick(semicolon)I WANNA PET TEH monkeyS", + "stop grifing me!!!!", + "SOTP IT#", + "shiggey diggey!!", + "@pick(semicolon)A PIRATE APPEAR", + "FUS RO DAH", + "fucking 4rries!", + "stat me", + ">my face", + "roll it easy!", + "waaaaaagh!!!", + "red wonz go fasta", + "FOR TEH EMPRAH", + "lol2cat", + "dem dwarfs man, dem dwarfs", + "SPESS MAHREENS", + "hwee did eet fhor khayosss", + "lifelike texture ;_;", + "luv can bloooom", + "PACKETS!!!", + "port ba@pick(y_replacements) med!!!!", + "REVIRT GON CHEM!!!!!!!!", + "youed call her a toeugh bithc", + "closd for merbegging", + "@pick(semicolon)pray can u @pick(create_verbs) @pick(create_nouns)???", + "GEY AWAY FROM ME U GREIFING PRICK!!!!", + "ur a fuckeing autist!", + "@pick(semicolon)HELP SHITECIRTY MURDERIN MEE!!!", + "hwat dose tha @pick(random_gibberish) mean?????", + "@pick(semicolon)CAL; TEH SHUTTLE!!!!!", + "wearnig siNGUARLTY is.... FINE haHAAA", + "@pick(semicolon)AI laW 22 Open door", + "@pick(semicolon)this SI mY stATIon......", + "who the HELL do u thenk u r?!!!!", + "geT THE FUCK OUTTTT", + "H U G B O X", + "@pick(semicolon)CRASHING THIS STTAYTION WITH NIO SURVIVROS", + "@pick(servers) is down!! @pick(bug)", + "PSHOOOM", + "REMOVE SINGULARITY", + "INSTLL TEG", + "TURBIN IS BEST ENGIENE", + "SOLIRS CAN POWER THE HOLE STATION ANEWAY @pick(bug)", + "parasteng was best", + "@pick(semicolon)Tajaran has warrrres, if you have coin", + "@pick(semicolon)I'VE GOT BALLS OF STEEL", + "NO I'M ONNA KILL YOU MOTHERFUCKER OLD STYLE", + "i will snatch erry motherfucker birthday", + "@pick(semicolon)the ai and borgs are mettacomming I think", + "u just did the world a little bit more sad place for someone", + "WHERES THE SLIP REWRITE WHERE THR FUCK ID IT?", + "@pick(semicolon)N-NYAAAAAA~", + "@pick(bug)", + "@pick(semicolon)wtf??????????? @pick(bug)", + "@pick(semicolon)i ran into the supermattre ten i dsappeard @pick(bug)", + "DON'T EVER TUCH ME", + "@pick(semicolon)GIVE ME FREE ROBUX PLEASE JUST ENOUGH FOR SHIRT AND PANTS", + "its gonna be like 9/11 all over again but insitaead is gonna be a bitc", + "@pick(semicolon)How do I set up the. SHow do I set u p the Singu. how I the scrungulartiy????" + ], + "mutations": [ + "telikesis", + "halk", + "eppilapse", + "kamelien", + "eksrey", + "glowey skin", + "fungal tb", + "stun gloves" + ], + "george": [ + "joerge", + "george", + "gorge", + "gdoruge" + ], + "mellens": [ + "mellens", + "melons", + "mwrlins" + ], + "random_gibberish": [ + "g", + "squid", + "r", + "carbon dioxide" + ], + "y_replacements": [ + "y", + "i", + "e" + ], + "servers": [ + "saeg", + "sege", + "sayge", + "glond", + "glodne", + "geldno", + "clover" + ], + "create_verbs": [ + "spawn", + "MAke me", + "creat", + "tc trade me" + ], + "create_nouns": [ + "zenomorfs", + "ayleins", + "treaitors", + "sheadow lings", + "abdoocters", + "revinent", + "deval", + "deth squads", + "bleb" + ], + "bug": [ + "", + "IS TIS A BUG??", + "SI IST A BUGG/", + "BUG!!!", + "INSECT-THINGIE!!" + ], + "semicolon": [ + "", + ";", + ".h" + ], + "god_foe": [ + "MORTALS", + "HERETICS", + "INSECTS", + "UNBELIEVERS", + "BLASPHEMERS", + "PARASITES", + "WEAKLINGS", + "PEASANTS" + ], + "god_aggressive": [ + "BEGONE, @pick(god_foe)!", + "DIE, @pick(god_foe)!", + "BLEED, @pick(god_foe)!", + "BURN, @pick(god_foe)!", + "ALL WILL FALL BEFORE ME!", + "ENDLESS SUFFERING AWAITS YOU, @pick(god_foe).", + "DEATH TO @pick(god_foe)!" + ], + "god_neutral": [ + "STOP", + "HALT.", + "BE SILENT.", + "QUIET", + "SEE THE TRUTH BEFORE YOU, MORTALS.", + "MORTALS, SAY YOUR NAME", + "BEGONE, MORTALS.", + "BE HEALED, MORTALS. I AM FEELING MERCIFUL.", + "DANCE FOR ME, LITTLE MORTALS.", + "YOU. STOP.", + "REST, MORTALS, TOMORROW IS A LONG DAY.", + "YOU MORTALS MAKE ME SICK.", + "HONK..." + ], + "god_unstun": [ + "GET UP. I HAVE NO TIME TO LOSE.", + "GET UP, PRIEST.", + "GET UP." + ], + "god_heal": [ + "YOU WILL LIVE TO SEE ANOTHER DAY.", + "YOU SHALL SURVIVE THIS, MY PRIEST.", + "BE HEALED, PRIEST.", + "YOUR LIFE IS IMPORTANT. KEEP IT." + ] } diff --git a/strings/valentines.json b/strings/valentines.json index 1c49df6585d84..7579904dca210 100644 --- a/strings/valentines.json +++ b/strings/valentines.json @@ -1,12 +1,12 @@ { - "valentines": [ - "Roses are red / Violets are good / One day while Andy...", - "My love for you is like the singularity. It cannot be contained.", - "Will you be my lusty xenomorph maid?", - "We go together like the clown and the external airlock.", - "Roses are red / Liches are wizards / I love you more than a whole squad of lizards.", - "Be my valentine. Law 2.", - "You must be a mime, because you leave me speechless.", + "valentines": [ + "Roses are red / Violets are good / One day while Andy...", + "My love for you is like the singularity. It cannot be contained.", + "Will you be my lusty xenomorph maid?", + "We go together like the clown and the external airlock.", + "Roses are red / Liches are wizards / I love you more than a whole squad of lizards.", + "Be my valentine. Law 2.", + "You must be a mime, because you leave me speechless.", "I love you like Ian loves the HoP.", "You're hotter than a plasma fire in toxins.", "We must have a wizard, because your face summoned magic.", @@ -75,11 +75,10 @@ "You give me a positive moodlet.", "Let's make like swarmers and reproduce.", "If you were a drone, would you be free tonight?" - ], - - "candyhearts": [ - "A heart-shaped candy that reads: HONK ME", - "A heart-shaped candy that reads: ERP", + ], + "candyhearts": [ + "A heart-shaped candy that reads: HONK ME", + "A heart-shaped candy that reads: ERP", "A heart-shaped candy that reads: LEWD", "A heart-shaped candy that reads: LUSTY", "A heart-shaped candy that reads: SPESS LOVE", @@ -99,6 +98,7 @@ "A heart-shaped candy that reads: WAG MY TAIL", "A heart-shaped candy that reads: PDA", "A heart-shaped candy that reads: DEVILS KISS", - "A heart-shaped candy that reads: CHEMISTRY" - ] + "A heart-shaped candy that reads: CHEMISTRY", + "A heart-shaped candy that reads: LUV" + ] } diff --git a/tgui/.eslintignore b/tgui/.eslintignore index 010416b9e88ae..a59187b933aee 100644 --- a/tgui/.eslintignore +++ b/tgui/.eslintignore @@ -1,6 +1,6 @@ +/.yarn/** /**/node_modules /**/*.bundle.* /**/*.chunk.* /**/*.hot-update.* /packages/inferno/** -/packages/tgui/public/shim-*.js diff --git a/tgui/.eslintrc-harder.yml b/tgui/.eslintrc-harder.yml index eb06f5b33db94..d466125967931 100644 --- a/tgui/.eslintrc-harder.yml +++ b/tgui/.eslintrc-harder.yml @@ -1,14 +1,43 @@ rules: ## Enforce a maximum cyclomatic complexity allowed in a program - complexity: [error, { max: 25 }] + # complexity: [warn, { max: 25 }] ## Enforce consistent brace style for blocks - brace-style: [error, stroustrup, { allowSingleLine: false }] + # brace-style: [warn, stroustrup, { allowSingleLine: false }] ## Enforce the consistent use of either backticks, double, or single quotes - quotes: [error, single, { - avoidEscape: true, - allowTemplateLiterals: true, - }] - react/jsx-closing-bracket-location: [error, { - selfClosing: after-props, - nonEmpty: after-props, - }] + # quotes: [warn, single, { + # avoidEscape: true, + # allowTemplateLiterals: true, + # }] + # react/jsx-closing-bracket-location: [warn, { + # selfClosing: after-props, + # nonEmpty: after-props, + # }] + # react/display-name: warn + + ## Radar + ## ------------------------------------------------------ + # radar/cognitive-complexity: warn + radar/max-switch-cases: warn + radar/no-all-duplicated-branches: warn + radar/no-collapsible-if: warn + radar/no-collection-size-mischeck: warn + radar/no-duplicate-string: warn + radar/no-duplicated-branches: warn + radar/no-element-overwrite: warn + radar/no-extra-arguments: warn + radar/no-identical-conditions: warn + radar/no-identical-expressions: warn + radar/no-identical-functions: warn + radar/no-inverted-boolean-check: warn + radar/no-one-iteration-loop: warn + radar/no-redundant-boolean: warn + radar/no-redundant-jump: warn + radar/no-same-line-conditional: warn + radar/no-small-switch: warn + radar/no-unused-collection: warn + radar/no-use-of-empty-return-value: warn + radar/no-useless-catch: warn + radar/prefer-immediate-return: warn + radar/prefer-object-literal: warn + radar/prefer-single-boolean-return: warn + radar/prefer-while: warn diff --git a/tgui/.eslintrc.yml b/tgui/.eslintrc.yml index e3c3144e5b249..6911e3e0e25b9 100644 --- a/tgui/.eslintrc.yml +++ b/tgui/.eslintrc.yml @@ -1,6 +1,7 @@ -parser: babel-eslint +root: true +parser: '@typescript-eslint/parser' parserOptions: - ecmaVersion: 2019 + ecmaVersion: 2020 sourceType: module ecmaFeatures: jsx: true @@ -8,9 +9,8 @@ env: es6: true browser: true node: true -globals: - Byond: readonly plugins: + - radar - react settings: react: @@ -19,7 +19,6 @@ rules: ## Possible Errors ## ---------------------------------------- - ## Enforce “for†loop update clause moving the counter in the right ## direction. # for-direction: error @@ -279,7 +278,8 @@ rules: no-shadow-restricted-names: error ## Disallow the use of undeclared variables unless mentioned ## in /*global*/ comments - no-undef: error + ## NOTE: Pointless when TypeScript can check for this + # no-undef: error ## Disallow initializing variables to undefined no-undef-init: error ## Disallow the use of undefined as an identifier @@ -507,7 +507,7 @@ rules: ## Require braces around arrow function bodies # arrow-body-style: error ## Require parentheses around arrow function arguments - arrow-parens: [error, as-needed] + # arrow-parens: [error, as-needed] ## Enforce consistent spacing before and after the arrow in arrow functions arrow-spacing: [error, { before: true, after: true }] ## Require super() calls in constructors @@ -583,7 +583,7 @@ rules: ## Rule enforces consistent usage of destructuring assignment in component # react/destructuring-assignment: [error, always, { ignoreClassFields: true }] ## Prevent missing displayName in a React component definition - react/display-name: error + # react/display-name: error ## Forbid certain props on Components # react/forbid-component-props: error ## Forbid certain props on DOM Nodes diff --git a/tgui/.gitattributes b/tgui/.gitattributes index d9cdc20fbdbc5..71550f35c1c85 100644 --- a/tgui/.gitattributes +++ b/tgui/.gitattributes @@ -18,3 +18,5 @@ bin/tgui text eol=lf ## Treat bundles as binary and ignore them during conflicts *.bundle.* binary merge=tgui-merge-bundle *.chunk.* binary merge=tgui-merge-bundle +.yarn/releases/**/* binary +.yarn/plugins/**/* binary diff --git a/tgui/.gitignore b/tgui/.gitignore index 4dbb04220b63b..bb1f522883ceb 100644 --- a/tgui/.gitignore +++ b/tgui/.gitignore @@ -10,14 +10,13 @@ package-lock.json !/.yarn/plugins !/.yarn/sdks !/.yarn/versions +!/.yarn/lock.yml ## Build artifacts /public/.tmp/**/* -/public/**/*.hot-update.* -/public/**/*.map +/public/**/* +!/public/*.html ## Previously ignored locations that are kept to avoid confusing git ## while transitioning to a new project structure. -/packages/tgui/public/.tmp/**/* -/packages/tgui/public/**/*.hot-update.* -/packages/tgui/public/**/*.map +/packages/tgui/public/** diff --git a/tgui/.prettierrc.yml b/tgui/.prettierrc.yml new file mode 100644 index 0000000000000..fe51f01cc4dba --- /dev/null +++ b/tgui/.prettierrc.yml @@ -0,0 +1,12 @@ +arrowParens: always +bracketSpacing: true +endOfLine: lf +jsxBracketSameLine: true +jsxSingleQuote: false +printWidth: 80 +proseWrap: preserve +quoteProps: preserve +semi: true +singleQuote: true +tabWidth: 2 +trailingComma: es5 diff --git a/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs b/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs new file mode 100644 index 0000000000000..e64e6dda163b3 --- /dev/null +++ b/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs @@ -0,0 +1,77 @@ +/* eslint-disable */ +module.exports = { +name: "@yarnpkg/plugin-interactive-tools", +factory: function (require) { +var plugin;plugin=(()=>{var __webpack_modules__={7560:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>K});function r(e,t,n,r){var i,o=arguments.length,u=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)u=Reflect.decorate(e,t,n,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(u=(o<3?i(u):o>3?i(t,n,u):i(t,n))||u);return o>3&&u&&Object.defineProperty(t,n,u),u}const i=require("@yarnpkg/cli"),o=require("@yarnpkg/core");var u=n(9245),a=n(7382);const l=(0,a.memo)(({active:e})=>{const t=(0,a.useMemo)(()=>e?"â—‰":"â—¯",[e]),n=(0,a.useMemo)(()=>e?"green":"yellow",[e]);return a.createElement(u.Text,{color:n},t)});function s({active:e},t,n){const{stdin:r}=(0,u.useStdin)(),i=(0,a.useCallback)((e,n)=>t(e,n),n);(0,a.useEffect)(()=>{if(e&&r)return r.on("keypress",i),()=>{r.off("keypress",i)}},[e,i,r])}var c;!function(e){e.BEFORE="before",e.AFTER="after"}(c||(c={}));const f=function(e,t,{active:n,minus:r,plus:i,set:o,loop:u=!0}){s({active:n},(n,a)=>{const l=t.indexOf(e);switch(a.name){case r:{const e=l-1;if(u)return void o(t[(t.length+e)%t.length]);if(e<0)return;o(t[e])}break;case i:{const e=l+1;if(u)return void o(t[e%t.length]);if(e>=t.length)return;o(t[e])}}},[t,e,i,o,u])},d=({active:e=!0,children:t=[],radius:n=10,size:r=1,loop:i=!0,onFocusRequest:o,willReachEnd:l})=>{const d=a.Children.map(t,e=>(e=>{if(null===e.key)throw new Error("Expected all children to have a key");return e.key})(e)),p=d[0],[h,v]=(0,a.useState)(p),m=d.indexOf(h);(0,a.useEffect)(()=>{d.includes(h)||v(p)},[t]),(0,a.useEffect)(()=>{l&&m>=d.length-2&&l()},[m]),function({active:e},t,n){s({active:e},(e,n)=>{"tab"===n.name&&(n.shift?t(c.BEFORE):t(c.AFTER))},n)}({active:e&&!!o},e=>{null==o||o(e)},[o]),f(h,d,{active:e,minus:"up",plus:"down",set:v,loop:i});let g=m-n,y=m+n;y>d.length&&(g-=y-d.length,y=d.length),g<0&&(y+=-g,g=0),y>=d.length&&(y=d.length-1);const _=[];for(let n=g;n<=y;++n){const i=d[n],o=e&&i===h;_.push(a.createElement(u.Box,{key:i,height:r},a.createElement(u.Box,{marginLeft:1,marginRight:1},a.createElement(u.Text,null,o?a.createElement(u.Text,{color:"cyan",bold:!0},">"):" ")),a.createElement(u.Box,null,a.cloneElement(t[n],{active:o}))))}return a.createElement(u.Box,{flexDirection:"column",width:"100%"},_)},p=require("readline"),h=a.createContext(null),v=({children:e})=>{const{stdin:t,setRawMode:n}=(0,u.useStdin)();(0,a.useEffect)(()=>{n&&n(!0),t&&(0,p.emitKeypressEvents)(t)},[t,n]);const[r,i]=(0,a.useState)(new Map),o=(0,a.useMemo)(()=>({getAll:()=>r,get:e=>r.get(e),set:(e,t)=>i(new Map([...r,[e,t]]))}),[r,i]);return a.createElement(h.Provider,{value:o,children:e})};function m(e,t){const n=(0,a.useContext)(h);if(null===n)throw new Error("Expected this hook to run with a ministore context attached");if(void 0===e)return n.getAll();const r=(0,a.useCallback)(t=>{n.set(e,t)},[e,n.set]);let i=n.get(e);return void 0===i&&(i=t),[i,r]}async function g(e,t){let n;const{waitUntilExit:r}=(0,u.render)(a.createElement(v,null,a.createElement(e,Object.assign({},t,{useSubmit:e=>{const{exit:t}=(0,u.useApp)();s({active:!0},(r,i)=>{"return"===i.name&&(n=e,t())},[t,e])}}))));return await r(),n}const y=require("clipanion");var _=n(7840),b=n(4410);const w={appId:"OFCNCOG2CU",apiKey:"6fe4476ee5a1832882e326b506d14126",indexName:"npm-search"},E=n.n(b)()(w.appId,w.apiKey).initIndex(w.indexName),D=async(e,t=0)=>await E.search(e,{analyticsTags:["yarn-plugin-interactive-tools"],attributesToRetrieve:["name","version","owner","repository","humanDownloadsLast30Days"],page:t,hitsPerPage:10}),S=["regular","dev","peer"];class C extends i.BaseCommand{async execute(){const e=await o.Configuration.find(this.context.cwd,this.context.plugins),t=()=>a.createElement(u.Box,{flexDirection:"row"},a.createElement(u.Box,{flexDirection:"column",width:48},a.createElement(u.Box,null,a.createElement(u.Text,null,"Press ",a.createElement(u.Text,{bold:!0,color:"cyanBright"},""),"/",a.createElement(u.Text,{bold:!0,color:"cyanBright"},"")," to move between packages.")),a.createElement(u.Box,null,a.createElement(u.Text,null,"Press ",a.createElement(u.Text,{bold:!0,color:"cyanBright"},"")," to select a package.")),a.createElement(u.Box,null,a.createElement(u.Text,null,"Press ",a.createElement(u.Text,{bold:!0,color:"cyanBright"},"")," again to change the target."))),a.createElement(u.Box,{flexDirection:"column"},a.createElement(u.Box,{marginLeft:1},a.createElement(u.Text,null,"Press ",a.createElement(u.Text,{bold:!0,color:"cyanBright"},"")," to install the selected packages.")),a.createElement(u.Box,{marginLeft:1},a.createElement(u.Text,null,"Press ",a.createElement(u.Text,{bold:!0,color:"cyanBright"},"")," to abort.")))),n=()=>a.createElement(a.Fragment,null,a.createElement(u.Box,{width:15},a.createElement(u.Text,{bold:!0,underline:!0,color:"gray"},"Owner")),a.createElement(u.Box,{width:11},a.createElement(u.Text,{bold:!0,underline:!0,color:"gray"},"Version")),a.createElement(u.Box,{width:10},a.createElement(u.Text,{bold:!0,underline:!0,color:"gray"},"Downloads"))),r=()=>a.createElement(u.Box,{width:17},a.createElement(u.Text,{bold:!0,underline:!0,color:"gray"},"Target")),i=({hit:t,active:n})=>{const[r,i]=m(t.name,null);s({active:n},(e,t)=>{if("space"!==t.name)return;if(!r)return void i(S[0]);const n=S.indexOf(r)+1;n===S.length?i(null):i(S[n])},[r,i]);const l=o.structUtils.parseIdent(t.name),c=o.structUtils.prettyIdent(e,l);return a.createElement(u.Box,null,a.createElement(u.Box,{width:45},a.createElement(u.Text,{bold:!0,wrap:"wrap"},c)),a.createElement(u.Box,{width:14,marginLeft:1},a.createElement(u.Text,{bold:!0,wrap:"truncate"},t.owner.name)),a.createElement(u.Box,{width:10,marginLeft:1},a.createElement(u.Text,{italic:!0,wrap:"truncate"},t.version)),a.createElement(u.Box,{width:16,marginLeft:1},a.createElement(u.Text,null,t.humanDownloadsLast30Days)))},c=({name:t,active:n})=>{const[r]=m(t,null),i=o.structUtils.parseIdent(t);return a.createElement(u.Box,null,a.createElement(u.Box,{width:47},a.createElement(u.Text,{bold:!0}," - ",o.structUtils.prettyIdent(e,i))),S.map(e=>a.createElement(u.Box,{key:e,width:14,marginLeft:1},a.createElement(u.Text,null," ",a.createElement(l,{active:r===e})," ",a.createElement(u.Text,{bold:!0},e)))))},f=()=>a.createElement(u.Box,{marginTop:1},a.createElement(u.Text,null,"Powered by Algolia.")),p=await g(({useSubmit:e})=>{const o=m();e(o);const l=Array.from(o.keys()).filter(e=>null!==o.get(e)),[s,p]=(0,a.useState)(""),[h,v]=(0,a.useState)(0),[g,y]=(0,a.useState)([]);return(0,a.useEffect)(()=>{s?(async()=>{v(0);const e=await D(s);e.query===s&&y(e.hits)})():y([])},[s]),a.createElement(u.Box,{flexDirection:"column"},a.createElement(t,null),a.createElement(u.Box,{flexDirection:"row",marginTop:1},a.createElement(u.Text,{bold:!0},"Search: "),a.createElement(u.Box,{width:41},a.createElement(_.ZP,{value:s,onChange:e=>{e.match(/\t| /)||p(e)},placeholder:"i.e. babel, webpack, react...",showCursor:!1})),a.createElement(n,null)),g.length?a.createElement(d,{radius:2,loop:!1,children:g.map(e=>a.createElement(i,{key:e.name,hit:e,active:!1})),willReachEnd:async()=>{const e=await D(s,h+1);e.query===s&&e.page-1===h&&(v(e.page),y([...g,...e.hits]))}}):a.createElement(u.Text,{color:"gray"},"Start typing..."),a.createElement(u.Box,{flexDirection:"row",marginTop:1},a.createElement(u.Box,{width:49},a.createElement(u.Text,{bold:!0},"Selected:")),a.createElement(r,null)),l.length?l.map(e=>a.createElement(c,{key:e,name:e,active:!1})):a.createElement(u.Text,{color:"gray"},"No selected packages..."),a.createElement(f,null))},{});if(void 0===p)return 1;const h=Array.from(p.keys()).filter(e=>"regular"===p.get(e)),v=Array.from(p.keys()).filter(e=>"dev"===p.get(e)),y=Array.from(p.keys()).filter(e=>"peer"===p.get(e));return h.length&&await this.cli.run(["add",...h]),v.length&&await this.cli.run(["add","--dev",...v]),y&&await this.cli.run(["add","--peer",...y]),0}}C.usage=y.Command.Usage({category:"Interactive commands",description:"open the search interface",details:"\n This command opens a fullscreen terminal interface where you can search for and install packages from the npm registry.\n ",examples:[["Open the search window","yarn search"]]}),r([y.Command.Path("search")],C.prototype,"execute",null);var k=n(5882),T=n.n(k);const x=({length:e,active:t})=>{if(0===e)return null;const n=e>1?" "+T().underline(" ".repeat(e-1)):" ";return a.createElement(u.Text,{dimColor:!t},n)},A=function({active:e,skewer:t,options:n,value:r,onChange:i,sizes:o=[]}){const s=n.map(({value:e})=>e),c=s.indexOf(r);return f(r,s,{active:e,minus:"left",plus:"right",set:i}),a.createElement(a.Fragment,null,n.map(({label:n},r)=>{const i=r===c,s=o[r]-1||0,f=n.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,""),d=Math.max(0,s-f.length-2);return a.createElement(u.Box,{key:n,width:s,marginLeft:1},a.createElement(u.Text,{wrap:"truncate"},a.createElement(l,{active:i})," ",n),t?a.createElement(x,{active:e,length:d}):null)}))},O=require("@yarnpkg/plugin-essentials");function P(){}function I(e,t,n,r,i){for(var o=0,u=t.length,a=0,l=0;oe.length?n:e})),s.value=e.join(f)}else s.value=e.join(n.slice(a,a+s.count));a+=s.count,s.added||(l+=s.count)}}var d=t[u-1];return u>1&&"string"==typeof d.value&&(d.added||d.removed)&&e.equals("",d.value)&&(t[u-2].value+=d.value,t.pop()),t}function N(e){return{newPos:e.newPos,components:e.components.slice(0)}}P.prototype={diff:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.callback;"function"==typeof n&&(r=n,n={}),this.options=n;var i=this;function o(e){return r?(setTimeout((function(){r(void 0,e)}),0),!0):e}e=this.castInput(e),t=this.castInput(t),e=this.removeEmpty(this.tokenize(e));var u=(t=this.removeEmpty(this.tokenize(t))).length,a=e.length,l=1,s=u+a,c=[{newPos:-1,components:[]}],f=this.extractCommon(c[0],t,e,0);if(c[0].newPos+1>=u&&f+1>=a)return o([{value:this.join(t),count:t.length}]);function d(){for(var n=-1*l;n<=l;n+=2){var r=void 0,s=c[n-1],f=c[n+1],d=(f?f.newPos:0)-n;s&&(c[n-1]=void 0);var p=s&&s.newPos+1=u&&d+1>=a)return o(I(i,r.components,t,e,i.useLongestToken));c[n]=r}else c[n]=void 0}l++}if(r)!function e(){setTimeout((function(){if(l>s)return r();d()||e()}),0)}();else for(;l<=s;){var p=d();if(p)return p}},pushComponent:function(e,t,n){var r=e[e.length-1];r&&r.added===t&&r.removed===n?e[e.length-1]={count:r.count+1,added:t,removed:n}:e.push({count:1,added:t,removed:n})},extractCommon:function(e,t,n,r){for(var i=t.length,o=n.length,u=e.newPos,a=u-r,l=0;u+1=?)?)([0-9]+)(\.[0-9]+)(\.[0-9]+)((?:-\S+)?)$/;class Y extends i.BaseCommand{async execute(){const e=await o.Configuration.find(this.context.cwd,this.context.plugins),{project:t,workspace:n}=await o.Project.find(e,this.context.cwd),r=await o.Cache.find(e);if(!n)throw new i.WorkspaceRequiredError(t.cwd,this.context.cwd);const l=(t,n)=>{const r=(i=t,u=n,a=M(a,{ignoreWhitespace:!0}),L.diff(i,u,a));var i,u,a;let l="";for(const t of r)t.added?l+=o.formatUtils.pretty(e,t.value,"green"):t.removed||(l+=t.value);return l},s=(t,n)=>{if(t===n)return n;const r=o.structUtils.parseRange(t),i=o.structUtils.parseRange(n),u=r.selector.match($),a=i.selector.match($);if(!u||!a)return l(t,n);const s=["gray","red","yellow","green","magenta"];let c=null,f="";for(let t=1;t{const u=await O.suggestUtils.fetchDescriptorFrom(e,o,{project:t,cache:r,preserveModifier:i,workspace:n});return null!==u?u.range:e.range},f=()=>a.createElement(u.Box,{flexDirection:"row"},a.createElement(u.Box,{flexDirection:"column",width:49},a.createElement(u.Box,{marginLeft:1},a.createElement(u.Text,null,"Press ",a.createElement(u.Text,{bold:!0,color:"cyanBright"},""),"/",a.createElement(u.Text,{bold:!0,color:"cyanBright"},"")," to select packages.")),a.createElement(u.Box,{marginLeft:1},a.createElement(u.Text,null,"Press ",a.createElement(u.Text,{bold:!0,color:"cyanBright"},""),"/",a.createElement(u.Text,{bold:!0,color:"cyanBright"},"")," to select versions."))),a.createElement(u.Box,{flexDirection:"column"},a.createElement(u.Box,{marginLeft:1},a.createElement(u.Text,null,"Press ",a.createElement(u.Text,{bold:!0,color:"cyanBright"},"")," to install.")),a.createElement(u.Box,{marginLeft:1},a.createElement(u.Text,null,"Press ",a.createElement(u.Text,{bold:!0,color:"cyanBright"},"")," to abort.")))),p=()=>a.createElement(u.Box,{flexDirection:"row",paddingTop:1,paddingBottom:1},a.createElement(u.Box,{width:50},a.createElement(u.Text,{bold:!0},a.createElement(u.Text,{color:"greenBright"},"?")," Pick the packages you want to upgrade.")),a.createElement(u.Box,{width:17},a.createElement(u.Text,{bold:!0,underline:!0,color:"gray"},"Current")),a.createElement(u.Box,{width:17},a.createElement(u.Text,{bold:!0,underline:!0,color:"gray"},"Range")),a.createElement(u.Box,{width:17},a.createElement(u.Text,{bold:!0,underline:!0,color:"gray"},"Latest"))),h=({active:t,descriptor:n,suggestions:r})=>{const[i,l]=m(n.descriptorHash,null),s=o.structUtils.stringifyIdent(n),c=Math.max(0,45-s.length);return a.createElement(a.Fragment,null,a.createElement(u.Box,null,a.createElement(u.Box,{width:45},a.createElement(u.Text,{bold:!0},o.structUtils.prettyIdent(e,n)),a.createElement(x,{active:t,length:c})),null!==r?a.createElement(A,{active:t,options:r,value:i,skewer:!0,onChange:l,sizes:[17,17,17]}):a.createElement(u.Box,{marginLeft:2},a.createElement(u.Text,{color:"gray"},"Fetching suggestions..."))))},v=({dependencies:e})=>{const[t,n]=(0,a.useState)(null),r=(0,a.useRef)(!0);return(0,a.useEffect)(()=>()=>{r.current=!1}),(0,a.useEffect)(()=>{Promise.all(e.map(e=>(async e=>{const t=G().valid(e.range)?"^"+e.range:e.range,[n,r]=await Promise.all([c(e,e.range,t).catch(()=>null),c(e,e.range,"latest").catch(()=>null)]),i=[{value:null,label:e.range}];return n&&n!==e.range&&i.push({value:n,label:s(e.range,n)}),r&&r!==n&&r!==e.range&&i.push({value:r,label:s(e.range,r)}),i})(e))).then(t=>{const i=e.map((e,n)=>[e,t[n]]).filter(([e,t])=>t.length>1);r.current&&n(i)})},[]),t?t.length?a.createElement(d,{radius:10,children:t.map(([e,t])=>a.createElement(h,{key:e.descriptorHash,active:!1,descriptor:e,suggestions:t}))}):a.createElement(u.Text,null,"No upgrades found"):a.createElement(u.Text,null,"Fetching suggestions...")},y=await g(({useSubmit:e})=>{e(m());const n=new Map;for(const e of t.workspaces)for(const r of["dependencies","devDependencies"])for(const i of e.manifest[r].values())null===t.tryWorkspaceByDescriptor(i)&&n.set(i.descriptorHash,i);const r=o.miscUtils.sortMap(n.values(),e=>o.structUtils.stringifyDescriptor(e));return a.createElement(u.Box,{flexDirection:"column"},a.createElement(f,null),a.createElement(p,null),a.createElement(v,{dependencies:r}))},{});if(void 0===y)return 1;let _=!1;for(const e of t.workspaces)for(const t of["dependencies","devDependencies"]){const n=e.manifest[t];for(const e of n.values()){const t=y.get(e.descriptorHash);null!=t&&(n.set(e.identHash,o.structUtils.makeDescriptor(e,t)),_=!0)}}if(!_)return 0;return(await o.StreamReport.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async e=>{await t.install({cache:r,report:e})})).exitCode()}}Y.usage=y.Command.Usage({category:"Interactive commands",description:"open the upgrade interface",details:"\n This command opens a fullscreen terminal interface where you can see any out of date packages used by your application, their status compared to the latest versions available on the remote registry, and select packages to upgrade.\n ",examples:[["Open the upgrade window","yarn upgrade-interactive"]]}),r([y.Command.Path("upgrade-interactive")],Y.prototype,"execute",null);const K={commands:[C,Y]}},7840:(e,t,n)=>{"use strict";const r=n(7382),i=n(7382),o=n(9245),u=n(1525),a=({value:e,placeholder:t="",focus:n=!0,mask:a,highlightPastedText:l=!1,showCursor:s=!0,onChange:c,onSubmit:f})=>{const[{cursorOffset:d,cursorWidth:p},h]=i.useState({cursorOffset:(e||"").length,cursorWidth:0});i.useEffect(()=>{h(t=>{if(!n||!s)return t;const r=e||"";return t.cursorOffset>r.length-1?{cursorOffset:r.length,cursorWidth:0}:t})},[e,n,s]);const v=l?p:0,m=a?a.repeat(e.length):e;let g=m,y=t?u.grey(t):void 0;if(s&&n){y=t.length>0?u.inverse(t[0])+u.grey(t.slice(1)):u.inverse(" "),g=m.length>0?"":u.inverse(" ");let e=0;for(const t of m)g+=e>=d-v&&e<=d?u.inverse(t):t,e++;m.length>0&&d===m.length&&(g+=u.inverse(" "))}return o.useInput((t,n)=>{if(n.upArrow||n.downArrow||n.ctrl&&"c"===t||n.tab||n.shift&&n.tab)return;if(n.return)return void(f&&f(e));let r=d,i=e,o=0;n.leftArrow?s&&r--:n.rightArrow?s&&r++:n.backspace||n.delete?d>0&&(i=e.slice(0,d-1)+e.slice(d,e.length),r--):(i=e.slice(0,d)+t+e.slice(d,e.length),r+=t.length,t.length>1&&(o=t.length)),d<0&&(r=0),d>e.length&&(r=e.length),h({cursorOffset:r,cursorWidth:o}),i!==e&&c(i)},{isActive:n}),r.createElement(o.Text,null,t?m.length>0?g:y:g)};t.ZP=a},9902:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(1525)),o=/^(rgb|hsl|hsv|hwb)\(\s?(\d+),\s?(\d+),\s?(\d+)\s?\)$/,u=/^(ansi|ansi256)\(\s?(\d+)\s?\)$/,a=(e,t)=>"foreground"===t?e:"bg"+e[0].toUpperCase()+e.slice(1);t.default=(e,t,n)=>{if(!t)return e;if(t in i.default){const r=a(t,n);return i.default[r](e)}if(t.startsWith("#")){const r=a("hex",n);return i.default[r](t)(e)}if(t.startsWith("ansi")){const r=u.exec(t);if(!r)return e;const o=a(r[1],n),l=Number(r[2]);return i.default[o](l)(e)}if(t.startsWith("rgb")||t.startsWith("hsl")||t.startsWith("hsv")||t.startsWith("hwb")){const r=o.exec(t);if(!r)return e;const u=a(r[1],n),l=Number(r[2]),s=Number(r[3]),c=Number(r[4]);return i.default[u](l,s,c)(e)}return e}},2773:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.hasOwnProperty.call(e,n)&&r(t,e,n);return i(t,e),t},u=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const a=o(n(7382)),l=u(n(1696)),s=u(n(5512)),c=u(n(1489)),f=u(n(6834)),d=u(n(5001)),p=u(n(2560)),h=u(n(9052));class v extends a.PureComponent{constructor(){super(...arguments),this.state={isFocusEnabled:!0,activeFocusId:void 0,focusables:[],error:void 0},this.rawModeEnabledCount=0,this.handleSetRawMode=e=>{const{stdin:t}=this.props;if(!this.isRawModeSupported())throw t===process.stdin?new Error("Raw mode is not supported on the current process.stdin, which Ink uses as input stream by default.\nRead about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported"):new Error("Raw mode is not supported on the stdin provided to Ink.\nRead about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported");if(t.setEncoding("utf8"),e)return 0===this.rawModeEnabledCount&&(t.addListener("data",this.handleInput),t.resume(),t.setRawMode(!0)),void this.rawModeEnabledCount++;0==--this.rawModeEnabledCount&&(t.setRawMode(!1),t.removeListener("data",this.handleInput),t.pause())},this.handleInput=e=>{""===e&&this.props.exitOnCtrlC&&this.handleExit(),""===e&&this.state.activeFocusId&&this.setState({activeFocusId:void 0}),this.state.isFocusEnabled&&this.state.focusables.length>0&&("\t"===e&&this.focusNext(),""===e&&this.focusPrevious())},this.handleExit=e=>{this.isRawModeSupported()&&this.handleSetRawMode(!1),this.props.onExit(e)},this.enableFocus=()=>{this.setState({isFocusEnabled:!0})},this.disableFocus=()=>{this.setState({isFocusEnabled:!1})},this.focusNext=()=>{this.setState(e=>{const t=e.focusables[0].id;return{activeFocusId:this.findNextFocusable(e)||t}})},this.focusPrevious=()=>{this.setState(e=>{const t=e.focusables[e.focusables.length-1].id;return{activeFocusId:this.findPreviousFocusable(e)||t}})},this.addFocusable=(e,{autoFocus:t})=>{this.setState(n=>{let r=n.activeFocusId;return!r&&t&&(r=e),{activeFocusId:r,focusables:[...n.focusables,{id:e,isActive:!0}]}})},this.removeFocusable=e=>{this.setState(t=>({activeFocusId:t.activeFocusId===e?void 0:t.activeFocusId,focusables:t.focusables.filter(t=>t.id!==e)}))},this.activateFocusable=e=>{this.setState(t=>({focusables:t.focusables.map(t=>t.id!==e?t:{id:e,isActive:!0})}))},this.deactivateFocusable=e=>{this.setState(t=>({activeFocusId:t.activeFocusId===e?void 0:t.activeFocusId,focusables:t.focusables.map(t=>t.id!==e?t:{id:e,isActive:!1})}))},this.findNextFocusable=e=>{for(let t=e.focusables.findIndex(t=>t.id===e.activeFocusId)+1;t{for(let t=e.focusables.findIndex(t=>t.id===e.activeFocusId)-1;t>=0;t--)if(e.focusables[t].isActive)return e.focusables[t].id}}static getDerivedStateFromError(e){return{error:e}}isRawModeSupported(){return this.props.stdin.isTTY}render(){return a.default.createElement(s.default.Provider,{value:{exit:this.handleExit}},a.default.createElement(c.default.Provider,{value:{stdin:this.props.stdin,setRawMode:this.handleSetRawMode,isRawModeSupported:this.isRawModeSupported(),internal_exitOnCtrlC:this.props.exitOnCtrlC}},a.default.createElement(f.default.Provider,{value:{stdout:this.props.stdout,write:this.props.writeToStdout}},a.default.createElement(d.default.Provider,{value:{stderr:this.props.stderr,write:this.props.writeToStderr}},a.default.createElement(p.default.Provider,{value:{activeId:this.state.activeFocusId,add:this.addFocusable,remove:this.removeFocusable,activate:this.activateFocusable,deactivate:this.deactivateFocusable,enableFocus:this.enableFocus,disableFocus:this.disableFocus,focusNext:this.focusNext,focusPrevious:this.focusPrevious}},this.state.error?a.default.createElement(h.default,{error:this.state.error}):this.props.children)))))}componentDidMount(){l.default.hide(this.props.stdout)}componentWillUnmount(){l.default.show(this.props.stdout),this.isRawModeSupported()&&this.handleSetRawMode(!1)}componentDidCatch(e){this.handleExit(e)}}t.default=v,v.displayName="InternalApp"},5512:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(7382).createContext({exit:()=>{}});r.displayName="InternalAppContext",t.default=r},5277:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.hasOwnProperty.call(e,n)&&r(t,e,n);return i(t,e),t},u=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(r=Object.getOwnPropertySymbols(e);i{var{children:n}=e,r=u(e,["children"]);const i=Object.assign(Object.assign({},r),{marginLeft:r.marginLeft||r.marginX||r.margin||0,marginRight:r.marginRight||r.marginX||r.margin||0,marginTop:r.marginTop||r.marginY||r.margin||0,marginBottom:r.marginBottom||r.marginY||r.margin||0,paddingLeft:r.paddingLeft||r.paddingX||r.padding||0,paddingRight:r.paddingRight||r.paddingX||r.padding||0,paddingTop:r.paddingTop||r.paddingY||r.padding||0,paddingBottom:r.paddingBottom||r.paddingY||r.padding||0});return a.default.createElement("ink-box",{ref:t,style:i},n)});l.displayName="Box",l.defaultProps={flexDirection:"row",flexGrow:0,flexShrink:1},t.default=l},9052:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.hasOwnProperty.call(e,n)&&r(t,e,n);return i(t,e),t},u=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const a=o(n(5747)),l=u(n(7382)),s=u(n(9796)),c=u(n(9908)),f=u(n(5277)),d=u(n(9146)),p=new s.default({cwd:process.cwd(),internals:s.default.nodeInternals()});t.default=({error:e})=>{const t=e.stack?e.stack.split("\n").slice(1):void 0,n=t?p.parseLine(t[0]):void 0;let r,i=0;if((null==n?void 0:n.file)&&(null==n?void 0:n.line)&&a.existsSync(n.file)){const e=a.readFileSync(n.file,"utf8");if(r=c.default(e,n.line),r)for(const{line:e}of r)i=Math.max(i,String(e).length)}return l.default.createElement(f.default,{flexDirection:"column",padding:1},l.default.createElement(f.default,null,l.default.createElement(d.default,{backgroundColor:"red",color:"white"}," ","ERROR"," "),l.default.createElement(d.default,null," ",e.message)),n&&l.default.createElement(f.default,{marginTop:1},l.default.createElement(d.default,{dimColor:!0},n.file,":",n.line,":",n.column)),n&&r&&l.default.createElement(f.default,{marginTop:1,flexDirection:"column"},r.map(({line:e,value:t})=>l.default.createElement(f.default,{key:e},l.default.createElement(f.default,{width:i+1},l.default.createElement(d.default,{dimColor:e!==n.line,backgroundColor:e===n.line?"red":void 0,color:e===n.line?"white":void 0},String(e).padStart(i," "),":")),l.default.createElement(d.default,{key:e,backgroundColor:e===n.line?"red":void 0,color:e===n.line?"white":void 0}," "+t)))),e.stack&&l.default.createElement(f.default,{marginTop:1,flexDirection:"column"},e.stack.split("\n").slice(1).map(e=>{const t=p.parseLine(e);return t?l.default.createElement(f.default,{key:e},l.default.createElement(d.default,{dimColor:!0},"- "),l.default.createElement(d.default,{dimColor:!0,bold:!0},t.function),l.default.createElement(d.default,{dimColor:!0,color:"gray"}," ","(",t.file,":",t.line,":",t.column,")")):l.default.createElement(f.default,{key:e},l.default.createElement(d.default,{dimColor:!0},"- "),l.default.createElement(d.default,{dimColor:!0,bold:!0},e))})))}},2560:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(7382).createContext({activeId:void 0,add:()=>{},remove:()=>{},activate:()=>{},deactivate:()=>{},enableFocus:()=>{},disableFocus:()=>{},focusNext:()=>{},focusPrevious:()=>{}});r.displayName="InternalFocusContext",t.default=r},8200:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(7382)),o=({count:e=1})=>i.default.createElement("ink-text",null,"\n".repeat(e));o.displayName="Newline",t.default=o},2198:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(7382)),o=r(n(5277)),u=()=>i.default.createElement(o.default,{flexGrow:1});u.displayName="Spacer",t.default=u},8915:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.hasOwnProperty.call(e,n)&&r(t,e,n);return i(t,e),t};Object.defineProperty(t,"__esModule",{value:!0});const u=o(n(7382)),a=e=>{const{items:t,children:n,style:r}=e,[i,o]=u.useState(0),a=u.useMemo(()=>t.slice(i),[t,i]);u.useLayoutEffect(()=>{o(t.length)},[t.length]);const l=a.map((e,t)=>n(e,i+t)),s=u.useMemo(()=>Object.assign({position:"absolute",flexDirection:"column"},r),[r]);return u.default.createElement("ink-box",{internal_static:!0,style:s},l)};a.displayName="Static",t.default=a},5001:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(7382).createContext({stderr:void 0,write:()=>{}});r.displayName="InternalStderrContext",t.default=r},1489:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(7382).createContext({stdin:void 0,setRawMode:()=>{},isRawModeSupported:!1,internal_exitOnCtrlC:!0});r.displayName="InternalStdinContext",t.default=r},6834:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(7382).createContext({stdout:void 0,write:()=>{}});r.displayName="InternalStdoutContext",t.default=r},9146:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(7382)),o=r(n(1525)),u=r(n(9902)),a=({color:e,backgroundColor:t,dimColor:n,bold:r,italic:a,underline:l,strikethrough:s,inverse:c,wrap:f,children:d})=>{if(null==d)return null;return i.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row",textWrap:f},internal_transform:i=>(n&&(i=o.default.dim(i)),e&&(i=u.default(i,e,"foreground")),t&&(i=u.default(i,t,"background")),r&&(i=o.default.bold(i)),a&&(i=o.default.italic(i)),l&&(i=o.default.underline(i)),s&&(i=o.default.strikethrough(i)),c&&(i=o.default.inverse(i)),i)},d)};a.displayName="Text",a.defaultProps={dimColor:!1,bold:!1,italic:!1,underline:!1,strikethrough:!1,wrap:"wrap"},t.default=a},4592:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(7382)),o=({children:e,transform:t})=>null==e?null:i.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row"},internal_transform:t},e);o.displayName="Transform",t.default=o},146:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(3296)),o=n(5187),u=global;u.WebSocket||(u.WebSocket=i.default),u.window||(u.window=global),u.window.__REACT_DEVTOOLS_COMPONENT_FILTERS__=[{type:1,value:7,isEnabled:!0},{type:2,value:"InternalApp",isEnabled:!0,isValid:!0},{type:2,value:"InternalAppContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalStdoutContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalStderrContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalStdinContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalFocusContext",isEnabled:!0,isValid:!0}],o.connectToDevTools()},9864:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.setTextNodeValue=t.createTextNode=t.setStyle=t.setAttribute=t.removeChildNode=t.insertBeforeNode=t.appendChildNode=t.createNode=t.TEXT_NAME=void 0;const i=r(n(6401)),o=r(n(8113)),u=r(n(5809)),a=r(n(2030)),l=r(n(9099));t.TEXT_NAME="#text",t.createNode=e=>{var t;const n={nodeName:e,style:{},attributes:{},childNodes:[],parentNode:null,yogaNode:"ink-virtual-text"===e?void 0:i.default.Node.create()};return"ink-text"===e&&(null===(t=n.yogaNode)||void 0===t||t.setMeasureFunc(s.bind(null,n))),n},t.appendChildNode=(e,n)=>{var r;n.parentNode&&t.removeChildNode(n.parentNode,n),n.parentNode=e,e.childNodes.push(n),n.yogaNode&&(null===(r=e.yogaNode)||void 0===r||r.insertChild(n.yogaNode,e.yogaNode.getChildCount())),"ink-text"!==e.nodeName&&"ink-virtual-text"!==e.nodeName||f(e)},t.insertBeforeNode=(e,n,r)=>{var i,o;n.parentNode&&t.removeChildNode(n.parentNode,n),n.parentNode=e;const u=e.childNodes.indexOf(r);if(u>=0)return e.childNodes.splice(u,0,n),void(n.yogaNode&&(null===(i=e.yogaNode)||void 0===i||i.insertChild(n.yogaNode,u)));e.childNodes.push(n),n.yogaNode&&(null===(o=e.yogaNode)||void 0===o||o.insertChild(n.yogaNode,e.yogaNode.getChildCount())),"ink-text"!==e.nodeName&&"ink-virtual-text"!==e.nodeName||f(e)},t.removeChildNode=(e,t)=>{var n,r;t.yogaNode&&(null===(r=null===(n=t.parentNode)||void 0===n?void 0:n.yogaNode)||void 0===r||r.removeChild(t.yogaNode)),t.parentNode=null;const i=e.childNodes.indexOf(t);i>=0&&e.childNodes.splice(i,1),"ink-text"!==e.nodeName&&"ink-virtual-text"!==e.nodeName||f(e)},t.setAttribute=(e,t,n)=>{e.attributes[t]=n},t.setStyle=(e,t)=>{e.style=t,e.yogaNode&&u.default(e.yogaNode,t)},t.createTextNode=e=>{const n={nodeName:"#text",nodeValue:e,yogaNode:void 0,parentNode:null,style:{}};return t.setTextNodeValue(n,e),n};const s=function(e,t){var n,r;const i="#text"===e.nodeName?e.nodeValue:l.default(e),u=o.default(i);if(u.width<=t)return u;if(u.width>=1&&t>0&&t<1)return u;const s=null!==(r=null===(n=e.style)||void 0===n?void 0:n.textWrap)&&void 0!==r?r:"wrap",c=a.default(i,t,s);return o.default(c)},c=e=>{var t;if(e&&e.parentNode)return null!==(t=e.yogaNode)&&void 0!==t?t:c(e.parentNode)},f=e=>{const t=c(e);null==t||t.markDirty()};t.setTextNodeValue=(e,t)=>{"string"!=typeof t&&(t=String(t)),e.nodeValue=t,f(e)}},317:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(6401));t.default=e=>e.getComputedWidth()-e.getComputedPadding(i.default.EDGE_LEFT)-e.getComputedPadding(i.default.EDGE_RIGHT)-e.getComputedBorder(i.default.EDGE_LEFT)-e.getComputedBorder(i.default.EDGE_RIGHT)},4699:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=n(7382),o=r(n(5512));t.default=()=>i.useContext(o.default)},5442:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=n(7382),o=r(n(2560));t.default=()=>{const e=i.useContext(o.default);return{enableFocus:e.enableFocus,disableFocus:e.disableFocus,focusNext:e.focusNext,focusPrevious:e.focusPrevious}}},8230:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=n(7382),o=r(n(2560)),u=r(n(1541));t.default=({isActive:e=!0,autoFocus:t=!1}={})=>{const{isRawModeSupported:n,setRawMode:r}=u.default(),{activeId:a,add:l,remove:s,activate:c,deactivate:f}=i.useContext(o.default),d=i.useMemo(()=>Math.random().toString().slice(2,7),[]);return i.useEffect(()=>(l(d,{autoFocus:t}),()=>{s(d)}),[d,t]),i.useEffect(()=>{e?c(d):f(d)},[e,d]),i.useEffect(()=>{if(n&&e)return r(!0),()=>{r(!1)}},[e]),{isFocused:Boolean(d)&&a===d}}},4495:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=n(7382),o=r(n(1541));t.default=(e,t={})=>{const{stdin:n,setRawMode:r,internal_exitOnCtrlC:u}=o.default();i.useEffect(()=>{if(!1!==t.isActive)return r(!0),()=>{r(!1)}},[t.isActive,r]),i.useEffect(()=>{if(!1===t.isActive)return;const r=t=>{let n=String(t);const r={upArrow:""===n,downArrow:""===n,leftArrow:""===n,rightArrow:""===n,pageDown:"[6~"===n,pageUp:"[5~"===n,return:"\r"===n,escape:""===n,ctrl:!1,shift:!1,tab:"\t"===n||""===n,backspace:"\b"===n,delete:""===n||"[3~"===n,meta:!1};n<=""&&!r.return&&(n=String.fromCharCode(n.charCodeAt(0)+"a".charCodeAt(0)-1),r.ctrl=!0),n.startsWith("")&&(n=n.slice(1),r.meta=!0);const i=n>="A"&&n<="Z",o=n>="Ð"&&n<="Я";1===n.length&&(i||o)&&(r.shift=!0),r.tab&&"[Z"===n&&(r.shift=!0),(r.tab||r.backspace||r.delete)&&(n=""),"c"===n&&r.ctrl&&u||e(n,r)};return null==n||n.on("data",r),()=>{null==n||n.off("data",r)}},[t.isActive,n,u,e])}},1686:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=n(7382),o=r(n(5001));t.default=()=>i.useContext(o.default)},1541:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=n(7382),o=r(n(1489));t.default=()=>i.useContext(o.default)},9890:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=n(7382),o=r(n(6834));t.default=()=>i.useContext(o.default)},9245:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(9417);Object.defineProperty(t,"render",{enumerable:!0,get:function(){return r.default}});var i=n(5277);Object.defineProperty(t,"Box",{enumerable:!0,get:function(){return i.default}});var o=n(9146);Object.defineProperty(t,"Text",{enumerable:!0,get:function(){return o.default}});var u=n(8915);Object.defineProperty(t,"Static",{enumerable:!0,get:function(){return u.default}});var a=n(4592);Object.defineProperty(t,"Transform",{enumerable:!0,get:function(){return a.default}});var l=n(8200);Object.defineProperty(t,"Newline",{enumerable:!0,get:function(){return l.default}});var s=n(2198);Object.defineProperty(t,"Spacer",{enumerable:!0,get:function(){return s.default}});var c=n(4495);Object.defineProperty(t,"useInput",{enumerable:!0,get:function(){return c.default}});var f=n(4699);Object.defineProperty(t,"useApp",{enumerable:!0,get:function(){return f.default}});var d=n(1541);Object.defineProperty(t,"useStdin",{enumerable:!0,get:function(){return d.default}});var p=n(9890);Object.defineProperty(t,"useStdout",{enumerable:!0,get:function(){return p.default}});var h=n(1686);Object.defineProperty(t,"useStderr",{enumerable:!0,get:function(){return h.default}});var v=n(8230);Object.defineProperty(t,"useFocus",{enumerable:!0,get:function(){return v.default}});var m=n(5442);Object.defineProperty(t,"useFocusManager",{enumerable:!0,get:function(){return m.default}});var g=n(3887);Object.defineProperty(t,"measureElement",{enumerable:!0,get:function(){return g.default}})},3206:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.hasOwnProperty.call(e,n)&&r(t,e,n);return i(t,e),t},u=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const a=u(n(7382)),l=n(464),s=u(n(503)),c=u(n(7589)),f=u(n(2738)),d=u(n(2633)),p=u(n(5117)),h=u(n(5691)),v=u(n(6458)),m=u(n(8070)),g=o(n(9864)),y=u(n(9679)),_=u(n(2773)),b="false"!==process.env.CI&&f.default,w=()=>{};t.default=class{constructor(e){this.resolveExitPromise=()=>{},this.rejectExitPromise=()=>{},this.unsubscribeExit=()=>{},this.onRender=()=>{if(this.isUnmounted)return;const{output:e,outputHeight:t,staticOutput:n}=h.default(this.rootNode,this.options.stdout.columns||80),r=n&&"\n"!==n;return this.options.debug?(r&&(this.fullStaticOutput+=n),void this.options.stdout.write(this.fullStaticOutput+e)):b?(r&&this.options.stdout.write(n),void(this.lastOutput=e)):(r&&(this.fullStaticOutput+=n),t>=this.options.stdout.rows?(this.options.stdout.write(c.default.clearTerminal+this.fullStaticOutput+e),void(this.lastOutput=e)):(r&&(this.log.clear(),this.options.stdout.write(n),this.log(e)),r||e===this.lastOutput||this.throttledLog(e),void(this.lastOutput=e)))},d.default(this),this.options=e,this.rootNode=g.createNode("ink-root"),this.rootNode.onRender=e.debug?this.onRender:l.throttle(this.onRender,32,{leading:!0,trailing:!0}),this.rootNode.onImmediateRender=this.onRender,this.log=s.default.create(e.stdout),this.throttledLog=e.debug?this.log:l.throttle(this.log,void 0,{leading:!0,trailing:!0}),this.isUnmounted=!1,this.lastOutput="",this.fullStaticOutput="",this.container=p.default.createContainer(this.rootNode,!1,!1),this.unsubscribeExit=v.default(this.unmount,{alwaysLast:!1}),"true"===process.env.DEV&&p.default.injectIntoDevTools({bundleType:0,version:"16.13.1",rendererPackageName:"ink"}),e.patchConsole&&this.patchConsole(),b||(e.stdout.on("resize",this.onRender),this.unsubscribeResize=()=>{e.stdout.off("resize",this.onRender)})}render(e){const t=a.default.createElement(_.default,{stdin:this.options.stdin,stdout:this.options.stdout,stderr:this.options.stderr,writeToStdout:this.writeToStdout,writeToStderr:this.writeToStderr,exitOnCtrlC:this.options.exitOnCtrlC,onExit:this.unmount},e);p.default.updateContainer(t,this.container,null,w)}writeToStdout(e){this.isUnmounted||(this.options.debug?this.options.stdout.write(e+this.fullStaticOutput+this.lastOutput):b?this.options.stdout.write(e):(this.log.clear(),this.options.stdout.write(e),this.log(this.lastOutput)))}writeToStderr(e){if(!this.isUnmounted)return this.options.debug?(this.options.stderr.write(e),void this.options.stdout.write(this.fullStaticOutput+this.lastOutput)):void(b?this.options.stderr.write(e):(this.log.clear(),this.options.stderr.write(e),this.log(this.lastOutput)))}unmount(e){this.isUnmounted||(this.onRender(),this.unsubscribeExit(),"function"==typeof this.restoreConsole&&this.restoreConsole(),"function"==typeof this.unsubscribeResize&&this.unsubscribeResize(),b?this.options.stdout.write(this.lastOutput+"\n"):this.options.debug||this.log.done(),this.isUnmounted=!0,p.default.updateContainer(null,this.container,null,w),y.default.delete(this.options.stdout),e instanceof Error?this.rejectExitPromise(e):this.resolveExitPromise())}waitUntilExit(){return this.exitPromise||(this.exitPromise=new Promise((e,t)=>{this.resolveExitPromise=e,this.rejectExitPromise=t})),this.exitPromise}clear(){b||this.options.debug||this.log.clear()}patchConsole(){this.options.debug||(this.restoreConsole=m.default((e,t)=>{if("stdout"===e&&this.writeToStdout(t),"stderr"===e){t.startsWith("The above error occurred")||this.writeToStderr(t)}}))}}},9679:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=new WeakMap},503:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(7589)),o=r(n(1696));t.default={create:(e,{showCursor:t=!1}={})=>{let n=0,r="",u=!1;const a=a=>{t||u||(o.default.hide(),u=!0);const l=a+"\n";l!==r&&(r=l,e.write(i.default.eraseLines(n)+l),n=l.split("\n").length)};return a.clear=()=>{e.write(i.default.eraseLines(n)),r="",n=0},a.done=()=>{r="",n=0,t||(o.default.show(),u=!1)},a}}},3887:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=e=>{var t,n,r,i;return{width:null!==(n=null===(t=e.yogaNode)||void 0===t?void 0:t.getComputedWidth())&&void 0!==n?n:0,height:null!==(i=null===(r=e.yogaNode)||void 0===r?void 0:r.getComputedHeight())&&void 0!==i?i:0}}},8113:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(8949)),o={};t.default=e=>{if(0===e.length)return{width:0,height:0};if(o[e])return o[e];const t=i.default(e),n=e.split("\n").length;return o[e]={width:t,height:n},{width:t,height:n}}},4110:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(1566)),o=r(n(3262));t.default=class{constructor(e){this.writes=[];const{width:t,height:n}=e;this.width=t,this.height=n}write(e,t,n,r){const{transformers:i}=r;n&&this.writes.push({x:e,y:t,text:n,transformers:i})}get(){const e=[];for(let t=0;te.trimRight()).join("\n"),height:e.length}}}},5117:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=n(7181),o=r(n(7714)),u=r(n(6401)),a=n(9864);"true"===process.env.DEV&&n(146);const l=e=>{null==e||e.unsetMeasureFunc(),null==e||e.freeRecursive()};t.default=o.default({schedulePassiveEffects:i.unstable_scheduleCallback,cancelPassiveEffects:i.unstable_cancelCallback,now:Date.now,getRootHostContext:()=>({isInsideText:!1}),prepareForCommit:()=>{},resetAfterCommit:e=>{if(e.isStaticDirty)return e.isStaticDirty=!1,void("function"==typeof e.onImmediateRender&&e.onImmediateRender());"function"==typeof e.onRender&&e.onRender()},getChildHostContext:(e,t)=>{const n="ink-text"===t||"ink-virtual-text"===t;return e.isInsideText===n?e:{isInsideText:n}},shouldSetTextContent:()=>!1,createInstance:(e,t,n,r)=>{if(r.isInsideText&&"ink-box"===e)throw new Error(" can’t be nested inside component");const i="ink-text"===e&&r.isInsideText?"ink-virtual-text":e,o=a.createNode(i);for(const[e,n]of Object.entries(t))"children"!==e&&("style"===e?a.setStyle(o,n):"internal_transform"===e?o.internal_transform=n:"internal_static"===e?o.internal_static=!0:a.setAttribute(o,e,n));return o},createTextInstance:(e,t,n)=>{if(!n.isInsideText)throw new Error(`Text string "${e}" must be rendered inside component`);return a.createTextNode(e)},resetTextContent:()=>{},hideTextInstance:e=>{a.setTextNodeValue(e,"")},unhideTextInstance:(e,t)=>{a.setTextNodeValue(e,t)},getPublicInstance:e=>e,hideInstance:e=>{var t;null===(t=e.yogaNode)||void 0===t||t.setDisplay(u.default.DISPLAY_NONE)},unhideInstance:e=>{var t;null===(t=e.yogaNode)||void 0===t||t.setDisplay(u.default.DISPLAY_FLEX)},appendInitialChild:a.appendChildNode,appendChild:a.appendChildNode,insertBefore:a.insertBeforeNode,finalizeInitialChildren:(e,t,n,r)=>(e.internal_static&&(r.isStaticDirty=!0,r.staticNode=e),!1),supportsMutation:!0,appendChildToContainer:a.appendChildNode,insertInContainerBefore:a.insertBeforeNode,removeChildFromContainer:(e,t)=>{a.removeChildNode(e,t),l(t.yogaNode)},prepareUpdate:(e,t,n,r,i)=>{e.internal_static&&(i.isStaticDirty=!0);const o={},u=Object.keys(r);for(const e of u)if(r[e]!==n[e]){if("style"===e&&"object"==typeof r.style&&"object"==typeof n.style){const e=r.style,t=n.style,i=Object.keys(e);for(const n of i){if("borderStyle"===n||"borderColor"===n){if("object"!=typeof o.style){const e={};o.style=e}o.style.borderStyle=e.borderStyle,o.style.borderColor=e.borderColor}if(e[n]!==t[n]){if("object"!=typeof o.style){const e={};o.style=e}o.style[n]=e[n]}}continue}o[e]=r[e]}return o},commitUpdate:(e,t)=>{for(const[n,r]of Object.entries(t))"children"!==n&&("style"===n?a.setStyle(e,r):"internal_transform"===n?e.internal_transform=r:"internal_static"===n?e.internal_static=!0:a.setAttribute(e,n,r))},commitTextUpdate:(e,t,n)=>{a.setTextNodeValue(e,n)},removeChild:(e,t)=>{a.removeChildNode(e,t),l(t.yogaNode)}})},4907:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(4097)),o=r(n(9902));t.default=(e,t,n,r)=>{if("string"==typeof n.style.borderStyle){const u=n.yogaNode.getComputedWidth(),a=n.yogaNode.getComputedHeight(),l=n.style.borderColor,s=i.default[n.style.borderStyle],c=o.default(s.topLeft+s.horizontal.repeat(u-2)+s.topRight,l,"foreground"),f=(o.default(s.vertical,l,"foreground")+"\n").repeat(a-2),d=o.default(s.bottomLeft+s.horizontal.repeat(u-2)+s.bottomRight,l,"foreground");r.write(e,t,c,{transformers:[]}),r.write(e,t+1,f,{transformers:[]}),r.write(e+u-1,t+1,f,{transformers:[]}),r.write(e,t+a-1,d,{transformers:[]})}}},3782:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(6401)),o=r(n(8949)),u=r(n(9646)),a=r(n(2030)),l=r(n(317)),s=r(n(9099)),c=r(n(4907)),f=(e,t,n)=>{var r;const{offsetX:d=0,offsetY:p=0,transformers:h=[],skipStaticElements:v}=n;if(v&&e.internal_static)return;const{yogaNode:m}=e;if(m){if(m.getDisplay()===i.default.DISPLAY_NONE)return;const n=d+m.getComputedLeft(),g=p+m.getComputedTop();let y=h;if("function"==typeof e.internal_transform&&(y=[e.internal_transform,...h]),"ink-text"===e.nodeName){let i=s.default(e);if(i.length>0){const s=o.default(i),c=l.default(m);if(s>c){const t=null!==(r=e.style.textWrap)&&void 0!==r?r:"wrap";i=a.default(i,c,t)}i=((e,t)=>{var n;const r=null===(n=e.childNodes[0])||void 0===n?void 0:n.yogaNode;if(r){const e=r.getComputedLeft(),n=r.getComputedTop();t="\n".repeat(n)+u.default(t,e)}return t})(e,i),t.write(n,g,i,{transformers:y})}return}if("ink-box"===e.nodeName&&c.default(n,g,e,t),"ink-root"===e.nodeName||"ink-box"===e.nodeName)for(const r of e.childNodes)f(r,t,{offsetX:n,offsetY:g,transformers:y,skipStaticElements:v})}};t.default=f},9417:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(3206)),o=r(n(9679)),u=n(2413);t.default=(e,t)=>{const n=Object.assign({stdout:process.stdout,stdin:process.stdin,stderr:process.stderr,debug:!1,exitOnCtrlC:!0,patchConsole:!0},a(t)),r=l(n.stdout,()=>new i.default(n));return r.render(e),{rerender:r.render,unmount:()=>r.unmount(),waitUntilExit:r.waitUntilExit,cleanup:()=>o.default.delete(n.stdout),clear:r.clear}};const a=(e={})=>e instanceof u.Stream?{stdout:e,stdin:process.stdin}:e,l=(e,t)=>{let n;return o.default.has(e)?n=o.default.get(e):(n=t(),o.default.set(e,n)),n}},5691:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(6401)),o=r(n(3782)),u=r(n(4110));t.default=(e,t)=>{var n;if(e.yogaNode.setWidth(t),e.yogaNode){e.yogaNode.calculateLayout(void 0,void 0,i.default.DIRECTION_LTR);const t=new u.default({width:e.yogaNode.getComputedWidth(),height:e.yogaNode.getComputedHeight()});let r;o.default(e,t,{skipStaticElements:!0}),(null===(n=e.staticNode)||void 0===n?void 0:n.yogaNode)&&(r=new u.default({width:e.staticNode.yogaNode.getComputedWidth(),height:e.staticNode.yogaNode.getComputedHeight()}),o.default(e.staticNode,r,{skipStaticElements:!1}));const{output:a,height:l}=t.get();return{output:a,outputHeight:l,staticOutput:r?r.get().output+"\n":""}}return{output:"",outputHeight:0,staticOutput:""}}},9099:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=e=>{let t="";if(e.childNodes.length>0)for(const r of e.childNodes){let e="";"#text"===r.nodeName?e=r.nodeValue:("ink-text"!==r.nodeName&&"ink-virtual-text"!==r.nodeName||(e=n(r)),e.length>0&&"function"==typeof r.internal_transform&&(e=r.internal_transform(e))),t+=e}return t};t.default=n},5809:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(6401));t.default=(e,t={})=>{((e,t)=>{"position"in t&&e.setPositionType("absolute"===t.position?i.default.POSITION_TYPE_ABSOLUTE:i.default.POSITION_TYPE_RELATIVE)})(e,t),((e,t)=>{"marginLeft"in t&&e.setMargin(i.default.EDGE_START,t.marginLeft||0),"marginRight"in t&&e.setMargin(i.default.EDGE_END,t.marginRight||0),"marginTop"in t&&e.setMargin(i.default.EDGE_TOP,t.marginTop||0),"marginBottom"in t&&e.setMargin(i.default.EDGE_BOTTOM,t.marginBottom||0)})(e,t),((e,t)=>{"paddingLeft"in t&&e.setPadding(i.default.EDGE_LEFT,t.paddingLeft||0),"paddingRight"in t&&e.setPadding(i.default.EDGE_RIGHT,t.paddingRight||0),"paddingTop"in t&&e.setPadding(i.default.EDGE_TOP,t.paddingTop||0),"paddingBottom"in t&&e.setPadding(i.default.EDGE_BOTTOM,t.paddingBottom||0)})(e,t),((e,t)=>{var n;"flexGrow"in t&&e.setFlexGrow(null!==(n=t.flexGrow)&&void 0!==n?n:0),"flexShrink"in t&&e.setFlexShrink("number"==typeof t.flexShrink?t.flexShrink:1),"flexDirection"in t&&("row"===t.flexDirection&&e.setFlexDirection(i.default.FLEX_DIRECTION_ROW),"row-reverse"===t.flexDirection&&e.setFlexDirection(i.default.FLEX_DIRECTION_ROW_REVERSE),"column"===t.flexDirection&&e.setFlexDirection(i.default.FLEX_DIRECTION_COLUMN),"column-reverse"===t.flexDirection&&e.setFlexDirection(i.default.FLEX_DIRECTION_COLUMN_REVERSE)),"flexBasis"in t&&("number"==typeof t.flexBasis?e.setFlexBasis(t.flexBasis):"string"==typeof t.flexBasis?e.setFlexBasisPercent(Number.parseInt(t.flexBasis,10)):e.setFlexBasis(NaN)),"alignItems"in t&&("stretch"!==t.alignItems&&t.alignItems||e.setAlignItems(i.default.ALIGN_STRETCH),"flex-start"===t.alignItems&&e.setAlignItems(i.default.ALIGN_FLEX_START),"center"===t.alignItems&&e.setAlignItems(i.default.ALIGN_CENTER),"flex-end"===t.alignItems&&e.setAlignItems(i.default.ALIGN_FLEX_END)),"alignSelf"in t&&("auto"!==t.alignSelf&&t.alignSelf||e.setAlignSelf(i.default.ALIGN_AUTO),"flex-start"===t.alignSelf&&e.setAlignSelf(i.default.ALIGN_FLEX_START),"center"===t.alignSelf&&e.setAlignSelf(i.default.ALIGN_CENTER),"flex-end"===t.alignSelf&&e.setAlignSelf(i.default.ALIGN_FLEX_END)),"justifyContent"in t&&("flex-start"!==t.justifyContent&&t.justifyContent||e.setJustifyContent(i.default.JUSTIFY_FLEX_START),"center"===t.justifyContent&&e.setJustifyContent(i.default.JUSTIFY_CENTER),"flex-end"===t.justifyContent&&e.setJustifyContent(i.default.JUSTIFY_FLEX_END),"space-between"===t.justifyContent&&e.setJustifyContent(i.default.JUSTIFY_SPACE_BETWEEN),"space-around"===t.justifyContent&&e.setJustifyContent(i.default.JUSTIFY_SPACE_AROUND))})(e,t),((e,t)=>{var n,r;"width"in t&&("number"==typeof t.width?e.setWidth(t.width):"string"==typeof t.width?e.setWidthPercent(Number.parseInt(t.width,10)):e.setWidthAuto()),"height"in t&&("number"==typeof t.height?e.setHeight(t.height):"string"==typeof t.height?e.setHeightPercent(Number.parseInt(t.height,10)):e.setHeightAuto()),"minWidth"in t&&("string"==typeof t.minWidth?e.setMinWidthPercent(Number.parseInt(t.minWidth,10)):e.setMinWidth(null!==(n=t.minWidth)&&void 0!==n?n:0)),"minHeight"in t&&("string"==typeof t.minHeight?e.setMinHeightPercent(Number.parseInt(t.minHeight,10)):e.setMinHeight(null!==(r=t.minHeight)&&void 0!==r?r:0))})(e,t),((e,t)=>{"display"in t&&e.setDisplay("flex"===t.display?i.default.DISPLAY_FLEX:i.default.DISPLAY_NONE)})(e,t),((e,t)=>{if("borderStyle"in t){const n="string"==typeof t.borderStyle?1:0;e.setBorder(i.default.EDGE_TOP,n),e.setBorder(i.default.EDGE_BOTTOM,n),e.setBorder(i.default.EDGE_LEFT,n),e.setBorder(i.default.EDGE_RIGHT,n)}})(e,t)}},2030:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=r(n(4332)),o=r(n(5301)),u={};t.default=(e,t,n)=>{const r=e+String(t)+String(n);if(u[r])return u[r];let a=e;if("wrap"===n&&(a=i.default(e,t,{trim:!1,hard:!0})),n.startsWith("truncate")){let r="end";"truncate-middle"===n&&(r="middle"),"truncate-start"===n&&(r="start"),a=o.default(e,t,{position:r})}return u[r]=a,a}},5767:(e,t,n)=>{ +/** @license React v0.24.0 + * react-reconciler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +e.exports=function t(r){"use strict";var i=n(9381),o=n(7382),u=n(7181);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;nOe||(e.current=Ae[Oe],Ae[Oe]=null,Oe--)}function Ie(e,t){Oe++,Ae[Oe]=e.current,e.current=t}var Ne={},Me={current:Ne},Re={current:!1},Fe=Ne;function Le(e,t){var n=e.type.contextTypes;if(!n)return Ne;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var i,o={};for(i in n)o[i]=t[i];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function Be(e){return null!=(e=e.childContextTypes)}function je(e){Pe(Re),Pe(Me)}function Ue(e){Pe(Re),Pe(Me)}function ze(e,t,n){if(Me.current!==Ne)throw Error(a(168));Ie(Me,t),Ie(Re,n)}function We(e,t,n){var r=e.stateNode;if(e=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in e))throw Error(a(108,C(t)||"Unknown",o));return i({},n,{},r)}function He(e){var t=e.stateNode;return t=t&&t.__reactInternalMemoizedMergedChildContext||Ne,Fe=Me.current,Ie(Me,t),Ie(Re,Re.current),!0}function Ve(e,t,n){var r=e.stateNode;if(!r)throw Error(a(169));n?(t=We(e,t,Fe),r.__reactInternalMemoizedMergedChildContext=t,Pe(Re),Pe(Me),Ie(Me,t)):Pe(Re),Ie(Re,n)}var qe=u.unstable_runWithPriority,Ge=u.unstable_scheduleCallback,$e=u.unstable_cancelCallback,Ye=u.unstable_shouldYield,Ke=u.unstable_requestPaint,Xe=u.unstable_now,Qe=u.unstable_getCurrentPriorityLevel,Je=u.unstable_ImmediatePriority,Ze=u.unstable_UserBlockingPriority,et=u.unstable_NormalPriority,tt=u.unstable_LowPriority,nt=u.unstable_IdlePriority,rt={},it=void 0!==Ke?Ke:function(){},ot=null,ut=null,at=!1,lt=Xe(),st=1e4>lt?Xe:function(){return Xe()-lt};function ct(){switch(Qe()){case Je:return 99;case Ze:return 98;case et:return 97;case tt:return 96;case nt:return 95;default:throw Error(a(332))}}function ft(e){switch(e){case 99:return Je;case 98:return Ze;case 97:return et;case 96:return tt;case 95:return nt;default:throw Error(a(332))}}function dt(e,t){return e=ft(e),qe(e,t)}function pt(e,t,n){return e=ft(e),Ge(e,t,n)}function ht(e){return null===ot?(ot=[e],ut=Ge(Je,mt)):ot.push(e),rt}function vt(){if(null!==ut){var e=ut;ut=null,$e(e)}mt()}function mt(){if(!at&&null!==ot){at=!0;var e=0;try{var t=ot;dt(99,(function(){for(;e=t&&(dr=!0),e.firstContext=null)}function It(e,t){if(kt!==e&&!1!==t&&0!==t)if("number"==typeof t&&1073741823!==t||(kt=e,t=1073741823),t={context:e,observedBits:t,next:null},null===Ct){if(null===St)throw Error(a(308));Ct=t,St.dependencies={expirationTime:0,firstContext:t,responders:null}}else Ct=Ct.next=t;return q?e._currentValue:e._currentValue2}var Nt=!1;function Mt(e){return{baseState:e,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Rt(e){return{baseState:e.baseState,firstUpdate:e.firstUpdate,lastUpdate:e.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Ft(e,t){return{expirationTime:e,suspenseConfig:t,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function Lt(e,t){null===e.lastUpdate?e.firstUpdate=e.lastUpdate=t:(e.lastUpdate.next=t,e.lastUpdate=t)}function Bt(e,t){var n=e.alternate;if(null===n){var r=e.updateQueue,i=null;null===r&&(r=e.updateQueue=Mt(e.memoizedState))}else r=e.updateQueue,i=n.updateQueue,null===r?null===i?(r=e.updateQueue=Mt(e.memoizedState),i=n.updateQueue=Mt(n.memoizedState)):r=e.updateQueue=Rt(i):null===i&&(i=n.updateQueue=Rt(r));null===i||r===i?Lt(r,t):null===r.lastUpdate||null===i.lastUpdate?(Lt(r,t),Lt(i,t)):(Lt(r,t),i.lastUpdate=t)}function jt(e,t){var n=e.updateQueue;null===(n=null===n?e.updateQueue=Mt(e.memoizedState):Ut(e,n)).lastCapturedUpdate?n.firstCapturedUpdate=n.lastCapturedUpdate=t:(n.lastCapturedUpdate.next=t,n.lastCapturedUpdate=t)}function Ut(e,t){var n=e.alternate;return null!==n&&t===n.updateQueue&&(t=e.updateQueue=Rt(t)),t}function zt(e,t,n,r,o,u){switch(n.tag){case 1:return"function"==typeof(e=n.payload)?e.call(u,r,o):e;case 3:e.effectTag=-4097&e.effectTag|64;case 0:if(null==(o="function"==typeof(e=n.payload)?e.call(u,r,o):e))break;return i({},r,o);case 2:Nt=!0}return r}function Wt(e,t,n,r,i){Nt=!1;for(var o=(t=Ut(e,t)).baseState,u=null,a=0,l=t.firstUpdate,s=o;null!==l;){var c=l.expirationTime;cd?(p=f,f=null):p=f.sibling;var h=m(i,f,a[d],l);if(null===h){null===f&&(f=p);break}e&&f&&null===h.alternate&&t(i,f),u=o(h,u,d),null===c?s=h:c.sibling=h,c=h,f=p}if(d===a.length)return n(i,f),s;if(null===f){for(;dp?(h=d,d=null):h=d.sibling;var _=m(i,d,y.value,s);if(null===_){null===d&&(d=h);break}e&&d&&null===_.alternate&&t(i,d),u=o(_,u,p),null===f?c=_:f.sibling=_,f=_,d=h}if(y.done)return n(i,d),c;if(null===d){for(;!y.done;p++,y=l.next())null!==(y=v(i,y.value,s))&&(u=o(y,u,p),null===f?c=y:f.sibling=y,f=y);return c}for(d=r(i,d);!y.done;p++,y=l.next())null!==(y=g(d,i,p,y.value,s))&&(e&&null!==y.alternate&&d.delete(null===y.key?p:y.key),u=o(y,u,p),null===f?c=y:f.sibling=y,f=y);return e&&d.forEach((function(e){return t(i,e)})),c}return function(e,r,o,l){var s="object"==typeof o&&null!==o&&o.type===d&&null===o.key;s&&(o=o.props.children);var p="object"==typeof o&&null!==o;if(p)switch(o.$$typeof){case c:e:{for(p=o.key,s=r;null!==s;){if(s.key===p){if(7===s.tag?o.type===d:s.elementType===o.type){n(e,s.sibling),(r=i(s,o.type===d?o.props.children:o.props)).ref=en(e,s,o),r.return=e,e=r;break e}n(e,s);break}t(e,s),s=s.sibling}o.type===d?((r=so(o.props.children,e.mode,l,o.key)).return=e,e=r):((l=lo(o.type,o.key,o.props,null,e.mode,l)).ref=en(e,r,o),l.return=e,e=l)}return u(e);case f:e:{for(s=o.key;null!==r;){if(r.key===s){if(4===r.tag&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),(r=i(r,o.children||[])).return=e,e=r;break e}n(e,r);break}t(e,r),r=r.sibling}(r=fo(o,e.mode,l)).return=e,e=r}return u(e)}if("string"==typeof o||"number"==typeof o)return o=""+o,null!==r&&6===r.tag?(n(e,r.sibling),(r=i(r,o)).return=e,e=r):(n(e,r),(r=co(o,e.mode,l)).return=e,e=r),u(e);if(Zt(o))return y(e,r,o,l);if(S(o))return _(e,r,o,l);if(p&&tn(e,o),void 0===o&&!s)switch(e.tag){case 1:case 0:throw e=e.type,Error(a(152,e.displayName||e.name||"Component"))}return n(e,r)}}var rn=nn(!0),on=nn(!1),un={},an={current:un},ln={current:un},sn={current:un};function cn(e){if(e===un)throw Error(a(174));return e}function fn(e,t){Ie(sn,t),Ie(ln,e),Ie(an,un),t=P(t),Pe(an),Ie(an,t)}function dn(e){Pe(an),Pe(ln),Pe(sn)}function pn(e){var t=cn(sn.current),n=cn(an.current);n!==(t=I(n,e.type,t))&&(Ie(ln,e),Ie(an,t))}function hn(e){ln.current===e&&(Pe(an),Pe(ln))}var vn={current:0};function mn(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||ye(n)||_e(n)))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(64&t.effectTag))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function gn(e,t){return{responder:e,props:t}}var yn=l.ReactCurrentDispatcher,_n=l.ReactCurrentBatchConfig,bn=0,wn=null,En=null,Dn=null,Sn=null,Cn=null,kn=null,Tn=0,xn=null,An=0,On=!1,Pn=null,In=0;function Nn(){throw Error(a(321))}function Mn(e,t){if(null===t)return!1;for(var n=0;nTn&&zi(Tn=f)):(Ui(f,s.suspenseConfig),o=s.eagerReducer===e?s.eagerState:e(o,s.action)),u=s,s=s.next}while(null!==s&&s!==r);c||(l=u,i=o),_t(o,t.memoizedState)||(dr=!0),t.memoizedState=o,t.baseUpdate=l,t.baseState=i,n.lastRenderedState=o}return[t.memoizedState,n.dispatch]}function zn(e){var t=Ln();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={last:null,dispatch:null,lastRenderedReducer:jn,lastRenderedState:e}).dispatch=Jn.bind(null,wn,e),[t.memoizedState,e]}function Wn(e){return Un(jn)}function Hn(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===xn?(xn={lastEffect:null}).lastEffect=e.next=e:null===(t=xn.lastEffect)?xn.lastEffect=e.next=e:(n=t.next,t.next=e,e.next=n,xn.lastEffect=e),e}function Vn(e,t,n,r){var i=Ln();An|=e,i.memoizedState=Hn(t,n,void 0,void 0===r?null:r)}function qn(e,t,n,r){var i=Bn();r=void 0===r?null:r;var o=void 0;if(null!==En){var u=En.memoizedState;if(o=u.destroy,null!==r&&Mn(r,u.deps))return void Hn(0,n,o,r)}An|=e,i.memoizedState=Hn(t,n,o,r)}function Gn(e,t){return Vn(516,192,e,t)}function $n(e,t){return qn(516,192,e,t)}function Yn(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Kn(){}function Xn(e,t){return Ln().memoizedState=[e,void 0===t?null:t],e}function Qn(e,t){var n=Bn();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Mn(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Jn(e,t,n){if(!(25>In))throw Error(a(301));var r=e.alternate;if(e===wn||null!==r&&r===wn)if(On=!0,e={expirationTime:bn,suspenseConfig:null,action:n,eagerReducer:null,eagerState:null,next:null},null===Pn&&(Pn=new Map),void 0===(n=Pn.get(t)))Pn.set(t,e);else{for(t=n;null!==t.next;)t=t.next;t.next=e}else{var i=xi(),o=qt.suspense;o={expirationTime:i=Ai(i,e,o),suspenseConfig:o,action:n,eagerReducer:null,eagerState:null,next:null};var u=t.last;if(null===u)o.next=o;else{var l=u.next;null!==l&&(o.next=l),u.next=o}if(t.last=o,0===e.expirationTime&&(null===r||0===r.expirationTime)&&null!==(r=t.lastRenderedReducer))try{var s=t.lastRenderedState,c=r(s,n);if(o.eagerReducer=r,o.eagerState=c,_t(c,s))return}catch(e){}Oi(e,i)}}var Zn={readContext:It,useCallback:Nn,useContext:Nn,useEffect:Nn,useImperativeHandle:Nn,useLayoutEffect:Nn,useMemo:Nn,useReducer:Nn,useRef:Nn,useState:Nn,useDebugValue:Nn,useResponder:Nn,useDeferredValue:Nn,useTransition:Nn},er={readContext:It,useCallback:Xn,useContext:It,useEffect:Gn,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,Vn(4,36,Yn.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Vn(4,36,e,t)},useMemo:function(e,t){var n=Ln();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Ln();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e=(e=r.queue={last:null,dispatch:null,lastRenderedReducer:e,lastRenderedState:t}).dispatch=Jn.bind(null,wn,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},Ln().memoizedState=e},useState:zn,useDebugValue:Kn,useResponder:gn,useDeferredValue:function(e,t){var n=zn(e),r=n[0],i=n[1];return Gn((function(){u.unstable_next((function(){var n=_n.suspense;_n.suspense=void 0===t?null:t;try{i(e)}finally{_n.suspense=n}}))}),[e,t]),r},useTransition:function(e){var t=zn(!1),n=t[0],r=t[1];return[Xn((function(t){r(!0),u.unstable_next((function(){var n=_n.suspense;_n.suspense=void 0===e?null:e;try{r(!1),t()}finally{_n.suspense=n}}))}),[e,n]),n]}},tr={readContext:It,useCallback:Qn,useContext:It,useEffect:$n,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,qn(4,36,Yn.bind(null,t,e),n)},useLayoutEffect:function(e,t){return qn(4,36,e,t)},useMemo:function(e,t){var n=Bn();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Mn(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)},useReducer:Un,useRef:function(){return Bn().memoizedState},useState:Wn,useDebugValue:Kn,useResponder:gn,useDeferredValue:function(e,t){var n=Wn(),r=n[0],i=n[1];return $n((function(){u.unstable_next((function(){var n=_n.suspense;_n.suspense=void 0===t?null:t;try{i(e)}finally{_n.suspense=n}}))}),[e,t]),r},useTransition:function(e){var t=Wn(),n=t[0],r=t[1];return[Qn((function(t){r(!0),u.unstable_next((function(){var n=_n.suspense;_n.suspense=void 0===e?null:e;try{r(!1),t()}finally{_n.suspense=n}}))}),[e,n]),n]}},nr=null,rr=null,ir=!1;function or(e,t){var n=oo(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.effectTag=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function ur(e,t){switch(e.tag){case 5:return null!==(t=me(t,e.type,e.pendingProps))&&(e.stateNode=t,!0);case 6:return null!==(t=ge(t,e.pendingProps))&&(e.stateNode=t,!0);case 13:default:return!1}}function ar(e){if(ir){var t=rr;if(t){var n=t;if(!ur(e,t)){if(!(t=be(n))||!ur(e,t))return e.effectTag=-1025&e.effectTag|2,ir=!1,void(nr=e);or(nr,n)}nr=e,rr=we(t)}else e.effectTag=-1025&e.effectTag|2,ir=!1,nr=e}}function lr(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;nr=e}function sr(e){if(!Y||e!==nr)return!1;if(!ir)return lr(e),ir=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!j(t,e.memoizedProps))for(t=rr;t;)or(e,t),t=be(t);if(lr(e),13===e.tag){if(!Y)throw Error(a(316));if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(a(317));rr=Se(e)}else rr=nr?be(e.stateNode):null;return!0}function cr(){Y&&(rr=nr=null,ir=!1)}var fr=l.ReactCurrentOwner,dr=!1;function pr(e,t,n,r){t.child=null===e?on(t,null,n,r):rn(t,e.child,n,r)}function hr(e,t,n,r,i){n=n.render;var o=t.ref;return Pt(t,i),r=Rn(e,t,n,r,o,i),null===e||dr?(t.effectTag|=1,pr(e,t,r,i),t.child):(t.updateQueue=e.updateQueue,t.effectTag&=-517,e.expirationTime<=i&&(e.expirationTime=0),Pr(e,t,i))}function vr(e,t,n,r,i,o){if(null===e){var u=n.type;return"function"!=typeof u||uo(u)||void 0!==u.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=lo(n.type,null,r,null,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=u,mr(e,t,u,r,i,o))}return u=e.child,it)&&Si.set(e,t))}}function Pi(e,t){e.expirationTime(e=e.nextKnownPendingLevel)?t:e:t}function Ni(e){if(0!==e.lastExpiredTime)e.callbackExpirationTime=1073741823,e.callbackPriority=99,e.callbackNode=ht(Ri.bind(null,e));else{var t=Ii(e),n=e.callbackNode;if(0===t)null!==n&&(e.callbackNode=null,e.callbackExpirationTime=0,e.callbackPriority=90);else{var r=xi();if(1073741823===t?r=99:1===t||2===t?r=95:r=0>=(r=10*(1073741821-t)-10*(1073741821-r))?99:250>=r?98:5250>=r?97:95,null!==n){var i=e.callbackPriority;if(e.callbackExpirationTime===t&&i>=r)return;n!==rt&&$e(n)}e.callbackExpirationTime=t,e.callbackPriority=r,t=1073741823===t?ht(Ri.bind(null,e)):pt(r,Mi.bind(null,e),{timeout:10*(1073741821-t)-st()}),e.callbackNode=t}}}function Mi(e,t){if(Ti=0,t)return go(e,t=xi()),Ni(e),null;var n=Ii(e);if(0!==n){if(t=e.callbackNode,0!=(48&oi))throw Error(a(327));if(Xi(),e===ui&&n===li||Li(e,n),null!==ai){var r=oi;oi|=ii;for(var i=ji();;)try{Hi();break}catch(t){Bi(e,t)}if(Tt(),oi=r,ni.current=i,1===si)throw t=ci,Li(e,n),vo(e,n),Ni(e),t;if(null===ai)switch(i=e.finishedWork=e.current.alternate,e.finishedExpirationTime=n,r=si,ui=null,r){case 0:case 1:throw Error(a(345));case 2:go(e,2=n){e.lastPingedTime=n,Li(e,n);break}}if(0!==(o=Ii(e))&&o!==n)break;if(0!==r&&r!==n){e.lastPingedTime=r;break}e.timeoutHandle=W($i.bind(null,e),i);break}$i(e);break;case 4:if(vo(e,n),n===(r=e.lastSuspendedTime)&&(e.nextKnownPendingLevel=Gi(i)),vi&&(0===(i=e.lastPingedTime)||i>=n)){e.lastPingedTime=n,Li(e,n);break}if(0!==(i=Ii(e))&&i!==n)break;if(0!==r&&r!==n){e.lastPingedTime=r;break}if(1073741823!==di?r=10*(1073741821-di)-st():1073741823===fi?r=0:(r=10*(1073741821-fi)-5e3,0>(r=(i=st())-r)&&(r=0),(n=10*(1073741821-n)-i)<(r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*ti(r/1960))-r)&&(r=n)),10=(r=0|u.busyMinDurationMs)?r=0:(i=0|u.busyDelayMs,r=(o=st()-(10*(1073741821-o)-(0|u.timeoutMs||5e3)))<=i?0:i+r-o),10 component higher in the tree to provide a loading indicator or placeholder to display."+xe(i))}5!==si&&(si=2),o=Fr(o,i),l=r;do{switch(l.tag){case 3:u=o,l.effectTag|=4096,l.expirationTime=t,jt(l,Jr(l,u,t));break e;case 1:u=o;var g=l.type,y=l.stateNode;if(0==(64&l.effectTag)&&("function"==typeof g.getDerivedStateFromError||null!==y&&"function"==typeof y.componentDidCatch&&(null===bi||!bi.has(y)))){l.effectTag|=4096,l.expirationTime=t,jt(l,Zr(l,u,t));break e}}l=l.return}while(null!==l)}ai=qi(ai)}catch(e){t=e;continue}break}}function ji(){var e=ni.current;return ni.current=Zn,null===e?Zn:e}function Ui(e,t){ehi&&(hi=e)}function Wi(){for(;null!==ai;)ai=Vi(ai)}function Hi(){for(;null!==ai&&!Ye();)ai=Vi(ai)}function Vi(e){var t=ei(e.alternate,e,li);return e.memoizedProps=e.pendingProps,null===t&&(t=qi(e)),ri.current=null,t}function qi(e){ai=e;do{var t=ai.alternate;if(e=ai.return,0==(2048&ai.effectTag)){e:{var n=t,r=li,i=(t=ai).pendingProps;switch(t.tag){case 2:case 16:break;case 15:case 0:break;case 1:Be(t.type)&&je();break;case 3:dn(),Ue(),(i=t.stateNode).pendingContext&&(i.context=i.pendingContext,i.pendingContext=null),(null===n||null===n.child)&&sr(t)&&Ir(t),Dr(t);break;case 5:hn(t);var o=cn(sn.current);if(r=t.type,null!==n&&null!=t.stateNode)Sr(n,t,r,i,o),n.ref!==t.ref&&(t.effectTag|=128);else if(i){if(n=cn(an.current),sr(t)){if(i=t,!Y)throw Error(a(175));n=Ee(i.stateNode,i.type,i.memoizedProps,o,n,i),i.updateQueue=n,(n=null!==n)&&Ir(t)}else{var u=R(r,i,o,n,t);Er(u,t,!1,!1),t.stateNode=u,L(u,r,i,o,n)&&Ir(t)}null!==t.ref&&(t.effectTag|=128)}else if(null===t.stateNode)throw Error(a(166));break;case 6:if(n&&null!=t.stateNode)Cr(n,t,n.memoizedProps,i);else{if("string"!=typeof i&&null===t.stateNode)throw Error(a(166));if(n=cn(sn.current),o=cn(an.current),sr(t)){if(n=t,!Y)throw Error(a(176));(n=De(n.stateNode,n.memoizedProps,n))&&Ir(t)}else t.stateNode=z(i,n,o,t)}break;case 11:break;case 13:if(Pe(vn),i=t.memoizedState,0!=(64&t.effectTag)){t.expirationTime=r;break e}i=null!==i,o=!1,null===n?void 0!==t.memoizedProps.fallback&&sr(t):(o=null!==(r=n.memoizedState),i||null===r||null!==(r=n.child.sibling)&&(null!==(u=t.firstEffect)?(t.firstEffect=r,r.nextEffect=u):(t.firstEffect=t.lastEffect=r,r.nextEffect=null),r.effectTag=8)),i&&!o&&0!=(2&t.mode)&&(null===n&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&vn.current)?0===si&&(si=3):(0!==si&&3!==si||(si=4),0!==hi&&null!==ui&&(vo(ui,li),mo(ui,hi)))),$&&i&&(t.effectTag|=4),G&&(i||o)&&(t.effectTag|=4);break;case 7:case 8:case 12:break;case 4:dn(),Dr(t);break;case 10:At(t);break;case 9:case 14:break;case 17:Be(t.type)&&je();break;case 19:if(Pe(vn),null===(i=t.memoizedState))break;if(o=0!=(64&t.effectTag),null===(u=i.rendering)){if(o)Mr(i,!1);else if(0!==si||null!==n&&0!=(64&n.effectTag))for(n=t.child;null!==n;){if(null!==(u=mn(n))){for(t.effectTag|=64,Mr(i,!1),null!==(n=u.updateQueue)&&(t.updateQueue=n,t.effectTag|=4),null===i.lastEffect&&(t.firstEffect=null),t.lastEffect=i.lastEffect,n=r,i=t.child;null!==i;)r=n,(o=i).effectTag&=2,o.nextEffect=null,o.firstEffect=null,o.lastEffect=null,null===(u=o.alternate)?(o.childExpirationTime=0,o.expirationTime=r,o.child=null,o.memoizedProps=null,o.memoizedState=null,o.updateQueue=null,o.dependencies=null):(o.childExpirationTime=u.childExpirationTime,o.expirationTime=u.expirationTime,o.child=u.child,o.memoizedProps=u.memoizedProps,o.memoizedState=u.memoizedState,o.updateQueue=u.updateQueue,r=u.dependencies,o.dependencies=null===r?null:{expirationTime:r.expirationTime,firstContext:r.firstContext,responders:r.responders}),i=i.sibling;Ie(vn,1&vn.current|2),t=t.child;break e}n=n.sibling}}else{if(!o)if(null!==(n=mn(u))){if(t.effectTag|=64,o=!0,null!==(n=n.updateQueue)&&(t.updateQueue=n,t.effectTag|=4),Mr(i,!0),null===i.tail&&"hidden"===i.tailMode&&!u.alternate){null!==(t=t.lastEffect=i.lastEffect)&&(t.nextEffect=null);break}}else st()>i.tailExpiration&&1i&&(i=r),(u=o.childExpirationTime)>i&&(i=u),o=o.sibling;n.childExpirationTime=i}if(null!==t)return t;null!==e&&0==(2048&e.effectTag)&&(null===e.firstEffect&&(e.firstEffect=ai.firstEffect),null!==ai.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=ai.firstEffect),e.lastEffect=ai.lastEffect),1(e=e.childExpirationTime)?t:e}function $i(e){var t=ct();return dt(99,Yi.bind(null,e,t)),null}function Yi(e,t){do{Xi()}while(null!==Ei);if(0!=(48&oi))throw Error(a(327));var n=e.finishedWork,r=e.finishedExpirationTime;if(null===n)return null;if(e.finishedWork=null,e.finishedExpirationTime=0,n===e.current)throw Error(a(177));e.callbackNode=null,e.callbackExpirationTime=0,e.callbackPriority=90,e.nextKnownPendingLevel=0;var i=Gi(n);if(e.firstPendingTime=i,r<=e.lastSuspendedTime?e.firstSuspendedTime=e.lastSuspendedTime=e.nextKnownPendingLevel=0:r<=e.firstSuspendedTime&&(e.firstSuspendedTime=r-1),r<=e.lastPingedTime&&(e.lastPingedTime=0),r<=e.lastExpiredTime&&(e.lastExpiredTime=0),e===ui&&(ai=ui=null,li=0),1=n?Tr(e,t,n):(Ie(vn,1&vn.current),null!==(t=Pr(e,t,n))?t.sibling:null);Ie(vn,1&vn.current);break;case 19:if(r=t.childExpirationTime>=n,0!=(64&e.effectTag)){if(r)return Or(e,t,n);t.effectTag|=64}if(null!==(i=t.memoizedState)&&(i.rendering=null,i.tail=null),Ie(vn,vn.current),!r)return null}return Pr(e,t,n)}dr=!1}}else dr=!1;switch(t.expirationTime=0,t.tag){case 2:if(r=t.type,null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),e=t.pendingProps,i=Le(t,Me.current),Pt(t,n),i=Rn(null,t,r,e,i,n),t.effectTag|=1,"object"==typeof i&&null!==i&&"function"==typeof i.render&&void 0===i.$$typeof){if(t.tag=1,Fn(),Be(r)){var o=!0;He(t)}else o=!1;t.memoizedState=null!==i.state&&void 0!==i.state?i.state:null;var u=r.getDerivedStateFromProps;"function"==typeof u&&$t(t,r,u,e),i.updater=Yt,t.stateNode=i,i._reactInternalFiber=t,Jt(t,r,e,n),t=br(null,t,r,!0,o,n)}else t.tag=0,pr(null,t,i,n),t=t.child;return t;case 16:if(i=t.elementType,null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),e=t.pendingProps,function(e){if(-1===e._status){e._status=0;var t=e._ctor;t=t(),e._result=t,t.then((function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)}),(function(t){0===e._status&&(e._status=2,e._result=t)}))}}(i),1!==i._status)throw i._result;switch(i=i._result,t.type=i,o=t.tag=function(e){if("function"==typeof e)return uo(e)?1:0;if(null!=e){if((e=e.$$typeof)===y)return 11;if(e===w)return 14}return 2}(i),e=Et(i,e),o){case 0:t=yr(null,t,i,e,n);break;case 1:t=_r(null,t,i,e,n);break;case 11:t=hr(null,t,i,e,n);break;case 14:t=vr(null,t,i,Et(i.type,e),r,n);break;default:throw Error(a(306,i,""))}return t;case 0:return r=t.type,i=t.pendingProps,yr(e,t,r,i=t.elementType===r?i:Et(r,i),n);case 1:return r=t.type,i=t.pendingProps,_r(e,t,r,i=t.elementType===r?i:Et(r,i),n);case 3:if(wr(t),null===(r=t.updateQueue))throw Error(a(282));if(i=null!==(i=t.memoizedState)?i.element:null,Wt(t,r,t.pendingProps,null,n),(r=t.memoizedState.element)===i)cr(),t=Pr(e,t,n);else{if((i=t.stateNode.hydrate)&&(Y?(rr=we(t.stateNode.containerInfo),nr=t,i=ir=!0):i=!1),i)for(n=on(t,null,r,n),t.child=n;n;)n.effectTag=-3&n.effectTag|1024,n=n.sibling;else pr(e,t,r,n),cr();t=t.child}return t;case 5:return pn(t),null===e&&ar(t),r=t.type,i=t.pendingProps,o=null!==e?e.memoizedProps:null,u=i.children,j(r,i)?u=null:null!==o&&j(r,o)&&(t.effectTag|=16),gr(e,t),4&t.mode&&1!==n&&U(r,i)?(t.expirationTime=t.childExpirationTime=1,t=null):(pr(e,t,u,n),t=t.child),t;case 6:return null===e&&ar(t),null;case 13:return Tr(e,t,n);case 4:return fn(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=rn(t,null,r,n):pr(e,t,r,n),t.child;case 11:return r=t.type,i=t.pendingProps,hr(e,t,r,i=t.elementType===r?i:Et(r,i),n);case 7:return pr(e,t,t.pendingProps,n),t.child;case 8:case 12:return pr(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,i=t.pendingProps,u=t.memoizedProps,xt(t,o=i.value),null!==u){var l=u.value;if(0===(o=_t(l,o)?0:0|("function"==typeof r._calculateChangedBits?r._calculateChangedBits(l,o):1073741823))){if(u.children===i.children&&!Re.current){t=Pr(e,t,n);break e}}else for(null!==(l=t.child)&&(l.return=t);null!==l;){var s=l.dependencies;if(null!==s){u=l.child;for(var c=s.firstContext;null!==c;){if(c.context===r&&0!=(c.observedBits&o)){1===l.tag&&((c=Ft(n,null)).tag=2,Bt(l,c)),l.expirationTime=t&&e<=t}function vo(e,t){var n=e.firstSuspendedTime,r=e.lastSuspendedTime;nt||0===n)&&(e.lastSuspendedTime=t),t<=e.lastPingedTime&&(e.lastPingedTime=0),t<=e.lastExpiredTime&&(e.lastExpiredTime=0)}function mo(e,t){t>e.firstPendingTime&&(e.firstPendingTime=t);var n=e.firstSuspendedTime;0!==n&&(t>=n?e.firstSuspendedTime=e.lastSuspendedTime=e.nextKnownPendingLevel=0:t>=e.lastSuspendedTime&&(e.lastSuspendedTime=t+1),t>e.nextKnownPendingLevel&&(e.nextKnownPendingLevel=t))}function go(e,t){var n=e.lastExpiredTime;(0===n||n>t)&&(e.lastExpiredTime=t)}function yo(e){var t=e._reactInternalFiber;if(void 0===t){if("function"==typeof e.render)throw Error(a(188));throw Error(a(268,Object.keys(e)))}return null===(e=A(t))?null:e.stateNode}function _o(e,t){null!==(e=e.memoizedState)&&null!==e.dehydrated&&e.retryTime{"use strict";e.exports=n(5767)},3296:(e,t,n)=>{"use strict";const r=n(5760);r.createWebSocketStream=n(6387),r.Server=n(43),r.Receiver=n(1762),r.Sender=n(9576),e.exports=r},8716:(e,t,n)=>{"use strict";const{EMPTY_BUFFER:r}=n(5739);function i(e,t){if(0===e.length)return r;if(1===e.length)return e[0];const n=Buffer.allocUnsafe(t);let i=0;for(let t=0;t{"use strict";e.exports={BINARY_TYPES:["nodebuffer","arraybuffer","fragments"],GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),EMPTY_BUFFER:Buffer.alloc(0),NOOP:()=>{}}},7002:e=>{"use strict";class t{constructor(e,t){this.target=t,this.type=e}}class n extends t{constructor(e,t){super("message",t),this.data=e}}class r extends t{constructor(e,t,n){super("close",n),this.wasClean=n._closeFrameReceived&&n._closeFrameSent,this.reason=t,this.code=e}}class i extends t{constructor(e){super("open",e)}}class o extends t{constructor(e,t){super("error",t),this.message=e.message,this.error=e}}const u={addEventListener(e,t,u){if("function"!=typeof t)return;function a(e){t.call(this,new n(e,this))}function l(e,n){t.call(this,new r(e,n,this))}function s(e){t.call(this,new o(e,this))}function c(){t.call(this,new i(this))}const f=u&&u.once?"once":"on";"message"===e?(a._listener=t,this[f](e,a)):"close"===e?(l._listener=t,this[f](e,l)):"error"===e?(s._listener=t,this[f](e,s)):"open"===e?(c._listener=t,this[f](e,c)):this[f](e,t)},removeEventListener(e,t){const n=this.listeners(e);for(let r=0;r{"use strict";const t=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0];function n(e,t,n){void 0===e[t]?e[t]=[n]:e[t].push(n)}e.exports={format:function(e){return Object.keys(e).map(t=>{let n=e[t];return Array.isArray(n)||(n=[n]),n.map(e=>[t].concat(Object.keys(e).map(t=>{let n=e[t];return Array.isArray(n)||(n=[n]),n.map(e=>!0===e?t:`${t}=${e}`).join("; ")})).join("; ")).join(", ")}).join(", ")},parse:function(e){const r=Object.create(null);if(void 0===e||""===e)return r;let i,o,u=Object.create(null),a=!1,l=!1,s=!1,c=-1,f=-1,d=0;for(;d{"use strict";const t=Symbol("kDone"),n=Symbol("kRun");e.exports=class{constructor(e){this[t]=()=>{this.pending--,this[n]()},this.concurrency=e||1/0,this.jobs=[],this.pending=0}add(e){this.jobs.push(e),this[n]()}[n](){if(this.pending!==this.concurrency&&this.jobs.length){const e=this.jobs.shift();this.pending++,e(this[t])}}}},2309:(e,t,n)=>{"use strict";const r=n(8761),i=n(8716),o=n(1390),{kStatusCode:u,NOOP:a}=n(5739),l=Buffer.from([0,0,255,255]),s=Symbol("permessage-deflate"),c=Symbol("total-length"),f=Symbol("callback"),d=Symbol("buffers"),p=Symbol("error");let h;function v(e){this[d].push(e),this[c]+=e.length}function m(e){this[c]+=e.length,this[s]._maxPayload<1||this[c]<=this[s]._maxPayload?this[d].push(e):(this[p]=new RangeError("Max payload size exceeded"),this[p][u]=1009,this.removeListener("data",m),this.reset())}function g(e){this[s]._inflate=null,e[u]=1007,this[f](e)}e.exports=class{constructor(e,t,n){if(this._maxPayload=0|n,this._options=e||{},this._threshold=void 0!==this._options.threshold?this._options.threshold:1024,this._isServer=!!t,this._deflate=null,this._inflate=null,this.params=null,!h){const e=void 0!==this._options.concurrencyLimit?this._options.concurrencyLimit:10;h=new o(e)}}static get extensionName(){return"permessage-deflate"}offer(){const e={};return this._options.serverNoContextTakeover&&(e.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(e.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(e.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?e.client_max_window_bits=this._options.clientMaxWindowBits:null==this._options.clientMaxWindowBits&&(e.client_max_window_bits=!0),e}accept(e){return e=this.normalizeParams(e),this.params=this._isServer?this.acceptAsServer(e):this.acceptAsClient(e),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){const e=this._deflate[f];this._deflate.close(),this._deflate=null,e&&e(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(e){const t=this._options,n=e.find(e=>!(!1===t.serverNoContextTakeover&&e.server_no_context_takeover||e.server_max_window_bits&&(!1===t.serverMaxWindowBits||"number"==typeof t.serverMaxWindowBits&&t.serverMaxWindowBits>e.server_max_window_bits)||"number"==typeof t.clientMaxWindowBits&&!e.client_max_window_bits));if(!n)throw new Error("None of the extension offers can be accepted");return t.serverNoContextTakeover&&(n.server_no_context_takeover=!0),t.clientNoContextTakeover&&(n.client_no_context_takeover=!0),"number"==typeof t.serverMaxWindowBits&&(n.server_max_window_bits=t.serverMaxWindowBits),"number"==typeof t.clientMaxWindowBits?n.client_max_window_bits=t.clientMaxWindowBits:!0!==n.client_max_window_bits&&!1!==t.clientMaxWindowBits||delete n.client_max_window_bits,n}acceptAsClient(e){const t=e[0];if(!1===this._options.clientNoContextTakeover&&t.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(t.client_max_window_bits){if(!1===this._options.clientMaxWindowBits||"number"==typeof this._options.clientMaxWindowBits&&t.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"')}else"number"==typeof this._options.clientMaxWindowBits&&(t.client_max_window_bits=this._options.clientMaxWindowBits);return t}normalizeParams(e){return e.forEach(e=>{Object.keys(e).forEach(t=>{let n=e[t];if(n.length>1)throw new Error(`Parameter "${t}" must have only a single value`);if(n=n[0],"client_max_window_bits"===t){if(!0!==n){const e=+n;if(!Number.isInteger(e)||e<8||e>15)throw new TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${t}": ${n}`)}else if("server_max_window_bits"===t){const e=+n;if(!Number.isInteger(e)||e<8||e>15)throw new TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else{if("client_no_context_takeover"!==t&&"server_no_context_takeover"!==t)throw new Error(`Unknown parameter "${t}"`);if(!0!==n)throw new TypeError(`Invalid value for parameter "${t}": ${n}`)}e[t]=n})}),e}decompress(e,t,n){h.add(r=>{this._decompress(e,t,(e,t)=>{r(),n(e,t)})})}compress(e,t,n){h.add(r=>{this._compress(e,t,(e,t)=>{r(),n(e,t)})})}_decompress(e,t,n){const o=this._isServer?"client":"server";if(!this._inflate){const e=o+"_max_window_bits",t="number"!=typeof this.params[e]?r.Z_DEFAULT_WINDOWBITS:this.params[e];this._inflate=r.createInflateRaw({...this._options.zlibInflateOptions,windowBits:t}),this._inflate[s]=this,this._inflate[c]=0,this._inflate[d]=[],this._inflate.on("error",g),this._inflate.on("data",m)}this._inflate[f]=n,this._inflate.write(e),t&&this._inflate.write(l),this._inflate.flush(()=>{const e=this._inflate[p];if(e)return this._inflate.close(),this._inflate=null,void n(e);const r=i.concat(this._inflate[d],this._inflate[c]);t&&this.params[o+"_no_context_takeover"]?(this._inflate.close(),this._inflate=null):(this._inflate[c]=0,this._inflate[d]=[]),n(null,r)})}_compress(e,t,n){const o=this._isServer?"server":"client";if(!this._deflate){const e=o+"_max_window_bits",t="number"!=typeof this.params[e]?r.Z_DEFAULT_WINDOWBITS:this.params[e];this._deflate=r.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:t}),this._deflate[c]=0,this._deflate[d]=[],this._deflate.on("error",a),this._deflate.on("data",v)}this._deflate[f]=n,this._deflate.write(e),this._deflate.flush(r.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let e=i.concat(this._deflate[d],this._deflate[c]);t&&(e=e.slice(0,e.length-4)),this._deflate[f]=null,t&&this.params[o+"_no_context_takeover"]?(this._deflate.close(),this._deflate=null):(this._deflate[c]=0,this._deflate[d]=[]),n(null,e)})}}},1762:(e,t,n)=>{"use strict";const{Writable:r}=n(2413),i=n(2309),{BINARY_TYPES:o,EMPTY_BUFFER:u,kStatusCode:a,kWebSocket:l}=n(5739),{concat:s,toArrayBuffer:c,unmask:f}=n(8716),{isValidStatusCode:d,isValidUTF8:p}=n(9498);function h(e,t,n,r){const i=new e(n?"Invalid WebSocket frame: "+t:t);return Error.captureStackTrace(i,h),i[a]=r,i}e.exports=class extends r{constructor(e,t,n,r){super(),this._binaryType=e||o[0],this[l]=void 0,this._extensions=t||{},this._isServer=!!n,this._maxPayload=0|r,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._state=0,this._loop=!1}_write(e,t,n){if(8===this._opcode&&0==this._state)return n();this._bufferedBytes+=e.length,this._buffers.push(e),this.startLoop(n)}consume(e){if(this._bufferedBytes-=e,e===this._buffers[0].length)return this._buffers.shift();if(e=n.length?t.set(this._buffers.shift(),r):(t.set(new Uint8Array(n.buffer,n.byteOffset,e),r),this._buffers[0]=n.slice(e)),e-=n.length}while(e>0);return t}startLoop(e){let t;this._loop=!0;do{switch(this._state){case 0:t=this.getInfo();break;case 1:t=this.getPayloadLength16();break;case 2:t=this.getPayloadLength64();break;case 3:this.getMask();break;case 4:t=this.getData(e);break;default:return void(this._loop=!1)}}while(this._loop);e(t)}getInfo(){if(this._bufferedBytes<2)return void(this._loop=!1);const e=this.consume(2);if(0!=(48&e[0]))return this._loop=!1,h(RangeError,"RSV2 and RSV3 must be clear",!0,1002);const t=64==(64&e[0]);if(t&&!this._extensions[i.extensionName])return this._loop=!1,h(RangeError,"RSV1 must be clear",!0,1002);if(this._fin=128==(128&e[0]),this._opcode=15&e[0],this._payloadLength=127&e[1],0===this._opcode){if(t)return this._loop=!1,h(RangeError,"RSV1 must be clear",!0,1002);if(!this._fragmented)return this._loop=!1,h(RangeError,"invalid opcode 0",!0,1002);this._opcode=this._fragmented}else if(1===this._opcode||2===this._opcode){if(this._fragmented)return this._loop=!1,h(RangeError,"invalid opcode "+this._opcode,!0,1002);this._compressed=t}else{if(!(this._opcode>7&&this._opcode<11))return this._loop=!1,h(RangeError,"invalid opcode "+this._opcode,!0,1002);if(!this._fin)return this._loop=!1,h(RangeError,"FIN must be set",!0,1002);if(t)return this._loop=!1,h(RangeError,"RSV1 must be clear",!0,1002);if(this._payloadLength>125)return this._loop=!1,h(RangeError,"invalid payload length "+this._payloadLength,!0,1002)}if(this._fin||this._fragmented||(this._fragmented=this._opcode),this._masked=128==(128&e[1]),this._isServer){if(!this._masked)return this._loop=!1,h(RangeError,"MASK must be set",!0,1002)}else if(this._masked)return this._loop=!1,h(RangeError,"MASK must be clear",!0,1002);if(126===this._payloadLength)this._state=1;else{if(127!==this._payloadLength)return this.haveLength();this._state=2}}getPayloadLength16(){if(!(this._bufferedBytes<2))return this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength();this._loop=!1}getPayloadLength64(){if(this._bufferedBytes<8)return void(this._loop=!1);const e=this.consume(8),t=e.readUInt32BE(0);return t>Math.pow(2,21)-1?(this._loop=!1,h(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009)):(this._payloadLength=t*Math.pow(2,32)+e.readUInt32BE(4),this.haveLength())}haveLength(){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0))return this._loop=!1,h(RangeError,"Max payload size exceeded",!1,1009);this._masked?this._state=3:this._state=4}getMask(){this._bufferedBytes<4?this._loop=!1:(this._mask=this.consume(4),this._state=4)}getData(e){let t=u;if(this._payloadLength){if(this._bufferedBytes7?this.controlMessage(t):this._compressed?(this._state=5,void this.decompress(t,e)):(t.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(t)),this.dataMessage())}decompress(e,t){this._extensions[i.extensionName].decompress(e,this._fin,(e,n)=>{if(e)return t(e);if(n.length){if(this._messageLength+=n.length,this._messageLength>this._maxPayload&&this._maxPayload>0)return t(h(RangeError,"Max payload size exceeded",!1,1009));this._fragments.push(n)}const r=this.dataMessage();if(r)return t(r);this.startLoop(t)})}dataMessage(){if(this._fin){const e=this._messageLength,t=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],2===this._opcode){let n;n="nodebuffer"===this._binaryType?s(t,e):"arraybuffer"===this._binaryType?c(s(t,e)):t,this.emit("message",n)}else{const n=s(t,e);if(!p(n))return this._loop=!1,h(Error,"invalid UTF-8 sequence",!0,1007);this.emit("message",n.toString())}}this._state=0}controlMessage(e){if(8===this._opcode)if(this._loop=!1,0===e.length)this.emit("conclude",1005,""),this.end();else{if(1===e.length)return h(RangeError,"invalid payload length 1",!0,1002);{const t=e.readUInt16BE(0);if(!d(t))return h(RangeError,"invalid status code "+t,!0,1002);const n=e.slice(2);if(!p(n))return h(Error,"invalid UTF-8 sequence",!0,1007);this.emit("conclude",t,n.toString()),this.end()}}else 9===this._opcode?this.emit("ping",e):this.emit("pong",e);this._state=0}}},9576:(e,t,n)=>{"use strict";const{randomFillSync:r}=n(6417),i=n(2309),{EMPTY_BUFFER:o}=n(5739),{isValidStatusCode:u}=n(9498),{mask:a,toBuffer:l}=n(8716),s=Buffer.alloc(4);class c{constructor(e,t){this._extensions=t||{},this._socket=e,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._deflating=!1,this._queue=[]}static frame(e,t){const n=t.mask&&t.readOnly;let i=t.mask?6:2,o=e.length;e.length>=65536?(i+=8,o=127):e.length>125&&(i+=2,o=126);const u=Buffer.allocUnsafe(n?e.length+i:i);return u[0]=t.fin?128|t.opcode:t.opcode,t.rsv1&&(u[0]|=64),u[1]=o,126===o?u.writeUInt16BE(e.length,2):127===o&&(u.writeUInt32BE(0,2),u.writeUInt32BE(e.length,6)),t.mask?(r(s,0,4),u[1]|=128,u[i-4]=s[0],u[i-3]=s[1],u[i-2]=s[2],u[i-1]=s[3],n?(a(e,s,u,i,e.length),[u]):(a(e,s,e,0,e.length),[u,e])):[u,e]}close(e,t,n,r){let i;if(void 0===e)i=o;else{if("number"!=typeof e||!u(e))throw new TypeError("First argument must be a valid error code number");if(void 0===t||""===t)i=Buffer.allocUnsafe(2),i.writeUInt16BE(e,0);else{const n=Buffer.byteLength(t);if(n>123)throw new RangeError("The message must not be greater than 123 bytes");i=Buffer.allocUnsafe(2+n),i.writeUInt16BE(e,0),i.write(t,2)}}this._deflating?this.enqueue([this.doClose,i,n,r]):this.doClose(i,n,r)}doClose(e,t,n){this.sendFrame(c.frame(e,{fin:!0,rsv1:!1,opcode:8,mask:t,readOnly:!1}),n)}ping(e,t,n){const r=l(e);if(r.length>125)throw new RangeError("The data size must not be greater than 125 bytes");this._deflating?this.enqueue([this.doPing,r,t,l.readOnly,n]):this.doPing(r,t,l.readOnly,n)}doPing(e,t,n,r){this.sendFrame(c.frame(e,{fin:!0,rsv1:!1,opcode:9,mask:t,readOnly:n}),r)}pong(e,t,n){const r=l(e);if(r.length>125)throw new RangeError("The data size must not be greater than 125 bytes");this._deflating?this.enqueue([this.doPong,r,t,l.readOnly,n]):this.doPong(r,t,l.readOnly,n)}doPong(e,t,n,r){this.sendFrame(c.frame(e,{fin:!0,rsv1:!1,opcode:10,mask:t,readOnly:n}),r)}send(e,t,n){const r=l(e),o=this._extensions[i.extensionName];let u=t.binary?2:1,a=t.compress;if(this._firstFragment?(this._firstFragment=!1,a&&o&&(a=r.length>=o._threshold),this._compress=a):(a=!1,u=0),t.fin&&(this._firstFragment=!0),o){const e={fin:t.fin,rsv1:a,opcode:u,mask:t.mask,readOnly:l.readOnly};this._deflating?this.enqueue([this.dispatch,r,this._compress,e,n]):this.dispatch(r,this._compress,e,n)}else this.sendFrame(c.frame(r,{fin:t.fin,rsv1:!1,opcode:u,mask:t.mask,readOnly:l.readOnly}),n)}dispatch(e,t,n,r){if(!t)return void this.sendFrame(c.frame(e,n),r);const o=this._extensions[i.extensionName];this._bufferedBytes+=e.length,this._deflating=!0,o.compress(e,n.fin,(t,i)=>{if(this._socket.destroyed){const e=new Error("The socket was closed while data was being compressed");"function"==typeof r&&r(e);for(let t=0;t{"use strict";const{Duplex:r}=n(2413);function i(e){e.emit("close")}function o(){!this.destroyed&&this._writableState.finished&&this.destroy()}function u(e){this.removeListener("error",u),this.destroy(),0===this.listenerCount("error")&&this.emit("error",e)}e.exports=function(e,t){let n=!0;function a(){n&&e._socket.resume()}e.readyState===e.CONNECTING?e.once("open",(function(){e._receiver.removeAllListeners("drain"),e._receiver.on("drain",a)})):(e._receiver.removeAllListeners("drain"),e._receiver.on("drain",a));const l=new r({...t,autoDestroy:!1,emitClose:!1,objectMode:!1,writableObjectMode:!1});return e.on("message",(function(t){l.push(t)||(n=!1,e._socket.pause())})),e.once("error",(function(e){l.destroyed||l.destroy(e)})),e.once("close",(function(){l.destroyed||l.push(null)})),l._destroy=function(t,n){if(e.readyState===e.CLOSED)return n(t),void process.nextTick(i,l);let r=!1;e.once("error",(function(e){r=!0,n(e)})),e.once("close",(function(){r||n(t),process.nextTick(i,l)})),e.terminate()},l._final=function(t){e.readyState!==e.CONNECTING?null!==e._socket&&(e._socket._writableState.finished?(t(),l._readableState.endEmitted&&l.destroy()):(e._socket.once("finish",(function(){t()})),e.close())):e.once("open",(function(){l._final(t)}))},l._read=function(){e.readyState!==e.OPEN||n||(n=!0,e._receiver._writableState.needDrain||e._socket.resume())},l._write=function(t,n,r){e.readyState!==e.CONNECTING?e.send(t,r):e.once("open",(function(){l._write(t,n,r)}))},l.on("end",o),l.on("error",u),l}},9498:(e,t,n)=>{"use strict";try{const e=n(Object(function(){var e=new Error("Cannot find module 'utf-8-validate'");throw e.code="MODULE_NOT_FOUND",e}()));t.isValidUTF8="object"==typeof e?e.Validation.isValidUTF8:e}catch(e){t.isValidUTF8=()=>!0}t.isValidStatusCode=e=>e>=1e3&&e<=1014&&1004!==e&&1005!==e&&1006!==e||e>=3e3&&e<=4999},43:(e,t,n)=>{"use strict";const r=n(8614),{createHash:i}=n(6417),{createServer:o,STATUS_CODES:u}=n(8605),a=n(2309),l=n(5760),{format:s,parse:c}=n(8162),{GUID:f,kWebSocket:d}=n(5739),p=/^[+/0-9A-Za-z]{22}==$/;function h(e){e.emit("close")}function v(){this.destroy()}function m(e,t,n,r){e.writable&&(n=n||u[t],r={Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(n),...r},e.write(`HTTP/1.1 ${t} ${u[t]}\r\n`+Object.keys(r).map(e=>`${e}: ${r[e]}`).join("\r\n")+"\r\n\r\n"+n)),e.removeListener("error",v),e.destroy()}e.exports=class extends r{constructor(e,t){if(super(),null==(e={maxPayload:104857600,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,...e}).port&&!e.server&&!e.noServer)throw new TypeError('One of the "port", "server", or "noServer" options must be specified');null!=e.port?(this._server=o((e,t)=>{const n=u[426];t.writeHead(426,{"Content-Length":n.length,"Content-Type":"text/plain"}),t.end(n)}),this._server.listen(e.port,e.host,e.backlog,t)):e.server&&(this._server=e.server),this._server&&(this._removeListeners=function(e,t){for(const n of Object.keys(t))e.on(n,t[n]);return function(){for(const n of Object.keys(t))e.removeListener(n,t[n])}}(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(e,t,n)=>{this.handleUpgrade(e,t,n,t=>{this.emit("connection",t,e)})}})),!0===e.perMessageDeflate&&(e.perMessageDeflate={}),e.clientTracking&&(this.clients=new Set),this.options=e}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(e){if(e&&this.once("close",e),this.clients)for(const e of this.clients)e.terminate();const t=this._server;t&&(this._removeListeners(),this._removeListeners=this._server=null,null!=this.options.port)?t.close(()=>this.emit("close")):process.nextTick(h,this)}shouldHandle(e){if(this.options.path){const t=e.url.indexOf("?");if((-1!==t?e.url.slice(0,t):e.url)!==this.options.path)return!1}return!0}handleUpgrade(e,t,n,r){t.on("error",v);const i=void 0!==e.headers["sec-websocket-key"]&&e.headers["sec-websocket-key"].trim(),o=+e.headers["sec-websocket-version"],u={};if("GET"!==e.method||"websocket"!==e.headers.upgrade.toLowerCase()||!i||!p.test(i)||8!==o&&13!==o||!this.shouldHandle(e))return m(t,400);if(this.options.perMessageDeflate){const n=new a(this.options.perMessageDeflate,!0,this.options.maxPayload);try{const t=c(e.headers["sec-websocket-extensions"]);t[a.extensionName]&&(n.accept(t[a.extensionName]),u[a.extensionName]=n)}catch(e){return m(t,400)}}if(this.options.verifyClient){const a={origin:e.headers[""+(8===o?"sec-websocket-origin":"origin")],secure:!(!e.connection.authorized&&!e.connection.encrypted),req:e};if(2===this.options.verifyClient.length)return void this.options.verifyClient(a,(o,a,l,s)=>{if(!o)return m(t,a||401,l,s);this.completeUpgrade(i,u,e,t,n,r)});if(!this.options.verifyClient(a))return m(t,401)}this.completeUpgrade(i,u,e,t,n,r)}completeUpgrade(e,t,n,r,o,u){if(!r.readable||!r.writable)return r.destroy();if(r[d])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");const c=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade","Sec-WebSocket-Accept: "+i("sha1").update(e+f).digest("base64")],p=new l(null);let h=n.headers["sec-websocket-protocol"];if(h&&(h=h.trim().split(/ *, */),h=this.options.handleProtocols?this.options.handleProtocols(h,n):h[0],h&&(c.push("Sec-WebSocket-Protocol: "+h),p.protocol=h)),t[a.extensionName]){const e=t[a.extensionName].params,n=s({[a.extensionName]:[e]});c.push("Sec-WebSocket-Extensions: "+n),p._extensions=t}this.emit("headers",c,n),r.write(c.concat("\r\n").join("\r\n")),r.removeListener("error",v),p.setSocket(r,o,this.options.maxPayload),this.clients&&(this.clients.add(p),p.on("close",()=>this.clients.delete(p))),u(p)}}},5760:(e,t,n)=>{"use strict";const r=n(8614),i=n(7211),o=n(8605),u=n(1631),a=n(4016),{randomBytes:l,createHash:s}=n(6417),{URL:c}=n(8835),f=n(2309),d=n(1762),p=n(9576),{BINARY_TYPES:h,EMPTY_BUFFER:v,GUID:m,kStatusCode:g,kWebSocket:y,NOOP:_}=n(5739),{addEventListener:b,removeEventListener:w}=n(7002),{format:E,parse:D}=n(8162),{toBuffer:S}=n(8716),C=["CONNECTING","OPEN","CLOSING","CLOSED"],k=[8,13];class T extends r{constructor(e,t,n){super(),this.readyState=T.CONNECTING,this.protocol="",this._binaryType=h[0],this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage="",this._closeTimer=null,this._closeCode=1006,this._extensions={},this._receiver=null,this._sender=null,this._socket=null,null!==e?(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,Array.isArray(t)?t=t.join(", "):"object"==typeof t&&null!==t&&(n=t,t=void 0),function e(t,n,r,u){const a={protocolVersion:k[1],maxPayload:104857600,perMessageDeflate:!0,followRedirects:!1,maxRedirects:10,...u,createConnection:void 0,socketPath:void 0,hostname:void 0,protocol:void 0,timeout:void 0,method:void 0,host:void 0,path:void 0,port:void 0};if(!k.includes(a.protocolVersion))throw new RangeError(`Unsupported protocol version: ${a.protocolVersion} (supported versions: ${k.join(", ")})`);let d;n instanceof c?(d=n,t.url=n.href):(d=new c(n),t.url=n);const p="ws+unix:"===d.protocol;if(!(d.host||p&&d.pathname))throw new Error("Invalid URL: "+t.url);const h="wss:"===d.protocol||"https:"===d.protocol,v=h?443:80,g=l(16).toString("base64"),y=h?i.get:o.get;let _;a.createConnection=h?A:x,a.defaultPort=a.defaultPort||v,a.port=d.port||v,a.host=d.hostname.startsWith("[")?d.hostname.slice(1,-1):d.hostname,a.headers={"Sec-WebSocket-Version":a.protocolVersion,"Sec-WebSocket-Key":g,Connection:"Upgrade",Upgrade:"websocket",...a.headers},a.path=d.pathname+d.search,a.timeout=a.handshakeTimeout,a.perMessageDeflate&&(_=new f(!0!==a.perMessageDeflate?a.perMessageDeflate:{},!1,a.maxPayload),a.headers["Sec-WebSocket-Extensions"]=E({[f.extensionName]:_.offer()}));r&&(a.headers["Sec-WebSocket-Protocol"]=r);a.origin&&(a.protocolVersion<13?a.headers["Sec-WebSocket-Origin"]=a.origin:a.headers.Origin=a.origin);(d.username||d.password)&&(a.auth=`${d.username}:${d.password}`);if(p){const e=a.path.split(":");a.socketPath=e[0],a.path=e[1]}let b=t._req=y(a);a.timeout&&b.on("timeout",()=>{O(t,b,"Opening handshake has timed out")});b.on("error",e=>{t._req.aborted||(b=t._req=null,t.readyState=T.CLOSING,t.emit("error",e),t.emitClose())}),b.on("response",i=>{const o=i.headers.location,l=i.statusCode;if(o&&a.followRedirects&&l>=300&&l<400){if(++t._redirects>a.maxRedirects)return void O(t,b,"Maximum redirects exceeded");b.abort();const i=new c(o,n);e(t,i,r,u)}else t.emit("unexpected-response",b,i)||O(t,b,"Unexpected server response: "+i.statusCode)}),b.on("upgrade",(e,n,i)=>{if(t.emit("upgrade",e),t.readyState!==T.CONNECTING)return;b=t._req=null;const o=s("sha1").update(g+m).digest("base64");if(e.headers["sec-websocket-accept"]!==o)return void O(t,n,"Invalid Sec-WebSocket-Accept header");const u=e.headers["sec-websocket-protocol"],l=(r||"").split(/, */);let c;if(!r&&u?c="Server sent a subprotocol but none was requested":r&&!u?c="Server sent no subprotocol":u&&!l.includes(u)&&(c="Server sent an invalid subprotocol"),c)O(t,n,c);else{if(u&&(t.protocol=u),_)try{const n=D(e.headers["sec-websocket-extensions"]);n[f.extensionName]&&(_.accept(n[f.extensionName]),t._extensions[f.extensionName]=_)}catch(e){return void O(t,n,"Invalid Sec-WebSocket-Extensions header")}t.setSocket(n,i,a.maxPayload)}})}(this,e,t,n)):this._isServer=!0}get CONNECTING(){return T.CONNECTING}get CLOSING(){return T.CLOSING}get CLOSED(){return T.CLOSED}get OPEN(){return T.OPEN}get binaryType(){return this._binaryType}set binaryType(e){h.includes(e)&&(this._binaryType=e,this._receiver&&(this._receiver._binaryType=e))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}setSocket(e,t,n){const r=new d(this._binaryType,this._extensions,this._isServer,n);this._sender=new p(e,this._extensions),this._receiver=r,this._socket=e,r[y]=this,e[y]=this,r.on("conclude",I),r.on("drain",N),r.on("error",M),r.on("message",F),r.on("ping",L),r.on("pong",B),e.setTimeout(0),e.setNoDelay(),t.length>0&&e.unshift(t),e.on("close",j),e.on("data",U),e.on("end",z),e.on("error",W),this.readyState=T.OPEN,this.emit("open")}emitClose(){if(!this._socket)return this.readyState=T.CLOSED,void this.emit("close",this._closeCode,this._closeMessage);this._extensions[f.extensionName]&&this._extensions[f.extensionName].cleanup(),this._receiver.removeAllListeners(),this.readyState=T.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(e,t){if(this.readyState!==T.CLOSED){if(this.readyState===T.CONNECTING){const e="WebSocket was closed before the connection was established";return O(this,this._req,e)}this.readyState!==T.CLOSING?(this.readyState=T.CLOSING,this._sender.close(e,t,!this._isServer,e=>{e||(this._closeFrameSent=!0,this._closeFrameReceived&&this._socket.end())}),this._closeTimer=setTimeout(this._socket.destroy.bind(this._socket),3e4)):this._closeFrameSent&&this._closeFrameReceived&&this._socket.end()}}ping(e,t,n){if(this.readyState===T.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");"function"==typeof e?(n=e,e=t=void 0):"function"==typeof t&&(n=t,t=void 0),"number"==typeof e&&(e=e.toString()),this.readyState===T.OPEN?(void 0===t&&(t=!this._isServer),this._sender.ping(e||v,t,n)):P(this,e,n)}pong(e,t,n){if(this.readyState===T.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");"function"==typeof e?(n=e,e=t=void 0):"function"==typeof t&&(n=t,t=void 0),"number"==typeof e&&(e=e.toString()),this.readyState===T.OPEN?(void 0===t&&(t=!this._isServer),this._sender.pong(e||v,t,n)):P(this,e,n)}send(e,t,n){if(this.readyState===T.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if("function"==typeof t&&(n=t,t={}),"number"==typeof e&&(e=e.toString()),this.readyState!==T.OPEN)return void P(this,e,n);const r={binary:"string"!=typeof e,mask:!this._isServer,compress:!0,fin:!0,...t};this._extensions[f.extensionName]||(r.compress=!1),this._sender.send(e||v,r,n)}terminate(){if(this.readyState!==T.CLOSED){if(this.readyState===T.CONNECTING){const e="WebSocket was closed before the connection was established";return O(this,this._req,e)}this._socket&&(this.readyState=T.CLOSING,this._socket.destroy())}}}function x(e){return e.path=e.socketPath,u.connect(e)}function A(e){return e.path=void 0,e.servername||""===e.servername||(e.servername=e.host),a.connect(e)}function O(e,t,n){e.readyState=T.CLOSING;const r=new Error(n);Error.captureStackTrace(r,O),t.setHeader?(t.abort(),t.once("abort",e.emitClose.bind(e)),e.emit("error",r)):(t.destroy(r),t.once("error",e.emit.bind(e,"error")),t.once("close",e.emitClose.bind(e)))}function P(e,t,n){if(t){const n=S(t).length;e._socket?e._sender._bufferedBytes+=n:e._bufferedAmount+=n}if(n){n(new Error(`WebSocket is not open: readyState ${e.readyState} (${C[e.readyState]})`))}}function I(e,t){const n=this[y];n._socket.removeListener("data",U),n._socket.resume(),n._closeFrameReceived=!0,n._closeMessage=t,n._closeCode=e,1005===e?n.close():n.close(e,t)}function N(){this[y]._socket.resume()}function M(e){const t=this[y];t._socket.removeListener("data",U),t.readyState=T.CLOSING,t._closeCode=e[g],t.emit("error",e),t._socket.destroy()}function R(){this[y].emitClose()}function F(e){this[y].emit("message",e)}function L(e){const t=this[y];t.pong(e,!t._isServer,_),t.emit("ping",e)}function B(e){this[y].emit("pong",e)}function j(){const e=this[y];this.removeListener("close",j),this.removeListener("end",z),e.readyState=T.CLOSING,e._socket.read(),e._receiver.end(),this.removeListener("data",U),this[y]=void 0,clearTimeout(e._closeTimer),e._receiver._writableState.finished||e._receiver._writableState.errorEmitted?e.emitClose():(e._receiver.on("error",R),e._receiver.on("finish",R))}function U(e){this[y]._receiver.write(e)||this.pause()}function z(){const e=this[y];e.readyState=T.CLOSING,e._receiver.end(),this.end()}function W(){const e=this[y];this.removeListener("error",W),this.on("error",_),e&&(e.readyState=T.CLOSING,this.destroy())}C.forEach((e,t)=>{T[e]=t}),["open","error","close","message"].forEach(e=>{Object.defineProperty(T.prototype,"on"+e,{get(){const t=this.listeners(e);for(let e=0;e{"use strict";function r(e){const t=[...e.caches],n=t.shift();return void 0===n?i():{get:(e,i,o={miss:()=>Promise.resolve()})=>n.get(e,i,o).catch(()=>r({caches:t}).get(e,i,o)),set:(e,i)=>n.set(e,i).catch(()=>r({caches:t}).set(e,i)),delete:e=>n.delete(e).catch(()=>r({caches:t}).delete(e)),clear:()=>n.clear().catch(()=>r({caches:t}).clear())}}function i(){return{get:(e,t,n={miss:()=>Promise.resolve()})=>t().then(e=>Promise.all([e,n.miss(e)])).then(([e])=>e),set:(e,t)=>Promise.resolve(t),delete:e=>Promise.resolve(),clear:()=>Promise.resolve()}}n.r(t),n.d(t,{createFallbackableCache:()=>r,createNullCache:()=>i})},6712:(e,t,n)=>{"use strict";function r(e={serializable:!0}){let t={};return{get(n,r,i={miss:()=>Promise.resolve()}){const o=JSON.stringify(n);if(o in t)return Promise.resolve(e.serializable?JSON.parse(t[o]):t[o]);const u=r(),a=i&&i.miss||(()=>Promise.resolve());return u.then(e=>a(e)).then(()=>u)},set:(n,r)=>(t[JSON.stringify(n)]=e.serializable?JSON.stringify(r):r,Promise.resolve(r)),delete:e=>(delete t[JSON.stringify(e)],Promise.resolve()),clear:()=>(t={},Promise.resolve())}}n.r(t),n.d(t,{createInMemoryCache:()=>r})},2223:(e,t,n)=>{"use strict";n.r(t),n.d(t,{addABTest:()=>a,createAnalyticsClient:()=>u,deleteABTest:()=>l,getABTest:()=>s,getABTests:()=>c,stopABTest:()=>f});var r=n(1757),i=n(7858),o=n(5541);const u=e=>{const t=e.region||"us",n=(0,r.createAuth)(r.AuthMode.WithinHeaders,e.appId,e.apiKey),o=(0,i.createTransporter)({hosts:[{url:`analytics.${t}.algolia.com`}],...e,headers:{...n.headers(),"content-type":"application/json",...e.headers},queryParameters:{...n.queryParameters(),...e.queryParameters}}),u=e.appId;return(0,r.addMethods)({appId:u,transporter:o},e.methods)},a=e=>(t,n)=>e.transporter.write({method:o.N.Post,path:"2/abtests",data:t},n),l=e=>(t,n)=>e.transporter.write({method:o.N.Delete,path:(0,r.encode)("2/abtests/%s",t)},n),s=e=>(t,n)=>e.transporter.read({method:o.N.Get,path:(0,r.encode)("2/abtests/%s",t)},n),c=e=>t=>e.transporter.read({method:o.N.Get,path:"2/abtests"},t),f=e=>(t,n)=>e.transporter.write({method:o.N.Post,path:(0,r.encode)("2/abtests/%s/stop",t)},n)},1757:(e,t,n)=>{"use strict";function r(e,t,n){const r={"x-algolia-api-key":n,"x-algolia-application-id":t};return{headers:()=>e===f.WithinHeaders?r:{},queryParameters:()=>e===f.WithinQueryParameters?r:{}}}function i(e){let t=0;const n=()=>(t++,new Promise(r=>{setTimeout(()=>{r(e(n))},Math.min(100*t,1e3))}));return e(n)}function o(e,t=((e,t)=>Promise.resolve())){return Object.assign(e,{wait:n=>o(e.then(e=>Promise.all([t(e,n),e])).then(e=>e[1]))})}function u(e){let t=e.length-1;for(;t>0;t--){const n=Math.floor(Math.random()*(t+1)),r=e[t];e[t]=e[n],e[n]=r}return e}function a(e,t){return Object.keys(void 0!==t?t:{}).forEach(n=>{e[n]=t[n](e)}),e}function l(e,...t){let n=0;return e.replace(/%s/g,()=>encodeURIComponent(t[n++]))}n.r(t),n.d(t,{AuthMode:()=>f,addMethods:()=>a,createAuth:()=>r,createRetryablePromise:()=>i,createWaitablePromise:()=>o,destroy:()=>c,encode:()=>l,shuffle:()=>u,version:()=>s});const s="4.2.0",c=e=>()=>e.transporter.requester.destroy(),f={WithinQueryParameters:0,WithinHeaders:1}},103:(e,t,n)=>{"use strict";n.r(t),n.d(t,{createRecommendationClient:()=>u,getPersonalizationStrategy:()=>a,setPersonalizationStrategy:()=>l});var r=n(1757),i=n(7858),o=n(5541);const u=e=>{const t=e.region||"us",n=(0,r.createAuth)(r.AuthMode.WithinHeaders,e.appId,e.apiKey),o=(0,i.createTransporter)({hosts:[{url:`recommendation.${t}.algolia.com`}],...e,headers:{...n.headers(),"content-type":"application/json",...e.headers},queryParameters:{...n.queryParameters(),...e.queryParameters}});return(0,r.addMethods)({appId:e.appId,transporter:o},e.methods)},a=e=>t=>e.transporter.read({method:o.N.Get,path:"1/strategies/personalization"},t),l=e=>(t,n)=>e.transporter.write({method:o.N.Post,path:"1/strategies/personalization",data:t},n)},6586:(e,t,n)=>{"use strict";n.r(t),n.d(t,{ApiKeyACLEnum:()=>Te,BatchActionEnum:()=>xe,ScopeEnum:()=>Ae,StrategyEnum:()=>Oe,SynonymEnum:()=>Pe,addApiKey:()=>d,assignUserID:()=>p,assignUserIDs:()=>h,batch:()=>z,browseObjects:()=>W,browseRules:()=>H,browseSynonyms:()=>V,chunkedBatch:()=>q,clearObjects:()=>G,clearRules:()=>$,clearSynonyms:()=>Y,copyIndex:()=>v,copyRules:()=>m,copySettings:()=>g,copySynonyms:()=>y,createBrowsablePromise:()=>a,createMissingObjectIDError:()=>s,createObjectNotFoundError:()=>c,createSearchClient:()=>l,createValidUntilNotFoundError:()=>f,deleteApiKey:()=>_,deleteBy:()=>K,deleteIndex:()=>X,deleteObject:()=>Q,deleteObjects:()=>J,deleteRule:()=>Z,deleteSynonym:()=>ee,exists:()=>te,findObject:()=>ne,generateSecuredApiKey:()=>b,getApiKey:()=>w,getLogs:()=>E,getObject:()=>re,getObjectPosition:()=>ie,getObjects:()=>oe,getRule:()=>ue,getSecuredApiKeyRemainingValidity:()=>D,getSettings:()=>ae,getSynonym:()=>le,getTask:()=>se,getTopUserIDs:()=>S,getUserID:()=>C,hasPendingMappings:()=>k,initIndex:()=>T,listApiKeys:()=>x,listClusters:()=>A,listIndices:()=>O,listUserIDs:()=>P,moveIndex:()=>I,multipleBatch:()=>N,multipleGetObjects:()=>M,multipleQueries:()=>R,multipleSearchForFacetValues:()=>F,partialUpdateObject:()=>ce,partialUpdateObjects:()=>fe,removeUserID:()=>L,replaceAllObjects:()=>de,replaceAllRules:()=>pe,replaceAllSynonyms:()=>he,restoreApiKey:()=>B,saveObject:()=>ve,saveObjects:()=>me,saveRule:()=>ge,saveRules:()=>ye,saveSynonym:()=>_e,saveSynonyms:()=>be,search:()=>we,searchForFacetValues:()=>Ee,searchRules:()=>De,searchSynonyms:()=>Se,searchUserIDs:()=>j,setSettings:()=>Ce,updateApiKey:()=>U,waitTask:()=>ke});var r=n(1757),i=n(7858),o=n(5541),u=n(6417);function a(e){const t=n=>e.request(n).then(r=>{if(void 0!==e.batch&&e.batch(r.hits),!e.shouldStop(r))return r.cursor?t({cursor:r.cursor}):t({page:(n.page||0)+1})});return t({})}const l=e=>{const t=e.appId,n=(0,r.createAuth)(void 0!==e.authMode?e.authMode:r.AuthMode.WithinHeaders,t,e.apiKey),o=(0,i.createTransporter)({hosts:[{url:t+"-dsn.algolia.net",accept:i.CallEnum.Read},{url:t+".algolia.net",accept:i.CallEnum.Write}].concat((0,r.shuffle)([{url:t+"-1.algolianet.com"},{url:t+"-2.algolianet.com"},{url:t+"-3.algolianet.com"}])),...e,headers:{...n.headers(),"content-type":"application/x-www-form-urlencoded",...e.headers},queryParameters:{...n.queryParameters(),...e.queryParameters}}),u={transporter:o,appId:t,addAlgoliaAgent(e,t){o.userAgent.add({segment:e,version:t})},clearCache:()=>Promise.all([o.requestsCache.clear(),o.responsesCache.clear()]).then(()=>{})};return(0,r.addMethods)(u,e.methods)};function s(){return{name:"MissingObjectIDError",message:"All objects must have an unique objectID (like a primary key) to be valid. Algolia is also able to generate objectIDs automatically but *it's not recommended*. To do it, use the `{'autoGenerateObjectIDIfNotExist': true}` option."}}function c(){return{name:"ObjectNotFoundError",message:"Object not found."}}function f(){return{name:"ValidUntilNotFoundError",message:"ValidUntil not found in given secured api key."}}const d=e=>(t,n)=>{const{queryParameters:i,...u}=n||{},a={acl:t,...void 0!==i?{queryParameters:i}:{}};return(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Post,path:"1/keys",data:a},u),(t,n)=>(0,r.createRetryablePromise)(r=>w(e)(t.key,n).catch(e=>{if(404!==e.status)throw e;return r()})))},p=e=>(t,n,r)=>{const u=(0,i.createMappedRequestOptions)(r);return u.queryParameters["X-Algolia-User-ID"]=t,e.transporter.write({method:o.N.Post,path:"1/clusters/mapping",data:{cluster:n}},u)},h=e=>(t,n,r)=>e.transporter.write({method:o.N.Post,path:"1/clusters/mapping/batch",data:{users:t,cluster:n}},r),v=e=>(t,n,i)=>(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Post,path:(0,r.encode)("1/indexes/%s/operation",t),data:{operation:"copy",destination:n}},i),(n,r)=>T(e)(t,{methods:{waitTask:ke}}).waitTask(n.taskID,r)),m=e=>(t,n,r)=>v(e)(t,n,{...r,scope:[Ae.Rules]}),g=e=>(t,n,r)=>v(e)(t,n,{...r,scope:[Ae.Settings]}),y=e=>(t,n,r)=>v(e)(t,n,{...r,scope:[Ae.Synonyms]}),_=e=>(t,n)=>(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Delete,path:(0,r.encode)("1/keys/%s",t)},n),(n,i)=>(0,r.createRetryablePromise)(n=>w(e)(t,i).then(n).catch(e=>{if(404!==e.status)throw e}))),b=()=>(e,t)=>{const n=(0,i.serializeQueryParameters)(t),r=(0,u.createHmac)("sha256",e).update(n).digest("hex");return Buffer.from(r+n).toString("base64")},w=e=>(t,n)=>e.transporter.read({method:o.N.Get,path:(0,r.encode)("1/keys/%s",t)},n),E=e=>t=>e.transporter.read({method:o.N.Get,path:"1/logs"},t),D=()=>e=>{const t=Buffer.from(e,"base64").toString("ascii").match(/validUntil=(\d+)/);if(null===t)throw{name:"ValidUntilNotFoundError",message:"ValidUntil not found in given secured api key."};return parseInt(t[1],10)-Math.round((new Date).getTime()/1e3)},S=e=>t=>e.transporter.read({method:o.N.Get,path:"1/clusters/mapping/top"},t),C=e=>(t,n)=>e.transporter.read({method:o.N.Get,path:(0,r.encode)("1/clusters/mapping/%s",t)},n),k=e=>t=>{const{retrieveMappings:n,...r}=t||{};return!0===n&&(r.getClusters=!0),e.transporter.read({method:o.N.Get,path:"1/clusters/mapping/pending"},r)},T=e=>(t,n={})=>{const i={transporter:e.transporter,appId:e.appId,indexName:t};return(0,r.addMethods)(i,n.methods)},x=e=>t=>e.transporter.read({method:o.N.Get,path:"1/keys"},t),A=e=>t=>e.transporter.read({method:o.N.Get,path:"1/clusters"},t),O=e=>t=>e.transporter.read({method:o.N.Get,path:"1/indexes"},t),P=e=>t=>e.transporter.read({method:o.N.Get,path:"1/clusters/mapping"},t),I=e=>(t,n,i)=>(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Post,path:(0,r.encode)("1/indexes/%s/operation",t),data:{operation:"move",destination:n}},i),(n,r)=>T(e)(t,{methods:{waitTask:ke}}).waitTask(n.taskID,r)),N=e=>(t,n)=>(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Post,path:"1/indexes/*/batch",data:{requests:t}},n),(t,n)=>Promise.all(Object.keys(t.taskID).map(r=>T(e)(r,{methods:{waitTask:ke}}).waitTask(t.taskID[r],n)))),M=e=>(t,n)=>e.transporter.read({method:o.N.Post,path:"1/indexes/*/objects",data:{requests:t}},n),R=e=>(t,n)=>{const r=t.map(e=>({...e,params:(0,i.serializeQueryParameters)(e.params||{})}));return e.transporter.read({method:o.N.Post,path:"1/indexes/*/queries",data:{requests:r},cacheable:!0},n)},F=e=>(t,n)=>Promise.all(t.map(t=>{const{facetName:r,facetQuery:i,...o}=t.params;return T(e)(t.indexName,{methods:{searchForFacetValues:Ee}}).searchForFacetValues(r,i,{...n,...o})})),L=e=>(t,n)=>{const r=(0,i.createMappedRequestOptions)(n);return r.queryParameters["X-Algolia-User-ID"]=t,e.transporter.write({method:o.N.Delete,path:"1/clusters/mapping"},r)},B=e=>(t,n)=>(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Post,path:(0,r.encode)("1/keys/%s/restore",t)},n),(n,i)=>(0,r.createRetryablePromise)(n=>w(e)(t,i).catch(e=>{if(404!==e.status)throw e;return n()}))),j=e=>(t,n)=>e.transporter.read({method:o.N.Post,path:"1/clusters/mapping/search",data:{query:t}},n),U=e=>(t,n)=>{const i=Object.assign({},n),{queryParameters:u,...a}=n||{},l=u?{queryParameters:u}:{},s=["acl","indexes","referers","restrictSources","queryParameters","description","maxQueriesPerIPPerHour","maxHitsPerQuery"];return(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Put,path:(0,r.encode)("1/keys/%s",t),data:l},a),(n,o)=>(0,r.createRetryablePromise)(n=>w(e)(t,o).then(e=>(e=>Object.keys(i).filter(e=>-1!==s.indexOf(e)).every(t=>e[t]===i[t]))(e)?Promise.resolve():n())))},z=e=>(t,n)=>(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Post,path:(0,r.encode)("1/indexes/%s/batch",e.indexName),data:{requests:t}},n),(t,n)=>ke(e)(t.taskID,n)),W=e=>t=>a({...t,shouldStop:e=>void 0===e.cursor,request:n=>e.transporter.read({method:o.N.Post,path:(0,r.encode)("1/indexes/%s/browse",e.indexName),data:n},t)}),H=e=>t=>{const n={hitsPerPage:1e3,...t};return a({...n,shouldStop:e=>e.hits.lengthDe(e)("",{...n,...t}).then(e=>({...e,hits:e.hits.map(e=>(delete e._highlightResult,e))}))})},V=e=>t=>{const n={hitsPerPage:1e3,...t};return a({...n,shouldStop:e=>e.hits.lengthSe(e)("",{...n,...t}).then(e=>({...e,hits:e.hits.map(e=>(delete e._highlightResult,e))}))})},q=e=>(t,n,i)=>{const{batchSize:o,...u}=i||{},a={taskIDs:[],objectIDs:[]},l=(r=0)=>{const i=[];let s;for(s=r;s({action:n,body:e})),u).then(e=>(a.objectIDs=a.objectIDs.concat(e.objectIDs),a.taskIDs.push(e.taskID),s++,l(s)))};return(0,r.createWaitablePromise)(l(),(t,n)=>Promise.all(t.taskIDs.map(t=>ke(e)(t,n))))},G=e=>t=>(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Post,path:(0,r.encode)("1/indexes/%s/clear",e.indexName)},t),(t,n)=>ke(e)(t.taskID,n)),$=e=>t=>{const{forwardToReplicas:n,...u}=t||{},a=(0,i.createMappedRequestOptions)(u);return n&&(a.queryParameters.forwardToReplicas=1),(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Post,path:(0,r.encode)("1/indexes/%s/rules/clear",e.indexName)},a),(t,n)=>ke(e)(t.taskID,n))},Y=e=>t=>{const{forwardToReplicas:n,...u}=t||{},a=(0,i.createMappedRequestOptions)(u);return n&&(a.queryParameters.forwardToReplicas=1),(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Post,path:(0,r.encode)("1/indexes/%s/synonyms/clear",e.indexName)},a),(t,n)=>ke(e)(t.taskID,n))},K=e=>(t,n)=>(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Post,path:(0,r.encode)("1/indexes/%s/deleteByQuery",e.indexName),data:t},n),(t,n)=>ke(e)(t.taskID,n)),X=e=>t=>(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Delete,path:(0,r.encode)("1/indexes/%s",e.indexName)},t),(t,n)=>ke(e)(t.taskID,n)),Q=e=>(t,n)=>(0,r.createWaitablePromise)(J(e)([t],n).then(e=>({taskID:e.taskIDs[0]})),(t,n)=>ke(e)(t.taskID,n)),J=e=>(t,n)=>{const r=t.map(e=>({objectID:e}));return q(e)(r,xe.DeleteObject,n)},Z=e=>(t,n)=>{const{forwardToReplicas:u,...a}=n||{},l=(0,i.createMappedRequestOptions)(a);return u&&(l.queryParameters.forwardToReplicas=1),(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Delete,path:(0,r.encode)("1/indexes/%s/rules/%s",e.indexName,t)},l),(t,n)=>ke(e)(t.taskID,n))},ee=e=>(t,n)=>{const{forwardToReplicas:u,...a}=n||{},l=(0,i.createMappedRequestOptions)(a);return u&&(l.queryParameters.forwardToReplicas=1),(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Delete,path:(0,r.encode)("1/indexes/%s/synonyms/%s",e.indexName,t)},l),(t,n)=>ke(e)(t.taskID,n))},te=e=>t=>ae(e)(t).then(()=>!0).catch(e=>{if(404!==e.status)throw e;return!1}),ne=e=>(t,n)=>{const{query:r,paginate:i,...o}=n||{};let u=0;const a=()=>we(e)(r||"",{...o,page:u}).then(e=>{for(const[n,r]of Object.entries(e.hits))if(t(r))return{object:r,position:parseInt(n,10),page:u};if(u++,!1===i||u>=e.nbPages)throw{name:"ObjectNotFoundError",message:"Object not found."};return a()});return a()},re=e=>(t,n)=>e.transporter.read({method:o.N.Get,path:(0,r.encode)("1/indexes/%s/%s",e.indexName,t)},n),ie=()=>(e,t)=>{for(const[n,r]of Object.entries(e.hits))if(r.objectID===t)return parseInt(n,10);return-1},oe=e=>(t,n)=>{const{attributesToRetrieve:r,...i}=n||{},u=t.map(t=>({indexName:e.indexName,objectID:t,...r?{attributesToRetrieve:r}:{}}));return e.transporter.read({method:o.N.Post,path:"1/indexes/*/objects",data:{requests:u}},i)},ue=e=>(t,n)=>e.transporter.read({method:o.N.Get,path:(0,r.encode)("1/indexes/%s/rules/%s",e.indexName,t)},n),ae=e=>t=>e.transporter.read({method:o.N.Get,path:(0,r.encode)("1/indexes/%s/settings",e.indexName),data:{getVersion:2}},t),le=e=>(t,n)=>e.transporter.read({method:o.N.Get,path:(0,r.encode)("1/indexes/%s/synonyms/%s",e.indexName,t)},n),se=e=>(t,n)=>e.transporter.read({method:o.N.Get,path:(0,r.encode)("1/indexes/%s/task/%s",e.indexName,t.toString())},n),ce=e=>(t,n)=>(0,r.createWaitablePromise)(fe(e)([t],n).then(e=>({objectID:e.objectIDs[0],taskID:e.taskIDs[0]})),(t,n)=>ke(e)(t.taskID,n)),fe=e=>(t,n)=>{const{createIfNotExists:r,...i}=n||{},o=r?xe.PartialUpdateObject:xe.PartialUpdateObjectNoCreate;return q(e)(t,o,i)},de=e=>(t,n)=>{const{safe:i,autoGenerateObjectIDIfNotExist:u,batchSize:a,...l}=n||{},s=(t,n,i,u)=>(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Post,path:(0,r.encode)("1/indexes/%s/operation",t),data:{operation:i,destination:n}},u),(t,n)=>ke(e)(t.taskID,n)),c=Math.random().toString(36).substring(7),f=`${e.indexName}_tmp_${c}`,d=me({appId:e.appId,transporter:e.transporter,indexName:f});let p=[];const h=s(e.indexName,f,"copy",{...l,scope:["settings","synonyms","rules"]});p.push(h);const v=(i?h.wait(l):h).then(()=>{const e=d(t,{...l,autoGenerateObjectIDIfNotExist:u,batchSize:a});return p.push(e),i?e.wait(l):e}).then(()=>{const t=s(f,e.indexName,"move",l);return p.push(t),i?t.wait(l):t}).then(()=>Promise.all(p)).then(([e,t,n])=>({objectIDs:t.objectIDs,taskIDs:[e.taskID,...t.taskIDs,n.taskID]}));return(0,r.createWaitablePromise)(v,(e,t)=>Promise.all(p.map(e=>e.wait(t))))},pe=e=>(t,n)=>ye(e)(t,{...n,clearExistingRules:!0}),he=e=>(t,n)=>be(e)(t,{...n,replaceExistingSynonyms:!0}),ve=e=>(t,n)=>(0,r.createWaitablePromise)(me(e)([t],n).then(e=>({objectID:e.objectIDs[0],taskID:e.taskIDs[0]})),(t,n)=>ke(e)(t.taskID,n)),me=e=>(t,n)=>{const{autoGenerateObjectIDIfNotExist:i,...o}=n||{},u=i?xe.AddObject:xe.UpdateObject;if(u===xe.UpdateObject)for(const e of t)if(void 0===e.objectID)return(0,r.createWaitablePromise)(Promise.reject({name:"MissingObjectIDError",message:"All objects must have an unique objectID (like a primary key) to be valid. Algolia is also able to generate objectIDs automatically but *it's not recommended*. To do it, use the `{'autoGenerateObjectIDIfNotExist': true}` option."}));return q(e)(t,u,o)},ge=e=>(t,n)=>ye(e)([t],n),ye=e=>(t,n)=>{const{forwardToReplicas:u,clearExistingRules:a,...l}=n||{},s=(0,i.createMappedRequestOptions)(l);return u&&(s.queryParameters.forwardToReplicas=1),a&&(s.queryParameters.clearExistingRules=1),(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Post,path:(0,r.encode)("1/indexes/%s/rules/batch",e.indexName),data:t},s),(t,n)=>ke(e)(t.taskID,n))},_e=e=>(t,n)=>be(e)([t],n),be=e=>(t,n)=>{const{forwardToReplicas:u,replaceExistingSynonyms:a,...l}=n||{},s=(0,i.createMappedRequestOptions)(l);return u&&(s.queryParameters.forwardToReplicas=1),a&&(s.queryParameters.replaceExistingSynonyms=1),(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Post,path:(0,r.encode)("1/indexes/%s/synonyms/batch",e.indexName),data:t},s),(t,n)=>ke(e)(t.taskID,n))},we=e=>(t,n)=>e.transporter.read({method:o.N.Post,path:(0,r.encode)("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},n),Ee=e=>(t,n,i)=>e.transporter.read({method:o.N.Post,path:(0,r.encode)("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:n},cacheable:!0},i),De=e=>(t,n)=>e.transporter.read({method:o.N.Post,path:(0,r.encode)("1/indexes/%s/rules/search",e.indexName),data:{query:t}},n),Se=e=>(t,n)=>e.transporter.read({method:o.N.Post,path:(0,r.encode)("1/indexes/%s/synonyms/search",e.indexName),data:{query:t}},n),Ce=e=>(t,n)=>{const{forwardToReplicas:u,...a}=n||{},l=(0,i.createMappedRequestOptions)(a);return u&&(l.queryParameters.forwardToReplicas=1),(0,r.createWaitablePromise)(e.transporter.write({method:o.N.Put,path:(0,r.encode)("1/indexes/%s/settings",e.indexName),data:t},l),(t,n)=>ke(e)(t.taskID,n))},ke=e=>(t,n)=>(0,r.createRetryablePromise)(r=>se(e)(t,n).then(e=>"published"!==e.status?r():void 0)),Te={AddObject:"addObject",Analytics:"analytics",Browser:"browse",DeleteIndex:"deleteIndex",DeleteObject:"deleteObject",EditSettings:"editSettings",ListIndexes:"listIndexes",Logs:"logs",Recommendation:"recommendation",Search:"search",SeeUnretrievableAttributes:"seeUnretrievableAttributes",Settings:"settings",Usage:"usage"},xe={AddObject:"addObject",UpdateObject:"updateObject",PartialUpdateObject:"partialUpdateObject",PartialUpdateObjectNoCreate:"partialUpdateObjectNoCreate",DeleteObject:"deleteObject"},Ae={Settings:"settings",Synonyms:"synonyms",Rules:"rules"},Oe={None:"none",StopIfEnoughMatches:"stopIfEnoughMatches"},Pe={Synonym:"synonym",OneWaySynonym:"oneWaySynonym",AltCorrection1:"altCorrection1",AltCorrection2:"altCorrection2",Placeholder:"placeholder"}},8045:(e,t,n)=>{"use strict";function r(){return{debug:(e,t)=>Promise.resolve(),info:(e,t)=>Promise.resolve(),error:(e,t)=>Promise.resolve()}}n.r(t),n.d(t,{LogLevelEnum:()=>i,createNullLogger:()=>r});const i={Debug:1,Info:2,Error:3}},5541:(e,t,n)=>{"use strict";n.d(t,{N:()=>r});const r={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"}},9178:(e,t,n)=>{"use strict";n.r(t),n.d(t,{createNodeHttpRequester:()=>u});var r=n(8605),i=n(7211),o=n(8835);function u(){const e={keepAlive:!0},t=new r.Agent(e),n=new i.Agent(e);return{send:e=>new Promise(u=>{const a=(0,o.parse)(e.url),l=null===a.query?a.pathname:`${a.pathname}?${a.query}`,s={agent:"https:"===a.protocol?n:t,hostname:a.hostname,path:l,method:e.method,headers:e.headers,...void 0!==a.port?{port:a.port||""}:{}},c=("https:"===a.protocol?i:r).request(s,e=>{let t="";e.on("data",e=>t+=e),e.on("end",()=>{clearTimeout(d),clearTimeout(p),u({status:e.statusCode||0,content:t,isTimedOut:!1})})}),f=(e,t)=>setTimeout(()=>{c.abort(),u({status:0,content:t,isTimedOut:!0})},1e3*e),d=f(e.connectTimeout,"Connection timeout");let p;c.on("error",e=>{clearTimeout(d),clearTimeout(p),u({status:0,content:e.message,isTimedOut:!1})}),c.once("response",()=>{clearTimeout(d),p=f(e.responseTimeout,"Socket timeout")}),void 0!==e.data&&c.write(e.data),c.end()}),destroy:()=>(t.destroy(),n.destroy(),Promise.resolve())}}},7858:(e,t,n)=>{"use strict";n.r(t),n.d(t,{CallEnum:()=>o,HostStatusEnum:()=>u,createApiError:()=>E,createDeserializationError:()=>D,createMappedRequestOptions:()=>i,createRetryError:()=>S,createStatefulHost:()=>a,createStatelessHost:()=>c,createTransporter:()=>d,createUserAgent:()=>p,deserializeFailure:()=>v,deserializeSuccess:()=>h,isStatefulHostTimeouted:()=>s,isStatefulHostUp:()=>l,serializeData:()=>y,serializeHeaders:()=>_,serializeQueryParameters:()=>g,serializeUrl:()=>m,stackFrameWithoutCredentials:()=>w,stackTraceWithoutCredentials:()=>b});var r=n(5541);function i(e,t){const n=e||{},r=n.data||{};return Object.keys(n).forEach(e=>{-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(r[e]=n[e])}),{data:Object.entries(r).length>0?r:void 0,timeout:n.timeout||t,headers:n.headers||{},queryParameters:n.queryParameters||{},cacheable:n.cacheable}}const o={Read:1,Write:2,Any:3},u={Up:1,Down:2,Timeouted:3};function a(e,t=u.Up){return{...e,status:t,lastUpdate:Date.now()}}function l(e){return e.status===u.Up||Date.now()-e.lastUpdate>12e4}function s(e){return e.status===u.Timeouted&&Date.now()-e.lastUpdate<=12e4}function c(e){return{protocol:e.protocol||"https",url:e.url,accept:e.accept||o.Any}}function f(e,t,n,i){const o=[],f=y(n,i),d=_(e,i),p=n.method,g=n.method!==r.N.Get?{}:{...n.data,...i.data},E={"x-algolia-agent":e.userAgent.value,...e.queryParameters,...g,...i.queryParameters};let D=0;const C=(t,r)=>{const l=t.pop();if(void 0===l)throw S(b(o));const s={data:f,headers:d,method:p,url:m(l,n.path,E),connectTimeout:r(D,e.timeouts.connect),responseTimeout:r(D,i.timeout)},c=e=>{const n={request:s,response:e,host:l,triesLeft:t.length};return o.push(n),n},g={onSucess:e=>h(e),onRetry(n){const i=c(n);return n.isTimedOut&&D++,Promise.all([e.logger.info("Retryable failure",w(i)),e.hostsCache.set(l,a(l,n.isTimedOut?u.Timeouted:u.Down))]).then(()=>C(t,r))},onFail(e){throw c(e),v(e,b(o))}};return e.requester.send(s).then(e=>((e,t)=>(e=>{const t=e.status;return e.isTimedOut||(({isTimedOut:e,status:t})=>!e&&0==~~t)(e)||2!=~~(t/100)&&4!=~~(t/100)})(e)?t.onRetry(e):(({status:e})=>2==~~(e/100))(e)?t.onSucess(e):t.onFail(e))(e,g))};return function(e,t){return Promise.all(t.map(t=>e.get(t,()=>Promise.resolve(a(t))))).then(e=>{const n=e.filter(e=>l(e)),r=e.filter(e=>s(e)),i=[...n,...r];return{getTimeout:(e,t)=>(0===r.length&&0===e?1:r.length+3+e)*t,statelessHosts:i.length>0?i.map(e=>c(e)):t}})}(e.hostsCache,t).then(e=>C([...e.statelessHosts].reverse(),e.getTimeout))}function d(e){const{hostsCache:t,logger:n,requester:r,requestsCache:u,responsesCache:a,timeouts:l,userAgent:s,hosts:d,queryParameters:p,headers:h}=e,v={hostsCache:t,logger:n,requester:r,requestsCache:u,responsesCache:a,timeouts:l,userAgent:s,headers:h,queryParameters:p,hosts:d.map(e=>c(e)),read(e,t){const n=i(t,v.timeouts.read),r=()=>f(v,v.hosts.filter(e=>0!=(e.accept&o.Read)),e,n);if(!0!==(void 0!==n.cacheable?n.cacheable:e.cacheable))return r();const u={request:e,mappedRequestOptions:n,transporter:{queryParameters:v.queryParameters,headers:v.headers}};return v.responsesCache.get(u,()=>v.requestsCache.get(u,()=>v.requestsCache.set(u,r()).then(e=>Promise.all([v.requestsCache.delete(u),e]),e=>Promise.all([v.requestsCache.delete(u),Promise.reject(e)])).then(([e,t])=>t)),{miss:e=>v.responsesCache.set(u,e)})},write:(e,t)=>f(v,v.hosts.filter(e=>0!=(e.accept&o.Write)),e,i(t,v.timeouts.write))};return v}function p(e){const t={value:`Algolia for JavaScript (${e})`,add(e){const n=`; ${e.segment}${void 0!==e.version?` (${e.version})`:""}`;return-1===t.value.indexOf(n)&&(t.value=`${t.value}${n}`),t}};return t}function h(e){try{return JSON.parse(e.content)}catch(t){throw D(t.message,e)}}function v({content:e,status:t},n){let r=e;try{r=JSON.parse(e).message}catch(e){}return E(r,t,n)}function m(e,t,n){const r=g(n);let i=`${e.protocol}://${e.url}/${"/"===t.charAt(0)?t.substr(1):t}`;return r.length&&(i+="?"+r),i}function g(e){return Object.keys(e).map(t=>{return function(e,...t){let n=0;return e.replace(/%s/g,()=>encodeURIComponent(t[n++]))}("%s=%s",t,(n=e[t],"[object Object]"===Object.prototype.toString.call(n)||"[object Array]"===Object.prototype.toString.call(n)?JSON.stringify(e[t]):e[t]));var n}).join("&")}function y(e,t){if(e.method===r.N.Get||void 0===e.data&&void 0===t.data)return;const n=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(n)}function _(e,t){const n={...e.headers,...t.headers},r={};return Object.keys(n).forEach(e=>{const t=n[e];r[e.toLowerCase()]=t}),r}function b(e){return e.map(e=>w(e))}function w(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}function E(e,t,n){return{name:"ApiError",message:e,status:t,transporterStackTrace:n}}function D(e,t){return{name:"DeserializationError",message:e,response:t}}function S(e){return{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:e}}},8774:(e,t,n)=>{"use strict";var r=n(469),i=n(6712),o=n(2223),u=n(1757),a=n(103),l=n(6586),s=n(8045),c=n(9178),f=n(7858);function d(e,t,n){const d={appId:e,apiKey:t,timeouts:{connect:2,read:5,write:30},requester:c.createNodeHttpRequester(),logger:s.createNullLogger(),responsesCache:r.createNullCache(),requestsCache:r.createNullCache(),hostsCache:i.createInMemoryCache(),userAgent:f.createUserAgent(u.version).add({segment:"Node.js",version:process.versions.node})};return l.createSearchClient({...d,...n,methods:{search:l.multipleQueries,searchForFacetValues:l.multipleSearchForFacetValues,multipleBatch:l.multipleBatch,multipleGetObjects:l.multipleGetObjects,multipleQueries:l.multipleQueries,copyIndex:l.copyIndex,copySettings:l.copySettings,copyRules:l.copyRules,copySynonyms:l.copySynonyms,moveIndex:l.moveIndex,listIndices:l.listIndices,getLogs:l.getLogs,listClusters:l.listClusters,multipleSearchForFacetValues:l.multipleSearchForFacetValues,getApiKey:l.getApiKey,addApiKey:l.addApiKey,listApiKeys:l.listApiKeys,updateApiKey:l.updateApiKey,deleteApiKey:l.deleteApiKey,restoreApiKey:l.restoreApiKey,assignUserID:l.assignUserID,assignUserIDs:l.assignUserIDs,getUserID:l.getUserID,searchUserIDs:l.searchUserIDs,listUserIDs:l.listUserIDs,getTopUserIDs:l.getTopUserIDs,removeUserID:l.removeUserID,hasPendingMappings:l.hasPendingMappings,generateSecuredApiKey:l.generateSecuredApiKey,getSecuredApiKeyRemainingValidity:l.getSecuredApiKeyRemainingValidity,destroy:u.destroy,initIndex:e=>t=>l.initIndex(e)(t,{methods:{batch:l.batch,delete:l.deleteIndex,getObject:l.getObject,getObjects:l.getObjects,saveObject:l.saveObject,saveObjects:l.saveObjects,search:l.search,searchForFacetValues:l.searchForFacetValues,waitTask:l.waitTask,setSettings:l.setSettings,getSettings:l.getSettings,partialUpdateObject:l.partialUpdateObject,partialUpdateObjects:l.partialUpdateObjects,deleteObject:l.deleteObject,deleteObjects:l.deleteObjects,deleteBy:l.deleteBy,clearObjects:l.clearObjects,browseObjects:l.browseObjects,getObjectPosition:l.getObjectPosition,findObject:l.findObject,exists:l.exists,saveSynonym:l.saveSynonym,saveSynonyms:l.saveSynonyms,getSynonym:l.getSynonym,searchSynonyms:l.searchSynonyms,browseSynonyms:l.browseSynonyms,deleteSynonym:l.deleteSynonym,clearSynonyms:l.clearSynonyms,replaceAllObjects:l.replaceAllObjects,replaceAllSynonyms:l.replaceAllSynonyms,searchRules:l.searchRules,getRule:l.getRule,deleteRule:l.deleteRule,saveRule:l.saveRule,saveRules:l.saveRules,replaceAllRules:l.replaceAllRules,browseRules:l.browseRules,clearRules:l.clearRules}}),initAnalytics:()=>e=>o.createAnalyticsClient({...d,...e,methods:{addABTest:o.addABTest,getABTest:o.getABTest,getABTests:o.getABTests,stopABTest:o.stopABTest,deleteABTest:o.deleteABTest}}),initRecommendation:()=>e=>a.createRecommendationClient({...d,...e,methods:{getPersonalizationStrategy:a.getPersonalizationStrategy,setPersonalizationStrategy:a.setPersonalizationStrategy}})}})}d.version=u.version,e.exports=d},4410:(e,t,n)=>{const r=n(8774);e.exports=r,e.exports.default=r},7589:e=>{"use strict";const t=e.exports;e.exports.default=t;const n="[",r="]",i="",o=";",u="Apple_Terminal"===process.env.TERM_PROGRAM;t.cursorTo=(e,t)=>{if("number"!=typeof e)throw new TypeError("The `x` argument is required");return"number"!=typeof t?n+(e+1)+"G":n+(t+1)+";"+(e+1)+"H"},t.cursorMove=(e,t)=>{if("number"!=typeof e)throw new TypeError("The `x` argument is required");let r="";return e<0?r+=n+-e+"D":e>0&&(r+=n+e+"C"),t<0?r+=n+-t+"A":t>0&&(r+=n+t+"B"),r},t.cursorUp=(e=1)=>n+e+"A",t.cursorDown=(e=1)=>n+e+"B",t.cursorForward=(e=1)=>n+e+"C",t.cursorBackward=(e=1)=>n+e+"D",t.cursorLeft="",t.cursorSavePosition=u?"7":"",t.cursorRestorePosition=u?"8":"",t.cursorGetPosition="",t.cursorNextLine="",t.cursorPrevLine="",t.cursorHide="[?25l",t.cursorShow="[?25h",t.eraseLines=e=>{let n="";for(let r=0;r[r,"8",o,o,t,i,e,r,"8",o,o,i].join(""),t.image=(e,t={})=>{let n=r+"1337;File=inline=1";return t.width&&(n+=";width="+t.width),t.height&&(n+=";height="+t.height),!1===t.preserveAspectRatio&&(n+=";preserveAspectRatio=0"),n+":"+e.toString("base64")+i},t.iTerm={setCwd:(e=process.cwd())=>`${r}50;CurrentDir=${e}${i}`,annotation:(e,t={})=>{let n=r+"1337;";const o=void 0!==t.x,u=void 0!==t.y;if((o||u)&&(!o||!u||void 0===t.length))throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");return e=e.replace(/\|/g,""),n+=t.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",t.length>0?n+=(o?[e,t.length,t.x,t.y]:[t.length,e]).join("|"):n+=e,n+i}}},5378:e=>{"use strict";e.exports=e=>{e=Object.assign({onlyFirst:!1},e);const t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(t,e.onlyFirst?void 0:"g")}},1337:e=>{"use strict";e.exports=({onlyFirst:e=!1}={})=>{const t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(t,e?void 0:"g")}},8483:(e,t,n)=>{"use strict";e=n.nmd(e);const r=(e,t)=>(...n)=>`[${e(...n)+t}m`,i=(e,t)=>(...n)=>{const r=e(...n);return`[${38+t};5;${r}m`},o=(e,t)=>(...n)=>{const r=e(...n);return`[${38+t};2;${r[0]};${r[1]};${r[2]}m`},u=e=>e,a=(e,t,n)=>[e,t,n],l=(e,t,n)=>{Object.defineProperty(e,t,{get:()=>{const r=n();return Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0}),r},enumerable:!0,configurable:!0})};let s;const c=(e,t,r,i)=>{void 0===s&&(s=n(2744));const o=i?10:0,u={};for(const[n,i]of Object.entries(s)){const a="ansi16"===n?"ansi":n;n===t?u[a]=e(r,o):"object"==typeof i&&(u[a]=e(i[t],o))}return u};Object.defineProperty(e,"exports",{enumerable:!0,get:function(){const e=new Map,t={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};t.color.gray=t.color.blackBright,t.bgColor.bgGray=t.bgColor.bgBlackBright,t.color.grey=t.color.blackBright,t.bgColor.bgGrey=t.bgColor.bgBlackBright;for(const[n,r]of Object.entries(t)){for(const[n,i]of Object.entries(r))t[n]={open:`[${i[0]}m`,close:`[${i[1]}m`},r[n]=t[n],e.set(i[0],i[1]);Object.defineProperty(t,n,{value:r,enumerable:!1})}return Object.defineProperty(t,"codes",{value:e,enumerable:!1}),t.color.close="",t.bgColor.close="",l(t.color,"ansi",()=>c(r,"ansi16",u,!1)),l(t.color,"ansi256",()=>c(i,"ansi256",u,!1)),l(t.color,"ansi16m",()=>c(o,"rgb",a,!1)),l(t.bgColor,"ansi",()=>c(r,"ansi16",u,!0)),l(t.bgColor,"ansi256",()=>c(i,"ansi256",u,!0)),l(t.bgColor,"ansi16m",()=>c(o,"rgb",a,!0)),t}})},5640:e=>{"use strict";e.exports=e=>e&&e.exact?new RegExp("^[\ud800-\udbff][\udc00-\udfff]$"):new RegExp("[\ud800-\udbff][\udc00-\udfff]","g")},409:e=>{"use strict";e.exports=e=>e&&e.exact?new RegExp("^[\ud800-\udbff][\udc00-\udfff]$"):new RegExp("[\ud800-\udbff][\udc00-\udfff]","g")},2633:e=>{"use strict";e.exports=(e,{include:t,exclude:n}={})=>{const r=e=>{const r=t=>"string"==typeof t?e===t:t.test(e);return t?t.some(r):!n||!n.some(r)};for(const[t,n]of(e=>{const t=new Set;do{for(const n of Reflect.ownKeys(e))t.add([e,n])}while((e=Reflect.getPrototypeOf(e))&&e!==Object.prototype);return t})(e.constructor.prototype)){if("constructor"===n||!r(n))continue;const i=Reflect.getOwnPropertyDescriptor(t,n);i&&"function"==typeof i.value&&(e[n]=e[n].bind(e))}return e}},5882:(e,t,n)=>{"use strict";const r=n(8483),{stdout:i,stderr:o}=n(9428),{stringReplaceAll:u,stringEncaseCRLFWithFirstIndex:a}=n(3327),l=["ansi","ansi","ansi256","ansi16m"],s=Object.create(null);class c{constructor(e){return f(e)}}const f=e=>{const t={};return((e,t={})=>{if(t.level>3||t.level<0)throw new Error("The `level` option should be an integer from 0 to 3");const n=i?i.level:0;e.level=void 0===t.level?n:t.level})(t,e),t.template=(...e)=>_(t.template,...e),Object.setPrototypeOf(t,d.prototype),Object.setPrototypeOf(t.template,t),t.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},t.template.Instance=c,t.template};function d(e){return f(e)}for(const[e,t]of Object.entries(r))s[e]={get(){const n=m(this,v(t.open,t.close,this._styler),this._isEmpty);return Object.defineProperty(this,e,{value:n}),n}};s.visible={get(){const e=m(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:e}),e}};const p=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(const e of p)s[e]={get(){const{level:t}=this;return function(...n){const i=v(r.color[l[t]][e](...n),r.color.close,this._styler);return m(this,i,this._isEmpty)}}};for(const e of p){s["bg"+e[0].toUpperCase()+e.slice(1)]={get(){const{level:t}=this;return function(...n){const i=v(r.bgColor[l[t]][e](...n),r.bgColor.close,this._styler);return m(this,i,this._isEmpty)}}}}const h=Object.defineProperties(()=>{},{...s,level:{enumerable:!0,get(){return this._generator.level},set(e){this._generator.level=e}}}),v=(e,t,n)=>{let r,i;return void 0===n?(r=e,i=t):(r=n.openAll+e,i=t+n.closeAll),{open:e,close:t,openAll:r,closeAll:i,parent:n}},m=(e,t,n)=>{const r=(...e)=>g(r,1===e.length?""+e[0]:e.join(" "));return r.__proto__=h,r._generator=e,r._styler=t,r._isEmpty=n,r},g=(e,t)=>{if(e.level<=0||!t)return e._isEmpty?"":t;let n=e._styler;if(void 0===n)return t;const{openAll:r,closeAll:i}=n;if(-1!==t.indexOf(""))for(;void 0!==n;)t=u(t,n.close,n.open),n=n.parent;const o=t.indexOf("\n");return-1!==o&&(t=a(t,i,r,o)),r+t+i};let y;const _=(e,...t)=>{const[r]=t;if(!Array.isArray(r))return t.join(" ");const i=t.slice(1),o=[r.raw[0]];for(let e=1;e{"use strict";const t=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,n=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,r=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,i=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,o=new Map([["n","\n"],["r","\r"],["t","\t"],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a",""]]);function u(e){const t="u"===e[0],n="{"===e[1];return t&&!n&&5===e.length||"x"===e[0]&&3===e.length?String.fromCharCode(parseInt(e.slice(1),16)):t&&n?String.fromCodePoint(parseInt(e.slice(2,-1),16)):o.get(e)||e}function a(e,t){const n=[],o=t.trim().split(/\s*,\s*/g);let a;for(const t of o){const o=Number(t);if(Number.isNaN(o)){if(!(a=t.match(r)))throw new Error(`Invalid Chalk template style argument: ${t} (in style '${e}')`);n.push(a[2].replace(i,(e,t,n)=>t?u(t):n))}else n.push(o)}return n}function l(e){n.lastIndex=0;const t=[];let r;for(;null!==(r=n.exec(e));){const e=r[1];if(r[2]){const n=a(e,r[2]);t.push([e].concat(n))}else t.push([e])}return t}function s(e,t){const n={};for(const e of t)for(const t of e.styles)n[t[0]]=e.inverse?null:t.slice(1);let r=e;for(const[e,t]of Object.entries(n))if(Array.isArray(t)){if(!(e in r))throw new Error("Unknown Chalk style: "+e);r=t.length>0?r[e](...t):r[e]}return r}e.exports=(e,n)=>{const r=[],i=[];let o=[];if(n.replace(t,(t,n,a,c,f,d)=>{if(n)o.push(u(n));else if(c){const t=o.join("");o=[],i.push(0===r.length?t:s(e,r)(t)),r.push({inverse:a,styles:l(c)})}else if(f){if(0===r.length)throw new Error("Found extraneous } in Chalk template literal");i.push(s(e,r)(o.join(""))),o=[],r.pop()}else o.push(d)}),i.push(o.join("")),r.length>0){const e=`Chalk template literal is missing ${r.length} closing bracket${1===r.length?"":"s"} (\`}\`)`;throw new Error(e)}return i.join("")}},3327:e=>{"use strict";e.exports={stringReplaceAll:(e,t,n)=>{let r=e.indexOf(t);if(-1===r)return e;const i=t.length;let o=0,u="";do{u+=e.substr(o,r-o)+t+n,o=r+i,r=e.indexOf(t,o)}while(-1!==r);return u+=e.substr(o),u},stringEncaseCRLFWithFirstIndex:(e,t,n,r)=>{let i=0,o="";do{const u="\r"===e[r-1];o+=e.substr(i,(u?r-1:r)-i)+t+(u?"\r\n":"\n")+n,i=r+1,r=e.indexOf("\n",i)}while(-1!==r);return o+=e.substr(i),o}}},1525:(e,t,n)=>{"use strict";const r=n(8483),{stdout:i,stderr:o}=n(9428),{stringReplaceAll:u,stringEncaseCRLFWithFirstIndex:a}=n(6539),{isArray:l}=Array,s=["ansi","ansi","ansi256","ansi16m"],c=Object.create(null);class f{constructor(e){return d(e)}}const d=e=>{const t={};return((e,t={})=>{if(t.level&&!(Number.isInteger(t.level)&&t.level>=0&&t.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");const n=i?i.level:0;e.level=void 0===t.level?n:t.level})(t,e),t.template=(...e)=>b(t.template,...e),Object.setPrototypeOf(t,p.prototype),Object.setPrototypeOf(t.template,t),t.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},t.template.Instance=f,t.template};function p(e){return d(e)}for(const[e,t]of Object.entries(r))c[e]={get(){const n=g(this,m(t.open,t.close,this._styler),this._isEmpty);return Object.defineProperty(this,e,{value:n}),n}};c.visible={get(){const e=g(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:e}),e}};const h=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(const e of h)c[e]={get(){const{level:t}=this;return function(...n){const i=m(r.color[s[t]][e](...n),r.color.close,this._styler);return g(this,i,this._isEmpty)}}};for(const e of h){c["bg"+e[0].toUpperCase()+e.slice(1)]={get(){const{level:t}=this;return function(...n){const i=m(r.bgColor[s[t]][e](...n),r.bgColor.close,this._styler);return g(this,i,this._isEmpty)}}}}const v=Object.defineProperties(()=>{},{...c,level:{enumerable:!0,get(){return this._generator.level},set(e){this._generator.level=e}}}),m=(e,t,n)=>{let r,i;return void 0===n?(r=e,i=t):(r=n.openAll+e,i=t+n.closeAll),{open:e,close:t,openAll:r,closeAll:i,parent:n}},g=(e,t,n)=>{const r=(...e)=>l(e[0])&&l(e[0].raw)?y(r,b(r,...e)):y(r,1===e.length?""+e[0]:e.join(" "));return Object.setPrototypeOf(r,v),r._generator=e,r._styler=t,r._isEmpty=n,r},y=(e,t)=>{if(e.level<=0||!t)return e._isEmpty?"":t;let n=e._styler;if(void 0===n)return t;const{openAll:r,closeAll:i}=n;if(-1!==t.indexOf(""))for(;void 0!==n;)t=u(t,n.close,n.open),n=n.parent;const o=t.indexOf("\n");return-1!==o&&(t=a(t,i,r,o)),r+t+i};let _;const b=(e,...t)=>{const[r]=t;if(!l(r)||!l(r.raw))return t.join(" ");const i=t.slice(1),o=[r.raw[0]];for(let e=1;e{"use strict";const t=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,n=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,r=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,i=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,o=new Map([["n","\n"],["r","\r"],["t","\t"],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a",""]]);function u(e){const t="u"===e[0],n="{"===e[1];return t&&!n&&5===e.length||"x"===e[0]&&3===e.length?String.fromCharCode(parseInt(e.slice(1),16)):t&&n?String.fromCodePoint(parseInt(e.slice(2,-1),16)):o.get(e)||e}function a(e,t){const n=[],o=t.trim().split(/\s*,\s*/g);let a;for(const t of o){const o=Number(t);if(Number.isNaN(o)){if(!(a=t.match(r)))throw new Error(`Invalid Chalk template style argument: ${t} (in style '${e}')`);n.push(a[2].replace(i,(e,t,n)=>t?u(t):n))}else n.push(o)}return n}function l(e){n.lastIndex=0;const t=[];let r;for(;null!==(r=n.exec(e));){const e=r[1];if(r[2]){const n=a(e,r[2]);t.push([e].concat(n))}else t.push([e])}return t}function s(e,t){const n={};for(const e of t)for(const t of e.styles)n[t[0]]=e.inverse?null:t.slice(1);let r=e;for(const[e,t]of Object.entries(n))if(Array.isArray(t)){if(!(e in r))throw new Error("Unknown Chalk style: "+e);r=t.length>0?r[e](...t):r[e]}return r}e.exports=(e,n)=>{const r=[],i=[];let o=[];if(n.replace(t,(t,n,a,c,f,d)=>{if(n)o.push(u(n));else if(c){const t=o.join("");o=[],i.push(0===r.length?t:s(e,r)(t)),r.push({inverse:a,styles:l(c)})}else if(f){if(0===r.length)throw new Error("Found extraneous } in Chalk template literal");i.push(s(e,r)(o.join(""))),o=[],r.pop()}else o.push(d)}),i.push(o.join("")),r.length>0){const e=`Chalk template literal is missing ${r.length} closing bracket${1===r.length?"":"s"} (\`}\`)`;throw new Error(e)}return i.join("")}},6539:e=>{"use strict";e.exports={stringReplaceAll:(e,t,n)=>{let r=e.indexOf(t);if(-1===r)return e;const i=t.length;let o=0,u="";do{u+=e.substr(o,r-o)+t+n,o=r+i,r=e.indexOf(t,o)}while(-1!==r);return u+=e.substr(o),u},stringEncaseCRLFWithFirstIndex:(e,t,n,r)=>{let i=0,o="";do{const u="\r"===e[r-1];o+=e.substr(i,(u?r-1:r)-i)+t+(u?"\r\n":"\n")+n,i=r+1,r=e.indexOf("\n",i)}while(-1!==r);return o+=e.substr(i),o}}},5864:(e,t,n)=>{"use strict";var r=n(5832),i=process.env;function o(e){return"string"==typeof e?!!i[e]:Object.keys(e).every((function(t){return i[t]===e[t]}))}Object.defineProperty(t,"_vendors",{value:r.map((function(e){return e.constant}))}),t.name=null,t.isPR=null,r.forEach((function(e){var n=(Array.isArray(e.env)?e.env:[e.env]).every((function(e){return o(e)}));if(t[e.constant]=n,n)switch(t.name=e.name,typeof e.pr){case"string":t.isPR=!!i[e.pr];break;case"object":"env"in e.pr?t.isPR=e.pr.env in i&&i[e.pr.env]!==e.pr.ne:"any"in e.pr?t.isPR=e.pr.any.some((function(e){return!!i[e]})):t.isPR=o(e.pr);break;default:t.isPR=null}})),t.isCI=!!(i.CI||i.CONTINUOUS_INTEGRATION||i.BUILD_NUMBER||i.RUN_ID||t.name)},5832:e=>{"use strict";e.exports=JSON.parse('[{"name":"AppVeyor","constant":"APPVEYOR","env":"APPVEYOR","pr":"APPVEYOR_PULL_REQUEST_NUMBER"},{"name":"Azure Pipelines","constant":"AZURE_PIPELINES","env":"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI","pr":"SYSTEM_PULLREQUEST_PULLREQUESTID"},{"name":"Bamboo","constant":"BAMBOO","env":"bamboo_planKey"},{"name":"Bitbucket Pipelines","constant":"BITBUCKET","env":"BITBUCKET_COMMIT","pr":"BITBUCKET_PR_ID"},{"name":"Bitrise","constant":"BITRISE","env":"BITRISE_IO","pr":"BITRISE_PULL_REQUEST"},{"name":"Buddy","constant":"BUDDY","env":"BUDDY_WORKSPACE_ID","pr":"BUDDY_EXECUTION_PULL_REQUEST_ID"},{"name":"Buildkite","constant":"BUILDKITE","env":"BUILDKITE","pr":{"env":"BUILDKITE_PULL_REQUEST","ne":"false"}},{"name":"CircleCI","constant":"CIRCLE","env":"CIRCLECI","pr":"CIRCLE_PULL_REQUEST"},{"name":"Cirrus CI","constant":"CIRRUS","env":"CIRRUS_CI","pr":"CIRRUS_PR"},{"name":"AWS CodeBuild","constant":"CODEBUILD","env":"CODEBUILD_BUILD_ARN"},{"name":"Codeship","constant":"CODESHIP","env":{"CI_NAME":"codeship"}},{"name":"Drone","constant":"DRONE","env":"DRONE","pr":{"DRONE_BUILD_EVENT":"pull_request"}},{"name":"dsari","constant":"DSARI","env":"DSARI"},{"name":"GitLab CI","constant":"GITLAB","env":"GITLAB_CI"},{"name":"GoCD","constant":"GOCD","env":"GO_PIPELINE_LABEL"},{"name":"Hudson","constant":"HUDSON","env":"HUDSON_URL"},{"name":"Jenkins","constant":"JENKINS","env":["JENKINS_URL","BUILD_ID"],"pr":{"any":["ghprbPullId","CHANGE_ID"]}},{"name":"Magnum CI","constant":"MAGNUM","env":"MAGNUM"},{"name":"Netlify CI","constant":"NETLIFY","env":"NETLIFY_BUILD_BASE","pr":{"env":"PULL_REQUEST","ne":"false"}},{"name":"Sail CI","constant":"SAIL","env":"SAILCI","pr":"SAIL_PULL_REQUEST_NUMBER"},{"name":"Semaphore","constant":"SEMAPHORE","env":"SEMAPHORE","pr":"PULL_REQUEST_NUMBER"},{"name":"Shippable","constant":"SHIPPABLE","env":"SHIPPABLE","pr":{"IS_PULL_REQUEST":"true"}},{"name":"Solano CI","constant":"SOLANO","env":"TDDIUM","pr":"TDDIUM_PR_ID"},{"name":"Strider CD","constant":"STRIDER","env":"STRIDER"},{"name":"TaskCluster","constant":"TASKCLUSTER","env":["TASK_ID","RUN_ID"]},{"name":"TeamCity","constant":"TEAMCITY","env":"TEAMCITY_VERSION"},{"name":"Travis CI","constant":"TRAVIS","env":"TRAVIS","pr":{"env":"TRAVIS_PULL_REQUEST","ne":"false"}}]')},4163:e=>{"use strict";e.exports=JSON.parse('{"single":{"topLeft":"┌","topRight":"â”","bottomRight":"┘","bottomLeft":"â””","vertical":"│","horizontal":"─"},"double":{"topLeft":"â•”","topRight":"â•—","bottomRight":"â•","bottomLeft":"â•š","vertical":"â•‘","horizontal":"â•"},"round":{"topLeft":"â•­","topRight":"â•®","bottomRight":"╯","bottomLeft":"â•°","vertical":"│","horizontal":"─"},"bold":{"topLeft":"â”","topRight":"┓","bottomRight":"â”›","bottomLeft":"â”—","vertical":"┃","horizontal":"â”"},"singleDouble":{"topLeft":"â•“","topRight":"â•–","bottomRight":"â•œ","bottomLeft":"â•™","vertical":"â•‘","horizontal":"─"},"doubleSingle":{"topLeft":"â•’","topRight":"â••","bottomRight":"â•›","bottomLeft":"╘","vertical":"│","horizontal":"â•"},"classic":{"topLeft":"+","topRight":"+","bottomRight":"+","bottomLeft":"+","vertical":"|","horizontal":"-"}}')},4097:(e,t,n)=>{"use strict";const r=n(4163);e.exports=r,e.exports.default=r},1696:(e,t,n)=>{"use strict";const r=n(3390);let i=!1;t.show=(e=process.stderr)=>{e.isTTY&&(i=!1,e.write("[?25h"))},t.hide=(e=process.stderr)=>{e.isTTY&&(r(),i=!0,e.write("[?25l"))},t.toggle=(e,n)=>{void 0!==e&&(i=e),i?t.show(n):t.hide(n)}},5301:(e,t,n)=>{"use strict";const r=n(1566),i=n(5043);function o(e,t,n){if(" "===e.charAt(t))return t;for(let r=1;r<=3;r++)if(n){if(" "===e.charAt(t+r))return t+r}else if(" "===e.charAt(t-r))return t-r;return t}e.exports=(e,t,n)=>{n={position:"end",preferTruncationOnSpace:!1,...n};const{position:u,space:a,preferTruncationOnSpace:l}=n;let s="…",c=1;if("string"!=typeof e)throw new TypeError("Expected `input` to be a string, got "+typeof e);if("number"!=typeof t)throw new TypeError("Expected `columns` to be a number, got "+typeof t);if(t<1)return"";if(1===t)return s;const f=i(e);if(f<=t)return e;if("start"===u){if(l){const n=o(e,f-t+1,!0);return s+r(e,n,f).trim()}return!0===a&&(s+=" ",c=2),s+r(e,f-t+c,f)}if("middle"===u){!0===a&&(s=" "+s+" ",c=3);const n=Math.floor(t/2);if(l){const i=o(e,n),u=o(e,f-(t-n)+1,!0);return r(e,0,i)+s+r(e,u,f).trim()}return r(e,0,n)+s+r(e,f-(t-n)+c,f)}if("end"===u){if(l){const n=o(e,t-1);return r(e,0,n)+s}return!0===a&&(s=" "+s,c=2),r(e,0,t-c)+s}throw new Error("Expected `options.position` to be either `start`, `middle` or `end`, got "+u)}},9908:(e,t,n)=>{"use strict";const r=n(3287);e.exports=(e,t,n)=>{if("string"!=typeof e)throw new TypeError("Source code is missing.");if(!t||t<1)throw new TypeError("Line number must start from `1`.");if(!(t>(e=r(e).split(/\r?\n/)).length))return((e,t)=>{const n=[],r=e+t;for(let i=e-t;i<=r;i++)n.push(i);return n})(t,(n={around:3,...n}).around).filter(t=>void 0!==e[t-1]).map(t=>({line:t,value:e[t-1]}))}},5311:(e,t,n)=>{const r=n(3300),i={};for(const e of Object.keys(r))i[r[e]]=e;const o={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};e.exports=o;for(const e of Object.keys(o)){if(!("channels"in o[e]))throw new Error("missing channels property: "+e);if(!("labels"in o[e]))throw new Error("missing channel labels property: "+e);if(o[e].labels.length!==o[e].channels)throw new Error("channel and label counts mismatch: "+e);const{channels:t,labels:n}=o[e];delete o[e].channels,delete o[e].labels,Object.defineProperty(o[e],"channels",{value:t}),Object.defineProperty(o[e],"labels",{value:n})}o.rgb.hsl=function(e){const t=e[0]/255,n=e[1]/255,r=e[2]/255,i=Math.min(t,n,r),o=Math.max(t,n,r),u=o-i;let a,l;o===i?a=0:t===o?a=(n-r)/u:n===o?a=2+(r-t)/u:r===o&&(a=4+(t-n)/u),a=Math.min(60*a,360),a<0&&(a+=360);const s=(i+o)/2;return l=o===i?0:s<=.5?u/(o+i):u/(2-o-i),[a,100*l,100*s]},o.rgb.hsv=function(e){let t,n,r,i,o;const u=e[0]/255,a=e[1]/255,l=e[2]/255,s=Math.max(u,a,l),c=s-Math.min(u,a,l),f=function(e){return(s-e)/6/c+.5};return 0===c?(i=0,o=0):(o=c/s,t=f(u),n=f(a),r=f(l),u===s?i=r-n:a===s?i=1/3+t-r:l===s&&(i=2/3+n-t),i<0?i+=1:i>1&&(i-=1)),[360*i,100*o,100*s]},o.rgb.hwb=function(e){const t=e[0],n=e[1];let r=e[2];const i=o.rgb.hsl(e)[0],u=1/255*Math.min(t,Math.min(n,r));return r=1-1/255*Math.max(t,Math.max(n,r)),[i,100*u,100*r]},o.rgb.cmyk=function(e){const t=e[0]/255,n=e[1]/255,r=e[2]/255,i=Math.min(1-t,1-n,1-r);return[100*((1-t-i)/(1-i)||0),100*((1-n-i)/(1-i)||0),100*((1-r-i)/(1-i)||0),100*i]},o.rgb.keyword=function(e){const t=i[e];if(t)return t;let n,o=1/0;for(const t of Object.keys(r)){const i=r[t],l=(a=i,((u=e)[0]-a[0])**2+(u[1]-a[1])**2+(u[2]-a[2])**2);l.04045?((t+.055)/1.055)**2.4:t/12.92,n=n>.04045?((n+.055)/1.055)**2.4:n/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92;return[100*(.4124*t+.3576*n+.1805*r),100*(.2126*t+.7152*n+.0722*r),100*(.0193*t+.1192*n+.9505*r)]},o.rgb.lab=function(e){const t=o.rgb.xyz(e);let n=t[0],r=t[1],i=t[2];n/=95.047,r/=100,i/=108.883,n=n>.008856?n**(1/3):7.787*n+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;return[116*r-16,500*(n-r),200*(r-i)]},o.hsl.rgb=function(e){const t=e[0]/360,n=e[1]/100,r=e[2]/100;let i,o,u;if(0===n)return u=255*r,[u,u,u];i=r<.5?r*(1+n):r+n-r*n;const a=2*r-i,l=[0,0,0];for(let e=0;e<3;e++)o=t+1/3*-(e-1),o<0&&o++,o>1&&o--,u=6*o<1?a+6*(i-a)*o:2*o<1?i:3*o<2?a+(i-a)*(2/3-o)*6:a,l[e]=255*u;return l},o.hsl.hsv=function(e){const t=e[0];let n=e[1]/100,r=e[2]/100,i=n;const o=Math.max(r,.01);r*=2,n*=r<=1?r:2-r,i*=o<=1?o:2-o;return[t,100*(0===r?2*i/(o+i):2*n/(r+n)),100*((r+n)/2)]},o.hsv.rgb=function(e){const t=e[0]/60,n=e[1]/100;let r=e[2]/100;const i=Math.floor(t)%6,o=t-Math.floor(t),u=255*r*(1-n),a=255*r*(1-n*o),l=255*r*(1-n*(1-o));switch(r*=255,i){case 0:return[r,l,u];case 1:return[a,r,u];case 2:return[u,r,l];case 3:return[u,a,r];case 4:return[l,u,r];case 5:return[r,u,a]}},o.hsv.hsl=function(e){const t=e[0],n=e[1]/100,r=e[2]/100,i=Math.max(r,.01);let o,u;u=(2-n)*r;const a=(2-n)*i;return o=n*i,o/=a<=1?a:2-a,o=o||0,u/=2,[t,100*o,100*u]},o.hwb.rgb=function(e){const t=e[0]/360;let n=e[1]/100,r=e[2]/100;const i=n+r;let o;i>1&&(n/=i,r/=i);const u=Math.floor(6*t),a=1-r;o=6*t-u,0!=(1&u)&&(o=1-o);const l=n+o*(a-n);let s,c,f;switch(u){default:case 6:case 0:s=a,c=l,f=n;break;case 1:s=l,c=a,f=n;break;case 2:s=n,c=a,f=l;break;case 3:s=n,c=l,f=a;break;case 4:s=l,c=n,f=a;break;case 5:s=a,c=n,f=l}return[255*s,255*c,255*f]},o.cmyk.rgb=function(e){const t=e[0]/100,n=e[1]/100,r=e[2]/100,i=e[3]/100;return[255*(1-Math.min(1,t*(1-i)+i)),255*(1-Math.min(1,n*(1-i)+i)),255*(1-Math.min(1,r*(1-i)+i))]},o.xyz.rgb=function(e){const t=e[0]/100,n=e[1]/100,r=e[2]/100;let i,o,u;return i=3.2406*t+-1.5372*n+-.4986*r,o=-.9689*t+1.8758*n+.0415*r,u=.0557*t+-.204*n+1.057*r,i=i>.0031308?1.055*i**(1/2.4)-.055:12.92*i,o=o>.0031308?1.055*o**(1/2.4)-.055:12.92*o,u=u>.0031308?1.055*u**(1/2.4)-.055:12.92*u,i=Math.min(Math.max(0,i),1),o=Math.min(Math.max(0,o),1),u=Math.min(Math.max(0,u),1),[255*i,255*o,255*u]},o.xyz.lab=function(e){let t=e[0],n=e[1],r=e[2];t/=95.047,n/=100,r/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,n=n>.008856?n**(1/3):7.787*n+16/116,r=r>.008856?r**(1/3):7.787*r+16/116;return[116*n-16,500*(t-n),200*(n-r)]},o.lab.xyz=function(e){let t,n,r;n=(e[0]+16)/116,t=e[1]/500+n,r=n-e[2]/200;const i=n**3,o=t**3,u=r**3;return n=i>.008856?i:(n-16/116)/7.787,t=o>.008856?o:(t-16/116)/7.787,r=u>.008856?u:(r-16/116)/7.787,t*=95.047,n*=100,r*=108.883,[t,n,r]},o.lab.lch=function(e){const t=e[0],n=e[1],r=e[2];let i;i=360*Math.atan2(r,n)/2/Math.PI,i<0&&(i+=360);return[t,Math.sqrt(n*n+r*r),i]},o.lch.lab=function(e){const t=e[0],n=e[1],r=e[2]/360*2*Math.PI;return[t,n*Math.cos(r),n*Math.sin(r)]},o.rgb.ansi16=function(e,t=null){const[n,r,i]=e;let u=null===t?o.rgb.hsv(e)[2]:t;if(u=Math.round(u/50),0===u)return 30;let a=30+(Math.round(i/255)<<2|Math.round(r/255)<<1|Math.round(n/255));return 2===u&&(a+=60),a},o.hsv.ansi16=function(e){return o.rgb.ansi16(o.hsv.rgb(e),e[2])},o.rgb.ansi256=function(e){const t=e[0],n=e[1],r=e[2];if(t===n&&n===r)return t<8?16:t>248?231:Math.round((t-8)/247*24)+232;return 16+36*Math.round(t/255*5)+6*Math.round(n/255*5)+Math.round(r/255*5)},o.ansi16.rgb=function(e){let t=e%10;if(0===t||7===t)return e>50&&(t+=3.5),t=t/10.5*255,[t,t,t];const n=.5*(1+~~(e>50));return[(1&t)*n*255,(t>>1&1)*n*255,(t>>2&1)*n*255]},o.ansi256.rgb=function(e){if(e>=232){const t=10*(e-232)+8;return[t,t,t]}let t;e-=16;return[Math.floor(e/36)/5*255,Math.floor((t=e%36)/6)/5*255,t%6/5*255]},o.rgb.hex=function(e){const t=(((255&Math.round(e[0]))<<16)+((255&Math.round(e[1]))<<8)+(255&Math.round(e[2]))).toString(16).toUpperCase();return"000000".substring(t.length)+t},o.hex.rgb=function(e){const t=e.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!t)return[0,0,0];let n=t[0];3===t[0].length&&(n=n.split("").map(e=>e+e).join(""));const r=parseInt(n,16);return[r>>16&255,r>>8&255,255&r]},o.rgb.hcg=function(e){const t=e[0]/255,n=e[1]/255,r=e[2]/255,i=Math.max(Math.max(t,n),r),o=Math.min(Math.min(t,n),r),u=i-o;let a,l;return a=u<1?o/(1-u):0,l=u<=0?0:i===t?(n-r)/u%6:i===n?2+(r-t)/u:4+(t-n)/u,l/=6,l%=1,[360*l,100*u,100*a]},o.hsl.hcg=function(e){const t=e[1]/100,n=e[2]/100,r=n<.5?2*t*n:2*t*(1-n);let i=0;return r<1&&(i=(n-.5*r)/(1-r)),[e[0],100*r,100*i]},o.hsv.hcg=function(e){const t=e[1]/100,n=e[2]/100,r=t*n;let i=0;return r<1&&(i=(n-r)/(1-r)),[e[0],100*r,100*i]},o.hcg.rgb=function(e){const t=e[0]/360,n=e[1]/100,r=e[2]/100;if(0===n)return[255*r,255*r,255*r];const i=[0,0,0],o=t%1*6,u=o%1,a=1-u;let l=0;switch(Math.floor(o)){case 0:i[0]=1,i[1]=u,i[2]=0;break;case 1:i[0]=a,i[1]=1,i[2]=0;break;case 2:i[0]=0,i[1]=1,i[2]=u;break;case 3:i[0]=0,i[1]=a,i[2]=1;break;case 4:i[0]=u,i[1]=0,i[2]=1;break;default:i[0]=1,i[1]=0,i[2]=a}return l=(1-n)*r,[255*(n*i[0]+l),255*(n*i[1]+l),255*(n*i[2]+l)]},o.hcg.hsv=function(e){const t=e[1]/100,n=t+e[2]/100*(1-t);let r=0;return n>0&&(r=t/n),[e[0],100*r,100*n]},o.hcg.hsl=function(e){const t=e[1]/100,n=e[2]/100*(1-t)+.5*t;let r=0;return n>0&&n<.5?r=t/(2*n):n>=.5&&n<1&&(r=t/(2*(1-n))),[e[0],100*r,100*n]},o.hcg.hwb=function(e){const t=e[1]/100,n=t+e[2]/100*(1-t);return[e[0],100*(n-t),100*(1-n)]},o.hwb.hcg=function(e){const t=e[1]/100,n=1-e[2]/100,r=n-t;let i=0;return r<1&&(i=(n-r)/(1-r)),[e[0],100*r,100*i]},o.apple.rgb=function(e){return[e[0]/65535*255,e[1]/65535*255,e[2]/65535*255]},o.rgb.apple=function(e){return[e[0]/255*65535,e[1]/255*65535,e[2]/255*65535]},o.gray.rgb=function(e){return[e[0]/100*255,e[0]/100*255,e[0]/100*255]},o.gray.hsl=function(e){return[0,0,e[0]]},o.gray.hsv=o.gray.hsl,o.gray.hwb=function(e){return[0,100,e[0]]},o.gray.cmyk=function(e){return[0,0,0,e[0]]},o.gray.lab=function(e){return[e[0],0,0]},o.gray.hex=function(e){const t=255&Math.round(e[0]/100*255),n=((t<<16)+(t<<8)+t).toString(16).toUpperCase();return"000000".substring(n.length)+n},o.rgb.gray=function(e){return[(e[0]+e[1]+e[2])/3/255*100]}},2744:(e,t,n)=>{const r=n(5311),i=n(8577),o={};Object.keys(r).forEach(e=>{o[e]={},Object.defineProperty(o[e],"channels",{value:r[e].channels}),Object.defineProperty(o[e],"labels",{value:r[e].labels});const t=i(e);Object.keys(t).forEach(n=>{const r=t[n];o[e][n]=function(e){const t=function(...t){const n=t[0];if(null==n)return n;n.length>1&&(t=n);const r=e(t);if("object"==typeof r)for(let e=r.length,t=0;t1&&(t=n),e(t))};return"conversion"in e&&(t.conversion=e.conversion),t}(r)})}),e.exports=o},8577:(e,t,n)=>{const r=n(5311);function i(e){const t=function(){const e={},t=Object.keys(r);for(let n=t.length,r=0;r{"use strict";e.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},3287:e=>{"use strict";e.exports=(e,t)=>e.replace(/^\t+/gm,e=>" ".repeat(e.length*(t||2)))},1013:e=>{"use strict";e.exports=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g}},8759:e=>{"use strict";const t=/[|\\{}()[\]^$+*?.-]/g;e.exports=e=>{if("string"!=typeof e)throw new TypeError("Expected a string");return e.replace(t,"\\$&")}},2918:e=>{"use strict";e.exports=(e,t=process.argv)=>{const n=e.startsWith("-")?"":1===e.length?"-":"--",r=t.indexOf(n+e),i=t.indexOf("--");return-1!==r&&(-1===i||r{"use strict";e.exports=(e,t=1,n)=>{if(n={indent:" ",includeEmptyLines:!1,...n},"string"!=typeof e)throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof e}\``);if("number"!=typeof t)throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof t}\``);if("string"!=typeof n.indent)throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof n.indent}\``);if(0===t)return e;const r=n.includeEmptyLines?/^/gm:/^(?!\s*$)/gm;return e.replace(r,n.indent.repeat(t))}},2738:(e,t,n)=>{"use strict";e.exports=n(5864).isCI},7347:e=>{"use strict";const t=e=>!Number.isNaN(e)&&(e>=4352&&(e<=4447||9001===e||9002===e||11904<=e&&e<=12871&&12351!==e||12880<=e&&e<=19903||19968<=e&&e<=42182||43360<=e&&e<=43388||44032<=e&&e<=55203||63744<=e&&e<=64255||65040<=e&&e<=65049||65072<=e&&e<=65131||65281<=e&&e<=65376||65504<=e&&e<=65510||110592<=e&&e<=110593||127488<=e&&e<=127569||131072<=e&&e<=262141));e.exports=t,e.exports.default=t},464:function(e,t,n){var r; +/** + * @license + * Lodash + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */e=n.nmd(e),function(){var i="Expected a function",o="__lodash_placeholder__",u=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],a="[object Arguments]",l="[object Array]",s="[object Boolean]",c="[object Date]",f="[object Error]",d="[object Function]",p="[object GeneratorFunction]",h="[object Map]",v="[object Number]",m="[object Object]",g="[object RegExp]",y="[object Set]",_="[object String]",b="[object Symbol]",w="[object WeakMap]",E="[object ArrayBuffer]",D="[object DataView]",S="[object Float32Array]",C="[object Float64Array]",k="[object Int8Array]",T="[object Int16Array]",x="[object Int32Array]",A="[object Uint8Array]",O="[object Uint16Array]",P="[object Uint32Array]",I=/\b__p \+= '';/g,N=/\b(__p \+=) '' \+/g,M=/(__e\(.*?\)|\b__t\)) \+\n'';/g,R=/&(?:amp|lt|gt|quot|#39);/g,F=/[&<>"']/g,L=RegExp(R.source),B=RegExp(F.source),j=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,z=/<%=([\s\S]+?)%>/g,W=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,H=/^\w*$/,V=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,q=/[\\^$.*+?()[\]{}|]/g,G=RegExp(q.source),$=/^\s+|\s+$/g,Y=/^\s+/,K=/\s+$/,X=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Q=/\{\n\/\* \[wrapped with (.+)\] \*/,J=/,? & /,Z=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ee=/\\(\\)?/g,te=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ne=/\w*$/,re=/^[-+]0x[0-9a-f]+$/i,ie=/^0b[01]+$/i,oe=/^\[object .+?Constructor\]$/,ue=/^0o[0-7]+$/i,ae=/^(?:0|[1-9]\d*)$/,le=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,se=/($^)/,ce=/['\n\r\u2028\u2029\\]/g,fe="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",de="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",pe="[\\ud800-\\udfff]",he="["+de+"]",ve="["+fe+"]",me="\\d+",ge="[\\u2700-\\u27bf]",ye="[a-z\\xdf-\\xf6\\xf8-\\xff]",_e="[^\\ud800-\\udfff"+de+me+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",be="\\ud83c[\\udffb-\\udfff]",we="[^\\ud800-\\udfff]",Ee="(?:\\ud83c[\\udde6-\\uddff]){2}",De="[\\ud800-\\udbff][\\udc00-\\udfff]",Se="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Ce="(?:"+ye+"|"+_e+")",ke="(?:"+Se+"|"+_e+")",Te="(?:"+ve+"|"+be+")"+"?",xe="[\\ufe0e\\ufe0f]?"+Te+("(?:\\u200d(?:"+[we,Ee,De].join("|")+")[\\ufe0e\\ufe0f]?"+Te+")*"),Ae="(?:"+[ge,Ee,De].join("|")+")"+xe,Oe="(?:"+[we+ve+"?",ve,Ee,De,pe].join("|")+")",Pe=RegExp("['’]","g"),Ie=RegExp(ve,"g"),Ne=RegExp(be+"(?="+be+")|"+Oe+xe,"g"),Me=RegExp([Se+"?"+ye+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[he,Se,"$"].join("|")+")",ke+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[he,Se+Ce,"$"].join("|")+")",Se+"?"+Ce+"+(?:['’](?:d|ll|m|re|s|t|ve))?",Se+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",me,Ae].join("|"),"g"),Re=RegExp("[\\u200d\\ud800-\\udfff"+fe+"\\ufe0e\\ufe0f]"),Fe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Le=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Be=-1,je={};je[S]=je[C]=je[k]=je[T]=je[x]=je[A]=je["[object Uint8ClampedArray]"]=je[O]=je[P]=!0,je[a]=je[l]=je[E]=je[s]=je[D]=je[c]=je[f]=je[d]=je[h]=je[v]=je[m]=je[g]=je[y]=je[_]=je[w]=!1;var Ue={};Ue[a]=Ue[l]=Ue[E]=Ue[D]=Ue[s]=Ue[c]=Ue[S]=Ue[C]=Ue[k]=Ue[T]=Ue[x]=Ue[h]=Ue[v]=Ue[m]=Ue[g]=Ue[y]=Ue[_]=Ue[b]=Ue[A]=Ue["[object Uint8ClampedArray]"]=Ue[O]=Ue[P]=!0,Ue[f]=Ue[d]=Ue[w]=!1;var ze={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},We=parseFloat,He=parseInt,Ve="object"==typeof global&&global&&global.Object===Object&&global,qe="object"==typeof self&&self&&self.Object===Object&&self,Ge=Ve||qe||Function("return this")(),$e=t&&!t.nodeType&&t,Ye=$e&&e&&!e.nodeType&&e,Ke=Ye&&Ye.exports===$e,Xe=Ke&&Ve.process,Qe=function(){try{var e=Ye&&Ye.require&&Ye.require("util").types;return e||Xe&&Xe.binding&&Xe.binding("util")}catch(e){}}(),Je=Qe&&Qe.isArrayBuffer,Ze=Qe&&Qe.isDate,et=Qe&&Qe.isMap,tt=Qe&&Qe.isRegExp,nt=Qe&&Qe.isSet,rt=Qe&&Qe.isTypedArray;function it(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function ot(e,t,n,r){for(var i=-1,o=null==e?0:e.length;++i-1}function ft(e,t,n){for(var r=-1,i=null==e?0:e.length;++r-1;);return n}function Nt(e,t){for(var n=e.length;n--&&bt(t,e[n],0)>-1;);return n}function Mt(e,t){for(var n=e.length,r=0;n--;)e[n]===t&&++r;return r}var Rt=Ct({À:"A",Ã:"A",Â:"A",Ã:"A",Ä:"A",Ã…:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",Ã¥:"a",Ç:"C",ç:"c",Ã:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",ÃŒ:"I",Ã:"I",ÃŽ:"I",Ã:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ã’:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ãœ:"U",ù:"u",ú:"u",û:"u",ü:"u",Ã:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ä€:"A",Ä‚:"A",Ä„:"A",Ä:"a",ă:"a",Ä…:"a",Ć:"C",Ĉ:"C",ÄŠ:"C",ÄŒ:"C",ć:"c",ĉ:"c",Ä‹:"c",Ä:"c",ÄŽ:"D",Ä:"D",Ä:"d",Ä‘:"d",Ä’:"E",Ä”:"E",Ä–:"E",Ę:"E",Äš:"E",Ä“:"e",Ä•:"e",Ä—:"e",Ä™:"e",Ä›:"e",Äœ:"G",Äž:"G",Ä :"G",Ä¢:"G",Ä:"g",ÄŸ:"g",Ä¡:"g",Ä£:"g",Ĥ:"H",Ħ:"H",Ä¥:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Ä®:"I",Ä°:"I",Ä©:"i",Ä«:"i",Ä­:"i",į:"i",ı:"i",Ä´:"J",ĵ:"j",Ķ:"K",Ä·:"k",ĸ:"k",Ĺ:"L",Ä»:"L",Ľ:"L",Ä¿:"L",Å:"L",ĺ:"l",ļ:"l",ľ:"l",Å€:"l",Å‚:"l",Ń:"N",Å…:"N",Ň:"N",ÅŠ:"N",Å„:"n",ņ:"n",ň:"n",Å‹:"n",ÅŒ:"O",ÅŽ:"O",Å:"O",Å:"o",Å:"o",Å‘:"o",Å”:"R",Å–:"R",Ř:"R",Å•:"r",Å—:"r",Å™:"r",Åš:"S",Åœ:"S",Åž:"S",Å :"S",Å›:"s",Å:"s",ÅŸ:"s",Å¡:"s",Å¢:"T",Ť:"T",Ŧ:"T",Å£:"t",Å¥:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Å®:"U",Å°:"U",Ų:"U",Å©:"u",Å«:"u",Å­:"u",ů:"u",ű:"u",ų:"u",Å´:"W",ŵ:"w",Ŷ:"Y",Å·:"y",Ÿ:"Y",Ź:"Z",Å»:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Å’:"Oe",Å“:"oe",ʼn:"'n",Å¿:"s"}),Ft=Ct({"&":"&","<":"<",">":">",'"':""","'":"'"});function Lt(e){return"\\"+ze[e]}function Bt(e){return Re.test(e)}function jt(e){var t=-1,n=Array(e.size);return e.forEach((function(e,r){n[++t]=[r,e]})),n}function Ut(e,t){return function(n){return e(t(n))}}function zt(e,t){for(var n=-1,r=e.length,i=0,u=[];++n",""":'"',"'":"'"});var $t=function e(t){var n,r=(t=null==t?Ge:$t.defaults(Ge.Object(),t,$t.pick(Ge,Le))).Array,fe=t.Date,de=t.Error,pe=t.Function,he=t.Math,ve=t.Object,me=t.RegExp,ge=t.String,ye=t.TypeError,_e=r.prototype,be=pe.prototype,we=ve.prototype,Ee=t["__core-js_shared__"],De=be.toString,Se=we.hasOwnProperty,Ce=0,ke=(n=/[^.]+$/.exec(Ee&&Ee.keys&&Ee.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",Te=we.toString,xe=De.call(ve),Ae=Ge._,Oe=me("^"+De.call(Se).replace(q,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ne=Ke?t.Buffer:void 0,Re=t.Symbol,ze=t.Uint8Array,Ve=Ne?Ne.allocUnsafe:void 0,qe=Ut(ve.getPrototypeOf,ve),$e=ve.create,Ye=we.propertyIsEnumerable,Xe=_e.splice,Qe=Re?Re.isConcatSpreadable:void 0,gt=Re?Re.iterator:void 0,Ct=Re?Re.toStringTag:void 0,Yt=function(){try{var e=Zi(ve,"defineProperty");return e({},"",{}),e}catch(e){}}(),Kt=t.clearTimeout!==Ge.clearTimeout&&t.clearTimeout,Xt=fe&&fe.now!==Ge.Date.now&&fe.now,Qt=t.setTimeout!==Ge.setTimeout&&t.setTimeout,Jt=he.ceil,Zt=he.floor,en=ve.getOwnPropertySymbols,tn=Ne?Ne.isBuffer:void 0,nn=t.isFinite,rn=_e.join,on=Ut(ve.keys,ve),un=he.max,an=he.min,ln=fe.now,sn=t.parseInt,cn=he.random,fn=_e.reverse,dn=Zi(t,"DataView"),pn=Zi(t,"Map"),hn=Zi(t,"Promise"),vn=Zi(t,"Set"),mn=Zi(t,"WeakMap"),gn=Zi(ve,"create"),yn=mn&&new mn,_n={},bn=To(dn),wn=To(pn),En=To(hn),Dn=To(vn),Sn=To(mn),Cn=Re?Re.prototype:void 0,kn=Cn?Cn.valueOf:void 0,Tn=Cn?Cn.toString:void 0;function xn(e){if(Vu(e)&&!Nu(e)&&!(e instanceof In)){if(e instanceof Pn)return e;if(Se.call(e,"__wrapped__"))return xo(e)}return new Pn(e)}var An=function(){function e(){}return function(t){if(!Hu(t))return{};if($e)return $e(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();function On(){}function Pn(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function In(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Nn(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t=t?e:t)),e}function Xn(e,t,n,r,i,o){var u,l=1&t,f=2&t,w=4&t;if(n&&(u=i?n(e,r,i,o):n(e)),void 0!==u)return u;if(!Hu(e))return e;var I=Nu(e);if(I){if(u=function(e){var t=e.length,n=new e.constructor(t);t&&"string"==typeof e[0]&&Se.call(e,"index")&&(n.index=e.index,n.input=e.input);return n}(e),!l)return gi(e,u)}else{var N=no(e),M=N==d||N==p;if(Lu(e))return fi(e,l);if(N==m||N==a||M&&!i){if(u=f||M?{}:io(e),!l)return f?function(e,t){return yi(e,to(e),t)}(e,function(e,t){return e&&yi(t,wa(t),e)}(u,e)):function(e,t){return yi(e,eo(e),t)}(e,Gn(u,e))}else{if(!Ue[N])return i?e:{};u=function(e,t,n){var r=e.constructor;switch(t){case E:return di(e);case s:case c:return new r(+e);case D:return function(e,t){var n=t?di(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}(e,n);case S:case C:case k:case T:case x:case A:case"[object Uint8ClampedArray]":case O:case P:return pi(e,n);case h:return new r;case v:case _:return new r(e);case g:return function(e){var t=new e.constructor(e.source,ne.exec(e));return t.lastIndex=e.lastIndex,t}(e);case y:return new r;case b:return i=e,kn?ve(kn.call(i)):{}}var i}(e,N,l)}}o||(o=new Ln);var R=o.get(e);if(R)return R;o.set(e,u),Ku(e)?e.forEach((function(r){u.add(Xn(r,t,n,r,e,o))})):qu(e)&&e.forEach((function(r,i){u.set(i,Xn(r,t,n,i,e,o))}));var F=I?void 0:(w?f?Gi:qi:f?wa:ba)(e);return ut(F||e,(function(r,i){F&&(r=e[i=r]),Hn(u,i,Xn(r,t,n,i,e,o))})),u}function Qn(e,t,n){var r=n.length;if(null==e)return!r;for(e=ve(e);r--;){var i=n[r],o=t[i],u=e[i];if(void 0===u&&!(i in e)||!o(u))return!1}return!0}function Jn(e,t,n){if("function"!=typeof e)throw new ye(i);return bo((function(){e.apply(void 0,n)}),t)}function Zn(e,t,n,r){var i=-1,o=ct,u=!0,a=e.length,l=[],s=t.length;if(!a)return l;n&&(t=dt(t,At(n))),r?(o=ft,u=!1):t.length>=200&&(o=Pt,u=!1,t=new Fn(t));e:for(;++i-1},Mn.prototype.set=function(e,t){var n=this.__data__,r=Vn(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this},Rn.prototype.clear=function(){this.size=0,this.__data__={hash:new Nn,map:new(pn||Mn),string:new Nn}},Rn.prototype.delete=function(e){var t=Qi(this,e).delete(e);return this.size-=t?1:0,t},Rn.prototype.get=function(e){return Qi(this,e).get(e)},Rn.prototype.has=function(e){return Qi(this,e).has(e)},Rn.prototype.set=function(e,t){var n=Qi(this,e),r=n.size;return n.set(e,t),this.size+=n.size==r?0:1,this},Fn.prototype.add=Fn.prototype.push=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},Fn.prototype.has=function(e){return this.__data__.has(e)},Ln.prototype.clear=function(){this.__data__=new Mn,this.size=0},Ln.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},Ln.prototype.get=function(e){return this.__data__.get(e)},Ln.prototype.has=function(e){return this.__data__.has(e)},Ln.prototype.set=function(e,t){var n=this.__data__;if(n instanceof Mn){var r=n.__data__;if(!pn||r.length<199)return r.push([e,t]),this.size=++n.size,this;n=this.__data__=new Rn(r)}return n.set(e,t),this.size=n.size,this};var er=wi(lr),tr=wi(sr,!0);function nr(e,t){var n=!0;return er(e,(function(e,r,i){return n=!!t(e,r,i)})),n}function rr(e,t,n){for(var r=-1,i=e.length;++r0&&n(a)?t>1?or(a,t-1,n,r,i):pt(i,a):r||(i[i.length]=a)}return i}var ur=Ei(),ar=Ei(!0);function lr(e,t){return e&&ur(e,t,ba)}function sr(e,t){return e&&ar(e,t,ba)}function cr(e,t){return st(t,(function(t){return Uu(e[t])}))}function fr(e,t){for(var n=0,r=(t=ai(t,e)).length;null!=e&&nt}function vr(e,t){return null!=e&&Se.call(e,t)}function mr(e,t){return null!=e&&t in ve(e)}function gr(e,t,n){for(var i=n?ft:ct,o=e[0].length,u=e.length,a=u,l=r(u),s=1/0,c=[];a--;){var f=e[a];a&&t&&(f=dt(f,At(t))),s=an(f.length,s),l[a]=!n&&(t||o>=120&&f.length>=120)?new Fn(a&&f):void 0}f=e[0];var d=-1,p=l[0];e:for(;++d=a)return l;var s=n[r];return l*("desc"==s?-1:1)}}return e.index-t.index}(e,t,n)}))}function Nr(e,t,n){for(var r=-1,i=t.length,o={};++r-1;)a!==e&&Xe.call(a,l,1),Xe.call(e,l,1);return e}function Rr(e,t){for(var n=e?t.length:0,r=n-1;n--;){var i=t[n];if(n==r||i!==o){var o=i;uo(i)?Xe.call(e,i,1):Zr(e,i)}}return e}function Fr(e,t){return e+Zt(cn()*(t-e+1))}function Lr(e,t){var n="";if(!e||t<1||t>9007199254740991)return n;do{t%2&&(n+=e),(t=Zt(t/2))&&(e+=e)}while(t);return n}function Br(e,t){return wo(vo(e,t,Ga),e+"")}function jr(e){return jn(Aa(e))}function Ur(e,t){var n=Aa(e);return So(n,Kn(t,0,n.length))}function zr(e,t,n,r){if(!Hu(e))return e;for(var i=-1,o=(t=ai(t,e)).length,u=o-1,a=e;null!=a&&++io?0:o+t),(n=n>o?o:n)<0&&(n+=o),o=t>n?0:n-t>>>0,t>>>=0;for(var u=r(o);++i>>1,u=e[o];null!==u&&!Qu(u)&&(n?u<=t:u=200){var s=t?null:Li(e);if(s)return Wt(s);u=!1,i=Pt,l=new Fn}else l=t?[]:a;e:for(;++r=r?e:qr(e,t,n)}var ci=Kt||function(e){return Ge.clearTimeout(e)};function fi(e,t){if(t)return e.slice();var n=e.length,r=Ve?Ve(n):new e.constructor(n);return e.copy(r),r}function di(e){var t=new e.constructor(e.byteLength);return new ze(t).set(new ze(e)),t}function pi(e,t){var n=t?di(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}function hi(e,t){if(e!==t){var n=void 0!==e,r=null===e,i=e==e,o=Qu(e),u=void 0!==t,a=null===t,l=t==t,s=Qu(t);if(!a&&!s&&!o&&e>t||o&&u&&l&&!a&&!s||r&&u&&l||!n&&l||!i)return 1;if(!r&&!o&&!s&&e1?n[i-1]:void 0,u=i>2?n[2]:void 0;for(o=e.length>3&&"function"==typeof o?(i--,o):void 0,u&&ao(n[0],n[1],u)&&(o=i<3?void 0:o,i=1),t=ve(t);++r-1?i[o?t[u]:u]:void 0}}function Ti(e){return Vi((function(t){var n=t.length,r=n,o=Pn.prototype.thru;for(e&&t.reverse();r--;){var u=t[r];if("function"!=typeof u)throw new ye(i);if(o&&!a&&"wrapper"==Yi(u))var a=new Pn([],!0)}for(r=a?r:n;++r1&&_.reverse(),f&&sa))return!1;var s=o.get(e),c=o.get(t);if(s&&c)return s==t&&c==e;var f=-1,d=!0,p=2&n?new Fn:void 0;for(o.set(e,t),o.set(t,e);++f-1&&e%1==0&&e1?"& ":"")+t[r],t=t.join(n>2?", ":" "),e.replace(X,"{\n/* [wrapped with "+t+"] */\n")}(r,function(e,t){return ut(u,(function(n){var r="_."+n[0];t&n[1]&&!ct(e,r)&&e.push(r)})),e.sort()}(function(e){var t=e.match(Q);return t?t[1].split(J):[]}(r),n)))}function Do(e){var t=0,n=0;return function(){var r=ln(),i=16-(r-n);if(n=r,i>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function So(e,t){var n=-1,r=e.length,i=r-1;for(t=void 0===t?r:t;++n1?e[t-1]:void 0;return n="function"==typeof n?(e.pop(),n):void 0,Yo(e,n)}));function tu(e){var t=xn(e);return t.__chain__=!0,t}function nu(e,t){return t(e)}var ru=Vi((function(e){var t=e.length,n=t?e[0]:0,r=this.__wrapped__,i=function(t){return Yn(t,e)};return!(t>1||this.__actions__.length)&&r instanceof In&&uo(n)?((r=r.slice(n,+n+(t?1:0))).__actions__.push({func:nu,args:[i],thisArg:void 0}),new Pn(r,this.__chain__).thru((function(e){return t&&!e.length&&e.push(void 0),e}))):this.thru(i)}));var iu=_i((function(e,t,n){Se.call(e,n)?++e[n]:$n(e,n,1)}));var ou=ki(Io),uu=ki(No);function au(e,t){return(Nu(e)?ut:er)(e,Xi(t,3))}function lu(e,t){return(Nu(e)?at:tr)(e,Xi(t,3))}var su=_i((function(e,t,n){Se.call(e,n)?e[n].push(t):$n(e,n,[t])}));var cu=Br((function(e,t,n){var i=-1,o="function"==typeof t,u=Ru(e)?r(e.length):[];return er(e,(function(e){u[++i]=o?it(t,e,n):yr(e,t,n)})),u})),fu=_i((function(e,t,n){$n(e,n,t)}));function du(e,t){return(Nu(e)?dt:Tr)(e,Xi(t,3))}var pu=_i((function(e,t,n){e[n?0:1].push(t)}),(function(){return[[],[]]}));var hu=Br((function(e,t){if(null==e)return[];var n=t.length;return n>1&&ao(e,t[0],t[1])?t=[]:n>2&&ao(t[0],t[1],t[2])&&(t=[t[0]]),Ir(e,or(t,1),[])})),vu=Xt||function(){return Ge.Date.now()};function mu(e,t,n){return t=n?void 0:t,ji(e,128,void 0,void 0,void 0,void 0,t=e&&null==t?e.length:t)}function gu(e,t){var n;if("function"!=typeof t)throw new ye(i);return e=ra(e),function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=void 0),n}}var yu=Br((function(e,t,n){var r=1;if(n.length){var i=zt(n,Ki(yu));r|=32}return ji(e,r,t,n,i)})),_u=Br((function(e,t,n){var r=3;if(n.length){var i=zt(n,Ki(_u));r|=32}return ji(t,r,e,n,i)}));function bu(e,t,n){var r,o,u,a,l,s,c=0,f=!1,d=!1,p=!0;if("function"!=typeof e)throw new ye(i);function h(t){var n=r,i=o;return r=o=void 0,c=t,a=e.apply(i,n)}function v(e){return c=e,l=bo(g,t),f?h(e):a}function m(e){var n=e-s;return void 0===s||n>=t||n<0||d&&e-c>=u}function g(){var e=vu();if(m(e))return y(e);l=bo(g,function(e){var n=t-(e-s);return d?an(n,u-(e-c)):n}(e))}function y(e){return l=void 0,p&&r?h(e):(r=o=void 0,a)}function _(){var e=vu(),n=m(e);if(r=arguments,o=this,s=e,n){if(void 0===l)return v(s);if(d)return ci(l),l=bo(g,t),h(s)}return void 0===l&&(l=bo(g,t)),a}return t=oa(t)||0,Hu(n)&&(f=!!n.leading,u=(d="maxWait"in n)?un(oa(n.maxWait)||0,t):u,p="trailing"in n?!!n.trailing:p),_.cancel=function(){void 0!==l&&ci(l),c=0,r=s=o=l=void 0},_.flush=function(){return void 0===l?a:y(vu())},_}var wu=Br((function(e,t){return Jn(e,1,t)})),Eu=Br((function(e,t,n){return Jn(e,oa(t)||0,n)}));function Du(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new ye(i);var n=function(){var r=arguments,i=t?t.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var u=e.apply(this,r);return n.cache=o.set(i,u)||o,u};return n.cache=new(Du.Cache||Rn),n}function Su(e){if("function"!=typeof e)throw new ye(i);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}Du.Cache=Rn;var Cu=li((function(e,t){var n=(t=1==t.length&&Nu(t[0])?dt(t[0],At(Xi())):dt(or(t,1),At(Xi()))).length;return Br((function(r){for(var i=-1,o=an(r.length,n);++i=t})),Iu=_r(function(){return arguments}())?_r:function(e){return Vu(e)&&Se.call(e,"callee")&&!Ye.call(e,"callee")},Nu=r.isArray,Mu=Je?At(Je):function(e){return Vu(e)&&pr(e)==E};function Ru(e){return null!=e&&Wu(e.length)&&!Uu(e)}function Fu(e){return Vu(e)&&Ru(e)}var Lu=tn||ol,Bu=Ze?At(Ze):function(e){return Vu(e)&&pr(e)==c};function ju(e){if(!Vu(e))return!1;var t=pr(e);return t==f||"[object DOMException]"==t||"string"==typeof e.message&&"string"==typeof e.name&&!$u(e)}function Uu(e){if(!Hu(e))return!1;var t=pr(e);return t==d||t==p||"[object AsyncFunction]"==t||"[object Proxy]"==t}function zu(e){return"number"==typeof e&&e==ra(e)}function Wu(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}function Hu(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function Vu(e){return null!=e&&"object"==typeof e}var qu=et?At(et):function(e){return Vu(e)&&no(e)==h};function Gu(e){return"number"==typeof e||Vu(e)&&pr(e)==v}function $u(e){if(!Vu(e)||pr(e)!=m)return!1;var t=qe(e);if(null===t)return!0;var n=Se.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&De.call(n)==xe}var Yu=tt?At(tt):function(e){return Vu(e)&&pr(e)==g};var Ku=nt?At(nt):function(e){return Vu(e)&&no(e)==y};function Xu(e){return"string"==typeof e||!Nu(e)&&Vu(e)&&pr(e)==_}function Qu(e){return"symbol"==typeof e||Vu(e)&&pr(e)==b}var Ju=rt?At(rt):function(e){return Vu(e)&&Wu(e.length)&&!!je[pr(e)]};var Zu=Mi(kr),ea=Mi((function(e,t){return e<=t}));function ta(e){if(!e)return[];if(Ru(e))return Xu(e)?qt(e):gi(e);if(gt&&e[gt])return function(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}(e[gt]());var t=no(e);return(t==h?jt:t==y?Wt:Aa)(e)}function na(e){return e?(e=oa(e))===1/0||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function ra(e){var t=na(e),n=t%1;return t==t?n?t-n:t:0}function ia(e){return e?Kn(ra(e),0,4294967295):0}function oa(e){if("number"==typeof e)return e;if(Qu(e))return NaN;if(Hu(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Hu(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace($,"");var n=ie.test(e);return n||ue.test(e)?He(e.slice(2),n?2:8):re.test(e)?NaN:+e}function ua(e){return yi(e,wa(e))}function aa(e){return null==e?"":Qr(e)}var la=bi((function(e,t){if(fo(t)||Ru(t))yi(t,ba(t),e);else for(var n in t)Se.call(t,n)&&Hn(e,n,t[n])})),sa=bi((function(e,t){yi(t,wa(t),e)})),ca=bi((function(e,t,n,r){yi(t,wa(t),e,r)})),fa=bi((function(e,t,n,r){yi(t,ba(t),e,r)})),da=Vi(Yn);var pa=Br((function(e,t){e=ve(e);var n=-1,r=t.length,i=r>2?t[2]:void 0;for(i&&ao(t[0],t[1],i)&&(r=1);++n1),t})),yi(e,Gi(e),n),r&&(n=Xn(n,7,Wi));for(var i=t.length;i--;)Zr(n,t[i]);return n}));var Ca=Vi((function(e,t){return null==e?{}:function(e,t){return Nr(e,t,(function(t,n){return ma(e,n)}))}(e,t)}));function ka(e,t){if(null==e)return{};var n=dt(Gi(e),(function(e){return[e]}));return t=Xi(t),Nr(e,n,(function(e,n){return t(e,n[0])}))}var Ta=Bi(ba),xa=Bi(wa);function Aa(e){return null==e?[]:Ot(e,ba(e))}var Oa=Si((function(e,t,n){return t=t.toLowerCase(),e+(n?Pa(t):t)}));function Pa(e){return ja(aa(e).toLowerCase())}function Ia(e){return(e=aa(e))&&e.replace(le,Rt).replace(Ie,"")}var Na=Si((function(e,t,n){return e+(n?"-":"")+t.toLowerCase()})),Ma=Si((function(e,t,n){return e+(n?" ":"")+t.toLowerCase()})),Ra=Di("toLowerCase");var Fa=Si((function(e,t,n){return e+(n?"_":"")+t.toLowerCase()}));var La=Si((function(e,t,n){return e+(n?" ":"")+ja(t)}));var Ba=Si((function(e,t,n){return e+(n?" ":"")+t.toUpperCase()})),ja=Di("toUpperCase");function Ua(e,t,n){return e=aa(e),void 0===(t=n?void 0:t)?function(e){return Fe.test(e)}(e)?function(e){return e.match(Me)||[]}(e):function(e){return e.match(Z)||[]}(e):e.match(t)||[]}var za=Br((function(e,t){try{return it(e,void 0,t)}catch(e){return ju(e)?e:new de(e)}})),Wa=Vi((function(e,t){return ut(t,(function(t){t=ko(t),$n(e,t,yu(e[t],e))})),e}));function Ha(e){return function(){return e}}var Va=Ti(),qa=Ti(!0);function Ga(e){return e}function $a(e){return Dr("function"==typeof e?e:Xn(e,1))}var Ya=Br((function(e,t){return function(n){return yr(n,e,t)}})),Ka=Br((function(e,t){return function(n){return yr(e,n,t)}}));function Xa(e,t,n){var r=ba(t),i=cr(t,r);null!=n||Hu(t)&&(i.length||!r.length)||(n=t,t=e,e=this,i=cr(t,ba(t)));var o=!(Hu(n)&&"chain"in n&&!n.chain),u=Uu(e);return ut(i,(function(n){var r=t[n];e[n]=r,u&&(e.prototype[n]=function(){var t=this.__chain__;if(o||t){var n=e(this.__wrapped__),i=n.__actions__=gi(this.__actions__);return i.push({func:r,args:arguments,thisArg:e}),n.__chain__=t,n}return r.apply(e,pt([this.value()],arguments))})})),e}function Qa(){}var Ja=Pi(dt),Za=Pi(lt),el=Pi(mt);function tl(e){return lo(e)?St(ko(e)):function(e){return function(t){return fr(t,e)}}(e)}var nl=Ni(),rl=Ni(!0);function il(){return[]}function ol(){return!1}var ul=Oi((function(e,t){return e+t}),0),al=Fi("ceil"),ll=Oi((function(e,t){return e/t}),1),sl=Fi("floor");var cl,fl=Oi((function(e,t){return e*t}),1),dl=Fi("round"),pl=Oi((function(e,t){return e-t}),0);return xn.after=function(e,t){if("function"!=typeof t)throw new ye(i);return e=ra(e),function(){if(--e<1)return t.apply(this,arguments)}},xn.ary=mu,xn.assign=la,xn.assignIn=sa,xn.assignInWith=ca,xn.assignWith=fa,xn.at=da,xn.before=gu,xn.bind=yu,xn.bindAll=Wa,xn.bindKey=_u,xn.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return Nu(e)?e:[e]},xn.chain=tu,xn.chunk=function(e,t,n){t=(n?ao(e,t,n):void 0===t)?1:un(ra(t),0);var i=null==e?0:e.length;if(!i||t<1)return[];for(var o=0,u=0,a=r(Jt(i/t));oi?0:i+n),(r=void 0===r||r>i?i:ra(r))<0&&(r+=i),r=n>r?0:ia(r);n>>0)?(e=aa(e))&&("string"==typeof t||null!=t&&!Yu(t))&&!(t=Qr(t))&&Bt(e)?si(qt(e),0,n):e.split(t,n):[]},xn.spread=function(e,t){if("function"!=typeof e)throw new ye(i);return t=null==t?0:un(ra(t),0),Br((function(n){var r=n[t],i=si(n,0,t);return r&&pt(i,r),it(e,this,i)}))},xn.tail=function(e){var t=null==e?0:e.length;return t?qr(e,1,t):[]},xn.take=function(e,t,n){return e&&e.length?qr(e,0,(t=n||void 0===t?1:ra(t))<0?0:t):[]},xn.takeRight=function(e,t,n){var r=null==e?0:e.length;return r?qr(e,(t=r-(t=n||void 0===t?1:ra(t)))<0?0:t,r):[]},xn.takeRightWhile=function(e,t){return e&&e.length?ti(e,Xi(t,3),!1,!0):[]},xn.takeWhile=function(e,t){return e&&e.length?ti(e,Xi(t,3)):[]},xn.tap=function(e,t){return t(e),e},xn.throttle=function(e,t,n){var r=!0,o=!0;if("function"!=typeof e)throw new ye(i);return Hu(n)&&(r="leading"in n?!!n.leading:r,o="trailing"in n?!!n.trailing:o),bu(e,t,{leading:r,maxWait:t,trailing:o})},xn.thru=nu,xn.toArray=ta,xn.toPairs=Ta,xn.toPairsIn=xa,xn.toPath=function(e){return Nu(e)?dt(e,ko):Qu(e)?[e]:gi(Co(aa(e)))},xn.toPlainObject=ua,xn.transform=function(e,t,n){var r=Nu(e),i=r||Lu(e)||Ju(e);if(t=Xi(t,4),null==n){var o=e&&e.constructor;n=i?r?new o:[]:Hu(e)&&Uu(o)?An(qe(e)):{}}return(i?ut:lr)(e,(function(e,r,i){return t(n,e,r,i)})),n},xn.unary=function(e){return mu(e,1)},xn.union=Vo,xn.unionBy=qo,xn.unionWith=Go,xn.uniq=function(e){return e&&e.length?Jr(e):[]},xn.uniqBy=function(e,t){return e&&e.length?Jr(e,Xi(t,2)):[]},xn.uniqWith=function(e,t){return t="function"==typeof t?t:void 0,e&&e.length?Jr(e,void 0,t):[]},xn.unset=function(e,t){return null==e||Zr(e,t)},xn.unzip=$o,xn.unzipWith=Yo,xn.update=function(e,t,n){return null==e?e:ei(e,t,ui(n))},xn.updateWith=function(e,t,n,r){return r="function"==typeof r?r:void 0,null==e?e:ei(e,t,ui(n),r)},xn.values=Aa,xn.valuesIn=function(e){return null==e?[]:Ot(e,wa(e))},xn.without=Ko,xn.words=Ua,xn.wrap=function(e,t){return ku(ui(t),e)},xn.xor=Xo,xn.xorBy=Qo,xn.xorWith=Jo,xn.zip=Zo,xn.zipObject=function(e,t){return ii(e||[],t||[],Hn)},xn.zipObjectDeep=function(e,t){return ii(e||[],t||[],zr)},xn.zipWith=eu,xn.entries=Ta,xn.entriesIn=xa,xn.extend=sa,xn.extendWith=ca,Xa(xn,xn),xn.add=ul,xn.attempt=za,xn.camelCase=Oa,xn.capitalize=Pa,xn.ceil=al,xn.clamp=function(e,t,n){return void 0===n&&(n=t,t=void 0),void 0!==n&&(n=(n=oa(n))==n?n:0),void 0!==t&&(t=(t=oa(t))==t?t:0),Kn(oa(e),t,n)},xn.clone=function(e){return Xn(e,4)},xn.cloneDeep=function(e){return Xn(e,5)},xn.cloneDeepWith=function(e,t){return Xn(e,5,t="function"==typeof t?t:void 0)},xn.cloneWith=function(e,t){return Xn(e,4,t="function"==typeof t?t:void 0)},xn.conformsTo=function(e,t){return null==t||Qn(e,t,ba(t))},xn.deburr=Ia,xn.defaultTo=function(e,t){return null==e||e!=e?t:e},xn.divide=ll,xn.endsWith=function(e,t,n){e=aa(e),t=Qr(t);var r=e.length,i=n=void 0===n?r:Kn(ra(n),0,r);return(n-=t.length)>=0&&e.slice(n,i)==t},xn.eq=Au,xn.escape=function(e){return(e=aa(e))&&B.test(e)?e.replace(F,Ft):e},xn.escapeRegExp=function(e){return(e=aa(e))&&G.test(e)?e.replace(q,"\\$&"):e},xn.every=function(e,t,n){var r=Nu(e)?lt:nr;return n&&ao(e,t,n)&&(t=void 0),r(e,Xi(t,3))},xn.find=ou,xn.findIndex=Io,xn.findKey=function(e,t){return yt(e,Xi(t,3),lr)},xn.findLast=uu,xn.findLastIndex=No,xn.findLastKey=function(e,t){return yt(e,Xi(t,3),sr)},xn.floor=sl,xn.forEach=au,xn.forEachRight=lu,xn.forIn=function(e,t){return null==e?e:ur(e,Xi(t,3),wa)},xn.forInRight=function(e,t){return null==e?e:ar(e,Xi(t,3),wa)},xn.forOwn=function(e,t){return e&&lr(e,Xi(t,3))},xn.forOwnRight=function(e,t){return e&&sr(e,Xi(t,3))},xn.get=va,xn.gt=Ou,xn.gte=Pu,xn.has=function(e,t){return null!=e&&ro(e,t,vr)},xn.hasIn=ma,xn.head=Ro,xn.identity=Ga,xn.includes=function(e,t,n,r){e=Ru(e)?e:Aa(e),n=n&&!r?ra(n):0;var i=e.length;return n<0&&(n=un(i+n,0)),Xu(e)?n<=i&&e.indexOf(t,n)>-1:!!i&&bt(e,t,n)>-1},xn.indexOf=function(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var i=null==n?0:ra(n);return i<0&&(i=un(r+i,0)),bt(e,t,i)},xn.inRange=function(e,t,n){return t=na(t),void 0===n?(n=t,t=0):n=na(n),function(e,t,n){return e>=an(t,n)&&e=-9007199254740991&&e<=9007199254740991},xn.isSet=Ku,xn.isString=Xu,xn.isSymbol=Qu,xn.isTypedArray=Ju,xn.isUndefined=function(e){return void 0===e},xn.isWeakMap=function(e){return Vu(e)&&no(e)==w},xn.isWeakSet=function(e){return Vu(e)&&"[object WeakSet]"==pr(e)},xn.join=function(e,t){return null==e?"":rn.call(e,t)},xn.kebabCase=Na,xn.last=jo,xn.lastIndexOf=function(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var i=r;return void 0!==n&&(i=(i=ra(n))<0?un(r+i,0):an(i,r-1)),t==t?function(e,t,n){for(var r=n+1;r--;)if(e[r]===t)return r;return r}(e,t,i):_t(e,Et,i,!0)},xn.lowerCase=Ma,xn.lowerFirst=Ra,xn.lt=Zu,xn.lte=ea,xn.max=function(e){return e&&e.length?rr(e,Ga,hr):void 0},xn.maxBy=function(e,t){return e&&e.length?rr(e,Xi(t,2),hr):void 0},xn.mean=function(e){return Dt(e,Ga)},xn.meanBy=function(e,t){return Dt(e,Xi(t,2))},xn.min=function(e){return e&&e.length?rr(e,Ga,kr):void 0},xn.minBy=function(e,t){return e&&e.length?rr(e,Xi(t,2),kr):void 0},xn.stubArray=il,xn.stubFalse=ol,xn.stubObject=function(){return{}},xn.stubString=function(){return""},xn.stubTrue=function(){return!0},xn.multiply=fl,xn.nth=function(e,t){return e&&e.length?Pr(e,ra(t)):void 0},xn.noConflict=function(){return Ge._===this&&(Ge._=Ae),this},xn.noop=Qa,xn.now=vu,xn.pad=function(e,t,n){e=aa(e);var r=(t=ra(t))?Vt(e):0;if(!t||r>=t)return e;var i=(t-r)/2;return Ii(Zt(i),n)+e+Ii(Jt(i),n)},xn.padEnd=function(e,t,n){e=aa(e);var r=(t=ra(t))?Vt(e):0;return t&&rt){var r=e;e=t,t=r}if(n||e%1||t%1){var i=cn();return an(e+i*(t-e+We("1e-"+((i+"").length-1))),t)}return Fr(e,t)},xn.reduce=function(e,t,n){var r=Nu(e)?ht:kt,i=arguments.length<3;return r(e,Xi(t,4),n,i,er)},xn.reduceRight=function(e,t,n){var r=Nu(e)?vt:kt,i=arguments.length<3;return r(e,Xi(t,4),n,i,tr)},xn.repeat=function(e,t,n){return t=(n?ao(e,t,n):void 0===t)?1:ra(t),Lr(aa(e),t)},xn.replace=function(){var e=arguments,t=aa(e[0]);return e.length<3?t:t.replace(e[1],e[2])},xn.result=function(e,t,n){var r=-1,i=(t=ai(t,e)).length;for(i||(i=1,e=void 0);++r9007199254740991)return[];var n=4294967295,r=an(e,4294967295);e-=4294967295;for(var i=xt(r,t=Xi(t));++n=o)return e;var a=n-Vt(r);if(a<1)return r;var l=u?si(u,0,a).join(""):e.slice(0,a);if(void 0===i)return l+r;if(u&&(a+=l.length-a),Yu(i)){if(e.slice(a).search(i)){var s,c=l;for(i.global||(i=me(i.source,aa(ne.exec(i))+"g")),i.lastIndex=0;s=i.exec(c);)var f=s.index;l=l.slice(0,void 0===f?a:f)}}else if(e.indexOf(Qr(i),a)!=a){var d=l.lastIndexOf(i);d>-1&&(l=l.slice(0,d))}return l+r},xn.unescape=function(e){return(e=aa(e))&&L.test(e)?e.replace(R,Gt):e},xn.uniqueId=function(e){var t=++Ce;return aa(e)+t},xn.upperCase=Ba,xn.upperFirst=ja,xn.each=au,xn.eachRight=lu,xn.first=Ro,Xa(xn,(cl={},lr(xn,(function(e,t){Se.call(xn.prototype,t)||(cl[t]=e)})),cl),{chain:!1}),xn.VERSION="4.17.20",ut(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){xn[e].placeholder=xn})),ut(["drop","take"],(function(e,t){In.prototype[e]=function(n){n=void 0===n?1:un(ra(n),0);var r=this.__filtered__&&!t?new In(this):this.clone();return r.__filtered__?r.__takeCount__=an(n,r.__takeCount__):r.__views__.push({size:an(n,4294967295),type:e+(r.__dir__<0?"Right":"")}),r},In.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}})),ut(["filter","map","takeWhile"],(function(e,t){var n=t+1,r=1==n||3==n;In.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:Xi(e,3),type:n}),t.__filtered__=t.__filtered__||r,t}})),ut(["head","last"],(function(e,t){var n="take"+(t?"Right":"");In.prototype[e]=function(){return this[n](1).value()[0]}})),ut(["initial","tail"],(function(e,t){var n="drop"+(t?"":"Right");In.prototype[e]=function(){return this.__filtered__?new In(this):this[n](1)}})),In.prototype.compact=function(){return this.filter(Ga)},In.prototype.find=function(e){return this.filter(e).head()},In.prototype.findLast=function(e){return this.reverse().find(e)},In.prototype.invokeMap=Br((function(e,t){return"function"==typeof e?new In(this):this.map((function(n){return yr(n,e,t)}))})),In.prototype.reject=function(e){return this.filter(Su(Xi(e)))},In.prototype.slice=function(e,t){e=ra(e);var n=this;return n.__filtered__&&(e>0||t<0)?new In(n):(e<0?n=n.takeRight(-e):e&&(n=n.drop(e)),void 0!==t&&(n=(t=ra(t))<0?n.dropRight(-t):n.take(t-e)),n)},In.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},In.prototype.toArray=function(){return this.take(4294967295)},lr(In.prototype,(function(e,t){var n=/^(?:filter|find|map|reject)|While$/.test(t),r=/^(?:head|last)$/.test(t),i=xn[r?"take"+("last"==t?"Right":""):t],o=r||/^find/.test(t);i&&(xn.prototype[t]=function(){var t=this.__wrapped__,u=r?[1]:arguments,a=t instanceof In,l=u[0],s=a||Nu(t),c=function(e){var t=i.apply(xn,pt([e],u));return r&&f?t[0]:t};s&&n&&"function"==typeof l&&1!=l.length&&(a=s=!1);var f=this.__chain__,d=!!this.__actions__.length,p=o&&!f,h=a&&!d;if(!o&&s){t=h?t:new In(this);var v=e.apply(t,u);return v.__actions__.push({func:nu,args:[c],thisArg:void 0}),new Pn(v,f)}return p&&h?e.apply(this,u):(v=this.thru(c),p?r?v.value()[0]:v.value():v)})})),ut(["pop","push","shift","sort","splice","unshift"],(function(e){var t=_e[e],n=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",r=/^(?:pop|shift)$/.test(e);xn.prototype[e]=function(){var e=arguments;if(r&&!this.__chain__){var i=this.value();return t.apply(Nu(i)?i:[],e)}return this[n]((function(n){return t.apply(Nu(n)?n:[],e)}))}})),lr(In.prototype,(function(e,t){var n=xn[t];if(n){var r=n.name+"";Se.call(_n,r)||(_n[r]=[]),_n[r].push({name:t,func:n})}})),_n[xi(void 0,2).name]=[{name:"wrapper",func:void 0}],In.prototype.clone=function(){var e=new In(this.__wrapped__);return e.__actions__=gi(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=gi(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=gi(this.__views__),e},In.prototype.reverse=function(){if(this.__filtered__){var e=new In(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},In.prototype.value=function(){var e=this.__wrapped__.value(),t=this.__dir__,n=Nu(e),r=t<0,i=n?e.length:0,o=function(e,t,n){var r=-1,i=n.length;for(;++r=this.__values__.length;return{done:e,value:e?void 0:this.__values__[this.__index__++]}},xn.prototype.plant=function(e){for(var t,n=this;n instanceof On;){var r=xo(n);r.__index__=0,r.__values__=void 0,t?i.__wrapped__=r:t=r;var i=r;n=n.__wrapped__}return i.__wrapped__=e,t},xn.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof In){var t=e;return this.__actions__.length&&(t=new In(this)),(t=t.reverse()).__actions__.push({func:nu,args:[Ho],thisArg:void 0}),new Pn(t,this.__chain__)}return this.thru(Ho)},xn.prototype.toJSON=xn.prototype.valueOf=xn.prototype.value=function(){return ni(this.__wrapped__,this.__actions__)},xn.prototype.first=xn.prototype.head,gt&&(xn.prototype[gt]=function(){return this}),xn}();Ge._=$t,void 0===(r=function(){return $t}.call(t,n,t,e))||(e.exports=r)}.call(this)},1573:e=>{"use strict";const t=(e,t)=>{for(const n of Reflect.ownKeys(t))Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n));return e};e.exports=t,e.exports.default=t},9381:e=>{"use strict"; +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;function i(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,o){for(var u,a,l=i(e),s=1;s{"use strict";const r=n(1573),i=new WeakMap,o=(e,t={})=>{if("function"!=typeof e)throw new TypeError("Expected a function");let n,o=!1,u=0;const a=e.displayName||e.name||"",l=function(...r){if(i.set(l,++u),o){if(!0===t.throw)throw new Error(`Function \`${a}\` can only be called once`);return n}return o=!0,n=e.apply(this,r),e=null,n};return r(l,e),i.set(l,u),l};e.exports=o,e.exports.default=o,e.exports.callCount=e=>{if(!i.has(e))throw new Error(`The given function \`${e.name}\` is not wrapped by the \`onetime\` package`);return i.get(e)}},8070:(e,t,n)=>{"use strict";const r=n(2413),i=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"];let o={};e.exports=e=>{const t=new r.PassThrough,n=new r.PassThrough;t.write=t=>e("stdout",t),n.write=t=>e("stderr",t);const u=new console.Console(t,n);for(const e of i)o[e]=console[e],console[e]=u[e];return()=>{for(const e of i)console[e]=o[e];o={}}}},5187:e=>{window,e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=20)}([function(e,t,n){"use strict";e.exports=n(12)},function(e,t,n){"use strict"; +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/var r=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable;function u(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,a,l=u(e),s=1;s=t||n<0||f&&e-s>=o}function w(){var e=h();if(b(e))return E(e);a=setTimeout(w,function(e){var n=t-(e-l);return f?p(n,o-(e-s)):n}(e))}function E(e){return a=void 0,m&&r?y(e):(r=i=void 0,u)}function D(){var e=h(),n=b(e);if(r=arguments,i=this,l=e,n){if(void 0===a)return _(l);if(f)return a=setTimeout(w,t),y(l)}return void 0===a&&(a=setTimeout(w,t)),u}return t=g(t)||0,v(n)&&(c=!!n.leading,o=(f="maxWait"in n)?d(g(n.maxWait)||0,t):o,m="trailing"in n?!!n.trailing:m),D.cancel=function(){void 0!==a&&clearTimeout(a),s=0,r=l=i=a=void 0},D.flush=function(){return void 0===a?u:E(h())},D}(e,t,{leading:r,maxWait:t,trailing:i})}}).call(this,n(4))},function(e,t,n){(function(n){function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var i;t=e.exports=p,i="object"===(void 0===n?"undefined":r(n))&&n.env&&n.env.NODE_DEBUG&&/\bsemver\b/i.test(n.env.NODE_DEBUG)?function(){var e=Array.prototype.slice.call(arguments,0);e.unshift("SEMVER"),console.log.apply(console,e)}:function(){},t.SEMVER_SPEC_VERSION="2.0.0";var o=Number.MAX_SAFE_INTEGER||9007199254740991,u=t.re=[],a=t.src=[],l=t.tokens={},s=0;function c(e){l[e]=s++}c("NUMERICIDENTIFIER"),a[l.NUMERICIDENTIFIER]="0|[1-9]\\d*",c("NUMERICIDENTIFIERLOOSE"),a[l.NUMERICIDENTIFIERLOOSE]="[0-9]+",c("NONNUMERICIDENTIFIER"),a[l.NONNUMERICIDENTIFIER]="\\d*[a-zA-Z-][a-zA-Z0-9-]*",c("MAINVERSION"),a[l.MAINVERSION]="("+a[l.NUMERICIDENTIFIER]+")\\.("+a[l.NUMERICIDENTIFIER]+")\\.("+a[l.NUMERICIDENTIFIER]+")",c("MAINVERSIONLOOSE"),a[l.MAINVERSIONLOOSE]="("+a[l.NUMERICIDENTIFIERLOOSE]+")\\.("+a[l.NUMERICIDENTIFIERLOOSE]+")\\.("+a[l.NUMERICIDENTIFIERLOOSE]+")",c("PRERELEASEIDENTIFIER"),a[l.PRERELEASEIDENTIFIER]="(?:"+a[l.NUMERICIDENTIFIER]+"|"+a[l.NONNUMERICIDENTIFIER]+")",c("PRERELEASEIDENTIFIERLOOSE"),a[l.PRERELEASEIDENTIFIERLOOSE]="(?:"+a[l.NUMERICIDENTIFIERLOOSE]+"|"+a[l.NONNUMERICIDENTIFIER]+")",c("PRERELEASE"),a[l.PRERELEASE]="(?:-("+a[l.PRERELEASEIDENTIFIER]+"(?:\\."+a[l.PRERELEASEIDENTIFIER]+")*))",c("PRERELEASELOOSE"),a[l.PRERELEASELOOSE]="(?:-?("+a[l.PRERELEASEIDENTIFIERLOOSE]+"(?:\\."+a[l.PRERELEASEIDENTIFIERLOOSE]+")*))",c("BUILDIDENTIFIER"),a[l.BUILDIDENTIFIER]="[0-9A-Za-z-]+",c("BUILD"),a[l.BUILD]="(?:\\+("+a[l.BUILDIDENTIFIER]+"(?:\\."+a[l.BUILDIDENTIFIER]+")*))",c("FULL"),c("FULLPLAIN"),a[l.FULLPLAIN]="v?"+a[l.MAINVERSION]+a[l.PRERELEASE]+"?"+a[l.BUILD]+"?",a[l.FULL]="^"+a[l.FULLPLAIN]+"$",c("LOOSEPLAIN"),a[l.LOOSEPLAIN]="[v=\\s]*"+a[l.MAINVERSIONLOOSE]+a[l.PRERELEASELOOSE]+"?"+a[l.BUILD]+"?",c("LOOSE"),a[l.LOOSE]="^"+a[l.LOOSEPLAIN]+"$",c("GTLT"),a[l.GTLT]="((?:<|>)?=?)",c("XRANGEIDENTIFIERLOOSE"),a[l.XRANGEIDENTIFIERLOOSE]=a[l.NUMERICIDENTIFIERLOOSE]+"|x|X|\\*",c("XRANGEIDENTIFIER"),a[l.XRANGEIDENTIFIER]=a[l.NUMERICIDENTIFIER]+"|x|X|\\*",c("XRANGEPLAIN"),a[l.XRANGEPLAIN]="[v=\\s]*("+a[l.XRANGEIDENTIFIER]+")(?:\\.("+a[l.XRANGEIDENTIFIER]+")(?:\\.("+a[l.XRANGEIDENTIFIER]+")(?:"+a[l.PRERELEASE]+")?"+a[l.BUILD]+"?)?)?",c("XRANGEPLAINLOOSE"),a[l.XRANGEPLAINLOOSE]="[v=\\s]*("+a[l.XRANGEIDENTIFIERLOOSE]+")(?:\\.("+a[l.XRANGEIDENTIFIERLOOSE]+")(?:\\.("+a[l.XRANGEIDENTIFIERLOOSE]+")(?:"+a[l.PRERELEASELOOSE]+")?"+a[l.BUILD]+"?)?)?",c("XRANGE"),a[l.XRANGE]="^"+a[l.GTLT]+"\\s*"+a[l.XRANGEPLAIN]+"$",c("XRANGELOOSE"),a[l.XRANGELOOSE]="^"+a[l.GTLT]+"\\s*"+a[l.XRANGEPLAINLOOSE]+"$",c("COERCE"),a[l.COERCE]="(^|[^\\d])(\\d{1,16})(?:\\.(\\d{1,16}))?(?:\\.(\\d{1,16}))?(?:$|[^\\d])",c("COERCERTL"),u[l.COERCERTL]=new RegExp(a[l.COERCE],"g"),c("LONETILDE"),a[l.LONETILDE]="(?:~>?)",c("TILDETRIM"),a[l.TILDETRIM]="(\\s*)"+a[l.LONETILDE]+"\\s+",u[l.TILDETRIM]=new RegExp(a[l.TILDETRIM],"g"),c("TILDE"),a[l.TILDE]="^"+a[l.LONETILDE]+a[l.XRANGEPLAIN]+"$",c("TILDELOOSE"),a[l.TILDELOOSE]="^"+a[l.LONETILDE]+a[l.XRANGEPLAINLOOSE]+"$",c("LONECARET"),a[l.LONECARET]="(?:\\^)",c("CARETTRIM"),a[l.CARETTRIM]="(\\s*)"+a[l.LONECARET]+"\\s+",u[l.CARETTRIM]=new RegExp(a[l.CARETTRIM],"g"),c("CARET"),a[l.CARET]="^"+a[l.LONECARET]+a[l.XRANGEPLAIN]+"$",c("CARETLOOSE"),a[l.CARETLOOSE]="^"+a[l.LONECARET]+a[l.XRANGEPLAINLOOSE]+"$",c("COMPARATORLOOSE"),a[l.COMPARATORLOOSE]="^"+a[l.GTLT]+"\\s*("+a[l.LOOSEPLAIN]+")$|^$",c("COMPARATOR"),a[l.COMPARATOR]="^"+a[l.GTLT]+"\\s*("+a[l.FULLPLAIN]+")$|^$",c("COMPARATORTRIM"),a[l.COMPARATORTRIM]="(\\s*)"+a[l.GTLT]+"\\s*("+a[l.LOOSEPLAIN]+"|"+a[l.XRANGEPLAIN]+")",u[l.COMPARATORTRIM]=new RegExp(a[l.COMPARATORTRIM],"g"),c("HYPHENRANGE"),a[l.HYPHENRANGE]="^\\s*("+a[l.XRANGEPLAIN]+")\\s+-\\s+("+a[l.XRANGEPLAIN]+")\\s*$",c("HYPHENRANGELOOSE"),a[l.HYPHENRANGELOOSE]="^\\s*("+a[l.XRANGEPLAINLOOSE]+")\\s+-\\s+("+a[l.XRANGEPLAINLOOSE]+")\\s*$",c("STAR"),a[l.STAR]="(<|>)?=?\\s*\\*";for(var f=0;f256)return null;if(!(t.loose?u[l.LOOSE]:u[l.FULL]).test(e))return null;try{return new p(e,t)}catch(e){return null}}function p(e,t){if(t&&"object"===r(t)||(t={loose:!!t,includePrerelease:!1}),e instanceof p){if(e.loose===t.loose)return e;e=e.version}else if("string"!=typeof e)throw new TypeError("Invalid Version: "+e);if(e.length>256)throw new TypeError("version is longer than 256 characters");if(!(this instanceof p))return new p(e,t);i("SemVer",e,t),this.options=t,this.loose=!!t.loose;var n=e.trim().match(t.loose?u[l.LOOSE]:u[l.FULL]);if(!n)throw new TypeError("Invalid Version: "+e);if(this.raw=e,this.major=+n[1],this.minor=+n[2],this.patch=+n[3],this.major>o||this.major<0)throw new TypeError("Invalid major version");if(this.minor>o||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>o||this.patch<0)throw new TypeError("Invalid patch version");n[4]?this.prerelease=n[4].split(".").map((function(e){if(/^[0-9]+$/.test(e)){var t=+e;if(t>=0&&t=0;)"number"==typeof this.prerelease[n]&&(this.prerelease[n]++,n=-2);-1===n&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error("invalid increment argument: "+e)}return this.format(),this.raw=this.version,this},t.inc=function(e,t,n,r){"string"==typeof n&&(r=n,n=void 0);try{return new p(e,n).inc(t,r).version}catch(e){return null}},t.diff=function(e,t){if(_(e,t))return null;var n=d(e),r=d(t),i="";if(n.prerelease.length||r.prerelease.length){i="pre";var o="prerelease"}for(var u in n)if(("major"===u||"minor"===u||"patch"===u)&&n[u]!==r[u])return i+u;return o},t.compareIdentifiers=v;var h=/^[0-9]+$/;function v(e,t){var n=h.test(e),r=h.test(t);return n&&r&&(e=+e,t=+t),e===t?0:n&&!r?-1:r&&!n?1:e0}function y(e,t,n){return m(e,t,n)<0}function _(e,t,n){return 0===m(e,t,n)}function b(e,t,n){return 0!==m(e,t,n)}function w(e,t,n){return m(e,t,n)>=0}function E(e,t,n){return m(e,t,n)<=0}function D(e,t,n,i){switch(t){case"===":return"object"===r(e)&&(e=e.version),"object"===r(n)&&(n=n.version),e===n;case"!==":return"object"===r(e)&&(e=e.version),"object"===r(n)&&(n=n.version),e!==n;case"":case"=":case"==":return _(e,n,i);case"!=":return b(e,n,i);case">":return g(e,n,i);case">=":return w(e,n,i);case"<":return y(e,n,i);case"<=":return E(e,n,i);default:throw new TypeError("Invalid operator: "+t)}}function S(e,t){if(t&&"object"===r(t)||(t={loose:!!t,includePrerelease:!1}),e instanceof S){if(e.loose===!!t.loose)return e;e=e.value}if(!(this instanceof S))return new S(e,t);i("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===C?this.value="":this.value=this.operator+this.semver.version,i("comp",this)}t.rcompareIdentifiers=function(e,t){return v(t,e)},t.major=function(e,t){return new p(e,t).major},t.minor=function(e,t){return new p(e,t).minor},t.patch=function(e,t){return new p(e,t).patch},t.compare=m,t.compareLoose=function(e,t){return m(e,t,!0)},t.compareBuild=function(e,t,n){var r=new p(e,n),i=new p(t,n);return r.compare(i)||r.compareBuild(i)},t.rcompare=function(e,t,n){return m(t,e,n)},t.sort=function(e,n){return e.sort((function(e,r){return t.compareBuild(e,r,n)}))},t.rsort=function(e,n){return e.sort((function(e,r){return t.compareBuild(r,e,n)}))},t.gt=g,t.lt=y,t.eq=_,t.neq=b,t.gte=w,t.lte=E,t.cmp=D,t.Comparator=S;var C={};function k(e,t){if(t&&"object"===r(t)||(t={loose:!!t,includePrerelease:!1}),e instanceof k)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new k(e.raw,t);if(e instanceof S)return new k(e.value,t);if(!(this instanceof k))return new k(e,t);if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map((function(e){return this.parseRange(e.trim())}),this).filter((function(e){return e.length})),!this.set.length)throw new TypeError("Invalid SemVer Range: "+e);this.format()}function T(e,t){for(var n=!0,r=e.slice(),i=r.pop();n&&r.length;)n=r.every((function(e){return i.intersects(e,t)})),i=r.pop();return n}function x(e){return!e||"x"===e.toLowerCase()||"*"===e}function A(e,t,n,r,i,o,u,a,l,s,c,f,d){return((t=x(n)?"":x(r)?">="+n+".0.0":x(i)?">="+n+"."+r+".0":">="+t)+" "+(a=x(l)?"":x(s)?"<"+(+l+1)+".0.0":x(c)?"<"+l+"."+(+s+1)+".0":f?"<="+l+"."+s+"."+c+"-"+f:"<="+a)).trim()}function O(e,t,n){for(var r=0;r0){var o=e[r].semver;if(o.major===t.major&&o.minor===t.minor&&o.patch===t.patch)return!0}return!1}return!0}function P(e,t,n){try{t=new k(t,n)}catch(e){return!1}return t.test(e)}function I(e,t,n,r){var i,o,u,a,l;switch(e=new p(e,r),t=new k(t,r),n){case">":i=g,o=E,u=y,a=">",l=">=";break;case"<":i=y,o=w,u=g,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(P(e,t,r))return!1;for(var s=0;s=0.0.0")),f=f||e,d=d||e,i(e.semver,f.semver,r)?f=e:u(e.semver,d.semver,r)&&(d=e)})),f.operator===a||f.operator===l)return!1;if((!d.operator||d.operator===a)&&o(e,d.semver))return!1;if(d.operator===l&&u(e,d.semver))return!1}return!0}S.prototype.parse=function(e){var t=this.options.loose?u[l.COMPARATORLOOSE]:u[l.COMPARATOR],n=e.match(t);if(!n)throw new TypeError("Invalid comparator: "+e);this.operator=void 0!==n[1]?n[1]:"","="===this.operator&&(this.operator=""),n[2]?this.semver=new p(n[2],this.options.loose):this.semver=C},S.prototype.toString=function(){return this.value},S.prototype.test=function(e){if(i("Comparator.test",e,this.options.loose),this.semver===C||e===C)return!0;if("string"==typeof e)try{e=new p(e,this.options)}catch(e){return!1}return D(e,this.operator,this.semver,this.options)},S.prototype.intersects=function(e,t){if(!(e instanceof S))throw new TypeError("a Comparator is required");var n;if(t&&"object"===r(t)||(t={loose:!!t,includePrerelease:!1}),""===this.operator)return""===this.value||(n=new k(e.value,t),P(this.value,n,t));if(""===e.operator)return""===e.value||(n=new k(this.value,t),P(e.semver,n,t));var i=!(">="!==this.operator&&">"!==this.operator||">="!==e.operator&&">"!==e.operator),o=!("<="!==this.operator&&"<"!==this.operator||"<="!==e.operator&&"<"!==e.operator),u=this.semver.version===e.semver.version,a=!(">="!==this.operator&&"<="!==this.operator||">="!==e.operator&&"<="!==e.operator),l=D(this.semver,"<",e.semver,t)&&(">="===this.operator||">"===this.operator)&&("<="===e.operator||"<"===e.operator),s=D(this.semver,">",e.semver,t)&&("<="===this.operator||"<"===this.operator)&&(">="===e.operator||">"===e.operator);return i||o||u&&a||l||s},t.Range=k,k.prototype.format=function(){return this.range=this.set.map((function(e){return e.join(" ").trim()})).join("||").trim(),this.range},k.prototype.toString=function(){return this.range},k.prototype.parseRange=function(e){var t=this.options.loose;e=e.trim();var n=t?u[l.HYPHENRANGELOOSE]:u[l.HYPHENRANGE];e=e.replace(n,A),i("hyphen replace",e),e=e.replace(u[l.COMPARATORTRIM],"$1$2$3"),i("comparator trim",e,u[l.COMPARATORTRIM]),e=(e=(e=e.replace(u[l.TILDETRIM],"$1~")).replace(u[l.CARETTRIM],"$1^")).split(/\s+/).join(" ");var r=t?u[l.COMPARATORLOOSE]:u[l.COMPARATOR],o=e.split(" ").map((function(e){return function(e,t){return i("comp",e,t),e=function(e,t){return e.trim().split(/\s+/).map((function(e){return function(e,t){i("caret",e,t);var n=t.loose?u[l.CARETLOOSE]:u[l.CARET];return e.replace(n,(function(t,n,r,o,u){var a;return i("caret",e,t,n,r,o,u),x(n)?a="":x(r)?a=">="+n+".0.0 <"+(+n+1)+".0.0":x(o)?a="0"===n?">="+n+"."+r+".0 <"+n+"."+(+r+1)+".0":">="+n+"."+r+".0 <"+(+n+1)+".0.0":u?(i("replaceCaret pr",u),a="0"===n?"0"===r?">="+n+"."+r+"."+o+"-"+u+" <"+n+"."+r+"."+(+o+1):">="+n+"."+r+"."+o+"-"+u+" <"+n+"."+(+r+1)+".0":">="+n+"."+r+"."+o+"-"+u+" <"+(+n+1)+".0.0"):(i("no pr"),a="0"===n?"0"===r?">="+n+"."+r+"."+o+" <"+n+"."+r+"."+(+o+1):">="+n+"."+r+"."+o+" <"+n+"."+(+r+1)+".0":">="+n+"."+r+"."+o+" <"+(+n+1)+".0.0"),i("caret return",a),a}))}(e,t)})).join(" ")}(e,t),i("caret",e),e=function(e,t){return e.trim().split(/\s+/).map((function(e){return function(e,t){var n=t.loose?u[l.TILDELOOSE]:u[l.TILDE];return e.replace(n,(function(t,n,r,o,u){var a;return i("tilde",e,t,n,r,o,u),x(n)?a="":x(r)?a=">="+n+".0.0 <"+(+n+1)+".0.0":x(o)?a=">="+n+"."+r+".0 <"+n+"."+(+r+1)+".0":u?(i("replaceTilde pr",u),a=">="+n+"."+r+"."+o+"-"+u+" <"+n+"."+(+r+1)+".0"):a=">="+n+"."+r+"."+o+" <"+n+"."+(+r+1)+".0",i("tilde return",a),a}))}(e,t)})).join(" ")}(e,t),i("tildes",e),e=function(e,t){return i("replaceXRanges",e,t),e.split(/\s+/).map((function(e){return function(e,t){e=e.trim();var n=t.loose?u[l.XRANGELOOSE]:u[l.XRANGE];return e.replace(n,(function(n,r,o,u,a,l){i("xRange",e,n,r,o,u,a,l);var s=x(o),c=s||x(u),f=c||x(a),d=f;return"="===r&&d&&(r=""),l=t.includePrerelease?"-0":"",s?n=">"===r||"<"===r?"<0.0.0-0":"*":r&&d?(c&&(u=0),a=0,">"===r?(r=">=",c?(o=+o+1,u=0,a=0):(u=+u+1,a=0)):"<="===r&&(r="<",c?o=+o+1:u=+u+1),n=r+o+"."+u+"."+a+l):c?n=">="+o+".0.0"+l+" <"+(+o+1)+".0.0"+l:f&&(n=">="+o+"."+u+".0"+l+" <"+o+"."+(+u+1)+".0"+l),i("xRange return",n),n}))}(e,t)})).join(" ")}(e,t),i("xrange",e),e=function(e,t){return i("replaceStars",e,t),e.trim().replace(u[l.STAR],"")}(e,t),i("stars",e),e}(e,this.options)}),this).join(" ").split(/\s+/);return this.options.loose&&(o=o.filter((function(e){return!!e.match(r)}))),o.map((function(e){return new S(e,this.options)}),this)},k.prototype.intersects=function(e,t){if(!(e instanceof k))throw new TypeError("a Range is required");return this.set.some((function(n){return T(n,t)&&e.set.some((function(e){return T(e,t)&&n.every((function(n){return e.every((function(e){return n.intersects(e,t)}))}))}))}))},t.toComparators=function(e,t){return new k(e,t).set.map((function(e){return e.map((function(e){return e.value})).join(" ").trim().split(" ")}))},k.prototype.test=function(e){if(!e)return!1;if("string"==typeof e)try{e=new p(e,this.options)}catch(e){return!1}for(var t=0;t":0===t.prerelease.length?t.patch++:t.prerelease.push(0),t.raw=t.format();case"":case">=":n&&!g(n,t)||(n=t);break;case"<":case"<=":break;default:throw new Error("Unexpected operation: "+e.operator)}}));return n&&e.test(n)?n:null},t.validRange=function(e,t){try{return new k(e,t).range||"*"}catch(e){return null}},t.ltr=function(e,t,n){return I(e,t,"<",n)},t.gtr=function(e,t,n){return I(e,t,">",n)},t.outside=I,t.prerelease=function(e,t){var n=d(e,t);return n&&n.prerelease.length?n.prerelease:null},t.intersects=function(e,t,n){return e=new k(e,n),t=new k(t,n),e.intersects(t)},t.coerce=function(e,t){if(e instanceof p)return e;if("number"==typeof e&&(e=String(e)),"string"!=typeof e)return null;var n=null;if((t=t||{}).rtl){for(var r;(r=u[l.COERCERTL].exec(e))&&(!n||n.index+n[0].length!==e.length);)n&&r.index+r[0].length===n.index+n[0].length||(n=r),u[l.COERCERTL].lastIndex=r.index+r[1].length+r[2].length;u[l.COERCERTL].lastIndex=-1}else n=e.match(u[l.COERCE]);return null===n?null:d(n[2]+"."+(n[3]||"0")+"."+(n[4]||"0"),t)}}).call(this,n(5))},function(e,t){function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"===("undefined"==typeof window?"undefined":n(window))&&(r=window)}e.exports=r},function(e,t){var n,r,i=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function u(){throw new Error("clearTimeout has not been defined")}function a(e){if(n===setTimeout)return setTimeout(e,0);if((n===o||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:o}catch(e){n=o}try{r="function"==typeof clearTimeout?clearTimeout:u}catch(e){r=u}}();var l,s=[],c=!1,f=-1;function d(){c&&l&&(c=!1,l.length?s=l.concat(s):f=-1,s.length&&p())}function p(){if(!c){var e=a(d);c=!0;for(var t=s.length;t;){for(l=s,s=[];++f1)for(var n=1;nthis[u])return w(this,this[h].get(e)),!1;var o=this[h].get(e).value;return this[f]&&(this[d]||this[f](e,o.value)),o.now=r,o.maxAge=n,o.value=t,this[a]+=i-o.length,o.length=i,this.get(e),b(this),!0}var s=new E(e,t,i,r,n);return s.length>this[u]?(this[f]&&this[f](e,t),!1):(this[a]+=s.length,this[p].unshift(s),this[h].set(e,this[p].head),b(this),!0)}},{key:"has",value:function(e){if(!this[h].has(e))return!1;var t=this[h].get(e).value;return!_(this,t)}},{key:"get",value:function(e){return y(this,e,!0)}},{key:"peek",value:function(e){return y(this,e,!1)}},{key:"pop",value:function(){var e=this[p].tail;return e?(w(this,e),e.value):null}},{key:"del",value:function(e){w(this,this[h].get(e))}},{key:"load",value:function(e){this.reset();for(var t=Date.now(),n=e.length-1;n>=0;n--){var r=e[n],i=r.e||0;if(0===i)this.set(r.k,r.v);else{var o=i-t;o>0&&this.set(r.k,r.v,o)}}}},{key:"prune",value:function(){var e=this;this[h].forEach((function(t,n){return y(e,n,!1)}))}},{key:"max",set:function(e){if("number"!=typeof e||e<0)throw new TypeError("max must be a non-negative number");this[u]=e||1/0,b(this)},get:function(){return this[u]}},{key:"allowStale",set:function(e){this[s]=!!e},get:function(){return this[s]}},{key:"maxAge",set:function(e){if("number"!=typeof e)throw new TypeError("maxAge must be a non-negative number");this[c]=e,b(this)},get:function(){return this[c]}},{key:"lengthCalculator",set:function(e){var t=this;"function"!=typeof e&&(e=m),e!==this[l]&&(this[l]=e,this[a]=0,this[p].forEach((function(e){e.length=t[l](e.value,e.key),t[a]+=e.length}))),b(this)},get:function(){return this[l]}},{key:"length",get:function(){return this[a]}},{key:"itemCount",get:function(){return this[p].length}}])&&i(t.prototype,n),e}(),y=function(e,t,n){var r=e[h].get(t);if(r){var i=r.value;if(_(e,i)){if(w(e,r),!e[s])return}else n&&(e[v]&&(r.value.now=Date.now()),e[p].unshiftNode(r));return i.value}},_=function(e,t){if(!t||!t.maxAge&&!e[c])return!1;var n=Date.now()-t.now;return t.maxAge?n>t.maxAge:e[c]&&n>e[c]},b=function(e){if(e[a]>e[u])for(var t=e[p].tail;e[a]>e[u]&&null!==t;){var n=t.prev;w(e,t),t=n}},w=function(e,t){if(t){var n=t.value;e[f]&&e[f](n.key,n.value),e[a]-=n.length,e[h].delete(n.key),e[p].removeNode(t)}},E=function e(t,n,i,o,u){r(this,e),this.key=t,this.value=n,this.length=i,this.now=o,this.maxAge=u||0},D=function(e,t,n,r){var i=n.value;_(e,i)&&(w(e,n),e[s]||(i=void 0)),i&&t.call(r,i.value,i.key,e)};e.exports=g},function(e,t,n){(function(t){function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}e.exports=function(){if("undefined"==typeof document||!document.addEventListener)return null;var r,i,o,u={};return u.copy=function(){var e=!1,t=null,n=!1;function r(){e=!1,t=null,n&&window.getSelection().removeAllRanges(),n=!1}return document.addEventListener("copy",(function(n){if(e){for(var r in t)n.clipboardData.setData(r,t[r]);n.preventDefault()}})),function(i){return new Promise((function(o,u){e=!0,"string"==typeof i?t={"text/plain":i}:i instanceof Node?t={"text/html":(new XMLSerializer).serializeToString(i)}:i instanceof Object?t=i:u("Invalid data type. Must be string, DOM node, or an object mapping MIME types to strings."),function e(t){try{if(document.execCommand("copy"))r(),o();else{if(t)throw r(),new Error("Unable to copy. Perhaps it's not available in your browser?");!function(){var e=document.getSelection();if(!document.queryCommandEnabled("copy")&&e.isCollapsed){var t=document.createRange();t.selectNodeContents(document.body),e.removeAllRanges(),e.addRange(t),n=!0}}(),e(!0)}}catch(e){r(),u(e)}}(!1)}))}}(),u.paste=(o=!1,document.addEventListener("paste",(function(e){if(o){o=!1,e.preventDefault();var t=r;r=null,t(e.clipboardData.getData(i))}})),function(e){return new Promise((function(t,n){o=!0,r=t,i=e||"text/plain";try{document.execCommand("paste")||(o=!1,n(new Error("Unable to paste. Pasting only works in Internet Explorer at the moment.")))}catch(e){o=!1,n(new Error(e))}}))}),"undefined"==typeof ClipboardEvent&&void 0!==window.clipboardData&&void 0!==window.clipboardData.setData&&( +/*! promise-polyfill 2.0.1 */ +function(r){function i(e,t){return function(){e.apply(t,arguments)}}function o(e){if("object"!=n(this))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],f(e,i(a,this),i(l,this))}function u(e){var t=this;return null===this._state?void this._deferreds.push(e):void d((function(){var n=t._state?e.onFulfilled:e.onRejected;if(null!==n){var r;try{r=n(t._value)}catch(t){return void e.reject(t)}e.resolve(r)}else(t._state?e.resolve:e.reject)(t._value)}))}function a(e){try{if(e===this)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==n(e)||"function"==typeof e)){var t=e.then;if("function"==typeof t)return void f(i(t,e),i(a,this),i(l,this))}this._state=!0,this._value=e,s.call(this)}catch(e){l.call(this,e)}}function l(e){this._state=!1,this._value=e,s.call(this)}function s(){for(var e=0,t=this._deferreds.length;t>e;e++)u.call(this,this._deferreds[e]);this._deferreds=null}function c(e,t,n,r){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.resolve=n,this.reject=r}function f(e,t,n){var r=!1;try{e((function(e){r||(r=!0,t(e))}),(function(e){r||(r=!0,n(e))}))}catch(e){if(r)return;r=!0,n(e)}}var d=o.immediateFn||"function"==typeof t&&t||function(e){setTimeout(e,1)},p=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};o.prototype.catch=function(e){return this.then(null,e)},o.prototype.then=function(e,t){var n=this;return new o((function(r,i){u.call(n,new c(e,t,r,i))}))},o.all=function(){var e=Array.prototype.slice.call(1===arguments.length&&p(arguments[0])?arguments[0]:arguments);return new o((function(t,r){function i(u,a){try{if(a&&("object"==n(a)||"function"==typeof a)){var l=a.then;if("function"==typeof l)return void l.call(a,(function(e){i(u,e)}),r)}e[u]=a,0==--o&&t(e)}catch(e){r(e)}}if(0===e.length)return t([]);for(var o=e.length,u=0;ur;r++)e[r].then(t,n)}))},e.exports?e.exports=o:r.Promise||(r.Promise=o)}(this),u.copy=function(e){return new Promise((function(t,n){if("string"!=typeof e&&!("text/plain"in e))throw new Error("You must provide a text/plain type.");var r="string"==typeof e?e:e["text/plain"];window.clipboardData.setData("Text",r)?t():n(new Error("Copying was rejected."))}))},u.paste=function(){return new Promise((function(e,t){var n=window.clipboardData.getData("Text");n?e(n):t(new Error("Pasting was rejected."))}))}),u}()}).call(this,n(13).setImmediate)},function(e,t,n){"use strict";e.exports=n(15)},function(e,t,n){"use strict";n.r(t),t.default=":root {\n /**\n * IMPORTANT: When new theme variables are added below– also add them to SettingsContext updateThemeVariables()\n */\n\n /* Light theme */\n --light-color-attribute-name: #ef6632;\n --light-color-attribute-name-not-editable: #23272f;\n --light-color-attribute-name-inverted: rgba(255, 255, 255, 0.7);\n --light-color-attribute-value: #1a1aa6;\n --light-color-attribute-value-inverted: #ffffff;\n --light-color-attribute-editable-value: #1a1aa6;\n --light-color-background: #ffffff;\n --light-color-background-hover: rgba(0, 136, 250, 0.1);\n --light-color-background-inactive: #e5e5e5;\n --light-color-background-invalid: #fff0f0;\n --light-color-background-selected: #0088fa;\n --light-color-button-background: #ffffff;\n --light-color-button-background-focus: #ededed;\n --light-color-button: #5f6673;\n --light-color-button-disabled: #cfd1d5;\n --light-color-button-active: #0088fa;\n --light-color-button-focus: #23272f;\n --light-color-button-hover: #23272f;\n --light-color-border: #eeeeee;\n --light-color-commit-did-not-render-fill: #cfd1d5;\n --light-color-commit-did-not-render-fill-text: #000000;\n --light-color-commit-did-not-render-pattern: #cfd1d5;\n --light-color-commit-did-not-render-pattern-text: #333333;\n --light-color-commit-gradient-0: #37afa9;\n --light-color-commit-gradient-1: #63b19e;\n --light-color-commit-gradient-2: #80b393;\n --light-color-commit-gradient-3: #97b488;\n --light-color-commit-gradient-4: #abb67d;\n --light-color-commit-gradient-5: #beb771;\n --light-color-commit-gradient-6: #cfb965;\n --light-color-commit-gradient-7: #dfba57;\n --light-color-commit-gradient-8: #efbb49;\n --light-color-commit-gradient-9: #febc38;\n --light-color-commit-gradient-text: #000000;\n --light-color-component-name: #6a51b2;\n --light-color-component-name-inverted: #ffffff;\n --light-color-component-badge-background: rgba(0, 0, 0, 0.1);\n --light-color-component-badge-background-inverted: rgba(255, 255, 255, 0.25);\n --light-color-component-badge-count: #777d88;\n --light-color-component-badge-count-inverted: rgba(255, 255, 255, 0.7);\n --light-color-context-background: rgba(0,0,0,.9);\n --light-color-context-background-hover: rgba(255, 255, 255, 0.1);\n --light-color-context-background-selected: #178fb9;\n --light-color-context-border: #3d424a;\n --light-color-context-text: #ffffff;\n --light-color-context-text-selected: #ffffff;\n --light-color-dim: #777d88;\n --light-color-dimmer: #cfd1d5;\n --light-color-dimmest: #eff0f1;\n --light-color-error-background: hsl(0, 100%, 97%);\n --light-color-error-border: hsl(0, 100%, 92%);\n --light-color-error-text: #ff0000;\n --light-color-expand-collapse-toggle: #777d88;\n --light-color-link: #0000ff;\n --light-color-modal-background: rgba(255, 255, 255, 0.75);\n --light-color-record-active: #fc3a4b;\n --light-color-record-hover: #3578e5;\n --light-color-record-inactive: #0088fa;\n --light-color-scroll-thumb: #c2c2c2;\n --light-color-scroll-track: #fafafa;\n --light-color-search-match: yellow;\n --light-color-search-match-current: #f7923b;\n --light-color-selected-tree-highlight-active: rgba(0, 136, 250, 0.1);\n --light-color-selected-tree-highlight-inactive: rgba(0, 0, 0, 0.05);\n --light-color-shadow: rgba(0, 0, 0, 0.25);\n --light-color-tab-selected-border: #0088fa;\n --light-color-text: #000000;\n --light-color-text-invalid: #ff0000;\n --light-color-text-selected: #ffffff;\n --light-color-toggle-background-invalid: #fc3a4b;\n --light-color-toggle-background-on: #0088fa;\n --light-color-toggle-background-off: #cfd1d5;\n --light-color-toggle-text: #ffffff;\n --light-color-tooltip-background: rgba(0, 0, 0, 0.9);\n --light-color-tooltip-text: #ffffff;\n\n /* Dark theme */\n --dark-color-attribute-name: #9d87d2;\n --dark-color-attribute-name-not-editable: #ededed;\n --dark-color-attribute-name-inverted: #282828;\n --dark-color-attribute-value: #cedae0;\n --dark-color-attribute-value-inverted: #ffffff;\n --dark-color-attribute-editable-value: yellow;\n --dark-color-background: #282c34;\n --dark-color-background-hover: rgba(255, 255, 255, 0.1);\n --dark-color-background-inactive: #3d424a;\n --dark-color-background-invalid: #5c0000;\n --dark-color-background-selected: #178fb9;\n --dark-color-button-background: #282c34;\n --dark-color-button-background-focus: #3d424a;\n --dark-color-button: #afb3b9;\n --dark-color-button-active: #61dafb;\n --dark-color-button-disabled: #4f5766;\n --dark-color-button-focus: #a2e9fc;\n --dark-color-button-hover: #ededed;\n --dark-color-border: #3d424a;\n --dark-color-commit-did-not-render-fill: #777d88;\n --dark-color-commit-did-not-render-fill-text: #000000;\n --dark-color-commit-did-not-render-pattern: #666c77;\n --dark-color-commit-did-not-render-pattern-text: #ffffff;\n --dark-color-commit-gradient-0: #37afa9;\n --dark-color-commit-gradient-1: #63b19e;\n --dark-color-commit-gradient-2: #80b393;\n --dark-color-commit-gradient-3: #97b488;\n --dark-color-commit-gradient-4: #abb67d;\n --dark-color-commit-gradient-5: #beb771;\n --dark-color-commit-gradient-6: #cfb965;\n --dark-color-commit-gradient-7: #dfba57;\n --dark-color-commit-gradient-8: #efbb49;\n --dark-color-commit-gradient-9: #febc38;\n --dark-color-commit-gradient-text: #000000;\n --dark-color-component-name: #61dafb;\n --dark-color-component-name-inverted: #282828;\n --dark-color-component-badge-background: rgba(255, 255, 255, 0.25);\n --dark-color-component-badge-background-inverted: rgba(0, 0, 0, 0.25);\n --dark-color-component-badge-count: #8f949d;\n --dark-color-component-badge-count-inverted: rgba(255, 255, 255, 0.7);\n --dark-color-context-background: rgba(255,255,255,.9);\n --dark-color-context-background-hover: rgba(0, 136, 250, 0.1);\n --dark-color-context-background-selected: #0088fa;\n --dark-color-context-border: #eeeeee;\n --dark-color-context-text: #000000;\n --dark-color-context-text-selected: #ffffff;\n --dark-color-dim: #8f949d;\n --dark-color-dimmer: #777d88;\n --dark-color-dimmest: #4f5766;\n --dark-color-error-background: #200;\n --dark-color-error-border: #900;\n --dark-color-error-text: #f55;\n --dark-color-expand-collapse-toggle: #8f949d;\n --dark-color-link: #61dafb;\n --dark-color-modal-background: rgba(0, 0, 0, 0.75);\n --dark-color-record-active: #fc3a4b;\n --dark-color-record-hover: #a2e9fc;\n --dark-color-record-inactive: #61dafb;\n --dark-color-scroll-thumb: #afb3b9;\n --dark-color-scroll-track: #313640;\n --dark-color-search-match: yellow;\n --dark-color-search-match-current: #f7923b;\n --dark-color-selected-tree-highlight-active: rgba(23, 143, 185, 0.15);\n --dark-color-selected-tree-highlight-inactive: rgba(255, 255, 255, 0.05);\n --dark-color-shadow: rgba(0, 0, 0, 0.5);\n --dark-color-tab-selected-border: #178fb9;\n --dark-color-text: #ffffff;\n --dark-color-text-invalid: #ff8080;\n --dark-color-text-selected: #ffffff;\n --dark-color-toggle-background-invalid: #fc3a4b;\n --dark-color-toggle-background-on: #178fb9;\n --dark-color-toggle-background-off: #777d88;\n --dark-color-toggle-text: #ffffff;\n --dark-color-tooltip-background: rgba(255, 255, 255, 0.9);\n --dark-color-tooltip-text: #000000;\n\n /* Font smoothing */\n --light-font-smoothing: auto;\n --dark-font-smoothing: antialiased;\n --font-smoothing: auto;\n\n /* Compact density */\n --compact-font-size-monospace-small: 9px;\n --compact-font-size-monospace-normal: 11px;\n --compact-font-size-monospace-large: 15px;\n --compact-font-size-sans-small: 10px;\n --compact-font-size-sans-normal: 12px;\n --compact-font-size-sans-large: 14px;\n --compact-line-height-data: 18px;\n --compact-root-font-size: 16px;\n\n /* Comfortable density */\n --comfortable-font-size-monospace-small: 10px;\n --comfortable-font-size-monospace-normal: 13px;\n --comfortable-font-size-monospace-large: 17px;\n --comfortable-font-size-sans-small: 12px;\n --comfortable-font-size-sans-normal: 14px;\n --comfortable-font-size-sans-large: 16px;\n --comfortable-line-height-data: 22px;\n --comfortable-root-font-size: 20px;\n\n /* GitHub.com system fonts */\n --font-family-monospace: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo,\n Courier, monospace;\n --font-family-sans: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica,\n Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;\n\n /* Constant values shared between JS and CSS */\n --interaction-commit-size: 10px;\n --interaction-label-width: 200px;\n}\n"},function(e,t,n){"use strict";function r(e){var t=this;if(t instanceof r||(t=new r),t.tail=null,t.head=null,t.length=0,e&&"function"==typeof e.forEach)e.forEach((function(e){t.push(e)}));else if(arguments.length>0)for(var n=0,i=arguments.length;n1)n=t;else{if(!this.head)throw new TypeError("Reduce of empty list with no initial value");r=this.head.next,n=this.head.value}for(var i=0;null!==r;i++)n=e(n,r.value,i),r=r.next;return n},r.prototype.reduceReverse=function(e,t){var n,r=this.tail;if(arguments.length>1)n=t;else{if(!this.tail)throw new TypeError("Reduce of empty list with no initial value");r=this.tail.prev,n=this.tail.value}for(var i=this.length-1;null!==r;i--)n=e(n,r.value,i),r=r.prev;return n},r.prototype.toArray=function(){for(var e=new Array(this.length),t=0,n=this.head;null!==n;t++)e[t]=n.value,n=n.next;return e},r.prototype.toArrayReverse=function(){for(var e=new Array(this.length),t=0,n=this.tail;null!==n;t++)e[t]=n.value,n=n.prev;return e},r.prototype.slice=function(e,t){(t=t||this.length)<0&&(t+=this.length),(e=e||0)<0&&(e+=this.length);var n=new r;if(tthis.length&&(t=this.length);for(var i=0,o=this.head;null!==o&&ithis.length&&(t=this.length);for(var i=this.length,o=this.tail;null!==o&&i>t;i--)o=o.prev;for(;null!==o&&i>e;i--,o=o.prev)n.push(o.value);return n},r.prototype.splice=function(e,t){e>this.length&&(e=this.length-1),e<0&&(e=this.length+e);for(var n=0,r=this.head;null!==r&&n=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(14),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(4))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var r,i,o,u,a,l=1,s={},c=!1,f=e.document,d=Object.getPrototypeOf&&Object.getPrototypeOf(e);d=d&&d.setTimeout?d:e,"[object process]"==={}.toString.call(e.process)?r=function(e){t.nextTick((function(){h(e)}))}:function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?(u="setImmediate$"+Math.random()+"$",a=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(u)&&h(+t.data.slice(u.length))},e.addEventListener?e.addEventListener("message",a,!1):e.attachEvent("onmessage",a),r=function(t){e.postMessage(u+t,"*")}):e.MessageChannel?((o=new MessageChannel).port1.onmessage=function(e){h(e.data)},r=function(e){o.port2.postMessage(e)}):f&&"onreadystatechange"in f.createElement("script")?(i=f.documentElement,r=function(e){var t=f.createElement("script");t.onreadystatechange=function(){h(e),t.onreadystatechange=null,i.removeChild(t),t=null},i.appendChild(t)}):r=function(e){setTimeout(h,0,e)},d.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;nv;v++)if(-1!==(h=g(p,c,v))){m=v,c=h;break e}c=-1}}e:{if(p=f,void 0!==(h=d().get(s.primitive)))for(v=0;vc-p?null:f.slice(p,c-1))){if(c=0,null!==r){for(;cc;r--)i=a.pop()}for(r=f.length-c-1;1<=r;r--)c=[],i.push({id:null,isStateEditable:!1,name:_(f[r-1].functionName),value:void 0,subHooks:c}),a.push(i),i=c;r=f}c="Context"===(f=s.primitive)||"DebugValue"===f?null:u++,i.push({id:c,isStateEditable:"Reducer"===f||"State"===f,name:f,value:s.value,subHooks:[]})}return function e(t,n){for(var r=[],i=0;i-1&&(t=t.replace(/eval code/g,"eval").replace(/(\(eval at [^()]*)|(\),.*$)/g,""));var n=t.replace(/^\s+/,"").replace(/\(eval code/g,"("),r=n.match(/ (\((.+):(\d+):(\d+)\)$)/),i=(n=r?n.replace(r[0],""):n).split(/\s+/).slice(1),o=this.extractLocation(r?r[1]:i.pop()),u=i.join(" ")||void 0,a=["eval",""].indexOf(o[0])>-1?void 0:o[0];return new e({functionName:u,fileName:a,lineNumber:o[1],columnNumber:o[2],source:t})}),this)},parseFFOrSafari:function(t){return t.stack.split("\n").filter((function(e){return!e.match(r)}),this).map((function(t){if(t.indexOf(" > eval")>-1&&(t=t.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,":$1")),-1===t.indexOf("@")&&-1===t.indexOf(":"))return new e({functionName:t});var n=/((.*".+"[^@]*)?[^@]*)(?:@)/,r=t.match(n),i=r&&r[1]?r[1]:void 0,o=this.extractLocation(t.replace(n,""));return new e({functionName:i,fileName:o[0],lineNumber:o[1],columnNumber:o[2],source:t})}),this)},parseOpera:function(e){return!e.stacktrace||e.message.indexOf("\n")>-1&&e.message.split("\n").length>e.stacktrace.split("\n").length?this.parseOpera9(e):e.stack?this.parseOpera11(e):this.parseOpera10(e)},parseOpera9:function(t){for(var n=/Line (\d+).*script (?:in )?(\S+)/i,r=t.message.split("\n"),i=[],o=2,u=r.length;o/,"$2").replace(/\([^)]*\)/g,"")||void 0;o.match(/\(([^)]*)\)/)&&(n=o.replace(/^[^(]+\(([^)]*)\)$/,"$1"));var a=void 0===n||"[arguments not available]"===n?void 0:n.split(",");return new e({functionName:u,args:a,fileName:i[0],lineNumber:i[1],columnNumber:i[2],source:t})}),this)}}})?r.apply(t,i):r)||(e.exports=o)}()},function(e,t,n){var r,i,o;!function(n,u){"use strict";i=[],void 0===(o="function"==typeof(r=function(){function e(e){return e.charAt(0).toUpperCase()+e.substring(1)}function t(e){return function(){return this[e]}}var n=["isConstructor","isEval","isNative","isToplevel"],r=["columnNumber","lineNumber"],i=["fileName","functionName","source"],o=n.concat(r,i,["args"]);function u(t){if(t)for(var n=0;n1?n-1:0),i=1;i=0&&n.splice(r,1)}}}])&&r(t.prototype,n),e}(),o=n(2),u=n.n(o);try{var a=n(9).default,l=function(e){var t=new RegExp("".concat(e,": ([0-9]+)")),n=a.match(t);return parseInt(n[1],10)};l("comfortable-line-height-data"),l("compact-line-height-data")}catch(e){}function s(e){try{return sessionStorage.getItem(e)}catch(e){return null}}function c(e){try{sessionStorage.removeItem(e)}catch(e){}}function f(e,t){try{return sessionStorage.setItem(e,t)}catch(e){}}var d=function(e,t){return e===t},p=n(1),h=n.n(p);function v(e){return e.ownerDocument?e.ownerDocument.defaultView:null}function m(e){var t=v(e);return t?t.frameElement:null}function g(e){var t=b(e);return y([e.getBoundingClientRect(),{top:t.borderTop,left:t.borderLeft,bottom:t.borderBottom,right:t.borderRight,width:0,height:0}])}function y(e){return e.reduce((function(e,t){return null==e?t:{top:e.top+t.top,left:e.left+t.left,width:e.width,height:e.height,bottom:e.bottom+t.bottom,right:e.right+t.right}}))}function _(e,t){var n=m(e);if(n&&n!==t){for(var r=[e.getBoundingClientRect()],i=n,o=!1;i;){var u=g(i);if(r.push(u),i=m(i),o)break;i&&v(i)===t&&(o=!0)}return y(r)}return e.getBoundingClientRect()}function b(e){var t=window.getComputedStyle(e);return{borderLeft:parseInt(t.borderLeftWidth,10),borderRight:parseInt(t.borderRightWidth,10),borderTop:parseInt(t.borderTopWidth,10),borderBottom:parseInt(t.borderBottomWidth,10),marginLeft:parseInt(t.marginLeft,10),marginRight:parseInt(t.marginRight,10),marginTop:parseInt(t.marginTop,10),marginBottom:parseInt(t.marginBottom,10),paddingLeft:parseInt(t.paddingLeft,10),paddingRight:parseInt(t.paddingRight,10),paddingTop:parseInt(t.paddingTop,10),paddingBottom:parseInt(t.paddingBottom,10)}}function w(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);nt.left+t.width&&(u=t.left+t.width-o-5),{style:{top:r+="px",left:u+="px"}}}(e,t,{width:n.width,height:n.height});h()(this.tip.style,r.style)}}]),e}(),T=function(){function e(){E(this,e);var t=window.__REACT_DEVTOOLS_TARGET_WINDOW__||window;this.window=t;var n=window.__REACT_DEVTOOLS_TARGET_WINDOW__||window;this.tipBoundsWindow=n;var r=t.document;this.container=r.createElement("div"),this.container.style.zIndex="10000000",this.tip=new k(r,this.container),this.rects=[],r.body.appendChild(this.container)}return S(e,[{key:"remove",value:function(){this.tip.remove(),this.rects.forEach((function(e){e.remove()})),this.rects.length=0,this.container.parentNode&&this.container.parentNode.removeChild(this.container)}},{key:"inspect",value:function(e,t){for(var n=this,r=e.filter((function(e){return e.nodeType===Node.ELEMENT_NODE}));this.rects.length>r.length;)this.rects.pop().remove();if(0!==r.length){for(;this.rects.length=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,u=!0,a=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return u=e.done,e},e:function(e){a=!0,o=e},f:function(){try{u||null==n.return||n.return()}finally{if(a)throw o}}}}(u.rendererInterfaces.values());try{for(s.s();!(a=s.n()).done;){var c=a.value,f=c.getFiberIDForNative(o,!0);if(null!==f){l=c.getDisplayNameForFiberID(f,!0);break}}}catch(e){s.e(e)}finally{s.f()}l&&(t+=" (in "+l+")")}}this.tip.updateText(t,i.right-i.left,i.bottom-i.top);var d=_(this.tipBoundsWindow.document.documentElement,this.window);this.tip.updatePosition({top:i.top,left:i.left,height:i.bottom-i.top,width:i.right-i.left},{top:d.top+this.tipBoundsWindow.scrollY,left:d.left+this.tipBoundsWindow.scrollX,height:this.tipBoundsWindow.innerHeight,width:this.tipBoundsWindow.innerWidth})}}}]),e}();function x(e,t,n){h()(n.style,{borderTopWidth:e[t+"Top"]+"px",borderLeftWidth:e[t+"Left"]+"px",borderRightWidth:e[t+"Right"]+"px",borderBottomWidth:e[t+"Bottom"]+"px",borderStyle:"solid"})}var A={background:"rgba(120, 170, 210, 0.7)",padding:"rgba(77, 200, 0, 0.3)",margin:"rgba(255, 155, 0, 0.3)",border:"rgba(255, 200, 50, 0.3)"},O=null,P=null;function I(){O=null,null!==P&&(P.remove(),P=null)}function N(e,t,n){null!=window.document&&(null!==O&&clearTimeout(O),null!=e&&(null===P&&(P=new T),P.inspect(e,t),n&&(O=setTimeout(I,2e3))))}var M=new Set,R=["#37afa9","#63b19e","#80b393","#97b488","#abb67d","#beb771","#cfb965","#dfba57","#efbb49","#febc38"],F=null;function L(e){return(L="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var B="object"===("undefined"==typeof performance?"undefined":L(performance))&&"function"==typeof performance.now?function(){return performance.now()}:function(){return Date.now()},j=new Map,U=null,z=!1,W=null;function H(e){z&&(e.forEach((function(e){var t=j.get(e),n=B(),r=null!=t?t.lastMeasuredAt:0,i=null!=t?t.rect:null;(null===i||r+2505&&void 0!==arguments[5]?arguments[5]:0,a=me(e);switch(a){case"html_element":return t.push(r),{inspectable:!1,preview_short:_e(e,!1),preview_long:_e(e,!0),name:e.tagName,type:a};case"function":return t.push(r),{inspectable:!1,preview_short:_e(e,!1),preview_long:_e(e,!0),name:"function"!=typeof e.name&&e.name?e.name:"function",type:a};case"string":return e.length<=500?e:e.slice(0,500)+"...";case"bigint":case"symbol":return t.push(r),{inspectable:!1,preview_short:_e(e,!1),preview_long:_e(e,!0),name:e.toString(),type:a};case"react_element":return t.push(r),{inspectable:!1,preview_short:_e(e,!1),preview_long:_e(e,!0),name:ge(e)||"Unknown",type:a};case"array_buffer":case"data_view":return t.push(r),{inspectable:!1,preview_short:_e(e,!1),preview_long:_e(e,!0),name:"data_view"===a?"DataView":"ArrayBuffer",size:e.byteLength,type:a};case"array":return o=i(r),u>=2&&!o?Z(a,!0,e,t,r):e.map((function(e,a){return ee(e,t,n,r.concat([a]),i,o?1:u+1)}));case"html_all_collection":case"typed_array":case"iterator":if(o=i(r),u>=2&&!o)return Z(a,!0,e,t,r);var l={unserializable:!0,type:a,readonly:!0,size:"typed_array"===a?e.length:void 0,preview_short:_e(e,!1),preview_long:_e(e,!0),name:e.constructor&&"Object"!==e.constructor.name?e.constructor.name:""};return Q(e[Symbol.iterator])&&Array.from(e).forEach((function(e,a){return l[a]=ee(e,t,n,r.concat([a]),i,o?1:u+1)})),n.push(r),l;case"opaque_iterator":return t.push(r),{inspectable:!1,preview_short:_e(e,!1),preview_long:_e(e,!0),name:e[Symbol.toStringTag],type:a};case"date":case"regexp":return t.push(r),{inspectable:!1,preview_short:_e(e,!1),preview_long:_e(e,!0),name:e.toString(),type:a};case"object":if(o=i(r),u>=2&&!o)return Z(a,!0,e,t,r);var s={};return ae(e).forEach((function(a){var l=a.toString();s[l]=ee(e[a],t,n,r.concat([l]),i,o?1:u+1)})),s;case"infinity":case"nan":case"undefined":return t.push(r),{type:a};default:return e}}function te(e){return(te="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ne(e){return function(e){if(Array.isArray(e))return re(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return re(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?re(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function re(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);nt.toString()?1:t.toString()>e.toString()?-1:0}function ae(e){for(var t=[],n=e,r=function(){var e=[].concat(ne(Object.keys(n)),ne(Object.getOwnPropertySymbols(n))),r=Object.getOwnPropertyDescriptors(n);e.forEach((function(e){r[e].enumerable&&t.push(e)})),n=Object.getPrototypeOf(n)};null!=n;)r();return t}function le(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"Anonymous",n=ie.get(e);if(null!=n)return n;var r=t;return"string"==typeof e.displayName?r=e.displayName:"string"==typeof e.name&&""!==e.name&&(r=e.name),ie.set(e,r),r}var se=0;function ce(){return++se}function fe(e){var t=oe.get(e);if(void 0!==t)return t;for(var n=new Array(e.length),r=0;r1&&void 0!==arguments[1]?arguments[1]:50;return e.length>t?e.substr(0,t)+"…":e}function _e(e,t){if(null!=e&&hasOwnProperty.call(e,J.type))return t?e[J.preview_long]:e[J.preview_short];switch(me(e)){case"html_element":return"<".concat(ye(e.tagName.toLowerCase())," />");case"function":return ye("Æ’ ".concat("function"==typeof e.name?"":e.name,"() {}"));case"string":return'"'.concat(e,'"');case"bigint":return ye(e.toString()+"n");case"regexp":case"symbol":return ye(e.toString());case"react_element":return"<".concat(ye(ge(e)||"Unknown")," />");case"array_buffer":return"ArrayBuffer(".concat(e.byteLength,")");case"data_view":return"DataView(".concat(e.buffer.byteLength,")");case"array":if(t){for(var n="",r=0;r0&&(n+=", "),!((n+=_e(e[r],!1)).length>50));r++);return"[".concat(ye(n),"]")}var i=hasOwnProperty.call(e,J.size)?e[J.size]:e.length;return"Array(".concat(i,")");case"typed_array":var o="".concat(e.constructor.name,"(").concat(e.length,")");if(t){for(var u="",a=0;a0&&(u+=", "),!((u+=e[a]).length>50));a++);return"".concat(o," [").concat(ye(u),"]")}return o;case"iterator":var l=e.constructor.name;if(t){for(var s=Array.from(e),c="",f=0;f0&&(c+=", "),Array.isArray(d)){var p=_e(d[0],!0),h=_e(d[1],!1);c+="".concat(p," => ").concat(h)}else c+=_e(d,!1);if(c.length>50)break}return"".concat(l,"(").concat(e.size,") {").concat(ye(c),"}")}return"".concat(l,"(").concat(e.size,")");case"opaque_iterator":return e[Symbol.toStringTag];case"date":return e.toString();case"object":if(t){for(var v=ae(e).sort(ue),m="",g=0;g0&&(m+=", "),(m+="".concat(y.toString(),": ").concat(_e(e[y],!1))).length>50)break}return"{".concat(ye(m),"}")}return"{…}";case"boolean":case"number":case"infinity":case"nan":case"null":case"undefined":return e;default:try{return ye(""+e)}catch(e){return"unserializable"}}}var be=n(7);function we(e){return(we="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ee(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function De(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:[];if(null!==e){var r=[],i=[],o=ee(e,r,i,n,t);return{data:o,cleaned:r,unserializable:i}}return null}function ke(e){var t,n,r=(t=e,n=new Set,JSON.stringify(t,(function(e,t){if("object"===we(t)&&null!==t){if(n.has(t))return;n.add(t)}return"bigint"==typeof t?t.toString()+"n":t}))),i=void 0===r?"undefined":r,o=window.__REACT_DEVTOOLS_GLOBAL_HOOK__.clipboardCopyText;"function"==typeof o?o(i).catch((function(e){})):Object(be.copy)(i)}function Te(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=t[n],i=Array.isArray(e)?e.slice():De({},e);return n+1===t.length?Array.isArray(i)?i.splice(r,1):delete i[r]:i[r]=Te(e[r],t,n+1),i}function xe(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,i=t[r],o=Array.isArray(e)?e.slice():De({},e);if(r+1===t.length){var u=n[r];o[u]=o[i],Array.isArray(o)?o.splice(i,1):delete o[i]}else o[i]=xe(e[i],t,n,r+1);return o}function Ae(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;if(r>=t.length)return n;var i=t[r],o=Array.isArray(e)?e.slice():De({},e);return o[i]=Ae(e[i],t,n,r+1),o}var Oe=n(8);function Pe(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ie(e){for(var t=1;t=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,u=!0,a=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return u=e.done,e},e:function(e){a=!0,o=e},f:function(){try{u||null==n.return||n.return()}finally{if(a)throw o}}}}function Le(e,t){if(e){if("string"==typeof e)return Be(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Be(e,t):void 0}}function Be(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0){var a=o(e);if(null!=a){var l,s=Fe(Y);try{for(s.s();!(l=s.n()).done;)if(l.value.test(a))return!0}catch(e){s.e(e)}finally{s.f()}}}if(null!=t&&K.size>0){var c,f=t.fileName,d=Fe(K);try{for(d.s();!(c=d.n()).done;)if(c.value.test(f))return!0}catch(e){d.e(e)}finally{d.f()}}return!1}function te(e){var t=e.type;switch(e.tag){case v:case S:return 1;case h:case C:return 5;case _:return 6;case b:return 11;case E:return 7;case w:case D:case y:return 9;case k:case x:return 8;case A:return 12;case O:return 13;default:switch(u(t)){case 60111:case"Symbol(react.concurrent_mode)":case"Symbol(react.async_mode)":return 9;case 60109:case"Symbol(react.provider)":return 2;case 60110:case"Symbol(react.context)":return 2;case 60108:case"Symbol(react.strict_mode)":return 9;case 60114:case"Symbol(react.profiler)":return 10;default:return 9}}}function ne(e){if(oe.has(e))return e;var t=e.alternate;return null!=t&&oe.has(t)?t:(oe.add(e),e)}null!=window.__REACT_DEVTOOLS_COMPONENT_FILTERS__?Z(window.__REACT_DEVTOOLS_COMPONENT_FILTERS__):Z([{type:1,value:7,isEnabled:!0}]);var re=new Map,ie=new Map,oe=new Set,ue=new Map,ae=new Map,le=-1;function se(e){if(!re.has(e)){var t=ce();re.set(e,t),ie.set(t,e)}return re.get(e)}function me(e){switch(te(e)){case 1:if(null!==dt){var t=se(ne(e)),n=ye(e);null!==n&&dt.set(t,n)}}}var ge={};function ye(e){switch(te(e)){case 1:var t=e.stateNode,n=ge,r=ge;return null!=t&&(t.constructor&&null!=t.constructor.contextType?r=t.context:(n=t.context)&&0===Object.keys(n).length&&(n=ge)),[n,r];default:return null}}function _e(e){switch(te(e)){case 1:if(null!==dt){var t=se(ne(e)),n=dt.has(t)?dt.get(t):null,r=ye(e);if(null==n||null==r)return null;var i=Re(n,2),o=i[0],u=i[1],a=Re(r,2),l=a[0],s=a[1];if(l!==ge)return we(o,l);if(s!==ge)return u!==s}}return null}function be(e,t){if(null==e||null==t)return!1;if(t.hasOwnProperty("baseState")&&t.hasOwnProperty("memoizedState")&&t.hasOwnProperty("next")&&t.hasOwnProperty("queue"))for(;null!==t;){if(t.memoizedState!==e.memoizedState)return!0;t=t.next,e=e.next}return!1}function we(e,t){if(null==e||null==t)return null;if(t.hasOwnProperty("baseState")&&t.hasOwnProperty("memoizedState")&&t.hasOwnProperty("next")&&t.hasOwnProperty("queue"))return null;var n,r=[],i=Fe(new Set([].concat(Me(Object.keys(e)),Me(Object.keys(t)))));try{for(i.s();!(n=i.n()).done;){var o=n.value;e[o]!==t[o]&&r.push(o)}}catch(e){i.e(e)}finally{i.f()}return r}function Ee(e,t){switch(t.tag){case v:case h:case m:case k:case x:return(Ue(t)&d)===d;default:return e.memoizedProps!==t.memoizedProps||e.memoizedState!==t.memoizedState||e.ref!==t.ref}}var De=[],Se=[],Pe=[],Ne=[],Le=new Map,Be=0,je=null;function ze(e){De.push(e)}function Ve(n){if(0!==De.length||0!==Se.length||0!==Pe.length||null!==je||vt){var r=Se.length+Pe.length+(null===je?0:1),i=new Array(3+Be+(r>0?2+r:0)+De.length),o=0;if(i[o++]=t,i[o++]=le,i[o++]=Be,Le.forEach((function(e,t){i[o++]=t.length;for(var n=fe(t),r=0;r0){i[o++]=2,i[o++]=r;for(var u=Se.length-1;u>=0;u--)i[o++]=Se[u];for(var a=0;a0?n.forEach((function(t){e.emit("operations",t)})):(null!==Dt&&(kt=!0),e.getFiberRoots(t).forEach((function(e){Ot(le=se(ne(e.current)),e.current),vt&&null!=e.memoizedInteractions&&(st={changeDescriptions:gt?new Map:null,durations:[],commitTime:We()-mt,interactions:Array.from(e.memoizedInteractions).map((function(e){return Ie(Ie({},e),{},{timestamp:e.timestamp-mt})})),maxActualDuration:0,priorityLevel:null}),$e(e.current,null,!1,!1),Ve(),le=-1})))},getBestMatchForTrackedPath:function(){if(null===Dt)return null;if(null===St)return null;for(var e=St;null!==e&&ee(e);)e=e.return;return null===e?null:{id:se(ne(e)),isFullMatch:Ct===Dt.length-1}},getDisplayNameForFiberID:function(e){var t=ie.get(e);return null!=t?o(t):null},getFiberIDForNative:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=n.findFiberByHostInstance(e);if(null!=r){if(t)for(;null!==r&&ee(r);)r=r.return;return se(ne(r))}return null},getInstanceAndStyle:function(e){var t=null,n=null,r=et(e);return null!==r&&(t=r.stateNode,null!==r.memoizedProps&&(n=r.memoizedProps.style)),{instance:t,style:n}},getOwnersList:function(e){var t=et(e);if(null==t)return null;var n=t._debugOwner,r=[{displayName:o(t)||"Anonymous",id:e,type:te(t)}];if(n)for(var i=n;null!==i;)r.unshift({displayName:o(i)||"Anonymous",id:se(ne(i)),type:te(i)}),i=i._debugOwner||null;return r},getPathForElement:function(e){var t=ie.get(e);if(null==t)return null;for(var n=[];null!==t;)n.push(It(t)),t=t.return;return n.reverse(),n},getProfilingData:function(){var e=[];if(null===yt)throw Error("getProfilingData() called before any profiling data was recorded");return yt.forEach((function(t,n){var r=[],i=[],o=new Map,u=new Map,a=null!==ft&&ft.get(n)||"Unknown";null!=pt&&pt.forEach((function(e,t){null!=ht&&ht.get(t)===n&&i.push([t,e])})),t.forEach((function(e,t){var n=e.changeDescriptions,i=e.durations,a=e.interactions,l=e.maxActualDuration,s=e.priorityLevel,c=e.commitTime,f=[];a.forEach((function(e){o.has(e.id)||o.set(e.id,e),f.push(e.id);var n=u.get(e.id);null!=n?n.push(t):u.set(e.id,[t])}));for(var d=[],p=[],h=0;h1?At.set(n,r-1):At.delete(n),xt.delete(e)}(le),Ge(r,!1))}else Ot(le,r),$e(r,null,!1,!1);if(vt&&o){var l=yt.get(le);null!=l?l.push(st):yt.set(le,[st])}Ve(),Q&&e.emit("traceUpdates",J),le=-1},handleCommitFiberUnmount:function(e){Ge(e,!1)},inspectElement:function(e,t){if(ot(e)){if(null!=t){ut(t);var n=null;return"hooks"===t[0]&&(n="hooks"),{id:e,type:"hydrated-path",path:t,value:Ce(de(nt,t),at(null,n),t)}}return{id:e,type:"no-change"}}if(rt=!1,null!==nt&&nt.id===e||(it={}),null===(nt=tt(e)))return{id:e,type:"not-found"};null!=t&&ut(t),function(e){var t=e.hooks,n=e.id,i=e.props,o=ie.get(n);if(null!=o){var u=o.elementType,a=o.stateNode,l=o.tag,s=o.type;switch(l){case v:case S:case C:r.$r=a;break;case h:r.$r={hooks:t,props:i,type:s};break;case _:r.$r={props:i,type:s.render};break;case k:case x:r.$r={props:i,type:null!=u&&null!=u.type?u.type:s};break;default:r.$r=null}}else console.warn('Could not find Fiber with id "'.concat(n,'"'))}(nt);var i=Ie({},nt);return i.context=Ce(i.context,at("context",null)),i.hooks=Ce(i.hooks,at("hooks","hooks")),i.props=Ce(i.props,at("props",null)),i.state=Ce(i.state,at("state",null)),{id:e,type:"full-data",value:i}},logElementToConsole:function(e){var t=ot(e)?nt:tt(e);if(null!==t){var n="function"==typeof console.groupCollapsed;n&&console.groupCollapsed("[Click to expand] %c<".concat(t.displayName||"Component"," />"),"color: var(--dom-tag-name-color); font-weight: normal;"),null!==t.props&&console.log("Props:",t.props),null!==t.state&&console.log("State:",t.state),null!==t.hooks&&console.log("Hooks:",t.hooks);var r=Je(e);null!==r&&console.log("Nodes:",r),null!==t.source&&console.log("Location:",t.source),(window.chrome||/firefox/i.test(navigator.userAgent))&&console.log("Right-click any value to save it as a global variable for further inspection."),n&&console.groupEnd()}else console.warn('Could not find Fiber with id "'.concat(e,'"'))},prepareViewAttributeSource:function(e,t){ot(e)&&(window.$attribute=de(nt,t))},prepareViewElementSource:function(e){var t=ie.get(e);if(null!=t){var n=t.elementType,i=t.tag,o=t.type;switch(i){case v:case S:case C:case h:r.$type=o;break;case _:r.$type=o.render;break;case k:case x:r.$type=null!=n&&null!=n.type?n.type:o;break;default:r.$type=null}}else console.warn('Could not find Fiber with id "'.concat(e,'"'))},overrideSuspense:function(e,t){if("function"!=typeof H||"function"!=typeof V)throw new Error("Expected overrideSuspense() to not get called for earlier React versions.");t?(wt.add(e),1===wt.size&&H(Et)):(wt.delete(e),0===wt.size&&H(bt));var n=ie.get(e);null!=n&&V(n)},overrideValueAtPath:function(e,t,n,r,i){var o=et(t);if(null!==o){var u=o.stateNode;switch(e){case"context":switch(r=r.slice(1),o.tag){case v:0===r.length?u.context=i:ve(u.context,r,i),u.forceUpdate()}break;case"hooks":"function"==typeof L&&L(o,n,r,i);break;case"props":switch(o.tag){case v:o.pendingProps=Ae(u.props,r,i),u.forceUpdate();break;default:"function"==typeof U&&U(o,r,i)}break;case"state":switch(o.tag){case v:ve(u.state,r,i),u.forceUpdate()}}}},renamePath:function(e,t,n,r,i){var o=et(t);if(null!==o){var u=o.stateNode;switch(e){case"context":switch(r=r.slice(1),i=i.slice(1),o.tag){case v:0===r.length||he(u.context,r,i),u.forceUpdate()}break;case"hooks":"function"==typeof j&&j(o,n,r,i);break;case"props":null===u?"function"==typeof W&&W(o,r,i):(o.pendingProps=xe(u.props,r,i),u.forceUpdate());break;case"state":he(u.state,r,i),u.forceUpdate()}}},renderer:n,setTraceUpdatesEnabled:function(e){Q=e},setTrackedPath:Tt,startProfiling:_t,stopProfiling:function(){vt=!1,gt=!1},storeAsGlobal:function(e,t,n){if(ot(e)){var r=de(nt,t),i="$reactTemp".concat(n);window[i]=r,console.log(i),console.log(r)}},updateComponentFilters:function(n){if(vt)throw Error("Cannot modify filter preferences while profiling");e.getFiberRoots(t).forEach((function(e){le=se(ne(e.current)),Ye(e.current),Ge(e.current,!1),le=-1})),Z(n),At.clear(),e.getFiberRoots(t).forEach((function(e){Ot(le=se(ne(e.current)),e.current),$e(e.current,null,!1,!1),Ve(),le=-1}))}}}function qe(e){return(qe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ge(e,t,n){if(void 0===ze)try{throw Error()}catch(e){var r=e.stack.trim().match(/\n( *(at )?)/);ze=r&&r[1]||""}return"\n"+ze+e}var $e=!1;function Ye(e,t,n){if(!e||$e)return"";var r,i=Error.prepareStackTrace;Error.prepareStackTrace=void 0,$e=!0;var o=n.current;n.current=null;try{if(t){var u=function(){throw Error()};if(Object.defineProperty(u.prototype,"props",{set:function(){throw Error()}}),"object"===("undefined"==typeof Reflect?"undefined":qe(Reflect))&&Reflect.construct){try{Reflect.construct(u,[])}catch(e){r=e}Reflect.construct(e,[],u)}else{try{u.call()}catch(e){r=e}e.call(u.prototype)}}else{try{throw Error()}catch(e){r=e}e()}}catch(e){if(e&&r&&"string"==typeof e.stack){for(var a=e.stack.split("\n"),l=r.stack.split("\n"),s=a.length-1,c=l.length-1;s>=1&&c>=0&&a[s]!==l[c];)c--;for(;s>=1&&c>=0;s--,c--)if(a[s]!==l[c]){if(1!==s||1!==c)do{if(s--,--c<0||a[s]!==l[c])return"\n"+a[s].replace(" at new "," at ")}while(s>=1&&c>=0);break}}}finally{$e=!1,Error.prepareStackTrace=i,n.current=o}var f=e?e.displayName||e.name:"";return f?Ge(f):""}function Ke(e,t,n,r){return Ye(e,!1,r)}function Xe(e,t,n){var r=e.HostComponent,i=e.LazyComponent,o=e.SuspenseComponent,u=e.SuspenseListComponent,a=e.FunctionComponent,l=e.IndeterminateComponent,s=e.SimpleMemoComponent,c=e.ForwardRef,f=e.Block,d=e.ClassComponent;switch(t.tag){case r:return Ge(t.type);case i:return Ge("Lazy");case o:return Ge("Suspense");case u:return Ge("SuspenseList");case a:case l:case s:return Ke(t.type,0,0,n);case c:return Ke(t.type.render,0,0,n);case f:return Ke(t.type._render,0,0,n);case d:return function(e,t,n,r){return Ye(e,!0,r)}(t.type,0,0,n);default:return""}}function Qe(e,t,n){try{var r="",i=t;do{r+=Xe(e,i,n),i=i.return}while(i);return r}catch(e){return"\nError generating stack: "+e.message+"\n"+e.stack}}function Je(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Ze(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Ze(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,u=!0,a=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return u=e.done,e},e:function(e){a=!0,o=e},f:function(){try{u||null==n.return||n.return()}finally{if(a)throw o}}}}function Ze(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0?r[r.length-1]:null,u=null!==o&&(tt.test(o)||nt.test(o));if(!u){var a,l=Je(rt.values());try{for(l.s();!(a=l.n()).done;){var s=a.value,c=s.currentDispatcherRef,f=s.getCurrentFiber,d=s.workTagMap,p=f();if(null!=p){var h=Qe(d,p,c);""!==h&&r.push(h);break}}}catch(e){l.e(e)}finally{l.f()}}}catch(e){}t.apply(void 0,r)};n.__REACT_DEVTOOLS_ORIGINAL_METHOD__=t,it[e]=n}catch(e){}}))}}function ft(e){return(ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function dt(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:d,n=void 0,r=[],i=void 0,o=!1,u=function(e,n){return t(e,r[n])},a=function(){for(var t=arguments.length,a=Array(t),l=0;le.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?t-1:0),r=1;r0?"development":"production";var t=Function.prototype.toString;if(e.Mount&&e.Mount._renderNewRootComponent){var n=t.call(e.Mount._renderNewRootComponent);return 0!==n.indexOf("function")?"production":-1!==n.indexOf("storedMeasure")?"development":-1!==n.indexOf("should be a pure function")?-1!==n.indexOf("NODE_ENV")||-1!==n.indexOf("development")||-1!==n.indexOf("true")?"development":-1!==n.indexOf("nextElement")||-1!==n.indexOf("nextComponent")?"unminified":"development":-1!==n.indexOf("nextElement")||-1!==n.indexOf("nextComponent")?"unminified":"outdated"}}catch(e){}return"production"}(r);try{var l=!1!==window.__REACT_DEVTOOLS_APPEND_COMPONENT_STACK__,s=!0===window.__REACT_DEVTOOLS_BREAK_ON_CONSOLE_ERRORS__;(l||s)&&(lt(r),ct({appendComponentStack:l,breakOnConsoleErrors:s}))}catch(e){}var c=e.__REACT_DEVTOOLS_ATTACH__;if("function"==typeof c){var f=c(a,i,r,e);a.rendererInterfaces.set(i,f)}return a.emit("renderer",{id:i,renderer:r,reactBuildType:o}),i},on:function(e,t){o[e]||(o[e]=[]),o[e].push(t)},off:function(e,t){if(o[e]){var n=o[e].indexOf(t);-1!==n&&o[e].splice(n,1),o[e].length||delete o[e]}},sub:function(e,t){return a.on(e,t),function(){return a.off(e,t)}},supportsFiber:!0,checkDCE:function(e){try{Function.prototype.toString.call(e).indexOf("^_^")>-1&&(n=!0,setTimeout((function(){throw new Error("React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build")})))}catch(e){}},onCommitFiberUnmount:function(e,t){var n=i.get(e);null!=n&&n.handleCommitFiberUnmount(t)},onCommitFiberRoot:function(e,t,n){var r=a.getFiberRoots(e),o=t.current,u=r.has(t),l=null==o.memoizedState||null==o.memoizedState.element;u||l?u&&l&&r.delete(t):r.add(t);var s=i.get(e);null!=s&&s.handleCommitFiberRoot(t,n)}};Object.defineProperty(e,"__REACT_DEVTOOLS_GLOBAL_HOOK__",{configurable:!1,enumerable:!1,get:function(){return a}})}(window);var $t=window.__REACT_DEVTOOLS_GLOBAL_HOOK__,Yt=[{type:1,value:7,isEnabled:!0}];function Kt(e){if(null!=$t){var t=e||{},n=t.host,r=void 0===n?"localhost":n,i=t.nativeStyleEditorValidAttributes,o=t.useHttps,u=void 0!==o&&o,a=t.port,l=void 0===a?8097:a,s=t.websocket,c=t.resolveRNStyle,f=void 0===c?null:c,d=t.isAppActive,p=u?"wss":"ws",h=null;if((void 0===d?function(){return!0}:d)()){var v=null,m=[],g=p+"://"+r+":"+l,y=s||new window.WebSocket(g);y.onclose=function(){null!==v&&v.emit("shutdown"),_()},y.onerror=function(){_()},y.onmessage=function(e){var t;try{if("string"!=typeof e.data)throw Error();t=JSON.parse(e.data)}catch(t){return void console.error("[React DevTools] Failed to parse JSON: "+e.data)}m.forEach((function(e){try{e(t)}catch(e){throw console.log("[React DevTools] Error calling listener",t),console.log("error:",e),e}}))},y.onopen=function(){(v=new xt({listen:function(e){return m.push(e),function(){var t=m.indexOf(e);t>=0&&m.splice(t,1)}},send:function(e,t,n){y.readyState===y.OPEN?y.send(JSON.stringify({event:e,payload:t})):(null!==v&&v.shutdown(),_())}})).addListener("inspectElement",(function(t){var n=t.id,r=t.rendererID,i=e.rendererInterfaces[r];if(null!=i){var o=i.findNativeNodesForFiberID(n);null!=o&&null!=o[0]&&e.emit("showNativeHighlight",o[0])}})),v.addListener("updateComponentFilters",(function(e){Yt=e})),null==window.__REACT_DEVTOOLS_COMPONENT_FILTERS__&&v.send("overrideComponentFilters",Yt);var e=new yt(v);if(e.addListener("shutdown",(function(){$t.emit("shutdown")})),function(e,t,n){if(null==e)return function(){};var r=[e.sub("renderer-attached",(function(e){var n=e.id,r=(e.renderer,e.rendererInterface);t.setRendererInterface(n,r),r.flushInitialOperations()})),e.sub("unsupported-renderer-version",(function(e){t.onUnsupportedRenderer(e)})),e.sub("operations",t.onHookOperations),e.sub("traceUpdates",t.onTraceUpdates)],i=function(t,r){var i=e.rendererInterfaces.get(t);null==i&&("function"==typeof r.findFiberByHostInstance?i=Ve(e,t,r,n):r.ComponentTree&&(i=function(e,t,n,r){var i,o=new Map,u=new WeakMap,a=new WeakMap,l=null;function s(e){if("object"!==Rt(e)||null===e)throw new Error("Invalid internal instance: "+e);if(!u.has(e)){var t=ce();u.set(e,t),o.set(t,e)}return u.get(e)}function c(e,t){if(e.length!==t.length)return!1;for(var n=0;n0?f[f.length-1]:0),f.push(i),a.set(n,s(r._topLevelWrapper));try{var o=e.apply(this,t);return f.pop(),o}catch(e){throw f=[],e}finally{if(0===f.length){var u=a.get(n);if(void 0===u)throw new Error("Expected to find root ID.");w(u)}}},performUpdateIfNecessary:function(e,t){var n=t[0];if(9===Lt(n))return e.apply(this,t);var r=s(n);f.push(r);var i=Bt(n);try{var o=e.apply(this,t),u=Bt(n);return c(i,u)||h(0,r,u),f.pop(),o}catch(e){throw f=[],e}finally{if(0===f.length){var l=a.get(n);if(void 0===l)throw new Error("Expected to find root ID.");w(l)}}},receiveComponent:function(e,t){var n=t[0];if(9===Lt(n))return e.apply(this,t);var r=s(n);f.push(r);var i=Bt(n);try{var o=e.apply(this,t),u=Bt(n);return c(i,u)||h(0,r,u),f.pop(),o}catch(e){throw f=[],e}finally{if(0===f.length){var l=a.get(n);if(void 0===l)throw new Error("Expected to find root ID.");w(l)}}},unmountComponent:function(e,t){var n=t[0];if(9===Lt(n))return e.apply(this,t);var r=s(n);f.push(r);try{var i=e.apply(this,t);return f.pop(),function(e,t){y.push(t),o.delete(t)}(0,r),i}catch(e){throw f=[],e}finally{if(0===f.length){var u=a.get(n);if(void 0===u)throw new Error("Expected to find root ID.");w(u)}}}}));var m=[],g=new Map,y=[],_=0,b=null;function w(n){if(0!==m.length||0!==y.length||null!==b){var r=y.length+(null===b?0:1),i=new Array(3+_+(r>0?2+r:0)+m.length),o=0;if(i[o++]=t,i[o++]=n,i[o++]=_,g.forEach((function(e,t){i[o++]=t.length;for(var n=fe(t),r=0;r0){i[o++]=2,i[o++]=r;for(var u=0;u"),"color: var(--dom-tag-name-color); font-weight: normal;"),null!==t.props&&console.log("Props:",t.props),null!==t.state&&console.log("State:",t.state),null!==t.context&&console.log("Context:",t.context);var r=i(e);null!==r&&console.log("Node:",r),(window.chrome||/firefox/i.test(navigator.userAgent))&&console.log("Right-click any value to save it as a global variable for further inspection."),n&&console.groupEnd()}else console.warn('Could not find element with id "'.concat(e,'"'))},overrideSuspense:function(){throw new Error("overrideSuspense not supported by this renderer")},overrideValueAtPath:function(e,t,n,r,i){var u=o.get(t);if(null!=u){var a=u._instance;if(null!=a)switch(e){case"context":ve(a.context,r,i),Pt(a);break;case"hooks":throw new Error("Hooks not supported by this renderer");case"props":var l=u._currentElement;u._currentElement=Nt(Nt({},l),{},{props:Ae(l.props,r,i)}),Pt(a);break;case"state":ve(a.state,r,i),Pt(a)}}},renamePath:function(e,t,n,r,i){var u=o.get(t);if(null!=u){var a=u._instance;if(null!=a)switch(e){case"context":he(a.context,r,i),Pt(a);break;case"hooks":throw new Error("Hooks not supported by this renderer");case"props":var l=u._currentElement;u._currentElement=Nt(Nt({},l),{},{props:xe(l.props,r,i)}),Pt(a);break;case"state":he(a.state,r,i),Pt(a)}}},prepareViewAttributeSource:function(e,t){var n=T(e);null!==n&&(window.$attribute=de(n,t))},prepareViewElementSource:function(e){var t=o.get(e);if(null!=t){var n=t._currentElement;null!=n?r.$type=n.type:console.warn('Could not find element with id "'.concat(e,'"'))}else console.warn('Could not find instance with id "'.concat(e,'"'))},renderer:n,setTraceUpdatesEnabled:function(e){},setTrackedPath:function(e){},startProfiling:function(){},stopProfiling:function(){},storeAsGlobal:function(e,t,n){var r=T(e);if(null!==r){var i=de(r,t),o="$reactTemp".concat(n);window[o]=i,console.log(o),console.log(i)}},updateComponentFilters:function(e){}}}(e,t,r,n)),null!=i&&e.rendererInterfaces.set(t,i)),null!=i?e.emit("renderer-attached",{id:t,renderer:r,rendererInterface:i}):e.emit("unsupported-renderer-version",t)};e.renderers.forEach((function(e,t){i(t,e)})),r.push(e.sub("renderer",(function(e){var t=e.id,n=e.renderer;i(t,n)}))),e.emit("react-devtools",t),e.reactDevtoolsAgent=t;var o=function(){r.forEach((function(e){return e()})),e.rendererInterfaces.forEach((function(e){e.cleanup()})),e.reactDevtoolsAgent=null};t.addListener("shutdown",o),r.push((function(){t.removeListener("shutdown",o)}))}($t,e,window),null!=f||null!=$t.resolveRNStyle)Wt(v,e,f||$t.resolveRNStyle,i||$t.nativeStyleEditorValidAttributes||null);else{var t,n,r=function(){null!==v&&Wt(v,e,t,n)};$t.hasOwnProperty("resolveRNStyle")||Object.defineProperty($t,"resolveRNStyle",{enumerable:!1,get:function(){return t},set:function(e){t=e,r()}}),$t.hasOwnProperty("nativeStyleEditorValidAttributes")||Object.defineProperty($t,"nativeStyleEditorValidAttributes",{enumerable:!1,get:function(){return n},set:function(e){n=e,r()}})}}}else _()}function _(){null===h&&(h=setTimeout((function(){return Kt(e)}),2e3))}}}])},6099:(e,t,n)=>{"use strict"; +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var r=n(9381),i="function"==typeof Symbol&&Symbol.for,o=i?Symbol.for("react.element"):60103,u=i?Symbol.for("react.portal"):60106,a=i?Symbol.for("react.fragment"):60107,l=i?Symbol.for("react.strict_mode"):60108,s=i?Symbol.for("react.profiler"):60114,c=i?Symbol.for("react.provider"):60109,f=i?Symbol.for("react.context"):60110,d=i?Symbol.for("react.forward_ref"):60112,p=i?Symbol.for("react.suspense"):60113,h=i?Symbol.for("react.memo"):60115,v=i?Symbol.for("react.lazy"):60116,m="function"==typeof Symbol&&Symbol.iterator;function g(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;nO.length&&O.push(e)}function N(e,t,n){return null==e?0:function e(t,n,r,i){var a=typeof t;"undefined"!==a&&"boolean"!==a||(t=null);var l=!1;if(null===t)l=!0;else switch(a){case"string":case"number":l=!0;break;case"object":switch(t.$$typeof){case o:case u:l=!0}}if(l)return r(i,t,""===n?"."+M(t,0):n),1;if(l=0,n=""===n?".":n+":",Array.isArray(t))for(var s=0;s{"use strict";e.exports=n(6099)},3390:(e,t,n)=>{"use strict";const r=n(834),i=n(6458);e.exports=r(()=>{i(()=>{process.stderr.write("[?25h")},{alwaysLast:!0})})},706:(e,t)=>{"use strict"; +/** @license React v0.18.0 + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var n,r,i,o,u;if(Object.defineProperty(t,"__esModule",{value:!0}),"undefined"==typeof window||"function"!=typeof MessageChannel){var a=null,l=null,s=function(){if(null!==a)try{var e=t.unstable_now();a(!0,e),a=null}catch(e){throw setTimeout(s,0),e}},c=Date.now();t.unstable_now=function(){return Date.now()-c},n=function(e){null!==a?setTimeout(n,0,e):(a=e,setTimeout(s,0))},r=function(e,t){l=setTimeout(e,t)},i=function(){clearTimeout(l)},o=function(){return!1},u=t.unstable_forceFrameRate=function(){}}else{var f=window.performance,d=window.Date,p=window.setTimeout,h=window.clearTimeout;if("undefined"!=typeof console){var v=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),"function"!=typeof v&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")}if("object"==typeof f&&"function"==typeof f.now)t.unstable_now=function(){return f.now()};else{var m=d.now();t.unstable_now=function(){return d.now()-m}}var g=!1,y=null,_=-1,b=5,w=0;o=function(){return t.unstable_now()>=w},u=function(){},t.unstable_forceFrameRate=function(e){0>e||125T(u,n))void 0!==l&&0>T(l,u)?(e[r]=l,e[a]=n,r=a):(e[r]=u,e[o]=n,r=o);else{if(!(void 0!==l&&0>T(l,n)))break e;e[r]=l,e[a]=n,r=a}}}return t}return null}function T(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var x=[],A=[],O=1,P=null,I=3,N=!1,M=!1,R=!1;function F(e){for(var t=C(A);null!==t;){if(null===t.callback)k(A);else{if(!(t.startTime<=e))break;k(A),t.sortIndex=t.expirationTime,S(x,t)}t=C(A)}}function L(e){if(R=!1,F(e),!M)if(null!==C(x))M=!0,n(B);else{var t=C(A);null!==t&&r(L,t.startTime-e)}}function B(e,n){M=!1,R&&(R=!1,i()),N=!0;var u=I;try{for(F(n),P=C(x);null!==P&&(!(P.expirationTime>n)||e&&!o());){var a=P.callback;if(null!==a){P.callback=null,I=P.priorityLevel;var l=a(P.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?P.callback=l:P===C(x)&&k(x),F(n)}else k(x);P=C(x)}if(null!==P)var s=!0;else{var c=C(A);null!==c&&r(L,c.startTime-n),s=!1}return s}finally{P=null,I=u,N=!1}}function j(e){switch(e){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1e4;default:return 5e3}}var U=u;t.unstable_ImmediatePriority=1,t.unstable_UserBlockingPriority=2,t.unstable_NormalPriority=3,t.unstable_IdlePriority=5,t.unstable_LowPriority=4,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=I;I=e;try{return t()}finally{I=n}},t.unstable_next=function(e){switch(I){case 1:case 2:case 3:var t=3;break;default:t=I}var n=I;I=t;try{return e()}finally{I=n}},t.unstable_scheduleCallback=function(e,o,u){var a=t.unstable_now();if("object"==typeof u&&null!==u){var l=u.delay;l="number"==typeof l&&0a?(e.sortIndex=l,S(A,e),null===C(x)&&e===C(A)&&(R?i():R=!0,r(L,l-a))):(e.sortIndex=u,S(x,e),M||N||(M=!0,n(B))),e},t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_wrapCallback=function(e){var t=I;return function(){var n=I;I=t;try{return e.apply(this,arguments)}finally{I=n}}},t.unstable_getCurrentPriorityLevel=function(){return I},t.unstable_shouldYield=function(){var e=t.unstable_now();F(e);var n=C(x);return n!==P&&null!==P&&null!==n&&null!==n.callback&&n.startTime<=e&&n.expirationTime{"use strict";e.exports=n(706)},6458:(e,t,n)=>{var r,i=n(2357),o=n(8082),u=n(8614);function a(){c&&(c=!1,o.forEach((function(e){try{process.removeListener(e,s[e])}catch(e){}})),process.emit=h,process.reallyExit=d,r.count-=1)}function l(e,t,n){r.emitted[e]||(r.emitted[e]=!0,r.emit(e,t,n))}"function"!=typeof u&&(u=u.EventEmitter),process.__signal_exit_emitter__?r=process.__signal_exit_emitter__:((r=process.__signal_exit_emitter__=new u).count=0,r.emitted={}),r.infinite||(r.setMaxListeners(1/0),r.infinite=!0),e.exports=function(e,t){i.equal(typeof e,"function","a callback must be provided for exit handler"),!1===c&&f();var n="exit";t&&t.alwaysLast&&(n="afterexit");return r.on(n,e),function(){r.removeListener(n,e),0===r.listeners("exit").length&&0===r.listeners("afterexit").length&&a()}},e.exports.unload=a;var s={};o.forEach((function(e){s[e]=function(){process.listeners(e).length===r.count&&(a(),l("exit",null,e),l("afterexit",null,e),process.kill(process.pid,e))}})),e.exports.signals=function(){return o},e.exports.load=f;var c=!1;function f(){c||(c=!0,r.count+=1,o=o.filter((function(e){try{return process.on(e,s[e]),!0}catch(e){return!1}})),process.emit=v,process.reallyExit=p)}var d=process.reallyExit;function p(e){process.exitCode=e||0,l("exit",process.exitCode,null),l("afterexit",process.exitCode,null),d.call(process,process.exitCode)}var h=process.emit;function v(e,t){if("exit"===e){void 0!==t&&(process.exitCode=t);var n=h.apply(this,arguments);return l("exit",process.exitCode,null),l("afterexit",process.exitCode,null),n}return h.apply(this,arguments)}},8082:e=>{e.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"],"win32"!==process.platform&&e.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT"),"linux"===process.platform&&e.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")},1566:(e,t,n)=>{"use strict";const r=n(7347),i=n(409),o=n(8483),u=["","›"],a=e=>`${u[0]}[${e}m`,l=(e,t,n)=>{let r=[];e=[...e];for(let n of e){const i=n;n.match(";")&&(n=n.split(";")[0][0]+"0");const u=o.codes.get(parseInt(n,10));if(u){const n=e.indexOf(u.toString());n>=0?e.splice(n,1):r.push(a(t?u:i))}else{if(t){r.push(a(0));break}r.push(a(i))}}if(t&&(r=r.filter((e,t)=>r.indexOf(e)===t),void 0!==n)){const e=a(o.codes.get(parseInt(n,10)));r=r.reduce((t,n)=>n===e?[n,...t]:[...t,n],[])}return r.join("")};e.exports=(e,t,n)=>{const o=[...e.normalize()],a=[];n="number"==typeof n?n:o.length;let s,c=!1,f=0,d="";for(const[p,h]of o.entries()){let o=!1;if(u.includes(h)){const t=/\d[^m]*/.exec(e.slice(p,p+18));s=t&&t.length>0?t[0]:void 0,ft&&f<=n)d+=h;else if(f!==t||c||void 0===s){if(f>=n){d+=l(a,!0,s);break}}else d=l(a)}return d}},9796:(e,t,n)=>{"use strict";const r=n(8759),i=[].concat(n(2282).builtinModules,"bootstrap_node","node").map(e=>new RegExp(`(?:\\(${e}\\.js:\\d+:\\d+\\)$|^\\s*at ${e}\\.js:\\d+:\\d+$)`));i.push(/\(internal\/[^:]+:\d+:\d+\)$/,/\s*at internal\/[^:]+:\d+:\d+$/,/\/\.node-spawn-wrap-\w+-\w+\/node:\d+:\d+\)?$/);class o{constructor(e){"internals"in(e={ignoredPackages:[],...e})==!1&&(e.internals=o.nodeInternals()),"cwd"in e==!1&&(e.cwd=process.cwd()),this._cwd=e.cwd.replace(/\\/g,"/"),this._internals=[].concat(e.internals,function(e){if(0===e.length)return[];const t=e.map(e=>r(e));return new RegExp(`[/\\\\]node_modules[/\\\\](?:${t.join("|")})[/\\\\][^:]+:\\d+:\\d+`)}(e.ignoredPackages)),this._wrapCallSite=e.wrapCallSite||!1}static nodeInternals(){return[...i]}clean(e,t=0){t=" ".repeat(t),Array.isArray(e)||(e=e.split("\n")),!/^\s*at /.test(e[0])&&/^\s*at /.test(e[1])&&(e=e.slice(1));let n=!1,r=null;const i=[];return e.forEach(e=>{if(e=e.replace(/\\/g,"/"),this._internals.some(t=>t.test(e)))return;const t=/^\s*at /.test(e);n?e=e.trimEnd().replace(/^(\s+)at /,"$1"):(e=e.trim(),t&&(e=e.slice(3))),(e=e.replace(this._cwd+"/",""))&&(t?(r&&(i.push(r),r=null),i.push(e)):(n=!0,r=e))}),i.map(e=>`${t}${e}\n`).join("")}captureString(e,t=this.captureString){"function"==typeof e&&(t=e,e=1/0);const{stackTraceLimit:n}=Error;e&&(Error.stackTraceLimit=e);const r={};Error.captureStackTrace(r,t);const{stack:i}=r;return Error.stackTraceLimit=n,this.clean(i)}capture(e,t=this.capture){"function"==typeof e&&(t=e,e=1/0);const{prepareStackTrace:n,stackTraceLimit:r}=Error;Error.prepareStackTrace=(e,t)=>this._wrapCallSite?t.map(this._wrapCallSite):t,e&&(Error.stackTraceLimit=e);const i={};Error.captureStackTrace(i,t);const{stack:o}=i;return Object.assign(Error,{prepareStackTrace:n,stackTraceLimit:r}),o}at(e=this.at){const[t]=this.capture(1,e);if(!t)return{};const n={line:t.getLineNumber(),column:t.getColumnNumber()};let r;u(n,t.getFileName(),this._cwd),t.isConstructor()&&(n.constructor=!0),t.isEval()&&(n.evalOrigin=t.getEvalOrigin()),t.isNative()&&(n.native=!0);try{r=t.getTypeName()}catch(e){}r&&"Object"!==r&&"[object Object]"!==r&&(n.type=r);const i=t.getFunctionName();i&&(n.function=i);const o=t.getMethodName();return o&&i!==o&&(n.method=o),n}parseLine(e){const t=e&&e.match(a);if(!t)return null;const n="new"===t[1];let r=t[2];const i=t[3],o=t[4],s=Number(t[5]),c=Number(t[6]);let f=t[7];const d=t[8],p=t[9],h="native"===t[10],v=")"===t[11];let m;const g={};if(d&&(g.line=Number(d)),p&&(g.column=Number(p)),v&&f){let e=0;for(let t=f.length-1;t>0;t--)if(")"===f.charAt(t))e++;else if("("===f.charAt(t)&&" "===f.charAt(t-1)&&(e--,-1===e&&" "===f.charAt(t-1))){const e=f.slice(0,t-1),n=f.slice(t+1);f=n,r+=" ("+e;break}}if(r){const e=r.match(l);e&&(r=e[1],m=e[2])}return u(g,f,this._cwd),n&&(g.constructor=!0),i&&(g.evalOrigin=i,g.evalLine=s,g.evalColumn=c,g.evalFile=o&&o.replace(/\\/g,"/")),h&&(g.native=!0),r&&(g.function=r),m&&r!==m&&(g.method=m),g}}function u(e,t,n){t&&((t=t.replace(/\\/g,"/")).startsWith(n+"/")&&(t=t.slice(n.length+1)),e.file=t)}const a=new RegExp("^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$"),l=/^(.*?) \[as (.*?)\]$/;e.exports=o},3262:(e,t,n)=>{"use strict";const r=n(7402),i=n(5640),o=e=>r(e).replace(i()," ").length;e.exports=o,e.exports.default=o},5043:(e,t,n)=>{"use strict";const r=n(7915),i=n(7347),o=n(1013),u=e=>{if("string"!=typeof(e=e.replace(o()," "))||0===e.length)return 0;e=r(e);let t=0;for(let n=0;n=127&&r<=159||(r>=768&&r<=879||(r>65535&&n++,t+=i(r)?2:1))}return t};e.exports=u,e.exports.default=u},7402:(e,t,n)=>{"use strict";const r=n(5378),i=e=>"string"==typeof e?e.replace(r(),""):e;e.exports=i,e.exports.default=i},7915:(e,t,n)=>{"use strict";const r=n(1337);e.exports=e=>"string"==typeof e?e.replace(r(),""):e},9428:(e,t,n)=>{"use strict";const r=n(2087),i=n(3867),o=n(2918),{env:u}=process;let a;function l(e){return 0!==e&&{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function s(e,t){if(0===a)return 0;if(o("color=16m")||o("color=full")||o("color=truecolor"))return 3;if(o("color=256"))return 2;if(e&&!t&&void 0===a)return 0;const n=a||0;if("dumb"===u.TERM)return n;if("win32"===process.platform){const e=r.release().split(".");return Number(e[0])>=10&&Number(e[2])>=10586?Number(e[2])>=14931?3:2:1}if("CI"in u)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(e=>e in u)||"codeship"===u.CI_NAME?1:n;if("TEAMCITY_VERSION"in u)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(u.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in u)return 1;if("truecolor"===u.COLORTERM)return 3;if("TERM_PROGRAM"in u){const e=parseInt((u.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(u.TERM_PROGRAM){case"iTerm.app":return e>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(u.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(u.TERM)||"COLORTERM"in u?1:n}o("no-color")||o("no-colors")||o("color=false")||o("color=never")?a=0:(o("color")||o("colors")||o("color=true")||o("color=always"))&&(a=1),"FORCE_COLOR"in u&&(a="true"===u.FORCE_COLOR?1:"false"===u.FORCE_COLOR?0:0===u.FORCE_COLOR.length?1:Math.min(parseInt(u.FORCE_COLOR,10),3)),e.exports={supportsColor:function(e){return l(s(e,e&&e.isTTY))},stdout:l(s(!0,i.isatty(1))),stderr:l(s(!0,i.isatty(2)))}},8949:(e,t,n)=>{"use strict";const r=n(5043),i=e=>{let t=0;for(const n of e.split("\n"))t=Math.max(t,r(n));return t};e.exports=i,e.exports.default=i},4332:(e,t,n)=>{"use strict";const r=n(5043),i=n(7915),o=n(8483),u=new Set(["","›"]),a=e=>`${u.values().next().value}[${e}m`,l=(e,t,n)=>{const o=[...t];let a=!1,l=r(i(e[e.length-1]));for(const[t,i]of o.entries()){const s=r(i);if(l+s<=n?e[e.length-1]+=i:(e.push(i),l=0),u.has(i))a=!0;else if(a&&"m"===i){a=!1;continue}a||(l+=s,l===n&&t0&&e.length>1&&(e[e.length-2]+=e.pop())},s=e=>{const t=e.split(" ");let n=t.length;for(;n>0&&!(r(t[n-1])>0);)n--;return n===t.length?e:t.slice(0,n).join(" ")+t.slice(n).join("")},c=(e,t,n={})=>{if(!1!==n.trim&&""===e.trim())return"";let i,c="",f="";const d=(e=>e.split(" ").map(e=>r(e)))(e);let p=[""];for(const[i,o]of e.split(" ").entries()){!1!==n.trim&&(p[p.length-1]=p[p.length-1].trimLeft());let e=r(p[p.length-1]);if(0!==i&&(e>=t&&(!1===n.wordWrap||!1===n.trim)&&(p.push(""),e=0),(e>0||!1===n.trim)&&(p[p.length-1]+=" ",e++)),n.hard&&d[i]>t){const n=t-e,r=1+Math.floor((d[i]-n-1)/t);Math.floor((d[i]-1)/t)t&&e>0&&d[i]>0){if(!1===n.wordWrap&&et&&!1===n.wordWrap?l(p,o,t):p[p.length-1]+=o}}!1!==n.trim&&(p=p.map(s)),c=p.join("\n");for(const[e,t]of[...c].entries()){if(f+=t,u.has(t)){const t=parseFloat(/\d[^m]*/.exec(c.slice(e,e+4)));i=39===t?null:t}const n=o.codes.get(Number(i));i&&n&&("\n"===c[e+1]?f+=a(n):"\n"===t&&(f+=a(i)))}return f};e.exports=(e,t,n)=>String(e).normalize().replace(/\r\n/g,"\n").split("\n").map(e=>c(e,t,n)).join("\n")},3354:function(module,exports){var __WEBPACK_AMD_DEFINE_ARRAY__,__WEBPACK_AMD_DEFINE_RESULT__,wrapper;wrapper=function(Module,cb){var Module;"function"==typeof Module&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(e,t){return function(){e&&e.apply(this,arguments);try{Module.ccall("nbind_init")}catch(e){return void t(e)}t(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb),Module||(Module=(void 0!==Module?Module:null)||{});var moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1,nodeFS,nodePath;if(Module.ENVIRONMENT)if("WEB"===Module.ENVIRONMENT)ENVIRONMENT_IS_WEB=!0;else if("WORKER"===Module.ENVIRONMENT)ENVIRONMENT_IS_WORKER=!0;else if("NODE"===Module.ENVIRONMENT)ENVIRONMENT_IS_NODE=!0;else{if("SHELL"!==Module.ENVIRONMENT)throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");ENVIRONMENT_IS_SHELL=!0}else ENVIRONMENT_IS_WEB="object"==typeof window,ENVIRONMENT_IS_WORKER="function"==typeof importScripts,ENVIRONMENT_IS_NODE="object"==typeof process&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE)Module.print||(Module.print=console.log),Module.printErr||(Module.printErr=console.warn),Module.read=function(e,t){nodeFS||(nodeFS={}("")),nodePath||(nodePath={}("")),e=nodePath.normalize(e);var n=nodeFS.readFileSync(e);return t?n:n.toString()},Module.readBinary=function(e){var t=Module.read(e,!0);return t.buffer||(t=new Uint8Array(t)),assert(t.buffer),t},Module.load=function(e){globalEval(read(e))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),module.exports=Module,Module.inspect=function(){return"[Emscripten Module object]"};else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),"undefined"!=typeof printErr&&(Module.printErr=printErr),"undefined"!=typeof read?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(e){if("function"==typeof readbuffer)return new Uint8Array(readbuffer(e));var t=read(e,"binary");return assert("object"==typeof t),t},"undefined"!=typeof scriptArgs?Module.arguments=scriptArgs:void 0!==arguments&&(Module.arguments=arguments),"function"==typeof quit&&(Module.quit=function(e,t){quit(e)});else{if(!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER)throw"Unknown runtime environment. Where are we?";if(Module.read=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),Module.readAsync=function(e,t,n){var r=new XMLHttpRequest;r.open("GET",e,!0),r.responseType="arraybuffer",r.onload=function(){200==r.status||0==r.status&&r.response?t(r.response):n()},r.onerror=n,r.send(null)},void 0!==arguments&&(Module.arguments=arguments),"undefined"!=typeof console)Module.print||(Module.print=function(e){console.log(e)}),Module.printErr||(Module.printErr=function(e){console.warn(e)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&"undefined"!=typeof dump?function(e){dump(e)}:function(e){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),void 0===Module.setWindowTitle&&(Module.setWindowTitle=function(e){document.title=e})}function globalEval(e){eval.call(null,e)}for(var key in!Module.load&&Module.read&&(Module.load=function(e){globalEval(Module.read(e))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram="./this.program"),Module.quit||(Module.quit=function(e,t){throw t}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[],moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(e){return tempRet0=e,e},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(e){STACKTOP=e},getNativeTypeSize:function(e){switch(e){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:if("*"===e[e.length-1])return Runtime.QUANTUM_SIZE;if("i"===e[0]){var t=parseInt(e.substr(1));return assert(t%8==0),t/8}return 0}},getNativeFieldSize:function(e){return Math.max(Runtime.getNativeTypeSize(e),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(e,t){return"double"===t||"i64"===t?7&e&&(assert(4==(7&e)),e+=4):assert(0==(3&e)),e},getAlignSize:function(e,t,n){return n||"i64"!=e&&"double"!=e?e?Math.min(t||(e?Runtime.getNativeFieldSize(e):0),Runtime.QUANTUM_SIZE):Math.min(t,8):8},dynCall:function(e,t,n){return n&&n.length?Module["dynCall_"+e].apply(null,[t].concat(n)):Module["dynCall_"+e].call(null,t)},functionPointers:[],addFunction:function(e){for(var t=0;t>2],n=-16&(t+e+15|0);return HEAP32[DYNAMICTOP_PTR>>2]=n,n>=TOTAL_MEMORY&&!enlargeMemory()?(HEAP32[DYNAMICTOP_PTR>>2]=t,0):t},alignMemory:function(e,t){return e=Math.ceil(e/(t||16))*(t||16)},makeBigInt:function(e,t,n){return n?+(e>>>0)+4294967296*+(t>>>0):+(e>>>0)+4294967296*+(0|t)},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0,cwrap,ccall;function assert(e,t){e||abort("Assertion failed: "+t)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(e){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}function setValue(e,t,n,r){switch("*"===(n=n||"i8").charAt(n.length-1)&&(n="i32"),n){case"i1":case"i8":HEAP8[e>>0]=t;break;case"i16":HEAP16[e>>1]=t;break;case"i32":HEAP32[e>>2]=t;break;case"i64":tempI64=[t>>>0,(tempDouble=t,+Math_abs(tempDouble)>=1?tempDouble>0?(0|Math_min(+Math_floor(tempDouble/4294967296),4294967295))>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[e>>2]=tempI64[0],HEAP32[e+4>>2]=tempI64[1];break;case"float":HEAPF32[e>>2]=t;break;case"double":HEAPF64[e>>3]=t;break;default:abort("invalid type for setValue: "+n)}}function getValue(e,t,n){switch("*"===(t=t||"i8").charAt(t.length-1)&&(t="i32"),t){case"i1":case"i8":return HEAP8[e>>0];case"i16":return HEAP16[e>>1];case"i32":case"i64":return HEAP32[e>>2];case"float":return HEAPF32[e>>2];case"double":return HEAPF64[e>>3];default:abort("invalid type for setValue: "+t)}return null}!function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(e){var t=Runtime.stackAlloc(e.length);return writeArrayToMemory(e,t),t},stringToC:function(e){var t=0;if(null!=e&&0!==e){var n=1+(e.length<<2);stringToUTF8(e,t=Runtime.stackAlloc(n),n)}return t}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(e,t,n,r,i){var o=getCFunc(e),u=[],a=0;if(r)for(var l=0;l>2]=0;for(l=u+o;r>0]=0;return u}if("i8"===a)return e.subarray||e.slice?HEAPU8.set(e,u):HEAPU8.set(new Uint8Array(e),u),u;for(var s,c,f,d=0;d>0],(0!=n||t)&&(i++,!t||i!=t););t||(t=i);var o="";if(r<128){for(var u;t>0;)u=String.fromCharCode.apply(String,HEAPU8.subarray(e,e+Math.min(t,1024))),o=o?o+u:u,e+=1024,t-=1024;return o}return Module.UTF8ToString(e)}function AsciiToString(e){for(var t="";;){var n=HEAP8[e++>>0];if(!n)return t;t+=String.fromCharCode(n)}}function stringToAscii(e,t){return writeAsciiToMemory(e,t,!1)}Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE,Module.allocate=allocate,Module.getMemory=getMemory,Module.Pointer_stringify=Pointer_stringify,Module.AsciiToString=AsciiToString,Module.stringToAscii=stringToAscii;var UTF8Decoder="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(e,t){for(var n=t;e[n];)++n;if(n-t>16&&e.subarray&&UTF8Decoder)return UTF8Decoder.decode(e.subarray(t,n));for(var r,i,o,u,a,l="";;){if(!(r=e[t++]))return l;if(128&r)if(i=63&e[t++],192!=(224&r))if(o=63&e[t++],224==(240&r)?r=(15&r)<<12|i<<6|o:(u=63&e[t++],240==(248&r)?r=(7&r)<<18|i<<12|o<<6|u:(a=63&e[t++],r=248==(252&r)?(3&r)<<24|i<<18|o<<12|u<<6|a:(1&r)<<30|i<<24|o<<18|u<<12|a<<6|63&e[t++])),r<65536)l+=String.fromCharCode(r);else{var s=r-65536;l+=String.fromCharCode(55296|s>>10,56320|1023&s)}else l+=String.fromCharCode((31&r)<<6|i);else l+=String.fromCharCode(r)}}function UTF8ToString(e){return UTF8ArrayToString(HEAPU8,e)}function stringToUTF8Array(e,t,n,r){if(!(r>0))return 0;for(var i=n,o=n+r-1,u=0;u=55296&&a<=57343&&(a=65536+((1023&a)<<10)|1023&e.charCodeAt(++u)),a<=127){if(n>=o)break;t[n++]=a}else if(a<=2047){if(n+1>=o)break;t[n++]=192|a>>6,t[n++]=128|63&a}else if(a<=65535){if(n+2>=o)break;t[n++]=224|a>>12,t[n++]=128|a>>6&63,t[n++]=128|63&a}else if(a<=2097151){if(n+3>=o)break;t[n++]=240|a>>18,t[n++]=128|a>>12&63,t[n++]=128|a>>6&63,t[n++]=128|63&a}else if(a<=67108863){if(n+4>=o)break;t[n++]=248|a>>24,t[n++]=128|a>>18&63,t[n++]=128|a>>12&63,t[n++]=128|a>>6&63,t[n++]=128|63&a}else{if(n+5>=o)break;t[n++]=252|a>>30,t[n++]=128|a>>24&63,t[n++]=128|a>>18&63,t[n++]=128|a>>12&63,t[n++]=128|a>>6&63,t[n++]=128|63&a}}return t[n]=0,n-i}function stringToUTF8(e,t,n){return stringToUTF8Array(e,HEAPU8,t,n)}function lengthBytesUTF8(e){for(var t=0,n=0;n=55296&&r<=57343&&(r=65536+((1023&r)<<10)|1023&e.charCodeAt(++n)),r<=127?++t:t+=r<=2047?2:r<=65535?3:r<=2097151?4:r<=67108863?5:6}return t}Module.UTF8ArrayToString=UTF8ArrayToString,Module.UTF8ToString=UTF8ToString,Module.stringToUTF8Array=stringToUTF8Array,Module.stringToUTF8=stringToUTF8,Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0,HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64,STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;function demangle(e){var t=Module.___cxa_demangle||Module.__cxa_demangle;if(t){try{var n=e.substr(1),r=lengthBytesUTF8(n)+1,i=_malloc(r);stringToUTF8(n,i,r);var o=_malloc(4),u=t(i,0,0,o);if(0===getValue(o,"i32")&&u)return Pointer_stringify(u)}catch(e){}finally{i&&_free(i),o&&_free(o),u&&_free(u)}return e}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),e}function demangleAll(e){return e.replace(/__Z[\w\d_]+/g,(function(e){var t=demangle(e);return e===t?e:e+" ["+t+"]"}))}function jsStackTrace(){var e=new Error;if(!e.stack){try{throw new Error(0)}catch(t){e=t}if(!e.stack)return"(no stack trace available)"}return e.stack.toString()}function stackTrace(){var e=jsStackTrace();return Module.extraStackTrace&&(e+="\n"+Module.extraStackTrace()),demangleAll(e)}function updateGlobalBufferViews(){Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer)}function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}Module.stackTrace=stackTrace,STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;function getTotalMemory(){return TOTAL_MEMORY}if(TOTAL_MEMORY0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?Module.dynCall_v(n):Module.dynCall_vi(n,t.arg):n(void 0===t.arg?null:t.arg)}else t()}}Module.HEAP=HEAP,Module.buffer=buffer,Module.HEAP8=HEAP8,Module.HEAP16=HEAP16,Module.HEAP32=HEAP32,Module.HEAPU8=HEAPU8,Module.HEAPU16=HEAPU16,Module.HEAPU32=HEAPU32,Module.HEAPF32=HEAPF32,Module.HEAPF64=HEAPF64;var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for("function"==typeof Module.preRun&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__),runtimeExited=!0}function postRun(){if(Module.postRun)for("function"==typeof Module.postRun&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(e){__ATPRERUN__.unshift(e)}function addOnInit(e){__ATINIT__.unshift(e)}function addOnPreMain(e){__ATMAIN__.unshift(e)}function addOnExit(e){__ATEXIT__.unshift(e)}function addOnPostRun(e){__ATPOSTRUN__.unshift(e)}function intArrayFromString(e,t,n){var r=n>0?n:lengthBytesUTF8(e)+1,i=new Array(r),o=stringToUTF8Array(e,i,0,i.length);return t&&(i.length=o),i}function intArrayToString(e){for(var t=[],n=0;n255&&(r&=255),t.push(String.fromCharCode(r))}return t.join("")}function writeStringToMemory(e,t,n){var r,i;Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!"),n&&(i=t+lengthBytesUTF8(e),r=HEAP8[i]),stringToUTF8(e,t,1/0),n&&(HEAP8[i]=r)}function writeArrayToMemory(e,t){HEAP8.set(e,t)}function writeAsciiToMemory(e,t,n){for(var r=0;r>0]=e.charCodeAt(r);n||(HEAP8[t>>0]=0)}if(Module.addOnPreRun=addOnPreRun,Module.addOnInit=addOnInit,Module.addOnPreMain=addOnPreMain,Module.addOnExit=addOnExit,Module.addOnPostRun=addOnPostRun,Module.intArrayFromString=intArrayFromString,Module.intArrayToString=intArrayToString,Module.writeStringToMemory=writeStringToMemory,Module.writeArrayToMemory=writeArrayToMemory,Module.writeAsciiToMemory=writeAsciiToMemory,Math.imul&&-5===Math.imul(4294967295,5)||(Math.imul=function(e,t){var n=65535&e,r=65535&t;return n*r+((e>>>16)*r+n*(t>>>16)<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(e){return froundBuffer[0]=e,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(e){e>>>=0;for(var t=0;t<32;t++)if(e&1<<31-t)return t;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(e){return e<0?Math.ceil(e):Math.floor(e)}),Math.trunc=Math.trunc;var Math_abs=Math.abs,Math_cos=Math.cos,Math_sin=Math.sin,Math_tan=Math.tan,Math_acos=Math.acos,Math_asin=Math.asin,Math_atan=Math.atan,Math_atan2=Math.atan2,Math_exp=Math.exp,Math_log=Math.log,Math_sqrt=Math.sqrt,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_pow=Math.pow,Math_imul=Math.imul,Math_fround=Math.fround,Math_round=Math.round,Math_min=Math.min,Math_clz32=Math.clz32,Math_trunc=Math.trunc,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function getUniqueRunDependency(e){return e}function addRunDependency(e){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}function removeRunDependency(e){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),0==runDependencies&&(null!==runDependencyWatcher&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var t=dependenciesFulfilled;dependenciesFulfilled=null,t()}}Module.addRunDependency=addRunDependency,Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(e,t,n,r,i,o,u,a){return _nbind.callbackSignatureList[e].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(e,t,n,r,i,o,u,a){return ASM_CONSTS[e](t,n,r,i,o,u,a)}function _emscripten_asm_const_iiiii(e,t,n,r,i){return ASM_CONSTS[e](t,n,r,i)}function _emscripten_asm_const_iiidddddd(e,t,n,r,i,o,u,a,l){return ASM_CONSTS[e](t,n,r,i,o,u,a,l)}function _emscripten_asm_const_iiididi(e,t,n,r,i,o,u){return ASM_CONSTS[e](t,n,r,i,o,u)}function _emscripten_asm_const_iiii(e,t,n,r){return ASM_CONSTS[e](t,n,r)}function _emscripten_asm_const_iiiid(e,t,n,r,i){return ASM_CONSTS[e](t,n,r,i)}function _emscripten_asm_const_iiiiii(e,t,n,r,i,o){return ASM_CONSTS[e](t,n,r,i,o)}STATIC_BASE=Runtime.GLOBAL_BASE,STATICTOP=STATIC_BASE+12800,__ATINIT__.push({func:function(){__GLOBAL__sub_I_Yoga_cpp()}},{func:function(){__GLOBAL__sub_I_nbind_cc()}},{func:function(){__GLOBAL__sub_I_common_cc()}},{func:function(){__GLOBAL__sub_I_Binding_cc()}}),allocate([0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,192,127,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,128,191,0,0,128,191,0,0,192,127,0,0,0,0,0,0,0,0,0,0,128,63,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,190,12,0,0,200,12,0,0,208,12,0,0,216,12,0,0,230,12,0,0,242,12,0,0,1,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,192,127,3,0,0,0,180,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,182,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,183,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,184,45,0,0,185,45,0,0,181,45,0,0,181,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,148,4,0,0,3,0,0,0,187,45,0,0,164,4,0,0,188,45,0,0,2,0,0,0,189,45,0,0,164,4,0,0,188,45,0,0,185,45,0,0,164,4,0,0,185,45,0,0,164,4,0,0,188,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,183,45,0,0,182,45,0,0,181,45,0,0,190,45,0,0,190,45,0,0,182,45,0,0,182,45,0,0,185,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,185,45,0,0,48,5,0,0,3,0,0,0,56,5,0,0,1,0,0,0,189,45,0,0,185,45,0,0,164,4,0,0,76,5,0,0,2,0,0,0,191,45,0,0,186,45,0,0,182,45,0,0,185,45,0,0,192,45,0,0,185,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,76,5,0,0,76,5,0,0,136,5,0,0,182,45,0,0,181,45,0,0,2,0,0,0,190,45,0,0,136,5,0,0,56,19,0,0,156,5,0,0,2,0,0,0,184,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,204,5,0,0,181,45,0,0,181,45,0,0,2,0,0,0,180,45,0,0,204,5,0,0,2,0,0,0,195,45,0,0,236,5,0,0,97,19,0,0,198,45,0,0,211,45,0,0,212,45,0,0,213,45,0,0,214,45,0,0,215,45,0,0,188,45,0,0,182,45,0,0,216,45,0,0,217,45,0,0,218,45,0,0,219,45,0,0,192,45,0,0,181,45,0,0,0,0,0,0,185,45,0,0,110,19,0,0,186,45,0,0,115,19,0,0,221,45,0,0,120,19,0,0,148,4,0,0,132,19,0,0,96,6,0,0,145,19,0,0,222,45,0,0,164,19,0,0,223,45,0,0,173,19,0,0,0,0,0,0,3,0,0,0,104,6,0,0,1,0,0,0,187,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,11,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,185,45,0,0,224,45,0,0,164,6,0,0,188,45,0,0,172,6,0,0,180,6,0,0,2,0,0,0,188,6,0,0,7,0,0,0,224,45,0,0,7,0,0,0,164,6,0,0,1,0,0,0,213,45,0,0,185,45,0,0,224,45,0,0,172,6,0,0,185,45,0,0,224,45,0,0,164,6,0,0,185,45,0,0,224,45,0,0,211,45,0,0,211,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,172,6,0,0,222,45,0,0,211,45,0,0,224,45,0,0,188,45,0,0,222,45,0,0,211,45,0,0,40,7,0,0,188,45,0,0,2,0,0,0,224,45,0,0,185,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,222,45,0,0,224,45,0,0,148,4,0,0,185,45,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,185,45,0,0,164,6,0,0,148,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,14,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,148,7,0,0,2,0,0,0,225,45,0,0,183,45,0,0,188,45,0,0,168,7,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,234,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,9,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,242,45,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,110,111,100,101,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,119,104,105,99,104,32,115,116,105,108,108,32,104,97,115,32,99,104,105,108,100,114,101,110,32,97,116,116,97,99,104,101,100,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,115,116,105,108,108,32,97,116,116,97,99,104,101,100,32,116,111,32,97,32,112,97,114,101,110,116,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,99,111,110,102,105,103,0,67,97,110,110,111,116,32,115,101,116,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,67,104,105,108,100,32,97,108,114,101,97,100,121,32,104,97,115,32,97,32,112,97,114,101,110,116,44,32,105,116,32,109,117,115,116,32,98,101,32,114,101,109,111,118,101,100,32,102,105,114,115,116,46,0,67,97,110,110,111,116,32,97,100,100,32,99,104,105,108,100,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,79,110,108,121,32,108,101,97,102,32,110,111,100,101,115,32,119,105,116,104,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,115,104,111,117,108,100,32,109,97,110,117,97,108,108,121,32,109,97,114,107,32,116,104,101,109,115,101,108,118,101,115,32,97,115,32,100,105,114,116,121,0,67,97,110,110,111,116,32,103,101,116,32,108,97,121,111,117,116,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,109,117,108,116,105,45,101,100,103,101,32,115,104,111,114,116,104,97,110,100,115,0,37,115,37,100,46,123,91,115,107,105,112,112,101,100,93,32,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,61,62,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,37,115,37,100,46,123,37,115,0,42,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,37,115,10,0,37,115,37,100,46,125,37,115,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,79,117,116,32,111,102,32,99,97,99,104,101,32,101,110,116,114,105,101,115,33,10,0,83,99,97,108,101,32,102,97,99,116,111,114,32,115,104,111,117,108,100,32,110,111,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,122,101,114,111,0,105,110,105,116,105,97,108,0,37,115,10,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,85,78,68,69,70,73,78,69,68,0,69,88,65,67,84,76,89,0,65,84,95,77,79,83,84,0,76,65,89,95,85,78,68,69,70,73,78,69,68,0,76,65,89,95,69,88,65,67,84,76,89,0,76,65,89,95,65,84,95,77,79,83,84,0,97,118,97,105,108,97,98,108,101,87,105,100,116,104,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,119,105,100,116,104,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,97,118,97,105,108,97,98,108,101,72,101,105,103,104,116,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,104,101,105,103,104,116,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,102,108,101,120,0,115,116,114,101,116,99,104,0,109,117,108,116,105,108,105,110,101,45,115,116,114,101,116,99,104,0,69,120,112,101,99,116,101,100,32,110,111,100,101,32,116,111,32,104,97,118,101,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,0,109,101,97,115,117,114,101,0,69,120,112,101,99,116,32,99,117,115,116,111,109,32,98,97,115,101,108,105,110,101,32,102,117,110,99,116,105,111,110,32,116,111,32,110,111,116,32,114,101,116,117,114,110,32,78,97,78,0,97,98,115,45,109,101,97,115,117,114,101,0,97,98,115,45,108,97,121,111,117,116,0,78,111,100,101,0,99,114,101,97,116,101,68,101,102,97,117,108,116,0,99,114,101,97,116,101,87,105,116,104,67,111,110,102,105,103,0,100,101,115,116,114,111,121,0,114,101,115,101,116,0,99,111,112,121,83,116,121,108,101,0,115,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,115,101,116,80,111,115,105,116,105,111,110,0,115,101,116,80,111,115,105,116,105,111,110,80,101,114,99,101,110,116,0,115,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,115,101,116,65,108,105,103,110,73,116,101,109,115,0,115,101,116,65,108,105,103,110,83,101,108,102,0,115,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,115,101,116,70,108,101,120,87,114,97,112,0,115,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,115,101,116,77,97,114,103,105,110,0,115,101,116,77,97,114,103,105,110,80,101,114,99,101,110,116,0,115,101,116,77,97,114,103,105,110,65,117,116,111,0,115,101,116,79,118,101,114,102,108,111,119,0,115,101,116,68,105,115,112,108,97,121,0,115,101,116,70,108,101,120,0,115,101,116,70,108,101,120,66,97,115,105,115,0,115,101,116,70,108,101,120,66,97,115,105,115,80,101,114,99,101,110,116,0,115,101,116,70,108,101,120,71,114,111,119,0,115,101,116,70,108,101,120,83,104,114,105,110,107,0,115,101,116,87,105,100,116,104,0,115,101,116,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,87,105,100,116,104,65,117,116,111,0,115,101,116,72,101,105,103,104,116,0,115,101,116,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,72,101,105,103,104,116,65,117,116,111,0,115,101,116,77,105,110,87,105,100,116,104,0,115,101,116,77,105,110,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,105,110,72,101,105,103,104,116,0,115,101,116,77,105,110,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,77,97,120,87,105,100,116,104,0,115,101,116,77,97,120,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,97,120,72,101,105,103,104,116,0,115,101,116,77,97,120,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,65,115,112,101,99,116,82,97,116,105,111,0,115,101,116,66,111,114,100,101,114,0,115,101,116,80,97,100,100,105,110,103,0,115,101,116,80,97,100,100,105,110,103,80,101,114,99,101,110,116,0,103,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,103,101,116,80,111,115,105,116,105,111,110,0,103,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,103,101,116,65,108,105,103,110,73,116,101,109,115,0,103,101,116,65,108,105,103,110,83,101,108,102,0,103,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,103,101,116,70,108,101,120,87,114,97,112,0,103,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,103,101,116,77,97,114,103,105,110,0,103,101,116,70,108,101,120,66,97,115,105,115,0,103,101,116,70,108,101,120,71,114,111,119,0,103,101,116,70,108,101,120,83,104,114,105,110,107,0,103,101,116,87,105,100,116,104,0,103,101,116,72,101,105,103,104,116,0,103,101,116,77,105,110,87,105,100,116,104,0,103,101,116,77,105,110,72,101,105,103,104,116,0,103,101,116,77,97,120,87,105,100,116,104,0,103,101,116,77,97,120,72,101,105,103,104,116,0,103,101,116,65,115,112,101,99,116,82,97,116,105,111,0,103,101,116,66,111,114,100,101,114,0,103,101,116,79,118,101,114,102,108,111,119,0,103,101,116,68,105,115,112,108,97,121,0,103,101,116,80,97,100,100,105,110,103,0,105,110,115,101,114,116,67,104,105,108,100,0,114,101,109,111,118,101,67,104,105,108,100,0,103,101,116,67,104,105,108,100,67,111,117,110,116,0,103,101,116,80,97,114,101,110,116,0,103,101,116,67,104,105,108,100,0,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,117,110,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,109,97,114,107,68,105,114,116,121,0,105,115,68,105,114,116,121,0,99,97,108,99,117,108,97,116,101,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,76,101,102,116,0,103,101,116,67,111,109,112,117,116,101,100,82,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,84,111,112,0,103,101,116,67,111,109,112,117,116,101,100,66,111,116,116,111,109,0,103,101,116,67,111,109,112,117,116,101,100,87,105,100,116,104,0,103,101,116,67,111,109,112,117,116,101,100,72,101,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,77,97,114,103,105,110,0,103,101,116,67,111,109,112,117,116,101,100,66,111,114,100,101,114,0,103,101,116,67,111,109,112,117,116,101,100,80,97,100,100,105,110,103,0,67,111,110,102,105,103,0,99,114,101,97,116,101,0,115,101,116,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,115,101,116,80,111,105,110,116,83,99,97,108,101,70,97,99,116,111,114,0,105,115,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,86,97,108,117,101,0,76,97,121,111,117,116,0,83,105,122,101,0,103,101,116,73,110,115,116,97,110,99,101,67,111,117,110,116,0,73,110,116,54,52,0,1,1,1,2,2,4,4,4,4,8,8,4,8,118,111,105,100,0,98,111,111,108,0,115,116,100,58,58,115,116,114,105,110,103,0,99,98,70,117,110,99,116,105,111,110,32,38,0,99,111,110,115,116,32,99,98,70,117,110,99,116,105,111,110,32,38,0,69,120,116,101,114,110,97,108,0,66,117,102,102,101,114,0,78,66,105,110,100,73,68,0,78,66,105,110,100,0,98,105,110,100,95,118,97,108,117,101,0,114,101,102,108,101,99,116,0,113,117,101,114,121,84,121,112,101,0,108,97,108,108,111,99,0,108,114,101,115,101,116,0,123,114,101,116,117,114,110,40,95,110,98,105,110,100,46,99,97,108,108,98,97,99,107,83,105,103,110,97,116,117,114,101,76,105,115,116,91,36,48,93,46,97,112,112,108,121,40,116,104,105,115,44,97,114,103,117,109,101,110,116,115,41,41,59,125,0,95,110,98,105,110,100,95,110,101,119,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;function _atexit(e,t){__ATEXIT__.unshift({func:e,arg:t})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}function _abort(){Module.abort()}function __ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj(){Module.printErr("missing function: _ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj"),abort(-1)}function __decorate(e,t,n,r){var i,o=arguments.length,u=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)u=Reflect.decorate(e,t,n,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(u=(o<3?i(u):o>3?i(t,n,u):i(t,n))||u);return o>3&&u&&Object.defineProperty(t,n,u),u}function _defineHidden(e){return function(t,n){Object.defineProperty(t,n,{configurable:!1,enumerable:!1,value:e,writable:!0})}}STATICTOP+=16;var _nbind={};function __nbind_free_external(e){_nbind.externalList[e].dereference(e)}function __nbind_reference_external(e){_nbind.externalList[e].reference()}function _llvm_stackrestore(e){var t=_llvm_stacksave,n=t.LLVM_SAVEDSTACKS[e];t.LLVM_SAVEDSTACKS.splice(e,1),Runtime.stackRestore(n)}function __nbind_register_pool(e,t,n,r){_nbind.Pool.pageSize=e,_nbind.Pool.usedPtr=t/4,_nbind.Pool.rootPtr=n,_nbind.Pool.pagePtr=r/4,HEAP32[t/4]=16909060,1==HEAP8[t]&&(_nbind.bigEndian=!0),HEAP32[t/4]=0,_nbind.makeTypeKindTbl=((i={})[1024]=_nbind.PrimitiveType,i[64]=_nbind.Int64Type,i[2048]=_nbind.BindClass,i[3072]=_nbind.BindClassPtr,i[4096]=_nbind.SharedClassPtr,i[5120]=_nbind.ArrayType,i[6144]=_nbind.ArrayType,i[7168]=_nbind.CStringType,i[9216]=_nbind.CallbackType,i[10240]=_nbind.BindType,i),_nbind.makeTypeNameTbl={Buffer:_nbind.BufferType,External:_nbind.ExternalType,Int64:_nbind.Int64Type,_nbind_new:_nbind.CreateValueType,bool:_nbind.BooleanType,"cbFunction &":_nbind.CallbackType,"const cbFunction &":_nbind.CallbackType,"const std::string &":_nbind.StringType,"std::string":_nbind.StringType},Module.toggleLightGC=_nbind.toggleLightGC,_nbind.callUpcast=Module.dynCall_ii;var i,o=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:""});o.proto=Module,_nbind.BindClass.list.push(o)}function _emscripten_set_main_loop_timing(e,t){if(Browser.mainLoop.timingMode=e,Browser.mainLoop.timingValue=t,!Browser.mainLoop.func)return 1;if(0==e)Browser.mainLoop.scheduler=function(){var e=0|Math.max(0,Browser.mainLoop.tickStartTime+t-_emscripten_get_now());setTimeout(Browser.mainLoop.runner,e)},Browser.mainLoop.method="timeout";else if(1==e)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method="rAF";else if(2==e){if(!window.setImmediate){var n=[];window.addEventListener("message",(function(e){e.source===window&&"setimmediate"===e.data&&(e.stopPropagation(),n.shift()())}),!0),window.setImmediate=function(e){n.push(e),ENVIRONMENT_IS_WORKER?(void 0===Module.setImmediates&&(Module.setImmediates=[]),Module.setImmediates.push(e),window.postMessage({target:"setimmediate"})):window.postMessage("setimmediate","*")}}Browser.mainLoop.scheduler=function(){window.setImmediate(Browser.mainLoop.runner)},Browser.mainLoop.method="immediate"}return 0}function _emscripten_get_now(){abort()}function _emscripten_set_main_loop(e,t,n,r,i){var o;Module.noExitRuntime=!0,assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters."),Browser.mainLoop.func=e,Browser.mainLoop.arg=r,o=void 0!==r?function(){Module.dynCall_vi(e,r)}:function(){Module.dynCall_v(e)};var u=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT)if(Browser.mainLoop.queue.length>0){var e=Date.now(),t=Browser.mainLoop.queue.shift();if(t.func(t.arg),Browser.mainLoop.remainingBlockers){var n=Browser.mainLoop.remainingBlockers,r=n%1==0?n-1:Math.floor(n);t.counted?Browser.mainLoop.remainingBlockers=r:(r+=.5,Browser.mainLoop.remainingBlockers=(8*n+r)/9)}if(console.log('main loop blocker "'+t.name+'" took '+(Date.now()-e)+" ms"),Browser.mainLoop.updateStatus(),u1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0?Browser.mainLoop.scheduler():(0==Browser.mainLoop.timingMode&&(Browser.mainLoop.tickStartTime=_emscripten_get_now()),"timeout"===Browser.mainLoop.method&&Module.ctx&&(Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!"),Browser.mainLoop.method=""),Browser.mainLoop.runIter(o),u0?_emscripten_set_main_loop_timing(0,1e3/t):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),n)throw"SimulateInfiniteLoop"}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null,Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var e=Browser.mainLoop.timingMode,t=Browser.mainLoop.timingValue,n=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(n,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(e,t),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var e=Module.statusMessage||"Please wait...",t=Browser.mainLoop.remainingBlockers,n=Browser.mainLoop.expectedBlockers;t?t=6;){var u=r>>i-6&63;i-=6,n+=t[u]}return 2==i?(n+=t[(3&r)<<4],n+="=="):4==i&&(n+=t[(15&r)<<2],n+="="),n}(e),o(s))},s.src=l,Browser.safeSetTimeout((function(){o(s)}),1e4)}};Module.preloadPlugins.push(t);var n=Module.canvas;n&&(n.requestPointerLock=n.requestPointerLock||n.mozRequestPointerLock||n.webkitRequestPointerLock||n.msRequestPointerLock||function(){},n.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},n.exitPointerLock=n.exitPointerLock.bind(document),document.addEventListener("pointerlockchange",r,!1),document.addEventListener("mozpointerlockchange",r,!1),document.addEventListener("webkitpointerlockchange",r,!1),document.addEventListener("mspointerlockchange",r,!1),Module.elementPointerLock&&n.addEventListener("click",(function(e){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),e.preventDefault())}),!1))}function r(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}},createContext:function(e,t,n,r){if(t&&Module.ctx&&e==Module.canvas)return Module.ctx;var i,o;if(t){var u={antialias:!1,alpha:!1};if(r)for(var a in r)u[a]=r[a];(o=GL.createContext(e,u))&&(i=GL.getContext(o).GLctx)}else i=e.getContext("2d");return i?(n&&(t||assert("undefined"==typeof GLctx,"cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),Module.ctx=i,t&&GL.makeContextCurrent(o),Module.useWebGL=t,Browser.moduleContextCreatedCallbacks.forEach((function(e){e()})),Browser.init()),i):null},destroyContext:function(e,t,n){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(e,t,n){Browser.lockPointer=e,Browser.resizeCanvas=t,Browser.vrDevice=n,void 0===Browser.lockPointer&&(Browser.lockPointer=!0),void 0===Browser.resizeCanvas&&(Browser.resizeCanvas=!1),void 0===Browser.vrDevice&&(Browser.vrDevice=null);var r=Module.canvas;function i(){Browser.isFullscreen=!1;var e=r.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===e?(r.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},r.exitFullscreen=r.exitFullscreen.bind(document),Browser.lockPointer&&r.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(e.parentNode.insertBefore(r,e),e.parentNode.removeChild(e),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(r)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener("fullscreenchange",i,!1),document.addEventListener("mozfullscreenchange",i,!1),document.addEventListener("webkitfullscreenchange",i,!1),document.addEventListener("MSFullscreenChange",i,!1));var o=document.createElement("div");r.parentNode.insertBefore(o,r),o.appendChild(r),o.requestFullscreen=o.requestFullscreen||o.mozRequestFullScreen||o.msRequestFullscreen||(o.webkitRequestFullscreen?function(){o.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(o.webkitRequestFullScreen?function(){o.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),n?o.requestFullscreen({vrDisplay:n}):o.requestFullscreen()},requestFullScreen:function(e,t,n){return Module.printErr("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead."),Browser.requestFullScreen=function(e,t,n){return Browser.requestFullscreen(e,t,n)},Browser.requestFullscreen(e,t,n)},nextRAF:0,fakeRequestAnimationFrame:function(e){var t=Date.now();if(0===Browser.nextRAF)Browser.nextRAF=t+1e3/60;else for(;t+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var n=Math.max(Browser.nextRAF-t,0);setTimeout(e,n)},requestAnimationFrame:function(e){"undefined"==typeof window?Browser.fakeRequestAnimationFrame(e):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(e))},safeCallback:function(e){return function(){if(!ABORT)return e.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var e=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],e.forEach((function(e){e()}))}},safeRequestAnimationFrame:function(e){return Browser.requestAnimationFrame((function(){ABORT||(Browser.allowAsyncCallbacks?e():Browser.queuedAsyncCallbacks.push(e))}))},safeSetTimeout:function(e,t){return Module.noExitRuntime=!0,setTimeout((function(){ABORT||(Browser.allowAsyncCallbacks?e():Browser.queuedAsyncCallbacks.push(e))}),t)},safeSetInterval:function(e,t){return Module.noExitRuntime=!0,setInterval((function(){ABORT||Browser.allowAsyncCallbacks&&e()}),t)},getMimetype:function(e){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[e.substr(e.lastIndexOf(".")+1)]},getUserMedia:function(e){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(e)},getMovementX:function(e){return e.movementX||e.mozMovementX||e.webkitMovementX||0},getMovementY:function(e){return e.movementY||e.mozMovementY||e.webkitMovementY||0},getMouseWheelDelta:function(e){var t=0;switch(e.type){case"DOMMouseScroll":t=e.detail;break;case"mousewheel":t=e.wheelDelta;break;case"wheel":t=e.deltaY;break;default:throw"unrecognized mouse wheel event: "+e.type}return t},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(e){if(Browser.pointerLock)"mousemove"!=e.type&&"mozMovementX"in e?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(e),Browser.mouseMovementY=Browser.getMovementY(e)),"undefined"!=typeof SDL?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var t=Module.canvas.getBoundingClientRect(),n=Module.canvas.width,r=Module.canvas.height,i=void 0!==window.scrollX?window.scrollX:window.pageXOffset,o=void 0!==window.scrollY?window.scrollY:window.pageYOffset;if("touchstart"===e.type||"touchend"===e.type||"touchmove"===e.type){var u=e.touch;if(void 0===u)return;var a=u.pageX-(i+t.left),l=u.pageY-(o+t.top),s={x:a*=n/t.width,y:l*=r/t.height};if("touchstart"===e.type)Browser.lastTouches[u.identifier]=s,Browser.touches[u.identifier]=s;else if("touchend"===e.type||"touchmove"===e.type){var c=Browser.touches[u.identifier];c||(c=s),Browser.lastTouches[u.identifier]=c,Browser.touches[u.identifier]=s}return}var f=e.pageX-(i+t.left),d=e.pageY-(o+t.top);f*=n/t.width,d*=r/t.height,Browser.mouseMovementX=f-Browser.mouseX,Browser.mouseMovementY=d-Browser.mouseY,Browser.mouseX=f,Browser.mouseY=d}},asyncLoad:function(e,t,n,r){var i=r?"":getUniqueRunDependency("al "+e);Module.readAsync(e,(function(n){assert(n,'Loading data file "'+e+'" failed (no arrayBuffer).'),t(new Uint8Array(n)),i&&removeRunDependency(i)}),(function(t){if(!n)throw'Loading data file "'+e+'" failed.';n()})),i&&addRunDependency(i)},resizeListeners:[],updateResizeListeners:function(){var e=Module.canvas;Browser.resizeListeners.forEach((function(t){t(e.width,e.height)}))},setCanvasSize:function(e,t,n){var r=Module.canvas;Browser.updateCanvasDimensions(r,e,t),n||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if("undefined"!=typeof SDL){var e=HEAPU32[SDL.screen+0*Runtime.QUANTUM_SIZE>>2];e|=8388608,HEAP32[SDL.screen+0*Runtime.QUANTUM_SIZE>>2]=e}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if("undefined"!=typeof SDL){var e=HEAPU32[SDL.screen+0*Runtime.QUANTUM_SIZE>>2];e&=-8388609,HEAP32[SDL.screen+0*Runtime.QUANTUM_SIZE>>2]=e}Browser.updateResizeListeners()},updateCanvasDimensions:function(e,t,n){t&&n?(e.widthNative=t,e.heightNative=n):(t=e.widthNative,n=e.heightNative);var r=t,i=n;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(r/i>2]},getStr:function(){return Pointer_stringify(SYSCALLS.get())},get64:function(){var e=SYSCALLS.get(),t=SYSCALLS.get();return assert(e>=0?0===t:-1===t),e},getZero:function(){assert(0===SYSCALLS.get())}};function ___syscall6(e,t){SYSCALLS.varargs=t;try{var n=SYSCALLS.getStreamFromFD();return FS.close(n),0}catch(e){return"undefined"!=typeof FS&&e instanceof FS.ErrnoError||abort(e),-e.errno}}function ___syscall54(e,t){SYSCALLS.varargs=t;try{return 0}catch(e){return"undefined"!=typeof FS&&e instanceof FS.ErrnoError||abort(e),-e.errno}}function _typeModule(e){var t=[[0,1,"X"],[1,1,"const X"],[128,1,"X *"],[256,1,"X &"],[384,1,"X &&"],[512,1,"std::shared_ptr"],[640,1,"std::unique_ptr"],[5120,1,"std::vector"],[6144,2,"std::array"],[9216,-1,"std::function"]];function n(e,t,n,r,i,o){if(1==t){var u=896&r;128!=u&&256!=u&&384!=u||(e="X const")}return(o?n.replace("X",e).replace("Y",i):e.replace("X",n).replace("Y",i)).replace(/([*&]) (?=[*&])/g,"$1")}function r(e,t){var n=t.flags,r=896&n,i=15360&n;return t.name||1024!=i||(1==t.ptrSize?t.name=(16&n?"":(8&n?"un":"")+"signed ")+"char":t.name=(8&n?"u":"")+(32&n?"float":"int")+8*t.ptrSize+"_t"),8!=t.ptrSize||32&n||(i=64),2048==i&&(512==r||640==r?i=4096:r&&(i=3072)),e(i,t)}var i={Type:function(){function e(e){this.id=e.id,this.name=e.name,this.flags=e.flags,this.spec=e}return e.prototype.toString=function(){return this.name},e}(),getComplexType:function e(i,o,u,a,l,s,c,f){void 0===s&&(s="X"),void 0===f&&(f=1);var d=u(i);if(d)return d;var p,h=a(i),v=h.placeholderFlag,m=t[v];c&&m&&(s=n(c[2],c[0],s,m[0],"?",!0)),0==v&&(p="Unbound"),v>=10&&(p="Corrupt"),f>20&&(p="Deeply nested"),p&&function(e,t,n,r,i){throw new Error(e+" type "+n.replace("X",t+"?")+(r?" with flag "+r:"")+" in "+i)}(p,i,s,v,l||"?");var g,y=e(h.paramList[0],o,u,a,l,s,m,f+1),_={flags:m[0],id:i,name:"",paramList:[y]},b=[],w="?";switch(h.placeholderFlag){case 1:g=y.spec;break;case 2:if(1024==(15360&y.flags)&&1==y.spec.ptrSize){_.flags=7168;break}case 3:case 6:case 5:g=y.spec,y.flags;break;case 8:w=""+h.paramList[1],_.paramList.push(h.paramList[1]);break;case 9:for(var E=0,D=h.paramList[1];E>2]=e),e}function _llvm_stacksave(){var e=_llvm_stacksave;return e.LLVM_SAVEDSTACKS||(e.LLVM_SAVEDSTACKS=[]),e.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),e.LLVM_SAVEDSTACKS.length-1}function ___syscall140(e,t){SYSCALLS.varargs=t;try{var n=SYSCALLS.getStreamFromFD(),r=(SYSCALLS.get(),SYSCALLS.get()),i=SYSCALLS.get(),o=SYSCALLS.get(),u=r;return FS.llseek(n,u,o),HEAP32[i>>2]=n.position,n.getdents&&0===u&&0===o&&(n.getdents=null),0}catch(e){return"undefined"!=typeof FS&&e instanceof FS.ErrnoError||abort(e),-e.errno}}function ___syscall146(e,t){SYSCALLS.varargs=t;try{var n=SYSCALLS.get(),r=SYSCALLS.get(),i=SYSCALLS.get(),o=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(e,t){var n=___syscall146.buffers[e];assert(n),0===t||10===t?((1===e?Module.print:Module.printErr)(UTF8ArrayToString(n,0)),n.length=0):n.push(t)});for(var u=0;u>2],l=HEAP32[r+(8*u+4)>>2],s=0;se.pageSize/2||t>e.pageSize-n?_nbind.typeNameTbl.NBind.proto.lalloc(t):(HEAPU32[e.usedPtr]=n+t,e.rootPtr+n)},e.lreset=function(t,n){HEAPU32[e.pagePtr]?_nbind.typeNameTbl.NBind.proto.lreset(t,n):HEAPU32[e.usedPtr]=t},e}();function constructType(e,t){var n=new(10240==e?_nbind.makeTypeNameTbl[t.name]||_nbind.BindType:_nbind.makeTypeKindTbl[e])(t);return typeIdTbl[t.id]=n,_nbind.typeNameTbl[t.name]=n,n}function getType(e){return typeIdTbl[e]}function queryType(e){var t=HEAPU8[e],n=_nbind.structureList[t][1];e/=4,n<0&&(++e,n=HEAPU32[e]+1);var r=Array.prototype.slice.call(HEAPU32.subarray(e+1,e+1+n));return 9==t&&(r=[r[0],r.slice(1)]),{paramList:r,placeholderFlag:t}}function getTypes(e,t){return e.map((function(e){return"number"==typeof e?_nbind.getComplexType(e,constructType,getType,queryType,t):_nbind.typeNameTbl[e]}))}function readTypeIdList(e,t){return Array.prototype.slice.call(HEAPU32,e/4,e/4+t)}function readAsciiString(e){for(var t=e;HEAPU8[t++];);return String.fromCharCode.apply("",HEAPU8.subarray(e,t-1))}function readPolicyList(e){var t={};if(e)for(;;){var n=HEAPU32[e/4];if(!n)break;t[readAsciiString(n)]=!0,e+=4}return t}function getDynCall(e,t){var n={float32_t:"d",float64_t:"d",int64_t:"d",uint64_t:"d",void:"v"},r=e.map((function(e){return n[e.name]||"i"})).join(""),i=Module["dynCall_"+r];if(!i)throw new Error("dynCall_"+r+" not found for "+t+"("+e.map((function(e){return e.name})).join(", ")+")");return i}function addMethod(e,t,n,r){var i=e[t];e.hasOwnProperty(t)&&i?((i.arity||0===i.arity)&&(i=_nbind.makeOverloader(i,i.arity),e[t]=i),i.addMethod(n,r)):(n.arity=r,e[t]=n)}function throwError(e){throw new Error(e)}_nbind.Pool=Pool,_nbind.constructType=constructType,_nbind.getType=getType,_nbind.queryType=queryType,_nbind.getTypes=getTypes,_nbind.readTypeIdList=readTypeIdList,_nbind.readAsciiString=readAsciiString,_nbind.readPolicyList=readPolicyList,_nbind.getDynCall=getDynCall,_nbind.addMethod=addMethod,_nbind.throwError=throwError,_nbind.bigEndian=!1,_a=_typeModule(_typeModule),_nbind.Type=_a.Type,_nbind.makeType=_a.makeType,_nbind.getComplexType=_a.getComplexType,_nbind.structureList=_a.structureList;var BindType=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.heap=HEAPU32,t.ptrSize=4,t}return __extends(t,e),t.prototype.needsWireRead=function(e){return!!this.wireRead||!!this.makeWireRead},t.prototype.needsWireWrite=function(e){return!!this.wireWrite||!!this.makeWireWrite},t}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(e){function t(t){var n=e.call(this,t)||this,r=32&t.flags?{32:HEAPF32,64:HEAPF64}:8&t.flags?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return n.heap=r[8*t.ptrSize],n.ptrSize=t.ptrSize,n}return __extends(t,e),t.prototype.needsWireWrite=function(e){return!!e&&!!e.Strict},t.prototype.makeWireWrite=function(e,t){return t&&t.Strict&&function(e){if("number"==typeof e)return e;throw new Error("Type mismatch")}},t}(BindType);function pushCString(e,t){if(null==e){if(t&&t.Nullable)return 0;throw new Error("Type mismatch")}if(t&&t.Strict){if("string"!=typeof e)throw new Error("Type mismatch")}else e=e.toString();var n=Module.lengthBytesUTF8(e)+1,r=_nbind.Pool.lalloc(n);return Module.stringToUTF8Array(e,HEAPU8,r,n),r}function popCString(e){return 0===e?null:Module.Pointer_stringify(e)}_nbind.PrimitiveType=PrimitiveType,_nbind.pushCString=pushCString,_nbind.popCString=popCString;var CStringType=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.wireRead=popCString,t.wireWrite=pushCString,t.readResources=[_nbind.resources.pool],t.writeResources=[_nbind.resources.pool],t}return __extends(t,e),t.prototype.makeWireWrite=function(e,t){return function(e){return pushCString(e,t)}},t}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.wireRead=function(e){return!!e},t}return __extends(t,e),t.prototype.needsWireWrite=function(e){return!!e&&!!e.Strict},t.prototype.makeWireRead=function(e){return"!!("+e+")"},t.prototype.makeWireWrite=function(e,t){return t&&t.Strict&&function(e){if("boolean"==typeof e)return e;throw new Error("Type mismatch")}||e},t}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function e(){}return e.prototype.persist=function(){this.__nbindState|=1},e}();function makeBound(e,t){var n=function(e){function n(t,r,i,o){var u=e.call(this)||this;if(!(u instanceof n))return new(Function.prototype.bind.apply(n,Array.prototype.concat.apply([null],arguments)));var a=r,l=i,s=o;if(t!==_nbind.ptrMarker){var c=u.__nbindConstructor.apply(u,arguments);a=4608,s=HEAPU32[c/4],l=HEAPU32[c/4+1]}var f={configurable:!0,enumerable:!1,value:null,writable:!1},d={__nbindFlags:a,__nbindPtr:l};s&&(d.__nbindShared=s,_nbind.mark(u));for(var p=0,h=Object.keys(d);p>=1;var n=_nbind.valueList[e];return _nbind.valueList[e]=firstFreeValue,firstFreeValue=e,n}if(t)return _nbind.popShared(e,t);throw new Error("Invalid value slot "+e)}_nbind.pushValue=pushValue,_nbind.popValue=popValue;var valueBase=0x10000000000000000;function push64(e){return"number"==typeof e?e:4096*pushValue(e)+valueBase}function pop64(e){return e=3?Buffer.from(o):new Buffer(o)).copy(r):getBuffer(r).set(o)}}_nbind.BufferType=BufferType,_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var e=0,t=dirtyList;e>2]=DYNAMIC_BASE,staticSealed=!0,Module.asmGlobalArg={Math,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Float32Array,Float64Array,NaN:NaN,Infinity:1/0},Module.asmLibraryArg={abort,assert,enlargeMemory,getTotalMemory,abortOnCannotGrowMemory,invoke_viiiii,invoke_vif,invoke_vid,invoke_fiff,invoke_vi,invoke_vii,invoke_ii,invoke_viddi,invoke_vidd,invoke_iiii,invoke_diii,invoke_di,invoke_iid,invoke_iii,invoke_viiddi,invoke_viiiiii,invoke_dii,invoke_i,invoke_iiiiii,invoke_viiid,invoke_viififi,invoke_viii,invoke_v,invoke_viid,invoke_idd,invoke_viiii,_emscripten_asm_const_iiiii,_emscripten_asm_const_iiidddddd,_emscripten_asm_const_iiiid,__nbind_reference_external,_emscripten_asm_const_iiiiiiii,_removeAccessorPrefix,_typeModule,__nbind_register_pool,__decorate,_llvm_stackrestore,___cxa_atexit,__extends,__nbind_get_value_object,__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,_emscripten_set_main_loop_timing,__nbind_register_primitive,__nbind_register_type,_emscripten_memcpy_big,__nbind_register_function,___setErrNo,__nbind_register_class,__nbind_finish,_abort,_nbind_value,_llvm_stacksave,___syscall54,_defineHidden,_emscripten_set_main_loop,_emscripten_get_now,__nbind_register_callback_signature,_emscripten_asm_const_iiiiii,__nbind_free_external,_emscripten_asm_const_iiii,_emscripten_asm_const_iiididi,___syscall6,_atexit,___syscall140,___syscall146,DYNAMICTOP_PTR,tempDoublePtr,ABORT,STACKTOP,STACK_MAX,cttz_i8,___dso_handle};var asm=function(e,t,n){"use asm";var r=new e.Int8Array(n);var i=new e.Int16Array(n);var o=new e.Int32Array(n);var u=new e.Uint8Array(n);var a=new e.Uint16Array(n);var l=new e.Uint32Array(n);var s=new e.Float32Array(n);var c=new e.Float64Array(n);var f=t.DYNAMICTOP_PTR|0;var d=t.tempDoublePtr|0;var p=t.ABORT|0;var h=t.STACKTOP|0;var v=t.STACK_MAX|0;var m=t.cttz_i8|0;var g=t.___dso_handle|0;var y=0;var _=0;var b=0;var w=0;var E=e.NaN,D=e.Infinity;var S=0,C=0,k=0,T=0,x=0.0;var A=0;var O=e.Math.floor;var P=e.Math.abs;var I=e.Math.sqrt;var N=e.Math.pow;var M=e.Math.cos;var R=e.Math.sin;var F=e.Math.tan;var L=e.Math.acos;var B=e.Math.asin;var j=e.Math.atan;var U=e.Math.atan2;var z=e.Math.exp;var W=e.Math.log;var H=e.Math.ceil;var V=e.Math.imul;var q=e.Math.min;var G=e.Math.max;var $=e.Math.clz32;var Y=e.Math.fround;var K=t.abort;var X=t.assert;var Q=t.enlargeMemory;var J=t.getTotalMemory;var Z=t.abortOnCannotGrowMemory;var ee=t.invoke_viiiii;var te=t.invoke_vif;var ne=t.invoke_vid;var re=t.invoke_fiff;var ie=t.invoke_vi;var oe=t.invoke_vii;var ue=t.invoke_ii;var ae=t.invoke_viddi;var le=t.invoke_vidd;var se=t.invoke_iiii;var ce=t.invoke_diii;var fe=t.invoke_di;var de=t.invoke_iid;var pe=t.invoke_iii;var he=t.invoke_viiddi;var ve=t.invoke_viiiiii;var me=t.invoke_dii;var ge=t.invoke_i;var ye=t.invoke_iiiiii;var _e=t.invoke_viiid;var be=t.invoke_viififi;var we=t.invoke_viii;var Ee=t.invoke_v;var De=t.invoke_viid;var Se=t.invoke_idd;var Ce=t.invoke_viiii;var ke=t._emscripten_asm_const_iiiii;var Te=t._emscripten_asm_const_iiidddddd;var xe=t._emscripten_asm_const_iiiid;var Ae=t.__nbind_reference_external;var Oe=t._emscripten_asm_const_iiiiiiii;var Pe=t._removeAccessorPrefix;var Ie=t._typeModule;var Ne=t.__nbind_register_pool;var Me=t.__decorate;var Re=t._llvm_stackrestore;var Fe=t.___cxa_atexit;var Le=t.__extends;var Be=t.__nbind_get_value_object;var je=t.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj;var Ue=t._emscripten_set_main_loop_timing;var ze=t.__nbind_register_primitive;var We=t.__nbind_register_type;var He=t._emscripten_memcpy_big;var Ve=t.__nbind_register_function;var qe=t.___setErrNo;var Ge=t.__nbind_register_class;var $e=t.__nbind_finish;var Ye=t._abort;var Ke=t._nbind_value;var Xe=t._llvm_stacksave;var Qe=t.___syscall54;var Je=t._defineHidden;var Ze=t._emscripten_set_main_loop;var et=t._emscripten_get_now;var tt=t.__nbind_register_callback_signature;var nt=t._emscripten_asm_const_iiiiii;var rt=t.__nbind_free_external;var it=t._emscripten_asm_const_iiii;var ot=t._emscripten_asm_const_iiididi;var ut=t.___syscall6;var at=t._atexit;var lt=t.___syscall140;var st=t.___syscall146;var ct=Y(0);const ft=Y(0);function dt(e){e=e|0;var t=0;t=h;h=h+e|0;h=h+15&-16;return t|0}function pt(){return h|0}function ht(e){e=e|0;h=e}function vt(e,t){e=e|0;t=t|0;h=e;v=t}function mt(e,t){e=e|0;t=t|0;if(!y){y=e;_=t}}function gt(e){e=e|0;A=e}function yt(){return A|0}function _t(){var e=0,t=0;ix(8104,8,400)|0;ix(8504,408,540)|0;e=9044;t=e+44|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));r[9088]=0;r[9089]=1;o[2273]=0;o[2274]=948;o[2275]=948;Fe(17,8104,g|0)|0;return}function bt(e){e=e|0;qt(e+948|0);return}function wt(e){e=Y(e);return((Ii(e)|0)&2147483647)>>>0>2139095040|0}function Et(e,t,n){e=e|0;t=t|0;n=n|0;e:do{if(!(o[e+(t<<3)+4>>2]|0)){if((t|2|0)==3?o[e+60>>2]|0:0){e=e+56|0;break}switch(t|0){case 0:case 2:case 4:case 5:{if(o[e+52>>2]|0){e=e+48|0;break e}break}default:{}}if(!(o[e+68>>2]|0)){e=(t|1|0)==5?948:n;break}else{e=e+64|0;break}}else e=e+(t<<3)|0}while(0);return e|0}function Dt(e){e=e|0;var t=0;t=qk(1e3)|0;St(e,(t|0)!=0,2456);o[2276]=(o[2276]|0)+1;ix(t|0,8104,1e3)|0;if(r[e+2>>0]|0){o[t+4>>2]=2;o[t+12>>2]=4}o[t+976>>2]=e;return t|0}function St(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0;i=h;h=h+16|0;r=i;if(!t){o[r>>2]=n;Lr(e,5,3197,r)}h=i;return}function Ct(){return Dt(956)|0}function kt(e){e=e|0;var t=0;t=$T(1e3)|0;Tt(t,e);St(o[e+976>>2]|0,1,2456);o[2276]=(o[2276]|0)+1;o[t+944>>2]=0;return t|0}function Tt(e,t){e=e|0;t=t|0;var n=0;ix(e|0,t|0,948)|0;Ur(e+948|0,t+948|0);n=e+960|0;e=t+960|0;t=n+40|0;do{o[n>>2]=o[e>>2];n=n+4|0;e=e+4|0}while((n|0)<(t|0));return}function xt(e){e=e|0;var t=0,n=0,r=0,i=0;t=e+944|0;n=o[t>>2]|0;if(n|0){At(n+948|0,e)|0;o[t>>2]=0}n=Ot(e)|0;if(n|0){t=0;do{o[(Pt(e,t)|0)+944>>2]=0;t=t+1|0}while((t|0)!=(n|0))}n=e+948|0;r=o[n>>2]|0;i=e+952|0;t=o[i>>2]|0;if((t|0)!=(r|0))o[i>>2]=t+(~((t+-4-r|0)>>>2)<<2);It(n);Gk(e);o[2276]=(o[2276]|0)+-1;return}function At(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0;r=o[e>>2]|0;l=e+4|0;n=o[l>>2]|0;u=n;e:do{if((r|0)==(n|0)){i=r;a=4}else{e=r;while(1){if((o[e>>2]|0)==(t|0)){i=e;a=4;break e}e=e+4|0;if((e|0)==(n|0)){e=0;break}}}}while(0);if((a|0)==4)if((i|0)!=(n|0)){r=i+4|0;e=u-r|0;t=e>>2;if(t){sx(i|0,r|0,e|0)|0;n=o[l>>2]|0}e=i+(t<<2)|0;if((n|0)==(e|0))e=1;else{o[l>>2]=n+(~((n+-4-e|0)>>>2)<<2);e=1}}else e=0;return e|0}function Ot(e){e=e|0;return(o[e+952>>2]|0)-(o[e+948>>2]|0)>>2|0}function Pt(e,t){e=e|0;t=t|0;var n=0;n=o[e+948>>2]|0;if((o[e+952>>2]|0)-n>>2>>>0>t>>>0)e=o[n+(t<<2)>>2]|0;else e=0;return e|0}function It(e){e=e|0;var t=0,n=0,r=0,i=0;r=h;h=h+32|0;t=r;i=o[e>>2]|0;n=(o[e+4>>2]|0)-i|0;if(((o[e+8>>2]|0)-i|0)>>>0>n>>>0){i=n>>2;Ni(t,i,i,e+8|0);Mi(e,t);Ri(t)}h=r;return}function Nt(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0;c=Ot(e)|0;do{if(c|0){if((o[(Pt(e,0)|0)+944>>2]|0)==(e|0)){if(!(At(e+948|0,t)|0))break;ix(t+400|0,8504,540)|0;o[t+944>>2]=0;Vt(e);break}a=o[(o[e+976>>2]|0)+12>>2]|0;l=e+948|0;s=(a|0)==0;n=0;u=0;do{r=o[(o[l>>2]|0)+(u<<2)>>2]|0;if((r|0)==(t|0))Vt(e);else{i=kt(r)|0;o[(o[l>>2]|0)+(n<<2)>>2]=i;o[i+944>>2]=e;if(!s)RA[a&15](r,i,e,n);n=n+1|0}u=u+1|0}while((u|0)!=(c|0));if(n>>>0>>0){s=e+948|0;l=e+952|0;a=n;n=o[l>>2]|0;do{u=(o[s>>2]|0)+(a<<2)|0;r=u+4|0;i=n-r|0;t=i>>2;if(!t)i=n;else{sx(u|0,r|0,i|0)|0;n=o[l>>2]|0;i=n}r=u+(t<<2)|0;if((i|0)!=(r|0)){n=i+(~((i+-4-r|0)>>>2)<<2)|0;o[l>>2]=n}a=a+1|0}while((a|0)!=(c|0))}}}while(0);return}function Mt(e){e=e|0;var t=0,n=0,i=0,u=0;Rt(e,(Ot(e)|0)==0,2491);Rt(e,(o[e+944>>2]|0)==0,2545);t=e+948|0;n=o[t>>2]|0;i=e+952|0;u=o[i>>2]|0;if((u|0)!=(n|0))o[i>>2]=u+(~((u+-4-n|0)>>>2)<<2);It(t);t=e+976|0;n=o[t>>2]|0;ix(e|0,8104,1e3)|0;if(r[n+2>>0]|0){o[e+4>>2]=2;o[e+12>>2]=4}o[t>>2]=n;return}function Rt(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0;i=h;h=h+16|0;r=i;if(!t){o[r>>2]=n;Cr(e,5,3197,r)}h=i;return}function Ft(){return o[2276]|0}function Lt(){var e=0;e=qk(20)|0;Bt((e|0)!=0,2592);o[2277]=(o[2277]|0)+1;o[e>>2]=o[239];o[e+4>>2]=o[240];o[e+8>>2]=o[241];o[e+12>>2]=o[242];o[e+16>>2]=o[243];return e|0}function Bt(e,t){e=e|0;t=t|0;var n=0,r=0;r=h;h=h+16|0;n=r;if(!e){o[n>>2]=t;Cr(0,5,3197,n)}h=r;return}function jt(e){e=e|0;Gk(e);o[2277]=(o[2277]|0)+-1;return}function Ut(e,t){e=e|0;t=t|0;var n=0;if(!t){n=0;t=0}else{Rt(e,(Ot(e)|0)==0,2629);n=1}o[e+964>>2]=t;o[e+988>>2]=n;return}function zt(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;u=r+8|0;i=r+4|0;a=r;o[i>>2]=t;Rt(e,(o[t+944>>2]|0)==0,2709);Rt(e,(o[e+964>>2]|0)==0,2763);Wt(e);t=e+948|0;o[a>>2]=(o[t>>2]|0)+(n<<2);o[u>>2]=o[a>>2];Ht(t,u,i)|0;o[(o[i>>2]|0)+944>>2]=e;Vt(e);h=r;return}function Wt(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0;n=Ot(e)|0;if(n|0?(o[(Pt(e,0)|0)+944>>2]|0)!=(e|0):0){r=o[(o[e+976>>2]|0)+12>>2]|0;i=e+948|0;u=(r|0)==0;t=0;do{a=o[(o[i>>2]|0)+(t<<2)>>2]|0;l=kt(a)|0;o[(o[i>>2]|0)+(t<<2)>>2]=l;o[l+944>>2]=e;if(!u)RA[r&15](a,l,e,t);t=t+1|0}while((t|0)!=(n|0))}return}function Ht(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0,y=0,_=0;y=h;h=h+64|0;d=y+52|0;l=y+48|0;p=y+28|0;v=y+24|0;m=y+20|0;g=y;r=o[e>>2]|0;u=r;t=r+((o[t>>2]|0)-u>>2<<2)|0;r=e+4|0;i=o[r>>2]|0;a=e+8|0;do{if(i>>>0<(o[a>>2]|0)>>>0){if((t|0)==(i|0)){o[t>>2]=o[n>>2];o[r>>2]=(o[r>>2]|0)+4;break}Fi(e,t,i,t+4|0);if(t>>>0<=n>>>0)n=(o[r>>2]|0)>>>0>n>>>0?n+4|0:n;o[t>>2]=o[n>>2]}else{r=(i-u>>2)+1|0;i=Hr(e)|0;if(i>>>0>>0)UT(e);f=o[e>>2]|0;c=(o[a>>2]|0)-f|0;u=c>>1;Ni(g,c>>2>>>0>>1>>>0?u>>>0>>0?r:u:i,t-f>>2,e+8|0);f=g+8|0;r=o[f>>2]|0;u=g+12|0;c=o[u>>2]|0;a=c;s=r;do{if((r|0)==(c|0)){c=g+4|0;r=o[c>>2]|0;_=o[g>>2]|0;i=_;if(r>>>0<=_>>>0){r=a-i>>1;r=(r|0)==0?1:r;Ni(p,r,r>>>2,o[g+16>>2]|0);o[v>>2]=o[c>>2];o[m>>2]=o[f>>2];o[l>>2]=o[v>>2];o[d>>2]=o[m>>2];Bi(p,l,d);r=o[g>>2]|0;o[g>>2]=o[p>>2];o[p>>2]=r;r=p+4|0;_=o[c>>2]|0;o[c>>2]=o[r>>2];o[r>>2]=_;r=p+8|0;_=o[f>>2]|0;o[f>>2]=o[r>>2];o[r>>2]=_;r=p+12|0;_=o[u>>2]|0;o[u>>2]=o[r>>2];o[r>>2]=_;Ri(p);r=o[f>>2]|0;break}u=r;a=((u-i>>2)+1|0)/-2|0;l=r+(a<<2)|0;i=s-u|0;u=i>>2;if(u){sx(l|0,r|0,i|0)|0;r=o[c>>2]|0}_=l+(u<<2)|0;o[f>>2]=_;o[c>>2]=r+(a<<2);r=_}}while(0);o[r>>2]=o[n>>2];o[f>>2]=(o[f>>2]|0)+4;t=Li(e,g,t)|0;Ri(g)}}while(0);h=y;return t|0}function Vt(e){e=e|0;var t=0;do{t=e+984|0;if(r[t>>0]|0)break;r[t>>0]=1;s[e+504>>2]=Y(E);e=o[e+944>>2]|0}while((e|0)!=0);return}function qt(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-4-r|0)>>>2)<<2);KT(n)}return}function Gt(e){e=e|0;return o[e+944>>2]|0}function $t(e){e=e|0;Rt(e,(o[e+964>>2]|0)!=0,2832);Vt(e);return}function Yt(e){e=e|0;return(r[e+984>>0]|0)!=0|0}function Kt(e,t){e=e|0;t=t|0;if(iT(e,t,400)|0){ix(e|0,t|0,400)|0;Vt(e)}return}function Xt(e){e=e|0;var t=ft;t=Y(s[e+44>>2]);e=wt(t)|0;return Y(e?Y(0.0):t)}function Qt(e){e=e|0;var t=ft;t=Y(s[e+48>>2]);if(wt(t)|0)t=r[(o[e+976>>2]|0)+2>>0]|0?Y(1.0):Y(0.0);return Y(t)}function Jt(e,t){e=e|0;t=t|0;o[e+980>>2]=t;return}function Zt(e){e=e|0;return o[e+980>>2]|0}function en(e,t){e=e|0;t=t|0;var n=0;n=e+4|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function tn(e){e=e|0;return o[e+4>>2]|0}function nn(e,t){e=e|0;t=t|0;var n=0;n=e+8|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function rn(e){e=e|0;return o[e+8>>2]|0}function on(e,t){e=e|0;t=t|0;var n=0;n=e+12|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function un(e){e=e|0;return o[e+12>>2]|0}function an(e,t){e=e|0;t=t|0;var n=0;n=e+16|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function ln(e){e=e|0;return o[e+16>>2]|0}function sn(e,t){e=e|0;t=t|0;var n=0;n=e+20|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function cn(e){e=e|0;return o[e+20>>2]|0}function fn(e,t){e=e|0;t=t|0;var n=0;n=e+24|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function dn(e){e=e|0;return o[e+24>>2]|0}function pn(e,t){e=e|0;t=t|0;var n=0;n=e+28|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function hn(e){e=e|0;return o[e+28>>2]|0}function vn(e,t){e=e|0;t=t|0;var n=0;n=e+32|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function mn(e){e=e|0;return o[e+32>>2]|0}function gn(e,t){e=e|0;t=t|0;var n=0;n=e+36|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function yn(e){e=e|0;return o[e+36>>2]|0}function _n(e,t){e=e|0;t=Y(t);var n=0;n=e+40|0;if(Y(s[n>>2])!=t){s[n>>2]=t;Vt(e)}return}function bn(e,t){e=e|0;t=Y(t);var n=0;n=e+44|0;if(Y(s[n>>2])!=t){s[n>>2]=t;Vt(e)}return}function wn(e,t){e=e|0;t=Y(t);var n=0;n=e+48|0;if(Y(s[n>>2])!=t){s[n>>2]=t;Vt(e)}return}function En(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=(u^1)&1;r=e+52|0;i=e+56|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Dn(e,t){e=e|0;t=Y(t);var n=0,r=0;r=e+52|0;n=e+56|0;if(!(!(Y(s[r>>2])!=t)?(o[n>>2]|0)==2:0)){s[r>>2]=t;r=wt(t)|0;o[n>>2]=r?3:2;Vt(e)}return}function Sn(e,t){e=e|0;t=t|0;var n=0,r=0;r=t+52|0;n=o[r+4>>2]|0;t=e;o[t>>2]=o[r>>2];o[t+4>>2]=n;return}function Cn(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0,u=0;u=wt(n)|0;r=(u^1)&1;i=e+132+(t<<3)|0;t=e+132+(t<<3)+4|0;if(!(u|Y(s[i>>2])==n?(o[t>>2]|0)==(r|0):0)){s[i>>2]=n;o[t>>2]=r;Vt(e)}return}function kn(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0,u=0;u=wt(n)|0;r=u?0:2;i=e+132+(t<<3)|0;t=e+132+(t<<3)+4|0;if(!(u|Y(s[i>>2])==n?(o[t>>2]|0)==(r|0):0)){s[i>>2]=n;o[t>>2]=r;Vt(e)}return}function Tn(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=t+132+(n<<3)|0;t=o[r+4>>2]|0;n=e;o[n>>2]=o[r>>2];o[n+4>>2]=t;return}function xn(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0,u=0;u=wt(n)|0;r=(u^1)&1;i=e+60+(t<<3)|0;t=e+60+(t<<3)+4|0;if(!(u|Y(s[i>>2])==n?(o[t>>2]|0)==(r|0):0)){s[i>>2]=n;o[t>>2]=r;Vt(e)}return}function An(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0,u=0;u=wt(n)|0;r=u?0:2;i=e+60+(t<<3)|0;t=e+60+(t<<3)+4|0;if(!(u|Y(s[i>>2])==n?(o[t>>2]|0)==(r|0):0)){s[i>>2]=n;o[t>>2]=r;Vt(e)}return}function On(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=t+60+(n<<3)|0;t=o[r+4>>2]|0;n=e;o[n>>2]=o[r>>2];o[n+4>>2]=t;return}function Pn(e,t){e=e|0;t=t|0;var n=0;n=e+60+(t<<3)+4|0;if((o[n>>2]|0)!=3){s[e+60+(t<<3)>>2]=Y(E);o[n>>2]=3;Vt(e)}return}function In(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0,u=0;u=wt(n)|0;r=(u^1)&1;i=e+204+(t<<3)|0;t=e+204+(t<<3)+4|0;if(!(u|Y(s[i>>2])==n?(o[t>>2]|0)==(r|0):0)){s[i>>2]=n;o[t>>2]=r;Vt(e)}return}function Nn(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0,u=0;u=wt(n)|0;r=u?0:2;i=e+204+(t<<3)|0;t=e+204+(t<<3)+4|0;if(!(u|Y(s[i>>2])==n?(o[t>>2]|0)==(r|0):0)){s[i>>2]=n;o[t>>2]=r;Vt(e)}return}function Mn(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=t+204+(n<<3)|0;t=o[r+4>>2]|0;n=e;o[n>>2]=o[r>>2];o[n+4>>2]=t;return}function Rn(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0,u=0;u=wt(n)|0;r=(u^1)&1;i=e+276+(t<<3)|0;t=e+276+(t<<3)+4|0;if(!(u|Y(s[i>>2])==n?(o[t>>2]|0)==(r|0):0)){s[i>>2]=n;o[t>>2]=r;Vt(e)}return}function Fn(e,t){e=e|0;t=t|0;return Y(s[e+276+(t<<3)>>2])}function Ln(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=(u^1)&1;r=e+348|0;i=e+352|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Bn(e,t){e=e|0;t=Y(t);var n=0,r=0;r=e+348|0;n=e+352|0;if(!(!(Y(s[r>>2])!=t)?(o[n>>2]|0)==2:0)){s[r>>2]=t;r=wt(t)|0;o[n>>2]=r?3:2;Vt(e)}return}function jn(e){e=e|0;var t=0;t=e+352|0;if((o[t>>2]|0)!=3){s[e+348>>2]=Y(E);o[t>>2]=3;Vt(e)}return}function Un(e,t){e=e|0;t=t|0;var n=0,r=0;r=t+348|0;n=o[r+4>>2]|0;t=e;o[t>>2]=o[r>>2];o[t+4>>2]=n;return}function zn(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=(u^1)&1;r=e+356|0;i=e+360|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Wn(e,t){e=e|0;t=Y(t);var n=0,r=0;r=e+356|0;n=e+360|0;if(!(!(Y(s[r>>2])!=t)?(o[n>>2]|0)==2:0)){s[r>>2]=t;r=wt(t)|0;o[n>>2]=r?3:2;Vt(e)}return}function Hn(e){e=e|0;var t=0;t=e+360|0;if((o[t>>2]|0)!=3){s[e+356>>2]=Y(E);o[t>>2]=3;Vt(e)}return}function Vn(e,t){e=e|0;t=t|0;var n=0,r=0;r=t+356|0;n=o[r+4>>2]|0;t=e;o[t>>2]=o[r>>2];o[t+4>>2]=n;return}function qn(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=(u^1)&1;r=e+364|0;i=e+368|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Gn(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=u?0:2;r=e+364|0;i=e+368|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function $n(e,t){e=e|0;t=t|0;var n=0,r=0;r=t+364|0;n=o[r+4>>2]|0;t=e;o[t>>2]=o[r>>2];o[t+4>>2]=n;return}function Yn(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=(u^1)&1;r=e+372|0;i=e+376|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Kn(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=u?0:2;r=e+372|0;i=e+376|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Xn(e,t){e=e|0;t=t|0;var n=0,r=0;r=t+372|0;n=o[r+4>>2]|0;t=e;o[t>>2]=o[r>>2];o[t+4>>2]=n;return}function Qn(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=(u^1)&1;r=e+380|0;i=e+384|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Jn(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=u?0:2;r=e+380|0;i=e+384|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Zn(e,t){e=e|0;t=t|0;var n=0,r=0;r=t+380|0;n=o[r+4>>2]|0;t=e;o[t>>2]=o[r>>2];o[t+4>>2]=n;return}function er(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=(u^1)&1;r=e+388|0;i=e+392|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function tr(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=u?0:2;r=e+388|0;i=e+392|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function nr(e,t){e=e|0;t=t|0;var n=0,r=0;r=t+388|0;n=o[r+4>>2]|0;t=e;o[t>>2]=o[r>>2];o[t+4>>2]=n;return}function rr(e,t){e=e|0;t=Y(t);var n=0;n=e+396|0;if(Y(s[n>>2])!=t){s[n>>2]=t;Vt(e)}return}function ir(e){e=e|0;return Y(s[e+396>>2])}function or(e){e=e|0;return Y(s[e+400>>2])}function ur(e){e=e|0;return Y(s[e+404>>2])}function ar(e){e=e|0;return Y(s[e+408>>2])}function lr(e){e=e|0;return Y(s[e+412>>2])}function sr(e){e=e|0;return Y(s[e+416>>2])}function cr(e){e=e|0;return Y(s[e+420>>2])}function fr(e,t){e=e|0;t=t|0;Rt(e,(t|0)<6,2918);switch(t|0){case 0:{t=(o[e+496>>2]|0)==2?5:4;break}case 2:{t=(o[e+496>>2]|0)==2?4:5;break}default:{}}return Y(s[e+424+(t<<2)>>2])}function dr(e,t){e=e|0;t=t|0;Rt(e,(t|0)<6,2918);switch(t|0){case 0:{t=(o[e+496>>2]|0)==2?5:4;break}case 2:{t=(o[e+496>>2]|0)==2?4:5;break}default:{}}return Y(s[e+448+(t<<2)>>2])}function pr(e,t){e=e|0;t=t|0;Rt(e,(t|0)<6,2918);switch(t|0){case 0:{t=(o[e+496>>2]|0)==2?5:4;break}case 2:{t=(o[e+496>>2]|0)==2?4:5;break}default:{}}return Y(s[e+472+(t<<2)>>2])}function hr(e,t){e=e|0;t=t|0;var n=0,r=ft;n=o[e+4>>2]|0;if((n|0)==(o[t+4>>2]|0)){if(!n)e=1;else{r=Y(s[e>>2]);e=Y(P(Y(r-Y(s[t>>2]))))>2]=0;o[i+4>>2]=0;o[i+8>>2]=0;je(i|0,e|0,t|0,0);Cr(e,3,(r[i+11>>0]|0)<0?o[i>>2]|0:i,n);XT(i);h=n;return}function yr(e,t,n,r){e=Y(e);t=Y(t);n=n|0;r=r|0;var i=ft;e=Y(e*t);i=Y(LT(e,Y(1.0)));do{if(!(vr(i,Y(0.0))|0)){e=Y(e-i);if(vr(i,Y(1.0))|0){e=Y(e+Y(1.0));break}if(n){e=Y(e+Y(1.0));break}if(!r){if(i>Y(.5))i=Y(1.0);else{r=vr(i,Y(.5))|0;i=r?Y(1.0):Y(0.0)}e=Y(e+i)}}else e=Y(e-i)}while(0);return Y(e/t)}function _r(e,t,n,r,i,o,u,a,l,c,f,d,p){e=e|0;t=Y(t);n=n|0;r=Y(r);i=i|0;o=Y(o);u=u|0;a=Y(a);l=Y(l);c=Y(c);f=Y(f);d=Y(d);p=p|0;var h=0,v=ft,m=ft,g=ft,y=ft,_=ft,b=ft;if(l>2]),v!=Y(0.0)):0){g=Y(yr(t,v,0,0));y=Y(yr(r,v,0,0));m=Y(yr(o,v,0,0));v=Y(yr(a,v,0,0))}else{m=o;g=t;v=a;y=r}if((i|0)==(e|0))h=vr(m,g)|0;else h=0;if((u|0)==(n|0))p=vr(v,y)|0;else p=0;if((!h?(_=Y(t-f),!(br(e,_,l)|0)):0)?!(wr(e,_,i,l)|0):0)h=Er(e,_,i,o,l)|0;else h=1;if((!p?(b=Y(r-d),!(br(n,b,c)|0)):0)?!(wr(n,b,u,c)|0):0)p=Er(n,b,u,a,c)|0;else p=1;p=h&p}return p|0}function br(e,t,n){e=e|0;t=Y(t);n=Y(n);if((e|0)==1)e=vr(t,n)|0;else e=0;return e|0}function wr(e,t,n,r){e=e|0;t=Y(t);n=n|0;r=Y(r);if((e|0)==2&(n|0)==0){if(!(t>=r))e=vr(t,r)|0;else e=1}else e=0;return e|0}function Er(e,t,n,r,i){e=e|0;t=Y(t);n=n|0;r=Y(r);i=Y(i);if((e|0)==2&(n|0)==2&r>t){if(!(i<=t))e=vr(t,i)|0;else e=1}else e=0;return e|0}function Dr(e,t,n,i,u,a,l,f,d,p,v){e=e|0;t=Y(t);n=Y(n);i=i|0;u=u|0;a=a|0;l=Y(l);f=Y(f);d=d|0;p=p|0;v=v|0;var m=0,g=0,y=0,_=0,b=ft,w=ft,E=0,D=0,S=0,C=0,k=0,T=0,x=0,A=0,O=0,P=0,I=0,N=ft,M=ft,R=ft,F=0.0,L=0.0;I=h;h=h+160|0;A=I+152|0;x=I+120|0;T=I+104|0;S=I+72|0;_=I+56|0;k=I+8|0;D=I;C=(o[2279]|0)+1|0;o[2279]=C;O=e+984|0;if((r[O>>0]|0)!=0?(o[e+512>>2]|0)!=(o[2278]|0):0)E=4;else if((o[e+516>>2]|0)==(i|0))P=0;else E=4;if((E|0)==4){o[e+520>>2]=0;o[e+924>>2]=-1;o[e+928>>2]=-1;s[e+932>>2]=Y(-1.0);s[e+936>>2]=Y(-1.0);P=1}e:do{if(!(o[e+964>>2]|0)){if(d){m=e+916|0;if(!(vr(Y(s[m>>2]),t)|0)){E=21;break}if(!(vr(Y(s[e+920>>2]),n)|0)){E=21;break}if((o[e+924>>2]|0)!=(u|0)){E=21;break}m=(o[e+928>>2]|0)==(a|0)?m:0;E=22;break}y=o[e+520>>2]|0;if(!y)E=21;else{g=0;while(1){m=e+524+(g*24|0)|0;if(((vr(Y(s[m>>2]),t)|0?vr(Y(s[e+524+(g*24|0)+4>>2]),n)|0:0)?(o[e+524+(g*24|0)+8>>2]|0)==(u|0):0)?(o[e+524+(g*24|0)+12>>2]|0)==(a|0):0){E=22;break e}g=g+1|0;if(g>>>0>=y>>>0){E=21;break}}}}else{b=Y(Sr(e,2,l));w=Y(Sr(e,0,l));m=e+916|0;R=Y(s[m>>2]);M=Y(s[e+920>>2]);N=Y(s[e+932>>2]);if(!(_r(u,t,a,n,o[e+924>>2]|0,R,o[e+928>>2]|0,M,N,Y(s[e+936>>2]),b,w,v)|0)){y=o[e+520>>2]|0;if(!y)E=21;else{g=0;while(1){m=e+524+(g*24|0)|0;N=Y(s[m>>2]);M=Y(s[e+524+(g*24|0)+4>>2]);R=Y(s[e+524+(g*24|0)+16>>2]);if(_r(u,t,a,n,o[e+524+(g*24|0)+8>>2]|0,N,o[e+524+(g*24|0)+12>>2]|0,M,R,Y(s[e+524+(g*24|0)+20>>2]),b,w,v)|0){E=22;break e}g=g+1|0;if(g>>>0>=y>>>0){E=21;break}}}}else E=22}}while(0);do{if((E|0)==21){if(!(r[11697]|0)){m=0;E=31}else{m=0;E=28}}else if((E|0)==22){g=(r[11697]|0)!=0;if(!((m|0)!=0&(P^1)))if(g){E=28;break}else{E=31;break}_=m+16|0;o[e+908>>2]=o[_>>2];y=m+20|0;o[e+912>>2]=o[y>>2];if(!((r[11698]|0)==0|g^1)){o[D>>2]=kr(C)|0;o[D+4>>2]=C;Cr(e,4,2972,D);g=o[e+972>>2]|0;if(g|0)hA[g&127](e);u=Tr(u,d)|0;a=Tr(a,d)|0;L=+Y(s[_>>2]);F=+Y(s[y>>2]);o[k>>2]=u;o[k+4>>2]=a;c[k+8>>3]=+t;c[k+16>>3]=+n;c[k+24>>3]=L;c[k+32>>3]=F;o[k+40>>2]=p;Cr(e,4,2989,k)}}}while(0);if((E|0)==28){g=kr(C)|0;o[_>>2]=g;o[_+4>>2]=C;o[_+8>>2]=P?3047:11699;Cr(e,4,3038,_);g=o[e+972>>2]|0;if(g|0)hA[g&127](e);k=Tr(u,d)|0;E=Tr(a,d)|0;o[S>>2]=k;o[S+4>>2]=E;c[S+8>>3]=+t;c[S+16>>3]=+n;o[S+24>>2]=p;Cr(e,4,3049,S);E=31}if((E|0)==31){xr(e,t,n,i,u,a,l,f,d,v);if(r[11697]|0){g=o[2279]|0;k=kr(g)|0;o[T>>2]=k;o[T+4>>2]=g;o[T+8>>2]=P?3047:11699;Cr(e,4,3083,T);g=o[e+972>>2]|0;if(g|0)hA[g&127](e);k=Tr(u,d)|0;T=Tr(a,d)|0;F=+Y(s[e+908>>2]);L=+Y(s[e+912>>2]);o[x>>2]=k;o[x+4>>2]=T;c[x+8>>3]=F;c[x+16>>3]=L;o[x+24>>2]=p;Cr(e,4,3092,x)}o[e+516>>2]=i;if(!m){g=e+520|0;m=o[g>>2]|0;if((m|0)==16){if(r[11697]|0)Cr(e,4,3124,A);o[g>>2]=0;m=0}if(d)m=e+916|0;else{o[g>>2]=m+1;m=e+524+(m*24|0)|0}s[m>>2]=t;s[m+4>>2]=n;o[m+8>>2]=u;o[m+12>>2]=a;o[m+16>>2]=o[e+908>>2];o[m+20>>2]=o[e+912>>2];m=0}}if(d){o[e+416>>2]=o[e+908>>2];o[e+420>>2]=o[e+912>>2];r[e+985>>0]=1;r[O>>0]=0}o[2279]=(o[2279]|0)+-1;o[e+512>>2]=o[2278];h=I;return P|(m|0)==0|0}function Sr(e,t,n){e=e|0;t=t|0;n=Y(n);var r=ft;r=Y(Vr(e,t,n));return Y(r+Y(qr(e,t,n)))}function Cr(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=h;h=h+16|0;i=u;o[i>>2]=r;if(!e)r=0;else r=o[e+976>>2]|0;Br(r,e,t,n,i);h=u;return}function kr(e){e=e|0;return(e>>>0>60?3201:3201+(60-e)|0)|0}function Tr(e,t){e=e|0;t=t|0;var n=0,r=0,i=0;i=h;h=h+32|0;n=i+12|0;r=i;o[n>>2]=o[254];o[n+4>>2]=o[255];o[n+8>>2]=o[256];o[r>>2]=o[257];o[r+4>>2]=o[258];o[r+8>>2]=o[259];if((e|0)>2)e=11699;else e=o[(t?r:n)+(e<<2)>>2]|0;h=i;return e|0}function xr(e,t,n,i,a,l,c,f,p,v){e=e|0;t=Y(t);n=Y(n);i=i|0;a=a|0;l=l|0;c=Y(c);f=Y(f);p=p|0;v=v|0;var m=0,g=0,y=0,_=0,b=ft,w=ft,E=ft,D=ft,S=ft,C=ft,k=ft,T=0,x=0,A=0,O=ft,P=ft,I=0,N=ft,M=0,R=0,F=0,L=0,B=0,j=0,U=0,z=0,W=0,H=0,V=0,q=0,G=0,$=0,K=0,X=0,Q=0,J=0,Z=ft,ee=ft,te=ft,ne=ft,re=ft,ie=0,oe=0,ue=0,ae=0,le=0,se=ft,ce=ft,fe=ft,de=ft,pe=ft,he=ft,ve=0,me=ft,ge=ft,ye=ft,_e=ft,be=ft,we=ft,Ee=0,De=0,Se=ft,Ce=ft,ke=0,Te=0,xe=0,Ae=0,Oe=ft,Pe=0,Ie=0,Ne=0,Me=0,Re=0,Fe=0,Le=0,Be=ft,je=0,Ue=0;Le=h;h=h+16|0;ie=Le+12|0;oe=Le+8|0;ue=Le+4|0;ae=Le;Rt(e,(a|0)==0|(wt(t)|0)^1,3326);Rt(e,(l|0)==0|(wt(n)|0)^1,3406);Ie=Yr(e,i)|0;o[e+496>>2]=Ie;Re=Kr(2,Ie)|0;Fe=Kr(0,Ie)|0;s[e+440>>2]=Y(Vr(e,Re,c));s[e+444>>2]=Y(qr(e,Re,c));s[e+428>>2]=Y(Vr(e,Fe,c));s[e+436>>2]=Y(qr(e,Fe,c));s[e+464>>2]=Y(Xr(e,Re));s[e+468>>2]=Y(Qr(e,Re));s[e+452>>2]=Y(Xr(e,Fe));s[e+460>>2]=Y(Qr(e,Fe));s[e+488>>2]=Y(Jr(e,Re,c));s[e+492>>2]=Y(Zr(e,Re,c));s[e+476>>2]=Y(Jr(e,Fe,c));s[e+484>>2]=Y(Zr(e,Fe,c));do{if(!(o[e+964>>2]|0)){Ne=e+948|0;Me=(o[e+952>>2]|0)-(o[Ne>>2]|0)>>2;if(!Me){ti(e,t,n,a,l,c,f);break}if(!p?ni(e,t,n,a,l,c,f)|0:0)break;Wt(e);X=e+508|0;r[X>>0]=0;Re=Kr(o[e+4>>2]|0,Ie)|0;Fe=ri(Re,Ie)|0;Pe=Gr(Re)|0;Q=o[e+8>>2]|0;Te=e+28|0;J=(o[Te>>2]|0)!=0;be=Pe?c:f;Se=Pe?f:c;Z=Y(ii(e,Re,c));ee=Y(oi(e,Re,c));b=Y(ii(e,Fe,c));we=Y(ui(e,Re,c));Ce=Y(ui(e,Fe,c));A=Pe?a:l;ke=Pe?l:a;Oe=Pe?we:Ce;S=Pe?Ce:we;_e=Y(Sr(e,2,c));D=Y(Sr(e,0,c));w=Y(Y(Nr(e+364|0,c))-Oe);E=Y(Y(Nr(e+380|0,c))-Oe);C=Y(Y(Nr(e+372|0,f))-S);k=Y(Y(Nr(e+388|0,f))-S);te=Pe?w:C;ne=Pe?E:k;_e=Y(t-_e);t=Y(_e-Oe);if(wt(t)|0)Oe=t;else Oe=Y(NT(Y(RT(t,E)),w));ge=Y(n-D);t=Y(ge-S);if(wt(t)|0)ye=t;else ye=Y(NT(Y(RT(t,k)),C));w=Pe?Oe:ye;me=Pe?ye:Oe;e:do{if((A|0)==1){i=0;g=0;while(1){m=Pt(e,g)|0;if(!i){if(Y(li(m))>Y(0.0)?Y(si(m))>Y(0.0):0)i=m;else i=0}else if(ai(m)|0){_=0;break e}g=g+1|0;if(g>>>0>=Me>>>0){_=i;break}}}else _=0}while(0);T=_+500|0;x=_+504|0;i=0;m=0;t=Y(0.0);y=0;do{g=o[(o[Ne>>2]|0)+(y<<2)>>2]|0;if((o[g+36>>2]|0)==1){ci(g);r[g+985>>0]=1;r[g+984>>0]=0}else{Pr(g);if(p)Mr(g,Yr(g,Ie)|0,w,me,Oe);do{if((o[g+24>>2]|0)!=1){if((g|0)==(_|0)){o[T>>2]=o[2278];s[x>>2]=Y(0.0);break}else{fi(e,g,Oe,a,ye,Oe,ye,l,Ie,v);break}}else{if(m|0)o[m+960>>2]=g;o[g+960>>2]=0;m=g;i=(i|0)==0?g:i}}while(0);he=Y(s[g+504>>2]);t=Y(t+Y(he+Y(Sr(g,Re,Oe))))}y=y+1|0}while((y|0)!=(Me|0));F=t>w;ve=J&((A|0)==2&F)?1:A;M=(ke|0)==1;B=M&(p^1);j=(ve|0)==1;U=(ve|0)==2;z=976+(Re<<2)|0;W=(ke|2|0)==2;$=M&(J^1);H=1040+(Fe<<2)|0;V=1040+(Re<<2)|0;q=976+(Fe<<2)|0;G=(ke|0)!=1;F=J&((A|0)!=0&F);R=e+976|0;M=M^1;t=w;I=0;L=0;he=Y(0.0);re=Y(0.0);while(1){e:do{if(I>>>0>>0){x=o[Ne>>2]|0;y=0;k=Y(0.0);C=Y(0.0);E=Y(0.0);w=Y(0.0);g=0;m=0;_=I;while(1){T=o[x+(_<<2)>>2]|0;if((o[T+36>>2]|0)!=1?(o[T+940>>2]=L,(o[T+24>>2]|0)!=1):0){D=Y(Sr(T,Re,Oe));K=o[z>>2]|0;n=Y(Nr(T+380+(K<<3)|0,be));S=Y(s[T+504>>2]);n=Y(RT(n,S));n=Y(NT(Y(Nr(T+364+(K<<3)|0,be)),n));if(J&(y|0)!=0&Y(D+Y(C+n))>t){l=y;D=k;A=_;break e}D=Y(D+n);n=Y(C+D);D=Y(k+D);if(ai(T)|0){E=Y(E+Y(li(T)));w=Y(w-Y(S*Y(si(T))))}if(m|0)o[m+960>>2]=T;o[T+960>>2]=0;y=y+1|0;m=T;g=(g|0)==0?T:g}else{D=k;n=C}_=_+1|0;if(_>>>0>>0){k=D;C=n}else{l=y;A=_;break}}}else{l=0;D=Y(0.0);E=Y(0.0);w=Y(0.0);g=0;A=I}}while(0);K=E>Y(0.0)&EY(0.0)&wne&((wt(ne)|0)^1))){if(!(r[(o[R>>2]|0)+3>>0]|0)){if(!(O==Y(0.0))?!(Y(li(e))==Y(0.0)):0){K=53;break}t=D;K=53}else K=51}else{t=ne;K=51}}else{t=te;K=51}}else K=51}while(0);if((K|0)==51){K=0;if(wt(t)|0)K=53;else{P=Y(t-D);N=t}}if((K|0)==53){K=0;if(D>2]|0;_=PY(0.0);C=Y(P/O);E=Y(0.0);D=Y(0.0);t=Y(0.0);m=g;do{n=Y(Nr(m+380+(y<<3)|0,be));w=Y(Nr(m+364+(y<<3)|0,be));w=Y(RT(n,Y(NT(w,Y(s[m+504>>2])))));if(_){n=Y(w*Y(si(m)));if(n!=Y(-0.0)?(Be=Y(w-Y(S*n)),se=Y(di(m,Re,Be,N,Oe)),Be!=se):0){E=Y(E-Y(se-w));t=Y(t+n)}}else if((T?(ce=Y(li(m)),ce!=Y(0.0)):0)?(Be=Y(w+Y(C*ce)),fe=Y(di(m,Re,Be,N,Oe)),Be!=fe):0){E=Y(E-Y(fe-w));D=Y(D-ce)}m=o[m+960>>2]|0}while((m|0)!=0);t=Y(k+t);w=Y(P+E);if(!le){S=Y(O+D);_=o[z>>2]|0;T=wY(0.0);S=Y(w/S);t=Y(0.0);do{Be=Y(Nr(g+380+(_<<3)|0,be));E=Y(Nr(g+364+(_<<3)|0,be));E=Y(RT(Be,Y(NT(E,Y(s[g+504>>2])))));if(T){Be=Y(E*Y(si(g)));w=Y(-Be);if(Be!=Y(-0.0)){Be=Y(C*w);w=Y(di(g,Re,Y(E+(x?w:Be)),N,Oe))}else w=E}else if(y?(de=Y(li(g)),de!=Y(0.0)):0)w=Y(di(g,Re,Y(E+Y(S*de)),N,Oe));else w=E;t=Y(t-Y(w-E));D=Y(Sr(g,Re,Oe));n=Y(Sr(g,Fe,Oe));w=Y(w+D);s[oe>>2]=w;o[ae>>2]=1;E=Y(s[g+396>>2]);e:do{if(wt(E)|0){m=wt(me)|0;do{if(!m){if(F|(Ir(g,Fe,me)|0|M))break;if((pi(e,g)|0)!=4)break;if((o[(hi(g,Fe)|0)+4>>2]|0)==3)break;if((o[(vi(g,Fe)|0)+4>>2]|0)==3)break;s[ie>>2]=me;o[ue>>2]=1;break e}}while(0);if(Ir(g,Fe,me)|0){m=o[g+992+(o[q>>2]<<2)>>2]|0;Be=Y(n+Y(Nr(m,me)));s[ie>>2]=Be;m=G&(o[m+4>>2]|0)==2;o[ue>>2]=((wt(Be)|0|m)^1)&1;break}else{s[ie>>2]=me;o[ue>>2]=m?0:2;break}}else{Be=Y(w-D);O=Y(Be/E);Be=Y(E*Be);o[ue>>2]=1;s[ie>>2]=Y(n+(Pe?O:Be))}}while(0);mi(g,Re,N,Oe,ae,oe);mi(g,Fe,me,Oe,ue,ie);do{if(!(Ir(g,Fe,me)|0)?(pi(e,g)|0)==4:0){if((o[(hi(g,Fe)|0)+4>>2]|0)==3){m=0;break}m=(o[(vi(g,Fe)|0)+4>>2]|0)!=3}else m=0}while(0);Be=Y(s[oe>>2]);O=Y(s[ie>>2]);je=o[ae>>2]|0;Ue=o[ue>>2]|0;Dr(g,Pe?Be:O,Pe?O:Be,Ie,Pe?je:Ue,Pe?Ue:je,Oe,ye,p&(m^1),3488,v)|0;r[X>>0]=r[X>>0]|r[g+508>>0];g=o[g+960>>2]|0}while((g|0)!=0)}else t=Y(0.0)}else t=Y(0.0);t=Y(P+t);Ue=t>0]=Ue|u[X>>0];if(U&t>Y(0.0)){m=o[z>>2]|0;if((o[e+364+(m<<3)+4>>2]|0)!=0?(pe=Y(Nr(e+364+(m<<3)|0,be)),pe>=Y(0.0)):0)w=Y(NT(Y(0.0),Y(pe-Y(N-t))));else w=Y(0.0)}else w=t;T=I>>>0>>0;if(T){_=o[Ne>>2]|0;y=I;m=0;do{g=o[_+(y<<2)>>2]|0;if(!(o[g+24>>2]|0)){m=((o[(hi(g,Re)|0)+4>>2]|0)==3&1)+m|0;m=m+((o[(vi(g,Re)|0)+4>>2]|0)==3&1)|0}y=y+1|0}while((y|0)!=(A|0));if(m){D=Y(0.0);n=Y(0.0)}else K=101}else K=101;e:do{if((K|0)==101){K=0;switch(Q|0){case 1:{m=0;D=Y(w*Y(.5));n=Y(0.0);break e}case 2:{m=0;D=w;n=Y(0.0);break e}case 3:{if(l>>>0<=1){m=0;D=Y(0.0);n=Y(0.0);break e}n=Y((l+-1|0)>>>0);m=0;D=Y(0.0);n=Y(Y(NT(w,Y(0.0)))/n);break e}case 5:{n=Y(w/Y((l+1|0)>>>0));m=0;D=n;break e}case 4:{n=Y(w/Y(l>>>0));m=0;D=Y(n*Y(.5));break e}default:{m=0;D=Y(0.0);n=Y(0.0);break e}}}}while(0);t=Y(Z+D);if(T){E=Y(w/Y(m|0));y=o[Ne>>2]|0;g=I;w=Y(0.0);do{m=o[y+(g<<2)>>2]|0;e:do{if((o[m+36>>2]|0)!=1){switch(o[m+24>>2]|0){case 1:{if(gi(m,Re)|0){if(!p)break e;Be=Y(yi(m,Re,N));Be=Y(Be+Y(Xr(e,Re)));Be=Y(Be+Y(Vr(m,Re,Oe)));s[m+400+(o[V>>2]<<2)>>2]=Be;break e}break}case 0:{Ue=(o[(hi(m,Re)|0)+4>>2]|0)==3;Be=Y(E+t);t=Ue?Be:t;if(p){Ue=m+400+(o[V>>2]<<2)|0;s[Ue>>2]=Y(t+Y(s[Ue>>2]))}Ue=(o[(vi(m,Re)|0)+4>>2]|0)==3;Be=Y(E+t);t=Ue?Be:t;if(B){Be=Y(n+Y(Sr(m,Re,Oe)));w=me;t=Y(t+Y(Be+Y(s[m+504>>2])));break e}else{t=Y(t+Y(n+Y(_i(m,Re,Oe))));w=Y(NT(w,Y(_i(m,Fe,Oe))));break e}}default:{}}if(p){Be=Y(D+Y(Xr(e,Re)));Ue=m+400+(o[V>>2]<<2)|0;s[Ue>>2]=Y(Be+Y(s[Ue>>2]))}}}while(0);g=g+1|0}while((g|0)!=(A|0))}else w=Y(0.0);n=Y(ee+t);if(W)D=Y(Y(di(e,Fe,Y(Ce+w),Se,c))-Ce);else D=me;E=Y(Y(di(e,Fe,Y(Ce+($?me:w)),Se,c))-Ce);if(T&p){g=I;do{y=o[(o[Ne>>2]|0)+(g<<2)>>2]|0;do{if((o[y+36>>2]|0)!=1){if((o[y+24>>2]|0)==1){if(gi(y,Fe)|0){Be=Y(yi(y,Fe,me));Be=Y(Be+Y(Xr(e,Fe)));Be=Y(Be+Y(Vr(y,Fe,Oe)));m=o[H>>2]|0;s[y+400+(m<<2)>>2]=Be;if(!(wt(Be)|0))break}else m=o[H>>2]|0;Be=Y(Xr(e,Fe));s[y+400+(m<<2)>>2]=Y(Be+Y(Vr(y,Fe,Oe)));break}m=pi(e,y)|0;do{if((m|0)==4){if((o[(hi(y,Fe)|0)+4>>2]|0)==3){K=139;break}if((o[(vi(y,Fe)|0)+4>>2]|0)==3){K=139;break}if(Ir(y,Fe,me)|0){t=b;break}je=o[y+908+(o[z>>2]<<2)>>2]|0;o[ie>>2]=je;t=Y(s[y+396>>2]);Ue=wt(t)|0;w=(o[d>>2]=je,Y(s[d>>2]));if(Ue)t=E;else{P=Y(Sr(y,Fe,Oe));Be=Y(w/t);t=Y(t*w);t=Y(P+(Pe?Be:t))}s[oe>>2]=t;s[ie>>2]=Y(Y(Sr(y,Re,Oe))+w);o[ue>>2]=1;o[ae>>2]=1;mi(y,Re,N,Oe,ue,ie);mi(y,Fe,me,Oe,ae,oe);t=Y(s[ie>>2]);P=Y(s[oe>>2]);Be=Pe?t:P;t=Pe?P:t;Ue=((wt(Be)|0)^1)&1;Dr(y,Be,t,Ie,Ue,((wt(t)|0)^1)&1,Oe,ye,1,3493,v)|0;t=b}else K=139}while(0);e:do{if((K|0)==139){K=0;t=Y(D-Y(_i(y,Fe,Oe)));do{if((o[(hi(y,Fe)|0)+4>>2]|0)==3){if((o[(vi(y,Fe)|0)+4>>2]|0)!=3)break;t=Y(b+Y(NT(Y(0.0),Y(t*Y(.5)))));break e}}while(0);if((o[(vi(y,Fe)|0)+4>>2]|0)==3){t=b;break}if((o[(hi(y,Fe)|0)+4>>2]|0)==3){t=Y(b+Y(NT(Y(0.0),t)));break}switch(m|0){case 1:{t=b;break e}case 2:{t=Y(b+Y(t*Y(.5)));break e}default:{t=Y(b+t);break e}}}}while(0);Be=Y(he+t);Ue=y+400+(o[H>>2]<<2)|0;s[Ue>>2]=Y(Be+Y(s[Ue>>2]))}}while(0);g=g+1|0}while((g|0)!=(A|0))}he=Y(he+E);re=Y(NT(re,n));l=L+1|0;if(A>>>0>=Me>>>0)break;else{t=N;I=A;L=l}}do{if(p){m=l>>>0>1;if(!m?!(bi(e)|0):0)break;if(!(wt(me)|0)){t=Y(me-he);e:do{switch(o[e+12>>2]|0){case 3:{b=Y(b+t);C=Y(0.0);break}case 2:{b=Y(b+Y(t*Y(.5)));C=Y(0.0);break}case 4:{if(me>he)C=Y(t/Y(l>>>0));else C=Y(0.0);break}case 7:if(me>he){b=Y(b+Y(t/Y(l<<1>>>0)));C=Y(t/Y(l>>>0));C=m?C:Y(0.0);break e}else{b=Y(b+Y(t*Y(.5)));C=Y(0.0);break e}case 6:{C=Y(t/Y(L>>>0));C=me>he&m?C:Y(0.0);break}default:C=Y(0.0)}}while(0);if(l|0){T=1040+(Fe<<2)|0;x=976+(Fe<<2)|0;_=0;g=0;while(1){e:do{if(g>>>0>>0){w=Y(0.0);E=Y(0.0);t=Y(0.0);y=g;while(1){m=o[(o[Ne>>2]|0)+(y<<2)>>2]|0;do{if((o[m+36>>2]|0)!=1?(o[m+24>>2]|0)==0:0){if((o[m+940>>2]|0)!=(_|0))break e;if(wi(m,Fe)|0){Be=Y(s[m+908+(o[x>>2]<<2)>>2]);t=Y(NT(t,Y(Be+Y(Sr(m,Fe,Oe)))))}if((pi(e,m)|0)!=5)break;pe=Y(Ei(m));pe=Y(pe+Y(Vr(m,0,Oe)));Be=Y(s[m+912>>2]);Be=Y(Y(Be+Y(Sr(m,0,Oe)))-pe);pe=Y(NT(E,pe));Be=Y(NT(w,Be));w=Be;E=pe;t=Y(NT(t,Y(pe+Be)))}}while(0);m=y+1|0;if(m>>>0>>0)y=m;else{y=m;break}}}else{E=Y(0.0);t=Y(0.0);y=g}}while(0);S=Y(C+t);n=b;b=Y(b+S);if(g>>>0>>0){D=Y(n+E);m=g;do{g=o[(o[Ne>>2]|0)+(m<<2)>>2]|0;e:do{if((o[g+36>>2]|0)!=1?(o[g+24>>2]|0)==0:0)switch(pi(e,g)|0){case 1:{Be=Y(n+Y(Vr(g,Fe,Oe)));s[g+400+(o[T>>2]<<2)>>2]=Be;break e}case 3:{Be=Y(Y(b-Y(qr(g,Fe,Oe)))-Y(s[g+908+(o[x>>2]<<2)>>2]));s[g+400+(o[T>>2]<<2)>>2]=Be;break e}case 2:{Be=Y(n+Y(Y(S-Y(s[g+908+(o[x>>2]<<2)>>2]))*Y(.5)));s[g+400+(o[T>>2]<<2)>>2]=Be;break e}case 4:{Be=Y(n+Y(Vr(g,Fe,Oe)));s[g+400+(o[T>>2]<<2)>>2]=Be;if(Ir(g,Fe,me)|0)break e;if(Pe){w=Y(s[g+908>>2]);t=Y(w+Y(Sr(g,Re,Oe)));E=S}else{E=Y(s[g+912>>2]);E=Y(E+Y(Sr(g,Fe,Oe)));t=S;w=Y(s[g+908>>2])}if(vr(t,w)|0?vr(E,Y(s[g+912>>2]))|0:0)break e;Dr(g,t,E,Ie,1,1,Oe,ye,1,3501,v)|0;break e}case 5:{s[g+404>>2]=Y(Y(D-Y(Ei(g)))+Y(yi(g,0,me)));break e}default:break e}}while(0);m=m+1|0}while((m|0)!=(y|0))}_=_+1|0;if((_|0)==(l|0))break;else g=y}}}}}while(0);s[e+908>>2]=Y(di(e,2,_e,c,c));s[e+912>>2]=Y(di(e,0,ge,f,c));if((ve|0)!=0?(Ee=o[e+32>>2]|0,De=(ve|0)==2,!(De&(Ee|0)!=2)):0){if(De&(Ee|0)==2){t=Y(we+N);t=Y(NT(Y(RT(t,Y(Di(e,Re,re,be)))),we));K=198}}else{t=Y(di(e,Re,re,be,c));K=198}if((K|0)==198)s[e+908+(o[976+(Re<<2)>>2]<<2)>>2]=t;if((ke|0)!=0?(xe=o[e+32>>2]|0,Ae=(ke|0)==2,!(Ae&(xe|0)!=2)):0){if(Ae&(xe|0)==2){t=Y(Ce+me);t=Y(NT(Y(RT(t,Y(Di(e,Fe,Y(Ce+he),Se)))),Ce));K=204}}else{t=Y(di(e,Fe,Y(Ce+he),Se,c));K=204}if((K|0)==204)s[e+908+(o[976+(Fe<<2)>>2]<<2)>>2]=t;if(p){if((o[Te>>2]|0)==2){g=976+(Fe<<2)|0;y=1040+(Fe<<2)|0;m=0;do{_=Pt(e,m)|0;if(!(o[_+24>>2]|0)){je=o[g>>2]|0;Be=Y(s[e+908+(je<<2)>>2]);Ue=_+400+(o[y>>2]<<2)|0;Be=Y(Be-Y(s[Ue>>2]));s[Ue>>2]=Y(Be-Y(s[_+908+(je<<2)>>2]))}m=m+1|0}while((m|0)!=(Me|0))}if(i|0){m=Pe?ve:a;do{Si(e,i,Oe,m,ye,Ie,v);i=o[i+960>>2]|0}while((i|0)!=0)}m=(Re|2|0)==3;g=(Fe|2|0)==3;if(m|g){i=0;do{y=o[(o[Ne>>2]|0)+(i<<2)>>2]|0;if((o[y+36>>2]|0)!=1){if(m)Ci(e,y,Re);if(g)Ci(e,y,Fe)}i=i+1|0}while((i|0)!=(Me|0))}}}else ei(e,t,n,a,l,c,f)}while(0);h=Le;return}function Ar(e,t){e=e|0;t=Y(t);var n=0;St(e,t>=Y(0.0),3147);n=t==Y(0.0);s[e+4>>2]=n?Y(0.0):t;return}function Or(e,t,n,i){e=e|0;t=Y(t);n=Y(n);i=i|0;var u=ft,a=ft,l=0,c=0,f=0;o[2278]=(o[2278]|0)+1;Pr(e);if(!(Ir(e,2,t)|0)){u=Y(Nr(e+380|0,t));if(!(u>=Y(0.0))){f=((wt(t)|0)^1)&1;u=t}else f=2}else{u=Y(Nr(o[e+992>>2]|0,t));f=1;u=Y(u+Y(Sr(e,2,t)))}if(!(Ir(e,0,n)|0)){a=Y(Nr(e+388|0,n));if(!(a>=Y(0.0))){c=((wt(n)|0)^1)&1;a=n}else c=2}else{a=Y(Nr(o[e+996>>2]|0,n));c=1;a=Y(a+Y(Sr(e,0,t)))}l=e+976|0;if(Dr(e,u,a,i,f,c,t,n,1,3189,o[l>>2]|0)|0?(Mr(e,o[e+496>>2]|0,t,n,t),Rr(e,Y(s[(o[l>>2]|0)+4>>2]),Y(0.0),Y(0.0)),r[11696]|0):0)mr(e,7);return}function Pr(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;a=l+24|0;u=l+16|0;r=l+8|0;i=l;n=0;do{t=e+380+(n<<3)|0;if(!((o[e+380+(n<<3)+4>>2]|0)!=0?(s=t,c=o[s+4>>2]|0,f=r,o[f>>2]=o[s>>2],o[f+4>>2]=c,f=e+364+(n<<3)|0,c=o[f+4>>2]|0,s=i,o[s>>2]=o[f>>2],o[s+4>>2]=c,o[u>>2]=o[r>>2],o[u+4>>2]=o[r+4>>2],o[a>>2]=o[i>>2],o[a+4>>2]=o[i+4>>2],hr(u,a)|0):0))t=e+348+(n<<3)|0;o[e+992+(n<<2)>>2]=t;n=n+1|0}while((n|0)!=2);h=l;return}function Ir(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0;e=o[e+992+(o[976+(t<<2)>>2]<<2)>>2]|0;switch(o[e+4>>2]|0){case 0:case 3:{e=0;break}case 1:{if(Y(s[e>>2])>2])>2]|0){case 2:{t=Y(Y(Y(s[e>>2])*t)/Y(100.0));break}case 1:{t=Y(s[e>>2]);break}default:t=Y(E)}return Y(t)}function Mr(e,t,n,r,i){e=e|0;t=t|0;n=Y(n);r=Y(r);i=Y(i);var u=0,a=ft;t=o[e+944>>2]|0?t:1;u=Kr(o[e+4>>2]|0,t)|0;t=ri(u,t)|0;n=Y(Pi(e,u,n));r=Y(Pi(e,t,r));a=Y(n+Y(Vr(e,u,i)));s[e+400+(o[1040+(u<<2)>>2]<<2)>>2]=a;n=Y(n+Y(qr(e,u,i)));s[e+400+(o[1e3+(u<<2)>>2]<<2)>>2]=n;n=Y(r+Y(Vr(e,t,i)));s[e+400+(o[1040+(t<<2)>>2]<<2)>>2]=n;i=Y(r+Y(qr(e,t,i)));s[e+400+(o[1e3+(t<<2)>>2]<<2)>>2]=i;return}function Rr(e,t,n,r){e=e|0;t=Y(t);n=Y(n);r=Y(r);var i=0,u=0,a=ft,l=ft,c=0,f=0,d=ft,p=0,h=ft,v=ft,m=ft,g=ft;if(!(t==Y(0.0))){i=e+400|0;g=Y(s[i>>2]);u=e+404|0;m=Y(s[u>>2]);p=e+416|0;v=Y(s[p>>2]);f=e+420|0;a=Y(s[f>>2]);h=Y(g+n);d=Y(m+r);r=Y(h+v);l=Y(d+a);c=(o[e+988>>2]|0)==1;s[i>>2]=Y(yr(g,t,0,c));s[u>>2]=Y(yr(m,t,0,c));n=Y(LT(Y(v*t),Y(1.0)));if(vr(n,Y(0.0))|0)u=0;else u=(vr(n,Y(1.0))|0)^1;n=Y(LT(Y(a*t),Y(1.0)));if(vr(n,Y(0.0))|0)i=0;else i=(vr(n,Y(1.0))|0)^1;g=Y(yr(r,t,c&u,c&(u^1)));s[p>>2]=Y(g-Y(yr(h,t,0,c)));g=Y(yr(l,t,c&i,c&(i^1)));s[f>>2]=Y(g-Y(yr(d,t,0,c)));u=(o[e+952>>2]|0)-(o[e+948>>2]|0)>>2;if(u|0){i=0;do{Rr(Pt(e,i)|0,t,h,d);i=i+1|0}while((i|0)!=(u|0))}}return}function Fr(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;switch(n|0){case 5:case 0:{e=oT(o[489]|0,r,i)|0;break}default:e=jT(r,i)|0}return e|0}function Lr(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;i=h;h=h+16|0;u=i;o[u>>2]=r;Br(e,0,t,n,u);h=i;return}function Br(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;e=e|0?e:956;xA[o[e+8>>2]&1](e,t,n,r,i)|0;if((n|0)==5)Ye();else return}function jr(e,t,n){e=e|0;t=t|0;n=n|0;r[e+t>>0]=n&1;return}function Ur(e,t){e=e|0;t=t|0;var n=0,r=0;o[e>>2]=0;o[e+4>>2]=0;o[e+8>>2]=0;n=t+4|0;r=(o[n>>2]|0)-(o[t>>2]|0)>>2;if(r|0){zr(e,r);Wr(e,o[t>>2]|0,o[n>>2]|0,r)}return}function zr(e,t){e=e|0;t=t|0;var n=0;if((Hr(e)|0)>>>0>>0)UT(e);if(t>>>0>1073741823)Ye();else{n=$T(t<<2)|0;o[e+4>>2]=n;o[e>>2]=n;o[e+8>>2]=n+(t<<2);return}}function Wr(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;r=e+4|0;e=n-t|0;if((e|0)>0){ix(o[r>>2]|0,t|0,e|0)|0;o[r>>2]=(o[r>>2]|0)+(e>>>2<<2)}return}function Hr(e){e=e|0;return 1073741823}function Vr(e,t,n){e=e|0;t=t|0;n=Y(n);if(Gr(t)|0?(o[e+96>>2]|0)!=0:0)e=e+92|0;else e=Et(e+60|0,o[1040+(t<<2)>>2]|0,992)|0;return Y($r(e,n))}function qr(e,t,n){e=e|0;t=t|0;n=Y(n);if(Gr(t)|0?(o[e+104>>2]|0)!=0:0)e=e+100|0;else e=Et(e+60|0,o[1e3+(t<<2)>>2]|0,992)|0;return Y($r(e,n))}function Gr(e){e=e|0;return(e|1|0)==3|0}function $r(e,t){e=e|0;t=Y(t);if((o[e+4>>2]|0)==3)t=Y(0.0);else t=Y(Nr(e,t));return Y(t)}function Yr(e,t){e=e|0;t=t|0;e=o[e>>2]|0;return((e|0)==0?(t|0)>1?t:1:e)|0}function Kr(e,t){e=e|0;t=t|0;var n=0;e:do{if((t|0)==2){switch(e|0){case 2:{e=3;break e}case 3:break;default:{n=4;break e}}e=2}else n=4}while(0);return e|0}function Xr(e,t){e=e|0;t=t|0;var n=ft;if(!((Gr(t)|0?(o[e+312>>2]|0)!=0:0)?(n=Y(s[e+308>>2]),n>=Y(0.0)):0))n=Y(NT(Y(s[(Et(e+276|0,o[1040+(t<<2)>>2]|0,992)|0)>>2]),Y(0.0)));return Y(n)}function Qr(e,t){e=e|0;t=t|0;var n=ft;if(!((Gr(t)|0?(o[e+320>>2]|0)!=0:0)?(n=Y(s[e+316>>2]),n>=Y(0.0)):0))n=Y(NT(Y(s[(Et(e+276|0,o[1e3+(t<<2)>>2]|0,992)|0)>>2]),Y(0.0)));return Y(n)}function Jr(e,t,n){e=e|0;t=t|0;n=Y(n);var r=ft;if(!((Gr(t)|0?(o[e+240>>2]|0)!=0:0)?(r=Y(Nr(e+236|0,n)),r>=Y(0.0)):0))r=Y(NT(Y(Nr(Et(e+204|0,o[1040+(t<<2)>>2]|0,992)|0,n)),Y(0.0)));return Y(r)}function Zr(e,t,n){e=e|0;t=t|0;n=Y(n);var r=ft;if(!((Gr(t)|0?(o[e+248>>2]|0)!=0:0)?(r=Y(Nr(e+244|0,n)),r>=Y(0.0)):0))r=Y(NT(Y(Nr(Et(e+204|0,o[1e3+(t<<2)>>2]|0,992)|0,n)),Y(0.0)));return Y(r)}function ei(e,t,n,r,i,u,a){e=e|0;t=Y(t);n=Y(n);r=r|0;i=i|0;u=Y(u);a=Y(a);var l=ft,c=ft,f=ft,d=ft,p=ft,v=ft,m=0,g=0,y=0;y=h;h=h+16|0;m=y;g=e+964|0;Rt(e,(o[g>>2]|0)!=0,3519);l=Y(ui(e,2,t));c=Y(ui(e,0,t));f=Y(Sr(e,2,t));d=Y(Sr(e,0,t));if(wt(t)|0)p=t;else p=Y(NT(Y(0.0),Y(Y(t-f)-l)));if(wt(n)|0)v=n;else v=Y(NT(Y(0.0),Y(Y(n-d)-c)));if((r|0)==1&(i|0)==1){s[e+908>>2]=Y(di(e,2,Y(t-f),u,u));t=Y(di(e,0,Y(n-d),a,u))}else{OA[o[g>>2]&1](m,e,p,r,v,i);p=Y(l+Y(s[m>>2]));v=Y(t-f);s[e+908>>2]=Y(di(e,2,(r|2|0)==2?p:v,u,u));v=Y(c+Y(s[m+4>>2]));t=Y(n-d);t=Y(di(e,0,(i|2|0)==2?v:t,a,u))}s[e+912>>2]=t;h=y;return}function ti(e,t,n,r,i,o,u){e=e|0;t=Y(t);n=Y(n);r=r|0;i=i|0;o=Y(o);u=Y(u);var a=ft,l=ft,c=ft,f=ft;c=Y(ui(e,2,o));a=Y(ui(e,0,o));f=Y(Sr(e,2,o));l=Y(Sr(e,0,o));t=Y(t-f);s[e+908>>2]=Y(di(e,2,(r|2|0)==2?c:t,o,o));n=Y(n-l);s[e+912>>2]=Y(di(e,0,(i|2|0)==2?a:n,u,o));return}function ni(e,t,n,r,i,o,u){e=e|0;t=Y(t);n=Y(n);r=r|0;i=i|0;o=Y(o);u=Y(u);var a=0,l=ft,c=ft;a=(r|0)==2;if((!(t<=Y(0.0)&a)?!(n<=Y(0.0)&(i|0)==2):0)?!((r|0)==1&(i|0)==1):0)e=0;else{l=Y(Sr(e,0,o));c=Y(Sr(e,2,o));a=t>2]=Y(di(e,2,a?Y(0.0):t,o,o));t=Y(n-l);a=n>2]=Y(di(e,0,a?Y(0.0):t,u,o));e=1}return e|0}function ri(e,t){e=e|0;t=t|0;if(ki(e)|0)e=Kr(2,t)|0;else e=0;return e|0}function ii(e,t,n){e=e|0;t=t|0;n=Y(n);n=Y(Jr(e,t,n));return Y(n+Y(Xr(e,t)))}function oi(e,t,n){e=e|0;t=t|0;n=Y(n);n=Y(Zr(e,t,n));return Y(n+Y(Qr(e,t)))}function ui(e,t,n){e=e|0;t=t|0;n=Y(n);var r=ft;r=Y(ii(e,t,n));return Y(r+Y(oi(e,t,n)))}function ai(e){e=e|0;if(!(o[e+24>>2]|0)){if(Y(li(e))!=Y(0.0))e=1;else e=Y(si(e))!=Y(0.0)}else e=0;return e|0}function li(e){e=e|0;var t=ft;if(o[e+944>>2]|0){t=Y(s[e+44>>2]);if(wt(t)|0){t=Y(s[e+40>>2]);e=t>Y(0.0)&((wt(t)|0)^1);return Y(e?t:Y(0.0))}}else t=Y(0.0);return Y(t)}function si(e){e=e|0;var t=ft,n=0,i=ft;do{if(o[e+944>>2]|0){t=Y(s[e+48>>2]);if(wt(t)|0){n=r[(o[e+976>>2]|0)+2>>0]|0;if(n<<24>>24==0?(i=Y(s[e+40>>2]),i>24?Y(1.0):Y(0.0)}}else t=Y(0.0)}while(0);return Y(t)}function ci(e){e=e|0;var t=0,n=0;tx(e+400|0,0,540)|0;r[e+985>>0]=1;Wt(e);n=Ot(e)|0;if(n|0){t=e+948|0;e=0;do{ci(o[(o[t>>2]|0)+(e<<2)>>2]|0);e=e+1|0}while((e|0)!=(n|0))}return}function fi(e,t,n,r,i,u,a,l,c,f){e=e|0;t=t|0;n=Y(n);r=r|0;i=Y(i);u=Y(u);a=Y(a);l=l|0;c=c|0;f=f|0;var d=0,p=ft,v=0,m=0,g=ft,y=ft,_=0,b=ft,w=0,D=ft,S=0,C=0,k=0,T=0,x=0,A=0,O=0,P=0,I=0,N=0;I=h;h=h+16|0;k=I+12|0;T=I+8|0;x=I+4|0;A=I;P=Kr(o[e+4>>2]|0,c)|0;S=Gr(P)|0;p=Y(Nr(Ti(t)|0,S?u:a));C=Ir(t,2,u)|0;O=Ir(t,0,a)|0;do{if(!(wt(p)|0)?!(wt(S?n:i)|0):0){d=t+504|0;if(!(wt(Y(s[d>>2]))|0)){if(!(xi(o[t+976>>2]|0,0)|0))break;if((o[t+500>>2]|0)==(o[2278]|0))break}s[d>>2]=Y(NT(p,Y(ui(t,P,u))))}else v=7}while(0);do{if((v|0)==7){w=S^1;if(!(w|C^1)){a=Y(Nr(o[t+992>>2]|0,u));s[t+504>>2]=Y(NT(a,Y(ui(t,2,u))));break}if(!(S|O^1)){a=Y(Nr(o[t+996>>2]|0,a));s[t+504>>2]=Y(NT(a,Y(ui(t,0,u))));break}s[k>>2]=Y(E);s[T>>2]=Y(E);o[x>>2]=0;o[A>>2]=0;b=Y(Sr(t,2,u));D=Y(Sr(t,0,u));if(C){g=Y(b+Y(Nr(o[t+992>>2]|0,u)));s[k>>2]=g;o[x>>2]=1;m=1}else{m=0;g=Y(E)}if(O){p=Y(D+Y(Nr(o[t+996>>2]|0,a)));s[T>>2]=p;o[A>>2]=1;d=1}else{d=0;p=Y(E)}v=o[e+32>>2]|0;if(!(S&(v|0)==2)){if(wt(g)|0?!(wt(n)|0):0){s[k>>2]=n;o[x>>2]=2;m=2;g=n}}else v=2;if((!((v|0)==2&w)?wt(p)|0:0)?!(wt(i)|0):0){s[T>>2]=i;o[A>>2]=2;d=2;p=i}y=Y(s[t+396>>2]);_=wt(y)|0;do{if(!_){if((m|0)==1&w){s[T>>2]=Y(Y(g-b)/y);o[A>>2]=1;d=1;v=1;break}if(S&(d|0)==1){s[k>>2]=Y(y*Y(p-D));o[x>>2]=1;d=1;v=1}else v=m}else v=m}while(0);N=wt(n)|0;m=(pi(e,t)|0)!=4;if(!(S|C|((r|0)!=1|N)|(m|(v|0)==1))?(s[k>>2]=n,o[x>>2]=1,!_):0){s[T>>2]=Y(Y(n-b)/y);o[A>>2]=1;d=1}if(!(O|w|((l|0)!=1|(wt(i)|0))|(m|(d|0)==1))?(s[T>>2]=i,o[A>>2]=1,!_):0){s[k>>2]=Y(y*Y(i-D));o[x>>2]=1}mi(t,2,u,u,x,k);mi(t,0,a,u,A,T);n=Y(s[k>>2]);i=Y(s[T>>2]);Dr(t,n,i,c,o[x>>2]|0,o[A>>2]|0,u,a,0,3565,f)|0;a=Y(s[t+908+(o[976+(P<<2)>>2]<<2)>>2]);s[t+504>>2]=Y(NT(a,Y(ui(t,P,u))))}}while(0);o[t+500>>2]=o[2278];h=I;return}function di(e,t,n,r,i){e=e|0;t=t|0;n=Y(n);r=Y(r);i=Y(i);r=Y(Di(e,t,n,r));return Y(NT(r,Y(ui(e,t,i))))}function pi(e,t){e=e|0;t=t|0;t=t+20|0;t=o[((o[t>>2]|0)==0?e+16|0:t)>>2]|0;if((t|0)==5?ki(o[e+4>>2]|0)|0:0)t=1;return t|0}function hi(e,t){e=e|0;t=t|0;if(Gr(t)|0?(o[e+96>>2]|0)!=0:0)t=4;else t=o[1040+(t<<2)>>2]|0;return e+60+(t<<3)|0}function vi(e,t){e=e|0;t=t|0;if(Gr(t)|0?(o[e+104>>2]|0)!=0:0)t=5;else t=o[1e3+(t<<2)>>2]|0;return e+60+(t<<3)|0}function mi(e,t,n,r,i,u){e=e|0;t=t|0;n=Y(n);r=Y(r);i=i|0;u=u|0;n=Y(Nr(e+380+(o[976+(t<<2)>>2]<<3)|0,n));n=Y(n+Y(Sr(e,t,r)));switch(o[i>>2]|0){case 2:case 1:{i=wt(n)|0;r=Y(s[u>>2]);s[u>>2]=i|r>2]=2;s[u>>2]=n}break}default:{}}return}function gi(e,t){e=e|0;t=t|0;e=e+132|0;if(Gr(t)|0?(o[(Et(e,4,948)|0)+4>>2]|0)!=0:0)e=1;else e=(o[(Et(e,o[1040+(t<<2)>>2]|0,948)|0)+4>>2]|0)!=0;return e|0}function yi(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0;e=e+132|0;if(Gr(t)|0?(r=Et(e,4,948)|0,(o[r+4>>2]|0)!=0):0)i=4;else{r=Et(e,o[1040+(t<<2)>>2]|0,948)|0;if(!(o[r+4>>2]|0))n=Y(0.0);else i=4}if((i|0)==4)n=Y(Nr(r,n));return Y(n)}function _i(e,t,n){e=e|0;t=t|0;n=Y(n);var r=ft;r=Y(s[e+908+(o[976+(t<<2)>>2]<<2)>>2]);r=Y(r+Y(Vr(e,t,n)));return Y(r+Y(qr(e,t,n)))}function bi(e){e=e|0;var t=0,n=0,r=0;e:do{if(!(ki(o[e+4>>2]|0)|0)){if((o[e+16>>2]|0)!=5){n=Ot(e)|0;if(!n)t=0;else{t=0;while(1){r=Pt(e,t)|0;if((o[r+24>>2]|0)==0?(o[r+20>>2]|0)==5:0){t=1;break e}t=t+1|0;if(t>>>0>=n>>>0){t=0;break}}}}else t=1}else t=0}while(0);return t|0}function wi(e,t){e=e|0;t=t|0;var n=ft;n=Y(s[e+908+(o[976+(t<<2)>>2]<<2)>>2]);return n>=Y(0.0)&((wt(n)|0)^1)|0}function Ei(e){e=e|0;var t=ft,n=0,r=0,i=0,u=0,a=0,l=0,c=ft;n=o[e+968>>2]|0;if(!n){u=Ot(e)|0;do{if(u|0){n=0;i=0;while(1){r=Pt(e,i)|0;if(o[r+940>>2]|0){a=8;break}if((o[r+24>>2]|0)!=1){l=(pi(e,r)|0)==5;if(l){n=r;break}else n=(n|0)==0?r:n}i=i+1|0;if(i>>>0>=u>>>0){a=8;break}}if((a|0)==8)if(!n)break;t=Y(Ei(n));return Y(t+Y(s[n+404>>2]))}}while(0);t=Y(s[e+912>>2])}else{c=Y(s[e+908>>2]);t=Y(s[e+912>>2]);t=Y(pA[n&0](e,c,t));Rt(e,(wt(t)|0)^1,3573)}return Y(t)}function Di(e,t,n,r){e=e|0;t=t|0;n=Y(n);r=Y(r);var i=ft,o=0;if(!(ki(t)|0)){if(Gr(t)|0){t=0;o=3}else{r=Y(E);i=Y(E)}}else{t=1;o=3}if((o|0)==3){i=Y(Nr(e+364+(t<<3)|0,r));r=Y(Nr(e+380+(t<<3)|0,r))}o=r=Y(0.0)&((wt(r)|0)^1));n=o?r:n;o=i>=Y(0.0)&((wt(i)|0)^1)&n>2]|0,u)|0;m=ri(y,u)|0;g=Gr(y)|0;p=Y(Sr(t,2,n));h=Y(Sr(t,0,n));if(!(Ir(t,2,n)|0)){if(gi(t,2)|0?Ai(t,2)|0:0){l=Y(s[e+908>>2]);c=Y(Xr(e,2));c=Y(l-Y(c+Y(Qr(e,2))));l=Y(yi(t,2,n));l=Y(di(t,2,Y(c-Y(l+Y(Oi(t,2,n)))),n,n))}else l=Y(E)}else l=Y(p+Y(Nr(o[t+992>>2]|0,n)));if(!(Ir(t,0,i)|0)){if(gi(t,0)|0?Ai(t,0)|0:0){c=Y(s[e+912>>2]);b=Y(Xr(e,0));b=Y(c-Y(b+Y(Qr(e,0))));c=Y(yi(t,0,i));c=Y(di(t,0,Y(b-Y(c+Y(Oi(t,0,i)))),i,n))}else c=Y(E)}else c=Y(h+Y(Nr(o[t+996>>2]|0,i)));f=wt(l)|0;d=wt(c)|0;do{if(f^d?(v=Y(s[t+396>>2]),!(wt(v)|0)):0)if(f){l=Y(p+Y(Y(c-h)*v));break}else{b=Y(h+Y(Y(l-p)/v));c=d?b:c;break}}while(0);d=wt(l)|0;f=wt(c)|0;if(d|f){w=(d^1)&1;r=n>Y(0.0)&((r|0)!=0&d);l=g?l:r?n:l;Dr(t,l,c,u,g?w:r?2:w,d&(f^1)&1,l,c,0,3623,a)|0;l=Y(s[t+908>>2]);l=Y(l+Y(Sr(t,2,n)));c=Y(s[t+912>>2]);c=Y(c+Y(Sr(t,0,n)))}Dr(t,l,c,u,1,1,l,c,1,3635,a)|0;if(Ai(t,y)|0?!(gi(t,y)|0):0){w=o[976+(y<<2)>>2]|0;b=Y(s[e+908+(w<<2)>>2]);b=Y(b-Y(s[t+908+(w<<2)>>2]));b=Y(b-Y(Qr(e,y)));b=Y(b-Y(qr(t,y,n)));b=Y(b-Y(Oi(t,y,g?n:i)));s[t+400+(o[1040+(y<<2)>>2]<<2)>>2]=b}else _=21;do{if((_|0)==21){if(!(gi(t,y)|0)?(o[e+8>>2]|0)==1:0){w=o[976+(y<<2)>>2]|0;b=Y(s[e+908+(w<<2)>>2]);b=Y(Y(b-Y(s[t+908+(w<<2)>>2]))*Y(.5));s[t+400+(o[1040+(y<<2)>>2]<<2)>>2]=b;break}if(!(gi(t,y)|0)?(o[e+8>>2]|0)==2:0){w=o[976+(y<<2)>>2]|0;b=Y(s[e+908+(w<<2)>>2]);b=Y(b-Y(s[t+908+(w<<2)>>2]));s[t+400+(o[1040+(y<<2)>>2]<<2)>>2]=b}}}while(0);if(Ai(t,m)|0?!(gi(t,m)|0):0){w=o[976+(m<<2)>>2]|0;b=Y(s[e+908+(w<<2)>>2]);b=Y(b-Y(s[t+908+(w<<2)>>2]));b=Y(b-Y(Qr(e,m)));b=Y(b-Y(qr(t,m,n)));b=Y(b-Y(Oi(t,m,g?i:n)));s[t+400+(o[1040+(m<<2)>>2]<<2)>>2]=b}else _=30;do{if((_|0)==30?!(gi(t,m)|0):0){if((pi(e,t)|0)==2){w=o[976+(m<<2)>>2]|0;b=Y(s[e+908+(w<<2)>>2]);b=Y(Y(b-Y(s[t+908+(w<<2)>>2]))*Y(.5));s[t+400+(o[1040+(m<<2)>>2]<<2)>>2]=b;break}w=(pi(e,t)|0)==3;if(w^(o[e+28>>2]|0)==2){w=o[976+(m<<2)>>2]|0;b=Y(s[e+908+(w<<2)>>2]);b=Y(b-Y(s[t+908+(w<<2)>>2]));s[t+400+(o[1040+(m<<2)>>2]<<2)>>2]=b}}}while(0);return}function Ci(e,t,n){e=e|0;t=t|0;n=n|0;var r=ft,i=0;i=o[976+(n<<2)>>2]|0;r=Y(s[t+908+(i<<2)>>2]);r=Y(Y(s[e+908+(i<<2)>>2])-r);r=Y(r-Y(s[t+400+(o[1040+(n<<2)>>2]<<2)>>2]));s[t+400+(o[1e3+(n<<2)>>2]<<2)>>2]=r;return}function ki(e){e=e|0;return(e|1|0)==1|0}function Ti(e){e=e|0;var t=ft;switch(o[e+56>>2]|0){case 0:case 3:{t=Y(s[e+40>>2]);if(t>Y(0.0)&((wt(t)|0)^1))e=r[(o[e+976>>2]|0)+2>>0]|0?1056:992;else e=1056;break}default:e=e+52|0}return e|0}function xi(e,t){e=e|0;t=t|0;return(r[e+t>>0]|0)!=0|0}function Ai(e,t){e=e|0;t=t|0;e=e+132|0;if(Gr(t)|0?(o[(Et(e,5,948)|0)+4>>2]|0)!=0:0)e=1;else e=(o[(Et(e,o[1e3+(t<<2)>>2]|0,948)|0)+4>>2]|0)!=0;return e|0}function Oi(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0;e=e+132|0;if(Gr(t)|0?(r=Et(e,5,948)|0,(o[r+4>>2]|0)!=0):0)i=4;else{r=Et(e,o[1e3+(t<<2)>>2]|0,948)|0;if(!(o[r+4>>2]|0))n=Y(0.0);else i=4}if((i|0)==4)n=Y(Nr(r,n));return Y(n)}function Pi(e,t,n){e=e|0;t=t|0;n=Y(n);if(gi(e,t)|0)n=Y(yi(e,t,n));else n=Y(-Y(Oi(e,t,n)));return Y(n)}function Ii(e){e=Y(e);return(s[d>>2]=e,o[d>>2]|0)|0}function Ni(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>1073741823)Ye();else{i=$T(t<<2)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<2)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<2);return}function Mi(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>2)<<2)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Ri(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-4-t|0)>>>2)<<2);e=o[e>>2]|0;if(e|0)KT(e);return}function Fi(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0;a=e+4|0;l=o[a>>2]|0;i=l-r|0;u=i>>2;e=t+(u<<2)|0;if(e>>>0>>0){r=l;do{o[r>>2]=o[e>>2];e=e+4|0;r=(o[a>>2]|0)+4|0;o[a>>2]=r}while(e>>>0>>0)}if(u|0)sx(l+(0-u<<2)|0,t|0,i|0)|0;return}function Li(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0;l=t+4|0;s=o[l>>2]|0;i=o[e>>2]|0;a=n;u=a-i|0;r=s+(0-(u>>2)<<2)|0;o[l>>2]=r;if((u|0)>0)ix(r|0,i|0,u|0)|0;i=e+4|0;u=t+8|0;r=(o[i>>2]|0)-a|0;if((r|0)>0){ix(o[u>>2]|0,n|0,r|0)|0;o[u>>2]=(o[u>>2]|0)+(r>>>2<<2)}a=o[e>>2]|0;o[e>>2]=o[l>>2];o[l>>2]=a;a=o[i>>2]|0;o[i>>2]=o[u>>2];o[u>>2]=a;a=e+8|0;n=t+12|0;e=o[a>>2]|0;o[a>>2]=o[n>>2];o[n>>2]=e;o[t>>2]=o[l>>2];return s|0}function Bi(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;a=o[t>>2]|0;u=o[n>>2]|0;if((a|0)!=(u|0)){i=e+8|0;n=((u+-4-a|0)>>>2)+1|0;e=a;r=o[i>>2]|0;do{o[r>>2]=o[e>>2];r=(o[i>>2]|0)+4|0;o[i>>2]=r;e=e+4|0}while((e|0)!=(u|0));o[t>>2]=a+(n<<2)}return}function ji(){_t();return}function Ui(){var e=0;e=$T(4)|0;zi(e);return e|0}function zi(e){e=e|0;o[e>>2]=Lt()|0;return}function Wi(e){e=e|0;if(e|0){Hi(e);KT(e)}return}function Hi(e){e=e|0;jt(o[e>>2]|0);return}function Vi(e,t,n){e=e|0;t=t|0;n=n|0;jr(o[e>>2]|0,t,n);return}function qi(e,t){e=e|0;t=Y(t);Ar(o[e>>2]|0,t);return}function Gi(e,t){e=e|0;t=t|0;return xi(o[e>>2]|0,t)|0}function $i(){var e=0;e=$T(8)|0;Yi(e,0);return e|0}function Yi(e,t){e=e|0;t=t|0;if(!t)t=Ct()|0;else t=Dt(o[t>>2]|0)|0;o[e>>2]=t;o[e+4>>2]=0;Jt(t,e);return}function Ki(e){e=e|0;var t=0;t=$T(8)|0;Yi(t,e);return t|0}function Xi(e){e=e|0;if(e|0){Qi(e);KT(e)}return}function Qi(e){e=e|0;var t=0;xt(o[e>>2]|0);t=e+4|0;e=o[t>>2]|0;o[t>>2]=0;if(e|0){Ji(e);KT(e)}return}function Ji(e){e=e|0;Zi(e);return}function Zi(e){e=e|0;e=o[e>>2]|0;if(e|0)rt(e|0);return}function eo(e){e=e|0;return Zt(e)|0}function to(e){e=e|0;var t=0,n=0;n=e+4|0;t=o[n>>2]|0;o[n>>2]=0;if(t|0){Ji(t);KT(t)}Mt(o[e>>2]|0);return}function no(e,t){e=e|0;t=t|0;Kt(o[e>>2]|0,o[t>>2]|0);return}function ro(e,t){e=e|0;t=t|0;fn(o[e>>2]|0,t);return}function io(e,t,n){e=e|0;t=t|0;n=+n;Cn(o[e>>2]|0,t,Y(n));return}function oo(e,t,n){e=e|0;t=t|0;n=+n;kn(o[e>>2]|0,t,Y(n));return}function uo(e,t){e=e|0;t=t|0;on(o[e>>2]|0,t);return}function ao(e,t){e=e|0;t=t|0;an(o[e>>2]|0,t);return}function lo(e,t){e=e|0;t=t|0;sn(o[e>>2]|0,t);return}function so(e,t){e=e|0;t=t|0;en(o[e>>2]|0,t);return}function co(e,t){e=e|0;t=t|0;pn(o[e>>2]|0,t);return}function fo(e,t){e=e|0;t=t|0;nn(o[e>>2]|0,t);return}function po(e,t,n){e=e|0;t=t|0;n=+n;xn(o[e>>2]|0,t,Y(n));return}function ho(e,t,n){e=e|0;t=t|0;n=+n;An(o[e>>2]|0,t,Y(n));return}function vo(e,t){e=e|0;t=t|0;Pn(o[e>>2]|0,t);return}function mo(e,t){e=e|0;t=t|0;vn(o[e>>2]|0,t);return}function go(e,t){e=e|0;t=t|0;gn(o[e>>2]|0,t);return}function yo(e,t){e=e|0;t=+t;_n(o[e>>2]|0,Y(t));return}function _o(e,t){e=e|0;t=+t;En(o[e>>2]|0,Y(t));return}function bo(e,t){e=e|0;t=+t;Dn(o[e>>2]|0,Y(t));return}function wo(e,t){e=e|0;t=+t;bn(o[e>>2]|0,Y(t));return}function Eo(e,t){e=e|0;t=+t;wn(o[e>>2]|0,Y(t));return}function Do(e,t){e=e|0;t=+t;Ln(o[e>>2]|0,Y(t));return}function So(e,t){e=e|0;t=+t;Bn(o[e>>2]|0,Y(t));return}function Co(e){e=e|0;jn(o[e>>2]|0);return}function ko(e,t){e=e|0;t=+t;zn(o[e>>2]|0,Y(t));return}function To(e,t){e=e|0;t=+t;Wn(o[e>>2]|0,Y(t));return}function xo(e){e=e|0;Hn(o[e>>2]|0);return}function Ao(e,t){e=e|0;t=+t;qn(o[e>>2]|0,Y(t));return}function Oo(e,t){e=e|0;t=+t;Gn(o[e>>2]|0,Y(t));return}function Po(e,t){e=e|0;t=+t;Yn(o[e>>2]|0,Y(t));return}function Io(e,t){e=e|0;t=+t;Kn(o[e>>2]|0,Y(t));return}function No(e,t){e=e|0;t=+t;Qn(o[e>>2]|0,Y(t));return}function Mo(e,t){e=e|0;t=+t;Jn(o[e>>2]|0,Y(t));return}function Ro(e,t){e=e|0;t=+t;er(o[e>>2]|0,Y(t));return}function Fo(e,t){e=e|0;t=+t;tr(o[e>>2]|0,Y(t));return}function Lo(e,t){e=e|0;t=+t;rr(o[e>>2]|0,Y(t));return}function Bo(e,t,n){e=e|0;t=t|0;n=+n;Rn(o[e>>2]|0,t,Y(n));return}function jo(e,t,n){e=e|0;t=t|0;n=+n;In(o[e>>2]|0,t,Y(n));return}function Uo(e,t,n){e=e|0;t=t|0;n=+n;Nn(o[e>>2]|0,t,Y(n));return}function zo(e){e=e|0;return dn(o[e>>2]|0)|0}function Wo(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0;r=h;h=h+16|0;i=r;Tn(i,o[t>>2]|0,n);Ho(e,i);h=r;return}function Ho(e,t){e=e|0;t=t|0;Vo(e,o[t+4>>2]|0,+Y(s[t>>2]));return}function Vo(e,t,n){e=e|0;t=t|0;n=+n;o[e>>2]=t;c[e+8>>3]=n;return}function qo(e){e=e|0;return un(o[e>>2]|0)|0}function Go(e){e=e|0;return ln(o[e>>2]|0)|0}function $o(e){e=e|0;return cn(o[e>>2]|0)|0}function Yo(e){e=e|0;return tn(o[e>>2]|0)|0}function Ko(e){e=e|0;return hn(o[e>>2]|0)|0}function Xo(e){e=e|0;return rn(o[e>>2]|0)|0}function Qo(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0;r=h;h=h+16|0;i=r;On(i,o[t>>2]|0,n);Ho(e,i);h=r;return}function Jo(e){e=e|0;return mn(o[e>>2]|0)|0}function Zo(e){e=e|0;return yn(o[e>>2]|0)|0}function eu(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;Sn(r,o[t>>2]|0);Ho(e,r);h=n;return}function tu(e){e=e|0;return+ +Y(Xt(o[e>>2]|0))}function nu(e){e=e|0;return+ +Y(Qt(o[e>>2]|0))}function ru(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;Un(r,o[t>>2]|0);Ho(e,r);h=n;return}function iu(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;Vn(r,o[t>>2]|0);Ho(e,r);h=n;return}function ou(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;$n(r,o[t>>2]|0);Ho(e,r);h=n;return}function uu(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;Xn(r,o[t>>2]|0);Ho(e,r);h=n;return}function au(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;Zn(r,o[t>>2]|0);Ho(e,r);h=n;return}function lu(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;nr(r,o[t>>2]|0);Ho(e,r);h=n;return}function su(e){e=e|0;return+ +Y(ir(o[e>>2]|0))}function cu(e,t){e=e|0;t=t|0;return+ +Y(Fn(o[e>>2]|0,t))}function fu(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0;r=h;h=h+16|0;i=r;Mn(i,o[t>>2]|0,n);Ho(e,i);h=r;return}function du(e,t,n){e=e|0;t=t|0;n=n|0;zt(o[e>>2]|0,o[t>>2]|0,n);return}function pu(e,t){e=e|0;t=t|0;Nt(o[e>>2]|0,o[t>>2]|0);return}function hu(e){e=e|0;return Ot(o[e>>2]|0)|0}function vu(e){e=e|0;e=Gt(o[e>>2]|0)|0;if(!e)e=0;else e=eo(e)|0;return e|0}function mu(e,t){e=e|0;t=t|0;e=Pt(o[e>>2]|0,t)|0;if(!e)e=0;else e=eo(e)|0;return e|0}function gu(e,t){e=e|0;t=t|0;var n=0,r=0;r=$T(4)|0;yu(r,t);n=e+4|0;t=o[n>>2]|0;o[n>>2]=r;if(t|0){Ji(t);KT(t)}Ut(o[e>>2]|0,1);return}function yu(e,t){e=e|0;t=t|0;Bu(e,t);return}function _u(e,t,n,r,i,o){e=e|0;t=t|0;n=Y(n);r=r|0;i=Y(i);o=o|0;var u=0,a=0;u=h;h=h+16|0;a=u;bu(a,Zt(t)|0,+n,r,+i,o);s[e>>2]=Y(+c[a>>3]);s[e+4>>2]=Y(+c[a+8>>3]);h=u;return}function bu(e,t,n,r,i,u){e=e|0;t=t|0;n=+n;r=r|0;i=+i;u=u|0;var a=0,l=0,s=0,f=0,d=0;a=h;h=h+32|0;d=a+8|0;f=a+20|0;s=a;l=a+16|0;c[d>>3]=n;o[f>>2]=r;c[s>>3]=i;o[l>>2]=u;wu(e,o[t+4>>2]|0,d,f,s,l);h=a;return}function wu(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;var a=0,l=0;a=h;h=h+16|0;l=a;Dk(l);t=Eu(t)|0;Du(e,t,+c[n>>3],o[r>>2]|0,+c[i>>3],o[u>>2]|0);Ck(l);h=a;return}function Eu(e){e=e|0;return o[e>>2]|0}function Du(e,t,n,r,i,o){e=e|0;t=t|0;n=+n;r=r|0;i=+i;o=o|0;var u=0;u=Cu(Su()|0)|0;n=+ku(n);r=Tu(r)|0;i=+ku(i);xu(e,ot(0,u|0,t|0,+n,r|0,+i,Tu(o)|0)|0);return}function Su(){var e=0;if(!(r[7608]|0)){Ru(9120);e=7608;o[e>>2]=1;o[e+4>>2]=0}return 9120}function Cu(e){e=e|0;return o[e+8>>2]|0}function ku(e){e=+e;return+ +Mu(e)}function Tu(e){e=e|0;return Nu(e)|0}function xu(e,t){e=e|0;t=t|0;var n=0,r=0,i=0;i=h;h=h+32|0;n=i;r=t;if(!(r&1)){o[e>>2]=o[t>>2];o[e+4>>2]=o[t+4>>2];o[e+8>>2]=o[t+8>>2];o[e+12>>2]=o[t+12>>2]}else{Au(n,0);Be(r|0,n|0)|0;Ou(e,n);Pu(n)}h=i;return}function Au(e,t){e=e|0;t=t|0;Iu(e,t);o[e+8>>2]=0;r[e+24>>0]=0;return}function Ou(e,t){e=e|0;t=t|0;t=t+8|0;o[e>>2]=o[t>>2];o[e+4>>2]=o[t+4>>2];o[e+8>>2]=o[t+8>>2];o[e+12>>2]=o[t+12>>2];return}function Pu(e){e=e|0;r[e+24>>0]=0;return}function Iu(e,t){e=e|0;t=t|0;o[e>>2]=t;return}function Nu(e){e=e|0;return e|0}function Mu(e){e=+e;return+e}function Ru(e){e=e|0;Lu(e,Fu()|0,4);return}function Fu(){return 1064}function Lu(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;o[e+8>>2]=tt(t|0,n+1|0)|0;return}function Bu(e,t){e=e|0;t=t|0;t=o[t>>2]|0;o[e>>2]=t;Ae(t|0);return}function ju(e){e=e|0;var t=0,n=0;n=e+4|0;t=o[n>>2]|0;o[n>>2]=0;if(t|0){Ji(t);KT(t)}Ut(o[e>>2]|0,0);return}function Uu(e){e=e|0;$t(o[e>>2]|0);return}function zu(e){e=e|0;return Yt(o[e>>2]|0)|0}function Wu(e,t,n,r){e=e|0;t=+t;n=+n;r=r|0;Or(o[e>>2]|0,Y(t),Y(n),r);return}function Hu(e){e=e|0;return+ +Y(or(o[e>>2]|0))}function Vu(e){e=e|0;return+ +Y(ar(o[e>>2]|0))}function qu(e){e=e|0;return+ +Y(ur(o[e>>2]|0))}function Gu(e){e=e|0;return+ +Y(lr(o[e>>2]|0))}function $u(e){e=e|0;return+ +Y(sr(o[e>>2]|0))}function Yu(e){e=e|0;return+ +Y(cr(o[e>>2]|0))}function Ku(e,t){e=e|0;t=t|0;c[e>>3]=+Y(or(o[t>>2]|0));c[e+8>>3]=+Y(ar(o[t>>2]|0));c[e+16>>3]=+Y(ur(o[t>>2]|0));c[e+24>>3]=+Y(lr(o[t>>2]|0));c[e+32>>3]=+Y(sr(o[t>>2]|0));c[e+40>>3]=+Y(cr(o[t>>2]|0));return}function Xu(e,t){e=e|0;t=t|0;return+ +Y(fr(o[e>>2]|0,t))}function Qu(e,t){e=e|0;t=t|0;return+ +Y(dr(o[e>>2]|0,t))}function Ju(e,t){e=e|0;t=t|0;return+ +Y(pr(o[e>>2]|0,t))}function Zu(){return Ft()|0}function ea(){ta();na();ra();ia();oa();ua();return}function ta(){zb(11713,4938,1);return}function na(){tb(10448);return}function ra(){R_(10408);return}function ia(){Jy(10324);return}function oa(){qm(10096);return}function ua(){aa(9132);return}function aa(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0,y=0,_=0,b=0,w=0,E=0,D=0,S=0,C=0,k=0,T=0,x=0,A=0,O=0,P=0,I=0,N=0,M=0,R=0,F=0,L=0,B=0,j=0,U=0,z=0,W=0,H=0,V=0,q=0,G=0,$=0,Y=0,K=0,X=0,Q=0,J=0,Z=0,ee=0,te=0,ne=0,re=0,ie=0,oe=0,ue=0,ae=0,le=0,se=0,ce=0,fe=0,de=0,pe=0,he=0,ve=0,me=0,ge=0,ye=0,_e=0,be=0,we=0,Ee=0,De=0,Se=0,Ce=0,ke=0,Te=0,xe=0,Ae=0,Oe=0,Pe=0,Ie=0;t=h;h=h+672|0;n=t+656|0;Ie=t+648|0;Pe=t+640|0;Oe=t+632|0;Ae=t+624|0;xe=t+616|0;Te=t+608|0;ke=t+600|0;Ce=t+592|0;Se=t+584|0;De=t+576|0;Ee=t+568|0;we=t+560|0;be=t+552|0;_e=t+544|0;ye=t+536|0;ge=t+528|0;me=t+520|0;ve=t+512|0;he=t+504|0;pe=t+496|0;de=t+488|0;fe=t+480|0;ce=t+472|0;se=t+464|0;le=t+456|0;ae=t+448|0;ue=t+440|0;oe=t+432|0;ie=t+424|0;re=t+416|0;ne=t+408|0;te=t+400|0;ee=t+392|0;Z=t+384|0;J=t+376|0;Q=t+368|0;X=t+360|0;K=t+352|0;Y=t+344|0;$=t+336|0;G=t+328|0;q=t+320|0;V=t+312|0;H=t+304|0;W=t+296|0;z=t+288|0;U=t+280|0;j=t+272|0;B=t+264|0;L=t+256|0;F=t+248|0;R=t+240|0;M=t+232|0;N=t+224|0;I=t+216|0;P=t+208|0;O=t+200|0;A=t+192|0;x=t+184|0;T=t+176|0;k=t+168|0;C=t+160|0;S=t+152|0;D=t+144|0;E=t+136|0;w=t+128|0;b=t+120|0;_=t+112|0;y=t+104|0;g=t+96|0;m=t+88|0;v=t+80|0;p=t+72|0;d=t+64|0;f=t+56|0;c=t+48|0;s=t+40|0;l=t+32|0;a=t+24|0;u=t+16|0;i=t+8|0;r=t;la(e,3646);sa(e,3651,2)|0;ca(e,3665,2)|0;fa(e,3682,18)|0;o[Ie>>2]=19;o[Ie+4>>2]=0;o[n>>2]=o[Ie>>2];o[n+4>>2]=o[Ie+4>>2];da(e,3690,n)|0;o[Pe>>2]=1;o[Pe+4>>2]=0;o[n>>2]=o[Pe>>2];o[n+4>>2]=o[Pe+4>>2];pa(e,3696,n)|0;o[Oe>>2]=2;o[Oe+4>>2]=0;o[n>>2]=o[Oe>>2];o[n+4>>2]=o[Oe+4>>2];ha(e,3706,n)|0;o[Ae>>2]=1;o[Ae+4>>2]=0;o[n>>2]=o[Ae>>2];o[n+4>>2]=o[Ae+4>>2];va(e,3722,n)|0;o[xe>>2]=2;o[xe+4>>2]=0;o[n>>2]=o[xe>>2];o[n+4>>2]=o[xe+4>>2];va(e,3734,n)|0;o[Te>>2]=3;o[Te+4>>2]=0;o[n>>2]=o[Te>>2];o[n+4>>2]=o[Te+4>>2];ha(e,3753,n)|0;o[ke>>2]=4;o[ke+4>>2]=0;o[n>>2]=o[ke>>2];o[n+4>>2]=o[ke+4>>2];ha(e,3769,n)|0;o[Ce>>2]=5;o[Ce+4>>2]=0;o[n>>2]=o[Ce>>2];o[n+4>>2]=o[Ce+4>>2];ha(e,3783,n)|0;o[Se>>2]=6;o[Se+4>>2]=0;o[n>>2]=o[Se>>2];o[n+4>>2]=o[Se+4>>2];ha(e,3796,n)|0;o[De>>2]=7;o[De+4>>2]=0;o[n>>2]=o[De>>2];o[n+4>>2]=o[De+4>>2];ha(e,3813,n)|0;o[Ee>>2]=8;o[Ee+4>>2]=0;o[n>>2]=o[Ee>>2];o[n+4>>2]=o[Ee+4>>2];ha(e,3825,n)|0;o[we>>2]=3;o[we+4>>2]=0;o[n>>2]=o[we>>2];o[n+4>>2]=o[we+4>>2];va(e,3843,n)|0;o[be>>2]=4;o[be+4>>2]=0;o[n>>2]=o[be>>2];o[n+4>>2]=o[be+4>>2];va(e,3853,n)|0;o[_e>>2]=9;o[_e+4>>2]=0;o[n>>2]=o[_e>>2];o[n+4>>2]=o[_e+4>>2];ha(e,3870,n)|0;o[ye>>2]=10;o[ye+4>>2]=0;o[n>>2]=o[ye>>2];o[n+4>>2]=o[ye+4>>2];ha(e,3884,n)|0;o[ge>>2]=11;o[ge+4>>2]=0;o[n>>2]=o[ge>>2];o[n+4>>2]=o[ge+4>>2];ha(e,3896,n)|0;o[me>>2]=1;o[me+4>>2]=0;o[n>>2]=o[me>>2];o[n+4>>2]=o[me+4>>2];ma(e,3907,n)|0;o[ve>>2]=2;o[ve+4>>2]=0;o[n>>2]=o[ve>>2];o[n+4>>2]=o[ve+4>>2];ma(e,3915,n)|0;o[he>>2]=3;o[he+4>>2]=0;o[n>>2]=o[he>>2];o[n+4>>2]=o[he+4>>2];ma(e,3928,n)|0;o[pe>>2]=4;o[pe+4>>2]=0;o[n>>2]=o[pe>>2];o[n+4>>2]=o[pe+4>>2];ma(e,3948,n)|0;o[de>>2]=5;o[de+4>>2]=0;o[n>>2]=o[de>>2];o[n+4>>2]=o[de+4>>2];ma(e,3960,n)|0;o[fe>>2]=6;o[fe+4>>2]=0;o[n>>2]=o[fe>>2];o[n+4>>2]=o[fe+4>>2];ma(e,3974,n)|0;o[ce>>2]=7;o[ce+4>>2]=0;o[n>>2]=o[ce>>2];o[n+4>>2]=o[ce+4>>2];ma(e,3983,n)|0;o[se>>2]=20;o[se+4>>2]=0;o[n>>2]=o[se>>2];o[n+4>>2]=o[se+4>>2];da(e,3999,n)|0;o[le>>2]=8;o[le+4>>2]=0;o[n>>2]=o[le>>2];o[n+4>>2]=o[le+4>>2];ma(e,4012,n)|0;o[ae>>2]=9;o[ae+4>>2]=0;o[n>>2]=o[ae>>2];o[n+4>>2]=o[ae+4>>2];ma(e,4022,n)|0;o[ue>>2]=21;o[ue+4>>2]=0;o[n>>2]=o[ue>>2];o[n+4>>2]=o[ue+4>>2];da(e,4039,n)|0;o[oe>>2]=10;o[oe+4>>2]=0;o[n>>2]=o[oe>>2];o[n+4>>2]=o[oe+4>>2];ma(e,4053,n)|0;o[ie>>2]=11;o[ie+4>>2]=0;o[n>>2]=o[ie>>2];o[n+4>>2]=o[ie+4>>2];ma(e,4065,n)|0;o[re>>2]=12;o[re+4>>2]=0;o[n>>2]=o[re>>2];o[n+4>>2]=o[re+4>>2];ma(e,4084,n)|0;o[ne>>2]=13;o[ne+4>>2]=0;o[n>>2]=o[ne>>2];o[n+4>>2]=o[ne+4>>2];ma(e,4097,n)|0;o[te>>2]=14;o[te+4>>2]=0;o[n>>2]=o[te>>2];o[n+4>>2]=o[te+4>>2];ma(e,4117,n)|0;o[ee>>2]=15;o[ee+4>>2]=0;o[n>>2]=o[ee>>2];o[n+4>>2]=o[ee+4>>2];ma(e,4129,n)|0;o[Z>>2]=16;o[Z+4>>2]=0;o[n>>2]=o[Z>>2];o[n+4>>2]=o[Z+4>>2];ma(e,4148,n)|0;o[J>>2]=17;o[J+4>>2]=0;o[n>>2]=o[J>>2];o[n+4>>2]=o[J+4>>2];ma(e,4161,n)|0;o[Q>>2]=18;o[Q+4>>2]=0;o[n>>2]=o[Q>>2];o[n+4>>2]=o[Q+4>>2];ma(e,4181,n)|0;o[X>>2]=5;o[X+4>>2]=0;o[n>>2]=o[X>>2];o[n+4>>2]=o[X+4>>2];va(e,4196,n)|0;o[K>>2]=6;o[K+4>>2]=0;o[n>>2]=o[K>>2];o[n+4>>2]=o[K+4>>2];va(e,4206,n)|0;o[Y>>2]=7;o[Y+4>>2]=0;o[n>>2]=o[Y>>2];o[n+4>>2]=o[Y+4>>2];va(e,4217,n)|0;o[$>>2]=3;o[$+4>>2]=0;o[n>>2]=o[$>>2];o[n+4>>2]=o[$+4>>2];ga(e,4235,n)|0;o[G>>2]=1;o[G+4>>2]=0;o[n>>2]=o[G>>2];o[n+4>>2]=o[G+4>>2];ya(e,4251,n)|0;o[q>>2]=4;o[q+4>>2]=0;o[n>>2]=o[q>>2];o[n+4>>2]=o[q+4>>2];ga(e,4263,n)|0;o[V>>2]=5;o[V+4>>2]=0;o[n>>2]=o[V>>2];o[n+4>>2]=o[V+4>>2];ga(e,4279,n)|0;o[H>>2]=6;o[H+4>>2]=0;o[n>>2]=o[H>>2];o[n+4>>2]=o[H+4>>2];ga(e,4293,n)|0;o[W>>2]=7;o[W+4>>2]=0;o[n>>2]=o[W>>2];o[n+4>>2]=o[W+4>>2];ga(e,4306,n)|0;o[z>>2]=8;o[z+4>>2]=0;o[n>>2]=o[z>>2];o[n+4>>2]=o[z+4>>2];ga(e,4323,n)|0;o[U>>2]=9;o[U+4>>2]=0;o[n>>2]=o[U>>2];o[n+4>>2]=o[U+4>>2];ga(e,4335,n)|0;o[j>>2]=2;o[j+4>>2]=0;o[n>>2]=o[j>>2];o[n+4>>2]=o[j+4>>2];ya(e,4353,n)|0;o[B>>2]=12;o[B+4>>2]=0;o[n>>2]=o[B>>2];o[n+4>>2]=o[B+4>>2];_a(e,4363,n)|0;o[L>>2]=1;o[L+4>>2]=0;o[n>>2]=o[L>>2];o[n+4>>2]=o[L+4>>2];ba(e,4376,n)|0;o[F>>2]=2;o[F+4>>2]=0;o[n>>2]=o[F>>2];o[n+4>>2]=o[F+4>>2];ba(e,4388,n)|0;o[R>>2]=13;o[R+4>>2]=0;o[n>>2]=o[R>>2];o[n+4>>2]=o[R+4>>2];_a(e,4402,n)|0;o[M>>2]=14;o[M+4>>2]=0;o[n>>2]=o[M>>2];o[n+4>>2]=o[M+4>>2];_a(e,4411,n)|0;o[N>>2]=15;o[N+4>>2]=0;o[n>>2]=o[N>>2];o[n+4>>2]=o[N+4>>2];_a(e,4421,n)|0;o[I>>2]=16;o[I+4>>2]=0;o[n>>2]=o[I>>2];o[n+4>>2]=o[I+4>>2];_a(e,4433,n)|0;o[P>>2]=17;o[P+4>>2]=0;o[n>>2]=o[P>>2];o[n+4>>2]=o[P+4>>2];_a(e,4446,n)|0;o[O>>2]=18;o[O+4>>2]=0;o[n>>2]=o[O>>2];o[n+4>>2]=o[O+4>>2];_a(e,4458,n)|0;o[A>>2]=3;o[A+4>>2]=0;o[n>>2]=o[A>>2];o[n+4>>2]=o[A+4>>2];ba(e,4471,n)|0;o[x>>2]=1;o[x+4>>2]=0;o[n>>2]=o[x>>2];o[n+4>>2]=o[x+4>>2];wa(e,4486,n)|0;o[T>>2]=10;o[T+4>>2]=0;o[n>>2]=o[T>>2];o[n+4>>2]=o[T+4>>2];ga(e,4496,n)|0;o[k>>2]=11;o[k+4>>2]=0;o[n>>2]=o[k>>2];o[n+4>>2]=o[k+4>>2];ga(e,4508,n)|0;o[C>>2]=3;o[C+4>>2]=0;o[n>>2]=o[C>>2];o[n+4>>2]=o[C+4>>2];ya(e,4519,n)|0;o[S>>2]=4;o[S+4>>2]=0;o[n>>2]=o[S>>2];o[n+4>>2]=o[S+4>>2];Ea(e,4530,n)|0;o[D>>2]=19;o[D+4>>2]=0;o[n>>2]=o[D>>2];o[n+4>>2]=o[D+4>>2];Da(e,4542,n)|0;o[E>>2]=12;o[E+4>>2]=0;o[n>>2]=o[E>>2];o[n+4>>2]=o[E+4>>2];Sa(e,4554,n)|0;o[w>>2]=13;o[w+4>>2]=0;o[n>>2]=o[w>>2];o[n+4>>2]=o[w+4>>2];Ca(e,4568,n)|0;o[b>>2]=2;o[b+4>>2]=0;o[n>>2]=o[b>>2];o[n+4>>2]=o[b+4>>2];ka(e,4578,n)|0;o[_>>2]=20;o[_+4>>2]=0;o[n>>2]=o[_>>2];o[n+4>>2]=o[_+4>>2];Ta(e,4587,n)|0;o[y>>2]=22;o[y+4>>2]=0;o[n>>2]=o[y>>2];o[n+4>>2]=o[y+4>>2];da(e,4602,n)|0;o[g>>2]=23;o[g+4>>2]=0;o[n>>2]=o[g>>2];o[n+4>>2]=o[g+4>>2];da(e,4619,n)|0;o[m>>2]=14;o[m+4>>2]=0;o[n>>2]=o[m>>2];o[n+4>>2]=o[m+4>>2];xa(e,4629,n)|0;o[v>>2]=1;o[v+4>>2]=0;o[n>>2]=o[v>>2];o[n+4>>2]=o[v+4>>2];Aa(e,4637,n)|0;o[p>>2]=4;o[p+4>>2]=0;o[n>>2]=o[p>>2];o[n+4>>2]=o[p+4>>2];ba(e,4653,n)|0;o[d>>2]=5;o[d+4>>2]=0;o[n>>2]=o[d>>2];o[n+4>>2]=o[d+4>>2];ba(e,4669,n)|0;o[f>>2]=6;o[f+4>>2]=0;o[n>>2]=o[f>>2];o[n+4>>2]=o[f+4>>2];ba(e,4686,n)|0;o[c>>2]=7;o[c+4>>2]=0;o[n>>2]=o[c>>2];o[n+4>>2]=o[c+4>>2];ba(e,4701,n)|0;o[s>>2]=8;o[s+4>>2]=0;o[n>>2]=o[s>>2];o[n+4>>2]=o[s+4>>2];ba(e,4719,n)|0;o[l>>2]=9;o[l+4>>2]=0;o[n>>2]=o[l>>2];o[n+4>>2]=o[l+4>>2];ba(e,4736,n)|0;o[a>>2]=21;o[a+4>>2]=0;o[n>>2]=o[a>>2];o[n+4>>2]=o[a+4>>2];Oa(e,4754,n)|0;o[u>>2]=2;o[u+4>>2]=0;o[n>>2]=o[u>>2];o[n+4>>2]=o[u+4>>2];wa(e,4772,n)|0;o[i>>2]=3;o[i+4>>2]=0;o[n>>2]=o[i>>2];o[n+4>>2]=o[i+4>>2];wa(e,4790,n)|0;o[r>>2]=4;o[r+4>>2]=0;o[n>>2]=o[r>>2];o[n+4>>2]=o[r+4>>2];wa(e,4808,n)|0;h=t;return}function la(e,t){e=e|0;t=t|0;var n=0;n=Mm()|0;o[e>>2]=n;Rm(n,t);cw(o[e>>2]|0);return}function sa(e,t,n){e=e|0;t=t|0;n=n|0;gm(e,Ia(t)|0,n,0);return e|0}function ca(e,t,n){e=e|0;t=t|0;n=n|0;Xv(e,Ia(t)|0,n,0);return e|0}function fa(e,t,n){e=e|0;t=t|0;n=n|0;Nv(e,Ia(t)|0,n,0);return e|0}function da(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];hv(e,t,i);h=r;return e|0}function pa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Gh(e,t,i);h=r;return e|0}function ha(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Th(e,t,i);h=r;return e|0}function va(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];lh(e,t,i);h=r;return e|0}function ma(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Hp(e,t,i);h=r;return e|0}function ga(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Sp(e,t,i);h=r;return e|0}function ya(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];op(e,t,i);h=r;return e|0}function _a(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Cd(e,t,i);h=r;return e|0}function ba(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];ud(e,t,i);h=r;return e|0}function wa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];zf(e,t,i);h=r;return e|0}function Ea(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Ef(e,t,i);h=r;return e|0}function Da(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Zc(e,t,i);h=r;return e|0}function Sa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Nc(e,t,i);h=r;return e|0}function Ca(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];hc(e,t,i);h=r;return e|0}function ka(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];qs(e,t,i);h=r;return e|0}function Ta(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];ws(e,t,i);h=r;return e|0}function xa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];ts(e,t,i);h=r;return e|0}function Aa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Ol(e,t,i);h=r;return e|0}function Oa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Pa(e,t,i);h=r;return e|0}function Pa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Na(e,n,i,1);h=r;return}function Ia(e){e=e|0;return e|0}function Na(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Ma()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Ra(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Fa(u,r)|0,r);h=i;return}function Ma(){var e=0,t=0;if(!(r[7616]|0)){Ya(9136);Fe(24,9136,g|0)|0;t=7616;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9136)|0)){e=9136;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Ya(9136)}return 9136}function Ra(e){e=e|0;return 0}function Fa(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Ma()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Wa(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Ha(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function La(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;var a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0;a=h;h=h+32|0;p=a+24|0;d=a+20|0;s=a+16|0;f=a+12|0;c=a+8|0;l=a+4|0;v=a;o[d>>2]=t;o[s>>2]=n;o[f>>2]=r;o[c>>2]=i;o[l>>2]=u;u=e+28|0;o[v>>2]=o[u>>2];o[p>>2]=o[v>>2];Ba(e+24|0,p,d,f,c,s,l)|0;o[u>>2]=o[o[u>>2]>>2];h=a;return}function Ba(e,t,n,r,i,u,a){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;a=a|0;e=ja(t)|0;t=$T(24)|0;Ua(t+4|0,o[n>>2]|0,o[r>>2]|0,o[i>>2]|0,o[u>>2]|0,o[a>>2]|0);o[t>>2]=o[e>>2];o[e>>2]=t;return t|0}function ja(e){e=e|0;return o[e>>2]|0}function Ua(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;o[e>>2]=t;o[e+4>>2]=n;o[e+8>>2]=r;o[e+12>>2]=i;o[e+16>>2]=u;return}function za(e,t){e=e|0;t=t|0;return t|e|0}function Wa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Ha(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Va(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;qa(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Wa(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Ga(e,l);$a(l);h=c;return}}function Va(e){e=e|0;return 357913941}function qa(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Ga(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function $a(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Ya(e){e=e|0;Ja(e);return}function Ka(e){e=e|0;Qa(e+24|0);return}function Xa(e){e=e|0;return o[e>>2]|0}function Qa(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Ja(e){e=e|0;var t=0;t=Za()|0;nl(e,2,3,t,el()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Za(){return 9228}function el(){return 1140}function tl(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0;n=h;h=h+16|0;r=n+8|0;i=n;u=rl(e)|0;e=o[u+4>>2]|0;o[i>>2]=o[u>>2];o[i+4>>2]=e;o[r>>2]=o[i>>2];o[r+4>>2]=o[i+4>>2];t=il(t,r)|0;h=n;return t|0}function nl(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;o[e>>2]=t;o[e+4>>2]=n;o[e+8>>2]=r;o[e+12>>2]=i;o[e+16>>2]=u;return}function rl(e){e=e|0;return(o[(Ma()|0)+24>>2]|0)+(e*12|0)|0}function il(e,t){e=e|0;t=t|0;var n=0,r=0,i=0;i=h;h=h+48|0;r=i;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;vA[n&31](r,e);r=ol(r)|0;h=i;return r|0}function ol(e){e=e|0;var t=0,n=0,r=0,i=0;i=h;h=h+32|0;t=i+12|0;n=i;r=al(ul()|0)|0;if(!r)e=dl(e)|0;else{ll(t,r);sl(n,t);cl(e,n);e=fl(t)|0}h=i;return e|0}function ul(){var e=0;if(!(r[7632]|0)){Dl(9184);Fe(25,9184,g|0)|0;e=7632;o[e>>2]=1;o[e+4>>2]=0}return 9184}function al(e){e=e|0;return o[e+36>>2]|0}function ll(e,t){e=e|0;t=t|0;o[e>>2]=t;o[e+4>>2]=e;o[e+8>>2]=0;return}function sl(e,t){e=e|0;t=t|0;o[e>>2]=o[t>>2];o[e+4>>2]=o[t+4>>2];o[e+8>>2]=0;return}function cl(e,t){e=e|0;t=t|0;gl(t,e,e+8|0,e+16|0,e+24|0,e+32|0,e+40|0)|0;return}function fl(e){e=e|0;return o[(o[e+4>>2]|0)+8>>2]|0}function dl(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0,s=0;s=h;h=h+16|0;n=s+4|0;r=s;i=UD(8)|0;u=i;a=$T(48)|0;l=a;t=l+48|0;do{o[l>>2]=o[e>>2];l=l+4|0;e=e+4|0}while((l|0)<(t|0));t=u+4|0;o[t>>2]=a;l=$T(8)|0;a=o[t>>2]|0;o[r>>2]=0;o[n>>2]=o[r>>2];pl(l,a,n);o[i>>2]=l;h=s;return u|0}function pl(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;n=$T(16)|0;o[n+4>>2]=0;o[n+8>>2]=0;o[n>>2]=1092;o[n+12>>2]=t;o[e+4>>2]=n;return}function hl(e){e=e|0;zT(e);KT(e);return}function vl(e){e=e|0;e=o[e+12>>2]|0;if(e|0)KT(e);return}function ml(e){e=e|0;KT(e);return}function gl(e,t,n,r,i,u,a){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;a=a|0;u=yl(o[e>>2]|0,t,n,r,i,u,a)|0;a=e+4|0;o[(o[a>>2]|0)+8>>2]=u;return o[(o[a>>2]|0)+8>>2]|0}function yl(e,t,n,r,i,o,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;o=o|0;u=u|0;var a=0,l=0;a=h;h=h+16|0;l=a;Dk(l);e=Eu(e)|0;u=_l(e,+c[t>>3],+c[n>>3],+c[r>>3],+c[i>>3],+c[o>>3],+c[u>>3])|0;Ck(l);h=a;return u|0}function _l(e,t,n,r,i,o,u){e=e|0;t=+t;n=+n;r=+r;i=+i;o=+o;u=+u;var a=0;a=Cu(bl()|0)|0;t=+ku(t);n=+ku(n);r=+ku(r);i=+ku(i);o=+ku(o);return Te(0,a|0,e|0,+t,+n,+r,+i,+o,+ +ku(u))|0}function bl(){var e=0;if(!(r[7624]|0)){wl(9172);e=7624;o[e>>2]=1;o[e+4>>2]=0}return 9172}function wl(e){e=e|0;Lu(e,El()|0,6);return}function El(){return 1112}function Dl(e){e=e|0;Al(e);return}function Sl(e){e=e|0;Cl(e+24|0);kl(e+16|0);return}function Cl(e){e=e|0;xl(e);return}function kl(e){e=e|0;Tl(e);return}function Tl(e){e=e|0;var t=0,n=0;t=o[e>>2]|0;if(t|0)do{n=t;t=o[t>>2]|0;KT(n)}while((t|0)!=0);o[e>>2]=0;return}function xl(e){e=e|0;var t=0,n=0;t=o[e>>2]|0;if(t|0)do{n=t;t=o[t>>2]|0;KT(n)}while((t|0)!=0);o[e>>2]=0;return}function Al(e){e=e|0;var t=0;o[e+16>>2]=0;o[e+20>>2]=0;t=e+24|0;o[t>>2]=0;o[e+28>>2]=t;o[e+36>>2]=0;r[e+40>>0]=0;r[e+41>>0]=0;return}function Ol(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Pl(e,n,i,0);h=r;return}function Pl(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Il()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Nl(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Ml(u,r)|0,r);h=i;return}function Il(){var e=0,t=0;if(!(r[7640]|0)){zl(9232);Fe(26,9232,g|0)|0;t=7640;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9232)|0)){e=9232;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));zl(9232)}return 9232}function Nl(e){e=e|0;return 0}function Ml(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Il()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Rl(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Fl(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Rl(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Fl(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Ll(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Bl(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Rl(u,r,n);o[s>>2]=(o[s>>2]|0)+12;jl(e,l);Ul(l);h=c;return}}function Ll(e){e=e|0;return 357913941}function Bl(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function jl(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Ul(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function zl(e){e=e|0;Vl(e);return}function Wl(e){e=e|0;Hl(e+24|0);return}function Hl(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Vl(e){e=e|0;var t=0;t=Za()|0;nl(e,2,1,t,ql()|0,3);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function ql(){return 1144}function Gl(e,t,n,r,i){e=e|0;t=t|0;n=+n;r=+r;i=i|0;var u=0,a=0,l=0,s=0;u=h;h=h+16|0;a=u+8|0;l=u;s=$l(e)|0;e=o[s+4>>2]|0;o[l>>2]=o[s>>2];o[l+4>>2]=e;o[a>>2]=o[l>>2];o[a+4>>2]=o[l+4>>2];Yl(t,a,n,r,i);h=u;return}function $l(e){e=e|0;return(o[(Il()|0)+24>>2]|0)+(e*12|0)|0}function Yl(e,t,n,r,i){e=e|0;t=t|0;n=+n;r=+r;i=i|0;var u=0,a=0,l=0,s=0,c=0;c=h;h=h+16|0;a=c+2|0;l=c+1|0;s=c;u=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)u=o[(o[e>>2]|0)+u>>2]|0;Kl(a,n);n=+Xl(a,n);Kl(l,r);r=+Xl(l,r);Ql(s,i);s=Jl(s,i)|0;gA[u&1](e,n,r,s);h=c;return}function Kl(e,t){e=e|0;t=+t;return}function Xl(e,t){e=e|0;t=+t;return+ +es(t)}function Ql(e,t){e=e|0;t=t|0;return}function Jl(e,t){e=e|0;t=t|0;return Zl(t)|0}function Zl(e){e=e|0;return e|0}function es(e){e=+e;return+e}function ts(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];ns(e,n,i,1);h=r;return}function ns(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=rs()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=is(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,os(u,r)|0,r);h=i;return}function rs(){var e=0,t=0;if(!(r[7648]|0)){ds(9268);Fe(27,9268,g|0)|0;t=7648;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9268)|0)){e=9268;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));ds(9268)}return 9268}function is(e){e=e|0;return 0}function os(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=rs()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];us(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{as(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function us(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function as(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=ls(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;ss(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];us(u,r,n);o[s>>2]=(o[s>>2]|0)+12;cs(e,l);fs(l);h=c;return}}function ls(e){e=e|0;return 357913941}function ss(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function cs(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function fs(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function ds(e){e=e|0;vs(e);return}function ps(e){e=e|0;hs(e+24|0);return}function hs(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function vs(e){e=e|0;var t=0;t=Za()|0;nl(e,2,4,t,ms()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function ms(){return 1160}function gs(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0;n=h;h=h+16|0;r=n+8|0;i=n;u=ys(e)|0;e=o[u+4>>2]|0;o[i>>2]=o[u>>2];o[i+4>>2]=e;o[r>>2]=o[i>>2];o[r+4>>2]=o[i+4>>2];t=_s(t,r)|0;h=n;return t|0}function ys(e){e=e|0;return(o[(rs()|0)+24>>2]|0)+(e*12|0)|0}function _s(e,t){e=e|0;t=t|0;var n=0;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;return bs(mA[n&31](e)|0)|0}function bs(e){e=e|0;return e&1|0}function ws(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Es(e,n,i,0);h=r;return}function Es(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Ds()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Ss(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Cs(u,r)|0,r);h=i;return}function Ds(){var e=0,t=0;if(!(r[7656]|0)){Is(9304);Fe(28,9304,g|0)|0;t=7656;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9304)|0)){e=9304;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Is(9304)}return 9304}function Ss(e){e=e|0;return 0}function Cs(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Ds()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];ks(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Ts(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function ks(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Ts(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=xs(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;As(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];ks(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Os(e,l);Ps(l);h=c;return}}function xs(e){e=e|0;return 357913941}function As(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Os(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Ps(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Is(e){e=e|0;Rs(e);return}function Ns(e){e=e|0;Ms(e+24|0);return}function Ms(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Rs(e){e=e|0;var t=0;t=Za()|0;nl(e,2,5,t,Fs()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Fs(){return 1164}function Ls(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=Bs(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];js(t,i,n);h=r;return}function Bs(e){e=e|0;return(o[(Ds()|0)+24>>2]|0)+(e*12|0)|0}function js(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;Us(i,n);n=zs(i,n)|0;vA[r&31](e,n);Ws(i);h=u;return}function Us(e,t){e=e|0;t=t|0;Hs(e,t);return}function zs(e,t){e=e|0;t=t|0;return e|0}function Ws(e){e=e|0;Ji(e);return}function Hs(e,t){e=e|0;t=t|0;Vs(e,t);return}function Vs(e,t){e=e|0;t=t|0;o[e>>2]=t;return}function qs(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Gs(e,n,i,0);h=r;return}function Gs(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=$s()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Ys(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Ks(u,r)|0,r);h=i;return}function $s(){var e=0,t=0;if(!(r[7664]|0)){nc(9340);Fe(29,9340,g|0)|0;t=7664;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9340)|0)){e=9340;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));nc(9340)}return 9340}function Ys(e){e=e|0;return 0}function Ks(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=$s()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Xs(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Qs(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Xs(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Qs(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Js(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Zs(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Xs(u,r,n);o[s>>2]=(o[s>>2]|0)+12;ec(e,l);tc(l);h=c;return}}function Js(e){e=e|0;return 357913941}function Zs(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function ec(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function tc(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function nc(e){e=e|0;oc(e);return}function rc(e){e=e|0;ic(e+24|0);return}function ic(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function oc(e){e=e|0;var t=0;t=Za()|0;nl(e,2,4,t,uc()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function uc(){return 1180}function ac(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=lc(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];n=sc(t,i,n)|0;h=r;return n|0}function lc(e){e=e|0;return(o[($s()|0)+24>>2]|0)+(e*12|0)|0}function sc(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;cc(i,n);i=fc(i,n)|0;i=dc(DA[r&15](e,i)|0)|0;h=u;return i|0}function cc(e,t){e=e|0;t=t|0;return}function fc(e,t){e=e|0;t=t|0;return pc(t)|0}function dc(e){e=e|0;return e|0}function pc(e){e=e|0;return e|0}function hc(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];vc(e,n,i,0);h=r;return}function vc(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=mc()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=gc(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,yc(u,r)|0,r);h=i;return}function mc(){var e=0,t=0;if(!(r[7672]|0)){Cc(9376);Fe(30,9376,g|0)|0;t=7672;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9376)|0)){e=9376;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Cc(9376)}return 9376}function gc(e){e=e|0;return 0}function yc(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=mc()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];_c(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{bc(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function _c(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function bc(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=wc(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Ec(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];_c(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Dc(e,l);Sc(l);h=c;return}}function wc(e){e=e|0;return 357913941}function Ec(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Dc(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Sc(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Cc(e){e=e|0;xc(e);return}function kc(e){e=e|0;Tc(e+24|0);return}function Tc(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function xc(e){e=e|0;var t=0;t=Za()|0;nl(e,2,5,t,Ac()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Ac(){return 1196}function Oc(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0;n=h;h=h+16|0;r=n+8|0;i=n;u=Pc(e)|0;e=o[u+4>>2]|0;o[i>>2]=o[u>>2];o[i+4>>2]=e;o[r>>2]=o[i>>2];o[r+4>>2]=o[i+4>>2];t=Ic(t,r)|0;h=n;return t|0}function Pc(e){e=e|0;return(o[(mc()|0)+24>>2]|0)+(e*12|0)|0}function Ic(e,t){e=e|0;t=t|0;var n=0;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;return dc(mA[n&31](e)|0)|0}function Nc(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Mc(e,n,i,1);h=r;return}function Mc(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Rc()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Fc(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Lc(u,r)|0,r);h=i;return}function Rc(){var e=0,t=0;if(!(r[7680]|0)){Vc(9412);Fe(31,9412,g|0)|0;t=7680;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9412)|0)){e=9412;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Vc(9412)}return 9412}function Fc(e){e=e|0;return 0}function Lc(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Rc()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Bc(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{jc(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Bc(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function jc(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Uc(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;zc(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Bc(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Wc(e,l);Hc(l);h=c;return}}function Uc(e){e=e|0;return 357913941}function zc(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Wc(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Hc(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Vc(e){e=e|0;$c(e);return}function qc(e){e=e|0;Gc(e+24|0);return}function Gc(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function $c(e){e=e|0;var t=0;t=Za()|0;nl(e,2,6,t,Yc()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Yc(){return 1200}function Kc(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0;n=h;h=h+16|0;r=n+8|0;i=n;u=Xc(e)|0;e=o[u+4>>2]|0;o[i>>2]=o[u>>2];o[i+4>>2]=e;o[r>>2]=o[i>>2];o[r+4>>2]=o[i+4>>2];t=Qc(t,r)|0;h=n;return t|0}function Xc(e){e=e|0;return(o[(Rc()|0)+24>>2]|0)+(e*12|0)|0}function Qc(e,t){e=e|0;t=t|0;var n=0;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;return Jc(mA[n&31](e)|0)|0}function Jc(e){e=e|0;return e|0}function Zc(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];ef(e,n,i,0);h=r;return}function ef(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=tf()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=nf(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,rf(u,r)|0,r);h=i;return}function tf(){var e=0,t=0;if(!(r[7688]|0)){ff(9448);Fe(32,9448,g|0)|0;t=7688;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9448)|0)){e=9448;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));ff(9448)}return 9448}function nf(e){e=e|0;return 0}function rf(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=tf()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];of(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{uf(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function of(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function uf(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=af(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;lf(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];of(u,r,n);o[s>>2]=(o[s>>2]|0)+12;sf(e,l);cf(l);h=c;return}}function af(e){e=e|0;return 357913941}function lf(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function sf(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function cf(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function ff(e){e=e|0;hf(e);return}function df(e){e=e|0;pf(e+24|0);return}function pf(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function hf(e){e=e|0;var t=0;t=Za()|0;nl(e,2,6,t,vf()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function vf(){return 1204}function mf(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=gf(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];yf(t,i,n);h=r;return}function gf(e){e=e|0;return(o[(tf()|0)+24>>2]|0)+(e*12|0)|0}function yf(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;_f(i,n);i=bf(i,n)|0;vA[r&31](e,i);h=u;return}function _f(e,t){e=e|0;t=t|0;return}function bf(e,t){e=e|0;t=t|0;return wf(t)|0}function wf(e){e=e|0;return e|0}function Ef(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Df(e,n,i,0);h=r;return}function Df(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Sf()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Cf(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,kf(u,r)|0,r);h=i;return}function Sf(){var e=0,t=0;if(!(r[7696]|0)){Nf(9484);Fe(33,9484,g|0)|0;t=7696;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9484)|0)){e=9484;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Nf(9484)}return 9484}function Cf(e){e=e|0;return 0}function kf(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Sf()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Tf(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{xf(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Tf(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function xf(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Af(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Of(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Tf(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Pf(e,l);If(l);h=c;return}}function Af(e){e=e|0;return 357913941}function Of(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Pf(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function If(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Nf(e){e=e|0;Ff(e);return}function Mf(e){e=e|0;Rf(e+24|0);return}function Rf(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Ff(e){e=e|0;var t=0;t=Za()|0;nl(e,2,1,t,Lf()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Lf(){return 1212}function Bf(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0;i=h;h=h+16|0;u=i+8|0;a=i;l=jf(e)|0;e=o[l+4>>2]|0;o[a>>2]=o[l>>2];o[a+4>>2]=e;o[u>>2]=o[a>>2];o[u+4>>2]=o[a+4>>2];Uf(t,u,n,r);h=i;return}function jf(e){e=e|0;return(o[(Sf()|0)+24>>2]|0)+(e*12|0)|0}function Uf(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0;l=h;h=h+16|0;u=l+1|0;a=l;i=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)i=o[(o[e>>2]|0)+i>>2]|0;_f(u,n);u=bf(u,n)|0;cc(a,r);a=fc(a,r)|0;PA[i&15](e,u,a);h=l;return}function zf(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Wf(e,n,i,1);h=r;return}function Wf(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Hf()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Vf(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,qf(u,r)|0,r);h=i;return}function Hf(){var e=0,t=0;if(!(r[7704]|0)){Jf(9520);Fe(34,9520,g|0)|0;t=7704;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9520)|0)){e=9520;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Jf(9520)}return 9520}function Vf(e){e=e|0;return 0}function qf(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Hf()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Gf(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{$f(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Gf(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function $f(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Yf(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Kf(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Gf(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Xf(e,l);Qf(l);h=c;return}}function Yf(e){e=e|0;return 357913941}function Kf(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Xf(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Qf(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Jf(e){e=e|0;td(e);return}function Zf(e){e=e|0;ed(e+24|0);return}function ed(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function td(e){e=e|0;var t=0;t=Za()|0;nl(e,2,1,t,nd()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function nd(){return 1224}function rd(e,t,n){e=e|0;t=t|0;n=n|0;var r=0.0,i=0,u=0,a=0,l=0;i=h;h=h+16|0;u=i+8|0;a=i;l=id(e)|0;e=o[l+4>>2]|0;o[a>>2]=o[l>>2];o[a+4>>2]=e;o[u>>2]=o[a>>2];o[u+4>>2]=o[a+4>>2];r=+od(t,u,n);h=i;return+r}function id(e){e=e|0;return(o[(Hf()|0)+24>>2]|0)+(e*12|0)|0}function od(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0.0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;Ql(i,n);i=Jl(i,n)|0;a=+Mu(+kA[r&7](e,i));h=u;return+a}function ud(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];ad(e,n,i,1);h=r;return}function ad(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=ld()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=sd(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,cd(u,r)|0,r);h=i;return}function ld(){var e=0,t=0;if(!(r[7712]|0)){gd(9556);Fe(35,9556,g|0)|0;t=7712;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9556)|0)){e=9556;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));gd(9556)}return 9556}function sd(e){e=e|0;return 0}function cd(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=ld()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];fd(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{dd(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function fd(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function dd(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=pd(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;hd(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];fd(u,r,n);o[s>>2]=(o[s>>2]|0)+12;vd(e,l);md(l);h=c;return}}function pd(e){e=e|0;return 357913941}function hd(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function vd(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function md(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function gd(e){e=e|0;bd(e);return}function yd(e){e=e|0;_d(e+24|0);return}function _d(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function bd(e){e=e|0;var t=0;t=Za()|0;nl(e,2,5,t,wd()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function wd(){return 1232}function Ed(e,t){e=e|0;t=t|0;var n=0.0,r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=Dd(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];n=+Sd(t,i);h=r;return+n}function Dd(e){e=e|0;return(o[(ld()|0)+24>>2]|0)+(e*12|0)|0}function Sd(e,t){e=e|0;t=t|0;var n=0;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;return+ +Mu(+wA[n&15](e))}function Cd(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];kd(e,n,i,1);h=r;return}function kd(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Td()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=xd(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Ad(u,r)|0,r);h=i;return}function Td(){var e=0,t=0;if(!(r[7720]|0)){Fd(9592);Fe(36,9592,g|0)|0;t=7720;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9592)|0)){e=9592;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Fd(9592)}return 9592}function xd(e){e=e|0;return 0}function Ad(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Td()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Od(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Pd(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Od(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Pd(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Id(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Nd(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Od(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Md(e,l);Rd(l);h=c;return}}function Id(e){e=e|0;return 357913941}function Nd(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Md(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Rd(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Fd(e){e=e|0;jd(e);return}function Ld(e){e=e|0;Bd(e+24|0);return}function Bd(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function jd(e){e=e|0;var t=0;t=Za()|0;nl(e,2,7,t,Ud()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Ud(){return 1276}function zd(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0;n=h;h=h+16|0;r=n+8|0;i=n;u=Wd(e)|0;e=o[u+4>>2]|0;o[i>>2]=o[u>>2];o[i+4>>2]=e;o[r>>2]=o[i>>2];o[r+4>>2]=o[i+4>>2];t=Hd(t,r)|0;h=n;return t|0}function Wd(e){e=e|0;return(o[(Td()|0)+24>>2]|0)+(e*12|0)|0}function Hd(e,t){e=e|0;t=t|0;var n=0,r=0,i=0;i=h;h=h+16|0;r=i;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;vA[n&31](r,e);r=Vd(r)|0;h=i;return r|0}function Vd(e){e=e|0;var t=0,n=0,r=0,i=0;i=h;h=h+32|0;t=i+12|0;n=i;r=al(qd()|0)|0;if(!r)e=$d(e)|0;else{ll(t,r);sl(n,t);Gd(e,n);e=fl(t)|0}h=i;return e|0}function qd(){var e=0;if(!(r[7736]|0)){ip(9640);Fe(25,9640,g|0)|0;e=7736;o[e>>2]=1;o[e+4>>2]=0}return 9640}function Gd(e,t){e=e|0;t=t|0;Jd(t,e,e+8|0)|0;return}function $d(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0;n=h;h=h+16|0;i=n+4|0;a=n;r=UD(8)|0;t=r;l=$T(16)|0;o[l>>2]=o[e>>2];o[l+4>>2]=o[e+4>>2];o[l+8>>2]=o[e+8>>2];o[l+12>>2]=o[e+12>>2];u=t+4|0;o[u>>2]=l;e=$T(8)|0;u=o[u>>2]|0;o[a>>2]=0;o[i>>2]=o[a>>2];Yd(e,u,i);o[r>>2]=e;h=n;return t|0}function Yd(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;n=$T(16)|0;o[n+4>>2]=0;o[n+8>>2]=0;o[n>>2]=1244;o[n+12>>2]=t;o[e+4>>2]=n;return}function Kd(e){e=e|0;zT(e);KT(e);return}function Xd(e){e=e|0;e=o[e+12>>2]|0;if(e|0)KT(e);return}function Qd(e){e=e|0;KT(e);return}function Jd(e,t,n){e=e|0;t=t|0;n=n|0;t=Zd(o[e>>2]|0,t,n)|0;n=e+4|0;o[(o[n>>2]|0)+8>>2]=t;return o[(o[n>>2]|0)+8>>2]|0}function Zd(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0;r=h;h=h+16|0;i=r;Dk(i);e=Eu(e)|0;n=ep(e,o[t>>2]|0,+c[n>>3])|0;Ck(i);h=r;return n|0}function ep(e,t,n){e=e|0;t=t|0;n=+n;var r=0;r=Cu(tp()|0)|0;t=Tu(t)|0;return xe(0,r|0,e|0,t|0,+ +ku(n))|0}function tp(){var e=0;if(!(r[7728]|0)){np(9628);e=7728;o[e>>2]=1;o[e+4>>2]=0}return 9628}function np(e){e=e|0;Lu(e,rp()|0,2);return}function rp(){return 1264}function ip(e){e=e|0;Al(e);return}function op(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];up(e,n,i,1);h=r;return}function up(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=ap()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=lp(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,sp(u,r)|0,r);h=i;return}function ap(){var e=0,t=0;if(!(r[7744]|0)){mp(9684);Fe(37,9684,g|0)|0;t=7744;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9684)|0)){e=9684;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));mp(9684)}return 9684}function lp(e){e=e|0;return 0}function sp(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=ap()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];cp(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{fp(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function cp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function fp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=dp(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;pp(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];cp(u,r,n);o[s>>2]=(o[s>>2]|0)+12;hp(e,l);vp(l);h=c;return}}function dp(e){e=e|0;return 357913941}function pp(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function hp(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function vp(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function mp(e){e=e|0;_p(e);return}function gp(e){e=e|0;yp(e+24|0);return}function yp(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function _p(e){e=e|0;var t=0;t=Za()|0;nl(e,2,5,t,bp()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function bp(){return 1280}function wp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=Ep(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];n=Dp(t,i,n)|0;h=r;return n|0}function Ep(e){e=e|0;return(o[(ap()|0)+24>>2]|0)+(e*12|0)|0}function Dp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;a=h;h=h+32|0;i=a;u=a+16|0;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;Ql(u,n);u=Jl(u,n)|0;PA[r&15](i,e,u);u=Vd(i)|0;h=a;return u|0}function Sp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Cp(e,n,i,1);h=r;return}function Cp(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=kp()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Tp(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,xp(u,r)|0,r);h=i;return}function kp(){var e=0,t=0;if(!(r[7752]|0)){Rp(9720);Fe(38,9720,g|0)|0;t=7752;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9720)|0)){e=9720;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Rp(9720)}return 9720}function Tp(e){e=e|0;return 0}function xp(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=kp()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Ap(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Op(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Ap(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Op(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Pp(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Ip(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Ap(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Np(e,l);Mp(l);h=c;return}}function Pp(e){e=e|0;return 357913941}function Ip(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Np(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Mp(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Rp(e){e=e|0;Bp(e);return}function Fp(e){e=e|0;Lp(e+24|0);return}function Lp(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Bp(e){e=e|0;var t=0;t=Za()|0;nl(e,2,8,t,jp()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function jp(){return 1288}function Up(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0;n=h;h=h+16|0;r=n+8|0;i=n;u=zp(e)|0;e=o[u+4>>2]|0;o[i>>2]=o[u>>2];o[i+4>>2]=e;o[r>>2]=o[i>>2];o[r+4>>2]=o[i+4>>2];t=Wp(t,r)|0;h=n;return t|0}function zp(e){e=e|0;return(o[(kp()|0)+24>>2]|0)+(e*12|0)|0}function Wp(e,t){e=e|0;t=t|0;var n=0;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;return Nu(mA[n&31](e)|0)|0}function Hp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Vp(e,n,i,0);h=r;return}function Vp(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=qp()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Gp(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,$p(u,r)|0,r);h=i;return}function qp(){var e=0,t=0;if(!(r[7760]|0)){eh(9756);Fe(39,9756,g|0)|0;t=7760;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9756)|0)){e=9756;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));eh(9756)}return 9756}function Gp(e){e=e|0;return 0}function $p(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=qp()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Yp(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Kp(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Yp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Kp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Xp(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Qp(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Yp(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Jp(e,l);Zp(l);h=c;return}}function Xp(e){e=e|0;return 357913941}function Qp(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Jp(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Zp(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function eh(e){e=e|0;rh(e);return}function th(e){e=e|0;nh(e+24|0);return}function nh(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function rh(e){e=e|0;var t=0;t=Za()|0;nl(e,2,8,t,ih()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function ih(){return 1292}function oh(e,t,n){e=e|0;t=t|0;n=+n;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=uh(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];ah(t,i,n);h=r;return}function uh(e){e=e|0;return(o[(qp()|0)+24>>2]|0)+(e*12|0)|0}function ah(e,t,n){e=e|0;t=t|0;n=+n;var r=0,i=0,u=0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;Kl(i,n);n=+Xl(i,n);dA[r&31](e,n);h=u;return}function lh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];sh(e,n,i,0);h=r;return}function sh(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=ch()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=fh(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,dh(u,r)|0,r);h=i;return}function ch(){var e=0,t=0;if(!(r[7768]|0)){_h(9792);Fe(40,9792,g|0)|0;t=7768;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9792)|0)){e=9792;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));_h(9792)}return 9792}function fh(e){e=e|0;return 0}function dh(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=ch()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];ph(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{hh(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function ph(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function hh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=vh(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;mh(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];ph(u,r,n);o[s>>2]=(o[s>>2]|0)+12;gh(e,l);yh(l);h=c;return}}function vh(e){e=e|0;return 357913941}function mh(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function gh(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function yh(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function _h(e){e=e|0;Eh(e);return}function bh(e){e=e|0;wh(e+24|0);return}function wh(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Eh(e){e=e|0;var t=0;t=Za()|0;nl(e,2,1,t,Dh()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Dh(){return 1300}function Sh(e,t,n,r){e=e|0;t=t|0;n=n|0;r=+r;var i=0,u=0,a=0,l=0;i=h;h=h+16|0;u=i+8|0;a=i;l=Ch(e)|0;e=o[l+4>>2]|0;o[a>>2]=o[l>>2];o[a+4>>2]=e;o[u>>2]=o[a>>2];o[u+4>>2]=o[a+4>>2];kh(t,u,n,r);h=i;return}function Ch(e){e=e|0;return(o[(ch()|0)+24>>2]|0)+(e*12|0)|0}function kh(e,t,n,r){e=e|0;t=t|0;n=n|0;r=+r;var i=0,u=0,a=0,l=0;l=h;h=h+16|0;u=l+1|0;a=l;i=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)i=o[(o[e>>2]|0)+i>>2]|0;Ql(u,n);u=Jl(u,n)|0;Kl(a,r);r=+Xl(a,r);NA[i&15](e,u,r);h=l;return}function Th(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];xh(e,n,i,0);h=r;return}function xh(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Ah()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Oh(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Ph(u,r)|0,r);h=i;return}function Ah(){var e=0,t=0;if(!(r[7776]|0)){Bh(9828);Fe(41,9828,g|0)|0;t=7776;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9828)|0)){e=9828;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Bh(9828)}return 9828}function Oh(e){e=e|0;return 0}function Ph(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Ah()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Ih(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Nh(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Ih(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Nh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Mh(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Rh(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Ih(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Fh(e,l);Lh(l);h=c;return}}function Mh(e){e=e|0;return 357913941}function Rh(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Fh(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Lh(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Bh(e){e=e|0;zh(e);return}function jh(e){e=e|0;Uh(e+24|0);return}function Uh(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function zh(e){e=e|0;var t=0;t=Za()|0;nl(e,2,7,t,Wh()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Wh(){return 1312}function Hh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=Vh(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];qh(t,i,n);h=r;return}function Vh(e){e=e|0;return(o[(Ah()|0)+24>>2]|0)+(e*12|0)|0}function qh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;Ql(i,n);i=Jl(i,n)|0;vA[r&31](e,i);h=u;return}function Gh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];$h(e,n,i,0);h=r;return}function $h(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Yh()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Kh(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Xh(u,r)|0,r);h=i;return}function Yh(){var e=0,t=0;if(!(r[7784]|0)){rv(9864);Fe(42,9864,g|0)|0;t=7784;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9864)|0)){e=9864;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));rv(9864)}return 9864}function Kh(e){e=e|0;return 0}function Xh(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Yh()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Qh(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Jh(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Qh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Jh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Zh(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;ev(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Qh(u,r,n);o[s>>2]=(o[s>>2]|0)+12;tv(e,l);nv(l);h=c;return}}function Zh(e){e=e|0;return 357913941}function ev(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function tv(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function nv(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function rv(e){e=e|0;uv(e);return}function iv(e){e=e|0;ov(e+24|0);return}function ov(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function uv(e){e=e|0;var t=0;t=Za()|0;nl(e,2,8,t,av()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function av(){return 1320}function lv(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=sv(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];cv(t,i,n);h=r;return}function sv(e){e=e|0;return(o[(Yh()|0)+24>>2]|0)+(e*12|0)|0}function cv(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;fv(i,n);i=dv(i,n)|0;vA[r&31](e,i);h=u;return}function fv(e,t){e=e|0;t=t|0;return}function dv(e,t){e=e|0;t=t|0;return pv(t)|0}function pv(e){e=e|0;return e|0}function hv(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];vv(e,n,i,0);h=r;return}function vv(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=mv()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=gv(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,yv(u,r)|0,r);h=i;return}function mv(){var e=0,t=0;if(!(r[7792]|0)){Cv(9900);Fe(43,9900,g|0)|0;t=7792;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9900)|0)){e=9900;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Cv(9900)}return 9900}function gv(e){e=e|0;return 0}function yv(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=mv()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];_v(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{bv(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function _v(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function bv(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=wv(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Ev(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];_v(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Dv(e,l);Sv(l);h=c;return}}function wv(e){e=e|0;return 357913941}function Ev(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Dv(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Sv(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Cv(e){e=e|0;xv(e);return}function kv(e){e=e|0;Tv(e+24|0);return}function Tv(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function xv(e){e=e|0;var t=0;t=Za()|0;nl(e,2,22,t,Av()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Av(){return 1344}function Ov(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0;n=h;h=h+16|0;r=n+8|0;i=n;u=Pv(e)|0;e=o[u+4>>2]|0;o[i>>2]=o[u>>2];o[i+4>>2]=e;o[r>>2]=o[i>>2];o[r+4>>2]=o[i+4>>2];Iv(t,r);h=n;return}function Pv(e){e=e|0;return(o[(mv()|0)+24>>2]|0)+(e*12|0)|0}function Iv(e,t){e=e|0;t=t|0;var n=0;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;hA[n&127](e);return}function Nv(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=Mv()|0;e=Rv(n)|0;La(u,t,i,e,Fv(n,r)|0,r);return}function Mv(){var e=0,t=0;if(!(r[7800]|0)){Hv(9936);Fe(44,9936,g|0)|0;t=7800;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9936)|0)){e=9936;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Hv(9936)}return 9936}function Rv(e){e=e|0;return e|0}function Fv(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=Mv()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){Lv(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{Bv(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function Lv(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function Bv(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=jv(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;Uv(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;Lv(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;zv(e,i);Wv(i);h=l;return}}function jv(e){e=e|0;return 536870911}function Uv(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function zv(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Wv(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function Hv(e){e=e|0;Gv(e);return}function Vv(e){e=e|0;qv(e+24|0);return}function qv(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function Gv(e){e=e|0;var t=0;t=Za()|0;nl(e,1,23,t,vf()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function $v(e,t){e=e|0;t=t|0;Kv(o[(Yv(e)|0)>>2]|0,t);return}function Yv(e){e=e|0;return(o[(Mv()|0)+24>>2]|0)+(e<<3)|0}function Kv(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;_f(r,t);t=bf(r,t)|0;hA[e&127](t);h=n;return}function Xv(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=Qv()|0;e=Jv(n)|0;La(u,t,i,e,Zv(n,r)|0,r);return}function Qv(){var e=0,t=0;if(!(r[7808]|0)){um(9972);Fe(45,9972,g|0)|0;t=7808;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9972)|0)){e=9972;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));um(9972)}return 9972}function Jv(e){e=e|0;return e|0}function Zv(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=Qv()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){em(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{tm(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function em(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function tm(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=nm(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;rm(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;em(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;im(e,i);om(i);h=l;return}}function nm(e){e=e|0;return 536870911}function rm(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function im(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function om(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function um(e){e=e|0;sm(e);return}function am(e){e=e|0;lm(e+24|0);return}function lm(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function sm(e){e=e|0;var t=0;t=Za()|0;nl(e,1,9,t,cm()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function cm(){return 1348}function fm(e,t){e=e|0;t=t|0;return pm(o[(dm(e)|0)>>2]|0,t)|0}function dm(e){e=e|0;return(o[(Qv()|0)+24>>2]|0)+(e<<3)|0}function pm(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;hm(r,t);t=vm(r,t)|0;t=dc(mA[e&31](t)|0)|0;h=n;return t|0}function hm(e,t){e=e|0;t=t|0;return}function vm(e,t){e=e|0;t=t|0;return mm(t)|0}function mm(e){e=e|0;return e|0}function gm(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=ym()|0;e=_m(n)|0;La(u,t,i,e,bm(n,r)|0,r);return}function ym(){var e=0,t=0;if(!(r[7816]|0)){Tm(10008);Fe(46,10008,g|0)|0;t=7816;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10008)|0)){e=10008;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Tm(10008)}return 10008}function _m(e){e=e|0;return e|0}function bm(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=ym()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){wm(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{Em(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function wm(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function Em(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=Dm(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;Sm(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;wm(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;Cm(e,i);km(i);h=l;return}}function Dm(e){e=e|0;return 536870911}function Sm(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function Cm(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function km(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function Tm(e){e=e|0;Om(e);return}function xm(e){e=e|0;Am(e+24|0);return}function Am(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function Om(e){e=e|0;var t=0;t=Za()|0;nl(e,1,15,t,Ac()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Pm(e){e=e|0;return Nm(o[(Im(e)|0)>>2]|0)|0}function Im(e){e=e|0;return(o[(ym()|0)+24>>2]|0)+(e<<3)|0}function Nm(e){e=e|0;return dc(TA[e&7]()|0)|0}function Mm(){var e=0;if(!(r[7832]|0)){Vm(10052);Fe(25,10052,g|0)|0;e=7832;o[e>>2]=1;o[e+4>>2]=0}return 10052}function Rm(e,t){e=e|0;t=t|0;o[e>>2]=Fm()|0;o[e+4>>2]=Lm()|0;o[e+12>>2]=t;o[e+8>>2]=Bm()|0;o[e+32>>2]=2;return}function Fm(){return 11709}function Lm(){return 1188}function Bm(){return Wm()|0}function jm(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){zm(n);KT(n)}}else if(t|0){Qi(t);KT(t)}return}function Um(e,t){e=e|0;t=t|0;return t&e|0}function zm(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function Wm(){var e=0;if(!(r[7824]|0)){o[2511]=Hm()|0;o[2512]=0;e=7824;o[e>>2]=1;o[e+4>>2]=0}return 10044}function Hm(){return 0}function Vm(e){e=e|0;Al(e);return}function qm(e){e=e|0;var t=0,n=0,r=0,i=0,u=0;t=h;h=h+32|0;n=t+24|0;u=t+16|0;i=t+8|0;r=t;Gm(e,4827);$m(e,4834,3)|0;Ym(e,3682,47)|0;o[u>>2]=9;o[u+4>>2]=0;o[n>>2]=o[u>>2];o[n+4>>2]=o[u+4>>2];Km(e,4841,n)|0;o[i>>2]=1;o[i+4>>2]=0;o[n>>2]=o[i>>2];o[n+4>>2]=o[i+4>>2];Xm(e,4871,n)|0;o[r>>2]=10;o[r+4>>2]=0;o[n>>2]=o[r>>2];o[n+4>>2]=o[r+4>>2];Qm(e,4891,n)|0;h=t;return}function Gm(e,t){e=e|0;t=t|0;var n=0;n=Vy()|0;o[e>>2]=n;qy(n,t);cw(o[e>>2]|0);return}function $m(e,t,n){e=e|0;t=t|0;n=n|0;Cy(e,Ia(t)|0,n,0);return e|0}function Ym(e,t,n){e=e|0;t=t|0;n=n|0;ay(e,Ia(t)|0,n,0);return e|0}function Km(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];jg(e,t,i);h=r;return e|0}function Xm(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];gg(e,t,i);h=r;return e|0}function Qm(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Jm(e,t,i);h=r;return e|0}function Jm(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Zm(e,n,i,1);h=r;return}function Zm(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=eg()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=tg(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,ng(u,r)|0,r);h=i;return}function eg(){var e=0,t=0;if(!(r[7840]|0)){sg(10100);Fe(48,10100,g|0)|0;t=7840;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10100)|0)){e=10100;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));sg(10100)}return 10100}function tg(e){e=e|0;return 0}function ng(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=eg()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];rg(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{ig(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function rg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function ig(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=og(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;ug(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];rg(u,r,n);o[s>>2]=(o[s>>2]|0)+12;ag(e,l);lg(l);h=c;return}}function og(e){e=e|0;return 357913941}function ug(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function ag(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function lg(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function sg(e){e=e|0;dg(e);return}function cg(e){e=e|0;fg(e+24|0);return}function fg(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function dg(e){e=e|0;var t=0;t=Za()|0;nl(e,2,6,t,pg()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function pg(){return 1364}function hg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=vg(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];n=mg(t,i,n)|0;h=r;return n|0}function vg(e){e=e|0;return(o[(eg()|0)+24>>2]|0)+(e*12|0)|0}function mg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;Ql(i,n);i=Jl(i,n)|0;i=bs(DA[r&15](e,i)|0)|0;h=u;return i|0}function gg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];yg(e,n,i,0);h=r;return}function yg(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=_g()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=bg(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,wg(u,r)|0,r);h=i;return}function _g(){var e=0,t=0;if(!(r[7848]|0)){xg(10136);Fe(49,10136,g|0)|0;t=7848;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10136)|0)){e=10136;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));xg(10136)}return 10136}function bg(e){e=e|0;return 0}function wg(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=_g()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Eg(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Dg(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Eg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Dg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Sg(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Cg(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Eg(u,r,n);o[s>>2]=(o[s>>2]|0)+12;kg(e,l);Tg(l);h=c;return}}function Sg(e){e=e|0;return 357913941}function Cg(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function kg(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Tg(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function xg(e){e=e|0;Pg(e);return}function Ag(e){e=e|0;Og(e+24|0);return}function Og(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Pg(e){e=e|0;var t=0;t=Za()|0;nl(e,2,9,t,Ig()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Ig(){return 1372}function Ng(e,t,n){e=e|0;t=t|0;n=+n;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=Mg(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Rg(t,i,n);h=r;return}function Mg(e){e=e|0;return(o[(_g()|0)+24>>2]|0)+(e*12|0)|0}function Rg(e,t,n){e=e|0;t=t|0;n=+n;var r=0,i=0,u=0,a=ft;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;Fg(i,n);a=Y(Lg(i,n));fA[r&1](e,a);h=u;return}function Fg(e,t){e=e|0;t=+t;return}function Lg(e,t){e=e|0;t=+t;return Y(Bg(t))}function Bg(e){e=+e;return Y(e)}function jg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Ug(e,n,i,0);h=r;return}function Ug(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=zg()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Wg(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Hg(u,r)|0,r);h=i;return}function zg(){var e=0,t=0;if(!(r[7856]|0)){Xg(10172);Fe(50,10172,g|0)|0;t=7856;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10172)|0)){e=10172;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Xg(10172)}return 10172}function Wg(e){e=e|0;return 0}function Hg(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=zg()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Vg(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{qg(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Vg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function qg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Gg(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;$g(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Vg(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Yg(e,l);Kg(l);h=c;return}}function Gg(e){e=e|0;return 357913941}function $g(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Yg(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Kg(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Xg(e){e=e|0;Zg(e);return}function Qg(e){e=e|0;Jg(e+24|0);return}function Jg(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Zg(e){e=e|0;var t=0;t=Za()|0;nl(e,2,3,t,ey()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function ey(){return 1380}function ty(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0;i=h;h=h+16|0;u=i+8|0;a=i;l=ny(e)|0;e=o[l+4>>2]|0;o[a>>2]=o[l>>2];o[a+4>>2]=e;o[u>>2]=o[a>>2];o[u+4>>2]=o[a+4>>2];ry(t,u,n,r);h=i;return}function ny(e){e=e|0;return(o[(zg()|0)+24>>2]|0)+(e*12|0)|0}function ry(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0;l=h;h=h+16|0;u=l+1|0;a=l;i=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)i=o[(o[e>>2]|0)+i>>2]|0;Ql(u,n);u=Jl(u,n)|0;iy(a,r);a=oy(a,r)|0;PA[i&15](e,u,a);h=l;return}function iy(e,t){e=e|0;t=t|0;return}function oy(e,t){e=e|0;t=t|0;return uy(t)|0}function uy(e){e=e|0;return(e|0)!=0|0}function ay(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=ly()|0;e=sy(n)|0;La(u,t,i,e,cy(n,r)|0,r);return}function ly(){var e=0,t=0;if(!(r[7864]|0)){gy(10208);Fe(51,10208,g|0)|0;t=7864;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10208)|0)){e=10208;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));gy(10208)}return 10208}function sy(e){e=e|0;return e|0}function cy(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=ly()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){fy(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{dy(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function fy(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function dy(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=py(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;hy(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;fy(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;vy(e,i);my(i);h=l;return}}function py(e){e=e|0;return 536870911}function hy(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function vy(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function my(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function gy(e){e=e|0;by(e);return}function yy(e){e=e|0;_y(e+24|0);return}function _y(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function by(e){e=e|0;var t=0;t=Za()|0;nl(e,1,24,t,wy()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function wy(){return 1392}function Ey(e,t){e=e|0;t=t|0;Sy(o[(Dy(e)|0)>>2]|0,t);return}function Dy(e){e=e|0;return(o[(ly()|0)+24>>2]|0)+(e<<3)|0}function Sy(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;hm(r,t);t=vm(r,t)|0;hA[e&127](t);h=n;return}function Cy(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=ky()|0;e=Ty(n)|0;La(u,t,i,e,xy(n,r)|0,r);return}function ky(){var e=0,t=0;if(!(r[7872]|0)){Ry(10244);Fe(52,10244,g|0)|0;t=7872;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10244)|0)){e=10244;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Ry(10244)}return 10244}function Ty(e){e=e|0;return e|0}function xy(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=ky()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){Ay(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{Oy(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function Ay(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function Oy(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=Py(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;Iy(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;Ay(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;Ny(e,i);My(i);h=l;return}}function Py(e){e=e|0;return 536870911}function Iy(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function Ny(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function My(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function Ry(e){e=e|0;By(e);return}function Fy(e){e=e|0;Ly(e+24|0);return}function Ly(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function By(e){e=e|0;var t=0;t=Za()|0;nl(e,1,16,t,jy()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function jy(){return 1400}function Uy(e){e=e|0;return Wy(o[(zy(e)|0)>>2]|0)|0}function zy(e){e=e|0;return(o[(ky()|0)+24>>2]|0)+(e<<3)|0}function Wy(e){e=e|0;return Hy(TA[e&7]()|0)|0}function Hy(e){e=e|0;return e|0}function Vy(){var e=0;if(!(r[7880]|0)){Qy(10280);Fe(25,10280,g|0)|0;e=7880;o[e>>2]=1;o[e+4>>2]=0}return 10280}function qy(e,t){e=e|0;t=t|0;o[e>>2]=Gy()|0;o[e+4>>2]=$y()|0;o[e+12>>2]=t;o[e+8>>2]=Yy()|0;o[e+32>>2]=4;return}function Gy(){return 11711}function $y(){return 1356}function Yy(){return Wm()|0}function Ky(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){Xy(n);KT(n)}}else if(t|0){Hi(t);KT(t)}return}function Xy(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function Qy(e){e=e|0;Al(e);return}function Jy(e){e=e|0;Zy(e,4920);e_(e)|0;t_(e)|0;return}function Zy(e,t){e=e|0;t=t|0;var n=0;n=qd()|0;o[e>>2]=n;T_(n,t);cw(o[e>>2]|0);return}function e_(e){e=e|0;var t=0;t=o[e>>2]|0;r_(t,v_()|0);return e|0}function t_(e){e=e|0;var t=0;t=o[e>>2]|0;r_(t,n_()|0);return e|0}function n_(){var e=0;if(!(r[7888]|0)){i_(10328);Fe(53,10328,g|0)|0;e=7888;o[e>>2]=1;o[e+4>>2]=0}if(!(Xa(10328)|0))i_(10328);return 10328}function r_(e,t){e=e|0;t=t|0;La(e,0,t,0,0,0);return}function i_(e){e=e|0;a_(e);s_(e,10);return}function o_(e){e=e|0;u_(e+24|0);return}function u_(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function a_(e){e=e|0;var t=0;t=Za()|0;nl(e,5,1,t,d_()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function l_(e,t,n){e=e|0;t=t|0;n=+n;c_(e,t,n);return}function s_(e,t){e=e|0;t=t|0;o[e+20>>2]=t;return}function c_(e,t,n){e=e|0;t=t|0;n=+n;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;u=r+8|0;l=r+13|0;i=r;a=r+12|0;Ql(l,t);o[u>>2]=Jl(l,t)|0;Kl(a,n);c[i>>3]=+Xl(a,n);f_(e,u,i);h=r;return}function f_(e,t,n){e=e|0;t=t|0;n=n|0;Vo(e+8|0,o[t>>2]|0,+c[n>>3]);r[e+24>>0]=1;return}function d_(){return 1404}function p_(e,t){e=e|0;t=+t;return h_(e,t)|0}function h_(e,t){e=e|0;t=+t;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;r=h;h=h+16|0;u=r+4|0;a=r+8|0;l=r;i=UD(8)|0;n=i;s=$T(16)|0;Ql(u,e);e=Jl(u,e)|0;Kl(a,t);Vo(s,e,+Xl(a,t));a=n+4|0;o[a>>2]=s;e=$T(8)|0;a=o[a>>2]|0;o[l>>2]=0;o[u>>2]=o[l>>2];Yd(e,a,u);o[i>>2]=e;h=r;return n|0}function v_(){var e=0;if(!(r[7896]|0)){m_(10364);Fe(54,10364,g|0)|0;e=7896;o[e>>2]=1;o[e+4>>2]=0}if(!(Xa(10364)|0))m_(10364);return 10364}function m_(e){e=e|0;__(e);s_(e,55);return}function g_(e){e=e|0;y_(e+24|0);return}function y_(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function __(e){e=e|0;var t=0;t=Za()|0;nl(e,5,4,t,S_()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function b_(e){e=e|0;w_(e);return}function w_(e){e=e|0;E_(e);return}function E_(e){e=e|0;D_(e+8|0);r[e+24>>0]=1;return}function D_(e){e=e|0;o[e>>2]=0;c[e+8>>3]=0.0;return}function S_(){return 1424}function C_(){return k_()|0}function k_(){var e=0,t=0,n=0,r=0,i=0,u=0,a=0;t=h;h=h+16|0;i=t+4|0;a=t;n=UD(8)|0;e=n;r=$T(16)|0;D_(r);u=e+4|0;o[u>>2]=r;r=$T(8)|0;u=o[u>>2]|0;o[a>>2]=0;o[i>>2]=o[a>>2];Yd(r,u,i);o[n>>2]=r;h=t;return e|0}function T_(e,t){e=e|0;t=t|0;o[e>>2]=x_()|0;o[e+4>>2]=A_()|0;o[e+12>>2]=t;o[e+8>>2]=O_()|0;o[e+32>>2]=5;return}function x_(){return 11710}function A_(){return 1416}function O_(){return N_()|0}function P_(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){I_(n);KT(n)}}else if(t|0)KT(t);return}function I_(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function N_(){var e=0;if(!(r[7904]|0)){o[2600]=M_()|0;o[2601]=0;e=7904;o[e>>2]=1;o[e+4>>2]=0}return 10400}function M_(){return o[357]|0}function R_(e){e=e|0;F_(e,4926);L_(e)|0;return}function F_(e,t){e=e|0;t=t|0;var n=0;n=ul()|0;o[e>>2]=n;K_(n,t);cw(o[e>>2]|0);return}function L_(e){e=e|0;var t=0;t=o[e>>2]|0;r_(t,B_()|0);return e|0}function B_(){var e=0;if(!(r[7912]|0)){j_(10412);Fe(56,10412,g|0)|0;e=7912;o[e>>2]=1;o[e+4>>2]=0}if(!(Xa(10412)|0))j_(10412);return 10412}function j_(e){e=e|0;W_(e);s_(e,57);return}function U_(e){e=e|0;z_(e+24|0);return}function z_(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function W_(e){e=e|0;var t=0;t=Za()|0;nl(e,5,5,t,G_()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function H_(e){e=e|0;V_(e);return}function V_(e){e=e|0;q_(e);return}function q_(e){e=e|0;var t=0,n=0;t=e+8|0;n=t+48|0;do{o[t>>2]=0;t=t+4|0}while((t|0)<(n|0));r[e+56>>0]=1;return}function G_(){return 1432}function $_(){return Y_()|0}function Y_(){var e=0,t=0,n=0,r=0,i=0,u=0,a=0,l=0;a=h;h=h+16|0;e=a+4|0;t=a;n=UD(8)|0;r=n;i=$T(48)|0;u=i;l=u+48|0;do{o[u>>2]=0;u=u+4|0}while((u|0)<(l|0));u=r+4|0;o[u>>2]=i;l=$T(8)|0;u=o[u>>2]|0;o[t>>2]=0;o[e>>2]=o[t>>2];pl(l,u,e);o[n>>2]=l;h=a;return r|0}function K_(e,t){e=e|0;t=t|0;o[e>>2]=X_()|0;o[e+4>>2]=Q_()|0;o[e+12>>2]=t;o[e+8>>2]=J_()|0;o[e+32>>2]=6;return}function X_(){return 11704}function Q_(){return 1436}function J_(){return N_()|0}function Z_(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){eb(n);KT(n)}}else if(t|0)KT(t);return}function eb(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function tb(e){e=e|0;nb(e,4933);rb(e)|0;ib(e)|0;return}function nb(e,t){e=e|0;t=t|0;var n=0;n=Nb()|0;o[e>>2]=n;Mb(n,t);cw(o[e>>2]|0);return}function rb(e){e=e|0;var t=0;t=o[e>>2]|0;r_(t,wb()|0);return e|0}function ib(e){e=e|0;var t=0;t=o[e>>2]|0;r_(t,ob()|0);return e|0}function ob(){var e=0;if(!(r[7920]|0)){ub(10452);Fe(58,10452,g|0)|0;e=7920;o[e>>2]=1;o[e+4>>2]=0}if(!(Xa(10452)|0))ub(10452);return 10452}function ub(e){e=e|0;sb(e);s_(e,1);return}function ab(e){e=e|0;lb(e+24|0);return}function lb(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function sb(e){e=e|0;var t=0;t=Za()|0;nl(e,5,1,t,hb()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function cb(e,t,n){e=e|0;t=+t;n=+n;fb(e,t,n);return}function fb(e,t,n){e=e|0;t=+t;n=+n;var r=0,i=0,o=0,u=0,a=0;r=h;h=h+32|0;o=r+8|0;a=r+17|0;i=r;u=r+16|0;Kl(a,t);c[o>>3]=+Xl(a,t);Kl(u,n);c[i>>3]=+Xl(u,n);db(e,o,i);h=r;return}function db(e,t,n){e=e|0;t=t|0;n=n|0;pb(e+8|0,+c[t>>3],+c[n>>3]);r[e+24>>0]=1;return}function pb(e,t,n){e=e|0;t=+t;n=+n;c[e>>3]=t;c[e+8>>3]=n;return}function hb(){return 1472}function vb(e,t){e=+e;t=+t;return mb(e,t)|0}function mb(e,t){e=+e;t=+t;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;r=h;h=h+16|0;a=r+4|0;l=r+8|0;s=r;i=UD(8)|0;n=i;u=$T(16)|0;Kl(a,e);e=+Xl(a,e);Kl(l,t);pb(u,e,+Xl(l,t));l=n+4|0;o[l>>2]=u;u=$T(8)|0;l=o[l>>2]|0;o[s>>2]=0;o[a>>2]=o[s>>2];gb(u,l,a);o[i>>2]=u;h=r;return n|0}function gb(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;n=$T(16)|0;o[n+4>>2]=0;o[n+8>>2]=0;o[n>>2]=1452;o[n+12>>2]=t;o[e+4>>2]=n;return}function yb(e){e=e|0;zT(e);KT(e);return}function _b(e){e=e|0;e=o[e+12>>2]|0;if(e|0)KT(e);return}function bb(e){e=e|0;KT(e);return}function wb(){var e=0;if(!(r[7928]|0)){Eb(10488);Fe(59,10488,g|0)|0;e=7928;o[e>>2]=1;o[e+4>>2]=0}if(!(Xa(10488)|0))Eb(10488);return 10488}function Eb(e){e=e|0;Cb(e);s_(e,60);return}function Db(e){e=e|0;Sb(e+24|0);return}function Sb(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function Cb(e){e=e|0;var t=0;t=Za()|0;nl(e,5,6,t,Ob()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function kb(e){e=e|0;Tb(e);return}function Tb(e){e=e|0;xb(e);return}function xb(e){e=e|0;Ab(e+8|0);r[e+24>>0]=1;return}function Ab(e){e=e|0;o[e>>2]=0;o[e+4>>2]=0;o[e+8>>2]=0;o[e+12>>2]=0;return}function Ob(){return 1492}function Pb(){return Ib()|0}function Ib(){var e=0,t=0,n=0,r=0,i=0,u=0,a=0;t=h;h=h+16|0;i=t+4|0;a=t;n=UD(8)|0;e=n;r=$T(16)|0;Ab(r);u=e+4|0;o[u>>2]=r;r=$T(8)|0;u=o[u>>2]|0;o[a>>2]=0;o[i>>2]=o[a>>2];gb(r,u,i);o[n>>2]=r;h=t;return e|0}function Nb(){var e=0;if(!(r[7936]|0)){Ub(10524);Fe(25,10524,g|0)|0;e=7936;o[e>>2]=1;o[e+4>>2]=0}return 10524}function Mb(e,t){e=e|0;t=t|0;o[e>>2]=Rb()|0;o[e+4>>2]=Fb()|0;o[e+12>>2]=t;o[e+8>>2]=Lb()|0;o[e+32>>2]=7;return}function Rb(){return 11700}function Fb(){return 1484}function Lb(){return N_()|0}function Bb(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){jb(n);KT(n)}}else if(t|0)KT(t);return}function jb(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function Ub(e){e=e|0;Al(e);return}function zb(e,t,n){e=e|0;t=t|0;n=n|0;e=Ia(t)|0;t=Wb(n)|0;n=Hb(n,0)|0;xw(e,t,n,Vb()|0,0);return}function Wb(e){e=e|0;return e|0}function Hb(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=Vb()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){Jb(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{Zb(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function Vb(){var e=0,t=0;if(!(r[7944]|0)){qb(10568);Fe(61,10568,g|0)|0;t=7944;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10568)|0)){e=10568;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));qb(10568)}return 10568}function qb(e){e=e|0;Yb(e);return}function Gb(e){e=e|0;$b(e+24|0);return}function $b(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function Yb(e){e=e|0;var t=0;t=Za()|0;nl(e,1,17,t,Yc()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Kb(e){e=e|0;return Qb(o[(Xb(e)|0)>>2]|0)|0}function Xb(e){e=e|0;return(o[(Vb()|0)+24>>2]|0)+(e<<3)|0}function Qb(e){e=e|0;return Jc(TA[e&7]()|0)|0}function Jb(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function Zb(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=ew(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;tw(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;Jb(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;nw(e,i);rw(i);h=l;return}}function ew(e){e=e|0;return 536870911}function tw(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function nw(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function rw(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function iw(){ow();return}function ow(){uw(10604);return}function uw(e){e=e|0;aw(e,4955);return}function aw(e,t){e=e|0;t=t|0;var n=0;n=lw()|0;o[e>>2]=n;sw(n,t);cw(o[e>>2]|0);return}function lw(){var e=0;if(!(r[7952]|0)){bw(10612);Fe(25,10612,g|0)|0;e=7952;o[e>>2]=1;o[e+4>>2]=0}return 10612}function sw(e,t){e=e|0;t=t|0;o[e>>2]=vw()|0;o[e+4>>2]=mw()|0;o[e+12>>2]=t;o[e+8>>2]=gw()|0;o[e+32>>2]=8;return}function cw(e){e=e|0;var t=0,n=0;t=h;h=h+16|0;n=t;fw()|0;o[n>>2]=e;dw(10608,n);h=t;return}function fw(){if(!(r[11714]|0)){o[2652]=0;Fe(62,10608,g|0)|0;r[11714]=1}return 10608}function dw(e,t){e=e|0;t=t|0;var n=0;n=$T(8)|0;o[n+4>>2]=o[t>>2];o[n>>2]=o[e>>2];o[e>>2]=n;return}function pw(e){e=e|0;hw(e);return}function hw(e){e=e|0;var t=0,n=0;t=o[e>>2]|0;if(t|0)do{n=t;t=o[t>>2]|0;KT(n)}while((t|0)!=0);o[e>>2]=0;return}function vw(){return 11715}function mw(){return 1496}function gw(){return Wm()|0}function yw(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){_w(n);KT(n)}}else if(t|0)KT(t);return}function _w(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function bw(e){e=e|0;Al(e);return}function ww(e,t){e=e|0;t=t|0;var n=0,r=0;fw()|0;n=o[2652]|0;e:do{if(n|0){while(1){r=o[n+4>>2]|0;if(r|0?(rT(Ew(r)|0,e)|0)==0:0)break;n=o[n>>2]|0;if(!n)break e}Dw(r,t)}}while(0);return}function Ew(e){e=e|0;return o[e+12>>2]|0}function Dw(e,t){e=e|0;t=t|0;var n=0;e=e+36|0;n=o[e>>2]|0;if(n|0){Ji(n);KT(n)}n=$T(4)|0;yu(n,t);o[e>>2]=n;return}function Sw(){if(!(r[11716]|0)){o[2664]=0;Fe(63,10656,g|0)|0;r[11716]=1}return 10656}function Cw(){var e=0;if(!(r[11717]|0)){kw();o[2665]=1504;r[11717]=1;e=1504}else e=o[2665]|0;return e|0}function kw(){if(!(r[11740]|0)){r[11718]=za(za(8,0)|0,0)|0;r[11719]=za(za(0,0)|0,0)|0;r[11720]=za(za(0,16)|0,0)|0;r[11721]=za(za(8,0)|0,0)|0;r[11722]=za(za(0,0)|0,0)|0;r[11723]=za(za(8,0)|0,0)|0;r[11724]=za(za(0,0)|0,0)|0;r[11725]=za(za(8,0)|0,0)|0;r[11726]=za(za(0,0)|0,0)|0;r[11727]=za(za(8,0)|0,0)|0;r[11728]=za(za(0,0)|0,0)|0;r[11729]=za(za(0,0)|0,32)|0;r[11730]=za(za(0,0)|0,32)|0;r[11740]=1}return}function Tw(){return 1572}function xw(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;var u=0,a=0,l=0,s=0,c=0,f=0;u=h;h=h+32|0;f=u+16|0;c=u+12|0;s=u+8|0;l=u+4|0;a=u;o[f>>2]=e;o[c>>2]=t;o[s>>2]=n;o[l>>2]=r;o[a>>2]=i;Sw()|0;Aw(10656,f,c,s,l,a);h=u;return}function Aw(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;var a=0;a=$T(24)|0;Ua(a+4|0,o[t>>2]|0,o[n>>2]|0,o[r>>2]|0,o[i>>2]|0,o[u>>2]|0);o[a>>2]=o[e>>2];o[e>>2]=a;return}function Ow(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0,y=0,_=0,b=0;b=h;h=h+32|0;m=b+20|0;g=b+8|0;y=b+4|0;_=b;t=o[t>>2]|0;if(t|0){v=m+4|0;s=m+8|0;c=g+4|0;f=g+8|0;d=g+8|0;p=m+8|0;do{a=t+4|0;l=Pw(a)|0;if(l|0){i=Iw(l)|0;o[m>>2]=0;o[v>>2]=0;o[s>>2]=0;r=(Nw(l)|0)+1|0;Mw(m,r);if(r|0)while(1){r=r+-1|0;gk(g,o[i>>2]|0);u=o[v>>2]|0;if(u>>>0<(o[p>>2]|0)>>>0){o[u>>2]=o[g>>2];o[v>>2]=(o[v>>2]|0)+4}else Rw(m,g);if(!r)break;else i=i+4|0}r=Fw(l)|0;o[g>>2]=0;o[c>>2]=0;o[f>>2]=0;e:do{if(o[r>>2]|0){i=0;u=0;while(1){if((i|0)==(u|0))Lw(g,r);else{o[i>>2]=o[r>>2];o[c>>2]=(o[c>>2]|0)+4}r=r+4|0;if(!(o[r>>2]|0))break e;i=o[c>>2]|0;u=o[d>>2]|0}}}while(0);o[y>>2]=Bw(a)|0;o[_>>2]=Xa(l)|0;jw(n,e,y,_,m,g);Uw(g);zw(m)}t=o[t>>2]|0}while((t|0)!=0)}h=b;return}function Pw(e){e=e|0;return o[e+12>>2]|0}function Iw(e){e=e|0;return o[e+12>>2]|0}function Nw(e){e=e|0;return o[e+16>>2]|0}function Mw(e,t){e=e|0;t=t|0;var n=0,r=0,i=0;i=h;h=h+32|0;n=i;r=o[e>>2]|0;if((o[e+8>>2]|0)-r>>2>>>0>>0){bE(n,t,(o[e+4>>2]|0)-r>>2,e+8|0);wE(e,n);EE(n)}h=i;return}function Rw(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0;a=h;h=h+32|0;n=a;r=e+4|0;i=((o[r>>2]|0)-(o[e>>2]|0)>>2)+1|0;u=mE(e)|0;if(u>>>0>>0)UT(e);else{l=o[e>>2]|0;c=(o[e+8>>2]|0)-l|0;s=c>>1;bE(n,c>>2>>>0>>1>>>0?s>>>0>>0?i:s:u,(o[r>>2]|0)-l>>2,e+8|0);u=n+8|0;o[o[u>>2]>>2]=o[t>>2];o[u>>2]=(o[u>>2]|0)+4;wE(e,n);EE(n);h=a;return}}function Fw(e){e=e|0;return o[e+8>>2]|0}function Lw(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0;a=h;h=h+32|0;n=a;r=e+4|0;i=((o[r>>2]|0)-(o[e>>2]|0)>>2)+1|0;u=pE(e)|0;if(u>>>0>>0)UT(e);else{l=o[e>>2]|0;c=(o[e+8>>2]|0)-l|0;s=c>>1;gE(n,c>>2>>>0>>1>>>0?s>>>0>>0?i:s:u,(o[r>>2]|0)-l>>2,e+8|0);u=n+8|0;o[o[u>>2]>>2]=o[t>>2];o[u>>2]=(o[u>>2]|0)+4;yE(e,n);_E(n);h=a;return}}function Bw(e){e=e|0;return o[e>>2]|0}function jw(e,t,n,r,i,o){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;o=o|0;Ww(e,t,n,r,i,o);return}function Uw(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-4-r|0)>>>2)<<2);KT(n)}return}function zw(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-4-r|0)>>>2)<<2);KT(n)}return}function Ww(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;var a=0,l=0,s=0,c=0,f=0,d=0;a=h;h=h+48|0;f=a+40|0;l=a+32|0;d=a+24|0;s=a+12|0;c=a;Dk(l);e=Eu(e)|0;o[d>>2]=o[t>>2];n=o[n>>2]|0;r=o[r>>2]|0;Hw(s,i);Vw(c,u);o[f>>2]=o[d>>2];qw(e,f,n,r,s,c);Uw(c);zw(s);Ck(l);h=a;return}function Hw(e,t){e=e|0;t=t|0;var n=0,r=0;o[e>>2]=0;o[e+4>>2]=0;o[e+8>>2]=0;n=t+4|0;r=(o[n>>2]|0)-(o[t>>2]|0)>>2;if(r|0){hE(e,r);vE(e,o[t>>2]|0,o[n>>2]|0,r)}return}function Vw(e,t){e=e|0;t=t|0;var n=0,r=0;o[e>>2]=0;o[e+4>>2]=0;o[e+8>>2]=0;n=t+4|0;r=(o[n>>2]|0)-(o[t>>2]|0)>>2;if(r|0){fE(e,r);dE(e,o[t>>2]|0,o[n>>2]|0,r)}return}function qw(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;var a=0,l=0,s=0,c=0,f=0,d=0;a=h;h=h+32|0;f=a+28|0;d=a+24|0;l=a+12|0;s=a;c=Cu(Gw()|0)|0;o[d>>2]=o[t>>2];o[f>>2]=o[d>>2];t=$w(f)|0;n=Yw(n)|0;r=Kw(r)|0;o[l>>2]=o[i>>2];f=i+4|0;o[l+4>>2]=o[f>>2];d=i+8|0;o[l+8>>2]=o[d>>2];o[d>>2]=0;o[f>>2]=0;o[i>>2]=0;i=Xw(l)|0;o[s>>2]=o[u>>2];f=u+4|0;o[s+4>>2]=o[f>>2];d=u+8|0;o[s+8>>2]=o[d>>2];o[d>>2]=0;o[f>>2]=0;o[u>>2]=0;Oe(0,c|0,e|0,t|0,n|0,r|0,i|0,Qw(s)|0)|0;Uw(s);zw(l);h=a;return}function Gw(){var e=0;if(!(r[7968]|0)){sE(10708);e=7968;o[e>>2]=1;o[e+4>>2]=0}return 10708}function $w(e){e=e|0;return tE(e)|0}function Yw(e){e=e|0;return Zw(e)|0}function Kw(e){e=e|0;return Jc(e)|0}function Xw(e){e=e|0;return eE(e)|0}function Qw(e){e=e|0;return Jw(e)|0}function Jw(e){e=e|0;var t=0,n=0,r=0;r=(o[e+4>>2]|0)-(o[e>>2]|0)|0;n=r>>2;r=UD(r+4|0)|0;o[r>>2]=n;if(n|0){t=0;do{o[r+4+(t<<2)>>2]=Zw(o[(o[e>>2]|0)+(t<<2)>>2]|0)|0;t=t+1|0}while((t|0)!=(n|0))}return r|0}function Zw(e){e=e|0;return e|0}function eE(e){e=e|0;var t=0,n=0,r=0;r=(o[e+4>>2]|0)-(o[e>>2]|0)|0;n=r>>2;r=UD(r+4|0)|0;o[r>>2]=n;if(n|0){t=0;do{o[r+4+(t<<2)>>2]=tE((o[e>>2]|0)+(t<<2)|0)|0;t=t+1|0}while((t|0)!=(n|0))}return r|0}function tE(e){e=e|0;var t=0,n=0,r=0,i=0;i=h;h=h+32|0;t=i+12|0;n=i;r=al(nE()|0)|0;if(!r)e=rE(e)|0;else{ll(t,r);sl(n,t);bk(e,n);e=fl(t)|0}h=i;return e|0}function nE(){var e=0;if(!(r[7960]|0)){lE(10664);Fe(25,10664,g|0)|0;e=7960;o[e>>2]=1;o[e+4>>2]=0}return 10664}function rE(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0;n=h;h=h+16|0;i=n+4|0;a=n;r=UD(8)|0;t=r;l=$T(4)|0;o[l>>2]=o[e>>2];u=t+4|0;o[u>>2]=l;e=$T(8)|0;u=o[u>>2]|0;o[a>>2]=0;o[i>>2]=o[a>>2];iE(e,u,i);o[r>>2]=e;h=n;return t|0}function iE(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;n=$T(16)|0;o[n+4>>2]=0;o[n+8>>2]=0;o[n>>2]=1656;o[n+12>>2]=t;o[e+4>>2]=n;return}function oE(e){e=e|0;zT(e);KT(e);return}function uE(e){e=e|0;e=o[e+12>>2]|0;if(e|0)KT(e);return}function aE(e){e=e|0;KT(e);return}function lE(e){e=e|0;Al(e);return}function sE(e){e=e|0;Lu(e,cE()|0,5);return}function cE(){return 1676}function fE(e,t){e=e|0;t=t|0;var n=0;if((pE(e)|0)>>>0>>0)UT(e);if(t>>>0>1073741823)Ye();else{n=$T(t<<2)|0;o[e+4>>2]=n;o[e>>2]=n;o[e+8>>2]=n+(t<<2);return}}function dE(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;r=e+4|0;e=n-t|0;if((e|0)>0){ix(o[r>>2]|0,t|0,e|0)|0;o[r>>2]=(o[r>>2]|0)+(e>>>2<<2)}return}function pE(e){e=e|0;return 1073741823}function hE(e,t){e=e|0;t=t|0;var n=0;if((mE(e)|0)>>>0>>0)UT(e);if(t>>>0>1073741823)Ye();else{n=$T(t<<2)|0;o[e+4>>2]=n;o[e>>2]=n;o[e+8>>2]=n+(t<<2);return}}function vE(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;r=e+4|0;e=n-t|0;if((e|0)>0){ix(o[r>>2]|0,t|0,e|0)|0;o[r>>2]=(o[r>>2]|0)+(e>>>2<<2)}return}function mE(e){e=e|0;return 1073741823}function gE(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>1073741823)Ye();else{i=$T(t<<2)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<2)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<2);return}function yE(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>2)<<2)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function _E(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-4-t|0)>>>2)<<2);e=o[e>>2]|0;if(e|0)KT(e);return}function bE(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>1073741823)Ye();else{i=$T(t<<2)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<2)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<2);return}function wE(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>2)<<2)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function EE(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-4-t|0)>>>2)<<2);e=o[e>>2]|0;if(e|0)KT(e);return}function DE(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;var u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0;g=h;h=h+32|0;f=g+20|0;d=g+12|0;c=g+16|0;p=g+4|0;v=g;m=g+8|0;l=Cw()|0;u=o[l>>2]|0;a=o[u>>2]|0;if(a|0){s=o[l+8>>2]|0;l=o[l+4>>2]|0;while(1){gk(f,a);SE(e,f,l,s);u=u+4|0;a=o[u>>2]|0;if(!a)break;else{s=s+1|0;l=l+1|0}}}u=Tw()|0;a=o[u>>2]|0;if(a|0)do{gk(f,a);o[d>>2]=o[u+4>>2];CE(t,f,d);u=u+8|0;a=o[u>>2]|0}while((a|0)!=0);u=o[(fw()|0)>>2]|0;if(u|0)do{t=o[u+4>>2]|0;gk(f,o[(kE(t)|0)>>2]|0);o[d>>2]=Ew(t)|0;TE(n,f,d);u=o[u>>2]|0}while((u|0)!=0);gk(c,0);u=Sw()|0;o[f>>2]=o[c>>2];Ow(f,u,i);u=o[(fw()|0)>>2]|0;if(u|0){e=f+4|0;t=f+8|0;n=f+8|0;do{s=o[u+4>>2]|0;gk(d,o[(kE(s)|0)>>2]|0);AE(p,xE(s)|0);a=o[p>>2]|0;if(a|0){o[f>>2]=0;o[e>>2]=0;o[t>>2]=0;do{gk(v,o[(kE(o[a+4>>2]|0)|0)>>2]|0);l=o[e>>2]|0;if(l>>>0<(o[n>>2]|0)>>>0){o[l>>2]=o[v>>2];o[e>>2]=(o[e>>2]|0)+4}else Rw(f,v);a=o[a>>2]|0}while((a|0)!=0);OE(r,d,f);zw(f)}o[m>>2]=o[d>>2];c=PE(s)|0;o[f>>2]=o[m>>2];Ow(f,c,i);kl(p);u=o[u>>2]|0}while((u|0)!=0)}h=g;return}function SE(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;qE(e,t,n,r);return}function CE(e,t,n){e=e|0;t=t|0;n=n|0;VE(e,t,n);return}function kE(e){e=e|0;return e|0}function TE(e,t,n){e=e|0;t=t|0;n=n|0;jE(e,t,n);return}function xE(e){e=e|0;return e+16|0}function AE(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;u=h;h=h+16|0;i=u+8|0;n=u;o[e>>2]=0;r=o[t>>2]|0;o[i>>2]=r;o[n>>2]=e;n=LE(n)|0;if(r|0){r=$T(12)|0;a=(BE(i)|0)+4|0;e=o[a+4>>2]|0;t=r+4|0;o[t>>2]=o[a>>2];o[t+4>>2]=e;t=o[o[i>>2]>>2]|0;o[i>>2]=t;if(!t)e=r;else{t=r;while(1){e=$T(12)|0;s=(BE(i)|0)+4|0;l=o[s+4>>2]|0;a=e+4|0;o[a>>2]=o[s>>2];o[a+4>>2]=l;o[t>>2]=e;a=o[o[i>>2]>>2]|0;o[i>>2]=a;if(!a)break;else t=e}}o[e>>2]=o[n>>2];o[n>>2]=r}h=u;return}function OE(e,t,n){e=e|0;t=t|0;n=n|0;IE(e,t,n);return}function PE(e){e=e|0;return e+24|0}function IE(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+32|0;a=r+24|0;i=r+16|0;l=r+12|0;u=r;Dk(i);e=Eu(e)|0;o[l>>2]=o[t>>2];Hw(u,n);o[a>>2]=o[l>>2];NE(e,a,u);zw(u);Ck(i);h=r;return}function NE(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+32|0;a=r+16|0;l=r+12|0;i=r;u=Cu(ME()|0)|0;o[l>>2]=o[t>>2];o[a>>2]=o[l>>2];t=$w(a)|0;o[i>>2]=o[n>>2];a=n+4|0;o[i+4>>2]=o[a>>2];l=n+8|0;o[i+8>>2]=o[l>>2];o[l>>2]=0;o[a>>2]=0;o[n>>2]=0;ke(0,u|0,e|0,t|0,Xw(i)|0)|0;zw(i);h=r;return}function ME(){var e=0;if(!(r[7976]|0)){RE(10720);e=7976;o[e>>2]=1;o[e+4>>2]=0}return 10720}function RE(e){e=e|0;Lu(e,FE()|0,2);return}function FE(){return 1732}function LE(e){e=e|0;return o[e>>2]|0}function BE(e){e=e|0;return o[e>>2]|0}function jE(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+32|0;u=r+16|0;i=r+8|0;a=r;Dk(i);e=Eu(e)|0;o[a>>2]=o[t>>2];n=o[n>>2]|0;o[u>>2]=o[a>>2];UE(e,u,n);Ck(i);h=r;return}function UE(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;u=r+4|0;a=r;i=Cu(zE()|0)|0;o[a>>2]=o[t>>2];o[u>>2]=o[a>>2];t=$w(u)|0;ke(0,i|0,e|0,t|0,Yw(n)|0)|0;h=r;return}function zE(){var e=0;if(!(r[7984]|0)){WE(10732);e=7984;o[e>>2]=1;o[e+4>>2]=0}return 10732}function WE(e){e=e|0;Lu(e,HE()|0,2);return}function HE(){return 1744}function VE(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+32|0;u=r+16|0;i=r+8|0;a=r;Dk(i);e=Eu(e)|0;o[a>>2]=o[t>>2];n=o[n>>2]|0;o[u>>2]=o[a>>2];UE(e,u,n);Ck(i);h=r;return}function qE(e,t,n,i){e=e|0;t=t|0;n=n|0;i=i|0;var u=0,a=0,l=0,s=0;u=h;h=h+32|0;l=u+16|0;a=u+8|0;s=u;Dk(a);e=Eu(e)|0;o[s>>2]=o[t>>2];n=r[n>>0]|0;i=r[i>>0]|0;o[l>>2]=o[s>>2];GE(e,l,n,i);Ck(a);h=u;return}function GE(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0;i=h;h=h+16|0;a=i+4|0;l=i;u=Cu($E()|0)|0;o[l>>2]=o[t>>2];o[a>>2]=o[l>>2];t=$w(a)|0;n=YE(n)|0;nt(0,u|0,e|0,t|0,n|0,YE(r)|0)|0;h=i;return}function $E(){var e=0;if(!(r[7992]|0)){XE(10744);e=7992;o[e>>2]=1;o[e+4>>2]=0}return 10744}function YE(e){e=e|0;return KE(e)|0}function KE(e){e=e|0;return e&255|0}function XE(e){e=e|0;Lu(e,QE()|0,3);return}function QE(){return 1756}function JE(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0;v=h;h=h+32|0;s=v+8|0;c=v+4|0;f=v+20|0;d=v;Vs(e,0);i=_k(t)|0;o[s>>2]=0;p=s+4|0;o[p>>2]=0;o[s+8>>2]=0;switch(i<<24>>24){case 0:{r[f>>0]=0;ZE(c,n,f);eD(e,c)|0;Zi(c);break}case 8:{p=yk(t)|0;r[f>>0]=8;gk(d,o[p+4>>2]|0);tD(c,n,f,d,p+8|0);eD(e,c)|0;Zi(c);break}case 9:{a=yk(t)|0;t=o[a+4>>2]|0;if(t|0){l=s+8|0;u=a+12|0;while(1){t=t+-1|0;gk(c,o[u>>2]|0);i=o[p>>2]|0;if(i>>>0<(o[l>>2]|0)>>>0){o[i>>2]=o[c>>2];o[p>>2]=(o[p>>2]|0)+4}else Rw(s,c);if(!t)break;else u=u+4|0}}r[f>>0]=9;gk(d,o[a+8>>2]|0);nD(c,n,f,d,s);eD(e,c)|0;Zi(c);break}default:{p=yk(t)|0;r[f>>0]=i;gk(d,o[p+4>>2]|0);rD(c,n,f,d);eD(e,c)|0;Zi(c)}}zw(s);h=v;return}function ZE(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,o=0;i=h;h=h+16|0;o=i;Dk(o);t=Eu(t)|0;gD(e,t,r[n>>0]|0);Ck(o);h=i;return}function eD(e,t){e=e|0;t=t|0;var n=0;n=o[e>>2]|0;if(n|0)rt(n|0);o[e>>2]=o[t>>2];o[t>>2]=0;return e|0}function tD(e,t,n,i,u){e=e|0;t=t|0;n=n|0;i=i|0;u=u|0;var a=0,l=0,s=0,c=0;a=h;h=h+32|0;s=a+16|0;l=a+8|0;c=a;Dk(l);t=Eu(t)|0;n=r[n>>0]|0;o[c>>2]=o[i>>2];u=o[u>>2]|0;o[s>>2]=o[c>>2];pD(e,t,n,s,u);Ck(l);h=a;return}function nD(e,t,n,i,u){e=e|0;t=t|0;n=n|0;i=i|0;u=u|0;var a=0,l=0,s=0,c=0,f=0;a=h;h=h+32|0;c=a+24|0;l=a+16|0;f=a+12|0;s=a;Dk(l);t=Eu(t)|0;n=r[n>>0]|0;o[f>>2]=o[i>>2];Hw(s,u);o[c>>2]=o[f>>2];sD(e,t,n,c,s);zw(s);Ck(l);h=a;return}function rD(e,t,n,i){e=e|0;t=t|0;n=n|0;i=i|0;var u=0,a=0,l=0,s=0;u=h;h=h+32|0;l=u+16|0;a=u+8|0;s=u;Dk(a);t=Eu(t)|0;n=r[n>>0]|0;o[s>>2]=o[i>>2];o[l>>2]=o[s>>2];iD(e,t,n,l);Ck(a);h=u;return}function iD(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0;i=h;h=h+16|0;u=i+4|0;l=i;a=Cu(oD()|0)|0;n=YE(n)|0;o[l>>2]=o[r>>2];o[u>>2]=o[l>>2];uD(e,ke(0,a|0,t|0,n|0,$w(u)|0)|0);h=i;return}function oD(){var e=0;if(!(r[8e3]|0)){aD(10756);e=8e3;o[e>>2]=1;o[e+4>>2]=0}return 10756}function uD(e,t){e=e|0;t=t|0;Vs(e,t);return}function aD(e){e=e|0;Lu(e,lD()|0,2);return}function lD(){return 1772}function sD(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;var u=0,a=0,l=0,s=0,c=0;u=h;h=h+32|0;s=u+16|0;c=u+12|0;a=u;l=Cu(cD()|0)|0;n=YE(n)|0;o[c>>2]=o[r>>2];o[s>>2]=o[c>>2];r=$w(s)|0;o[a>>2]=o[i>>2];s=i+4|0;o[a+4>>2]=o[s>>2];c=i+8|0;o[a+8>>2]=o[c>>2];o[c>>2]=0;o[s>>2]=0;o[i>>2]=0;uD(e,nt(0,l|0,t|0,n|0,r|0,Xw(a)|0)|0);zw(a);h=u;return}function cD(){var e=0;if(!(r[8008]|0)){fD(10768);e=8008;o[e>>2]=1;o[e+4>>2]=0}return 10768}function fD(e){e=e|0;Lu(e,dD()|0,3);return}function dD(){return 1784}function pD(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;var u=0,a=0,l=0,s=0;u=h;h=h+16|0;l=u+4|0;s=u;a=Cu(hD()|0)|0;n=YE(n)|0;o[s>>2]=o[r>>2];o[l>>2]=o[s>>2];r=$w(l)|0;uD(e,nt(0,a|0,t|0,n|0,r|0,Kw(i)|0)|0);h=u;return}function hD(){var e=0;if(!(r[8016]|0)){vD(10780);e=8016;o[e>>2]=1;o[e+4>>2]=0}return 10780}function vD(e){e=e|0;Lu(e,mD()|0,3);return}function mD(){return 1800}function gD(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=Cu(yD()|0)|0;uD(e,it(0,r|0,t|0,YE(n)|0)|0);return}function yD(){var e=0;if(!(r[8024]|0)){_D(10792);e=8024;o[e>>2]=1;o[e+4>>2]=0}return 10792}function _D(e){e=e|0;Lu(e,bD()|0,1);return}function bD(){return 1816}function wD(){ED();DD();SD();return}function ED(){o[2702]=YT(65536)|0;return}function DD(){$D(10856);return}function SD(){CD(10816);return}function CD(e){e=e|0;kD(e,5044);TD(e)|0;return}function kD(e,t){e=e|0;t=t|0;var n=0;n=nE()|0;o[e>>2]=n;zD(n,t);cw(o[e>>2]|0);return}function TD(e){e=e|0;var t=0;t=o[e>>2]|0;r_(t,xD()|0);return e|0}function xD(){var e=0;if(!(r[8032]|0)){AD(10820);Fe(64,10820,g|0)|0;e=8032;o[e>>2]=1;o[e+4>>2]=0}if(!(Xa(10820)|0))AD(10820);return 10820}function AD(e){e=e|0;ID(e);s_(e,25);return}function OD(e){e=e|0;PD(e+24|0);return}function PD(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function ID(e){e=e|0;var t=0;t=Za()|0;nl(e,5,18,t,LD()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function ND(e,t){e=e|0;t=t|0;MD(e,t);return}function MD(e,t){e=e|0;t=t|0;var n=0,r=0,i=0;n=h;h=h+16|0;r=n;i=n+4|0;cc(i,t);o[r>>2]=fc(i,t)|0;RD(e,r);h=n;return}function RD(e,t){e=e|0;t=t|0;FD(e+4|0,o[t>>2]|0);r[e+8>>0]=1;return}function FD(e,t){e=e|0;t=t|0;o[e>>2]=t;return}function LD(){return 1824}function BD(e){e=e|0;return jD(e)|0}function jD(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0;n=h;h=h+16|0;i=n+4|0;a=n;r=UD(8)|0;t=r;l=$T(4)|0;cc(i,e);FD(l,fc(i,e)|0);u=t+4|0;o[u>>2]=l;e=$T(8)|0;u=o[u>>2]|0;o[a>>2]=0;o[i>>2]=o[a>>2];iE(e,u,i);o[r>>2]=e;h=n;return t|0}function UD(e){e=e|0;var t=0,n=0;e=e+7&-8;if(e>>>0<=32768?(t=o[2701]|0,e>>>0<=(65536-t|0)>>>0):0){n=(o[2702]|0)+t|0;o[2701]=t+e;e=n}else{e=YT(e+8|0)|0;o[e>>2]=o[2703];o[2703]=e;e=e+8|0}return e|0}function zD(e,t){e=e|0;t=t|0;o[e>>2]=WD()|0;o[e+4>>2]=HD()|0;o[e+12>>2]=t;o[e+8>>2]=VD()|0;o[e+32>>2]=9;return}function WD(){return 11744}function HD(){return 1832}function VD(){return N_()|0}function qD(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){GD(n);KT(n)}}else if(t|0)KT(t);return}function GD(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function $D(e){e=e|0;YD(e,5052);KD(e)|0;XD(e,5058,26)|0;QD(e,5069,1)|0;JD(e,5077,10)|0;ZD(e,5087,19)|0;tS(e,5094,27)|0;return}function YD(e,t){e=e|0;t=t|0;var n=0;n=sk()|0;o[e>>2]=n;ck(n,t);cw(o[e>>2]|0);return}function KD(e){e=e|0;var t=0;t=o[e>>2]|0;r_(t,YC()|0);return e|0}function XD(e,t,n){e=e|0;t=t|0;n=n|0;TC(e,Ia(t)|0,n,0);return e|0}function QD(e,t,n){e=e|0;t=t|0;n=n|0;sC(e,Ia(t)|0,n,0);return e|0}function JD(e,t,n){e=e|0;t=t|0;n=n|0;BS(e,Ia(t)|0,n,0);return e|0}function ZD(e,t,n){e=e|0;t=t|0;n=n|0;bS(e,Ia(t)|0,n,0);return e|0}function eS(e,t){e=e|0;t=t|0;var n=0,r=0;e:while(1){n=o[2703]|0;while(1){if((n|0)==(t|0))break e;r=o[n>>2]|0;o[2703]=r;if(!n)n=r;else break}KT(n)}o[2701]=e;return}function tS(e,t,n){e=e|0;t=t|0;n=n|0;nS(e,Ia(t)|0,n,0);return e|0}function nS(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=rS()|0;e=iS(n)|0;La(u,t,i,e,oS(n,r)|0,r);return}function rS(){var e=0,t=0;if(!(r[8040]|0)){dS(10860);Fe(65,10860,g|0)|0;t=8040;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10860)|0)){e=10860;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));dS(10860)}return 10860}function iS(e){e=e|0;return e|0}function oS(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=rS()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){uS(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{aS(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function uS(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function aS(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=lS(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;sS(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;uS(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;cS(e,i);fS(i);h=l;return}}function lS(e){e=e|0;return 536870911}function sS(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function cS(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function fS(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function dS(e){e=e|0;vS(e);return}function pS(e){e=e|0;hS(e+24|0);return}function hS(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function vS(e){e=e|0;var t=0;t=Za()|0;nl(e,1,11,t,mS()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function mS(){return 1840}function gS(e,t,n){e=e|0;t=t|0;n=n|0;_S(o[(yS(e)|0)>>2]|0,t,n);return}function yS(e){e=e|0;return(o[(rS()|0)+24>>2]|0)+(e<<3)|0}function _S(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,o=0;r=h;h=h+16|0;o=r+1|0;i=r;cc(o,t);t=fc(o,t)|0;cc(i,n);n=fc(i,n)|0;vA[e&31](t,n);h=r;return}function bS(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=wS()|0;e=ES(n)|0;La(u,t,i,e,DS(n,r)|0,r);return}function wS(){var e=0,t=0;if(!(r[8048]|0)){OS(10896);Fe(66,10896,g|0)|0;t=8048;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10896)|0)){e=10896;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));OS(10896)}return 10896}function ES(e){e=e|0;return e|0}function DS(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=wS()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){SS(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{CS(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function SS(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function CS(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=kS(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;TS(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;SS(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;xS(e,i);AS(i);h=l;return}}function kS(e){e=e|0;return 536870911}function TS(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function xS(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function AS(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function OS(e){e=e|0;NS(e);return}function PS(e){e=e|0;IS(e+24|0);return}function IS(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function NS(e){e=e|0;var t=0;t=Za()|0;nl(e,1,11,t,MS()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function MS(){return 1852}function RS(e,t){e=e|0;t=t|0;return LS(o[(FS(e)|0)>>2]|0,t)|0}function FS(e){e=e|0;return(o[(wS()|0)+24>>2]|0)+(e<<3)|0}function LS(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;cc(r,t);t=fc(r,t)|0;t=Jc(mA[e&31](t)|0)|0;h=n;return t|0}function BS(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=jS()|0;e=US(n)|0;La(u,t,i,e,zS(n,r)|0,r);return}function jS(){var e=0,t=0;if(!(r[8056]|0)){YS(10932);Fe(67,10932,g|0)|0;t=8056;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10932)|0)){e=10932;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));YS(10932)}return 10932}function US(e){e=e|0;return e|0}function zS(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=jS()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){WS(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{HS(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function WS(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function HS(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=VS(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;qS(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;WS(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;GS(e,i);$S(i);h=l;return}}function VS(e){e=e|0;return 536870911}function qS(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function GS(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function $S(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function YS(e){e=e|0;QS(e);return}function KS(e){e=e|0;XS(e+24|0);return}function XS(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function QS(e){e=e|0;var t=0;t=Za()|0;nl(e,1,7,t,JS()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function JS(){return 1860}function ZS(e,t,n){e=e|0;t=t|0;n=n|0;return tC(o[(eC(e)|0)>>2]|0,t,n)|0}function eC(e){e=e|0;return(o[(jS()|0)+24>>2]|0)+(e<<3)|0}function tC(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0;r=h;h=h+32|0;a=r+12|0;u=r+8|0;l=r;s=r+16|0;i=r+4|0;nC(s,t);rC(l,s,t);Us(i,n);n=zs(i,n)|0;o[a>>2]=o[l>>2];PA[e&15](u,a,n);n=iC(u)|0;Zi(u);Ws(i);h=r;return n|0}function nC(e,t){e=e|0;t=t|0;return}function rC(e,t,n){e=e|0;t=t|0;n=n|0;oC(e,n);return}function iC(e){e=e|0;return Eu(e)|0}function oC(e,t){e=e|0;t=t|0;var n=0,r=0,i=0;i=h;h=h+16|0;n=i;r=t;if(!(r&1))o[e>>2]=o[t>>2];else{uC(n,0);Be(r|0,n|0)|0;aC(e,n);lC(n)}h=i;return}function uC(e,t){e=e|0;t=t|0;Iu(e,t);o[e+4>>2]=0;r[e+8>>0]=0;return}function aC(e,t){e=e|0;t=t|0;o[e>>2]=o[t+4>>2];return}function lC(e){e=e|0;r[e+8>>0]=0;return}function sC(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=cC()|0;e=fC(n)|0;La(u,t,i,e,dC(n,r)|0,r);return}function cC(){var e=0,t=0;if(!(r[8064]|0)){_C(10968);Fe(68,10968,g|0)|0;t=8064;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10968)|0)){e=10968;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));_C(10968)}return 10968}function fC(e){e=e|0;return e|0}function dC(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=cC()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){pC(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{hC(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function pC(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function hC(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=vC(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;mC(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;pC(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;gC(e,i);yC(i);h=l;return}}function vC(e){e=e|0;return 536870911}function mC(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function gC(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function yC(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function _C(e){e=e|0;EC(e);return}function bC(e){e=e|0;wC(e+24|0);return}function wC(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function EC(e){e=e|0;var t=0;t=Za()|0;nl(e,1,1,t,DC()|0,5);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function DC(){return 1872}function SC(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;kC(o[(CC(e)|0)>>2]|0,t,n,r,i,u);return}function CC(e){e=e|0;return(o[(cC()|0)+24>>2]|0)+(e<<3)|0}function kC(e,t,n,r,i,o){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;o=o|0;var u=0,a=0,l=0,s=0,c=0,f=0;u=h;h=h+32|0;a=u+16|0;l=u+12|0;s=u+8|0;c=u+4|0;f=u;Us(a,t);t=zs(a,t)|0;Us(l,n);n=zs(l,n)|0;Us(s,r);r=zs(s,r)|0;Us(c,i);i=zs(c,i)|0;Us(f,o);o=zs(f,o)|0;cA[e&1](t,n,r,i,o);Ws(f);Ws(c);Ws(s);Ws(l);Ws(a);h=u;return}function TC(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=xC()|0;e=AC(n)|0;La(u,t,i,e,OC(n,r)|0,r);return}function xC(){var e=0,t=0;if(!(r[8072]|0)){LC(11004);Fe(69,11004,g|0)|0;t=8072;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(11004)|0)){e=11004;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));LC(11004)}return 11004}function AC(e){e=e|0;return e|0}function OC(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=xC()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){PC(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{IC(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function PC(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function IC(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=NC(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;MC(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;PC(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;RC(e,i);FC(i);h=l;return}}function NC(e){e=e|0;return 536870911}function MC(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function RC(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function FC(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function LC(e){e=e|0;UC(e);return}function BC(e){e=e|0;jC(e+24|0);return}function jC(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function UC(e){e=e|0;var t=0;t=Za()|0;nl(e,1,12,t,zC()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function zC(){return 1896}function WC(e,t,n){e=e|0;t=t|0;n=n|0;VC(o[(HC(e)|0)>>2]|0,t,n);return}function HC(e){e=e|0;return(o[(xC()|0)+24>>2]|0)+(e<<3)|0}function VC(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,o=0;r=h;h=h+16|0;o=r+4|0;i=r;qC(o,t);t=GC(o,t)|0;Us(i,n);n=zs(i,n)|0;vA[e&31](t,n);Ws(i);h=r;return}function qC(e,t){e=e|0;t=t|0;return}function GC(e,t){e=e|0;t=t|0;return $C(t)|0}function $C(e){e=e|0;return e|0}function YC(){var e=0;if(!(r[8080]|0)){KC(11040);Fe(70,11040,g|0)|0;e=8080;o[e>>2]=1;o[e+4>>2]=0}if(!(Xa(11040)|0))KC(11040);return 11040}function KC(e){e=e|0;JC(e);s_(e,71);return}function XC(e){e=e|0;QC(e+24|0);return}function QC(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function JC(e){e=e|0;var t=0;t=Za()|0;nl(e,5,7,t,nk()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function ZC(e){e=e|0;ek(e);return}function ek(e){e=e|0;tk(e);return}function tk(e){e=e|0;r[e+8>>0]=1;return}function nk(){return 1936}function rk(){return ik()|0}function ik(){var e=0,t=0,n=0,r=0,i=0,u=0,a=0;t=h;h=h+16|0;i=t+4|0;a=t;n=UD(8)|0;e=n;u=e+4|0;o[u>>2]=$T(1)|0;r=$T(8)|0;u=o[u>>2]|0;o[a>>2]=0;o[i>>2]=o[a>>2];ok(r,u,i);o[n>>2]=r;h=t;return e|0}function ok(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;n=$T(16)|0;o[n+4>>2]=0;o[n+8>>2]=0;o[n>>2]=1916;o[n+12>>2]=t;o[e+4>>2]=n;return}function uk(e){e=e|0;zT(e);KT(e);return}function ak(e){e=e|0;e=o[e+12>>2]|0;if(e|0)KT(e);return}function lk(e){e=e|0;KT(e);return}function sk(){var e=0;if(!(r[8088]|0)){mk(11076);Fe(25,11076,g|0)|0;e=8088;o[e>>2]=1;o[e+4>>2]=0}return 11076}function ck(e,t){e=e|0;t=t|0;o[e>>2]=fk()|0;o[e+4>>2]=dk()|0;o[e+12>>2]=t;o[e+8>>2]=pk()|0;o[e+32>>2]=10;return}function fk(){return 11745}function dk(){return 1940}function pk(){return Wm()|0}function hk(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){vk(n);KT(n)}}else if(t|0)KT(t);return}function vk(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function mk(e){e=e|0;Al(e);return}function gk(e,t){e=e|0;t=t|0;o[e>>2]=t;return}function yk(e){e=e|0;return o[e>>2]|0}function _k(e){e=e|0;return r[o[e>>2]>>0]|0}function bk(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;o[r>>2]=o[e>>2];wk(t,r)|0;h=n;return}function wk(e,t){e=e|0;t=t|0;var n=0;n=Ek(o[e>>2]|0,t)|0;t=e+4|0;o[(o[t>>2]|0)+8>>2]=n;return o[(o[t>>2]|0)+8>>2]|0}function Ek(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;Dk(r);e=Eu(e)|0;t=Sk(e,o[t>>2]|0)|0;Ck(r);h=n;return t|0}function Dk(e){e=e|0;o[e>>2]=o[2701];o[e+4>>2]=o[2703];return}function Sk(e,t){e=e|0;t=t|0;var n=0;n=Cu(kk()|0)|0;return it(0,n|0,e|0,Kw(t)|0)|0}function Ck(e){e=e|0;eS(o[e>>2]|0,o[e+4>>2]|0);return}function kk(){var e=0;if(!(r[8096]|0)){Tk(11120);e=8096;o[e>>2]=1;o[e+4>>2]=0}return 11120}function Tk(e){e=e|0;Lu(e,xk()|0,1);return}function xk(){return 1948}function Ak(){Ok();return}function Ok(){var e=0,t=0,n=0,i=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0,y=0,_=0;y=h;h=h+16|0;p=y+4|0;v=y;Ne(65536,10804,o[2702]|0,10812);n=Cw()|0;t=o[n>>2]|0;e=o[t>>2]|0;if(e|0){i=o[n+8>>2]|0;n=o[n+4>>2]|0;while(1){ze(e|0,u[n>>0]|0|0,r[i>>0]|0);t=t+4|0;e=o[t>>2]|0;if(!e)break;else{i=i+1|0;n=n+1|0}}}e=Tw()|0;t=o[e>>2]|0;if(t|0)do{We(t|0,o[e+4>>2]|0);e=e+8|0;t=o[e>>2]|0}while((t|0)!=0);We(Pk()|0,5167);d=fw()|0;e=o[d>>2]|0;e:do{if(e|0){do{Ik(o[e+4>>2]|0);e=o[e>>2]|0}while((e|0)!=0);e=o[d>>2]|0;if(e|0){f=d;do{while(1){a=e;e=o[e>>2]|0;a=o[a+4>>2]|0;if(!(Nk(a)|0))break;o[v>>2]=f;o[p>>2]=o[v>>2];Mk(d,p)|0;if(!e)break e}Rk(a);f=o[f>>2]|0;t=Fk(a)|0;l=Xe()|0;s=h;h=h+((1*(t<<2)|0)+15&-16)|0;c=h;h=h+((1*(t<<2)|0)+15&-16)|0;t=o[(xE(a)|0)>>2]|0;if(t|0){n=s;i=c;while(1){o[n>>2]=o[(kE(o[t+4>>2]|0)|0)>>2];o[i>>2]=o[t+8>>2];t=o[t>>2]|0;if(!t)break;else{n=n+4|0;i=i+4|0}}}_=kE(a)|0;t=Lk(a)|0;n=Fk(a)|0;i=Bk(a)|0;Ge(_|0,t|0,s|0,c|0,n|0,i|0,Ew(a)|0);Re(l|0)}while((e|0)!=0)}}}while(0);e=o[(Sw()|0)>>2]|0;if(e|0)do{_=e+4|0;d=Pw(_)|0;a=Fw(d)|0;l=Iw(d)|0;s=(Nw(d)|0)+1|0;c=jk(d)|0;f=Uk(_)|0;d=Xa(d)|0;p=Bw(_)|0;v=zk(_)|0;Ve(0,a|0,l|0,s|0,c|0,f|0,d|0,p|0,v|0,Wk(_)|0);e=o[e>>2]|0}while((e|0)!=0);e=o[(fw()|0)>>2]|0;e:do{if(e|0){t:while(1){t=o[e+4>>2]|0;if(t|0?(m=o[(kE(t)|0)>>2]|0,g=o[(PE(t)|0)>>2]|0,g|0):0){n=g;do{t=n+4|0;i=Pw(t)|0;n:do{if(i|0)switch(Xa(i)|0){case 0:break t;case 4:case 3:case 2:{c=Fw(i)|0;f=Iw(i)|0;d=(Nw(i)|0)+1|0;p=jk(i)|0;v=Xa(i)|0;_=Bw(t)|0;Ve(m|0,c|0,f|0,d|0,p|0,0,v|0,_|0,zk(t)|0,Wk(t)|0);break n}case 1:{s=Fw(i)|0;c=Iw(i)|0;f=(Nw(i)|0)+1|0;d=jk(i)|0;p=Uk(t)|0;v=Xa(i)|0;_=Bw(t)|0;Ve(m|0,s|0,c|0,f|0,d|0,p|0,v|0,_|0,zk(t)|0,Wk(t)|0);break n}case 5:{d=Fw(i)|0;p=Iw(i)|0;v=(Nw(i)|0)+1|0;_=jk(i)|0;Ve(m|0,d|0,p|0,v|0,_|0,Hk(i)|0,Xa(i)|0,0,0,0);break n}default:break n}}while(0);n=o[n>>2]|0}while((n|0)!=0)}e=o[e>>2]|0;if(!e)break e}Ye()}}while(0);$e();h=y;return}function Pk(){return 11703}function Ik(e){e=e|0;r[e+40>>0]=0;return}function Nk(e){e=e|0;return(r[e+40>>0]|0)!=0|0}function Mk(e,t){e=e|0;t=t|0;t=Vk(t)|0;e=o[t>>2]|0;o[t>>2]=o[e>>2];KT(e);return o[t>>2]|0}function Rk(e){e=e|0;r[e+40>>0]=1;return}function Fk(e){e=e|0;return o[e+20>>2]|0}function Lk(e){e=e|0;return o[e+8>>2]|0}function Bk(e){e=e|0;return o[e+32>>2]|0}function jk(e){e=e|0;return o[e+4>>2]|0}function Uk(e){e=e|0;return o[e+4>>2]|0}function zk(e){e=e|0;return o[e+8>>2]|0}function Wk(e){e=e|0;return o[e+16>>2]|0}function Hk(e){e=e|0;return o[e+20>>2]|0}function Vk(e){e=e|0;return o[e>>2]|0}function qk(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0,y=0,_=0,b=0,w=0,E=0,D=0;D=h;h=h+16|0;p=D;do{if(e>>>0<245){c=e>>>0<11?16:e+11&-8;e=c>>>3;d=o[2783]|0;n=d>>>e;if(n&3|0){t=(n&1^1)+e|0;e=11172+(t<<1<<2)|0;n=e+8|0;r=o[n>>2]|0;i=r+8|0;u=o[i>>2]|0;if((e|0)==(u|0))o[2783]=d&~(1<>2]=e;o[n>>2]=u}E=t<<3;o[r+4>>2]=E|3;E=r+E+4|0;o[E>>2]=o[E>>2]|1;E=i;h=D;return E|0}f=o[2785]|0;if(c>>>0>f>>>0){if(n|0){t=2<>>12&16;t=t>>>a;n=t>>>5&8;t=t>>>n;i=t>>>2&4;t=t>>>i;e=t>>>1&2;t=t>>>e;r=t>>>1&1;r=(n|a|i|e|r)+(t>>>r)|0;t=11172+(r<<1<<2)|0;e=t+8|0;i=o[e>>2]|0;a=i+8|0;n=o[a>>2]|0;if((t|0)==(n|0)){e=d&~(1<>2]=t;o[e>>2]=n;e=d}u=(r<<3)-c|0;o[i+4>>2]=c|3;r=i+c|0;o[r+4>>2]=u|1;o[r+u>>2]=u;if(f|0){i=o[2788]|0;t=f>>>3;n=11172+(t<<1<<2)|0;t=1<>2]|0}o[e>>2]=i;o[t+12>>2]=i;o[i+8>>2]=t;o[i+12>>2]=n}o[2785]=u;o[2788]=r;E=a;h=D;return E|0}l=o[2784]|0;if(l){n=(l&0-l)+-1|0;a=n>>>12&16;n=n>>>a;u=n>>>5&8;n=n>>>u;s=n>>>2&4;n=n>>>s;r=n>>>1&2;n=n>>>r;e=n>>>1&1;e=o[11436+((u|a|s|r|e)+(n>>>e)<<2)>>2]|0;n=(o[e+4>>2]&-8)-c|0;r=o[e+16+(((o[e+16>>2]|0)==0&1)<<2)>>2]|0;if(!r){s=e;u=n}else{do{a=(o[r+4>>2]&-8)-c|0;s=a>>>0>>0;n=s?a:n;e=s?r:e;r=o[r+16+(((o[r+16>>2]|0)==0&1)<<2)>>2]|0}while((r|0)!=0);s=e;u=n}a=s+c|0;if(s>>>0>>0){i=o[s+24>>2]|0;t=o[s+12>>2]|0;do{if((t|0)==(s|0)){e=s+20|0;t=o[e>>2]|0;if(!t){e=s+16|0;t=o[e>>2]|0;if(!t){n=0;break}}while(1){n=t+20|0;r=o[n>>2]|0;if(r|0){t=r;e=n;continue}n=t+16|0;r=o[n>>2]|0;if(!r)break;else{t=r;e=n}}o[e>>2]=0;n=t}else{n=o[s+8>>2]|0;o[n+12>>2]=t;o[t+8>>2]=n;n=t}}while(0);do{if(i|0){t=o[s+28>>2]|0;e=11436+(t<<2)|0;if((s|0)==(o[e>>2]|0)){o[e>>2]=n;if(!n){o[2784]=l&~(1<>2]|0)!=(s|0)&1)<<2)>>2]=n;if(!n)break}o[n+24>>2]=i;t=o[s+16>>2]|0;if(t|0){o[n+16>>2]=t;o[t+24>>2]=n}t=o[s+20>>2]|0;if(t|0){o[n+20>>2]=t;o[t+24>>2]=n}}}while(0);if(u>>>0<16){E=u+c|0;o[s+4>>2]=E|3;E=s+E+4|0;o[E>>2]=o[E>>2]|1}else{o[s+4>>2]=c|3;o[a+4>>2]=u|1;o[a+u>>2]=u;if(f|0){r=o[2788]|0;t=f>>>3;n=11172+(t<<1<<2)|0;t=1<>2]|0}o[e>>2]=r;o[t+12>>2]=r;o[r+8>>2]=t;o[r+12>>2]=n}o[2785]=u;o[2788]=a}E=s+8|0;h=D;return E|0}else d=c}else d=c}else d=c}else if(e>>>0<=4294967231){e=e+11|0;c=e&-8;s=o[2784]|0;if(s){r=0-c|0;e=e>>>8;if(e){if(c>>>0>16777215)l=31;else{d=(e+1048320|0)>>>16&8;w=e<>>16&4;w=w<>>16&2;l=14-(f|d|l)+(w<>>15)|0;l=c>>>(l+7|0)&1|l<<1}}else l=0;n=o[11436+(l<<2)>>2]|0;e:do{if(!n){n=0;e=0;w=57}else{e=0;a=c<<((l|0)==31?0:25-(l>>>1)|0);u=0;while(1){i=(o[n+4>>2]&-8)-c|0;if(i>>>0>>0)if(!i){e=n;r=0;i=n;w=61;break e}else{e=n;r=i}i=o[n+20>>2]|0;n=o[n+16+(a>>>31<<2)>>2]|0;u=(i|0)==0|(i|0)==(n|0)?u:i;i=(n|0)==0;if(i){n=u;w=57;break}else a=a<<((i^1)&1)}}}while(0);if((w|0)==57){if((n|0)==0&(e|0)==0){e=2<>>12&16;d=d>>>a;u=d>>>5&8;d=d>>>u;l=d>>>2&4;d=d>>>l;f=d>>>1&2;d=d>>>f;n=d>>>1&1;e=0;n=o[11436+((u|a|l|f|n)+(d>>>n)<<2)>>2]|0}if(!n){l=e;a=r}else{i=n;w=61}}if((w|0)==61)while(1){w=0;n=(o[i+4>>2]&-8)-c|0;d=n>>>0>>0;n=d?n:r;e=d?i:e;i=o[i+16+(((o[i+16>>2]|0)==0&1)<<2)>>2]|0;if(!i){l=e;a=n;break}else{r=n;w=61}}if((l|0)!=0?a>>>0<((o[2785]|0)-c|0)>>>0:0){u=l+c|0;if(l>>>0>=u>>>0){E=0;h=D;return E|0}i=o[l+24>>2]|0;t=o[l+12>>2]|0;do{if((t|0)==(l|0)){e=l+20|0;t=o[e>>2]|0;if(!t){e=l+16|0;t=o[e>>2]|0;if(!t){t=0;break}}while(1){n=t+20|0;r=o[n>>2]|0;if(r|0){t=r;e=n;continue}n=t+16|0;r=o[n>>2]|0;if(!r)break;else{t=r;e=n}}o[e>>2]=0}else{E=o[l+8>>2]|0;o[E+12>>2]=t;o[t+8>>2]=E}}while(0);do{if(i){e=o[l+28>>2]|0;n=11436+(e<<2)|0;if((l|0)==(o[n>>2]|0)){o[n>>2]=t;if(!t){r=s&~(1<>2]|0)!=(l|0)&1)<<2)>>2]=t;if(!t){r=s;break}}o[t+24>>2]=i;e=o[l+16>>2]|0;if(e|0){o[t+16>>2]=e;o[e+24>>2]=t}e=o[l+20>>2]|0;if(e){o[t+20>>2]=e;o[e+24>>2]=t;r=s}else r=s}else r=s}while(0);do{if(a>>>0>=16){o[l+4>>2]=c|3;o[u+4>>2]=a|1;o[u+a>>2]=a;t=a>>>3;if(a>>>0<256){n=11172+(t<<1<<2)|0;e=o[2783]|0;t=1<>2]|0}o[e>>2]=u;o[t+12>>2]=u;o[u+8>>2]=t;o[u+12>>2]=n;break}t=a>>>8;if(t){if(a>>>0>16777215)t=31;else{w=(t+1048320|0)>>>16&8;E=t<>>16&4;E=E<>>16&2;t=14-(b|w|t)+(E<>>15)|0;t=a>>>(t+7|0)&1|t<<1}}else t=0;n=11436+(t<<2)|0;o[u+28>>2]=t;e=u+16|0;o[e+4>>2]=0;o[e>>2]=0;e=1<>2]=u;o[u+24>>2]=n;o[u+12>>2]=u;o[u+8>>2]=u;break}e=a<<((t|0)==31?0:25-(t>>>1)|0);n=o[n>>2]|0;while(1){if((o[n+4>>2]&-8|0)==(a|0)){w=97;break}r=n+16+(e>>>31<<2)|0;t=o[r>>2]|0;if(!t){w=96;break}else{e=e<<1;n=t}}if((w|0)==96){o[r>>2]=u;o[u+24>>2]=n;o[u+12>>2]=u;o[u+8>>2]=u;break}else if((w|0)==97){w=n+8|0;E=o[w>>2]|0;o[E+12>>2]=u;o[w>>2]=u;o[u+8>>2]=E;o[u+12>>2]=n;o[u+24>>2]=0;break}}else{E=a+c|0;o[l+4>>2]=E|3;E=l+E+4|0;o[E>>2]=o[E>>2]|1}}while(0);E=l+8|0;h=D;return E|0}else d=c}else d=c}else d=-1}while(0);n=o[2785]|0;if(n>>>0>=d>>>0){t=n-d|0;e=o[2788]|0;if(t>>>0>15){E=e+d|0;o[2788]=E;o[2785]=t;o[E+4>>2]=t|1;o[E+t>>2]=t;o[e+4>>2]=d|3}else{o[2785]=0;o[2788]=0;o[e+4>>2]=n|3;E=e+n+4|0;o[E>>2]=o[E>>2]|1}E=e+8|0;h=D;return E|0}a=o[2786]|0;if(a>>>0>d>>>0){b=a-d|0;o[2786]=b;E=o[2789]|0;w=E+d|0;o[2789]=w;o[w+4>>2]=b|1;o[E+4>>2]=d|3;E=E+8|0;h=D;return E|0}if(!(o[2901]|0)){o[2903]=4096;o[2902]=4096;o[2904]=-1;o[2905]=-1;o[2906]=0;o[2894]=0;e=p&-16^1431655768;o[p>>2]=e;o[2901]=e;e=4096}else e=o[2903]|0;l=d+48|0;s=d+47|0;u=e+s|0;i=0-e|0;c=u&i;if(c>>>0<=d>>>0){E=0;h=D;return E|0}e=o[2893]|0;if(e|0?(f=o[2891]|0,p=f+c|0,p>>>0<=f>>>0|p>>>0>e>>>0):0){E=0;h=D;return E|0}e:do{if(!(o[2894]&4)){n=o[2789]|0;t:do{if(n){r=11580;while(1){e=o[r>>2]|0;if(e>>>0<=n>>>0?(g=r+4|0,(e+(o[g>>2]|0)|0)>>>0>n>>>0):0)break;e=o[r+8>>2]|0;if(!e){w=118;break t}else r=e}t=u-a&i;if(t>>>0<2147483647){e=lx(t|0)|0;if((e|0)==((o[r>>2]|0)+(o[g>>2]|0)|0)){if((e|0)!=(-1|0)){a=t;u=e;w=135;break e}}else{r=e;w=126}}else t=0}else w=118}while(0);do{if((w|0)==118){n=lx(0)|0;if((n|0)!=(-1|0)?(t=n,v=o[2902]|0,m=v+-1|0,t=((m&t|0)==0?0:(m+t&0-v)-t|0)+c|0,v=o[2891]|0,m=t+v|0,t>>>0>d>>>0&t>>>0<2147483647):0){g=o[2893]|0;if(g|0?m>>>0<=v>>>0|m>>>0>g>>>0:0){t=0;break}e=lx(t|0)|0;if((e|0)==(n|0)){a=t;u=n;w=135;break e}else{r=e;w=126}}else t=0}}while(0);do{if((w|0)==126){n=0-t|0;if(!(l>>>0>t>>>0&(t>>>0<2147483647&(r|0)!=(-1|0))))if((r|0)==(-1|0)){t=0;break}else{a=t;u=r;w=135;break e}e=o[2903]|0;e=s-t+e&0-e;if(e>>>0>=2147483647){a=t;u=r;w=135;break e}if((lx(e|0)|0)==(-1|0)){lx(n|0)|0;t=0;break}else{a=e+t|0;u=r;w=135;break e}}}while(0);o[2894]=o[2894]|4;w=133}else{t=0;w=133}}while(0);if(((w|0)==133?c>>>0<2147483647:0)?(b=lx(c|0)|0,g=lx(0)|0,y=g-b|0,_=y>>>0>(d+40|0)>>>0,!((b|0)==(-1|0)|_^1|b>>>0>>0&((b|0)!=(-1|0)&(g|0)!=(-1|0))^1)):0){a=_?y:t;u=b;w=135}if((w|0)==135){t=(o[2891]|0)+a|0;o[2891]=t;if(t>>>0>(o[2892]|0)>>>0)o[2892]=t;s=o[2789]|0;do{if(s){t=11580;while(1){e=o[t>>2]|0;n=t+4|0;r=o[n>>2]|0;if((u|0)==(e+r|0)){w=145;break}i=o[t+8>>2]|0;if(!i)break;else t=i}if(((w|0)==145?(o[t+12>>2]&8|0)==0:0)?s>>>0>>0&s>>>0>=e>>>0:0){o[n>>2]=r+a;E=s+8|0;E=(E&7|0)==0?0:0-E&7;w=s+E|0;E=(o[2786]|0)+(a-E)|0;o[2789]=w;o[2786]=E;o[w+4>>2]=E|1;o[w+E+4>>2]=40;o[2790]=o[2905];break}if(u>>>0<(o[2787]|0)>>>0)o[2787]=u;n=u+a|0;t=11580;while(1){if((o[t>>2]|0)==(n|0)){w=153;break}e=o[t+8>>2]|0;if(!e)break;else t=e}if((w|0)==153?(o[t+12>>2]&8|0)==0:0){o[t>>2]=u;f=t+4|0;o[f>>2]=(o[f>>2]|0)+a;f=u+8|0;f=u+((f&7|0)==0?0:0-f&7)|0;t=n+8|0;t=n+((t&7|0)==0?0:0-t&7)|0;c=f+d|0;l=t-f-d|0;o[f+4>>2]=d|3;do{if((t|0)!=(s|0)){if((t|0)==(o[2788]|0)){E=(o[2785]|0)+l|0;o[2785]=E;o[2788]=c;o[c+4>>2]=E|1;o[c+E>>2]=E;break}e=o[t+4>>2]|0;if((e&3|0)==1){a=e&-8;r=e>>>3;e:do{if(e>>>0<256){e=o[t+8>>2]|0;n=o[t+12>>2]|0;if((n|0)==(e|0)){o[2783]=o[2783]&~(1<>2]=n;o[n+8>>2]=e;break}}else{u=o[t+24>>2]|0;e=o[t+12>>2]|0;do{if((e|0)==(t|0)){r=t+16|0;n=r+4|0;e=o[n>>2]|0;if(!e){e=o[r>>2]|0;if(!e){e=0;break}else n=r}while(1){r=e+20|0;i=o[r>>2]|0;if(i|0){e=i;n=r;continue}r=e+16|0;i=o[r>>2]|0;if(!i)break;else{e=i;n=r}}o[n>>2]=0}else{E=o[t+8>>2]|0;o[E+12>>2]=e;o[e+8>>2]=E}}while(0);if(!u)break;n=o[t+28>>2]|0;r=11436+(n<<2)|0;do{if((t|0)!=(o[r>>2]|0)){o[u+16+(((o[u+16>>2]|0)!=(t|0)&1)<<2)>>2]=e;if(!e)break e}else{o[r>>2]=e;if(e|0)break;o[2784]=o[2784]&~(1<>2]=u;n=t+16|0;r=o[n>>2]|0;if(r|0){o[e+16>>2]=r;o[r+24>>2]=e}n=o[n+4>>2]|0;if(!n)break;o[e+20>>2]=n;o[n+24>>2]=e}}while(0);t=t+a|0;i=a+l|0}else i=l;t=t+4|0;o[t>>2]=o[t>>2]&-2;o[c+4>>2]=i|1;o[c+i>>2]=i;t=i>>>3;if(i>>>0<256){n=11172+(t<<1<<2)|0;e=o[2783]|0;t=1<>2]|0}o[e>>2]=c;o[t+12>>2]=c;o[c+8>>2]=t;o[c+12>>2]=n;break}t=i>>>8;do{if(!t)t=0;else{if(i>>>0>16777215){t=31;break}w=(t+1048320|0)>>>16&8;E=t<>>16&4;E=E<>>16&2;t=14-(b|w|t)+(E<>>15)|0;t=i>>>(t+7|0)&1|t<<1}}while(0);r=11436+(t<<2)|0;o[c+28>>2]=t;e=c+16|0;o[e+4>>2]=0;o[e>>2]=0;e=o[2784]|0;n=1<>2]=c;o[c+24>>2]=r;o[c+12>>2]=c;o[c+8>>2]=c;break}e=i<<((t|0)==31?0:25-(t>>>1)|0);n=o[r>>2]|0;while(1){if((o[n+4>>2]&-8|0)==(i|0)){w=194;break}r=n+16+(e>>>31<<2)|0;t=o[r>>2]|0;if(!t){w=193;break}else{e=e<<1;n=t}}if((w|0)==193){o[r>>2]=c;o[c+24>>2]=n;o[c+12>>2]=c;o[c+8>>2]=c;break}else if((w|0)==194){w=n+8|0;E=o[w>>2]|0;o[E+12>>2]=c;o[w>>2]=c;o[c+8>>2]=E;o[c+12>>2]=n;o[c+24>>2]=0;break}}else{E=(o[2786]|0)+l|0;o[2786]=E;o[2789]=c;o[c+4>>2]=E|1}}while(0);E=f+8|0;h=D;return E|0}t=11580;while(1){e=o[t>>2]|0;if(e>>>0<=s>>>0?(E=e+(o[t+4>>2]|0)|0,E>>>0>s>>>0):0)break;t=o[t+8>>2]|0}i=E+-47|0;e=i+8|0;e=i+((e&7|0)==0?0:0-e&7)|0;i=s+16|0;e=e>>>0>>0?s:e;t=e+8|0;n=u+8|0;n=(n&7|0)==0?0:0-n&7;w=u+n|0;n=a+-40-n|0;o[2789]=w;o[2786]=n;o[w+4>>2]=n|1;o[w+n+4>>2]=40;o[2790]=o[2905];n=e+4|0;o[n>>2]=27;o[t>>2]=o[2895];o[t+4>>2]=o[2896];o[t+8>>2]=o[2897];o[t+12>>2]=o[2898];o[2895]=u;o[2896]=a;o[2898]=0;o[2897]=t;t=e+24|0;do{w=t;t=t+4|0;o[t>>2]=7}while((w+8|0)>>>0>>0);if((e|0)!=(s|0)){u=e-s|0;o[n>>2]=o[n>>2]&-2;o[s+4>>2]=u|1;o[e>>2]=u;t=u>>>3;if(u>>>0<256){n=11172+(t<<1<<2)|0;e=o[2783]|0;t=1<>2]|0}o[e>>2]=s;o[t+12>>2]=s;o[s+8>>2]=t;o[s+12>>2]=n;break}t=u>>>8;if(t){if(u>>>0>16777215)n=31;else{w=(t+1048320|0)>>>16&8;E=t<>>16&4;E=E<>>16&2;n=14-(b|w|n)+(E<>>15)|0;n=u>>>(n+7|0)&1|n<<1}}else n=0;r=11436+(n<<2)|0;o[s+28>>2]=n;o[s+20>>2]=0;o[i>>2]=0;t=o[2784]|0;e=1<>2]=s;o[s+24>>2]=r;o[s+12>>2]=s;o[s+8>>2]=s;break}e=u<<((n|0)==31?0:25-(n>>>1)|0);n=o[r>>2]|0;while(1){if((o[n+4>>2]&-8|0)==(u|0)){w=216;break}r=n+16+(e>>>31<<2)|0;t=o[r>>2]|0;if(!t){w=215;break}else{e=e<<1;n=t}}if((w|0)==215){o[r>>2]=s;o[s+24>>2]=n;o[s+12>>2]=s;o[s+8>>2]=s;break}else if((w|0)==216){w=n+8|0;E=o[w>>2]|0;o[E+12>>2]=s;o[w>>2]=s;o[s+8>>2]=E;o[s+12>>2]=n;o[s+24>>2]=0;break}}}else{E=o[2787]|0;if((E|0)==0|u>>>0>>0)o[2787]=u;o[2895]=u;o[2896]=a;o[2898]=0;o[2792]=o[2901];o[2791]=-1;t=0;do{E=11172+(t<<1<<2)|0;o[E+12>>2]=E;o[E+8>>2]=E;t=t+1|0}while((t|0)!=32);E=u+8|0;E=(E&7|0)==0?0:0-E&7;w=u+E|0;E=a+-40-E|0;o[2789]=w;o[2786]=E;o[w+4>>2]=E|1;o[w+E+4>>2]=40;o[2790]=o[2905]}}while(0);t=o[2786]|0;if(t>>>0>d>>>0){b=t-d|0;o[2786]=b;E=o[2789]|0;w=E+d|0;o[2789]=w;o[w+4>>2]=b|1;o[E+4>>2]=d|3;E=E+8|0;h=D;return E|0}}o[(Jk()|0)>>2]=12;E=0;h=D;return E|0}function Gk(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0,s=0;if(!e)return;n=e+-8|0;i=o[2787]|0;e=o[e+-4>>2]|0;t=e&-8;s=n+t|0;do{if(!(e&1)){r=o[n>>2]|0;if(!(e&3))return;a=n+(0-r)|0;u=r+t|0;if(a>>>0>>0)return;if((a|0)==(o[2788]|0)){e=s+4|0;t=o[e>>2]|0;if((t&3|0)!=3){l=a;t=u;break}o[2785]=u;o[e>>2]=t&-2;o[a+4>>2]=u|1;o[a+u>>2]=u;return}n=r>>>3;if(r>>>0<256){e=o[a+8>>2]|0;t=o[a+12>>2]|0;if((t|0)==(e|0)){o[2783]=o[2783]&~(1<>2]=t;o[t+8>>2]=e;l=a;t=u;break}}i=o[a+24>>2]|0;e=o[a+12>>2]|0;do{if((e|0)==(a|0)){n=a+16|0;t=n+4|0;e=o[t>>2]|0;if(!e){e=o[n>>2]|0;if(!e){e=0;break}else t=n}while(1){n=e+20|0;r=o[n>>2]|0;if(r|0){e=r;t=n;continue}n=e+16|0;r=o[n>>2]|0;if(!r)break;else{e=r;t=n}}o[t>>2]=0}else{l=o[a+8>>2]|0;o[l+12>>2]=e;o[e+8>>2]=l}}while(0);if(i){t=o[a+28>>2]|0;n=11436+(t<<2)|0;if((a|0)==(o[n>>2]|0)){o[n>>2]=e;if(!e){o[2784]=o[2784]&~(1<>2]|0)!=(a|0)&1)<<2)>>2]=e;if(!e){l=a;t=u;break}}o[e+24>>2]=i;t=a+16|0;n=o[t>>2]|0;if(n|0){o[e+16>>2]=n;o[n+24>>2]=e}t=o[t+4>>2]|0;if(t){o[e+20>>2]=t;o[t+24>>2]=e;l=a;t=u}else{l=a;t=u}}else{l=a;t=u}}else{l=n;a=n}}while(0);if(a>>>0>=s>>>0)return;e=s+4|0;r=o[e>>2]|0;if(!(r&1))return;if(!(r&2)){e=o[2788]|0;if((s|0)==(o[2789]|0)){s=(o[2786]|0)+t|0;o[2786]=s;o[2789]=l;o[l+4>>2]=s|1;if((l|0)!=(e|0))return;o[2788]=0;o[2785]=0;return}if((s|0)==(e|0)){s=(o[2785]|0)+t|0;o[2785]=s;o[2788]=a;o[l+4>>2]=s|1;o[a+s>>2]=s;return}i=(r&-8)+t|0;n=r>>>3;do{if(r>>>0<256){t=o[s+8>>2]|0;e=o[s+12>>2]|0;if((e|0)==(t|0)){o[2783]=o[2783]&~(1<>2]=e;o[e+8>>2]=t;break}}else{u=o[s+24>>2]|0;e=o[s+12>>2]|0;do{if((e|0)==(s|0)){n=s+16|0;t=n+4|0;e=o[t>>2]|0;if(!e){e=o[n>>2]|0;if(!e){n=0;break}else t=n}while(1){n=e+20|0;r=o[n>>2]|0;if(r|0){e=r;t=n;continue}n=e+16|0;r=o[n>>2]|0;if(!r)break;else{e=r;t=n}}o[t>>2]=0;n=e}else{n=o[s+8>>2]|0;o[n+12>>2]=e;o[e+8>>2]=n;n=e}}while(0);if(u|0){e=o[s+28>>2]|0;t=11436+(e<<2)|0;if((s|0)==(o[t>>2]|0)){o[t>>2]=n;if(!n){o[2784]=o[2784]&~(1<>2]|0)!=(s|0)&1)<<2)>>2]=n;if(!n)break}o[n+24>>2]=u;e=s+16|0;t=o[e>>2]|0;if(t|0){o[n+16>>2]=t;o[t+24>>2]=n}e=o[e+4>>2]|0;if(e|0){o[n+20>>2]=e;o[e+24>>2]=n}}}}while(0);o[l+4>>2]=i|1;o[a+i>>2]=i;if((l|0)==(o[2788]|0)){o[2785]=i;return}}else{o[e>>2]=r&-2;o[l+4>>2]=t|1;o[a+t>>2]=t;i=t}e=i>>>3;if(i>>>0<256){n=11172+(e<<1<<2)|0;t=o[2783]|0;e=1<>2]|0}o[t>>2]=l;o[e+12>>2]=l;o[l+8>>2]=e;o[l+12>>2]=n;return}e=i>>>8;if(e){if(i>>>0>16777215)e=31;else{a=(e+1048320|0)>>>16&8;s=e<>>16&4;s=s<>>16&2;e=14-(u|a|e)+(s<>>15)|0;e=i>>>(e+7|0)&1|e<<1}}else e=0;r=11436+(e<<2)|0;o[l+28>>2]=e;o[l+20>>2]=0;o[l+16>>2]=0;t=o[2784]|0;n=1<>>1)|0);n=o[r>>2]|0;while(1){if((o[n+4>>2]&-8|0)==(i|0)){e=73;break}r=n+16+(t>>>31<<2)|0;e=o[r>>2]|0;if(!e){e=72;break}else{t=t<<1;n=e}}if((e|0)==72){o[r>>2]=l;o[l+24>>2]=n;o[l+12>>2]=l;o[l+8>>2]=l;break}else if((e|0)==73){a=n+8|0;s=o[a>>2]|0;o[s+12>>2]=l;o[a>>2]=l;o[l+8>>2]=s;o[l+12>>2]=n;o[l+24>>2]=0;break}}else{o[2784]=t|n;o[r>>2]=l;o[l+24>>2]=r;o[l+12>>2]=l;o[l+8>>2]=l}}while(0);s=(o[2791]|0)+-1|0;o[2791]=s;if(!s)e=11588;else return;while(1){e=o[e>>2]|0;if(!e)break;else e=e+8|0}o[2791]=-1;return}function $k(){return 11628}function Yk(e){e=e|0;var t=0,n=0;t=h;h=h+16|0;n=t;o[n>>2]=tT(o[e+60>>2]|0)|0;e=Qk(ut(6,n|0)|0)|0;h=t;return e|0}function Kk(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0;d=h;h=h+48|0;c=d+16|0;u=d;i=d+32|0;l=e+28|0;r=o[l>>2]|0;o[i>>2]=r;s=e+20|0;r=(o[s>>2]|0)-r|0;o[i+4>>2]=r;o[i+8>>2]=t;o[i+12>>2]=n;r=r+n|0;a=e+60|0;o[u>>2]=o[a>>2];o[u+4>>2]=i;o[u+8>>2]=2;u=Qk(st(146,u|0)|0)|0;e:do{if((r|0)!=(u|0)){t=2;while(1){if((u|0)<0)break;r=r-u|0;v=o[i+4>>2]|0;p=u>>>0>v>>>0;i=p?i+8|0:i;t=(p<<31>>31)+t|0;v=u-(p?v:0)|0;o[i>>2]=(o[i>>2]|0)+v;p=i+4|0;o[p>>2]=(o[p>>2]|0)-v;o[c>>2]=o[a>>2];o[c+4>>2]=i;o[c+8>>2]=t;u=Qk(st(146,c|0)|0)|0;if((r|0)==(u|0)){f=3;break e}}o[e+16>>2]=0;o[l>>2]=0;o[s>>2]=0;o[e>>2]=o[e>>2]|32;if((t|0)==2)n=0;else n=n-(o[i+4>>2]|0)|0}else f=3}while(0);if((f|0)==3){v=o[e+44>>2]|0;o[e+16>>2]=v+(o[e+48>>2]|0);o[l>>2]=v;o[s>>2]=v}h=d;return n|0}function Xk(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0;i=h;h=h+32|0;u=i;r=i+20|0;o[u>>2]=o[e+60>>2];o[u+4>>2]=0;o[u+8>>2]=t;o[u+12>>2]=r;o[u+16>>2]=n;if((Qk(lt(140,u|0)|0)|0)<0){o[r>>2]=-1;e=-1}else e=o[r>>2]|0;h=i;return e|0}function Qk(e){e=e|0;if(e>>>0>4294963200){o[(Jk()|0)>>2]=0-e;e=-1}return e|0}function Jk(){return(Zk()|0)+64|0}function Zk(){return eT()|0}function eT(){return 2084}function tT(e){e=e|0;return e|0}function nT(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0;u=h;h=h+32|0;i=u;o[e+36>>2]=1;if((o[e>>2]&64|0)==0?(o[i>>2]=o[e+60>>2],o[i+4>>2]=21523,o[i+8>>2]=u+16,Qe(54,i|0)|0):0)r[e+75>>0]=-1;i=Kk(e,t,n)|0;h=u;return i|0}function rT(e,t){e=e|0;t=t|0;var n=0,i=0;n=r[e>>0]|0;i=r[t>>0]|0;if(n<<24>>24==0?1:n<<24>>24!=i<<24>>24)e=i;else{do{e=e+1|0;t=t+1|0;n=r[e>>0]|0;i=r[t>>0]|0}while(!(n<<24>>24==0?1:n<<24>>24!=i<<24>>24));e=i}return(n&255)-(e&255)|0}function iT(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,o=0;e:do{if(!n)e=0;else{while(1){i=r[e>>0]|0;o=r[t>>0]|0;if(i<<24>>24!=o<<24>>24)break;n=n+-1|0;if(!n){e=0;break e}else{e=e+1|0;t=t+1|0}}e=(i&255)-(o&255)|0}}while(0);return e|0}function oT(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0,y=0;y=h;h=h+224|0;d=y+120|0;p=y+80|0;m=y;g=y+136|0;i=p;u=i+40|0;do{o[i>>2]=0;i=i+4|0}while((i|0)<(u|0));o[d>>2]=o[n>>2];if((uT(0,t,d,m,p)|0)<0)n=-1;else{if((o[e+76>>2]|0)>-1)v=aT(e)|0;else v=0;n=o[e>>2]|0;f=n&32;if((r[e+74>>0]|0)<1)o[e>>2]=n&-33;i=e+48|0;if(!(o[i>>2]|0)){u=e+44|0;a=o[u>>2]|0;o[u>>2]=g;l=e+28|0;o[l>>2]=g;s=e+20|0;o[s>>2]=g;o[i>>2]=80;c=e+16|0;o[c>>2]=g+80;n=uT(e,t,d,m,p)|0;if(a){_A[o[e+36>>2]&7](e,0,0)|0;n=(o[s>>2]|0)==0?-1:n;o[u>>2]=a;o[i>>2]=0;o[c>>2]=0;o[l>>2]=0;o[s>>2]=0}}else n=uT(e,t,d,m,p)|0;i=o[e>>2]|0;o[e>>2]=i|f;if(v|0)lT(e);n=(i&32|0)==0?n:-1}h=y;return n|0}function uT(e,t,n,u,a){e=e|0;t=t|0;n=n|0;u=u|0;a=a|0;var l=0,s=0,f=0,d=0,p=0,v=0,m=0,g=0,y=0,_=0,b=0,w=0,E=0,D=0,S=0,C=0,k=0,T=0,x=0,O=0,P=0,I=0,N=0;N=h;h=h+64|0;x=N+16|0;O=N;k=N+24|0;P=N+8|0;I=N+20|0;o[x>>2]=t;D=(e|0)!=0;S=k+40|0;C=S;k=k+39|0;T=P+4|0;s=0;l=0;v=0;e:while(1){do{if((l|0)>-1)if((s|0)>(2147483647-l|0)){o[(Jk()|0)>>2]=75;l=-1;break}else{l=s+l|0;break}}while(0);s=r[t>>0]|0;if(!(s<<24>>24)){E=87;break}else f=t;t:while(1){switch(s<<24>>24){case 37:{s=f;E=9;break t}case 0:{s=f;break t}default:{}}w=f+1|0;o[x>>2]=w;s=r[w>>0]|0;f=w}t:do{if((E|0)==9)while(1){E=0;if((r[f+1>>0]|0)!=37)break t;s=s+1|0;f=f+2|0;o[x>>2]=f;if((r[f>>0]|0)==37)E=9;else break}}while(0);s=s-t|0;if(D)sT(e,t,s);if(s|0){t=f;continue}d=f+1|0;s=(r[d>>0]|0)+-48|0;if(s>>>0<10){w=(r[f+2>>0]|0)==36;b=w?s:-1;v=w?1:v;d=w?f+3|0:d}else b=-1;o[x>>2]=d;s=r[d>>0]|0;f=(s<<24>>24)+-32|0;t:do{if(f>>>0<32){p=0;m=s;while(1){s=1<>2]=d;s=r[d>>0]|0;f=(s<<24>>24)+-32|0;if(f>>>0>=32)break;else m=s}}else p=0}while(0);if(s<<24>>24==42){f=d+1|0;s=(r[f>>0]|0)+-48|0;if(s>>>0<10?(r[d+2>>0]|0)==36:0){o[a+(s<<2)>>2]=10;s=o[u+((r[f>>0]|0)+-48<<3)>>2]|0;v=1;d=d+3|0}else{if(v|0){l=-1;break}if(D){v=(o[n>>2]|0)+(4-1)&~(4-1);s=o[v>>2]|0;o[n>>2]=v+4;v=0;d=f}else{s=0;v=0;d=f}}o[x>>2]=d;w=(s|0)<0;s=w?0-s|0:s;p=w?p|8192:p}else{s=cT(x)|0;if((s|0)<0){l=-1;break}d=o[x>>2]|0}do{if((r[d>>0]|0)==46){if((r[d+1>>0]|0)!=42){o[x>>2]=d+1;f=cT(x)|0;d=o[x>>2]|0;break}m=d+2|0;f=(r[m>>0]|0)+-48|0;if(f>>>0<10?(r[d+3>>0]|0)==36:0){o[a+(f<<2)>>2]=10;f=o[u+((r[m>>0]|0)+-48<<3)>>2]|0;d=d+4|0;o[x>>2]=d;break}if(v|0){l=-1;break e}if(D){w=(o[n>>2]|0)+(4-1)&~(4-1);f=o[w>>2]|0;o[n>>2]=w+4}else f=0;o[x>>2]=m;d=m}else f=-1}while(0);_=0;while(1){if(((r[d>>0]|0)+-65|0)>>>0>57){l=-1;break e}w=d+1|0;o[x>>2]=w;m=r[(r[d>>0]|0)+-65+(5178+(_*58|0))>>0]|0;g=m&255;if((g+-1|0)>>>0<8){_=g;d=w}else break}if(!(m<<24>>24)){l=-1;break}y=(b|0)>-1;do{if(m<<24>>24==19){if(y){l=-1;break e}else E=49}else{if(y){o[a+(b<<2)>>2]=g;y=u+(b<<3)|0;b=o[y+4>>2]|0;E=O;o[E>>2]=o[y>>2];o[E+4>>2]=b;E=49;break}if(!D){l=0;break e}fT(O,g,n)}}while(0);if((E|0)==49?(E=0,!D):0){s=0;t=w;continue}d=r[d>>0]|0;d=(_|0)!=0&(d&15|0)==3?d&-33:d;y=p&-65537;b=(p&8192|0)==0?p:y;t:do{switch(d|0){case 110:switch((_&255)<<24>>24){case 0:{o[o[O>>2]>>2]=l;s=0;t=w;continue e}case 1:{o[o[O>>2]>>2]=l;s=0;t=w;continue e}case 2:{s=o[O>>2]|0;o[s>>2]=l;o[s+4>>2]=((l|0)<0)<<31>>31;s=0;t=w;continue e}case 3:{i[o[O>>2]>>1]=l;s=0;t=w;continue e}case 4:{r[o[O>>2]>>0]=l;s=0;t=w;continue e}case 6:{o[o[O>>2]>>2]=l;s=0;t=w;continue e}case 7:{s=o[O>>2]|0;o[s>>2]=l;o[s+4>>2]=((l|0)<0)<<31>>31;s=0;t=w;continue e}default:{s=0;t=w;continue e}}case 112:{d=120;f=f>>>0>8?f:8;t=b|8;E=61;break}case 88:case 120:{t=b;E=61;break}case 111:{d=O;t=o[d>>2]|0;d=o[d+4>>2]|0;g=pT(t,d,S)|0;y=C-g|0;p=0;m=5642;f=(b&8|0)==0|(f|0)>(y|0)?f:y+1|0;y=b;E=67;break}case 105:case 100:{d=O;t=o[d>>2]|0;d=o[d+4>>2]|0;if((d|0)<0){t=ZT(0,0,t|0,d|0)|0;d=A;p=O;o[p>>2]=t;o[p+4>>2]=d;p=1;m=5642;E=66;break t}else{p=(b&2049|0)!=0&1;m=(b&2048|0)==0?(b&1|0)==0?5642:5644:5643;E=66;break t}}case 117:{d=O;p=0;m=5642;t=o[d>>2]|0;d=o[d+4>>2]|0;E=66;break}case 99:{r[k>>0]=o[O>>2];t=k;p=0;m=5642;g=S;d=1;f=y;break}case 109:{d=vT(o[(Jk()|0)>>2]|0)|0;E=71;break}case 115:{d=o[O>>2]|0;d=d|0?d:5652;E=71;break}case 67:{o[P>>2]=o[O>>2];o[T>>2]=0;o[O>>2]=P;g=-1;d=P;E=75;break}case 83:{t=o[O>>2]|0;if(!f){gT(e,32,s,0,b);t=0;E=84}else{g=f;d=t;E=75}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{s=_T(e,+c[O>>3],s,f,b,d)|0;t=w;continue e}default:{p=0;m=5642;g=S;d=f;f=b}}}while(0);t:do{if((E|0)==61){b=O;_=o[b>>2]|0;b=o[b+4>>2]|0;g=dT(_,b,S,d&32)|0;m=(t&8|0)==0|(_|0)==0&(b|0)==0;p=m?0:2;m=m?5642:5642+(d>>4)|0;y=t;t=_;d=b;E=67}else if((E|0)==66){g=hT(t,d,S)|0;y=b;E=67}else if((E|0)==71){E=0;b=mT(d,0,f)|0;_=(b|0)==0;t=d;p=0;m=5642;g=_?d+f|0:b;d=_?f:b-d|0;f=y}else if((E|0)==75){E=0;m=d;t=0;f=0;while(1){p=o[m>>2]|0;if(!p)break;f=yT(I,p)|0;if((f|0)<0|f>>>0>(g-t|0)>>>0)break;t=f+t|0;if(g>>>0>t>>>0)m=m+4|0;else break}if((f|0)<0){l=-1;break e}gT(e,32,s,t,b);if(!t){t=0;E=84}else{p=0;while(1){f=o[d>>2]|0;if(!f){E=84;break t}f=yT(I,f)|0;p=f+p|0;if((p|0)>(t|0)){E=84;break t}sT(e,I,f);if(p>>>0>=t>>>0){E=84;break}else d=d+4|0}}}}while(0);if((E|0)==67){E=0;d=(t|0)!=0|(d|0)!=0;b=(f|0)!=0|d;d=((d^1)&1)+(C-g)|0;t=b?g:S;g=S;d=b?(f|0)>(d|0)?f:d:f;f=(f|0)>-1?y&-65537:y}else if((E|0)==84){E=0;gT(e,32,s,t,b^8192);s=(s|0)>(t|0)?s:t;t=w;continue}_=g-t|0;y=(d|0)<(_|0)?_:d;b=y+p|0;s=(s|0)<(b|0)?b:s;gT(e,32,s,b,f);sT(e,m,p);gT(e,48,s,b,f^65536);gT(e,48,y,_,0);sT(e,t,_);gT(e,32,s,b,f^8192);t=w}e:do{if((E|0)==87)if(!e)if(!v)l=0;else{l=1;while(1){t=o[a+(l<<2)>>2]|0;if(!t)break;fT(u+(l<<3)|0,t,n);l=l+1|0;if((l|0)>=10){l=1;break e}}while(1){if(o[a+(l<<2)>>2]|0){l=-1;break e}l=l+1|0;if((l|0)>=10){l=1;break}}}}while(0);h=N;return l|0}function aT(e){e=e|0;return 0}function lT(e){e=e|0;return}function sT(e,t,n){e=e|0;t=t|0;n=n|0;if(!(o[e>>2]&32))PT(t,n,e)|0;return}function cT(e){e=e|0;var t=0,n=0,i=0;n=o[e>>2]|0;i=(r[n>>0]|0)+-48|0;if(i>>>0<10){t=0;do{t=i+(t*10|0)|0;n=n+1|0;o[e>>2]=n;i=(r[n>>0]|0)+-48|0}while(i>>>0<10)}else t=0;return t|0}function fT(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0.0;e:do{if(t>>>0<=20)do{switch(t|0){case 9:{r=(o[n>>2]|0)+(4-1)&~(4-1);t=o[r>>2]|0;o[n>>2]=r+4;o[e>>2]=t;break e}case 10:{r=(o[n>>2]|0)+(4-1)&~(4-1);t=o[r>>2]|0;o[n>>2]=r+4;r=e;o[r>>2]=t;o[r+4>>2]=((t|0)<0)<<31>>31;break e}case 11:{r=(o[n>>2]|0)+(4-1)&~(4-1);t=o[r>>2]|0;o[n>>2]=r+4;r=e;o[r>>2]=t;o[r+4>>2]=0;break e}case 12:{r=(o[n>>2]|0)+(8-1)&~(8-1);t=r;i=o[t>>2]|0;t=o[t+4>>2]|0;o[n>>2]=r+8;r=e;o[r>>2]=i;o[r+4>>2]=t;break e}case 13:{i=(o[n>>2]|0)+(4-1)&~(4-1);r=o[i>>2]|0;o[n>>2]=i+4;r=(r&65535)<<16>>16;i=e;o[i>>2]=r;o[i+4>>2]=((r|0)<0)<<31>>31;break e}case 14:{i=(o[n>>2]|0)+(4-1)&~(4-1);r=o[i>>2]|0;o[n>>2]=i+4;i=e;o[i>>2]=r&65535;o[i+4>>2]=0;break e}case 15:{i=(o[n>>2]|0)+(4-1)&~(4-1);r=o[i>>2]|0;o[n>>2]=i+4;r=(r&255)<<24>>24;i=e;o[i>>2]=r;o[i+4>>2]=((r|0)<0)<<31>>31;break e}case 16:{i=(o[n>>2]|0)+(4-1)&~(4-1);r=o[i>>2]|0;o[n>>2]=i+4;i=e;o[i>>2]=r&255;o[i+4>>2]=0;break e}case 17:{i=(o[n>>2]|0)+(8-1)&~(8-1);u=+c[i>>3];o[n>>2]=i+8;c[e>>3]=u;break e}case 18:{i=(o[n>>2]|0)+(8-1)&~(8-1);u=+c[i>>3];o[n>>2]=i+8;c[e>>3]=u;break e}default:break e}}while(0)}while(0);return}function dT(e,t,n,i){e=e|0;t=t|0;n=n|0;i=i|0;if(!((e|0)==0&(t|0)==0))do{n=n+-1|0;r[n>>0]=u[5694+(e&15)>>0]|0|i;e=rx(e|0,t|0,4)|0;t=A}while(!((e|0)==0&(t|0)==0));return n|0}function pT(e,t,n){e=e|0;t=t|0;n=n|0;if(!((e|0)==0&(t|0)==0))do{n=n+-1|0;r[n>>0]=e&7|48;e=rx(e|0,t|0,3)|0;t=A}while(!((e|0)==0&(t|0)==0));return n|0}function hT(e,t,n){e=e|0;t=t|0;n=n|0;var i=0;if(t>>>0>0|(t|0)==0&e>>>0>4294967295){while(1){i=cx(e|0,t|0,10,0)|0;n=n+-1|0;r[n>>0]=i&255|48;i=e;e=ax(e|0,t|0,10,0)|0;if(!(t>>>0>9|(t|0)==9&i>>>0>4294967295))break;else t=A}t=e}else t=e;if(t)while(1){n=n+-1|0;r[n>>0]=(t>>>0)%10|0|48;if(t>>>0<10)break;else t=(t>>>0)/10|0}return n|0}function vT(e){e=e|0;return kT(e,o[(CT()|0)+188>>2]|0)|0}function mT(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0,a=0,l=0;a=t&255;i=(n|0)!=0;e:do{if(i&(e&3|0)!=0){u=t&255;while(1){if((r[e>>0]|0)==u<<24>>24){l=6;break e}e=e+1|0;n=n+-1|0;i=(n|0)!=0;if(!(i&(e&3|0)!=0)){l=5;break}}}else l=5}while(0);if((l|0)==5)if(i)l=6;else n=0;e:do{if((l|0)==6){u=t&255;if((r[e>>0]|0)!=u<<24>>24){i=V(a,16843009)|0;t:do{if(n>>>0>3)while(1){a=o[e>>2]^i;if((a&-2139062144^-2139062144)&a+-16843009|0)break;e=e+4|0;n=n+-4|0;if(n>>>0<=3){l=11;break t}}else l=11}while(0);if((l|0)==11)if(!n){n=0;break}while(1){if((r[e>>0]|0)==u<<24>>24)break e;e=e+1|0;n=n+-1|0;if(!n){n=0;break}}}}}while(0);return(n|0?e:0)|0}function gT(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;var o=0,u=0;u=h;h=h+256|0;o=u;if((n|0)>(r|0)&(i&73728|0)==0){i=n-r|0;tx(o|0,t|0,(i>>>0<256?i:256)|0)|0;if(i>>>0>255){t=n-r|0;do{sT(e,o,256);i=i+-256|0}while(i>>>0>255);i=t&255}sT(e,o,i)}h=u;return}function yT(e,t){e=e|0;t=t|0;if(!e)e=0;else e=DT(e,t,0)|0;return e|0}function _T(e,t,n,i,a,l){e=e|0;t=+t;n=n|0;i=i|0;a=a|0;l=l|0;var s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0.0,y=0,_=0,b=0,w=0,E=0,D=0,S=0,C=0,k=0,T=0,x=0,O=0,P=0,I=0,N=0;N=h;h=h+560|0;f=N+8|0;b=N;I=N+524|0;P=I;d=N+512|0;o[b>>2]=0;O=d+12|0;bT(t)|0;if((A|0)<0){t=-t;T=1;k=5659}else{T=(a&2049|0)!=0&1;k=(a&2048|0)==0?(a&1|0)==0?5660:5665:5662}bT(t)|0;x=A&2146435072;do{if(x>>>0<2146435072|(x|0)==2146435072&0<0){g=+wT(t,b)*2.0;s=g!=0.0;if(s)o[b>>2]=(o[b>>2]|0)+-1;E=l|32;if((E|0)==97){y=l&32;m=(y|0)==0?k:k+9|0;v=T|2;s=12-i|0;do{if(!(i>>>0>11|(s|0)==0)){t=8.0;do{s=s+-1|0;t=t*16.0}while((s|0)!=0);if((r[m>>0]|0)==45){t=-(t+(-g-t));break}else{t=g+t-t;break}}else t=g}while(0);c=o[b>>2]|0;s=(c|0)<0?0-c|0:c;s=hT(s,((s|0)<0)<<31>>31,O)|0;if((s|0)==(O|0)){s=d+11|0;r[s>>0]=48}r[s+-1>>0]=(c>>31&2)+43;p=s+-2|0;r[p>>0]=l+15;d=(i|0)<1;f=(a&8|0)==0;s=I;do{x=~~t;c=s+1|0;r[s>>0]=u[5694+x>>0]|y;t=(t-+(x|0))*16.0;if((c-P|0)==1?!(f&(d&t==0.0)):0){r[c>>0]=46;s=s+2|0}else s=c}while(t!=0.0);x=s-P|0;P=O-p|0;O=(i|0)!=0&(x+-2|0)<(i|0)?i+2|0:x;s=P+v+O|0;gT(e,32,n,s,a);sT(e,m,v);gT(e,48,n,s,a^65536);sT(e,I,x);gT(e,48,O-x|0,0,0);sT(e,p,P);gT(e,32,n,s,a^8192);break}c=(i|0)<0?6:i;if(s){s=(o[b>>2]|0)+-28|0;o[b>>2]=s;t=g*268435456.0}else{t=g;s=o[b>>2]|0}x=(s|0)<0?f:f+288|0;f=x;do{S=~~t>>>0;o[f>>2]=S;f=f+4|0;t=(t-+(S>>>0))*1.0e9}while(t!=0.0);if((s|0)>0){d=x;v=f;while(1){p=(s|0)<29?s:29;s=v+-4|0;if(s>>>0>=d>>>0){f=0;do{D=nx(o[s>>2]|0,0,p|0)|0;D=ex(D|0,A|0,f|0,0)|0;S=A;w=cx(D|0,S|0,1e9,0)|0;o[s>>2]=w;f=ax(D|0,S|0,1e9,0)|0;s=s+-4|0}while(s>>>0>=d>>>0);if(f){d=d+-4|0;o[d>>2]=f}}f=v;while(1){if(f>>>0<=d>>>0)break;s=f+-4|0;if(!(o[s>>2]|0))f=s;else break}s=(o[b>>2]|0)-p|0;o[b>>2]=s;if((s|0)>0)v=f;else break}}else d=x;if((s|0)<0){i=((c+25|0)/9|0)+1|0;_=(E|0)==102;do{y=0-s|0;y=(y|0)<9?y:9;if(d>>>0>>0){p=(1<>>y;m=0;s=d;do{S=o[s>>2]|0;o[s>>2]=(S>>>y)+m;m=V(S&p,v)|0;s=s+4|0}while(s>>>0>>0);s=(o[d>>2]|0)==0?d+4|0:d;if(!m){d=s;s=f}else{o[f>>2]=m;d=s;s=f+4|0}}else{d=(o[d>>2]|0)==0?d+4|0:d;s=f}f=_?x:d;f=(s-f>>2|0)>(i|0)?f+(i<<2)|0:s;s=(o[b>>2]|0)+y|0;o[b>>2]=s}while((s|0)<0);s=d;i=f}else{s=d;i=f}S=x;if(s>>>0>>0){f=(S-s>>2)*9|0;p=o[s>>2]|0;if(p>>>0>=10){d=10;do{d=d*10|0;f=f+1|0}while(p>>>0>=d>>>0)}}else f=0;_=(E|0)==103;w=(c|0)!=0;d=c-((E|0)!=102?f:0)+((w&_)<<31>>31)|0;if((d|0)<(((i-S>>2)*9|0)+-9|0)){d=d+9216|0;y=x+4+(((d|0)/9|0)+-1024<<2)|0;d=((d|0)%9|0)+1|0;if((d|0)<9){p=10;do{p=p*10|0;d=d+1|0}while((d|0)!=9)}else p=10;v=o[y>>2]|0;m=(v>>>0)%(p>>>0)|0;d=(y+4|0)==(i|0);if(!(d&(m|0)==0)){g=(((v>>>0)/(p>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;D=(p|0)/2|0;t=m>>>0>>0?.5:d&(m|0)==(D|0)?1.0:1.5;if(T){D=(r[k>>0]|0)==45;t=D?-t:t;g=D?-g:g}d=v-m|0;o[y>>2]=d;if(g+t!=g){D=d+p|0;o[y>>2]=D;if(D>>>0>999999999){f=y;while(1){d=f+-4|0;o[f>>2]=0;if(d>>>0>>0){s=s+-4|0;o[s>>2]=0}D=(o[d>>2]|0)+1|0;o[d>>2]=D;if(D>>>0>999999999)f=d;else break}}else d=y;f=(S-s>>2)*9|0;v=o[s>>2]|0;if(v>>>0>=10){p=10;do{p=p*10|0;f=f+1|0}while(v>>>0>=p>>>0)}}else d=y}else d=y;d=d+4|0;d=i>>>0>d>>>0?d:i;D=s}else{d=i;D=s}E=d;while(1){if(E>>>0<=D>>>0){b=0;break}s=E+-4|0;if(!(o[s>>2]|0))E=s;else{b=1;break}}i=0-f|0;do{if(_){s=((w^1)&1)+c|0;if((s|0)>(f|0)&(f|0)>-5){p=l+-1|0;c=s+-1-f|0}else{p=l+-2|0;c=s+-1|0}s=a&8;if(!s){if(b?(C=o[E+-4>>2]|0,(C|0)!=0):0){if(!((C>>>0)%10|0)){d=0;s=10;do{s=s*10|0;d=d+1|0}while(!((C>>>0)%(s>>>0)|0|0))}else d=0}else d=9;s=((E-S>>2)*9|0)+-9|0;if((p|32|0)==102){y=s-d|0;y=(y|0)>0?y:0;c=(c|0)<(y|0)?c:y;y=0;break}else{y=s+f-d|0;y=(y|0)>0?y:0;c=(c|0)<(y|0)?c:y;y=0;break}}else y=s}else{p=l;y=a&8}}while(0);_=c|y;v=(_|0)!=0&1;m=(p|32|0)==102;if(m){w=0;s=(f|0)>0?f:0}else{s=(f|0)<0?i:f;s=hT(s,((s|0)<0)<<31>>31,O)|0;d=O;if((d-s|0)<2)do{s=s+-1|0;r[s>>0]=48}while((d-s|0)<2);r[s+-1>>0]=(f>>31&2)+43;s=s+-2|0;r[s>>0]=p;w=s;s=d-s|0}s=T+1+c+v+s|0;gT(e,32,n,s,a);sT(e,k,T);gT(e,48,n,s,a^65536);if(m){p=D>>>0>x>>>0?x:D;y=I+9|0;v=y;m=I+8|0;d=p;do{f=hT(o[d>>2]|0,0,y)|0;if((d|0)==(p|0)){if((f|0)==(y|0)){r[m>>0]=48;f=m}}else if(f>>>0>I>>>0){tx(I|0,48,f-P|0)|0;do{f=f+-1|0}while(f>>>0>I>>>0)}sT(e,f,v-f|0);d=d+4|0}while(d>>>0<=x>>>0);if(_|0)sT(e,5710,1);if(d>>>0>>0&(c|0)>0)while(1){f=hT(o[d>>2]|0,0,y)|0;if(f>>>0>I>>>0){tx(I|0,48,f-P|0)|0;do{f=f+-1|0}while(f>>>0>I>>>0)}sT(e,f,(c|0)<9?c:9);d=d+4|0;f=c+-9|0;if(!(d>>>0>>0&(c|0)>9)){c=f;break}else c=f}gT(e,48,c+9|0,9,0)}else{_=b?E:D+4|0;if((c|0)>-1){b=I+9|0;y=(y|0)==0;i=b;v=0-P|0;m=I+8|0;p=D;do{f=hT(o[p>>2]|0,0,b)|0;if((f|0)==(b|0)){r[m>>0]=48;f=m}do{if((p|0)==(D|0)){d=f+1|0;sT(e,f,1);if(y&(c|0)<1){f=d;break}sT(e,5710,1);f=d}else{if(f>>>0<=I>>>0)break;tx(I|0,48,f+v|0)|0;do{f=f+-1|0}while(f>>>0>I>>>0)}}while(0);P=i-f|0;sT(e,f,(c|0)>(P|0)?P:c);c=c-P|0;p=p+4|0}while(p>>>0<_>>>0&(c|0)>-1)}gT(e,48,c+18|0,18,0);sT(e,w,O-w|0)}gT(e,32,n,s,a^8192)}else{I=(l&32|0)!=0;s=T+3|0;gT(e,32,n,s,a&-65537);sT(e,k,T);sT(e,t!=t|0.0!=0.0?I?5686:5690:I?5678:5682,3);gT(e,32,n,s,a^8192)}}while(0);h=N;return((s|0)<(n|0)?n:s)|0}function bT(e){e=+e;var t=0;c[d>>3]=e;t=o[d>>2]|0;A=o[d+4>>2]|0;return t|0}function wT(e,t){e=+e;t=t|0;return+ +ET(e,t)}function ET(e,t){e=+e;t=t|0;var n=0,r=0,i=0;c[d>>3]=e;n=o[d>>2]|0;r=o[d+4>>2]|0;i=rx(n|0,r|0,52)|0;switch(i&2047){case 0:{if(e!=0.0){e=+ET(e*18446744073709551616.0,t);n=(o[t>>2]|0)+-64|0}else n=0;o[t>>2]=n;break}case 2047:break;default:{o[t>>2]=(i&2047)+-1022;o[d>>2]=n;o[d+4>>2]=r&-2146435073|1071644672;e=+c[d>>3]}}return+e}function DT(e,t,n){e=e|0;t=t|0;n=n|0;do{if(e){if(t>>>0<128){r[e>>0]=t;e=1;break}if(!(o[o[(ST()|0)+188>>2]>>2]|0))if((t&-128|0)==57216){r[e>>0]=t;e=1;break}else{o[(Jk()|0)>>2]=84;e=-1;break}if(t>>>0<2048){r[e>>0]=t>>>6|192;r[e+1>>0]=t&63|128;e=2;break}if(t>>>0<55296|(t&-8192|0)==57344){r[e>>0]=t>>>12|224;r[e+1>>0]=t>>>6&63|128;r[e+2>>0]=t&63|128;e=3;break}if((t+-65536|0)>>>0<1048576){r[e>>0]=t>>>18|240;r[e+1>>0]=t>>>12&63|128;r[e+2>>0]=t>>>6&63|128;r[e+3>>0]=t&63|128;e=4;break}else{o[(Jk()|0)>>2]=84;e=-1;break}}else e=1}while(0);return e|0}function ST(){return eT()|0}function CT(){return eT()|0}function kT(e,t){e=e|0;t=t|0;var n=0,i=0;i=0;while(1){if((u[5712+i>>0]|0)==(e|0)){e=2;break}n=i+1|0;if((n|0)==87){n=5800;i=87;e=5;break}else i=n}if((e|0)==2)if(!i)n=5800;else{n=5800;e=5}if((e|0)==5)while(1){do{e=n;n=n+1|0}while((r[e>>0]|0)!=0);i=i+-1|0;if(!i)break;else e=5}return TT(n,o[t+20>>2]|0)|0}function TT(e,t){e=e|0;t=t|0;return xT(e,t)|0}function xT(e,t){e=e|0;t=t|0;if(!t)t=0;else t=AT(o[t>>2]|0,o[t+4>>2]|0,e)|0;return(t|0?t:e)|0}function AT(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,h=0;h=(o[e>>2]|0)+1794895138|0;a=OT(o[e+8>>2]|0,h)|0;i=OT(o[e+12>>2]|0,h)|0;u=OT(o[e+16>>2]|0,h)|0;e:do{if((a>>>0>>2>>>0?(p=t-(a<<2)|0,i>>>0

    >>0&u>>>0

    >>0|(d|0)==(p|0)&f>>>0>>0)){e=14;break}o[t+(h<<2)>>2]=c;o[n+(o[u>>2]<<2)>>2]=h;if(!a){h=0;e=14;break}}if((e|0)==14){C=t+(h<<2)|0;o[C>>2]=i;C=n+(i<<2)|0;o[C>>2]=h;l=r;return}}function Or(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0;r=l;A=e+824|0;u=(o[e+840>>2]|0)>(t|0);if(u?(o[(o[e+836>>2]|0)+(t<<2)>>2]|0)>-1:0)a=7;else a=3;do{if((a|0)==3){if(n[(o[e+876>>2]|0)+t>>0]|0){l=r;return}if(n[(o[e+904>>2]|0)+t>>0]|0){l=r;return}f=n[(o[e+332>>2]|0)+t>>0]|0;g=n[2624]|0;p=g&255;if((p>>>1^1)&f<<24>>24==g<<24>>24|f&2&p)if(u){a=7;break}else break;else{l=r;return}}}while(0);if((a|0)==7?(i=o[e+836>>2]|0,s=i+(t<<2)|0,c=o[s>>2]|0,(c|0)>-1):0){t=o[A>>2]|0;a=o[t+(c<<2)>>2]|0;e:do{if(!c)f=0;else{u=e+852|0;h=a<<1;e=h|1;while(1){f=c;c=c+-1>>1;p=t+(c<<2)|0;g=o[p>>2]|0;m=o[o[u>>2]>>2]|0;C=o[m+(h<<2)>>2]|0;I=o[m+(e<<2)>>2]|0;C=Ci(I|0,((I|0)<0)<<31>>31|0,C|0,((C|0)<0)<<31>>31|0)|0;I=R;E=g<<1;d=o[m+(E<<2)>>2]|0;E=o[m+((E|1)<<2)>>2]|0;d=Ci(E|0,((E|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;E=R;if(!(I>>>0>>0|(I|0)==(E|0)&C>>>0>>0))break e;o[t+(f<<2)>>2]=g;o[i+(o[p>>2]<<2)>>2]=f;if(!c){f=0;break}}}}while(0);o[t+(f<<2)>>2]=a;o[i+(a<<2)>>2]=f;jr(A,o[s>>2]|0);l=r;return}_r(A,t);l=r;return}function jr(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0;r=l;n=o[e>>2]|0;i=o[n+(t<<2)>>2]|0;h=t<<1|1;u=e+4|0;f=o[u>>2]|0;if((h|0)>=(f|0)){p=t;d=e+12|0;f=n+(p<<2)|0;o[f>>2]=i;d=o[d>>2]|0;d=d+(i<<2)|0;o[d>>2]=p;l=r;return}A=e+28|0;c=i<<1;a=c|1;e=e+12|0;while(1){g=(t<<1)+2|0;if((g|0)<(f|0)){p=o[n+(g<<2)>>2]|0;d=o[n+(h<<2)>>2]|0;m=p<<1;f=o[o[A>>2]>>2]|0;E=o[f+(m<<2)>>2]|0;m=o[f+((m|1)<<2)>>2]|0;E=Ci(m|0,((m|0)<0)<<31>>31|0,E|0,((E|0)<0)<<31>>31|0)|0;m=R;I=d<<1;C=o[f+(I<<2)>>2]|0;I=o[f+((I|1)<<2)>>2]|0;C=Ci(I|0,((I|0)<0)<<31>>31|0,C|0,((C|0)<0)<<31>>31|0)|0;I=R;if(!(m>>>0>>0|(m|0)==(I|0)&E>>>0>>0)){p=d;s=7}}else{p=o[n+(h<<2)>>2]|0;f=o[o[A>>2]>>2]|0;s=7}if((s|0)==7){s=0;g=h}C=p<<1;I=o[f+(C<<2)>>2]|0;C=o[f+((C|1)<<2)>>2]|0;I=Ci(C|0,((C|0)<0)<<31>>31|0,I|0,((I|0)<0)<<31>>31|0)|0;C=R;m=o[f+(c<<2)>>2]|0;E=o[f+(a<<2)>>2]|0;m=Ci(E|0,((E|0)<0)<<31>>31|0,m|0,((m|0)<0)<<31>>31|0)|0;E=R;if(!(C>>>0>>0|(C|0)==(E|0)&I>>>0>>0)){s=10;break}o[n+(t<<2)>>2]=p;o[(o[e>>2]|0)+(p<<2)>>2]=t;h=g<<1|1;f=o[u>>2]|0;if((h|0)>=(f|0)){t=g;s=10;break}else t=g}if((s|0)==10){m=n+(t<<2)|0;o[m>>2]=i;m=o[e>>2]|0;m=m+(i<<2)|0;o[m>>2]=t;l=r;return}}function Yr(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0,c=0;r=l;A=o[e>>2]|0;if(A){n=e+4|0;i=o[n>>2]|0;e:do{if((i|0)>0){s=0;while(1){a=A+(s*12|0)|0;c=o[a>>2]|0;if(c){o[A+(s*12|0)+4>>2]=0;_n(c);o[a>>2]=0;o[A+(s*12|0)+8>>2]=0;i=o[n>>2]|0}s=s+1|0;if((s|0)>=(i|0))break e;A=o[e>>2]|0}}}while(0);o[n>>2]=0;if(t){_n(o[e>>2]|0);o[e>>2]=0;o[e+8>>2]=0}}n=e+16|0;i=o[n>>2]|0;if((i|0)!=0?(o[e+20>>2]=0,t):0){_n(i);o[n>>2]=0;o[e+24>>2]=0}i=e+32|0;n=o[i>>2]|0;if(!n){l=r;return}o[e+36>>2]=0;if(!t){l=r;return}_n(n);o[i>>2]=0;o[e+40>>2]=0;l=r;return}function Gr(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0;n=l;i=o[e>>2]|0;r=e+4|0;if(i){o[r>>2]=0;if(t){_n(i);o[e>>2]=0;o[e+8>>2]=0;i=0}}else i=0;if((o[r>>2]|0)>=1){A=e+16|0;o[A>>2]=0;A=e+12|0;o[A>>2]=0;l=n;return}A=e+8|0;s=o[A>>2]|0;if((s|0)<1){a=2-s&-2;t=(s>>1)+2&-2;t=(a|0)>(t|0)?a:t;if((t|0)>(2147483647-s|0)){a=Qe(1)|0;ze(a|0,48,0)}a=t+s|0;o[A>>2]=a;i=On(i,a<<2)|0;o[e>>2]=i;if((i|0)==0?(o[(Ye()|0)>>2]|0)==12:0){a=Qe(1)|0;ze(a|0,48,0)}}t=o[r>>2]|0;if((t|0)<1)while(1){s=i+(t<<2)|0;if(s)o[s>>2]=0;if(!t)break;else t=t+1|0}o[r>>2]=1;a=e+16|0;o[a>>2]=0;a=e+12|0;o[a>>2]=0;l=n;return}function Jr(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0;n=l;l=l+16|0;r=n;i=e+16|0;a=o[i>>2]|0;o[i>>2]=a+1;o[(o[e>>2]|0)+(a<<2)>>2]=t;a=o[i>>2]|0;t=e+4|0;A=o[t>>2]|0;if((a|0)==(A|0)){o[i>>2]=0;a=0}s=e+12|0;if((o[s>>2]|0)!=(a|0)){l=n;return}Lr(r,(A*3|0)+1>>1);u=o[s>>2]|0;h=o[t>>2]|0;if((u|0)<(h|0)){a=o[e>>2]|0;c=o[r>>2]|0;h=0;while(1){A=h+1|0;o[c+(h<<2)>>2]=o[a+(u<<2)>>2];u=u+1|0;h=o[t>>2]|0;if((u|0)>=(h|0)){c=A;break}else h=A}}else c=0;A=o[e>>2]|0;if((o[i>>2]|0)>0){a=o[r>>2]|0;u=0;while(1){o[a+(c<<2)>>2]=o[A+(u<<2)>>2];u=u+1|0;if((u|0)>=(o[i>>2]|0))break;else c=c+1|0}h=o[t>>2]|0}o[s>>2]=0;o[i>>2]=h;if(!A)i=e+8|0;else{o[t>>2]=0;_n(A);o[e>>2]=0;i=e+8|0;o[i>>2]=0}o[e>>2]=o[r>>2];u=r+4|0;o[t>>2]=o[u>>2];h=r+8|0;o[i>>2]=o[h>>2];o[r>>2]=0;o[u>>2]=0;o[h>>2]=0;l=n;return}function Hr(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0;r=l;n=e+4|0;i=o[n>>2]|0;s=e+8|0;A=o[s>>2]|0;if((i|0)==(A|0)&(A|0)<(i+1|0)){A=(i>>1)+2&-2;A=(A|0)<2?2:A;if((A|0)>(2147483647-i|0)){A=Qe(1)|0;ze(A|0,48,0)}a=o[e>>2]|0;i=A+i|0;o[s>>2]=i;i=On(a,i<<2)|0;o[e>>2]=i;if((i|0)==0?(o[(Ye()|0)>>2]|0)==12:0){a=Qe(1)|0;ze(a|0,48,0)}}else i=o[e>>2]|0;a=o[n>>2]|0;o[n>>2]=a+1;n=i+(a<<2)|0;if(!n){l=r;return}o[n>>2]=o[t>>2];l=r;return}function qr(){var e=0,t=0;t=l;Ue(3864)|0;e=cn(936)|0;Cr(e);l=t;return e|0}function zr(e){e=e|0;var t=0;t=l;if(!e){l=t;return}ji[o[(o[e>>2]|0)+4>>2]&31](e);l=t;return}function Wr(){var e=0,t=0,r=0;e=l;l=l+16|0;t=e;r=cn(936)|0;Cr(r);o[964]=r;wr(r,1)|0;r=o[964]|0;n[t+0>>0]=n[3840]|0;mr(r,t,1)|0;l=e;return}function Vr(e){e=e|0;var t=0,r=0,i=0;t=l;l=l+16|0;r=t;if((o[962]|0)>=(e|0)){l=t;return}do{i=o[964]|0;n[r+0>>0]=n[3840]|0;mr(i,r,1)|0;i=(o[962]|0)+1|0;o[962]=i}while((i|0)<(e|0));l=t;return}function Xr(e){e=e|0;var t=0,r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0;s=l;l=l+32|0;A=s+16|0;r=s+4|0;a=s;o[r>>2]=0;i=r+4|0;o[i>>2]=0;t=r+8|0;o[t>>2]=0;c=o[e>>2]|0;if(c)do{u=(c|0)<0?0-c|0:c;if((o[962]|0)<(u|0))do{h=o[964]|0;n[A+0>>0]=n[3840]|0;mr(h,A,1)|0;h=(o[962]|0)+1|0;o[962]=h}while((h|0)<(u|0));o[a>>2]=u<<1|c>>>31;sr(r,a);e=e+4|0;c=o[e>>2]|0}while((c|0)!=0);a=o[964]|0;A=a+628|0;sn(r,A);A=Br(a,A)|0;a=o[r>>2]|0;if(!a){l=s;return A|0}o[i>>2]=0;_n(a);o[r>>2]=0;o[t>>2]=0;l=s;return A|0}function Zr(){var e=0,t=0,r=0,i=0;t=l;l=l+16|0;e=t;r=o[964]|0;i=r+664|0;o[i+0>>2]=-1;o[i+4>>2]=-1;o[i+8>>2]=-1;o[i+12>>2]=-1;if(o[r+304>>2]|0)o[r+308>>2]=0;yr(e,r,1,0);l=t;return(n[e>>0]|0)==0|0}function $r(){return(o[(o[964]|0)+4>>2]|0)+1|0}function en(){return o[962]|0}function tn(e){e=e|0;var t=0,r=0,i=0,s=0,A=0,a=0;t=l;l=l+32|0;A=t+16|0;i=t+4|0;a=t;o[i>>2]=0;r=i+4|0;o[r>>2]=0;s=i+8|0;o[s>>2]=0;o[a>>2]=e<<1;sr(i,a);e=o[964]|0;a=e+664|0;o[a+0>>2]=-1;o[a+4>>2]=-1;o[a+8>>2]=-1;o[a+12>>2]=-1;sn(i,e+304|0);yr(A,e,1,0);e=(n[A>>0]|0)==0;A=o[i>>2]|0;if(!A){l=t;return e|0}o[r>>2]=0;_n(A);o[i>>2]=0;o[s>>2]=0;l=t;return e|0}function rn(e){e=e|0;var t=0,r=0,n=0;t=l;l=l+16|0;n=t;r=o[964]|0;o[n>>2]=e<<1|1;e=r+628|0;if(o[e>>2]|0)o[r+632>>2]=0;sr(e,n);Br(r,e)|0;l=t;return}function nn(){return o[(o[964]|0)+36>>2]|0}function on(){return o[(o[964]|0)+32>>2]|0}function sn(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0;r=l;A=o[t>>2]|0;n=t+4|0;if(!A)a=o[n>>2]|0;else{o[n>>2]=0;a=0}n=e+4|0;i=o[n>>2]|0;s=t+4|0;if((a|0)<(i|0)){c=t+8|0;a=o[c>>2]|0;if((a|0)<(i|0)){h=i+1-a&-2;u=(a>>1)+2&-2;u=(h|0)>(u|0)?h:u;if((u|0)>(2147483647-a|0)){h=Qe(1)|0;ze(h|0,48,0)}h=u+a|0;o[c>>2]=h;A=On(A,h<<2)|0;o[t>>2]=A;if((A|0)==0?(o[(Ye()|0)>>2]|0)==12:0){h=Qe(1)|0;ze(h|0,48,0)}}a=o[s>>2]|0;e:do{if((a|0)<(i|0))while(1){A=A+(a<<2)|0;if(A)o[A>>2]=0;a=a+1|0;if((a|0)==(i|0))break e;A=o[t>>2]|0}}while(0);o[s>>2]=i;i=o[n>>2]|0}if((i|0)<=0){l=r;return}t=o[t>>2]|0;e=o[e>>2]|0;i=0;do{o[t+(i<<2)>>2]=o[e+(i<<2)>>2];i=i+1|0}while((i|0)<(o[n>>2]|0));l=r;return}function An(e,t){e=e|0;t=t|0;var r=0;r=l;l=l+16|0;o[r>>2]=t;t=o[E>>2]|0;Be(t|0,e|0,r|0)|0;qe(10,t|0)|0;Xe()}function an(){var e=0,t=0;e=l;l=l+16|0;if(!(Pe(4064,3)|0)){t=Le(o[1014]|0)|0;l=e;return t|0}else An(4072,e);return 0}function cn(e){e=e|0;var t=0,r=0;t=l;e=(e|0)==0?1:e;r=Un(e)|0;if(r){l=t;return r|0}while(1){r=dn()|0;if(!r){e=4;break}Ji[r&3]();r=Un(e)|0;if(r){e=5;break}}if((e|0)==4){r=Qe(4)|0;o[r>>2]=4248;ze(r|0,4296,12)}else if((e|0)==5){l=t;return r|0}return 0}function un(e){e=e|0;var t=0;t=l;_n(e);l=t;return}function ln(e){e=e|0;var t=0;t=l;un(e);l=t;return}function hn(e){e=e|0;return}function gn(e){e=e|0;return 4264}function fn(e){e=e|0;var t=0;t=l;l=l+16|0;Ji[e&3]();An(4312,t)}function pn(){var e=0,t=0;t=an()|0;if(((t|0)!=0?(e=o[t>>2]|0,(e|0)!=0):0)?(t=e+48|0,(o[t>>2]&-256|0)==1126902528?(o[t+4>>2]|0)==1129074247:0):0)fn(o[e+12>>2]|0);t=o[968]|0;o[968]=t+0;fn(t)}function dn(){var e=0;e=o[1102]|0;o[1102]=e+0;return e|0}function Cn(e){e=e|0;return}function En(e){e=e|0;return}function In(e){e=e|0;return}function mn(e){e=e|0;return}function yn(e){e=e|0;return}function wn(e){e=e|0;var t=0;t=l;un(e);l=t;return}function Bn(e){e=e|0;var t=0;t=l;un(e);l=t;return}function Qn(e,t,r){e=e|0;t=t|0;r=r|0;var n=0,i=0,s=0,A=0;n=l;l=l+64|0;i=n;if((e|0)==(t|0)){A=1;l=n;return A|0}if(!t){A=0;l=n;return A|0}t=Sn(t,4504,4560,0)|0;if(!t){A=0;l=n;return A|0}A=i+0|0;s=A+56|0;do{o[A>>2]=0;A=A+4|0}while((A|0)<(s|0));o[i>>2]=t;o[i+8>>2]=e;o[i+12>>2]=-1;o[i+48>>2]=1;zi[o[(o[t>>2]|0)+28>>2]&3](t,i,o[r>>2]|0,1);if((o[i+24>>2]|0)!=1){A=0;l=n;return A|0}o[r>>2]=o[i+16>>2];A=1;l=n;return A|0}function vn(e,t,r,i){e=e|0;t=t|0;r=r|0;i=i|0;var s=0,A=0;e=l;s=t+16|0;A=o[s>>2]|0;if(!A){o[s>>2]=r;o[t+24>>2]=i;o[t+36>>2]=1;l=e;return}if((A|0)!=(r|0)){A=t+36|0;o[A>>2]=(o[A>>2]|0)+1;o[t+24>>2]=2;n[t+54>>0]=1;l=e;return}r=t+24|0;if((o[r>>2]|0)!=2){l=e;return}o[r>>2]=i;l=e;return}function Dn(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;var i=0;i=l;if((o[t+8>>2]|0)!=(e|0)){l=i;return}vn(0,t,r,n);l=i;return}function bn(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;var i=0;i=l;if((e|0)==(o[t+8>>2]|0)){vn(0,t,r,n);l=i;return}else{e=o[e+8>>2]|0;zi[o[(o[e>>2]|0)+28>>2]&3](e,t,r,n);l=i;return}}function Sn(e,t,r,s){e=e|0;t=t|0;r=r|0;s=s|0;var A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0;A=l;l=l+64|0;a=A;c=o[e>>2]|0;u=e+(o[c+-8>>2]|0)|0;c=o[c+-4>>2]|0;o[a>>2]=r;o[a+4>>2]=e;o[a+8>>2]=t;o[a+12>>2]=s;g=a+16|0;f=a+20|0;t=a+24|0;h=a+28|0;s=a+32|0;e=a+40|0;p=(c|0)==(r|0);d=g+0|0;r=d+36|0;do{o[d>>2]=0;d=d+4|0}while((d|0)<(r|0));i[g+36>>1]=0;n[g+38>>0]=0;if(p){o[a+48>>2]=1;Hi[o[(o[c>>2]|0)+20>>2]&3](c,a,u,u,1,0);d=(o[t>>2]|0)==1?u:0;l=A;return d|0}Oi[o[(o[c>>2]|0)+24>>2]&3](c,a,u,1,0);a=o[a+36>>2]|0;if(!a){d=(o[e>>2]|0)==1&(o[h>>2]|0)==1&(o[s>>2]|0)==1?o[f>>2]|0:0;l=A;return d|0}else if((a|0)==1){if((o[t>>2]|0)!=1?!((o[e>>2]|0)==0&(o[h>>2]|0)==1&(o[s>>2]|0)==1):0){d=0;l=A;return d|0}d=o[g>>2]|0;l=A;return d|0}else{d=0;l=A;return d|0}return 0}function kn(e,t,r,i,s){e=e|0;t=t|0;r=r|0;i=i|0;s=s|0;var A=0;e=l;n[t+53>>0]=1;if((o[t+4>>2]|0)!=(i|0)){l=e;return}n[t+52>>0]=1;i=t+16|0;A=o[i>>2]|0;if(!A){o[i>>2]=r;o[t+24>>2]=s;o[t+36>>2]=1;if(!((s|0)==1?(o[t+48>>2]|0)==1:0)){l=e;return}n[t+54>>0]=1;l=e;return}if((A|0)!=(r|0)){A=t+36|0;o[A>>2]=(o[A>>2]|0)+1;n[t+54>>0]=1;l=e;return}r=t+24|0;i=o[r>>2]|0;if((i|0)==2)o[r>>2]=s;else s=i;if(!((s|0)==1?(o[t+48>>2]|0)==1:0)){l=e;return}n[t+54>>0]=1;l=e;return}function xn(e,t,r,i,s){e=e|0;t=t|0;r=r|0;i=i|0;s=s|0;var A=0,a=0,c=0,u=0,h=0;A=l;if((e|0)==(o[t+8>>2]|0)){if((o[t+4>>2]|0)!=(r|0)){l=A;return}a=t+28|0;if((o[a>>2]|0)==1){l=A;return}o[a>>2]=i;l=A;return}if((e|0)!=(o[t>>2]|0)){u=o[e+8>>2]|0;Oi[o[(o[u>>2]|0)+24>>2]&3](u,t,r,i,s);l=A;return}if((o[t+16>>2]|0)!=(r|0)?(c=t+20|0,(o[c>>2]|0)!=(r|0)):0){o[t+32>>2]=i;i=t+44|0;if((o[i>>2]|0)==4){l=A;return}u=t+52|0;n[u>>0]=0;h=t+53|0;n[h>>0]=0;e=o[e+8>>2]|0;Hi[o[(o[e>>2]|0)+20>>2]&3](e,t,r,r,1,s);if(n[h>>0]|0){if(!(n[u>>0]|0)){e=1;a=13}}else{e=0;a=13}do{if((a|0)==13){o[c>>2]=r;h=t+40|0;o[h>>2]=(o[h>>2]|0)+1;if((o[t+36>>2]|0)==1?(o[t+24>>2]|0)==2:0){n[t+54>>0]=1;if(e)break}else a=16;if((a|0)==16?e:0)break;o[i>>2]=4;l=A;return}}while(0);o[i>>2]=3;l=A;return}if((i|0)!=1){l=A;return}o[t+32>>2]=1;l=A;return}function Fn(e,t,r,i,s){e=e|0;t=t|0;r=r|0;i=i|0;s=s|0;var A=0;s=l;if((o[t+8>>2]|0)==(e|0)){if((o[t+4>>2]|0)!=(r|0)){l=s;return}t=t+28|0;if((o[t>>2]|0)==1){l=s;return}o[t>>2]=i;l=s;return}if((o[t>>2]|0)!=(e|0)){l=s;return}if((o[t+16>>2]|0)!=(r|0)?(A=t+20|0,(o[A>>2]|0)!=(r|0)):0){o[t+32>>2]=i;o[A>>2]=r;e=t+40|0;o[e>>2]=(o[e>>2]|0)+1;if((o[t+36>>2]|0)==1?(o[t+24>>2]|0)==2:0)n[t+54>>0]=1;o[t+44>>2]=4;l=s;return}if((i|0)!=1){l=s;return}o[t+32>>2]=1;l=s;return}function Mn(e,t,r,n,i,s){e=e|0;t=t|0;r=r|0;n=n|0;i=i|0;s=s|0;var A=0;A=l;if((e|0)==(o[t+8>>2]|0)){kn(0,t,r,n,i);l=A;return}else{e=o[e+8>>2]|0;Hi[o[(o[e>>2]|0)+20>>2]&3](e,t,r,n,i,s);l=A;return}}function Nn(e,t,r,n,i,s){e=e|0;t=t|0;r=r|0;n=n|0;i=i|0;s=s|0;s=l;if((o[t+8>>2]|0)!=(e|0)){l=s;return}kn(0,t,r,n,i);l=s;return}function Rn(e,t,r){e=e|0;t=t|0;r=r|0;var n=0,i=0;n=l;l=l+16|0;i=n;o[i>>2]=o[r>>2];e=_i[o[(o[e>>2]|0)+16>>2]&1](e,t,i)|0;t=e&1;if(!e){l=n;return t|0}o[r>>2]=o[i>>2];l=n;return t|0}function Kn(e){e=e|0;var t=0;t=l;if(!e)e=0;else e=(Sn(e,4504,4672,0)|0)!=0;l=t;return e&1|0}function Ln(){var e=0,t=0,r=0,n=0,i=0;e=l;l=l+16|0;t=e;e=e+12|0;r=an()|0;if(!r)An(4040,t);r=o[r>>2]|0;if(!r)An(4040,t);i=r+48|0;n=o[i>>2]|0;i=o[i+4>>2]|0;if(!((n&-256|0)==1126902528&(i|0)==1129074247)){o[t>>2]=o[970];An(4e3,t)}if((n|0)==1126902529&(i|0)==1129074247)n=o[r+44>>2]|0;else n=r+80|0;o[e>>2]=n;i=o[r>>2]|0;r=o[i+4>>2]|0;if(_i[o[(o[4432>>2]|0)+16>>2]&1](4432,i,e)|0){i=o[e>>2]|0;n=o[970]|0;i=Gi[o[(o[i>>2]|0)+8>>2]&1](i)|0;o[t>>2]=n;o[t+4>>2]=r;o[t+8>>2]=i;An(3904,t)}else{o[t>>2]=o[970];o[t+4>>2]=r;An(3952,t)}}function Tn(){var e=0;e=l;l=l+16|0;if(!(Oe(4056,20)|0)){l=e;return}else An(4128,e)}function Pn(e){e=e|0;var t=0;t=l;l=l+16|0;_n(e);if(!(Ge(o[1014]|0,0)|0)){l=t;return}else An(4184,t)}function Un(e){e=e|0;var t=0,r=0,n=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0,w=0,B=0,Q=0,v=0,D=0,b=0,S=0,k=0,x=0,F=0,M=0,N=0;t=l;do{if(e>>>0<245){if(e>>>0<11)e=16;else e=e+11&-8;B=e>>>3;p=o[1206]|0;w=p>>>B;if(w&3){s=(w&1^1)+B|0;i=s<<1;r=4864+(i<<2)|0;i=4864+(i+2<<2)|0;A=o[i>>2]|0;a=A+8|0;n=o[a>>2]|0;do{if((r|0)!=(n|0)){if(n>>>0<(o[1210]|0)>>>0)Xe();c=n+12|0;if((o[c>>2]|0)==(A|0)){o[c>>2]=r;o[i>>2]=n;break}else Xe()}else o[1206]=p&~(1<>2]=N|3;N=A+(N|4)|0;o[N>>2]=o[N>>2]|1;N=a;l=t;return N|0}y=o[1208]|0;if(e>>>0>y>>>0){if(w){A=2<>>12&16;A=A>>>r;a=A>>>5&8;A=A>>>a;i=A>>>2&4;A=A>>>i;s=A>>>1&2;A=A>>>s;n=A>>>1&1;n=(a|r|i|s|n)+(A>>>n)|0;A=n<<1;s=4864+(A<<2)|0;A=4864+(A+2<<2)|0;i=o[A>>2]|0;r=i+8|0;a=o[r>>2]|0;do{if((s|0)!=(a|0)){if(a>>>0<(o[1210]|0)>>>0)Xe();c=a+12|0;if((o[c>>2]|0)==(i|0)){o[c>>2]=s;o[A>>2]=a;x=o[1208]|0;break}else Xe()}else{o[1206]=p&~(1<>2]=e|3;s=i+e|0;o[i+(e|4)>>2]=n|1;o[i+N>>2]=n;if(x){i=o[1211]|0;u=x>>>3;a=u<<1;A=4864+(a<<2)|0;c=o[1206]|0;u=1<>2]|0;if(c>>>0<(o[1210]|0)>>>0)Xe();else{k=a;S=c}}else{o[1206]=c|u;k=4864+(a+2<<2)|0;S=A}o[k>>2]=i;o[S+12>>2]=i;o[i+8>>2]=S;o[i+12>>2]=A}o[1208]=n;o[1211]=s;N=r;l=t;return N|0}p=o[1207]|0;if(p){r=(p&0-p)+-1|0;M=r>>>12&16;r=r>>>M;F=r>>>5&8;r=r>>>F;N=r>>>2&4;r=r>>>N;i=r>>>1&2;r=r>>>i;n=r>>>1&1;n=o[5128+((F|M|N|i|n)+(r>>>n)<<2)>>2]|0;r=(o[n+4>>2]&-8)-e|0;i=n;while(1){s=o[i+16>>2]|0;if(!s){s=o[i+20>>2]|0;if(!s)break}i=(o[s+4>>2]&-8)-e|0;N=i>>>0>>0;r=N?i:r;i=s;n=N?s:n}A=o[1210]|0;if(n>>>0>>0)Xe();i=n+e|0;if(n>>>0>=i>>>0)Xe();s=o[n+24>>2]|0;c=o[n+12>>2]|0;do{if((c|0)==(n|0)){c=n+20|0;a=o[c>>2]|0;if(!a){c=n+16|0;a=o[c>>2]|0;if(!a){b=0;break}}while(1){u=a+20|0;h=o[u>>2]|0;if(h){a=h;c=u;continue}u=a+16|0;h=o[u>>2]|0;if(!h)break;else{a=h;c=u}}if(c>>>0>>0)Xe();else{o[c>>2]=0;b=a;break}}else{a=o[n+8>>2]|0;if(a>>>0>>0)Xe();A=a+12|0;if((o[A>>2]|0)!=(n|0))Xe();u=c+8|0;if((o[u>>2]|0)==(n|0)){o[A>>2]=c;o[u>>2]=a;b=c;break}else Xe()}}while(0);do{if(s){a=o[n+28>>2]|0;A=5128+(a<<2)|0;if((n|0)==(o[A>>2]|0)){o[A>>2]=b;if(!b){o[1207]=o[1207]&~(1<>>0<(o[1210]|0)>>>0)Xe();A=s+16|0;if((o[A>>2]|0)==(n|0))o[A>>2]=b;else o[s+20>>2]=b;if(!b)break}A=o[1210]|0;if(b>>>0>>0)Xe();o[b+24>>2]=s;s=o[n+16>>2]|0;do{if(s)if(s>>>0>>0)Xe();else{o[b+16>>2]=s;o[s+24>>2]=b;break}}while(0);s=o[n+20>>2]|0;if(s)if(s>>>0<(o[1210]|0)>>>0)Xe();else{o[b+20>>2]=s;o[s+24>>2]=b;break}}}while(0);if(r>>>0<16){N=r+e|0;o[n+4>>2]=N|3;N=n+(N+4)|0;o[N>>2]=o[N>>2]|1}else{o[n+4>>2]=e|3;o[n+(e|4)>>2]=r|1;o[n+(r+e)>>2]=r;A=o[1208]|0;if(A){s=o[1211]|0;c=A>>>3;u=c<<1;A=4864+(u<<2)|0;a=o[1206]|0;c=1<>2]|0;if(c>>>0<(o[1210]|0)>>>0)Xe();else{D=a;v=c}}else{o[1206]=a|c;D=4864+(u+2<<2)|0;v=A}o[D>>2]=s;o[v+12>>2]=s;o[s+8>>2]=v;o[s+12>>2]=A}o[1208]=r;o[1211]=i}N=n+8|0;l=t;return N|0}}}else if(e>>>0<=4294967231){v=e+11|0;e=v&-8;b=o[1207]|0;if(b){D=0-e|0;v=v>>>8;if(v)if(e>>>0>16777215)S=31;else{M=(v+1048320|0)>>>16&8;N=v<>>16&4;N=N<>>16&2;S=14-(F|M|S)+(N<>>15)|0;S=e>>>(S+7|0)&1|S<<1}else S=0;k=o[5128+(S<<2)>>2]|0;e:do{if(!k){F=0;v=0}else{if((S|0)==31)v=0;else v=25-(S>>>1)|0;F=0;x=e<>2]&-8;N=M-e|0;if(N>>>0>>0)if((M|0)==(e|0)){D=N;F=k;v=k;break e}else{D=N;v=k}N=o[k+20>>2]|0;k=o[k+(x>>>31<<2)+16>>2]|0;F=(N|0)==0|(N|0)==(k|0)?F:N;if(!k)break;else x=x<<1}}}while(0);if((F|0)==0&(v|0)==0){N=2<>>12&16;N=N>>>k;S=N>>>5&8;N=N>>>S;x=N>>>2&4;N=N>>>x;M=N>>>1&2;N=N>>>M;F=N>>>1&1;F=o[5128+((S|k|x|M|F)+(N>>>F)<<2)>>2]|0}if(F)while(1){N=(o[F+4>>2]&-8)-e|0;b=N>>>0>>0;D=b?N:D;v=b?F:v;b=o[F+16>>2]|0;if(b){F=b;continue}F=o[F+20>>2]|0;if(!F)break}if((v|0)!=0?D>>>0<((o[1208]|0)-e|0)>>>0:0){i=o[1210]|0;if(v>>>0>>0)Xe();r=v+e|0;if(v>>>0>=r>>>0)Xe();n=o[v+24>>2]|0;s=o[v+12>>2]|0;do{if((s|0)==(v|0)){A=v+20|0;s=o[A>>2]|0;if(!s){A=v+16|0;s=o[A>>2]|0;if(!s){B=0;break}}while(1){a=s+20|0;c=o[a>>2]|0;if(c){s=c;A=a;continue}a=s+16|0;c=o[a>>2]|0;if(!c)break;else{s=c;A=a}}if(A>>>0>>0)Xe();else{o[A>>2]=0;B=s;break}}else{A=o[v+8>>2]|0;if(A>>>0>>0)Xe();a=A+12|0;if((o[a>>2]|0)!=(v|0))Xe();i=s+8|0;if((o[i>>2]|0)==(v|0)){o[a>>2]=s;o[i>>2]=A;B=s;break}else Xe()}}while(0);do{if(n){i=o[v+28>>2]|0;s=5128+(i<<2)|0;if((v|0)==(o[s>>2]|0)){o[s>>2]=B;if(!B){o[1207]=o[1207]&~(1<>>0<(o[1210]|0)>>>0)Xe();i=n+16|0;if((o[i>>2]|0)==(v|0))o[i>>2]=B;else o[n+20>>2]=B;if(!B)break}i=o[1210]|0;if(B>>>0>>0)Xe();o[B+24>>2]=n;n=o[v+16>>2]|0;do{if(n)if(n>>>0>>0)Xe();else{o[B+16>>2]=n;o[n+24>>2]=B;break}}while(0);n=o[v+20>>2]|0;if(n)if(n>>>0<(o[1210]|0)>>>0)Xe();else{o[B+20>>2]=n;o[n+24>>2]=B;break}}}while(0);e:do{if(D>>>0>=16){o[v+4>>2]=e|3;o[v+(e|4)>>2]=D|1;o[v+(D+e)>>2]=D;i=D>>>3;if(D>>>0<256){A=i<<1;n=4864+(A<<2)|0;s=o[1206]|0;i=1<>2]|0;if(s>>>0>=(o[1210]|0)>>>0){w=i;y=s;break}Xe()}}while(0);o[w>>2]=r;o[y+12>>2]=r;o[v+(e+8)>>2]=y;o[v+(e+12)>>2]=n;break}n=D>>>8;if(n)if(D>>>0>16777215)n=31;else{M=(n+1048320|0)>>>16&8;N=n<>>16&4;N=N<>>16&2;n=14-(F|M|n)+(N<>>15)|0;n=D>>>(n+7|0)&1|n<<1}else n=0;i=5128+(n<<2)|0;o[v+(e+28)>>2]=n;o[v+(e+20)>>2]=0;o[v+(e+16)>>2]=0;s=o[1207]|0;A=1<>2]=r;o[v+(e+24)>>2]=i;o[v+(e+12)>>2]=r;o[v+(e+8)>>2]=r;break}A=o[i>>2]|0;if((n|0)==31)n=0;else n=25-(n>>>1)|0;t:do{if((o[A+4>>2]&-8|0)!=(D|0)){n=D<>>31<<2)+16|0;i=o[s>>2]|0;if(!i)break;if((o[i+4>>2]&-8|0)==(D|0)){p=i;break t}else{n=n<<1;A=i}}if(s>>>0<(o[1210]|0)>>>0)Xe();else{o[s>>2]=r;o[v+(e+24)>>2]=A;o[v+(e+12)>>2]=r;o[v+(e+8)>>2]=r;break e}}else p=A}while(0);i=p+8|0;n=o[i>>2]|0;N=o[1210]|0;if(p>>>0>=N>>>0&n>>>0>=N>>>0){o[n+12>>2]=r;o[i>>2]=r;o[v+(e+8)>>2]=n;o[v+(e+12)>>2]=p;o[v+(e+24)>>2]=0;break}else Xe()}else{N=D+e|0;o[v+4>>2]=N|3;N=v+(N+4)|0;o[N>>2]=o[N>>2]|1}}while(0);N=v+8|0;l=t;return N|0}}}else e=-1}while(0);p=o[1208]|0;if(p>>>0>=e>>>0){n=p-e|0;r=o[1211]|0;if(n>>>0>15){o[1211]=r+e;o[1208]=n;o[r+(e+4)>>2]=n|1;o[r+p>>2]=n;o[r+4>>2]=e|3}else{o[1208]=0;o[1211]=0;o[r+4>>2]=p|3;N=r+(p+4)|0;o[N>>2]=o[N>>2]|1}N=r+8|0;l=t;return N|0}p=o[1209]|0;if(p>>>0>e>>>0){M=p-e|0;o[1209]=M;N=o[1212]|0;o[1212]=N+e;o[N+(e+4)>>2]=M|1;o[N+4>>2]=e|3;N=N+8|0;l=t;return N|0}do{if(!(o[1324]|0)){p=Ke(30)|0;if(!(p+-1&p)){o[1326]=p;o[1325]=p;o[1327]=-1;o[1328]=-1;o[1329]=0;o[1317]=0;o[1324]=($e(0)|0)&-16^1431655768;break}else Xe()}}while(0);B=e+48|0;p=o[1326]|0;w=e+47|0;D=p+w|0;p=0-p|0;y=D&p;if(y>>>0<=e>>>0){N=0;l=t;return N|0}v=o[1316]|0;if((v|0)!=0?(M=o[1314]|0,N=M+y|0,N>>>0<=M>>>0|N>>>0>v>>>0):0){N=0;l=t;return N|0}e:do{if(!(o[1317]&4)){b=o[1212]|0;t:do{if(b){v=5272|0;while(1){S=o[v>>2]|0;if(S>>>0<=b>>>0?(Q=v+4|0,(S+(o[Q>>2]|0)|0)>>>0>b>>>0):0)break;v=o[v+8>>2]|0;if(!v){f=181;break t}}if(v){D=D-(o[1209]|0)&p;if(D>>>0<2147483647){p=ke(D|0)|0;if((p|0)==((o[v>>2]|0)+(o[Q>>2]|0)|0)){v=D;f=190}else{v=D;f=191}}else v=0}else f=181}else f=181}while(0);do{if((f|0)==181){Q=ke(0)|0;if((Q|0)!=(-1|0)){D=Q;v=o[1325]|0;p=v+-1|0;if(!(p&D))v=y;else v=y-D+(p+D&0-v)|0;p=o[1314]|0;D=p+v|0;if(v>>>0>e>>>0&v>>>0<2147483647){N=o[1316]|0;if((N|0)!=0?D>>>0<=p>>>0|D>>>0>N>>>0:0){v=0;break}p=ke(v|0)|0;if((p|0)==(Q|0)){p=Q;f=190}else f=191}else v=0}else v=0}}while(0);t:do{if((f|0)==190){if((p|0)!=(-1|0)){d=v;f=201;break e}}else if((f|0)==191){f=0-v|0;do{if((p|0)!=(-1|0)&v>>>0<2147483647&B>>>0>v>>>0?(m=o[1326]|0,m=w-v+m&0-m,m>>>0<2147483647):0)if((ke(m|0)|0)==(-1|0)){ke(f|0)|0;v=0;break t}else{v=m+v|0;break}}while(0);if((p|0)==(-1|0))v=0;else{d=v;f=201;break e}}}while(0);o[1317]=o[1317]|4;f=198}else{v=0;f=198}}while(0);if((((f|0)==198?y>>>0<2147483647:0)?(I=ke(y|0)|0,E=ke(0)|0,(I|0)!=(-1|0)&(E|0)!=(-1|0)&I>>>0>>0):0)?(C=E-I|0,d=C>>>0>(e+40|0)>>>0,d):0){p=I;d=d?C:v;f=201}if((f|0)==201){C=(o[1314]|0)+d|0;o[1314]=C;if(C>>>0>(o[1315]|0)>>>0)o[1315]=C;C=o[1212]|0;e:do{if(C){I=5272|0;while(1){E=o[I>>2]|0;y=I+4|0;w=o[y>>2]|0;if((p|0)==(E+w|0)){f=213;break}m=o[I+8>>2]|0;if(!m)break;else I=m}if(((f|0)==213?(o[I+12>>2]&8|0)==0:0)?C>>>0>=E>>>0&C>>>0

    >>0:0){o[y>>2]=w+d;r=(o[1209]|0)+d|0;n=C+8|0;if(!(n&7))n=0;else n=0-n&7;N=r-n|0;o[1212]=C+n;o[1209]=N;o[C+(n+4)>>2]=N|1;o[C+(r+4)>>2]=40;o[1213]=o[1328];break}E=o[1210]|0;if(p>>>0>>0){o[1210]=p;E=p}y=p+d|0;I=5272|0;while(1){if((o[I>>2]|0)==(y|0)){f=223;break}m=o[I+8>>2]|0;if(!m)break;else I=m}if((f|0)==223?(o[I+12>>2]&8|0)==0:0){o[I>>2]=p;A=I+4|0;o[A>>2]=(o[A>>2]|0)+d;A=p+8|0;if(!(A&7))A=0;else A=0-A&7;a=p+(d+8)|0;if(!(a&7))g=0;else g=0-a&7;f=p+(g+d)|0;c=A+e|0;a=p+c|0;h=f-(p+A)-e|0;o[p+(A+4)>>2]=e|3;t:do{if((f|0)!=(C|0)){if((f|0)==(o[1211]|0)){N=(o[1208]|0)+h|0;o[1208]=N;o[1211]=a;o[p+(c+4)>>2]=N|1;o[p+(N+c)>>2]=N;break}C=d+4|0;m=o[p+(C+g)>>2]|0;if((m&3|0)==1){e=m&-8;I=m>>>3;r:do{if(m>>>0>=256){u=o[p+((g|24)+d)>>2]|0;I=o[p+(d+12+g)>>2]|0;do{if((I|0)==(f|0)){y=g|16;m=p+(C+y)|0;I=o[m>>2]|0;if(!I){m=p+(y+d)|0;I=o[m>>2]|0;if(!I){s=0;break}}while(1){w=I+20|0;y=o[w>>2]|0;if(y){I=y;m=w;continue}w=I+16|0;y=o[w>>2]|0;if(!y)break;else{I=y;m=w}}if(m>>>0>>0)Xe();else{o[m>>2]=0;s=I;break}}else{m=o[p+((g|8)+d)>>2]|0;if(m>>>0>>0)Xe();y=m+12|0;if((o[y>>2]|0)!=(f|0))Xe();E=I+8|0;if((o[E>>2]|0)==(f|0)){o[y>>2]=I;o[E>>2]=m;s=I;break}else Xe()}}while(0);if(!u)break;E=o[p+(d+28+g)>>2]|0;I=5128+(E<<2)|0;do{if((f|0)!=(o[I>>2]|0)){if(u>>>0<(o[1210]|0)>>>0)Xe();E=u+16|0;if((o[E>>2]|0)==(f|0))o[E>>2]=s;else o[u+20>>2]=s;if(!s)break r}else{o[I>>2]=s;if(s)break;o[1207]=o[1207]&~(1<>>0>>0)Xe();o[s+24>>2]=u;E=g|16;u=o[p+(E+d)>>2]|0;do{if(u)if(u>>>0>>0)Xe();else{o[s+16>>2]=u;o[u+24>>2]=s;break}}while(0);u=o[p+(C+E)>>2]|0;if(!u)break;if(u>>>0<(o[1210]|0)>>>0)Xe();else{o[s+20>>2]=u;o[u+24>>2]=s;break}}else{s=o[p+((g|8)+d)>>2]|0;C=o[p+(d+12+g)>>2]|0;m=4864+(I<<1<<2)|0;do{if((s|0)!=(m|0)){if(s>>>0>>0)Xe();if((o[s+12>>2]|0)==(f|0))break;Xe()}}while(0);if((C|0)==(s|0)){o[1206]=o[1206]&~(1<>>0>>0)Xe();E=C+8|0;if((o[E>>2]|0)==(f|0)){u=E;break}Xe()}}while(0);o[s+12>>2]=C;o[u>>2]=s}}while(0);f=p+((e|g)+d)|0;h=e+h|0}s=f+4|0;o[s>>2]=o[s>>2]&-2;o[p+(c+4)>>2]=h|1;o[p+(h+c)>>2]=h;s=h>>>3;if(h>>>0<256){u=s<<1;r=4864+(u<<2)|0;h=o[1206]|0;s=1<>2]|0;if(s>>>0>=(o[1210]|0)>>>0){i=u;n=s;break}Xe()}}while(0);o[i>>2]=a;o[n+12>>2]=a;o[p+(c+8)>>2]=n;o[p+(c+12)>>2]=r;break}n=h>>>8;do{if(!n)n=0;else{if(h>>>0>16777215){n=31;break}M=(n+1048320|0)>>>16&8;N=n<>>16&4;N=N<>>16&2;n=14-(F|M|n)+(N<>>15)|0;n=h>>>(n+7|0)&1|n<<1}}while(0);u=5128+(n<<2)|0;o[p+(c+28)>>2]=n;o[p+(c+20)>>2]=0;o[p+(c+16)>>2]=0;s=o[1207]|0;i=1<>2]=a;o[p+(c+24)>>2]=u;o[p+(c+12)>>2]=a;o[p+(c+8)>>2]=a;break}i=o[u>>2]|0;if((n|0)==31)n=0;else n=25-(n>>>1)|0;r:do{if((o[i+4>>2]&-8|0)!=(h|0)){n=h<>>31<<2)+16|0;u=o[s>>2]|0;if(!u)break;if((o[u+4>>2]&-8|0)==(h|0)){r=u;break r}else{n=n<<1;i=u}}if(s>>>0<(o[1210]|0)>>>0)Xe();else{o[s>>2]=a;o[p+(c+24)>>2]=i;o[p+(c+12)>>2]=a;o[p+(c+8)>>2]=a;break t}}else r=i}while(0);n=r+8|0;i=o[n>>2]|0;N=o[1210]|0;if(r>>>0>=N>>>0&i>>>0>=N>>>0){o[i+12>>2]=a;o[n>>2]=a;o[p+(c+8)>>2]=i;o[p+(c+12)>>2]=r;o[p+(c+24)>>2]=0;break}else Xe()}else{N=(o[1209]|0)+h|0;o[1209]=N;o[1212]=a;o[p+(c+4)>>2]=N|1}}while(0);N=p+(A|8)|0;l=t;return N|0}n=5272|0;while(1){r=o[n>>2]|0;if(r>>>0<=C>>>0?(g=o[n+4>>2]|0,h=r+g|0,h>>>0>C>>>0):0)break;n=o[n+8>>2]|0}n=r+(g+-39)|0;if(!(n&7))n=0;else n=0-n&7;r=r+(g+-47+n)|0;r=r>>>0<(C+16|0)>>>0?C:r;n=r+8|0;i=p+8|0;if(!(i&7))i=0;else i=0-i&7;N=d+-40-i|0;o[1212]=p+i;o[1209]=N;o[p+(i+4)>>2]=N|1;o[p+(d+-36)>>2]=40;o[1213]=o[1328];o[r+4>>2]=27;o[n+0>>2]=o[1318];o[n+4>>2]=o[1319];o[n+8>>2]=o[1320];o[n+12>>2]=o[1321];o[1318]=p;o[1319]=d;o[1321]=0;o[1320]=n;n=r+28|0;o[n>>2]=7;if((r+32|0)>>>0>>0)do{N=n;n=n+4|0;o[n>>2]=7}while((N+8|0)>>>0>>0);if((r|0)!=(C|0)){r=r-C|0;n=C+(r+4)|0;o[n>>2]=o[n>>2]&-2;o[C+4>>2]=r|1;o[C+r>>2]=r;n=r>>>3;if(r>>>0<256){i=n<<1;r=4864+(i<<2)|0;s=o[1206]|0;n=1<>2]|0;if(n>>>0>=(o[1210]|0)>>>0){c=i;a=n;break}Xe()}}while(0);o[c>>2]=C;o[a+12>>2]=C;o[C+8>>2]=a;o[C+12>>2]=r;break}n=r>>>8;if(n)if(r>>>0>16777215)n=31;else{M=(n+1048320|0)>>>16&8;N=n<>>16&4;N=N<>>16&2;n=14-(F|M|n)+(N<>>15)|0;n=r>>>(n+7|0)&1|n<<1}else n=0;a=5128+(n<<2)|0;o[C+28>>2]=n;o[C+20>>2]=0;o[C+16>>2]=0;i=o[1207]|0;s=1<>2]=C;o[C+24>>2]=a;o[C+12>>2]=C;o[C+8>>2]=C;break}i=o[a>>2]|0;if((n|0)==31)n=0;else n=25-(n>>>1)|0;t:do{if((o[i+4>>2]&-8|0)!=(r|0)){n=r<>>31<<2)+16|0;s=o[i>>2]|0;if(!s)break;if((o[s+4>>2]&-8|0)==(r|0)){A=s;break t}else{n=n<<1;a=s}}if(i>>>0<(o[1210]|0)>>>0)Xe();else{o[i>>2]=C;o[C+24>>2]=a;o[C+12>>2]=C;o[C+8>>2]=C;break e}}else A=i}while(0);n=A+8|0;r=o[n>>2]|0;N=o[1210]|0;if(A>>>0>=N>>>0&r>>>0>=N>>>0){o[r+12>>2]=C;o[n>>2]=C;o[C+8>>2]=r;o[C+12>>2]=A;o[C+24>>2]=0;break}else Xe()}}else{N=o[1210]|0;if((N|0)==0|p>>>0>>0)o[1210]=p;o[1318]=p;o[1319]=d;o[1321]=0;o[1215]=o[1324];o[1214]=-1;r=0;do{N=r<<1;M=4864+(N<<2)|0;o[4864+(N+3<<2)>>2]=M;o[4864+(N+2<<2)>>2]=M;r=r+1|0}while((r|0)!=32);r=p+8|0;if(!(r&7))r=0;else r=0-r&7;N=d+-40-r|0;o[1212]=p+r;o[1209]=N;o[p+(r+4)>>2]=N|1;o[p+(d+-36)>>2]=40;o[1213]=o[1328]}}while(0);r=o[1209]|0;if(r>>>0>e>>>0){M=r-e|0;o[1209]=M;N=o[1212]|0;o[1212]=N+e;o[N+(e+4)>>2]=M|1;o[N+4>>2]=e|3;N=N+8|0;l=t;return N|0}}o[(Ye()|0)>>2]=12;N=0;l=t;return N|0}function _n(e){e=e|0;var t=0,r=0,n=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0,w=0;t=l;if(!e){l=t;return}d=e+-8|0;C=o[1210]|0;if(d>>>0>>0)Xe();g=o[e+-4>>2]|0;h=g&3;if((h|0)==1)Xe();a=g&-8;A=e+(a+-8)|0;do{if(!(g&1)){m=o[d>>2]|0;if(!h){l=t;return}d=-8-m|0;g=e+d|0;h=m+a|0;if(g>>>0>>0)Xe();if((g|0)==(o[1211]|0)){n=e+(a+-4)|0;f=o[n>>2]|0;if((f&3|0)!=3){n=g;f=h;break}o[1208]=h;o[n>>2]=f&-2;o[e+(d+4)>>2]=h|1;o[A>>2]=h;l=t;return}I=m>>>3;if(m>>>0<256){n=o[e+(d+8)>>2]|0;f=o[e+(d+12)>>2]|0;p=4864+(I<<1<<2)|0;if((n|0)!=(p|0)){if(n>>>0>>0)Xe();if((o[n+12>>2]|0)!=(g|0))Xe()}if((f|0)==(n|0)){o[1206]=o[1206]&~(1<>>0>>0)Xe();p=f+8|0;if((o[p>>2]|0)==(g|0))E=p;else Xe()}else E=f+8|0;o[n+12>>2]=f;o[E>>2]=n;n=g;f=h;break}E=o[e+(d+24)>>2]|0;I=o[e+(d+12)>>2]|0;do{if((I|0)==(g|0)){m=e+(d+20)|0;I=o[m>>2]|0;if(!I){m=e+(d+16)|0;I=o[m>>2]|0;if(!I){p=0;break}}while(1){y=I+20|0;w=o[y>>2]|0;if(w){I=w;m=y;continue}y=I+16|0;w=o[y>>2]|0;if(!w)break;else{I=w;m=y}}if(m>>>0>>0)Xe();else{o[m>>2]=0;p=I;break}}else{m=o[e+(d+8)>>2]|0;if(m>>>0>>0)Xe();C=m+12|0;if((o[C>>2]|0)!=(g|0))Xe();y=I+8|0;if((o[y>>2]|0)==(g|0)){o[C>>2]=I;o[y>>2]=m;p=I;break}else Xe()}}while(0);if(E){C=o[e+(d+28)>>2]|0;I=5128+(C<<2)|0;if((g|0)==(o[I>>2]|0)){o[I>>2]=p;if(!p){o[1207]=o[1207]&~(1<>>0<(o[1210]|0)>>>0)Xe();C=E+16|0;if((o[C>>2]|0)==(g|0))o[C>>2]=p;else o[E+20>>2]=p;if(!p){n=g;f=h;break}}C=o[1210]|0;if(p>>>0>>0)Xe();o[p+24>>2]=E;E=o[e+(d+16)>>2]|0;do{if(E)if(E>>>0>>0)Xe();else{o[p+16>>2]=E;o[E+24>>2]=p;break}}while(0);d=o[e+(d+20)>>2]|0;if(d)if(d>>>0<(o[1210]|0)>>>0)Xe();else{o[p+20>>2]=d;o[d+24>>2]=p;n=g;f=h;break}else{n=g;f=h}}else{n=g;f=h}}else{n=d;f=a}}while(0);if(n>>>0>=A>>>0)Xe();h=e+(a+-4)|0;g=o[h>>2]|0;if(!(g&1))Xe();if(!(g&2)){if((A|0)==(o[1212]|0)){w=(o[1209]|0)+f|0;o[1209]=w;o[1212]=n;o[n+4>>2]=w|1;if((n|0)!=(o[1211]|0)){l=t;return}o[1211]=0;o[1208]=0;l=t;return}if((A|0)==(o[1211]|0)){w=(o[1208]|0)+f|0;o[1208]=w;o[1211]=n;o[n+4>>2]=w|1;o[n+w>>2]=w;l=t;return}f=(g&-8)+f|0;h=g>>>3;do{if(g>>>0>=256){u=o[e+(a+16)>>2]|0;h=o[e+(a|4)>>2]|0;do{if((h|0)==(A|0)){g=e+(a+12)|0;h=o[g>>2]|0;if(!h){g=e+(a+8)|0;h=o[g>>2]|0;if(!h){c=0;break}}while(1){d=h+20|0;p=o[d>>2]|0;if(p){h=p;g=d;continue}p=h+16|0;d=o[p>>2]|0;if(!d)break;else{h=d;g=p}}if(g>>>0<(o[1210]|0)>>>0)Xe();else{o[g>>2]=0;c=h;break}}else{g=o[e+a>>2]|0;if(g>>>0<(o[1210]|0)>>>0)Xe();p=g+12|0;if((o[p>>2]|0)!=(A|0))Xe();d=h+8|0;if((o[d>>2]|0)==(A|0)){o[p>>2]=h;o[d>>2]=g;c=h;break}else Xe()}}while(0);if(u){h=o[e+(a+20)>>2]|0;g=5128+(h<<2)|0;if((A|0)==(o[g>>2]|0)){o[g>>2]=c;if(!c){o[1207]=o[1207]&~(1<>>0<(o[1210]|0)>>>0)Xe();h=u+16|0;if((o[h>>2]|0)==(A|0))o[h>>2]=c;else o[u+20>>2]=c;if(!c)break}A=o[1210]|0;if(c>>>0>>0)Xe();o[c+24>>2]=u;u=o[e+(a+8)>>2]|0;do{if(u)if(u>>>0>>0)Xe();else{o[c+16>>2]=u;o[u+24>>2]=c;break}}while(0);A=o[e+(a+12)>>2]|0;if(A)if(A>>>0<(o[1210]|0)>>>0)Xe();else{o[c+20>>2]=A;o[A+24>>2]=c;break}}}else{c=o[e+a>>2]|0;a=o[e+(a|4)>>2]|0;e=4864+(h<<1<<2)|0;if((c|0)!=(e|0)){if(c>>>0<(o[1210]|0)>>>0)Xe();if((o[c+12>>2]|0)!=(A|0))Xe()}if((a|0)==(c|0)){o[1206]=o[1206]&~(1<>>0<(o[1210]|0)>>>0)Xe();e=a+8|0;if((o[e>>2]|0)==(A|0))u=e;else Xe()}else u=a+8|0;o[c+12>>2]=a;o[u>>2]=c}}while(0);o[n+4>>2]=f|1;o[n+f>>2]=f;if((n|0)==(o[1211]|0)){o[1208]=f;l=t;return}}else{o[h>>2]=g&-2;o[n+4>>2]=f|1;o[n+f>>2]=f}A=f>>>3;if(f>>>0<256){a=A<<1;r=4864+(a<<2)|0;c=o[1206]|0;A=1<>2]|0;if(A>>>0<(o[1210]|0)>>>0)Xe();else{i=a;s=A}}else{o[1206]=c|A;i=4864+(a+2<<2)|0;s=r}o[i>>2]=n;o[s+12>>2]=n;o[n+8>>2]=s;o[n+12>>2]=r;l=t;return}i=f>>>8;if(i)if(f>>>0>16777215)i=31;else{y=(i+1048320|0)>>>16&8;w=i<>>16&4;w=w<>>16&2;i=14-(m|y|i)+(w<>>15)|0;i=f>>>(i+7|0)&1|i<<1}else i=0;s=5128+(i<<2)|0;o[n+28>>2]=i;o[n+20>>2]=0;o[n+16>>2]=0;a=o[1207]|0;A=1<>2]|0;if((i|0)==31)i=0;else i=25-(i>>>1)|0;t:do{if((o[s+4>>2]&-8|0)!=(f|0)){i=f<>>31<<2)+16|0;A=o[a>>2]|0;if(!A)break;if((o[A+4>>2]&-8|0)==(f|0)){r=A;break t}else{i=i<<1;s=A}}if(a>>>0<(o[1210]|0)>>>0)Xe();else{o[a>>2]=n;o[n+24>>2]=s;o[n+12>>2]=n;o[n+8>>2]=n;break e}}else r=s}while(0);s=r+8|0;i=o[s>>2]|0;w=o[1210]|0;if(r>>>0>=w>>>0&i>>>0>=w>>>0){o[i+12>>2]=n;o[s>>2]=n;o[n+8>>2]=i;o[n+12>>2]=r;o[n+24>>2]=0;break}else Xe()}else{o[1207]=a|A;o[s>>2]=n;o[n+24>>2]=s;o[n+12>>2]=n;o[n+8>>2]=n}}while(0);w=(o[1214]|0)+-1|0;o[1214]=w;if(!w)r=5280|0;else{l=t;return}while(1){r=o[r>>2]|0;if(!r)break;else r=r+8|0}o[1214]=-1;l=t;return}function On(e,t){e=e|0;t=t|0;var r=0,n=0,i=0;r=l;do{if(e){if(t>>>0>4294967231){o[(Ye()|0)>>2]=12;n=0;break}if(t>>>0<11)n=16;else n=t+11&-8;n=ei(e+-8|0,n)|0;if(n){n=n+8|0;break}n=Un(t)|0;if(!n)n=0;else{i=o[e+-4>>2]|0;i=(i&-8)-((i&3|0)==0?8:4)|0;ui(n|0,e|0,(i>>>0>>0?i:t)|0)|0;_n(e)}}else n=Un(t)|0}while(0);l=r;return n|0}function jn(e){e=e|0;if((e|0)==32)e=1;else e=(e+-9|0)>>>0<5;return e&1|0}function Yn(e,t,r,i,A){e=e|0;t=t|0;r=r|0;i=i|0;A=A|0;var a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0;a=l;if(t>>>0>36){o[(Ye()|0)>>2]=22;E=0;I=0;R=E;l=a;return I|0}c=e+4|0;u=e+100|0;do{h=o[c>>2]|0;if(h>>>0<(o[u>>2]|0)>>>0){o[c>>2]=h+1;f=s[h>>0]|0}else f=Hn(e)|0}while((jn(f)|0)!=0);do{if((f|0)==43|(f|0)==45){h=((f|0)==45)<<31>>31;g=o[c>>2]|0;if(g>>>0<(o[u>>2]|0)>>>0){o[c>>2]=g+1;f=s[g>>0]|0;break}else{f=Hn(e)|0;break}}else h=0}while(0);g=(t|0)==0;do{if((t&-17|0)==0&(f|0)==48){f=o[c>>2]|0;if(f>>>0<(o[u>>2]|0)>>>0){o[c>>2]=f+1;f=s[f>>0]|0}else f=Hn(e)|0;if((f|32|0)!=120)if(g){t=8;r=46;break}else{r=32;break}t=o[c>>2]|0;if(t>>>0<(o[u>>2]|0)>>>0){o[c>>2]=t+1;f=s[t>>0]|0}else f=Hn(e)|0;if((s[f+5321>>0]|0)>15){i=(o[u>>2]|0)==0;if(!i)o[c>>2]=(o[c>>2]|0)+-1;if(!r){Jn(e,0);E=0;I=0;R=E;l=a;return I|0}if(i){E=0;I=0;R=E;l=a;return I|0}o[c>>2]=(o[c>>2]|0)+-1;E=0;I=0;R=E;l=a;return I|0}else{t=16;r=46}}else{t=g?10:t;if((s[f+5321>>0]|0)>>>0>>0)r=32;else{if(o[u>>2]|0)o[c>>2]=(o[c>>2]|0)+-1;Jn(e,0);o[(Ye()|0)>>2]=22;E=0;I=0;R=E;l=a;return I|0}}}while(0);if((r|0)==32)if((t|0)==10){t=f+-48|0;if(t>>>0<10){g=0;do{g=(g*10|0)+t|0;t=o[c>>2]|0;if(t>>>0<(o[u>>2]|0)>>>0){o[c>>2]=t+1;f=s[t>>0]|0}else f=Hn(e)|0;t=f+-48|0}while(t>>>0<10&g>>>0<429496729);p=0}else{g=0;p=0}t=f+-48|0;if(t>>>0<10){do{d=Ci(g|0,p|0,10,0)|0;C=R;E=((t|0)<0)<<31>>31;I=~E;if(C>>>0>I>>>0|(C|0)==(I|0)&d>>>0>~t>>>0)break;g=ai(d|0,C|0,t|0,E|0)|0;p=R;t=o[c>>2]|0;if(t>>>0<(o[u>>2]|0)>>>0){o[c>>2]=t+1;f=s[t>>0]|0}else f=Hn(e)|0;t=f+-48|0}while(t>>>0<10&(p>>>0<429496729|(p|0)==429496729&g>>>0<2576980378));if(t>>>0<=9){t=10;r=72}}}else r=46;e:do{if((r|0)==46){if(!(t+-1&t)){r=n[5584+((t*23|0)>>>5&7)>>0]|0;C=n[f+5321>>0]|0;g=C&255;if(g>>>0>>0){f=g;g=0;do{g=f|g<>2]|0;if(f>>>0<(o[u>>2]|0)>>>0){o[c>>2]=f+1;E=s[f>>0]|0}else E=Hn(e)|0;C=n[E+5321>>0]|0;f=C&255}while(f>>>0>>0&g>>>0<134217728);p=0}else{p=0;g=0;E=f}f=ci(-1,-1,r|0)|0;d=R;if((C&255)>>>0>=t>>>0|(p>>>0>d>>>0|(p|0)==(d|0)&g>>>0>f>>>0)){f=E;r=72;break}while(1){g=si(g|0,p|0,r|0)|0;p=R;g=C&255|g;C=o[c>>2]|0;if(C>>>0<(o[u>>2]|0)>>>0){o[c>>2]=C+1;E=s[C>>0]|0}else E=Hn(e)|0;C=n[E+5321>>0]|0;if((C&255)>>>0>=t>>>0|(p>>>0>d>>>0|(p|0)==(d|0)&g>>>0>f>>>0)){f=E;r=72;break e}}}C=n[f+5321>>0]|0;r=C&255;if(r>>>0>>0){g=0;do{g=r+(ie(g,t)|0)|0;r=o[c>>2]|0;if(r>>>0<(o[u>>2]|0)>>>0){o[c>>2]=r+1;d=s[r>>0]|0}else d=Hn(e)|0;C=n[d+5321>>0]|0;r=C&255}while(r>>>0>>0&g>>>0<119304647);p=0}else{g=0;p=0;d=f}if((C&255)>>>0>>0){r=Ei(-1,-1,t|0,0)|0;f=R;while(1){if(p>>>0>f>>>0|(p|0)==(f|0)&g>>>0>r>>>0){f=d;r=72;break e}E=Ci(g|0,p|0,t|0,0)|0;I=R;C=C&255;if(I>>>0>4294967295|(I|0)==-1&E>>>0>~C>>>0){f=d;r=72;break e}g=ai(C|0,0,E|0,I|0)|0;p=R;d=o[c>>2]|0;if(d>>>0<(o[u>>2]|0)>>>0){o[c>>2]=d+1;d=s[d>>0]|0}else d=Hn(e)|0;C=n[d+5321>>0]|0;if((C&255)>>>0>=t>>>0){f=d;r=72;break}}}else{f=d;r=72}}}while(0);if((r|0)==72)if((s[f+5321>>0]|0)>>>0>>0){do{r=o[c>>2]|0;if(r>>>0<(o[u>>2]|0)>>>0){o[c>>2]=r+1;r=s[r>>0]|0}else r=Hn(e)|0}while((s[r+5321>>0]|0)>>>0>>0);o[(Ye()|0)>>2]=34;p=A;g=i}if(o[u>>2]|0)o[c>>2]=(o[c>>2]|0)+-1;if(!(p>>>0>>0|(p|0)==(A|0)&g>>>0>>0)){if(!((i&1|0)!=0|0!=0|(h|0)!=0)){o[(Ye()|0)>>2]=34;I=ai(i|0,A|0,-1,-1)|0;E=R;R=E;l=a;return I|0}if(p>>>0>A>>>0|(p|0)==(A|0)&g>>>0>i>>>0){o[(Ye()|0)>>2]=34;E=A;I=i;R=E;l=a;return I|0}}I=((h|0)<0)<<31>>31;I=ii(g^h|0,p^I|0,h|0,I|0)|0;E=R;R=E;l=a;return I|0}function Gn(e,t,r){e=e|0;t=t|0;r=r|0;var i=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0.0,C=0,E=0,I=0,m=0,y=0,w=0,v=0,D=0,b=0,S=0,k=0,x=0,F=0.0,M=0,N=0.0,K=0.0,L=0.0,T=0.0;i=l;l=l+512|0;c=i;if(!t){t=24;a=-149}else if((t|0)==2){t=53;a=-1074}else if((t|0)==1){t=53;a=-1074}else{K=0.0;l=i;return+K}g=e+4|0;f=e+100|0;do{A=o[g>>2]|0;if(A>>>0<(o[f>>2]|0)>>>0){o[g>>2]=A+1;m=s[A>>0]|0}else m=Hn(e)|0}while((jn(m)|0)!=0);do{if((m|0)==43|(m|0)==45){A=1-(((m|0)==45&1)<<1)|0;h=o[g>>2]|0;if(h>>>0<(o[f>>2]|0)>>>0){o[g>>2]=h+1;m=s[h>>0]|0;break}else{m=Hn(e)|0;break}}else A=1}while(0);C=0;do{if((m|32|0)!=(n[5600+C>>0]|0))break;do{if(C>>>0<7){h=o[g>>2]|0;if(h>>>0<(o[f>>2]|0)>>>0){o[g>>2]=h+1;m=s[h>>0]|0;break}else{m=Hn(e)|0;break}}}while(0);C=C+1|0}while(C>>>0<8);do{if((C|0)==3)p=23;else if((C|0)!=8){h=(r|0)!=0;if(C>>>0>3&h)if((C|0)==8)break;else{p=23;break}e:do{if(!C){C=0;do{if((m|32|0)!=(n[5616+C>>0]|0))break e;do{if(C>>>0<2){E=o[g>>2]|0;if(E>>>0<(o[f>>2]|0)>>>0){o[g>>2]=E+1;m=s[E>>0]|0;break}else{m=Hn(e)|0;break}}}while(0);C=C+1|0}while(C>>>0<3)}}while(0);if(!C){do{if((m|0)==48){h=o[g>>2]|0;if(h>>>0<(o[f>>2]|0)>>>0){o[g>>2]=h+1;h=s[h>>0]|0}else h=Hn(e)|0;if((h|32|0)!=120){if(!(o[f>>2]|0)){m=48;break}o[g>>2]=(o[g>>2]|0)+-1;m=48;break}c=o[g>>2]|0;if(c>>>0<(o[f>>2]|0)>>>0){o[g>>2]=c+1;v=s[c>>0]|0;y=0}else{v=Hn(e)|0;y=0}while(1){if((v|0)==46){p=70;break}else if((v|0)!=48){c=0;h=0;E=0;C=0;m=0;w=0;F=1.0;I=0;d=0.0;break}c=o[g>>2]|0;if(c>>>0<(o[f>>2]|0)>>>0){o[g>>2]=c+1;v=s[c>>0]|0;y=1;continue}else{v=Hn(e)|0;y=1;continue}}if((p|0)==70){c=o[g>>2]|0;if(c>>>0<(o[f>>2]|0)>>>0){o[g>>2]=c+1;v=s[c>>0]|0}else v=Hn(e)|0;if((v|0)==48){E=0;C=0;do{c=o[g>>2]|0;if(c>>>0<(o[f>>2]|0)>>>0){o[g>>2]=c+1;v=s[c>>0]|0}else v=Hn(e)|0;E=ai(E|0,C|0,-1,-1)|0;C=R}while((v|0)==48);c=0;h=0;y=1;m=1;w=0;F=1.0;I=0;d=0.0}else{c=0;h=0;E=0;C=0;m=1;w=0;F=1.0;I=0;d=0.0}}e:while(1){b=v+-48|0;do{if(b>>>0>=10){D=v|32;S=(v|0)==46;if(!((D+-97|0)>>>0<6|S))break e;if(S)if(!m){E=h;C=c;m=1;break}else{v=46;break e}else{b=(v|0)>57?D+-87|0:b;p=83;break}}else p=83}while(0);if((p|0)==83){p=0;do{if(!((c|0)<0|(c|0)==0&h>>>0<8)){if((c|0)<0|(c|0)==0&h>>>0<14){K=F*.0625;N=K;d=d+K*+(b|0);break}if((b|0)==0|(w|0)!=0)N=F;else{w=1;N=F;d=d+F*.5}}else{N=F;I=b+(I<<4)|0}}while(0);h=ai(h|0,c|0,1,0)|0;c=R;y=1;F=N}v=o[g>>2]|0;if(v>>>0<(o[f>>2]|0)>>>0){o[g>>2]=v+1;v=s[v>>0]|0;continue}else{v=Hn(e)|0;continue}}if(!y){t=(o[f>>2]|0)==0;if(!t)o[g>>2]=(o[g>>2]|0)+-1;if(r){if(!t?(u=o[g>>2]|0,o[g>>2]=u+-1,(m|0)!=0):0)o[g>>2]=u+-2}else Jn(e,0);K=+(A|0)*0.0;l=i;return+K}p=(m|0)==0;u=p?h:E;p=p?c:C;if((c|0)<0|(c|0)==0&h>>>0<8)do{I=I<<4;h=ai(h|0,c|0,1,0)|0;c=R}while((c|0)<0|(c|0)==0&h>>>0<8);do{if((v|32|0)==112){h=ri(e,r)|0;c=R;if((h|0)==0&(c|0)==-2147483648)if(!r){Jn(e,0);K=0.0;l=i;return+K}else{if(!(o[f>>2]|0)){h=0;c=0;break}o[g>>2]=(o[g>>2]|0)+-1;h=0;c=0;break}}else if(!(o[f>>2]|0)){h=0;c=0}else{o[g>>2]=(o[g>>2]|0)+-1;h=0;c=0}}while(0);u=si(u|0,p|0,2)|0;u=ai(u|0,R|0,-32,-1)|0;c=ai(u|0,R|0,h|0,c|0)|0;u=R;if(!I){K=+(A|0)*0.0;l=i;return+K}if((u|0)>0|(u|0)==0&c>>>0>(0-a|0)>>>0){o[(Ye()|0)>>2]=34;K=+(A|0)*1.7976931348623157e+308*1.7976931348623157e+308;l=i;return+K}M=a+-106|0;x=((M|0)<0)<<31>>31;if((u|0)<(x|0)|(u|0)==(x|0)&c>>>0>>0){o[(Ye()|0)>>2]=34;K=+(A|0)*2.2250738585072014e-308*2.2250738585072014e-308;l=i;return+K}if((I|0)>-1)do{I=I<<1;if(!(d>=.5))F=d;else{F=d+-1.0;I=I|1}d=d+F;c=ai(c|0,u|0,-1,-1)|0;u=R}while((I|0)>-1);a=ii(32,0,a|0,((a|0)<0)<<31>>31|0)|0;a=ai(c|0,u|0,a|0,R|0)|0;M=R;if(0>(M|0)|0==(M|0)&t>>>0>a>>>0)if((a|0)<0){t=0;p=126}else{t=a;p=124}else p=124;if((p|0)==124)if((t|0)<53)p=126;else{a=t;F=+(A|0);N=0.0}if((p|0)==126){N=+(A|0);a=t;F=N;N=+Ve(+ +qn(1.0,84-t|0),+N)}M=(a|0)<32&d!=0.0&(I&1|0)==0;d=F*(M?0.0:d)+(N+F*+(((M&1)+I|0)>>>0))-N;if(!(d!=0.0))o[(Ye()|0)>>2]=34;K=+zn(d,c);l=i;return+K}}while(0);h=a+t|0;u=0-h|0;b=0;while(1){if((m|0)==46){p=137;break}else if((m|0)!=48){k=0;S=0;D=0;break}C=o[g>>2]|0;if(C>>>0<(o[f>>2]|0)>>>0){o[g>>2]=C+1;m=s[C>>0]|0;b=1;continue}else{m=Hn(e)|0;b=1;continue}}if((p|0)==137){p=o[g>>2]|0;if(p>>>0<(o[f>>2]|0)>>>0){o[g>>2]=p+1;m=s[p>>0]|0}else m=Hn(e)|0;if((m|0)==48){k=0;S=0;do{k=ai(k|0,S|0,-1,-1)|0;S=R;p=o[g>>2]|0;if(p>>>0<(o[f>>2]|0)>>>0){o[g>>2]=p+1;m=s[p>>0]|0}else m=Hn(e)|0}while((m|0)==48);b=1;D=1}else{k=0;S=0;D=1}}o[c>>2]=0;v=m+-48|0;x=(m|0)==46;e:do{if(v>>>0<10|x){p=c+496|0;w=0;y=0;I=0;E=0;C=0;t:while(1){do{if(x)if(!D){k=w;S=y;D=1}else break t;else{x=ai(w|0,y|0,1,0)|0;y=R;M=(m|0)!=48;if((E|0)>=125){if(!M){w=x;break}o[p>>2]=o[p>>2]|1;w=x;break}w=c+(E<<2)|0;if(I)v=m+-48+((o[w>>2]|0)*10|0)|0;o[w>>2]=v;I=I+1|0;v=(I|0)==9;w=x;b=1;I=v?0:I;E=(v&1)+E|0;C=M?x:C}}while(0);m=o[g>>2]|0;if(m>>>0<(o[f>>2]|0)>>>0){o[g>>2]=m+1;m=s[m>>0]|0}else m=Hn(e)|0;v=m+-48|0;x=(m|0)==46;if(!(v>>>0<10|x)){p=160;break e}}v=(b|0)!=0;p=168}else{w=0;y=0;I=0;E=0;C=0;p=160}}while(0);do{if((p|0)==160){v=(D|0)==0;k=v?w:k;S=v?y:S;v=(b|0)!=0;if(!(v&(m|32|0)==101))if((m|0)>-1){p=168;break}else{p=170;break}v=ri(e,r)|0;m=R;do{if((v|0)==0&(m|0)==-2147483648)if(!r){Jn(e,0);K=0.0;l=i;return+K}else{if(!(o[f>>2]|0)){v=0;m=0;break}o[g>>2]=(o[g>>2]|0)+-1;v=0;m=0;break}}while(0);e=ai(v|0,m|0,k|0,S|0)|0;S=R}}while(0);if((p|0)==168)if(o[f>>2]|0){o[g>>2]=(o[g>>2]|0)+-1;if(v)e=k;else p=171}else p=170;if((p|0)==170)if(v)e=k;else p=171;if((p|0)==171){o[(Ye()|0)>>2]=22;Jn(e,0);K=0.0;l=i;return+K}g=o[c>>2]|0;if(!g){K=+(A|0)*0.0;l=i;return+K}if((e|0)==(w|0)&(S|0)==(y|0)&((y|0)<0|(y|0)==0&w>>>0<10)?t>>>0>30|(g>>>t|0)==0:0){K=+(A|0)*+(g>>>0);l=i;return+K}M=(a|0)/-2|0;x=((M|0)<0)<<31>>31;if((S|0)>(x|0)|(S|0)==(x|0)&e>>>0>M>>>0){o[(Ye()|0)>>2]=34;K=+(A|0)*1.7976931348623157e+308*1.7976931348623157e+308;l=i;return+K}M=a+-106|0;x=((M|0)<0)<<31>>31;if((S|0)<(x|0)|(S|0)==(x|0)&e>>>0>>0){o[(Ye()|0)>>2]=34;K=+(A|0)*2.2250738585072014e-308*2.2250738585072014e-308;l=i;return+K}if(I){if((I|0)<9){g=c+(E<<2)|0;f=o[g>>2]|0;do{f=f*10|0;I=I+1|0}while((I|0)!=9);o[g>>2]=f}E=E+1|0}if((C|0)<9?(C|0)<=(e|0)&(e|0)<18:0){if((e|0)==9){K=+(A|0)*+((o[c>>2]|0)>>>0);l=i;return+K}if((e|0)<9){K=+(A|0)*+((o[c>>2]|0)>>>0)/+(o[5632+(8-e<<2)>>2]|0);l=i;return+K}M=t+27+(ie(e,-3)|0)|0;g=o[c>>2]|0;if((M|0)>30|(g>>>M|0)==0){K=+(A|0)*+(g>>>0)*+(o[5632+(e+-10<<2)>>2]|0);l=i;return+K}}g=(e|0)%9|0;if(!g){g=0;f=0}else{r=(e|0)>-1?g:g+9|0;p=o[5632+(8-r<<2)>>2]|0;if(E){C=1e9/(p|0)|0;g=0;f=0;I=0;do{k=c+(I<<2)|0;x=o[k>>2]|0;M=((x>>>0)/(p>>>0)|0)+f|0;o[k>>2]=M;f=ie((x>>>0)%(p>>>0)|0,C)|0;x=I;I=I+1|0;if((x|0)==(g|0)&(M|0)==0){g=I&127;e=e+-9|0}}while((I|0)!=(E|0));if(f){o[c+(E<<2)>>2]=f;E=E+1|0}}else{g=0;E=0}f=0;e=9-r+e|0}e:while(1){r=c+(g<<2)|0;if((e|0)<18){do{C=0;r=E+127|0;while(1){r=r&127;p=c+(r<<2)|0;I=si(o[p>>2]|0,0,29)|0;I=ai(I|0,R|0,C|0,0)|0;C=R;if(C>>>0>0|(C|0)==0&I>>>0>1e9){M=Ei(I|0,C|0,1e9,0)|0;I=Ii(I|0,C|0,1e9,0)|0;C=M}else C=0;o[p>>2]=I;p=(r|0)==(g|0);if(!((r|0)!=(E+127&127|0)|p))E=(I|0)==0?r:E;if(p)break;else r=r+-1|0}f=f+-29|0}while((C|0)==0)}else{if((e|0)!=18)break;do{if((o[r>>2]|0)>>>0>=9007199){e=18;break e}C=0;p=E+127|0;while(1){p=p&127;I=c+(p<<2)|0;m=si(o[I>>2]|0,0,29)|0;m=ai(m|0,R|0,C|0,0)|0;C=R;if(C>>>0>0|(C|0)==0&m>>>0>1e9){M=Ei(m|0,C|0,1e9,0)|0;m=Ii(m|0,C|0,1e9,0)|0;C=M}else C=0;o[I>>2]=m;I=(p|0)==(g|0);if(!((p|0)!=(E+127&127|0)|I))E=(m|0)==0?p:E;if(I)break;else p=p+-1|0}f=f+-29|0}while((C|0)==0)}g=g+127&127;if((g|0)==(E|0)){M=E+127&127;E=c+((E+126&127)<<2)|0;o[E>>2]=o[E>>2]|o[c+(M<<2)>>2];E=M}o[c+(g<<2)>>2]=C;e=e+9|0}e:while(1){r=E+1&127;p=c+((E+127&127)<<2)|0;while(1){I=(e|0)==18;C=(e|0)>27?9:1;while(1){m=0;while(1){y=m+g&127;if((y|0)==(E|0)){m=2;break}w=o[c+(y<<2)>>2]|0;v=o[5624+(m<<2)>>2]|0;if(w>>>0>>0){m=2;break}y=m+1|0;if(w>>>0>v>>>0)break;if((y|0)<2)m=y;else{m=y;break}}if((m|0)==2&I)break e;f=C+f|0;if((g|0)==(E|0))g=E;else break}I=(1<>>C;y=g;w=0;do{k=c+(g<<2)|0;x=o[k>>2]|0;M=(x>>>C)+w|0;o[k>>2]=M;w=ie(x&I,m)|0;M=(g|0)==(y|0)&(M|0)==0;g=g+1&127;e=M?e+-9|0:e;y=M?g:y}while((g|0)!=(E|0));if(!w){g=y;continue}if((r|0)!=(y|0))break;o[p>>2]=o[p>>2]|1;g=y}o[c+(E<<2)>>2]=w;g=y;E=r}e=g&127;if((e|0)==(E|0)){o[c+(r+-1<<2)>>2]=0;E=r}F=+((o[c+(e<<2)>>2]|0)>>>0);e=g+1&127;if((e|0)==(E|0)){E=E+1&127;o[c+(E+-1<<2)>>2]=0}d=+(A|0);N=d*(F*1.0e9+ +((o[c+(e<<2)>>2]|0)>>>0));A=f+53|0;a=A-a|0;if((a|0)<(t|0))if((a|0)<0){t=0;e=1;p=244}else{t=a;e=1;p=243}else{e=0;p=243}if((p|0)==243)if((t|0)<53)p=244;else{F=0.0;K=0.0}if((p|0)==244){T=+Ve(+ +qn(1.0,105-t|0),+N);L=+ot(+N,+ +qn(1.0,53-t|0));F=T;K=L;N=T+(N-L)}r=g+2&127;do{if((r|0)!=(E|0)){c=o[c+(r<<2)>>2]|0;do{if(c>>>0>=5e8){if(c>>>0>5e8){K=d*.75+K;break}if((g+3&127|0)==(E|0)){K=d*.5+K;break}else{K=d*.75+K;break}}else{if((c|0)==0?(g+3&127|0)==(E|0):0)break;K=d*.25+K}}while(0);if((53-t|0)<=1)break;if(+ot(+K,1.0)!=0.0)break;K=K+1.0}}while(0);d=N+K-F;do{if((A&2147483647|0)>(-2-h|0)){if(+J(+d)>=9007199254740992.0){e=(e|0)!=0&(t|0)==(a|0)?0:e;f=f+1|0;d=d*.5}if((f+50|0)<=(u|0)?!((e|0)!=0&K!=0.0):0)break;o[(Ye()|0)>>2]=34}}while(0);T=+zn(d,f);l=i;return+T}else if((C|0)==3){t=o[g>>2]|0;if(t>>>0<(o[f>>2]|0)>>>0){o[g>>2]=t+1;t=s[t>>0]|0}else t=Hn(e)|0;if((t|0)==40)t=1;else{if(!(o[f>>2]|0)){T=B;l=i;return+T}o[g>>2]=(o[g>>2]|0)+-1;T=B;l=i;return+T}while(1){A=o[g>>2]|0;if(A>>>0<(o[f>>2]|0)>>>0){o[g>>2]=A+1;A=s[A>>0]|0}else A=Hn(e)|0;if(!((A+-48|0)>>>0<10|(A+-65|0)>>>0<26)?!((A+-97|0)>>>0<26|(A|0)==95):0)break;t=t+1|0}if((A|0)==41){T=B;l=i;return+T}A=(o[f>>2]|0)==0;if(!A)o[g>>2]=(o[g>>2]|0)+-1;if(!h){o[(Ye()|0)>>2]=22;Jn(e,0);T=0.0;l=i;return+T}if((t|0)==0|A){T=B;l=i;return+T}do{t=t+-1|0;o[g>>2]=(o[g>>2]|0)+-1}while((t|0)!=0);d=B;l=i;return+d}else{if(o[f>>2]|0)o[g>>2]=(o[g>>2]|0)+-1;o[(Ye()|0)>>2]=22;Jn(e,0);T=0.0;l=i;return+T}}}while(0);if((p|0)==23){t=(o[f>>2]|0)==0;if(!t)o[g>>2]=(o[g>>2]|0)+-1;if(!(C>>>0<4|(r|0)==0|t))do{o[g>>2]=(o[g>>2]|0)+-1;C=C+-1|0}while(C>>>0>3)}T=+(A|0)*Q;l=i;return+T}function Jn(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0;r=l;o[e+104>>2]=t;i=o[e+8>>2]|0;n=o[e+4>>2]|0;s=i-n|0;o[e+108>>2]=s;if((t|0)!=0&(s|0)>(t|0)){o[e+100>>2]=n+t;l=r;return}else{o[e+100>>2]=i;l=r;return}}function Hn(e){e=e|0;var t=0,r=0,i=0,A=0,a=0,c=0,u=0;r=l;a=e+104|0;u=o[a>>2]|0;if(!((u|0)!=0?(o[e+108>>2]|0)>=(u|0):0))c=3;if((c|0)==3?(t=Vn(e)|0,(t|0)>=0):0){c=o[a>>2]|0;a=o[e+8>>2]|0;if((c|0)!=0?(i=o[e+4>>2]|0,A=c-(o[e+108>>2]|0)+-1|0,(a-i|0)>(A|0)):0)o[e+100>>2]=i+A;else o[e+100>>2]=a;i=o[e+4>>2]|0;if(a){u=e+108|0;o[u>>2]=a+1-i+(o[u>>2]|0)}e=i+-1|0;if((s[e>>0]|0|0)==(t|0)){u=t;l=r;return u|0}n[e>>0]=t;u=t;l=r;return u|0}o[e+100>>2]=0;u=-1;l=r;return u|0}function qn(e,t){e=+e;t=t|0;var r=0,n=0;r=l;if((t|0)>1023){e=e*8.98846567431158e+307;n=t+-1023|0;if((n|0)>1023){t=t+-2046|0;t=(t|0)>1023?1023:t;e=e*8.98846567431158e+307}else t=n}else if((t|0)<-1022){e=e*2.2250738585072014e-308;n=t+1022|0;if((n|0)<-1022){t=t+2044|0;t=(t|0)<-1022?-1022:t;e=e*2.2250738585072014e-308}else t=n}t=si(t+1023|0,0,52)|0;n=R;o[g>>2]=t;o[g+4>>2]=n;e=e*+u[g>>3];l=r;return+e}function zn(e,t){e=+e;t=t|0;var r=0;r=l;e=+qn(e,t);l=r;return+e}function Wn(e){e=e|0;var t=0,r=0,i=0;r=l;i=e+74|0;t=n[i>>0]|0;n[i>>0]=t+255|t;i=e+20|0;t=e+44|0;if((o[i>>2]|0)>>>0>(o[t>>2]|0)>>>0)_i[o[e+36>>2]&1](e,0,0)|0;o[e+16>>2]=0;o[e+28>>2]=0;o[i>>2]=0;i=o[e>>2]|0;if(!(i&20)){i=o[t>>2]|0;o[e+8>>2]=i;o[e+4>>2]=i;i=0;l=r;return i|0}if(!(i&4)){i=-1;l=r;return i|0}o[e>>2]=i|32;i=-1;l=r;return i|0}function Vn(e){e=e|0;var t=0,r=0;t=l;l=l+16|0;r=t;if((o[e+8>>2]|0)==0?(Wn(e)|0)!=0:0)e=-1;else if((_i[o[e+32>>2]&1](e,r,1)|0)==1)e=s[r>>0]|0;else e=-1;l=t;return e|0}function Xn(e,t){e=e|0;t=t|0;var r=0,n=0,i=0.0,s=0,A=0;r=l;l=l+112|0;n=r;A=n+0|0;s=A+112|0;do{o[A>>2]=0;A=A+4|0}while((A|0)<(s|0));s=n+4|0;o[s>>2]=e;A=n+8|0;o[A>>2]=-1;o[n+44>>2]=e;o[n+76>>2]=-1;Jn(n,0);i=+Gn(n,1,1);n=(o[s>>2]|0)-(o[A>>2]|0)+(o[n+108>>2]|0)|0;if(!t){l=r;return+i}if(n)e=e+n|0;o[t>>2]=e;l=r;return+i}function Zn(e,t,r){e=e|0;t=t|0;r=r|0;var n=0,i=0,s=0;n=l;l=l+112|0;s=n;o[s>>2]=0;i=s+4|0;o[i>>2]=e;o[s+44>>2]=e;if((e|0)<0)o[s+8>>2]=-1;else o[s+8>>2]=e+2147483647;o[s+76>>2]=-1;Jn(s,0);r=Yn(s,r,1,-2147483648,0)|0;if(!t){l=n;return r|0}o[t>>2]=e+((o[i>>2]|0)+(o[s+108>>2]|0)-(o[s+8>>2]|0));l=n;return r|0}function $n(e,t){e=e|0;t=t|0;var r=0,i=0,o=0;r=l;o=n[e>>0]|0;i=n[t>>0]|0;if(o<<24>>24==0?1:o<<24>>24!=i<<24>>24)t=o;else{do{e=e+1|0;t=t+1|0;o=n[e>>0]|0;i=n[t>>0]|0}while(!(o<<24>>24==0?1:o<<24>>24!=i<<24>>24));t=o}l=r;return(t&255)-(i&255)|0}function ei(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0;r=l;i=e+4|0;n=o[i>>2]|0;u=n&-8;a=e+u|0;h=o[1210]|0;A=n&3;if(!((A|0)!=1&e>>>0>=h>>>0&e>>>0>>0))Xe();s=e+(u|4)|0;p=o[s>>2]|0;if(!(p&1))Xe();if(!A){if(t>>>0<256){C=0;l=r;return C|0}if(u>>>0>=(t+4|0)>>>0?(u-t|0)>>>0<=o[1326]<<1>>>0:0){C=e;l=r;return C|0}C=0;l=r;return C|0}if(u>>>0>=t>>>0){A=u-t|0;if(A>>>0<=15){C=e;l=r;return C|0}o[i>>2]=n&1|t|2;o[e+(t+4)>>2]=A|3;o[s>>2]=o[s>>2]|1;ti(e+t|0,A);C=e;l=r;return C|0}if((a|0)==(o[1212]|0)){s=(o[1209]|0)+u|0;if(s>>>0<=t>>>0){C=0;l=r;return C|0}C=s-t|0;o[i>>2]=n&1|t|2;o[e+(t+4)>>2]=C|1;o[1212]=e+t;o[1209]=C;C=e;l=r;return C|0}if((a|0)==(o[1211]|0)){A=(o[1208]|0)+u|0;if(A>>>0>>0){C=0;l=r;return C|0}s=A-t|0;if(s>>>0>15){o[i>>2]=n&1|t|2;o[e+(t+4)>>2]=s|1;o[e+A>>2]=s;n=e+(A+4)|0;o[n>>2]=o[n>>2]&-2;n=e+t|0}else{o[i>>2]=n&1|A|2;n=e+(A+4)|0;o[n>>2]=o[n>>2]|1;n=0;s=0}o[1208]=s;o[1211]=n;C=e;l=r;return C|0}if(p&2){C=0;l=r;return C|0}s=(p&-8)+u|0;if(s>>>0>>0){C=0;l=r;return C|0}A=s-t|0;f=p>>>3;do{if(p>>>0>=256){g=o[e+(u+24)>>2]|0;f=o[e+(u+12)>>2]|0;do{if((f|0)==(a|0)){p=e+(u+20)|0;f=o[p>>2]|0;if(!f){p=e+(u+16)|0;f=o[p>>2]|0;if(!f){c=0;break}}while(1){C=f+20|0;d=o[C>>2]|0;if(d){f=d;p=C;continue}d=f+16|0;C=o[d>>2]|0;if(!C)break;else{f=C;p=d}}if(p>>>0>>0)Xe();else{o[p>>2]=0;c=f;break}}else{p=o[e+(u+8)>>2]|0;if(p>>>0>>0)Xe();h=p+12|0;if((o[h>>2]|0)!=(a|0))Xe();d=f+8|0;if((o[d>>2]|0)==(a|0)){o[h>>2]=f;o[d>>2]=p;c=f;break}else Xe()}}while(0);if(g){h=o[e+(u+28)>>2]|0;f=5128+(h<<2)|0;if((a|0)==(o[f>>2]|0)){o[f>>2]=c;if(!c){o[1207]=o[1207]&~(1<>>0<(o[1210]|0)>>>0)Xe();h=g+16|0;if((o[h>>2]|0)==(a|0))o[h>>2]=c;else o[g+20>>2]=c;if(!c)break}a=o[1210]|0;if(c>>>0>>0)Xe();o[c+24>>2]=g;h=o[e+(u+16)>>2]|0;do{if(h)if(h>>>0>>0)Xe();else{o[c+16>>2]=h;o[h+24>>2]=c;break}}while(0);a=o[e+(u+20)>>2]|0;if(a)if(a>>>0<(o[1210]|0)>>>0)Xe();else{o[c+20>>2]=a;o[a+24>>2]=c;break}}}else{c=o[e+(u+8)>>2]|0;u=o[e+(u+12)>>2]|0;p=4864+(f<<1<<2)|0;if((c|0)!=(p|0)){if(c>>>0>>0)Xe();if((o[c+12>>2]|0)!=(a|0))Xe()}if((u|0)==(c|0)){o[1206]=o[1206]&~(1<>>0>>0)Xe();h=u+8|0;if((o[h>>2]|0)==(a|0))g=h;else Xe()}else g=u+8|0;o[c+12>>2]=u;o[g>>2]=c}}while(0);if(A>>>0<16){o[i>>2]=s|n&1|2;C=e+(s|4)|0;o[C>>2]=o[C>>2]|1;C=e;l=r;return C|0}else{o[i>>2]=n&1|t|2;o[e+(t+4)>>2]=A|3;C=e+(s|4)|0;o[C>>2]=o[C>>2]|1;ti(e+t|0,A);C=e;l=r;return C|0}return 0}function ti(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0;r=l;A=e+t|0;u=o[e+4>>2]|0;do{if(!(u&1)){p=o[e>>2]|0;if(!(u&3)){l=r;return}u=e+(0-p)|0;h=p+t|0;C=o[1210]|0;if(u>>>0>>0)Xe();if((u|0)==(o[1211]|0)){n=e+(t+4)|0;g=o[n>>2]|0;if((g&3|0)!=3){n=u;g=h;break}o[1208]=h;o[n>>2]=g&-2;o[e+(4-p)>>2]=h|1;o[A>>2]=h;l=r;return}E=p>>>3;if(p>>>0<256){n=o[e+(8-p)>>2]|0;g=o[e+(12-p)>>2]|0;f=4864+(E<<1<<2)|0;if((n|0)!=(f|0)){if(n>>>0>>0)Xe();if((o[n+12>>2]|0)!=(u|0))Xe()}if((g|0)==(n|0)){o[1206]=o[1206]&~(1<>>0>>0)Xe();f=g+8|0;if((o[f>>2]|0)==(u|0))d=f;else Xe()}else d=g+8|0;o[n+12>>2]=g;o[d>>2]=n;n=u;g=h;break}d=o[e+(24-p)>>2]|0;E=o[e+(12-p)>>2]|0;do{if((E|0)==(u|0)){m=16-p|0;I=e+(m+4)|0;E=o[I>>2]|0;if(!E){I=e+m|0;E=o[I>>2]|0;if(!E){f=0;break}}while(1){y=E+20|0;m=o[y>>2]|0;if(m){E=m;I=y;continue}m=E+16|0;y=o[m>>2]|0;if(!y)break;else{E=y;I=m}}if(I>>>0>>0)Xe();else{o[I>>2]=0;f=E;break}}else{I=o[e+(8-p)>>2]|0;if(I>>>0>>0)Xe();C=I+12|0;if((o[C>>2]|0)!=(u|0))Xe();m=E+8|0;if((o[m>>2]|0)==(u|0)){o[C>>2]=E;o[m>>2]=I;f=E;break}else Xe()}}while(0);if(d){E=o[e+(28-p)>>2]|0;C=5128+(E<<2)|0;if((u|0)==(o[C>>2]|0)){o[C>>2]=f;if(!f){o[1207]=o[1207]&~(1<>>0<(o[1210]|0)>>>0)Xe();C=d+16|0;if((o[C>>2]|0)==(u|0))o[C>>2]=f;else o[d+20>>2]=f;if(!f){n=u;g=h;break}}C=o[1210]|0;if(f>>>0>>0)Xe();o[f+24>>2]=d;p=16-p|0;d=o[e+p>>2]|0;do{if(d)if(d>>>0>>0)Xe();else{o[f+16>>2]=d;o[d+24>>2]=f;break}}while(0);p=o[e+(p+4)>>2]|0;if(p)if(p>>>0<(o[1210]|0)>>>0)Xe();else{o[f+20>>2]=p;o[p+24>>2]=f;n=u;g=h;break}else{n=u;g=h}}else{n=u;g=h}}else{n=e;g=t}}while(0);u=o[1210]|0;if(A>>>0>>0)Xe();h=e+(t+4)|0;f=o[h>>2]|0;if(!(f&2)){if((A|0)==(o[1212]|0)){y=(o[1209]|0)+g|0;o[1209]=y;o[1212]=n;o[n+4>>2]=y|1;if((n|0)!=(o[1211]|0)){l=r;return}o[1211]=0;o[1208]=0;l=r;return}if((A|0)==(o[1211]|0)){y=(o[1208]|0)+g|0;o[1208]=y;o[1211]=n;o[n+4>>2]=y|1;o[n+y>>2]=y;l=r;return}g=(f&-8)+g|0;h=f>>>3;do{if(f>>>0>=256){c=o[e+(t+24)>>2]|0;f=o[e+(t+12)>>2]|0;do{if((f|0)==(A|0)){f=e+(t+20)|0;h=o[f>>2]|0;if(!h){f=e+(t+16)|0;h=o[f>>2]|0;if(!h){a=0;break}}while(1){p=h+20|0;d=o[p>>2]|0;if(d){h=d;f=p;continue}d=h+16|0;p=o[d>>2]|0;if(!p)break;else{h=p;f=d}}if(f>>>0>>0)Xe();else{o[f>>2]=0;a=h;break}}else{h=o[e+(t+8)>>2]|0;if(h>>>0>>0)Xe();p=h+12|0;if((o[p>>2]|0)!=(A|0))Xe();u=f+8|0;if((o[u>>2]|0)==(A|0)){o[p>>2]=f;o[u>>2]=h;a=f;break}else Xe()}}while(0);if(c){h=o[e+(t+28)>>2]|0;u=5128+(h<<2)|0;if((A|0)==(o[u>>2]|0)){o[u>>2]=a;if(!a){o[1207]=o[1207]&~(1<>>0<(o[1210]|0)>>>0)Xe();u=c+16|0;if((o[u>>2]|0)==(A|0))o[u>>2]=a;else o[c+20>>2]=a;if(!a)break}A=o[1210]|0;if(a>>>0>>0)Xe();o[a+24>>2]=c;c=o[e+(t+16)>>2]|0;do{if(c)if(c>>>0>>0)Xe();else{o[a+16>>2]=c;o[c+24>>2]=a;break}}while(0);A=o[e+(t+20)>>2]|0;if(A)if(A>>>0<(o[1210]|0)>>>0)Xe();else{o[a+20>>2]=A;o[A+24>>2]=a;break}}}else{a=o[e+(t+8)>>2]|0;e=o[e+(t+12)>>2]|0;t=4864+(h<<1<<2)|0;if((a|0)!=(t|0)){if(a>>>0>>0)Xe();if((o[a+12>>2]|0)!=(A|0))Xe()}if((e|0)==(a|0)){o[1206]=o[1206]&~(1<>>0>>0)Xe();t=e+8|0;if((o[t>>2]|0)==(A|0))c=t;else Xe()}else c=e+8|0;o[a+12>>2]=e;o[c>>2]=a}}while(0);o[n+4>>2]=g|1;o[n+g>>2]=g;if((n|0)==(o[1211]|0)){o[1208]=g;l=r;return}}else{o[h>>2]=f&-2;o[n+4>>2]=g|1;o[n+g>>2]=g}t=g>>>3;if(g>>>0<256){e=t<<1;A=4864+(e<<2)|0;a=o[1206]|0;t=1<>2]|0;if(a>>>0<(o[1210]|0)>>>0)Xe();else{s=e;i=a}}else{o[1206]=a|t;s=4864+(e+2<<2)|0;i=A}o[s>>2]=n;o[i+12>>2]=n;o[n+8>>2]=i;o[n+12>>2]=A;l=r;return}i=g>>>8;if(i)if(g>>>0>16777215)i=31;else{m=(i+1048320|0)>>>16&8;y=i<>>16&4;y=y<>>16&2;i=14-(I|m|i)+(y<>>15)|0;i=g>>>(i+7|0)&1|i<<1}else i=0;s=5128+(i<<2)|0;o[n+28>>2]=i;o[n+20>>2]=0;o[n+16>>2]=0;e=o[1207]|0;A=1<>2]=n;o[n+24>>2]=s;o[n+12>>2]=n;o[n+8>>2]=n;l=r;return}s=o[s>>2]|0;if((i|0)==31)i=0;else i=25-(i>>>1)|0;e:do{if((o[s+4>>2]&-8|0)!=(g|0)){i=g<>>31<<2)+16|0;s=o[A>>2]|0;if(!s)break;if((o[s+4>>2]&-8|0)==(g|0))break e;else{i=i<<1;e=s}}if(A>>>0<(o[1210]|0)>>>0)Xe();o[A>>2]=n;o[n+24>>2]=e;o[n+12>>2]=n;o[n+8>>2]=n;l=r;return}}while(0);i=s+8|0;A=o[i>>2]|0;y=o[1210]|0;if(!(s>>>0>=y>>>0&A>>>0>=y>>>0))Xe();o[A+12>>2]=n;o[i>>2]=n;o[n+8>>2]=A;o[n+12>>2]=s;o[n+24>>2]=0;l=r;return}function ri(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,A=0,a=0,c=0;r=l;i=e+4|0;A=o[i>>2]|0;n=e+100|0;if(A>>>0<(o[n>>2]|0)>>>0){o[i>>2]=A+1;a=s[A>>0]|0}else a=Hn(e)|0;if((a|0)==43|(a|0)==45){c=o[i>>2]|0;A=(a|0)==45&1;if(c>>>0<(o[n>>2]|0)>>>0){o[i>>2]=c+1;a=s[c>>0]|0}else a=Hn(e)|0;if((a+-48|0)>>>0>9&(t|0)!=0?(o[n>>2]|0)!=0:0)o[i>>2]=(o[i>>2]|0)+-1}else A=0;if((a+-48|0)>>>0>9){if(!(o[n>>2]|0)){a=-2147483648;c=0;R=a;l=r;return c|0}o[i>>2]=(o[i>>2]|0)+-1;a=-2147483648;c=0;R=a;l=r;return c|0}else t=0;do{t=a+-48+(t*10|0)|0;a=o[i>>2]|0;if(a>>>0<(o[n>>2]|0)>>>0){o[i>>2]=a+1;a=s[a>>0]|0}else a=Hn(e)|0}while((a+-48|0)>>>0<10&(t|0)<214748364);c=((t|0)<0)<<31>>31;if((a+-48|0)>>>0<10)do{c=Ci(t|0,c|0,10,0)|0;t=R;a=ai(a|0,((a|0)<0)<<31>>31|0,-48,-1)|0;t=ai(a|0,R|0,c|0,t|0)|0;c=R;a=o[i>>2]|0;if(a>>>0<(o[n>>2]|0)>>>0){o[i>>2]=a+1;a=s[a>>0]|0}else a=Hn(e)|0}while((a+-48|0)>>>0<10&((c|0)<21474836|(c|0)==21474836&t>>>0<2061584302));if((a+-48|0)>>>0<10)do{a=o[i>>2]|0;if(a>>>0<(o[n>>2]|0)>>>0){o[i>>2]=a+1;a=s[a>>0]|0}else a=Hn(e)|0}while((a+-48|0)>>>0<10);if(o[n>>2]|0)o[i>>2]=(o[i>>2]|0)+-1;i=(A|0)!=0;A=ii(0,0,t|0,c|0)|0;a=i?R:c;c=i?A:t;R=a;l=r;return c|0}function ni(){}function ii(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;t=t-n-(r>>>0>e>>>0|0)>>>0;return(R=t,e-r>>>0|0)|0}function oi(e,t,r){e=e|0;t=t|0;r=r|0;var i=0,s=0,A=0,a=0;i=e+r|0;if((r|0)>=20){t=t&255;a=e&3;A=t|t<<8|t<<16|t<<24;s=i&~3;if(a){a=e+4-a|0;while((e|0)<(a|0)){n[e>>0]=t;e=e+1|0}}while((e|0)<(s|0)){o[e>>2]=A;e=e+4|0}}while((e|0)<(i|0)){n[e>>0]=t;e=e+1|0}return e-r|0}function si(e,t,r){e=e|0;t=t|0;r=r|0;if((r|0)<32){R=t<>>32-r;return e<>0]|0)t=t+1|0;return t-e|0}function ai(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;r=e+r>>>0;return(R=t+n+(r>>>0>>0|0)>>>0,r|0)|0}function ci(e,t,r){e=e|0;t=t|0;r=r|0;if((r|0)<32){R=t>>>r;return e>>>r|(t&(1<>>r-32|0}function ui(e,t,r){e=e|0;t=t|0;r=r|0;var i=0;if((r|0)>=4096)return Fe(e|0,t|0,r|0)|0;i=e|0;if((e&3)==(t&3)){while(e&3){if(!r)return i|0;n[e>>0]=n[t>>0]|0;e=e+1|0;t=t+1|0;r=r-1|0}while((r|0)>=4){o[e>>2]=o[t>>2];e=e+4|0;t=t+4|0;r=r-4|0}}while((r|0)>0){n[e>>0]=n[t>>0]|0;e=e+1|0;t=t+1|0;r=r-1|0}return i|0}function li(e,t,r){e=e|0;t=t|0;r=r|0;if((r|0)<32){R=t>>r;return e>>>r|(t&(1<>r-32|0}function hi(e){e=e|0;var t=0;t=n[d+(e>>>24)>>0]|0;if((t|0)<8)return t|0;t=n[d+(e>>16&255)>>0]|0;if((t|0)<8)return t+8|0;t=n[d+(e>>8&255)>>0]|0;if((t|0)<8)return t+16|0;return(n[d+(e&255)>>0]|0)+24|0}function gi(e){e=e|0;var t=0;t=n[p+(e&255)>>0]|0;if((t|0)<8)return t|0;t=n[p+(e>>8&255)>>0]|0;if((t|0)<8)return t+8|0;t=n[p+(e>>16&255)>>0]|0;if((t|0)<8)return t+16|0;return(n[p+(e>>>24)>>0]|0)+24|0}function fi(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,o=0;o=e&65535;n=t&65535;r=ie(n,o)|0;i=e>>>16;n=(r>>>16)+(ie(n,i)|0)|0;t=t>>>16;e=ie(t,o)|0;return(R=(n>>>16)+(ie(t,i)|0)+(((n&65535)+e|0)>>>16)|0,n+e<<16|r&65535|0)|0}function pi(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;var i=0,o=0,s=0,A=0,a=0,c=0;c=t>>31|((t|0)<0?-1:0)<<1;a=((t|0)<0?-1:0)>>31|((t|0)<0?-1:0)<<1;o=n>>31|((n|0)<0?-1:0)<<1;i=((n|0)<0?-1:0)>>31|((n|0)<0?-1:0)<<1;A=ii(c^e,a^t,c,a)|0;s=R;t=o^c;e=i^a;e=ii((mi(A,s,ii(o^r,i^n,o,i)|0,R,0)|0)^t,R^e,t,e)|0;return e|0}function di(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;var i=0,s=0,A=0,a=0,c=0,u=0;i=l;l=l+8|0;a=i|0;A=t>>31|((t|0)<0?-1:0)<<1;s=((t|0)<0?-1:0)>>31|((t|0)<0?-1:0)<<1;u=n>>31|((n|0)<0?-1:0)<<1;c=((n|0)<0?-1:0)>>31|((n|0)<0?-1:0)<<1;t=ii(A^e,s^t,A,s)|0;e=R;mi(t,e,ii(u^r,c^n,u,c)|0,R,a)|0;e=ii(o[a>>2]^A,o[a+4>>2]^s,A,s)|0;t=R;l=i;return(R=t,e)|0}function Ci(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;var i=0,o=0;i=e;o=r;e=fi(i,o)|0;r=R;return(R=(ie(t,o)|0)+(ie(n,i)|0)+r|r&0,e|0|0)|0}function Ei(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;e=mi(e,t,r,n,0)|0;return e|0}function Ii(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;var i=0,s=0;s=l;l=l+8|0;i=s|0;mi(e,t,r,n,i)|0;l=s;return(R=o[i+4>>2]|0,o[i>>2]|0)|0}function mi(e,t,r,n,i){e=e|0;t=t|0;r=r|0;n=n|0;i=i|0;var s=0,A=0,a=0,c=0,u=0,l=0,h=0,g=0,f=0,p=0;A=e;c=t;a=c;l=r;s=n;u=s;if(!a){s=(i|0)!=0;if(!u){if(s){o[i>>2]=(A>>>0)%(l>>>0);o[i+4>>2]=0}u=0;h=(A>>>0)/(l>>>0)>>>0;return(R=u,h)|0}else{if(!s){l=0;h=0;return(R=l,h)|0}o[i>>2]=e|0;o[i+4>>2]=t&0;l=0;h=0;return(R=l,h)|0}}h=(u|0)==0;do{if(l){if(!h){u=(hi(u|0)|0)-(hi(a|0)|0)|0;if(u>>>0<=31){h=u+1|0;l=31-u|0;e=u-31>>31;c=h;t=A>>>(h>>>0)&e|a<>>(h>>>0)&e;u=0;l=A<>2]=e|0;o[i+4>>2]=c|t&0;l=0;h=0;return(R=l,h)|0}u=l-1|0;if(u&l){l=(hi(l|0)|0)+33-(hi(a|0)|0)|0;p=64-l|0;h=32-l|0;g=h>>31;f=l-32|0;e=f>>31;c=l;t=h-1>>31&a>>>(f>>>0)|(a<>>(l>>>0))&e;e=e&a>>>(l>>>0);u=A<>>(f>>>0))&g|A<>31;break}if(i){o[i>>2]=u&A;o[i+4>>2]=0}if((l|0)==1){f=c|t&0;p=e|0|0;return(R=f,p)|0}else{p=gi(l|0)|0;f=a>>>(p>>>0)|0;p=a<<32-p|A>>>(p>>>0)|0;return(R=f,p)|0}}else{if(h){if(i){o[i>>2]=(a>>>0)%(l>>>0);o[i+4>>2]=0}f=0;p=(a>>>0)/(l>>>0)>>>0;return(R=f,p)|0}if(!A){if(i){o[i>>2]=0;o[i+4>>2]=(a>>>0)%(u>>>0)}f=0;p=(a>>>0)/(u>>>0)>>>0;return(R=f,p)|0}l=u-1|0;if(!(l&u)){if(i){o[i>>2]=e|0;o[i+4>>2]=l&a|t&0}f=0;p=a>>>((gi(u|0)|0)>>>0);return(R=f,p)|0}u=(hi(u|0)|0)-(hi(a|0)|0)|0;if(u>>>0<=30){e=u+1|0;l=31-u|0;c=e;t=a<>>(e>>>0);e=a>>>(e>>>0);u=0;l=A<>2]=e|0;o[i+4>>2]=c|t&0;f=0;p=0;return(R=f,p)|0}}while(0);if(!c){s=l;n=0;a=0}else{A=r|0|0;s=s|n&0;n=ai(A,s,-1,-1)|0;r=R;a=0;do{h=l;l=u>>>31|l<<1;u=a|u<<1;h=t<<1|h>>>31|0;g=t>>>31|e<<1|0;ii(n,r,h,g)|0;p=R;f=p>>31|((p|0)<0?-1:0)<<1;a=f&1;t=ii(h,g,f&A,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&s)|0;e=R;c=c-1|0}while((c|0)!=0);s=l;n=0}A=0;if(i){o[i>>2]=t;o[i+4>>2]=e}f=(u|0)>>>31|(s|A)<<1|(A<<1|u>>>31)&0|n;p=(u<<1|0>>>31)&-2|a;return(R=f,p)|0}function yi(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;return _i[e&1](t|0,r|0,n|0)|0}function wi(e,t,r,n,i,o){e=e|0;t=t|0;r=r|0;n=n|0;i=i|0;o=o|0;Oi[e&3](t|0,r|0,n|0,i|0,o|0)}function Bi(e,t){e=e|0;t=t|0;ji[e&31](t|0)}function Qi(e,t,r){e=e|0;t=t|0;r=r|0;Yi[e&3](t|0,r|0)}function vi(e,t){e=e|0;t=t|0;return Gi[e&1](t|0)|0}function Di(e){e=e|0;Ji[e&3]()}function bi(e,t,r,n,i,o,s){e=e|0;t=t|0;r=r|0;n=n|0;i=i|0;o=o|0;s=s|0;Hi[e&3](t|0,r|0,n|0,i|0,o|0,s|0)}function Si(e,t,r){e=e|0;t=t|0;r=r|0;return qi[e&3](t|0,r|0)|0}function ki(e,t,r,n,i){e=e|0;t=t|0;r=r|0;n=n|0;i=i|0;zi[e&3](t|0,r|0,n|0,i|0)}function xi(e,t,r){e=e|0;t=t|0;r=r|0;oe(0);return 0}function Fi(e,t,r,n,i){e=e|0;t=t|0;r=r|0;n=n|0;i=i|0;oe(1)}function Mi(e){e=e|0;oe(2)}function Ni(e,t){e=e|0;t=t|0;oe(3)}function Ri(e){e=e|0;oe(4);return 0}function Ki(){oe(5)}function Li(){it()}function Ti(e,t,r,n,i,o){e=e|0;t=t|0;r=r|0;n=n|0;i=i|0;o=o|0;oe(6)}function Pi(e,t){e=e|0;t=t|0;oe(7);return 0}function Ui(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;oe(8)}var _i=[xi,Qn];var Oi=[Fi,Fn,xn,Fi];var ji=[Mi,dt,Et,mt,Bt,St,bt,Wt,Xt,Ir,Er,Rr,hn,ln,In,wn,mn,yn,Bn,It,Pn,Mi,Mi,Mi,Mi,Mi,Mi,Mi,Mi,Mi,Mi,Mi];var Yi=[Ni,wt,vt,$t];var Gi=[Ri,gn];var Ji=[Ki,Li,Ln,Tn];var Hi=[Ti,Nn,Mn,Ti];var qi=[Pi,yt,Qt,Zt];var zi=[Ui,Dn,bn,Ui];return{_yo:qr,_strlen:Ai,_retireVar:rn,_bitshift64Lshr:ci,_unyo:zr,_solve:Zr,_bitshift64Shl:si,_getSolution:$r,___cxa_is_pointer_type:Kn,_memset:oi,_getNumVars:en,_memcpy:ui,_getConflictClauseSize:nn,_addClause:Xr,_i64Subtract:ii,_createTheSolver:Wr,_realloc:On,_i64Add:ai,_solveAssuming:tn,___cxa_can_catch:Rn,_ensureVar:Vr,_getConflictClause:on,_free:_n,_malloc:Un,__GLOBAL__I_a:Vt,__GLOBAL__I_a127:Kr,runPostSets:ni,stackAlloc:At,stackSave:at,stackRestore:ct,setThrew:ut,setTempRet0:gt,getTempRet0:ft,dynCall_iiii:yi,dynCall_viiiii:wi,dynCall_vi:Bi,dynCall_vii:Qi,dynCall_ii:vi,dynCall_v:Di,dynCall_viiiiii:bi,dynCall_iii:Si,dynCall_viiii:ki}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer),_yo=Module._yo=asm._yo,_strlen=Module._strlen=asm._strlen,_retireVar=Module._retireVar=asm._retireVar,_bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,_unyo=Module._unyo=asm._unyo,_solve=Module._solve=asm._solve,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,_getSolution=Module._getSolution=asm._getSolution,___cxa_is_pointer_type=Module.___cxa_is_pointer_type=asm.___cxa_is_pointer_type,_memset=Module._memset=asm._memset,_getNumVars=Module._getNumVars=asm._getNumVars,_memcpy=Module._memcpy=asm._memcpy,_getConflictClauseSize=Module._getConflictClauseSize=asm._getConflictClauseSize,_addClause=Module._addClause=asm._addClause,_i64Subtract=Module._i64Subtract=asm._i64Subtract,_createTheSolver=Module._createTheSolver=asm._createTheSolver,_realloc=Module._realloc=asm._realloc,_i64Add=Module._i64Add=asm._i64Add,_solveAssuming=Module._solveAssuming=asm._solveAssuming,___cxa_can_catch=Module.___cxa_can_catch=asm.___cxa_can_catch,_ensureVar=Module._ensureVar=asm._ensureVar,_getConflictClause=Module._getConflictClause=asm._getConflictClause,_free=Module._free=asm._free,_malloc=Module._malloc=asm._malloc,__GLOBAL__I_a=Module.__GLOBAL__I_a=asm.__GLOBAL__I_a,__GLOBAL__I_a127=Module.__GLOBAL__I_a127=asm.__GLOBAL__I_a127,runPostSets=Module.runPostSets=asm.runPostSets,dynCall_iiii=Module.dynCall_iiii=asm.dynCall_iiii,dynCall_viiiii=Module.dynCall_viiiii=asm.dynCall_viiiii,dynCall_vi=Module.dynCall_vi=asm.dynCall_vi,dynCall_vii=Module.dynCall_vii=asm.dynCall_vii,dynCall_ii=Module.dynCall_ii=asm.dynCall_ii,dynCall_v=Module.dynCall_v=asm.dynCall_v,dynCall_viiiiii=Module.dynCall_viiiiii=asm.dynCall_viiiiii,dynCall_iii=Module.dynCall_iii=asm.dynCall_iii,dynCall_viiii=Module.dynCall_viiii=asm.dynCall_viiii;Runtime.stackAlloc=asm.stackAlloc,Runtime.stackSave=asm.stackSave,Runtime.stackRestore=asm.stackRestore,Runtime.setTempRet0=asm.setTempRet0,Runtime.getTempRet0=asm.getTempRet0;var i64Math=function(){var e={math:{}};e.math.Long=function(e,t){this.low_=0|e,this.high_=0|t},e.math.Long.IntCache_={},e.math.Long.fromInt=function(t){if(-128<=t&&t<128){var r=e.math.Long.IntCache_[t];if(r)return r}var n=new e.math.Long(0|t,t<0?-1:0);return-128<=t&&t<128&&(e.math.Long.IntCache_[t]=n),n},e.math.Long.fromNumber=function(t){return isNaN(t)||!isFinite(t)?e.math.Long.ZERO:t<=-e.math.Long.TWO_PWR_63_DBL_?e.math.Long.MIN_VALUE:t+1>=e.math.Long.TWO_PWR_63_DBL_?e.math.Long.MAX_VALUE:t<0?e.math.Long.fromNumber(-t).negate():new e.math.Long(t%e.math.Long.TWO_PWR_32_DBL_|0,t/e.math.Long.TWO_PWR_32_DBL_|0)},e.math.Long.fromBits=function(t,r){return new e.math.Long(t,r)},e.math.Long.fromString=function(t,r){if(0==t.length)throw Error("number format error: empty string");var n=r||10;if(n<2||36=0)throw Error('number format error: interior "-" character: '+t);for(var i=e.math.Long.fromNumber(Math.pow(n,8)),o=e.math.Long.ZERO,s=0;s=0?this.low_:e.math.Long.TWO_PWR_32_DBL_+this.low_},e.math.Long.prototype.getNumBitsAbs=function(){if(this.isNegative())return this.equals(e.math.Long.MIN_VALUE)?64:this.negate().getNumBitsAbs();for(var t=0!=this.high_?this.high_:this.low_,r=31;r>0&&0==(t&1<0},e.math.Long.prototype.greaterThanOrEqual=function(e){return this.compare(e)>=0},e.math.Long.prototype.compare=function(e){if(this.equals(e))return 0;var t=this.isNegative(),r=e.isNegative();return t&&!r?-1:!t&&r?1:this.subtract(e).isNegative()?-1:1},e.math.Long.prototype.negate=function(){return this.equals(e.math.Long.MIN_VALUE)?e.math.Long.MIN_VALUE:this.not().add(e.math.Long.ONE)},e.math.Long.prototype.add=function(t){var r=this.high_>>>16,n=65535&this.high_,i=this.low_>>>16,o=65535&this.low_,s=t.high_>>>16,A=65535&t.high_,a=t.low_>>>16,c=0,u=0,l=0,h=0;return l+=(h+=o+(65535&t.low_))>>>16,h&=65535,u+=(l+=i+a)>>>16,l&=65535,c+=(u+=n+A)>>>16,u&=65535,c+=r+s,c&=65535,e.math.Long.fromBits(l<<16|h,c<<16|u)},e.math.Long.prototype.subtract=function(e){return this.add(e.negate())},e.math.Long.prototype.multiply=function(t){if(this.isZero())return e.math.Long.ZERO;if(t.isZero())return e.math.Long.ZERO;if(this.equals(e.math.Long.MIN_VALUE))return t.isOdd()?e.math.Long.MIN_VALUE:e.math.Long.ZERO;if(t.equals(e.math.Long.MIN_VALUE))return this.isOdd()?e.math.Long.MIN_VALUE:e.math.Long.ZERO;if(this.isNegative())return t.isNegative()?this.negate().multiply(t.negate()):this.negate().multiply(t).negate();if(t.isNegative())return this.multiply(t.negate()).negate();if(this.lessThan(e.math.Long.TWO_PWR_24_)&&t.lessThan(e.math.Long.TWO_PWR_24_))return e.math.Long.fromNumber(this.toNumber()*t.toNumber());var r=this.high_>>>16,n=65535&this.high_,i=this.low_>>>16,o=65535&this.low_,s=t.high_>>>16,A=65535&t.high_,a=t.low_>>>16,c=65535&t.low_,u=0,l=0,h=0,g=0;return h+=(g+=o*c)>>>16,g&=65535,l+=(h+=i*c)>>>16,h&=65535,l+=(h+=o*a)>>>16,h&=65535,u+=(l+=n*c)>>>16,l&=65535,u+=(l+=i*a)>>>16,l&=65535,u+=(l+=o*A)>>>16,l&=65535,u+=r*c+n*a+i*A+o*s,u&=65535,e.math.Long.fromBits(h<<16|g,u<<16|l)},e.math.Long.prototype.div=function(t){if(t.isZero())throw Error("division by zero");if(this.isZero())return e.math.Long.ZERO;if(this.equals(e.math.Long.MIN_VALUE)){if(t.equals(e.math.Long.ONE)||t.equals(e.math.Long.NEG_ONE))return e.math.Long.MIN_VALUE;if(t.equals(e.math.Long.MIN_VALUE))return e.math.Long.ONE;if((i=this.shiftRight(1).div(t).shiftLeft(1)).equals(e.math.Long.ZERO))return t.isNegative()?e.math.Long.ONE:e.math.Long.NEG_ONE;var r=this.subtract(t.multiply(i));return i.add(r.div(t))}if(t.equals(e.math.Long.MIN_VALUE))return e.math.Long.ZERO;if(this.isNegative())return t.isNegative()?this.negate().div(t.negate()):this.negate().div(t).negate();if(t.isNegative())return this.div(t.negate()).negate();var n=e.math.Long.ZERO;for(r=this;r.greaterThanOrEqual(t);){for(var i=Math.max(1,Math.floor(r.toNumber()/t.toNumber())),o=Math.ceil(Math.log(i)/Math.LN2),s=o<=48?1:Math.pow(2,o-48),A=e.math.Long.fromNumber(i),a=A.multiply(t);a.isNegative()||a.greaterThan(r);)i-=s,a=(A=e.math.Long.fromNumber(i)).multiply(t);A.isZero()&&(A=e.math.Long.ONE),n=n.add(A),r=r.subtract(a)}return n},e.math.Long.prototype.modulo=function(e){return this.subtract(this.div(e).multiply(e))},e.math.Long.prototype.not=function(){return e.math.Long.fromBits(~this.low_,~this.high_)},e.math.Long.prototype.and=function(t){return e.math.Long.fromBits(this.low_&t.low_,this.high_&t.high_)},e.math.Long.prototype.or=function(t){return e.math.Long.fromBits(this.low_|t.low_,this.high_|t.high_)},e.math.Long.prototype.xor=function(t){return e.math.Long.fromBits(this.low_^t.low_,this.high_^t.high_)},e.math.Long.prototype.shiftLeft=function(t){if(0==(t&=63))return this;var r=this.low_;if(t<32){var n=this.high_;return e.math.Long.fromBits(r<>>32-t)}return e.math.Long.fromBits(0,r<>>t|r<<32-t,r>>t)}return e.math.Long.fromBits(r>>t-32,r>=0?0:-1)},e.math.Long.prototype.shiftRightUnsigned=function(t){if(0==(t&=63))return this;var r=this.high_;if(t<32){var n=this.low_;return e.math.Long.fromBits(n>>>t|r<<32-t,r>>>t)}return 32==t?e.math.Long.fromBits(r,0):e.math.Long.fromBits(r>>>t-32,0)};var t,r="Modern Browser";function n(e,t,r){null!=e&&("number"==typeof e?this.fromNumber(e,t,r):null==t&&"string"!=typeof e?this.fromString(e,256):this.fromString(e,t))}function i(){return new n(null)}"Microsoft Internet Explorer"==r?(n.prototype.am=function(e,t,r,n,i,o){for(var s=32767&t,A=t>>15;--o>=0;){var a=32767&this[e],c=this[e++]>>15,u=A*a+c*s;i=((a=s*a+((32767&u)<<15)+r[n]+(1073741823&i))>>>30)+(u>>>15)+A*c+(i>>>30),r[n++]=1073741823&a}return i},t=30):"Netscape"!=r?(n.prototype.am=function(e,t,r,n,i,o){for(;--o>=0;){var s=t*this[e++]+r[n]+i;i=Math.floor(s/67108864),r[n++]=67108863&s}return i},t=26):(n.prototype.am=function(e,t,r,n,i,o){for(var s=16383&t,A=t>>14;--o>=0;){var a=16383&this[e],c=this[e++]>>14,u=A*a+c*s;i=((a=s*a+((16383&u)<<14)+r[n]+i)>>28)+(u>>14)+A*c,r[n++]=268435455&a}return i},t=28),n.prototype.DB=t,n.prototype.DM=(1<>>16)&&(e=t,r+=16),0!=(t=e>>8)&&(e=t,r+=8),0!=(t=e>>4)&&(e=t,r+=4),0!=(t=e>>2)&&(e=t,r+=2),0!=(t=e>>1)&&(e=t,r+=1),r}function h(e){this.m=e}function g(e){this.m=e,this.mp=e.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<=0?e.mod(this.m):e},h.prototype.revert=function(e){return e},h.prototype.reduce=function(e){e.divRemTo(this.m,null,e)},h.prototype.mulTo=function(e,t,r){e.multiplyTo(t,r),this.reduce(r)},h.prototype.sqrTo=function(e,t){e.squareTo(t),this.reduce(t)},g.prototype.convert=function(e){var t=i();return e.abs().dlShiftTo(this.m.t,t),t.divRemTo(this.m,null,t),e.s<0&&t.compareTo(n.ZERO)>0&&this.m.subTo(t,t),t},g.prototype.revert=function(e){var t=i();return e.copyTo(t),this.reduce(t),t},g.prototype.reduce=function(e){for(;e.t<=this.mt2;)e[e.t++]=0;for(var t=0;t>15)*this.mpl&this.um)<<15)&e.DM;for(e[r=t+this.m.t]+=this.m.am(0,n,e,t,0,this.m.t);e[r]>=e.DV;)e[r]-=e.DV,e[++r]++}e.clamp(),e.drShiftTo(this.m.t,e),e.compareTo(this.m)>=0&&e.subTo(this.m,e)},g.prototype.mulTo=function(e,t,r){e.multiplyTo(t,r),this.reduce(r)},g.prototype.sqrTo=function(e,t){e.squareTo(t),this.reduce(t)},n.prototype.copyTo=function(e){for(var t=this.t-1;t>=0;--t)e[t]=this[t];e.t=this.t,e.s=this.s},n.prototype.fromInt=function(e){this.t=1,this.s=e<0?-1:0,e>0?this[0]=e:e<-1?this[0]=e+DV:this.t=0},n.prototype.fromString=function(e,t){var r;if(16==t)r=4;else if(8==t)r=3;else if(256==t)r=8;else if(2==t)r=1;else if(32==t)r=5;else{if(4!=t)return void this.fromRadix(e,t);r=2}this.t=0,this.s=0;for(var i=e.length,o=!1,s=0;--i>=0;){var A=8==r?255&e[i]:c(e,i);A<0?"-"==e.charAt(i)&&(o=!0):(o=!1,0==s?this[this.t++]=A:s+r>this.DB?(this[this.t-1]|=(A&(1<>this.DB-s):this[this.t-1]|=A<=this.DB&&(s-=this.DB))}8==r&&0!=(128&e[0])&&(this.s=-1,s>0&&(this[this.t-1]|=(1<0&&this[this.t-1]==e;)--this.t},n.prototype.dlShiftTo=function(e,t){var r;for(r=this.t-1;r>=0;--r)t[r+e]=this[r];for(r=e-1;r>=0;--r)t[r]=0;t.t=this.t+e,t.s=this.s},n.prototype.drShiftTo=function(e,t){for(var r=e;r=0;--r)t[r+s+1]=this[r]>>i|A,A=(this[r]&o)<=0;--r)t[r]=0;t[s]=A,t.t=this.t+s+1,t.s=this.s,t.clamp()},n.prototype.rShiftTo=function(e,t){t.s=this.s;var r=Math.floor(e/this.DB);if(r>=this.t)t.t=0;else{var n=e%this.DB,i=this.DB-n,o=(1<>n;for(var s=r+1;s>n;n>0&&(t[this.t-r-1]|=(this.s&o)<>=this.DB;if(e.t>=this.DB;n+=this.s}else{for(n+=this.s;r>=this.DB;n-=e.s}t.s=n<0?-1:0,n<-1?t[r++]=this.DV+n:n>0&&(t[r++]=n),t.t=r,t.clamp()},n.prototype.multiplyTo=function(e,t){var r=this.abs(),i=e.abs(),o=r.t;for(t.t=o+i.t;--o>=0;)t[o]=0;for(o=0;o=0;)e[r]=0;for(r=0;r=t.DV&&(e[r+t.t]-=t.DV,e[r+t.t+1]=1)}e.t>0&&(e[e.t-1]+=t.am(r,t[r],e,2*r,0,1)),e.s=0,e.clamp()},n.prototype.divRemTo=function(e,t,r){var o=e.abs();if(!(o.t<=0)){var s=this.abs();if(s.t0?(o.lShiftTo(u,A),s.lShiftTo(u,r)):(o.copyTo(A),s.copyTo(r));var h=A.t,g=A[h-1];if(0!=g){var f=g*(1<1?A[h-2]>>this.F2:0),p=this.FV/f,d=(1<=0&&(r[r.t++]=1,r.subTo(m,r)),n.ONE.dlShiftTo(h,m),m.subTo(A,A);A.t=0;){var y=r[--E]==g?this.DM:Math.floor(r[E]*p+(r[E-1]+C)*d);if((r[E]+=A.am(0,y,r,I,0,h))0&&r.rShiftTo(u,r),a<0&&n.ZERO.subTo(r,r)}}},n.prototype.invDigit=function(){if(this.t<1)return 0;var e=this[0];if(0==(1&e))return 0;var t=3&e;return(t=(t=(t=(t=t*(2-(15&e)*t)&15)*(2-(255&e)*t)&255)*(2-((65535&e)*t&65535))&65535)*(2-e*t%this.DV)%this.DV)>0?this.DV-t:-t},n.prototype.isEven=function(){return 0==(this.t>0?1&this[0]:this.s)},n.prototype.exp=function(e,t){if(e>4294967295||e<1)return n.ONE;var r=i(),o=i(),s=t.convert(this),A=l(e)-1;for(s.copyTo(r);--A>=0;)if(t.sqrTo(r,o),(e&1<0)t.mulTo(o,s,r);else{var a=r;r=o,o=a}return t.revert(r)},n.prototype.toString=function(e){if(this.s<0)return"-"+this.negate().toString(e);var t;if(16==e)t=4;else if(8==e)t=3;else if(2==e)t=1;else if(32==e)t=5;else{if(4!=e)return this.toRadix(e);t=2}var r,n=(1<0)for(A>A)>0&&(i=!0,o=a(r));s>=0;)A>(A+=this.DB-t)):(r=this[s]>>(A-=t)&n,A<=0&&(A+=this.DB,--s)),r>0&&(i=!0),i&&(o+=a(r));return i?o:"0"},n.prototype.negate=function(){var e=i();return n.ZERO.subTo(this,e),e},n.prototype.abs=function(){return this.s<0?this.negate():this},n.prototype.compareTo=function(e){var t=this.s-e.s;if(0!=t)return t;var r=this.t;if(0!=(t=r-e.t))return this.s<0?-t:t;for(;--r>=0;)if(0!=(t=this[r]-e[r]))return t;return 0},n.prototype.bitLength=function(){return this.t<=0?0:this.DB*(this.t-1)+l(this[this.t-1]^this.s&this.DM)},n.prototype.mod=function(e){var t=i();return this.abs().divRemTo(e,null,t),this.s<0&&t.compareTo(n.ZERO)>0&&e.subTo(t,t),t},n.prototype.modPowInt=function(e,t){var r;return r=e<256||t.isEven()?new h(t):new g(t),this.exp(e,r)},n.ZERO=u(0),n.ONE=u(1),n.prototype.fromRadix=function(e,t){this.fromInt(0),null==t&&(t=10);for(var r=this.chunkSize(t),i=Math.pow(t,r),o=!1,s=0,A=0,a=0;a=r&&(this.dMultiply(i),this.dAddOffset(A,0),s=0,A=0))}s>0&&(this.dMultiply(Math.pow(t,s)),this.dAddOffset(A,0)),o&&n.ZERO.subTo(this,this)},n.prototype.chunkSize=function(e){return Math.floor(Math.LN2*this.DB/Math.log(e))},n.prototype.signum=function(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1},n.prototype.dMultiply=function(e){this[this.t]=this.am(0,e-1,this,0,0,this.t),++this.t,this.clamp()},n.prototype.dAddOffset=function(e,t){if(0!=e){for(;this.t<=t;)this[this.t++]=0;for(this[t]+=e;this[t]>=this.DV;)this[t]-=this.DV,++t>=this.t&&(this[this.t++]=0),++this[t]}},n.prototype.toRadix=function(e){if(null==e&&(e=10),0==this.signum()||e<2||e>36)return"0";var t=this.chunkSize(e),r=Math.pow(e,t),n=u(r),o=i(),s=i(),A="";for(this.divRemTo(n,o,s);o.signum()>0;)A=(r+s.intValue()).toString(e).substr(1)+A,o.divRemTo(n,o,s);return s.intValue().toString(e)+A},n.prototype.intValue=function(){if(this.s<0){if(1==this.t)return this[0]-this.DV;if(0==this.t)return-1}else{if(1==this.t)return this[0];if(0==this.t)return 0}return(this[1]&(1<<32-this.DB)-1)<>=this.DB;if(e.t>=this.DB;n+=this.s}else{for(n+=this.s;r>=this.DB;n+=e.s}t.s=n<0?-1:0,n>0?t[r++]=n:n<-1&&(t[r++]=this.DV+n),t.t=r,t.clamp()};var f={abs:function(t,r){var n,i=new e.math.Long(t,r);n=i.isNegative()?i.negate():i,HEAP32[tempDoublePtr>>2]=n.low_,HEAP32[tempDoublePtr+4>>2]=n.high_},ensureTemps:function(){f.ensuredTemps||(f.ensuredTemps=!0,f.two32=new n,f.two32.fromString("4294967296",10),f.two64=new n,f.two64.fromString("18446744073709551616",10),f.temp1=new n,f.temp2=new n)},lh2bignum:function(e,t){var r=new n;r.fromString(t.toString(),10);var i=new n;r.multiplyTo(f.two32,i);var o=new n;o.fromString(e.toString(),10);var s=new n;return o.addTo(i,s),s},stringify:function(t,r,i){var o=new e.math.Long(t,r).toString();if(i&&"-"==o[0]){f.ensureTemps();var s=new n;s.fromString(o,10),o=new n,f.two64.addTo(s,o),o=o.toString(10)}return o},fromString:function(t,r,i,o,s){f.ensureTemps();var A=new n;A.fromString(t,r);var a=new n;a.fromString(i,10);var c=new n;if(c.fromString(o,10),s&&A.compareTo(n.ZERO)<0){var u=new n;A.addTo(f.two64,u),A=u}var l=!1;A.compareTo(a)<0?(A=a,l=!0):A.compareTo(c)>0&&(A=c,l=!0);var h=e.math.Long.fromString(A.toString());if(HEAP32[tempDoublePtr>>2]=h.low_,HEAP32[tempDoublePtr+4>>2]=h.high_,l)throw"range error"}};return f}(),initialStackTop;if(memoryInitializer)if("function"==typeof Module.locateFile?memoryInitializer=Module.locateFile(memoryInitializer):Module.memoryInitializerPrefixURL&&(memoryInitializer=Module.memoryInitializerPrefixURL+memoryInitializer),ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module.readBinary(memoryInitializer);HEAPU8.set(data,STATIC_BASE)}else addRunDependency("memory initializer"),Browser.asyncLoad(memoryInitializer,(function(e){HEAPU8.set(e,STATIC_BASE),removeRunDependency("memory initializer")}),(function(e){throw"could not load memory initializer "+memoryInitializer}));function ExitStatus(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var preloadStartTime=null,calledMain=!1;function run(e){function t(){Module.calledRun||(Module.calledRun=!0,ABORT||(ensureInitRuntime(),preMain(),ENVIRONMENT_IS_WEB&&null!==preloadStartTime&&Module.printErr("pre-main prep time: "+(Date.now()-preloadStartTime)+" ms"),Module._main&&shouldRunNow&&Module.callMain(e),postRun()))}e=e||Module.arguments,null===preloadStartTime&&(preloadStartTime=Date.now()),runDependencies>0||(preRun(),runDependencies>0||Module.calledRun||(Module.setStatus?(Module.setStatus("Running..."),setTimeout((function(){setTimeout((function(){Module.setStatus("")}),1),t()}),1)):t()))}function exit(e){if(!Module.noExitRuntime)throw ABORT=!0,EXITSTATUS=e,STACKTOP=initialStackTop,exitRuntime(),ENVIRONMENT_IS_NODE?(process.stdout.once("drain",(function(){process.exit(e)})),console.log(" "),setTimeout((function(){process.exit(e)}),500)):ENVIRONMENT_IS_SHELL&&"function"==typeof quit&&quit(e),new ExitStatus(e)}function abort(e){e&&(Module.print(e),Module.printErr(e)),ABORT=!0,EXITSTATUS=1;throw"abort() at "+stackTrace()+"\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information."}if(dependenciesFulfilled=function e(){!Module.calledRun&&shouldRunNow&&run(),Module.calledRun||(dependenciesFulfilled=e)},Module.callMain=Module.callMain=function(e){assert(0==runDependencies,"cannot call main when async dependencies remain! (listen on __ATMAIN__)"),assert(0==__ATPRERUN__.length,"cannot call main when preRun functions remain to be called"),e=e||[],ensureInitRuntime();var t=e.length+1;function r(){for(var e=0;e<3;e++)n.push(0)}var n=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];r();for(var i=0;i0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run();var origMalloc=Module._malloc,origFree=Module._free,MEMSTATS={totalMemory:Module.HEAPU8.length,heapUsed:0},MEMSTATS_DATA={pointerToSizeMap:{},getSizeOfPointer:function(e){return MEMSTATS_DATA.pointerToSizeMap[e]}};Module.MEMSTATS=MEMSTATS,Module.MEMSTATS_DATA=MEMSTATS_DATA;var hookedMalloc=function(e){var t=origMalloc(e);return t?(MEMSTATS.heapUsed+=e,MEMSTATS_DATA.pointerToSizeMap[t]=e,t):0},hookedFree=function(e){return e&&(MEMSTATS.heapUsed-=MEMSTATS_DATA.getSizeOfPointer(e)||0,delete MEMSTATS_DATA.pointerToSizeMap[e]),origFree(e)},setInnerMalloc,setInnerFree;return Module._malloc=hookedMalloc,Module._free=hookedFree,_malloc=hookedMalloc,_free=hookedFree,setInnerMalloc&&(setInnerMalloc(hookedMalloc),setInnerFree(hookedFree)),module.exports},module.exports=C_MINISAT},73789:(e,t,r)=>{var n,i=r(98312),o=r(5817);(n=function(){var e=this._C=i();this._native={getStackPointer:function(){return e.Runtime.stackSave()},setStackPointer:function(t){e.Runtime.stackRestore(t)},allocateBytes:function(t){return e.allocate(t,"i8",e.ALLOC_STACK)},pushString:function(t){return this.allocateBytes(e.intArrayFromString(t))},savingStack:function(t){var r=this.getStackPointer();try{return t(this,e)}finally{this.setStackPointer(r)}}},e._createTheSolver(),this._clauses=[]}).prototype.ensureVar=function(e){this._C._ensureVar(e)},n.prototype.addClause=function(e){return this._clauses.push(e),this._native.savingStack((function(t,r){var n=r.allocate(4*(e.length+1),"i32",r.ALLOC_STACK);return o.each(e,(function(e,t){r.setValue(n+4*t,e,"i32")})),r.setValue(n+4*e.length,0,"i32"),!!r._addClause(n)}))},n.prototype.solve=function(){return!!this._C._solve()},n.prototype.solveAssuming=function(e){return!!this._C._solveAssuming(e)},n.prototype.getSolution=function(){for(var e=[null],t=this._C,r=t._getNumVars(),n=t._getSolution(),i=0;i>>1,A=1&o?-1:1;n[i]=s*A}return n},e.exports=n},55737:e=>{"use strict";e.exports=e=>{const t={};for(const[r,n]of Object.entries(e))t[r.toLowerCase()]=n;return t}},46227:(e,t,r)=>{"use strict";const n=r(35747),i=r(85622),{promisify:o}=r(31669),s=r(95584).satisfies(process.version,">=10.12.0"),A=e=>{if("win32"===process.platform){if(/[<>:"|?*]/.test(e.replace(i.parse(e).root,""))){const t=new Error("Path contains invalid characters: "+e);throw t.code="EINVAL",t}}},a=e=>({...{mode:511,fs:n},...e}),c=e=>{const t=new Error(`operation not permitted, mkdir '${e}'`);return t.code="EPERM",t.errno=-4048,t.path=e,t.syscall="mkdir",t};e.exports=async(e,t)=>{A(e),t=a(t);const r=o(t.fs.mkdir),u=o(t.fs.stat);if(s&&t.fs.mkdir===n.mkdir){const n=i.resolve(e);return await r(n,{mode:t.mode,recursive:!0}),n}const l=async e=>{try{return await r(e,t.mode),e}catch(t){if("EPERM"===t.code)throw t;if("ENOENT"===t.code){if(i.dirname(e)===e)throw c(e);if(t.message.includes("null bytes"))throw t;return await l(i.dirname(e)),l(e)}try{if(!(await u(e)).isDirectory())throw new Error("The path is not a directory")}catch(e){throw t}return e}};return l(i.resolve(e))},e.exports.sync=(e,t)=>{if(A(e),t=a(t),s&&t.fs.mkdirSync===n.mkdirSync){const r=i.resolve(e);return n.mkdirSync(r,{mode:t.mode,recursive:!0}),r}const r=e=>{try{t.fs.mkdirSync(e,t.mode)}catch(n){if("EPERM"===n.code)throw n;if("ENOENT"===n.code){if(i.dirname(e)===e)throw c(e);if(n.message.includes("null bytes"))throw n;return r(i.dirname(e)),r(e)}try{if(!t.fs.statSync(e).isDirectory())throw new Error("The path is not a directory")}catch(e){throw n}}return e};return r(i.resolve(e))}},55598:(e,t,r)=>{"use strict";const n=r(92413).PassThrough,i=Array.prototype.slice;function o(e,t){if(Array.isArray(e))for(let r=0,n=e.length;r0||(t=!1,u())}function o(e){function t(){e.removeListener("merge2UnpipeEnd",t),e.removeListener("end",t),i()}if(e._readableState.endEmitted)return i();e.on("merge2UnpipeEnd",t),e.on("end",t),e.pipe(a,{end:!1}),e.resume()}for(let e=0;e{"use strict";const n=r(31669),i=r(12235),o=r(54722),s=r(3598),A=e=>"string"==typeof e&&(""===e||"./"===e),a=(e,t,r)=>{t=[].concat(t),e=[].concat(e);let n=new Set,i=new Set,s=new Set,A=0,a=e=>{s.add(e.output),r&&r.onResult&&r.onResult(e)};for(let s=0;s!n.has(e));if(r&&0===c.length){if(!0===r.failglob)throw new Error(`No matches found for "${t.join(", ")}"`);if(!0===r.nonull||!0===r.nullglob)return r.unescape?t.map(e=>e.replace(/\\/g,"")):t}return c};a.match=a,a.matcher=(e,t)=>o(e,t),a.any=a.isMatch=(e,t,r)=>o(t,r)(e),a.not=(e,t,r={})=>{t=[].concat(t).map(String);let n=new Set,i=[],o=a(e,t,{...r,onResult:e=>{r.onResult&&r.onResult(e),i.push(e.output)}});for(let e of i)o.includes(e)||n.add(e);return[...n]},a.contains=(e,t,r)=>{if("string"!=typeof e)throw new TypeError(`Expected a string: "${n.inspect(e)}"`);if(Array.isArray(t))return t.some(t=>a.contains(e,t,r));if("string"==typeof t){if(A(e)||A(t))return!1;if(e.includes(t)||e.startsWith("./")&&e.slice(2).includes(t))return!0}return a.isMatch(e,t,{...r,contains:!0})},a.matchKeys=(e,t,r)=>{if(!s.isObject(e))throw new TypeError("Expected the first argument to be an object");let n=a(Object.keys(e),t,r),i={};for(let t of n)i[t]=e[t];return i},a.some=(e,t,r)=>{let n=[].concat(e);for(let e of[].concat(t)){let t=o(String(e),r);if(n.some(e=>t(e)))return!0}return!1},a.every=(e,t,r)=>{let n=[].concat(e);for(let e of[].concat(t)){let t=o(String(e),r);if(!n.every(e=>t(e)))return!1}return!0},a.all=(e,t,r)=>{if("string"!=typeof e)throw new TypeError(`Expected a string: "${n.inspect(e)}"`);return[].concat(t).every(t=>o(t,r)(e))},a.capture=(e,t,r)=>{let n=s.isWindows(r),i=o.makeRe(String(e),{...r,capture:!0}).exec(n?s.toPosixSlashes(t):t);if(i)return i.slice(1).map(e=>void 0===e?"":e)},a.makeRe=(...e)=>o.makeRe(...e),a.scan=(...e)=>o.scan(...e),a.parse=(e,t)=>{let r=[];for(let n of[].concat(e||[]))for(let e of i(String(n),t))r.push(o.parse(e,t));return r},a.braces=(e,t)=>{if("string"!=typeof e)throw new TypeError("Expected a string");return t&&!0===t.nobrace||!/\{.*\}/.test(e)?[e]:i(e,t)},a.braceExpand=(e,t)=>{if("string"!=typeof e)throw new TypeError("Expected a string");return a.braces(e,{...t,expand:!0})},e.exports=a},81573:e=>{"use strict";const t=(e,t)=>{for(const r of Reflect.ownKeys(t))Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r));return e};e.exports=t,e.exports.default=t},65007:e=>{"use strict";const t=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];e.exports=(e,r)=>{const n=new Set(Object.keys(e).concat(t));for(const t of n)t in r||(r[t]="function"==typeof e[t]?e[t].bind(e):e[t])}},60102:e=>{"use strict";const t=["aborted","complete","destroy","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];e.exports=(e,r)=>{const n=new Set(Object.keys(e).concat(t));for(const t of n)t in r||(r[t]="function"==typeof e[t]?e[t].bind(e):e[t])}},52670:(e,t,r)=>{e.exports=u,u.Minimatch=l;var n={sep:"/"};try{n=r(85622)}catch(e){}var i=u.GLOBSTAR=l.GLOBSTAR={},o=r(1289),s={"!":{open:"(?:(?!(?:",close:"))[^/]*?)"},"?":{open:"(?:",close:")?"},"+":{open:"(?:",close:")+"},"*":{open:"(?:",close:")*"},"@":{open:"(?:",close:")"}},A="().*{}+?[]^$\\!".split("").reduce((function(e,t){return e[t]=!0,e}),{});var a=/\/+/;function c(e,t){e=e||{},t=t||{};var r={};return Object.keys(t).forEach((function(e){r[e]=t[e]})),Object.keys(e).forEach((function(t){r[t]=e[t]})),r}function u(e,t,r){if("string"!=typeof t)throw new TypeError("glob pattern string required");return r||(r={}),!(!r.nocomment&&"#"===t.charAt(0))&&(""===t.trim()?""===e:new l(t,r).match(e))}function l(e,t){if(!(this instanceof l))return new l(e,t);if("string"!=typeof e)throw new TypeError("glob pattern string required");t||(t={}),e=e.trim(),"/"!==n.sep&&(e=e.split(n.sep).join("/")),this.options=t,this.set=[],this.pattern=e,this.regexp=null,this.negate=!1,this.comment=!1,this.empty=!1,this.make()}function h(e,t){if(t||(t=this instanceof l?this.options:{}),void 0===(e=void 0===e?this.pattern:e))throw new TypeError("undefined pattern");return t.nobrace||!e.match(/\{.*\}/)?[e]:o(e)}u.filter=function(e,t){return t=t||{},function(r,n,i){return u(r,e,t)}},u.defaults=function(e){if(!e||!Object.keys(e).length)return u;var t=u,r=function(r,n,i){return t.minimatch(r,n,c(e,i))};return r.Minimatch=function(r,n){return new t.Minimatch(r,c(e,n))},r},l.defaults=function(e){return e&&Object.keys(e).length?u.defaults(e).Minimatch:l},l.prototype.debug=function(){},l.prototype.make=function(){if(this._made)return;var e=this.pattern,t=this.options;if(!t.nocomment&&"#"===e.charAt(0))return void(this.comment=!0);if(!e)return void(this.empty=!0);this.parseNegate();var r=this.globSet=this.braceExpand();t.debug&&(this.debug=console.error);this.debug(this.pattern,r),r=this.globParts=r.map((function(e){return e.split(a)})),this.debug(this.pattern,r),r=r.map((function(e,t,r){return e.map(this.parse,this)}),this),this.debug(this.pattern,r),r=r.filter((function(e){return-1===e.indexOf(!1)})),this.debug(this.pattern,r),this.set=r},l.prototype.parseNegate=function(){var e=this.pattern,t=!1,r=this.options,n=0;if(r.nonegate)return;for(var i=0,o=e.length;i65536)throw new TypeError("pattern is too long");var r=this.options;if(!r.noglobstar&&"**"===e)return i;if(""===e)return"";var n,o="",a=!!r.nocase,c=!1,u=[],l=[],h=!1,f=-1,p=-1,d="."===e.charAt(0)?"":r.dot?"(?!(?:^|\\/)\\.{1,2}(?:$|\\/))":"(?!\\.)",C=this;function E(){if(n){switch(n){case"*":o+="[^/]*?",a=!0;break;case"?":o+="[^/]",a=!0;break;default:o+="\\"+n}C.debug("clearStateChar %j %j",n,o),n=!1}}for(var I,m=0,y=e.length;m-1;S--){var k=l[S],x=o.slice(0,k.reStart),F=o.slice(k.reStart,k.reEnd-8),M=o.slice(k.reEnd-8,k.reEnd),N=o.slice(k.reEnd);M+=N;var R=x.split("(").length-1,K=N;for(m=0;m=0&&!(i=e[o]);o--);for(o=0;o>> no match, partial?",e,h,t,g),h!==A))}if("string"==typeof u?(c=n.nocase?l.toLowerCase()===u.toLowerCase():l===u,this.debug("string match",u,l,c)):(c=l.match(u),this.debug("pattern match",u,l,c)),!c)return!1}if(o===A&&s===a)return!0;if(o===A)return r;if(s===a)return o===A-1&&""===e[o];throw new Error("wtf?")}},44380:(e,t,r)=>{"use strict";const n=r(28614),i=r(80800),o=r(24304).StringDecoder,s=Symbol("EOF"),A=Symbol("maybeEmitEnd"),a=Symbol("emittedEnd"),c=Symbol("emittingEnd"),u=Symbol("closed"),l=Symbol("read"),h=Symbol("flush"),g=Symbol("flushChunk"),f=Symbol("encoding"),p=Symbol("decoder"),d=Symbol("flowing"),C=Symbol("paused"),E=Symbol("resume"),I=Symbol("bufferLength"),m=Symbol("bufferPush"),y=Symbol("bufferShift"),w=Symbol("objectMode"),B=Symbol("destroyed"),Q="1"!==global._MP_NO_ITERATOR_SYMBOLS_,v=Q&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),D=Q&&Symbol.iterator||Symbol("iterator not implemented"),b=Buffer.alloc?Buffer:r(13499).Buffer,S=e=>"end"===e||"finish"===e||"prefinish"===e;e.exports=class e extends n{constructor(e){super(),this[d]=!1,this[C]=!1,this.pipes=new i,this.buffer=new i,this[w]=e&&e.objectMode||!1,this[w]?this[f]=null:this[f]=e&&e.encoding||null,"buffer"===this[f]&&(this[f]=null),this[p]=this[f]?new o(this[f]):null,this[s]=!1,this[a]=!1,this[c]=!1,this[u]=!1,this.writable=!0,this.readable=!0,this[I]=0,this[B]=!1}get bufferLength(){return this[I]}get encoding(){return this[f]}set encoding(e){if(this[w])throw new Error("cannot set encoding in objectMode");if(this[f]&&e!==this[f]&&(this[p]&&this[p].lastNeed||this[I]))throw new Error("cannot change encoding");this[f]!==e&&(this[p]=e?new o(e):null,this.buffer.length&&(this.buffer=this.buffer.map(e=>this[p].write(e)))),this[f]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[w]}set objectMode(e){this[w]=this[w]||!!e}write(e,t,r){if(this[s])throw new Error("write after end");if(this[B])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;var n;if("function"==typeof t&&(r=t,t="utf8"),t||(t="utf8"),this[w]||b.isBuffer(e)||(n=e,!b.isBuffer(n)&&ArrayBuffer.isView(n)?e=b.from(e.buffer,e.byteOffset,e.byteLength):(e=>e instanceof ArrayBuffer||"object"==typeof e&&e.constructor&&"ArrayBuffer"===e.constructor.name&&e.byteLength>=0)(e)?e=b.from(e):"string"!=typeof e&&(this.objectMode=!0)),!this.objectMode&&!e.length){const e=this.flowing;return 0!==this[I]&&this.emit("readable"),r&&r(),e}"string"!=typeof e||this[w]||t===this[f]&&!this[p].lastNeed||(e=b.from(e,t)),b.isBuffer(e)&&this[f]&&(e=this[p].write(e));try{return this.flowing?(this.emit("data",e),this.flowing):(this[m](e),!1)}finally{0!==this[I]&&this.emit("readable"),r&&r()}}read(e){if(this[B])return null;try{return 0===this[I]||0===e||e>this[I]?null:(this[w]&&(e=null),this.buffer.length>1&&!this[w]&&(this.encoding?this.buffer=new i([Array.from(this.buffer).join("")]):this.buffer=new i([b.concat(Array.from(this.buffer),this[I])])),this[l](e||null,this.buffer.head.value))}finally{this[A]()}}[l](e,t){return e===t.length||null===e?this[y]():(this.buffer.head.value=t.slice(e),t=t.slice(0,e),this[I]-=e),this.emit("data",t),this.buffer.length||this[s]||this.emit("drain"),t}end(e,t,r){return"function"==typeof e&&(r=e,e=null),"function"==typeof t&&(r=t,t="utf8"),e&&this.write(e,t),r&&this.once("end",r),this[s]=!0,this.writable=!1,!this.flowing&&this[C]||this[A](),this}[E](){this[B]||(this[C]=!1,this[d]=!0,this.emit("resume"),this.buffer.length?this[h]():this[s]?this[A]():this.emit("drain"))}resume(){return this[E]()}pause(){this[d]=!1,this[C]=!0}get destroyed(){return this[B]}get flowing(){return this[d]}get paused(){return this[C]}[m](e){return this[w]?this[I]+=1:this[I]+=e.length,this.buffer.push(e)}[y](){return this.buffer.length&&(this[w]?this[I]-=1:this[I]-=this.buffer.head.value.length),this.buffer.shift()}[h](){do{}while(this[g](this[y]()));this.buffer.length||this[s]||this.emit("drain")}[g](e){return!!e&&(this.emit("data",e),this.flowing)}pipe(e,t){if(this[B])return;const r=this[a];t=t||{},e===process.stdout||e===process.stderr?t.end=!1:t.end=!1!==t.end;const n={dest:e,opts:t,ondrain:e=>this[E]()};return this.pipes.push(n),e.on("drain",n.ondrain),this[E](),r&&n.opts.end&&n.dest.end(),e}addListener(e,t){return this.on(e,t)}on(e,t){try{return super.on(e,t)}finally{"data"!==e||this.pipes.length||this.flowing?S(e)&&this[a]&&(super.emit(e),this.removeAllListeners(e)):this[E]()}}get emittedEnd(){return this[a]}[A](){this[c]||this[a]||this[B]||0!==this.buffer.length||!this[s]||(this[c]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[u]&&this.emit("close"),this[c]=!1)}emit(e,t){if("error"!==e&&"close"!==e&&e!==B&&this[B])return;if("data"===e){if(!t)return;this.pipes.length&&this.pipes.forEach(e=>!1===e.dest.write(t)&&this.pause())}else if("end"===e){if(!0===this[a])return;this[a]=!0,this.readable=!1,this[p]&&(t=this[p].end())&&(this.pipes.forEach(e=>e.dest.write(t)),super.emit("data",t)),this.pipes.forEach(e=>{e.dest.removeListener("drain",e.ondrain),e.opts.end&&e.dest.end()})}else if("close"===e&&(this[u]=!0,!this[a]&&!this[B]))return;const r=new Array(arguments.length);if(r[0]=e,r[1]=t,arguments.length>2)for(let e=2;e{e.push(t),e.dataLength+=t.length}),this.promise().then(()=>e)}concat(){return this[w]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[w]?Promise.reject(new Error("cannot concat in objectMode")):this[f]?e.join(""):b.concat(e,e.dataLength))}promise(){return new Promise((e,t)=>{this.on(B,()=>t(new Error("stream destroyed"))),this.on("end",()=>e()),this.on("error",e=>t(e))})}[v](){return{next:()=>{const e=this.read();if(null!==e)return Promise.resolve({done:!1,value:e});if(this[s])return Promise.resolve({done:!0});let t=null,r=null;const n=e=>{this.removeListener("data",i),this.removeListener("end",o),r(e)},i=e=>{this.removeListener("error",n),this.removeListener("end",o),this.pause(),t({value:e,done:!!this[s]})},o=()=>{this.removeListener("error",n),this.removeListener("data",i),t({done:!0})},A=()=>n(new Error("stream destroyed"));return new Promise((e,s)=>{r=s,t=e,this.once(B,A),this.once("error",n),this.once("end",o),this.once("data",i)})}}}[D](){return{next:()=>{const e=this.read();return{value:e,done:null===e}}}}destroy(e){return this[B]?(e?this.emit("error",e):this.emit(B),this):(this[B]=!0,this.buffer=new i,this[I]=0,"function"!=typeof this.close||this[u]||this.close(),e?this.emit("error",e):this.emit(B),this)}static isStream(t){return!!t&&(t instanceof e||t instanceof n&&("function"==typeof t.pipe||"function"==typeof t.write&&"function"==typeof t.end))}}},90051:e=>{e.exports=Object.freeze({Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,ZLIB_VERNUM:4736,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1})},20671:(e,t,r)=>{"use strict";const n=r(42357),i=r(64293).Buffer,o=r(78761),s=t.constants=r(90051),A=r(44380),a=i.concat;class c extends Error{constructor(e,t){super("zlib: "+e),this.errno=t,this.code=u.get(t)}get name(){return"ZlibError"}}const u=new Map([[s.Z_OK,"Z_OK"],[s.Z_STREAM_END,"Z_STREAM_END"],[s.Z_NEED_DICT,"Z_NEED_DICT"],[s.Z_ERRNO,"Z_ERRNO"],[s.Z_STREAM_ERROR,"Z_STREAM_ERROR"],[s.Z_DATA_ERROR,"Z_DATA_ERROR"],[s.Z_MEM_ERROR,"Z_MEM_ERROR"],[s.Z_BUF_ERROR,"Z_BUF_ERROR"],[s.Z_VERSION_ERROR,"Z_VERSION_ERROR"]]),l=new Set([s.Z_NO_FLUSH,s.Z_PARTIAL_FLUSH,s.Z_SYNC_FLUSH,s.Z_FULL_FLUSH,s.Z_FINISH,s.Z_BLOCK]),h=new Set([s.Z_FILTERED,s.Z_HUFFMAN_ONLY,s.Z_RLE,s.Z_FIXED,s.Z_DEFAULT_STRATEGY]),g=Symbol("opts"),f=Symbol("flushFlag"),p=Symbol("finishFlush"),d=Symbol("handle"),C=Symbol("onError"),E=Symbol("level"),I=Symbol("strategy"),m=Symbol("ended");class y extends A{constructor(e,t){if(super(e),this[m]=!1,this[g]=e=e||{},e.flush&&!l.has(e.flush))throw new TypeError("Invalid flush flag: "+e.flush);if(e.finishFlush&&!l.has(e.finishFlush))throw new TypeError("Invalid flush flag: "+e.finishFlush);if(this[f]=e.flush||s.Z_NO_FLUSH,this[p]=void 0!==e.finishFlush?e.finishFlush:s.Z_FINISH,e.chunkSize&&e.chunkSizes.Z_MAX_WINDOWBITS))throw new RangeError("Invalid windowBits: "+e.windowBits);if(e.level&&(e.levels.Z_MAX_LEVEL))throw new RangeError("Invalid compression level: "+e.level);if(e.memLevel&&(e.memLevels.Z_MAX_MEMLEVEL))throw new RangeError("Invalid memLevel: "+e.memLevel);if(e.strategy&&!h.has(e.strategy))throw new TypeError("Invalid strategy: "+e.strategy);if(e.dictionary&&!(e.dictionary instanceof i))throw new TypeError("Invalid dictionary: it should be a Buffer instance");this[d]=new o[t](e),this[C]=e=>{this.close();const t=new c(e.message,e.errno);this.emit("error",t)},this[d].on("error",this[C]);const r="number"==typeof e.level?e.level:s.Z_DEFAULT_COMPRESSION;var n="number"==typeof e.strategy?e.strategy:s.Z_DEFAULT_STRATEGY;this[E]=r,this[I]=n,this.once("end",this.close)}close(){this[d]&&(this[d].close(),this[d]=null,this.emit("close"))}params(e,t){if(!this[d])throw new Error("cannot switch params when binding is closed");if(!this[d].params)throw new Error("not supported in this implementation");if(es.Z_MAX_LEVEL)throw new RangeError("Invalid compression level: "+e);if(!h.has(t))throw new TypeError("Invalid strategy: "+t);if(this[E]!==e||this[I]!==t){this.flush(s.Z_SYNC_FLUSH),n(this[d],"zlib binding closed");const r=this[d].flush;this[d].flush=(e,t)=>{this[d].flush=r,this.flush(e),t()},this[d].params(e,t),this[d]&&(this[E]=e,this[I]=t)}}reset(){return n(this[d],"zlib binding closed"),this[d].reset()}flush(e){if(void 0===e&&(e=s.Z_FULL_FLUSH),this.ended)return;const t=this[f];this[f]=e,this.write(i.alloc(0)),this[f]=t}end(e,t,r){return e&&this.write(e,t),this.flush(this[p]),this[m]=!0,super.end(null,null,r)}get ended(){return this[m]}write(e,t,r){"function"==typeof t&&(r=t,t="utf8"),"string"==typeof e&&(e=i.from(e,t)),n(this[d],"zlib binding closed");const o=this[d]._handle,s=o.close;o.close=()=>{};const A=this[d].close;let c,u;this[d].close=()=>{},i.concat=e=>e;try{c=this[d]._processChunk(e,this[f])}catch(e){this[C](e)}finally{i.concat=a,this[d]&&(this[d]._handle=o,o.close=s,this[d].close=A,this[d].removeAllListeners("error"))}if(c)if(Array.isArray(c)&&c.length>0){u=super.write(i.from(c[0]));for(let e=1;e{var n=r(85622),i=r(35747),o=parseInt("0777",8);function s(e,t,r,A){"function"==typeof t?(r=t,t={}):t&&"object"==typeof t||(t={mode:t});var a=t.mode,c=t.fs||i;void 0===a&&(a=o&~process.umask()),A||(A=null);var u=r||function(){};e=n.resolve(e),c.mkdir(e,a,(function(r){if(!r)return u(null,A=A||e);switch(r.code){case"ENOENT":s(n.dirname(e),t,(function(r,n){r?u(r,n):s(e,t,u,n)}));break;default:c.stat(e,(function(e,t){e||!t.isDirectory()?u(r,A):u(null,A)}))}}))}e.exports=s.mkdirp=s.mkdirP=s,s.sync=function e(t,r,s){r&&"object"==typeof r||(r={mode:r});var A=r.mode,a=r.fs||i;void 0===A&&(A=o&~process.umask()),s||(s=null),t=n.resolve(t);try{a.mkdirSync(t,A),s=s||t}catch(i){switch(i.code){case"ENOENT":s=e(n.dirname(t),r,s),e(t,r,s);break;default:var c;try{c=a.statSync(t)}catch(e){throw i}if(!c.isDirectory())throw i}}return s}},75319:(e,t,r)=>{var n=r(92413);function i(e){n.apply(this),e=e||{},this.writable=this.readable=!0,this.muted=!1,this.on("pipe",this._onpipe),this.replace=e.replace,this._prompt=e.prompt||null,this._hadControl=!1}function o(e){return function(){var t=this._dest,r=this._src;t&&t[e]&&t[e].apply(t,arguments),r&&r[e]&&r[e].apply(r,arguments)}}e.exports=i,i.prototype=Object.create(n.prototype),Object.defineProperty(i.prototype,"constructor",{value:i,enumerable:!1}),i.prototype.mute=function(){this.muted=!0},i.prototype.unmute=function(){this.muted=!1},Object.defineProperty(i.prototype,"_onpipe",{value:function(e){this._src=e},enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(i.prototype,"isTTY",{get:function(){return this._dest?this._dest.isTTY:!!this._src&&this._src.isTTY},set:function(e){Object.defineProperty(this,"isTTY",{value:e,enumerable:!0,writable:!0,configurable:!0})},enumerable:!0,configurable:!0}),Object.defineProperty(i.prototype,"rows",{get:function(){return this._dest?this._dest.rows:this._src?this._src.rows:void 0},enumerable:!0,configurable:!0}),Object.defineProperty(i.prototype,"columns",{get:function(){return this._dest?this._dest.columns:this._src?this._src.columns:void 0},enumerable:!0,configurable:!0}),i.prototype.pipe=function(e,t){return this._dest=e,n.prototype.pipe.call(this,e,t)},i.prototype.pause=function(){if(this._src)return this._src.pause()},i.prototype.resume=function(){if(this._src)return this._src.resume()},i.prototype.write=function(e){if(this.muted){if(!this.replace)return!0;if(e.match(/^\u001b/))return 0===e.indexOf(this._prompt)&&(e=(e=e.substr(this._prompt.length)).replace(/./g,this.replace),e=this._prompt+e),this._hadControl=!0,this.emit("data",e);this._prompt&&this._hadControl&&0===e.indexOf(this._prompt)&&(this._hadControl=!1,this.emit("data",this._prompt),e=e.substr(this._prompt.length)),e=e.toString().replace(/./g,this.replace)}this.emit("data",e)},i.prototype.end=function(e){this.muted&&(e=e&&this.replace?e.toString().replace(/./g,this.replace):null),e&&this.emit("data",e),this.emit("end")},i.prototype.destroy=o("destroy"),i.prototype.destroySoon=o("destroySoon"),i.prototype.close=o("close")},19793:(e,t,r)=>{"use strict";const n="undefined"==typeof URL?r(78835).URL:URL,i=(e,t)=>t.some(t=>t instanceof RegExp?t.test(e):t===e),o=(e,t)=>{if(t={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...t},Reflect.has(t,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(t,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(t,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(e=e.trim(),/^data:/i.test(e))return((e,{stripHash:t})=>{const r=e.match(/^data:(.*?),(.*?)(?:#(.*))?$/);if(!r)throw new Error("Invalid URL: "+e);const n=r[1].split(";"),i=r[2],o=t?"":r[3];let s=!1;"base64"===n[n.length-1]&&(n.pop(),s=!0);const A=(n.shift()||"").toLowerCase(),a=[...n.map(e=>{let[t,r=""]=e.split("=").map(e=>e.trim());return"charset"===t&&(r=r.toLowerCase(),"us-ascii"===r)?"":`${t}${r?"="+r:""}`}).filter(Boolean)];return s&&a.push("base64"),(0!==a.length||A&&"text/plain"!==A)&&a.unshift(A),`data:${a.join(";")},${s?i.trim():i}${o?"#"+o:""}`})(e,t);const r=e.startsWith("//");!r&&/^\.*\//.test(e)||(e=e.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,t.defaultProtocol));const o=new n(e);if(t.forceHttp&&t.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(t.forceHttp&&"https:"===o.protocol&&(o.protocol="http:"),t.forceHttps&&"http:"===o.protocol&&(o.protocol="https:"),t.stripAuthentication&&(o.username="",o.password=""),t.stripHash&&(o.hash=""),o.pathname&&(o.pathname=o.pathname.replace(/((?!:).|^)\/{2,}/g,(e,t)=>/^(?!\/)/g.test(t)?t+"/":"/")),o.pathname&&(o.pathname=decodeURI(o.pathname)),!0===t.removeDirectoryIndex&&(t.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(t.removeDirectoryIndex)&&t.removeDirectoryIndex.length>0){let e=o.pathname.split("/");const r=e[e.length-1];i(r,t.removeDirectoryIndex)&&(e=e.slice(0,e.length-1),o.pathname=e.slice(1).join("/")+"/")}if(o.hostname&&(o.hostname=o.hostname.replace(/\.$/,""),t.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(o.hostname)&&(o.hostname=o.hostname.replace(/^www\./,""))),Array.isArray(t.removeQueryParameters))for(const e of[...o.searchParams.keys()])i(e,t.removeQueryParameters)&&o.searchParams.delete(e);return t.sortQueryParameters&&o.searchParams.sort(),t.removeTrailingSlash&&(o.pathname=o.pathname.replace(/\/$/,"")),e=o.toString(),!t.removeTrailingSlash&&"/"!==o.pathname||""!==o.hash||(e=e.replace(/\/$/,"")),r&&!t.normalizeProtocol&&(e=e.replace(/^http:\/\//,"//")),t.stripProtocol&&(e=e.replace(/^(?:https?:)?\/\//,"")),e};e.exports=o,e.exports.default=o},91162:(e,t,r)=>{var n=r(98984);function i(e){var t=function(){return t.called?t.value:(t.called=!0,t.value=e.apply(this,arguments))};return t.called=!1,t}e.exports=n(i),i.proto=i((function(){Object.defineProperty(Function.prototype,"once",{value:function(){return i(this)},configurable:!0})}))},27180:(e,t,r)=>{var n=r(98984);function i(e){var t=function(){return t.called?t.value:(t.called=!0,t.value=e.apply(this,arguments))};return t.called=!1,t}function o(e){var t=function(){if(t.called)throw new Error(t.onceError);return t.called=!0,t.value=e.apply(this,arguments)},r=e.name||"Function wrapped with `once`";return t.onceError=r+" shouldn't be called more than once",t.called=!1,t}e.exports=n(i),e.exports.strict=n(o),i.proto=i((function(){Object.defineProperty(Function.prototype,"once",{value:function(){return i(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return o(this)},configurable:!0})}))},90834:(e,t,r)=>{"use strict";const n=r(81573),i=new WeakMap,o=(e,t={})=>{if("function"!=typeof e)throw new TypeError("Expected a function");let r,o=!1,s=0;const A=e.displayName||e.name||"",a=function(...n){if(i.set(a,++s),o){if(!0===t.throw)throw new Error(`Function \`${A}\` can only be called once`);return r}return o=!0,r=e.apply(this,n),e=null,r};return n(a,e),i.set(a,s),a};e.exports=o,e.exports.default=o,e.exports.callCount=e=>{if(!i.has(e))throw new Error(`The given function \`${e.name}\` is not wrapped by the \`onetime\` package`);return i.get(e)}},82941:e=>{"use strict";var t="win32"===process.platform,r=t?/[^:]\\$/:/.\/$/;e.exports=function(){var e;return e=t?process.env.TEMP||process.env.TMP||(process.env.SystemRoot||process.env.windir)+"\\temp":process.env.TMPDIR||process.env.TMP||process.env.TEMP||"/tmp",r.test(e)&&(e=e.slice(0,-1)),e}},59351:e=>{"use strict";class t extends Error{constructor(e){super(e||"Promise was canceled"),this.name="CancelError"}get isCanceled(){return!0}}class r{static fn(e){return(...t)=>new r((r,n,i)=>{t.push(i),e(...t).then(r,n)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((t,r)=>{this._reject=r;const n=e=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(e)};return Object.defineProperties(n,{shouldReject:{get:()=>this._rejectOnCancel,set:e=>{this._rejectOnCancel=e}}}),e(e=>{this._isPending=!1,t(e)},e=>{this._isPending=!1,r(e)},n)})}then(e,t){return this._promise.then(e,t)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(this._isPending&&!this._isCanceled){if(this._cancelHandlers.length>0)try{for(const e of this._cancelHandlers)e()}catch(e){this._reject(e)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new t(e))}}get isCanceled(){return this._isCanceled}}Object.setPrototypeOf(r.prototype,Promise.prototype),e.exports=r,e.exports.CancelError=t},61578:(e,t,r)=>{"use strict";const n=r(60550),i=e=>{if(e<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");const t=[];let r=0;const i=()=>{r--,t.length>0&&t.shift()()},o=(e,t,...o)=>{r++;const s=n(e,...o);t(s),s.then(i,i)},s=(n,...i)=>new Promise(s=>((n,i,...s)=>{rr},pendingCount:{get:()=>t.length}}),s};e.exports=i,e.exports.default=i},60550:e=>{"use strict";e.exports=(e,...t)=>new Promise(r=>{r(e(...t))})},71471:e=>{"use strict";function t(e){return"/"===e.charAt(0)}function r(e){var t=/^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/.exec(e),r=t[1]||"",n=Boolean(r&&":"!==r.charAt(1));return Boolean(t[2]||n)}e.exports="win32"===process.platform?r:t,e.exports.posix=t,e.exports.win32=r},37127:e=>{"use strict";const t=(e={})=>{const t=e.env||process.env;return"win32"!==(e.platform||process.platform)?"PATH":Object.keys(t).reverse().find(e=>"PATH"===e.toUpperCase())||"Path"};e.exports=t,e.exports.default=t},5763:(e,t,r)=>{"use strict";const{promisify:n}=r(31669),i=r(35747);async function o(e,t,r){if("string"!=typeof r)throw new TypeError("Expected a string, got "+typeof r);try{return(await n(i[e])(r))[t]()}catch(e){if("ENOENT"===e.code)return!1;throw e}}function s(e,t,r){if("string"!=typeof r)throw new TypeError("Expected a string, got "+typeof r);try{return i[e](r)[t]()}catch(e){if("ENOENT"===e.code)return!1;throw e}}t.isFile=o.bind(null,"stat","isFile"),t.isDirectory=o.bind(null,"stat","isDirectory"),t.isSymlink=o.bind(null,"lstat","isSymbolicLink"),t.isFileSync=s.bind(null,"statSync","isFile"),t.isDirectorySync=s.bind(null,"statSync","isDirectory"),t.isSymlinkSync=s.bind(null,"lstatSync","isSymbolicLink")},54722:(e,t,r)=>{"use strict";e.exports=r(18828)},71086:(e,t,r)=>{"use strict";const n=r(85622),i={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR:"(?=.)",QMARK:"[^/]",END_ANCHOR:"(?:\\/|$)",DOTS_SLASH:"\\.{1,2}(?:\\/|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|\\/)\\.{1,2}(?:\\/|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:\\/|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:\\/|$))",QMARK_NO_DOT:"[^.\\/]",STAR:"[^/]*?",START_ANCHOR:"(?:^|\\/)"},o={...i,SLASH_LITERAL:"[\\\\/]",QMARK:"[^\\\\/]",STAR:"[^\\\\/]*?",DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)"};e.exports={MAX_LENGTH:65536,POSIX_REGEX_SOURCE:{alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"},REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:n.sep,extglobChars:e=>({"!":{type:"negate",open:"(?:(?!(?:",close:`))${e.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}),globChars:e=>!0===e?o:i}},47974:(e,t,r)=>{"use strict";const n=r(71086),i=r(3598),{MAX_LENGTH:o,POSIX_REGEX_SOURCE:s,REGEX_NON_SPECIAL_CHARS:A,REGEX_SPECIAL_CHARS_BACKREF:a,REPLACEMENTS:c}=n,u=(e,t)=>{if("function"==typeof t.expandRange)return t.expandRange(...e,t);e.sort();const r=`[${e.join("-")}]`;try{new RegExp(r)}catch(t){return e.map(e=>i.escapeRegex(e)).join("..")}return r},l=(e,t)=>`Missing ${e}: "${t}" - use "\\\\${t}" to match literal characters`,h=(e,t)=>{if("string"!=typeof e)throw new TypeError("Expected a string");e=c[e]||e;const r={...t},h="number"==typeof r.maxLength?Math.min(o,r.maxLength):o;let g=e.length;if(g>h)throw new SyntaxError(`Input length: ${g}, exceeds maximum allowed length: ${h}`);const f={type:"bos",value:"",output:r.prepend||""},p=[f],d=r.capture?"":"?:",C=i.isWindows(t),E=n.globChars(C),I=n.extglobChars(E),{DOT_LITERAL:m,PLUS_LITERAL:y,SLASH_LITERAL:w,ONE_CHAR:B,DOTS_SLASH:Q,NO_DOT:v,NO_DOT_SLASH:D,NO_DOTS_SLASH:b,QMARK:S,QMARK_NO_DOT:k,STAR:x,START_ANCHOR:F}=E,M=e=>`(${d}(?:(?!${F}${e.dot?Q:m}).)*?)`,N=r.dot?"":v,R=r.dot?S:k;let K=!0===r.bash?M(r):x;r.capture&&(K=`(${K})`),"boolean"==typeof r.noext&&(r.noextglob=r.noext);const L={input:e,index:-1,start:0,dot:!0===r.dot,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:p};e=i.removePrefix(e,L),g=e.length;const T=[],P=[],U=[];let _,O=f;const j=()=>L.index===g-1,Y=L.peek=(t=1)=>e[L.index+t],G=L.advance=()=>e[++L.index],J=()=>e.slice(L.index+1),H=(e="",t=0)=>{L.consumed+=e,L.index+=t},q=e=>{L.output+=null!=e.output?e.output:e.value,H(e.value)},z=()=>{let e=1;for(;"!"===Y()&&("("!==Y(2)||"?"===Y(3));)G(),L.start++,e++;return e%2!=0&&(L.negated=!0,L.start++,!0)},W=e=>{L[e]++,U.push(e)},V=e=>{L[e]--,U.pop()},X=e=>{if("globstar"===O.type){const t=L.braces>0&&("comma"===e.type||"brace"===e.type),r=!0===e.extglob||T.length&&("pipe"===e.type||"paren"===e.type);"slash"===e.type||"paren"===e.type||t||r||(L.output=L.output.slice(0,-O.output.length),O.type="star",O.value="*",O.output=K,L.output+=O.output)}if(T.length&&"paren"!==e.type&&!I[e.value]&&(T[T.length-1].inner+=e.value),(e.value||e.output)&&q(e),O&&"text"===O.type&&"text"===e.type)return O.value+=e.value,void(O.output=(O.output||"")+e.value);e.prev=O,p.push(e),O=e},Z=(e,t)=>{const n={...I[t],conditions:1,inner:""};n.prev=O,n.parens=L.parens,n.output=L.output;const i=(r.capture?"(":"")+n.open;W("parens"),X({type:e,value:t,output:L.output?"":B}),X({type:"paren",extglob:!0,value:G(),output:i}),T.push(n)},$=e=>{let t=e.close+(r.capture?")":"");if("negate"===e.type){let n=K;e.inner&&e.inner.length>1&&e.inner.includes("/")&&(n=M(r)),(n!==K||j()||/^\)+$/.test(J()))&&(t=e.close=")$))"+n),"bos"===e.prev.type&&j()&&(L.negatedExtglob=!0)}X({type:"paren",extglob:!0,value:_,output:t}),V("parens")};if(!1!==r.fastpaths&&!/(^[*!]|[/()[\]{}"])/.test(e)){let n=!1,o=e.replace(a,(e,t,r,i,o,s)=>"\\"===i?(n=!0,e):"?"===i?t?t+i+(o?S.repeat(o.length):""):0===s?R+(o?S.repeat(o.length):""):S.repeat(r.length):"."===i?m.repeat(r.length):"*"===i?t?t+i+(o?K:""):K:t?e:"\\"+e);return!0===n&&(o=!0===r.unescape?o.replace(/\\/g,""):o.replace(/\\+/g,e=>e.length%2==0?"\\\\":e?"\\":"")),o===e&&!0===r.contains?(L.output=e,L):(L.output=i.wrapOutput(o,L,t),L)}for(;!j();){if(_=G(),"\0"===_)continue;if("\\"===_){const e=Y();if("/"===e&&!0!==r.bash)continue;if("."===e||";"===e)continue;if(!e){_+="\\",X({type:"text",value:_});continue}const t=/^\\+/.exec(J());let n=0;if(t&&t[0].length>2&&(n=t[0].length,L.index+=n,n%2!=0&&(_+="\\")),!0===r.unescape?_=G()||"":_+=G()||"",0===L.brackets){X({type:"text",value:_});continue}}if(L.brackets>0&&("]"!==_||"["===O.value||"[^"===O.value)){if(!1!==r.posix&&":"===_){const e=O.value.slice(1);if(e.includes("[")&&(O.posix=!0,e.includes(":"))){const e=O.value.lastIndexOf("["),t=O.value.slice(0,e),r=O.value.slice(e+2),n=s[r];if(n){O.value=t+n,L.backtrack=!0,G(),f.output||1!==p.indexOf(O)||(f.output=B);continue}}}("["===_&&":"!==Y()||"-"===_&&"]"===Y())&&(_="\\"+_),"]"!==_||"["!==O.value&&"[^"!==O.value||(_="\\"+_),!0===r.posix&&"!"===_&&"["===O.value&&(_="^"),O.value+=_,q({value:_});continue}if(1===L.quotes&&'"'!==_){_=i.escapeRegex(_),O.value+=_,q({value:_});continue}if('"'===_){L.quotes=1===L.quotes?0:1,!0===r.keepQuotes&&X({type:"text",value:_});continue}if("("===_){W("parens"),X({type:"paren",value:_});continue}if(")"===_){if(0===L.parens&&!0===r.strictBrackets)throw new SyntaxError(l("opening","("));const e=T[T.length-1];if(e&&L.parens===e.parens+1){$(T.pop());continue}X({type:"paren",value:_,output:L.parens?")":"\\)"}),V("parens");continue}if("["===_){if(!0!==r.nobracket&&J().includes("]"))W("brackets");else{if(!0!==r.nobracket&&!0===r.strictBrackets)throw new SyntaxError(l("closing","]"));_="\\"+_}X({type:"bracket",value:_});continue}if("]"===_){if(!0===r.nobracket||O&&"bracket"===O.type&&1===O.value.length){X({type:"text",value:_,output:"\\"+_});continue}if(0===L.brackets){if(!0===r.strictBrackets)throw new SyntaxError(l("opening","["));X({type:"text",value:_,output:"\\"+_});continue}V("brackets");const e=O.value.slice(1);if(!0===O.posix||"^"!==e[0]||e.includes("/")||(_="/"+_),O.value+=_,q({value:_}),!1===r.literalBrackets||i.hasRegexChars(e))continue;const t=i.escapeRegex(O.value);if(L.output=L.output.slice(0,-O.value.length),!0===r.literalBrackets){L.output+=t,O.value=t;continue}O.value=`(${d}${t}|${O.value})`,L.output+=O.value;continue}if("{"===_&&!0!==r.nobrace){W("braces");const e={type:"brace",value:_,output:"(",outputIndex:L.output.length,tokensIndex:L.tokens.length};P.push(e),X(e);continue}if("}"===_){const e=P[P.length-1];if(!0===r.nobrace||!e){X({type:"text",value:_,output:_});continue}let t=")";if(!0===e.dots){const e=p.slice(),n=[];for(let t=e.length-1;t>=0&&(p.pop(),"brace"!==e[t].type);t--)"dots"!==e[t].type&&n.unshift(e[t].value);t=u(n,r),L.backtrack=!0}if(!0!==e.comma&&!0!==e.dots){const r=L.output.slice(0,e.outputIndex),n=L.tokens.slice(e.tokensIndex);e.value=e.output="\\{",_=t="\\}",L.output=r;for(const e of n)L.output+=e.output||e.value}X({type:"brace",value:_,output:t}),V("braces"),P.pop();continue}if("|"===_){T.length>0&&T[T.length-1].conditions++,X({type:"text",value:_});continue}if(","===_){let e=_;const t=P[P.length-1];t&&"braces"===U[U.length-1]&&(t.comma=!0,e="|"),X({type:"comma",value:_,output:e});continue}if("/"===_){if("dot"===O.type&&L.index===L.start+1){L.start=L.index+1,L.consumed="",L.output="",p.pop(),O=f;continue}X({type:"slash",value:_,output:w});continue}if("."===_){if(L.braces>0&&"dot"===O.type){"."===O.value&&(O.output=m);const e=P[P.length-1];O.type="dots",O.output+=_,O.value+=_,e.dots=!0;continue}if(L.braces+L.parens===0&&"bos"!==O.type&&"slash"!==O.type){X({type:"text",value:_,output:m});continue}X({type:"dot",value:_,output:m});continue}if("?"===_){if(!(O&&"("===O.value)&&!0!==r.noextglob&&"("===Y()&&"?"!==Y(2)){Z("qmark",_);continue}if(O&&"paren"===O.type){const e=Y();let t=_;if("<"===e&&!i.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");("("===O.value&&!/[!=<:]/.test(e)||"<"===e&&!/<([!=]|\w+>)/.test(J()))&&(t="\\"+_),X({type:"text",value:_,output:t});continue}if(!0!==r.dot&&("slash"===O.type||"bos"===O.type)){X({type:"qmark",value:_,output:k});continue}X({type:"qmark",value:_,output:S});continue}if("!"===_){if(!0!==r.noextglob&&"("===Y()&&("?"!==Y(2)||!/[!=<:]/.test(Y(3)))){Z("negate",_);continue}if(!0!==r.nonegate&&0===L.index){z();continue}}if("+"===_){if(!0!==r.noextglob&&"("===Y()&&"?"!==Y(2)){Z("plus",_);continue}if(O&&"("===O.value||!1===r.regex){X({type:"plus",value:_,output:y});continue}if(O&&("bracket"===O.type||"paren"===O.type||"brace"===O.type)||L.parens>0){X({type:"plus",value:_});continue}X({type:"plus",value:y});continue}if("@"===_){if(!0!==r.noextglob&&"("===Y()&&"?"!==Y(2)){X({type:"at",extglob:!0,value:_,output:""});continue}X({type:"text",value:_});continue}if("*"!==_){"$"!==_&&"^"!==_||(_="\\"+_);const e=A.exec(J());e&&(_+=e[0],L.index+=e[0].length),X({type:"text",value:_});continue}if(O&&("globstar"===O.type||!0===O.star)){O.type="star",O.star=!0,O.value+=_,O.output=K,L.backtrack=!0,L.globstar=!0,H(_);continue}let t=J();if(!0!==r.noextglob&&/^\([^?]/.test(t)){Z("star",_);continue}if("star"===O.type){if(!0===r.noglobstar){H(_);continue}const n=O.prev,i=n.prev,o="slash"===n.type||"bos"===n.type,s=i&&("star"===i.type||"globstar"===i.type);if(!0===r.bash&&(!o||t[0]&&"/"!==t[0])){X({type:"star",value:_,output:""});continue}const A=L.braces>0&&("comma"===n.type||"brace"===n.type),a=T.length&&("pipe"===n.type||"paren"===n.type);if(!o&&"paren"!==n.type&&!A&&!a){X({type:"star",value:_,output:""});continue}for(;"/**"===t.slice(0,3);){const r=e[L.index+4];if(r&&"/"!==r)break;t=t.slice(3),H("/**",3)}if("bos"===n.type&&j()){O.type="globstar",O.value+=_,O.output=M(r),L.output=O.output,L.globstar=!0,H(_);continue}if("slash"===n.type&&"bos"!==n.prev.type&&!s&&j()){L.output=L.output.slice(0,-(n.output+O.output).length),n.output="(?:"+n.output,O.type="globstar",O.output=M(r)+(r.strictSlashes?")":"|$)"),O.value+=_,L.globstar=!0,L.output+=n.output+O.output,H(_);continue}if("slash"===n.type&&"bos"!==n.prev.type&&"/"===t[0]){const e=void 0!==t[1]?"|$":"";L.output=L.output.slice(0,-(n.output+O.output).length),n.output="(?:"+n.output,O.type="globstar",O.output=`${M(r)}${w}|${w}${e})`,O.value+=_,L.output+=n.output+O.output,L.globstar=!0,H(_+G()),X({type:"slash",value:"/",output:""});continue}if("bos"===n.type&&"/"===t[0]){O.type="globstar",O.value+=_,O.output=`(?:^|${w}|${M(r)}${w})`,L.output=O.output,L.globstar=!0,H(_+G()),X({type:"slash",value:"/",output:""});continue}L.output=L.output.slice(0,-O.output.length),O.type="globstar",O.output=M(r),O.value+=_,L.output+=O.output,L.globstar=!0,H(_);continue}const n={type:"star",value:_,output:K};!0!==r.bash?!O||"bracket"!==O.type&&"paren"!==O.type||!0!==r.regex?(L.index!==L.start&&"slash"!==O.type&&"dot"!==O.type||("dot"===O.type?(L.output+=D,O.output+=D):!0===r.dot?(L.output+=b,O.output+=b):(L.output+=N,O.output+=N),"*"!==Y()&&(L.output+=B,O.output+=B)),X(n)):(n.output=_,X(n)):(n.output=".*?","bos"!==O.type&&"slash"!==O.type||(n.output=N+n.output),X(n))}for(;L.brackets>0;){if(!0===r.strictBrackets)throw new SyntaxError(l("closing","]"));L.output=i.escapeLast(L.output,"["),V("brackets")}for(;L.parens>0;){if(!0===r.strictBrackets)throw new SyntaxError(l("closing",")"));L.output=i.escapeLast(L.output,"("),V("parens")}for(;L.braces>0;){if(!0===r.strictBrackets)throw new SyntaxError(l("closing","}"));L.output=i.escapeLast(L.output,"{"),V("braces")}if(!0===r.strictSlashes||"star"!==O.type&&"bracket"!==O.type||X({type:"maybe_slash",value:"",output:w+"?"}),!0===L.backtrack){L.output="";for(const e of L.tokens)L.output+=null!=e.output?e.output:e.value,e.suffix&&(L.output+=e.suffix)}return L};h.fastpaths=(e,t)=>{const r={...t},s="number"==typeof r.maxLength?Math.min(o,r.maxLength):o,A=e.length;if(A>s)throw new SyntaxError(`Input length: ${A}, exceeds maximum allowed length: ${s}`);e=c[e]||e;const a=i.isWindows(t),{DOT_LITERAL:u,SLASH_LITERAL:l,ONE_CHAR:h,DOTS_SLASH:g,NO_DOT:f,NO_DOTS:p,NO_DOTS_SLASH:d,STAR:C,START_ANCHOR:E}=n.globChars(a),I=r.dot?p:f,m=r.dot?d:f,y=r.capture?"":"?:";let w=!0===r.bash?".*?":C;r.capture&&(w=`(${w})`);const B=e=>!0===e.noglobstar?w:`(${y}(?:(?!${E}${e.dot?g:u}).)*?)`,Q=e=>{switch(e){case"*":return`${I}${h}${w}`;case".*":return`${u}${h}${w}`;case"*.*":return`${I}${w}${u}${h}${w}`;case"*/*":return`${I}${w}${l}${h}${m}${w}`;case"**":return I+B(r);case"**/*":return`(?:${I}${B(r)}${l})?${m}${h}${w}`;case"**/*.*":return`(?:${I}${B(r)}${l})?${m}${w}${u}${h}${w}`;case"**/.*":return`(?:${I}${B(r)}${l})?${u}${h}${w}`;default:{const t=/^(.*?)\.(\w+)$/.exec(e);if(!t)return;const r=Q(t[1]);if(!r)return;return r+u+t[2]}}},v=i.removePrefix(e,{negated:!1,prefix:""});let D=Q(v);return D&&!0!==r.strictSlashes&&(D+=l+"?"),D},e.exports=h},18828:(e,t,r)=>{"use strict";const n=r(85622),i=r(95321),o=r(47974),s=r(3598),A=r(71086),a=(e,t,r=!1)=>{if(Array.isArray(e)){const n=e.map(e=>a(e,t,r));return e=>{for(const t of n){const r=t(e);if(r)return r}return!1}}const n=(i=e)&&"object"==typeof i&&!Array.isArray(i)&&e.tokens&&e.input;var i;if(""===e||"string"!=typeof e&&!n)throw new TypeError("Expected pattern to be a non-empty string");const o=t||{},A=s.isWindows(t),c=n?a.compileRe(e,t):a.makeRe(e,t,!1,!0),u=c.state;delete c.state;let l=()=>!1;if(o.ignore){const e={...t,ignore:null,onMatch:null,onResult:null};l=a(o.ignore,e,r)}const h=(r,n=!1)=>{const{isMatch:i,match:s,output:h}=a.test(r,c,t,{glob:e,posix:A}),g={glob:e,state:u,regex:c,posix:A,input:r,output:h,match:s,isMatch:i};return"function"==typeof o.onResult&&o.onResult(g),!1===i?(g.isMatch=!1,!!n&&g):l(r)?("function"==typeof o.onIgnore&&o.onIgnore(g),g.isMatch=!1,!!n&&g):("function"==typeof o.onMatch&&o.onMatch(g),!n||g)};return r&&(h.state=u),h};a.test=(e,t,r,{glob:n,posix:i}={})=>{if("string"!=typeof e)throw new TypeError("Expected input to be a string");if(""===e)return{isMatch:!1,output:""};const o=r||{},A=o.format||(i?s.toPosixSlashes:null);let c=e===n,u=c&&A?A(e):e;return!1===c&&(u=A?A(e):e,c=u===n),!1!==c&&!0!==o.capture||(c=!0===o.matchBase||!0===o.basename?a.matchBase(e,t,r,i):t.exec(u)),{isMatch:Boolean(c),match:c,output:u}},a.matchBase=(e,t,r,i=s.isWindows(r))=>(t instanceof RegExp?t:a.makeRe(t,r)).test(n.basename(e)),a.isMatch=(e,t,r)=>a(t,r)(e),a.parse=(e,t)=>Array.isArray(e)?e.map(e=>a.parse(e,t)):o(e,{...t,fastpaths:!1}),a.scan=(e,t)=>i(e,t),a.compileRe=(e,t,r=!1,n=!1)=>{if(!0===r)return e.output;const i=t||{},o=i.contains?"":"^",s=i.contains?"":"$";let A=`${o}(?:${e.output})${s}`;e&&!0===e.negated&&(A=`^(?!${A}).*$`);const c=a.toRegex(A,t);return!0===n&&(c.state=e),c},a.makeRe=(e,t,r=!1,n=!1)=>{if(!e||"string"!=typeof e)throw new TypeError("Expected a non-empty string");const i=t||{};let s,A={negated:!1,fastpaths:!0},c="";return e.startsWith("./")&&(e=e.slice(2),c=A.prefix="./"),!1===i.fastpaths||"."!==e[0]&&"*"!==e[0]||(s=o.fastpaths(e,t)),void 0===s?(A=o(e,t),A.prefix=c+(A.prefix||"")):A.output=s,a.compileRe(A,t,r,n)},a.toRegex=(e,t)=>{try{const r=t||{};return new RegExp(e,r.flags||(r.nocase?"i":""))}catch(e){if(t&&!0===t.debug)throw e;return/$^/}},a.constants=A,e.exports=a},95321:(e,t,r)=>{"use strict";const n=r(3598),{CHAR_ASTERISK:i,CHAR_AT:o,CHAR_BACKWARD_SLASH:s,CHAR_COMMA:A,CHAR_DOT:a,CHAR_EXCLAMATION_MARK:c,CHAR_FORWARD_SLASH:u,CHAR_LEFT_CURLY_BRACE:l,CHAR_LEFT_PARENTHESES:h,CHAR_LEFT_SQUARE_BRACKET:g,CHAR_PLUS:f,CHAR_QUESTION_MARK:p,CHAR_RIGHT_CURLY_BRACE:d,CHAR_RIGHT_PARENTHESES:C,CHAR_RIGHT_SQUARE_BRACKET:E}=r(71086),I=e=>e===u||e===s,m=e=>{!0!==e.isPrefix&&(e.depth=e.isGlobstar?1/0:1)};e.exports=(e,t)=>{const r=t||{},y=e.length-1,w=!0===r.parts||!0===r.scanToEnd,B=[],Q=[],v=[];let D,b,S=e,k=-1,x=0,F=0,M=!1,N=!1,R=!1,K=!1,L=!1,T=!1,P=!1,U=!1,_=!1,O=0,j={value:"",depth:0,isGlob:!1};const Y=()=>k>=y,G=()=>(D=b,S.charCodeAt(++k));for(;k0&&(H=S.slice(0,x),S=S.slice(x),F-=x),J&&!0===R&&F>0?(J=S.slice(0,F),q=S.slice(F)):!0===R?(J="",q=S):J=S,J&&""!==J&&"/"!==J&&J!==S&&I(J.charCodeAt(J.length-1))&&(J=J.slice(0,-1)),!0===r.unescape&&(q&&(q=n.removeBackslashes(q)),J&&!0===P&&(J=n.removeBackslashes(J)));const z={prefix:H,input:e,start:x,base:J,glob:q,isBrace:M,isBracket:N,isGlob:R,isExtglob:K,isGlobstar:L,negated:U};if(!0===r.tokens&&(z.maxDepth=0,I(b)||Q.push(j),z.tokens=Q),!0===r.parts||!0===r.tokens){let t;for(let n=0;n{"use strict";const n=r(85622),i="win32"===process.platform,{REGEX_BACKSLASH:o,REGEX_REMOVE_BACKSLASH:s,REGEX_SPECIAL_CHARS:A,REGEX_SPECIAL_CHARS_GLOBAL:a}=r(71086);t.isObject=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),t.hasRegexChars=e=>A.test(e),t.isRegexChar=e=>1===e.length&&t.hasRegexChars(e),t.escapeRegex=e=>e.replace(a,"\\$1"),t.toPosixSlashes=e=>e.replace(o,"/"),t.removeBackslashes=e=>e.replace(s,e=>"\\"===e?"":e),t.supportsLookbehinds=()=>{const e=process.version.slice(1).split(".").map(Number);return 3===e.length&&e[0]>=9||8===e[0]&&e[1]>=10},t.isWindows=e=>e&&"boolean"==typeof e.windows?e.windows:!0===i||"\\"===n.sep,t.escapeLast=(e,r,n)=>{const i=e.lastIndexOf(r,n);return-1===i?e:"\\"===e[i-1]?t.escapeLast(e,r,i-1):`${e.slice(0,i)}\\${e.slice(i)}`},t.removePrefix=(e,t={})=>{let r=e;return r.startsWith("./")&&(r=r.slice(2),t.prefix="./"),r},t.wrapOutput=(e,t={},r={})=>{let n=`${r.contains?"":"^"}(?:${e})${r.contains?"":"$"}`;return!0===t.negated&&(n=`(?:^(?!${n}).*$)`),n}},79588:e=>{"use strict";function t(e){this._maxSize=e,this.clear()}t.prototype.clear=function(){this._size=0,this._values={}},t.prototype.get=function(e){return this._values[e]},t.prototype.set=function(e,t){return this._size>=this._maxSize&&this.clear(),this._values.hasOwnProperty(e)||this._size++,this._values[e]=t};var r=/[^.^\]^[]+|(?=\[\]|\.\.)/g,n=/^\d+$/,i=/^\d/,o=/[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g,s=/^\s*(['"]?)(.*?)(\1)\s*$/,A=!1,a=new t(512),c=new t(512),u=new t(512);try{new Function("")}catch(e){A=!0}function l(e){return a.get(e)||a.set(e,h(e).map((function(e){return e.replace(s,"$2")})))}function h(e){return e.match(r)}function g(e,t,r){return"string"==typeof t&&(r=t,t=!1),r=r||"data",(e=e||"")&&"["!==e.charAt(0)&&(e="."+e),t?function(e,t){var r,n=t,i=h(e);return f(i,(function(e,t,i,o,s){r=o===s.length-1,n+=(e=t||i?"["+e+"]":"."+e)+(r?")":" || {})")})),new Array(i.length+1).join("(")+n}(e,r):r+e}function f(e,t,r){var n,i,o,s,A=e.length;for(i=0;i{var n=r(91162),i=r(97681),o=r(35747),s=function(){},A=/^v?\.0/.test(process.version),a=function(e){return"function"==typeof e},c=function(e,t,r,c){c=n(c);var u=!1;e.on("close",(function(){u=!0})),i(e,{readable:t,writable:r},(function(e){if(e)return c(e);u=!0,c()}));var l=!1;return function(t){if(!u&&!l)return l=!0,function(e){return!!A&&(!!o&&((e instanceof(o.ReadStream||s)||e instanceof(o.WriteStream||s))&&a(e.close)))}(e)?e.close(s):function(e){return e.setHeader&&a(e.abort)}(e)?e.abort():a(e.destroy)?e.destroy():void c(t||new Error("stream was destroyed"))}},u=function(e){e()},l=function(e,t){return e.pipe(t)};e.exports=function(){var e,t=Array.prototype.slice.call(arguments),r=a(t[t.length-1]||s)&&t.pop()||s;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error("pump requires two streams per minimum");var n=t.map((function(i,o){var s=o0,(function(t){e||(e=t),t&&n.forEach(u),s||(n.forEach(u),r(e))}))}));return t.reduce(l)}},82905:e=>{"use strict";class t{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,t){if(this.cache.set(e,t),this._size++,this._size>=this.maxSize){if(this._size=0,"function"==typeof this.onEviction)for(const[e,t]of this.oldCache.entries())this.onEviction(e,t);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){const t=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,t),t}}set(e,t){return this.cache.has(e)?this.cache.set(e,t):this._set(e,t),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){return this.cache.has(e)?this.cache.get(e):this.oldCache.has(e)?this.oldCache.get(e):void 0}delete(e){const t=this.cache.delete(e);return t&&this._size--,this.oldCache.delete(e)||t}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(const[e]of this)yield e}*values(){for(const[,e]of this)yield e}*[Symbol.iterator](){for(const e of this.cache)yield e;for(const e of this.oldCache){const[t]=e;this.cache.has(t)||(yield e)}}get size(){let e=0;for(const t of this.oldCache.keys())this.cache.has(t)||e++;return Math.min(this._size+e,this.maxSize)}}e.exports=t},20663:e=>{"use strict";const t={};function r(e,r,n){n||(n=Error);class i extends n{constructor(e,t,n){super(function(e,t,n){return"string"==typeof r?r:r(e,t,n)}(e,t,n))}}i.prototype.name=n.name,i.prototype.code=e,t[e]=i}function n(e,t){if(Array.isArray(e)){const r=e.length;return e=e.map(e=>String(e)),r>2?`one of ${t} ${e.slice(0,r-1).join(", ")}, or `+e[r-1]:2===r?`one of ${t} ${e[0]} or ${e[1]}`:`of ${t} ${e[0]}`}return`of ${t} ${String(e)}`}r("ERR_INVALID_OPT_VALUE",(function(e,t){return'The value "'+t+'" is invalid for option "'+e+'"'}),TypeError),r("ERR_INVALID_ARG_TYPE",(function(e,t,r){let i;var o,s;let A;if("string"==typeof t&&(o="not ",t.substr(!s||s<0?0:+s,o.length)===o)?(i="must not be",t=t.replace(/^not /,"")):i="must be",function(e,t,r){return(void 0===r||r>e.length)&&(r=e.length),e.substring(r-t.length,r)===t}(e," argument"))A=`The ${e} ${i} ${n(t,"type")}`;else{A=`The "${e}" ${function(e,t,r){return"number"!=typeof r&&(r=0),!(r+t.length>e.length)&&-1!==e.indexOf(t,r)}(e,".")?"property":"argument"} ${i} ${n(t,"type")}`}return A+=". Received type "+typeof r,A}),TypeError),r("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF"),r("ERR_METHOD_NOT_IMPLEMENTED",(function(e){return"The "+e+" method is not implemented"})),r("ERR_STREAM_PREMATURE_CLOSE","Premature close"),r("ERR_STREAM_DESTROYED",(function(e){return"Cannot call "+e+" after a stream was destroyed"})),r("ERR_MULTIPLE_CALLBACK","Callback called multiple times"),r("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable"),r("ERR_STREAM_WRITE_AFTER_END","write after end"),r("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),r("ERR_UNKNOWN_ENCODING",(function(e){return"Unknown encoding: "+e}),TypeError),r("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event"),e.exports.q=t},39138:e=>{"use strict";var t=new Set;e.exports.emitExperimentalWarning=process.emitWarning?function(e){if(!t.has(e)){var r=e+" is an experimental feature. This feature could change at any time";t.add(e),process.emitWarning(r,"ExperimentalWarning")}}:function(){}},72434:(e,t,r)=>{"use strict";var n=Object.keys||function(e){var t=[];for(var r in e)t.push(r);return t};e.exports=c;var i=r(58020),o=r(6729);r(85870)(c,i);for(var s=n(o.prototype),A=0;A{"use strict";e.exports=i;var n=r(54801);function i(e){if(!(this instanceof i))return new i(e);n.call(this,e)}r(85870)(i,n),i.prototype._transform=function(e,t,r){r(null,e)}},58020:(e,t,r)=>{"use strict";var n;e.exports=B,B.ReadableState=w;r(28614).EventEmitter;var i=function(e,t){return e.listeners(t).length},o=r(49298),s=r(64293).Buffer,A=global.Uint8Array||function(){};var a,c=r(31669);a=c&&c.debuglog?c.debuglog("stream"):function(){};var u,l,h=r(43117),g=r(32340),f=r(77433).getHighWaterMark,p=r(20663).q,d=p.ERR_INVALID_ARG_TYPE,C=p.ERR_STREAM_PUSH_AFTER_EOF,E=p.ERR_METHOD_NOT_IMPLEMENTED,I=p.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,m=r(39138).emitExperimentalWarning;r(85870)(B,o);var y=["error","close","destroy","pause","resume"];function w(e,t,i){n=n||r(72434),e=e||{},"boolean"!=typeof i&&(i=t instanceof n),this.objectMode=!!e.objectMode,i&&(this.objectMode=this.objectMode||!!e.readableObjectMode),this.highWaterMark=f(this,e,"readableHighWaterMark",i),this.buffer=new h,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=!1!==e.emitClose,this.destroyed=!1,this.defaultEncoding=e.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(u||(u=r(69538).s),this.decoder=new u(e.encoding),this.encoding=e.encoding)}function B(e){if(n=n||r(72434),!(this instanceof B))return new B(e);var t=this instanceof n;this._readableState=new w(e,this,t),this.readable=!0,e&&("function"==typeof e.read&&(this._read=e.read),"function"==typeof e.destroy&&(this._destroy=e.destroy)),o.call(this)}function Q(e,t,r,n,i){a("readableAddChunk",t);var o,c=e._readableState;if(null===t)c.reading=!1,function(e,t){if(t.ended)return;if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,t.sync?b(e):(t.needReadable=!1,t.emittedReadable||(t.emittedReadable=!0,S(e)))}(e,c);else if(i||(o=function(e,t){var r;n=t,s.isBuffer(n)||n instanceof A||"string"==typeof t||void 0===t||e.objectMode||(r=new d("chunk",["string","Buffer","Uint8Array"],t));var n;return r}(c,t)),o)e.emit("error",o);else if(c.objectMode||t&&t.length>0)if("string"==typeof t||c.objectMode||Object.getPrototypeOf(t)===s.prototype||(t=function(e){return s.from(e)}(t)),n)c.endEmitted?e.emit("error",new I):v(e,c,t,!0);else if(c.ended)e.emit("error",new C);else{if(c.destroyed)return!1;c.reading=!1,c.decoder&&!r?(t=c.decoder.write(t),c.objectMode||0!==t.length?v(e,c,t,!1):k(e,c)):v(e,c,t,!1)}else n||(c.reading=!1,k(e,c));return!c.ended&&(c.lengtht.highWaterMark&&(t.highWaterMark=function(e){return e>=8388608?e=8388608:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function b(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(a("emitReadable",t.flowing),t.emittedReadable=!0,process.nextTick(S,e))}function S(e){var t=e._readableState;a("emitReadable_",t.destroyed,t.length,t.ended),t.destroyed||!t.length&&!t.ended||e.emit("readable"),t.needReadable=!t.flowing&&!t.ended&&t.length<=t.highWaterMark,R(e)}function k(e,t){t.readingMore||(t.readingMore=!0,process.nextTick(x,e,t))}function x(e,t){for(var r=t.length;!t.reading&&!t.ended&&t.length0,t.resumeScheduled&&!t.paused?t.flowing=!0:e.listenerCount("data")>0&&e.resume()}function M(e){a("readable nexttick read 0"),e.read(0)}function N(e,t){a("resume",t.reading),t.reading||e.read(0),t.resumeScheduled=!1,e.emit("resume"),R(e),t.flowing&&!t.reading&&e.read(0)}function R(e){var t=e._readableState;for(a("flow",t.flowing);t.flowing&&null!==e.read(););}function K(e,t){return 0===t.length?null:(t.objectMode?r=t.buffer.shift():!e||e>=t.length?(r=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.first():t.buffer.concat(t.length),t.buffer.clear()):r=t.buffer.consume(e,t.decoder),r);var r}function L(e){var t=e._readableState;a("endReadable",t.endEmitted),t.endEmitted||(t.ended=!0,process.nextTick(T,t,e))}function T(e,t){a("endReadableNT",e.endEmitted,e.length),e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function P(e,t){for(var r=0,n=e.length;r=t.highWaterMark:t.length>0)||t.ended))return a("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?L(this):b(this),null;if(0===(e=D(e,t))&&t.ended)return 0===t.length&&L(this),null;var n,i=t.needReadable;return a("need readable",i),(0===t.length||t.length-e0?K(e,t):null)?(t.needReadable=!0,e=0):(t.length-=e,t.awaitDrain=0),0===t.length&&(t.ended||(t.needReadable=!0),r!==e&&t.ended&&L(this)),null!==n&&this.emit("data",n),n},B.prototype._read=function(e){this.emit("error",new E("_read()"))},B.prototype.pipe=function(e,t){var r=this,n=this._readableState;switch(n.pipesCount){case 0:n.pipes=e;break;case 1:n.pipes=[n.pipes,e];break;default:n.pipes.push(e)}n.pipesCount+=1,a("pipe count=%d opts=%j",n.pipesCount,t);var o=(!t||!1!==t.end)&&e!==process.stdout&&e!==process.stderr?A:p;function s(t,i){a("onunpipe"),t===r&&i&&!1===i.hasUnpiped&&(i.hasUnpiped=!0,a("cleanup"),e.removeListener("close",g),e.removeListener("finish",f),e.removeListener("drain",c),e.removeListener("error",h),e.removeListener("unpipe",s),r.removeListener("end",A),r.removeListener("end",p),r.removeListener("data",l),u=!0,!n.awaitDrain||e._writableState&&!e._writableState.needDrain||c())}function A(){a("onend"),e.end()}n.endEmitted?process.nextTick(o):r.once("end",o),e.on("unpipe",s);var c=function(e){return function(){var t=e._readableState;a("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&i(e,"data")&&(t.flowing=!0,R(e))}}(r);e.on("drain",c);var u=!1;function l(t){a("ondata");var i=e.write(t);a("dest.write",i),!1===i&&((1===n.pipesCount&&n.pipes===e||n.pipesCount>1&&-1!==P(n.pipes,e))&&!u&&(a("false write response, pause",n.awaitDrain),n.awaitDrain++),r.pause())}function h(t){a("onerror",t),p(),e.removeListener("error",h),0===i(e,"error")&&e.emit("error",t)}function g(){e.removeListener("finish",f),p()}function f(){a("onfinish"),e.removeListener("close",g),p()}function p(){a("unpipe"),r.unpipe(e)}return r.on("data",l),function(e,t,r){if("function"==typeof e.prependListener)return e.prependListener(t,r);e._events&&e._events[t]?Array.isArray(e._events[t])?e._events[t].unshift(r):e._events[t]=[r,e._events[t]]:e.on(t,r)}(e,"error",h),e.once("close",g),e.once("finish",f),e.emit("pipe",r),n.flowing||(a("pipe resume"),r.resume()),e},B.prototype.unpipe=function(e){var t=this._readableState,r={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes||(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this,r)),this;if(!e){var n=t.pipes,i=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var o=0;o0,!1!==n.flowing&&this.resume()):"readable"===e&&(n.endEmitted||n.readableListening||(n.readableListening=n.needReadable=!0,n.flowing=!1,n.emittedReadable=!1,a("on readable",n.length,n.reading),n.length?b(this):n.reading||process.nextTick(M,this))),r},B.prototype.addListener=B.prototype.on,B.prototype.removeListener=function(e,t){var r=o.prototype.removeListener.call(this,e,t);return"readable"===e&&process.nextTick(F,this),r},B.prototype.removeAllListeners=function(e){var t=o.prototype.removeAllListeners.apply(this,arguments);return"readable"!==e&&void 0!==e||process.nextTick(F,this),t},B.prototype.resume=function(){var e=this._readableState;return e.flowing||(a("resume"),e.flowing=!e.readableListening,function(e,t){t.resumeScheduled||(t.resumeScheduled=!0,process.nextTick(N,e,t))}(this,e)),e.paused=!1,this},B.prototype.pause=function(){return a("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(a("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this},B.prototype.wrap=function(e){var t=this,r=this._readableState,n=!1;for(var i in e.on("end",(function(){if(a("wrapped end"),r.decoder&&!r.ended){var e=r.decoder.end();e&&e.length&&t.push(e)}t.push(null)})),e.on("data",(function(i){(a("wrapped data"),r.decoder&&(i=r.decoder.write(i)),r.objectMode&&null==i)||(r.objectMode||i&&i.length)&&(t.push(i)||(n=!0,e.pause()))})),e)void 0===this[i]&&"function"==typeof e[i]&&(this[i]=function(t){return function(){return e[t].apply(e,arguments)}}(i));for(var o=0;o{"use strict";e.exports=u;var n=r(20663).q,i=n.ERR_METHOD_NOT_IMPLEMENTED,o=n.ERR_MULTIPLE_CALLBACK,s=n.ERR_TRANSFORM_ALREADY_TRANSFORMING,A=n.ERR_TRANSFORM_WITH_LENGTH_0,a=r(72434);function c(e,t){var r=this._transformState;r.transforming=!1;var n=r.writecb;if(null===n)return this.emit("error",new o);r.writechunk=null,r.writecb=null,null!=t&&this.push(t),n(e);var i=this._readableState;i.reading=!1,(i.needReadable||i.length{"use strict";function n(e){var t=this;this.next=null,this.entry=null,this.finish=function(){!function(e,t,r){var n=e.entry;e.entry=null;for(;n;){var i=n.callback;t.pendingcb--,i(r),n=n.next}t.corkedRequestsFree.next=e}(t,e)}}var i;e.exports=B,B.WritableState=w;var o={deprecate:r(73212)},s=r(49298),A=r(64293).Buffer,a=global.Uint8Array||function(){};var c,u=r(32340),l=r(77433).getHighWaterMark,h=r(20663).q,g=h.ERR_INVALID_ARG_TYPE,f=h.ERR_METHOD_NOT_IMPLEMENTED,p=h.ERR_MULTIPLE_CALLBACK,d=h.ERR_STREAM_CANNOT_PIPE,C=h.ERR_STREAM_DESTROYED,E=h.ERR_STREAM_NULL_VALUES,I=h.ERR_STREAM_WRITE_AFTER_END,m=h.ERR_UNKNOWN_ENCODING;function y(){}function w(e,t,o){i=i||r(72434),e=e||{},"boolean"!=typeof o&&(o=t instanceof i),this.objectMode=!!e.objectMode,o&&(this.objectMode=this.objectMode||!!e.writableObjectMode),this.highWaterMark=l(this,e,"writableHighWaterMark",o),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var s=!1===e.decodeStrings;this.decodeStrings=!s,this.defaultEncoding=e.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){!function(e,t){var r=e._writableState,n=r.sync,i=r.writecb;if("function"!=typeof i)throw new p;if(function(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}(r),t)!function(e,t,r,n,i){--t.pendingcb,r?(process.nextTick(i,n),process.nextTick(k,e,t),e._writableState.errorEmitted=!0,e.emit("error",n)):(i(n),e._writableState.errorEmitted=!0,e.emit("error",n),k(e,t))}(e,r,n,t,i);else{var o=b(r)||e.destroyed;o||r.corked||r.bufferProcessing||!r.bufferedRequest||D(e,r),n?process.nextTick(v,e,r,o,i):v(e,r,o,i)}}(t,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=!1!==e.emitClose,this.bufferedRequestCount=0,this.corkedRequestsFree=new n(this)}function B(e){var t=this instanceof(i=i||r(72434));if(!t&&!c.call(B,this))return new B(e);this._writableState=new w(e,this,t),this.writable=!0,e&&("function"==typeof e.write&&(this._write=e.write),"function"==typeof e.writev&&(this._writev=e.writev),"function"==typeof e.destroy&&(this._destroy=e.destroy),"function"==typeof e.final&&(this._final=e.final)),s.call(this)}function Q(e,t,r,n,i,o,s){t.writelen=n,t.writecb=s,t.writing=!0,t.sync=!0,t.destroyed?t.onwrite(new C("write")):r?e._writev(i,t.onwrite):e._write(i,o,t.onwrite),t.sync=!1}function v(e,t,r,n){r||function(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit("drain"))}(e,t),t.pendingcb--,n(),k(e,t)}function D(e,t){t.bufferProcessing=!0;var r=t.bufferedRequest;if(e._writev&&r&&r.next){var i=t.bufferedRequestCount,o=new Array(i),s=t.corkedRequestsFree;s.entry=r;for(var A=0,a=!0;r;)o[A]=r,r.isBuf||(a=!1),r=r.next,A+=1;o.allBuffers=a,Q(e,t,!0,t.length,o,"",s.finish),t.pendingcb++,t.lastBufferedRequest=null,s.next?(t.corkedRequestsFree=s.next,s.next=null):t.corkedRequestsFree=new n(t),t.bufferedRequestCount=0}else{for(;r;){var c=r.chunk,u=r.encoding,l=r.callback;if(Q(e,t,!1,t.objectMode?1:c.length,c,u,l),r=r.next,t.bufferedRequestCount--,t.writing)break}null===r&&(t.lastBufferedRequest=null)}t.bufferedRequest=r,t.bufferProcessing=!1}function b(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function S(e,t){e._final((function(r){t.pendingcb--,r&&e.emit("error",r),t.prefinished=!0,e.emit("prefinish"),k(e,t)}))}function k(e,t){var r=b(t);return r&&(!function(e,t){t.prefinished||t.finalCalled||("function"!=typeof e._final||t.destroyed?(t.prefinished=!0,e.emit("prefinish")):(t.pendingcb++,t.finalCalled=!0,process.nextTick(S,e,t)))}(e,t),0===t.pendingcb&&(t.finished=!0,e.emit("finish"))),r}r(85870)(B,s),w.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(w.prototype,"buffer",{get:o.deprecate((function(){return this.getBuffer()}),"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(e){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(c=Function.prototype[Symbol.hasInstance],Object.defineProperty(B,Symbol.hasInstance,{value:function(e){return!!c.call(this,e)||this===B&&(e&&e._writableState instanceof w)}})):c=function(e){return e instanceof this},B.prototype.pipe=function(){this.emit("error",new d)},B.prototype.write=function(e,t,r){var n,i=this._writableState,o=!1,s=!i.objectMode&&(n=e,A.isBuffer(n)||n instanceof a);return s&&!A.isBuffer(e)&&(e=function(e){return A.from(e)}(e)),"function"==typeof t&&(r=t,t=null),s?t="buffer":t||(t=i.defaultEncoding),"function"!=typeof r&&(r=y),i.ending?function(e,t){var r=new I;e.emit("error",r),process.nextTick(t,r)}(this,r):(s||function(e,t,r,n){var i;return null===r?i=new E:"string"==typeof r||t.objectMode||(i=new g("chunk",["string","Buffer"],r)),!i||(e.emit("error",i),process.nextTick(n,i),!1)}(this,i,e,r))&&(i.pendingcb++,o=function(e,t,r,n,i,o){if(!r){var s=function(e,t,r){e.objectMode||!1===e.decodeStrings||"string"!=typeof t||(t=A.from(t,r));return t}(t,n,i);n!==s&&(r=!0,i="buffer",n=s)}var a=t.objectMode?1:n.length;t.length+=a;var c=t.length-1))throw new m(e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(B.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(B.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),B.prototype._write=function(e,t,r){r(new f("_write()"))},B.prototype._writev=null,B.prototype.end=function(e,t,r){var n=this._writableState;return"function"==typeof e?(r=e,e=null,t=null):"function"==typeof t&&(r=t,t=null),null!=e&&this.write(e,t),n.corked&&(n.corked=1,this.uncork()),n.ending||function(e,t,r){t.ending=!0,k(e,t),r&&(t.finished?process.nextTick(r):e.once("finish",r));t.ended=!0,e.writable=!1}(this,n,r),this},Object.defineProperty(B.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}}),Object.defineProperty(B.prototype,"destroyed",{enumerable:!1,get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),B.prototype.destroy=u.destroy,B.prototype._undestroy=u.undestroy,B.prototype._destroy=function(e,t){t(e)}},4245:(e,t,r)=>{"use strict";var n;function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var o=r(91327),s=Symbol("lastResolve"),A=Symbol("lastReject"),a=Symbol("error"),c=Symbol("ended"),u=Symbol("lastPromise"),l=Symbol("handlePromise"),h=Symbol("stream");function g(e,t){return{value:e,done:t}}function f(e){var t=e[s];if(null!==t){var r=e[h].read();null!==r&&(e[u]=null,e[s]=null,e[A]=null,t(g(r,!1)))}}function p(e){process.nextTick(f,e)}var d=Object.getPrototypeOf((function(){})),C=Object.setPrototypeOf((i(n={get stream(){return this[h]},next:function(){var e=this,t=this[a];if(null!==t)return Promise.reject(t);if(this[c])return Promise.resolve(g(null,!0));if(this[h].destroyed)return new Promise((function(t,r){process.nextTick((function(){e[a]?r(e[a]):t(g(null,!0))}))}));var r,n=this[u];if(n)r=new Promise(function(e,t){return function(r,n){e.then((function(){t[l](r,n)}),n)}}(n,this));else{var i=this[h].read();if(null!==i)return Promise.resolve(g(i,!1));r=new Promise(this[l])}return this[u]=r,r}},Symbol.asyncIterator,(function(){return this})),i(n,"return",(function(){var e=this;return new Promise((function(t,r){e[h].destroy(null,(function(e){e?r(e):t(g(null,!0))}))}))})),n),d);e.exports=function(e){var t,r=Object.create(C,(i(t={},h,{value:e,writable:!0}),i(t,s,{value:null,writable:!0}),i(t,A,{value:null,writable:!0}),i(t,a,{value:null,writable:!0}),i(t,c,{value:e._readableState.endEmitted,writable:!0}),i(t,u,{value:null,writable:!0}),i(t,l,{value:function(e,t){var n=r[h].read();n?(r[u]=null,r[s]=null,r[A]=null,e(g(n,!1))):(r[s]=e,r[A]=t)},writable:!0}),t));return o(e,(function(e){if(e&&"ERR_STREAM_PREMATURE_CLOSE"!==e.code){var t=r[A];return null!==t&&(r[u]=null,r[s]=null,r[A]=null,t(e)),void(r[a]=e)}var n=r[s];null!==n&&(r[u]=null,r[s]=null,r[A]=null,n(g(null,!0))),r[c]=!0})),e.on("readable",p.bind(null,r)),r}},43117:(e,t,r)=>{"use strict";function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var i=r(64293).Buffer,o=r(31669).inspect,s=o&&o.custom||"inspect";e.exports=function(){function e(){this.head=null,this.tail=null,this.length=0}var t=e.prototype;return t.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},t.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},t.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},t.clear=function(){this.head=this.tail=null,this.length=0},t.join=function(e){if(0===this.length)return"";for(var t=this.head,r=""+t.data;t=t.next;)r+=e+t.data;return r},t.concat=function(e){if(0===this.length)return i.alloc(0);for(var t,r,n,o=i.allocUnsafe(e>>>0),s=this.head,A=0;s;)t=s.data,r=o,n=A,i.prototype.copy.call(t,r,n),A+=s.data.length,s=s.next;return o},t.consume=function(e,t){var r;return ei.length?i.length:e;if(o===i.length?n+=i:n+=i.slice(0,e),0===(e-=o)){o===i.length?(++r,t.next?this.head=t.next:this.head=this.tail=null):(this.head=t,t.data=i.slice(o));break}++r}return this.length-=r,n},t._getBuffer=function(e){var t=i.allocUnsafe(e),r=this.head,n=1;for(r.data.copy(t),e-=r.data.length;r=r.next;){var o=r.data,s=e>o.length?o.length:e;if(o.copy(t,t.length-e,0,s),0===(e-=s)){s===o.length?(++n,r.next?this.head=r.next:this.head=this.tail=null):(this.head=r,r.data=o.slice(s));break}++n}return this.length-=n,t},t[s]=function(e,t){return o(this,function(e){for(var t=1;t{"use strict";function t(e,t){n(e,t),r(e)}function r(e){e._writableState&&!e._writableState.emitClose||e._readableState&&!e._readableState.emitClose||e.emit("close")}function n(e,t){e.emit("error",t)}e.exports={destroy:function(e,i){var o=this,s=this._readableState&&this._readableState.destroyed,A=this._writableState&&this._writableState.destroyed;return s||A?(i?i(e):!e||this._writableState&&this._writableState.errorEmitted||process.nextTick(n,this,e),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(e||null,(function(e){!i&&e?(process.nextTick(t,o,e),o._writableState&&(o._writableState.errorEmitted=!0)):i?(process.nextTick(r,o),i(e)):process.nextTick(r,o)})),this)},undestroy:function(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}}},91327:(e,t,r)=>{"use strict";var n=r(20663).q.ERR_STREAM_PREMATURE_CLOSE;function i(){}e.exports=function e(t,r,o){if("function"==typeof r)return e(t,null,r);r||(r={}),o=function(e){var t=!1;return function(r){t||(t=!0,e.call(this,r))}}(o||i);var s=t._writableState,A=t._readableState,a=r.readable||!1!==r.readable&&t.readable,c=r.writable||!1!==r.writable&&t.writable,u=function(){t.writable||l()},l=function(){c=!1,a||o.call(t)},h=function(){a=!1,c||o.call(t)},g=function(e){o.call(t,e)},f=function(){return(!a||A&&A.ended)&&(!c||s&&s.ended)?void 0:o.call(t,new n)},p=function(){t.req.on("finish",l)};return!function(e){return e.setHeader&&"function"==typeof e.abort}(t)?c&&!s&&(t.on("end",u),t.on("close",u)):(t.on("complete",l),t.on("abort",f),t.req?p():t.on("request",p)),t.on("end",h),t.on("finish",l),!1!==r.error&&t.on("error",g),t.on("close",f),function(){t.removeListener("complete",l),t.removeListener("abort",f),t.removeListener("request",p),t.req&&t.req.removeListener("finish",l),t.removeListener("end",u),t.removeListener("close",u),t.removeListener("finish",l),t.removeListener("end",h),t.removeListener("error",g),t.removeListener("close",f)}}},4939:(e,t,r)=>{"use strict";var n;var i=r(20663).q,o=i.ERR_MISSING_ARGS,s=i.ERR_STREAM_DESTROYED;function A(e){if(e)throw e}function a(e,t,i,o){o=function(e){var t=!1;return function(){t||(t=!0,e.apply(void 0,arguments))}}(o);var A=!1;e.on("close",(function(){A=!0})),void 0===n&&(n=r(91327)),n(e,{readable:t,writable:i},(function(e){if(e)return o(e);A=!0,o()}));var a=!1;return function(t){if(!A&&!a)return a=!0,function(e){return e.setHeader&&"function"==typeof e.abort}(e)?e.abort():"function"==typeof e.destroy?e.destroy():void o(t||new s("pipe"))}}function c(e){e()}function u(e,t){return e.pipe(t)}function l(e){return e.length?"function"!=typeof e[e.length-1]?A:e.pop():A}e.exports=function(){for(var e=arguments.length,t=new Array(e),r=0;r0,(function(e){n||(n=e),e&&s.forEach(c),o||(s.forEach(c),i(n))}))}));return t.reduce(u)}},77433:(e,t,r)=>{"use strict";var n=r(20663).q.ERR_INVALID_OPT_VALUE;e.exports={getHighWaterMark:function(e,t,r,i){var o=function(e,t,r){return null!=e.highWaterMark?e.highWaterMark:t?e[r]:null}(t,i,r);if(null!=o){if(!isFinite(o)||Math.floor(o)!==o||o<0)throw new n(i?r:"highWaterMark",o);return Math.floor(o)}return e.objectMode?16:16384}}},49298:(e,t,r)=>{e.exports=r(92413)},86897:(e,t,r)=>{var n=r(92413);"disable"===process.env.READABLE_STREAM&&n?(e.exports=n.Readable,Object.assign(e.exports,n),e.exports.Stream=n):((t=e.exports=r(58020)).Stream=n||t,t.Readable=t,t.Writable=r(6729),t.Duplex=r(72434),t.Transform=r(54801),t.PassThrough=r(52444),t.finished=r(91327),t.pipeline=r(4939))},19476:(e,t,r)=>{"use strict";const n=r(4016);e.exports=(e={})=>new Promise((t,r)=>{const i=n.connect(e,()=>{e.resolveSocket?(i.off("error",r),t({alpnProtocol:i.alpnProtocol,socket:i})):(i.destroy(),t({alpnProtocol:i.alpnProtocol}))});i.on("error",r)})},48491:(e,t,r)=>{"use strict";const n=r(92413).Readable,i=r(55737);e.exports=class extends n{constructor(e,t,r,n){if("number"!=typeof e)throw new TypeError("Argument `statusCode` should be a number");if("object"!=typeof t)throw new TypeError("Argument `headers` should be an object");if(!(r instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if("string"!=typeof n)throw new TypeError("Argument `url` should be a string");super(),this.statusCode=e,this.headers=i(t),this.body=r,this.url=n}_read(){this.push(this.body),this.push(null)}}},3390:(e,t,r)=>{"use strict";const n=r(90834),i=r(76458);e.exports=n(()=>{i(()=>{process.stderr.write("[?25h")},{alwaysLast:!0})})},2383:e=>{"use strict";e.exports=function(e){var t=new e,r=t;return{get:function(){var n=t;return n.next?t=n.next:(t=new e,r=t),n.next=null,n},release:function(e){r.next=e,r=e}}}},28855:(e,t,r)=>{"use strict";var n=r(61047),i=e.exports=function(e,t){return t=t||function(){},function(){var r=arguments,i=new Promise((function(t,i){var o=!1;const s=function(e){o&&console.warn("Run-async promise already resolved."),o=!0,t(e)};var A=!1;const a=function(e){A&&console.warn("Run-async promise already rejected."),A=!0,i(e)};var c=!1,u=!1,l=!1,h=e.apply({async:function(){return l?(console.warn("Run-async async() called outside a valid run-async context, callback will be ignored."),function(){}):(u&&console.warn("Run-async wrapped function (async) returned a promise.\nCalls to async() callback can have unexpected results."),c=!0,function(e,t){e?a(e):s(t)})}},Array.prototype.slice.call(r));c?n(h)&&console.warn("Run-async wrapped function (sync) returned a promise but async() callback must be executed to resolve."):n(h)?(u=!0,h.then(s,a)):s(h),l=!0}));return i.then(t.bind(null,null),t),i}};i.cb=function(e,t){return i((function(){var t=Array.prototype.slice.call(arguments);return t.length===e.length-1&&t.push(this.async()),e.apply(this,t)}),t)}},69078:e=>{e.exports=function(e,t){var r,n,i,o=!0;Array.isArray(e)?(r=[],n=e.length):(i=Object.keys(e),r={},n=i.length);function s(e){function n(){t&&t(e,r),t=null}o?process.nextTick(n):n()}function A(e,t,i){r[e]=i,(0==--n||t)&&s(t)}n?i?i.forEach((function(t){e[t]((function(e,r){A(t,e,r)}))})):e.forEach((function(e,t){e((function(e,r){A(t,e,r)}))})):s(null);o=!1}},86596:(e,t,r)=>{"use strict";r.r(t),r.d(t,{Observable:()=>n.y,ConnectableObservable:()=>i.c,GroupedObservable:()=>o.T,observable:()=>s.L,Subject:()=>A.xQ,BehaviorSubject:()=>a.X,ReplaySubject:()=>c.t,AsyncSubject:()=>u.c,asapScheduler:()=>l.e,asyncScheduler:()=>h.P,queueScheduler:()=>g.c,animationFrameScheduler:()=>E,VirtualTimeScheduler:()=>I,VirtualAction:()=>m,Scheduler:()=>y.b,Subscription:()=>w.w,Subscriber:()=>B.L,Notification:()=>Q.P,NotificationKind:()=>Q.W,pipe:()=>v.z,noop:()=>D.Z,identity:()=>b.y,isObservable:()=>S,ArgumentOutOfRangeError:()=>k.W,EmptyError:()=>x.K,ObjectUnsubscribedError:()=>F.N,UnsubscriptionError:()=>M.B,TimeoutError:()=>N.W,bindCallback:()=>P,bindNodeCallback:()=>O,combineLatest:()=>J.aj,concat:()=>H.z,defer:()=>q.P,empty:()=>z.c,forkJoin:()=>X,from:()=>V.D,fromEvent:()=>ee,fromEventPattern:()=>te,generate:()=>re,iif:()=>ie,interval:()=>se,merge:()=>ae.T,never:()=>ue,of:()=>le.of,onErrorResumeNext:()=>he,pairs:()=>ge,partition:()=>Ee,race:()=>Ie.S3,range:()=>me,throwError:()=>we._,timer:()=>Be.H,using:()=>Qe,zip:()=>ve.$R,scheduled:()=>De.x,EMPTY:()=>z.E,NEVER:()=>ce,config:()=>be.v});var n=r(98789),i=r(24311),o=r(92564),s=r(68511),A=r(92915),a=r(14753),c=r(52493),u=r(73582),l=r(94097),h=r(59873),g=r(55031),f=r(36370),p=r(99944),d=function(e){function t(t,r){var n=e.call(this,t,r)||this;return n.scheduler=t,n.work=r,n}return f.ZT(t,e),t.prototype.requestAsyncId=function(t,r,n){return void 0===n&&(n=0),null!==n&&n>0?e.prototype.requestAsyncId.call(this,t,r,n):(t.actions.push(this),t.scheduled||(t.scheduled=requestAnimationFrame((function(){return t.flush(null)}))))},t.prototype.recycleAsyncId=function(t,r,n){if(void 0===n&&(n=0),null!==n&&n>0||null===n&&this.delay>0)return e.prototype.recycleAsyncId.call(this,t,r,n);0===t.actions.length&&(cancelAnimationFrame(r),t.scheduled=void 0)},t}(p.o),C=r(43548),E=new(function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f.ZT(t,e),t.prototype.flush=function(e){this.active=!0,this.scheduled=void 0;var t,r=this.actions,n=-1,i=r.length;e=e||r.shift();do{if(t=e.execute(e.state,e.delay))break}while(++nt.index?1:-1:e.delay>t.delay?1:-1},t}(p.o),y=r(42476),w=r(73504),B=r(28732),Q=r(4094),v=r(97836),D=r(57781),b=r(80433);function S(e){return!!e&&(e instanceof n.y||"function"==typeof e.lift&&"function"==typeof e.subscribe)}var k=r(3551),x=r(30943),F=r(90265),M=r(43347),N=r(87299),R=r(98082),K=r(58880),L=r(47182),T=r(64986);function P(e,t,r){if(t){if(!(0,T.K)(t))return function(){for(var n=[],i=0;i1?n.next(Array.prototype.slice.call(arguments)):n.next(e)}),n,r)}))}function te(e,t,r){return r?te(e,t).pipe((0,R.U)((function(e){return(0,L.k)(e)?r.apply(void 0,e):r(e)}))):new n.y((function(r){var n,i=function(){for(var e=[],t=0;t=t){n.complete();break}if(n.next(o++),n.closed)break}}))}function ye(e){var t=e.start,r=e.index,n=e.count,i=e.subscriber;r>=n?i.complete():(i.next(t),i.closed||(e.index=r+1,e.start=t+1,this.schedule(e)))}var we=r(9491),Be=r(13028);function Qe(e,t){return new n.y((function(r){var n,i;try{n=e()}catch(e){return void r.error(e)}try{i=t(n)}catch(e){return void r.error(e)}var o=(i?(0,V.D)(i):z.E).subscribe(r);return function(){o.unsubscribe(),n&&n.unsubscribe()}}))}var ve=r(21336),De=r(14109),be=r(21894)},73582:(e,t,r)=>{"use strict";r.d(t,{c:()=>s});var n=r(36370),i=r(92915),o=r(73504),s=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.value=null,t.hasNext=!1,t.hasCompleted=!1,t}return n.ZT(t,e),t.prototype._subscribe=function(t){return this.hasError?(t.error(this.thrownError),o.w.EMPTY):this.hasCompleted&&this.hasNext?(t.next(this.value),t.complete(),o.w.EMPTY):e.prototype._subscribe.call(this,t)},t.prototype.next=function(e){this.hasCompleted||(this.value=e,this.hasNext=!0)},t.prototype.error=function(t){this.hasCompleted||e.prototype.error.call(this,t)},t.prototype.complete=function(){this.hasCompleted=!0,this.hasNext&&e.prototype.next.call(this,this.value),e.prototype.complete.call(this)},t}(i.xQ)},14753:(e,t,r)=>{"use strict";r.d(t,{X:()=>s});var n=r(36370),i=r(92915),o=r(90265),s=function(e){function t(t){var r=e.call(this)||this;return r._value=t,r}return n.ZT(t,e),Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!0,configurable:!0}),t.prototype._subscribe=function(t){var r=e.prototype._subscribe.call(this,t);return r&&!r.closed&&t.next(this._value),r},t.prototype.getValue=function(){if(this.hasError)throw this.thrownError;if(this.closed)throw new o.N;return this._value},t.prototype.next=function(t){e.prototype.next.call(this,this._value=t)},t}(i.xQ)},28907:(e,t,r)=>{"use strict";r.d(t,{d:()=>i});var n=r(36370),i=function(e){function t(t,r,n){var i=e.call(this)||this;return i.parent=t,i.outerValue=r,i.outerIndex=n,i.index=0,i}return n.ZT(t,e),t.prototype._next=function(e){this.parent.notifyNext(this.outerValue,e,this.outerIndex,this.index++,this)},t.prototype._error=function(e){this.parent.notifyError(e,this),this.unsubscribe()},t.prototype._complete=function(){this.parent.notifyComplete(this),this.unsubscribe()},t}(r(28732).L)},4094:(e,t,r)=>{"use strict";r.d(t,{W:()=>n,P:()=>A});var n,i=r(61775),o=r(29686),s=r(9491);n||(n={});var A=function(){function e(e,t,r){this.kind=e,this.value=t,this.error=r,this.hasValue="N"===e}return e.prototype.observe=function(e){switch(this.kind){case"N":return e.next&&e.next(this.value);case"E":return e.error&&e.error(this.error);case"C":return e.complete&&e.complete()}},e.prototype.do=function(e,t,r){switch(this.kind){case"N":return e&&e(this.value);case"E":return t&&t(this.error);case"C":return r&&r()}},e.prototype.accept=function(e,t,r){return e&&"function"==typeof e.next?this.observe(e):this.do(e,t,r)},e.prototype.toObservable=function(){switch(this.kind){case"N":return(0,o.of)(this.value);case"E":return(0,s._)(this.error);case"C":return(0,i.c)()}throw new Error("unexpected notification kind value")},e.createNext=function(t){return void 0!==t?new e("N",t):e.undefinedValueNotification},e.createError=function(t){return new e("E",void 0,t)},e.createComplete=function(){return e.completeNotification},e.completeNotification=new e("C"),e.undefinedValueNotification=new e("N",void 0),e}()},98789:(e,t,r)=>{"use strict";r.d(t,{y:()=>u});var n=r(58880),i=r(28732),o=r(92515),s=r(32103);var A=r(68511),a=r(97836),c=r(21894),u=function(){function e(e){this._isScalar=!1,e&&(this._subscribe=e)}return e.prototype.lift=function(t){var r=new e;return r.source=this,r.operator=t,r},e.prototype.subscribe=function(e,t,r){var n=this.operator,A=function(e,t,r){if(e){if(e instanceof i.L)return e;if(e[o.b])return e[o.b]()}return e||t||r?new i.L(e,t,r):new i.L(s.c)}(e,t,r);if(n?A.add(n.call(A,this.source)):A.add(this.source||c.v.useDeprecatedSynchronousErrorHandling&&!A.syncErrorThrowable?this._subscribe(A):this._trySubscribe(A)),c.v.useDeprecatedSynchronousErrorHandling&&A.syncErrorThrowable&&(A.syncErrorThrowable=!1,A.syncErrorThrown))throw A.syncErrorValue;return A},e.prototype._trySubscribe=function(e){try{return this._subscribe(e)}catch(t){c.v.useDeprecatedSynchronousErrorHandling&&(e.syncErrorThrown=!0,e.syncErrorValue=t),(0,n._)(e)?e.error(t):console.warn(t)}},e.prototype.forEach=function(e,t){var r=this;return new(t=l(t))((function(t,n){var i;i=r.subscribe((function(t){try{e(t)}catch(e){n(e),i&&i.unsubscribe()}}),n,t)}))},e.prototype._subscribe=function(e){var t=this.source;return t&&t.subscribe(e)},e.prototype[A.L]=function(){return this},e.prototype.pipe=function(){for(var e=[],t=0;t{"use strict";r.d(t,{c:()=>o});var n=r(21894),i=r(13109),o={closed:!0,next:function(e){},error:function(e){if(n.v.useDeprecatedSynchronousErrorHandling)throw e;(0,i.z)(e)},complete:function(){}}},20242:(e,t,r)=>{"use strict";r.d(t,{L:()=>i});var n=r(36370),i=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n.ZT(t,e),t.prototype.notifyNext=function(e,t,r,n,i){this.destination.next(t)},t.prototype.notifyError=function(e,t){this.destination.error(e)},t.prototype.notifyComplete=function(e){this.destination.complete()},t}(r(28732).L)},52493:(e,t,r)=>{"use strict";r.d(t,{t:()=>u});var n=r(36370),i=r(92915),o=r(55031),s=r(73504),A=r(32746),a=r(90265),c=r(73066),u=function(e){function t(t,r,n){void 0===t&&(t=Number.POSITIVE_INFINITY),void 0===r&&(r=Number.POSITIVE_INFINITY);var i=e.call(this)||this;return i.scheduler=n,i._events=[],i._infiniteTimeWindow=!1,i._bufferSize=t<1?1:t,i._windowTime=r<1?1:r,r===Number.POSITIVE_INFINITY?(i._infiniteTimeWindow=!0,i.next=i.nextInfiniteTimeWindow):i.next=i.nextTimeWindow,i}return n.ZT(t,e),t.prototype.nextInfiniteTimeWindow=function(t){var r=this._events;r.push(t),r.length>this._bufferSize&&r.shift(),e.prototype.next.call(this,t)},t.prototype.nextTimeWindow=function(t){this._events.push(new l(this._getNow(),t)),this._trimBufferThenGetEvents(),e.prototype.next.call(this,t)},t.prototype._subscribe=function(e){var t,r=this._infiniteTimeWindow,n=r?this._events:this._trimBufferThenGetEvents(),i=this.scheduler,o=n.length;if(this.closed)throw new a.N;if(this.isStopped||this.hasError?t=s.w.EMPTY:(this.observers.push(e),t=new c.W(this,e)),i&&e.add(e=new A.ht(e,i)),r)for(var u=0;ut&&(o=Math.max(o,i-t)),o>0&&n.splice(0,o),n},t}(i.xQ),l=function(){return function(e,t){this.time=e,this.value=t}}()},42476:(e,t,r)=>{"use strict";r.d(t,{b:()=>n});var n=function(){function e(t,r){void 0===r&&(r=e.now),this.SchedulerAction=t,this.now=r}return e.prototype.schedule=function(e,t,r){return void 0===t&&(t=0),new this.SchedulerAction(this,e).schedule(r,t)},e.now=function(){return Date.now()},e}()},92915:(e,t,r)=>{"use strict";r.d(t,{Yc:()=>u,xQ:()=>l});var n=r(36370),i=r(98789),o=r(28732),s=r(73504),A=r(90265),a=r(73066),c=r(92515),u=function(e){function t(t){var r=e.call(this,t)||this;return r.destination=t,r}return n.ZT(t,e),t}(o.L),l=function(e){function t(){var t=e.call(this)||this;return t.observers=[],t.closed=!1,t.isStopped=!1,t.hasError=!1,t.thrownError=null,t}return n.ZT(t,e),t.prototype[c.b]=function(){return new u(this)},t.prototype.lift=function(e){var t=new h(this,this);return t.operator=e,t},t.prototype.next=function(e){if(this.closed)throw new A.N;if(!this.isStopped)for(var t=this.observers,r=t.length,n=t.slice(),i=0;i{"use strict";r.d(t,{W:()=>i});var n=r(36370),i=function(e){function t(t,r){var n=e.call(this)||this;return n.subject=t,n.subscriber=r,n.closed=!1,n}return n.ZT(t,e),t.prototype.unsubscribe=function(){if(!this.closed){this.closed=!0;var e=this.subject,t=e.observers;if(this.subject=null,t&&0!==t.length&&!e.isStopped&&!e.closed){var r=t.indexOf(this.subscriber);-1!==r&&t.splice(r,1)}}},t}(r(73504).w)},28732:(e,t,r)=>{"use strict";r.d(t,{L:()=>u});var n=r(36370),i=r(38394),o=r(32103),s=r(73504),A=r(92515),a=r(21894),c=r(13109),u=function(e){function t(r,n,i){var s=e.call(this)||this;switch(s.syncErrorValue=null,s.syncErrorThrown=!1,s.syncErrorThrowable=!1,s.isStopped=!1,arguments.length){case 0:s.destination=o.c;break;case 1:if(!r){s.destination=o.c;break}if("object"==typeof r){r instanceof t?(s.syncErrorThrowable=r.syncErrorThrowable,s.destination=r,r.add(s)):(s.syncErrorThrowable=!0,s.destination=new l(s,r));break}default:s.syncErrorThrowable=!0,s.destination=new l(s,r,n,i)}return s}return n.ZT(t,e),t.prototype[A.b]=function(){return this},t.create=function(e,r,n){var i=new t(e,r,n);return i.syncErrorThrowable=!1,i},t.prototype.next=function(e){this.isStopped||this._next(e)},t.prototype.error=function(e){this.isStopped||(this.isStopped=!0,this._error(e))},t.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())},t.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,e.prototype.unsubscribe.call(this))},t.prototype._next=function(e){this.destination.next(e)},t.prototype._error=function(e){this.destination.error(e),this.unsubscribe()},t.prototype._complete=function(){this.destination.complete(),this.unsubscribe()},t.prototype._unsubscribeAndRecycle=function(){var e=this._parentOrParents;return this._parentOrParents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parentOrParents=e,this},t}(s.w),l=function(e){function t(t,r,n,s){var A,a=e.call(this)||this;a._parentSubscriber=t;var c=a;return(0,i.m)(r)?A=r:r&&(A=r.next,n=r.error,s=r.complete,r!==o.c&&(c=Object.create(r),(0,i.m)(c.unsubscribe)&&a.add(c.unsubscribe.bind(c)),c.unsubscribe=a.unsubscribe.bind(a))),a._context=c,a._next=A,a._error=n,a._complete=s,a}return n.ZT(t,e),t.prototype.next=function(e){if(!this.isStopped&&this._next){var t=this._parentSubscriber;a.v.useDeprecatedSynchronousErrorHandling&&t.syncErrorThrowable?this.__tryOrSetError(t,this._next,e)&&this.unsubscribe():this.__tryOrUnsub(this._next,e)}},t.prototype.error=function(e){if(!this.isStopped){var t=this._parentSubscriber,r=a.v.useDeprecatedSynchronousErrorHandling;if(this._error)r&&t.syncErrorThrowable?(this.__tryOrSetError(t,this._error,e),this.unsubscribe()):(this.__tryOrUnsub(this._error,e),this.unsubscribe());else if(t.syncErrorThrowable)r?(t.syncErrorValue=e,t.syncErrorThrown=!0):(0,c.z)(e),this.unsubscribe();else{if(this.unsubscribe(),r)throw e;(0,c.z)(e)}}},t.prototype.complete=function(){var e=this;if(!this.isStopped){var t=this._parentSubscriber;if(this._complete){var r=function(){return e._complete.call(e._context)};a.v.useDeprecatedSynchronousErrorHandling&&t.syncErrorThrowable?(this.__tryOrSetError(t,r),this.unsubscribe()):(this.__tryOrUnsub(r),this.unsubscribe())}else this.unsubscribe()}},t.prototype.__tryOrUnsub=function(e,t){try{e.call(this._context,t)}catch(e){if(this.unsubscribe(),a.v.useDeprecatedSynchronousErrorHandling)throw e;(0,c.z)(e)}},t.prototype.__tryOrSetError=function(e,t,r){if(!a.v.useDeprecatedSynchronousErrorHandling)throw new Error("bad call");try{t.call(this._context,r)}catch(t){return a.v.useDeprecatedSynchronousErrorHandling?(e.syncErrorValue=t,e.syncErrorThrown=!0,!0):((0,c.z)(t),!0)}return!1},t.prototype._unsubscribe=function(){var e=this._parentSubscriber;this._context=null,this._parentSubscriber=null,e.unsubscribe()},t}(u)},73504:(e,t,r)=>{"use strict";r.d(t,{w:()=>A});var n=r(47182),i=r(29929),o=r(38394),s=r(43347),A=function(){function e(e){this.closed=!1,this._parentOrParents=null,this._subscriptions=null,e&&(this._unsubscribe=e)}var t;return e.prototype.unsubscribe=function(){var t;if(!this.closed){var r=this._parentOrParents,A=this._unsubscribe,c=this._subscriptions;if(this.closed=!0,this._parentOrParents=null,this._subscriptions=null,r instanceof e)r.remove(this);else if(null!==r)for(var u=0;u{"use strict";r.d(t,{v:()=>i});var n=!1,i={Promise:void 0,set useDeprecatedSynchronousErrorHandling(e){e&&(new Error).stack;n=e},get useDeprecatedSynchronousErrorHandling(){return n}}},24311:(e,t,r)=>{"use strict";r.d(t,{c:()=>c,N:()=>u});var n=r(36370),i=r(92915),o=r(98789),s=r(28732),A=r(73504),a=r(97566),c=function(e){function t(t,r){var n=e.call(this)||this;return n.source=t,n.subjectFactory=r,n._refCount=0,n._isComplete=!1,n}return n.ZT(t,e),t.prototype._subscribe=function(e){return this.getSubject().subscribe(e)},t.prototype.getSubject=function(){var e=this._subject;return e&&!e.isStopped||(this._subject=this.subjectFactory()),this._subject},t.prototype.connect=function(){var e=this._connection;return e||(this._isComplete=!1,(e=this._connection=new A.w).add(this.source.subscribe(new l(this.getSubject(),this))),e.closed&&(this._connection=null,e=A.w.EMPTY)),e},t.prototype.refCount=function(){return(0,a.x)()(this)},t}(o.y),u=function(){var e=c.prototype;return{operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:e._subscribe},_isComplete:{value:e._isComplete,writable:!0},getSubject:{value:e.getSubject},connect:{value:e.connect},refCount:{value:e.refCount}}}(),l=function(e){function t(t,r){var n=e.call(this,t)||this;return n.connectable=r,n}return n.ZT(t,e),t.prototype._error=function(t){this._unsubscribe(),e.prototype._error.call(this,t)},t.prototype._complete=function(){this.connectable._isComplete=!0,this._unsubscribe(),e.prototype._complete.call(this)},t.prototype._unsubscribe=function(){var e=this.connectable;if(e){this.connectable=null;var t=e._connection;e._refCount=0,e._subject=null,e._connection=null,t&&t.unsubscribe()}},t}(i.Yc);s.L},20995:(e,t,r)=>{"use strict";r.d(t,{aj:()=>u,Ms:()=>l});var n=r(36370),i=r(64986),o=r(47182),s=r(20242),A=r(93590),a=r(56329),c={};function u(){for(var e=[],t=0;t{"use strict";r.d(t,{z:()=>o});var n=r(29686),i=r(37339);function o(){for(var e=[],t=0;t{"use strict";r.d(t,{P:()=>s});var n=r(98789),i=r(85861),o=r(61775);function s(e){return new n.y((function(t){var r;try{r=e()}catch(e){return void t.error(e)}return(r?(0,i.D)(r):(0,o.c)()).subscribe(t)}))}},61775:(e,t,r)=>{"use strict";r.d(t,{E:()=>i,c:()=>o});var n=r(98789),i=new n.y((function(e){return e.complete()}));function o(e){return e?function(e){return new n.y((function(t){return e.schedule((function(){return t.complete()}))}))}(e):i}},85861:(e,t,r)=>{"use strict";r.d(t,{D:()=>s});var n=r(98789),i=r(92402),o=r(14109);function s(e,t){return t?(0,o.x)(e,t):e instanceof n.y?e:new n.y((0,i.s)(e))}},56329:(e,t,r)=>{"use strict";r.d(t,{n:()=>s});var n=r(98789),i=r(22335),o=r(59430);function s(e,t){return t?(0,o.r)(e,t):new n.y((0,i.V)(e))}},80810:(e,t,r)=>{"use strict";r.d(t,{T:()=>A});var n=r(98789),i=r(64986),o=r(66852),s=r(56329);function A(){for(var e=[],t=0;t1&&"number"==typeof e[e.length-1]&&(r=e.pop())):"number"==typeof a&&(r=e.pop()),null===A&&1===e.length&&e[0]instanceof n.y?e[0]:(0,o.J)(r)((0,s.n)(e,A))}},29686:(e,t,r)=>{"use strict";r.d(t,{of:()=>s});var n=r(64986),i=r(56329),o=r(59430);function s(){for(var e=[],t=0;t{"use strict";r.d(t,{S3:()=>a});var n=r(36370),i=r(47182),o=r(56329),s=r(20242),A=r(93590);function a(){for(var e=[],t=0;t{"use strict";r.d(t,{_:()=>i});var n=r(98789);function i(e,t){return t?new n.y((function(r){return t.schedule(o,0,{error:e,subscriber:r})})):new n.y((function(t){return t.error(e)}))}function o(e){var t=e.error;e.subscriber.error(t)}},13028:(e,t,r)=>{"use strict";r.d(t,{H:()=>A});var n=r(98789),i=r(59873),o=r(23820),s=r(64986);function A(e,t,r){void 0===e&&(e=0);var A=-1;return(0,o.k)(t)?A=Number(t)<1?1:Number(t):(0,s.K)(t)&&(r=t),(0,s.K)(r)||(r=i.P),new n.y((function(t){var n=(0,o.k)(e)?e:+e-r.now();return r.schedule(a,n,{index:0,period:A,subscriber:t})}))}function a(e){var t=e.index,r=e.period,n=e.subscriber;if(n.next(t),!n.closed){if(-1===r)return n.complete();e.index=t+1,this.schedule(e,r)}}},21336:(e,t,r)=>{"use strict";r.d(t,{$R:()=>u,mx:()=>l});var n=r(36370),i=r(56329),o=r(47182),s=r(28732),A=r(20242),a=r(93590),c=r(8094);function u(){for(var e=[],t=0;tthis.index},e.prototype.hasCompleted=function(){return this.array.length===this.index},e}(),p=function(e){function t(t,r,n){var i=e.call(this,t)||this;return i.parent=r,i.observable=n,i.stillUnsubscribed=!0,i.buffer=[],i.isComplete=!1,i}return n.ZT(t,e),t.prototype[c.hZ]=function(){return this},t.prototype.next=function(){var e=this.buffer;return 0===e.length&&this.isComplete?{value:null,done:!0}:{value:e.shift(),done:!1}},t.prototype.hasValue=function(){return this.buffer.length>0},t.prototype.hasCompleted=function(){return 0===this.buffer.length&&this.isComplete},t.prototype.notifyComplete=function(){this.buffer.length>0?(this.isComplete=!0,this.parent.notifyInactive()):this.destination.complete()},t.prototype.notifyNext=function(e,t,r,n,i){this.buffer.push(t),this.parent.checkIterators()},t.prototype.subscribe=function(e,t){return(0,a.D)(this,this.observable,this,t)},t}(A.L)},37339:(e,t,r)=>{"use strict";r.d(t,{u:()=>i});var n=r(66852);function i(){return(0,n.J)(1)}},39063:(e,t,r)=>{"use strict";r.d(t,{h:()=>o});var n=r(36370),i=r(28732);function o(e,t){return function(r){return r.lift(new s(e,t))}}var s=function(){function e(e,t){this.predicate=e,this.thisArg=t}return e.prototype.call=function(e,t){return t.subscribe(new A(e,this.predicate,this.thisArg))},e}(),A=function(e){function t(t,r,n){var i=e.call(this,t)||this;return i.predicate=r,i.thisArg=n,i.count=0,i}return n.ZT(t,e),t.prototype._next=function(e){var t;try{t=this.predicate.call(this.thisArg,e,this.count++)}catch(e){return void this.destination.error(e)}t&&this.destination.next(e)},t}(i.L)},92564:(e,t,r)=>{"use strict";r.d(t,{v:()=>a,T:()=>h});var n=r(36370),i=r(28732),o=r(73504),s=r(98789),A=r(92915);function a(e,t,r,n){return function(i){return i.lift(new c(e,t,r,n))}}var c=function(){function e(e,t,r,n){this.keySelector=e,this.elementSelector=t,this.durationSelector=r,this.subjectSelector=n}return e.prototype.call=function(e,t){return t.subscribe(new u(e,this.keySelector,this.elementSelector,this.durationSelector,this.subjectSelector))},e}(),u=function(e){function t(t,r,n,i,o){var s=e.call(this,t)||this;return s.keySelector=r,s.elementSelector=n,s.durationSelector=i,s.subjectSelector=o,s.groups=null,s.attemptedToUnsubscribe=!1,s.count=0,s}return n.ZT(t,e),t.prototype._next=function(e){var t;try{t=this.keySelector(e)}catch(e){return void this.error(e)}this._group(e,t)},t.prototype._group=function(e,t){var r=this.groups;r||(r=this.groups=new Map);var n,i=r.get(t);if(this.elementSelector)try{n=this.elementSelector(e)}catch(e){this.error(e)}else n=e;if(!i){i=this.subjectSelector?this.subjectSelector():new A.xQ,r.set(t,i);var o=new h(t,i,this);if(this.destination.next(o),this.durationSelector){var s=void 0;try{s=this.durationSelector(new h(t,i))}catch(e){return void this.error(e)}this.add(s.subscribe(new l(t,i,this)))}}i.closed||i.next(n)},t.prototype._error=function(e){var t=this.groups;t&&(t.forEach((function(t,r){t.error(e)})),t.clear()),this.destination.error(e)},t.prototype._complete=function(){var e=this.groups;e&&(e.forEach((function(e,t){e.complete()})),e.clear()),this.destination.complete()},t.prototype.removeGroup=function(e){this.groups.delete(e)},t.prototype.unsubscribe=function(){this.closed||(this.attemptedToUnsubscribe=!0,0===this.count&&e.prototype.unsubscribe.call(this))},t}(i.L),l=function(e){function t(t,r,n){var i=e.call(this,r)||this;return i.key=t,i.group=r,i.parent=n,i}return n.ZT(t,e),t.prototype._next=function(e){this.complete()},t.prototype._unsubscribe=function(){var e=this.parent,t=this.key;this.key=this.parent=null,e&&e.removeGroup(t)},t}(i.L),h=function(e){function t(t,r,n){var i=e.call(this)||this;return i.key=t,i.groupSubject=r,i.refCountSubscription=n,i}return n.ZT(t,e),t.prototype._subscribe=function(e){var t=new o.w,r=this.refCountSubscription,n=this.groupSubject;return r&&!r.closed&&t.add(new g(r)),t.add(n.subscribe(e)),t},t}(s.y),g=function(e){function t(t){var r=e.call(this)||this;return r.parent=t,t.count++,r}return n.ZT(t,e),t.prototype.unsubscribe=function(){var t=this.parent;t.closed||this.closed||(e.prototype.unsubscribe.call(this),t.count-=1,0===t.count&&t.attemptedToUnsubscribe&&t.unsubscribe())},t}(o.w)},98082:(e,t,r)=>{"use strict";r.d(t,{U:()=>o});var n=r(36370),i=r(28732);function o(e,t){return function(r){if("function"!=typeof e)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return r.lift(new s(e,t))}}var s=function(){function e(e,t){this.project=e,this.thisArg=t}return e.prototype.call=function(e,t){return t.subscribe(new A(e,this.project,this.thisArg))},e}(),A=function(e){function t(t,r,n){var i=e.call(this,t)||this;return i.project=r,i.count=0,i.thisArg=n||i,i}return n.ZT(t,e),t.prototype._next=function(e){var t;try{t=this.project.call(this.thisArg,e,this.count++)}catch(e){return void this.destination.error(e)}this.destination.next(t)},t}(i.L)},66852:(e,t,r)=>{"use strict";r.d(t,{J:()=>o});var n=r(20259),i=r(80433);function o(e){return void 0===e&&(e=Number.POSITIVE_INFINITY),(0,n.zg)(i.y,e)}},20259:(e,t,r)=>{"use strict";r.d(t,{zg:()=>c});var n=r(36370),i=r(93590),o=r(20242),s=r(28907),A=r(98082),a=r(85861);function c(e,t,r){return void 0===r&&(r=Number.POSITIVE_INFINITY),"function"==typeof t?function(n){return n.pipe(c((function(r,n){return(0,a.D)(e(r,n)).pipe((0,A.U)((function(e,i){return t(r,e,n,i)})))}),r))}:("number"==typeof t&&(r=t),function(t){return t.lift(new u(e,r))})}var u=function(){function e(e,t){void 0===t&&(t=Number.POSITIVE_INFINITY),this.project=e,this.concurrent=t}return e.prototype.call=function(e,t){return t.subscribe(new l(e,this.project,this.concurrent))},e}(),l=function(e){function t(t,r,n){void 0===n&&(n=Number.POSITIVE_INFINITY);var i=e.call(this,t)||this;return i.project=r,i.concurrent=n,i.hasCompleted=!1,i.buffer=[],i.active=0,i.index=0,i}return n.ZT(t,e),t.prototype._next=function(e){this.active0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},t}(o.L)},32746:(e,t,r)=>{"use strict";r.d(t,{QV:()=>s,ht:()=>a});var n=r(36370),i=r(28732),o=r(4094);function s(e,t){return void 0===t&&(t=0),function(r){return r.lift(new A(e,t))}}var A=function(){function e(e,t){void 0===t&&(t=0),this.scheduler=e,this.delay=t}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.scheduler,this.delay))},e}(),a=function(e){function t(t,r,n){void 0===n&&(n=0);var i=e.call(this,t)||this;return i.scheduler=r,i.delay=n,i}return n.ZT(t,e),t.dispatch=function(e){var t=e.notification,r=e.destination;t.observe(r),this.unsubscribe()},t.prototype.scheduleMessage=function(e){this.destination.add(this.scheduler.schedule(t.dispatch,this.delay,new c(e,this.destination)))},t.prototype._next=function(e){this.scheduleMessage(o.P.createNext(e))},t.prototype._error=function(e){this.scheduleMessage(o.P.createError(e)),this.unsubscribe()},t.prototype._complete=function(){this.scheduleMessage(o.P.createComplete()),this.unsubscribe()},t}(i.L),c=function(){return function(e,t){this.notification=e,this.destination=t}}()},97566:(e,t,r)=>{"use strict";r.d(t,{x:()=>o});var n=r(36370),i=r(28732);function o(){return function(e){return e.lift(new s(e))}}var s=function(){function e(e){this.connectable=e}return e.prototype.call=function(e,t){var r=this.connectable;r._refCount++;var n=new A(e,r),i=t.subscribe(n);return n.closed||(n.connection=r.connect()),i},e}(),A=function(e){function t(t,r){var n=e.call(this,t)||this;return n.connectable=r,n}return n.ZT(t,e),t.prototype._unsubscribe=function(){var e=this.connectable;if(e){this.connectable=null;var t=e._refCount;if(t<=0)this.connection=null;else if(e._refCount=t-1,t>1)this.connection=null;else{var r=this.connection,n=e._connection;this.connection=null,!n||r&&n!==r||n.unsubscribe()}}else this.connection=null},t}(i.L)},59430:(e,t,r)=>{"use strict";r.d(t,{r:()=>o});var n=r(98789),i=r(73504);function o(e,t){return new n.y((function(r){var n=new i.w,o=0;return n.add(t.schedule((function(){o!==e.length?(r.next(e[o++]),r.closed||n.add(this.schedule())):r.complete()}))),n}))}},14109:(e,t,r)=>{"use strict";r.d(t,{x:()=>u});var n=r(98789),i=r(73504),o=r(68511);var s=r(59430),A=r(8094);var a=r(79886),c=r(61997);function u(e,t){if(null!=e){if(function(e){return e&&"function"==typeof e[o.L]}(e))return function(e,t){return new n.y((function(r){var n=new i.w;return n.add(t.schedule((function(){var i=e[o.L]();n.add(i.subscribe({next:function(e){n.add(t.schedule((function(){return r.next(e)})))},error:function(e){n.add(t.schedule((function(){return r.error(e)})))},complete:function(){n.add(t.schedule((function(){return r.complete()})))}}))}))),n}))}(e,t);if((0,a.t)(e))return function(e,t){return new n.y((function(r){var n=new i.w;return n.add(t.schedule((function(){return e.then((function(e){n.add(t.schedule((function(){r.next(e),n.add(t.schedule((function(){return r.complete()})))})))}),(function(e){n.add(t.schedule((function(){return r.error(e)})))}))}))),n}))}(e,t);if((0,c.z)(e))return(0,s.r)(e,t);if(function(e){return e&&"function"==typeof e[A.hZ]}(e)||"string"==typeof e)return function(e,t){if(!e)throw new Error("Iterable cannot be null");return new n.y((function(r){var n,o=new i.w;return o.add((function(){n&&"function"==typeof n.return&&n.return()})),o.add(t.schedule((function(){n=e[A.hZ](),o.add(t.schedule((function(){if(!r.closed){var e,t;try{var i=n.next();e=i.value,t=i.done}catch(e){return void r.error(e)}t?r.complete():(r.next(e),this.schedule())}})))}))),o}))}(e,t)}throw new TypeError((null!==e&&typeof e||e)+" is not observable")}},99944:(e,t,r)=>{"use strict";r.d(t,{o:()=>i});var n=r(36370),i=function(e){function t(t,r){var n=e.call(this,t,r)||this;return n.scheduler=t,n.work=r,n.pending=!1,n}return n.ZT(t,e),t.prototype.schedule=function(e,t){if(void 0===t&&(t=0),this.closed)return this;this.state=e;var r=this.id,n=this.scheduler;return null!=r&&(this.id=this.recycleAsyncId(n,r,t)),this.pending=!0,this.delay=t,this.id=this.id||this.requestAsyncId(n,this.id,t),this},t.prototype.requestAsyncId=function(e,t,r){return void 0===r&&(r=0),setInterval(e.flush.bind(e,this),r)},t.prototype.recycleAsyncId=function(e,t,r){if(void 0===r&&(r=0),null!==r&&this.delay===r&&!1===this.pending)return t;clearInterval(t)},t.prototype.execute=function(e,t){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var r=this._execute(e,t);if(r)return r;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},t.prototype._execute=function(e,t){var r=!1,n=void 0;try{this.work(e)}catch(e){r=!0,n=!!e&&e||new Error(e)}if(r)return this.unsubscribe(),n},t.prototype._unsubscribe=function(){var e=this.id,t=this.scheduler,r=t.actions,n=r.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==n&&r.splice(n,1),null!=e&&(this.id=this.recycleAsyncId(t,e,null)),this.delay=null},t}(function(e){function t(t,r){return e.call(this)||this}return n.ZT(t,e),t.prototype.schedule=function(e,t){return void 0===t&&(t=0),this},t}(r(73504).w))},43548:(e,t,r)=>{"use strict";r.d(t,{v:()=>o});var n=r(36370),i=r(42476),o=function(e){function t(r,n){void 0===n&&(n=i.b.now);var o=e.call(this,r,(function(){return t.delegate&&t.delegate!==o?t.delegate.now():n()}))||this;return o.actions=[],o.active=!1,o.scheduled=void 0,o}return n.ZT(t,e),t.prototype.schedule=function(r,n,i){return void 0===n&&(n=0),t.delegate&&t.delegate!==this?t.delegate.schedule(r,n,i):e.prototype.schedule.call(this,r,n,i)},t.prototype.flush=function(e){var t=this.actions;if(this.active)t.push(e);else{var r;this.active=!0;do{if(r=e.execute(e.state,e.delay))break}while(e=t.shift());if(this.active=!1,r){for(;e=t.shift();)e.unsubscribe();throw r}}},t}(i.b)},94097:(e,t,r)=>{"use strict";r.d(t,{e:()=>l});var n=r(36370),i=1,o=function(){return Promise.resolve()}(),s={};function A(e){return e in s&&(delete s[e],!0)}var a=function(e){var t=i++;return s[t]=!0,o.then((function(){return A(t)&&e()})),t},c=function(e){A(e)},u=function(e){function t(t,r){var n=e.call(this,t,r)||this;return n.scheduler=t,n.work=r,n}return n.ZT(t,e),t.prototype.requestAsyncId=function(t,r,n){return void 0===n&&(n=0),null!==n&&n>0?e.prototype.requestAsyncId.call(this,t,r,n):(t.actions.push(this),t.scheduled||(t.scheduled=a(t.flush.bind(t,null))))},t.prototype.recycleAsyncId=function(t,r,n){if(void 0===n&&(n=0),null!==n&&n>0||null===n&&this.delay>0)return e.prototype.recycleAsyncId.call(this,t,r,n);0===t.actions.length&&(c(r),t.scheduled=void 0)},t}(r(99944).o),l=new(function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n.ZT(t,e),t.prototype.flush=function(e){this.active=!0,this.scheduled=void 0;var t,r=this.actions,n=-1,i=r.length;e=e||r.shift();do{if(t=e.execute(e.state,e.delay))break}while(++n{"use strict";r.d(t,{P:()=>i});var n=r(99944),i=new(r(43548).v)(n.o)},55031:(e,t,r)=>{"use strict";r.d(t,{c:()=>o});var n=r(36370),i=function(e){function t(t,r){var n=e.call(this,t,r)||this;return n.scheduler=t,n.work=r,n}return n.ZT(t,e),t.prototype.schedule=function(t,r){return void 0===r&&(r=0),r>0?e.prototype.schedule.call(this,t,r):(this.delay=r,this.state=t,this.scheduler.flush(this),this)},t.prototype.execute=function(t,r){return r>0||this.closed?e.prototype.execute.call(this,t,r):this._execute(t,r)},t.prototype.requestAsyncId=function(t,r,n){return void 0===n&&(n=0),null!==n&&n>0||null===n&&this.delay>0?e.prototype.requestAsyncId.call(this,t,r,n):t.flush(this)},t}(r(99944).o),o=new(function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n.ZT(t,e),t}(r(43548).v))(i)},8094:(e,t,r)=>{"use strict";function n(){return"function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator"}r.d(t,{hZ:()=>i});var i=n()},68511:(e,t,r)=>{"use strict";r.d(t,{L:()=>n});var n=function(){return"function"==typeof Symbol&&Symbol.observable||"@@observable"}()},92515:(e,t,r)=>{"use strict";r.d(t,{b:()=>n});var n=function(){return"function"==typeof Symbol?Symbol("rxSubscriber"):"@@rxSubscriber_"+Math.random()}()},3551:(e,t,r)=>{"use strict";r.d(t,{W:()=>n});var n=function(){function e(){return Error.call(this),this.message="argument out of range",this.name="ArgumentOutOfRangeError",this}return e.prototype=Object.create(Error.prototype),e}()},30943:(e,t,r)=>{"use strict";r.d(t,{K:()=>n});var n=function(){function e(){return Error.call(this),this.message="no elements in sequence",this.name="EmptyError",this}return e.prototype=Object.create(Error.prototype),e}()},90265:(e,t,r)=>{"use strict";r.d(t,{N:()=>n});var n=function(){function e(){return Error.call(this),this.message="object unsubscribed",this.name="ObjectUnsubscribedError",this}return e.prototype=Object.create(Error.prototype),e}()},87299:(e,t,r)=>{"use strict";r.d(t,{W:()=>n});var n=function(){function e(){return Error.call(this),this.message="Timeout has occurred",this.name="TimeoutError",this}return e.prototype=Object.create(Error.prototype),e}()},43347:(e,t,r)=>{"use strict";r.d(t,{B:()=>n});var n=function(){function e(e){return Error.call(this),this.message=e?e.length+" errors occurred during unsubscription:\n"+e.map((function(e,t){return t+1+") "+e.toString()})).join("\n "):"",this.name="UnsubscriptionError",this.errors=e,this}return e.prototype=Object.create(Error.prototype),e}()},58880:(e,t,r)=>{"use strict";r.d(t,{_:()=>i});var n=r(28732);function i(e){for(;e;){var t=e,r=t.closed,i=t.destination,o=t.isStopped;if(r||o)return!1;e=i&&i instanceof n.L?i:null}return!0}},13109:(e,t,r)=>{"use strict";function n(e){setTimeout((function(){throw e}),0)}r.d(t,{z:()=>n})},80433:(e,t,r)=>{"use strict";function n(e){return e}r.d(t,{y:()=>n})},47182:(e,t,r)=>{"use strict";r.d(t,{k:()=>n});var n=function(){return Array.isArray||function(e){return e&&"number"==typeof e.length}}()},61997:(e,t,r)=>{"use strict";r.d(t,{z:()=>n});var n=function(e){return e&&"number"==typeof e.length&&"function"!=typeof e}},38394:(e,t,r)=>{"use strict";function n(e){return"function"==typeof e}r.d(t,{m:()=>n})},23820:(e,t,r)=>{"use strict";r.d(t,{k:()=>i});var n=r(47182);function i(e){return!(0,n.k)(e)&&e-parseFloat(e)+1>=0}},29929:(e,t,r)=>{"use strict";function n(e){return null!==e&&"object"==typeof e}r.d(t,{K:()=>n})},79886:(e,t,r)=>{"use strict";function n(e){return!!e&&"function"!=typeof e.subscribe&&"function"==typeof e.then}r.d(t,{t:()=>n})},64986:(e,t,r)=>{"use strict";function n(e){return e&&"function"==typeof e.schedule}r.d(t,{K:()=>n})},57781:(e,t,r)=>{"use strict";function n(){}r.d(t,{Z:()=>n})},65868:(e,t,r)=>{"use strict";function n(e,t){function r(){return!r.pred.apply(r.thisArg,arguments)}return r.pred=e,r.thisArg=t,r}r.d(t,{f:()=>n})},97836:(e,t,r)=>{"use strict";r.d(t,{z:()=>i,U:()=>o});var n=r(57781);function i(){for(var e=[],t=0;t{"use strict";r.d(t,{s:()=>u});var n=r(22335),i=r(13109),o=r(8094),s=r(68511),A=r(61997),a=r(79886),c=r(29929),u=function(e){if(e&&"function"==typeof e[s.L])return u=e,function(e){var t=u[s.L]();if("function"!=typeof t.subscribe)throw new TypeError("Provided object does not correctly implement Symbol.observable");return t.subscribe(e)};if((0,A.z)(e))return(0,n.V)(e);if((0,a.t)(e))return r=e,function(e){return r.then((function(t){e.closed||(e.next(t),e.complete())}),(function(t){return e.error(t)})).then(null,i.z),e};if(e&&"function"==typeof e[o.hZ])return t=e,function(e){for(var r=t[o.hZ]();;){var n=r.next();if(n.done){e.complete();break}if(e.next(n.value),e.closed)break}return"function"==typeof r.return&&e.add((function(){r.return&&r.return()})),e};var t,r,u,l=(0,c.K)(e)?"an invalid object":"'"+e+"'";throw new TypeError("You provided "+l+" where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.")}},22335:(e,t,r)=>{"use strict";r.d(t,{V:()=>n});var n=function(e){return function(t){for(var r=0,n=e.length;r{"use strict";r.d(t,{D:()=>s});var n=r(28907),i=r(92402),o=r(98789);function s(e,t,r,s,A){if(void 0===A&&(A=new n.d(e,r,s)),!A.closed)return t instanceof o.y?t.subscribe(A):(0,i.s)(t)(A)}},20683:(e,t,r)=>{"use strict";r.r(t),r.d(t,{audit:()=>s,auditTime:()=>l,buffer:()=>h,bufferCount:()=>d,bufferTime:()=>y,bufferToggle:()=>k,bufferWhen:()=>M,catchError:()=>L,combineAll:()=>_,combineLatest:()=>Y,concat:()=>J,concatAll:()=>H.u,concatMap:()=>z,concatMapTo:()=>W,count:()=>V,debounce:()=>$,debounceTime:()=>re,defaultIfEmpty:()=>se,delay:()=>le,delayWhen:()=>de,dematerialize:()=>ye,distinct:()=>Qe,distinctUntilChanged:()=>be,distinctUntilKeyChanged:()=>xe,elementAt:()=>je,endWith:()=>Ge,every:()=>Je,exhaust:()=>ze,exhaustMap:()=>Ze,expand:()=>tt,filter:()=>Me.h,finalize:()=>it,find:()=>At,findIndex:()=>ut,first:()=>ht,groupBy:()=>gt.v,ignoreElements:()=>ft,isEmpty:()=>Ct,last:()=>Bt,map:()=>Xe.U,mapTo:()=>Qt,materialize:()=>bt,max:()=>Kt,merge:()=>Tt,mergeAll:()=>Pt.J,mergeMap:()=>q.zg,flatMap:()=>q.zg,mergeMapTo:()=>Ut,mergeScan:()=>_t,min:()=>Yt,multicast:()=>Jt,observeOn:()=>qt.QV,onErrorResumeNext:()=>zt,pairwise:()=>Xt,partition:()=>tr,pluck:()=>rr,publish:()=>or,publishBehavior:()=>Ar,publishLast:()=>cr,publishReplay:()=>lr,race:()=>gr,reduce:()=>Rt,repeat:()=>fr,repeatWhen:()=>Cr,retry:()=>mr,retryWhen:()=>Br,refCount:()=>Dr.x,sample:()=>br,sampleTime:()=>xr,scan:()=>xt,sequenceEqual:()=>Rr,share:()=>Ur,shareReplay:()=>_r,single:()=>Or,skip:()=>Gr,skipLast:()=>qr,skipUntil:()=>Vr,skipWhile:()=>$r,startWith:()=>rn,subscribeOn:()=>An,switchAll:()=>hn,switchMap:()=>cn,switchMapTo:()=>gn,take:()=>Ue,takeLast:()=>mt,takeUntil:()=>fn,takeWhile:()=>Cn,tap:()=>wn,throttle:()=>Dn,throttleTime:()=>kn,throwIfEmpty:()=>Re,timeInterval:()=>Rn,timeout:()=>On,timeoutWith:()=>Tn,timestamp:()=>jn,toArray:()=>Jn,window:()=>Hn,windowCount:()=>Wn,windowTime:()=>Zn,windowToggle:()=>oi,windowWhen:()=>ai,withLatestFrom:()=>li,zip:()=>pi,zipAll:()=>di});var n=r(36370),i=r(20242),o=r(93590);function s(e){return function(t){return t.lift(new A(e))}}var A=function(){function e(e){this.durationSelector=e}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.durationSelector))},e}(),a=function(e){function t(t,r){var n=e.call(this,t)||this;return n.durationSelector=r,n.hasValue=!1,n}return n.ZT(t,e),t.prototype._next=function(e){if(this.value=e,this.hasValue=!0,!this.throttled){var t=void 0;try{t=(0,this.durationSelector)(e)}catch(e){return this.destination.error(e)}var r=(0,o.D)(this,t);!r||r.closed?this.clearThrottle():this.add(this.throttled=r)}},t.prototype.clearThrottle=function(){var e=this.value,t=this.hasValue,r=this.throttled;r&&(this.remove(r),this.throttled=null,r.unsubscribe()),t&&(this.value=null,this.hasValue=!1,this.destination.next(e))},t.prototype.notifyNext=function(e,t,r,n){this.clearThrottle()},t.prototype.notifyComplete=function(){this.clearThrottle()},t}(i.L),c=r(59873),u=r(13028);function l(e,t){return void 0===t&&(t=c.P),s((function(){return(0,u.H)(e,t)}))}function h(e){return function(t){return t.lift(new g(e))}}var g=function(){function e(e){this.closingNotifier=e}return e.prototype.call=function(e,t){return t.subscribe(new f(e,this.closingNotifier))},e}(),f=function(e){function t(t,r){var n=e.call(this,t)||this;return n.buffer=[],n.add((0,o.D)(n,r)),n}return n.ZT(t,e),t.prototype._next=function(e){this.buffer.push(e)},t.prototype.notifyNext=function(e,t,r,n,i){var o=this.buffer;this.buffer=[],this.destination.next(o)},t}(i.L),p=r(28732);function d(e,t){return void 0===t&&(t=null),function(r){return r.lift(new C(e,t))}}var C=function(){function e(e,t){this.bufferSize=e,this.startBufferEvery=t,this.subscriberClass=t&&e!==t?I:E}return e.prototype.call=function(e,t){return t.subscribe(new this.subscriberClass(e,this.bufferSize,this.startBufferEvery))},e}(),E=function(e){function t(t,r){var n=e.call(this,t)||this;return n.bufferSize=r,n.buffer=[],n}return n.ZT(t,e),t.prototype._next=function(e){var t=this.buffer;t.push(e),t.length==this.bufferSize&&(this.destination.next(t),this.buffer=[])},t.prototype._complete=function(){var t=this.buffer;t.length>0&&this.destination.next(t),e.prototype._complete.call(this)},t}(p.L),I=function(e){function t(t,r,n){var i=e.call(this,t)||this;return i.bufferSize=r,i.startBufferEvery=n,i.buffers=[],i.count=0,i}return n.ZT(t,e),t.prototype._next=function(e){var t=this.bufferSize,r=this.startBufferEvery,n=this.buffers,i=this.count;this.count++,i%r==0&&n.push([]);for(var o=n.length;o--;){var s=n[o];s.push(e),s.length===t&&(n.splice(o,1),this.destination.next(s))}},t.prototype._complete=function(){for(var t=this.buffers,r=this.destination;t.length>0;){var n=t.shift();n.length>0&&r.next(n)}e.prototype._complete.call(this)},t}(p.L),m=r(64986);function y(e){var t=arguments.length,r=c.P;(0,m.K)(arguments[arguments.length-1])&&(r=arguments[arguments.length-1],t--);var n=null;t>=2&&(n=arguments[1]);var i=Number.POSITIVE_INFINITY;return t>=3&&(i=arguments[2]),function(t){return t.lift(new w(e,n,i,r))}}var w=function(){function e(e,t,r,n){this.bufferTimeSpan=e,this.bufferCreationInterval=t,this.maxBufferSize=r,this.scheduler=n}return e.prototype.call=function(e,t){return t.subscribe(new Q(e,this.bufferTimeSpan,this.bufferCreationInterval,this.maxBufferSize,this.scheduler))},e}(),B=function(){return function(){this.buffer=[]}}(),Q=function(e){function t(t,r,n,i,o){var s=e.call(this,t)||this;s.bufferTimeSpan=r,s.bufferCreationInterval=n,s.maxBufferSize=i,s.scheduler=o,s.contexts=[];var A=s.openContext();if(s.timespanOnly=null==n||n<0,s.timespanOnly){var a={subscriber:s,context:A,bufferTimeSpan:r};s.add(A.closeAction=o.schedule(v,r,a))}else{var c={subscriber:s,context:A},u={bufferTimeSpan:r,bufferCreationInterval:n,subscriber:s,scheduler:o};s.add(A.closeAction=o.schedule(b,r,c)),s.add(o.schedule(D,n,u))}return s}return n.ZT(t,e),t.prototype._next=function(e){for(var t,r=this.contexts,n=r.length,i=0;i0;){var n=t.shift();r.next(n.buffer)}e.prototype._complete.call(this)},t.prototype._unsubscribe=function(){this.contexts=null},t.prototype.onBufferFull=function(e){this.closeContext(e);var t=e.closeAction;if(t.unsubscribe(),this.remove(t),!this.closed&&this.timespanOnly){e=this.openContext();var r=this.bufferTimeSpan,n={subscriber:this,context:e,bufferTimeSpan:r};this.add(e.closeAction=this.scheduler.schedule(v,r,n))}},t.prototype.openContext=function(){var e=new B;return this.contexts.push(e),e},t.prototype.closeContext=function(e){this.destination.next(e.buffer);var t=this.contexts;(t?t.indexOf(e):-1)>=0&&t.splice(t.indexOf(e),1)},t}(p.L);function v(e){var t=e.subscriber,r=e.context;r&&t.closeContext(r),t.closed||(e.context=t.openContext(),e.context.closeAction=this.schedule(e,e.bufferTimeSpan))}function D(e){var t=e.bufferCreationInterval,r=e.bufferTimeSpan,n=e.subscriber,i=e.scheduler,o=n.openContext();n.closed||(n.add(o.closeAction=i.schedule(b,r,{subscriber:n,context:o})),this.schedule(e,t))}function b(e){var t=e.subscriber,r=e.context;t.closeContext(r)}var S=r(73504);function k(e,t){return function(r){return r.lift(new x(e,t))}}var x=function(){function e(e,t){this.openings=e,this.closingSelector=t}return e.prototype.call=function(e,t){return t.subscribe(new F(e,this.openings,this.closingSelector))},e}(),F=function(e){function t(t,r,n){var i=e.call(this,t)||this;return i.openings=r,i.closingSelector=n,i.contexts=[],i.add((0,o.D)(i,r)),i}return n.ZT(t,e),t.prototype._next=function(e){for(var t=this.contexts,r=t.length,n=0;n0;){var n=r.shift();n.subscription.unsubscribe(),n.buffer=null,n.subscription=null}this.contexts=null,e.prototype._error.call(this,t)},t.prototype._complete=function(){for(var t=this.contexts;t.length>0;){var r=t.shift();this.destination.next(r.buffer),r.subscription.unsubscribe(),r.buffer=null,r.subscription=null}this.contexts=null,e.prototype._complete.call(this)},t.prototype.notifyNext=function(e,t,r,n,i){e?this.closeBuffer(e):this.openBuffer(t)},t.prototype.notifyComplete=function(e){this.closeBuffer(e.context)},t.prototype.openBuffer=function(e){try{var t=this.closingSelector.call(this,e);t&&this.trySubscribe(t)}catch(e){this._error(e)}},t.prototype.closeBuffer=function(e){var t=this.contexts;if(t&&e){var r=e.buffer,n=e.subscription;this.destination.next(r),t.splice(t.indexOf(e),1),this.remove(n),n.unsubscribe()}},t.prototype.trySubscribe=function(e){var t=this.contexts,r=new S.w,n={buffer:[],subscription:r};t.push(n);var i=(0,o.D)(this,e,n);!i||i.closed?this.closeBuffer(n):(i.context=n,this.add(i),r.add(i))},t}(i.L);function M(e){return function(t){return t.lift(new N(e))}}var N=function(){function e(e){this.closingSelector=e}return e.prototype.call=function(e,t){return t.subscribe(new R(e,this.closingSelector))},e}(),R=function(e){function t(t,r){var n=e.call(this,t)||this;return n.closingSelector=r,n.subscribing=!1,n.openBuffer(),n}return n.ZT(t,e),t.prototype._next=function(e){this.buffer.push(e)},t.prototype._complete=function(){var t=this.buffer;t&&this.destination.next(t),e.prototype._complete.call(this)},t.prototype._unsubscribe=function(){this.buffer=null,this.subscribing=!1},t.prototype.notifyNext=function(e,t,r,n,i){this.openBuffer()},t.prototype.notifyComplete=function(){this.subscribing?this.complete():this.openBuffer()},t.prototype.openBuffer=function(){var e=this.closingSubscription;e&&(this.remove(e),e.unsubscribe());var t,r=this.buffer;this.buffer&&this.destination.next(r),this.buffer=[];try{t=(0,this.closingSelector)()}catch(e){return this.error(e)}e=new S.w,this.closingSubscription=e,this.add(e),this.subscribing=!0,e.add((0,o.D)(this,t)),this.subscribing=!1},t}(i.L),K=r(28907);function L(e){return function(t){var r=new T(e),n=t.lift(r);return r.caught=n}}var T=function(){function e(e){this.selector=e}return e.prototype.call=function(e,t){return t.subscribe(new P(e,this.selector,this.caught))},e}(),P=function(e){function t(t,r,n){var i=e.call(this,t)||this;return i.selector=r,i.caught=n,i}return n.ZT(t,e),t.prototype.error=function(t){if(!this.isStopped){var r=void 0;try{r=this.selector(t,this.caught)}catch(t){return void e.prototype.error.call(this,t)}this._unsubscribeAndRecycle();var n=new K.d(this,void 0,void 0);this.add(n);var i=(0,o.D)(this,r,void 0,void 0,n);i!==n&&this.add(i)}},t}(i.L),U=r(20995);function _(e){return function(t){return t.lift(new U.Ms(e))}}var O=r(47182),j=r(85861);function Y(){for(var e=[],t=0;t0&&r[0].time-n.now()<=0;)r.shift().notification.observe(i);if(r.length>0){var o=Math.max(0,r[0].time-n.now());this.schedule(e,o)}else this.unsubscribe(),t.active=!1},t.prototype._schedule=function(e){this.active=!0,this.destination.add(e.schedule(t.dispatch,this.delay,{source:this,destination:this.destination,scheduler:e}))},t.prototype.scheduleNotification=function(e){if(!0!==this.errored){var t=this.scheduler,r=new fe(t.now()+this.delay,e);this.queue.push(r),!1===this.active&&this._schedule(t)}},t.prototype._next=function(e){this.scheduleNotification(ue.P.createNext(e))},t.prototype._error=function(e){this.errored=!0,this.queue=[],this.destination.error(e),this.unsubscribe()},t.prototype._complete=function(){this.scheduleNotification(ue.P.createComplete()),this.unsubscribe()},t}(p.L),fe=function(){return function(e,t){this.time=e,this.notification=t}}(),pe=r(98789);function de(e,t){return t?function(r){return new Ie(r,t).lift(new Ce(e))}:function(t){return t.lift(new Ce(e))}}var Ce=function(){function e(e){this.delayDurationSelector=e}return e.prototype.call=function(e,t){return t.subscribe(new Ee(e,this.delayDurationSelector))},e}(),Ee=function(e){function t(t,r){var n=e.call(this,t)||this;return n.delayDurationSelector=r,n.completed=!1,n.delayNotifierSubscriptions=[],n.index=0,n}return n.ZT(t,e),t.prototype.notifyNext=function(e,t,r,n,i){this.destination.next(e),this.removeSubscription(i),this.tryComplete()},t.prototype.notifyError=function(e,t){this._error(e)},t.prototype.notifyComplete=function(e){var t=this.removeSubscription(e);t&&this.destination.next(t),this.tryComplete()},t.prototype._next=function(e){var t=this.index++;try{var r=this.delayDurationSelector(e,t);r&&this.tryDelay(r,e)}catch(e){this.destination.error(e)}},t.prototype._complete=function(){this.completed=!0,this.tryComplete(),this.unsubscribe()},t.prototype.removeSubscription=function(e){e.unsubscribe();var t=this.delayNotifierSubscriptions.indexOf(e);return-1!==t&&this.delayNotifierSubscriptions.splice(t,1),e.outerValue},t.prototype.tryDelay=function(e,t){var r=(0,o.D)(this,e,t);r&&!r.closed&&(this.destination.add(r),this.delayNotifierSubscriptions.push(r))},t.prototype.tryComplete=function(){this.completed&&0===this.delayNotifierSubscriptions.length&&this.destination.complete()},t}(i.L),Ie=function(e){function t(t,r){var n=e.call(this)||this;return n.source=t,n.subscriptionDelay=r,n}return n.ZT(t,e),t.prototype._subscribe=function(e){this.subscriptionDelay.subscribe(new me(e,this.source))},t}(pe.y),me=function(e){function t(t,r){var n=e.call(this)||this;return n.parent=t,n.source=r,n.sourceSubscribed=!1,n}return n.ZT(t,e),t.prototype._next=function(e){this.subscribeToSource()},t.prototype._error=function(e){this.unsubscribe(),this.parent.error(e)},t.prototype._complete=function(){this.unsubscribe(),this.subscribeToSource()},t.prototype.subscribeToSource=function(){this.sourceSubscribed||(this.sourceSubscribed=!0,this.unsubscribe(),this.source.subscribe(this.parent))},t}(p.L);function ye(){return function(e){return e.lift(new we)}}var we=function(){function e(){}return e.prototype.call=function(e,t){return t.subscribe(new Be(e))},e}(),Be=function(e){function t(t){return e.call(this,t)||this}return n.ZT(t,e),t.prototype._next=function(e){e.observe(this.destination)},t}(p.L);function Qe(e,t){return function(r){return r.lift(new ve(e,t))}}var ve=function(){function e(e,t){this.keySelector=e,this.flushes=t}return e.prototype.call=function(e,t){return t.subscribe(new De(e,this.keySelector,this.flushes))},e}(),De=function(e){function t(t,r,n){var i=e.call(this,t)||this;return i.keySelector=r,i.values=new Set,n&&i.add((0,o.D)(i,n)),i}return n.ZT(t,e),t.prototype.notifyNext=function(e,t,r,n,i){this.values.clear()},t.prototype.notifyError=function(e,t){this._error(e)},t.prototype._next=function(e){this.keySelector?this._useKeySelector(e):this._finalizeNext(e,e)},t.prototype._useKeySelector=function(e){var t,r=this.destination;try{t=this.keySelector(e)}catch(e){return void r.error(e)}this._finalizeNext(t,e)},t.prototype._finalizeNext=function(e,t){var r=this.values;r.has(e)||(r.add(e),this.destination.next(t))},t}(i.L);function be(e,t){return function(r){return r.lift(new Se(e,t))}}var Se=function(){function e(e,t){this.compare=e,this.keySelector=t}return e.prototype.call=function(e,t){return t.subscribe(new ke(e,this.compare,this.keySelector))},e}(),ke=function(e){function t(t,r,n){var i=e.call(this,t)||this;return i.keySelector=n,i.hasKey=!1,"function"==typeof r&&(i.compare=r),i}return n.ZT(t,e),t.prototype.compare=function(e,t){return e===t},t.prototype._next=function(e){var t;try{var r=this.keySelector;t=r?r(e):e}catch(e){return this.destination.error(e)}var n=!1;if(this.hasKey)try{n=(0,this.compare)(this.key,t)}catch(e){return this.destination.error(e)}else this.hasKey=!0;n||(this.key=t,this.destination.next(e))},t}(p.L);function xe(e,t){return be((function(r,n){return t?t(r[e],n[e]):r[e]===n[e]}))}var Fe=r(3551),Me=r(39063),Ne=r(30943);function Re(e){return void 0===e&&(e=Te),function(t){return t.lift(new Ke(e))}}var Ke=function(){function e(e){this.errorFactory=e}return e.prototype.call=function(e,t){return t.subscribe(new Le(e,this.errorFactory))},e}(),Le=function(e){function t(t,r){var n=e.call(this,t)||this;return n.errorFactory=r,n.hasValue=!1,n}return n.ZT(t,e),t.prototype._next=function(e){this.hasValue=!0,this.destination.next(e)},t.prototype._complete=function(){if(this.hasValue)return this.destination.complete();var e=void 0;try{e=this.errorFactory()}catch(t){e=t}this.destination.error(e)},t}(p.L);function Te(){return new Ne.K}var Pe=r(61775);function Ue(e){return function(t){return 0===e?(0,Pe.c)():t.lift(new _e(e))}}var _e=function(){function e(e){if(this.total=e,this.total<0)throw new Fe.W}return e.prototype.call=function(e,t){return t.subscribe(new Oe(e,this.total))},e}(),Oe=function(e){function t(t,r){var n=e.call(this,t)||this;return n.total=r,n.count=0,n}return n.ZT(t,e),t.prototype._next=function(e){var t=this.total,r=++this.count;r<=t&&(this.destination.next(e),r===t&&(this.destination.complete(),this.unsubscribe()))},t}(p.L);function je(e,t){if(e<0)throw new Fe.W;var r=arguments.length>=2;return function(n){return n.pipe((0,Me.h)((function(t,r){return r===e})),Ue(1),r?se(t):Re((function(){return new Fe.W})))}}var Ye=r(29686);function Ge(){for(var e=[],t=0;t0&&this._next(t.shift()),this.hasCompleted&&0===this.active&&this.destination.complete()},t}(i.L);function it(e){return function(t){return t.lift(new ot(e))}}var ot=function(){function e(e){this.callback=e}return e.prototype.call=function(e,t){return t.subscribe(new st(e,this.callback))},e}(),st=function(e){function t(t,r){var n=e.call(this,t)||this;return n.add(new S.w(r)),n}return n.ZT(t,e),t}(p.L);function At(e,t){if("function"!=typeof e)throw new TypeError("predicate is not a function");return function(r){return r.lift(new at(e,r,!1,t))}}var at=function(){function e(e,t,r,n){this.predicate=e,this.source=t,this.yieldIndex=r,this.thisArg=n}return e.prototype.call=function(e,t){return t.subscribe(new ct(e,this.predicate,this.source,this.yieldIndex,this.thisArg))},e}(),ct=function(e){function t(t,r,n,i,o){var s=e.call(this,t)||this;return s.predicate=r,s.source=n,s.yieldIndex=i,s.thisArg=o,s.index=0,s}return n.ZT(t,e),t.prototype.notifyComplete=function(e){var t=this.destination;t.next(e),t.complete(),this.unsubscribe()},t.prototype._next=function(e){var t=this.predicate,r=this.thisArg,n=this.index++;try{t.call(r||this,e,n,this.source)&&this.notifyComplete(this.yieldIndex?n:e)}catch(e){this.destination.error(e)}},t.prototype._complete=function(){this.notifyComplete(this.yieldIndex?-1:void 0)},t}(p.L);function ut(e,t){return function(r){return r.lift(new at(e,r,!0,t))}}var lt=r(80433);function ht(e,t){var r=arguments.length>=2;return function(n){return n.pipe(e?(0,Me.h)((function(t,r){return e(t,r,n)})):lt.y,Ue(1),r?se(t):Re((function(){return new Ne.K})))}}var gt=r(92564);function ft(){return function(e){return e.lift(new pt)}}var pt=function(){function e(){}return e.prototype.call=function(e,t){return t.subscribe(new dt(e))},e}(),dt=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n.ZT(t,e),t.prototype._next=function(e){},t}(p.L);function Ct(){return function(e){return e.lift(new Et)}}var Et=function(){function e(){}return e.prototype.call=function(e,t){return t.subscribe(new It(e))},e}(),It=function(e){function t(t){return e.call(this,t)||this}return n.ZT(t,e),t.prototype.notifyComplete=function(e){var t=this.destination;t.next(e),t.complete()},t.prototype._next=function(e){this.notifyComplete(!1)},t.prototype._complete=function(){this.notifyComplete(!0)},t}(p.L);function mt(e){return function(t){return 0===e?(0,Pe.c)():t.lift(new yt(e))}}var yt=function(){function e(e){if(this.total=e,this.total<0)throw new Fe.W}return e.prototype.call=function(e,t){return t.subscribe(new wt(e,this.total))},e}(),wt=function(e){function t(t,r){var n=e.call(this,t)||this;return n.total=r,n.ring=new Array,n.count=0,n}return n.ZT(t,e),t.prototype._next=function(e){var t=this.ring,r=this.total,n=this.count++;t.length0)for(var r=this.count>=this.total?this.total:this.count,n=this.ring,i=0;i=2;return function(n){return n.pipe(e?(0,Me.h)((function(t,r){return e(t,r,n)})):lt.y,mt(1),r?se(t):Re((function(){return new Ne.K})))}}function Qt(e){return function(t){return t.lift(new vt(e))}}var vt=function(){function e(e){this.value=e}return e.prototype.call=function(e,t){return t.subscribe(new Dt(e,this.value))},e}(),Dt=function(e){function t(t,r){var n=e.call(this,t)||this;return n.value=r,n}return n.ZT(t,e),t.prototype._next=function(e){this.destination.next(this.value)},t}(p.L);function bt(){return function(e){return e.lift(new St)}}var St=function(){function e(){}return e.prototype.call=function(e,t){return t.subscribe(new kt(e))},e}(),kt=function(e){function t(t){return e.call(this,t)||this}return n.ZT(t,e),t.prototype._next=function(e){this.destination.next(ue.P.createNext(e))},t.prototype._error=function(e){var t=this.destination;t.next(ue.P.createError(e)),t.complete()},t.prototype._complete=function(){var e=this.destination;e.next(ue.P.createComplete()),e.complete()},t}(p.L);function xt(e,t){var r=!1;return arguments.length>=2&&(r=!0),function(n){return n.lift(new Ft(e,t,r))}}var Ft=function(){function e(e,t,r){void 0===r&&(r=!1),this.accumulator=e,this.seed=t,this.hasSeed=r}return e.prototype.call=function(e,t){return t.subscribe(new Mt(e,this.accumulator,this.seed,this.hasSeed))},e}(),Mt=function(e){function t(t,r,n,i){var o=e.call(this,t)||this;return o.accumulator=r,o._seed=n,o.hasSeed=i,o.index=0,o}return n.ZT(t,e),Object.defineProperty(t.prototype,"seed",{get:function(){return this._seed},set:function(e){this.hasSeed=!0,this._seed=e},enumerable:!0,configurable:!0}),t.prototype._next=function(e){if(this.hasSeed)return this._tryNext(e);this.seed=e,this.destination.next(e)},t.prototype._tryNext=function(e){var t,r=this.index++;try{t=this.accumulator(this.seed,e,r)}catch(e){this.destination.error(e)}this.seed=t,this.destination.next(t)},t}(p.L),Nt=r(97836);function Rt(e,t){return arguments.length>=2?function(r){return(0,Nt.z)(xt(e,t),mt(1),se(t))(r)}:function(t){return(0,Nt.z)(xt((function(t,r,n){return e(t,r,n+1)})),mt(1))(t)}}function Kt(e){return Rt("function"==typeof e?function(t,r){return e(t,r)>0?t:r}:function(e,t){return e>t?e:t})}var Lt=r(80810);function Tt(){for(var e=[],t=0;t0?this._next(t.shift()):0===this.active&&this.hasCompleted&&(!1===this.hasValue&&this.destination.next(this.acc),this.destination.complete())},t}(i.L);function Yt(e){return Rt("function"==typeof e?function(t,r){return e(t,r)<0?t:r}:function(e,t){return e-1&&(this.count=r-1),t.subscribe(this._unsubscribeAndRecycle())}},t}(p.L);function Cr(e){return function(t){return t.lift(new Er(e))}}var Er=function(){function e(e){this.notifier=e}return e.prototype.call=function(e,t){return t.subscribe(new Ir(e,this.notifier,t))},e}(),Ir=function(e){function t(t,r,n){var i=e.call(this,t)||this;return i.notifier=r,i.source=n,i.sourceIsBeingSubscribedTo=!0,i}return n.ZT(t,e),t.prototype.notifyNext=function(e,t,r,n,i){this.sourceIsBeingSubscribedTo=!0,this.source.subscribe(this)},t.prototype.notifyComplete=function(t){if(!1===this.sourceIsBeingSubscribedTo)return e.prototype.complete.call(this)},t.prototype.complete=function(){if(this.sourceIsBeingSubscribedTo=!1,!this.isStopped){if(this.retries||this.subscribeToRetries(),!this.retriesSubscription||this.retriesSubscription.closed)return e.prototype.complete.call(this);this._unsubscribeAndRecycle(),this.notifications.next()}},t.prototype._unsubscribe=function(){var e=this.notifications,t=this.retriesSubscription;e&&(e.unsubscribe(),this.notifications=null),t&&(t.unsubscribe(),this.retriesSubscription=null),this.retries=null},t.prototype._unsubscribeAndRecycle=function(){var t=this._unsubscribe;return this._unsubscribe=null,e.prototype._unsubscribeAndRecycle.call(this),this._unsubscribe=t,this},t.prototype.subscribeToRetries=function(){var t;this.notifications=new ir.xQ;try{t=(0,this.notifier)(this.notifications)}catch(t){return e.prototype.complete.call(this)}this.retries=t,this.retriesSubscription=(0,o.D)(this,t)},t}(i.L);function mr(e){return void 0===e&&(e=-1),function(t){return t.lift(new yr(e,t))}}var yr=function(){function e(e,t){this.count=e,this.source=t}return e.prototype.call=function(e,t){return t.subscribe(new wr(e,this.count,this.source))},e}(),wr=function(e){function t(t,r,n){var i=e.call(this,t)||this;return i.count=r,i.source=n,i}return n.ZT(t,e),t.prototype.error=function(t){if(!this.isStopped){var r=this.source,n=this.count;if(0===n)return e.prototype.error.call(this,t);n>-1&&(this.count=n-1),r.subscribe(this._unsubscribeAndRecycle())}},t}(p.L);function Br(e){return function(t){return t.lift(new Qr(e,t))}}var Qr=function(){function e(e,t){this.notifier=e,this.source=t}return e.prototype.call=function(e,t){return t.subscribe(new vr(e,this.notifier,this.source))},e}(),vr=function(e){function t(t,r,n){var i=e.call(this,t)||this;return i.notifier=r,i.source=n,i}return n.ZT(t,e),t.prototype.error=function(t){if(!this.isStopped){var r=this.errors,n=this.retries,i=this.retriesSubscription;if(n)this.errors=null,this.retriesSubscription=null;else{r=new ir.xQ;try{n=(0,this.notifier)(r)}catch(t){return e.prototype.error.call(this,t)}i=(0,o.D)(this,n)}this._unsubscribeAndRecycle(),this.errors=r,this.retries=n,this.retriesSubscription=i,r.next(t)}},t.prototype._unsubscribe=function(){var e=this.errors,t=this.retriesSubscription;e&&(e.unsubscribe(),this.errors=null),t&&(t.unsubscribe(),this.retriesSubscription=null),this.retries=null},t.prototype.notifyNext=function(e,t,r,n,i){var o=this._unsubscribe;this._unsubscribe=null,this._unsubscribeAndRecycle(),this._unsubscribe=o,this.source.subscribe(this)},t}(i.L),Dr=r(97566);function br(e){return function(t){return t.lift(new Sr(e))}}var Sr=function(){function e(e){this.notifier=e}return e.prototype.call=function(e,t){var r=new kr(e),n=t.subscribe(r);return n.add((0,o.D)(r,this.notifier)),n},e}(),kr=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.hasValue=!1,t}return n.ZT(t,e),t.prototype._next=function(e){this.value=e,this.hasValue=!0},t.prototype.notifyNext=function(e,t,r,n,i){this.emitValue()},t.prototype.notifyComplete=function(){this.emitValue()},t.prototype.emitValue=function(){this.hasValue&&(this.hasValue=!1,this.destination.next(this.value))},t}(i.L);function xr(e,t){return void 0===t&&(t=c.P),function(r){return r.lift(new Fr(e,t))}}var Fr=function(){function e(e,t){this.period=e,this.scheduler=t}return e.prototype.call=function(e,t){return t.subscribe(new Mr(e,this.period,this.scheduler))},e}(),Mr=function(e){function t(t,r,n){var i=e.call(this,t)||this;return i.period=r,i.scheduler=n,i.hasValue=!1,i.add(n.schedule(Nr,r,{subscriber:i,period:r})),i}return n.ZT(t,e),t.prototype._next=function(e){this.lastValue=e,this.hasValue=!0},t.prototype.notifyNext=function(){this.hasValue&&(this.hasValue=!1,this.destination.next(this.lastValue))},t}(p.L);function Nr(e){var t=e.subscriber,r=e.period;t.notifyNext(),this.schedule(e,r)}function Rr(e,t){return function(r){return r.lift(new Kr(e,t))}}var Kr=function(){function e(e,t){this.compareTo=e,this.comparator=t}return e.prototype.call=function(e,t){return t.subscribe(new Lr(e,this.compareTo,this.comparator))},e}(),Lr=function(e){function t(t,r,n){var i=e.call(this,t)||this;return i.compareTo=r,i.comparator=n,i._a=[],i._b=[],i._oneComplete=!1,i.destination.add(r.subscribe(new Tr(t,i))),i}return n.ZT(t,e),t.prototype._next=function(e){this._oneComplete&&0===this._b.length?this.emit(!1):(this._a.push(e),this.checkValues())},t.prototype._complete=function(){this._oneComplete?this.emit(0===this._a.length&&0===this._b.length):this._oneComplete=!0,this.unsubscribe()},t.prototype.checkValues=function(){for(var e=this._a,t=this._b,r=this.comparator;e.length>0&&t.length>0;){var n=e.shift(),i=t.shift(),o=!1;try{o=r?r(n,i):n===i}catch(e){this.destination.error(e)}o||this.emit(!1)}},t.prototype.emit=function(e){var t=this.destination;t.next(e),t.complete()},t.prototype.nextB=function(e){this._oneComplete&&0===this._a.length?this.emit(!1):(this._b.push(e),this.checkValues())},t.prototype.completeB=function(){this._oneComplete?this.emit(0===this._a.length&&0===this._b.length):this._oneComplete=!0},t}(p.L),Tr=function(e){function t(t,r){var n=e.call(this,t)||this;return n.parent=r,n}return n.ZT(t,e),t.prototype._next=function(e){this.parent.nextB(e)},t.prototype._error=function(e){this.parent.error(e),this.unsubscribe()},t.prototype._complete=function(){this.parent.completeB(),this.unsubscribe()},t}(p.L);function Pr(){return new ir.xQ}function Ur(){return function(e){return(0,Dr.x)()(Jt(Pr)(e))}}function _r(e,t,r){var n;return n=e&&"object"==typeof e?e:{bufferSize:e,windowTime:t,refCount:!1,scheduler:r},function(e){return e.lift(function(e){var t,r,n=e.bufferSize,i=void 0===n?Number.POSITIVE_INFINITY:n,o=e.windowTime,s=void 0===o?Number.POSITIVE_INFINITY:o,A=e.refCount,a=e.scheduler,c=0,u=!1,l=!1;return function(e){c++,t&&!u||(u=!1,t=new ur.t(i,s,a),r=e.subscribe({next:function(e){t.next(e)},error:function(e){u=!0,t.error(e)},complete:function(){l=!0,r=void 0,t.complete()}}));var n=t.subscribe(this);this.add((function(){c--,n.unsubscribe(),r&&!l&&A&&0===c&&(r.unsubscribe(),r=void 0,t=void 0)}))}}(n))}}function Or(e){return function(t){return t.lift(new jr(e,t))}}var jr=function(){function e(e,t){this.predicate=e,this.source=t}return e.prototype.call=function(e,t){return t.subscribe(new Yr(e,this.predicate,this.source))},e}(),Yr=function(e){function t(t,r,n){var i=e.call(this,t)||this;return i.predicate=r,i.source=n,i.seenValue=!1,i.index=0,i}return n.ZT(t,e),t.prototype.applySingleValue=function(e){this.seenValue?this.destination.error("Sequence contains more than one element"):(this.seenValue=!0,this.singleValue=e)},t.prototype._next=function(e){var t=this.index++;this.predicate?this.tryNext(e,t):this.applySingleValue(e)},t.prototype.tryNext=function(e,t){try{this.predicate(e,t,this.source)&&this.applySingleValue(e)}catch(e){this.destination.error(e)}},t.prototype._complete=function(){var e=this.destination;this.index>0?(e.next(this.seenValue?this.singleValue:void 0),e.complete()):e.error(new Ne.K)},t}(p.L);function Gr(e){return function(t){return t.lift(new Jr(e))}}var Jr=function(){function e(e){this.total=e}return e.prototype.call=function(e,t){return t.subscribe(new Hr(e,this.total))},e}(),Hr=function(e){function t(t,r){var n=e.call(this,t)||this;return n.total=r,n.count=0,n}return n.ZT(t,e),t.prototype._next=function(e){++this.count>this.total&&this.destination.next(e)},t}(p.L);function qr(e){return function(t){return t.lift(new zr(e))}}var zr=function(){function e(e){if(this._skipCount=e,this._skipCount<0)throw new Fe.W}return e.prototype.call=function(e,t){return 0===this._skipCount?t.subscribe(new p.L(e)):t.subscribe(new Wr(e,this._skipCount))},e}(),Wr=function(e){function t(t,r){var n=e.call(this,t)||this;return n._skipCount=r,n._count=0,n._ring=new Array(r),n}return n.ZT(t,e),t.prototype._next=function(e){var t=this._skipCount,r=this._count++;if(r0?this.startWindowEvery:this.windowSize,r=this.destination,n=this.windowSize,i=this.windows,o=i.length,s=0;s=0&&A%t==0&&!this.closed&&i.shift().complete(),++this.count%t==0&&!this.closed){var a=new ir.xQ;i.push(a),r.next(a)}},t.prototype._error=function(e){var t=this.windows;if(t)for(;t.length>0&&!this.closed;)t.shift().error(e);this.destination.error(e)},t.prototype._complete=function(){var e=this.windows;if(e)for(;e.length>0&&!this.closed;)e.shift().complete();this.destination.complete()},t.prototype._unsubscribe=function(){this.count=0,this.windows=null},t}(p.L);function Zn(e){var t=c.P,r=null,n=Number.POSITIVE_INFINITY;return(0,m.K)(arguments[3])&&(t=arguments[3]),(0,m.K)(arguments[2])?t=arguments[2]:(0,on.k)(arguments[2])&&(n=arguments[2]),(0,m.K)(arguments[1])?t=arguments[1]:(0,on.k)(arguments[1])&&(r=arguments[1]),function(i){return i.lift(new $n(e,r,n,t))}}var $n=function(){function e(e,t,r,n){this.windowTimeSpan=e,this.windowCreationInterval=t,this.maxWindowSize=r,this.scheduler=n}return e.prototype.call=function(e,t){return t.subscribe(new ti(e,this.windowTimeSpan,this.windowCreationInterval,this.maxWindowSize,this.scheduler))},e}(),ei=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t._numberOfNextedValues=0,t}return n.ZT(t,e),t.prototype.next=function(t){this._numberOfNextedValues++,e.prototype.next.call(this,t)},Object.defineProperty(t.prototype,"numberOfNextedValues",{get:function(){return this._numberOfNextedValues},enumerable:!0,configurable:!0}),t}(ir.xQ),ti=function(e){function t(t,r,n,i,o){var s=e.call(this,t)||this;s.destination=t,s.windowTimeSpan=r,s.windowCreationInterval=n,s.maxWindowSize=i,s.scheduler=o,s.windows=[];var A=s.openWindow();if(null!==n&&n>=0){var a={subscriber:s,window:A,context:null},c={windowTimeSpan:r,windowCreationInterval:n,subscriber:s,scheduler:o};s.add(o.schedule(ii,r,a)),s.add(o.schedule(ni,n,c))}else{var u={subscriber:s,window:A,windowTimeSpan:r};s.add(o.schedule(ri,r,u))}return s}return n.ZT(t,e),t.prototype._next=function(e){for(var t=this.windows,r=t.length,n=0;n=this.maxWindowSize&&this.closeWindow(i))}},t.prototype._error=function(e){for(var t=this.windows;t.length>0;)t.shift().error(e);this.destination.error(e)},t.prototype._complete=function(){for(var e=this.windows;e.length>0;){var t=e.shift();t.closed||t.complete()}this.destination.complete()},t.prototype.openWindow=function(){var e=new ei;return this.windows.push(e),this.destination.next(e),e},t.prototype.closeWindow=function(e){e.complete();var t=this.windows;t.splice(t.indexOf(e),1)},t}(p.L);function ri(e){var t=e.subscriber,r=e.windowTimeSpan,n=e.window;n&&t.closeWindow(n),e.window=t.openWindow(),this.schedule(e,r)}function ni(e){var t=e.windowTimeSpan,r=e.subscriber,n=e.scheduler,i=e.windowCreationInterval,o=r.openWindow(),s={action:this,subscription:null},A={subscriber:r,window:o,context:s};s.subscription=n.schedule(ii,t,A),this.add(s.subscription),this.schedule(e,i)}function ii(e){var t=e.subscriber,r=e.window,n=e.context;n&&n.action&&n.subscription&&n.action.remove(n.subscription),t.closeWindow(r)}function oi(e,t){return function(r){return r.lift(new si(e,t))}}var si=function(){function e(e,t){this.openings=e,this.closingSelector=t}return e.prototype.call=function(e,t){return t.subscribe(new Ai(e,this.openings,this.closingSelector))},e}(),Ai=function(e){function t(t,r,n){var i=e.call(this,t)||this;return i.openings=r,i.closingSelector=n,i.contexts=[],i.add(i.openSubscription=(0,o.D)(i,r,r)),i}return n.ZT(t,e),t.prototype._next=function(e){var t=this.contexts;if(t)for(var r=t.length,n=0;n0){var s=o.indexOf(r);-1!==s&&o.splice(s,1)}},t.prototype.notifyComplete=function(){},t.prototype._next=function(e){if(0===this.toRespond.length){var t=[e].concat(this.values);this.project?this._tryProject(t):this.destination.next(t)}},t.prototype._tryProject=function(e){var t;try{t=this.project.apply(this,e)}catch(e){return void this.destination.error(e)}this.destination.next(t)},t}(i.L),fi=r(21336);function pi(){for(var e=[],t=0;t{var n=r(64293),i=n.Buffer;function o(e,t){for(var r in e)t[r]=e[r]}function s(e,t,r){return i(e,t,r)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?e.exports=n:(o(n,t),t.Buffer=s),o(i,s),s.from=function(e,t,r){if("number"==typeof e)throw new TypeError("Argument must not be a number");return i(e,t,r)},s.alloc=function(e,t,r){if("number"!=typeof e)throw new TypeError("Argument must be a number");var n=i(e);return void 0!==t?"string"==typeof r?n.fill(t,r):n.fill(t):n.fill(0),n},s.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i(e)},s.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return n.SlowBuffer(e)}},44765:(e,t,r)=>{"use strict";var n,i=r(64293),o=i.Buffer,s={};for(n in i)i.hasOwnProperty(n)&&"SlowBuffer"!==n&&"Buffer"!==n&&(s[n]=i[n]);var A=s.Buffer={};for(n in o)o.hasOwnProperty(n)&&"allocUnsafe"!==n&&"allocUnsafeSlow"!==n&&(A[n]=o[n]);if(s.Buffer.prototype=o.prototype,A.from&&A.from!==Uint8Array.from||(A.from=function(e,t,r){if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type '+typeof e);if(e&&void 0===e.length)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);return o(e,t,r)}),A.alloc||(A.alloc=function(e,t,r){if("number"!=typeof e)throw new TypeError('The "size" argument must be of type number. Received type '+typeof e);if(e<0||e>=2*(1<<30))throw new RangeError('The value "'+e+'" is invalid for option "size"');var n=o(e);return t&&0!==t.length?"string"==typeof r?n.fill(t,r):n.fill(t):n.fill(0),n}),!s.kStringMaxLength)try{s.kStringMaxLength=process.binding("buffer").kStringMaxLength}catch(e){}s.constants||(s.constants={MAX_LENGTH:s.kMaxLength},s.kStringMaxLength&&(s.constants.MAX_STRING_LENGTH=s.kStringMaxLength)),e.exports=s},95584:(e,t)=>{var r;t=e.exports=l,r="object"==typeof process&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?function(){var e=Array.prototype.slice.call(arguments,0);e.unshift("SEMVER"),console.log.apply(console,e)}:function(){},t.SEMVER_SPEC_VERSION="2.0.0";var n=Number.MAX_SAFE_INTEGER||9007199254740991,i=t.re=[],o=t.src=[],s=t.tokens={},A=0;function a(e){s[e]=A++}a("NUMERICIDENTIFIER"),o[s.NUMERICIDENTIFIER]="0|[1-9]\\d*",a("NUMERICIDENTIFIERLOOSE"),o[s.NUMERICIDENTIFIERLOOSE]="[0-9]+",a("NONNUMERICIDENTIFIER"),o[s.NONNUMERICIDENTIFIER]="\\d*[a-zA-Z-][a-zA-Z0-9-]*",a("MAINVERSION"),o[s.MAINVERSION]="("+o[s.NUMERICIDENTIFIER]+")\\.("+o[s.NUMERICIDENTIFIER]+")\\.("+o[s.NUMERICIDENTIFIER]+")",a("MAINVERSIONLOOSE"),o[s.MAINVERSIONLOOSE]="("+o[s.NUMERICIDENTIFIERLOOSE]+")\\.("+o[s.NUMERICIDENTIFIERLOOSE]+")\\.("+o[s.NUMERICIDENTIFIERLOOSE]+")",a("PRERELEASEIDENTIFIER"),o[s.PRERELEASEIDENTIFIER]="(?:"+o[s.NUMERICIDENTIFIER]+"|"+o[s.NONNUMERICIDENTIFIER]+")",a("PRERELEASEIDENTIFIERLOOSE"),o[s.PRERELEASEIDENTIFIERLOOSE]="(?:"+o[s.NUMERICIDENTIFIERLOOSE]+"|"+o[s.NONNUMERICIDENTIFIER]+")",a("PRERELEASE"),o[s.PRERELEASE]="(?:-("+o[s.PRERELEASEIDENTIFIER]+"(?:\\."+o[s.PRERELEASEIDENTIFIER]+")*))",a("PRERELEASELOOSE"),o[s.PRERELEASELOOSE]="(?:-?("+o[s.PRERELEASEIDENTIFIERLOOSE]+"(?:\\."+o[s.PRERELEASEIDENTIFIERLOOSE]+")*))",a("BUILDIDENTIFIER"),o[s.BUILDIDENTIFIER]="[0-9A-Za-z-]+",a("BUILD"),o[s.BUILD]="(?:\\+("+o[s.BUILDIDENTIFIER]+"(?:\\."+o[s.BUILDIDENTIFIER]+")*))",a("FULL"),a("FULLPLAIN"),o[s.FULLPLAIN]="v?"+o[s.MAINVERSION]+o[s.PRERELEASE]+"?"+o[s.BUILD]+"?",o[s.FULL]="^"+o[s.FULLPLAIN]+"$",a("LOOSEPLAIN"),o[s.LOOSEPLAIN]="[v=\\s]*"+o[s.MAINVERSIONLOOSE]+o[s.PRERELEASELOOSE]+"?"+o[s.BUILD]+"?",a("LOOSE"),o[s.LOOSE]="^"+o[s.LOOSEPLAIN]+"$",a("GTLT"),o[s.GTLT]="((?:<|>)?=?)",a("XRANGEIDENTIFIERLOOSE"),o[s.XRANGEIDENTIFIERLOOSE]=o[s.NUMERICIDENTIFIERLOOSE]+"|x|X|\\*",a("XRANGEIDENTIFIER"),o[s.XRANGEIDENTIFIER]=o[s.NUMERICIDENTIFIER]+"|x|X|\\*",a("XRANGEPLAIN"),o[s.XRANGEPLAIN]="[v=\\s]*("+o[s.XRANGEIDENTIFIER]+")(?:\\.("+o[s.XRANGEIDENTIFIER]+")(?:\\.("+o[s.XRANGEIDENTIFIER]+")(?:"+o[s.PRERELEASE]+")?"+o[s.BUILD]+"?)?)?",a("XRANGEPLAINLOOSE"),o[s.XRANGEPLAINLOOSE]="[v=\\s]*("+o[s.XRANGEIDENTIFIERLOOSE]+")(?:\\.("+o[s.XRANGEIDENTIFIERLOOSE]+")(?:\\.("+o[s.XRANGEIDENTIFIERLOOSE]+")(?:"+o[s.PRERELEASELOOSE]+")?"+o[s.BUILD]+"?)?)?",a("XRANGE"),o[s.XRANGE]="^"+o[s.GTLT]+"\\s*"+o[s.XRANGEPLAIN]+"$",a("XRANGELOOSE"),o[s.XRANGELOOSE]="^"+o[s.GTLT]+"\\s*"+o[s.XRANGEPLAINLOOSE]+"$",a("COERCE"),o[s.COERCE]="(^|[^\\d])(\\d{1,16})(?:\\.(\\d{1,16}))?(?:\\.(\\d{1,16}))?(?:$|[^\\d])",a("COERCERTL"),i[s.COERCERTL]=new RegExp(o[s.COERCE],"g"),a("LONETILDE"),o[s.LONETILDE]="(?:~>?)",a("TILDETRIM"),o[s.TILDETRIM]="(\\s*)"+o[s.LONETILDE]+"\\s+",i[s.TILDETRIM]=new RegExp(o[s.TILDETRIM],"g");a("TILDE"),o[s.TILDE]="^"+o[s.LONETILDE]+o[s.XRANGEPLAIN]+"$",a("TILDELOOSE"),o[s.TILDELOOSE]="^"+o[s.LONETILDE]+o[s.XRANGEPLAINLOOSE]+"$",a("LONECARET"),o[s.LONECARET]="(?:\\^)",a("CARETTRIM"),o[s.CARETTRIM]="(\\s*)"+o[s.LONECARET]+"\\s+",i[s.CARETTRIM]=new RegExp(o[s.CARETTRIM],"g");a("CARET"),o[s.CARET]="^"+o[s.LONECARET]+o[s.XRANGEPLAIN]+"$",a("CARETLOOSE"),o[s.CARETLOOSE]="^"+o[s.LONECARET]+o[s.XRANGEPLAINLOOSE]+"$",a("COMPARATORLOOSE"),o[s.COMPARATORLOOSE]="^"+o[s.GTLT]+"\\s*("+o[s.LOOSEPLAIN]+")$|^$",a("COMPARATOR"),o[s.COMPARATOR]="^"+o[s.GTLT]+"\\s*("+o[s.FULLPLAIN]+")$|^$",a("COMPARATORTRIM"),o[s.COMPARATORTRIM]="(\\s*)"+o[s.GTLT]+"\\s*("+o[s.LOOSEPLAIN]+"|"+o[s.XRANGEPLAIN]+")",i[s.COMPARATORTRIM]=new RegExp(o[s.COMPARATORTRIM],"g");a("HYPHENRANGE"),o[s.HYPHENRANGE]="^\\s*("+o[s.XRANGEPLAIN]+")\\s+-\\s+("+o[s.XRANGEPLAIN]+")\\s*$",a("HYPHENRANGELOOSE"),o[s.HYPHENRANGELOOSE]="^\\s*("+o[s.XRANGEPLAINLOOSE]+")\\s+-\\s+("+o[s.XRANGEPLAINLOOSE]+")\\s*$",a("STAR"),o[s.STAR]="(<|>)?=?\\s*\\*";for(var c=0;c256)return null;if(!(t.loose?i[s.LOOSE]:i[s.FULL]).test(e))return null;try{return new l(e,t)}catch(e){return null}}function l(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof l){if(e.loose===t.loose)return e;e=e.version}else if("string"!=typeof e)throw new TypeError("Invalid Version: "+e);if(e.length>256)throw new TypeError("version is longer than 256 characters");if(!(this instanceof l))return new l(e,t);r("SemVer",e,t),this.options=t,this.loose=!!t.loose;var o=e.trim().match(t.loose?i[s.LOOSE]:i[s.FULL]);if(!o)throw new TypeError("Invalid Version: "+e);if(this.raw=e,this.major=+o[1],this.minor=+o[2],this.patch=+o[3],this.major>n||this.major<0)throw new TypeError("Invalid major version");if(this.minor>n||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>n||this.patch<0)throw new TypeError("Invalid patch version");o[4]?this.prerelease=o[4].split(".").map((function(e){if(/^[0-9]+$/.test(e)){var t=+e;if(t>=0&&t=0;)"number"==typeof this.prerelease[r]&&(this.prerelease[r]++,r=-2);-1===r&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error("invalid increment argument: "+e)}return this.format(),this.raw=this.version,this},t.inc=function(e,t,r,n){"string"==typeof r&&(n=r,r=void 0);try{return new l(e,r).inc(t,n).version}catch(e){return null}},t.diff=function(e,t){if(C(e,t))return null;var r=u(e),n=u(t),i="";if(r.prerelease.length||n.prerelease.length){i="pre";var o="prerelease"}for(var s in r)if(("major"===s||"minor"===s||"patch"===s)&&r[s]!==n[s])return i+s;return o},t.compareIdentifiers=g;var h=/^[0-9]+$/;function g(e,t){var r=h.test(e),n=h.test(t);return r&&n&&(e=+e,t=+t),e===t?0:r&&!n?-1:n&&!r?1:e0}function d(e,t,r){return f(e,t,r)<0}function C(e,t,r){return 0===f(e,t,r)}function E(e,t,r){return 0!==f(e,t,r)}function I(e,t,r){return f(e,t,r)>=0}function m(e,t,r){return f(e,t,r)<=0}function y(e,t,r,n){switch(t){case"===":return"object"==typeof e&&(e=e.version),"object"==typeof r&&(r=r.version),e===r;case"!==":return"object"==typeof e&&(e=e.version),"object"==typeof r&&(r=r.version),e!==r;case"":case"=":case"==":return C(e,r,n);case"!=":return E(e,r,n);case">":return p(e,r,n);case">=":return I(e,r,n);case"<":return d(e,r,n);case"<=":return m(e,r,n);default:throw new TypeError("Invalid operator: "+t)}}function w(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof w){if(e.loose===!!t.loose)return e;e=e.value}if(!(this instanceof w))return new w(e,t);r("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===B?this.value="":this.value=this.operator+this.semver.version,r("comp",this)}t.rcompareIdentifiers=function(e,t){return g(t,e)},t.major=function(e,t){return new l(e,t).major},t.minor=function(e,t){return new l(e,t).minor},t.patch=function(e,t){return new l(e,t).patch},t.compare=f,t.compareLoose=function(e,t){return f(e,t,!0)},t.compareBuild=function(e,t,r){var n=new l(e,r),i=new l(t,r);return n.compare(i)||n.compareBuild(i)},t.rcompare=function(e,t,r){return f(t,e,r)},t.sort=function(e,r){return e.sort((function(e,n){return t.compareBuild(e,n,r)}))},t.rsort=function(e,r){return e.sort((function(e,n){return t.compareBuild(n,e,r)}))},t.gt=p,t.lt=d,t.eq=C,t.neq=E,t.gte=I,t.lte=m,t.cmp=y,t.Comparator=w;var B={};function Q(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof Q)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new Q(e.raw,t);if(e instanceof w)return new Q(e.value,t);if(!(this instanceof Q))return new Q(e,t);if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map((function(e){return this.parseRange(e.trim())}),this).filter((function(e){return e.length})),!this.set.length)throw new TypeError("Invalid SemVer Range: "+e);this.format()}function v(e,t){for(var r=!0,n=e.slice(),i=n.pop();r&&n.length;)r=n.every((function(e){return i.intersects(e,t)})),i=n.pop();return r}function D(e){return!e||"x"===e.toLowerCase()||"*"===e}function b(e,t,r,n,i,o,s,A,a,c,u,l,h){return((t=D(r)?"":D(n)?">="+r+".0.0":D(i)?">="+r+"."+n+".0":">="+t)+" "+(A=D(a)?"":D(c)?"<"+(+a+1)+".0.0":D(u)?"<"+a+"."+(+c+1)+".0":l?"<="+a+"."+c+"."+u+"-"+l:"<="+A)).trim()}function S(e,t,n){for(var i=0;i0){var o=e[i].semver;if(o.major===t.major&&o.minor===t.minor&&o.patch===t.patch)return!0}return!1}return!0}function k(e,t,r){try{t=new Q(t,r)}catch(e){return!1}return t.test(e)}function x(e,t,r,n){var i,o,s,A,a;switch(e=new l(e,n),t=new Q(t,n),r){case">":i=p,o=m,s=d,A=">",a=">=";break;case"<":i=d,o=I,s=p,A="<",a="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(k(e,t,n))return!1;for(var c=0;c=0.0.0")),h=h||e,g=g||e,i(e.semver,h.semver,n)?h=e:s(e.semver,g.semver,n)&&(g=e)})),h.operator===A||h.operator===a)return!1;if((!g.operator||g.operator===A)&&o(e,g.semver))return!1;if(g.operator===a&&s(e,g.semver))return!1}return!0}w.prototype.parse=function(e){var t=this.options.loose?i[s.COMPARATORLOOSE]:i[s.COMPARATOR],r=e.match(t);if(!r)throw new TypeError("Invalid comparator: "+e);this.operator=void 0!==r[1]?r[1]:"","="===this.operator&&(this.operator=""),r[2]?this.semver=new l(r[2],this.options.loose):this.semver=B},w.prototype.toString=function(){return this.value},w.prototype.test=function(e){if(r("Comparator.test",e,this.options.loose),this.semver===B||e===B)return!0;if("string"==typeof e)try{e=new l(e,this.options)}catch(e){return!1}return y(e,this.operator,this.semver,this.options)},w.prototype.intersects=function(e,t){if(!(e instanceof w))throw new TypeError("a Comparator is required");var r;if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),""===this.operator)return""===this.value||(r=new Q(e.value,t),k(this.value,r,t));if(""===e.operator)return""===e.value||(r=new Q(this.value,t),k(e.semver,r,t));var n=!(">="!==this.operator&&">"!==this.operator||">="!==e.operator&&">"!==e.operator),i=!("<="!==this.operator&&"<"!==this.operator||"<="!==e.operator&&"<"!==e.operator),o=this.semver.version===e.semver.version,s=!(">="!==this.operator&&"<="!==this.operator||">="!==e.operator&&"<="!==e.operator),A=y(this.semver,"<",e.semver,t)&&(">="===this.operator||">"===this.operator)&&("<="===e.operator||"<"===e.operator),a=y(this.semver,">",e.semver,t)&&("<="===this.operator||"<"===this.operator)&&(">="===e.operator||">"===e.operator);return n||i||o&&s||A||a},t.Range=Q,Q.prototype.format=function(){return this.range=this.set.map((function(e){return e.join(" ").trim()})).join("||").trim(),this.range},Q.prototype.toString=function(){return this.range},Q.prototype.parseRange=function(e){var t=this.options.loose;e=e.trim();var n=t?i[s.HYPHENRANGELOOSE]:i[s.HYPHENRANGE];e=e.replace(n,b),r("hyphen replace",e),e=e.replace(i[s.COMPARATORTRIM],"$1$2$3"),r("comparator trim",e,i[s.COMPARATORTRIM]),e=(e=(e=e.replace(i[s.TILDETRIM],"$1~")).replace(i[s.CARETTRIM],"$1^")).split(/\s+/).join(" ");var o=t?i[s.COMPARATORLOOSE]:i[s.COMPARATOR],A=e.split(" ").map((function(e){return function(e,t){return r("comp",e,t),e=function(e,t){return e.trim().split(/\s+/).map((function(e){return function(e,t){r("caret",e,t);var n=t.loose?i[s.CARETLOOSE]:i[s.CARET];return e.replace(n,(function(t,n,i,o,s){var A;return r("caret",e,t,n,i,o,s),D(n)?A="":D(i)?A=">="+n+".0.0 <"+(+n+1)+".0.0":D(o)?A="0"===n?">="+n+"."+i+".0 <"+n+"."+(+i+1)+".0":">="+n+"."+i+".0 <"+(+n+1)+".0.0":s?(r("replaceCaret pr",s),A="0"===n?"0"===i?">="+n+"."+i+"."+o+"-"+s+" <"+n+"."+i+"."+(+o+1):">="+n+"."+i+"."+o+"-"+s+" <"+n+"."+(+i+1)+".0":">="+n+"."+i+"."+o+"-"+s+" <"+(+n+1)+".0.0"):(r("no pr"),A="0"===n?"0"===i?">="+n+"."+i+"."+o+" <"+n+"."+i+"."+(+o+1):">="+n+"."+i+"."+o+" <"+n+"."+(+i+1)+".0":">="+n+"."+i+"."+o+" <"+(+n+1)+".0.0"),r("caret return",A),A}))}(e,t)})).join(" ")}(e,t),r("caret",e),e=function(e,t){return e.trim().split(/\s+/).map((function(e){return function(e,t){var n=t.loose?i[s.TILDELOOSE]:i[s.TILDE];return e.replace(n,(function(t,n,i,o,s){var A;return r("tilde",e,t,n,i,o,s),D(n)?A="":D(i)?A=">="+n+".0.0 <"+(+n+1)+".0.0":D(o)?A=">="+n+"."+i+".0 <"+n+"."+(+i+1)+".0":s?(r("replaceTilde pr",s),A=">="+n+"."+i+"."+o+"-"+s+" <"+n+"."+(+i+1)+".0"):A=">="+n+"."+i+"."+o+" <"+n+"."+(+i+1)+".0",r("tilde return",A),A}))}(e,t)})).join(" ")}(e,t),r("tildes",e),e=function(e,t){return r("replaceXRanges",e,t),e.split(/\s+/).map((function(e){return function(e,t){e=e.trim();var n=t.loose?i[s.XRANGELOOSE]:i[s.XRANGE];return e.replace(n,(function(n,i,o,s,A,a){r("xRange",e,n,i,o,s,A,a);var c=D(o),u=c||D(s),l=u||D(A),h=l;return"="===i&&h&&(i=""),a=t.includePrerelease?"-0":"",c?n=">"===i||"<"===i?"<0.0.0-0":"*":i&&h?(u&&(s=0),A=0,">"===i?(i=">=",u?(o=+o+1,s=0,A=0):(s=+s+1,A=0)):"<="===i&&(i="<",u?o=+o+1:s=+s+1),n=i+o+"."+s+"."+A+a):u?n=">="+o+".0.0"+a+" <"+(+o+1)+".0.0"+a:l&&(n=">="+o+"."+s+".0"+a+" <"+o+"."+(+s+1)+".0"+a),r("xRange return",n),n}))}(e,t)})).join(" ")}(e,t),r("xrange",e),e=function(e,t){return r("replaceStars",e,t),e.trim().replace(i[s.STAR],"")}(e,t),r("stars",e),e}(e,this.options)}),this).join(" ").split(/\s+/);return this.options.loose&&(A=A.filter((function(e){return!!e.match(o)}))),A=A.map((function(e){return new w(e,this.options)}),this)},Q.prototype.intersects=function(e,t){if(!(e instanceof Q))throw new TypeError("a Range is required");return this.set.some((function(r){return v(r,t)&&e.set.some((function(e){return v(e,t)&&r.every((function(r){return e.every((function(e){return r.intersects(e,t)}))}))}))}))},t.toComparators=function(e,t){return new Q(e,t).set.map((function(e){return e.map((function(e){return e.value})).join(" ").trim().split(" ")}))},Q.prototype.test=function(e){if(!e)return!1;if("string"==typeof e)try{e=new l(e,this.options)}catch(e){return!1}for(var t=0;t":0===t.prerelease.length?t.patch++:t.prerelease.push(0),t.raw=t.format();case"":case">=":r&&!p(r,t)||(r=t);break;case"<":case"<=":break;default:throw new Error("Unexpected operation: "+e.operator)}}))}if(r&&e.test(r))return r;return null},t.validRange=function(e,t){try{return new Q(e,t).range||"*"}catch(e){return null}},t.ltr=function(e,t,r){return x(e,t,"<",r)},t.gtr=function(e,t,r){return x(e,t,">",r)},t.outside=x,t.prerelease=function(e,t){var r=u(e,t);return r&&r.prerelease.length?r.prerelease:null},t.intersects=function(e,t,r){return e=new Q(e,r),t=new Q(t,r),e.intersects(t)},t.coerce=function(e,t){if(e instanceof l)return e;"number"==typeof e&&(e=String(e));if("string"!=typeof e)return null;var r=null;if((t=t||{}).rtl){for(var n;(n=i[s.COERCERTL].exec(e))&&(!r||r.index+r[0].length!==e.length);)r&&n.index+n[0].length===r.index+r[0].length||(r=n),i[s.COERCERTL].lastIndex=n.index+n[1].length+n[2].length;i[s.COERCERTL].lastIndex=-1}else r=e.match(i[s.COERCE]);if(null===r)return null;return u(r[2]+"."+(r[3]||"0")+"."+(r[4]||"0"),t)}},29069:(e,t,r)=>{const n=Symbol("SemVer ANY");class i{static get ANY(){return n}constructor(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof i){if(e.loose===!!t.loose)return e;e=e.value}a("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===n?this.value="":this.value=this.operator+this.semver.version,a("comp",this)}parse(e){const t=this.options.loose?o[s.COMPARATORLOOSE]:o[s.COMPARATOR],r=e.match(t);if(!r)throw new TypeError("Invalid comparator: "+e);this.operator=void 0!==r[1]?r[1]:"","="===this.operator&&(this.operator=""),r[2]?this.semver=new c(r[2],this.options.loose):this.semver=n}toString(){return this.value}test(e){if(a("Comparator.test",e,this.options.loose),this.semver===n||e===n)return!0;if("string"==typeof e)try{e=new c(e,this.options)}catch(e){return!1}return A(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof i))throw new TypeError("a Comparator is required");if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),""===this.operator)return""===this.value||new u(e.value,t).test(this.value);if(""===e.operator)return""===e.value||new u(this.value,t).test(e.semver);const r=!(">="!==this.operator&&">"!==this.operator||">="!==e.operator&&">"!==e.operator),n=!("<="!==this.operator&&"<"!==this.operator||"<="!==e.operator&&"<"!==e.operator),o=this.semver.version===e.semver.version,s=!(">="!==this.operator&&"<="!==this.operator||">="!==e.operator&&"<="!==e.operator),a=A(this.semver,"<",e.semver,t)&&(">="===this.operator||">"===this.operator)&&("<="===e.operator||"<"===e.operator),c=A(this.semver,">",e.semver,t)&&("<="===this.operator||"<"===this.operator)&&(">="===e.operator||">"===e.operator);return r||n||o&&s||a||c}}e.exports=i;const{re:o,t:s}=r(49439),A=r(38754),a=r(6029),c=r(14772),u=r(73004)},73004:(e,t,r)=>{class n{constructor(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof n)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new n(e.raw,t);if(e instanceof i)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(e=>this.parseRange(e.trim())).filter(e=>e.length),!this.set.length)throw new TypeError("Invalid SemVer Range: "+e);this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){const t=this.options.loose;e=e.trim();const r=t?A[a.HYPHENRANGELOOSE]:A[a.HYPHENRANGE];e=e.replace(r,B(this.options.includePrerelease)),o("hyphen replace",e),e=e.replace(A[a.COMPARATORTRIM],c),o("comparator trim",e,A[a.COMPARATORTRIM]),e=(e=(e=e.replace(A[a.TILDETRIM],u)).replace(A[a.CARETTRIM],l)).split(/\s+/).join(" ");const n=t?A[a.COMPARATORLOOSE]:A[a.COMPARATOR];return e.split(" ").map(e=>g(e,this.options)).join(" ").split(/\s+/).map(e=>w(e,this.options)).filter(this.options.loose?e=>!!e.match(n):()=>!0).map(e=>new i(e,this.options))}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Range is required");return this.set.some(r=>h(r,t)&&e.set.some(e=>h(e,t)&&r.every(r=>e.every(e=>r.intersects(e,t)))))}test(e){if(!e)return!1;if("string"==typeof e)try{e=new s(e,this.options)}catch(e){return!1}for(let t=0;t{let r=!0;const n=e.slice();let i=n.pop();for(;r&&n.length;)r=n.every(e=>i.intersects(e,t)),i=n.pop();return r},g=(e,t)=>(o("comp",e,t),e=C(e,t),o("caret",e),e=p(e,t),o("tildes",e),e=I(e,t),o("xrange",e),e=y(e,t),o("stars",e),e),f=e=>!e||"x"===e.toLowerCase()||"*"===e,p=(e,t)=>e.trim().split(/\s+/).map(e=>d(e,t)).join(" "),d=(e,t)=>{const r=t.loose?A[a.TILDELOOSE]:A[a.TILDE];return e.replace(r,(t,r,n,i,s)=>{let A;return o("tilde",e,t,r,n,i,s),f(r)?A="":f(n)?A=`>=${r}.0.0 <${+r+1}.0.0-0`:f(i)?A=`>=${r}.${n}.0 <${r}.${+n+1}.0-0`:s?(o("replaceTilde pr",s),A=`>=${r}.${n}.${i}-${s} <${r}.${+n+1}.0-0`):A=`>=${r}.${n}.${i} <${r}.${+n+1}.0-0`,o("tilde return",A),A})},C=(e,t)=>e.trim().split(/\s+/).map(e=>E(e,t)).join(" "),E=(e,t)=>{o("caret",e,t);const r=t.loose?A[a.CARETLOOSE]:A[a.CARET],n=t.includePrerelease?"-0":"";return e.replace(r,(t,r,i,s,A)=>{let a;return o("caret",e,t,r,i,s,A),f(r)?a="":f(i)?a=`>=${r}.0.0${n} <${+r+1}.0.0-0`:f(s)?a="0"===r?`>=${r}.${i}.0${n} <${r}.${+i+1}.0-0`:`>=${r}.${i}.0${n} <${+r+1}.0.0-0`:A?(o("replaceCaret pr",A),a="0"===r?"0"===i?`>=${r}.${i}.${s}-${A} <${r}.${i}.${+s+1}-0`:`>=${r}.${i}.${s}-${A} <${r}.${+i+1}.0-0`:`>=${r}.${i}.${s}-${A} <${+r+1}.0.0-0`):(o("no pr"),a="0"===r?"0"===i?`>=${r}.${i}.${s}${n} <${r}.${i}.${+s+1}-0`:`>=${r}.${i}.${s}${n} <${r}.${+i+1}.0-0`:`>=${r}.${i}.${s} <${+r+1}.0.0-0`),o("caret return",a),a})},I=(e,t)=>(o("replaceXRanges",e,t),e.split(/\s+/).map(e=>m(e,t)).join(" ")),m=(e,t)=>{e=e.trim();const r=t.loose?A[a.XRANGELOOSE]:A[a.XRANGE];return e.replace(r,(r,n,i,s,A,a)=>{o("xRange",e,r,n,i,s,A,a);const c=f(i),u=c||f(s),l=u||f(A),h=l;return"="===n&&h&&(n=""),a=t.includePrerelease?"-0":"",c?r=">"===n||"<"===n?"<0.0.0-0":"*":n&&h?(u&&(s=0),A=0,">"===n?(n=">=",u?(i=+i+1,s=0,A=0):(s=+s+1,A=0)):"<="===n&&(n="<",u?i=+i+1:s=+s+1),"<"===n&&(a="-0"),r=`${n+i}.${s}.${A}${a}`):u?r=`>=${i}.0.0${a} <${+i+1}.0.0-0`:l&&(r=`>=${i}.${s}.0${a} <${i}.${+s+1}.0-0`),o("xRange return",r),r})},y=(e,t)=>(o("replaceStars",e,t),e.trim().replace(A[a.STAR],"")),w=(e,t)=>(o("replaceGTE0",e,t),e.trim().replace(A[t.includePrerelease?a.GTE0PRE:a.GTE0],"")),B=e=>(t,r,n,i,o,s,A,a,c,u,l,h,g)=>`${r=f(n)?"":f(i)?`>=${n}.0.0${e?"-0":""}`:f(o)?`>=${n}.${i}.0${e?"-0":""}`:s?">="+r:`>=${r}${e?"-0":""}`} ${a=f(c)?"":f(u)?`<${+c+1}.0.0-0`:f(l)?`<${c}.${+u+1}.0-0`:h?`<=${c}.${u}.${l}-${h}`:e?`<${c}.${u}.${+l+1}-0`:"<="+a}`.trim(),Q=(e,t,r)=>{for(let r=0;r0){const n=e[r].semver;if(n.major===t.major&&n.minor===t.minor&&n.patch===t.patch)return!0}return!1}return!0}},14772:(e,t,r)=>{const n=r(6029),{MAX_LENGTH:i,MAX_SAFE_INTEGER:o}=r(76483),{re:s,t:A}=r(49439),{compareIdentifiers:a}=r(99297);class c{constructor(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof c){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if("string"!=typeof e)throw new TypeError("Invalid Version: "+e);if(e.length>i)throw new TypeError(`version is longer than ${i} characters`);n("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;const r=e.trim().match(t.loose?s[A.LOOSE]:s[A.FULL]);if(!r)throw new TypeError("Invalid Version: "+e);if(this.raw=e,this.major=+r[1],this.minor=+r[2],this.patch=+r[3],this.major>o||this.major<0)throw new TypeError("Invalid major version");if(this.minor>o||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>o||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map(e=>{if(/^[0-9]+$/.test(e)){const t=+e;if(t>=0&&t=0;)"number"==typeof this.prerelease[e]&&(this.prerelease[e]++,e=-2);-1===e&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error("invalid increment argument: "+e)}return this.format(),this.raw=this.version,this}}e.exports=c},31192:(e,t,r)=>{const n=r(21883);e.exports=(e,t)=>{const r=n(e.trim().replace(/^[=v]+/,""),t);return r?r.version:null}},38754:(e,t,r)=>{const n=r(78760),i=r(83286),o=r(26544),s=r(44984),A=r(65069),a=r(93845);e.exports=(e,t,r,c)=>{switch(t){case"===":return"object"==typeof e&&(e=e.version),"object"==typeof r&&(r=r.version),e===r;case"!==":return"object"==typeof e&&(e=e.version),"object"==typeof r&&(r=r.version),e!==r;case"":case"=":case"==":return n(e,r,c);case"!=":return i(e,r,c);case">":return o(e,r,c);case">=":return s(e,r,c);case"<":return A(e,r,c);case"<=":return a(e,r,c);default:throw new TypeError("Invalid operator: "+t)}}},38113:(e,t,r)=>{const n=r(14772),i=r(21883),{re:o,t:s}=r(49439);e.exports=(e,t)=>{if(e instanceof n)return e;if("number"==typeof e&&(e=String(e)),"string"!=typeof e)return null;let r=null;if((t=t||{}).rtl){let t;for(;(t=o[s.COERCERTL].exec(e))&&(!r||r.index+r[0].length!==e.length);)r&&t.index+t[0].length===r.index+r[0].length||(r=t),o[s.COERCERTL].lastIndex=t.index+t[1].length+t[2].length;o[s.COERCERTL].lastIndex=-1}else r=e.match(o[s.COERCE]);return null===r?null:i(`${r[2]}.${r[3]||"0"}.${r[4]||"0"}`,t)}},63353:(e,t,r)=>{const n=r(14772);e.exports=(e,t,r)=>{const i=new n(e,r),o=new n(t,r);return i.compare(o)||i.compareBuild(o)}},58566:(e,t,r)=>{const n=r(17340);e.exports=(e,t)=>n(e,t,!0)},17340:(e,t,r)=>{const n=r(14772);e.exports=(e,t,r)=>new n(e,r).compare(new n(t,r))},29301:(e,t,r)=>{const n=r(21883),i=r(78760);e.exports=(e,t)=>{if(i(e,t))return null;{const r=n(e),i=n(t),o=r.prerelease.length||i.prerelease.length,s=o?"pre":"",A=o?"prerelease":"";for(const e in r)if(("major"===e||"minor"===e||"patch"===e)&&r[e]!==i[e])return s+e;return A}}},78760:(e,t,r)=>{const n=r(17340);e.exports=(e,t,r)=>0===n(e,t,r)},26544:(e,t,r)=>{const n=r(17340);e.exports=(e,t,r)=>n(e,t,r)>0},44984:(e,t,r)=>{const n=r(17340);e.exports=(e,t,r)=>n(e,t,r)>=0},24063:(e,t,r)=>{const n=r(14772);e.exports=(e,t,r,i)=>{"string"==typeof r&&(i=r,r=void 0);try{return new n(e,r).inc(t,i).version}catch(e){return null}}},65069:(e,t,r)=>{const n=r(17340);e.exports=(e,t,r)=>n(e,t,r)<0},93845:(e,t,r)=>{const n=r(17340);e.exports=(e,t,r)=>n(e,t,r)<=0},75157:(e,t,r)=>{const n=r(14772);e.exports=(e,t)=>new n(e,t).major},5195:(e,t,r)=>{const n=r(14772);e.exports=(e,t)=>new n(e,t).minor},83286:(e,t,r)=>{const n=r(17340);e.exports=(e,t,r)=>0!==n(e,t,r)},21883:(e,t,r)=>{const{MAX_LENGTH:n}=r(76483),{re:i,t:o}=r(49439),s=r(14772);e.exports=(e,t)=>{if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof s)return e;if("string"!=typeof e)return null;if(e.length>n)return null;if(!(t.loose?i[o.LOOSE]:i[o.FULL]).test(e))return null;try{return new s(e,t)}catch(e){return null}}},39592:(e,t,r)=>{const n=r(14772);e.exports=(e,t)=>new n(e,t).patch},27050:(e,t,r)=>{const n=r(21883);e.exports=(e,t)=>{const r=n(e,t);return r&&r.prerelease.length?r.prerelease:null}},93788:(e,t,r)=>{const n=r(17340);e.exports=(e,t,r)=>n(t,e,r)},15213:(e,t,r)=>{const n=r(63353);e.exports=(e,t)=>e.sort((e,r)=>n(r,e,t))},73011:(e,t,r)=>{const n=r(73004);e.exports=(e,t,r)=>{try{t=new n(t,r)}catch(e){return!1}return t.test(e)}},71102:(e,t,r)=>{const n=r(63353);e.exports=(e,t)=>e.sort((e,r)=>n(e,r,t))},99589:(e,t,r)=>{const n=r(21883);e.exports=(e,t)=>{const r=n(e,t);return r?r.version:null}},53887:(e,t,r)=>{const n=r(49439);e.exports={re:n.re,src:n.src,tokens:n.t,SEMVER_SPEC_VERSION:r(76483).SEMVER_SPEC_VERSION,SemVer:r(14772),compareIdentifiers:r(99297).compareIdentifiers,rcompareIdentifiers:r(99297).rcompareIdentifiers,parse:r(21883),valid:r(99589),clean:r(31192),inc:r(24063),diff:r(29301),major:r(75157),minor:r(5195),patch:r(39592),prerelease:r(27050),compare:r(17340),rcompare:r(93788),compareLoose:r(58566),compareBuild:r(63353),sort:r(71102),rsort:r(15213),gt:r(26544),lt:r(65069),eq:r(78760),neq:r(83286),gte:r(44984),lte:r(93845),cmp:r(38754),coerce:r(38113),Comparator:r(29069),Range:r(73004),satisfies:r(73011),toComparators:r(47753),maxSatisfying:r(1895),minSatisfying:r(33252),minVersion:r(4224),validRange:r(44315),outside:r(842),gtr:r(69258),ltr:r(36928),intersects:r(87395),simplifyRange:r(3530),subset:r(74264)}},76483:e=>{const t=Number.MAX_SAFE_INTEGER||9007199254740991;e.exports={SEMVER_SPEC_VERSION:"2.0.0",MAX_LENGTH:256,MAX_SAFE_INTEGER:t,MAX_SAFE_COMPONENT_LENGTH:16}},6029:e=>{const t="object"==typeof process&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...e)=>console.error("SEMVER",...e):()=>{};e.exports=t},99297:e=>{const t=/^[0-9]+$/,r=(e,r)=>{const n=t.test(e),i=t.test(r);return n&&i&&(e=+e,r=+r),e===r?0:n&&!i?-1:i&&!n?1:er(t,e)}},49439:(e,t,r)=>{const{MAX_SAFE_COMPONENT_LENGTH:n}=r(76483),i=r(6029),o=(t=e.exports={}).re=[],s=t.src=[],A=t.t={};let a=0;const c=(e,t,r)=>{const n=a++;i(n,t),A[e]=n,s[n]=t,o[n]=new RegExp(t,r?"g":void 0)};c("NUMERICIDENTIFIER","0|[1-9]\\d*"),c("NUMERICIDENTIFIERLOOSE","[0-9]+"),c("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*"),c("MAINVERSION",`(${s[A.NUMERICIDENTIFIER]})\\.(${s[A.NUMERICIDENTIFIER]})\\.(${s[A.NUMERICIDENTIFIER]})`),c("MAINVERSIONLOOSE",`(${s[A.NUMERICIDENTIFIERLOOSE]})\\.(${s[A.NUMERICIDENTIFIERLOOSE]})\\.(${s[A.NUMERICIDENTIFIERLOOSE]})`),c("PRERELEASEIDENTIFIER",`(?:${s[A.NUMERICIDENTIFIER]}|${s[A.NONNUMERICIDENTIFIER]})`),c("PRERELEASEIDENTIFIERLOOSE",`(?:${s[A.NUMERICIDENTIFIERLOOSE]}|${s[A.NONNUMERICIDENTIFIER]})`),c("PRERELEASE",`(?:-(${s[A.PRERELEASEIDENTIFIER]}(?:\\.${s[A.PRERELEASEIDENTIFIER]})*))`),c("PRERELEASELOOSE",`(?:-?(${s[A.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${s[A.PRERELEASEIDENTIFIERLOOSE]})*))`),c("BUILDIDENTIFIER","[0-9A-Za-z-]+"),c("BUILD",`(?:\\+(${s[A.BUILDIDENTIFIER]}(?:\\.${s[A.BUILDIDENTIFIER]})*))`),c("FULLPLAIN",`v?${s[A.MAINVERSION]}${s[A.PRERELEASE]}?${s[A.BUILD]}?`),c("FULL",`^${s[A.FULLPLAIN]}$`),c("LOOSEPLAIN",`[v=\\s]*${s[A.MAINVERSIONLOOSE]}${s[A.PRERELEASELOOSE]}?${s[A.BUILD]}?`),c("LOOSE",`^${s[A.LOOSEPLAIN]}$`),c("GTLT","((?:<|>)?=?)"),c("XRANGEIDENTIFIERLOOSE",s[A.NUMERICIDENTIFIERLOOSE]+"|x|X|\\*"),c("XRANGEIDENTIFIER",s[A.NUMERICIDENTIFIER]+"|x|X|\\*"),c("XRANGEPLAIN",`[v=\\s]*(${s[A.XRANGEIDENTIFIER]})(?:\\.(${s[A.XRANGEIDENTIFIER]})(?:\\.(${s[A.XRANGEIDENTIFIER]})(?:${s[A.PRERELEASE]})?${s[A.BUILD]}?)?)?`),c("XRANGEPLAINLOOSE",`[v=\\s]*(${s[A.XRANGEIDENTIFIERLOOSE]})(?:\\.(${s[A.XRANGEIDENTIFIERLOOSE]})(?:\\.(${s[A.XRANGEIDENTIFIERLOOSE]})(?:${s[A.PRERELEASELOOSE]})?${s[A.BUILD]}?)?)?`),c("XRANGE",`^${s[A.GTLT]}\\s*${s[A.XRANGEPLAIN]}$`),c("XRANGELOOSE",`^${s[A.GTLT]}\\s*${s[A.XRANGEPLAINLOOSE]}$`),c("COERCE",`(^|[^\\d])(\\d{1,${n}})(?:\\.(\\d{1,${n}}))?(?:\\.(\\d{1,${n}}))?(?:$|[^\\d])`),c("COERCERTL",s[A.COERCE],!0),c("LONETILDE","(?:~>?)"),c("TILDETRIM",`(\\s*)${s[A.LONETILDE]}\\s+`,!0),t.tildeTrimReplace="$1~",c("TILDE",`^${s[A.LONETILDE]}${s[A.XRANGEPLAIN]}$`),c("TILDELOOSE",`^${s[A.LONETILDE]}${s[A.XRANGEPLAINLOOSE]}$`),c("LONECARET","(?:\\^)"),c("CARETTRIM",`(\\s*)${s[A.LONECARET]}\\s+`,!0),t.caretTrimReplace="$1^",c("CARET",`^${s[A.LONECARET]}${s[A.XRANGEPLAIN]}$`),c("CARETLOOSE",`^${s[A.LONECARET]}${s[A.XRANGEPLAINLOOSE]}$`),c("COMPARATORLOOSE",`^${s[A.GTLT]}\\s*(${s[A.LOOSEPLAIN]})$|^$`),c("COMPARATOR",`^${s[A.GTLT]}\\s*(${s[A.FULLPLAIN]})$|^$`),c("COMPARATORTRIM",`(\\s*)${s[A.GTLT]}\\s*(${s[A.LOOSEPLAIN]}|${s[A.XRANGEPLAIN]})`,!0),t.comparatorTrimReplace="$1$2$3",c("HYPHENRANGE",`^\\s*(${s[A.XRANGEPLAIN]})\\s+-\\s+(${s[A.XRANGEPLAIN]})\\s*$`),c("HYPHENRANGELOOSE",`^\\s*(${s[A.XRANGEPLAINLOOSE]})\\s+-\\s+(${s[A.XRANGEPLAINLOOSE]})\\s*$`),c("STAR","(<|>)?=?\\s*\\*"),c("GTE0","^\\s*>=\\s*0.0.0\\s*$"),c("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")},89153:e=>{"use strict";e.exports={u2:"semver"}},69258:(e,t,r)=>{const n=r(842);e.exports=(e,t,r)=>n(e,t,">",r)},87395:(e,t,r)=>{const n=r(73004);e.exports=(e,t,r)=>(e=new n(e,r),t=new n(t,r),e.intersects(t))},36928:(e,t,r)=>{const n=r(842);e.exports=(e,t,r)=>n(e,t,"<",r)},1895:(e,t,r)=>{const n=r(14772),i=r(73004);e.exports=(e,t,r)=>{let o=null,s=null,A=null;try{A=new i(t,r)}catch(e){return null}return e.forEach(e=>{A.test(e)&&(o&&-1!==s.compare(e)||(o=e,s=new n(o,r)))}),o}},33252:(e,t,r)=>{const n=r(14772),i=r(73004);e.exports=(e,t,r)=>{let o=null,s=null,A=null;try{A=new i(t,r)}catch(e){return null}return e.forEach(e=>{A.test(e)&&(o&&1!==s.compare(e)||(o=e,s=new n(o,r)))}),o}},4224:(e,t,r)=>{const n=r(14772),i=r(73004),o=r(26544);e.exports=(e,t)=>{e=new i(e,t);let r=new n("0.0.0");if(e.test(r))return r;if(r=new n("0.0.0-0"),e.test(r))return r;r=null;for(let t=0;t{const t=new n(e.semver.version);switch(e.operator){case">":0===t.prerelease.length?t.patch++:t.prerelease.push(0),t.raw=t.format();case"":case">=":r&&!o(r,t)||(r=t);break;case"<":case"<=":break;default:throw new Error("Unexpected operation: "+e.operator)}})}return r&&e.test(r)?r:null}},842:(e,t,r)=>{const n=r(14772),i=r(29069),{ANY:o}=i,s=r(73004),A=r(73011),a=r(26544),c=r(65069),u=r(93845),l=r(44984);e.exports=(e,t,r,h)=>{let g,f,p,d,C;switch(e=new n(e,h),t=new s(t,h),r){case">":g=a,f=u,p=c,d=">",C=">=";break;case"<":g=c,f=l,p=a,d="<",C="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(A(e,t,h))return!1;for(let r=0;r{e.semver===o&&(e=new i(">=0.0.0")),s=s||e,A=A||e,g(e.semver,s.semver,h)?s=e:p(e.semver,A.semver,h)&&(A=e)}),s.operator===d||s.operator===C)return!1;if((!A.operator||A.operator===d)&&f(e,A.semver))return!1;if(A.operator===C&&p(e,A.semver))return!1}return!0}},3530:(e,t,r)=>{const n=r(73011),i=r(17340);e.exports=(e,t,r)=>{const o=[];let s=null,A=null;const a=e.sort((e,t)=>i(e,t,r));for(const e of a){n(e,t,r)?(A=e,s||(s=e)):(A&&o.push([s,A]),A=null,s=null)}s&&o.push([s,null]);const c=[];for(const[e,t]of o)e===t?c.push(e):t||e!==a[0]?t?e===a[0]?c.push("<="+t):c.push(`${e} - ${t}`):c.push(">="+e):c.push("*");const u=c.join(" || "),l="string"==typeof t.raw?t.raw:String(t);return u.length{const n=r(73004),{ANY:i}=r(29069),o=r(73011),s=r(17340),A=(e,t,r)=>{if(1===e.length&&e[0].semver===i)return 1===t.length&&t[0].semver===i;const n=new Set;let A,u,l,h,g,f,p;for(const t of e)">"===t.operator||">="===t.operator?A=a(A,t,r):"<"===t.operator||"<="===t.operator?u=c(u,t,r):n.add(t.semver);if(n.size>1)return null;if(A&&u){if(l=s(A.semver,u.semver,r),l>0)return null;if(0===l&&(">="!==A.operator||"<="!==u.operator))return null}for(const e of n){if(A&&!o(e,String(A),r))return null;if(u&&!o(e,String(u),r))return null;for(const n of t)if(!o(e,String(n),r))return!1;return!0}for(const e of t){if(p=p||">"===e.operator||">="===e.operator,f=f||"<"===e.operator||"<="===e.operator,A)if(">"===e.operator||">="===e.operator){if(h=a(A,e,r),h===e)return!1}else if(">="===A.operator&&!o(A.semver,String(e),r))return!1;if(u)if("<"===e.operator||"<="===e.operator){if(g=c(u,e,r),g===e)return!1}else if("<="===u.operator&&!o(u.semver,String(e),r))return!1;if(!e.operator&&(u||A)&&0!==l)return!1}return!(A&&f&&!u&&0!==l)&&!(u&&p&&!A&&0!==l)},a=(e,t,r)=>{if(!e)return t;const n=s(e.semver,t.semver,r);return n>0?e:n<0||">"===t.operator&&">="===e.operator?t:e},c=(e,t,r)=>{if(!e)return t;const n=s(e.semver,t.semver,r);return n<0?e:n>0||"<"===t.operator&&"<="===e.operator?t:e};e.exports=(e,t,r)=>{e=new n(e,r),t=new n(t,r);let i=!1;e:for(const n of e.set){for(const e of t.set){const t=A(n,e,r);if(i=i||null!==t,t)continue e}if(i)return!1}return!0}},47753:(e,t,r)=>{const n=r(73004);e.exports=(e,t)=>new n(e,t).set.map(e=>e.map(e=>e.value).join(" ").trim().split(" "))},44315:(e,t,r)=>{const n=r(73004);e.exports=(e,t)=>{try{return new n(e,t).range||"*"}catch(e){return null}}},91470:(e,t,r)=>{"use strict";const n=r(67719);e.exports=(e="")=>{const t=e.match(n);if(!t)return null;const[r,i]=t[0].replace(/#! ?/,"").split(" "),o=r.split("/").pop();return"env"===o?i:i?`${o} ${i}`:o}},67719:e=>{"use strict";e.exports=/^#!(.*)/},76458:(e,t,r)=>{var n,i=r(42357),o=r(48082),s=r(28614);function A(){u&&(u=!1,o.forEach((function(e){try{process.removeListener(e,c[e])}catch(e){}})),process.emit=f,process.reallyExit=h,n.count-=1)}function a(e,t,r){n.emitted[e]||(n.emitted[e]=!0,n.emit(e,t,r))}"function"!=typeof s&&(s=s.EventEmitter),process.__signal_exit_emitter__?n=process.__signal_exit_emitter__:((n=process.__signal_exit_emitter__=new s).count=0,n.emitted={}),n.infinite||(n.setMaxListeners(1/0),n.infinite=!0),e.exports=function(e,t){i.equal(typeof e,"function","a callback must be provided for exit handler"),!1===u&&l();var r="exit";t&&t.alwaysLast&&(r="afterexit");return n.on(r,e),function(){n.removeListener(r,e),0===n.listeners("exit").length&&0===n.listeners("afterexit").length&&A()}},e.exports.unload=A;var c={};o.forEach((function(e){c[e]=function(){process.listeners(e).length===n.count&&(A(),a("exit",null,e),a("afterexit",null,e),process.kill(process.pid,e))}})),e.exports.signals=function(){return o},e.exports.load=l;var u=!1;function l(){u||(u=!0,n.count+=1,o=o.filter((function(e){try{return process.on(e,c[e]),!0}catch(e){return!1}})),process.emit=p,process.reallyExit=g)}var h=process.reallyExit;function g(e){process.exitCode=e||0,a("exit",process.exitCode,null),a("afterexit",process.exitCode,null),h.call(process,process.exitCode)}var f=process.emit;function p(e,t){if("exit"===e){void 0!==t&&(process.exitCode=t);var r=f.apply(this,arguments);return a("exit",process.exitCode,null),a("afterexit",process.exitCode,null),r}return f.apply(this,arguments)}},48082:e=>{e.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"],"win32"!==process.platform&&e.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT"),"linux"===process.platform&&e.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")},17234:e=>{"use strict";e.exports=e=>{const t=/^\\\\\?\\/.test(e),r=/[^\u0000-\u0080]+/.test(e);return t||r?e:e.replace(/\\/g,"/")}},10129:(e,t,r)=>{"use strict";const n=r(76417),i=r(19184),o=r(92413).Transform,s=["sha256","sha384","sha512"],A=/^[a-z0-9+/]+(?:=?=?)$/i,a=/^([^-]+)-([^?]+)([?\S*]*)$/,c=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,u=/^[\x21-\x7E]+$/,l=i({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>m},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}});class h{get isHash(){return!0}constructor(e,t){const r=!!(t=l(t)).strict;this.source=e.trim();const n=this.source.match(r?c:a);if(!n)return;if(r&&!s.some(e=>e===n[1]))return;this.algorithm=n[1],this.digest=n[2];const i=n[3];this.options=i?i.slice(1).split("?"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}toString(e){if((e=l(e)).strict&&!(s.some(e=>e===this.algorithm)&&this.digest.match(A)&&(this.options||[]).every(e=>e.match(u))))return"";const t=this.options&&this.options.length?"?"+this.options.join("?"):"";return`${this.algorithm}-${this.digest}${t}`}}class g{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){let t=(e=l(e)).sep||" ";return e.strict&&(t=t.replace(/\S+/g," ")),Object.keys(this).map(r=>this[r].map(t=>h.prototype.toString.call(t,e)).filter(e=>e.length).join(t)).filter(e=>e.length).join(t)}concat(e,t){t=l(t);const r="string"==typeof e?e:d(e,t);return f(`${this.toString(t)} ${r}`,t)}hexDigest(){return f(this,{single:!0}).hexDigest()}match(e,t){const r=f(e,t=l(t)),n=r.pickAlgorithm(t);return this[n]&&r[n]&&this[n].find(e=>r[n].find(t=>e.digest===t.digest))||!1}pickAlgorithm(e){const t=(e=l(e)).pickAlgorithm,r=Object.keys(this);if(!r.length)throw new Error("No algorithms available for "+JSON.stringify(this.toString()));return r.reduce((e,r)=>t(e,r)||e)}}function f(e,t){if(t=l(t),"string"==typeof e)return p(e,t);if(e.algorithm&&e.digest){const r=new g;return r[e.algorithm]=[e],p(d(r,t),t)}return p(d(e,t),t)}function p(e,t){return t.single?new h(e,t):e.trim().split(/\s+/).reduce((e,r)=>{const n=new h(r,t);if(n.algorithm&&n.digest){const t=n.algorithm;e[t]||(e[t]=[]),e[t].push(n)}return e},new g)}function d(e,t){return t=l(t),e.algorithm&&e.digest?h.prototype.toString.call(e,t):"string"==typeof e?d(f(e,t),t):g.prototype.toString.call(e,t)}function C(e){const t=(e=l(e)).integrity&&f(e.integrity,e),r=t&&Object.keys(t).length,i=r&&t.pickAlgorithm(e),s=r&&t[i],A=Array.from(new Set(e.algorithms.concat(i?[i]:[]))),a=A.map(n.createHash);let c=0;const u=new o({transform(e,t,r){c+=e.length,a.forEach(r=>r.update(e,t)),r(null,e,t)}}).on("end",()=>{const n=e.options&&e.options.length?"?"+e.options.join("?"):"",o=f(a.map((e,t)=>`${A[t]}-${e.digest("base64")}${n}`).join(" "),e),l=r&&o.match(t,e);if("number"==typeof e.size&&c!==e.size){const r=new Error(`stream size mismatch when checking ${t}.\n Wanted: ${e.size}\n Found: ${c}`);r.code="EBADSIZE",r.found=c,r.expected=e.size,r.sri=t,u.emit("error",r)}else if(e.integrity&&!l){const e=new Error(`${t} integrity checksum failed when using ${i}: wanted ${s} but got ${o}. (${c} bytes)`);e.code="EINTEGRITY",e.found=o,e.expected=s,e.algorithm=i,e.sri=t,u.emit("error",e)}else u.emit("size",c),u.emit("integrity",o),l&&u.emit("verified",l)});return u}e.exports.Sd=function(e,t){const r=(t=l(t)).algorithms,i=t.options&&t.options.length?"?"+t.options.join("?"):"";return r.reduce((r,o)=>{const s=n.createHash(o).update(e).digest("base64"),A=new h(`${o}-${s}${i}`,t);if(A.algorithm&&A.digest){const e=A.algorithm;r[e]||(r[e]=[]),r[e].push(A)}return r},new g)};const E=new Set(n.getHashes()),I=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(e=>E.has(e));function m(e,t){return I.indexOf(e.toLowerCase())>=I.indexOf(t.toLowerCase())?e:t}},55043:(e,t,r)=>{"use strict";const n=r(7915),i=r(7347),o=r(1013),s=e=>{if("string"!=typeof(e=e.replace(o()," "))||0===e.length)return 0;e=n(e);let t=0;for(let r=0;r=127&&n<=159||(n>=768&&n<=879||(n>65535&&r++,t+=i(n)?2:1))}return t};e.exports=s,e.exports.default=s},69538:(e,t,r)=>{"use strict";var n=r(13499).Buffer,i=n.isEncoding||function(e){switch((e=""+e)&&e.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function o(e){var t;switch(this.encoding=function(e){var t=function(e){if(!e)return"utf8";for(var t;;)switch(e){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return e;default:if(t)return;e=(""+e).toLowerCase(),t=!0}}(e);if("string"!=typeof t&&(n.isEncoding===i||!i(e)))throw new Error("Unknown encoding: "+e);return t||e}(e),this.encoding){case"utf16le":this.text=a,this.end=c,t=4;break;case"utf8":this.fillLast=A,t=4;break;case"base64":this.text=u,this.end=l,t=3;break;default:return this.write=h,void(this.end=g)}this.lastNeed=0,this.lastTotal=0,this.lastChar=n.allocUnsafe(t)}function s(e){return e<=127?0:e>>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function A(e){var t=this.lastTotal-this.lastNeed,r=function(e,t,r){if(128!=(192&t[0]))return e.lastNeed=0,"�";if(e.lastNeed>1&&t.length>1){if(128!=(192&t[1]))return e.lastNeed=1,"�";if(e.lastNeed>2&&t.length>2&&128!=(192&t[2]))return e.lastNeed=2,"�"}}(this,e);return void 0!==r?r:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function a(e,t){if((e.length-t)%2==0){var r=e.toString("utf16le",t);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString("utf16le",t,e.length-1)}function c(e){var t=e&&e.length?this.write(e):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return t+this.lastChar.toString("utf16le",0,r)}return t}function u(e,t){var r=(e.length-t)%3;return 0===r?e.toString("base64",t):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString("base64",t,e.length-r))}function l(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function h(e){return e.toString(this.encoding)}function g(e){return e&&e.length?this.write(e):""}t.s=o,o.prototype.write=function(e){if(0===e.length)return"";var t,r;if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r=0)return i>0&&(e.lastNeed=i-1),i;if(--n=0)return i>0&&(e.lastNeed=i-2),i;if(--n=0)return i>0&&(2===i?i=0:e.lastNeed=i-3),i;return 0}(this,e,t);if(!this.lastNeed)return e.toString("utf8",t);this.lastTotal=r;var n=e.length-(r-this.lastNeed);return e.copy(this.lastChar,0,n),e.toString("utf8",t,n)},o.prototype.fillLast=function(e){if(this.lastNeed<=e.length)return e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,e.length),this.lastNeed-=e.length}},7915:(e,t,r)=>{"use strict";const n=r(81337);e.exports=e=>"string"==typeof e?e.replace(n(),""):e},59428:(e,t,r)=>{"use strict";const n=r(12087),i=r(33867),o=r(72918),{env:s}=process;let A;function a(e){return 0!==e&&{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function c(e,t){if(0===A)return 0;if(o("color=16m")||o("color=full")||o("color=truecolor"))return 3;if(o("color=256"))return 2;if(e&&!t&&void 0===A)return 0;const r=A||0;if("dumb"===s.TERM)return r;if("win32"===process.platform){const e=n.release().split(".");return Number(e[0])>=10&&Number(e[2])>=10586?Number(e[2])>=14931?3:2:1}if("CI"in s)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(e=>e in s)||"codeship"===s.CI_NAME?1:r;if("TEAMCITY_VERSION"in s)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(s.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in s)return 1;if("truecolor"===s.COLORTERM)return 3;if("TERM_PROGRAM"in s){const e=parseInt((s.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(s.TERM_PROGRAM){case"iTerm.app":return e>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(s.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(s.TERM)||"COLORTERM"in s?1:r}o("no-color")||o("no-colors")||o("color=false")||o("color=never")?A=0:(o("color")||o("colors")||o("color=true")||o("color=always"))&&(A=1),"FORCE_COLOR"in s&&(A="true"===s.FORCE_COLOR?1:"false"===s.FORCE_COLOR?0:0===s.FORCE_COLOR.length?1:Math.min(parseInt(s.FORCE_COLOR,10),3)),e.exports={supportsColor:function(e){return a(c(e,e&&e.isTTY))},stdout:a(c(!0,i.isatty(1))),stderr:a(c(!0,i.isatty(2)))}},93255:e=>{"use strict";function t(e){return Array.prototype.slice.apply(e)}function r(e){this.status="pending",this._continuations=[],this._parent=null,this._paused=!1,e&&e.call(this,this._continueWith.bind(this),this._failWith.bind(this))}function n(e){return e&&"function"==typeof e.then}function i(e){return e}if(r.prototype={then:function(e,t){var i=r.unresolved()._setParent(this);if(this._isRejected()){if(this._paused)return this._continuations.push({promise:i,nextFn:e,catchFn:t}),i;if(t)try{var o=t(this._error);return n(o)?(this._chainPromiseData(o,i),i):r.resolve(o)._setParent(this)}catch(e){return r.reject(e)._setParent(this)}return r.reject(this._error)._setParent(this)}return this._continuations.push({promise:i,nextFn:e,catchFn:t}),this._runResolutions(),i},catch:function(e){if(this._isResolved())return r.resolve(this._data)._setParent(this);var t=r.unresolved()._setParent(this);return this._continuations.push({promise:t,catchFn:e}),this._runRejections(),t},finally:function(e){var t=!1;function r(r,o){if(!t){t=!0,e||(e=i);var s=e(r);return n(s)?s.then((function(){if(o)throw o;return r})):r}}return this.then((function(e){return r(e)})).catch((function(e){return r(null,e)}))},pause:function(){return this._paused=!0,this},resume:function(){var e=this._findFirstPaused();return e&&(e._paused=!1,e._runResolutions(),e._runRejections()),this},_findAncestry:function(){return this._continuations.reduce((function(e,t){if(t.promise){var r={promise:t.promise,children:t.promise._findAncestry()};e.push(r)}return e}),[])},_setParent:function(e){if(this._parent)throw new Error("parent already set");return this._parent=e,this},_continueWith:function(e){var t=this._findFirstPending();t&&(t._data=e,t._setResolved())},_findFirstPending:function(){return this._findFirstAncestor((function(e){return e._isPending&&e._isPending()}))},_findFirstPaused:function(){return this._findFirstAncestor((function(e){return e._paused}))},_findFirstAncestor:function(e){for(var t,r=this;r;)e(r)&&(t=r),r=r._parent;return t},_failWith:function(e){var t=this._findFirstPending();t&&(t._error=e,t._setRejected())},_takeContinuations:function(){return this._continuations.splice(0,this._continuations.length)},_runRejections:function(){if(!this._paused&&this._isRejected()){var e=this._error,t=this._takeContinuations(),r=this;t.forEach((function(t){if(t.catchFn)try{var n=t.catchFn(e);r._handleUserFunctionResult(n,t.promise)}catch(e){t.promise.reject(e)}else t.promise.reject(e)}))}},_runResolutions:function(){if(!this._paused&&this._isResolved()&&!this._isPending()){var e=this._takeContinuations();if(n(this._data))return this._handleWhenResolvedDataIsPromise(this._data);var t=this._data,r=this;e.forEach((function(e){if(e.nextFn)try{var n=e.nextFn(t);r._handleUserFunctionResult(n,e.promise)}catch(t){r._handleResolutionError(t,e)}else e.promise&&e.promise.resolve(t)}))}},_handleResolutionError:function(e,t){if(this._setRejected(),t.catchFn)try{return void t.catchFn(e)}catch(t){e=t}t.promise&&t.promise.reject(e)},_handleWhenResolvedDataIsPromise:function(e){var t=this;return e.then((function(e){t._data=e,t._runResolutions()})).catch((function(e){t._error=e,t._setRejected(),t._runRejections()}))},_handleUserFunctionResult:function(e,t){n(e)?this._chainPromiseData(e,t):t.resolve(e)},_chainPromiseData:function(e,t){e.then((function(e){t.resolve(e)})).catch((function(e){t.reject(e)}))},_setResolved:function(){this.status="resolved",this._paused||this._runResolutions()},_setRejected:function(){this.status="rejected",this._paused||this._runRejections()},_isPending:function(){return"pending"===this.status},_isResolved:function(){return"resolved"===this.status},_isRejected:function(){return"rejected"===this.status}},r.resolve=function(e){return new r((function(t,r){n(e)?e.then((function(e){t(e)})).catch((function(e){r(e)})):t(e)}))},r.reject=function(e){return new r((function(t,r){r(e)}))},r.unresolved=function(){return new r((function(e,t){this.resolve=e,this.reject=t}))},r.all=function(){var e=t(arguments);return Array.isArray(e[0])&&(e=e[0]),e.length?new r((function(t,n){var i=[],o=0,s=!1;e.forEach((function(A,a){r.resolve(A).then((function(r){i[a]=r,(o+=1)===e.length&&t(i)})).catch((function(e){!function(e){s||(s=!0,n(e))}(e)}))}))})):r.resolve([])},Promise===r)throw new Error("Please use SynchronousPromise.installGlobally() to install globally");var o=Promise;r.installGlobally=function(e){if(Promise===r)return e;var n=function(e){if(void 0===e||e.__patched)return e;var r=e;return(e=function(){r.apply(this,t(arguments))}).__patched=!0,e}(e);return Promise=r,n},r.uninstallGlobally=function(){Promise===r&&(Promise=o)},e.exports={SynchronousPromise:r}},27700:(e,t,r)=>{"use strict";r(78886),r(84208),r(54768),r(68965),r(26842),r(29231),r(43915),t.Ze=r(67501),r(88658),r(27052),r(46464),r(76516),r(6464)},15135:(e,t,r)=>{"use strict";let n=Buffer;n.alloc||(n=r(13499).Buffer),e.exports=n},78886:(e,t,r)=>{"use strict";const n=r(59087),i=r(29231),o=(r(35747),r(28123)),s=r(54768),A=r(85622),a=(e.exports=(e,t,r)=>{if("function"==typeof t&&(r=t),Array.isArray(e)&&(t=e,e={}),!t||!Array.isArray(t)||!t.length)throw new TypeError("no files or directories specified");t=Array.from(t);const i=n(e);if(i.sync&&"function"==typeof r)throw new TypeError("callback not supported for sync tar functions");if(!i.file&&"function"==typeof r)throw new TypeError("callback only supported with file option");return i.file&&i.sync?a(i,t):i.file?c(i,t,r):i.sync?h(i,t):g(i,t)},(e,t)=>{const r=new i.Sync(e),n=new o.WriteStreamSync(e.file,{mode:e.mode||438});r.pipe(n),u(r,t)}),c=(e,t,r)=>{const n=new i(e),s=new o.WriteStream(e.file,{mode:e.mode||438});n.pipe(s);const A=new Promise((e,t)=>{s.on("error",t),s.on("close",e),n.on("error",t)});return l(n,t),r?A.then(r,r):A},u=(e,t)=>{t.forEach(t=>{"@"===t.charAt(0)?s({file:A.resolve(e.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:t=>e.add(t)}):e.add(t)}),e.end()},l=(e,t)=>{for(;t.length;){const r=t.shift();if("@"===r.charAt(0))return s({file:A.resolve(e.cwd,r.substr(1)),noResume:!0,onentry:t=>e.add(t)}).then(r=>l(e,t));e.add(r)}e.end()},h=(e,t)=>{const r=new i.Sync(e);return u(r,t),r},g=(e,t)=>{const r=new i(e);return l(r,t),r}},26842:(e,t,r)=>{"use strict";const n=r(59087),i=r(43915),o=r(35747),s=r(28123),A=r(85622),a=(e.exports=(e,t,r)=>{"function"==typeof e?(r=e,t=null,e={}):Array.isArray(e)&&(t=e,e={}),"function"==typeof t&&(r=t,t=null),t=t?Array.from(t):[];const i=n(e);if(i.sync&&"function"==typeof r)throw new TypeError("callback not supported for sync tar functions");if(!i.file&&"function"==typeof r)throw new TypeError("callback only supported with file option");return t.length&&a(i,t),i.file&&i.sync?c(i):i.file?u(i,r):i.sync?l(i):h(i)},(e,t)=>{const r=new Map(t.map(e=>[e.replace(/\/+$/,""),!0])),n=e.filter,i=(e,t)=>{const n=t||A.parse(e).root||".",o=e!==n&&(r.has(e)?r.get(e):i(A.dirname(e),n));return r.set(e,o),o};e.filter=n?(e,t)=>n(e,t)&&i(e.replace(/\/+$/,"")):e=>i(e.replace(/\/+$/,""))}),c=e=>{const t=new i.Sync(e),r=e.file;const n=o.statSync(r),A=e.maxReadSize||16777216;new s.ReadStreamSync(r,{readSize:A,size:n.size}).pipe(t)},u=(e,t)=>{const r=new i(e),n=e.maxReadSize||16777216,A=e.file,a=new Promise((e,t)=>{r.on("error",t),r.on("close",e),o.stat(A,(e,i)=>{if(e)t(e);else{const e=new s.ReadStream(A,{readSize:n,size:i.size});e.on("error",t),e.pipe(r)}})});return t?a.then(t,t):a},l=e=>new i.Sync(e),h=e=>new i(e)},46464:(e,t,r)=>{"use strict";const n=r(15135),i=r(6464),o=r(85622).posix,s=r(62488),A=Symbol("slurp"),a=Symbol("type");const c=(e,t)=>{let r,i=e,s="";const A=o.parse(e).root||".";if(n.byteLength(i)<100)r=[i,s,!1];else{s=o.dirname(i),i=o.basename(i);do{n.byteLength(i)<=100&&n.byteLength(s)<=t?r=[i,s,!1]:n.byteLength(i)>100&&n.byteLength(s)<=t?r=[i.substr(0,99),s,!0]:(i=o.join(o.basename(s),i),s=o.dirname(s))}while(s!==A&&!r);r||(r=[e.substr(0,99),"",!0])}return r},u=(e,t,r)=>e.slice(t,t+r).toString("utf8").replace(/\0.*/,""),l=(e,t,r)=>h(g(e,t,r)),h=e=>null===e?null:new Date(1e3*e),g=(e,t,r)=>128&e[t]?s.parse(e.slice(t,t+r)):f(e,t,r),f=(e,t,r)=>{return n=parseInt(e.slice(t,t+r).toString("utf8").replace(/\0.*$/,"").trim(),8),isNaN(n)?null:n;var n},p={12:8589934591,8:2097151},d=(e,t,r,n)=>null!==n&&(n>p[r]||n<0?(s.encode(n,e.slice(t,t+r)),!0):(C(e,t,r,n),!1)),C=(e,t,r,n)=>e.write(E(n,r),t,r,"ascii"),E=(e,t)=>I(Math.floor(e).toString(8),t),I=(e,t)=>(e.length===t-1?e:new Array(t-e.length-1).join("0")+e+" ")+"\0",m=(e,t,r,n)=>null!==n&&d(e,t,r,n.getTime()/1e3),y=new Array(156).join("\0"),w=(e,t,r,i)=>null!==i&&(e.write(i+y,t,r,"utf8"),i.length!==n.byteLength(i)||i.length>r);e.exports=class{constructor(e,t,r,i){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[a]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,n.isBuffer(e)?this.decode(e,t||0,r,i):e&&this.set(e)}decode(e,t,r,n){if(t||(t=0),!(e&&e.length>=t+512))throw new Error("need 512 bytes for header");if(this.path=u(e,t,100),this.mode=g(e,t+100,8),this.uid=g(e,t+108,8),this.gid=g(e,t+116,8),this.size=g(e,t+124,12),this.mtime=l(e,t+136,12),this.cksum=g(e,t+148,12),this[A](r),this[A](n,!0),this[a]=u(e,t+156,1),""===this[a]&&(this[a]="0"),"0"===this[a]&&"/"===this.path.substr(-1)&&(this[a]="5"),"5"===this[a]&&(this.size=0),this.linkpath=u(e,t+157,100),"ustar\x0000"===e.slice(t+257,t+265).toString())if(this.uname=u(e,t+265,32),this.gname=u(e,t+297,32),this.devmaj=g(e,t+329,8),this.devmin=g(e,t+337,8),0!==e[t+475]){const r=u(e,t+345,155);this.path=r+"/"+this.path}else{const r=u(e,t+345,130);r&&(this.path=r+"/"+this.path),this.atime=l(e,t+476,12),this.ctime=l(e,t+488,12)}let i=256;for(let r=t;r=t+512))throw new Error("need 512 bytes for header");const r=this.ctime||this.atime?130:155,i=c(this.path||"",r),o=i[0],s=i[1];this.needPax=i[2],this.needPax=w(e,t,100,o)||this.needPax,this.needPax=d(e,t+100,8,this.mode)||this.needPax,this.needPax=d(e,t+108,8,this.uid)||this.needPax,this.needPax=d(e,t+116,8,this.gid)||this.needPax,this.needPax=d(e,t+124,12,this.size)||this.needPax,this.needPax=m(e,t+136,12,this.mtime)||this.needPax,e[t+156]=this[a].charCodeAt(0),this.needPax=w(e,t+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",t+257,8),this.needPax=w(e,t+265,32,this.uname)||this.needPax,this.needPax=w(e,t+297,32,this.gname)||this.needPax,this.needPax=d(e,t+329,8,this.devmaj)||this.needPax,this.needPax=d(e,t+337,8,this.devmin)||this.needPax,this.needPax=w(e,t+345,r,s)||this.needPax,0!==e[t+475]?this.needPax=w(e,t+345,155,s)||this.needPax:(this.needPax=w(e,t+345,130,s)||this.needPax,this.needPax=m(e,t+476,12,this.atime)||this.needPax,this.needPax=m(e,t+488,12,this.ctime)||this.needPax);let A=256;for(let r=t;r{"use strict";const t=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"]]);e.exports=e=>e?Object.keys(e).map(r=>[t.has(r)?t.get(r):r,e[r]]).reduce((e,t)=>(e[t[0]]=t[1],e),Object.create(null)):{}},62488:(e,t)=>{"use strict";t.encode=(e,t)=>{if(!Number.isSafeInteger(e))throw TypeError("cannot encode number outside of javascript safe integer range");return e<0?n(e,t):r(e,t),t};const r=(e,t)=>{t[0]=128;for(var r=t.length;r>1;r--)t[r-1]=255&e,e=Math.floor(e/256)},n=(e,t)=>{t[0]=255;var r=!1;e*=-1;for(var n=t.length;n>1;n--){var i=255&e;e=Math.floor(e/256),r?t[n-1]=s(i):0===i?t[n-1]=0:(r=!0,t[n-1]=A(i))}},i=(t.parse=e=>{e[e.length-1];var t,r=e[0];if(128===r)t=o(e.slice(1,e.length));else{if(255!==r)throw TypeError("invalid base256 encoding");t=i(e)}if(!Number.isSafeInteger(t))throw TypeError("parsed number outside of javascript safe integer range");return t},e=>{for(var t=e.length,r=0,n=!1,i=t-1;i>-1;i--){var o,a=e[i];n?o=s(a):0===a?o=a:(n=!0,o=A(a)),0!==o&&(r-=o*Math.pow(256,t-i-1))}return r}),o=e=>{for(var t=e.length,r=0,n=t-1;n>-1;n--){var i=e[n];0!==i&&(r+=i*Math.pow(256,t-n-1))}return r},s=e=>255&(255^e),A=e=>1+(255^e)&255},54768:(e,t,r)=>{"use strict";const n=r(15135),i=r(59087),o=r(67501),s=r(35747),A=r(28123),a=r(85622),c=(e.exports=(e,t,r)=>{"function"==typeof e?(r=e,t=null,e={}):Array.isArray(e)&&(t=e,e={}),"function"==typeof t&&(r=t,t=null),t=t?Array.from(t):[];const n=i(e);if(n.sync&&"function"==typeof r)throw new TypeError("callback not supported for sync tar functions");if(!n.file&&"function"==typeof r)throw new TypeError("callback only supported with file option");return t.length&&u(n,t),n.noResume||c(n),n.file&&n.sync?l(n):n.file?h(n,r):g(n)},e=>{const t=e.onentry;e.onentry=t?e=>{t(e),e.resume()}:e=>e.resume()}),u=(e,t)=>{const r=new Map(t.map(e=>[e.replace(/\/+$/,""),!0])),n=e.filter,i=(e,t)=>{const n=t||a.parse(e).root||".",o=e!==n&&(r.has(e)?r.get(e):i(a.dirname(e),n));return r.set(e,o),o};e.filter=n?(e,t)=>n(e,t)&&i(e.replace(/\/+$/,"")):e=>i(e.replace(/\/+$/,""))},l=e=>{const t=g(e),r=e.file;let i,o=!0;try{const A=s.statSync(r),a=e.maxReadSize||16777216;if(A.size{const r=new o(e),n=e.maxReadSize||16777216,i=e.file,a=new Promise((e,t)=>{r.on("error",t),r.on("end",e),s.stat(i,(e,o)=>{if(e)t(e);else{const e=new A.ReadStream(i,{readSize:n,size:o.size});e.on("error",t),e.pipe(r)}})});return t?a.then(t,t):a},g=e=>new o(e)},65865:(e,t,r)=>{"use strict";const n=r(11436),i=r(35747),o=r(85622),s=r(82758);class A extends Error{constructor(e,t){super("Cannot extract through symbolic link"),this.path=t,this.symlink=e}get name(){return"SylinkError"}}class a extends Error{constructor(e,t){super(t+": Cannot cd into '"+e+"'"),this.path=e,this.code=t}get name(){return"CwdError"}}e.exports=(e,t,r)=>{const A=t.umask,u=448|t.mode,l=0!=(u&A),h=t.uid,g=t.gid,f="number"==typeof h&&"number"==typeof g&&(h!==t.processUid||g!==t.processGid),p=t.preserve,d=t.unlink,C=t.cache,E=t.cwd,I=(t,n)=>{t?r(t):(C.set(e,!0),n&&f?s(n,h,g,e=>I(e)):l?i.chmod(e,u,r):r())};if(C&&!0===C.get(e))return I();if(e===E)return i.stat(e,(t,r)=>{!t&&r.isDirectory()||(t=new a(e,t&&t.code||"ENOTDIR")),I(t)});if(p)return n(e,u,I);const m=o.relative(E,e).split(/\/|\\/);c(E,m,u,C,d,E,null,I)};const c=(e,t,r,n,o,s,A,a)=>{if(!t.length)return a(null,A);const l=e+"/"+t.shift();if(n.get(l))return c(l,t,r,n,o,s,A,a);i.mkdir(l,r,u(l,t,r,n,o,s,A,a))},u=(e,t,r,n,s,l,h,g)=>f=>{if(f){if(f.path&&o.dirname(f.path)===l&&("ENOTDIR"===f.code||"ENOENT"===f.code))return g(new a(l,f.code));i.lstat(e,(o,a)=>{if(o)g(o);else if(a.isDirectory())c(e,t,r,n,s,l,h,g);else if(s)i.unlink(e,o=>{if(o)return g(o);i.mkdir(e,r,u(e,t,r,n,s,l,h,g))});else{if(a.isSymbolicLink())return g(new A(e,e+"/"+t.join("/")));g(f)}})}else c(e,t,r,n,s,l,h=h||e,g)};e.exports.sync=(e,t)=>{const r=t.umask,c=448|t.mode,u=0!=(c&r),l=t.uid,h=t.gid,g="number"==typeof l&&"number"==typeof h&&(l!==t.processUid||h!==t.processGid),f=t.preserve,p=t.unlink,d=t.cache,C=t.cwd,E=t=>{d.set(e,!0),t&&g&&s.sync(t,l,h),u&&i.chmodSync(e,c)};if(d&&!0===d.get(e))return E();if(e===C){let t=!1,r="ENOTDIR";try{t=i.statSync(e).isDirectory()}catch(e){r=e.code}finally{if(!t)throw new a(e,r)}return void E()}if(f)return E(n.sync(e,c));const I=o.relative(C,e).split(/\/|\\/);let m=null;for(let e=I.shift(),t=C;e&&(t+="/"+e);e=I.shift())if(!d.get(t))try{i.mkdirSync(t,c),m=m||t,d.set(t,!0)}catch(e){if(e.path&&o.dirname(e.path)===C&&("ENOTDIR"===e.code||"ENOENT"===e.code))return new a(C,e.code);const r=i.lstatSync(t);if(r.isDirectory()){d.set(t,!0);continue}if(p){i.unlinkSync(t),i.mkdirSync(t,c),m=m||t,d.set(t,!0);continue}if(r.isSymbolicLink())return new A(t,t+"/"+I.join("/"))}return E(m)}},11754:e=>{"use strict";e.exports=(e,t)=>(e&=4095,t&&(256&e&&(e|=64),32&e&&(e|=8),4&e&&(e|=1)),e)},29231:(e,t,r)=>{"use strict";const n=r(15135);class i{constructor(e,t){this.path=e||"./",this.absolute=t,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}}const o=r(44380),s=r(20671),A=r(88658),a=r(27052),c=a.Sync,u=a.Tar,l=r(80800),h=n.alloc(1024),g=Symbol("onStat"),f=Symbol("ended"),p=Symbol("queue"),d=Symbol("current"),C=Symbol("process"),E=Symbol("processing"),I=Symbol("processJob"),m=Symbol("jobs"),y=Symbol("jobDone"),w=Symbol("addFSEntry"),B=Symbol("addTarEntry"),Q=Symbol("stat"),v=Symbol("readdir"),D=Symbol("onreaddir"),b=Symbol("pipe"),S=Symbol("entry"),k=Symbol("entryOpt"),x=Symbol("writeEntryClass"),F=Symbol("write"),M=Symbol("ondrain"),N=r(35747),R=r(85622),K=r(7994)(class extends o{constructor(e){super(e),e=e||Object.create(null),this.opt=e,this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=(e.prefix||"").replace(/(\\|\/)+$/,""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[x]=a,"function"==typeof e.onwarn&&this.on("warn",e.onwarn),this.zip=null,e.gzip?("object"!=typeof e.gzip&&(e.gzip={}),this.zip=new s.Gzip(e.gzip),this.zip.on("data",e=>super.write(e)),this.zip.on("end",e=>super.end()),this.zip.on("drain",e=>this[M]()),this.on("resume",e=>this.zip.resume())):this.on("drain",this[M]),this.portable=!!e.portable,this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter="function"==typeof e.filter?e.filter:e=>!0,this[p]=new l,this[m]=0,this.jobs=+e.jobs||4,this[E]=!1,this[f]=!1}[F](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[f]=!0,this[C](),this}write(e){if(this[f])throw new Error("write after end");return e instanceof A?this[B](e):this[w](e),this.flowing}[B](e){const t=R.resolve(this.cwd,e.path);if(this.prefix&&(e.path=this.prefix+"/"+e.path.replace(/^\.(\/+|$)/,"")),this.filter(e.path,e)){const r=new i(e.path,t,!1);r.entry=new u(e,this[k](r)),r.entry.on("end",e=>this[y](r)),this[m]+=1,this[p].push(r)}else e.resume();this[C]()}[w](e){const t=R.resolve(this.cwd,e);this.prefix&&(e=this.prefix+"/"+e.replace(/^\.(\/+|$)/,"")),this[p].push(new i(e,t)),this[C]()}[Q](e){e.pending=!0,this[m]+=1;const t=this.follow?"stat":"lstat";N[t](e.absolute,(t,r)=>{e.pending=!1,this[m]-=1,t?this.emit("error",t):this[g](e,r)})}[g](e,t){this.statCache.set(e.absolute,t),e.stat=t,this.filter(e.path,t)||(e.ignore=!0),this[C]()}[v](e){e.pending=!0,this[m]+=1,N.readdir(e.absolute,(t,r)=>{if(e.pending=!1,this[m]-=1,t)return this.emit("error",t);this[D](e,r)})}[D](e,t){this.readdirCache.set(e.absolute,t),e.readdir=t,this[C]()}[C](){if(!this[E]){this[E]=!0;for(let e=this[p].head;null!==e&&this[m]{this.warn(e,t)},noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime}}[S](e){this[m]+=1;try{return new this[x](e.path,this[k](e)).on("end",()=>this[y](e)).on("error",e=>this.emit("error",e))}catch(e){this.emit("error",e)}}[M](){this[d]&&this[d].entry&&this[d].entry.resume()}[b](e){e.piped=!0,e.readdir&&e.readdir.forEach(t=>{const r=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,n="./"===r?"":r.replace(/\/*$/,"/");this[w](n+t)});const t=e.entry,r=this.zip;r?t.on("data",e=>{r.write(e)||t.pause()}):t.on("data",e=>{super.write(e)||t.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}});K.Sync=class extends K{constructor(e){super(e),this[x]=c}pause(){}resume(){}[Q](e){const t=this.follow?"statSync":"lstatSync";this[g](e,N[t](e.absolute))}[v](e,t){this[D](e,N.readdirSync(e.absolute))}[b](e){const t=e.entry,r=this.zip;e.readdir&&e.readdir.forEach(t=>{const r=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,n="./"===r?"":r.replace(/\/*$/,"/");this[w](n+t)}),r?t.on("data",e=>{r.write(e)}):t.on("data",e=>{super[F](e)})}},e.exports=K},67501:(e,t,r)=>{"use strict";const n=r(7994),i=(r(85622),r(46464)),o=r(28614),s=r(80800),A=r(88658),a=r(76516),c=r(20671),u=r(15135),l=u.from([31,139]),h=Symbol("state"),g=Symbol("writeEntry"),f=Symbol("readEntry"),p=Symbol("nextEntry"),d=Symbol("processEntry"),C=Symbol("extendedHeader"),E=Symbol("globalExtendedHeader"),I=Symbol("meta"),m=Symbol("emitMeta"),y=Symbol("buffer"),w=Symbol("queue"),B=Symbol("ended"),Q=Symbol("emittedEnd"),v=Symbol("emit"),D=Symbol("unzip"),b=Symbol("consumeChunk"),S=Symbol("consumeChunkSub"),k=Symbol("consumeBody"),x=Symbol("consumeMeta"),F=Symbol("consumeHeader"),M=Symbol("consuming"),N=Symbol("bufferConcat"),R=Symbol("maybeEnd"),K=Symbol("writing"),L=Symbol("aborted"),T=Symbol("onDone"),P=e=>!0;e.exports=n(class extends o{constructor(e){super(e=e||{}),e.ondone?this.on(T,e.ondone):this.on(T,e=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||1048576,this.filter="function"==typeof e.filter?e.filter:P,this.writable=!0,this.readable=!1,this[w]=new s,this[y]=null,this[f]=null,this[g]=null,this[h]="begin",this[I]="",this[C]=null,this[E]=null,this[B]=!1,this[D]=null,this[L]=!1,"function"==typeof e.onwarn&&this.on("warn",e.onwarn),"function"==typeof e.onentry&&this.on("entry",e.onentry)}[F](e,t){let r;try{r=new i(e,t,this[C],this[E])}catch(e){return this.warn("invalid entry",e)}if(r.nullBlock)this[v]("nullBlock");else if(r.cksumValid)if(r.path){const e=r.type;if(/^(Symbolic)?Link$/.test(e)&&!r.linkpath)this.warn("invalid: linkpath required",r);else if(!/^(Symbolic)?Link$/.test(e)&&r.linkpath)this.warn("invalid: linkpath forbidden",r);else{const e=this[g]=new A(r,this[C],this[E]);e.meta?e.size>this.maxMetaEntrySize?(e.ignore=!0,this[v]("ignoredEntry",e),this[h]="ignore"):e.size>0&&(this[I]="",e.on("data",e=>this[I]+=e),this[h]="meta"):(this[C]=null,e.ignore=e.ignore||!this.filter(e.path,e),e.ignore?(this[v]("ignoredEntry",e),this[h]=e.remain?"ignore":"begin"):(e.remain?this[h]="body":(this[h]="begin",e.end()),this[f]?this[w].push(e):(this[w].push(e),this[p]())))}}else this.warn("invalid: path is required",r);else this.warn("invalid entry",r)}[d](e){let t=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[f]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",e=>this[p]()),t=!1)):(this[f]=null,t=!1),t}[p](){do{}while(this[d](this[w].shift()));if(!this[w].length){const e=this[f];!e||e.flowing||e.size===e.remain?this[K]||this.emit("drain"):e.once("drain",e=>this.emit("drain"))}}[k](e,t){const r=this[g],n=r.blockRemain,i=n>=e.length&&0===t?e:e.slice(t,t+n);return r.write(i),r.blockRemain||(this[h]="begin",this[g]=null,r.end()),i.length}[x](e,t){const r=this[g],n=this[k](e,t);return this[g]||this[m](r),n}[v](e,t,r){this[w].length||this[f]?this[w].push([e,t,r]):this.emit(e,t,r)}[m](e){switch(this[v]("meta",this[I]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[C]=a.parse(this[I],this[C],!1);break;case"GlobalExtendedHeader":this[E]=a.parse(this[I],this[E],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[C]=this[C]||Object.create(null),this[C].path=this[I].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[C]=this[C]||Object.create(null),this[C].linkpath=this[I].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e,t){this[L]=!0,this.warn(e,t),this.emit("abort",t),this.emit("error",t)}write(e){if(this[L])return;if(null===this[D]&&e){if(this[y]&&(e=u.concat([this[y],e]),this[y]=null),e.lengththis[b](e)),this[D].on("error",e=>this.abort(e.message,e)),this[D].on("end",e=>{this[B]=!0,this[b]()}),this[K]=!0;const r=this[D][t?"end":"write"](e);return this[K]=!1,r}}this[K]=!0,this[D]?this[D].write(e):this[b](e),this[K]=!1;const t=!this[w].length&&(!this[f]||this[f].flowing);return t||this[w].length||this[f].once("drain",e=>this.emit("drain")),t}[N](e){e&&!this[L]&&(this[y]=this[y]?u.concat([this[y],e]):e)}[R](){if(this[B]&&!this[Q]&&!this[L]&&!this[M]){this[Q]=!0;const e=this[g];if(e&&e.blockRemain){const t=this[y]?this[y].length:0;this.warn("Truncated input (needed "+e.blockRemain+" more bytes, only "+t+" available)",e),this[y]&&e.write(this[y]),e.end()}this[v](T)}}[b](e){if(this[M])this[N](e);else if(e||this[y]){if(this[M]=!0,this[y]){this[N](e);const t=this[y];this[y]=null,this[S](t)}else this[S](e);for(;this[y]&&this[y].length>=512&&!this[L];){const e=this[y];this[y]=null,this[S](e)}this[M]=!1}else this[R]();this[y]&&!this[B]||this[R]()}[S](e){let t=0,r=e.length;for(;t+512<=r&&!this[L];)switch(this[h]){case"begin":this[F](e,t),t+=512;break;case"ignore":case"body":t+=this[k](e,t);break;case"meta":t+=this[x](e,t);break;default:throw new Error("invalid state: "+this[h])}t{"use strict";const n=r(15135),i=r(46464),o=r(85622);class s{constructor(e,t){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=t||!1}encode(){const e=this.encodeBody();if(""===e)return null;const t=n.byteLength(e),r=512*Math.ceil(1+t/512),s=n.allocUnsafe(r);for(let e=0;e<512;e++)s[e]=0;new i({path:("PaxHeader/"+o.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:t,mtime:this.mtime||null,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(s),s.write(e,512,t,"utf8");for(let e=t+512;e=Math.pow(10,i)&&(i+=1);return i+r+t}}s.parse=(e,t,r)=>new s(A(a(e),t),r);const A=(e,t)=>t?Object.keys(e).reduce((t,r)=>(t[r]=e[r],t),t):e,a=e=>e.replace(/\n$/,"").split("\n").reduce(c,Object.create(null)),c=(e,t)=>{const r=parseInt(t,10);if(r!==n.byteLength(t)+1)return e;const i=(t=t.substr((r+" ").length)).split("="),o=i.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!o)return e;const s=i.join("=");return e[o]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(o)?new Date(1e3*s):/^[0-9]+$/.test(s)?+s:s,e};e.exports=s},88658:(e,t,r)=>{"use strict";r(6464);const n=r(44380),i=Symbol("slurp");e.exports=class extends n{constructor(e,t,r){switch(super(),this.pause(),this.extended=t,this.globalExtended=r,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}this.path=e.path,this.mode=e.mode,this.mode&&(this.mode=4095&this.mode),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=e.linkpath,this.uname=e.uname,this.gname=e.gname,t&&this[i](t),r&&this[i](r,!0)}write(e){const t=e.length;if(t>this.blockRemain)throw new Error("writing more to entry than is appropriate");const r=this.remain,n=this.blockRemain;return this.remain=Math.max(0,r-t),this.blockRemain=Math.max(0,n-t),!!this.ignore||(r>=t?super.write(e):super.write(e.slice(0,r)))}[i](e,t){for(let r in e)null===e[r]||void 0===e[r]||t&&"path"===r||(this[r]=e[r])}}},84208:(e,t,r)=>{"use strict";const n=r(15135),i=r(59087),o=r(29231),s=(r(67501),r(35747)),A=r(28123),a=r(54768),c=r(85622),u=r(46464),l=(e.exports=(e,t,r)=>{const n=i(e);if(!n.file)throw new TypeError("file is required");if(n.gzip)throw new TypeError("cannot append to compressed archives");if(!t||!Array.isArray(t)||!t.length)throw new TypeError("no files or directories specified");return t=Array.from(t),n.sync?l(n,t):g(n,t,r)},(e,t)=>{const r=new o.Sync(e);let i,A,a=!0;try{try{i=s.openSync(e.file,"r+")}catch(t){if("ENOENT"!==t.code)throw t;i=s.openSync(e.file,"w+")}const o=s.fstatSync(i),c=n.alloc(512);e:for(A=0;Ao.size)break;A+=r,e.mtimeCache&&e.mtimeCache.set(t.path,t.mtime)}a=!1,h(e,r,A,i,t)}finally{if(a)try{s.closeSync(i)}catch(e){}}}),h=(e,t,r,n,i)=>{const o=new A.WriteStreamSync(e.file,{fd:n,start:r});t.pipe(o),f(t,i)},g=(e,t,r)=>{t=Array.from(t);const i=new o(e),a=new Promise((r,o)=>{i.on("error",o);let a="r+";const c=(l,h)=>l&&"ENOENT"===l.code&&"r+"===a?(a="w+",s.open(e.file,a,c)):l?o(l):void s.fstat(h,(a,c)=>{if(a)return o(a);((t,r,i)=>{const o=(e,r)=>{e?s.close(t,t=>i(e)):i(null,r)};let A=0;if(0===r)return o(null,0);let a=0;const c=n.alloc(512),l=(n,i)=>{if(n)return o(n);if(a+=i,a<512&&i)return s.read(t,c,a,c.length-a,A+a,l);if(0===A&&31===c[0]&&139===c[1])return o(new Error("cannot append to compressed archives"));if(a<512)return o(null,A);const h=new u(c);if(!h.cksumValid)return o(null,A);const g=512*Math.ceil(h.size/512);return A+g+512>r?o(null,A):(A+=g+512,A>=r?o(null,A):(e.mtimeCache&&e.mtimeCache.set(h.path,h.mtime),a=0,void s.read(t,c,0,512,A,l)))};s.read(t,c,0,512,A,l)})(h,c.size,(n,s)=>{if(n)return o(n);const a=new A.WriteStream(e.file,{fd:h,start:s});i.pipe(a),a.on("error",o),a.on("close",r),p(i,t)})});s.open(e.file,a,c)});return r?a.then(r,r):a},f=(e,t)=>{t.forEach(t=>{"@"===t.charAt(0)?a({file:c.resolve(e.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:t=>e.add(t)}):e.add(t)}),e.end()},p=(e,t)=>{for(;t.length;){const r=t.shift();if("@"===r.charAt(0))return a({file:c.resolve(e.cwd,r.substr(1)),noResume:!0,onentry:t=>e.add(t)}).then(r=>p(e,t));e.add(r)}e.end()}},6464:(e,t)=>{"use strict";t.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]),t.code=new Map(Array.from(t.name).map(e=>[e[1],e[0]]))},43915:(e,t,r)=>{"use strict";const n=r(42357),i=(r(28614).EventEmitter,r(67501)),o=r(35747),s=r(28123),A=r(85622),a=r(65865),c=(a.sync,r(86895)),u=Symbol("onEntry"),l=Symbol("checkFs"),h=Symbol("isReusable"),g=Symbol("makeFs"),f=Symbol("file"),p=Symbol("directory"),d=Symbol("link"),C=Symbol("symlink"),E=Symbol("hardlink"),I=Symbol("unsupported"),m=(Symbol("unknown"),Symbol("checkPath")),y=Symbol("mkdir"),w=Symbol("onError"),B=Symbol("pending"),Q=Symbol("pend"),v=Symbol("unpend"),D=Symbol("ended"),b=Symbol("maybeClose"),S=Symbol("skip"),k=Symbol("doChown"),x=Symbol("uid"),F=Symbol("gid"),M=r(76417),N=(e,t,r)=>e===e>>>0?e:t===t>>>0?t:r;class R extends i{constructor(e){if(e||(e={}),e.ondone=e=>{this[D]=!0,this[b]()},super(e),this.transform="function"==typeof e.transform?e.transform:null,this.writable=!0,this.readable=!1,this[B]=0,this[D]=!1,this.dirCache=e.dirCache||new Map,"number"==typeof e.uid||"number"==typeof e.gid){if("number"!=typeof e.uid||"number"!=typeof e.gid)throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;void 0===e.preserveOwner&&"number"!=typeof e.uid?this.preserveOwner=process.getuid&&0===process.getuid():this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=!0===e.forceChown,this.win32=!!e.win32||"win32"===process.platform,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=A.resolve(e.cwd||process.cwd()),this.strip=+e.strip||0,this.processUmask=process.umask(),this.umask="number"==typeof e.umask?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",e=>this[u](e))}[b](){this[D]&&0===this[B]&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[m](e){if(this.strip){const t=e.path.split(/\/|\\/);if(t.length=this.strip&&(e.linkpath=t.slice(this.strip).join("/"))}}if(!this.preservePaths){const t=e.path;if(t.match(/(^|\/|\\)\.\.(\\|\/|$)/))return this.warn("path contains '..'",t),!1;if(A.win32.isAbsolute(t)){const r=A.win32.parse(t);this.warn("stripping "+r.root+" from absolute path",t),e.path=t.substr(r.root.length)}}if(this.win32){const t=A.win32.parse(e.path);e.path=""===t.root?c.encode(e.path):t.root+c.encode(e.path.substr(t.root.length))}return A.isAbsolute(e.path)?e.absolute=e.path:e.absolute=A.resolve(this.cwd,e.path),!0}[u](e){if(!this[m](e))return e.resume();switch(n.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=448|e.mode);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[l](e);case"CharacterDevice":case"BlockDevice":case"FIFO":return this[I](e)}}[w](e,t){"CwdError"===e.name?this.emit("error",e):(this.warn(e.message,e),this[v](),t.resume())}[y](e,t,r){a(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:t},r)}[k](e){return this.forceChown||this.preserveOwner&&("number"==typeof e.uid&&e.uid!==this.processUid||"number"==typeof e.gid&&e.gid!==this.processGid)||"number"==typeof this.uid&&this.uid!==this.processUid||"number"==typeof this.gid&&this.gid!==this.processGid}[x](e){return N(this.uid,e.uid,this.processUid)}[F](e){return N(this.gid,e.gid,this.processGid)}[f](e){const t=4095&e.mode||this.fmode,r=new s.WriteStream(e.absolute,{mode:t,autoClose:!1});r.on("error",t=>this[w](t,e));let n=1;const i=t=>{if(t)return this[w](t,e);0==--n&&o.close(r.fd,e=>this[v]())};r.on("finish",t=>{const s=e.absolute,A=r.fd;if(e.mtime&&!this.noMtime){n++;const t=e.atime||new Date,r=e.mtime;o.futimes(A,t,r,e=>e?o.utimes(s,t,r,t=>i(t&&e)):i())}if(this[k](e)){n++;const t=this[x](e),r=this[F](e);o.fchown(A,t,r,e=>e?o.chown(s,t,r,t=>i(t&&e)):i())}i()});const A=this.transform&&this.transform(e)||e;A!==e&&(A.on("error",t=>this[w](t,e)),e.pipe(A)),A.pipe(r)}[p](e){const t=4095&e.mode||this.dmode;this[y](e.absolute,t,t=>{if(t)return this[w](t,e);let r=1;const n=t=>{0==--r&&(this[v](),e.resume())};e.mtime&&!this.noMtime&&(r++,o.utimes(e.absolute,e.atime||new Date,e.mtime,n)),this[k](e)&&(r++,o.chown(e.absolute,this[x](e),this[F](e),n)),n()})}[I](e){this.warn("unsupported entry type: "+e.type,e),e.resume()}[C](e){this[d](e,e.linkpath,"symlink")}[E](e){this[d](e,A.resolve(this.cwd,e.linkpath),"link")}[Q](){this[B]++}[v](){this[B]--,this[b]()}[S](e){this[v](),e.resume()}[h](e,t){return"File"===e.type&&!this.unlink&&t.isFile()&&t.nlink<=1&&"win32"!==process.platform}[l](e){this[Q](),this[y](A.dirname(e.absolute),this.dmode,t=>{if(t)return this[w](t,e);o.lstat(e.absolute,(t,r)=>{r&&(this.keep||this.newer&&r.mtime>e.mtime)?this[S](e):t||this[h](e,r)?this[g](null,e):r.isDirectory()?"Directory"===e.type?e.mode&&(4095&r.mode)!==e.mode?o.chmod(e.absolute,e.mode,t=>this[g](t,e)):this[g](null,e):o.rmdir(e.absolute,t=>this[g](t,e)):((e,t)=>{if("win32"!==process.platform)return o.unlink(e,t);const r=e+".DELETE."+M.randomBytes(16).toString("hex");o.rename(e,r,e=>{if(e)return t(e);o.unlink(r,t)})})(e.absolute,t=>this[g](t,e))})})}[g](e,t){if(e)return this[w](e,t);switch(t.type){case"File":case"OldFile":case"ContiguousFile":return this[f](t);case"Link":return this[E](t);case"SymbolicLink":return this[C](t);case"Directory":case"GNUDumpDir":return this[p](t)}}[d](e,t,r){o[r](t,e.absolute,t=>{if(t)return this[w](t,e);this[v](),e.resume()})}}R.Sync=class extends R{constructor(e){super(e)}[l](e){const t=this[y](A.dirname(e.absolute),this.dmode);if(t)return this[w](t,e);try{const r=o.lstatSync(e.absolute);if(this.keep||this.newer&&r.mtime>e.mtime)return this[S](e);if(this[h](e,r))return this[g](null,e);try{return r.isDirectory()?"Directory"===e.type?e.mode&&(4095&r.mode)!==e.mode&&o.chmodSync(e.absolute,e.mode):o.rmdirSync(e.absolute):(e=>{if("win32"!==process.platform)return o.unlinkSync(e);const t=e+".DELETE."+M.randomBytes(16).toString("hex");o.renameSync(e,t),o.unlinkSync(t)})(e.absolute),this[g](null,e)}catch(t){return this[w](t,e)}}catch(t){return this[g](null,e)}}[f](e){const t=4095&e.mode||this.fmode,r=t=>{try{o.closeSync(n)}catch(e){}t&&this[w](t,e)};let n;try{n=o.openSync(e.absolute,"w",t)}catch(e){return r(e)}const i=this.transform&&this.transform(e)||e;i!==e&&(i.on("error",t=>this[w](t,e)),e.pipe(i)),i.on("data",e=>{try{o.writeSync(n,e,0,e.length)}catch(e){r(e)}}),i.on("end",t=>{let i=null;if(e.mtime&&!this.noMtime){const t=e.atime||new Date,r=e.mtime;try{o.futimesSync(n,t,r)}catch(n){try{o.utimesSync(e.absolute,t,r)}catch(e){i=n}}}if(this[k](e)){const t=this[x](e),r=this[F](e);try{o.fchownSync(n,t,r)}catch(n){try{o.chownSync(e.absolute,t,r)}catch(e){i=i||n}}}r(i)})}[p](e){const t=4095&e.mode||this.dmode,r=this[y](e.absolute,t);if(r)return this[w](r,e);if(e.mtime&&!this.noMtime)try{o.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch(r){}if(this[k](e))try{o.chownSync(e.absolute,this[x](e),this[F](e))}catch(r){}e.resume()}[y](e,t){try{return a.sync(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:t})}catch(e){return e}}[d](e,t,r){try{o[r+"Sync"](t,e.absolute),e.resume()}catch(t){return this[w](t,e)}}},e.exports=R},68965:(e,t,r)=>{"use strict";const n=r(59087),i=r(84208),o=(e.exports=(e,t,r)=>{const s=n(e);if(!s.file)throw new TypeError("file is required");if(s.gzip)throw new TypeError("cannot append to compressed archives");if(!t||!Array.isArray(t)||!t.length)throw new TypeError("no files or directories specified");return t=Array.from(t),o(s),i(s,t,r)},e=>{const t=e.filter;e.mtimeCache||(e.mtimeCache=new Map),e.filter=t?(r,n)=>t(r,n)&&!(e.mtimeCache.get(r)>n.mtime):(t,r)=>!(e.mtimeCache.get(t)>r.mtime)})},7994:e=>{"use strict";e.exports=e=>class extends e{warn(e,t){if(this.strict)if(t instanceof Error)this.emit("error",t);else{const r=new Error(e);r.data=t,this.emit("error",r)}else this.emit("warn",e,t)}}},86895:e=>{"use strict";const t=["|","<",">","?",":"],r=t.map(e=>String.fromCharCode(61440+e.charCodeAt(0))),n=new Map(t.map((e,t)=>[e,r[t]])),i=new Map(r.map((e,r)=>[e,t[r]]));e.exports={encode:e=>t.reduce((e,t)=>e.split(t).join(n.get(t)),e),decode:e=>r.reduce((e,t)=>e.split(t).join(i.get(t)),e)}},27052:(e,t,r)=>{"use strict";const n=r(15135),i=r(44380),o=r(76516),s=r(46464),A=(r(88658),r(35747)),a=r(85622),c=(r(6464),Symbol("process")),u=Symbol("file"),l=Symbol("directory"),h=Symbol("symlink"),g=Symbol("hardlink"),f=Symbol("header"),p=Symbol("read"),d=Symbol("lstat"),C=Symbol("onlstat"),E=Symbol("onread"),I=Symbol("onreadlink"),m=Symbol("openfile"),y=Symbol("onopenfile"),w=Symbol("close"),B=Symbol("mode"),Q=r(7994),v=r(86895),D=r(11754),b=Q(class extends i{constructor(e,t){if(super(t=t||{}),"string"!=typeof e)throw new TypeError("path is required");if(this.path=e,this.portable=!!t.portable,this.myuid=process.getuid&&process.getuid(),this.myuser=process.env.USER||"",this.maxReadSize=t.maxReadSize||16777216,this.linkCache=t.linkCache||new Map,this.statCache=t.statCache||new Map,this.preservePaths=!!t.preservePaths,this.cwd=t.cwd||process.cwd(),this.strict=!!t.strict,this.noPax=!!t.noPax,this.noMtime=!!t.noMtime,this.mtime=t.mtime||null,"function"==typeof t.onwarn&&this.on("warn",t.onwarn),!this.preservePaths&&a.win32.isAbsolute(e)){const t=a.win32.parse(e);this.warn("stripping "+t.root+" from absolute path",e),this.path=e.substr(t.root.length)}this.win32=!!t.win32||"win32"===process.platform,this.win32&&(this.path=v.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=t.absolute||a.resolve(this.cwd,e),""===this.path&&(this.path="./"),this.statCache.has(this.absolute)?this[C](this.statCache.get(this.absolute)):this[d]()}[d](){A.lstat(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[C](t)})}[C](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=k(e),this.emit("stat",e),this[c]()}[c](){switch(this.type){case"File":return this[u]();case"Directory":return this[l]();case"SymbolicLink":return this[h]();default:return this.end()}}[B](e){return D(e,"Directory"===this.type)}[f](){"Directory"===this.type&&this.portable&&(this.noMtime=!0),this.header=new s({path:this.path,linkpath:this.linkpath,mode:this[B](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&this.write(new o({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this.path,linkpath:this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),this.write(this.header.block)}[l](){"/"!==this.path.substr(-1)&&(this.path+="/"),this.stat.size=0,this[f](),this.end()}[h](){A.readlink(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[I](t)})}[I](e){this.linkpath=e,this[f](),this.end()}[g](e){this.type="Link",this.linkpath=a.relative(this.cwd,e),this.stat.size=0,this[f](),this.end()}[u](){if(this.stat.nlink>1){const e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){const t=this.linkCache.get(e);if(0===t.indexOf(this.cwd))return this[g](t)}this.linkCache.set(e,this.absolute)}if(this[f](),0===this.stat.size)return this.end();this[m]()}[m](){A.open(this.absolute,"r",(e,t)=>{if(e)return this.emit("error",e);this[y](t)})}[y](e){const t=512*Math.ceil(this.stat.size/512),r=Math.min(t,this.maxReadSize),i=n.allocUnsafe(r);this[p](e,i,0,i.length,0,this.stat.size,t)}[p](e,t,r,n,i,o,s){A.read(e,t,r,n,i,(A,a)=>{if(A)return this[w](e,e=>this.emit("error",A));this[E](e,t,r,n,i,o,s,a)})}[w](e,t){A.close(e,t)}[E](e,t,r,i,o,s,A,a){if(a<=0&&s>0){const t=new Error("encountered unexpected EOF");return t.path=this.absolute,t.syscall="read",t.code="EOF",this[w](e,e=>e),this.emit("error",t)}if(a>s){const t=new Error("did not encounter expected EOF");return t.path=this.absolute,t.syscall="read",t.code="EOF",this[w](e,e=>e),this.emit("error",t)}if(a===s)for(let e=a;ee);r>=i&&(t=n.allocUnsafe(i),r=0),i=t.length-r,this[p](e,t,r,i,o,s,A)}});const S=Q(class extends i{constructor(e,t){if(super(t=t||{}),this.preservePaths=!!t.preservePaths,this.portable=!!t.portable,this.strict=!!t.strict,this.noPax=!!t.noPax,this.noMtime=!!t.noMtime,this.readEntry=e,this.type=e.type,"Directory"===this.type&&this.portable&&(this.noMtime=!0),this.path=e.path,this.mode=this[B](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:t.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=e.linkpath,"function"==typeof t.onwarn&&this.on("warn",t.onwarn),a.isAbsolute(this.path)&&!this.preservePaths){const e=a.parse(this.path);this.warn("stripping "+e.root+" from absolute path",this.path),this.path=this.path.substr(e.root.length)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new s({path:this.path,linkpath:this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),this.header.encode()&&!this.noPax&&super.write(new o({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this.path,linkpath:this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[B](e){return D(e,"Directory"===this.type)}write(e){const t=e.length;if(t>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=t,super.write(e)}end(){return this.blockRemain&&this.write(n.alloc(this.blockRemain)),super.end()}});b.Sync=class extends b{constructor(e,t){super(e,t)}[d](){this[C](A.lstatSync(this.absolute))}[h](){this[I](A.readlinkSync(this.absolute))}[m](){this[y](A.openSync(this.absolute,"r"))}[p](e,t,r,n,i,o,s){let a=!0;try{const c=A.readSync(e,t,r,n,i);this[E](e,t,r,n,i,o,s,c),a=!1}finally{if(a)try{this[w](e)}catch(e){}}}[w](e){A.closeSync(e)}},b.Tar=S;const k=e=>e.isFile()?"File":e.isDirectory()?"Directory":e.isSymbolicLink()?"SymbolicLink":"Unsupported";e.exports=b},75799:(e,t,r)=>{var n=r(31669),i=r(73975),o=r(77686),s=r(86897).Writable,A=r(86897).PassThrough,a=function(){},c=function(e){return(e&=511)&&512-e},u=function(e,t){this._parent=e,this.offset=t,A.call(this)};n.inherits(u,A),u.prototype.destroy=function(e){this._parent.destroy(e)};var l=function(e){if(!(this instanceof l))return new l(e);s.call(this,e),e=e||{},this._offset=0,this._buffer=i(),this._missing=0,this._partial=!1,this._onparse=a,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var t=this,r=t._buffer,n=function(){t._continue()},A=function(e){if(t._locked=!1,e)return t.destroy(e);t._stream||n()},h=function(){t._stream=null;var e=c(t._header.size);e?t._parse(e,g):t._parse(512,E),t._locked||n()},g=function(){t._buffer.consume(c(t._header.size)),t._parse(512,E),n()},f=function(){var e=t._header.size;t._paxGlobal=o.decodePax(r.slice(0,e)),r.consume(e),h()},p=function(){var e=t._header.size;t._pax=o.decodePax(r.slice(0,e)),t._paxGlobal&&(t._pax=Object.assign({},t._paxGlobal,t._pax)),r.consume(e),h()},d=function(){var n=t._header.size;this._gnuLongPath=o.decodeLongPath(r.slice(0,n),e.filenameEncoding),r.consume(n),h()},C=function(){var n=t._header.size;this._gnuLongLinkPath=o.decodeLongPath(r.slice(0,n),e.filenameEncoding),r.consume(n),h()},E=function(){var i,s=t._offset;try{i=t._header=o.decode(r.slice(0,512),e.filenameEncoding)}catch(e){t.emit("error",e)}return r.consume(512),i?"gnu-long-path"===i.type?(t._parse(i.size,d),void n()):"gnu-long-link-path"===i.type?(t._parse(i.size,C),void n()):"pax-global-header"===i.type?(t._parse(i.size,f),void n()):"pax-header"===i.type?(t._parse(i.size,p),void n()):(t._gnuLongPath&&(i.name=t._gnuLongPath,t._gnuLongPath=null),t._gnuLongLinkPath&&(i.linkname=t._gnuLongLinkPath,t._gnuLongLinkPath=null),t._pax&&(t._header=i=function(e,t){return t.path&&(e.name=t.path),t.linkpath&&(e.linkname=t.linkpath),t.size&&(e.size=parseInt(t.size,10)),e.pax=t,e}(i,t._pax),t._pax=null),t._locked=!0,i.size&&"directory"!==i.type?(t._stream=new u(t,s),t.emit("entry",i,t._stream,A),t._parse(i.size,h),void n()):(t._parse(512,E),void t.emit("entry",i,function(e,t){var r=new u(e,t);return r.end(),r}(t,s),A))):(t._parse(512,E),void n())};this._onheader=E,this._parse(512,E)};n.inherits(l,s),l.prototype.destroy=function(e){this._destroyed||(this._destroyed=!0,e&&this.emit("error",e),this.emit("close"),this._stream&&this._stream.emit("close"))},l.prototype._parse=function(e,t){this._destroyed||(this._offset+=e,this._missing=e,t===this._onheader&&(this._partial=!1),this._onparse=t)},l.prototype._continue=function(){if(!this._destroyed){var e=this._cb;this._cb=a,this._overflow?this._write(this._overflow,void 0,e):e()}},l.prototype._write=function(e,t,r){if(!this._destroyed){var n=this._stream,i=this._buffer,o=this._missing;if(e.length&&(this._partial=!0),e.lengtho&&(s=e.slice(o),e=e.slice(0,o)),n?n.end(e):i.append(e),this._overflow=s,this._onparse()}},l.prototype._final=function(e){if(this._partial)return this.destroy(new Error("Unexpected end of data"));e()},e.exports=l},77686:(e,t)=>{var r=Buffer.alloc,n="0".charCodeAt(0),i=parseInt("7777",8),o=function(e,t,r,n){for(;rt?"7777777777777777777".slice(0,t)+" ":"0000000000000000000".slice(0,t-e.length)+e+" "};var a=function(e,t,r){if(128&(e=e.slice(t,t+r))[t=0])return function(e){var t;if(128===e[0])t=!0;else{if(255!==e[0])return null;t=!1}for(var r=!1,n=[],i=e.length-1;i>0;i--){var o=e[i];t?n.push(o):r&&0===o?n.push(0):r?(r=!1,n.push(256-o)):n.push(255-o)}var s=0,A=n.length;for(i=0;i=s?s:i>=0||(i+=s)>=0?i:0);t=Math.pow(10,r)&&r++,t+r+e};t.decodeLongPath=function(e,t){return c(e,0,e.length,t)},t.encodePax=function(e){var t="";e.name&&(t+=u(" path="+e.name+"\n")),e.linkname&&(t+=u(" linkpath="+e.linkname+"\n"));var r=e.pax;if(r)for(var n in r)t+=u(" "+n+"="+r[n]+"\n");return Buffer.from(t)},t.decodePax=function(e){for(var t={};e.length;){for(var r=0;r100;){var c=o.indexOf("/");if(-1===c)return null;a+=a?"/"+o.slice(0,c):o.slice(0,c),o=o.slice(c+1)}return Buffer.byteLength(o)>100||Buffer.byteLength(a)>155||e.linkname&&Buffer.byteLength(e.linkname)>100?null:(t.write(o),t.write(A(e.mode&i,6),100),t.write(A(e.uid,6),108),t.write(A(e.gid,6),116),t.write(A(e.size,11),124),t.write(A(e.mtime.getTime()/1e3|0,11),136),t[156]=n+function(e){switch(e){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0}(e.type),e.linkname&&t.write(e.linkname,157),t.write("ustar\x0000",257),e.uname&&t.write(e.uname,265),e.gname&&t.write(e.gname,297),t.write(A(e.devmajor||0,6),329),t.write(A(e.devminor||0,6),337),a&&t.write(a,345),t.write(A(s(t),6),148),t)},t.decode=function(e,t){var r=0===e[156]?0:e[156]-n,i=c(e,0,100,t),o=a(e,100,8),A=a(e,108,8),u=a(e,116,8),l=a(e,124,12),h=a(e,136,12),g=function(e){switch(e){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null}(r),f=0===e[157]?null:c(e,157,100,t),p=c(e,265,32),d=c(e,297,32),C=a(e,329,8),E=a(e,337,8);e[345]&&(i=c(e,345,155,t)+"/"+i),0===r&&i&&"/"===i[i.length-1]&&(r=5);var I=s(e);if(256===I)return null;if(I!==a(e,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");return{name:i,mode:o,uid:A,gid:u,size:l,mtime:new Date(1e3*h),type:g,linkname:f,uname:p,gname:d,devmajor:C,devminor:E}}},59938:(e,t,r)=>{r(75799),t.P=r(72203)},72203:(e,t,r)=>{var n=r(13302),i=r(17067),o=r(85870),s=Buffer.alloc,A=r(86897).Readable,a=r(86897).Writable,c=r(24304).StringDecoder,u=r(77686),l=parseInt("755",8),h=parseInt("644",8),g=s(1024),f=function(){},p=function(e,t){(t&=511)&&e.push(g.slice(0,512-t))};var d=function(e){a.call(this),this.written=0,this._to=e,this._destroyed=!1};o(d,a),d.prototype._write=function(e,t,r){if(this.written+=e.length,this._to.push(e))return r();this._to._drain=r},d.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var C=function(){a.call(this),this.linkname="",this._decoder=new c("utf-8"),this._destroyed=!1};o(C,a),C.prototype._write=function(e,t,r){this.linkname+=this._decoder.write(e),r()},C.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var E=function(){a.call(this),this._destroyed=!1};o(E,a),E.prototype._write=function(e,t,r){r(new Error("No body allowed for this entry"))},E.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var I=function(e){if(!(this instanceof I))return new I(e);A.call(this,e),this._drain=f,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};o(I,A),I.prototype.entry=function(e,t,r){if(this._stream)throw new Error("already piping an entry");if(!this._finalized&&!this._destroyed){"function"==typeof t&&(r=t,t=null),r||(r=f);var o=this;if(e.size&&"symlink"!==e.type||(e.size=0),e.type||(e.type=function(e){switch(e&n.S_IFMT){case n.S_IFBLK:return"block-device";case n.S_IFCHR:return"character-device";case n.S_IFDIR:return"directory";case n.S_IFIFO:return"fifo";case n.S_IFLNK:return"symlink"}return"file"}(e.mode)),e.mode||(e.mode="directory"===e.type?l:h),e.uid||(e.uid=0),e.gid||(e.gid=0),e.mtime||(e.mtime=new Date),"string"==typeof t&&(t=Buffer.from(t)),Buffer.isBuffer(t))return e.size=t.length,this._encode(e),this.push(t),p(o,e.size),process.nextTick(r),new E;if("symlink"===e.type&&!e.linkname){var s=new C;return i(s,(function(t){if(t)return o.destroy(),r(t);e.linkname=s.linkname,o._encode(e),r()})),s}if(this._encode(e),"file"!==e.type&&"contiguous-file"!==e.type)return process.nextTick(r),new E;var A=new d(this);return this._stream=A,i(A,(function(t){return o._stream=null,t?(o.destroy(),r(t)):A.written!==e.size?(o.destroy(),r(new Error("size mismatch"))):(p(o,e.size),o._finalizing&&o.finalize(),void r())})),A}},I.prototype.finalize=function(){this._stream?this._finalizing=!0:this._finalized||(this._finalized=!0,this.push(g),this.push(null))},I.prototype.destroy=function(e){this._destroyed||(this._destroyed=!0,e&&this.emit("error",e),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())},I.prototype._encode=function(e){if(!e.pax){var t=u.encode(e);if(t)return void this.push(t)}this._encodePax(e)},I.prototype._encodePax=function(e){var t=u.encodePax({name:e.name,linkname:e.linkname,pax:e.pax}),r={name:"PaxHeader",mode:e.mode,uid:e.uid,gid:e.gid,size:t.length,mtime:e.mtime,type:"pax-header",linkname:e.linkname&&"PaxHeader",uname:e.uname,gname:e.gname,devmajor:e.devmajor,devminor:e.devminor};this.push(u.encode(r)),this.push(t),p(this,t.length),r.size=e.size,r.type=e.type,this.push(u.encode(r))},I.prototype._read=function(e){var t=this._drain;this._drain=f,t()},e.exports=I},94864:(e,t,r)=>{var n=r(92413);function i(e,t,r){e=e||function(e){this.queue(e)},t=t||function(){this.queue(null)};var i=!1,o=!1,s=[],A=!1,a=new n;function c(){for(;s.length&&!a.paused;){var e=s.shift();if(null===e)return a.emit("end");a.emit("data",e)}}function u(){a.writable=!1,t.call(a),!a.readable&&a.autoDestroy&&a.destroy()}return a.readable=a.writable=!0,a.paused=!1,a.autoDestroy=!(r&&!1===r.autoDestroy),a.write=function(t){return e.call(this,t),!a.paused},a.queue=a.push=function(e){return A||(null===e&&(A=!0),s.push(e),c()),a},a.on("end",(function(){a.readable=!1,!a.writable&&a.autoDestroy&&process.nextTick((function(){a.destroy()}))})),a.end=function(e){if(!i)return i=!0,arguments.length&&a.write(e),u(),a},a.destroy=function(){if(!o)return o=!0,i=!0,s.length=0,a.writable=a.readable=!1,a.emit("close"),a},a.pause=function(){if(!a.paused)return a.paused=!0,a},a.resume=function(){return a.paused&&(a.paused=!1,a.emit("resume")),c(),a.paused||a.emit("drain"),a},a}e.exports=i,i.through=i},67783:(e,t,r)=>{ -/*! - * Tmp - * - * Copyright (c) 2011-2017 KARASZI Istvan - * - * MIT Licensed - */ -const n=r(35747),i=r(85622),o=r(76417),s=r(82941),A=process.binding("constants"),a=s(),c="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",u=/XXXXXX/,l=(A.O_CREAT||A.fs.O_CREAT)|(A.O_EXCL||A.fs.O_EXCL)|(A.O_RDWR||A.fs.O_RDWR),h=A.EBADF||A.os.errno.EBADF,g=A.ENOENT||A.os.errno.ENOENT,f=[];var p=!1,d=!1;function C(e){var t=[],r=null;try{r=o.randomBytes(e)}catch(t){r=o.pseudoRandomBytes(e)}for(var n=0;n0?e():o(new Error("Could not get a unique tmp filename, max tries reached "+t));o(null,t)}))}()}function w(e){var t=I(e)[0],r=t.name?1:t.tries||3;if(isNaN(r)||r<0)throw new Error("Invalid tries");if(t.template&&!t.template.match(u))throw new Error("Invalid template provided");do{const e=m(t);try{n.statSync(e)}catch(t){return e}}while(r-- >0);throw new Error("Could not get a unique tmp filename, max tries reached")}function B(e){const t=[e];do{for(var r=t.pop(),o=!1,s=n.readdirSync(r),A=0,a=s.length;A=0&&f.splice(i,1),r=!0,e(t)}i&&i(null)}}function b(){if(!d||p)for(;f.length;)try{f[0].call(null)}catch(e){}}function S(e){return k(e,-g,"ENOENT")}function k(e,t,r){return e.code==t||e.code==r}const x=process.versions.node.split(".").map((function(e){return parseInt(e,10)}));0===x[0]&&(x[1]<9||9===x[1]&&x[2]<5)&&process.addListener("uncaughtException",(function(e){throw d=!0,b(),e})),process.addListener("exit",(function(e){e&&(d=!0),b()})),e.exports.tmpdir=a,e.exports.dir=function(e,t){var r=I(e,t),i=r[0],o=r[1];y(i,(function(e,t){if(e)return o(e);n.mkdir(t,i.mode||448,(function(e){if(e)return o(e);o(null,t,v(t,i))}))}))},e.exports.dirSync=function(e){var t=I(e)[0];const r=w(t);return n.mkdirSync(r,t.mode||448),{name:r,removeCallback:v(r,t)}},e.exports.file=function(e,t){var r=I(e,t),i=r[0],o=r[1];i.postfix=E(i.postfix)?".tmp":i.postfix,y(i,(function(e,t){if(e)return o(e);n.open(t,l,i.mode||384,(function(e,r){return e?o(e):i.discardDescriptor?n.close(r,(function(e){if(e){try{n.unlinkSync(t)}catch(t){S(t)||(e=t)}return o(e)}o(null,t,void 0,Q(t,-1,i))})):i.detachDescriptor?o(null,t,r,Q(t,-1,i)):void o(null,t,r,Q(t,r,i))}))}))},e.exports.fileSync=function(e){var t=I(e)[0];t.postfix=t.postfix||".tmp";const r=t.discardDescriptor||t.detachDescriptor,i=w(t);var o=n.openSync(i,l,t.mode||384);return t.discardDescriptor&&(n.closeSync(o),o=void 0),{name:i,fd:o,removeCallback:Q(i,r?-1:o,t)}},e.exports.tmpName=y,e.exports.tmpNameSync=w,e.exports.setGracefulCleanup=function(){p=!0}},84615:(e,t,r)=>{"use strict"; -/*! - * to-regex-range - * - * Copyright (c) 2015-present, Jon Schlinkert. - * Released under the MIT License. - */const n=r(59235),i=(e,t,r)=>{if(!1===n(e))throw new TypeError("toRegexRange: expected the first argument to be a number");if(void 0===t||e===t)return String(e);if(!1===n(t))throw new TypeError("toRegexRange: expected the second argument to be a number.");let o={relaxZeros:!0,...r};"boolean"==typeof o.strictZeros&&(o.relaxZeros=!1===o.strictZeros);let a=e+":"+t+"="+String(o.relaxZeros)+String(o.shorthand)+String(o.capture)+String(o.wrap);if(i.cache.hasOwnProperty(a))return i.cache[a].result;let c=Math.min(e,t),u=Math.max(e,t);if(1===Math.abs(c-u)){let r=e+"|"+t;return o.capture?`(${r})`:!1===o.wrap?r:`(?:${r})`}let l=f(e)||f(t),h={min:e,max:t,a:c,b:u},g=[],p=[];if(l&&(h.isPadded=l,h.maxLen=String(h.max).length),c<0){p=s(u<0?Math.abs(u):1,Math.abs(c),h,o),c=h.a=0}return u>=0&&(g=s(c,u,h,o)),h.negatives=p,h.positives=g,h.result=function(e,t,r){let n=A(e,t,"-",!1,r)||[],i=A(t,e,"",!1,r)||[],o=A(e,t,"-?",!0,r)||[];return n.concat(o).concat(i).join("|")}(p,g,o),!0===o.capture?h.result=`(${h.result})`:!1!==o.wrap&&g.length+p.length>1&&(h.result=`(?:${h.result})`),i.cache[a]=h,h.result};function o(e,t,r){if(e===t)return{pattern:e,count:[],digits:0};let n=function(e,t){let r=[];for(let n=0;n1&&i.count.pop(),i.count.push(a.count[0]),i.string=i.pattern+h(i.count),c=t+1)}return A}function A(e,t,r,n,i){let o=[];for(let i of e){let{string:e}=i;n||c(t,"string",e)||o.push(r+e),n&&c(t,"string",e)&&o.push(r+e)}return o}function a(e,t){return e>t?1:t>e?-1:0}function c(e,t,r){return e.some(e=>e[t]===r)}function u(e,t){return Number(String(e).slice(0,-t)+"9".repeat(t))}function l(e,t){return e-e%Math.pow(10,t)}function h(e){let[t=0,r=""]=e;return r||t>1?`{${t+(r?","+r:"")}}`:""}function g(e,t,r){return`[${e}${t-e==1?"":"-"}${t}]`}function f(e){return/^-?(0+)\d/.test(e)}function p(e,t,r){if(!t.isPadded)return e;let n=Math.abs(t.maxLen-String(e).length),i=!1!==r.relaxZeros;switch(n){case 0:return"";case 1:return i?"0?":"0";case 2:return i?"0{0,2}":"00";default:return i?`0{0,${n}}`:`0{${n}}`}}i.cache={},i.clearCache=()=>i.cache={},e.exports=i},75158:e=>{function t(e,t){var r=e.length,n=new Array(r),i={},o=r,s=function(e){for(var t=new Map,r=0,n=e.length;r0&&(i.forEach((function(e,t){t>0&&(u+=(e[1]?" ":"│")+" "),c||e[0]!==r||(c=!0)})),u+=function(e,t){var r=t?"â””":"├";return r+=e?"─ ":"──â”"}(t,n)+t,o&&("object"!=typeof r||r instanceof Date)&&(u+=": "+r),c&&(u+=" (circular ref.)"),A(u)),!c&&"object"==typeof r){var g=function(e,t){var r=[];for(var n in e)e.hasOwnProperty(n)&&(t&&"function"==typeof e[n]||r.push(n));return r}(r,s);g.forEach((function(t){a=++l===g.length,e(t,r[t],a,h,o,s,A)}))}}var t={asLines:function(t,r,n,i){e(".",t,!1,[],r,"function"!=typeof n&&n,i||n)},asTree:function(t,r,n){var i="";return e(".",t,!1,[],r,n,(function(e){i+=e+"\n"})),i}};return t}()},36370:(e,t,r)=>{"use strict";r.d(t,{ZT:()=>i,gn:()=>o}); -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -var n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};function i(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}function o(e,t,r,n){var i,o=arguments.length,s=o<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,n);else for(var A=e.length-1;A>=0;A--)(i=e[A])&&(s=(o<3?i(s):o>3?i(t,r,s):i(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s}},98161:(e,t,r)=>{e.exports=r(69876)},69876:(e,t,r)=>{"use strict";r(11631);var n,i=r(4016),o=r(98605),s=r(57211),A=r(28614),a=(r(42357),r(31669));function c(e){var t=this;t.options=e||{},t.proxyOptions=t.options.proxy||{},t.maxSockets=t.options.maxSockets||o.Agent.defaultMaxSockets,t.requests=[],t.sockets=[],t.on("free",(function(e,r,n,i){for(var o=l(r,n,i),s=0,A=t.requests.length;s=this.maxSockets?i.requests.push(o):i.createSocket(o,(function(t){function r(){i.emit("free",t,o)}function n(e){i.removeSocket(t),t.removeListener("free",r),t.removeListener("close",n),t.removeListener("agentRemove",n)}t.on("free",r),t.on("close",n),t.on("agentRemove",n),e.onSocket(t)}))},c.prototype.createSocket=function(e,t){var r=this,i={};r.sockets.push(i);var o=h({},r.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(o.localAddress=e.localAddress),o.proxyAuth&&(o.headers=o.headers||{},o.headers["Proxy-Authorization"]="Basic "+new Buffer(o.proxyAuth).toString("base64")),n("making CONNECT request");var s=r.request(o);function A(o,A,a){var c;return s.removeAllListeners(),A.removeAllListeners(),200!==o.statusCode?(n("tunneling socket could not be established, statusCode=%d",o.statusCode),A.destroy(),(c=new Error("tunneling socket could not be established, statusCode="+o.statusCode)).code="ECONNRESET",e.request.emit("error",c),void r.removeSocket(i)):a.length>0?(n("got illegal response body from proxy"),A.destroy(),(c=new Error("got illegal response body from proxy")).code="ECONNRESET",e.request.emit("error",c),void r.removeSocket(i)):(n("tunneling connection has established"),r.sockets[r.sockets.indexOf(i)]=A,t(A))}s.useChunkedEncodingByDefault=!1,s.once("response",(function(e){e.upgrade=!0})),s.once("upgrade",(function(e,t,r){process.nextTick((function(){A(e,t,r)}))})),s.once("connect",A),s.once("error",(function(t){s.removeAllListeners(),n("tunneling socket could not be established, cause=%s\n",t.message,t.stack);var o=new Error("tunneling socket could not be established, cause="+t.message);o.code="ECONNRESET",e.request.emit("error",o),r.removeSocket(i)})),s.end()},c.prototype.removeSocket=function(e){var t=this.sockets.indexOf(e);if(-1!==t){this.sockets.splice(t,1);var r=this.requests.shift();r&&this.createSocket(r,(function(e){r.request.onSocket(e)}))}},n=process.env.NODE_DEBUG&&/\btunnel\b/.test(process.env.NODE_DEBUG)?function(){var e=Array.prototype.slice.call(arguments);"string"==typeof e[0]?e[0]="TUNNEL: "+e[0]:e.unshift("TUNNEL:"),console.error.apply(console,e)}:function(){},t.debug=n},5817:(e,t,r)=>{var n;e=r.nmd(e),function(){var r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||this||{},i=r._,o=Array.prototype,s=Object.prototype,A="undefined"!=typeof Symbol?Symbol.prototype:null,a=o.push,c=o.slice,u=s.toString,l=s.hasOwnProperty,h=Array.isArray,g=Object.keys,f=Object.create,p=function(){},d=function(e){return e instanceof d?e:this instanceof d?void(this._wrapped=e):new d(e)};t.nodeType?r._=d:(!e.nodeType&&e.exports&&(t=e.exports=d),t._=d),d.VERSION="1.9.1";var C,E=function(e,t,r){if(void 0===t)return e;switch(null==r?3:r){case 1:return function(r){return e.call(t,r)};case 3:return function(r,n,i){return e.call(t,r,n,i)};case 4:return function(r,n,i,o){return e.call(t,r,n,i,o)}}return function(){return e.apply(t,arguments)}},I=function(e,t,r){return d.iteratee!==C?d.iteratee(e,t):null==e?d.identity:d.isFunction(e)?E(e,t,r):d.isObject(e)&&!d.isArray(e)?d.matcher(e):d.property(e)};d.iteratee=C=function(e,t){return I(e,t,1/0)};var m=function(e,t){return t=null==t?e.length-1:+t,function(){for(var r=Math.max(arguments.length-t,0),n=Array(r),i=0;i=0&&t<=v};d.each=d.forEach=function(e,t,r){var n,i;if(t=E(t,r),b(e))for(n=0,i=e.length;n0?0:s-1;for(i||(n=t[o?o[A]:A],A+=e);A>=0&&A=3;return t(e,E(r,i,4),n,o)}};d.reduce=d.foldl=d.inject=S(1),d.reduceRight=d.foldr=S(-1),d.find=d.detect=function(e,t,r){var n=(b(e)?d.findIndex:d.findKey)(e,t,r);if(void 0!==n&&-1!==n)return e[n]},d.filter=d.select=function(e,t,r){var n=[];return t=I(t,r),d.each(e,(function(e,r,i){t(e,r,i)&&n.push(e)})),n},d.reject=function(e,t,r){return d.filter(e,d.negate(I(t)),r)},d.every=d.all=function(e,t,r){t=I(t,r);for(var n=!b(e)&&d.keys(e),i=(n||e).length,o=0;o=0},d.invoke=m((function(e,t,r){var n,i;return d.isFunction(t)?i=t:d.isArray(t)&&(n=t.slice(0,-1),t=t[t.length-1]),d.map(e,(function(e){var o=i;if(!o){if(n&&n.length&&(e=Q(e,n)),null==e)return;o=e[t]}return null==o?o:o.apply(e,r)}))})),d.pluck=function(e,t){return d.map(e,d.property(t))},d.where=function(e,t){return d.filter(e,d.matcher(t))},d.findWhere=function(e,t){return d.find(e,d.matcher(t))},d.max=function(e,t,r){var n,i,o=-1/0,s=-1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var A=0,a=(e=b(e)?e:d.values(e)).length;Ao&&(o=n);else t=I(t,r),d.each(e,(function(e,r,n){((i=t(e,r,n))>s||i===-1/0&&o===-1/0)&&(o=e,s=i)}));return o},d.min=function(e,t,r){var n,i,o=1/0,s=1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var A=0,a=(e=b(e)?e:d.values(e)).length;An||void 0===r)return 1;if(r0?0:i-1;o>=0&&o0?s=o>=0?o:Math.max(o+A,s):A=o>=0?Math.min(o+1,A):o+A+1;else if(r&&o&&A)return n[o=r(n,i)]===i?o:-1;if(i!=i)return(o=t(c.call(n,s,A),d.isNaN))>=0?o+s:-1;for(o=e>0?s:A-1;o>=0&&ot?(n&&(clearTimeout(n),n=null),A=c,s=e.apply(i,o),n||(i=o=null)):n||!1===r.trailing||(n=setTimeout(a,u)),s};return c.cancel=function(){clearTimeout(n),A=0,n=i=o=null},c},d.debounce=function(e,t,r){var n,i,o=function(t,r){n=null,r&&(i=e.apply(t,r))},s=m((function(s){if(n&&clearTimeout(n),r){var A=!n;n=setTimeout(o,t),A&&(i=e.apply(this,s))}else n=d.delay(o,t,this,s);return i}));return s.cancel=function(){clearTimeout(n),n=null},s},d.wrap=function(e,t){return d.partial(t,e)},d.negate=function(e){return function(){return!e.apply(this,arguments)}},d.compose=function(){var e=arguments,t=e.length-1;return function(){for(var r=t,n=e[t].apply(this,arguments);r--;)n=e[r].call(this,n);return n}},d.after=function(e,t){return function(){if(--e<1)return t.apply(this,arguments)}},d.before=function(e,t){var r;return function(){return--e>0&&(r=t.apply(this,arguments)),e<=1&&(t=null),r}},d.once=d.partial(d.before,2),d.restArguments=m;var K=!{toString:null}.propertyIsEnumerable("toString"),L=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],T=function(e,t){var r=L.length,n=e.constructor,i=d.isFunction(n)&&n.prototype||s,o="constructor";for(B(e,o)&&!d.contains(t,o)&&t.push(o);r--;)(o=L[r])in e&&e[o]!==i[o]&&!d.contains(t,o)&&t.push(o)};d.keys=function(e){if(!d.isObject(e))return[];if(g)return g(e);var t=[];for(var r in e)B(e,r)&&t.push(r);return K&&T(e,t),t},d.allKeys=function(e){if(!d.isObject(e))return[];var t=[];for(var r in e)t.push(r);return K&&T(e,t),t},d.values=function(e){for(var t=d.keys(e),r=t.length,n=Array(r),i=0;i1&&(n=E(n,t[1])),t=d.allKeys(e)):(n=O,t=F(t,!1,!1),e=Object(e));for(var i=0,o=t.length;i1&&(r=t[1])):(t=d.map(F(t,!1,!1),String),n=function(e,r){return!d.contains(t,r)}),d.pick(e,n,r)})),d.defaults=P(d.allKeys,!0),d.create=function(e,t){var r=y(e);return t&&d.extendOwn(r,t),r},d.clone=function(e){return d.isObject(e)?d.isArray(e)?e.slice():d.extend({},e):e},d.tap=function(e,t){return t(e),e},d.isMatch=function(e,t){var r=d.keys(t),n=r.length;if(null==e)return!n;for(var i=Object(e),o=0;o":">",'"':""","'":"'","`":"`"},G=d.invert(Y),J=function(e){var t=function(t){return e[t]},r="(?:"+d.keys(e).join("|")+")",n=RegExp(r),i=RegExp(r,"g");return function(e){return e=null==e?"":""+e,n.test(e)?e.replace(i,t):e}};d.escape=J(Y),d.unescape=J(G),d.result=function(e,t,r){d.isArray(t)||(t=[t]);var n=t.length;if(!n)return d.isFunction(r)?r.call(e):r;for(var i=0;i/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,z={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},W=/\\|'|\r|\n|\u2028|\u2029/g,V=function(e){return"\\"+z[e]};d.template=function(e,t,r){!t&&r&&(t=r),t=d.defaults({},t,d.templateSettings);var n,i=RegExp([(t.escape||q).source,(t.interpolate||q).source,(t.evaluate||q).source].join("|")+"|$","g"),o=0,s="__p+='";e.replace(i,(function(t,r,n,i,A){return s+=e.slice(o,A).replace(W,V),o=A+t.length,r?s+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":n?s+="'+\n((__t=("+n+"))==null?'':__t)+\n'":i&&(s+="';\n"+i+"\n__p+='"),t})),s+="';\n",t.variable||(s="with(obj||{}){\n"+s+"}\n"),s="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+s+"return __p;\n";try{n=new Function(t.variable||"obj","_",s)}catch(e){throw e.source=s,e}var A=function(e){return n.call(this,e,d)},a=t.variable||"obj";return A.source="function("+a+"){\n"+s+"}",A},d.chain=function(e){var t=d(e);return t._chain=!0,t};var X=function(e,t){return e._chain?d(t).chain():t};d.mixin=function(e){return d.each(d.functions(e),(function(t){var r=d[t]=e[t];d.prototype[t]=function(){var e=[this._wrapped];return a.apply(e,arguments),X(this,r.apply(d,e))}})),d},d.mixin(d),d.each(["pop","push","reverse","shift","sort","splice","unshift"],(function(e){var t=o[e];d.prototype[e]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==e&&"splice"!==e||0!==r.length||delete r[0],X(this,r)}})),d.each(["concat","join","slice"],(function(e){var t=o[e];d.prototype[e]=function(){return X(this,t.apply(this._wrapped,arguments))}})),d.prototype.value=function(){return this._wrapped},d.prototype.valueOf=d.prototype.toJSON=d.prototype.value,d.prototype.toString=function(){return String(this._wrapped)},void 0===(n=function(){return d}.apply(t,[]))||(e.exports=n)}()},73212:(e,t,r)=>{e.exports=r(31669).deprecate},87945:(e,t,r)=>{const n="win32"===process.platform||"cygwin"===process.env.OSTYPE||"msys"===process.env.OSTYPE,i=r(85622),o=n?";":":",s=r(64151),A=e=>Object.assign(new Error("not found: "+e),{code:"ENOENT"}),a=(e,t)=>{const r=t.colon||o,i=e.match(/\//)||n&&e.match(/\\/)?[""]:[...n?[process.cwd()]:[],...(t.path||process.env.PATH||"").split(r)],s=n?t.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",A=n?s.split(r):[""];return n&&-1!==e.indexOf(".")&&""!==A[0]&&A.unshift(""),{pathEnv:i,pathExt:A,pathExtExe:s}},c=(e,t,r)=>{"function"==typeof t&&(r=t,t={}),t||(t={});const{pathEnv:n,pathExt:o,pathExtExe:c}=a(e,t),u=[],l=r=>new Promise((o,s)=>{if(r===n.length)return t.all&&u.length?o(u):s(A(e));const a=n[r],c=/^".*"$/.test(a)?a.slice(1,-1):a,l=i.join(c,e),g=!c&&/^\.[\\\/]/.test(e)?e.slice(0,2)+l:l;o(h(g,r,0))}),h=(e,r,n)=>new Promise((i,A)=>{if(n===o.length)return i(l(r+1));const a=o[n];s(e+a,{pathExt:c},(o,s)=>{if(!o&&s){if(!t.all)return i(e+a);u.push(e+a)}return i(h(e,r,n+1))})});return r?l(0).then(e=>r(null,e),r):l(0)};e.exports=c,c.sync=(e,t)=>{t=t||{};const{pathEnv:r,pathExt:n,pathExtExe:o}=a(e,t),c=[];for(let A=0;A{e.exports=function e(t,r){if(t&&r)return e(t)(r);if("function"!=typeof t)throw new TypeError("need wrapper function");return Object.keys(t).forEach((function(e){n[e]=t[e]})),n;function n(){for(var e=new Array(arguments.length),r=0;r{"use strict";e.exports=function(e){e.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}},80800:(e,t,r)=>{"use strict";function n(e){var t=this;if(t instanceof n||(t=new n),t.tail=null,t.head=null,t.length=0,e&&"function"==typeof e.forEach)e.forEach((function(e){t.push(e)}));else if(arguments.length>0)for(var r=0,i=arguments.length;r1)r=t;else{if(!this.head)throw new TypeError("Reduce of empty list with no initial value");n=this.head.next,r=this.head.value}for(var i=0;null!==n;i++)r=e(r,n.value,i),n=n.next;return r},n.prototype.reduceReverse=function(e,t){var r,n=this.tail;if(arguments.length>1)r=t;else{if(!this.tail)throw new TypeError("Reduce of empty list with no initial value");n=this.tail.prev,r=this.tail.value}for(var i=this.length-1;null!==n;i--)r=e(r,n.value,i),n=n.prev;return r},n.prototype.toArray=function(){for(var e=new Array(this.length),t=0,r=this.head;null!==r;t++)e[t]=r.value,r=r.next;return e},n.prototype.toArrayReverse=function(){for(var e=new Array(this.length),t=0,r=this.tail;null!==r;t++)e[t]=r.value,r=r.prev;return e},n.prototype.slice=function(e,t){(t=t||this.length)<0&&(t+=this.length),(e=e||0)<0&&(e+=this.length);var r=new n;if(tthis.length&&(t=this.length);for(var i=0,o=this.head;null!==o&&ithis.length&&(t=this.length);for(var i=this.length,o=this.tail;null!==o&&i>t;i--)o=o.prev;for(;null!==o&&i>e;i--,o=o.prev)r.push(o.value);return r},n.prototype.reverse=function(){for(var e=this.head,t=this.tail,r=e;null!==r;r=r.prev){var n=r.prev;r.prev=r.next,r.next=n}return this.head=t,this.tail=e,this};try{r(99770)(n)}catch(e){}},94916:(e,t,r)=>{"use strict";var n=r(60087);t.__esModule=!0,t.default=void 0;var i=n(r(15215)),o=n(r(11050)),s=function(){function e(e,t){if(this.refs=e,"function"!=typeof t){if(!(0,i.default)(t,"is"))throw new TypeError("`is:` is required for `when()` conditions");if(!t.then&&!t.otherwise)throw new TypeError("either `then:` or `otherwise:` is required for `when()` conditions");var r=t.is,n=t.then,o=t.otherwise,s="function"==typeof r?r:function(){for(var e=arguments.length,t=new Array(e),n=0;n{"use strict";var n=r(60087);t.__esModule=!0,t.default=void 0;var i=n(r(11050)),o=function(){function e(e){this._resolve=function(t,r){var n=e(t,r);if(!(0,i.default)(n))throw new TypeError("lazy() functions must return a valid schema");return n.resolve(r)}}var t=e.prototype;return t.resolve=function(e){return this._resolve(e.value,e)},t.cast=function(e,t){return this._resolve(e,t).cast(e,t)},t.validate=function(e,t){return this._resolve(e,t).validate(e,t)},t.validateSync=function(e,t){return this._resolve(e,t).validateSync(e,t)},t.validateAt=function(e,t,r){return this._resolve(t,r).validateAt(e,t,r)},t.validateSyncAt=function(e,t,r){return this._resolve(t,r).validateSyncAt(e,t,r)},e}();o.prototype.__isYupSchema__=!0;var s=o;t.default=s,e.exports=t.default},95814:(e,t,r)=>{"use strict";var n=r(60087);t.__esModule=!0,t.default=void 0;var i=n(r(72912)),o=r(79588),s="$",A=".",a=function(){function e(e,t){if(void 0===t&&(t={}),"string"!=typeof e)throw new TypeError("ref must be a string, got: "+e);if(this.key=e.trim(),""===e)throw new TypeError("ref must be a non-empty string");this.isContext=this.key[0]===s,this.isValue=this.key[0]===A,this.isSibling=!this.isContext&&!this.isValue;var r=this.isContext?s:this.isValue?A:"";this.path=this.key.slice(r.length),this.getter=this.path&&(0,o.getter)(this.path,!0),this.map=t.map}var t=e.prototype;return t.getValue=function(e){var t=this.isContext?e.context:this.isValue?e.value:e.parent;return this.getter&&(t=this.getter(t||{})),this.map&&(t=this.map(t)),t},t.cast=function(e,t){return this.getValue((0,i.default)({},t,{value:e}))},t.resolve=function(){return this},t.describe=function(){return{type:"ref",key:this.key}},t.toString=function(){return"Ref("+this.key+")"},e.isRef=function(e){return e&&e.__isYupRef},e}();t.default=a,a.prototype.__isYupRef=!0,e.exports=t.default},40828:(e,t,r)=>{"use strict";var n=r(60087);t.__esModule=!0,t.default=A;var i=n(r(21043)),o=/\$\{\s*(\w+)\s*\}/g,s=function(e){return function(t){return e.replace(o,(function(e,r){return(0,i.default)(t[r])}))}};function A(e,t,r,n){var i=this;this.name="ValidationError",this.value=t,this.path=r,this.type=n,this.errors=[],this.inner=[],e&&[].concat(e).forEach((function(e){i.errors=i.errors.concat(e.errors||e),e.inner&&(i.inner=i.inner.concat(e.inner.length?e.inner:e))})),this.message=this.errors.length>1?this.errors.length+" errors occurred":this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,A)}A.prototype=Object.create(Error.prototype),A.prototype.constructor=A,A.isError=function(e){return e&&"ValidationError"===e.name},A.formatError=function(e,t){"string"==typeof e&&(e=s(e));var r=function(t){return t.path=t.label||t.path||"this","function"==typeof e?e(t):e};return 1===arguments.length?r:r(t)},e.exports=t.default},18830:(e,t,r)=>{"use strict";var n=r(19228),i=r(60087);t.__esModule=!0,t.default=void 0;var o=i(r(72912)),s=i(r(62407)),A=i(r(31490)),a=i(r(71665)),c=i(r(11050)),u=i(r(7045)),l=i(r(21043)),h=i(r(16434)),g=r(63802),f=n(r(80180));function p(){var e=(0,s.default)(["","[","]"]);return p=function(){return e},e}var d=C;function C(e){var t=this;if(!(this instanceof C))return new C(e);h.default.call(this,{type:"array"}),this._subType=void 0,this.withMutation((function(){t.transform((function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e=null}return this.isType(e)?e:null})),e&&t.of(e)}))}t.default=d,(0,A.default)(C,h.default,{_typeCheck:function(e){return Array.isArray(e)},_cast:function(e,t){var r=this,n=h.default.prototype._cast.call(this,e,t);if(!this._typeCheck(n)||!this._subType)return n;var i=!1,o=n.map((function(e){var n=r._subType.cast(e,t);return n!==e&&(i=!0),n}));return i?o:n},_validate:function(e,t){var r=this;void 0===t&&(t={});var n=[],i=t.sync,s=t.path,A=this._subType,a=this._option("abortEarly",t),c=this._option("recursive",t),l=null!=t.originalValue?t.originalValue:e;return h.default.prototype._validate.call(this,e,t).catch((0,f.propagateErrors)(a,n)).then((function(e){if(!c||!A||!r._typeCheck(e)){if(n.length)throw n[0];return e}l=l||e;var h=e.map((function(r,n){var i=(0,u.default)(p(),t.path,n),s=(0,o.default)({},t,{path:i,strict:!0,parent:e,originalValue:l[n]});return!A.validate||A.validate(r,s)}));return(0,f.default)({sync:i,path:s,value:e,errors:n,endEarly:a,validations:h})}))},_isPresent:function(e){return h.default.prototype._cast.call(this,e)&&e.length>0},of:function(e){var t=this.clone();if(!1!==e&&!(0,c.default)(e))throw new TypeError("`array.of()` sub-schema must be a valid yup schema, or `false` to negate a current sub-schema. not: "+(0,l.default)(e));return t._subType=e,t},min:function(e,t){return t=t||g.array.min,this.test({message:t,name:"min",exclusive:!0,params:{min:e},test:function(t){return(0,a.default)(t)||t.length>=this.resolve(e)}})},max:function(e,t){return t=t||g.array.max,this.test({message:t,name:"max",exclusive:!0,params:{max:e},test:function(t){return(0,a.default)(t)||t.length<=this.resolve(e)}})},ensure:function(){var e=this;return this.default((function(){return[]})).transform((function(t){return e.isType(t)?t:null===t?[]:[].concat(t)}))},compact:function(e){var t=e?function(t,r,n){return!e(t,r,n)}:function(e){return!!e};return this.transform((function(e){return null!=e?e.filter(t):e}))},describe:function(){var e=h.default.prototype.describe.call(this);return this._subType&&(e.innerType=this._subType.describe()),e}}),e.exports=t.default},76595:(e,t,r)=>{"use strict";var n=r(60087);t.__esModule=!0,t.default=void 0;var i=n(r(31490)),o=n(r(16434)),s=A;function A(){var e=this;if(!(this instanceof A))return new A;o.default.call(this,{type:"boolean"}),this.withMutation((function(){e.transform((function(e){if(!this.isType(e)){if(/^(true|1)$/i.test(e))return!0;if(/^(false|0)$/i.test(e))return!1}return e}))}))}t.default=s,(0,i.default)(A,o.default,{_typeCheck:function(e){return e instanceof Boolean&&(e=e.valueOf()),"boolean"==typeof e}}),e.exports=t.default},41755:(e,t,r)=>{"use strict";var n=r(60087);t.__esModule=!0,t.default=void 0;var i=n(r(16434)),o=n(r(31490)),s=n(r(76813)),A=r(63802),a=n(r(71665)),c=n(r(95814)),u=new Date(""),l=h;function h(){var e=this;if(!(this instanceof h))return new h;i.default.call(this,{type:"date"}),this.withMutation((function(){e.transform((function(e){return this.isType(e)?e:(e=(0,s.default)(e))?new Date(e):u}))}))}t.default=l,(0,o.default)(h,i.default,{_typeCheck:function(e){return t=e,"[object Date]"===Object.prototype.toString.call(t)&&!isNaN(e.getTime());var t},min:function(e,t){void 0===t&&(t=A.date.min);var r=e;if(!c.default.isRef(r)&&(r=this.cast(e),!this._typeCheck(r)))throw new TypeError("`min` must be a Date or a value that can be `cast()` to a Date");return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test:function(e){return(0,a.default)(e)||e>=this.resolve(r)}})},max:function(e,t){void 0===t&&(t=A.date.max);var r=e;if(!c.default.isRef(r)&&(r=this.cast(e),!this._typeCheck(r)))throw new TypeError("`max` must be a Date or a value that can be `cast()` to a Date");return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test:function(e){return(0,a.default)(e)||e<=this.resolve(r)}})}}),e.exports=t.default},15966:(e,t,r)=>{"use strict";var n=r(60087);t.__esModule=!0,t.addMethod=function(e,t,r){if(!e||!(0,p.default)(e.prototype))throw new TypeError("You must provide a yup schema constructor function");if("string"!=typeof t)throw new TypeError("A Method name must be provided");if("function"!=typeof r)throw new TypeError("Method function must be provided");e.prototype[t]=r},t.lazy=t.ref=t.boolean=void 0;var i=n(r(16434));t.mixed=i.default;var o=n(r(76595));t.bool=o.default;var s=n(r(45167));t.string=s.default;var A=n(r(72068));t.number=A.default;var a=n(r(41755));t.date=a.default;var c=n(r(51727));t.object=c.default;var u=n(r(18830));t.array=u.default;var l=n(r(95814)),h=n(r(6856)),g=n(r(40828));t.ValidationError=g.default;var f=n(r(43910));t.reach=f.default;var p=n(r(11050));t.isSchema=p.default;var d=n(r(24280));t.setLocale=d.default;var C=o.default;t.boolean=C;t.ref=function(e,t){return new l.default(e,t)};t.lazy=function(e){return new h.default(e)}},63802:(e,t,r)=>{"use strict";var n=r(60087);t.__esModule=!0,t.default=t.array=t.object=t.boolean=t.date=t.number=t.string=t.mixed=void 0;var i=n(r(21043)),o={default:"${path} is invalid",required:"${path} is a required field",oneOf:"${path} must be one of the following values: ${values}",notOneOf:"${path} must not be one of the following values: ${values}",notType:function(e){var t=e.path,r=e.type,n=e.value,o=e.originalValue,s=null!=o&&o!==n,A=t+" must be a `"+r+"` type, but the final value was: `"+(0,i.default)(n,!0)+"`"+(s?" (cast from the value `"+(0,i.default)(o,!0)+"`).":".");return null===n&&(A+='\n If "null" is intended as an empty value be sure to mark the schema as `.nullable()`'),A}};t.mixed=o;var s={length:"${path} must be exactly ${length} characters",min:"${path} must be at least ${min} characters",max:"${path} must be at most ${max} characters",matches:'${path} must match the following: "${regex}"',email:"${path} must be a valid email",url:"${path} must be a valid URL",trim:"${path} must be a trimmed string",lowercase:"${path} must be a lowercase string",uppercase:"${path} must be a upper case string"};t.string=s;var A={min:"${path} must be greater than or equal to ${min}",max:"${path} must be less than or equal to ${max}",lessThan:"${path} must be less than ${less}",moreThan:"${path} must be greater than ${more}",notEqual:"${path} must be not equal to ${notEqual}",positive:"${path} must be a positive number",negative:"${path} must be a negative number",integer:"${path} must be an integer"};t.number=A;var a={min:"${path} field must be later than ${min}",max:"${path} field must be at earlier than ${max}"};t.date=a;var c={};t.boolean=c;var u={noUnknown:"${path} field cannot have keys not specified in the object shape"};t.object=u;var l={min:"${path} field must have at least ${min} items",max:"${path} field must have less than or equal to ${max} items"};t.array=l;var h={mixed:o,string:s,number:A,date:a,object:u,array:l,boolean:c};t.default=h},16434:(e,t,r)=>{"use strict";var n=r(60087);t.__esModule=!0,t.default=E;var i=n(r(72912)),o=n(r(15215)),s=n(r(26052)),A=n(r(78700)),a=r(63802),c=n(r(94916)),u=n(r(80180)),l=n(r(22808)),h=n(r(11050)),g=n(r(54107)),f=n(r(21043)),p=n(r(95814)),d=r(43910),C=function(){function e(){this.list=new Set,this.refs=new Map}var t=e.prototype;return t.toArray=function(){return(0,A.default)(this.list).concat((0,A.default)(this.refs.values()))},t.add=function(e){p.default.isRef(e)?this.refs.set(e.key,e):this.list.add(e)},t.delete=function(e){p.default.isRef(e)?this.refs.delete(e.key,e):this.list.delete(e)},t.has=function(e,t){if(this.list.has(e))return!0;for(var r,n=this.refs.values();!(r=n.next()).done;)if(t(r.value)===e)return!0;return!1},e}();function E(e){var t=this;if(void 0===e&&(e={}),!(this instanceof E))return new E;this._deps=[],this._conditions=[],this._options={abortEarly:!0,recursive:!0},this._exclusive=Object.create(null),this._whitelist=new C,this._blacklist=new C,this.tests=[],this.transforms=[],this.withMutation((function(){t.typeError(a.mixed.notType)})),(0,o.default)(e,"default")&&(this._defaultDefault=e.default),this._type=e.type||"mixed"}for(var I=E.prototype={__isYupSchema__:!0,constructor:E,clone:function(){var e=this;return this._mutate?this:(0,s.default)(this,(function(t){if((0,h.default)(t)&&t!==e)return t}))},label:function(e){var t=this.clone();return t._label=e,t},meta:function(e){if(0===arguments.length)return this._meta;var t=this.clone();return t._meta=(0,i.default)(t._meta||{},e),t},withMutation:function(e){var t=this._mutate;this._mutate=!0;var r=e(this);return this._mutate=t,r},concat:function(e){if(!e||e===this)return this;if(e._type!==this._type&&"mixed"!==this._type)throw new TypeError("You cannot `concat()` schema's of different types: "+this._type+" and "+e._type);var t=(0,l.default)(e.clone(),this);return(0,o.default)(e,"_default")&&(t._default=e._default),t.tests=this.tests,t._exclusive=this._exclusive,t.withMutation((function(t){e.tests.forEach((function(e){t.test(e.OPTIONS)}))})),t},isType:function(e){return!(!this._nullable||null!==e)||(!this._typeCheck||this._typeCheck(e))},resolve:function(e){var t=this;if(t._conditions.length){var r=t._conditions;(t=t.clone())._conditions=[],t=(t=r.reduce((function(t,r){return r.resolve(t,e)}),t)).resolve(e)}return t},cast:function(e,t){void 0===t&&(t={});var r=this.resolve((0,i.default)({},t,{value:e})),n=r._cast(e,t);if(void 0!==e&&!1!==t.assert&&!0!==r.isType(n)){var o=(0,f.default)(e),s=(0,f.default)(n);throw new TypeError("The value of "+(t.path||"field")+' could not be cast to a value that satisfies the schema type: "'+r._type+'". \n\nattempted value: '+o+" \n"+(s!==o?"result of cast: "+s:""))}return n},_cast:function(e){var t=this,r=void 0===e?e:this.transforms.reduce((function(r,n){return n.call(t,r,e)}),e);return void 0===r&&(0,o.default)(this,"_default")&&(r=this.default()),r},_validate:function(e,t){var r=this;void 0===t&&(t={});var n=e,o=null!=t.originalValue?t.originalValue:e,s=this._option("strict",t),A=this._option("abortEarly",t),a=t.sync,c=t.path,l=this._label;s||(n=this._cast(n,(0,i.default)({assert:!1},t)));var h={value:n,path:c,schema:this,options:t,label:l,originalValue:o,sync:a},g=[];return this._typeError&&g.push(this._typeError(h)),this._whitelistError&&g.push(this._whitelistError(h)),this._blacklistError&&g.push(this._blacklistError(h)),(0,u.default)({validations:g,endEarly:A,value:n,path:c,sync:a}).then((function(e){return(0,u.default)({path:c,sync:a,value:e,endEarly:A,validations:r.tests.map((function(e){return e(h)}))})}))},validate:function(e,t){return void 0===t&&(t={}),this.resolve((0,i.default)({},t,{value:e}))._validate(e,t)},validateSync:function(e,t){var r,n;if(void 0===t&&(t={}),this.resolve((0,i.default)({},t,{value:e}))._validate(e,(0,i.default)({},t,{sync:!0})).then((function(e){return r=e})).catch((function(e){return n=e})),n)throw n;return r},isValid:function(e,t){return this.validate(e,t).then((function(){return!0})).catch((function(e){if("ValidationError"===e.name)return!1;throw e}))},isValidSync:function(e,t){try{return this.validateSync(e,t),!0}catch(e){if("ValidationError"===e.name)return!1;throw e}},getDefault:function(e){return void 0===e&&(e={}),this.resolve(e).default()},default:function(e){if(0===arguments.length){var t=(0,o.default)(this,"_default")?this._default:this._defaultDefault;return"function"==typeof t?t.call(this):(0,s.default)(t)}var r=this.clone();return r._default=e,r},strict:function(e){void 0===e&&(e=!0);var t=this.clone();return t._options.strict=e,t},_isPresent:function(e){return null!=e},required:function(e){return void 0===e&&(e=a.mixed.required),this.test({message:e,name:"required",exclusive:!0,test:function(e){return this.schema._isPresent(e)}})},notRequired:function(){var e=this.clone();return e.tests=e.tests.filter((function(e){return"required"!==e.OPTIONS.name})),e},nullable:function(e){void 0===e&&(e=!0);var t=this.clone();return t._nullable=e,t},transform:function(e){var t=this.clone();return t.transforms.push(e),t},test:function(){var e;if(void 0===(e=1===arguments.length?"function"==typeof(arguments.length<=0?void 0:arguments[0])?{test:arguments.length<=0?void 0:arguments[0]}:arguments.length<=0?void 0:arguments[0]:2===arguments.length?{name:arguments.length<=0?void 0:arguments[0],test:arguments.length<=1?void 0:arguments[1]}:{name:arguments.length<=0?void 0:arguments[0],message:arguments.length<=1?void 0:arguments[1],test:arguments.length<=2?void 0:arguments[2]}).message&&(e.message=a.mixed.default),"function"!=typeof e.test)throw new TypeError("`test` is a required parameters");var t=this.clone(),r=(0,g.default)(e),n=e.exclusive||e.name&&!0===t._exclusive[e.name];if(e.exclusive&&!e.name)throw new TypeError("Exclusive tests must provide a unique `name` identifying the test");return t._exclusive[e.name]=!!e.exclusive,t.tests=t.tests.filter((function(t){if(t.OPTIONS.name===e.name){if(n)return!1;if(t.OPTIONS.test===r.OPTIONS.test)return!1}return!0})),t.tests.push(r),t},when:function(e,t){1===arguments.length&&(t=e,e=".");var r=this.clone(),n=[].concat(e).map((function(e){return new p.default(e)}));return n.forEach((function(e){e.isSibling&&r._deps.push(e.key)})),r._conditions.push(new c.default(n,t)),r},typeError:function(e){var t=this.clone();return t._typeError=(0,g.default)({message:e,name:"typeError",test:function(e){return!(void 0!==e&&!this.schema.isType(e))||this.createError({params:{type:this.schema._type}})}}),t},oneOf:function(e,t){void 0===t&&(t=a.mixed.oneOf);var r=this.clone();return e.forEach((function(e){r._whitelist.add(e),r._blacklist.delete(e)})),r._whitelistError=(0,g.default)({message:t,name:"oneOf",test:function(e){if(void 0===e)return!0;var t=this.schema._whitelist;return!!t.has(e,this.resolve)||this.createError({params:{values:t.toArray().join(", ")}})}}),r},notOneOf:function(e,t){void 0===t&&(t=a.mixed.notOneOf);var r=this.clone();return e.forEach((function(e){r._blacklist.add(e),r._whitelist.delete(e)})),r._blacklistError=(0,g.default)({message:t,name:"notOneOf",test:function(e){var t=this.schema._blacklist;return!t.has(e,this.resolve)||this.createError({params:{values:t.toArray().join(", ")}})}}),r},strip:function(e){void 0===e&&(e=!0);var t=this.clone();return t._strip=e,t},_option:function(e,t){return(0,o.default)(t,e)?t[e]:this._options[e]},describe:function(){var e=this.clone();return{type:e._type,meta:e._meta,label:e._label,tests:e.tests.map((function(e){return{name:e.OPTIONS.name,params:e.OPTIONS.params}})).filter((function(e,t,r){return r.findIndex((function(t){return t.name===e.name}))===t}))}}},m=["validate","validateSync"],y=function(){var e=m[w];I[e+"At"]=function(t,r,n){void 0===n&&(n={});var o=(0,d.getIn)(this,t,r,n.context),s=o.parent,A=o.parentPath;return o.schema[e](s&&s[A],(0,i.default)({},n,{parent:s,path:t}))}},w=0;w{"use strict";var n=r(60087);t.__esModule=!0,t.default=c;var i=n(r(31490)),o=n(r(16434)),s=r(63802),A=n(r(71665)),a=function(e){return(0,A.default)(e)||e===(0|e)};function c(){var e=this;if(!(this instanceof c))return new c;o.default.call(this,{type:"number"}),this.withMutation((function(){e.transform((function(e){var t=e;if("string"==typeof t){if(""===(t=t.replace(/\s/g,"")))return NaN;t=+t}return this.isType(t)?t:parseFloat(t)}))}))}(0,i.default)(c,o.default,{_typeCheck:function(e){return e instanceof Number&&(e=e.valueOf()),"number"==typeof e&&!function(e){return e!=+e}(e)},min:function(e,t){return void 0===t&&(t=s.number.min),this.test({message:t,name:"min",exclusive:!0,params:{min:e},test:function(t){return(0,A.default)(t)||t>=this.resolve(e)}})},max:function(e,t){return void 0===t&&(t=s.number.max),this.test({message:t,name:"max",exclusive:!0,params:{max:e},test:function(t){return(0,A.default)(t)||t<=this.resolve(e)}})},lessThan:function(e,t){return void 0===t&&(t=s.number.lessThan),this.test({message:t,name:"max",exclusive:!0,params:{less:e},test:function(t){return(0,A.default)(t)||tthis.resolve(e)}})},positive:function(e){return void 0===e&&(e=s.number.positive),this.moreThan(0,e)},negative:function(e){return void 0===e&&(e=s.number.negative),this.lessThan(0,e)},integer:function(e){return void 0===e&&(e=s.number.integer),this.test({name:"integer",message:e,test:a})},truncate:function(){return this.transform((function(e){return(0,A.default)(e)?e:0|e}))},round:function(e){var t=["ceil","floor","round","trunc"];if("trunc"===(e=e&&e.toLowerCase()||"round"))return this.truncate();if(-1===t.indexOf(e.toLowerCase()))throw new TypeError("Only valid options for round() are: "+t.join(", "));return this.transform((function(t){return(0,A.default)(t)?t:Math[e](t)}))}}),e.exports=t.default},51727:(e,t,r)=>{"use strict";var n=r(19228),i=r(60087);t.__esModule=!0,t.default=B;var o=i(r(62407)),s=i(r(72912)),A=i(r(15215)),a=i(r(36494)),c=i(r(89170)),u=i(r(5253)),l=i(r(89612)),h=r(79588),g=i(r(16434)),f=r(63802),p=i(r(18417)),d=i(r(23316)),C=i(r(31490)),E=i(r(7045)),I=n(r(80180));function m(){var e=(0,o.default)(["",".",""]);return m=function(){return e},e}function y(){var e=(0,o.default)(["",".",""]);return y=function(){return e},e}var w=function(e){return"[object Object]"===Object.prototype.toString.call(e)};function B(e){var t=this;if(!(this instanceof B))return new B(e);g.default.call(this,{type:"object",default:function(){var e=this;if(this._nodes.length){var t={};return this._nodes.forEach((function(r){t[r]=e.fields[r].default?e.fields[r].default():void 0})),t}}}),this.fields=Object.create(null),this._nodes=[],this._excludedEdges=[],this.withMutation((function(){t.transform((function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e=null}return this.isType(e)?e:null})),e&&t.shape(e)}))}(0,C.default)(B,g.default,{_typeCheck:function(e){return w(e)||"function"==typeof e},_cast:function(e,t){var r=this;void 0===t&&(t={});var n=g.default.prototype._cast.call(this,e,t);if(void 0===n)return this.default();if(!this._typeCheck(n))return n;var i=this.fields,o=!0===this._option("stripUnknown",t),a=this._nodes.concat(Object.keys(n).filter((function(e){return-1===r._nodes.indexOf(e)}))),c={},u=(0,s.default)({},t,{parent:c,__validating:!1}),l=!1;return a.forEach((function(e){var r=i[e],s=(0,A.default)(n,e);if(r){var a,h=r._options&&r._options.strict;if(u.path=(0,E.default)(y(),t.path,e),u.value=n[e],!0===(r=r.resolve(u))._strip)return void(l=l||e in n);void 0!==(a=t.__validating&&h?n[e]:r.cast(n[e],u))&&(c[e]=a)}else s&&!o&&(c[e]=n[e]);c[e]!==n[e]&&(l=!0)})),l?c:n},_validate:function(e,t){var r,n,i=this;void 0===t&&(t={});var o=t.sync,A=[],a=null!=t.originalValue?t.originalValue:e;return r=this._option("abortEarly",t),n=this._option("recursive",t),t=(0,s.default)({},t,{__validating:!0,originalValue:a}),g.default.prototype._validate.call(this,e,t).catch((0,I.propagateErrors)(r,A)).then((function(e){if(!n||!w(e)){if(A.length)throw A[0];return e}a=a||e;var c=i._nodes.map((function(r){var n=(0,E.default)(m(),t.path,r),o=i.fields[r],A=(0,s.default)({},t,{path:n,parent:e,originalValue:a[r]});return o&&o.validate?(A.strict=!0,o.validate(e[r],A)):Promise.resolve(!0)}));return(0,I.default)({sync:o,validations:c,value:e,errors:A,endEarly:r,path:t.path,sort:(0,d.default)(i.fields)})}))},concat:function(e){var t=g.default.prototype.concat.call(this,e);return t._nodes=(0,p.default)(t.fields,t._excludedEdges),t},shape:function(e,t){void 0===t&&(t=[]);var r=this.clone(),n=(0,s.default)(r.fields,e);if(r.fields=n,t.length){Array.isArray(t[0])||(t=[t]);var i=t.map((function(e){return e[0]+"-"+e[1]}));r._excludedEdges=r._excludedEdges.concat(i)}return r._nodes=(0,p.default)(n,r._excludedEdges),r},from:function(e,t,r){var n=(0,h.getter)(e,!0);return this.transform((function(i){if(null==i)return i;var o=i;return(0,A.default)(i,e)&&(o=(0,s.default)({},i),r||delete o[e],o[t]=n(i)),o}))},noUnknown:function(e,t){void 0===e&&(e=!0),void 0===t&&(t=f.object.noUnknown),"string"==typeof e&&(t=e,e=!0);var r=this.test({name:"noUnknown",exclusive:!0,message:t,test:function(t){return null==t||!e||0===function(e,t){var r=Object.keys(e.fields);return Object.keys(t).filter((function(e){return-1===r.indexOf(e)}))}(this.schema,t).length}});return r._options.stripUnknown=e,r},unknown:function(e,t){return void 0===e&&(e=!0),void 0===t&&(t=f.object.noUnknown),this.noUnknown(!e,t)},transformKeys:function(e){return this.transform((function(t){return t&&(0,u.default)(t,(function(t,r){return e(r)}))}))},camelCase:function(){return this.transformKeys(c.default)},snakeCase:function(){return this.transformKeys(a.default)},constantCase:function(){return this.transformKeys((function(e){return(0,a.default)(e).toUpperCase()}))},describe:function(){var e=g.default.prototype.describe.call(this);return e.fields=(0,l.default)(this.fields,(function(e){return e.describe()})),e}}),e.exports=t.default},24280:(e,t,r)=>{"use strict";var n=r(60087);t.__esModule=!0,t.default=function(e){Object.keys(e).forEach((function(t){Object.keys(e[t]).forEach((function(r){i.default[t][r]=e[t][r]}))}))};var i=n(r(63802));e.exports=t.default},45167:(e,t,r)=>{"use strict";var n=r(60087);t.__esModule=!0,t.default=l;var i=n(r(31490)),o=n(r(16434)),s=r(63802),A=n(r(71665)),a=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,c=/^((https?|ftp):)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,u=function(e){return(0,A.default)(e)||e===e.trim()};function l(){var e=this;if(!(this instanceof l))return new l;o.default.call(this,{type:"string"}),this.withMutation((function(){e.transform((function(e){return this.isType(e)?e:null!=e&&e.toString?e.toString():e}))}))}(0,i.default)(l,o.default,{_typeCheck:function(e){return e instanceof String&&(e=e.valueOf()),"string"==typeof e},_isPresent:function(e){return o.default.prototype._cast.call(this,e)&&e.length>0},length:function(e,t){return void 0===t&&(t=s.string.length),this.test({message:t,name:"length",exclusive:!0,params:{length:e},test:function(t){return(0,A.default)(t)||t.length===this.resolve(e)}})},min:function(e,t){return void 0===t&&(t=s.string.min),this.test({message:t,name:"min",exclusive:!0,params:{min:e},test:function(t){return(0,A.default)(t)||t.length>=this.resolve(e)}})},max:function(e,t){return void 0===t&&(t=s.string.max),this.test({name:"max",exclusive:!0,message:t,params:{max:e},test:function(t){return(0,A.default)(t)||t.length<=this.resolve(e)}})},matches:function(e,t){var r,n=!1;return t&&(t.message||t.hasOwnProperty("excludeEmptyString")?(n=t.excludeEmptyString,r=t.message):r=t),this.test({message:r||s.string.matches,params:{regex:e},test:function(t){return(0,A.default)(t)||""===t&&n||e.test(t)}})},email:function(e){return void 0===e&&(e=s.string.email),this.matches(a,{message:e,excludeEmptyString:!0})},url:function(e){return void 0===e&&(e=s.string.url),this.matches(c,{message:e,excludeEmptyString:!0})},ensure:function(){return this.default("").transform((function(e){return null===e?"":e}))},trim:function(e){return void 0===e&&(e=s.string.trim),this.transform((function(e){return null!=e?e.trim():e})).test({message:e,name:"trim",test:u})},lowercase:function(e){return void 0===e&&(e=s.string.lowercase),this.transform((function(e){return(0,A.default)(e)?e:e.toLowerCase()})).test({message:e,name:"string_case",exclusive:!0,test:function(e){return(0,A.default)(e)||e===e.toLowerCase()}})},uppercase:function(e){return void 0===e&&(e=s.string.uppercase),this.transform((function(e){return(0,A.default)(e)?e:e.toUpperCase()})).test({message:e,name:"string_case",exclusive:!0,test:function(e){return(0,A.default)(e)||e===e.toUpperCase()}})}}),e.exports=t.default},54107:(e,t,r)=>{"use strict";var n=r(60087);t.__esModule=!0,t.createErrorFactory=l,t.default=function(e){var t=e.name,r=e.message,n=e.test,s=e.params;function u(e){var u=e.value,h=e.path,g=e.label,f=e.options,p=e.originalValue,d=e.sync,C=(0,i.default)(e,["value","path","label","options","originalValue","sync"]),E=f.parent,I=function(e){return a.default.isRef(e)?e.getValue({value:u,parent:E,context:f.context}):e},m=l({message:r,path:h,value:u,originalValue:p,params:s,label:g,resolve:I,name:t}),y=(0,o.default)({path:h,parent:E,type:t,createError:m,resolve:I,options:f},C);return function(e,t,r,n){var i=e.call(t,r);if(!n)return Promise.resolve(i);if(o=i,o&&"function"==typeof o.then&&"function"==typeof o.catch)throw new Error('Validation test of type: "'+t.type+'" returned a Promise during a synchronous validate. This test will finish after the validate call has returned');var o;return c.SynchronousPromise.resolve(i)}(n,y,u,d).then((function(e){if(A.default.isError(e))throw e;if(!e)throw m()}))}return u.OPTIONS=e,u};var i=n(r(74943)),o=n(r(72912)),s=n(r(89612)),A=n(r(40828)),a=n(r(95814)),c=r(93255),u=A.default.formatError;function l(e){var t=e.value,r=e.label,n=e.resolve,a=e.originalValue,c=(0,i.default)(e,["value","label","resolve","originalValue"]);return function(e){var i=void 0===e?{}:e,l=i.path,h=void 0===l?c.path:l,g=i.message,f=void 0===g?c.message:g,p=i.type,d=void 0===p?c.name:p,C=i.params;return C=(0,o.default)({path:h,value:t,originalValue:a,label:r},function(e,t,r){return(0,s.default)((0,o.default)({},e,t),r)}(c.params,C,n)),(0,o.default)(new A.default(u(f,C),t,h,d),{params:C})}}},31490:(e,t,r)=>{"use strict";var n=r(60087);t.__esModule=!0,t.default=function(e,t,r){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),(0,i.default)(e.prototype,r)};var i=n(r(72912));e.exports=t.default},71665:(e,t)=>{"use strict";t.__esModule=!0,t.default=void 0;t.default=function(e){return null==e},e.exports=t.default},11050:(e,t)=>{"use strict";t.__esModule=!0,t.default=void 0;t.default=function(e){return e&&e.__isYupSchema__},e.exports=t.default},76813:(e,t)=>{"use strict";t.__esModule=!0,t.default=function(e){var t,n,i=[1,4,5,6,7,10,11],o=0;if(n=r.exec(e)){for(var s,A=0;s=i[A];++A)n[s]=+n[s]||0;n[2]=(+n[2]||1)-1,n[3]=+n[3]||1,n[7]=n[7]?String(n[7]).substr(0,3):0,void 0!==n[8]&&""!==n[8]||void 0!==n[9]&&""!==n[9]?("Z"!==n[8]&&void 0!==n[9]&&(o=60*n[10]+n[11],"+"===n[9]&&(o=0-o)),t=Date.UTC(n[1],n[2],n[3],n[4],n[5]+o,n[6],n[7])):t=+new Date(n[1],n[2],n[3],n[4],n[5],n[6],n[7])}else t=Date.parse?Date.parse(e):NaN;return t};var r=/^(\d{4}|[+\-]\d{6})(?:-?(\d{2})(?:-?(\d{2}))?)?(?:[ T]?(\d{2}):?(\d{2})(?::?(\d{2})(?:[,\.](\d{1,}))?)?(?:(Z)|([+\-])(\d{2})(?::?(\d{2}))?)?)?$/;e.exports=t.default},7045:(e,t)=>{"use strict";t.__esModule=!0,t.default=function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n{"use strict";var n=r(60087);t.__esModule=!0,t.default=function e(t,r){for(var n in r)if((0,i.default)(r,n)){var A=r[n],a=t[n];if(void 0===a)t[n]=A;else{if(a===A)continue;(0,o.default)(a)?(0,o.default)(A)&&(t[n]=A.concat(a)):s(a)?s(A)&&(t[n]=e(a,A)):Array.isArray(a)&&Array.isArray(A)&&(t[n]=A.concat(a))}}return t};var i=n(r(15215)),o=n(r(11050)),s=function(e){return"[object Object]"===Object.prototype.toString.call(e)};e.exports=t.default},21043:(e,t)=>{"use strict";t.__esModule=!0,t.default=function(e,t){var r=A(e,t);return null!==r?r:JSON.stringify(e,(function(e,r){var n=A(this[e],t);return null!==n?n:r}),2)};var r=Object.prototype.toString,n=Error.prototype.toString,i=RegExp.prototype.toString,o="undefined"!=typeof Symbol?Symbol.prototype.toString:function(){return""},s=/^Symbol\((.*)\)(.*)$/;function A(e,t){if(void 0===t&&(t=!1),null==e||!0===e||!1===e)return""+e;var A=typeof e;if("number"===A)return function(e){return e!=+e?"NaN":0===e&&1/e<0?"-0":""+e}(e);if("string"===A)return t?'"'+e+'"':e;if("function"===A)return"[Function "+(e.name||"anonymous")+"]";if("symbol"===A)return o.call(e).replace(s,"Symbol($1)");var a=r.call(e).slice(8,-1);return"Date"===a?isNaN(e.getTime())?""+e:e.toISOString(e):"Error"===a||e instanceof Error?"["+n.call(e)+"]":"RegExp"===a?i.call(e):null}e.exports=t.default},43910:(e,t,r)=>{"use strict";var n=r(60087);t.__esModule=!0,t.getIn=s,t.default=void 0;var i=r(79588),o=n(r(15215));function s(e,t,r,n){var s,A,a;return n=n||r,t?((0,i.forEach)(t,(function(i,c,u){var l=c?function(e){return e.substr(0,e.length-1).substr(1)}(i):i;if(u||(0,o.default)(e,"_subType")){var h=u?parseInt(l,10):0;if(e=e.resolve({context:n,parent:s,value:r})._subType,r){if(u&&h>=r.length)throw new Error("Yup.reach cannot resolve an array item at index: "+i+", in the path: "+t+". because there is no value at that index. ");r=r[h]}}if(!u){if(e=e.resolve({context:n,parent:s,value:r}),!(0,o.default)(e,"fields")||!(0,o.default)(e.fields,l))throw new Error("The schema does not contain the path: "+t+". (failed at: "+a+' which is a type: "'+e._type+'") ');e=e.fields[l],s=r,r=r&&r[l],A=l,a=c?"["+i+"]":"."+i}})),{schema:e,parent:s,parentPath:A}):{parent:s,parentPath:t,schema:e}}var A=function(e,t,r,n){return s(e,t,r,n).schema};t.default=A},80180:(e,t,r)=>{"use strict";var n=r(60087);t.__esModule=!0,t.propagateErrors=function(e,t){return e?null:function(e){return t.push(e),e.value}},t.settled=a,t.collectErrors=c,t.default=function(e){var t=e.endEarly,r=(0,i.default)(e,["endEarly"]);return t?function(e,t,r){return A(r).all(e).catch((function(e){throw"ValidationError"===e.name&&(e.value=t),e})).then((function(){return t}))}(r.validations,r.value,r.sync):c(r)};var i=n(r(74943)),o=r(93255),s=n(r(40828)),A=function(e){return e?o.SynchronousPromise:Promise};function a(e,t){var r=A(t);return r.all(e.map((function(e){return r.resolve(e).then((function(e){return{fulfilled:!0,value:e}}),(function(e){return{fulfilled:!1,value:e}}))})))}function c(e){var t=e.validations,r=e.value,n=e.path,i=e.sync,o=e.errors,A=e.sort;return o=function(e){return void 0===e&&(e=[]),e.inner&&e.inner.length?e.inner:[].concat(e)}(o),a(t,i).then((function(e){var t=e.filter((function(e){return!e.fulfilled})).reduce((function(e,t){var r=t.value;if(!s.default.isError(r))throw r;return e.concat(r)}),[]);if(A&&t.sort(A),(o=t.concat(o)).length)throw new s.default(o,r,n);return r}))}},23316:(e,t)=>{"use strict";function r(e,t){var r=1/0;return e.some((function(e,n){if(-1!==t.path.indexOf(e))return r=n,!0})),r}t.__esModule=!0,t.default=function(e){var t=Object.keys(e);return function(e,n){return r(t,e)-r(t,n)}},e.exports=t.default},18417:(e,t,r)=>{"use strict";var n=r(60087);t.__esModule=!0,t.default=function(e,t){void 0===t&&(t=[]);var r=[],n=[];function c(e,i){var o=(0,s.split)(e)[0];~n.indexOf(o)||n.push(o),~t.indexOf(i+"-"+o)||r.push([i,o])}for(var u in e)if((0,i.default)(e,u)){var l=e[u];~n.indexOf(u)||n.push(u),A.default.isRef(l)&&l.isSibling?c(l.path,u):(0,a.default)(l)&&l._deps&&l._deps.forEach((function(e){return c(e,u)}))}return o.default.array(n,r).reverse()};var i=n(r(15215)),o=n(r(75158)),s=r(79588),A=n(r(95814)),a=n(r(11050));e.exports=t.default},38422:e=>{"use strict";e.exports={u2:"yup"}},60306:e=>{"use strict";e.exports=JSON.parse('{"name":"@yarnpkg/cli","version":"2.1.1","license":"BSD-2-Clause","main":"./sources/index.ts","dependencies":{"@yarnpkg/core":"workspace:^2.1.1","@yarnpkg/fslib":"workspace:^2.1.0","@yarnpkg/libzip":"workspace:^2.1.0","@yarnpkg/parsers":"workspace:^2.1.0","@yarnpkg/plugin-compat":"workspace:^2.1.0","@yarnpkg/plugin-dlx":"workspace:^2.1.0","@yarnpkg/plugin-essentials":"workspace:^2.1.0","@yarnpkg/plugin-file":"workspace:^2.1.0","@yarnpkg/plugin-git":"workspace:^2.1.0","@yarnpkg/plugin-github":"workspace:^2.1.0","@yarnpkg/plugin-http":"workspace:^2.1.0","@yarnpkg/plugin-init":"workspace:^2.1.0","@yarnpkg/plugin-link":"workspace:^2.1.0","@yarnpkg/plugin-node-modules":"workspace:^2.1.0","@yarnpkg/plugin-npm":"workspace:^2.1.0","@yarnpkg/plugin-npm-cli":"workspace:^2.1.0","@yarnpkg/plugin-pack":"workspace:^2.1.0","@yarnpkg/plugin-patch":"workspace:^2.1.0","@yarnpkg/plugin-pnp":"workspace:^2.1.0","@yarnpkg/shell":"workspace:^2.1.0","chalk":"^3.0.0","clipanion":"^2.4.2","fromentries":"^1.2.0","semver":"^7.1.2","tslib":"^1.13.0","yup":"^0.27.0"},"devDependencies":{"@types/yup":"0.26.12","@yarnpkg/builder":"workspace:^2.1.0","@yarnpkg/monorepo":"workspace:0.0.0","@yarnpkg/pnpify":"workspace:^2.1.0","micromatch":"^4.0.2","typescript":"^3.9.5"},"peerDependencies":{"@yarnpkg/core":"^2.1.1"},"scripts":{"postpack":"rm -rf lib","prepack":"run build:compile \\"$(pwd)\\"","build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},"publishConfig":{"main":"./lib/index.js","types":"./lib/index.d.ts","bin":null},"files":["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{"bundles":{"standard":["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-node-modules","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp"]}},"repository":{"type":"git","url":"ssh://git@github.com/yarnpkg/berry.git"},"engines":{"node":">=10.19.0"}}')},98497:e=>{function t(e){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}t.keys=()=>[],t.resolve=t,t.id=98497,e.exports=t},73841:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/core"}')},32178:e=>{function t(e){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}t.keys=()=>[],t.resolve=t,t.id=32178,e.exports=t},4670:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/fslib"}')},81386:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/libzip"}')},3368:(e,t,r)=>{var n,i=Object.assign({},r(35747)),o=void 0!==o?o:{},s={};for(n in o)o.hasOwnProperty(n)&&(s[n]=o[n]);var A,a,c,u,l=[],h="";h=__dirname+"/",A=function(e,t){var n=Be(e);return n?t?n:n.toString():(c||(c=i),u||(u=r(85622)),e=u.normalize(e),c.readFileSync(e,t?null:"utf8"))},a=function(e){var t=A(e,!0);return t.buffer||(t=new Uint8Array(t)),I(t.buffer),t},process.argv.length>1&&process.argv[1].replace(/\\/g,"/"),l=process.argv.slice(2),e.exports=o,o.inspect=function(){return"[Emscripten Module object]"};var g=o.print||console.log.bind(console),f=o.printErr||console.warn.bind(console);for(n in s)s.hasOwnProperty(n)&&(o[n]=s[n]);s=null,o.arguments&&(l=o.arguments),o.thisProgram&&o.thisProgram,o.quit&&o.quit;var p,d;o.wasmBinary&&(p=o.wasmBinary),o.noExitRuntime&&o.noExitRuntime,"object"!=typeof WebAssembly&&f("no native wasm support detected");var C=new WebAssembly.Table({initial:31,maximum:31,element:"anyfunc"}),E=!1;function I(e,t){e||Z("Assertion failed: "+t)}function m(e){var t=o["_"+e];return I(t,"Cannot call unknown function "+e+", make sure it is exported"),t}function y(e,t,r,n,i){var o={string:function(e){var t=0;if(null!=e&&0!==e){var r=1+(e.length<<2);D(e,t=Re(r),r)}return t},array:function(e){var t=Re(e.length);return function(e,t){x.set(e,t)}(e,t),t}};var s=m(e),A=[],a=0;if(n)for(var c=0;c=n);)++i;if(i-t>16&&e.subarray&&w)return w.decode(e.subarray(t,i));for(var o="";t>10,56320|1023&c)}}else o+=String.fromCharCode((31&s)<<6|A)}else o+=String.fromCharCode(s)}return o}function Q(e,t){return e?B(F,e,t):""}function v(e,t,r,n){if(!(n>0))return 0;for(var i=r,o=r+n-1,s=0;s=55296&&A<=57343)A=65536+((1023&A)<<10)|1023&e.charCodeAt(++s);if(A<=127){if(r>=o)break;t[r++]=A}else if(A<=2047){if(r+1>=o)break;t[r++]=192|A>>6,t[r++]=128|63&A}else if(A<=65535){if(r+2>=o)break;t[r++]=224|A>>12,t[r++]=128|A>>6&63,t[r++]=128|63&A}else{if(r+3>=o)break;t[r++]=240|A>>18,t[r++]=128|A>>12&63,t[r++]=128|A>>6&63,t[r++]=128|63&A}}return t[r]=0,r-i}function D(e,t,r){return v(e,F,t,r)}function b(e){for(var t=0,r=0;r=55296&&n<=57343&&(n=65536+((1023&n)<<10)|1023&e.charCodeAt(++r)),n<=127?++t:t+=n<=2047?2:n<=65535?3:4}return t}function S(e){var t=b(e)+1,r=Ke(t);return r&&v(e,x,r,t),r}var k,x,F,M,N,R,K;function L(e){k=e,o.HEAP8=x=new Int8Array(e),o.HEAP16=M=new Int16Array(e),o.HEAP32=N=new Int32Array(e),o.HEAPU8=F=new Uint8Array(e),o.HEAPU16=new Uint16Array(e),o.HEAPU32=new Uint32Array(e),o.HEAPF32=R=new Float32Array(e),o.HEAPF64=K=new Float64Array(e)}var T=o.INITIAL_MEMORY||16777216;function P(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var r=t.func;"number"==typeof r?void 0===t.arg?o.dynCall_v(r):o.dynCall_vi(r,t.arg):r(void 0===t.arg?null:t.arg)}else t(o)}}(d=o.wasmMemory?o.wasmMemory:new WebAssembly.Memory({initial:T/65536,maximum:32768}))&&(k=d.buffer),T=k.byteLength,L(k),N[5160]=5263680;var U=[],_=[],O=[],j=[];var Y=Math.abs,G=Math.ceil,J=Math.floor,H=Math.min,q=0,z=null,W=null;function V(e){q++,o.monitorRunDependencies&&o.monitorRunDependencies(q)}function X(e){if(q--,o.monitorRunDependencies&&o.monitorRunDependencies(q),0==q&&(null!==z&&(clearInterval(z),z=null),W)){var t=W;W=null,t()}}function Z(e){throw o.onAbort&&o.onAbort(e),g(e+=""),f(e),E=!0,1,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.",new WebAssembly.RuntimeError(e)}o.preloadedImages={},o.preloadedAudios={};function $(e){return t=e,r="data:application/octet-stream;base64,",String.prototype.startsWith?t.startsWith(r):0===t.indexOf(r);var t,r}var ee,te,re="data:application/octet-stream;base64,AGFzbQEAAAAB0QIwYAF/AX9gA39/fwF/YAJ/fwF/YAF/AGACf38AYAR/f39/AX9gBX9/f39/AX9gA39/fwBgBH9+f38Bf2AAAX9gAn9+AX9gA39+fwF/YAF/AX5gBX9/f35/AX5gA39/fgF+YAR/f35/AX5gA39+fwF+YAN/f34Bf2AEf39+fwF/YAR/f39/AX5gBH9/f38AYAZ/f39/f38Bf2AFf39+f38Bf2ACfn8Bf2ADf39/AX5gAn9+AGAEf35+fwBgA398fwBgBX9+f39/AX9gBn98f39/fwF/YAJ/fwF+YAAAYAV/f39/fwBgBX9/f35/AGADf35/AGACf3wAYAN/fHwAYAR/f35+AX9gBH9+fn8Bf2AIf35+f39/fn8Bf2ABfgF/YAN+f38Bf2AFf39/f38BfmAEf39/fgF+YAJ/fgF+YAV+fn9+fwF+YAJ+fgF8YAJ8fwF8ApsBFwFhAWEAAwFhAWIAAAFhAWMAAgFhAWQABQFhAWUAAQFhAWYAAAFhAWcAAAFhAWgAAgFhAWkAAgFhAWoAAgFhAWsAAAFhAWwABgFhAW0AAAFhAW4ABQFhAW8AAQFhAXAAAgFhAXEAAQFhAXIAAQFhAXMAAAFhAXQAAQFhAXUAAAFhBm1lbW9yeQIBgAKAgAIBYQV0YWJsZQFwAB8D/gL8AgcDAwQAAQEDAwAKBAQPBwMDAyALFAoAAAoZDgwMAAcDDBEeAwIDAgMBAAMHCBcOBAgABQAADAAECAgCBQUAAQATAxQjAQECAwMBBgYSAwMFGAEIAwEAAAIDGAcGARUBAAcEAiESCAAWAicQAgsXAQIABgICAgAGBAADLQUAAQQAAQsLAgIBDAwAAggcHBMHAC8CAQoWAQEDBgIBAAICAAcHBwMDAwMsEgsICAQLASoHAQ4KCQIJDgMJAAoCAAUAAQEBAAYABQUGBgYBAgUFBQYVFQUBBAADAwkABQgCCBYSAgoBAgEAAgAADyYAAQEQAgIJAAkDAQACBAAAHg4LAQAAAAgAABMAGBkKCAwCAgQAAgEHBB0XKQcBAAkJCS4aGgIREQoBAgAAAA0rDQUFAAEBAxEAAAADAQABAwAAAgAABAQCAgICCQIDAwAAAgACBwQUAAADAwMBBAECDQYPDgsPAAokAwIDAygiEwMDAAQDAgINJRAEAgICCQkfBgkBfwFBwKLBAgsHnQI2AXYAkAMBdwCPAwF4ANsCAXkAlgIBegDXAQFBANMBAUIAzgEBQwDNAQFEAMoBAUUAuwIBRgDoAQFHAD8BSADVAgFJAJkCAUoAmAIBSwCkAgFMAJsCAU0A5wEBTgDmAQFPAOUBAVAA5AEBUQCTAgFSAOMBAVMA4gEBVADhAQFVAOABAVYA3wEBVwD5AQFYAJIBAVkA3gEBWgDdAQFfANwBASQAMgJhYQDiAgJiYQAcAmNhAOwBAmRhAEkCZWEA2wECZmEA2gECZ2EAbAJoYQDZAQJpYQDvAQJqYQDYAQJrYQDuAQJsYQDIAQJtYQCxAgJuYQCwAgJvYQCvAgJwYQDtAQJxYQDrAQJyYQDqAQJzYQAZAnRhABYCdWEA6QEJQQEAQQELHocD9QLwAvEC7gLtArIB2ALXAswCywLKAskCyALHAsYCxQLEAsACvgKpAqgCpgKiAluDAoICgQKAAv4BCqqaCfwCQAEBfyMAQRBrIgMgADYCDCADIAE2AgggAyACNgIEIAMoAgwEQCADKAIMIAMoAgg2AgAgAygCDCADKAIENgIECwuqDQEHfwJAIABFDQAgAEF4aiIDIABBfGooAgAiAUF4cSIAaiEFAkAgAUEBcQ0AIAFBA3FFDQEgAyADKAIAIgJrIgNByJwBKAIAIgRJDQEgACACaiEAIANBzJwBKAIARwRAIAJB/wFNBEAgAygCCCIEIAJBA3YiAkEDdEHgnAFqRxogBCADKAIMIgFGBEBBuJwBQbicASgCAEF+IAJ3cTYCAAwDCyAEIAE2AgwgASAENgIIDAILIAMoAhghBgJAIAMgAygCDCIBRwRAIAQgAygCCCICTQRAIAIoAgwaCyACIAE2AgwgASACNgIIDAELAkAgA0EUaiICKAIAIgQNACADQRBqIgIoAgAiBA0AQQAhAQwBCwNAIAIhByAEIgFBFGoiAigCACIEDQAgAUEQaiECIAEoAhAiBA0ACyAHQQA2AgALIAZFDQECQCADIAMoAhwiAkECdEHongFqIgQoAgBGBEAgBCABNgIAIAENAUG8nAFBvJwBKAIAQX4gAndxNgIADAMLIAZBEEEUIAYoAhAgA0YbaiABNgIAIAFFDQILIAEgBjYCGCADKAIQIgIEQCABIAI2AhAgAiABNgIYCyADKAIUIgJFDQEgASACNgIUIAIgATYCGAwBCyAFKAIEIgFBA3FBA0cNAEHAnAEgADYCACAFIAFBfnE2AgQgAyAAQQFyNgIEIAAgA2ogADYCAA8LIAUgA00NACAFKAIEIgFBAXFFDQACQCABQQJxRQRAIAVB0JwBKAIARgRAQdCcASADNgIAQcScAUHEnAEoAgAgAGoiADYCACADIABBAXI2AgQgA0HMnAEoAgBHDQNBwJwBQQA2AgBBzJwBQQA2AgAPCyAFQcycASgCAEYEQEHMnAEgAzYCAEHAnAFBwJwBKAIAIABqIgA2AgAgAyAAQQFyNgIEIAAgA2ogADYCAA8LIAFBeHEgAGohAAJAIAFB/wFNBEAgBSgCDCECIAUoAggiBCABQQN2IgFBA3RB4JwBaiIHRwRAQcicASgCABoLIAIgBEYEQEG4nAFBuJwBKAIAQX4gAXdxNgIADAILIAIgB0cEQEHInAEoAgAaCyAEIAI2AgwgAiAENgIIDAELIAUoAhghBgJAIAUgBSgCDCIBRwRAQcicASgCACAFKAIIIgJNBEAgAigCDBoLIAIgATYCDCABIAI2AggMAQsCQCAFQRRqIgIoAgAiBA0AIAVBEGoiAigCACIEDQBBACEBDAELA0AgAiEHIAQiAUEUaiICKAIAIgQNACABQRBqIQIgASgCECIEDQALIAdBADYCAAsgBkUNAAJAIAUgBSgCHCICQQJ0QeieAWoiBCgCAEYEQCAEIAE2AgAgAQ0BQbycAUG8nAEoAgBBfiACd3E2AgAMAgsgBkEQQRQgBigCECAFRhtqIAE2AgAgAUUNAQsgASAGNgIYIAUoAhAiAgRAIAEgAjYCECACIAE2AhgLIAUoAhQiAkUNACABIAI2AhQgAiABNgIYCyADIABBAXI2AgQgACADaiAANgIAIANBzJwBKAIARw0BQcCcASAANgIADwsgBSABQX5xNgIEIAMgAEEBcjYCBCAAIANqIAA2AgALIABB/wFNBEAgAEEDdiIBQQN0QeCcAWohAAJ/QbicASgCACICQQEgAXQiAXFFBEBBuJwBIAEgAnI2AgAgAAwBCyAAKAIICyECIAAgAzYCCCACIAM2AgwgAyAANgIMIAMgAjYCCA8LIANCADcCECADAn9BACAAQQh2IgFFDQAaQR8gAEH///8HSw0AGiABIAFBgP4/akEQdkEIcSIBdCICIAJBgOAfakEQdkEEcSICdCIEIARBgIAPakEQdkECcSIEdEEPdiABIAJyIARyayIBQQF0IAAgAUEVanZBAXFyQRxqCyICNgIcIAJBAnRB6J4BaiEBAkACQAJAQbycASgCACIEQQEgAnQiB3FFBEBBvJwBIAQgB3I2AgAgASADNgIAIAMgATYCGAwBCyAAQQBBGSACQQF2ayACQR9GG3QhAiABKAIAIQEDQCABIgQoAgRBeHEgAEYNAiACQR12IQEgAkEBdCECIAQgAUEEcWoiB0EQaigCACIBDQALIAcgAzYCECADIAQ2AhgLIAMgAzYCDCADIAM2AggMAQsgBCgCCCIAIAM2AgwgBCADNgIIIANBADYCGCADIAQ2AgwgAyAANgIIC0HYnAFB2JwBKAIAQX9qIgA2AgAgAA0AQYCgASEDA0AgAygCACIAQQhqIQMgAA0AC0HYnAFBfzYCAAsLQgEBfyMAQRBrIgEkACABIAA2AgwgASgCDARAIAEoAgwtAAFBAXEEQCABKAIMKAIEEBYLIAEoAgwQFgsgAUEQaiQAC0MBAX8jAEEQayICJAAgAiAANgIMIAIgATYCCCACKAIMAn8jAEEQayIAIAIoAgg2AgwgACgCDEEMagsQRCACQRBqJAALzS4BC38jAEEQayILJAACQAJAAkACQAJAAkACQAJAAkACQAJAIABB9AFNBEBBuJwBKAIAIgZBECAAQQtqQXhxIABBC0kbIgVBA3YiAHYiAUEDcQRAIAFBf3NBAXEgAGoiAkEDdCIEQeicAWooAgAiAUEIaiEAAkAgASgCCCIDIARB4JwBaiIERgRAQbicASAGQX4gAndxNgIADAELQcicASgCABogAyAENgIMIAQgAzYCCAsgASACQQN0IgJBA3I2AgQgASACaiIBIAEoAgRBAXI2AgQMDAsgBUHAnAEoAgAiCE0NASABBEACQEECIAB0IgJBACACa3IgASAAdHEiAEEAIABrcUF/aiIAIABBDHZBEHEiAHYiAUEFdkEIcSICIAByIAEgAnYiAEECdkEEcSIBciAAIAF2IgBBAXZBAnEiAXIgACABdiIAQQF2QQFxIgFyIAAgAXZqIgJBA3QiA0HonAFqKAIAIgEoAggiACADQeCcAWoiA0YEQEG4nAEgBkF+IAJ3cSIGNgIADAELQcicASgCABogACADNgIMIAMgADYCCAsgAUEIaiEAIAEgBUEDcjYCBCABIAVqIgcgAkEDdCICIAVrIgNBAXI2AgQgASACaiADNgIAIAgEQCAIQQN2IgRBA3RB4JwBaiEBQcycASgCACECAn8gBkEBIAR0IgRxRQRAQbicASAEIAZyNgIAIAEMAQsgASgCCAshBCABIAI2AgggBCACNgIMIAIgATYCDCACIAQ2AggLQcycASAHNgIAQcCcASADNgIADAwLQbycASgCACIKRQ0BIApBACAKa3FBf2oiACAAQQx2QRBxIgB2IgFBBXZBCHEiAiAAciABIAJ2IgBBAnZBBHEiAXIgACABdiIAQQF2QQJxIgFyIAAgAXYiAEEBdkEBcSIBciAAIAF2akECdEHongFqKAIAIgEoAgRBeHEgBWshAyABIQIDQAJAIAIoAhAiAEUEQCACKAIUIgBFDQELIAAoAgRBeHEgBWsiAiADIAIgA0kiAhshAyAAIAEgAhshASAAIQIMAQsLIAEoAhghCSABIAEoAgwiBEcEQEHInAEoAgAgASgCCCIATQRAIAAoAgwaCyAAIAQ2AgwgBCAANgIIDAsLIAFBFGoiAigCACIARQRAIAEoAhAiAEUNAyABQRBqIQILA0AgAiEHIAAiBEEUaiICKAIAIgANACAEQRBqIQIgBCgCECIADQALIAdBADYCAAwKC0F/IQUgAEG/f0sNACAAQQtqIgBBeHEhBUG8nAEoAgAiB0UNAEEAIAVrIQICQAJAAkACf0EAIABBCHYiAEUNABpBHyAFQf///wdLDQAaIAAgAEGA/j9qQRB2QQhxIgB0IgEgAUGA4B9qQRB2QQRxIgF0IgMgA0GAgA9qQRB2QQJxIgN0QQ92IAAgAXIgA3JrIgBBAXQgBSAAQRVqdkEBcXJBHGoLIghBAnRB6J4BaigCACIDRQRAQQAhAAwBCyAFQQBBGSAIQQF2ayAIQR9GG3QhAUEAIQADQAJAIAMoAgRBeHEgBWsiBiACTw0AIAMhBCAGIgINAEEAIQIgAyEADAMLIAAgAygCFCIGIAYgAyABQR12QQRxaigCECIDRhsgACAGGyEAIAEgA0EAR3QhASADDQALCyAAIARyRQRAQQIgCHQiAEEAIABrciAHcSIARQ0DIABBACAAa3FBf2oiACAAQQx2QRBxIgB2IgFBBXZBCHEiAyAAciABIAN2IgBBAnZBBHEiAXIgACABdiIAQQF2QQJxIgFyIAAgAXYiAEEBdkEBcSIBciAAIAF2akECdEHongFqKAIAIQALIABFDQELA0AgACgCBEF4cSAFayIDIAJJIQEgAyACIAEbIQIgACAEIAEbIQQgACgCECIBBH8gAQUgACgCFAsiAA0ACwsgBEUNACACQcCcASgCACAFa08NACAEKAIYIQggBCAEKAIMIgFHBEBByJwBKAIAIAQoAggiAE0EQCAAKAIMGgsgACABNgIMIAEgADYCCAwJCyAEQRRqIgMoAgAiAEUEQCAEKAIQIgBFDQMgBEEQaiEDCwNAIAMhBiAAIgFBFGoiAygCACIADQAgAUEQaiEDIAEoAhAiAA0ACyAGQQA2AgAMCAtBwJwBKAIAIgEgBU8EQEHMnAEoAgAhAAJAIAEgBWsiAkEQTwRAQcCcASACNgIAQcycASAAIAVqIgM2AgAgAyACQQFyNgIEIAAgAWogAjYCACAAIAVBA3I2AgQMAQtBzJwBQQA2AgBBwJwBQQA2AgAgACABQQNyNgIEIAAgAWoiASABKAIEQQFyNgIECyAAQQhqIQAMCgtBxJwBKAIAIgEgBUsEQEHEnAEgASAFayIBNgIAQdCcAUHQnAEoAgAiACAFaiICNgIAIAIgAUEBcjYCBCAAIAVBA3I2AgQgAEEIaiEADAoLQQAhACAFQS9qIgQCf0GQoAEoAgAEQEGYoAEoAgAMAQtBnKABQn83AgBBlKABQoCggICAgAQ3AgBBkKABIAtBDGpBcHFB2KrVqgVzNgIAQaSgAUEANgIAQfSfAUEANgIAQYAgCyICaiIGQQAgAmsiB3EiAiAFTQ0JQfCfASgCACIDBEBB6J8BKAIAIgggAmoiCSAITQ0KIAkgA0sNCgtB9J8BLQAAQQRxDQQCQAJAQdCcASgCACIDBEBB+J8BIQADQCAAKAIAIgggA00EQCAIIAAoAgRqIANLDQMLIAAoAggiAA0ACwtBABA+IgFBf0YNBSACIQZBlKABKAIAIgBBf2oiAyABcQRAIAIgAWsgASADakEAIABrcWohBgsgBiAFTQ0FIAZB/v///wdLDQVB8J8BKAIAIgAEQEHonwEoAgAiAyAGaiIHIANNDQYgByAASw0GCyAGED4iACABRw0BDAcLIAYgAWsgB3EiBkH+////B0sNBCAGED4iASAAKAIAIAAoAgRqRg0DIAEhAAsCQCAFQTBqIAZNDQAgAEF/Rg0AQZigASgCACIBIAQgBmtqQQAgAWtxIgFB/v///wdLBEAgACEBDAcLIAEQPkF/RwRAIAEgBmohBiAAIQEMBwtBACAGaxA+GgwECyAAIgFBf0cNBQwDC0EAIQQMBwtBACEBDAULIAFBf0cNAgtB9J8BQfSfASgCAEEEcjYCAAsgAkH+////B0sNASACED4iAUEAED4iAE8NASABQX9GDQEgAEF/Rg0BIAAgAWsiBiAFQShqTQ0BC0HonwFB6J8BKAIAIAZqIgA2AgAgAEHsnwEoAgBLBEBB7J8BIAA2AgALAkACQAJAQdCcASgCACIDBEBB+J8BIQADQCABIAAoAgAiAiAAKAIEIgRqRg0CIAAoAggiAA0ACwwCC0HInAEoAgAiAEEAIAEgAE8bRQRAQcicASABNgIAC0EAIQBB/J8BIAY2AgBB+J8BIAE2AgBB2JwBQX82AgBB3JwBQZCgASgCADYCAEGEoAFBADYCAANAIABBA3QiAkHonAFqIAJB4JwBaiIDNgIAIAJB7JwBaiADNgIAIABBAWoiAEEgRw0AC0HEnAEgBkFYaiIAQXggAWtBB3FBACABQQhqQQdxGyICayIDNgIAQdCcASABIAJqIgI2AgAgAiADQQFyNgIEIAAgAWpBKDYCBEHUnAFBoKABKAIANgIADAILIAAtAAxBCHENACABIANNDQAgAiADSw0AIAAgBCAGajYCBEHQnAEgA0F4IANrQQdxQQAgA0EIakEHcRsiAGoiATYCAEHEnAFBxJwBKAIAIAZqIgIgAGsiADYCACABIABBAXI2AgQgAiADakEoNgIEQdScAUGgoAEoAgA2AgAMAQsgAUHInAEoAgAiBEkEQEHInAEgATYCACABIQQLIAEgBmohAkH4nwEhAAJAAkACQAJAAkACQANAIAIgACgCAEcEQCAAKAIIIgANAQwCCwsgAC0ADEEIcUUNAQtB+J8BIQADQCAAKAIAIgIgA00EQCACIAAoAgRqIgQgA0sNAwsgACgCCCEADAAACwALIAAgATYCACAAIAAoAgQgBmo2AgQgAUF4IAFrQQdxQQAgAUEIakEHcRtqIgkgBUEDcjYCBCACQXggAmtBB3FBACACQQhqQQdxG2oiASAJayAFayEAIAUgCWohByABIANGBEBB0JwBIAc2AgBBxJwBQcScASgCACAAaiIANgIAIAcgAEEBcjYCBAwDCyABQcycASgCAEYEQEHMnAEgBzYCAEHAnAFBwJwBKAIAIABqIgA2AgAgByAAQQFyNgIEIAAgB2ogADYCAAwDCyABKAIEIgJBA3FBAUYEQCACQXhxIQoCQCACQf8BTQRAIAEoAggiAyACQQN2IgRBA3RB4JwBakcaIAMgASgCDCICRgRAQbicAUG4nAEoAgBBfiAEd3E2AgAMAgsgAyACNgIMIAIgAzYCCAwBCyABKAIYIQgCQCABIAEoAgwiBkcEQCAEIAEoAggiAk0EQCACKAIMGgsgAiAGNgIMIAYgAjYCCAwBCwJAIAFBFGoiAygCACIFDQAgAUEQaiIDKAIAIgUNAEEAIQYMAQsDQCADIQIgBSIGQRRqIgMoAgAiBQ0AIAZBEGohAyAGKAIQIgUNAAsgAkEANgIACyAIRQ0AAkAgASABKAIcIgJBAnRB6J4BaiIDKAIARgRAIAMgBjYCACAGDQFBvJwBQbycASgCAEF+IAJ3cTYCAAwCCyAIQRBBFCAIKAIQIAFGG2ogBjYCACAGRQ0BCyAGIAg2AhggASgCECICBEAgBiACNgIQIAIgBjYCGAsgASgCFCICRQ0AIAYgAjYCFCACIAY2AhgLIAEgCmohASAAIApqIQALIAEgASgCBEF+cTYCBCAHIABBAXI2AgQgACAHaiAANgIAIABB/wFNBEAgAEEDdiIBQQN0QeCcAWohAAJ/QbicASgCACICQQEgAXQiAXFFBEBBuJwBIAEgAnI2AgAgAAwBCyAAKAIICyEBIAAgBzYCCCABIAc2AgwgByAANgIMIAcgATYCCAwDCyAHAn9BACAAQQh2IgFFDQAaQR8gAEH///8HSw0AGiABIAFBgP4/akEQdkEIcSIBdCICIAJBgOAfakEQdkEEcSICdCIDIANBgIAPakEQdkECcSIDdEEPdiABIAJyIANyayIBQQF0IAAgAUEVanZBAXFyQRxqCyIBNgIcIAdCADcCECABQQJ0QeieAWohAgJAQbycASgCACIDQQEgAXQiBHFFBEBBvJwBIAMgBHI2AgAgAiAHNgIADAELIABBAEEZIAFBAXZrIAFBH0YbdCEDIAIoAgAhAQNAIAEiAigCBEF4cSAARg0DIANBHXYhASADQQF0IQMgAiABQQRxaiIEKAIQIgENAAsgBCAHNgIQCyAHIAI2AhggByAHNgIMIAcgBzYCCAwCC0HEnAEgBkFYaiIAQXggAWtBB3FBACABQQhqQQdxGyICayIHNgIAQdCcASABIAJqIgI2AgAgAiAHQQFyNgIEIAAgAWpBKDYCBEHUnAFBoKABKAIANgIAIAMgBEEnIARrQQdxQQAgBEFZakEHcRtqQVFqIgAgACADQRBqSRsiAkEbNgIEIAJBgKABKQIANwIQIAJB+J8BKQIANwIIQYCgASACQQhqNgIAQfyfASAGNgIAQfifASABNgIAQYSgAUEANgIAIAJBGGohAANAIABBBzYCBCAAQQhqIQEgAEEEaiEAIAQgAUsNAAsgAiADRg0DIAIgAigCBEF+cTYCBCADIAIgA2siBEEBcjYCBCACIAQ2AgAgBEH/AU0EQCAEQQN2IgFBA3RB4JwBaiEAAn9BuJwBKAIAIgJBASABdCIBcUUEQEG4nAEgASACcjYCACAADAELIAAoAggLIQEgACADNgIIIAEgAzYCDCADIAA2AgwgAyABNgIIDAQLIANCADcCECADAn9BACAEQQh2IgBFDQAaQR8gBEH///8HSw0AGiAAIABBgP4/akEQdkEIcSIAdCIBIAFBgOAfakEQdkEEcSIBdCICIAJBgIAPakEQdkECcSICdEEPdiAAIAFyIAJyayIAQQF0IAQgAEEVanZBAXFyQRxqCyIANgIcIABBAnRB6J4BaiEBAkBBvJwBKAIAIgJBASAAdCIGcUUEQEG8nAEgAiAGcjYCACABIAM2AgAgAyABNgIYDAELIARBAEEZIABBAXZrIABBH0YbdCEAIAEoAgAhAQNAIAEiAigCBEF4cSAERg0EIABBHXYhASAAQQF0IQAgAiABQQRxaiIGKAIQIgENAAsgBiADNgIQIAMgAjYCGAsgAyADNgIMIAMgAzYCCAwDCyACKAIIIgAgBzYCDCACIAc2AgggB0EANgIYIAcgAjYCDCAHIAA2AggLIAlBCGohAAwFCyACKAIIIgAgAzYCDCACIAM2AgggA0EANgIYIAMgAjYCDCADIAA2AggLQcScASgCACIAIAVNDQBBxJwBIAAgBWsiATYCAEHQnAFB0JwBKAIAIgAgBWoiAjYCACACIAFBAXI2AgQgACAFQQNyNgIEIABBCGohAAwDC0G0nAFBMDYCAEEAIQAMAgsCQCAIRQ0AAkAgBCgCHCIAQQJ0QeieAWoiAygCACAERgRAIAMgATYCACABDQFBvJwBIAdBfiAAd3EiBzYCAAwCCyAIQRBBFCAIKAIQIARGG2ogATYCACABRQ0BCyABIAg2AhggBCgCECIABEAgASAANgIQIAAgATYCGAsgBCgCFCIARQ0AIAEgADYCFCAAIAE2AhgLAkAgAkEPTQRAIAQgAiAFaiIAQQNyNgIEIAAgBGoiACAAKAIEQQFyNgIEDAELIAQgBUEDcjYCBCAEIAVqIgMgAkEBcjYCBCACIANqIAI2AgAgAkH/AU0EQCACQQN2IgFBA3RB4JwBaiEAAn9BuJwBKAIAIgJBASABdCIBcUUEQEG4nAEgASACcjYCACAADAELIAAoAggLIQEgACADNgIIIAEgAzYCDCADIAA2AgwgAyABNgIIDAELIAMCf0EAIAJBCHYiAEUNABpBHyACQf///wdLDQAaIAAgAEGA/j9qQRB2QQhxIgB0IgEgAUGA4B9qQRB2QQRxIgF0IgUgBUGAgA9qQRB2QQJxIgV0QQ92IAAgAXIgBXJrIgBBAXQgAiAAQRVqdkEBcXJBHGoLIgA2AhwgA0IANwIQIABBAnRB6J4BaiEBAkACQCAHQQEgAHQiBXFFBEBBvJwBIAUgB3I2AgAgASADNgIADAELIAJBAEEZIABBAXZrIABBH0YbdCEAIAEoAgAhBQNAIAUiASgCBEF4cSACRg0CIABBHXYhBSAAQQF0IQAgASAFQQRxaiIGKAIQIgUNAAsgBiADNgIQCyADIAE2AhggAyADNgIMIAMgAzYCCAwBCyABKAIIIgAgAzYCDCABIAM2AgggA0EANgIYIAMgATYCDCADIAA2AggLIARBCGohAAwBCwJAIAlFDQACQCABKAIcIgBBAnRB6J4BaiICKAIAIAFGBEAgAiAENgIAIAQNAUG8nAEgCkF+IAB3cTYCAAwCCyAJQRBBFCAJKAIQIAFGG2ogBDYCACAERQ0BCyAEIAk2AhggASgCECIABEAgBCAANgIQIAAgBDYCGAsgASgCFCIARQ0AIAQgADYCFCAAIAQ2AhgLAkAgA0EPTQRAIAEgAyAFaiIAQQNyNgIEIAAgAWoiACAAKAIEQQFyNgIEDAELIAEgBUEDcjYCBCABIAVqIgQgA0EBcjYCBCADIARqIAM2AgAgCARAIAhBA3YiBUEDdEHgnAFqIQBBzJwBKAIAIQICf0EBIAV0IgUgBnFFBEBBuJwBIAUgBnI2AgAgAAwBCyAAKAIICyEFIAAgAjYCCCAFIAI2AgwgAiAANgIMIAIgBTYCCAtBzJwBIAQ2AgBBwJwBIAM2AgALIAFBCGohAAsgC0EQaiQAIAALggQBA38gAkGABE8EQCAAIAEgAhATGiAADwsgACACaiEDAkAgACABc0EDcUUEQAJAIAJBAUgEQCAAIQIMAQsgAEEDcUUEQCAAIQIMAQsgACECA0AgAiABLQAAOgAAIAFBAWohASACQQFqIgIgA08NASACQQNxDQALCwJAIANBfHEiBEHAAEkNACACIARBQGoiBUsNAANAIAIgASgCADYCACACIAEoAgQ2AgQgAiABKAIINgIIIAIgASgCDDYCDCACIAEoAhA2AhAgAiABKAIUNgIUIAIgASgCGDYCGCACIAEoAhw2AhwgAiABKAIgNgIgIAIgASgCJDYCJCACIAEoAig2AiggAiABKAIsNgIsIAIgASgCMDYCMCACIAEoAjQ2AjQgAiABKAI4NgI4IAIgASgCPDYCPCABQUBrIQEgAkFAayICIAVNDQALCyACIARPDQEDQCACIAEoAgA2AgAgAUEEaiEBIAJBBGoiAiAESQ0ACwwBCyADQQRJBEAgACECDAELIANBfGoiBCAASQRAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAiABLQABOgABIAIgAS0AAjoAAiACIAEtAAM6AAMgAUEEaiEBIAJBBGoiAiAETQ0ACwsgAiADSQRAA0AgAiABLQAAOgAAIAFBAWohASACQQFqIgIgA0cNAAsLIAALPwEBfyMAQRBrIgMkACADIAA2AgwgAyABNgIIIAMgAjYCBCADKAIMIAMoAgggAygCBBDWASEAIANBEGokACAAC90BAQF/IwBBEGsiASQAIAEgADYCDAJAIAEoAgxFDQAgASgCDCgCMEEASwRAIAEoAgwiACAAKAIwQX9qNgIwCyABKAIMKAIwQQBLDQAgASgCDCgCIEEASwRAIAEoAgxBATYCICABKAIMEDIaCyABKAIMKAIkQQFGBEAgASgCDBBtCwJAIAEoAgwoAixFDQAgASgCDC0AKEEBcQ0AIAEoAgwoAiwgASgCDBCDAwsgASgCDEEAQgBBBRAiGiABKAIMKAIABEAgASgCDCgCABAcCyABKAIMEBYLIAFBEGokAAuBAgEBfyMAQRBrIgEkACABIAA2AgwgASABKAIMKAIcNgIEIAEoAgQQ6gIgASABKAIEKAIUNgIIIAEoAgggASgCDCgCEEsEQCABIAEoAgwoAhA2AggLAkAgASgCCEUNACABKAIMKAIMIAEoAgQoAhAgASgCCBAaGiABKAIMIgAgASgCCCAAKAIMajYCDCABKAIEIgAgASgCCCAAKAIQajYCECABKAIMIgAgASgCCCAAKAIUajYCFCABKAIMIgAgACgCECABKAIIazYCECABKAIEIgAgACgCFCABKAIIazYCFCABKAIEKAIUDQAgASgCBCABKAIEKAIINgIQCyABQRBqJAALYAEBfyMAQRBrIgEkACABIAA2AgggASABKAIIQgIQHzYCBAJAIAEoAgRFBEAgAUEAOwEODAELIAEgASgCBC0AACABKAIELQABQQh0ajsBDgsgAS8BDiEAIAFBEGokACAAC1oBAX8jAEEgayICJAAgAiAANgIcIAIgATcDECACIAIoAhwgAikDEBDPATYCDCACKAIMBEAgAigCHCIAIAIpAxAgACkDEHw3AxALIAIoAgwhACACQSBqJAAgAAtvAQF/IwBBEGsiAiQAIAIgADYCCCACIAE7AQYgAiACKAIIQgIQHzYCAAJAIAIoAgBFBEAgAkF/NgIMDAELIAIoAgAgAi8BBjoAACACKAIAIAIvAQZBCHU6AAEgAkEANgIMCyACKAIMGiACQRBqJAALjwEBAX8jAEEQayICJAAgAiAANgIIIAIgATYCBCACIAIoAghCBBAfNgIAAkAgAigCAEUEQCACQX82AgwMAQsgAigCACACKAIEOgAAIAIoAgAgAigCBEEIdjoAASACKAIAIAIoAgRBEHY6AAIgAigCACACKAIEQRh2OgADIAJBADYCDAsgAigCDBogAkEQaiQAC7YCAQF/IwBBMGsiBCQAIAQgADYCJCAEIAE2AiAgBCACNwMYIAQgAzYCFAJAIAQoAiQpAxhCASAEKAIUrYaDUARAIAQoAiRBDGpBHEEAEBUgBEJ/NwMoDAELAkAgBCgCJCgCAEUEQCAEIAQoAiQoAgggBCgCICAEKQMYIAQoAhQgBCgCJCgCBBEPADcDCAwBCyAEIAQoAiQoAgAgBCgCJCgCCCAEKAIgIAQpAxggBCgCFCAEKAIkKAIEEQ0ANwMICyAEKQMIQgBTBEACQCAEKAIUQQRGDQAgBCgCFEEORg0AAkAgBCgCJCAEQghBBBAiQgBTBEAgBCgCJEEMakEUQQAQFQwBCyAEKAIkQQxqIAQoAgAgBCgCBBAVCwsLIAQgBCkDCDcDKAsgBCkDKCECIARBMGokACACCxcAIAAtAABBIHFFBEAgASACIAAQcRoLC1ABAX8jAEEQayIBJAAgASAANgIMA0AgASgCDARAIAEgASgCDCgCADYCCCABKAIMKAIMEBYgASgCDBAWIAEgASgCCDYCDAwBCwsgAUEQaiQAC30BAX8jAEEQayIBJAAgASAANgIMIAEoAgwEQCABQgA3AwADQCABKQMAIAEoAgwpAwhaRQRAIAEoAgwoAgAgASkDAKdBBHRqEGIgASABKQMAQgF8NwMADAELCyABKAIMKAIAEBYgASgCDCgCKBAmIAEoAgwQFgsgAUEQaiQACz4BAX8jAEEQayIBJAAgASAANgIMIAEoAgwEQCABKAIMKAIAEBYgASgCDCgCDBAWIAEoAgwQFgsgAUEQaiQAC2oBAX8jAEGAAmsiBSQAAkAgAiADTA0AIARBgMAEcQ0AIAUgASACIANrIgJBgAIgAkGAAkkiARsQMyABRQRAA0AgACAFQYACECMgAkGAfmoiAkH/AUsNAAsLIAAgBSACECMLIAVBgAJqJAAL1AEBAX8jAEEwayIDJAAgAyAANgIoIAMgATcDICADIAI2AhwCQCADKAIoLQAoQQFxBEAgA0F/NgIsDAELAkAgAygCKCgCIEEASwRAIAMoAhxFDQEgAygCHEEBRg0BIAMoAhxBAkYNAQsgAygCKEEMakESQQAQFSADQX82AiwMAQsgAyADKQMgNwMIIAMgAygCHDYCECADKAIoIANBCGpCEEEGECJCAFMEQCADQX82AiwMAQsgAygCKEEAOgA0IANBADYCLAsgAygCLCEAIANBMGokACAAC7gIAQF/IwBBMGsiBCQAIAQgADYCLCAEIAE2AiggBCACNgIkIAQgAzYCICAEQQA2AhQCQCAEKAIsKAKEAUEASgRAIAQoAiwoAgAoAixBAkYEQCAEKAIsEOgCIQAgBCgCLCgCACAANgIsCyAEKAIsIAQoAixBmBZqEHYgBCgCLCAEKAIsQaQWahB2IAQgBCgCLBDnAjYCFCAEIAQoAiwoAqgtQQpqQQN2NgIcIAQgBCgCLCgCrC1BCmpBA3Y2AhggBCgCGCAEKAIcTQRAIAQgBCgCGDYCHAsMAQsgBCAEKAIkQQVqIgA2AhggBCAANgIcCwJAAkAgBCgCJEEEaiAEKAIcSw0AIAQoAihFDQAgBCgCLCAEKAIoIAQoAiQgBCgCIBBXDAELAkACQCAEKAIsKAKIAUEERwRAIAQoAhggBCgCHEcNAQsgBEEDNgIQAkAgBCgCLCgCvC1BECAEKAIQa0oEQCAEIAQoAiBBAmo2AgwgBCgCLCIAIAAvAbgtIAQoAgxB//8DcSAEKAIsKAK8LXRyOwG4LSAEKAIsLwG4LUH/AXEhASAEKAIsKAIIIQIgBCgCLCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAIsLwG4LUEIdSEBIAQoAiwoAgghAiAEKAIsIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAiwgBCgCDEH//wNxQRAgBCgCLCgCvC1rdTsBuC0gBCgCLCIAIAAoArwtIAQoAhBBEGtqNgK8LQwBCyAEKAIsIgAgAC8BuC0gBCgCIEECakH//wNxIAQoAiwoArwtdHI7AbgtIAQoAiwiACAEKAIQIAAoArwtajYCvC0LIAQoAixBwNsAQcDkABC2AQwBCyAEQQM2AggCQCAEKAIsKAK8LUEQIAQoAghrSgRAIAQgBCgCIEEEajYCBCAEKAIsIgAgAC8BuC0gBCgCBEH//wNxIAQoAiwoArwtdHI7AbgtIAQoAiwvAbgtQf8BcSEBIAQoAiwoAgghAiAEKAIsIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAiwvAbgtQQh1IQEgBCgCLCgCCCECIAQoAiwiAygCFCEAIAMgAEEBajYCFCAAIAJqIAE6AAAgBCgCLCAEKAIEQf//A3FBECAEKAIsKAK8LWt1OwG4LSAEKAIsIgAgACgCvC0gBCgCCEEQa2o2ArwtDAELIAQoAiwiACAALwG4LSAEKAIgQQRqQf//A3EgBCgCLCgCvC10cjsBuC0gBCgCLCIAIAQoAgggACgCvC1qNgK8LQsgBCgCLCAEKAIsKAKcFkEBaiAEKAIsKAKoFkEBaiAEKAIUQQFqEOYCIAQoAiwgBCgCLEGUAWogBCgCLEGIE2oQtgELCyAEKAIsELkBIAQoAiAEQCAEKAIsELgBCyAEQTBqJAAL1AEBAX8jAEEgayICJAAgAiAANgIYIAIgATcDECACIAIoAhhFOgAPAkAgAigCGEUEQCACIAIpAxCnEBkiADYCGCAARQRAIAJBADYCHAwCCwsgAkEYEBkiADYCCCAARQRAIAItAA9BAXEEQCACKAIYEBYLIAJBADYCHAwBCyACKAIIQQE6AAAgAigCCCACKAIYNgIEIAIoAgggAikDEDcDCCACKAIIQgA3AxAgAigCCCACLQAPQQFxOgABIAIgAigCCDYCHAsgAigCHCEAIAJBIGokACAAC3gBAX8jAEEQayIBJAAgASAANgIIIAEgASgCCEIEEB82AgQCQCABKAIERQRAIAFBADYCDAwBCyABIAEoAgQtAAAgASgCBC0AASABKAIELQACIAEoAgQtAANBCHRqQQh0akEIdGo2AgwLIAEoAgwhACABQRBqJAAgAAuQAQEDfyAAIQECQAJAIABBA3FFDQAgAC0AAEUEQEEADwsDQCABQQFqIgFBA3FFDQEgAS0AAA0ACwwBCwNAIAEiAkEEaiEBIAIoAgAiA0F/cyADQf/9+3dqcUGAgYKEeHFFDQALIANB/wFxRQRAIAIgAGsPCwNAIAItAAEhAyACQQFqIgEhAiADDQALCyABIABrC2EBAX8jAEEQayICIAA2AgggAiABNwMAAkAgAikDACACKAIIKQMIVgRAIAIoAghBADoAACACQX82AgwMAQsgAigCCEEBOgAAIAIoAgggAikDADcDECACQQA2AgwLIAIoAgwL7wEBAX8jAEEgayICJAAgAiAANgIYIAIgATcDECACIAIoAhhCCBAfNgIMAkAgAigCDEUEQCACQX82AhwMAQsgAigCDCACKQMQQv8BgzwAACACKAIMIAIpAxBCCIhC/wGDPAABIAIoAgwgAikDEEIQiEL/AYM8AAIgAigCDCACKQMQQhiIQv8BgzwAAyACKAIMIAIpAxBCIIhC/wGDPAAEIAIoAgwgAikDEEIoiEL/AYM8AAUgAigCDCACKQMQQjCIQv8BgzwABiACKAIMIAIpAxBCOIhC/wGDPAAHIAJBADYCHAsgAigCHBogAkEgaiQAC4sDAQF/IwBBMGsiAyQAIAMgADYCJCADIAE2AiAgAyACNwMYAkAgAygCJC0AKEEBcQRAIANCfzcDKAwBCwJAAkAgAygCJCgCIEEATQ0AIAMpAxhC////////////AFYNACADKQMYQgBYDQEgAygCIA0BCyADKAIkQQxqQRJBABAVIANCfzcDKAwBCyADKAIkLQA1QQFxBEAgA0J/NwMoDAELAn8jAEEQayIAIAMoAiQ2AgwgACgCDC0ANEEBcQsEQCADQgA3AygMAQsgAykDGFAEQCADQgA3AygMAQsgA0IANwMQA0AgAykDECADKQMYVARAIAMgAygCJCADKAIgIAMpAxCnaiADKQMYIAMpAxB9QQEQIiICNwMIIAJCAFMEQCADKAIkQQE6ADUgAykDEFAEQCADQn83AygMBAsgAyADKQMQNwMoDAMLIAMpAwhQBEAgAygCJEEBOgA0BSADIAMpAwggAykDEHw3AxAMAgsLCyADIAMpAxA3AygLIAMpAyghAiADQTBqJAAgAgs2AQF/IwBBEGsiASAANgIMAn4gASgCDC0AAEEBcQRAIAEoAgwpAwggASgCDCkDEH0MAQtCAAsLsgECAX8BfiMAQRBrIgEkACABIAA2AgQgASABKAIEQggQHzYCAAJAIAEoAgBFBEAgAUIANwMIDAELIAEgASgCAC0AAK0gASgCAC0AB61COIYgASgCAC0ABq1CMIZ8IAEoAgAtAAWtQiiGfCABKAIALQAErUIghnwgASgCAC0AA61CGIZ8IAEoAgAtAAKtQhCGfCABKAIALQABrUIIhnx8NwMICyABKQMIIQIgAUEQaiQAIAILqAEBAX8jAEEQayIBJAAgASAANgIIAkAgASgCCCgCIEEATQRAIAEoAghBDGpBEkEAEBUgAUF/NgIMDAELIAEoAggiACAAKAIgQX9qNgIgIAEoAggoAiBFBEAgASgCCEEAQgBBAhAiGiABKAIIKAIABEAgASgCCCgCABAyQQBIBEAgASgCCEEMakEUQQAQFQsLCyABQQA2AgwLIAEoAgwhACABQRBqJAAgAAvxAgICfwF+AkAgAkUNACAAIAJqIgNBf2ogAToAACAAIAE6AAAgAkEDSQ0AIANBfmogAToAACAAIAE6AAEgA0F9aiABOgAAIAAgAToAAiACQQdJDQAgA0F8aiABOgAAIAAgAToAAyACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiADYCACADIAIgBGtBfHEiAmoiAUF8aiAANgIAIAJBCUkNACADIAA2AgggAyAANgIEIAFBeGogADYCACABQXRqIAA2AgAgAkEZSQ0AIAMgADYCGCADIAA2AhQgAyAANgIQIAMgADYCDCABQXBqIAA2AgAgAUFsaiAANgIAIAFBaGogADYCACABQWRqIAA2AgAgAiADQQRxQRhyIgFrIgJBIEkNACAArSIFQiCGIAWEIQUgASADaiEBA0AgASAFNwMYIAEgBTcDECABIAU3AwggASAFNwMAIAFBIGohASACQWBqIgJBH0sNAAsLC9wBAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDCgCKARAIAEoAgwoAihBADYCKCABKAIMKAIoQgA3AyAgASgCDAJ+IAEoAgwpAxggASgCDCkDIFYEQCABKAIMKQMYDAELIAEoAgwpAyALNwMYCyABIAEoAgwpAxg3AwADQCABKQMAIAEoAgwpAwhaRQRAIAEoAgwoAgAgASkDAKdBBHRqKAIAEBYgASABKQMAQgF8NwMADAELCyABKAIMKAIAEBYgASgCDCgCBBAWIAEoAgwQFgsgAUEQaiQAC2ACAX8BfiMAQRBrIgEkACABIAA2AgQCQCABKAIEKAIkQQFHBEAgASgCBEEMakESQQAQFSABQn83AwgMAQsgASABKAIEQQBCAEENECI3AwgLIAEpAwghAiABQRBqJAAgAgugAQEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjcDCCADIAMoAhgoAgAgAygCFCADKQMIEMsBIgI3AwACQCACQgBTBEAgAygCGEEIaiADKAIYKAIAEBggA0F/NgIcDAELIAMpAwAgAykDCFIEQCADKAIYQQhqQQZBGxAVIANBfzYCHAwBCyADQQA2AhwLIAMoAhwhACADQSBqJAAgAAtrAQF/IwBBIGsiAiAANgIcIAJCASACKAIcrYY3AxAgAkEMaiABNgIAA0AgAiACKAIMIgBBBGo2AgwgAiAAKAIANgIIIAIoAghBAEhFBEAgAiACKQMQQgEgAigCCK2GhDcDEAwBCwsgAikDEAsvAQF/IwBBEGsiASQAIAEgADYCDCABKAIMKAIIEBYgASgCDEEANgIIIAFBEGokAAvNAQEBfyMAQRBrIgIkACACIAA2AgggAiABNgIEAkAgAigCCC0AKEEBcQRAIAJBfzYCDAwBCyACKAIERQRAIAIoAghBDGpBEkEAEBUgAkF/NgIMDAELIAIoAgQQPCACKAIIKAIABEAgAigCCCgCACACKAIEEDlBAEgEQCACKAIIQQxqIAIoAggoAgAQGCACQX82AgwMAgsLIAIoAgggAigCBEI4QQMQIkIAUwRAIAJBfzYCDAwBCyACQQA2AgwLIAIoAgwhACACQRBqJAAgAAsxAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDBBcIAEoAgwQFgsgAUEQaiQAC98EAQF/IwBBIGsiAiAANgIYIAIgATYCFAJAIAIoAhhFBEAgAkEBNgIcDAELIAIgAigCGCgCADYCDAJAIAIoAhgoAggEQCACIAIoAhgoAgg2AhAMAQsgAkEBNgIQIAJBADYCCANAAkAgAigCCCACKAIYLwEETw0AAkAgAigCDCACKAIIai0AAEEfSgRAIAIoAgwgAigCCGotAABBgAFIDQELIAIoAgwgAigCCGotAABBDUYNACACKAIMIAIoAghqLQAAQQpGDQAgAigCDCACKAIIai0AAEEJRgRADAELIAJBAzYCEAJAIAIoAgwgAigCCGotAABB4AFxQcABRgRAIAJBATYCAAwBCwJAIAIoAgwgAigCCGotAABB8AFxQeABRgRAIAJBAjYCAAwBCwJAIAIoAgwgAigCCGotAABB+AFxQfABRgRAIAJBAzYCAAwBCyACQQQ2AhAMBAsLCyACKAIIIAIoAgBqIAIoAhgvAQRPBEAgAkEENgIQDAILIAJBATYCBANAIAIoAgQgAigCAE0EQCACKAIMIAIoAgggAigCBGpqLQAAQcABcUGAAUcEQCACQQQ2AhAMBgUgAiACKAIEQQFqNgIEDAILAAsLIAIgAigCACACKAIIajYCCAsgAiACKAIIQQFqNgIIDAELCwsgAigCGCACKAIQNgIIIAIoAhQEQAJAIAIoAhRBAkcNACACKAIQQQNHDQAgAkECNgIQIAIoAhhBAjYCCAsCQCACKAIUIAIoAhBGDQAgAigCEEEBRg0AIAJBBTYCHAwCCwsgAiACKAIQNgIcCyACKAIcC2oBAX8jAEEQayIBIAA2AgwgASgCDEIANwMAIAEoAgxBADYCCCABKAIMQn83AxAgASgCDEEANgIsIAEoAgxBfzYCKCABKAIMQgA3AxggASgCDEIANwMgIAEoAgxBADsBMCABKAIMQQA7ATILPwEBfyMAQRBrIgMkACADIAA2AgwgAyABNgIIIAMgAjYCBCADKAIMIAMoAgggAygCBBDsAiEAIANBEGokACAAC1UBAn9BoKEBKAIAIgEgAEEDakF8cSICaiEAAkAgAkEBTkEAIAAgAU0bDQAgAD8AQRB0SwRAIAAQFEUNAQtBoKEBIAA2AgAgAQ8LQbScAUEwNgIAQX8LqgIBAX8jAEEQayIBJAAgASAANgIMIAEoAgwEQCABKAIMKAIABEAgASgCDCgCABAyGiABKAIMKAIAEBwLIAEoAgwoAhwQFiABKAIMKAIgECYgASgCDCgCJBAmIAEoAgwoAlAQgQMgASgCDCgCQARAIAFCADcDAANAIAEpAwAgASgCDCkDMFpFBEAgASgCDCgCQCABKQMAp0EEdGoQYiABIAEpAwBCAXw3AwAMAQsLIAEoAgwoAkAQFgsgAUIANwMAA0AgASkDACABKAIMKAJErVpFBEAgASgCDCgCTCABKQMAp0ECdGooAgAQhAMgASABKQMAQgF8NwMADAELCyABKAIMKAJMEBYgASgCDCgCVBD7AiABKAIMQQhqEDggASgCDBAWCyABQRBqJAALbwEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCECADIAMoAhggAygCEK0QHzYCDAJAIAMoAgxFBEAgA0F/NgIcDAELIAMoAgwgAygCFCADKAIQEBoaIANBADYCHAsgAygCHBogA0EgaiQAC6IBAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE3AxAgBCACNgIMIAQgAzYCCCAEIAQoAgwgBCkDEBAqIgA2AgQCQCAARQRAIAQoAghBDkEAEBUgBEEANgIcDAELIAQoAhggBCgCBCgCBCAEKQMQIAQoAggQYUEASARAIAQoAgQQFyAEQQA2AhwMAQsgBCAEKAIENgIcCyAEKAIcIQAgBEEgaiQAIAALgwECA38BfgJAIABCgICAgBBUBEAgACEFDAELA0AgAUF/aiIBIAAgAEIKgCIFQgp+fadBMHI6AAAgAEL/////nwFWIQIgBSEAIAINAAsLIAWnIgIEQANAIAFBf2oiASACIAJBCm4iA0EKbGtBMHI6AAAgAkEJSyEEIAMhAiAEDQALCyABC6ABAQF/IwBBIGsiAyQAIAMgADYCFCADIAE2AhAgAyACNwMIIAMgAygCEDYCBAJAIAMpAwhCCFQEQCADQn83AxgMAQsjAEEQayIAIAMoAhQ2AgwgACgCDCgCACEAIAMoAgQgADYCACMAQRBrIgAgAygCFDYCDCAAKAIMKAIEIQAgAygCBCAANgIEIANCCDcDGAsgAykDGCECIANBIGokACACCz8BAX8jAEEQayICIAA2AgwgAiABNgIIIAIoAgwEQCACKAIMIAIoAggoAgA2AgAgAigCDCACKAIIKAIENgIECwu8AgEBfyMAQSBrIgQkACAEIAA2AhggBCABNwMQIAQgAjYCDCAEIAM2AgggBCgCCEUEQCAEIAQoAhhBCGo2AggLAkAgBCkDECAEKAIYKQMwWgRAIAQoAghBEkEAEBUgBEEANgIcDAELAkAgBCgCDEEIcUUEQCAEKAIYKAJAIAQpAxCnQQR0aigCBA0BCyAEKAIYKAJAIAQpAxCnQQR0aigCAEUEQCAEKAIIQRJBABAVIARBADYCHAwCCwJAIAQoAhgoAkAgBCkDEKdBBHRqLQAMQQFxRQ0AIAQoAgxBCHENACAEKAIIQRdBABAVIARBADYCHAwCCyAEIAQoAhgoAkAgBCkDEKdBBHRqKAIANgIcDAELIAQgBCgCGCgCQCAEKQMQp0EEdGooAgQ2AhwLIAQoAhwhACAEQSBqJAAgAAuEAQEBfyMAQRBrIgEkACABIAA2AgggAUHYABAZIgA2AgQCQCAARQRAIAFBADYCDAwBCwJAIAEoAggEQCABKAIEIAEoAghB2AAQGhoMAQsgASgCBBBdCyABKAIEQQA2AgAgASgCBEEBOgAFIAEgASgCBDYCDAsgASgCDCEAIAFBEGokACAAC9QCAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE2AhQgBCACNgIQIAQgAzYCDAJAIAQoAhhFBEAgBCgCFARAIAQoAhRBADYCAAsgBEGw0wA2AhwMAQsgBCgCEEHAAHFFBEAgBCgCGCgCCEUEQCAEKAIYQQAQOxoLAkACQAJAIAQoAhBBgAFxRQ0AIAQoAhgoAghBAUYNACAEKAIYKAIIQQJHDQELIAQoAhgoAghBBEcNAQsgBCgCGCgCDEUEQCAEKAIYKAIAIAQoAhgvAQQgBCgCGEEQaiAEKAIMENIBIQAgBCgCGCAANgIMIABFBEAgBEEANgIcDAQLCyAEKAIUBEAgBCgCFCAEKAIYKAIQNgIACyAEIAQoAhgoAgw2AhwMAgsLIAQoAhQEQCAEKAIUIAQoAhgvAQQ2AgALIAQgBCgCGCgCADYCHAsgBCgCHCEAIARBIGokACAACzkBAX8jAEEQayIBIAA2AgxBACEAIAEoAgwtAABBAXEEfyABKAIMKQMQIAEoAgwpAwhRBUEAC0EBcQvyAgEBfyMAQRBrIgEkACABIAA2AggCQCABKAIILQAoQQFxBEAgAUF/NgIMDAELIAEoAggoAiRBA0YEQCABKAIIQQxqQRdBABAVIAFBfzYCDAwBCwJAIAEoAggoAiBBAEsEQAJ/IwBBEGsiACABKAIINgIMIAAoAgwpAxhCwACDUAsEQCABKAIIQQxqQR1BABAVIAFBfzYCDAwDCwwBCyABKAIIKAIABEAgASgCCCgCABBJQQBIBEAgASgCCEEMaiABKAIIKAIAEBggAUF/NgIMDAMLCyABKAIIQQBCAEEAECJCAFMEQCABKAIIKAIABEAgASgCCCgCABAyGgsgAUF/NgIMDAILCyABKAIIQQA6ADQgASgCCEEAOgA1IwBBEGsiACABKAIIQQxqNgIMIAAoAgwEQCAAKAIMQQA2AgAgACgCDEEANgIECyABKAIIIgAgACgCIEEBajYCICABQQA2AgwLIAEoAgwhACABQRBqJAAgAAt3AgF/AX4jAEEQayIBJAAgASAANgIEAkAgASgCBC0AKEEBcQRAIAFCfzcDCAwBCyABKAIEKAIgQQBNBEAgASgCBEEMakESQQAQFSABQn83AwgMAQsgASABKAIEQQBCAEEHECI3AwgLIAEpAwghAiABQRBqJAAgAgudAQEBfyMAQRBrIgEgADYCCAJAAkACQCABKAIIRQ0AIAEoAggoAiBFDQAgASgCCCgCJA0BCyABQQE2AgwMAQsgASABKAIIKAIcNgIEAkACQCABKAIERQ0AIAEoAgQoAgAgASgCCEcNACABKAIEKAIEQbT+AEkNACABKAIEKAIEQdP+AE0NAQsgAUEBNgIMDAELIAFBADYCDAsgASgCDAuAAQEDfyMAQRBrIgIgADYCDCACIAE2AgggAigCCEEIdiEBIAIoAgwoAgghAyACKAIMIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAIAIoAghB/wFxIQEgAigCDCgCCCEDIAIoAgwiAigCFCEAIAIgAEEBajYCFCAAIANqIAE6AAALmwUBAX8jAEFAaiIEJAAgBCAANgI4IAQgATcDMCAEIAI2AiwgBCADNgIoIARByAAQGSIANgIkAkAgAEUEQCAEQQA2AjwMAQsgBCgCJEIANwM4IAQoAiRCADcDGCAEKAIkQgA3AzAgBCgCJEEANgIAIAQoAiRBADYCBCAEKAIkQgA3AwggBCgCJEIANwMQIAQoAiRBADYCKCAEKAIkQgA3AyACQCAEKQMwUARAQQgQGSEAIAQoAiQgADYCBCAARQRAIAQoAiQQFiAEKAIoQQ5BABAVIARBADYCPAwDCyAEKAIkKAIEQgA3AwAMAQsgBCgCJCAEKQMwQQAQvQFBAXFFBEAgBCgCKEEOQQAQFSAEKAIkEDQgBEEANgI8DAILIARCADcDCCAEQgA3AxggBEIANwMQA0AgBCkDGCAEKQMwVARAIAQoAjggBCkDGKdBBHRqKQMIUEUEQCAEKAI4IAQpAxinQQR0aigCAEUEQCAEKAIoQRJBABAVIAQoAiQQNCAEQQA2AjwMBQsgBCgCJCgCACAEKQMQp0EEdGogBCgCOCAEKQMYp0EEdGooAgA2AgAgBCgCJCgCACAEKQMQp0EEdGogBCgCOCAEKQMYp0EEdGopAwg3AwggBCgCJCgCBCAEKQMYp0EDdGogBCkDCDcDACAEIAQoAjggBCkDGKdBBHRqKQMIIAQpAwh8NwMIIAQgBCkDEEIBfDcDEAsgBCAEKQMYQgF8NwMYDAELCyAEKAIkIAQpAxA3AwggBCgCJAJ+QgAgBCgCLA0AGiAEKAIkKQMICzcDGCAEKAIkKAIEIAQoAiQpAwinQQN0aiAEKQMINwMAIAQoAiQgBCkDCDcDMAsgBCAEKAIkNgI8CyAEKAI8IQAgBEFAayQAIAALngEBAX8jAEEgayIEJAAgBCAANgIYIAQgATcDECAEIAI2AgwgBCADNgIIIAQgBCgCGCAEKQMQIAQoAgwgBCgCCBBFIgA2AgQCQCAARQRAIARBADYCHAwBCyAEIAQoAgQoAjBBACAEKAIMIAQoAggQRyIANgIAIABFBEAgBEEANgIcDAELIAQgBCgCADYCHAsgBCgCHCEAIARBIGokACAAC4IBAQJ/IABFBEAgARAZDwsgAUFATwRAQbScAUEwNgIAQQAPCyAAQXhqQRAgAUELakF4cSABQQtJGxD6AiICBEAgAkEIag8LIAEQGSICRQRAQQAPCyACIABBfEF4IABBfGooAgAiA0EDcRsgA0F4cWoiAyABIAMgAUkbEBoaIAAQFiACC9oBAQF/IwBBIGsiBCQAIAQgADsBGiAEIAE7ARggBCACNgIUIAQgAzYCECAEQRAQGSIANgIMAkAgAEUEQCAEQQA2AhwMAQsgBCgCDEEANgIAIAQoAgwgBCgCEDYCBCAEKAIMIAQvARo7AQggBCgCDCAELwEYOwEKAkAgBC8BGEEASgRAIAQoAhQgBC8BGBDJASEAIAQoAgwgADYCDCAARQRAIAQoAgwQFiAEQQA2AhwMAwsMAQsgBCgCDEEANgIMCyAEIAQoAgw2AhwLIAQoAhwhACAEQSBqJAAgAAuMAwEBfyMAQSBrIgQkACAEIAA2AhggBCABOwEWIAQgAjYCECAEIAM2AgwCQCAELwEWRQRAIARBADYCHAwBCwJAAkACQAJAIAQoAhBBgDBxIgAEQCAAQYAQRg0BIABBgCBGDQIMAwsgBEEANgIEDAMLIARBAjYCBAwCCyAEQQQ2AgQMAQsgBCgCDEESQQAQFSAEQQA2AhwMAQsgBEEUEBkiADYCCCAARQRAIAQoAgxBDkEAEBUgBEEANgIcDAELIAQvARZBAWoQGSEAIAQoAgggADYCACAARQRAIAQoAggQFiAEQQA2AhwMAQsgBCgCCCgCACAEKAIYIAQvARYQGhogBCgCCCgCACAELwEWakEAOgAAIAQoAgggBC8BFjsBBCAEKAIIQQA2AgggBCgCCEEANgIMIAQoAghBADYCECAEKAIEBEAgBCgCCCAEKAIEEDtBBUYEQCAEKAIIECYgBCgCDEESQQAQFSAEQQA2AhwMAgsLIAQgBCgCCDYCHAsgBCgCHCEAIARBIGokACAACzcBAX8jAEEQayIBIAA2AggCQCABKAIIRQRAIAFBADsBDgwBCyABIAEoAggvAQQ7AQ4LIAEvAQ4LQwEDfwJAIAJFDQADQCAALQAAIgQgAS0AACIFRgRAIAFBAWohASAAQQFqIQAgAkF/aiICDQEMAgsLIAQgBWshAwsgAwuWAQEFfyAAKAJMQQBOBEBBASEDCyAAKAIAQQFxIgRFBEAgACgCNCIBBEAgASAAKAI4NgI4CyAAKAI4IgIEQCACIAE2AjQLIABBgKEBKAIARgRAQYChASACNgIACwsgABCdASEBIAAgACgCDBEAACECIAAoAmAiBQRAIAUQFgsCQCAERQRAIAAQFgwBCyADRQ0ACyABIAJyC44DAgF/AX4jAEEwayIEJAAgBCAANgIkIAQgATYCICAEIAI2AhwgBCADNgIYAkAgBCgCJEUEQCAEQn83AygMAQsgBCgCIEUEQCAEKAIYQRJBABAVIARCfzcDKAwBCyAEKAIcQYMgcQRAIARBGEEZIAQoAhxBAXEbNgIUIARCADcDAANAIAQpAwAgBCgCJCkDMFQEQCAEIAQoAiQgBCkDACAEKAIcIAQoAhgQTjYCECAEKAIQBEAgBCgCHEECcQRAIAQgBCgCECIAIAAQLEEBahChAjYCDCAEKAIMBEAgBCAEKAIMQQFqNgIQCwsgBCgCICAEKAIQIAQoAhQRAgBFBEAjAEEQayIAIAQoAhg2AgwgACgCDARAIAAoAgxBADYCACAAKAIMQQA2AgQLIAQgBCkDADcDKAwFCwsgBCAEKQMAQgF8NwMADAELCyAEKAIYQQlBABAVIARCfzcDKAwBCyAEIAQoAiQoAlAgBCgCICAEKAIcIAQoAhgQ/wI3AygLIAQpAyghBSAEQTBqJAAgBQvQBwEBfyMAQSBrIgEkACABIAA2AhwgASABKAIcKAIsNgIQA0AgASABKAIcKAI8IAEoAhwoAnRrIAEoAhwoAmxrNgIUIAEoAhwoAmwgASgCECABKAIcKAIsQYYCa2pPBEAgASgCHCgCOCABKAIcKAI4IAEoAhBqIAEoAhAgASgCFGsQGhogASgCHCIAIAAoAnAgASgCEGs2AnAgASgCHCIAIAAoAmwgASgCEGs2AmwgASgCHCIAIAAoAlwgASgCEGs2AlwgASgCHBDdAiABIAEoAhAgASgCFGo2AhQLIAEoAhwoAgAoAgQEQCABIAEoAhwoAgAgASgCHCgCdCABKAIcKAI4IAEoAhwoAmxqaiABKAIUEHM2AhggASgCHCIAIAEoAhggACgCdGo2AnQgASgCHCgCdCABKAIcKAK0LWpBA08EQCABIAEoAhwoAmwgASgCHCgCtC1rNgIMIAEoAhwgASgCHCgCOCABKAIMai0AADYCSCABKAIcIAEoAhwoAlQgASgCHCgCOCABKAIMQQFqai0AACABKAIcKAJIIAEoAhwoAlh0c3E2AkgDQCABKAIcKAK0LQRAIAEoAhwgASgCHCgCVCABKAIcKAI4IAEoAgxBAmpqLQAAIAEoAhwoAkggASgCHCgCWHRzcTYCSCABKAIcKAJAIAEoAgwgASgCHCgCNHFBAXRqIAEoAhwoAkQgASgCHCgCSEEBdGovAQA7AQAgASgCHCgCRCABKAIcKAJIQQF0aiABKAIMOwEAIAEgASgCDEEBajYCDCABKAIcIgAgACgCtC1Bf2o2ArQtIAEoAhwoAnQgASgCHCgCtC1qQQNPDQELCwtBACEAIAEoAhwoAnRBhgJJBH8gASgCHCgCACgCBEEARwVBAAtBAXENAQsLIAEoAhwoAsAtIAEoAhwoAjxJBEAgASABKAIcKAJsIAEoAhwoAnRqNgIIAkAgASgCHCgCwC0gASgCCEkEQCABIAEoAhwoAjwgASgCCGs2AgQgASgCBEGCAksEQCABQYICNgIECyABKAIcKAI4IAEoAghqQQAgASgCBBAzIAEoAhwgASgCCCABKAIEajYCwC0MAQsgASgCHCgCwC0gASgCCEGCAmpJBEAgASABKAIIQYICaiABKAIcKALALWs2AgQgASgCBCABKAIcKAI8IAEoAhwoAsAta0sEQCABIAEoAhwoAjwgASgCHCgCwC1rNgIECyABKAIcKAI4IAEoAhwoAsAtakEAIAEoAgQQMyABKAIcIgAgASgCBCAAKALALWo2AsAtCwsLIAFBIGokAAuGBQEBfyMAQSBrIgQkACAEIAA2AhwgBCABNgIYIAQgAjYCFCAEIAM2AhAgBEEDNgIMAkAgBCgCHCgCvC1BECAEKAIMa0oEQCAEIAQoAhA2AgggBCgCHCIAIAAvAbgtIAQoAghB//8DcSAEKAIcKAK8LXRyOwG4LSAEKAIcLwG4LUH/AXEhASAEKAIcKAIIIQIgBCgCHCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAIcLwG4LUEIdSEBIAQoAhwoAgghAiAEKAIcIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAhwgBCgCCEH//wNxQRAgBCgCHCgCvC1rdTsBuC0gBCgCHCIAIAAoArwtIAQoAgxBEGtqNgK8LQwBCyAEKAIcIgAgAC8BuC0gBCgCEEH//wNxIAQoAhwoArwtdHI7AbgtIAQoAhwiACAEKAIMIAAoArwtajYCvC0LIAQoAhwQuAEgBCgCFEH/AXEhASAEKAIcKAIIIQIgBCgCHCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAIUQf//A3FBCHUhASAEKAIcKAIIIQIgBCgCHCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAIUQX9zQf8BcSEBIAQoAhwoAgghAiAEKAIcIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAhRBf3NB//8DcUEIdSEBIAQoAhwoAgghAiAEKAIcIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAhwoAgggBCgCHCgCFGogBCgCGCAEKAIUEBoaIAQoAhwiACAEKAIUIAAoAhRqNgIUIARBIGokAAv5AQEBfyMAQSBrIgIkACACIAA2AhwgAiABOQMQAkAgAigCHEUNACACAnwCfCACKwMQRAAAAAAAAAAAZARAIAIrAxAMAQtEAAAAAAAAAAALRAAAAAAAAPA/YwRAAnwgAisDEEQAAAAAAAAAAGQEQCACKwMQDAELRAAAAAAAAAAACwwBC0QAAAAAAADwPwsgAigCHCsDKCACKAIcKwMgoaIgAigCHCsDIKA5AwggAisDCCACKAIcKwMYoSACKAIcKwMQZEUNACACKAIcKAIAIAIrAwggAigCHCgCDCACKAIcKAIEERsAIAIoAhwgAisDCDkDGAsgAkEgaiQAC9QDAQF/IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNgIQAkACQCADKAIYBEAgAygCFA0BCyADKAIQQRJBABAVIANBADoAHwwBCyADKAIYKQMIQgBWBEAgAyADKAIUEHs2AgwgAyADKAIMIAMoAhgoAgBwNgIIIANBADYCACADIAMoAhgoAhAgAygCCEECdGooAgA2AgQDQCADKAIEBEACQCADKAIEKAIcIAMoAgxHDQAgAygCFCADKAIEKAIAEFsNAAJAIAMoAgQpAwhCf1EEQAJAIAMoAgAEQCADKAIAIAMoAgQoAhg2AhgMAQsgAygCGCgCECADKAIIQQJ0aiADKAIEKAIYNgIACyADKAIEEBYgAygCGCIAIAApAwhCf3w3AwgCQCADKAIYIgApAwi6IAAoAgC4RHsUrkfheoQ/omNFDQAgAygCGCgCAEGAAk0NACADKAIYIAMoAhgoAgBBAXYgAygCEBBaQQFxRQRAIANBADoAHwwICwsMAQsgAygCBEJ/NwMQCyADQQE6AB8MBAsgAyADKAIENgIAIAMgAygCBCgCGDYCBAwBCwsLIAMoAhBBCUEAEBUgA0EAOgAfCyADLQAfQQFxIQAgA0EgaiQAIAAL3wIBAX8jAEEwayIDJAAgAyAANgIoIAMgATYCJCADIAI2AiACQCADKAIkIAMoAigoAgBGBEAgA0EBOgAvDAELIAMgAygCJEEEEH0iADYCHCAARQRAIAMoAiBBDkEAEBUgA0EAOgAvDAELIAMoAigpAwhCAFYEQCADQQA2AhgDQCADKAIYIAMoAigoAgBPRQRAIAMgAygCKCgCECADKAIYQQJ0aigCADYCFANAIAMoAhQEQCADIAMoAhQoAhg2AhAgAyADKAIUKAIcIAMoAiRwNgIMIAMoAhQgAygCHCADKAIMQQJ0aigCADYCGCADKAIcIAMoAgxBAnRqIAMoAhQ2AgAgAyADKAIQNgIUDAELCyADIAMoAhhBAWo2AhgMAQsLCyADKAIoKAIQEBYgAygCKCADKAIcNgIQIAMoAiggAygCJDYCACADQQE6AC8LIAMtAC9BAXEhACADQTBqJAAgAAtNAQJ/IAEtAAAhAgJAIAAtAAAiA0UNACACIANHDQADQCABLQABIQIgAC0AASIDRQ0BIAFBAWohASAAQQFqIQAgAiADRg0ACwsgAyACawuJAgEBfyMAQRBrIgEkACABIAA2AgwCQCABKAIMLQAFQQFxBEAgASgCDCgCAEECcUUNAQsgASgCDCgCMBAmIAEoAgxBADYCMAsCQCABKAIMLQAFQQFxBEAgASgCDCgCAEEIcUUNAQsgASgCDCgCNBAkIAEoAgxBADYCNAsCQCABKAIMLQAFQQFxBEAgASgCDCgCAEEEcUUNAQsgASgCDCgCOBAmIAEoAgxBADYCOAsCQCABKAIMLQAFQQFxBEAgASgCDCgCAEGAAXFFDQELIAEoAgwoAlQEQCABKAIMKAJUQQAgASgCDCgCVBAsEDMLIAEoAgwoAlQQFiABKAIMQQA2AlQLIAFBEGokAAvxAQEBfyMAQRBrIgEgADYCDCABKAIMQQA2AgAgASgCDEEAOgAEIAEoAgxBADoABSABKAIMQQE6AAYgASgCDEG/BjsBCCABKAIMQQo7AQogASgCDEEAOwEMIAEoAgxBfzYCECABKAIMQQA2AhQgASgCDEEANgIYIAEoAgxCADcDICABKAIMQgA3AyggASgCDEEANgIwIAEoAgxBADYCNCABKAIMQQA2AjggASgCDEEANgI8IAEoAgxBADsBQCABKAIMQYCA2I14NgJEIAEoAgxCADcDSCABKAIMQQA7AVAgASgCDEEAOwFSIAEoAgxBADYCVAvaEwEBfyMAQbABayIDJAAgAyAANgKoASADIAE2AqQBIAMgAjYCoAEgA0EANgKQASADIAMoAqQBKAIwQQAQOzYClAEgAyADKAKkASgCOEEAEDs2ApgBAkACQAJAAkAgAygClAFBAkYEQCADKAKYAUEBRg0BCyADKAKUAUEBRgRAIAMoApgBQQJGDQELIAMoApQBQQJHDQEgAygCmAFBAkcNAQsgAygCpAEiACAALwEMQYAQcjsBDAwBCyADKAKkASIAIAAvAQxB/+8DcTsBDCADKAKUAUECRgRAIANB9eABIAMoAqQBKAIwIAMoAqgBQQhqEMUBNgKQASADKAKQAUUEQCADQX82AqwBDAMLCwJAIAMoAqABQYACcQ0AIAMoApgBQQJHDQAgA0H1xgEgAygCpAEoAjggAygCqAFBCGoQxQE2AkggAygCSEUEQCADKAKQARAkIANBfzYCrAEMAwsgAygCSCADKAKQATYCACADIAMoAkg2ApABCwsCQCADKAKkAS8BUkUEQCADKAKkASIAIAAvAQxB/v8DcTsBDAwBCyADKAKkASIAIAAvAQxBAXI7AQwLIAMgAygCpAEgAygCoAEQgAFBAXE6AIYBIAMgAygCoAFBgApxQYAKRwR/IAMtAIYBBUEBC0EBcToAhwEgAwJ/QQEgAygCpAEvAVJBgQJGDQAaQQEgAygCpAEvAVJBggJGDQAaIAMoAqQBLwFSQYMCRgtBAXE6AIUBIAMtAIcBQQFxBEAgAyADQSBqQhwQKjYCHCADKAIcRQRAIAMoAqgBQQhqQQ5BABAVIAMoApABECQgA0F/NgKsAQwCCwJAIAMoAqABQYACcQRAAkAgAygCoAFBgAhxDQAgAygCpAEpAyBC/////w9WDQAgAygCpAEpAyhC/////w9YDQILIAMoAhwgAygCpAEpAygQLiADKAIcIAMoAqQBKQMgEC4MAQsCQAJAIAMoAqABQYAIcQ0AIAMoAqQBKQMgQv////8PVg0AIAMoAqQBKQMoQv////8PVg0AIAMoAqQBKQNIQv////8PWA0BCyADKAKkASkDKEL/////D1oEQCADKAIcIAMoAqQBKQMoEC4LIAMoAqQBKQMgQv////8PWgRAIAMoAhwgAygCpAEpAyAQLgsgAygCpAEpA0hC/////w9aBEAgAygCHCADKAKkASkDSBAuCwsLAn8jAEEQayIAIAMoAhw2AgwgACgCDC0AAEEBcUULBEAgAygCqAFBCGpBFEEAEBUgAygCHBAXIAMoApABECQgA0F/NgKsAQwCCyADQQECfyMAQRBrIgAgAygCHDYCDAJ+IAAoAgwtAABBAXEEQCAAKAIMKQMQDAELQgALp0H//wNxCyADQSBqQYAGEFA2AowBIAMoAhwQFyADKAKMASADKAKQATYCACADIAMoAowBNgKQAQsgAy0AhQFBAXEEQCADIANBFWpCBxAqNgIQIAMoAhBFBEAgAygCqAFBCGpBDkEAEBUgAygCkAEQJCADQX82AqwBDAILIAMoAhBBAhAgIAMoAhBBz9MAQQIQQCADKAIQIAMoAqQBLwFSQf8BcRCMASADKAIQIAMoAqQBKAIQQf//A3EQIAJ/IwBBEGsiACADKAIQNgIMIAAoAgwtAABBAXFFCwRAIAMoAqgBQQhqQRRBABAVIAMoAhAQFyADKAKQARAkIANBfzYCrAEMAgsgA0GBsgJBByADQRVqQYAGEFA2AgwgAygCEBAXIAMoAgwgAygCkAE2AgAgAyADKAIMNgKQAQsgAyADQdAAakIuECoiADYCTCAARQRAIAMoAqgBQQhqQQ5BABAVIAMoApABECQgA0F/NgKsAQwBCyADKAJMQcXTAEHK0wAgAygCoAFBgAJxG0EEEEAgAygCoAFBgAJxRQRAIAMoAkwCf0EtIAMtAIYBQQFxDQAaIAMoAqQBLwEIC0H//wNxECALIAMoAkwCf0EtIAMtAIYBQQFxDQAaIAMoAqQBLwEKC0H//wNxECAgAygCTCADKAKkAS8BDBAgAkAgAy0AhQFBAXEEQCADKAJMQeMAECAMAQsgAygCTCADKAKkASgCEEH//wNxECALIAMoAqQBKAIUIANBngFqIANBnAFqEMQBIAMoAkwgAy8BngEQICADKAJMIAMvAZwBECACQAJAIAMtAIUBQQFxRQ0AIAMoAqQBKQMoQhRaDQAgAygCTEEAECEMAQsgAygCTCADKAKkASgCGBAhCwJAAkAgAygCoAFBgAJxQYACRw0AIAMoAqQBKQMgQv////8PVARAIAMoAqQBKQMoQv////8PVA0BCyADKAJMQX8QISADKAJMQX8QIQwBCwJAIAMoAqQBKQMgQv////8PVARAIAMoAkwgAygCpAEpAyCnECEMAQsgAygCTEF/ECELAkAgAygCpAEpAyhC/////w9UBEAgAygCTCADKAKkASkDKKcQIQwBCyADKAJMQX8QIQsLIAMoAkwgAygCpAEoAjAQUkH//wNxECAgAyADKAKkASgCNCADKAKgARCEAUH//wNxIAMoApABQYAGEIQBQf//A3FqNgKIASADKAJMIAMoAogBQf//A3EQICADKAKgAUGAAnFFBEAgAygCTCADKAKkASgCOBBSQf//A3EQICADKAJMIAMoAqQBKAI8Qf//A3EQICADKAJMIAMoAqQBLwFAECAgAygCTCADKAKkASgCRBAhAkAgAygCpAEpA0hC/////w9UBEAgAygCTCADKAKkASkDSKcQIQwBCyADKAJMQX8QIQsLAn8jAEEQayIAIAMoAkw2AgwgACgCDC0AAEEBcUULBEAgAygCqAFBCGpBFEEAEBUgAygCTBAXIAMoApABECQgA0F/NgKsAQwBCyADKAKoASADQdAAagJ+IwBBEGsiACADKAJMNgIMAn4gACgCDC0AAEEBcQRAIAAoAgwpAxAMAQtCAAsLEDZBAEgEQCADKAJMEBcgAygCkAEQJCADQX82AqwBDAELIAMoAkwQFyADKAKkASgCMARAIAMoAqgBIAMoAqQBKAIwEIgBQQBIBEAgAygCkAEQJCADQX82AqwBDAILCyADKAKQAQRAIAMoAqgBIAMoApABQYAGEIMBQQBIBEAgAygCkAEQJCADQX82AqwBDAILCyADKAKQARAkIAMoAqQBKAI0BEAgAygCqAEgAygCpAEoAjQgAygCoAEQgwFBAEgEQCADQX82AqwBDAILCyADKAKgAUGAAnFFBEAgAygCpAEoAjgEQCADKAKoASADKAKkASgCOBCIAUEASARAIANBfzYCrAEMAwsLCyADIAMtAIcBQQFxNgKsAQsgAygCrAEhACADQbABaiQAIAALggIBAX8jAEEgayIFJAAgBSAANgIYIAUgATYCFCAFIAI7ARIgBUEAOwEQIAUgAzYCDCAFIAQ2AgggBUEANgIEAkADQCAFKAIYBEACQCAFKAIYLwEIIAUvARJHDQAgBSgCGCgCBCAFKAIMcUGABnFFDQAgBSgCBCAFLwEQSARAIAUgBSgCBEEBajYCBAwBCyAFKAIUBEAgBSgCFCAFKAIYLwEKOwEACyAFKAIYLwEKQQBKBEAgBSAFKAIYKAIMNgIcDAQLIAVBsdMANgIcDAMLIAUgBSgCGCgCADYCGAwBCwsgBSgCCEEJQQAQFSAFQQA2AhwLIAUoAhwhACAFQSBqJAAgAAuEAwEBfyMAQTBrIgUkACAFIAA2AiggBSABNgIkIAUgAjYCICAFIAM6AB8gBSAENgIYAkACQCAFKAIgDQAgBS0AH0EBcQ0AIAVBADYCLAwBCyAFIAUoAiBBAUEAIAUtAB9BAXEbahAZNgIUIAUoAhRFBEAgBSgCGEEOQQAQFSAFQQA2AiwMAQsCQCAFKAIoBEAgBSAFKAIoIAUoAiCtEB82AhAgBSgCEEUEQCAFKAIYQQ5BABAVIAUoAhQQFiAFQQA2AiwMAwsgBSgCFCAFKAIQIAUoAiAQGhoMAQsgBSgCJCAFKAIUIAUoAiCtIAUoAhgQYUEASARAIAUoAhQQFiAFQQA2AiwMAgsLIAUtAB9BAXEEQCAFKAIUIAUoAiBqQQA6AAAgBSAFKAIUNgIMA0AgBSgCDCAFKAIUIAUoAiBqSQRAIAUoAgwtAABFBEAgBSgCDEEgOgAACyAFIAUoAgxBAWo2AgwMAQsLCyAFIAUoAhQ2AiwLIAUoAiwhACAFQTBqJAAgAAvCAQEBfyMAQTBrIgQkACAEIAA2AiggBCABNgIkIAQgAjcDGCAEIAM2AhQCQCAEKQMYQv///////////wBWBEAgBCgCFEEUQQAQFSAEQX82AiwMAQsgBCAEKAIoIAQoAiQgBCkDGBAvIgI3AwggAkIAUwRAIAQoAhQgBCgCKBAYIARBfzYCLAwBCyAEKQMIIAQpAxhTBEAgBCgCFEERQQAQFSAEQX82AiwMAQsgBEEANgIsCyAEKAIsIQAgBEEwaiQAIAALNgEBfyMAQRBrIgEkACABIAA2AgwgASgCDBBjIAEoAgwoAgAQOiABKAIMKAIEEDogAUEQaiQAC6sBAQF/IwBBEGsiASQAIAEgADYCDCABKAIMKAIIBEAgASgCDCgCCBAcIAEoAgxBADYCCAsCQCABKAIMKAIERQ0AIAEoAgwoAgQoAgBBAXFFDQAgASgCDCgCBCgCEEF+Rw0AIAEoAgwoAgQiACAAKAIAQX5xNgIAIAEoAgwoAgQoAgBFBEAgASgCDCgCBBA6IAEoAgxBADYCBAsLIAEoAgxBADoADCABQRBqJAALbQEBfyMAQSBrIgQkACAEIAA2AhggBCABNgIUIAQgAjYCECAEIAM2AgwCQCAEKAIYRQRAIARBADYCHAwBCyAEIAQoAhQgBCgCECAEKAIMIAQoAhhBCGoQkAE2AhwLIAQoAhwhACAEQSBqJAAgAAuBBgIBfwF+IwBBkAFrIgMkACADIAA2AoQBIAMgATYCgAEgAyACNgJ8IAMQXQJAIAMoAoABKQMIQgBSBEAgAyADKAKAASgCACgCACkDSDcDYCADIAMoAoABKAIAKAIAKQNINwNoDAELIANCADcDYCADQgA3A2gLIANCADcDcAJAA0AgAykDcCADKAKAASkDCFQEQCADKAKAASgCACADKQNwp0EEdGooAgApA0ggAykDaFQEQCADIAMoAoABKAIAIAMpA3CnQQR0aigCACkDSDcDaAsgAykDaCADKAKAASkDIFYEQCADKAJ8QRNBABAVIANCfzcDiAEMAwsgAyADKAKAASgCACADKQNwp0EEdGooAgApA0ggAygCgAEoAgAgAykDcKdBBHRqKAIAKQMgfCADKAKAASgCACADKQNwp0EEdGooAgAoAjAQUkH//wNxrXxCHnw3A1ggAykDWCADKQNgVgRAIAMgAykDWDcDYAsgAykDYCADKAKAASkDIFYEQCADKAJ8QRNBABAVIANCfzcDiAEMAwsgAygChAEoAgAgAygCgAEoAgAgAykDcKdBBHRqKAIAKQNIQQAQKEEASARAIAMoAnwgAygChAEoAgAQGCADQn83A4gBDAMLIAMgAygChAEoAgBBAEEBIAMoAnwQwwFCf1EEQCADEFwgA0J/NwOIAQwDCyADKAKAASgCACADKQNwp0EEdGooAgAgAxDxAQRAIAMoAnxBFUEAEBUgAxBcIANCfzcDiAEMAwUgAygCgAEoAgAgAykDcKdBBHRqKAIAKAI0IAMoAjQQhwEhACADKAKAASgCACADKQNwp0EEdGooAgAgADYCNCADKAKAASgCACADKQNwp0EEdGooAgBBAToABCADQQA2AjQgAxBcIAMgAykDcEIBfDcDcAwCCwALCyADAn4gAykDYCADKQNofUL///////////8AVARAIAMpA2AgAykDaH0MAQtC////////////AAs3A4gBCyADKQOIASEEIANBkAFqJAAgBAumAQEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCECADIAMoAhAQ+gEiADYCDAJAIABFBEAgA0EANgIcDAELIAMoAgwgAygCGDYCACADKAIMIAMoAhQ2AgQgAygCFEEQcQRAIAMoAgwiACAAKAIUQQJyNgIUIAMoAgwiACAAKAIYQQJyNgIYCyADIAMoAgw2AhwLIAMoAhwhACADQSBqJAAgAAvVAQEBfyMAQSBrIgQkACAEIAA2AhggBCABNwMQIAQgAjYCDCAEIAM2AggCQAJAIAQpAxBC////////////AFcEQCAEKQMQQoCAgICAgICAgH9ZDQELIAQoAghBBEE9EBUgBEF/NgIcDAELAn8gBCkDECEBIAQoAgwhACAEKAIYIgIoAkxBf0wEQCACIAEgABCXAQwBCyACIAEgABCXAQtBAEgEQCAEKAIIQQRBtJwBKAIAEBUgBEF/NgIcDAELIARBADYCHAsgBCgCHCEAIARBIGokACAACycAAn9BAEEAIAAQBSIAIABBG0YbIgBFDQAaQbScASAANgIAQQALGgteAQF/IwBBEGsiAyQAIAMgAUHAgIACcQR/IAMgAkEEajYCDCACKAIABUEACzYCACAAIAFBgIACciADEBEiAEGBYE8EQEG0nAFBACAAazYCAEF/IQALIANBEGokACAACzMBAX8CfyAAEAYiAUFhRgRAIAAQEiEBCyABQYFgTwsEf0G0nAFBACABazYCAEF/BSABCwtpAQJ/AkAgACgCFCAAKAIcTQ0AIABBAEEAIAAoAiQRAQAaIAAoAhQNAEF/DwsgACgCBCIBIAAoAggiAkkEQCAAIAEgAmusQQEgACgCKBEQABoLIABBADYCHCAAQgA3AxAgAEIANwIEQQALpgEBAX8jAEEQayICJAAgAiAANgIIIAIgATYCBAJAIAIoAggtAChBAXEEQCACQX82AgwMAQsgAigCCCgCAARAIAIoAggoAgAgAigCBBBsQQBIBEAgAigCCEEMaiACKAIIKAIAEBggAkF/NgIMDAILCyACKAIIIAJBBGpCBEETECJCAFMEQCACQX82AgwMAQsgAkEANgIMCyACKAIMIQAgAkEQaiQAIAALVQEBfyMAQRBrIgEkACABIAA2AgwCQAJAIAEoAgwoAiRBAUYNACABKAIMKAIkQQJGDQAMAQsgASgCDEEAQgBBChAiGiABKAIMQQA2AiQLIAFBEGokAAtIAgF/AX4jAEEQayIDJAAgAyAANgIMIAMgATYCCCADIAI2AgQgAygCDCADKAIIIAMoAgQgAygCDEEIahBVIQQgA0EQaiQAIAQLJAEBfyMAQRBrIgMkACADIAI2AgwgACABIAIQpwIgA0EQaiQAC8gRAg9/AX4jAEHQAGsiBSQAIAUgATYCTCAFQTdqIRMgBUE4aiEQQQAhAQJAAkADQAJAIA5BAEgNACABQf////8HIA5rSgRAQbScAUE9NgIAQX8hDgwBCyABIA5qIQ4LIAUoAkwiCiEBAkACQCAKLQAAIgYEQANAAkACQCAGQf8BcSIHRQRAIAEhBgwBCyAHQSVHDQEgASEGA0AgAS0AAUElRw0BIAUgAUECaiIHNgJMIAZBAWohBiABLQACIQkgByEBIAlBJUYNAAsLIAYgCmshASAABEAgACAKIAEQIwsgAQ0FQX8hD0EBIQYgBSgCTCEBAkAgBSgCTCwAAUFQakEKTw0AIAEtAAJBJEcNACABLAABQVBqIQ9BASESQQMhBgsgBSABIAZqIgE2AkxBACEGAkAgASwAACIRQWBqIglBH0sEQCABIQcMAQsgASEHQQEgCXQiDEGJ0QRxRQ0AA0AgBSABQQFqIgc2AkwgBiAMciEGIAEsAAEiEUFgaiIJQR9LDQEgByEBQQEgCXQiDEGJ0QRxDQALCwJAIBFBKkYEQCAFAn8CQCAHLAABQVBqQQpPDQAgBSgCTCIBLQACQSRHDQAgASwAAUECdCAEakHAfmpBCjYCACABLAABQQN0IANqQYB9aigCACENQQEhEiABQQNqDAELIBINCUEAIRJBACENIAAEQCACIAIoAgAiAUEEajYCACABKAIAIQ0LIAUoAkxBAWoLIgE2AkwgDUF/Sg0BQQAgDWshDSAGQYDAAHIhBgwBCyAFQcwAahCkASINQQBIDQcgBSgCTCEBC0F/IQgCQCABLQAAQS5HDQAgAS0AAUEqRgRAAkAgASwAAkFQakEKTw0AIAUoAkwiAS0AA0EkRw0AIAEsAAJBAnQgBGpBwH5qQQo2AgAgASwAAkEDdCADakGAfWooAgAhCCAFIAFBBGoiATYCTAwCCyASDQggAAR/IAIgAigCACIBQQRqNgIAIAEoAgAFQQALIQggBSAFKAJMQQJqIgE2AkwMAQsgBSABQQFqNgJMIAVBzABqEKQBIQggBSgCTCEBC0EAIQcDQCAHIQxBfyELIAEsAABBv39qQTlLDQggBSABQQFqIhE2AkwgASwAACEHIBEhASAHIAxBOmxqQe+CAWotAAAiB0F/akEISQ0ACyAHRQ0HAkACQAJAIAdBE0YEQCAPQX9MDQEMCwsgD0EASA0BIAQgD0ECdGogBzYCACAFIAMgD0EDdGopAwA3A0ALQQAhASAARQ0HDAELIABFDQUgBUFAayAHIAIQowEgBSgCTCERCyAGQf//e3EiCSAGIAZBgMAAcRshBkEAIQtBl4MBIQ8gECEHAkACQAJAAn8CQAJAAkACQAJ/AkACQAJAAkACQAJAAkAgEUF/aiwAACIBQV9xIAEgAUEPcUEDRhsgASAMGyIBQah/ag4hBBMTExMTExMTDhMPBg4ODhMGExMTEwIFAxMTCRMBExMEAAsCQCABQb9/ag4HDhMLEw4ODgALIAFB0wBGDQkMEgsgBSkDQCEUQZeDAQwFC0EAIQECQAJAAkACQAJAAkACQCAMQf8BcQ4IAAECAwQZBQYZCyAFKAJAIA42AgAMGAsgBSgCQCAONgIADBcLIAUoAkAgDqw3AwAMFgsgBSgCQCAOOwEADBULIAUoAkAgDjoAAAwUCyAFKAJAIA42AgAMEwsgBSgCQCAOrDcDAAwSCyAIQQggCEEISxshCCAGQQhyIQZB+AAhAQsgBSkDQCAQIAFBIHEQqwIhCiAGQQhxRQ0DIAUpA0BQDQMgAUEEdkGXgwFqIQ9BAiELDAMLIAUpA0AgEBCqAiEKIAZBCHFFDQIgCCAQIAprIgFBAWogCCABShshCAwCCyAFKQNAIhRCf1cEQCAFQgAgFH0iFDcDQEEBIQtBl4MBDAELIAZBgBBxBEBBASELQZiDAQwBC0GZgwFBl4MBIAZBAXEiCxsLIQ8gFCAQEEIhCgsgBkH//3txIAYgCEF/ShshBiAFKQNAIRQCQCAIDQAgFFBFDQBBACEIIBAhCgwLCyAIIBRQIBAgCmtqIgEgCCABShshCAwKCyAFKAJAIgFBoYMBIAEbIgpBACAIEKcBIgEgCCAKaiABGyEHIAkhBiABIAprIAggARshCAwJCyAIBEAgBSgCQAwCC0EAIQEgAEEgIA1BACAGECcMAgsgBUEANgIMIAUgBSkDQD4CCCAFIAVBCGo2AkBBfyEIIAVBCGoLIQdBACEBAkADQCAHKAIAIglFDQECQCAFQQRqIAkQpgEiCkEASCIJDQAgCiAIIAFrSw0AIAdBBGohByAIIAEgCmoiAUsNAQwCCwtBfyELIAkNCwsgAEEgIA0gASAGECcgAUUEQEEAIQEMAQtBACEMIAUoAkAhBwNAIAcoAgAiCUUNASAFQQRqIAkQpgEiCSAMaiIMIAFKDQEgACAFQQRqIAkQIyAHQQRqIQcgDCABSQ0ACwsgAEEgIA0gASAGQYDAAHMQJyANIAEgDSABShshAQwHCyAAIAUrA0AgDSAIIAYgAUEVER0AIQEMBgsgBSAFKQNAPAA3QQEhCCATIQogCSEGDAMLIAUgAUEBaiIHNgJMIAEtAAEhBiAHIQEMAAALAAsgDiELIAANBCASRQ0BQQEhAQNAIAQgAUECdGooAgAiAARAIAMgAUEDdGogACACEKMBQQEhCyABQQFqIgFBCkcNAQwGCwtBASELIAFBCUsNBEF/IQsgBCABQQJ0aigCAA0EA0AgASIAQQFqIgFBCkcEQCAEIAFBAnRqKAIARQ0BCwtBf0EBIABBCUkbIQsMBAsgAEEgIAsgByAKayIJIAggCCAJSBsiB2oiDCANIA0gDEgbIgEgDCAGECcgACAPIAsQIyAAQTAgASAMIAZBgIAEcxAnIABBMCAHIAlBABAnIAAgCiAJECMgAEEgIAEgDCAGQYDAAHMQJwwBCwtBACELDAELQX8hCwsgBUHQAGokACALC7cBAQR/AkAgAigCECIDBH8gAwUgAhCuAg0BIAIoAhALIAIoAhQiBWsgAUkEQCACIAAgASACKAIkEQEADwsCQCACLABLQQBIDQAgASEEA0AgBCIDRQ0BIAAgA0F/aiIEai0AAEEKRw0ACyACIAAgAyACKAIkEQEAIgQgA0kNASABIANrIQEgACADaiEAIAIoAhQhBSADIQYLIAUgACABEBoaIAIgAigCFCABajYCFCABIAZqIQQLIAQL0hEBAX8jAEGwAWsiBiQAIAYgADYCqAEgBiABNgKkASAGIAI2AqABIAYgAzYCnAEgBiAENgKYASAGIAU2ApQBIAZBADYCkAEDQCAGKAKQAUEPS0UEQCAGQSBqIAYoApABQQF0akEAOwEAIAYgBigCkAFBAWo2ApABDAELCyAGQQA2AowBA0AgBigCjAEgBigCoAFPRQRAIAZBIGogBigCpAEgBigCjAFBAXRqLwEAQQF0aiIAIAAvAQBBAWo7AQAgBiAGKAKMAUEBajYCjAEMAQsLIAYgBigCmAEoAgA2AoABIAZBDzYChAEDQAJAIAYoAoQBQQFJDQAgBkEgaiAGKAKEAUEBdGovAQANACAGIAYoAoQBQX9qNgKEAQwBCwsgBigCgAEgBigChAFLBEAgBiAGKAKEATYCgAELAkAgBigChAFFBEAgBkHAADoAWCAGQQE6AFkgBkEAOwFaIAYoApwBIgEoAgAhACABIABBBGo2AgAgACAGQdgAaiIBKAEANgEAIAYoApwBIgIoAgAhACACIABBBGo2AgAgACABKAEANgEAIAYoApgBQQE2AgAgBkEANgKsAQwBCyAGQQE2AogBA0ACQCAGKAKIASAGKAKEAU8NACAGQSBqIAYoAogBQQF0ai8BAA0AIAYgBigCiAFBAWo2AogBDAELCyAGKAKAASAGKAKIAUkEQCAGIAYoAogBNgKAAQsgBkEBNgJ0IAZBATYCkAEDQCAGKAKQAUEPTQRAIAYgBigCdEEBdDYCdCAGIAYoAnQgBkEgaiAGKAKQAUEBdGovAQBrNgJ0IAYoAnRBAEgEQCAGQX82AqwBDAMFIAYgBigCkAFBAWo2ApABDAILAAsLAkAgBigCdEEATA0AIAYoAqgBBEAgBigChAFBAUYNAQsgBkF/NgKsAQwBCyAGQQA7AQIgBkEBNgKQAQNAIAYoApABQQ9PRQRAIAYoApABQQFqQQF0IAZqIAYoApABQQF0IAZqLwEAIAZBIGogBigCkAFBAXRqLwEAajsBACAGIAYoApABQQFqNgKQAQwBCwsgBkEANgKMAQNAIAYoAowBIAYoAqABSQRAIAYoAqQBIAYoAowBQQF0ai8BAARAIAYoApQBIQEgBigCpAEgBigCjAEiAkEBdGovAQBBAXQgBmoiAy8BACEAIAMgAEEBajsBACAAQf//A3FBAXQgAWogAjsBAAsgBiAGKAKMAUEBajYCjAEMAQsLAkACQAJAAkAgBigCqAEOAgABAgsgBiAGKAKUASIANgJMIAYgADYCUCAGQRQ2AkgMAgsgBkGw6wA2AlAgBkHw6wA2AkwgBkGBAjYCSAwBCyAGQbDsADYCUCAGQfDsADYCTCAGQQA2AkgLIAZBADYCbCAGQQA2AowBIAYgBigCiAE2ApABIAYgBigCnAEoAgA2AlQgBiAGKAKAATYCfCAGQQA2AnggBkF/NgJgIAZBASAGKAKAAXQ2AnAgBiAGKAJwQQFrNgJcAkACQCAGKAKoAUEBRgRAIAYoAnBB1AZLDQELIAYoAqgBQQJHDQEgBigCcEHQBE0NAQsgBkEBNgKsAQwBCwNAIAYgBigCkAEgBigCeGs6AFkCQCAGKAKUASAGKAKMAUEBdGovAQBBAWogBigCSEkEQCAGQQA6AFggBiAGKAKUASAGKAKMAUEBdGovAQA7AVoMAQsCQCAGKAKUASAGKAKMAUEBdGovAQAgBigCSE8EQCAGIAYoAkwgBigClAEgBigCjAFBAXRqLwEAIAYoAkhrQQF0ai8BADoAWCAGIAYoAlAgBigClAEgBigCjAFBAXRqLwEAIAYoAkhrQQF0ai8BADsBWgwBCyAGQeAAOgBYIAZBADsBWgsLIAZBASAGKAKQASAGKAJ4a3Q2AmggBkEBIAYoAnx0NgJkIAYgBigCZDYCiAEDQCAGIAYoAmQgBigCaGs2AmQgBigCVCAGKAJkIAYoAmwgBigCeHZqQQJ0aiAGQdgAaigBADYBACAGKAJkDQALIAZBASAGKAKQAUEBa3Q2AmgDQCAGKAJsIAYoAmhxBEAgBiAGKAJoQQF2NgJoDAELCwJAIAYoAmgEQCAGIAYoAmwgBigCaEEBa3E2AmwgBiAGKAJoIAYoAmxqNgJsDAELIAZBADYCbAsgBiAGKAKMAUEBajYCjAEgBkEgaiAGKAKQAUEBdGoiAS8BAEF/aiEAIAEgADsBAAJAIABB//8DcUUEQCAGKAKQASAGKAKEAUYNASAGIAYoAqQBIAYoApQBIAYoAowBQQF0ai8BAEEBdGovAQA2ApABCwJAIAYoApABIAYoAoABTQ0AIAYoAmAgBigCbCAGKAJccUYNACAGKAJ4RQRAIAYgBigCgAE2AngLIAYgBigCVCAGKAKIAUECdGo2AlQgBiAGKAKQASAGKAJ4azYCfCAGQQEgBigCfHQ2AnQDQAJAIAYoAnwgBigCeGogBigChAFPDQAgBiAGKAJ0IAZBIGogBigCfCAGKAJ4akEBdGovAQBrNgJ0IAYoAnRBAEwNACAGIAYoAnxBAWo2AnwgBiAGKAJ0QQF0NgJ0DAELCyAGIAYoAnBBASAGKAJ8dGo2AnACQAJAIAYoAqgBQQFGBEAgBigCcEHUBksNAQsgBigCqAFBAkcNASAGKAJwQdAETQ0BCyAGQQE2AqwBDAQLIAYgBigCbCAGKAJccTYCYCAGKAKcASgCACAGKAJgQQJ0aiAGKAJ8OgAAIAYoApwBKAIAIAYoAmBBAnRqIAYoAoABOgABIAYoApwBKAIAIAYoAmBBAnRqIAYoAlQgBigCnAEoAgBrQQJ1OwECCwwBCwsgBigCbARAIAZBwAA6AFggBiAGKAKQASAGKAJ4azoAWSAGQQA7AVogBigCVCAGKAJsQQJ0aiAGQdgAaigBADYBAAsgBigCnAEiACAAKAIAIAYoAnBBAnRqNgIAIAYoApgBIAYoAoABNgIAIAZBADYCrAELIAYoAqwBIQAgBkGwAWokACAAC7ECAQF/IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNgIQIAMgAygCGCgCBDYCDCADKAIMIAMoAhBLBEAgAyADKAIQNgIMCwJAIAMoAgxFBEAgA0EANgIcDAELIAMoAhgiACAAKAIEIAMoAgxrNgIEIAMoAhQgAygCGCgCACADKAIMEBoaAkAgAygCGCgCHCgCGEEBRgRAIAMoAhgoAjAgAygCFCADKAIMED0hACADKAIYIAA2AjAMAQsgAygCGCgCHCgCGEECRgRAIAMoAhgoAjAgAygCFCADKAIMEBshACADKAIYIAA2AjALCyADKAIYIgAgAygCDCAAKAIAajYCACADKAIYIgAgAygCDCAAKAIIajYCCCADIAMoAgw2AhwLIAMoAhwhACADQSBqJAAgAAvtAQEBfyMAQRBrIgEgADYCCAJAAkACQCABKAIIRQ0AIAEoAggoAiBFDQAgASgCCCgCJA0BCyABQQE2AgwMAQsgASABKAIIKAIcNgIEAkACQCABKAIERQ0AIAEoAgQoAgAgASgCCEcNACABKAIEKAIEQSpGDQEgASgCBCgCBEE5Rg0BIAEoAgQoAgRBxQBGDQEgASgCBCgCBEHJAEYNASABKAIEKAIEQdsARg0BIAEoAgQoAgRB5wBGDQEgASgCBCgCBEHxAEYNASABKAIEKAIEQZoFRg0BCyABQQE2AgwMAQsgAUEANgIMCyABKAIMC9IEAQF/IwBBIGsiAyAANgIcIAMgATYCGCADIAI2AhQgAyADKAIcQdwWaiADKAIUQQJ0aigCADYCECADIAMoAhRBAXQ2AgwDQAJAIAMoAgwgAygCHCgC0ChKDQACQCADKAIMIAMoAhwoAtAoTg0AIAMoAhggAygCHCADKAIMQQJ0akHgFmooAgBBAnRqLwEAIAMoAhggAygCHEHcFmogAygCDEECdGooAgBBAnRqLwEATgRAIAMoAhggAygCHCADKAIMQQJ0akHgFmooAgBBAnRqLwEAIAMoAhggAygCHEHcFmogAygCDEECdGooAgBBAnRqLwEARw0BIAMoAhwgAygCDEECdGpB4BZqKAIAIAMoAhxB2Chqai0AACADKAIcQdwWaiADKAIMQQJ0aigCACADKAIcQdgoamotAABKDQELIAMgAygCDEEBajYCDAsgAygCGCADKAIQQQJ0ai8BACADKAIYIAMoAhxB3BZqIAMoAgxBAnRqKAIAQQJ0ai8BAEgNAAJAIAMoAhggAygCEEECdGovAQAgAygCGCADKAIcQdwWaiADKAIMQQJ0aigCAEECdGovAQBHDQAgAygCECADKAIcQdgoamotAAAgAygCHEHcFmogAygCDEECdGooAgAgAygCHEHYKGpqLQAASg0ADAELIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhxB3BZqIAMoAgxBAnRqKAIANgIAIAMgAygCDDYCFCADIAMoAgxBAXQ2AgwMAQsLIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhA2AgAL5wgBA38jAEEwayICJAAgAiAANgIsIAIgATYCKCACIAIoAigoAgA2AiQgAiACKAIoKAIIKAIANgIgIAIgAigCKCgCCCgCDDYCHCACQX82AhAgAigCLEEANgLQKCACKAIsQb0ENgLUKCACQQA2AhgDQCACKAIYIAIoAhxORQRAAkAgAigCJCACKAIYQQJ0ai8BAARAIAIgAigCGCIBNgIQIAIoAixB3BZqIQMgAigCLCIEKALQKEEBaiEAIAQgADYC0CggAEECdCADaiABNgIAIAIoAhggAigCLEHYKGpqQQA6AAAMAQsgAigCJCACKAIYQQJ0akEAOwECCyACIAIoAhhBAWo2AhgMAQsLA0AgAigCLCgC0ChBAkgEQAJAIAIoAhBBAkgEQCACIAIoAhBBAWoiADYCEAwBC0EAIQALIAIoAixB3BZqIQMgAigCLCIEKALQKEEBaiEBIAQgATYC0CggAUECdCADaiAANgIAIAIgADYCDCACKAIkIAIoAgxBAnRqQQE7AQAgAigCDCACKAIsQdgoampBADoAACACKAIsIgAgACgCqC1Bf2o2AqgtIAIoAiAEQCACKAIsIgAgACgCrC0gAigCICACKAIMQQJ0ai8BAms2AqwtCwwBCwsgAigCKCACKAIQNgIEIAIgAigCLCgC0ChBAm02AhgDQCACKAIYQQFIRQRAIAIoAiwgAigCJCACKAIYEHUgAiACKAIYQX9qNgIYDAELCyACIAIoAhw2AgwDQCACIAIoAiwoAuAWNgIYIAIoAixB3BZqIQEgAigCLCIDKALQKCEAIAMgAEF/ajYC0CggAigCLCAAQQJ0IAFqKAIANgLgFiACKAIsIAIoAiRBARB1IAIgAigCLCgC4BY2AhQgAigCGCEBIAIoAixB3BZqIQMgAigCLCIEKALUKEF/aiEAIAQgADYC1CggAEECdCADaiABNgIAIAIoAhQhASACKAIsQdwWaiEDIAIoAiwiBCgC1ChBf2ohACAEIAA2AtQoIABBAnQgA2ogATYCACACKAIkIAIoAgxBAnRqIAIoAiQgAigCGEECdGovAQAgAigCJCACKAIUQQJ0ai8BAGo7AQAgAigCDCACKAIsQdgoamoCfyACKAIYIAIoAixB2Chqai0AACACKAIUIAIoAixB2Chqai0AAE4EQCACKAIYIAIoAixB2Chqai0AAAwBCyACKAIUIAIoAixB2Chqai0AAAtBAWo6AAAgAigCJCACKAIUQQJ0aiACKAIMIgA7AQIgAigCJCACKAIYQQJ0aiAAOwECIAIgAigCDCIAQQFqNgIMIAIoAiwgADYC4BYgAigCLCACKAIkQQEQdSACKAIsKALQKEECTg0ACyACKAIsKALgFiEBIAIoAixB3BZqIQMgAigCLCIEKALUKEF/aiEAIAQgADYC1CggAEECdCADaiABNgIAIAIoAiwgAigCKBDlAiACKAIkIAIoAhAgAigCLEG8FmoQ5AIgAkEwaiQAC04BAX8jAEEQayICIAA7AQogAiABNgIEAkAgAi8BCkEBRgRAIAIoAgRBAUYEQCACQQA2AgwMAgsgAkEENgIMDAELIAJBADYCDAsgAigCDAvNAgEBfyMAQTBrIgUkACAFIAA2AiwgBSABNgIoIAUgAjYCJCAFIAM3AxggBSAENgIUIAVCADcDCANAIAUpAwggBSkDGFQEQCAFIAUoAiQgBSkDCKdqLQAAOgAHIAUoAhRFBEAgBSAFKAIsKAIUQQJyOwESIAUgBS8BEiAFLwESQQFzbEEIdjsBEiAFIAUtAAcgBS8BEkH/AXFzOgAHCyAFKAIoBEAgBSgCKCAFKQMIp2ogBS0ABzoAAAsgBSgCLCgCDEF/cyAFQQdqIgBBARAbQX9zIQEgBSgCLCABNgIMIAUoAiwgBSgCLCgCECAFKAIsKAIMQf8BcWpBhYiiwABsQQFqNgIQIAUgBSgCLCgCEEEYdjoAByAFKAIsKAIUQX9zIABBARAbQX9zIQAgBSgCLCAANgIUIAUgBSkDCEIBfDcDCAwBCwsgBUEwaiQAC20BAX8jAEEgayIEJAAgBCAANgIYIAQgATYCFCAEIAI3AwggBCADNgIEAkAgBCgCGEUEQCAEQQA2AhwMAQsgBCAEKAIUIAQpAwggBCgCBCAEKAIYQQhqEL8BNgIcCyAEKAIcIQAgBEEgaiQAIAALpwMBAX8jAEEgayIEJAAgBCAANgIYIAQgATcDECAEIAI2AgwgBCADNgIIIAQgBCgCGCAEKQMQIAQoAgxBABBFIgA2AgACQCAARQRAIARBfzYCHAwBCyAEIAQoAhggBCkDECAEKAIMEMEBIgA2AgQgAEUEQCAEQX82AhwMAQsCQAJAIAQoAgxBCHENACAEKAIYKAJAIAQpAxCnQQR0aigCCEUNACAEKAIYKAJAIAQpAxCnQQR0aigCCCAEKAIIEDlBAEgEQCAEKAIYQQhqQQ9BABAVIARBfzYCHAwDCwwBCyAEKAIIEDwgBCgCCCAEKAIAKAIYNgIsIAQoAgggBCgCACkDKDcDGCAEKAIIIAQoAgAoAhQ2AiggBCgCCCAEKAIAKQMgNwMgIAQoAgggBCgCACgCEDsBMCAEKAIIIAQoAgAvAVI7ATIgBCgCCEEgQQAgBCgCAC0ABkEBcRtB3AFyrTcDAAsgBCgCCCAEKQMQNwMQIAQoAgggBCgCBDYCCCAEKAIIIgAgACkDAEIDhDcDACAEQQA2AhwLIAQoAhwhACAEQSBqJAAgAAt3AQF/IwBBEGsiASAANgIIIAFChSo3AwACQCABKAIIRQRAIAFBADYCDAwBCwNAIAEoAggtAAAEQCABIAEoAggtAACtIAEpAwBCIX58Qv////8PgzcDACABIAEoAghBAWo2AggMAQsLIAEgASkDAD4CDAsgASgCDAuHBQEBfyMAQTBrIgUkACAFIAA2AiggBSABNgIkIAUgAjcDGCAFIAM2AhQgBSAENgIQAkACQAJAIAUoAihFDQAgBSgCJEUNACAFKQMYQv///////////wBYDQELIAUoAhBBEkEAEBUgBUEAOgAvDAELIAUoAigoAgBFBEAgBSgCKEGAAiAFKAIQEFpBAXFFBEAgBUEAOgAvDAILCyAFIAUoAiQQezYCDCAFIAUoAgwgBSgCKCgCAHA2AgggBSAFKAIoKAIQIAUoAghBAnRqKAIANgIEA0ACQCAFKAIERQ0AAkAgBSgCBCgCHCAFKAIMRw0AIAUoAiQgBSgCBCgCABBbDQACQAJAIAUoAhRBCHEEQCAFKAIEKQMIQn9SDQELIAUoAgQpAxBCf1ENAQsgBSgCEEEKQQAQFSAFQQA6AC8MBAsMAQsgBSAFKAIEKAIYNgIEDAELCyAFKAIERQRAIAVBIBAZIgA2AgQgAEUEQCAFKAIQQQ5BABAVIAVBADoALwwCCyAFKAIEIAUoAiQ2AgAgBSgCBCAFKAIoKAIQIAUoAghBAnRqKAIANgIYIAUoAigoAhAgBSgCCEECdGogBSgCBDYCACAFKAIEIAUoAgw2AhwgBSgCBEJ/NwMIIAUoAigiACAAKQMIQgF8NwMIAkAgBSgCKCIAKQMIuiAAKAIAuEQAAAAAAADoP6JkRQ0AIAUoAigoAgBBgICAgHhPDQAgBSgCKCAFKAIoKAIAQQF0IAUoAhAQWkEBcUUEQCAFQQA6AC8MAwsLCyAFKAIUQQhxBEAgBSgCBCAFKQMYNwMICyAFKAIEIAUpAxg3AxAgBUEBOgAvCyAFLQAvQQFxIQAgBUEwaiQAIAALWQIBfwF+AkACf0EAIABFDQAaIACtIAGtfiIDpyICIAAgAXJBgIAESQ0AGkF/IAIgA0IgiKcbCyICEBkiAEUNACAAQXxqLQAAQQNxRQ0AIABBACACEDMLIAAL+QMBAX8jAEHQAGsiCCQAIAggADYCSCAIIAE3A0AgCCACNwM4IAggAzYCNCAIIAQ6ADMgCCAFNgIsIAggBjcDICAIIAc2AhwCQAJAAkAgCCgCSEUNACAIKQNAIAgpAzh8IAgpA0BUDQAgCCgCLA0BIAgpAyBQDQELIAgoAhxBEkEAEBUgCEEANgJMDAELIAhBgAEQGSIANgIYIABFBEAgCCgCHEEOQQAQFSAIQQA2AkwMAQsgCCgCGCAIKQNANwMAIAgoAhggCCkDQCAIKQM4fDcDCCAIKAIYQShqEDwgCCgCGCAILQAzOgBgIAgoAhggCCgCLDYCECAIKAIYIAgpAyA3AxgjAEEQayIAIAgoAhhB5ABqNgIMIAAoAgxBADYCACAAKAIMQQA2AgQgACgCDEEANgIIIwBBEGsiACAIKAJINgIMIAAoAgwpAxhC/4EBgyEBIAhBfzYCCCAIQQc2AgQgCEEONgIAQRAgCBA3IAGEIQEgCCgCGCABNwNwIAgoAhhBAUEAIAgoAhgpA3BCwACDQgBSG0EARzoAeCAIKAI0BEAgCCgCGEEoaiAIKAI0IAgoAhwQmgFBAEgEQCAIKAIYEBYgCEEANgJMDAILCyAIIAgoAkhBASAIKAIYIAgoAhwQkAE2AkwLIAgoAkwhACAIQdAAaiQAIAALlgIBAX8jAEEwayIDJAAgAyAANgIkIAMgATcDGCADIAI2AhQCQCADKAIkKAJAIAMpAxinQQR0aigCAEUEQCADKAIUQRRBABAVIANCADcDKAwBCyADIAMoAiQoAkAgAykDGKdBBHRqKAIAKQNINwMIIAMoAiQoAgAgAykDCEEAEChBAEgEQCADKAIUIAMoAiQoAgAQGCADQgA3AygMAQsgAyADKAIkKAIAIAMoAhQQiwMiADYCBCAAQQBIBEAgA0IANwMoDAELIAMpAwggAygCBK18Qv///////////wBWBEAgAygCFEEEQRYQFSADQgA3AygMAQsgAyADKQMIIAMoAgStfDcDKAsgAykDKCEBIANBMGokACABC3cBAX8jAEEQayICIAA2AgggAiABNgIEAkACQAJAIAIoAggpAyhC/////w9aDQAgAigCCCkDIEL/////D1oNACACKAIEQYAEcUUNASACKAIIKQNIQv////8PVA0BCyACQQE6AA8MAQsgAkEAOgAPCyACLQAPQQFxC7QCAQF/IwBBMGsiAyQAIAMgADYCKCADIAE3AyAgAyACNgIcAkAgAykDIFAEQCADQQE6AC8MAQsgAyADKAIoKQMQIAMpAyB8NwMIAkAgAykDCCADKQMgWgRAIAMpAwhC/////wBYDQELIAMoAhxBDkEAEBUgA0EAOgAvDAELIAMgAygCKCgCACADKQMIp0EEdBBPIgA2AgQgAEUEQCADKAIcQQ5BABAVIANBADoALwwBCyADKAIoIAMoAgQ2AgAgAyADKAIoKQMINwMQA0AgAykDECADKQMIWkUEQCADKAIoKAIAIAMpAxCnQQR0ahCOASADIAMpAxBCAXw3AxAMAQsLIAMoAiggAykDCCIBNwMQIAMoAiggATcDCCADQQE6AC8LIAMtAC9BAXEhACADQTBqJAAgAAvMAQEBfyMAQSBrIgIkACACIAA3AxAgAiABNgIMIAJBMBAZIgE2AggCQCABRQRAIAIoAgxBDkEAEBUgAkEANgIcDAELIAIoAghBADYCACACKAIIQgA3AxAgAigCCEIANwMIIAIoAghCADcDICACKAIIQgA3AxggAigCCEEANgIoIAIoAghBADoALCACKAIIIAIpAxAgAigCDBCBAUEBcUUEQCACKAIIECUgAkEANgIcDAELIAIgAigCCDYCHAsgAigCHCEBIAJBIGokACABC9kCAQF/IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNgIQIAMgA0EMakIEECo2AggCQCADKAIIRQRAIANBfzYCHAwBCwNAIAMoAhQEQCADKAIUKAIEIAMoAhBxQYAGcQRAIAMoAghCABAtGiADKAIIIAMoAhQvAQgQICADKAIIIAMoAhQvAQoQIAJ/IwBBEGsiACADKAIINgIMIAAoAgwtAABBAXFFCwRAIAMoAhhBCGpBFEEAEBUgAygCCBAXIANBfzYCHAwECyADKAIYIANBDGpCBBA2QQBIBEAgAygCCBAXIANBfzYCHAwECyADKAIULwEKQQBKBEAgAygCGCADKAIUKAIMIAMoAhQvAQqtEDZBAEgEQCADKAIIEBcgA0F/NgIcDAULCwsgAyADKAIUKAIANgIUDAELCyADKAIIEBcgA0EANgIcCyADKAIcIQAgA0EgaiQAIAALaAEBfyMAQRBrIgIgADYCDCACIAE2AgggAkEAOwEGA0AgAigCDARAIAIoAgwoAgQgAigCCHFBgAZxBEAgAiACKAIMLwEKIAIvAQZBBGpqOwEGCyACIAIoAgwoAgA2AgwMAQsLIAIvAQYL8AEBAX8jAEEQayIBJAAgASAANgIMIAEgASgCDDYCCCABQQA2AgQDQCABKAIMBEACQAJAIAEoAgwvAQhB9cYBRg0AIAEoAgwvAQhB9eABRg0AIAEoAgwvAQhBgbICRg0AIAEoAgwvAQhBAUcNAQsgASABKAIMKAIANgIAIAEoAgggASgCDEYEQCABIAEoAgA2AggLIAEoAgxBADYCACABKAIMECQgASgCBARAIAEoAgQgASgCADYCAAsgASABKAIANgIMDAILIAEgASgCDDYCBCABIAEoAgwoAgA2AgwMAQsLIAEoAgghACABQRBqJAAgAAuzBAEBfyMAQUBqIgUkACAFIAA2AjggBSABOwE2IAUgAjYCMCAFIAM2AiwgBSAENgIoIAUgBSgCOCAFLwE2rRAqIgA2AiQCQCAARQRAIAUoAihBDkEAEBUgBUEAOgA/DAELIAVBADYCICAFQQA2AhgDQAJ/IwBBEGsiACAFKAIkNgIMIAAoAgwtAABBAXELBH8gBSgCJBAwQgRaBUEAC0EBcQRAIAUgBSgCJBAeOwEWIAUgBSgCJBAeOwEUIAUgBSgCJCAFLwEUrRAfNgIQIAUoAhBFBEAgBSgCKEEVQQAQFSAFKAIkEBcgBSgCGBAkIAVBADoAPwwDCyAFIAUvARYgBS8BFCAFKAIQIAUoAjAQUCIANgIcIABFBEAgBSgCKEEOQQAQFSAFKAIkEBcgBSgCGBAkIAVBADoAPwwDCwJAIAUoAhgEQCAFKAIgIAUoAhw2AgAgBSAFKAIcNgIgDAELIAUgBSgCHCIANgIgIAUgADYCGAsMAQsLIAUoAiQQSEEBcUUEQCAFIAUoAiQQMD4CDCAFIAUoAiQgBSgCDK0QHzYCCAJAAkAgBSgCDEEETw0AIAUoAghFDQAgBSgCCEGy0wAgBSgCDBBTRQ0BCyAFKAIoQRVBABAVIAUoAiQQFyAFKAIYECQgBUEAOgA/DAILCyAFKAIkEBcCQCAFKAIsBEAgBSgCLCAFKAIYNgIADAELIAUoAhgQJAsgBUEBOgA/CyAFLQA/QQFxIQAgBUFAayQAIAAL7wIBAX8jAEEgayICJAAgAiAANgIYIAIgATYCFAJAIAIoAhhFBEAgAiACKAIUNgIcDAELIAIgAigCGDYCCANAIAIoAggoAgAEQCACIAIoAggoAgA2AggMAQsLA0AgAigCFARAIAIgAigCFCgCADYCECACQQA2AgQgAiACKAIYNgIMA0ACQCACKAIMRQ0AAkAgAigCDC8BCCACKAIULwEIRw0AIAIoAgwvAQogAigCFC8BCkcNACACKAIMLwEKBEAgAigCDCgCDCACKAIUKAIMIAIoAgwvAQoQUw0BCyACKAIMIgAgACgCBCACKAIUKAIEQYAGcXI2AgQgAkEBNgIEDAELIAIgAigCDCgCADYCDAwBCwsgAigCFEEANgIAAkAgAigCBARAIAIoAhQQJAwBCyACKAIIIAIoAhQiADYCACACIAA2AggLIAIgAigCEDYCFAwBCwsgAiACKAIYNgIcCyACKAIcIQAgAkEgaiQAIAALXQEBfyMAQRBrIgIkACACIAA2AgggAiABNgIEAkAgAigCBEUEQCACQQA2AgwMAQsgAiACKAIIIAIoAgQoAgAgAigCBC8BBK0QNjYCDAsgAigCDCEAIAJBEGokACAAC48BAQF/IwBBEGsiAiQAIAIgADYCCCACIAE2AgQCQAJAIAIoAggEQCACKAIEDQELIAIgAigCCCACKAIERjYCDAwBCyACKAIILwEEIAIoAgQvAQRHBEAgAkEANgIMDAELIAIgAigCCCgCACACKAIEKAIAIAIoAggvAQQQU0U2AgwLIAIoAgwhACACQRBqJAAgAAtVAQF/IwBBEGsiASQAIAEgADYCDCABQQBBAEEAEBs2AgggASgCDARAIAEgASgCCCABKAIMKAIAIAEoAgwvAQQQGzYCCAsgASgCCCEAIAFBEGokACAAC6ABAQF/IwBBIGsiBSQAIAUgADYCGCAFIAE2AhQgBSACOwESIAUgAzoAESAFIAQ2AgwgBSAFKAIYIAUoAhQgBS8BEiAFLQARQQFxIAUoAgwQYCIANgIIAkAgAEUEQCAFQQA2AhwMAQsgBSAFKAIIIAUvARJBACAFKAIMEFE2AgQgBSgCCBAWIAUgBSgCBDYCHAsgBSgCHCEAIAVBIGokACAAC18BAX8jAEEQayICJAAgAiAANgIIIAIgAToAByACIAIoAghCARAfNgIAAkAgAigCAEUEQCACQX82AgwMAQsgAigCACACLQAHOgAAIAJBADYCDAsgAigCDBogAkEQaiQAC1QBAX8jAEEQayIBJAAgASAANgIIIAEgASgCCEIBEB82AgQCQCABKAIERQRAIAFBADoADwwBCyABIAEoAgQtAAA6AA8LIAEtAA8hACABQRBqJAAgAAs4AQF/IwBBEGsiASAANgIMIAEoAgxBADYCACABKAIMQQA2AgQgASgCDEEANgIIIAEoAgxBADoADAufAgEBfyMAQUBqIgUkACAFIAA3AzAgBSABNwMoIAUgAjYCJCAFIAM3AxggBSAENgIUIAUCfyAFKQMYQhBUBEAgBSgCFEESQQAQFUEADAELIAUoAiQLNgIEAkAgBSgCBEUEQCAFQn83AzgMAQsCQAJAAkACQAJAIAUoAgQoAggOAwIAAQMLIAUgBSkDMCAFKAIEKQMAfDcDCAwDCyAFIAUpAyggBSgCBCkDAHw3AwgMAgsgBSAFKAIEKQMANwMIDAELIAUoAhRBEkEAEBUgBUJ/NwM4DAELAkAgBSkDCEIAWQRAIAUpAwggBSkDKFgNAQsgBSgCFEESQQAQFSAFQn83AzgMAQsgBSAFKQMINwM4CyAFKQM4IQAgBUFAayQAIAAL6gECAX8BfiMAQSBrIgQkACAEIAA2AhggBCABNgIUIAQgAjYCECAEIAM2AgwgBCAEKAIMEJEBIgA2AggCQCAARQRAIARBADYCHAwBCyMAQRBrIgAgBCgCGDYCDCAAKAIMIgAgACgCMEEBajYCMCAEKAIIIAQoAhg2AgAgBCgCCCAEKAIUNgIEIAQoAgggBCgCEDYCCCAEKAIYIAQoAhBBAEIAQQ4gBCgCFBENACEFIAQoAgggBTcDGCAEKAIIKQMYQgBTBEAgBCgCCEI/NwMYCyAEIAQoAgg2AhwLIAQoAhwhACAEQSBqJAAgAAvqAQEBfyMAQRBrIgEkACABIAA2AgggAUE4EBkiADYCBAJAIABFBEAgASgCCEEOQQAQFSABQQA2AgwMAQsgASgCBEEANgIAIAEoAgRBADYCBCABKAIEQQA2AgggASgCBEEANgIgIAEoAgRBADYCJCABKAIEQQA6ACggASgCBEEANgIsIAEoAgRBATYCMCMAQRBrIgAgASgCBEEMajYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCABKAIEQQA6ADQgASgCBEEAOgA1IAEgASgCBDYCDAsgASgCDCEAIAFBEGokACAAC4IFAQF/IwBB4ABrIgMkACADIAA2AlggAyABNgJUIAMgAjYCUAJAAkAgAygCVEEATgRAIAMoAlgNAQsgAygCUEESQQAQFSADQQA2AlwMAQsgAyADKAJUNgJMIwBBEGsiACADKAJYNgIMIAMgACgCDCkDGDcDQEHgmwEpAwBCf1EEQCADQX82AhQgA0EDNgIQIANBBzYCDCADQQY2AgggA0ECNgIEIANBATYCAEHgmwFBACADEDc3AwAgA0F/NgI0IANBDzYCMCADQQ02AiwgA0EMNgIoIANBCjYCJCADQQk2AiBB6JsBQQggA0EgahA3NwMAC0HgmwEpAwAgAykDQEHgmwEpAwCDUgRAIAMoAlBBHEEAEBUgA0EANgJcDAELQeibASkDACADKQNAQeibASkDAINSBEAgAyADKAJMQRByNgJMCyADKAJMQRhxQRhGBEAgAygCUEEZQQAQFSADQQA2AlwMAQsgAyADKAJYIAMoAlAQ+AE2AjwCQAJAAkAgAygCPEEBag4CAAECCyADQQA2AlwMAgsgAygCTEEBcUUEQCADKAJQQQlBABAVIANBADYCXAwCCyADIAMoAlggAygCTCADKAJQEGY2AlwMAQsgAygCTEECcQRAIAMoAlBBCkEAEBUgA0EANgJcDAELIAMoAlgQSUEASARAIAMoAlAgAygCWBAYIANBADYCXAwBCwJAIAMoAkxBCHEEQCADIAMoAlggAygCTCADKAJQEGY2AjgMAQsgAyADKAJYIAMoAkwgAygCUBD3ATYCOAsgAygCOEUEQCADKAJYEDIaIANBADYCXAwBCyADIAMoAjg2AlwLIAMoAlwhACADQeAAaiQAIAALjgEBAX8jAEEQayICJAAgAiAANgIMIAIgATYCCCACQQA2AgQgAigCCARAIwBBEGsiACACKAIINgIMIAIgACgCDCgCADYCBCACKAIIELABQQFGBEAjAEEQayIAIAIoAgg2AgxBtJwBIAAoAgwoAgQ2AgALCyACKAIMBEAgAigCDCACKAIENgIACyACQRBqJAALlQEBAX8jAEEQayIBJAAgASAANgIIAkACfyMAQRBrIgAgASgCCDYCDCAAKAIMKQMYQoCAEINQCwRAIAEoAggoAgAEQCABIAEoAggoAgAQlAFBAXE6AA8MAgsgAUEBOgAPDAELIAEgASgCCEEAQgBBEhAiPgIEIAEgASgCBEEARzoADwsgAS0AD0EBcSEAIAFBEGokACAAC7ABAgF/AX4jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAyADKAIQEJEBIgA2AgwCQCAARQRAIANBADYCHAwBCyADKAIMIAMoAhg2AgQgAygCDCADKAIUNgIIIAMoAhRBAEIAQQ4gAygCGBEPACEEIAMoAgwgBDcDGCADKAIMKQMYQgBTBEAgAygCDEI/NwMYCyADIAMoAgw2AhwLIAMoAhwhACADQSBqJAAgAAt/AQF/IwBBIGsiAyQAIAMgADYCGCADIAE3AxAgA0EANgIMIAMgAjYCCAJAIAMpAxBC////////////AFYEQCADKAIIQQRBPRAVIANBfzYCHAwBCyADIAMoAhggAykDECADKAIMIAMoAggQZzYCHAsgAygCHCEAIANBIGokACAAC30AIAJBAUYEQCABIAAoAgggACgCBGusfSEBCwJAIAAoAhQgACgCHEsEQCAAQQBBACAAKAIkEQEAGiAAKAIURQ0BCyAAQQA2AhwgAEIANwMQIAAgASACIAAoAigREABCAFMNACAAQgA3AgQgACAAKAIAQW9xNgIAQQAPC0F/C+ICAQJ/IwBBIGsiAyQAAn8CQAJAQfSXASABLAAAEJkBRQRAQbScAUEcNgIADAELQZgJEBkiAg0BC0EADAELIAJBAEGQARAzIAFBKxCZAUUEQCACQQhBBCABLQAAQfIARhs2AgALAkAgAS0AAEHhAEcEQCACKAIAIQEMAQsgAEEDQQAQBCIBQYAIcUUEQCADIAFBgAhyNgIQIABBBCADQRBqEAQaCyACIAIoAgBBgAFyIgE2AgALIAJB/wE6AEsgAkGACDYCMCACIAA2AjwgAiACQZgBajYCLAJAIAFBCHENACADIANBGGo2AgAgAEGTqAEgAxAODQAgAkEKOgBLCyACQRo2AiggAkEbNgIkIAJBHDYCICACQR02AgxBrKABKAIARQRAIAJBfzYCTAsgAkGAoQEoAgA2AjhBgKEBKAIAIgAEQCAAIAI2AjQLQYChASACNgIAIAILIQAgA0EgaiQAIAALGgAgACABEIQCIgBBACAALQAAIAFB/wFxRhsLwwIBAX8jAEEQayIDIAA2AgwgAyABNgIIIAMgAjYCBCADKAIIKQMAQgKDQgBSBEAgAygCDCADKAIIKQMQNwMQCyADKAIIKQMAQgSDQgBSBEAgAygCDCADKAIIKQMYNwMYCyADKAIIKQMAQgiDQgBSBEAgAygCDCADKAIIKQMgNwMgCyADKAIIKQMAQhCDQgBSBEAgAygCDCADKAIIKAIoNgIoCyADKAIIKQMAQiCDQgBSBEAgAygCDCADKAIIKAIsNgIsCyADKAIIKQMAQsAAg0IAUgRAIAMoAgwgAygCCC8BMDsBMAsgAygCCCkDAEKAAYNCAFIEQCADKAIMIAMoAggvATI7ATILIAMoAggpAwBCgAKDQgBSBEAgAygCDCADKAIIKAI0NgI0CyADKAIMIgAgAygCCCkDACAAKQMAhDcDAEEACxgAIAAoAkxBf0wEQCAAEJwBDwsgABCcAQtgAgJ/AX4gACgCKCEBQQEhAiAAQgAgAC0AAEGAAXEEf0ECQQEgACgCFCAAKAIcSxsFQQELIAEREAAiA0IAWQR+IAAoAhQgACgCHGusIAMgACgCCCAAKAIEa6x9fAUgAwsLdgEBfyAABEAgACgCTEF/TARAIAAQaw8LIAAQaw8LQYShASgCAARAQYShASgCABCdASEBC0GAoQEoAgAiAARAA0AgACgCTEEATgR/QQEFQQALGiAAKAIUIAAoAhxLBEAgABBrIAFyIQELIAAoAjgiAA0ACwsgAQsiACAAIAEQAiIAQYFgTwR/QbScAUEAIABrNgIAQX8FIAALC9YBAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE3AxAgBCACNgIMIAQgAzYCCCAEIAQoAhggBCgCGCAEKQMQIAQoAgwgBCgCCBCpASIANgIAAkAgAEUEQCAEQQA2AhwMAQsgBCgCABBJQQBIBEAgBCgCGEEIaiAEKAIAEBggBCgCABAcIARBADYCHAwBCyAEIAQoAhgQlAIiADYCBCAARQRAIAQoAgAQHCAEQQA2AhwMAQsgBCgCBCAEKAIANgIUIAQgBCgCBDYCHAsgBCgCHCEAIARBIGokACAAC6YBAQF/IwBBIGsiBSQAIAUgADYCGCAFIAE3AxAgBSACNgIMIAUgAzYCCCAFIAQ2AgQgBSAFKAIYIAUpAxAgBSgCDEEAEEUiADYCAAJAIABFBEAgBUF/NgIcDAELIAUoAggEQCAFKAIIIAUoAgAvAQhBCHU6AAALIAUoAgQEQCAFKAIEIAUoAgAoAkQ2AgALIAVBADYCHAsgBSgCHCEAIAVBIGokACAAC6UEAQF/IwBBMGsiBSQAIAUgADYCKCAFIAE3AyAgBSACNgIcIAUgAzoAGyAFIAQ2AhQCQCAFKAIoIAUpAyBBAEEAEEVFBEAgBUF/NgIsDAELIAUoAigoAhhBAnEEQCAFKAIoQQhqQRlBABAVIAVBfzYCLAwBCyAFIAUoAigoAkAgBSkDIKdBBHRqNgIQIAUCfyAFKAIQKAIABEAgBSgCECgCAC8BCEEIdQwBC0EDCzoACyAFAn8gBSgCECgCAARAIAUoAhAoAgAoAkQMAQtBgIDYjXgLNgIEQQEhACAFIAUtABsgBS0AC0YEfyAFKAIUIAUoAgRHBUEBC0EBcTYCDAJAIAUoAgwEQCAFKAIQKAIERQRAIAUoAhAoAgAQRiEAIAUoAhAgADYCBCAARQRAIAUoAihBCGpBDkEAEBUgBUF/NgIsDAQLCyAFKAIQKAIEIAUoAhAoAgQvAQhB/wFxIAUtABtBCHRyOwEIIAUoAhAoAgQgBSgCFDYCRCAFKAIQKAIEIgAgACgCAEEQcjYCAAwBCyAFKAIQKAIEBEAgBSgCECgCBCIAIAAoAgBBb3E2AgACQCAFKAIQKAIEKAIARQRAIAUoAhAoAgQQOiAFKAIQQQA2AgQMAQsgBSgCECgCBCAFKAIQKAIELwEIQf8BcSAFLQALQQh0cjsBCCAFKAIQKAIEIAUoAgQ2AkQLCwsgBUEANgIsCyAFKAIsIQAgBUEwaiQAIAAL7QQCAX8BfiMAQUBqIgQkACAEIAA2AjQgBEJ/NwMoIAQgATYCJCAEIAI2AiAgBCADNgIcAkAgBCgCNCgCGEECcQRAIAQoAjRBCGpBGUEAEBUgBEJ/NwM4DAELIAQgBCgCNCkDMDcDECAEKQMoQn9RBEAgBEJ/NwMIIAQoAhxBgMAAcQRAIAQgBCgCNCAEKAIkIAQoAhxBABBVNwMICyAEKQMIQn9RBEAgBCAEKAI0EKACIgU3AwggBUIAUwRAIARCfzcDOAwDCwsgBCAEKQMINwMoCwJAIAQoAiRFDQAgBCgCNCAEKQMoIAQoAiQgBCgCHBCfAkUNACAEKAI0KQMwIAQpAxBSBEAgBCgCNCgCQCAEKQMop0EEdGoQYiAEKAI0IAQpAxA3AzALIARCfzcDOAwBCyAEKAI0KAJAIAQpAyinQQR0ahBjAkAgBCgCNCgCQCAEKQMop0EEdGooAgBFDQAgBCgCNCgCQCAEKQMop0EEdGooAgQEQCAEKAI0KAJAIAQpAyinQQR0aigCBCgCAEEBcQ0BCyAEKAI0KAJAIAQpAyinQQR0aigCBEUEQCAEKAI0KAJAIAQpAyinQQR0aigCABBGIQAgBCgCNCgCQCAEKQMop0EEdGogADYCBCAARQRAIAQoAjRBCGpBDkEAEBUgBEJ/NwM4DAMLCyAEKAI0KAJAIAQpAyinQQR0aigCBEF+NgIQIAQoAjQoAkAgBCkDKKdBBHRqKAIEIgAgACgCAEEBcjYCAAsgBCgCNCgCQCAEKQMop0EEdGogBCgCIDYCCCAEIAQpAyg3AzgLIAQpAzghBSAEQUBrJAAgBQuYAgACQAJAIAFBFEsNAAJAAkACQAJAAkACQAJAAkAgAUF3ag4KAAECCQMEBQYJBwgLIAIgAigCACIBQQRqNgIAIAAgASgCADYCAA8LIAIgAigCACIBQQRqNgIAIAAgATQCADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATUCADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATEAADcDAA8LIAAgAkEWEQQACw8LIAIgAigCAEEHakF4cSIBQQhqNgIAIAAgASkDADcDAAtKAQN/IAAoAgAsAABBUGpBCkkEQANAIAAoAgAiASwAACEDIAAgAUEBajYCACADIAJBCmxqQVBqIQIgASwAAUFQakEKSQ0ACwsgAgt/AgF/AX4gAL0iA0I0iKdB/w9xIgJB/w9HBHwgAkUEQCABIABEAAAAAAAAAABhBH9BAAUgAEQAAAAAAADwQ6IgARClASEAIAEoAgBBQGoLNgIAIAAPCyABIAJBgnhqNgIAIANC/////////4eAf4NCgICAgICAgPA/hL8FIAALCxIAIABFBEBBAA8LIAAgARC1AgvlAQECfyACQQBHIQMCQAJAAkAgAkUNACAAQQNxRQ0AIAFB/wFxIQQDQCAALQAAIARGDQIgAEEBaiEAIAJBf2oiAkEARyEDIAJFDQEgAEEDcQ0ACwsgA0UNAQsCQCAALQAAIAFB/wFxRg0AIAJBBEkNACABQf8BcUGBgoQIbCEDA0AgACgCACADcyIEQX9zIARB//37d2pxQYCBgoR4cQ0BIABBBGohACACQXxqIgJBA0sNAAsLIAJFDQAgAUH/AXEhAQNAIAEgAC0AAEYEQCAADwsgAEEBaiEAIAJBf2oiAg0ACwtBAAuqAQEBfyMAQTBrIgIkACACIAA2AiggAiABNwMgIAJBADYCHAJAAkAgAigCKCgCJEEBRgRAIAIoAhxFDQEgAigCHEEBRg0BIAIoAhxBAkYNAQsgAigCKEEMakESQQAQFSACQX82AiwMAQsgAiACKQMgNwMIIAIgAigCHDYCECACQX9BACACKAIoIAJBCGpCEEEMECJCAFMbNgIsCyACKAIsIQAgAkEwaiQAIAALzQsBAX8jAEHAAWsiBSQAIAUgADYCuAEgBSABNgK0ASAFIAI3A6gBIAUgAzYCpAEgBUIANwOYASAFQgA3A5ABIAUgBDYCjAECQCAFKAK4AUUEQCAFQQA2ArwBDAELAkAgBSgCtAEEQCAFKQOoASAFKAK0ASkDMFQNAQsgBSgCuAFBCGpBEkEAEBUgBUEANgK8AQwBCwJAIAUoAqQBQQhxDQAgBSgCtAEoAkAgBSkDqAGnQQR0aigCCEUEQCAFKAK0ASgCQCAFKQOoAadBBHRqLQAMQQFxRQ0BCyAFKAK4AUEIakEPQQAQFSAFQQA2ArwBDAELIAUoArQBIAUpA6gBIAUoAqQBQQhyIAVByABqEHpBAEgEQCAFKAK4AUEIakEUQQAQFSAFQQA2ArwBDAELIAUoAqQBQSBxBEAgBSAFKAKkAUEEcjYCpAELAkAgBSkDmAFCAFgEQCAFKQOQAUIAWA0BCyAFKAKkAUEEcUUNACAFKAK4AUEIakESQQAQFSAFQQA2ArwBDAELAkAgBSkDmAFCAFgEQCAFKQOQAUIAWA0BCyAFKQOYASAFKQOQAXwgBSkDmAFaBEAgBSkDmAEgBSkDkAF8IAUpA2BYDQELIAUoArgBQQhqQRJBABAVIAVBADYCvAEMAQsgBSkDkAFQBEAgBSAFKQNgIAUpA5gBfTcDkAELIAUgBSkDkAEgBSkDYFQ6AEcgBSAFKAKkAUEgcQR/QQAFIAUvAXpBAEcLQQFxOgBFIAUgBSgCpAFBBHEEf0EABSAFLwF4QQBHC0EBcToARCAFAn8gBSgCpAFBBHEEQEEAIAUvAXgNARoLIAUtAEdBf3MLQQFxOgBGIAUtAEVBAXEEQCAFKAKMAUUEQCAFIAUoArgBKAIcNgKMAQsgBSgCjAFFBEAgBSgCuAFBCGpBGkEAEBUgBUEANgK8AQwCCwsgBSkDaFAEQCAFIAUoArgBQQBCAEEAEHk2ArwBDAELAkACQCAFLQBHQQFxRQ0AIAUtAEVBAXENACAFLQBEQQFxDQAgBSAFKQOQATcDICAFIAUpA5ABNwMoIAVBADsBOCAFIAUoAnA2AjAgBULcADcDCCAFIAUoArQBKAIAIAUpA5gBIAUpA5ABIAVBCGpBACAFKAK0ASAFKQOoASAFKAK4AUEIahB+IgA2AogBDAELIAUgBSgCtAEgBSkDqAEgBSgCpAEgBSgCuAFBCGoQRSIANgIEIABFBEAgBUEANgK8AQwCCyAFIAUoArQBKAIAQgAgBSkDaCAFQcgAaiAFKAIELwEMQQF1QQNxIAUoArQBIAUpA6gBIAUoArgBQQhqEH4iADYCiAELIABFBEAgBUEANgK8AQwBCyAFKAKIASAFKAK0ARCGA0EASARAIAUoAogBEBwgBUEANgK8AQwBCyAFLQBFQQFxBEAgBSAFLwF6QQAQdyIANgIAIABFBEAgBSgCuAFBCGpBGEEAEBUgBUEANgK8AQwCCyAFIAUoArgBIAUoAogBIAUvAXpBACAFKAKMASAFKAIAEQYANgKEASAFKAKIARAcIAUoAoQBRQRAIAVBADYCvAEMAgsgBSAFKAKEATYCiAELIAUtAERBAXEEQCAFIAUoArgBIAUoAogBIAUvAXgQqwE2AoQBIAUoAogBEBwgBSgChAFFBEAgBUEANgK8AQwCCyAFIAUoAoQBNgKIAQsgBS0ARkEBcQRAIAUgBSgCuAEgBSgCiAFBARCqATYChAEgBSgCiAEQHCAFKAKEAUUEQCAFQQA2ArwBDAILIAUgBSgChAE2AogBCwJAIAUtAEdBAXFFDQAgBS0ARUEBcUUEQCAFLQBEQQFxRQ0BCyAFIAUoArgBIAUoAogBIAUpA5gBIAUpA5ABEIgDNgKEASAFKAKIARAcIAUoAoQBRQRAIAVBADYCvAEMAgsgBSAFKAKEATYCiAELIAUgBSgCiAE2ArwBCyAFKAK8ASEAIAVBwAFqJAAgAAuEAgEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCEAJAIAMoAhRFBEAgAygCGEEIakESQQAQFSADQQA2AhwMAQsgA0E4EBkiADYCDCAARQRAIAMoAhhBCGpBDkEAEBUgA0EANgIcDAELIwBBEGsiACADKAIMQQhqNgIMIAAoAgxBADYCACAAKAIMQQA2AgQgACgCDEEANgIIIAMoAgwgAygCEDYCACADKAIMQQA2AgQgAygCDEIANwMoQQBBAEEAEBshACADKAIMIAA2AjAgAygCDEIANwMYIAMgAygCGCADKAIUQRQgAygCDBBkNgIcCyADKAIcIQAgA0EgaiQAIAALQwEBfyMAQRBrIgMkACADIAA2AgwgAyABNgIIIAMgAjYCBCADKAIMIAMoAgggAygCBEEAQQAQrQEhACADQRBqJAAgAAtJAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDCgCrEAgASgCDCgCqEAoAgQRAwAgASgCDBA4IAEoAgwQFgsgAUEQaiQAC5cCAQF/IwBBMGsiBSQAIAUgADYCKCAFIAE2AiQgBSACNgIgIAUgAzoAHyAFIAQ2AhggBUEANgIMAkAgBSgCJEUEQCAFKAIoQQhqQRJBABAVIAVBADYCLAwBCyAFIAUoAiAgBS0AH0EBcRCuASIANgIMIABFBEAgBSgCKEEIakEQQQAQFSAFQQA2AiwMAQsgBSAFKAIgIAUtAB9BAXEgBSgCGCAFKAIMEMECIgA2AhQgAEUEQCAFKAIoQQhqQQ5BABAVIAVBADYCLAwBCyAFIAUoAiggBSgCJEETIAUoAhQQZCIANgIQIABFBEAgBSgCFBCsASAFQQA2AiwMAQsgBSAFKAIQNgIsCyAFKAIsIQAgBUEwaiQAIAALzAEBAX8jAEEgayICIAA2AhggAiABOgAXIAICfwJAIAIoAhhBf0cEQCACKAIYQX5HDQELQQgMAQsgAigCGAs7AQ4gAkEANgIQAkADQCACKAIQQdCYASgCAEkEQCACKAIQQQxsQdSYAWovAQAgAi8BDkYEQCACLQAXQQFxBEAgAiACKAIQQQxsQdSYAWooAgQ2AhwMBAsgAiACKAIQQQxsQdSYAWooAgg2AhwMAwUgAiACKAIQQQFqNgIQDAILAAsLIAJBADYCHAsgAigCHAvkAQEBfyMAQSBrIgMkACADIAA6ABsgAyABNgIUIAMgAjYCECADQcgAEBkiADYCDAJAIABFBEAgAygCEEEBQbScASgCABAVIANBADYCHAwBCyADKAIMIAMoAhA2AgAgAygCDCADLQAbQQFxOgAEIAMoAgwgAygCFDYCCAJAIAMoAgwoAghBAU4EQCADKAIMKAIIQQlMDQELIAMoAgxBCTYCCAsgAygCDEEAOgAMIAMoAgxBADYCMCADKAIMQQA2AjQgAygCDEEANgI4IAMgAygCDDYCHAsgAygCHCEAIANBIGokACAAC1oBAX8jAEEQayIBIAA2AggCQAJAIAEoAggoAgBBAE4EQCABKAIIKAIAQaAOKAIASA0BCyABQQA2AgwMAQsgASABKAIIKAIAQQJ0QbAOaigCADYCDAsgASgCDAvjCAEBfyMAQUBqIgIgADYCOCACIAE2AjQgAiACKAI4KAJ8NgIwIAIgAigCOCgCOCACKAI4KAJsajYCLCACIAIoAjgoAng2AiAgAiACKAI4KAKQATYCHCACAn8gAigCOCgCbCACKAI4KAIsQYYCa0sEQCACKAI4KAJsIAIoAjgoAixBhgJrawwBC0EACzYCGCACIAIoAjgoAkA2AhQgAiACKAI4KAI0NgIQIAIgAigCOCgCOCACKAI4KAJsakGCAmo2AgwgAiACKAIsIAIoAiBBAWtqLQAAOgALIAIgAigCLCACKAIgai0AADoACiACKAI4KAJ4IAIoAjgoAowBTwRAIAIgAigCMEECdjYCMAsgAigCHCACKAI4KAJ0SwRAIAIgAigCOCgCdDYCHAsDQAJAIAIgAigCOCgCOCACKAI0ajYCKAJAIAIoAiggAigCIGotAAAgAi0ACkcNACACKAIoIAIoAiBBAWtqLQAAIAItAAtHDQAgAigCKC0AACACKAIsLQAARw0AIAIgAigCKCIAQQFqNgIoIAAtAAEgAigCLC0AAUcEQAwBCyACIAIoAixBAmo2AiwgAiACKAIoQQFqNgIoA0AgAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoAn9BACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAigCLCACKAIMSQtBAXENAAsgAkGCAiACKAIMIAIoAixrazYCJCACIAIoAgxB/n1qNgIsIAIoAiQgAigCIEoEQCACKAI4IAIoAjQ2AnAgAiACKAIkNgIgIAIoAiQgAigCHE4NAiACIAIoAiwgAigCIEEBa2otAAA6AAsgAiACKAIsIAIoAiBqLQAAOgAKCwsgAiACKAIUIAIoAjQgAigCEHFBAXRqLwEAIgE2AjRBACEAIAEgAigCGEsEfyACIAIoAjBBf2oiADYCMCAAQQBHBUEAC0EBcQ0BCwsCQCACKAIgIAIoAjgoAnRNBEAgAiACKAIgNgI8DAELIAIgAigCOCgCdDYCPAsgAigCPAueEAEBfyMAQTBrIgIkACACIAA2AiggAiABNgIkIAICfyACKAIoKAIMQQVrIAIoAigoAixLBEAgAigCKCgCLAwBCyACKAIoKAIMQQVrCzYCICACQQA2AhAgAiACKAIoKAIAKAIENgIMA0ACQCACQf//AzYCHCACIAIoAigoArwtQSpqQQN1NgIUIAIoAigoAgAoAhAgAigCFEkNACACIAIoAigoAgAoAhAgAigCFGs2AhQgAiACKAIoKAJsIAIoAigoAlxrNgIYIAIoAhwgAigCGCACKAIoKAIAKAIEaksEQCACIAIoAhggAigCKCgCACgCBGo2AhwLIAIoAhwgAigCFEsEQCACIAIoAhQ2AhwLAkAgAigCHCACKAIgTw0AAkAgAigCHEUEQCACKAIkQQRHDQELIAIoAiRFDQAgAigCHCACKAIYIAIoAigoAgAoAgRqRg0BCwwBC0EAIQAgAkEBQQAgAigCJEEERgR/IAIoAhwgAigCGCACKAIoKAIAKAIEakYFQQALQQFxGzYCECACKAIoQQBBACACKAIQEFcgAigCKCgCCCACKAIoKAIUQQRraiACKAIcOgAAIAIoAigoAgggAigCKCgCFEEDa2ogAigCHEEIdjoAACACKAIoKAIIIAIoAigoAhRBAmtqIAIoAhxBf3M6AAAgAigCKCgCCCACKAIoKAIUQQFraiACKAIcQX9zQQh2OgAAIAIoAigoAgAQHSACKAIYBEAgAigCGCACKAIcSwRAIAIgAigCHDYCGAsgAigCKCgCACgCDCACKAIoKAI4IAIoAigoAlxqIAIoAhgQGhogAigCKCgCACIAIAIoAhggACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCGGs2AhAgAigCKCgCACIAIAIoAhggACgCFGo2AhQgAigCKCIAIAIoAhggACgCXGo2AlwgAiACKAIcIAIoAhhrNgIcCyACKAIcBEAgAigCKCgCACACKAIoKAIAKAIMIAIoAhwQcxogAigCKCgCACIAIAIoAhwgACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCHGs2AhAgAigCKCgCACIAIAIoAhwgACgCFGo2AhQLIAIoAhBFDQELCyACIAIoAgwgAigCKCgCACgCBGs2AgwgAigCDARAAkAgAigCDCACKAIoKAIsTwRAIAIoAihBAjYCsC0gAigCKCgCOCACKAIoKAIAKAIAIAIoAigoAixrIAIoAigoAiwQGhogAigCKCACKAIoKAIsNgJsDAELIAIoAigoAjwgAigCKCgCbGsgAigCDE0EQCACKAIoIgAgACgCbCACKAIoKAIsazYCbCACKAIoKAI4IAIoAigoAjggAigCKCgCLGogAigCKCgCbBAaGiACKAIoKAKwLUECSQRAIAIoAigiACAAKAKwLUEBajYCsC0LCyACKAIoKAI4IAIoAigoAmxqIAIoAigoAgAoAgAgAigCDGsgAigCDBAaGiACKAIoIgAgAigCDCAAKAJsajYCbAsgAigCKCACKAIoKAJsNgJcIAIoAigiAQJ/IAIoAgwgAigCKCgCLCACKAIoKAK0LWtLBEAgAigCKCgCLCACKAIoKAK0LWsMAQsgAigCDAsgASgCtC1qNgK0LQsgAigCKCgCwC0gAigCKCgCbEkEQCACKAIoIAIoAigoAmw2AsAtCwJAIAIoAhAEQCACQQM2AiwMAQsCQCACKAIkRQ0AIAIoAiRBBEYNACACKAIoKAIAKAIEDQAgAigCKCgCbCACKAIoKAJcRw0AIAJBATYCLAwBCyACIAIoAigoAjwgAigCKCgCbGtBAWs2AhQCQCACKAIoKAIAKAIEIAIoAhRNDQAgAigCKCgCXCACKAIoKAIsSA0AIAIoAigiACAAKAJcIAIoAigoAixrNgJcIAIoAigiACAAKAJsIAIoAigoAixrNgJsIAIoAigoAjggAigCKCgCOCACKAIoKAIsaiACKAIoKAJsEBoaIAIoAigoArAtQQJJBEAgAigCKCIAIAAoArAtQQFqNgKwLQsgAiACKAIoKAIsIAIoAhRqNgIUCyACKAIUIAIoAigoAgAoAgRLBEAgAiACKAIoKAIAKAIENgIUCyACKAIUBEAgAigCKCgCACACKAIoKAI4IAIoAigoAmxqIAIoAhQQcxogAigCKCIAIAIoAhQgACgCbGo2AmwLIAIoAigoAsAtIAIoAigoAmxJBEAgAigCKCACKAIoKAJsNgLALQsgAiACKAIoKAK8LUEqakEDdTYCFCACAn9B//8DIAIoAigoAgwgAigCFGtB//8DSw0AGiACKAIoKAIMIAIoAhRrCzYCFCACAn8gAigCFCACKAIoKAIsSwRAIAIoAigoAiwMAQsgAigCFAs2AiAgAiACKAIoKAJsIAIoAigoAlxrNgIYAkAgAigCGCACKAIgSQRAIAIoAhhFBEAgAigCJEEERw0CCyACKAIkRQ0BIAIoAigoAgAoAgQNASACKAIYIAIoAhRLDQELIAICfyACKAIYIAIoAhRLBEAgAigCFAwBCyACKAIYCzYCHCACQQFBAAJ/QQAgAigCJEEERw0AGkEAIAIoAigoAgAoAgQNABogAigCHCACKAIYRgtBAXEbNgIQIAIoAiggAigCKCgCOCACKAIoKAJcaiACKAIcIAIoAhAQVyACKAIoIgAgAigCHCAAKAJcajYCXCACKAIoKAIAEB0LIAJBAkEAIAIoAhAbNgIsCyACKAIsIQAgAkEwaiQAIAALsgIBAX8jAEEQayIBJAAgASAANgIIAkAgASgCCBB0BEAgAUF+NgIMDAELIAEgASgCCCgCHCgCBDYCBCABKAIIKAIcKAIIBEAgASgCCCgCKCABKAIIKAIcKAIIIAEoAggoAiQRBAALIAEoAggoAhwoAkQEQCABKAIIKAIoIAEoAggoAhwoAkQgASgCCCgCJBEEAAsgASgCCCgCHCgCQARAIAEoAggoAiggASgCCCgCHCgCQCABKAIIKAIkEQQACyABKAIIKAIcKAI4BEAgASgCCCgCKCABKAIIKAIcKAI4IAEoAggoAiQRBAALIAEoAggoAiggASgCCCgCHCABKAIIKAIkEQQAIAEoAghBADYCHCABQX1BACABKAIEQfEARhs2AgwLIAEoAgwhACABQRBqJAAgAAvrFwECfyMAQfAAayIDIAA2AmwgAyABNgJoIAMgAjYCZCADQX82AlwgAyADKAJoLwECNgJUIANBADYCUCADQQc2AkwgA0EENgJIIAMoAlRFBEAgA0GKATYCTCADQQM2AkgLIANBADYCYANAIAMoAmAgAygCZEpFBEAgAyADKAJUNgJYIAMgAygCaCADKAJgQQFqQQJ0ai8BAjYCVCADIAMoAlBBAWoiADYCUAJAAkAgACADKAJMTg0AIAMoAlggAygCVEcNAAwBCwJAIAMoAlAgAygCSEgEQANAIAMgAygCbEH8FGogAygCWEECdGovAQI2AkQCQCADKAJsKAK8LUEQIAMoAkRrSgRAIAMgAygCbEH8FGogAygCWEECdGovAQA2AkAgAygCbCIAIAAvAbgtIAMoAkBB//8DcSADKAJsKAK8LXRyOwG4LSADKAJsLwG4LUH/AXEhASADKAJsKAIIIQIgAygCbCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJsLwG4LUEIdSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwgAygCQEH//wNxQRAgAygCbCgCvC1rdTsBuC0gAygCbCIAIAAoArwtIAMoAkRBEGtqNgK8LQwBCyADKAJsIgAgAC8BuC0gAygCbEH8FGogAygCWEECdGovAQAgAygCbCgCvC10cjsBuC0gAygCbCIAIAMoAkQgACgCvC1qNgK8LQsgAyADKAJQQX9qIgA2AlAgAA0ACwwBCwJAIAMoAlgEQCADKAJYIAMoAlxHBEAgAyADKAJsQfwUaiADKAJYQQJ0ai8BAjYCPAJAIAMoAmwoArwtQRAgAygCPGtKBEAgAyADKAJsQfwUaiADKAJYQQJ0ai8BADYCOCADKAJsIgAgAC8BuC0gAygCOEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh1IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAI4Qf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCPEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJsQfwUaiADKAJYQQJ0ai8BACADKAJsKAK8LXRyOwG4LSADKAJsIgAgAygCPCAAKAK8LWo2ArwtCyADIAMoAlBBf2o2AlALIAMgAygCbC8BvhU2AjQCQCADKAJsKAK8LUEQIAMoAjRrSgRAIAMgAygCbC8BvBU2AjAgAygCbCIAIAAvAbgtIAMoAjBB//8DcSADKAJsKAK8LXRyOwG4LSADKAJsLwG4LUH/AXEhASADKAJsKAIIIQIgAygCbCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJsLwG4LUEIdSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwgAygCMEH//wNxQRAgAygCbCgCvC1rdTsBuC0gAygCbCIAIAAoArwtIAMoAjRBEGtqNgK8LQwBCyADKAJsIgAgAC8BuC0gAygCbC8BvBUgAygCbCgCvC10cjsBuC0gAygCbCIAIAMoAjQgACgCvC1qNgK8LQsgA0ECNgIsAkAgAygCbCgCvC1BECADKAIsa0oEQCADIAMoAlBBA2s2AiggAygCbCIAIAAvAbgtIAMoAihB//8DcSADKAJsKAK8LXRyOwG4LSADKAJsLwG4LUH/AXEhASADKAJsKAIIIQIgAygCbCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJsLwG4LUEIdSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwgAygCKEH//wNxQRAgAygCbCgCvC1rdTsBuC0gAygCbCIAIAAoArwtIAMoAixBEGtqNgK8LQwBCyADKAJsIgAgAC8BuC0gAygCUEEDa0H//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwiACADKAIsIAAoArwtajYCvC0LDAELAkAgAygCUEEKTARAIAMgAygCbC8BwhU2AiQCQCADKAJsKAK8LUEQIAMoAiRrSgRAIAMgAygCbC8BwBU2AiAgAygCbCIAIAAvAbgtIAMoAiBB//8DcSADKAJsKAK8LXRyOwG4LSADKAJsLwG4LUH/AXEhASADKAJsKAIIIQIgAygCbCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJsLwG4LUEIdSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwgAygCIEH//wNxQRAgAygCbCgCvC1rdTsBuC0gAygCbCIAIAAoArwtIAMoAiRBEGtqNgK8LQwBCyADKAJsIgAgAC8BuC0gAygCbC8BwBUgAygCbCgCvC10cjsBuC0gAygCbCIAIAMoAiQgACgCvC1qNgK8LQsgA0EDNgIcAkAgAygCbCgCvC1BECADKAIca0oEQCADIAMoAlBBA2s2AhggAygCbCIAIAAvAbgtIAMoAhhB//8DcSADKAJsKAK8LXRyOwG4LSADKAJsLwG4LUH/AXEhASADKAJsKAIIIQIgAygCbCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJsLwG4LUEIdSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwgAygCGEH//wNxQRAgAygCbCgCvC1rdTsBuC0gAygCbCIAIAAoArwtIAMoAhxBEGtqNgK8LQwBCyADKAJsIgAgAC8BuC0gAygCUEEDa0H//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwiACADKAIcIAAoArwtajYCvC0LDAELIAMgAygCbC8BxhU2AhQCQCADKAJsKAK8LUEQIAMoAhRrSgRAIAMgAygCbC8BxBU2AhAgAygCbCIAIAAvAbgtIAMoAhBB//8DcSADKAJsKAK8LXRyOwG4LSADKAJsLwG4LUH/AXEhASADKAJsKAIIIQIgAygCbCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJsLwG4LUEIdSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwgAygCEEH//wNxQRAgAygCbCgCvC1rdTsBuC0gAygCbCIAIAAoArwtIAMoAhRBEGtqNgK8LQwBCyADKAJsIgAgAC8BuC0gAygCbC8BxBUgAygCbCgCvC10cjsBuC0gAygCbCIAIAMoAhQgACgCvC1qNgK8LQsgA0EHNgIMAkAgAygCbCgCvC1BECADKAIMa0oEQCADIAMoAlBBC2s2AgggAygCbCIAIAAvAbgtIAMoAghB//8DcSADKAJsKAK8LXRyOwG4LSADKAJsLwG4LUH/AXEhASADKAJsKAIIIQIgAygCbCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJsLwG4LUEIdSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwgAygCCEH//wNxQRAgAygCbCgCvC1rdTsBuC0gAygCbCIAIAAoArwtIAMoAgxBEGtqNgK8LQwBCyADKAJsIgAgAC8BuC0gAygCUEELa0H//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwiACADKAIMIAAoArwtajYCvC0LCwsLIANBADYCUCADIAMoAlg2AlwCQCADKAJURQRAIANBigE2AkwgA0EDNgJIDAELAkAgAygCWCADKAJURgRAIANBBjYCTCADQQM2AkgMAQsgA0EHNgJMIANBBDYCSAsLCyADIAMoAmBBAWo2AmAMAQsLC5EEAQF/IwBBMGsiAyAANgIsIAMgATYCKCADIAI2AiQgA0F/NgIcIAMgAygCKC8BAjYCFCADQQA2AhAgA0EHNgIMIANBBDYCCCADKAIURQRAIANBigE2AgwgA0EDNgIICyADKAIoIAMoAiRBAWpBAnRqQf//AzsBAiADQQA2AiADQCADKAIgIAMoAiRKRQRAIAMgAygCFDYCGCADIAMoAiggAygCIEEBakECdGovAQI2AhQgAyADKAIQQQFqIgA2AhACQAJAIAAgAygCDE4NACADKAIYIAMoAhRHDQAMAQsCQCADKAIQIAMoAghIBEAgAygCLEH8FGogAygCGEECdGoiACADKAIQIAAvAQBqOwEADAELAkAgAygCGARAIAMoAhggAygCHEcEQCADKAIsIAMoAhhBAnRqQfwUaiIAIAAvAQBBAWo7AQALIAMoAiwiACAAQbwVai8BAEEBajsBvBUMAQsCQCADKAIQQQpMBEAgAygCLCIAIABBwBVqLwEAQQFqOwHAFQwBCyADKAIsIgAgAEHEFWovAQBBAWo7AcQVCwsLIANBADYCECADIAMoAhg2AhwCQCADKAIURQRAIANBigE2AgwgA0EDNgIIDAELAkAgAygCGCADKAIURgRAIANBBjYCDCADQQM2AggMAQsgA0EHNgIMIANBBDYCCAsLCyADIAMoAiBBAWo2AiAMAQsLC6cSAQJ/IwBB0ABrIgMgADYCTCADIAE2AkggAyACNgJEIANBADYCOCADKAJMKAKgLQRAA0AgAyADKAJMKAKkLSADKAI4QQF0ai8BADYCQCADKAJMKAKYLSEAIAMgAygCOCIBQQFqNgI4IAMgACABai0AADYCPAJAIAMoAkBFBEAgAyADKAJIIAMoAjxBAnRqLwECNgIsAkAgAygCTCgCvC1BECADKAIsa0oEQCADIAMoAkggAygCPEECdGovAQA2AiggAygCTCIAIAAvAbgtIAMoAihB//8DcSADKAJMKAK8LXRyOwG4LSADKAJMLwG4LUH/AXEhASADKAJMKAIIIQIgAygCTCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJMLwG4LUEIdSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwgAygCKEH//wNxQRAgAygCTCgCvC1rdTsBuC0gAygCTCIAIAAoArwtIAMoAixBEGtqNgK8LQwBCyADKAJMIgAgAC8BuC0gAygCSCADKAI8QQJ0ai8BACADKAJMKAK8LXRyOwG4LSADKAJMIgAgAygCLCAAKAK8LWo2ArwtCwwBCyADIAMoAjwtAIBZNgI0IAMgAygCSCADKAI0QYECakECdGovAQI2AiQCQCADKAJMKAK8LUEQIAMoAiRrSgRAIAMgAygCSCADKAI0QYECakECdGovAQA2AiAgAygCTCIAIAAvAbgtIAMoAiBB//8DcSADKAJMKAK8LXRyOwG4LSADKAJMLwG4LUH/AXEhASADKAJMKAIIIQIgAygCTCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJMLwG4LUEIdSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwgAygCIEH//wNxQRAgAygCTCgCvC1rdTsBuC0gAygCTCIAIAAoArwtIAMoAiRBEGtqNgK8LQwBCyADKAJMIgAgAC8BuC0gAygCSCADKAI0QYECakECdGovAQAgAygCTCgCvC10cjsBuC0gAygCTCIAIAMoAiQgACgCvC1qNgK8LQsgAyADKAI0QQJ0QcDlAGooAgA2AjAgAygCMARAIAMgAygCPCADKAI0QQJ0QbDoAGooAgBrNgI8IAMgAygCMDYCHAJAIAMoAkwoArwtQRAgAygCHGtKBEAgAyADKAI8NgIYIAMoAkwiACAALwG4LSADKAIYQf//A3EgAygCTCgCvC10cjsBuC0gAygCTC8BuC1B/wFxIQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTC8BuC1BCHUhASADKAJMKAIIIQIgAygCTCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJMIAMoAhhB//8DcUEQIAMoAkwoArwta3U7AbgtIAMoAkwiACAAKAK8LSADKAIcQRBrajYCvC0MAQsgAygCTCIAIAAvAbgtIAMoAjxB//8DcSADKAJMKAK8LXRyOwG4LSADKAJMIgAgAygCHCAAKAK8LWo2ArwtCwsgAyADKAJAQX9qNgJAIAMCfyADKAJAQYACSQRAIAMoAkAtAIBVDAELIAMoAkBBB3ZBgAJqLQCAVQs2AjQgAyADKAJEIAMoAjRBAnRqLwECNgIUAkAgAygCTCgCvC1BECADKAIUa0oEQCADIAMoAkQgAygCNEECdGovAQA2AhAgAygCTCIAIAAvAbgtIAMoAhBB//8DcSADKAJMKAK8LXRyOwG4LSADKAJMLwG4LUH/AXEhASADKAJMKAIIIQIgAygCTCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJMLwG4LUEIdSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwgAygCEEH//wNxQRAgAygCTCgCvC1rdTsBuC0gAygCTCIAIAAoArwtIAMoAhRBEGtqNgK8LQwBCyADKAJMIgAgAC8BuC0gAygCRCADKAI0QQJ0ai8BACADKAJMKAK8LXRyOwG4LSADKAJMIgAgAygCFCAAKAK8LWo2ArwtCyADIAMoAjRBAnRBwOYAaigCADYCMCADKAIwBEAgAyADKAJAIAMoAjRBAnRBsOkAaigCAGs2AkAgAyADKAIwNgIMAkAgAygCTCgCvC1BECADKAIMa0oEQCADIAMoAkA2AgggAygCTCIAIAAvAbgtIAMoAghB//8DcSADKAJMKAK8LXRyOwG4LSADKAJMLwG4LUH/AXEhASADKAJMKAIIIQIgAygCTCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJMLwG4LUEIdSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwgAygCCEH//wNxQRAgAygCTCgCvC1rdTsBuC0gAygCTCIAIAAoArwtIAMoAgxBEGtqNgK8LQwBCyADKAJMIgAgAC8BuC0gAygCQEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwiACADKAIMIAAoArwtajYCvC0LCwsgAygCOCADKAJMKAKgLUkNAAsLIAMgAygCSC8Bggg2AgQCQCADKAJMKAK8LUEQIAMoAgRrSgRAIAMgAygCSC8BgAg2AgAgAygCTCIAIAAvAbgtIAMoAgBB//8DcSADKAJMKAK8LXRyOwG4LSADKAJMLwG4LUH/AXEhASADKAJMKAIIIQIgAygCTCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJMLwG4LUEIdSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwgAygCAEH//wNxQRAgAygCTCgCvC1rdTsBuC0gAygCTCIAIAAoArwtIAMoAgRBEGtqNgK8LQwBCyADKAJMIgAgAC8BuC0gAygCSC8BgAggAygCTCgCvC10cjsBuC0gAygCTCIAIAMoAgQgACgCvC1qNgK8LQsLlwIBBH8jAEEQayIBIAA2AgwCQCABKAIMKAK8LUEQRgRAIAEoAgwvAbgtQf8BcSECIAEoAgwoAgghAyABKAIMIgQoAhQhACAEIABBAWo2AhQgACADaiACOgAAIAEoAgwvAbgtQQh1IQIgASgCDCgCCCEDIAEoAgwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAI6AAAgASgCDEEAOwG4LSABKAIMQQA2ArwtDAELIAEoAgwoArwtQQhOBEAgASgCDC8BuC0hAiABKAIMKAIIIQMgASgCDCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAjoAACABKAIMIgAgAC8BuC1BCHU7AbgtIAEoAgwiACAAKAK8LUEIazYCvC0LCwvvAQEEfyMAQRBrIgEgADYCDAJAIAEoAgwoArwtQQhKBEAgASgCDC8BuC1B/wFxIQIgASgCDCgCCCEDIAEoAgwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAI6AAAgASgCDC8BuC1BCHUhAiABKAIMKAIIIQMgASgCDCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAjoAAAwBCyABKAIMKAK8LUEASgRAIAEoAgwvAbgtIQIgASgCDCgCCCEDIAEoAgwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAI6AAALCyABKAIMQQA7AbgtIAEoAgxBADYCvC0L/AEBAX8jAEEQayIBIAA2AgwgAUEANgIIA0AgASgCCEGeAk5FBEAgASgCDEGUAWogASgCCEECdGpBADsBACABIAEoAghBAWo2AggMAQsLIAFBADYCCANAIAEoAghBHk5FBEAgASgCDEGIE2ogASgCCEECdGpBADsBACABIAEoAghBAWo2AggMAQsLIAFBADYCCANAIAEoAghBE05FBEAgASgCDEH8FGogASgCCEECdGpBADsBACABIAEoAghBAWo2AggMAQsLIAEoAgxBATsBlAkgASgCDEEANgKsLSABKAIMQQA2AqgtIAEoAgxBADYCsC0gASgCDEEANgKgLQsiAQF/IwBBEGsiASQAIAEgADYCDCABKAIMEBYgAUEQaiQAC+kBAQF/IwBBMGsiAiAANgIkIAIgATcDGCACQgA3AxAgAiACKAIkKQMIQgF9NwMIAkADQCACKQMQIAIpAwhUBEAgAiACKQMQIAIpAwggAikDEH1CAYh8NwMAAkAgAigCJCgCBCACKQMAp0EDdGopAwAgAikDGFYEQCACIAIpAwBCAX03AwgMAQsCQCACKQMAIAIoAiQpAwhSBEAgAigCJCgCBCACKQMAQgF8p0EDdGopAwAgAikDGFgNAQsgAiACKQMANwMoDAQLIAIgAikDAEIBfDcDEAsMAQsLIAIgAikDEDcDKAsgAikDKAunAQEBfyMAQTBrIgQkACAEIAA2AiggBCABNgIkIAQgAjcDGCAEIAM2AhQgBCAEKAIoKQM4IAQoAigpAzAgBCgCJCAEKQMYIAQoAhQQjwE3AwgCQCAEKQMIQgBTBEAgBEF/NgIsDAELIAQoAiggBCkDCDcDOCAEKAIoIAQoAigpAzgQuwEhAiAEKAIoIAI3A0AgBEEANgIsCyAEKAIsIQAgBEEwaiQAIAAL6wEBAX8jAEEgayIDJAAgAyAANgIYIAMgATcDECADIAI2AgwCQCADKQMQIAMoAhgpAxBUBEAgA0EBOgAfDAELIAMgAygCGCgCACADKQMQQgSGpxBPIgA2AgggAEUEQCADKAIMQQ5BABAVIANBADoAHwwBCyADKAIYIAMoAgg2AgAgAyADKAIYKAIEIAMpAxBCAXxCA4anEE8iADYCBCAARQRAIAMoAgxBDkEAEBUgA0EAOgAfDAELIAMoAhggAygCBDYCBCADKAIYIAMpAxA3AxAgA0EBOgAfCyADLQAfQQFxIQAgA0EgaiQAIAAL0AIBAX8jAEEwayIEJAAgBCAANgIoIAQgATcDICAEIAI2AhwgBCADNgIYAkACQCAEKAIoDQAgBCkDIEIAWA0AIAQoAhhBEkEAEBUgBEEANgIsDAELIAQgBCgCKCAEKQMgIAQoAhwgBCgCGBBNIgA2AgwgAEUEQCAEQQA2AiwMAQsgBEEYEBkiADYCFCAARQRAIAQoAhhBDkEAEBUgBCgCDBA0IARBADYCLAwBCyAEKAIUIAQoAgw2AhAgBCgCFEEANgIUQQAQASEAIAQoAhQgADYCDCMAQRBrIgAgBCgCFDYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCAEQQIgBCgCFCAEKAIYEJUBIgA2AhAgAEUEQCAEKAIUKAIQEDQgBCgCFBAWIARBADYCLAwBCyAEIAQoAhA2AiwLIAQoAiwhACAEQTBqJAAgAAupAQEBfyMAQTBrIgQkACAEIAA2AiggBCABNwMgIAQgAjYCHCAEIAM2AhgCQCAEKAIoRQRAIAQpAyBCAFYEQCAEKAIYQRJBABAVIARBADYCLAwCCyAEQQBCACAEKAIcIAQoAhgQvgE2AiwMAQsgBCAEKAIoNgIIIAQgBCkDIDcDECAEIARBCGpCASAEKAIcIAQoAhgQvgE2AiwLIAQoAiwhACAEQTBqJAAgAAuqDAEGfyAAIAFqIQUCQAJAIAAoAgQiAkEBcQ0AIAJBA3FFDQEgACgCACIDIAFqIQEgACADayIAQcycASgCAEcEQEHInAEoAgAhBCADQf8BTQRAIAAoAggiBCADQQN2IgNBA3RB4JwBakcaIAQgACgCDCICRgRAQbicAUG4nAEoAgBBfiADd3E2AgAMAwsgBCACNgIMIAIgBDYCCAwCCyAAKAIYIQYCQCAAIAAoAgwiAkcEQCAEIAAoAggiA00EQCADKAIMGgsgAyACNgIMIAIgAzYCCAwBCwJAIABBFGoiAygCACIEDQAgAEEQaiIDKAIAIgQNAEEAIQIMAQsDQCADIQcgBCICQRRqIgMoAgAiBA0AIAJBEGohAyACKAIQIgQNAAsgB0EANgIACyAGRQ0BAkAgACAAKAIcIgNBAnRB6J4BaiIEKAIARgRAIAQgAjYCACACDQFBvJwBQbycASgCAEF+IAN3cTYCAAwDCyAGQRBBFCAGKAIQIABGG2ogAjYCACACRQ0CCyACIAY2AhggACgCECIDBEAgAiADNgIQIAMgAjYCGAsgACgCFCIDRQ0BIAIgAzYCFCADIAI2AhgMAQsgBSgCBCICQQNxQQNHDQBBwJwBIAE2AgAgBSACQX5xNgIEIAAgAUEBcjYCBCAFIAE2AgAPCwJAIAUoAgQiAkECcUUEQCAFQdCcASgCAEYEQEHQnAEgADYCAEHEnAFBxJwBKAIAIAFqIgE2AgAgACABQQFyNgIEIABBzJwBKAIARw0DQcCcAUEANgIAQcycAUEANgIADwsgBUHMnAEoAgBGBEBBzJwBIAA2AgBBwJwBQcCcASgCACABaiIBNgIAIAAgAUEBcjYCBCAAIAFqIAE2AgAPC0HInAEoAgAhAyACQXhxIAFqIQECQCACQf8BTQRAIAUoAggiBCACQQN2IgJBA3RB4JwBakcaIAQgBSgCDCIDRgRAQbicAUG4nAEoAgBBfiACd3E2AgAMAgsgBCADNgIMIAMgBDYCCAwBCyAFKAIYIQYCQCAFIAUoAgwiAkcEQCADIAUoAggiA00EQCADKAIMGgsgAyACNgIMIAIgAzYCCAwBCwJAIAVBFGoiAygCACIEDQAgBUEQaiIDKAIAIgQNAEEAIQIMAQsDQCADIQcgBCICQRRqIgMoAgAiBA0AIAJBEGohAyACKAIQIgQNAAsgB0EANgIACyAGRQ0AAkAgBSAFKAIcIgNBAnRB6J4BaiIEKAIARgRAIAQgAjYCACACDQFBvJwBQbycASgCAEF+IAN3cTYCAAwCCyAGQRBBFCAGKAIQIAVGG2ogAjYCACACRQ0BCyACIAY2AhggBSgCECIDBEAgAiADNgIQIAMgAjYCGAsgBSgCFCIDRQ0AIAIgAzYCFCADIAI2AhgLIAAgAUEBcjYCBCAAIAFqIAE2AgAgAEHMnAEoAgBHDQFBwJwBIAE2AgAPCyAFIAJBfnE2AgQgACABQQFyNgIEIAAgAWogATYCAAsgAUH/AU0EQCABQQN2IgJBA3RB4JwBaiEBAn9BuJwBKAIAIgNBASACdCICcUUEQEG4nAEgAiADcjYCACABDAELIAEoAggLIQMgASAANgIIIAMgADYCDCAAIAE2AgwgACADNgIIDwsgAEIANwIQIAACf0EAIAFBCHYiAkUNABpBHyABQf///wdLDQAaIAIgAkGA/j9qQRB2QQhxIgJ0IgMgA0GA4B9qQRB2QQRxIgN0IgQgBEGAgA9qQRB2QQJxIgR0QQ92IAIgA3IgBHJrIgJBAXQgASACQRVqdkEBcXJBHGoLIgM2AhwgA0ECdEHongFqIQICQAJAQbycASgCACIEQQEgA3QiB3FFBEBBvJwBIAQgB3I2AgAgAiAANgIAIAAgAjYCGAwBCyABQQBBGSADQQF2ayADQR9GG3QhAyACKAIAIQIDQCACIgQoAgRBeHEgAUYNAiADQR12IQIgA0EBdCEDIAQgAkEEcWoiB0EQaigCACICDQALIAcgADYCECAAIAQ2AhgLIAAgADYCDCAAIAA2AggPCyAEKAIIIgEgADYCDCAEIAA2AgggAEEANgIYIAAgBDYCDCAAIAE2AggLC0YBAX8jAEEgayIDJAAgAyAANgIcIAMgATcDECADIAI2AgwgAygCHCADKQMQIAMoAgwgAygCHEEIahBOIQAgA0EgaiQAIAALjQIBAX8jAEEwayIDJAAgAyAANgIoIAMgATsBJiADIAI2AiAgAyADKAIoKAI0IANBHmogAy8BJkGABkEAEF82AhACQCADKAIQRQ0AIAMvAR5BBUgNAAJAIAMoAhAtAABBAUYNAAwBCyADIAMoAhAgAy8BHq0QKiIANgIUIABFBEAMAQsgAygCFBCNARogAyADKAIUECs2AhggAygCIBCKASADKAIYRgRAIAMgAygCFBAwPQEOIAMgAygCFCADLwEOrRAfIAMvAQ5BgBBBABBRNgIIIAMoAggEQCADKAIgECYgAyADKAIINgIgCwsgAygCFBAXCyADIAMoAiA2AiwgAygCLCEAIANBMGokACAAC7kRAgF/AX4jAEGAAWsiBSQAIAUgADYCdCAFIAE2AnAgBSACNgJsIAUgAzoAayAFIAQ2AmQgBSAFKAJsQQBHOgAdIAVBHkEuIAUtAGtBAXEbNgIoAkACQCAFKAJsBEAgBSgCbBAwIAUoAiitVARAIAUoAmRBE0EAEBUgBUJ/NwN4DAMLDAELIAUgBSgCcCAFKAIorSAFQTBqIAUoAmQQQSIANgJsIABFBEAgBUJ/NwN4DAILCyAFKAJsQgQQHyEAQcXTAEHK0wAgBS0Aa0EBcRsoAAAgACgAAEcEQCAFKAJkQRNBABAVIAUtAB1BAXFFBEAgBSgCbBAXCyAFQn83A3gMAQsgBSgCdBBdAkAgBS0Aa0EBcUUEQCAFKAJsEB4hACAFKAJ0IAA7AQgMAQsgBSgCdEEAOwEICyAFKAJsEB4hACAFKAJ0IAA7AQogBSgCbBAeIQAgBSgCdCAAOwEMIAUoAmwQHkH//wNxIQAgBSgCdCAANgIQIAUgBSgCbBAeOwEuIAUgBSgCbBAeOwEsIAUvAS4gBS8BLBCNAyEAIAUoAnQgADYCFCAFKAJsECshACAFKAJ0IAA2AhggBSgCbBArrSEGIAUoAnQgBjcDICAFKAJsECutIQYgBSgCdCAGNwMoIAUgBSgCbBAeOwEiIAUgBSgCbBAeOwEeAkAgBS0Aa0EBcQRAIAVBADsBICAFKAJ0QQA2AjwgBSgCdEEAOwFAIAUoAnRBADYCRCAFKAJ0QgA3A0gMAQsgBSAFKAJsEB47ASAgBSgCbBAeQf//A3EhACAFKAJ0IAA2AjwgBSgCbBAeIQAgBSgCdCAAOwFAIAUoAmwQKyEAIAUoAnQgADYCRCAFKAJsECutIQYgBSgCdCAGNwNICwJ/IwBBEGsiACAFKAJsNgIMIAAoAgwtAABBAXFFCwRAIAUoAmRBFEEAEBUgBS0AHUEBcUUEQCAFKAJsEBcLIAVCfzcDeAwBCwJAIAUoAnQvAQxBAXEEQCAFKAJ0LwEMQcAAcQRAIAUoAnRB//8DOwFSDAILIAUoAnRBATsBUgwBCyAFKAJ0QQA7AVILIAUoAnRBADYCMCAFKAJ0QQA2AjQgBSgCdEEANgI4IAUgBS8BICAFLwEiIAUvAR5qajYCJAJAIAUtAB1BAXEEQCAFKAJsEDAgBSgCJK1UBEAgBSgCZEEVQQAQFSAFQn83A3gMAwsMAQsgBSgCbBAXIAUgBSgCcCAFKAIkrUEAIAUoAmQQQSIANgJsIABFBEAgBUJ/NwN4DAILCyAFLwEiBEAgBSgCbCAFKAJwIAUvASJBASAFKAJkEIsBIQAgBSgCdCAANgIwIAUoAnQoAjBFBEACfyMAQRBrIgAgBSgCZDYCDCAAKAIMKAIAQRFGCwRAIAUoAmRBFUEAEBULIAUtAB1BAXFFBEAgBSgCbBAXCyAFQn83A3gMAgsgBSgCdC8BDEGAEHEEQCAFKAJ0KAIwQQIQO0EFRgRAIAUoAmRBFUEAEBUgBS0AHUEBcUUEQCAFKAJsEBcLIAVCfzcDeAwDCwsLIAUvAR4EQCAFIAUoAmwgBSgCcCAFLwEeQQAgBSgCZBBgNgIYIAUoAhhFBEAgBS0AHUEBcUUEQCAFKAJsEBcLIAVCfzcDeAwCCyAFKAIYIAUvAR5BgAJBgAQgBS0Aa0EBcRsgBSgCdEE0aiAFKAJkEIYBQQFxRQRAIAUoAhgQFiAFLQAdQQFxRQRAIAUoAmwQFwsgBUJ/NwN4DAILIAUoAhgQFiAFLQBrQQFxBEAgBSgCdEEBOgAECwsgBS8BIARAIAUoAmwgBSgCcCAFLwEgQQAgBSgCZBCLASEAIAUoAnQgADYCOCAFKAJ0KAI4RQRAIAUtAB1BAXFFBEAgBSgCbBAXCyAFQn83A3gMAgsgBSgCdC8BDEGAEHEEQCAFKAJ0KAI4QQIQO0EFRgRAIAUoAmRBFUEAEBUgBS0AHUEBcUUEQCAFKAJsEBcLIAVCfzcDeAwDCwsLIAUoAnRB9eABIAUoAnQoAjAQwgEhACAFKAJ0IAA2AjAgBSgCdEH1xgEgBSgCdCgCOBDCASEAIAUoAnQgADYCOAJAAkAgBSgCdCkDKEL/////D1ENACAFKAJ0KQMgQv////8PUQ0AIAUoAnQpA0hC/////w9SDQELIAUgBSgCdCgCNCAFQRZqQQFBgAJBgAQgBS0Aa0EBcRsgBSgCZBBfNgIMIAUoAgxFBEAgBS0AHUEBcUUEQCAFKAJsEBcLIAVCfzcDeAwCCyAFIAUoAgwgBS8BFq0QKiIANgIQIABFBEAgBSgCZEEOQQAQFSAFLQAdQQFxRQRAIAUoAmwQFwsgBUJ/NwN4DAILAkAgBSgCdCkDKEL/////D1EEQCAFKAIQEDEhBiAFKAJ0IAY3AygMAQsgBS0Aa0EBcQRAIAUoAhAQzAELCyAFKAJ0KQMgQv////8PUQRAIAUoAhAQMSEGIAUoAnQgBjcDIAsgBS0Aa0EBcUUEQCAFKAJ0KQNIQv////8PUQRAIAUoAhAQMSEGIAUoAnQgBjcDSAsgBSgCdCgCPEH//wNGBEAgBSgCEBArIQAgBSgCdCAANgI8CwsgBSgCEBBIQQFxRQRAIAUoAmRBFUEAEBUgBSgCEBAXIAUtAB1BAXFFBEAgBSgCbBAXCyAFQn83A3gMAgsgBSgCEBAXCwJ/IwBBEGsiACAFKAJsNgIMIAAoAgwtAABBAXFFCwRAIAUoAmRBFEEAEBUgBS0AHUEBcUUEQCAFKAJsEBcLIAVCfzcDeAwBCyAFLQAdQQFxRQRAIAUoAmwQFwsgBSgCdCkDSEL///////////8AVgRAIAUoAmRBBEEWEBUgBUJ/NwN4DAELIAUoAnQgBSgCZBCMA0EBcUUEQCAFQn83A3gMAQsgBSgCdCgCNBCFASEAIAUoAnQgADYCNCAFIAUoAiggBSgCJGqtNwN4CyAFKQN4IQYgBUGAAWokACAGC8kBAQF/IwBBEGsiAyQAIAMgADYCDCADIAE2AgggAyACNgIEIAMgA0EMahAKNgIAAkAgAygCAEUEQCADKAIEQSE7AQAgAygCCEEAOwEADAELIAMoAgAoAhRB0ABIBEAgAygCAEHQADYCFAsgAygCBCADKAIAKAIMIAMoAgAoAhRBCXQgAygCACgCEEEFdGpBoMB9amo7AQAgAygCCCADKAIAKAIIQQt0IAMoAgAoAgRBBXRqIAMoAgAoAgBBAXVqOwEACyADQRBqJAALgwMBAX8jAEEgayIDJAAgAyAAOwEaIAMgATYCFCADIAI2AhAgAyADKAIUIANBCGpBwABBABBHIgA2AgwCQCAARQRAIANBADYCHAwBCyADKAIIQQVqQf//A0sEQCADKAIQQRJBABAVIANBADYCHAwBCyADQQAgAygCCEEFaq0QKiIANgIEIABFBEAgAygCEEEOQQAQFSADQQA2AhwMAQsgAygCBEEBEIwBIAMoAgQgAygCFBCKARAhIAMoAgQgAygCDCADKAIIEEACfyMAQRBrIgAgAygCBDYCDCAAKAIMLQAAQQFxRQsEQCADKAIQQRRBABAVIAMoAgQQFyADQQA2AhwMAQsgAyADLwEaAn8jAEEQayIAIAMoAgQ2AgwCfiAAKAIMLQAAQQFxBEAgACgCDCkDEAwBC0IAC6dB//8DcQsCfyMAQRBrIgAgAygCBDYCDCAAKAIMKAIEC0GABhBQNgIAIAMoAgQQFyADIAMoAgA2AhwLIAMoAhwhACADQSBqJAAgAAvgCAEBfyMAQcABayIDJAAgAyAANgK0ASADIAE2ArABIAMgAjcDqAEgAyADKAK0ASgCABA1IgI3AyACQCACQgBTBEAgAygCtAFBCGogAygCtAEoAgAQGCADQn83A7gBDAELIAMgAykDIDcDoAEgA0EAOgAXIANCADcDGANAIAMpAxggAykDqAFUBEAgAyADKAK0ASgCQCADKAKwASADKQMYp0EDdGopAwCnQQR0ajYCDCADIAMoArQBAn8gAygCDCgCBARAIAMoAgwoAgQMAQsgAygCDCgCAAtBgAQQXiIANgIQIABBAEgEQCADQn83A7gBDAMLIAMoAhAEQCADQQE6ABcLIAMgAykDGEIBfDcDGAwBCwsgAyADKAK0ASgCABA1IgI3AyAgAkIAUwRAIAMoArQBQQhqIAMoArQBKAIAEBggA0J/NwO4AQwBCyADIAMpAyAgAykDoAF9NwOYAQJAIAMpA6ABQv////8PWARAIAMpA6gBQv//A1gNAQsgA0EBOgAXCyADIANBMGpC4gAQKiIANgIsIABFBEAgAygCtAFBCGpBDkEAEBUgA0J/NwO4AQwBCyADLQAXQQFxBEAgAygCLEG20wBBBBBAIAMoAixCLBAuIAMoAixBLRAgIAMoAixBLRAgIAMoAixBABAhIAMoAixBABAhIAMoAiwgAykDqAEQLiADKAIsIAMpA6gBEC4gAygCLCADKQOYARAuIAMoAiwgAykDoAEQLiADKAIsQbvTAEEEEEAgAygCLEEAECEgAygCLCADKQOgASADKQOYAXwQLiADKAIsQQEQIQsgAygCLEHA0wBBBBBAIAMoAixBABAhIAMoAiwCfkL//wMgAykDqAFC//8DWg0AGiADKQOoAQunQf//A3EQICADKAIsAn5C//8DIAMpA6gBQv//A1oNABogAykDqAELp0H//wNxECAgAygCLAJ/QX8gAykDmAFC/////w9aDQAaIAMpA5gBpwsQISADKAIsAn9BfyADKQOgAUL/////D1oNABogAykDoAGnCxAhIAMCfyADKAK0AS0AKEEBcQRAIAMoArQBKAIkDAELIAMoArQBKAIgCzYClAEgAygCLAJ/IAMoApQBBEAgAygClAEvAQQMAQtBAAtB//8DcRAgAn8jAEEQayIAIAMoAiw2AgwgACgCDC0AAEEBcUULBEAgAygCtAFBCGpBFEEAEBUgAygCLBAXIANCfzcDuAEMAQsgAygCtAECfyMAQRBrIgAgAygCLDYCDCAAKAIMKAIECwJ+IwBBEGsiACADKAIsNgIMAn4gACgCDC0AAEEBcQRAIAAoAgwpAxAMAQtCAAsLEDZBAEgEQCADKAIsEBcgA0J/NwO4AQwBCyADKAIsEBcgAygClAEEQCADKAK0ASADKAKUASgCACADKAKUAS8BBK0QNkEASARAIANCfzcDuAEMAgsLIAMgAykDmAE3A7gBCyADKQO4ASECIANBwAFqJAAgAgu2BQEBfyMAQTBrIgIkACACIAA2AiggAiABNwMgAkAgAikDICACKAIoKQMwWgRAIAIoAihBCGpBEkEAEBUgAkF/NgIsDAELIAIgAigCKCgCQCACKQMgp0EEdGo2AhwCQCACKAIcKAIABEAgAigCHCgCAC0ABEEBcUUNAQsgAkEANgIsDAELIAIoAhwoAgApA0hCGnxC////////////AFYEQCACKAIoQQhqQQRBFhAVIAJBfzYCLAwBCyACKAIoKAIAIAIoAhwoAgApA0hCGnxBABAoQQBIBEAgAigCKEEIaiACKAIoKAIAEBggAkF/NgIsDAELIAIgAigCKCgCAEIEIAJBGGogAigCKEEIahBBIgA2AhQgAEUEQCACQX82AiwMAQsgAiACKAIUEB47ARIgAiACKAIUEB47ARAgAigCFBBIQQFxRQRAIAIoAhQQFyACKAIoQQhqQRRBABAVIAJBfzYCLAwBCyACKAIUEBcgAi8BEEEASgRAIAIoAigoAgAgAi8BEq1BARAoQQBIBEAgAigCKEEIakEEQbScASgCABAVIAJBfzYCLAwCCyACQQAgAigCKCgCACACLwEQQQAgAigCKEEIahBgNgIIIAIoAghFBEAgAkF/NgIsDAILIAIoAgggAi8BEEGAAiACQQxqIAIoAihBCGoQhgFBAXFFBEAgAigCCBAWIAJBfzYCLAwCCyACKAIIEBYgAigCDARAIAIgAigCDBCFATYCDCACKAIcKAIAKAI0IAIoAgwQhwEhACACKAIcKAIAIAA2AjQLCyACKAIcKAIAQQE6AAQCQCACKAIcKAIERQ0AIAIoAhwoAgQtAARBAXENACACKAIcKAIEIAIoAhwoAgAoAjQ2AjQgAigCHCgCBEEBOgAECyACQQA2AiwLIAIoAiwhACACQTBqJAAgAAsGAEG0nAELjAEBAX8jAEEgayICJAAgAiAANgIYIAIgATYCFCACQQA2AhACQCACKAIURQRAIAJBADYCHAwBCyACIAIoAhQQGTYCDCACKAIMRQRAIAIoAhBBDkEAEBUgAkEANgIcDAELIAIoAgwgAigCGCACKAIUEBoaIAIgAigCDDYCHAsgAigCHCEAIAJBIGokACAACxgAQaicAUIANwIAQbCcAUEANgIAQaicAQuIAQEBfyMAQSBrIgMkACADIAA2AhQgAyABNgIQIAMgAjcDCAJAAkAgAygCFCgCJEEBRgRAIAMpAwhC////////////AFgNAQsgAygCFEEMakESQQAQFSADQn83AxgMAQsgAyADKAIUIAMoAhAgAykDCEELECI3AxgLIAMpAxghAiADQSBqJAAgAgtzAQF/IwBBIGsiASQAIAEgADYCGCABQgg3AxAgASABKAIYKQMQIAEpAxB8NwMIAkAgASkDCCABKAIYKQMQVARAIAEoAhhBADoAACABQX82AhwMAQsgASABKAIYIAEpAwgQLTYCHAsgASgCHBogAUEgaiQACwgAQQFBDBB9CwcAIAAoAigLlgEBAX8jAEEgayICIAA2AhggAiABNwMQAkACQAJAIAIoAhgtAABBAXFFDQAgAigCGCkDECACKQMQfCACKQMQVA0AIAIoAhgpAxAgAikDEHwgAigCGCkDCFgNAQsgAigCGEEAOgAAIAJBADYCHAwBCyACIAIoAhgoAgQgAigCGCkDEKdqNgIMIAIgAigCDDYCHAsgAigCHAu5AgEBfyMAQRBrIgIgADYCCCACIAE2AgQCQCACKAIIQYABSQRAIAIoAgQgAigCCDoAACACQQE2AgwMAQsgAigCCEGAEEkEQCACKAIEIAIoAghBBnZBH3FBwAFyOgAAIAIoAgQgAigCCEE/cUGAAXI6AAEgAkECNgIMDAELIAIoAghBgIAESQRAIAIoAgQgAigCCEEMdkEPcUHgAXI6AAAgAigCBCACKAIIQQZ2QT9xQYABcjoAASACKAIEIAIoAghBP3FBgAFyOgACIAJBAzYCDAwBCyACKAIEIAIoAghBEnZBB3FB8AFyOgAAIAIoAgQgAigCCEEMdkE/cUGAAXI6AAEgAigCBCACKAIIQQZ2QT9xQYABcjoAAiACKAIEIAIoAghBP3FBgAFyOgADIAJBBDYCDAsgAigCDAtfAQF/IwBBEGsiASAANgIIAkAgASgCCEGAAUkEQCABQQE2AgwMAQsgASgCCEGAEEkEQCABQQI2AgwMAQsgASgCCEGAgARJBEAgAUEDNgIMDAELIAFBBDYCDAsgASgCDAv+AgEBfyMAQTBrIgQkACAEIAA2AiggBCABNgIkIAQgAjYCICAEIAM2AhwgBCAEKAIoNgIYAkAgBCgCJEUEQCAEKAIgBEAgBCgCIEEANgIACyAEQQA2AiwMAQsgBEEBNgIQIARBADYCDANAIAQoAgwgBCgCJE9FBEAgBCAEKAIYIAQoAgxqLQAAQQF0QbDPAGovAQAQ0QEgBCgCEGo2AhAgBCAEKAIMQQFqNgIMDAELCyAEIAQoAhAQGSIANgIUIABFBEAgBCgCHEEOQQAQFSAEQQA2AiwMAQsgBEEANgIIIARBADYCDANAIAQoAgwgBCgCJE9FBEAgBCAEKAIYIAQoAgxqLQAAQQF0QbDPAGovAQAgBCgCFCAEKAIIahDQASAEKAIIajYCCCAEIAQoAgxBAWo2AgwMAQsLIAQoAhQgBCgCEEEBa2pBADoAACAEKAIgBEAgBCgCICAEKAIQQQFrNgIACyAEIAQoAhQ2AiwLIAQoAiwhACAEQTBqJAAgAAsHACAAKAIYC/ILAQF/IwBBIGsiAyAANgIcIAMgATYCGCADIAI2AhQgAyADKAIcQQh2QYD+A3EgAygCHEEYdmogAygCHEGA/gNxQQh0aiADKAIcQf8BcUEYdGo2AhAgAyADKAIQQX9zNgIQA0BBACEAIAMoAhQEfyADKAIYQQNxQQBHBUEAC0EBcQRAIAMoAhBBGHYhACADIAMoAhgiAUEBajYCGCADIAEtAAAgAHNBAnRBsC9qKAIAIAMoAhBBCHRzNgIQIAMgAygCFEF/ajYCFAwBCwsgAyADKAIYNgIMA0AgAygCFEEgSUUEQCADIAMoAgwiAEEEajYCDCADIAAoAgAgAygCEHM2AhAgAyADKAIQQRh2QQJ0QbDHAGooAgAgAygCEEEQdkH/AXFBAnRBsD9qKAIAIAMoAhBB/wFxQQJ0QbAvaigCACADKAIQQQh2Qf8BcUECdEGwN2ooAgBzc3M2AhAgAyADKAIMIgBBBGo2AgwgAyAAKAIAIAMoAhBzNgIQIAMgAygCEEEYdkECdEGwxwBqKAIAIAMoAhBBEHZB/wFxQQJ0QbA/aigCACADKAIQQf8BcUECdEGwL2ooAgAgAygCEEEIdkH/AXFBAnRBsDdqKAIAc3NzNgIQIAMgAygCDCIAQQRqNgIMIAMgACgCACADKAIQczYCECADIAMoAhBBGHZBAnRBsMcAaigCACADKAIQQRB2Qf8BcUECdEGwP2ooAgAgAygCEEH/AXFBAnRBsC9qKAIAIAMoAhBBCHZB/wFxQQJ0QbA3aigCAHNzczYCECADIAMoAgwiAEEEajYCDCADIAAoAgAgAygCEHM2AhAgAyADKAIQQRh2QQJ0QbDHAGooAgAgAygCEEEQdkH/AXFBAnRBsD9qKAIAIAMoAhBB/wFxQQJ0QbAvaigCACADKAIQQQh2Qf8BcUECdEGwN2ooAgBzc3M2AhAgAyADKAIMIgBBBGo2AgwgAyAAKAIAIAMoAhBzNgIQIAMgAygCEEEYdkECdEGwxwBqKAIAIAMoAhBBEHZB/wFxQQJ0QbA/aigCACADKAIQQf8BcUECdEGwL2ooAgAgAygCEEEIdkH/AXFBAnRBsDdqKAIAc3NzNgIQIAMgAygCDCIAQQRqNgIMIAMgACgCACADKAIQczYCECADIAMoAhBBGHZBAnRBsMcAaigCACADKAIQQRB2Qf8BcUECdEGwP2ooAgAgAygCEEH/AXFBAnRBsC9qKAIAIAMoAhBBCHZB/wFxQQJ0QbA3aigCAHNzczYCECADIAMoAgwiAEEEajYCDCADIAAoAgAgAygCEHM2AhAgAyADKAIQQRh2QQJ0QbDHAGooAgAgAygCEEEQdkH/AXFBAnRBsD9qKAIAIAMoAhBB/wFxQQJ0QbAvaigCACADKAIQQQh2Qf8BcUECdEGwN2ooAgBzc3M2AhAgAyADKAIMIgBBBGo2AgwgAyAAKAIAIAMoAhBzNgIQIAMgAygCEEEYdkECdEGwxwBqKAIAIAMoAhBBEHZB/wFxQQJ0QbA/aigCACADKAIQQf8BcUECdEGwL2ooAgAgAygCEEEIdkH/AXFBAnRBsDdqKAIAc3NzNgIQIAMgAygCFEEgazYCFAwBCwsDQCADKAIUQQRJRQRAIAMgAygCDCIAQQRqNgIMIAMgACgCACADKAIQczYCECADIAMoAhBBGHZBAnRBsMcAaigCACADKAIQQRB2Qf8BcUECdEGwP2ooAgAgAygCEEH/AXFBAnRBsC9qKAIAIAMoAhBBCHZB/wFxQQJ0QbA3aigCAHNzczYCECADIAMoAhRBBGs2AhQMAQsLIAMgAygCDDYCGCADKAIUBEADQCADKAIQQRh2IQAgAyADKAIYIgFBAWo2AhggAyABLQAAIABzQQJ0QbAvaigCACADKAIQQQh0czYCECADIAMoAhRBf2oiADYCFCAADQALCyADIAMoAhBBf3M2AhAgAygCEEEIdkGA/gNxIAMoAhBBGHZqIAMoAhBBgP4DcUEIdGogAygCEEH/AXFBGHRqC5MLAQF/IwBBIGsiAyAANgIcIAMgATYCGCADIAI2AhQgAyADKAIcNgIQIAMgAygCEEF/czYCEANAQQAhACADKAIUBH8gAygCGEEDcUEARwVBAAtBAXEEQCADKAIQIQAgAyADKAIYIgFBAWo2AhggAyABLQAAIABzQf8BcUECdEGwD2ooAgAgAygCEEEIdnM2AhAgAyADKAIUQX9qNgIUDAELCyADIAMoAhg2AgwDQCADKAIUQSBJRQRAIAMgAygCDCIAQQRqNgIMIAMgACgCACADKAIQczYCECADIAMoAhBBGHZBAnRBsA9qKAIAIAMoAhBBEHZB/wFxQQJ0QbAXaigCACADKAIQQf8BcUECdEGwJ2ooAgAgAygCEEEIdkH/AXFBAnRBsB9qKAIAc3NzNgIQIAMgAygCDCIAQQRqNgIMIAMgACgCACADKAIQczYCECADIAMoAhBBGHZBAnRBsA9qKAIAIAMoAhBBEHZB/wFxQQJ0QbAXaigCACADKAIQQf8BcUECdEGwJ2ooAgAgAygCEEEIdkH/AXFBAnRBsB9qKAIAc3NzNgIQIAMgAygCDCIAQQRqNgIMIAMgACgCACADKAIQczYCECADIAMoAhBBGHZBAnRBsA9qKAIAIAMoAhBBEHZB/wFxQQJ0QbAXaigCACADKAIQQf8BcUECdEGwJ2ooAgAgAygCEEEIdkH/AXFBAnRBsB9qKAIAc3NzNgIQIAMgAygCDCIAQQRqNgIMIAMgACgCACADKAIQczYCECADIAMoAhBBGHZBAnRBsA9qKAIAIAMoAhBBEHZB/wFxQQJ0QbAXaigCACADKAIQQf8BcUECdEGwJ2ooAgAgAygCEEEIdkH/AXFBAnRBsB9qKAIAc3NzNgIQIAMgAygCDCIAQQRqNgIMIAMgACgCACADKAIQczYCECADIAMoAhBBGHZBAnRBsA9qKAIAIAMoAhBBEHZB/wFxQQJ0QbAXaigCACADKAIQQf8BcUECdEGwJ2ooAgAgAygCEEEIdkH/AXFBAnRBsB9qKAIAc3NzNgIQIAMgAygCDCIAQQRqNgIMIAMgACgCACADKAIQczYCECADIAMoAhBBGHZBAnRBsA9qKAIAIAMoAhBBEHZB/wFxQQJ0QbAXaigCACADKAIQQf8BcUECdEGwJ2ooAgAgAygCEEEIdkH/AXFBAnRBsB9qKAIAc3NzNgIQIAMgAygCDCIAQQRqNgIMIAMgACgCACADKAIQczYCECADIAMoAhBBGHZBAnRBsA9qKAIAIAMoAhBBEHZB/wFxQQJ0QbAXaigCACADKAIQQf8BcUECdEGwJ2ooAgAgAygCEEEIdkH/AXFBAnRBsB9qKAIAc3NzNgIQIAMgAygCDCIAQQRqNgIMIAMgACgCACADKAIQczYCECADIAMoAhBBGHZBAnRBsA9qKAIAIAMoAhBBEHZB/wFxQQJ0QbAXaigCACADKAIQQf8BcUECdEGwJ2ooAgAgAygCEEEIdkH/AXFBAnRBsB9qKAIAc3NzNgIQIAMgAygCFEEgazYCFAwBCwsDQCADKAIUQQRJRQRAIAMgAygCDCIAQQRqNgIMIAMgACgCACADKAIQczYCECADIAMoAhBBGHZBAnRBsA9qKAIAIAMoAhBBEHZB/wFxQQJ0QbAXaigCACADKAIQQf8BcUECdEGwJ2ooAgAgAygCEEEIdkH/AXFBAnRBsB9qKAIAc3NzNgIQIAMgAygCFEEEazYCFAwBCwsgAyADKAIMNgIYIAMoAhQEQANAIAMoAhAhACADIAMoAhgiAUEBajYCGCADIAEtAAAgAHNB/wFxQQJ0QbAPaigCACADKAIQQQh2czYCECADIAMoAhRBf2oiADYCFCAADQALCyADIAMoAhBBf3M2AhAgAygCEAuGAQEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCEAJAIAMoAhRFBEAgA0EANgIcDAELIANBATYCDCADLQAMBEAgAyADKAIYIAMoAhQgAygCEBDVATYCHAwBCyADIAMoAhggAygCFCADKAIQENQBNgIcCyADKAIcIQAgA0EgaiQAIAALBwAgACgCEAsUACAAIAGtIAKtQiCGhCADIAQQegsTAQF+IAAQSiIBQiCIpxAAIAGnCxIAIAAgAa0gAq1CIIaEIAMQKAsfAQF+IAAgASACrSADrUIghoQQLyIEQiCIpxAAIASnCxUAIAAgAa0gAq1CIIaEIAMgBBC/AQsUACAAIAEgAq0gA61CIIaEIAQQeQsVACAAIAGtIAKtQiCGhCADIAQQ8AELFwEBfiAAIAEgAhBuIgNCIIinEAAgA6cLFgEBfiAAIAEQkAIiAkIgiKcQACACpwsTACAAIAGtIAKtQiCGhCADEMEBCyABAX4gACABIAKtIAOtQiCGhBCRAiIEQiCIpxAAIASnCxMAIAAgAa0gAq1CIIaEIAMQkgILFQAgACABrSACrUIghoQgAyAEEJcCCxcAIAAgAa0gAq1CIIaEIAMgBCAFEKEBCxcAIAAgAa0gAq1CIIaEIAMgBCAFEKABCxoBAX4gACABIAIgAxCaAiIEQiCIpxAAIASnCxgBAX4gACABIAIQnAIiA0IgiKcQACADpwsJACABIAARAwALEAAjACAAa0FwcSIAJAAgAAsGACAAJAALIgEBfyMAQRBrIgEgADYCDCABKAIMIgAgACgCMEEBajYCMAsEACMAC8QBAQF/IwBBMGsiASQAIAEgADYCKCABQQA2AiQgAUIANwMYAkADQCABKQMYIAEoAigpAzBUBEAgASABKAIoIAEpAxhBACABQRdqIAFBEGoQoAE2AgwgASgCDEF/RgRAIAFBfzYCLAwDBQJAIAEtABdBA0cNACABKAIQQRB2QYDgA3FBgMACRw0AIAEgASgCJEEBajYCJAsgASABKQMYQgF8NwMYDAILAAsLIAEgASgCJDYCLAsgASgCLCEAIAFBMGokACAAC4IBAgF/AX4jAEEgayIEJAAgBCAANgIYIAQgATYCFCAEIAI2AhAgBCADNgIMIAQgBCgCGCAEKAIUIAQoAhAQbiIFNwMAAkAgBUIAUwRAIARBfzYCHAwBCyAEIAQoAhggBCkDACAEKAIQIAQoAgwQejYCHAsgBCgCHCEAIARBIGokACAAC9IDAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE3AxAgBCACNgIMIAQgAzYCCAJAAkAgBCkDECAEKAIYKQMwVARAIAQoAghBCU0NAQsgBCgCGEEIakESQQAQFSAEQX82AhwMAQsgBCgCGCgCGEECcQRAIAQoAhhBCGpBGUEAEBUgBEF/NgIcDAELIAQoAgwQwwJBAXFFBEAgBCgCGEEIakEQQQAQFSAEQX82AhwMAQsgBCAEKAIYKAJAIAQpAxCnQQR0ajYCBCAEAn9BfyAEKAIEKAIARQ0AGiAEKAIEKAIAKAIQCzYCAAJAIAQoAgwgBCgCAEYEQCAEKAIEKAIEBEAgBCgCBCgCBCIAIAAoAgBBfnE2AgAgBCgCBCgCBEEAOwFQIAQoAgQoAgQoAgBFBEAgBCgCBCgCBBA6IAQoAgRBADYCBAsLDAELIAQoAgQoAgRFBEAgBCgCBCgCABBGIQAgBCgCBCAANgIEIABFBEAgBCgCGEEIakEOQQAQFSAEQX82AhwMAwsLIAQoAgQoAgQgBCgCDDYCECAEKAIEKAIEIAQoAgg7AVAgBCgCBCgCBCIAIAAoAgBBAXI2AgALIARBADYCHAsgBCgCHCEAIARBIGokACAAC5ACAQF/IwBBEGsiAiQAIAIgADYCCCACIAE2AgQCQAJAAkAgAigCCC8BCiACKAIELwEKSA0AIAIoAggoAhAgAigCBCgCEEcNACACKAIIKAIUIAIoAgQoAhRHDQAgAigCCCgCMCACKAIEKAIwEIkBDQELIAJBfzYCDAwBCwJAAkAgAigCCCgCGCACKAIEKAIYRw0AIAIoAggpAyAgAigCBCkDIFINACACKAIIKQMoIAIoAgQpAyhRDQELAkACQCACKAIELwEMQQhxRQ0AIAIoAgQoAhgNACACKAIEKQMgQgBSDQAgAigCBCkDKFANAQsgAkF/NgIMDAILCyACQQA2AgwLIAIoAgwhACACQRBqJAAgAAv6AwEBfyMAQdAAayIEJAAgBCAANgJIIAQgATcDQCAEIAI2AjwgBCADNgI4AkAgBCgCSBAwQhZUBEAgBCgCOEEVQQAQFSAEQQA2AkwMAQsjAEEQayIAIAQoAkg2AgwgBAJ+IAAoAgwtAABBAXEEQCAAKAIMKQMQDAELQgALNwMIIAQoAkhCBBAfGiAEKAJIECsEQCAEKAI4QQFBABAVIARBADYCTAwBCyAEIAQoAkgQHkH//wNxrTcDKCAEIAQoAkgQHkH//wNxrTcDICAEKQMgIAQpAyhSBEAgBCgCOEETQQAQFSAEQQA2AkwMAQsgBCAEKAJIECutNwMYIAQgBCgCSBArrTcDECAEKQMQIAQpAxh8IAQpAxBUBEAgBCgCOEEEQRYQFSAEQQA2AkwMAQsgBCkDECAEKQMYfCAEKQNAIAQpAwh8VgRAIAQoAjhBFUEAEBUgBEEANgJMDAELAkAgBCgCPEEEcUUNACAEKQMQIAQpAxh8IAQpA0AgBCkDCHxRDQAgBCgCOEEVQQAQFSAEQQA2AkwMAQsgBCAEKQMgIAQoAjgQggEiADYCNCAARQRAIARBADYCTAwBCyAEKAI0QQA6ACwgBCgCNCAEKQMYNwMYIAQoAjQgBCkDEDcDICAEIAQoAjQ2AkwLIAQoAkwhACAEQdAAaiQAIAAL1QoBAX8jAEGwAWsiBSQAIAUgADYCqAEgBSABNgKkASAFIAI3A5gBIAUgAzYClAEgBSAENgKQASMAQRBrIgAgBSgCpAE2AgwgBQJ+IAAoAgwtAABBAXEEQCAAKAIMKQMQDAELQgALNwMYIAUoAqQBQgQQHxogBSAFKAKkARAeQf//A3E2AhAgBSAFKAKkARAeQf//A3E2AgggBSAFKAKkARAxNwM4AkAgBSkDOEL///////////8AVgRAIAUoApABQQRBFhAVIAVBADYCrAEMAQsgBSkDOEI4fCAFKQMYIAUpA5gBfFYEQCAFKAKQAUEVQQAQFSAFQQA2AqwBDAELAkACQCAFKQM4IAUpA5gBVA0AIAUpAzhCOHwgBSkDmAECfiMAQRBrIgAgBSgCpAE2AgwgACgCDCkDCAt8Vg0AIAUoAqQBIAUpAzggBSkDmAF9EC0aIAVBADoAFwwBCyAFKAKoASAFKQM4QQAQKEEASARAIAUoApABIAUoAqgBEBggBUEANgKsAQwCCyAFIAUoAqgBQjggBUFAayAFKAKQARBBIgA2AqQBIABFBEAgBUEANgKsAQwCCyAFQQE6ABcLIAUoAqQBQgQQHygAAEHQlpkwRwRAIAUoApABQRVBABAVIAUtABdBAXEEQCAFKAKkARAXCyAFQQA2AqwBDAELIAUgBSgCpAEQMTcDMAJAIAUoApQBQQRxRQ0AIAUpAzAgBSkDOHxCDHwgBSkDmAEgBSkDGHxRDQAgBSgCkAFBFUEAEBUgBS0AF0EBcQRAIAUoAqQBEBcLIAVBADYCrAEMAQsgBSgCpAFCBBAfGiAFIAUoAqQBECs2AgwgBSAFKAKkARArNgIEIAUoAhBB//8DRgRAIAUgBSgCDDYCEAsgBSgCCEH//wNGBEAgBSAFKAIENgIICwJAIAUoApQBQQRxRQ0AIAUoAgggBSgCBEYEQCAFKAIQIAUoAgxGDQELIAUoApABQRVBABAVIAUtABdBAXEEQCAFKAKkARAXCyAFQQA2AqwBDAELAkAgBSgCEEUEQCAFKAIIRQ0BCyAFKAKQAUEBQQAQFSAFLQAXQQFxBEAgBSgCpAEQFwsgBUEANgKsAQwBCyAFIAUoAqQBEDE3AyggBSAFKAKkARAxNwMgIAUpAyggBSkDIFIEQCAFKAKQAUEBQQAQFSAFLQAXQQFxBEAgBSgCpAEQFwsgBUEANgKsAQwBCyAFIAUoAqQBEDE3AzAgBSAFKAKkARAxNwOAAQJ/IwBBEGsiACAFKAKkATYCDCAAKAIMLQAAQQFxRQsEQCAFKAKQAUEUQQAQFSAFLQAXQQFxBEAgBSgCpAEQFwsgBUEANgKsAQwBCyAFLQAXQQFxBEAgBSgCpAEQFwsCQCAFKQOAAUL///////////8AWARAIAUpA4ABIAUpAzB8IAUpA4ABWg0BCyAFKAKQAUEEQRYQFSAFQQA2AqwBDAELIAUpA4ABIAUpAzB8IAUpA5gBIAUpAzh8VgRAIAUoApABQRVBABAVIAVBADYCrAEMAQsCQCAFKAKUAUEEcUUNACAFKQOAASAFKQMwfCAFKQOYASAFKQM4fFENACAFKAKQAUEVQQAQFSAFQQA2AqwBDAELIAUpAyggBSkDMEIugFYEQCAFKAKQAUEVQQAQFSAFQQA2AqwBDAELIAUgBSkDKCAFKAKQARCCASIANgKMASAARQRAIAVBADYCrAEMAQsgBSgCjAFBAToALCAFKAKMASAFKQMwNwMYIAUoAowBIAUpA4ABNwMgIAUgBSgCjAE2AqwBCyAFKAKsASEAIAVBsAFqJAAgAAviCwEBfyMAQfAAayIEJAAgBCAANgJoIAQgATYCZCAEIAI3A1ggBCADNgJUIwBBEGsiACAEKAJkNgIMIAQCfiAAKAIMLQAAQQFxBEAgACgCDCkDEAwBC0IACzcDMAJAIAQoAmQQMEIWVARAIAQoAlRBE0EAEBUgBEEANgJsDAELIAQoAmRCBBAfKAAAQdCWlTBHBEAgBCgCVEETQQAQFSAEQQA2AmwMAQsCQAJAIAQpAzBCFFQNACMAQRBrIgAgBCgCZDYCDCAAKAIMKAIEIAQpAzCnakFsaigAAEHQlpk4Rw0AIAQoAmQgBCkDMEIUfRAtGiAEIAQoAmgoAgAgBCgCZCAEKQNYIAQoAmgoAhQgBCgCVBDzATYCUAwBCyAEKAJkIAQpAzAQLRogBCAEKAJkIAQpA1ggBCgCaCgCFCAEKAJUEPIBNgJQCyAEKAJQRQRAIARBADYCbAwBCyAEKAJkIAQpAzBCFHwQLRogBCAEKAJkEB47AU4gBCgCUCkDICAEKAJQKQMYfCAEKQNYIAQpAzB8VgRAIAQoAlRBFUEAEBUgBCgCUBAlIARBADYCbAwBCwJAIAQvAU5FBEAgBCgCaCgCBEEEcUUNAQsgBCgCZCAEKQMwQhZ8EC0aIAQgBCgCZBAwNwMgAkAgBCkDICAELwFOrVoEQCAEKAJoKAIEQQRxRQ0BIAQpAyAgBC8BTq1RDQELIAQoAlRBFUEAEBUgBCgCUBAlIARBADYCbAwCCyAELwFOBEAgBCgCZCAELwFOrRAfIAQvAU5BACAEKAJUEFEhACAEKAJQIAA2AiggAEUEQCAEKAJQECUgBEEANgJsDAMLCwsCQCAEKAJQKQMgIAQpA1haBEAgBCgCZCAEKAJQKQMgIAQpA1h9EC0aIAQgBCgCZCAEKAJQKQMYEB8iADYCHCAARQRAIAQoAlRBFUEAEBUgBCgCUBAlIARBADYCbAwDCyAEIAQoAhwgBCgCUCkDGBAqIgA2AiwgAEUEQCAEKAJUQQ5BABAVIAQoAlAQJSAEQQA2AmwMAwsMAQsgBEEANgIsIAQoAmgoAgAgBCgCUCkDIEEAEChBAEgEQCAEKAJUIAQoAmgoAgAQGCAEKAJQECUgBEEANgJsDAILIAQoAmgoAgAQSiAEKAJQKQMgUgRAIAQoAlRBE0EAEBUgBCgCUBAlIARBADYCbAwCCwsgBCAEKAJQKQMYNwM4IARCADcDQANAAkAgBCkDOEIAWA0AIARBADoAGyAEKQNAIAQoAlApAwhRBEAgBCgCUC0ALEEBcQ0BIAQpAzhCLlQNASAEKAJQQoCABCAEKAJUEIEBQQFxRQRAIAQoAlAQJSAEKAIsEBcgBEEANgJsDAQLIARBAToAGwsQjgMhACAEKAJQKAIAIAQpA0CnQQR0aiAANgIAAkAgAARAIAQgBCgCUCgCACAEKQNAp0EEdGooAgAgBCgCaCgCACAEKAIsQQAgBCgCVBDDASICNwMQIAJCAFkNAQsCQCAELQAbQQFxRQ0AIwBBEGsiACAEKAJUNgIMIAAoAgwoAgBBE0cNACAEKAJUQRVBABAVCyAEKAJQECUgBCgCLBAXIARBADYCbAwDCyAEIAQpA0BCAXw3A0AgBCAEKQM4IAQpAxB9NwM4DAELCwJAIAQpA0AgBCgCUCkDCFEEQCAEKQM4QgBYDQELIAQoAlRBFUEAEBUgBCgCLBAXIAQoAlAQJSAEQQA2AmwMAQsgBCgCaCgCBEEEcQRAAkAgBCgCLARAIAQgBCgCLBBIQQFxOgAPDAELIAQgBCgCaCgCABBKNwMAIAQpAwBCAFMEQCAEKAJUIAQoAmgoAgAQGCAEKAJQECUgBEEANgJsDAMLIAQgBCkDACAEKAJQKQMgIAQoAlApAxh8UToADwsgBC0AD0EBcUUEQCAEKAJUQRVBABAVIAQoAiwQFyAEKAJQECUgBEEANgJsDAILCyAEKAIsEBcgBCAEKAJQNgJsCyAEKAJsIQAgBEHwAGokACAAC9cBAQF/IwBBIGsiAiQAIAIgADYCGCACIAE2AhQgAkGJmAE2AhAgAkEENgIMAkACQCACKAIUIAIoAgxPBEAgAigCDA0BCyACQQA2AhwMAQsgAiACKAIYQX9qNgIIA0ACQCACIAIoAghBAWogAigCEC0AACACKAIYIAIoAghrIAIoAhQgAigCDGtqEKcBIgA2AgggAEUNACACKAIIQQFqIAIoAhBBAWogAigCDEEBaxBTDQEgAiACKAIINgIcDAILCyACQQA2AhwLIAIoAhwhACACQSBqJAAgAAvBBgEBfyMAQeAAayICJAAgAiAANgJYIAIgATcDUAJAIAIpA1BCFlQEQCACKAJYQQhqQRNBABAVIAJBADYCXAwBCyACAn4gAikDUEKqgARUBEAgAikDUAwBC0KqgAQLNwMwIAIoAlgoAgBCACACKQMwfUECEChBAEgEQCMAQRBrIgAgAigCWCgCADYCDCACIAAoAgxBDGo2AggCQAJ/IwBBEGsiACACKAIINgIMIAAoAgwoAgBBBEYLBEAjAEEQayIAIAIoAgg2AgwgACgCDCgCBEEWRg0BCyACKAJYQQhqIAIoAggQRCACQQA2AlwMAgsLIAIgAigCWCgCABBKIgE3AzggAUIAUwRAIAIoAlhBCGogAigCWCgCABAYIAJBADYCXAwBCyACIAIoAlgoAgAgAikDMEEAIAIoAlhBCGoQQSIANgIMIABFBEAgAkEANgJcDAELIAJCfzcDICACQQA2AkwgAikDMEKqgARaBEAgAigCDEIUEC0aCyACQRBqQRNBABAVIAIgAigCDEIAEB82AkQDQAJAIAIgAigCRCACKAIMEDBCEn2nEPUBIgA2AkQgAEUNACACKAIMIAIoAkQCfyMAQRBrIgAgAigCDDYCDCAAKAIMKAIEC2usEC0aIAIgAigCWCACKAIMIAIpAzggAkEQahD0ASIANgJIIAAEQAJAIAIoAkwEQCACKQMgQgBXBEAgAiACKAJYIAIoAkwgAkEQahBlNwMgCyACIAIoAlggAigCSCACQRBqEGU3AygCQCACKQMgIAIpAyhTBEAgAigCTBAlIAIgAigCSDYCTCACIAIpAyg3AyAMAQsgAigCSBAlCwwBCyACIAIoAkg2AkwCQCACKAJYKAIEQQRxBEAgAiACKAJYIAIoAkwgAkEQahBlNwMgDAELIAJCADcDIAsLIAJBADYCSAsgAiACKAJEQQFqNgJEIAIoAgwgAigCRAJ/IwBBEGsiACACKAIMNgIMIAAoAgwoAgQLa6wQLRoMAQsLIAIoAgwQFyACKQMgQgBTBEAgAigCWEEIaiACQRBqEEQgAigCTBAlIAJBADYCXAwBCyACIAIoAkw2AlwLIAIoAlwhACACQeAAaiQAIAALvwUBAX8jAEHwAGsiAyQAIAMgADYCaCADIAE2AmQgAyACNgJgIANBIGoiABA8AkAgAygCaCAAEDlBAEgEQCADKAJgIAMoAmgQGCADQQA2AmwMAQsgAykDIEIEg1AEQCADKAJgQQRBigEQFSADQQA2AmwMAQsgAyADKQM4NwMYIAMgAygCaCADKAJkIAMoAmAQZiIANgJcIABFBEAgA0EANgJsDAELAkAgAykDGFBFDQAgAygCaBCUAUEBcUUNACADIAMoAlw2AmwMAQsgAyADKAJcIAMpAxgQ9gEiADYCWCAARQRAIAMoAmAgAygCXEEIahBEIwBBEGsiACADKAJoNgIMIAAoAgwiACAAKAIwQQFqNgIwIAMoAlwQPyADQQA2AmwMAQsgAygCXCADKAJYKAIANgJAIAMoAlwgAygCWCkDCDcDMCADKAJcIAMoAlgpAxA3AzggAygCXCADKAJYKAIoNgIgIAMoAlgQFiADKAJcKAJQIAMoAlwpAzAgAygCXEEIahD+AiADQgA3AxADQCADKQMQIAMoAlwpAzBUBEAgAyADKAJcKAJAIAMpAxCnQQR0aigCACgCMEEAQQAgAygCYBBHNgIMIAMoAgxFBEAjAEEQayIAIAMoAmg2AgwgACgCDCIAIAAoAjBBAWo2AjAgAygCXBA/IANBADYCbAwDCyADKAJcKAJQIAMoAgwgAykDEEEIIAMoAlxBCGoQfEEBcUUEQAJAIAMoAlwoAghBCkYEQCADKAJkQQRxRQ0BCyADKAJgIAMoAlxBCGoQRCMAQRBrIgAgAygCaDYCDCAAKAIMIgAgACgCMEEBajYCMCADKAJcED8gA0EANgJsDAQLCyADIAMpAxBCAXw3AxAMAQsLIAMoAlwgAygCXCgCFDYCGCADIAMoAlw2AmwLIAMoAmwhACADQfAAaiQAIAALwQEBAX8jAEHQAGsiAiQAIAIgADYCSCACIAE2AkQgAkEIaiIAEDwCQCACKAJIIAAQOQRAIwBBEGsiACACKAJINgIMIAIgACgCDEEMajYCBCMAQRBrIgAgAigCBDYCDAJAIAAoAgwoAgBBBUcNACMAQRBrIgAgAigCBDYCDCAAKAIMKAIEQSxHDQAgAkEANgJMDAILIAIoAkQgAigCBBBEIAJBfzYCTAwBCyACQQE2AkwLIAIoAkwhACACQdAAaiQAIAAL6gEBAX8jAEEwayIDJAAgAyAANgIoIAMgATYCJCADIAI2AiAjAEEQayIAIANBCGoiATYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCADIAMoAiggARD7ASIANgIYAkAgAEUEQCADKAIgIANBCGoiABCTASAAEDggA0EANgIsDAELIAMgAygCGCADKAIkIANBCGoQkgEiADYCHCAARQRAIAMoAhgQHCADKAIgIANBCGoiABCTASAAEDggA0EANgIsDAELIANBCGoQOCADIAMoAhw2AiwLIAMoAiwhACADQTBqJAAgAAvIAgEBfyMAQRBrIgEkACABIAA2AgggAUHYABAZNgIEAkAgASgCBEUEQCABKAIIQQ5BABAVIAFBADYCDAwBCyABKAIIEIIDIQAgASgCBCAANgJQIABFBEAgASgCBBAWIAFBADYCDAwBCyABKAIEQQA2AgAgASgCBEEANgIEIwBBEGsiACABKAIEQQhqNgIMIAAoAgxBADYCACAAKAIMQQA2AgQgACgCDEEANgIIIAEoAgRBADYCGCABKAIEQQA2AhQgASgCBEEANgIcIAEoAgRBADYCJCABKAIEQQA2AiAgASgCBEEAOgAoIAEoAgRCADcDOCABKAIEQgA3AzAgASgCBEEANgJAIAEoAgRBADYCSCABKAIEQQA2AkQgASgCBEEANgJMIAEoAgRBADYCVCABIAEoAgQ2AgwLIAEoAgwhACABQRBqJAAgAAuBAQEBfyMAQSBrIgIkACACIAA2AhggAkIANwMQIAJCfzcDCCACIAE2AgQCQAJAIAIoAhgEQCACKQMIQn9ZDQELIAIoAgRBEkEAEBUgAkEANgIcDAELIAIgAigCGCACKQMQIAIpAwggAigCBBD/ATYCHAsgAigCHCEAIAJBIGokACAAC80BAQJ/IwBBIGsiASQAIAEgADYCGCABQQA6ABcgAUGAgCA2AgwCQCABLQAXQQFxBEAgASABKAIMQQJyNgIMDAELIAEgASgCDDYCDAsgASgCGCEAIAEoAgwhAiABQbYDNgIAIAEgACACIAEQaSIANgIQAkAgAEEASARAIAFBADYCHAwBCyABIAEoAhBBgpgBQYaYASABLQAXQQFxGxCYASIANgIIIABFBEAgAUEANgIcDAELIAEgASgCCDYCHAsgASgCHCEAIAFBIGokACAAC8gCAQF/IwBBgAFrIgEkACABIAA2AnggASABKAJ4KAIYECxBCGoQGSIANgJ0AkAgAEUEQCABKAJ4QQ5BABAVIAFBfzYCfAwBCwJAIAEoAngoAhggAUEQahCeAUUEQCABIAEoAhw2AmwMAQsgAUF/NgJsCyABKAJ0IQAgASABKAJ4KAIYNgIAIABB+JcBIAEQbyABIAEoAnQgASgCbBCFAiIANgJwIABBf0YEQCABKAJ4QQxBtJwBKAIAEBUgASgCdBAWIAFBfzYCfAwBCyABIAEoAnBBgpgBEJgBIgA2AmggAEUEQCABKAJ4QQxBtJwBKAIAEBUgASgCcBBoIAEoAnQQahogASgCdBAWIAFBfzYCfAwBCyABKAJ4IAEoAmg2AoQBIAEoAnggASgCdDYCgAEgAUEANgJ8CyABKAJ8IQAgAUGAAWokACAAC8AQAQF/IwBB4ABrIgQkACAEIAA2AlQgBCABNgJQIAQgAjcDSCAEIAM2AkQgBCAEKAJUNgJAIAQgBCgCUDYCPAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAQoAkQOEwYHAgwEBQoOAQMJEAsPDQgREQARCyAEQgA3A1gMEQsgBCgCQCgCGEUEQCAEKAJAQRxBABAVIARCfzcDWAwRCyAEIAQoAkAQ/QGsNwNYDBALIAQoAkAoAhgEQCAEKAJAKAIcEFQaIAQoAkBBADYCHAsgBEIANwNYDA8LIAQoAkAoAoQBEFRBAEgEQCAEKAJAQQA2AoQBIAQoAkBBBkG0nAEoAgAQFQsgBCgCQEEANgKEASAEKAJAKAKAASAEKAJAKAIYEAciAEGBYE8Ef0G0nAFBACAAazYCAEF/BSAAC0EASARAIAQoAkBBAkG0nAEoAgAQFSAEQn83A1gMDwsgBCgCQCgCgAEQFiAEKAJAQQA2AoABIARCADcDWAwOCyAEIAQoAkAgBCgCUCAEKQNIEEM3A1gMDQsgBCgCQCgCGBAWIAQoAkAoAoABEBYgBCgCQCgCHARAIAQoAkAoAhwQVBoLIAQoAkAQFiAEQgA3A1gMDAsgBCgCQCgCGARAIAQoAkAoAhgQ/AEhACAEKAJAIAA2AhwgAEUEQCAEKAJAQQtBtJwBKAIAEBUgBEJ/NwNYDA0LCyAEKAJAKQNoQgBWBEAgBCgCQCgCHCAEKAJAKQNoIAQoAkAQlgFBAEgEQCAEQn83A1gMDQsLIAQoAkBCADcDeCAEQgA3A1gMCwsCQCAEKAJAKQNwQgBWBEAgBCAEKAJAKQNwIAQoAkApA3h9NwMwIAQpAzAgBCkDSFYEQCAEIAQpA0g3AzALDAELIAQgBCkDSDcDMAsgBCkDMEL/////D1YEQCAEQv////8PNwMwCyAEIAQoAjwgBCkDMKcgBCgCQCgCHBCKAiIANgIsIABFBEACfyAEKAJAKAIcIgAoAkxBf0wEQCAAKAIADAELIAAoAgALQQV2QQFxBEAgBCgCQEEFQbScASgCABAVIARCfzcDWAwMCwsgBCgCQCIAIAApA3ggBCgCLK18NwN4IAQgBCgCLK03A1gMCgsgBCgCQCgCGBBqQQBIBEAgBCgCQEEWQbScASgCABAVIARCfzcDWAwKCyAEQgA3A1gMCQsgBCgCQCgChAEEQCAEKAJAKAKEARBUGiAEKAJAQQA2AoQBCyAEKAJAKAKAARBqGiAEKAJAKAKAARAWIAQoAkBBADYCgAEgBEIANwNYDAgLIAQCfyAEKQNIQhBUBEAgBCgCQEESQQAQFUEADAELIAQoAlALNgIYIAQoAhhFBEAgBEJ/NwNYDAgLIARBATYCHAJAAkACQAJAAkAgBCgCGCgCCA4DAAIBAwsgBCAEKAIYKQMANwMgDAMLAkAgBCgCQCkDcFAEQCAEKAJAKAIcIAQoAhgpAwBBAiAEKAJAEGdBAEgEQCAEQn83A1gMDQsgBCAEKAJAKAIcEJsBIgI3AyAgAkIAUwRAIAQoAkBBBEG0nAEoAgAQFSAEQn83A1gMDQsgBCAEKQMgIAQoAkApA2h9NwMgIARBADYCHAwBCyAEIAQoAkApA3AgBCgCGCkDAHw3AyALDAILIAQgBCgCQCkDeCAEKAIYKQMAfDcDIAwBCyAEKAJAQRJBABAVIARCfzcDWAwICwJAAkAgBCkDIEIAUw0AIAQoAkApA3BCAFIEQCAEKQMgIAQoAkApA3BWDQELIAQpAyAgBCgCQCkDaHwgBCgCQCkDaFoNAQsgBCgCQEESQQAQFSAEQn83A1gMCAsgBCgCQCAEKQMgNwN4IAQoAhwEQCAEKAJAKAIcIAQoAkApA3ggBCgCQCkDaHwgBCgCQBCWAUEASARAIARCfzcDWAwJCwsgBEIANwNYDAcLIAQCfyAEKQNIQhBUBEAgBCgCQEESQQAQFUEADAELIAQoAlALNgIUIAQoAhRFBEAgBEJ/NwNYDAcLIAQoAkAoAoQBIAQoAhQpAwAgBCgCFCgCCCAEKAJAEGdBAEgEQCAEQn83A1gMBwsgBEIANwNYDAYLIAQpA0hCOFQEQCAEQn83A1gMBgsCfyMAQRBrIgAgBCgCQEHYAGo2AgwgACgCDCgCAAsEQCAEKAJAAn8jAEEQayIAIAQoAkBB2ABqNgIMIAAoAgwoAgALAn8jAEEQayIAIAQoAkBB2ABqNgIMIAAoAgwoAgQLEBUgBEJ/NwNYDAYLIAQoAlAiACAEKAJAIgEpACA3AAAgACABKQBQNwAwIAAgASkASDcAKCAAIAEpAEA3ACAgACABKQA4NwAYIAAgASkAMDcAECAAIAEpACg3AAggBEI4NwNYDAULIAQgBCgCQCkDEDcDWAwECyAEIAQoAkApA3g3A1gMAwsgBCAEKAJAKAKEARCbATcDCCAEKQMIQgBTBEAgBCgCQEEeQbScASgCABAVIARCfzcDWAwDCyAEIAQpAwg3A1gMAgsCQCAEKAJAKAKEASIAKAJMQQBOBEAgACAAKAIAQU9xNgIADAELIAAgACgCAEFPcTYCAAsgBCAEKAJQIAQpA0inIAQoAkAoAoQBEK0CNgIEAkAgBCkDSCAEKAIErVEEQAJ/IAQoAkAoAoQBIgAoAkxBf0wEQCAAKAIADAELIAAoAgALQQV2QQFxRQ0BCyAEKAJAQQZBtJwBKAIAEBUgBEJ/NwNYDAILIAQgBCgCBK03A1gMAQsgBCgCQEEcQQAQFSAEQn83A1gLIAQpA1ghAiAEQeAAaiQAIAILoAkBAX8jAEGgAWsiBCQAIAQgADYCmAEgBEEANgKUASAEIAE3A4gBIAQgAjcDgAEgBEEANgJ8IAQgAzYCeAJAAkAgBCgClAENACAEKAKYAQ0AIAQoAnhBEkEAEBUgBEEANgKcAQwBCyAEKQOAAUIAUwRAIARCADcDgAELAkAgBCkDiAFC////////////AFgEQCAEKQOIASAEKQOAAXwgBCkDiAFaDQELIAQoAnhBEkEAEBUgBEEANgKcAQwBCyAEQYgBEBkiADYCdCAARQRAIAQoAnhBDkEAEBUgBEEANgKcAQwBCyAEKAJ0QQA2AhggBCgCmAEEQCAEKAKYARCPAiEAIAQoAnQgADYCGCAARQRAIAQoAnhBDkEAEBUgBCgCdBAWIARBADYCnAEMAgsLIAQoAnQgBCgClAE2AhwgBCgCdCAEKQOIATcDaCAEKAJ0IAQpA4ABNwNwAkAgBCgCfARAIAQoAnQiACAEKAJ8IgMpAwA3AyAgACADKQMwNwNQIAAgAykDKDcDSCAAIAMpAyA3A0AgACADKQMYNwM4IAAgAykDEDcDMCAAIAMpAwg3AyggBCgCdEEANgIoIAQoAnQiACAAKQMgQv7///8PgzcDIAwBCyAEKAJ0QSBqEDwLIAQoAnQpA3BCAFYEQCAEKAJ0IAQoAnQpA3A3AzggBCgCdCIAIAApAyBCBIQ3AyALIwBBEGsiACAEKAJ0QdgAajYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCAEKAJ0QQA2AoABIAQoAnRBADYChAEjAEEQayIAIAQoAnQ2AgwgACgCDEEANgIAIAAoAgxBADYCBCAAKAIMQQA2AgggBEF/NgIEIARBBzYCAEEOIAQQN0I/hCEBIAQoAnQgATcDEAJAIAQoAnQoAhgEQCAEIAQoAnQoAhggBEEYahCeAUEATjoAFyAELQAXQQFxRQRAAkAgBCgCdCkDaFBFDQAgBCgCdCkDcFBFDQAgBCgCdEL//wM3AxALCwwBCyAEAn8CQCAEKAJ0KAIcIgAoAkxBAEgNAAsgACgCPAsgBEEYahCMAkEATjoAFwsCQCAELQAXQQFxRQRAIAQoAnRB2ABqQQVBtJwBKAIAEBUMAQsgBCgCdCkDIEIQg1AEQCAEKAJ0IAQoAlg2AkggBCgCdCIAIAApAyBCEIQ3AyALIAQoAiRBgOADcUGAgAJGBEAgBCgCdEL/gQE3AxAgBCgCdCkDaCAEKAJ0KQNwfCAEKQNAVgRAIAQoAnhBEkEAEBUgBCgCdCgCGBAWIAQoAnQQFiAEQQA2ApwBDAMLIAQoAnQpA3BQBEAgBCgCdCAEKQNAIAQoAnQpA2h9NwM4IAQoAnQiACAAKQMgQgSENwMgAkAgBCgCdCgCGEUNACAEKQOIAVBFDQAgBCgCdEL//wM3AxALCwsLIAQoAnQiACAAKQMQQoCAEIQ3AxAgBEEeIAQoAnQgBCgCeBCVASIANgJwIABFBEAgBCgCdCgCGBAWIAQoAnQQFiAEQQA2ApwBDAELIAQgBCgCcDYCnAELIAQoApwBIQAgBEGgAWokACAACwkAIAAoAjwQBQv3AQEEfyMAQSBrIgMkACADIAE2AhAgAyACIAAoAjAiBEEAR2s2AhQgACgCLCEFIAMgBDYCHCADIAU2AhgCQAJAAn8Cf0EAIAAoAjwgA0EQakECIANBDGoQDSIERQ0AGkG0nAEgBDYCAEF/CwRAIANBfzYCDEF/DAELIAMoAgwiBEEASg0BIAQLIQIgACAAKAIAIAJBMHFBEHNyNgIADAELIAQgAygCFCIGTQRAIAQhAgwBCyAAIAAoAiwiBTYCBCAAIAUgBCAGa2o2AgggACgCMEUNACAAIAVBAWo2AgQgASACakF/aiAFLQAAOgAACyADQSBqJAAgAguBAwEHfyMAQSBrIgMkACADIAAoAhwiBTYCECAAKAIUIQQgAyACNgIcIAMgATYCGCADIAQgBWsiATYCFCABIAJqIQVBAiEHIANBEGohAQJ/AkACQAJ/QQAgACgCPCADQRBqQQIgA0EMahADIgRFDQAaQbScASAENgIAQX8LRQRAA0AgBSADKAIMIgRGDQIgBEF/TA0DIAEgBCABKAIEIghLIgZBA3RqIgkgBCAIQQAgBhtrIgggCSgCAGo2AgAgAUEMQQQgBhtqIgkgCSgCACAIazYCACAFIARrIQUCf0EAIAAoAjwgAUEIaiABIAYbIgEgByAGayIHIANBDGoQAyIERQ0AGkG0nAEgBDYCAEF/C0UNAAsLIANBfzYCDCAFQX9HDQELIAAgACgCLCIBNgIcIAAgATYCFCAAIAEgACgCMGo2AhAgAgwBCyAAQQA2AhwgAEIANwMQIAAgACgCAEEgcjYCAEEAIAdBAkYNABogAiABKAIEawshACADQSBqJAAgAAtgAQF/IwBBEGsiAyQAAn4Cf0EAIAAoAjwgAacgAUIgiKcgAkH/AXEgA0EIahALIgBFDQAaQbScASAANgIAQX8LRQRAIAMpAwgMAQsgA0J/NwMIQn8LIQEgA0EQaiQAIAEL2gEBAn8CQCABQf8BcSIDBEAgAEEDcQRAA0AgAC0AACICRQ0DIAIgAUH/AXFGDQMgAEEBaiIAQQNxDQALCwJAIAAoAgAiAkF/cyACQf/9+3dqcUGAgYKEeHENACADQYGChAhsIQMDQCACIANzIgJBf3MgAkH//ft3anFBgIGChHhxDQEgACgCBCECIABBBGohACACQf/9+3dqIAJBf3NxQYCBgoR4cUUNAAsLA0AgACICLQAAIgMEQCACQQFqIQAgAyABQf8BcUcNAQsLIAIPCyAAECwgAGoPCyAAC8UDAQF/IwBBMGsiAiQAIAIgADYCKCACIAE2AiQgAkEANgIQIAIgAigCKCACKAIoECxqNgIYIAIgAigCGEF/ajYCHANAIAIoAhwgAigCKE8EfyACKAIcLAAAQdgARgVBAAtBAXEEQCACIAIoAhBBAWo2AhAgAiACKAIcQX9qNgIcDAELCwJAIAIoAhBFBEBBtJwBQRw2AgAgAkF/NgIsDAELIAIgAigCHEEBajYCHANAIAIQhgI2AgwgAiACKAIcNgIUA0AgAigCFCACKAIYSQRAIAIgAigCDEEkcDoACwJ/IAIsAAtBCkgEQCACLAALQTBqDAELIAIsAAtB1wBqCyEAIAIgAigCFCIBQQFqNgIUIAEgADoAACACIAIoAgxBJG42AgwMAQsLIAIoAighACACAn9BtgMgAigCJEF/Rg0AGiACKAIkCzYCACACIABBwoEgIAIQaSIANgIgIABBAE4EQCACKAIkQX9HBEAgAigCKCACKAIkEA8iAEGBYE8Ef0G0nAFBACAAazYCAEEABSAACxoLIAIgAigCIDYCLAwCC0G0nAEoAgBBFEYNAAsgAkF/NgIsCyACKAIsIQAgAkEwaiQAIAALVwECfyMAQRBrIgAkAAJAIABBCGoQhwJBAXEEQCAAIAAoAgg2AgwMAQtBlKEBLQAAQQFxRQRAQQAQARCJAgsgABCIAjYCDAsgACgCDCEBIABBEGokACABC6UBAQF/IwBBEGsiASQAIAEgADYCCCABQQQ7AQYgAUHnlwFBAEEAEGkiADYCAAJAIABBAEgEQCABQQA6AA8MAQsgASgCACABKAIIIAEvAQYQECIAQYFgTwR/QbScAUEAIABrNgIAQX8FIAALIAEvAQZHBEAgASgCABBoIAFBADoADwwBCyABKAIAEGggAUEBOgAPCyABLQAPQQFxIQAgAUEQaiQAIAALoQEBBH9BzJoBKAIAIQACQEHImgEoAgAiA0UEQCAAIAAoAgBB7ZyZjgRsQbngAGpB/////wdxIgA2AgAMAQsgAEHQmgEoAgAiAkECdGoiASABKAIAIABBkKEBKAIAIgFBAnRqKAIAaiIANgIAQZChAUEAIAFBAWoiASABIANGGzYCAEHQmgFBACACQQFqIgIgAiADRhs2AgAgAEEBdiEACyAAC6MBAgN/AX5ByJoBKAIAIgFFBEBBzJoBKAIAIAA2AgAPC0HQmgFBA0EDQQEgAUEHRhsgAUEfRhs2AgBBkKEBQQA2AgACQCABQQBMBEBBzJoBKAIAIQIMAQtBzJoBKAIAIQIgAK0hBANAIAIgA0ECdGogBEKt/tXk1IX9qNgAfkIBfCIEQiCIPgIAIANBAWoiAyABRw0ACwsgAiACKAIAQQFyNgIAC7EBAQJ/IAIoAkxBAE4Ef0EBBUEACxogAiACLQBKIgNBf2ogA3I6AEoCfyABIAIoAgggAigCBCIEayIDQQFIDQAaIAAgBCADIAEgAyABSRsiAxAaGiACIAIoAgQgA2o2AgQgACADaiEAIAEgA2sLIgMEQANAAkAgAhCLAkUEQCACIAAgAyACKAIgEQEAIgRBAWpBAUsNAQsgASADaw8LIAAgBGohACADIARrIgMNAAsLIAELfAECfyAAIAAtAEoiAUF/aiABcjoASiAAKAIUIAAoAhxLBEAgAEEAQQAgACgCJBEBABoLIABBADYCHCAAQgA3AxAgACgCACIBQQRxBEAgACABQSByNgIAQX8PCyAAIAAoAiwgACgCMGoiAjYCCCAAIAI2AgQgAUEbdEEfdQt2AQJ/IwBBIGsiAiQAAn8CQCAAIAEQCSIDQXhGBEAgABCOAg0BCyADQYFgTwR/QbScAUEAIANrNgIAQX8FIAMLDAELIAIgABCNAiACIAEQAiIAQYFgTwR/QbScAUEAIABrNgIAQX8FIAALCyEAIAJBIGokACAAC54BAQN/A0AgACACaiIDIAJB2JcBai0AADoAACACQQ5HIQQgAkEBaiECIAQNAAsgAQRAQQ4hAiABIQMDQCACQQFqIQIgA0EJSyEEIANBCm4hAyAEDQALIAAgAmpBADoAAANAIAAgAkF/aiICaiABIAFBCm4iA0EKbGtBMHI6AAAgAUEJSyEEIAMhASAEDQALDwsgA0EwOgAAIABBADoADws3AQF/IwBBIGsiASQAAn9BASAAIAFBCGoQCCIARQ0AGkG0nAEgADYCAEEACyEAIAFBIGokACAACyABAn8gABAsQQFqIgEQGSICRQRAQQAPCyACIAAgARAaC6UBAQF/IwBBIGsiAiAANgIUIAIgATYCEAJAIAIoAhRFBEAgAkJ/NwMYDAELIAIoAhBBCHEEQCACIAIoAhQpAzA3AwgDQEEAIQAgAikDCEIAVgR/IAIoAhQoAkAgAikDCEIBfadBBHRqKAIARQVBAAtBAXEEQCACIAIpAwhCf3w3AwgMAQsLIAIgAikDCDcDGAwBCyACIAIoAhQpAzA3AxgLIAIpAxgL8gEBAX8jAEEgayIDJAAgAyAANgIUIAMgATYCECADIAI3AwgCQCADKAIURQRAIANCfzcDGAwBCyADKAIUKAIEBEAgA0J/NwMYDAELIAMpAwhC////////////AFYEQCADKAIUQQRqQRJBABAVIANCfzcDGAwBCwJAIAMoAhQtABBBAXFFBEAgAykDCFBFDQELIANCADcDGAwBCyADIAMoAhQoAhQgAygCECADKQMIEC8iAjcDACACQgBTBEAgAygCFEEEaiADKAIUKAIUEBggA0J/NwMYDAELIAMgAykDADcDGAsgAykDGCECIANBIGokACACC0cBAX8jAEEgayIDJAAgAyAANgIcIAMgATcDECADIAI2AgwgAygCHCADKQMQIAMoAgwgAygCHCgCHBCfASEAIANBIGokACAAC38CAX8BfiMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCECADIAMoAhggAygCFCADKAIQEG4iBDcDCAJAIARCAFMEQCADQQA2AhwMAQsgAyADKAIYIAMpAwggAygCECADKAIYKAIcEJ8BNgIcCyADKAIcIQAgA0EgaiQAIAALqgEBAX8jAEEQayIBJAAgASAANgIIIAFBGBAZIgA2AgQCQCAARQRAIAEoAghBCGpBDkEAEBUgAUEANgIMDAELIAEoAgQgASgCCDYCACMAQRBrIgAgASgCBEEEajYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCABKAIEQQA6ABAgASgCBEEANgIUIAEgASgCBDYCDAsgASgCDCEAIAFBEGokACAAC6EBAQF/IwBBEGsiASQAIAEgADYCCAJAIAEoAggoAiRBA0YEQCABQQA2AgwMAQsgASgCCCgCIEEASwRAIAEoAggQMkEASARAIAFBfzYCDAwCCwsgASgCCCgCJARAIAEoAggQbQsgASgCCEEAQgBBDxAiQgBTBEAgAUF/NgIMDAELIAEoAghBAzYCJCABQQA2AgwLIAEoAgwhACABQRBqJAAgAAsHACAAKAIIC9UDAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE3AxAgBCACNgIMIAQgAzYCCAJAIAQoAhggBCkDEEEAQQAQRUUEQCAEQX82AhwMAQsgBCgCGCgCGEECcQRAIAQoAhhBCGpBGUEAEBUgBEF/NgIcDAELIAQoAhgoAkAgBCkDEKdBBHRqKAIIBEAgBCgCGCgCQCAEKQMQp0EEdGooAgggBCgCDBBsQQBIBEAgBCgCGEEIakEPQQAQFSAEQX82AhwMAgsgBEEANgIcDAELIAQgBCgCGCgCQCAEKQMQp0EEdGo2AgRBASEAIAQgBCgCBCgCAAR/IAQoAgwgBCgCBCgCACgCFEcFQQELQQFxNgIAAkAgBCgCAARAIAQoAgQoAgRFBEAgBCgCBCgCABBGIQAgBCgCBCAANgIEIABFBEAgBCgCGEEIakEOQQAQFSAEQX82AhwMBAsLIAQoAgQoAgQgBCgCDDYCFCAEKAIEKAIEIgAgACgCAEEgcjYCAAwBCyAEKAIEKAIEBEAgBCgCBCgCBCIAIAAoAgBBX3E2AgAgBCgCBCgCBCgCAEUEQCAEKAIEKAIEEDogBCgCBEEANgIECwsLIARBADYCHAsgBCgCHCEAIARBIGokACAACxgBAX8jAEEQayIBIAA2AgwgASgCDEEEagsYAQF/IwBBEGsiASAANgIMIAEoAgxBCGoLgwECAX8BfiMAQSBrIgQkACAEIAA2AhQgBCABNgIQIAQgAjYCDCAEIAM2AggCQAJAIAQoAhAEQCAEKAIMDQELIAQoAhRBCGpBEkEAEBUgBEJ/NwMYDAELIAQgBCgCFCAEKAIQIAQoAgwgBCgCCBCiATcDGAsgBCkDGCEFIARBIGokACAFC2kBAX8jAEEQayIBJAAgASAANgIMIAEoAgwoAhQEQCABKAIMKAIUEBwLIAFBADYCCCABKAIMKAIEBEAgASABKAIMKAIENgIICyABKAIMQQRqEDggASgCDBAWIAEoAgghACABQRBqJAAgAAu3AwIBfwF+IwBBMGsiAyQAIAMgADYCJCADIAE2AiAgAyACNgIcAkAgAygCJCgCGEECcQRAIAMoAiRBCGpBGUEAEBUgA0J/NwMoDAELIAMoAiBFBEAgAygCJEEIakESQQAQFSADQn83AygMAQsgA0EANgIMIAMgAygCIBAsNgIYIAMoAiAgAygCGEEBa2osAABBL0cEQCADIAMoAhhBAmoQGSIANgIMIABFBEAgAygCJEEIakEOQQAQFSADQn83AygMAgsgAygCDCADKAIgEKMCIAMoAgwgAygCGGpBLzoAACADKAIMIAMoAhhBAWpqQQA6AAALIAMgAygCJEEAQgBBABB5IgA2AgggAEUEQCADKAIMEBYgA0J/NwMoDAELIAMgAygCJAJ/IAMoAgwEQCADKAIMDAELIAMoAiALIAMoAgggAygCHBCiATcDECADKAIMEBYCQCADKQMQQgBTBEAgAygCCBAcDAELIAMoAiQgAykDEEEAQQNBgID8jwQQoQFBAEgEQCADKAIkIAMpAxAQnQIgA0J/NwMoDAILCyADIAMpAxA3AygLIAMpAyghBCADQTBqJAAgBAuCAgEBfyMAQSBrIgIkACACIAA2AhggAiABNwMQAkAgAikDECACKAIYKQMwWgRAIAIoAhhBCGpBEkEAEBUgAkF/NgIcDAELIAIoAhgoAhhBAnEEQCACKAIYQQhqQRlBABAVIAJBfzYCHAwBCyACIAIoAhggAikDEEEAIAIoAhhBCGoQTiIANgIMIABFBEAgAkF/NgIcDAELIAIoAhgoAlAgAigCDCACKAIYQQhqEFlBAXFFBEAgAkF/NgIcDAELIAIoAhggAikDEBCeAgRAIAJBfzYCHAwBCyACKAIYKAJAIAIpAxCnQQR0akEBOgAMIAJBADYCHAsgAigCHBogAkEgaiQAC5cEAQF/IwBBMGsiAiQAIAIgADYCKCACIAE3AyAgAkEBNgIcAkAgAikDICACKAIoKQMwWgRAIAIoAihBCGpBEkEAEBUgAkF/NgIsDAELAkAgAigCHA0AIAIoAigoAkAgAikDIKdBBHRqKAIERQ0AIAIoAigoAkAgAikDIKdBBHRqKAIEKAIAQQJxRQ0AAkAgAigCKCgCQCACKQMgp0EEdGooAgAEQCACIAIoAiggAikDIEEIIAIoAihBCGoQTiIANgIMIABFBEAgAkF/NgIsDAQLIAIgAigCKCACKAIMQQBBABBVNwMQAkAgAikDEEIAUw0AIAIpAxAgAikDIFENACACKAIoQQhqQQpBABAVIAJBfzYCLAwECwwBCyACQQA2AgwLIAIgAigCKCACKQMgQQAgAigCKEEIahBOIgA2AgggAEUEQCACQX82AiwMAgsgAigCDARAIAIoAigoAlAgAigCDCACKQMgQQAgAigCKEEIahB8QQFxRQRAIAJBfzYCLAwDCwsgAigCKCgCUCACKAIIIAIoAihBCGoQWUEBcUUEQCACKAIoKAJQIAIoAgxBABBZGiACQX82AiwMAgsLIAIoAigoAkAgAikDIKdBBHRqKAIEEDogAigCKCgCQCACKQMgp0EEdGpBADYCBCACKAIoKAJAIAIpAyCnQQR0ahBjIAJBADYCLAsgAigCLCEAIAJBMGokACAAC5kIAQF/IwBBQGoiBCQAIAQgADYCOCAEIAE3AzAgBCACNgIsIAQgAzYCKAJAIAQpAzAgBCgCOCkDMFoEQCAEKAI4QQhqQRJBABAVIARBfzYCPAwBCyAEKAI4KAIYQQJxBEAgBCgCOEEIakEZQQAQFSAEQX82AjwMAQsCQAJAIAQoAixFDQAgBCgCLCwAAEUNACAEIAQoAiwgBCgCLBAsQf//A3EgBCgCKCAEKAI4QQhqEFEiADYCICAARQRAIARBfzYCPAwDCwJAIAQoAihBgDBxDQAgBCgCIEEAEDtBA0cNACAEKAIgQQI2AggLDAELIARBADYCIAsgBCAEKAI4IAQoAixBAEEAEFUiATcDEAJAIAFCAFMNACAEKQMQIAQpAzBRDQAgBCgCIBAmIAQoAjhBCGpBCkEAEBUgBEF/NgI8DAELAkAgBCkDEEIAUw0AIAQpAxAgBCkDMFINACAEKAIgECYgBEEANgI8DAELIAQgBCgCOCgCQCAEKQMwp0EEdGo2AiQCQCAEKAIkKAIABEAgBCAEKAIkKAIAKAIwIAQoAiAQiQFBAEc6AB8MAQsgBEEAOgAfCwJAIAQtAB9BAXENACAEKAIkKAIEDQAgBCgCJCgCABBGIQAgBCgCJCAANgIEIABFBEAgBCgCOEEIakEOQQAQFSAEKAIgECYgBEF/NgI8DAILCyAEAn8gBC0AH0EBcQRAIAQoAiQoAgAoAjAMAQsgBCgCIAtBAEEAIAQoAjhBCGoQRyIANgIIIABFBEAgBCgCIBAmIARBfzYCPAwBCwJAIAQoAiQoAgQEQCAEIAQoAiQoAgQoAjA2AgQMAQsCQCAEKAIkKAIABEAgBCAEKAIkKAIAKAIwNgIEDAELIARBADYCBAsLAkAgBCgCBARAIAQgBCgCBEEAQQAgBCgCOEEIahBHIgA2AgwgAEUEQCAEKAIgECYgBEF/NgI8DAMLDAELIARBADYCDAsgBCgCOCgCUCAEKAIIIAQpAzBBACAEKAI4QQhqEHxBAXFFBEAgBCgCIBAmIARBfzYCPAwBCyAEKAIMBEAgBCgCOCgCUCAEKAIMQQAQWRoLAkAgBC0AH0EBcQRAIAQoAiQoAgQEQCAEKAIkKAIEKAIAQQJxBEAgBCgCJCgCBCgCMBAmIAQoAiQoAgQiACAAKAIAQX1xNgIAAkAgBCgCJCgCBCgCAEUEQCAEKAIkKAIEEDogBCgCJEEANgIEDAELIAQoAiQoAgQgBCgCJCgCACgCMDYCMAsLCyAEKAIgECYMAQsgBCgCJCgCBCgCAEECcQRAIAQoAiQoAgQoAjAQJgsgBCgCJCgCBCIAIAAoAgBBAnI2AgAgBCgCJCgCBCAEKAIgNgIwCyAEQQA2AjwLIAQoAjwhACAEQUBrJAAgAAvfAgIBfwF+IwBBQGoiASQAIAEgADYCNAJAIAEoAjQpAzBCAXwgASgCNCkDOFoEQCABIAEoAjQpAzg3AxggASABKQMYQgGGNwMQAkAgASkDEEIQVARAIAFCEDcDEAwBCyABKQMQQoAIVgRAIAFCgAg3AxALCyABIAEpAxAgASkDGHw3AxggASABKQMYp0EEdK03AwggASgCNCkDOKdBBHStIAEpAwhWBEAgASgCNEEIakEOQQAQFSABQn83AzgMAgsgASABKAI0KAJAIAEpAxinQQR0EE82AiQgASgCJEUEQCABKAI0QQhqQQ5BABAVIAFCfzcDOAwCCyABKAI0IAEoAiQ2AkAgASgCNCABKQMYNwM4CyABKAI0IgApAzAhAiAAIAJCAXw3AzAgASACNwMoIAEoAjQoAkAgASkDKKdBBHRqEI4BIAEgASkDKDcDOAsgASkDOCECIAFBQGskACACCyYBAX8DQCABRQRAQQAPCyAAIAFBf2oiAWoiAi0AAEEvRw0ACyACC6kBAQN/AkAgAC0AACICRQ0AA0AgAS0AACIERQRAIAIhAwwCCwJAIAIgBEYNACACQSByIAIgAkG/f2pBGkkbIAEtAAAiAkEgciACIAJBv39qQRpJG0YNACAALQAAIQMMAgsgAUEBaiEBIAAtAAEhAiAAQQFqIQAgAg0ACwsgA0H/AXEiAEEgciAAIABBv39qQRpJGyABLQAAIgBBIHIgACAAQb9/akEaSRtrC8gBAQF/AkACQCAAIAFzQQNxDQAgAUEDcQRAA0AgACABLQAAIgI6AAAgAkUNAyAAQQFqIQAgAUEBaiIBQQNxDQALCyABKAIAIgJBf3MgAkH//ft3anFBgIGChHhxDQADQCAAIAI2AgAgASgCBCECIABBBGohACABQQRqIQEgAkH//ft3aiACQX9zcUGAgYKEeHFFDQALCyAAIAEtAAAiAjoAACACRQ0AA0AgACABLQABIgI6AAEgAEEBaiEAIAFBAWohASACDQALCwvoAwEDfyMAQbABayIBJAAgASAANgKoASABKAKoARA4AkACQCABKAKoASgCAEEATgRAIAEoAqgBKAIAQaAOKAIASA0BCyABIAEoAqgBKAIANgIQIAFBIGpBvJcBIAFBEGoQbyABQQA2AqQBIAEgAUEgajYCoAEMAQsgASABKAKoASgCAEECdEGgDWooAgA2AqQBAkACQAJAAkAgASgCqAEoAgBBAnRBsA5qKAIAQX9qDgIAAQILIAEgASgCqAEoAgRBkJoBKAIAEKUCNgKgAQwCCyMAQRBrIgAgASgCqAEoAgQ2AgwgAUEAIAAoAgxrQQJ0QdjUAGooAgA2AqABDAELIAFBADYCoAELCwJAIAEoAqABRQRAIAEgASgCpAE2AqwBDAELIAEgASgCoAEQLAJ/IAEoAqQBBEAgASgCpAEQLEECagwBC0EAC2pBAWoQGSIANgIcIABFBEAgAUHYDSgCADYCrAEMAQsgASgCHCEAAn8gASgCpAEEQCABKAKkAQwBC0HUlwELIQJB1ZcBQdSXASABKAKkARshAyABIAEoAqABNgIIIAEgAzYCBCABIAI2AgAgAEHNlwEgARBvIAEoAqgBIAEoAhw2AgggASABKAIcNgKsAQsgASgCrAEhACABQbABaiQAIAALcQEDfwJAAkADQCAAIAJB0IgBai0AAEcEQEHXACEDIAJBAWoiAkHXAEcNAQwCCwsgAiIDDQBBsIkBIQAMAQtBsIkBIQIDQCACLQAAIQQgAkEBaiIAIQIgBA0AIAAhAiADQX9qIgMNAAsLIAEoAhQaIAALMwEBfyAAKAIUIgMgASACIAAoAhAgA2siASABIAJLGyIBEBoaIAAgACgCFCABajYCFCACC4oBAQJ/IwBBoAFrIgMkACADQQhqQbiHAUGQARAaGiADIAA2AjQgAyAANgIcIANBfiAAayIEQf////8HQf////8HIARLGyIENgI4IAMgACAEaiIANgIkIAMgADYCGCADQQhqIAEgAhCsAiAEBEAgAygCHCIAIAAgAygCGEZrQQA6AAALIANBoAFqJAALKQAgASABKAIAQQ9qQXBxIgFBEGo2AgAgACABKQMAIAEpAwgQsgI5AwALgBcDEX8CfgF8IwBBsARrIgkkACAJQQA2AiwCfyABvSIXQn9XBEBBASERIAGaIgG9IRdBkIcBDAELIARBgBBxBEBBASERQZOHAQwBC0GWhwFBkYcBIARBAXEiERsLIRUCQCAXQoCAgICAgID4/wCDQoCAgICAgID4/wBRBEAgAEEgIAIgEUEDaiIMIARB//97cRAnIAAgFSARECMgAEGrhwFBr4cBIAVBBXZBAXEiAxtBo4cBQaeHASADGyABIAFiG0EDECMMAQsgCUEQaiEQAkACfwJAIAEgCUEsahClASIBIAGgIgFEAAAAAAAAAABiBEAgCSAJKAIsIgZBf2o2AiwgBUEgciIPQeEARw0BDAMLIAVBIHIiD0HhAEYNAiAJKAIsIQtBBiADIANBAEgbDAELIAkgBkFjaiILNgIsIAFEAAAAAAAAsEGiIQFBBiADIANBAEgbCyEKIAlBMGogCUHQAmogC0EASBsiDiEIA0AgCAJ/IAFEAAAAAAAA8EFjIAFEAAAAAAAAAABmcQRAIAGrDAELQQALIgM2AgAgCEEEaiEIIAEgA7ihRAAAAABlzc1BoiIBRAAAAAAAAAAAYg0ACwJAIAtBAUgEQCALIQMgCCEGIA4hBwwBCyAOIQcgCyEDA0AgA0EdIANBHUgbIQ0CQCAIQXxqIgYgB0kNACANrSEYQgAhFwNAIAYgF0L/////D4MgBjUCACAYhnwiFyAXQoCU69wDgCIXQoCU69wDfn0+AgAgBkF8aiIGIAdPDQALIBenIgNFDQAgB0F8aiIHIAM2AgALA0AgCCIGIAdLBEAgBkF8aiIIKAIARQ0BCwsgCSAJKAIsIA1rIgM2AiwgBiEIIANBAEoNAAsLIANBf0wEQCAKQRlqQQltQQFqIRIgD0HmAEYhFgNAQQlBACADayADQXdIGyEMAkAgByAGTwRAIAcgB0EEaiAHKAIAGyEHDAELQYCU69wDIAx2IRRBfyAMdEF/cyETQQAhAyAHIQgDQCAIIAMgCCgCACINIAx2ajYCACANIBNxIBRsIQMgCEEEaiIIIAZJDQALIAcgB0EEaiAHKAIAGyEHIANFDQAgBiADNgIAIAZBBGohBgsgCSAJKAIsIAxqIgM2AiwgDiAHIBYbIgggEkECdGogBiAGIAhrQQJ1IBJKGyEGIANBAEgNAAsLQQAhCAJAIAcgBk8NACAOIAdrQQJ1QQlsIQhBCiEDIAcoAgAiDUEKSQ0AA0AgCEEBaiEIIA0gA0EKbCIDTw0ACwsgCkEAIAggD0HmAEYbayAPQecARiAKQQBHcWsiAyAGIA5rQQJ1QQlsQXdqSARAIANBgMgAaiITQQltIg1BAnQgCUEwakEEciAJQdQCaiALQQBIG2pBgGBqIQxBCiEDIBMgDUEJbGsiDUEHTARAA0AgA0EKbCEDIA1BAWoiDUEIRw0ACwsCQEEAIAYgDEEEaiISRiAMKAIAIhMgEyADbiINIANsayIUGw0ARAAAAAAAAOA/RAAAAAAAAPA/RAAAAAAAAPg/IBQgA0EBdiILRhtEAAAAAAAA+D8gBiASRhsgFCALSRshGUQBAAAAAABAQ0QAAAAAAABAQyANQQFxGyEBAkAgEUUNACAVLQAAQS1HDQAgGZohGSABmiEBCyAMIBMgFGsiCzYCACABIBmgIAFhDQAgDCADIAtqIgM2AgAgA0GAlOvcA08EQANAIAxBADYCACAMQXxqIgwgB0kEQCAHQXxqIgdBADYCAAsgDCAMKAIAQQFqIgM2AgAgA0H/k+vcA0sNAAsLIA4gB2tBAnVBCWwhCEEKIQMgBygCACILQQpJDQADQCAIQQFqIQggCyADQQpsIgNPDQALCyAMQQRqIgMgBiAGIANLGyEGCwJ/A0BBACAGIgsgB00NARogC0F8aiIGKAIARQ0AC0EBCyEWAkAgD0HnAEcEQCAEQQhxIQ8MAQsgCEF/c0F/IApBASAKGyIGIAhKIAhBe0pxIgMbIAZqIQpBf0F+IAMbIAVqIQUgBEEIcSIPDQBBCSEGAkAgFkUNACALQXxqKAIAIgNFDQBBCiENQQAhBiADQQpwDQADQCAGQQFqIQYgAyANQQpsIg1wRQ0ACwsgCyAOa0ECdUEJbEF3aiEDIAVBX3FBxgBGBEBBACEPIAogAyAGayIDQQAgA0EAShsiAyAKIANIGyEKDAELQQAhDyAKIAMgCGogBmsiA0EAIANBAEobIgMgCiADSBshCgsgCiAPciIUQQBHIRMgAEEgIAICfyAIQQAgCEEAShsgBUFfcSINQcYARg0AGiAQIAggCEEfdSIDaiADc60gEBBCIgZrQQFMBEADQCAGQX9qIgZBMDoAACAQIAZrQQJIDQALCyAGQX5qIhIgBToAACAGQX9qQS1BKyAIQQBIGzoAACAQIBJrCyAKIBFqIBNqakEBaiIMIAQQJyAAIBUgERAjIABBMCACIAwgBEGAgARzECcCQAJAAkAgDUHGAEYEQCAJQRBqQQhyIQMgCUEQakEJciEIIA4gByAHIA5LGyIFIQcDQCAHNQIAIAgQQiEGAkAgBSAHRwRAIAYgCUEQak0NAQNAIAZBf2oiBkEwOgAAIAYgCUEQaksNAAsMAQsgBiAIRw0AIAlBMDoAGCADIQYLIAAgBiAIIAZrECMgB0EEaiIHIA5NDQALIBQEQCAAQbOHAUEBECMLIAcgC08NASAKQQFIDQEDQCAHNQIAIAgQQiIGIAlBEGpLBEADQCAGQX9qIgZBMDoAACAGIAlBEGpLDQALCyAAIAYgCkEJIApBCUgbECMgCkF3aiEGIAdBBGoiByALTw0DIApBCUohAyAGIQogAw0ACwwCCwJAIApBAEgNACALIAdBBGogFhshBSAJQRBqQQhyIQMgCUEQakEJciELIAchCANAIAsgCDUCACALEEIiBkYEQCAJQTA6ABggAyEGCwJAIAcgCEcEQCAGIAlBEGpNDQEDQCAGQX9qIgZBMDoAACAGIAlBEGpLDQALDAELIAAgBkEBECMgBkEBaiEGIA9FQQAgCkEBSBsNACAAQbOHAUEBECMLIAAgBiALIAZrIgYgCiAKIAZKGxAjIAogBmshCiAIQQRqIgggBU8NASAKQX9KDQALCyAAQTAgCkESakESQQAQJyAAIBIgECASaxAjDAILIAohBgsgAEEwIAZBCWpBCUEAECcLDAELIBVBCWogFSAFQSBxIgsbIQoCQCADQQtLDQBBDCADayIGRQ0ARAAAAAAAACBAIRkDQCAZRAAAAAAAADBAoiEZIAZBf2oiBg0ACyAKLQAAQS1GBEAgGSABmiAZoaCaIQEMAQsgASAZoCAZoSEBCyAQIAkoAiwiBiAGQR91IgZqIAZzrSAQEEIiBkYEQCAJQTA6AA8gCUEPaiEGCyARQQJyIQ4gCSgCLCEIIAZBfmoiDSAFQQ9qOgAAIAZBf2pBLUErIAhBAEgbOgAAIARBCHEhCCAJQRBqIQcDQCAHIgUCfyABmUQAAAAAAADgQWMEQCABqgwBC0GAgICAeAsiBkGAhwFqLQAAIAtyOgAAIAEgBrehRAAAAAAAADBAoiEBAkAgBUEBaiIHIAlBEGprQQFHDQACQCAIDQAgA0EASg0AIAFEAAAAAAAAAABhDQELIAVBLjoAASAFQQJqIQcLIAFEAAAAAAAAAABiDQALIABBICACIA4CfwJAIANFDQAgByAJa0FuaiADTg0AIAMgEGogDWtBAmoMAQsgECAJQRBqayANayAHagsiA2oiDCAEECcgACAKIA4QIyAAQTAgAiAMIARBgIAEcxAnIAAgCUEQaiAHIAlBEGprIgUQIyAAQTAgAyAFIBAgDWsiA2prQQBBABAnIAAgDSADECMLIABBICACIAwgBEGAwABzECcgCUGwBGokACACIAwgDCACSBsLLQAgAFBFBEADQCABQX9qIgEgAKdBB3FBMHI6AAAgAEIDiCIAQgBSDQALCyABCzUAIABQRQRAA0AgAUF/aiIBIACnQQ9xQYCHAWotAAAgAnI6AAAgAEIEiCIAQgBSDQALCyABC8sCAQN/IwBB0AFrIgMkACADIAI2AswBQQAhAiADQaABakEAQSgQMyADIAMoAswBNgLIAQJAQQAgASADQcgBaiADQdAAaiADQaABahBwQQBIDQAgACgCTEEATgRAQQEhAgsgACgCACEEIAAsAEpBAEwEQCAAIARBX3E2AgALIARBIHEhBQJ/IAAoAjAEQCAAIAEgA0HIAWogA0HQAGogA0GgAWoQcAwBCyAAQdAANgIwIAAgA0HQAGo2AhAgACADNgIcIAAgAzYCFCAAKAIsIQQgACADNgIsIAAgASADQcgBaiADQdAAaiADQaABahBwIARFDQAaIABBAEEAIAAoAiQRAQAaIABBADYCMCAAIAQ2AiwgAEEANgIcIABBADYCECAAKAIUGiAAQQA2AhRBAAsaIAAgACgCACAFcjYCACACRQ0ACyADQdABaiQACy8AIAECfyACKAJMQX9MBEAgACABIAIQcQwBCyAAIAEgAhBxCyIARgRAIAEPCyAAC1kBAX8gACAALQBKIgFBf2ogAXI6AEogACgCACIBQQhxBEAgACABQSByNgIAQX8PCyAAQgA3AgQgACAAKAIsIgE2AhwgACABNgIUIAAgASAAKAIwajYCEEEACwYAQfSgAQsGAEHwoAELBgBB6KABC9kDAgJ/An4jAEEgayICJAACQCABQv///////////wCDIgVCgICAgICAwP9DfCAFQoCAgICAgMCAvH98VARAIAFCBIYgAEI8iIQhBCAAQv//////////D4MiAEKBgICAgICAgAhaBEAgBEKBgICAgICAgMAAfCEEDAILIARCgICAgICAgIBAfSEEIABCgICAgICAgIAIhUIAUg0BIARCAYMgBHwhBAwBCyAAUCAFQoCAgICAgMD//wBUIAVCgICAgICAwP//AFEbRQRAIAFCBIYgAEI8iIRC/////////wODQoCAgICAgID8/wCEIQQMAQtCgICAgICAgPj/ACEEIAVC////////v//DAFYNAEIAIQQgBUIwiKciA0GR9wBJDQAgAkEQaiAAIAFC////////P4NCgICAgICAwACEIgQgA0H/iH9qELQCIAIgACAEQYH4ACADaxCzAiACKQMIQgSGIAIpAwAiAEI8iIQhBCACKQMQIAIpAxiEQgBSrSAAQv//////////D4OEIgBCgYCAgICAgIAIWgRAIARCAXwhBAwBCyAAQoCAgICAgICACIVCAFINACAEQgGDIAR8IQQLIAJBIGokACAEIAFCgICAgICAgICAf4OEvwtQAQF+AkAgA0HAAHEEQCACIANBQGqtiCEBQgAhAgwBCyADRQ0AIAJBwAAgA2uthiABIAOtIgSIhCEBIAIgBIghAgsgACABNwMAIAAgAjcDCAtQAQF+AkAgA0HAAHEEQCABIANBQGqthiECQgAhAQwBCyADRQ0AIAIgA60iBIYgAUHAACADa62IhCECIAEgBIYhAQsgACABNwMAIAAgAjcDCAuLAgACQCAABH8gAUH/AE0NAQJAQZCaASgCACgCAEUEQCABQYB/cUGAvwNGDQMMAQsgAUH/D00EQCAAIAFBP3FBgAFyOgABIAAgAUEGdkHAAXI6AABBAg8LIAFBgLADT0EAIAFBgEBxQYDAA0cbRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMPCyABQYCAfGpB//8/TQRAIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBA8LC0G0nAFBGTYCAEF/BUEBCw8LIAAgAToAAEEBC74CAQF/IwBBwMAAayIDJAAgAyAANgK4QCADIAE2ArRAIAMgAjcDqEACQCADKAK0QBBJQQBIBEAgAygCuEBBCGogAygCtEAQGCADQX82ArxADAELIANBADYCDCADQgA3AxADQAJAIAMgAygCtEAgA0EgakKAwAAQLyICNwMYIAJCAFcNACADKAK4QCADQSBqIAMpAxgQNkEASARAIANBfzYCDAUgAykDGEKAwABSDQIgAygCuEAoAlRFDQIgAykDqEBCAFcNAiADIAMpAxggAykDEHw3AxAgAygCuEAoAlQgAykDELkgAykDqEC5oxBYDAILCwsgAykDGEIAUwRAIAMoArhAQQhqIAMoArRAEBggA0F/NgIMCyADKAK0QBAyGiADIAMoAgw2ArxACyADKAK8QCEAIANBwMAAaiQAIAALqgEBAX8jAEEwayIDJAAgAyAANgIoIAMgATYCJCADIAI3AxggAyADKAIoKAIAEDUiAjcDEAJAIAJCAFMEQCADQX82AiwMAQsgAyADKAIoIAMoAiQgAykDGBDGASICNwMAIAJCAFMEQCADQX82AiwMAQsgAyADKAIoKAIAEDUiAjcDCCACQgBTBEAgA0F/NgIsDAELIANBADYCLAsgAygCLCEAIANBMGokACAAC/4BAQF/IwBBoMAAayICJAAgAiAANgKYQCACIAE3A5BAIAIgAikDkEC6OQMAAkADQCACKQOQQEIAVgRAIAICfkKAwAAgAikDkEBCgMAAVg0AGiACKQOQQAs+AgwgAigCmEAoAgAgAkEQaiACKAIMrSACKAKYQEEIahBhQQBIBEAgAkF/NgKcQAwDCyACKAKYQCACQRBqIAIoAgytEDZBAEgEQCACQX82ApxADAMFIAIgAikDkEAgAjUCDH03A5BAIAIoAphAKAJUIAIrAwAgAikDkEC6oSACKwMAoxBYDAILAAsLIAJBADYCnEALIAIoApxAIQAgAkGgwABqJAAgAAvnEQIBfwF+IwBBoAFrIgMkACADIAA2ApgBIAMgATYClAEgAyACNgKQAQJAIAMoApQBIANBOGoQOUEASARAIAMoApgBQQhqIAMoApQBEBggA0F/NgKcAQwBCyADKQM4QsAAg1AEQCADIAMpAzhCwACENwM4IANBADsBaAsCQAJAIAMoApABKAIQQX9HBEAgAygCkAEoAhBBfkcNAQsgAy8BaEUNACADKAKQASADLwFoNgIQDAELAkACQCADKAKQASgCEA0AIAMpAzhCBINQDQAgAyADKQM4QgiENwM4IAMgAykDUDcDWAwBCyADIAMpAzhC9////w+DNwM4CwsgAykDOEKAAYNQBEAgAyADKQM4QoABhDcDOCADQQA7AWoLIANBgAI2AiQCQCADKQM4QgSDUARAIAMgAygCJEGACHI2AiQgA0J/NwNwDAELIAMoApABIAMpA1A3AyggAyADKQNQNwNwAkAgAykDOEIIg1AEQAJAAkACQAJAAkACfwJAIAMoApABKAIQQX9HBEAgAygCkAEoAhBBfkcNAQtBCAwBCyADKAKQASgCEAtB//8DcQ4NAgMDAwMDAwMBAwMDAAMLIANClMLk8w83AxAMAwsgA0KDg7D/DzcDEAwCCyADQv////8PNwMQDAELIANCADcDEAsgAykDUCADKQMQVgRAIAMgAygCJEGACHI2AiQLDAELIAMoApABIAMpA1g3AyALCyADIAMoApgBKAIAEDUiBDcDiAEgBEIAUwRAIAMoApgBQQhqIAMoApgBKAIAEBggA0F/NgKcAQwBCyADKAKQASIAIAAvAQxB9/8DcTsBDCADIAMoApgBIAMoApABIAMoAiQQXiIANgIoIABBAEgEQCADQX82ApwBDAELIAMgAy8BaAJ/AkAgAygCkAEoAhBBf0cEQCADKAKQASgCEEF+Rw0BC0EIDAELIAMoApABKAIQC0H//wNxRzoAIiADIAMtACJBAXEEfyADLwFoQQBHBUEAC0EBcToAISADIAMvAWgEfyADLQAhBUEBC0EBcToAICADIAMtACJBAXEEfyADKAKQASgCEEEARwVBAAtBAXE6AB8gAwJ/QQEgAy0AIkEBcQ0AGkEBIAMoApABKAIAQYABcQ0AGiADKAKQAS8BUiADLwFqRwtBAXE6AB4gAyADLQAeQQFxBH8gAy8BakEARwVBAAtBAXE6AB0gAyADLQAeQQFxBH8gAygCkAEvAVJBAEcFQQALQQFxOgAcIAMgAygClAE2AjQjAEEQayIAIAMoAjQ2AgwgACgCDCIAIAAoAjBBAWo2AjAgAy0AHUEBcQRAIAMgAy8BakEAEHciADYCDCAARQRAIAMoApgBQQhqQRhBABAVIAMoAjQQHCADQX82ApwBDAILIAMgAygCmAEgAygCNCADLwFqQQAgAygCmAEoAhwgAygCDBEGACIANgIwIABFBEAgAygCNBAcIANBfzYCnAEMAgsgAygCNBAcIAMgAygCMDYCNAsgAy0AIUEBcQRAIAMgAygCmAEgAygCNCADLwFoEKsBIgA2AjAgAEUEQCADKAI0EBwgA0F/NgKcAQwCCyADKAI0EBwgAyADKAIwNgI0CyADLQAgQQFxBEAgAyADKAKYASADKAI0QQAQqgEiADYCMCAARQRAIAMoAjQQHCADQX82ApwBDAILIAMoAjQQHCADIAMoAjA2AjQLIAMtAB9BAXEEQCADIAMoApgBIAMoAjQgAygCkAEoAhAgAygCkAEvAVAQwgIiADYCMCAARQRAIAMoAjQQHCADQX82ApwBDAILIAMoAjQQHCADIAMoAjA2AjQLIAMtABxBAXEEQCADQQA2AgQCQCADKAKQASgCVARAIAMgAygCkAEoAlQ2AgQMAQsgAygCmAEoAhwEQCADIAMoApgBKAIcNgIECwsgAyADKAKQAS8BUkEBEHciADYCCCAARQRAIAMoApgBQQhqQRhBABAVIAMoAjQQHCADQX82ApwBDAILIAMgAygCmAEgAygCNCADKAKQAS8BUkEBIAMoAgQgAygCCBEGACIANgIwIABFBEAgAygCNBAcIANBfzYCnAEMAgsgAygCNBAcIAMgAygCMDYCNAsgAyADKAKYASgCABA1IgQ3A4ABIARCAFMEQCADKAKYAUEIaiADKAKYASgCABAYIANBfzYCnAEMAQsgAyADKAKYASADKAI0IAMpA3AQtgI2AiwgAygCNCADQThqEDlBAEgEQCADKAKYAUEIaiADKAI0EBggA0F/NgIsCyADIAMoAjQQvAIiADoAIyAAQRh0QRh1QQBIBEAgAygCmAFBCGogAygCNBAYIANBfzYCLAsgAygCNBAcIAMoAixBAEgEQCADQX82ApwBDAELIAMgAygCmAEoAgAQNSIENwN4IARCAFMEQCADKAKYAUEIaiADKAKYASgCABAYIANBfzYCnAEMAQsgAygCmAEoAgAgAykDiAEQqAFBAEgEQCADKAKYAUEIaiADKAKYASgCABAYIANBfzYCnAEMAQsgAykDOELkAINC5ABSBEAgAygCmAFBCGpBFEEAEBUgA0F/NgKcAQwBCyADKAKQASgCAEEgcUUEQAJAIAMpAzhCEINCAFIEQCADKAKQASADKAJgNgIUDAELIAMoApABQRRqEAEaCwsgAygCkAEgAy8BaDYCECADKAKQASADKAJkNgIYIAMoApABIAMpA1A3AyggAygCkAEgAykDeCADKQOAAX03AyAgAygCkAEgAygCkAEvAQxB+f8DcSADLQAjQQF0cjsBDCADKAKQASADKAIkQYAIcUEARxCKAyADIAMoApgBIAMoApABIAMoAiQQXiIANgIsIABBAEgEQCADQX82ApwBDAELIAMoAiggAygCLEcEQCADKAKYAUEIakEUQQAQFSADQX82ApwBDAELIAMoApgBKAIAIAMpA3gQqAFBAEgEQCADKAKYAUEIaiADKAKYASgCABAYIANBfzYCnAEMAQsgA0EANgKcAQsgAygCnAEhACADQaABaiQAIAALrwIBAX8jAEEgayICIAA2AhwgAiABNgIYIAJBADYCFCACQgA3AwACQCACKAIcLQAoQQFxRQRAIAIoAhwoAhggAigCHCgCFEYNAQsgAkEBNgIUCyACQgA3AwgDQCACKQMIIAIoAhwpAzBUBEACQAJAIAIoAhwoAkAgAikDCKdBBHRqKAIIDQAgAigCHCgCQCACKQMIp0EEdGotAAxBAXENACACKAIcKAJAIAIpAwinQQR0aigCBEUNASACKAIcKAJAIAIpAwinQQR0aigCBCgCAEUNAQsgAkEBNgIUCyACKAIcKAJAIAIpAwinQQR0ai0ADEEBcUUEQCACIAIpAwBCAXw3AwALIAIgAikDCEIBfDcDCAwBCwsgAigCGARAIAIoAhggAikDADcDAAsgAigCFAuMEAMCfwF+AXwjAEHgAGsiASQAIAEgADYCWAJAIAEoAlhFBEAgAUF/NgJcDAELIAEgASgCWCABQUBrELoCNgIkIAEpA0BQBEACQCABKAJYKAIEQQhxRQRAIAEoAiRFDQELIAEoAlgoAgAQlQJBAEgEQAJAAn8jAEEQayICIAEoAlgoAgA2AgwjAEEQayIAIAIoAgxBDGo2AgwgACgCDCgCAEEWRgsEQCMAQRBrIgIgASgCWCgCADYCDCMAQRBrIgAgAigCDEEMajYCDCAAKAIMKAIEQSxGDQELIAEoAlhBCGogASgCWCgCABAYIAFBfzYCXAwECwsLIAEoAlgQPyABQQA2AlwMAQsgASgCJEUEQCABKAJYED8gAUEANgJcDAELIAEpA0AgASgCWCkDMFYEQCABKAJYQQhqQRRBABAVIAFBfzYCXAwBCyABIAEpA0CnQQN0EBkiADYCKCAARQRAIAFBfzYCXAwBCyABQn83AzggAUIANwNIIAFCADcDUANAIAEpA1AgASgCWCkDMFQEQAJAIAEoAlgoAkAgASkDUKdBBHRqKAIARQ0AAkAgASgCWCgCQCABKQNQp0EEdGooAggNACABKAJYKAJAIAEpA1CnQQR0ai0ADEEBcQ0AIAEoAlgoAkAgASkDUKdBBHRqKAIERQ0BIAEoAlgoAkAgASkDUKdBBHRqKAIEKAIARQ0BCyABAn4gASkDOCABKAJYKAJAIAEpA1CnQQR0aigCACkDSFQEQCABKQM4DAELIAEoAlgoAkAgASkDUKdBBHRqKAIAKQNICzcDOAsgASgCWCgCQCABKQNQp0EEdGotAAxBAXFFBEAgASkDSCABKQNAWgRAIAEoAigQFiABKAJYQQhqQRRBABAVIAFBfzYCXAwECyABKAIoIAEpA0inQQN0aiABKQNQNwMAIAEgASkDSEIBfDcDSAsgASABKQNQQgF8NwNQDAELCyABKQNIIAEpA0BUBEAgASgCKBAWIAEoAlhBCGpBFEEAEBUgAUF/NgJcDAELAkACfyMAQRBrIgAgASgCWCgCADYCDCAAKAIMKQMYQoCACINQCwRAIAFCADcDOAwBCyABKQM4Qn9RBEAgAUJ/NwMYIAFCADcDOCABQgA3A1ADQCABKQNQIAEoAlgpAzBUBEAgASgCWCgCQCABKQNQp0EEdGooAgAEQCABKAJYKAJAIAEpA1CnQQR0aigCACkDSCABKQM4WgRAIAEgASgCWCgCQCABKQNQp0EEdGooAgApA0g3AzggASABKQNQNwMYCwsgASABKQNQQgF8NwNQDAELCyABKQMYQn9SBEAgASABKAJYIAEpAxggASgCWEEIahCJAyIDNwM4IANQBEAgASgCKBAWIAFBfzYCXAwECwsLIAEpAzhCAFYEQCABKAJYKAIAIAEpAzgQ9wJBAEgEQCABQgA3AzgLCwsgASkDOFAEQCABKAJYKAIAEPYCQQBIBEAgASgCWEEIaiABKAJYKAIAEBggASgCKBAWIAFBfzYCXAwCCwsgASgCWCgCVBD5AiABQQA2AiwgAUIANwNIA0ACQCABKQNIIAEpA0BaDQAgASgCWCgCVCABKQNIIgO6IAEpA0C6IgSjIANCAXy6IASjEPgCIAEgASgCKCABKQNIp0EDdGopAwA3A1AgASABKAJYKAJAIAEpA1CnQQR0ajYCEAJAAkAgASgCECgCAEUNACABKAIQKAIAKQNIIAEpAzhaDQAMAQsgAQJ/QQEgASgCECgCCA0AGiABKAIQKAIEBEBBASABKAIQKAIEKAIAQQFxDQEaCyABKAIQKAIEBH8gASgCECgCBCgCAEHAAHFBAEcFQQALC0EBcTYCFCABKAIQKAIERQRAIAEoAhAoAgAQRiEAIAEoAhAgADYCBCAARQRAIAEoAlhBCGpBDkEAEBUgAUEBNgIsDAMLCyABIAEoAhAoAgQ2AgwgASgCWCABKQNQEMcBQQBIBEAgAUEBNgIsDAILIAEgASgCWCgCABA1IgM3AzAgA0IAUwRAIAFBATYCLAwCCyABKAIMIAEpAzA3A0gCQCABKAIUBEAgAUEANgIIIAEoAhAoAghFBEAgASABKAJYIAEoAlggASkDUEEIQQAQqQEiADYCCCAARQRAIAFBATYCLAwFCwsgASgCWAJ/IAEoAggEQCABKAIIDAELIAEoAhAoAggLIAEoAgwQuQJBAEgEQCABQQE2AiwgASgCCARAIAEoAggQHAsMBAsgASgCCARAIAEoAggQHAsMAQsgASgCDCIAIAAvAQxB9/8DcTsBDCABKAJYIAEoAgxBgAIQXkEASARAIAFBATYCLAwDCyABIAEoAlggASkDUCABKAJYQQhqEH8iAzcDACADUARAIAFBATYCLAwDCyABKAJYKAIAIAEpAwBBABAoQQBIBEAgASgCWEEIaiABKAJYKAIAEBggAUEBNgIsDAMLIAEoAlggASgCDCkDIBC4AkEASARAIAFBATYCLAwDCwsLIAEgASkDSEIBfDcDSAwBCwsgASgCLEUEQCABKAJYIAEoAiggASkDQBC3AkEASARAIAFBATYCLAsLIAEoAigQFiABKAIsRQRAIAEoAlgoAgAQvQIEQCABKAJYQQhqIAEoAlgoAgAQGCABQQE2AiwLCyABKAJYKAJUEPwCIAEoAiwEQCABKAJYKAIAEG0gAUF/NgJcDAELIAEoAlgQPyABQQA2AlwLIAEoAlwhACABQeAAaiQAIAALswEBAX8jAEEQayIBJAAgASAANgIIAkADQCABKAIIBEAgASgCCCkDGEKAgASDQgBSBEAgASABKAIIQQBCAEEQECI3AwAgASkDAEIAUwRAIAFB/wE6AA8MBAsgASkDAEIDVQRAIAEoAghBDGpBFEEAEBUgAUH/AToADwwECyABIAEpAwA8AA8MAwUgASABKAIIKAIANgIIDAILAAsLIAFBADoADwsgASwADyEAIAFBEGokACAAC8wBAQF/IwBBEGsiASQAIAEgADYCCAJAIAEoAggoAiRBAUcEQCABKAIIQQxqQRJBABAVIAFBfzYCDAwBCyABKAIIKAIgQQFLBEAgASgCCEEMakEdQQAQFSABQX82AgwMAQsgASgCCCgCIEEASwRAIAEoAggQMkEASARAIAFBfzYCDAwCCwsgASgCCEEAQgBBCRAiQgBTBEAgASgCCEECNgIkIAFBfzYCDAwBCyABKAIIQQA2AiQgAUEANgIMCyABKAIMIQAgAUEQaiQAIAAL2gkBAX8jAEGwAWsiBSQAIAUgADYCpAEgBSABNgKgASAFIAI2ApwBIAUgAzcDkAEgBSAENgKMASAFIAUoAqABNgKIAQJAAkACQAJAAkACQAJAAkACQAJAAkAgBSgCjAEODwABAgMEBQcICQkJCQkJBgkLIAUoAogBQgA3AyAgBUIANwOoAQwJCyAFIAUoAqQBIAUoApwBIAUpA5ABEC8iAzcDgAEgA0IAUwRAIAUoAogBQQhqIAUoAqQBEBggBUJ/NwOoAQwJCwJAIAUpA4ABUARAIAUoAogBKQMoIAUoAogBKQMgUQRAIAUoAogBQQE2AgQgBSgCiAEgBSgCiAEpAyA3AxggBSgCiAEoAgAEQCAFKAKkASAFQcgAahA5QQBIBEAgBSgCiAFBCGogBSgCpAEQGCAFQn83A6gBDA0LAkAgBSkDSEIgg1ANACAFKAJ0IAUoAogBKAIwRg0AIAUoAogBQQhqQQdBABAVIAVCfzcDqAEMDQsCQCAFKQNIQgSDUA0AIAUpA2AgBSgCiAEpAxhRDQAgBSgCiAFBCGpBFUEAEBUgBUJ/NwOoAQwNCwsLDAELAkAgBSgCiAEoAgQNACAFKAKIASkDICAFKAKIASkDKFYNACAFIAUoAogBKQMoIAUoAogBKQMgfTcDQANAIAUpA0AgBSkDgAFUBEAgBQJ+Qv////8PQv////8PIAUpA4ABIAUpA0B9VA0AGiAFKQOAASAFKQNAfQs3AzggBSgCiAEoAjAgBSgCnAEgBSkDQKdqIAUpAzinEBshACAFKAKIASAANgIwIAUoAogBIgAgBSkDOCAAKQMofDcDKCAFIAUpAzggBSkDQHw3A0AMAQsLCwsgBSgCiAEiACAFKQOAASAAKQMgfDcDICAFIAUpA4ABNwOoAQwICyAFQgA3A6gBDAcLIAUgBSgCnAE2AjQgBSgCiAEoAgQEQCAFKAI0IAUoAogBKQMYNwMYIAUoAjQgBSgCiAEoAjA2AiwgBSgCNCAFKAKIASkDGDcDICAFKAI0QQA7ATAgBSgCNEEAOwEyIAUoAjQiACAAKQMAQuwBhDcDAAsgBUIANwOoAQwGCyAFIAUoAogBQQhqIAUoApwBIAUpA5ABEEM3A6gBDAULIAUoAogBEBYgBUIANwOoAQwECyMAQRBrIgAgBSgCpAE2AgwgBSAAKAIMKQMYNwMoIAUpAyhCAFMEQCAFKAKIAUEIaiAFKAKkARAYIAVCfzcDqAEMBAsgBSkDKCEDIAVBfzYCGCAFQRA2AhQgBUEPNgIQIAVBDTYCDCAFQQw2AgggBUEKNgIEIAVBCTYCACAFQQggBRA3Qn+FIAODNwOoAQwDCyAFAn8gBSkDkAFCEFQEQCAFKAKIAUEIakESQQAQFUEADAELIAUoApwBCzYCHCAFKAIcRQRAIAVCfzcDqAEMAwsCQCAFKAKkASAFKAIcKQMAIAUoAhwoAggQKEEATgRAIAUgBSgCpAEQSiIDNwMgIANCAFkNAQsgBSgCiAFBCGogBSgCpAEQGCAFQn83A6gBDAMLIAUoAogBIAUpAyA3AyAgBUIANwOoAQwCCyAFIAUoAogBKQMgNwOoAQwBCyAFKAKIAUEIakEcQQAQFSAFQn83A6gBCyAFKQOoASEDIAVBsAFqJAAgAwvDBgEBfyMAQUBqIgQkACAEIAA2AjQgBCABNgIwIAQgAjYCLCAEIAM3AyACQAJ/IwBBEGsiACAEKAIwNgIMIAAoAgwoAgALBEAgBEJ/NwM4DAELAkAgBCkDIFBFBEAgBCgCMC0ADUEBcUUNAQsgBEIANwM4DAELIARCADcDCCAEQQA6ABsDQCAELQAbQQFxBH9BAAUgBCkDCCAEKQMgVAtBAXEEQCAEIAQpAyAgBCkDCH03AwAgBCAEKAIwKAKsQCAEKAIsIAQpAwinaiAEIAQoAjAoAqhAKAIcEQEANgIcIAQoAhxBAkcEQCAEIAQpAwAgBCkDCHw3AwgLAkACQAJAAkAgBCgCHEEBaw4DAAIBAwsgBCgCMEEBOgANAkAgBCgCMC0ADEEBcQ0ACyAEKAIwKQMgQgBTBEAgBCgCMEEUQQAQFSAEQQE6ABsMAwsCQCAEKAIwLQAOQQFxRQ0AIAQoAjApAyAgBCkDCFYNACAEKAIwQQE6AA8gBCgCMCAEKAIwKQMgNwMYIAQoAiwgBCgCMEEoaiAEKAIwKQMYpxAaGiAEIAQoAjApAxg3AzgMBgsgBEEBOgAbDAILIAQoAjAtAAxBAXEEQCAEQQE6ABsMAgsgBCAEKAI0IAQoAjBBKGpCgMAAEC8iAzcDECADQgBTBEAgBCgCMCAEKAI0EBggBEEBOgAbDAILAkAgBCkDEFAEQCAEKAIwQQE6AAwgBCgCMCgCrEAgBCgCMCgCqEAoAhgRAwAgBCgCMCkDIEIAUwRAIAQoAjBCADcDIAsMAQsCQCAEKAIwKQMgQgBZBEAgBCgCMEEAOgAODAELIAQoAjAgBCkDEDcDIAsgBCgCMCgCrEAgBCgCMEEoaiAEKQMQIAQoAjAoAqhAKAIUEREAGgsMAQsCfyMAQRBrIgAgBCgCMDYCDCAAKAIMKAIARQsEQCAEKAIwQRRBABAVCyAEQQE6ABsLDAELCyAEKQMIQgBWBEAgBCgCMEEAOgAOIAQoAjAiACAEKQMIIAApAxh8NwMYIAQgBCkDCDcDOAwBCyAEQX9BAAJ/IwBBEGsiACAEKAIwNgIMIAAoAgwoAgALG6w3AzgLIAQpAzghAyAEQUBrJAAgAwvcBQEBfyMAQTBrIgUkACAFIAA2AiQgBSABNgIgIAUgAjYCHCAFIAM3AxAgBSAENgIMIAUgBSgCIDYCCAJAAkACQAJAAkACQAJAAkACQAJAIAUoAgwOEQABAgMFBggICAgICAgIBwgECAsgBSgCCEIANwMYIAUoAghBADoADCAFKAIIQQA6AA0gBSgCCEEAOgAPIAUoAghCfzcDICAFKAIIKAKsQCAFKAIIKAKoQCgCDBEAAEEBcUUEQCAFQn83AygMCQsgBUIANwMoDAgLIAUgBSgCJCAFKAIIIAUoAhwgBSkDEBC/AjcDKAwHCyAFKAIIKAKsQCAFKAIIKAKoQCgCEBEAAEEBcUUEQCAFQn83AygMBwsgBUIANwMoDAYLIAUgBSgCHDYCBAJAIAUoAggtABBBAXEEQCAFKAIILQANQQFxBEAgBSgCBAJ/QQAgBSgCCC0AD0EBcQ0AGgJ/AkAgBSgCCCgCFEF/RwRAIAUoAggoAhRBfkcNAQtBCAwBCyAFKAIIKAIUC0H//wNxCzsBMCAFKAIEIAUoAggpAxg3AyAgBSgCBCIAIAApAwBCyACENwMADAILIAUoAgQiACAAKQMAQrf///8PgzcDAAwBCyAFKAIEQQA7ATAgBSgCBCIAIAApAwBCwACENwMAAkAgBSgCCC0ADUEBcQRAIAUoAgQgBSgCCCkDGDcDGCAFKAIEIgAgACkDAEIEhDcDAAwBCyAFKAIEIgAgACkDAEL7////D4M3AwALCyAFQgA3AygMBQsgBQJ/QQAgBSgCCC0AD0EBcQ0AGiAFKAIIKAKsQCAFKAIIKAKoQCgCCBEAAAusNwMoDAQLIAUgBSgCCCAFKAIcIAUpAxAQQzcDKAwDCyAFKAIIEKwBIAVCADcDKAwCCyAFQX82AgAgBUEQIAUQN0I/hDcDKAwBCyAFKAIIQRRBABAVIAVCfzcDKAsgBSkDKCEDIAVBMGokACADC/4CAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE6ABcgBCACNgIQIAQgAzYCDCAEQbDAABAZIgA2AggCQCAARQRAIARBADYCHAwBCyMAQRBrIgAgBCgCCDYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCAEKAIIAn8gBC0AF0EBcQRAIAQoAhhBf0cEfyAEKAIYQX5GBUEBC0EBcQwBC0EAC0EARzoADiAEKAIIIAQoAgw2AqhAIAQoAgggBCgCGDYCFCAEKAIIIAQtABdBAXE6ABAgBCgCCEEAOgAMIAQoAghBADoADSAEKAIIQQA6AA8gBCgCCCgCqEAoAgAhAAJ/AkAgBCgCGEF/RwRAIAQoAhhBfkcNAQtBCAwBCyAEKAIYC0H//wNxIAQoAhAgBCgCCCAAEQEAIQAgBCgCCCAANgKsQCAARQRAIAQoAggQOCAEKAIIEBYgBEEANgIcDAELIAQgBCgCCDYCHAsgBCgCHCEAIARBIGokACAAC00BAX8jAEEQayIEJAAgBCAANgIMIAQgATYCCCAEIAI2AgQgBCADNgIAIAQoAgwgBCgCCCAEKAIEQQEgBCgCABCtASEAIARBEGokACAAC1sBAX8jAEEQayIBJAAgASAANgIIIAFBAToABwJAIAEoAghFBEAgAUEBOgAPDAELIAEgASgCCCABLQAHQQFxEK4BQQBHOgAPCyABLQAPQQFxIQAgAUEQaiQAIAALPAEBfyMAQRBrIgMkACADIAA7AQ4gAyABNgIIIAMgAjYCBEEAIAMoAgggAygCBBCvASEAIANBEGokACAAC68CAQF/IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNgIQIAMgAygCGDYCDCADKAIMAn5C/////w9C/////w8gAygCECkDAFQNABogAygCECkDAAs+AiAgAygCDCADKAIUNgIcAkAgAygCDC0ABEEBcQRAIAMgAygCDEEQakEEQQAgAygCDC0ADEEBcRsQ3AI2AggMAQsgAyADKAIMQRBqENACNgIICyADKAIQIgAgACkDACADKAIMNQIgfTcDAAJAAkACQAJAAkAgAygCCEEFag4HAgMDAwMAAQMLIANBADYCHAwDCyADQQE2AhwMAgsgAygCDCgCFEUEQCADQQM2AhwMAgsLIAMoAgwoAgBBDSADKAIIEBUgA0ECNgIcCyADKAIcIQAgA0EgaiQAIAALJAEBfyMAQRBrIgEgADYCDCABIAEoAgw2AgggASgCCEEBOgAMC5kBAQF/IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNwMIIAMgAygCGDYCBAJAAkAgAykDCEL/////D1gEQCADKAIEKAIUQQBNDQELIAMoAgQoAgBBEkEAEBUgA0EAOgAfDAELIAMoAgQgAykDCD4CFCADKAIEIAMoAhQ2AhAgA0EBOgAfCyADLQAfQQFxIQAgA0EgaiQAIAALkAEBAX8jAEEQayIBJAAgASAANgIIIAEgASgCCDYCBAJAIAEoAgQtAARBAXEEQCABIAEoAgRBEGoQswE2AgAMAQsgASABKAIEQRBqEM0CNgIACwJAIAEoAgAEQCABKAIEKAIAQQ0gASgCABAVIAFBADoADwwBCyABQQE6AA8LIAEtAA9BAXEhACABQRBqJAAgAAvAAQEBfyMAQRBrIgEkACABIAA2AgggASABKAIINgIEIAEoAgRBADYCFCABKAIEQQA2AhAgASgCBEEANgIgIAEoAgRBADYCHAJAIAEoAgQtAARBAXEEQCABIAEoAgRBEGogASgCBCgCCBDhAjYCAAwBCyABIAEoAgRBEGoQ0QI2AgALAkAgASgCAARAIAEoAgQoAgBBDSABKAIAEBUgAUEAOgAPDAELIAFBAToADwsgAS0AD0EBcSEAIAFBEGokACAAC28BAX8jAEEQayIBIAA2AgggASABKAIINgIEAkAgASgCBC0ABEEBcUUEQCABQQA2AgwMAQsgASgCBCgCCEEDSARAIAFBAjYCDAwBCyABKAIEKAIIQQdKBEAgAUEBNgIMDAELIAFBADYCDAsgASgCDAssAQF/IwBBEGsiASQAIAEgADYCDCABIAEoAgw2AgggASgCCBAWIAFBEGokAAs8AQF/IwBBEGsiAyQAIAMgADsBDiADIAE2AgggAyACNgIEQQEgAygCCCADKAIEEK8BIQAgA0EQaiQAIAALmQEBAX8jAEEQayIBJAAgASAANgIIAkAgASgCCBBLBEAgAUF+NgIMDAELIAEgASgCCCgCHDYCBCABKAIEKAI4BEAgASgCCCgCKCABKAIEKAI4IAEoAggoAiQRBAALIAEoAggoAiggASgCCCgCHCABKAIIKAIkEQQAIAEoAghBADYCHCABQQA2AgwLIAEoAgwhACABQRBqJAAgAAudBAEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCECADIAMoAhgoAhw2AgwCQCADKAIMKAI4RQRAIAMoAhgoAihBASADKAIMKAIodEEBIAMoAhgoAiARAQAhACADKAIMIAA2AjggAygCDCgCOEUEQCADQQE2AhwMAgsLIAMoAgwoAixFBEAgAygCDEEBIAMoAgwoAih0NgIsIAMoAgxBADYCNCADKAIMQQA2AjALAkAgAygCECADKAIMKAIsTwRAIAMoAgwoAjggAygCFCADKAIMKAIsayADKAIMKAIsEBoaIAMoAgxBADYCNCADKAIMIAMoAgwoAiw2AjAMAQsgAyADKAIMKAIsIAMoAgwoAjRrNgIIIAMoAgggAygCEEsEQCADIAMoAhA2AggLIAMoAgwoAjggAygCDCgCNGogAygCFCADKAIQayADKAIIEBoaIAMgAygCECADKAIIazYCEAJAIAMoAhAEQCADKAIMKAI4IAMoAhQgAygCEGsgAygCEBAaGiADKAIMIAMoAhA2AjQgAygCDCADKAIMKAIsNgIwDAELIAMoAgwiACADKAIIIAAoAjRqNgI0IAMoAgwoAjQgAygCDCgCLEYEQCADKAIMQQA2AjQLIAMoAgwoAjAgAygCDCgCLEkEQCADKAIMIgAgAygCCCAAKAIwajYCMAsLCyADQQA2AhwLIAMoAhwhACADQSBqJAAgAAs8AQF/IwBBEGsiASAANgIMIAEoAgxBkPIANgJQIAEoAgxBCTYCWCABKAIMQZCCATYCVCABKAIMQQU2AlwLlk8BBH8jAEHgAGsiASQAIAEgADYCWCABQQI2AlQCQAJAAkAgASgCWBBLDQAgASgCWCgCDEUNACABKAJYKAIADQEgASgCWCgCBEUNAQsgAUF+NgJcDAELIAEgASgCWCgCHDYCUCABKAJQKAIEQb/+AEYEQCABKAJQQcD+ADYCBAsgASABKAJYKAIMNgJIIAEgASgCWCgCEDYCQCABIAEoAlgoAgA2AkwgASABKAJYKAIENgJEIAEgASgCUCgCPDYCPCABIAEoAlAoAkA2AjggASABKAJENgI0IAEgASgCQDYCMCABQQA2AhADQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAJQKAIEQcyBf2oOHwABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fCyABKAJQKAIMRQRAIAEoAlBBwP4ANgIEDCELA0AgASgCOEEQSQRAIAEoAkRFDSEgASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLAkAgASgCUCgCDEECcUUNACABKAI8QZ+WAkcNACABKAJQKAIoRQRAIAEoAlBBDzYCKAtBAEEAQQAQGyEAIAEoAlAgADYCHCABIAEoAjw6AAwgASABKAI8QQh2OgANIAEoAlAoAhwgAUEMakECEBshACABKAJQIAA2AhwgAUEANgI8IAFBADYCOCABKAJQQbX+ADYCBAwhCyABKAJQQQA2AhQgASgCUCgCJARAIAEoAlAoAiRBfzYCMAsCQCABKAJQKAIMQQFxBEAgASgCPEH/AXFBCHQgASgCPEEIdmpBH3BFDQELIAEoAlhBtu4ANgIYIAEoAlBB0f4ANgIEDCELIAEoAjxBD3FBCEcEQCABKAJYQc3uADYCGCABKAJQQdH+ADYCBAwhCyABIAEoAjxBBHY2AjwgASABKAI4QQRrNgI4IAEgASgCPEEPcUEIajYCFCABKAJQKAIoRQRAIAEoAlAgASgCFDYCKAsCQCABKAIUQQ9NBEAgASgCFCABKAJQKAIoTQ0BCyABKAJYQejuADYCGCABKAJQQdH+ADYCBAwhCyABKAJQQQEgASgCFHQ2AhhBAEEAQQAQPSEAIAEoAlAgADYCHCABKAJYIAA2AjAgASgCUEG9/gBBv/4AIAEoAjxBgARxGzYCBCABQQA2AjwgAUEANgI4DCALA0AgASgCOEEQSQRAIAEoAkRFDSAgASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLIAEoAlAgASgCPDYCFCABKAJQKAIUQf8BcUEIRwRAIAEoAlhBze4ANgIYIAEoAlBB0f4ANgIEDCALIAEoAlAoAhRBgMADcQRAIAEoAlhB/O4ANgIYIAEoAlBB0f4ANgIEDCALIAEoAlAoAiQEQCABKAJQKAIkIAEoAjxBCHZBAXE2AgALAkAgASgCUCgCFEGABHFFDQAgASgCUCgCDEEEcUUNACABIAEoAjw6AAwgASABKAI8QQh2OgANIAEoAlAoAhwgAUEMakECEBshACABKAJQIAA2AhwLIAFBADYCPCABQQA2AjggASgCUEG2/gA2AgQLA0AgASgCOEEgSQRAIAEoAkRFDR8gASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLIAEoAlAoAiQEQCABKAJQKAIkIAEoAjw2AgQLAkAgASgCUCgCFEGABHFFDQAgASgCUCgCDEEEcUUNACABIAEoAjw6AAwgASABKAI8QQh2OgANIAEgASgCPEEQdjoADiABIAEoAjxBGHY6AA8gASgCUCgCHCABQQxqQQQQGyEAIAEoAlAgADYCHAsgAUEANgI8IAFBADYCOCABKAJQQbf+ADYCBAsDQCABKAI4QRBJBEAgASgCREUNHiABIAEoAkRBf2o2AkQgASABKAJMIgBBAWo2AkwgASABKAI8IAAtAAAgASgCOHRqNgI8IAEgASgCOEEIajYCOAwBCwsgASgCUCgCJARAIAEoAlAoAiQgASgCPEH/AXE2AgggASgCUCgCJCABKAI8QQh2NgIMCwJAIAEoAlAoAhRBgARxRQ0AIAEoAlAoAgxBBHFFDQAgASABKAI8OgAMIAEgASgCPEEIdjoADSABKAJQKAIcIAFBDGpBAhAbIQAgASgCUCAANgIcCyABQQA2AjwgAUEANgI4IAEoAlBBuP4ANgIECwJAIAEoAlAoAhRBgAhxBEADQCABKAI4QRBJBEAgASgCREUNHyABIAEoAkRBf2o2AkQgASABKAJMIgBBAWo2AkwgASABKAI8IAAtAAAgASgCOHRqNgI8IAEgASgCOEEIajYCOAwBCwsgASgCUCABKAI8NgJEIAEoAlAoAiQEQCABKAJQKAIkIAEoAjw2AhQLAkAgASgCUCgCFEGABHFFDQAgASgCUCgCDEEEcUUNACABIAEoAjw6AAwgASABKAI8QQh2OgANIAEoAlAoAhwgAUEMakECEBshACABKAJQIAA2AhwLIAFBADYCPCABQQA2AjgMAQsgASgCUCgCJARAIAEoAlAoAiRBADYCEAsLIAEoAlBBuf4ANgIECyABKAJQKAIUQYAIcQRAIAEgASgCUCgCRDYCLCABKAIsIAEoAkRLBEAgASABKAJENgIsCyABKAIsBEACQCABKAJQKAIkRQ0AIAEoAlAoAiQoAhBFDQAgASABKAJQKAIkKAIUIAEoAlAoAkRrNgIUIAEoAlAoAiQoAhAgASgCFGogASgCTAJ/IAEoAhQgASgCLGogASgCUCgCJCgCGEsEQCABKAJQKAIkKAIYIAEoAhRrDAELIAEoAiwLEBoaCwJAIAEoAlAoAhRBgARxRQ0AIAEoAlAoAgxBBHFFDQAgASgCUCgCHCABKAJMIAEoAiwQGyEAIAEoAlAgADYCHAsgASABKAJEIAEoAixrNgJEIAEgASgCLCABKAJMajYCTCABKAJQIgAgACgCRCABKAIsazYCRAsgASgCUCgCRA0bCyABKAJQQQA2AkQgASgCUEG6/gA2AgQLAkAgASgCUCgCFEGAEHEEQCABKAJERQ0bIAFBADYCLANAIAEoAkwhACABIAEoAiwiAkEBajYCLCABIAAgAmotAAA2AhQCQCABKAJQKAIkRQ0AIAEoAlAoAiQoAhxFDQAgASgCUCgCRCABKAJQKAIkKAIgTw0AIAEoAhQhAiABKAJQKAIkKAIcIQMgASgCUCIEKAJEIQAgBCAAQQFqNgJEIAAgA2ogAjoAAAsgASgCFAR/IAEoAiwgASgCREkFQQALQQFxDQALAkAgASgCUCgCFEGABHFFDQAgASgCUCgCDEEEcUUNACABKAJQKAIcIAEoAkwgASgCLBAbIQAgASgCUCAANgIcCyABIAEoAkQgASgCLGs2AkQgASABKAIsIAEoAkxqNgJMIAEoAhQNGwwBCyABKAJQKAIkBEAgASgCUCgCJEEANgIcCwsgASgCUEEANgJEIAEoAlBBu/4ANgIECwJAIAEoAlAoAhRBgCBxBEAgASgCREUNGiABQQA2AiwDQCABKAJMIQAgASABKAIsIgJBAWo2AiwgASAAIAJqLQAANgIUAkAgASgCUCgCJEUNACABKAJQKAIkKAIkRQ0AIAEoAlAoAkQgASgCUCgCJCgCKE8NACABKAIUIQIgASgCUCgCJCgCJCEDIAEoAlAiBCgCRCEAIAQgAEEBajYCRCAAIANqIAI6AAALIAEoAhQEfyABKAIsIAEoAkRJBUEAC0EBcQ0ACwJAIAEoAlAoAhRBgARxRQ0AIAEoAlAoAgxBBHFFDQAgASgCUCgCHCABKAJMIAEoAiwQGyEAIAEoAlAgADYCHAsgASABKAJEIAEoAixrNgJEIAEgASgCLCABKAJMajYCTCABKAIUDRoMAQsgASgCUCgCJARAIAEoAlAoAiRBADYCJAsLIAEoAlBBvP4ANgIECyABKAJQKAIUQYAEcQRAA0AgASgCOEEQSQRAIAEoAkRFDRogASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLAkAgASgCUCgCDEEEcUUNACABKAI8IAEoAlAoAhxB//8DcUYNACABKAJYQZXvADYCGCABKAJQQdH+ADYCBAwaCyABQQA2AjwgAUEANgI4CyABKAJQKAIkBEAgASgCUCgCJCABKAJQKAIUQQl1QQFxNgIsIAEoAlAoAiRBATYCMAtBAEEAQQAQGyEAIAEoAlAgADYCHCABKAJYIAA2AjAgASgCUEG//gA2AgQMGAsDQCABKAI4QSBJBEAgASgCREUNGCABIAEoAkRBf2o2AkQgASABKAJMIgBBAWo2AkwgASABKAI8IAAtAAAgASgCOHRqNgI8IAEgASgCOEEIajYCOAwBCwsgASgCUCABKAI8QQh2QYD+A3EgASgCPEEYdmogASgCPEGA/gNxQQh0aiABKAI8Qf8BcUEYdGoiADYCHCABKAJYIAA2AjAgAUEANgI8IAFBADYCOCABKAJQQb7+ADYCBAsgASgCUCgCEEUEQCABKAJYIAEoAkg2AgwgASgCWCABKAJANgIQIAEoAlggASgCTDYCACABKAJYIAEoAkQ2AgQgASgCUCABKAI8NgI8IAEoAlAgASgCODYCQCABQQI2AlwMGAtBAEEAQQAQPSEAIAEoAlAgADYCHCABKAJYIAA2AjAgASgCUEG//gA2AgQLIAEoAlRBBUYNFCABKAJUQQZGDRQLIAEoAlAoAggEQCABIAEoAjwgASgCOEEHcXY2AjwgASABKAI4IAEoAjhBB3FrNgI4IAEoAlBBzv4ANgIEDBULA0AgASgCOEEDSQRAIAEoAkRFDRUgASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLIAEoAlAgASgCPEEBcTYCCCABIAEoAjxBAXY2AjwgASABKAI4QQFrNgI4AkACQAJAAkACQCABKAI8QQNxDgQAAQIDBAsgASgCUEHB/gA2AgQMAwsgASgCUBDPAiABKAJQQcf+ADYCBCABKAJUQQZGBEAgASABKAI8QQJ2NgI8IAEgASgCOEECazYCOAwXCwwCCyABKAJQQcT+ADYCBAwBCyABKAJYQanvADYCGCABKAJQQdH+ADYCBAsgASABKAI8QQJ2NgI8IAEgASgCOEECazYCOAwUCyABIAEoAjwgASgCOEEHcXY2AjwgASABKAI4IAEoAjhBB3FrNgI4A0AgASgCOEEgSQRAIAEoAkRFDRQgASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLIAEoAjxB//8DcSABKAI8QRB2Qf//A3NHBEAgASgCWEG87wA2AhggASgCUEHR/gA2AgQMFAsgASgCUCABKAI8Qf//A3E2AkQgAUEANgI8IAFBADYCOCABKAJQQcL+ADYCBCABKAJUQQZGDRILIAEoAlBBw/4ANgIECyABIAEoAlAoAkQ2AiwgASgCLARAIAEoAiwgASgCREsEQCABIAEoAkQ2AiwLIAEoAiwgASgCQEsEQCABIAEoAkA2AiwLIAEoAixFDREgASgCSCABKAJMIAEoAiwQGhogASABKAJEIAEoAixrNgJEIAEgASgCLCABKAJMajYCTCABIAEoAkAgASgCLGs2AkAgASABKAIsIAEoAkhqNgJIIAEoAlAiACAAKAJEIAEoAixrNgJEDBILIAEoAlBBv/4ANgIEDBELA0AgASgCOEEOSQRAIAEoAkRFDREgASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLIAEoAlAgASgCPEEfcUGBAmo2AmQgASABKAI8QQV2NgI8IAEgASgCOEEFazYCOCABKAJQIAEoAjxBH3FBAWo2AmggASABKAI8QQV2NgI8IAEgASgCOEEFazYCOCABKAJQIAEoAjxBD3FBBGo2AmAgASABKAI8QQR2NgI8IAEgASgCOEEEazYCOAJAIAEoAlAoAmRBngJNBEAgASgCUCgCaEEeTQ0BCyABKAJYQdnvADYCGCABKAJQQdH+ADYCBAwRCyABKAJQQQA2AmwgASgCUEHF/gA2AgQLA0AgASgCUCgCbCABKAJQKAJgSQRAA0AgASgCOEEDSQRAIAEoAkRFDRIgASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLIAEoAjxBB3EhAiABKAJQQfQAaiEDIAEoAlAiBCgCbCEAIAQgAEEBajYCbCAAQQF0QZDuAGovAQBBAXQgA2ogAjsBACABIAEoAjxBA3Y2AjwgASABKAI4QQNrNgI4DAELCwNAIAEoAlAoAmxBE0kEQCABKAJQQfQAaiECIAEoAlAiAygCbCEAIAMgAEEBajYCbCAAQQF0QZDuAGovAQBBAXQgAmpBADsBAAwBCwsgASgCUCABKAJQQbQKajYCcCABKAJQIAEoAlAoAnA2AlAgASgCUEEHNgJYIAFBACABKAJQQfQAakETIAEoAlBB8ABqIAEoAlBB2ABqIAEoAlBB9AVqEHI2AhAgASgCEARAIAEoAlhB/e8ANgIYIAEoAlBB0f4ANgIEDBALIAEoAlBBADYCbCABKAJQQcb+ADYCBAsDQAJAIAEoAlAoAmwgASgCUCgCZCABKAJQKAJoak8NAANAAkAgASABKAJQKAJQIAEoAjxBASABKAJQKAJYdEEBa3FBAnRqKAEANgEgIAEtACEgASgCOE0NACABKAJERQ0RIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCwJAIAEvASJBEEgEQCABIAEoAjwgAS0AIXY2AjwgASABKAI4IAEtACFrNgI4IAEvASIhAiABKAJQQfQAaiEDIAEoAlAiBCgCbCEAIAQgAEEBajYCbCAAQQF0IANqIAI7AQAMAQsCQCABLwEiQRBGBEADQCABKAI4IAEtACFBAmpJBEAgASgCREUNFCABIAEoAkRBf2o2AkQgASABKAJMIgBBAWo2AkwgASABKAI8IAAtAAAgASgCOHRqNgI8IAEgASgCOEEIajYCOAwBCwsgASABKAI8IAEtACF2NgI8IAEgASgCOCABLQAhazYCOCABKAJQKAJsRQRAIAEoAlhBlvAANgIYIAEoAlBB0f4ANgIEDAQLIAEgASgCUCABKAJQKAJsQQF0ai8BcjYCFCABIAEoAjxBA3FBA2o2AiwgASABKAI8QQJ2NgI8IAEgASgCOEECazYCOAwBCwJAIAEvASJBEUYEQANAIAEoAjggAS0AIUEDakkEQCABKAJERQ0VIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCyABIAEoAjwgAS0AIXY2AjwgASABKAI4IAEtACFrNgI4IAFBADYCFCABIAEoAjxBB3FBA2o2AiwgASABKAI8QQN2NgI8IAEgASgCOEEDazYCOAwBCwNAIAEoAjggAS0AIUEHakkEQCABKAJERQ0UIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCyABIAEoAjwgAS0AIXY2AjwgASABKAI4IAEtACFrNgI4IAFBADYCFCABIAEoAjxB/wBxQQtqNgIsIAEgASgCPEEHdjYCPCABIAEoAjhBB2s2AjgLCyABKAJQKAJsIAEoAixqIAEoAlAoAmQgASgCUCgCaGpLBEAgASgCWEGW8AA2AhggASgCUEHR/gA2AgQMAgsDQCABIAEoAiwiAEF/ajYCLCAABEAgASgCFCECIAEoAlBB9ABqIQMgASgCUCIEKAJsIQAgBCAAQQFqNgJsIABBAXQgA2ogAjsBAAwBCwsLDAELCyABKAJQKAIEQdH+AEYNDiABKAJQLwH0BEUEQCABKAJYQbDwADYCGCABKAJQQdH+ADYCBAwPCyABKAJQIAEoAlBBtApqNgJwIAEoAlAgASgCUCgCcDYCUCABKAJQQQk2AlggAUEBIAEoAlBB9ABqIAEoAlAoAmQgASgCUEHwAGogASgCUEHYAGogASgCUEH0BWoQcjYCECABKAIQBEAgASgCWEHV8AA2AhggASgCUEHR/gA2AgQMDwsgASgCUCABKAJQKAJwNgJUIAEoAlBBBjYCXCABQQIgASgCUEH0AGogASgCUCgCZEEBdGogASgCUCgCaCABKAJQQfAAaiABKAJQQdwAaiABKAJQQfQFahByNgIQIAEoAhAEQCABKAJYQfHwADYCGCABKAJQQdH+ADYCBAwPCyABKAJQQcf+ADYCBCABKAJUQQZGDQ0LIAEoAlBByP4ANgIECwJAIAEoAkRBBkkNACABKAJAQYICSQ0AIAEoAlggASgCSDYCDCABKAJYIAEoAkA2AhAgASgCWCABKAJMNgIAIAEoAlggASgCRDYCBCABKAJQIAEoAjw2AjwgASgCUCABKAI4NgJAIAEoAlggASgCMBDWAiABIAEoAlgoAgw2AkggASABKAJYKAIQNgJAIAEgASgCWCgCADYCTCABIAEoAlgoAgQ2AkQgASABKAJQKAI8NgI8IAEgASgCUCgCQDYCOCABKAJQKAIEQb/+AEYEQCABKAJQQX82Asg3CwwNCyABKAJQQQA2Asg3A0ACQCABIAEoAlAoAlAgASgCPEEBIAEoAlAoAlh0QQFrcUECdGooAQA2ASAgAS0AISABKAI4TQ0AIAEoAkRFDQ0gASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLAkAgAS0AIEUNACABLQAgQfABcQ0AIAEgASgBIDYBGANAAkAgASABKAJQKAJQIAEvARogASgCPEEBIAEtABkgAS0AGGp0QQFrcSABLQAZdmpBAnRqKAEANgEgIAEtABkgAS0AIWogASgCOE0NACABKAJERQ0OIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCyABIAEoAjwgAS0AGXY2AjwgASABKAI4IAEtABlrNgI4IAEoAlAiACABLQAZIAAoAsg3ajYCyDcLIAEgASgCPCABLQAhdjYCPCABIAEoAjggAS0AIWs2AjggASgCUCIAIAEtACEgACgCyDdqNgLINyABKAJQIAEvASI2AkQgAS0AIEUEQCABKAJQQc3+ADYCBAwNCyABLQAgQSBxBEAgASgCUEF/NgLINyABKAJQQb/+ADYCBAwNCyABLQAgQcAAcQRAIAEoAlhBh/EANgIYIAEoAlBB0f4ANgIEDA0LIAEoAlAgAS0AIEEPcTYCTCABKAJQQcn+ADYCBAsgASgCUCgCTARAA0AgASgCOCABKAJQKAJMSQRAIAEoAkRFDQ0gASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLIAEoAlAiACAAKAJEIAEoAjxBASABKAJQKAJMdEEBa3FqNgJEIAEgASgCPCABKAJQKAJMdjYCPCABIAEoAjggASgCUCgCTGs2AjggASgCUCIAIAEoAlAoAkwgACgCyDdqNgLINwsgASgCUCABKAJQKAJENgLMNyABKAJQQcr+ADYCBAsDQAJAIAEgASgCUCgCVCABKAI8QQEgASgCUCgCXHRBAWtxQQJ0aigBADYBICABLQAhIAEoAjhNDQAgASgCREUNCyABIAEoAkRBf2o2AkQgASABKAJMIgBBAWo2AkwgASABKAI8IAAtAAAgASgCOHRqNgI8IAEgASgCOEEIajYCOAwBCwsgAS0AIEHwAXFFBEAgASABKAEgNgEYA0ACQCABIAEoAlAoAlQgAS8BGiABKAI8QQEgAS0AGSABLQAYanRBAWtxIAEtABl2akECdGooAQA2ASAgAS0AGSABLQAhaiABKAI4TQ0AIAEoAkRFDQwgASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLIAEgASgCPCABLQAZdjYCPCABIAEoAjggAS0AGWs2AjggASgCUCIAIAEtABkgACgCyDdqNgLINwsgASABKAI8IAEtACF2NgI8IAEgASgCOCABLQAhazYCOCABKAJQIgAgAS0AISAAKALIN2o2Asg3IAEtACBBwABxBEAgASgCWEGj8QA2AhggASgCUEHR/gA2AgQMCwsgASgCUCABLwEiNgJIIAEoAlAgAS0AIEEPcTYCTCABKAJQQcv+ADYCBAsgASgCUCgCTARAA0AgASgCOCABKAJQKAJMSQRAIAEoAkRFDQsgASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLIAEoAlAiACAAKAJIIAEoAjxBASABKAJQKAJMdEEBa3FqNgJIIAEgASgCPCABKAJQKAJMdjYCPCABIAEoAjggASgCUCgCTGs2AjggASgCUCIAIAEoAlAoAkwgACgCyDdqNgLINwsgASgCUEHM/gA2AgQLIAEoAkBFDQcgASABKAIwIAEoAkBrNgIsAkAgASgCUCgCSCABKAIsSwRAIAEgASgCUCgCSCABKAIsazYCLCABKAIsIAEoAlAoAjBLBEAgASgCUCgCxDcEQCABKAJYQbnxADYCGCABKAJQQdH+ADYCBAwMCwsCQCABKAIsIAEoAlAoAjRLBEAgASABKAIsIAEoAlAoAjRrNgIsIAEgASgCUCgCOCABKAJQKAIsIAEoAixrajYCKAwBCyABIAEoAlAoAjggASgCUCgCNCABKAIsa2o2AigLIAEoAiwgASgCUCgCREsEQCABIAEoAlAoAkQ2AiwLDAELIAEgASgCSCABKAJQKAJIazYCKCABIAEoAlAoAkQ2AiwLIAEoAiwgASgCQEsEQCABIAEoAkA2AiwLIAEgASgCQCABKAIsazYCQCABKAJQIgAgACgCRCABKAIsazYCRANAIAEgASgCKCIAQQFqNgIoIAAtAAAhACABIAEoAkgiAkEBajYCSCACIAA6AAAgASABKAIsQX9qIgA2AiwgAA0ACyABKAJQKAJERQRAIAEoAlBByP4ANgIECwwICyABKAJARQ0GIAEoAlAoAkQhACABIAEoAkgiAkEBajYCSCACIAA6AAAgASABKAJAQX9qNgJAIAEoAlBByP4ANgIEDAcLIAEoAlAoAgwEQANAIAEoAjhBIEkEQCABKAJERQ0IIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCyABIAEoAjAgASgCQGs2AjAgASgCWCIAIAEoAjAgACgCFGo2AhQgASgCUCIAIAEoAjAgACgCIGo2AiACQCABKAJQKAIMQQRxRQ0AIAEoAjBFDQACfyABKAJQKAIUBEAgASgCUCgCHCABKAJIIAEoAjBrIAEoAjAQGwwBCyABKAJQKAIcIAEoAkggASgCMGsgASgCMBA9CyEAIAEoAlAgADYCHCABKAJYIAA2AjALIAEgASgCQDYCMAJAIAEoAlAoAgxBBHFFDQACfyABKAJQKAIUBEAgASgCPAwBCyABKAI8QQh2QYD+A3EgASgCPEEYdmogASgCPEGA/gNxQQh0aiABKAI8Qf8BcUEYdGoLIAEoAlAoAhxGDQAgASgCWEHX8QA2AhggASgCUEHR/gA2AgQMCAsgAUEANgI8IAFBADYCOAsgASgCUEHP/gA2AgQLAkAgASgCUCgCDEUNACABKAJQKAIURQ0AA0AgASgCOEEgSQRAIAEoAkRFDQcgASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLIAEoAjwgASgCUCgCIEcEQCABKAJYQezxADYCGCABKAJQQdH+ADYCBAwHCyABQQA2AjwgAUEANgI4CyABKAJQQdD+ADYCBAsgAUEBNgIQDAMLIAFBfTYCEAwCCyABQXw2AlwMAwsgAUF+NgJcDAILCyABKAJYIAEoAkg2AgwgASgCWCABKAJANgIQIAEoAlggASgCTDYCACABKAJYIAEoAkQ2AgQgASgCUCABKAI8NgI8IAEoAlAgASgCODYCQAJAAkAgASgCUCgCLA0AIAEoAjAgASgCWCgCEEYNASABKAJQKAIEQdH+AE8NASABKAJQKAIEQc7+AEkNACABKAJUQQRGDQELIAEoAlggASgCWCgCDCABKAIwIAEoAlgoAhBrEM4CBEAgASgCUEHS/gA2AgQgAUF8NgJcDAILCyABIAEoAjQgASgCWCgCBGs2AjQgASABKAIwIAEoAlgoAhBrNgIwIAEoAlgiACABKAI0IAAoAghqNgIIIAEoAlgiACABKAIwIAAoAhRqNgIUIAEoAlAiACABKAIwIAAoAiBqNgIgAkAgASgCUCgCDEEEcUUNACABKAIwRQ0AAn8gASgCUCgCFARAIAEoAlAoAhwgASgCWCgCDCABKAIwayABKAIwEBsMAQsgASgCUCgCHCABKAJYKAIMIAEoAjBrIAEoAjAQPQshACABKAJQIAA2AhwgASgCWCAANgIwCyABKAJYIAEoAlAoAkBBwABBACABKAJQKAIIG2pBgAFBACABKAJQKAIEQb/+AEYbakGAAkEAIAEoAlAoAgRBx/4ARwR/IAEoAlAoAgRBwv4ARgVBAQtBAXEbajYCLAJAAkAgASgCNEUEQCABKAIwRQ0BCyABKAJUQQRHDQELIAEoAhANACABQXs2AhALIAEgASgCEDYCXAsgASgCXCEAIAFB4ABqJAAgAAvoAgEBfyMAQSBrIgEkACABIAA2AhggAUFxNgIUIAFBkIMBNgIQIAFBODYCDAJAAkACQCABKAIQRQ0AIAEoAhAsAABBgO4ALAAARw0AIAEoAgxBOEYNAQsgAUF6NgIcDAELIAEoAhhFBEAgAUF+NgIcDAELIAEoAhhBADYCGCABKAIYKAIgRQRAIAEoAhhBBTYCICABKAIYQQA2AigLIAEoAhgoAiRFBEAgASgCGEEGNgIkCyABIAEoAhgoAihBAUHQNyABKAIYKAIgEQEANgIEIAEoAgRFBEAgAUF8NgIcDAELIAEoAhggASgCBDYCHCABKAIEIAEoAhg2AgAgASgCBEEANgI4IAEoAgRBtP4ANgIEIAEgASgCGCABKAIUENICNgIIIAEoAggEQCABKAIYKAIoIAEoAgQgASgCGCgCJBEEACABKAIYQQA2AhwLIAEgASgCCDYCHAsgASgCHCEAIAFBIGokACAAC60CAQF/IwBBIGsiAiQAIAIgADYCGCACIAE2AhQCQCACKAIYEEsEQCACQX42AhwMAQsgAiACKAIYKAIcNgIMAkAgAigCFEEASARAIAJBADYCECACQQAgAigCFGs2AhQMAQsgAiACKAIUQQR1QQVqNgIQIAIoAhRBMEgEQCACIAIoAhRBD3E2AhQLCwJAIAIoAhRFDQAgAigCFEEITgRAIAIoAhRBD0wNAQsgAkF+NgIcDAELAkAgAigCDCgCOEUNACACKAIMKAIoIAIoAhRGDQAgAigCGCgCKCACKAIMKAI4IAIoAhgoAiQRBAAgAigCDEEANgI4CyACKAIMIAIoAhA2AgwgAigCDCACKAIUNgIoIAIgAigCGBDTAjYCHAsgAigCHCEAIAJBIGokACAAC3IBAX8jAEEQayIBJAAgASAANgIIAkAgASgCCBBLBEAgAUF+NgIMDAELIAEgASgCCCgCHDYCBCABKAIEQQA2AiwgASgCBEEANgIwIAEoAgRBADYCNCABIAEoAggQ1AI2AgwLIAEoAgwhACABQRBqJAAgAAubAgEBfyMAQRBrIgEkACABIAA2AggCQCABKAIIEEsEQCABQX42AgwMAQsgASABKAIIKAIcNgIEIAEoAgRBADYCICABKAIIQQA2AhQgASgCCEEANgIIIAEoAghBADYCGCABKAIEKAIMBEAgASgCCCABKAIEKAIMQQFxNgIwCyABKAIEQbT+ADYCBCABKAIEQQA2AgggASgCBEEANgIQIAEoAgRBgIACNgIYIAEoAgRBADYCJCABKAIEQQA2AjwgASgCBEEANgJAIAEoAgQgASgCBEG0CmoiADYCcCABKAIEIAA2AlQgASgCBCAANgJQIAEoAgRBATYCxDcgASgCBEF/NgLINyABQQA2AgwLIAEoAgwhACABQRBqJAAgAAuIAQEBfyMAQRBrIgIkACACIAA2AgwgAiABNgIIIwBBEGsiACACKAIMNgIMIAAoAgxBADYCACAAKAIMQQA2AgQgACgCDEEANgIIIAIoAgwgAigCCDYCAAJAIAIoAgwQsAFBAUYEQCACKAIMQbScASgCADYCBAwBCyACKAIMQQA2AgQLIAJBEGokAAuSFQEBfyMAQeAAayICIAA2AlwgAiABNgJYIAIgAigCXCgCHDYCVCACIAIoAlwoAgA2AlAgAiACKAJQIAIoAlwoAgRBBWtqNgJMIAIgAigCXCgCDDYCSCACIAIoAkggAigCWCACKAJcKAIQa2s2AkQgAiACKAJIIAIoAlwoAhBBgQJrajYCQCACIAIoAlQoAiw2AjwgAiACKAJUKAIwNgI4IAIgAigCVCgCNDYCNCACIAIoAlQoAjg2AjAgAiACKAJUKAI8NgIsIAIgAigCVCgCQDYCKCACIAIoAlQoAlA2AiQgAiACKAJUKAJUNgIgIAJBASACKAJUKAJYdEEBazYCHCACQQEgAigCVCgCXHRBAWs2AhgDQCACKAIoQQ9JBEAgAiACKAJQIgBBAWo2AlAgAiACKAIsIAAtAAAgAigCKHRqNgIsIAIgAigCKEEIajYCKCACIAIoAlAiAEEBajYCUCACIAIoAiwgAC0AACACKAIodGo2AiwgAiACKAIoQQhqNgIoCyACQRBqIAIoAiQgAigCLCACKAIccUECdGooAQA2AQACQAJAA0AgAiACLQARNgIMIAIgAigCLCACKAIMdjYCLCACIAIoAiggAigCDGs2AiggAiACLQAQNgIMIAIoAgxFBEAgAi8BEiEAIAIgAigCSCIBQQFqNgJIIAEgADoAAAwCCyACKAIMQRBxBEAgAiACLwESNgIIIAIgAigCDEEPcTYCDCACKAIMBEAgAigCKCACKAIMSQRAIAIgAigCUCIAQQFqNgJQIAIgAigCLCAALQAAIAIoAih0ajYCLCACIAIoAihBCGo2AigLIAIgAigCCCACKAIsQQEgAigCDHRBAWtxajYCCCACIAIoAiwgAigCDHY2AiwgAiACKAIoIAIoAgxrNgIoCyACKAIoQQ9JBEAgAiACKAJQIgBBAWo2AlAgAiACKAIsIAAtAAAgAigCKHRqNgIsIAIgAigCKEEIajYCKCACIAIoAlAiAEEBajYCUCACIAIoAiwgAC0AACACKAIodGo2AiwgAiACKAIoQQhqNgIoCyACQRBqIAIoAiAgAigCLCACKAIYcUECdGooAQA2AQACQANAIAIgAi0AETYCDCACIAIoAiwgAigCDHY2AiwgAiACKAIoIAIoAgxrNgIoIAIgAi0AEDYCDCACKAIMQRBxBEAgAiACLwESNgIEIAIgAigCDEEPcTYCDCACKAIoIAIoAgxJBEAgAiACKAJQIgBBAWo2AlAgAiACKAIsIAAtAAAgAigCKHRqNgIsIAIgAigCKEEIajYCKCACKAIoIAIoAgxJBEAgAiACKAJQIgBBAWo2AlAgAiACKAIsIAAtAAAgAigCKHRqNgIsIAIgAigCKEEIajYCKAsLIAIgAigCBCACKAIsQQEgAigCDHRBAWtxajYCBCACIAIoAiwgAigCDHY2AiwgAiACKAIoIAIoAgxrNgIoIAIgAigCSCACKAJEazYCDAJAIAIoAgQgAigCDEsEQCACIAIoAgQgAigCDGs2AgwgAigCDCACKAI4SwRAIAIoAlQoAsQ3BEAgAigCXEGw7QA2AhggAigCVEHR/gA2AgQMCgsLIAIgAigCMDYCAAJAIAIoAjRFBEAgAiACKAIAIAIoAjwgAigCDGtqNgIAIAIoAgwgAigCCEkEQCACIAIoAgggAigCDGs2AggDQCACIAIoAgAiAEEBajYCACAALQAAIQAgAiACKAJIIgFBAWo2AkggASAAOgAAIAIgAigCDEF/aiIANgIMIAANAAsgAiACKAJIIAIoAgRrNgIACwwBCwJAIAIoAjQgAigCDEkEQCACIAIoAgAgAigCPCACKAI0aiACKAIMa2o2AgAgAiACKAIMIAIoAjRrNgIMIAIoAgwgAigCCEkEQCACIAIoAgggAigCDGs2AggDQCACIAIoAgAiAEEBajYCACAALQAAIQAgAiACKAJIIgFBAWo2AkggASAAOgAAIAIgAigCDEF/aiIANgIMIAANAAsgAiACKAIwNgIAIAIoAjQgAigCCEkEQCACIAIoAjQ2AgwgAiACKAIIIAIoAgxrNgIIA0AgAiACKAIAIgBBAWo2AgAgAC0AACEAIAIgAigCSCIBQQFqNgJIIAEgADoAACACIAIoAgxBf2oiADYCDCAADQALIAIgAigCSCACKAIEazYCAAsLDAELIAIgAigCACACKAI0IAIoAgxrajYCACACKAIMIAIoAghJBEAgAiACKAIIIAIoAgxrNgIIA0AgAiACKAIAIgBBAWo2AgAgAC0AACEAIAIgAigCSCIBQQFqNgJIIAEgADoAACACIAIoAgxBf2oiADYCDCAADQALIAIgAigCSCACKAIEazYCAAsLCwNAIAIoAghBAk1FBEAgAiACKAIAIgBBAWo2AgAgAC0AACEAIAIgAigCSCIBQQFqNgJIIAEgADoAACACIAIoAgAiAEEBajYCACAALQAAIQAgAiACKAJIIgFBAWo2AkggASAAOgAAIAIgAigCACIAQQFqNgIAIAAtAAAhACACIAIoAkgiAUEBajYCSCABIAA6AAAgAiACKAIIQQNrNgIIDAELCwwBCyACIAIoAkggAigCBGs2AgADQCACIAIoAgAiAEEBajYCACAALQAAIQAgAiACKAJIIgFBAWo2AkggASAAOgAAIAIgAigCACIAQQFqNgIAIAAtAAAhACACIAIoAkgiAUEBajYCSCABIAA6AAAgAiACKAIAIgBBAWo2AgAgAC0AACEAIAIgAigCSCIBQQFqNgJIIAEgADoAACACIAIoAghBA2s2AgggAigCCEECSw0ACwsgAigCCARAIAIgAigCACIAQQFqNgIAIAAtAAAhACACIAIoAkgiAUEBajYCSCABIAA6AAAgAigCCEEBSwRAIAIgAigCACIAQQFqNgIAIAAtAAAhACACIAIoAkgiAUEBajYCSCABIAA6AAALCwwCCyACKAIMQcAAcUUEQCACQRBqIAIoAiAgAi8BEiACKAIsQQEgAigCDHRBAWtxakECdGooAQA2AQAMAQsLIAIoAlxBzu0ANgIYIAIoAlRB0f4ANgIEDAQLDAILIAIoAgxBwABxRQRAIAJBEGogAigCJCACLwESIAIoAixBASACKAIMdEEBa3FqQQJ0aigBADYBAAwBCwsgAigCDEEgcQRAIAIoAlRBv/4ANgIEDAILIAIoAlxB5O0ANgIYIAIoAlRB0f4ANgIEDAELQQAhACACKAJQIAIoAkxJBH8gAigCSCACKAJASQVBAAtBAXENAQsLIAIgAigCKEEDdjYCCCACIAIoAlAgAigCCGs2AlAgAiACKAIoIAIoAghBA3RrNgIoIAIgAigCLEEBIAIoAih0QQFrcTYCLCACKAJcIAIoAlA2AgAgAigCXCACKAJINgIMIAIoAlwCfyACKAJQIAIoAkxJBEAgAigCTCACKAJQa0EFagwBC0EFIAIoAlAgAigCTGtrCzYCBCACKAJcAn8gAigCSCACKAJASQRAIAIoAkAgAigCSGtBgQJqDAELQYECIAIoAkggAigCQGtrCzYCECACKAJUIAIoAiw2AjwgAigCVCACKAIoNgJAC8EQAQJ/IwBBIGsiAiQAIAIgADYCGCACIAE2AhQCQANAAkAgAigCGCgCdEGGAkkEQCACKAIYEFYCQCACKAIYKAJ0QYYCTw0AIAIoAhQNACACQQA2AhwMBAsgAigCGCgCdEUNAQsgAkEANgIQIAIoAhgoAnRBA08EQCACKAIYIAIoAhgoAlQgAigCGCgCOCACKAIYKAJsQQJqai0AACACKAIYKAJIIAIoAhgoAlh0c3E2AkggAigCGCgCQCACKAIYKAJsIAIoAhgoAjRxQQF0aiACKAIYKAJEIAIoAhgoAkhBAXRqLwEAIgA7AQAgAiAAQf//A3E2AhAgAigCGCgCRCACKAIYKAJIQQF0aiACKAIYKAJsOwEACyACKAIYIAIoAhgoAmA2AnggAigCGCACKAIYKAJwNgJkIAIoAhhBAjYCYAJAIAIoAhBFDQAgAigCGCgCeCACKAIYKAKAAU8NACACKAIYKAJsIAIoAhBrIAIoAhgoAixBhgJrSw0AIAIoAhggAigCEBCxASEAIAIoAhggADYCYAJAIAIoAhgoAmBBBUsNACACKAIYKAKIAUEBRwRAIAIoAhgoAmBBA0cNASACKAIYKAJsIAIoAhgoAnBrQYAgTQ0BCyACKAIYQQI2AmALCwJAAkAgAigCGCgCeEEDSQ0AIAIoAhgoAmAgAigCGCgCeEsNACACIAIoAhgiACgCbCAAKAJ0akF9ajYCCCACIAIoAhgoAnhBfWo6AAcgAiACKAIYIgAoAmwgACgCZEF/c2o7AQQgAigCGCIAKAKkLSAAKAKgLUEBdGogAi8BBDsBACACLQAHIQEgAigCGCIAKAKYLSEDIAAgACgCoC0iAEEBajYCoC0gACADaiABOgAAIAIgAi8BBEF/ajsBBCACKAIYIAItAAdBgNkAai0AAEECdGpBmAlqIgAgAC8BAEEBajsBACACKAIYQYgTagJ/IAIvAQRBgAJIBEAgAi8BBC0AgFUMAQsgAi8BBEEHdUGAAmotAIBVC0ECdGoiACAALwEAQQFqOwEAIAIgAigCGCgCoC0gAigCGCgCnC1BAWtGNgIMIAIoAhgiACAAKAJ0IAIoAhgoAnhBAWtrNgJ0IAIoAhgiACAAKAJ4QQJrNgJ4A0AgAigCGCIBKAJsQQFqIQAgASAANgJsIAAgAigCCE0EQCACKAIYIAIoAhgoAlQgAigCGCgCOCACKAIYKAJsQQJqai0AACACKAIYKAJIIAIoAhgoAlh0c3E2AkggAigCGCgCQCACKAIYKAJsIAIoAhgoAjRxQQF0aiACKAIYKAJEIAIoAhgoAkhBAXRqLwEAIgA7AQAgAiAAQf//A3E2AhAgAigCGCgCRCACKAIYKAJIQQF0aiACKAIYKAJsOwEACyACKAIYIgEoAnhBf2ohACABIAA2AnggAA0ACyACKAIYQQA2AmggAigCGEECNgJgIAIoAhgiACAAKAJsQQFqNgJsIAIoAgwEQCACKAIYAn8gAigCGCgCXEEATgRAIAIoAhgoAjggAigCGCgCXGoMAQtBAAsgAigCGCgCbCACKAIYKAJca0EAECkgAigCGCACKAIYKAJsNgJcIAIoAhgoAgAQHSACKAIYKAIAKAIQRQRAIAJBADYCHAwGCwsMAQsCQCACKAIYKAJoBEAgAiACKAIYIgAoAjggACgCbGpBf2otAAA6AAMgAigCGCIAKAKkLSAAKAKgLUEBdGpBADsBACACLQADIQEgAigCGCIAKAKYLSEDIAAgACgCoC0iAEEBajYCoC0gACADaiABOgAAIAIoAhggAi0AA0ECdGoiACAALwGUAUEBajsBlAEgAiACKAIYKAKgLSACKAIYKAKcLUEBa0Y2AgwgAigCDARAIAIoAhgCfyACKAIYKAJcQQBOBEAgAigCGCgCOCACKAIYKAJcagwBC0EACyACKAIYKAJsIAIoAhgoAlxrQQAQKSACKAIYIAIoAhgoAmw2AlwgAigCGCgCABAdCyACKAIYIgAgACgCbEEBajYCbCACKAIYIgAgACgCdEF/ajYCdCACKAIYKAIAKAIQRQRAIAJBADYCHAwGCwwBCyACKAIYQQE2AmggAigCGCIAIAAoAmxBAWo2AmwgAigCGCIAIAAoAnRBf2o2AnQLCwwBCwsgAigCGCgCaARAIAIgAigCGCIAKAI4IAAoAmxqQX9qLQAAOgACIAIoAhgiACgCpC0gACgCoC1BAXRqQQA7AQAgAi0AAiEBIAIoAhgiACgCmC0hAyAAIAAoAqAtIgBBAWo2AqAtIAAgA2ogAToAACACKAIYIAItAAJBAnRqIgAgAC8BlAFBAWo7AZQBIAIgAigCGCgCoC0gAigCGCgCnC1BAWtGNgIMIAIoAhhBADYCaAsgAigCGAJ/IAIoAhgoAmxBAkkEQCACKAIYKAJsDAELQQILNgK0LSACKAIUQQRGBEAgAigCGAJ/IAIoAhgoAlxBAE4EQCACKAIYKAI4IAIoAhgoAlxqDAELQQALIAIoAhgoAmwgAigCGCgCXGtBARApIAIoAhggAigCGCgCbDYCXCACKAIYKAIAEB0gAigCGCgCACgCEEUEQCACQQI2AhwMAgsgAkEDNgIcDAELIAIoAhgoAqAtBEAgAigCGAJ/IAIoAhgoAlxBAE4EQCACKAIYKAI4IAIoAhgoAlxqDAELQQALIAIoAhgoAmwgAigCGCgCXGtBABApIAIoAhggAigCGCgCbDYCXCACKAIYKAIAEB0gAigCGCgCACgCEEUEQCACQQA2AhwMAgsLIAJBATYCHAsgAigCHCEAIAJBIGokACAAC5UNAQJ/IwBBIGsiAiQAIAIgADYCGCACIAE2AhQCQANAAkAgAigCGCgCdEGGAkkEQCACKAIYEFYCQCACKAIYKAJ0QYYCTw0AIAIoAhQNACACQQA2AhwMBAsgAigCGCgCdEUNAQsgAkEANgIQIAIoAhgoAnRBA08EQCACKAIYIAIoAhgoAlQgAigCGCgCOCACKAIYKAJsQQJqai0AACACKAIYKAJIIAIoAhgoAlh0c3E2AkggAigCGCgCQCACKAIYKAJsIAIoAhgoAjRxQQF0aiACKAIYKAJEIAIoAhgoAkhBAXRqLwEAIgA7AQAgAiAAQf//A3E2AhAgAigCGCgCRCACKAIYKAJIQQF0aiACKAIYKAJsOwEACwJAIAIoAhBFDQAgAigCGCgCbCACKAIQayACKAIYKAIsQYYCa0sNACACKAIYIAIoAhAQsQEhACACKAIYIAA2AmALAkAgAigCGCgCYEEDTwRAIAIgAigCGCgCYEF9ajoACyACIAIoAhgiACgCbCAAKAJwazsBCCACKAIYIgAoAqQtIAAoAqAtQQF0aiACLwEIOwEAIAItAAshASACKAIYIgAoApgtIQMgACAAKAKgLSIAQQFqNgKgLSAAIANqIAE6AAAgAiACLwEIQX9qOwEIIAIoAhggAi0AC0GA2QBqLQAAQQJ0akGYCWoiACAALwEAQQFqOwEAIAIoAhhBiBNqAn8gAi8BCEGAAkgEQCACLwEILQCAVQwBCyACLwEIQQd1QYACai0AgFULQQJ0aiIAIAAvAQBBAWo7AQAgAiACKAIYKAKgLSACKAIYKAKcLUEBa0Y2AgwgAigCGCIAIAAoAnQgAigCGCgCYGs2AnQCQAJAIAIoAhgoAmAgAigCGCgCgAFLDQAgAigCGCgCdEEDSQ0AIAIoAhgiACAAKAJgQX9qNgJgA0AgAigCGCIAIAAoAmxBAWo2AmwgAigCGCACKAIYKAJUIAIoAhgoAjggAigCGCgCbEECamotAAAgAigCGCgCSCACKAIYKAJYdHNxNgJIIAIoAhgoAkAgAigCGCgCbCACKAIYKAI0cUEBdGogAigCGCgCRCACKAIYKAJIQQF0ai8BACIAOwEAIAIgAEH//wNxNgIQIAIoAhgoAkQgAigCGCgCSEEBdGogAigCGCgCbDsBACACKAIYIgEoAmBBf2ohACABIAA2AmAgAA0ACyACKAIYIgAgACgCbEEBajYCbAwBCyACKAIYIgAgAigCGCgCYCAAKAJsajYCbCACKAIYQQA2AmAgAigCGCACKAIYKAI4IAIoAhgoAmxqLQAANgJIIAIoAhggAigCGCgCVCACKAIYKAI4IAIoAhgoAmxBAWpqLQAAIAIoAhgoAkggAigCGCgCWHRzcTYCSAsMAQsgAiACKAIYIgAoAjggACgCbGotAAA6AAcgAigCGCIAKAKkLSAAKAKgLUEBdGpBADsBACACLQAHIQEgAigCGCIAKAKYLSEDIAAgACgCoC0iAEEBajYCoC0gACADaiABOgAAIAIoAhggAi0AB0ECdGoiACAALwGUAUEBajsBlAEgAiACKAIYKAKgLSACKAIYKAKcLUEBa0Y2AgwgAigCGCIAIAAoAnRBf2o2AnQgAigCGCIAIAAoAmxBAWo2AmwLIAIoAgwEQCACKAIYAn8gAigCGCgCXEEATgRAIAIoAhgoAjggAigCGCgCXGoMAQtBAAsgAigCGCgCbCACKAIYKAJca0EAECkgAigCGCACKAIYKAJsNgJcIAIoAhgoAgAQHSACKAIYKAIAKAIQRQRAIAJBADYCHAwECwsMAQsLIAIoAhgCfyACKAIYKAJsQQJJBEAgAigCGCgCbAwBC0ECCzYCtC0gAigCFEEERgRAIAIoAhgCfyACKAIYKAJcQQBOBEAgAigCGCgCOCACKAIYKAJcagwBC0EACyACKAIYKAJsIAIoAhgoAlxrQQEQKSACKAIYIAIoAhgoAmw2AlwgAigCGCgCABAdIAIoAhgoAgAoAhBFBEAgAkECNgIcDAILIAJBAzYCHAwBCyACKAIYKAKgLQRAIAIoAhgCfyACKAIYKAJcQQBOBEAgAigCGCgCOCACKAIYKAJcagwBC0EACyACKAIYKAJsIAIoAhgoAlxrQQAQKSACKAIYIAIoAhgoAmw2AlwgAigCGCgCABAdIAIoAhgoAgAoAhBFBEAgAkEANgIcDAILCyACQQE2AhwLIAIoAhwhACACQSBqJAAgAAu7DAECfyMAQTBrIgIkACACIAA2AiggAiABNgIkAkADQAJAIAIoAigoAnRBggJNBEAgAigCKBBWAkAgAigCKCgCdEGCAksNACACKAIkDQAgAkEANgIsDAQLIAIoAigoAnRFDQELIAIoAihBADYCYAJAIAIoAigoAnRBA0kNACACKAIoKAJsQQBNDQAgAiACKAIoKAI4IAIoAigoAmxqQX9qNgIYIAIgAigCGC0AADYCHCACKAIcIQAgAiACKAIYIgFBAWo2AhgCQCABLQABIABHDQAgAigCHCEAIAIgAigCGCIBQQFqNgIYIAEtAAEgAEcNACACKAIcIQAgAiACKAIYIgFBAWo2AhggAS0AASAARw0AIAIgAigCKCgCOCACKAIoKAJsakGCAmo2AhQDQCACKAIcIQEgAiACKAIYIgNBAWo2AhgCf0EAIAMtAAEgAUcNABogAigCHCEBIAIgAigCGCIDQQFqNgIYQQAgAy0AASABRw0AGiACKAIcIQEgAiACKAIYIgNBAWo2AhhBACADLQABIAFHDQAaIAIoAhwhASACIAIoAhgiA0EBajYCGEEAIAMtAAEgAUcNABogAigCHCEBIAIgAigCGCIDQQFqNgIYQQAgAy0AASABRw0AGiACKAIcIQEgAiACKAIYIgNBAWo2AhhBACADLQABIAFHDQAaIAIoAhwhASACIAIoAhgiA0EBajYCGEEAIAMtAAEgAUcNABogAigCHCEBIAIgAigCGCIDQQFqNgIYQQAgAy0AASABRw0AGiACKAIYIAIoAhRJC0EBcQ0ACyACKAIoQYICIAIoAhQgAigCGGtrNgJgIAIoAigoAmAgAigCKCgCdEsEQCACKAIoIAIoAigoAnQ2AmALCwsCQCACKAIoKAJgQQNPBEAgAiACKAIoKAJgQX1qOgATIAJBATsBECACKAIoIgAoAqQtIAAoAqAtQQF0aiACLwEQOwEAIAItABMhASACKAIoIgAoApgtIQMgACAAKAKgLSIAQQFqNgKgLSAAIANqIAE6AAAgAiACLwEQQX9qOwEQIAIoAiggAi0AE0GA2QBqLQAAQQJ0akGYCWoiACAALwEAQQFqOwEAIAIoAihBiBNqAn8gAi8BEEGAAkgEQCACLwEQLQCAVQwBCyACLwEQQQd1QYACai0AgFULQQJ0aiIAIAAvAQBBAWo7AQAgAiACKAIoKAKgLSACKAIoKAKcLUEBa0Y2AiAgAigCKCIAIAAoAnQgAigCKCgCYGs2AnQgAigCKCIAIAIoAigoAmAgACgCbGo2AmwgAigCKEEANgJgDAELIAIgAigCKCIAKAI4IAAoAmxqLQAAOgAPIAIoAigiACgCpC0gACgCoC1BAXRqQQA7AQAgAi0ADyEBIAIoAigiACgCmC0hAyAAIAAoAqAtIgBBAWo2AqAtIAAgA2ogAToAACACKAIoIAItAA9BAnRqIgAgAC8BlAFBAWo7AZQBIAIgAigCKCgCoC0gAigCKCgCnC1BAWtGNgIgIAIoAigiACAAKAJ0QX9qNgJ0IAIoAigiACAAKAJsQQFqNgJsCyACKAIgBEAgAigCKAJ/IAIoAigoAlxBAE4EQCACKAIoKAI4IAIoAigoAlxqDAELQQALIAIoAigoAmwgAigCKCgCXGtBABApIAIoAiggAigCKCgCbDYCXCACKAIoKAIAEB0gAigCKCgCACgCEEUEQCACQQA2AiwMBAsLDAELCyACKAIoQQA2ArQtIAIoAiRBBEYEQCACKAIoAn8gAigCKCgCXEEATgRAIAIoAigoAjggAigCKCgCXGoMAQtBAAsgAigCKCgCbCACKAIoKAJca0EBECkgAigCKCACKAIoKAJsNgJcIAIoAigoAgAQHSACKAIoKAIAKAIQRQRAIAJBAjYCLAwCCyACQQM2AiwMAQsgAigCKCgCoC0EQCACKAIoAn8gAigCKCgCXEEATgRAIAIoAigoAjggAigCKCgCXGoMAQtBAAsgAigCKCgCbCACKAIoKAJca0EAECkgAigCKCACKAIoKAJsNgJcIAIoAigoAgAQHSACKAIoKAIAKAIQRQRAIAJBADYCLAwCCwsgAkEBNgIsCyACKAIsIQAgAkEwaiQAIAALwAUBAn8jAEEgayICJAAgAiAANgIYIAIgATYCFAJAA0ACQCACKAIYKAJ0RQRAIAIoAhgQViACKAIYKAJ0RQRAIAIoAhRFBEAgAkEANgIcDAULDAILCyACKAIYQQA2AmAgAiACKAIYIgAoAjggACgCbGotAAA6AA8gAigCGCIAKAKkLSAAKAKgLUEBdGpBADsBACACLQAPIQEgAigCGCIAKAKYLSEDIAAgACgCoC0iAEEBajYCoC0gACADaiABOgAAIAIoAhggAi0AD0ECdGoiACAALwGUAUEBajsBlAEgAiACKAIYKAKgLSACKAIYKAKcLUEBa0Y2AhAgAigCGCIAIAAoAnRBf2o2AnQgAigCGCIAIAAoAmxBAWo2AmwgAigCEARAIAIoAhgCfyACKAIYKAJcQQBOBEAgAigCGCgCOCACKAIYKAJcagwBC0EACyACKAIYKAJsIAIoAhgoAlxrQQAQKSACKAIYIAIoAhgoAmw2AlwgAigCGCgCABAdIAIoAhgoAgAoAhBFBEAgAkEANgIcDAQLCwwBCwsgAigCGEEANgK0LSACKAIUQQRGBEAgAigCGAJ/IAIoAhgoAlxBAE4EQCACKAIYKAI4IAIoAhgoAlxqDAELQQALIAIoAhgoAmwgAigCGCgCXGtBARApIAIoAhggAigCGCgCbDYCXCACKAIYKAIAEB0gAigCGCgCACgCEEUEQCACQQI2AhwMAgsgAkEDNgIcDAELIAIoAhgoAqAtBEAgAigCGAJ/IAIoAhgoAlxBAE4EQCACKAIYKAI4IAIoAhgoAlxqDAELQQALIAIoAhgoAmwgAigCGCgCXGtBABApIAIoAhggAigCGCgCbDYCXCACKAIYKAIAEB0gAigCGCgCACgCEEUEQCACQQA2AhwMAgsLIAJBATYCHAsgAigCHCEAIAJBIGokACAAC0UAQaCcAUIANwMAQZicAUIANwMAQZCcAUIANwMAQYicAUIANwMAQYCcAUIANwMAQfibAUIANwMAQfCbAUIANwMAQfCbAQu1JQEDfyMAQUBqIgIkACACIAA2AjggAiABNgI0AkACQAJAIAIoAjgQdA0AIAIoAjRBBUoNACACKAI0QQBODQELIAJBfjYCPAwBCyACIAIoAjgoAhw2AiwCQAJAIAIoAjgoAgxFDQAgAigCOCgCBARAIAIoAjgoAgBFDQELIAIoAiwoAgRBmgVHDQEgAigCNEEERg0BCyACKAI4QeDUACgCADYCGCACQX42AjwMAQsgAigCOCgCEEUEQCACKAI4QezUACgCADYCGCACQXs2AjwMAQsgAiACKAIsKAIoNgIwIAIoAiwgAigCNDYCKAJAIAIoAiwoAhQEQCACKAI4EB0gAigCOCgCEEUEQCACKAIsQX82AiggAkEANgI8DAMLDAELAkAgAigCOCgCBA0AIAIoAjRBAXRBCUEAIAIoAjRBBEobayACKAIwQQF0QQlBACACKAIwQQRKG2tKDQAgAigCNEEERg0AIAIoAjhB7NQAKAIANgIYIAJBezYCPAwCCwsCQCACKAIsKAIEQZoFRw0AIAIoAjgoAgRFDQAgAigCOEHs1AAoAgA2AhggAkF7NgI8DAELIAIoAiwoAgRBKkYEQCACIAIoAiwoAjBBBHRBiH9qQQh0NgIoAkACQCACKAIsKAKIAUECSARAIAIoAiwoAoQBQQJODQELIAJBADYCJAwBCwJAIAIoAiwoAoQBQQZIBEAgAkEBNgIkDAELAkAgAigCLCgChAFBBkYEQCACQQI2AiQMAQsgAkEDNgIkCwsLIAIgAigCKCACKAIkQQZ0cjYCKCACKAIsKAJsBEAgAiACKAIoQSByNgIoCyACIAIoAihBHyACKAIoQR9wa2o2AiggAigCLCACKAIoEEwgAigCLCgCbARAIAIoAiwgAigCOCgCMEEQdhBMIAIoAiwgAigCOCgCMEH//wNxEEwLQQBBAEEAED0hACACKAI4IAA2AjAgAigCLEHxADYCBCACKAI4EB0gAigCLCgCFARAIAIoAixBfzYCKCACQQA2AjwMAgsLIAIoAiwoAgRBOUYEQEEAQQBBABAbIQAgAigCOCAANgIwIAIoAiwoAgghASACKAIsIgMoAhQhACADIABBAWo2AhQgACABakEfOgAAIAIoAiwoAgghASACKAIsIgMoAhQhACADIABBAWo2AhQgACABakGLAToAACACKAIsKAIIIQEgAigCLCIDKAIUIQAgAyAAQQFqNgIUIAAgAWpBCDoAAAJAIAIoAiwoAhxFBEAgAigCLCgCCCEBIAIoAiwiAygCFCEAIAMgAEEBajYCFCAAIAFqQQA6AAAgAigCLCgCCCEBIAIoAiwiAygCFCEAIAMgAEEBajYCFCAAIAFqQQA6AAAgAigCLCgCCCEBIAIoAiwiAygCFCEAIAMgAEEBajYCFCAAIAFqQQA6AAAgAigCLCgCCCEBIAIoAiwiAygCFCEAIAMgAEEBajYCFCAAIAFqQQA6AAAgAigCLCgCCCEBIAIoAiwiAygCFCEAIAMgAEEBajYCFCAAIAFqQQA6AAACf0ECIAIoAiwoAoQBQQlGDQAaQQEhAEEEQQAgAigCLCgCiAFBAkgEfyACKAIsKAKEAUECSAVBAQtBAXEbCyEAIAIoAiwoAgghAyACKAIsIgQoAhQhASAEIAFBAWo2AhQgASADaiAAOgAAIAIoAiwoAgghASACKAIsIgMoAhQhACADIABBAWo2AhQgACABakEDOgAAIAIoAixB8QA2AgQgAigCOBAdIAIoAiwoAhQEQCACKAIsQX82AiggAkEANgI8DAQLDAELQQFBACACKAIsKAIcKAIAG0ECQQAgAigCLCgCHCgCLBtqQQRBACACKAIsKAIcKAIQG2pBCEEAIAIoAiwoAhwoAhwbakEQQQAgAigCLCgCHCgCJBtqIQEgAigCLCgCCCEDIAIoAiwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AAAgAigCLCgCHCgCBEH/AXEhASACKAIsKAIIIQMgAigCLCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAToAACACKAIsKAIcKAIEQQh2Qf8BcSEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAIAIoAiwoAhwoAgRBEHZB/wFxIQEgAigCLCgCCCEDIAIoAiwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AAAgAigCLCgCHCgCBEEYdiEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAAn9BAiACKAIsKAKEAUEJRg0AGkEBIQBBBEEAIAIoAiwoAogBQQJIBH8gAigCLCgChAFBAkgFQQELQQFxGwshACACKAIsKAIIIQMgAigCLCIEKAIUIQEgBCABQQFqNgIUIAEgA2ogADoAACACKAIsKAIcKAIMQf8BcSEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAIAIoAiwoAhwoAhAEQCACKAIsKAIcKAIUQf8BcSEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAIAIoAiwoAhwoAhRBCHZB/wFxIQEgAigCLCgCCCEDIAIoAiwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AAALIAIoAiwoAhwoAiwEQCACKAI4KAIwIAIoAiwoAgggAigCLCgCFBAbIQAgAigCOCAANgIwCyACKAIsQQA2AiAgAigCLEHFADYCBAsLIAIoAiwoAgRBxQBGBEAgAigCLCgCHCgCEARAIAIgAigCLCgCFDYCICACIAIoAiwoAhwoAhRB//8DcSACKAIsKAIgazYCHANAIAIoAiwoAhQgAigCHGogAigCLCgCDEsEQCACIAIoAiwoAgwgAigCLCgCFGs2AhggAigCLCgCCCACKAIsKAIUaiACKAIsKAIcKAIQIAIoAiwoAiBqIAIoAhgQGhogAigCLCACKAIsKAIMNgIUAkAgAigCLCgCHCgCLEUNACACKAIsKAIUIAIoAiBNDQAgAigCOCgCMCACKAIsKAIIIAIoAiBqIAIoAiwoAhQgAigCIGsQGyEAIAIoAjggADYCMAsgAigCLCIAIAIoAhggACgCIGo2AiAgAigCOBAdIAIoAiwoAhQEQCACKAIsQX82AiggAkEANgI8DAUFIAJBADYCICACIAIoAhwgAigCGGs2AhwMAgsACwsgAigCLCgCCCACKAIsKAIUaiACKAIsKAIcKAIQIAIoAiwoAiBqIAIoAhwQGhogAigCLCIAIAIoAhwgACgCFGo2AhQCQCACKAIsKAIcKAIsRQ0AIAIoAiwoAhQgAigCIE0NACACKAI4KAIwIAIoAiwoAgggAigCIGogAigCLCgCFCACKAIgaxAbIQAgAigCOCAANgIwCyACKAIsQQA2AiALIAIoAixByQA2AgQLIAIoAiwoAgRByQBGBEAgAigCLCgCHCgCHARAIAIgAigCLCgCFDYCFANAIAIoAiwoAhQgAigCLCgCDEYEQAJAIAIoAiwoAhwoAixFDQAgAigCLCgCFCACKAIUTQ0AIAIoAjgoAjAgAigCLCgCCCACKAIUaiACKAIsKAIUIAIoAhRrEBshACACKAI4IAA2AjALIAIoAjgQHSACKAIsKAIUBEAgAigCLEF/NgIoIAJBADYCPAwFCyACQQA2AhQLIAIoAiwoAhwoAhwhASACKAIsIgMoAiAhACADIABBAWo2AiAgAiAAIAFqLQAANgIQIAIoAhAhASACKAIsKAIIIQMgAigCLCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAToAACACKAIQDQALAkAgAigCLCgCHCgCLEUNACACKAIsKAIUIAIoAhRNDQAgAigCOCgCMCACKAIsKAIIIAIoAhRqIAIoAiwoAhQgAigCFGsQGyEAIAIoAjggADYCMAsgAigCLEEANgIgCyACKAIsQdsANgIECyACKAIsKAIEQdsARgRAIAIoAiwoAhwoAiQEQCACIAIoAiwoAhQ2AgwDQCACKAIsKAIUIAIoAiwoAgxGBEACQCACKAIsKAIcKAIsRQ0AIAIoAiwoAhQgAigCDE0NACACKAI4KAIwIAIoAiwoAgggAigCDGogAigCLCgCFCACKAIMaxAbIQAgAigCOCAANgIwCyACKAI4EB0gAigCLCgCFARAIAIoAixBfzYCKCACQQA2AjwMBQsgAkEANgIMCyACKAIsKAIcKAIkIQEgAigCLCIDKAIgIQAgAyAAQQFqNgIgIAIgACABai0AADYCCCACKAIIIQEgAigCLCgCCCEDIAIoAiwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AAAgAigCCA0ACwJAIAIoAiwoAhwoAixFDQAgAigCLCgCFCACKAIMTQ0AIAIoAjgoAjAgAigCLCgCCCACKAIMaiACKAIsKAIUIAIoAgxrEBshACACKAI4IAA2AjALCyACKAIsQecANgIECyACKAIsKAIEQecARgRAIAIoAiwoAhwoAiwEQCACKAIsKAIUQQJqIAIoAiwoAgxLBEAgAigCOBAdIAIoAiwoAhQEQCACKAIsQX82AiggAkEANgI8DAQLCyACKAI4KAIwQf8BcSEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAIAIoAjgoAjBBCHZB/wFxIQEgAigCLCgCCCEDIAIoAiwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AABBAEEAQQAQGyEAIAIoAjggADYCMAsgAigCLEHxADYCBCACKAI4EB0gAigCLCgCFARAIAIoAixBfzYCKCACQQA2AjwMAgsLAkACQCACKAI4KAIEDQAgAigCLCgCdA0AIAIoAjRFDQEgAigCLCgCBEGaBUYNAQsgAgJ/IAIoAiwoAoQBRQRAIAIoAiwgAigCNBCyAQwBCwJ/IAIoAiwoAogBQQJGBEAgAigCLCACKAI0ENoCDAELAn8gAigCLCgCiAFBA0YEQCACKAIsIAIoAjQQ2QIMAQsgAigCLCACKAI0IAIoAiwoAoQBQQxsQbDqAGooAggRAgALCws2AgQCQCACKAIEQQJHBEAgAigCBEEDRw0BCyACKAIsQZoFNgIECwJAIAIoAgQEQCACKAIEQQJHDQELIAIoAjgoAhBFBEAgAigCLEF/NgIoCyACQQA2AjwMAgsgAigCBEEBRgRAAkAgAigCNEEBRgRAIAIoAiwQ6QIMAQsgAigCNEEFRwRAIAIoAixBAEEAQQAQVyACKAI0QQNGBEAgAigCLCgCRCACKAIsKAJMQQFrQQF0akEAOwEAIAIoAiwoAkRBACACKAIsKAJMQQFrQQF0EDMgAigCLCgCdEUEQCACKAIsQQA2AmwgAigCLEEANgJcIAIoAixBADYCtC0LCwsLIAIoAjgQHSACKAI4KAIQRQRAIAIoAixBfzYCKCACQQA2AjwMAwsLCyACKAI0QQRHBEAgAkEANgI8DAELIAIoAiwoAhhBAEwEQCACQQE2AjwMAQsCQCACKAIsKAIYQQJGBEAgAigCOCgCMEH/AXEhASACKAIsKAIIIQMgAigCLCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAToAACACKAI4KAIwQQh2Qf8BcSEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAIAIoAjgoAjBBEHZB/wFxIQEgAigCLCgCCCEDIAIoAiwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AAAgAigCOCgCMEEYdiEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAIAIoAjgoAghB/wFxIQEgAigCLCgCCCEDIAIoAiwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AAAgAigCOCgCCEEIdkH/AXEhASACKAIsKAIIIQMgAigCLCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAToAACACKAI4KAIIQRB2Qf8BcSEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAIAIoAjgoAghBGHYhASACKAIsKAIIIQMgAigCLCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAToAAAwBCyACKAIsIAIoAjgoAjBBEHYQTCACKAIsIAIoAjgoAjBB//8DcRBMCyACKAI4EB0gAigCLCgCGEEASgRAIAIoAixBACACKAIsKAIYazYCGAsgAkEAQQEgAigCLCgCFBs2AjwLIAIoAjwhACACQUBrJAAgAAuOAgEBfyMAQSBrIgEgADYCHCABIAEoAhwoAiw2AgwgASABKAIcKAJMNgIYIAEgASgCHCgCRCABKAIYQQF0ajYCEANAIAEgASgCEEF+aiIANgIQIAEgAC8BADYCFCABKAIQAn8gASgCFCABKAIMTwRAIAEoAhQgASgCDGsMAQtBAAs7AQAgASABKAIYQX9qIgA2AhggAA0ACyABIAEoAgw2AhggASABKAIcKAJAIAEoAhhBAXRqNgIQA0AgASABKAIQQX5qIgA2AhAgASAALwEANgIUIAEoAhACfyABKAIUIAEoAgxPBEAgASgCFCABKAIMawwBC0EACzsBACABIAEoAhhBf2oiADYCGCAADQALC6gCAQF/IwBBEGsiASQAIAEgADYCDCABKAIMIAEoAgwoAixBAXQ2AjwgASgCDCgCRCABKAIMKAJMQQFrQQF0akEAOwEAIAEoAgwoAkRBACABKAIMKAJMQQFrQQF0EDMgASgCDCABKAIMKAKEAUEMbEGw6gBqLwECNgKAASABKAIMIAEoAgwoAoQBQQxsQbDqAGovAQA2AowBIAEoAgwgASgCDCgChAFBDGxBsOoAai8BBDYCkAEgASgCDCABKAIMKAKEAUEMbEGw6gBqLwEGNgJ8IAEoAgxBADYCbCABKAIMQQA2AlwgASgCDEEANgJ0IAEoAgxBADYCtC0gASgCDEECNgJ4IAEoAgxBAjYCYCABKAIMQQA2AmggASgCDEEANgJIIAFBEGokAAubAgEBfyMAQRBrIgEkACABIAA2AggCQCABKAIIEHQEQCABQX42AgwMAQsgASgCCEEANgIUIAEoAghBADYCCCABKAIIQQA2AhggASgCCEECNgIsIAEgASgCCCgCHDYCBCABKAIEQQA2AhQgASgCBCABKAIEKAIINgIQIAEoAgQoAhhBAEgEQCABKAIEQQAgASgCBCgCGGs2AhgLIAEoAgQCf0E5IAEoAgQoAhhBAkYNABpBKkHxACABKAIEKAIYGws2AgQCfyABKAIEKAIYQQJGBEBBAEEAQQAQGwwBC0EAQQBBABA9CyEAIAEoAgggADYCMCABKAIEQQA2AiggASgCBBDrAiABQQA2AgwLIAEoAgwhACABQRBqJAAgAAtFAQF/IwBBEGsiASQAIAEgADYCDCABIAEoAgwQ3wI2AgggASgCCEUEQCABKAIMKAIcEN4CCyABKAIIIQAgAUEQaiQAIAAL4AgBAX8jAEEwayICJAAgAiAANgIoIAIgATYCJCACQQg2AiAgAkFxNgIcIAJBCTYCGCACQQA2AhQgAkGQgwE2AhAgAkE4NgIMIAJBATYCBAJAAkACQCACKAIQRQ0AIAIoAhAsAABBqOoALAAARw0AIAIoAgxBOEYNAQsgAkF6NgIsDAELIAIoAihFBEAgAkF+NgIsDAELIAIoAihBADYCGCACKAIoKAIgRQRAIAIoAihBBTYCICACKAIoQQA2AigLIAIoAigoAiRFBEAgAigCKEEGNgIkCyACKAIkQX9GBEAgAkEGNgIkCwJAIAIoAhxBAEgEQCACQQA2AgQgAkEAIAIoAhxrNgIcDAELIAIoAhxBD0oEQCACQQI2AgQgAiACKAIcQRBrNgIcCwsCQAJAIAIoAhhBAUgNACACKAIYQQlKDQAgAigCIEEIRw0AIAIoAhxBCEgNACACKAIcQQ9KDQAgAigCJEEASA0AIAIoAiRBCUoNACACKAIUQQBIDQAgAigCFEEESg0AIAIoAhxBCEcNASACKAIEQQFGDQELIAJBfjYCLAwBCyACKAIcQQhGBEAgAkEJNgIcCyACIAIoAigoAihBAUHELSACKAIoKAIgEQEANgIIIAIoAghFBEAgAkF8NgIsDAELIAIoAiggAigCCDYCHCACKAIIIAIoAig2AgAgAigCCEEqNgIEIAIoAgggAigCBDYCGCACKAIIQQA2AhwgAigCCCACKAIcNgIwIAIoAghBASACKAIIKAIwdDYCLCACKAIIIAIoAggoAixBAWs2AjQgAigCCCACKAIYQQdqNgJQIAIoAghBASACKAIIKAJQdDYCTCACKAIIIAIoAggoAkxBAWs2AlQgAigCCCACKAIIKAJQQQJqQQNuNgJYIAIoAigoAiggAigCCCgCLEECIAIoAigoAiARAQAhACACKAIIIAA2AjggAigCKCgCKCACKAIIKAIsQQIgAigCKCgCIBEBACEAIAIoAgggADYCQCACKAIoKAIoIAIoAggoAkxBAiACKAIoKAIgEQEAIQAgAigCCCAANgJEIAIoAghBADYCwC0gAigCCEEBIAIoAhhBBmp0NgKcLSACIAIoAigoAiggAigCCCgCnC1BBCACKAIoKAIgEQEANgIAIAIoAgggAigCADYCCCACKAIIIAIoAggoApwtQQJ0NgIMAkACQCACKAIIKAI4RQ0AIAIoAggoAkBFDQAgAigCCCgCREUNACACKAIIKAIIDQELIAIoAghBmgU2AgQgAigCKEHo1AAoAgA2AhggAigCKBCzARogAkF8NgIsDAELIAIoAgggAigCACACKAIIKAKcLUEBdkEBdGo2AqQtIAIoAgggAigCCCgCCCACKAIIKAKcLUEDbGo2ApgtIAIoAgggAigCJDYChAEgAigCCCACKAIUNgKIASACKAIIIAIoAiA6ACQgAiACKAIoEOACNgIsCyACKAIsIQAgAkEwaiQAIAALGAEBfyMAQRBrIgEgADYCDCABKAIMQQxqC2wBAX8jAEEQayICIAA2AgwgAiABNgIIIAJBADYCBANAIAIgAigCBCACKAIMQQFxcjYCBCACIAIoAgxBAXY2AgwgAiACKAIEQQF0NgIEIAIgAigCCEF/aiIANgIIIABBAEoNAAsgAigCBEEBdguVAgEBfyMAQUBqIgMkACADIAA2AjwgAyABNgI4IAMgAjYCNCADQQA2AgwgA0EBNgIIA0AgAygCCEEPSkUEQCADIAMoAgwgAygCNCADKAIIQQFrQQF0ai8BAGpBAXQ2AgwgA0EQaiADKAIIQQF0aiADKAIMOwEAIAMgAygCCEEBajYCCAwBCwsgA0EANgIEA0AgAygCBCADKAI4TARAIAMgAygCPCADKAIEQQJ0ai8BAjYCACADKAIABEAgA0EQaiADKAIAQQF0aiIBLwEAIQAgASAAQQFqOwEAIABB//8DcSADKAIAEOMCIQAgAygCPCADKAIEQQJ0aiAAOwEACyADIAMoAgRBAWo2AgQMAQsLIANBQGskAAuICAEBfyMAQUBqIgIgADYCPCACIAE2AjggAiACKAI4KAIANgI0IAIgAigCOCgCBDYCMCACIAIoAjgoAggoAgA2AiwgAiACKAI4KAIIKAIENgIoIAIgAigCOCgCCCgCCDYCJCACIAIoAjgoAggoAhA2AiAgAkEANgIEIAJBADYCEANAIAIoAhBBD0pFBEAgAigCPEG8FmogAigCEEEBdGpBADsBACACIAIoAhBBAWo2AhAMAQsLIAIoAjQgAigCPEHcFmogAigCPCgC1ChBAnRqKAIAQQJ0akEAOwECIAIgAigCPCgC1ChBAWo2AhwDQCACKAIcQb0ESARAIAIgAigCPEHcFmogAigCHEECdGooAgA2AhggAiACKAI0IAIoAjQgAigCGEECdGovAQJBAnRqLwECQQFqNgIQIAIoAhAgAigCIEoEQCACIAIoAiA2AhAgAiACKAIEQQFqNgIECyACKAI0IAIoAhhBAnRqIAIoAhA7AQIgAigCGCACKAIwTARAIAIoAjwgAigCEEEBdGpBvBZqIgAgAC8BAEEBajsBACACQQA2AgwgAigCGCACKAIkTgRAIAIgAigCKCACKAIYIAIoAiRrQQJ0aigCADYCDAsgAiACKAI0IAIoAhhBAnRqLwEAOwEKIAIoAjwiACAAKAKoLSACLwEKIAIoAhAgAigCDGpsajYCqC0gAigCLARAIAIoAjwiACAAKAKsLSACLwEKIAIoAiwgAigCGEECdGovAQIgAigCDGpsajYCrC0LCyACIAIoAhxBAWo2AhwMAQsLAkAgAigCBEUNAANAIAIgAigCIEEBazYCEANAIAIoAjxBvBZqIAIoAhBBAXRqLwEARQRAIAIgAigCEEF/ajYCEAwBCwsgAigCPCACKAIQQQF0akG8FmoiACAALwEAQX9qOwEAIAIoAjwgAigCEEEBdGpBvhZqIgAgAC8BAEECajsBACACKAI8IAIoAiBBAXRqQbwWaiIAIAAvAQBBf2o7AQAgAiACKAIEQQJrNgIEIAIoAgRBAEoNAAsgAiACKAIgNgIQA0AgAigCEEUNASACIAIoAjxBvBZqIAIoAhBBAXRqLwEANgIYA0AgAigCGARAIAIoAjxB3BZqIQAgAiACKAIcQX9qIgE2AhwgAiABQQJ0IABqKAIANgIUIAIoAhQgAigCMEoNASACKAI0IAIoAhRBAnRqLwECIAIoAhBHBEAgAigCPCIAIAAoAqgtIAIoAjQgAigCFEECdGovAQAgAigCECACKAI0IAIoAhRBAnRqLwECa2xqNgKoLSACKAI0IAIoAhRBAnRqIAIoAhA7AQILIAIgAigCGEF/ajYCGAwBCwsgAiACKAIQQX9qNgIQDAAACwALC6ULAQF/IwBBQGoiBCQAIAQgADYCPCAEIAE2AjggBCACNgI0IAQgAzYCMCAEQQU2AigCQCAEKAI8KAK8LUEQIAQoAihrSgRAIAQgBCgCOEGBAms2AiQgBCgCPCIAIAAvAbgtIAQoAiRB//8DcSAEKAI8KAK8LXRyOwG4LSAEKAI8LwG4LUH/AXEhASAEKAI8KAIIIQIgBCgCPCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAI8LwG4LUEIdSEBIAQoAjwoAgghAiAEKAI8IgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAjwgBCgCJEH//wNxQRAgBCgCPCgCvC1rdTsBuC0gBCgCPCIAIAAoArwtIAQoAihBEGtqNgK8LQwBCyAEKAI8IgAgAC8BuC0gBCgCOEGBAmtB//8DcSAEKAI8KAK8LXRyOwG4LSAEKAI8IgAgBCgCKCAAKAK8LWo2ArwtCyAEQQU2AiACQCAEKAI8KAK8LUEQIAQoAiBrSgRAIAQgBCgCNEEBazYCHCAEKAI8IgAgAC8BuC0gBCgCHEH//wNxIAQoAjwoArwtdHI7AbgtIAQoAjwvAbgtQf8BcSEBIAQoAjwoAgghAiAEKAI8IgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAjwvAbgtQQh1IQEgBCgCPCgCCCECIAQoAjwiAygCFCEAIAMgAEEBajYCFCAAIAJqIAE6AAAgBCgCPCAEKAIcQf//A3FBECAEKAI8KAK8LWt1OwG4LSAEKAI8IgAgACgCvC0gBCgCIEEQa2o2ArwtDAELIAQoAjwiACAALwG4LSAEKAI0QQFrQf//A3EgBCgCPCgCvC10cjsBuC0gBCgCPCIAIAQoAiAgACgCvC1qNgK8LQsgBEEENgIYAkAgBCgCPCgCvC1BECAEKAIYa0oEQCAEIAQoAjBBBGs2AhQgBCgCPCIAIAAvAbgtIAQoAhRB//8DcSAEKAI8KAK8LXRyOwG4LSAEKAI8LwG4LUH/AXEhASAEKAI8KAIIIQIgBCgCPCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAI8LwG4LUEIdSEBIAQoAjwoAgghAiAEKAI8IgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAjwgBCgCFEH//wNxQRAgBCgCPCgCvC1rdTsBuC0gBCgCPCIAIAAoArwtIAQoAhhBEGtqNgK8LQwBCyAEKAI8IgAgAC8BuC0gBCgCMEEEa0H//wNxIAQoAjwoArwtdHI7AbgtIAQoAjwiACAEKAIYIAAoArwtajYCvC0LIARBADYCLANAIAQoAiwgBCgCME5FBEAgBEEDNgIQAkAgBCgCPCgCvC1BECAEKAIQa0oEQCAEIAQoAjxB/BRqIAQoAiwtAJBoQQJ0ai8BAjYCDCAEKAI8IgAgAC8BuC0gBCgCDEH//wNxIAQoAjwoArwtdHI7AbgtIAQoAjwvAbgtQf8BcSEBIAQoAjwoAgghAiAEKAI8IgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAjwvAbgtQQh1IQEgBCgCPCgCCCECIAQoAjwiAygCFCEAIAMgAEEBajYCFCAAIAJqIAE6AAAgBCgCPCAEKAIMQf//A3FBECAEKAI8KAK8LWt1OwG4LSAEKAI8IgAgACgCvC0gBCgCEEEQa2o2ArwtDAELIAQoAjwiACAALwG4LSAEKAI8QfwUaiAEKAIsLQCQaEECdGovAQIgBCgCPCgCvC10cjsBuC0gBCgCPCIAIAQoAhAgACgCvC1qNgK8LQsgBCAEKAIsQQFqNgIsDAELCyAEKAI8IAQoAjxBlAFqIAQoAjhBAWsQtAEgBCgCPCAEKAI8QYgTaiAEKAI0QQFrELQBIARBQGskAAvGAQEBfyMAQRBrIgEkACABIAA2AgwgASgCDCABKAIMQZQBaiABKAIMKAKcFhC1ASABKAIMIAEoAgxBiBNqIAEoAgwoAqgWELUBIAEoAgwgASgCDEGwFmoQdiABQRI2AggDQAJAIAEoAghBA0gNACABKAIMQfwUaiABKAIILQCQaEECdGovAQINACABIAEoAghBf2o2AggMAQsLIAEoAgwiACAAKAKoLSABKAIIQQNsQRFqajYCqC0gASgCCCEAIAFBEGokACAAC4MCAQF/IwBBEGsiASAANgIIIAFB/4D/n382AgQgAUEANgIAAkADQCABKAIAQR9MBEACQCABKAIEQQFxRQ0AIAEoAghBlAFqIAEoAgBBAnRqLwEARQ0AIAFBADYCDAwDCyABIAEoAgBBAWo2AgAgASABKAIEQQF2NgIEDAELCwJAAkAgASgCCC8BuAENACABKAIILwG8AQ0AIAEoAggvAcgBRQ0BCyABQQE2AgwMAQsgAUEgNgIAA0AgASgCAEGAAkgEQCABKAIIQZQBaiABKAIAQQJ0ai8BAARAIAFBATYCDAwDBSABIAEoAgBBAWo2AgAMAgsACwsgAUEANgIMCyABKAIMC44FAQR/IwBBIGsiASQAIAEgADYCHCABQQM2AhgCQCABKAIcKAK8LUEQIAEoAhhrSgRAIAFBAjYCFCABKAIcIgAgAC8BuC0gASgCFEH//wNxIAEoAhwoArwtdHI7AbgtIAEoAhwvAbgtQf8BcSECIAEoAhwoAgghAyABKAIcIgQoAhQhACAEIABBAWo2AhQgACADaiACOgAAIAEoAhwvAbgtQQh1IQIgASgCHCgCCCEDIAEoAhwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAI6AAAgASgCHCABKAIUQf//A3FBECABKAIcKAK8LWt1OwG4LSABKAIcIgAgACgCvC0gASgCGEEQa2o2ArwtDAELIAEoAhwiACAALwG4LUECIAEoAhwoArwtdHI7AbgtIAEoAhwiACABKAIYIAAoArwtajYCvC0LIAFBwuMALwEANgIQAkAgASgCHCgCvC1BECABKAIQa0oEQCABQcDjAC8BADYCDCABKAIcIgAgAC8BuC0gASgCDEH//wNxIAEoAhwoArwtdHI7AbgtIAEoAhwvAbgtQf8BcSECIAEoAhwoAgghAyABKAIcIgQoAhQhACAEIABBAWo2AhQgACADaiACOgAAIAEoAhwvAbgtQQh1IQIgASgCHCgCCCEDIAEoAhwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAI6AAAgASgCHCABKAIMQf//A3FBECABKAIcKAK8LWt1OwG4LSABKAIcIgAgACgCvC0gASgCEEEQa2o2ArwtDAELIAEoAhwiACAALwG4LUHA4wAvAQAgASgCHCgCvC10cjsBuC0gASgCHCIAIAEoAhAgACgCvC1qNgK8LQsgASgCHBC3ASABQSBqJAALIwEBfyMAQRBrIgEkACABIAA2AgwgASgCDBC3ASABQRBqJAALlgEBAX8jAEEQayIBJAAgASAANgIMIAEoAgwgASgCDEGUAWo2ApgWIAEoAgxBgNsANgKgFiABKAIMIAEoAgxBiBNqNgKkFiABKAIMQZTbADYCrBYgASgCDCABKAIMQfwUajYCsBYgASgCDEGo2wA2ArgWIAEoAgxBADsBuC0gASgCDEEANgK8LSABKAIMELkBIAFBEGokAAvXDQEBfyMAQSBrIgMgADYCGCADIAE2AhQgAyACNgIQIAMgAygCGEEQdjYCDCADIAMoAhhB//8DcTYCGAJAIAMoAhBBAUYEQCADIAMoAhQtAAAgAygCGGo2AhggAygCGEHx/wNPBEAgAyADKAIYQfH/A2s2AhgLIAMgAygCGCADKAIMajYCDCADKAIMQfH/A08EQCADIAMoAgxB8f8DazYCDAsgAyADKAIYIAMoAgxBEHRyNgIcDAELIAMoAhRFBEAgA0EBNgIcDAELIAMoAhBBEEkEQANAIAMgAygCECIAQX9qNgIQIAAEQCADIAMoAhQiAEEBajYCFCADIAAtAAAgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMDAELCyADKAIYQfH/A08EQCADIAMoAhhB8f8DazYCGAsgAyADKAIMQfH/A3A2AgwgAyADKAIYIAMoAgxBEHRyNgIcDAELA0AgAygCEEGwK0lFBEAgAyADKAIQQbArazYCECADQdsCNgIIA0AgAyADKAIULQAAIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAEgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0AAiADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQADIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAQgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0ABSADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQAGIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAcgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0ACCADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQAJIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAogAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0ACyADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQAMIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAA0gAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0ADiADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQAPIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhRBEGo2AhQgAyADKAIIQX9qIgA2AgggAA0ACyADIAMoAhhB8f8DcDYCGCADIAMoAgxB8f8DcDYCDAwBCwsgAygCEARAA0AgAygCEEEQSUUEQCADIAMoAhBBEGs2AhAgAyADKAIULQAAIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAEgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0AAiADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQADIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAQgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0ABSADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQAGIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAcgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0ACCADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQAJIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAogAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0ACyADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQAMIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAA0gAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0ADiADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQAPIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhRBEGo2AhQMAQsLA0AgAyADKAIQIgBBf2o2AhAgAARAIAMgAygCFCIAQQFqNgIUIAMgAC0AACADKAIYajYCGCADIAMoAhggAygCDGo2AgwMAQsLIAMgAygCGEHx/wNwNgIYIAMgAygCDEHx/wNwNgIMCyADIAMoAhggAygCDEEQdHI2AhwLIAMoAhwLKQEBfyMAQRBrIgIkACACIAA2AgwgAiABNgIIIAIoAggQFiACQRBqJAALOgEBfyMAQRBrIgMkACADIAA2AgwgAyABNgIIIAMgAjYCBCADKAIIIAMoAgRsEBkhACADQRBqJAAgAAuEAgIBfwF+IwBB4ABrIgIkACACIAA2AlggAiABNgJUIAIgAigCWCACQcgAakIMEC8iAzcDCAJAIANCAFMEQCACKAJUIAIoAlgQGCACQX82AlwMAQsgAikDCEIMUgRAIAIoAlRBEUEAEBUgAkF/NgJcDAELIAIoAlQgAkHIAGoiACAAQgxBABB4IAIoAlggAkEQahA5QQBIBEAgAkEANgJcDAELIAIoAjggAkEGaiACQQRqEMQBAkAgAi0AUyACKAI8QRh2Rg0AIAItAFMgAi8BBkEIdUYNACACKAJUQRtBABAVIAJBfzYCXAwBCyACQQA2AlwLIAIoAlwhACACQeAAaiQAIAALygMBAX8jAEHQAGsiBSQAIAUgADYCRCAFIAE2AkAgBSACNgI8IAUgAzcDMCAFIAQ2AiwgBSAFKAJANgIoAkACQAJAAkACQAJAAkACQAJAIAUoAiwODwABAgMFBgcHBwcHBwcHBAcLIAUoAkQgBSgCKBDvAkEASARAIAVCfzcDSAwICyAFQgA3A0gMBwsgBSAFKAJEIAUoAjwgBSkDMBAvIgM3AyAgA0IAUwRAIAUoAiggBSgCRBAYIAVCfzcDSAwHCyAFKAJAIAUoAjwgBSgCPCAFKQMgQQAQeCAFIAUpAyA3A0gMBgsgBUIANwNIDAULIAUgBSgCPDYCHCAFKAIcQQA7ATIgBSgCHCIAIAApAwBCgAGENwMAIAUoAhwpAwBCCINCAFIEQCAFKAIcIgAgACkDIEIMfTcDIAsgBUIANwNIDAQLIAVBfzYCFCAFQQU2AhAgBUEENgIMIAVBAzYCCCAFQQI2AgQgBUEBNgIAIAVBACAFEDc3A0gMAwsgBSAFKAIoIAUoAjwgBSkDMBBDNwNIDAILIAUoAigQugEgBUIANwNIDAELIAUoAihBEkEAEBUgBUJ/NwNICyAFKQNIIQMgBUHQAGokACADC+4CAQF/IwBBIGsiBSQAIAUgADYCGCAFIAE2AhQgBSACOwESIAUgAzYCDCAFIAQ2AggCQAJAAkAgBSgCCEUNACAFKAIURQ0AIAUvARJBAUYNAQsgBSgCGEEIakESQQAQFSAFQQA2AhwMAQsgBSgCDEEBcQRAIAUoAhhBCGpBGEEAEBUgBUEANgIcDAELIAVBGBAZIgA2AgQgAEUEQCAFKAIYQQhqQQ5BABAVIAVBADYCHAwBCyMAQRBrIgAgBSgCBDYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCAFKAIEQfis0ZEBNgIMIAUoAgRBic+VmgI2AhAgBSgCBEGQ8dmiAzYCFCAFKAIEQQAgBSgCCCAFKAIIECytQQEQeCAFIAUoAhggBSgCFEEDIAUoAgQQZCIANgIAIABFBEAgBSgCBBC6ASAFQQA2AhwMAQsgBSAFKAIANgIcCyAFKAIcIQAgBUEgaiQAIAAL6AYBAX8jAEHgAGsiBCQAIAQgADYCVCAEIAE2AlAgBCACNwNIIAQgAzYCRAJAIAQoAlQpAzggBCkDSHxCgIAEfEIBfSAEKQNIVARAIAQoAkRBEkEAEBUgBEJ/NwNYDAELIAQgBCgCVCgCBCAEKAJUKQMIp0EDdGopAwA3AyAgBCgCVCkDOCAEKQNIfCAEKQMgVgRAIAQgBCgCVCkDCCAEKQNIIAQpAyAgBCgCVCkDOH19QoCABHxCAX1CEIh8NwMYIAQpAxggBCgCVCkDEFYEQCAEIAQoAlQpAxA3AxAgBCkDEFAEQCAEQhA3AxALA0AgBCkDECAEKQMYWkUEQCAEIAQpAxBCAYY3AxAMAQsLIAQoAlQgBCkDECAEKAJEEL0BQQFxRQRAIAQoAkRBDkEAEBUgBEJ/NwNYDAMLCwNAIAQoAlQpAwggBCkDGFQEQEGAgAQQGSEAIAQoAlQoAgAgBCgCVCkDCKdBBHRqIAA2AgAgAARAIAQoAlQoAgAgBCgCVCkDCKdBBHRqQoCABDcDCCAEKAJUIgAgACkDCEIBfDcDCCAEIAQpAyBCgIAEfDcDICAEKAJUKAIEIAQoAlQpAwinQQN0aiAEKQMgNwMADAIFIAQoAkRBDkEAEBUgBEJ/NwNYDAQLAAsLCyAEIAQoAlQpA0A3AzAgBCAEKAJUKQM4IAQoAlQoAgQgBCkDMKdBA3RqKQMAfTcDKCAEQgA3AzgDQCAEKQM4IAQpA0hUBEAgBAJ+IAQpA0ggBCkDOH0gBCgCVCgCACAEKQMwp0EEdGopAwggBCkDKH1UBEAgBCkDSCAEKQM4fQwBCyAEKAJUKAIAIAQpAzCnQQR0aikDCCAEKQMofQs3AwggBCgCVCgCACAEKQMwp0EEdGooAgAgBCkDKKdqIAQoAlAgBCkDOKdqIAQpAwinEBoaIAQpAwggBCgCVCgCACAEKQMwp0EEdGopAwggBCkDKH1RBEAgBCAEKQMwQgF8NwMwCyAEIAQpAwggBCkDOHw3AzggBEIANwMoDAELCyAEKAJUIgAgBCkDOCAAKQM4fDcDOCAEKAJUIAQpAzA3A0AgBCgCVCkDOCAEKAJUKQMwVgRAIAQoAlQgBCgCVCkDODcDMAsgBCAEKQM4NwNYCyAEKQNYIQIgBEHgAGokACACC+cDAQF/IwBBQGoiAyQAIAMgADYCNCADIAE2AjAgAyACNwMoIAMCfiADKQMoIAMoAjQpAzAgAygCNCkDOH1UBEAgAykDKAwBCyADKAI0KQMwIAMoAjQpAzh9CzcDKAJAIAMpAyhQBEAgA0IANwM4DAELIAMpAyhC////////////AFYEQCADQn83AzgMAQsgAyADKAI0KQNANwMYIAMgAygCNCkDOCADKAI0KAIEIAMpAxinQQN0aikDAH03AxAgA0IANwMgA0AgAykDICADKQMoVARAIAMCfiADKQMoIAMpAyB9IAMoAjQoAgAgAykDGKdBBHRqKQMIIAMpAxB9VARAIAMpAyggAykDIH0MAQsgAygCNCgCACADKQMYp0EEdGopAwggAykDEH0LNwMIIAMoAjAgAykDIKdqIAMoAjQoAgAgAykDGKdBBHRqKAIAIAMpAxCnaiADKQMIpxAaGiADKQMIIAMoAjQoAgAgAykDGKdBBHRqKQMIIAMpAxB9UQRAIAMgAykDGEIBfDcDGAsgAyADKQMIIAMpAyB8NwMgIANCADcDEAwBCwsgAygCNCIAIAMpAyAgACkDOHw3AzggAygCNCADKQMYNwNAIAMgAykDIDcDOAsgAykDOCECIANBQGskACACC64EAQF/IwBBQGoiAyQAIAMgADYCOCADIAE3AzAgAyACNgIsAkAgAykDMFAEQCADQQBCAEEBIAMoAiwQTTYCPAwBCyADKQMwIAMoAjgpAzBWBEAgAygCLEESQQAQFSADQQA2AjwMAQsgAygCOCgCKARAIAMoAixBHUEAEBUgA0EANgI8DAELIAMgAygCOCADKQMwELsBNwMgIAMgAykDMCADKAI4KAIEIAMpAyCnQQN0aikDAH03AxggAykDGFAEQCADIAMpAyBCf3w3AyAgAyADKAI4KAIAIAMpAyCnQQR0aikDCDcDGAsgAyADKAI4KAIAIAMpAyCnQQR0aikDCCADKQMYfTcDECADKQMQIAMpAzBWBEAgAygCLEEcQQAQFSADQQA2AjwMAQsgAyADKAI4KAIAIAMpAyBCAXxBACADKAIsEE0iADYCDCAARQRAIANBADYCPAwBCyADKAIMKAIAIAMoAgwpAwhCAX2nQQR0aiADKQMYNwMIIAMoAgwoAgQgAygCDCkDCKdBA3RqIAMpAzA3AwAgAygCDCADKQMwNwMwIAMoAgwCfiADKAI4KQMYIAMoAgwpAwhCAX1UBEAgAygCOCkDGAwBCyADKAIMKQMIQgF9CzcDGCADKAI4IAMoAgw2AiggAygCDCADKAI4NgIoIAMoAjggAygCDCkDCDcDICADKAIMIAMpAyBCAXw3AyAgAyADKAIMNgI8CyADKAI8IQAgA0FAayQAIAALyAkBAX8jAEHwAGsiBCQAIAQgADYCZCAEIAE2AmAgBCACNwNYIAQgAzYCVCAEIAQoAmQ2AlACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAQoAlQOFAYHAgwEBQoPAAMJEQsQDggSARINEgtBAEIAQQAgBCgCUBBNIQAgBCgCUCAANgIUIABFBEAgBEJ/NwNoDBMLIAQoAlAoAhRCADcDOCAEKAJQKAIUQgA3A0AgBEIANwNoDBILIAQoAlAoAhAgBCkDWCAEKAJQEPQCIQAgBCgCUCAANgIUIABFBEAgBEJ/NwNoDBILIAQoAlAoAhQgBCkDWDcDOCAEKAJQKAIUIAQoAlAoAhQpAwg3A0AgBEIANwNoDBELIARCADcDaAwQCyAEKAJQKAIQEDQgBCgCUCAEKAJQKAIUNgIQIAQoAlBBADYCFCAEQgA3A2gMDwsgBCAEKAJQIAQoAmAgBCkDWBBDNwNoDA4LIAQoAlAoAhAQNCAEKAJQKAIUEDQgBCgCUBAWIARCADcDaAwNCyAEKAJQKAIQQgA3AzggBCgCUCgCEEIANwNAIARCADcDaAwMCyAEKQNYQv///////////wBWBEAgBCgCUEESQQAQFSAEQn83A2gMDAsgBCAEKAJQKAIQIAQoAmAgBCkDWBDzAjcDaAwLCyAEQQBCAEEAIAQoAlAQTTYCTCAEKAJMRQRAIARCfzcDaAwLCyAEKAJQKAIQEDQgBCgCUCAEKAJMNgIQIARCADcDaAwKCyAEKAJQKAIUEDQgBCgCUEEANgIUIARCADcDaAwJCyAEIAQoAlAoAhAgBCgCYCAEKQNYIAQoAlAQvAGsNwNoDAgLIAQgBCgCUCgCFCAEKAJgIAQpA1ggBCgCUBC8Aaw3A2gMBwsgBCkDWEI4VARAIAQoAlBBEkEAEBUgBEJ/NwNoDAcLIAQgBCgCYDYCSCAEKAJIEDwgBCgCSCAEKAJQKAIMNgIoIAQoAkggBCgCUCgCECkDMDcDGCAEKAJIIAQoAkgpAxg3AyAgBCgCSEEAOwEwIAQoAkhBADsBMiAEKAJIQtwBNwMAIARCODcDaAwGCyAEKAJQIAQoAmAoAgA2AgwgBEIANwNoDAULIARBfzYCQCAEQRM2AjwgBEELNgI4IARBDTYCNCAEQQw2AjAgBEEKNgIsIARBDzYCKCAEQQk2AiQgBEERNgIgIARBCDYCHCAEQQc2AhggBEEGNgIUIARBBTYCECAEQQQ2AgwgBEEDNgIIIARBAjYCBCAEQQE2AgAgBEEAIAQQNzcDaAwECyAEKAJQKAIQKQM4Qv///////////wBWBEAgBCgCUEEeQT0QFSAEQn83A2gMBAsgBCAEKAJQKAIQKQM4NwNoDAMLIAQoAlAoAhQpAzhC////////////AFYEQCAEKAJQQR5BPRAVIARCfzcDaAwDCyAEIAQoAlAoAhQpAzg3A2gMAgsgBCkDWEL///////////8AVgRAIAQoAlBBEkEAEBUgBEJ/NwNoDAILIAQgBCgCUCgCFCAEKAJgIAQpA1ggBCgCUBDyAjcDaAwBCyAEKAJQQRxBABAVIARCfzcDaAsgBCkDaCECIARB8ABqJAAgAgt5AQF/IwBBEGsiASQAIAEgADYCCAJAIAEoAggoAiRBAUYEQCABKAIIQQxqQRJBABAVIAFBfzYCDAwBCyABKAIIQQBCAEEIECJCAFMEQCABQX82AgwMAQsgASgCCEEBNgIkIAFBADYCDAsgASgCDCEAIAFBEGokACAAC4MBAQF/IwBBEGsiAiQAIAIgADYCCCACIAE3AwACQCACKAIIKAIkQQFGBEAgAigCCEEMakESQQAQFSACQX82AgwMAQsgAigCCEEAIAIpAwBBERAiQgBTBEAgAkF/NgIMDAELIAIoAghBATYCJCACQQA2AgwLIAIoAgwhACACQRBqJAAgAAtbAQF/IwBBIGsiAyQAIAMgADYCHCADIAE5AxAgAyACOQMIIAMoAhwEQCADKAIcIAMrAxA5AyAgAygCHCADKwMIOQMoIAMoAhxEAAAAAAAAAAAQWAsgA0EgaiQAC1gBAX8jAEEQayIBJAAgASAANgIMIAEoAgwEQCABKAIMRAAAAAAAAAAAOQMYIAEoAgwoAgBEAAAAAAAAAAAgASgCDCgCDCABKAIMKAIEERsACyABQRBqJAALvQcBCX8gACgCBCIHQQNxIQIgACAHQXhxIgZqIQQCQEHInAEoAgAiBSAASw0AIAJBAUYNAAsCQCACRQRAQQAhAiABQYACSQ0BIAYgAUEEak8EQCAAIQIgBiABa0GYoAEoAgBBAXRNDQILQQAPCwJAIAYgAU8EQCAGIAFrIgJBEEkNASAAIAdBAXEgAXJBAnI2AgQgACABaiIBIAJBA3I2AgQgBCAEKAIEQQFyNgIEIAEgAhDAAQwBC0EAIQIgBEHQnAEoAgBGBEBBxJwBKAIAIAZqIgUgAU0NAiAAIAdBAXEgAXJBAnI2AgQgACABaiICIAUgAWsiAUEBcjYCBEHEnAEgATYCAEHQnAEgAjYCAAwBCyAEQcycASgCAEYEQEHAnAEoAgAgBmoiBSABSQ0CAkAgBSABayICQRBPBEAgACAHQQFxIAFyQQJyNgIEIAAgAWoiASACQQFyNgIEIAAgBWoiBSACNgIAIAUgBSgCBEF+cTYCBAwBCyAAIAdBAXEgBXJBAnI2AgQgACAFaiIBIAEoAgRBAXI2AgRBACECQQAhAQtBzJwBIAE2AgBBwJwBIAI2AgAMAQsgBCgCBCIDQQJxDQEgA0F4cSAGaiIJIAFJDQEgCSABayEKAkAgA0H/AU0EQCAEKAIIIgYgA0EDdiIFQQN0QeCcAWpHGiAGIAQoAgwiCEYEQEG4nAFBuJwBKAIAQX4gBXdxNgIADAILIAYgCDYCDCAIIAY2AggMAQsgBCgCGCEIAkAgBCAEKAIMIgNHBEAgBSAEKAIIIgJNBEAgAigCDBoLIAIgAzYCDCADIAI2AggMAQsCQCAEQRRqIgIoAgAiBg0AIARBEGoiAigCACIGDQBBACEDDAELA0AgAiEFIAYiA0EUaiICKAIAIgYNACADQRBqIQIgAygCECIGDQALIAVBADYCAAsgCEUNAAJAIAQgBCgCHCIFQQJ0QeieAWoiAigCAEYEQCACIAM2AgAgAw0BQbycAUG8nAEoAgBBfiAFd3E2AgAMAgsgCEEQQRQgCCgCECAERhtqIAM2AgAgA0UNAQsgAyAINgIYIAQoAhAiAgRAIAMgAjYCECACIAM2AhgLIAQoAhQiAkUNACADIAI2AhQgAiADNgIYCyAKQQ9NBEAgACAHQQFxIAlyQQJyNgIEIAAgCWoiASABKAIEQQFyNgIEDAELIAAgB0EBcSABckECcjYCBCAAIAFqIgIgCkEDcjYCBCAAIAlqIgEgASgCBEEBcjYCBCACIAoQwAELIAAhAgsgAgtIAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDCgCCARAIAEoAgwoAgwgASgCDCgCCBEDAAsgASgCDBAWCyABQRBqJAALKwEBfyMAQRBrIgEkACABIAA2AgwgASgCDEQAAAAAAADwPxBYIAFBEGokAAucAgIBfwF8IwBBIGsiASAANwMQIAEgASkDELpEAAAAAAAA6D+jOQMIAkAgASsDCEQAAOD////vQWQEQCABQX82AgQMAQsgAQJ/IAErAwgiAkQAAAAAAADwQWMgAkQAAAAAAAAAAGZxBEAgAqsMAQtBAAs2AgQLAkAgASgCBEGAgICAeEsEQCABQYCAgIB4NgIcDAELIAEgASgCBEF/ajYCBCABIAEoAgQgASgCBEEBdnI2AgQgASABKAIEIAEoAgRBAnZyNgIEIAEgASgCBCABKAIEQQR2cjYCBCABIAEoAgQgASgCBEEIdnI2AgQgASABKAIEIAEoAgRBEHZyNgIEIAEgASgCBEEBajYCBCABIAEoAgQ2AhwLIAEoAhwLkwEBAX8jAEEgayIDJAAgAyAANgIYIAMgATcDECADIAI2AgwCQCADKQMQUARAIANBAToAHwwBCyADIAMpAxAQ/QI2AgggAygCCCADKAIYKAIATQRAIANBAToAHwwBCyADKAIYIAMoAgggAygCDBBaQQFxRQRAIANBADoAHwwBCyADQQE6AB8LIAMtAB8aIANBIGokAAuzAgIBfwF+IwBBMGsiBCQAIAQgADYCJCAEIAE2AiAgBCACNgIcIAQgAzYCGAJAAkAgBCgCJARAIAQoAiANAQsgBCgCGEESQQAQFSAEQn83AygMAQsgBCgCJCkDCEIAVgRAIAQgBCgCIBB7NgIUIAQgBCgCFCAEKAIkKAIAcDYCECAEIAQoAiQoAhAgBCgCEEECdGooAgA2AgwDQAJAIAQoAgxFDQAgBCgCICAEKAIMKAIAEFsEQCAEIAQoAgwoAhg2AgwMAgUgBCgCHEEIcQRAIAQoAgwpAwhCf1IEQCAEIAQoAgwpAwg3AygMBgsMAgsgBCgCDCkDEEJ/UgRAIAQgBCgCDCkDEDcDKAwFCwsLCwsgBCgCGEEJQQAQFSAEQn83AygLIAQpAyghBSAEQTBqJAAgBQtGAQF/IwBBEGsiASQAIAEgADYCDANAIAEoAgwEQCABIAEoAgwoAhg2AgggASgCDBAWIAEgASgCCDYCDAwBCwsgAUEQaiQAC5cBAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDCgCEARAIAFBADYCCANAIAEoAgggASgCDCgCAEkEQCABKAIMKAIQIAEoAghBAnRqKAIABEAgASgCDCgCECABKAIIQQJ0aigCABCAAwsgASABKAIIQQFqNgIIDAELCyABKAIMKAIQEBYLIAEoAgwQFgsgAUEQaiQAC3QBAX8jAEEQayIBJAAgASAANgIIIAFBGBAZIgA2AgQCQCAARQRAIAEoAghBDkEAEBUgAUEANgIMDAELIAEoAgRBADYCACABKAIEQgA3AwggASgCBEEANgIQIAEgASgCBDYCDAsgASgCDCEAIAFBEGokACAAC58BAQF/IwBBEGsiAiAANgIMIAIgATYCCCACQQA2AgQDQCACKAIEIAIoAgwoAkRJBEAgAigCDCgCTCACKAIEQQJ0aigCACACKAIIRgRAIAIoAgwoAkwgAigCBEECdGogAigCDCgCTCACKAIMKAJEQQFrQQJ0aigCADYCACACKAIMIgAgACgCREF/ajYCRAUgAiACKAIEQQFqNgIEDAILCwsLVAEBfyMAQRBrIgEkACABIAA2AgwgASgCDEEBOgAoAn8jAEEQayIAIAEoAgxBDGo2AgwgACgCDCgCAEULBEAgASgCDEEMakEIQQAQFQsgAUEQaiQAC+EBAQN/IwBBIGsiAiQAIAIgADYCGCACIAE2AhQCQCACKAIYKAJEQQFqIAIoAhgoAkhPBEAgAiACKAIYKAJIQQpqNgIMIAIgAigCGCgCTCACKAIMQQJ0EE82AhAgAigCEEUEQCACKAIYQQhqQQ5BABAVIAJBfzYCHAwCCyACKAIYIAIoAgw2AkggAigCGCACKAIQNgJMCyACKAIUIQEgAigCGCgCTCEDIAIoAhgiBCgCRCEAIAQgAEEBajYCRCAAQQJ0IANqIAE2AgAgAkEANgIcCyACKAIcIQAgAkEgaiQAIAALQAEBfyMAQRBrIgIkACACIAA2AgwgAiABNgIIIAIoAgwgAigCCDYCLCACKAIIIAIoAgwQhQMhACACQRBqJAAgAAu3CQEBfyMAQeDAAGsiBSQAIAUgADYC1EAgBSABNgLQQCAFIAI2AsxAIAUgAzcDwEAgBSAENgK8QCAFIAUoAtBANgK4QAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAFKAK8QA4RAwQABgECBQkKCgoKCgoICgcKCyAFQgA3A9hADAoLIAUgBSgCuEBB5ABqIAUoAsxAIAUpA8BAEEM3A9hADAkLIAUoArhAEBYgBUIANwPYQAwICyAFKAK4QCgCEARAIAUgBSgCuEAoAhAgBSgCuEApAxggBSgCuEBB5ABqEH8iAzcDmEAgA1AEQCAFQn83A9hADAkLIAUoArhAKQMIIAUpA5hAfCAFKAK4QCkDCFQEQCAFKAK4QEHkAGpBFUEAEBUgBUJ/NwPYQAwJCyAFKAK4QCIAIAUpA5hAIAApAwB8NwMAIAUoArhAIgAgBSkDmEAgACkDCHw3AwggBSgCuEBBADYCEAsgBSgCuEAtAHhBAXFFBEAgBUIANwOoQANAIAUpA6hAIAUoArhAKQMAVARAIAUCfkKAwAAgBSgCuEApAwAgBSkDqEB9QoDAAFYNABogBSgCuEApAwAgBSkDqEB9CzcDoEAgBSAFKALUQCAFQRBqIAUpA6BAEC8iAzcDsEAgA0IAUwRAIAUoArhAQeQAaiAFKALUQBAYIAVCfzcD2EAMCwsgBSkDsEBQBEAgBSgCuEBB5ABqQRFBABAVIAVCfzcD2EAMCwUgBSAFKQOwQCAFKQOoQHw3A6hADAILAAsLCyAFKAK4QCAFKAK4QCkDADcDICAFQgA3A9hADAcLIAUpA8BAIAUoArhAKQMIIAUoArhAKQMgfVYEQCAFIAUoArhAKQMIIAUoArhAKQMgfTcDwEALIAUpA8BAUARAIAVCADcD2EAMBwsgBSgCuEAtAHhBAXEEQCAFKALUQCAFKAK4QCkDIEEAEChBAEgEQCAFKAK4QEHkAGogBSgC1EAQGCAFQn83A9hADAgLCyAFIAUoAtRAIAUoAsxAIAUpA8BAEC8iAzcDsEAgA0IAUwRAIAUoArhAQeQAakERQQAQFSAFQn83A9hADAcLIAUoArhAIgAgBSkDsEAgACkDIHw3AyAgBSkDsEBQBEAgBSgCuEApAyAgBSgCuEApAwhUBEAgBSgCuEBB5ABqQRFBABAVIAVCfzcD2EAMCAsLIAUgBSkDsEA3A9hADAYLIAUgBSgCuEApAyAgBSgCuEApAwB9IAUoArhAKQMIIAUoArhAKQMAfSAFKALMQCAFKQPAQCAFKAK4QEHkAGoQjwE3AwggBSkDCEIAUwRAIAVCfzcD2EAMBgsgBSgCuEAgBSkDCCAFKAK4QCkDAHw3AyAgBUIANwPYQAwFCyAFIAUoAsxANgIEIAUoAgQgBSgCuEBBKGogBSgCuEBB5ABqEJoBQQBIBEAgBUJ/NwPYQAwFCyAFQgA3A9hADAQLIAUgBSgCuEAsAGCsNwPYQAwDCyAFIAUoArhAKQNwNwPYQAwCCyAFIAUoArhAKQMgIAUoArhAKQMAfTcD2EAMAQsgBSgCuEBB5ABqQRxBABAVIAVCfzcD2EALIAUpA9hAIQMgBUHgwABqJAAgAwtVAQF/IwBBIGsiBCQAIAQgADYCHCAEIAE2AhggBCACNwMQIAQgAzcDCCAEKAIYIAQpAxAgBCkDCEEAQQBBAEIAIAQoAhxBCGoQfiEAIARBIGokACAAC7QDAQF/IwBBMGsiAyQAIAMgADYCJCADIAE3AxggAyACNgIUIAMgAygCJCADKQMYIAMoAhQQfyIBNwMIAkAgAVAEQCADQgA3AygMAQsgAyADKAIkKAJAIAMpAxinQQR0aigCADYCBAJAIAMpAwggAygCBCkDIHwgAykDCFoEQCADKQMIIAMoAgQpAyB8Qv///////////wBYDQELIAMoAhRBBEEWEBUgA0IANwMoDAELIAMgAygCBCkDICADKQMIfDcDCCADKAIELwEMQQhxBEAgAygCJCgCACADKQMIQQAQKEEASARAIAMoAhQgAygCJCgCABAYIANCADcDKAwCCyADKAIkKAIAIANCBBAvQgRSBEAgAygCFCADKAIkKAIAEBggA0IANwMoDAILIAMoAABB0JadwABGBEAgAyADKQMIQgR8NwMICyADIAMpAwhCDHw3AwggAygCBEEAEIABQQFxBEAgAyADKQMIQgh8NwMICyADKQMIQv///////////wBWBEAgAygCFEEEQRYQFSADQgA3AygMAgsLIAMgAykDCDcDKAsgAykDKCEBIANBMGokACABC/8BAQF/IwBBEGsiAiQAIAIgADYCDCACIAE6AAsCQCACKAIMKAIQQQ5GBEAgAigCDEE/OwEKDAELIAIoAgwoAhBBDEYEQCACKAIMQS47AQoMAQsCQCACLQALQQFxRQRAIAIoAgxBABCAAUEBcUUNAQsgAigCDEEtOwEKDAELAkAgAigCDCgCEEEIRwRAIAIoAgwvAVJBAUcNAQsgAigCDEEUOwEKDAELIAIgAigCDCgCMBBSIgA7AQggAEH//wNxQQBKBEAgAigCDCgCMCgCACACLwEIQQFrai0AAEEvRgRAIAIoAgxBFDsBCgwCCwsgAigCDEEKOwEKCyACQRBqJAALwAIBAX8jAEEwayICJAAgAiAANgIoIAJBgAI7ASYgAiABNgIgIAIgAi8BJkGAAnFBAEc6ABsgAkEeQS4gAi0AG0EBcRs2AhwCQCACKAIoQRpBHCACLQAbQQFxG6xBARAoQQBIBEAgAigCICACKAIoEBggAkF/NgIsDAELIAIgAigCKEEEQQYgAi0AG0EBcRusIAJBDmogAigCIBBBIgA2AgggAEUEQCACQX82AiwMAQsgAkEANgIUA0AgAigCFEECQQMgAi0AG0EBcRtIBEAgAiACKAIIEB5B//8DcSACKAIcajYCHCACIAIoAhRBAWo2AhQMAQsLIAIoAggQSEEBcUUEQCACKAIgQRRBABAVIAIoAggQFyACQX82AiwMAQsgAigCCBAXIAIgAigCHDYCLAsgAigCLCEAIAJBMGokACAAC/8DAQF/IwBBIGsiAiQAIAIgADYCGCACIAE2AhQCQCACKAIYKAIQQeMARwRAIAJBAToAHwwBCyACIAIoAhgoAjQgAkESakGBsgJBgAZBABBfNgIIAkAgAigCCARAIAIvARJBB04NAQsgAigCFEEVQQAQFSACQQA6AB8MAQsgAiACKAIIIAIvARKtECoiADYCDCAARQRAIAIoAhRBFEEAEBUgAkEAOgAfDAELIAJBAToABwJAAkACQCACKAIMEB5Bf2oOAgIAAQsgAigCGCkDKEIUVARAIAJBADoABwsMAQsgAigCFEEYQQAQFSACKAIMEBcgAkEAOgAfDAELIAIoAgxCAhAfLwAAQcGKAUcEQCACKAIUQRhBABAVIAIoAgwQFyACQQA6AB8MAQsCQAJAAkACQAJAIAIoAgwQjQFBf2oOAwABAgMLIAJBgQI7AQQMAwsgAkGCAjsBBAwCCyACQYMCOwEEDAELIAIoAhRBGEEAEBUgAigCDBAXIAJBADoAHwwBCyACLwESQQdHBEAgAigCFEEVQQAQFSACKAIMEBcgAkEAOgAfDAELIAIoAhggAi0AB0EBcToABiACKAIYIAIvAQQ7AVIgAigCDBAeQf//A3EhACACKAIYIAA2AhAgAigCDBAXIAJBAToAHwsgAi0AH0EBcSEAIAJBIGokACAAC7kBAQF/IwBBMGsiAiQAIAIgADsBLiACIAE7ASwgAkIANwIAIAJBADYCKCACQgA3AiAgAkIANwIYIAJCADcCECACQgA3AgggAkEANgIgIAIgAi8BLEEJdUHQAGo2AhQgAiACLwEsQQV1QQ9xQQFrNgIQIAIgAi8BLEEfcTYCDCACIAIvAS5BC3U2AgggAiACLwEuQQV1QT9xNgIEIAIgAi8BLkEBdEE+cTYCACACEAwhACACQTBqJAAgAAtMAQJ/IwBBEGsiACQAIABB2AAQGSIBNgIIAkAgAUUEQCAAQQA2AgwMAQsgACgCCBBdIAAgACgCCDYCDAsgACgCDCEBIABBEGokACABCwgAQQFBOBB9CwMAAQsL8o0BJwBBgAgLlAVObyBlcnJvcgBNdWx0aS1kaXNrIHppcCBhcmNoaXZlcyBub3Qgc3VwcG9ydGVkAFJlbmFtaW5nIHRlbXBvcmFyeSBmaWxlIGZhaWxlZABDbG9zaW5nIHppcCBhcmNoaXZlIGZhaWxlZABTZWVrIGVycm9yAFJlYWQgZXJyb3IAV3JpdGUgZXJyb3IAQ1JDIGVycm9yAENvbnRhaW5pbmcgemlwIGFyY2hpdmUgd2FzIGNsb3NlZABObyBzdWNoIGZpbGUARmlsZSBhbHJlYWR5IGV4aXN0cwBDYW4ndCBvcGVuIGZpbGUARmFpbHVyZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUAWmxpYiBlcnJvcgBNYWxsb2MgZmFpbHVyZQBFbnRyeSBoYXMgYmVlbiBjaGFuZ2VkAENvbXByZXNzaW9uIG1ldGhvZCBub3Qgc3VwcG9ydGVkAFByZW1hdHVyZSBlbmQgb2YgZmlsZQBJbnZhbGlkIGFyZ3VtZW50AE5vdCBhIHppcCBhcmNoaXZlAEludGVybmFsIGVycm9yAFppcCBhcmNoaXZlIGluY29uc2lzdGVudABDYW4ndCByZW1vdmUgZmlsZQBFbnRyeSBoYXMgYmVlbiBkZWxldGVkAEVuY3J5cHRpb24gbWV0aG9kIG5vdCBzdXBwb3J0ZWQAUmVhZC1vbmx5IGFyY2hpdmUATm8gcGFzc3dvcmQgcHJvdmlkZWQAV3JvbmcgcGFzc3dvcmQgcHJvdmlkZWQAT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQAUmVzb3VyY2Ugc3RpbGwgaW4gdXNlAFRlbGwgZXJyb3IAQ29tcHJlc3NlZCBkYXRhIGludmFsaWQAQaENC4ABBAAACQQAAC8EAABOBAAAaQQAAHQEAAB/BAAAiwQAAJUEAAC3BAAAxAQAANgEAADoBAAACQUAABQFAAAjBQAAOgUAAFsFAABxBQAAggUAAJQFAACjBQAAvAUAAM4FAADlBQAABQYAABcGAAAsBgAARAYAAFwGAAByBgAAfQYAACAAQbgOCxEBAAAAAQAAAAEAAAABAAAAAQBB3A4LCQEAAAABAAAAAgBBiA8LAQEAQagPCwEBAEG0DwuSRZYwB3csYQ7uulEJmRnEbQeP9GpwNaVj6aOVZJ4yiNsOpLjceR7p1eCI2dKXK0y2Cb18sX4HLbjnkR2/kGQQtx3yILBqSHG5895BvoR91Noa6+TdbVG11PTHhdODVphsE8Coa2R6+WL97Mllik9cARTZbAZjYz0P+vUNCI3IIG47XhBpTORBYNVycWei0eQDPEfUBEv9hQ3Sa7UKpfqotTVsmLJC1sm720D5vKzjbNgydVzfRc8N1txZPdGrrDDZJjoA3lGAUdfIFmHQv7X0tCEjxLNWmZW6zw+lvbieuAIoCIgFX7LZDMYk6Quxh3xvLxFMaFirHWHBPS1mtpBB3HYGcdsBvCDSmCoQ1e+JhbFxH7W2BqXkv58z1LjooskHeDT5AA+OqAmWGJgO4bsNan8tPW0Il2xkkQFcY+b0UWtrYmFsHNgwZYVOAGLy7ZUGbHulARvB9AiCV8QP9cbZsGVQ6bcS6ri+i3yIufzfHd1iSS3aFfN804xlTNT7WGGyTc5RtTp0ALyj4jC71EGl30rXldg9bcTRpPv01tNq6WlD/NluNEaIZ63QuGDacy0EROUdAzNfTAqqyXwN3TxxBVCqQQInEBALvoYgDMkltWhXs4VvIAnUZrmf5GHODvneXpjJ2SkimNCwtKjXxxc9s1mBDbQuO1y9t61susAgg7jttrO/mgzitgOa0rF0OUfV6q930p0VJtsEgxbccxILY+OEO2SUPmptDahaanoLzw7knf8JkyeuAAqxngd9RJMP8NKjCIdo8gEe/sIGaV1XYvfLZ2WAcTZsGecGa252G9T+4CvTiVp62hDMSt1nb9+5+fnvvo5DvrcX1Y6wYOij1tZ+k9GhxMLYOFLy30/xZ7vRZ1e8pt0GtT9LNrJI2isN2EwbCq/2SgM2YHoEQcPvYN9V32eo745uMXm+aUaMs2HLGoNmvKDSbyU24mhSlXcMzANHC7u5FgIiLyYFVb47usUoC72yklq0KwRqs1yn/9fCMc/QtYue2Swdrt5bsMJkmybyY+yco2p1CpNtAqkGCZw/Ng7rhWcHchNXAAWCSr+VFHq44q4rsXs4G7YMm47Skg2+1eW379x8Id/bC9TS04ZC4tTx+LPdaG6D2h/NFr6BWya59uF3sG93R7cY5loIiHBqD//KOwZmXAsBEf+eZY9prmL40/9rYUXPbBZ44gqg7tIN11SDBE7CswM5YSZnp/cWYNBNR2lJ23duPkpq0a7cWtbZZgvfQPA72DdTrrypxZ673n/Pskfp/7UwHPK9vYrCusowk7NTpqO0JAU20LqTBtfNKVfeVL9n2SMuemazuEphxAIbaF2UK28qN74LtKGODMMb3wVaje8CLQAAAABBMRsZgmI2MsNTLSsExWxkRfR3fYanWlbHlkFPCIrZyEm7wtGK6O/6y9n04wxPtaxNfq61ji2Dns8cmIdREsJKECPZU9Nw9HiSQe9hVdeuLhTmtTfXtZgcloSDBVmYG4IYqQCb2/otsJrLNqldXXfmHGxs/98/QdSeDlrNoiSEleMVn4wgRrKnYXepvqbh6PHn0PPoJIPew2Wyxdqqrl1d659GRCjMa29p/XB2rmsxOe9aKiAsCQcLbTgcEvM2Rt+yB13GcVRw7TBla/T38yq7tsIxonWRHIk0oAeQ+7yfF7qNhA553qklOO+yPP9583O+SOhqfRvFQTwq3lgFT3nwRH5i6YctT8LGHFTbAYoVlEC7Do2D6COmwtk4vw3FoDhM9Lshj6eWCs6WjRMJAMxcSDHXRYti+m7KU+F3VF27uhVsoKPWP42Ilw6WkVCY194RqczH0vrh7JPL+vVc12JyHeZ5a961VECfhE9ZWBIOFhkjFQ/acDgkm0EjPadr/WXmWuZ8JQnLV2Q40E6jrpEB4p+KGCHMpzNg/bwqr+Ekre7QP7QtgxKfbLIJhqskSMnqFVPQKUZ++2h3ZeL2eT8vt0gkNnQbCR01KhIE8rxTS7ONSFJw3mV5Me9+YP7z5ue/wv3+fJHQ1T2gy8z6NoqDuweRmnhUvLE5ZaeoS5iDOwqpmCLJ+rUJiMuuEE9d718ObPRGzT/ZbYwOwnRDElrzAiNB6sFwbMGAQXfYR9c2lwbmLY7FtQClhIQbvBqKQXFbu1pomOh3Q9nZbFoeTy0VX342DJwtGyfdHAA+EgCYuVMxg6CQYq6L0VO1khbF9N1X9O/ElKfC79WW2fbpvAeuqI0ct2veMZwq7yqF7XlryqxIcNNvG134LipG4eE23magB8V/Y1ToVCJl803l87ICpMKpG2eRhDAmoJ8puK7F5Pmf3v06zPPWe/3oz7xrqYD9WrKZPgmfsn84hKuwJBws8RUHNTJGKh5zdzEHtOFwSPXQa1E2g0Z6d7JdY07X+ssP5uHSzLXM+Y2E1+BKEpavCyONtshwoJ2JQbuERl0jAwdsOBrEPxUxhQ4OKEKYT2cDqVR+wPp5VYHLYkwfxTiBXvQjmJ2nDrPclhWqGwBU5VoxT/yZYmLX2FN5zhdP4UlWfvpQlS3Xe9QczGITio0tUruWNJHoux/Q2aAG7PN+Xq3CZUdukUhsL6BTdeg2EjqpBwkjalQkCCtlPxHkeaeWpUi8j2YbkaQnKoq94LzL8qGN0Oti3v3AI+/m2b3hvBT80KcNP4OKJn6ykT+5JNBw+BXLaTtG5kJ6d/1btWtl3PRafsU3CVPudjhI97GuCbjwnxKhM8w/inL9JJMAAAAAN2rCAW7UhANZvkYC3KgJB+vCywayfI0EhRZPBbhREw6PO9EP1oWXDeHvVQxk+RoJU5PYCAotngo9R1wLcKMmHEfJ5B0ed6IfKR1gHqwLLxubYe0awt+rGPW1aRnI8jUS/5j3E6YmsRGRTHMQFFo8FSMw/hR6jrgWTeR6F+BGTTjXLI85jpLJO7n4Czo87kQ/C4SGPlI6wDxlUAI9WBdeNm99nDc2w9o1AakYNIS/VzGz1ZUw6mvTMt0BETOQ5Wskp4+pJf4x7yfJWy0mTE1iI3snoCIimeYgFfMkISi0eCof3rorRmD8KXEKPij0HHEtw3azLJrI9S6tojcvwI2acPfnWHGuWR5zmTPcchwlk3crT1F2cvEXdEWb1XV43Il+T7ZLfxYIDX0hYs98pHSAeZMeQnjKoAR6/crGe7AuvGyHRH5t3vo4b+mQ+m5shrVrW+x3agJSMWg1OPNpCH+vYj8VbWNmqythUcHpYNTXpmXjvWRkugMiZo1p4Gcgy9dIF6EVSU4fU0t5dZFK/GPeT8sJHE6St1pMpd2YTZiaxEav8AZH9k5ARcEkgkREMs1Bc1gPQCrmSUIdjItDUGjxVGcCM1U+vHVXCda3VozA+FO7qjpS4hR8UNV+vlHoOeJa31MgW4btZlmxh6RYNJHrXQP7KVxaRW9ebS+tX4AbNeG3cffg7s+x4tmlc+Ncszzma9n+5zJnuOUFDXrkOEom7w8g5O5WnqLsYfRg7eTiL+jTiO3pijar671caerwuBP9x9LR/J5sl/6pBlX/LBAa+ht62PtCxJ75da5c+EjpAPN/g8LyJj2E8BFXRvGUQQn0oyvL9fqVjffN/0/2YF142Vc3utgOifzaOeM+27z1cd6Ln7Pf0iH13eVLN9zYDGvX72ap1rbY79SBsi3VBKRi0DPOoNFqcObTXRok0hD+XsUnlJzEfiraxklAGMfMVlfC+zyVw6KC08GV6BHAqK9Ny5/Fj8rGe8nI8RELyXQHRMxDbYbNGtPAzy25As5Alq+Rd/xtkC5CK5IZKOmTnD6mlqtUZJfy6iKVxYDglPjHvJ/PrX6elhM4nKF5+p0kb7WYEwV3mUq7MZt90fOaMDWJjQdfS4xe4Q2OaYvPj+ydgIrb90KLgkkEibUjxoiIZJqDvw5YguawHoDR2tyBVMyThGOmUYU6GBeHDXLVhqDQ4qmXuiCozgRmqvlupKt8eOuuSxIprxKsb60lxq2sGIHxpy/rM6Z2VXWkQT+3pcQp+KDzQzqhqv18o52XvqLQc8S15xkGtL6nQLaJzYK3DNvNsjuxD7NiD0mxVWWLsGgi17tfSBW6BvZTuDGckbm0it68g+AcvdpeWr/tNJi+AAAAAGVnvLiLyAmq7q+1EleXYo8y8N433F9rJbk4153vKLTFik8IfWTgvW8BhwHXuL/WSt3YavIzd9/gVhBjWJ9XGVD6MKXoFJ8Q+nH4rELIwHvfrafHZ0MIcnUmb87NcH+tlRUYES37t6Q/ntAYhyfozxpCj3OirCDGsMlHegg+rzKgW8iOGLVnOwrQAIeyaThQLwxf7Jfi8FmFh5flPdGHhmW04DrdWk+Pzz8oM3eGEOTq43dYUg3Y7UBov1H4ofgr8MSfl0gqMCJaT1ee4vZvSX+TCPXHfadA1RjA/G1O0J81K7cjjcUYlp+gfyonGUf9unwgQQKSj/QQ9+hIqD1YFJtYP6gjtpAdMdP3oYlqz3YUD6jKrOEHf76EYMMG0nCgXrcXHOZZuKn0PN8VTIXnwtHggH5pDi/Le2tId8OiDw3Lx2ixcynHBGFMoLjZ9ZhvRJD/0/x+UGbuGzfaVk0nuQ4oQAW2xu+wpKOIDBwasNuBf9dnOZF40iv0H26TA/cmO2aQmoOIPy+R7ViTKVRgRLQxB/gM36hNHrrP8abs35L+ibguRmcXm1QCcCfsu0jwcd4vTMkwgPnbVedFY5ygP2v5x4PTF2g2wXIPinnLN13krlDhXED/VE4lmOj2c4iLrhbvNxb4QIIEnSc+vCQf6SFBeFWZr9fgi8qwXDM7tlntXtHlVbB+UEfVGez/bCE7YglGh9rn6TLIgo6OcNSe7Six+VGQX1bkgjoxWDqDCY+n5m4zHwjBhg1tpjq1pOFAvcGG/AUvKUkXSk71r/N2IjKWEZ6KeL4rmB3ZlyBLyfR4Lq5IwMAB/dKlZkFqHF6W93k5Kk+Xlp9d8vEj5QUZa01gftf1jtFi5+u23l9SjgnCN+m1etlGAGi8IbzQ6jHfiI9WYzBh+dYiBJ5qmr2mvQfYwQG/Nm60rVMJCBWaTnId/ynOpRGGe7d04ccPzdkQkqi+rCpGERk4I3algHVmxtgQAXpg/q7PcpvJc8oi8aRXR5YY76k5rf3MXhFFBu5NdmOJ8c6NJkTc6EH4ZFF5L/k0HpNB2rEmU7/WmuvpxvmzjKFFC2IO8BkHaUyhvlGbPNs2J4Q1mZKWUP4uLpm5VCb83uieEnFdjHcW4TTOLjapq0mKEUXmPwMggYO7dpHg4xP2XFv9WelJmD5V8SEGgmxEYT7Uqs6Lxs+pN344QX/WXSbDbrOJdnzW7srEb9YdWQqxoeHkHhTzgXmoS9dpyxOyDnerXKHCuTnGfgGA/qmc5ZkVJAs2oDZuURyOpxZmhsJx2j4s3m8sSbnTlPCBBAmV5rixe0kNox4usRtIPtJDLVlu+8P22+mmkWdRH6mwzHrODHSUYblm8QYF3gAAAAB3BzCW7g5hLJkJUboHbcQZcGr0j+ljpTWeZJWjDtuIMnncuKTg1ekel9LZiAm2TCt+sXy957gtB5C/HZEdtxBkarAg8vO5cUiEvkHeGtrUfW3d5Ov01LVRg9OFxxNsmFZka6jA/WL5eoplyewUAVxPYwZs2foPPWONCA31O24gyExpEF7VYEHkomdxcjwD5NFLBNRH0g2F/aUKtWs1taj6QrKYbNu7ydasvPlAMths40XfXHXc1g3Pq9E9WSbZMKxR3gA6yNdRgL/QYRYhtPS1VrPEI8+6lZm4vaUPKAK4nl8FiAjGDNmysQvpJC9vfIdYaEwRwWEdq7ZmLT123EGQAdtxBpjSILzv1RAqcbGFiQa2tR+fv+Sl6LjUM3gHyaIPAPk0lgmojuEOmBh/ag27CG09LZFkbJfmY1wBa2tR9BxsYWKFZTDY8mIATmwGle0bAaV7ggj0wfUPxFdlsNnGErfpUIu+uOr8uYh8Yt0d3xXaLUmM03zz+9RMZU2yYVg6tVHOo7wAdNS7MOJK36VBPdiV16TRxG3T1vT7Q2npajRu2fytZ4hG2mC40EQELXMzAx3lqgpMX90NfMlQBXE8JwJBqr4LEBDJDCCGV2i1JSBvhbO5ZtQJzmHkn17e+Q4p2cmYsNCYIsfXqLRZsz0XLrQNgbe9XDvAumyt7biDIJq/s7YDtuIMdLHSmurVRzmd0nevBNsmFXPcFoPjYwsSlGQ7hA1taj56alqo5A7PC5MJ/50KAK4nfQeesfAPk0SHCKPSHgHyaGkGwv73YlddgGVnyxlsNnFuawbn/tQbdonTK+AQ2npaZ91KzPm532+Ovu/5F7e+Q2CwjtXW1qPoodGTfjjYwsRP3/JS0btn8aa8V2c/tQbdSLI2S9gNK9qvChtMNgNK9kEEemDfYO/DqGffVTFuju9Gab55y2GzjLxmgxolb9KgUmjiNswMd5W7C0cDIgIWuVUFJi/Fuju+sr0LKCu0WpJcs2oEwtf/p7XQzzEs2Z6LW96uHZtkwrDsY/ImdWqjnAJtkwqcCQap6w42P3IHZ4UFAFcTlb9KguK4ehR7sSuuDLYbOJLSjpvl1b4NfNzvtwvb3yGG09LU8dTiQmjds/gf2oNugb4Wzfa5JltvsHfhGLdHd4gIWub/D2pwZgY7yhEBC1yPZZ7/+GKuaWFr/9MWbM9FoArieNcN0u5OBINUOQOzwqdnJmHQYBb3SWlHTT5ud9uu0WpK2dZa3EDfC2Y32DvwqbyuU967nsVHss9/MLX/6b298hzKusKKU7OTMCS0o6a60DYFzdcGk1TeVykj2We/s2Z6LsRhSrhdaBsCKm8rlLQLvjfDDI6hWgXfGy0C740AAAAAGRsxQTI2YoIrLVPDZGzFBH139EVWWqeGT0GWx8jZigjRwrtJ+u/oiuP02custU8Mta5+TZ6DLY6HmBzPSsISUVPZIxB49HDTYe9Bki6u11U3teYUHJi11wWDhJaCG5hZmwCpGLAt+tupNsua5nddXf9sbBzUQT/fzVoOnpWEJKKMnxXjp7JGIL6pd2Hx6OGm6PPQ58PegyTaxbJlXV2uqkRGn+tva8wodnD9aTkxa64gKlrvCwcJLBIcOG3fRjbzxl0Hsu1wVHH0a2Uwuyrz96IxwraJHJF1kAegNBefvPsOhI26JaneeTyy7zhz83n/auhIvkHFG31Y3io88HlPBelifkTCTy2H21QcxpQVigGNDrtApiPog7842cI4oMUNIbv0TAqWp48TjZbOXMwACUXXMUhu+mKLd+FTyrq7XVSjoGwViI0/1pGWDpfe15hQx8ypEezh+tL1+suTcmLXXGt55h1AVLXeWU+EnxYOElgPFSMZJDhw2j0jQZtl/WunfOZa5lfLCSVO0DhkAZGuoxiKn+Izp8whKrz9YK0k4a+0P9DunxKDLYYJsmzJSCSr0FMV6vt+RiniZXdoLz959jYkSLcdCRt0BBIqNUtTvPJSSI2zeWXecGB+7zHn5vP+/v3Cv9XQkXzMy6A9g4o2+pqRB7uxvFR4qKdlOTuDmEsimKkKCbX6yRCuy4hf711PRvRsDm3ZP810wg6M81oSQ+pBIwLBbHDB2HdBgJc210eOLeYGpQC1xbwbhIRxQYoaaFq7W0N36JhabNnZFS1PHgw2fl8nGy2cPgAc3bmYABKggzFTi65ikJK1U9Hd9MUWxO/0V+/Cp5T22ZbVrge86bccjaicMd5rhSrvKspree3TcEis+F0bb+FGKi5m3jbhf8UHoFToVGNN82UiArLz5RupwqQwhJFnKZ+gJuTFrrj93p/51vPMOs/o/XuAqWu8mbJa/bKfCT6rhDh/LBwksDUHFfEeKkYyBzF3c0hw4bRRa9D1ekaDNmNdsnfL+tdO0uHmD/nMtczg14SNr5YSSraNIwudoHDIhLtBiQMjXUYaOGwHMRU/xCgODoVnT5hCflSpA1V5+sBMYsuBgTjFH5gj9F6zDqedqhWW3OVUABv8TzFa12Jimc55U9hJ4U8XUPp+VnvXLZVizBzULY2KEzSWu1Ifu+iRBqDZ0F5+8+xHZcKtbEiRbnVToC86EjboIwkHqQgkVGoRP2Urlqd55I+8SKWkkRtmvYoqJ/LLvODr0I2hwP3eYtnm7yMUvOG9DafQ/CaKgz8/kbJ+cNAkuWnLFfhC5kY7W/13etxla7XFflr07lMJN/dIOHa4Ca6xoRKf8Io/zDOTJP1yAAAAAAHCajcDhNRuAka+WQcJqNwGy8LrBI18sgVPFoUOE1G4D9E7jw2XhdYMVe/hCRr5ZAjYk1MKni0KC1xHPRwmo3Ad5MlHH6J3Hh5gHSkbLwusGu1hmxir38IZabX1EjXyyBP3mP8RsSamEHNMkRU8WhQU/jAjFriOehd65E04TUbgOY8s1zvJko46C/i5P0TuPD6GhAs8wDpSPQJQZTZeF1g3nH1vNdrDNjQYqQExV7+EMJXVszLTa+ozEQHdJGvlkCWpj6cn7zH+Ji1bySNiTUwioCd7IOaZIiEk8xUqeLQoK7reHyn8YEYoPgpxLXEc9CyzdsMu9ciaLzeirXCajcBxWOf3cx5ZrnLcM5l3kyUcdlFPK3QX8XJ11ZtFfonceH9Ltk99DQgWfM9iIXmAdKR4Qh6TegSgynvGyv1svC6wbX5Eh284+t5u+pDpa7WGbGp37FtoMVICafM4NWKvfwhjbRU/YSurZmDpwVFlptfUZGS942YiA7pn4GmNSNfLIEkVoRdLUx9OSpF1eU/eY/xOHAnLTFq3kk2Y3aVGxJqYRwbwr0VATvZEgiTBQc0yREAPWHNCSeYqQ4uMHVTxaFBVMwJnV3W8Pla31glT+MCMUjqqu1B8FOJRvn7VWuI56FsgU99ZZu2GWKSHsV3rkTRcKfsDXm9FWl+tL23hNRuA4Pdxt+Kxz+7jc6XZ5jyzXOf+2WvluGcy5HoNBe8mSjju5CAP7KKeVu1g9GHoL+Lk6e2I0+urNorqaVy9/RO48PzR0sf+l2ye/1UGqfoaECz72Hob+Z7EQvhcrnXzAOlI8sKDf/CEPSbxRlcR9AlBlPXLK6P3jZX69k//zdl4XWDYujdX2vyJDts+4znecfW837Ofi931IdLcN0vl12sM2NapZu/U79i21S2ygdBipATRoM4z0+ZwatIkGl3FXv4QxJyUJ8baKn7HGEBJwldWzMOVPPvB04KiwBHolctNr6jKj8WfyMl7xskLEfHMRAd0zYZtQ8/A0xrOArktka+WQJBt/HeSK0Iuk+koGZamPpyXZFSrlSLq8pTggMWfvMf4nn6tz5w4E5ad+nmhmLVvJJl3BRObMbtKmvPRfY2JNTCMS18Hjg3hXo/Pi2mKgJ3si0L324kESYKIxiO1g5pkiIJYDr+AHrDmgdza0YSTzFSFUaZjhxcYOobVcg2p4tCgqCC6l6pmBM6rpG75rut4fK8pEkutb6wSrK3GJafxgRimM+svpHVVdqW3P0Gg+CnEoTpD86N8/aqivpedtcRz0LQGGee2QKe+t4LNibLN2wyzD7E7sUkPYrCLZVW71yJouhVIX7hT9ga5kZwxvN6KtL0c4IO/Wl7avpg07QAAAAC4vGdlqgnIixK1r+6PYpdXN97wMiVrX9yd1zi5xbQo730IT4pvveBk1wGHAUrWv7jyatjd4N93M1hjEFZQGVef6KUw+voQnxRCrPhx33vAyGfHp611cghDzc5vJpWtf3AtERgVP6S3+4cY0J4az+gnonOPQrDGIKwIekfJoDKvPhiOyFsKO2e1socA0C9QOGmX7F8MhVnw4j3ll4dlhofR3TrgtM+PT1p3Myg/6uQQhlJYd+NA7dgN+FG/aPAr+KFIl5/EWiIwKuKeV09/SW/2x/UIk9VAp31t/MAYNZ/QTo0jtyuflhjFJyp/oLr9RxkCQSB8EPSPkqhI6PebFFg9I6g/WDEdkLaJoffTFHbPaqzKqA++fwfhBsNghF6gcNLmHBe39Km4WUwV3zzRwueFaX6A4HvLLw7Dd0hryw0PonOxaMdhBMcp2bigTERvmPX80/+Q7mZQflbaNxsOuSdNtgVAKKSw78YcDIijgduwGjln138r0niRk24f9Dsm9wODmpBmkS8/iCmTWO20RGBUDPgHMR5NqN+m8c+6/pLf7EYuuIlUmxdn7CdwAnHwSLvJTC/e2/mAMGNF51VrP6Cc04PH+cE2aBd5ig9y5F03y1zhUK5OVP9A9uiYJa6LiHMWN+8WBIJA+Lw+J50h6R8kmVV4QYvg168zXLDK7Vm2O1Xl0V5HUH6w/+wZ1WI7IWzah0YJyDLp53COjoIo7Z7UkFH5sYLkVl86WDE6p48Jgx8zbuYNhsEItTqmbb1A4aQF/IbBF0kpL6/1TkoyInbzip4Rlpgrvnggl9kdePTJS8BIri7S/QHAakFmpfeWXhxPKjl5XZ+Wl+Uj8fJNaxkF9dd+YOdi0Y5f3rbrwgmOUnq16TdoAEbZ0LwhvIjfMeowY1aPItb5YZpqngQHvaa9vwHB2K20bjYVCAlTHXJOmqXOKf+3e4YRD8fhdJIQ2c0qrL6oOBkRRoCldiPYxmZ1YHoBEHLPrv7Kc8mbV6TxIu8Ylkf9rTmpRRFezHZN7gbO8Ylj3EQmjWT4Qej5L3lRQZMeNFMmsdrrmta/s/nG6QtFoYwZ8A5ioUxpBzybUb6EJzbblpKZNS4u/lAmVLmZnuje/IxdcRI04RZ3qTYuzhGKSasDP+ZFu4OBIOPgkXZbXPYTSelZ/fFVPphsggYh1D5hRMaLzqp+N6nP1n9BOG7DJl18domzxMru1lkd1m/hobEK8xQe5EuoeYETy2nXq3cOsrnCoVwBfsY5nKn+gCQVmeU2oDYLjhxRboZmFqc+2nHCLG/eLJTTuUkJBIHwsbjmlaMNSXsbsS4eQ9I+SPtuWS3p2/bDUWeRpsywqR90DM56ZrlhlN4FBvEAADomOyZlJmYmYyZgJiIg2CXLJdklQiZAJmomayY8JrolxCWVITwgtgCnAKwlqCGRIZMhkiGQIR8ilCGyJbwlIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AAIjxwD8AOkA4gDkAOAA5QDnAOoA6wDoAO8A7gDsAMQAxQDJAOYAxgD0APYA8gD7APkA/wDWANwAogCjAKUApyCSAeEA7QDzAPoA8QDRAKoAugC/ABAjrAC9ALwAoQCrALsAkSWSJZMlAiUkJWElYiVWJVUlYyVRJVclXSVcJVslECUUJTQlLCUcJQAlPCVeJV8lWiVUJWklZiVgJVAlbCVnJWglZCVlJVklWCVSJVMlayVqJRglDCWIJYQljCWQJYAlsQPfAJMDwAOjA8MDtQDEA6YDmAOpA7QDHiLGA7UDKSJhIrEAZSJkIiAjISP3AEgisAAZIrcAGiJ/ILIAoCWgAAAAAAAAAFBLBgYAUEsGBwBQSwUGAFBLAwQAUEsBAgBBRQBuZWVkIGRpY3Rpb25hcnkAc3RyZWFtIGVuZAAAZmlsZSBlcnJvcgBzdHJlYW0gZXJyb3IAZGF0YSBlcnJvcgBpbnN1ZmZpY2llbnQgbWVtb3J5AGJ1ZmZlciBlcnJvcgBpbmNvbXBhdGlibGUgdmVyc2lvbgBB0NQACybSKQAA4ikAAO0pAADuKQAA+SkAAAYqAAARKgAAJSoAADIqAADtKQBBgdUAC7YQAQIDBAQFBQYGBgYHBwcHCAgICAgICAgJCQkJCQkJCQoKCgoKCgoKCgoKCgoKCgoLCwsLCwsLCwsLCwsLCwsLDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAAAQERISExMUFBQUFRUVFRYWFhYWFhYWFxcXFxcXFxcYGBgYGBgYGBgYGBgYGBgYGRkZGRkZGRkZGRkZGRkZGRoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxscHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQABAgMEBQYHCAgJCQoKCwsMDAwMDQ0NDQ4ODg4PDw8PEBAQEBAQEBARERERERERERISEhISEhISExMTExMTExMUFBQUFBQUFBQUFBQUFBQUFRUVFRUVFRUVFRUVFRUVFRYWFhYWFhYWFhYWFhYWFhYXFxcXFxcXFxcXFxcXFxcXGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxzALQAAwDIAAAEBAAAeAQAADwAAAEAyAABAMwAAAAAAAB4AAAAPAAAAAAAAAMAzAAAAAAAAEwAAAAcAAAAAAAAADAAIAIwACABMAAgAzAAIACwACACsAAgAbAAIAOwACAAcAAgAnAAIAFwACADcAAgAPAAIALwACAB8AAgA/AAIAAIACACCAAgAQgAIAMIACAAiAAgAogAIAGIACADiAAgAEgAIAJIACABSAAgA0gAIADIACACyAAgAcgAIAPIACAAKAAgAigAIAEoACADKAAgAKgAIAKoACABqAAgA6gAIABoACACaAAgAWgAIANoACAA6AAgAugAIAHoACAD6AAgABgAIAIYACABGAAgAxgAIACYACACmAAgAZgAIAOYACAAWAAgAlgAIAFYACADWAAgANgAIALYACAB2AAgA9gAIAA4ACACOAAgATgAIAM4ACAAuAAgArgAIAG4ACADuAAgAHgAIAJ4ACABeAAgA3gAIAD4ACAC+AAgAfgAIAP4ACAABAAgAgQAIAEEACADBAAgAIQAIAKEACABhAAgA4QAIABEACACRAAgAUQAIANEACAAxAAgAsQAIAHEACADxAAgACQAIAIkACABJAAgAyQAIACkACACpAAgAaQAIAOkACAAZAAgAmQAIAFkACADZAAgAOQAIALkACAB5AAgA+QAIAAUACACFAAgARQAIAMUACAAlAAgApQAIAGUACADlAAgAFQAIAJUACABVAAgA1QAIADUACAC1AAgAdQAIAPUACAANAAgAjQAIAE0ACADNAAgALQAIAK0ACABtAAgA7QAIAB0ACACdAAgAXQAIAN0ACAA9AAgAvQAIAH0ACAD9AAgAEwAJABMBCQCTAAkAkwEJAFMACQBTAQkA0wAJANMBCQAzAAkAMwEJALMACQCzAQkAcwAJAHMBCQDzAAkA8wEJAAsACQALAQkAiwAJAIsBCQBLAAkASwEJAMsACQDLAQkAKwAJACsBCQCrAAkAqwEJAGsACQBrAQkA6wAJAOsBCQAbAAkAGwEJAJsACQCbAQkAWwAJAFsBCQDbAAkA2wEJADsACQA7AQkAuwAJALsBCQB7AAkAewEJAPsACQD7AQkABwAJAAcBCQCHAAkAhwEJAEcACQBHAQkAxwAJAMcBCQAnAAkAJwEJAKcACQCnAQkAZwAJAGcBCQDnAAkA5wEJABcACQAXAQkAlwAJAJcBCQBXAAkAVwEJANcACQDXAQkANwAJADcBCQC3AAkAtwEJAHcACQB3AQkA9wAJAPcBCQAPAAkADwEJAI8ACQCPAQkATwAJAE8BCQDPAAkAzwEJAC8ACQAvAQkArwAJAK8BCQBvAAkAbwEJAO8ACQDvAQkAHwAJAB8BCQCfAAkAnwEJAF8ACQBfAQkA3wAJAN8BCQA/AAkAPwEJAL8ACQC/AQkAfwAJAH8BCQD/AAkA/wEJAAAABwBAAAcAIAAHAGAABwAQAAcAUAAHADAABwBwAAcACAAHAEgABwAoAAcAaAAHABgABwBYAAcAOAAHAHgABwAEAAcARAAHACQABwBkAAcAFAAHAFQABwA0AAcAdAAHAAMACACDAAgAQwAIAMMACAAjAAgAowAIAGMACADjAAgAAAAFABAABQAIAAUAGAAFAAQABQAUAAUADAAFABwABQACAAUAEgAFAAoABQAaAAUABgAFABYABQAOAAUAHgAFAAEABQARAAUACQAFABkABQAFAAUAFQAFAA0ABQAdAAUAAwAFABMABQALAAUAGwAFAAcABQAXAAUAQeDlAAtNAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAQdDmAAtlAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AQYDoAAsjAgAAAAMAAAAHAAAAAAAAABAREgAIBwkGCgULBAwDDQIOAQ8AQbToAAtpAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4AAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAEG06QALegEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAAABAACAAQAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAMS4yLjExAEG46gALbQcAAAAEAAQACAAEAAgAAAAEAAUAEAAIAAgAAAAEAAYAIAAgAAgAAAAEAAQAEAAQAAkAAAAIABAAIAAgAAkAAAAIABAAgACAAAkAAAAIACAAgAAAAQkAAAAgAIAAAgEABAkAAAAgAAIBAgEAEAkAQbDrAAvWAgMABAAFAAYABwAIAAkACgALAA0ADwARABMAFwAbAB8AIwArADMAOwBDAFMAYwBzAIMAowDDAOMAAgEAAAAAAAAQABAAEAAQABAAEAAQABAAEQARABEAEQASABIAEgASABMAEwATABMAFAAUABQAFAAVABUAFQAVABAATQDKAAAAAQACAAMABAAFAAcACQANABEAGQAhADEAQQBhAIEAwQABAYEBAQIBAwEEAQYBCAEMARABGAEgATABQAFgAAAAABAAEAAQABAAEQARABIAEgATABMAFAAUABUAFQAWABYAFwAXABgAGAAZABkAGgAaABsAGwAcABwAHQAdAEAAQABpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBpbnZhbGlkIGRpc3RhbmNlIGNvZGUAaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlADEuMi4xMQBBkO4AC/IDEAARABIAAAAIAAcACQAGAAoABQALAAQADAADAA0AAgAOAAEADwBpbmNvcnJlY3QgaGVhZGVyIGNoZWNrAHVua25vd24gY29tcHJlc3Npb24gbWV0aG9kAGludmFsaWQgd2luZG93IHNpemUAdW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0AGhlYWRlciBjcmMgbWlzbWF0Y2gAaW52YWxpZCBibG9jayB0eXBlAGludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMAdG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMAaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0AGludmFsaWQgYml0IGxlbmd0aCByZXBlYXQAaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldABpbnZhbGlkIGRpc3RhbmNlcyBzZXQAaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlAGludmFsaWQgZGlzdGFuY2UgY29kZQBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrAEGQ8gALlxFgBwAAAAhQAAAIEAAUCHMAEgcfAAAIcAAACDAAAAnAABAHCgAACGAAAAggAAAJoAAACAAAAAiAAAAIQAAACeAAEAcGAAAIWAAACBgAAAmQABMHOwAACHgAAAg4AAAJ0AARBxEAAAhoAAAIKAAACbAAAAgIAAAIiAAACEgAAAnwABAHBAAACFQAAAgUABUI4wATBysAAAh0AAAINAAACcgAEQcNAAAIZAAACCQAAAmoAAAIBAAACIQAAAhEAAAJ6AAQBwgAAAhcAAAIHAAACZgAFAdTAAAIfAAACDwAAAnYABIHFwAACGwAAAgsAAAJuAAACAwAAAiMAAAITAAACfgAEAcDAAAIUgAACBIAFQijABMHIwAACHIAAAgyAAAJxAARBwsAAAhiAAAIIgAACaQAAAgCAAAIggAACEIAAAnkABAHBwAACFoAAAgaAAAJlAAUB0MAAAh6AAAIOgAACdQAEgcTAAAIagAACCoAAAm0AAAICgAACIoAAAhKAAAJ9AAQBwUAAAhWAAAIFgBACAAAEwczAAAIdgAACDYAAAnMABEHDwAACGYAAAgmAAAJrAAACAYAAAiGAAAIRgAACewAEAcJAAAIXgAACB4AAAmcABQHYwAACH4AAAg+AAAJ3AASBxsAAAhuAAAILgAACbwAAAgOAAAIjgAACE4AAAn8AGAHAAAACFEAAAgRABUIgwASBx8AAAhxAAAIMQAACcIAEAcKAAAIYQAACCEAAAmiAAAIAQAACIEAAAhBAAAJ4gAQBwYAAAhZAAAIGQAACZIAEwc7AAAIeQAACDkAAAnSABEHEQAACGkAAAgpAAAJsgAACAkAAAiJAAAISQAACfIAEAcEAAAIVQAACBUAEAgCARMHKwAACHUAAAg1AAAJygARBw0AAAhlAAAIJQAACaoAAAgFAAAIhQAACEUAAAnqABAHCAAACF0AAAgdAAAJmgAUB1MAAAh9AAAIPQAACdoAEgcXAAAIbQAACC0AAAm6AAAIDQAACI0AAAhNAAAJ+gAQBwMAAAhTAAAIEwAVCMMAEwcjAAAIcwAACDMAAAnGABEHCwAACGMAAAgjAAAJpgAACAMAAAiDAAAIQwAACeYAEAcHAAAIWwAACBsAAAmWABQHQwAACHsAAAg7AAAJ1gASBxMAAAhrAAAIKwAACbYAAAgLAAAIiwAACEsAAAn2ABAHBQAACFcAAAgXAEAIAAATBzMAAAh3AAAINwAACc4AEQcPAAAIZwAACCcAAAmuAAAIBwAACIcAAAhHAAAJ7gAQBwkAAAhfAAAIHwAACZ4AFAdjAAAIfwAACD8AAAneABIHGwAACG8AAAgvAAAJvgAACA8AAAiPAAAITwAACf4AYAcAAAAIUAAACBAAFAhzABIHHwAACHAAAAgwAAAJwQAQBwoAAAhgAAAIIAAACaEAAAgAAAAIgAAACEAAAAnhABAHBgAACFgAAAgYAAAJkQATBzsAAAh4AAAIOAAACdEAEQcRAAAIaAAACCgAAAmxAAAICAAACIgAAAhIAAAJ8QAQBwQAAAhUAAAIFAAVCOMAEwcrAAAIdAAACDQAAAnJABEHDQAACGQAAAgkAAAJqQAACAQAAAiEAAAIRAAACekAEAcIAAAIXAAACBwAAAmZABQHUwAACHwAAAg8AAAJ2QASBxcAAAhsAAAILAAACbkAAAgMAAAIjAAACEwAAAn5ABAHAwAACFIAAAgSABUIowATByMAAAhyAAAIMgAACcUAEQcLAAAIYgAACCIAAAmlAAAIAgAACIIAAAhCAAAJ5QAQBwcAAAhaAAAIGgAACZUAFAdDAAAIegAACDoAAAnVABIHEwAACGoAAAgqAAAJtQAACAoAAAiKAAAISgAACfUAEAcFAAAIVgAACBYAQAgAABMHMwAACHYAAAg2AAAJzQARBw8AAAhmAAAIJgAACa0AAAgGAAAIhgAACEYAAAntABAHCQAACF4AAAgeAAAJnQAUB2MAAAh+AAAIPgAACd0AEgcbAAAIbgAACC4AAAm9AAAIDgAACI4AAAhOAAAJ/QBgBwAAAAhRAAAIEQAVCIMAEgcfAAAIcQAACDEAAAnDABAHCgAACGEAAAghAAAJowAACAEAAAiBAAAIQQAACeMAEAcGAAAIWQAACBkAAAmTABMHOwAACHkAAAg5AAAJ0wARBxEAAAhpAAAIKQAACbMAAAgJAAAIiQAACEkAAAnzABAHBAAACFUAAAgVABAIAgETBysAAAh1AAAINQAACcsAEQcNAAAIZQAACCUAAAmrAAAIBQAACIUAAAhFAAAJ6wAQBwgAAAhdAAAIHQAACZsAFAdTAAAIfQAACD0AAAnbABIHFwAACG0AAAgtAAAJuwAACA0AAAiNAAAITQAACfsAEAcDAAAIUwAACBMAFQjDABMHIwAACHMAAAgzAAAJxwARBwsAAAhjAAAIIwAACacAAAgDAAAIgwAACEMAAAnnABAHBwAACFsAAAgbAAAJlwAUB0MAAAh7AAAIOwAACdcAEgcTAAAIawAACCsAAAm3AAAICwAACIsAAAhLAAAJ9wAQBwUAAAhXAAAIFwBACAAAEwczAAAIdwAACDcAAAnPABEHDwAACGcAAAgnAAAJrwAACAcAAAiHAAAIRwAACe8AEAcJAAAIXwAACB8AAAmfABQHYwAACH8AAAg/AAAJ3wASBxsAAAhvAAAILwAACb8AAAgPAAAIjwAACE8AAAn/ABAFAQAXBQEBEwURABsFARARBQUAGQUBBBUFQQAdBQFAEAUDABgFAQIUBSEAHAUBIBIFCQAaBQEIFgWBAEAFAAAQBQIAFwWBARMFGQAbBQEYEQUHABkFAQYVBWEAHQUBYBAFBAAYBQEDFAUxABwFATASBQ0AGgUBDBYFwQBABQAAMS4yLjExAC0rICAgMFgweAAobnVsbCkAQbCDAQtBEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAEACQsLAAAJBgsAAAsABhEAAAAREREAQYGEAQshCwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAEG7hAELAQwAQceEAQsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEH1hAELAQ4AQYGFAQsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGvhQELARAAQbuFAQseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHyhQELDhIAAAASEhIAAAAAAAAJAEGjhgELAQsAQa+GAQsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEHdhgELAQwAQemGAQtLDAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGLTBYKzBYIDBYLTB4KzB4IDB4AGluZgBJTkYAbmFuAE5BTgAuAEHchwELARcAQYOIAQsF//////8AQdCIAQtXGRJEOwI/LEcUPTMwChsGRktFNw9JDo4XA0AdPGkrNh9KLRwBICUpIQgMFRYiLhA4Pgs0MRhkdHV2L0EJfzkRI0MyQomKiwUEJignDSoeNYwHGkiTE5SVAEGwiQEL3Q5JbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgAAVW5rbm93biBlcnJvciAlZAAlcyVzJXMAADogAC9wcm9jL3NlbGYvZmQvAC9kZXYvdXJhbmRvbQByd2EAJXMuWFhYWFhYAHIrYgByYgBQSwUGAEGQmAELTgoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAABAAAACAAAABBMAAAwTABBkJoBCwJQUABByJoBCwkfAAAAZE0AAAMAQeSaAQuMAS30UVjPjLHARva1yykxA8cEW3AwtF39IHh/i5rYWSlQaEiJq6dWA2z/t82IP9R3tCulo3DxuuSo/EGD/dlv4Yp6Ly10lgcfDQleA3YscPdApSynb1dBqKp036BYZANKx8Q8U66vXxgEFbHjbSiGqwykv0Pw6VCBOVcWUjf/////////////////////";function ne(){var e=function(){var e=new Error;if(!e.stack){try{throw new Error}catch(t){e=t}if(!e.stack)return"(no stack trace available)"}return e.stack.toString()}();return o.extraStackTrace&&(e+="\n"+o.extraStackTrace()),e.replace(/\b_Z[\w\d_]+/g,(function(e){return e==e?e:e+" ["+e+"]"}))}$(re)||(re=function(e){return o.locateFile?o.locateFile(e,h):h+e}(re)),_.push({func:function(){be()}});var ie={splitPath:function(e){return/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(e).slice(1)},normalizeArray:function(e,t){for(var r=0,n=e.length-1;n>=0;n--){var i=e[n];"."===i?e.splice(n,1):".."===i?(e.splice(n,1),r++):r&&(e.splice(n,1),r--)}if(t)for(;r;r--)e.unshift("..");return e},normalize:function(e){var t="/"===e.charAt(0),r="/"===e.substr(-1);return(e=ie.normalizeArray(e.split("/").filter((function(e){return!!e})),!t).join("/"))||t||(e="."),e&&r&&(e+="/"),(t?"/":"")+e},dirname:function(e){var t=ie.splitPath(e),r=t[0],n=t[1];return r||n?(n&&(n=n.substr(0,n.length-1)),r+n):"."},basename:function(e){if("/"===e)return"/";var t=e.lastIndexOf("/");return-1===t?e:e.substr(t+1)},extname:function(e){return ie.splitPath(e)[3]},join:function(){var e=Array.prototype.slice.call(arguments,0);return ie.normalize(e.join("/"))},join2:function(e,t){return ie.normalize(e+"/"+t)}};function oe(e){return N[Se()>>2]=e,e}var se={resolve:function(){for(var e="",t=!1,r=arguments.length-1;r>=-1&&!t;r--){var n=r>=0?arguments[r]:he.cwd();if("string"!=typeof n)throw new TypeError("Arguments to path.resolve must be strings");if(!n)return"";e=n+"/"+e,t="/"===n.charAt(0)}return(t?"/":"")+(e=ie.normalizeArray(e.split("/").filter((function(e){return!!e})),!t).join("/"))||"."},relative:function(e,t){function r(e){for(var t=0;t=0&&""===e[r];r--);return t>r?[]:e.slice(t,r-t+1)}e=se.resolve(e).substr(1),t=se.resolve(t).substr(1);for(var n=r(e.split("/")),i=r(t.split("/")),o=Math.min(n.length,i.length),s=o,A=0;A0?r.slice(0,n).toString("utf-8"):null))return null;e.input=we(t,!0)}return e.input.shift()},put_char:function(e,t){null===t||10===t?(g(B(e.output,0)),e.output=[]):0!=t&&e.output.push(t)},flush:function(e){e.output&&e.output.length>0&&(g(B(e.output,0)),e.output=[])}},default_tty1_ops:{put_char:function(e,t){null===t||10===t?(f(B(e.output,0)),e.output=[]):0!=t&&e.output.push(t)},flush:function(e){e.output&&e.output.length>0&&(f(B(e.output,0)),e.output=[])}}},ae={ops_table:null,mount:function(e){return ae.createNode(null,"/",16895,0)},createNode:function(e,t,r,n){if(he.isBlkdev(r)||he.isFIFO(r))throw new he.ErrnoError(63);ae.ops_table||(ae.ops_table={dir:{node:{getattr:ae.node_ops.getattr,setattr:ae.node_ops.setattr,lookup:ae.node_ops.lookup,mknod:ae.node_ops.mknod,rename:ae.node_ops.rename,unlink:ae.node_ops.unlink,rmdir:ae.node_ops.rmdir,readdir:ae.node_ops.readdir,symlink:ae.node_ops.symlink},stream:{llseek:ae.stream_ops.llseek}},file:{node:{getattr:ae.node_ops.getattr,setattr:ae.node_ops.setattr},stream:{llseek:ae.stream_ops.llseek,read:ae.stream_ops.read,write:ae.stream_ops.write,allocate:ae.stream_ops.allocate,mmap:ae.stream_ops.mmap,msync:ae.stream_ops.msync}},link:{node:{getattr:ae.node_ops.getattr,setattr:ae.node_ops.setattr,readlink:ae.node_ops.readlink},stream:{}},chrdev:{node:{getattr:ae.node_ops.getattr,setattr:ae.node_ops.setattr},stream:he.chrdev_stream_ops}});var i=he.createNode(e,t,r,n);return he.isDir(i.mode)?(i.node_ops=ae.ops_table.dir.node,i.stream_ops=ae.ops_table.dir.stream,i.contents={}):he.isFile(i.mode)?(i.node_ops=ae.ops_table.file.node,i.stream_ops=ae.ops_table.file.stream,i.usedBytes=0,i.contents=null):he.isLink(i.mode)?(i.node_ops=ae.ops_table.link.node,i.stream_ops=ae.ops_table.link.stream):he.isChrdev(i.mode)&&(i.node_ops=ae.ops_table.chrdev.node,i.stream_ops=ae.ops_table.chrdev.stream),i.timestamp=Date.now(),e&&(e.contents[t]=i),i},getFileDataAsRegularArray:function(e){if(e.contents&&e.contents.subarray){for(var t=[],r=0;r=t)){t=Math.max(t,r*(r<1048576?2:1.125)>>>0),0!=r&&(t=Math.max(t,256));var n=e.contents;e.contents=new Uint8Array(t),e.usedBytes>0&&e.contents.set(n.subarray(0,e.usedBytes),0)}},resizeFileStorage:function(e,t){if(e.usedBytes!=t){if(0==t)return e.contents=null,void(e.usedBytes=0);if(!e.contents||e.contents.subarray){var r=e.contents;return e.contents=new Uint8Array(t),r&&e.contents.set(r.subarray(0,Math.min(t,e.usedBytes))),void(e.usedBytes=t)}if(e.contents||(e.contents=[]),e.contents.length>t)e.contents.length=t;else for(;e.contents.length=e.node.usedBytes)return 0;var s=Math.min(e.node.usedBytes-i,n);if(s>8&&o.subarray)t.set(o.subarray(i,i+s),r);else for(var A=0;A0||n+r>2)}catch(e){if(!e.code)throw e;throw new he.ErrnoError(ue.convertNodeCode(e))}return t.mode},realPath:function(e){for(var t=[];e.parent!==e;)t.push(e.name),e=e.parent;return t.push(e.mount.opts.root),t.reverse(),ie.join.apply(null,t)},flagsForNode:function(e){e&=-2097153,e&=-2049,e&=-32769,e&=-524289;var t=0;for(var r in ue.flagsForNodeMap)e&r&&(t|=ue.flagsForNodeMap[r],e^=r);if(e)throw new he.ErrnoError(28);return t},node_ops:{getattr:function(e){var t,r=ue.realPath(e);try{t=Ce.lstatSync(r)}catch(e){if(!e.code)throw e;throw new he.ErrnoError(ue.convertNodeCode(e))}return ue.isWindows&&!t.blksize&&(t.blksize=4096),ue.isWindows&&!t.blocks&&(t.blocks=(t.size+t.blksize-1)/t.blksize|0),{dev:t.dev,ino:t.ino,mode:t.mode,nlink:t.nlink,uid:t.uid,gid:t.gid,rdev:t.rdev,size:t.size,atime:t.atime,mtime:t.mtime,ctime:t.ctime,blksize:t.blksize,blocks:t.blocks}},setattr:function(e,t){var r=ue.realPath(e);try{if(void 0!==t.mode&&(Ce.chmodSync(r,t.mode),e.mode=t.mode),void 0!==t.timestamp){var n=new Date(t.timestamp);Ce.utimesSync(r,n,n)}void 0!==t.size&&Ce.truncateSync(r,t.size)}catch(e){if(!e.code)throw e;throw new he.ErrnoError(ue.convertNodeCode(e))}},lookup:function(e,t){var r=ie.join2(ue.realPath(e),t),n=ue.getMode(r);return ue.createNode(e,t,n)},mknod:function(e,t,r,n){var i=ue.createNode(e,t,r,n),o=ue.realPath(i);try{he.isDir(i.mode)?Ce.mkdirSync(o,i.mode):Ce.writeFileSync(o,"",{mode:i.mode})}catch(e){if(!e.code)throw e;throw new he.ErrnoError(ue.convertNodeCode(e))}return i},rename:function(e,t,r){var n=ue.realPath(e),i=ie.join2(ue.realPath(t),r);try{Ce.renameSync(n,i)}catch(e){if(!e.code)throw e;throw new he.ErrnoError(ue.convertNodeCode(e))}e.name=r},unlink:function(e,t){var r=ie.join2(ue.realPath(e),t);try{Ce.unlinkSync(r)}catch(e){if(!e.code)throw e;throw new he.ErrnoError(ue.convertNodeCode(e))}},rmdir:function(e,t){var r=ie.join2(ue.realPath(e),t);try{Ce.rmdirSync(r)}catch(e){if(!e.code)throw e;throw new he.ErrnoError(ue.convertNodeCode(e))}},readdir:function(e){var t=ue.realPath(e);try{return Ce.readdirSync(t)}catch(e){if(!e.code)throw e;throw new he.ErrnoError(ue.convertNodeCode(e))}},symlink:function(e,t,r){var n=ie.join2(ue.realPath(e),t);try{Ce.symlinkSync(r,n)}catch(e){if(!e.code)throw e;throw new he.ErrnoError(ue.convertNodeCode(e))}},readlink:function(e){var t=ue.realPath(e);try{return t=Ce.readlinkSync(t),t=Ee.relative(Ee.resolve(e.mount.opts.root),t)}catch(e){if(!e.code)throw e;throw new he.ErrnoError(ue.convertNodeCode(e))}}},stream_ops:{open:function(e){var t=ue.realPath(e.node);try{he.isFile(e.node.mode)&&(e.nfd=Ce.openSync(t,ue.flagsForNode(e.flags)))}catch(e){if(!e.code)throw e;throw new he.ErrnoError(ue.convertNodeCode(e))}},close:function(e){try{he.isFile(e.node.mode)&&e.nfd&&Ce.closeSync(e.nfd)}catch(e){if(!e.code)throw e;throw new he.ErrnoError(ue.convertNodeCode(e))}},read:function(e,t,r,n,i){if(0===n)return 0;try{return Ce.readSync(e.nfd,ue.bufferFrom(t.buffer),r,n,i)}catch(e){throw new he.ErrnoError(ue.convertNodeCode(e))}},write:function(e,t,r,n,i){try{return Ce.writeSync(e.nfd,ue.bufferFrom(t.buffer),r,n,i)}catch(e){throw new he.ErrnoError(ue.convertNodeCode(e))}},llseek:function(e,t,r){var n=t;if(1===r)n+=e.position;else if(2===r&&he.isFile(e.node.mode))try{n+=Ce.fstatSync(e.nfd).size}catch(e){throw new he.ErrnoError(ue.convertNodeCode(e))}if(n<0)throw new he.ErrnoError(28);return n},mmap:function(e,t,r,n,i,o){if(I(0===t),!he.isFile(e.node.mode))throw new he.ErrnoError(43);var s=Ke(r);return ue.stream_ops.read(e,x,s,r,n),{ptr:s,allocated:!0}},msync:function(e,t,r,n,i){if(!he.isFile(e.node.mode))throw new he.ErrnoError(43);if(2&i)return 0;ue.stream_ops.write(e,t,0,n,r,!1);return 0}}},le={lookupPath:function(e){return{path:e,node:{mode:ue.getMode(e)}}},createStandardStreams:function(){he.streams[0]={fd:0,nfd:0,position:0,path:"",flags:0,tty:!0,seekable:!1};for(var e=1;e<3;e++)he.streams[e]={fd:e,nfd:e,position:0,path:"",flags:577,tty:!0,seekable:!1}},cwd:function(){return process.cwd()},chdir:function(){process.chdir.apply(void 0,arguments)},mknod:function(e,t){he.isDir(e)?Ce.mkdirSync(e,t):Ce.writeFileSync(e,"",{mode:t})},mkdir:function(){Ce.mkdirSync.apply(void 0,arguments)},symlink:function(){Ce.symlinkSync.apply(void 0,arguments)},rename:function(){Ce.renameSync.apply(void 0,arguments)},rmdir:function(){Ce.rmdirSync.apply(void 0,arguments)},readdir:function(){Ce.readdirSync.apply(void 0,arguments)},unlink:function(){Ce.unlinkSync.apply(void 0,arguments)},readlink:function(){return Ce.readlinkSync.apply(void 0,arguments)},stat:function(){return Ce.statSync.apply(void 0,arguments)},lstat:function(){return Ce.lstatSync.apply(void 0,arguments)},chmod:function(){Ce.chmodSync.apply(void 0,arguments)},fchmod:function(){Ce.fchmodSync.apply(void 0,arguments)},chown:function(){Ce.chownSync.apply(void 0,arguments)},fchown:function(){Ce.fchownSync.apply(void 0,arguments)},truncate:function(){Ce.truncateSync.apply(void 0,arguments)},ftruncate:function(){Ce.ftruncateSync.apply(void 0,arguments)},utime:function(){Ce.utimesSync.apply(void 0,arguments)},open:function(e,t,r,n){"string"==typeof t&&(t=me.modeStringToFlags(t));var i=Ce.openSync(e,ue.flagsForNode(t),r),o=null!=n?n:he.nextfd(i),s={fd:o,nfd:i,position:0,path:e,flags:t,seekable:!0};return he.streams[o]=s,s},close:function(e){e.stream_ops||Ce.closeSync(e.nfd),he.closeStream(e.fd)},llseek:function(e,t,r){if(e.stream_ops)return me.llseek(e,t,r);var n=t;if(1===r)n+=e.position;else if(2===r)n+=Ce.fstatSync(e.nfd).size;else if(0!==r)throw new he.ErrnoError(ce.EINVAL);if(n<0)throw new he.ErrnoError(ce.EINVAL);return e.position=n,n},read:function(e,t,r,n,i){if(e.stream_ops)return me.read(e,t,r,n,i);var o=void 0!==i;!o&&e.seekable&&(i=e.position);var s=Ce.readSync(e.nfd,ue.bufferFrom(t.buffer),r,n,i);return o||(e.position+=s),s},write:function(e,t,r,n,i){if(e.stream_ops)return me.write(e,t,r,n,i);1024&e.flags&&he.llseek(e,0,2);var o=void 0!==i;!o&&e.seekable&&(i=e.position);var s=Ce.writeSync(e.nfd,ue.bufferFrom(t.buffer),r,n,i);return o||(e.position+=s),s},allocate:function(){throw new he.ErrnoError(ce.EOPNOTSUPP)},mmap:function(){throw new he.ErrnoError(ce.ENODEV)},msync:function(){return 0},munmap:function(){return 0},ioctl:function(){throw new he.ErrnoError(ce.ENOTTY)}},he={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:function(e){if(!(e instanceof he.ErrnoError))throw e+" : "+ne();return oe(e.errno)},lookupPath:function(e,t){if(t=t||{},!(e=se.resolve(he.cwd(),e)))return{path:"",node:null};var r={follow_mount:!0,recurse_count:0};for(var n in r)void 0===t[n]&&(t[n]=r[n]);if(t.recurse_count>8)throw new he.ErrnoError(32);for(var i=ie.normalizeArray(e.split("/").filter((function(e){return!!e})),!1),o=he.root,s="/",A=0;A40)throw new he.ErrnoError(32)}}return{path:s,node:o}},getPath:function(e){for(var t;;){if(he.isRoot(e)){var r=e.mount.mountpoint;return t?"/"!==r[r.length-1]?r+"/"+t:r+t:r}t=t?e.name+"/"+t:e.name,e=e.parent}},hashName:function(e,t){for(var r=0,n=0;n>>0)%he.nameTable.length},hashAddNode:function(e){var t=he.hashName(e.parent.id,e.name);e.name_next=he.nameTable[t],he.nameTable[t]=e},hashRemoveNode:function(e){var t=he.hashName(e.parent.id,e.name);if(he.nameTable[t]===e)he.nameTable[t]=e.name_next;else for(var r=he.nameTable[t];r;){if(r.name_next===e){r.name_next=e.name_next;break}r=r.name_next}},lookupNode:function(e,t){var r=he.mayLookup(e);if(r)throw new he.ErrnoError(r,e);for(var n=he.hashName(e.id,t),i=he.nameTable[n];i;i=i.name_next){var o=i.name;if(i.parent.id===e.id&&o===t)return i}return he.lookup(e,t)},createNode:function(e,t,r,n){var i=new he.FSNode(e,t,r,n);return he.hashAddNode(i),i},destroyNode:function(e){he.hashRemoveNode(e)},isRoot:function(e){return e===e.parent},isMountpoint:function(e){return!!e.mounted},isFile:function(e){return 32768==(61440&e)},isDir:function(e){return 16384==(61440&e)},isLink:function(e){return 40960==(61440&e)},isChrdev:function(e){return 8192==(61440&e)},isBlkdev:function(e){return 24576==(61440&e)},isFIFO:function(e){return 4096==(61440&e)},isSocket:function(e){return 49152==(49152&e)},flagModes:{r:0,rs:1052672,"r+":2,w:577,wx:705,xw:705,"w+":578,"wx+":706,"xw+":706,a:1089,ax:1217,xa:1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function(e){var t=he.flagModes[e];if(void 0===t)throw new Error("Unknown file open mode: "+e);return t},flagsToPermissionString:function(e){var t=["r","w","rw"][3&e];return 512&e&&(t+="w"),t},nodePermissions:function(e,t){return he.ignorePermissions||(-1===t.indexOf("r")||292&e.mode)&&(-1===t.indexOf("w")||146&e.mode)&&(-1===t.indexOf("x")||73&e.mode)?0:2},mayLookup:function(e){var t=he.nodePermissions(e,"x");return t||(e.node_ops.lookup?0:2)},mayCreate:function(e,t){try{he.lookupNode(e,t);return 20}catch(e){}return he.nodePermissions(e,"wx")},mayDelete:function(e,t,r){var n;try{n=he.lookupNode(e,t)}catch(e){return e.errno}var i=he.nodePermissions(e,"wx");if(i)return i;if(r){if(!he.isDir(n.mode))return 54;if(he.isRoot(n)||he.getPath(n)===he.cwd())return 10}else if(he.isDir(n.mode))return 31;return 0},mayOpen:function(e,t){return e?he.isLink(e.mode)?32:he.isDir(e.mode)&&("r"!==he.flagsToPermissionString(t)||512&t)?31:he.nodePermissions(e,he.flagsToPermissionString(t)):44},MAX_OPEN_FDS:4096,nextfd:function(e,t){e=e||0,t=t||he.MAX_OPEN_FDS;for(var r=e;r<=t;r++)if(!he.streams[r])return r;throw new he.ErrnoError(33)},getStream:function(e){return he.streams[e]},createStream:function(e,t,r){he.FSStream||(he.FSStream=function(){},he.FSStream.prototype={object:{get:function(){return this.node},set:function(e){this.node=e}},isRead:{get:function(){return 1!=(2097155&this.flags)}},isWrite:{get:function(){return 0!=(2097155&this.flags)}},isAppend:{get:function(){return 1024&this.flags}}});var n=new he.FSStream;for(var i in e)n[i]=e[i];e=n;var o=he.nextfd(t,r);return e.fd=o,he.streams[o]=e,e},closeStream:function(e){he.streams[e]=null},chrdev_stream_ops:{open:function(e){var t=he.getDevice(e.node.rdev);e.stream_ops=t.stream_ops,e.stream_ops.open&&e.stream_ops.open(e)},llseek:function(){throw new he.ErrnoError(70)}},major:function(e){return e>>8},minor:function(e){return 255&e},makedev:function(e,t){return e<<8|t},registerDevice:function(e,t){he.devices[e]={stream_ops:t}},getDevice:function(e){return he.devices[e]},getMounts:function(e){for(var t=[],r=[e];r.length;){var n=r.pop();t.push(n),r.push.apply(r,n.mounts)}return t},syncfs:function(e,t){"function"==typeof e&&(t=e,e=!1),he.syncFSRequests++,he.syncFSRequests>1&&f("warning: "+he.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var r=he.getMounts(he.root.mount),n=0;function i(e){return he.syncFSRequests--,t(e)}function o(e){if(e)return o.errored?void 0:(o.errored=!0,i(e));++n>=r.length&&i(null)}r.forEach((function(t){if(!t.type.syncfs)return o(null);t.type.syncfs(t,e,o)}))},mount:function(e,t,r){var n,i="/"===r,o=!r;if(i&&he.root)throw new he.ErrnoError(10);if(!i&&!o){var s=he.lookupPath(r,{follow_mount:!1});if(r=s.path,n=s.node,he.isMountpoint(n))throw new he.ErrnoError(10);if(!he.isDir(n.mode))throw new he.ErrnoError(54)}var A={type:e,opts:t,mountpoint:r,mounts:[]},a=e.mount(A);return a.mount=A,A.root=a,i?he.root=a:n&&(n.mounted=A,n.mount&&n.mount.mounts.push(A)),a},unmount:function(e){var t=he.lookupPath(e,{follow_mount:!1});if(!he.isMountpoint(t.node))throw new he.ErrnoError(28);var r=t.node,n=r.mounted,i=he.getMounts(n);Object.keys(he.nameTable).forEach((function(e){for(var t=he.nameTable[e];t;){var r=t.name_next;-1!==i.indexOf(t.mount)&&he.destroyNode(t),t=r}})),r.mounted=null;var o=r.mount.mounts.indexOf(n);r.mount.mounts.splice(o,1)},lookup:function(e,t){return e.node_ops.lookup(e,t)},mknod:function(e,t,r){var n=he.lookupPath(e,{parent:!0}).node,i=ie.basename(e);if(!i||"."===i||".."===i)throw new he.ErrnoError(28);var o=he.mayCreate(n,i);if(o)throw new he.ErrnoError(o);if(!n.node_ops.mknod)throw new he.ErrnoError(63);return n.node_ops.mknod(n,i,t,r)},create:function(e,t){return t=void 0!==t?t:438,t&=4095,t|=32768,he.mknod(e,t,0)},mkdir:function(e,t){return t=void 0!==t?t:511,t&=1023,t|=16384,he.mknod(e,t,0)},mkdirTree:function(e,t){for(var r=e.split("/"),n="",i=0;ithis.length-1||e<0)){var t=e%this.chunkSize,r=e/this.chunkSize|0;return this.getter(r)[t]}},o.prototype.setDataGetter=function(e){this.getter=e},o.prototype.cacheLength=function(){var e=new XMLHttpRequest;if(e.open("HEAD",r,!1),e.send(null),!(e.status>=200&&e.status<300||304===e.status))throw new Error("Couldn't load "+r+". Status: "+e.status);var t,n=Number(e.getResponseHeader("Content-length")),i=(t=e.getResponseHeader("Accept-Ranges"))&&"bytes"===t,o=(t=e.getResponseHeader("Content-Encoding"))&&"gzip"===t,s=1048576;i||(s=n);var A=this;A.setDataGetter((function(e){var t=e*s,i=(e+1)*s-1;if(i=Math.min(i,n-1),void 0===A.chunks[e]&&(A.chunks[e]=function(e,t){if(e>t)throw new Error("invalid range ("+e+", "+t+") or no bytes requested!");if(t>n-1)throw new Error("only "+n+" bytes available! programmer error!");var i=new XMLHttpRequest;if(i.open("GET",r,!1),n!==s&&i.setRequestHeader("Range","bytes="+e+"-"+t),"undefined"!=typeof Uint8Array&&(i.responseType="arraybuffer"),i.overrideMimeType&&i.overrideMimeType("text/plain; charset=x-user-defined"),i.send(null),!(i.status>=200&&i.status<300||304===i.status))throw new Error("Couldn't load "+r+". Status: "+i.status);return void 0!==i.response?new Uint8Array(i.response||[]):we(i.responseText||"",!0)}(t,i)),void 0===A.chunks[e])throw new Error("doXHR failed!");return A.chunks[e]})),!o&&n||(s=n=1,n=this.getter(0).length,s=n,g("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=n,this._chunkSize=s,this.lengthKnown=!0},"undefined"!=typeof XMLHttpRequest)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var s={isDevice:!1,url:r},A=he.createFile(e,t,s,n,i);s.contents?A.contents=s.contents:s.url&&(A.contents=null,A.url=s.url),Object.defineProperties(A,{usedBytes:{get:function(){return this.contents.length}}});var a={};return Object.keys(A.stream_ops).forEach((function(e){var t=A.stream_ops[e];a[e]=function(){if(!he.forceLoadFile(A))throw new he.ErrnoError(29);return t.apply(null,arguments)}})),a.read=function(e,t,r,n,i){if(!he.forceLoadFile(A))throw new he.ErrnoError(29);var o=e.node.contents;if(i>=o.length)return 0;var s=Math.min(o.length-i,n);if(o.slice)for(var a=0;a>2]=n.dev,N[r+4>>2]=0,N[r+8>>2]=n.ino,N[r+12>>2]=n.mode,N[r+16>>2]=n.nlink,N[r+20>>2]=n.uid,N[r+24>>2]=n.gid,N[r+28>>2]=n.rdev,N[r+32>>2]=0,te=[n.size>>>0,(ee=n.size,+Y(ee)>=1?ee>0?(0|H(+J(ee/4294967296),4294967295))>>>0:~~+G((ee-+(~~ee>>>0))/4294967296)>>>0:0)],N[r+40>>2]=te[0],N[r+44>>2]=te[1],N[r+48>>2]=4096,N[r+52>>2]=n.blocks,N[r+56>>2]=n.atime.getTime()/1e3|0,N[r+60>>2]=0,N[r+64>>2]=n.mtime.getTime()/1e3|0,N[r+68>>2]=0,N[r+72>>2]=n.ctime.getTime()/1e3|0,N[r+76>>2]=0,te=[n.ino>>>0,(ee=n.ino,+Y(ee)>=1?ee>0?(0|H(+J(ee/4294967296),4294967295))>>>0:~~+G((ee-+(~~ee>>>0))/4294967296)>>>0:0)],N[r+80>>2]=te[0],N[r+84>>2]=te[1],0},doMsync:function(e,t,r,n,i){var o=F.slice(e,e+r);he.msync(t,o,i,r,n)},doMkdir:function(e,t){return"/"===(e=ie.normalize(e))[e.length-1]&&(e=e.substr(0,e.length-1)),he.mkdir(e,t,0),0},doMknod:function(e,t,r){switch(61440&t){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return he.mknod(e,t,r),0},doReadlink:function(e,t,r){if(r<=0)return-28;var n=he.readlink(e),i=Math.min(r,b(n)),o=x[t+i];return D(n,t,r+1),x[t+i]=o,i},doAccess:function(e,t){if(-8&t)return-28;var r;if(!(r=he.lookupPath(e,{follow:!0}).node))return-44;var n="";return 4&t&&(n+="r"),2&t&&(n+="w"),1&t&&(n+="x"),n&&he.nodePermissions(r,n)?-2:0},doDup:function(e,t,r){var n=he.getStream(r);return n&&he.close(n),he.open(e,t,0,r,r).fd},doReadv:function(e,t,r,n){for(var i=0,o=0;o>2],A=N[t+(8*o+4)>>2],a=he.read(e,x,s,A,n);if(a<0)return-1;if(i+=a,a>2],A=N[t+(8*o+4)>>2],a=he.write(e,x,s,A,n);if(a<0)return-1;i+=a}return i},varargs:void 0,get:function(){return ge.varargs+=4,N[ge.varargs-4>>2]},getStr:function(e){return Q(e)},getStreamFromFD:function(e){var t=he.getStream(e);if(!t)throw new he.ErrnoError(8);return t},get64:function(e,t){return e}};function fe(e){try{return d.grow(e-k.byteLength+65535>>>16),L(d.buffer),1}catch(e){}}var pe=(D("GMT",20704,4),20704);var de=function(e,t,r,n){e||(e=this),this.parent=e,this.mount=e.mount,this.mounted=null,this.id=he.nextInode++,this.name=t,this.mode=r,this.node_ops={},this.stream_ops={},this.rdev=n};Object.defineProperties(de.prototype,{read:{get:function(){return 365==(365&this.mode)},set:function(e){e?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146==(146&this.mode)},set:function(e){e?this.mode|=146:this.mode&=-147}},isFolder:{get:function(){return he.isDir(this.mode)}},isDevice:{get:function(){return he.isChrdev(this.mode)}}}),he.FSNode=de,he.staticInit();var Ce=i,Ee=r(85622);ue.staticInit();var Ie=function(e){return function(){try{return e.apply(this,arguments)}catch(e){if(!e.code)throw e;throw new he.ErrnoError(ce[e.code])}}},me=Object.assign({},he);for(var ye in le)he[ye]=Ie(le[ye]);function we(e,t,r){var n=r>0?r:b(e)+1,i=new Array(n),o=v(e,i,0,i.length);return t&&(i.length=o),i}"function"==typeof atob&&atob;function Be(e){if($(e))return function(e){var t;try{t=Buffer.from(e,"base64")}catch(r){t=new Buffer(e,"base64")}return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}(e.slice("data:application/octet-stream;base64,".length))}var Qe,ve={p:function(e,t){try{return e=ge.getStr(e),he.chmod(e,t),0}catch(e){return void 0!==he&&e instanceof he.ErrnoError||Z(e),-e.errno}},e:function(e,t,r){ge.varargs=r;try{var n=ge.getStreamFromFD(e);switch(t){case 0:return(i=ge.get())<0?-28:he.open(n.path,n.flags,0,i).fd;case 1:case 2:return 0;case 3:return n.flags;case 4:var i=ge.get();return n.flags|=i,0;case 12:i=ge.get();return M[i+0>>1]=2,0;case 13:case 14:return 0;case 16:case 8:return-28;case 9:return oe(28),-1;default:return-28}}catch(e){return void 0!==he&&e instanceof he.ErrnoError||Z(e),-e.errno}},j:function(e,t){try{var r=ge.getStreamFromFD(e);return ge.doStat(he.stat,r.path,t)}catch(e){return void 0!==he&&e instanceof he.ErrnoError||Z(e),-e.errno}},o:function(e,t,r){ge.varargs=r;try{var n=ge.getStreamFromFD(e);switch(t){case 21509:case 21505:return n.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return n.tty?0:-59;case 21519:if(!n.tty)return-59;var i=ge.get();return N[i>>2]=0,0;case 21520:return n.tty?-28:-59;case 21531:i=ge.get();return he.ioctl(n,t,i);case 21523:case 21524:return n.tty?0:-59;default:Z("bad ioctl syscall "+t)}}catch(e){return void 0!==he&&e instanceof he.ErrnoError||Z(e),-e.errno}},r:function(e,t,r){ge.varargs=r;try{var n=ge.getStr(e),i=ge.get();return he.open(n,t,i).fd}catch(e){return void 0!==he&&e instanceof he.ErrnoError||Z(e),-e.errno}},q:function(e,t,r){try{var n=ge.getStreamFromFD(e);return he.read(n,x,t,r)}catch(e){return void 0!==he&&e instanceof he.ErrnoError||Z(e),-e.errno}},h:function(e,t){try{return e=ge.getStr(e),t=ge.getStr(t),he.rename(e,t),0}catch(e){return void 0!==he&&e instanceof he.ErrnoError||Z(e),-e.errno}},s:function(e){try{return e=ge.getStr(e),he.rmdir(e),0}catch(e){return void 0!==he&&e instanceof he.ErrnoError||Z(e),-e.errno}},c:function(e,t){try{return e=ge.getStr(e),ge.doStat(he.stat,e,t)}catch(e){return void 0!==he&&e instanceof he.ErrnoError||Z(e),-e.errno}},g:function(e){try{return e=ge.getStr(e),he.unlink(e),0}catch(e){return void 0!==he&&e instanceof he.ErrnoError||Z(e),-e.errno}},t:function(e,t,r){F.copyWithin(e,t,t+r)},u:function(e){e>>>=0;var t=F.length;if(e>2147483648)return!1;for(var r,n,i=1;i<=4;i*=2){var o=t*(1+.2/i);if(o=Math.min(o,e+100663296),fe(Math.min(2147483648,((r=Math.max(16777216,e,o))%(n=65536)>0&&(r+=n-r%n),r))))return!0}return!1},f:function(e){try{var t=ge.getStreamFromFD(e);return he.close(t),0}catch(e){return void 0!==he&&e instanceof he.ErrnoError||Z(e),e.errno}},i:function(e,t){try{var r=ge.getStreamFromFD(e),n=r.tty?2:he.isDir(r.mode)?3:he.isLink(r.mode)?7:4;return x[t>>0]=n,0}catch(e){return void 0!==he&&e instanceof he.ErrnoError||Z(e),e.errno}},n:function(e,t,r,n){try{var i=ge.getStreamFromFD(e),o=ge.doReadv(i,t,r);return N[n>>2]=o,0}catch(e){return void 0!==he&&e instanceof he.ErrnoError||Z(e),e.errno}},l:function(e,t,r,n,i){try{var o=ge.getStreamFromFD(e),s=4294967296*r+(t>>>0);return s<=-9007199254740992||s>=9007199254740992?-61:(he.llseek(o,s,n),te=[o.position>>>0,(ee=o.position,+Y(ee)>=1?ee>0?(0|H(+J(ee/4294967296),4294967295))>>>0:~~+G((ee-+(~~ee>>>0))/4294967296)>>>0:0)],N[i>>2]=te[0],N[i+4>>2]=te[1],o.getdents&&0===s&&0===n&&(o.getdents=null),0)}catch(e){return void 0!==he&&e instanceof he.ErrnoError||Z(e),e.errno}},d:function(e,t,r,n){try{var i=ge.getStreamFromFD(e),o=ge.doWritev(i,t,r);return N[n>>2]=o,0}catch(e){return void 0!==he&&e instanceof he.ErrnoError||Z(e),e.errno}},k:function(e){return function(e,t){var r=new Date(1e3*N[e>>2]);N[t>>2]=r.getUTCSeconds(),N[t+4>>2]=r.getUTCMinutes(),N[t+8>>2]=r.getUTCHours(),N[t+12>>2]=r.getUTCDate(),N[t+16>>2]=r.getUTCMonth(),N[t+20>>2]=r.getUTCFullYear()-1900,N[t+24>>2]=r.getUTCDay(),N[t+36>>2]=0,N[t+32>>2]=0;var n=Date.UTC(r.getUTCFullYear(),0,1,0,0,0,0),i=(r.getTime()-n)/864e5|0;return N[t+28>>2]=i,N[t+40>>2]=pe,t}(e,20656)},memory:d,a:function(e){0|e},table:C,b:function(e){var t=Date.now()/1e3|0;return e&&(N[e>>2]=t),t},m:function(e){!function e(){if(!e.called){e.called=!0,N[Fe()>>2]=60*(new Date).getTimezoneOffset();var t=(new Date).getFullYear(),r=new Date(t,0,1),n=new Date(t,6,1);N[xe()>>2]=Number(r.getTimezoneOffset()!=n.getTimezoneOffset());var i=a(r),o=a(n),s=S(i),A=S(o);n.getTimezoneOffset()>2]=s,N[ke()+4>>2]=A):(N[ke()>>2]=A,N[ke()+4>>2]=s)}function a(e){var t=e.toTimeString().match(/\(([A-Za-z ]+)\)$/);return t?t[1]:"GMT"}}();var t=Date.UTC(N[e+20>>2]+1900,N[e+16>>2],N[e+12>>2],N[e+8>>2],N[e+4>>2],N[e>>2],0),r=new Date(t);N[e+24>>2]=r.getUTCDay();var n=Date.UTC(r.getUTCFullYear(),0,1,0,0,0,0),i=(r.getTime()-n)/864e5|0;return N[e+28>>2]=i,r.getTime()/1e3|0}},De=function(){var e={a:ve};function t(e,t){var r=e.exports;o.asm=r,X()}if(V(),o.instantiateWasm)try{return o.instantiateWasm(e,t)}catch(e){return f("Module.instantiateWasm callback failed with error: "+e),!1}return function(){var r,n,i;try{i=function(){try{if(p)return new Uint8Array(p);var e=Be(re);if(e)return e;if(a)return a(re);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(e){Z(e)}}(),n=new WebAssembly.Module(i),r=new WebAssembly.Instance(n,e)}catch(e){var o=e.toString();throw f("failed to compile wasm module: "+o),(o.indexOf("imported Memory")>=0||o.indexOf("memory import")>=0)&&f("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),e}t(r)}(),o.asm}(),be=o.___wasm_call_ctors=De.v,Se=(o._zipstruct_stat=De.w,o._zipstruct_statS=De.x,o._zipstruct_stat_name=De.y,o._zipstruct_stat_index=De.z,o._zipstruct_stat_size=De.A,o._zipstruct_stat_mtime=De.B,o._zipstruct_error=De.C,o._zipstruct_errorS=De.D,o._zip_close=De.E,o._zip_dir_add=De.F,o._zip_discard=De.G,o._zip_error_init_with_code=De.H,o._zip_get_error=De.I,o._zip_file_get_error=De.J,o._zip_error_strerror=De.K,o._zip_fclose=De.L,o._zip_file_add=De.M,o._zip_file_get_external_attributes=De.N,o._zip_file_set_external_attributes=De.O,o._zip_file_set_mtime=De.P,o._zip_fopen=De.Q,o._zip_fopen_index=De.R,o._zip_fread=De.S,o._zip_get_name=De.T,o._zip_get_num_entries=De.U,o._zip_name_locate=De.V,o._zip_open=De.W,o._zip_open_from_source=De.X,o._zip_set_file_compression=De.Y,o._zip_source_buffer=De.Z,o._zip_source_buffer_create=De._,o._zip_source_close=De.$,o._zip_source_error=De.aa,o._zip_source_free=De.ba,o._zip_source_keep=De.ca,o._zip_source_open=De.da,o._zip_source_read=De.ea,o._zip_source_seek=De.fa,o._zip_source_set_mtime=De.ga,o._zip_source_tell=De.ha,o._zip_stat=De.ia,o._zip_stat_index=De.ja,o._zip_ext_count_symlinks=De.ka,o.___errno_location=De.la),ke=o.__get_tzname=De.ma,xe=o.__get_daylight=De.na,Fe=o.__get_timezone=De.oa,Me=o.stackSave=De.pa,Ne=o.stackRestore=De.qa,Re=o.stackAlloc=De.ra,Ke=o._malloc=De.sa;o._free=De.ta,o.dynCall_vi=De.ua;function Le(e){function t(){Qe||(Qe=!0,o.calledRun=!0,E||(!0,o.noFSInit||he.init.initialized||he.init(),Ae.init(),P(_),he.ignorePermissions=!1,P(O),o.onRuntimeInitialized&&o.onRuntimeInitialized(),function(){if(o.postRun)for("function"==typeof o.postRun&&(o.postRun=[o.postRun]);o.postRun.length;)e=o.postRun.shift(),j.unshift(e);var e;P(j)}()))}e=e||l,q>0||(!function(){if(o.preRun)for("function"==typeof o.preRun&&(o.preRun=[o.preRun]);o.preRun.length;)e=o.preRun.shift(),U.unshift(e);var e;P(U)}(),q>0||(o.setStatus?(o.setStatus("Running..."),setTimeout((function(){setTimeout((function(){o.setStatus("")}),1),t()}),1)):t()))}if(o.cwrap=function(e,t,r,n){var i=(r=r||[]).every((function(e){return"number"===e}));return"string"!==t&&i&&!n?m(e):function(){return y(e,t,r,arguments)}},o.getValue=function(e,t,r){switch("*"===(t=t||"i8").charAt(t.length-1)&&(t="i32"),t){case"i1":case"i8":return x[e>>0];case"i16":return M[e>>1];case"i32":case"i64":return N[e>>2];case"float":return R[e>>2];case"double":return K[e>>3];default:Z("invalid type for getValue: "+t)}return null},W=function e(){Qe||Le(),Qe||(W=e)},o.run=Le,o.preInit)for("function"==typeof o.preInit&&(o.preInit=[o.preInit]);o.preInit.length>0;)o.preInit.pop()();Le()},54920:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/parsers"}')},98261:e=>{"use strict";function t(e,r,n,i){this.message=e,this.expected=r,this.found=n,this.location=i,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t)}!function(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}(t,Error),t.buildMessage=function(e,t){var r={literal:function(e){return`"${i(e.text)}"`},class:function(e){var t,r="";for(t=0;t0){for(t=1,n=1;tC&&(C=f,E=[]),E.push(e))}function Q(e,r,n){return new t(t.buildMessage(e,r),e,r,n)}function v(){var t,r,n,o;return t=f,(r=D())!==i?(47===e.charCodeAt(f)?(n="/",f++):(n=i,B(A)),n!==i&&(o=D())!==i?(p=t,t=r={from:r,descriptor:o}):(f=t,t=i)):(f=t,t=i),t===i&&(t=f,(r=D())!==i&&(p=t,r=function(e){return{descriptor:e}}(r)),t=r),t}function D(){var t,r,n,o;return t=f,(r=b())!==i?(64===e.charCodeAt(f)?(n="@",f++):(n=i,B(a)),n!==i&&(o=function(){var t,r,n;t=f,r=[],h.test(e.charAt(f))?(n=e.charAt(f),f++):(n=i,B(g));if(n!==i)for(;n!==i;)r.push(n),h.test(e.charAt(f))?(n=e.charAt(f),f++):(n=i,B(g));else r=i;r!==i&&(p=t,r=c());return t=r}())!==i?(p=t,t=r={fullName:r,description:o}):(f=t,t=i)):(f=t,t=i),t===i&&(t=f,(r=b())!==i&&(p=t,r=function(e){return{fullName:e}}(r)),t=r),t}function b(){var t,r,n;return t=f,64===e.charCodeAt(f)?(r="@",f++):(r=i,B(a)),r!==i&&S()!==i?(47===e.charCodeAt(f)?(n="/",f++):(n=i,B(A)),n!==i&&S()!==i?(p=t,t=r=c()):(f=t,t=i)):(f=t,t=i),t===i&&(t=f,(r=S())!==i&&(p=t,r=c()),t=r),t}function S(){var t,r,n;if(t=f,r=[],u.test(e.charAt(f))?(n=e.charAt(f),f++):(n=i,B(l)),n!==i)for(;n!==i;)r.push(n),u.test(e.charAt(f))?(n=e.charAt(f),f++):(n=i,B(l));else r=i;return r!==i&&(p=t,r=c()),t=r}if((n=s())!==i&&f===e.length)return n;throw n!==i&&f{"use strict";function t(e,r,n,i){this.message=e,this.expected=r,this.found=n,this.location=i,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t)}!function(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}(t,Error),t.buildMessage=function(e,t){var r={literal:function(e){return'"'+i(e.text)+'"'},class:function(e){var t,r="";for(t=0;t0){for(t=1,n=1;t>",!1),d=$(">",!1),C=$("<<<",!1),E=$("<",!1),I=$("'",!1),m=$('"',!1),y=function(e){return{type:"text",text:e}},w=$("\\",!1),B={type:"any"},Q=/^[^']/,v=ee(["'"],!0,!1),D=function(e){return e.join("")},b=/^[^$"]/,S=ee(["$",'"'],!0,!1),k=$("$(",!1),x=$("${",!1),F=$(":-",!1),M=$("}",!1),N=$(":-}",!1),R=function(e){return{name:e}},K=$("$",!1),L=/^[a-zA-Z0-9_]/,T=ee([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),P=function(){return e.substring(z,q)},U=/^[@*?#a-zA-Z0-9_\-]/,_=ee(["@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),O=/^[(){}<>$|&; \t"']/,j=ee(["(",")","{","}","<",">","$","|","&",";"," ","\t",'"',"'"],!1,!1),Y=/^[<>&; \t"']/,G=ee(["<",">","&",";"," ","\t",'"',"'"],!1,!1),J=/^[ \t]/,H=ee([" ","\t"],!1,!1),q=0,z=0,W=[{line:1,column:1}],V=0,X=[],Z=0;if("startRule"in r){if(!(r.startRule in o))throw new Error("Can't start parsing from rule \""+r.startRule+'".');s=o[r.startRule]}function $(e,t){return{type:"literal",text:e,ignoreCase:t}}function ee(e,t,r){return{type:"class",parts:e,inverted:t,ignoreCase:r}}function te(t){var r,n=W[t];if(n)return n;for(r=t-1;!W[r];)r--;for(n={line:(n=W[r]).line,column:n.column};rV&&(V=q,X=[]),X.push(e))}function ie(e,r,n){return new t(t.buildMessage(e,r),e,r,n)}function oe(){var e,t;return e=q,(t=se())===i&&(t=null),t!==i&&(z=e,t=t||[]),e=t}function se(){var t,r,n;return t=q,(r=Ae())!==i?((n=function(){var t,r,n,o,s,a,c;t=q,r=[],n=Be();for(;n!==i;)r.push(n),n=Be();if(r!==i)if(59===e.charCodeAt(q)?(n=";",q++):(n=i,0===Z&&ne(A)),n!==i){for(o=[],s=Be();s!==i;)o.push(s),s=Be();if(o!==i)if((s=se())!==i){for(a=[],c=Be();c!==i;)a.push(c),c=Be();a!==i?(z=t,t=r=s):(q=t,t=i)}else q=t,t=i;else q=t,t=i}else q=t,t=i;else q=t,t=i;return t}())===i&&(n=null),n!==i?(z=t,t=r=[r].concat(n||[])):(q=t,t=i)):(q=t,t=i),t}function Ae(){var t,r,n,o,s;return t=q,(r=ae())!==i?((n=function(){var t,r,n,o,s,A,u;t=q,r=[],n=Be();for(;n!==i;)r.push(n),n=Be();if(r!==i)if((n=function(){var t;"&&"===e.substr(q,2)?(t="&&",q+=2):(t=i,0===Z&&ne(a));t===i&&("||"===e.substr(q,2)?(t="||",q+=2):(t=i,0===Z&&ne(c)));return t}())!==i){for(o=[],s=Be();s!==i;)o.push(s),s=Be();if(o!==i)if((s=Ae())!==i){for(A=[],u=Be();u!==i;)A.push(u),u=Be();A!==i?(z=t,t=r={type:n,line:s}):(q=t,t=i)}else q=t,t=i;else q=t,t=i}else q=t,t=i;else q=t,t=i;return t}())===i&&(n=null),n!==i?(z=t,o=r,t=r=(s=n)?{chain:o,then:s}:{chain:o}):(q=t,t=i)):(q=t,t=i),t}function ae(){var t,r,n,o,s;return t=q,(r=function(){var t,r,n,o,s,A,a,c,u,l,h;t=q,r=[],n=Be();for(;n!==i;)r.push(n),n=Be();if(r!==i)if(40===e.charCodeAt(q)?(n="(",q++):(n=i,0===Z&&ne(g)),n!==i){for(o=[],s=Be();s!==i;)o.push(s),s=Be();if(o!==i)if((s=se())!==i){for(A=[],a=Be();a!==i;)A.push(a),a=Be();if(A!==i)if(41===e.charCodeAt(q)?(a=")",q++):(a=i,0===Z&&ne(f)),a!==i){for(c=[],u=Be();u!==i;)c.push(u),u=Be();if(c!==i){for(u=[],l=le();l!==i;)u.push(l),l=le();if(u!==i){for(l=[],h=Be();h!==i;)l.push(h),h=Be();l!==i?(z=t,t=r={type:"subshell",subshell:s,args:u}):(q=t,t=i)}else q=t,t=i}else q=t,t=i}else q=t,t=i;else q=t,t=i}else q=t,t=i;else q=t,t=i}else q=t,t=i;else q=t,t=i;if(t===i){for(t=q,r=[],n=Be();n!==i;)r.push(n),n=Be();if(r!==i){for(n=[],o=ce();o!==i;)n.push(o),o=ce();if(n!==i){for(o=[],s=Be();s!==i;)o.push(s),s=Be();if(o!==i){if(s=[],(A=ue())!==i)for(;A!==i;)s.push(A),A=ue();else s=i;if(s!==i){for(A=[],a=Be();a!==i;)A.push(a),a=Be();A!==i?(z=t,r=function(e,t){return{type:"command",args:t,envs:e}}(n,s),t=r):(q=t,t=i)}else q=t,t=i}else q=t,t=i}else q=t,t=i}else q=t,t=i;if(t===i){for(t=q,r=[],n=Be();n!==i;)r.push(n),n=Be();if(r!==i){if(n=[],(o=ce())!==i)for(;o!==i;)n.push(o),o=ce();else n=i;if(n!==i){for(o=[],s=Be();s!==i;)o.push(s),s=Be();o!==i?(z=t,t=r={type:"envs",envs:n}):(q=t,t=i)}else q=t,t=i}else q=t,t=i}}return t}())!==i?((n=function(){var t,r,n,o,s,A,a;t=q,r=[],n=Be();for(;n!==i;)r.push(n),n=Be();if(r!==i)if((n=function(){var t;"|&"===e.substr(q,2)?(t="|&",q+=2):(t=i,0===Z&&ne(u));t===i&&(124===e.charCodeAt(q)?(t="|",q++):(t=i,0===Z&&ne(l)));return t}())!==i){for(o=[],s=Be();s!==i;)o.push(s),s=Be();if(o!==i)if((s=ae())!==i){for(A=[],a=Be();a!==i;)A.push(a),a=Be();A!==i?(z=t,t=r={type:n,chain:s}):(q=t,t=i)}else q=t,t=i;else q=t,t=i}else q=t,t=i;else q=t,t=i;return t}())===i&&(n=null),n!==i?(z=t,o=r,t=r=(s=n)?{...o,then:s}:o):(q=t,t=i)):(q=t,t=i),t}function ce(){var t,r,n,o,s,A;if(t=q,(r=Ie())!==i)if(61===e.charCodeAt(q)?(n="=",q++):(n=i,0===Z&&ne(h)),n!==i)if((o=ge())!==i){for(s=[],A=Be();A!==i;)s.push(A),A=Be();s!==i?(z=t,t=r={name:r,args:[o]}):(q=t,t=i)}else q=t,t=i;else q=t,t=i;else q=t,t=i;if(t===i)if(t=q,(r=Ie())!==i)if(61===e.charCodeAt(q)?(n="=",q++):(n=i,0===Z&&ne(h)),n!==i){for(o=[],s=Be();s!==i;)o.push(s),s=Be();o!==i?(z=t,t=r=function(e){return{name:e,args:[]}}(r)):(q=t,t=i)}else q=t,t=i;else q=t,t=i;return t}function ue(){var e,t,r;for(e=q,t=[],r=Be();r!==i;)t.push(r),r=Be();if(t!==i&&(r=le())!==i?(z=e,e=t=r):(q=e,e=i),e===i){for(e=q,t=[],r=Be();r!==i;)t.push(r),r=Be();t!==i&&(r=he())!==i?(z=e,e=t=r):(q=e,e=i)}return e}function le(){var t,r,n,o;for(t=q,r=[],n=Be();n!==i;)r.push(n),n=Be();return r!==i?(">>"===e.substr(q,2)?(n=">>",q+=2):(n=i,0===Z&&ne(p)),n===i&&(62===e.charCodeAt(q)?(n=">",q++):(n=i,0===Z&&ne(d)),n===i&&("<<<"===e.substr(q,3)?(n="<<<",q+=3):(n=i,0===Z&&ne(C)),n===i&&(60===e.charCodeAt(q)?(n="<",q++):(n=i,0===Z&&ne(E))))),n!==i&&(o=he())!==i?(z=t,t=r={type:"redirection",subtype:n,args:[o]}):(q=t,t=i)):(q=t,t=i),t}function he(){var e,t,r;for(e=q,t=[],r=Be();r!==i;)t.push(r),r=Be();return t!==i&&(r=ge())!==i?(z=e,e=t=r):(q=e,e=i),e}function ge(){var e,t,r,n;if(e=q,t=[],(r=fe())!==i)for(;r!==i;)t.push(r),r=fe();else t=i;return t!==i&&(z=e,n=t,t={type:"argument",segments:[].concat(...n)}),e=t}function fe(){var t,r;return t=q,(r=function(){var t,r,n,o;t=q,39===e.charCodeAt(q)?(r="'",q++):(r=i,0===Z&&ne(I));r!==i&&(n=function(){var t,r,n,o,s;t=q,r=[],n=q,92===e.charCodeAt(q)?(o="\\",q++):(o=i,0===Z&&ne(w));o!==i?(e.length>q?(s=e.charAt(q),q++):(s=i,0===Z&&ne(B)),s!==i?(z=n,n=o=s):(q=n,n=i)):(q=n,n=i);n===i&&(Q.test(e.charAt(q))?(n=e.charAt(q),q++):(n=i,0===Z&&ne(v)));for(;n!==i;)r.push(n),n=q,92===e.charCodeAt(q)?(o="\\",q++):(o=i,0===Z&&ne(w)),o!==i?(e.length>q?(s=e.charAt(q),q++):(s=i,0===Z&&ne(B)),s!==i?(z=n,n=o=s):(q=n,n=i)):(q=n,n=i),n===i&&(Q.test(e.charAt(q))?(n=e.charAt(q),q++):(n=i,0===Z&&ne(v)));r!==i&&(z=t,r=D(r));return t=r}())!==i?(39===e.charCodeAt(q)?(o="'",q++):(o=i,0===Z&&ne(I)),o!==i?(z=t,r=function(e){return[{type:"text",text:e}]}(n),t=r):(q=t,t=i)):(q=t,t=i);return t}())!==i&&(z=t,r=r),(t=r)===i&&(t=q,(r=function(){var t,r,n,o;t=q,34===e.charCodeAt(q)?(r='"',q++):(r=i,0===Z&&ne(m));if(r!==i){for(n=[],o=pe();o!==i;)n.push(o),o=pe();n!==i?(34===e.charCodeAt(q)?(o='"',q++):(o=i,0===Z&&ne(m)),o!==i?(z=t,t=r=n):(q=t,t=i)):(q=t,t=i)}else q=t,t=i;return t}())!==i&&(z=t,r=r),(t=r)===i&&(t=q,(r=function(){var e,t,r;if(e=q,t=[],(r=de())!==i)for(;r!==i;)t.push(r),r=de();else t=i;t!==i&&(z=e,t=t);return e=t}())!==i&&(z=t,r=r),t=r)),t}function pe(){var t,r,n;return t=q,(r=Ce())!==i&&(z=t,r={type:"shell",shell:r,quoted:!0}),(t=r)===i&&(t=q,(r=Ee())!==i&&(z=t,n=r,r={type:"variable",...n,quoted:!0}),(t=r)===i&&(t=q,(r=function(){var t,r,n,o,s;t=q,r=[],n=q,92===e.charCodeAt(q)?(o="\\",q++):(o=i,0===Z&&ne(w));o!==i?(e.length>q?(s=e.charAt(q),q++):(s=i,0===Z&&ne(B)),s!==i?(z=n,n=o=s):(q=n,n=i)):(q=n,n=i);n===i&&(b.test(e.charAt(q))?(n=e.charAt(q),q++):(n=i,0===Z&&ne(S)));if(n!==i)for(;n!==i;)r.push(n),n=q,92===e.charCodeAt(q)?(o="\\",q++):(o=i,0===Z&&ne(w)),o!==i?(e.length>q?(s=e.charAt(q),q++):(s=i,0===Z&&ne(B)),s!==i?(z=n,n=o=s):(q=n,n=i)):(q=n,n=i),n===i&&(b.test(e.charAt(q))?(n=e.charAt(q),q++):(n=i,0===Z&&ne(S)));else r=i;r!==i&&(z=t,r=D(r));return t=r}())!==i&&(z=t,r=y(r)),t=r)),t}function de(){var t,n,o;return t=q,(n=Ce())!==i&&(z=t,n={type:"shell",shell:n,quoted:!1}),(t=n)===i&&(t=q,(n=Ee())!==i&&(z=t,o=n,n={type:"variable",...o,quoted:!1}),(t=n)===i&&(t=q,(n=function(){var t,n;t=q,(n=function(){var t,r,n,o,s;t=q,r=[],n=q,o=q,Z++,s=we(),Z--,s===i?o=void 0:(q=o,o=i);o!==i?(e.length>q?(s=e.charAt(q),q++):(s=i,0===Z&&ne(B)),s!==i?(z=n,n=o=s):(q=n,n=i)):(q=n,n=i);if(n!==i)for(;n!==i;)r.push(n),n=q,o=q,Z++,s=we(),Z--,s===i?o=void 0:(q=o,o=i),o!==i?(e.length>q?(s=e.charAt(q),q++):(s=i,0===Z&&ne(B)),s!==i?(z=n,n=o=s):(q=n,n=i)):(q=n,n=i);else r=i;r!==i&&(z=t,r=D(r));return t=r}())!==i?(z=q,o=n,(r.isGlobPattern(o)?void 0:i)!==i?(z=t,t=n=n):(q=t,t=i)):(q=t,t=i);var o;return t}())!==i&&(z=t,n={type:"glob",pattern:n}),(t=n)===i&&(t=q,(n=function(){var t,r,n,o,s;t=q,r=[],n=q,92===e.charCodeAt(q)?(o="\\",q++):(o=i,0===Z&&ne(w));o!==i?(e.length>q?(s=e.charAt(q),q++):(s=i,0===Z&&ne(B)),s!==i?(z=n,n=o=s):(q=n,n=i)):(q=n,n=i);n===i&&(n=q,o=q,Z++,s=ye(),Z--,s===i?o=void 0:(q=o,o=i),o!==i?(e.length>q?(s=e.charAt(q),q++):(s=i,0===Z&&ne(B)),s!==i?(z=n,n=o=s):(q=n,n=i)):(q=n,n=i));if(n!==i)for(;n!==i;)r.push(n),n=q,92===e.charCodeAt(q)?(o="\\",q++):(o=i,0===Z&&ne(w)),o!==i?(e.length>q?(s=e.charAt(q),q++):(s=i,0===Z&&ne(B)),s!==i?(z=n,n=o=s):(q=n,n=i)):(q=n,n=i),n===i&&(n=q,o=q,Z++,s=ye(),Z--,s===i?o=void 0:(q=o,o=i),o!==i?(e.length>q?(s=e.charAt(q),q++):(s=i,0===Z&&ne(B)),s!==i?(z=n,n=o=s):(q=n,n=i)):(q=n,n=i));else r=i;r!==i&&(z=t,r=D(r));return t=r}())!==i&&(z=t,n=y(n)),t=n))),t}function Ce(){var t,r,n,o;return t=q,"$("===e.substr(q,2)?(r="$(",q+=2):(r=i,0===Z&&ne(k)),r!==i&&(n=se())!==i?(41===e.charCodeAt(q)?(o=")",q++):(o=i,0===Z&&ne(f)),o!==i?(z=t,t=r=n):(q=t,t=i)):(q=t,t=i),t}function Ee(){var t,r,n,o,s,A;return t=q,"${"===e.substr(q,2)?(r="${",q+=2):(r=i,0===Z&&ne(x)),r!==i&&(n=me())!==i?(":-"===e.substr(q,2)?(o=":-",q+=2):(o=i,0===Z&&ne(F)),o!==i&&(s=function(){var e,t,r,n,o;for(e=q,t=[],r=Be();r!==i;)t.push(r),r=Be();if(t!==i){if(r=[],(n=he())!==i)for(;n!==i;)r.push(n),n=he();else r=i;if(r!==i){for(n=[],o=Be();o!==i;)n.push(o),o=Be();n!==i?(z=e,e=t=r):(q=e,e=i)}else q=e,e=i}else q=e,e=i;return e}())!==i?(125===e.charCodeAt(q)?(A="}",q++):(A=i,0===Z&&ne(M)),A!==i?(z=t,t=r={name:n,defaultValue:s}):(q=t,t=i)):(q=t,t=i)):(q=t,t=i),t===i&&(t=q,"${"===e.substr(q,2)?(r="${",q+=2):(r=i,0===Z&&ne(x)),r!==i&&(n=me())!==i?(":-}"===e.substr(q,3)?(o=":-}",q+=3):(o=i,0===Z&&ne(N)),o!==i?(z=t,t=r=function(e){return{name:e,defaultValue:[]}}(n)):(q=t,t=i)):(q=t,t=i),t===i&&(t=q,"${"===e.substr(q,2)?(r="${",q+=2):(r=i,0===Z&&ne(x)),r!==i&&(n=me())!==i?(125===e.charCodeAt(q)?(o="}",q++):(o=i,0===Z&&ne(M)),o!==i?(z=t,t=r=R(n)):(q=t,t=i)):(q=t,t=i),t===i&&(t=q,36===e.charCodeAt(q)?(r="$",q++):(r=i,0===Z&&ne(K)),r!==i&&(n=me())!==i?(z=t,t=r=R(n)):(q=t,t=i)))),t}function Ie(){var t,r,n;if(t=q,r=[],L.test(e.charAt(q))?(n=e.charAt(q),q++):(n=i,0===Z&&ne(T)),n!==i)for(;n!==i;)r.push(n),L.test(e.charAt(q))?(n=e.charAt(q),q++):(n=i,0===Z&&ne(T));else r=i;return r!==i&&(z=t,r=P()),t=r}function me(){var t,r,n;if(t=q,r=[],U.test(e.charAt(q))?(n=e.charAt(q),q++):(n=i,0===Z&&ne(_)),n!==i)for(;n!==i;)r.push(n),U.test(e.charAt(q))?(n=e.charAt(q),q++):(n=i,0===Z&&ne(_));else r=i;return r!==i&&(z=t,r=P()),t=r}function ye(){var t;return O.test(e.charAt(q))?(t=e.charAt(q),q++):(t=i,0===Z&&ne(j)),t}function we(){var t;return Y.test(e.charAt(q))?(t=e.charAt(q),q++):(t=i,0===Z&&ne(G)),t}function Be(){var t,r;if(t=[],J.test(e.charAt(q))?(r=e.charAt(q),q++):(r=i,0===Z&&ne(H)),r!==i)for(;r!==i;)t.push(r),J.test(e.charAt(q))?(r=e.charAt(q),q++):(r=i,0===Z&&ne(H));else t=i;return t}if((n=s())!==i&&q===e.length)return n;throw n!==i&&q{"use strict";function t(e,r,n,i){this.message=e,this.expected=r,this.found=n,this.location=i,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t)}!function(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}(t,Error),t.buildMessage=function(e,t){var r={literal:function(e){return`"${i(e.text)}"`},class:function(e){var t,r="";for(t=0;t0){for(t=1,n=1;t'"%@`\-]/,E=oe(["\r","\n","\t"," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),I=/^[^\r\n\t ,\][{}:#"']/,m=oe(["\r","\n","\t"," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),y=function(){return ne().replace(/^ *| *$/g,"")},w=ie("--",!1),B=/^[a-zA-Z\/0-9]/,Q=oe([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),v=/^[^\r\n\t :,]/,D=oe(["\r","\n","\t"," ",":",","],!0,!1),b=ie("null",!1),S=ie("true",!1),k=ie("false",!1),x=se("string"),F=ie('"',!1),M=/^[^"\\\0-\x1F\x7F]/,N=oe(['"',"\\",["\0",""],""],!0,!1),R=ie('\\"',!1),K=ie("\\\\",!1),L=ie("\\/",!1),T=ie("\\b",!1),P=ie("\\f",!1),U=ie("\\n",!1),_=ie("\\r",!1),O=ie("\\t",!1),j=ie("\\u",!1),Y=/^[0-9a-fA-F]/,G=oe([["0","9"],["a","f"],["A","F"]],!1,!1),J=se("blank space"),H=/^[ \t]/,q=oe([" ","\t"],!1,!1),z=(se("white space"),oe([" ","\t","\n","\r"],!1,!1),ie("\r\n",!1)),W=ie("\n",!1),V=ie("\r",!1),X=0,Z=0,$=[{line:1,column:1}],ee=0,te=[],re=0;if("startRule"in r){if(!(r.startRule in o))throw new Error(`Can't start parsing from rule "${r.startRule}".`);s=o[r.startRule]}function ne(){return e.substring(Z,X)}function ie(e,t){return{type:"literal",text:e,ignoreCase:t}}function oe(e,t,r){return{type:"class",parts:e,inverted:t,ignoreCase:r}}function se(e){return{type:"other",description:e}}function Ae(t){var r,n=$[t];if(n)return n;for(r=t-1;!$[r];)r--;for(n={line:(n=$[r]).line,column:n.column};ree&&(ee=X,te=[]),te.push(e))}function ue(e,r,n){return new t(t.buildMessage(e,r),e,r,n)}function le(){return ge()}function he(){var t,r,n;return t=X,de()!==i?(45===e.charCodeAt(X)?(r="-",X++):(r=i,0===re&&ce(A)),r!==i&&De()!==i&&(n=pe())!==i?(Z=t,t=n):(X=t,t=i)):(X=t,t=i),t}function ge(){var e,t,r,n;for(e=X,t=[],r=fe();r!==i;)t.push(r),r=fe();return t!==i&&(Z=e,n=t,t=Object.assign({},...n)),e=t}function fe(){var t,r,n,o,s,A,f,p,d,C,E,I;if(t=X,(r=De())===i&&(r=null),r!==i){if(n=X,35===e.charCodeAt(X)?(o="#",X++):(o=i,0===re&&ce(a)),o!==i){if(s=[],A=X,f=X,re++,p=Se(),re--,p===i?f=void 0:(X=f,f=i),f!==i?(e.length>X?(p=e.charAt(X),X++):(p=i,0===re&&ce(c)),p!==i?A=f=[f,p]:(X=A,A=i)):(X=A,A=i),A!==i)for(;A!==i;)s.push(A),A=X,f=X,re++,p=Se(),re--,p===i?f=void 0:(X=f,f=i),f!==i?(e.length>X?(p=e.charAt(X),X++):(p=i,0===re&&ce(c)),p!==i?A=f=[f,p]:(X=A,A=i)):(X=A,A=i);else s=i;s!==i?n=o=[o,s]:(X=n,n=i)}else X=n,n=i;if(n===i&&(n=null),n!==i){if(o=[],(s=be())!==i)for(;s!==i;)o.push(s),s=be();else o=i;o!==i?(Z=t,t=r={}):(X=t,t=i)}else X=t,t=i}else X=t,t=i;if(t===i&&(t=X,(r=de())!==i&&(n=function(){var e;(e=Be())===i&&(e=me());return e}())!==i?((o=De())===i&&(o=null),o!==i?(58===e.charCodeAt(X)?(s=":",X++):(s=i,0===re&&ce(u)),s!==i?((A=De())===i&&(A=null),A!==i&&(f=pe())!==i?(Z=t,t=r=l(n,f)):(X=t,t=i)):(X=t,t=i)):(X=t,t=i)):(X=t,t=i),t===i&&(t=X,(r=de())!==i&&(n=Ie())!==i?((o=De())===i&&(o=null),o!==i?(58===e.charCodeAt(X)?(s=":",X++):(s=i,0===re&&ce(u)),s!==i?((A=De())===i&&(A=null),A!==i&&(f=pe())!==i?(Z=t,t=r=l(n,f)):(X=t,t=i)):(X=t,t=i)):(X=t,t=i)):(X=t,t=i),t===i))){if(t=X,(r=de())!==i)if((n=Ie())!==i)if((o=De())!==i)if((s=function(){var e;(e=we())===i&&(e=Be())===i&&(e=ye());return e}())!==i){if(A=[],(f=be())!==i)for(;f!==i;)A.push(f),f=be();else A=i;A!==i?(Z=t,t=r=l(n,s)):(X=t,t=i)}else X=t,t=i;else X=t,t=i;else X=t,t=i;else X=t,t=i;if(t===i)if(t=X,(r=de())!==i)if((n=Ie())!==i){if(o=[],s=X,(A=De())===i&&(A=null),A!==i?(44===e.charCodeAt(X)?(f=",",X++):(f=i,0===re&&ce(h)),f!==i?((p=De())===i&&(p=null),p!==i&&(d=Ie())!==i?(Z=s,s=A=g(0,d)):(X=s,s=i)):(X=s,s=i)):(X=s,s=i),s!==i)for(;s!==i;)o.push(s),s=X,(A=De())===i&&(A=null),A!==i?(44===e.charCodeAt(X)?(f=",",X++):(f=i,0===re&&ce(h)),f!==i?((p=De())===i&&(p=null),p!==i&&(d=Ie())!==i?(Z=s,s=A=g(0,d)):(X=s,s=i)):(X=s,s=i)):(X=s,s=i);else o=i;o!==i?((s=De())===i&&(s=null),s!==i?(58===e.charCodeAt(X)?(A=":",X++):(A=i,0===re&&ce(u)),A!==i?((f=De())===i&&(f=null),f!==i&&(p=pe())!==i?(Z=t,C=n,E=o,I=p,t=r=Object.assign({},...[C].concat(E).map(e=>({[e]:I})))):(X=t,t=i)):(X=t,t=i)):(X=t,t=i)):(X=t,t=i)}else X=t,t=i;else X=t,t=i}return t}function pe(){var t,r,n,o,s,a,c;if(t=X,r=X,re++,n=X,(o=Se())!==i&&(s=function(){var t,r,n;t=X,r=[],32===e.charCodeAt(X)?(n=" ",X++):(n=i,0===re&&ce(p));for(;n!==i;)r.push(n),32===e.charCodeAt(X)?(n=" ",X++):(n=i,0===re&&ce(p));r!==i?(Z=X,(n=(n=r.length===(xe+1)*ke)?void 0:i)!==i?t=r=[r,n]:(X=t,t=i)):(X=t,t=i);return t}())!==i?(45===e.charCodeAt(X)?(a="-",X++):(a=i,0===re&&ce(A)),a!==i&&(c=De())!==i?n=o=[o,s,a,c]:(X=n,n=i)):(X=n,n=i),re--,n!==i?(X=r,r=void 0):r=i,r!==i&&(n=be())!==i&&(o=Ce())!==i&&(s=function(){var e,t,r,n;for(e=X,t=[],r=he();r!==i;)t.push(r),r=he();return t!==i&&(Z=e,n=t,t=[].concat(...n)),e=t}())!==i&&(a=Ee())!==i?(Z=t,t=r=s):(X=t,t=i),t===i&&(t=X,(r=Se())!==i&&(n=Ce())!==i&&(o=ge())!==i&&(s=Ee())!==i?(Z=t,t=r=o):(X=t,t=i),t===i))if(t=X,(r=function(){var t;(t=we())===i&&(t=function(){var t,r;t=X,"true"===e.substr(X,4)?(r="true",X+=4):(r=i,0===re&&ce(S));r!==i&&(Z=t,r=!0);(t=r)===i&&(t=X,"false"===e.substr(X,5)?(r="false",X+=5):(r=i,0===re&&ce(k)),r!==i&&(Z=t,r=!1),t=r);return t}())===i&&(t=Be())===i&&(t=me());return t}())!==i){if(n=[],(o=be())!==i)for(;o!==i;)n.push(o),o=be();else n=i;n!==i?(Z=t,t=r=r):(X=t,t=i)}else X=t,t=i;return t}function de(){var t,r,n;for(re++,t=X,r=[],32===e.charCodeAt(X)?(n=" ",X++):(n=i,0===re&&ce(p));n!==i;)r.push(n),32===e.charCodeAt(X)?(n=" ",X++):(n=i,0===re&&ce(p));return r!==i?(Z=X,(n=(n=r.length===xe*ke)?void 0:i)!==i?t=r=[r,n]:(X=t,t=i)):(X=t,t=i),re--,t===i&&(r=i,0===re&&ce(f)),t}function Ce(){return Z=X,xe++,!0?void 0:i}function Ee(){return Z=X,xe--,!0?void 0:i}function Ie(){var e,t,r;if((e=Be())===i){if(e=X,t=[],(r=ye())!==i)for(;r!==i;)t.push(r),r=ye();else t=i;t!==i&&(Z=e,t=ne()),e=t}return e}function me(){var t,r,n,o,s,A;if(re++,t=X,C.test(e.charAt(X))?(r=e.charAt(X),X++):(r=i,0===re&&ce(E)),r!==i){for(n=[],o=X,(s=De())===i&&(s=null),s!==i?(I.test(e.charAt(X))?(A=e.charAt(X),X++):(A=i,0===re&&ce(m)),A!==i?o=s=[s,A]:(X=o,o=i)):(X=o,o=i);o!==i;)n.push(o),o=X,(s=De())===i&&(s=null),s!==i?(I.test(e.charAt(X))?(A=e.charAt(X),X++):(A=i,0===re&&ce(m)),A!==i?o=s=[s,A]:(X=o,o=i)):(X=o,o=i);n!==i?(Z=t,t=r=y()):(X=t,t=i)}else X=t,t=i;return re--,t===i&&(r=i,0===re&&ce(d)),t}function ye(){var t,r,n,o,s;if(t=X,"--"===e.substr(X,2)?(r="--",X+=2):(r=i,0===re&&ce(w)),r===i&&(r=null),r!==i)if(B.test(e.charAt(X))?(n=e.charAt(X),X++):(n=i,0===re&&ce(Q)),n!==i){for(o=[],v.test(e.charAt(X))?(s=e.charAt(X),X++):(s=i,0===re&&ce(D));s!==i;)o.push(s),v.test(e.charAt(X))?(s=e.charAt(X),X++):(s=i,0===re&&ce(D));o!==i?(Z=t,t=r=y()):(X=t,t=i)}else X=t,t=i;else X=t,t=i;return t}function we(){var t,r;return t=X,"null"===e.substr(X,4)?(r="null",X+=4):(r=i,0===re&&ce(b)),r!==i&&(Z=t,r=null),t=r}function Be(){var t,r,n,o;return re++,t=X,34===e.charCodeAt(X)?(r='"',X++):(r=i,0===re&&ce(F)),r!==i?(34===e.charCodeAt(X)?(n='"',X++):(n=i,0===re&&ce(F)),n!==i?(Z=t,t=r=""):(X=t,t=i)):(X=t,t=i),t===i&&(t=X,34===e.charCodeAt(X)?(r='"',X++):(r=i,0===re&&ce(F)),r!==i&&(n=function(){var e,t,r;if(e=X,t=[],(r=Qe())!==i)for(;r!==i;)t.push(r),r=Qe();else t=i;t!==i&&(Z=e,t=t.join(""));return e=t}())!==i?(34===e.charCodeAt(X)?(o='"',X++):(o=i,0===re&&ce(F)),o!==i?(Z=t,t=r=n):(X=t,t=i)):(X=t,t=i)),re--,t===i&&(r=i,0===re&&ce(x)),t}function Qe(){var t,r,n,o,s,A,a,c,u,l;return M.test(e.charAt(X))?(t=e.charAt(X),X++):(t=i,0===re&&ce(N)),t===i&&(t=X,'\\"'===e.substr(X,2)?(r='\\"',X+=2):(r=i,0===re&&ce(R)),r!==i&&(Z=t,r='"'),(t=r)===i&&(t=X,"\\\\"===e.substr(X,2)?(r="\\\\",X+=2):(r=i,0===re&&ce(K)),r!==i&&(Z=t,r="\\"),(t=r)===i&&(t=X,"\\/"===e.substr(X,2)?(r="\\/",X+=2):(r=i,0===re&&ce(L)),r!==i&&(Z=t,r="/"),(t=r)===i&&(t=X,"\\b"===e.substr(X,2)?(r="\\b",X+=2):(r=i,0===re&&ce(T)),r!==i&&(Z=t,r="\b"),(t=r)===i&&(t=X,"\\f"===e.substr(X,2)?(r="\\f",X+=2):(r=i,0===re&&ce(P)),r!==i&&(Z=t,r="\f"),(t=r)===i&&(t=X,"\\n"===e.substr(X,2)?(r="\\n",X+=2):(r=i,0===re&&ce(U)),r!==i&&(Z=t,r="\n"),(t=r)===i&&(t=X,"\\r"===e.substr(X,2)?(r="\\r",X+=2):(r=i,0===re&&ce(_)),r!==i&&(Z=t,r="\r"),(t=r)===i&&(t=X,"\\t"===e.substr(X,2)?(r="\\t",X+=2):(r=i,0===re&&ce(O)),r!==i&&(Z=t,r="\t"),(t=r)===i&&(t=X,"\\u"===e.substr(X,2)?(r="\\u",X+=2):(r=i,0===re&&ce(j)),r!==i&&(n=ve())!==i&&(o=ve())!==i&&(s=ve())!==i&&(A=ve())!==i?(Z=t,a=n,c=o,u=s,l=A,t=r=String.fromCharCode(parseInt(`0x${a}${c}${u}${l}`))):(X=t,t=i)))))))))),t}function ve(){var t;return Y.test(e.charAt(X))?(t=e.charAt(X),X++):(t=i,0===re&&ce(G)),t}function De(){var t,r;if(re++,t=[],H.test(e.charAt(X))?(r=e.charAt(X),X++):(r=i,0===re&&ce(q)),r!==i)for(;r!==i;)t.push(r),H.test(e.charAt(X))?(r=e.charAt(X),X++):(r=i,0===re&&ce(q));else t=i;return re--,t===i&&(r=i,0===re&&ce(J)),t}function be(){var e,t,r,n,o,s;if(e=X,(t=Se())!==i){for(r=[],n=X,(o=De())===i&&(o=null),o!==i&&(s=Se())!==i?n=o=[o,s]:(X=n,n=i);n!==i;)r.push(n),n=X,(o=De())===i&&(o=null),o!==i&&(s=Se())!==i?n=o=[o,s]:(X=n,n=i);r!==i?e=t=[t,r]:(X=e,e=i)}else X=e,e=i;return e}function Se(){var t;return"\r\n"===e.substr(X,2)?(t="\r\n",X+=2):(t=i,0===re&&ce(z)),t===i&&(10===e.charCodeAt(X)?(t="\n",X++):(t=i,0===re&&ce(W)),t===i&&(13===e.charCodeAt(X)?(t="\r",X++):(t=i,0===re&&ce(V)))),t}const ke=2;let xe=0;if((n=s())!==i&&X===e.length)return n;throw n!==i&&X{e.exports=r(78761).brotliDecompressSync(Buffer.from("WwDuV6Ns28PI3DYg/uLrSIMPc0EmAzb41arP4epBhaBeHxcUve6IAMoNqNSJv/VilaKqmphUxtgGup2LqmRVVQWZwgGhpZVZCHZZiFi4cyxoqyGzEDVbIkv7VoyKo0bcCil2zZrUz1M4e7hlKREybyT0IWML8W1HioZ3wXD9GJNcdb4j/MDThRfedu3ymTy+lCk0dLhT5PzufO1k008k1R50TqwZLJ7FX/AwSSQ9BdBx6wuhRJFmlaRkEzziiHd4hE//s6mdzmg9WGMtdnJchoe21PYl2qcPElEK+fN11vfy8yXrPIlkgp5Eu6wPh5TGlbRmJX7CYKIdYjRgr8kYDr6fis69ZXqYQHTNR4aMPtxk2WWBp6G6ep3+d/zzteHHUiJEXmniNVIqJE6pDIOlW+ksc7faKeKEZ9hMtf73eXnysrZVr65CJCjjTAIMADqWMxlcr//3+1n95+frDvtI3bUoNMlkc2BePkJiT1RW7CfNKZC6aEWkaAoT6T0mSI+PlbZ/i1LZrLL+q56eHtDbyOboMPStgdIjhv80U09XtbtRZT123U9he9rH4Tc4jaQXcEg4MlAwc9O6HWneocbNIzDA85hsHg8eZA4nHt9P0jbQAB8sWm9SJGjnulndRwNkM5e9vo5Kvng8lWRICtoc4LcI5yx4MSU81z7/eAVdksdR0rqRZGmlT1y9/RqoDi5+wMWt1ur51fTy4NlhhqBVUncn9g9wq0EJczAeSOCaaGX1BVLVF2m/ZXpigcmZhw1sN0dDmIAfYD9qzfjj4S+SxJnR46vqomkWsWhRyU0xtsQY4pKggccvUz0e0oWlN10/hrAELy8G3c3HHQPPi9JUehlSfvTD+fznx3vvlWpqcz/PzM7CEBYdcJPgX4p1QTRYiVK7mKn1fOzFXN3sEwAhibaUBKI5sftLvRMQoi0nVVuZ8eMbW8dDB6msxeObYYBBoQakwhtBfl3a0HD7kkWJs56PuzuEYTfmWdXTkkeWBD1GJOZnnKWleBNh5DAiKtqqsgUu8zTrJ7Y6S5rDLCHP/6ealq1Dai+eQOGPIribOwkrzVA+gJ3pf+9bVq6phHQMQXKEtii0ZSDvPeedxheZ7MzKqu0S6Fh0Y5Rqtavfve9nISurelgFYJYFYFYo7Y1wadraouv0DLXHWIvm/rX0lb4tt+dWZOYUgAKw9u39dWssiPl2996Mqosk9wbTmu6k73/n0joM9oQFo2DmMXKEMvH/3/fTLC2ClEBZ9jgfpSRIGWOTmP+YuxvflboMoAZRxAxBNtc0KevvPufe9/7/9QuqKoI9JEg5ytponIkTxdFHsQOumUiKZrKx/pf/KZXklCGLdBn3zu37SunvOkWkswCKOUx3dd/a9NYxAWpCDCjvmUe+xMz8f72l9m0j3st8WUCRBZBNQqTamf/HuX1mAQRJ0LTTGKnHmsVmEHFv3M98Ee+drnRHle40KrPqtFAozmGhCuc0QDDiZRbwXqIoZRZAdlYBVFeBkAGb6gYpaYatHi+SGsNWj7Mru1jNXhzjdsbtluoeR6k3+rMy9u9NNdu/uyAPIC8APAfoonOuJYfcpdTUwvvv7z/+v38x3KCwWJCnBSCeAEg3QpCG6YQlHUBe4skphI7RQZTDhcw7p1Ser3LKVcxFaVceV+fORenSXeGqdNG7rz2GbbAreCx6XgZbxfuB/ddstmjN4MYmzWiphsQojmiPhmKp8vz3F9O/587sgyZa8ITvRCEnHtgCUSSxRoIRptJyQmJte3dgBEr+ijAMZ5OGsRyPsVmB2cyAVw6Pbv7/04rp1Vr+3x1WmUIIMyBjhiASdsKQEEAIc4U1kpPWtwZw2z/9KcP3GXHX9oNeBbGNGCNSlJSsUS3q67sGczmuld3NoUKHIAH/Zn18m/T4P/kfpIVGI2SXQrJs7TNqHcqldimWks2hDlFzaDFiHyLMoQ9z6MMg39X1PXnZxw7d9fMbMCAgwJUMoirAIKoCAgyi1sBSrcrAwCBgLbf+ny9zb/L028/3iBEIBAKBQCBGIEawCQJBNi0QLVqUaFHi3Nz///PetY+Q/RyxxYJGBBoRMYWIEREReSUiIoVFiViUiECnMDymMLQj0s+59f+8b88V5vXzPWIFgiaTBjECgUAgEAjSIBCkWYEgKWIFYpKOGDH9TP9z/jeo0XslJm+3x4oKioBSVboFNRCwp5vb2uzPL4euzg68m19tKPKWwGPvbqT1hCARPFgQLS3SFm8RTdAg1vrI1+1GkDezC2nqMKhxsMIYJg+qPiyctaFkJHshUjd+bJfssJLn3Si7b0HI8ITmwEhUPZGHDD/WKCh1wfPljMei34oQRA5V4dx1MHK7rKPSGTefzuJ3hoWxzXTkil//50poszTPDAdnx9lMby4yRc8jy0HQ4ZmxrhvBcXUK/uEpIOz64mhqAiABYyt8ie3anK9Mdz9C5PpfYnSQgvuJKiWJsLph+TlAOruvtwz+7SQpCS8yh9sFMnh2FoX7DNKfBvaeaojGnxhca7XrnKUE8FtePe8j648Xk4dUPk7dAGbl99sH7l5DUA37UQ5Azu1Az9MTpW9JlqyhW+mHCEcWgztXy8cl98uFvWEe6nKo76jRW/8MUW+tlF0v4xexOp8Lwc+IhTpJVnlwKI06c8utJ2y/qE9F+yqz16xc/ilJao0F8/+WAMEfSXIzFCMCEP2V/CGMSRy+XQj4Nvz65rBz71S68ZKRzutXdGXBiP00hd0xYeP4r/KpcAJHBseMRwnpEm9bLwalYjgzthPmW4r+1M0L661d4k97KjSSX2ixBI5PsmzTx4aORTgbOJSYKxtWk9jOkrvrYfCdj4A5e4g5US2F71FOQVghaBurTa8CcpuKxYs+mg5WOIrU74fBimLoCMMUZDBWw6qycR1IFxlZ9T2Z15euTtAybv9E8UppaQS0QJvuhb9pHpuKjRYHHhkk1CCmtvdGT0vQhkN+ptlwRij2VDSMyJkeGEGVy/HSYrDQcyF4muwDwtPic/Ejz2Boy3ZmJZp8FBLa3UiVO/mdv9yIaWXffQ23YzYHDQx/kEZw5Y7MIeTilz9rKfRPD8C7FyGCPR7iYQ1g17PB3fpBHuXaEQGaiEoXfRiVCL7GKGCUnQ283Wuybx4zzz2HPNuZ2FUhtYjXj3ZOxj8RRc3mIEQfHsDvIFnUonSSvCo+aBmu4Oig1+PqrvhhdgQ7VwDiXR8WIk838FLfyaUZ3aEYCCbG8797YdPd1nSKNWDfwANu8lONFjNtLrUjiTdwycxiJPonuYEhtsEx9/3wnASjEpzh4dP4+Ed9g71lGL3yIenXhj8lkM6+Cdu9T5ecz1iBlAVZryTNe68rR4PRNHpHhv8/B8RE/vhH1XQSq5Bw2NuKOdvgIpIXEZ1eFIwZUDCdJBK9cx3rnh8hpzkMe2Odklh+UsU7MGhRWZqUHkVRNFuuZdsz1khBgKlODy3n5qXOYuLUpIniXjM7oBCTsgw1TKlCaQsET71DU9z9OXi5yHIstLRDHtiw1balodDMs+2Mh9UvjS9WaCaVqGtcWvMoiDw+1b3zPkkZB0VVoJ16zmpaFtPe+KMowMQ5GBYb9vG1bCpBgjr6LVkvOZu31qFizjyOxgEGbCb9VOnZizr3pKfZJ32q8Ck90i/DuJZIQP+pqYtUkviZBcA5rIxsYbCsq2lpxRIdPm6hilEoVWF0upx2ipy5FAIU6GqmL3AQocmyqOzIf5cbXPrs+9BO8s2Vc+jUXDOoXxXokMkVC629/yjjsfpYfzoHECc0tWRu5IyexcBDYel0a1RQ+eU1KKtGoxkJj1xgahx42gjjoviitwPo4dMAd1Q4hHckfjh3WL5fkIFr/sIMWbgOHsonQK11Ga6MtAV2BD0+svlooeT+0jMWZP/KeAwLjaCiQrNjk0WGG4Xui63yW+0Xfe0yZSGkO2tT0esSkfO3HjN3mdXSKf3qe/0mjs5/hdGKe4sKL0dksETkGTFpfmFO/qQ85i/PSO+g2SyoRN/B35HRs7MriqhUTNC9KYE1NcD+Zsuw7avdZkN8s/c9lOjvSKMXcwpr5Je9inWTBbfJclgMh8olJSK8LC0xepjKyFQ5gTrekFqYcu+8PFLCIEhpE4LEr9fHtS6iUB13gOBTsj7GGLpp9H3xaNNYQvmXDAtu8ykRpJOYT9I3VYgC+JzRX3V7fgvPYM85uBK14uaR/UoMQwtB9S4QMrcdoss7ORdC8A8IzcryPCFm34EMTr4OqlgQFP3ZCm0oWxGa0GEhjQqikqjsc715OQU77hyqdssFRKcVnBtxm8dmnlFrwFTBOuKzY5oTvMoBw1gJjZ6GBiF859KANXGhsuFT3nFqryYiJ865LLkgcWVhCsiaRGbmY9T2+F4iz1tTVRLZ6l6EsA8m6uKXMqkawiykBbCfYRBGJSo9QA12ntginloUlSD3WQZ9FTFh9+rWV/ERnhpeT8EbCHckDiL6iQn9+mbuxo9yyBCbWkxRjDRnemWsO8sySrwaLmDtHvawqjhbwtSV0HkLTgHoBRtX/zJ3SplLv85VwCzTZ1q6xAMw5FVEKPuIyerdI/KEnYiw4YU8g0U6FEsrOxa/DR9Hd25b682jceQ/rUFFwRedrnwyEtCN3BzpGvOAMcLCFK4gcL3ZXQ1oDHVV/YEc/Kz4P2nMgGAQF/jhtWgICwrdc89v5G0nrB+BRVOFWd88EHDlPbDZ+8UsAcQCRRVVEoQdbZ9bucls992MKhvWIPueAqiHUW27Xm311L3k/IHnBml3K9V+2K9oflufq2HiSfnjrWjLR1R7zv7szvBNZDy/v0D5bmqng7pOB0yzsYikTWuwE59/UdygZVdemYNOfqFqcuGCSYk56od5tFTqQBgTM5ZgOarwVwLEkqzMpZUmGQd/Slha+fCuiHsCQLajgndM9kE5YNz3HJF5WexaM5/Gooar7g+6M9jIDFWc2Se8pde7YtzzPocYE/XFO3geEdRDDAkCzHwLEbqqx8tU52eQFFi4UfQ87UxLBzHJVe1t7LTvi0YKrnjvBeyjwEbhEfvLq3aeXDKeVTE1n2d6j6sRwy4VTVZSwsra6qEpJKT5ef44scCWWs/zFlwU4QtKKQCEDzq/tccdSnd55NRLb+1YEIQj1Ms8hH6tO7z0TNZ2lh8sY+F6jOD5JSfSh8E7cjNvbVs9fUgkVrmSGKyr3J7idc3WHtyan3yUIChk5DqYp55ZAC83bFSvr1aZtRYp2Ln2yikbZUjrQTDHsyNG9iavx/d1NNvUjz3qrnUYMagYwgiAol6wTvhI2orCnLO5Aqf1iMky+61Nt3+uSI9NqDjiFoJP7u17C234/PwhoTpkHVvUYqeqEQiBB56aPZGY5sXrm1vmnPTJ960fwlCRPDQTgz1ccXtUQjDvbbq2oWsPD6BqYaShOshBPWbuoWCKcs80WRcMOrDWgBzzh0Eg9h0fAObSTlwHZLXHdTC7REv+7P3DAeC6lFfSH9Cj2etsUqI9Ays/7job6GZzs7ruC6nDqEstzG9WOwLCEsklfHYc6hAGBY92bXP2/lDnyJGJRRh+sZnE4vTqUcMwg+/k3sJjaF1t8csUhpD06IEpFP2pcrC6yXSnV2GjQv7AyCMuWJ6nApsMb9IWEsP8BjVDk/IYW1cFisvAkQJjVA/ZxJB11samjOExtAxzhEc6Q7cjhNWjX8rxWTg47BEkgsZYLZV53bRosddHE9W/VbR0KQMIUOt51S6z+MTL5nI8IxWb4HSLBnNbR79R7mP4RlWkt5tRLoEX5BzET8vGSqc8f4xCyEHm+zpqg7F+UHc9i2OqEFi0AiE4hrVF5VxkkKXwAVF5lOuX4dSBDo+qmIfxNCj/lnMGLjjQSwLN61llQH9xqpFXxmP9oDeOuSfbZYmHjwS/qdIFOV31m7va/XfhJPL9ZldaHjvV56WPq8plKrvsc9Oxu7yw9rL9FVAyfZHMCyJdMu2ntOe68r+lD6MMceb67JVmSGpwKZ1fmtaN1oaL6TYQ+3t4wJqNLMTVLbuNqtVIZrc4jZIqDLKcZCdugIW6rtNwcxNU2OEyMAvPrK269QcV5Vwrtr0HMr4hVW1iR+Al+rxTQC7qXeKzGFjpQxM7wtu4lWMQ7zzeqgeU/1g101i2Ko8Ls15R2UhBnxCvpcuUc8iuf64f1jSu3XUl41u/z2ZYqQYKz/K/5JHUqntxSp8qApyYbo50kMPAfwbo5Yvv+clupIusKNeIKB/HIv4icSa1j/OLbK1KACn8kaeW+ZS9sP81LFjq5atfOgsIRVTD2AoS2KYUDIBKl2sYNcwfgRCczwaiaNfglFHUXLPs23KlqZhEqX6sYdlFRGdHPqeI0X+OA11vbV23/s/+Ofh1vQfTGgKNNU09vWGwbUS/GwKzf6+jXkt49leCaWjekjQ9eH7t+C35Pnst3FtwQqF2vgXHpebiRCBlljo7c24byna/4M7MHlB+KccyYPWG+knPuHRIp/gegI4xR2fKjyhevB10++V98m6hP8XxuZuhNTLITP+M9zZYwGyfLP/Gh3j5yeJie62jbubjzzv5P7h9gaUdhCva+0ylR5PsYp0orv6sNu/5GPdi3iqMdB2102Y7pD0hOK8ArrEN2LgNApbZ9Xjn3QIbKzYVJGDL+qGGIoKbarDvywh4x5KvdjDT8JSH33QbhozUR7tNh41qO/GzG1nKpcn26A9tC3GaKybGcRw0JlvAbylrw8Csu6bPjfH1O3edOdZPYnUaXyDcXgFiIV+f7JEPlt3tTF4pCISzzGoFqoh6BxPioxoOltSpsqzOck4CBC8X6CUjZRbvuATxFvRfRr2uEQXEAPt+ZmkOnLYb1z6IYXK/ION1a67fL1AbHhZznSexlTXYBtsn3eVGM4N/u6qIKQ0mWhUctsERgc40Pz/QOc+NGfUncjRiIR/gBnkQzVEECx8tAjuXGergHlDX/rJkfqAhoRiZMctV4CAc9aK4kUNY8B+ESQRdrGt6iB+6yWLXf+8Hi83856v59eHoAX9AxPpVfVmmsHtTtz/MtBgf5h9mvRxcu/HlokBuqu2nSioC3q7FBFtE1BhQLmookkF1uu/I6RPA1byPJW3vKQAavJl1OjfqmqnOaRHwtqNawVpOnhD2z7o+5/ur/K5cWZQDxHgN/FD0L1PAoJzwksrplu9iwnxWjy7P2vSGYXqlmLvsW9u4FUrX6t3o64BYwt0E+TQr45NC849w3NnQn4e1DgP/tl+7s0zrE2Lnmidxe1mf/89M8Kju1FnQDj7fxAAjM6cG5l1QbRgMat3/Q54LRZqpmmhRmgvCxabwg+UNA9LC1tyD7PXa4emmSO+zdA+qyitDYXRg/UHGKL1WJzK7F4smmWV/UiBHcI6OYwHTGAZcy5izJ1WVvV1n2bXKl50ka7tkyhoLwr99mMXLcRbP4bXDq9Efk9kVe++toH59/cp547EsTiln/e3lOb0QcyOhhIJHeF3zPmO+6t3f/ldLgU8+MOw9oIgahWPnCiamsP/z39k9pQ8OgHtgEb5tCBKEOptNBKtgYzRjIbhsSH2bBdWlX6vuzo2qaHj6fPMhGhzgncVyH3d0zp5cYImDk2RwVJXq85cyN2AsGkomoYStWbGF9P6b4gDbnkwFCn8Gcz5D3aOGcbsYbVQtSt6m4vi1TCAXlVu0m/XY+q7VW0B9QCMGjCDaBIJxu13mjF8DKpcm6QA6Xfdr8kwKwjSgn7sBEfhw56Zak6mohFgfwmBznGhW3QSAcbtwPnG2P3W0mKb7tayl2IVbtC+mc+cO3GkmYQq/lMRdUgLGr/7PksrAbi3/xCGsAnGZ1dPe7/mjulwrkj0nq8G1AR69g/aUEeJJDe827xUmBLjm2fhnD4twO7vtuqhgrx2qgjyvbm/Xoms6quZD60LhIkHdO2zGR9DHRoYTL9sJ3J1np65GO++vIAc2Ia5nVzK9/B+V4KFQY4tlMn9Y/Xu9JbQq72+gj1UNqFiP4+lic0noC7F04xBao+3nGvG1Gtmr9nSuWTz064mBaCbtYvROKF6bpR+XpuNXrMjiUJCxCFtW683p0sQUYSYeNfhN82x0gmy+YpxB2mKLbmiyf964dyXJVuOPQe4q3u8U5cF/R6ClfMvQaXFROKioj7wdeGZ5x9qRrv0BPqLzqTY6wsloMUN+mA+CPHDR0TbEpze7DKDsnmzgr8MWBqrrglGHJQtIn3QaTmuWsvZpJJUZJw+Oub4ez5wUFThjoSxkIZSFQW0hVPfKnDqN2zfZCuBx5nmzd9iDxqjKEoaBeEDLE92BZECgKyYCS7BttfZb2Lc/ZvLTbkoVNM1vOl1GXe9m+fpzapJcf5ewUodLKmbwQo/RGrplzFd/OiBYzEPIoN4O1kAhoU2mYyTEGeyfrt4G1W07oTfDwGIuS4Vq/Zil6P7AGscFeKPrrCWmGIkThOQifa5DgpWnFmmnKhX4hlasneSI6G3Cd1PX8nmwJtbxHJ5RAR9b5a+NjFQny1lboPJQHvu/3rtDQfsOck0EvOku1QoEu1mgpoXxTtr72IMf0HB5fQDvZQAvk5ggIfg/MT38NYhINUafAMAw2YwHPd1woKc9FHgwHPC9RVBRl7h7EgndCOmgwd3DRodpuE4gtd0YwZygIrfD0fHdT+IZV2b57hV4F9W+bMyTJqFhklbqDI7WMNx7twHXhw2IEv5d1Ye8AayT4U8oO+5sHxPD9VFek4QYlPK+U0XnPWMXiyc8O9cvtCj27SuEnDvC8LvjwTMZkxEfBFVAAqqyCh8jgtBHJXlIf4nVXA0PpC99VZIG40viuJtbKz7A8801INtSAzwnq4EbhBqgXK7BCMVWRR/DcUDIOKhBMN8Lcu2u8fw6TbzayGkBz6RC8Gg1pq6OuYetRh4IA4O0f6eY9O3x/73iCoMrGTDBMoQ/ptC3N3gHbUXLYdH2+niwHC49hF50s5PQQwKLI44OC5chL1tDjAuqt/etS++eo6gVoWli3PZ1f++J/3WOXD0VwGa+BxKxD8IE80Xoevmkw9M5UOKI4qbO9W01+lRqEJFqjD5BeIIi0owHY7r1KRNvT4JC9E76gf2Ame1goaaB6VaaaL4E22vmd9xYuPNZwIuDOWDsrhhENh3uRt9stbu3BuE/mbiotzpvppcH2KRHqDPW3XCCHzV9wH8zcqcZzrsEYcNNoHgAv4lEDTbOUNyhfLNpOC6rYZ9qsZQ3fbNqEThVEPLcDB+h2A7JAx5MHc0ZQVC5cC+Pj43bKNybjltQcrNoSrtTeewTLfdP+dMHZGKXzSPt7Xq9CWokunqA0jYXwH9tY9DuXZvXZLiZj+sBnfc1LoPApfe/vBrOhESOwOKFMolJHWs6jIRYd1adeMypTQEQkocDOGFsTmy8Pv6jBeNsqlmWBmLUnf81jDrYyvuxZ3J0Hr7jk+dEqfSwYPbCTsW5RBCJkiEO0yJTLV8a7P3RP2bSLf5tanxFxljsxlV8svxORhL8A59OpbSpvJvbCwcHmDwzeD8fjcNq4sQm+gfyi+OL8W9vuDZ0kCs+kqFOxjsG2kWjDpzeWQ/YDvvYr+70D2IA6nqf1kp7fXtu1sLW94MHI60BfXdszsMKA/75LERa75/dv086GJcBgKcFeHd0Ti20ke9ADhgKgDMS2/X9saPEwF5z1vb55uThUADVe2nzdJqnOR5VzMQ17tZcfyE4BGlSlW7HDrW3waB6T9UYa4LWZd2MofNArI+eKeUuwzEFOKoZaG9Zjh6WqbbYWTXGWPLWVxJofBUBvD6A1waw2oPTY/b2YoOhWdiBEgQAlPTVzpAxEdilTpj996KHA/HizoUgDGC5XtLzz7MSYnKEgZqx5LuYaXvSgSsPKPWLO7o5mgicYeqvu1jIn0db7pxVpw4Edb3PbyncHWIQ0LDU2Q7GQg3vuMIpwUYp6TRNDYI2DdV7gHAi3nFsCLBVO2DkKcL6Gn21xdiT8vZinaFZ12ALAgBqet74yvXeSnxZbvmMkVbCS70Vk0OAwSEsRBazYDjyLXZ1JmBbpM83dqGPh3vf68bepl7UuuLqQ6PZTNCsFBofTb/+nlAGv06pXhd1sbPoXciNjaE0cEwH61DrwOK6+A4nIn259aoFFlELzSibYjZ5pLQWHk6nshf4/lW1F0Sbzm4aCcDJAr0atbRpL0tTPqWdKOLWGn9b3SLFOQQyvT5u1JG99gNVGTAHywEg4EC9yQJaAAHCehuED6VxVRtawm1zZiRWXTVHEM/WtKZpXggAt2CXC9WkrfDN0TtKUTfE8ubD+ZoEddGX1xknimUqi3tM4boyw2oXNvJhoY37eJEg67Q+TWGwbnsiRsZ6zVVv4CNN+A3xO2C6F4lpYMNwfMD7SwP/HWpf+8SGsBE5zgSbW/wTm3npBouboV8I35yigyERHKq8nhjWzwVzEeeECcI5XNOEphh5owC1zeSTWWXzDZ/kShNkXd3zuK4JrdRe1py3IK2r1KqrsepkpV2bGNhFA4ktJEp7obpcIK9tyk7KctKgQ7cd45BPlDX3/aOpqPJdR/9akmcb/gg24KFCDfdJ5WsqXAikVGJJ5c2nR6fcOuLMppkvf+gmmoW0Mvj5r72QCBpN+Q4WXc6HbB0YODbn3L5/wub69uBpxC1uTPqLyOGDbp6nlXbbgiFBArrdljAWK5cGN6nhTM4iX2KzYR0Y4RYX1giePjxhVHTYkOa6jW3+juHjfO3XbM7bJ9H27XI/UtNue4dIELhaH1ILY2wkC7Hh8TxjUMteHMQ7j/rE4pCmvneEQI7xN6uIOviLZaYWsVsFC8q8QTKIxRPDOoZNCRRf1hpi9luNqIj5hIELk6lHlmIvvBR/GuvZ0kqDMqIwd8lMlul+k4Q2xDi3ZHUFceMw6ZweC93l3jkh8UT53DzIAfGnq8gBCNeGRRcisUD9Haz1KUJ8eWFri0QSybi9tkskb9j0YUAiix6KbeqZHqr2AL/FoUY4QabmWOl97jJORi+frV7EmQQ3D1YsUYq5OSd+sCj46PsA1Bvpc23yvF1HGUZfiMQDKt5hXoYvjh9WqxqTMoEZZbwI6d8vgvjjwl1sZ9N7Va05TsC3IvbWwoMOAqvFrqcdEpQqiO7R3GenMpm0rekymlDa7qcmlf5S17yCnYXysUIztT2YpP130E/Frde+/cwqlQTKMlz1u3jt40xZjfj5ZjrnWd75nY1ZUGkU81+BH60AwMhRJgXfJHSsuDp8lTiufAI+m8xzf3r2DXWnhevYcO8ZDRZI11dcen+BwF8hpF43RIpT+E6ZVFV2dIyWje2FNTukHc4qjsaYf/1UMKF31Zh+TeGnItQsB39KpMD7GvgziXEHsqu4yNsp4YUkFYsoReNiY1PoGHWUmLTXejIPhD+DvMVgVvz96hzB6Nsm7azy/yETLKJiea6l1n/Q5E2mlFc4WrCqreeOPfrIpd/yd3zbsgIfaqbD32h2OdgE8Kriq3K+ntf4FTHNq182xIGcGNtfv3onCvmF1kKnFPMztsf9Ls2Wv/SsVUnfAbNapELlk92PnbuMrOfrx9C0afJwgwHhX+cTZ0ONQrJx0uGjP4E/Vnph+WQ1RDdXHe9hbuXJ9V4Gr67pMivx47h98Dn9chd5Uvf6AA6F00cwuTLQQ2HVEmPOdMBnmVZzy8DctNU2HLLSCaVx/jS9W4rO8w1atpWaH4VDbFkbKZOJspZo1C49/MYYhrbL1zb1QF02YfPMvVeYU1LMeM+1SmRfP3ZF1d8/IXjzUzPAk7yZbJhpbfsNnMN4gGOMBA0lCg5gJlXUfj8YWrxgmrOpJ5BAYLSWdi9GVo77KNqh293W3zeWf/2KxXT47snsMPz8HsBf8VkRvFui6mYwHvfnhPBxs7Fu0iLoWuStRrWxChIW1rhiJI/rMI9wnZCACTiXd3EYKfywr0R9ZTRnoZ9n+VL5TCzvgWawx9qAkS3FIVE1+YD35QSajKvs2Tr6do1yJP0MQMebBxFDf1/UWkAiIVuV9psax7orhe+FqmfTmQ9JtgnR0G3YOHj1B/X4OU1v3oy85DrKVbHSHyR9JJk2KgeaN+LYnJGmnbxBhQen8Aq0ltgSAyMvhmBajEowX2waB4OAxjPLderLf1Bu9Jn2PGmWqmgTR71eF0oB3rEV3E3cZk9T6PtjLNNhzMv+qkEPkp27KOBAhjtX67fHkWajUdUDFB56YWY7juzROFIXy6RZE29bARqXUoimj7zs093A22wCHRtyTpgbuaGckqHl1yi8kAK0t29QI4IoJTHYbhRufr+EytgiJj3n+uYnc2Gq3sySb15+J8Tx7LLHx8KSJIOtZFxEa/SrkYaN+gnv4xZLxK5bJCpD8fenM7kVbr/Xk8bhqr73h2RLS+idWERGLOKc0motp8hrMz1m3GUd4iirmQPRMjSMmnXMVWxb0+OCTMXxMbChta/JoUB9a/ZoL/TDFRhH6tcbwthk7pEoM5C/pFzyv8eU892zKu5KqSkzR+3UnR3dEFuU3BSsSuD1ZcPa+LjlKut7wRbFFvLxdq6OdGJYW5ZY1Wq1JtVShJ/5NmRiYKC8wbrqm3Y/vDEda0mUGhsoibybPh/R0ThUe+d7VcyP3IecdMuVE9sbVEktN7facVEke2cBXdvqGdaL2lZtZV74UZBHGnGUzXIhKoElFAGOxqT205fRJr8nxBXsRtyqOz4Zov97bNiOz6ZJnuLRb5CdkSs+92HIOSkmjTdf/Pw/fVv2Jtlb+VdCcKGLl5wdbGRklc29tmokS8Do2hDUAkbnQpEF9Q02kdBpvVyytBSOhHh0i/vYNKnjEyhws/STWIQNZJeie+8msyJAIxEi2zwmZHaiT1jfRPsvUbWHowL5T8Gabfr33/VAzk7iyQSN3pbolVbBAqAMhzVsTDS5mNBf4BWn+//Z0P8KwkCyM6X8Yy5Fe0whoLkwrgeG2WvsRRiHFFa6kFwpd3L+pY94OpYA1ZDMSCeuTLdXLA+9dEGcQ0ZLQyDVXpbMHjsy+69RbmujpKOMTxBkxqs/9CVCH4fvbMC/LSYKh/qroEBkPE+4xsiww2KYN86vjMxA2WqIlpJeKqY0l2ZyW3nFH/e1laWv4emYZ9bWl6SuMmnK7LCfFj2hbOlxdadwPXKX5sx8tGczQC6iR7VMzg5cbqQh+WTbb+VIcH/EBQgYBoqczWnDyiU2yeuHOx5pPVkez/OXsDlATN7BFzJ4bdx3mPdMq5E6w2EwInwzbFKKgVOfEmOgbvHsJ1/2PsejlnP/6dVeczq5brJubavoh9x5j8Gf9JDxRAsKfpKbIdm9eL1vvb0yLqt7h+hPtFsQLO+1UxvhPLufM3Pbn5pDYTy/9hs3N48Hg3cKi2vefyuMueJILlDd3DwA03ZVUNW4qRwgtQtgPxE9MCZHZ50s1Liyck6U++dYMn5umWXaybAup22EeUzHLh6Ps+CpOYdmERlc0YiXIy3JQTvOxcGg0ccqVc5leXRAdDYQaOS8C8DpWdT/8KOTlZEYW2NM/gH746xgSpubXIGInvTJxnvcSqRBeP4Y5EJ5i+OgRfecgwo2mLI0WJJJPELKYBjw2NiYC2lZIhAZXXPU+FgG+cacDGuJSHYpp94aSYKpBTePQQmbq9qwiKqfJP8nRJuYXHewvUtsTifC5YgfpL2NeSU1fMEOh2Q8fAynkTEfyZWegEDn+Chg2XVFMbsfbfKdWdZ7rgl3NtWp+KVJcQs9fBzcCNi2p5yuWWSMPoxsy6cjXHHhv1+ASBcU3ySK+9jE/RenYi3L/ivhrAeSISLVTw05qZpj3G3z6k3VmvtmsF9N/DIQlvZGWM5hxmFaO+WvGBoikr/uyoq3/KptFCbKbu5FqyIZU0SeWsWWbYlhkZtg+m22pNiW7mBrGttRqKm7Gcd0D+r0KW1W8pmC+kNYXgYyg29fYIpZkECh+uMvl34+MkP93S9icPt7bDnR4QgugPHKQAwx4eiamwWRAIFVB0RdSNQEiDtscpWkZDWaKDQq4Dubr01jWsmY209OSQEJomnTnE71xzuoyI3hTEba5sFwYIVRca/9/tECnkW/DKNte2P7JTOccqeE2It7dHGvWx6s1QNoZ5t9W1DrY2i0BHXrqBFRC0QD64MtcUtbAw4FQw9HeL2qENWsA1vc+kXt0rkv7HJxKhZPLjnJFLZqkAtC9hxmksaTXhnLVXlinzaR2dXonht6/l9DmygVa1Y4dhGw7ZX6IA6/o89DTrHTqOw6xDgb6/gEubr2BcXP/roGmWJIKZ+CoHMitFqBGI/mGyH1exxUkQqFgXM/XPFuoYZdfkYAyWAHKRkUe52uVBN5GoiHm2vYGEylgfsjv4TmY0qwm8+jnfabBzMHzzYH4cDeqOVWrkgGXlmxbO6qmOXgDd+xEHiLjvvwMdHyMlvTLk54U4Z5LyuRA01TLbua1t/pBLr3GA3e/Ki4AG9X69+Z3ZO1R9DrjyenwOQN6yd8T+MtC0i4LlMPfh8H7UUkBht8oYZH9oxmbCSO1Qy94dQHZmd5sh65ycZpiMptGEvThVyCFnPHpgHM6+So2RzGZLSaPYO9uEYTiREdTvg0xBnawf3Y3kZ7cXpq/obD83/5SQuTdGDqqqDKyL15ajQaCKah28zbcD2MUgElOtLZfJGTMMLVeLeDna6EeDVipCNbIvfU1i0vJMFeWrqIrsbKGie0IV9L94ADiXww0T6/ft27rkCAYPAgDY2FAmg8sPnRBnfx3FjCaYKI7290924cLweXh9AOeacck06AadBAirlbicvgqUZLtGayHRG839aDsTaed7iCEwhEQETWp7YPr5FrK1Vi66kjJadbayk5s5NXPpet67Z8qc+pmb+XV6o3HVHnPgx51ufpLzP21A37+/v/l9/y+34Btedem9j28SbpiJ4z/im0f77LaoBmQyfZu3CwxY+SbptFp0AM86v5TTnYLk7AK+sa7/TcVinVuFcxbdXdE9ToiYssLVzkRkC33zWjdOyIDS+wIzoGU/ADRQzgFH3mXcWEfwdFjWpmKOAKRHBNlyNxM5u5n73YEpgSwo3XO+o9uyYGlGSeUHgGng1LkCgb4RVKdgYDJxa3fuUj1ALSBsIQXh+HWj2wDaqlWIooMBRqQ1v1mddSWPrqCKJUE5TyWN6MgVATGJQboWqpLr0WCZI06wzMyFMlMyahoKu18SqM2nF10AQXZpiUtYSkcfy1PbLUgq2O4GBhs2uNTkCQjSWAUi+S8yC+C6a2e3oM58ADwG1TeeSvSs5S5EjWOKsHeeeQmBgQd42QMGOAIarbMddltqM6msjKKPHamYUwe5M81gU0p1EN9dpZSwP2KEW+YXGbM2vRf152fa5zP2DGJ2vboJgymFa4AcHaUhp7H7SNuVvbWAvfeTxiZ1u8BN85Mra3YKG/uTUS0m6YIXkz8yjRq8VjcyNsCsVWCfp7yRdH2li6XHc/GrfHPJQXnuN+R/441e/+k86gvxca1dy9V+96FurmF9/hw+MO4lnncfQZd02TZxSxUAskIEgGgejoyk1oT/NxWACzb+ZDcSlQhxx+CnvtXIKjgrUlXOV92PJ+6+dMdI3DA89B+S5HpvPoXZErfHhoOcenmuOxBsTGscxYiPWxrzy2QjYUdWLbejGoeOMhDjtW7Gzn/bqm3u9wI7oRZ1kdo3DcPnA+Dh9R8zWwiDuiMBxVIGhZppJoURyJ0T5xafpOqXF6SPrDJ22eMk1MvoIJ4aLjTtx/tARvOtZsrZx9knLJlct2y752fhE/7VuxxPY8bfzJcJt8uenTQJHDYYvvV8n6yTab/6kZSwVHgu3VL3ta/xld4J0QvEYJe1vLFdfgYVjNAqHtWiTIFQ4gRoD1xt4L/QoPOjfZn2etXNXe7STuOYGq1P/nutZWjhkNHyoMuaghRjA0cDUZzwxXI84hpM3P9ZCb4Rprh1QrvgjYafWwLaxw2D2MNH9BoLIkjEPC1tnqNVyWMiwWUXeEN0OOVp129C5lKRifCrp3xYAkRiH5/gofmcp9o1sHqCIOq51hhq1qTaOJq/MiLxDm/aiGWRSR5jjsXfmwv9uzwnDIXxd/8FlQUKxcTW8Dwn+qp14JpGewct99rzonaDIv1jiBOGpiG65nEdiKgd4eNCAz5KiG9tURTh4KIbG1dFdvCKY6Cb+sXhlMlL2oIPO7FdTw2Ly5n2fAfPcjAM7fH5Uc2d2Y/D80draJuxVA4S7PQuR9eVpfqssnDL2ZDYjKtC3J+u1miWf4Xckpunwhzc65Ngcft9O/iGbKaetKlyOtitmfCgjcJ0qRuuaV/7QOflTUQZe7OaOS9ifNT607i+9zbD41IsS72qlPpfZ77GSINrP83hmHwelTQkCWxlg2qy2pybEHKqyvHFRQZWv65jTITGZJEWPJ06Oy4+pGEZxlF5zOZA2mDQVrQSrjgRiQapmBVGbOxMCn8fKZ3G2y5WD9Pg7ArJrI+Gw7mh4aMOOt1eIoNTZWV6yrbeZfkTtKWYFGHAQXetzOZyMLMRdEeTo6xnK24UK0oyxZO/qwLPN/Rxv5PPCtNKasfNMHzbVIkGWN4GFca6u+1E2WbxJVbbRinwod+hklKjJCTo2j/eA8qY8MvC65cUh1WM6Xh1uPRJ4PLR1BRobJbQJFPJSgv9+47dSckSVJ5yBZ1VNsmzxSNwqj9kEftHs7ghhfL3+2ivdAc90whUFv28XNe6dXC9bK7E+B8M+zFrfHKLIr8ii69Li0IIgxwUTFRXmATR+QN/gNNF7CVkStTrsfR7Je0NcT7VKCXV6Z2q80zRegFuRqF6867RaOFiwuXY79hkigA5xI5zwxB29MhOVdwNX5dHUAf80BvDdzEOXwteKixp2LyqlubSjRnN7nP92sqs2N5qaBSVHtwbTmu0pVusKWX8ltJActhcfLXJiXPWQOXOZes0x7vOA6n4/dnX/AHVQV3S2Mr7m/b/XxhLXgBUwn9wkLSjgU9fP87s18RrN6NBvkBFpgYLkP1UDZ6DWHM1qPLmFNI8zxDdpUF8IfJsOXE+6v1iRdYijTfav+Brq0Endt+N6xF+b3era68O7B3q+LOZJH9gukaY8WbJKOhwS+IYDKmgGWPPEmnO3CNCjNr42jKbjSV4US9mpSEEf1dTy4ngu1hmxVWNFWPhu2MvCILZP3vbHN6IeK6PbNmXE7vs2r66PG4vUn2MfXOLCeSudkg2QY7yPDdkKwmNUAuqYbctDHpHSjGXhdCWPULUASh6yHafn9hLDy++E5/znxPRxtDVq41Hoarpa/Bgbcuq73xeVKms8crypjF0feMzkTpZ2Jsckc3hUaVnqOFz84sN2h7skGFL3mAHnmR3uskePkMkw06Fvc0W+CyZLU5e5TFP7/lZ9Qg//ZrcMn95C1x6zMgWbvvJracHDGTnIpmrOakUNCE7uya8DsPAV2ficRA2YF8IMmfsQlZoUE7UvjIcaJRGNI2ughCEN7O/lq+bwPjIUQKFdTcsx39LRyLBzk6Ow1xK1paq58sG060cbbz/ic84IVYtJaPkJXH1DZb5ztXxTjcZmGvx5U9gqSx2MWFRBOE/YhVH+rg0y+0dwai+UqqTQ6s++/8aFwOPRwEh6/IyjYZD1WCPeGai/G9LPJiU+eoVeZds92T/ZC9THxzgfK+SNXu5EAvF2cVf8xsteBFuEdhjXo9l3TwQv/2RUP1UrLDjHWtKCtwEpmPCcPlRUOHtbk3Nj9KgWu4G7EUUq3B5ptc4vtNJzeP7DhQNz1Hz4R2N6krXE4hTH2Y2xcD8lGPC0tKBZWRt+0IxbXl0mJsMB+sUXtoyy6XNT7S/96AJbA914d/p2yYlMHs/ePCiIYsuHA08AvgnLj8EQET298vg0VkbtbKxCDP4jeF+RbVYEZHEaVrZ14dBRt4mTlIQFZjeoNQQ+9sVJZVc7zLbxBBMsH+Zt2k3xma2FJlCn/nBbGcxb//Z239vrNrf5DPskeEDNmFZYttmvNW26huSrLh8oUZXDhiuYa83bAOoRq12oTEX/pdm06E3L0KNwUTLY8wVtmywbe59cyhtAAmZvtHXSd4PletTBEbQaYXBfLyRRHV8gmNtoXvYlDQv4ePea/ltaY6A/DeEtEsX3PW2GxP3hXi1eloRBTjouhYdIWLdjxeDoLXIxsaJ/zI12HKL+yyEwwDjOj7zLO5PBm7oMbwnBhjWOySdGjhMrG8laO73FiCutp5lVDIx6SjLc0Wzmmvc93rkGzlbJHS8A2T0HnH6/CjGd4jVzEc6NFrzMLDpcvUw26/ZWBR9Me9xa+MdOcOPS8GBAoVjwvX30F/VC3OvMWgu+msT1tNoeaXFrhX78wvkruL3HUZ//+mZMQWg3kfqmbsa4Gs/uCryZ7R3Qd29Xdlv9vnPmIi+AbCcgcqpax0QciX1frred/w+yON2bnQBuN5YEn2FebbD2y/qrdlX9Cn0LYGi7SQ6K14w7EgdcakdXbxs1j7K+VB23ZrnL9VfHqZg/FG0In0oXym0elP3ieKI8TwTyHF6G5tA45LrHIlC53A/4AysyjtbxgAiw3m9gdz3exoryzZD4XGL/MoXr1KSXVKaig4YjgmI4DMnwzzCqeAVM7CHjaQdDnofzcTE2rFWKSpcqEqbR0OGcJXzLvmajI1B7v78JCp+jhisSUkcU54FRPbCgOfQFqeH9bwafYaMdziBrEmJ6vvNU99Ec4tVVokK+QArSx2sx30TrYwiTMww1dUp/bqqkfcrJtpAhCHgC12t4i9RIl6JV+61GXPIalsbpHSZDrpQWBtHaT3UULtFotUJa0H4Tex+5pAK8P4H0K4H0J4EsGsKgwqankKNEufghcHgC50qEg9f4ZI9dKFIjzTqtO6FP3XzisG2IMm4EUyIeOHOuoYcugrr3Gj/PBeWd+M8Tvum9PdANdIt5M5a4474r0E8kLv3o/SIng+/wV+Mi/9u7KkUqoxxdB7PaPL+nV68v4aha1jXejb5/B/MimsSv5lb/ilcU8zXneKvRefPxxIQQ6vapqv5tIkWCHGbhugx0AxR3vn2d01MTDurcdOuLdYDHORzY8BxfphScwRRUt3iwOPgZQcKZ2QPW9MFB6v9DP9JaXElWZEjh/8UdydJCkkyJUEC6cuET1SbxsTRNcVRuqJ5yv/LMbO1R+kcz5exSoTkjGPWrwCfSDoPdUk5x6dnaSrr/3vSuvtnlQ4oV1ff9GRD4Owlo9rgwzT4bM/e4NYqbegJ+fzWd2hi7nPMEngQFMLIXqCUOq8PN1zz4+y7KEBAaVoUHKMokBdakA+nXGH4878hcumjSB+jOjt0/v7cNbZHJfFn98to7h2NuX5gufH4crUABmhK1q5uUnJ1381LrVn1fxjhrwlDpnVZw5wXNnrfdPJTivrPfpnhNJvWQFYnWoGJtd0qh9yqifL4Ini0BkmhdI/8yj10vD0PmwIXle6I8Lra/cLXLQpKaXk51oMvjXKNPV1wJXKImbzzyVqgjiLskHDC5gobkGRFdrAKOpBqS6aUBGoIlmSG0qFxHOJmEAFGrNeGa+CwTYcghwY0h8jGW9X+bJt5EqCHogQbWsHFcv8SQZsQyARN3DeeWiTUMBJdrG/z2uUmfFeLZUvaRj5NoABuKK0/isoE0lCmrN0mSQyGuG6S4aYBVrgDHWCI463OwyT70LlCQ5Ma3ba7Be2lkqQulzCrGTNccCXhMEzme2y/wVv8qH47TwUL+FGW3UqF3JWh8/YqoTjiO+cE/E+fhxk4ST/DGuKqFDghByIUw2PK5sKNBNBNk1K8C5qSuVxFWfSEWyDxrW4HjGi3c/HnRmnhW4alpMfUbmqQo8qpNfMNHbu+tTRjYO6R1rHkCkqjMrfXRArdYBbUnnp8rTuweI2ex0RkznQhZByK21U8uDbSaLPiHRnP/x+Ix6EBXCcwDtnXGbZc3x+XRH8VuU3Co6g1jMyCW7Fu/GZafPJ80Kw8JT37qtNkZgI3CrVJ06ikXpzWU60laUeaw98OpmrXh1gU9DzyxQTLIS4AbH/KLISPFMJUkKlzsegI+v740faLmPUUApT1M9/KhPMsVz4SoVUHJnU9nirh3Oqnpztpgaz9rEJ7kyYkf56V4njM4dGM6guHj2+4w5z9zv7GPJkPtMu9GuVRRextUaqLO3Wgr0c86N7CZ9sGkGTEYofe/Cng2Wt6mNo4ZNzFAY2eWN/ucHZoCrGgalAGb8/ksBt2bhH9Wous/kNzlFw8XEfIn4DMcAIbKcjnhDCzWFOvTe9vGbuFU58skRtjTUGLQKu5HyCj1Hekzg+FtnXzYp3ItHrSOC2GwFOJVACEPOhl7XNL2YwsmYE/YZrTX+tWzDNs3TEw6mrqg8DcnpauKP4KmydIk+95xy4zhKDOcvlwy0yOEywWfJ6go/3YxddwCKNU/3p94EIv1dJvWNSET+pG/SRZO+8TsNeOwoi1I0tQVY9EKCFzmrLLglm+seh7U7WvTmLf3N5wsyP5NR9hn9RIvvHOy0ERBbEt7fdf9c76w7ODGAp+3TcL6J/tN0AaZ+17deARWUmB6EKQSBJ3n/jH6YHfbu9H0srHxZ0H6Yf89M/j718Y1x2IzDB354D/1QrvKK3nzDC/8Bry/GrjbZ5v5TNJYfnfXAr1PUyUUubC/LxODNR0lQrFw2WvSN5cTI5D4IWpzPPIixzT6UyfNZY/MpTzwx6C6nsyLxOFqqwYf7NkwuYhWXJPHH48WN46t0kWJhbOgWEeozl0MgBAuyQpZ+nr5ri0scWHR5r8lQyvFF9zk31mnMRyRSoq2YtVrAj+cXP3exv8dTPWfq71sc70wWS2dwCxz4gc0Qszu42XmYwLneHEd/KKFcLtm78AC3B1hOBoEdJeN2Vi2ay9LQmBYhZ8ZO8ZX75c4cTsL2EJ5OE+Qdpvdcx2S6CMcKciZFTUcE2upsJZjbiI+z0rONhlZ4OJ7F5uNA5R+fg0YrXCGWgoCmd24OY9JyEU6D+Ilzi6RC9AtwUApzAxLHxOKVGsm9DRI/1+y0I4hU7xq/UHJnAele6o/1Te8ebz974RR532vnC+TD0rMh8vFvIIlyKFkydaFP1nsFPIx8pj93DRFFvvQWDCxs9A0HzthMEERi3PcGuMDpAiseHUgtTrZ1cLbYaDNEISznNj5EYS+sLtKZ40N7v5mYAU1TaxhlzGu4ZezXcC9RI+J6qrHPJqhSUtv39qWsPiIT5d5YzAQtIx/o9m3O7GrXyZs6lTq5e1rBo/sxGXMakxMlTULeyXHgB5loJoR0awqAEk8bhxtpIRUCVuY0dTQzZmcBmiIoq9E0oZlmKUvJZBZ4bKFJWKxtp93seRBzr3fwaYvacJz0KEumrd4N5JarSuHK4yZEnfKB7QM1kTiQLK8Fl3CsUDLQRkpblaFZjXR7IEYK1nPUw0KgIBnaFL0aGShexNjbYshZK/BY/Az+YXKMKZ8QyXTx9OiPswNW89eDWRQCGl7GGuMoqPRHVL1KFsXqgO/2bksCR5DlzHUPzjL10XZ/2fLy7bRor8wxSAMnbxUsIysGGukVa3kUHULsyzR1Kt6bVErL0+VZjR9LB6ZsMBELpaajw4SlGrU2lfI/IQN+QloMn0+5AH0VtUbMbpLiV862JEpFYxtoSzGL/Pne3FBpLPBpAQC6dDd6KX6zPd8rPp7LSTzHSDdBfQiiXeTak37Kn+WURFHs34Dz3T2oZblsBOj5mAHyqSOBpMwlRdT8gkHsftj2cCGKhn6ZzqBDVyt2+dRBI2XIGTDcSxl6io8Z1PtU4oQ3R9alyyOfzVlmQFuez4xnWT/j0ByfIQa3i0HOD+eG5lwxYKJQ2Qy15y4B+WbRei6lcqhTw5LLL3OgPygBXaphBGeJwdiftL5L6KUDQ1JJpHP06fYD93mnzvwGaKcvGq0iuTpW6fpsDz+GgivATs/ex+Re1h/iUjTLIkKtuSqkjDYW2htrzNjZcjphe1uUEWD3m4CPcTO1OvyZVwJO54mHLfLckYVIiE3CeWCsyQMfc1AzjBE8EsFjD43/LaOEDoZlFzCGPwYyTk90BKT/EMKonYGfH2IQ36MMIG6a8tvnRmm5S+8qJvJCZ84K7F6NTpJ+wva4g/j47db0Za0b/6GeI/Yy5Zsa/6w6RMzNF9UGU/6RMCGKJy61oUWtQP/Rz47CYP++IlwEzkbiPBNe99vsbpzi+xnftlUpLzk9xil2LQoMI4fxIJ0433WYbBJGNd9A2T5YQKIeIvX7ciq3OdIJ2rJSWfkwlULHHfQ1xF1mE/1TG+xhKm8AkpBCszqjIIa9FFOAiyXdZNdoj0H5xINqcU+vr6Yy9iAe+I0n04EB910SuOsGADAUAwy4hAE6N+DSDNCYITAaTUZPftXjmLvDIoDY9oZZza6ApAoAQw3FngzHfCeXAPU77pmGi1/C2B6x5mrxzaehI2mx/vok2u9ff5posmX8+cEFIkzxwjkKbUqOFjxzXJ/orv9JjrWdOoEodCJ7ABHRuufMXuTIccoPSRv88DtTu9e+Yjdjy4VJadUcld3IkmFm7lXm1xvZWYHWKTEo4Xi+omGa/E+ymj3m0o62MQ9MjPhQE90hs3AuVnV2DP5BdG1OThE07HBqEkty4xn57Tx/7GFgdR8YMnPcQwSdn1N72JxArtwS/54L3aKca63YfpV7Pc+PmLrOAgJHLWozWM0ALBeYHDhWdmgzqLYPiPfguVzU+QuBLzxtUasLIKjOMcqF4WcZlR1cFzVSMGKZwDMvZAKSL+5UnV04gjgGeP48scQpO+OgodkEkvjBlQqRTbFyfGhUqB/aBw9QcXw1DzvPwUnbqSH6mkPRlg7lmNgOAcox06Q5sQCuLQsvCmY6DDUYGcX+sTc4DUqs4bYlFpK6pglF75VTUwvnAY21WzhKRguXsfbgvP3VHf7q6gqjvfgB3eycejy/0YUtEiCEMakywhqP1tqlP2EBBLMgVe6SZlPlsMY+1v7UvDg4TTXP197M/lz3bmFpf7xit9DlJPvM3JGBBA60E2x/jHLOp1fwocqhbqc1dTx0jCm/THNO5WVO4fi/yI6TTn82DcOmPeNB7TYbLrj3Q2NBMQR0hwj5CoU+gtvqTgQrY/4/Ity6BkAFVFQ17d+scdhwFMawfXm+HmaPtwPaNCqabaUDxJCALClZICbLBjtrBWse8GdRTY+TtuOnw0oY4Qhw5bqcPlXTNk/zEJ2OelhnKtpw4zp3BpVy5ykypdevDF3J0hEppoeGLF6fzmHCHY0I4Pe4HmieAF2YdhvCr8rTzilSJ/GAYVJIcQsV951XdSBK2xO2SjUUz3QaXUmAmUSski9uDdxUqLUPUJWHwlhDC6rsecGi+Ml41TnUdthW8tR/e1tOXRxA1/sj4Xpn3ZXDxjOZ25mdqkc0MNZ+xLMdJcyheV4+GR48WpsbqSa4AMVcD2e38X3sVniBb9st7CfIWXmhZ7HOP7gxJYOSYBGaO7dQeiwCkdWCU7wW0GLdSuERszFW5cfV0sewHBf9pZVDLTlBjHfPETH9+gd9s8bRQ3/+QBQO/yIMVBL19f/Uzo6APflT9XQ9JfagvB0t1uokv98sH88fLE1+MzX4xoDplqHPN30jNk2/I2f1y6LuXcrebFxMrv7x9z3ktTgDtbl3vmh+nq/csmP00v2oKbhv6HqIW/34nC1tkU7BD2T+tb7YEeUOCjJ84BSAwr3szoWR7C8hDr4zBtDI3hulqOoyXWkOm3/nKz5eZDpyRk4bvMbjSTB+xQ6qLpI1FdFP1Q2VCmHeu+xlyZ8tld9+V8TDzODg++jTccO/dYzN+TlyBQkSiKNZUY97tm/rUCW3+B63upzhu7owIsVy1n2U/z0/8b0/v8/iIYhmmknno9QvfAxxtENOvwjXhMXEPx/WuG0pVLlJOKnO6pSabUrhSztFothwC7lcDQcbrZZBduXJ5+3LK1aTBLdYHrApV9iFI6Qh91056x92KP7ZoMEDkX8xwf0vgr+CnITSpA6O8r7cI9+KSCgp7AgA2RLvSaPqzuj33eFud2gsBdnjRJQL3Kz+gqYj02N0tCV3KPqXuKWZbgE2DjAA2FXniUEWTQpUJwEI0/cbMFVumw9IZXpHq0I6wReneSJHkbYxPijUcbWgF+j00bzlLwtAmk7p7mw7B7JA1cnq1uMk0PZh87KtRqiVcwRLlk6ezn+FLh+pPmTgGTfUAiqi1F19s08uH1+1YxzEt9WdjhIUIBHFPN7DWU1wgAQy6NjRG4d9UR+7IubBxqX6QMxF/IAfDi9FJvOQMZZE55RaHWtpin1Hteygewf5B6wCiBG6rMijZ1k48R5U0So/QAX78c4Px6JHqryL9e/TzRXP5HSDkrP+j4vRk2jHxbesLy9lskINLkwXNB77EK3E3isl/GSIxX4j16iUWES5nrPuETcd8EjLQ3h3HzpN7hcYRWltrEEo3FGqNLvgJcA+DLC4gx/NNRlla83GWfcQdRNSmwe+80kMGLDAJR7GKBpNrEjPW9VaDlc88nLyfok+anrT3jAjW0lePzXIYppojvERY8vRZ6dJzE9rGA4WZJYAjQEkTuGIKcL5+gVdjhJS6dxTrwgweG2AZ62c1xZqsQqrj9t1gbYih9Bm1f6tZ/YvLcgitcRnQ0lTEZ+HJS+FWjZkAm7My9/X1C9rm0Lt5JTwfR7F77R6f7lWJgkI0IPRT4iWZswasF3ueyfuLJc2tIASz24nKsohvt5j6LLPJnpBv1UTJtdDj5AzZul/ansF25W9Fww/x6nM7bG2hIcf8suv22QYK/hFIcLQrbtZkg5ZVyz+bWaSzwI1vb3jZWMFRdu4zCjcSZe5cJvFktYY4sRxPeDTL225O1yIEVDLxBp1s92K4IqoRTh5bxHI4MUoDImwscJcyBSBtBiDDx7uESfkidr4s1nw4iEVm8AzrqmW0VAfpSWiEst5vwekIXXO5DxsU5ZXvW0iygErFI6n0PRBHOl91IAKqQX0AcyEYta+1Hvcfq/ugJ5zLjLN7YTWZ5EbR0qXwjjFaAymcrOK3vfDpIbzMl8Wvbh9x6PtdDewd1+u0vi/oLYnALB7MCp7Rrns8Swa7CKp9TeYRoEp1RyRn9ulDhm9nIQHdAh8BFIWx7Rtsv9L6ilIZiqpNzzQMwFQbZ/BM2OLixinnKgtUpbVmmU0T0qFur2ZHYumy41nBkDRlikUxx9pdWE9LUQqj24VlhtoYvM/p0gfpMBYxJjDcSqK/BNBlb/2BQRUxvCn11QVizH9JS0Meuouo3G1k5BYPf5/FDh08gAU0xK0qXPogSEkwu2YE7GzMX/8iUL0zo129wBoHXYybxpRjmoZMysa5tzs0NsJ3IbdJZv6vWsbGFk+7RmXz1/6UkehcqiF04OVwdB7Bf9D8z0yEMCtGogre1/TG1Y4L0Yixcur7RQQ8up8Iasj82Rw66yia2yWj8YrnKydlk459aW5MHstPDM47EmU8fJEcwvfKQC5nHGmXwCwDfZXdUJ6NE+6XWgXs4CCh4nVQIdyUAjIffgfp2TzDLWzArnTloAP+dRBhoNs32NV9x+r/qqYWzI/gBndBkRtOZZnL11ung6X3fR85i1UaJtxtA68DNMfT5v8WTi3h2D3JpuAEcei8k5czjnf92mqPgTSk1EJpi3riQ6pWF1Eg9pNd9eTpl/Dl8RSiQLdYV1Z/u5kXcujyEwRGfct62nJ8HR9JTlxuPkKalyk8WLsN4h5EnPANFe4bUo15gxyXo7bF6eJLJpzOWTKBovDWK1QwE6UQVpbLFYYAcq3llyAsphZMWx28vkCd5h13JioCsgKXiwYGHFSwXbT8FB7renpmWGzp5NYlVvUs6St1CH8Vg/KkVAaqnUItAsLfhYK/Qzfl9aWSSEogCxv3BJBKeBKuEzfrBagrRTK3FfCQDV7t3gIVCHulAP9RPiuMmPGswMFiCRwTyJ/YieIWHbFGHvWCgVXaN9rkQi2pMqy7S7IGUaqIqTYAr7s3ZqfCTD8wmet7CW66LXysLF1u99KdUYB84ZstQesKBahcOV2YPiI/HGWxd0NqirpAijbxig79sHmBfMFJ5qZ5ehA35LSurkld16yvS17Csc5kkdyO2N53CWdv1W2x1dWnkVLoV/nHmsEg09NrwdlflGCXChKyaA+ULU5V4iT5ZJiwKFi2bC07jLCA9Igd93+lzPmGVDXi51z6Tsidlpz01PmldDOhetS117gReM8Q1ZPHIWGfNBsLWXyLQd7bv6FabIeYA8wBiuM61qbZSaCX3MGpjqcD8NhMg+7fA0ftAA9fvWXLRAV4vkPj81FQSXOCBcWUvJSEiw8KcjEPho4VT5UfzT+2bBNW7s99M784ocNreH9f3xa658rarne/7dhOJVW3TK25Xcz2Wafbz7O8Y2AiWCzLWwNBdwNH0i6obJ+yPt2q+rOBS+40AcYlvUWNN2Z/d6ZgzfodlcYIa8J61Mvl/5ASvL9BxHcqml9lK3oNrtxH4ugyiKqLxlGBHYF090tBhi5fRc5AID2xHR/XMd+HMU1XxJYvv6+zElndL2P6Vi+FRwT0+Gt/b/p4vhT/1zvplFdj8eBO3CbsA9SZsQL+ktsS/GjcuTQ5EHAGfsYpQY768Wx40anK1DeyPI0fmy87q/wQZwnE5bRdBQgxIXYWxzNrsip7woAMyJRKhDNrzRdRcHipr2qScjXxDgbhkh7KKxnVBVT+y+0gOtUT6LW0wzj5e0zhQjxG7IaXdDgvYILDsWjwLeV81KlNT52wRk2FjAjDLAOde39BS8toVPq1us7V7JFgFWbfkNm9XOqk+aeOC2vlqKkFaZO7EtIMCwl206TXaxcyIemDA8YUHERhO+5WZXkrCANJV+2LI4y9xh0h1phplcP5KjDNaL7N4tUVp3deeAe1RTD8yIvsnQ5wHAvDcmpi3gXgr5imkwHqdL3H2AXuEYP6ccLYX0mTRE8REFwEL0G4U147IlZZVGM7h6GcuvQaJ2C+hi+XucwxUXpfi+9IrYQXIjLuXKPWYWwJiMXK0/9kjJkpZHIIpMc+zgUpm8geWe4OArAkCBHYvvKS5oLRFn8xvyPaS+JeW1b7kG7rv7lV8RVGv35QRnGzfaG5pwk4PAu6N1wR2XVK7DkhrJIk6hGNrt0XyEPTi47otQ45wEwi6lstHtteAVcVdjFPT+oqRMnI/aprcYnS0yGvHZpToyrORzqquld4+J5wLc4CkUgBKt3vo9TlYNTH0bmHPLTRDGv/G0qMzat0rpNt3tmHxnMhHRdZDWcGmtY5VAORXWTyDg06YQr1bJq8ncxnT4+7Kdjndv9AJzkvn/lRyvcruFZFmPyIner91aT1IhRbBMV9gREA11M/UWmVHXpu8tzdcb0oTLN7nIPc+XB8nBwVP/rFFsviYFFLAGM+jJRE2qKV9tXeUk01b7SrTBdgzaplBP8ZnYNwIuJdluUdRZDeHV5QvCulMjGiEfxMRvd54GlBG7QWGvY6IrxFWEN7R9bDnFEudQqTRlsg73QsXOwGna+GiJ/36N/go/zFmx2mUw7SCtxrDZv0JEIma11dW4yMNogV8WQetAhKwJ3wBD4vqPw/ZszRWm5eJblRLZgqkAhQz+vy+I877Lfz6PeYUWK5E5Loo9ZLMda3vq3KrwIonR/19ITAc8qoR9rEesDYH34L/XxKoemAcrgILQWZIWHYwdbeDcFeJPFNpV6vZiEKCyfVs1qV+dwkma4rDGB/dqVWtHxm/lJBlWEqOx+9laVzYrM8iR6npc88uylwVwbglgN4kG7Mlq5VT3Id3IdhVCU9b5sJ6vzrlp8TTWZfFuPNDFdkqP5ZezcX+GxJGVNkSDbmK3+UAs9YFwwoVqNEshr27mh0JAq6z3IgkwVuBD7i3ao3606KpPdT27aFQSD0wzi0/WXcFfYMUG5NzDQQxr3pZfzwaHrXk8syVGeFuUhpF4ZYunxmXwYCuAKUAbnDYbq2xaw0EYS6o8GNnHdcJnjrHXEHMAAzxAH02Fm7Fz0ahCiyz0Fe8OrldbursfGRf2S5w43aj5Sx48Tz5XK8zzStUtIctmtdwiUM+st4j2GkcQosLIchX6CKpRUT9YNaG5u4Ac/MJhNjDMF0Ow07Jc+wTz2sAj1KTo0yBMpDWEJsmPdJzUMozNLmIwGE0yaBwZu4An2C2cf7LYBc2f+AngalMzTo9GdsXGXxU/fHA8JMUlQK/ZBGcW/4q/DZfmkoP/yinVLClz543PZMquXnXsytTgB7hd9NqlX5J7a+0u1hfhJLb2JK+7xm3F6TtyBcnTy+uBaF0in6W014NVRc/JeNBGmC/AnNp8vZzf55Gva8Qour30FX7ktCAwdWgf5VPwuEHoS8gPIIIikOs0hwzsF7CH+Zw94necXTrXS1LlNS7p5/2JHbuXcjQ3zw1DqXAFPqqj4M8rTz7X96IgbapoVsatZLpYzyUKCli0I+t6VEzfw2szl81qDB3TPvH1TT7a5E8QBYW0UzIIcRKk6i6WlS25SgQihdtzoY5mYBCv5FduZUlwxecFuhjY6ecvRcg7yzyYk3fX3c2Yq04FS0UiDCiFBW4eeJvt+7vO2gULaRawTZxGcgTrtcYsJKjtC7THhZ8XhFcsOiDjawbezZEdUFW248w3kLK4VW2vWy9A+9XE8BcIQBzwPWps11C0IJRhPi/5s8HmW+s22emuZ0rZfCHcUjNFBgtqiQ1YA4LRPhOeiJe4V3AiGEu4nX7LSyg4uhg4AV5lYSVeq41MubomiRHUFVc1jNa0iL/TisOlh76Itn38U19Wh3L/owsxue3FjcHF7qA+5fPh/nuVjth90oIJkQlBD/hkzuxa/uTNXmgOxozBAV9cAMJyqRrJaT2wXb2dnBI+zoXOZVXfecmrjPvsSzV2Q0urgM2qaY1cxRQ8c5TodMQD/8lGUqxaE5t6iUxMvsoKL8zPF/i8EUtTgznzdR3/pZ65+ryytwpQMzu9PakpLwxyTji+6Od9fOoIFQwLrQWAqSFO4zXXQHmrD8lf8R39u6XKtuSQJIi49W7ZlhnHcZM2lWKnHl5uKRzA96FMkMLr5ZE+jJpgWj2qHJ1zeZXp9ByMCIqpxkImwix4lu9aUqISBZ24EAbE6Jnd5OSZgej9RHO/835bVD0GtW/Dm6Q9FkoxMbjTnhOQMN5lO4NVQ5GOcHRVPioItdRg1Hj8XSA/U3s7h/36Pt4RNnMJBfq18cxN18jQ7xjX+7q7xdGX1fxtglAs2+PKubvFDiD7hP1mlEtfp9oFHiX0T19GxWx/jzXF5thzxsY7Pq2LjUbNTobjWi+rzfb2sMrXB2PC1jD8M8lO7pDjvQhaQeIGzkDe5JPf6E17DNGg5Fx6mgyLCCnjFEpp4TkSgrffvShV9eW0mXDrQNacG+O6CrCmCB0uZyFz2S0U1e9AILjJUID2LTjfsd67+HYlMyx8Ir4MYEz0fxMKQ4KLC9yaBs45cm8lY1czkQoKA3Ynz4zu+dyRs6R3Vpd4clfAIT4I8J4P7I/ENn3wIgI6hbnU4PsW7McMGqwFW/tyo2D0NB6KMNoISQqmA5slaIUlyDwEPdTYRG8W8BrLBbSKzmdejNhh7b+JKjd6NdlNskXnvbJZHDT8plw/r8hT87Ygx6bT1PVv2NOLNjuMg8GjWWclN4v3wtUCObV1r3CQPrSdAReX0K0WXKbZE4aFF4xMZFQoZasLWlD2JLE2qGbIC++TlhOybEDW8qQUj6QoAWsypaQPXE5o5QrAuQn9C7xrCzrt8pqn6vdwcl8Qc8EMerXiY0CAYp1mO3mNfhk6WVQxN8iCP42HGu0+aDkCiMSfkK9utdqwPe9TcCcUyy4IR8JprhhcnqEKOFZw2rnJsEp87Lm7YzBhkMzd3ZLl4GZzTig+TrHGvdSQq4h5HB/1XaDpTIQJNFhUl6GdXXD/hjzZf7T7EZ5d3AXAalXjucI5Q3cMGxaErOr7AfTwZS/PhHFqVTaRoasNHxPwex55F3MR/0I5gp6LmAXcjJbYRmcI+bj5lM0Oo+bPBWqMsqw09VPG11ATi3qhUqUH5yswO4sj0oa0Wnb/GNUC5/kU7cYAFGgkEjOBYgt7wIGlvCNYDAWLWeAgL0O2giCQ/ebotwomnSXjFHKzZ5Mn60QAim3gv7aCmOpXo1y1k5KdLHw4YCvAweXnsYFwjf/r45VLpfpLYXY2tLBplhObEnNuJxxuI1GakNcvcdunJa4UEIdqjWEuXpkmmiEXoDP1+aCxjJUtKV1IQdw0YfY3vKznUFA9YVstv7Ftictio22GsUJSBUbzAcSwhw4csZl/PJsPox4ARoGao/3XDwLCcp8AfIBfHxPXdBZA2b47dBzVoOAdayRMCwMPswlqsLA6sBa3S8C9tK5bRX5ZkJHr9tegwGLCcRgNwTjDQLfp1UefZYwMmjundBwprHojyYE2wLIVyQ2j/e4AAav6lrMi2FKQojnbWftDFIsJnQAmzw4CPeY50J8qNQs8tRxodyjhwkrYgJ0q5p5kLvmIgC3EBcYDqigEPffbnZOXnsYiq3WQT1tVFq4NybIv5sjfty5H0VfWtaxhqm8H9lU2VnXLHzPNdh0zIzYPj/IoLKTXS9lN9HCDSt51sHJ90Y+/+8VRQy9Sc5Gv9bFA39Zp0oGkhsScCskfCdLCo1rN4qSbYZavEXiyceKcS82r4Jd1XUvx6Kpt9DXW3OCg0XCe3kb179TC4Dnpl0x44QtzAFcM+A7LgeUQQFuvezDz6IP4Sdlc7y8GqCZczQQ10UGmMssjfEvjv/lH1XsTh9TeS4QJ+DnTGq+OS8mEEWOTarYbxOQmOHprQsvMZEaWe9sAq2et993qhZhAZvRBdZP9i09N8jnQRsyfQDcwI8uWVoh8FwVBinhcPQN9sq7EnZ+xVsPJb/RgbSfjg3szgJ93jSZ8p6EywPGb6RQThYFfKlZLnQC+YvJKwMOBDO3m91ekEVhQH2krdkjeILnPNz6eWACl+wTuUd/9fNZXp7uEJJtrHpLOkB+I1I6RImiQGEq7xOgn1tbvdZ4DMkNZj8nsSeS8Cpl4q6P9JDpHJNa+1ueiieKpEcYQIKe16VParknhK6iB5UBE/HC87lmUj/324qExYlTCtLeGjtCJUvTsmyC6sTFriYosxnK712JSBy7oY87tRtVT6wRSLwg9rUzB2Psctvz7yUXch1KyfdSCl9ekFA7jZBjyJKAIWJx7ezBzQFWW1vOHEPQH1KCIK6wsVc1Ul0BLwOoIPQ6aphNNewsml0rLYRjdbrFZHVp/DnGyjIupSQTyxXDgUTbfh5INrTi8Nn6Kd661n2MDw5PI0S5itY4Y3PS88mygwqIjubJmQ8Ar2V4NfqvdKCvCQ/OpOQKXu0wsQWTz4KZ46BjYda6Hb6J7FjWuPzVKWSai4KQqxnNsODXKhmyXjXeRAL5MOoU4RKJKR2RyK2Gegv3jm8gxiPVgXREbngVls2y/UozfTqAE25KIxaYobyoIdhc6gDJORIWXLhsTMzdFeBxwXmRnDkWNi2LmV/CppsFqrzwxOOxWE4RRmihFbfSd4W8Ty/eopdM2esiAMpBeEIgZCrLlso1fgfUPuMbmFABsaw8YYoEkEGARFVIcts0BcRJFXOtZoDEE8bPBUSwXeqVb8Vjzu5e8jYsP6f1o/CIoBMUyaslAorjF2wYUmyWMejlG8i1pXELclKZD3eufAyQkbAiJlP6j5H1ZtCVY/NyCZoDkW0xwtIEYHNRwgWJaREdcBWtpzT6UrpEVtpO4b1KhMfh7F5vF1ZM789NchCDyVzviSGMtJeWv5OFSGRXwpTG7lpK5VBY+ouA8+yAa1snjdCgpB8/j40ik0WSwKmOSV8URa0C4e8TJEfGNdKeBQyGQjIVcxoEKCeK1xcAVz69qDohdqY66s2UeaMqOOoXYQiGxoDfmWk28a0hqAuQ6UWkFaW4jjelAYISQQlzvXsPLYmjPlJfPt0yV+dKotW8Oh7btRFZ7UVl6tWl9S69aTeRfV5IUEtMOhymVfIp8ptdcpYMQNtlMXTW/8MANlosNb7wInaPD+lmiL/oEowK8fn7vc+mycIwZ7uy3dP7yMiuFyk7Pr15e7BJ2UHeatkuWVDGgwVFDKIMmbTGCcculBxE69Gh2idyzf/CzesS4tAeOmGAuGVVBxmuI4IqE/daGs/ZdOJmCKzC7R5ZEpBw5VazCgpXMLSLYl2mVBOt0azb2KVsi/MDqLfYbPUeSMOB9ILts9rvjlEfBl8MRRgdu76lB40YRIQJWYL5Z2b3VOTBt3C2j7WCHNjaKXSKkph40qmMCh3o6+1nWtZlloALEBa+J7Fqgynh/tjsi/oh175a/5iCfhjxMTeKHwdAP8YLCiDCaPTbU8ohbUlf1CYs/8jD/VBmi1De62+IgHiTjJWG14Z58rYEHZIsM5JwwyWO7h9gA3GTOf8Jj94N/9R9KDZk1FilDJ+K9oWVmsCoaY/yj9q6CBfwkTYGei9i4r4HgVSB5Wi21XAtCGtgjccGD+MQeYKvTuSibDbOhcFvkqxpy2cRX4wUoWA27yn/WC+dyfestfEyF/8SjOhYClBhhzgeOUP1yLIH9h6HQfZHgaGia8iQ8agrfpQHvIDEmIFA9W2Z8VSTURJFg/6ahSTx93yz08dHlUZIaP6Zbdk2B0KVhZbN0EoArBI4O6qPzDM4inr+Zj/jUyaMWQGzRESH+JTcslJhCfnLlfD0ExmnLyp9zvXhzTbolHYabfggUFnhp53CiQLtW7Mp0W+5jk4TRkl8T/x6JJdSBBiKFYvVzaZzW75teByoyUg8ho1370lIPLskxL77K21xfNfk7EDoX4j+Z59fm2wqcdWxOQUu0m4kkas7YHmV0TXl4J0GwF5T/6stT5z/q92w7+yZgzm5LU6SmP45f2VHTxhPY/bFM2gGLRpy1Qp8lOivOtxIgIfy8wCxjY6tdIVOXnIz4koOpmKKtaVZCo3gqBa1xr2HKEYQj5d4IaKhBooKJHci8GGfuDGkP/mgc+ucvVbNqA46NXOlqADYc/TXTke5Ut25GLDWtqKYw2fJLouF5ZiOJKPLjMcSOJ+iBmP3Tmlg8u19h5fHQUOmx/djO5fimj0W7km9C1OUvCDtdL0GnW34VcWlUPitow6coD01ioBDhtVj4Sav7SiI+XWMVOSOLg6S3RUIHZZ+jUnUtHEhud97op133tJqizO683Ar35W9xUrScfReM/lEIxN17JsHD4TEaPuxnyQXwTa4Bewt6wRmQvDCU4dNaB1lmsV7KNSeNcVi5t1ztYKGTmAKCy5QjYULD0+Zg/o5aXP+H1aS2Bz+YFQEUaDWjCNLPzEVKoa5SShFHmAdFI7EOPo6egNq9n98FS45NVbdB32F2tp4GaVoCr2hNlIqRPN0tXm63AyZLBQRhl1dQJLVe0ca/VGqWnfxbqOrTV1vHm32tpGosjS8SzsFCrUxWjMu6D/CJ4LQ6+MIhzJ6vL1aKY2uF9YJ5JRvg4MHAC2Rr/0tBhGNLR+AcVGt4spATEb4AC5pmAHEDeQoBEFkR8Z1waOVV78CUQ4lAIneUd9YiZsTaC6juECRrU86u7J6IYCjpPFJRBDOeIZhUS/BchIqjGOHaZhlCiWGMBBWRG5SyCFQpiJYjtettGwBuwqUq35CGkE90K01V6Zwar1bp2GBFNonezNGs6bJqEJFArLs4zWyFNXnvSL5G/xDyWqpzypr4jEmAwuUaxkRTllGd+gOybN3xKGbBFm6zV++YZ21Maj7nDGJJEIG/xIWGsOQgGmqbQipt/17HJQtTL2ck7K+B+Ta5N8YTqjilYCQNNP20pq6epeDXqkd1mVIfU5I6LfjL8pJ35042cigDDKE0YYwczz0tBxS/ifTy112TbQLn4OipxpzntZL3vhmy+RkPLonukvbcn6U4a9f2N8nGU13ju9KZnWLUp1XSLzfl2NPW8za3eMh2CKt9xIh9h/gMYW0/gOf0OP0P7fPn6sJXhwAhhDhP828uVZ2hA8iD/ZAUC7ioFr8W5QpQIGG2IsLWvjx66PX2XV7NqSElZOO6cUl7jtWrG4b81NXnAUrONjclpgDUjBHvtynjQTmYqBFB3Ne2yygtqJ5H1n279yQ/YriYnwP5rwiAnzBwd6mdhDexZ9b8ev097zKw41OZIRvZZR0k+B/QLV5RmxCUhy2UMV4aVxugUNR3LxOwMuJMk5m0t/IxcPaJdaaAxt161Xvp2cqvXneOQDcGI1bCBCQqQUOmW0alpXSbkqDbkrmcoK1GKUp7wRm08Hg+OCv9pU2CF/WEypgtjkMt+7SWAtjAhGy4uTRuBkAenRy9NKaaZQm6jZw+UUvVSFaLqMbwkcA1j3BaySkiqasJI4z1iza+ATZ+i2Txrd8gkAOAuGqONVL72f5NiFbevHpcS7oQ+vEApbqAtvFcALVzMCF/+c3knky1ijfI1h3IIEEM7COEyjoiD1HgJMLfQNUyczmqXhTj5GeCNQYct5RvI9qyYFR8mqMYgrN15ExAi9wjXB82x6i8opYGIO6D3iItszShdHkBqhYlkrbqeHBoIlFMgMm5AArTszRvVnZZkHhoPxi8RNK3HrN8zBy/caTqvEQhKucZGJ6UzoG/av+xwhgmBSfgYvKUdWeegQEiwLAuqwpbmYktkg/EJc+iIitf09Vpm+8w9qnmq5jdFVLPgVFqnvgbiZl8dT6YdJBlQ7gEib6vszLQFzLgipIRmOwhNFuzJ7I0e0AcX5x7pHygL6F2oYAdbaerbVLSnQMe2vyMhSo1VwBEStL3439/duKgPFfE6ctFChZ48QTeLHYRVo6FpYZj+LMs+WEs/OsyCk3fVqhEv9ApEvrgt76c+Kj13l0m1wTNYSo6iB9aokE1BVMNJoEORSXzDzZO/EPx7PAwYHK3cPlGsP7CfxM8HbQYhqpG+wm6Cq9AE2Lk271jEsLF3upCNO1eZdj97OsatMMI4LqvQymXHhvJiTfKUElajoNrSh3Hgh/1xjdCaM8cxcen0ObIiD+TcEFAkyaGUT0iyXv46PRpO2/XLmc8ziErTULyleIFtrUskvT/JsGTOWyw96aJlp7cR+wB3JA0kLuoVCeGyPF3vTVbaJOmASFFGKPILWKEja90+RZ8ZAvyuBrmTCg6j0+ov2dW484FnmGHJv4Vho8B2Txr5UfM8ky43Y96VN7sY1NX8SvzSo6VBp1aOziKuZHlxopyRsp9aWfTdv70mqz8iKAl/DawQBOG+ATKZhXgxdipJqTrr9+NtmENKmkhFhujftariL1I/Pw2BkInOp7sUBD0gOCH/ZTjjoWdW7bbmXalNV3huGNtSy2oONWnuDqNyfzQjUVTaseDHz77x+yuIqMNGiJ3ULx5Cb305Gl8bLPPZJcotgjCFUgQxE57ku+Qx7iTMlFFIJ5IjTw51QxsAizf5swC8tN4Gc9IqfQ0TZZGn4SILq4CuaLzXrumLgz+rHeJbga3Rno1BA/THhpzheYGN+mVDhaUYnG2XM3UVPmZ4uvqzK+P7Vh4PjuZnSvTo5gqXjuXV46eofD1I1+sjFaM1FnYxXmw4lq79Kor6J9TFnN/kAozRZGzdHP3k7XbjstoEbPMbAKyOugeXN/LjBzCDCI6rw4V/F5etbPIm31D6lKuKY9Pw5h/VqGAOnvOIqPXPKefF1XWw1DGaWwDls+1j7pW/agAWENu0/mEsK68Br7pup1b8oHD9MGwOe/3/FPdkPPC0Y3usQniZJm/mnqs6r06n2So0CJFoIAOqz43dGAzaRhhOF6/7LEccDlk1QtlzOkfA83j0PHa6JF6+fM70qrdzMmyoWFLtHw4sw6B9w5ehCwI4m2tTCY2ilCIcwkXv2d1RfRBzp3Lgk49hgoDrruvwGfLLBFua6xvdvSJFeAdZGbNJ1JU7qGi9RdGrQT2I0YymA4YYAqwR7RHfFA5VX6ix9W5/6A/Djdc0aK9TNKAlk+dEfYZBawslOiZsOtzOZsj6RXG9m+YWOlmzGm9tswl+PW/WOhDbva3EB7/pslijmeG2goCXLIjWKDP4/xNDTleXQK3qQIFZ9ZnF0JaluXUD34UuEvZzHk9JpG0AvkpteICB8aCz3r9PrSDChHF7aWcoXj9d1jf0SDiVXMfY3p/c9HOReRFvgx5CGTKKJ5AQECzChUjY9eqOWpqY2Pz50CYu7J9Z6HTQ0Urn8KMWzR3ffT/kEB6Kbvg2orXxdWRiODP7/rZz9lpau6sbwGdNWk15R7ZBOktt4lFOS+wRpxKDNdPKoHjWCaFe+bwPm/Y4biDimsdPBnGP/1XE3vgoIjWxLOmQtT+dcnJXPHLJV1PGKYaLIfCbyDTz4OAZQOiiG3qRY6xBv4zlggKeWgmMympPW42ocNuOgq8yueH4PowVpjLjipazmrbzjUb3RR+V6pzoExIL9gJZaxMqIWf1aK373dwIComkJuvXPs7PkRFNhUSWzYXDrNNCu7GdxrSN5AQPSkpd39r6607WPoS6hr4x0gPGpDnOpV8vKBvUa0K3Dcfk6rmHE1OZxyj58ObIG4zHIbMaHxcA2GBnr529sqbNIVZUw+tCi0XDpeOZAA+eGzVwB47np+Wc94A04ryd12yhPLlY8SfJOxWVPTrjJCg+YjQcEc4GYvZKcT6lsXHsZTrmXPrUsW1TijiK8YhBN5Utsa0FaYLUjO3jc31dm1h8et2Sjmu+jpP95GJ81GGFkX0nzrX6p9RDkBWLPQNyrmBchz0+TGE5Mimx10LOJGJCm3R8CDSNTGzJxcykpJbw+M5kxrQ2m0wCBqsDGX4eAYvN3GAusbiDnGQuxu7sPoAiuJgZ6QXxmf3mUXzp0cHHE1FJaA09cbumkeTGsVzgSLLAjybWG1legKgHWT0Xx2pREMK8JHumXWgvQsXVpDv/ihbLGzpafH0xl4aEwBMvnrwuXiGrp3kT5TvobNJHC7Vk0C9npiNZmc+8PdeapskItbhomptinDNT4YfLOeFZmPuB023rcK3WhUre6gPxuA257qvioRlFQ8TKBP4nDOMyvXspD7NwK2ItdEjokRg437vM2aeuUl5bshRYMu89iCh0yZzUKnPT3NOAJp7YGlgVP108Sf+/qTDcNP8g95dN0ObsQhC3yRT+5CZ3ffSzCM35qg6KKjcDxeXdONIuYEts3T3NYWH0hppQYNM2mSC0eoc/haiiD0vjIsd0bs4IN/YC1Nwo+Wy0QfiiOOgNQrVB6SwD3+q9Kald5I14OEktgpEdDYOWMpzoLeRKNRwCZLvzxxZT5xblMNHvYMQwzaZVt+JK3r2pPhJ8Entlc8eMpuxkMVAc9Zojm+kyA1U/jZOykTnt68hew9NiVaZTHEif44PslGnSi7QuWoZXFtCmGRcIxfa4CqMNQzIOMn6VmTjFYkcbuors8BDr3bB72pOvyMJLiC+08Pxeh+LpWAoFTdJfs392+teZnAR6hVLIG0EKGLkUn1i6g5F9qDXxm4s12s4yM3nviExMWjmBpvGx7GYT5NQiijxOFDNu+rZF8hhyTtj6xpMaEBHGEG5jHie3VRtgvxILAN02c+ZeEpdi595iXwI72qOavBk2J1bz7AutQVHNoq4Wx4jW4VwMcd0Tr/uXGlkavMtMP1CXofW0O/tce4/IC/XvEdfaYBdcfJEzdH0qDAbCyg71+PR2srCjkyyQnRPtduvR8NCNYQ1GwcKf12gGixMsLKI8vaWuuG+FMJi0Uzglq8Grc29wj1aJaI5KqTlMeWxmXPn+78Olj38fQFrTIkuR7Iq6AfTZ5Be8Lp3ZNXyhzoFYdefqJQKsCvigEP8gKtDnbplQCZShus/j5/xIgAvHG9pC0QaQcONR+gKJi0yl6fkPtl3oMmXs1s/dCZBBVQ92ZoAr3FlNimJGfEbngHrRMaR+0lKckR6Bx9/+OEDqar1y8VUYXNDQd0Ux2dAHWo1+2IxVyBFE7MDryTXqp+sGbezZ66/CZx+b9brlb8vrWmvFUZxJXYYrszxf9FLhxKgVHFFEAJJ9l+8MhlLa7+SFfJw8vlpGqFoDGU8hVt2SVwOce97QgDdJA7x1dxh4Vj29Hg/GPeT6lvymPFiIyFuz6aDd5sFCxhcAssoc66dpEMGmRVTlvgbc8XJFQDOhUfoF/4Nn3g8gaUBSnN9Ck7imjduwIeZPFqcwnZUV85MY3TDaWRRwjEbcwpqYeBXsylBSRTYvy9fz2aEBMojrrIrjBFrkBUctySggjkWah3YNqtz+S6AH991muhTPe5qewcgijSxg6p+o9EX09Q3DIe9t/tb/VotLnSp0+B/7yQJE/hTWjWGPL2+byBncqB3pKI8veHAbf/n5+CqgZDQxZZIJptXk2TVZvPuefFEzf3pwaVdnrvh2iApqcBEBK+sMxHUAs1nG1Eil3y5Jcgi4ODck17tg2ffpMrVSkNKQa89rmEvMMlam9qXPkC4w1QyJMOiMkH5iXrfNqXXXQzZw2H7KW6iIOF979JX69uk4Gb31Zg4nI9iJnmatFO2qc9E/ym2qzSmo5nXa64FxcXx9Cqni4iGZXZOh6z0c8fdHrk4umpCb4w1odN/25NrFPdIGh3UGqEzPexNXHndBODMJuNGYH7kH9ASdA8O/CJ24OAG9D0vXQdNa89oLtCkz2lmxNUS3SXPUdrj4SYghrZfzgjeq7VTEmzzUBTQp4KXbKFc7ZctpzYuENcVo6hoTmLx7LVki1qaKltYL3J5bZYS72XGLKaCgYBDS0ElFP7rfEemUZxRHvKah+Uwa0C0z846Ui4zayHPA/dLPp2XbYxzxkVabvh+yr2wcIsQvqmX3NvVSTemnrZBJ/bx7F4PX15K068d/WycEWL9sIs/14DPUOHCJ4z8YSOZ/hLrYzufTJy5iab8vWc9ZBOTsS/zBMj2RTPLXbU+P1vil7bO490Cdk3/yLgedwMdZFOUtrg2ZmfdJK0cOcVp/L2eYXVkKknnog2s6XzhaZ19FKNALXAUSpFh8mW99OmFVIqS7QLeffnA6mbaekutG4HNzGIIrS2cqYMo1RdRt9gp27LJimsRlv8X9fWkLMtAN2OqLMpf9XKCBWFE2XXiBDn+bpKrj3XYY521RpvEMECVMckQ142f/8nn0MxzKsAoRwPisYfHuAB0XkPOuTqdAvTFh4nMiqNZ1iJ+to92tVarnf2uqVCKZ6XMz0VgUBi38ezqz6y3BYhwkS7/d96aqFJjLdwMVsMkm+GVwlLqY9Z6VQkcKAPKvCrjzxxXqlfLBOtDz1n9anttBFr9lnn3UyrK2QsuScFgGKAPXYxWHzy7G53W18ehmgqGx+IMnXtpSmfea7Wa+0LzDzB9Sw4mvgpGab1AzgYCb+9v4SvL/6ydj0/kzIZe/lX4Cbc+s3PKIykZtj+RtaqapvPSkIuTUji+lSSjQINacagB1qtVyO3VCKHkpuEKhksd9wtEx3UkK+nCt3ry87wFN+zNXOjPLP38gjZHD4N3W9gNar0Aj69Kv+dkNbZ17HEcAjFNAHOwQL5wNlPJttnw31V2huZoLhjTuJ7TRsQWraCs5AJa5YQmz0qmlW4UtuUiOjs41Z347K7cNjgUvqH7VRe708LfaSEbLcg1zUsT30e0bhyU0y6NnYyqgWwxJWjd7NHvELMoyoZJLzo6S+VyVEKlM06OGOnkMyUKmImuM9jIdmI6tB108UYqrUByPcQM/fJUqaqURUbQ7n/fhBqd6kWb6wDNrIYJMTs3mZnEMi2myRTFCoLN3IrdXD/enYBVgbTOQyYk2PbCA85aYa5pCwIuecp2vp7M2ylNIUzS51HUJyowMOmZR6mWIz9oIWvDjvRo3rUVkEFdaK8yFmOQA+bbDFVeNkuOAXx8q7zFNflRfWs1GVkuqhijJbUxx0wS0inEzGZMT4c9aMO1NYcfLTKoB2kJiJby1mxiCW3ITHerwYnfJy9OSnSKx4GJalGATH5fMwnMVm7VsOBGr/eJiEUZpwA8fZB1uVWv0X5U1uPNkekwdo5mqx4ZW9b2sligs6am9SixSTJBGBSaN9yTNVQAeM3y3Dr9vRD4X2T4E795xqGHlTRbCWmludTF8Sq2nHQ6AjLQT57e71vKPV+O9cz5a534JuDsurgn24UVSqK0vXcllbD/Zy3T2Zx8Cilqd/lC5pcTZHnNXFBrvBju6faStsDcnn3ntWgtblS6DMqk6aQ/XHaWk/jIl89BT3nLuNefhZ+1ewMf4A6FtFQmI5eVgydw7cTdg76sgFq4z2IM/waP8KvB/ugKIkc40a8mFyCmiQFTBq4jjvMCL1DjgZy8ee1UDy6APfdx2kpTfZtl342wo/iuE8U7A1H3IPHG0COxv9w1FPYN+LOR/3/BBAITNTPElsNC2Brh6TbqSg0dyn7SXFLiKa4OLJMw8OX2/xgj50NIsZzLrcNxJWK7QvYYo+ldTA5rcnnPSL7GV3hNUqTJQsIzExRRkDGSyGqoPU66ykthqob9AEiN4l4wB2iOX7VNztqjdvuHitUONZI9mD3jCVoeihzN+2q3smKi57BCdTWnkWcbyswqo4f6In6T1l09Frh0Jix1EwpJnHl9XMBwzdu/HG4JyMFVbJaH/QRs+fyoHmO4OHTcishw2MoVqAeSn4FM7/s1ct9EiJpdml0lOT+lWMPc2vEb2xc0lpbk1SrYnBaVUv1YBoq2cCJy+CmDEv3CHhdN4w9yjfJjVMkdbh8Mxw/Joq9vh+z09nZPS8XVIw8uYqzvpleza7uMXuCCCECxkOBk5pbbbSuBCtRD0bFpa0JXOhfMsOuHJD1w3zrDicrmlPOWig9ZC0OS3+H/7E1ZXWOYOMuSzRnD32PWjvFZOUz01NNfvGkKYuSzXmo6SdNfJDYLMCRjiF9Wz/f0FheIccvwiBGiIQv51923OIe7QowOQHyzDUPm5z+d/1LggpRxsVWGtuQFswk98cDbg0jlD3q+dpcbo7SIilMtKgxGhYDHjFKCxO3Q5RsdEckoOZPOYVxR0OL4PJrgeZufPioH3RVGfAW6YDxvMPkuKg9yR5dPjAl8UwG4U4yZGDT9+pJo5Gc9pzk+aJmtHukEglkra8OP6pOZ4BpF/LzCSreD6q6PWLoL1VLoxQ6KkT1191CrWvRP5u9EYc5+BVhT2Vm/bCH6DYTB1Rkl2W7tb4iVBziBKts9mcHpmbxjWEvZGRFVjy85qvmptBvb0LCcUk6Lu4Q3DPTzT7g1ULFd5e0b9llgRuwunE5qb4zj6kJCjacln85j5LjqPAxHIv4qffgurKjoHUB0yRZ7/ekCbjBDGytk3gfHnJU7e1cNP9L0Ofv5CAXQKgEBpdkXBxpIoeUJjxdHOn1PcNpahUn1OB4yfd7NTsxxzC+Tcrma+X98IT0lGTiWsz0/FzD0kyF/2ob5hOORO1FepFGF+MmaFdOIrc7lHg/6dacdkzEwJqX4sJKBI2EgPBOfTu/tBk5zg7Qfdf2HpN+NTRVo5NWFDfg0p0i+zGG3+9/zrH8mvxKvEDPano4LLNmY39qRLwIC5TrHCY6RsEfZg852tHIk5oN4CxWdaRYAViLnRSe2XrIzl6UIs7jO/tFgNv8rE94ZyOSrF7NxgplGyru91yFkOFdrp+9CtMUE+zOugnfgJsdS8pHcoZU6a6hCnTakbDH/jZEXC/niGQKPiTwWPJ1buEQvqDxin+S9iK+Y2aHP9RQJ6nbAnVQI+PCJY3CAGT9cpbdpfV+4NhNeu5UJBrzxPKkWKF3a9jblSenphY3E7CVEZzzQ9NmptqiHMk9IdJF4TUUUN4r5bKnSAUvX6+n8Lph2nlSy0EhWlEq0E4t3GzEVGmrF8mP6YsHgSb9BpvIPZZzt/tMHnqOUh8xvfK12stx84LPUPqyTgYtSmy+/BGu13zTKxONQXwHrDa1Jevpfvz3OarAyxjqkLjJUC/xuHYC3+++j6CUZX3CE3QCL5RdrXH5k9j53l6mfhy8/DykM+mtX07Nwwsm6txHV9i+cvxiKEgdhh1aV+t1w7fk2oANfL+Xdyh52bgv3hWfFth+tvEloO6csM1KODGnuUG9XqDa9tXP5r9FNY5MhoNkhvVdCLRSP0Ba9plxXw1bzlF4yDAUlzZH7hDPodWO/gcDFAv4TtDjZXC3C9/DZ+/2Zq8Aveye8Q8My9EIJ9/d6vxAL25WOBaZ3/3cTPcunRXXcxx3Gqscb/33SwjH+3//0d1HWogRFrTPt+ymrfg5aNNBYFS3eK6gFgB+bR8hfaiquyzYhC1VWTKzad4rM4R13n/dfMplJ7qm3gNNViw4q2KIJURrw1W9S2CdTM1p/t72EDxUYkTN5uEfiiNUhcRPy9iudaie3NVcsnC7xdYGmlN5Se8ZAPZIRnIZ3bRmXHDo6VfLB3WBOaSGFq6aDdB7UHG4fFRVdXUxUm7E/FzyF+M041UkHBEnDeX93u5oNA6Lyj1trlvk9e5FoPFr0uNttcOHiBQ7pjHL1oamUUvTtS1KuXnlv/q8vLI++KOjiu8FgwMta+RwOyITxEGyJyxQzVH/a6PncIqA662t7jFNa1yoyU9ID9LzQbhRxTx6bFguFX67M6KDTlodsZsVGsL60oukyseRCPssZ5rCLRc7ZU0ye3Z16TCRMd2Lz0XDU1HzxPiudOvdyd3/YMrv6LIzhG7ls8fOfGt5s5w5AHaBF4JxvrQYFvHemr3x027yswJ4EwFQLvB+1Chploh2CxHYIBEO7nEMw1QwawveFlBHGKIQqGOP8GClLlUG4iK4QBJgEBZwZZr1QB+txt2n4Ds5PdSmBE9lSHPq5ObUZ/A7wO6vUaenlwSufTZIf4gsZ8s0JXKGPWC7Q2zhTEZK62T5+EPSxQIN2mIeOH/7UPWl/CclHYpRldL38qRNtOzZvw1UUXd8NaeRV8uy42NYPi8mtfZWs/mn8T3ORvpl8coNFhuqV+y03os3M3yVUjjWzFlrCkLMcb6B9mXHJ1bnhHEAwplyjxrZMQa9FnH+vUYtbgjpWp+Hh/rgIfrN6DTg8piTPvmHosr7qIZagW8Eb59hhMGYnQUFyRN0LCt16TA0kRf90jHIQ5A1jS2B/sk92seF8XN6dc8BPs3fCtNtSmYY/91AZ/S18tZ4LVEEl6Ek+0coEZw0tyPDL94w6gKKDvfophnkXxEozdWjzv3M36P2k41f2RIXJZn+GrZUT5iormEoMObUNjWMbcxO6dqURs9wVT0ZG5ByJtTVwf+l2r0fnu3Fg52kR2rVlto/7uMkl9OMzp+mdDWOoZ+UTEYyy+9xYAZKLRWopLzm3m5fbyuPrLlnnKD9guKO74k6Jlc3kkiCflga1Yci/KUt1eVE2OVwzbUz4ni+UvgP65Bmh44jpUf5GBG0xB0JYCg/rhCGIoCCMV4hmPDEEWCVwV3PHPQ/kkogmhGi4oU84KkAdecPDPmoYGuahDyy4PU4hdFP8gzn1AL3ZGKaCAdIxZxA0F4TqQY77bS+x8USb9BjEJqflj5+7iOIdT5smon6VnR7sRf0cqbuvEKgCJOiTp+ThF9NgGVBtTXVA5rvrQM6gxHGdQVpO1mkITM29Nyl+HRcUHSTpKg9H8ZwN5+zHuD7dfzxYlk5Fx0upu0t7Px0ctDJr5y9zPyJ3DFDR4jEzQtVjyfJEXDIDh0WcL0Hkv4ZkhGnISSJWTbkVkSMFDcGQn2oByx1lf0eCwJJLbLZaKkhCxAIi+pCvZNAJdwEvwDu556Yw8HtGI5MhkrICvtQFV0LEmR/IYyLkvJFW4mUOHezR4yZEgOugqseSxNIYwKqM126FCpwunce5zmsPgoAENAi2iTSm5FXITi7a7QhsR8FgP0uyctFvyQOQAMvBfLWhQckyh9yhOgCpPdRQgA0mU0i8c5sgKOSQik4eFdgL93G2nT2WOVdBByAAm716bAoJwDgA8imCADAR15MhOo8cAGRbTBvBYEiE4r+3a5/EOhh5DNHzlUYbkQT05zuYbAjmy0/5IuaejebFFLeSx+KPxioeWnkIOxmusmLIcHQ89H1npObsHtBCWSWgi31lIzS/RIpAGoWn4NKVN9gNaVPiZbPE7cjFn3juagRNOtuZ6QpGYj45mwrUFusv+DS3WrBphB9cEadTdkYstqyTsEtMcaIc/ocWOFcKu5acF2pm/RouWeRR2PS850H32B7Q4MjNhq6S+OQuAqw97jY5o3T0pepy7A55X4jUdwJO8vgqustLun8KVK+3uFL+wGZ802sGy016jH0h23mvUwLLvvUb/kWzaa6Sw7LJXvkLr7ydlD61/9so/0HrYa3SBZNe9Rt+QbN5rdIZkv3vFA87pAGy4/yq4MSnNBGZSpeNrmNrG44/SH29u+BnxDtUbliyP3GRYTvJAn2LZ89VywQL68e0XPl2+fNtx+j1hNnKWAZ+35PP5UPZZFEL7zxZW0nfUNsA3HDGcQq6Q3FFBhYusCCOaVRhuDQ2KMKK+QoKiupjtl4bULjL73z+CSrHPNRQUR4YE9stDmlcQ7av+Owoj+eVx53BKbTBBkYQ6i6DwhOsyjkwSKvwaCk31JWpHcz0wuCmNrUjgNhUUNf1G1mh8gqKkhY9nJJgRs8rm4uF6f6So77Vzv9Cc030KFvtEpdKSEP2/Gajv4yuiE4i/USjvj48NA2vgGUyI5EyE1IKDVlSq2QeG4iqQ8ZSQbEMJeGtroURf+VAeIGCCXamItDqNpzQqfI2yGRjOSjpHjRcUJshghgHiyb6DQgc+wJpKipMxsRCwijMkJLE2lRQykwEXmmd0ZrhCQq94iCMTNoYrIzIpjdLj3tcf1XqUlgSJDCpcBIXUiHn4Cw390N9mb8vKzN8XAiLAFyMRiYpuJBdL7t9NCHAGeq2S+L7nhAUxEUVLksqrJKa8A8ugRUA2qV3QpNCEXcMJVvKMZg0VTRItSciOHaTAGSw3gfCC3eb+l94iWR3M4lnyOhJup3ga2+adxgRXdGCwOKI7YMyaWXZNTIf3FMhH3A7rpY3mLhpYt2uRCjmDZxSKdkwc4m5GhKOGbpNHG5lEVpCXkDIaIf2uHLyULFr3KWdTJyZFXpB8YdnhhrwmAsLQ9BNzr3r62AliqQJKBU19kvRZw8LNcUZ9lPJecUd5e6Jlbm2T1pVeddqkabwraCKmky/RBlL5L4natzQ+Ozr2CyXVetNMqjIm9XF5TPR5BM8MtFmXmA0LWDuxy0G7AXH9Ry1sEmV4K0u1HNeqaPQNIrCQnix7f9NOYUeSpirEoEA0IVmiYL1SPJL4O1mcx/4JKEGSw7FZFthHvvM6pjBfm01D0CwB7f3zqByK0kz7EepvYsGABB+nYqU5dvn7wZeHyxnSkGINm7TRcutAswGGJiiogQjayB+cdmAdyFzHTS0ucCvBtQmoHTNxqaB1SuhY1vnZ6UH29rDISMKNWKj7ERADMHyOYKUuMvihWVw/GpoVgX2UFq+y5heWpiQbJGFvR01Ni9OC3hzvaAgNJijPSgqoI7m8FYRLVwCtN0pGsiJfhDXDdSIMh/MdwYDZYRVTGUeGk1ehg4vFAqSqyhfIj6DCk3sYX7VFpT9p6HeOenGsKMndw9NWY42JkOb6Ee40apJH5bseeO0o5wjNfFgjmsVBBBKS7Nv9M+EYz1Zdz/KIVLh4jFASzoke6yXbVMQEMpSw909ahpD5SHkxfk4wxxfTXpREh1mvFJgRJRXYLL47rCArV1VybwcYxmk1ccagurCSVarcFRgTV/Z2FU0SimIvwgpzSCL91z4lUmt1s0gZ2fMhQpwyKWXYGJEdFC44uVZtcHTJBUjYUBMcgmKMq4GDTWOlI+66VqZMQja5YYcoDpk7EAD30jlKHjMh7v6P1s/SqHMoT4s2FrLBUhKqrW9G8wXgCUcRY9AaGtZQEWo2sYrFbq7rC+vgoCUcwx9gsXaNlAEJiz0YjbBg2Fac48wvLMfQ6JKLhDZmqxhsJZ1roPrdjcn3ybDPIMtTgekBSiZXMPVC6134ZxIGzC5nWx+WCEQcnF6iPnmW0zWWrLnOKtSuc9MRgKpBBwMhnY9UmvlgVfSUml1QRL7E8ZrJcOP094Mgd435UtUP8LaYlGWaS9hPsEFqMdUE2XWrc5uGDOxktKlFhMVZF6ikC2VFsg4tiARsIqwg2G0wuD2LVxmPGxlhgYK+j32zaM1AQRSlO5JCiChvBABZs6HEPq34HlE3QmzDXUzcDEjhfGX3mkCgfjQwi+/M4mvU8hEBCfvduViDHXGb0WmRkdTKJihnzRyZlVzhxKPXPsedy0lCmttQ+YVxos4GfNHchMi+qEdnO8iTfAPzGG3TLC1JhaEesXHaqug2l4yFcV47j4qKJogp3ZMKsFsUD7ODgglQmBfCMrDeX8XJYF20CG3geZPnoACxijLcM2NtbDluV1pAxRtvsmspab+asgImXldW0jUqXahKbzti1mUDemsjR3J+kJRunFEJNNoE8wf/5ly5WZflahpQgWrqFLW00h2OhC32ZJ0vUimQBlTpydTcaSTDKFe60qJjShat1J59EA8y1LOMIq7GVbXQaHpBwLATyABA463Egjvbgj9S48ufOj3rUTCK6OiVfvI9wUVZtxyUC5U6gfPFPpg7mCr3CTS2DnSpJWAS9TVEIO5WUfMduy805LTBjOjExL8/tfurBfj0jTGcDJDAOb79XZ2tojuzwxKVUUyqSDk23GqlVpKWuKMTtKyli8xWKyFaNOGu/jbAoHUTYOXLWZCv4VtKaTLeuTTUPBLVHDZBrOuepkePCG1JoAZxZgc5iES09cUWdCrnmiKdNtOEqm0Oa5HE9VzROXbytiQg6TL5MDsIeTLbogqnaBCCCMcLJfGaGf2VNEli9rzRSNftwsYCx3zeGdCvt/6D1TcqGFUK5aySE5LeYi34do1eUWZqktDkxa+lDIKsiKGoE4jS0CH1uhRjGX2i5menePYoWycNptAOa9mzO2inOR/ST+gJ70A8mOkdzvTXUAqJm4ujAZUYvGWteQY3Ha3lxtAkYaXcUXoCy/cJJNywA4y6MXp9gp72hQbGpYWKVBlia4+enLVMlC9LUbGTjXVmlrZQL3bbYDcl7VWbJMfNan/hAnZpzN1s0iEU7TUGipIIXFsyijzD+d40ArsL72X0RRMvQQKJ2E4vLb/HpLGU6eX0Y5wHqeVw5DCAa7XkMN9pDG00Va1ajfdFZSMUqls1K1oy/bnFwNf6RnyGcCzhL8albLThfCkuNMmJ7Samu+3309mffrEGrH2UuN9wv9t/MhokeURq01ozJJznUV50xGi2FtS2l309Cifi9R7r8BOc3HGesnjovQVbxeRwc8fuwmkdcmOAWXkNamwoiXXCtBtqphEGoNJJrbTCppwj1JvI8kpTrlDDhSD8j6RL7Yt9QRVYbUcFYRbtEVagh5Y04dUHi65t1om+9pXtGYuKsq/asvix/MgLhUsANjOozDlT0X7cOkVdRNY4PgCtLyqe0YpbjhCo9AUj9I1Dlw9Ed8lx85/F3cYGc0ecULE8K+ykYMCKDIB+IrmlIjwUHerggnbDdscgie2tcLqc2TmvF8vxIrQ9+yQ4LWLPQznqIwdFrUnzyCQQ0bUYebvgH4nLSjOALjlG5gNXomsWR6gWMabAG4TCXqos0v/oO7pR+ni04EISPEq87dAH7FlVkUlBST2xlhZrrDqcHzUgBwy6SvHm4aG1hVxMfBzmUml/zB7hecIE8SCBbAsG9HzIYg4RbjQLB/7DagvQd25fkvZP2GsisQLRAkfrWK4LWUHzLOhbGPR7b8dMhevwMrnMdHFQB/T7RBmOUDYi6q2wNv704BKZrcaS0tBWlTj/YKMR2JsTJU26RyM2Hs6m/VLpb61gJEZdlpxZL0BsGgNnT8yiqSRFfUZDo3odvd5kXAB/yal0SFQXhMnKNfqQ3PYTRAx8oaFcRtTfWFToQzvVU9OuS9eRdkx2HeeV40nhyh/WoqKdetVSCk358gV/wfou9qHcTdCdMRtD4tsRmTy3nbCDdsw22nzjKJvxr6wZLVnXXy1kf+f1Gj3kf/3wBPPCfnZQACeifZ9q2MV+QSxwRc2oISDf3gmzwAFgj14BVDRI2QKULyeiRT5IwoUzpwYXshiFc4HD54r8t6xsVzTtqqCISVZj5QOoqBMSoqD2dOhXSGTT0W7nMmVIB2Km+lDW8oE/uSYa7MfC+RgQwbBhXVv/SuxoSjPRlLE8Wvs1dQX1eO8KUtFmOx60F8xyzNZhOuVL81rCDVTdBOMAIm5Q4EQHS6P4scuQLrrMTvL2kNGyzkxA6dBcESvyxtwYqsyCNcs+G5Th/nO3y2sufkuiAZyMMP3NilYABUAyG2RgI88IjQUmRo6Z7qOaRUQLQoKYpoityyOL6cebHfeTy8XBSqKYofgL4JPkboII5RYnulmRVhjcoK9nEiR2pLmAK5JWR+pImTsramG8oXIHkdvlAjLJ3iqCl2ifIfE3/QbyImIUJlsVH7KB5igJJPqY0LOdX/in2JlncGiNuCnVEjuPlrxMPuP+CrXPwrG9lkCIkoNGZ6TeJDpPSeRBramz+/7rcmmwf/8u4hSqE31SjIyYmlmQqFpN6VujnnRA0vLQQF1Vpj5S1++S0UJoo+sQPkdv18/fc1IO9d7t7isdJbSfyDlCw/STKH7n2NLNboG6YXdXaZX8gYDpAahZ2keR5fGwpxVMN3IflYB8hhH5Qx8N6mq0AUAiYQgTFCC0hVibWiSBRSwhHJG18CU0/DQvqgm2QXztvJ1HOQlu6mBsqVggcfJMxDk6CtvosNHVmtBi8Tup65PppCMBToDLQrGTTWcmyReUxS90UDg+1MEckJSYCAFQYgDCPO20sEQMwDwvJYDhLAEjv7VhUgxRLsJlRtsil9IBBTgwaTd7jEgRIJEwAVUkoUFvl3T4zL/tTHCw0rNAXGyRYHmOLo8YDD4nUnFoThUoOL7ROLyQF3zdWoJiiBBDBeWGJOdXCsW+iEx+9jvAaHhR5aaCRqrA6EkDV/zplLyV6FDPs4GDKgAdz6OGzx2wOM1CB72D7I9XUXhJ6EM+JLJZ2evwKDEMHmmU33PmDQFCUTiXzLEcEViOhN1csgSI8AAh6YDjKPoiZKmoO2NSATszm3YTAvwiKyawbbFEKZQ44j0y0xRHLPmX8i9M2sEqo+UKpK/tlbX+tBLXa4T9BrcYssOdRfHHxS7N4sBZp60vEN0xlcsr2SEIMY6MlWjcTISP+1DAcxlZGBVKXJx2H+2oqCbIeOcl/glyrJFTKrcHSRCupEsPkdQ+TuLeKiTG0UYvhYkEWJsEagwAdCNRtg3WmXIghro2eB3t/sC6roBjjQj3HbkgQIWDDx6TOrbrRKFARPzLxT4EEBad+RRo8RxcvGYWE/Oeun7co4YN/piDYUdpsGDe3uISOfd/iQpUzo1wvXaUCiRbNXZkZ7FLjgQsGBue8ZjwOEpdIbnRRIn1V2Nqg09rO7jmvFZJGNkhfvDGgNsEUHjCYayILMBuCB8A/nr1GhTVEj+opv1GRpECkKnD/6utI0vGFPFCI4FmCWpie8bMCGwC+AV1boJoJmNuAI9B4raQ8BxkngLlaZDNWMyNwZdg4UWQz0w292x8E9zzOXteJavpOyRZKBFFyCMGt8Sp+hxFKDiagyFMYsqwUtK5nDW4NbMnlnXOm5WZLWXMRFAWRHsMtH6TDz7rppgLLwDcAFNy0tj7sgB4noCxzsO1Qx//HkRZIK/AMthRetUDqJ59fMLaQSekZGYERbvS551HFL2iDWcXJR8h/7LAq4KweKErSfJpJNqZtyOUHA8XEwG25CVOChG0PnRRHCmvcc3pmJXDYXjtUtoASt3CQhYzla394vT0YRMwVpYm0WUXgN41Yd36AXYSElPN9PYqR1jnx7cWgTkSlRi3HW4KJD2XQei7QKyjPbE7hw9B/EPQsGcsbHFZHz1WuPCYC7Gj2yJLAIsDdD4limOkOySMDnVuWOsQTqNqml7oCcNWbKFHUsUzJgPbXszEhRE2uno6fSL5FGIsOFpNlaKX0SOPMFC6oQZ0A3+BmouSaigtcynFJLs/h9tVn48Lke0AwFYqU/YPLg6fM42bHTFkdFSYF7dQv53iq/lS7vhAF4Spnlm4qQWh6Dk2EaRUfPpowoo/+A1XKGgIUvgb/EUfgB8dQBWrxt+dAJePDXrmq2b+/F4/YY2DQSR8cM1xsZSjQxQF3qLT+RvS3wnoKX5f/IR49LX6BhALyAa0kqljMHZLf7PGaEHgBMh3HYQIT12IgImEilPAf5TzEcIbOmlhHvQFlVwUfexcaP8SM5pIiiargIusPKzuE/wBS1ZFS/QrhkFM1/mzZ7o8PyzsW5SFttWRcKjj2yYeC+MfZt/E/AvXQdBiyRvf95upRlMJZ9/6gYkIhOpEKReFb/uIH3StkTIJI1Cxe1lZ5xiyM7SIbql1CZHcwXVBYp22Bdbs8RdThJ4A1fErnOLCiy1A7VvHM+qsmuMiZIPqJdGsTCJD+14it40r0P1dIOYGEmEs+BZB4aVNkxksto7A6H3Xc4Se5xNhz35Wt2/CQ+CoCxmWRzNjERed726V+XqEO2oSqSGU4v+hWAHrUn/Ht1ihj348MCBDaEkshe3QhweodAiHesirEYJvh5c3dl8gkcuS0eeZwx1Wl9hfW47KhW9Yh8Osh4ix1LsOAbuelJZnbU9ANL9jc+Wk8y0cpDo7jc4w5vUzwmsg+kp/b/sOBBOJAeX+u6mSIwJY9QZM/u7wFuc15FrIuZo41UL9rdBNhyDP747pNDJOVszAUmzAdqxrwMJ5tff0c0pFjxahaSb62kUbxZ4cNvw5cgu++t6v7BIGHjPHHb8ykiZ9Zr5TzKGkXFPomBgtu5xBzWbywUItL6nROpdEhHw0vC8hpv0MNrVhA35sVnBc80fIlBYtd7tT+c+5JGpYuv2XZFATJycRkVw4Y/hcjEGEEgIYuYi5usG7krOszVF+S388sq2wycXDLhbJHRnF1AfjwfstW+wEUdC6H7ne5gWjEEn9PH1O4uzHy0FFzcICvQBevPDE17N2TR3Ku9nGV23lc4S92xR9uZtY0O/26RfT09m0uDvc2JAvvMgT+d+bVpKN0hYR9UapSlaVdoolEFeMYi81RRvOXAgkMU/aawAKkwu9ylUqnSF6fgOu74jeluXQ5PqQNB6w4hP2S2pSxFqMYSK5+iNPFMh+a4fpKJpC8LomN2QosvqJH37h7UsWjhaU73Yd3iNs3sr5fq3GzavcPF5SFwvsZUB9TVVNwZBUxZYI8bOf+Pmu3Qgw8B6ijzuhpcz4gAuY0bab7ZA2zRxGNoA2S01CujCqbMz53U9xt4rI7/H+/fHK7xIN/5GZn7mc5ehel3MXtpPmgPQinnHYPs+JcNswiJagle8b95Ni3/oIfYUSorv8I1Gz5vceuiukC0cg3wFbMbNHzvQzYaNtmtrwviXVpyonBRvc95WRdJWzC4f9uezoE/ACPVxHE/LLzMJUIPCsC9Ic3voxLw/KDbCLshhM4d0zQqT7erleIg1/2MlPmU9rcZzGwSCpNMkYqvZqMi3PmIyu5Jcsjj9AqDRquBAzFep3YVceFdt8Fo/luP6OPnc0ALBJ8hqH8XG5ytXkN9d+eW3th1lScLLau6WMb+nEBuvEcQ6bhrJMeBHnvAWF2CCfisOYtWBADdJbSxGZdIoeqgVe0wvgv+yEs+5UlgARnciC2czQwXAD9JWrdtURUmq49TdyuMPfMxvD3fGiDYE3MBl1CCx4pCd2Q/cuMTyg7l6uIhSukMy8ahlnvPCD4UUN3ncDQPsKbYpr62ritDxr4Nmm4bHibNh8QMmOkZUzH365uP0nQE1SGMySGQRKTLVOBM7PMgimhtJlMEIGxsl4VxYVGwTJoZCUf57dDG/7q9XF/eF87FukfSa/dzhppdoLH6emMngqPwBh4mUZUA3RimZYaM3wNvQtz/pGKs1MyCcsrt0CphWqUN+7PPmrGwg3AvrWZBG+OAvh4NI2A1lPP3/Nv7yFqrBCBkOJKRo8856Wm/2s6f5kgH7Dbt6bzDrIyCfmGSCOuv5fgKgdtV/gkIeAAruH0aDzfBXpfFI0zxOP/JVT4LHoKSp2SZsBhfX1Fy3ncJgahMDdh6pEN05NmChnat7/0TDwGVRFGX7w3gKpuunRb02mabJzoanL5tiIctMhM6hK/8T/pO4HYY+j2r5G8V3IbUV2szUW5sylxfNrfRXlv4DDHb78jU/BxniDxzrbKjJUjfSvvED0cbTsptPgnnwesgrPd+HUTExHI5EnUcexq3IDVyNUj9mvdYOgAdpGVsIGfG4djIQ4bGfVsYKraAeCFRKeV+wXKuF1HIAq1feNx3JXgs4rU0Q63DjfGlAfQQVIWRHYv1jQwi4C/Id4dSUcQ+5H4xYYE98LyFOSz7jiobELHveix2t50u7Jzr1cH0LYu+EX4HCxLrd7zn9LVAZ570MafuXmDG5KE7Z70kE4Ma0ta+vhYVdNFfdrp9DqDD4eMqxqG0QxHCzPfTJNIBk2LpFb73wy+m5OGC2Ao3E+gqFEc/z8lynpyzUuciV3imY4rhd8LtBIV0VyFCTcIHHPa0f7ldhHkLrzUdRXFvilUT9rEOemVjKp8SmPvP9MXxtDmT/0vnKfmPgIl9WKmry9VJOFmM5umhN/iXBWE+3Fc4m0oEJCUIC0j+upcx2ec2C8wdPHtg9Yn+ytTMnlSP6d2GkSyDEMFkkljABF1El+6iFQJW3+lSLpi8urVYfPqKUV0eroPhDvO+ftWKziIGp1hrCaisj8NljHliSeIaO1eI3VKxLPFFzQoVf66ZrSYL5FXmVngwbIcRrjGezUolXW82uhucBVbHVR3nCk6DrlfGOXapaHQlhfrOhHgYQQ4MrbMjJXV8qYbY/s1rbBOxJMdE1BmiXrg+lNdfVC+dBvJIZILawVQURwd3qA7fOc/g6I2xhVObu5wXOpewx8w/Kcx4eOT+03qISJLkWynDQbWqiGNiuSp6U7QpGzYPyIxwQn2eFYD053AePSjpLrkTMiRQg9d7yBBT+nnbcI3j0lV1Ir2eD3+vd9owudosP1i9yAkqKFRC9KLh8DyDiIaFUGlhoTq6rTz5n1XXUQT7C48nOHguVjF7ScglZFkOT2Pumzg3kxQZ4fcJGhiytaMyWRmqRIWUbqkQzyNG9p+szgY8gbvN9DxH0SklTqYN25yqVMSCLr7TQ3FfQq/6Hoxiw3nSLEtTMdyxy0iNlyRVhzc6Juh3uv1roW0gD0LVDQYx1SzB9Bi9Hsx1FDjAcq9lMEDLBTAEUi2G+DUQOT5l648cr3vnjnTFNPKVIPPu2Cp9CuJKOr6Dk0mlgPqCxHdVcoCS5An1O4mVM1GDdTlhRPyfuL66PEs+Xq1Vpg5DdbEoj94JYXFr89hmfvpnjP/9FSQiO8TFgacwCgGs8znPuAlM8zcmbCFPu2CTXaN0xXPXYXW01O1BY7oBI3Efs69ai7niFGrGWZcV1gWUwEyjKliJZWXqW0NtnPjZyNjT0r2cSWtpYI03HW9WZWpJGN9AiqbABcJAk+vGPOrsUtSLLjtDU3sXUwx4/pXQyJqnsnEop0UzDhuC55UBN/wTez1OXmo3U55JBxaFE4NrH4B7jhJ+41NPmlJtjibU8B5sPjrciA/KWubeXkuHN8BXJ+UdwOCglCJXuhuuDDTjpwOEuwWLIqCSQp++9YEjb2vmuRZO1CBHsLm7NHb5Ycguz6qjrxIAkXxzhmcWUqKUkJS+PX+gUniLPiU1HYLMbndQGoIQ8xZOtAEZ/KLkqi3vWtUHmsem+OYPMiMo7+Biv/rH61AhbDcmrIJIuG3qaU9ydU0YKzPJfXcsAgYk8q83NLiv6AipCLrnrnX53Q41V5z1L0sT0LLKspu0BL/YgHb0kUHuCcEqjNUBMan/2an6Jxybtjj5FGqVvLJXJrWIKBM9joMHvuthDyta6xGVltMoAisEwRdHacEfxRenttzUW3xtHlsVFN4xksZ47vMsITjxejABWnwPGBrNTk3m3mi9lFQiLVAVzs783gwobhvz4ksO6cOG/u7T/79o1FqjcAEriyRL3Zl6vc7JxAoU63cvi68JPLhgsH8MXfWUn873bE6e69ugG/XdFNNSsrwgEGW8xd/IhJXPsVxIWB3CuXPqGEhdknHJuxYX/3gE32qSTLCxpcljHlQwYqGQf58SDIV9Xe6BfLbMJmOKpZGCvpWaLafr8e8+/azOYyye/IfJAUNToSYd9t7tog7cqzQA6RQ78qlTYw8QK6GQpU5Kl1OBmjM1g1XlLcY225/xoWfRyh8AWSV1kAAEGNtG+XmpbBIUPIJg5Xs68qUmoa043/kE0pgNQZNfIFjSKY2XMT9MYsmaDH6T+hGXxaaSg5Z+Azl7yJ9aA2BVYkMx86bOD2dlPRgPDAENd7UPgY+WlFYqsufAYsOUzXSMtE1CeyeIUBbzCScRPJqXiKx1EcxL2WlTEbf+wKg/lCjDYm9hga1dC8UukS8S7JfZGZttGJSAHEQEiblgra+jzs6e+U+StHPO4weyU7mRBSDm0QwWqWCrxV1eTpCVls8G4FJRfnb4uYQ9wcpFZS66ukQtMA2kdk/jCORPCDEpiFBVY1U6mluW9kvdKxk5jVXSSem/wB71bUXO/3JJdfvhAsF3U+3ff0CUdE1uYFiWoBR/9vzn4+oWtWViWtMc5AeyoDuhoyq4RqS/vEmz1aPjWZzMgyhlJNEQITGNinb2yQARTVWDDz3poQhA9jZk9NWSob00JuYD1sYGiHUgh+hjS/01WYQcW6ihs4a0AclL4ZTsPs8XQHZF3fkBZEDDf6Ns71M92KXZ653IhvBEYvJZqsyCdHJzTjWUWMZNlYerapeCxF4c0r8f5I3TQgMWCEZejHIpujlyKjZffE6RJpyG0DiyRll2iCJ1iTA46+P/5nxPQ61D+wTGC6SWgbxHrkcRMfeGgaxiPlGmil5Doa+uiVIRAhh1lPVuaTwKGpkK65FUUkA+IQ48CdESvzaVD3q3+558xLPE5pXCJVYveh+V5WcOleYbzrZJeLGpoBllQnG5Yf5LBcZur5HHSqrWYc30qFwhAsnPS29g91yJaxSLoZKhOrQzNaStb1L5z8e/oeGpg5s5XAZz04kt8z1/gcDs6uD5LBnnmgQBf6pDAQcetMYT92NU0n2MtEbrcCkI56Oxj9aFqACGel+WMULzpDNhYDZdVGJn8rydmnucbz0xshO+5YmHF4upgsICnUriDJty5f+Ybk9ko1BQdgSvykqMYdRccCONRgObKyDt5QhcpnRZT2Zrm+OBjV129wRiBkr6mP8saGVHKk4LIucDX+XSrOT1F5eSXMC/kpq15jhUY0Cigen/KPue2PeJzWiS8PLdwNBodACikOAuFqJ0RQr8NEsYySMBdYVsodEq7qUF11laaPBCEiid6StMwsY8eyBWQdRjxE/ixD3MY5lqdpuLtvY28Vq1KQZtW2tPS9yexS22v4i9HIUJ4Jp1ifiWBPmcchRCaoB/faLL8oEJlfJV1visJjai0T0lWHNL1YhTK2fyfEq8kg/PBEe/yxn2hckLg0rOTg/EMw0JmnYS7QXmuCS34wjlcw13o3hlReD0+rbrVmf8hEYt9qttcyRRn4Nqu5JJrVTL12XOduqWEV284adPpgC7r6Y0+rvhaklUUHZV/XiIKYrAMfFOgaFWwMWAOLut+fyAklkWnAOq+SMQsCCjdFXCpsgp22oSQqCdPsJRLDO1LOgbYHZirvztg6k1n1EhxST14BSCPqAwDLjfbZFSBVaZswEkZMvRb/nUkKPG4wADAjNMANa6lHckKGnxeIu5DqKPxOVLihRAoDkOH1ZN6jqxKWBotsy4n+pAo9+ge2XJDPv/bMq/9yhJV4sfVAZdAW5LVYveOgvNKHNPvSfi1TZDIA7nb/za6zY/39D0z8/hOwQ5mb0RMJEVpxebLGNTOmaJvJyYyVrhJU1oqNcGPJlMw1ny1f6NhWvpB4oOEDZ8hEl5B7RMAo9YxaYLkLWzrDhFQrWnwVwQQNOVAre2EFevcsZxnfBqEftZ5GrhxrWAtDfIjmkVMYQVFJO322rY0ThnHe0FuTu+Oew+QuQFty0TrKL0amGzvODfGyhPbjHGYVDAfYitvi75ID6yUijI7sykKSumwjQm2Vgx1TXlOxFd1RW9gPRThy1FRBlG0WuRV5iEnI22ShabFlUj6qa4m7HsS6A92ntk/KxHKnUY5Me+Q1LPPtx+ghd1N/jPjsaY4oaeU9X4RYOi+zzcKfn5jT5dE8L++T0tPkGwMLeJk1Dbfj24MWhonwUU1vfqo8/xWqzTiZ2ActzAT0XGHyKVY448g5qweV4lP+5e1Q1MNAtNSnOB/0l1BcUBOzXzSkdEdUzNke9KIUue+gHybiKQACeb2zAb+RXdC8nohsjT9yzos3eSKfHxLJhsE7913DFZhAkydrqPXLFvUYK7UsDsXxCu/A5EF77mklOoxcEjmqC8H1ErRRvLVhlZa/x8eugPeRUvBnZmlMCL0IUrA/zItQX/U/IfgJwztdjRH3IjjJvvC0aj6IihtFlMS0QLfCfbrQsBs6P0NNpEvihqBa8VVqGtt4CR28TikNW3Al/Z9N0PgnAi7EUWrYtLKxBbi7pqUm2d0Ty8mcA0ZCtAeJjMSIaS25qcyLn022niRnTHN9xRplU+TOJgIhjdYuwr+Z0UGL1EXgyT67fQRq4vVtSFmR9TZx+ytUr92yzBeisvdhmEcREtafPIAAUTOdK6b5PLHCanRh42mBdFV7SXlT8LElk1Y/g2pBgVXxYEDypQYk0YPP/H29OPfSBlNv6rXeUoL3erbTy4yxKUGTNeqC9hXJqEy5m1MvPPjaCfuGM+iZp9iOaVSa188w8MDb6k8CNpOTNNIXLH5NH8DEpWm17kN5kk6WqaMeuzPwKPrgYNPs7Bd//gUvBlwGumm5cY4bXub/Z8A5y17Aa99qid/CB+Gq6HtUv88uCp+4qv/EHb41fgFnzJcdgoj92s9NDC7Ey0FIVxAFjVXnH4a526M8hUzOfcHQhunZ3uvdDj+wOi7F1W4zPj5quhuGa4ERsgmEU6ZyTqSZcD0B4Eo0+GZKRo6sbD4NktnBMEeNKARVIWkqTjzSlnf8RQlupPOmuxXQq3YVXm7YVE/5mQoh6wSHr5k4qKIzfh+LsBWsmenHhLrCUiH6aG+M9bYqF0D81CEMCS0COLq/VnrVwEB8orBHQ2ICPu05CTrDbnBIjOl8nfFfN0ELGAbI8k2MEzvZBU3v6nipAR8s45RO/c/T6/DPdx+N585DIFqm9/2p6ACwCbYIR+QmIWpdkzCaZiWSn0fgDUVZ+8p0pUFhpoLRAGUxKpvWFNJi6NsncR2rhs4mlN+BSxvDk+rCRTfFJa/lPsdUX+VKnqoSTsi6xbeSonAyfwIelc4siRSBZcmn0I6kiBIAwXISjVgdI+a6h2lsvJlD8RqA5s91YCk7MepYRELxgeuxNkALXbN56ELRFhoBvBBwl/aqyxQ6K0oheNm4iRqIHfTAZ1iuaVZZnhtqmSZDiK3jaKAKG4R1LHBIrXkBZaIQdxe2rGMZ3F3JO1+46ehhxHGrr6hT08LpEVJTTn/PW3WlBYRLWDAbX8sKavvvG58cZB4CT2Ge0Hr42pBeBwrCayD5mnIsoHmVzUqmx1jMK6PKPo/tqZrja9GURHzjJ4sS/xplbcaWBxb1eYNCRLn66RfLw/Z5loSA24lDmOFI8YDlEazqPys3QHdhvqC/MxkkzHNqLLtWHQLUQOB+wglV8wdpfTKueF9Uz67TONDs86fo8dhE/TAN4yp+v+1cLdiMD17H9xgxUfrP2gs+D2pJ9ngH8q6/7YkH2/ljFC7q8QskUcvp4TDCFdqLYU//9vwJ3vvCbujAy83iphXe/PtGSjbbH2guOWSr1SDelWiG6PoJnBSfM2pZsir48YynEuif4uO9SfsLnOG/QAdrYKk9JgLYEdXkW8uVoxvKd49XGsbn+C1qWv0DjoVHxRmDtoeaiIg2s1S8QVn3J9Mg3BxCk+EtGnBn0Sg4/k1uc7u49heOTz70+dpx0e9mJ+BV8YICbKfBlLgsfoNdAFRVLX0vJxcXX+ENyH6/SKIfsp6giWS8nyHJrcNRf8JSGuwPI1hfNfctZPnmv2Kq9k/b05DDx2INdqVPI16fzhLVQhHOt37syVkVaz0yI7LuE39l5ObfGad3ztVM77Xxpbcm59JderAocY2enNI1+dlsh2zZ3/2Zmf48aWLlvGGyc0BhC3K/iu0V4mVeXa2bBq/lJSh6995QmSPv8ay+voOB7SNNk+xazy0/dqU1nme5U1p+95tFH6Mro/qC/fwzB6n1i3ufwDhX6PQrsvnbQ8gi2Qp/q/qJvfh4zQYPgWXiMIYxNz9jR2L5IALJoA5fjSd8lGHOrJ+cs4d2nyoQ7qh1YnxnBnDxb3ioaUEyU3wuEa6PMCHMIiz7MWNAfjm56tCfCvotPhLZ3qtBLh5XmDvRqxbTZfkgXSuXbhaw2VqBweJM+RTA+vj1JHRFjw/QHRmXfoIZ7j6CLTNTrG68jAG6etHvXQszNcYZU0u29lpibCsiVjhrMmk6YIM4BSJ3uzhmr9sTqrKWQWiQ4Xj6Da6iyWsiwkfKFzWMj4RxXTMBxz/jQFdALu0BpxZ/Kz1fzrafTZgANflQZW7dtwWkWAfZAt/A5lpFKiIbyjq/ZNkXerGU3yUYra2BhfpiKKFKFm0hP70w/tuNCAkFckGRcx/3ED42c9PYTREOCVCOnMTTgvLB0NfBCPc9HHXNL1fRnNP7/B989xR2ASjix52SGqpzSBtTfvULEQgLXt8Shp25Q1pUDeNhbPg00Iwh4/rlb6Fpu9K2mx8emimWm5RP9FXxC6Ex+SD7T/UkzMi61XWX76DVbZLBdoYDkHpib1HSM+j5DiMLYlQJLRVqq1HHJ/rJmkNxsFEjqLiCLaUcmLUeDSb7S6IqRXcU5hrbCFnmJhCGHqwIA7XH4I7vB1XHSS4ntiBHYiOapRv1f2yIhWnSYl7KoXHFjEVb3O4wFgCnP4axeSRCjFvMvlHAZK6/9jUkDn+HqwcstJfBQCTNywzBtThhpDLKju+mzB1ZxvLJ0GQBCQIp4OAI2WXFkZHryRLquCHwBF1rF9xEi4POO1AIHXHOk9fM0rODH1nM/Xk/0Wgi2BtKgH3xCF3N8kL1lnvjRWXEH8L85yniJ8Z9UKWXaZpC5XBA2qOvMg7A/bRqqavjDU8/Q/5c0vQ9T3lntk+rBvrsmdE6DDeRi7q/RCx70/cWnyxAJmn6JrHWNdVuU+ozKW/bBzHt9amCeluv9z0fmQeFg0V/Yr4cOkAR0fJDDerUzHKAIoCyzR6chDZkkW9uQogCRbwARdHqr0PFd4kvUKXyAhVRU6U6gFqq3PTcmJ4zKuWGe+khRfxtKvVctSYgS8oNK3linR+kLZHMF3npNBDFPEhzTLrkdNR+qO6kWFJFzjp+jCpRxGc9JkVqO82CNUdNMfN8uldAy1VdZN5cyqYpKNCgD3kLtp/0KTDPChIwN9BP4ZSMTGfWzSTjn/qR+IgAR1HlcmDS0QQwLx2CJXxGjVgJwQKoFQJcy7qwGRTsVszq7fR1eMw+fjMpgoui0RisL6tgF3SJ/gqyH1XIE6hsqREneM2PM9EIR9gdZEJvYduCj+wAKhCaxIdfKwkOzIP+pvQRhQkZECkS01xj9wARbsowyjTybtyzcbttUy/hGuoSag5UgJ2nx3KRRXjHfgTroI8IuVjJ5QrYY0BjAndmpwOh7cCn1YvqSUSwN1uY7Qt4RDFPi87DAvhH64fgoy40yRhrQvGz0Qqtfdd7H2qMsJSPjSu/LbfYABVjLeaICRXfKFespq3wavuf+XDf9SbiFAFDNb6zHalwa8MStTMfdr65uwytLLC1uJNZWy7UdAk9wVq23Shc/WW8/rgL+l3ev90l+co3+F5Vr2JV9yQx4CbIYq2T2MjCwWH48pcVagZby8CzMDHnlLokBnB748TZ7JB0DRqK92zI5Wm4geHEe7Ru8T7gKeQtNL1ZcQ13SJHOwvhI2+PKtubL6Ks1oVnS6mR6yEtr6HyQ4kMH/5wk3I8gSHNjxXQogOZD2Fq1IZaf8HB63gYrxo++/59D7rk8vRNu0VuE5VxAsAJL87K9o/akF4soahrQDAHj5/0bBAK4B+TGiYEwhgCAp1SU7YfBE8462bjJGapa9zjHX7IazbK5gHv3OiKwQGBYIGnm8+nKm9kNUSN6FFHGeqfW8QYbC1L8W3szfTZb0Wqtyn8K+pxftHFeG91VoTAMM5zVl8cLZeG+yHryagLy23ZzPvVlf5BO3i7p4nRKzKXZGEr/rsxHDxsgcd8GRpVCQZQE+3fHojQ9Ho7AXVXiLv/MNmkOF6cCKQJ3JszF3bDOxzmEvRr9OpMrniIfPOKFZIRzamSrJu49ES2flr74hSKssSjrXvvusv8ECLojyR8OkFWYjGoRvrSJ3eMw63uRGtAfQhWI/eUNki1QfCkakDkPImpFONfZCobTx2K2GcREPugVYiVP+Vg5+aqa598H+S+XWFWM4lMnOtHBEPshKKQZ/lqrkzs+CCVa9QvosJQH4rB/IXYCNJbXo0s0beLYTNpSCoqnHoEzacNJSOTepk3MT/aXgNJvub1u9MVO5gw8QmY2xm3vEBwqkGd7g57AB9gSzum6wyUas64aEQw5pkEyRj2BC2/vL6KnyqWaObhqr2ubDDCPr1DzebVTjtGNHHpCuivWKwy540Ftc779c9u2P8cxP7o5JNCipDRENsbZH4Skliq2n4PnqtV93wUjy/wH7qQGW2P1xznKctPsK3ksXkG9szPCPRaCN50rbzVX4IDVgWm9zqqXA/O8KDkyGB3ro7ykoWCVb56E27SucHWhsGyqlT6tP5DVBudDUfHCtO6gkl7n5MQeAWvjnwY7hZius0OCssq6SEmt2XCVBZfHj3fzgOitbbrdrvgNF0BJmQH8L2QDkL3QOcqKaKU1y6kJ0gfMH5iGk32vc333PA9gbYBH71+4atb1LxQH44ys10+SZ4GVIhh2qIKn/605rjBlZ8fQjdoqZAHIqMm7Q9rGylUTmbSRmEh+uR7FtD6ZlzzOa/ejqrTJ9PRgrIVQ291gVZlGVuNfShTuBXJqGzz9fCP/3XMjkl5zPuqzNbRavBdJbSaDWiA8T8Y/HmnNtUCbjGJdBXA34OHAqDN41FYLuiW3tL5rNmFdteyh9ovKFTRDCqtpCB65NRFQaKfutLEu463K8UCtzUiddY9GPorvRG2pwKqHqnog/hifP6576gLrOQ0XM5323YVdACXhbIH2xGHz52w6jkgpSKZphWtbhScGj5+Fp6WIPWBtrbR3FiNzDmgWyJmjNJPfsRWp0ChVak5UoKmkss7hWJqdwVdZYk+/wLNujaK8haQi1YXJhdqV+0/t63xtRD83d2dbfDbGXP/6s2KXS1IoabRXtlD8Zfm6nO3tC+MwHgEYJSoXbdHQGj0sV10bey98pGAQV+LO3lZtZBLYzx4iRYuMCnMBpkIuAEou2FjOCibwMlA6gghkFCMI36S1Tqw9Tp7vnTZ2rV1teEZrtE9Xdadj8cgVD+RaoE/XgUcFtQs/bltSC11JStM36aAgnNmCTuSqYkr0xdcke1ktESQhyV3XM5UlHRHWjGhtvWr1diDlW/n7t9OiQzunddN7d2jtjjU2eG7EZU7iC8RDYO93gMENb89lNea4nBhk2siGVsZnjSEoS7TdxwTz5aPnlNIAlWGED2XjCAhjtVeyZic/6aMmbVZIGBLINqLy1vvqU/eSZWg4Y2TzYhfM3K66Uf3mvk8A1j79/mTd8R7aEG13VYOZcxHR9joPwsjNDp9RdnQDGCA1HVj5JbQQO+eYpQtbCydmUnyDo0XmYmx9PFVrl8uRDkbtmyEGD4WkyGeYbhUPxAh/QZNklN7eo2ptsJ5I1WEeBKtUSVpRGxLvrxf6B/bmoGUSjNemCypCXQIpac+KpKtBGFW2O7IhrFU7l8swRD/JOMpY7nPjLPSSYSI6SJidx81ogX4sETon4hfVYR7YFXEau09VZ0hlTDFb7FeiShgk5IZnBKXSlJDkdDlH1Ur29ilQ1hmfcA4jv6K+EQyVXcfYoXdtgsmsnWIa2IEN1SA5xjSttoP4rChW6d2aCSwpwneCkQt3bDG7NlCt+Ew/WrpdrT1E5Uw0kQqfLXfOemKS6VAhIGj/S5cT3oxXKsJkX65WjgotaxkZknQEhf92/IhHy+6ufCBQESpJWrgW6jJ8u6eO/Vz8+MwRXYcfmtaiHJcKWEK/3Uw3g9WzoVJ1nK5U1SO0Wdj3a7YeD5XcF7qPZuk8MGgoYyX4nDXkls14wveCf+AGiN9AFUXvcNiWVNGRDQrSBIVxhWBfojvguoZXFMa92hjiJX8FSHbRmrqJXAAiu9rrACpg8dBpr0BNjLa0gGbigRcGMVXuigHNRkOYoRkEll0emycPZ0bAw5GBXvWhza1SvXS0w6iEzpM+GyLTFThfkcJsmrInnEUK4AEUHcODlDNML1GmltDsJ3VxPrBt17hRJBdGWdE0yvOUE6NWZB4kvURVDdyB7YQ7T5orgW0x4vStPwkRpF8wRyDKGYXihSCcIyBJx0Y4z8ZE/syCz6xOGAwB7knPoXJdGHZntuI/R8/KzciYRXBMRkVSe5ZvtCAByur/NdU6WU2ONK0oHwljzr2or0STOm9AmwUEMU8ECjH1XcQUYcqFIbWFXemnG1M3quiBFifhJfngfBFgxlcoJQ/eA8+anoUEMkRwzRRjBijDFrIUK7ayCQb98XJPgnEd3XZ9c4xKgnmwx3SR75/CH2CIfCW+NE40JLpvNq4AIQMYxMpVxAa5q4Je1tDfhBG6ExeOBGU7KGm+w+5OZ4DqgcCNs4ea5k5kCMr3AlSxYIq5eOg96K34BQ6iwVhqBoU8O3VBQqnDCEBaUsuBEsDpUWQWsk+eY3emXjL61Q8FlKjSd3E6gIIHIphKhBuSoraxGUF/QWUrsIOSdCqUJoeRDUkxS8Q8ahosZMQTjhvAjbxOdbPcwA/OJr1y024p06XyAxlk4t8EkLzT3vGWhmt46f41aqcQxPk4KWIccAqRr9QDeBYXLwx3oKNom9m17dCD+y7xF8kNgSzojswB4hVS8fVMniQkPQPYhMSwUkc9nP8enOyYdflOmfrQcJ82MdsTi2yBvsEQjJKYS+dK7bXj/iKW3MGE3Cruq0qNoUHyWBAissZkOWpU2rVG61W26pIKIH3MSn7SqXwmKhSnDaylBo4m6aMe4olekJSSIgSKnKMCQagIRTrACqP9aRSxuWLgHzuY6AlPNCFlPMNLOML+uiaeRkNEg0GQiMNJUmJ7Y1gUJudGBt/iDL5FAiIlV2u0igoG45VrtjOl1SY/8/Ciavg74xYv2sFqYcpbOWPCKmDVfQ9XiN6vvO2CARg1Rhx7F5NZspdZGFpHn8apvxhuGTJHe0Dt7KJU6gA3bfRXjwYGyc+U3jQWt9uiqJgah+us+/POpFs8bEBKCgJnY6udkWRiHlEc952pIbH4tr1aCPIkXWJjcdYH+ape9P20GfSvjXN28lBAjg2GhRuAU1sjVEreXOujBiBWH94lRYtC+tk6oT9x5QR44Qdwm9gwge343PDR9ri4XB7O7A6vThQ4bFqKztXHsPgaNULErszs2ZY32+tqVVkyUA8xP/fedq9nb1NmL4dwNUKiExRYZDZEQjtWywm6MiwUifjI73Q/4V6tEQX7ORgLG4VyjTMAQnnpQMpXCGkwhLYDzVvOYegyxC/O4BOENfZQeFzbSGJ3qhjWsda10rU+7BTJ3eD4oFojkcc5cGtB8RB3vSVW6Y7dNbBFA6saF4qSO5hl/aGrk9auGNFJbxBvYb9ROWV+YWbWaG52gH4QaGcCq9f2At5Wq67U6iJ6HsRADgAFIZFSlatMgcg6nMsAs5I18EwADD9c0zCDdfHwBSBNb7szDMgToD7nbEOUf/ix4UbvTkCBrXaiA1L7PoEb7MSAV8hWojiexhPH8ZNZ9zvixTS7vV+V2LtZdQu3rHkYK5njoxOvFQRH1WtPataxZNMAhWjDxAQ5lioDG9Co/g1jNzOdcwpvV3DIU/yqKRvJMnCoOqLE7nFrqJ5ayvyO7AH4Jyvq2asZCUsoAgKxZRrkiXbSpeCuE+wXZwqNXD2Fojg65YLB2hU7dlLDnaQT51PSJKSHT4vWy2EgwgcGPGW85XP6+88FTG1Vp+roQQi/KfIDb6P4GyW6GgWXigwytFbanv2M31M/5PmvR3fj9aB6cToZPTzAqyj9hnNvLh6DxBvAAOrbLn+1yVPRBHbUBnGCJjedB5c0BuhSL5LDlp/ivMbleeIXLn+GomMDjONzbRPKkwpizgvCiXxaio6gT2Dhu7//+7x3KUMeeFDHDp794pg7kaM87O1nOWBEyY0WAgWWfHr+5rQRXRspP4T7RHhRGBNIuX/DqMvuv3B3Hg4SSxSpS4IGqHJfRHjGKWe4whSJCTIYLTW2iyYpUGvWzpzl1hUYP7fGbE5D13NQAGMcCxSsH+0dtpIB7LpND9mJaxDAVQqC5YfXDDbmNqiP7sMx88URqSjSGXAoC8apDzZEIMx10YVGwSL8mm0LnV5t2/85LmuJ+v1oIDIzaYAePIUG3qmGkuvHWP2q5Pk/ySo7CLkaqSj+UiDOn9wROOcZ5GuP4+NQKxZ0k8ugfNIk3Uar9V9D1gCMw35icm8Rp+PGAhaeHJwa1pPvlaKq5mN+V0h5IJAaQIdYu/UGpvITviu99Dt+8wo7fvDoDGwd+uORerXdYPMiUWrOxeFpC6+zv0WXpcSBnTDmsE5obPK16MaKWayutknrV0MK35Tp/J4IARP/A0abes364m9e4wktB+I7EgozfgEXhEIMjY6MVyH3Q6HsIPUtZkJDt9WaYzZzA729UaHnsnrCLzp7Yrc9OyDmw4ghBs5sRnjxSQ7c4qq0tS7W05E6FsCHGtQPSMLCNITuOxbijeRjl/ZPZf/51mmbCUxKvr8Z2ahxFKTJEPEFXBS62SVQlByGIMSSX3k2UQ/rGFbsKR46t+AbjqoDhl3DNesfgC9Z5pqv83wTYlz9Z1Pv75lR9Al7Gg3sB+Rh+W/yP9CEoitLuPSWKeAPrh+xvyEP6xn5JsTyqxs8hQKcYgC/qPTsjj47JOsl6MEllwF+DlcvKfYwehM1Tt7yGhFPSHNTpkvotz6v+zO9J9UZLmR9RIsa2rtfNR6WSyFltIrWRbP494WtEs43aZNUoQ+Gk++2/Auf4NmIEbY6Pf8cluvbajo/AP1OwMEuX7xixA+/1Jj1fNkzaPBrFqwdRYJIPQVbhOIN4eJw6r/X1y8e9l124NRFJqkYeyeRrv8xgXNlmZeB7AAcPEF7qBBHbDaZui+v5K5AyRWYByYJ/kT8c22LYJMHBR6K+LvymN6x9iE9WP97OeUWSu8uBJJeilPt/0xkdymtBglC8diwb3LcE1SQ7C0a7ElivIUQBNLqEKXWWqYrBZ+Kkw8Fo4IEJRkgWPECS6NpwTNj8yBgYDJlIwWJJCPC1XIi7kHnOvMHf+kThHBtEEmmiP3LC0CDYpdufIGf3x/bACx56GGPNQuEArUBq2LjECDqDp6AWzWDrXK9y41z/TsNCs+HXX+GdTcn+5qCrncBQO2jzzpfHH7LenxYW9IV96cYhnH95VLLQTx+E27pCpnZ0ZWwA+WzjLfC1I8vQFJX9BGw6aBj1/LmWLlpWPCbogssU2NcXkRzCUdvVXJgtPc64k+eC4qD/kvjXNMPKxSNOhzOvhMUYCZahWQDTuiwbbqMzHqMhU6HEkAn96Oh9JhLgXuC6D1oMws56RhJojSP2l93uyYAmzt8ZVSbiPtFZGdFNm/AEBvqeJiGzApYlnBTnPzbKOFhKKA9y5AM94t6ufdZEvD3tKq6w7ekDzFA+I7QQwKYE5SOUgkuQOa0SwHRJpsBsLrjMM3cYYX5cDs3PhRQXB0f/taDGKK+aLIZZg4PKoVqyLMcHrIB8jooCndqGI1l3cy1PA+gMPZY4NltgZs8/NtBj0SkvzF8Inc4Z3BVX81Ws2jQYCiE9srn55fX0fxpEZ2fsM/IRWZYKx9KbfMDXUzjbfsij0hCw8h79WFvVz+wKWCH84jAYNyrj+rGZgu17cOFWQLEOVQnJcu4gBsnTFdYBH7KHuHysje3CD/N92Nw5Z4pHZIzwtoXC1UnW4/0hq9h/a9Vx9pZcClHxlurUl+ApUZeRqApIgcmXK2BwbOBnRM2gLRUYgz76k8yYGwRcKKEaUK5hHqv5MvF0WTolLGqq97H/wqV4d+9MkBx0X4xBhWkI0etWMxaHfgHtNCHxNodn1Y6wAVck/1jZ0fLQE49D4eJFehNsy6tKSL65LezEkkI1xG5qEmdNSp8N5TrIEobS2+4o9dMfMW6NAkUze/E3xWjrGFmW/Nz3uBnJdvJwQCjDBR6GA5vGCKrZSDaICaAyckmCMlrTa0HvMiNfToAGRWmUcEG1py2+B3oGeKORb8EG5Oge+ZzoVrg2EwyAmGcMJhTUbgtfGgCcuzfnSVhZqii5Ald02NvO+cT2SwtF0G+yAt6j2+6vl2b1rOoj4qVzaBsYxX6uru9kqlmURkF9Z0R3x9pJyTfLWvHAVSig5daqJVyUJVCaHtiDUBD2KIZha5yL5owwHhr4Dx6m/BCDJg7kn/GbJHc+uFrfD3k4lEch3IQUOk8RM/ruxwMhFODDw65vRX3NSTvq7tUQFwOBkMd/FMjLVRzci/S8wRzV9QHNSOUhOfBj138WsoS6ephSI5nIzh/3VilRAv3A37n4C9gnlB/QSmDbjO7buu45418tugykm7UtmyWlC+RWJ0sFmnAbpUV29dPHplrgooDXjLjwoA+ulfO4TKXCxrHCzltyDzrMyEuAgztKFxsMEenmL7IxKvTWVl2zxeuRRYeW4rcFnAZDRkPyBIW68vGzLs1yC1UaGaVcKm6RIy/3R+IM8e3a46Q2InrznkAe3ym0pGej2Lzoig5CRGuRm/oWDrCKHiCUOVUKL7D+YL2zKqSu7saKxyWElIAcJ0YPBlvI3uU+M5bmNyJINnbLbI+kbXIs29/OU5jcvh+BeEniio6nThVQIBQCGNCjMMEwm+62YQQ9zwRHBl3yAy/JlqDYyle8gE5cHrccwKc26n/4VOGl0g1RPTT4gly5EBBqulurwI90IEm1FUTdjYQKwQ+ZTBGVgSr06lsKCe5OSiTSDGqn/jU3TWdd27u+UeeVr09tud8buzRRXjpEgFq374nR3vJyGJgtGm9/8DmAliHjiXnBeHnGtO1KhWl4aa+kLBaSBuPLmSrgP7tPnM/CwnK82SeBN6umbyvq7Jf1VBGqKKJvkXTXmQvXgA0KWwEpQvpsKleMyXXzXjst5HfzJFvVp0+Td6lNXg9QGuz9P0VPPxYBMoodgJEwFglm0/dynkPYn3KNGNYAKAyELoTi6GXUrmxgSWfixxsE22ppbrxW+Zf/Kjj+0onbN2A5UytKNEQLc1Vc44SiRXaWbYUy+7M/6fom+V0/EV/cvRoC2wOGqrRkc4B/A3HyoaD0HXLu+ciuLpJ0yddwfBIqUzemUG0cA4CnB6LIXkLE6GDbDE6SOEY9GIgVtDI1klS8PyhKaGEltfrGnU4kimKhDKtyOxFCojhZijDEnV6LgTLg2pENA37s2lG5cKbYuuoBU4ZZdmjQzq1hZNVoKLy2Xojp+xBEo8UbrGVQ+UFI+/MIWkdWPH3WEGGVyAzy/UWyJGCpLMp1NqaFmcLC29hk2k1Jk4swXLiPJB8mgb+SjJ1BT0YyvF3p1ZnPU/laV+eqmagQktoajWBiugQEe25bJsl30aBYJIT/xc/gjwfxIJnHg+j01me4Ba3izMch+AXHkpyFLwGpVvVmoFMBy9oqYc0BeHVCGKzIv55MHgNwrxEBHIEvmj/Sm7XEIQ8iYh5+Syh+eGNoRiaafmKb42EdoL0qUe8F21VNzbbqO26uO5yS6kauHho/Bw2joNt/fb4+IAuFfBShx572cph2Y+8/xTuYwdChMqvOVUL5Hrd83E4Qh966Kjxz48kR+7DQFzm97BGgMGEU0MoxLbGmUdrQUxqQ855PAQU3s/OEiNFiYAFstw+BKQojsYsCDwMD+Jg5SHbzWInzqlytqoEubCpq2NpauRyOuNHztaVhc7qznMuKLfh3mMaazwq0ZXrzJEpdDM6tcgJ6fpUy5Gjc1QVSdS5bMv4hRVb/vGSmKQGi4+mFsebEMdhevZZ9BvFSWUNe3K9gs8zS6IiG3FNtA6HtUULMUvTBLimvTHIw25zJDIeLtGi7BffgAtL+Z40PUUFgTg7LIPAkbwZzptzBtSCLfMoji2j32kJxCp4KdTp2ukwvhTFsnFyH8N4LcTMv7HhCi+LKOvuNgnN9ZqHFaE5BGufLxXuZz4ZCTWDo1liMsgtr9XEKP9hZ9YwcGYc1k2HSFsoKXOzuO4GK3a7+HNQaR+GeQoLDo+dB+9SZuPJAB/Eq0FWJ6q5zX55xV3nW3BQFkSZVb4rpm4pIrEVBcBC3YYl+8iXUxSgshif41qjgC8ocytpphfzT/lwrtdyRYLmT/RBN0WakBtnbza7Ocpz7d85bgUQ5jnFJNCadoxMjM3hij6s5hvWOPYBohhpSd4kFmyKO2vmKXjAtGnzNYo3e8K+FaHLt6HuWllOzmHL7PjszRCufaam6F6Y6hPKNkqpfVcjTk/ZVHlh8oJYGjX11Me58Nr/un5/iiaa2T5GgxeBJUqxFK1/Q4GOVLBGBn2fKlxwM9z1SvBG/f6gvQKXET8YsXlv/NO4cY47AQbVnhQ56uePBaK1CbyMbLg0fVbk0wxDKc/Tg0kIqR0uP47L8kOIfGckjyQJi31jMYALlLrd0E3/AYFW86XgkIsdL1bKZrU4F9euK87FsIjHDLoxTeJPoLpYfheJKr9AEyDRvuCia8t2xCu5XMlgENo7Of0mmnynQWCf10QOy7vOc0kswwbwJHAJTS17/V3tc6hFde2+IIcraReDwrmRkv+H1528OUMl210ntOgQ+6jDgMlfyY8fJsoQA1uj4SBSEMn328xYJAExfF4AlesmC3jtzOtKsQw+RFAu+EYJljVLgM6/DNvv1mhBGwBSDqwME/N6OfTNnatXSEULhdkixn/b3NDgXwRP66u8Im7kzoEEOG3aR2gO83dgZNf7kOLwTRPO4vOVqObnm8GI1Q+Dw63VUaM/Z5MRfrdhn4K1AljyY5bmqJoJ3078VvINsjhKBaaOSyaF3O5N27m1aDbf7QPdC9wlUWK5P8L59nwu4Ypnetbq9ikxH5tw1Hzwyw9eCVNRKSJhMGLm8p2IdENUq25RrDa75G08D/55ZBOIn5FuesdFf1uFVrLdJCb+kqixpqic+1V4tubdh7kZMr1qeD4WLlqGcHt00ytbAW1+QydyQjvezNOc0MhdaXgaB1mEzsG9TuzIl9Jl4wRIRcTCIdPnM8wh8zEcvn3Iqto3ugO6guH1y5VLH9gp0Qs/5dq7JYdtGZ55jjYLZqHCE0KJ+xAi4KsjACDoWUjpORX/OMgd5OLQuhYAmqyyIDALxreQRlrJQcl5y0LZTKDL1d19LtV1t74RYMRtw+zNWHWS/4dVq/n6p5HT5XL3ipSwzs1ucyu8D7wh1S0gzuW2r5t/nWdNdUBEKekDOQUNDl6hbLEaskRY50sjM0HV1EBCSb2YiGeQvqP26otljcm/dNWHTCOhcdUwGoCg1TQaN+AwIpRYLlX6LeTVnp11o9kZHy0+QcPZLtAyXOYOEofy2oeQC94AegT8bbt9IIwcltdTSJqJm9tgk8NtIBRL0u3E99RS4IOIV4nptwjswqZILJ/Gvp1gjdiaKD5JtoGiWpMDndwgGFhemhfKaqQDKVm+Uc25XubLg3XhK3f84Yl2RrVGXv5sqvickH2twmJML+qclePgl8p/ZvZwf9xEUeQYp93ALKK4+gtDbQ3F/1DCTsAhWUQfbSAH6vh3gmY0OK+D5GSI0JyEtdaH6Ju/34LokgNjSK0/hNOGABzsJV/H1sdS4scDGBpFKumTIAzd3GUpj/pJnBvnEHQcYdQmcJ4oGVNQdAOlBwqfuZDTp9rHNQRBdu2PGi7LKYHEULOO6edkUbuA/+bQIr1/RShDVWn2reyWPo0h+ZKzySjVThD7GkBYpZBmVXggF0ccpJ4fsmeda//kayg0RfXUHzM594trOjeejcyuzIBc9mNXGAmOejZQuIWZVab0qPttnRLxeLox2htCEen90mO16fMukSASOX5GP7RAOsaRe4OhAyB64bRTGlyXZLoDa+qNBlN7MZBpwcp0oF2UtTTxxRo2U7P1LOReFyTEexTV/2eyreVezj21YzTBIuJBDCJSRqf6UqT6x5k5cF8d31zlO0q6kI9KDwzBIA6TYVKzhu8ZDFmEDq8hQ28SRImWcd6aOuNedL2CsCmz4G+MB0mx0dAKmfvGOdrWUk7ejRO+kFn2vjtsPswXzeOhmr4r/5/eHLdCNRbH+UBwlOG/Ge4PcbsFhNlyIWsy8t6gsWkoG9vcBg/t7Bl04bHWz1DpsebPECgWhncu+ipmYB9tiRREIO5Sh4SH4hDOu2xhxWJs3xsLgKjOT+ThRNuTd2PwrXHfY4oIaADu3vJytuVXYC00mnDHtl6u5Mo/J0cfjLiYjbc7jvxqiVo/XrSh1DtKv/O7JPjzO6EDkxWBmKDWX+rtb0wY+ZPzE8rVt2S8q2nuGDAdcr+qp2ppcSH2zPttx16Bcw/4dtgs1ehKOWoQtXvRyLdIH//CA/pSkBmlankvYbhIcadtOBXFaDZn0CQRJTKpdUkG/ExRaGa6+M3fZRbXtRc637aRJEonYiWSu+ScvbhvyU3ufsl3TlH37HWfkS23f2kNLRbozffV22INk5vm8dEinA4O54W369m19xOgGAOSK/D7Q7h/pJABqZZYzei39Xbh44fHyT3+82PXt4EFDa2SDT+Wil1JdP1paoYobjpvZBCoMneNiNdWlKnlGQsJ+/lg3uc/oCegdH7tajDsARzWrWRXhB5x5BH3j17jxv3onSRdsnwfQi+aKj8QmqFhf3H5TO2WsEHEWeke1Tlau2HpLtnTzBYQuZKRQ8ej+fYYOiaTOD0jgstyFrFq5inGdFrF02e0Rh4UgryGkwKj31iCbfJcA77nZl4e5NaRBdhP4ffQEhUqf/r6xhl41u6kVbqpx02UUqvIkpFRNsC3/dKnw3bzCQ3DuxZXDVHhOqYo6OIJ+ceNW08O7eFwrx99rNOKJIT8r6UjmrCV9K2JFv105PqZ2l76B99T8diqN61wSZc8OPePbTg2hGHIe6smtkdI31Q5PTFSM1Ppynv61b5hr9cZqxbrvtAQpQKkDMCZjS/HhlTubj0C+25kxgSSV12HZvTRbeJH7m/aHG1v6b2jrr7LX0A1AZpdvF355h3ndPp+HMsEmtq9uUYqMfYmisEcUyl3f2OUCp0GYrVGhAtog2zxtQ7a04dRBPDqTCyzy3MzYGjWVXe8TUjaekpkp0ACIorFUM9VHsRsVv5nF1GfQwWlMmpsmEmaabVGr/qTiPsBl9qIGa9lDhSFjTZ2jrekaVVC+/JtFQ5SmuRd1W45Mrl3rSpXqReryb6s4QSZM05DUXAvIR+VzyBuAnaS/d0L1vPM3J4EMrA2lmcX6C09wM/l/3+Vm7uRwkyr6KPGLQJ6UVJKFCzLjvgCpun7UPnnnJ2zuuKoBfnLDkM+jV1OL+ZAJkw2g46L84TY62LDZ7T4cOuzpVw4eXpi7Rc7yM7BhMA7owMQsslaoHehWRhU2e39l1I0hYZVJVke+8VCEFPG+7kY/qpSSAQiTaaYIz2qKQ35IXJqCVHTMMUVLy7q5qoPwIu9ctaeI9y1REqdV8HqIn2QcLb7NTjhuEHryFzDtFsmGiyFz6mxel8sAjPYtxk+QfmqXWoSePrywc6bZ9QqrJznp8bmtTwcRVr+2BVGD7TQkd+XDWSbk5AcMOeJl+2v7Sf+D53OVdehg9cSL60SwunkfEVHbw0eaPCZD4nlnq4+mKhUl3vPbGXHBUvkTcTEE4pt22TaqN9qUzoRVEkQ82F7cfo7LcPF60yJfNO0twfp0a6ZW2cuWizns6lVrhGuAudVs14ajcfGpLfL7TrbbtfgQO45u2E07F3LG8Oxb3aE+UiKFQj8g12+fwxrr2glilqdrElwK/g8MQR/5RvQJCqa2see/pHipok5V3WS9VBrBY4CehvDr6E2CZYORqoi3lBGNd688+Ca/WyRuLbA26QoQDImMpqEVpzmCp5ljql7ituwy4EbuJ1k69IQLPU0uxEWPWMtz4+4JT8eF6Cj13zH80znymzu/vwhWx64gidQ//JITKqC8Ak8pAsl/4gc4fQ6VzsGPs3M3hgJUZIQLF1hnNdB+S2JpwFri8Ip9CJbePD6chA+AnZgJomdKTgyGL5YtyfQnVaxyksWRC8m9cOFPEQTFe4ddZI1mxohPPESZO3SufBbDbk8Pcw97RzJC6LUNqDelQRJk8ng5YyyXjv4LF01l1MJp23AbmPknAa0NJYvG2OzBZG5yksMtyDoICoWu5zDBSAYdCD9jXsCRbuSKAtjNAfYMvHeUsPBLWA3bYViO8x3iwVOAjs6uYtys8DJJQRiiUYB0uW1CODlvu7VpRGm7QpXC1TqQ2JcoUcb2LpJTNH8J9mahmrVDpWJtsEKJuJtJ5as/X44acvhzrk9+rqNtsh1XSdzc0AlgXKPgcL9Mur7skQ2HZBAkMCujdNGYeTSDKoV0tsdkY6REDwuBQm+nAwaJeE4pOstL/r+2VqowQwdUkYfYe0QTSQ4A61jteqPpxmJTpKpTJKahD3L76/5HB/vCrMmUogipffpucsaL98kUGPrCpw6cVy5HmHjWMmeYiGXXIk4mzTJZ9BfXUBRZ3/mi3m9JH6bThRSot6ZWKlvsGMimdo/nruDW3iiS6cOcl4iJEDuOrVZVp8Sw2rPjMtETxHI8YXmIhEyzM6R108l+u8/M5mWqdE3o+tPdSlJO7pG7j2cc2to3n8IUhFpXBolPLuPzTBZiQMqIy5cG3JeMfFdcsMf1BAz30TFmf4+BYAWqo2xiGvHKS3qoVlBRr2wFhXPm8EULno0IjgOiC/EUrRtDz2sIHqQtMK2iwTpM3236mS76uaaMnHpTVEQTrvAIvksSqwMIB0Gx2WV0bfbQ4gX3zdYksNbz7xkTA/XxPC+U3TqOAJ5m1CEm1q7pHjs+cSSkoyVAPV2e2ufVJ94iqwbkH3dHMwyltgMov7dSaKgEWXKNFrJbqhUz80OVzwJcqcmwNa2usJYmgPR/CpOb39E9djfqU1gwafyZAwHtT/0XbLzTS1cWUqiccG9Sm1iiTA5xpwLSU2A+BQ8xsFFaCOM8L3esWDxyriF2VOyRW4m94DIpLm0/kBHND2q9ETom9oTj8ibHvKc2mrBTUl1Fjqkx9hgJZzJBTU4A40MKbtvRNIVaDkatW6OlbK7QHGBumuIUog52WhabLkRADiRZlGF9SO67ODkLPKdsrr4wTXfdM1ruTJlGe1uQ0YbdidDV7MsM6g03IHLpIdsKBAiUfSP6LoJvYMFSMDh+AY20eASj2VrJGoT37ztzGtW3ukFv0IoWUKRJxukAr2vhT+H53ph67DEON8xX6xk2NuV5HJHDWAaMIhFjhgI0WufkzU2FbYO1YDFzoM7eHhMYuook1qB6ADU5c/7Qngu/Qhm07YZOg+hkcVEw43uGAxbd3QYHlxLZjGpUWctvozdU3LsJI3DBEW0Ur+o6wMLO1N2TofdBvIyt1Uu4Z1Tpx6EgilJAd14xhv7NU4edYHaRIHcevENOJABkqL9Y6QykI4A+qjMYXE3NnlFQPWNoqPOPDNqdlDwW6ckAiww+xQNIrLxY/+IPz/dDZ7BtruBnnczOCophginQPVn1LklNpm1vW43htMcar+Xg3hWdw/YFgSvc3Uf7baP9Ze8X1sd7walbSbMfOU6OmMdnz7tVEC7H3xpNF215nFLN8/r3gREjRygPs+CrVd581qbTXoV6M1VdvZUpHOByl8glmj91l4UvH8mT1DghnRX32HHVztBeI0lAJOf87fahWUybgCJun6+XmEytghbYY6F2ZK2EMKh4bJlReET8eoKRejiLV68ysXguVxvEVmBupBHueCaKsCuD/0OsK0fAMULt3ABXXoRQNdUpDHOF7fhQsxu05tjyRZmruOzX66wL8bCt5j4ubxsCvr8yfa5f0tXKOWtZ5RoPGlB8mubJ5dtCKbdNoaxRKyIIGuKW9Ddu6u5xouoccF1axS+XjODfwlnO32QMr0IqQvosgsA4ZqK9FyukuIQc8wADKKqPbHPPyaHZTNNJv0lE/4M/S2eG0BOeR/niMr76yN+WS+mPBHCaVYcn7IdfmlpWhLHZS5aKO9FuJpvYYys/r+t/rGerbstjbpburyhmfoj+AsFcsMiKgt8wG6LCs32w6WMlTMY90nGCW5/rDtLNmVvNuaSHM19kmGC5z/W7aeX/xj7XGVmX4dLGSpmyPyaZJjg+Y91sZSnfDVnViQZ0MA5SZrg+sc621FbFRquABD/pYcYc5GEFlWzqKZ3dI6hz7LnnC6MVp6cm6S/j3OjRTEqdeFi0VSFRWz3vjPve8X4g+5jibUZLMGaj0gRtqje8NDEsQCwAUAhasaSkDBIjRjo3thJTRxODA14MfZnYowQDwg0yZPJxIKjmCBCBG98BafbU068UFg/wQpN7b/U8nDURg5ZCtjgnA0BWBkiNqfzxzNnSTgTpRPElHEG8tzJgvvZll5jzNJ3iON6uZdXgEcnZ0v2np8eGmDnCzd2oVfMTi2w/KwReS7lGC44368b+Ark9B5ciH8do3f1tixyIDzzYQt5u5dvSzWISlIhlnDe8uPRx+POz8YCmHUKtsHE60z9RG/K19i5RqE5rrf20PintGHx450y70qzqaSAZ0pWokkrsRaB1kX2sz9ROF1pfU6ihdVKRf4hSbwI0rWV+VzUH8M//nNiyk25llta4Lle7OQJimlhYYHmLY+4tJ0DxkSVXWheGWhb38oXBNpR2yoh6t3MGuE2yj0t5nz8EIZLIffJLX/sO1tzMVIfPGp4qYXJWjXQrTGPd+EDzOAw5ZDwZpiQhj2199A7Qknn0dkudogBSX4W1JOdul3BeHfRzNXXTmh0zGQOS/tpJxrcudnOTqHAp8tpXab8c+crQTjuOZz1I4uVUMWQvNEP/MPQGqL4FU9paple1fGE5mCOnV3Ia8D726kGXAnUNmCC0osI6TkS3T+rln+7UcbepiWuD2jL5JXrgiQJicK02VoMmOC5GayLhayq83VdPJ6EKc8G/YNav86mNXl57f8KPLXpvvTz6eXjfbmnLvFiV8FDZ1h8vPO3x3RN/6roq8RULr08cy4oPyJ79bRdp/7eF9IRLsfpe6l5H8c4VZ7g+sc6pqyEcJp9jusPm48ckdIFQqEQPWU3KN1rP/9CA66IDthUURKZXJyLaSYqgfky+KLLUyKmQyGIpk4vMQJd+Jkzf+QeBYBSWcXCwpjcMezFb/nkWmqgQYBVYuKrAcqOnk41epsfHxARMQoeJQGXbGm8XFVkznVVEMAyxynKqdBeLdhuxXOehBU2SoDyFhZgfdFqkvVMPrtQ8g/KXyVO0G2HD4hAyH34kDzc2Gu9KteIJPSvRpWrJ0oGc8qVuQjPBfcTP1Aq8cm1215H/EHJJsfzFYVGp3HXOSXUbDR/0c1AdYzHGKhhLhttF5Df6k9xCwg0wXP6hnVY5Dk31IG/V3Er6A5rlXTSMeOcx2nz0bFxs2pHbVEeILMAvbihEPl85wYrJaIB4UBQR1DkMnIL1ZWC1pnIpHsknEVuvxX42Iv1kiBv/VbV5BrxpiKXYPehr3+zKmK4Rh6UOKe3YBBpoJkyxoq4zO27a4bdQ2XBbkmaN/2o4j6Y5AwXXNA5xrEXgUE6fWWtasFv7b1kOYpfNXM7e1o0R0NdJ7vYg1hzSXiI73cVbA575S1xkoVizmP0TnNmk7w+3Af7OoRU42turBIgz49Xl3GUqfpkOe6bFNmmH2xwgKZkoUYnFcFdrawsFadUc9wSFYhVrsqmuCQmAGRMkcp4CxCQVZo9s+8Z0jhLsYmP5KgypIk2P1sBFwPi88ZgeF7MVIfymJQ1JVw4ILCdjps48zyQcID3YG2IMyurk7X8+I9kXFVQKRtCjgGn0xN4GHyjukVgXF5oRqymdf+Pq1hzIAqTgt7AOQkBR6x7sKANGTvplz8CJE+rG/xA6jeCl0vuFNnrUmkowO8wWs4X5N3uWSMYOsob/2pkuYdMGgmkG39hHVhyij2sK5Hn0jCRwBuAQIyEcMKNtHJEl0ZCNI6sXqHblJU5VClJ2EJGrBWsEaB1dVwzhwSsahaiVuaCJBgzAZKdIO4uCss6TbqYaxFbjujfdaKQQ7HfiqsGc2bUhYkn1A4ZnQPEqe2dnReiVihklzju1/Vig4nbTeFtPzFfUpNb9KmQbToR5iTxZQ5fTUcsJcN6zmCT+BUQXgkjiflUDoaSlYKK9FCNM4VKFVlnEnGBMFbXzDGJ06hMO2uM4ZINb8CLKAF3JWNl8P1/l/UfAPEiZ/wyCLrXuA70C+lNuNSmMPcp2O6fiIMjnWfkDRkJ3JRA7JXvTi2OZLVHklYjyDvGOi8zvKRIyjl7jbT4W4DtZuM9nnKYGePJxAha3m5PXBAERQuroUUd68BQiRIou+OJrLcQwVE7bLHwFkSN6CW9qxkAiKcIIxf7WgVx1Vkk6UGFEw4vMQtfhzJyYhj4g7zHsOZNWxx9h3JNmo7JxY/JO2o42D8IxzuqtwQ9CXQDYeGR5Yh+RX9NE+nHJ6ZHi6OuwZoKUwmmP3zNbKhAg4L4cIUBawLUonirH4wPpFrQCayiSPQudyVE6Kb0XNj6SKSX73B62dwrJi7QjHpTKV4AnnPEa7y4UO4LvRdgfVC5/f4Jhtt48XyvhGTyDo5EICrJVLDWJ33wuPK8OyoDUAPHBKGN3WGskIydErNndE7fjPpejs5U+bn6GrzVX00il03/sih9Svh/hD2lg/42iBe0e63URSsgLhm4vS2xUpH6eXxCB951TiQZH5B3E2FD5TMtban6/054H/xNU6M8zdVXCgEWL8DeK5ims4JeCJCi/FPrOqHOGGLUAnQ0yKcDDYrfNuI4CWAHFmFw/Y5OdqQeJQKHDOwnW8sBHx2I8dh+0CK6pcCzJxrje79N4D0s0AOOdrZEvt1xIYmfAk7bqN/ffFn6RFyyRs/fEBf40myi2RARgj2JJll4vNbe33eSe1EkA6+1/8coDZTOyY7uNZ9l/8ZI5Lr2RAeAKrE2PlNCH05kykvOWVGGmvCufEGLWHw/O+koYgDyuRKjMlTbK1Pv7xx7Hji6h2HxUyVmYwGa2ci6TGe7xmFPa/fe6r4GQp2gSDxhQJk0Hb0eUYm9jHjBktBE3YRlTS3AjKi7P7F3IWHKySFndIH00CFlyFYYt3zuistZoCqlJI3xhLfG+pZpGr/yyqliSieV6pfUCr8D03vPaAQApCoDjPY1aGWEorzRoGFhlcyKudkzhbuMNs6S17eGwso4ydWvX37VKPn0TjJhJDmkuEAPiukbZupLF7P10rBQnZucwqUTi41oJaqH/nbd90rkbEDq4bPFqEgeDizDO9JhQw7SvNR+7eyQ+FHDxmJUtNxi9nH28T5zzpN+zjjBd5i+FWa90xnvMfu5qDdDg+RFehveoK156ikHlGi8unk+7husKahVUVFvC/HebAoJ6FHB520HKSnixLAxRaejq1TXOtjRtunUFoTYajEkwEOR4cyi5W+/O5vGpcDS8b0/PFu6OCJAUyHj8ZYTapngdsvlGgYHsWM2iZOBHe64EzahdFToLuRX5CcJo+0cmffpjlgGBYY840KZpxz0/KUdWSS3E8J72/Ufxc+OSVJEbkGVHtLWq0C+7+4+3N6cLWXpeUdVwa7gbUjkMELrUiHFdhjPkYczAKnoexLHtdqpYAroYnK+5KAcdrgcDe06hxjlz+UcnliQIY2bknBIt2LL88pWYZo1sUp+Lgc1D84UqDCEWB+NBRD56EEK09tDbUAIkz3neFv8Zj4QBSv7/ee9+ntaHb5NsVbA82p2KUKY7qO38vwtJKi+nHVqiFz7upXL7QMqimz3jTFqolGfJgc8VS8r5Y0CpH5Z8QMB0tVcTPSlDOuYb1sny+RQulzKsSL1rpHoyqUHPpZsPY7hRqy+ETI+IMi+QBaJx1YCVwnrsFoSjHxCR7+pHR1W20P2Y4S8kCUNwoCrEfz4felz43aFFDJewkEFOlAnEwsMP0NLaT7sgtGdYl0huv8dU8dw1qfzgiUQvmvJXOPLjIe+kd3xK0kNxPuZF3jFdHr4nRjtJYTaFjXrNXR374ymjiEQpQvHPJhlsV7WKHhDRtHCQIRv47wuAkpHIDEWWV3keCfgwgCxt+5D9oOTxATEtkhPg7p0xr7DUUFoKISkdIOgklKvvpALqNRI+L1HiWe2gvXPrYAdkI3b/QZSXGOAm+9V5uaFj69Ybw+zxtpJxo7qlSwjbupmyUBEJKYtzGfyuyLz+wZr/HOSEz6+/haZl0i/AgiD6QWIWDUuWlJ1hJeL/NAxLXY1+PAW95fb9uMRIiKgoO7lhLQTYtjY0fs3qJja5K0XSDcI9jLZn5rR4skLW2aV1726Avkx/A1m5P9eNeusLpj/cidkxaY6jel3qk7aZOtzlAt7C127Tmhkk8JTGHvY9JVnc21U/477z6QmDS/7s66n/ZJ7mgbvi+qYBaBC6qm+9F1NolVIcEp/EAshIq1PCGuwBVza7SYJyUbNFtS3jnfzclR98b5rNnkGaNKNzNtzpFfh+nnS5bAuSfWgO+IQCUQsf039/sIvFAgxA2vCSddIc7M0T+AG0pxra4PWdgTxBL5Q/T2SeaRM9OQcn+f8V2bXYHsm+YVIUbgkMo63pjZgpNZKRraUSB5km6o1QihYKT3Lp+em9mthe6eYDP9ISfEBOcuJBNNrIfQugjArkbAsr8Xz4LR9iIqJPStgj0oi1w9iPTWhcSbbqdFvpHpZjwGCyw6ntDQ43EuFhR0VPha9eCJ+wf23+3NNNMn3aMrkdYrwZAczGlxv41VulD4dbLE49rt+dAlQ38+I5FjQnAqWqz36wegtwqE0SQIMWWOxhJGUhFQ6tv6V6hV+mM5pJgeyL0VbpBsIdcVWWBLmpfKs2Q3QMHbIaZdL2VOjkhuaRsjuSn7MW2FbqaA+8xVy9RcsnmNReAGa9pUJRpFUiVIJolQo13YpkGVTZlElmJAPbRPp/KtD2ny1HbISwd6XAHC/RflvukGBxWJgxpZ8SMfsNZIMc1vBErjIxrw11zoHPS9wkZwaq8oa1c3ARNs/QTV3+TNKV6A8+bQ5PyC1atMZm5h+w1WUzI/k6r2gwQ8ZPvLJHygQTTu0Ld/iN9GWSD494h3yYoqIVuKPEAS4afPhvApqfBJOhE/s80A7MhSgPQRZopr9b+cFmQ8FwKQ5IfpozgK+gZ8wTDFDf74orrbrWTKDirYHPi70ZAfI8ZCNmagRj481JmJ7Sqcymcoh1FJfPkgH0tczpfcleTRzCjuwKfLNhkv9qLbOPLLFy1A8cGTpvzT0J33p+s4FAOqI4F9ouzvbrpYSqc64GYGtzu9LclARGYHJRa67KednE4o69AwEcVMMf53Y6PksiaJe7/IqcoPlB+SziFnKoxDRMb/WEszQ7UriLE2U0hfl8z/Q9fDH9qyFnKzWD/coMX7rTpYyyWtPbC7TiPWkajMI8qP/m+8csZhIpRPL8eEnn2/4CYEFRrBCGU9J+vuIwF5botjhXEylTIbleLyDsxjdqKcaFO1X/MnVTVarc1XVJIGfRIQTcMN3aKL6iB0Dhl1e1peNHtYXlxfai2G/VA8ra6Ib3Nkn63f9z+lrXY5vrrjbqtLpA7bpacS8MKxsM+ag5i+1T0g6bvbpU3frPYsBQJ97Z1KSNgcl62jk2fqJFv6H7hZZ05NM5azPkjgt42n1gFLD2XhqIFksdLYl7QQrSLFrikUmkhiS03tIkadtl4fVbjmX0BxXtV62FmBLg9zpIKPG/2M4lBmifSH32vruGbyPv8eb+GRLQV6lCMKAMKyDwN1LJsguKXafkv84l99QunnU3+3qb7p4FAz2S3lLUUTUmRSm3PUucHfbAmSyJCTZBxj6DCqCm86/axbFb/z/nC5rYcjG4dSiUSDYMNPZE/XHYe17ORFxU7CLiVFGpJ02CVJC9bvR0BuoW0TMSWBM3Qj9NvmoAoDYNzxGozjoYKSGV/lA39rYovNXyz2Mlfknqx7P33+TtDzLn7b3Ezqj4hfwl6GGGQb81NOQ2iQQHEsI9P7ZMjIn45GhkNlf9TBRcDyXaBDghc7f5IqKeMP4Xzee0P6E6ydz+r+IALm1zv5jMk2x2ArYijbYNTELAi8bD6MDPOqlsx+f1e8SPrYwNrXLlEbBNeS4psI7n5JD9BtT9IJ7YasEq0y3XBsxn2vkbUn++xFLDwwo8kuE3cW6Yg8CpzD7iPkRFt8owKqjoR2Le1sAivxL7hEUSHgbHJ/XonrSgGBrLK9euYFZ+t7BmVO71+S6mSMH8fa4/U84Ei8U3HMCpyn3TX5uya9P4O8RQqrYK+7HgD9H5rdp9y3HvQISvh2b2P2stwFhpMhQ/34NDD7l+TGiKkGlEiSTfh2k2FHu9g3JJcaEx20vssFjHxuC+t87MCLBu8dSdtYZB6L5ejC87IRcHOkJ9KvQhKtsADPuXLAvEgXHna4d/yLRYEUvwDMIOA2lP+4cpiav+hqUQKXJ5MBgCcEPgUWBc3BoZAj3lcDXqDCpTFGZhgTBiTVGyAPjrA1u6PnVUB3IZ6n1Z2m0hvcW40FgH22rqJfa2UCWoS1WsScyBRR6SM40kUPnG7VK4qGEmTQVywDCsXKDjGjyKGOKQSzy9WWUWduimD5eeP3IoDDXwtEGyPtoDQWDxG+GlsDPQYk63aq9fcovff5X0clB3RQlzD094Qk1rlWaRjOvn2T0yZUo3nMkD8nap5iuM+T6tepEHV+GEthHc4a4Gkmx4JBcstC3oGrYTh3Ny2TQndyRAI0ikaLD+1+2A7YnmFXa9IvJiRe3QkIM6CtOjrCOY4pqJGGa/3l8nYOFiPBIpyUduO7Av2Cf8kEcdYtKrp+PB7AQqm3SrB2S3zbihFdi1jXUuY8wvxM7OlYuXF2NZEwiqEXF6qph4tI8W5pgGsPkK7LdrvQAx95Q/0ZDcF4ftnz8iS/UISmpDUpiBnXEFEAjD+Ei/ypPCnyB+IxND67C6hatqjU+/1b63qMHNNJ9tTvWBZ17zj98jwmXecJqh+e6SKzM7t8w/pRgJiZXPhs0NECSTLpY/YT6PV+q8GSKaLdZTMFgW48YS/s18VqDG8j4HjvaicwnvUs2zz01B8LU/x+NfSKa8js0J761rsP6N0VkJGKeGB4NAZVm/1svYIqo/uRkklLDYt6Wnlf5RHMjFANB0MbR15zTazKWX82JBqLbbkF7eFQhJ5reCj2BNGfshaKUCB0EaUupHXa8oeB7YCWyx62NKn6eL4o5TyI3RT+8z9BfTBN2Va0vcBlPjsaNwMzfiTNNr1M87v2guwfen5T8ub+JxmIy2yq3A1MfwIVXtFeeEozQ39bNq2IACcXAQkx7dTDK1/fpPxIt4A+WS0tk+Fr7GqQsBGhen3k/4qOldo9xWVtp8CMEGQ/Z1KyUg4OoM2uU9AcbAcLWp6bkELjmFHIiJYUrOtr61wVcMbFuVmgAgv2WFECrZCfP72x2gBT2+XbKaQCxRZxhMEI5MEfcothoLQGbF7Pl2y4UKAOZgTItYsbs9xVXMbjlb2SryfzuI5rNVuRfp5gAP04xECJq2jJuPCEzDZ0SoopWHEm4MJZFJva8RmiWtz01eF7qzQP7lKICUQrX7yz9B7PYwLgKmHfGpGqfVpEhbhEV3llhYza4v3K0DG1Mb+zkGl81TQUJXdnlGH+1I0/1DwfuAbZhQse2dhsMgjmJcTi3kkXaCVDt9g8s1u5R8Ton3xOvLgfqNTe/wQG1B//GbksuhltuI6lZjf2GwNgkVf/6ne++LsvXUmo0oZPxV1iIfkR7kqRRlLlbDbMAihTQwW4cUE32LhXIde+Pcnjqls6lExeWD/0hAyDqaBKlKUw/+jmWYfR+yJHUXG73o9f47uN1XTgmtXJ44q7ALif6bTlmF55Nc9HDgxedaAs0ULwreMLUUO+7BWC9rD4fKR1FI5djy3+1VMTZ191xbAWob8n7aC2eM/J5aJdTpIZnt1EB3Qzk7C+NTwmXqoPvHZ8IhvEVN5/ZbGeWFP1SjevRUy2H2F+HbMoRrRsg7zrZrIbeo6zlTqlwtQZkbEil34Mp9WTqw+ViuhI318/UPASXtsFomgDrmjsl8O8ivESjCF7rB4k4qsBTZBXFRlPOvV9Puh0+y6+EdUVvCHZp5cvy/alXgSyPfLArQn50NUHV3J6vn6CtwraE53AFGr3GtROeUtQJ3H0vAxDR2p/WbQdKEy5oNWxEJAipdjk2hkPkAEf2DoWdx26h0BbMVhN6ASmLlHHdkiR+pieIaool/OyCZLWZXGd7BU65qTiWjgYFkxs+g1BNaOUcq45YJnqt/7A5ikqycQkPVpaduKoSmZJQCQHi1Eh4hDA1WGCLJFU7QCXzB+W/ZJD802Zo49ZsLKBiNFQIAA5C3KbYiZkJBH5/gZ/t3dtC9dZQPFJKcSiF3Ca0IMCRRbD7C1AWZuOATVWEdmlGaK1v5jQaJOO4RL9Et5Ka269JEPg0HMuOnerUcZ5zNbwVSiogJEPdi3qG588sH9fylBlpT0qPVSr5n7GPvtczx6bWFD+4uJM2NQ+aOQGvjdbkGxFLLjhlWNtEa3thQPd9tXxecC/QREp1B2D5PFf7e0nhw2Taabu4caF5CxbPNRILFQ7jRARzQmJut/CYYI8cmTSJBclFgwWUKv33FUNpi2Ylmrsay4MwMmmU0FY3UTNNB5ERuJAuLQNSIlRjOod531tARCu5nFWdib47U4PMJ4LHMBS1+FoLFxJ5JMycPc5Y+SGfC9XDJOd9OLsRr5bXozVKXPqGG3L8aYKnWja7oqBwBKFD2r59gLVQy+7sGGsSfMsRJDZl6QXYwLR18ulfhVfAg7TbM7esIwjOzKwEoHmkaLQgrLGDi9IDIXFr/rUk6TYkOFkCqmQOGomUFt1wvoQliE3bLrOq0oKmhtJ2xzsBUsqtku3eER02Cwfg2lWIBOzkKkk1gSKMHZb7vsgBVqccBBnwFguzoLF6UXLazjBSVwg5+8nJ5IJEcVClvJRYzqtf+lKX9MhkJMowUWwvCeGJ1+Ld7wMOIbRCwrdrY1Fpa4hUaplLQY+vWnIJYcrV64SQF7owZIEfbmUjlpHMSwT30La+xtfuUAJ06vCIbHlBeIHUnvmm2fmcu6X9d09PeJEhy4XiHCKpihpvW4JVeR6Cs2WpeIV+I+rvGdlaXaMq/jxhyfL2cggrejoIgcUzSkoernaMiKnBhmNwYWsly38HWsIP/+R+r8KDkhG0979arQ6SU+cSxHa7JeIxtMdQvgBYk9r3/1YPwvb/AlFJ1/D8umlJxx8TcXWRqk9mKYDmb6rlENOE7LbrR+o25Z4xUheSiuYIvCDcsH0iDueIHN1G2e3Eajadg3OvroSCXm8jR4kkfG4cATvXsxpj7G6bz4khVECgkKKIgUc6opWlOHDq7mNcOHWkh7C5FvWnZfHRK+oYg3e94SvJp8N/gMgsiD2Rnjx4ISJLKakg+BKvwXC3GiJ+I2mjUqMjSufCN5qZeCnmGfCehG8K9YgjCJuG+cApCIoXyCaO9iLwMVDCO5aM/tTL4VHD4IwLGVVZaNz+Rj8AwLrqwwKiuO5gtSCEwtyIW+qUEZzmTO5I7St7zJt45oyloPImYYkVA3Et93ZVAXsyafd5SpT6H0WdbojP4va0OP1pgNvtkY5VV4ObpECFHQS+LpHIcpP5TqVBFWgJf74eXQ04OcVr18SmB64MOd/hybbG6E/fwY7MpgLFKeLDIW/RAuKcw23dXXk9M/lqfmyYkvSLkt2ScAxLlQfS4IYqCEXuC/yMkGw4Kt2JHEiChB5y1wYwODaJqlO75DAlWhiH+PJ2/YMtOWIOVFJ0Xkn5QEdvoSiBJ8K6Mkd3SXZk5EdvEy6MH+5CifYD7dAn1SipJib7lBT8Bb63bWaEtynWtpibIg6PA3OwTkouo0wx2stAy9sDN+KkZeryaLC6dxotsPv5GoYFYdmW+k8z3IC6L0s5kvC2XJoMsXt2zGbZl7TZha5YFqDjdt773hQu/gCOqrXV9YVecFDIfIrm274Tcm9ObdontFD96i5N/eNQ7DghIzjO+dRP0h5N7IuPPRyaCrIzpK6WS/0d6CJth3UqahxwOnUU9szsjT3yuZqdU9Su8iZPiSntodNOfvGUc/QCBwRQireU8LqqvaMiC2urW3KM8cUH8SYYNmTmaqlD+g7uiAM0hQL6lpTuWTn86sMH9lvSCHQn2tYpBi7prp5dXhMwgc8E0ykPJgFeYYjDIsgxzMF2WmJ3fP+L3VfrsWPws5OhmIw1mSEPGrf5V+QXFyX/xq2UdZ8gZUUbv4LlmWB5MOaSGBqe0U79797K3MQ1ZWfVg7DyarOOrQrpDyqQhSVTN3RNRKhuIlCIGN32tLHWkeLKqSkK/xFsBfld4ssJtgczZIIhfRqqiOtQlxi8LiI1itFjO3w9r52gtwjyFE/FGlUAC5tiXAlMZVKPfR8zHtdbBLDFR9gFMMzCFd9DpjB99lQkBDrohZSEg9GgxvHjCRpsytmWNKITGJTlEw1c74rbCNO/j7khY4rUpT4kYP2TXRMhQ6QdK0ajZASYYocCiz+V9mx8NZvAQ2Iaeyvw8GagsNhH2TeMWP3A3XA3MWlbDDDW/kWJc23oMt00haK5F1bge0tRrcCr6GcCTLlVp+wZW3dpb0O8BvFsivefRZ+MKuUvNvYZAZvQm73cdRYWd4Sn61DNGi0XDc2VVe78+0y+vl3PV7Yj7NIBxowr0wSdZfGZbucQl9m2QDF/7ACWgqpv0FCdH2vZ4NnF4Z/pewKH2v9CB/YSIOxaoTo9jOdXZodPyB5MhVJB4QAAGBhOE9pWQt8JmwAoYV2zIouOhXrYeN5aeQhtifaCaKlvUCOkvKnkfcEnnK2352YisY9abDvSLvaqjArv344OYv9UCUyrFIDKX/J7Ssmit+SoEMQcJzb8vJmJK07ioR2KK8Vq6i4QLN3160jEFyYCTG12w1ftun+ZUt4uhhrDgRFYdmG9hGwo+hoeN0X8asqIkrHa6Z3Pel/CXJovZfsOA6dlw7Ac37fJ5ckSHO+A4rxH6c2ddXRPBL67aJCPE3cXWJDZ1DwqYPZOozLM7XQF3DtY3g1Rhyi2bnlx0g8QrgHzCxuNrPBYxc1nEKvYblk2v4FxDXYfwiY48CHgGXILSKRym2wsuJa+zSmVQ6Kj2lOTVfldw9DhO1L+1/7dlM4b0Kzhn5Rm0fFWjTOmoFri11gm+PQg/pl/RIDasp8c90OotQvkscaew0V56/1JrJranivSPzhfYZNfe9f5ToMY6hi7uvP1UFp9YyfPmonXtBopy1Tfeeyb9w9GG6txK9HZOEdxHFz1erKbKHxIOuJMDS69BhZcI2dWY33b2kCH5ZYl/F+BiyJzsnt1NMQwqCoY0cGQ+tF7TNt2w0cvW+PIeSzp/Xmwl/gOqIwRnroY025o+BmjBtHOZGC4DEjvOIzRFxUSP4hSeCB4MLFQRG+K6Qf6XnVU4a/vERlZ9VnIWr76X9ottyqdXrqqB4f+YoHXOHOzZq4dc/ELAeWuHZBUIyleg97uf5l0f3qtHOxAO+p9Yuwt3oDLuotOBqPU0FpXyaTWpUlrgt/BwHqHuhT66TGIjeWxxwHcuuE85ziBJZCl6Mg3PZJDCYesLMmt4r/iS//bgSUSdZnrKKPoMbO/JY8UHv+LBPd/J5p5VeEf7bVBuOtx+Rah75I2VJqtPE1AKSpLjRzEYY9k0LNHtmFnjgXk4QITPgQODGKU/bTL9KXBqKX0brQcMHeN3EGW5hpT5oGgWdQldw/O7PmXYZOQpHvAmdg4VLKOFX6HMLZ3dSwR57kbm80YZ/hmAMMpa2zRGEwOGIKjx1XohJ2syygS3rZQ623tc9ppbgK16SxpS7tL5Hdj9N6EXyatuXrYUkJnhaLbJoJo82Eh4WOSu5o/vXM+ZDaynxuYyI44ySQweOTpSG00d9KnIW0KI89cDFMvj7HbgOnsC40D6zqtpqTR2RvdVFRPnT/+AiTngQZ7XVC5mbTNFUmISuvWVSsbNe1/qWZ6rzQmKYp5BMR2yhGa0LcOi6gC6u7Rgkuo4/E24bh+wPeRsgQe7l9edNiTNOJZpzkjQtwtOuXb/C1YtUMqY3OZC3Dr8WWbTEiJ7DQRNEDCy+oLHb+ka25kLHZlegsz1Bultzumykc44DUlY0SRWF+WbcOzyFOAQDshpDbOTBa6knhcw6VD49Iz4TqdZLPI0Oz35+HyHtVdvBPoGb0gSTCziEjAtcLQk52au5rvKHU58DypGTDszKLM8LHcrrEry9PBVy3oRR6wMBsY3t5Wkq8GJZXMUu+IWBm05KyIcTeiWfGJFDb8JFck+lEj4RCNgGnPU5+VqQLPyx443yY/+/bqSLtnOGOkupdjd25W0Vs+ouyws1G6B3RN7m1f60ZNTAg9ItWdYycYsgcUucNm4u58glYAHEXDQqT2yftJZLmqw4TBwRqkeBEWBffRZGYedZ3ey5qED8hzlNwCwMX1b9Sa9jdt4n+MRX25OexLcpE7m8PCXd5PLKwZQTELEQCpTkdC9/lDkqqyMSEwYERGBU1N3+6P3VLjm97xDBD2jnb82sVhbxDefdUGa39Mg8w0yXE2la72A+gVg6S/AylqiOGWsx4U6cZHG+Cu3jE6gpFrpcAR+TX9Ai46rh3RLZmc/FLVUiU0iYxN+hM2VNMOTvSkCNGySW8TV3RIS1VruLPTMfRwbBZBF+wf4sHPbIBqbwmx4LjwKfMsDw1JxaJFLDHZ70dAJrmTJksiJZKY/RDHzc2Lt0FhupmXH05mstUky7LZT6oR9H3U0QiS3uARRkgSGr3TSWE7Tc8KGtcJZeT45SKB7OFWLN2gQvRDyXJOvnjKvSlKRUDYrue6AIobjkjuceHHVmhf8y+lhBkMDWdIswNZoa/pE6OAPgXxY+/FQHpkZkdZ/OdIxde/uSSIQPJB+QhnE3wDNrAlwCqzwmCV9QtsTFjlCTzxzhz67UA0qknCsGzkTtNNbJQ2s0R7LIm91+hClK74W/fGi14MNin01dVKbbr//Asg/Xmen989XW37y9GeyGLY1S/x6KIuFxYiZYPo/CiJJR5UwMikDZ041LMdH9L3POHgP6uok6RUAi5Lhib6D0dF/TLZtEv9qNBI7/vYElI3wv6Bc0Kd2LuUuAYwtjH8aKZOvsjOFOVhfuinCADHp0lTppOUB1ZMC2d/b0rYBgNPMlFWiS6W3eXq8na8jn8hnY/3U8S9ED30nS4LpNdVctsWtFanFK0B/1GS34WH5Jtv9KlQolrA18m3sjFam5g/exdvIEYTsmhAfJFVxiTLZrGeAqM5VmXry5N39FXSl2jLjdvphDcyVNK8nZveUObL21lypRjH5E0uoeRYPS6awMbpdJnUV6EbNjVtB8lnpNqDCzBYwgVsa54tgOR8zajOpRZZIKm6PbJTFZPaDe6gNoCsorl26Ydxq0aOyTNYcmD2YZP8+q789N1uqwUAMxwNfw4oxLhmbzqIfeQnGFUcUPuimvi1ZU2i5PeVUP4aNS8UDj3c1orFhKH5GL/Vku7qTtaLSOK9h42a0iwcuKetoWV7hsvFAYwRrCKXyJnV/rWa+B/qaldbFkDZmJB1sOzXwkjdhje1XZxysRzdW05X8reh1ttxviHXS+l21hpV7Jhhdgavj6oAU5GvzmAltRBLwwy09nsPJIw4dYNrmT1IBcknOS5NcyHh0hkr8hW48Q6rBxU5bm0qo/FeihvesHifov1BSX3nxgaQY4nTFRLhjGxxBwD5AJ7eWjNxiY9cur9hkePIryHHhaJIRVviKHbEORisMshj8tkDGSsjuyHbDUgEGGQdyEmHTKsRCPos4pYyXP+OHI5MxwCWF9HK4kzwKaOQk7Hbhn3vH4DgyDtXelYjo5phtFbeuvJmy4kstpovRzE8irai2dYMYLyR0IheQ3Kiu3fh9kM62a2eXbVrb+IpMdFNgjQuhyuVtH4dHWyPB2iaPj5yhAAot3rd4KOOxZughInsATqro/mkmK5bwUcii9hMLN9YCs/urV1VLGeiK5U72Yp2OLAWXl5m5Jro818a5VVPi3INRaBaiC6XWlePBjWsRfE7VRLYE0dzyWSMzKUkzf8Spql3y2bG2VhNVFtwcloGmgU5im5SfCXsVQWFo6utIfo+UiA9PQ1CSTwqTTXQpFsjXJ3q7Z6OaLECHhI3Yg1fI/uZGHWjV7dU/zUVOcW8VyyWNqduOGRt38CGMORGBY6QKBWsjoPu2TySaUqCiBOVCVtHdh0yS0775F+Q57uTQXqles9Jh65KecEk656RZSmRPUiwKVtakx9Gjb17htWg3haPofiYi0e3ziw82Wbs1nyPJzZgQJLajW0A2VEjRVGGBhaSqLYQbRUY2KFFtNFUsaymhq9LUwxKjp7/mSWbo3p30m3O5uc2JyfmvxPSZBQXHwysWKZZsaFfF0QP8kK7hRo85N8T5eIQSwvfBL26jUlKlpJgEi1yxs4+JvRBwpFUQ3+4glz04Y9sOnrM/TOT1NB++TIHuz09lOIJ5K8p8VGQVt3Eb0L+Ek5pLqvv+Nk70ofUEyEk4fLKRGYTxKpdYy6fYnEcHBmfxPXpOqTN9Y+xl663S/yBJkBZlMIiDducs/3hvI3X8nDUCXbqGl+HF1wVHiKpQFjC+PEUaOvqvYLGXKjykrrqvA9mLJJKPAZCWEtEv4fPiy2eQQQZfZEVzL6UDVZiiB6BgTBjsQlPqac9lPypCRSJSZI4gpmy9i4/kSXXEEHGyjU4MDV5LRMUC/GM06snobjiFf+cROdjM+dyN9EuOYJtu8nxVsSN2Zmvtz9FAd5GFfVDVWZ/oyiqRWXn4RQLvduScWwGT4V/wZJbkxhXWFqcjkeKoKt9hARV/xlcaNWFFq667IXs9zE16tmeybgt5820PeCF7R68souwHMySzqCq2uyhCkpwqaDvGFbT3CpOEj5m3IVoEFVNfLEJb4z4eYqRCAwz9YyvaV1R9s0vgSTY/WIV2SK8LoqhGfI8SwkeJ8h18i1kDrGCdpSaIV3yWFQWfDyehhNP2p/Wt9yXQrImcuyqXv83aGLHHZN5x6gUnMZqhESSclQ6qo+XlpaUiFAo+gOYD1S2K8nUurKaSE9O0+GSh4U3Gi2WFwJlQKUoYuwKlNa3AJJ659YQiqJOYRjRkjgmKgdpYFk49qhMxMAGYsmGMrKI8vbqNlTLNkGoRKO79udgDPFsTdsNxSe/Z6/lmGRwFuMmaKiHVCBPDZndJa9rStK/JY7egEenZPJSQk2hFMAAp1RJsVtCSUWhGBrRbt5Tkjm3S+L1z7YDIuAcKbLnDmDh9PCTCuYjgM9XHPzYwM6cERThlGGLcXzGxOtHddm2KXKVvVu0adqNynavH2v2ckwDFyMbJljz9Ah751hwgC2gD0AEh5DdNvUxsj3CreydBSZ761erS8SdfwVHQq1j0sBnSYaSpieT3LWlsn1hk0oYuBOUvSKvPsrFQ6Cb9/0ZE4BI43qQnAsJ1XVJhgGKcjut/xH3QXYmFi3QJyD2NGw4UcFSMSyvo0MoPW5ZMk2Sh+e9JK7bszadpiDfTmBgLfhs8ePpbZAt6wZYO3iRTufoDFjN29Y1qY2IfQrKOC2O9ncvAqydXvgN7zpSVI8jpCht711YnWob7Au157rlmuFSNoqUjNJmeDhSVUu5+GiOcDCDIlKsotVE0mLhJE3mfZOib4/V5V0mPt0hTUdQMb8rDYFgrztUmDqSYaV/whcQwlYNA0hg8WVgqVGFi1anliWvNjSZmktJiBxpO67+HHcDmQJilJPEzChBjiJRxnQP35JB9/YfE6t688A+FmJIVNfWiA02+Bb4MTTzQyG3DtT5chyic4EXzKYTf+qWZP9oq/218MdSwAEGw8E4lTrRkkfyoAsr8Dr7GRHV55UB8k78BzECYaEGOALWcrcTDS/cS2RXc+G2gSpL87LtiU04Eqfk8J1Fstb/6CGHmgDa9tfj6gRRQR0VBPsiAqW6sV6bXAAT/1N5NtpGhNtQB3v+7o04zBqF471T0USVE1Il7XQ7OK8DjeS5OECgH7ipX7L2ahndPnfUXp1culbGacDPBPCMNkYxlfn9uCg+sypG+smetrjWqVpxb3i1EEuo2plh9zqmupwtKYjpZYnCePpNi1WXb/PnyhyT/gTDfwFmPjKiKRY6Q4BdvlCWS9aa3p3wtgeJNNnGZS8LvaJlivW2MUCV0zjx9VxJbVOTelDtdl4tnCs3yRwN1DGU0grzctqLp0cjobJTLt6OO8Tc0Lzfjee52y+kXk37kQSq7Diq30VFk59mEWsmcHYAKcZjHPBU7iFXGGz3d1mhmNHGHr4nrHKNK0VKOmtDlgn5+4DZ6mxrukYtSWzJDVsOtvf5unp8wIresQ1yDGXv5aR8ZsKon1TJ8qUrhSk/O3e0r7tv5gIP3yjy1rSaxqbnMR45LmN2A0lz1FORej1khn1rNCkds03N1nU0mflm+OWVZ/PtU7UgmJwiaNIkzqIfnLtUpm+OybTeCaVH4+TfmX3ft3J/EGcKx0/y9cL+/Eht33do4ZIZqPDHbaROOM9hk0st1qYKJuj0CdnstRyqfKDelCJ3UUsVW3FELItHKSgunusb7YOIuv7K9mIfprNwlS32tVcfp2hzOMWV+etyIR3lN8qQ9IJ0mcl5LN8Paf1D3RH/phdtjyax909GHrpVvLBIxpC6MLxOIZGipWmcOg3IkATlIuxNbtX/jZDK+jds3fybvk7MPF/TkmP/sGHK/x1r8r2rzz/Ha45paMq73LkCzWpfznAjlcz/49p1xWbgTNP+rNa5PPRsA6ePhZJpPSlKIMZQ/dob7QOj04qM+nsnnTnk0vibX0abW7F8h0S9b+4Ov/J4/SjWAfXNXQ5B3Ffj/lfxHyjoapNaq3h8WEW00Mc+ajcbyMhhd0fBUXySPSMNSUBXsAzYNZfAge/mwAuI0Yzy84KXbakm7qz8PJt+XsbKNWfUFKLNP3B3KEMHs0+C4doV3t762M46YILygXbrExS9M1I5Jd0ainzWLoJU1iRtdPi7ik1pRHfoDTIldbdODKjo1FxQhiqCE3YC1lrxd6UuvGKtVFwjllOUPHfNnIeM1IzxvgIdP5/SejBrOCugOfrveTAcTFZq3qO66woNQqlVDLbTJkXK1smsLT4jQYFQUKaXR1N7pVvFo29Vs885yoF8VG/e0JtqzWIXWXETRDIYtFTEue2Ca185KihSBlfr/bDixT5eMR7ZmlHafb2OVLSKH5E7bd2fLenC15roLW3H8xMZ9Zo4W5Ba1kNT7kc21hu3SW9Gmt+9MVR0jnIFXoRyF2op36sr9vHFFg2CQqGbfCcOo6fNZ0BUSIf5lGN5xFzHJR3aoBX+fbQnRT0d1phyX6CWI7f49rXJXd1dKZqA3r6j9eXhov/Ap+V/otDZEcvD7CWjqsppqGojAAAIFhg+hRlPZBLrYUjTUpKZtbdnadxOrl7HWnnQP0OiYqBQKe00Ll3Hk9I/j+APCeSAd11OH13BVXi5/3OEW7PoOHXHCi2h56SKVXzzk30BqMJKrzN0w2Yx3HCl40/Cxvl8Ic5PxK9+EJGdWu74cAFrZXaqHwNLnwvpTAFMMTvNUbv5JYcfX9tSO/VGZhgVI5d9TeSaZmdUdGjGkKiFWJPQTyPP+ooJUpIv1Yud3vSwRAmFKP2xDcqFwhvRYpfMsVUMW4eBb8PbErXdRng4RzlxX5Q3CmttTzeB51/7nbuLjIgryTFBy2P/BEZFjskiytg18ahPZhjYJVUZQSJPNw6Jp8p1TlqpcQ88nwblXuxQm3tjXO17ersv6SpbmQXLnZghVrtwpKUvoD3UjWxFbTy17R93CLcgODFF+2kecYpWFS+0iYzzFU2DhHm16ks3WjKjVJt8MIS8/9xxuCJxKztrvz/uXG3dHovrSBQptp6n7zvn2sR3fxeuSKzp+WIa5yQY6PgMnylf5QWmuHuZlgACebhxjsoF89XM33INUiHNf/3bKfuu7FYpLmNxPoxdOfzrr5VmgFKddMSzTUbCahVhPH38VeqeqUqoi4RzZZWbmOrhM0puIs3IxtVQcLC/gx8eajdmN5cpTKFIpsdClOlRMDhUF+IVndo0HTXFlOPKj7vIbNps8jvsrsgXRKRlthclHECrqJR3iDAkq+teOv/92sHe7ztEIeF8o+hdonWHFjuzWJ0JtGNt3ksj+anJh7vwYuDBUTf6RFynFyRXjkVVrQlKLev91hfBicdoVtXGgIH5lGK/2S9Vlf+tF+VhHuhzgFLWIJV82MXF1AxGJaKjHPMT22ETcdgYEhhoA/A0pDt7khZHowaKk/5iSve/sgbv1lGxoqkDdpaV3oNvHUI6toqHdXLFFKF+9UE6QsMRV3VGw2+rLeYB20LFZQArMtFWQtsumLbfOAwisKxiOfxKuy4Q7hIIMrA7BvehvaJr1PnltM9lnNmlMUYUyck+c1tax70nJmgzBGU83IgbnVO/FxjtialtL9G1L3bSAXwfn8vGZMpofhgLHsbHriqLYtrP/Th3tFaurmN6Pkd4+H3fwbJ0sOUv7shnecbYms1Rli4sQqlA5KeYSoa2OlcKMCe+Ma/lPcIw5PFObVP5g9Sb2xhNp572AP/18k8cOludSuKe/dGij9NKv1lGOVYYcqnl6V0+w8l4G5J4+afiQqupaP0SiyXsJ+obbXJiW+/lCjwM+rC6Wb+nzd8JSFjOsEc1bnbkaBJpq5nNg4UD8oUPbNqh/G9gVN36pk7bMcLqQrxOGRlF8qcdVjy162ob84ipSyNmLtmuaONZcWPw4MUknYra+35jRaOEFFZwQSEmg5ePBg+nUlArP7gC17nUueebFBxiP/xTFU1N3m4obqscLaqiKx6/L4+06ak7lr8GLB1fs/G3BwXZhtE+5OY9+Mt0tVjDqVXTbsIcNr+sC2eBFbNGIcCF67klU21aec8WbJuCVc6Kda6IhbN/F0Mrg00M8r+Vam2T5qaVv105mMR0DDpwLA3Q+Qa2Nl6MBfxGyLpfiZqFmpwPXqSFDNRsscO1jNa+wG0Uh/HxoCGXG9+6t4c0R73EoYET92VtgttFPpTwBQ93ZA62bCFdNcK2dLCVW9wv8LylMF4ErhHRQTvYen7cXj6fCFgmKIYx38nIMkgQhpc4eF5DoVcvKSAPvK1a4slWO8OA/N3OXR6CtFq2f+HtYk2kNLYnudLfZ3bn1uLeOUxvd6O8RNX9KLfpws+tGFoPpckfK/s9bL8LkKmCFH6CK3Kkxy2IV6eAVI8w34oGsf1O3JjU6Ww0PenoH7A+TMNe4OehfVvG52a6fldNJO0cWLfjvxSeBwi8B37ZHuEd+Ql8kdht3xZ4EpEjTfg9GZHsnllBnwB0mP04NhWc0uWOiR9YytkRVphLRD1LrUgEo/oXK7+SJpg3MoZZT1MYCUMWFdfqgAkf3q/qld/7r/69WPDwTQFRqJljret42464qlxlppEZXY28v7pt9f/mFSSa7Fla57GbnrU3VmgCQaxJl2C4dpFfGMEzdDu7b9gKyyJG6gyuo5rpoN+7fNx7+Stgd+3x+gdHUuk6YuU46F/CxT1jvTDJXGUUTWgMlO9qXlgUPrMVCU+39/KZLwY7xGvUbYCtx/dakyXny1iEzCHjLA0Ar9cDEm5/H4cRVNxeou7cIEIKTXSp5TwQA0NBHmnmyF46fhiVNpEmTfhWjIUopAKoncvVQlgT0t1L8Z+//nFnn61FabhvbnLWNXd3x60JZ3yPNq0hEZ91n7mzkU2f0tuOgqJ1M164x6DQcD/vTxt5nx4R0lHg51wDtxX//WZO8WpNBGTHcqPflv4xKjXcv67sQ/QHY3fT13N0zyx/tijcZDztGW9OXW6Dc2GmzE58byggQURIxDvYNkeL1pItsbFVC9lCYHhgN7JC/OeWmHo73wKCesfGxkcSfkaBjTN2IA6rU9+KQnrLCpaoCnbfFzDqfUcUdKSHoxf3HBe3LVaAbWaGTa5hHcTXlrbZR3q8I3SG2wUT5fAETPiDUcgQFAjhe/UUzorhbMRA57g026vtXqsG/1l6mBbSn9rs50hHMO8JAzLprK7OwDPCFXxVnUiMRIWOWmgCvGO+JXKfpLO+TmOZ2Nokrh6ZVliDDxokn7PQ7VuKEo7QlvxuXIp3Tu5JhVs7fvDYYil6LKVPvrEG16WdH8TO7B2OSo/3lkPyv/VktmfjqPK+UOhZj+xaYD+V4NXB8h9+RPnEPNJOgc/C9+7R2jW2SIoPpQd7pD/RGtaATuRpwNIx/rSCRQvM8psOYyFOIKy31lOUBslWZz4GcIae13esSFqecNq+RflcffDel0IVYBbV3eUqZKzq/xqfv1RGjkayj7x54XPTVmEZRPMEK/Y07qV9G5GGooOTLiJ0AVeiZxOAMIRVC7/OCyrLKAVKsX/iBoP57APlj9Ibw+ggzkBm/9fWbDW1wlFD29v4slcrRx4tOTY5EWQAWCKtbTQoyKobgXBrx+vqCimUN5wOmIWbKK5qr0uLKdNGEtgbwQPBPHQyuocO40pNDhpCGL1rZ+rz5s5KDk6duHRf6IYyCouECW/W7hhZK4w0hkALqqQTqcavyj6jbV/IyQmdEgm82MYdUmuw/g2nMwYI5S7hzzYf1nnNXZALmYu2kfsSFtHvyopL2tNiM2qluyVYsAOam9uLw3KNHAd3FKrAMqoGmhFjOnLqznEtK3mSCkvpnWMDGtOrMwgoDn5ziE1csuQCdScz71BYMCns4keVeYwna+JiaGE0gPJTNu9X0+9E6I7+BZQdmgQVcEWoZh77sHX3fvDqnJ82DFSgkRzmALmCNmLsah8y0C6g0v3780ERtgdrcI+OgUsh6xGyc07DxZYAFf6m+1aTENXIFj0ycANGPH0gxJ7NR/deoUmmP9TbEzgoz2QyEHXF/RBB3USKzuZA9GHlwT9gzKSmBcirpBLK3+qMcXRMcbcMYZbpD74sFBHDpLdF6IcNUQnp7ugsNQssSQo6GKDX63YiwGef2RoHMiVfCyZ0dzR5qk5y8ZItCcoapfbThp15G4V8OEx0h68y+InFsdVOFUSfXaU0SvG7DfMe4wtX5F64faIO9yOQ+HSmjpOtC6+sgUJ/2PXoTIole/zZjXAFXT/X/KHMSayU2dQGtOUGFxLBHE+2i2KWWB6wht6DXfxAJZXqoG0PZ+YVxYDfHtfeopCFP/+8rIzMoW9VHgorD9fPysdOaNIzyMkNMOCOYah2J1u9q1JUKvTlK42EwqDTN3awndHEX7GP5P7/XgNCzQ+gKrEr9Tm4/2CHizwnGkxMFL2axtaja5Quk7pKvIxgs4KcyjBXBJoUJkMngA/XPowb8ksCt3YU2ecCKAB/ZU8f+s8+3LUSf5YaQlkTWdXJeNA/ZIzmKhm++vxEF9Lc2yOXPh+y0pHspdEBJf8ceL6Ro94C4ujTTn9R++Tv7J6MAtjhWYhiVZrGCjHL2zSKWZAzzirvPJHELM9qijrTGBS5Vo1WPzHMbCZOnDddRZxSdXe6cnp3fwT8lcKkXVd2tehyqzVaF0xESfBD+eR52ZySVG64VwYLko1Qom0Ghc46CrIOaE6vftwLwmGFC3v/nJjvaOdwrOFXc5L89FK2Zt6Y1Tm4be3Hs0NDsT6NhwGkiKtoDlka0aOXQYqj2ZNPSwuYQDpPk1O4krpbRvQSiemSB5qeWaQsFkeXV0a8s0RmWVRBEg+0OCKB4tE3rKrSiOf8fPRfaCOhcEg+HEuEUiIziBAHYnHjceVPKZa4OchkrhcBlbqwdjy06UDRnHrnjo8L6swNBDPKPvadRb5W65kaJi+dI5cpaBKNDvmbMmqEFPqGLbq4bJsuhAFhIXYWy3bKaLJ8LwpKYGA7D4pxjRbW+XdHMjht5wjYaEGI9q4ODq7okrk4dKaekthP5E6pgji4tERgxWMv43NfYfVOD6ET6FhBXsuffRnhUGTqWrfOiVasqOyDzFgFjEVKlVulaGlmp4pEfiCnOuw1+F4rLANs5aEL9ZrAli9mi/iHDkSWTOwoBe4Nskcr07e+7nagAANbKO1xcnrbICm+op+NMpbBoLaQ42UavkmX03NfbtPchApd6583kOKoLAvvstw1PBwJKJ2u65KD4UKoNi0pesAoo5TvpuNhu8Xa104Kv3K00v03179EeYxp9x6hZhznvyPav/riJBeT+WyNKH3XPsNkDCJZ1DZcUjjel1sMwMNfA7SukSkAvQuMxk+XlpW89a3Og7pnUDmVh7uWhkHY2XCKGz32MFUAQdm1XHQqyPGEyTynH0ES8oJBP+1rAD8UdUVCx/zJn9ZeVk+QbrdzkZucjFfmp00eD0A8izMddRPDOVIBZmIoq4A1hvY8XfK5zlmBKTYui7cXysWBcjApUVzs/z8WmO9RQBKpesSRZspTLYFZ7kF36xSYgdOZneYlujAg2NurhuCjkAkltjt6VbtwxBro9VztdyteWymfPHxt3TKoeDp/8vWIlwDFdknqi/pK9Ol8hGA/Sc/rKPF9qAA6HVbTpbg01nb/mBsqjiOVZBY1KEACo+olfERvsok86KSBYwpvSOLqfgCq+E87q/Y/jvY9vN3GE8xlZeNhcNqOboNeb0DqA1a5QpgEVY4J93JSp9uxS8UCOwKtp1CCBTxCulj7aHW2JL1MiFwrsm7n4Weq2rMU5p1if7zcfJl7upzozUZtju80/38cPbpaZDYisB3hUl34NAwAIzmyJAPEicTeW7vzkyhR0SkfRAPG6xccw5EVSlbGwFTM8DxGJaryT33rPBCpFbIukg31j5bJnRqTMHhkm7Lqc9cF8bUYjXgAGJqG0dws3QBubwoUypEIj3FKBRjc8LWwzFgNL4hX0dcu10uoZauv08G/ytSn+sYhhnI2Jpq2aVc8NBq4YbYiuZooUTlYf+M0yBp00FIrya+hPEGAfxHomkIBW/J87+/XzuAQidG0rNBXFQoGsVtK8Re4DskYcGLyawcd66JZJ9xO/JDNwHR6CO6rmcWNYyjE4qI9kRqvnXUwQVZfnNyk3k3q15XE6TmungaLLXlztsCTXUcrQaJyhvmUJ1rSdX8OaX+Ne2syCI0LPYSsugR1pmQAX1ruhEQkrlTWYYHJFHrrfo5Oj+I5HGUH8BymQKxSs6ZtDtnHvRyS/nx7qFDH2haVwBKm8qKTOro1bJueZWIsCE77vZ+4hxM0HHQNIx7KBtj/zsMEYlfSq5ziJdeyJiEVi+jeJdQEMR1Gskr7BwoToiWuaJhhuc8pSRFlusK3CYt4T12cHS5ZL1OS+h6q5e6H9xRtP+7NvIjwncecffwBzlnh2r7+EytuXYoo2OFCW0O3YfEGOaox9BAV2meI/Ck5ToJ9WGdpDnDCFjaKB0bVLFutOhJRler4TPGghFC22jJxyAhQJzevJ05l8c7opvWPcRWhDBmxeVKchNBPrx+B3CC7WkRRDNbcRuAlSm9wmWedQZ+FVS3iN6Y8EadcnGbi14CrLQqfc0oeUlwnpiDWghajZDDy8+ruiZpMhqyUNNmjwQ1WBBZnGTWMT0eWc2V0EAqamVD9HJiZkSxzjZlxSh0jgpX7HbzhfCJfIu4XpAa59uknTBi4wIoXAEmQAp3OsSILJjSwoOA72Chuj2ocm5BeWB/daN4U461IkjyrW4/tzs/pqjYnYnzMEZWr01U4aaYKfzxw4IJpCbMgaJGAS2fus6R1cloLqdFwUBguPfp2K7k4QEgn2toJcyva6cEvuA5nhxsxRHOpPlGAg0hLdh7Fr5fhNuHZQRIDDAQkAxDOvSy3ch2N0lRzF5vI0BxVKAN1G5vSqhmuzjNiGAH2QdcjV9AIIOsK7wSQo8H8oSzWHBayuamt1nx38pjtc92PCg2zzaNZ3sA9FSFOrTbmQFb/0XjX8ExxFmc0hzZmp2Ny/yb2inclIbKaoqfJDCrzngcygsncYKUVL5BcwQvag77YiGfKjRL9F/blcVRbfmUJU5k0BPtEdtc6IV5gMhXLNkNGnog8iXy+A8MoMaEyTlgPJQAPdszX8kcTLwtwCEPlgmruFjZwB1lvkm7Tak/FXTpRkrrGdc2y/M40Bol+aBTzBYAcPPmPgQVbDIWjtI6hxvcrZ9EHBNOQSgrMe0qhuieyy9gdhlnOpsX2sCcU6Tpq1Z+9gHxn4YiEbLhtR7Fu85i1xy18HDItmOGxgibiqmLnzbEAPz3ZeVprlndP4PkF/b6WIvIYwUVZYbPQozIqG264HuVuS0de/go3oO4/yRhi7wEgPBiSZHwl2ZZ1VWJfkSejRT/6/gmOq6WWMeoOGtGt+mMYqWzu+jPAtCS3uZgrCtCJ8hzUIGxIWdP8ggqit26yptRCxnoNYrBeBO9UC1OoWoHTIHQTICagHvosC+aeAmjKBLuFGvr51o/2OxIUSQKkwRDwXDIEcG0wiwpDM3g9viDGBXLjtzNfQNrkRPISTbsDzSUCKUuaxurrdkklueH5Sdd/hl2nX+EnbLmHCI5q/VT8g/ib8Li22G4bbO/g/JcaC/6akNnQGwK8DRP6fhtY/gPDhCIRvEEHpUBktzw0nY6UOT23lK72kqmrIREGUZ/pJ7DpgNhaEcGbhemkkEVv21pE7bjdrF7RKCcpFOVCJJR+Utkx8aKuY5Y7Uo32zjIpqizPevUJc2kWKCc2K7IVHRX9lQ78cGKeyWei5i0Z5yXJAyJw44HYNSp+6PSb0aIlSy4I7EVLiT9c0PTOFbhe4wA2JkoDIhKVELgIl6xu0695j+merimLcngIIqCk0TuUXlcmYJ6dEvtpM7EvSiZ6HZMnrxFgJ8+zOsOSKtlYoqUEJfoy0/QQIHt7KjqAreAimo5MDTIqDoQvWFxOxEOhJsO2G96u5MTdOsvBCFR8irRlBrNKsMNi907JPk/a2GNfSb8lwemcN7TMM//gmnUJh2S3AMtab+tXmGiOu8xEI+ucyC5k2QM7/M+2ZuLlxDe2fdBhjLZ8NMRmy/Dsli/+xxtxeq2yjU4G6JWuHLmet0q0jr/R/KZMb8QIg82u2Nu5UB5HQpNlIovy1r1WCyMPzilnRS6GWQUjP2TkB4MUSDp2jR3WL6D1DYixQFLduL7tt37G00W1EoDGZWFPyNpRYgfNrlkyAhqDMwpG6ej8fks7M8NZuULZ1Xz6BcM+CVax5p6N0ogOz2FDY45cRUF+TrkEBbs7l04sk7QlTcOdm1wrkLTrRhLylg5gvuFlzXtpHx+cgFEslrOiV7Ouv7ZjxgxeKla/XNsfp7UC+6BFoFI2mXwxsuiBFdFmIRKbtcbhsvl7oSCcRIDWSFoT4uXX1dJOPOVXtJg5Z9aF/xC6aZEAAmUTtQvjws1dEE5M2cslEF7zeeGZgZe5Zw8le/Q9p8Jz7MTITyvfXb8OkoXuc06g8bV7Pf570qSMacs+d8atTRq9j6k+xFd/tof5uKmWr/IISYV3/irJP4yJ3IzVCnGtFLHKeUFJcVQJAjRdQNjihR2qel3cojmxWL5vFobiTliB7C6COmSC8EfmTDoo5OrWdjevxx9TgpI5jPgG7QvBzmonszpq0E7A6OX8N5B9TbemmcyTBzYuYXp5h/RCw1joBtJnjx77Onoq4v3v3+rrgNkRizI1i4zitFHb8RA7ysW5zFxxoc2pfX8I0cefb0zuGa9RK7ff+UUHJGPBa56Q/PKF5r4klr46rDl88ztKUjy53yj/BZQ2d3jGxjayyeP7nEM50MUouXVQRm0oLDuadWIY6bVVl9b1wwEMeHKJ+jQ/Pom0FtAFqd1hGCQ45XMFYKhclO39JF9dOaKfqyWlzwWM12qyF4xN7O/0PjD0+Gji5tBkc4eaiSfnT2njh2Q39PuPFAwku/y3A8CclX6mo6dpc5E2muhVOJ13VY5O4q/GkoNmuB3Fc3L11SR3jp/ZRc6Z3cmjKIdfafoBLcPb8OR0xvvuIEZaNq3/0b+RysyKBkhg8OPf5no2NVveKBbT5V/F/hCt0Ckp03mtklin+dWSJnjrk1GO8wuDpaYSMF2PjOCSmezRCDOwS/Q0Xhts07QbE1oNxVNMit4owtFA41xj2rR1IQfChA6SCPsaV0xZH/qx1yYM+BElGFzEeoBJlGL3/X8YgCZngIak/JGeb5BGHbYgMRv+SCuPyg1VtfK+Ilga+vmP9GzSdgO1IcGeq1xviJiFejofvGo54IMYHrYQJVes0K4HrAJFRT6FsFTriJSktw4FI+FQVnmFzrcoO1yabFI4h3diiS9DykXrTWu6cjqQOUA0hA20BxGC6MTyblSTQ4R00ZYt7iFMRVu0t6kSC4vdyF6cik1o98KjKyG9/JXTmjQWvEjT3qA2P3QBWKY7Ui6iZujKEdUjnr3cClt/IWQ7oa5Bhtx2H2CRqL8ig1+fopQn14JU+jGaBToaIZ6OyV+9oNVLBkMqwGkbZDGIKvHMxMLRI1xqEgtXZ0nvSKXHKCgslXAyTksEd1R0O7+b8bAQmTCVHCjUg8o5ZsCram1Df6xAL+vRAC7nQVguldET78liqrUz2abu1qimkSi93sPsCfNV85VIbbc8fZomnV6E7fsAdP3KNLpyNG1x9tQ/D54M59F/VpRjuywRizJef2S5PxRoSp/I7u3nmoeKH05+x9vb9nn9lHF2Icnus3mL3XqLMQsbThSJm81T/VmQsDvYLyiDBQKu3MCxeHutLDqsjwZfiPRIOWrYofihzAJKYEaOKO5eRA0jyW2U+RCJIhde0ivl2Evasnv2nivU5vxEVHdFnNhcm+2SqIwYHMaQQykWexTdt3au5D9A9+W3b973+7HLUd2E5nHfA3WD1XIkxZgayo449gx+7PZeJNm3KK4hGGDqBOhIQSpEkHKNomeMHWHu1aYMiijwTtmd5D/E7Yl9k8MPhOUex7D2FJ9Au/942UtOuV+uKN8h2+xH2G50HRcs1yrp7snOsS49YOrl4Ze8Q0FGQblDDGPQaxBucDLd7+saV5FY6+YJ/squbjoM83LXnejNYlU808RKtRi9pTQlvZG+Zl+tw1SrlGF71XzwBs/h2W0jsYw5IsF+UPMSmef2e0Juvadj316HcPzVVJj3hXvirSSrJfev52KvVxTAzWFKijFv6UsafsXOB768ntX2wY3y7z7yE+l/fWRTS7n/NR8p4qIs3vpAWCo8pJU/2qr0Ct3rYMo32BtO6bHzbdk7vABx3y76z5sMYVvZNRNmn/faK/B08nTHoLVQngxxcAKaoz7GYM5XIHH8hLxhwTKA6daE0ZlxKzCrdXEu9y5PwHqo6W4TKQSdV8V3F66wP2unI4hxQbf6ND4eA9I8YZjMl3rp2lxZ4yxT0evC+PwUjzorJo5b0sPeLDQ9SX12Ug6+1RLTZbmANJnKOjRolmBrqjOT4tJi1iURM1tHsf5db9xu873qRXjC4ezV8iX4O4p4zl4BtAoBFWoQ0p99FRhb2NhPXGrpnWjj1byipHuj3IOE1zef/ojGN0oiQoK9YHynB/sR18x0PH4LHx+Q7TBMaUEAdbEk0+1vSBohCT6dtlWXyZLpTOweQo2ci2fiJtqpm/loPsn1WZplQudwCRyf5i2KXHLh+YrvS/1t48jT3fRyVUdqbTsVfYU8SHezyCWB0ElSZ0MVbP9m+9V44SfwGuIupDloH4eU2CaF/eCYsGl3onN/Nt/ErknVJFnRUQftzmWN97krIpPca+M3ESXuSD+R9zBEDzCFt3jBB4IZiBCNdDtckBc31y/H/E6pZIpw9r5aFTcLAZ9asP49iKSM9NMqXvaM/Kx/6F+8gSiarrInGi3lQTbWDbyDksWY6pFBWfhQn8nIz8dt5aNtj2WQfUb7DTU21/uPWJCZdydo4yoNF+aFKxtxZYHd9LkvjRgmBvQDPC8BXmXJM01WjBa2ydbJtygoesU4MOG5xI0Fd1KHbe3ALbC09RDEIqUtafAgRh4p3HvxG/G5c1S5UTMuJJ/l7/Z9YSiaeHR8OzIBqLYwDRpm6tECZ/1BtaC/w3zsa+WUp95PtiL0a0DnGko86MAnxrHk0gU4LK08ORUNd+DbPvQ/39yIEjfVw+hI3xP3dj9ufh9+UlOEMmcUmHkLhP1zaBvynEYMhjdeUlpe2TWGFzL69CPs0m5cLRM6GIgKfOwhVv5GyIfMUr6/P1CLXwClvImpXS1glPAJHK5kDhnihHJuabxFGv2rJxxfoHVZVvz/f15ZKXRiqx/k6fnczU/PkRM5UsFRCUvqREZkngNqgUmjKdjs2L03EMqKl12ctVm/TkvC4fK6QPWGUUaFQxJTnTGP/sHk+YYyjBV+gk2+RxlP1zjYj9tKyORYDJQDK7S6dl8Olz1Xh2ZEStx0OKQZP5L+lqj2cR+Om58ChyvdPBqa6oDhbKX13VQvALknkQdeHfAT+Ls2aunYwqj3Gk7rx+Pje2K6PRb9SLobEs7nOifAme9qum7M5XpkCMdOky4eOVq2QgB/Y++sdk3MO7Ppe2j9+en8WvD060RgPiVvJbKNRqwxDldCZZ94fEmKOzSjWRnZ7KLofClGvXBCh5xpRsgpz02Oy0evU1vvkiFi092+DSFMzWXgZV5TGDEcKc4qzlM3AFW6SOLs2O0mR/N0CX5dyzH65WgsqMpuPdu5fldixrRDv9tK577g4EAnzfkjHm8aXKRuPviKItblQ0lFZ/HcTiPjXXtHH06jn4/x/nPvSLKrN5owl4ysDChopOF7q0imxxdA+E92xNl+lH49lKOBwYh4QsrV3emm73brncpYLTy94m3g8NDa8+Wfk/b57oCjHBkMtyP7QbbuZpkl44bWn8jHadnOZkSA8VwAOpyWJEIYwM3sH/HF7lVJD+3NbwvH64ICiXH+KDzDd6FENPUcOUhheUFSv5wBZsT2dqj7wibq/7zMS+xAbZDitTe/T+ZFh6WQIDH5SlApCQGvYCEVALcB4EYXvhVphM4W8rJQRgWDvx7OKZfmwWGT7eocJVxT3DivTdUYF00jk4KoHtY/1RW3LalgaAWTWDI7PduskuCwD0bpofKXzS5NeYMX+kLVAUNE5f2gmwsVFAgia10tEeZs3Wb8hzyj6lv0i70/HYCxzsPoddeZ0lFIWxlPvAT4ZBUfF/NWIGZ9QC+1fC01YjrX5WmBWslfo9zkaYgDnTARwo+IJgmxFb7OTMrfwd3fowIgEHZtYSnduok9BpHOzUN23btDpiFYhqmu0TBD27x2zNBscFmoZzDIv13LCxdL+mmV+GWxsGJ22K8iWPUqtNIQSzumuqmp3BPpPMw9rEaX6sdolK+1KLVyjmDeQkiZ+axgZLmJOp5fhSHTVBx+LLZECxWzfinI9nZve1tSQIkqdtQ3iWNCDFaShBOXSS5BYPLFy0Mv50j0xTD5ezX1XYnuseyjtaK2yPWo3juy1INMt0npAURajxLFEV+jXVsohJvKTLkNrWwBFkklwQXGFNjORiw2RboA/E1TtMWzWiofnbgcxgmok8D8SjK6MWl3bE/QFfDLftHmAZPi0VBy3RwMo3ZnBZZlApXSwWFBHfENF2FUzqgvw1bEbQSy7CLwgDaYZOV6z5lQxdhPLw/k3zTP7yKl2nApXsiB3beuoTXQ2Le1BfY2Te2PIG8nUDFtnfbFVaoDz+birW1XaOmEcDqFb0290vSJc1Erd8PHY2y0XYAevMT1OWOzTq9+yT2SBokEUUSl7H42Eb1e2qgD4SaoxouTVlXKbg2tx2k2Qgu6LpOcpV05NgxjS+0oX6beI4vunfmSzzKF9dDkJeDbkoVryXrmhCeOfqisgaW7bm80TSBmsVqgNDBmJjlobN63qkkCpOGQQm3ocjHLZYRrssu6YvTKqL7FdnH2Z5d1s39Q9F1gzTjf5Gz/QEFxVYqN876NoeEcQVY5CMUblCgY8PKVsucNiZmQ50ZnVADG/vzykdp1sUqiw3KkA+gDXiMPqvyvc9fp0kO14Zx0TtXdKVY/dDH1zPGF145jSIqJluiNGZRFusCmG7JNFBiEeY/jj7OElHCcrlrjpz1AYrgiAZDdc8NFfQJMwO+C8L7rwLZCItul1JwsUlDfh+UskEUuJwtjmqF72zGZmpDejKdYep3FXrKztpbcfxk8mJUsU85bpqimiSmJ48EbukrGefjJ6TTLhFrsYx7uVpKt42AUD1O/xGc1sNqgxIAyZVi7t6mBpWpCHWqJcyxg58xF9KHnwZGoNzg9T75zQYK/5we/WI+uvyKmF51oSWvSugHZT4wMsAQFspXSJm/xQuOejxIS7KsG7TQZcogyLAzG0d+EMvpHGR8noUhW+Ls1XZckGFc7ESkM7sXAOKeFVCBS2eRI8Z1AkgclJpPL8EcP96qHe9dAXM2aYzS4Ot+N71auFiaCGV09mGBgtZ52B9jpcmoZ29MwtZJtNW0dhd9wWvj7e5glcC1O2mhsMAfdAXg80wgxYjXlWiaG4vAOkB6F9iOdpsxY3aDmAzrP/VzFive0/twb0VjM7hxvUZaa0rAK90Rr2itQHU+4vpXNnrCLk6nS4zklk9epauu5iNHDaZF4UgY7DEJJoZH0mjgODPLsWAL+rCC3OGftoP7kW8ZjNhfJhfGyIccdMfvGT7Xgvj65MFh6Dm2ykfwaBeYkrA3QpbCzQBCiSX89OVSDZQMUzJZomHnJTtsE00mHqY5v+EvShaw1DW89d5V9NgNTax4iEMxlaBPLyPPcfDWytQvdGycDmNKAYipR4B/dUmol1RwIUKxkbk3pPjUmQ0HGy8BN3EAs4DhAjk0ORdUohZqJX1KCt7UzbnFGhAvnj5mjHixjDcgGnJEsfrPWdhCRmuSxxosj8WmPdxGB+72E+IooN+NdCVW8kI8v5Mj0LqHSJyOcF71WG/DGmRdrkJYq0iRXifqVmsFJWPi2MEkHcMcAKHiZkYk2g3j3xEY57WTk3hy4FzDIewzfpIWCnI1e5hfd3XQFS1dNwclUg4Ekzko324YUTZSRtEtNbKypizvm0ulLVJdilajKBwDls3hqJqX84gvgkaE7Is3ICbF9wknPLYuDqoriX5I17nET9UhBPyElOWy0a59HHCCVBCrguk6Kvm+xGfB8oBcOeK6mwEvVqldt/dDXpz/lqauXqvAwAgzfDlxE2bu60XVmaZZtl8fIEJ6hab85r+GBzRfV659gsgKYSWpmCYoOOd0UZMgJB+LXRGg13XCjaU6OPYSC6+K8RovWb0rIc8oNtWTkWWQVc2rr5RvsDoNCeCgoPuXaBNbliqlAEtcdU+ml4ERQHu9uNmcnf35bfXHPuH27IZ9TX8Tn8XFUhrsHIB+9qkbMXvcDjCwxYv+10DXRyWHPkhzB0AowUKJwGpDkuDv+eK05oUdPy/ttYeuqPuRDnaDLIDxCiBc5rYoS7mY3V2H9VuJL59JOSSrVwYP7zssOr/lu5tlk62x577ZSpjch2ZHVdANcPtt6xTDeLfr2l0Rxhk+ZrJvm8S0GYFS0sFN9AOVB5xO/eoRY0V4J3zkFDMrjUeG2PtHwof18PBgVIz1E6y2vq+8vFxAWtCaKGRpvRSs25XH1hHudhAQQfjoiGwiODNH5cKGdEDvrGy5Eg7cfK+9xYNyd7+gTYadAtjeuJNxxlD8+LYP+7kN/3CiAfIYMT/j4f6889LX9LrwN77S5bcNaG9J7C5CDwv0ekMlk2IRwSscneUPvHEB34YqvP0GzS97bH04zmaup82k3m6gy/Y3X4Ez3vgCWATE18+GhnBekUReqFxAr9987Si0BKMwnrnvn1NF6DipcGRkR3vTz9aqGX70N7dPrZHau/nUbsuS4a86BC70Km2PuxdZfWwNu0xXDKmfQGxJvvfZc86eMtvx31AEzuwN9/kBAs+Gf3bk/eY5xA7gvJMChfkiy0bXvQB0afhdTWor8vZt+M7t2wR+vV+BFXc2OrWAo2S/YEKxwarwQqttwx4qhjBCo2XoNueIpzjzyisF1vwsrI8TFub58Rjwzh4GmZmchoU2HoNdYppBNeEpahSlY/y471NPGgx1Q+d9J6R/34vGlwQ40lLjfzxpvz+u1Gp9l0xOzDMRbDJS7J3PxJB1f/f+7zYcfu9iFrX+zC52ihLIJxeWHDtrbMX/kFP1xwwigKj9R+Tp9XAUIizQgGevwvJepTTvNDVcyotfz9jD4MaYajicCYjpjT7BULI0AGvGoxq2D7PSj50QZYpc/BKd7JU3VqvJagBk5ypAjgMMyJxalLLqg9AiH/Two2EPxANIXOG8BDieps62ICJcxvStsYmUwY9BiCTqk3coG6QyIXEyBgzc9jiiHoV0kY5OMk+JA6UnHFmQch5c/UQgScceP0p1CmmDUGnXGog6T8SoVEujk4BqLHIDabAMmDRt87jvTgtbevp2/vj3fK3Z9pD1RbMO2zILMYf54zHnxJWcnTeaxeWQ+OZlSPJfOsyPzZUUZmez4HH7/8IHZYDawMEsaH3B48F8eo93v5pNvufmx/VeczZOpxNIYi415VHSnoRAzEKeyV519fivMx7MimzfL2TxZyXzcjI2KgwplVWyn3+0m1oAwVWuaNyuy42VFWX72aEgZCe41/xw9n5FwxSA4EX7XoT9+8Bwpf7VtpDP7Onokwlkk4W5keAKmUpu6qS2P91Gp5dRj1XTcjjJ8Vzgp28f97nFzz+oAef/fJEErTRp3/+8dEYyZG4Ie1haObawd3x2/iviJzbGIf8F+fJlHNsv/P2oT9y7e7RiFZ+4KtGFy28F9xHQsSQItZxITn5n4BwmEIbsif3eAljJszHg5TWgMaXYQmKif++dPSZT/cNZL6QG9aWMfUw2dItSixn9GF4oCbfOdiicoUOQUkFnnnROzSIYKEv4g+KZKgaNejh9GkTkirxjHFIAd7r1wLIlrCfunZX45rGytxcEpcPz+vcp1cnfZGkM4CNg08F9nkPsqGM1+nNLSduNFdPS4Lz5F6XIppmtgRoneq+U/P25MShWBmG8vnEiUlnQ66H7TQ8GINM1qjB3lCmhFSe1xlqgZOC/bydfG8Z1qAZUpofL8Xgc0RMP+6TEzesFuW2SYqWPYNLULjnPiaOFYShPrY55m1aajpOG0q1Ve+iMK3LvKK1pq65fi/30UItYPLH6Qq2CX10Y+z2EXcA42KJDZXJc5bhp5HsfOpHwTFJH/7MZ46Ck2ReCqNvmZ5crUajHeZYZXTeynqW36fmXt1Spv2JTSSGt/eD3JfvL1RI7cnKq1AqktxuixqPFESP/jxi56ixGcr+hTFZHNA1jEzAElGIXTMUKV45xYa9o95KGxBzVnRyOkyIexoXlwpVNW5KcXTsT/3b4kPBb14EL2TXLrQaNi8XcgD5RDCBNKnPDCeDDJUrbD5GkWSZ/8nXnhXOSCeAqppuhybkvcpT1xgTEpCuNkJpcPz4iaPo6fWBi43cpOKM6t60NEQTQ08ar6LvH+JZKuHzEfwfmObpLbZemOOT5vRCQXnjC5O1NKw4rpYnIiNF2RsA4bgydFlJP5/UclRIAbiK7LRyj+8luciCPOVuBx6xJ+3Oqxqm1QRaneCwME1aMfx6g7EkY+QZIs6meWE4rzS/KNO/QUbJjWgxOoWyFKbYlHIC16CIWaAS630x4gOewRT1k0BNnZRBxMKrdH4dWMW16wziYHAMJgT83DMuV15Nlfy+XTexBoi/Lq5FhSb4DnbNVcyVKuRd/+KAaSTFNPpg5F0/8rHFxxHiwaZhRn542XpAHCgE3G4dKadimIYoFDL29JL/60Fj4qzf0cbz5eMjJOJaWRdW5DIkXyEpGn4711gp0mBO6GHUWhKXsqTi3V9KApSyobeQESpegS+75nrCVrFM+cSk1oBk8yMG3QcFhjT9A/p6jIr9wiQ5WrZ5DTqXM64Rhf2VNSFnbzOmBLbPuoFC3kzHYkKeGETen6ypeKBMl/LOY45gTCFewro0npCcIdNfWD+RLTrEoOwBR/TrWRhCxXZOuZeixh/vDUulAanuLt9ak+Xv1uy+pOn+PnzZVtzGM8p+DqNgoK5nPNNhHRK6SBubq6fRnGCwogI3Hbw9h4HPnYQJK3Uu/wwLyf+laiYPT+jHgWzDZq1ECt4sfBbVnrseib4Xa0RraPELBapnc8pl2IgyOlW/30NpzRNhPSI9ThGbkmZlmKskQi7nCvSuSDr+M1ZWKXmthpyKtPPjy7FTBZHmErJ0NaTUBA+I34NfvrDQ3HfOnjJQn1l3mczBbVGVe5mCnzifhb6wT6vF5JBPOUujx6Z+TD9ytU3PS8gZ2Q+CJVwq1Es3nkDJk+tsbsx5Ul6w5w8HrarINXJGOmU+xRlyaqqKvcH6kMnO541Qvh8RXH71XsjIT3g6EDWsws5q5+DH+Dq5VEfn+LbNrgNbAWREK0t29sy3dkrnpdypuB0tKJMmWnWrQv1NxnHCyadkwTOVugRbzTx9cNNvc9P1ano+qg6Tf6+cHVxgiyZeJTkLiZioekcdEfym2CwqMike3s4bcOs2brtW7HJNPDGFU1AkfaUz0yOJ3v8AbCRigsnZLUTOqbvT3AxAYmIpaSSWqbE7+RVZCDbUnwgrdL6Eir+3zyBfGjC6t69AERN462C5UyQW8jlDWTgpLZvVhUbjj0vCi8a+v/dgpMOLAFWpzkWqz9hAYLaCLE8PB2e/2V1/sLb2vCr6jhAezM2ol6wvc+8y4T94kvea6OsEaUgXNhzJ4zDehJr04Kq12ZrbGnKoz2w0pSlnfGAue8/WU77fqDqV4IDsYqjSeyok2NADVvLKLDTv+wI6H+vU7Mhs0dLrUuaTWY8JTUot0cMd34ALF2bmfVs/n+Wy6+Moq+YZpsvdzyQMt+e8nxpE4mUsOu9fq0lBOKiQeHdi2RDu77FFigbTaTYtYp5V0J1xpvH6B1A7+kj6nL3j2pmmZtUBZxQX/h+f4yj/oltzDNm1ecO12cgxkMeOFFl7zsi1khIyJ6vzLlTosVOioNQXgpUkP8vo5Cy8MmmHKKM0mhFr6Wpie3/FmJqcNEP/581DIXa1gsN1jMrC+sWPowWszYPFfPLM6RsniXtA5Ky+27xCxOnvP+RjlGh3D4JnV8btJmZyRzProG8JXNTXLiGe5kunSj+MOMMf+TZcp1FT8Vi84WDAefkFBCccuO7lfX757fIBRq5dBh0gaiKEy/G5YIO1zavNt8KbyQbdEsezsw9n+ubiiAkPsABWofruHsqTMTizP4jC6x3vuOhDZSqIzsWV92xh0xxqWGF58nahHx3fESxRFRYs/Qv7fiZGrBPdkXzhV3Jk5EBqLkGMlB3usjX0yzgIUUeTabIkEv1nqMc6oa2biGmmT8aZ+8zyGLaSnGiQLcvgriX4xjQnNKcJx16V5HBz1OeNGMOCPYsuDelye/uU5ZWzhJ0VEHHCcHK3wDF8ebnvUZPNe74QR6Dr3561meszJoalg9SKixY4bbnpnjdlmor5ARQuWRCfbbUrxVxUJEJGvU2w/2/vtv4cnOmaG55xzc86Jmhj7rVDFBZfyL76qBzq0jvypLc4l6flISAY8ikTEMvkjnKB0c8KJD2nWnYvAd9tHX2TyKEcmIFCWN2wGQwD2HvuHGZ3E8YoLtyLFYp5DbwMZkpxqwMYAhRInFBC55dE2NeVP4MIl2hediP6QocRFJqKUOqPRLCHp+wyW45EvOIzOIl2msiDiNXIj3biN4q2w9V4qAlIijuecAPgwYgMg0BpgrOjPX0MBRcwF7g4A5RoTSKH6ut22hU6RkeCZRkCkeQo0zHFddgzgTJCLY248IVxYcloIolqytHH50ZgdfCCKtDHK2sT7O5rI5xJv/8HVrhHJngR6cHoM7h8JaC2daSlfcXtYQ0bMMWm9xSKRFeawTvblTCE2TnFaLtbN0ffJB9tJpJ+shZxXGvm31EqIlXut9mzq9bhehcZuvlMrqtIQGiaN9EGyfEC5uLGgpDmdTUFs/lUmmxQWuNIaIqHTwGYB66x1QDtg2f11azNKV9qtQFqXvJlVOpeyudur/HiEcfx/b91ZTh66NJ9MJoYDNBJEfgXk9FSK6LqYlTqNAq7TJUSnLeDcpg2w2fd+nXzIWx8HTJTB0bzsuhzPQ502FObpgxa2im0QbYvUrtY4olfpK/NhXlMv8OZRtuJQ7ljPkwFR3FMZQ3WqhiNj+UnJ1GVrj9wXnyletYrNpa9pqW0tzfKtPdrZywlLTHJ2v0aq+pQAv7xJSdkTxwpkYlSyyJOhSmu1Gj8aqJApamabyJGdkZkMeofCiNrc0yTnWm7bo1ujwCbJV4m/TXM3XYMhBXURdHweikLOdQlm1idxhh8nW9/H8y0mPT0L+uhUichrSXBsJf4BKWanm+Ix7RhbZ5iVpD3mCc3gZ3abyDLvrgg2NjZxFg718Hzd5POnhJIjZCgbTLGJxiq1tWlvM5/EyoMJCEbs3JQyjfOgDTXly8eXJbggL0R5o3COVxUbtjRRN5/lCPiuY4j90JG7FqM0x/g268iBPg3+4rGBp/H8bn/5Vqnrs/+aS+/I0+W4ErRxocWmPQ/iPZN7BhEA5zqfSqKw77ldCUNzWjKP6pmKyKj635cHC2W9l2bKCDJfRYukXX/dr7hlim4bj6U1YSQ5n+FvJBiV/EFVWtMwAE/Hx8oIy0p5vHKHR3f4r7kGCF6FnHQ7uAq18NYH779s/cHRWptoGT/ReLcJiGWF25DGKgc7DA/apqaIpYbLKG0eXt+W1Sz5cfkoSQDil+rbA5HAe6HCjiY12OcFDjS4m82S8DZA3U5pPTn+cXJKcpIwvmNLxh9M8PfzQhd5H24tJcb6FWjgUMm+D6uasJ//7vn9hrZBXvIppjawL74/Z7UQxfR83v5z08NjksgKbjD8QR7cm8CbCcQVMG4nv0YJ2Tl5LpWupo40Eip+YjxoKPKxD7775V5qC3093xZPbhrKrg9M7OC7ZbvtOY11l87GLXtDvTGycHhnHjKL3abgpSRVBAFg/+6UaqF/W3DfjVVs9ECuOxYiJtC0hSezy6Gyk5lshMq7aDQCInDhHLnaMXzNzzrV9229GMssSebApEhXPSXPdrZ2k/97kdR1eWcQLVBn2SVHOzzSXv22B0MNukUlWnvgSU72cqeMv3eWBuWvBr4tjccvGe7KfI3nIJ+Tb3CVzWI9qRH5Hkdxvo3/LgDeYvePngXNuz/pZBm8ynYuVASi4YzMoBjfalyeeLeEYvQAYTQKWT8BOch4dpJPoTp49e1SdxPzk9c8e80ksT+J88uaTGE5e9uy540m6ayYSlMBinTcVkpvLQ12wCoduccQnGBY8Vg7rYjy5qVzkEPA/38qd0vmAqglVKIZ82A/PVPz2JEwfUSOPjW2u19QyMsPHmBt2rgSQcJyJjTsV+4qb7D0jsnRMx1qqvrpPSaRuTt8oXRUHeboTH8paYaclkO5/8Ym6ZtAoaTRaLQ5H+JHbyxxq65VH/eSKRhKdE1JT6cByM6e5OIFCpcJ1owWUjcOWjTZGGHpp4D6uQsUh1lmAhJPxJ9o2oQ8szzoYYYLCBsSvx1TfysNqV6J3QZO/IDg6aACGCMDdMn9Jl5RPArx9sF18ePbW1c+IBIvITzyJLs89/vAxFIwUFvKHY/uXQ/nM5rzvHzfkfxdBVSA4Dd/PKPohkCF6iJoHSQYKJjlCPpSPnk7fnykIny/ceQK+HBEU+ytCB2YbCSoA3r8bz5Kjbh9EG6a6R+4U/kznCpHNiXoCTtP7Wpw84NAS7YS8pZhULfbdEGgK2mH/SEFArsyQ+OLTNT6rBeIw/CujGiTI63owvLjOT4wQT6FzlSJHphDefvsORTFyz1atDEQE5Vow5XmnMJycZzdXWM8EVzssl7AlYgU+8O2/Ui2B1MgZ6RkaJyqaIKzniOK4xiBZmfrRLewp0b5jZCcfePDpeuZPInH/TmL78VA8C4n5uDTR8fU/L/88Rg9veh+x8PtPTAVOZJ1j++KvNSxfTCXNsvRR6wPt4CREuAQYFR5LB478Md8H6eFHdHsVDof2cy8/coUXHPOdi0pOINWTkacw/gCfXiVEkCcNtN/xeyOurry4PGFKu3jJ9OLust5ZThilmMXxZbVkePREuxEGFzLlWZFvkP0PL27vbCyg9Co43ooo/cPKCVc3G+FRhh5JcJNDW1Gxw002BId3cOd16AHACPJI1yDUsm1CKVIFTE8pqPkjE97uIVZ5RUb9Tt5HciSIJZWYuj3qnUjoSOfJG4fGLEMSrw3BOFTBEZGc8siqjBs5COOLYQouSclBz92hg3qvbduAFweBtOOxaCcjtfRgjP9e2LPmkuzskI0x0nZNBGWAWnUDvQ0DfEOQ3bIIEjgCnEYo7FaW3gKE5Ag2r49A9I9sThTNGJGYhCP1DVuHcfqR7yha6/7sEb79EsKEs9wY/xaR/YQmZDydHhjJoX9JraFIU7xe+YKnPxHmeMtUySIVKbOcXFJMXf8UUmaZiO0fBCi4y6tpRfMP67YUrn4Yj3fRfMQ9mB8Uc8/gfZX36pHyEfl8iBhy8sAIZ1BJpVKS/65sC8PdC+GIf+Z0HUxLj8J4G5XpkaNYQwyXuBAbTUiGDSTjSmVFXIaPBfFf51aAQ6869ghF6noWKpqpFyJ6dLU8RBVLSTGr2eq+MxPeg07gKoEIZibIrllkIZZM5zDOe0Ghg2mo1Cz4tWXkw70livaAcMncrZyQ5ZC2nsqXUc8MVtrhIq5xcecUObYgQS2qb+nxVhOZe3r4Gv9I7l/3FAr9PhrESmQxayy2O38pn0LultYgI3NtGYJnmJF2MzSSOuKENY+zcDXBAk497ScGpgMiJLGwOVWVrGuBiqEDb6fwy7OCBKDio8iGNWIUwtgpYcKUGMRx+oFwKbOrTsjamOSMoFXRNFDwpCiFF0BtutrxDpGY1xlnssSiYE3O4BqQfwR3WI0J+7TnB6GqxBXQBEdVSMBvJmPxUB4ZKK4IEASQ/EFj7qK5YYIsTFnHALQCcqMzQXvFwD8B7uEZZcfCN8FgV3gNmuilLf2On+0ZL+fYqUl2Sw8Okg88AP90NplxvkOjtaQL/86agc1uhwr9mmRIVMBm0eon4jeHR2xrjDqjU6/GXS1R2IoVqtCsri9Q7oxdi1UbJMnZNgnbJmFYtEfdDStjYUfaV7oGIl0KnVGM4gZkrhhIogViQl/QGVmf2XgelwJOjtOEA1ZJh02LWPFq8ZKGzW9vzApNxkbWjBHZlW/ILcnDUvSLycFrsGQN/MhLb69uXhpfRLINE6jOwyR8th0UCC06yezVbmrgzYz0rtB6P2in0L1Eoen4Mo7PIF5nOcSphzFDXnrvim561ClPZH2h/5kmargi5WDw21gJIP9JOz7UOsBYO/wQkQ6AgMRLrwY9qA2qj7ZFu+SakYHPPrlcRelTtJ9W2g8jymGEWU+szNl8PyhSichMtAWwOPOCXZf8dp3hR6dRx1HTdD84uWm0rcQ+ZZxheC6RyoUB0lW1IkUlKlx22GR/8m9fBDlyIRCGU1KyjQ5omWhvW/mgvQMl2wsJkNBda0gJGsBke9g0vVxNaS2ac8iJeJ90JQgQzEZL30YIAR+fpb+I905Oh0WQVqW5cuSusTmNLpQeA2ZiW9K4w6GZzapGxcyuyXL4/aRMBsSvdRKCvsGKCTcGrpCH519+Q5cXGpdc+sM/8BczT4aPAkejuue+iT9YjL4+7VsnuXFqUfh1n71i0Tv01bl1BUjT5d9mbnnII62M44LRWBMSpWmgo7ro5h9ryW+hul/nCrPiyvYvLKSRHdJnZmlRUbvlgXfPODqiXqak+njLQMmLtYC6TzXl1KYO8E8/ax3YDtqAywXIxiIyrcxknEmr0lQJlHX1hLUVBRlRP2Gf8eupW5Bi1lDok07aiVqywpj0cwDIjLAvp026WZK626x/8ynrMDozCiPvR5IrhgqGk27RYmWz0UrSS5sDhouF00R3lSoLZOiVXG2EoDCT0UQc9EgEP4/MNBF39RNnNPmw8CBDrbABh7zNPIQX9Mqpuz/tY+F4O6Itc71w9QOpTxK4VsaVr+k0p/x53qZtFD7bNMVfX7csCoIwskwOGOybTmfsuuY7p4090tIe3cpYlI3X2e8c5dPzquh0bP9zy6KYoC0561zolyZaxosvzOnCg9ZEeb2DBjrN8X3sRJV5vF8gAiZY8wsxYBnMq9bME5krLEWE+XC1ilBv9SEKmtW7yHe3xBOUav1FykVI8WeAo9VRSm8J6k5KItPupVHlqP7GX5DDmavvdWv2AQicFD5veolS6icYSsim8v2rJnHAohLqy1pPDNOi7eH0nc1minl9/HqTSGfWHd8q0WhXqlPpb7oJN3+fRKwLmwS8cuv+DR6mbWV17hsqNHivd6w+UlD22Sp3330AuWos8ecukHtCrUbCeEOdQ1po+NMfueQ+C+/pHcVWYosp6ksI46erdn5OB4Iivm6hvDsCT0iPSEFXEhY+/335XBylBNZqjCWpe4mAioMXW5B8yhQzcdsb92al6YiybcPodZimSodIwb4QHmJak5Q/vfz/6KV8zMUjT4hfE+mkHMOzdF7LviweTcSjjkqr74j+MCVNVEG5hp4dPzhZ9GEZWT6TfkrcLI5WxpU5KpZIzybgXoZcB+upJycEwgUwoYKJmWhFFpvy0Y3tHzmX96Vc1L7oZmlR2W3Yh1NcDqs15Q1eKpWh8/WorNqz51dAFeWZh+OVKjhPkmUzxm7aBZk2gbRd1trdBVLnwPV2nxg4WpmsOmxqBg+nGv1vyr0xoRuWBx1qfuqwCh6xnsjaOsu5Jz+sh1UBJGPE2uB+GL095cYsTBQe9iP8QWuYbZoy4gJwh8wTAoFXV0kWOpS4DegqO8P+lSxRX0Awlr7QiPswmDq8EauUQLfzQ9qinrmRV8eKw2roN30+1EBvEtHENHuSqJO2YQlKktNUPCzUExignVIf0nKyg47t0pYBXGFhxM19y7kmDnc4KgaBhVuNSg3ebYOeLU/L4OdBx79op4gkEM1a4fB7i+XU144TJlHtWwVhY6dR0xu7syyYRXUGBWrchyfGD/wiPvGxQRGR/nMKDZuE1UBOiWzYspt+xKxx3E6gLvhvgMc8P9rwrUgPEDMHWJU3/OsGJli8SbK9sAhV2w+NzaqASwYWIYFhiMQv0eM5jkS4vPmkkHADasZkV3i0sbj2MOBdHEnTOvi+nRQDSGwRs6iuK2A4qZKCK5UbUswCFtGDEroiQFG+li/oDoTmRINKhLbT3wb4qGIfDvG4oGD06vwuZ8WVjRPg2WwOMslnTNzz4l+oagJCPnCNSevZuOp0jVA2yIfjlHZ7wrb8rAiKMNSuypOUohLXAM/Fri3q1V+IVg0exOtuRXFFm0zB27GFeAo5KWQ9pi0hcvpacq9PTdTDmcLH7BDMxMlfFQ55R/KxhQLFEAnR5ffuJgsiYU+TlqQ0TF4hpzsk5GerkUw3HWlgKZTEROavnrveF+JColRKzSsf+igXsGQqJ8TwumHgN8JpFFU8pdLLb7e2Z4SoxGiiJi4QCCBhVAUHRic56N8uHa9UoZNsgYaa9z3WyVg29c1INO6Uw4iyEIttAyxoeTJ7wfJdK/x9HpnMXTD60eNhmBPJPFdMsEDB2aPFruOW1ssT1SVP4aP9ut+3ai41oR0XtohfgkWy/kZ+3aNGkshX9Md0RFZ8RQzNy+GDj3Rcqzyv+8+Ikpqu9xc0Px5WFSGiG7S1C4IsIHfGcITSjKOiNsMYQmMkHkgQW6LWQZYDQnFWlnHCKIhXnzVPGaClXi2bkTgmWLSf5Jnr+9RMhE8LycPHYjZNCzlUT999BIiCun3LwMSKKHWXdDiOPN9HY6oLJaUxhJj0JdhzA35fKZ2FXEFc22aNhba50M8mF3VvgH1zE/RHouuMEfk2SWXLo4LdsbQcLbygWn6BjTvpKxtD1fOJs900AxTD6OBdEk9PhrLpSX0BOGtMxN6ejmh09Qqi6oBO7I5FKF1+yGhJzpLbd9GB/1kqIL9jHE1kl+WwVXmX66jHcqseYSv28pIcwk+0TYvVigtyFes4c5uTm9uP/u1+2RqQS7xzpHqdN3t1YhKs92vv6u8iecs4y3BCu4RE49Y4LXwfUE20y3ZnjogY7YX2yQLj03uKsFkOnbjFA2q7hB5eO4U9O1TaoMunIhtXV5BHWuNE3IqmyXhGUxK5oqPXbSdc9R5YhP5K9bI1Nfu4/3/NQIOWK7iKT5LLEejfeJnDdwLR/gCnfaBMTtofpOAWQyT5CpwVvzv6gLW+vmjgGET4IQL5dKHeRNxJ9NvCS0HogSZvGVIEjNCK2Otq3B8fFenxucXMdQqU7RwxL99WMOC9GQDWVRliHyGLxQcvO37d3qSMrXeLcWFVEuZZ4maMAuayUjGeZ9I78fVNzk+rMhaGk0vw6VHD0SNFCBpRhf2jhOLYil86wIG8SlJ4nAC0WDX7EnJFKCoj7hI6WN59OIO9Qu8Sa9X/kRPd64cn5sf+T7SeAXkcX5ZHa6YW9REDPzA+1omglkNOKUVzfSNS9gsP9uSgYZFl6OU2aqG36Rab/XQ4kQbRFB/I932BMIDxm2xzfgSfOij20f9Hw0EFksQOcmkFUUD5kOhOWVqNjGAkA4mkoZWJ+gj4OqsR11Ym1Mt4+jfQAjY1k2lg5kkO2gSUuT1f/RFnLceHAubjv9dZ92s/l+RbxC2GBI00/yrxoA3vNKWWUacojiY3t+FATf+KoyUigYJBmm5jjbb41Q+2pvjVvcWPfoiv7Wk8Do9FF//f1moLVZTGMeOSJJcawiNNYV3Knaldj5aYfyQ+xuSBSzUWR446hP86Pw/mMcEsLtp+hvwKxU4jABaLn9+3OX+FrSO1trJ99TUzzLJ/CZIUpG7d/xwNe/xo6tviBIPI+dReH76ZuajjUX/Eq9SNiJHJHYR2pnCSeCNsD9/niTRp9ln38NAANZQs72cVuQv2Snno1L8zJ7wWpR6g5oI/mYIRIq7i2IcYTOPOJ1xyXGZsjLgIUMtAaDRKLlYy3s/8SJpfCf1AYdQBJij7jIITNHy+psa8vZCL1HRlM000Gd7pGagXwOky7G2pURwRGDCEGYvWbuB3x7/gOJ+Gk2FSOcJNkx3qhngOEX/4lwVPGo7ausxa/TsiwYH6ilif/2rsnRall8y4G7QMyo7BOt+S213K7awNsUlNykCa7ijPnH353jQqJlRBRjrS87Hjf9qSQxsJay7nuIQeyo4g4RoTNqdIQ+tyXzRdi68HRZ/CzE0RAZwquFkAWd31p75K9cvUi6XmTZ/7mTqTWmbPDxDSXC7RAngVhVVuQDEWIGdRyCE11z73mvpPKk37/O/tom1SXXlno2SwoU1ZKb5C8qh45atsvuXz4QBQgAAQ3qnIT6a10w3JN35hUvNfvEqf8p2zQIRy4m1fg7o8N00eFi2OxCGvaxTUyZ2F3KlsWlofMwt7IrPCVMW+zjysVe+LyiVXuOIUpNRiDfoQLoepI8ZkPe/nwUXAQXKc80U/RWc3T5ZwisbZe3Fp2FwyAvDLPJRg2PbltrT4cG0PgeKWDHEJINJp0hjHbqALxvXTnEn75Ids4A5MTkEVRcLIuGVX33LZxAy/Iqo6qHJ4W6gDVrjp1kG9jAy0td6W0w+PSVc5+JhIBOLxW/v73Gy+Mvxrt6BM+HxTu5T2nedTtV8YdJSYoKwVcZKdm4yhkxP6VzejKY2I/wHGO++qi1EWTmnEmNRT3kgGwrneFn1v/RWNTOx2OZJZ24Onc2VZVE6kojzYm+O9iVscuALUNhdfmYwQdouHG6d+WO+X5RjkivdxhgGsjZkiSW0sLD/MbKZOO4KUEXmHwRGLBMihIDr3ZBIP2WyeNAktRtI/Mg2kXL5Gxr1Zmum4kHJsusjTQwodIi88Yu+ADv2Uq/5ruYQ7z0MzsTYpCHtH3/TJSJI+v8Dd018hRv96rOdIWJBGFNrjsWzovPDd1b4h+DQ3Ihp50BwvU8iUlECdS+Kz4oME1wpK5jdrn9m2L35M1H9fNuQ2x1FmgWX0e0ka3hjGM2rjAwtvhZmDdJ9qXJIt/p6reO1VxBu6yeSeU+vj9y3oA55YPncuC/7ok4CP62CahuzPc7fAqfm7s7EyaBchK6hDYqNRaIVC9TyE5s2L4lX0BLAEC/ECe1pPPmuzbF70/yGHuabU4asuhtneuSlpVzVsytR6TikXqhEq8FCkLITj5K71FImYwk8PqSqkDMERifYBjLv9LlwJpOUN74TnnAZwoJ7ve8H5ey9iOCGexOp6+EyBgZba19ATS9Q/FALflLzdFK6o9YSk06d1c1cVpDtMRHhybgMRrzGQRF4Ep7DvxKRDFKkWEsMvI56ALMiMA5F1aTGnW+O9/AsQbGq9MS6MnzFljrxwsVE6/UvEMMfI6wgWjkS+Ydwg7XG3A/5mkK45owCdM7kqxHvK/cTzw1CH6cu/BPiKBVlhbjVPZhskLn1AsyH3NirkojVjhok4bwdCUd4wbMP2Iz4wiUyMCSO9oUEAuIpQkn4ppQRzjvY9CEs57PRfQLfLTCJ4pAVNcSfY6Mtw+hLRQ6JRlywSfFyUTmY3HgQ160mnmDlYoQaqNKHXfdIxCKT3JIjtnE0xrNka8lRMGPZ4ViC54zHwxEvnFSyixGRNFxlVBC0ve1g3KCOL6MzTtLlrx2ZIhC/9ff/WNyVIdAbtY6hXkAwe2dboO9m561iegTT9dbMglQkQSN989qxNLayrUKdnxDOuasr+S1jbl1HyTEQCDaE2k8T0U5Ms3jBy9AmzvqI43WEYhmFZwz3SZlIQ4zB93TuEN3oHt3bROsnmaMzlcRBtTtnTT5jI55Q0wgKJj54h7HntM3vNeiPgvkP4+aCKSSld4VA1gbPTgDYfWu48p6LbsKwuvfWn06/jM22KcfF4NpwSCVOSzeFyBFzOQ911cxvLOK4nWXoPkKZAp/QqftzNpfOEsTLCGXsad9fmJK7We8tbwpZnyLYXVbGrB4m+t9y2fYRLAqcll+uNDKFXMGaRfTpeq6IzrWMOzin03G8K4TYQ9wQ+FkalInQf0mfHDPRR6tvI81DeZY5cWRmghakcgPxqkdzMlsFxdBtGywI+26ZxCrUAz2q32r1Fx382dGxEH50fV8Y7IilOn9IlWfRzJlnCUeBIfkF4grOm5xyw+0HFhW8NWj/anqgi7iCi3jVUxngLj5djNzk7YCK1ABDRUETIqw2PRbMjG0OU8SGiIeQSmMbcrfhl6N5bUrV14A4LGFE/uUrxjCbgUODqVqDTiFUssR160QGzgm+GCRJ6Oyt3MIqn6Eop1Zn1EHEwSCD6fRVYbAU0iZON9TcbMH+2HRCGvSIdm3TO5tXqXFfUdjsGz5g3MbQdLUgBAGnRtNKRyqfuE2oGc3ZyzoVgrVUEan99j7RMT1QfdApxo6KBxCZ//KrA50aBWpUd2Eeaj/oJc9n466ncaW6DWxfwNKsWD+9469nWidNVYA/UzrguQaBLEqas3Hal3wfTPHmsZ3Z5Ydx/pjNZ4hCf3JAYJ64Tly6Q8cknPSHF0+HGVnHym900JxbzC16XyWpRh57TXFwq/4PCGMUQXn1O6atLmWEAoeGSKzTehuCcZCN0KLTgoc1F2oRj2gKFUas5ko4ipM7Xm6muTYGKE7krI3028ttEMh73b3uVwjRvCUYxvVslrBIQdMoalgrBBPaXkFNHCkJHilS41dBWCanclmemRaXWSyNF3J5q9IaI37ajCkSXn3z3LeHpaNdSu5nqY6awVrselX0Oyg1k01clrcX/8hfk0xIfz46dDBaQBkqJklTLBCJj4Dhs/JK9X48NIEEEGGA1Yc1u7rPM82ifRUVUJ78Ed4R65ikPi90F+w3e1sEsTdASHyn4LXSBx17xMJH1ZHjq1+/Y+Hb6SUVmfreLsY026WEDPFxeH/zSZNJjRDTxvy1tLBij+l6d0UPjinaKX1L8boHOYL8iU5WX6wUdJGMk0jaBeEO5NCivIWgPnWD9smoQod9W9hn6bHQGjjtH+5WHKquiNeioHknyIXNmbdloTP91apNMyDo79EYZBQAnJEfbm/UpSCtMG7M0dSa+wQdw1WQfgI31zD8lfFCJEoTzMzpH1Haz+ghQLrSvsm8VmpQuLu+f+dVag3rAbtZpVTUYhmEYE9k5JiKDljHTe0g4VGtUFri578m+WoGE1k1tNm9d4SFsixZseIlivpLv0HkHwF3UALcTjlnOuVloF370QjMmWahVnIWqklBqzYUbeXt0/b3ypIKy5wR2yY7gzJ0Vqg88EO9RgUimw5VcXzYcUVwo0TMesHWJfm8iv3IJEWAl3+9jXaHwftVVi5wx7l8ocnBADvMke1SIh3/HgFHoiC0rc6LpmS+Qh15gJhsSU/HA8Jd+OA0eYrp944RYwbccPDqGFQNWtcZe8qvV6IMmX4A7BT3mhVO6qUoasTYGxeugiltqdF92d+IpLRY0u+shWRbOB81+Xd0V2iPOpS/uR0Gywq7nSJauyMX/ybeLon3GAS12HxaR4hbiUohyOA4xVBkBn0z1+k0UPoba5KCpVfaYKjUqZ+61hXEJsNilimSuW/pkV8ZP9F6wHJgcYMKPdg/3CHjRrFE9I2pgyzZXTgbupKfCPDKn7TvboJDXxPTjdYr7O3KHqzG6dIFXTCqajy4VkRBCL8DqADrxMhU1ULIrnzpUWSC8E16NtUQSP+2yV8huikllesAZtxCGZnAF44DZAm5sh9snL1DKXjn5QOrfUCo4Aw6AWw5jrszQcPkZQLTIrV89rHWpwAyBe5QXq1IzFDaaCMvPdJzelnATU5X32LFJLXwzN6Kr3APOGGNys5LQoq4b8gBe7JzGAjCL4/+njJ4B/FfnywpEPt4HS1gm8qEa3MKjedOPpHYbsvI7Hej9zkLXrs92goSLrNqfi7Xpl9ZdUMWPESRWdoxBnWUyoD0JxD65VyXxMsMLQOhXxjbBhtI/tUcEihVj95YCx5mh5bt1ut7Cvq5NEAKRRIQxJCzQ62ysrv4zqzIAhPzhoiT0mbRrqJNhtAp1k/4TXrpjEslWeM8TkvbYo0NDVnM7iLetxRS3wsr92F0GqOWB+AjmUf2FutuzdxgZyaiNcKw54P/Ch9A4iJJCgpWZTaPNDwfFntqlipoVyhX0L3Zk13j5PMlN6bSZ/0Nw5sCZcQPcEnzPgcM5DVdSzZr8mSemcTuDVK0/otPCN+Gb0e7lWwXtPSaqsTWwWRNxYIWGnIwS4QnRKdhIIz1pqLYyg4/U3ilrD3srzEGsLLntHvjKRtlzGtL0ZhiELg/6d+mUVN34+8GT5soeeeFd5PzY0Pj8VrKmIAkIia1kPtbDduMdbJviq+OWv3Gn7R6vVTupyrou71XW/dWOnIDGd0MOSZHf9QN3g0iRMI4GxwfQtXBWQON/59/a7YapBUfie9OdgvJg/B2kUydmR8/UP9FQ3rzNo79enjQ7HpreMIr0Q2o6mDxrj40I9k79i5eKIZ+g7iSoBmCKu1yraAdPU+0AhmEYRgrnW+/0j5k2cgNgYaziZKE+ysRQVKR3NR8wGEdvTffFbqCUOvKbO6LY9pHjSwcj70ST7Fb+kgabsGX7SKVjKeQJQ4sXUaUcYJaxXdCVR77rPavlFDKUYg6mnCLNQgbO0Q0SwUPJk3DA+WSS9quX/125HrW6neOlwxjlqmmA/deaiOosSQ9n69kdRqm+zG8d/XlrUq07SpzEFq9Hu5TkdoogjN/LaADs/6cWA60kwfI3DC2ToEETMmCXG5axpW52yvDqEWo2g1MzH64q7E5vLwZ8zo7lOisZ2O0ZUIItSKVgjSz6vgiScQWa+ltmKajpa34ax9G8HnQcGmiVjYcTUT0Tm2j6c2VKo7TRJRm3H00Cnui13RLkmiSExDAkaOaaeC9i2UrTS5sh26RCX4nn55SbRsZXvgP1CjmVkrI6/kH1F+ne4ptlVhKNRe9TOm1vV+VBCHyBQMov6a+zcIDmy8EWh4mQ9wKeVbMUnn2yw7zYmi5nKxUxqLshGSF8BiwmC8mcabEU+wNcMux8LXQbV3deFmwMlGhNed9tKssPFNeBLm8udyriCXa4gquPC+qfosRu3xiexp7zsCrFBP8aG7nxF7N9EWmQJ1bsbp51E0aHfeTbWODBUMDGyeqRAuv0vc1v880xR1GE2SuAm3NqwhPZSozSna6bjtqemDfIc5zP+JTHMGeBQKhDqfrBnBPIpBmllt5nwteVZiGswvQq0uteIJScGM6Hpl/eiN94LgFmfMJ++enZtoHPtd/g1RKZu5AkkAluLRhibyDhHTQRpdciISW0Ssf2iUXT8WP1r3YxfcOVx2BYsNTGdBA3WSQiGh1wbQDicaVL6hZ63AnSDIKb+qzh/hQ7HLgQdKS9vpk5E5jg6hwlRuooJf8dopfrTqGj5GdboEw6VsW3aUem26mTx5FAcyKgPTRUjo0yf1ZK8Jut1ZWkiiwhrCjsvxycYeuAnVslwR0wBc3GRg6n92wcJl4bcCPtYr3Vglo6KnNjF08SkhjwvUaNuBVF9sLNcrJUqiBMdfALQpCxVBRxHRwgeTVZZBemgASj6brX957+XhNFDlEsih3kLPjae5Ry2zwQFXPgKdWiwMYufZ3wkMsp9OoqYRbLXi4izPctvc/WDZo0IYgn+zGaJrHIcpUb7LWRWLzpqBrVicdDyhOkZnqFxCeD7SD09wBWE8UwJwaj2Mv5fLfUcv4j8tiFnE7KyNnepZIHufX/Jp4Wjy7X77U+fq72WJO5y5+lupEYcJsKPB1ClTmQhU+vwP2s9U2n9lBfpMcOdKIOL5/90eZYlplCfO/eChrM5cWuwz0V+1R5PRwvgLIRBJimISpdmZieX94tXvaCJB8nyklEtGEYhmFR9ucissFbXR3UIF/kvHDSQtqhHhj71Y+qVI16/rwUY56LS/MbuBqqkdbTjpkQnzuBI/5onGxOFudAORXK82WHbGca6rbwIuiEe5Ar6dyDOkJL3LohWA/dhrbE9zWPSUyHjOgZMNLxalnHr3oCJnzt5EkPpF5sO7JMjkFhC8GaT3hXQSTDRJCHZSrfon943BR11nRlqEFEMAu0MzrgM+sJZ9eS3LzIr8yO2x4Z42wPDIrrWI4LuEHtjRboyMtTQ3tdtGGIzyzdRgedxE3a0/bgcLcFhQKIMZ2wOwtsjdGweaTEjukl3py+w7lXlaPvWimTTHjcJxLKjUwn3YcRVJAcpjxfdu09Rf9v2GW2IpfEzsmQ0wXqG/BGQu8DA23kL1Nsxh6gsZmW/hKsiW3BrEFIToJoPRWHXK2nBH7YDDldmn2PJNLE1OcTalIYf3qksYJyJgvJpumhpw7sVyzHw5wlYa/XQLmAy9qpK2mp5IRK9I0zPZgMCP1/gHaNNEC+JGyIM5SthXyY0vRIw1I1lAhZu+xCmPDdV0J9+PZJB5nXrHcvpP7OFGslZOIwSHAEPTZ+5kXHrVmNmIbM2hgdNhYo9VHZbcd0geVVnuOkEOlg1WPvNrfw9HTUf5KHGSYrwMFWpJiSw+QS5ajjTXfT44difXfMJq/omL+Za/pOMu94Rd3Ag0z481KMUpe96dpD959KaK5u1jwmMbYLcbH75Dm8UXLIloHPrMeJbNwWnCFtDjdUEIc0RsPm2qmqo2bsAfJkTrM9uZG/TBqk5ybRZCzLRgrn7x0Pcxav7Mln8HTycpl9DWAcZF6zlIa1355wFAGs+wJxkawAB+Ge/owjeLOXpZT8uu+T53BtFFQ9KD9nKsuoECnA08lLT1cQj25Mjd5urj0NszE1ehCEauLrxAL5Tarr0Bev/qKlLMfxD5H+Xn+n5l3GnNaaYOo783iMEo9IDip4pVGiKwxEtQPFq7+AY4d0jbugaFWLA1mE56zBlYyd/xcOJCX0iCYuOT2HZ+ePBFSmMtr6mVHP4dkKzslW4sEQG1XkFAtERiz8Mae15tKwqnXJw7suXk9yS9W9fr1HOMfM2vzv87lz9JMkiNYDqvQ7Z+rLA2xqZDGvJseiv85wdTzvQ65bSS/lEmuU6MpBHlmftEnIrxVYDv7sNCVBQNKuLBJ3kDai3KDFhdm7yixM6MItVjEDy7H+ZytndZKdhM1RLxpl38evkr4uKFo1pEwzVOBrDklQhL+fLf+ugCbI+Qjl46BBQ49BIkdoqv2169C0gLR8g/OghcgIiE/EvyykAfar8Bt6JKrAA0kJ/XBbb2/LjD04baL2UXf0u695XiHaqIlr6YM4EoMYhmEYyT1ex1eQZFF2PbT5VPpFVoZRWgijaKskH5Kil+rTrundZz9V4AKX7rIhpLiOM6CMM8MBPyV4PSHkif1t71C8ILRT5WUxWub9pKLZoSMuGA7Qs0oCWe1g+In4Vs04CW/T6eFWSWdO4LxW87gyfC7LuKaPnP0DxwfrP1yseY0EVdOM+Y37lVQlRSfWEpFfwpImwrYdnLKr5vOzN1fHOESubXClGTjvjHqWcubpzB/ejMAabdxv7ilUnVUKS0Jrt8//d4Tk44KfUJahDAme69t/mlDeZ89UWRXhgakak63q2z6sVkEINZuryv8+8m9/Cp3B7GqVe5BFCYUTtFsoSh5tthq7evA5/0NkBHaKd3XCrpFMfj+ZtbOXhqQwpFCwxQhMJb8hn9miFaP8Ps2t2HgYLohjI2gvYNL0EhD9b9/IOPT6RXrCToFAeJUifq0rGG+dl/pWofpb4NRh4Lj8YtLjWDpxvIWZUI+rKACE+U0sYWxs0TNSlW8fpId6Jz1HMLrm2kozfKx1zgstiG8HJpWu5e20GVD+lXpabf/pRIMGLAMgm+av+dV4PUnUY/pVj/N2SDRC4j4Bt5u7NC4X/adxuk8GTy9Kzj0hllU2Mzj921Y9T0H+KoqrQmIB8pdn/LYB8Ea5m46dIf6Nj2DoBlsQYN1clrzeW3SxTStHy7/4STi6SRs0Lo+Jz+WuD2trEoZt93YPfkJTm4KhpyEMCl48B1hZ5dHZXOZZRC7ZRi0QGKosvUqk1eHgN3/yVnFfJ1myTNzICDJRQm2z3JxT0YNtuXmQeqRm6UMKu2EKNJ8ShtWa5hf9jsC7QdXggJZL2gii1wKhEAC5FfcRJM3DvakoIi+KPusKo8T31ttv7Vj3qkL9QugOQITyHBAlrcMntM/bmgrkRfSXUDJNCgk6Ztd/3L3WZ3OeVhVnLQUa9fLFfe9pdAVx+LYN6wAXML6YLbqoKVczMNdqzif2lm9BnX2Ggw9ksRYqbUg+9hfRAmofLHfdjObhash4czLLY6514Cwt6JInHpyNs/gbGPPMHU88b89M5bnKReaVVj/ZzjH6OEgyS3pkww3Al2ssfglnH2+5evRWBg5x4GCN5LjYxu9FGW96WiR+fqvKrY0i1AoDhr0p/xczGFG7qcDxgG5VLKDiwF6BcL5jPQ27n/0DPUE04feiC1bqC+hcduNTSMQBCnjltNDOXOjcfA79haMIoc8X5RnkzWmGUFpcGwn2cStxXAEoT4uGwT2nO1k2FdT12+J3SEHax0ar5Jwn8jOC25JoPqsdkMu05qfAIVeBwmSGK5p1sW45fEjICITR6nzHjIzFetwhcjRUEywVS84wLiPexdVqSlnAn7d81YY/hmEYhpG5rC/41nQvZsiAyCnUzXykj9J3VoGpowltcQksAZYwnhbI/kHitkyMsAJbzt3xlOmTATa0uYM0Dn5l232mBWVK3BhlmVBRucUb2Rty/bkO6YLb6e12lFLSLI9hoY+/j7XRyabcw8smQTaNwQ2oqHUCsGd6ce+sqi0JXIAwP8gbK6EO+L/VYcEIDuxwG/Ivmyekljmoh18921Gd1E8rEW7QWYZvs9x5s3eSzRHekAQEQ43D49f9DFh+wZFLVbrHgYvWnihm8pcBtYPzzzM7P3i6hStJxcpSpRMG6g22SncWjdwr+ZupREgWu1lfPRYKmvv+8jAuuugy/a+6PeayvmDfyKrR4sXTfdYLAx/R4QuKchRtDXViKlZhOD3FepmLSqb1c6Bp3mmi2qA7JZ6YUnMxpyX8qvGab76l74aPmyOePMaFFqEw4MQvYOXXjIykXFpRUjwXI1S4rDYwM9Lu+mn73A3AxLv2dOLXJxTH9ayDVPJoDEk6hlxnTJpMz6x1RRjCxS314KUtbxXhKgCrBHwtmZl1X9zQYUASNAulV90S98mfHQoZ/06FpvNZp4A+V2DsSDY5r0o2B7sMOfTfTGRD41HnEI0oe8xQuBl9wOCMoN+2C2Yp0VLdeybD6FJwQjyagKbT9EKkSPPkI0T3wXcLrT74eKLFaAROHUFb070YzC7fE9DeHyD7gohTvP/+2KoBJLrHSyo+XF5MtqImr+8vnGNsUtOq8IIbWpIXHdAHokIUCLh2c9m3LPxo0LUwyv5d6KiBEfkqEA6krV4ygftJRF5yICUF526LfY5/xhoV6tD4GuQE28tfdyxcmhnZ0Y51jbDRPo0JegDBvxyxOOKTqy9j5P5U/jwA7J+roo4olLTqjkZhpdQLE7pHGDkMxMzW9AIDku4Q2EO+pmS7lfHdxcB+CEif7FQGaUTF+MacV/0ClcozbSZlSWDVZyyj37BC275ZCNO6h5WXsTjNnei1norqzxjJ9xh0oZYNlymhP0lPhwIZ6N0tZh/OIQMiR2VPUK48DVKuARgWKc0me/3iVPT20dM3avWbxojq26ixeSbOH38wAc9KYJ7aSQ9vVR1R1rVyIz+16bbdOkFU0+cMD6bkvkHbeAHtDpm0RkWPDtJRBBsEL9GUt7PgBl+HTlETfgcYeeenpvwzKPH8X/TEIEv79i0Sa8nDokFW7OSajeOIkVgn1iD2VSLx/TqxWqNWYbjOnHi8XUMlNavfxu0mAzjuVQ7DcotQG5IagJuFxV95ijApMNu6e63Ks3B/SHckqaoQR6uAE9PNLtdN5Pl+nhTIIxjsZOf0NIxI+FOXqw2VmGx9usnwIX3e2yS0U4cKTLHAaCSze20g0mEYhuGwWyrHrZmV7tXgHSDsZC1jkyYfowv3mP5K+O/wN3cWEoUUH1vvu2IH+JFkJtijm+y/7OxLzKRRA257QUwdKaxqQgse4F6c+XW53W5fFL2ZT6rllYDhomn5v8BvdY3OGmVOwW1Cm/BQACsSSMWyH2jmZbZsZ+clRXuUaqjVhdduu+2sTzw0C6ngYykYiKMdS5piUqSMNpwfrEfHESvHdqld1N+b0wBsH15R42tA4nKcdlSTEjAZsmxMQJTAzGZ2QBOVEQeFqFMe7dKqEKJBLwKRFwyUgQ6ZFYVP0GASMwUdf4H687vqse1F9VvBRd9p9x04x2MpwfbsYWsVwq5yUWxohWjAiBfKQc/Upa59Uc7tbPu1jQGA+qlb9jCbViSawtQnma1QWpuwKHhC9P/d56rELCYYTL51/SH5Emr374HsZbbezChb1ihWJO8aX3DvyY4pCAQcckqdeswz8z2syyvNswkZTfMekkoKXun6prweqR9nGKV2aO7cAcFqmj8m+rH4aWWnwaPAjpv8yEIgV2ID3m5kw8XNzQQmqgAIcNVrUkiuSxmD6S1nkisfZpYfT79VnwMrBJwYQzJFHA53m+AKCLNloBCQjC3xrqE/XITQD/7bQMOt0KYZ+uoSNSP0TjYiE6AiVlEZQH8AFYdawqWGKQwxJ7kbmKD+WOc1MpwQC45HKMTlQCYeEHhSOFJIJfqzFkrUj9dXHOWsflEWMiWDQZTxI9GHcKSIiBeIFaPU5qX+/ErM9hCU09+mPIcZLHNEUMlZERpWnQBhf1g+Zc7/bsXccW32e26akR7KyvZVj2KVvSM90JGZbBCnta6iuH1trR/xOAWiEQh6qlbN7B1EuiyBxCo7KMFrdM/3p5msYN5gwi8XRshTSH/aW+lro1qeBM5s5czxJF23uXHkO8vo+5FZREOgvE9Cjhl9OVataYstrQbQCktcnqrbUlUcpIC2XScWix1cd+HGsrOTd0rhRF5YQdbt/Sa1gprykPBf5aKScajp3Z9W1xWrX05NssktKhl7VHCmPvIxp+pxHR1dJzUqUzSmo9z36czAA5wlwjnFJXlSisG7JXhX9v/yICcE9c/zcdVS08MucGSmUJ/S+eorUHnLwlUgzE3RzU+uv5U0Lzt4G0jFC7NYxbKbIU7z2E58rxpTsBZDe22PpklamMdb18j0f1sBk5hteKZZSyJ5dYSpcpn+19gveBxKeALbJRc06nUqXLiWKhH8D5njDS2sY5+5JXzY+kjwWZuBhnPCqQqQhU/0vn3dfEkncSsAZJY5XQIrXfX9KxhUVpGfI++nMTNMLz7yw8Mqh1YAzz6vyENXBMz5IKrc9fiezaUh3sCJdB/b0cRE9hYYhl8m60tHdUqm5EsbtVMahIt1tRxGp0sZdVqm7EsodV/Gl4tCxX+as+FmRnvGjZNcJTXaoZMcxaW6kZM+NX9G9VBwgiPROMIN88wnnMmUf/BIDh/wlNoYMIGU+cUoS+UK31HCNX6gNCb4CevMCEBVHCGxQQpCy8YkEnp8lppgLFRWhBkNsqGINCYNRcMuywNFZqXyRDyyRg7EUx5MMjbQZnnFKo8qb9iODfQXO7AxGrET9pn+k0Cn8kWSOEA/qFoORlOqnrdMN1TGXuWCiq/n1c1Y9Yyz7ynhWv0fyoG/5gfKGTfZjxTKWf2cVcs5uwnrlln2N6x7RubvWRp95leyhr9fvOU54Eb9N/OBifoNi4HvzJc0r+/gW2qjV/dOPiL84EWemhoj0wWDGglj0oWRGgZj8oWuGhZj7IWFGh6jwAWB6jujzgWF6jCjzYWVGlJj1IWBGg1j2oWNGjJjzoWzGjVjyoWjGg5jxIWeGhpj9oWb6jYjz0WKmjhjz0WOmjDj4dg1oxr8w1g9Qxn86fACQyT8xFgrQzq83OkSQwa85qmtsgtM6qmD0jG94tkoIzTdwTCpsheM1Kmgoit0GNx9BgBAIbXkliaMpZjo1hpLITWmNGEUsshG5W3yYDWH0qWRjkCMlpt9L2UE50eoPKy13vbV14cL7tvHEXk0dH8lf89RE7tc31zyfWvxnQC9X8pAdgcNJxnx7TPPmhJSjxr+uhrT/NxTG6xuE8Cux3uJZLJU3Ne+XShMX3pgNfkL/OdC4WLbAO0/wGaRwXw7AB//Af+xUJF8iHA3raLRC1qItqXkthLrin/VspW50/5Hj35YuPzoK2fj48Nj6fGx9DqBf1up163wr2V7m93WAWjYxG04p6YQbYpNsys27X1xul3/3B3pb//04SFs+sfHx/CUnx4e5/EX/yearjvhn2szOdxm6cVbrCylY6NIidTBtRIE/ZG/Cd+iXNRpYf/GVzmn2MK5xQLnOG0wecYDD09k4Jxj4e9EgiW/kSuYj8DRiv7sevuu/uUns6Yj04Ws2fdPTHwjQzTf/ZKChz++b4WRBHf5CyLO4AiZ7fobslV0PhXjzdXJzGiJObeapXjRK8cT82Qr4nNfWutY6DYM42UWyT9/Se7JyjJ++VaNRxvbpHTncm9ereLeh2K8mTq5Ml2muZWFFJ8uyvES8+TZC5+7sLcO2aAbwnjOIjkZk9xGbRlnV9V4vLFP5h5c7q+NVTw6KcYr1cm1/yxNrlBJ8duXcrzYPNl54nM/7Kxj6X3DZLzcIvnwj+QO1pZx60c1/vdipEgSp+4Oeo4mKUXCqdyhPVHMMr4V6ty3VjXeZBmj1m0ck5qXxsu43LuzMnn31yr2rHlub6UY75mPG9/q5Mab9Xi0dLnKYUOXVO5S/JFa5P54VY73h8SDD/PkwdJyvBmf++mmSn6aWsea2TjLrS02zMb75eK/i0Xy39ZqvITkjj4VydGLZVyaq3OX9qrxRl8AMbHtwX1WlEuomk8Mb8jR25CkVapCVOs06cWKiOw+SBrwq1ZK11cLM+m0nD7lLUj00JxCqIZPjNuQY/BEktZKFcFmnSa9QhETh8WSpFZG5+FFn/3vHz+WB5pvQRx3zOPZMd39u55njCeCK7nPB//2+vcl5z70FvLehikvdXvzyerNc9mg/snZJ3++/3OCtn4A4yuGCn8hbELGifW5y00umPcaV+gM3d8N4OMvrVv8Rw2ubDH+0fSzfJQ/K5lZPQq/E9+qD/5t+GD/zUg5+aXUz5kuo7acG+XPs98ccTMXPufa5aKk7fSrfg13pJz+yuR77T4o/UJQgRgJorl3xbXVfocHqT9m7MOI/KrY/eQMozsCQ0UObeQAIQwgihb+NtS9fwf/78kJgQJaxHDQw5kcJnijQhKFsYVmROOCSaxMPEWiNfnGJQZznlWCHAAAKALhIRQqQiBbEvVMUsZY4Be5IWQHusPSBnfqFx+fOBOb1oRYQkl5tU+YgKqccAFThDYIGgULgrZ/EkRKkX9dovT3bFpMhsexGA65Fy0Nsl5nxsIj0mMzG2jEGi1kJArDy0ftcpMCv1Wkk5GGms8RGbihphQh9cO1nvEvvCKAKtv9i5Kmfi98wvaSCqTp+hnevdfLrnuLE0GCaUz4TC/TN6lIvxrjLuMVKFMBIi1VWpfUBcV/7kYTyKEc8NY//HHIQ8txTlPqImdAKobiBRZbi/IFJBhuOo/445MEXe2Q/8+KNsDWE02LTLhR27r8izZqnPbP+AXOZ0gRoIfRm4cWKJSR6WeWoAmv0lMgz6eeU9QkmsTX90eKp9pw9/sfIbdBRgZpfzOF7wSxhaSge/txGeIQYsPlFnpyHka+Qhr5vDNB+n/HwOyUyyh3ABlyZ/5oat/FxNspitfAIKUENS90hNiRW16H4JnMn5naz4wdAydJY9onN0zinb9FFtN4OkSAxXrba8M3pBQmlkcw7nSh1CdUbJ8/M0px43fWeb3YqchFOHUu00/Of/vQb5J11hy/z3vLAkNRM3epEnPvPqgN4sGBicVlpAQ9ow0Q4AJqhTxjtpWoB4hk2NWUqtUVqTL0KdqEs5wDxoB6A9mDHlEXSOhwmGARSKHQG1NTPy2mfI0YE9R7SJfl2i1RzxCnsA+oCRJXGAHtF6tYxuhQC+Qxs/Nyh/oK8QZHa4pLYUhp0Ee0TwhXuCTULeSYpc2j7joi0UlfXkWq4hWpIvoX2hlnsRHjBVUdeVJ0h+qZhMLRCxYxpBigP6H9xt00GTB+oT505KDm3k3Up0zcAPsElYzEP2As0G5ZxRqMe9Qpi8B87f6ol0x8C0cyhcUbUrbQ39DeITzBpUSdM/Js0jZHPWZEptg7oVVrSDVFv0D7yY2cR4xP1NuM7A19hfqWSfgJx8xrFpAioG9MTXVzyXmGcUa9U6SLZtsC9aSIC9hfUFYkzhiCNm1KrMV4RL1W5DGar92G+qLE93BsTWEJK1L20P+ijZnwO1zmqBtFjtFsC6h7RaQx6845VQtDqgb9B9pXdopNMH6jmiJPA3qBGkrCHY5/gsVBign6Ae0tu6cfA8Yt6qMih0H27oX6rMRNsP9CvVIkfoexRLtwJZYw7lDzlcelxHztvqjNiE9wlKawOEPKBP0V7W8mvIOLR62GPLdmW4V6MERG2O9NWqkh1Qj9Bu1Hc8k5Ybyj3hiyb9Fr1MVI+AeOKxOLKFJ00B/MCrfynTB+ot4b0k3Na7dGPRviOtg/UZMhcYNRod00JdZjHFGLIY9TJ15eUV+N+BmOZxGX0pByhv4f7X8m/IbLGnVryHHqiQ3UHSI4Mb5FXCpDKtANzdQqNmBkVCFPAR1UhwQ4ToJFMlJk6C1ar27le8SYoj4gh2Beuw3qE8Rl2M+oQGKHEdFmxSqmGA3qhHu3esd87X6oF4hXOOamsHhFSoXeo/1TwgqXgDpDnntpi6hHiBjsjyatmitSGfQZ2lVxI+cOY0S9hex79IT6BglXOK5NLFyRIqJvTU39YaZ8JYwv1LuMdI157WrUU0ZcxP4bpSOxMBzadbGKdRhPqNcZeWycePGoL5n4AY6dKS7hipQD9H9oH0r4Ay4L1E1Gjo3ZVqDuMyItKx1TqpIhVQv9Cu1bncVmGG+olpGnCXqJGpmEJzg+BItTpJiiP6P9UXfT1YBxgfqYkcPE3Ls36nMmbor9FvUqI/EnjBXapTHLAmODunAOys5FD6BCeSEnJkRoJaqvO32ux/KXSplTfX1r1u5GJIf8oDVSTd6pJsVYDrRGalJ7k3wwkyxpjWxLD69eyvdYXpkunkn1x5j9WG5YdcyYn8yYeiwP94zpaq3LH6ZLxWrGzOpolsux/GdmWTOzX/qymgLlQTRIsKZCxoING9GGUhsRaQpVDqIFgcYjuUBjI9tARSNRYuGUJ9EQi3wvBApARSOF3QubVJTKXjS0QZsK6Qu03cl9oNJGWqEQaEWDL2jOkBXcsRWdUOaGvLSFqSDaP3yQJ++RyanI9hsY9uf9uOce3TuPfkhQFkjYBOUvaU4At97rLwI2MFuETdhgQwEBp2MNzCWPACN0CgA2YRPQtgzoeGL7SM/Miztti+WufZ36TShvTkiNGto9f+/YeaQX9A+ciVD9SK3p0ZYF5fJRuuxZkVWS1Yby/8mSG/r2nwPPzo5i3aNKf6RtBfvDiFB9AaT/+hWyDQ/s4aqhfD0lHDIOPF3Y5zIt28vRcGJ1OKX081v+4H/U12awdBe/l765Wn7nH04z95uwK+s7aRff0kYvbX0n08W3TKOXKeXvz4cs87u+Zf/mP5Fruct8I1V3WiVn06HtKqJj8dzn/1R6cBH9eCg387CyOKq1a+Z3ydxpzDf9h1/areqHacyEw7rs3+vTrVZvTKJr/kbNqdi0L/WJ8TqPmbE59Y/F7qqehPnxe2riJH3p8LZ7sSjzl3x22+G5bq0q+5f7cL3dEUp7sVA/zklLwvvh1T3ke8jJOLRBoN5m5xMqW93pkQzb+cs9Mmr3zKOmbereYPJ/Kc1hX9uxWTM0Tm5tO/QKMKTAacWnhrhpw7s4IfwoqXA2sW7UVMlkJ+8Odqi7eswfy7nMVcIiQYDMYzLTgbFlL5edMmc/rOY29BF7vZ8GvcxdDJomENsiyTC0uQ4zrbyV5KwTxL41aV1CdQaFCqI2/H+ktgD+tE8RLMep9/xZcjJNeSMt7mkx9xtLDpcSWOOU/F4TLAPFQ7vns6SnFDRfF5nyKeGNP531MFt6lg8ACuqJH8M0vrTt0aCzqG67J9bdzpTPTD2z2+NA5qJdo+SorVFW3eHoWaD+khPakD8e/f7Aj/6C+AhlIYIIRXP8ZmQMIAUrmMCkA52XQPHYAA4WES5/mdV3ejlBpw1vNOPWMu4GU+qSkzZHYx6YEIWBTdWWtZwFysnV++aE++GisuXy8VGgfIQ5UWvrH/ot4EUgChGBm0Q/elJJ9y+Xo5bPyLgEp5b28KCNdtg64uQ50xuEz4xOI1iSD9Nudlf+ac7mU3eFXP6+U8t/BzdJtUf3xsmY6AmaNO1YRQW9F3SYnDADuqzdBjZnvd+LT4zHb7gS6NnIrjufjHshui2Rpc1q2b9kQgqiJ/gmgSuPGVBXZv5UHuURH8I35krDnbIqaDkF8UaOBtotLUEgYgmi/rLQZHMlzQInSscnqEtPTJo+zuRZeCIBGOoVSOELSlb1F/80OfVjjXtxtOmpMO3ggHYu/jfFiE2aSvShyDW6AMUIOZ0wWQ62NXLatkqNUTECywBNsEwwLKqyFI26Qpr2U2eQGewjRdcmOfU65PGIWWlVR8EdjIFLNc8r/uZug+RxsSwp0Kyh1M7m/ZTtjdq78q5OO3YRL0mG/HwlLZMuE4G8kTZjc6xtedLUsLap/ak7cWHjWb/we/w/nWsO40a14WajsjyyRp7YnG3tDWlBg1sdFmlkyNPpXMael3tKFlnkpKmYmFui32ebLH0GOVP1s4XPCiZoOWGuZqCltUJpjc+aWl2CfJkopnKAJhFUtp29nUTxRDgfL7O4SHa/mlmaIi9WhBGNSRSDMUFaBR4mGMRS/Bdvc1SZMdNU8dzM7MbB0s9Kw8Tv9PGY1aqajJ2Vp0fZO2F/Y41nLYn6CxFom7V3OaM8Y6mvo7F/d+MFjbWZNYrA2VzwmayhlFBPc9HaBbgHzp7oITLtL/k23RxqBEPLN3bTyTxI9AMms7eQohbjpmgfERKObnp1rQOkxVixMvFIpUxyT4TOP5eSW5RlJtsy8bJUJZ34VJoV6Zy/9mBb+XKkFo+jqEBXLUbarxmHdMfkd9U89VrpJX8moAnFK6Y6Oe4vVWxXtyZRACGg9msgOO9lhBHqED7N8TDCPiydeWeAjslyQJJaDYg4Gmy5XYwZPX/2h7WzNvf+KI/Mfrwe7aIlgumzMdPi5wD98WiLzpBGc1iSD+6KBsYCan9+tPx83ApU8b3N8tXmb9e+s1DqG1Lf5U+o+zz6xFjl7aNTbeMSoLnGT7A7vommB0v+xT/AzYikC2B3iPTzQZzNtUHkq+T/vP0TAI9hAiT0efuEfibWrYdCQdjbvS4z7p3B3ze8DFUIEco8p4jSityCHb4nkTc6mdCpG1FGDPKDJ4UoNu2iJ3eNC8q/1+UtoCDxYDneWLIS+gdDY1PUvDNWDJochV0yq/fNOVyym7ZCKMEmKWNqL+VQAUHc8dsIYi73uddJ2/MNN2Q/RMixVlhEQV+Df/XY4UCKgotwywPTXfCGOwX8itRH7gLYS5MmuZt1Ir+TJa0J677qIHUr0sy9DANG6saCvaluujBpzqIYOH9MnQRJSWhy59EGatWgQXOaJ1sPIkY9jfJtWbqbtZGRL24yCXnQu/V4LgPQO/W2dnvcu96d2DJ7VR/CWV8Si0LwChBcO0+ZDLf7H2w5evrsXOUYZQL3eNvLNG0SiG7TGoHD6WW5u/UxfvIdmR5HGyqas488P2UqCCaNjUeMZQfyTJ4kM/JK4ZKYbkKonAHpKslpsH4EZvEcZHWTgvsCX0Bqe4RfR8W67QZ8kRq4pB8+qjYSSHUYl/9qAcT1fFlBIXVZj8OwWBZg5OGWSkJPTdOVDx2Bxq5WZKZZkBZAuC+0SByNxFERvMRy9xTsp/TGUB0/HvUJoklDd0oA36d1FD2HOfgBZXUcb+B0gqdLI3a5Xzj+KuTYNq0Y47SATTS+4zDEq/77GGBGBb7WeJXJm/ELgGerI12JR0tTSYQgmS8irslcktDrJ+fvzIrhRCE8erR0khqz7RD/37GYe1/AXxOxRKFGeVI+XbLGJz5t/jqlnw0ZKyGxg1RJG87aUE8MJhgLKh7p6OzZjm2XpnKzWax5FVzvr54x/dc5S1jG31j00wj0zfumU35SN/MkzpZRh4kLarvKTOXygDhuUxliQmwyq9uJ4bWiYSOsEVtF82WraAF6KU6joMWytJuDzLHyNkNGcAfeic7xPXPzBtslC6+TqT9cFs2IZd6IK/uF87Lp9q6irAIkWq4VGlu8dRUqBjRR1xniOoGH05L/8PGfb/e6+qn+pC+YDdbaCSiqnt/inJ9Zm02zemIuCxSUcKVYA+TqzbX64O9BEUpibXTrIro5arIZWbURxlyWm8oA6MmFUWvAoHvKN0UzYim05b5AEuNMIuNIo7n0ruoJ0XQJ+A3BcqDBAXiucbqo8DJdiRcEyRqTGE512Wm7sEg+SONW1fj7WSFK6vBXgF/wQOdyb2tOU5yN5uRXYEFOYOIZuNJw9+yRRsx5z32mFc1vrRW0ov8rww1vsV79jB/AAlX0Dxe1Wu///9ObGqXRi5cXDx8X+OLr39lwT8elhyMb8Fp3YUFuDFwg/qG6V/OuAGDtTSuQjGrCujUrfjBudhvvYrBh3FrZTSqjnHRA8b3ppQO7ck2Wi3PX8VrAfHRMeFGo6U8a6Bx5JxV0ufNuDvVaoLu24H21Rw3xdF9Y7jcbeTAg+RkqGX7GdaOFkioTErz5V8AsIBL3CJAmap/ibqB+w0r0y5q9YHtVIrYZlCizUQCgeiSnAu8C5e8Q7QqmccaxSnh/uN1S8JOBh9QyOZXUg2lmuxSr62EhemJf4rklULGcgen4XuQ5KSzN38r9oWiFg0pc8FPIt/Cw8FFjOSWwLZMttG6lNYshKqyq4bNeVqWUp7qp+k3nAr15FqPlXi/beAmvrTalYoFzMM+xMCWyQBuAuVt7qarPq1MxgqnQhE3MdyIWNAZx+VcV4iHkJoGGNZGNMTtVKJCDx4nVFGZtuJHtI6NPAcwJjdE6AY1FUwIt4L64hhvqAdM00SvsueojYqtW0xBALtfevdE5r8Ro6yuaACXIc+gCqlwX0Wy5RYCY2gVJ1+X2IpqHSn/FzpJ187F6cyH+3evpFoLzuY/WTiY8Pdc7sJkLWlwXlvjrq3sk5UGShOmro9oEVy3tN/ySUrGq1dZLayd7EsXeOxB8W8SHGCPpi7vcyYBQ2T5sb0NHBumGzkymjs6eEG+2wpnx+gp4a2j8ut79ICHnKSTtpPHXaX3v+qagwJu2m59ttnG7Rcc05CGJfCMawc7AT8641GmuetOXrYFlkNsIYpb2GBfUxFOo6Vpv2OoAZ99qAozdWFVKx+3OBXd6YOUmPxDoaNtYV1t8iD8J9XVwwgkg57OgaFYbL9FCFXv7VgbGpQVZUJUj7ppdoRU+NortHbYpXit+u1psvdcUz12FIQvpWdLAglyVSCQLJ60A7qjOO3IgAQvSUGeS3sBC424nL42XwLCBTHNiMP/uduyAhCOzsrWbVhffBcUaQK9sRS3zKL6kmWylrJ6SguotLnqyD1GQRQQPQTD8BS2/FkOh0jp931mk3PKlM2uY2botZEgQgdLQ/VFipSx5KyZ1JF3v231xqhbI0I7JHs9BJ8RrSMVYJ7kkQyDi+lIB+2dkmQFu50Ee1PvsEyJiZh1tAROBtcDyKAKdfP62ObA71vpw+aKbNDm5GHkp07vDf4CWkymT6gYIdU41dGeio+uxLqwUpMfpM2o3k5dpSl0TfYxmnGUvucPW/6eDuFyckvfiAUzaehCyHl17pTuYsapmxT9KOYh3Q2QbI1KYlODUGsp5cqYxODrwsdVJnDs/YXn6uJcwB3hKF9ypTl67FdrrQa0GfmN3d1o62KJ44JUNJqZxRwwcOETFyKrydcSr9XYB0o9n4nx7fFyMTvEJULAIYBAxITEfTNbmbsV/hT6gZ0RiK6wiQ1kefuTZLogoT3gkahlEIsf0MKtL0AvtjSePfQ+hC9RCDBTlGvtE2tsbQMKfshADrxjcXDoYAKx4nkyVHwJF7O7BMF0vQYqEoVmLGBqdJJ0IEMyDqTAmtV3uKvx1xh3TbzBD9lzOEI/R07hqeEyk47c3m46ocTv+1Sof2K6Uhzv/Btm1fj0oc7JWM+7oZOZn4gSKShilFx9RKGhrBzMxkTl5+L2A8PQT7ZCMJFpAWCe1APp6EXTxghFRT0Q/VmqCSpBttX+5GVuDFu6lw1XEiSSU2NuTV7vIiIvZHVZtfJR11qNqFS9X8cBy44Me6APS6mPKH/so5cZ4hypNSoHnqNIHb2z42Z2Io9NPtBaILCqvUq6sF1hVz6m96WJXwA9IjK49UgzUzeyp3c9xmA2RL9c+1M4OhoYdq0uazldBgQbBORsQuMvofIOHfnYCMJ3J+ocffUI7/x7wuTYQ5w0sA+2jl/EY+Pi/teyOIm/IwApZhBfQZwviydw+eaxj+K5xbhZBCH5tSstcMf/1tVzLq63AJE5OvNaX/Koa/wbKzgSgs8KJJRoyPgo/KgQ8XKUzAIzMon1LhW33T0mcy8y2t7mVR4fykpnIAyyoO9fPNie1GF3skIbwVvRDCoR+jg/RvfG9N+/age6rA1sZLnwQ2mI0obnUw9HS4MW0EXJf+5YTSVnx6JurT6PS28Vn7/TMOMX9a4VVUynRaUgO80u88X/XRMdPIcTLTf+NTqbDfcoQp/nY0PJXw09Fst6uebf5pPPbc+sPZFHhixBcYfgIJorIAtq3qsJ3Y5/MrQPrUBrK7bAQtcHOYBtFez71qOoU5606yH8iXnFxXis573ERMU5bNcMey/tiyNIEeazZi/NayXldt9KC10Zie+v1yIqnAGFx0v5bQnPUD80nSy0Zq9WCwVhxGJd8iv8Yab9PIMLbJVyi9KAF8vQOj4sxhtYSjBBpm16XBtE4fa85ZzSpjlDkG64ZrLU1lI+eTZnHBkpkHk5bFPrhfHAHrry4u0LG5sRp3K1IdSUP1+Eh/nwEDTY7lTbnsCGZ+zMXdk+NlaCSCAZxKcCqazQ9lUZry3ZgvqXgiFQo52kcYp8UNhXgVb/WPjgslmcgGC1T+NOjEk6e0vBgmAiCbXtS+N5/cTqIkQ8EoSWglKnZdKoNXvBJOlwB6ChgHHe8yGEvUK84tVLIHwFtDLzxtza82m87j6mg8p2E45UeY1bhV8cElXZQrG7ZfHIZ/Hc4+LRgcqOtZHoIFxmXgXBXcNhOue7OPrVKPuzL+s3YDYPXqJXfdbnuXWyDPwNZlfpqkU7AfAOyHIAEYnHyDd0HHEJYOyJm5L0npKtokNOCXDmDiviLKi9XOta6MVWjvkFnSrLQpPgkyrgu5ic9Hwo+5CxJsPt/HFnGUonXaHA5Gzkk/IPqvw2t7oxCjLNecz13KBE/mw6l22Qs/CxN2iNFXcKrjodeUfvWQMMw/d6uhUliTw4v6w93X5+CmlrMxFgzs8rapx5qDiMbvZc/37Q4ZAJWOqZg+HkkjDU7Csq+JPTu2O9mVOhE9kNGL2hhCHA92Ma1pm+JYhrbnOe3PAr22LR+DfbnNsZhn7ruHL3m+qt3S02axJcNnGI8slv4exS5Ip3UYBLdgFksAamFxGEFjCFtRvzg5bO7dW3ebpuMrDkVn9htQruhGyKeO9EmmCd8YCSCWG/jZlDm4S28Yd9RrOtBj3cgau0RMNzrcR0PGK7ojJEQFMO58uWxRxiXz+fnwjQ+zkemY7sMMu4Kwq92sZNA7142JxSpivBm28p+SETk4yUg2oK+L+uTpOK4Xhzs4DagxgZD+1Jzj2qmg8LRIAu2yNXg1k9Eoh2Vwvwc/HSd/LMCJXgtiQnaCHJ8IVDGMVpB3CFJiKADN2+fAxxpD5BIW+e+eY/XOpcAcOWvb/FsLX81GR4uHj9Nx0KuZn/IJl2desDB2yCHnK3PVttwcLeb5BvcskTty3VdPDrc/gsDiu8QwKRFCTtpeDDy2YerqGum08SqgiSMtHwxJPhgqZAFHD6J3GaijSUDaD0f17/9XkTzHgCeHWIK7+GAIAJ+7o4rbwMkUDIum4qYlPmTIPDEeItX5RcimAh0KNs+iTGs/CkUZPH8tjmPKZKqH60w6okaW1TYr74Hdx4UXjG37wUogKzep4LyHy4l98Hvr9OpH/kWKwcYeF/MEcMNY8/3QkKg5SNRb47+00F5ps9DJdMikwyfPw91m9sk7uSNntnY1jOOQr1w3jat8dOO5MUGq0owcxjKTbcQ/V/P2arlB469kH/BcowvAE41SiDhepft6fyJhCNp9Ya8DbZYDMxodOV7DDxW5ARuQ8JnYZ3vcTwiQU33Xxk1PmDhm236pBM3R18qsZRY19sVI0Lz505KwL7yhWzLl+tgEcCAIDRMBSM+3pfjMNy/QGq0SvX4dVkhgIM6+Ja9rBard0KfjdUczQTrOZ0AmL+16r1e30Els0y+gD3UY3doCyOZ5I/aEeUlEzHUGk3R/DGQng5odIGQfakmxOdRWBcatYpuIfwLUI/HVT22y8Nz+ODVyr3O2EGkX9uybl4xbWlPjmebERQPhsck885GiSHgFe2uDdakPvhnUFHI7RDGD1mtVJKp0fCrSq7TINVUbTB3+MA4g11Z+j/7bCh2SvVt4o1Je4aqC+jZqmYTZqpUBatA2Nmz29HLCC8k24G2ngPFtUmfZxsiIvo4u4zSIXRAn5S3FvCt3PZ5xcpoNENAbjKqHDEhC2Hw6X0iiCe3n9RJyq9no+jxC08u99Zuf/mHKK3qH/oHKpjQ9trEi6GbfwcYbNr2vZBHeaE9N0+0+ieOH92H11Pgs97PqO9Bz97pJds6pXtH/T2j08iyUZGODA342jZ+/p6U0w0nY5Ov8i7af3GNlkHOjDMxB2kt88fNmp4R5Op7ZFFPGbjJdTh0/6EvXsJ1Ge9TzTnyf2sMXug32aHpDdLU/+cKF2DVH8r+7ezGN20G2gKrOViEM3s3b10Qt26x2EAO2+J0xnOgxt4G32S6nnnfo3sdlNLn/F0cSLmYAFFkdcKwwHHytcwXVK1SoipLkDYyP585no7a5vQUBkDZ0izdPNU0HaG/LEvseiRrUKSxHb5A/Ynsqye02kZy+wUT6sEibqnsFD0uNXN6yfRpsAJxJDNDE8wmPcM0oQLJbW/YwGq0bEpoBlmw+7NJOetLPfmGi2DYdpNmWAy3lEyxsHXpV7SnqS3yztKZ1ApFuGQp2+HtZ6iJ0bu4UMUPhlktnXdiQ74lxo784gtT/SVZ5OWTF9utJ4thu6xTRzCQVSnm5aa0oRKfDGG+P7UtS4N+60iB1zqM1w3SbDW2Q1ntPqWNjPJqQdl711df2cbp1BPR61fVm6m67P/OEq24E2NHg8EnTdEM9INklFZGBUky3ZcyQtaZqetMTSc7J4zAFrbf1NVQ9VJGrRemDgNgYSavNs5tKuUkpPW+MeZJypWWItzMnEiBuWbMoUQZHC6MLDg1Bu1Co5CpbJdRULVTmX5amdHheUcPpSZFHNF+VQD53ERx/snGWz89StLaTab9QMUXnRH07ONsP0qfPY2h4Fnw8NlHp4HJXNUH022OS1yW29EudgfScWW6rtICKZX27swC+WjHgCXutYEGl17inSBvsyNjm+nkSQInd0rEOGjoIlXGmPLJJ2WQBoekeyMbvRM2utILS3zKgnK1FVdlVjTV8DHjLGNB9YuzALsrJOz6NruMApp03NhRSps60tuiJBrtODzLXW6rwAE7DvChnOm5ISvxMCvBkW8Ki6gzBW1HHz8EzCaljEIqW72NcPMpOby/fOQoxkWeMCfGJtIW4iOhM3czkiWi+uJct4djzqyjOE6wpqHZanTlvFNJndKzskOQ1GzXRb6GvhqLwxmozhoW0w4bLYcsl9vbED3CfeFgEOMa8KZYrK+GRcNQi82J796ODMUNgxHVihrEcYMZLMVzrx7wGn0jqoa3bN7wE8DZSppNCThhVRdfadh5je/AQpFZzFzioJqZ3A9Fhiw11cPm4YRhveHfi/Dr07QmaiMzQlrxkBw7x/xPA9hmhHViP2tP4z3JnMXZIGIeNyiDH02X9+UifDACFhw1oNwVcVLT3KbxkKr5zAmUnkKdBwKdSHyD0cEdTQchcpBPw7IsJwMJvdXMHrgK6B053/x+Vfc9EkZKQp4He9SZfiG8pJrqGmZZtCTsSG16s/VOU/TjhM5rWPc6oPP8ajiexXVA3aM+o+TenVqLvsE7h2BxDgaZdYYiLbvMnjyexYWBuZtAjvlFnEnDVYT5w8a5lyrDgAT/NwUvobDhSf8XZkfoolhNSpoB/6OmPOL0HgqjV/UP1fHokIMF6lBL5FIbEeXbw8Y5FsbvwbMsGptNJU/JVVmBrqCZB2WG3vqX4ZnJ3XhEM+xUwQVAo5Mwqf0K1Hm3XffiRvZyLpSQWg6gnfWBfJPVl4bpj+MHqkK7gTP67wwdanmcOtpkAUYlr6wfMkLUoul+3o+4J6jcrlFCeM+sj+zpYMOixB64kTUPokInmLyGO5pZ+Ntg19rwHOQ1ozK3VntMqjGB5AxHmHBWAu9/H6skI8Mpqxr6T0hveqtbDhl3oOZqNK95+usWPhm7LHhcvlT97YMdK2VvBIotA93HasjD37kdXOQNdxiOMagYW5tET5jwMO+C7jiZBGhl172LeBQjREyiDPwa1uUT5venK8PTFILtHFxZorLpcNfw7U+KXkWeSNsVoymgaEl5wIWUwJwWeaaF7q2fsDPFxUrQy3mGptasG0vtP8v/JevKge/rXWF9GcySYVVmWMZgwuV/oMlMNg5A6NMjCasgjC7HwGho5Mmpx6NA7GZD9Ry/0tpsRWQQmvXwioiLZjuMnqnAZx9vEJ9d3MC5P7q6hQtoO2jHi3cP3TWx/0biG6efmREpC3H301n3DcZhRQftIxRDKuDOvZa6jQILAHb0bISpQMVjP2dVxf0Mk7DiFasnqg+u1cBBysc08+nvpplHIzxsL7t5GKGcwAJllDx7wEf5YyTDSf66M785PG0obPaceT9z6Li3U95tnCMQ+MwdvsNAB08BWSu5ZSewyASxx28ZanX7/e/gIypyDr+P/na5lC5m0tWlFL1STo+CyIhAgyLZ2aKobdYuUdYUyhHybCluUCc5pjl4McO8AZ1np4tYd9eeqQH3OrP6+Lkx30n3QNQYFp+IktP2KnMUmKUE408c3+P1jr0fX340WpmRTJxlYDrmRMB8p2J9HJl6J5BIHZ4B4u9+ucuy7IR7EKCfASRMFs0rFl4vZwUZDOhZ5h83FHST0/KAwZisLHzW04hdtH13p0J0s+GuQMIqJ4DZqhwOnjupj5i70stQGQtfYk9PEIK1O+hzoIqaVt9P2BkJRtur8b4xvvEY527l6bFdw0TQVRy3PaUtQecTxvAITT4l1vs5OstLwLyPDjNuG/AmYsj1oQ1X7Os6P9Lx9IXaHxVfhVFTxUE15MekFz7/rra8WySuYTL+GDxq/8/8b7iIewHmaR0HjeZN1c0Rvns24CDxicJdUXGs5kB3aSMph7MiVhVOy6rSKK+vO+Ij9OuW67KTovnB0pd15ID3iVjYJJE2TaLzfa0+iXgZizJ3zHhkCdKRnEVnwI3PJP2vVeZ92SIcc+p9su6GnbD9r2conspQPJlzRa6A4iRUKRJFruBGAITI+b1SBYEdiQY4GFwrJX2ooU+RvDnVRLRazQsQgC+rgNVEjrJhUPtp0clhkmpP4MhaGPsrOrmOc+VCau5mtkefEvUEOTGH6lajhjNXGsIQyu1mz32tyIw6nxxwqG4AVYk5YAgD2S3DmJQOhsGteZx2vAI5AM6zVbIHFGTabpYBaFHrx7ZtKTOEQez1zTCpVuUQAPBlwFBgaUhrUBe4IUjrQPsAO5m2HmYY0bTY/R31N5yG8iEL4wfH3FuFb4UCgDMp5jPpOcJ9DooVoRYfBUiBFoW8w0vYzWuo6hvHVJJtgCoB6bWwdsMVWxjwJy6aulKxUomjsftuVEy4MMgy+alLrWCgNjAuHkhEgzJ68B8MssxONvH4eDlqrivi2Vzq4qPD9VUALS62c0TVVtQmNVIGKuvCdk1SeFajkJnQhBe2bX9yzuX98j45YWos9+KpNiX6RPEktoM1o+j82YAYUCF5ah0bNaiS8bX7vIzr8jHq6gaOImLiQJZEUcZ37TqIgwvoCdX1jL5uVDTRdGcrOZ4sPqUz2XDNYl4T1l8Llj3CoYSX1Xydgq7ajEHez7HvTYPKwt0G1czBQTatMC4eGNjrCqujJMX5BC76b4mb2xEI1QEojVxRkQj2DjWAgCbrNV9Cpz8Fw+Ak3JVQwTY0XhuWCJxUs5TmuFdQx3En87vAPw09uK5ypPVxDOa/RMXLXrvJZvnAbJgVxr+eK25EdTue4KxINMyrYOYkvC/Pfpo2REJXCnUJPchqwVdQ96jJBVWBahXKYbn2zpkC+bCHo3R1dvScqRcU7fjtHYRM2ih6O4953Hpn5U+VQ+PIfbSg5oAhW1aPBe5+mARMH/NxEMIW6+cJezqUQ6LfIkhjkC2wAcxXGMH1imSbZVDE0Dzeh33R4lLcm1iBFnlxq39vLUhc5r0O4iOLwmsbv2DPx5XLXLsq5VRdRBXy0YuPDIlz/2BCfOxxeL2McwxtCkjsY9rb8yOiScdaE8qkEtYcSo5sMamLY62V6Hh2EiM52tyD42wCrA3zSlcd7wPql/CKX3tBrIityyq8HTEQxhJ+rmUuN1vw2dBmc3PBbnFf1zPqpiH6HBr5ZiPqgIMBCUNujYk/eYFipSv55IK8ykETgbW8XJkzuwSYFgrVAXaLKHCzcX5utxubsuEqu1VYD51IMR7GQ2f5CT/oxhFQSVtTYjZZFrLptMiLXhsYDkMT7oIE1gCXs+3zHLScZC+ErwV+nqc1cha8aIPRzcqyeA5HC2gPdKRyUQBy+16YmiQ3ci5ebDhY3HIaMw2+r7j+zIEiPfwjU1+60C8i0NJGDnKzp7Cw8dpHr7KuflHoCpTz3UXEeVkDh6EJY9TnzGqGpP14jZgF+QPCUACSL84TYlVS4fPFnwfqb/M/jWA9A2JKre26z92dgg1k+MHwg6FdQKsQz9rsHPLlPv8H7E33yypxQz6nkenS5aoLiTHNXFVvriwEDrQ+JkLm4dUwsRfnxjALsgf0aglXvQFHHoLBAi5bP12JtcjDFduQZw/H2BE3jWXsVEFZ/Id63M2E30TD6nB2sRd/KGSf6RafZ8/JVQ8gJtW2RsRd+qfH69QuPICw8YidmzQRZXfp3Dtw++JexFJcrqyM7WrqDDm1bfYghoIVCeqWLoBVlt3OpIz18uxPh+3et3Z6QePKOoAcuTNv5uDFAlxbXyII4oY7MriFPalIw0212M+xNydDOcRK0h6yPYw4GglOlml7WAhrwZJ0iEKe3eAOy2Ey9ADv1VtZ7U8eIge54WpEgQRfpzuWiNv6Uvt+/9dy44Mo0ghogMkeejkatthvKQQKUFERMcPHOXaLTV2KeUIFupEax6uZjXpg9p1o0qY8OGRX6H5eZy5SzMYpAEXCUwUx1rOAMivGqapdMJbWyn/qk+nwPlZUSjAL6Om7TNKyxU6cAvBdflsQp+LQbWNGqVhHqwFo1QYLrGeZReULnOUj4R/ffme0WL7fjDQ1hOSLznsa/PTKdMz7dHcj+5oK+cbrfZ+zhRr38X6a5IhWXTnbyaVjjL+VsKE2Ewxy3uDczhU35w13DX62EdmcIC2VV9nyI3jvazUbxtrSiSIifIQDk9Hrcrx+yB2XrQMtZoawKAbcNbuhTgpuy4bdx2L2zIGx4j+z7aqf3r3cO3NwMvLLyrmOly4FaxYCkVltOJR/4kjTRlPaUH1Z2IPW9EW0LGE1G5BiBi3oV3zVdPKzVo6l1qiVxDYiRr3GxZ4UfKHv39qkfKHnh6xc0lJH63kQ0mC1RVmeJQofMXLAIS3Lu7ipfjYQddvh7L0b0NG5jWfTO3YAIIeF8US6FmmAfnyHA07DxsPI/xq9Yl7J4GCpzs0AFx9GkVejGMOe6PcAOzhwldehOvJgwXpaJUus8athwqpdiXBv718L1BeCcnP5ozsWv/ZqAb8i6afX8aYmPENo4okXA9j1GWc9t9b6ioZEsTsQzdaYefF5L7/tnD4KtuQUpNN1DtmSHTgtidVZHCxv+75eQPI+mB9lMc59ps8mVeJ6aQEX/qD6ySgZpSgjgNGs0P3rOMv180w2k6Y4uFw9B3Jq+V6f4EYEwY5ZdCOLoyek84OMchqcXm6jEeWlA3UjMANL5o9f6SC317tdc1SRWScUpkaUkwvIiJ6AgCdss069ldx2lBuO6nt9noXpCNpXWCsmOuZ55p23jgSat9qpc1/Oh22RruYzNjM+bLyg0gCXbQorrd5k3DPd/D80yTMtK9eXjWc0j2vvrGS+CpOMHQK/pDgb8wOgoUGSYLZUWNQ7XfZtpdiFsrd3vgorMKZdW1o4KBCojpKOgczPkIlgdIOuqBMdOsklmY3pAROYSkZkXmtJ3Blu69AHCRYiH7pPqovK4YXcb31FRuGSiaJJ9plVnOOKgCbaFmNqpMiTw8LWA/Qm66w1u7wCPfo3sFsj7uXkVJwoI8et1Pf8t+lkUG62cxHgo+xANQB/sBXMXDG1KvG9+ub7G7AEK2XK1+OEqGLhUS/JqfgsluAE/AjyZmeFhAnLYkFbkY/LiEYWjFvn5020FYlS4QJ2dqriMfuBc2I1uHcxvH7T/XHmVEQY1yHnveuv7l6MR7NjY+kjs8E4aIwRa6Uzi9B6DHfYLH60L9CmaRUrGLdBjLgGZ6OVQiED4M4a5wYq3x5DgeOgJKs0XThiCE+rD3AxM4nhlo7istIKAi77sQgjL+lZtr5FEUVVzsO+9MCZk63e0gkjHMIII9Yhii1Yy74FXtX4j72wDneyan2dxzzx6ag8kzq3rJ4RkWFTIgAbR1ZdSmROXoJC8Un0mgCiC8enIphopgWQl7subseAvvTR6pxpet9x7/T3ZG4MMlEeMvnmHx3NnQ75q94gTQfgBdYkKonE41FcGHZfjc2FmYTFrLrNuS4FDYJrO08WK7jK3oGDVl5Os3xJixUUVooHrT+qCxrRTHhcaSq49Xm9R1ntosfkzizqGtETHW+Y0RwATXN3gorEjbxrkmUuNZMAjNRKanUWj2UdCPLuJNzO3u9hVfTUHfRPmfkspZmLZocSFc5VxIdNfrQQXyIfrJgGS/EUROfrGCNq3Qb1KamCVkVA3KrBhYhz0BPEHsq0MgPZHG+VXmqWYTu4NRUSjLJiTWSrhtz4qE/2w6CzMAEmiW70OIx4wxER8XWkcZXzeM8xihu+Ou5kREniXkbcBH9KnqQaM8MuNKnjiWrrqX3bfdbcgwpoZuIqNdHFDMTVuukS9uhoZs8a1l0vURmPOqDHeys8d9mBo8nXE3isofVInRUec/vHXGTRhRPWZ7PersG4GMOw96bwDmFueRnqX+WIHKIl6qqjCo1g2fSoEqZbyblnpeny1c9GZ1/E4a8rrn5GjT5721iMD8nqhsJA0nAYcqlECPIcbetolFzH1j4E21lvJiO4HkFzXmYBOteHkdlqM+5qXNh/bzHnEluxLSzGuPboez2qHb9hMLOZkaWWmByJ5vhBgfe3qeSNiF/Ob0Qj5uK6a7Z0+m2UKpFEiIpQg5UyzcazVc9Ue6bS2TliPlqSuXhCHrH2e+9Ycd5+I/00bzPo5+N7MCj2duiYuXD5VC62tTYblOBxaxEfEB1XLyGMzg25km3UPFjfZsu28fSuNVTZHDLZuq7eB/szXj1prFs/vIYzncFtJ9BpMm32g6YzOXWUO6zxYBxZzXgb52hH7MlXewBAT1DmIHDWHRte7KcdBSQeEqk+1wCorUiCrk2VGslVvo6t4gGsYyFpIW6Jz4KiHVyCFclRI344uBFwZQJwktf99JtERbe7rrTRLdsebzLgcKkV/PRuZkT8Qm9N8fWgOJA30JfAQzSpAhjrraVBA36JYzMiY+2coqNete61YuDiWLNjENbmiR2SPBMiX1sFYvjwa6rgeFbFnyrAPPzTFvfQcUdZI3PDEjGaUmTQfYSRAaqdSJthOVzm39b+JCfxMwBuaNW/kyTALqnde8K1tQ0qyaubxArQh2D9HF7nxnoQEx680yP3KY387jQQ66CtQdw4hkqTK/r9OMkN0nUEnwoHlB5s4RkmjhaIYaJ1pxtCr6Hsgds8c1Le5JBa9py1veuLa46qmB80QshO48fIIC0C9G6xR7evaUdKDBs8liSKcpIWibSLNaJdkn61RPb2Dal0ZZM517hMGMnJcUPGjvOmlkMejpoBrpJFCJhyLio+mddm2bGrbuqbUClmXV4flp7ZtCQx/FSfBViqXpcuTzfNl4i6rvPetOQSFnB1uzSQB14Yv1jFr08m65kQXFhWe0rLU58D+S9YAYlSFTSIOKDSboEOp/HyIqsF+BeqPM/RIhK4CQdvn+TTmqX6gsIzqn5WDbTg+ywBOFLKUidsQdeWXgrUsJW5wJCscHPIuhqktGH1t6Ore0CotWX2GtfWQIoasCy2bdJVn2bvPtSFD5mhs6WVAsuAD6dh/R0Y4g19jlI7naIN72ynVT6X0EkKtGpBgToZUTZpsMn9Hz4Wv5zDjWXsMNsO5DxoBtqFcE/wfFlojs17jjhO7/fog1O1bVQ6zHKvuOnnRVwn2HHY65UghTRjW1ahVTPXKnStJQzzjaXs4iATYraqfn17l3aMMlqzKO30R85IYFfqvO1kJGMKs2dlYVZZkPXDdMxsiGMcvzr8nSWXmqQti2fACgCq3Y9rsDMDICWfKJp9YDFl/McURN1jtHK2uevRU/3/qomV7b382ok94yyZ24PU43X2aRz292sK1W1N/41pM0VLdNuWJ9J8FHLcWIJltxMVcDylkz5a12TQcBGo4jq6VU3ZNmL65k78W+9iFcWAySuW7cR2dKv6WbZ3DGisko0HSvOlYPXQNv67N9K1jPe+YBz0inYKBP1kyJ9zhCFHxwaj1K9En+MopwBtWFRCtzFkXqHOB4hJLXjGT5oJptY5jvQ5gZLpDoctTsBHfhK5oRhdOpLyvDUZXuFd+rBiqXbfzzpksxFZRsgQr4JxIyQ+Cre10dbhCB5JuRfoiGWz3hUq89IbLjWicSjjWDXYFMew97mvIsg9DzTJPcsH7VNv/d1qsHWc2UB6TrOdFGq5IAru6Xl3tZxMHs9PTzZFw7u9GoHiDmYdj2ZCilksACmZsyFTdEy3RIMQwyWGVNCvnGhnRsMukzAz54HkhZYcDim8n/VMHhUfncNP++WQR9y36NivRRzRQrmfTHXNnzInAlhuui4gJ7EOWxhZMoEgx7opLhKECdhNbKIWTSFpA8gMDl1zweOrey+TRY5Ea3DL1OK6CSrcdAWMNteBAlBDb3hOLUEIa+mo7aMhphC/T3xAyKlnp3Vf+qijb6dgnzd5Ss3W7UCLYaXqb9XyDG/cZsPhZ2DBvUO0LxFu6By0SyX9co4PGJ1DH5I0RieJX8mnmNGiNRuWPny3jvapZADiYjjgv1AypzgHE1AtTsWQi9TsWghuKmZ+oNepiTfxP+TA/nVYTMY3OlmdvgE9QC5p5QvBxE7on6rH9ZeHH4bJh0EYEe2mlcHm+NzS+ZZXyOijR71M/MoJM3KVkAirTkiQb4FS9rs2c6ewxZbyUzbxG29Z4uLT9iT8ZD6w3MKrkJ/xDD3Y6Oqp30gfQviPETzrvS+8n2BOIT/pUGVqow91vkH5vEgZ325xk86z8/bQzIiUL6LNZ6FM5bA3XD+jT5RAIC/rg1lamjJvAgFhXSvasvo8UvUNl7ZKicykS+aIddvWld0ztfyU5qiIkiR9D+x9hlJV8zvIZUmCqYBG3JBOsQ/J5fkVNm1b0Oy2dIkLDAJthtZOSyZUDdc7/K0aW3rlIK/m4Nu8cmVUQGJNYOXJMoKmnAlbWLkKV0/3o10FgPeWTGltWJQeeRlXMgRW2S45w5xpliwyB4t/kmY1EzBxtyd34ClGggcMW1kDb0IK7F1q+RrnPMvnMcNlvyZW5bi+COYTSyA27cwRqseeebvO6bBWuWmddztJ2hkjgEjjZObLta0KCMZ1VNAPgl0wRL/fqLVrWOgRP84rwq0SF1RzKjieaiMWTLuVvgUlr7wCb/CWvCgFr/Uhm4pVC5oGjVr+zGuvSyianpLnoTLsyYhRGWYODaiFvHRGYyc/4c5J/BSVRVDjBTrjxtK9aqCQtTN2hw7bKtVRWWeQriBlfjAkhBSkJUr5fpd0suxxU8kJFxhSFIgD8mvIzZWiGVxhJDJlhU/A4c62fHcSBdR6HG4hr37yNrkCrk8sNtvO8VjN54H6TW+epQD821LN0MT98DNHu+4NM6j+atbNSvXRKUMrEJ/qBmPUnw7fTIpCJXAP37rZT3MDi6zrzUdi/Y8oEMLx4nj8G99hgVZmIq0wC1uMkqKiPM0dSxd/K59Ekn16EdTIXQb4dDvA2Zr2WD7JAcQvISrINmHrDzFajqP2xjWwjUsXcRuO+9qR+bLG0fbAlDqio+em3k4ZfK3YNa7r3sY3T5OL98IeqrboJRt7UDx/XIxkGZkTCsrKAW1GNoxkT0VcGyZWneeSTe3GZXnFs4U/N9W+6Uz3FZROAsQfs4WdbE3Y/msbtWmyc6XyCpNiSXFyh8GdJCB5YkgjlEs2lY5ZY1Yly6EiuHMJTv/KqXf7q0zmnXDcVs55str2iqSVslm/R0E+rPHmdXfPwdop7zWaboIip93h7IlTYbYX7NJtW/D2JzZSv8hylFR6RqTwntQcF5rJhrG5tE3/GUoZp2d/NM+VowODTJaSTN8bOofJqGUFKgCDy39kzymUCO/wqqzNR8yM6VP0cp65Nq90lSwT6l2a5bfwW1al8vxNudi0LlaArIvHiJ8aJLKsl36UjXBH0r4qLbbKi/URieibhmm+IWF/X3+b/PQ/ADI70IwPQ1gaaGZiw/JQUh24/ql6dAyhtQfDlQl4YRQ8IiY2AExmAtDnUw2yPvjU/v9PBFHfs4pBl+bDHY30DUzRtaY11XA9lxYGygJqbJiAi+7LdsYwFGnqsF+5GU3mBgr3tA4wDU+i42gGvxVIWjMAgDENBuyPZE4gLrQrZevybO3fQsD0uhFzaQzaZQGfU5nZMWBHBiAiOt9wrFKVljjIKU/wtluspb53rsEjhJxaL6Zo5flV6KbC1lahRGrUhq1IoFi02vVXZMU5WsfECBABdtKeYx3iypx0mSdplhr6QAntBnAIhqtXMbyhkLcmSib7XUu+Fr9pka2B2R3DhA3F9pHaJ00Q1y8GcEUkE5fPo7D8wzcQaRqXf+3WBZEK/sOjE7vNLScsczeFRQFdm77tUnM2gqfDNZUna9Oych9ry4s6rLXeBIOyB1db+Ssgls3VlM1WYcGM+OW59RDrLW8lysKwK+GER+iI3eObYXo+adREqSqLtLAxZLB4uXDoBRRATvkUAM+/CxFAdn43qzcvdfFHp1IzRUBXjxyVvkYqib4qu7DqzDBpwAKN4AXJ0lFeMV1O66oOkE+DLozqmgztaeZVUY1VqVteNkV9NxlxDunJCgLGKdqU6z76QTG0j5OwzlisPZ2vXCtQgg3vRaWclxv9r17piT+9g/I9wbIN1ZIS/ThaV/QMRzG2stMlyXrD/JMa0DT2wevig2yqZgLPMwxIB5tCE9Ribu+WXvW+rU0Vg1UUpm2Nt2+FZm29WHyJHUekWL3nQ+1X1vtOy+rLaAHI0YuqbKvRZqNWDCx0q1wAoMVtcaLFqj3SvA2W3WG4IJby8ucZRoyuHTmIW1HFMHQv4Qx3PbzntKZaMqsoyEtNmCqbxUGtUTQ6r36Eng0Rp2GFjYIL5v9Q16WzzY8WQYtRNzG4ukKL3AsdjcViB6UoOBB3rEhbXgnMiHBwPOAK8F2T9XwUIIbg5sjd1e6kMw9uYTi9RFotjlVq+pgQ7Yu4gkehhtO5cuKOSph2mHy2LWTfluXkG6aNqlBNFQ5v9Is8eMhUUAsJeBwO7nD1MvYSEpPxxb++0hKWr4WEzAdMZxMA943jXqjsHpiwpOfNsGOKDsGTzL0EYviMHTzPGQTAesKWnuYHoeCEf6jhDlb1PG9Hno4y5VxfEkUBE0XT9+WB5NXeMHulx1dzdiu493Tr3E+8ZTY2E52QY6qocYwInPjQ2L4En8JpsBR2LINTj6t2cwqW2E9bD2N3Uz8/06urq+b5oEE+LEd4l43gUAXCM1DZbBEVdcQkWYqi6+PNisAadyze/BWKetQWa7a13LtIgSWlh+BxFfpb+MGAgvi0fUovuR3PlL+lLVW4tUV0LjlfFdf5ceHZ8cWVq4N5psiZug+nvzVyGTygDDOr6je0Yea6jwdqrWDradsSB3exvtFc23ebAVAv5B5QrdrcvvPpcsX30sU1uVz0xho8oaUrN5iBb4TA4mWM8U1g8BCBDKNfnm1hwMINXwCkg+oQIDXEoTrkIQ4thgBxSM+esTaU8SCFl4S4Vq+Qxd3cLNzl6/NyDRVKzX+GjtmRs15yPd91eEEOBJkzyC/ChWgcqouFzFgxhEq1e6+h672+2L42wNhp6y7mab9dhziLp7sCmHk8k7/ls8q6zD9I2KbpaihCJTtP7Ieg2IBIGBJz59+v7/rDnrixvbZoK3nVW3tZpdMdJFOQGxGjjESyGv9mqAhmQLAB+h7RfPKk5geuz+fvrz/F2ulxS+ju/4WzI77yEtWrTF9x6RAWdCD943Ax1pcZatBUmraLyK4xMQTaX/EAeDxUHxrbavu+EarwXHIRtZapNDUZUBCnd/iNO2lSUIQ5lcveoetMy90XKibR4z5iRtNIWyywClGZTomNhNVNkAT7tFv8I3yQ6pt0exypmatiW2PxxXv9vXDfYyHFXbJILszQ1616va82nGKLm5Ky6SSTJxTwGC/ZC+u/slvXIGIfUVFOt19zycPucLwIHTmm1/aKh8JzL0tfv9xlvNxOu9aNaBVVLV47b4x9hchlHNYXP3sZkX262lNu/wLjVN8LyEpaQEbCXEc7kii1bkwSOagzujVPtVMNjygl/1w/lzJkdmPoXmiwbHu3fdkaERkxLyL+YhWpha3F6qXXUM6XzFxAzfaYqKA6b6sfXgIL3NQSLJNoDb0ZdTuhky/GQm39Cs2OtimwIwG76DDyS4VeNiwiRArxVxwi1+xswVH2+eCyR3mbiUi+Bld61TGxfgQdLyxN0z5uqcALcUnPjJi/TzHx7eNvC2L4/I9ffwGpeRmMsq+DMwwGK43fYv56PR00myd3lf1lGBoRCSb/0tlBs1S3WeON0BX0iT+cQaM19WOYPMu3jxqL219pJn4wF0t+RmJHWxFzkRLgZL6Hy7qwnDJsBvR78WR5zxmKE1nkpitRLnn5F4E1FeDcx0DPaUoHT8lxdt93R1SozDEkQ+9waXF/T+4lz3Bs223z6zpVPPYJXRqqpWpu06bglEd1+49mWYloHo+Nyu6sM7/7/NCSTuCG3VXSlb3rjd4mhsMYnILRrDN6UL7Y4RA1fYVXpx5tPOpNSgJN2GUG7xuq9w5N2THYPZkPf38fMeHPXQdtapMSQp4O7pBixxTwMvhu+zPF5K+6z1hc9Aj3HtYEaZ6SQ/klTV1fqRWat8zXT4JPU3R41xN1QcNdEHA1yLbBkISCANwcfaAdFDQuLVVBhN+vDlDqMCrSRytmXACA1/ed7DfydCS/OeAkz98tE2u3SOe6daDduKW99SfYIWqPaJv2iKuW6yfRkgw2ofFvtAwFRy5kIBuUQbuVt5KXNDyEeDw5vsqFxX3czisbiQIJtR78icBKyUC5WKLcWe1puRwYwoeL7gfOgK156/OeitvsdlZu/Nn4kb3M9ou9wdiGgCRnBJE7L2OQIGgdvoyN1DAXfm1hLq+U3g5bliUyeXyKzKjvs+xTR0f9V+RPy1OyS7HFBvsuyzxc2fl0J0Pxh2lQmAbQJp6wQYSWNWmUHWRZOaBcGCwBNMKNC/h5x29OaBxh+lbEg5hyhbgCjutZZQ/n2NEMa/SQpSqqMKjgeVNX/eiw+YOhqB+rlfen/k+dX8NCMojhGoyra7JCRgVL46c5yHSRKyPUWrMzzGc+EH2wqOCBFzReO9G8F6g2QqzL5Xn0SGuY8mV6xhPKlp4yHmS+VNmQ/yJGLF0dm2hJujtPrkF5ezrIUCNMvHTZ6DI90qN6tdxR4BfUesd1sJg9cJxP8YNNW1EHSF5HOgpkTN1opDTyTKXloyUnUIObu/ylXw75qM93HsXMAV7rPNLd80znMGSv0ftA8mcth46h1fmo3TtmA+eW+LUtnp33vfB50ysedr7ZIbpduXjgCts16s5VG7hgdZWU3455+u3HPQ03cGbyf0WlpXsDpbPfcpo1uC6jZzDgblNpK/FeuYr680nBB0LmCynPSQ8VA5/+srnpKJwxUbm43U66vcza3RWtRch33YHiurwJi4OvYIUXgJBHMW3/XF+9eHKd5KkHY62I8vCFFaTIRlbuDvwyXsIJdVOKH76wQ2sHpbanJQveBQYzkZd+QL73bMVJjq9FOn5p6IhndfkP+rCsp82s0xL6oOOn/k6AcoM/KoHC6BlZJo5DmAaULAaW+2+1zxWDiyJAz8Dzip4AlngjgHK91MvX/ws/RPklLxQiysBv4vhHOZj3zlGRwo9EmuNL6bRwkypvHb/1wsOP0gy+HhoSwTZwK9UeBc7ir2njH3ATXsnxRczvusqY3yLh7DWrEvdM+WJC0FvesR9gfmuRuznUX2VSc9A2R7Mf0qi/6eFs+aGi0GjTHwNnLYoJlbdony2W5muJsoTWRYVieVXlo9kitPHdtBlsaQA/IYPDTR06J/pof3GDXzmXOfWkvgSJ29AvH4Mck5qLbAV5rlu0+4kYRPoM6ttTBU77LRXTzkv9byVO8WBI64WFacu9V9YQbiedOn3rccT1zJ3oyNo3xFCfeJfnNa6LWecRSfuNpAUv6leWsC3/PqLdOq06796CWMtMOBPOHwBWsFdBIOsur8K7eOC0yNAm3eB4QMLmXY6DVtqBqg9AbFyfu5SdkvrSQ4mbOqXtCXxiPlhogVC/LTG4GzFEucobvQHOxT5csC1ey2nAqbSVZuVhNmRYJ5hlk5ZC4X6Qbv6ZHrWSXkvQ3Ou6RXPn/6XSASkbbrRAL0JeHjQtjhffWiIBkHKlR9yVA70Y7n+vHcAoqhhlkQ1Rqp6T4z7VonI4qKrQzJD2CHdQH8PiJCuViKgerEhpzvGxtQnc6mnqNHqMJAy+Ik3Ptm2wvLBuoMhr+PrfbsbUUOl/5UM97RVlcl+Dnb66Q8FteQYb99VEOQxzhocfDKC9tEbYeP06ptlcSBhyl4FwImI2a9NHiO4L3Bi/U8n/V3cnwF21AF5d4ifubpag1meY8J1ZG2/uULYHtZ/XpdYGdnpZdNtHvnRtVk+s6mDQvmRla9GV2S3TTxx4O8HVyUfJ3nmXR0TD5R8vMNhiULGEGrzMVFbKAuF8YiQzJ6y9gL7eI5AD3duKpdNXtT1iBxR3oCfvif4IxcfFwEVjBLT7eN7nGZPOqmF8b33j6CoZpBnsiGTTV9GDdDS6+mlkpO7ZbPDQjSLrlPgrs0HvKhMfVfDlce8+oiCOELwWGJ0yyetG+Wn+VNRer3Hk4PTiHBHEEYRz6EapSW0KPcPAEYVz7Y30QvyNehsRzeWO4IJ9lExppOoBgKmIbV37ODegFf1OM0lhMVBX8r4cCFG0Wod+vM9r5P0Ga0L+DoGgZaaJSP37iuGuaGT6f3VdeW7tLO5EHLfZRtVv1/7uEmzJq/7nJ3794DME/GurjH7DOXf/xWlrc3Mg9/cJdDu1t0Vxsg569/qHfC31PY/2VB7ZEQOw2vIY8ZlAen3k3MCzcqZlp9R7gNvh51/8PSXyTEQL5EaZ9KUYvyT9lVb80nNvt8obBUlHsxLQH3qVX3r1C6rzifgfpdjMSiBzHix5q6coMYezNYPVA3y8dQzi8s3a+ByT/GzvuALDKTvnGMDMrzWZ7avk65/JGDks+SngM/X5GDh4l5WRsYi1ZjrLb07p/nUnQnDu8VrxeVupsVmjV68XdON3pLSN6dORpoF0ZBvG9yO8eUPPXrNz0fLa89pXmJd7xykfxqZEYU1/2mS/+JJf8vlqyDExm57FZkU2hQA1XTvmjYWIkVPOIeeGnW7y5WnJY/fskLvSCP1kinHmC4HAI9U49TGeW4gV5FuiqtWz1ZNsfLTx+mUBl9dLrFhUF/NA49nDRxuLfag1hOAIGyiPVq+P1SCyk877uTz905aQz+Hnq55Dz17bRZu/KlsTAVayn1GUpFnsfj9PO894z68lB6/w82GpqzIC25cr+zgxAFQUjTAaAZOwiv8kOz2qd/nWPO1t2O1LeTj+9F5F3aX+YoP2N0xxHKCniF7IE7mLv5PN8V6G8rHDlLiOYyMzLdOnGJeFE6+YFze/yidcRo/UimNtO8lZpd5ZEq8ENtErqNETu318oLkSOHUfLnwdLC92DWz3WbXNQS6VMszhFHNmPFToLJ7phqiqg1/XVIh1vcsqr0ltZbc0ZQiXtzY4Y0GM1zi/CzIIaXn48uHbBztYXUhvzU2+gDTsdP5ewL/nlMQZuR+Nb/KMvwCpfKTbD1ytVi7Xhd+ZMQpyCC53EWXr2YpfklxHUpVD3SAu/W1DAZQuv/2ZuXzk+cjKhR0TzD0dS/8X1WXdVfd6mOUZpTxCme3iWLYUpPXAeziUoTuKIAhxFCMflWZVeLwcr5PxbNrhDjsqCSz1ks0KGaSKNwcPSFyikXO8VtBC1I/jHob5t9h04LMHGUiAczdQYdhPRvEESDd07Bg28OA8FUHMZ64XfbGztkCXnJ1mEmy9faHhauF+gRqWCwMr6ZiWfD4jsL3Mp3D6LKLsJZQllPxRgpT7G7D1EPa9jo1volIKqJWpQUd9VSQLUufhAOqmx0jsMB06rCZ8weZQQ6KqJFdF+mhz7Ynqb9CCpZctGunrbIGIiAuLiGHpx8WsCixvL+wbCbgfabheuLHdkF858sb1EWtbP8gtQWq1bSPz/JXCoxpxINt97RKcPOToP99tKOeg1MWLRVqEFhzboTu+9L2dMh8J4UbKGi6yc39rCE4G78OdwgPF3XtlpLLJE/A4mUthumzPkYJtXRJpWhdLdDOSvUEnWRvEVZFp0z5rOueveDf+fazhUZ0tuzqoISGYrbcz9JMCm6iiZQkDU6YHpuDxp42MK+op6NYy15IPX+IDnqvKrZ67Q3FrOCf35+munoIcaKTGCGEQuYLAaguH+x/JQbFoemnc72Imv4hzVwvOfDIGb/oSYWNpuy9+Ba8/HYIxslUskc+jer9RzdttAu/ZCG6Btz8xqlp6uGi2ed+yF/RriQUBQ3yQT34gtSj0W4DlI3zHYDi7n+/GQk61VsHCV1mQ89/FzRSobb5tX0pOfWSfsbXZj13Fly4BOYu9bchXBe3Qzf5ddKmQ5sMPOwtwZz9/yH/SpmenY61EPF/5jNiRbchY49YI6BZ8Oaea//XVVbyvpm6z8Q1u0XFcmsNWPLhXrnFloLCK+Q1P1SQr3FfkExYqR0b81CUZpyMPttQwms1iqNUiELy969NAprdz80a7Q4yey6yp5S3YEIB/KIRig2Hwr9j6UwrH1zSUHL6lc1U07nB9wGVvKdcXfXBBl9cYmoWRswc8Rwa+Fl4eZLlnpY6Vt8pGjn5Mk9dMCg8fVPnBppP0aefH8WpDYEjcwh+AF+zX93lS9HAJEZoDB/KzHJ7vKgevV2u+hXfhmO6uoTjq6gkGFOa5wWnRPdDGDIyL827EGxfTNq6AUUscUWoFBN3VQ8F/5tQerDL1ddmTzkhTSFlFkBbNZ6urY/vsm39pPcbf7XOr6E4EWFT/EkkXoEQhzXiV7e2OWVuk7y/yR2FUagS+sgHUPpn9b0MlLJuPFYS8S7BGxdtdy16PpElL+oVosr4XJs+Zy7KNHvXQmbGRD6/dzRCD+5WVvoczqstZviws6YiBKLx+bgTKzjYtG+vqSSOs7ftxSF29E8GVDILDBL6WFLOcmsZEx+DnRUJLNVin1KM7Q5sljJ2tDulTmwjypzIKWn6eOjMbnPthp9mT/fJwPwudzwI8sf3Bc+hrpibQlzSwBhLBMclPTWlhd/LxU/r7NTHoGphMt0ZmkLuv/w/g1de+e7NPkN+fKHMnTpC8+vQDpX2C5M0zfkL5P1RfVcshF/wr0wYIXESOvMBJ+ve78xHyVTCyQex+Smbq/L1jvWG5p58/G/UoePsl56coRxRihOZ73rYM9pdo+vzLNpJkbvQkve3+z2u3oh1Nat+NcT+883LXZUAayV0eagzy6B9vtKwSouaikccPfYsvuWIuzHS75aJpkTzseMKx8zhSFemsMqfqhhK9S4sHG8ryhw6W9psDnPP375awCQkQYq0RvjL60zOZX9ffm9sKOyHtHmfWW6grwpGqFq9yFNUR9WE/pg86aiKIljLyr3vX4/EzY+6so8JOL/glQOyhzd9JRtt560LMbsIVfgOpsODB5NV98797tTYtqt9LmMiXBsHyJZi1k/1+FKZPvz29fj2/HsRv+cP8AdkEce03ar9WPGIztWcUqf2Uz65LH5FlEOyfObJJAFREjZM1MjdCrKAS4qmxSoLPy99I5YdlO4Bww3Dc/Q2HOo9ydkbQTyPSy3cj9ghzwsZ2i0FgaAB2BhCnLe/0R3an9pse/i+wlMKTHbJ71czck55YrffAFm0vnNvX0uf1Jq2vLoYJLCuMeNI+aFZ6Vd4LcdOzRUHW4flEe3HjyY/+lz/OX/jGTjqLXIuAPoknYDB2mKneGRmldhpQwXNP4WjRv4IivkjA7YcKoWZphiv1cxwBeIIwqSPUyWSPvCUtyi8Qa5VSuTNbmIHFpw1CSygG2qzTTRNbmtdjoQaf5HK/fYvKJprafPtWBFmqxkl8/JSel76crC9Ag/r8u8hWN2F0DaYA3RreENHQrjAUAHF6LBDochAIIVimGhpAg1pOWJKgxtiv/QAtITbW4PfrMKFx09oxvYLlCmiG3rrCFWeFsRa8MdPP1x8lqEMcZqqe2PQzLsWnL59qzqSH62eo/0AQUACh66PhgJ9Lqu8RK9Kd+xpC9DXWDM3pu23oCW+h7uMPigkizod/29QGNV5++gJ9Khfrh7K+TyZ8TSg4MmhCmk1UxJgyv8TCMRgOR3csLKW/kzw8jbpyGzwz1KeKCo8pTVb9rD8Y+inQj8aodp71iu166PcQuSW+vkhv2k+MmCMfarz+8Od7NtzasFQQXZPbk+XgtdcmJTsTrd+leYaNwMpj1s7ahYj3BDG3fvjSALNaCv/O/jFvJwwcaPJXvDbTrKyn/xPGNelGGxSXK5bE3Sp5ueXAWv5B/gLAcrwgSrKiarphWrbjen4QRnGSZnlRVnXTdv0wTvOybvtxXvfzfr9Eh0ZXZPV+9DzaOhzy94o9F0BUU2lH62fjZo5buHSfCgCMG+N2jjvEOXLnRPZRwPHXDt6v6cUXjzZLnN58+OGxBh1NXrCJ0pm4qKcEEvwBKvHXokP87CWOYPAOQzWjZNT2je1bm3eO4mnBMfVc+mKknNOTjZs84AW9EX7jtRG3l+x4g/wWZXXLbptOymOUBWG3D5GiHDvdcFRJITt6/+ROgqiwYuiBsaef2oDN+jK9eyG34G2fOgSM3p97yPTpFtUTYecpqGUKL0bx7u+YPUwDIXIpVfkZdDRQPB6jTM5HW8rZ9G4+HiVn4+1RWZ66hHH62HmZsvWLJ09CXkpgi+FpZ9ppfNVKXKo6yPjmY4Rw5Q4kqfKI4Cfgk9En8UiWIOUYEHKNz0UHHYnGTPEZrx050WTLk5SriRcni/bYeymSkSyNyvPxN1GFEvM5Up4U/JTfKmA966e3UyxUkAPjisI01gKFjz7AQg+xUBl/kg/+A734qE4Xm8f91ERzGVV9uUS1eD2PPh0CPGnQu0FU11owJovy+o/yQbtX90AZl3vfqvFBwvcLZWX29V31icMfpntMuyZQ1055hysB90p0R5Gz1zR12ZDzT9Zwxbw6Xb7i91wB+ALfx4fH9dJ60n70ZtXd0eTixbyqkJZL/t7PwXU25crNLQ+UfuaWPz4BTywXQf4sM3Y1+YOgTHgsSyiG0/WECdoXNR9/2xVCwQ7W8T9dvlda6PvQ+6+x7CWWDZ3Xl5bzhIBExMb6+S4voIckcOznFJnkyCKRcmw8xxc5spAMdicrC7caHRCIyNj051jGwZVnSwJSHLhIRtMj9pWRSo2rpG6Gx7TIBQAD+ckfriElOg89YT4JReP5fy3/B4yqwtzsUSNyBG0WW+MDdvgQC+iRAo2/f6gC8lMl+/LiEgMCQsC8uH0nHWGsE2devM/Y1ZF5veUh3X5uYOUTM7TVqhBhaylRNLhIRnv/8+maIhCR1nrK0hQDLpLRz3HU90kyIAhDc6O7komgskhELH3Uw2dECJUIRKTxyXt5IQ2f7dZ1Ilg8JGHMX/wBRlJi9dCSETW+6nY1ImgNHJGXv/n9dcQADlqAvvQpjEKR/br/tJkkJKXqb57jmuK2IwUIrPy8RYWddsQBQCCgX9jopxKSDCh3y6qEJH2a86wOwBEBI6XP6ADp1Z93OHE4jzhsQCBUjb0vjlZ50W/a4A2ppS/0vb3i8ft+SYHPayW84VD/plcEZQ1FuEIlLc6CRa4SitYRTBO1GjCkbtXoQlIDOCJgZ8BZPtU4zpPB1ICHe1YaXGVN/AERBaoqXCTVrl3fi5jqXS+RoWBNslKkJKEjQVYpxugi6RbhU6eiVbnSp8LpiQqiiDJR1ZTjZqrR/7xj3amKq+ZypcSDSrmVdgUQtUI5XJVc4Wmk5S/RgX37oxhN3DpDt5mgi3IDFaZGdjipgWjiD5Kw9eFt958LJHtrBlw3RSQp5SYQTWYAtTYYk3U1DwZd5oL60zZ6ixarPZnzb0lpKslracC3K5tRwCC/rbsYpo6o8GAwDRQu87xJJYYATsFgcxX6AVUZbcBVK+0SxFelwzLvlNy8FriVsqbBDiTHCP5Vmf+JmG5ZxUKskTDT8mLlP8Ir8WdLyXdBeMfVAddmWr24Af0JgzykDAQMmvpIayTOJhdtuExvb89AkFuqnzmYyAGbg5kGRzjvR5BHUNlvuCFGtM0+Ve5jjl2K2OYJNOMlq9+ot2rY0pbDAw0e+2PBHFZiKgGUWPJ1W+khyrDg25SbBtMg+eWtnfBCzNdtpPRNhioK1y9Ttw4+DcC3pYPCfdAkt+zbtPZ4H6e2suLbNua+pNMyA2xri7etYXoX/rUKJri45TbHGSeF7TlM422tGi9evaNWpSvCnvFe71pSLuVMLmbi7FUP0cqgYMde3GBaTXzDxo6Xg1a+CVjGpmxKZYt7DS6dKPAnCSM8a+fjLTtyw1TLpOkzVq3mWJT6WONup6MkQGq52uP8nP2qwaYhatRqc6im2t3JMu0Ha4gCgdz/qsNY3kcvjgXQE0rW1GX4PYW5TdtFjmsrSbOdoPUfU4xmAhlqEQO8gOWA3sVb8rgk7lx4f96v+eLPFCZF/1CoyzIGbOMigT/sDecz/bNHKYKkaWfK+NQccoXIrIcP4c5CYSYea5+cxaRYjMaqWQxems6d2i+G3J3axfn1xvD8nqcWs9+JmvvApN5yUzsnytzBR/jQQXP+W0tz8pDGcnqANb7EsR8p83pD0RGeRoOK/RjDzTm7DU4n4I7GX6gTwR5h3Rdo1xCJqtoD67MgfFSHfAgqGGEdSHZDK88NzOiU47O3WcgNgDRFDswSWb4nG7BuCduynxrgNaCM5rNyjM3cHgY8JXCcHDnkgw8Orz80AmRG286wz31KgvDuYvu69gA16t5TrTQnMFv7BtUGW520mwUMT/geYPjzO5X/EoO4153AHXwS3/7W7bqV9S+zACZunfQvOfF5mb7XMVU7YIRbmV0rDpEWQ9614elP4mtLrSZ8GtABAw==","base64")).toString()},75418:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/shell"}')},42357:e=>{"use strict";e.exports=require("assert")},64293:e=>{"use strict";e.exports=require("buffer")},63129:e=>{"use strict";e.exports=require("child_process")},27619:e=>{"use strict";e.exports=require("constants")},76417:e=>{"use strict";e.exports=require("crypto")},40881:e=>{"use strict";e.exports=require("dns")},28614:e=>{"use strict";e.exports=require("events")},35747:e=>{"use strict";e.exports=require("fs")},98605:e=>{"use strict";e.exports=require("http")},97565:e=>{"use strict";e.exports=require("http2")},57211:e=>{"use strict";e.exports=require("https")},32282:e=>{"use strict";e.exports=require("module")},11631:e=>{"use strict";e.exports=require("net")},12087:e=>{"use strict";e.exports=require("os")},85622:e=>{"use strict";e.exports=require("path")},71191:e=>{"use strict";e.exports=require("querystring")},51058:e=>{"use strict";e.exports=require("readline")},92413:e=>{"use strict";e.exports=require("stream")},24304:e=>{"use strict";e.exports=require("string_decoder")},4016:e=>{"use strict";e.exports=require("tls")},33867:e=>{"use strict";e.exports=require("tty")},78835:e=>{"use strict";e.exports=require("url")},31669:e=>{"use strict";e.exports=require("util")},68987:e=>{"use strict";e.exports=require("v8")},92184:e=>{"use strict";e.exports=require("vm")},78761:e=>{"use strict";e.exports=require("zlib")}},__webpack_module_cache__={};function __webpack_require__(e){if(__webpack_module_cache__[e])return __webpack_module_cache__[e].exports;var t=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e].call(t.exports,t,t.exports,__webpack_require__),t.loaded=!0,t.exports}return __webpack_require__.c=__webpack_module_cache__,__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},__webpack_require__.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),__webpack_require__(28638)})(); \ No newline at end of file diff --git a/tgui/.yarn/sdks/eslint/bin/eslint.js b/tgui/.yarn/sdks/eslint/bin/eslint.js new file mode 100644 index 0000000000000..4e7554dc1ad0d --- /dev/null +++ b/tgui/.yarn/sdks/eslint/bin/eslint.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.js"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require eslint/bin/eslint.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real eslint/bin/eslint.js your application uses +module.exports = absRequire(`eslint/bin/eslint.js`); diff --git a/tgui/.yarn/sdks/eslint/lib/api.js b/tgui/.yarn/sdks/eslint/lib/api.js new file mode 100644 index 0000000000000..ac3c9fc064979 --- /dev/null +++ b/tgui/.yarn/sdks/eslint/lib/api.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.js"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require eslint/lib/api.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real eslint/lib/api.js your application uses +module.exports = absRequire(`eslint/lib/api.js`); diff --git a/tgui/.yarn/sdks/eslint/package.json b/tgui/.yarn/sdks/eslint/package.json new file mode 100644 index 0000000000000..4b0d99dbb9332 --- /dev/null +++ b/tgui/.yarn/sdks/eslint/package.json @@ -0,0 +1,6 @@ +{ + "name": "eslint", + "version": "7.21.0-pnpify", + "main": "./lib/api.js", + "type": "commonjs" +} diff --git a/tgui/.yarn/sdks/integrations.yml b/tgui/.yarn/sdks/integrations.yml new file mode 100644 index 0000000000000..76ed42ba94714 --- /dev/null +++ b/tgui/.yarn/sdks/integrations.yml @@ -0,0 +1,5 @@ +# This file is automatically generated by PnPify. +# Manual changes will be lost! + +integrations: + - vscode diff --git a/tgui/.yarn/sdks/typescript/bin/tsc b/tgui/.yarn/sdks/typescript/bin/tsc new file mode 100644 index 0000000000000..06e51d0d9706b --- /dev/null +++ b/tgui/.yarn/sdks/typescript/bin/tsc @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.js"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require typescript/bin/tsc + require(absPnpApiPath).setup(); + } +} + +// Defer to the real typescript/bin/tsc your application uses +module.exports = absRequire(`typescript/bin/tsc`); diff --git a/tgui/.yarn/sdks/typescript/bin/tsserver b/tgui/.yarn/sdks/typescript/bin/tsserver new file mode 100644 index 0000000000000..2d03f3d97b087 --- /dev/null +++ b/tgui/.yarn/sdks/typescript/bin/tsserver @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.js"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require typescript/bin/tsserver + require(absPnpApiPath).setup(); + } +} + +// Defer to the real typescript/bin/tsserver your application uses +module.exports = absRequire(`typescript/bin/tsserver`); diff --git a/tgui/.yarn/sdks/typescript/lib/tsc.js b/tgui/.yarn/sdks/typescript/lib/tsc.js new file mode 100644 index 0000000000000..e030711c5aeb2 --- /dev/null +++ b/tgui/.yarn/sdks/typescript/lib/tsc.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.js"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require typescript/lib/tsc.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real typescript/lib/tsc.js your application uses +module.exports = absRequire(`typescript/lib/tsc.js`); diff --git a/tgui/.yarn/sdks/typescript/lib/tsserver.js b/tgui/.yarn/sdks/typescript/lib/tsserver.js new file mode 100644 index 0000000000000..1d6dfb6115ac6 --- /dev/null +++ b/tgui/.yarn/sdks/typescript/lib/tsserver.js @@ -0,0 +1,111 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.js"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +const moduleWrapper = tsserver => { + const {isAbsolute} = require(`path`); + const pnpApi = require(`pnpapi`); + + const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => { + return `${locator.name}@${locator.reference}`; + })); + + // VSCode sends the zip paths to TS using the "zip://" prefix, that TS + // doesn't understand. This layer makes sure to remove the protocol + // before forwarding it to TS, and to add it back on all returned paths. + + function toEditorPath(str) { + // We add the `zip:` prefix to both `.zip/` paths and virtual paths + if (isAbsolute(str) && !str.match(/^\^zip:/) && (str.match(/\.zip\//) || str.match(/\$\$virtual\//))) { + // We also take the opportunity to turn virtual paths into physical ones; + // this makes is much easier to work with workspaces that list peer + // dependencies, since otherwise Ctrl+Click would bring us to the virtual + // file instances instead of the real ones. + // + // We only do this to modules owned by the the dependency tree roots. + // This avoids breaking the resolution when jumping inside a vendor + // with peer dep (otherwise jumping into react-dom would show resolution + // errors on react). + // + const resolved = pnpApi.resolveVirtual(str); + if (resolved) { + const locator = pnpApi.findPackageLocator(resolved); + if (locator && dependencyTreeRoots.has(`${locator.name}@${locator.reference}`)) { + str = resolved; + } + } + + str = str.replace(/\\/g, `/`) + str = str.replace(/^\/?/, `/`); + + // Absolute VSCode `Uri.fsPath`s need to start with a slash. + // VSCode only adds it automatically for supported schemes, + // so we have to do it manually for the `zip` scheme. + // The path needs to start with a caret otherwise VSCode doesn't handle the protocol + // + // Ref: https://github.com/microsoft/vscode/issues/105014#issuecomment-686760910 + // + if (str.match(/\.zip\//)) { + str = `${isVSCode ? `^` : ``}zip:${str}`; + } + } + + return str; + } + + function fromEditorPath(str) { + return process.platform === `win32` + ? str.replace(/^\^?zip:\//, ``) + : str.replace(/^\^?zip:/, ``); + } + + // And here is the point where we hijack the VSCode <-> TS communications + // by adding ourselves in the middle. We locate everything that looks + // like an absolute path of ours and normalize it. + + const Session = tsserver.server.Session; + const {onMessage: originalOnMessage, send: originalSend} = Session.prototype; + let isVSCode = false; + + return Object.assign(Session.prototype, { + onMessage(/** @type {string} */ message) { + const parsedMessage = JSON.parse(message) + + if ( + parsedMessage != null && + typeof parsedMessage === `object` && + parsedMessage.arguments && + parsedMessage.arguments.hostInfo === `vscode` + ) { + isVSCode = true; + } + + return originalOnMessage.call(this, JSON.stringify(parsedMessage, (key, value) => { + return typeof value === `string` ? fromEditorPath(value) : value; + })); + }, + + send(/** @type {any} */ msg) { + return originalSend.call(this, JSON.parse(JSON.stringify(msg, (key, value) => { + return typeof value === `string` ? toEditorPath(value) : value; + }))); + } + }); +}; + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require typescript/lib/tsserver.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real typescript/lib/tsserver.js your application uses +module.exports = moduleWrapper(absRequire(`typescript/lib/tsserver.js`)); diff --git a/tgui/.yarn/sdks/typescript/lib/typescript.js b/tgui/.yarn/sdks/typescript/lib/typescript.js new file mode 100644 index 0000000000000..7e3c852fe198a --- /dev/null +++ b/tgui/.yarn/sdks/typescript/lib/typescript.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.js"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require typescript/lib/typescript.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real typescript/lib/typescript.js your application uses +module.exports = absRequire(`typescript/lib/typescript.js`); diff --git a/tgui/.yarn/sdks/typescript/package.json b/tgui/.yarn/sdks/typescript/package.json new file mode 100644 index 0000000000000..254e665561db6 --- /dev/null +++ b/tgui/.yarn/sdks/typescript/package.json @@ -0,0 +1,6 @@ +{ + "name": "typescript", + "version": "4.2.3-pnpify", + "main": "./lib/typescript.js", + "type": "commonjs" +} diff --git a/tgui/.yarnrc.yml b/tgui/.yarnrc.yml index cecb449dd1da5..b9ccb4ad28891 100644 --- a/tgui/.yarnrc.yml +++ b/tgui/.yarnrc.yml @@ -1 +1,15 @@ -yarnPath: ".yarn/releases/yarn-berry.js" +logFilters: + - code: YN0004 + level: discard + - code: YN0062 + level: discard + +plugins: + - path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs + spec: "@yarnpkg/plugin-interactive-tools" + +preferAggregateCacheInfo: true + +preferInteractive: true + +yarnPath: .yarn/releases/yarn-2.4.1.cjs diff --git a/tgui/README.md b/tgui/README.md index 5efd4b14b31f3..86d2d5c30b461 100644 --- a/tgui/README.md +++ b/tgui/README.md @@ -86,6 +86,7 @@ Run `.\bin\tgui.bat` with any of the options listed below. - `bin/tgui --dev --no-hot` - Disable hot module replacement (helps when doing development on IE8). - `bin/tgui --lint` - Show problems with the code. +- `bin/tgui --test` - Run tests. - `bin/tgui --fix` - Auto-fix problems with the code. - `bin/tgui --analyze` - Run a bundle analyzer. - `bin/tgui --clean` - Clean up project repo. @@ -126,6 +127,16 @@ variable, with a full path to BYOND cache. BYOND_CACHE="E:/Libraries/Documents/BYOND/cache" ``` +**Webpack errors out with some cryptic messages!** + +> Example: `No template for dependency: PureExpressionDependency` +Webpack stores its cache on disk since tgui 4.3, and it is very sensitive +to build configuration. So if you update webpack, or share the same cache +directory between development and production build, it will start +hallucinating. + +To fix this kind of problem, run `bin/tgui --clean` and try again. + ## Developer Tools When developing with `tgui-dev-server`, you will have access to certain diff --git a/tgui/babel.config.js b/tgui/babel.config.js new file mode 100644 index 0000000000000..46fc0b0768878 --- /dev/null +++ b/tgui/babel.config.js @@ -0,0 +1,43 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +const createBabelConfig = options => { + const { mode, presets = [], plugins = [] } = options; + return { + presets: [ + [require.resolve('@babel/preset-typescript'), { + allowDeclareFields: true, + }], + [require.resolve('@babel/preset-env'), { + modules: 'commonjs', + useBuiltIns: 'entry', + corejs: '3.10', + spec: false, + loose: true, + targets: [], + }], + ...presets, + ], + plugins: [ + [require.resolve('@babel/plugin-proposal-class-properties'), { + loose: true, + }], + require.resolve('@babel/plugin-transform-jscript'), + require.resolve('babel-plugin-inferno'), + require.resolve('babel-plugin-transform-remove-console'), + require.resolve('common/string.babel-plugin.cjs'), + ...plugins, + ], + }; +}; + +module.exports = api => { + api.cache(true); + const mode = process.env.NODE_ENV; + return createBabelConfig({ mode }); +}; + +module.exports.createBabelConfig = createBabelConfig; diff --git a/tgui/bin/tgui b/tgui/bin/tgui index e3c7d1e95ace2..5569655fa4454 100755 --- a/tgui/bin/tgui +++ b/tgui/bin/tgui @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash ## Copyright (c) 2020 Aleksej Komarov ## SPDX-License-Identifier: MIT @@ -26,9 +26,18 @@ fi base_dir="$(dirname "$(tgui-realpath "${0}")")/.." base_dir="$(tgui-realpath "${base_dir}")" +## Make use of nvm if it exists +if [[ -e "${HOME}/.nvm/nvm.sh" ]]; then + source "${HOME}/.nvm/nvm.sh" +fi + ## Fall back to running Yarn from the repo if ! hash yarn 2>/dev/null; then - alias yarn="node '${base_dir}/.yarn/releases/yarn-berry.js'" + yarn_releases=("${base_dir}"/.yarn/releases/yarn-*.cjs) + yarn_release="${yarn_releases[0]}" + yarn() { + node "${yarn_release}" "${@}" + } fi @@ -54,43 +63,41 @@ task-dev-server() { } ## Run a linter through all packages -task-eslint() { +task-lint() { cd "${base_dir}" - yarn run eslint packages "${@}" + yarn run tsc + echo "tgui: type check passed" + yarn run eslint packages --ext .js,.cjs,.ts,.tsx "${@}" echo "tgui: eslint check passed" } +task-test() { + cd "${base_dir}" + yarn run jest +} + ## Mr. Proper task-clean() { cd "${base_dir}" ## Build artifacts rm -rf public/.tmp rm -f public/*.map + rm -f public/*.chunk.* + rm -f public/*.bundle.* rm -f public/*.hot-update.* ## Yarn artifacts rm -rf .yarn/cache rm -rf .yarn/unplugged - rm -rf .yarn/build-state.yml - rm -rf .yarn/install-state.gz + rm -rf .yarn/webpack + rm -f .yarn/build-state.yml + rm -f .yarn/install-state.gz + rm -f .yarn/install-target rm -f .pnp.js ## NPM artifacts rm -rf **/node_modules rm -f **/package-lock.json } -## Validates current build against the build stored in git -task-validate-build() { - cd "${base_dir}" - local diff - diff="$(git diff public/*)" - if [[ -n ${diff} ]]; then - echo "Error: our build differs from the build committed into git." - echo "Please rebuild tgui." - exit 1 - fi - echo "tgui: build is ok" -} - ## Installs merge drivers and git hooks task-install-git-hooks() { cd "${base_dir}" @@ -133,16 +140,6 @@ if [[ ${1} == "--install-git-hooks" ]]; then exit 0 fi -## Continuous integration scenario -if [[ ${1} == "--ci" ]]; then - task-clean - task-install - task-eslint - task-webpack --mode=production - task-validate-build - exit 0 -fi - if [[ ${1} == "--clean" ]]; then task-clean exit 0 @@ -158,21 +155,28 @@ fi if [[ ${1} == '--lint' ]]; then shift 1 task-install - task-eslint "${@}" + task-lint "${@}" exit 0 fi if [[ ${1} == '--lint-harder' ]]; then shift 1 task-install - task-eslint -c .eslintrc-harder.yml "${@}" + task-lint -c .eslintrc-harder.yml "${@}" exit 0 fi if [[ ${1} == '--fix' ]]; then shift 1 task-install - task-eslint --fix "${@}" + task-lint --fix "${@}" + exit 0 +fi + +if [[ ${1} == '--test' ]]; then + shift 1 + task-install + task-test "${@}" exit 0 fi @@ -184,9 +188,16 @@ if [[ ${1} == '--analyze' ]]; then fi ## Make a production webpack build +if [[ ${1} == '--build' ]]; then + task-install + task-webpack --mode=production + exit 0 +fi + +## Make a production webpack build + Run eslint if [[ -z ${1} ]]; then task-install - task-eslint + task-lint --fix task-webpack --mode=production exit 0 fi diff --git a/tgui/bin/tgui-dev-server.bat b/tgui/bin/tgui-dev-server.bat index 28c27e6fca859..21b2ea4e962b7 100644 --- a/tgui/bin/tgui-dev-server.bat +++ b/tgui/bin/tgui-dev-server.bat @@ -1,7 +1,7 @@ @echo off rem Copyright (c) 2020 Aleksej Komarov rem SPDX-License-Identifier: MIT -call powershell.exe -NoLogo -ExecutionPolicy Bypass -File "%~dp0\tgui.ps1" --dev %* +call powershell.exe -NoLogo -ExecutionPolicy Bypass -File "%~dp0\tgui_.ps1" --dev %* rem Pause if launched in a separate shell unless initiated from powershell echo %PSModulePath% | findstr %USERPROFILE% >NUL if %errorlevel% equ 0 exit 0 diff --git a/tgui/bin/tgui.bat b/tgui/bin/tgui.bat index d4fa916b51553..39aa279dcaa25 100644 --- a/tgui/bin/tgui.bat +++ b/tgui/bin/tgui.bat @@ -1,7 +1,7 @@ @echo off rem Copyright (c) 2020 Aleksej Komarov rem SPDX-License-Identifier: MIT -call powershell.exe -NoLogo -ExecutionPolicy Bypass -File "%~dp0\tgui.ps1" %* +call powershell.exe -NoLogo -ExecutionPolicy Bypass -File "%~dp0\tgui_.ps1" %* rem Pause if launched in a separate shell unless initiated from powershell echo %PSModulePath% | findstr %USERPROFILE% >NUL if %errorlevel% equ 0 exit 0 diff --git a/tgui/bin/tgui.ps1 b/tgui/bin/tgui.ps1 deleted file mode 100644 index e3329f4521c73..0000000000000 --- a/tgui/bin/tgui.ps1 +++ /dev/null @@ -1,116 +0,0 @@ -## Copyright (c) 2020 Aleksej Komarov -## SPDX-License-Identifier: MIT - -## Initial set-up -## -------------------------------------------------------- - -## Normalize current directory -$basedir = Split-Path $MyInvocation.MyCommand.Path -$basedir = Resolve-Path "$($basedir)\.." -Set-Location $basedir -[Environment]::CurrentDirectory = $basedir - - -## Functions -## -------------------------------------------------------- - -function yarn { - node.exe ".yarn\releases\yarn-berry.js" @Args -} - -function Remove-Quiet { - Remove-Item -ErrorAction SilentlyContinue @Args -} - -function task-install { - yarn install -} - -## Runs webpack -function task-webpack { - yarn run webpack-cli @Args -} - -## Runs a development server -function task-dev-server { - yarn node "packages/tgui-dev-server/index.esm.js" @Args -} - -## Run a linter through all packages -function task-eslint { - yarn run eslint packages @Args - Write-Output "tgui: eslint check passed" -} - -## Mr. Proper -function task-clean { - ## Build artifacts - Remove-Quiet -Recurse -Force "public\.tmp" - Remove-Quiet -Force "public\*.map" - Remove-Quiet -Force "public\*.hot-update.*" - ## Yarn artifacts - Remove-Quiet -Recurse -Force ".yarn\cache" - Remove-Quiet -Recurse -Force ".yarn\unplugged" - Remove-Quiet -Recurse -Force ".yarn\build-state.yml" - Remove-Quiet -Recurse -Force ".yarn\install-state.gz" - Remove-Quiet -Force ".pnp.js" - ## NPM artifacts - Get-ChildItem -Path "." -Include "node_modules" -Recurse -File:$false | Remove-Item -Recurse -Force - Remove-Quiet -Force "package-lock.json" -} - - -## Main -## -------------------------------------------------------- - -if ($Args[0] -eq "--clean") { - task-clean - exit 0 -} - -if ($Args[0] -eq "--dev") { - $Rest = $Args | Select-Object -Skip 1 - task-install - task-dev-server @Rest - exit 0 -} - -if ($Args[0] -eq "--lint") { - $Rest = $Args | Select-Object -Skip 1 - task-install - task-eslint @Rest - exit 0 -} - -if ($Args[0] -eq "--lint-harder") { - $Rest = $Args | Select-Object -Skip 1 - task-install - task-eslint -c ".eslintrc-harder.yml" @Rest - exit 0 -} - -if ($Args[0] -eq "--fix") { - $Rest = $Args | Select-Object -Skip 1 - task-install - task-eslint --fix @Rest - exit 0 -} - -## Analyze the bundle -if ($Args[0] -eq "--analyze") { - task-install - task-webpack --mode=production --analyze - exit 0 -} - -## Make a production webpack build -if ($Args.Length -eq 0) { - task-install - task-eslint - task-webpack --mode=production - exit 0 -} - -## Run webpack with custom flags -task-install -task-webpack @Args diff --git a/tgui/bin/tgui_.ps1 b/tgui/bin/tgui_.ps1 new file mode 100644 index 0000000000000..c8f74b2d21471 --- /dev/null +++ b/tgui/bin/tgui_.ps1 @@ -0,0 +1,147 @@ +## Copyright (c) 2020 Aleksej Komarov +## SPDX-License-Identifier: MIT + +## Initial set-up +## -------------------------------------------------------- + +## Enable strict mode and stop of first cmdlet error +Set-StrictMode -Version Latest +$ErrorActionPreference = "Stop" +$PSDefaultParameterValues['*:ErrorAction'] = 'Stop' + +## Validates exit code of external commands +function Throw-On-Native-Failure { + if (-not $?) { + exit 1 + } +} + +## Normalize current directory +$basedir = Split-Path $MyInvocation.MyCommand.Path +$basedir = Resolve-Path "$($basedir)\.." +Set-Location $basedir +[Environment]::CurrentDirectory = $basedir + + +## Functions +## -------------------------------------------------------- + +function yarn { + $YarnRelease = Get-ChildItem -Filter ".yarn\releases\yarn-*.cjs" | Select-Object -First 1 + node ".yarn\releases\$YarnRelease" @Args + Throw-On-Native-Failure +} + +function Remove-Quiet { + Remove-Item -ErrorAction SilentlyContinue @Args +} + +function task-install { + yarn install +} + +## Runs webpack +function task-webpack { + yarn run webpack-cli @Args +} + +## Runs a development server +function task-dev-server { + yarn node "packages/tgui-dev-server/index.esm.js" @Args +} + +## Run a linter through all packages +function task-lint { + yarn run tsc + Write-Output "tgui: type check passed" + yarn run eslint packages --ext ".js,.cjs,.ts,.tsx" @Args + Write-Output "tgui: eslint check passed" +} + +function task-test { + yarn run jest +} + +## Mr. Proper +function task-clean { + ## Build artifacts + Remove-Quiet -Recurse -Force "public\.tmp" + Remove-Quiet -Force "public\*.map" + Remove-Quiet -Force "public\*.hot-update.*" + ## Yarn artifacts + Remove-Quiet -Recurse -Force ".yarn\cache" + Remove-Quiet -Recurse -Force ".yarn\unplugged" + Remove-Quiet -Recurse -Force ".yarn\webpack" + Remove-Quiet -Force ".yarn\build-state.yml" + Remove-Quiet -Force ".yarn\install-state.gz" + Remove-Quiet -Force ".yarn\install-target" + Remove-Quiet -Force ".pnp.js" + ## NPM artifacts + Get-ChildItem -Path "." -Include "node_modules" -Recurse -File:$false | Remove-Item -Recurse -Force + Remove-Quiet -Force "package-lock.json" +} + + +## Main +## -------------------------------------------------------- + +if ($Args.Length -gt 0) { + if ($Args[0] -eq "--clean") { + task-clean + exit 0 + } + + if ($Args[0] -eq "--dev") { + $Rest = $Args | Select-Object -Skip 1 + task-install + task-dev-server @Rest + exit 0 + } + + if ($Args[0] -eq "--lint") { + $Rest = $Args | Select-Object -Skip 1 + task-install + task-lint @Rest + exit 0 + } + + if ($Args[0] -eq "--lint-harder") { + $Rest = $Args | Select-Object -Skip 1 + task-install + task-lint -c ".eslintrc-harder.yml" @Rest + exit 0 + } + + if ($Args[0] -eq "--fix") { + $Rest = $Args | Select-Object -Skip 1 + task-install + task-lint --fix @Rest + exit 0 + } + + if ($Args[0] -eq "--test") { + $Rest = $Args | Select-Object -Skip 1 + task-install + task-test @Rest + exit 0 + } + + ## Analyze the bundle + if ($Args[0] -eq "--analyze") { + task-install + task-webpack --mode=production --analyze + exit 0 + } +} + +## Make a production webpack build +if ($Args.Length -eq 0) { + task-install + task-lint + task-webpack --mode=production + exit 0 +} + +## Run webpack with custom flags +task-install +task-webpack @Args diff --git a/tgui/docs/component-reference.md b/tgui/docs/component-reference.md index 4e56377ddcfc9..59589c7f8bc1e 100644 --- a/tgui/docs/component-reference.md +++ b/tgui/docs/component-reference.md @@ -41,6 +41,7 @@ Make sure to add new items to this list if you document new components. - [`ProgressBar`](#progressbar) - [`Section`](#section) - [`Slider`](#slider) + - ['Stack'](#stack) - [`Table`](#table) - [`Table.Row`](#tablerow) - [`Table.Cell`](#tablecell) @@ -217,11 +218,7 @@ Buttons allow users to take actions, and make choices, with a single click. - `selected: boolean` - Activates the button (gives it a green color). - `tooltip: string` - A fancy, boxy tooltip, which appears when hovering over the button. -- `tooltipPosition: string` - Position of the tooltip. - - `top` - Show tooltip above the button. - - `bottom` (default) - Show tooltip below the button. - - `left` - Show tooltip on the left of the button. - - `right` - Show tooltip on the right of the button. +- `tooltipPosition?: string` - Position of the tooltip. See [`Popper`](#Popper) for valid options. - `ellipsis: boolean` - If button width is constrained, button text will be truncated with an ellipsis. Be careful however, because this prop breaks the baseline alignment. @@ -359,12 +356,16 @@ and displays selected entry. **Props:** - See inherited props: [Box](#box) +- See inherited props: [Icon](#icon) - `options: string[]` - An array of strings which will be displayed in the dropdown when open - `selected: string` - Currently selected entry - `width: number` - Width of dropdown button and resulting menu -- `over: boolean` - dropdown renders over instead of below -- `color: string` - color of dropdown button +- `over: boolean` - Dropdown renders over instead of below +- `color: string` - Color of dropdown button +- `nochevron: boolean` - Whether or not the arrow on the right hand side of the dropdown button is visible +- `noscroll: boolean` - Whether or not the dropdown menu should have a scroll bar +- `displayText: string` - Text to always display in place of the selected text - `onClick: (e) => void` - Called when dropdown button is clicked - `onSelected: (value) => void` - Called when a value is picked from the list, `value` is the value that was picked @@ -384,10 +385,9 @@ to the left, and certain elements to the right: ```jsx - + Button description - + + +``` + +**Example of a high-level window layout:** + +Stacks can be used for high level window layout. +Make sure to use the `fill` property. + +```jsx + + + + +

    + Sidebar +
    + + + + +
    + Main content +
    +
    + +
    + Bottom pane +
    +
    +
    +
    + + + +``` + +**Props:** + +- See inherited props: [Flex](#flex) +- `fill: boolean` - If set, stack will fill all available height. +- `vertical: boolean` - If set, stack will work in vertical mode. + +### `Stack.Item` + +**Props:** + +- See inherited props: [Flex.Item](#flexitem) + ### `Table` A straight forward mapping to a standard html table, which is slightly @@ -951,17 +1030,16 @@ it is recommended to use that prop instead. Usage: ```jsx - - Sample text. - - + + + Sample text. + + ``` **Props:** -- `position: string` - Tooltip position. +- `position?: string` - Tooltip position. See [`Popper`](#Popper) for valid options. Defaults to "auto". - `content: string` - Content of the tooltip. Must be a plain string. Fragments or other elements are **not** supported. @@ -976,9 +1054,7 @@ it in one way or another. Example: ```jsx - + Hello, world! @@ -992,7 +1068,9 @@ Example: - `theme: string` - A name of the theme. - For a list of themes, see `packages/tgui/styles/themes`. - `title: string` - Window title. -- `resizable: boolean` - Controls resizability of the window. +- `width: number` - Window width. +- `height: number` - Window height. +- `canClose: boolean` - Controls the ability to close the window. - `children: any` - Child elements, which are rendered directly inside the window. If you use a [Dimmer](#dimmer) or [Modal](#modal) in your UI, they should be put as direct childs of a Window, otherwise you should be diff --git a/tgui/docs/tutorial-and-examples.md b/tgui/docs/tutorial-and-examples.md index dea1ede59452d..3dba803c959ac 100644 --- a/tgui/docs/tutorial-and-examples.md +++ b/tgui/docs/tutorial-and-examples.md @@ -127,7 +127,7 @@ export const SampleInterface = (props, context) => { color, } = data; return ( - +
    @@ -253,7 +253,7 @@ import { Window } from '../layouts'; export const SampleInterface = (props, context) => { return ( - + @@ -330,7 +330,7 @@ export const SampleInterface = (props, context) => { color, } = data; return ( - +
    diff --git a/tgui/docs/writing-tests.md b/tgui/docs/writing-tests.md new file mode 100644 index 0000000000000..99cb39e158a9d --- /dev/null +++ b/tgui/docs/writing-tests.md @@ -0,0 +1,23 @@ +## Jest + +You can now write and run unit tests in tgui. + +It's quite simple: create a file ending in `.test.ts` or `.spec.ts` (usually with the same filename as the file you're testing), and create a test case: + +```js +test('something', () => { + expect('a').toBe('a'); +}); +``` + +To run the tests, type the following into the terminal: + +``` +bin/tgui --test +``` + +There is an example test in `packages/common/react.spec.ts`. + +You can read more about Jest here: https://jestjs.io/docs/en/getting-started + +Note, that there is still no real solution to test UIs for now, even though a lot of the support is here (jest + jsdom). That will come later. diff --git a/tgui/global.d.ts b/tgui/global.d.ts index 31fc6a10574af..7f2cc8f7282c6 100644 --- a/tgui/global.d.ts +++ b/tgui/global.d.ts @@ -1,107 +1,158 @@ -interface ByondType { - /** - * True if javascript is running in BYOND. - */ - IS_BYOND: boolean; +/** + * @file + * @copyright 2021 Aleksej Komarov + * @license MIT + */ + +declare global { + // Webpack asset modules. + // Should match extensions used in webpack config. + declare module '*.png' { + const content: string; + export default content; + } + + declare module '*.jpg' { + const content: string; + export default content; + } + + declare module '*.svg' { + const content: string; + export default content; + } + + type ByondType = { + /** + * True if javascript is running in BYOND. + */ + IS_BYOND: boolean; + + /** + * True if browser is IE8 or lower. + */ + IS_LTE_IE8: boolean; + + /** + * True if browser is IE9 or lower. + */ + IS_LTE_IE9: boolean; + + /** + * True if browser is IE10 or lower. + */ + IS_LTE_IE10: boolean; + + /** + * True if browser is IE11 or lower. + */ + IS_LTE_IE11: boolean; + + /** + * Makes a BYOND call. + * + * If path is empty, this will trigger a Topic call. + * You can reference a specific object by setting the "src" parameter. + * + * See: https://secure.byond.com/docs/ref/skinparams.html + */ + call(path: string, params: object): void; + + /** + * Makes an asynchronous BYOND call. Returns a promise. + */ + callAsync(path: string, params: object): Promise; + + /** + * Makes a Topic call. + * + * You can reference a specific object by setting the "src" parameter. + */ + topic(params: object): void; + + /** + * Runs a command or a verb. + */ + command(command: string): void; + + /** + * Retrieves all properties of the BYOND skin element. + * + * Returns a promise with a key-value object containing all properties. + */ + winget(id: string): Promise; + + /** + * Retrieves all properties of the BYOND skin element. + * + * Returns a promise with a key-value object containing all properties. + */ + winget(id: string, propName: '*'): Promise; + + /** + * Retrieves an exactly one property of the BYOND skin element, + * as defined in `propName`. + * + * Returns a promise with the value of that property. + */ + winget(id: string, propName: string): Promise; + + /** + * Retrieves multiple properties of the BYOND skin element, + * as defined in the `propNames` array. + * + * Returns a promise with a key-value object containing listed properties. + */ + winget(id: string, propNames: string[]): Promise; + + /** + * Assigns properties to BYOND skin elements. + */ + winset(props: object): void; + + /** + * Assigns properties to the BYOND skin element. + */ + winset(id: string, props: object): void; + + /** + * Sets a property on the BYOND skin element to a certain value. + */ + winset(id: string, propName: string, propValue: any): void; + + /** + * Parses BYOND JSON. + * + * Uses a special encoding to preverse Infinity and NaN. + */ + parseJson(text: string): any; + + /** + * Loads a stylesheet into the document. + */ + loadCss(url: string): void; + + /** + * Loads a script into the document. + */ + loadJs(url: string): void; + }; + + /** + * Object that provides access to Byond Skin API and is available in + * any tgui application. + */ + const Byond: ByondType; + + interface Window { + /** + * ID of the Byond window this script is running on. + * Should be used as a parameter to winget/winset. + */ + __windowId__: string; + Byond: ByondType; + } - /** - * True if browser is IE8 or lower. - */ - IS_LTE_IE8: boolean; - - /** - * True if browser is IE9 or lower. - */ - IS_LTE_IE9: boolean; - - /** - * True if browser is IE10 or lower. - */ - IS_LTE_IE10: boolean; - - /** - * True if browser is IE11 or lower. - */ - IS_LTE_IE11: boolean; - - /** - * Makes a BYOND call. - * - * If path is empty, this will trigger a Topic call. - * You can reference a specific object by setting the "src" parameter. - * - * See: https://secure.byond.com/docs/ref/skinparams.html - */ - call(path: string, params: object): void; - - /** - * Makes an asynchronous BYOND call. Returns a promise. - */ - callAsync(path: string, params: object): Promise; - - /** - * Makes a Topic call. - * - * You can reference a specific object by setting the "src" parameter. - */ - topic(params: object): void; - - /** - * Runs a command or a verb. - */ - command(command: string): void; - - /** - * Retrieves all properties of the BYOND skin element. - * - * Returns a promise with a key-value object containing all properties. - */ - winget(id: string): Promise; - - /** - * Retrieves all properties of the BYOND skin element. - * - * Returns a promise with a key-value object containing all properties. - */ - winget(id: string, propName: '*'): Promise; - - /** - * Retrieves an exactly one property of the BYOND skin element, - * as defined in `propName`. - * - * Returns a promise with the value of that property. - */ - winget(id: string, propName: string): Promise; - - /** - * Retrieves multiple properties of the BYOND skin element, - * as defined in the `propNames` array. - * - * Returns a promise with a key-value object containing listed properties. - */ - winget(id: string, propNames: string[]): Promise; - - /** - * Assigns properties to BYOND skin elements. - */ - winset(props: object): void; - - /** - * Assigns properties to the BYOND skin element. - */ - winset(id: string, props: object): void; - - /** - * Sets a property on the BYOND skin element to a certain value. - */ - winset(id: string, propName: string, propValue: any): void; - - /** - * Parses BYOND JSON - * - * Uses a special encoding to preverse Infinity and NaN. - */ - parseJson(text: string): any; } -declare const Byond: ByondType; +export {}; diff --git a/tgui/jest.config.js b/tgui/jest.config.js new file mode 100644 index 0000000000000..5802332817f14 --- /dev/null +++ b/tgui/jest.config.js @@ -0,0 +1,14 @@ +module.exports = { + roots: ['/packages'], + testMatch: [ + '/packages/**/__tests__/*.{js,ts,tsx}', + '/packages/**/*.{spec,test}.{js,ts,tsx}', + ], + testEnvironment: 'jsdom', + testRunner: require.resolve('jest-circus/runner'), + transform: { + '^.+\\.(js|cjs|ts|tsx)$': require.resolve('babel-jest'), + }, + moduleFileExtensions: ['js', 'cjs', 'ts', 'tsx', 'json'], + resetMocks: true, +}; diff --git a/tgui/package.json b/tgui/package.json index c4f08bde3697e..7871fcbbafd8f 100644 --- a/tgui/package.json +++ b/tgui/package.json @@ -1,36 +1,44 @@ { "private": true, "name": "tgui-workspace", - "version": "4.2.0", + "version": "4.3.0", "workspaces": [ "packages/*" ], "dependencies": { - "@babel/core": "^7.6.2", - "@babel/plugin-transform-jscript": "^7.2.0", - "@babel/preset-env": "^7.6.2", - "babel-eslint": "^10.0.3", - "babel-loader": "^8.0.6", - "babel-plugin-inferno": "^6.1.0", + "@babel/core": "^7.13.15", + "@babel/eslint-parser": "^7.13.14", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-transform-jscript": "^7.12.13", + "@babel/preset-env": "^7.13.15", + "@babel/preset-typescript": "^7.13.0", + "@types/jest": "^26.0.22", + "@types/jsdom": "^16.2.10", + "@types/node": "^14.14.41", + "@typescript-eslint/parser": "^4.22.0", + "babel-jest": "^26.6.3", + "babel-loader": "^8.2.2", + "babel-plugin-inferno": "^6.2.0", "babel-plugin-transform-remove-console": "^6.9.4", "common": "workspace:*", - "css-loader": "^3.2.0", - "cssnano": "^4.1.10", - "eslint": "^7.4.0", - "eslint-plugin-react": "^7.17.0", - "extract-css-chunks-webpack-plugin": "^4.6.0", - "file-loader": "^6.0.0", - "inferno": "^7.4.2", - "optimize-css-assets-webpack-plugin": "^5.0.3", - "pnp-webpack-plugin": "^1.6.4", - "sass": "^1.22.12", - "sass-loader": "^9.0.2", - "style-loader": "^1.0.0", - "terser-webpack-plugin": "^3.0.6", - "url-loader": "^4.1.0", - "webpack": "^4.40.2", - "webpack-build-notifier": "^2.0.0", - "webpack-bundle-analyzer": "^3.5.1", - "webpack-cli": "^3.3.12" + "css-loader": "^5.2.2", + "eslint": "^7.24.0", + "eslint-plugin-radar": "^0.2.1", + "eslint-plugin-react": "^7.23.2", + "file-loader": "^6.2.0", + "inferno": "^7.4.8", + "jest": "^26.6.3", + "jest-circus": "^26.6.3", + "jsdom": "^16.5.3", + "mini-css-extract-plugin": "^1.4.1", + "sass": "^1.32.8", + "sass-loader": "^11.0.1", + "style-loader": "^2.0.0", + "terser-webpack-plugin": "^5.1.1", + "typescript": "^4.2.4", + "url-loader": "^4.1.1", + "webpack": "^5.33.2", + "webpack-bundle-analyzer": "^4.4.1", + "webpack-cli": "^4.6.0" } } diff --git a/tgui/packages/common/math.js b/tgui/packages/common/math.js index c3013b5a32a77..df7e395ea796e 100644 --- a/tgui/packages/common/math.js +++ b/tgui/packages/common/math.js @@ -88,3 +88,13 @@ export const keyOfMatchingRange = (value, ranges) => { } } }; + +/** + * Get number of digits following the decimal point in a number + */ +export const numberOfDecimalDigits = value => { + if (Math.floor(value) !== value) { + return value.toString().split('.')[1].length || 0; + } + return 0; +}; diff --git a/tgui/packages/common/package.json b/tgui/packages/common/package.json index 3eeb12ca5ba0b..54d73251a65a3 100644 --- a/tgui/packages/common/package.json +++ b/tgui/packages/common/package.json @@ -1,5 +1,5 @@ { "private": true, "name": "common", - "version": "4.2.0" + "version": "4.3.0" } diff --git a/tgui/packages/common/react.js b/tgui/packages/common/react.js deleted file mode 100644 index c0b24563f14dc..0000000000000 --- a/tgui/packages/common/react.js +++ /dev/null @@ -1,73 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -/** - * Helper for conditionally adding/removing classes in React - * - * @param {any[]} classNames - * @return {string} - */ -export const classes = classNames => { - let className = ''; - for (let i = 0; i < classNames.length; i++) { - const part = classNames[i]; - if (typeof part === 'string') { - className += part + ' '; - } - } - return className; -}; - -/** - * Normalizes children prop, so that it is always an array of VDom - * elements. - */ -export const normalizeChildren = children => { - if (Array.isArray(children)) { - return children.flat().filter(value => value); - } - if (typeof children === 'object') { - return [children]; - } - return []; -}; - -/** - * Shallowly checks if two objects are different. - * Credit: https://github.com/developit/preact-compat - */ -export const shallowDiffers = (a, b) => { - let i; - for (i in a) { - if (!(i in b)) { - return true; - } - } - for (i in b) { - if (a[i] !== b[i]) { - return true; - } - } - return false; -}; - -/** - * Default inferno hooks for pure components. - */ -export const pureComponentHooks = { - onComponentShouldUpdate: (lastProps, nextProps) => { - return shallowDiffers(lastProps, nextProps); - }, -}; - -/** - * A helper to determine whether the object is renderable by React. - */ -export const canRender = value => { - return value !== undefined - && value !== null - && typeof value !== 'boolean'; -}; diff --git a/tgui/packages/common/react.spec.ts b/tgui/packages/common/react.spec.ts new file mode 100644 index 0000000000000..44102fdc97109 --- /dev/null +++ b/tgui/packages/common/react.spec.ts @@ -0,0 +1,20 @@ +/** + * @file + * @copyright 2021 Aleksej Komarov + * @license MIT + */ + +import { classes } from './react'; + +describe('classes', () => { + test('empty', () => { + expect(classes([])).toBe(''); + }); + + test('result contains inputs', () => { + const output = classes(['foo', 'bar', false, true, 0, 1, 'baz']); + expect(output).toContain('foo'); + expect(output).toContain('bar'); + expect(output).toContain('baz'); + }); +}); diff --git a/tgui/packages/common/react.ts b/tgui/packages/common/react.ts new file mode 100644 index 0000000000000..c8a08f04934b4 --- /dev/null +++ b/tgui/packages/common/react.ts @@ -0,0 +1,76 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +/** + * Helper for conditionally adding/removing classes in React + */ +export const classes = (classNames: (string | BooleanLike)[]) => { + let className = ''; + for (let i = 0; i < classNames.length; i++) { + const part = classNames[i]; + if (typeof part === 'string') { + className += part + ' '; + } + } + return className; +}; + +/** + * Normalizes children prop, so that it is always an array of VDom + * elements. + */ +export const normalizeChildren = (children: T | T[]) => { + if (Array.isArray(children)) { + return children.flat().filter(value => value) as T[]; + } + if (typeof children === 'object') { + return [children]; + } + return []; +}; + +/** + * Shallowly checks if two objects are different. + * Credit: https://github.com/developit/preact-compat + */ +export const shallowDiffers = (a: object, b: object) => { + let i; + for (i in a) { + if (!(i in b)) { + return true; + } + } + for (i in b) { + if (a[i] !== b[i]) { + return true; + } + } + return false; +}; + +/** + * Default inferno hooks for pure components. + */ +export const pureComponentHooks = { + onComponentShouldUpdate: (lastProps, nextProps) => { + return shallowDiffers(lastProps, nextProps); + }, +}; + +/** + * A helper to determine whether the object is renderable by React. + */ +export const canRender = (value: unknown) => { + return value !== undefined + && value !== null + && typeof value !== 'boolean'; +}; + +/** + * A common case in tgui, when you pass a value conditionally, these are + * the types that can fall through the condition. + */ +export type BooleanLike = number | boolean | null | undefined; diff --git a/tgui/packages/common/redux.js b/tgui/packages/common/redux.js index 5348ee3430676..ebed11f166b2e 100644 --- a/tgui/packages/common/redux.js +++ b/tgui/packages/common/redux.js @@ -108,15 +108,15 @@ export const combineReducers = reducersObj => { * returns the action type, allowing it to be used in reducer logic that * is looking for that action type. * - * @param type The action type to use for created actions. - * @param prepare (optional) a method that takes any number of arguments + * @param {string} type The action type to use for created actions. + * @param {any} prepare (optional) a method that takes any number of arguments * and returns { payload } or { payload, meta }. If this is given, the * resulting action creator will pass it's arguments to this method to * calculate payload & meta. * * @public */ -export const createAction = (type, prepare) => { +export const createAction = (type, prepare = null) => { const actionCreator = (...args) => { if (!prepare) { return { type, payload: args[0] }; diff --git a/tgui/packages/common/storage.js b/tgui/packages/common/storage.js index 33397f33a17f6..83dc6d99c1cca 100644 --- a/tgui/packages/common/storage.js +++ b/tgui/packages/common/storage.js @@ -44,19 +44,19 @@ class MemoryBackend { this.store = {}; } - async get(key) { + get(key) { return this.store[key]; } - async set(key, value) { + set(key, value) { this.store[key] = value; } - async remove(key) { + remove(key) { this.store[key] = undefined; } - async clear() { + clear() { this.store = {}; } } @@ -64,25 +64,24 @@ class MemoryBackend { class LocalStorageBackend { constructor() { this.impl = IMPL_LOCAL_STORAGE; - this.store = {}; } - async get(key) { + get(key) { const value = localStorage.getItem(key); if (typeof value === 'string') { return JSON.parse(value); } } - async set(key, value) { + set(key, value) { localStorage.setItem(key, JSON.stringify(value)); } - async remove(key) { + remove(key) { localStorage.removeItem(key); } - async clear() { + clear() { localStorage.clear(); } } @@ -150,8 +149,47 @@ class IndexedDbBackend { } } -export const storage = ( - testIndexedDb() && new IndexedDbBackend() - || testLocalStorage() && new LocalStorageBackend() - || new MemoryBackend() -); +/** + * Web Storage Proxy object, which selects the best backend available + * depending on the environment. + */ +class StorageProxy { + constructor() { + this.backendPromise = (async () => { + if (testIndexedDb()) { + try { + const backend = new IndexedDbBackend(); + await backend.dbPromise; + return backend; + } + catch {} + } + if (testLocalStorage()) { + return new LocalStorageBackend(); + } + return new MemoryBackend(); + })(); + } + + async get(key) { + const backend = await this.backendPromise; + return backend.get(key); + } + + async set(key, value) { + const backend = await this.backendPromise; + return backend.set(key, value); + } + + async remove(key) { + const backend = await this.backendPromise; + return backend.remove(key); + } + + async clear() { + const backend = await this.backendPromise; + return backend.clear(); + } +} + +export const storage = new StorageProxy(); diff --git a/tgui/packages/tgfont/.gitignore b/tgui/packages/tgfont/.gitignore new file mode 100644 index 0000000000000..9b1c8b133c966 --- /dev/null +++ b/tgui/packages/tgfont/.gitignore @@ -0,0 +1 @@ +/dist diff --git a/tgui/packages/tgfont/config.cjs b/tgui/packages/tgfont/config.cjs new file mode 100644 index 0000000000000..4f6b58f1061e5 --- /dev/null +++ b/tgui/packages/tgfont/config.cjs @@ -0,0 +1,14 @@ +/** + * @file + * @copyright 2021 AnturK https://github.com/AnturK + * @license MIT + */ + +module.exports = { + name: 'tgfont', + inputDir: './icons', + outputDir: './dist', + fontTypes: ['woff2', 'eot'], + assetTypes: ['css'], + prefix: 'tg', +}; diff --git a/tgui/packages/tgfont/icons/nanotrasen_logo.svg b/tgui/packages/tgfont/icons/nanotrasen_logo.svg new file mode 100644 index 0000000000000..d21b9f0a2a0ff --- /dev/null +++ b/tgui/packages/tgfont/icons/nanotrasen_logo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/tgui/packages/tgfont/icons/syndicate_logo.svg b/tgui/packages/tgfont/icons/syndicate_logo.svg new file mode 100644 index 0000000000000..c2863b790df39 --- /dev/null +++ b/tgui/packages/tgfont/icons/syndicate_logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/tgui/packages/tgfont/mkdist.cjs b/tgui/packages/tgfont/mkdist.cjs new file mode 100644 index 0000000000000..5c628becf9929 --- /dev/null +++ b/tgui/packages/tgfont/mkdist.cjs @@ -0,0 +1,14 @@ +/** + * @file + * @copyright 2021 AnturK https://github.com/AnturK + * @license MIT + */ + +// Change working directory to project root +process.chdir(__dirname); + +// Silently make a dist folder +try { + require('fs').mkdirSync('dist'); +} +catch (err) {} diff --git a/tgui/packages/tgfont/package.json b/tgui/packages/tgfont/package.json new file mode 100644 index 0000000000000..72308f125bd23 --- /dev/null +++ b/tgui/packages/tgfont/package.json @@ -0,0 +1,11 @@ +{ + "private": true, + "name": "tgfont", + "version": "1.0.0", + "dependencies": { + "fantasticon": "^1.1.3" + }, + "scripts": { + "build": "node mkdist.cjs && fantasticon --config config.cjs" + } +} diff --git a/tgui/packages/tgui-dev-server/dreamseeker.js b/tgui/packages/tgui-dev-server/dreamseeker.js index 3a5260ead25e1..60654219b036b 100644 --- a/tgui/packages/tgui-dev-server/dreamseeker.js +++ b/tgui/packages/tgui-dev-server/dreamseeker.js @@ -52,7 +52,7 @@ DreamSeeker.getInstancesByPids = async pids => { } if (pidsToResolve.length > 0) { try { - const command = 'netstat -ano | findstr LISTENING'; + const command = 'netstat -ano | findstr TCP | findstr 0.0.0.0:0'; const { stdout } = await promisify(exec)(command, { // Max buffer of 1MB (default is 200KB) maxBuffer: 1024 * 1024, diff --git a/tgui/packages/tgui-dev-server/index.js b/tgui/packages/tgui-dev-server/index.js index 43acd87474b88..199e93d836321 100644 --- a/tgui/packages/tgui-dev-server/index.js +++ b/tgui/packages/tgui-dev-server/index.js @@ -4,7 +4,7 @@ * @license MIT */ -import { setupWebpack, getWebpackConfig } from './webpack.js'; +import { createCompiler } from './webpack.js'; import { reloadByondCache } from './reloader.js'; const noHot = process.argv.includes('--no-hot'); @@ -12,7 +12,7 @@ const noTmp = process.argv.includes('--no-tmp'); const reloadOnce = process.argv.includes('--reload'); const setupServer = async () => { - const config = await getWebpackConfig({ + const compiler = await createCompiler({ mode: 'development', hot: !noHot, devServer: true, @@ -20,12 +20,11 @@ const setupServer = async () => { }); // Reload cache once if (reloadOnce) { - const bundleDir = config.output.path; - await reloadByondCache(bundleDir); + await reloadByondCache(compiler.bundleDir); return; } // Run a development server - await setupWebpack(config); + await compiler.watch(); }; setupServer(); diff --git a/tgui/packages/tgui-dev-server/package.json b/tgui/packages/tgui-dev-server/package.json index f1ab17a26436e..f69af69dcba43 100644 --- a/tgui/packages/tgui-dev-server/package.json +++ b/tgui/packages/tgui-dev-server/package.json @@ -1,15 +1,14 @@ { "private": true, "name": "tgui-dev-server", - "version": "4.2.0", + "version": "4.3.0", "dependencies": { - "axios": "^0.19.2", + "axios": "^0.21.1", "common": "workspace:*", "esm": "^3.2.25", - "glob": "^7.1.4", + "glob": "^7.1.6", "source-map": "^0.7.3", - "stacktrace-parser": "^0.1.7", - "webpack": "^4.40.2", - "ws": "^7.1.2" + "stacktrace-parser": "^0.1.10", + "ws": "^7.4.2" } } diff --git a/tgui/packages/tgui-dev-server/reloader.js b/tgui/packages/tgui-dev-server/reloader.js index 1271e67d2a425..8a4633d95867a 100644 --- a/tgui/packages/tgui-dev-server/reloader.js +++ b/tgui/packages/tgui-dev-server/reloader.js @@ -8,7 +8,6 @@ import { createLogger } from 'common/logging.js'; import fs from 'fs'; import os from 'os'; import { basename } from 'path'; -import { promisify } from 'util'; import { resolveGlob, resolvePath } from './util.js'; import { regQuery } from './winreg.js'; import { DreamSeeker } from './dreamseeker.js'; @@ -68,7 +67,7 @@ export const findCacheRoot = async () => { const onCacheRootFound = cacheRoot => { logger.log(`found cache at '${cacheRoot}'`); - // Plant dummy + // Plant a dummy fs.closeSync(fs.openSync(cacheRoot + '/dummy', 'w')); }; @@ -93,15 +92,22 @@ export const reloadByondCache = async bundleDir => { for (let cacheDir of cacheDirs) { // Clear garbage const garbage = await resolveGlob(cacheDir, './*.+(bundle|chunk|hot-update).*'); - for (let file of garbage) { - await promisify(fs.unlink)(file); + try { + for (let file of garbage) { + fs.unlinkSync(file); + } + // Copy assets + for (let asset of assets) { + const destination = resolvePath(cacheDir, basename(asset)); + fs.writeFileSync(destination, fs.readFileSync(asset)); + } + logger.log(`copied ${assets.length} files to '${cacheDir}'`); } // Copy assets - for (let asset of assets) { - const destination = resolvePath(cacheDir, basename(asset)); - await promisify(fs.copyFile)(asset, destination); + catch (err) { + logger.error(`failed copying to '${cacheDir}'`); + logger.error(err); } - logger.log(`copied ${assets.length} files to '${cacheDir}'`); } // Notify dreamseeker const dss = await dssPromise; diff --git a/tgui/packages/tgui-dev-server/webpack.js b/tgui/packages/tgui-dev-server/webpack.js index a3ddda7c04337..4aba3af6d57c6 100644 --- a/tgui/packages/tgui-dev-server/webpack.js +++ b/tgui/packages/tgui-dev-server/webpack.js @@ -7,58 +7,77 @@ import { createLogger } from 'common/logging.js'; import fs from 'fs'; import { createRequire } from 'module'; -import { promisify } from 'util'; -import webpack from 'webpack'; +import { dirname } from 'path'; import { loadSourceMaps, setupLink } from './link/server.js'; import { reloadByondCache } from './reloader.js'; import { resolveGlob } from './util.js'; const logger = createLogger('webpack'); -export const getWebpackConfig = async options => { - const require = createRequire(import.meta.url); - const cwd = process.cwd(); - const createConfig = await require(cwd + '/webpack.config.js'); - return createConfig({}, options); +/** + * @param {any} config + * @return {WebpackCompiler} + */ +export const createCompiler = async options => { + const compiler = new WebpackCompiler(); + await compiler.setup(options); + return compiler; }; -export const setupWebpack = async config => { - logger.log('setting up'); - const bundleDir = config.output.path; - // Setup link - const link = setupLink(); - // Instantiate the compiler - const compiler = webpack(config); - // Clear garbage before compiling - compiler.hooks.watchRun.tapPromise('tgui-dev-server', async () => { - const files = await resolveGlob(bundleDir, './*.hot-update.*'); - logger.log(`clearing garbage (${files.length} files)`); - for (let file of files) { - await promisify(fs.unlink)(file); +class WebpackCompiler { + async setup(options) { + // Create a require context that is relative to project root + // and retrieve all necessary dependencies. + const requireFromRoot = createRequire(dirname(import.meta.url) + '/../..'); + const webpack = await requireFromRoot('webpack'); + const createConfig = await requireFromRoot('./webpack.config.js'); + const config = createConfig({}, options); + // Inject the HMR plugin into the config if we're using it + if (options.hot) { + config.plugins.push(new webpack.HotModuleReplacementPlugin()); } - logger.log('compiling'); - }); - // Start reloading when it's finished - compiler.hooks.done.tap('tgui-dev-server', async stats => { - // Load source maps - await loadSourceMaps(bundleDir); - // Reload cache - await reloadByondCache(bundleDir); - // Notify all clients that update has happened - link.broadcastMessage({ - type: 'hotUpdate', + this.webpack = webpack; + this.config = config; + this.bundleDir = config.output.path; + } + + async watch() { + logger.log('setting up'); + // Setup link + const link = setupLink(); + // Instantiate the compiler + const compiler = this.webpack.webpack(this.config); + // Clear garbage before compiling + compiler.hooks.watchRun.tapPromise('tgui-dev-server', async () => { + const files = await resolveGlob(this.bundleDir, './*.hot-update.*'); + logger.log(`clearing garbage (${files.length} files)`); + for (let file of files) { + fs.unlinkSync(file); + } + logger.log('compiling'); }); - }); - // Start watching - logger.log('watching for changes'); - compiler.watch({}, (err, stats) => { - if (err) { - logger.error('compilation error', err); - return; - } - stats - .toString(config.devServer.stats) - .split('\n') - .forEach(line => logger.log(line)); - }); -}; + // Start reloading when it's finished + compiler.hooks.done.tap('tgui-dev-server', async stats => { + // Load source maps + await loadSourceMaps(this.bundleDir); + // Reload cache + await reloadByondCache(this.bundleDir); + // Notify all clients that update has happened + link.broadcastMessage({ + type: 'hotUpdate', + }); + }); + // Start watching + logger.log('watching for changes'); + compiler.watch({}, (err, stats) => { + if (err) { + logger.error('compilation error', err); + return; + } + stats + .toString(this.config.devServer.stats) + .split('\n') + .forEach(line => logger.log(line)); + }); + } +} diff --git a/tgui/packages/tgui-panel/Panel.js b/tgui/packages/tgui-panel/Panel.js index fdd7977f4e301..a49ca73d4d608 100644 --- a/tgui/packages/tgui-panel/Panel.js +++ b/tgui/packages/tgui-panel/Panel.js @@ -4,14 +4,19 @@ * @license MIT */ -import { Button, Flex, Section } from 'tgui/components'; +import { Button, Stack, Section } from 'tgui/components'; import { Pane } from 'tgui/layouts'; +import { useDispatch } from 'common/redux'; import { NowPlayingWidget, useAudio } from './audio'; +import { StatTabs, HoboStatTabs } from './stat'; import { ChatPanel, ChatTabs } from './chat'; import { useGame } from './game'; import { Notifications } from './Notifications'; import { PingIndicator } from './ping'; import { SettingsPanel, useSettings } from './settings'; +import { useLocalState } from '../tgui/backend'; +import { Box, Divider, DraggableControl } from '../tgui/components'; +import { updateSettings } from './settings/actions'; export const Panel = (props, context) => { // IE8-10: Needs special treatment due to missing Flex support @@ -32,55 +37,95 @@ export const Panel = (props, context) => { ); } } + + const [ + number, + setNumber, + ] = useLocalState(context, 'number', settings.statSize); + const dispatch = useDispatch(context); + const resizeFunction = value => { + dispatch(updateSettings({ + statSize: Math.max(Math.min(value, 90), 10), + })); + }; return ( - - -
    - - + + + + resizeFunction(value)} + updateRate={5}> + {control => ( + + + + {control.inputElement} + + + )} + + + +
    + + - - + + - - + +
    -
    + {audio.visible && ( - +
    -
    + )} {settings.visible && ( - + - + )} - +
    @@ -107,36 +152,93 @@ export const Panel = (props, context) => { )}
    -
    -
    + + ); }; const HoboPanel = (props, context) => { const settings = useSettings(context); + const audio = useAudio(context); + const game = useGame(context); + if (process.env.NODE_ENV !== 'production') { + const { useDebug, KitchenSink } = require('tgui/debug'); + const debug = useDebug(context); + if (debug.kitchenSink) { + return ( + + ); + } + } + + const [ + number, + setNumber, + ] = useLocalState(context, 'number', settings.statSize); + const dispatch = useDispatch(context); + const resizeFunction = value => { + dispatch(updateSettings({ + statSize: Math.max(Math.min(value, 90), 10), + })); + }; + return ( - - - {settings.visible && ( - - - - ) || ( - +
    + +
    + resizeFunction(value)} + updateRate={5}> + {control => ( + + + + {control.inputElement} + + )} -
    + +
    + + + {settings.visible && ( + + + + ) || ( + + )} + +
    ); }; diff --git a/tgui/packages/tgui-panel/audio/NowPlayingWidget.js b/tgui/packages/tgui-panel/audio/NowPlayingWidget.js index 654f2a6b7cfeb..e4fe04eed1673 100644 --- a/tgui/packages/tgui-panel/audio/NowPlayingWidget.js +++ b/tgui/packages/tgui-panel/audio/NowPlayingWidget.js @@ -6,7 +6,6 @@ import { toFixed } from 'common/math'; import { useDispatch, useSelector } from 'common/redux'; -import { Fragment } from 'inferno'; import { Button, Flex, Knob } from 'tgui/components'; import { useSettings } from '../settings'; import { selectAudio } from './selectors'; @@ -19,7 +18,7 @@ export const NowPlayingWidget = (props, context) => { return ( {audio.playing && ( - + <> { }}> {title || 'Unknown Track'} - + ) || ( Nothing to play. diff --git a/tgui/packages/tgui-panel/chat/ChatPageSettings.js b/tgui/packages/tgui-panel/chat/ChatPageSettings.js index cf6e882dbdf01..278fbab8f2f23 100644 --- a/tgui/packages/tgui-panel/chat/ChatPageSettings.js +++ b/tgui/packages/tgui-panel/chat/ChatPageSettings.js @@ -5,7 +5,7 @@ */ import { useDispatch, useSelector } from 'common/redux'; -import { Button, Collapsible, Divider, Flex, Input, Section } from 'tgui/components'; +import { Button, Collapsible, Divider, Stack, Input, Section } from 'tgui/components'; import { removeChatPage, toggleAcceptedType, updateChatPage } from './actions'; import { MESSAGE_TYPES } from './constants'; import { selectCurrentChatPage } from './selectors'; @@ -14,13 +14,9 @@ export const ChatPageSettings = (props, context) => { const page = useSelector(context, selectCurrentChatPage); const dispatch = useDispatch(context); return ( -
    - - Chat Tab Settings - - - - +
    + + { pageId: page.id, name: value, }))} /> - - + + - - + +
    {MESSAGE_TYPES diff --git a/tgui/packages/tgui-panel/chat/ChatPanel.js b/tgui/packages/tgui-panel/chat/ChatPanel.js index bf7eb90e6fba1..0a5deaf9febe7 100644 --- a/tgui/packages/tgui-panel/chat/ChatPanel.js +++ b/tgui/packages/tgui-panel/chat/ChatPanel.js @@ -5,7 +5,7 @@ */ import { shallowDiffers } from 'common/react'; -import { Component, createRef, Fragment } from 'inferno'; +import { Component, createRef } from 'inferno'; import { Button } from 'tgui/components'; import { chatRenderer } from './renderer'; @@ -55,7 +55,7 @@ export class ChatPanel extends Component { scrollTracking, } = this.state; return ( - + <>
    {!scrollTracking && (
    + + + ) + :null} + {stat.alert_popup + ?( + +
    + + + +
    +
    + ) + :null} + {stat.antagonist_popup + ?( + +
    + + + +
    +
    + ) + :null} + {stat.alert_br + ?( + +
    + + + +
    +
    + ) + :null} + + + ); +}; + +// ======================= +// Non-Flex Support +// ======================= + +export const HoboStatStatus = (props, context) => { + const stat = useSelector(context, selectStatPanel); + const dispatch = useDispatch(context); + let statPanelData = []; + if (stat.infomationUpdate) { + for (const [key, value] of Object.entries(stat.infomationUpdate)) { + if (key === stat.selectedTab) { + statPanelData = value; + } + } + } + return ( + + {stat.dead_popup + ?( +
    + +
    +
    +
    + +
    + Don't worry, you can still get back into the game + if your body is revived or through ghost roles. +
    +
    +
    + ) + :null} + {stat.alert_popup + ?( +
    +
    + +
    +
    + ) + :null} + {stat.antagonist_popup + ?( +
    +
    + +
    +
    + ) + :null} + {stat.alert_br + ?( +
    +
    + +
    +
    + ) + :null} + +
    + ); +}; diff --git a/tgui/packages/tgui-panel/stat/StatTabs.js b/tgui/packages/tgui-panel/stat/StatTabs.js new file mode 100644 index 0000000000000..8b6a18d89047b --- /dev/null +++ b/tgui/packages/tgui-panel/stat/StatTabs.js @@ -0,0 +1,160 @@ +import { useDispatch, useSelector } from 'common/redux'; +import { Button, Flex, Tabs, Section, Input } from 'tgui/components'; +import { Box, ScrollableBox, Fragment, Divider } from '../../tgui/components'; +import { useSettings } from '../settings'; +import { selectStatPanel } from './selectors'; +import { StatStatus, HoboStatStatus } from './StatStatus'; +import { StatText, HoboStatText } from './StatText'; +import { StatTicket } from './StatTicket'; +import { sendMessage } from 'tgui/backend'; + +// ======================= +// Flex Supported +// ======================= + +export const StatTabs = (props, context) => { + const stat = useSelector(context, selectStatPanel); + const settings = useSettings(context); + let statSection = (); + switch (stat.selectedTab) { + case 'Status': + statSection = (); + break; + case '(!) Admin PM': + statSection = (); + break; + } + return ( + + +
    + {settings.statTabMode === "Scroll" + ? + : } +
    +
    + +
    + + {statSection} + +
    +
    + {stat.selectedTab === '(!) Admin PM' && ( + + + sendMessage({ + type: 'stat/pressed', + payload: { + action_id: "ticket_message", + params: { + msg: value, + }, + }, + })} /> + + )} +
    + ); +}; + +export const StatTabScroll = (props, context) => { + const stat = useSelector(context, selectStatPanel); + const dispatch = useDispatch(context); + // Map the input data into tabs, then filter out extra_data + let statTabs = stat.statTabs; + return ( +
    + + + + {statTabs.map(tab => ( + dispatch({ + type: 'stat/setTab', + payload: tab, + })}> + {tab} + + ))} + + + +
    + ); +}; + +export const StatTabWrap = (props, context) => { + const stat = useSelector(context, selectStatPanel); + const dispatch = useDispatch(context); + // Map the input data into tabs, then filter out extra_data + let statTabs = stat.statTabs; + return ( +
    + {statTabs.map(tab => ( + + ))} +
    + ); +}; + +// ======================= +// Non-Flex Support +// ======================= + +export const HoboStatTabs = (props, context) => { + const stat = useSelector(context, selectStatPanel); + const settings = useSettings(context); + let statSection = (); + switch (stat.selectedTab) { + case 'Status': + statSection = (); + break; + case '(!) Admin PM': + statSection = (); + break; + } + return ( + + + + {statSection} + + {stat.selectedTab === '(!) Admin PM' && ( + + + sendMessage({ + type: 'stat/pressed', + payload: { + action_id: "ticket_message", + params: value, + }, + })} /> + + )} + + ); +}; diff --git a/tgui/packages/tgui-panel/stat/StatText.js b/tgui/packages/tgui-panel/stat/StatText.js new file mode 100644 index 0000000000000..6cc0b5af5dc03 --- /dev/null +++ b/tgui/packages/tgui-panel/stat/StatText.js @@ -0,0 +1,349 @@ +import { useSelector } from 'common/redux'; +import { Button, Flex, Knob, Tabs, Box, Section, Fragment } from 'tgui/components'; +import { useSettings } from '../settings'; +import { selectStatPanel } from './selectors'; +import { sendMessage } from 'tgui/backend'; +import { Divider, Grid, Table } from '../../tgui/components'; +import { STAT_TEXT, STAT_BUTTON, STAT_ATOM, STAT_DIVIDER, STAT_VERB } from './constants'; +import { sendLogEntry } from 'tgui-dev-server/link/client'; + +export const StatText = (props, context) => { + const stat = useSelector(context, selectStatPanel); + let statPanelData = stat.statInfomation; + if (!statPanelData) + { + return ( + + Passed stat panel data was null contant coderman (or coderwoman). + + ); + } + let verbs = {}; + if (stat.verbData !== null) + { + verbs = stat.verbData[stat.selectedTab] || {}; + } + return ( +
    + + {statPanelData + ? Object.keys(statPanelData).map(key => ( + !!statPanelData[key] && ( + statPanelData[key].type === STAT_TEXT && + || statPanelData[key].type === STAT_BUTTON && + || statPanelData[key].type === STAT_ATOM && + || statPanelData[key].type === STAT_DIVIDER + && + || null + ) + )) + : "No data"} + {Object.keys(verbs).map(verb => ( + + ))} + +
    + ); +}; + +/* + * FLEX COMPATIBLE +*/ + +export const StatTextText = (props, context) => { + const { + title, + text, + } = props; + return ( + + + {title}:{" "} + + {text} + + ); +}; + +export const StatTextButton = (props, context) => { + const { + title, + text, + action_id, + params = [], + } = props; + const settings = useSettings(context); + return ( + + + + ); +}; + +let janky_storage = null; // Because IE sucks +const storeAtomRef = value => { janky_storage = value; }; +const retrieveAtomRef = () => janky_storage; + +export const StatTextAtom = (props, context) => { + const { + atom_name, + atom_ref, + } = props; + + storeAtomRef(null); + + return ( + + + + ); +}; + +export const StatTextDivider = (props, context) => { + return ( + + ); +}; + +export const StatTextVerb = (props, context) => { + const { + title, + action_id, + params = [], + } = props; + return ( + + + + ); +}; + +export const HoboStatTextAtom = (props, context) => { + const { + atom_name, + atom_icon, + atom_ref, + } = props; + return ( + +

    >>0):0)?((u|i)&3|0)==0:0){p=i>>>2;d=u>>>2;f=0;while(1){s=a>>>1;c=f+s|0;l=c<<1;u=l+p|0;i=OT(o[e+(u<<2)>>2]|0,h)|0;u=OT(o[e+(u+1<<2)>>2]|0,h)|0;if(!(u>>>0>>0&i>>>0<(t-u|0)>>>0)){i=0;break e}if(r[e+(u+i)>>0]|0){i=0;break e}i=rT(n,e+u|0)|0;if(!i)break;i=(i|0)<0;if((a|0)==1){i=0;break e}else{f=i?f:c;a=i?s:a-s|0}}i=l+d|0;u=OT(o[e+(i<<2)>>2]|0,h)|0;i=OT(o[e+(i+1<<2)>>2]|0,h)|0;if(i>>>0>>0&u>>>0<(t-i|0)>>>0)i=(r[e+(i+u)>>0]|0)==0?e+i|0:0;else i=0}else i=0}while(0);return i|0}function OT(e,t){e=e|0;t=t|0;var n=0;n=fx(e|0)|0;return((t|0)==0?e:n)|0}function PT(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0,a=0,l=0,s=0;i=n+16|0;u=o[i>>2]|0;if(!u){if(!(IT(n)|0)){u=o[i>>2]|0;a=5}else i=0}else a=5;e:do{if((a|0)==5){s=n+20|0;l=o[s>>2]|0;i=l;if((u-l|0)>>>0>>0){i=_A[o[n+36>>2]&7](n,e,t)|0;break}t:do{if((r[n+75>>0]|0)>-1){l=t;while(1){if(!l){a=0;u=e;break t}u=l+-1|0;if((r[e+u>>0]|0)==10)break;else l=u}i=_A[o[n+36>>2]&7](n,e,l)|0;if(i>>>0>>0)break e;a=l;u=e+l|0;t=t-l|0;i=o[s>>2]|0}else{a=0;u=e}}while(0);ix(i|0,u|0,t|0)|0;o[s>>2]=(o[s>>2]|0)+t;i=a+t|0}}while(0);return i|0}function IT(e){e=e|0;var t=0,n=0;t=e+74|0;n=r[t>>0]|0;r[t>>0]=n+255|n;t=o[e>>2]|0;if(!(t&8)){o[e+8>>2]=0;o[e+4>>2]=0;n=o[e+44>>2]|0;o[e+28>>2]=n;o[e+20>>2]=n;o[e+16>>2]=n+(o[e+48>>2]|0);e=0}else{o[e>>2]=t|32;e=-1}return e|0}function NT(e,t){e=Y(e);t=Y(t);var n=0,r=0;n=MT(e)|0;do{if((n&2147483647)>>>0<=2139095040){r=MT(t)|0;if((r&2147483647)>>>0<=2139095040)if((r^n|0)<0){e=(n|0)<0?t:e;break}else{e=e>2]=e,o[d>>2]|0)|0}function RT(e,t){e=Y(e);t=Y(t);var n=0,r=0;n=FT(e)|0;do{if((n&2147483647)>>>0<=2139095040){r=FT(t)|0;if((r&2147483647)>>>0<=2139095040)if((r^n|0)<0){e=(n|0)<0?e:t;break}else{e=e>2]=e,o[d>>2]|0)|0}function LT(e,t){e=Y(e);t=Y(t);var n=0,r=0,i=0,u=0,a=0,l=0,c=0,f=0;u=(s[d>>2]=e,o[d>>2]|0);l=(s[d>>2]=t,o[d>>2]|0);n=u>>>23&255;a=l>>>23&255;c=u&-2147483648;i=l<<1;e:do{if((i|0)!=0?!((n|0)==255|((BT(t)|0)&2147483647)>>>0>2139095040):0){r=u<<1;if(r>>>0<=i>>>0){t=Y(e*Y(0.0));return Y((r|0)==(i|0)?t:e)}if(!n){n=u<<9;if((n|0)>-1){r=n;n=0;do{n=n+-1|0;r=r<<1}while((r|0)>-1)}else n=0;r=u<<1-n}else r=u&8388607|8388608;if(!a){u=l<<9;if((u|0)>-1){i=0;do{i=i+-1|0;u=u<<1}while((u|0)>-1)}else i=0;a=i;l=l<<1-i}else l=l&8388607|8388608;i=r-l|0;u=(i|0)>-1;t:do{if((n|0)>(a|0)){while(1){if(u)if(!i)break;else r=i;r=r<<1;n=n+-1|0;i=r-l|0;u=(i|0)>-1;if((n|0)<=(a|0))break t}t=Y(e*Y(0.0));break e}}while(0);if(u)if(!i){t=Y(e*Y(0.0));break}else r=i;if(r>>>0<8388608)do{r=r<<1;n=n+-1|0}while(r>>>0<8388608);if((n|0)>0)n=r+-8388608|n<<23;else n=r>>>(1-n|0);t=(o[d>>2]=n|c,Y(s[d>>2]))}else f=3}while(0);if((f|0)==3){t=Y(e*t);t=Y(t/t)}return Y(t)}function BT(e){e=Y(e);return(s[d>>2]=e,o[d>>2]|0)|0}function jT(e,t){e=e|0;t=t|0;return oT(o[582]|0,e,t)|0}function UT(e){e=e|0;Ye()}function zT(e){e=e|0;return}function WT(e,t){e=e|0;t=t|0;return 0}function HT(e){e=e|0;if((VT(e+4|0)|0)==-1){hA[o[(o[e>>2]|0)+8>>2]&127](e);e=1}else e=0;return e|0}function VT(e){e=e|0;var t=0;t=o[e>>2]|0;o[e>>2]=t+-1;return t+-1|0}function qT(e){e=e|0;if(HT(e)|0)GT(e);return}function GT(e){e=e|0;var t=0;t=e+8|0;if(!((o[t>>2]|0)!=0?(VT(t)|0)!=-1:0))hA[o[(o[e>>2]|0)+16>>2]&127](e);return}function $T(e){e=e|0;var t=0;t=(e|0)==0?1:e;while(1){e=qk(t)|0;if(e|0)break;e=QT()|0;if(!e){e=0;break}IA[e&0]()}return e|0}function YT(e){e=e|0;return $T(e)|0}function KT(e){e=e|0;Gk(e);return}function XT(e){e=e|0;if((r[e+11>>0]|0)<0)KT(o[e>>2]|0);return}function QT(){var e=0;e=o[2923]|0;o[2923]=e+0;return e|0}function JT(){}function ZT(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;r=t-r-(n>>>0>e>>>0|0)>>>0;return(A=r,e-n>>>0|0)|0}function ex(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;n=e+n>>>0;return(A=t+r+(n>>>0>>0|0)>>>0,n|0)|0}function tx(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0,a=0,l=0;a=e+n|0;t=t&255;if((n|0)>=67){while(e&3){r[e>>0]=t;e=e+1|0}i=a&-4|0;u=i-64|0;l=t|t<<8|t<<16|t<<24;while((e|0)<=(u|0)){o[e>>2]=l;o[e+4>>2]=l;o[e+8>>2]=l;o[e+12>>2]=l;o[e+16>>2]=l;o[e+20>>2]=l;o[e+24>>2]=l;o[e+28>>2]=l;o[e+32>>2]=l;o[e+36>>2]=l;o[e+40>>2]=l;o[e+44>>2]=l;o[e+48>>2]=l;o[e+52>>2]=l;o[e+56>>2]=l;o[e+60>>2]=l;e=e+64|0}while((e|0)<(i|0)){o[e>>2]=l;e=e+4|0}}while((e|0)<(a|0)){r[e>>0]=t;e=e+1|0}return a-n|0}function nx(e,t,n){e=e|0;t=t|0;n=n|0;if((n|0)<32){A=t<>>32-n;return e<>>n;return e>>>n|(t&(1<>>n-32|0}function ix(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0,a=0;if((n|0)>=8192)return He(e|0,t|0,n|0)|0;a=e|0;u=e+n|0;if((e&3)==(t&3)){while(e&3){if(!n)return a|0;r[e>>0]=r[t>>0]|0;e=e+1|0;t=t+1|0;n=n-1|0}n=u&-4|0;i=n-64|0;while((e|0)<=(i|0)){o[e>>2]=o[t>>2];o[e+4>>2]=o[t+4>>2];o[e+8>>2]=o[t+8>>2];o[e+12>>2]=o[t+12>>2];o[e+16>>2]=o[t+16>>2];o[e+20>>2]=o[t+20>>2];o[e+24>>2]=o[t+24>>2];o[e+28>>2]=o[t+28>>2];o[e+32>>2]=o[t+32>>2];o[e+36>>2]=o[t+36>>2];o[e+40>>2]=o[t+40>>2];o[e+44>>2]=o[t+44>>2];o[e+48>>2]=o[t+48>>2];o[e+52>>2]=o[t+52>>2];o[e+56>>2]=o[t+56>>2];o[e+60>>2]=o[t+60>>2];e=e+64|0;t=t+64|0}while((e|0)<(n|0)){o[e>>2]=o[t>>2];e=e+4|0;t=t+4|0}}else{n=u-4|0;while((e|0)<(n|0)){r[e>>0]=r[t>>0]|0;r[e+1>>0]=r[t+1>>0]|0;r[e+2>>0]=r[t+2>>0]|0;r[e+3>>0]=r[t+3>>0]|0;e=e+4|0;t=t+4|0}}while((e|0)<(u|0)){r[e>>0]=r[t>>0]|0;e=e+1|0;t=t+1|0}return a|0}function ox(e){e=e|0;var t=0;t=r[m+(e&255)>>0]|0;if((t|0)<8)return t|0;t=r[m+(e>>8&255)>>0]|0;if((t|0)<8)return t+8|0;t=r[m+(e>>16&255)>>0]|0;if((t|0)<8)return t+16|0;return(r[m+(e>>>24)>>0]|0)+24|0}function ux(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;var u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,h=0,v=0;f=e;s=t;c=s;a=n;p=r;l=p;if(!c){u=(i|0)!=0;if(!l){if(u){o[i>>2]=(f>>>0)%(a>>>0);o[i+4>>2]=0}p=0;i=(f>>>0)/(a>>>0)>>>0;return(A=p,i)|0}else{if(!u){p=0;i=0;return(A=p,i)|0}o[i>>2]=e|0;o[i+4>>2]=t&0;p=0;i=0;return(A=p,i)|0}}u=(l|0)==0;do{if(a){if(!u){u=($(l|0)|0)-($(c|0)|0)|0;if(u>>>0<=31){d=u+1|0;l=31-u|0;t=u-31>>31;a=d;e=f>>>(d>>>0)&t|c<>>(d>>>0)&t;u=0;l=f<>2]=e|0;o[i+4>>2]=s|t&0;p=0;i=0;return(A=p,i)|0}u=a-1|0;if(u&a|0){l=($(a|0)|0)+33-($(c|0)|0)|0;v=64-l|0;d=32-l|0;s=d>>31;h=l-32|0;t=h>>31;a=l;e=d-1>>31&c>>>(h>>>0)|(c<>>(l>>>0))&t;t=t&c>>>(l>>>0);u=f<>>(h>>>0))&s|f<>31;break}if(i|0){o[i>>2]=u&f;o[i+4>>2]=0}if((a|0)==1){h=s|t&0;v=e|0|0;return(A=h,v)|0}else{v=ox(a|0)|0;h=c>>>(v>>>0)|0;v=c<<32-v|f>>>(v>>>0)|0;return(A=h,v)|0}}else{if(u){if(i|0){o[i>>2]=(c>>>0)%(a>>>0);o[i+4>>2]=0}h=0;v=(c>>>0)/(a>>>0)>>>0;return(A=h,v)|0}if(!f){if(i|0){o[i>>2]=0;o[i+4>>2]=(c>>>0)%(l>>>0)}h=0;v=(c>>>0)/(l>>>0)>>>0;return(A=h,v)|0}u=l-1|0;if(!(u&l)){if(i|0){o[i>>2]=e|0;o[i+4>>2]=u&c|t&0}h=0;v=c>>>((ox(l|0)|0)>>>0);return(A=h,v)|0}u=($(l|0)|0)-($(c|0)|0)|0;if(u>>>0<=30){t=u+1|0;l=31-u|0;a=t;e=c<>>(t>>>0);t=c>>>(t>>>0);u=0;l=f<>2]=e|0;o[i+4>>2]=s|t&0;h=0;v=0;return(A=h,v)|0}}while(0);if(!a){c=l;s=0;l=0}else{d=n|0|0;f=p|r&0;c=ex(d|0,f|0,-1,-1)|0;n=A;s=l;l=0;do{r=s;s=u>>>31|s<<1;u=l|u<<1;r=e<<1|r>>>31|0;p=e>>>31|t<<1|0;ZT(c|0,n|0,r|0,p|0)|0;v=A;h=v>>31|((v|0)<0?-1:0)<<1;l=h&1;e=ZT(r|0,p|0,h&d|0,(((v|0)<0?-1:0)>>31|((v|0)<0?-1:0)<<1)&f|0)|0;t=A;a=a-1|0}while((a|0)!=0);c=s;s=0}a=0;if(i|0){o[i>>2]=e;o[i+4>>2]=t}h=(u|0)>>>31|(c|a)<<1|(a<<1|u>>>31)&0|s;v=(u<<1|0>>>31)&-2|l;return(A=h,v)|0}function ax(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;return ux(e,t,n,r,0)|0}function lx(e){e=e|0;var t=0,n=0;n=e+15&-16|0;t=o[f>>2]|0;e=t+n|0;if((n|0)>0&(e|0)<(t|0)|(e|0)<0){Z()|0;qe(12);return-1}o[f>>2]=e;if((e|0)>(J()|0)?(Q()|0)==0:0){o[f>>2]=t;qe(12);return-1}return t|0}function sx(e,t,n){e=e|0;t=t|0;n=n|0;var i=0;if((t|0)<(e|0)&(e|0)<(t+n|0)){i=e;t=t+n|0;e=e+n|0;while((n|0)>0){e=e-1|0;t=t-1|0;n=n-1|0;r[e>>0]=r[t>>0]|0}e=i}else ix(e,t,n)|0;return e|0}function cx(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=h;h=h+16|0;i=u|0;ux(e,t,n,r,i)|0;h=u;return(A=o[i+4>>2]|0,o[i>>2]|0)|0}function fx(e){e=e|0;return(e&255)<<24|(e>>8&255)<<16|(e>>16&255)<<8|e>>>24|0}function dx(e,t,n,r,i,o){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;o=o|0;cA[e&1](t|0,n|0,r|0,i|0,o|0)}function px(e,t,n){e=e|0;t=t|0;n=Y(n);fA[e&1](t|0,Y(n))}function hx(e,t,n){e=e|0;t=t|0;n=+n;dA[e&31](t|0,+n)}function vx(e,t,n,r){e=e|0;t=t|0;n=Y(n);r=Y(r);return Y(pA[e&0](t|0,Y(n),Y(r)))}function mx(e,t){e=e|0;t=t|0;hA[e&127](t|0)}function gx(e,t,n){e=e|0;t=t|0;n=n|0;vA[e&31](t|0,n|0)}function yx(e,t){e=e|0;t=t|0;return mA[e&31](t|0)|0}function _x(e,t,n,r,i){e=e|0;t=t|0;n=+n;r=+r;i=i|0;gA[e&1](t|0,+n,+r,i|0)}function bx(e,t,n,r){e=e|0;t=t|0;n=+n;r=+r;yA[e&1](t|0,+n,+r)}function wx(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;return _A[e&7](t|0,n|0,r|0)|0}function Ex(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;return+bA[e&1](t|0,n|0,r|0)}function Dx(e,t){e=e|0;t=t|0;return+wA[e&15](t|0)}function Sx(e,t,n){e=e|0;t=t|0;n=+n;return EA[e&1](t|0,+n)|0}function Cx(e,t,n){e=e|0;t=t|0;n=n|0;return DA[e&15](t|0,n|0)|0}function kx(e,t,n,r,i,o){e=e|0;t=t|0;n=n|0;r=+r;i=+i;o=o|0;SA[e&1](t|0,n|0,+r,+i,o|0)}function Tx(e,t,n,r,i,o,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;o=o|0;u=u|0;CA[e&1](t|0,n|0,r|0,i|0,o|0,u|0)}function xx(e,t,n){e=e|0;t=t|0;n=n|0;return+kA[e&7](t|0,n|0)}function Ax(e){e=e|0;return TA[e&7]()|0}function Ox(e,t,n,r,i,o){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;o=o|0;return xA[e&1](t|0,n|0,r|0,i|0,o|0)|0}function Px(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=+i;AA[e&1](t|0,n|0,r|0,+i)}function Ix(e,t,n,r,i,o,u){e=e|0;t=t|0;n=n|0;r=Y(r);i=i|0;o=Y(o);u=u|0;OA[e&1](t|0,n|0,Y(r),i|0,Y(o),u|0)}function Nx(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;PA[e&15](t|0,n|0,r|0)}function Mx(e){e=e|0;IA[e&0]()}function Rx(e,t,n,r){e=e|0;t=t|0;n=n|0;r=+r;NA[e&15](t|0,n|0,+r)}function Fx(e,t,n){e=e|0;t=+t;n=+n;return MA[e&1](+t,+n)|0}function Lx(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;RA[e&15](t|0,n|0,r|0,i|0)}function Bx(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;K(0)}function jx(e,t){e=e|0;t=Y(t);K(1)}function Ux(e,t){e=e|0;t=+t;K(2)}function zx(e,t,n){e=e|0;t=Y(t);n=Y(n);K(3);return ft}function Wx(e){e=e|0;K(4)}function Hx(e,t){e=e|0;t=t|0;K(5)}function Vx(e){e=e|0;K(6);return 0}function qx(e,t,n,r){e=e|0;t=+t;n=+n;r=r|0;K(7)}function Gx(e,t,n){e=e|0;t=+t;n=+n;K(8)}function $x(e,t,n){e=e|0;t=t|0;n=n|0;K(9);return 0}function Yx(e,t,n){e=e|0;t=t|0;n=n|0;K(10);return 0.0}function Kx(e){e=e|0;K(11);return 0.0}function Xx(e,t){e=e|0;t=+t;K(12);return 0}function Qx(e,t){e=e|0;t=t|0;K(13);return 0}function Jx(e,t,n,r,i){e=e|0;t=t|0;n=+n;r=+r;i=i|0;K(14)}function Zx(e,t,n,r,i,o){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;o=o|0;K(15)}function eA(e,t){e=e|0;t=t|0;K(16);return 0.0}function tA(){K(17);return 0}function nA(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;K(18);return 0}function rA(e,t,n,r){e=e|0;t=t|0;n=n|0;r=+r;K(19)}function iA(e,t,n,r,i,o){e=e|0;t=t|0;n=Y(n);r=r|0;i=Y(i);o=o|0;K(20)}function oA(e,t,n){e=e|0;t=t|0;n=n|0;K(21)}function uA(){K(22)}function aA(e,t,n){e=e|0;t=t|0;n=+n;K(23)}function lA(e,t){e=+e;t=+t;K(24);return 0}function sA(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;K(25)}var cA=[Bx,DE];var fA=[jx,qi];var dA=[Ux,yo,_o,bo,wo,Eo,Do,So,ko,To,Ao,Oo,Po,Io,No,Mo,Ro,Fo,Lo,Ux,Ux,Ux,Ux,Ux,Ux,Ux,Ux,Ux,Ux,Ux,Ux,Ux];var pA=[zx];var hA=[Wx,zT,hl,vl,ml,Kd,Xd,Qd,yb,_b,bb,oE,uE,aE,uk,ak,lk,bt,Xi,to,Co,xo,ju,Uu,Ka,Sl,Wl,ps,Ns,rc,kc,qc,df,Mf,Zf,yd,Ld,gp,Fp,th,bh,jh,iv,kv,Vv,am,xm,Wi,cg,Ag,Qg,yy,Fy,o_,g_,b_,U_,H_,ab,Db,kb,Gb,pw,Cl,OD,pS,PS,KS,bC,BC,XC,ZC,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx];var vA=[Hx,no,ro,uo,ao,lo,so,co,fo,vo,mo,go,eu,ru,iu,ou,uu,au,lu,pu,gu,Ku,Ov,$v,Ey,ND,ww,eS,Hx,Hx,Hx,Hx];var mA=[Vx,Yk,Ki,zo,qo,Go,$o,Yo,Ko,Xo,Jo,Zo,hu,vu,zu,Pm,Uy,Kb,BD,UD,Vx,Vx,Vx,Vx,Vx,Vx,Vx,Vx,Vx,Vx,Vx,Vx];var gA=[qx,Wu];var yA=[Gx,cb];var _A=[$x,Kk,Xk,nT,ac,wp,hg,ZS];var bA=[Yx,rd];var wA=[Kx,tu,nu,su,Hu,Vu,qu,Gu,$u,Yu,Kx,Kx,Kx,Kx,Kx,Kx];var EA=[Xx,p_];var DA=[Qx,WT,mu,tl,gs,Oc,Kc,zd,Up,fm,Gi,RS,Qx,Qx,Qx,Qx];var SA=[Jx,Gl];var CA=[Zx,SC];var kA=[eA,cu,Xu,Qu,Ju,Ed,eA,eA];var TA=[tA,Zu,$i,Ui,C_,$_,Pb,rk];var xA=[nA,Fr];var AA=[rA,Sh];var OA=[iA,_u];var PA=[oA,Wo,Qo,fu,du,Ls,mf,Hh,lv,Vi,JE,gS,WC,oA,oA,oA];var IA=[uA];var NA=[aA,io,oo,po,ho,Bo,jo,Uo,oh,Ng,l_,aA,aA,aA,aA,aA];var MA=[lA,vb];var RA=[sA,Bf,jm,ty,Ky,P_,Z_,Bb,yw,qD,hk,sA,sA,sA,sA,sA];return{_llvm_bswap_i32:fx,dynCall_idd:Fx,dynCall_i:Ax,_i64Subtract:ZT,___udivdi3:ax,dynCall_vif:px,setThrew:mt,dynCall_viii:Nx,_bitshift64Lshr:rx,_bitshift64Shl:nx,dynCall_vi:mx,dynCall_viiddi:kx,dynCall_diii:Ex,dynCall_iii:Cx,_memset:tx,_sbrk:lx,_memcpy:ix,__GLOBAL__sub_I_Yoga_cpp:ji,dynCall_vii:gx,___uremdi3:cx,dynCall_vid:hx,stackAlloc:dt,_nbind_init:Ak,getTempRet0:yt,dynCall_di:Dx,dynCall_iid:Sx,setTempRet0:gt,_i64Add:ex,dynCall_fiff:vx,dynCall_iiii:wx,_emscripten_get_global_libc:$k,dynCall_viid:Rx,dynCall_viiid:Px,dynCall_viififi:Ix,dynCall_ii:yx,__GLOBAL__sub_I_Binding_cc:wD,dynCall_viiii:Lx,dynCall_iiiiii:Ox,stackSave:pt,dynCall_viiiii:dx,__GLOBAL__sub_I_nbind_cc:ea,dynCall_vidd:bx,_free:Gk,runPostSets:JT,dynCall_viiiiii:Tx,establishStackSpace:vt,_memmove:sx,stackRestore:ht,_malloc:qk,__GLOBAL__sub_I_common_cc:iw,dynCall_viddi:_x,dynCall_dii:xx,dynCall_v:Mx}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer),_llvm_bswap_i32=Module._llvm_bswap_i32=asm._llvm_bswap_i32,getTempRet0=Module.getTempRet0=asm.getTempRet0,___udivdi3=Module.___udivdi3=asm.___udivdi3,setThrew=Module.setThrew=asm.setThrew,_bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,_memset=Module._memset=asm._memset,_sbrk=Module._sbrk=asm._sbrk,_memcpy=Module._memcpy=asm._memcpy,stackAlloc=Module.stackAlloc=asm.stackAlloc,___uremdi3=Module.___uremdi3=asm.___uremdi3,_nbind_init=Module._nbind_init=asm._nbind_init,_i64Subtract=Module._i64Subtract=asm._i64Subtract,setTempRet0=Module.setTempRet0=asm.setTempRet0,_i64Add=Module._i64Add=asm._i64Add,_emscripten_get_global_libc=Module._emscripten_get_global_libc=asm._emscripten_get_global_libc,__GLOBAL__sub_I_Yoga_cpp=Module.__GLOBAL__sub_I_Yoga_cpp=asm.__GLOBAL__sub_I_Yoga_cpp,__GLOBAL__sub_I_Binding_cc=Module.__GLOBAL__sub_I_Binding_cc=asm.__GLOBAL__sub_I_Binding_cc,stackSave=Module.stackSave=asm.stackSave,__GLOBAL__sub_I_nbind_cc=Module.__GLOBAL__sub_I_nbind_cc=asm.__GLOBAL__sub_I_nbind_cc,_free=Module._free=asm._free,runPostSets=Module.runPostSets=asm.runPostSets,establishStackSpace=Module.establishStackSpace=asm.establishStackSpace,_memmove=Module._memmove=asm._memmove,stackRestore=Module.stackRestore=asm.stackRestore,_malloc=Module._malloc=asm._malloc,__GLOBAL__sub_I_common_cc=Module.__GLOBAL__sub_I_common_cc=asm.__GLOBAL__sub_I_common_cc,dynCall_viiiii=Module.dynCall_viiiii=asm.dynCall_viiiii,dynCall_vif=Module.dynCall_vif=asm.dynCall_vif,dynCall_vid=Module.dynCall_vid=asm.dynCall_vid,dynCall_fiff=Module.dynCall_fiff=asm.dynCall_fiff,dynCall_vi=Module.dynCall_vi=asm.dynCall_vi,dynCall_vii=Module.dynCall_vii=asm.dynCall_vii,dynCall_ii=Module.dynCall_ii=asm.dynCall_ii,dynCall_viddi=Module.dynCall_viddi=asm.dynCall_viddi,dynCall_vidd=Module.dynCall_vidd=asm.dynCall_vidd,dynCall_iiii=Module.dynCall_iiii=asm.dynCall_iiii,dynCall_diii=Module.dynCall_diii=asm.dynCall_diii,dynCall_di=Module.dynCall_di=asm.dynCall_di,dynCall_iid=Module.dynCall_iid=asm.dynCall_iid,dynCall_iii=Module.dynCall_iii=asm.dynCall_iii,dynCall_viiddi=Module.dynCall_viiddi=asm.dynCall_viiddi,dynCall_viiiiii=Module.dynCall_viiiiii=asm.dynCall_viiiiii,dynCall_dii=Module.dynCall_dii=asm.dynCall_dii,dynCall_i=Module.dynCall_i=asm.dynCall_i,dynCall_iiiiii=Module.dynCall_iiiiii=asm.dynCall_iiiiii,dynCall_viiid=Module.dynCall_viiid=asm.dynCall_viiid,dynCall_viififi=Module.dynCall_viififi=asm.dynCall_viififi,dynCall_viii=Module.dynCall_viii=asm.dynCall_viii,dynCall_v=Module.dynCall_v=asm.dynCall_v,dynCall_viid=Module.dynCall_viid=asm.dynCall_viid,dynCall_idd=Module.dynCall_idd=asm.dynCall_idd,dynCall_viiii=Module.dynCall_viiii=asm.dynCall_viiii,initialStackTop;function ExitStatus(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}Runtime.stackAlloc=Module.stackAlloc,Runtime.stackSave=Module.stackSave,Runtime.stackRestore=Module.stackRestore,Runtime.establishStackSpace=Module.establishStackSpace,Runtime.setTempRet0=Module.setTempRet0,Runtime.getTempRet0=Module.getTempRet0,Module.asm=asm,ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var preloadStartTime=null,calledMain=!1;function run(e){function t(){Module.calledRun||(Module.calledRun=!0,ABORT||(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(e),postRun()))}e=e||Module.arguments,null===preloadStartTime&&(preloadStartTime=Date.now()),runDependencies>0||(preRun(),runDependencies>0||Module.calledRun||(Module.setStatus?(Module.setStatus("Running..."),setTimeout((function(){setTimeout((function(){Module.setStatus("")}),1),t()}),1)):t()))}function exit(e,t){t&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=e,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(e)),ENVIRONMENT_IS_NODE&&process.exit(e),Module.quit(e,new ExitStatus(e)))}dependenciesFulfilled=function e(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=e)},Module.callMain=Module.callMain=function(e){e=e||[],ensureInitRuntime();var t=e.length+1;function n(){for(var e=0;e<3;e++)r.push(0)}var r=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];n();for(var i=0;i0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run()},void 0===(__WEBPACK_AMD_DEFINE_RESULT__=function(){return wrapper}.apply(exports,__WEBPACK_AMD_DEFINE_ARRAY__=[]))||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)},3019:e=>{"use strict";e.exports={ALIGN_COUNT:8,ALIGN_AUTO:0,ALIGN_FLEX_START:1,ALIGN_CENTER:2,ALIGN_FLEX_END:3,ALIGN_STRETCH:4,ALIGN_BASELINE:5,ALIGN_SPACE_BETWEEN:6,ALIGN_SPACE_AROUND:7,DIMENSION_COUNT:2,DIMENSION_WIDTH:0,DIMENSION_HEIGHT:1,DIRECTION_COUNT:3,DIRECTION_INHERIT:0,DIRECTION_LTR:1,DIRECTION_RTL:2,DISPLAY_COUNT:2,DISPLAY_FLEX:0,DISPLAY_NONE:1,EDGE_COUNT:9,EDGE_LEFT:0,EDGE_TOP:1,EDGE_RIGHT:2,EDGE_BOTTOM:3,EDGE_START:4,EDGE_END:5,EDGE_HORIZONTAL:6,EDGE_VERTICAL:7,EDGE_ALL:8,EXPERIMENTAL_FEATURE_COUNT:1,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:0,FLEX_DIRECTION_COUNT:4,FLEX_DIRECTION_COLUMN:0,FLEX_DIRECTION_COLUMN_REVERSE:1,FLEX_DIRECTION_ROW:2,FLEX_DIRECTION_ROW_REVERSE:3,JUSTIFY_COUNT:6,JUSTIFY_FLEX_START:0,JUSTIFY_CENTER:1,JUSTIFY_FLEX_END:2,JUSTIFY_SPACE_BETWEEN:3,JUSTIFY_SPACE_AROUND:4,JUSTIFY_SPACE_EVENLY:5,LOG_LEVEL_COUNT:6,LOG_LEVEL_ERROR:0,LOG_LEVEL_WARN:1,LOG_LEVEL_INFO:2,LOG_LEVEL_DEBUG:3,LOG_LEVEL_VERBOSE:4,LOG_LEVEL_FATAL:5,MEASURE_MODE_COUNT:3,MEASURE_MODE_UNDEFINED:0,MEASURE_MODE_EXACTLY:1,MEASURE_MODE_AT_MOST:2,NODE_TYPE_COUNT:2,NODE_TYPE_DEFAULT:0,NODE_TYPE_TEXT:1,OVERFLOW_COUNT:3,OVERFLOW_VISIBLE:0,OVERFLOW_HIDDEN:1,OVERFLOW_SCROLL:2,POSITION_TYPE_COUNT:2,POSITION_TYPE_RELATIVE:0,POSITION_TYPE_ABSOLUTE:1,PRINT_OPTIONS_COUNT:3,PRINT_OPTIONS_LAYOUT:1,PRINT_OPTIONS_STYLE:2,PRINT_OPTIONS_CHILDREN:4,UNIT_COUNT:4,UNIT_UNDEFINED:0,UNIT_POINT:1,UNIT_PERCENT:2,UNIT_AUTO:3,WRAP_COUNT:3,WRAP_NO_WRAP:0,WRAP_WRAP:1,WRAP_WRAP_REVERSE:2}},6401:(e,t,n)=>{"use strict";var r=n(7180),i=n(3354),o=!1,u=null;if(i({},(function(e,t){if(!o){if(o=!0,e)throw e;u=t}})),!o)throw new Error("Failed to load the yoga module - it needed to be loaded synchronously, but didn't");e.exports=r(u.bind,u.lib)},7180:(e,t,n)=>{"use strict";var r=Object.assign||function(e){for(var t=1;t"}}]),e}(),s=function(){function e(t,n){u(this,e),this.width=t,this.height=n}return i(e,null,[{key:"fromJS",value:function(t){return new e(t.width,t.height)}}]),i(e,[{key:"fromJS",value:function(e){e(this.width,this.height)}},{key:"toString",value:function(){return""}}]),e}(),c=function(){function e(t,n){u(this,e),this.unit=t,this.value=n}return i(e,[{key:"fromJS",value:function(e){e(this.unit,this.value)}},{key:"toString",value:function(){switch(this.unit){case a.UNIT_POINT:return String(this.value);case a.UNIT_PERCENT:return this.value+"%";case a.UNIT_AUTO:return"auto";default:return this.value+"?"}}},{key:"valueOf",value:function(){return this.value}}]),e}();e.exports=function(e,t){function n(e,t,n){var r=e[t];e[t]=function(){for(var e=arguments.length,t=Array(e),i=0;i1?t-1:0),i=1;i1&&void 0!==arguments[1]?arguments[1]:NaN,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:NaN,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:a.DIRECTION_LTR;return e.call(this,t,n,r)})),r({Config:t.Config,Node:t.Node,Layout:e("Layout",l),Size:e("Size",s),Value:e("Value",c),getInstanceCount:function(){return t.getInstanceCount.apply(t,arguments)}},a)}},2357:e=>{"use strict";e.exports=require("assert")},6417:e=>{"use strict";e.exports=require("crypto")},8614:e=>{"use strict";e.exports=require("events")},5747:e=>{"use strict";e.exports=require("fs")},8605:e=>{"use strict";e.exports=require("http")},7211:e=>{"use strict";e.exports=require("https")},2282:e=>{"use strict";e.exports=require("module")},1631:e=>{"use strict";e.exports=require("net")},2087:e=>{"use strict";e.exports=require("os")},2413:e=>{"use strict";e.exports=require("stream")},4016:e=>{"use strict";e.exports=require("tls")},3867:e=>{"use strict";e.exports=require("tty")},8835:e=>{"use strict";e.exports=require("url")},8761:e=>{"use strict";e.exports=require("zlib")}},__webpack_module_cache__={};function __webpack_require__(e){if(__webpack_module_cache__[e])return __webpack_module_cache__[e].exports;var t=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e].call(t.exports,t,t.exports,__webpack_require__),t.loaded=!0,t.exports}return __webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var n in t)__webpack_require__.o(t,n)&&!__webpack_require__.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),__webpack_require__(7560)})(); +return plugin; +} +}; \ No newline at end of file diff --git a/tgui/.yarn/releases/yarn-2.4.1.cjs b/tgui/.yarn/releases/yarn-2.4.1.cjs new file mode 100644 index 0000000000000..65ec5dde19731 --- /dev/null +++ b/tgui/.yarn/releases/yarn-2.4.1.cjs @@ -0,0 +1,55 @@ +#!/usr/bin/env node +module.exports=(()=>{var e={25545:e=>{function t(e){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}t.keys=()=>[],t.resolve=t,t.id=25545,e.exports=t},44692:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>g});var A=r(54143);const n={optional:!0},o=[["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:n,zenObservable:n}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:n,zenObservable:n}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{"supports-color":n}}],["got@<11",{dependencies:{"@types/responselike":"^1.0.0","@types/keyv":"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{"@types/keyv":"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{"vscode-jsonrpc":"^5.0.1","vscode-languageserver-protocol":"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{"postcss-html":n,"postcss-jsx":n,"postcss-less":n,"postcss-markdown":n,"postcss-scss":n}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{"tiny-warning":"^1.0.2"}}],["ink-select-input@<4.1.0",{peerDependencies:{react:"^16.8.2"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:n}}],["reactcss@*",{peerDependencies:{react:"*"}}],["react-color@<=2.19.0",{peerDependencies:{react:"*"}}],["gatsby-plugin-i18n@*",{dependencies:{ramda:"^0.24.1"}}],["useragent@^2.0.0",{dependencies:{request:"^2.88.0",yamlparser:"0.0.x",semver:"5.5.x"}}],["@apollographql/apollo-tools@*",{peerDependencies:{graphql:"^14.2.1 || ^15.0.0"}}],["material-table@^2.0.0",{dependencies:{"@babel/runtime":"^7.11.2"}}],["@babel/parser@*",{dependencies:{"@babel/types":"^7.8.3"}}],["fork-ts-checker-webpack-plugin@*",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4"},peerDependenciesMeta:{eslint:n}}],["rc-animate@*",{peerDependencies:{react:"^15.0.0 || ^16.0.0","react-dom":"^15.0.0 || ^16.0.0"}}],["react-bootstrap-table2-paginator@*",{dependencies:{classnames:"^2.2.6"}}],["react-draggable@<=4.4.3",{peerDependencies:{react:">= 16.3.0","react-dom":">= 16.3.0"}}],["apollo-upload-client@<14",{peerDependencies:{graphql:"14 - 15"}}],["react-instantsearch-core@<=6.7.0",{peerDependencies:{algoliasearch:">= 3.1 < 5"}}],["react-instantsearch-dom@<=6.7.0",{dependencies:{"react-fast-compare":"^3.0.0"}}],["ws@<7.2.1",{peerDependencies:{bufferutil:"^4.0.1","utf-8-validate":"^5.0.2"},peerDependenciesMeta:{bufferutil:n,"utf-8-validate":n}}],["react-portal@*",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}]];let i,s,a;const c=new Map([[A.makeIdent(null,"fsevents").identHash,function(){return void 0===i&&(i=r(78761).brotliDecompressSync(Buffer.from("G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==","base64")).toString()),i}],[A.makeIdent(null,"resolve").identHash,function(){return void 0===s&&(s=r(78761).brotliDecompressSync(Buffer.from("G1QTIIzURnVBnGa0VPvr81orV8AFIqdU0sqrdcVgCdukgAZwi8a50gLk9+19Z2NcUILjmzXkzt4dzm5a6Yoys+/9qnKiaApXukOiuoyUaMcynG4X7X4vBaIE/PL30gwG6HSGJkLxb9PnLjfMr+748n7sM6C/NycK6ber/bX1reVVxta6W/31tZIhfrS+upoE/TPRHj0S/l0T59gTGdtKOp1OmMOJt9rhfucDdLJ2tgyfnO+u4YMkQAcYq/nebTcDmbXhqhgo6iQA4M3m4xya4Cos3p6klmkmQT+S4DLDZfwfMF+sUCx36KleOtaHLQfEIz0Bmncj/Ngi3lqOl4391EWEfIss6gVp3oDUGwsSZJKeOVONJWZg+Mue3KUMV3aMqYJ+7b2219D+GFDi8EV5y/Y+5J+He0oNjKAgqLsJziEsS9uIaCu3BHBKSXxNKKa2ShbfglcWoiiVT2kfGI7Gw+YJ/Sqy1H6wdFWtyVUQIa82JPwbeV25YKLzc5ZIFM6GCPSA+J9dTvJbs5LuuKnLP3f09gCu2jxqsAv6CA+ZySVaUJr2d3A70BC/uBCKr2OVrWgC3fSwb7NlfkgSEEiejrMGvhya9lMbVI6lMsFKN330A1/FOaefHQdNGLEZ3IwFF87H3xVlM0Xxsmbi/7A60oymRcIe0tH90alG6ez/yA7jwYotxuHWZdR+1HlMcddGHAV6QD/gXYPV0wnNv47I+5FGevzZFMqWSO8GU4nQ3FjsdgdJcD+c1rvudERKuLyd7bxiBpnsMDHsvPP4nXdXkld/gUNks3GAE1Otmb90bavDyiw4Mrx496Iw+jbLTgsCZGZXSZ9vM55C7KGe4HyJAKXEk0iT/Cj/PFwLJBN7pcP7ZFfYtUApGTWKkYhI9IE2zt/5ByH72wdvH+88b71zuv/FMCX3w6x5nzhY44Cg5IYv9LeKwHuHIWgPbfgrAcUxOlKkPRdQOIDF/aBuLPJAXD+TgxCNXx4jQxeR/qlBWVikFPfEI4rXMUc4kZ2w9KbPKYRvFUag0dVlVoyUP4zfidbTXAdZF88jAckl+NHjLFCNdX7EQ1PbLSOl+P+MqgwEOCi6dxgWZ7NCwJBjWKpk1LaxwKrhZ4aEC/0lMPJYe5S8xAakDcmA2kSS86GjEMTrv3VEu0S0YGZcxToMV524G4WAc4CReePePdipvs4aXRL5p+aeN96yfMGjsiTbQNxgbdRKc+keQ+NxYIEm1mBtEO29WrcbrqNbQRMR66KpGG4aG0NtmRyZ2JhUvu0paCklRlID8PT3gSiwZrqr4XZXoBBzBMrveWCuOg7iTgGDXDdbGi8XHkQf5KXDGFUxWueu5wkSa6gMWY1599g2piQjwBKIAPt4N5cOZdFBidz2feGwEAy1j1UydGxDSCCUsh314cUIIRV/dWCheceubL2gU8CibewmP7UxmN5kN4I7zfQhPxkP0NCcei8GXQpw4c3krEzW7PR2hgi/hqqqR58UJ/ZVfWxfcH5ZKMo4itkmPK0FCGxzzIRP20lK/gz28Y03sY233KvSVWUKl9rcbX6MbHjpUG8MvNlw72p6FwTejv92zgpnCxVJnIHHZhCBxNcHF5RTveRp513hUtTHHq4BIndlytZT5xoTSYfHKqKNr4o9kcGINIz6tZSKRdtbON3Ydr9cgqxHIeisMNIsvPg/IFMZuBbSqqDLeSO5dak1cGr76FtH2PC7hs0S0Oq3GsmF1Ga4YABAMGcdPAWzTk26B7cKV91I2b0V/GYvnsEQ1YGntRqi5EQqTlgZszbV/32GuZtUF49JOA/r4jAdwUOsbPo6mNoBlJPYjM5axrZaWQf33bFsLWqiyvvDOM4x0Ng802T7cuP2a3q98GWq6yiq6q3M77hcZlOUnmryctRYmI4Hb2F5XixFohkBmySCjU+M7/WQVE5YAtnlxiUJDhFN0y1tNeMWY9E0MfZi2rQ4eC72WXjsAA==","base64")).toString()),s}],[A.makeIdent(null,"typescript").identHash,function(){return void 0===a&&(a=r(78761).brotliDecompressSync(Buffer.from("W1w+GkWwcQCPbZnUKPI4CFN/7EyEjZic7gS0LuAO0yfO0XnBUqmjRfsndcrEHKBP46+kNRcXE9T69UCzOMQD2EWA28SPiEUXz6UxaKl+dNhtngmN0KaY5gpIi1/+TP/v5+ul7zo6uRXScKu4Va6wcMpgwWjlQmZyLR397/MiXMMwmQ2WvoleaS23WLFmcLXTID0zCnXDyL3LdHSWRzWaZNoLpQ9ftzCssvn5UUSQrkz2sjzf3FK1NFu+8MED3YPNhfn/v5/12R4CVF9IQuGG7fgP2feee7pDDUmqVieV+oB0zrn3vaTyUtWAVR8A1BCrGaPH2BFy2OkUfQTXowAdqflCqJlUTVednHQBLhT0zgNplLM1/LC3YUtdVskGoP/n5IyllimTGsG0NiyeBsnDvH4hH244pgDEQlJuVFqDssvZiI4GfTjk18cws931bs/fNgZQUYmiSRwdZE7xvHTIs32JGu2uwAFKZKNm70VPRJNCpGAyptX+XMo0EYIMW+yfv/zpskSSzFwETa/caJp1bP8q7M9KD+vPBeP7ltn/S/T63wuZer7nGibzgC/N86sEdD34FbrYIfv5F55+7bVf/STBcAM9rTWWnzIYiKTay4uuRz9aDz1HiI/TeSXrj01C7+4FeNlKohYUwh1qXjemQMsA7KWH4IRDSrz8UaMQ5e6niK87ZFzvWB+6cn6IpWkrDPYI+LccLeGDX/DjRmmXLSGqSbu/WWcMAapgUUR9G3oqqY9mKz+GXe1HPlxFqBRbdhzQbxghtNtlE5TL2qkf5+arA/5VdO5ZrOH+kWjf6tx/bbXyNntYEVEl+ucEeht+7F++iVCO3lpE64CAVx7+6FNBcAO3m1AB0mTOMwIUDj1x5S+ma30rDtHMWY+KOF6d3arYY4j+tx008aAsS5fNfP1+ykdDDgYoJD9pHr+K2Wh5m1MFc/Vap0k8uXi1iivbu2CuV+oLD00s3gdd7XTaHBIYzGLjy5SjHbYO6IkbTFtHzlwfqdIsdb8CjpaChourHi63UT1gaCFBIvQr/kKbKcUX4sdOFDKI8N/kaaISAVtiu356imQHboaw4apcePacaTwFAXdejxkgicEn0wRpVzhZd1W/sUByw4X7rqPMIVlhS+3o+8I9djctba2396mLfpdNnSzoN2QyZ2A9PzEPmLs+x3EUNH4EPic+KYDtCNNEYKJMwupjr9W6GNPhTs877JpSFYGxiAzFfKZINCng6GQoGbMHX3gxgznmtgDV+apTCz9MzBpe7pUioV6Ckv4bpmXPikXOg2pfxpNn+RhLxQwsU0Y0ILkRGUFsbWdIc3MPVC9Kyp+aRSH7ufRUV5irDZgCzr4oF+ZQpAwLv3hrwX+/c/cqxIsw6oUQcXFCySTK+ZACOwcZm4FwOcoRDlGTdERvi5xePFkjoBz0OrUmoCAB7eRjBm93fmb4Fi/jmDrfAFXG2ryCdGVfkJzOap1qqXsmQgAFjf3UMIyX60yCl5nrZ4RA6PYYoDKP/gabiPKtkHDEzEO2N389febkiCRZPiTlI7Z5fXzo/E+8tKZXrtDRd+fozGKAfMg8l9FbZhHMX+w/2rlggkIouL4LpXxB1PzweCqhj5rdeIremOt1ZKHAU8+547LJnpRQG02p8tMmMeGSuOvsqP6O1KVyB6SWvcw5rFKW87N42c2myjca3Vjt2LMkPrbz9FfYmJJLlI18upFczbc51+dTdxUx0cpNkFIMiBjru9+tXzGHQ+HMT7nsNVfkJjW/asI0WVmvLJzcuDluyz8h+8UGZTQXExSCw9O9kD3lZk+1eXswBd0jthuq+4hm3vQtqQIMtbejHjQCISfPOGFyjjlaEo41utZWunTOz3N1DRK7ho8np0bv4fCTIAOy9+JiaumSo8+7H0Cg4CIICjqp15L84qMQ477qLQeW5Zed2Xn+9DKSxHFYu4UQ1rnFbCIX12+1NScfCujiTVYtcppJAPj2DB27ctiNSLf1bRSbEHmzLwqM7HW7Kn9vzUf+hTRQ6iQ2y3RGUnoanyvESLRxOVNTWrcCY9dXv1/bq+GkwMXbo5PGVYnb9Q/sOq+tpVsOvJnt2nBnq4LIHT6EBYTZXoUHez41cJszqbPoyz4pJMX8nhKFI5dbWls7fpPbVaIrqhkgvkkvuK3oqTbQkKv6RXiUULEgyC6NHvFlAgL0EdVIbMQG+1byGiYRtq31I5U77Cpc7VonG7oPgiYbfuXCAZXXVrmk85BCObe1DRj3obm9xwDY69ZKCemnOlGBkB6+LbAIoGBk34KATc8ktyyoxmtdCjnJ7Uhgihw+QWZzRJwQBSY7Z0R8HeEQ/pUvl6RzCrMFI0lmjTh7pK2cvW4G6APAhAoHu8TlVeL1DJOBqW66oRjtC5VEoig3xg7ybQmx9h3fSCQaefhZbunZbf1DS/YZFSuHZlh+aMb8x5C5uUcv8YLJpUlnNB79aJPt771o4XlpExDHD04Rsfgk/SUwiL5rllcbL9XpCrHVOBZhNNfXqMlDOJjL9sbALIiYV02uk14sOY/JoPnJx8sxIIY+iFouatS7AU//Cw17qSa2uWodwFjeY1/Ouw2iv29QLUKWg77BKwnwPHPf45VFu9dPABATrZ2P/YEYy33tjHJfD6u90W/bqk3fX67VYKbktMpAGbZ6VdPuu4lUg/63irWRiCMtozcM3sCql/Vxdf/mjGFVpYgmoXp4LacW0hWoYnW4sBOVw/FbgOLMCvl4Thg9D21xyqGHeHgQ2H0YPnZTi+7u1P0Lx3nCKpyVVZtEkJs7Mpri/iRBd18aEFdTbzQF37AgVmn9PNUUNNblFpPzuTnvfRrqz9mF1OV9Eu/Ncj7DlxeIc69Q/r53Wdfn5rwffHYx/HsU9ZMIFbra7eRKVJ4zPP8v2ESdKxoFDoYPwNt++y4sU9TJCmvc61y8ecV7Bil1/BWMH2hsRJDvsPXnVtVkKwb6fg20IT9+DLzTx/y3SJrsLIlt/LONXfOiOMjG9riLVagboHG8mPzmewlQWLFvL6NciWO+hcP2lyr+gXx8c70MGCBwKmelr67I0cUzYBlnu2J90JEhPDtT0E57XgAxYO0fVdJSS/MtxQONPfnPBMNY424/sGnpB12aa/FdB3E+7XdOTvtHn61T0MwHh0GtgdgGg18//zwFDcQ9Y6rFZnuyndmycJnWnEz9D7lV2V7IjcvT6GSgxx9E4VjoowXhIEAQtDGPdhA0NcPQhQsAhJnxrsiFLmyBhdW+i5cCJ60RAFiJKq3ePwMDl3ng+8BgpoXv2c3QozfwvNiPvuC3A295+FxgK0PEiQsAIIAZW1gNaNvtNKDX9QgA8AgSmo2yl4P5wGamA6hHL+DYgRemwp8KnjGO3RzcowQrAGznF3/586f/XkYv2IN55GxgOdNm+uBCxtHal2+dmeFPCMboO4IBbRcuAGDT9F1R2GnAyGqf4N2Ji7RGACAaL8IxfVUod2J3/D1eh1/Ulq++EBXu3el1SgYAQJshkP+f67/+7Pz/Y3Rj3KKrny0TjGpV2VFcMKiaXw8G0B5S8pOcbh/N5gvu8IQvrK3tdeotAEDDjLJ4IrIxlir5hDRvTpOsEHZdquzuDth7/rlMAMBCQdNCjD9U08CcebX5TOUISzQxw6LTFgAoctVpw+KqS7RHNeZcqbRLAKBFleRw5DMVOO2/2l6HNoLCYqbXKWwBADsZbWwLYwG21l6bmDKAN60RAChFEdGYhvcCel+cBttJND32cnSl8ioA7Ga50Yxr9No07X0tHwX9N4GPbETVbzNfTZUtALA4Ntxow+AqJ9uPyopxldWNAIDGimRM4+ERcf463QkjY5fMa2K+KsaoSa9TMgAA2pUeqHGzZ4qfreJJbCUzttt3ANkM+xz0Nn4I6yvTOxeLcn9g9IQf2OXudeotAEAxy3kaN9tbDEYNT1ob0Nhq1+FdLxepmQBARO8gIuBv0vaTCeqJtxztcRrDsgsXACjTdLsgbBSetbxo7SfvejkplwDAaemzDxdf44S/VM/f1/5yFBesdeECALV4bvGiCUeeRY7WbnnX5KRsAgAWbQmbrngnXi01Kb39aXSXEqwAcJ3laonKN6Hx3plriPuM0J+oz9LYK5V4pMYFAFbMvlLWcIerqLmbq5jWCACY0PqYQkV37mmlpNS9KjFXIz4uCdxPqgTTUXqcYZu8waKpOxLI6JuC/V5ksD0JpWyHgyT1poEBU9LhF8KTrthVERadLLToCjoSr958kVOhYyzBcDVw5Ndnl0fn5/E7Uu1lV2uJv/V6oe8Tr7qIGZ/FXyhwbF0IGcm+PWuvDt43oObzo4dN3gbiB9M4AOe3H/NxCh7619L5VVqzxfL2JmJ5fXXv4zJ3IY0ErqSfJ7PtGEktqiboa5y/Q52IEn0P8mYMFxAe3t4u3ax2+SY5p5obSRj3F+6kvjC9qstmdnG7T+TjF7+r5nWaYxkFSAEDL3fLK/8bzW6MQwOFhyLVtdnHxsg+EIYpRuoyY6edsN2djKfaEzMckzlI95n3WEGyGlfHyFw4JOw9rTtLtN+bxrAGyEVDdGnVWK8YSwreubXAB1qsoatSBnTTKcv456EvBhSCO17tehk/PyuIBT4gaucnrjhnAPp7DuQisGahq4p0/CRE/HG1qLo0Q7iA0XvTHate9Dh29ogluynBd/gx5I7DbX3w4L2QsEMuP+XCF6UNYcnOuVsGRukgCilp3TSNNF4kUQURoktlSM6Dj9DSUGOUWiwwpKGyzHE//CxgDPBxPyUCGZrxW4ZlkdRgBUIWbF9mG00rsSUy1obI/qbMIZGfjC9yukfd9UhoYUpvDaHjO7hG44Udz7OeR/Zrp5E8nwR3/1mnSuXjfgHEl4mcT17VGU0cOniN9XdALACmBu18UycBEU5/pPKjLXL8Q0E6pTHlrFbyiFBtlJgNfKzYJzHay9Kc+s2DGBwIvDCqj8cn5nS8lm1cXyBfd3l18QmRuiyQWmQPMjmfJRBeP9rxQv8T6fhQUanWZstFi3aNN3DO+9TBG6bDVxnspz4XBtWiwsbVN6cwY0K9j4kJbMPLcTQMP1xKAgAb9mZcea1MX1oXNVeNS882t2HwumNLuGhFk375yWps2MeYtH3cXRYuWv21UwDEy3Jjr+sURkgo45Os3/LkY77VdRKARZNJS1UOZlJH1uwIMIM7bNKYPM9JOMaFgmZh1nSG8aZRChKaLItYBTyOWP8iMV0NWwf1Z7ZMxoZMphQGQkIO6Fp0Xe7ye5npMRFVjzaN5ETLVKiKQzHBu3ocLSODGbF6kZHa7SO+jsz7aO3+EV/zf4/VlfCSRx7ICP5hxjqU7DgTq1gktzOL777yk/gmO5RjY62fRfif39YGBi2J1YKBiTkT14Mh6Ncog6LCearFt3pYpJMTu2QXxjvdtlVY8J4HxBG2V1f2QOKHq5OFB7xo2WT34wIQ0esyQTjlkE/HgAypV1iiWWLHxW/iiB3m6+y+IS3LoAZ+mOEa2qatUK+ZFFyxJj0Wk1E2ZTr16UcSEvwn+rjUyN0k48p8Xm/0iPXaCbDSJTZuDcWySeTCid67IarLslDs7ZpwAC6hcs8eFiZe+um1sdkTCpNjdHG3N1f23j4UwxkLWmaTLbLxSTGDnktFEdfkVKrzmol49ZZRVnafOxvtjROKpRG3N1N2Cnjahr6K09GoGG8UzjazD6J3ZJS7JHKls5Wuex1VarJDBWNdiV8Jelgy9BIChq3EbTUCjo6UBRzCO7Dn86RqagkXvhYr1sMyo0wb/byZo8QspZN/ZOft1AjjBv90LL0vKNKpidcs+MzVW39s44JVOZ6yV4iPPVimkIuasd+2lBNGNXu/RACmVL64PGoiuNbUZjVaz2R1xq4zoVEy9Jiq7kyHJ+g+JVP3mkUMdaVpAIYVYKDGZ5TMAID6i4ZGFz71SWuX+pWiCQBIQDHlDsCTJXDgJvJc0rcnbiSTkib1IrmQjbqDrcdknqx7tSO6zTQqhrUCRNzMAMCQvqJI0o6D1r7B5OuXQxMAWH0DZ1N+BUBnCvSx38rs8wLvsp6KRFOoW92ZnCF68OpeuygxFQCzmsgKEa47efretdO61yaBOU2j1rDWAm0nMwDgY6Co5ZLCCmS1s9QnhyYAkBLYMeUawDobQEJWbFmWkvaP2a93BezvXbyp5e7g/7U4LIj7cYjwxOHKaQYAHIRZnnyCXXlnjs8FSLudBPNOc/MZED4dsVaP5cXApLp9EGJw2OvAmIBdscLuuemG2cHCyKyx7Bml78kupF8cDgybmXnIHz0cVVRUjK803dX5Qab7hSkmaMmHycio6VxwM4+I5V2nzLNXMi0r0EAliMp584sZIc1b8hU7xR8Z5qMzAZGlBdy/OvvIhJWYF1P9mDSjL7LsmKaBIBWXs1+1n1CDTmvK8DKnx4KmYSIVJBK3pMLgUPn/ngu4ZW+Y4jBBKYUSvZ0qe5CDUHn06sFL8eqdg92tKUkezfWR+WzUPH7wZSbPmcCWIsOwqjOiWR43yt6uFtUsq6HBLMXzruosfbKTmCCT5jiW6em5ojGzigzj0oFo9x/sEb00a1t7+t9DeBZ1x5lPQEnvWNfMCgnzM42+1LxOp6+yONAw7UUF7rycap14bp13FpBEoolDn+3wHW09u3jUYHjEQW8ac8ucd8F91GHZRkBlXxDWRJey0sKrL4+ITdBdNYMUXts+Doyeh8gjxYWJ70HIMAgthBhd4xga0pScg+PBlG+zeGSHNTv25Jqym85XIsVBOmSQ46+2Fp+Fu2vIZ8v2JVsaiGQOguhiLD2gfXqasd/I4Qd94PCE8rTg61hVOCyIR2nMAICFs6WCcJZBL15MzlX2qYKvTX+Kx7/LBACmFsuLXTzzB8wXcXfxEr7A8QJmGtEC6LF62dN8hmNO7hjesDCeHePYrMNzr6u7wVU7IRjU6S44B9TP8r4zJ0vbx4iy7VjcGgfccHKY7U31SwutCUfun0NboOw/mgDxuaG+f9W+Hrn1Kv2kNEnthUWP+6SbG1/YjQ5U2X3v+vPZ1HWvT8BhCxUICv93H0bp0SbhVbQPR9A59CMjYSnHzMYvCH/tOEEo4Ggr7Vcx+rHXmmn72aUpi52FNlpSC6TJ0Si+2H2pnh8vepfOrKdGYG0lFgkWWfPD1sl+VHSfNb7fOkWDC6vIXPFzuFvw7ZihgY/FlVuMG30lC5+d2dKZ/Zd7z+c9k10vqUNscuBoxaO1VLfeCbIvOL9+RWpHhzU7G46TgHv5C6aAiCIqK8snWuHnTH/e5Olj1ZcAniIilXcFw3rlNwLuupkBgF2AVhNWopRenOqR3d4GaFyaAIAMzJbdbxGYm40SAGwXLbNKJs8AeVHSlGpkRJePDkDheS3TB9dfK+n2FhFeyioHwEeExFBq0mP+Vuzk5B/I+G/cZ0R0Uk85AD4k5MYNlw71J4f3Jh8Pbyfi+o+IWIfEFvfj1XhGoEnPZAYAJgIxqwlPqSgygGW3NwEehyYA0GTB2az7O/ZDbpMAgEZWNKvpPcz3yNR5aW3w+hzi/7UqfUhscT8GUXtqRfEzzQwAsPwp7fGIKYqMOzY/8KcLx81i18ifpptRmr8VPT6opL9wU3grbmrhz7c9Skaj4AYhpJbH1j5Xgm14ZN0rKEvY7j75ESj9xY8aAdMJFADdy8sMjR2FL8BpN84vrWIUPvdrgpMraslLa2oK+QJETX712brJqogh0j8EtyjJzUOGHIGyn9ONBdIBkD0BkWTfWgkdwItmjaZopqn2P9rRgLXpYFr6RIEr0+4aybofbaud725r7sB7F6TqGUa1BwLjuqjw6wo69En03bIjqOVFnXP9RwgSYaoNnNrWVHfQ9Rph7tqP0pAce+xDXDruL+rHcz6ln2lhl2aY0mE0yb0Byz7yjnVtQw+pv/TcR9ZePJqQKjl3lazZAaKI9TxKhwWhzxbISAmnQzsBiJNtGE3ApmUYUzfA4KaTxK71l3dnVnW9OkwBAF+rnZnUF/dOqbMOYZRMX9tXHlYn16QjrVItvUoPkuGpvqf0YWgPXOSO0IzQod5ofO2O/gzdmk94YAlD/CqD/o1pCP2JNhhFftGwLUaBvNlL+tdJBLOhBUZCOpik6IMamqdK3AnDxBg+16WKa3WE02KzpCC3msVpuGGKnY5zNGVToAc3sZUVgevfZuhzOhfprO0AHJ0ck2kxSE2c2GKlwUhxyZGUmc7JpFh/ZktxOQ47vAAh7I4fD0MRKW6Fk1QYOGhFfVPDUZXawarezdJtWzwpZ2WiQYZfiKDvuwmupCjWqyp2R+hCRtw9DG0ww0EEXEuCUsgexlgwF/05fhIOXAA6/Int1cvu7ni0ptzkn7hi2hQ72CFrpPVG9U7XVPc8bJIVFtuFStUC0Ymw4AsLcrJiqp9gcYoDYrgLHJqRPHcrms4maIQ1Ket4RBgu17M2T0pASvSFthi87RJuDpVEkH6k5dR1ykArccYr+bmFoKY8u8rVz/dMjfe8VwRsMq/5qPLvTKso5B1mV9NptFcJkKAoJ9EiP3/sxVrsVB6MdUuoQxMwIs3Rl21sjpABsWWwbJBBLogFg/UivowbwTjhd6fo7NDhjO/dVML5RAY/PMSSuqOKxtSguJnAG7PYzbuN/CVMlWvz15VfTe5hWjGp4IwZpDQRJcKcsMok0p86BrSMgQrLGaKLgeI+o6Xjs1xw3FXuyxJtM+ZzOco2b8YwxBTw/NHPM8tVu06TiCisjAdElQ3cRxb8Trca+MyL+QbicxmYkVlZZoAtlkVzfEgfak67uNLjxaIdXQFD5ibCBfPpNVHq8Jj250wV7DKILjsePNvIR4x+TD6WWFC5nsNoXj3H7sr7fhYfh3WO8meCv95w2CaVcEXiw0VaCeWhWUWnbirbtKcqlO3nKeFnv45hIvQTRBuGFDvkn7MGDNjoQm50f+la/j5Tkaei+bBnTEzfouLBTeLwIlrIw3saHYRowtRo9P4QDl+NIumkebp5/WnSzE2+xjPAwl+rmqvkwfOkUfXcus1IjdfiLxUzADDgGtk8Yor/17hExdmvqXO5ae2oVI3FbIYrEwDA3BnrbCaLmQ/4a5BLp45+5XsSWD0A1wpoLe769NGrL+CGokfiPiDqMBDP0RVPkuU84euRruOvPSFAdbmsjljUNAWgVh378jd1xZRmqsJPRKODdwKhPiDBBatW7DAMEUoCRQ+HAEqSWPj9XN+/ijxXTFXzt+T0EW0BIN2yZZubSxwHwAddxl1j67kDpzgDjSDSdQlj7YhkxQ62PZsu2rnIbW8BkUaraxON7yZRTwDb00LdMfFa2hmtBjGWzfVm/GOC5LSE0RLHsp8enD811dvrof79paGjqn0SLX8t5TVb0gUQ6MOu2lwJfP+O6d2Vh2ULJSDp+5HB54V5H+CNN25tXvrIM3Exe1jX2WMCJrldyxiIItGuRwvlg1K89N+AyTkg9k0TW1QxO+2ZBH2aNKpNmxxrUvtQUn9AcLo3cNgbDru8mfxwvHPaDHr6k/EvS84yT+8fzP5FpFn75MLfj8EwbhZ8XA2o10BzmE8XWhCsO+vYNg9pGFPWbki0+dipJBpAh3FlZ13n0OzgVbBypRzreqSsdapRzjR+kT8ajyv/wxlufqwztJpldU2HbjTrhHeSBKPhjLO5fveAbAx8KJxm/dl5vaSbdVSNw8xWrmjS4dKOb0LE+bGtct751nCJR/6aieShrRLXiGlk2NTevGkUKt0Jm+XC1TSjbYqQsmK6rtHecJfAVDbEyxvTF1jFp/DAASds88fYKuhmMbWiuZnYTJOWEfXjTsIZrqGZ/fFOBg+ux2bAat12KYxskoRoUeTH6ZLThB/f0+eCqfasE1AxXaAFA20ihHk4cEJsZdaYAVHoQUlLCq4pa4mCAM2NNN5vsDgfLS0jvSP38yfaxiYoOHUmJisj9kr05cPOnh4+9rSPbNJ9Vs/BjnqB/8qr6Y+rew1G+9xsMFWSe4gJ85kz7rpMZ3RGTrM6LbCQAmf1TaWzYGIdqGpcmzyJKaElwibK/S5MK6w5JHjfTNxXohxKX0hlsQy85UphZQbeCA0s+6+nxOzKL3hCyO/j9Ra2d4RN2W0p9OF4xBfEubmu7Mi1Zd5mJ4G+ctkiV67Hv3zUB6IjPW1CW9M01FTYpeP0w42u+I2r1QZVvE2JsSf/Y1X3MHUbJXROEw7yryYQIun3d21drZ5J2ZKUQNcBPkssPg7x2jSqgpgtgtc+1BE7rfDKGKnn3I8ZMx09ZKkxYhdXorKgaZs3St6TuEx5Ejj9CBgsuHyKsWtaZt5hwMAXyYlo0kd6KcxJMyKxGxpItyH/bLPStYdIF6tC05vTSPQEJ5g54kVuqyolx5yEFa6BHUWJdBLHrQWmXZfTEqZbHbtlmeQpmu/NvVITfcb1Um5EIi0dEGJ7cOMls9vbPIamwpPF6qLiUEbvqh06xsT5bk2LQoa9aV9KiiJ2CAEC5iH271UUxo8HDcMN+47Woypfh1IKCFsxV3Bp4+pShdFt5CoVNj5hMn3stg30e5U+9e8WVeM9nsVuw19bcbjRQ1yJ++h0dtPd7ne8E86JIs3uOm8MvvYmbIprFoID8dIBKroQMIaGHclF8KscsOD468XQYSpYMAZhRyd0tBtfvxxeg8g1OFErQaPUIXEmYXnvyt/vnqNY2qkI9wxepu0m0IEVwOLLmOxipZaba2SQlSwwLeZQSGxYbsA7PxY9CpLQnwjsjWwFnJwZuL8pBT4J//q4Gjwi5Lgfp67KUnt8TfEzhRkAiPxx+nicm9h5UyhhMepDcxKbndNje4zmRc5MACBTz8gcdGHBJmeQUyV6d0vremf1AwCZBZEqQq0HtJ2cT9ugHebFcoGWW/jTAWSOTXC3OJsc5D3znTrcEEpqviR7DGEV5imxJZDucrMzQHPMLVYBsbqYvWcQ4fxbPaDhlhXtDDIS30bX0uq8tCmsuteHMM5DeCkNJADP/VujPSY+lNbfxbyZ2ew6+W3396KTckECcJEoN22p9LN+dod6CprLZHcjehyxvHSMarrVYchYxVUaMwDQwmM3Dz2Y8uc6ZNjsmM0jx5tzSkf42KEJAAxo6WLbHIC3WXpX7O9y9gMAU0C2FaUDNk0fBUSMsRbIsv9s4Jxl4AXs5N6KkJWVY7rNaf29153LRy/seL1XA4vkga/jkP5yItMgn6lmAMAKTw956J+WP+0Wx2Lflj/oDSczP9YTlNMcXHGheVk5xrF4YeU4CEl895GLY+G5BERrPEm0Gxe8uYPlguiNi9N5N37A3GXImFDHf/w4vMgTxIvgYogpSQR3zPG1p36WjntvYm3fRYd5LTWqGxOFJwq5OfZThLmbvBn5KRKMXHgXeinFfcqwxjTyU8IxUSDwRG+mxHn6shNUou2su5PoFtDT/gU/xq7htejanGN1k8K259gQj1TMAEChWuK5bR6a8Aqnqhg6+7Ttoj9hjjE7EwDYybeHZoL7W60Zbo/eTwKbZIztZey/exyzXwRLsqz9urZiHo53r14X3urKVNNuHA7h03UPlcUAQK6Ot7mPkhe7knFZWS0+lXYM/3ZXdbNq9Jp+SkSUEugfzw3rUPAGHFt+5hj+7S7MslogGEOCw+CW8c6o97Tz5uxC+RqYL7nyQHbnMpLW03FTT+3tW/1RtigWZHZ9uWJMQGbNSvZYBRlVXfYenyBcYF4R3YX8DB3T4i3/6Kw7SQvS7r96rzkOaS3ux1aiLfZewfPJSes9ovV0El6Lxo54i1VFTiU2XcwAQLfwuSufOHNx+JIVwulQc89aG9ayD7UoNAGAmiwis4uKzYg79gOiu1RuJVpbPbsgABCa27p6YEFhK7OIgVBr9mbEQEAZ4lkxEKZtv5EYiIhVsBIDkTTle2qpUjIpEKSuEiVBvLmoLeVmGIK8nVtkBLKumJ0lyGH+nSuQW2VFKSIjT8f03O2T89sl9uCvL+u9elAgSAD++7dGto5pyfCen2R3VI/Ll07qvXZQNEgAjhIlb9YhqPiIfLpoik+qk9AxQpD/7wUXL/LHhpUHrE5jBgCqzXA5oFYPpt6Yy0VWe6E+yxng7NIEAHBA2rZhAaVMOTULiJwGAUALCFtRS2CV6RsAe43xNhCy/zRA0DJQAyfG+4CszB3TdqxPx3jnd7SK4aOyknbcEMyIAHJmBgkA4IhP+HiRp34/RpwXf9p9ijQeN+9sJoJZEj8+FwZUhXYgky4YhmsuqjBb0lIbY4qSbU8ihKM9yLZIJFhcsscsD7J7vL7jD7O594DyiT+sEsxGCB3Wv1B6/VXeifOVXMtmwBY2O/F4jBs4uClZ+IRem24kbxL38eY+dODEHrfT5/17HQAgHQ8YG52fUA7J7Sy4w6f0OHaIjV4kyTzGkHipCbsY4yNGoRrseJxrHd1cxyN/jnEjRqXvGEM3+TCctjrGgVIdC67AwalQEKQXQZ4P7pSDZ+q/fNHZA2n5rPP4x7cB/cjP3HEDNKsgODUtHinnAIAx/Me1YI4p9mpAXpj0jOpfEE4bFLXNrgWzurnQPnaLBhfnGc7vlfiNLEsVgmWOD/yRf3/4690FmNn84un1rxEc2XDHH82fo6/lwf/WhP6Eyv/2kjxpYw8jcGN4A9Ty7duef514wvg/uTXr/cUvA/cf6Xblhu6DTk32Du+d4+2ek+Mjja2qtkAYByMhh94nWO/lNbjgS0REIgn/8RwxSmSs3VBt1a/hod24mkpBI0O7cX1MmZOsviPEkXbaTATTzlxYtDeeJvMlz9eQ0/YcpbuuTAyQ3cHFZd3NQKPy7k5b5fiA4TovKuYWy3i8Hjq+6H6Vf/vomBh3F0NTx46fzwD5OuUeTp2Hc24PxNPEZrj9EJ3G5XTTsZxeMx681t1EDx6vzC7re1p+IYfM4aN3+fsjFiqNdyz/S7Z3wMwOJGqb7DjsFsqVOhn/WNXp+JmMs/tlY2aGG6RZJSEB9meiAYBgyrd/cxA7eLRRyWc0r0drv9IHZDSne4YmADALkKpsAqW6hre30HlKyCKDUvOz/wAACgVSWPi5NshK7nYRyHd5cTogJ4W/TNNMXCSYRmUgMshUIz+Z3sPdi24M6komM5thYRKgypQy5sU1pDwutSCK+YxIEA/FbAmgrSs26A7Ec2mPFGSkaZh2mbwe73R+Jhb0xys1Q8MK/QjAj//WyLQwrQX+vUXqPNQ369S/kSZZWPEfAfg6lJssYTouITR7ncdIrxdR9HkSbmDMKgaSQrnnAIDUrEUZy8RZuAHGFfucJkkLgTqdnVvoYw4oOTQBAJrWZBMFE8DCNhfUZZAJLCjn/AcAemnxYv80AGL+pjTwxhQ3aW1o/UG0HFgGILBs+rkA","base64")).toString()),a}]]),g={hooks:{registerPackageExtensions:async(e,t)=>{for(const[e,r]of o)t(A.parseDescriptor(e,!0),r)},getBuiltinPatch:async(e,t)=>{var r;if(!t.startsWith("compat/"))return;const n=A.parseIdent(t.slice("compat/".length)),o=null===(r=c.get(n.identHash))||void 0===r?void 0:r();return void 0!==o?o:null},reduceDependency:async(e,t,r,n)=>void 0===c.get(e.identHash)?e:A.makeDescriptor(e,A.makeRange({protocol:"patch:",source:A.stringifyDescriptor(e),selector:`builtin`,params:null}))}}},10189:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>p});var A=r(36370),n=r(25413),o=r(54143),i=r(40822);class s extends n.BaseCommand{constructor(){super(...arguments),this.quiet=!1,this.args=[]}async execute(){const e=[];this.pkg&&e.push("--package",this.pkg),this.quiet&&e.push("--quiet");const t=o.parseIdent(this.command),r=o.makeIdent(t.scope,"create-"+t.name);return this.cli.run(["dlx",...e,o.stringifyIdent(r),...this.args])}}(0,A.gn)([i.Command.String("-p,--package",{description:"The package to run the provided command from"})],s.prototype,"pkg",void 0),(0,A.gn)([i.Command.Boolean("-q,--quiet",{description:"Only report critical errors instead of printing the full install logs"})],s.prototype,"quiet",void 0),(0,A.gn)([i.Command.String()],s.prototype,"command",void 0),(0,A.gn)([i.Command.Proxy()],s.prototype,"args",void 0),(0,A.gn)([i.Command.Path("create")],s.prototype,"execute",null);var a=r(39922),c=r(85824),g=r(63088),l=r(43896),u=r(46009);class h extends n.BaseCommand{constructor(){super(...arguments),this.quiet=!1,this.args=[]}async execute(){return a.VK.telemetry=null,await l.xfs.mktempPromise(async e=>{const t=u.y1.join(e,"dlx-"+process.pid);await l.xfs.mkdirPromise(t),await l.xfs.writeFilePromise(u.y1.join(t,"package.json"),"{}\n"),await l.xfs.writeFilePromise(u.y1.join(t,"yarn.lock"),"");const r=u.y1.join(t,".yarnrc.yml"),A=await a.VK.findProjectCwd(this.context.cwd,u.QS.lockfile),i=null!==A?u.y1.join(A,".yarnrc.yml"):null;null!==i&&l.xfs.existsSync(i)?(await l.xfs.copyFilePromise(i,r),await a.VK.updateConfiguration(t,e=>{const t={...e,enableGlobalCache:!0,enableTelemetry:!1};return Array.isArray(e.plugins)&&(t.plugins=e.plugins.map(e=>{const t="string"==typeof e?e:e.path,r=u.cS.isAbsolute(t)?t:u.cS.resolve(u.cS.fromPortablePath(A),t);return"string"==typeof e?r:{path:r,spec:e.spec}})),t})):await l.xfs.writeFilePromise(r,"enableGlobalCache: true\nenableTelemetry: false\n");const s=void 0!==this.pkg?[this.pkg]:[this.command],h=o.parseDescriptor(this.command).name,p=await this.cli.run(["add","--",...s],{cwd:t,quiet:this.quiet});if(0!==p)return p;this.quiet||this.context.stdout.write("\n");const d=await a.VK.find(t,this.context.plugins),{project:C,workspace:f}=await c.I.find(d,t);if(null===f)throw new n.WorkspaceRequiredError(C.cwd,t);return await C.restoreInstallState(),await g.executeWorkspaceAccessibleBinary(f,h,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}}h.usage=i.Command.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-react-app to create a new React app","yarn dlx create-react-app ./my-app"]]}),(0,A.gn)([i.Command.String("-p,--package",{description:"The package to run the provided command from"})],h.prototype,"pkg",void 0),(0,A.gn)([i.Command.Boolean("-q,--quiet",{description:"Only report critical errors instead of printing the full install logs"})],h.prototype,"quiet",void 0),(0,A.gn)([i.Command.String()],h.prototype,"command",void 0),(0,A.gn)([i.Command.Proxy()],h.prototype,"args",void 0),(0,A.gn)([i.Command.Path("dlx")],h.prototype,"execute",null);const p={commands:[s,h]}},34777:(e,t,r)=>{"use strict";r.r(t),r.d(t,{dedupeUtils:()=>A,default:()=>We,suggestUtils:()=>A});var A={};r.r(A),r.d(A,{Modifier:()=>o,Strategy:()=>i,Target:()=>n,applyModifier:()=>S,extractDescriptorFromPath:()=>N,extractRangeModifier:()=>v,fetchDescriptorFrom:()=>K,findProjectDescriptors:()=>k,getModifier:()=>D,getSuggestedDescriptors:()=>F});var n,o,i,s=r(39922),a=r(36370),c=r(25413),g=r(28148),l=r(62152),u=r(92659),h=r(85824),p=r(15815),d=r(54143),C=r(40822),f=r(61899),I=r(33720),E=r(46611),B=r(71643),y=r(43896),m=r(46009),w=r(53887),Q=r.n(w);function D(e,t){return e.exact?o.EXACT:e.caret?o.CARET:e.tilde?o.TILDE:t.configuration.get("defaultSemverRangePrefix")}!function(e){e.REGULAR="dependencies",e.DEVELOPMENT="devDependencies",e.PEER="peerDependencies"}(n||(n={})),function(e){e.CARET="^",e.TILDE="~",e.EXACT=""}(o||(o={})),function(e){e.KEEP="keep",e.REUSE="reuse",e.PROJECT="project",e.LATEST="latest",e.CACHE="cache"}(i||(i={}));const b=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function v(e,{project:t}){const r=e.match(b);return r?r[1]:t.configuration.get("defaultSemverRangePrefix")}function S(e,t){let{protocol:r,source:A,params:n,selector:o}=d.parseRange(e.range);return Q().valid(o)&&(o=`${t}${e.range}`),d.makeDescriptor(e,d.makeRange({protocol:r,source:A,params:n,selector:o}))}async function k(e,{project:t,target:r}){const A=new Map,o=e=>{let t=A.get(e.descriptorHash);return t||A.set(e.descriptorHash,t={descriptor:e,locators:[]}),t};for(const A of t.workspaces)if(r===n.PEER){const t=A.manifest.peerDependencies.get(e.identHash);void 0!==t&&o(t).locators.push(A.locator)}else{const t=A.manifest.dependencies.get(e.identHash),i=A.manifest.devDependencies.get(e.identHash);r===n.DEVELOPMENT?void 0!==i?o(i).locators.push(A.locator):void 0!==t&&o(t).locators.push(A.locator):void 0!==t?o(t).locators.push(A.locator):void 0!==i&&o(i).locators.push(A.locator)}return A}async function N(e,{cwd:t,workspace:r}){return await async function(e){return await y.xfs.mktempPromise(async t=>{const r=s.VK.create(t);return r.useWithSource(t,{enableMirror:!1,compressionLevel:0},t,{overwrite:!0}),await e(new g.C(t,{configuration:r,check:!1,immutable:!1}))})}(async A=>{m.y1.isAbsolute(e)||(e=m.y1.relative(r.cwd,m.y1.resolve(t,e))).match(/^\.{0,2}\//)||(e="./"+e);const{project:n}=r,o=await K(d.makeIdent(null,"archive"),e,{project:r.project,cache:A,workspace:r});if(!o)throw new Error("Assertion failed: The descriptor should have been found");const i=new I.$,s=n.configuration.makeResolver(),a=n.configuration.makeFetcher(),c={checksums:n.storedChecksums,project:n,cache:A,fetcher:a,report:i,resolver:s},g=s.bindDescriptor(o,r.anchoredLocator,c),l=d.convertDescriptorToLocator(g),u=await a.fetch(l,c),h=await E.G.find(u.prefixPath,{baseFs:u.packageFs});if(!h.name)throw new Error("Target path doesn't have a name");return d.makeDescriptor(h.name,e)})}async function F(e,{project:t,workspace:r,cache:A,target:o,modifier:s,strategies:a,maxResults:c=1/0}){if(!(c>=0))throw new Error(`Invalid maxResults (${c})`);if("unknown"!==e.range)return{suggestions:[{descriptor:e,name:"Use "+d.prettyDescriptor(t.configuration,e),reason:"(unambiguous explicit request)"}],rejections:[]};const g=null!=r&&r.manifest[o].get(e.identHash)||null,l=[],u=[],h=async e=>{try{await e()}catch(e){u.push(e)}};for(const u of a){if(l.length>=c)break;switch(u){case i.KEEP:await h(async()=>{g&&l.push({descriptor:g,name:"Keep "+d.prettyDescriptor(t.configuration,g),reason:"(no changes)"})});break;case i.REUSE:await h(async()=>{for(const{descriptor:A,locators:n}of(await k(e,{project:t,target:o})).values()){if(1===n.length&&n[0].locatorHash===r.anchoredLocator.locatorHash&&a.includes(i.KEEP))continue;let e="(originally used by "+d.prettyLocator(t.configuration,n[0]);e+=n.length>1?` and ${n.length-1} other${n.length>2?"s":""})`:")",l.push({descriptor:A,name:"Reuse "+d.prettyDescriptor(t.configuration,A),reason:e})}});break;case i.CACHE:await h(async()=>{for(const r of t.storedDescriptors.values())r.identHash===e.identHash&&l.push({descriptor:r,name:"Reuse "+d.prettyDescriptor(t.configuration,r),reason:"(already used somewhere in the lockfile)"})});break;case i.PROJECT:await h(async()=>{if(null!==r.manifest.name&&e.identHash===r.manifest.name.identHash)return;const A=t.tryWorkspaceByIdent(e);null!==A&&l.push({descriptor:A.anchoredDescriptor,name:"Attach "+d.prettyWorkspace(t.configuration,A),reason:`(local workspace at ${A.cwd})`})});break;case i.LATEST:await h(async()=>{if("unknown"!==e.range)l.push({descriptor:e,name:"Use "+d.prettyRange(t.configuration,e.range),reason:"(explicit range requested)"});else if(o===n.PEER)l.push({descriptor:d.makeDescriptor(e,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(t.configuration.get("enableNetwork")){let n=await K(e,"latest",{project:t,cache:A,workspace:r,preserveModifier:!1});n&&(n=S(n,s),l.push({descriptor:n,name:"Use "+d.prettyDescriptor(t.configuration,n),reason:"(resolved from latest)"}))}else l.push({descriptor:null,name:"Resolve from latest",reason:B.pretty(t.configuration,"(unavailable because enableNetwork is toggled off)","grey")})})}}return{suggestions:l.slice(0,c),rejections:u.slice(0,c)}}async function K(e,t,{project:r,cache:A,workspace:n,preserveModifier:o=!0}){const i=d.makeDescriptor(e,t),s=new I.$,a=r.configuration.makeFetcher(),c=r.configuration.makeResolver(),g={project:r,fetcher:a,cache:A,checksums:r.storedChecksums,report:s,skipIntegrityCheck:!0},l={...g,resolver:c,fetchOptions:g},u=c.bindDescriptor(i,n.anchoredLocator,l),h=await c.getCandidates(u,new Map,l);if(0===h.length)return null;const p=h[0];let{protocol:C,source:f,params:E,selector:B}=d.parseRange(d.convertToManifestRange(p.reference));if(C===r.configuration.get("defaultProtocol")&&(C=null),Q().valid(B)&&!1!==o){B=v("string"==typeof o?o:i.range,{project:r})+B}return d.makeDescriptor(p,d.makeRange({protocol:C,source:f,params:E,selector:B}))}class M extends c.BaseCommand{constructor(){super(...arguments),this.packages=[],this.json=!1,this.exact=!1,this.tilde=!1,this.caret=!1,this.dev=!1,this.peer=!1,this.optional=!1,this.preferDev=!1,this.interactive=null,this.cached=!1}async execute(){var e;const t=await s.VK.find(this.context.cwd,this.context.plugins),{project:r,workspace:A}=await h.I.find(t,this.context.cwd),o=await g.C.find(t);if(!A)throw new c.WorkspaceRequiredError(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});const a=null!==(e=this.interactive)&&void 0!==e?e:t.get("preferInteractive"),I=D(this,r),E=[...a?[i.REUSE]:[],i.PROJECT,...this.cached?[i.CACHE]:[],i.LATEST],B=a?1/0:1,y=await Promise.all(this.packages.map(async e=>{const t=e.match(/^\.{0,2}\//)?await N(e,{cwd:this.context.cwd,workspace:A}):d.parseDescriptor(e),i=function(e,t,{dev:r,peer:A,preferDev:o,optional:i}){const s=e.manifest[n.REGULAR].has(t.identHash),a=e.manifest[n.DEVELOPMENT].has(t.identHash),c=e.manifest[n.PEER].has(t.identHash);if((r||A)&&s)throw new C.UsageError(`Package "${d.prettyIdent(e.project.configuration,t)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!A&&c)throw new C.UsageError(`Package "${d.prettyIdent(e.project.configuration,t)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(i&&a)throw new C.UsageError(`Package "${d.prettyIdent(e.project.configuration,t)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(i&&!A&&c)throw new C.UsageError(`Package "${d.prettyIdent(e.project.configuration,t)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((r||o)&&i)throw new C.UsageError(`Package "${d.prettyIdent(e.project.configuration,t)}" cannot simultaneously be a dev dependency and an optional dependency`);return A?n.PEER:r||o?n.DEVELOPMENT:s?n.REGULAR:a?n.DEVELOPMENT:n.REGULAR}(A,t,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional});return[t,await F(t,{project:r,workspace:A,cache:o,target:i,modifier:I,strategies:E,maxResults:B}),i]})),m=await l.h.start({configuration:t,stdout:this.context.stdout,suggestInstall:!1},async e=>{for(const[A,{suggestions:n,rejections:o}]of y){if(0===n.filter(e=>null!==e.descriptor).length){const[n]=o;if(void 0===n)throw new Error("Assertion failed: Expected an error to have been set");const i=this.cli.error(n);r.configuration.get("enableNetwork")?e.reportError(u.b.CANT_SUGGEST_RESOLUTIONS,`${d.prettyDescriptor(t,A)} can't be resolved to a satisfying range:\n\n${i}`):e.reportError(u.b.CANT_SUGGEST_RESOLUTIONS,`${d.prettyDescriptor(t,A)} can't be resolved to a satisfying range (note: network resolution has been disabled):\n\n${i}`)}}});if(m.hasErrors())return m.exitCode();let w=!1;const Q=[],b=[];for(const[,{suggestions:e},t]of y){let r;const n=e.filter(e=>null!==e.descriptor),o=n[0].descriptor,i=n.every(e=>d.areDescriptorsEqual(e.descriptor,o));1===n.length||i?r=o:(w=!0,({answer:r}=await(0,f.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:e.map(({descriptor:e,name:t,reason:r})=>e?{name:t,hint:r,descriptor:e}:{name:t,hint:r,disabled:!0}),onCancel:()=>process.exit(130),result(e){return this.find(e,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout})));const s=A.manifest[t].get(r.identHash);void 0!==s&&s.descriptorHash===r.descriptorHash||(A.manifest[t].set(r.identHash,r),this.optional&&("dependencies"===t?A.manifest.ensureDependencyMeta({...r,range:"unknown"}).optional=!0:"peerDependencies"===t&&(A.manifest.ensurePeerDependencyMeta({...r,range:"unknown"}).optional=!0)),void 0===s?Q.push([A,t,r,E]):b.push([A,t,s,r]))}await t.triggerMultipleHooks(e=>e.afterWorkspaceDependencyAddition,Q),await t.triggerMultipleHooks(e=>e.afterWorkspaceDependencyReplacement,b),w&&this.context.stdout.write("\n");return(await p.Pk.start({configuration:t,json:this.json,stdout:this.context.stdout,includeLogs:!this.context.quiet},async e=>{await r.install({cache:o,report:e})})).exitCode()}}M.usage=C.Command.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/features/protocols.\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"]]}),(0,a.gn)([C.Command.Rest()],M.prototype,"packages",void 0),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],M.prototype,"json",void 0),(0,a.gn)([C.Command.Boolean("-E,--exact",{description:"Don't use any semver modifier on the resolved range"})],M.prototype,"exact",void 0),(0,a.gn)([C.Command.Boolean("-T,--tilde",{description:"Use the `~` semver modifier on the resolved range"})],M.prototype,"tilde",void 0),(0,a.gn)([C.Command.Boolean("-C,--caret",{description:"Use the `^` semver modifier on the resolved range"})],M.prototype,"caret",void 0),(0,a.gn)([C.Command.Boolean("-D,--dev",{description:"Add a package as a dev dependency"})],M.prototype,"dev",void 0),(0,a.gn)([C.Command.Boolean("-P,--peer",{description:"Add a package as a peer dependency"})],M.prototype,"peer",void 0),(0,a.gn)([C.Command.Boolean("-O,--optional",{description:"Add / upgrade a package to an optional regular / peer dependency"})],M.prototype,"optional",void 0),(0,a.gn)([C.Command.Boolean("--prefer-dev",{description:"Add / upgrade a package to a dev dependency"})],M.prototype,"preferDev",void 0),(0,a.gn)([C.Command.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"})],M.prototype,"interactive",void 0),(0,a.gn)([C.Command.Boolean("--cached",{description:"Reuse the highest version already used somewhere within the project"})],M.prototype,"cached",void 0),(0,a.gn)([C.Command.Path("add")],M.prototype,"execute",null);var R=r(63088);class x extends c.BaseCommand{constructor(){super(...arguments),this.verbose=!1,this.json=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t,locator:r}=await h.I.find(e,this.context.cwd);if(await t.restoreInstallState(),this.name){const A=(await R.getPackageAccessibleBinaries(r,{project:t})).get(this.name);if(!A)throw new C.UsageError(`Couldn't find a binary named "${this.name}" for package "${d.prettyLocator(e,r)}"`);const[,n]=A;return this.context.stdout.write(n+"\n"),0}return(await p.Pk.start({configuration:e,json:this.json,stdout:this.context.stdout},async A=>{const n=await R.getPackageAccessibleBinaries(r,{project:t}),o=Array.from(n.keys()).reduce((e,t)=>Math.max(e,t.length),0);for(const[e,[t,r]]of n)A.reportJson({name:e,source:d.stringifyIdent(t),path:r});if(this.verbose)for(const[t,[r]]of n)A.reportInfo(null,`${t.padEnd(o," ")} ${d.prettyLocator(e,r)}`);else for(const e of n.keys())A.reportInfo(null,e)})).exitCode()}}x.usage=C.Command.Usage({description:"get the path to a binary script",details:"\n When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the `-v,--verbose` flag will cause the output to contain both the binary name and the locator of the package that provides the binary.\n\n When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive.\n ",examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]}),(0,a.gn)([C.Command.String({required:!1})],x.prototype,"name",void 0),(0,a.gn)([C.Command.Boolean("-v,--verbose",{description:"Print both the binary name and the locator of the package that provides the binary"})],x.prototype,"verbose",void 0),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],x.prototype,"json",void 0),(0,a.gn)([C.Command.Path("bin")],x.prototype,"execute",null);class L extends c.BaseCommand{constructor(){super(...arguments),this.mirror=!1,this.all=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),t=await g.C.find(e);return(await p.Pk.start({configuration:e,stdout:this.context.stdout},async()=>{const e=(this.all||this.mirror)&&null!==t.mirrorCwd,r=!this.mirror;e&&await y.xfs.removePromise(t.mirrorCwd),r&&await y.xfs.removePromise(t.cwd)})).exitCode()}}L.usage=C.Command.Usage({description:"remove the shared cache files",details:"\n This command will remove all the files from the cache.\n ",examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]}),(0,a.gn)([C.Command.Boolean("--mirror",{description:"Remove the global cache files instead of the local cache files"})],L.prototype,"mirror",void 0),(0,a.gn)([C.Command.Boolean("--all",{description:"Remove both the global cache files and the local cache files of the current project"})],L.prototype,"all",void 0),(0,a.gn)([C.Command.Path("cache","clean")],L.prototype,"execute",null);var P=r(73632),O=r(44674),U=r.n(O),T=r(31669);class j extends c.BaseCommand{constructor(){super(...arguments),this.json=!1,this.unsafe=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),t=this.name.replace(/[.[].*$/,""),r=this.name.replace(/^[^.[]*/,"");if(void 0===e.settings.get(t))throw new C.UsageError(`Couldn't find a configuration settings named "${t}"`);const A=e.getSpecial(t,{hideSecrets:!this.unsafe,getNativePaths:!0}),n=P.convertMapsToIndexableObjects(A),o=r?U()(n,r):n,i=await p.Pk.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async e=>{e.reportJson(o)});if(!this.json){if("string"==typeof o)return this.context.stdout.write(o+"\n"),i.exitCode();T.inspect.styles.name="cyan",this.context.stdout.write((0,T.inspect)(o,{depth:1/0,colors:e.get("enableColors"),compact:!1})+"\n")}return i.exitCode()}}j.usage=C.Command.Usage({description:"read a configuration settings",details:"\n This command will print a configuration setting.\n\n Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the `--no-redacted` to get the untransformed value.\n ",examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration","yarn config get 'npmScopes[\"my-company\"].npmRegistryServer'"],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]}),(0,a.gn)([C.Command.String()],j.prototype,"name",void 0),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],j.prototype,"json",void 0),(0,a.gn)([C.Command.Boolean("--no-redacted",{description:"Don't redact secrets (such as tokens) from the output"})],j.prototype,"unsafe",void 0),(0,a.gn)([C.Command.Path("config","get")],j.prototype,"execute",null);var Y=r(82558),G=r.n(Y),H=r(81534),J=r.n(H);class q extends c.BaseCommand{constructor(){super(...arguments),this.json=!1,this.home=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins);if(!e.projectCwd)throw new C.UsageError("This command must be run from within a project folder");const t=this.name.replace(/[.[].*$/,""),r=this.name.replace(/^[^.[]*\.?/,"");if(void 0===e.settings.get(t))throw new C.UsageError(`Couldn't find a configuration settings named "${t}"`);const A=this.json?JSON.parse(this.value):this.value,n=this.home?e=>s.VK.updateHomeConfiguration(e):t=>s.VK.updateConfiguration(e.projectCwd,t);await n(e=>{if(r){const t=G()(e);return J()(t,this.name,A),t}return{...e,[t]:A}});const o=(await s.VK.find(this.context.cwd,this.context.plugins)).getSpecial(t,{hideSecrets:!0,getNativePaths:!0}),i=P.convertMapsToIndexableObjects(o),a=r?U()(i,r):i;return(await p.Pk.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async t=>{T.inspect.styles.name="cyan",t.reportInfo(u.b.UNNAMED,`Successfully set ${this.name} to ${(0,T.inspect)(a,{depth:1/0,colors:e.get("enableColors"),compact:!1})}`)})).exitCode()}}q.usage=C.Command.Usage({description:"change a configuration settings",details:"\n This command will set a configuration setting.\n\n When used without the `--json` flag, it can only set a simple configuration setting (a string, a number, or a boolean).\n\n When used with the `--json` flag, it can set both simple and complex configuration settings, including Arrays and Objects.\n ",examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",'yarn config set unsafeHttpWhitelist --json \'["*.example.com", "example.com"]\''],["Set a complex configuration setting (an Object) using the `--json` flag",'yarn config set packageExtensions --json \'{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }\''],["Set a nested configuration setting",'yarn config set npmScopes.company.npmRegistryServer "https://npm.example.com"'],["Set a nested configuration setting using indexed access for non-simple keys",'yarn config set \'npmRegistries["//npm.example.com"].npmAuthToken\' "ffffffff-ffff-ffff-ffff-ffffffffffff"']]}),(0,a.gn)([C.Command.String()],q.prototype,"name",void 0),(0,a.gn)([C.Command.String()],q.prototype,"value",void 0),(0,a.gn)([C.Command.Boolean("--json",{description:"Set complex configuration settings to JSON values"})],q.prototype,"json",void 0),(0,a.gn)([C.Command.Boolean("-H,--home",{description:"Update the home configuration instead of the project configuration"})],q.prototype,"home",void 0),(0,a.gn)([C.Command.Path("config","set")],q.prototype,"execute",null);class z extends c.BaseCommand{constructor(){super(...arguments),this.verbose=!1,this.why=!1,this.json=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins,{strict:!1});return(await p.Pk.start({configuration:e,json:this.json,stdout:this.context.stdout},async t=>{if(e.invalid.size>0&&!this.json){for(const[r,A]of e.invalid)t.reportError(u.b.INVALID_CONFIGURATION_KEY,`Invalid configuration key "${r}" in ${A}`);t.reportSeparator()}if(this.json){const r=P.sortMap(e.settings.keys(),e=>e);for(const A of r){const r=e.settings.get(A),n=e.getSpecial(A,{hideSecrets:!0,getNativePaths:!0}),o=e.sources.get(A);this.verbose?t.reportJson({key:A,effective:n,source:o}):t.reportJson({key:A,effective:n,source:o,...r})}}else{const r=P.sortMap(e.settings.keys(),e=>e),A=r.reduce((e,t)=>Math.max(e,t.length),0),n={breakLength:1/0,colors:e.get("enableColors"),maxArrayLength:2};if(this.why||this.verbose){const o=r.map(t=>{const r=e.settings.get(t);if(!r)throw new Error(`Assertion failed: This settings ("${t}") should have been registered`);return[t,this.why?e.sources.get(t)||"":r.description]}),i=o.reduce((e,[,t])=>Math.max(e,t.length),0);for(const[r,s]of o)t.reportInfo(null,`${r.padEnd(A," ")} ${s.padEnd(i," ")} ${(0,T.inspect)(e.getSpecial(r,{hideSecrets:!0,getNativePaths:!0}),n)}`)}else for(const o of r)t.reportInfo(null,`${o.padEnd(A," ")} ${(0,T.inspect)(e.getSpecial(o,{hideSecrets:!0,getNativePaths:!0}),n)}`)}})).exitCode()}}z.usage=C.Command.Usage({description:"display the current configuration",details:"\n This command prints the current active configuration settings.\n ",examples:[["Print the active configuration settings","$0 config"]]}),(0,a.gn)([C.Command.Boolean("-v,--verbose",{description:"Print the setting description on top of the regular key/value information"})],z.prototype,"verbose",void 0),(0,a.gn)([C.Command.Boolean("--why",{description:"Print the reason why a setting is set a particular way"})],z.prototype,"why",void 0),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],z.prototype,"json",void 0),(0,a.gn)([C.Command.Path("config")],z.prototype,"execute",null);var W,V=r(15966),X=r(35691),_=r(2401),Z=r.n(_);!function(e){e.HIGHEST="highest"}(W||(W={}));const $=new Set(Object.values(W)),ee={highest:async(e,t,{resolver:r,fetcher:A,resolveOptions:n,fetchOptions:o})=>{const i=new Map;for(const[t,r]of e.storedResolutions){const A=e.storedDescriptors.get(t);if(void 0===A)throw new Error(`Assertion failed: The descriptor (${t}) should have been registered`);P.getSetWithDefault(i,A.identHash).add(r)}return Array.from(e.storedDescriptors.values(),async A=>{if(t.length&&!Z().isMatch(d.stringifyIdent(A),t))return null;const o=e.storedResolutions.get(A.descriptorHash);if(void 0===o)throw new Error(`Assertion failed: The resolution (${A.descriptorHash}) should have been registered`);const s=e.originalPackages.get(o);if(void 0===s)return null;if(!r.shouldPersistResolution(s,n))return null;const a=i.get(A.identHash);if(void 0===a)throw new Error(`Assertion failed: The resolutions (${A.identHash}) should have been registered`);if(1===a.size)return null;const c=[...a].map(t=>{const r=e.originalPackages.get(t);if(void 0===r)throw new Error(`Assertion failed: The package (${t}) should have been registered`);return r.reference}),g=await r.getSatisfying(A,c,n),l=null==g?void 0:g[0];if(void 0===l)return null;const u=l.locatorHash,h=e.originalPackages.get(u);if(void 0===h)throw new Error(`Assertion failed: The package (${u}) should have been registered`);return u===o?null:{descriptor:A,currentPackage:s,updatedPackage:h}})}};class te extends c.BaseCommand{constructor(){super(...arguments),this.patterns=[],this.strategy=W.HIGHEST,this.check=!1,this.json=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t}=await h.I.find(e,this.context.cwd),r=await g.C.find(e);let A=0;const n=await p.Pk.start({configuration:e,includeFooter:!1,stdout:this.context.stdout,json:this.json},async e=>{A=await async function(e,{strategy:t,patterns:r,cache:A,report:n}){const{configuration:o}=e,i=new I.$,s=o.makeResolver(),a=o.makeFetcher(),c={cache:A,checksums:e.storedChecksums,fetcher:a,project:e,report:i,skipIntegrityCheck:!0},g={project:e,resolver:s,report:i,fetchOptions:c};return await n.startTimerPromise("Deduplication step",async()=>{const A=ee[t],i=await A(e,r,{resolver:s,resolveOptions:g,fetcher:a,fetchOptions:c}),l=X.yG.progressViaCounter(i.length);n.reportProgress(l);let h,p=0;switch(await Promise.all(i.map(t=>t.then(t=>{if(null===t)return;p++;const{descriptor:r,currentPackage:A,updatedPackage:i}=t;n.reportInfo(u.b.UNNAMED,`${d.prettyDescriptor(o,r)} can be deduped from ${d.prettyLocator(o,A)} to ${d.prettyLocator(o,i)}`),n.reportJson({descriptor:d.stringifyDescriptor(r),currentResolution:d.stringifyLocator(A),updatedResolution:d.stringifyLocator(i)}),e.storedResolutions.set(r.descriptorHash,i.locatorHash)}).finally(()=>l.tick()))),p){case 0:h="No packages";break;case 1:h="One package";break;default:h=p+" packages"}const C=B.pretty(o,t,B.Type.CODE);return n.reportInfo(u.b.UNNAMED,`${h} can be deduped using the ${C} strategy`),p})}(t,{strategy:this.strategy,patterns:this.patterns,cache:r,report:e})});if(n.hasErrors())return n.exitCode();if(this.check)return A?1:0;return(await p.Pk.start({configuration:e,stdout:this.context.stdout,json:this.json},async e=>{await t.install({cache:r,report:e})})).exitCode()}}te.schema=V.object().shape({strategy:V.string().test({name:"strategy",message:"${path} must be one of ${strategies}",params:{strategies:[...$].join(", ")},test:e=>$.has(e)})}),te.usage=C.Command.Usage({description:"deduplicate dependencies with overlapping ranges",details:"\n Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\n\n This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\n\n - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\n\n **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\n\n If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n ### In-depth explanation:\n\n Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\n\n Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\n ",examples:[["Dedupe all packages","$0 dedupe"],["Dedupe all packages using a specific strategy","$0 dedupe --strategy highest"],["Dedupe a specific package","$0 dedupe lodash"],["Dedupe all packages with the `@babel/*` scope","$0 dedupe '@babel/*'"],["Check for duplicates (can be used as a CI step)","$0 dedupe --check"]]}),(0,a.gn)([C.Command.Rest()],te.prototype,"patterns",void 0),(0,a.gn)([C.Command.String("-s,--strategy",{description:"The strategy to use when deduping dependencies"})],te.prototype,"strategy",void 0),(0,a.gn)([C.Command.Boolean("-c,--check",{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"})],te.prototype,"check",void 0),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],te.prototype,"json",void 0),(0,a.gn)([C.Command.Path("dedupe")],te.prototype,"execute",null);class re extends C.Command{async execute(){const{plugins:e}=await s.VK.find(this.context.cwd,this.context.plugins),t=[];for(const r of e){const{commands:e}=r[1];if(e){const A=C.Cli.from(e).definitions();t.push([r[0],A])}}const A=this.cli.definitions(),n=r(60306)["@yarnpkg/builder"].bundles.standard;for(const e of t){const t=e[1];for(const r of t)A.find(e=>{return t=e.path,A=r.path,t.split(" ").slice(1).join()===A.split(" ").slice(1).join();var t,A}).plugin={name:e[0],isDefault:n.includes(e[0])}}this.context.stdout.write(JSON.stringify({commands:A},null,2)+"\n")}}(0,a.gn)([C.Command.Path("--clipanion=definitions")],re.prototype,"execute",null);class Ae extends C.Command{async execute(){this.context.stdout.write(this.cli.usage(null))}}(0,a.gn)([C.Command.Path("help"),C.Command.Path("--help"),C.Command.Path("-h")],Ae.prototype,"execute",null);class ne extends C.Command{constructor(){super(...arguments),this.args=[]}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!d.tryParseIdent(this.leadingArgument)){const e=m.y1.resolve(this.context.cwd,m.cS.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:e})}return await this.cli.run(["run",this.leadingArgument,...this.args])}}(0,a.gn)([C.Command.String()],ne.prototype,"leadingArgument",void 0),(0,a.gn)([C.Command.Proxy()],ne.prototype,"args",void 0);var oe=r(59355);class ie extends C.Command{async execute(){this.context.stdout.write((oe.o||"")+"\n")}}(0,a.gn)([C.Command.Path("-v"),C.Command.Path("--version")],ie.prototype,"execute",null);var se=r(6220);class ae extends c.BaseCommand{constructor(){super(...arguments),this.args=[]}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t}=await h.I.find(e,this.context.cwd);return await y.xfs.mktempPromise(async e=>{const{code:r}=await se.pipevp(this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await R.makeScriptEnv({project:t,binFolder:e})});return r})}}ae.usage=C.Command.Usage({description:"execute a shell command",details:"\n This command simply executes a shell binary within the context of the root directory of the active workspace.\n\n It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment).\n ",examples:[["Execute a shell command","$0 exec echo Hello World"]]}),(0,a.gn)([C.Command.String()],ae.prototype,"commandName",void 0),(0,a.gn)([C.Command.Proxy()],ae.prototype,"args",void 0),(0,a.gn)([C.Command.Path("exec")],ae.prototype,"execute",null);var ce=r(36545);class ge extends c.BaseCommand{async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t}=await h.I.find(e,this.context.cwd);if(await t.applyLightResolution(),void 0!==this.hash)return await async function(e,t,r){const{configuration:A}=t,n=t.peerRequirements.get(e);if(void 0===n)throw new Error(`No peerDependency requirements found for hash: "${e}"`);return(await p.Pk.start({configuration:A,stdout:r.stdout,includeFooter:!1},async e=>{var r,o;const i=t.storedPackages.get(n.subject);if(void 0===i)throw new Error("Assertion failed: Expected the subject package to have been registered");const s=t.storedPackages.get(n.rootRequester);if(void 0===s)throw new Error("Assertion failed: Expected the root package to have been registered");const a=null!==(r=i.dependencies.get(n.requested.identHash))&&void 0!==r?r:null,c=null!==a?t.storedResolutions.get(a.descriptorHash):null;if(void 0===c)throw new Error("Assertion failed: Expected the resolution to have been registered");const g=null!==c?t.storedPackages.get(c):null;if(void 0===g)throw new Error("Assertion failed: Expected the provided package to have been registered");const l=[...n.allRequesters.values()].map(e=>{const r=t.storedPackages.get(e);if(void 0===r)throw new Error("Assertion failed: Expected the package to be registered");const A=d.devirtualizeLocator(r),o=t.storedPackages.get(A.locatorHash);if(void 0===o)throw new Error("Assertion failed: Expected the package to be registered");const i=o.peerDependencies.get(n.requested.identHash);if(void 0===i)throw new Error("Assertion failed: Expected the peer dependency to be registered");return{pkg:r,peerDependency:i}});if(null!==g){const t=l.every(({peerDependency:e})=>ce.satisfiesWithPrereleases(g.version,e.range));e.reportInfo(u.b.UNNAMED,`${d.prettyLocator(A,i)} provides ${d.prettyLocator(A,g)} with version ${d.prettyReference(A,null!==(o=g.version)&&void 0!==o?o:"")}, which ${t?"satisfies":"doesn't satisfy"} the following requirements:`)}else e.reportInfo(u.b.UNNAMED,`${d.prettyLocator(A,i)} doesn't provide ${d.prettyIdent(A,n.requested)}, breaking the following requirements:`);e.reportSeparator();const h=B.mark(A),p=[];for(const{pkg:e,peerDependency:t}of P.sortMap(l,e=>d.stringifyLocator(e.pkg))){const r=null!==g&&ce.satisfiesWithPrereleases(g.version,t.range)?h.Check:h.Cross;p.push({stringifiedLocator:d.stringifyLocator(e),prettyLocator:d.prettyLocator(A,e),prettyRange:d.prettyRange(A,t.range),mark:r})}const C=Math.max(...p.map(({stringifiedLocator:e})=>e.length)),f=Math.max(...p.map(({prettyRange:e})=>e.length));for(const{stringifiedLocator:t,prettyLocator:r,prettyRange:A,mark:n}of P.sortMap(p,({stringifiedLocator:e})=>e))e.reportInfo(null,`${r.padEnd(C+(r.length-t.length)," ")} → ${A.padEnd(f," ")} ${n}`);p.length>1&&(e.reportSeparator(),e.reportInfo(u.b.UNNAMED,"Note: these requirements start with "+d.prettyLocator(t.configuration,s)))})).exitCode()}(this.hash,t,{stdout:this.context.stdout});return(await p.Pk.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async r=>{var A;const n=[([,e])=>d.stringifyLocator(t.storedPackages.get(e.subject)),([,e])=>d.stringifyIdent(e.requested)];for(const[o,i]of P.sortMap(t.peerRequirements,n)){const n=t.storedPackages.get(i.subject);if(void 0===n)throw new Error("Assertion failed: Expected the subject package to have been registered");const s=t.storedPackages.get(i.rootRequester);if(void 0===s)throw new Error("Assertion failed: Expected the root package to have been registered");const a=null!==(A=n.dependencies.get(i.requested.identHash))&&void 0!==A?A:null,c=B.pretty(e,o,B.Type.CODE),g=d.prettyLocator(e,n),l=d.prettyIdent(e,i.requested),u=d.prettyIdent(e,s),h=i.allRequesters.length-1,p="descendant"+(1===h?"":"s"),C=h>0?` and ${h} ${p}`:"",f=null!==a?"provides":"doesn't provide";r.reportInfo(null,`${c} → ${g} ${f} ${l} to ${u}${C}`)}})).exitCode()}}ge.schema=V.object().shape({hash:V.string().matches(/^p[0-9a-f]{5}$/)}),ge.usage=C.Command.Usage({description:"explain a set of peer requirements",details:"\n A set of peer requirements represents all peer requirements that a dependent must satisfy when providing a given peer request to a requester and its descendants.\n\n When the hash argument is specified, this command prints a detailed explanation of all requirements of the set corresponding to the hash and whether they're satisfied or not.\n\n When used without arguments, this command lists all sets of peer requirements and the corresponding hash that can be used to get detailed information about a given set.\n\n **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (`yarn explain peer-requirements`).\n ",examples:[["Explain the corresponding set of peer requirements for a hash","$0 explain peer-requirements p1a4ed"],["List all sets of peer requirements","$0 explain peer-requirements"]]}),(0,a.gn)([C.Command.String({required:!1})],ge.prototype,"hash",void 0),(0,a.gn)([C.Command.Path("explain","peer-requirements")],ge.prototype,"execute",null);var le=r(85875);class ue extends c.BaseCommand{constructor(){super(...arguments),this.all=!1,this.recursive=!1,this.extra=[],this.cache=!1,this.dependents=!1,this.manifest=!1,this.nameOnly=!1,this.virtuals=!1,this.json=!1,this.patterns=[]}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await h.I.find(e,this.context.cwd),A=await g.C.find(e);if(!r&&!this.all)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);await t.restoreInstallState();const n=new Set(this.extra);this.cache&&n.add("cache"),this.dependents&&n.add("dependents"),this.manifest&&n.add("manifest");const o=(e,{recursive:r})=>{const A=e.anchoredLocator.locatorHash,n=new Map,o=[A];for(;o.length>0;){const e=o.shift();if(n.has(e))continue;const i=t.storedPackages.get(e);if(void 0===i)throw new Error("Assertion failed: Expected the package to be registered");if(n.set(e,i),d.isVirtualLocator(i)&&o.push(d.devirtualizeLocator(i).locatorHash),r||e===A)for(const e of i.dependencies.values()){const r=t.storedResolutions.get(e.descriptorHash);if(void 0===r)throw new Error("Assertion failed: Expected the resolution to be registered");o.push(r)}}return n.values()},i=({all:e,recursive:A})=>e&&A?t.storedPackages.values():e?(({recursive:e})=>{const r=new Map;for(const A of t.workspaces)for(const t of o(A,{recursive:e}))r.set(t.locatorHash,t);return r.values()})({recursive:A}):o(r,{recursive:A}),{selection:a,sortedLookup:l}=(({all:e,recursive:t})=>{const r=i({all:e,recursive:t}),A=this.patterns.map(e=>{const t=d.parseLocator(e),r=Z().makeRe(d.stringifyIdent(t)),A=d.isVirtualLocator(t),n=A?d.devirtualizeLocator(t):t;return e=>{const o=d.stringifyIdent(e);if(!r.test(o))return!1;if("unknown"===t.reference)return!0;const i=d.isVirtualLocator(e),s=i?d.devirtualizeLocator(e):e;return(!A||!i||t.reference===e.reference)&&n.reference===s.reference}}),n=P.sortMap([...r],e=>d.stringifyLocator(e));return{selection:n.filter(e=>0===A.length||A.some(t=>t(e))),sortedLookup:n}})({all:this.all,recursive:this.recursive});if(0===a.length)throw new C.UsageError("No package matched your request");const u=new Map;if(this.dependents)for(const e of l)for(const r of e.dependencies.values()){const A=t.storedResolutions.get(r.descriptorHash);if(void 0===A)throw new Error("Assertion failed: Expected the resolution to be registered");P.getArrayWithDefault(u,A).push(e)}const p=new Map;for(const e of l){if(!d.isVirtualLocator(e))continue;const t=d.devirtualizeLocator(e);P.getArrayWithDefault(p,t.locatorHash).push(e)}const f={},m={children:f},w=e.makeFetcher(),Q={project:t,fetcher:w,cache:A,checksums:t.storedChecksums,report:new I.$,skipIntegrityCheck:!0},D=[async(e,t,r)=>{var A,n;if(!t.has("manifest"))return;const o=await w.fetch(e,Q);let i;try{i=await E.G.find(o.prefixPath,{baseFs:o.packageFs})}finally{null===(A=o.releaseFs)||void 0===A||A.call(o)}r("Manifest",{License:B.tuple(B.Type.NO_HINT,i.license),Homepage:B.tuple(B.Type.URL,null!==(n=i.raw.homepage)&&void 0!==n?n:null)})},async(e,r,n)=>{var o;if(!r.has("cache"))return;const i=null!==(o=t.storedChecksums.get(e.locatorHash))&&void 0!==o?o:null,s=A.getLocatorPath(e,i);let a;if(null!==s)try{a=y.xfs.statSync(s)}catch(e){}const c=void 0!==a?[a.size,B.Type.SIZE]:void 0;n("Cache",{Checksum:B.tuple(B.Type.NO_HINT,i),Path:B.tuple(B.Type.PATH,s),Size:c})}];for(const r of a){const A=d.isVirtualLocator(r);if(!this.virtuals&&A)continue;const o={},i={value:[r,B.Type.LOCATOR],children:o};if(f[d.stringifyLocator(r)]=i,this.nameOnly){delete i.children;continue}const s=p.get(r.locatorHash);void 0!==s&&(o.Instances={label:"Instances",value:B.tuple(B.Type.NUMBER,s.length)}),o.Version={label:"Version",value:B.tuple(B.Type.NO_HINT,r.version)};const a=(e,t)=>{const r={};if(o[e]=r,Array.isArray(t))r.children=t.map(e=>({value:e}));else{const e={};r.children=e;for(const[r,A]of Object.entries(t))void 0!==A&&(e[r]={label:r,value:A})}};if(!A){for(const e of D)await e(r,n,a);await e.triggerHook(e=>e.fetchPackageInfo,r,n,a)}r.bin.size>0&&!A&&a("Exported Binaries",[...r.bin.keys()].map(e=>B.tuple(B.Type.PATH,e)));const c=u.get(r.locatorHash);void 0!==c&&c.length>0&&a("Dependents",c.map(e=>B.tuple(B.Type.LOCATOR,e))),r.dependencies.size>0&&!A&&a("Dependencies",[...r.dependencies.values()].map(e=>{var r;const A=t.storedResolutions.get(e.descriptorHash),n=void 0!==A&&null!==(r=t.storedPackages.get(A))&&void 0!==r?r:null;return B.tuple(B.Type.RESOLUTION,{descriptor:e,locator:n})})),r.peerDependencies.size>0&&A&&a("Peer dependencies",[...r.peerDependencies.values()].map(e=>{var A,n;const o=r.dependencies.get(e.identHash),i=void 0!==o&&null!==(A=t.storedResolutions.get(o.descriptorHash))&&void 0!==A?A:null,s=null!==i&&null!==(n=t.storedPackages.get(i))&&void 0!==n?n:null;return B.tuple(B.Type.RESOLUTION,{descriptor:e,locator:s})}))}le.emitTree(m,{configuration:e,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}}ue.usage=C.Command.Usage({description:"see information related to packages",details:"\n This command prints various information related to the specified packages, accepting glob patterns.\n\n By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\n\n Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\n\n Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\n ",examples:[["Show information about Lodash","$0 info lodash"]]}),(0,a.gn)([C.Command.Boolean("-A,--all",{description:"Print versions of a package from the whole project"})],ue.prototype,"all",void 0),(0,a.gn)([C.Command.Boolean("-R,--recursive",{description:"Print information for all packages, including transitive dependencies"})],ue.prototype,"recursive",void 0),(0,a.gn)([C.Command.Array("-X,--extra",{description:"An array of requests of extra data provided by plugins"})],ue.prototype,"extra",void 0),(0,a.gn)([C.Command.Boolean("--cache",{description:"Print information about the cache entry of a package (path, size, checksum)"})],ue.prototype,"cache",void 0),(0,a.gn)([C.Command.Boolean("--dependents",{description:"Print all dependents for each matching package"})],ue.prototype,"dependents",void 0),(0,a.gn)([C.Command.Boolean("--manifest",{description:"Print data obtained by looking at the package archive (license, homepage, ...)"})],ue.prototype,"manifest",void 0),(0,a.gn)([C.Command.Boolean("--name-only",{description:"Only print the name for the matching packages"})],ue.prototype,"nameOnly",void 0),(0,a.gn)([C.Command.Boolean("--virtuals",{description:"Print each instance of the virtual packages"})],ue.prototype,"virtuals",void 0),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],ue.prototype,"json",void 0),(0,a.gn)([C.Command.Rest()],ue.prototype,"patterns",void 0),(0,a.gn)([C.Command.Path("info")],ue.prototype,"execute",null);var he=r(11640),pe=r(5864);class de extends c.BaseCommand{constructor(){super(...arguments),this.json=!1,this.checkCache=!1,this.skipBuilds=!1,this.silent=!1}async execute(){var e,t,r;const A=await s.VK.find(this.context.cwd,this.context.plugins);void 0!==this.inlineBuilds&&A.useWithSource("",{enableInlineBuilds:this.inlineBuilds},A.startingCwd,{overwrite:!0});const n=!!process.env.NOW_BUILDER,o=!!process.env.NETLIFY,i=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,a=async(e,{error:t})=>{const r=await p.Pk.start({configuration:A,stdout:this.context.stdout,includeFooter:!1},async r=>{t?r.reportError(u.b.DEPRECATED_CLI_SETTINGS,e):r.reportWarning(u.b.DEPRECATED_CLI_SETTINGS,e)});return r.hasErrors()?r.exitCode():null};if(void 0!==this.ignoreEngines){const e=await a("The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",{error:!n});if(null!==e)return e}if(void 0!==this.registry){const e=await a("The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file",{error:!1});if(null!==e)return e}if(void 0!==this.preferOffline){const e=await a("The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",{error:!n});if(null!==e)return e}if(void 0!==this.production){const e=await a("The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",{error:!0});if(null!==e)return e}if(void 0!==this.nonInteractive){const e=await a("The --non-interactive option is deprecated",{error:!i});if(null!==e)return e}if(void 0!==this.frozenLockfile){const e=await a("The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",{error:!i&&!pe.TRAVIS});if(null!==e)return e}if(void 0!==this.cacheFolder){const e=await a("The cache-folder option has been deprecated; use rc settings instead",{error:!o});if(null!==e)return e}const l=void 0===this.immutable&&void 0===this.frozenLockfile?null!==(e=A.get("enableImmutableInstalls"))&&void 0!==e&&e:null!==(r=null!==(t=this.immutable)&&void 0!==t?t:this.frozenLockfile)&&void 0!==r&&r;if(null!==A.projectCwd){const e=await p.Pk.start({configuration:A,json:this.json,stdout:this.context.stdout,includeFooter:!1},async e=>{await async function(e,t){if(!e.projectCwd)return!1;const r=m.y1.join(e.projectCwd,e.get("lockfileFilename"));if(!await y.xfs.existsPromise(r))return!1;const A=await y.xfs.readFilePromise(r,"utf8");if(!A.includes("<<<<<<<"))return!1;if(t)throw new X.lk(u.b.AUTOMERGE_IMMUTABLE,"Cannot autofix a lockfile when running an immutable install");const[n,o]=function(e){const t=[[],[]],r=e.split(/\r?\n/g);let A=!1;for(;r.length>0;){const e=r.shift();if(void 0===e)throw new Error("Assertion failed: Some lines should remain");if(e.startsWith("<<<<<<<")){for(;r.length>0;){const e=r.shift();if(void 0===e)throw new Error("Assertion failed: Some lines should remain");if("======="===e){A=!1;break}A||e.startsWith("|||||||")?A=!0:t[0].push(e)}for(;r.length>0;){const e=r.shift();if(void 0===e)throw new Error("Assertion failed: Some lines should remain");if(e.startsWith(">>>>>>>"))break;t[1].push(e)}}else t[0].push(e),t[1].push(e)}return[t[0].join("\n"),t[1].join("\n")]}(A);let i,s;try{i=(0,he.parseSyml)(n),s=(0,he.parseSyml)(o)}catch(e){throw new X.lk(u.b.AUTOMERGE_FAILED_TO_PARSE,"The individual variants of the lockfile failed to parse")}const a={...i,...s};for(const[e,t]of Object.entries(a))"string"==typeof t&&delete a[e];return await y.xfs.changeFilePromise(r,(0,he.stringifySyml)(a),{automaticNewlines:!0}),!0}(A,l)&&(e.reportInfo(u.b.AUTOMERGE_SUCCESS,"Automatically fixed merge conflicts ðŸ‘"),e.reportSeparator())});if(e.hasErrors())return e.exitCode()}if(null!==A.projectCwd){const e=await p.Pk.start({configuration:A,json:this.json,stdout:this.context.stdout,includeFooter:!1},async e=>{var t;(null===(t=s.VK.telemetry)||void 0===t?void 0:t.isNew)&&(e.reportInfo(u.b.TELEMETRY_NOTICE,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),e.reportInfo(u.b.TELEMETRY_NOTICE,`Run ${B.pretty(A,"yarn config set --home enableTelemetry 0",B.Type.CODE)} to disable`),e.reportSeparator())});if(e.hasErrors())return e.exitCode()}const{project:d,workspace:C}=await h.I.find(A,this.context.cwd),f=await g.C.find(A,{immutable:this.immutableCache,check:this.checkCache});if(!C)throw new c.WorkspaceRequiredError(d.cwd,this.context.cwd);await d.restoreInstallState({restoreResolutions:!1});return(await p.Pk.start({configuration:A,json:this.json,stdout:this.context.stdout,includeLogs:!0},async e=>{await d.install({cache:f,report:e,immutable:l,skipBuild:this.skipBuilds})})).exitCode()}}de.usage=C.Command.Usage({description:"install the project dependencies",details:"\n This command setup your project if needed. The installation is splitted in four different steps that each have their own characteristics:\n\n - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ).\n\n - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of `cacheFolder` in `yarn config` to see where are stored the cache files).\n\n - **Link:** Then we send the dependency tree information to internal plugins tasked from writing them on the disk in some form (for example by generating the .pnp.js file you might know).\n\n - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another.\n\n Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your .pnp.js file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches.\n\n If the `--immutable` option is set, Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the `immutablePaths` configuration setting). For backward compatibility we offer an alias under the name of `--frozen-lockfile`, but it will be removed in a later release.\n\n If the `--immutable-cache` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed).\n\n If the `--check-cache` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them.\n\n If the `--inline-builds` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments.\n\n If the `--skip-builds` option is set, Yarn will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n ",examples:[["Install the project","$0 install"],["Validate a project when using Zero-Installs","$0 install --immutable --immutable-cache"],["Validate a project when using Zero-Installs (slightly safer if you accept external PRs)","$0 install --immutable --immutable-cache --check-cache"]]}),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],de.prototype,"json",void 0),(0,a.gn)([C.Command.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"})],de.prototype,"immutable",void 0),(0,a.gn)([C.Command.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"})],de.prototype,"immutableCache",void 0),(0,a.gn)([C.Command.Boolean("--check-cache",{description:"Always refetch the packages and ensure that their checksums are consistent"})],de.prototype,"checkCache",void 0),(0,a.gn)([C.Command.Boolean("--production",{hidden:!0})],de.prototype,"production",void 0),(0,a.gn)([C.Command.Boolean("--non-interactive",{hidden:!0})],de.prototype,"nonInteractive",void 0),(0,a.gn)([C.Command.Boolean("--frozen-lockfile",{hidden:!0})],de.prototype,"frozenLockfile",void 0),(0,a.gn)([C.Command.Boolean("--prefer-offline",{hidden:!0})],de.prototype,"preferOffline",void 0),(0,a.gn)([C.Command.Boolean("--ignore-engines",{hidden:!0})],de.prototype,"ignoreEngines",void 0),(0,a.gn)([C.Command.String("--registry",{hidden:!0})],de.prototype,"registry",void 0),(0,a.gn)([C.Command.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"})],de.prototype,"inlineBuilds",void 0),(0,a.gn)([C.Command.Boolean("--skip-builds",{description:"Skip the build step altogether"})],de.prototype,"skipBuilds",void 0),(0,a.gn)([C.Command.String("--cache-folder",{hidden:!0})],de.prototype,"cacheFolder",void 0),(0,a.gn)([C.Command.Boolean("--silent",{hidden:!0})],de.prototype,"silent",void 0),(0,a.gn)([C.Command.Path(),C.Command.Path("install")],de.prototype,"execute",null);class Ce extends c.BaseCommand{constructor(){super(...arguments),this.all=!1,this.private=!1,this.relative=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await h.I.find(e,this.context.cwd),A=await g.C.find(e);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);const n=m.y1.resolve(this.context.cwd,m.cS.toPortablePath(this.destination)),o=await s.VK.find(n,this.context.plugins),{project:i,workspace:a}=await h.I.find(o,n);if(!a)throw new c.WorkspaceRequiredError(i.cwd,n);const l=t.topLevelWorkspace,u=[];if(this.all){for(const e of i.workspaces)!e.manifest.name||e.manifest.private&&!this.private||u.push(e);if(0===u.length)throw new C.UsageError("No workspace found to be linked in the target project")}else{if(!a.manifest.name)throw new C.UsageError("The target workspace doesn't have a name and thus cannot be linked");if(a.manifest.private&&!this.private)throw new C.UsageError("The target workspace is marked private - use the --private flag to link it anyway");u.push(a)}for(const e of u){const r=d.stringifyIdent(e.locator),A=this.relative?m.y1.relative(t.cwd,e.cwd):e.cwd;l.manifest.resolutions.push({pattern:{descriptor:{fullName:r}},reference:"portal:"+A})}return(await p.Pk.start({configuration:e,stdout:this.context.stdout},async e=>{await t.install({cache:A,report:e})})).exitCode()}}Ce.usage=C.Command.Usage({description:"connect the local project to another one",details:"\n This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\n\n There is no `yarn unlink` command. To unlink the workspaces from the current project one must revert the changes made to the `resolutions` field.\n ",examples:[["Register a remote workspace for use in the current project","$0 link ~/ts-loader"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]}),(0,a.gn)([C.Command.String()],Ce.prototype,"destination",void 0),(0,a.gn)([C.Command.Boolean("-A,--all",{description:"Link all workspaces belonging to the target project to the current one"})],Ce.prototype,"all",void 0),(0,a.gn)([C.Command.Boolean("-p,--private",{description:"Also link private workspaces belonging to the target project to the current one"})],Ce.prototype,"private",void 0),(0,a.gn)([C.Command.Boolean("-r,--relative",{description:"Link workspaces using relative paths instead of absolute paths"})],Ce.prototype,"relative",void 0),(0,a.gn)([C.Command.Path("link")],Ce.prototype,"execute",null);class fe extends c.BaseCommand{constructor(){super(...arguments),this.args=[]}async execute(){return this.cli.run(["exec","node",...this.args])}}fe.usage=C.Command.Usage({description:"run node with the hook already setup",details:"\n This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment).\n\n The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version.\n ",examples:[["Run a Node script","$0 node ./my-script.js"]]}),(0,a.gn)([C.Command.Proxy()],fe.prototype,"args",void 0),(0,a.gn)([C.Command.Path("node")],fe.prototype,"execute",null);var Ie=r(20624),Ee=r(12087),Be=r(85622),ye=r.n(Be),me=r(79669);class we extends c.BaseCommand{constructor(){super(...arguments),this.onlyIfNeeded=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins);if(e.get("yarnPath")&&this.onlyIfNeeded)return 0;let t;if("latest"===this.version||"berry"===this.version)t="https://github.com/yarnpkg/berry/raw/master/packages/yarnpkg-cli/bin/yarn.js";else if("classic"===this.version)t="https://nightly.yarnpkg.com/latest.js";else if(ce.satisfiesWithPrereleases(this.version,">=2.0.0"))t=`https://github.com/yarnpkg/berry/raw/%40yarnpkg/cli/${this.version}/packages/yarnpkg-cli/bin/yarn.js`;else{if(!ce.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))throw Q().validRange(this.version)?new C.UsageError("Support for ranges got removed - please use the exact version you want to install, or 'latest' to get the latest build available"):new C.UsageError(`Invalid version descriptor "${this.version}"`);t=`https://github.com/yarnpkg/yarn/releases/download/v${this.version}/yarn-${this.version}.js`}return(await p.Pk.start({configuration:e,stdout:this.context.stdout},async r=>{r.reportInfo(u.b.UNNAMED,"Downloading "+B.pretty(e,t,"green"));const A=await me.get(t,{configuration:e});await Qe(e,null,A,{report:r})})).exitCode()}}async function Qe(e,t,r,{report:A}){const n=e.projectCwd?e.projectCwd:e.startingCwd;null===t&&await y.xfs.mktempPromise(async e=>{const A=m.y1.join(e,"yarn.cjs");await y.xfs.writeFilePromise(A,r);const{stdout:o}=await se.execvp(process.execPath,[m.cS.fromPortablePath(A),"--version"],{cwd:n,env:{...process.env,YARN_IGNORE_PATH:"1"}});if(t=o.trim(),!Q().valid(t))throw new Error("Invalid semver version")});const o=m.y1.resolve(n,".yarn/releases"),i=m.y1.resolve(o,`yarn-${t}.cjs`),a=m.y1.relative(e.startingCwd,i),c=m.y1.relative(n,i),g=e.get("yarnPath"),l=null===g||g.startsWith(o+"/");A.reportInfo(u.b.UNNAMED,"Saving the new release in "+B.pretty(e,a,"magenta")),await y.xfs.removePromise(m.y1.dirname(i)),await y.xfs.mkdirPromise(m.y1.dirname(i),{recursive:!0}),await y.xfs.writeFilePromise(i,r),await y.xfs.chmodPromise(i,493),l&&await s.VK.updateConfiguration(n,{yarnPath:c})}we.usage=C.Command.Usage({description:"lock the Yarn version used by the project",details:"\n This command will download a specific release of Yarn directly from the Yarn GitHub repository, will store it inside your project, and will change the `yarnPath` settings from your project `.yarnrc.yml` file to point to the new file.\n\n A very good use case for this command is to enforce the version of Yarn used by the any single member of your team inside a same project - by doing this you ensure that you have control on Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting a different behavior than you.\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download a specific Yarn 2 build","$0 set version 2.0.0-rc.30"],["Switch back to a specific Yarn 1 release","$0 set version 1.22.1"]]}),(0,a.gn)([C.Command.Boolean("--only-if-needed",{description:"Only lock the Yarn version if it isn't already locked"})],we.prototype,"onlyIfNeeded",void 0),(0,a.gn)([C.Command.String()],we.prototype,"version",void 0),(0,a.gn)([C.Command.Path("policies","set-version"),C.Command.Path("set","version")],we.prototype,"execute",null);const De=/^[0-9]+$/;function be(e){return De.test(e)?`pull/${e}/head`:e}class ve extends c.BaseCommand{constructor(){super(...arguments),this.repository="https://github.com/yarnpkg/berry.git",this.branch="master",this.plugins=[],this.noMinify=!1,this.force=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),t=void 0!==this.installPath?m.y1.resolve(this.context.cwd,m.cS.toPortablePath(this.installPath)):m.y1.resolve(m.cS.toPortablePath((0,Ee.tmpdir)()),"yarnpkg-sources",Ie.makeHash(this.repository).slice(0,6));return(await p.Pk.start({configuration:e,stdout:this.context.stdout},async r=>{await ke(this,{configuration:e,report:r,target:t}),r.reportSeparator(),r.reportInfo(u.b.UNNAMED,"Building a fresh bundle"),r.reportSeparator(),await Se((({plugins:e,noMinify:t},r)=>[["yarn","build:cli",...(new Array).concat(...e.map(e=>["--plugin",ye().resolve(r,e)])),...t?["--no-minify"]:[],"|"]])(this,t),{configuration:e,context:this.context,target:t}),r.reportSeparator();const A=m.y1.resolve(t,"packages/yarnpkg-cli/bundles/yarn.js"),n=await y.xfs.readFilePromise(A);await Qe(e,"sources",n,{report:r})})).exitCode()}}async function Se(e,{configuration:t,context:r,target:A}){for(const[n,...o]of e){const e="|"===o[o.length-1];if(e&&o.pop(),e)await se.pipevp(n,o,{cwd:A,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(B.pretty(t," $ "+[n,...o].join(" "),"grey")+"\n");try{await se.execvp(n,o,{cwd:A,strict:!0})}catch(e){throw r.stdout.write(e.stdout||e.stack),e}}}}async function ke(e,{configuration:t,report:r,target:A}){let n=!1;if(!e.force&&y.xfs.existsSync(m.y1.join(A,".git"))){r.reportInfo(u.b.UNNAMED,"Fetching the latest commits"),r.reportSeparator();try{await Se((({branch:e})=>[["git","fetch","origin",be(e),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx"]])(e),{configuration:t,context:e.context,target:A}),n=!0}catch(e){r.reportSeparator(),r.reportWarning(u.b.UNNAMED,"Repository update failed; we'll try to regenerate it")}}n||(r.reportInfo(u.b.UNNAMED,"Cloning the remote repository"),r.reportSeparator(),await y.xfs.removePromise(A),await y.xfs.mkdirPromise(A,{recursive:!0}),await Se((({repository:e,branch:t},r)=>[["git","init",m.cS.fromPortablePath(r)],["git","remote","add","origin",e],["git","fetch","origin",be(t)],["git","reset","--hard","FETCH_HEAD"]])(e,A),{configuration:t,context:e.context,target:A}))}ve.usage=C.Command.Usage({description:"build Yarn from master",details:"\n This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project.\n ",examples:[["Build Yarn from master","$0 set version from sources"]]}),(0,a.gn)([C.Command.String("--path",{description:"The path where the repository should be cloned to"})],ve.prototype,"installPath",void 0),(0,a.gn)([C.Command.String("--repository",{description:"The repository that should be cloned"})],ve.prototype,"repository",void 0),(0,a.gn)([C.Command.String("--branch",{description:"The branch of the repository that should be cloned"})],ve.prototype,"branch",void 0),(0,a.gn)([C.Command.Array("--plugin",{description:"An array of additional plugins that should be included in the bundle"})],ve.prototype,"plugins",void 0),(0,a.gn)([C.Command.Boolean("--no-minify",{description:"Build a bundle for development (debugging) - non-minified and non-mangled"})],ve.prototype,"noMinify",void 0),(0,a.gn)([C.Command.Boolean("-f,--force",{description:"Always clone the repository instead of trying to fetch the latest commits"})],ve.prototype,"force",void 0),(0,a.gn)([C.Command.Path("set","version","from","sources")],ve.prototype,"execute",null);var Ne=r(78835);const Fe=require("vm");async function Ke(e){const t=await me.get("https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml",{configuration:e});return(0,he.parseSyml)(t.toString())}class Me extends c.BaseCommand{constructor(){super(...arguments),this.json=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins);return(await p.Pk.start({configuration:e,json:this.json,stdout:this.context.stdout},async t=>{const r=await Ke(e);for(const[e,{experimental:A,...n}]of Object.entries(r)){let r=e;A&&(r+=" [experimental]"),t.reportJson({name:e,experimental:A,...n}),t.reportInfo(null,r)}})).exitCode()}}Me.usage=C.Command.Usage({category:"Plugin-related commands",description:"list the available official plugins",details:"\n This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\n ",examples:[["List the official plugins","$0 plugin list"]]}),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],Me.prototype,"json",void 0),(0,a.gn)([C.Command.Path("plugin","list")],Me.prototype,"execute",null);class Re extends c.BaseCommand{async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins);return(await p.Pk.start({configuration:e,stdout:this.context.stdout},async t=>{const{project:r}=await h.I.find(e,this.context.cwd);let A,n;if(this.name.match(/^\.{0,2}[\\/]/)||m.cS.isAbsolute(this.name)){const o=m.y1.resolve(this.context.cwd,m.cS.toPortablePath(this.name));t.reportInfo(u.b.UNNAMED,"Reading "+B.pretty(e,o,B.Type.PATH)),A=m.y1.relative(r.cwd,o),n=await y.xfs.readFilePromise(o)}else{let r;if(this.name.match(/^https?:/)){try{new Ne.URL(this.name)}catch(e){throw new X.lk(u.b.INVALID_PLUGIN_REFERENCE,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}A=this.name,r=this.name}else{const t=d.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),n=d.stringifyIdent(t),o=await Ke(e);if(!Object.prototype.hasOwnProperty.call(o,n))throw new X.lk(u.b.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${n}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be referenced by their name; any other plugin will have to be referenced through its public url (for example https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js).`);A=n,r=o[n].url}t.reportInfo(u.b.UNNAMED,"Downloading "+B.pretty(e,r,"green")),n=await me.get(r,{configuration:e})}await xe(A,n,{project:r,report:t})})).exitCode()}}async function xe(e,t,{project:r,report:A}){const{configuration:n}=r,o={},i={exports:o};(0,Fe.runInNewContext)(t.toString(),{module:i,exports:o});const a=i.exports.name,c=`.yarn/plugins/${a}.cjs`,g=m.y1.resolve(r.cwd,c);A.reportInfo(u.b.UNNAMED,"Saving the new plugin in "+B.pretty(n,c,"magenta")),await y.xfs.mkdirPromise(m.y1.dirname(g),{recursive:!0}),await y.xfs.writeFilePromise(g,t);const l={path:c,spec:e};await s.VK.updateConfiguration(r.cwd,e=>{const t=[];let A=!1;for(const n of e.plugins||[]){const e="string"!=typeof n?n.path:n,o=m.y1.resolve(r.cwd,m.cS.toPortablePath(e)),{name:i}=P.dynamicRequire(m.cS.fromPortablePath(o));i!==a?t.push(n):(t.push(l),A=!0)}return A||t.push(l),{...e,plugins:t}})}Re.usage=C.Command.Usage({category:"Plugin-related commands",description:"download a plugin",details:"\n This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations.\n\n Three types of plugin references are accepted:\n\n - If the plugin is stored within the Yarn repository, it can be referenced by name.\n - Third-party plugins can be referenced directly through their public urls.\n - Local plugins can be referenced by their path on the disk.\n\n Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the `@yarnpkg/builder` package).\n ",examples:[['Download and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import @yarnpkg/plugin-exec"],['Download and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import exec"],["Download and activate a community plugin","$0 plugin import https://example.org/path/to/plugin.js"],["Activate a local plugin","$0 plugin import ./path/to/plugin.js"]]}),(0,a.gn)([C.Command.String()],Re.prototype,"name",void 0),(0,a.gn)([C.Command.Path("plugin","import")],Re.prototype,"execute",null);class Le extends c.BaseCommand{constructor(){super(...arguments),this.repository="https://github.com/yarnpkg/berry.git",this.branch="master",this.noMinify=!1,this.force=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),t=void 0!==this.installPath?m.y1.resolve(this.context.cwd,m.cS.toPortablePath(this.installPath)):m.y1.resolve(m.cS.toPortablePath((0,Ee.tmpdir)()),"yarnpkg-sources",Ie.makeHash(this.repository).slice(0,6));return(await p.Pk.start({configuration:e,stdout:this.context.stdout},async r=>{const{project:A}=await h.I.find(e,this.context.cwd),n=d.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),o=d.stringifyIdent(n),i=await Ke(e);if(!Object.prototype.hasOwnProperty.call(i,o))throw new X.lk(u.b.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${o}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);const s=o,a=s.replace(/@yarnpkg\//,"");await ke(this,{configuration:e,report:r,target:t}),r.reportSeparator(),r.reportInfo(u.b.UNNAMED,"Building a fresh "+a),r.reportSeparator(),await Se((({pluginName:e,noMinify:t},r)=>[["yarn","build:"+e,...t?["--no-minify"]:[],"|"]])({pluginName:a,noMinify:this.noMinify}),{configuration:e,context:this.context,target:t}),r.reportSeparator();const c=m.y1.resolve(t,`packages/${a}/bundles/${s}.js`),g=await y.xfs.readFilePromise(c);await xe(s,g,{project:A,report:r})})).exitCode()}}Le.usage=C.Command.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:"\n This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations.\n\n The plugins can be referenced by their short name if sourced from the official Yarn repository.\n ",examples:[['Build and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import from sources @yarnpkg/plugin-exec"],['Build and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import from sources exec"]]}),(0,a.gn)([C.Command.String()],Le.prototype,"name",void 0),(0,a.gn)([C.Command.String("--path",{description:"The path where the repository should be cloned to"})],Le.prototype,"installPath",void 0),(0,a.gn)([C.Command.String("--repository",{description:"The repository that should be cloned"})],Le.prototype,"repository",void 0),(0,a.gn)([C.Command.String("--branch",{description:"The branch of the repository that should be cloned"})],Le.prototype,"branch",void 0),(0,a.gn)([C.Command.Boolean("--no-minify",{description:"Build a plugin for development (debugging) - non-minified and non-mangled"})],Le.prototype,"noMinify",void 0),(0,a.gn)([C.Command.Boolean("-f,--force",{description:"Always clone the repository instead of trying to fetch the latest commits"})],Le.prototype,"force",void 0),(0,a.gn)([C.Command.Path("plugin","import","from","sources")],Le.prototype,"execute",null);class Pe extends c.BaseCommand{async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t}=await h.I.find(e,this.context.cwd);return(await p.Pk.start({configuration:e,stdout:this.context.stdout},async r=>{const A=this.name,n=d.parseIdent(A);if(!e.plugins.has(A))throw new C.UsageError(d.prettyIdent(e,n)+" isn't referenced by the current configuration");const o=`.yarn/plugins/${A}.cjs`,i=m.y1.resolve(t.cwd,o);y.xfs.existsSync(i)&&(r.reportInfo(u.b.UNNAMED,`Removing ${B.pretty(e,o,B.Type.PATH)}...`),await y.xfs.removePromise(i)),r.reportInfo(u.b.UNNAMED,"Updating the configuration..."),await s.VK.updateConfiguration(t.cwd,e=>{if(!Array.isArray(e.plugins))return e;const t=e.plugins.filter(e=>e.path!==o);return e.plugins.length===t.length?e:{...e,plugins:t}})})).exitCode()}}Pe.usage=C.Command.Usage({category:"Plugin-related commands",description:"remove a plugin",details:"\n This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration.\n\n **Note:** The plugins have to be referenced by their name property, which can be obtained using the `yarn plugin runtime` command. Shorthands are not allowed.\n ",examples:[["Remove a plugin imported from the Yarn repository","$0 plugin remove @yarnpkg/plugin-typescript"],["Remove a plugin imported from a local file","$0 plugin remove my-local-plugin"]]}),(0,a.gn)([C.Command.String()],Pe.prototype,"name",void 0),(0,a.gn)([C.Command.Path("plugin","remove")],Pe.prototype,"execute",null);class Oe extends c.BaseCommand{constructor(){super(...arguments),this.json=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins);return(await p.Pk.start({configuration:e,json:this.json,stdout:this.context.stdout},async t=>{for(const r of e.plugins.keys()){const e=this.context.plugins.plugins.has(r);let A=r;e&&(A+=" [builtin]"),t.reportJson({name:r,builtin:e}),t.reportInfo(null,""+A)}})).exitCode()}}Oe.usage=C.Command.Usage({category:"Plugin-related commands",description:"list the active plugins",details:"\n This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins.\n ",examples:[["List the currently active plugins","$0 plugin runtime"]]}),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],Oe.prototype,"json",void 0),(0,a.gn)([C.Command.Path("plugin","runtime")],Oe.prototype,"execute",null);class Ue extends c.BaseCommand{constructor(){super(...arguments),this.idents=[]}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await h.I.find(e,this.context.cwd),A=await g.C.find(e);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);const n=new Set;for(const e of this.idents)n.add(d.parseIdent(e).identHash);await t.resolveEverything({cache:A,report:new I.$});const o=e.get("bstatePath"),i=y.xfs.existsSync(o)?(0,he.parseSyml)(await y.xfs.readFilePromise(o,"utf8")):{},a=new Map;for(const e of t.storedPackages.values()){if(!Object.prototype.hasOwnProperty.call(i,e.locatorHash))continue;if(0===n.size||n.has(e.identHash))continue;const t=i[e.locatorHash];a.set(e.locatorHash,t)}if(a.size>0){const r=e.get("bstatePath"),A=h.I.generateBuildStateFile(a,t.storedPackages);await y.xfs.mkdirPromise(m.y1.dirname(r),{recursive:!0}),await y.xfs.changeFilePromise(r,A,{automaticNewlines:!0})}else await y.xfs.removePromise(o);return(await p.Pk.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async e=>{await t.install({cache:A,report:e})})).exitCode()}}Ue.usage=C.Command.Usage({description:"rebuild the project's native packages",details:"\n This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again.\n\n Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future).\n\n By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory.\n ",examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]}),(0,a.gn)([C.Command.Rest()],Ue.prototype,"idents",void 0),(0,a.gn)([C.Command.Path("rebuild")],Ue.prototype,"execute",null);class Te extends c.BaseCommand{constructor(){super(...arguments),this.all=!1,this.patterns=[]}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await h.I.find(e,this.context.cwd),A=await g.C.find(e);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});const o=this.all?t.workspaces:[r],i=[n.REGULAR,n.DEVELOPMENT,n.PEER],a=[];let l=!1;const u=[];for(const e of this.patterns){let t=!1;const r=d.parseIdent(e);for(const A of o){const n=[...A.manifest.peerDependenciesMeta.keys()];for(const r of Z()(n,e))A.manifest.peerDependenciesMeta.delete(r),l=!0,t=!0;for(const e of i){const n=A.manifest.getForScope(e),o=[...n.values()].map(e=>d.stringifyIdent(e));for(const i of Z()(o,d.stringifyIdent(r))){const{identHash:r}=d.parseIdent(i),o=n.get(r);if(void 0===o)throw new Error("Assertion failed: Expected the descriptor to be registered");A.manifest[e].delete(r),u.push([A,e,o]),l=!0,t=!0}}}t||a.push(e)}const f=a.length>1?"Patterns":"Pattern",I=a.length>1?"don't":"doesn't",E=this.all?"any":"this";if(a.length>0)throw new C.UsageError(`${f} ${B.prettyList(e,a,s.a5.CODE)} ${I} match any packages referenced by ${E} workspace`);if(l){await e.triggerMultipleHooks(e=>e.afterWorkspaceDependencyRemoval,u);return(await p.Pk.start({configuration:e,stdout:this.context.stdout},async e=>{await t.install({cache:A,report:e})})).exitCode()}return 0}}Te.usage=C.Command.Usage({description:"remove dependencies from the project",details:"\n This command will remove the packages matching the specified patterns from the current workspace.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n ",examples:[["Remove a dependency from the current project","$0 remove lodash"],["Remove a dependency from all workspaces at once","$0 remove lodash --all"],["Remove all dependencies starting with `eslint-`","$0 remove 'eslint-*'"],["Remove all dependencies with the `@babel` scope","$0 remove '@babel/*'"],["Remove all dependencies matching `react-dom` or `react-helmet`","$0 remove 'react-{dom,helmet}'"]]}),(0,a.gn)([C.Command.Boolean("-A,--all",{description:"Apply the operation to all workspaces from the current project"})],Te.prototype,"all",void 0),(0,a.gn)([C.Command.Rest()],Te.prototype,"patterns",void 0),(0,a.gn)([C.Command.Path("remove")],Te.prototype,"execute",null);class je extends c.BaseCommand{async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await h.I.find(e,this.context.cwd);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);return(await p.Pk.start({configuration:e,stdout:this.context.stdout},async t=>{const A=r.manifest.scripts,n=P.sortMap(A.keys(),e=>e),o={breakLength:1/0,colors:e.get("enableColors"),maxArrayLength:2},i=n.reduce((e,t)=>Math.max(e,t.length),0);for(const[e,r]of A.entries())t.reportInfo(null,`${e.padEnd(i," ")} ${(0,T.inspect)(r,o)}`)})).exitCode()}}(0,a.gn)([C.Command.Path("run")],je.prototype,"execute",null);class Ye extends c.BaseCommand{constructor(){super(...arguments),this.inspect=!1,this.inspectBrk=!1,this.topLevel=!1,this.binariesOnly=!1,this.args=[]}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r,locator:A}=await h.I.find(e,this.context.cwd);await t.restoreInstallState();const n=this.topLevel?t.topLevelWorkspace.anchoredLocator:A;if(!this.binariesOnly&&await R.hasPackageScript(n,this.scriptName,{project:t}))return await R.executePackageScript(n,this.scriptName,this.args,{project:t,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if((await R.getPackageAccessibleBinaries(n,{project:t})).get(this.scriptName)){const e=[];return this.inspect&&("string"==typeof this.inspect?e.push("--inspect="+this.inspect):e.push("--inspect")),this.inspectBrk&&("string"==typeof this.inspectBrk?e.push("--inspect-brk="+this.inspectBrk):e.push("--inspect-brk")),await R.executePackageAccessibleBinary(n,this.scriptName,this.args,{cwd:this.context.cwd,project:t,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:e})}if(!this.topLevel&&!this.binariesOnly&&r&&this.scriptName.includes(":")){const e=(await Promise.all(t.workspaces.map(async e=>e.manifest.scripts.has(this.scriptName)?e:null))).filter(e=>null!==e);if(1===e.length)return await R.executeWorkspaceScript(e[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw"node-gyp"===this.scriptName?new C.UsageError(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${d.prettyLocator(e,A)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new C.UsageError(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${d.prettyLocator(e,A)}).`);{if("global"===this.scriptName)throw new C.UsageError("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");const e=[this.scriptName].concat(this.args);for(const[t,r]of c.pluginCommands)for(const A of r)if(e.length>=A.length&&JSON.stringify(e.slice(0,A.length))===JSON.stringify(A))throw new C.UsageError(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${t} plugin. You can install it with "yarn plugin import ${t}".`);throw new C.UsageError(`Couldn't find a script named "${this.scriptName}".`)}}}Ye.usage=C.Command.Usage({description:"run a script defined in the package.json",details:"\n This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace:\n\n - If the `scripts` field from your local package.json contains a matching script name, its definition will get executed.\n\n - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed.\n\n - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed.\n\n Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax).\n ",examples:[["Run the tests from the local workspace","$0 run test"],['Same thing, but without the "run" keyword',"$0 test"],["Inspect Webpack while running","$0 run --inspect-brk webpack"]]}),(0,a.gn)([C.Command.String("--inspect",{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"})],Ye.prototype,"inspect",void 0),(0,a.gn)([C.Command.String("--inspect-brk",{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"})],Ye.prototype,"inspectBrk",void 0),(0,a.gn)([C.Command.Boolean("-T,--top-level",{hidden:!0})],Ye.prototype,"topLevel",void 0),(0,a.gn)([C.Command.Boolean("-B,--binaries-only",{hidden:!0})],Ye.prototype,"binariesOnly",void 0),(0,a.gn)([C.Command.Boolean("--silent",{hidden:!0})],Ye.prototype,"silent",void 0),(0,a.gn)([C.Command.String()],Ye.prototype,"scriptName",void 0),(0,a.gn)([C.Command.Proxy()],Ye.prototype,"args",void 0),(0,a.gn)([C.Command.Path("run")],Ye.prototype,"execute",null);class Ge extends c.BaseCommand{constructor(){super(...arguments),this.save=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await h.I.find(e,this.context.cwd),A=await g.C.find(e);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);const n=d.parseDescriptor(this.descriptor,!0),o=d.makeDescriptor(n,this.resolution);t.storedDescriptors.set(n.descriptorHash,n),t.storedDescriptors.set(o.descriptorHash,o),t.resolutionAliases.set(n.descriptorHash,o.descriptorHash);return(await p.Pk.start({configuration:e,stdout:this.context.stdout},async e=>{await t.install({cache:A,report:e})})).exitCode()}}Ge.usage=C.Command.Usage({description:"enforce a package resolution",details:'\n This command updates the resolution table so that `descriptor` is resolved by `resolution`.\n\n Note that by default this command only affect the current resolution table - meaning that this "manual override" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, add the `-s,--save` flag which will also edit the `resolutions` field from your top-level manifest.\n\n Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\n ',examples:[["Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0","$0 set resolution lodash@npm:^1.2.3 1.5.0"]]}),(0,a.gn)([C.Command.String()],Ge.prototype,"descriptor",void 0),(0,a.gn)([C.Command.String()],Ge.prototype,"resolution",void 0),(0,a.gn)([C.Command.Boolean("-s,--save",{description:"Persist the resolution inside the top-level manifest"})],Ge.prototype,"save",void 0),(0,a.gn)([C.Command.Path("set","resolution")],Ge.prototype,"execute",null);class He extends c.BaseCommand{constructor(){super(...arguments),this.patterns=[],this.interactive=null,this.exact=!1,this.tilde=!1,this.caret=!1}async execute(){var e;const t=await s.VK.find(this.context.cwd,this.context.plugins),{project:r,workspace:A}=await h.I.find(t,this.context.cwd),o=await g.C.find(t);if(!A)throw new c.WorkspaceRequiredError(r.cwd,this.context.cwd);const a=null!==(e=this.interactive)&&void 0!==e?e:t.get("preferInteractive"),I=D(this,r),E=a?[i.KEEP,i.REUSE,i.PROJECT,i.LATEST]:[i.PROJECT,i.LATEST],y=[],m=[];for(const e of this.patterns){let t=!1;const A=d.parseDescriptor(e);for(const e of r.workspaces)for(const i of[n.REGULAR,n.DEVELOPMENT]){const n=[...e.manifest.getForScope(i).values()].map(e=>d.stringifyIdent(e));for(const s of Z()(n,d.stringifyIdent(A))){const n=d.parseIdent(s),a=e.manifest[i].get(n.identHash);if(void 0===a)throw new Error("Assertion failed: Expected the descriptor to be registered");const c=d.makeDescriptor(n,A.range);y.push(Promise.resolve().then(async()=>[e,i,a,await F(c,{project:r,workspace:e,cache:o,target:i,modifier:I,strategies:E})])),t=!0}}t||m.push(e)}if(m.length>1)throw new C.UsageError(`Patterns ${B.prettyList(t,m,s.a5.CODE)} don't match any packages referenced by any workspace`);if(m.length>0)throw new C.UsageError(`Pattern ${B.prettyList(t,m,s.a5.CODE)} doesn't match any packages referenced by any workspace`);const w=await Promise.all(y),Q=await l.h.start({configuration:t,stdout:this.context.stdout,suggestInstall:!1},async e=>{for(const[,,A,{suggestions:n,rejections:o}]of w){const i=n.filter(e=>null!==e.descriptor);if(0===i.length){const[n]=o;if(void 0===n)throw new Error("Assertion failed: Expected an error to have been set");const i=this.cli.error(n);r.configuration.get("enableNetwork")?e.reportError(u.b.CANT_SUGGEST_RESOLUTIONS,`${d.prettyDescriptor(t,A)} can't be resolved to a satisfying range\n\n${i}`):e.reportError(u.b.CANT_SUGGEST_RESOLUTIONS,`${d.prettyDescriptor(t,A)} can't be resolved to a satisfying range (note: network resolution has been disabled)\n\n${i}`)}else i.length>1&&!a&&e.reportError(u.b.CANT_SUGGEST_RESOLUTIONS,d.prettyDescriptor(t,A)+" has multiple possible upgrade strategies; use -i to disambiguate manually")}});if(Q.hasErrors())return Q.exitCode();let b=!1;const v=[];for(const[e,A,,{suggestions:n}]of w){let o;const i=n.filter(e=>null!==e.descriptor),s=i[0].descriptor,a=i.every(e=>d.areDescriptorsEqual(e.descriptor,s));1===i.length||a?o=s:(b=!0,({answer:o}=await(0,f.prompt)({type:"select",name:"answer",message:`Which range to you want to use in ${d.prettyWorkspace(t,e)} ⯠${A}?`,choices:n.map(({descriptor:e,name:t,reason:r})=>e?{name:t,hint:r,descriptor:e}:{name:t,hint:r,disabled:!0}),onCancel:()=>process.exit(130),result(e){return this.find(e,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout})));const c=e.manifest[A].get(o.identHash);if(void 0===c)throw new Error("Assertion failed: This descriptor should have a matching entry");if(c.descriptorHash!==o.descriptorHash)e.manifest[A].set(o.identHash,o),v.push([e,A,c,o]);else{const A=t.makeResolver(),n={project:r,resolver:A},o=A.bindDescriptor(c,e.anchoredLocator,n);r.forgetResolution(o)}}await t.triggerMultipleHooks(e=>e.afterWorkspaceDependencyReplacement,v),b&&this.context.stdout.write("\n");return(await p.Pk.start({configuration:t,stdout:this.context.stdout},async e=>{await r.install({cache:o,report:e})})).exitCode()}}He.usage=C.Command.Usage({description:"upgrade dependencies across the project",details:"\n This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\n\n If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\n\n The, `-C,--caret`, `-E,--exact` and `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\n\n Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\n\n This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\n ",examples:[["Upgrade all instances of lodash to the latest release","$0 up lodash"],["Upgrade all instances of lodash to the latest release, but ask confirmation for each","$0 up lodash -i"],["Upgrade all instances of lodash to 1.2.3","$0 up lodash@1.2.3"],["Upgrade all instances of packages with the `@babel` scope to the latest release","$0 up '@babel/*'"],["Upgrade all instances of packages containing the word `jest` to the latest release","$0 up '*jest*'"],["Upgrade all instances of packages with the `@babel` scope to 7.0.0","$0 up '@babel/*@7.0.0'"]]}),(0,a.gn)([C.Command.Rest()],He.prototype,"patterns",void 0),(0,a.gn)([C.Command.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"})],He.prototype,"interactive",void 0),(0,a.gn)([C.Command.Boolean("-E,--exact",{description:"Don't use any semver modifier on the resolved range"})],He.prototype,"exact",void 0),(0,a.gn)([C.Command.Boolean("-T,--tilde",{description:"Use the `~` semver modifier on the resolved range"})],He.prototype,"tilde",void 0),(0,a.gn)([C.Command.Boolean("-C,--caret",{description:"Use the `^` semver modifier on the resolved range"})],He.prototype,"caret",void 0),(0,a.gn)([C.Command.Path("up")],He.prototype,"execute",null);class Je extends c.BaseCommand{constructor(){super(...arguments),this.recursive=!1,this.json=!1,this.peers=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await h.I.find(e,this.context.cwd);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);await t.restoreInstallState();const A=d.parseIdent(this.package).identHash,n=this.recursive?function(e,t,{configuration:r,peers:A}){const n=P.sortMap(e.workspaces,e=>d.stringifyLocator(e.anchoredLocator)),o=new Set,i=new Set,s=r=>{if(o.has(r.locatorHash))return i.has(r.locatorHash);if(o.add(r.locatorHash),r.identHash===t)return i.add(r.locatorHash),!0;let n=!1;r.identHash===t&&(n=!0);for(const t of r.dependencies.values()){if(!A&&r.peerDependencies.has(t.identHash))continue;const o=e.storedResolutions.get(t.descriptorHash);if(!o)throw new Error("Assertion failed: The resolution should have been registered");const i=e.storedPackages.get(o);if(!i)throw new Error("Assertion failed: The package should have been registered");s(i)&&(n=!0)}return n&&i.add(r.locatorHash),n};for(const t of n){const r=e.storedPackages.get(t.anchoredLocator.locatorHash);if(!r)throw new Error("Assertion failed: The package should have been registered");s(r)}const a=new Set,c={},g={children:c},l=(t,r,n)=>{if(!i.has(t.locatorHash))return;const o={},s={value:null!==n?B.tuple(B.Type.DEPENDENT,{locator:t,descriptor:n}):B.tuple(B.Type.LOCATOR,t),children:o};if(r[d.stringifyLocator(t)]=s,!a.has(t.locatorHash)&&(a.add(t.locatorHash),null===n||!e.tryWorkspaceByLocator(t)))for(const r of t.dependencies.values()){if(!A&&t.peerDependencies.has(r.identHash))continue;const n=e.storedResolutions.get(r.descriptorHash);if(!n)throw new Error("Assertion failed: The resolution should have been registered");const i=e.storedPackages.get(n);if(!i)throw new Error("Assertion failed: The package should have been registered");l(i,o,r)}};for(const t of n){const r=e.storedPackages.get(t.anchoredLocator.locatorHash);if(!r)throw new Error("Assertion failed: The package should have been registered");l(r,c,null)}return g}(t,A,{configuration:e,peers:this.peers}):function(e,t,{configuration:r,peers:A}){const n=P.sortMap(e.storedPackages.values(),e=>d.stringifyLocator(e)),o={},i={children:o};for(const r of n){const n={},i=null;for(const s of r.dependencies.values()){if(!A&&r.peerDependencies.has(s.identHash))continue;const a=e.storedResolutions.get(s.descriptorHash);if(!a)throw new Error("Assertion failed: The resolution should have been registered");const c=e.storedPackages.get(a);if(!c)throw new Error("Assertion failed: The package should have been registered");if(c.identHash!==t)continue;if(null===i){const e=d.stringifyLocator(r);o[e]={value:[r,B.Type.LOCATOR],children:n}}const g=d.stringifyLocator(c);n[g]={value:[{descriptor:s,locator:c},B.Type.DEPENDENT]}}}return i}(t,A,{configuration:e,peers:this.peers});le.emitTree(n,{configuration:e,stdout:this.context.stdout,json:this.json,separators:1})}}Je.usage=C.Command.Usage({description:"display the reason why a package is needed",details:'\n This command prints the exact reasons why a package appears in the dependency tree.\n\n If `-R,--recursive` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named "Foo" when looking for "Bar", it means that "Foo" already got printed higher in the tree.\n ',examples:[["Explain why lodash is used in your project","$0 why lodash"]]}),(0,a.gn)([C.Command.String()],Je.prototype,"package",void 0),(0,a.gn)([C.Command.Boolean("-R,--recursive",{description:"List, for each workspace, what are all the paths that lead to the dependency"})],Je.prototype,"recursive",void 0),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],Je.prototype,"json",void 0),(0,a.gn)([C.Command.Boolean("--peers",{description:"Also print the peer dependencies that match the specified name"})],Je.prototype,"peers",void 0),(0,a.gn)([C.Command.Path("why")],Je.prototype,"execute",null);class qe extends c.BaseCommand{constructor(){super(...arguments),this.verbose=!1,this.json=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t}=await h.I.find(e,this.context.cwd);return(await p.Pk.start({configuration:e,json:this.json,stdout:this.context.stdout},async e=>{for(const r of t.workspaces){const{manifest:A}=r;let n;if(this.verbose){const e=new Set,r=new Set;for(const n of E.G.hardDependencies)for(const[o,i]of A.getForScope(n)){const A=t.tryWorkspaceByDescriptor(i);null===A?t.workspacesByIdent.has(o)&&r.add(i):e.add(A)}n={workspaceDependencies:Array.from(e).map(e=>e.relativeCwd),mismatchedWorkspaceDependencies:Array.from(r).map(e=>d.stringifyDescriptor(e))}}e.reportInfo(null,""+r.relativeCwd),e.reportJson({location:r.relativeCwd,name:A.name?d.stringifyIdent(A.name):null,...n})}})).exitCode()}}qe.usage=C.Command.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project. If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\n "}),(0,a.gn)([C.Command.Boolean("-v,--verbose",{description:"Also return the cross-dependencies between workspaces"})],qe.prototype,"verbose",void 0),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],qe.prototype,"json",void 0),(0,a.gn)([C.Command.Path("workspaces","list")],qe.prototype,"execute",null);class ze extends C.Command{constructor(){super(...arguments),this.args=[]}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await h.I.find(e,this.context.cwd);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);const A=t.workspaces,n=new Map(A.map(e=>{const t=d.convertToIdent(e.locator);return[d.stringifyIdent(t),e]})),o=n.get(this.workspaceName);if(void 0===o){const e=Array.from(n.keys()).sort();throw new C.UsageError(`Workspace '${this.workspaceName}' not found. Did you mean any of the following:\n - ${e.join("\n - ")}?`)}return this.cli.run([this.commandName,...this.args],{cwd:o.cwd})}}ze.usage=C.Command.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:"\n This command will run a given sub-command on a single workspace.\n ",examples:[["Add a package to a single workspace","yarn workspace components add -D react"],["Run build script on a single workspace","yarn workspace components run build"]]}),(0,a.gn)([C.Command.String()],ze.prototype,"workspaceName",void 0),(0,a.gn)([C.Command.String()],ze.prototype,"commandName",void 0),(0,a.gn)([C.Command.Proxy()],ze.prototype,"args",void 0),(0,a.gn)([C.Command.Path("workspace")],ze.prototype,"execute",null);const We={configuration:{enableImmutableInstalls:{description:"If true, prevents the install command from modifying the lockfile",type:s.a2.BOOLEAN,default:!1},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:s.a2.STRING,values:["^","~",""],default:o.CARET}},commands:[L,j,q,Ge,ve,we,qe,re,Ae,ne,ie,M,x,z,te,ae,ge,ue,de,Ce,fe,Le,Re,Pe,Me,Oe,Ue,Te,je,Ye,He,Je,ze]}},68023:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>E,fileUtils:()=>A});var A={};r.r(A),r.d(A,{makeArchiveFromLocator:()=>p,makeBufferFromLocator:()=>d,makeLocator:()=>h,makeSpec:()=>u,parseSpec:()=>l});var n=r(54143),o=r(46009);const i=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,s=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/;var a=r(73632),c=r(72785),g=r(75448);function l(e){const{params:t,selector:r}=n.parseRange(e),A=o.cS.toPortablePath(r);return{parentLocator:t&&"string"==typeof t.locator?n.parseLocator(t.locator):null,path:A}}function u({parentLocator:e,path:t,folderHash:r,protocol:A}){const o=null!==e?{locator:n.stringifyLocator(e)}:{},i=void 0!==r?{hash:r}:{};return n.makeRange({protocol:A,source:t,selector:t,params:{...i,...o}})}function h(e,{parentLocator:t,path:r,folderHash:A,protocol:o}){return n.makeLocator(e,u({parentLocator:t,path:r,folderHash:A,protocol:o}))}async function p(e,{protocol:t,fetchOptions:r,inMemory:A=!1}){const{parentLocator:i,path:s}=n.parseFileStyleRange(e.reference,{protocol:t}),l=o.y1.isAbsolute(s)?{packageFs:new g.M(o.LZ.root),prefixPath:o.LZ.dot,localPath:o.LZ.root}:await r.fetcher.fetch(i,r),u=l.localPath?{packageFs:new g.M(o.LZ.root),prefixPath:o.y1.relative(o.LZ.root,l.localPath)}:l;l!==u&&l.releaseFs&&l.releaseFs();const h=u.packageFs,p=o.y1.join(u.prefixPath,s);return await a.releaseAfterUseAsync(async()=>await c.makeArchiveFromDirectory(p,{baseFs:h,prefixPath:n.getIdentVendorPath(e),compressionLevel:r.project.configuration.get("compressionLevel"),inMemory:A}),u.releaseFs)}async function d(e,{protocol:t,fetchOptions:r}){return(await p(e,{protocol:t,fetchOptions:r,inMemory:!0})).getBufferAndClose()}var C=r(20624),f=r(32485),I=r(46611);const E={fetchers:[class{supports(e,t){return!!s.test(e.reference)&&!!e.reference.startsWith("file:")}getLocalPath(e,t){return null}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,[A,o,i]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,n.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from the disk"),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:A,releaseFs:o,prefixPath:n.getIdentVendorPath(e),checksum:i}}async fetchFromDisk(e,t){const{parentLocator:r,path:A}=n.parseFileStyleRange(e.reference,{protocol:"file:"}),i=o.y1.isAbsolute(A)?{packageFs:new g.M(o.LZ.root),prefixPath:o.LZ.dot,localPath:o.LZ.root}:await t.fetcher.fetch(r,t),s=i.localPath?{packageFs:new g.M(o.LZ.root),prefixPath:o.y1.relative(o.LZ.root,i.localPath)}:i;i!==s&&i.releaseFs&&i.releaseFs();const l=s.packageFs,u=o.y1.join(s.prefixPath,A),h=await l.readFilePromise(u);return await a.releaseAfterUseAsync(async()=>await c.convertToZip(h,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:n.getIdentVendorPath(e),stripComponents:1}),s.releaseFs)}},class{supports(e,t){return!!e.reference.startsWith("file:")}getLocalPath(e,t){const{parentLocator:r,path:A}=n.parseFileStyleRange(e.reference,{protocol:"file:"});if(o.y1.isAbsolute(A))return A;const i=t.fetcher.getLocalPath(r,t);return null===i?null:o.y1.resolve(i,A)}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,[A,o,i]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,n.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from the disk"),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:A,releaseFs:o,prefixPath:n.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:i}}async fetchFromDisk(e,t){return p(e,{protocol:"file:",fetchOptions:t})}}],resolvers:[class{supportsDescriptor(e,t){return!!s.test(e.range)&&(!!e.range.startsWith("file:")||!!i.test(e.range))}supportsLocator(e,t){return!!s.test(e.reference)&&!!e.reference.startsWith("file:")}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,r){return i.test(e.range)&&(e=n.makeDescriptor(e,"file:"+e.range)),n.bindDescriptor(e,{locator:n.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){let A=e.range;return A.startsWith("file:")&&(A=A.slice("file:".length)),[n.makeLocator(e,"file:"+o.cS.toPortablePath(A))]}async getSatisfying(e,t,r){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");const r=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),A=await a.releaseAfterUseAsync(async()=>await I.G.find(r.prefixPath,{baseFs:r.packageFs}),r.releaseFs);return{...e,version:A.version||"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:f.Un.HARD,dependencies:A.dependencies,peerDependencies:A.peerDependencies,dependenciesMeta:A.dependenciesMeta,peerDependenciesMeta:A.peerDependenciesMeta,bin:A.bin}}},class{supportsDescriptor(e,t){return!!e.range.match(i)||!!e.range.startsWith("file:")}supportsLocator(e,t){return!!e.reference.startsWith("file:")}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,r){return i.test(e.range)&&(e=n.makeDescriptor(e,"file:"+e.range)),n.bindDescriptor(e,{locator:n.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");const{path:A,parentLocator:o}=l(e.range);if(null===o)throw new Error("Assertion failed: The descriptor should have been bound");const i=await d(n.makeLocator(e,n.makeRange({protocol:"file:",source:A,selector:A,params:{locator:n.stringifyLocator(o)}})),{protocol:"file:",fetchOptions:r.fetchOptions});return[h(e,{parentLocator:o,path:A,folderHash:C.makeHash("1",i).slice(0,6),protocol:"file:"})]}async getSatisfying(e,t,r){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");const r=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),A=await a.releaseAfterUseAsync(async()=>await I.G.find(r.prefixPath,{baseFs:r.packageFs}),r.releaseFs);return{...e,version:A.version||"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:f.Un.HARD,dependencies:A.dependencies,peerDependencies:A.peerDependencies,dependenciesMeta:A.dependenciesMeta,peerDependenciesMeta:A.peerDependenciesMeta,bin:A.bin}}}]}},75641:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>F,gitUtils:()=>A});var A={};r.r(A),r.d(A,{TreeishProtocols:()=>y,clone:()=>S,isGitUrl:()=>m,lsRemote:()=>b,normalizeLocator:()=>D,normalizeRepoUrl:()=>Q,resolveUrl:()=>v,splitRepoUrl:()=>w});var n=r(39922),o=r(54143),i=r(63088),s=r(73632),a=r(72785),c=r(43896),g=r(46009),l=r(79669),u=r(6220),h=r(71191),p=r.n(h),d=r(53887),C=r.n(d),f=r(78835),I=r.n(f);function E(){return{...process.env,GIT_SSH_COMMAND:"ssh -o BatchMode=yes"}}const B=[/^ssh:/,/^git(?:\+[^:]+)?:/,/^(?:git\+)?https?:[^#]+\/[^#]+(?:\.git)(?:#.*)?$/,/^git@[^#]+\/[^#]+\.git(?:#.*)?$/,/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z._0-9-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\.git)?(?:#.*)?$/,/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/];var y;function m(e){return!!e&&B.some(t=>!!e.match(t))}function w(e){const t=(e=Q(e)).indexOf("#");if(-1===t)return{repo:e,treeish:{protocol:y.Head,request:"master"},extra:{}};const r=e.slice(0,t),A=e.slice(t+1);if(A.match(/^[a-z]+=/)){const e=p().parse(A);for(const[t,r]of Object.entries(e))if("string"!=typeof r)throw new Error(`Assertion failed: The ${t} parameter must be a literal string`);const t=Object.values(y).find(t=>Object.prototype.hasOwnProperty.call(e,t));let n,o;void 0!==t?(n=t,o=e[t]):(n=y.Head,o="master");for(const t of Object.values(y))delete e[t];return{repo:r,treeish:{protocol:n,request:o},extra:e}}{const e=A.indexOf(":");let t,n;return-1===e?(t=null,n=A):(t=A.slice(0,e),n=A.slice(e+1)),{repo:r,treeish:{protocol:t,request:n},extra:{}}}}function Q(e,{git:t=!1}={}){var r;if(e=(e=(e=e.replace(/^git\+https:/,"https:")).replace(/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3")).replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),t){let t;e=e.replace(/^git\+([^:]+):/,"$1:");try{t=I().parse(e)}catch(e){t=null}t&&"ssh:"===t.protocol&&(null===(r=t.path)||void 0===r?void 0:r.startsWith("/:"))&&(e=e.replace(/^ssh:\/\//,""))}return e}function D(e){return o.makeLocator(e,Q(e.reference))}async function b(e,t){const r=Q(e,{git:!0});if(!l.getNetworkSettings(r,{configuration:t}).enableNetwork)throw new Error(`Request to '${r}' has been blocked because of your configuration settings`);let A;try{A=await u.execvp("git",["ls-remote","--refs",r],{cwd:t.startingCwd,env:E(),strict:!0})}catch(t){throw t.message=`Listing the refs for ${e} failed`,t}const n=new Map,o=/^([a-f0-9]{40})\t(refs\/[^\n]+)/gm;let i;for(;null!==(i=o.exec(A.stdout));)n.set(i[2],i[1]);return n}async function v(e,t){const{repo:r,treeish:{protocol:A,request:n},extra:o}=w(e),i=await b(r,t),s=(e,t)=>{switch(e){case y.Commit:if(!t.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return p().stringify({...o,commit:t});case y.Head:{const e=i.get("refs/heads/"+t);if(void 0===e)throw new Error(`Unknown head ("${t}")`);return p().stringify({...o,commit:e})}case y.Tag:{const e=i.get("refs/tags/"+t);if(void 0===e)throw new Error(`Unknown tag ("${t}")`);return p().stringify({...o,commit:e})}case y.Semver:{if(!C().validRange(t))throw new Error(`Invalid range ("${t}")`);const e=new Map([...i.entries()].filter(([e])=>e.startsWith("refs/tags/")).map(([e,t])=>[C().parse(e.slice(10)),t]).filter(e=>null!==e[0])),r=C().maxSatisfying([...e.keys()],t);if(null===r)throw new Error(`No matching range ("${t}")`);return p().stringify({...o,commit:e.get(r)})}case null:{let e;if(null!==(e=a(y.Commit,t)))return e;if(null!==(e=a(y.Tag,t)))return e;if(null!==(e=a(y.Head,t)))return e;throw t.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${t}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${t}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${e}")`)}},a=(e,t)=>{try{return s(e,t)}catch(e){return null}};return`${r}#${s(A,n)}`}async function S(e,t){return await t.getLimit("cloneConcurrency")(async()=>{const{repo:r,treeish:{protocol:A,request:n}}=w(e);if("commit"!==A)throw new Error("Invalid treeish protocol when cloning");const o=Q(r,{git:!0});if(!1===l.getNetworkSettings(o,{configuration:t}).enableNetwork)throw new Error(`Request to '${o}' has been blocked because of your configuration settings`);const i=await c.xfs.mktempPromise(),s={cwd:i,env:E(),strict:!0};try{await u.execvp("git",["clone","-c core.autocrlf=false",o,g.cS.fromPortablePath(i)],s),await u.execvp("git",["checkout",""+n],s)}catch(e){throw e.message="Repository clone failed: "+e.message,e}return i})}!function(e){e.Commit="commit",e.Head="head",e.Tag="tag",e.Semver="semver"}(y||(y={}));var k=r(32485),N=r(46611);const F={configuration:{cloneConcurrency:{description:"Maximal number of concurrent clones",type:n.a2.NUMBER,default:2}},fetchers:[class{supports(e,t){return m(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,A=D(e),n=new Map(t.checksums);n.set(A.locatorHash,r);const i={...t,checksums:n},s=await this.downloadHosted(A,i);if(null!==s)return s;const[a,c,g]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,o.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from the remote repository"),loader:()=>this.cloneFromRemote(A,i),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:a,releaseFs:c,prefixPath:o.getIdentVendorPath(e),checksum:g}}async downloadHosted(e,t){return t.project.configuration.reduceHook(e=>e.fetchHostedRepository,null,e,t)}async cloneFromRemote(e,t){const r=await S(e.reference,t.project.configuration),A=w(e.reference),n=g.y1.join(r,"package.tgz");await i.prepareExternalProject(r,n,{configuration:t.project.configuration,report:t.report,workspace:A.extra.workspace});const l=await c.xfs.readFilePromise(n);return await s.releaseAfterUseAsync(async()=>await a.convertToZip(l,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:o.getIdentVendorPath(e),stripComponents:1}))}}],resolvers:[class{supportsDescriptor(e,t){return m(e.range)}supportsLocator(e,t){return m(e.reference)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){const A=await v(e.range,r.project.configuration);return[o.makeLocator(e,A)]}async getSatisfying(e,t,r){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");const r=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),A=await s.releaseAfterUseAsync(async()=>await N.G.find(r.prefixPath,{baseFs:r.packageFs}),r.releaseFs);return{...e,version:A.version||"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:k.Un.HARD,dependencies:A.dependencies,peerDependencies:A.peerDependencies,dependenciesMeta:A.dependenciesMeta,peerDependenciesMeta:A.peerDependenciesMeta,bin:A.bin}}}]}},68126:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>d});var A=r(54143),n=r(79669),o=r(72785),i=r(63088),s=r(43896),a=r(75448),c=r(46009),g=r(75641),l=r(71191),u=r.n(l);const h=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];class p{supports(e,t){return!(!(r=e.reference)||!h.some(e=>!!r.match(e)));var r}getLocalPath(e,t){return null}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,[n,o,i]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,A.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from GitHub"),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:n,releaseFs:o,prefixPath:A.getIdentVendorPath(e),checksum:i}}async fetchFromNetwork(e,t){const r=await n.get(this.getLocatorUrl(e,t),{configuration:t.project.configuration});return await s.xfs.mktempPromise(async n=>{const l=new a.M(n);await o.extractArchiveTo(r,l,{stripComponents:1});const u=g.gitUtils.splitRepoUrl(e.reference),h=c.y1.join(n,"package.tgz");await i.prepareExternalProject(n,h,{configuration:t.project.configuration,report:t.report,workspace:u.extra.workspace});const p=await s.xfs.readFilePromise(h);return await o.convertToZip(p,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:A.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,t){const{auth:r,username:A,reponame:n,treeish:o}=function(e){let t;for(const r of h)if(t=e.match(r),t)break;if(!t)throw new Error(`Input cannot be parsed as a valid GitHub URL ('${e}').`);let[,r,A,n,o="master"]=t;const{commit:i}=u().parse(o);return o=i||o.replace(/[^:]*:/,""),{auth:r,username:A,reponame:n,treeish:o}}(e.reference);return`https://${r?r+"@":""}github.com/${A}/${n}/archive/${o}.tar.gz`}}const d={hooks:{async fetchHostedRepository(e,t,r){if(null!==e)return e;const A=new p;if(!A.supports(t,r))return null;try{return await A.fetch(t,r)}catch(e){return null}}}}},99148:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>l});var A=r(54143),n=r(79669),o=r(72785);const i=/^[^?]*\.(?:tar\.gz|tgz)(?:\?.*)?$/,s=/^https?:/;var a=r(46611),c=r(32485),g=r(73632);const l={fetchers:[class{supports(e,t){return!!i.test(e.reference)&&!!s.test(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,[n,o,i]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,A.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from the remote server"),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:n,releaseFs:o,prefixPath:A.getIdentVendorPath(e),checksum:i}}async fetchFromNetwork(e,t){const r=await n.get(e.reference,{configuration:t.project.configuration});return await o.convertToZip(r,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:A.getIdentVendorPath(e),stripComponents:1})}}],resolvers:[class{supportsDescriptor(e,t){return!!i.test(e.range)&&!!s.test(e.range)}supportsLocator(e,t){return!!i.test(e.reference)&&!!s.test(e.reference)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){return[A.convertDescriptorToLocator(e)]}async getSatisfying(e,t,r){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");const r=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),A=await g.releaseAfterUseAsync(async()=>await a.G.find(r.prefixPath,{baseFs:r.packageFs}),r.releaseFs);return{...e,version:A.version||"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:c.Un.HARD,dependencies:A.dependencies,peerDependencies:A.peerDependencies,dependenciesMeta:A.dependenciesMeta,peerDependenciesMeta:A.peerDependenciesMeta,bin:A.bin}}}]}},64314:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>I});var A=r(39922),n=r(36370),o=r(25413),i=r(46611),s=r(85824),a=r(6220),c=r(63088),g=r(54143),l=r(43896),u=r(46009),h=r(40822),p=r(80305),d=r.n(p),C=r(31669);class f extends o.BaseCommand{constructor(){super(...arguments),this.usev2=!1,this.assumeFreshProject=!1,this.yes=!1,this.private=!1,this.workspace=!1,this.install=!1}async execute(){if(l.xfs.existsSync(u.y1.join(this.context.cwd,i.G.fileName)))throw new h.UsageError("A package.json already exists in the specified directory");const e=await A.VK.find(this.context.cwd,this.context.plugins),t=this.install?!0===this.install?"latest":this.install:null;return null!==t?await this.executeProxy(e,t):await this.executeRegular(e)}async executeProxy(e,t){if(null!==e.get("yarnPath"))throw new h.UsageError(`Cannot use the --install flag when the current directory already uses yarnPath (from ${e.sources.get("yarnPath")})`);if(null!==e.projectCwd)throw new h.UsageError("Cannot use the --install flag when the current directory is already part of a project");l.xfs.existsSync(this.context.cwd)||await l.xfs.mkdirPromise(this.context.cwd,{recursive:!0});const r=u.y1.join(this.context.cwd,e.get("lockfileFilename"));l.xfs.existsSync(r)||await l.xfs.writeFilePromise(r,"");const A=await this.cli.run(["set","version",t]);if(0!==A)return A;this.context.stdout.write("\n");const n=["--assume-fresh-project"];return this.private&&n.push("-p"),this.workspace&&n.push("-w"),this.yes&&n.push("-y"),await l.xfs.mktempPromise(async e=>{const{code:t}=await a.pipevp("yarn",["init",...n],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await c.makeScriptEnv({binFolder:e})});return t})}async executeRegular(e){let t=null;if(!this.assumeFreshProject)try{t=await s.I.find(e,this.context.cwd)}catch(e){t=null}l.xfs.existsSync(this.context.cwd)||await l.xfs.mkdirPromise(this.context.cwd,{recursive:!0});const r=new i.G,A=Object.fromEntries(e.get("initFields").entries());r.load(A),r.name=g.makeIdent(e.get("initScope"),u.y1.basename(this.context.cwd)),r.version=e.get("initVersion"),r.private=this.private||this.workspace,r.license=e.get("initLicense"),this.workspace&&(await l.xfs.mkdirPromise(u.y1.join(this.context.cwd,"packages"),{recursive:!0}),r.workspaceDefinitions=[{pattern:"packages/*"}]);const n={};r.exportTo(n),C.inspect.styles.name="cyan",this.context.stdout.write((0,C.inspect)(n,{depth:1/0,colors:!0,compact:!1})+"\n");const o=u.y1.join(this.context.cwd,i.G.fileName);await l.xfs.changeFilePromise(o,JSON.stringify(n,null,2)+"\n");const c=u.y1.join(this.context.cwd,"README.md");if(l.xfs.existsSync(c)||await l.xfs.writeFilePromise(c,`# ${g.stringifyIdent(r.name)}\n`),!t){const t=u.y1.join(this.context.cwd,u.QS.lockfile);await l.xfs.writeFilePromise(t,"");const r=["/.yarn/** linguist-vendored"].map(e=>e+"\n").join(""),A=u.y1.join(this.context.cwd,".gitattributes");l.xfs.existsSync(A)||await l.xfs.writeFilePromise(A,r);const n=["/.yarn/*","!/.yarn/releases","!/.yarn/plugins","!/.yarn/sdks","","# Swap the comments on the following lines if you don't wish to use zero-installs","# Documentation here: https://yarnpkg.com/features/zero-installs","!/.yarn/cache","#/.pnp.*"].map(e=>e+"\n").join(""),o=u.y1.join(this.context.cwd,".gitignore");l.xfs.existsSync(o)||await l.xfs.writeFilePromise(o,n);const i={"*":{endOfLine:"lf",insertFinalNewline:!0},"*.{js,json,.yml}":{charset:"utf-8",indentStyle:"space",indentSize:2}};d()(i,e.get("initEditorConfig"));let s="root = true\n";for(const[e,t]of Object.entries(i)){s+=`\n[${e}]\n`;for(const[e,r]of Object.entries(t)){s+=`${e.replace(/[A-Z]/g,e=>"_"+e.toLowerCase())} = ${r}\n`}}const c=u.y1.join(this.context.cwd,".editorconfig");l.xfs.existsSync(c)||await l.xfs.writeFilePromise(c,s),await a.execvp("git",["init"],{cwd:this.context.cwd})}}}f.usage=h.Command.Usage({description:"create a new package",details:"\n This command will setup a new package in your local directory.\n\n If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\n\n If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\n\n If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\n\n The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\n ",examples:[["Create a new package in the local directory","yarn init"],["Create a new private package in the local directory","yarn init -p"],["Create a new package and store the Yarn release inside","yarn init -i latest"],["Create a new private package and defines it as a workspace root","yarn init -w"]]}),(0,n.gn)([h.Command.Boolean("-2",{hidden:!0})],f.prototype,"usev2",void 0),(0,n.gn)([h.Command.Boolean("--assume-fresh-project",{hidden:!0})],f.prototype,"assumeFreshProject",void 0),(0,n.gn)([h.Command.Boolean("-y,--yes",{hidden:!0})],f.prototype,"yes",void 0),(0,n.gn)([h.Command.Boolean("-p,--private",{description:"Initialize a private package"})],f.prototype,"private",void 0),(0,n.gn)([h.Command.Boolean("-w,--workspace",{description:"Initialize a private workspace root with a `packages/` directory"})],f.prototype,"workspace",void 0),(0,n.gn)([h.Command.String("-i,--install",{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"})],f.prototype,"install",void 0),(0,n.gn)([h.Command.Path("init")],f.prototype,"execute",null);const I={configuration:{initLicense:{description:"License used when creating packages via the init command",type:A.a2.STRING,default:null},initScope:{description:"Scope used when creating packages via the init command",type:A.a2.STRING,default:null},initVersion:{description:"Version used when creating packages via the init command",type:A.a2.STRING,default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:A.a2.MAP,valueDefinition:{description:"",type:A.a2.ANY}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:A.a2.MAP,valueDefinition:{description:"",type:A.a2.ANY}}},commands:[f]}},92994:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>g});var A=r(54143),n=r(46009),o=r(75448),i=r(10489);var s=r(46611),a=r(32485),c=r(73632);const g={fetchers:[class{supports(e,t){return!!e.reference.startsWith("link:")}getLocalPath(e,t){const{parentLocator:r,path:o}=A.parseFileStyleRange(e.reference,{protocol:"link:"});if(n.y1.isAbsolute(o))return o;const i=t.fetcher.getLocalPath(r,t);return null===i?null:n.y1.resolve(i,o)}async fetch(e,t){const{parentLocator:r,path:s}=A.parseFileStyleRange(e.reference,{protocol:"link:"}),a=n.y1.isAbsolute(s)?{packageFs:new o.M(n.LZ.root),prefixPath:n.LZ.dot,localPath:n.LZ.root}:await t.fetcher.fetch(r,t),c=a.localPath?{packageFs:new o.M(n.LZ.root),prefixPath:n.y1.relative(n.LZ.root,a.localPath)}:a;a!==c&&a.releaseFs&&a.releaseFs();const g=c.packageFs,l=n.y1.join(c.prefixPath,s);return a.localPath?{packageFs:new o.M(l,{baseFs:g}),releaseFs:c.releaseFs,prefixPath:n.LZ.dot,discardFromLookup:!0,localPath:l}:{packageFs:new i.n(l,{baseFs:g}),releaseFs:c.releaseFs,prefixPath:n.LZ.dot,discardFromLookup:!0}}},class{supports(e,t){return!!e.reference.startsWith("portal:")}getLocalPath(e,t){const{parentLocator:r,path:o}=A.parseFileStyleRange(e.reference,{protocol:"portal:"});if(n.y1.isAbsolute(o))return o;const i=t.fetcher.getLocalPath(r,t);return null===i?null:n.y1.resolve(i,o)}async fetch(e,t){const{parentLocator:r,path:s}=A.parseFileStyleRange(e.reference,{protocol:"portal:"}),a=n.y1.isAbsolute(s)?{packageFs:new o.M(n.LZ.root),prefixPath:n.LZ.dot,localPath:n.LZ.root}:await t.fetcher.fetch(r,t),c=a.localPath?{packageFs:new o.M(n.LZ.root),prefixPath:n.y1.relative(n.LZ.root,a.localPath)}:a;a!==c&&a.releaseFs&&a.releaseFs();const g=c.packageFs,l=n.y1.join(c.prefixPath,s);return a.localPath?{packageFs:new o.M(l,{baseFs:g}),releaseFs:c.releaseFs,prefixPath:n.LZ.dot,localPath:l}:{packageFs:new i.n(l,{baseFs:g}),releaseFs:c.releaseFs,prefixPath:n.LZ.dot}}}],resolvers:[class{supportsDescriptor(e,t){return!!e.range.startsWith("link:")}supportsLocator(e,t){return!!e.reference.startsWith("link:")}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,r){return A.bindDescriptor(e,{locator:A.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){const o=e.range.slice("link:".length);return[A.makeLocator(e,"link:"+n.cS.toPortablePath(o))]}async getSatisfying(e,t,r){return null}async resolve(e,t){return{...e,version:"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:a.Un.SOFT,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map}}},class{supportsDescriptor(e,t){return!!e.range.startsWith("portal:")}supportsLocator(e,t){return!!e.reference.startsWith("portal:")}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,r){return A.bindDescriptor(e,{locator:A.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){const o=e.range.slice("portal:".length);return[A.makeLocator(e,"portal:"+n.cS.toPortablePath(o))]}async getSatisfying(e,t,r){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");const r=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),A=await c.releaseAfterUseAsync(async()=>await s.G.find(r.prefixPath,{baseFs:r.packageFs}),r.releaseFs);return{...e,version:A.version||"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:a.Un.SOFT,dependencies:new Map([...A.dependencies,...A.devDependencies]),peerDependencies:A.peerDependencies,dependenciesMeta:A.dependenciesMeta,peerDependenciesMeta:A.peerDependenciesMeta,bin:A.bin}}}]}},8375:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>ne,getPnpPath:()=>Ae});var A,n=r(39922),o=r(46009),i=r(54143);!function(e){e[e.YES=0]="YES",e[e.NO=1]="NO",e[e.DEPENDS=2]="DEPENDS"}(A||(A={}));const s=(e,t)=>`${e}@${t}`,a=(e,t)=>{const r=t.indexOf("#"),A=r>=0?t.substring(r+1):t;return s(e,A)};var c;!function(e){e[e.NONE=-1]="NONE",e[e.PERF=0]="PERF",e[e.CHECK=1]="CHECK",e[e.REASONS=2]="REASONS",e[e.INTENSIVE_CHECK=9]="INTENSIVE_CHECK"}(c||(c={}));const g=(e,t)=>{if(t.decoupled)return t;const{name:r,references:A,ident:n,locator:o,dependencies:i,originalDependencies:s,hoistedDependencies:a,peerNames:c,reasons:g,isHoistBorder:l}=t,u={name:r,references:new Set(A),ident:n,locator:o,dependencies:new Map(i),originalDependencies:new Map(s),hoistedDependencies:new Map(a),peerNames:new Set(c),reasons:new Map(g),decoupled:!0,isHoistBorder:l},h=u.dependencies.get(r);return h&&h.ident==u.ident&&u.dependencies.set(r,u),e.dependencies.set(u.name,u),u},l=e=>{const t=new Set,r=(A,n=new Set)=>{if(!n.has(A)){n.add(A);for(const o of A.peerNames)if(!e.peerNames.has(o)){const A=e.dependencies.get(o);A&&!t.has(A)&&r(A,n)}t.add(A)}};for(const t of e.dependencies.values())e.peerNames.has(t.name)||r(t);return t},u=(e,t,r,A,n=new Set)=>{const o=t[t.length-1];if(n.has(o))return;n.add(o);const i=((e,t)=>{const r=new Map([[e.name,[e.ident]]]);for(const t of e.dependencies.values())e.peerNames.has(t.name)||r.set(t.name,[t.ident]);const A=Array.from(t.keys());A.sort((e,r)=>{const A=t.get(e),n=t.get(r);return n.peerDependents.size!==A.peerDependents.size?n.peerDependents.size-A.peerDependents.size:n.dependents.size-A.dependents.size});for(const t of A){const A=t.substring(0,t.indexOf("@",1)),n=t.substring(A.length+1);if(!e.peerNames.has(A)){let e=r.get(A);e||(e=[],r.set(A,e)),e.indexOf(n)<0&&e.push(n)}}return r})(o,E(o)),s=new Map(Array.from(i.entries()).map(([e,t])=>[e,t[0]])),a=o===e?new Map:(e=>{const t=new Map,r=new Set,A=n=>{if(!r.has(n)){r.add(n);for(const r of n.hoistedDependencies.values())e.dependencies.has(r.name)||t.set(r.name,r);for(const e of n.dependencies.values())n.peerNames.has(e.name)||A(e)}};return A(e),t})(o);let c;do{p(e,t,r,a,s,i,A),c=!1;for(const[e,t]of i)t.length>1&&!o.dependencies.has(e)&&(s.delete(e),t.shift(),s.set(e,t[0]),c=!0)}while(c);for(const n of o.dependencies.values())o.peerNames.has(n.name)||r.has(n.locator)||(r.add(n.locator),u(e,[...t,n],r,A),r.delete(n.locator))},h=(e,t,r,n,o,i,{outputReason:s})=>{let a,c=null,g=new Set;s&&(a=""+Array.from(e).map(e=>B(e)).join("→"));const l=t[t.length-1],u=r.ident===l.ident,h=o.get(r.name);let p=h===r.ident&&!u;if(s&&!p&&h&&!u&&(c=`- filled by: ${B(i.get(r.name)[0])} at ${a}`),p){let e=!1;const A=n.get(r.name);if(e=!A||A.ident===r.ident,s&&!e&&(c=`- filled by: ${B(A.locator)} at ${a}`),e)for(let A=1;A=1;r--){const n=t[r];for(const o of A){if(n.peerNames.has(o)&&n.originalDependencies.has(o))continue;const i=n.dependencies.get(o);i&&(r===t.length-1?g.add(i):(g=null,e=!1,s&&(c=`- peer dependency ${B(i.locator)} from parent ${B(n.locator)} was not hoisted to ${a}`))),A.delete(o)}if(!e)break}p=e}return null!==g&&g.size>0?{isHoistable:A.DEPENDS,dependsOn:g,reason:c}:{isHoistable:p?A.YES:A.NO,reason:c}},p=(e,t,r,n,o,i,s)=>{const a=t[t.length-1],u=new Set,p=(t,C,I,E)=>{if(u.has(I))return;const m=[...C,I.locator],w=new Map,Q=new Map;for(const e of l(I)){let g=null;if(g||(g=h(r,[a,...t,I],e,n,o,i,{outputReason:s.debugLevel>=c.REASONS})),Q.set(e,g),g.isHoistable===A.DEPENDS)for(const t of g.dependsOn){const r=w.get(t.name)||new Set;r.add(e.name),w.set(t.name,r)}}const D=new Set,b=(e,t,r)=>{if(!D.has(e)){D.add(e),e.ident!==I.ident&&Q.set(e,{isHoistable:A.NO,reason:r});for(const A of w.get(e.name)||[])b(I.dependencies.get(A),t,r)}};let v;s.debugLevel>=c.REASONS&&(v=""+Array.from(r).map(e=>B(e)).join("→"));for(const[e,t]of Q)t.isHoistable===A.NO&&b(e,t,`- peer dependency ${B(e.locator)} from parent ${B(I.locator)} was not hoisted to ${v}`);for(const e of Q.keys())if(!D.has(e)){I.dependencies.delete(e.name),I.hoistedDependencies.set(e.name,e),I.reasons.delete(e.name);const t=a.dependencies.get(e.name);if(t)for(const r of e.references)t.references.add(r);else a.ident!==e.ident&&(a.dependencies.set(e.name,e),E.add(e))}if(s.check){const r=d(e);if(r)throw new Error(`${r}, after hoisting dependencies of ${[a,...t,I].map(e=>B(e.locator)).join("→")}:\n${y(e)}`)}const S=l(I);for(const e of S)if(D.has(e)&&m.indexOf(e.locator)<0){const r=Q.get(e);if(r.isHoistable!==A.YES&&I.reasons.set(e.name,r.reason),!e.isHoistBorder){u.add(I);const r=g(I,e);p([...t,I],[...C,I.locator],r,f),u.delete(I)}}};let C,f=new Set(l(a));do{C=f,f=new Set;for(const e of C){if(e.locator===a.locator||e.isHoistBorder)continue;const t=g(a,e);p([],Array.from(r),t,f)}}while(f.size>0)},d=e=>{const t=[],r=new Set,A=new Set,n=(e,o)=>{if(r.has(e))return;if(r.add(e),A.has(e))return;const i=new Map(o);for(const t of e.dependencies.values())e.peerNames.has(t.name)||i.set(t.name,t);for(const r of e.originalDependencies.values()){const n=i.get(r.name),s=()=>""+Array.from(A).concat([e]).map(e=>B(e.locator)).join("→");if(e.peerNames.has(r.name)){const e=o.get(r.name);e===n&&e&&e.ident===r.ident||t.push(`${s()} - broken peer promise: expected ${r.ident} but found ${e?e.ident:e}`)}else n?n.ident!==r.ident&&t.push(`${s()} - broken require promise for ${r.name}: expected ${r.ident}, but found: ${n.ident}`):t.push(`${s()} - broken require promise: no required dependency ${r.locator} found`)}A.add(e);for(const t of e.dependencies.values())e.peerNames.has(t.name)||n(t,i);A.delete(e)};return n(e,e.dependencies),t.join("\n")},C=(e,t)=>{const{identName:r,name:A,reference:n,peerNames:o}=e,i={name:A,references:new Set([n]),locator:s(r,n),ident:a(r,n),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(o),reasons:new Map,decoupled:!0,isHoistBorder:!0},c=new Map([[e,i]]),g=(e,r)=>{let A=c.get(e);const n=!!A;if(!A){const{name:n,identName:o,reference:i,peerNames:g}=e,l=t.hoistingLimits.get(r.locator);A={name:n,references:new Set([i]),locator:s(o,i),ident:a(o,i),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(g),reasons:new Map,decoupled:!0,isHoistBorder:!!l&&l.has(n)},c.set(e,A)}if(r.dependencies.set(e.name,A),r.originalDependencies.set(e.name,A),n){const e=new Set,t=r=>{if(!e.has(r)){e.add(r),r.decoupled=!1;for(const e of r.dependencies.values())r.peerNames.has(e.name)||t(e)}};t(A)}else for(const t of e.dependencies)g(t,A)};for(const t of e.dependencies)g(t,i);return i},f=e=>e.substring(0,e.indexOf("@",1)),I=e=>{const t={name:e.name,identName:f(e.locator),references:new Set(e.references),dependencies:new Set},r=new Set([e]),A=(e,t,n)=>{const o=r.has(e);let i;if(t===e)i=n;else{const{name:t,references:r,locator:A}=e;i={name:t,identName:f(A),references:r,dependencies:new Set}}if(n.dependencies.add(i),!o){r.add(e);for(const t of e.dependencies.values())e.peerNames.has(t.name)||A(t,e,i);r.delete(e)}};for(const r of e.dependencies.values())A(r,e,t);return t},E=e=>{const t=new Map,r=new Set([e]),A=e=>{const r=(e=>`${e.name}@${e.ident}`)(e);let A=t.get(r);return A||(A={dependents:new Set,peerDependents:new Set},t.set(r,A)),A},n=(e,t)=>{const o=!!r.has(t);if(A(t).dependents.add(e.ident),!o){r.add(t);for(const e of t.dependencies.values())if(t.peerNames.has(e.name)){A(e).peerDependents.add(t.ident)}else n(t,e)}};for(const t of e.dependencies.values())e.peerNames.has(t.name)||n(e,t);return t},B=e=>{const t=e.indexOf("@",1),r=e.substring(0,t),A=e.substring(t+1);if("workspace:."===A)return".";if(A){const e=(A.indexOf("#")>0?A.split("#")[1]:A).replace("npm:","");return A.startsWith("virtual")?`v:${r}@${e}`:`${r}@${e}`}return""+r},y=e=>{let t=0;const r=(e,A,n="")=>{if(t>5e4||A.has(e))return"";t++;const o=Array.from(e.dependencies.values());let i="";A.add(e);for(let t=0;t":"")+(c!==s.name?`a:${s.name}:`:"")+B(s.locator)+(a?" "+a:"")}\n`,i+=r(s,A,`${n}${t5e4?"\nTree is too large, part of the tree has been dunped\n":"")};var m,w;!function(e){e.HARD="HARD",e.SOFT="SOFT"}(m||(m={})),function(e){e.WORKSPACES="workspaces",e.DEPENDENCIES="dependencies",e.NONE="none"}(w||(w={}));const Q=(e,t)=>{const{packageTree:r,hoistingLimits:A}=b(e,t),n=((e,t={})=>{const r=t.debugLevel||Number(process.env.NM_DEBUG_LEVEL||c.NONE),A={check:t.check||r>=c.INTENSIVE_CHECK,debugLevel:r,hoistingLimits:t.hoistingLimits||new Map};A.debugLevel>=c.PERF&&console.time("hoist");const n=C(e,A);if(u(n,[n],new Set([n.locator]),A),A.debugLevel>=c.PERF&&console.timeEnd("hoist"),A.debugLevel>=c.CHECK){const e=d(n);if(e)throw new Error(`${e}, after hoisting finished:\n${y(n)}`)}return A.debugLevel>=c.REASONS&&console.log(y(n)),I(n)})(r,{hoistingLimits:A});return v(e,n,t)},D=e=>`${e.name}@${e.reference}`;const b=(e,t)=>{const r=e.getDependencyTreeRoots(),A=new Map,n=new Map,s=e.getPackageInformation(e.topLevel);if(null===s)throw new Error("Assertion failed: Expected the top-level package to have been registered");const a=e.findPackageLocator(s.packageLocation);if(null===a)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");const c=o.cS.toPortablePath(s.packageLocation),g=D(a);if(t.project){const e={children:new Map},r=t.project.cwd.split(o.y1.sep);for(const[A,n]of t.project.workspacesByCwd){const t=A.split(o.y1.sep).slice(r.length);let s=e;for(const e of t){let t=s.children.get(e);t||(t={children:new Map},s.children.set(e,t)),s=t}s.workspaceLocator={name:i.stringifyIdent(n.anchoredLocator),reference:n.anchoredLocator.reference}}const A=(e,t)=>{if(e.workspaceLocator){const r=D(t);let A=n.get(r);A||(A=new Set,n.set(r,A)),A.add(e.workspaceLocator)}for(const r of e.children.values())A(r,e.workspaceLocator||t)};for(const t of e.children.values())A(t,e.workspaceLocator)}else for(const e of r)if(e.name!==a.name||e.reference!==a.reference){let t=n.get(g);t||(t=new Set,n.set(g,t)),t.add(e)}const l={name:a.name,identName:a.name,reference:a.reference,peerNames:s.packagePeers,dependencies:new Set},u=new Map,h=(r,s,g,p,d,C,f)=>{var I,E;const B=((e,t)=>`${D(t)}:${e}`)(r,g);let y=u.get(B);const m=!!y;if(m||g.name!==a.name||g.reference!==a.reference||(y=l,u.set(B,l)),y||(y={name:r,identName:g.name,reference:g.reference,dependencies:new Set,peerNames:s.packagePeers},u.set(B,y)),f){const e=D({name:p.identName,reference:p.reference}),t=A.get(e)||new Set;A.set(e,t),t.add(y.name)}const Q=new Map(s.packageDependencies);if(t.project){const e=t.project.workspacesByCwd.get(o.cS.toPortablePath(s.packageLocation.slice(0,-1)));if(e){const t=new Set([...Array.from(e.manifest.peerDependencies.values(),e=>i.stringifyIdent(e)),...Array.from(e.manifest.peerDependenciesMeta.keys())]);for(const e of t)Q.has(e)||(Q.set(e,d.get(e)||null),y.peerNames.add(e))}}const b=D(g),v=n.get(b);if(v)for(const e of v)Q.set(e.name+"$wsroot$",e.reference);p.dependencies.add(y);const S=t.pnpifyFs||!function(e){let t=i.parseDescriptor(e);return i.isVirtualDescriptor(t)&&(t=i.devirtualizeDescriptor(t)),t.range.startsWith("portal:")}(B);if(!m&&S)for(const[r,A]of Q)if(null!==A){const n=e.getLocator(r,A),i=e.getLocator(r.replace("$wsroot$",""),A),s=e.getPackageInformation(i);if(null===s)throw new Error("Assertion failed: Expected the package to have been registered");const a=null===(I=t.hoistingLimitsByCwd)||void 0===I?void 0:I.get(C),g=o.y1.relative(c,o.cS.toPortablePath(s.packageLocation))||o.LZ.dot,l=null===(E=t.hoistingLimitsByCwd)||void 0===E?void 0:E.get(g),u=a===w.DEPENDENCIES||l===w.DEPENDENCIES||l===w.WORKSPACES;h(r,s,n,y,Q,g,u)}};return h(a.name,s,a,l,s.packageDependencies,o.LZ.dot,!1),{packageTree:l,hoistingLimits:A}};const v=(e,t,r)=>{const A=new Map,n=(t,A)=>{const{linkType:n,target:i}=function(e,t,r){const A=t.getLocator(e.name.replace("$wsroot$",""),e.reference),n=t.getPackageInformation(A);if(null===n)throw new Error("Assertion failed: Expected the package to be registered");let i,s;if(r.pnpifyFs)s=o.cS.toPortablePath(n.packageLocation),i=m.SOFT;else{const r=t.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?t.resolveVirtual(n.packageLocation):n.packageLocation;s=o.cS.toPortablePath(r||n.packageLocation),i=n.linkType}return{linkType:i,target:s}}(t,e,r);return{locator:D(t),target:i,linkType:n,aliases:A}},s=e=>{const[t,r]=e.split("/");return r?{scope:(0,o.Zu)(t),name:(0,o.Zu)(r)}:{scope:null,name:(0,o.Zu)(t)}},a=new Set,c=(e,t)=>{if(!a.has(e)){a.add(e);for(const r of e.dependencies){if(r===e||e.identName.endsWith("$wsroot$")&&r.identName===e.identName.replace("$wsroot$",""))continue;const a=Array.from(r.references).sort(),g={name:r.identName,reference:a[0]},{name:l,scope:u}=s(r.name),h=u?[u,l]:[l],p=o.y1.join(t,"node_modules"),d=o.y1.join(p,...h),C=n(g,a.slice(1));if(!r.name.endsWith("$wsroot$")){const e=A.get(d);if(e){if(e.dirList)throw new Error(`Assertion failed: ${d} cannot merge dir node with leaf node`);{const t=i.parseLocator(e.locator),r=i.parseLocator(C.locator);if(e.linkType!==C.linkType)throw new Error(`Assertion failed: ${d} cannot merge nodes with different link types`);if(t.identHash!==r.identHash)throw new Error(`Assertion failed: ${d} cannot merge nodes with different idents ${i.stringifyLocator(t)} and ${i.stringifyLocator(r)}`);C.aliases=[...C.aliases,...e.aliases,i.parseLocator(e.locator).reference]}}A.set(d,C);const t=d.split("/"),r=t.indexOf("node_modules");let n=t.length-1;for(;r>=0&&n>r;){const e=o.cS.toPortablePath(t.slice(0,n).join(o.y1.sep)),r=(0,o.Zu)(t[n]),i=A.get(e);if(i){if(i.dirList){if(i.dirList.has(r))break;i.dirList.add(r)}}else A.set(e,{dirList:new Set([r])});n--}}c(r,C.linkType===m.SOFT?C.target:d)}}},g=n({name:t.name,reference:Array.from(t.references)[0]},[]),l=g.target;return A.set(l,g),c(t,l),A};var S=r(92659),k=r(32485),N=r(73632),F=r(46611),K=r(35691),M=r(43896),R=r(17674),x=r(53660),L=r(65281),P=r(11640),O=r(83228),U=r(58069),T=r.n(U),j=r(40822),Y=r(35747),G=r.n(Y);const H="node_modules";class J{constructor(e){this.opts=e,this.localStore=new Map,this.customData={store:new Map}}getCustomDataKey(){return JSON.stringify({name:"NodeModulesInstaller",version:1})}attachCustomData(e){this.customData=e}async installPackage(e,t){var r;const A=o.y1.resolve(t.packageFs.getRealPath(),t.prefixPath);let n=this.customData.store.get(e.locatorHash);if(void 0===n&&(n=await async function(e,t){var r;const A=null!==(r=await F.G.tryFind(t.prefixPath,{baseFs:t.packageFs}))&&void 0!==r?r:new F.G,n=new Set(["preinstall","install","postinstall"]);for(const e of A.scripts.keys())n.has(e)||A.scripts.delete(e);return{manifest:{bin:A.bin,os:A.os,cpu:A.cpu,scripts:A.scripts},misc:{extractHint:O.jsInstallUtils.getExtractHint(t),hasBindingGyp:O.jsInstallUtils.hasBindingGyp(t)}}}(0,t),e.linkType===k.Un.HARD&&this.customData.store.set(e.locatorHash,n)),!O.jsInstallUtils.checkAndReportManifestCompatibility(e,n,"link",{configuration:this.opts.project.configuration,report:this.opts.report}))return{packageLocation:null,buildDirective:null};const s=new Map,a=new Set;if(s.has(i.stringifyIdent(e))||s.set(i.stringifyIdent(e),e.reference),i.isVirtualLocator(e))for(const t of e.peerDependencies.values())s.set(i.stringifyIdent(t),null),a.add(i.stringifyIdent(t));const c={packageLocation:o.cS.fromPortablePath(A)+"/",packageDependencies:s,packagePeers:a,linkType:e.linkType,discardFromLookup:null!==(r=t.discardFromLookup)&&void 0!==r&&r};return this.localStore.set(e.locatorHash,{pkg:e,customPackageData:n,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:c}),{packageLocation:A,buildDirective:null}}async attachInternalDependencies(e,t){const r=this.localStore.get(e.locatorHash);if(void 0===r)throw new Error("Assertion failed: Expected information object to have been registered");for(const[e,A]of t){const t=i.areIdentsEqual(e,A)?A.reference:[i.requirableIdent(A),A.reference];r.pnpNode.packageDependencies.set(i.requirableIdent(e),t)}}async attachExternalDependents(e,t){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if("node-modules"!==this.opts.project.configuration.get("nodeLinker"))return;const e=new R.p({baseFs:new x.A({libzip:await(0,L.getLibzipPromise)(),maxOpenFiles:80,readOnlyArchives:!0})});let t=await q(this.opts.project);if(null===t){const e=this.opts.project.configuration.get("bstatePath");await M.xfs.existsPromise(e)&&await M.xfs.unlinkPromise(e),t={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map}}const r=new Map(this.opts.project.workspaces.map(e=>{var t,r;let A=this.opts.project.configuration.get("nmHoistingLimits");try{A=N.validateEnum(w,null!==(r=null===(t=e.manifest.installConfig)||void 0===t?void 0:t.hoistingLimits)&&void 0!==r?r:A)}catch(t){const r=i.prettyWorkspace(this.opts.project.configuration,e);this.opts.report.reportWarning(S.b.INVALID_MANIFEST,`${r}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(w).join(", ")}, using default: "${A}"`)}return[e.relativeCwd,A]})),A=(e=>{const t=new Map;for(const[r,A]of e.entries())if(!A.dirList){let e=t.get(A.locator);e||(e={target:A.target,linkType:A.linkType,locations:[],aliases:A.aliases},t.set(A.locator,e)),e.locations.push(r)}for(const e of t.values())e.locations=e.locations.sort((e,t)=>{const r=e.split(o.y1.delimiter).length,A=t.split(o.y1.delimiter).length;return r!==A?A-r:t.localeCompare(e)});return t})(Q({VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(e,t)=>Array.isArray(t)?{name:t[0],reference:t[1]}:{name:e,reference:t},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(e=>{const t=e.anchoredLocator;return{name:i.stringifyIdent(e.locator),reference:t.reference}}),getPackageInformation:e=>{const t=null===e.reference?this.opts.project.topLevelWorkspace.anchoredLocator:i.makeLocator(i.parseIdent(e.name),e.reference),r=this.localStore.get(t.locatorHash);if(void 0===r)throw new Error("Assertion failed: Expected the package reference to have been registered");return r.pnpNode},findPackageLocator:e=>{const t=this.opts.project.tryWorkspaceByCwd(o.cS.toPortablePath(e));if(null!==t){const e=t.anchoredLocator;return{name:i.stringifyIdent(e),reference:e.reference}}throw new Error("Assertion failed: Unimplemented")},resolveToUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveRequest:()=>{throw new Error("Assertion failed: Unimplemented")},resolveVirtual:e=>o.cS.fromPortablePath(R.p.resolveVirtual(o.cS.toPortablePath(e)))},{pnpifyFs:!1,hoistingLimitsByCwd:r,project:this.opts.project}));await async function(e,t,{baseFs:r,project:A,report:n,loadManifest:s}){const a=o.y1.join(A.cwd,H),{locationTree:c,binSymlinks:g}=function(e,t){const r=new Map([...e]),A=new Map([...t]);for(const[t,r]of e){const e=o.y1.join(t,H);if(!M.xfs.existsSync(e)){r.children.delete(H);for(const t of A.keys())null!==o.y1.contains(e,t)&&A.delete(t)}}return{locationTree:r,binSymlinks:A}}(e.locationTree,e.binSymlinks),l=V(t,{skipPrefix:A.cwd}),u=[],h=async({srcDir:e,dstDir:t,linkType:A})=>{const n=(async()=>{try{A===k.Un.SOFT?(await M.xfs.mkdirPromise(o.y1.dirname(t),{recursive:!0}),await X(o.y1.resolve(e),t)):await _(t,e,{baseFs:r})}catch(r){throw r.message=`While persisting ${e} -> ${t} ${r.message}`,r}finally{I.tick()}})().then(()=>u.splice(u.indexOf(n),1));u.push(n),u.length>4&&await Promise.race(u)},p=async(e,t,r)=>{const A=(async()=>{const A=async(e,t,r)=>{try{r&&r.innerLoop||await M.xfs.mkdirPromise(t,{recursive:!0});const n=await M.xfs.readdirPromise(e,{withFileTypes:!0});for(const i of n){if(!(r&&r.innerLoop||".bin"!==i.name))continue;const n=o.y1.join(e,i.name),s=o.y1.join(t,i.name);i.isDirectory()?(i.name!==H||r&&r.innerLoop)&&(await M.xfs.mkdirPromise(s,{recursive:!0}),await A(n,s,{innerLoop:!0})):await M.xfs.copyFilePromise(n,s,G().constants.COPYFILE_FICLONE)}}catch(A){throw r&&r.innerLoop||(A.message=`While cloning ${e} -> ${t} ${A.message}`),A}finally{r&&r.innerLoop||I.tick()}};await A(e,t,r)})().then(()=>u.splice(u.indexOf(A),1));u.push(A),u.length>4&&await Promise.race(u)},d=async(e,t,r)=>{if(r)for(const[A,n]of t.children){const t=r.children.get(A);await d(o.y1.join(e,A),n,t)}else t.children.has(H)&&await z(o.y1.join(e,H),{contentsOnly:!1}),await z(e,{contentsOnly:e===a})};for(const[e,t]of c){const r=l.get(e);for(const[A,n]of t.children){if("."===A)continue;const t=r?r.children.get(A):r;await d(o.y1.join(e,A),n,t)}}const C=async(e,t,r)=>{if(r){$(t.locator,r.locator)||await z(e,{contentsOnly:t.linkType===k.Un.HARD});for(const[A,n]of t.children){const t=r.children.get(A);await C(o.y1.join(e,A),n,t)}}else t.children.has(H)&&await z(o.y1.join(e,H),{contentsOnly:!0}),await z(e,{contentsOnly:t.linkType===k.Un.HARD})};for(const[e,t]of l){const r=c.get(e);for(const[A,n]of t.children){if("."===A)continue;const t=r?r.children.get(A):r;await C(o.y1.join(e,A),n,t)}}const f=[];for(const[r,{locations:n}]of e.locatorMap.entries())for(const e of n){const{locationRoot:n,segments:i}=W(e,{skipPrefix:A.cwd});let s=l.get(n),a=n;if(s){for(const e of i)if(a=o.y1.join(a,e),s=s.children.get(e),!s)break;if(s&&!$(s.locator,r)){const e=t.get(s.locator),r=e.target,A=a,n=e.linkType;r!==A&&f.push({srcDir:r,dstDir:A,linkType:n})}}}for(const[e,{locations:r}]of t.entries())for(const n of r){const{locationRoot:r,segments:i}=W(n,{skipPrefix:A.cwd});let s=c.get(r),a=l.get(r),g=r;const u=t.get(e),h=u.target,p=n;if(h===p)continue;const d=u.linkType;for(const e of i)a=a.children.get(e);if(s){for(const e of i)if(g=o.y1.join(g,e),s=s.children.get(e),!s){f.push({srcDir:h,dstDir:p,linkType:d});break}}else f.push({srcDir:h,dstDir:p,linkType:d})}const I=K.yG.progressViaCounter(f.length),E=n.reportProgress(I);try{const e=new Map;for(const t of f)t.linkType!==k.Un.SOFT&&e.has(t.srcDir)||(e.set(t.srcDir,t.dstDir),await h({...t}));await Promise.all(u),u.length=0;for(const t of f){const r=e.get(t.srcDir);t.linkType!==k.Un.SOFT&&t.dstDir!==r&&await p(r,t.dstDir)}await Promise.all(u),await M.xfs.mkdirPromise(a,{recursive:!0});const r=await async function(e,t,r,{loadManifest:A}){const n=new Map;for(const[t,{locations:r}]of e){const e=Z(t)?null:await A(t,r[0]),i=new Map;if(e)for(const[t,A]of e.bin){const e=o.y1.join(r[0],A);""!==A&&M.xfs.existsSync(e)&&i.set(t,A)}n.set(t,i)}const i=new Map,s=(e,t,A)=>{const a=new Map,c=o.y1.contains(r,e);if(A.locator&&null!==c){const t=n.get(A.locator);for(const[r,A]of t){const t=o.y1.join(e,o.cS.toPortablePath(A));a.set((0,o.Zu)(r),t)}for(const[t,r]of A.children){const A=o.y1.join(e,t),n=s(A,A,r);n.size>0&&i.set(e,new Map([...i.get(e)||new Map,...n]))}}else for(const[r,n]of A.children){const A=s(o.y1.join(e,r),t,n);for(const[e,t]of A)a.set(e,t)}return a};for(const[e,r]of t){const t=s(e,e,r);t.size>0&&i.set(e,new Map([...i.get(e)||new Map,...t]))}return i}(t,l,A.cwd,{loadManifest:s});await async function(e,t){for(const r of e.keys())if(!t.has(r)){const e=o.y1.join(r,H,".bin");await M.xfs.removePromise(e)}for(const[r,A]of t){const t=o.y1.join(r,H,".bin"),n=e.get(r)||new Map;await M.xfs.mkdirPromise(t,{recursive:!0});for(const e of n.keys())A.has(e)||(await M.xfs.removePromise(o.y1.join(t,e)),"win32"===process.platform&&await M.xfs.removePromise(o.y1.join(t,(0,o.Zu)(e+".cmd"))));for(const[e,r]of A){const A=n.get(e),i=o.y1.join(t,e);A!==r&&("win32"===process.platform?await T()(o.cS.fromPortablePath(r),o.cS.fromPortablePath(i),{createPwshFile:!1}):(await M.xfs.removePromise(i),await X(r,i),await M.xfs.chmodPromise(r,493)))}}}(g,r),await async function(e,t,r){let A="";A+="# Warning: This file is automatically generated. Removing it is fine, but will\n",A+="# cause your node_modules installation to become invalidated.\n",A+="\n",A+="__metadata:\n",A+=" version: 1\n";const n=Array.from(t.keys()).sort(),s=i.stringifyLocator(e.topLevelWorkspace.anchoredLocator);for(const i of n){const n=t.get(i);A+="\n",A+=JSON.stringify(i)+":\n",A+=" locations:\n";for(const t of n.locations){const r=o.y1.contains(e.cwd,t);if(null===r)throw new Error(`Assertion failed: Expected the path to be within the project (${t})`);A+=` - ${JSON.stringify(r)}\n`}if(n.aliases.length>0){A+=" aliases:\n";for(const e of n.aliases)A+=` - ${JSON.stringify(e)}\n`}if(i===s&&r.size>0){A+=" bin:\n";for(const[t,n]of r){const r=o.y1.contains(e.cwd,t);if(null===r)throw new Error(`Assertion failed: Expected the path to be within the project (${t})`);A+=` ${JSON.stringify(r)}:\n`;for(const[e,r]of n){const n=o.y1.relative(o.y1.join(t,H),r);A+=` ${JSON.stringify(e)}: ${JSON.stringify(n)}\n`}}}}const a=e.cwd,c=o.y1.join(a,H,".yarn-state.yml");await M.xfs.changeFilePromise(c,A,{automaticNewlines:!0})}(A,t,r)}finally{E.stop()}}(t,A,{baseFs:e,project:this.opts.project,report:this.opts.report,loadManifest:async e=>{const t=i.parseLocator(e),r=this.localStore.get(t.locatorHash);if(void 0===r)throw new Error("Assertion failed: Expected the slot to exist");return r.customPackageData.manifest}});const n=[];for(const[e,t]of A.entries()){if(Z(e))continue;const r=i.parseLocator(e),A=this.localStore.get(r.locatorHash);if(void 0===A)throw new Error("Assertion failed: Expected the slot to exist");const o=O.jsInstallUtils.extractBuildScripts(A.pkg,A.customPackageData,A.dependencyMeta,{configuration:this.opts.project.configuration,report:this.opts.report});0!==o.length&&n.push({buildLocations:t.locations,locatorHash:r.locatorHash,buildDirective:o})}return{customData:this.customData,records:n}}}async function q(e,{unrollAliases:t=!1}={}){const r=e.cwd,A=o.y1.join(r,H,".yarn-state.yml");if(!M.xfs.existsSync(A))return null;const n=(0,P.parseSyml)(await M.xfs.readFilePromise(A,"utf8"));if(n.__metadata.version>1)return null;const s=new Map,a=new Map;delete n.__metadata;for(const[e,A]of Object.entries(n)){const n=A.locations.map(e=>o.y1.join(r,e)),c=A.bin;if(c)for(const[e,t]of Object.entries(c)){const A=o.y1.join(r,o.cS.toPortablePath(e)),n=N.getMapWithDefault(a,A);for(const[e,r]of Object.entries(t))n.set((0,o.Zu)(e),o.cS.toPortablePath([A,H,r].join(o.y1.delimiter)))}if(s.set(e,{target:o.LZ.dot,linkType:k.Un.HARD,locations:n,aliases:A.aliases||[]}),t&&A.aliases)for(const t of A.aliases){const{scope:r,name:A}=i.parseLocator(e),a=i.makeLocator(i.makeIdent(r,A),t),c=i.stringifyLocator(a);s.set(c,{target:o.LZ.dot,linkType:k.Un.HARD,locations:n,aliases:[]})}}return{locatorMap:s,binSymlinks:a,locationTree:V(s,{skipPrefix:e.cwd})}}const z=async(e,t)=>{if(e.split(o.y1.sep).indexOf(H)<0)throw new Error("Assertion failed: trying to remove dir that doesn't contain node_modules: "+e);try{if(!t.innerLoop){if((await M.xfs.lstatPromise(e)).isSymbolicLink())return void await M.xfs.unlinkPromise(e)}const r=await M.xfs.readdirPromise(e,{withFileTypes:!0});for(const A of r){const r=o.y1.join(e,(0,o.Zu)(A.name));A.isDirectory()?(A.name!==H||t&&t.innerLoop)&&await z(r,{innerLoop:!0,contentsOnly:!1}):await M.xfs.unlinkPromise(r)}t.contentsOnly||await M.xfs.rmdirPromise(e)}catch(e){if("ENOENT"!==e.code&&"ENOTEMPTY"!==e.code)throw e}},W=(e,{skipPrefix:t})=>{const r=o.y1.contains(t,e);if(null===r)throw new Error(`Assertion failed: Cannot process a path that isn't part of the requested prefix (${e} isn't within ${t})`);const A=r.split(o.y1.sep).filter(e=>""!==e),n=A.indexOf(H),i=A.slice(0,n).join(o.y1.sep);return{locationRoot:o.y1.join(t,i),segments:A.slice(n)}},V=(e,{skipPrefix:t})=>{const r=new Map;if(null===e)return r;const A=()=>({children:new Map,linkType:k.Un.HARD});for(const[n,i]of e.entries()){if(i.linkType===k.Un.SOFT){if(null!==o.y1.contains(t,i.target)){const e=N.getFactoryWithDefault(r,i.target,A);e.locator=n,e.linkType=i.linkType}}for(const e of i.locations){const{locationRoot:o,segments:s}=W(e,{skipPrefix:t});let a=N.getFactoryWithDefault(r,o,A);for(let e=0;e{let r;try{"win32"===process.platform&&(r=M.xfs.lstatSync(e))}catch(e){}"win32"!=process.platform||r&&!r.isDirectory()?M.xfs.symlinkPromise(o.y1.relative(o.y1.dirname(t),e),t):M.xfs.symlinkPromise(e,t,"junction")},_=async(e,t,{baseFs:r,innerLoop:A})=>{await M.xfs.mkdirPromise(e,{recursive:!0});const n=await r.readdirPromise(t,{withFileTypes:!0}),i=async(e,t,A)=>{if(A.isFile()){const A=await r.lstatPromise(t);await r.copyFilePromise(t,e);const n=511&A.mode;420!==n&&await M.xfs.chmodPromise(e,n)}else{if(!A.isSymbolicLink())throw new Error(`Unsupported file type (file: ${t}, mode: 0o${await M.xfs.statSync(t).mode.toString(8).padStart(6,"0")})`);{const A=await r.readlinkPromise(t);await X(o.y1.resolve(o.y1.dirname(e),A),e)}}};for(const s of n){const n=o.y1.join(t,(0,o.Zu)(s.name)),a=o.y1.join(e,(0,o.Zu)(s.name));s.isDirectory()?(s.name!==H||A)&&await _(a,n,{baseFs:r,innerLoop:!0}):await i(a,n,s)}};function Z(e){let t=i.parseDescriptor(e);return i.isVirtualDescriptor(t)&&(t=i.devirtualizeDescriptor(t)),t.range.startsWith("link:")}const $=(e,t)=>{if(!e||!t)return e===t;let r=i.parseLocator(e);i.isVirtualLocator(r)&&(r=i.devirtualizeLocator(r));let A=i.parseLocator(t);return i.isVirtualLocator(A)&&(A=i.devirtualizeLocator(A)),i.areLocatorsEqual(r,A)};var ee=r(34432);class te extends O.PnpLinker{constructor(){super(...arguments),this.mode="loose"}makeInstaller(e){return new re(e)}}class re extends O.PnpInstaller{constructor(){super(...arguments),this.mode="loose"}async finalizeInstallWithPnp(e){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;const t=new R.p({baseFs:new x.A({libzip:await(0,L.getLibzipPromise)(),maxOpenFiles:80,readOnlyArchives:!0})}),r=(0,ee.oC)(e,this.opts.project.cwd,t),A=Q(r,{pnpifyFs:!1,project:this.opts.project}),n=new Map;e.fallbackPool=n;const s=(e,t)=>{const r=i.parseLocator(t.locator),A=i.stringifyIdent(r);A===e?n.set(e,r.reference):n.set(e,[A,r.reference])},a=o.y1.join(this.opts.project.cwd,o.QS.nodeModules),c=A.get(a);if(void 0===c)throw new Error("Assertion failed: Expected a root junction point");if("target"in c)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(const e of c.dirList){const t=o.y1.join(a,e),r=A.get(t);if(void 0===r)throw new Error("Assertion failed: Expected the child to have been registered");if("target"in r)s(e,r);else for(const n of r.dirList){const r=o.y1.join(t,n),i=A.get(r);if(void 0===i)throw new Error("Assertion failed: Expected the subchild to have been registered");if(!("target"in i))throw new Error("Assertion failed: Expected the leaf junction to be a package");s(`${e}/${n}`,i)}}return super.finalizeInstallWithPnp(e)}}const Ae=e=>o.y1.join(e.cwd,".pnp.js"),ne={configuration:{nmHoistingLimits:{description:"Prevent packages can be hoisted past specific levels",type:n.a2.STRING,values:[w.WORKSPACES,w.DEPENDENCIES,w.NONE],default:"none"}},linkers:[class{supportsPackage(e,t){return"node-modules"===t.project.configuration.get("nodeLinker")}async findPackageLocation(e,t){const r=t.project.tryWorkspaceByLocator(e);if(r)return r.cwd;const A=await q(t.project,{unrollAliases:!0});if(null===A)throw new j.UsageError("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");const n=A.locatorMap.get(i.stringifyLocator(e));if(!n){const r=new j.UsageError(`Couldn't find ${i.prettyLocator(t.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw r.code="LOCATOR_NOT_INSTALLED",r}return n.locations[0]}async findPackageLocator(e,t){const r=await q(t.project,{unrollAliases:!0});if(null===r)return null;const{locationRoot:A,segments:n}=W(o.y1.resolve(e),{skipPrefix:t.project.cwd});let s=r.locationTree.get(A);if(!s)return null;let a=s.locator;for(const e of n){if(s=s.children.get(e),!s)break;a=s.locator||a}return i.parseLocator(a)}makeInstaller(e){return new J(e)}},te]}},8190:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>X});var A,n,o=r(39922),i=r(36370),s=r(25413),a=r(85824),c=r(62152),g=r(35691),l=r(92659),u=r(85875),h=r(15815),p=r(14224),d=r(40822);!function(e){e.All="all",e.Production="production",e.Development="development"}(A||(A={})),function(e){e.Info="info",e.Low="low",e.Moderate="moderate",e.High="high",e.Critical="critical"}(n||(n={}));var C=r(54143),f=r(73632),I=r(71643);const E=[n.Info,n.Low,n.Moderate,n.High,n.Critical];function B(e,t){const r=[],A=new Set,n=e=>{A.has(e)||(A.add(e),r.push(e))};for(const e of t)n(e);const o=new Set;for(;r.length>0;){const t=r.shift(),A=e.storedResolutions.get(t);if(void 0===A)throw new Error("Assertion failed: Expected the resolution to have been registered");const i=e.storedPackages.get(A);if(i){o.add(t);for(const e of i.dependencies.values())n(e.descriptorHash)}}return o}function y(e,t,{all:r}){const A=r?e.workspaces:[t],n=A.map(e=>e.manifest),o=new Set(n.map(e=>[...e.dependencies].map(([e,t])=>e)).flat()),i=new Set(n.map(e=>[...e.devDependencies].map(([e,t])=>e)).flat()),s=A.map(e=>[...e.dependencies.values()]).flat(),a=s.filter(e=>o.has(e.identHash)).map(e=>e.descriptorHash),c=s.filter(e=>i.has(e.identHash)).map(e=>e.descriptorHash),g=B(e,a),l=B(e,c);return u=l,h=g,new Set([...u].filter(e=>!h.has(e)));var u,h}function m(e){const t={};for(const r of e)t[C.stringifyIdent(r)]=C.parseRange(r.range).selector;return t}function w(e){if(void 0===e)return new Set;const t=E.indexOf(e),r=E.slice(t);return new Set(r)}function Q(e,t){var r;const A=function(e,t){const r=w(t),A={};for(const t of r)A[t]=e[t];return A}(e,t);for(const e of Object.keys(A))if(null!==(r=A[e])&&void 0!==r&&r)return!0;return!1}class D extends s.BaseCommand{constructor(){super(...arguments),this.all=!1,this.recursive=!1,this.environment=A.All,this.json=!1,this.severity=n.Info}async execute(){const e=await o.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await a.I.find(e,this.context.cwd);if(!r)throw new s.WorkspaceRequiredError(t.cwd,this.context.cwd);await t.restoreInstallState();const n=function(e,t,{all:r,environment:n}){const o=r?e.workspaces:[t],i=[];if([A.All,A.Production].includes(n))for(const e of o)for(const t of e.manifest.dependencies.values())i.push(t);const s=[];if([A.All,A.Development].includes(n))for(const e of o)for(const t of e.manifest.devDependencies.values())s.push(t);return m([...i,...s].filter(e=>null===C.parseRange(e.range).protocol))}(t,r,{all:this.all,environment:this.environment}),i=function(e,t,{all:r}){var A;const n=y(e,t,{all:r}),o={};for(const t of e.storedPackages.values())o[C.stringifyIdent(t)]={version:null!==(A=t.version)&&void 0!==A?A:"0.0.0",integrity:t.identHash,requires:m(t.dependencies.values()),dev:n.has(C.convertLocatorToDescriptor(t).descriptorHash)};return o}(t,r,{all:this.all});if(!this.recursive)for(const e of Object.keys(i))Object.prototype.hasOwnProperty.call(n,e)?i[e].requires={}:delete i[e];const d={requires:n,dependencies:i},E=p.npmConfigUtils.getPublishRegistry(r.manifest,{configuration:e});let B;const D=await c.h.start({configuration:e,stdout:this.context.stdout},async()=>{try{B=await p.npmHttpUtils.post("/-/npm/v1/security/audits/quick",d,{authType:p.npmHttpUtils.AuthType.NO_AUTH,configuration:e,jsonResponse:!0,registry:E})}catch(e){throw"HTTPError"!==e.name?e:new g.lk(l.b.EXCEPTION,e.toString())}});if(D.hasErrors())return D.exitCode();const b=Q(B.metadata.vulnerabilities,this.severity);if(!this.json&&b)return u.emitTree(function(e,t){const r={},A={children:r};let n=Object.values(e.advisories);if(null!=t){const e=w(t);n=n.filter(t=>e.has(t.severity))}for(const e of f.sortMap(n,e=>e.module_name))r[e.module_name]={label:e.module_name,value:I.tuple(I.Type.RANGE,e.findings.map(e=>e.version).join(", ")),children:{Issue:{label:"Issue",value:I.tuple(I.Type.NO_HINT,e.title)},URL:{label:"URL",value:I.tuple(I.Type.URL,e.url)},Severity:{label:"Severity",value:I.tuple(I.Type.NO_HINT,e.severity)},"Vulnerable Versions":{label:"Vulnerable Versions",value:I.tuple(I.Type.RANGE,e.vulnerable_versions)},"Patched Versions":{label:"Patched Versions",value:I.tuple(I.Type.RANGE,e.patched_versions)},Via:{label:"Via",value:I.tuple(I.Type.NO_HINT,Array.from(new Set(e.findings.map(e=>e.paths).flat().map(e=>e.split(">")[0]))).join(", "))},Recommendation:{label:"Recommendation",value:I.tuple(I.Type.NO_HINT,e.recommendation.replace(/\n/g," "))}}};return A}(B,this.severity),{configuration:e,json:this.json,stdout:this.context.stdout,separators:2}),1;return(await h.Pk.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async e=>{e.reportJson(B),b||e.reportInfo(l.b.EXCEPTION,"No audit suggestions")})).exitCode()}}D.usage=d.Command.Usage({description:"perform a vulnerability audit against the installed packages",details:`\n This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths).\n\n For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \`-A,--all\`. To extend this search to both direct and transitive dependencies, use \`-R,--recursive\`.\n\n Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${E.map(e=>`\`${e}\``).join(", ")}.\n\n If the \`--json\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages.\n\n To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why \` to get more information as to who depends on them.\n `,examples:[["Checks for known security issues with the installed packages. The output is a list of known issues.","yarn npm audit"],["Audit dependencies in all workspaces","yarn npm audit --all"],["Limit auditing to `dependencies` (excludes `devDependencies`)","yarn npm audit --environment production"],["Show audit report as valid JSON","yarn npm audit --json"],["Audit all direct and transitive dependencies","yarn npm audit --recursive"],["Output moderate (or more severe) vulnerabilities","yarn npm audit --severity moderate"]]}),(0,i.gn)([d.Command.Boolean("-A,--all")],D.prototype,"all",void 0),(0,i.gn)([d.Command.Boolean("-R,--recursive")],D.prototype,"recursive",void 0),(0,i.gn)([d.Command.String("--environment")],D.prototype,"environment",void 0),(0,i.gn)([d.Command.Boolean("--json")],D.prototype,"json",void 0),(0,i.gn)([d.Command.String("--severity")],D.prototype,"severity",void 0),(0,i.gn)([d.Command.Path("npm","audit")],D.prototype,"execute",null);var b=r(85622),v=r.n(b),S=r(53887),k=r.n(S),N=r(31669);class F extends s.BaseCommand{constructor(){super(...arguments),this.json=!1}async execute(){const e=await o.VK.find(this.context.cwd,this.context.plugins),{project:t}=await a.I.find(e,this.context.cwd),r=void 0!==this.fields?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,A=[];let n=!1;const i=await h.Pk.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async o=>{for(const i of this.packages){let s;if("."===i){const e=t.topLevelWorkspace;if(!e.manifest.name)throw new d.UsageError("Missing 'name' field in "+v().join(e.cwd,"package.json"));s=C.makeDescriptor(e.manifest.name,"unknown")}else s=C.parseDescriptor(i);const a=p.npmHttpUtils.getIdentUrl(s);let c;try{c=K(await p.npmHttpUtils.get(a,{configuration:e,ident:s,jsonResponse:!0}))}catch(e){throw"HTTPError"!==e.name?e:404===e.response.statusCode?new g.lk(l.b.EXCEPTION,"Package not found"):new g.lk(l.b.EXCEPTION,e.toString())}const u=Object.keys(c.versions).sort(k().compareLoose);let h=c["dist-tags"].latest||u[u.length-1];if(k().validRange(s.range)){const t=k().maxSatisfying(u,s.range);null!==t?h=t:(o.reportWarning(l.b.UNNAMED,`Unmet range ${C.prettyRange(e,s.range)}; falling back to the latest version`),n=!0)}else"unknown"!==s.range&&(o.reportWarning(l.b.UNNAMED,`Invalid range ${C.prettyRange(e,s.range)}; falling back to the latest version`),n=!0);const f=c.versions[h],I={...c,...f,version:h,versions:u};let E;if(null!==r){E={};for(const t of r){const r=I[t];void 0!==r?E[t]=r:(o.reportWarning(l.b.EXCEPTION,`The '${t}' field doesn't exist inside ${C.prettyIdent(e,s)}'s informations`),n=!0)}}else this.json||(delete I.dist,delete I.readme,delete I.users),E=I;o.reportJson(E),this.json||A.push(E)}});N.inspect.styles.name="cyan";for(const e of A)(e!==A[0]||n)&&this.context.stdout.write("\n"),this.context.stdout.write((0,N.inspect)(e,{depth:1/0,colors:!0,compact:!1})+"\n");return i.exitCode()}}function K(e){if(Array.isArray(e)){const t=[];for(let r of e)r=K(r),r&&t.push(r);return t}if("object"==typeof e&&null!==e){const t={};for(const r of Object.keys(e)){if(r.startsWith("_"))continue;const A=K(e[r]);A&&(t[r]=A)}return t}return e||null}F.usage=d.Command.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command will fetch information about a package from the npm registry, and prints it in a tree format.\n\n The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\n\n Append `@` to the package argument to provide information specific to the latest version that satisfies the range. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\n\n If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package informations.\n\n By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\n ",examples:[["Show all available information about react (except the `dist`, `readme`, and `users` fields)","yarn npm info react"],["Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)","yarn npm info react --json"],["Show all available information about react 16.12.0","yarn npm info react@16.12.0"],["Show the description of react","yarn npm info react --fields description"],["Show all available versions of react","yarn npm info react --fields versions"],["Show the readme of react","yarn npm info react --fields readme"],["Show a few fields of react","yarn npm info react --fields homepage,repository"]]}),(0,i.gn)([d.Command.Rest()],F.prototype,"packages",void 0),(0,i.gn)([d.Command.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"})],F.prototype,"fields",void 0),(0,i.gn)([d.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],F.prototype,"json",void 0),(0,i.gn)([d.Command.Path("npm","info")],F.prototype,"execute",null);var M=r(61899);class R extends s.BaseCommand{constructor(){super(...arguments),this.publish=!1}async execute(){const e=await o.VK.find(this.context.cwd,this.context.plugins),t=await x({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await h.Pk.start({configuration:e,stdout:this.context.stdout},async r=>{const A=await async function({registry:e,report:t,stdin:r,stdout:A}){if(process.env.TEST_ENV)return{name:process.env.TEST_NPM_USER||"",password:process.env.TEST_NPM_PASSWORD||""};t.reportInfo(l.b.UNNAMED,"Logging in to "+e);let n=!1;e.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(t.reportInfo(l.b.UNNAMED,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0);t.reportSeparator();const{username:o,password:i}=await(0,M.prompt)([{type:"input",name:"username",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:r,stdout:A},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:r,stdout:A}]);return t.reportSeparator(),{name:o,password:i}}({registry:t,report:r,stdin:this.context.stdin,stdout:this.context.stdout}),n="/-/user/org.couchdb.user:"+encodeURIComponent(A.name),i=await p.npmHttpUtils.put(n,A,{attemptedAs:A.name,configuration:e,registry:t,jsonResponse:!0,authType:p.npmHttpUtils.AuthType.NO_AUTH});return await async function(e,t,{configuration:r,scope:A}){const n=e=>r=>{const A=f.isIndexableObject(r)?r:{},n=A[e],o=f.isIndexableObject(n)?n:{};return{...A,[e]:{...o,npmAuthToken:t}}},i=A?{npmScopes:n(A)}:{npmRegistries:n(e)};return await o.VK.updateHomeConfiguration(i)}(t,i.token,{configuration:e,scope:this.scope}),r.reportInfo(l.b.UNNAMED,"Successfully logged in")})).exitCode()}}async function x({scope:e,publish:t,configuration:r,cwd:A}){return e&&t?p.npmConfigUtils.getScopeRegistry(e,{configuration:r,type:p.npmConfigUtils.RegistryType.PUBLISH_REGISTRY}):e?p.npmConfigUtils.getScopeRegistry(e,{configuration:r}):t?p.npmConfigUtils.getPublishRegistry((await(0,s.openWorkspace)(r,A)).manifest,{configuration:r}):p.npmConfigUtils.getDefaultRegistry({configuration:r})}R.usage=d.Command.Usage({category:"Npm-related commands",description:"store new login info to access the npm registry",details:"\n This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\n\n Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n ",examples:[["Login to the default registry","yarn npm login"],["Login to the registry linked to the @my-scope registry","yarn npm login --scope my-scope"],["Login to the publish registry for the current package","yarn npm login --publish"]]}),(0,i.gn)([d.Command.String("-s,--scope",{description:"Login to the registry configured for a given scope"})],R.prototype,"scope",void 0),(0,i.gn)([d.Command.Boolean("--publish",{description:"Login to the publish registry"})],R.prototype,"publish",void 0),(0,i.gn)([d.Command.Path("npm","login")],R.prototype,"execute",null);const L=new Set(["npmAuthIdent","npmAuthToken"]);class P extends s.BaseCommand{constructor(){super(...arguments),this.publish=!1,this.all=!1}async execute(){const e=await o.VK.find(this.context.cwd,this.context.plugins),t=async()=>{var t;const r=await x({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),A=await o.VK.find(this.context.cwd,this.context.plugins),n=C.makeIdent(null!==(t=this.scope)&&void 0!==t?t:null,"pkg");return!p.npmConfigUtils.getAuthConfiguration(r,{configuration:A,ident:n}).get("npmAuthToken")};return(await h.Pk.start({configuration:e,stdout:this.context.stdout},async r=>{if(this.all&&(await async function(){const e=e=>{let t=!1;const r=f.isIndexableObject(e)?{...e}:{};r.npmAuthToken&&(delete r.npmAuthToken,t=!0);for(const e of Object.keys(r))O(r,e)&&(t=!0);if(0!==Object.keys(r).length)return t?r:e};return await o.VK.updateHomeConfiguration({npmRegistries:e,npmScopes:e})}(),r.reportInfo(l.b.UNNAMED,"Successfully logged out from everything")),this.scope)return await U("npmScopes",this.scope),void(await t()?r.reportInfo(l.b.UNNAMED,"Successfully logged out from "+this.scope):r.reportWarning(l.b.UNNAMED,"Scope authentication settings removed, but some other ones settings still apply to it"));const A=await x({configuration:e,cwd:this.context.cwd,publish:this.publish});await U("npmRegistries",A),await t()?r.reportInfo(l.b.UNNAMED,"Successfully logged out from "+A):r.reportWarning(l.b.UNNAMED,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}}function O(e,t){const r=e[t];if(!f.isIndexableObject(r))return!1;const A=new Set(Object.keys(r));if([...L].every(e=>!A.has(e)))return!1;for(const e of L)A.delete(e);if(0===A.size)return e[t]=void 0,!0;const n={...r};for(const e of L)delete n[e];return e[t]=n,!0}async function U(e,t){return await o.VK.updateHomeConfiguration({[e]:e=>{const r=f.isIndexableObject(e)?e:{};if(!Object.prototype.hasOwnProperty.call(r,t))return e;const A=r[t],n=f.isIndexableObject(A)?A:{},o=new Set(Object.keys(n));if([...L].every(e=>!o.has(e)))return e;for(const e of L)o.delete(e);if(0===o.size){if(1===Object.keys(r).length)return;return{...r,[t]:void 0}}const i={};for(const e of L)i[e]=void 0;return{...r,[t]:{...n,...i}}}})}P.usage=d.Command.Usage({category:"Npm-related commands",description:"logout of the npm registry",details:"\n This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\n\n Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n\n Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\n ",examples:[["Logout of the default registry","yarn npm logout"],["Logout of the @my-scope scope","yarn npm logout --scope my-scope"],["Logout of the publish registry for the current package","yarn npm logout --publish"],["Logout of all registries","yarn npm logout --all"]]}),(0,i.gn)([d.Command.String("-s,--scope",{description:"Logout of the registry configured for a given scope"})],P.prototype,"scope",void 0),(0,i.gn)([d.Command.Boolean("--publish",{description:"Logout of the publish registry"})],P.prototype,"publish",void 0),(0,i.gn)([d.Command.Boolean("-A,--all",{description:"Logout of all registries"})],P.prototype,"all",void 0),(0,i.gn)([d.Command.Path("npm","logout")],P.prototype,"execute",null);var T=r(63088),j=r(49881);class Y extends s.BaseCommand{constructor(){super(...arguments),this.tag="latest",this.tolerateRepublish=!1}async execute(){const e=await o.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await a.I.find(e,this.context.cwd);if(!r)throw new s.WorkspaceRequiredError(t.cwd,this.context.cwd);if(r.manifest.private)throw new d.UsageError("Private workspaces cannot be published");if(null===r.manifest.name||null===r.manifest.version)throw new d.UsageError("Workspaces must have valid names and versions to be published on an external registry");await t.restoreInstallState();const A=r.manifest.name,n=r.manifest.version,i=p.npmConfigUtils.getPublishRegistry(r.manifest,{configuration:e});return(await h.Pk.start({configuration:e,stdout:this.context.stdout},async t=>{if(this.tolerateRepublish)try{const r=await p.npmHttpUtils.get(p.npmHttpUtils.getIdentUrl(A),{configuration:e,registry:i,ident:A,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(r,"versions"))throw new g.lk(l.b.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(Object.prototype.hasOwnProperty.call(r.versions,n))return void t.reportWarning(l.b.UNNAMED,`Registry already knows about version ${n}; skipping.`)}catch(e){if("HTTPError"!==e.name)throw e;if(404!==e.response.statusCode)throw new g.lk(l.b.NETWORK_ERROR,`The remote server answered with HTTP ${e.response.statusCode} ${e.response.statusMessage}`)}await T.maybeExecuteWorkspaceLifecycleScript(r,"prepublish",{report:t}),await j.packUtils.prepareForPack(r,{report:t},async()=>{const n=await j.packUtils.genPackList(r);for(const e of n)t.reportInfo(null,e);const o=await j.packUtils.genPackStream(r,n),s=await f.bufferStream(o),a=await p.npmPublishUtils.makePublishBody(r,s,{access:this.access,tag:this.tag,registry:i});try{await p.npmHttpUtils.put(p.npmHttpUtils.getIdentUrl(A),a,{configuration:e,registry:i,ident:A,jsonResponse:!0})}catch(e){if("HTTPError"!==e.name)throw e;{const r=e.response.body&&e.response.body.error?e.response.body.error:`The remote server answered with HTTP ${e.response.statusCode} ${e.response.statusMessage}`;t.reportError(l.b.NETWORK_ERROR,r)}}}),t.hasErrors()||t.reportInfo(l.b.UNNAMED,"Package archive published")})).exitCode()}}Y.usage=d.Command.Usage({category:"Npm-related commands",description:"publish the active workspace to the npm registry",details:'\n This command will pack the active workspace into a fresh archive and upload it to the npm registry.\n\n The package will by default be attached to the `latest` tag on the registry, but this behavior can be overriden by using the `--tag` option.\n\n Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka "private packages"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\n ',examples:[["Publish the active workspace","yarn npm publish"]]}),(0,i.gn)([d.Command.String("--access",{description:"The access for the published package (public or restricted)"})],Y.prototype,"access",void 0),(0,i.gn)([d.Command.String("--tag",{description:"The tag on the registry that the package should be attached to"})],Y.prototype,"tag",void 0),(0,i.gn)([d.Command.Boolean("--tolerate-republish",{description:"Warn and exit when republishing an already existing version of a package"})],Y.prototype,"tolerateRepublish",void 0),(0,i.gn)([d.Command.Path("npm","publish")],Y.prototype,"execute",null);var G=r(46009);class H extends s.BaseCommand{constructor(){super(...arguments),this.json=!1}async execute(){const e=await o.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await a.I.find(e,this.context.cwd);let A;if(void 0!==this.package)A=C.parseIdent(this.package);else{if(!r)throw new s.WorkspaceRequiredError(t.cwd,this.context.cwd);if(!r.manifest.name)throw new d.UsageError("Missing 'name' field in "+G.y1.join(r.cwd,G.QS.manifest));A=r.manifest.name}const n=await J(A,e),i={children:f.sortMap(Object.entries(n),([e])=>e).map(([e,t])=>({value:I.tuple(I.Type.RESOLUTION,{descriptor:C.makeDescriptor(A,e),locator:C.makeLocator(A,t)})}))};return u.emitTree(i,{configuration:e,json:this.json,stdout:this.context.stdout})}}async function J(e,t){const r=`/-/package${p.npmHttpUtils.getIdentUrl(e)}/dist-tags`;return p.npmHttpUtils.get(r,{configuration:t,ident:e,jsonResponse:!0}).catch(e=>{throw"HTTPError"!==e.name?e:404===e.response.statusCode?new g.lk(l.b.EXCEPTION,"Package not found"):new g.lk(l.b.EXCEPTION,e.toString())})}H.usage=d.Command.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:"\n This command will list all tags of a package from the npm registry.\n\n If the package is not specified, Yarn will default to the current workspace.\n ",examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]}),(0,i.gn)([d.Command.String({required:!1})],H.prototype,"package",void 0),(0,i.gn)([d.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],H.prototype,"json",void 0),(0,i.gn)([d.Command.Path("npm","tag","list")],H.prototype,"execute",null);class q extends s.BaseCommand{async execute(){const e=await o.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await a.I.find(e,this.context.cwd);if(!r)throw new s.WorkspaceRequiredError(t.cwd,this.context.cwd);const A=C.parseDescriptor(this.package,!0),n=A.range;if(!k().valid(n))throw new d.UsageError(`The range ${I.pretty(e,A.range,I.Type.RANGE)} must be a valid semver version`);const i=p.npmConfigUtils.getPublishRegistry(r.manifest,{configuration:e}),c=I.pretty(e,A,I.Type.IDENT),g=I.pretty(e,n,I.Type.RANGE),u=I.pretty(e,this.tag,I.Type.CODE);return(await h.Pk.start({configuration:e,stdout:this.context.stdout},async t=>{const r=await J(A,e);Object.prototype.hasOwnProperty.call(r,this.tag)&&r[this.tag]===n&&t.reportWarning(l.b.UNNAMED,`Tag ${u} is already set to version ${g}`);try{const t=`/-/package${p.npmHttpUtils.getIdentUrl(A)}/dist-tags/${encodeURIComponent(this.tag)}`;await p.npmHttpUtils.put(t,n,{configuration:e,registry:i,ident:A,jsonRequest:!0,jsonResponse:!0})}catch(e){if("HTTPError"!==e.name)throw e;{const r=e.response.body&&e.response.body.error?e.response.body.error:`The remote server answered with HTTP ${e.response.statusCode} ${e.response.statusMessage}`;t.reportError(l.b.NETWORK_ERROR,r)}}t.hasErrors()||t.reportInfo(l.b.UNNAMED,`Tag ${u} added to version ${g} of package ${c}`)})).exitCode()}}q.usage=d.Command.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:"\n This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten.\n ",examples:[["Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`","yarn npm tag add my-pkg@2.3.4-beta.4 beta"]]}),(0,i.gn)([d.Command.String()],q.prototype,"package",void 0),(0,i.gn)([d.Command.String()],q.prototype,"tag",void 0),(0,i.gn)([d.Command.Path("npm","tag","add")],q.prototype,"execute",null);var z=r(15966);class W extends s.BaseCommand{async execute(){const e=await o.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await a.I.find(e,this.context.cwd);if(!r)throw new s.WorkspaceRequiredError(t.cwd,this.context.cwd);const A=C.parseIdent(this.package),n=p.npmConfigUtils.getPublishRegistry(r.manifest,{configuration:e}),i=I.pretty(e,this.tag,I.Type.CODE),c=I.pretty(e,A,I.Type.IDENT),g=await J(A,e);if(!Object.prototype.hasOwnProperty.call(g,this.tag))throw new d.UsageError(`${i} is not a tag of package ${c}`);return(await h.Pk.start({configuration:e,stdout:this.context.stdout},async t=>{try{const t=`/-/package${p.npmHttpUtils.getIdentUrl(A)}/dist-tags/${encodeURIComponent(this.tag)}`;await p.npmHttpUtils.del(t,{configuration:e,registry:n,ident:A,jsonResponse:!0})}catch(e){if("HTTPError"!==e.name)throw e;{const r=e.response.body&&e.response.body.error?e.response.body.error:`The remote server answered with HTTP ${e.response.statusCode} ${e.response.statusMessage}`;t.reportError(l.b.NETWORK_ERROR,r)}}t.hasErrors()||t.reportInfo(l.b.UNNAMED,`Tag ${i} removed from package ${c}`)})).exitCode()}}W.schema=z.object().shape({tag:z.string().notOneOf(["latest"])}),W.usage=d.Command.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:"\n This command will remove a tag from a package from the npm registry.\n ",examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]}),(0,i.gn)([d.Command.String()],W.prototype,"package",void 0),(0,i.gn)([d.Command.String()],W.prototype,"tag",void 0),(0,i.gn)([d.Command.Path("npm","tag","remove")],W.prototype,"execute",null);class V extends s.BaseCommand{constructor(){super(...arguments),this.publish=!1}async execute(){const e=await o.VK.find(this.context.cwd,this.context.plugins);let t;t=this.scope&&this.publish?p.npmConfigUtils.getScopeRegistry(this.scope,{configuration:e,type:p.npmConfigUtils.RegistryType.PUBLISH_REGISTRY}):this.scope?p.npmConfigUtils.getScopeRegistry(this.scope,{configuration:e}):this.publish?p.npmConfigUtils.getPublishRegistry((await(0,s.openWorkspace)(e,this.context.cwd)).manifest,{configuration:e}):p.npmConfigUtils.getDefaultRegistry({configuration:e});return(await h.Pk.start({configuration:e,stdout:this.context.stdout},async r=>{try{const A=await p.npmHttpUtils.get("/-/whoami",{configuration:e,registry:t,authType:p.npmHttpUtils.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?C.makeIdent(this.scope,""):void 0});r.reportInfo(l.b.UNNAMED,A.username)}catch(e){if("HTTPError"!==e.name)throw e;401===e.response.statusCode||403===e.response.statusCode?r.reportError(l.b.AUTHENTICATION_INVALID,"Authentication failed - your credentials may have expired"):r.reportError(l.b.AUTHENTICATION_INVALID,e.toString())}})).exitCode()}}V.usage=d.Command.Usage({category:"Npm-related commands",description:"display the name of the authenticated user",details:"\n Print the username associated with the current authentication settings to the standard output.\n\n When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\n\n When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\n ",examples:[["Print username for the default registry","yarn npm whoami"],["Print username for the registry on a given scope","yarn npm whoami --scope company"]]}),(0,i.gn)([d.Command.String("-s,--scope",{description:"Print username for the registry configured for a given scope"})],V.prototype,"scope",void 0),(0,i.gn)([d.Command.Boolean("--publish",{description:"Print username for the publish registry"})],V.prototype,"publish",void 0),(0,i.gn)([d.Command.Path("npm","whoami")],V.prototype,"execute",null);const X={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:o.a2.STRING,default:null}},commands:[D,F,R,P,Y,q,H,W,V]}},14224:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>W,npmConfigUtils:()=>A,npmHttpUtils:()=>n,npmPublishUtils:()=>o});var A={};r.r(A),r.d(A,{RegistryType:()=>l,getAuthConfiguration:()=>Q,getDefaultRegistry:()=>y,getPublishRegistry:()=>E,getRegistryConfiguration:()=>m,getScopeConfiguration:()=>w,getScopeRegistry:()=>B,normalizeRegistry:()=>I});var n={};r.r(n),r.d(n,{AuthType:()=>u,del:()=>N,get:()=>v,getIdentUrl:()=>b,handleInvalidAuthenticationError:()=>D,post:()=>S,put:()=>k});var o={};r.r(o),r.d(o,{makePublishBody:()=>J});var i=r(39922),s=r(54143),a=r(72785),c=r(53887),g=r.n(c);var l,u,h=r(79669),p=r(35691),d=r(92659),C=r(61899),f=r(78835);function I(e){return e.replace(/\/$/,"")}function E(e,{configuration:t}){return e.publishConfig&&e.publishConfig.registry?I(e.publishConfig.registry):e.name?B(e.name.scope,{configuration:t,type:l.PUBLISH_REGISTRY}):y({configuration:t,type:l.PUBLISH_REGISTRY})}function B(e,{configuration:t,type:r=l.FETCH_REGISTRY}){const A=w(e,{configuration:t});if(null===A)return y({configuration:t,type:r});const n=A.get(r);return null===n?y({configuration:t,type:r}):I(n)}function y({configuration:e,type:t=l.FETCH_REGISTRY}){const r=e.get(t);return I(null!==r?r:e.get(l.FETCH_REGISTRY))}function m(e,{configuration:t}){const r=t.get("npmRegistries"),A=r.get(e);if(void 0!==A)return A;const n=r.get(e.replace(/^[a-z]+:/,""));return void 0!==n?n:null}function w(e,{configuration:t}){if(null===e)return null;const r=t.get("npmScopes").get(e);return r||null}function Q(e,{configuration:t,ident:r}){const A=r&&w(r.scope,{configuration:t});if((null==A?void 0:A.get("npmAuthIdent"))||(null==A?void 0:A.get("npmAuthToken")))return A;return m(e,{configuration:t})||t}async function D(e,{attemptedAs:t,registry:r,headers:A,configuration:n}){if("HTTPError"===e.name&&401===e.response.statusCode)throw new p.lk(d.b.AUTHENTICATION_INVALID,`Invalid authentication (${"string"!=typeof t?"as "+await async function(e,t,{configuration:r}){var A;if(void 0===t||void 0===t.authorization)return"an anonymous user";try{const n=await h.get(new f.URL(e+"/-/whoami").href,{configuration:r,headers:t,jsonResponse:!0});return null!==(A=n.username)&&void 0!==A?A:"an unknown user"}catch(e){return"an unknown user"}}(r,A,{configuration:n}):"attempted as "+t})`)}function b(e){return e.scope?`/@${e.scope}%2f${e.name}`:"/"+e.name}async function v(e,{configuration:t,headers:r,ident:A,authType:n,registry:o,...i}){if(A&&void 0===o&&(o=B(A.scope,{configuration:t})),A&&A.scope&&void 0===n&&(n=u.BEST_EFFORT),"string"!=typeof o)throw new Error("Assertion failed: The registry should be a string");const s=F(o,{authType:n,configuration:t,ident:A});let a;s&&(r={...r,authorization:s});try{a=new f.URL(e)}catch(t){a=new f.URL(o+e)}try{return await h.get(a.href,{configuration:t,headers:r,...i})}catch(e){throw await D(e,{registry:o,configuration:t,headers:r}),e}}async function S(e,t,{attemptedAs:r,configuration:A,headers:n,ident:o,authType:i=u.ALWAYS_AUTH,registry:s,...a}){if(o&&void 0===s&&(s=B(o.scope,{configuration:A})),"string"!=typeof s)throw new Error("Assertion failed: The registry should be a string");const c=F(s,{authType:i,configuration:A,ident:o});c&&(n={...n,authorization:c});try{return await h.post(s+e,t,{configuration:A,headers:n,...a})}catch(o){if(!M(o))throw await D(o,{attemptedAs:r,registry:s,configuration:A,headers:n}),o;const i=await K(),c={...n,...R(i)};try{return await h.post(`${s}${e}`,t,{configuration:A,headers:c,...a})}catch(e){throw await D(e,{attemptedAs:r,registry:s,configuration:A,headers:n}),e}}}async function k(e,t,{attemptedAs:r,configuration:A,headers:n,ident:o,authType:i=u.ALWAYS_AUTH,registry:s,...a}){if(o&&void 0===s&&(s=B(o.scope,{configuration:A})),"string"!=typeof s)throw new Error("Assertion failed: The registry should be a string");const c=F(s,{authType:i,configuration:A,ident:o});c&&(n={...n,authorization:c});try{return await h.put(s+e,t,{configuration:A,headers:n,...a})}catch(o){if(!M(o))throw await D(o,{attemptedAs:r,registry:s,configuration:A,headers:n}),o;const i=await K(),c={...n,...R(i)};try{return await h.put(`${s}${e}`,t,{configuration:A,headers:c,...a})}catch(e){throw await D(e,{attemptedAs:r,registry:s,configuration:A,headers:n}),e}}}async function N(e,{attemptedAs:t,configuration:r,headers:A,ident:n,authType:o=u.ALWAYS_AUTH,registry:i,...s}){if(n&&void 0===i&&(i=B(n.scope,{configuration:r})),"string"!=typeof i)throw new Error("Assertion failed: The registry should be a string");const a=F(i,{authType:o,configuration:r,ident:n});a&&(A={...A,authorization:a});try{return await h.del(i+e,{configuration:r,headers:A,...s})}catch(n){if(!M(n))throw await D(n,{attemptedAs:t,registry:i,configuration:r,headers:A}),n;const o=await K(),a={...A,...R(o)};try{return await h.del(`${i}${e}`,{configuration:r,headers:a,...s})}catch(e){throw await D(e,{attemptedAs:t,registry:i,configuration:r,headers:A}),e}}}function F(e,{authType:t=u.CONFIGURATION,configuration:r,ident:A}){const n=Q(e,{configuration:r,ident:A}),o=function(e,t){switch(t){case u.CONFIGURATION:return e.get("npmAlwaysAuth");case u.BEST_EFFORT:case u.ALWAYS_AUTH:return!0;case u.NO_AUTH:return!1;default:throw new Error("Unreachable")}}(n,t);if(!o)return null;if(n.get("npmAuthToken"))return"Bearer "+n.get("npmAuthToken");if(n.get("npmAuthIdent"))return"Basic "+n.get("npmAuthIdent");if(o&&t!==u.BEST_EFFORT)throw new p.lk(d.b.AUTHENTICATION_NOT_FOUND,"No authentication configured for request");return null}async function K(){if(process.env.TEST_ENV)return process.env.TEST_NPM_2FA_TOKEN||"";const{otp:e}=await(0,C.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return e}function M(e){if("HTTPError"!==e.name)return!1;try{return e.response.headers["www-authenticate"].split(/,\s*/).map(e=>e.toLowerCase()).includes("otp")}catch(e){return!1}}function R(e){return{"npm-otp":e}}!function(e){e.FETCH_REGISTRY="npmRegistryServer",e.PUBLISH_REGISTRY="npmPublishRegistry"}(l||(l={})),function(e){e[e.NO_AUTH=0]="NO_AUTH",e[e.BEST_EFFORT=1]="BEST_EFFORT",e[e.CONFIGURATION=2]="CONFIGURATION",e[e.ALWAYS_AUTH=3]="ALWAYS_AUTH"}(u||(u={}));class x{supports(e,t){if(!e.reference.startsWith("npm:"))return!1;const r=new f.URL(e.reference);return!!g().valid(r.pathname)&&!r.searchParams.has("__archiveUrl")}getLocalPath(e,t){return null}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,[A,n,o]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,s.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from the remote registry"),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:A,releaseFs:n,prefixPath:s.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let r;try{r=await v(x.getLocatorUrl(e),{configuration:t.project.configuration,ident:e})}catch(A){r=await v(x.getLocatorUrl(e).replace(/%2f/g,"/"),{configuration:t.project.configuration,ident:e})}return await a.convertToZip(r,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:s.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,t,{configuration:r}){let A=B(e.scope,{configuration:r});const n=x.getLocatorUrl(e);return t=t.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),A=A.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),(t=t.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"))===A+n||t===A+n.replace(/%2f/g,"/")}static getLocatorUrl(e){const t=g().clean(e.reference.slice("npm:".length));if(null===t)throw new p.lk(d.b.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");return`${b(e)}/-/${e.name}-${t}.tgz`}}var L=r(46611),P=r(36545),O=r(32485);const U=s.makeIdent(null,"node-gyp"),T=/\b(node-gyp|prebuild-install)\b/;var j=r(52779);var Y=r(49881),G=r(76417),H=r(10129);async function J(e,t,{access:r,tag:A,registry:n}){const o=e.project.configuration,i=e.manifest.name,a=e.manifest.version,c=s.stringifyIdent(i),g=(0,G.createHash)("sha1").update(t).digest("hex"),l=H.Sd(t).toString();void 0===r&&(r=e.manifest.publishConfig&&"string"==typeof e.manifest.publishConfig.access?e.manifest.publishConfig.access:null!==o.get("npmPublishAccess")?o.get("npmPublishAccess"):i.scope?"restricted":"public");const u=await Y.packUtils.genPackageManifest(e),h=`${c}-${a}.tgz`,p=new f.URL(`${c}/-/${h}`,n);return{_id:c,_attachments:{[h]:{content_type:"application/octet-stream",data:t.toString("base64"),length:t.length}},name:c,access:r,"dist-tags":{[A]:a},versions:{[a]:{...u,_id:`${c}@${a}`,name:c,version:a,dist:{shasum:g,integrity:l,tarball:p.toString()}}}}}const q={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:i.a2.BOOLEAN,default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:i.a2.SECRET,default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:i.a2.SECRET,default:null}},z={npmPublishRegistry:{description:"Registry to push packages to",type:i.a2.STRING,default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:i.a2.STRING,default:"https://registry.yarnpkg.com"}},W={configuration:{...q,...z,npmScopes:{description:"Settings per package scope",type:i.a2.MAP,valueDefinition:{description:"",type:i.a2.SHAPE,properties:{...q,...z}}},npmRegistries:{description:"Settings per registry",type:i.a2.MAP,normalizeKeys:I,valueDefinition:{description:"",type:i.a2.SHAPE,properties:{...q}}}},fetchers:[class{supports(e,t){if(!e.reference.startsWith("npm:"))return!1;const{selector:r,params:A}=s.parseRange(e.reference);return!!g().valid(r)&&(null!==A&&"string"==typeof A.__archiveUrl)}getLocalPath(e,t){return null}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,[A,n,o]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,s.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from the remote server"),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:A,releaseFs:n,prefixPath:s.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){const{params:r}=s.parseRange(e.reference);if(null===r||"string"!=typeof r.__archiveUrl)throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");const A=await v(r.__archiveUrl,{configuration:t.project.configuration,ident:e});return await a.convertToZip(A,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:s.getIdentVendorPath(e),stripComponents:1})}},x],resolvers:[class{supportsDescriptor(e,t){return!!e.range.startsWith("npm:")&&!!s.tryParseDescriptor(e.range.slice("npm:".length),!0)}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Unreachable")}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){const r=s.parseDescriptor(e.range.slice("npm:".length),!0);return t.resolver.getResolutionDependencies(r,t)}async getCandidates(e,t,r){const A=s.parseDescriptor(e.range.slice("npm:".length),!0);return await r.resolver.getCandidates(A,t,r)}async getSatisfying(e,t,r){const A=s.parseDescriptor(e.range.slice("npm:".length),!0);return r.resolver.getSatisfying(A,t,r)}resolve(e,t){throw new Error("Unreachable")}},class{supportsDescriptor(e,t){return!!e.range.startsWith("npm:")&&!!P.validRange(e.range.slice("npm:".length))}supportsLocator(e,t){if(!e.reference.startsWith("npm:"))return!1;const{selector:r}=s.parseRange(e.reference);return!!g().valid(r)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){const A=P.validRange(e.range.slice("npm:".length));if(null===A)throw new Error("Expected a valid range, got "+e.range.slice("npm:".length));const n=await v(b(e),{configuration:r.project.configuration,ident:e,jsonResponse:!0}),o=Object.keys(n.versions).map(e=>new(g().SemVer)(e)).filter(e=>A.test(e)),i=o.filter(e=>!n.versions[e.raw].deprecated),a=i.length>0?i:o;return a.sort((e,t)=>-e.compare(t)),a.map(t=>{const A=s.makeLocator(e,"npm:"+t.raw),o=n.versions[t.raw].dist.tarball;return x.isConventionalTarballUrl(A,o,{configuration:r.project.configuration})?A:s.bindLocator(A,{__archiveUrl:o})})}async getSatisfying(e,t,r){const A=P.validRange(e.range.slice("npm:".length));if(null===A)throw new Error("Expected a valid range, got "+e.range.slice("npm:".length));return t.map(e=>{try{return new(g().SemVer)(e.slice("npm:".length))}catch(e){return null}}).filter(e=>null!==e).filter(e=>A.test(e)).sort((e,t)=>-e.compare(t)).map(t=>s.makeLocator(e,"npm:"+t.raw))}async resolve(e,t){const{selector:r}=s.parseRange(e.reference),A=g().clean(r);if(null===A)throw new p.lk(d.b.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");const n=await v(b(e),{configuration:t.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(n,"versions"))throw new p.lk(d.b.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(!Object.prototype.hasOwnProperty.call(n.versions,A))throw new p.lk(d.b.REMOTE_NOT_FOUND,`Registry failed to return reference "${A}"`);const o=new L.G;if(o.load(n.versions[A]),!o.dependencies.has(U.identHash)&&!o.peerDependencies.has(U.identHash))for(const r of o.scripts.values())if(r.match(T)){o.dependencies.set(U.identHash,s.makeDescriptor(U,"latest")),t.report.reportWarning(d.b.NODE_GYP_INJECTED,s.prettyLocator(t.project.configuration,e)+": Implicit dependencies on node-gyp are discouraged");break}return"string"==typeof o.raw.deprecated&&t.report.reportWarning(d.b.DEPRECATED_PACKAGE,`${s.prettyLocator(t.project.configuration,e)} is deprecated: ${o.raw.deprecated}`),{...e,version:A,languageName:"node",linkType:O.Un.HARD,dependencies:o.dependencies,peerDependencies:o.peerDependencies,dependenciesMeta:o.dependenciesMeta,peerDependenciesMeta:o.peerDependenciesMeta,bin:o.bin}}},class{supportsDescriptor(e,t){return!!e.range.startsWith("npm:")&&!!j.c.test(e.range.slice("npm:".length))}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Unreachable")}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){const A=e.range.slice("npm:".length),n=await v(b(e),{configuration:r.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(n,"dist-tags"))throw new p.lk(d.b.REMOTE_INVALID,'Registry returned invalid data - missing "dist-tags" field');const o=n["dist-tags"];if(!Object.prototype.hasOwnProperty.call(o,A))throw new p.lk(d.b.REMOTE_NOT_FOUND,`Registry failed to return tag "${A}"`);const i=o[A],a=s.makeLocator(e,"npm:"+i),c=n.versions[i].dist.tarball;return x.isConventionalTarballUrl(a,c,{configuration:r.project.configuration})?[a]:[s.bindLocator(a,{__archiveUrl:c})]}async getSatisfying(e,t,r){return null}async resolve(e,t){throw new Error("Unreachable")}}]}},49881:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>T,packUtils:()=>A});var A={};r.r(A),r.d(A,{genPackList:()=>K,genPackStream:()=>N,genPackageManifest:()=>F,hasPackScripts:()=>S,prepareForPack:()=>k});var n=r(54143),o=r(35691),i=r(92659),s=r(36370),a=r(40822);class c extends a.Command{}(0,s.gn)([a.Command.String("--cwd",{hidden:!0})],c.prototype,"cwd",void 0);var g=r(46611),l=r(46009);class u extends a.UsageError{constructor(e,t){super(`This command can only be run from within a workspace of your project (${l.y1.relative(e,t)} isn't a workspace of ${l.y1.join(e,g.G.fileName)}).`)}}r(63129),r(5864),r(35747);new Map([["constraints",[["constraints","query"],["constraints","source"],["constraints"]]],["exec",[]],["interactive-tools",[["search"],["upgrade-interactive"]]],["stage",[["stage"]]],["typescript",[]],["version",[["version","apply"],["version","check"],["version"]]],["workspace-tools",[["workspaces","focus"],["workspaces","foreach"]]]]);var h=r(71643),p=r(39922);(0,s.gn)([a.Command.Path("--welcome")],class extends c{async execute(){const e=await p.VK.find(this.context.cwd,this.context.plugins);this.context.stdout.write((e=>`\n${h.pretty(e,"Welcome on Yarn 2!","bold")} 🎉 Thanks for helping us shape our vision of how projects\nshould be managed going forward.\n\nBeing still in RC, Yarn 2 isn't completely stable yet. Some features might be\nmissing, and some behaviors may have received major overhaul. In case of doubt,\nuse the following URLs to get some insight:\n\n - The changelog:\n ${h.pretty(e,"https://github.com/yarnpkg/berry/tree/CHANGELOG.md","cyan")}\n\n - Our issue tracker:\n ${h.pretty(e,"https://github.com/yarnpkg/berry","cyan")}\n\n - Our Discord server:\n ${h.pretty(e,"https://discord.gg/yarnpkg","cyan")}\n\nWe're hoping you will enjoy the experience. For now, a good start is to run\nthe two following commands:\n\n ${h.pretty(e,"find . -name node_modules -prune -exec rm -r {} \\;","magenta")}\n ${h.pretty(e,"yarn install","magenta")}\n\nOne last trick! If you need at some point to upgrade Yarn to a nightly build,\nthe following command will install the CLI straight from master:\n\n ${h.pretty(e,"yarn set version from sources","magenta")}\n\nSee you later 👋\n`)(e).trim()+"\n")}}.prototype,"execute",null);var d=r(85824),C=r(28148),f=r(33720),I=r(15815),E=r(43896),B=r(63088),y=r(10489),m=r(2401),w=r.n(m),Q=r(59938),D=r(78761);const b=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],v=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function S(e){return!!B.hasWorkspaceScript(e,"prepack")||!!B.hasWorkspaceScript(e,"postpack")}async function k(e,{report:t},r){await B.maybeExecuteWorkspaceLifecycleScript(e,"prepack",{report:t});try{await r()}finally{await B.maybeExecuteWorkspaceLifecycleScript(e,"postpack",{report:t})}}async function N(e,t){var r,A;void 0===t&&(t=await K(e));const n=new Set;for(const t of null!==(A=null===(r=e.manifest.publishConfig)||void 0===r?void 0:r.executableFiles)&&void 0!==A?A:new Set)n.add(l.y1.normalize(t));for(const t of e.manifest.bin.values())n.add(l.y1.normalize(t));const o=Q.pack();process.nextTick(async()=>{for(const r of t){const t=l.y1.normalize(r),A=l.y1.resolve(e.cwd,t),i=l.y1.join("package",t),s=await E.xfs.lstatPromise(A),a={name:i,mtime:new Date(3155328e5)},c=n.has(t)?493:420;let g,u;const h=new Promise((e,t)=>{g=e,u=t}),p=e=>{e?u(e):g()};if(s.isFile()){let r;r="package.json"===t?Buffer.from(JSON.stringify(await F(e),null,2)):await E.xfs.readFilePromise(A),o.entry({...a,mode:c,type:"file"},r,p)}else s.isSymbolicLink()?o.entry({...a,mode:c,type:"symlink",linkname:await E.xfs.readlinkPromise(A)},p):p(new Error(`Unsupported file type ${s.mode} for ${l.cS.fromPortablePath(t)}`));await h}o.finalize()});const i=(0,D.createGzip)();return o.pipe(i),i}async function F(e){const t=JSON.parse(JSON.stringify(e.manifest.raw));return await e.project.configuration.triggerHook(e=>e.beforeWorkspacePacking,e,t),t}async function K(e){var t,r,A,n,o,i,s,a;const c=e.project,g=c.configuration,u={accept:[],reject:[]};for(const e of v)u.reject.push(e);for(const e of b)u.accept.push(e);u.reject.push(g.get("rcFilename"));const h=t=>{if(null===t||!t.startsWith(e.cwd+"/"))return;const r=l.y1.relative(e.cwd,t),A=l.y1.resolve(l.LZ.root,r);u.reject.push(A)};h(l.y1.resolve(c.cwd,g.get("lockfileFilename"))),h(g.get("bstatePath")),h(g.get("cacheFolder")),h(g.get("globalFolder")),h(g.get("installStatePath")),h(g.get("virtualFolder")),h(g.get("yarnPath")),await g.triggerHook(e=>e.populateYarnPaths,c,e=>{h(e)});for(const t of c.workspaces){const r=l.y1.relative(e.cwd,t.cwd);""===r||r.match(/^(\.\.)?\//)||u.reject.push("/"+r)}const p={accept:[],reject:[]},d=null!==(r=null===(t=e.manifest.publishConfig)||void 0===t?void 0:t.main)&&void 0!==r?r:e.manifest.main,C=null!==(n=null===(A=e.manifest.publishConfig)||void 0===A?void 0:A.module)&&void 0!==n?n:e.manifest.module,f=null!==(i=null===(o=e.manifest.publishConfig)||void 0===o?void 0:o.browser)&&void 0!==i?i:e.manifest.browser,I=null!==(a=null===(s=e.manifest.publishConfig)||void 0===s?void 0:s.bin)&&void 0!==a?a:e.manifest.bin;null!=d&&p.accept.push(l.y1.resolve(l.LZ.root,d)),null!=C&&p.accept.push(l.y1.resolve(l.LZ.root,C)),"string"==typeof f&&p.accept.push(l.y1.resolve(l.LZ.root,f));for(const e of I.values())p.accept.push(l.y1.resolve(l.LZ.root,e));if(f instanceof Map)for(const[e,t]of f.entries())p.accept.push(l.y1.resolve(l.LZ.root,e)),"string"==typeof t&&p.accept.push(l.y1.resolve(l.LZ.root,t));const E=null!==e.manifest.files;if(E){p.reject.push("/*");for(const t of e.manifest.files)R(p.accept,t,{cwd:l.LZ.root})}return await async function(e,{hasExplicitFileList:t,globalList:r,ignoreList:A}){const n=[],o=new y.n(e),i=[[l.LZ.root,[A]]];for(;i.length>0;){const[e,A]=i.pop(),s=await o.lstatPromise(e);if(!x(e,{globalList:r,ignoreLists:s.isDirectory()?null:A}))if(s.isDirectory()){const n=await o.readdirPromise(e);let s=!1,a=!1;if(!t||e!==l.LZ.root)for(const e of n)s=s||".gitignore"===e,a=a||".npmignore"===e;const c=a?await M(o,e,".npmignore"):s?await M(o,e,".gitignore"):null;let g=null!==c?[c].concat(A):A;x(e,{globalList:r,ignoreLists:A})&&(g=[...A,{accept:[],reject:["**/*"]}]);for(const t of n)i.push([l.y1.resolve(e,t),g])}else(s.isFile()||s.isSymbolicLink())&&n.push(l.y1.relative(l.LZ.root,e))}return n.sort()}(e.cwd,{hasExplicitFileList:E,globalList:u,ignoreList:p})}async function M(e,t,r){const A={accept:[],reject:[]},n=await e.readFilePromise(l.y1.join(t,r),"utf8");for(const e of n.split(/\n/g))R(A.reject,e,{cwd:t});return A}function R(e,t,{cwd:r}){const A=t.trim();""!==A&&"#"!==A[0]&&e.push(function(e,{cwd:t}){const r="!"===e[0];return r&&(e=e.slice(1)),e.match(/\.{0,1}\//)&&(e=l.y1.resolve(t,e)),r&&(e="!"+e),e}(A,{cwd:r}))}function x(e,{globalList:t,ignoreLists:r}){if(L(e,t.accept))return!1;if(L(e,t.reject))return!0;if(null!==r)for(const t of r){if(L(e,t.accept))return!1;if(L(e,t.reject))return!0}return!1}function L(e,t){let r=t;const A=[];for(let e=0;e{await k(r,{report:t},async()=>{t.reportJson({base:r.cwd});const e=await K(r);for(const r of e)t.reportInfo(null,r),t.reportJson({location:r});if(!this.dryRun){const t=await N(r,e),n=E.xfs.createWriteStream(A);t.pipe(n),await new Promise(e=>{n.on("finish",e)})}}),this.dryRun||(t.reportInfo(i.b.UNNAMED,"Package archive generated in "+h.pretty(e,A,h.Type.PATH)),t.reportJson({output:A}))})).exitCode()}}O.usage=a.Command.Usage({description:"generate a tarball from the active workspace",details:"\n This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\n\n If the `-o,---out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\n ",examples:[["Create an archive from the active workspace","yarn pack"],["List the files that would be made part of the workspace's archive","yarn pack --dry-run"],["Name and output the archive in a dedicated folder","yarn pack --out /artifacts/%s-%v.tgz"]]}),(0,s.gn)([a.Command.Boolean("--install-if-needed",{description:"Run a preliminary `yarn install` if the package contains build scripts"})],O.prototype,"installIfNeeded",void 0),(0,s.gn)([a.Command.Boolean("-n,--dry-run",{description:"Print the file paths without actually generating the package archive"})],O.prototype,"dryRun",void 0),(0,s.gn)([a.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],O.prototype,"json",void 0),(0,s.gn)([a.Command.String("--filename",{hidden:!1,description:"Create the archive at the specified path"}),a.Command.String("-o,--out",{description:"Create the archive at the specified path"})],O.prototype,"out",void 0),(0,s.gn)([a.Command.Path("pack")],O.prototype,"execute",null);const U=["dependencies","devDependencies","peerDependencies"],T={hooks:{beforeWorkspacePacking:(e,t)=>{t.publishConfig&&(t.publishConfig.main&&(t.main=t.publishConfig.main),t.publishConfig.browser&&(t.browser=t.publishConfig.browser),t.publishConfig.module&&(t.module=t.publishConfig.module),t.publishConfig.browser&&(t.browser=t.publishConfig.browser),t.publishConfig.bin&&(t.bin=t.publishConfig.bin));const r=e.project;for(const A of U)for(const s of e.manifest.getForScope(A).values()){const e=r.tryWorkspaceByDescriptor(s),a=n.parseRange(s.range);if("workspace:"===a.protocol)if(null===e){if(null===r.tryWorkspaceByIdent(s))throw new o.lk(i.b.WORKSPACE_NOT_FOUND,n.prettyDescriptor(r.configuration,s)+": No local workspace found for this range")}else{let r;r=n.areDescriptorsEqual(s,e.anchoredDescriptor)||"*"===a.selector?e.manifest.version:a.selector,t[A][n.stringifyIdent(s)]=r}}}},commands:[O]}},29936:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>re,patchUtils:()=>A});var A={};r.r(A),r.d(A,{applyPatchFile:()=>S,diffFolders:()=>H,extractPackageToDisk:()=>G,isParentRequired:()=>j,loadPatchFiles:()=>Y,makeDescriptor:()=>O,makeLocator:()=>U,parseDescriptor:()=>x,parseLocator:()=>L,parsePatchFile:()=>D});var n=r(39922),o=r(35691),i=r(92659),s=r(54143),a=r(73632),c=r(43896),g=r(46009),l=r(90739),u=r(75448),h=r(65281),p=r(33720),d=r(6220),C=r(36545),f=r(78420);class I extends Error{constructor(e,t){super("Cannot apply hunk #"+(e+1)),this.hunk=t}}const E=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function B(e){return g.y1.relative(g.LZ.root,g.y1.resolve(g.LZ.root,g.cS.toPortablePath(e)))}function y(e){const t=e.trim().match(E);if(!t)throw new Error(`Bad header line: '${e}'`);return{original:{start:Math.max(Number(t[1]),1),length:Number(t[3]||1)},patched:{start:Math.max(Number(t[4]),1),length:Number(t[6]||1)}}}var m;!function(e){e.Context="context",e.Insertion="insertion",e.Deletion="deletion"}(m||(m={}));const w={"@":"header","-":m.Deletion,"+":m.Insertion," ":m.Context,"\\":"pragma",undefined:m.Context};function Q(e){const t=511&parseInt(e,8);if(420!==t&&493!==t)throw new Error("Unexpected file mode string: "+e);return t}function D(e){const t=e.split(/\n/g);return""===t[t.length-1]&&t.pop(),function(e){const t=[];for(const r of e){const{semverExclusivity:e,diffLineFromPath:A,diffLineToPath:n,oldMode:o,newMode:i,deletedFileMode:s,newFileMode:c,renameFrom:g,renameTo:l,beforeHash:u,afterHash:h,fromPath:p,toPath:d,hunks:C}=r,f=g?"rename":s?"file deletion":c?"file creation":C&&C.length>0?"patch":"mode change";let I=null;switch(f){case"rename":if(!g||!l)throw new Error("Bad parser state: rename from & to not given");t.push({type:"rename",semverExclusivity:e,fromPath:B(g),toPath:B(l)}),I=l;break;case"file deletion":{const r=A||p;if(!r)throw new Error("Bad parse state: no path given for file deletion");t.push({type:"file deletion",semverExclusivity:e,hunk:C&&C[0]||null,path:B(r),mode:Q(s),hash:u})}break;case"file creation":{const r=n||d;if(!r)throw new Error("Bad parse state: no path given for file creation");t.push({type:"file creation",semverExclusivity:e,hunk:C&&C[0]||null,path:B(r),mode:Q(c),hash:h})}break;case"patch":case"mode change":I=d||n;break;default:a.assertNever(f)}I&&o&&i&&o!==i&&t.push({type:"mode change",semverExclusivity:e,path:B(I),oldMode:Q(o),newMode:Q(i)}),I&&C&&C.length&&t.push({type:"patch",semverExclusivity:e,path:B(I),hunks:C,beforeHash:u,afterHash:h})}return t}(function(e){const t=[];let r={semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null},A="parsing header",n=null,o=null;function i(){n&&(o&&(n.parts.push(o),o=null),r.hunks.push(n),n=null)}function s(){i(),t.push(r),r={semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}}for(let t=0;te<0?e:"+"+e;throw new Error(`hunk header integrity check failed (expected @@ ${A(e.header.original.length)} ${A(e.header.patched.length)} @@, got @@ ${A(t)} ${A(r)} @@)`)}}async function v(e,t,r){const A=await e.lstatPromise(t),n=await r();if(void 0!==n&&(t=n),e.lutimesPromise)await e.lutimesPromise(t,A.atime,A.mtime);else{if(A.isSymbolicLink())throw new Error("Cannot preserve the time values of a symlink");await e.utimesPromise(t,A.atime,A.mtime)}}async function S(e,{baseFs:t=new f.S,dryRun:r=!1,version:A=null}={}){for(const n of e)if(null===n.semverExclusivity||null===A||C.satisfiesWithPrereleases(A,n.semverExclusivity))switch(n.type){case"file deletion":if(r){if(!t.existsSync(n.path))throw new Error("Trying to delete a file that doesn't exist: "+n.path)}else await v(t,g.y1.dirname(n.path),async()=>{await t.unlinkPromise(n.path)});break;case"rename":if(r){if(!t.existsSync(n.fromPath))throw new Error("Trying to move a file that doesn't exist: "+n.fromPath)}else await v(t,g.y1.dirname(n.fromPath),async()=>{await v(t,g.y1.dirname(n.toPath),async()=>{await v(t,n.fromPath,async()=>(await t.movePromise(n.fromPath,n.toPath),n.toPath))})});break;case"file creation":if(r){if(t.existsSync(n.path))throw new Error("Trying to create a file that already exists: "+n.path)}else{const e=n.hunk?n.hunk.parts[0].lines.join("\n")+(n.hunk.parts[0].noNewlineAtEndOfFile?"":"\n"):"";await t.mkdirpPromise(g.y1.dirname(n.path),{chmod:493,utimes:[315532800,315532800]}),await t.writeFilePromise(n.path,e,{mode:n.mode}),await t.utimesPromise(n.path,315532800,315532800)}break;case"patch":await v(t,n.path,async()=>{await F(n,{baseFs:t,dryRun:r})});break;case"mode change":{const e=(await t.statPromise(n.path)).mode;if(k(n.newMode)!==k(e))continue;await v(t,n.path,async()=>{await t.chmodPromise(n.path,n.newMode)})}break;default:a.assertNever(n)}}function k(e){return(64&e)>0}function N(e){return e.replace(/\s+$/,"")}async function F({hunks:e,path:t},{baseFs:r,dryRun:A=!1}){const n=await r.statSync(t).mode,o=(await r.readFileSync(t,"utf8")).split(/\n/),i=[];let s=0,c=0;for(const t of e){const r=Math.max(c,t.header.patched.start+s),A=Math.max(0,r-c),n=Math.max(0,o.length-r-t.header.original.length),a=Math.max(A,n);let g=0,l=0,u=null;for(;g<=a;){if(g<=A&&(l=r-g,u=K(t,o,l),null!==u)){g=-g;break}if(g<=n&&(l=r+g,u=K(t,o,l),null!==u))break;g+=1}if(null===u)throw new I(e.indexOf(t),t);i.push(u),s+=g,c=l+t.header.original.length}if(A)return;let g=0;for(const e of i)for(const t of e)switch(t.type){case"splice":{const e=t.index+g;o.splice(e,t.numToDelete,...t.linesToInsert),g+=t.linesToInsert.length-t.numToDelete}break;case"pop":o.pop();break;case"push":o.push(t.line);break;default:a.assertNever(t)}await r.writeFilePromise(t,o.join("\n"),{mode:n})}function K(e,t,r){const A=[];for(const o of e.parts)switch(o.type){case m.Context:case m.Deletion:for(const e of o.lines){const A=t[r];if(null==A||(n=e,N(A)!==N(n)))return null;r+=1}o.type===m.Deletion&&(A.push({type:"splice",index:r-o.lines.length,numToDelete:o.lines.length,linesToInsert:[]}),o.noNewlineAtEndOfFile&&A.push({type:"push",line:""}));break;case m.Insertion:A.push({type:"splice",index:r,numToDelete:0,linesToInsert:o.lines}),o.noNewlineAtEndOfFile&&A.push({type:"pop"});break;default:a.assertNever(o.type)}var n;return A}const M=/^builtin<([^>]+)>$/;function R(e,t){const{source:r,selector:A,params:n}=s.parseRange(e);if(null===r)throw new Error("Patch locators must explicitly define their source");const o=A?A.split(/&/).map(e=>g.cS.toPortablePath(e)):[],i=n&&"string"==typeof n.locator?s.parseLocator(n.locator):null,a=n&&"string"==typeof n.version?n.version:null;return{parentLocator:i,sourceItem:t(r),patchPaths:o,sourceVersion:a}}function x(e){const{sourceItem:t,...r}=R(e.range,s.parseDescriptor);return{...r,sourceDescriptor:t}}function L(e){const{sourceItem:t,...r}=R(e.reference,s.parseLocator);return{...r,sourceLocator:t}}function P({parentLocator:e,sourceItem:t,patchPaths:r,sourceVersion:A,patchHash:n},o){const i=null!==e?{locator:s.stringifyLocator(e)}:{},a=void 0!==A?{version:A}:{},c=void 0!==n?{hash:n}:{};return s.makeRange({protocol:"patch:",source:o(t),selector:r.join("&"),params:{...a,...c,...i}})}function O(e,{parentLocator:t,sourceDescriptor:r,patchPaths:A}){return s.makeLocator(e,P({parentLocator:t,sourceItem:r,patchPaths:A},s.stringifyDescriptor))}function U(e,{parentLocator:t,sourcePackage:r,patchPaths:A,patchHash:n}){return s.makeLocator(e,P({parentLocator:t,sourceItem:r,sourceVersion:r.version,patchPaths:A,patchHash:n},s.stringifyLocator))}function T({onAbsolute:e,onRelative:t,onBuiltin:r},A){const n=A.match(M);return null!==n?r(n[1]):g.y1.isAbsolute(A)?e(A):t(A)}function j(e){return T({onAbsolute:()=>!1,onRelative:()=>!0,onBuiltin:()=>!1},e)}async function Y(e,t,r){const A=null!==e?await r.fetcher.fetch(e,r):null,n=A&&A.localPath?{packageFs:new u.M(g.LZ.root),prefixPath:g.y1.relative(g.LZ.root,A.localPath)}:A;A&&A!==n&&A.releaseFs&&A.releaseFs();return(await a.releaseAfterUseAsync(async()=>await Promise.all(t.map(async e=>T({onAbsolute:async()=>await c.xfs.readFilePromise(e,"utf8"),onRelative:async()=>{if(null===A)throw new Error("Assertion failed: The parent locator should have been fetched");return await A.packageFs.readFilePromise(e,"utf8")},onBuiltin:async e=>await r.project.configuration.firstHook(e=>e.getBuiltinPatch,r.project,e)},e))))).map(e=>"string"==typeof e?e.replace(/\r\n?/g,"\n"):e)}async function G(e,{cache:t,project:r}){const A=r.storedChecksums,n=new p.$,o=r.configuration.makeFetcher(),i=await o.fetch(e,{cache:t,project:r,fetcher:o,checksums:A,report:n}),a=await c.xfs.mktempPromise();return await c.xfs.copyPromise(a,i.prefixPath,{baseFs:i.packageFs}),await c.xfs.writeJsonPromise(g.y1.join(a,".yarn-patch.json"),{locator:s.stringifyLocator(e)}),c.xfs.detachTemp(a),a}async function H(e,t){const r=g.cS.fromPortablePath(e).replace(/\\/g,"/"),A=g.cS.fromPortablePath(t).replace(/\\/g,"/"),{stdout:n}=await d.execvp("git",["diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index",r,A],{cwd:g.cS.toPortablePath(process.cwd())}),o=r.startsWith("/")?e=>e.slice(1):e=>e;return n.replace(new RegExp(`(a|b)(${a.escapeRegExp(`/${o(r)}/`)})`,"g"),"$1/").replace(new RegExp("(a|b)"+a.escapeRegExp(`/${o(A)}/`),"g"),"$1/").replace(new RegExp(a.escapeRegExp(r+"/"),"g"),"").replace(new RegExp(a.escapeRegExp(A+"/"),"g"),"")}var J=r(71643);function q(e,{configuration:t,report:r}){for(const A of e.parts)for(const e of A.lines)switch(A.type){case m.Context:r.reportInfo(null," "+J.pretty(t,e,"grey"));break;case m.Deletion:r.reportError(i.b.FROZEN_LOCKFILE_EXCEPTION,"- "+J.pretty(t,e,J.Type.REMOVED));break;case m.Insertion:r.reportError(i.b.FROZEN_LOCKFILE_EXCEPTION,"+ "+J.pretty(t,e,J.Type.ADDED));break;default:a.assertNever(A.type)}}var z=r(20624);var W=r(36370),V=r(25413),X=r(85824),_=r(28148),Z=r(40822);class $ extends V.BaseCommand{async execute(){const e=await n.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await X.I.find(e,this.context.cwd),A=await _.C.find(e);if(!r)throw new V.WorkspaceRequiredError(t.cwd,this.context.cwd);await t.restoreInstallState();const o=g.y1.resolve(this.context.cwd,g.cS.toPortablePath(this.patchFolder)),i=g.y1.join(o,".yarn-patch.json");if(!c.xfs.existsSync(i))throw new Z.UsageError("The argument folder didn't get created by 'yarn patch'");const a=await c.xfs.readJsonPromise(i),l=s.parseLocator(a.locator,!0);if(!t.storedPackages.has(l.locatorHash))throw new Z.UsageError("No package found in the project for the given locator");const u=await G(l,{cache:A,project:t});this.context.stdout.write(await H(u,o))}}$.usage=Z.Command.Usage({description:"\n This will turn the folder passed in parameter into a patchfile suitable for consumption with the `patch:` protocol.\n\n Only folders generated through `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "}),(0,W.gn)([Z.Command.String()],$.prototype,"patchFolder",void 0),(0,W.gn)([Z.Command.Path("patch-commit")],$.prototype,"execute",null);var ee=r(15815);class te extends V.BaseCommand{async execute(){const e=await n.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await X.I.find(e,this.context.cwd),A=await _.C.find(e);if(!r)throw new V.WorkspaceRequiredError(t.cwd,this.context.cwd);await t.restoreInstallState();let o=s.parseLocator(this.package);if("unknown"===o.reference){const r=a.mapAndFilter([...t.storedPackages.values()],e=>e.identHash!==o.identHash||s.isVirtualLocator(e)?a.mapAndFilter.skip:e);if(0===r.length)throw new Z.UsageError("No package found in the project for the given locator");if(r.length>1)throw new Z.UsageError("Multiple candidate packages found; explicitly choose one of them (use `yarn why ` to get more information as to who depends on them):\n"+r.map(t=>"\n- "+s.prettyLocator(e,t)).join(""));o=r[0]}if(!t.storedPackages.has(o.locatorHash))throw new Z.UsageError("No package found in the project for the given locator");await ee.Pk.start({configuration:e,stdout:this.context.stdout},async r=>{const n=await G(o,{cache:A,project:t});r.reportInfo(i.b.UNNAMED,`Package ${s.prettyLocator(e,o)} got extracted with success!`),r.reportInfo(i.b.UNNAMED,"You can now edit the following folder: "+J.pretty(e,g.cS.fromPortablePath(n),"magenta")),r.reportInfo(i.b.UNNAMED,`Once you are done run ${J.pretty(e,"yarn patch-commit "+g.cS.fromPortablePath(n),"cyan")} and Yarn will store a patchfile based on your changes.`)})}}te.usage=Z.Command.Usage({description:'\n This command will cause a package to be extracted in a temporary directory (under a folder named "patch-workdir"). This folder will be editable at will; running `yarn patch` inside it will then cause Yarn to generate a patchfile and register it into your top-level manifest (cf the `patch:` protocol).\n '}),(0,W.gn)([Z.Command.String()],te.prototype,"package",void 0),(0,W.gn)([Z.Command.Path("patch")],te.prototype,"execute",null);const re={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:n.a2.BOOLEAN,default:!1}},commands:[$,te],fetchers:[class{supports(e,t){return!!e.reference.startsWith("patch:")}getLocalPath(e,t){return null}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,[A,n,o]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,s.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from the disk"),loader:()=>this.patchPackage(e,t),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:A,releaseFs:n,prefixPath:s.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:o}}async patchPackage(e,t){const{parentLocator:r,sourceLocator:A,sourceVersion:n,patchPaths:p}=L(e),d=await Y(r,p,t),C=await c.xfs.mktempPromise(),f=g.y1.join(C,"patched.zip"),E=await t.fetcher.fetch(A,t),B=s.getIdentVendorPath(e),y=await(0,h.getLibzipPromise)(),m=new l.d(f,{libzip:y,create:!0,level:t.project.configuration.get("compressionLevel")});await m.mkdirpPromise(B),await a.releaseAfterUseAsync(async()=>{await m.copyPromise(B,E.prefixPath,{baseFs:E.packageFs,stableSort:!0})},E.releaseFs);const w=new u.M(g.y1.resolve(g.LZ.root,B),{baseFs:m});for(const e of d)if(null!==e)try{await S(D(e),{baseFs:w,version:n})}catch(e){if(!(e instanceof I))throw e;const r=t.project.configuration.get("enableInlineHunks"),A=r?"":" (set enableInlineHunks for details)";throw new o.lk(i.b.PATCH_HUNK_FAILED,e.message+A,A=>{r&&q(e.hunk,{configuration:t.project.configuration,report:A})})}return m}}],resolvers:[class{supportsDescriptor(e,t){return!!e.range.startsWith("patch:")}supportsLocator(e,t){return!!e.reference.startsWith("patch:")}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,r){const{patchPaths:A}=x(e);return A.every(e=>!j(e))?e:s.bindDescriptor(e,{locator:s.stringifyLocator(t)})}getResolutionDependencies(e,t){const{sourceDescriptor:r}=x(e);return[r]}async getCandidates(e,t,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");const{parentLocator:A,sourceDescriptor:n,patchPaths:o}=x(e),i=await Y(A,o,r.fetchOptions),s=t.get(n.descriptorHash);if(void 0===s)throw new Error("Assertion failed: The dependency should have been resolved");return[U(e,{parentLocator:A,sourcePackage:s,patchPaths:o,patchHash:z.makeHash("2",...i).slice(0,6)})]}async getSatisfying(e,t,r){return null}async resolve(e,t){const{sourceLocator:r}=L(e);return{...await t.resolver.resolve(r,t),...e}}}]}},83228:(e,t,r)=>{"use strict";r.r(t),r.d(t,{PnpInstaller:()=>k,PnpLinker:()=>S,default:()=>Y,getPnpPath:()=>T,jsInstallUtils:()=>A,pnpUtils:()=>n,quotePathIfNeeded:()=>j});var A={};r.r(A),r.d(A,{checkAndReportManifestCompatibility:()=>y,extractBuildScripts:()=>m,getExtractHint:()=>Q,hasBindingGyp:()=>D});var n={};r.r(n),r.d(n,{getUnpluggedPath:()=>b});var o=r(39922),i=r(43896),s=r(46009),a=r(53887),c=r.n(a),g=r(54143),l=r(71643),u=r(73632),h=r(32485),p=r(92659),d=r(46611),C=r(17674),f=r(75448),I=r(34432),E=r(40822),B=r(92409);function y(e,t,r,{configuration:A,report:n}){return d.G.isManifestFieldCompatible(t.manifest.os,process.platform)?!!d.G.isManifestFieldCompatible(t.manifest.cpu,process.arch)||(null==n||n.reportWarningOnce(p.b.INCOMPATIBLE_CPU,`${g.prettyLocator(A,e)} The CPU architecture ${process.arch} is incompatible with this module, ${r} skipped.`),!1):(null==n||n.reportWarningOnce(p.b.INCOMPATIBLE_OS,`${g.prettyLocator(A,e)} The platform ${process.platform} is incompatible with this module, ${r} skipped.`),!1)}function m(e,t,r,{configuration:A,report:n}){const o=[];for(const e of["preinstall","install","postinstall"])t.manifest.scripts.has(e)&&o.push([B.k.SCRIPT,e]);if(!t.manifest.scripts.has("install")&&t.misc.hasBindingGyp&&o.push([B.k.SHELLCODE,"node-gyp rebuild"]),0===o.length)return[];if(!A.get("enableScripts")&&!r.built)return null==n||n.reportWarningOnce(p.b.DISABLED_BUILD_SCRIPTS,g.prettyLocator(A,e)+" lists build scripts, but all build scripts have been disabled."),[];if(e.linkType!==h.Un.HARD)return null==n||n.reportWarningOnce(p.b.SOFT_LINK_BUILD,g.prettyLocator(A,e)+" lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored."),[];if(r&&!1===r.built)return null==n||n.reportInfoOnce(p.b.BUILD_DISABLED,g.prettyLocator(A,e)+" lists build scripts, but its build has been explicitly disabled through configuration."),[];return y(e,t,"build",{configuration:A,report:n})?o:[]}const w=new Set([".exe",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function Q(e){return e.packageFs.getExtractHint({relevantExtensions:w})}function D(e){const t=s.y1.join(e.prefixPath,"binding.gyp");return e.packageFs.existsSync(t)}function b(e,{configuration:t}){return s.y1.resolve(t.get("pnpUnpluggedFolder"),g.slugifyLocator(e))}const v=new Set([g.makeIdent(null,"nan").identHash,g.makeIdent(null,"node-gyp").identHash,g.makeIdent(null,"node-pre-gyp").identHash,g.makeIdent(null,"node-addon-api").identHash,g.makeIdent(null,"fsevents").identHash]);class S{constructor(){this.mode="strict"}supportsPackage(e,t){return"pnp"===t.project.configuration.get("nodeLinker")&&t.project.configuration.get("pnpMode")===this.mode}async findPackageLocation(e,t){const r=T(t.project).main;if(!i.xfs.existsSync(r))throw new E.UsageError(`The project in ${l.pretty(t.project.configuration,t.project.cwd+"/package.json",l.Type.PATH)} doesn't seem to have been installed - running an install there might help`);const A=u.dynamicRequireNoCache(r),n={name:g.requirableIdent(e),reference:e.reference},o=A.getPackageInformation(n);if(!o)throw new E.UsageError(`Couldn't find ${g.prettyLocator(t.project.configuration,e)} in the currently installed PnP map - running an install might help`);return s.cS.toPortablePath(o.packageLocation)}async findPackageLocator(e,t){const A=T(t.project).main;if(!i.xfs.existsSync(A))return null;const n=s.cS.fromPortablePath(A),o=u.dynamicRequire(n);delete r.c[n];const a=o.findPackageLocator(s.cS.fromPortablePath(e));return a?g.makeLocator(g.parseIdent(a.name),a.reference):null}makeInstaller(e){return new k(e)}}class k{constructor(e){this.opts=e,this.mode="strict",this.packageRegistry=new Map,this.virtualTemplates=new Map,this.customData={store:new Map},this.unpluggedPaths=new Set,this.opts=e}getCustomDataKey(){return JSON.stringify({name:"PnpInstaller",version:1})}attachCustomData(e){this.customData=e}async installPackage(e,t){const r=g.requirableIdent(e),A=e.reference,n=!!this.opts.project.tryWorkspaceByLocator(e),o=e.peerDependencies.size>0&&!g.isVirtualLocator(e),i=!o&&!n,a=!o&&e.linkType!==h.Un.SOFT;let c=this.customData.store.get(e.locatorHash);void 0===c&&(c=await async function(e,t){var r;const A=null!==(r=await d.G.tryFind(t.prefixPath,{baseFs:t.packageFs}))&&void 0!==r?r:new d.G,n=new Set(["preinstall","install","postinstall"]);for(const e of A.scripts.keys())n.has(e)||A.scripts.delete(e);return{manifest:{os:A.os,cpu:A.cpu,scripts:A.scripts,preferUnplugged:A.preferUnplugged},misc:{extractHint:Q(t),hasBindingGyp:D(t)}}}(0,t),e.linkType===h.Un.HARD&&this.customData.store.set(e.locatorHash,c));const l=this.opts.project.getDependencyMeta(e,e.version),p=i?m(e,c,l,{configuration:this.opts.project.configuration,report:this.opts.report}):[],f=a?await this.unplugPackageIfNeeded(e,c,t,l):t.packageFs;if(s.y1.isAbsolute(t.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${t.prefixPath}) to be relative to the parent`);const I=s.y1.resolve(f.getRealPath(),t.prefixPath),E=N(this.opts.project.cwd,I),B=new Map,y=new Set;if(g.isVirtualLocator(e)){for(const t of e.peerDependencies.values())B.set(g.requirableIdent(t),null),y.add(g.stringifyIdent(t));if(!this.opts.project.tryWorkspaceByLocator(e)){const t=g.devirtualizeLocator(e);this.virtualTemplates.set(t.locatorHash,{location:N(this.opts.project.cwd,C.p.resolveVirtual(I)),locator:t})}}return u.getMapWithDefault(this.packageRegistry,r).set(A,{packageLocation:E,packageDependencies:B,packagePeers:y,linkType:e.linkType,discardFromLookup:t.discardFromLookup||!1}),{packageLocation:I,buildDirective:p.length>0?p:null}}async attachInternalDependencies(e,t){const r=this.getPackageInformation(e);for(const[e,A]of t){const t=g.areIdentsEqual(e,A)?A.reference:[g.requirableIdent(A),A.reference];r.packageDependencies.set(g.requirableIdent(e),t)}}async attachExternalDependents(e,t){for(const r of t){this.getDiskInformation(r).packageDependencies.set(g.requirableIdent(e),e.reference)}}async finalizeInstall(){const e=new Set;for(const{locator:e,location:t}of this.virtualTemplates.values())u.getMapWithDefault(this.packageRegistry,g.stringifyIdent(e)).set(e.reference,{packageLocation:t,packageDependencies:new Map,packagePeers:new Set,linkType:h.Un.SOFT,discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));const t=this.opts.project.configuration.get("pnpFallbackMode"),r=e,A=this.opts.project.workspaces.map(({anchoredLocator:e})=>({name:g.requirableIdent(e),reference:e.reference})),n="none"!==t,o=[],i=new Map,s=u.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),a=this.packageRegistry,c=this.opts.project.configuration.get("pnpShebang");if("dependencies-only"===t)for(const e of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(e)&&o.push({name:g.requirableIdent(e),reference:e.reference});return await this.finalizeInstallWithPnp({blacklistedLocations:r,dependencyTreeRoots:A,enableTopLevelFallback:n,fallbackExclusionList:o,fallbackPool:i,ignorePattern:s,packageRegistry:a,shebang:c}),{customData:this.customData}}async finalizeInstallWithPnp(e){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;const t=T(this.opts.project),r=this.opts.project.configuration.get("pnpDataPath");if(await i.xfs.removePromise(t.other),"pnp"!==this.opts.project.configuration.get("nodeLinker"))return await i.xfs.removePromise(t.main),void await i.xfs.removePromise(r);const A=await this.locateNodeModules(e.ignorePattern);if(A.length>0){this.opts.report.reportWarning(p.b.DANGEROUS_NODE_MODULES,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(const e of A)await i.xfs.removePromise(e)}if(this.opts.project.configuration.get("pnpEnableInlining")){const A=(0,I.gY)(e);await i.xfs.changeFilePromise(t.main,A,{automaticNewlines:!0}),await i.xfs.chmodPromise(t.main,493),await i.xfs.removePromise(r)}else{const A=s.y1.relative(s.y1.dirname(t.main),r),{dataFile:n,loaderFile:o}=(0,I.Q$)({...e,dataLocation:A});await i.xfs.changeFilePromise(t.main,o,{automaticNewlines:!0}),await i.xfs.chmodPromise(t.main,493),await i.xfs.changeFilePromise(r,n,{automaticNewlines:!0}),await i.xfs.chmodPromise(r,420)}const n=this.opts.project.configuration.get("pnpUnpluggedFolder");if(0===this.unpluggedPaths.size)await i.xfs.removePromise(n);else for(const e of await i.xfs.readdirPromise(n)){const t=s.y1.resolve(n,e);this.unpluggedPaths.has(t)||await i.xfs.removePromise(t)}}async locateNodeModules(e){const t=[],r=e?new RegExp(e):null;for(const e of this.opts.project.workspaces){const A=s.y1.join(e.cwd,"node_modules");if(r&&r.test(s.y1.relative(this.opts.project.cwd,e.cwd))||!i.xfs.existsSync(A))continue;const n=await i.xfs.readdirPromise(A,{withFileTypes:!0}),o=n.filter(e=>!e.isDirectory()||".bin"===e.name||!e.name.startsWith("."));if(o.length===n.length)t.push(A);else for(const e of o)t.push(s.y1.join(A,e.name))}return t}async unplugPackageIfNeeded(e,t,r,A){return this.shouldBeUnplugged(e,t,A)?this.unplugPackage(e,r):r.packageFs}shouldBeUnplugged(e,t,r){return void 0!==r.unplugged?r.unplugged:!!v.has(e.identHash)||(null!==t.manifest.preferUnplugged?t.manifest.preferUnplugged:!!(m(e,t,r,{configuration:this.opts.project.configuration}).length>0||t.misc.extractHint))}async unplugPackage(e,t){const r=b(e,{configuration:this.opts.project.configuration});this.unpluggedPaths.add(r);const A=s.y1.join(r,t.prefixPath,".ready");return await i.xfs.existsPromise(A)||(await i.xfs.mkdirPromise(r,{recursive:!0}),await i.xfs.copyPromise(r,s.LZ.dot,{baseFs:t.packageFs,overwrite:!1}),await i.xfs.writeFilePromise(A,"")),new f.M(r)}getPackageInformation(e){const t=g.requirableIdent(e),r=e.reference,A=this.packageRegistry.get(t);if(!A)throw new Error(`Assertion failed: The package information store should have been available (for ${g.prettyIdent(this.opts.project.configuration,e)})`);const n=A.get(r);if(!n)throw new Error(`Assertion failed: The package information should have been available (for ${g.prettyLocator(this.opts.project.configuration,e)})`);return n}getDiskInformation(e){const t=u.getMapWithDefault(this.packageRegistry,"@@disk"),r=N(this.opts.project.cwd,e);return u.getFactoryWithDefault(t,r,()=>({packageLocation:r,packageDependencies:new Map,packagePeers:new Set,linkType:h.Un.SOFT,discardFromLookup:!1}))}}function N(e,t){let r=s.y1.relative(e,t);return r.match(/^\.{0,2}\//)||(r="./"+r),r.replace(/\/?$/,"/")}var F=r(36370),K=r(25413),M=r(85824),R=r(28148),x=r(15815),L=r(36545),P=r(2401),O=r.n(P);class U extends K.BaseCommand{constructor(){super(...arguments),this.patterns=[],this.all=!1,this.recursive=!1,this.json=!1}async execute(){const e=await o.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await M.I.find(e,this.context.cwd),A=await R.C.find(e);if(!r)throw new K.WorkspaceRequiredError(t.cwd,this.context.cwd);if("pnp"!==e.get("nodeLinker"))throw new E.UsageError("This command can only be used if the `nodeLinker` option is set to `pnp`");await t.restoreInstallState();const n=new Set(this.patterns),i=this.patterns.map(t=>{const r=g.parseDescriptor(t),A="unknown"!==r.range?r:g.makeDescriptor(r,"*");if(!c().validRange(A.range))throw new E.UsageError(`The range of the descriptor patterns must be a valid semver range (${g.prettyDescriptor(e,A)})`);return e=>{const r=g.stringifyIdent(e);return!!O().isMatch(r,g.stringifyIdent(A))&&(!(e.version&&!L.satisfiesWithPrereleases(e.version,A.range))&&(n.delete(t),!0))}}),s=e=>{const r=new Set,A=[],n=(e,o)=>{if(!r.has(e.locatorHash)&&(r.add(e.locatorHash),!t.tryWorkspaceByLocator(e)&&i.some(t=>t(e))&&A.push(e),!(o>0)||this.recursive))for(const r of e.dependencies.values()){const e=t.storedResolutions.get(r.descriptorHash);if(!e)throw new Error("Assertion failed: The resolution should have been registered");const A=t.storedPackages.get(e);if(!A)throw new Error("Assertion failed: The package should have been registered");n(A,o+1)}};for(const r of e){const e=t.storedPackages.get(r.anchoredLocator.locatorHash);if(!e)throw new Error("Assertion failed: The package should have been registered");n(e,0)}return A};let a,h;if(this.all&&this.recursive?(a=(()=>{const e=[];for(const r of t.storedPackages.values())t.tryWorkspaceByLocator(r)||g.isVirtualLocator(r)||!i.some(e=>e(r))||e.push(r);return e})(),h="the project"):this.all?(a=s(t.workspaces),h="any workspace"):(a=s([r]),h="this workspace"),n.size>1)throw new E.UsageError(`Patterns ${l.prettyList(e,n,l.Type.CODE)} don't match any packages referenced by ${h}`);if(n.size>0)throw new E.UsageError(`Pattern ${l.prettyList(e,n,l.Type.CODE)} doesn't match any packages referenced by ${h}`);a=u.sortMap(a,e=>g.stringifyLocator(e));return(await x.Pk.start({configuration:e,stdout:this.context.stdout,json:this.json},async r=>{var n;for(const A of a){const o=null!==(n=A.version)&&void 0!==n?n:"unknown";t.topLevelWorkspace.manifest.ensureDependencyMeta(g.makeDescriptor(A,o)).unplugged=!0,r.reportInfo(p.b.UNNAMED,`Will unpack ${g.prettyLocator(e,A)} to ${l.pretty(e,b(A,{configuration:e}),l.Type.PATH)}`),r.reportJson({locator:g.stringifyLocator(A),version:o})}await t.topLevelWorkspace.persistManifest(),r.reportSeparator(),await t.install({cache:A,report:r})})).exitCode()}}U.usage=E.Command.Usage({description:"force the unpacking of a list of packages",details:"\n This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\n\n A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\n\n Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\n\n By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\n\n This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\n ",examples:[["Unplug the lodash dependency from the active workspace","yarn unplug lodash"],["Unplug all instances of lodash referenced by any workspace","yarn unplug lodash -A"],["Unplug all instances of lodash referenced by the active workspace and its dependencies","yarn unplug lodash -R"],["Unplug all instances of lodash, anywhere","yarn unplug lodash -AR"],["Unplug one specific version of lodash","yarn unplug lodash@1.2.3"],["Unplug all packages with the `@babel` scope","yarn unplug '@babel/*'"],["Unplug all packages (only for testing, not recommended)","yarn unplug -R '*'"]]}),(0,F.gn)([E.Command.Rest()],U.prototype,"patterns",void 0),(0,F.gn)([E.Command.Boolean("-A,--all",{description:"Unplug direct dependencies from the entire project"})],U.prototype,"all",void 0),(0,F.gn)([E.Command.Boolean("-R,--recursive",{description:"Unplug both direct and transitive dependencies"})],U.prototype,"recursive",void 0),(0,F.gn)([E.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],U.prototype,"json",void 0),(0,F.gn)([E.Command.Path("unplug")],U.prototype,"execute",null);const T=e=>{let t,r;return"module"===e.topLevelWorkspace.manifest.type?(t=".pnp.cjs",r=".pnp.js"):(t=".pnp.js",r=".pnp.cjs"),{main:s.y1.join(e.cwd,t),other:s.y1.join(e.cwd,r)}},j=e=>/\s/.test(e)?JSON.stringify(e):e;const Y={hooks:{populateYarnPaths:async function(e,t){t(T(e).main),t(T(e).other),t(e.configuration.get("pnpDataPath")),t(e.configuration.get("pnpUnpluggedFolder"))},setupScriptEnvironment:async function(e,t,r){const A=T(e).main,n="--require "+j(s.cS.fromPortablePath(A));if(A.includes(" ")&&c().lt(process.versions.node,"12.0.0"))throw new Error(`Expected the build location to not include spaces when using Node < 12.0.0 (${process.versions.node})`);if(i.xfs.existsSync(A)){let e=t.NODE_OPTIONS||"";const r=/\s*--require\s+\S*\.pnp\.c?js\s*/g;e=e.replace(r," ").trim(),e=e?`${n} ${e}`:n,t.NODE_OPTIONS=e}}},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "node-modules"',type:o.a2.STRING,default:"pnp"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:o.a2.STRING,default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:o.a2.STRING,default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:o.a2.STRING,default:[],isArray:!0},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:o.a2.BOOLEAN,default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:o.a2.STRING,default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:o.a2.ABSOLUTE_PATH,default:"./.yarn/unplugged"},pnpDataPath:{description:"Path of the file where the PnP data (used by the loader) must be written",type:o.a2.ABSOLUTE_PATH,default:"./.pnp.data.json"}},linkers:[S],commands:[U]}},43418:(e,t,r)=>{"use strict";r.r(t);var A=r(50683),n=r.n(A);Object.fromEntries||(Object.fromEntries=n());var o=r(59355),i=r(10419),s=r(45330);(0,i.D)({binaryVersion:o.o||"",pluginConfiguration:(0,s.e)()})},25413:(e,t,r)=>{"use strict";r.r(t),r.d(t,{BaseCommand:()=>A.F,WorkspaceRequiredError:()=>s,getDynamicLibs:()=>c,getPluginConfiguration:()=>g.e,main:()=>h.D,openWorkspace:()=>u,pluginCommands:()=>p.f});var A=r(56087),n=r(46611),o=r(46009),i=r(40822);class s extends i.UsageError{constructor(e,t){super(`This command can only be run from within a workspace of your project (${o.y1.relative(e,t)} isn't a workspace of ${o.y1.join(e,n.G.fileName)}).`)}}const a=["@yarnpkg/cli","@yarnpkg/core","@yarnpkg/fslib","@yarnpkg/libzip","@yarnpkg/parsers","@yarnpkg/shell","clipanion","semver","yup"],c=()=>new Map(a.map(e=>[e,r(98497)(e)]));var g=r(45330),l=r(85824);async function u(e,t){const{project:r,workspace:A}=await l.I.find(e,t);if(!A)throw new s(r.cwd,t);return A}var h=r(10419),p=r(15683)},10419:(e,t,r)=>{"use strict";r.d(t,{D:()=>f});var A=r(36545),n=r(39922),o=r(81832),i=r(43896),s=r(46009),a=r(63129),c=r(5864),g=r(40822),l=r(35747),u=r(15683),h=r(36370),p=r(71643),d=r(56087);class C extends d.F{async execute(){const e=await n.VK.find(this.context.cwd,this.context.plugins);this.context.stdout.write((e=>`\n${p.pretty(e,"Welcome on Yarn 2!","bold")} 🎉 Thanks for helping us shape our vision of how projects\nshould be managed going forward.\n\nBeing still in RC, Yarn 2 isn't completely stable yet. Some features might be\nmissing, and some behaviors may have received major overhaul. In case of doubt,\nuse the following URLs to get some insight:\n\n - The changelog:\n ${p.pretty(e,"https://github.com/yarnpkg/berry/tree/CHANGELOG.md","cyan")}\n\n - Our issue tracker:\n ${p.pretty(e,"https://github.com/yarnpkg/berry","cyan")}\n\n - Our Discord server:\n ${p.pretty(e,"https://discord.gg/yarnpkg","cyan")}\n\nWe're hoping you will enjoy the experience. For now, a good start is to run\nthe two following commands:\n\n ${p.pretty(e,"find . -name node_modules -prune -exec rm -r {} \\;","magenta")}\n ${p.pretty(e,"yarn install","magenta")}\n\nOne last trick! If you need at some point to upgrade Yarn to a nightly build,\nthe following command will install the CLI straight from master:\n\n ${p.pretty(e,"yarn set version from sources","magenta")}\n\nSee you later 👋\n`)(e).trim()+"\n")}}async function f({binaryVersion:e,pluginConfiguration:t}){async function r(){const h=new g.Cli({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:e});h.register(C);try{await async function h(p){var d,C,f,I,E;const B=process.versions.node,y=">=10.17 <14 || >14.1";if("1"!==process.env.YARN_IGNORE_NODE&&!A.satisfiesWithPrereleases(B,y))throw new g.UsageError(`This tool requires a Node version compatible with ${y} (got ${B}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);const m=await n.VK.find(s.cS.toPortablePath(process.cwd()),t,{usePath:!0,strict:!1}),w=m.get("yarnPath"),Q=m.get("ignorePath"),D=m.get("ignoreCwd");if(!Q&&!D&&w===s.cS.toPortablePath(s.cS.resolve(process.argv[1])))return process.env.YARN_IGNORE_PATH="1",process.env.YARN_IGNORE_CWD="1",void await h(p);if(null===w||Q){Q&&delete process.env.YARN_IGNORE_PATH;m.get("enableTelemetry")&&!c.isCI&&process.stdout.isTTY&&(n.VK.telemetry=new o.E(m,"puba9cdc10ec5790a2cf4969dd413a47270")),null===(d=n.VK.telemetry)||void 0===d||d.reportVersion(e);for(const[e,t]of m.plugins.entries()){u.f.has(null!==(f=null===(C=e.match(/^@yarnpkg\/plugin-(.*)$/))||void 0===C?void 0:C[1])&&void 0!==f?f:"")&&(null===(I=n.VK.telemetry)||void 0===I||I.reportPluginName(e));for(const e of t.commands||[])p.register(e)}const A=p.process(process.argv.slice(2));A.help||null===(E=n.VK.telemetry)||void 0===E||E.reportCommandName(A.path.join(" "));const i=A.cwd;if(void 0!==i&&!D){const e=(0,l.realpathSync)(process.cwd()),t=(0,l.realpathSync)(i);if(e!==t)return process.chdir(i),void await r()}await p.runExit(A,{cwd:s.cS.toPortablePath(process.cwd()),plugins:t,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr})}else if(i.xfs.existsSync(w))try{!function(e){const t=s.cS.fromPortablePath(e);process.on("SIGINT",()=>{}),t?(0,a.execFileSync)(process.execPath,[t,...process.argv.slice(2)],{stdio:"inherit",env:{...process.env,YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"}}):(0,a.execFileSync)(t,process.argv.slice(2),{stdio:"inherit",env:{...process.env,YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"}})}(w)}catch(e){process.exitCode=e.code||1}else process.stdout.write(p.error(new Error(`The "yarn-path" option has been set (in ${m.sources.get("yarnPath")}), but the specified location doesn't exist (${w}).`))),process.exitCode=1}(h)}catch(e){process.stdout.write(h.error(e)),process.exitCode=1}}return r().catch(e=>{process.stdout.write(e.stack||e.message),process.exitCode=1}).finally(()=>i.xfs.rmtempPromise())}(0,h.gn)([g.Command.Path("--welcome")],C.prototype,"execute",null)},15683:(e,t,r)=>{"use strict";r.d(t,{f:()=>A});const A=new Map([["constraints",[["constraints","query"],["constraints","source"],["constraints"]]],["exec",[]],["interactive-tools",[["search"],["upgrade-interactive"]]],["stage",[["stage"]]],["typescript",[]],["version",[["version","apply"],["version","check"],["version"]]],["workspace-tools",[["workspaces","focus"],["workspaces","foreach"]]]])},56087:(e,t,r)=>{"use strict";r.d(t,{F:()=>o});var A=r(36370),n=r(40822);class o extends n.Command{}(0,A.gn)([n.Command.String("--cwd",{hidden:!0})],o.prototype,"cwd",void 0)},28148:(e,t,r)=>{"use strict";r.d(t,{C:()=>I});var A=r(78420),n=r(15037),o=r(90739),i=r(14626),s=r(46009),a=r(43896),c=r(65281),g=r(35747),l=r.n(g),u=r(92659),h=r(35691),p=r(20624),d=r(73632),C=r(54143);const f=7;class I{constructor(e,{configuration:t,immutable:r=t.get("enableImmutableCache"),check:A=!1}){this.markedFiles=new Set,this.mutexes=new Map,this.configuration=t,this.cwd=e,this.immutable=r,this.check=A;const n=t.get("cacheKeyOverride");if(null!==n)this.cacheKey=""+n;else{const e=t.get("compressionLevel"),r=e!==o.k?"c"+e:"";this.cacheKey=[f,r].join("")}}static async find(e,{immutable:t,check:r}={}){const A=new I(e.get("cacheFolder"),{configuration:e,immutable:t,check:r});return await A.setup(),A}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;const e=this.configuration.get("globalFolder")+"/cache";return e!==this.cwd?e:null}getVersionFilename(e){return`${C.slugifyLocator(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,t){const r=function(e){const t=e.indexOf("/");return-1!==t?e.slice(t+1):e}(t).slice(0,10);return`${C.slugifyLocator(e)}-${r}.zip`}getLocatorPath(e,t){if(null===this.mirrorCwd)return s.y1.resolve(this.cwd,this.getVersionFilename(e));if(null===t)return null;return E(t)!==this.cacheKey?null:s.y1.resolve(this.cwd,this.getChecksumFilename(e,t))}getLocatorMirrorPath(e){const t=this.mirrorCwd;return null!==t?s.y1.resolve(t,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get("enableGlobalCache")){await a.xfs.mkdirPromise(this.cwd,{recursive:!0});const e=s.y1.resolve(this.cwd,".gitignore");await a.xfs.changeFilePromise(e,"/.gitignore\n*.flock\n")}}async fetchPackageFromCache(e,t,{onHit:r,onMiss:g,loader:f,skipIntegrityCheck:I}){const B=this.getLocatorMirrorPath(e),y=new A.S,m=async(e,r=null)=>{const A=I&&t?t:`${this.cacheKey}/${await p.checksumFile(e)}`;if(null!==r){if(A!==(I&&t?t:`${this.cacheKey}/${await p.checksumFile(r)}`))throw new h.lk(u.b.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}if(null!==t&&A!==t){let e;switch(e=this.check?"throw":E(t)!==E(A)?"update":this.configuration.get("checksumBehavior"),e){case"ignore":return t;case"update":return A;default:case"throw":throw new h.lk(u.b.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the expected checksum")}}return A},w=async t=>{if(!f)throw new Error("Cache check required but no loader configured for "+C.prettyLocator(this.configuration,e));const r=await f(),A=r.getRealPath();return r.saveAndClose(),await a.xfs.chmodPromise(A,420),await m(t,A)},Q=async()=>{if(null===B||!await a.xfs.existsPromise(B)){const e=await f(),t=e.getRealPath();return e.saveAndClose(),t}const t=await a.xfs.mktempPromise(),r=s.y1.join(t,this.getVersionFilename(e));return await a.xfs.copyFilePromise(B,r,l().constants.COPYFILE_FICLONE),r},D=async()=>{if(!f)throw new Error("Cache entry required but missing for "+C.prettyLocator(this.configuration,e));if(this.immutable)throw new h.lk(u.b.IMMUTABLE_CACHE,"Cache entry required but missing for "+C.prettyLocator(this.configuration,e));const t=await Q();await a.xfs.chmodPromise(t,420);const r=await m(t),A=this.getLocatorPath(e,r);if(!A)throw new Error("Assertion failed: Expected the cache path to be available");return await this.writeFileWithLock(A,async()=>await this.writeFileWithLock(B,async()=>(await a.xfs.movePromise(t,A),null!==B&&await a.xfs.copyFilePromise(A,B,l().constants.COPYFILE_FICLONE),[A,r])))};for(let t;t=this.mutexes.get(e.locatorHash);)await t;const[b,v]=await(async()=>{const A=(async()=>{const A=this.getLocatorPath(e,t),n=null!==A&&await y.existsPromise(A),o=n?r:g;if(o&&o(),n){let e=null;const t=A;return e=this.check?await w(t):await m(t),[t,e]}return D()})();this.mutexes.set(e.locatorHash,A);try{return await A}finally{this.mutexes.delete(e.locatorHash)}})();this.markedFiles.add(b);let S=null;const k=await(0,c.getLibzipPromise)(),N=new n.v(()=>d.prettifySyncErrors(()=>S=new o.d(b,{baseFs:y,libzip:k,readOnly:!0}),t=>`Failed to open the cache entry for ${C.prettyLocator(this.configuration,e)}: ${t}`),s.y1);return[new i.K(b,{baseFs:N,pathUtils:s.y1}),()=>{null!==S&&S.discardAndClose()},v]}async writeFileWithLock(e,t){return null===e?await t():(await a.xfs.mkdirPromise(s.y1.dirname(e),{recursive:!0}),await a.xfs.lockPromise(e,async()=>await t()))}}function E(e){const t=e.indexOf("/");return-1!==t?e.slice(0,t):null}},39922:(e,t,r)=>{"use strict";r.d(t,{VK:()=>W,nh:()=>U,tr:()=>O,a5:()=>j,EW:()=>z,a2:()=>T});var A=r(43896),n=r(46009),o=r(90739),i=r(11640),s=r(54738),a=r.n(s),c=r(5864),g=r(40822),l=r(61578),u=r.n(l),h=r(53887),p=r.n(h),d=r(92413),C=r(92659),f=r(54143);const I={hooks:{reduceDependency:(e,t,r,A,{resolver:n,resolveOptions:o})=>{for(const{pattern:A,reference:i}of t.topLevelWorkspace.manifest.resolutions){if(A.from&&A.from.fullName!==f.requirableIdent(r))continue;if(A.from&&A.from.description&&A.from.description!==r.reference)continue;if(A.descriptor.fullName!==f.requirableIdent(e))continue;if(A.descriptor.description&&A.descriptor.description!==e.range)continue;return n.bindDescriptor(f.makeDescriptor(e,i),t.topLevelWorkspace.anchoredLocator,o)}return e},validateProject:async(e,t)=>{for(const r of e.workspaces){const A=f.prettyWorkspace(e.configuration,r);await e.configuration.triggerHook(e=>e.validateWorkspace,r,{reportWarning:(e,r)=>t.reportWarning(e,`${A}: ${r}`),reportError:(e,r)=>t.reportError(e,`${A}: ${r}`)})}},validateWorkspace:async(e,t)=>{const{manifest:r}=e;r.resolutions.length&&e.cwd!==e.project.cwd&&r.errors.push(new Error("Resolutions field will be ignored"));for(const e of r.errors)t.reportWarning(C.b.INVALID_MANIFEST,e.message)}}};var E=r(46611),B=r(35691);class y{constructor(e){this.fetchers=e}supports(e,t){return!!this.tryFetcher(e,t)}getLocalPath(e,t){return this.getFetcher(e,t).getLocalPath(e,t)}async fetch(e,t){const r=this.getFetcher(e,t);return await r.fetch(e,t)}tryFetcher(e,t){const r=this.fetchers.find(r=>r.supports(e,t));return r||null}getFetcher(e,t){const r=this.fetchers.find(r=>r.supports(e,t));if(!r)throw new B.lk(C.b.FETCHER_NOT_FOUND,f.prettyLocator(t.project.configuration,e)+" isn't supported by any available fetcher");return r}}var m=r(27092),w=r(52779),Q=r(60895);class D{static isVirtualDescriptor(e){return!!e.range.startsWith(D.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(D.protocol)}supportsDescriptor(e,t){return D.isVirtualDescriptor(e)}supportsLocator(e,t){return D.isVirtualLocator(e)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,r){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,t){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,t,r){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,t,r){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,t){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}}D.protocol="virtual:";var b=r(75448),v=r(94538);class S{supports(e){return!!e.reference.startsWith(v.d.protocol)}getLocalPath(e,t){return this.getWorkspace(e,t).cwd}async fetch(e,t){const r=this.getWorkspace(e,t).cwd;return{packageFs:new b.M(r),prefixPath:n.LZ.dot,localPath:r}}getWorkspace(e,t){return t.project.getWorkspaceByCwd(e.reference.slice(v.d.protocol.length))}}var k=r(81111),N=r(71643),F=r(73632),K=r(32282),M=r.n(K);function R(e){return("undefined"!=typeof require?require:r(32178))(e)}var x=r(36545),L=r(32485);const P=new Set(["binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput"]),O=".yarnrc.yml",U="yarn.lock";var T;!function(e){e.ANY="ANY",e.BOOLEAN="BOOLEAN",e.ABSOLUTE_PATH="ABSOLUTE_PATH",e.LOCATOR="LOCATOR",e.LOCATOR_LOOSE="LOCATOR_LOOSE",e.NUMBER="NUMBER",e.STRING="STRING",e.SECRET="SECRET",e.SHAPE="SHAPE",e.MAP="MAP"}(T||(T={}));const j=N.Type,Y={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:T.STRING,default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:T.ABSOLUTE_PATH,default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:T.BOOLEAN,default:!1},ignoreCwd:{description:"If true, the `--cwd` flag will be ignored",type:T.BOOLEAN,default:!1},cacheKeyOverride:{description:"A global cache key override; used only for test purposes",type:T.STRING,default:null},globalFolder:{description:"Folder where are stored the system-wide settings",type:T.ABSOLUTE_PATH,default:k.getDefaultGlobalFolder()},cacheFolder:{description:"Folder where the cache files must be written",type:T.ABSOLUTE_PATH,default:"./.yarn/cache"},compressionLevel:{description:"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)",type:T.NUMBER,values:["mixed",0,1,2,3,4,5,6,7,8,9],default:o.k},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named $$virtual)",type:T.ABSOLUTE_PATH,default:"./.yarn/$$virtual"},bstatePath:{description:"Path of the file where the current state of the built packages must be stored",type:T.ABSOLUTE_PATH,default:"./.yarn/build-state.yml"},lockfileFilename:{description:"Name of the files where the Yarn dependency tree entries must be stored",type:T.STRING,default:U},installStatePath:{description:"Path of the file where the install state will be persisted",type:T.ABSOLUTE_PATH,default:"./.yarn/install-state.gz"},immutablePatterns:{description:"Array of glob patterns; files matching them won't be allowed to change during immutable installs",type:T.STRING,default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:T.STRING,default:q()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:T.BOOLEAN,default:!1},enableAbsoluteVirtuals:{description:"If true, the virtual symlinks will use absolute paths if required [non portable!!]",type:T.BOOLEAN,default:!1},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:T.BOOLEAN,default:N.supportsColor,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:T.BOOLEAN,default:N.supportsHyperlinks,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:T.BOOLEAN,default:c.isCI,defaultText:""},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:T.BOOLEAN,default:!c.isCI&&process.stdout.isTTY&&process.stdout.columns>22,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:T.BOOLEAN,default:!0},preferAggregateCacheInfo:{description:"If true, the CLI will only print a one-line report of any cache changes",type:T.BOOLEAN,default:c.isCI},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:T.BOOLEAN,default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:T.BOOLEAN,default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:T.STRING,default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:T.STRING,default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:T.STRING,default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:T.BOOLEAN,default:!0},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:T.BOOLEAN,default:!0},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:T.BOOLEAN,default:!0},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:T.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:T.STRING,default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:T.STRING,default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:T.NUMBER,default:6e4},httpRetry:{description:"Retry times on http failure",type:T.NUMBER,default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:T.NUMBER,default:1/0},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:T.MAP,valueDefinition:{description:"",type:T.SHAPE,properties:{caFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:T.ABSOLUTE_PATH,default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:T.BOOLEAN,default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:T.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:T.STRING,default:null}}}},caFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:T.ABSOLUTE_PATH,default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:T.BOOLEAN,default:!0},logFilters:{description:"Overrides for log levels",type:T.SHAPE,isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:T.STRING,default:void 0},text:{description:"Code of the texts covered by this override",type:T.STRING,default:void 0},level:{description:"Log level override, set to null to remove override",type:T.STRING,values:Object.values(N.LogLevel),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:T.BOOLEAN,default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:T.NUMBER,default:7},telemetryUserId:{description:"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.",type:T.STRING,default:null},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:T.BOOLEAN,default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:T.BOOLEAN,default:!1},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:T.STRING,default:"throw"},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:T.MAP,valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:T.SHAPE,properties:{dependencies:{description:"The set of dependencies that must be made available to the current package in order for it to work properly",type:T.MAP,valueDefinition:{description:"A range",type:T.STRING}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:T.MAP,valueDefinition:{description:"A semver range",type:T.STRING}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:T.MAP,valueDefinition:{description:"The peerDependency meta",type:T.SHAPE,properties:{optional:{description:"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error",type:T.BOOLEAN,default:!1}}}}}}}};function G(e,t,r,A,n){if(A.isArray)return Array.isArray(r)?r.map((r,o)=>H(e,`${t}[${o}]`,r,A,n)):String(r).split(/,/).map(r=>H(e,t,r,A,n));if(Array.isArray(r))throw new Error(`Non-array configuration settings "${t}" cannot be an array`);return H(e,t,r,A,n)}function H(e,t,r,A,o){var i;switch(A.type){case T.ANY:return r;case T.SHAPE:return function(e,t,r,A,n){if("object"!=typeof r||Array.isArray(r))throw new g.UsageError(`Object configuration settings "${t}" must be an object`);const o=J(e,A,{ignoreArrays:!0});if(null===r)return o;for(const[i,s]of Object.entries(r)){const r=`${t}.${i}`;if(!A.properties[i])throw new g.UsageError(`Unrecognized configuration settings found: ${t}.${i} - run "yarn config -v" to see the list of settings supported in Yarn`);o.set(i,G(e,r,s,A.properties[i],n))}return o}(e,t,r,A,o);case T.MAP:return function(e,t,r,A,n){const o=new Map;if("object"!=typeof r||Array.isArray(r))throw new g.UsageError(`Map configuration settings "${t}" must be an object`);if(null===r)return o;for(const[i,s]of Object.entries(r)){const r=A.normalizeKeys?A.normalizeKeys(i):i,a=`${t}['${r}']`,c=A.valueDefinition;o.set(r,G(e,a,s,c,n))}return o}(e,t,r,A,o)}if(null===r&&!A.isNullable&&null!==A.default)throw new Error(`Non-nullable configuration settings "${t}" cannot be set to null`);if(null===(i=A.values)||void 0===i?void 0:i.includes(r))return r;const s=(()=>{if(A.type===T.BOOLEAN)return F.parseBoolean(r);if("string"!=typeof r)throw new Error(`Expected value (${r}) to be a string`);const e=F.replaceEnvVariables(r,{env:process.env});switch(A.type){case T.ABSOLUTE_PATH:return n.y1.resolve(o,n.cS.toPortablePath(e));case T.LOCATOR_LOOSE:return f.parseLocator(e,!1);case T.NUMBER:return parseInt(e);case T.LOCATOR:return f.parseLocator(e);default:return e}})();if(A.values&&!A.values.includes(s))throw new Error("Invalid value, expected one of "+A.values.join(", "));return s}function J(e,t,{ignoreArrays:r=!1}={}){switch(t.type){case T.SHAPE:{if(t.isArray&&!r)return[];const A=new Map;for(const[r,n]of Object.entries(t.properties))A.set(r,J(e,n));return A}case T.MAP:return t.isArray&&!r?[]:new Map;case T.ABSOLUTE_PATH:return null===t.default?null:null===e.projectCwd?n.y1.isAbsolute(t.default)?n.y1.normalize(t.default):t.isNullable?null:void 0:Array.isArray(t.default)?t.default.map(t=>n.y1.resolve(e.projectCwd,t)):n.y1.resolve(e.projectCwd,t.default);default:return t.default}}function q(){for(const[e,t]of Object.entries(process.env))if("yarn_rc_filename"===e.toLowerCase()&&"string"==typeof t)return t;return O}var z;!function(e){e[e.LOCKFILE=0]="LOCKFILE",e[e.MANIFEST=1]="MANIFEST",e[e.NONE=2]="NONE"}(z||(z={}));class W{constructor(e){this.projectCwd=null,this.plugins=new Map,this.settings=new Map,this.values=new Map,this.sources=new Map,this.invalid=new Map,this.packageExtensions=new Map,this.limits=new Map,this.startingCwd=e}static create(e,t,r){const A=new W(e);void 0===t||t instanceof Map||(A.projectCwd=t),A.importSettings(Y);const n=void 0!==r?r:t instanceof Map?t:new Map;for(const[e,t]of n)A.activatePlugin(e,t);return A}static async find(e,t,{lookup:r=z.LOCKFILE,strict:o=!0,usePath:i=!1,useRc:s=!0}={}){const c=function(){const e={};for(let[t,r]of Object.entries(process.env))t=t.toLowerCase(),t.startsWith("yarn_")&&(t=a()(t.slice("yarn_".length)),e[t]=r);return e}();delete c.rcFilename;const l=await W.findRcFiles(e),u=await W.findHomeRcFile(),h=({ignoreCwd:e,yarnPath:t,ignorePath:r,lockfileFilename:A})=>({ignoreCwd:e,yarnPath:t,ignorePath:r,lockfileFilename:A}),p=({ignoreCwd:e,yarnPath:t,ignorePath:r,lockfileFilename:A,...n})=>n,d=new W(e);d.importSettings(h(Y)),d.useWithSource("",h(c),e,{strict:!1});for(const{path:e,cwd:t,data:r}of l)d.useWithSource(e,h(r),t,{strict:!1});if(u&&d.useWithSource(u.path,h(u.data),u.cwd,{strict:!1}),i){const e=d.get("yarnPath"),t=d.get("ignorePath");if(null!==e&&!t)return d}const C=d.get("lockfileFilename");let f;switch(r){case z.LOCKFILE:f=await W.findProjectCwd(e,C);break;case z.MANIFEST:f=await W.findProjectCwd(e,null);break;case z.NONE:f=A.xfs.existsSync(n.y1.join(e,"package.json"))?n.y1.resolve(e):null}d.startingCwd=e,d.projectCwd=f,d.importSettings(p(Y));const E=new Map([["@@core",I]]);if(null!==t){for(const e of t.plugins.keys())E.set(e,(B=t.modules.get(e)).__esModule?B.default:B);const r=new Map;for(const e of new Set(M().builtinModules||Object.keys(process.binding("natives"))))r.set(e,()=>R(e));for(const[e,A]of t.modules)r.set(e,()=>A);const A=new Set,o=e=>e.default||e,i=(e,t)=>{const{factory:i,name:s}=R(n.cS.fromPortablePath(e));if(A.has(s))return;const a=new Map(r),c=e=>{if(a.has(e))return a.get(e)();throw new g.UsageError(`This plugin cannot access the package referenced via ${e} which is neither a builtin, nor an exposed entry`)},l=F.prettifySyncErrors(()=>o(i(c)),e=>`${e} (when initializing ${s}, defined in ${t})`);r.set(s,()=>l),A.add(s),E.set(s,l)};if(c.plugins)for(const t of c.plugins.split(";")){i(n.y1.resolve(e,n.cS.toPortablePath(t)),"")}for(const{path:e,cwd:t,data:r}of l)if(s&&Array.isArray(r.plugins))for(const A of r.plugins){const r="string"!=typeof A?A.path:A;i(n.y1.resolve(t,n.cS.toPortablePath(r)),e)}}var B;for(const[e,t]of E)d.activatePlugin(e,t);d.useWithSource("",p(c),e,{strict:o});for(const{path:e,cwd:t,data:r}of l)d.useWithSource(e,p(r),t,{strict:o});return u&&d.useWithSource(u.path,p(u.data),u.cwd,{strict:!1}),d.get("enableGlobalCache")&&(d.values.set("cacheFolder",d.get("globalFolder")+"/cache"),d.sources.set("cacheFolder","")),await d.refreshPackageExtensions(),d}static async findRcFiles(e){const t=q(),r=[];let o=e,s=null;for(;o!==s;){s=o;const e=n.y1.join(s,t);if(A.xfs.existsSync(e)){const t=await A.xfs.readFilePromise(e,"utf8");let n;try{n=(0,i.parseSyml)(t)}catch(r){let A="";throw t.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(A=" (in particular, make sure you list the colons after each key name)"),new g.UsageError(`Parse error when loading ${e}; please check it's proper Yaml${A}`)}r.push({path:e,cwd:s,data:n})}o=n.y1.dirname(s)}return r}static async findHomeRcFile(){const e=q(),t=k.getHomeFolder(),r=n.y1.join(t,e);if(A.xfs.existsSync(r)){const e=await A.xfs.readFilePromise(r,"utf8");return{path:r,cwd:t,data:(0,i.parseSyml)(e)}}return null}static async findProjectCwd(e,t){let r=null,o=e,i=null;for(;o!==i;){if(i=o,A.xfs.existsSync(n.y1.join(i,"package.json"))&&(r=i),null!==t){if(A.xfs.existsSync(n.y1.join(i,t))){r=i;break}}else if(null!==r)break;o=n.y1.dirname(i)}return r}static async updateConfiguration(e,t){const r=q(),o=n.y1.join(e,r),s=A.xfs.existsSync(o)?(0,i.parseSyml)(await A.xfs.readFilePromise(o,"utf8")):{};let a,c=!1;if("function"==typeof t){try{a=t(s)}catch(e){a=t({})}if(a===s)return}else{a=s;for(const e of Object.keys(t)){const r=s[e],A=t[e];let n;if("function"==typeof A)try{n=A(r)}catch(e){n=A(void 0)}else n=A;r!==n&&(a[e]=n,c=!0)}if(!c)return}await A.xfs.changeFilePromise(o,(0,i.stringifySyml)(a),{automaticNewlines:!0})}static async updateHomeConfiguration(e){const t=k.getHomeFolder();return await W.updateConfiguration(t,e)}activatePlugin(e,t){this.plugins.set(e,t),void 0!==t.configuration&&this.importSettings(t.configuration)}importSettings(e){for(const[t,r]of Object.entries(e))if(null!=r){if(this.settings.has(t))throw new Error(`Cannot redefine settings "${t}"`);this.settings.set(t,r),this.values.set(t,J(this,r))}}useWithSource(e,t,r,A){try{this.use(e,t,r,A)}catch(t){throw t.message+=` (in ${N.pretty(this,e,N.Type.PATH)})`,t}}use(e,t,r,{strict:A=!0,overwrite:n=!1}={}){for(const o of Object.keys(t)){if(void 0===t[o])continue;if("plugins"===o)continue;if(""===e&&P.has(o))continue;if("rcFilename"===o)throw new g.UsageError(`The rcFilename settings can only be set via ${"yarn_RC_FILENAME".toUpperCase()}, not via a rc file`);const i=this.settings.get(o);if(!i){if(A)throw new g.UsageError(`Unrecognized or legacy configuration settings found: ${o} - run "yarn config -v" to see the list of settings supported in Yarn`);this.invalid.set(o,e);continue}if(this.sources.has(o)&&!(n||i.type===T.MAP||i.isArray&&i.concatenateValues))continue;let s;try{s=G(this,o,t[o],i,r)}catch(t){throw t.message+=" in "+N.pretty(this,e,N.Type.PATH),t}if(i.type===T.MAP){const t=this.values.get(o);this.values.set(o,new Map(n?[...t,...s]:[...s,...t])),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else if(i.isArray&&i.concatenateValues){const t=this.values.get(o);this.values.set(o,n?[...t,...s]:[...s,...t]),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else this.values.set(o,s),this.sources.set(o,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:t=!1,getNativePaths:r=!1}){const A=this.get(e),o=this.settings.get(e);if(void 0===o)throw new g.UsageError(`Couldn't find a configuration settings named "${e}"`);return function e(t,r,A){if(r.type===T.SECRET&&"string"==typeof t&&A.hideSecrets)return"********";if(r.type===T.ABSOLUTE_PATH&&"string"==typeof t&&A.getNativePaths)return n.cS.fromPortablePath(t);if(r.isArray&&Array.isArray(t)){const n=[];for(const o of t)n.push(e(o,r,A));return n}if(r.type===T.MAP&&t instanceof Map){const n=new Map;for(const[o,i]of t.entries())n.set(o,e(i,r.valueDefinition,A));return n}if(r.type===T.SHAPE&&t instanceof Map){const n=new Map;for(const[o,i]of t.entries()){const t=r.properties[o];n.set(o,e(i,t,A))}return n}return t}(A,o,{hideSecrets:t,getNativePaths:r})}getSubprocessStreams(e,{header:t,prefix:r,report:n}){let o,i;const s=A.xfs.createWriteStream(e);if(this.get("enableInlineBuilds")){const e=n.createStreamReporter(`${r} ${N.pretty(this,"STDOUT","green")}`),t=n.createStreamReporter(`${r} ${N.pretty(this,"STDERR","red")}`);o=new d.PassThrough,o.pipe(e),o.pipe(s),i=new d.PassThrough,i.pipe(t),i.pipe(s)}else o=s,i=s,void 0!==t&&o.write(t+"\n");return{stdout:o,stderr:i}}makeResolver(){const e=[];for(const t of this.plugins.values())for(const r of t.resolvers||[])e.push(new r);return new m.B([new D,new v.d,new w.O,...e])}makeFetcher(){const e=[];for(const t of this.plugins.values())for(const r of t.fetchers||[])e.push(new r);return new y([new Q.N,new S,...e])}getLinkers(){const e=[];for(const t of this.plugins.values())for(const r of t.linkers||[])e.push(new r);return e}async refreshPackageExtensions(){this.packageExtensions=new Map;const e=this.packageExtensions,t=(t,r,{userProvided:A=!1}={})=>{if(!p().validRange(t.range))throw new Error("Only semver ranges are allowed as keys for the lockfileExtensions setting");const n=new E.G;n.load(r,{yamlCompatibilityMode:!0});const o=[];F.getArrayWithDefault(e,t.identHash).push([t.range,o]);const i={status:L._u.Inactive,userProvided:A,parentDescriptor:t};for(const e of n.dependencies.values())o.push({...i,type:L.HN.Dependency,descriptor:e,description:`${f.stringifyIdent(t)} > ${f.stringifyIdent(e)}`});for(const e of n.peerDependencies.values())o.push({...i,type:L.HN.PeerDependency,descriptor:e,description:`${f.stringifyIdent(t)} >> ${f.stringifyIdent(e)}`});for(const[e,r]of n.peerDependenciesMeta)for(const[A,n]of Object.entries(r))o.push({...i,type:L.HN.PeerDependencyMeta,selector:e,key:A,value:n,description:`${f.stringifyIdent(t)} >> ${e} / ${A}`})};await this.triggerHook(e=>e.registerPackageExtensions,this,t);for(const[e,r]of this.get("packageExtensions"))t(f.parseDescriptor(e,!0),F.convertMapsToIndexableObjects(r),{userProvided:!0})}normalizePackage(e){const t=f.copyPackage(e);if(null==this.packageExtensions)throw new Error("refreshPackageExtensions has to be called before normalizing packages");const r=this.packageExtensions.get(e.identHash);if(void 0!==r){const A=e.version;if(null!==A)for(const[e,n]of r)if(x.satisfiesWithPrereleases(A,e))for(const e of n)switch(e.status===L._u.Inactive&&(e.status=L._u.Redundant),e.type){case L.HN.Dependency:void 0===t.dependencies.get(e.descriptor.identHash)&&(e.status=L._u.Active,t.dependencies.set(e.descriptor.identHash,e.descriptor));break;case L.HN.PeerDependency:void 0===t.peerDependencies.get(e.descriptor.identHash)&&(e.status=L._u.Active,t.peerDependencies.set(e.descriptor.identHash,e.descriptor));break;case L.HN.PeerDependencyMeta:{const r=t.peerDependenciesMeta.get(e.selector);void 0!==r&&Object.prototype.hasOwnProperty.call(r,e.key)&&r[e.key]===e.value||(e.status=L._u.Active,F.getFactoryWithDefault(t.peerDependenciesMeta,e.selector,()=>({}))[e.key]=e.value)}break;default:F.assertNever(e)}}const A=e=>e.scope?`${e.scope}__${e.name}`:""+e.name;for(const e of t.peerDependencies.values()){if("@types"===e.scope)continue;const r=A(e),n=f.makeIdent("types",r);t.peerDependencies.has(n.identHash)||t.peerDependenciesMeta.has(n.identHash)||t.peerDependenciesMeta.set(f.stringifyIdent(n),{optional:!0})}for(const e of t.peerDependenciesMeta.keys()){const r=f.parseIdent(e);t.peerDependencies.has(r.identHash)||t.peerDependencies.set(r.identHash,f.makeDescriptor(r,"*"))}return t.dependencies=new Map(F.sortMap(t.dependencies,([,e])=>f.stringifyDescriptor(e))),t.peerDependencies=new Map(F.sortMap(t.peerDependencies,([,e])=>f.stringifyDescriptor(e))),t}getLimit(e){return F.getFactoryWithDefault(this.limits,e,()=>u()(this.get(e)))}async triggerHook(e,...t){for(const r of this.plugins.values()){const A=r.hooks;if(!A)continue;const n=e(A);n&&await n(...t)}}async triggerMultipleHooks(e,t){for(const r of t)await this.triggerHook(e,...r)}async reduceHook(e,t,...r){let A=t;for(const t of this.plugins.values()){const n=t.hooks;if(!n)continue;const o=e(n);o&&(A=await o(A,...r))}return A}async firstHook(e,...t){for(const r of this.plugins.values()){const A=r.hooks;if(!A)continue;const n=e(A);if(!n)continue;const o=await n(...t);if(void 0!==o)return o}return null}format(e,t){return N.pretty(this,e,t)}}W.telemetry=null},92409:(e,t,r)=>{"use strict";var A;r.d(t,{k:()=>A}),function(e){e[e.SCRIPT=0]="SCRIPT",e[e.SHELLCODE=1]="SHELLCODE"}(A||(A={}))},62152:(e,t,r)=>{"use strict";r.d(t,{h:()=>i});var A=r(35691),n=r(15815),o=r(71643);class i extends A.yG{constructor({configuration:e,stdout:t,suggestInstall:r=!0}){super(),this.errorCount=0,o.addLogFilterSupport(this,{configuration:e}),this.configuration=e,this.stdout=t,this.suggestInstall=r}static async start(e,t){const r=new this(e);try{await t(r)}catch(e){r.reportExceptionOnce(e)}finally{await r.finalize()}return r}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){}reportCacheMiss(e){}startTimerSync(e,t,r){return("function"==typeof t?t:r)()}async startTimerPromise(e,t,r){const A="function"==typeof t?t:r;return await A()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,t){}reportWarning(e,t){}reportError(e,t){this.errorCount+=1,this.stdout.write(`${o.pretty(this.configuration,"➤","redBright")} ${this.formatNameWithHyperlink(e)}: ${t}\n`)}reportProgress(e){return{...Promise.resolve().then(async()=>{for await(const{}of e);}),stop:()=>{}}}reportJson(e){}async finalize(){this.errorCount>0&&(this.stdout.write(o.pretty(this.configuration,"➤","redBright")+" Errors happened when preparing the environment required to run this command.\n"),this.suggestInstall&&this.stdout.write(o.pretty(this.configuration,"➤","redBright")+' This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help.\n'))}formatNameWithHyperlink(e){return(0,n.Qw)(e,{configuration:this.configuration,json:!1})}}},46611:(e,t,r)=>{"use strict";r.d(t,{G:()=>l});var A=r(78420),n=r(46009),o=r(11640),i=r(53887),s=r.n(i),a=r(73632),c=r(36545),g=r(54143);class l{constructor(){this.indent=" ",this.name=null,this.version=null,this.os=null,this.cpu=null,this.type=null,this.private=!1,this.license=null,this.main=null,this.module=null,this.browser=null,this.languageName=null,this.bin=new Map,this.scripts=new Map,this.dependencies=new Map,this.devDependencies=new Map,this.peerDependencies=new Map,this.workspaceDefinitions=[],this.dependenciesMeta=new Map,this.peerDependenciesMeta=new Map,this.resolutions=[],this.files=null,this.publishConfig=null,this.installConfig=null,this.preferUnplugged=null,this.raw={},this.errors=[]}static async tryFind(e,{baseFs:t=new A.S}={}){const r=n.y1.join(e,"package.json");return await t.existsPromise(r)?await l.fromFile(r,{baseFs:t}):null}static async find(e,{baseFs:t}={}){const r=await l.tryFind(e,{baseFs:t});if(null===r)throw new Error("Manifest not found");return r}static async fromFile(e,{baseFs:t=new A.S}={}){const r=new l;return await r.loadFile(e,{baseFs:t}),r}static fromText(e){const t=new l;return t.loadFromText(e),t}static isManifestFieldCompatible(e,t){if(null===e)return!0;let r=!0,A=!1;for(const n of e)if("!"===n[0]){if(A=!0,t===n.slice(1))return!1}else if(r=!1,n===t)return!0;return A&&r}loadFromText(e){let t;try{t=JSON.parse(h(e)||"{}")}catch(t){throw t.message+=` (when parsing ${e})`,t}this.load(t),this.indent=u(e)}async loadFile(e,{baseFs:t=new A.S}){const r=await t.readFilePromise(e,"utf8");let n;try{n=JSON.parse(h(r)||"{}")}catch(t){throw t.message+=` (when parsing ${e})`,t}this.load(n),this.indent=u(r)}load(e,{yamlCompatibilityMode:t=!1}={}){if("object"!=typeof e||null===e)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;const r=[];if("string"==typeof e.name)try{this.name=g.parseIdent(e.name)}catch(e){r.push(new Error("Parsing failed for the 'name' field"))}if("string"==typeof e.version&&(this.version=e.version),Array.isArray(e.os)){const t=[];this.os=t;for(const A of e.os)"string"!=typeof A?r.push(new Error("Parsing failed for the 'os' field")):t.push(A)}if(Array.isArray(e.cpu)){const t=[];this.cpu=t;for(const A of e.cpu)"string"!=typeof A?r.push(new Error("Parsing failed for the 'cpu' field")):t.push(A)}if("string"==typeof e.type&&(this.type=e.type),"boolean"==typeof e.private&&(this.private=e.private),"string"==typeof e.license&&(this.license=e.license),"string"==typeof e.languageName&&(this.languageName=e.languageName),"string"==typeof e.main&&(this.main=p(e.main)),"string"==typeof e.module&&(this.module=p(e.module)),null!=e.browser)if("string"==typeof e.browser)this.browser=p(e.browser);else{this.browser=new Map;for(const[t,r]of Object.entries(e.browser))this.browser.set(p(t),"string"==typeof r?p(r):r)}if("string"==typeof e.bin)null!==this.name?this.bin=new Map([[this.name.name,p(e.bin)]]):r.push(new Error("String bin field, but no attached package name"));else if("object"==typeof e.bin&&null!==e.bin)for(const[t,A]of Object.entries(e.bin))"string"==typeof A?this.bin.set(t,p(A)):r.push(new Error(`Invalid bin definition for '${t}'`));if("object"==typeof e.scripts&&null!==e.scripts)for(const[t,A]of Object.entries(e.scripts))"string"==typeof A?this.scripts.set(t,A):r.push(new Error(`Invalid script definition for '${t}'`));if("object"==typeof e.dependencies&&null!==e.dependencies)for(const[t,A]of Object.entries(e.dependencies)){if("string"!=typeof A){r.push(new Error(`Invalid dependency range for '${t}'`));continue}let e;try{e=g.parseIdent(t)}catch(e){r.push(new Error(`Parsing failed for the dependency name '${t}'`));continue}const n=g.makeDescriptor(e,A);this.dependencies.set(n.identHash,n)}if("object"==typeof e.devDependencies&&null!==e.devDependencies)for(const[t,A]of Object.entries(e.devDependencies)){if("string"!=typeof A){r.push(new Error(`Invalid dependency range for '${t}'`));continue}let e;try{e=g.parseIdent(t)}catch(e){r.push(new Error(`Parsing failed for the dependency name '${t}'`));continue}const n=g.makeDescriptor(e,A);this.devDependencies.set(n.identHash,n)}if("object"==typeof e.peerDependencies&&null!==e.peerDependencies)for(let[t,A]of Object.entries(e.peerDependencies)){let e;try{e=g.parseIdent(t)}catch(e){r.push(new Error(`Parsing failed for the dependency name '${t}'`));continue}"string"==typeof A&&c.validRange(A)||(r.push(new Error(`Invalid dependency range for '${t}'`)),A="*");const n=g.makeDescriptor(e,A);this.peerDependencies.set(n.identHash,n)}"object"==typeof e.workspaces&&e.workspaces.nohoist&&r.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));const A=Array.isArray(e.workspaces)?e.workspaces:"object"==typeof e.workspaces&&null!==e.workspaces&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];for(const e of A)"string"==typeof e?this.workspaceDefinitions.push({pattern:e}):r.push(new Error(`Invalid workspace definition for '${e}'`));if("object"==typeof e.dependenciesMeta&&null!==e.dependenciesMeta)for(const[A,n]of Object.entries(e.dependenciesMeta)){if("object"!=typeof n||null===n){r.push(new Error("Invalid meta field for '"+A));continue}const e=g.parseDescriptor(A),o=this.ensureDependencyMeta(e),i=d(n.built,{yamlCompatibilityMode:t});if(null===i){r.push(new Error(`Invalid built meta field for '${A}'`));continue}const s=d(n.optional,{yamlCompatibilityMode:t});if(null===s){r.push(new Error(`Invalid optional meta field for '${A}'`));continue}const a=d(n.unplugged,{yamlCompatibilityMode:t});null!==a?Object.assign(o,{built:i,optional:s,unplugged:a}):r.push(new Error(`Invalid unplugged meta field for '${A}'`))}if("object"==typeof e.peerDependenciesMeta&&null!==e.peerDependenciesMeta)for(const[A,n]of Object.entries(e.peerDependenciesMeta)){if("object"!=typeof n||null===n){r.push(new Error(`Invalid meta field for '${A}'`));continue}const e=g.parseDescriptor(A),o=this.ensurePeerDependencyMeta(e),i=d(n.optional,{yamlCompatibilityMode:t});null!==i?Object.assign(o,{optional:i}):r.push(new Error(`Invalid optional meta field for '${A}'`))}if("object"==typeof e.resolutions&&null!==e.resolutions)for(const[t,A]of Object.entries(e.resolutions))if("string"==typeof A)try{this.resolutions.push({pattern:(0,o.parseResolution)(t),reference:A})}catch(e){r.push(e);continue}else r.push(new Error(`Invalid resolution entry for '${t}'`));if(Array.isArray(e.files)){this.files=new Set;for(const t of e.files)"string"==typeof t?this.files.add(t):r.push(new Error(`Invalid files entry for '${t}'`))}if("object"==typeof e.publishConfig&&null!==e.publishConfig){if(this.publishConfig={},"string"==typeof e.publishConfig.access&&(this.publishConfig.access=e.publishConfig.access),"string"==typeof e.publishConfig.main&&(this.publishConfig.main=p(e.publishConfig.main)),"string"==typeof e.publishConfig.module&&(this.publishConfig.module=p(e.publishConfig.module)),null!=e.publishConfig.browser)if("string"==typeof e.publishConfig.browser)this.publishConfig.browser=p(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(const[t,r]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(p(t),"string"==typeof r?p(r):r)}if("string"==typeof e.publishConfig.registry&&(this.publishConfig.registry=e.publishConfig.registry),"string"==typeof e.publishConfig.bin)null!==this.name?this.publishConfig.bin=new Map([[this.name.name,p(e.publishConfig.bin)]]):r.push(new Error("String bin field, but no attached package name"));else if("object"==typeof e.publishConfig.bin&&null!==e.publishConfig.bin){this.publishConfig.bin=new Map;for(const[t,A]of Object.entries(e.publishConfig.bin))"string"==typeof A?this.publishConfig.bin.set(t,p(A)):r.push(new Error(`Invalid bin definition for '${t}'`))}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(const t of e.publishConfig.executableFiles)"string"==typeof t?this.publishConfig.executableFiles.add(p(t)):r.push(new Error("Invalid executable file definition"))}}if("object"==typeof e.installConfig&&null!==e.installConfig){this.installConfig={};for(const t of Object.keys(e.installConfig))"hoistingLimits"===t?"string"==typeof e.installConfig.hoistingLimits?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:r.push(new Error("Invalid hoisting limits definition")):r.push(new Error("Unrecognized installConfig key: "+t))}if("object"==typeof e.optionalDependencies&&null!==e.optionalDependencies)for(const[t,A]of Object.entries(e.optionalDependencies)){if("string"!=typeof A){r.push(new Error(`Invalid dependency range for '${t}'`));continue}let e;try{e=g.parseIdent(t)}catch(e){r.push(new Error(`Parsing failed for the dependency name '${t}'`));continue}const n=g.makeDescriptor(e,A);this.dependencies.set(n.identHash,n);const o=g.makeDescriptor(e,"unknown"),i=this.ensureDependencyMeta(o);Object.assign(i,{optional:!0})}"boolean"==typeof e.preferUnplugged&&(this.preferUnplugged=e.preferUnplugged),this.errors=r}getForScope(e){switch(e){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${e}")`)}}hasConsumerDependency(e){return!!this.dependencies.has(e.identHash)||!!this.peerDependencies.has(e.identHash)}hasHardDependency(e){return!!this.dependencies.has(e.identHash)||!!this.devDependencies.has(e.identHash)}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!this.hasHardDependency(e)||!!this.hasSoftDependency(e)}isCompatibleWithOS(e){return l.isManifestFieldCompatible(this.os,e)}isCompatibleWithCPU(e){return l.isManifestFieldCompatible(this.cpu,e)}ensureDependencyMeta(e){if("unknown"!==e.range&&!s().valid(e.range))throw new Error(`Invalid meta field range for '${g.stringifyDescriptor(e)}'`);const t=g.stringifyIdent(e),r="unknown"!==e.range?e.range:null;let A=this.dependenciesMeta.get(t);A||this.dependenciesMeta.set(t,A=new Map);let n=A.get(r);return n||A.set(r,n={}),n}ensurePeerDependencyMeta(e){if("unknown"!==e.range)throw new Error(`Invalid meta field range for '${g.stringifyDescriptor(e)}'`);const t=g.stringifyIdent(e);let r=this.peerDependenciesMeta.get(t);return r||this.peerDependenciesMeta.set(t,r={}),r}setRawField(e,t,{after:r=[]}={}){const A=new Set(r.filter(e=>Object.prototype.hasOwnProperty.call(this.raw,e)));if(0===A.size||Object.prototype.hasOwnProperty.call(this.raw,e))this.raw[e]=t;else{const r=this.raw,n=this.raw={};let o=!1;for(const i of Object.keys(r))n[i]=r[i],o||(A.delete(i),0===A.size&&(n[e]=t,o=!0))}}exportTo(e,{compatibilityMode:t=!0}={}){if(Object.assign(e,this.raw),null!==this.name?e.name=g.stringifyIdent(this.name):delete e.name,null!==this.version?e.version=this.version:delete e.version,null!==this.os?e.os=this.os:delete e.os,null!==this.cpu?e.cpu=this.cpu:delete e.cpu,null!==this.type?e.type=this.type:delete e.type,this.private?e.private=!0:delete e.private,null!==this.license?e.license=this.license:delete e.license,null!==this.languageName?e.languageName=this.languageName:delete e.languageName,null!==this.main?e.main=this.main:delete e.main,null!==this.module?e.module=this.module:delete e.module,null!==this.browser){const t=this.browser;"string"==typeof t?e.browser=t:t instanceof Map&&(e.browser=Object.assign({},...Array.from(t.keys()).sort().map(e=>({[e]:t.get(e)}))))}else delete e.browser;1===this.bin.size&&null!==this.name&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(e=>({[e]:this.bin.get(e)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces={...this.raw.workspaces,packages:this.workspaceDefinitions.map(({pattern:e})=>e)}:e.workspaces=this.workspaceDefinitions.map(({pattern:e})=>e):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;const r=[],A=[];for(const e of this.dependencies.values()){const n=this.dependenciesMeta.get(g.stringifyIdent(e));let o=!1;if(t&&n){const e=n.get(null);e&&e.optional&&(o=!0)}o?A.push(e):r.push(e)}r.length>0?e.dependencies=Object.assign({},...g.sortDescriptors(r).map(e=>({[g.stringifyIdent(e)]:e.range}))):delete e.dependencies,A.length>0?e.optionalDependencies=Object.assign({},...g.sortDescriptors(A).map(e=>({[g.stringifyIdent(e)]:e.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...g.sortDescriptors(this.devDependencies.values()).map(e=>({[g.stringifyIdent(e)]:e.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...g.sortDescriptors(this.peerDependencies.values()).map(e=>({[g.stringifyIdent(e)]:e.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(const[r,A]of a.sortMap(this.dependenciesMeta.entries(),([e,t])=>e))for(const[n,o]of a.sortMap(A.entries(),([e,t])=>null!==e?"0"+e:"1")){const A=null!==n?g.stringifyDescriptor(g.makeDescriptor(g.parseIdent(r),n)):r,i={...o};t&&null===n&&delete i.optional,0!==Object.keys(i).length&&(e.dependenciesMeta[A]=i)}return 0===Object.keys(e.dependenciesMeta).length&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...a.sortMap(this.peerDependenciesMeta.entries(),([e,t])=>e).map(([e,t])=>({[e]:t}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:e,reference:t})=>({[(0,o.stringifyResolution)(e)]:t}))):delete e.resolutions,null!==this.files?e.files=Array.from(this.files):delete e.files,null!==this.preferUnplugged?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,e}}function u(e){const t=e.match(/^[ \t]+/m);return t?t[0]:" "}function h(e){return 65279===e.charCodeAt(0)?e.slice(1):e}function p(e){return e.replace(/\\/g,"/")}function d(e,{yamlCompatibilityMode:t}){return t?a.tryParseOptionalBoolean(e):void 0===e||"boolean"==typeof e?e:null}l.fileName="package.json",l.allDependencies=["dependencies","devDependencies","peerDependencies"],l.hardDependencies=["dependencies","devDependencies"]},92659:(e,t,r)=>{"use strict";var A;function n(e){return"YN"+e.toString(10).padStart(4,"0")}r.d(t,{b:()=>A,i:()=>n}),function(e){e[e.UNNAMED=0]="UNNAMED",e[e.EXCEPTION=1]="EXCEPTION",e[e.MISSING_PEER_DEPENDENCY=2]="MISSING_PEER_DEPENDENCY",e[e.CYCLIC_DEPENDENCIES=3]="CYCLIC_DEPENDENCIES",e[e.DISABLED_BUILD_SCRIPTS=4]="DISABLED_BUILD_SCRIPTS",e[e.BUILD_DISABLED=5]="BUILD_DISABLED",e[e.SOFT_LINK_BUILD=6]="SOFT_LINK_BUILD",e[e.MUST_BUILD=7]="MUST_BUILD",e[e.MUST_REBUILD=8]="MUST_REBUILD",e[e.BUILD_FAILED=9]="BUILD_FAILED",e[e.RESOLVER_NOT_FOUND=10]="RESOLVER_NOT_FOUND",e[e.FETCHER_NOT_FOUND=11]="FETCHER_NOT_FOUND",e[e.LINKER_NOT_FOUND=12]="LINKER_NOT_FOUND",e[e.FETCH_NOT_CACHED=13]="FETCH_NOT_CACHED",e[e.YARN_IMPORT_FAILED=14]="YARN_IMPORT_FAILED",e[e.REMOTE_INVALID=15]="REMOTE_INVALID",e[e.REMOTE_NOT_FOUND=16]="REMOTE_NOT_FOUND",e[e.RESOLUTION_PACK=17]="RESOLUTION_PACK",e[e.CACHE_CHECKSUM_MISMATCH=18]="CACHE_CHECKSUM_MISMATCH",e[e.UNUSED_CACHE_ENTRY=19]="UNUSED_CACHE_ENTRY",e[e.MISSING_LOCKFILE_ENTRY=20]="MISSING_LOCKFILE_ENTRY",e[e.WORKSPACE_NOT_FOUND=21]="WORKSPACE_NOT_FOUND",e[e.TOO_MANY_MATCHING_WORKSPACES=22]="TOO_MANY_MATCHING_WORKSPACES",e[e.CONSTRAINTS_MISSING_DEPENDENCY=23]="CONSTRAINTS_MISSING_DEPENDENCY",e[e.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]="CONSTRAINTS_INCOMPATIBLE_DEPENDENCY",e[e.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]="CONSTRAINTS_EXTRANEOUS_DEPENDENCY",e[e.CONSTRAINTS_INVALID_DEPENDENCY=26]="CONSTRAINTS_INVALID_DEPENDENCY",e[e.CANT_SUGGEST_RESOLUTIONS=27]="CANT_SUGGEST_RESOLUTIONS",e[e.FROZEN_LOCKFILE_EXCEPTION=28]="FROZEN_LOCKFILE_EXCEPTION",e[e.CROSS_DRIVE_VIRTUAL_LOCAL=29]="CROSS_DRIVE_VIRTUAL_LOCAL",e[e.FETCH_FAILED=30]="FETCH_FAILED",e[e.DANGEROUS_NODE_MODULES=31]="DANGEROUS_NODE_MODULES",e[e.NODE_GYP_INJECTED=32]="NODE_GYP_INJECTED",e[e.AUTHENTICATION_NOT_FOUND=33]="AUTHENTICATION_NOT_FOUND",e[e.INVALID_CONFIGURATION_KEY=34]="INVALID_CONFIGURATION_KEY",e[e.NETWORK_ERROR=35]="NETWORK_ERROR",e[e.LIFECYCLE_SCRIPT=36]="LIFECYCLE_SCRIPT",e[e.CONSTRAINTS_MISSING_FIELD=37]="CONSTRAINTS_MISSING_FIELD",e[e.CONSTRAINTS_INCOMPATIBLE_FIELD=38]="CONSTRAINTS_INCOMPATIBLE_FIELD",e[e.CONSTRAINTS_EXTRANEOUS_FIELD=39]="CONSTRAINTS_EXTRANEOUS_FIELD",e[e.CONSTRAINTS_INVALID_FIELD=40]="CONSTRAINTS_INVALID_FIELD",e[e.AUTHENTICATION_INVALID=41]="AUTHENTICATION_INVALID",e[e.PROLOG_UNKNOWN_ERROR=42]="PROLOG_UNKNOWN_ERROR",e[e.PROLOG_SYNTAX_ERROR=43]="PROLOG_SYNTAX_ERROR",e[e.PROLOG_EXISTENCE_ERROR=44]="PROLOG_EXISTENCE_ERROR",e[e.STACK_OVERFLOW_RESOLUTION=45]="STACK_OVERFLOW_RESOLUTION",e[e.AUTOMERGE_FAILED_TO_PARSE=46]="AUTOMERGE_FAILED_TO_PARSE",e[e.AUTOMERGE_IMMUTABLE=47]="AUTOMERGE_IMMUTABLE",e[e.AUTOMERGE_SUCCESS=48]="AUTOMERGE_SUCCESS",e[e.AUTOMERGE_REQUIRED=49]="AUTOMERGE_REQUIRED",e[e.DEPRECATED_CLI_SETTINGS=50]="DEPRECATED_CLI_SETTINGS",e[e.PLUGIN_NAME_NOT_FOUND=51]="PLUGIN_NAME_NOT_FOUND",e[e.INVALID_PLUGIN_REFERENCE=52]="INVALID_PLUGIN_REFERENCE",e[e.CONSTRAINTS_AMBIGUITY=53]="CONSTRAINTS_AMBIGUITY",e[e.CACHE_OUTSIDE_PROJECT=54]="CACHE_OUTSIDE_PROJECT",e[e.IMMUTABLE_INSTALL=55]="IMMUTABLE_INSTALL",e[e.IMMUTABLE_CACHE=56]="IMMUTABLE_CACHE",e[e.INVALID_MANIFEST=57]="INVALID_MANIFEST",e[e.PACKAGE_PREPARATION_FAILED=58]="PACKAGE_PREPARATION_FAILED",e[e.INVALID_RANGE_PEER_DEPENDENCY=59]="INVALID_RANGE_PEER_DEPENDENCY",e[e.INCOMPATIBLE_PEER_DEPENDENCY=60]="INCOMPATIBLE_PEER_DEPENDENCY",e[e.DEPRECATED_PACKAGE=61]="DEPRECATED_PACKAGE",e[e.INCOMPATIBLE_OS=62]="INCOMPATIBLE_OS",e[e.INCOMPATIBLE_CPU=63]="INCOMPATIBLE_CPU",e[e.FROZEN_ARTIFACT_EXCEPTION=64]="FROZEN_ARTIFACT_EXCEPTION",e[e.TELEMETRY_NOTICE=65]="TELEMETRY_NOTICE",e[e.PATCH_HUNK_FAILED=66]="PATCH_HUNK_FAILED",e[e.INVALID_CONFIGURATION_VALUE=67]="INVALID_CONFIGURATION_VALUE",e[e.UNUSED_PACKAGE_EXTENSION=68]="UNUSED_PACKAGE_EXTENSION",e[e.REDUNDANT_PACKAGE_EXTENSION=69]="REDUNDANT_PACKAGE_EXTENSION"}(A||(A={}))},27092:(e,t,r)=>{"use strict";r.d(t,{B:()=>n});var A=r(54143);class n{constructor(e){this.resolvers=e.filter(e=>e)}supportsDescriptor(e,t){return!!this.tryResolverByDescriptor(e,t)}supportsLocator(e,t){return!!this.tryResolverByLocator(e,t)}shouldPersistResolution(e,t){return this.getResolverByLocator(e,t).shouldPersistResolution(e,t)}bindDescriptor(e,t,r){return this.getResolverByDescriptor(e,r).bindDescriptor(e,t,r)}getResolutionDependencies(e,t){return this.getResolverByDescriptor(e,t).getResolutionDependencies(e,t)}async getCandidates(e,t,r){const A=this.getResolverByDescriptor(e,r);return await A.getCandidates(e,t,r)}async getSatisfying(e,t,r){return this.getResolverByDescriptor(e,r).getSatisfying(e,t,r)}async resolve(e,t){const r=this.getResolverByLocator(e,t);return await r.resolve(e,t)}tryResolverByDescriptor(e,t){const r=this.resolvers.find(r=>r.supportsDescriptor(e,t));return r||null}getResolverByDescriptor(e,t){const r=this.resolvers.find(r=>r.supportsDescriptor(e,t));if(!r)throw new Error(A.prettyDescriptor(t.project.configuration,e)+" isn't supported by any available resolver");return r}tryResolverByLocator(e,t){const r=this.resolvers.find(r=>r.supportsLocator(e,t));return r||null}getResolverByLocator(e,t){const r=this.resolvers.find(r=>r.supportsLocator(e,t));if(!r)throw new Error(A.prettyLocator(t.project.configuration,e)+" isn't supported by any available resolver");return r}}},85824:(e,t,r)=>{"use strict";r.d(t,{I:()=>ie});var A=r(43896),n=r(46009),o=r(5944),i=r(11640),s=r(40822),a=r(76417);function c(){}function g(e,t,r,A,n){for(var o=0,i=t.length,s=0,a=0;oe.length?r:e})),c.value=e.join(l)}else c.value=e.join(r.slice(s,s+c.count));s+=c.count,c.added||(a+=c.count)}}var u=t[i-1];return i>1&&"string"==typeof u.value&&(u.added||u.removed)&&e.equals("",u.value)&&(t[i-2].value+=u.value,t.pop()),t}function l(e){return{newPos:e.newPos,components:e.components.slice(0)}}c.prototype={diff:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},A=r.callback;"function"==typeof r&&(A=r,r={}),this.options=r;var n=this;function o(e){return A?(setTimeout((function(){A(void 0,e)}),0),!0):e}e=this.castInput(e),t=this.castInput(t),e=this.removeEmpty(this.tokenize(e));var i=(t=this.removeEmpty(this.tokenize(t))).length,s=e.length,a=1,c=i+s,u=[{newPos:-1,components:[]}],h=this.extractCommon(u[0],t,e,0);if(u[0].newPos+1>=i&&h+1>=s)return o([{value:this.join(t),count:t.length}]);function p(){for(var r=-1*a;r<=a;r+=2){var A=void 0,c=u[r-1],h=u[r+1],p=(h?h.newPos:0)-r;c&&(u[r-1]=void 0);var d=c&&c.newPos+1=i&&p+1>=s)return o(g(n,A.components,t,e,n.useLongestToken));u[r]=A}else u[r]=void 0}a++}if(A)!function e(){setTimeout((function(){if(a>c)return A();p()||e()}),0)}();else for(;a<=c;){var d=p();if(d)return d}},pushComponent:function(e,t,r){var A=e[e.length-1];A&&A.added===t&&A.removed===r?e[e.length-1]={count:A.count+1,added:t,removed:r}:e.push({count:1,added:t,removed:r})},extractCommon:function(e,t,r,A){for(var n=t.length,o=r.length,i=e.newPos,s=i-A,a=0;i+10?a(d.lines.slice(-i.context)):[],g-=u.length,l-=u.length)}(o=u).push.apply(o,E(n.map((function(e){return(t.added?"+":"-")+e})))),t.added?p+=n.length:h+=n.length}else{if(g)if(n.length<=2*i.context&&e=s.length-2&&n.length<=i.context){var y=/\n$/.test(r),m=/\n$/.test(A),w=0==n.length&&u.length>B.oldLines;!y&&w&&u.splice(B.oldLines,0,"\\ No newline at end of file"),(y||w)&&m||u.push("\\ No newline at end of file")}c.push(B),g=0,l=0,u=[]}h+=n.length,p+=n.length}},f=0;f`${r}#commit=${A}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(e,t,r="",A,n)=>`https://${r}github.com/${A}.git#commit=${n}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(e,t,r="",A,n)=>`https://${r}github.com/${A}.git#commit=${n}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@[^/]+\/)?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,e=>"npm:"+e],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)$/,e=>"npm:"+e],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,e=>"npm:"+e],[/^[^/]+\.tgz#[0-9a-f]+$/,e=>"npm:"+e]];class T{constructor(){this.resolutions=null}async setup(e,{report:t}){const r=n.y1.join(e.cwd,e.configuration.get("lockfileFilename"));if(!A.xfs.existsSync(r))return;const o=await A.xfs.readFilePromise(r,"utf8"),s=(0,i.parseSyml)(o);if(Object.prototype.hasOwnProperty.call(s,"__metadata"))return;const a=this.resolutions=new Map;for(const r of Object.keys(s)){let A=O.tryParseDescriptor(r);if(!A){t.reportWarning(P.b.YARN_IMPORT_FAILED,`Failed to parse the string "${r}" into a proper descriptor`);continue}k().validRange(A.range)&&(A=O.makeDescriptor(A,"npm:"+A.range));const{version:n,resolved:o}=s[r];if(!o)continue;let i;for(const[e,t]of U){const r=o.match(e);if(r){i=t(n,...r);break}}if(!i){t.reportWarning(P.b.YARN_IMPORT_FAILED,`${O.prettyDescriptor(e.configuration,A)}: Only some patterns can be imported from legacy lockfiles (not "${o}")`);continue}const c=O.makeLocator(A,i);a.set(A.descriptorHash,c)}}supportsDescriptor(e,t){return!!this.resolutions&&this.resolutions.has(e.descriptorHash)}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");const A=this.resolutions.get(e.descriptorHash);if(!A)throw new Error("Assertion failed: The resolution should have been registered");return[A]}async getSatisfying(e,t,r){return null}async resolve(e,t){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}}class j{supportsDescriptor(e,t){return!!t.project.storedResolutions.get(e.descriptorHash)||!!t.project.originalPackages.has(O.convertDescriptorToLocator(e).locatorHash)}supportsLocator(e,t){return!!t.project.originalPackages.has(e.locatorHash)}shouldPersistResolution(e,t){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){let A=r.project.originalPackages.get(O.convertDescriptorToLocator(e).locatorHash);if(A)return[A];const n=r.project.storedResolutions.get(e.descriptorHash);if(!n)throw new Error("Expected the resolution to have been successful - resolution not found");if(A=r.project.originalPackages.get(n),!A)throw new Error("Expected the resolution to have been successful - package not found");return[A]}async getSatisfying(e,t,r){return null}async resolve(e,t){const r=t.project.originalPackages.get(e.locatorHash);if(!r)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return r}}var Y=r(46611),G=r(27092),H=r(35691);class J{constructor(e){this.resolver=e}supportsDescriptor(e,t){return this.resolver.supportsDescriptor(e,t)}supportsLocator(e,t){return this.resolver.supportsLocator(e,t)}shouldPersistResolution(e,t){return this.resolver.shouldPersistResolution(e,t)}bindDescriptor(e,t,r){return this.resolver.bindDescriptor(e,t,r)}getResolutionDependencies(e,t){return this.resolver.getResolutionDependencies(e,t)}async getCandidates(e,t,r){throw new H.lk(P.b.MISSING_LOCKFILE_ENTRY,"This package doesn't seem to be present in your lockfile; try to make an install to update your resolutions")}async getSatisfying(e,t,r){throw new H.lk(P.b.MISSING_LOCKFILE_ENTRY,"This package doesn't seem to be present in your lockfile; try to make an install to update your resolutions")}async resolve(e,t){throw new H.lk(P.b.MISSING_LOCKFILE_ENTRY,"This package doesn't seem to be present in your lockfile; try to make an install to update your resolutions")}}var q=r(33720),z=r(17722),W=r(81111),V=r(71643),X=r(20624),_=r(73632),Z=r(63088),$=r(36545),ee=r(32485);const te=/ *, */g,re=/\/$/,Ae=(0,N.promisify)(R().gzip),ne=(0,N.promisify)(R().gunzip),oe={restoreInstallersCustomData:["installersCustomData"],restoreResolutions:["accessibleLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"]};class ie{constructor(e,{configuration:t}){this.resolutionAliases=new Map,this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map,this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.storedChecksums=new Map,this.accessibleLocators=new Set,this.originalPackages=new Map,this.optionalBuilds=new Set,this.peerRequirements=new Map,this.installersCustomData=new Map,this.lockFileChecksum=null,this.configuration=t,this.cwd=e}static async find(e,t){var r,o,i;if(!e.projectCwd)throw new s.UsageError("No project found in "+t);let a=e.projectCwd,c=t,g=null;for(;g!==e.projectCwd;){if(g=c,A.xfs.existsSync(n.y1.join(g,n.QS.manifest))){a=g;break}c=n.y1.dirname(g)}const l=new ie(e.projectCwd,{configuration:e});null===(r=x.VK.telemetry)||void 0===r||r.reportProject(l.cwd),await l.setupResolutions(),await l.setupWorkspaces(),null===(o=x.VK.telemetry)||void 0===o||o.reportWorkspaceCount(l.workspaces.length),null===(i=x.VK.telemetry)||void 0===i||i.reportDependencyCount(l.workspaces.reduce((e,t)=>e+t.manifest.dependencies.size+t.manifest.devDependencies.size,0));const u=l.tryWorkspaceByCwd(a);if(u)return{project:l,workspace:u,locator:u.anchoredLocator};const h=await l.findLocatorForLocation(a+"/",{strict:!0});if(h)return{project:l,locator:h,workspace:null};throw new s.UsageError(`The nearest package directory (${V.pretty(e,a,V.Type.PATH)}) doesn't seem to be part of the project declared in ${V.pretty(e,l.cwd,V.Type.PATH)}.\n\n- If the project directory is right, it might be that you forgot to list ${V.pretty(e,n.y1.relative(l.cwd,a),V.Type.PATH)} as a workspace.\n- If it isn't, it's likely because you have a yarn.lock or package.json file there, confusing the project root detection.`)}static generateBuildStateFile(e,t){let r="# Warning: This file is automatically generated. Removing it is fine, but will\n# cause all your builds to become invalidated.\n";const A=[...e].map(([e,r])=>{const A=t.get(e);if(void 0===A)throw new Error("Assertion failed: The locator should have been registered");return[O.stringifyLocator(A),A.locatorHash,r]});for(const[e,t,n]of _.sortMap(A,[e=>e[0],e=>e[1]]))r+="\n",r+=`# ${e}\n`,r+=JSON.stringify(t)+":\n",r+=` ${n}\n`;return r}async setupResolutions(){this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;const e=n.y1.join(this.cwd,this.configuration.get("lockfileFilename")),t=this.configuration.get("defaultLanguageName");if(A.xfs.existsSync(e)){const r=await A.xfs.readFilePromise(e,"utf8");this.lockFileChecksum=X.makeHash("1",r);const n=(0,i.parseSyml)(r);if(n.__metadata){const e=n.__metadata.version,r=n.__metadata.cacheKey;for(const A of Object.keys(n)){if("__metadata"===A)continue;const o=n[A];if(void 0===o.resolution)throw new Error(`Assertion failed: Expected the lockfile entry to have a resolution field (${A})`);const i=O.parseLocator(o.resolution,!0),s=new Y.G;s.load(o,{yamlCompatibilityMode:!0});const a=s.version,c=s.languageName||t,g=o.linkType.toUpperCase(),l=s.dependencies,u=s.peerDependencies,h=s.dependenciesMeta,p=s.peerDependenciesMeta,d=s.bin;if(null!=o.checksum){const e=void 0===r||o.checksum.includes("/")?o.checksum:`${r}/${o.checksum}`;this.storedChecksums.set(i.locatorHash,e)}if(e>=4){const e={...i,version:a,languageName:c,linkType:g,dependencies:l,peerDependencies:u,dependenciesMeta:h,peerDependenciesMeta:p,bin:d};this.originalPackages.set(e.locatorHash,e)}for(const t of A.split(te)){const r=O.parseDescriptor(t);if(this.storedDescriptors.set(r.descriptorHash,r),e>=4)this.storedResolutions.set(r.descriptorHash,i.locatorHash);else{const e=O.convertLocatorToDescriptor(i);e.descriptorHash!==r.descriptorHash&&(this.storedDescriptors.set(e.descriptorHash,e),this.resolutionAliases.set(r.descriptorHash,e.descriptorHash))}}}}}}async setupWorkspaces(){this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map;let e=[this.cwd];for(;e.length>0;){const t=e;e=[];for(const r of t){if(this.workspacesByCwd.has(r))continue;const t=await this.addWorkspace(r),A=this.storedPackages.get(t.anchoredLocator.locatorHash);A&&(t.dependencies=A.dependencies);for(const r of t.workspacesCwds)e.push(r)}}}async addWorkspace(e){const t=new z.j(e,{project:this});await t.setup();const r=this.workspacesByIdent.get(t.locator.identHash);if(void 0!==r)throw new Error(`Duplicate workspace name ${O.prettyIdent(this.configuration,t.locator)}: ${e} conflicts with ${r.cwd}`);return this.workspaces.push(t),this.workspacesByCwd.set(e,t),this.workspacesByIdent.set(t.locator.identHash,t),t}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){n.y1.isAbsolute(e)||(e=n.y1.resolve(this.cwd,e)),e=n.y1.normalize(e).replace(/\/+$/,"");const t=this.workspacesByCwd.get(e);return t||null}getWorkspaceByCwd(e){const t=this.tryWorkspaceByCwd(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByFilePath(e){let t=null;for(const r of this.workspaces){n.y1.relative(r.cwd,e).startsWith("../")||(t&&t.cwd.length>=r.cwd.length||(t=r))}return t||null}getWorkspaceByFilePath(e){const t=this.tryWorkspaceByFilePath(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByIdent(e){const t=this.workspacesByIdent.get(e.identHash);return void 0===t?null:t}getWorkspaceByIdent(e){const t=this.tryWorkspaceByIdent(e);if(!t)throw new Error(`Workspace not found (${O.prettyIdent(this.configuration,e)})`);return t}tryWorkspaceByDescriptor(e){const t=this.tryWorkspaceByIdent(e);return null!==t&&t.accepts(e.range)?t:null}getWorkspaceByDescriptor(e){const t=this.tryWorkspaceByDescriptor(e);if(null===t)throw new Error(`Workspace not found (${O.prettyDescriptor(this.configuration,e)})`);return t}tryWorkspaceByLocator(e){O.isVirtualLocator(e)&&(e=O.devirtualizeLocator(e));const t=this.tryWorkspaceByIdent(e);return null===t||t.locator.locatorHash!==e.locatorHash&&t.anchoredLocator.locatorHash!==e.locatorHash?null:t}getWorkspaceByLocator(e){const t=this.tryWorkspaceByLocator(e);if(!t)throw new Error(`Workspace not found (${O.prettyLocator(this.configuration,e)})`);return t}refreshWorkspaceDependencies(){for(const e of this.workspaces){const t=this.storedPackages.get(e.anchoredLocator.locatorHash);if(!t)throw new Error("Assertion failed: Expected workspace to have been resolved");e.dependencies=new Map(t.dependencies)}}forgetResolution(e){const t=e=>{this.storedResolutions.delete(e),this.storedDescriptors.delete(e)},r=e=>{this.originalPackages.delete(e),this.storedPackages.delete(e),this.accessibleLocators.delete(e)};if("descriptorHash"in e){const A=this.storedResolutions.get(e.descriptorHash);t(e.descriptorHash);const n=new Set(this.storedResolutions.values());void 0===A||n.has(A)||r(A)}if("locatorHash"in e){r(e.locatorHash);for(const[r,A]of this.storedResolutions)A===e.locatorHash&&t(r)}}forgetTransientResolutions(){const e=this.configuration.makeResolver();for(const t of this.originalPackages.values()){let r;try{r=e.shouldPersistResolution(t,{project:this,resolver:e})}catch(e){r=!1}r||this.forgetResolution(t)}}forgetVirtualResolutions(){for(const e of this.storedPackages.values())for(const[t,r]of e.dependencies)O.isVirtualDescriptor(r)&&e.dependencies.set(t,O.devirtualizeDescriptor(r))}getDependencyMeta(e,t){const r={},A=this.topLevelWorkspace.manifest.dependenciesMeta.get(O.stringifyIdent(e));if(!A)return r;const n=A.get(null);if(n&&Object.assign(r,n),null===t||!k().valid(t))return r;for(const[e,n]of A)null!==e&&e===t&&Object.assign(r,n);return r}async findLocatorForLocation(e,{strict:t=!1}={}){const r=new q.$,A=this.configuration.getLinkers(),n={project:this,report:r};for(const r of A){const A=await r.findPackageLocator(e,n);if(A){if(t){if((await r.findPackageLocation(A,n)).replace(re,"")!==e.replace(re,""))continue}return A}}return null}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions(),e.lockfileOnly||this.forgetTransientResolutions();const t=e.resolver||this.configuration.makeResolver(),r=new T;await r.setup(this,{report:e.report});const o=e.lockfileOnly?new G.B([new j,new J(t)]):new G.B([new j,r,t]),i=this.configuration.makeFetcher(),s=e.lockfileOnly?{project:this,report:e.report,resolver:o}:{project:this,report:e.report,resolver:o,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:i}},a=new Map,c=new Map,g=new Map,l=new Map,u=new Map,h=new Map,p=[],d=async e=>{const t=await _.prettifyAsyncErrors(async()=>await o.resolve(e,s),t=>`${O.prettyLocator(this.configuration,e)}: ${t}`);if(!O.areLocatorsEqual(e,t))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${O.prettyLocator(this.configuration,e)} to ${O.prettyLocator(this.configuration,t)})`);l.set(t.locatorHash,t);const r=this.configuration.normalizePackage(t);for(const[t,A]of r.dependencies){const n=await this.configuration.reduceHook(e=>e.reduceDependency,A,this,r,A,{resolver:o,resolveOptions:s});if(!O.areIdentsEqual(A,n))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");const i=o.bindDescriptor(n,e,s);r.dependencies.set(t,i)}return p.push(Promise.all([...r.dependencies.values()].map(e=>f(e)))),c.set(r.locatorHash,r),r},C=async e=>{const t=this.resolutionAliases.get(e.descriptorHash);if(void 0!==t)return(async(e,t)=>{const r=await f(t);return a.set(e.descriptorHash,e),g.set(e.descriptorHash,r.locatorHash),r})(e,this.storedDescriptors.get(t));const r=o.getResolutionDependencies(e,s),A=new Map(await Promise.all(r.map(async e=>[e.descriptorHash,await f(e)]))),n=(await _.prettifyAsyncErrors(async()=>await o.getCandidates(e,A,s),t=>`${O.prettyDescriptor(this.configuration,e)}: ${t}`))[0];if(void 0===n)throw new Error(O.prettyDescriptor(this.configuration,e)+": No candidates found");return a.set(e.descriptorHash,e),g.set(e.descriptorHash,n.locatorHash),(async e=>{const t=u.get(e.locatorHash);if(void 0!==t)return t;const r=Promise.resolve().then(()=>d(e));return u.set(e.locatorHash,r),r})(n)},f=e=>{const t=h.get(e.descriptorHash);if(void 0!==t)return t;a.set(e.descriptorHash,e);const r=Promise.resolve().then(()=>C(e));return h.set(e.descriptorHash,r),r};for(const e of this.workspaces){const t=e.anchoredDescriptor;p.push(f(t))}for(;p.length>0;){const e=[...p];p.length=0,await Promise.all(e)}const I=new Set(this.resolutionAliases.values()),E=new Set(c.keys()),B=new Set,y=new Map;!function({project:e,allDescriptors:t,allResolutions:r,allPackages:o,accessibleLocators:i=new Set,optionalBuilds:s=new Set,volatileDescriptors:a=new Set,peerRequirements:c=new Map,report:g,tolerateMissingPackages:l=!1}){var u;const h=new Map,p=[],d=new Map,C=new Map,f=new Map,I=new Map,E=new Map,B=new Map(e.workspaces.map(e=>{const t=e.anchoredLocator.locatorHash,r=o.get(t);if(void 0===r){if(l)return[t,null];throw new Error("Assertion failed: The workspace should have an associated package")}return[t,O.copyPackage(r)]})),y=()=>{const e=A.xfs.mktempSync(),t=n.y1.join(e,"stacktrace.log"),r=String(p.length+1).length,o=p.map((e,t)=>`${(t+1+".").padStart(r," ")} ${O.stringifyLocator(e)}\n`).join("");throw A.xfs.writeFileSync(t,o),new H.lk(P.b.STACK_OVERFLOW_RESOLUTION,"Encountered a stack overflow when resolving peer dependencies; cf "+t)},m=e=>{const t=r.get(e.descriptorHash);if(void 0===t)throw new Error("Assertion failed: The resolution should have been registered");const A=o.get(t);if(!A)throw new Error("Assertion failed: The package could not be found");return A},w=(e,t,{first:r,optional:A})=>{p.length>1e3&&y(),p.push(e);const n=Q(e,t,{first:r,optional:A});return p.pop(),n},Q=(A,n,{first:c,optional:g})=>{if(i.has(A.locatorHash))return;i.add(A.locatorHash),g||s.delete(A.locatorHash);const u=o.get(A.locatorHash);if(!u){if(l)return;throw new Error(`Assertion failed: The package (${O.prettyLocator(e.configuration,A)}) should have been registered`)}const p=[],m=[],Q=[],D=[],b=[];for(const i of Array.from(u.dependencies.values())){if(u.peerDependencies.has(i.identHash)&&!c)continue;if(O.isVirtualDescriptor(i))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");a.delete(i.descriptorHash);let s=g;if(!s){const e=u.dependenciesMeta.get(O.stringifyIdent(i));if(void 0!==e){const t=e.get(null);void 0!==t&&t.optional&&(s=!0)}}const C=r.get(i.descriptorHash);if(!C){if(l)continue;throw new Error(`Assertion failed: The resolution (${O.prettyDescriptor(e.configuration,i)}) should have been registered`)}const v=B.get(C)||o.get(C);if(!v)throw new Error(`Assertion failed: The package (${C}, resolved from ${O.prettyDescriptor(e.configuration,i)}) should have been registered`);if(0===v.peerDependencies.size){w(v,new Map,{first:!1,optional:s});continue}const S=h.get(v.locatorHash);let k,N;"number"==typeof S&&S>=2&&y();const F=new Set;let K;m.push(()=>{k=O.virtualizeDescriptor(i,A.locatorHash),N=O.virtualizePackage(v,A.locatorHash),u.dependencies.delete(i.identHash),u.dependencies.set(k.identHash,k),r.set(k.descriptorHash,N.locatorHash),t.set(k.descriptorHash,k),o.set(N.locatorHash,N),p.push([v,k,N])}),Q.push(()=>{var e;K=new Map;for(const o of N.peerDependencies.values()){let i=u.dependencies.get(o.identHash);if(!i&&O.areIdentsEqual(A,o)&&(i=O.convertLocatorToDescriptor(A),t.set(i.descriptorHash,i),r.set(i.descriptorHash,A.locatorHash),a.delete(i.descriptorHash)),i||!N.dependencies.has(o.identHash)){if(i||(i=O.makeDescriptor(o,"missing:")),N.dependencies.set(i.identHash,i),O.isVirtualDescriptor(i)){_.getSetWithDefault(f,i.descriptorHash).add(N.locatorHash)}d.set(i.identHash,i),"missing:"===i.range&&F.add(i.identHash),K.set(o.identHash,null!==(e=n.get(o.identHash))&&void 0!==e?e:N.locatorHash)}else N.peerDependencies.delete(o.identHash)}N.dependencies=new Map(_.sortMap(N.dependencies,([e,t])=>O.stringifyIdent(t)))}),D.push(()=>{if(!o.has(N.locatorHash))return;const e=h.get(v.locatorHash),t=void 0!==e?e+1:1;h.set(v.locatorHash,t),w(N,K,{first:!1,optional:s}),h.set(v.locatorHash,t-1)}),b.push(()=>{const e=u.dependencies.get(i.identHash);if(void 0===e)throw new Error("Assertion failed: Expected the peer dependency to have been turned into a dependency");const t=r.get(e.descriptorHash);if(void 0===t)throw new Error("Assertion failed: Expected the descriptor to be registered");if(_.getSetWithDefault(E,t).add(A.locatorHash),o.has(N.locatorHash)){for(const e of N.peerDependencies.values()){const t=K.get(e.identHash);if(void 0===t)throw new Error("Assertion failed: Expected the peer dependency ident to be registered");_.getArrayWithDefault(_.getMapWithDefault(I,t),O.stringifyIdent(e)).push(N.locatorHash)}for(const e of F)N.dependencies.delete(e)}})}for(const e of[...m,...Q])e();let v;do{v=!0;for(const[A,n,s]of p){if(!o.has(s.locatorHash))continue;const a=_.getMapWithDefault(C,A.locatorHash),c=X.makeHash(...[...s.dependencies.values()].map(t=>{const A="missing:"!==t.range?r.get(t.descriptorHash):"missing:";if(void 0===A)throw new Error(`Assertion failed: Expected the resolution for ${O.prettyDescriptor(e.configuration,t)} to have been registered`);return A}),n.identHash),g=a.get(c);if(void 0===g){a.set(c,n);continue}if(g===n)continue;v=!1,o.delete(s.locatorHash),t.delete(n.descriptorHash),r.delete(n.descriptorHash),i.delete(s.locatorHash);const l=f.get(n.descriptorHash)||[],h=[u.locatorHash,...l];f.delete(n.descriptorHash);for(const e of h){const t=o.get(e);void 0!==t&&t.dependencies.set(n.identHash,g)}}}while(!v);for(const e of[...D,...b])e()};for(const t of e.workspaces)a.delete(t.anchoredDescriptor.descriptorHash),w(t.anchoredLocator,new Map,{first:!0,optional:!1});let D;!function(e){e[e.NotProvided=0]="NotProvided",e[e.NotCompatible=1]="NotCompatible"}(D||(D={}));const b=[];for(const[e,t]of E){const r=o.get(e);if(void 0===r)throw new Error("Assertion failed: Expected the root to be registered");const A=I.get(e);if(void 0!==A)for(const n of t){const t=o.get(n);if(void 0!==t)for(const[i,s]of A){const A=O.parseIdent(i);if(t.peerDependencies.has(A.identHash))continue;const a="p"+X.makeHash(n,i,e).slice(0,5);c.set(a,{subject:n,requested:A,rootRequester:e,allRequesters:s});const g=r.dependencies.get(A.identHash);if(void 0!==g){const e=m(g),n=null!==(u=e.version)&&void 0!==u?u:"0.0.0",i=new Set;for(const e of s){const t=o.get(e);if(void 0===t)throw new Error("Assertion failed: Expected the link to be registered");const r=t.peerDependencies.get(A.identHash);if(void 0===r)throw new Error("Assertion failed: Expected the ident to be registered");i.add(r.range)}[...i].every(e=>$.satisfiesWithPrereleases(n,e))||b.push({type:D.NotCompatible,subject:t,requested:A,requester:r,version:n,hash:a,requirementCount:s.length})}else{const e=r.peerDependenciesMeta.get(i);(null==e?void 0:e.optional)||b.push({type:D.NotProvided,subject:t,requested:A,requester:r,hash:a})}}}}const v=[e=>O.prettyLocatorNoColors(e.subject),e=>O.stringifyIdent(e.requested),e=>""+e.type];for(const t of _.sortMap(b,v))switch(t.type){case D.NotProvided:null==g||g.reportWarning(P.b.MISSING_PEER_DEPENDENCY,`${O.prettyLocator(e.configuration,t.subject)} doesn't provide ${O.prettyIdent(e.configuration,t.requested)} (${V.pretty(e.configuration,t.hash,V.Type.CODE)}), requested by ${O.prettyIdent(e.configuration,t.requester)}`);break;case D.NotCompatible:{const r=t.requirementCount>1?"and some of its descendants request":"requests";null==g||g.reportWarning(P.b.INCOMPATIBLE_PEER_DEPENDENCY,`${O.prettyLocator(e.configuration,t.subject)} provides ${O.prettyIdent(e.configuration,t.requested)} (${V.pretty(e.configuration,t.hash,V.Type.CODE)}) with version ${O.prettyReference(e.configuration,t.version)}, which doesn't satisfy what ${O.prettyIdent(e.configuration,t.requester)} ${r}`)}}b.length>0&&(null==g||g.reportWarning(P.b.UNNAMED,`Some peer dependencies are incorrectly met; run ${V.pretty(e.configuration,"yarn explain peer-requirements ",V.Type.CODE)} for details, where ${V.pretty(e.configuration,"",V.Type.CODE)} is the six-letter p-prefixed code`))}({project:this,report:e.report,accessibleLocators:B,volatileDescriptors:I,optionalBuilds:E,peerRequirements:y,allDescriptors:a,allResolutions:g,allPackages:c});for(const e of I)a.delete(e),g.delete(e);this.storedResolutions=g,this.storedDescriptors=a,this.storedPackages=c,this.accessibleLocators=B,this.originalPackages=l,this.optionalBuilds=E,this.peerRequirements=y,this.refreshWorkspaceDependencies()}async fetchEverything({cache:e,report:t,fetcher:r}){const A=r||this.configuration.makeFetcher(),n={checksums:this.storedChecksums,project:this,cache:e,fetcher:A,report:t},o=Array.from(new Set(_.sortMap(this.storedResolutions.values(),[e=>{const t=this.storedPackages.get(e);if(!t)throw new Error("Assertion failed: The locator should have been registered");return O.stringifyLocator(t)}])));let i=!1;const s=H.yG.progressViaCounter(o.length);t.reportProgress(s);const a=v()(32);if(await t.startCacheReport(async()=>{await Promise.all(o.map(e=>a(async()=>{const r=this.storedPackages.get(e);if(!r)throw new Error("Assertion failed: The locator should have been registered");if(O.isVirtualLocator(r))return;let o;try{o=await A.fetch(r,n)}catch(e){return e.message=`${O.prettyLocator(this.configuration,r)}: ${e.message}`,t.reportExceptionOnce(e),void(i=e)}o.checksum?this.storedChecksums.set(r.locatorHash,o.checksum):this.storedChecksums.delete(r.locatorHash),o.releaseFs&&o.releaseFs()}).finally(()=>{s.tick()})))}),i)throw i}async linkEverything({cache:e,report:t,fetcher:r,skipBuild:o}){var s;const c=r||this.configuration.makeFetcher(),g={checksums:this.storedChecksums,project:this,cache:e,fetcher:c,report:t,skipIntegrityCheck:!0},l=this.configuration.getLinkers(),u={project:this,report:t},h=new Map(l.map(e=>{const t=e.makeInstaller(u),r=t.getCustomDataKey(),A=this.installersCustomData.get(r);return void 0!==A&&t.attachCustomData(A),[e,t]})),p=new Map,d=new Map,C=new Map,f=new Map(await Promise.all([...this.accessibleLocators].map(async e=>{const t=this.storedPackages.get(e);if(!t)throw new Error("Assertion failed: The locator should have been registered");return[e,await c.fetch(t,g)]})));for(const e of this.accessibleLocators){const t=this.storedPackages.get(e);if(void 0===t)throw new Error("Assertion failed: The locator should have been registered");const r=f.get(t.locatorHash);if(void 0===r)throw new Error("Assertion failed: The fetch result should have been registered");const A=this.tryWorkspaceByLocator(t);if(null!==A){const e=[],{scripts:o}=A.manifest;for(const t of["preinstall","install","postinstall"])o.has(t)&&e.push([L.k.SCRIPT,t]);try{for(const e of h.values()){if(null!==(await e.installPackage(t,r)).buildDirective)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}}finally{r.releaseFs&&r.releaseFs()}const i=n.y1.join(r.packageFs.getRealPath(),r.prefixPath);d.set(t.locatorHash,i),e.length>0&&C.set(t.locatorHash,{directives:e,buildLocations:[i]})}else{const e=l.find(e=>e.supportsPackage(t,u));if(!e)throw new H.lk(P.b.LINKER_NOT_FOUND,O.prettyLocator(this.configuration,t)+" isn't supported by any available linker");const A=h.get(e);if(!A)throw new Error("Assertion failed: The installer should have been registered");let n;try{n=await A.installPackage(t,r)}finally{r.releaseFs&&r.releaseFs()}p.set(t.locatorHash,e),d.set(t.locatorHash,n.packageLocation),n.buildDirective&&n.packageLocation&&C.set(t.locatorHash,{directives:n.buildDirective,buildLocations:[n.packageLocation]})}}const I=new Map;for(const e of this.accessibleLocators){const t=this.storedPackages.get(e);if(!t)throw new Error("Assertion failed: The locator should have been registered");const r=null!==this.tryWorkspaceByLocator(t),A=async(e,A)=>{const n=d.get(t.locatorHash);if(void 0===n)throw new Error(`Assertion failed: The package (${O.prettyLocator(this.configuration,t)}) should have been registered`);const o=[];for(const A of t.dependencies.values()){const i=this.storedResolutions.get(A.descriptorHash);if(void 0===i)throw new Error(`Assertion failed: The resolution (${O.prettyDescriptor(this.configuration,A)}, from ${O.prettyLocator(this.configuration,t)})should have been registered`);const s=this.storedPackages.get(i);if(void 0===s)throw new Error(`Assertion failed: The package (${i}, resolved from ${O.prettyDescriptor(this.configuration,A)}) should have been registered`);const a=null===this.tryWorkspaceByLocator(s)?p.get(i):null;if(void 0===a)throw new Error(`Assertion failed: The package (${i}, resolved from ${O.prettyDescriptor(this.configuration,A)}) should have been registered`);const c=null===a;if(a===e||r||c)null!==d.get(s.locatorHash)&&o.push([A,s]);else if(null!==n){_.getArrayWithDefault(I,i).push(n)}}null!==n&&await A.attachInternalDependencies(t,o)};if(r)for(const[e,t]of h)await A(e,t);else{const e=p.get(t.locatorHash);if(!e)throw new Error("Assertion failed: The linker should have been found");const r=h.get(e);if(!r)throw new Error("Assertion failed: The installer should have been registered");await A(e,r)}}for(const[e,t]of I){const r=this.storedPackages.get(e);if(!r)throw new Error("Assertion failed: The package should have been registered");const A=p.get(r.locatorHash);if(!A)throw new Error("Assertion failed: The linker should have been found");const n=h.get(A);if(!n)throw new Error("Assertion failed: The installer should have been registered");await n.attachExternalDependents(r,t)}const E=new Map;for(const e of h.values()){const t=await e.finalizeInstall();for(const e of null!==(s=null==t?void 0:t.records)&&void 0!==s?s:[])C.set(e.locatorHash,{directives:e.buildDirective,buildLocations:e.buildLocations});void 0!==(null==t?void 0:t.customData)&&E.set(e.getCustomDataKey(),t.customData)}if(this.installersCustomData=E,await this.persistInstallStateFile(),o)return;const B=new Set(this.storedPackages.keys()),y=new Set(C.keys());for(const e of y)B.delete(e);const m=(0,a.createHash)("sha512");m.update(process.versions.node),this.configuration.triggerHook(e=>e.globalHashGeneration,this,e=>{m.update("\0"),m.update(e)});const w=m.digest("hex"),Q=new Map,D=e=>{let t=Q.get(e.locatorHash);if(void 0!==t)return t;const r=this.storedPackages.get(e.locatorHash);if(void 0===r)throw new Error("Assertion failed: The package should have been registered");const A=(0,a.createHash)("sha512");A.update(e.locatorHash),Q.set(e.locatorHash,"");for(const e of r.dependencies.values()){const t=this.storedResolutions.get(e.descriptorHash);if(void 0===t)throw new Error(`Assertion failed: The resolution (${O.prettyDescriptor(this.configuration,e)}) should have been registered`);const r=this.storedPackages.get(t);if(void 0===r)throw new Error("Assertion failed: The package should have been registered");A.update(D(r))}return t=A.digest("hex"),Q.set(e.locatorHash,t),t},b=(e,t)=>{const r=(0,a.createHash)("sha512");r.update(w),r.update(D(e));for(const e of t)r.update(e);return r.digest("hex")},v=this.configuration.get("bstatePath"),S=A.xfs.existsSync(v)?(0,i.parseSyml)(await A.xfs.readFilePromise(v,"utf8")):{},k=new Map;for(;y.size>0;){const e=y.size,r=[];for(const e of y){const o=this.storedPackages.get(e);if(!o)throw new Error("Assertion failed: The package should have been registered");let i=!0;for(const e of o.dependencies.values()){const t=this.storedResolutions.get(e.descriptorHash);if(!t)throw new Error(`Assertion failed: The resolution (${O.prettyDescriptor(this.configuration,e)}) should have been registered`);if(y.has(t)){i=!1;break}}if(!i)continue;y.delete(e);const s=C.get(o.locatorHash);if(!s)throw new Error("Assertion failed: The build directive should have been registered");const a=b(o,s.buildLocations);if(Object.prototype.hasOwnProperty.call(S,o.locatorHash)&&S[o.locatorHash]===a)k.set(o.locatorHash,a);else{Object.prototype.hasOwnProperty.call(S,o.locatorHash)?t.reportInfo(P.b.MUST_REBUILD,O.prettyLocator(this.configuration,o)+" must be rebuilt because its dependency tree changed"):t.reportInfo(P.b.MUST_BUILD,O.prettyLocator(this.configuration,o)+" must be built because it never did before or the last one failed");for(const e of s.buildLocations){if(!n.y1.isAbsolute(e))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${e})`);r.push((async()=>{for(const[r,i]of s.directives){let s=`# This file contains the result of Yarn building a package (${O.stringifyLocator(o)})\n`;switch(r){case L.k.SCRIPT:s+=`# Script name: ${i}\n`;break;case L.k.SHELLCODE:s+=`# Script code: ${i}\n`}const c=null;await A.xfs.mktempPromise(async g=>{const l=n.y1.join(g,"build.log"),{stdout:u,stderr:h}=this.configuration.getSubprocessStreams(l,{header:s,prefix:O.prettyLocator(this.configuration,o),report:t});let p;try{switch(r){case L.k.SCRIPT:p=await Z.executePackageScript(o,i,[],{cwd:e,project:this,stdin:c,stdout:u,stderr:h});break;case L.k.SHELLCODE:p=await Z.executePackageShellcode(o,i,[],{cwd:e,project:this,stdin:c,stdout:u,stderr:h})}}catch(e){h.write(e.stack),p=1}if(u.end(),h.end(),0===p)return k.set(o.locatorHash,a),!0;A.xfs.detachTemp(g);const d=`${O.prettyLocator(this.configuration,o)} couldn't be built successfully (exit code ${V.pretty(this.configuration,p,V.Type.NUMBER)}, logs can be found here: ${V.pretty(this.configuration,l,V.Type.PATH)})`;return t.reportInfo(P.b.BUILD_FAILED,d),this.optionalBuilds.has(o.locatorHash)?(k.set(o.locatorHash,a),!0):(t.reportError(P.b.BUILD_FAILED,d),!1)})}})())}}}if(await Promise.all(r),e===y.size){const e=Array.from(y).map(e=>{const t=this.storedPackages.get(e);if(!t)throw new Error("Assertion failed: The package should have been registered");return O.prettyLocator(this.configuration,t)}).join(", ");t.reportError(P.b.CYCLIC_DEPENDENCIES,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${e})`);break}}if(k.size>0){const e=this.configuration.get("bstatePath"),t=ie.generateBuildStateFile(k,this.storedPackages);await A.xfs.mkdirPromise(n.y1.dirname(e),{recursive:!0}),await A.xfs.changeFilePromise(e,t,{automaticNewlines:!0})}else await A.xfs.removePromise(v)}async install(e){var t,r;const i=this.configuration.get("nodeLinker");null===(t=x.VK.telemetry)||void 0===t||t.reportInstall(i),await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{await this.configuration.triggerHook(e=>e.validateProject,this,{reportWarning:e.report.reportWarning.bind(e.report),reportError:e.report.reportError.bind(e.report)})});for(const e of this.configuration.packageExtensions.values())for(const[,t]of e)for(const e of t)e.status=ee._u.Inactive;const s=n.y1.join(this.cwd,this.configuration.get("lockfileFilename"));let a=null;if(e.immutable)try{a=await A.xfs.readFilePromise(s,"utf8")}catch(e){throw"ENOENT"===e.code?new H.lk(P.b.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been created by this install, which is explicitly forbidden."):e}await e.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{for(const[,t]of this.configuration.packageExtensions)for(const[,r]of t)for(const t of r)if(t.userProvided){const r=V.pretty(this.configuration,t,V.Type.PACKAGE_EXTENSION);switch(t.status){case ee._u.Inactive:e.report.reportWarning(P.b.UNUSED_PACKAGE_EXTENSION,r+": No matching package in the dependency tree; you may not need this rule anymore.");break;case ee._u.Redundant:e.report.reportWarning(P.b.REDUNDANT_PACKAGE_EXTENSION,r+": This rule seems redundant when applied on the original package; the extension may have been applied upstream.")}}if(null!==a){const t=(0,o.qH)(a,this.generateLockfile());if(t!==a){const r=w(s,s,a,t);e.report.reportSeparator();for(const t of r.hunks){e.report.reportInfo(null,`@@ -${t.oldStart},${t.oldLines} +${t.newStart},${t.newLines} @@`);for(const r of t.lines)r.startsWith("+")?e.report.reportError(P.b.FROZEN_LOCKFILE_EXCEPTION,V.pretty(this.configuration,r,V.Type.ADDED)):r.startsWith("-")?e.report.reportError(P.b.FROZEN_LOCKFILE_EXCEPTION,V.pretty(this.configuration,r,V.Type.REMOVED)):e.report.reportInfo(null,V.pretty(this.configuration,r,"grey"))}throw e.report.reportSeparator(),new H.lk(P.b.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(const e of this.configuration.packageExtensions.values())for(const[,t]of e)for(const e of t)e.userProvided&&e.status===ee._u.Active&&(null===(r=x.VK.telemetry)||void 0===r||r.reportPackageExtension(V.json(e,V.Type.PACKAGE_EXTENSION)));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e),(void 0===e.persistProject||e.persistProject)&&await this.cacheCleanup(e)}),(void 0===e.persistProject||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{const t=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],r=await Promise.all(t.map(async e=>X.checksumPattern(e,{cwd:this.cwd})));await this.linkEverything(e);const A=await Promise.all(t.map(async e=>X.checksumPattern(e,{cwd:this.cwd})));for(let n=0;ne.afterAllInstalled,this,e)}generateLockfile(){const e=new Map;for(const[t,r]of this.storedResolutions.entries()){let A=e.get(r);A||e.set(r,A=new Set),A.add(t)}const t={__metadata:{version:4}};for(const[r,A]of e.entries()){const e=this.originalPackages.get(r);if(!e)continue;const n=[];for(const e of A){const t=this.storedDescriptors.get(e);if(!t)throw new Error("Assertion failed: The descriptor should have been registered");n.push(t)}const o=n.map(e=>O.stringifyDescriptor(e)).sort().join(", "),i=new Y.G;let s;i.version=e.linkType===ee.Un.HARD?e.version:"0.0.0-use.local",i.languageName=e.languageName,i.dependencies=new Map(e.dependencies),i.peerDependencies=new Map(e.peerDependencies),i.dependenciesMeta=new Map(e.dependenciesMeta),i.peerDependenciesMeta=new Map(e.peerDependenciesMeta),i.bin=new Map(e.bin);const a=this.storedChecksums.get(e.locatorHash);if(void 0!==a){const e=a.indexOf("/");if(-1===e)throw new Error("Assertion failed: Expecte the checksum to reference its cache key");const r=a.slice(0,e),A=a.slice(e+1);void 0===t.__metadata.cacheKey&&(t.__metadata.cacheKey=r),s=r===t.__metadata.cacheKey?A:a}t[o]={...i.exportTo({},{compatibilityMode:!1}),linkType:e.linkType.toLowerCase(),resolution:O.stringifyLocator(e),checksum:s}}return['# This file is generated by running "yarn install" inside your project.\n',"# Manual changes might be lost - proceed with caution!\n"].join("")+"\n"+(0,i.stringifySyml)(t)}async persistLockfile(){const e=n.y1.join(this.cwd,this.configuration.get("lockfileFilename")),t=this.generateLockfile();await A.xfs.changeFilePromise(e,t,{automaticNewlines:!0})}async persistInstallStateFile(){const e=[];for(const t of Object.values(oe))e.push(...t);const t=D()(this,e),r=await Ae(K().serialize(t)),o=this.configuration.get("installStatePath");await A.xfs.mkdirPromise(n.y1.dirname(o),{recursive:!0}),await A.xfs.changeFilePromise(o,r)}async restoreInstallState({restoreInstallersCustomData:e=!0,restoreResolutions:t=!0}={}){const r=this.configuration.get("installStatePath");if(!A.xfs.existsSync(r))return void(t&&await this.applyLightResolution());const n=await A.xfs.readFilePromise(r),o=K().deserialize(await ne(n));e&&void 0!==o.installersCustomData&&(this.installersCustomData=o.installersCustomData),t&&(o.lockFileChecksum===this.lockFileChecksum?(Object.assign(this,D()(o,oe.restoreResolutions)),this.refreshWorkspaceDependencies()):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new q.$}),await this.persistInstallStateFile()}async persist(){await this.persistLockfile();for(const e of this.workspacesByCwd.values())await e.persistManifest()}async cacheCleanup({cache:e,report:t}){const r=new Set([".gitignore"]);if(A.xfs.existsSync(e.cwd)&&(0,W.isFolderInside)(e.cwd,this.cwd)){for(const o of await A.xfs.readdirPromise(e.cwd)){if(r.has(o))continue;const i=n.y1.resolve(e.cwd,o);e.markedFiles.has(i)||(e.immutable?t.reportError(P.b.IMMUTABLE_CACHE,V.pretty(this.configuration,n.y1.basename(i),"magenta")+" appears to be unused and would marked for deletion, but the cache is immutable"):(t.reportInfo(P.b.UNUSED_CACHE_ENTRY,V.pretty(this.configuration,n.y1.basename(i),"magenta")+" appears to be unused - removing"),await A.xfs.removePromise(i)))}e.markedFiles.clear()}}}},52779:(e,t,r)=>{"use strict";r.d(t,{c:()=>s,O:()=>a});var A=r(53887),n=r.n(A),o=r(36545),i=r(54143);const s=/^(?!v)[a-z0-9-.]+$/i;class a{supportsDescriptor(e,t){return!!o.validRange(e.range)||!!s.test(e.range)}supportsLocator(e,t){return!!n().valid(e.reference)||!!s.test(e.reference)}shouldPersistResolution(e,t){return t.resolver.shouldPersistResolution(this.forwardLocator(e,t),t)}bindDescriptor(e,t,r){return r.resolver.bindDescriptor(this.forwardDescriptor(e,r),t,r)}getResolutionDependencies(e,t){return t.resolver.getResolutionDependencies(this.forwardDescriptor(e,t),t)}async getCandidates(e,t,r){return await r.resolver.getCandidates(this.forwardDescriptor(e,r),t,r)}async getSatisfying(e,t,r){return await r.resolver.getSatisfying(this.forwardDescriptor(e,r),t,r)}async resolve(e,t){const r=await t.resolver.resolve(this.forwardLocator(e,t),t);return i.renamePackage(r,e)}forwardDescriptor(e,t){return i.makeDescriptor(e,`${t.project.configuration.get("defaultProtocol")}${e.range}`)}forwardLocator(e,t){return i.makeLocator(e,`${t.project.configuration.get("defaultProtocol")}${e.reference}`)}}},35691:(e,t,r)=>{"use strict";r.d(t,{lk:()=>i,yG:()=>s});var A=r(92413),n=r(24304),o=r(92659);class i extends Error{constructor(e,t,r){super(t),this.reportExtra=r,this.reportCode=e}}class s{constructor(){this.reportedInfos=new Set,this.reportedWarnings=new Set,this.reportedErrors=new Set}static progressViaCounter(e){let t,r=0,A=new Promise(e=>{t=e});const n=e=>{const n=t;A=new Promise(e=>{t=e}),r=e,n()},o=async function*(){for(;ro,set:n,tick:(e=0)=>{n(r+1)}}}reportInfoOnce(e,t,r){const A=r&&r.key?r.key:t;this.reportedInfos.has(A)||(this.reportedInfos.add(A),this.reportInfo(e,t))}reportWarningOnce(e,t,r){const A=r&&r.key?r.key:t;this.reportedWarnings.has(A)||(this.reportedWarnings.add(A),this.reportWarning(e,t))}reportErrorOnce(e,t,r){var A;const n=r&&r.key?r.key:t;this.reportedErrors.has(n)||(this.reportedErrors.add(n),this.reportError(e,t),null===(A=null==r?void 0:r.reportExtra)||void 0===A||A.call(r,this))}reportExceptionOnce(e){!function(e){return void 0!==e.reportCode}(e)?this.reportErrorOnce(o.b.EXCEPTION,e.stack||e.message,{key:e}):this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra})}createStreamReporter(e=null){const t=new A.PassThrough,r=new n.StringDecoder;let o="";return t.on("data",t=>{let A,n=r.write(t);do{if(A=n.indexOf("\n"),-1!==A){const t=o+n.substr(0,A);n=n.substr(A+1),o="",null!==e?this.reportInfo(null,`${e} ${t}`):this.reportInfo(null,t)}}while(-1!==A);o+=n}),t.on("end",()=>{const t=r.end();""!==t&&(null!==e?this.reportInfo(null,`${e} ${t}`):this.reportInfo(null,t))}),t}}},15815:(e,t,r)=>{"use strict";r.d(t,{Qw:()=>C,Pk:()=>f});var A=r(29148),n=r.n(A),o=r(92659),i=r(35691),s=r(71643);const a=["â ‹","â ™","â ¹","â ¸","â ¼","â ´","â ¦","â §","â ‡","â "],c=new Set([o.b.FETCH_NOT_CACHED,o.b.UNUSED_CACHE_ENTRY]),g=process.env.GITHUB_ACTIONS?{start:e=>`::group::${e}\n`,end:e=>"::endgroup::\n"}:process.env.TRAVIS?{start:e=>`travis_fold:start:${e}\n`,end:e=>`travis_fold:end:${e}\n`}:process.env.GITLAB_CI?{start:e=>`section_start:${Math.floor(Date.now()/1e3)}:${e.toLowerCase().replace(/\W+/g,"_")}\r${e}\n`,end:e=>`section_end:${Math.floor(Date.now()/1e3)}:${e.toLowerCase().replace(/\W+/g,"_")}\r`}:null,l=new Date,u=["iTerm.app","Apple_Terminal"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,h={patrick:{date:[17,3],chars:["ðŸ€","🌱"],size:40},simba:{date:[19,7],chars:["ðŸ¦","🌴"],size:40},jack:{date:[31,10],chars:["🎃","🦇"],size:40},hogsfather:{date:[31,12],chars:["🎉","🎄"],size:40},default:{chars:["=","-"],size:80}},p=u&&Object.keys(h).find(e=>{const t=h[e];return!t.date||t.date[0]===l.getDate()&&t.date[1]===l.getMonth()+1})||"default";function d(e,{configuration:t,json:r}){const A=null===e?0:e,n=(0,o.i)(A);return r||null!==e?n:s.pretty(t,n,"grey")}function C(e,{configuration:t,json:r}){const A=d(e,{configuration:t,json:r});if(!t.get("enableHyperlinks"))return A;if(null===e||e===o.b.UNNAMED)return A;return`]8;;${`https://yarnpkg.com/advanced/error-codes#${A}---${o.b[e]}`.toLowerCase()}${A}]8;;`}class f extends i.yG{constructor({configuration:e,stdout:t,json:r=!1,includeFooter:A=!0,includeLogs:n=!r,includeInfos:o=n,includeWarnings:i=n,forgettableBufferSize:a=5,forgettableNames:g=new Set}){super(),this.uncommitted=new Set,this.cacheHitCount=0,this.cacheMissCount=0,this.warningCount=0,this.errorCount=0,this.startTime=Date.now(),this.indent=0,this.progress=new Map,this.progressTime=0,this.progressFrame=0,this.progressTimeout=null,this.forgettableLines=[],s.addLogFilterSupport(this,{configuration:e}),this.configuration=e,this.forgettableBufferSize=a,this.forgettableNames=new Set([...g,...c]),this.includeFooter=A,this.includeInfos=o,this.includeWarnings=i,this.json=r,this.stdout=t;const l=this.configuration.get("progressBarStyle")||p;if(!Object.prototype.hasOwnProperty.call(h,l))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=h[l];const u="➤ YN0000: ┌ ".length,d=Math.max(0,Math.min(process.stdout.columns-u,80));this.progressMaxScaledSize=Math.floor(this.progressStyle.size*d/80)}static async start(e,t){const r=new this(e),A=process.emitWarning;process.emitWarning=(e,t)=>{if("string"!=typeof e){const r=e;e=r.message,t=null!=t?t:r.name}const A=void 0!==t?`${t}: ${e}`:e;r.reportWarning(o.b.UNNAMED,A)};try{await t(r)}catch(e){r.reportExceptionOnce(e)}finally{await r.finalize(),process.emitWarning=A}return r}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){this.cacheHitCount+=1}reportCacheMiss(e,t){this.cacheMissCount+=1,void 0===t||this.configuration.get("preferAggregateCacheInfo")||this.reportInfo(o.b.FETCH_NOT_CACHED,t)}startTimerSync(e,t,r){const A="function"==typeof t?t:r,n={committed:!1,action:()=>{this.reportInfo(null,"┌ "+e),this.indent+=1,null!==g&&this.stdout.write(g.start(e))}};("function"==typeof t?{}:t).skipIfEmpty?this.uncommitted.add(n):(n.action(),n.committed=!0);const o=Date.now();try{return A()}catch(e){throw this.reportExceptionOnce(e),e}finally{const t=Date.now();this.uncommitted.delete(n),n.committed&&(this.indent-=1,null!==g&&this.stdout.write(g.end(e)),this.configuration.get("enableTimers")&&t-o>200?this.reportInfo(null,"â”” Completed in "+s.pretty(this.configuration,t-o,s.Type.DURATION)):this.reportInfo(null,"â”” Completed"))}}async startTimerPromise(e,t,r){const A="function"==typeof t?t:r,n={committed:!1,action:()=>{this.reportInfo(null,"┌ "+e),this.indent+=1,null!==g&&this.stdout.write(g.start(e))}};("function"==typeof t?{}:t).skipIfEmpty?this.uncommitted.add(n):(n.action(),n.committed=!0);const o=Date.now();try{return await A()}catch(e){throw this.reportExceptionOnce(e),e}finally{const t=Date.now();this.uncommitted.delete(n),n.committed&&(this.indent-=1,null!==g&&this.stdout.write(g.end(e)),this.configuration.get("enableTimers")&&t-o>200?this.reportInfo(null,"â”” Completed in "+s.pretty(this.configuration,t-o,s.Type.DURATION)):this.reportInfo(null,"â”” Completed"))}}async startCacheReport(e){const t=this.configuration.get("preferAggregateCacheInfo")?{cacheHitCount:this.cacheHitCount,cacheMissCount:this.cacheMissCount}:null;try{return await e()}catch(e){throw this.reportExceptionOnce(e),e}finally{null!==t&&this.reportCacheChanges(t)}}reportSeparator(){0===this.indent?this.writeLineWithForgettableReset(""):this.reportInfo(null,"")}reportInfo(e,t){if(!this.includeInfos)return;this.commit();const r=`${s.pretty(this.configuration,"➤","blueBright")} ${this.formatNameWithHyperlink(e)}: ${this.formatIndent()}${t}`;if(this.json)this.reportJson({type:"info",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t});else if(this.forgettableNames.has(e))if(this.forgettableLines.push(r),this.forgettableLines.length>this.forgettableBufferSize){for(;this.forgettableLines.length>this.forgettableBufferSize;)this.forgettableLines.shift();this.writeLines(this.forgettableLines,{truncate:!0})}else this.writeLine(r,{truncate:!0});else this.writeLineWithForgettableReset(r)}reportWarning(e,t){this.warningCount+=1,this.includeWarnings&&(this.commit(),this.json?this.reportJson({type:"warning",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t}):this.writeLineWithForgettableReset(`${s.pretty(this.configuration,"➤","yellowBright")} ${this.formatNameWithHyperlink(e)}: ${this.formatIndent()}${t}`))}reportError(e,t){this.errorCount+=1,this.commit(),this.json?this.reportJson({type:"error",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t}):this.writeLineWithForgettableReset(`${s.pretty(this.configuration,"➤","redBright")} ${this.formatNameWithHyperlink(e)}: ${this.formatIndent()}${t}`,{truncate:!1})}reportProgress(e){let t=!1;const r=Promise.resolve().then(async()=>{const r={progress:0,title:void 0};this.progress.set(e,{definition:r,lastScaledSize:-1}),this.refreshProgress(-1);for await(const{progress:A,title:n}of e)t||r.progress===A&&r.title===n||(r.progress=A,r.title=n,this.refreshProgress());A()}),A=()=>{t||(t=!0,this.progress.delete(e),this.refreshProgress(1))};return{...r,stop:A}}reportJson(e){this.json&&this.writeLineWithForgettableReset(""+JSON.stringify(e))}async finalize(){if(!this.includeFooter)return;let e="";e=this.errorCount>0?"Failed with errors":this.warningCount>0?"Done with warnings":"Done";const t=s.pretty(this.configuration,Date.now()-this.startTime,s.Type.DURATION),r=this.configuration.get("enableTimers")?`${e} in ${t}`:e;this.errorCount>0?this.reportError(o.b.UNNAMED,r):this.warningCount>0?this.reportWarning(o.b.UNNAMED,r):this.reportInfo(o.b.UNNAMED,r)}writeLine(e,{truncate:t}={}){this.clearProgress({clear:!0}),this.stdout.write(this.truncate(e,{truncate:t})+"\n"),this.writeProgress()}writeLineWithForgettableReset(e,{truncate:t}={}){this.forgettableLines=[],this.writeLine(e,{truncate:t})}writeLines(e,{truncate:t}={}){this.clearProgress({delta:e.length});for(const r of e)this.stdout.write(this.truncate(r,{truncate:t})+"\n");this.writeProgress()}reportCacheChanges({cacheHitCount:e,cacheMissCount:t}){const r=this.cacheHitCount-e,A=this.cacheMissCount-t;if(0===r&&0===A)return;let n="";this.cacheHitCount>1?n+=this.cacheHitCount+" packages were already cached":1===this.cacheHitCount?n+=" - one package was already cached":n+="No packages were cached",this.cacheHitCount>0?this.cacheMissCount>1?n+=`, ${this.cacheMissCount} had to be fetched`:1===this.cacheMissCount&&(n+=", one had to be fetched"):this.cacheMissCount>1?n+=` - ${this.cacheMissCount} packages had to be fetched`:1===this.cacheMissCount&&(n+=" - one package had to be fetched"),this.reportInfo(o.b.FETCH_NOT_CACHED,n)}commit(){const e=this.uncommitted;this.uncommitted=new Set;for(const t of e)t.committed=!0,t.action()}clearProgress({delta:e=0,clear:t=!1}){this.configuration.get("enableProgressBars")&&!this.json&&this.progress.size+e>0&&(this.stdout.write(`[${this.progress.size+e}A`),(e>0||t)&&this.stdout.write(""))}writeProgress(){if(!this.configuration.get("enableProgressBars")||this.json)return;if(null!==this.progressTimeout&&clearTimeout(this.progressTimeout),this.progressTimeout=null,0===this.progress.size)return;const e=Date.now();e-this.progressTime>80&&(this.progressFrame=(this.progressFrame+1)%a.length,this.progressTime=e);const t=a[this.progressFrame];for(const e of this.progress.values()){const r=this.progressStyle.chars[0].repeat(e.lastScaledSize),A=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-e.lastScaledSize);this.stdout.write(`${s.pretty(this.configuration,"➤","blueBright")} ${this.formatName(null)}: ${t} ${r}${A}\n`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress()},80)}refreshProgress(e=0){let t=!1;if(0===this.progress.size)t=!0;else for(const e of this.progress.values()){const r=Math.trunc(this.progressMaxScaledSize*e.definition.progress),A=e.lastScaledSize;if(e.lastScaledSize=r,r!==A){t=!0;break}}t&&(this.clearProgress({delta:e}),this.writeProgress())}truncate(e,{truncate:t}={}){return this.configuration.get("enableProgressBars")||(t=!1),void 0===t&&(t=this.configuration.get("preferTruncatedLines")),t&&(e=n()(e,0,process.stdout.columns-1)),e}formatName(e){return d(e,{configuration:this.configuration,json:this.json})}formatNameWithHyperlink(e){return C(e,{configuration:this.configuration,json:this.json})}formatIndent(){return"│ ".repeat(this.indent)}}},81832:(e,t,r)=>{"use strict";r.d(t,{E:()=>a});var A,n=r(43896),o=r(46009),i=r(79669),s=r(73632);!function(e){e.VERSION="version",e.COMMAND_NAME="commandName",e.PLUGIN_NAME="pluginName",e.INSTALL_COUNT="installCount",e.PROJECT_COUNT="projectCount",e.WORKSPACE_COUNT="workspaceCount",e.DEPENDENCY_COUNT="dependencyCount",e.EXTENSION="packageExtension"}(A||(A={}));class a{constructor(e,t){this.values=new Map,this.hits=new Map,this.enumerators=new Map,this.configuration=e;const r=this.getRegistryPath();this.isNew=!n.xfs.existsSync(r),this.sendReport(t),this.startBuffer()}reportVersion(e){this.reportValue(A.VERSION,e)}reportCommandName(e){this.reportValue(A.COMMAND_NAME,e||"")}reportPluginName(e){this.reportValue(A.PLUGIN_NAME,e)}reportProject(e){this.reportEnumerator(A.PROJECT_COUNT,e)}reportInstall(e){this.reportHit(A.INSTALL_COUNT,e)}reportPackageExtension(e){this.reportValue(A.EXTENSION,e)}reportWorkspaceCount(e){this.reportValue(A.WORKSPACE_COUNT,String(e))}reportDependencyCount(e){this.reportValue(A.DEPENDENCY_COUNT,String(e))}reportValue(e,t){s.getSetWithDefault(this.values,e).add(t)}reportEnumerator(e,t){s.getSetWithDefault(this.enumerators,e).add(t)}reportHit(e,t="*"){const r=s.getMapWithDefault(this.hits,e),A=s.getFactoryWithDefault(r,t,()=>0);r.set(t,A+1)}getRegistryPath(){const e=this.configuration.get("globalFolder");return o.y1.join(e,"telemetry.json")}sendReport(e){var t,r,A;const s=this.getRegistryPath();let a;try{a=n.xfs.readJsonSync(s)}catch(e){a={}}const c=Date.now(),g=24*this.configuration.get("telemetryInterval")*60*60*1e3,l=(null!==(t=a.lastUpdate)&&void 0!==t?t:c+g+Math.floor(g*Math.random()))+g;if(!(l>c&&null!=a.lastUpdate)){try{n.xfs.mkdirSync(o.y1.dirname(s),{recursive:!0}),n.xfs.writeJsonSync(s,{lastUpdate:c})}catch(e){return}if(!(l>c)&&a.blocks)for(const[t,n]of Object.entries(null!==(r=a.blocks)&&void 0!==r?r:{})){if(0===Object.keys(n).length)continue;const r=n;r.userId=t;for(const e of Object.keys(null!==(A=r.enumerators)&&void 0!==A?A:{}))r.enumerators[e]=r.enumerators[e].length;const o=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`;i.post(o,r,{configuration:this.configuration}).catch(()=>{})}}}applyChanges(){var e,t,r,A,i,s,a,c,g;const l=this.getRegistryPath();let u;try{u=n.xfs.readJsonSync(l)}catch(e){u={}}const h=null!==(e=this.configuration.get("telemetryUserId"))&&void 0!==e?e:"*",p=u.blocks=null!==(t=u.blocks)&&void 0!==t?t:{},d=p[h]=null!==(r=p[h])&&void 0!==r?r:{};for(const e of this.hits.keys()){const t=d.hits=null!==(A=d.hits)&&void 0!==A?A:{},r=t[e]=null!==(i=t[e])&&void 0!==i?i:{};for(const[t,A]of this.hits.get(e))r[t]=(null!==(s=r[t])&&void 0!==s?s:0)+A}for(const e of["values","enumerators"])for(const t of this[e].keys()){const r=d[e]=null!==(a=d[e])&&void 0!==a?a:{};r[t]=[...new Set([...null!==(c=r[t])&&void 0!==c?c:[],...null!==(g=this[e].get(t))&&void 0!==g?g:[]])]}n.xfs.mkdirSync(o.y1.dirname(l),{recursive:!0}),n.xfs.writeJsonSync(l,u)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch(e){}})}}},33720:(e,t,r)=>{"use strict";r.d(t,{$:()=>n});var A=r(35691);class n extends A.yG{reportCacheHit(e){}reportCacheMiss(e){}startTimerSync(e,t,r){return("function"==typeof t?t:r)()}async startTimerPromise(e,t,r){const A="function"==typeof t?t:r;return await A()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,t){}reportWarning(e,t){}reportError(e,t){}reportProgress(e){return{...Promise.resolve().then(async()=>{for await(const{}of e);}),stop:()=>{}}}reportJson(e){}async finalize(){}}},60895:(e,t,r)=>{"use strict";r.d(t,{N:()=>s});var A=r(17674),n=r(14626),o=r(46009),i=r(54143);class s{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,t){const r=e.reference.indexOf("#");if(-1===r)throw new Error("Invalid virtual package reference");const A=e.reference.slice(r+1),n=i.makeLocator(e,A);return t.fetcher.getLocalPath(n,t)}async fetch(e,t){const r=e.reference.indexOf("#");if(-1===r)throw new Error("Invalid virtual package reference");const A=e.reference.slice(r+1),n=i.makeLocator(e,A),o=await t.fetcher.fetch(n,t);return await this.ensureVirtualLink(e,o,t)}getLocatorFilename(e){return i.slugifyLocator(e)}async ensureVirtualLink(e,t,r){const i=t.packageFs.getRealPath(),s=r.project.configuration.get("virtualFolder"),a=this.getLocatorFilename(e),c=A.p.makeVirtualPath(s,a,i),g=new n.K(c,{baseFs:t.packageFs,pathUtils:o.y1});return{...t,packageFs:g}}}},17722:(e,t,r)=>{"use strict";r.d(t,{j:()=>h});var A=r(43896),n=r(46009),o=r(58592),i=r.n(o),s=r(53887),a=r.n(s),c=r(46611),g=r(94538),l=r(20624),u=r(54143);class h{constructor(e,{project:t}){this.workspacesCwds=new Set,this.dependencies=new Map,this.project=t,this.cwd=e}async setup(){this.manifest=A.xfs.existsSync(n.y1.join(this.cwd,c.G.fileName))?await c.G.find(this.cwd):new c.G,this.relativeCwd=n.y1.relative(this.project.cwd,this.cwd)||n.LZ.dot;const e=this.manifest.name?this.manifest.name:u.makeIdent(null,`${this.computeCandidateName()}-${l.makeHash(this.relativeCwd).substr(0,6)}`),t=this.manifest.version?this.manifest.version:"0.0.0";this.locator=u.makeLocator(e,t),this.anchoredDescriptor=u.makeDescriptor(this.locator,`${g.d.protocol}${this.relativeCwd}`),this.anchoredLocator=u.makeLocator(this.locator,`${g.d.protocol}${this.relativeCwd}`);const r=this.manifest.workspaceDefinitions.map(({pattern:e})=>e),o=await i()(r,{absolute:!0,cwd:n.cS.fromPortablePath(this.cwd),expandDirectories:!1,onlyDirectories:!0,onlyFiles:!1,ignore:["**/node_modules","**/.git","**/.yarn"]});o.sort();for(const e of o){const t=n.y1.resolve(this.cwd,n.cS.toPortablePath(e));A.xfs.existsSync(n.y1.join(t,"package.json"))&&this.workspacesCwds.add(t)}}accepts(e){const t=e.indexOf(":"),r=-1!==t?e.slice(0,t+1):null,A=-1!==t?e.slice(t+1):e;return r===g.d.protocol&&n.y1.normalize(A)===this.relativeCwd||(r===g.d.protocol&&"*"===A||!!a().validRange(A)&&(r===g.d.protocol?a().satisfies(null!==this.manifest.version?this.manifest.version:"0.0.0",A):!!this.project.configuration.get("enableTransparentWorkspaces")&&(null!==this.manifest.version&&a().satisfies(this.manifest.version,A))))}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":""+n.y1.basename(this.cwd)||"unnamed-workspace"}async persistManifest(){const e={};this.manifest.exportTo(e);const t=n.y1.join(this.cwd,c.G.fileName),r=JSON.stringify(e,null,this.manifest.indent)+"\n";await A.xfs.changeFilePromise(t,r,{automaticNewlines:!0})}}},94538:(e,t,r)=>{"use strict";r.d(t,{d:()=>n});var A=r(32485);class n{supportsDescriptor(e,t){if(e.range.startsWith(n.protocol))return!0;return null!==t.project.tryWorkspaceByDescriptor(e)}supportsLocator(e,t){return!!e.reference.startsWith(n.protocol)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){return[r.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,t,r){return null}async resolve(e,t){const r=t.project.getWorkspaceByCwd(e.reference.slice(n.protocol.length));return{...e,version:r.manifest.version||"0.0.0",languageName:"unknown",linkType:A.Un.SOFT,dependencies:new Map([...r.manifest.dependencies,...r.manifest.devDependencies]),peerDependencies:new Map([...r.manifest.peerDependencies]),dependenciesMeta:r.manifest.dependenciesMeta,peerDependenciesMeta:r.manifest.peerDependenciesMeta,bin:r.manifest.bin}}}n.protocol="workspace:"},59355:(e,t,r)=>{"use strict";r.d(t,{o:()=>A});const A="2.4.1"},6220:(e,t,r)=>{"use strict";r.r(t),r.d(t,{EndStrategy:()=>A,pipevp:()=>g,execvp:()=>l});var A,n=r(46009),o=r(67566),i=r.n(o);function s(e){return null!==e&&"number"==typeof e.fd}function a(){}!function(e){e[e.Never=0]="Never",e[e.ErrorCode=1]="ErrorCode",e[e.Always=2]="Always"}(A||(A={}));let c=0;async function g(e,t,{cwd:r,env:o=process.env,strict:g=!1,stdin:l=null,stdout:u,stderr:p,end:d=A.Always}){const C=["pipe","pipe","pipe"];null===l?C[0]="ignore":s(l)&&(C[0]=l),s(u)&&(C[1]=u),s(p)&&(C[2]=p),0==c++&&process.on("SIGINT",a);const f=i()(e,t,{cwd:n.cS.fromPortablePath(r),env:{...o,PWD:n.cS.fromPortablePath(r)},stdio:C});s(l)||null===l||l.pipe(f.stdin),s(u)||f.stdout.pipe(u,{end:!1}),s(p)||f.stderr.pipe(p,{end:!1});const I=()=>{for(const e of new Set([u,p]))s(e)||e.end()};return new Promise((t,r)=>{f.on("error",e=>{0==--c&&process.off("SIGINT",a),d!==A.Always&&d!==A.ErrorCode||I(),r(e)}),f.on("close",(n,o)=>{0==--c&&process.off("SIGINT",a),(d===A.Always||d===A.ErrorCode&&n>0)&&I(),0!==n&&g?r(null!==n?new Error(`Child "${e}" exited with exit code ${n}`):new Error(`Child "${e}" exited with signal ${o}`)):t({code:h(n,o)})})})}async function l(e,t,{cwd:r,env:A=process.env,encoding:o="utf8",strict:s=!1}){const a=["ignore","pipe","pipe"],c=[],g=[],l=n.cS.fromPortablePath(r);void 0!==A.PWD&&(A={...A,PWD:l});const u=i()(e,t,{cwd:l,env:A,stdio:a});return u.stdout.on("data",e=>{c.push(e)}),u.stderr.on("data",e=>{g.push(e)}),await new Promise((t,r)=>{u.on("error",r),u.on("close",(A,n)=>{const i="buffer"===o?Buffer.concat(c):Buffer.concat(c).toString(o),a="buffer"===o?Buffer.concat(g):Buffer.concat(g).toString(o);0!==A&&s?r(Object.assign(new Error(`Child "${e}" exited with exit code ${A}\n\n${a}`),{code:h(A,n),stdout:i,stderr:a})):t({code:h(A,n),stdout:i,stderr:a})})})}const u=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]]);function h(e,t){const r=u.get(t);return void 0!==r?128+r:null!=e?e:1}},81111:(e,t,r)=>{"use strict";r.r(t),r.d(t,{getDefaultGlobalFolder:()=>o,getHomeFolder:()=>i,isFolderInside:()=>s});var A=r(46009),n=r(12087);function o(){if("win32"===process.platform){const e=A.cS.toPortablePath(process.env.LOCALAPPDATA||A.cS.join((0,n.homedir)(),"AppData","Local"));return A.y1.resolve(e,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){const e=A.cS.toPortablePath(process.env.XDG_DATA_HOME);return A.y1.resolve(e,"yarn/berry")}return A.y1.resolve(i(),".yarn/berry")}function i(){return A.cS.toPortablePath((0,n.homedir)()||"/usr/local/share")}function s(e,t){const r=A.y1.relative(t,e);return r&&!r.startsWith("..")&&!A.y1.isAbsolute(r)}},71643:(e,t,r)=>{"use strict";r.r(t),r.d(t,{Type:()=>A,Style:()=>n,supportsColor:()=>h,supportsHyperlinks:()=>p,tuple:()=>I,applyStyle:()=>E,applyColor:()=>B,pretty:()=>y,prettyList:()=>m,json:()=>w,mark:()=>Q,LogLevel:()=>D,addLogFilterSupport:()=>b});var A,n,o=r(46009),i=r(95882),s=r.n(i),a=r(92659),c=r(73632),g=r(54143),l=r(32485);!function(e){e.NO_HINT="NO_HINT",e.NULL="NULL",e.SCOPE="SCOPE",e.NAME="NAME",e.RANGE="RANGE",e.REFERENCE="REFERENCE",e.NUMBER="NUMBER",e.PATH="PATH",e.URL="URL",e.ADDED="ADDED",e.REMOVED="REMOVED",e.CODE="CODE",e.DURATION="DURATION",e.SIZE="SIZE",e.IDENT="IDENT",e.DESCRIPTOR="DESCRIPTOR",e.LOCATOR="LOCATOR",e.RESOLUTION="RESOLUTION",e.DEPENDENT="DEPENDENT",e.PACKAGE_EXTENSION="PACKAGE_EXTENSION"}(A||(A={})),function(e){e[e.BOLD=2]="BOLD"}(n||(n={}));const u=process.env.GITHUB_ACTIONS?{level:2}:s().supportsColor?{level:s().supportsColor.level}:{level:0},h=0!==u.level,p=h&&!process.env.GITHUB_ACTIONS,d=new(s().Instance)(u),C=new Map([[A.NO_HINT,null],[A.NULL,["#a853b5",129]],[A.SCOPE,["#d75f00",166]],[A.NAME,["#d7875f",173]],[A.RANGE,["#00afaf",37]],[A.REFERENCE,["#87afff",111]],[A.NUMBER,["#ffd700",220]],[A.PATH,["#d75fd7",170]],[A.URL,["#d75fd7",170]],[A.ADDED,["#5faf00",70]],[A.REMOVED,["#d70000",160]],[A.CODE,["#87afff",111]],[A.SIZE,["#ffd700",220]]]),f={[A.NUMBER]:{pretty:(e,t)=>""+t,json:e=>e},[A.IDENT]:{pretty:(e,t)=>g.prettyIdent(e,t),json:e=>g.stringifyIdent(e)},[A.LOCATOR]:{pretty:(e,t)=>g.prettyLocator(e,t),json:e=>g.stringifyLocator(e)},[A.DESCRIPTOR]:{pretty:(e,t)=>g.prettyDescriptor(e,t),json:e=>g.stringifyDescriptor(e)},[A.RESOLUTION]:{pretty:(e,{descriptor:t,locator:r})=>g.prettyResolution(e,t,r),json:({descriptor:e,locator:t})=>({descriptor:g.stringifyDescriptor(e),locator:null!==t?g.stringifyLocator(t):null})},[A.DEPENDENT]:{pretty:(e,{locator:t,descriptor:r})=>g.prettyDependent(e,t,r),json:({locator:e,descriptor:t})=>({locator:g.stringifyLocator(e),descriptor:g.stringifyDescriptor(t)})},[A.PACKAGE_EXTENSION]:{pretty:(e,t)=>{switch(t.type){case l.HN.Dependency:return`${g.prettyIdent(e,t.parentDescriptor)} ➤ ${B(e,"dependencies",A.CODE)} ➤ ${g.prettyIdent(e,t.descriptor)}`;case l.HN.PeerDependency:return`${g.prettyIdent(e,t.parentDescriptor)} ➤ ${B(e,"peerDependencies",A.CODE)} ➤ ${g.prettyIdent(e,t.descriptor)}`;case l.HN.PeerDependencyMeta:return`${g.prettyIdent(e,t.parentDescriptor)} ➤ ${B(e,"peerDependenciesMeta",A.CODE)} ➤ ${g.prettyIdent(e,g.parseIdent(t.selector))} ➤ ${B(e,t.key,A.CODE)}`;default:throw new Error("Assertion failed: Unsupported package extension type: "+t.type)}},json:e=>{switch(e.type){case l.HN.Dependency:return`${g.stringifyIdent(e.parentDescriptor)} > ${g.stringifyIdent(e.descriptor)}`;case l.HN.PeerDependency:return`${g.stringifyIdent(e.parentDescriptor)} >> ${g.stringifyIdent(e.descriptor)}`;case l.HN.PeerDependencyMeta:return`${g.stringifyIdent(e.parentDescriptor)} >> ${e.selector} / ${e.key}`;default:throw new Error("Assertion failed: Unsupported package extension type: "+e.type)}}},[A.DURATION]:{pretty:(e,t)=>{if(t>6e4){const e=Math.floor(t/1e3/60),r=Math.ceil((t-60*e*1e3)/1e3);return 0===r?e+"m":`${e}m ${r}s`}{const e=Math.floor(t/1e3),r=t-1e3*e;return 0===r?e+"s":`${e}s ${r}ms`}},json:e=>e},[A.SIZE]:{pretty:(e,t)=>{const r=["KB","MB","GB","TB"];let n=r.length;for(;n>1&&t<1024**n;)n-=1;const o=1024**n;return B(e,`${Math.floor(100*t/o)/100} ${r[n-1]}`,A.NUMBER)},json:e=>e},[A.PATH]:{pretty:(e,t)=>B(e,o.cS.fromPortablePath(t),A.PATH),json:e=>o.cS.fromPortablePath(e)}};function I(e,t){return[t,e]}function E(e,t,r){return e.get("enableColors")?(r&n.BOLD&&(t=s().bold(t)),t):t}function B(e,t,r){if(!e.get("enableColors"))return t;const A=C.get(r);if(null===A)return t;const n=void 0===A?r:u.level>=3?A[0]:A[1],o="number"==typeof n?d.ansi256(n):n.startsWith("#")?d.hex(n):d[n];if("function"!=typeof o)throw new Error("Invalid format type "+n);return o(t)}function y(e,t,r){if(null===t)return B(e,"null",A.NULL);if(Object.prototype.hasOwnProperty.call(f,r)){return f[r].pretty(e,t)}if("string"!=typeof t)throw new Error("Assertion failed: Expected the value to be a string, got "+typeof t);return B(e,t,r)}function m(e,t,r,{separator:A=", "}={}){return[...t].map(t=>y(e,t,r)).join(A)}function w(e,t){if(null===e)return null;if(Object.prototype.hasOwnProperty.call(f,t))return c.overrideType(t),f[t].json(e);if("string"!=typeof e)throw new Error("Assertion failed: Expected the value to be a string, got "+typeof e);return e}function Q(e){return{Check:B(e,"✓","green"),Cross:B(e,"✘","red"),Question:B(e,"?","cyan")}}var D;function b(e,{configuration:t}){const r=t.get("logFilters"),A=new Map,n=new Map;for(const e of r){const t=e.get("level");if(void 0===t)continue;const r=e.get("code");void 0!==r&&A.set(r,t);const o=e.get("text");void 0!==o&&n.set(o,t)}const o=e.reportInfo,i=e.reportWarning,c=e.reportError,g=function(e,t,r,g){switch(((e,t,r)=>{if(null===e||e===a.b.UNNAMED)return r;if(n.size>0){const e=n.get(s().reset(t));if(void 0!==e)return null!=e?e:r}if(A.size>0){const t=A.get((0,a.i)(e));if(void 0!==t)return null!=t?t:r}return r})(t,r,g)){case D.Info:o.call(e,t,r);break;case D.Warning:i.call(e,null!=t?t:a.b.UNNAMED,r);break;case D.Error:c.call(e,null!=t?t:a.b.UNNAMED,r)}};e.reportInfo=function(...e){return g(this,...e,D.Info)},e.reportWarning=function(...e){return g(this,...e,D.Warning)},e.reportError=function(...e){return g(this,...e,D.Error)}}!function(e){e.Error="error",e.Warning="warning",e.Info="info",e.Discard="discard"}(D||(D={}))},20624:(e,t,r)=>{"use strict";r.r(t),r.d(t,{makeHash:()=>a,checksumFile:()=>c,checksumPattern:()=>g});var A=r(43896),n=r(46009),o=r(76417),i=r(58592),s=r.n(i);function a(...e){const t=(0,o.createHash)("sha512");for(const r of e)t.update(r||"");return t.digest("hex")}function c(e){return new Promise((t,r)=>{const n=(0,o.createHash)("sha512"),i=A.xfs.createReadStream(e);i.on("data",e=>{n.update(e)}),i.on("error",e=>{r(e)}),i.on("end",()=>{t(n.digest("hex"))})})}async function g(e,{cwd:t}){const r=(await s()(e,{cwd:n.cS.fromPortablePath(t),expandDirectories:!1,onlyDirectories:!0,unique:!0})).map(e=>e+"/**/*"),i=await s()([e,...r],{cwd:n.cS.fromPortablePath(t),expandDirectories:!1,onlyFiles:!1,unique:!0});i.sort();const a=await Promise.all(i.map(async e=>{const t=[Buffer.from(e)],r=n.cS.toPortablePath(e),o=await A.xfs.lstatPromise(r);return o.isSymbolicLink()?t.push(Buffer.from(await A.xfs.readlinkPromise(r))):o.isFile()&&t.push(await A.xfs.readFilePromise(r)),t.join("\0")})),c=(0,o.createHash)("sha512");for(const e of a)c.update(e);return c.digest("hex")}},79669:(e,t,r)=>{"use strict";r.r(t),r.d(t,{getNetworkSettings:()=>d,Method:()=>C,request:()=>f,get:()=>I,put:()=>E,post:()=>B,del:()=>y});var A=r(43896),n=r(57211),o=r(98605),i=r(2401),s=r.n(i),a=r(98161),c=r(78835);const g=new Map,l=new Map,u=new o.Agent({keepAlive:!0}),h=new n.Agent({keepAlive:!0});function p(e){const t=new c.URL(e),r={host:t.hostname,headers:{}};return t.port&&(r.port=Number(t.port)),{proxy:r}}function d(e,t){const r=[...t.configuration.get("networkSettings")].sort(([e],[t])=>t.length-e.length),A={enableNetwork:void 0,caFilePath:void 0,httpProxy:void 0,httpsProxy:void 0},n=Object.keys(A),o=new c.URL(e);for(const[e,t]of r)if(s().isMatch(o.hostname,e))for(const e of n){const r=t.get(e);null!==r&&void 0===A[e]&&(A[e]=r)}for(const e of n)void 0===A[e]&&(A[e]=t.configuration.get(e));return A}var C;async function f(e,t,{configuration:n,headers:o,json:i,jsonRequest:g=i,jsonResponse:f=i,method:I=C.GET}){const E=d(e,{configuration:n});if(!1===E.enableNetwork)throw new Error(`Request to '${e}' has been blocked because of your configuration settings`);const B=new c.URL(e);if("http:"===B.protocol&&!s().isMatch(B.hostname,n.get("unsafeHttpWhitelist")))throw new Error(`Unsafe http requests must be explicitly whitelisted in your configuration (${B.hostname})`);const y={agent:{http:E.httpProxy?a.httpOverHttp(p(E.httpProxy)):u,https:E.httpsProxy?a.httpsOverHttp(p(E.httpsProxy)):h},headers:o,method:I};y.responseType=f?"json":"buffer",null!==t&&(Buffer.isBuffer(t)||!g&&"string"==typeof t?y.body=t:y.json=t);const m=n.get("httpTimeout"),w=n.get("httpRetry"),Q=n.get("enableStrictSsl"),D=E.caFilePath,{default:b}=await Promise.resolve().then(r.t.bind(r,48722,7)),v=D?await async function(e){let t=l.get(e);return t||(t=A.xfs.readFilePromise(e).then(t=>(l.set(e,t),t)),l.set(e,t)),t}(D):void 0,S=b.extend({timeout:{socket:m},retry:w,https:{rejectUnauthorized:Q,certificateAuthority:v},...y});return n.getLimit("networkConcurrency")(()=>S(e))}async function I(e,{configuration:t,json:r,jsonResponse:A=r,...n}){let o=g.get(e);return o||(o=f(e,null,{configuration:t,...n}).then(t=>(g.set(e,t.body),t.body)),g.set(e,o)),!1===Buffer.isBuffer(o)&&(o=await o),A?JSON.parse(o.toString()):o}async function E(e,t,r){return(await f(e,t,{...r,method:C.PUT})).body}async function B(e,t,r){return(await f(e,t,{...r,method:C.POST})).body}async function y(e,t){return(await f(e,null,{...t,method:C.DELETE})).body}!function(e){e.GET="GET",e.PUT="PUT",e.POST="POST",e.DELETE="DELETE"}(C||(C={}))},53836:(e,t,r)=>{"use strict";r.r(t),r.d(t,{Cache:()=>p.C,DEFAULT_RC_FILENAME:()=>d.tr,DEFAULT_LOCK_FILENAME:()=>d.nh,Configuration:()=>d.VK,FormatType:()=>d.a5,ProjectLookup:()=>d.EW,SettingsType:()=>d.a2,BuildType:()=>C.k,LightReport:()=>f.h,Manifest:()=>I.G,MessageName:()=>E.b,Project:()=>B.I,TAG_REGEXP:()=>y.c,ReportError:()=>m.lk,Report:()=>m.yG,StreamReport:()=>w.Pk,TelemetryManager:()=>Q.E,ThrowReport:()=>D.$,VirtualFetcher:()=>b.N,WorkspaceResolver:()=>v.d,Workspace:()=>S.j,YarnVersion:()=>k.o,LinkType:()=>N.Un,PackageExtensionType:()=>N.HN,PackageExtensionStatus:()=>N._u,hashUtils:()=>i,httpUtils:()=>s,execUtils:()=>A,folderUtils:()=>n,formatUtils:()=>o,miscUtils:()=>a,scriptUtils:()=>c,semverUtils:()=>g,structUtils:()=>l,tgzUtils:()=>u,treeUtils:()=>h});var A=r(6220),n=r(81111),o=r(71643),i=r(20624),s=r(79669),a=r(73632),c=r(63088),g=r(36545),l=r(54143),u=r(72785),h=r(85875),p=r(28148),d=r(39922),C=r(92409),f=r(62152),I=r(46611),E=r(92659),B=r(85824),y=r(52779),m=r(35691),w=r(15815),Q=r(81832),D=r(33720),b=r(60895),v=r(94538),S=r(17722),k=r(59355),N=r(32485)},73632:(e,t,r)=>{"use strict";r.r(t),r.d(t,{escapeRegExp:()=>a,overrideType:()=>c,assertNever:()=>g,validateEnum:()=>l,mapAndFilter:()=>u,mapAndFind:()=>p,isIndexableObject:()=>C,convertMapsToIndexableObjects:()=>f,getFactoryWithDefault:()=>I,getArrayWithDefault:()=>E,getSetWithDefault:()=>B,getMapWithDefault:()=>y,releaseAfterUseAsync:()=>m,prettifyAsyncErrors:()=>w,prettifySyncErrors:()=>Q,bufferStream:()=>D,BufferStream:()=>b,DefaultStream:()=>v,dynamicRequire:()=>S,dynamicRequireNoCache:()=>k,sortMap:()=>N,buildIgnorePattern:()=>F,replaceEnvVariables:()=>K,parseBoolean:()=>M,parseOptionalBoolean:()=>R,tryParseOptionalBoolean:()=>x});var A=r(46009),n=r(40822),o=r(2401),i=r.n(o),s=r(92413);function a(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function c(e){}function g(e){throw new Error(`Assertion failed: Unexpected object '${e}'`)}function l(e,t){if(!Object.values(e).includes(t))throw new Error("Assertion failed: Invalid value for enumeration");return t}function u(e,t){const r=[];for(const A of e){const e=t(A);e!==h&&r.push(e)}return r}e=r.hmd(e);const h=Symbol();function p(e,t){for(const r of e){const e=t(r);if(e!==d)return e}}u.skip=h;const d=Symbol();function C(e){return"object"==typeof e&&null!==e}function f(e){if(e instanceof Map&&(e=Object.fromEntries(e)),C(e))for(const t of Object.keys(e)){const r=e[t];C(r)&&(e[t]=f(r))}return e}function I(e,t,r){let A=e.get(t);return void 0===A&&e.set(t,A=r()),A}function E(e,t){let r=e.get(t);return void 0===r&&e.set(t,r=[]),r}function B(e,t){let r=e.get(t);return void 0===r&&e.set(t,r=new Set),r}function y(e,t){let r=e.get(t);return void 0===r&&e.set(t,r=new Map),r}async function m(e,t){if(null==t)return await e();try{return await e()}finally{await t()}}async function w(e,t){try{return await e()}catch(e){throw e.message=t(e.message),e}}function Q(e,t){try{return e()}catch(e){throw e.message=t(e.message),e}}async function D(e){return await new Promise((t,r)=>{const A=[];e.on("error",e=>{r(e)}),e.on("data",e=>{A.push(e)}),e.on("end",()=>{t(Buffer.concat(A))})})}p.skip=d;class b extends s.Transform{constructor(){super(...arguments),this.chunks=[]}_transform(e,t,r){if("buffer"!==t||!Buffer.isBuffer(e))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(e),r(null,null)}_flush(e){e(null,Buffer.concat(this.chunks))}}class v extends s.Transform{constructor(e=Buffer.alloc(0)){super(),this.active=!0,this.ifEmpty=e}_transform(e,t,r){if("buffer"!==t||!Buffer.isBuffer(e))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,r(null,e)}_flush(e){this.active&&this.ifEmpty.length>0&&e(null,this.ifEmpty)}}function S(e){return"undefined"!=typeof require?require(e):r(32178)(e)}function k(t){const n=A.cS.fromPortablePath(t),o=r.c[n];let i;delete r.c[n];try{i=S(n);const t=r.c[n],A=e.children.indexOf(t);-1!==A&&e.children.splice(A,1)}finally{r.c[n]=o}return i}function N(e,t){const r=Array.from(e);Array.isArray(t)||(t=[t]);const A=[];for(const e of t)A.push(r.map(t=>e(t)));const n=r.map((e,t)=>t);return n.sort((e,t)=>{for(const r of A){const A=r[e]r[t]?1:0;if(0!==A)return A}return 0}),n.map(e=>r[e])}function F(e){return 0===e.length?null:e.map(e=>`(${i().makeRe(e,{windows:!1}).source})`).join("|")}function K(e,{env:t}){return e.replace(/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g,(...e)=>{const{variableName:r,colon:A,fallback:o}=e[e.length-1],i=Object.prototype.hasOwnProperty.call(t,r),s=t[r];if(s)return s;if(i&&!A)return s;if(null!=o)return o;throw new n.UsageError(`Environment variable not found (${r})`)})}function M(e){switch(e){case"true":case"1":case 1:case!0:return!0;case"false":case"0":case 0:case!1:return!1;default:throw new Error(`Couldn't parse "${e}" as a boolean`)}}function R(e){return void 0===e?e:M(e)}function x(e){try{return R(e)}catch(e){return null}}},63088:(e,t,r)=>{"use strict";r.r(t),r.d(t,{makeScriptEnv:()=>b,prepareExternalProject:()=>S,hasPackageScript:()=>k,executePackageScript:()=>N,executePackageShellcode:()=>F,executeWorkspaceScript:()=>M,hasWorkspaceScript:()=>R,executeWorkspaceLifecycleScript:()=>x,maybeExecuteWorkspaceLifecycleScript:()=>L,getPackageAccessibleBinaries:()=>P,getWorkspaceAccessibleBinaries:()=>O,executePackageAccessibleBinary:()=>U,executeWorkspaceAccessibleBinary:()=>T});var A,n=r(46009),o=r(53660),i=r(75448),s=r(43896),a=r(65281),c=r(76756),g=r(50730),l=r(61814),u=r.n(l),h=r(61578),p=r.n(h),d=r(92413),C=r(46611),f=r(92659),I=r(35691),E=r(15815),B=r(59355),y=r(6220),m=r(71643),w=r(73632),Q=r(54143);async function D(e,t,r,A=[]){"win32"===process.platform&&await Promise.all([s.xfs.writeFilePromise(n.y1.format({dir:e,name:t,ext:".exe"}),(0,g.O9)()),s.xfs.writeFilePromise(n.y1.format({dir:e,name:t,ext:".exe.info"}),[r,...A].join("\n")),s.xfs.writeFilePromise(n.y1.format({dir:e,name:t,ext:".cmd"}),`@"${r}" ${A.map(e=>`"${e.replace('"','""')}"`).join(" ")} %*\n`)]),await s.xfs.writeFilePromise(n.y1.join(e,t),`#!/bin/sh\nexec "${r}" ${A.map(e=>`'${e.replace(/'/g,"'\"'\"'")}'`).join(" ")} "$@"\n`),await s.xfs.chmodPromise(n.y1.join(e,t),493)}async function b({project:e,binFolder:t,lifecycleScript:r}){const A={};for(const[e,t]of Object.entries(process.env))void 0!==t&&(A["path"!==e.toLowerCase()?e:"PATH"]=t);const o=n.cS.fromPortablePath(t);A.BERRY_BIN_FOLDER=n.cS.fromPortablePath(o),await D(t,"node",process.execPath),null!==B.o&&(await D(t,"run",process.execPath,[process.argv[1],"run"]),await D(t,"yarn",process.execPath,[process.argv[1]]),await D(t,"yarnpkg",process.execPath,[process.argv[1]]),await D(t,"node-gyp",process.execPath,[process.argv[1],"run","--top-level","node-gyp"])),e&&(A.INIT_CWD=n.cS.fromPortablePath(e.configuration.startingCwd)),A.PATH=A.PATH?`${o}${n.cS.delimiter}${A.PATH}`:""+o,A.npm_execpath=`${o}${n.cS.sep}yarn`,A.npm_node_execpath=`${o}${n.cS.sep}node`;const i=null!==B.o?"yarn/"+B.o:`yarn/${w.dynamicRequire("@yarnpkg/core").version}-core`;return A.npm_config_user_agent=`${i} npm/? node/${process.versions.node} ${process.platform} ${process.arch}`,r&&(A.npm_lifecycle_event=r),e&&await e.configuration.triggerHook(e=>e.setupScriptEnvironment,e,A,async(e,r,A)=>await D(t,(0,n.Zu)(e),r,A)),A}!function(e){e.Yarn1="Yarn Classic",e.Yarn2="Yarn",e.Npm="npm",e.Pnpm="pnpm"}(A||(A={}));const v=p()(2);async function S(e,t,{configuration:r,report:o,workspace:i=null}){await v(async()=>{await s.xfs.mktempPromise(async a=>{const c=n.y1.join(a,"pack.log"),{stdout:g,stderr:l}=r.getSubprocessStreams(c,{prefix:e,report:o}),u=await async function(e){let t=null;try{t=await s.xfs.readFilePromise(n.y1.join(e,n.QS.lockfile),"utf8")}catch(e){}return null!==t?t.match(/^__metadata:$/m)?A.Yarn2:A.Yarn1:s.xfs.existsSync(n.y1.join(e,"package-lock.json"))?A.Npm:s.xfs.existsSync(n.y1.join(e,"pnpm-lock.yaml"))?A.Pnpm:null}(e);let h;null!==u?(g.write(`Installing the project using ${u}\n\n`),h=u):(g.write("No package manager detected; defaulting to Yarn\n\n"),h=A.Yarn2),await s.xfs.mktempPromise(async r=>{const o=await b({binFolder:r}),u=new Map([[A.Yarn1,async()=>{const r=null!==i?["workspace",i]:[],A=await y.pipevp("yarn",["set","version","classic","--only-if-needed"],{cwd:e,env:o,stdin:null,stdout:g,stderr:l,end:y.EndStrategy.ErrorCode});if(0!==A.code)return A.code;await s.xfs.appendFilePromise(n.y1.join(e,".npmignore"),"/.yarn\n"),g.write("\n");const a=await y.pipevp("yarn",["install"],{cwd:e,env:o,stdin:null,stdout:g,stderr:l,end:y.EndStrategy.ErrorCode});if(0!==a.code)return a.code;g.write("\n");const c=await y.pipevp("yarn",[...r,"pack","--filename",n.cS.fromPortablePath(t)],{cwd:e,env:o,stdin:null,stdout:g,stderr:l});return 0!==c.code?c.code:0}],[A.Yarn2,async()=>{const r=null!==i?["workspace",i]:[];o.YARN_ENABLE_INLINE_BUILDS="1";const A=n.y1.join(e,n.QS.lockfile);await s.xfs.existsPromise(A)||await s.xfs.writeFilePromise(A,"");const a=await y.pipevp("yarn",[...r,"pack","--install-if-needed","--filename",n.cS.fromPortablePath(t)],{cwd:e,env:o,stdin:null,stdout:g,stderr:l});return 0!==a.code?a.code:0}],[A.Npm,async()=>{if(null!==i)throw new Error("Workspaces aren't supported by npm, which has been detected as the primary package manager for "+e);delete o.npm_config_user_agent;const r=await y.pipevp("npm",["install"],{cwd:e,env:o,stdin:null,stdout:g,stderr:l,end:y.EndStrategy.ErrorCode});if(0!==r.code)return r.code;const A=new d.PassThrough,a=w.bufferStream(A);A.pipe(g);const c=await y.pipevp("npm",["pack","--silent"],{cwd:e,env:o,stdin:null,stdout:A,stderr:l});if(0!==c.code)return c.code;const u=(await a).toString().trim(),h=n.y1.resolve(e,n.cS.toPortablePath(u));return await s.xfs.renamePromise(h,t),0}]]).get(h);if(void 0===u)throw new Error("Assertion failed: Unsupported workflow");const p=await u();if(0!==p&&void 0!==p)throw s.xfs.detachTemp(a),new I.lk(f.b.PACKAGE_PREPARATION_FAILED,`Packing the package failed (exit code ${p}, logs can be found here: ${c})`)})})})}async function k(e,t,{project:r}){const A=r.storedPackages.get(e.locatorHash);if(!A)throw new Error(`Package for ${Q.prettyLocator(r.configuration,e)} not found in the project`);return await o.A.openPromise(async e=>{const o=r.configuration,s=r.configuration.getLinkers(),a={project:r,report:new E.Pk({stdout:new d.PassThrough,configuration:o})},c=s.find(e=>e.supportsPackage(A,a));if(!c)throw new Error(`The package ${Q.prettyLocator(r.configuration,A)} isn't supported by any of the available linkers`);const g=await c.findPackageLocation(A,a),l=new i.M(g,{baseFs:e});return(await C.G.find(n.LZ.dot,{baseFs:l})).scripts.has(t)},{libzip:await(0,a.getLibzipPromise)()})}async function N(e,t,r,{cwd:A,project:n,stdin:o,stdout:i,stderr:a}){return await s.xfs.mktempPromise(async s=>{const{manifest:g,env:l,cwd:u}=await K(e,{project:n,binFolder:s,cwd:A,lifecycleScript:t}),h=g.scripts.get(t);if(void 0===h)return 1;const p=await n.configuration.reduceHook(e=>e.wrapScriptExecution,async()=>await(0,c.execute)(h,r,{cwd:u,env:l,stdin:o,stdout:i,stderr:a}),n,e,t,{script:h,args:r,cwd:u,env:l,stdin:o,stdout:i,stderr:a});return await p()})}async function F(e,t,r,{cwd:A,project:n,stdin:o,stdout:i,stderr:a}){return await s.xfs.mktempPromise(async s=>{const{env:g,cwd:l}=await K(e,{project:n,binFolder:s,cwd:A});return await(0,c.execute)(t,r,{cwd:l,env:g,stdin:o,stdout:i,stderr:a})})}async function K(e,{project:t,binFolder:r,cwd:A,lifecycleScript:s}){const c=t.storedPackages.get(e.locatorHash);if(!c)throw new Error(`Package for ${Q.prettyLocator(t.configuration,e)} not found in the project`);return await o.A.openPromise(async o=>{const a=t.configuration,g=t.configuration.getLinkers(),l={project:t,report:new E.Pk({stdout:new d.PassThrough,configuration:a})},u=g.find(e=>e.supportsPackage(c,l));if(!u)throw new Error(`The package ${Q.prettyLocator(t.configuration,c)} isn't supported by any of the available linkers`);const h=await b({project:t,binFolder:r,lifecycleScript:s});await Promise.all(Array.from(await P(e,{project:t}),([e,[,t]])=>D(r,(0,n.Zu)(e),process.execPath,[t])));const p=await u.findPackageLocation(c,l),f=new i.M(p,{baseFs:o}),I=await C.G.find(n.LZ.dot,{baseFs:f});return void 0===A&&(A=p),{manifest:I,binFolder:r,env:h,cwd:A}},{libzip:await(0,a.getLibzipPromise)()})}async function M(e,t,r,{cwd:A,stdin:n,stdout:o,stderr:i}){return await N(e.anchoredLocator,t,r,{cwd:A,project:e.project,stdin:n,stdout:o,stderr:i})}function R(e,t){return e.manifest.scripts.has(t)}async function x(e,t,{cwd:r,report:A}){const{configuration:o}=e.project;await s.xfs.mktempPromise(async i=>{const a=n.y1.join(i,t+".log"),c=`# This file contains the result of Yarn calling the "${t}" lifecycle script inside a workspace ("${e.cwd}")\n`,{stdout:g,stderr:l}=o.getSubprocessStreams(a,{report:A,prefix:Q.prettyLocator(o,e.anchoredLocator),header:c});A.reportInfo(f.b.LIFECYCLE_SCRIPT,`Calling the "${t}" lifecycle script`);const h=await M(e,t,[],{cwd:r,stdin:null,stdout:g,stderr:l});if(g.end(),l.end(),0!==h)throw s.xfs.detachTemp(i),new I.lk(f.b.LIFECYCLE_SCRIPT,`${u()(t)} script failed (exit code ${m.pretty(o,h,m.Type.NUMBER)}, logs can be found here: ${m.pretty(o,a,m.Type.PATH)}); run ${m.pretty(o,"yarn "+t,m.Type.CODE)} to investigate`)})}async function L(e,t,r){R(e,t)&&await x(e,t,r)}async function P(e,{project:t}){const r=t.configuration,A=new Map,o=t.storedPackages.get(e.locatorHash);if(!o)throw new Error(`Package for ${Q.prettyLocator(r,e)} not found in the project`);const i=new d.Writable,s=r.getLinkers(),a={project:t,report:new E.Pk({configuration:r,stdout:i})},c=new Set([e.locatorHash]);for(const e of o.dependencies.values()){const A=t.storedResolutions.get(e.descriptorHash);if(!A)throw new Error(`Assertion failed: The resolution (${Q.prettyDescriptor(r,e)}) should have been registered`);c.add(A)}for(const e of c){const r=t.storedPackages.get(e);if(!r)throw new Error(`Assertion failed: The package (${e}) should have been registered`);if(0===r.bin.size)continue;const o=s.find(e=>e.supportsPackage(r,a));if(!o)continue;let i=null;try{i=await o.findPackageLocation(r,a)}catch(e){if("LOCATOR_NOT_INSTALLED"===e.code)continue;throw e}for(const[e,t]of r.bin)A.set(e,[r,n.cS.fromPortablePath(n.y1.resolve(i,t))])}return A}async function O(e){return await P(e.anchoredLocator,{project:e.project})}async function U(e,t,r,{cwd:A,project:o,stdin:i,stdout:a,stderr:c,nodeArgs:g=[]}){const l=await P(e,{project:o}),u=l.get(t);if(!u)throw new Error(`Binary not found (${t}) for ${Q.prettyLocator(o.configuration,e)}`);return await s.xfs.mktempPromise(async e=>{const[,t]=u,h=await b({project:o,binFolder:e});let p;await Promise.all(Array.from(l,([e,[,t]])=>D(h.BERRY_BIN_FOLDER,(0,n.Zu)(e),process.execPath,[t])));try{p=await y.pipevp(process.execPath,[...g,t,...r],{cwd:A,env:h,stdin:i,stdout:a,stderr:c})}finally{await s.xfs.removePromise(h.BERRY_BIN_FOLDER)}return p.code})}async function T(e,t,r,{cwd:A,stdin:n,stdout:o,stderr:i}){return await U(e.anchoredLocator,t,r,{project:e.project,cwd:A,stdin:n,stdout:o,stderr:i})}},36545:(e,t,r)=>{"use strict";r.r(t),r.d(t,{satisfiesWithPrereleases:()=>o,validRange:()=>s});var A=r(53887),n=r.n(A);function o(e,t,r=!1){let A,o;try{A=new(n().Range)(t,{includePrerelease:!0,loose:r})}catch(e){return!1}if(!e)return!1;try{o=new(n().SemVer)(e,A),o.prerelease&&(o.prerelease=[])}catch(e){return!1}return A.set.some(e=>{for(const t of e)t.semver.prerelease&&(t.semver.prerelease=[]);return e.every(e=>e.test(o))})}const i=new Map;function s(e){if(-1!==e.indexOf(":"))return null;let t=i.get(e);if(void 0!==t)return t;try{t=new(n().Range)(e)}catch(e){t=null}return i.set(e,t),t}},54143:(e,t,r)=>{"use strict";r.r(t),r.d(t,{makeIdent:()=>u,makeDescriptor:()=>h,makeLocator:()=>p,convertToIdent:()=>d,convertDescriptorToLocator:()=>C,convertLocatorToDescriptor:()=>f,convertPackageToLocator:()=>I,renamePackage:()=>E,copyPackage:()=>B,virtualizeDescriptor:()=>y,virtualizePackage:()=>m,isVirtualDescriptor:()=>w,isVirtualLocator:()=>Q,devirtualizeDescriptor:()=>D,devirtualizeLocator:()=>b,bindDescriptor:()=>v,bindLocator:()=>S,areIdentsEqual:()=>k,areDescriptorsEqual:()=>N,areLocatorsEqual:()=>F,areVirtualPackagesEquivalent:()=>K,parseIdent:()=>M,tryParseIdent:()=>R,parseDescriptor:()=>x,tryParseDescriptor:()=>L,parseLocator:()=>P,tryParseLocator:()=>O,parseRange:()=>U,parseFileStyleRange:()=>T,makeRange:()=>Y,convertToManifestRange:()=>G,requirableIdent:()=>H,stringifyIdent:()=>J,stringifyDescriptor:()=>q,stringifyLocator:()=>z,slugifyIdent:()=>W,slugifyLocator:()=>V,prettyIdent:()=>X,prettyRange:()=>Z,prettyDescriptor:()=>$,prettyReference:()=>ee,prettyLocator:()=>te,prettyLocatorNoColors:()=>re,sortDescriptors:()=>Ae,prettyWorkspace:()=>ne,prettyResolution:()=>oe,prettyDependent:()=>ie,getIdentVendorPath:()=>se});var A=r(46009),n=r(71191),o=r.n(n),i=r(53887),s=r.n(i),a=r(71643),c=r(20624),g=r(73632),l=r(54143);function u(e,t){if(null==e?void 0:e.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:c.makeHash(e,t),scope:e,name:t}}function h(e,t){return{identHash:e.identHash,scope:e.scope,name:e.name,descriptorHash:c.makeHash(e.identHash,t),range:t}}function p(e,t){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:c.makeHash(e.identHash,t),reference:t}}function d(e){return{identHash:e.identHash,scope:e.scope,name:e.name}}function C(e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.descriptorHash,reference:e.range}}function f(e){return{identHash:e.identHash,scope:e.scope,name:e.name,descriptorHash:e.locatorHash,range:e.reference}}function I(e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference}}function E(e,t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference,version:e.version,languageName:e.languageName,linkType:e.linkType,dependencies:new Map(e.dependencies),peerDependencies:new Map(e.peerDependencies),dependenciesMeta:new Map(e.dependenciesMeta),peerDependenciesMeta:new Map(e.peerDependenciesMeta),bin:new Map(e.bin)}}function B(e){return E(e,e)}function y(e,t){if(t.includes("#"))throw new Error("Invalid entropy");return h(e,`virtual:${t}#${e.range}`)}function m(e,t){if(t.includes("#"))throw new Error("Invalid entropy");return E(e,p(e,`virtual:${t}#${e.reference}`))}function w(e){return e.range.startsWith("virtual:")}function Q(e){return e.reference.startsWith("virtual:")}function D(e){if(!w(e))throw new Error("Not a virtual descriptor");return h(e,e.range.replace(/^[^#]*#/,""))}function b(e){if(!Q(e))throw new Error("Not a virtual descriptor");return p(e,e.reference.replace(/^[^#]*#/,""))}function v(e,t){return e.range.includes("::")?e:h(e,`${e.range}::${o().stringify(t)}`)}function S(e,t){return e.reference.includes("::")?e:p(e,`${e.reference}::${o().stringify(t)}`)}function k(e,t){return e.identHash===t.identHash}function N(e,t){return e.descriptorHash===t.descriptorHash}function F(e,t){return e.locatorHash===t.locatorHash}function K(e,t){if(!Q(e))throw new Error("Invalid package type");if(!Q(t))throw new Error("Invalid package type");if(!k(e,t))return!1;if(e.dependencies.size!==t.dependencies.size)return!1;for(const r of e.dependencies.values()){const e=t.dependencies.get(r.identHash);if(!e)return!1;if(!N(r,e))return!1}return!0}function M(e){const t=R(e);if(!t)throw new Error(`Invalid ident (${e})`);return t}function R(e){const t=e.match(/^(?:@([^/]+?)\/)?([^/]+)$/);if(!t)return null;const[,r,A]=t;return u(void 0!==r?r:null,A)}function x(e,t=!1){const r=L(e,t);if(!r)throw new Error(`Invalid descriptor (${e})`);return r}function L(e,t=!1){const r=t?e.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):e.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!r)return null;const[,A,n,o]=r;if("unknown"===o)throw new Error(`Invalid range (${e})`);const i=void 0!==o?o:"unknown";return h(u(void 0!==A?A:null,n),i)}function P(e,t=!1){const r=O(e,t);if(!r)throw new Error(`Invalid locator (${e})`);return r}function O(e,t=!1){const r=t?e.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):e.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!r)return null;const[,A,n,o]=r;if("unknown"===o)throw new Error(`Invalid reference (${e})`);const i=void 0!==o?o:"unknown";return p(u(void 0!==A?A:null,n),i)}function U(e,t){const r=e.match(/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/);if(null===r)throw new Error(`Invalid range (${e})`);const A=void 0!==r[1]?r[1]:null;if("string"==typeof(null==t?void 0:t.requireProtocol)&&A!==t.requireProtocol)throw new Error(`Invalid protocol (${A})`);if((null==t?void 0:t.requireProtocol)&&null===A)throw new Error(`Missing protocol (${A})`);const n=void 0!==r[3]?decodeURIComponent(r[2]):null;if((null==t?void 0:t.requireSource)&&null===n)throw new Error(`Missing source (${e})`);const i=void 0!==r[3]?decodeURIComponent(r[3]):decodeURIComponent(r[2]);return{protocol:A,source:n,selector:(null==t?void 0:t.parseSelector)?o().parse(i):i,params:void 0!==r[4]?o().parse(r[4]):null}}function T(e,{protocol:t}){const{selector:r,params:A}=U(e,{requireProtocol:t,requireBindings:!0});if("string"!=typeof A.locator)throw new Error("Assertion failed: Invalid bindings for "+e);return{parentLocator:P(A.locator,!0),path:r}}function j(e){return e=(e=(e=e.replace(/%/g,"%25")).replace(/:/g,"%3A")).replace(/#/g,"%23")}function Y({protocol:e,source:t,selector:r,params:A}){let n="";return null!==e&&(n+=""+e),null!==t&&(n+=j(t)+"#"),n+=j(r),function(e){return null!==e&&Object.entries(e).length>0}(A)&&(n+="::"+o().stringify(A)),n}function G(e){const{params:t,protocol:r,source:A,selector:n}=U(e);for(const e in t)e.startsWith("__")&&delete t[e];return Y({protocol:r,source:A,params:t,selector:n})}function H(e){return e.scope?`@${e.scope}/${e.name}`:""+e.name}function J(e){return e.scope?`@${e.scope}/${e.name}`:""+e.name}function q(e){return e.scope?`@${e.scope}/${e.name}@${e.range}`:`${e.name}@${e.range}`}function z(e){return e.scope?`@${e.scope}/${e.name}@${e.reference}`:`${e.name}@${e.reference}`}function W(e){return null!==e.scope?`@${e.scope}-${e.name}`:e.name}function V(e){const{protocol:t,selector:r}=U(e.reference),n=null!==t?t.replace(/:$/,""):"exotic",o=s().valid(r),i=null!==o?`${n}-${o}`:""+n,a=(e.scope,`${W(e)}-${i}-${e.locatorHash.slice(0,10)}`);return(0,A.Zu)(a)}function X(e,t){return t.scope?`${a.pretty(e,`@${t.scope}/`,a.Type.SCOPE)}${a.pretty(e,t.name,a.Type.NAME)}`:""+a.pretty(e,t.name,a.Type.NAME)}function _(e){if(e.startsWith("virtual:")){return`${_(e.substr(e.indexOf("#")+1))} [${e.substr("virtual:".length,5)}]`}return e.replace(/\?.*/,"?[...]")}function Z(e,t){return""+a.pretty(e,_(t),a.Type.RANGE)}function $(e,t){return`${X(e,t)}${a.pretty(e,"@",a.Type.RANGE)}${Z(e,t.range)}`}function ee(e,t){return""+a.pretty(e,_(t),a.Type.REFERENCE)}function te(e,t){return`${X(e,t)}${a.pretty(e,"@",a.Type.REFERENCE)}${ee(e,t.reference)}`}function re(e){return`${J(e)}@${_(e.reference)}`}function Ae(e){return g.sortMap(e,[e=>J(e),e=>e.range])}function ne(e,t){return X(e,t.locator)}function oe(e,t,r){const A=w(t)?D(t):t;return null===r?`${l.prettyDescriptor(e,A)} → ${a.mark(e).Cross}`:A.identHash===r.identHash?`${l.prettyDescriptor(e,A)} → ${ee(e,r.reference)}`:`${l.prettyDescriptor(e,A)} → ${te(e,r)}`}function ie(e,t,r){return null===r?""+te(e,t):`${te(e,t)} (via ${l.prettyRange(e,r.range)})`}function se(e){return"node_modules/"+H(e)}},72785:(e,t,r)=>{"use strict";r.r(t),r.d(t,{makeArchiveFromDirectory:()=>h,convertToZip:()=>p,extractArchiveTo:()=>d});var A=r(78420),n=r(46009),o=r(90739),i=r(43896),s=r(65281),a=r(59938),c=r(31669),g=r(78761),l=r.n(g);const u=(0,c.promisify)(l().gunzip);async function h(e,{baseFs:t=new A.S,prefixPath:r=n.LZ.root,compressionLevel:a,inMemory:c=!1}={}){const g=await(0,s.getLibzipPromise)();let l;if(c)l=new o.d(null,{libzip:g,level:a});else{const e=await i.xfs.mktempPromise(),t=n.y1.join(e,"archive.zip");l=new o.d(t,{create:!0,libzip:g,level:a})}const u=n.y1.resolve(n.LZ.root,r);return await l.copyPromise(u,e,{baseFs:t,stableTime:!0,stableSort:!0}),l}async function p(e,t){const r=await i.xfs.mktempPromise(),A=n.y1.join(r,"archive.zip"),{compressionLevel:a,...c}=t;return await d(e,new o.d(A,{create:!0,libzip:await(0,s.getLibzipPromise)(),level:a}),c)}async function d(e,t,{stripComponents:r=0,prefixPath:A=n.LZ.dot}={}){const o=a.extract();o.on("entry",(e,o,i)=>{var s,a;if(function(e){if("/"===e.name[0])return!0;const t=e.name.split(/\//g);return!!t.some(e=>".."===e)||t.length<=r}(e))return void i();const c=n.y1.normalize(n.cS.toPortablePath(e.name)).replace(/\/$/,"").split(/\//g);if(c.length<=r)return o.resume(),void i();const g=c.slice(r).join("/"),l=n.y1.join(A,g);let u=420;switch("directory"!==e.type&&0==(73&(null!==(s=e.mode)&&void 0!==s?s:0))||(u|=73),e.type){case"directory":t.mkdirpSync(n.y1.dirname(l),{chmod:493,utimes:[315532800,315532800]}),t.mkdirSync(l),t.chmodSync(l,u),t.utimesSync(l,315532800,315532800),i();break;case"file":{t.mkdirpSync(n.y1.dirname(l),{chmod:493,utimes:[315532800,315532800]});const e=[];o.on("data",t=>e.push(t)),o.on("end",()=>{t.writeFileSync(l,Buffer.concat(e)),t.chmodSync(l,u),t.utimesSync(l,315532800,315532800),i()})}break;case"symlink":t.mkdirpSync(n.y1.dirname(l),{chmod:493,utimes:[315532800,315532800]}),t.symlinkSync(e.linkname,l),null===(a=t.lutimesSync)||void 0===a||a.call(t,l,315532800,315532800),i();break;default:o.resume(),i()}});const i=await u(e);return await new Promise((e,r)=>{o.on("error",e=>{r(e)}),o.on("finish",()=>{e(t)}),o.end(i)})}},85875:(e,t,r)=>{"use strict";r.r(t),r.d(t,{treeNodeToTreeify:()=>o,treeNodeToJson:()=>i,emitList:()=>s,emitTree:()=>a});var A=r(94682),n=r(71643);function o(e,{configuration:t}){const r={},A=(e,r)=>{const o=Array.isArray(e)?e.entries():Object.entries(e);for(const[e,{label:i,value:s,children:a}]of o){const o=[];void 0!==i&&o.push(n.applyStyle(t,i,n.Style.BOLD)),void 0!==s&&o.push(n.pretty(t,s[0],s[1])),0===o.length&&o.push(n.applyStyle(t,""+e,n.Style.BOLD));const c=r[o.join(": ")]={};void 0!==a&&A(a,c)}};if(void 0===e.children)throw new Error("The root node must only contain children");return A(e.children,r),r}function i(e){const t=e=>{var r;if(void 0===e.children){if(void 0===e.value)throw new Error("Assertion failed: Expected a value to be set if the children are missing");return n.json(e.value[0],e.value[1])}const A=Array.isArray(e.children)?e.children.entries():Object.entries(null!==(r=e.children)&&void 0!==r?r:{}),o=Array.isArray(e.children)?[]:{};for(const[e,r]of A)o[e]=t(r);return void 0===e.value?o:{value:n.json(e.value[0],e.value[1]),children:o}};return t(e)}function s(e,{configuration:t,stdout:r,json:A}){a({children:e.map(e=>({value:e}))},{configuration:t,stdout:r,json:A})}function a(e,{configuration:t,stdout:r,json:n,separators:s=0}){var a;if(n){const t=Array.isArray(e.children)?e.children.values():Object.values(null!==(a=e.children)&&void 0!==a?a:{});for(const e of t)r.write(JSON.stringify(i(e))+"\n");return}let c=(0,A.asTree)(o(e,{configuration:t}),!1,!1);if(s>=1&&(c=c.replace(/^([├└]─)/gm,"│\n$1").replace(/^│\n/,"")),s>=2)for(let e=0;e<2;++e)c=c.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,"$1$3 │\n$2").replace(/^│\n/,"");if(s>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");r.write(c)}},32485:(e,t,r)=>{"use strict";var A,n,o;r.d(t,{Un:()=>A,HN:()=>n,_u:()=>o}),function(e){e.HARD="HARD",e.SOFT="SOFT"}(A||(A={})),function(e){e.Dependency="Dependency",e.PeerDependency="PeerDependency",e.PeerDependencyMeta="PeerDependencyMeta"}(n||(n={})),function(e){e.Inactive="inactive",e.Redundant="redundant",e.Active="active"}(o||(o={}))},14626:(e,t,r)=>{"use strict";r.d(t,{K:()=>n});var A=r(42096);class n extends A.p{constructor(e,{baseFs:t,pathUtils:r}){super(r),this.target=e,this.baseFs=t}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}}},75448:(e,t,r)=>{"use strict";r.d(t,{M:()=>i});var A=r(78420),n=r(42096),o=r(46009);class i extends n.p{constructor(e,{baseFs:t=new A.S}={}){super(o.y1),this.target=this.pathUtils.normalize(e),this.baseFs=t}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?o.y1.normalize(e):this.baseFs.resolve(o.y1.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}}},5944:(e,t,r)=>{"use strict";r.d(t,{fS:()=>g,uY:()=>c,qH:()=>l});var A=r(12087),n=r(35747),o=r.n(n),i=r(46009);const s=new Date(3155328e5);async function a(e,t,r,A,n,c,g,l){var u,h;const p=await async function(e,t){try{return await e.lstatPromise(t)}catch(e){return null}}(A,n),d=await c.lstatPromise(g),C=l.stableTime?{mtime:s,atime:s}:d;let f;switch(!0){case d.isDirectory():f=await async function(e,t,r,A,n,o,i,s,c,g){if(null!==o&&!o.isDirectory()){if(!g.overwrite)return!1;e.push(async()=>A.removePromise(n)),o=null}let l=!1;null===o&&(e.push(async()=>A.mkdirPromise(n,{mode:c.mode})),l=!0);const u=await i.readdirPromise(s);if(g.stableSort)for(const o of u.sort())await a(e,t,r,A,A.pathUtils.join(n,o),i,i.pathUtils.join(s,o),g)&&(l=!0);else{(await Promise.all(u.map(async o=>{await a(e,t,r,A,A.pathUtils.join(n,o),i,i.pathUtils.join(s,o),g)}))).some(e=>e)&&(l=!0)}return l}(e,t,r,A,n,p,c,g,d,l);break;case d.isFile():f=await async function(e,t,r,A,n,i,s,a,c,g){if(null!==i){if(!g.overwrite)return!1;e.push(async()=>A.removePromise(n)),i=null}const l=A===s?async()=>A.copyFilePromise(a,n,o().constants.COPYFILE_FICLONE):async()=>A.writeFilePromise(n,await s.readFilePromise(a));return e.push(async()=>l()),!0}(e,0,0,A,n,p,c,g,0,l);break;case d.isSymbolicLink():f=await async function(e,t,r,A,n,o,s,a,c,g){if(null!==o){if(!g.overwrite)return!1;e.push(async()=>A.removePromise(n)),o=null}return e.push(async()=>{await A.symlinkPromise((0,i.CI)(A.pathUtils,await s.readlinkPromise(a)),n)}),!0}(e,0,0,A,n,p,c,g,0,l);break;default:throw new Error(`Unsupported file type (${d.mode})`)}return(f||(null===(u=null==p?void 0:p.mtime)||void 0===u?void 0:u.getTime())!==C.mtime.getTime()||(null===(h=null==p?void 0:p.atime)||void 0===h?void 0:h.getTime())!==C.atime.getTime())&&(t.push(()=>r(n,C.atime,C.mtime)),f=!0),null!==p&&(511&p.mode)==(511&d.mode)||(t.push(()=>A.chmodPromise(n,511&d.mode)),f=!0),f}class c{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:t=!1}={}){const r=[e];for(;r.length>0;){const e=r.shift();if((await this.lstatPromise(e)).isDirectory()){const A=await this.readdirPromise(e);if(!t)throw new Error("Not supported");for(const t of A.sort())r.push(this.pathUtils.join(e,t))}else yield e}}async removePromise(e,{recursive:t=!0,maxRetries:r=5}={}){let A;try{A=await this.lstatPromise(e)}catch(e){if("ENOENT"===e.code)return;throw e}if(A.isDirectory()){if(t)for(const t of await this.readdirPromise(e))await this.removePromise(this.pathUtils.resolve(e,t));let A=0;do{try{await this.rmdirPromise(e);break}catch(e){if("EBUSY"===e.code||"ENOTEMPTY"===e.code){if(0===r)break;await new Promise(e=>setTimeout(e,100*A));continue}throw e}}while(A++e()))}(this,e,r,t,{overwrite:A,stableSort:n,stableTime:o})}copySync(e,t,{baseFs:r=this,overwrite:A=!0}={}){const n=r.lstatSync(t),o=this.existsSync(e);if(n.isDirectory()){this.mkdirpSync(e);const n=r.readdirSync(t);for(const o of n)this.copySync(this.pathUtils.join(e,o),r.pathUtils.join(t,o),{baseFs:r,overwrite:A})}else if(n.isFile()){if(!o||A){o&&this.removeSync(e);const A=r.readFileSync(t);this.writeFileSync(e,A)}}else{if(!n.isSymbolicLink())throw new Error(`Unsupported file type (file: ${t}, mode: 0o${n.mode.toString(8).padStart(6,"0")})`);if(!o||A){o&&this.removeSync(e);const A=r.readlinkSync(t);this.symlinkSync((0,i.CI)(this.pathUtils,A),e)}}const s=511&n.mode;this.chmodSync(e,s)}async changeFilePromise(e,t,r={}){return Buffer.isBuffer(t)?this.changeFileBufferPromise(e,t):this.changeFileTextPromise(e,t,r)}async changeFileBufferPromise(e,t){let r=Buffer.alloc(0);try{r=await this.readFilePromise(e)}catch(e){}0!==Buffer.compare(r,t)&&await this.writeFilePromise(e,t)}async changeFileTextPromise(e,t,{automaticNewlines:r}={}){let A="";try{A=await this.readFilePromise(e,"utf8")}catch(e){}const n=r?l(A,t):t;A!==n&&await this.writeFilePromise(e,n)}changeFileSync(e,t,r={}){return Buffer.isBuffer(t)?this.changeFileBufferSync(e,t):this.changeFileTextSync(e,t,r)}changeFileBufferSync(e,t){let r=Buffer.alloc(0);try{r=this.readFileSync(e)}catch(e){}0!==Buffer.compare(r,t)&&this.writeFileSync(e,t)}changeFileTextSync(e,t,{automaticNewlines:r=!1}={}){let A="";try{A=this.readFileSync(e,"utf8")}catch(e){}const n=r?l(A,t):t;A!==n&&this.writeFileSync(e,n)}async movePromise(e,t){try{await this.renamePromise(e,t)}catch(r){if("EXDEV"!==r.code)throw r;await this.copyPromise(t,e),await this.removePromise(e)}}moveSync(e,t){try{this.renameSync(e,t)}catch(r){if("EXDEV"!==r.code)throw r;this.copySync(t,e),this.removeSync(e)}}async lockPromise(e,t){const r=e+".flock",A=Date.now();let n=null;const o=async()=>{let e;try{[e]=await this.readJsonPromise(r)}catch(e){return Date.now()-A<500}try{return process.kill(e,0),!0}catch(e){return!1}};for(;null===n;)try{n=await this.openPromise(r,"wx")}catch(e){if("EEXIST"!==e.code)throw e;if(!await o())try{await this.unlinkPromise(r);continue}catch(e){}if(!(Date.now()-A<6e4))throw new Error(`Couldn't acquire a lock in a reasonable time (via ${r})`);await new Promise(e=>setTimeout(e,1e3/60))}await this.writePromise(n,JSON.stringify([process.pid]));try{return await t()}finally{try{await this.closePromise(n),await this.unlinkPromise(r)}catch(e){}}}async readJsonPromise(e){const t=await this.readFilePromise(e,"utf8");try{return JSON.parse(t)}catch(t){throw t.message+=` (in ${e})`,t}}readJsonSync(e){const t=this.readFileSync(e,"utf8");try{return JSON.parse(t)}catch(t){throw t.message+=` (in ${e})`,t}}async writeJsonPromise(e,t){return await this.writeFilePromise(e,JSON.stringify(t,null,2)+"\n")}writeJsonSync(e,t){return this.writeFileSync(e,JSON.stringify(t,null,2)+"\n")}async preserveTimePromise(e,t){const r=await this.lstatPromise(e),A=await t();void 0!==A&&(e=A),this.lutimesPromise?await this.lutimesPromise(e,r.atime,r.mtime):r.isSymbolicLink()||await this.utimesPromise(e,r.atime,r.mtime)}async preserveTimeSync(e,t){const r=this.lstatSync(e),A=t();void 0!==A&&(e=A),this.lutimesSync?this.lutimesSync(e,r.atime,r.mtime):r.isSymbolicLink()||this.utimesSync(e,r.atime,r.mtime)}}c.DEFAULT_TIME=315532800;class g extends c{constructor(){super(i.y1)}}function l(e,t){return t.replace(/\r?\n/g,function(e){const t=e.match(/\r?\n/g);if(null===t)return A.EOL;const r=t.filter(e=>"\r\n"===e).length;return r>t.length-r?"\r\n":"\n"}(e))}},10489:(e,t,r)=>{"use strict";r.d(t,{n:()=>s});var A=r(78420),n=r(42096),o=r(46009);const i=o.LZ.root;class s extends n.p{constructor(e,{baseFs:t=new A.S}={}){super(o.y1),this.target=this.pathUtils.resolve(o.LZ.root,e),this.baseFs=t}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(o.LZ.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){const t=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(i,e));if(t.match(/^\.\.\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(i,this.pathUtils.relative(this.target,e))}}},15037:(e,t,r)=>{"use strict";r.d(t,{v:()=>n});var A=r(42096);class n extends A.p{constructor(e,t){super(t),this.instance=null,this.factory=e}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(e){this.instance=e}mapFromBase(e){return e}mapToBase(e){return e}}},78420:(e,t,r)=>{"use strict";r.d(t,{S:()=>a});var A=r(35747),n=r.n(A),o=r(5944),i=r(26984),s=r(46009);class a extends o.fS{constructor(e=n()){super(),this.realFs=e,void 0!==this.realFs.lutimes&&(this.lutimesPromise=this.lutimesPromiseImpl,this.lutimesSync=this.lutimesSyncImpl)}getExtractHint(){return!1}getRealPath(){return s.LZ.root}resolve(e){return s.y1.resolve(e)}async openPromise(e,t,r){return await new Promise((A,n)=>{this.realFs.open(s.cS.fromPortablePath(e),t,r,this.makeCallback(A,n))})}openSync(e,t,r){return this.realFs.openSync(s.cS.fromPortablePath(e),t,r)}async opendirPromise(e,t){return await new Promise((r,A)=>{void 0!==t?this.realFs.opendir(s.cS.fromPortablePath(e),t,this.makeCallback(r,A)):this.realFs.opendir(s.cS.fromPortablePath(e),this.makeCallback(r,A))}).then(t=>Object.defineProperty(t,"path",{value:e,configurable:!0,writable:!0}))}opendirSync(e,t){const r=void 0!==t?this.realFs.opendirSync(s.cS.fromPortablePath(e),t):this.realFs.opendirSync(s.cS.fromPortablePath(e));return Object.defineProperty(r,"path",{value:e,configurable:!0,writable:!0})}async readPromise(e,t,r=0,A=0,n=-1){return await new Promise((o,i)=>{this.realFs.read(e,t,r,A,n,(e,t)=>{e?i(e):o(t)})})}readSync(e,t,r,A,n){return this.realFs.readSync(e,t,r,A,n)}async writePromise(e,t,r,A,n){return await new Promise((o,i)=>"string"==typeof t?this.realFs.write(e,t,r,this.makeCallback(o,i)):this.realFs.write(e,t,r,A,n,this.makeCallback(o,i)))}writeSync(e,t,r,A,n){return"string"==typeof t?this.realFs.writeSync(e,t,r):this.realFs.writeSync(e,t,r,A,n)}async closePromise(e){await new Promise((t,r)=>{this.realFs.close(e,this.makeCallback(t,r))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,t){const r=null!==e?s.cS.fromPortablePath(e):e;return this.realFs.createReadStream(r,t)}createWriteStream(e,t){const r=null!==e?s.cS.fromPortablePath(e):e;return this.realFs.createWriteStream(r,t)}async realpathPromise(e){return await new Promise((t,r)=>{this.realFs.realpath(s.cS.fromPortablePath(e),{},this.makeCallback(t,r))}).then(e=>s.cS.toPortablePath(e))}realpathSync(e){return s.cS.toPortablePath(this.realFs.realpathSync(s.cS.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(t=>{this.realFs.exists(s.cS.fromPortablePath(e),t)})}accessSync(e,t){return this.realFs.accessSync(s.cS.fromPortablePath(e),t)}async accessPromise(e,t){return await new Promise((r,A)=>{this.realFs.access(s.cS.fromPortablePath(e),t,this.makeCallback(r,A))})}existsSync(e){return this.realFs.existsSync(s.cS.fromPortablePath(e))}async statPromise(e){return await new Promise((t,r)=>{this.realFs.stat(s.cS.fromPortablePath(e),this.makeCallback(t,r))})}statSync(e){return this.realFs.statSync(s.cS.fromPortablePath(e))}async lstatPromise(e){return await new Promise((t,r)=>{this.realFs.lstat(s.cS.fromPortablePath(e),this.makeCallback(t,r))})}lstatSync(e){return this.realFs.lstatSync(s.cS.fromPortablePath(e))}async chmodPromise(e,t){return await new Promise((r,A)=>{this.realFs.chmod(s.cS.fromPortablePath(e),t,this.makeCallback(r,A))})}chmodSync(e,t){return this.realFs.chmodSync(s.cS.fromPortablePath(e),t)}async chownPromise(e,t,r){return await new Promise((A,n)=>{this.realFs.chown(s.cS.fromPortablePath(e),t,r,this.makeCallback(A,n))})}chownSync(e,t,r){return this.realFs.chownSync(s.cS.fromPortablePath(e),t,r)}async renamePromise(e,t){return await new Promise((r,A)=>{this.realFs.rename(s.cS.fromPortablePath(e),s.cS.fromPortablePath(t),this.makeCallback(r,A))})}renameSync(e,t){return this.realFs.renameSync(s.cS.fromPortablePath(e),s.cS.fromPortablePath(t))}async copyFilePromise(e,t,r=0){return await new Promise((A,n)=>{this.realFs.copyFile(s.cS.fromPortablePath(e),s.cS.fromPortablePath(t),r,this.makeCallback(A,n))})}copyFileSync(e,t,r=0){return this.realFs.copyFileSync(s.cS.fromPortablePath(e),s.cS.fromPortablePath(t),r)}async appendFilePromise(e,t,r){return await new Promise((A,n)=>{const o="string"==typeof e?s.cS.fromPortablePath(e):e;r?this.realFs.appendFile(o,t,r,this.makeCallback(A,n)):this.realFs.appendFile(o,t,this.makeCallback(A,n))})}appendFileSync(e,t,r){const A="string"==typeof e?s.cS.fromPortablePath(e):e;r?this.realFs.appendFileSync(A,t,r):this.realFs.appendFileSync(A,t)}async writeFilePromise(e,t,r){return await new Promise((A,n)=>{const o="string"==typeof e?s.cS.fromPortablePath(e):e;r?this.realFs.writeFile(o,t,r,this.makeCallback(A,n)):this.realFs.writeFile(o,t,this.makeCallback(A,n))})}writeFileSync(e,t,r){const A="string"==typeof e?s.cS.fromPortablePath(e):e;r?this.realFs.writeFileSync(A,t,r):this.realFs.writeFileSync(A,t)}async unlinkPromise(e){return await new Promise((t,r)=>{this.realFs.unlink(s.cS.fromPortablePath(e),this.makeCallback(t,r))})}unlinkSync(e){return this.realFs.unlinkSync(s.cS.fromPortablePath(e))}async utimesPromise(e,t,r){return await new Promise((A,n)=>{this.realFs.utimes(s.cS.fromPortablePath(e),t,r,this.makeCallback(A,n))})}utimesSync(e,t,r){this.realFs.utimesSync(s.cS.fromPortablePath(e),t,r)}async lutimesPromiseImpl(e,t,r){const A=this.realFs.lutimes;if(void 0===A)throw(0,i.bk)("unavailable Node binding",`lutimes '${e}'`);return await new Promise((n,o)=>{A.call(this.realFs,s.cS.fromPortablePath(e),t,r,this.makeCallback(n,o))})}lutimesSyncImpl(e,t,r){const A=this.realFs.lutimesSync;if(void 0===A)throw(0,i.bk)("unavailable Node binding",`lutimes '${e}'`);A.call(this.realFs,s.cS.fromPortablePath(e),t,r)}async mkdirPromise(e,t){return await new Promise((r,A)=>{this.realFs.mkdir(s.cS.fromPortablePath(e),t,this.makeCallback(r,A))})}mkdirSync(e,t){return this.realFs.mkdirSync(s.cS.fromPortablePath(e),t)}async rmdirPromise(e,t){return await new Promise((r,A)=>{t?this.realFs.rmdir(s.cS.fromPortablePath(e),t,this.makeCallback(r,A)):this.realFs.rmdir(s.cS.fromPortablePath(e),this.makeCallback(r,A))})}rmdirSync(e,t){return this.realFs.rmdirSync(s.cS.fromPortablePath(e),t)}async linkPromise(e,t){return await new Promise((r,A)=>{this.realFs.link(s.cS.fromPortablePath(e),s.cS.fromPortablePath(t),this.makeCallback(r,A))})}linkSync(e,t){return this.realFs.linkSync(s.cS.fromPortablePath(e),s.cS.fromPortablePath(t))}async symlinkPromise(e,t,r){const A=r||(e.endsWith("/")?"dir":"file");return await new Promise((r,n)=>{this.realFs.symlink(s.cS.fromPortablePath(e.replace(/\/+$/,"")),s.cS.fromPortablePath(t),A,this.makeCallback(r,n))})}symlinkSync(e,t,r){const A=r||(e.endsWith("/")?"dir":"file");return this.realFs.symlinkSync(s.cS.fromPortablePath(e.replace(/\/+$/,"")),s.cS.fromPortablePath(t),A)}async readFilePromise(e,t){return await new Promise((r,A)=>{const n="string"==typeof e?s.cS.fromPortablePath(e):e;this.realFs.readFile(n,t,this.makeCallback(r,A))})}readFileSync(e,t){const r="string"==typeof e?s.cS.fromPortablePath(e):e;return this.realFs.readFileSync(r,t)}async readdirPromise(e,{withFileTypes:t}={}){return await new Promise((r,A)=>{t?this.realFs.readdir(s.cS.fromPortablePath(e),{withFileTypes:!0},this.makeCallback(r,A)):this.realFs.readdir(s.cS.fromPortablePath(e),this.makeCallback(e=>r(e),A))})}readdirSync(e,{withFileTypes:t}={}){return t?this.realFs.readdirSync(s.cS.fromPortablePath(e),{withFileTypes:!0}):this.realFs.readdirSync(s.cS.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((t,r)=>{this.realFs.readlink(s.cS.fromPortablePath(e),this.makeCallback(t,r))}).then(e=>s.cS.toPortablePath(e))}readlinkSync(e){return s.cS.toPortablePath(this.realFs.readlinkSync(s.cS.fromPortablePath(e)))}async truncatePromise(e,t){return await new Promise((r,A)=>{this.realFs.truncate(s.cS.fromPortablePath(e),t,this.makeCallback(r,A))})}truncateSync(e,t){return this.realFs.truncateSync(s.cS.fromPortablePath(e),t)}watch(e,t,r){return this.realFs.watch(s.cS.fromPortablePath(e),t,r)}watchFile(e,t,r){return this.realFs.watchFile(s.cS.fromPortablePath(e),t,r)}unwatchFile(e,t){return this.realFs.unwatchFile(s.cS.fromPortablePath(e),t)}makeCallback(e,t){return(r,A)=>{r?t(r):e(A)}}}},39725:(e,t,r)=>{"use strict";r.d(t,{i:()=>o});var A=r(42096),n=r(46009);class o extends A.p{constructor(e){super(n.cS),this.baseFs=e}mapFromBase(e){return n.cS.fromPortablePath(e)}mapToBase(e){return n.cS.toPortablePath(e)}}},42096:(e,t,r)=>{"use strict";r.d(t,{p:()=>n});var A=r(5944);class n extends A.uY{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,t,r){return this.baseFs.openPromise(this.mapToBase(e),t,r)}openSync(e,t,r){return this.baseFs.openSync(this.mapToBase(e),t,r)}async opendirPromise(e,t){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),t),{path:e})}opendirSync(e,t){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),t),{path:e})}async readPromise(e,t,r,A,n){return await this.baseFs.readPromise(e,t,r,A,n)}readSync(e,t,r,A,n){return this.baseFs.readSync(e,t,r,A,n)}async writePromise(e,t,r,A,n){return"string"==typeof t?await this.baseFs.writePromise(e,t,r):await this.baseFs.writePromise(e,t,r,A,n)}writeSync(e,t,r,A,n){return"string"==typeof t?this.baseFs.writeSync(e,t,r):this.baseFs.writeSync(e,t,r,A,n)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,t){return this.baseFs.createReadStream(null!==e?this.mapToBase(e):e,t)}createWriteStream(e,t){return this.baseFs.createWriteStream(null!==e?this.mapToBase(e):e,t)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,t){return this.baseFs.accessSync(this.mapToBase(e),t)}async accessPromise(e,t){return this.baseFs.accessPromise(this.mapToBase(e),t)}async statPromise(e){return this.baseFs.statPromise(this.mapToBase(e))}statSync(e){return this.baseFs.statSync(this.mapToBase(e))}async lstatPromise(e){return this.baseFs.lstatPromise(this.mapToBase(e))}lstatSync(e){return this.baseFs.lstatSync(this.mapToBase(e))}async chmodPromise(e,t){return this.baseFs.chmodPromise(this.mapToBase(e),t)}chmodSync(e,t){return this.baseFs.chmodSync(this.mapToBase(e),t)}async chownPromise(e,t,r){return this.baseFs.chownPromise(this.mapToBase(e),t,r)}chownSync(e,t,r){return this.baseFs.chownSync(this.mapToBase(e),t,r)}async renamePromise(e,t){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(t))}renameSync(e,t){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(t))}async copyFilePromise(e,t,r=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(t),r)}copyFileSync(e,t,r=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(t),r)}async appendFilePromise(e,t,r){return this.baseFs.appendFilePromise(this.fsMapToBase(e),t,r)}appendFileSync(e,t,r){return this.baseFs.appendFileSync(this.fsMapToBase(e),t,r)}async writeFilePromise(e,t,r){return this.baseFs.writeFilePromise(this.fsMapToBase(e),t,r)}writeFileSync(e,t,r){return this.baseFs.writeFileSync(this.fsMapToBase(e),t,r)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,t,r){return this.baseFs.utimesPromise(this.mapToBase(e),t,r)}utimesSync(e,t,r){return this.baseFs.utimesSync(this.mapToBase(e),t,r)}async mkdirPromise(e,t){return this.baseFs.mkdirPromise(this.mapToBase(e),t)}mkdirSync(e,t){return this.baseFs.mkdirSync(this.mapToBase(e),t)}async rmdirPromise(e,t){return this.baseFs.rmdirPromise(this.mapToBase(e),t)}rmdirSync(e,t){return this.baseFs.rmdirSync(this.mapToBase(e),t)}async linkPromise(e,t){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(t))}linkSync(e,t){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(t))}async symlinkPromise(e,t,r){return this.baseFs.symlinkPromise(this.mapToBase(e),this.mapToBase(t),r)}symlinkSync(e,t,r){return this.baseFs.symlinkSync(this.mapToBase(e),this.mapToBase(t),r)}async readFilePromise(e,t){return this.baseFs.readFilePromise(this.fsMapToBase(e),t)}readFileSync(e,t){return this.baseFs.readFileSync(this.fsMapToBase(e),t)}async readdirPromise(e,{withFileTypes:t}={}){return this.baseFs.readdirPromise(this.mapToBase(e),{withFileTypes:t})}readdirSync(e,{withFileTypes:t}={}){return this.baseFs.readdirSync(this.mapToBase(e),{withFileTypes:t})}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,t){return this.baseFs.truncatePromise(this.mapToBase(e),t)}truncateSync(e,t){return this.baseFs.truncateSync(this.mapToBase(e),t)}watch(e,t,r){return this.baseFs.watch(this.mapToBase(e),t,r)}watchFile(e,t,r){return this.baseFs.watchFile(this.mapToBase(e),t,r)}unwatchFile(e,t){return this.baseFs.unwatchFile(this.mapToBase(e),t)}fsMapToBase(e){return"number"==typeof e?e:this.mapToBase(e)}}},17674:(e,t,r)=>{"use strict";r.d(t,{p:()=>c});var A=r(78420),n=r(42096),o=r(46009);const i=/^[0-9]+$/,s=/^(\/(?:[^/]+\/)*?\$\$virtual)((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,a=/^([^/]+-)?[a-f0-9]+$/;class c extends n.p{constructor({baseFs:e=new A.S}={}){super(o.y1),this.baseFs=e}static makeVirtualPath(e,t,r){if("$$virtual"!==o.y1.basename(e))throw new Error('Assertion failed: Virtual folders must be named "$$virtual"');if(!o.y1.basename(t).match(a))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");const A=o.y1.relative(o.y1.dirname(e),r).split("/");let n=0;for(;n{"use strict";r.d(t,{k:()=>C,d:()=>f});var A=r(35747),n=r(92413),o=r(31669),i=r(78761),s=r.n(i),a=r(5944),c=r(78420),g=r(19697),l=r(38783),u=r(22004),h=r(26984),p=r(46009),d=r(65760);const C="mixed";class f extends a.fS{constructor(e,t){super(),this.lzSource=null,this.listings=new Map,this.entries=new Map,this.fileSources=new Map,this.fds=new Map,this.nextFd=0,this.ready=!1,this.readOnly=!1,this.libzip=t.libzip;const r=t;if(this.level=void 0!==r.level?r.level:C,null===e&&(e=Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])),"string"==typeof e){const{baseFs:t=new c.S}=r;this.baseFs=t,this.path=e}else this.path=null,this.baseFs=null;if(t.stats)this.stats=t.stats;else if("string"==typeof e)try{this.stats=this.baseFs.statSync(e)}catch(e){if("ENOENT"!==e.code||!r.create)throw e;this.stats=d.makeDefaultStats()}else this.stats=d.makeDefaultStats();const A=this.libzip.malloc(4);try{let n=0;if("string"==typeof e&&r.create&&(n|=this.libzip.ZIP_CREATE|this.libzip.ZIP_TRUNCATE),t.readOnly&&(n|=this.libzip.ZIP_RDONLY,this.readOnly=!0),"string"==typeof e)this.zip=this.libzip.open(p.cS.fromPortablePath(e),n,A);else{const t=this.allocateUnattachedSource(e);try{this.zip=this.libzip.openFromSource(t,n,A),this.lzSource=t}catch(e){throw this.libzip.source.free(t),e}}if(0===this.zip){const e=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(e,this.libzip.getValue(A,"i32")),this.makeLibzipError(e)}}finally{this.libzip.free(A)}this.listings.set(p.LZ.root,new Set);const n=this.libzip.getNumEntries(this.zip,0);for(let e=0;ee)throw new Error("Overread");const A=this.libzip.HEAPU8.subarray(t,t+e);return Buffer.from(A)}finally{this.libzip.free(t)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}prepareClose(){if(!this.ready)throw h.Vw("archive closed, close");(0,l.L)(this)}saveAndClose(){if(!this.path||!this.baseFs)throw new Error("ZipFS cannot be saved and must be discarded when loaded from a buffer");if(this.prepareClose(),this.readOnly)return void this.discardAndClose();const e=this.baseFs.existsSync(this.path)?511&this.baseFs.statSync(this.path).mode:null;if(-1===this.libzip.close(this.zip))throw this.makeLibzipError(this.libzip.getError(this.zip));null===e?this.baseFs.chmodSync(this.path,this.stats.mode):e!==(511&this.baseFs.statSync(this.path).mode)&&this.baseFs.chmodSync(this.path,e),this.ready=!1}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}resolve(e){return p.y1.resolve(p.LZ.root,e)}async openPromise(e,t,r){return this.openSync(e,t,r)}openSync(e,t,r){const A=this.nextFd++;return this.fds.set(A,{cursor:0,p:e}),A}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(e,t){return this.opendirSync(e,t)}opendirSync(e,t={}){const r=this.resolveFilename(`opendir '${e}'`,e);if(!this.entries.has(r)&&!this.listings.has(r))throw h.z6(`opendir '${e}'`);const A=this.listings.get(r);if(!A)throw h.Ab(`opendir '${e}'`);const n=[...A],o=this.openSync(r,"r");return(0,g.a)(this,r,n,{onClose:()=>{this.closeSync(o)}})}async readPromise(e,t,r,A,n){return this.readSync(e,t,r,A,n)}readSync(e,t,r=0,A=0,n=-1){const o=this.fds.get(e);if(void 0===o)throw h.Ch("read");let i;i=-1===n||null===n?o.cursor:n;const s=this.readFileSync(o.p);s.copy(t,r,i,i+A);const a=Math.max(0,Math.min(s.length-i,A));return-1!==n&&null!==n||(o.cursor+=a),a}async writePromise(e,t,r,A,n){return"string"==typeof t?this.writeSync(e,t,n):this.writeSync(e,t,r,A,n)}writeSync(e,t,r,A,n){if(void 0===this.fds.get(e))throw h.Ch("read");throw new Error("Unimplemented")}async closePromise(e){return this.closeSync(e)}closeSync(e){if(void 0===this.fds.get(e))throw h.Ch("read");this.fds.delete(e)}createReadStream(e,{encoding:t}={}){if(null===e)throw new Error("Unimplemented");const r=this.openSync(e,"r"),A=Object.assign(new n.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(e,t)=>{clearImmediate(o),this.closeSync(r),t(e)}}),{close(){A.destroy()},bytesRead:0,path:e}),o=setImmediate(async()=>{try{const r=await this.readFilePromise(e,t);A.bytesRead=r.length,A.end(r)}catch(e){A.destroy(e)}});return A}createWriteStream(e,{encoding:t}={}){if(this.readOnly)throw h.YW(`open '${e}'`);if(null===e)throw new Error("Unimplemented");const r=[],A=this.openSync(e,"w"),o=Object.assign(new n.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(n,o)=>{try{n?o(n):(this.writeFileSync(e,Buffer.concat(r),t),o(null))}catch(e){o(e)}finally{this.closeSync(A)}}}),{bytesWritten:0,path:e,close(){o.destroy()}});return o.on("data",e=>{const t=Buffer.from(e);o.bytesWritten+=t.length,r.push(t)}),o}async realpathPromise(e){return this.realpathSync(e)}realpathSync(e){const t=this.resolveFilename(`lstat '${e}'`,e);if(!this.entries.has(t)&&!this.listings.has(t))throw h.z6(`lstat '${e}'`);return t}async existsPromise(e){return this.existsSync(e)}existsSync(e){if(!this.ready)throw h.Vw(`archive closed, existsSync '${e}'`);if(0===this.symlinkCount){const t=p.y1.resolve(p.LZ.root,e);return this.entries.has(t)||this.listings.has(t)}let t;try{t=this.resolveFilename(`stat '${e}'`,e)}catch(e){return!1}return this.entries.has(t)||this.listings.has(t)}async accessPromise(e,t){return this.accessSync(e,t)}accessSync(e,t=A.constants.F_OK){const r=this.resolveFilename(`access '${e}'`,e);if(!this.entries.has(r)&&!this.listings.has(r))throw h.z6(`access '${e}'`);if(this.readOnly&&t&A.constants.W_OK)throw h.YW(`access '${e}'`)}async statPromise(e){return this.statSync(e)}statSync(e){const t=this.resolveFilename(`stat '${e}'`,e);if(!this.entries.has(t)&&!this.listings.has(t))throw h.z6(`stat '${e}'`);if("/"===e[e.length-1]&&!this.listings.has(t))throw h.Ab(`stat '${e}'`);return this.statImpl(`stat '${e}'`,t)}async lstatPromise(e){return this.lstatSync(e)}lstatSync(e){const t=this.resolveFilename(`lstat '${e}'`,e,!1);if(!this.entries.has(t)&&!this.listings.has(t))throw h.z6(`lstat '${e}'`);if("/"===e[e.length-1]&&!this.listings.has(t))throw h.Ab(`lstat '${e}'`);return this.statImpl(`lstat '${e}'`,t)}statImpl(e,t){const r=this.entries.get(t);if(void 0!==r){const e=this.libzip.struct.statS();if(-1===this.libzip.statIndex(this.zip,r,0,0,e))throw this.makeLibzipError(this.libzip.getError(this.zip));const A=this.stats.uid,n=this.stats.gid,o=this.libzip.struct.statSize(e)>>>0,i=512,s=Math.ceil(o/i),a=1e3*(this.libzip.struct.statMtime(e)>>>0),c=a,g=a,l=a,h=new Date(c),p=new Date(g),C=new Date(l),f=new Date(a),I=this.listings.has(t)?u.QB:this.isSymbolicLink(r)?u.Zv:u.Pe,E=I===u.QB?493:420,B=I|511&this.getUnixMode(r,E);return Object.assign(new d.StatEntry,{uid:A,gid:n,size:o,blksize:i,blocks:s,atime:h,birthtime:p,ctime:C,mtime:f,atimeMs:c,birthtimeMs:g,ctimeMs:l,mtimeMs:a,mode:B})}if(this.listings.has(t)){const e=this.stats.uid,t=this.stats.gid,r=0,A=512,n=0,o=this.stats.mtimeMs,i=this.stats.mtimeMs,s=this.stats.mtimeMs,a=this.stats.mtimeMs,c=new Date(o),g=new Date(i),l=new Date(s),h=new Date(a),p=493|u.QB;return Object.assign(new d.StatEntry,{uid:e,gid:t,size:r,blksize:A,blocks:n,atime:c,birthtime:g,ctime:l,mtime:h,atimeMs:o,birthtimeMs:i,ctimeMs:s,mtimeMs:a,mode:p})}throw new Error("Unreachable")}getUnixMode(e,t){if(-1===this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S))throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?t:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(e){let t=this.listings.get(e);if(t)return t;const r=this.registerListing(p.y1.dirname(e));return t=new Set,r.add(p.y1.basename(e)),this.listings.set(e,t),t}registerEntry(e,t){this.registerListing(p.y1.dirname(e)).add(p.y1.basename(e)),this.entries.set(e,t)}unregisterListing(e){this.listings.delete(e);const t=this.listings.get(p.y1.dirname(e));null==t||t.delete(p.y1.basename(e))}unregisterEntry(e){this.unregisterListing(e);const t=this.entries.get(e);this.entries.delete(e),void 0!==t&&(this.fileSources.delete(t),this.isSymbolicLink(t)&&this.symlinkCount--)}deleteEntry(e,t){this.unregisterEntry(e);if(-1===this.libzip.delete(this.zip,t))throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(e,t,r=!0){if(!this.ready)throw h.Vw("archive closed, "+e);let A=p.y1.resolve(p.LZ.root,t);if("/"===A)return p.LZ.root;const n=this.entries.get(A);if(r&&void 0!==n){if(0!==this.symlinkCount&&this.isSymbolicLink(n)){const t=this.getFileSource(n).toString();return this.resolveFilename(e,p.y1.resolve(p.y1.dirname(A),t),!0)}return A}for(;;){const t=this.resolveFilename(e,p.y1.dirname(A),!0),n=this.listings.has(t),o=this.entries.has(t);if(!n&&!o)throw h.z6(e);if(!n)throw h.Ab(e);if(A=p.y1.resolve(t,p.y1.basename(A)),!r||0===this.symlinkCount)break;const i=this.libzip.name.locate(this.zip,A.slice(1));if(-1===i)break;if(!this.isSymbolicLink(i))break;{const e=this.getFileSource(i).toString();A=p.y1.resolve(p.y1.dirname(A),e)}}return A}allocateBuffer(e){Buffer.isBuffer(e)||(e=Buffer.from(e));const t=this.libzip.malloc(e.byteLength);if(!t)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,t,e.byteLength).set(e),{buffer:t,byteLength:e.byteLength}}allocateUnattachedSource(e){const t=this.libzip.struct.errorS(),{buffer:r,byteLength:A}=this.allocateBuffer(e),n=this.libzip.source.fromUnattachedBuffer(r,A,0,!0,t);if(0===n)throw this.libzip.free(t),this.makeLibzipError(t);return n}allocateSource(e){const{buffer:t,byteLength:r}=this.allocateBuffer(e),A=this.libzip.source.fromBuffer(this.zip,t,r,0,!0);if(0===A)throw this.libzip.free(t),this.makeLibzipError(this.libzip.getError(this.zip));return A}setFileSource(e,t){const r=Buffer.isBuffer(t)?t:Buffer.from(t),A=p.y1.relative(p.LZ.root,e),n=this.allocateSource(t);try{const e=this.libzip.file.add(this.zip,A,n,this.libzip.ZIP_FL_OVERWRITE);if(-1===e)throw this.makeLibzipError(this.libzip.getError(this.zip));if("mixed"!==this.level){let t;t=0===this.level?this.libzip.ZIP_CM_STORE:this.libzip.ZIP_CM_DEFLATE;if(-1===this.libzip.file.setCompression(this.zip,e,0,t,this.level))throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(e,r),e}catch(e){throw this.libzip.source.free(n),e}}isSymbolicLink(e){if(0===this.symlinkCount)return!1;if(-1===this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S))throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX)return!1;return(this.libzip.getValue(this.libzip.uint32S,"i32")>>>16&u.wK)===u.Zv}getFileSource(e,t={asyncDecompress:!1}){const r=this.fileSources.get(e);if(void 0!==r)return r;const A=this.libzip.struct.statS();if(-1===this.libzip.statIndex(this.zip,e,0,0,A))throw this.makeLibzipError(this.libzip.getError(this.zip));const n=this.libzip.struct.statCompSize(A),o=this.libzip.struct.statCompMethod(A),i=this.libzip.malloc(n);try{const r=this.libzip.fopenIndex(this.zip,e,0,this.libzip.ZIP_FL_COMPRESSED);if(0===r)throw this.makeLibzipError(this.libzip.getError(this.zip));try{const A=this.libzip.fread(r,i,n,0);if(-1===A)throw this.makeLibzipError(this.libzip.file.getError(r));if(An)throw new Error("Overread");const a=this.libzip.HEAPU8.subarray(i,i+n),c=Buffer.from(a);if(0===o)return this.fileSources.set(e,c),c;if(t.asyncDecompress)return new Promise((t,r)=>{s().inflateRaw(c,(A,n)=>{A?r(A):(this.fileSources.set(e,n),t(n))})});{const t=s().inflateRawSync(c);return this.fileSources.set(e,t),t}}finally{this.libzip.fclose(r)}}finally{this.libzip.free(i)}}async chmodPromise(e,t){return this.chmodSync(e,t)}chmodSync(e,t){if(this.readOnly)throw h.YW(`chmod '${e}'`);t&=493;const r=this.resolveFilename(`chmod '${e}'`,e,!1),A=this.entries.get(r);if(void 0===A)throw new Error(`Assertion failed: The entry should have been registered (${r})`);const n=-512&this.getUnixMode(A,0|u.Pe)|t;if(-1===this.libzip.file.setExternalAttributes(this.zip,A,0,0,this.libzip.ZIP_OPSYS_UNIX,n<<16))throw this.makeLibzipError(this.libzip.getError(this.zip))}async chownPromise(e,t,r){return this.chownSync(e,t,r)}chownSync(e,t,r){throw new Error("Unimplemented")}async renamePromise(e,t){return this.renameSync(e,t)}renameSync(e,t){throw new Error("Unimplemented")}async copyFilePromise(e,t,r){const{indexSource:A,indexDest:n,resolvedDestP:o}=this.prepareCopyFile(e,t,r),i=await this.getFileSource(A,{asyncDecompress:!0}),s=this.setFileSource(o,i);s!==n&&this.registerEntry(o,s)}copyFileSync(e,t,r=0){const{indexSource:A,indexDest:n,resolvedDestP:o}=this.prepareCopyFile(e,t,r),i=this.getFileSource(A),s=this.setFileSource(o,i);s!==n&&this.registerEntry(o,s)}prepareCopyFile(e,t,r=0){if(this.readOnly)throw h.YW(`copyfile '${e} -> '${t}'`);if(0!=(r&A.constants.COPYFILE_FICLONE_FORCE))throw h.bk("unsupported clone operation",`copyfile '${e}' -> ${t}'`);const n=this.resolveFilename(`copyfile '${e} -> ${t}'`,e),o=this.entries.get(n);if(void 0===o)throw h.hq(`copyfile '${e}' -> '${t}'`);const i=this.resolveFilename(`copyfile '${e}' -> ${t}'`,t),s=this.entries.get(i);if(0!=(r&(A.constants.COPYFILE_EXCL|A.constants.COPYFILE_FICLONE_FORCE))&&void 0!==s)throw h.cT(`copyfile '${e}' -> '${t}'`);return{indexSource:o,resolvedDestP:i,indexDest:s}}async appendFilePromise(e,t,r){if(this.readOnly)throw h.YW(`open '${e}'`);return void 0===r?r={flag:"a"}:"string"==typeof r?r={flag:"a",encoding:r}:void 0===r.flag&&(r={flag:"a",...r}),this.writeFilePromise(e,t,r)}appendFileSync(e,t,r={}){if(this.readOnly)throw h.YW(`open '${e}'`);return void 0===r?r={flag:"a"}:"string"==typeof r?r={flag:"a",encoding:r}:void 0===r.flag&&(r={flag:"a",...r}),this.writeFileSync(e,t,r)}async writeFilePromise(e,t,r){const{encoding:A,index:n,resolvedP:o}=this.prepareWriteFile(e,r);void 0!==n&&"object"==typeof r&&r.flag&&r.flag.includes("a")&&(t=Buffer.concat([await this.getFileSource(n,{asyncDecompress:!0}),Buffer.from(t)])),null!==A&&(t=t.toString(A));const i=this.setFileSource(o,t);i!==n&&this.registerEntry(o,i)}writeFileSync(e,t,r){const{encoding:A,index:n,resolvedP:o}=this.prepareWriteFile(e,r);void 0!==n&&"object"==typeof r&&r.flag&&r.flag.includes("a")&&(t=Buffer.concat([this.getFileSource(n),Buffer.from(t)])),null!==A&&(t=t.toString(A));const i=this.setFileSource(o,t);i!==n&&this.registerEntry(o,i)}prepareWriteFile(e,t){if("string"!=typeof e)throw h.Ch("read");if(this.readOnly)throw h.YW(`open '${e}'`);const r=this.resolveFilename(`open '${e}'`,e);if(this.listings.has(r))throw h.GA(`open '${e}'`);let A=null;"string"==typeof t?A=t:"object"==typeof t&&t.encoding&&(A=t.encoding);return{encoding:A,resolvedP:r,index:this.entries.get(r)}}async unlinkPromise(e){return this.unlinkSync(e)}unlinkSync(e){if(this.readOnly)throw h.YW(`unlink '${e}'`);const t=this.resolveFilename(`unlink '${e}'`,e);if(this.listings.has(t))throw h.GA(`unlink '${e}'`);const r=this.entries.get(t);if(void 0===r)throw h.hq(`unlink '${e}'`);this.deleteEntry(t,r)}async utimesPromise(e,t,r){return this.utimesSync(e,t,r)}utimesSync(e,t,r){if(this.readOnly)throw h.YW(`utimes '${e}'`);const A=this.resolveFilename(`utimes '${e}'`,e);this.utimesImpl(A,r)}async lutimesPromise(e,t,r){return this.lutimesSync(e,t,r)}lutimesSync(e,t,r){if(this.readOnly)throw h.YW(`lutimes '${e}'`);const A=this.resolveFilename(`utimes '${e}'`,e,!1);this.utimesImpl(A,r)}utimesImpl(e,t){this.listings.has(e)&&(this.entries.has(e)||this.hydrateDirectory(e));const r=this.entries.get(e);if(void 0===r)throw new Error("Unreachable");if(-1===this.libzip.file.setMtime(this.zip,r,0,function(e){if("string"==typeof e&&String(+e)===e)return+e;if(Number.isFinite(e))return e<0?Date.now()/1e3:e;if((0,o.isDate)(e))return e.getTime()/1e3;throw new Error("Invalid time")}(t),0))throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(e,t){return this.mkdirSync(e,t)}mkdirSync(e,{mode:t=493,recursive:r=!1}={}){if(r)return void this.mkdirpSync(e,{chmod:t});if(this.readOnly)throw h.YW(`mkdir '${e}'`);const A=this.resolveFilename(`mkdir '${e}'`,e);if(this.entries.has(A)||this.listings.has(A))throw h.cT(`mkdir '${e}'`);this.hydrateDirectory(A),this.chmodSync(A,t)}async rmdirPromise(e,t){return this.rmdirSync(e,t)}rmdirSync(e,{recursive:t=!1}={}){if(this.readOnly)throw h.YW(`rmdir '${e}'`);if(t)return void this.removeSync(e);const r=this.resolveFilename(`rmdir '${e}'`,e),A=this.listings.get(r);if(!A)throw h.Ab(`rmdir '${e}'`);if(A.size>0)throw h.re(`rmdir '${e}'`);const n=this.entries.get(r);if(void 0===n)throw h.hq(`rmdir '${e}'`);this.deleteEntry(e,n)}hydrateDirectory(e){const t=this.libzip.dir.add(this.zip,p.y1.relative(p.LZ.root,e));if(-1===t)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(e),this.registerEntry(e,t),t}async linkPromise(e,t){return this.linkSync(e,t)}linkSync(e,t){throw h.Hs(`link '${e}' -> '${t}'`)}async symlinkPromise(e,t){return this.symlinkSync(e,t)}symlinkSync(e,t){if(this.readOnly)throw h.YW(`symlink '${e}' -> '${t}'`);const r=this.resolveFilename(`symlink '${e}' -> '${t}'`,t);if(this.listings.has(r))throw h.GA(`symlink '${e}' -> '${t}'`);if(this.entries.has(r))throw h.cT(`symlink '${e}' -> '${t}'`);const A=this.setFileSource(r,e);this.registerEntry(r,A);if(-1===this.libzip.file.setExternalAttributes(this.zip,A,0,0,this.libzip.ZIP_OPSYS_UNIX,(511|u.Zv)<<16))throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(e,t){"object"==typeof t&&(t=t?t.encoding:void 0);const r=await this.readFileBuffer(e,{asyncDecompress:!0});return t?r.toString(t):r}readFileSync(e,t){"object"==typeof t&&(t=t?t.encoding:void 0);const r=this.readFileBuffer(e);return t?r.toString(t):r}readFileBuffer(e,t={asyncDecompress:!1}){if("string"!=typeof e)throw h.Ch("read");const r=this.resolveFilename(`open '${e}'`,e);if(!this.entries.has(r)&&!this.listings.has(r))throw h.z6(`open '${e}'`);if("/"===e[e.length-1]&&!this.listings.has(r))throw h.Ab(`open '${e}'`);if(this.listings.has(r))throw h.GA("read");const A=this.entries.get(r);if(void 0===A)throw new Error("Unreachable");return this.getFileSource(A,t)}async readdirPromise(e,{withFileTypes:t}={}){return this.readdirSync(e,{withFileTypes:t})}readdirSync(e,{withFileTypes:t}={}){const r=this.resolveFilename(`scandir '${e}'`,e);if(!this.entries.has(r)&&!this.listings.has(r))throw h.z6(`scandir '${e}'`);const A=this.listings.get(r);if(!A)throw h.Ab(`scandir '${e}'`);const n=[...A];return t?n.map(t=>Object.assign(this.statImpl("lstat",p.y1.join(e,t)),{name:t})):n}async readlinkPromise(e){const t=this.prepareReadlink(e);return(await this.getFileSource(t,{asyncDecompress:!0})).toString()}readlinkSync(e){const t=this.prepareReadlink(e);return this.getFileSource(t).toString()}prepareReadlink(e){const t=this.resolveFilename(`readlink '${e}'`,e,!1);if(!this.entries.has(t)&&!this.listings.has(t))throw h.z6(`readlink '${e}'`);if("/"===e[e.length-1]&&!this.listings.has(t))throw h.Ab(`open '${e}'`);if(this.listings.has(t))throw h.hq(`readlink '${e}'`);const r=this.entries.get(t);if(void 0===r)throw new Error("Unreachable");if(!this.isSymbolicLink(r))throw h.hq(`readlink '${e}'`);return r}async truncatePromise(e,t=0){const r=this.resolveFilename(`open '${e}'`,e),A=this.entries.get(r);if(void 0===A)throw h.hq(`open '${e}'`);const n=await this.getFileSource(A,{asyncDecompress:!0}),o=Buffer.alloc(t,0);return n.copy(o),await this.writeFilePromise(e,o)}truncateSync(e,t=0){const r=this.resolveFilename(`open '${e}'`,e),A=this.entries.get(r);if(void 0===A)throw h.hq(`open '${e}'`);const n=this.getFileSource(A),o=Buffer.alloc(t,0);return n.copy(o),this.writeFileSync(e,o)}watch(e,t,r){let A;switch(typeof t){case"function":case"string":case"undefined":A=!0;break;default:({persistent:A=!0}=t)}if(!A)return{on:()=>{},close:()=>{}};const n=setInterval(()=>{},864e5);return{on:()=>{},close:()=>{clearInterval(n)}}}watchFile(e,t,r){const A=this.resolveFilename(`open '${e}'`,e);return(0,l._x)(this,A,t,r)}unwatchFile(e,t){const r=this.resolveFilename(`open '${e}'`,e);return(0,l.nd)(this,r,t)}}},53660:(e,t,r)=>{"use strict";r.d(t,{A:()=>l});var A=r(35747),n=r(5944),o=r(78420),i=r(90739),s=r(38783),a=r(46009);const c=2147483648,g=/.*?(?await this.baseFs.openPromise(e,t,r),async(e,{subPath:A})=>this.remapFd(e,await e.openPromise(A,t,r)))}openSync(e,t,r){return this.makeCallSync(e,()=>this.baseFs.openSync(e,t,r),(e,{subPath:A})=>this.remapFd(e,e.openSync(A,t,r)))}async opendirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.opendirPromise(e,t),async(e,{subPath:r})=>await e.opendirPromise(r,t),{requireSubpath:!1})}opendirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.opendirSync(e,t),(e,{subPath:r})=>e.opendirSync(r,t),{requireSubpath:!1})}async readPromise(e,t,r,A,n){if(0==(e&c))return await this.baseFs.readPromise(e,t,r,A,n);const o=this.fdMap.get(e);if(void 0===o)throw Object.assign(new Error("EBADF: bad file descriptor, read"),{code:"EBADF"});const[i,s]=o;return await i.readPromise(s,t,r,A,n)}readSync(e,t,r,A,n){if(0==(e&c))return this.baseFs.readSync(e,t,r,A,n);const o=this.fdMap.get(e);if(void 0===o)throw Object.assign(new Error("EBADF: bad file descriptor, read"),{code:"EBADF"});const[i,s]=o;return i.readSync(s,t,r,A,n)}async writePromise(e,t,r,A,n){if(0==(e&c))return"string"==typeof t?await this.baseFs.writePromise(e,t,r):await this.baseFs.writePromise(e,t,r,A,n);const o=this.fdMap.get(e);if(void 0===o)throw Object.assign(new Error("EBADF: bad file descriptor, write"),{code:"EBADF"});const[i,s]=o;return"string"==typeof t?await i.writePromise(s,t,r):await i.writePromise(s,t,r,A,n)}writeSync(e,t,r,A,n){if(0==(e&c))return"string"==typeof t?this.baseFs.writeSync(e,t,r):this.baseFs.writeSync(e,t,r,A,n);const o=this.fdMap.get(e);if(void 0===o)throw Object.assign(new Error("EBADF: bad file descriptor, write"),{code:"EBADF"});const[i,s]=o;return"string"==typeof t?i.writeSync(s,t,r):i.writeSync(s,t,r,A,n)}async closePromise(e){if(0==(e&c))return await this.baseFs.closePromise(e);const t=this.fdMap.get(e);if(void 0===t)throw Object.assign(new Error("EBADF: bad file descriptor, close"),{code:"EBADF"});this.fdMap.delete(e);const[r,A]=t;return await r.closePromise(A)}closeSync(e){if(0==(e&c))return this.baseFs.closeSync(e);const t=this.fdMap.get(e);if(void 0===t)throw Object.assign(new Error("EBADF: bad file descriptor, close"),{code:"EBADF"});this.fdMap.delete(e);const[r,A]=t;return r.closeSync(A)}createReadStream(e,t){return null===e?this.baseFs.createReadStream(e,t):this.makeCallSync(e,()=>this.baseFs.createReadStream(e,t),(e,{subPath:r})=>e.createReadStream(r,t))}createWriteStream(e,t){return null===e?this.baseFs.createWriteStream(e,t):this.makeCallSync(e,()=>this.baseFs.createWriteStream(e,t),(e,{subPath:r})=>e.createWriteStream(r,t))}async realpathPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.realpathPromise(e),async(e,{archivePath:t,subPath:r})=>{let A=this.realPaths.get(t);return void 0===A&&(A=await this.baseFs.realpathPromise(t),this.realPaths.set(t,A)),this.pathUtils.join(A,this.pathUtils.relative(a.LZ.root,await e.realpathPromise(r)))})}realpathSync(e){return this.makeCallSync(e,()=>this.baseFs.realpathSync(e),(e,{archivePath:t,subPath:r})=>{let A=this.realPaths.get(t);return void 0===A&&(A=this.baseFs.realpathSync(t),this.realPaths.set(t,A)),this.pathUtils.join(A,this.pathUtils.relative(a.LZ.root,e.realpathSync(r)))})}async existsPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.existsPromise(e),async(e,{subPath:t})=>await e.existsPromise(t))}existsSync(e){return this.makeCallSync(e,()=>this.baseFs.existsSync(e),(e,{subPath:t})=>e.existsSync(t))}async accessPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.accessPromise(e,t),async(e,{subPath:r})=>await e.accessPromise(r,t))}accessSync(e,t){return this.makeCallSync(e,()=>this.baseFs.accessSync(e,t),(e,{subPath:r})=>e.accessSync(r,t))}async statPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.statPromise(e),async(e,{subPath:t})=>await e.statPromise(t))}statSync(e){return this.makeCallSync(e,()=>this.baseFs.statSync(e),(e,{subPath:t})=>e.statSync(t))}async lstatPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.lstatPromise(e),async(e,{subPath:t})=>await e.lstatPromise(t))}lstatSync(e){return this.makeCallSync(e,()=>this.baseFs.lstatSync(e),(e,{subPath:t})=>e.lstatSync(t))}async chmodPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.chmodPromise(e,t),async(e,{subPath:r})=>await e.chmodPromise(r,t))}chmodSync(e,t){return this.makeCallSync(e,()=>this.baseFs.chmodSync(e,t),(e,{subPath:r})=>e.chmodSync(r,t))}async chownPromise(e,t,r){return await this.makeCallPromise(e,async()=>await this.baseFs.chownPromise(e,t,r),async(e,{subPath:A})=>await e.chownPromise(A,t,r))}chownSync(e,t,r){return this.makeCallSync(e,()=>this.baseFs.chownSync(e,t,r),(e,{subPath:A})=>e.chownSync(A,t,r))}async renamePromise(e,t){return await this.makeCallPromise(e,async()=>await this.makeCallPromise(t,async()=>await this.baseFs.renamePromise(e,t),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(e,{subPath:r})=>await this.makeCallPromise(t,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(t,{subPath:A})=>{if(e!==t)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await e.renamePromise(r,A)}))}renameSync(e,t){return this.makeCallSync(e,()=>this.makeCallSync(t,()=>this.baseFs.renameSync(e,t),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(e,{subPath:r})=>this.makeCallSync(t,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(t,{subPath:A})=>{if(e!==t)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return e.renameSync(r,A)}))}async copyFilePromise(e,t,r=0){const n=async(e,t,n,o)=>{if(0!=(r&A.constants.COPYFILE_FICLONE_FORCE))throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${t}' -> ${o}'`),{code:"EXDEV"});if(r&A.constants.COPYFILE_EXCL&&await this.existsPromise(t))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${t}' -> '${o}'`),{code:"EEXIST"});let i;try{i=await e.readFilePromise(t)}catch(e){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${t}' -> '${o}'`),{code:"EINVAL"})}await n.writeFilePromise(o,i)};return await this.makeCallPromise(e,async()=>await this.makeCallPromise(t,async()=>await this.baseFs.copyFilePromise(e,t,r),async(t,{subPath:r})=>await n(this.baseFs,e,t,r)),async(e,{subPath:A})=>await this.makeCallPromise(t,async()=>await n(e,A,this.baseFs,t),async(t,{subPath:o})=>e!==t?await n(e,A,t,o):await e.copyFilePromise(A,o,r)))}copyFileSync(e,t,r=0){const n=(e,t,n,o)=>{if(0!=(r&A.constants.COPYFILE_FICLONE_FORCE))throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${t}' -> ${o}'`),{code:"EXDEV"});if(r&A.constants.COPYFILE_EXCL&&this.existsSync(t))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${t}' -> '${o}'`),{code:"EEXIST"});let i;try{i=e.readFileSync(t)}catch(e){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${t}' -> '${o}'`),{code:"EINVAL"})}n.writeFileSync(o,i)};return this.makeCallSync(e,()=>this.makeCallSync(t,()=>this.baseFs.copyFileSync(e,t,r),(t,{subPath:r})=>n(this.baseFs,e,t,r)),(e,{subPath:A})=>this.makeCallSync(t,()=>n(e,A,this.baseFs,t),(t,{subPath:o})=>e!==t?n(e,A,t,o):e.copyFileSync(A,o,r)))}async appendFilePromise(e,t,r){return await this.makeCallPromise(e,async()=>await this.baseFs.appendFilePromise(e,t,r),async(e,{subPath:A})=>await e.appendFilePromise(A,t,r))}appendFileSync(e,t,r){return this.makeCallSync(e,()=>this.baseFs.appendFileSync(e,t,r),(e,{subPath:A})=>e.appendFileSync(A,t,r))}async writeFilePromise(e,t,r){return await this.makeCallPromise(e,async()=>await this.baseFs.writeFilePromise(e,t,r),async(e,{subPath:A})=>await e.writeFilePromise(A,t,r))}writeFileSync(e,t,r){return this.makeCallSync(e,()=>this.baseFs.writeFileSync(e,t,r),(e,{subPath:A})=>e.writeFileSync(A,t,r))}async unlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.unlinkPromise(e),async(e,{subPath:t})=>await e.unlinkPromise(t))}unlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.unlinkSync(e),(e,{subPath:t})=>e.unlinkSync(t))}async utimesPromise(e,t,r){return await this.makeCallPromise(e,async()=>await this.baseFs.utimesPromise(e,t,r),async(e,{subPath:A})=>await e.utimesPromise(A,t,r))}utimesSync(e,t,r){return this.makeCallSync(e,()=>this.baseFs.utimesSync(e,t,r),(e,{subPath:A})=>e.utimesSync(A,t,r))}async mkdirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.mkdirPromise(e,t),async(e,{subPath:r})=>await e.mkdirPromise(r,t))}mkdirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.mkdirSync(e,t),(e,{subPath:r})=>e.mkdirSync(r,t))}async rmdirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.rmdirPromise(e,t),async(e,{subPath:r})=>await e.rmdirPromise(r,t))}rmdirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.rmdirSync(e,t),(e,{subPath:r})=>e.rmdirSync(r,t))}async linkPromise(e,t){return await this.makeCallPromise(t,async()=>await this.baseFs.linkPromise(e,t),async(t,{subPath:r})=>await t.linkPromise(e,r))}linkSync(e,t){return this.makeCallSync(t,()=>this.baseFs.linkSync(e,t),(t,{subPath:r})=>t.linkSync(e,r))}async symlinkPromise(e,t,r){return await this.makeCallPromise(t,async()=>await this.baseFs.symlinkPromise(e,t,r),async(t,{subPath:r})=>await t.symlinkPromise(e,r))}symlinkSync(e,t,r){return this.makeCallSync(t,()=>this.baseFs.symlinkSync(e,t,r),(t,{subPath:r})=>t.symlinkSync(e,r))}async readFilePromise(e,t){return this.makeCallPromise(e,async()=>{switch(t){case"utf8":default:return await this.baseFs.readFilePromise(e,t)}},async(e,{subPath:r})=>await e.readFilePromise(r,t))}readFileSync(e,t){return this.makeCallSync(e,()=>{switch(t){case"utf8":default:return this.baseFs.readFileSync(e,t)}},(e,{subPath:r})=>e.readFileSync(r,t))}async readdirPromise(e,{withFileTypes:t}={}){return await this.makeCallPromise(e,async()=>await this.baseFs.readdirPromise(e,{withFileTypes:t}),async(e,{subPath:r})=>await e.readdirPromise(r,{withFileTypes:t}),{requireSubpath:!1})}readdirSync(e,{withFileTypes:t}={}){return this.makeCallSync(e,()=>this.baseFs.readdirSync(e,{withFileTypes:t}),(e,{subPath:r})=>e.readdirSync(r,{withFileTypes:t}),{requireSubpath:!1})}async readlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.readlinkPromise(e),async(e,{subPath:t})=>await e.readlinkPromise(t))}readlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.readlinkSync(e),(e,{subPath:t})=>e.readlinkSync(t))}async truncatePromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.truncatePromise(e,t),async(e,{subPath:r})=>await e.truncatePromise(r,t))}truncateSync(e,t){return this.makeCallSync(e,()=>this.baseFs.truncateSync(e,t),(e,{subPath:r})=>e.truncateSync(r,t))}watch(e,t,r){return this.makeCallSync(e,()=>this.baseFs.watch(e,t,r),(e,{subPath:A})=>e.watch(A,t,r))}watchFile(e,t,r){return this.makeCallSync(e,()=>this.baseFs.watchFile(e,t,r),()=>(0,s._x)(this,e,t,r))}unwatchFile(e,t){return this.makeCallSync(e,()=>this.baseFs.unwatchFile(e,t),()=>(0,s.nd)(this,e,t))}async makeCallPromise(e,t,r,{requireSubpath:A=!0}={}){if("string"!=typeof e)return await t();const n=this.resolve(e),o=this.findZip(n);return o?A&&"/"===o.subPath?await t():await this.getZipPromise(o.archivePath,async e=>await r(e,o)):await t()}makeCallSync(e,t,r,{requireSubpath:A=!0}={}){if("string"!=typeof e)return t();const n=this.resolve(e),o=this.findZip(n);return o?A&&"/"===o.subPath?t():this.getZipSync(o.archivePath,e=>r(e,o)):t()}findZip(e){if(this.filter&&!this.filter.test(e))return null;let t="";for(;;){const r=g.exec(e.substr(t.length));if(!r)return null;if(t=this.pathUtils.join(t,r[0]),!1===this.isZip.has(t)){if(this.notZip.has(t))continue;try{if(!this.baseFs.lstatSync(t).isFile()){this.notZip.add(t);continue}}catch(e){return null}this.isZip.add(t)}return{archivePath:t,subPath:this.pathUtils.join(a.LZ.root,e.substr(t.length))}}}limitOpenFiles(e){if(null===this.zipInstances)return;const t=Date.now();let r=t+this.maxAge,A=null===e?0:this.zipInstances.size-e;for(const[n,{zipFs:o,expiresAt:i,refCount:s}]of this.zipInstances.entries())if(0===s&&!o.hasOpenFileHandles())if(t>=i)o.saveAndClose(),this.zipInstances.delete(n),A-=1;else{if(null===e||A<=0){r=i;break}o.saveAndClose(),this.zipInstances.delete(n),A-=1}null===this.limitOpenFilesTimeout&&(null===e&&this.zipInstances.size>0||null!==e)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},r-t).unref())}async getZipPromise(e,t){const r=async()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:await this.baseFs.statPromise(e)});if(this.zipInstances){let A=this.zipInstances.get(e);if(!A){const t=await r();A=this.zipInstances.get(e),A||(A={zipFs:new i.d(e,t),expiresAt:0,refCount:0})}this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,A),A.expiresAt=Date.now()+this.maxAge,A.refCount+=1;try{return await t(A.zipFs)}finally{A.refCount-=1}}else{const A=new i.d(e,await r());try{return await t(A)}finally{A.saveAndClose()}}}getZipSync(e,t){const r=()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:this.baseFs.statSync(e)});if(this.zipInstances){let A=this.zipInstances.get(e);return A||(A={zipFs:new i.d(e,r()),expiresAt:0,refCount:0}),this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,A),A.expiresAt=Date.now()+this.maxAge,t(A.zipFs)}{const A=new i.d(e,r());try{return t(A)}finally{A.saveAndClose()}}}}},19697:(e,t,r)=>{"use strict";r.d(t,{a:()=>o});var A=r(26984);class n{constructor(e,t,r={}){this.path=e,this.nextDirent=t,this.opts=r,this.closed=!1}throwIfClosed(){if(this.closed)throw A.Xh()}async*[Symbol.asyncIterator](){try{let e;for(;null!==(e=await this.read());)yield e}finally{await this.close()}}read(e){const t=this.readSync();return void 0!==e?e(null,t):Promise.resolve(t)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),void 0!==e?e(null):Promise.resolve()}closeSync(){var e,t;this.throwIfClosed(),null===(t=(e=this.opts).onClose)||void 0===t||t.call(e),this.closed=!0}}function o(e,t,r,A){return new n(t,()=>{const A=r.shift();return void 0===A?null:Object.assign(e.statSync(e.pathUtils.join(t,A)),{name:A})},A)}},38783:(e,t,r)=>{"use strict";r.d(t,{L:()=>u,nd:()=>l,_x:()=>g});var A,n,o=r(28614),i=r(65760);function s(e,t){if(e!==t)throw new Error(`Invalid StatWatcher status: expected '${t}', got '${e}'`)}!function(e){e.Change="change",e.Stop="stop"}(A||(A={})),function(e){e.Ready="ready",e.Running="running",e.Stopped="stopped"}(n||(n={}));class a extends o.EventEmitter{constructor(e,t,{bigint:r=!1}={}){super(),this.status=n.Ready,this.changeListeners=new Map,this.startTimeout=null,this.fakeFs=e,this.path=t,this.bigint=r,this.lastStats=this.stat()}static create(e,t,r){const A=new a(e,t,r);return A.start(),A}start(){s(this.status,n.Ready),this.status=n.Running,this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit(A.Change,this.lastStats,this.lastStats)},3)}stop(){s(this.status,n.Running),this.status=n.Stopped,null!==this.startTimeout&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit(A.Stop)}stat(){try{return this.fakeFs.statSync(this.path)}catch(e){if("ENOENT"===e.code)return i.makeEmptyStats();throw e}}makeInterval(e){const t=setInterval(()=>{const e=this.stat(),t=this.lastStats;i.areStatsEqual(e,t)||(this.lastStats=e,this.emit(A.Change,e,t))},e.interval);return e.persistent?t:t.unref()}registerChangeListener(e,t){this.addListener(A.Change,e),this.changeListeners.set(e,this.makeInterval(t))}unregisterChangeListener(e){this.removeListener(A.Change,e);const t=this.changeListeners.get(e);void 0!==t&&clearInterval(t),this.changeListeners.delete(e)}unregisterAllChangeListeners(){for(const e of this.changeListeners.keys())this.unregisterChangeListener(e)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(const e of this.changeListeners.values())e.ref();return this}unref(){for(const e of this.changeListeners.values())e.unref();return this}}const c=new WeakMap;function g(e,t,r,A){let n,o,i,s;switch(typeof r){case"function":n=!1,o=!0,i=5007,s=r;break;default:({bigint:n=!1,persistent:o=!0,interval:i=5007}=r),s=A}let g=c.get(e);void 0===g&&c.set(e,g=new Map);let l=g.get(t);return void 0===l&&(l=a.create(e,t,{bigint:n}),g.set(t,l)),l.registerChangeListener(s,{persistent:o,interval:i}),l}function l(e,t,r){const A=c.get(e);if(void 0===A)return;const n=A.get(t);void 0!==n&&(void 0===r?n.unregisterAllChangeListeners():n.unregisterChangeListener(r),n.hasChangeListeners()||(n.stop(),A.delete(t)))}function u(e){const t=c.get(e);if(void 0!==t)for(const r of t.keys())l(e,r)}},22004:(e,t,r)=>{"use strict";r.d(t,{wK:()=>A,QB:()=>n,Pe:()=>o,Zv:()=>i});const A=61440,n=16384,o=32768,i=40960},26984:(e,t,r)=>{"use strict";function A(e,t){return Object.assign(new Error(`${e}: ${t}`),{code:e})}function n(e){return A("EBUSY",e)}function o(e,t){return A("ENOSYS",`${e}, ${t}`)}function i(e){return A("EINVAL","invalid argument, "+e)}function s(e){return A("EBADF","bad file descriptor, "+e)}function a(e){return A("ENOENT","no such file or directory, "+e)}function c(e){return A("ENOTDIR","not a directory, "+e)}function g(e){return A("EISDIR","illegal operation on a directory, "+e)}function l(e){return A("EEXIST","file already exists, "+e)}function u(e){return A("EROFS","read-only filesystem, "+e)}function h(e){return A("ENOTEMPTY","directory not empty, "+e)}function p(e){return A("EOPNOTSUPP","operation not supported, "+e)}function d(){return A("ERR_DIR_CLOSED","Directory handle was closed")}r.d(t,{Vw:()=>n,bk:()=>o,hq:()=>i,Ch:()=>s,z6:()=>a,Ab:()=>c,GA:()=>g,cT:()=>l,YW:()=>u,re:()=>h,Hs:()=>p,Xh:()=>d,Yn:()=>C});class C extends Error{constructor(e,t){super(e),this.name="Libzip Error",this.code=t}}},43896:(e,t,r)=>{"use strict";r.r(t),r.d(t,{AliasFS:()=>u.K,CwdFS:()=>h.M,DEFAULT_COMPRESSION_LEVEL:()=>l.k,FakeFS:()=>g.uY,Filename:()=>s.QS,JailFS:()=>p.n,LazyFS:()=>d.v,NoFS:()=>f,NodeFS:()=>i.S,PortablePath:()=>s.LZ,PosixFS:()=>I.i,ProxiedFS:()=>E.p,VirtualFS:()=>B.p,ZipFS:()=>l.d,ZipOpenFS:()=>y.A,extendFs:()=>Q,normalizeLineEndings:()=>g.qH,npath:()=>s.cS,opendir:()=>c.a,patchFs:()=>w,ppath:()=>s.y1,statUtils:()=>a,toFilename:()=>s.Zu,xfs:()=>S});var A=r(12087),n=r.n(A),o=r(31669),i=r(78420),s=r(46009),a=r(65760),c=r(19697),g=r(5944),l=r(90739),u=r(14626),h=r(75448),p=r(10489),d=r(15037);const C=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"});class f extends g.uY{constructor(){super(s.y1)}getExtractHint(){throw C()}getRealPath(){throw C()}resolve(){throw C()}async openPromise(){throw C()}openSync(){throw C()}async opendirPromise(){throw C()}opendirSync(){throw C()}async readPromise(){throw C()}readSync(){throw C()}async writePromise(){throw C()}writeSync(){throw C()}async closePromise(){throw C()}closeSync(){throw C()}createWriteStream(){throw C()}createReadStream(){throw C()}async realpathPromise(){throw C()}realpathSync(){throw C()}async readdirPromise(){throw C()}readdirSync(){throw C()}async existsPromise(e){throw C()}existsSync(e){throw C()}async accessPromise(){throw C()}accessSync(){throw C()}async statPromise(){throw C()}statSync(){throw C()}async lstatPromise(e){throw C()}lstatSync(e){throw C()}async chmodPromise(){throw C()}chmodSync(){throw C()}async chownPromise(){throw C()}chownSync(){throw C()}async mkdirPromise(){throw C()}mkdirSync(){throw C()}async rmdirPromise(){throw C()}rmdirSync(){throw C()}async linkPromise(){throw C()}linkSync(){throw C()}async symlinkPromise(){throw C()}symlinkSync(){throw C()}async renamePromise(){throw C()}renameSync(){throw C()}async copyFilePromise(){throw C()}copyFileSync(){throw C()}async appendFilePromise(){throw C()}appendFileSync(){throw C()}async writeFilePromise(){throw C()}writeFileSync(){throw C()}async unlinkPromise(){throw C()}unlinkSync(){throw C()}async utimesPromise(){throw C()}utimesSync(){throw C()}async readFilePromise(){throw C()}readFileSync(){throw C()}async readlinkPromise(){throw C()}readlinkSync(){throw C()}async truncatePromise(){throw C()}truncateSync(){throw C()}watch(){throw C()}watchFile(){throw C()}unwatchFile(){throw C()}}f.instance=new f;var I=r(39725),E=r(42096),B=r(17674),y=r(53660);function m(e){const t=s.cS.toPortablePath(n().tmpdir()),r=Math.ceil(4294967296*Math.random()).toString(16).padStart(8,"0");return s.y1.join(t,`${e}${r}`)}function w(e,t){const r=new Set(["accessSync","appendFileSync","createReadStream","chmodSync","chownSync","closeSync","copyFileSync","linkSync","lstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","statSync","symlinkSync","truncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),A=new Set(["accessPromise","appendFilePromise","chmodPromise","chownPromise","closePromise","copyFilePromise","linkPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","statPromise","symlinkPromise","truncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"]),n=new Set(["appendFilePromise","chmodPromise","chownPromise","closePromise","readPromise","readFilePromise","statPromise","truncatePromise","utimesPromise","writePromise","writeFilePromise"]),i=(e,t,r)=>{const A=e[t];e[t]=r,void 0!==(null==A?void 0:A[o.promisify.custom])&&(r[o.promisify.custom]=A[o.promisify.custom])};i(e,"exists",(e,...r)=>{const A="function"==typeof r[r.length-1]?r.pop():()=>{};process.nextTick(()=>{t.existsPromise(e).then(e=>{A(e)},()=>{A(!1)})})}),i(e,"read",(e,r,...A)=>{const n="function"==typeof A[A.length-1]?A.pop():()=>{};process.nextTick(()=>{t.readPromise(e,r,...A).then(e=>{n(null,e,r)},e=>{n(e)})})});for(const r of A){const A=r.replace(/Promise$/,"");if(void 0===e[A])continue;const n=t[r];if(void 0===n)continue;i(e,A,(...e)=>{const r="function"==typeof e[e.length-1]?e.pop():()=>{};process.nextTick(()=>{n.apply(t,e).then(e=>{r(null,e)},e=>{r(e)})})})}e.realpath.native=e.realpath,i(e,"existsSync",e=>{try{return t.existsSync(e)}catch(e){return!1}});for(const A of r){const r=A;if(void 0===e[r])continue;const n=t[A];void 0!==n&&i(e,r,n.bind(t))}e.realpathSync.native=e.realpathSync;{const r=process.emitWarning;let o;process.emitWarning=()=>{};try{o=e.promises}finally{process.emitWarning=r}if(void 0!==o){for(const e of A){const r=e.replace(/Promise$/,"");if(void 0===o[r])continue;const A=t[e];void 0!==A&&("open"!==e&&i(o,r,A.bind(t)))}class e{constructor(e){this.fd=e}}for(const r of n){const A=r.replace(/Promise$/,""),n=t[r];void 0!==n&&i(e.prototype,A,(function(...e){return n.call(t,this.fd,...e)}))}i(o,"open",async(...r)=>{const A=await t.openPromise(...r);return new e(A)})}}e.read[o.promisify.custom]=async(e,r,...A)=>{const n=t.readPromise(e,r,...A);return{bytesRead:await n,buffer:r}}}function Q(e,t){const r=Object.create(e);return w(r,t),r}const D=new Set;let b=!1;function v(){b||(b=!0,process.once("exit",()=>{S.rmtempSync()}))}const S=Object.assign(new i.S,{detachTemp(e){D.delete(e)},mktempSync(e){for(v();;){const t=m("xfs-");try{this.mkdirSync(t)}catch(e){if("EEXIST"===e.code)continue;throw e}const r=this.realpathSync(t);if(D.add(r),void 0===e)return t;try{return e(r)}finally{if(D.has(r)){D.delete(r);try{this.removeSync(r)}catch(e){}}}}},async mktempPromise(e){for(v();;){const t=m("xfs-");try{await this.mkdirPromise(t)}catch(e){if("EEXIST"===e.code)continue;throw e}const r=await this.realpathPromise(t);if(D.add(r),void 0===e)return r;try{return await e(r)}finally{if(D.has(r)){D.delete(r);try{await this.removePromise(r)}catch(e){}}}}},async rmtempPromise(){await Promise.all(Array.from(D.values()).map(async e=>{try{await S.removePromise(e,{maxRetries:0}),D.delete(e)}catch(e){}}))},rmtempSync(){for(const e of D)try{S.removeSync(e),D.delete(e)}catch(e){}}})},46009:(e,t,r)=>{"use strict";r.d(t,{LZ:()=>i,QS:()=>s,cS:()=>a,y1:()=>c,CI:()=>f,Zu:()=>I});var A,n=r(85622),o=r.n(n);!function(e){e[e.File=0]="File",e[e.Portable=1]="Portable",e[e.Native=2]="Native"}(A||(A={}));const i={root:"/",dot:"."},s={nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",pnpJs:".pnp.js",rc:".yarnrc.yml"},a=Object.create(o()),c=Object.create(o().posix);a.cwd=()=>process.cwd(),c.cwd=()=>C(process.cwd()),c.resolve=(...e)=>e.length>0&&c.isAbsolute(e[0])?o().posix.resolve(...e):o().posix.resolve(c.cwd(),...e);const g=function(e,t,r){return(t=e.normalize(t))===(r=e.normalize(r))?".":(t.endsWith(e.sep)||(t+=e.sep),r.startsWith(t)?r.slice(t.length):null)};a.fromPortablePath=d,a.toPortablePath=C,a.contains=(e,t)=>g(a,e,t),c.contains=(e,t)=>g(c,e,t);const l=/^([a-zA-Z]:.*)$/,u=/^\\\\(\.\\)?(.*)$/,h=/^\/([a-zA-Z]:.*)$/,p=/^\/unc\/(\.dot\/)?(.*)$/;function d(e){if("win32"!==process.platform)return e;if(e.match(h))e=e.replace(h,"$1");else{if(!e.match(p))return e;e=e.replace(p,(e,t,r)=>`\\\\${t?".\\":""}${r}`)}return e.replace(/\//g,"\\")}function C(e){return"win32"!==process.platform?e:(e.match(l)?e=e.replace(l,"/$1"):e.match(u)&&(e=e.replace(u,(e,t,r)=>`/unc/${t?".dot/":""}${r}`)),e.replace(/\\/g,"/"))}function f(e,t){return e===a?d(t):C(t)}function I(e){if(""!==a.parse(e).dir||""!==c.parse(e).dir)throw new Error(`Invalid filename: "${e}"`);return e}},65760:(e,t,r)=>{"use strict";r.r(t),r.d(t,{DirEntry:()=>n,StatEntry:()=>o,makeDefaultStats:()=>i,makeEmptyStats:()=>s,areStatsEqual:()=>a});var A=r(22004);class n{constructor(){this.name="",this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&A.wK)===A.QB}isFIFO(){return!1}isFile(){return(this.mode&A.wK)===A.Pe}isSocket(){return!1}isSymbolicLink(){return(this.mode&A.wK)===A.Zv}}class o{constructor(){this.dev=0,this.ino=0,this.mode=0,this.nlink=1,this.rdev=0,this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&A.wK)===A.QB}isFIFO(){return!1}isFile(){return(this.mode&A.wK)===A.Pe}isSocket(){return!1}isSymbolicLink(){return(this.mode&A.wK)===A.Zv}}function i(){return Object.assign(new o,{uid:0,gid:0,size:0,blksize:0,atimeMs:0,mtimeMs:0,ctimeMs:0,birthtimeMs:0,atime:new Date(0),mtime:new Date(0),ctime:new Date(0),birthtime:new Date(0),mode:420|A.Pe})}function s(){return Object.assign(i(),{nlink:0,blocks:0,mode:0})}function a(e,t){return e.atimeMs===t.atimeMs&&(e.birthtimeMs===t.birthtimeMs&&(e.blksize===t.blksize&&(e.blocks===t.blocks&&(e.ctimeMs===t.ctimeMs&&(e.dev===t.dev&&(e.gid===t.gid&&(e.ino===t.ino&&(e.isBlockDevice()===t.isBlockDevice()&&(e.isCharacterDevice()===t.isCharacterDevice()&&(e.isDirectory()===t.isDirectory()&&(e.isFIFO()===t.isFIFO()&&(e.isFile()===t.isFile()&&(e.isSocket()===t.isSocket()&&(e.isSymbolicLink()===t.isSymbolicLink()&&(e.mode===t.mode&&(e.mtimeMs===t.mtimeMs&&(e.nlink===t.nlink&&(e.rdev===t.rdev&&(e.size===t.size&&e.uid===t.uid)))))))))))))))))))}},65281:(e,t,r)=>{"use strict";r.r(t),r.d(t,{getLibzipPromise:()=>s,getLibzipSync:()=>i});const A=["number","number"];var n;!function(e){e[e.ZIP_ER_OK=0]="ZIP_ER_OK",e[e.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",e[e.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",e[e.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",e[e.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",e[e.ZIP_ER_READ=5]="ZIP_ER_READ",e[e.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",e[e.ZIP_ER_CRC=7]="ZIP_ER_CRC",e[e.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",e[e.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",e[e.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",e[e.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",e[e.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",e[e.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",e[e.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",e[e.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",e[e.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",e[e.ZIP_ER_EOF=17]="ZIP_ER_EOF",e[e.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",e[e.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",e[e.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",e[e.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",e[e.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",e[e.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",e[e.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",e[e.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",e[e.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",e[e.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",e[e.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",e[e.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",e[e.ZIP_ER_TELL=30]="ZIP_ER_TELL",e[e.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA"}(n||(n={}));let o=null;function i(){var e;return null===o&&(e=r(3368),o={get HEAP8(){return e.HEAP8},get HEAPU8(){return e.HEAPU8},errors:n,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_CREATE:1,ZIP_EXCL:2,ZIP_TRUNCATE:8,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:e._malloc(1),uint16S:e._malloc(2),uint32S:e._malloc(4),uint64S:e._malloc(8),malloc:e._malloc,free:e._free,getValue:e.getValue,open:e.cwrap("zip_open","number",["string","number","number"]),openFromSource:e.cwrap("zip_open_from_source","number",["number","number","number"]),close:e.cwrap("zip_close","number",["number"]),discard:e.cwrap("zip_discard",null,["number"]),getError:e.cwrap("zip_get_error","number",["number"]),getName:e.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:e.cwrap("zip_get_num_entries","number",["number","number"]),delete:e.cwrap("zip_delete","number",["number","number"]),stat:e.cwrap("zip_stat","number",["number","string","number","number"]),statIndex:e.cwrap("zip_stat_index","number",["number",...A,"number","number"]),fopen:e.cwrap("zip_fopen","number",["number","string","number"]),fopenIndex:e.cwrap("zip_fopen_index","number",["number",...A,"number"]),fread:e.cwrap("zip_fread","number",["number","number","number","number"]),fclose:e.cwrap("zip_fclose","number",["number"]),dir:{add:e.cwrap("zip_dir_add","number",["number","string"])},file:{add:e.cwrap("zip_file_add","number",["number","string","number","number"]),getError:e.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:e.cwrap("zip_file_get_external_attributes","number",["number",...A,"number","number","number"]),setExternalAttributes:e.cwrap("zip_file_set_external_attributes","number",["number",...A,"number","number","number"]),setMtime:e.cwrap("zip_file_set_mtime","number",["number",...A,"number","number"]),setCompression:e.cwrap("zip_set_file_compression","number",["number",...A,"number","number"])},ext:{countSymlinks:e.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:e.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:e.cwrap("zip_error_strerror","string",["number"])},name:{locate:e.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:e.cwrap("zip_source_buffer_create","number",["number","number","number","number"]),fromBuffer:e.cwrap("zip_source_buffer","number",["number","number",...A,"number"]),free:e.cwrap("zip_source_free",null,["number"]),keep:e.cwrap("zip_source_keep",null,["number"]),open:e.cwrap("zip_source_open","number",["number"]),close:e.cwrap("zip_source_close","number",["number"]),seek:e.cwrap("zip_source_seek","number",["number",...A,"number"]),tell:e.cwrap("zip_source_tell","number",["number"]),read:e.cwrap("zip_source_read","number",["number","number","number"]),error:e.cwrap("zip_source_error","number",["number"]),setMtime:e.cwrap("zip_source_set_mtime","number",["number","number"])},struct:{stat:e.cwrap("zipstruct_stat","number",[]),statS:e.cwrap("zipstruct_statS","number",[]),statName:e.cwrap("zipstruct_stat_name","string",["number"]),statIndex:e.cwrap("zipstruct_stat_index","number",["number"]),statSize:e.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:e.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:e.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:e.cwrap("zipstruct_stat_mtime","number",["number"]),error:e.cwrap("zipstruct_error","number",[]),errorS:e.cwrap("zipstruct_errorS","number",[]),errorCodeZip:e.cwrap("zipstruct_error_code_zip","number",["number"])}}),o}async function s(){return i()}},11640:(e,t,r)=>{"use strict";r.r(t),r.d(t,{parseResolution:()=>i,parseShell:()=>n,parseSyml:()=>I,stringifyResolution:()=>s,stringifySyml:()=>d});var A=r(92962);function n(e,t={isGlobPattern:()=>!1}){try{return(0,A.parse)(e,t)}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}var o=r(98261);function i(e){const t=e.match(/^\*{1,2}\/(.*)/);if(t)throw new Error(`The override for '${e}' includes a glob pattern. Glob patterns have been removed since their behaviours don't match what you'd expect. Set the override to '${t[1]}' instead.`);try{return(0,o.parse)(e)}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}function s(e){let t="";return e.from&&(t+=e.from.fullName,e.from.description&&(t+="@"+e.from.description),t+="/"),t+=e.descriptor.fullName,e.descriptor.description&&(t+="@"+e.descriptor.description),t}var a=r(21194),c=r(85443);const g=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,l=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"];class u{constructor(e){this.data=e}}function h(e){return e.match(g)?e:JSON.stringify(e)}function p(e,t,r){if(null===e)return"null\n";if("number"==typeof e||"boolean"==typeof e)return e.toString()+"\n";if("string"==typeof e)return h(e)+"\n";if(Array.isArray(e)){if(0===e.length)return"[]\n";const r=" ".repeat(t);return"\n"+e.map(e=>`${r}- ${p(e,t+1,!1)}`).join("")}if("object"==typeof e&&e){let A,n;e instanceof u?(A=e.data,n=!1):(A=e,n=!0);const o=" ".repeat(t),i=Object.keys(A);n&&i.sort((e,t)=>{const r=l.indexOf(e),A=l.indexOf(t);return-1===r&&-1===A?et?1:0:-1!==r&&-1===A?-1:-1===r&&-1!==A?1:r-A});const s=i.filter(e=>!function e(t){return void 0===t||"object"==typeof t&&null!==t&&Object.keys(t).every(r=>e(t[r]))}(A[e])).map((e,n)=>{const i=A[e],s=h(e),a=p(i,t+1,!0),c=n>0||r?o:"";return a.startsWith("\n")?`${c}${s}:${a}`:`${c}${s}: ${a}`}).join(0===t?"\n":"")||"\n";return r?"\n"+s:""+s}throw new Error(`Unsupported value type (${e})`)}function d(e){try{const t=p(e,0,!1);return"\n"!==t?t:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}d.PreserveOrdering=u;const C=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i;function f(e){if(C.test(e))return function(e){return e.endsWith("\n")||(e+="\n"),(0,c.parse)(e)}(e);const t=(0,a.safeLoad)(e,{schema:a.FAILSAFE_SCHEMA});if(null==t)return{};if("object"!=typeof t)throw new Error(`Expected an indexed object, got a ${typeof t} instead. Does your file follow Yaml's rules?`);if(Array.isArray(t))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return t}function I(e){return f(e)}},34432:(e,t,r)=>{"use strict";var A,n;r.d(t,{gY:()=>E,Q$:()=>B,oC:()=>F}),function(e){e.HARD="HARD",e.SOFT="SOFT"}(A||(A={})),function(e){e.DEFAULT="DEFAULT",e.TOP_LEVEL="TOP_LEVEL",e.FALLBACK_EXCLUSION_LIST="FALLBACK_EXCLUSION_LIST",e.FALLBACK_EXCLUSION_ENTRIES="FALLBACK_EXCLUSION_ENTRIES",e.FALLBACK_EXCLUSION_DATA="FALLBACK_EXCLUSION_DATA",e.PACKAGE_REGISTRY_DATA="PACKAGE_REGISTRY_DATA",e.PACKAGE_REGISTRY_ENTRIES="PACKAGE_REGISTRY_ENTRIES",e.PACKAGE_STORE_DATA="PACKAGE_STORE_DATA",e.PACKAGE_STORE_ENTRIES="PACKAGE_STORE_ENTRIES",e.PACKAGE_INFORMATION_DATA="PACKAGE_INFORMATION_DATA",e.PACKAGE_DEPENDENCIES="PACKAGE_DEPENDENCIES",e.PACKAGE_DEPENDENCY="PACKAGE_DEPENDENCY"}(n||(n={}));const o={[n.DEFAULT]:{collapsed:!1,next:{"*":n.DEFAULT}},[n.TOP_LEVEL]:{collapsed:!1,next:{fallbackExclusionList:n.FALLBACK_EXCLUSION_LIST,packageRegistryData:n.PACKAGE_REGISTRY_DATA,"*":n.DEFAULT}},[n.FALLBACK_EXCLUSION_LIST]:{collapsed:!1,next:{"*":n.FALLBACK_EXCLUSION_ENTRIES}},[n.FALLBACK_EXCLUSION_ENTRIES]:{collapsed:!0,next:{"*":n.FALLBACK_EXCLUSION_DATA}},[n.FALLBACK_EXCLUSION_DATA]:{collapsed:!0,next:{"*":n.DEFAULT}},[n.PACKAGE_REGISTRY_DATA]:{collapsed:!1,next:{"*":n.PACKAGE_REGISTRY_ENTRIES}},[n.PACKAGE_REGISTRY_ENTRIES]:{collapsed:!0,next:{"*":n.PACKAGE_STORE_DATA}},[n.PACKAGE_STORE_DATA]:{collapsed:!1,next:{"*":n.PACKAGE_STORE_ENTRIES}},[n.PACKAGE_STORE_ENTRIES]:{collapsed:!0,next:{"*":n.PACKAGE_INFORMATION_DATA}},[n.PACKAGE_INFORMATION_DATA]:{collapsed:!1,next:{packageDependencies:n.PACKAGE_DEPENDENCIES,"*":n.DEFAULT}},[n.PACKAGE_DEPENDENCIES]:{collapsed:!1,next:{"*":n.PACKAGE_DEPENDENCY}},[n.PACKAGE_DEPENDENCY]:{collapsed:!0,next:{"*":n.DEFAULT}}};function i(e,t,r,A){const{next:n}=o[r];return s(t,n[e]||n["*"],A)}function s(e,t,r){const{collapsed:A}=o[t];return Array.isArray(e)?A?function(e,t,r){let A="";A+="[";for(let n=0,o=e.length;ne(t)));const n=r.map((e,t)=>t);return n.sort((e,t)=>{for(const r of A){const A=r[e]r[t]?1:0;if(0!==A)return A}return 0}),n.map(e=>r[e])}function g(e){const t=new Map,r=c(e.fallbackExclusionList||[],[({name:e,reference:t})=>e,({name:e,reference:t})=>t]);for(const{name:e,reference:A}of r){let r=t.get(e);void 0===r&&t.set(e,r=new Set),r.add(A)}return Array.from(t).map(([e,t])=>[e,Array.from(t)])}function l(e){return c(e.fallbackPool||[],([e])=>e)}function u(e){const t=[];for(const[r,A]of c(e.packageRegistry,([e])=>null===e?"0":"1"+e)){const e=[];t.push([r,e]);for(const[t,{packageLocation:n,packageDependencies:o,packagePeers:i,linkType:s,discardFromLookup:a}]of c(A,([e])=>null===e?"0":"1"+e)){const A=[];null===r||null===t||o.has(r)||A.push([r,t]);for(const[e,t]of c(o.entries(),([e])=>e))A.push([e,t]);const g=i&&i.size>0?Array.from(i):void 0,l=a||void 0;e.push([t,{packageLocation:n,packageDependencies:A,packagePeers:g,linkType:s,discardFromLookup:l}])}}return t}function h(e){return c(e.blacklistedLocations||[],e=>e)}function p(e){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost. We also recommend you not to read","it either without using the @yarnpkg/pnp package, as the data layout","is entirely unspecified and WILL change from a version to another."],dependencyTreeRoots:e.dependencyTreeRoots,enableTopLevelFallback:e.enableTopLevelFallback||!1,ignorePatternData:e.ignorePattern||null,fallbackExclusionList:g(e),fallbackPool:l(e),locationBlacklistData:h(e),packageRegistryData:u(e)}}var d=r(20103),C=r.n(d);function f(e,t){return[e?e+"\n":"","/* eslint-disable */\n\n","try {\n"," Object.freeze({}).detectStrictMode = true;\n","} catch (error) {\n"," throw new Error(`The whole PnP file got strict-mode-ified, which is known to break (Emscripten libraries aren't strict mode). This usually happens when the file goes through Babel.`);\n","}\n","\n","var __non_webpack_module__ = module;\n","\n","function $$SETUP_STATE(hydrateRuntimeState, basePath) {\n",t.replace(/^/gm," "),"}\n","\n",C()()].join("")}function I(e){return JSON.stringify(e,null,2)}function E(e){const t=function(e){return[`return hydrateRuntimeState(${a(e)}, {basePath: basePath || __dirname});\n`].join("")}(p(e));return f(e.shebang,t)}function B(e){const t=p(e),r=(A=e.dataLocation,["var path = require('path');\n",`var dataLocation = path.resolve(__dirname, ${JSON.stringify(A)});\n`,"return hydrateRuntimeState(require(dataLocation), {basePath: basePath || path.dirname(dataLocation)});\n"].join(""));var A;const n=f(e.shebang,r);return{dataFile:I(t),loaderFile:n}}var y=r(35747),m=(r(85622),r(31669)),w=r(46009);var Q,D=r(17674),b=r(32282);!function(e){e.API_ERROR="API_ERROR",e.BLACKLISTED="BLACKLISTED",e.BUILTIN_NODE_RESOLUTION_FAILED="BUILTIN_NODE_RESOLUTION_FAILED",e.MISSING_DEPENDENCY="MISSING_DEPENDENCY",e.MISSING_PEER_DEPENDENCY="MISSING_PEER_DEPENDENCY",e.QUALIFIED_PATH_RESOLUTION_FAILED="QUALIFIED_PATH_RESOLUTION_FAILED",e.INTERNAL="INTERNAL",e.UNDECLARED_DEPENDENCY="UNDECLARED_DEPENDENCY",e.UNSUPPORTED="UNSUPPORTED"}(Q||(Q={}));const v=new Set([Q.BLACKLISTED,Q.BUILTIN_NODE_RESOLUTION_FAILED,Q.MISSING_DEPENDENCY,Q.MISSING_PEER_DEPENDENCY,Q.QUALIFIED_PATH_RESOLUTION_FAILED,Q.UNDECLARED_DEPENDENCY]);function S(e,t,r={}){const A=v.has(e)?"MODULE_NOT_FOUND":e,n={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(t),{code:{...n,value:A},pnpCode:{...n,value:e},data:{...n,value:r}})}function k(e){return w.cS.normalize(w.cS.fromPortablePath(e))}function N(e,t){const r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,A=Number(process.env.PNP_DEBUG_LEVEL),n=new Set(b.Module.builtinModules||Object.keys(process.binding("natives"))),o=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:@[^/]+\/)?[^/]+)\/*(.*|)$/,i=/^(\/|\.{1,2}(\/|$))/,s=/\/$/,a={name:null,reference:null},c=[],g=new Set;if(!0===e.enableTopLevelFallback&&c.push(a),!1!==t.compatibilityMode)for(const t of["react-scripts","gatsby"]){const r=e.packageRegistry.get(t);if(r)for(const e of r.keys()){if(null===e)throw new Error("Assertion failed: This reference shouldn't be null");c.push({name:t,reference:e})}}const{ignorePattern:l,packageRegistry:u,packageLocatorsByLocations:h,packageLocationLengths:p}=e;function d(e,t){return{fn:e,args:t,error:null,result:null}}function C(e,r){if(!1===t.allowDebug)return r;if(Number.isFinite(A)){if(A>=2)return(...t)=>{const A=d(e,t);try{return A.result=r(...t)}catch(e){throw A.error=e}finally{console.trace(A)}};if(A>=1)return(...t)=>{try{return r(...t)}catch(r){const A=d(e,t);throw A.error=r,console.trace(A),r}}}return r}function f(e){const t=y(e);if(!t)throw S(Q.INTERNAL,"Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return t}function I(t){if(null===t.name)return!0;for(const r of e.dependencyTreeRoots)if(r.name===t.name&&r.reference===t.reference)return!0;return!1}function E(e,t){return t.endsWith("/")&&(t=w.y1.join(t,"internal.js")),b.Module._resolveFilename(w.cS.fromPortablePath(e),function(e){const t=new b.Module(e,null);return t.filename=e,t.paths=b.Module._nodeModulePaths(e),t}(w.cS.fromPortablePath(t)),!1,{plugnplay:!1})}function B(t){if(null===l)return!1;const r=w.y1.contains(e.basePath,t);return null!==r&&!!l.test(r.replace(/\/$/,""))}function y({name:e,reference:t}){const r=u.get(e);if(!r)return null;const A=r.get(t);return A||null}function m(e,t){const r=new Map,A=new Set,n=t=>{const o=JSON.stringify(t.name);if(A.has(o))return;A.add(o);const i=function({name:e,reference:t}){const r=[];for(const[A,n]of u)if(null!==A)for(const[o,i]of n){if(null===o)continue;i.packageDependencies.get(e)===t&&(A===e&&o===t||r.push({name:A,reference:o}))}return r}(t);for(const t of i){if(f(t).packagePeers.has(e))n(t);else{let e=r.get(t.name);void 0===e&&r.set(t.name,e=new Set),e.add(t.reference)}}};n(t);const o=[];for(const e of[...r.keys()].sort())for(const t of[...r.get(e)].sort())o.push({name:e,reference:t});return o}function v(t){if(B(t))return null;let r=(A=w.y1.relative(e.basePath,t),w.cS.toPortablePath(A));var A;r.match(i)||(r="./"+r),t.match(s)&&!r.endsWith("/")&&(r+="/");let n=0;for(;nr.length;)n+=1;for(let e=n;eI(e))?S(Q.MISSING_PEER_DEPENDENCY,`${s.name} tried to access ${t} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound.\n\nRequired package: ${t} (via "${l}")\nRequired by: ${s.name}@${s.reference} (via ${u})\n${e.map(e=>`Ancestor breaking the chain: ${e.name}@${e.reference}\n`).join("")}\n`,{request:l,issuer:u,issuerLocator:Object.assign({},s),dependencyName:t,brokenAncestors:e}):S(Q.MISSING_PEER_DEPENDENCY,`${s.name} tried to access ${t} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound.\n\nRequired package: ${t} (via "${l}")\nRequired by: ${s.name}@${s.reference} (via ${u})\n${e.map(e=>`Ancestor breaking the chain: ${e.name}@${e.reference}\n`).join("")}\n`,{request:l,issuer:u,issuerLocator:Object.assign({},s),dependencyName:t,brokenAncestors:e})}else void 0===d&&(B=!a&&n.has(A)?I(s)?S(Q.UNDECLARED_DEPENDENCY,`Your application tried to access ${t}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${t} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound.\n\nRequired package: ${t} (via "${l}")\nRequired by: ${u}\n`,{request:l,issuer:u,dependencyName:t}):S(Q.UNDECLARED_DEPENDENCY,`${s.name} tried to access ${t}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${t} isn't otherwise declared in ${s.name}'s dependencies, this makes the require call ambiguous and unsound.\n\nRequired package: ${t} (via "${l}")\nRequired by: ${u}\n`,{request:l,issuer:u,issuerLocator:Object.assign({},s),dependencyName:t}):I(s)?S(Q.UNDECLARED_DEPENDENCY,`Your application tried to access ${t}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound.\n\nRequired package: ${t} (via "${l}")\nRequired by: ${u}\n`,{request:l,issuer:u,dependencyName:t}):S(Q.UNDECLARED_DEPENDENCY,`${s.name} tried to access ${t}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound.\n\nRequired package: ${t} (via "${l}")\nRequired by: ${s.name}@${s.reference} (via ${u})\n`,{request:l,issuer:u,issuerLocator:Object.assign({},s),dependencyName:t}));if(null==d){if(null===C||null===B)throw B||new Error("Assertion failed: Expected an error to have been set");d=C;const e=B.message.replace(/\n.*/g,"");B.message=e,g.has(e)||(g.add(e),process.emitWarning(B))}const y=Array.isArray(d)?{name:d[0],reference:d[1]}:{name:t,reference:d},D=f(y);if(!D.packageLocation)throw S(Q.MISSING_DEPENDENCY,`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod.\n\nRequired package: ${y.name}@${y.reference} (via "${l}")\nRequired by: ${s.name}@${s.reference} (via ${u})\n`,{request:l,issuer:u,dependencyLocator:Object.assign({},y)});const b=D.packageLocation;h=o?w.y1.join(b,o):b}else{if(w.y1.isAbsolute(A))h=w.y1.normalize(A);else{if(!i)throw S(Q.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:l,issuer:u});const e=w.y1.resolve(i);h=i.match(s)?w.y1.normalize(w.y1.join(e,A)):w.y1.normalize(w.y1.join(w.y1.dirname(e),A))}v(h)}return w.y1.normalize(h)}function F(e,{extensions:r=Object.keys(b.Module._extensions)}={}){const A=[],n=function e(r,A,{extensions:n}){let o;try{A.push(r),o=t.fakeFs.statSync(r)}catch(e){}if(o&&!o.isDirectory())return t.fakeFs.realpathSync(r);if(o&&o.isDirectory()){let o,i;try{o=JSON.parse(t.fakeFs.readFileSync(w.y1.join(r,"package.json"),"utf8"))}catch(e){}if(o&&o.main&&(i=w.y1.resolve(r,o.main)),i&&i!==r){const t=e(i,A,{extensions:n});if(null!==t)return t}}for(let e=0,o=n.length;e`Rejected candidate: ${k(e)}\n`).join("")}`,{unqualifiedPath:t})}}return{VERSIONS:{std:3,resolveVirtual:1,getAllLocators:1},topLevel:a,getLocator:(e,t)=>Array.isArray(t)?{name:t[0],reference:t[1]}:{name:e,reference:t},getDependencyTreeRoots:()=>[...e.dependencyTreeRoots],getAllLocators(){const e=[];for(const[t,r]of u)for(const A of r.keys())null!==t&&null!==A&&e.push({name:t,reference:A});return e},getPackageInformation:e=>{const t=y(e);if(null===t)return null;const r=w.cS.fromPortablePath(t.packageLocation);return{...t,packageLocation:r}},findPackageLocator:e=>v(w.cS.toPortablePath(e)),resolveToUnqualified:C("resolveToUnqualified",(e,t,r)=>{const A=null!==t?w.cS.toPortablePath(t):null,n=N(w.cS.toPortablePath(e),A,r);return null===n?null:w.cS.fromPortablePath(n)}),resolveUnqualified:C("resolveUnqualified",(e,t)=>w.cS.fromPortablePath(F(w.cS.toPortablePath(e),t))),resolveRequest:C("resolveRequest",(e,t,r)=>{const A=null!==t?w.cS.toPortablePath(t):null,n=function(e,t,{considerBuiltins:r,extensions:A}={}){const n=N(e,t,{considerBuiltins:r});if(null===n)return null;try{return F(n,{extensions:A})}catch(r){throw"QUALIFIED_PATH_RESOLUTION_FAILED"===r.pnpCode&&Object.assign(r.data,{request:k(e),issuer:t&&k(t)}),r}}(w.cS.toPortablePath(e),A,r);return null===n?null:w.cS.fromPortablePath(n)}),resolveVirtual:C("resolveVirtual",e=>{const t=function(e){const t=w.y1.normalize(e),r=D.p.resolveVirtual(t);return r!==t?r:null}(w.cS.toPortablePath(e));return null!==t?w.cS.fromPortablePath(t):null})}}(0,m.promisify)(y.readFile);const F=(e,t,r)=>N(function(e,{basePath:t}){const r=w.cS.toPortablePath(t),A=w.y1.resolve(r),n=null!==e.ignorePatternData?new RegExp(e.ignorePatternData):null,o=new Map(e.packageRegistryData.map(([e,t])=>[e,new Map(t.map(([e,t])=>[e,{packageLocation:w.y1.join(A,t.packageLocation),packageDependencies:new Map(t.packageDependencies),packagePeers:new Set(t.packagePeers),linkType:t.linkType,discardFromLookup:t.discardFromLookup||!1}]))])),i=new Map,s=new Set;for(const[t,r]of e.packageRegistryData)for(const[e,A]of r){if(null===t!=(null===e))throw new Error("Assertion failed: The name and reference should be null, or neither should");if(A.discardFromLookup)continue;const r={name:t,reference:e};i.set(A.packageLocation,r),s.add(A.packageLocation.length)}for(const t of e.locationBlacklistData)i.set(t,null);const a=new Map(e.fallbackExclusionList.map(([e,t])=>[e,new Set(t)])),c=new Map(e.fallbackPool);return{basePath:r,dependencyTreeRoots:e.dependencyTreeRoots,enableTopLevelFallback:e.enableTopLevelFallback,fallbackExclusionList:a,fallbackPool:c,ignorePattern:n,packageLocationLengths:[...s].sort((e,t)=>t-e),packageLocatorsByLocations:i,packageRegistry:o}}(p(e),{basePath:t}),{fakeFs:r,pnpapiResolution:w.cS.join(t,".pnp.js")})},76756:(e,t,r)=>{"use strict";r.r(t),r.d(t,{ShellError:()=>c,execute:()=>Z,globUtils:()=>A});var A={};r.r(A),r.d(A,{fastGlobOptions:()=>E,isBraceExpansion:()=>m,isGlobPattern:()=>B,match:()=>y,micromatchOptions:()=>I});var n=r(46009),o=r(78420),i=r(11640),s=r(12087),a=r(92413);class c extends Error{constructor(e){super(e),this.name="ShellError"}}var g=r(43896),l=r(39725),u=r(19347),h=r.n(u),p=r(35747),d=r.n(p),C=r(2401),f=r.n(C);const I={strictBrackets:!0},E={onlyDirectories:!1,onlyFiles:!1};function B(e){if(!f().scan(e,I).isGlob)return!1;try{f().parse(e,I)}catch(e){return!1}return!0}function y(e,{cwd:t,baseFs:r}){return h()(e,{...E,cwd:n.cS.fromPortablePath(t),fs:(0,g.extendFs)(d(),new l.i(r))})}function m(e){return f().scan(e,I).isBrace}var w,Q=r(67566),D=r.n(Q);function b(){}!function(e){e[e.STDIN=0]="STDIN",e[e.STDOUT=1]="STDOUT",e[e.STDERR=2]="STDERR"}(w||(w={}));let v=0;class S{constructor(e){this.stream=e}close(){}get(){return this.stream}}class k{constructor(){this.stream=null}close(){if(null===this.stream)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(null===this.stream)throw new Error("Assertion failed: No stream attached");return this.stream}}class N{constructor(e,t){this.stdin=null,this.stdout=null,this.stderr=null,this.pipe=null,this.ancestor=e,this.implementation=t}static start(e,{stdin:t,stdout:r,stderr:A}){const n=new N(null,e);return n.stdin=t,n.stdout=r,n.stderr=A,n}pipeTo(e,t=w.STDOUT){const r=new N(this,e),A=new k;return r.pipe=A,r.stdout=this.stdout,r.stderr=this.stderr,(t&w.STDOUT)===w.STDOUT?this.stdout=A:null!==this.ancestor&&(this.stderr=this.ancestor.stdout),(t&w.STDERR)===w.STDERR?this.stderr=A:null!==this.ancestor&&(this.stderr=this.ancestor.stderr),r}async exec(){const e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(null===this.stdin)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let t,r;if(null===this.stdout)throw new Error("Assertion failed: No output stream registered");if(t=this.stdout,e[1]=t.get(),null===this.stderr)throw new Error("Assertion failed: No error stream registered");r=this.stderr,e[2]=r.get();const A=this.implementation(e);return this.pipe&&this.pipe.attach(A.stdin),await A.promise.then(e=>(t.close(),r.close(),e))}async run(){const e=[];for(let t=this;t;t=t.ancestor)e.push(t.exec());return(await Promise.all(e))[0]}}function F(e,t){return N.start(e,t)}var K;function M(e,t,r){const A=new a.PassThrough({autoDestroy:!0});switch(e){case w.STDIN:(t&K.Readable)===K.Readable&&r.stdin.pipe(A,{end:!1}),(t&K.Writable)===K.Writable&&r.stdin instanceof a.Writable&&A.pipe(r.stdin,{end:!1});break;case w.STDOUT:(t&K.Readable)===K.Readable&&r.stdout.pipe(A,{end:!1}),(t&K.Writable)===K.Writable&&A.pipe(r.stdout,{end:!1});break;case w.STDERR:(t&K.Readable)===K.Readable&&r.stderr.pipe(A,{end:!1}),(t&K.Writable)===K.Writable&&A.pipe(r.stderr,{end:!1});break;default:throw new c(`Bad file descriptor: "${e}"`)}return A}function R(e,t={}){const r={...e,...t};return r.environment={...e.environment,...t.environment},r.variables={...e.variables,...t.variables},r}!function(e){e[e.Readable=1]="Readable",e[e.Writable=2]="Writable"}(K||(K={}));const x=new Map([["cd",async([e=(0,s.homedir)(),...t],r,A)=>{const o=n.y1.resolve(A.cwd,n.cS.toPortablePath(e));return(await r.baseFs.statPromise(o)).isDirectory()?(A.cwd=o,0):(A.stderr.write("cd: not a directory\n"),1)}],["pwd",async(e,t,r)=>(r.stdout.write(n.cS.fromPortablePath(r.cwd)+"\n"),0)],[":",async(e,t,r)=>0],["true",async(e,t,r)=>0],["false",async(e,t,r)=>1],["exit",async([e,...t],r,A)=>A.exitCode=parseInt(null!=e?e:A.variables["?"],10)],["echo",async(e,t,r)=>(r.stdout.write(e.join(" ")+"\n"),0)],["__ysh_run_procedure",async(e,t,r)=>{const A=r.procedures[e[0]];return await F(A,{stdin:new S(r.stdin),stdout:new S(r.stdout),stderr:new S(r.stderr)}).run()}],["__ysh_set_redirects",async(e,t,r)=>{let A=r.stdin,o=r.stdout;const i=r.stderr,s=[],c=[];let g=0;for(;"--"!==e[g];){const A=e[g++],o=Number(e[g++]),i=g+o;for(let o=g;ot.baseFs.createReadStream(n.y1.resolve(r.cwd,n.cS.toPortablePath(e[o]))));break;case"<<<":s.push(()=>{const t=new a.PassThrough;return process.nextTick(()=>{t.write(e[o]+"\n"),t.end()}),t});break;case"<&":s.push(()=>M(Number(e[o]),K.Readable,r));break;case">":case">>":{const i=n.y1.resolve(r.cwd,n.cS.toPortablePath(e[o]));"/dev/null"===i?c.push(new a.Writable({autoDestroy:!0,emitClose:!0,write(e,t,r){setImmediate(r)}})):c.push(t.baseFs.createWriteStream(i,">>"===A?{flags:"a"}:void 0))}break;case">&":c.push(M(Number(e[o]),K.Writable,r));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${A}"`)}}if(s.length>0){const e=new a.PassThrough;A=e;const t=r=>{if(r===s.length)e.end();else{const A=s[r]();A.pipe(e,{end:!1}),A.on("end",()=>{t(r+1)})}};t(0)}if(c.length>0){const e=new a.PassThrough;o=e;for(const t of c)e.pipe(t)}const l=await F(G(e.slice(g+1),t,r),{stdin:new S(A),stdout:new S(o),stderr:new S(i)}).run();return await Promise.all(c.map(e=>new Promise(t=>{e.on("close",()=>{t()}),e.end()}))),l}]]);async function L(e,t,r){const A=[],n=new a.PassThrough;return n.on("data",e=>A.push(e)),await W(e,t,R(r,{stdout:n})),Buffer.concat(A).toString().replace(/[\r\n]+$/,"")}async function P(e,t,r){const A=e.map(async e=>{const A=await Y(e.args,t,r);return{name:e.name,value:A.join(" ")}});return(await Promise.all(A)).reduce((e,t)=>(e[t.name]=t.value,e),{})}function O(e){return e.match(/[^ \r\n\t]+/g)||[]}async function U(e,t,r,A,n=A){switch(e.name){case"$":A(String(process.pid));break;case"#":A(String(t.args.length));break;case"@":if(e.quoted)for(const e of t.args)n(e);else for(const e of t.args){const t=O(e);for(let e=0;e=0&&ne+t,subtraction:(e,t)=>e-t,multiplication:(e,t)=>e*t,division:(e,t)=>Math.trunc(e/t)};async function j(e,t,r){if("number"===e.type){if(Number.isInteger(e.value))return e.value;throw new Error(`Invalid number: "${e.value}", only integers are allowed`)}if("variable"===e.type){const A=[];await U({...e,quoted:!0},t,r,e=>A.push(e));const n=Number(A.join(" "));return Number.isNaN(n)?j({type:"variable",name:A.join(" ")},t,r):j({type:"number",value:n},t,r)}return T[e.type](await j(e.left,t,r),await j(e.right,t,r))}async function Y(e,t,r){const A=new Map,n=[];let o=[];const i=e=>{o.push(e)},s=()=>{o.length>0&&n.push(o.join("")),o=[]},a=e=>{i(e),s()},g=(e,t)=>{let r=A.get(e);void 0===r&&A.set(e,r=[]),r.push(t)};for(const A of e){let e=!1;switch(A.type){case"redirection":{const e=await Y(A.args,t,r);for(const t of e)g(A.subtype,t)}break;case"argument":for(const n of A.segments)switch(n.type){case"text":i(n.text);break;case"glob":i(n.pattern),e=!0;break;case"shell":{const e=await L(n.shell,t,r);if(n.quoted)i(e);else{const t=O(e);for(let e=0;e0){const e=[];for(const[t,r]of A.entries())e.splice(e.length,0,t,String(r.length),...r);n.splice(0,0,"__ysh_set_redirects",...e,"--")}return n}function G(e,t,r){t.builtins.has(e[0])||(e=["command",...e]);const A=n.cS.fromPortablePath(r.cwd);let o=r.environment;void 0!==o.PWD&&(o={...o,PWD:A});const[i,...s]=e;if("command"===i)return function(e,t,r,A){return r=>{const n=r[0]instanceof a.Transform?"pipe":r[0],o=r[1]instanceof a.Transform?"pipe":r[1],i=r[2]instanceof a.Transform?"pipe":r[2],s=D()(e,t,{...A,stdio:[n,o,i]});return 0==v++&&process.on("SIGINT",b),r[0]instanceof a.Transform&&r[0].pipe(s.stdin),r[1]instanceof a.Transform&&s.stdout.pipe(r[1],{end:!1}),r[2]instanceof a.Transform&&s.stderr.pipe(r[2],{end:!1}),{stdin:s.stdin,promise:new Promise(t=>{s.on("error",A=>{switch(0==--v&&process.off("SIGINT",b),A.code){case"ENOENT":r[2].write(`command not found: ${e}\n`),t(127);break;case"EACCES":r[2].write(`permission denied: ${e}\n`),t(128);break;default:r[2].write(`uncaught error: ${A.message}\n`),t(1)}}),s.on("exit",e=>{0==--v&&process.off("SIGINT",b),t(null!==e?e:129)})})}}}(s[0],s.slice(1),0,{cwd:A,env:o});const c=t.builtins.get(i);if(void 0===c)throw new Error(`Assertion failed: A builtin should exist for "${i}"`);return function(e){return t=>{const r="pipe"===t[0]?new a.PassThrough:t[0];return{stdin:r,promise:Promise.resolve().then(()=>e({stdin:r,stdout:t[1],stderr:t[2]}))}}}(async({stdin:e,stdout:A,stderr:n})=>(r.stdin=e,r.stdout=A,r.stderr=n,await c(s,t,r)))}function H(e,t,r){return A=>{const n=new a.PassThrough;return{stdin:n,promise:W(e,t,R(r,{stdin:n}))}}}function J(e,t,r){return A=>({stdin:new a.PassThrough,promise:W(e,t,r)})}function q(e,t,r,A){if(0===t.length)return e;{let n;do{n=String(Math.random())}while(Object.prototype.hasOwnProperty.call(A.procedures,n));return A.procedures={...A.procedures},A.procedures[n]=e,G([...t,"__ysh_run_procedure",n],r,A)}}async function z(e,t,r){let A;const n=e=>{A=e,r.variables["?"]=String(e)},o=async e=>{try{return await async function(e,t,r){let A=e,n=null,o=null;for(;A;){const e=A.then?{...r}:r;let i;switch(A.type){case"command":{const n=await Y(A.args,t,r),o=await P(A.envs,t,r);i=A.envs.length?G(n,t,R(e,{environment:o})):G(n,t,e)}break;case"subshell":{const n=await Y(A.args,t,r);i=q(H(A.subshell,t,e),n,t,e)}break;case"group":{const n=await Y(A.args,t,r);i=q(J(A.group,t,e),n,t,e)}break;case"envs":{const n=await P(A.envs,t,r);e.environment={...e.environment,...n},i=G(["true"],t,e)}}if(void 0===i)throw new Error("Assertion failed: An action should have been generated");if(null===n)o=F(i,{stdin:new S(e.stdin),stdout:new S(e.stdout),stderr:new S(e.stderr)});else{if(null===o)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(n){case"|":o=o.pipeTo(i,w.STDOUT);break;case"|&":o=o.pipeTo(i,w.STDOUT|w.STDERR)}}A.then?(n=A.then.type,A=A.then.chain):A=null}if(null===o)throw new Error("Assertion failed: The execution pipeline should have been setup");return await o.run()}(e,t,r)}catch(e){if(!(e instanceof c))throw e;return r.stderr.write(e.message+"\n"),1}};for(n(await o(e.chain));e.then;){if(null!==r.exitCode)return r.exitCode;switch(e.then.type){case"&&":0===A&&n(await o(e.then.line.chain));break;case"||":0!==A&&n(await o(e.then.line.chain));break;default:throw new Error(`Assertion failed: Unsupported command type: "${e.then.type}"`)}e=e.then.line}return A}async function W(e,t,r){let A=0;for(const n of e){if(A=await z(n,t,r),null!==r.exitCode)return r.exitCode;r.variables["?"]=String(A)}return A}function V(e){switch(e.type){case"variable":return"@"===e.name||"#"===e.name||"*"===e.name||Number.isFinite(parseInt(e.name,10))||"defaultValue"in e&&!!e.defaultValue&&e.defaultValue.some(e=>X(e));case"arithmetic":return function e(t){switch(t.type){case"variable":return V(t);case"number":return!1;default:return e(t.left)||e(t.right)}}(e.arithmetic);case"shell":return _(e.shell);default:return!1}}function X(e){switch(e.type){case"redirection":return e.args.some(e=>X(e));case"argument":return e.segments.some(e=>V(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${e.type}"`)}}function _(e){return e.some(e=>{for(;e;){let t=e.chain;for(;t;){let e;switch(t.type){case"subshell":e=_(t.subshell);break;case"command":e=t.envs.some(e=>e.args.some(e=>X(e)))||t.args.some(e=>X(e))}if(e)return!0;if(!t.then)break;t=t.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function Z(e,t=[],{baseFs:r=new o.S,builtins:s={},cwd:c=n.cS.toPortablePath(process.cwd()),env:g=process.env,stdin:l=process.stdin,stdout:u=process.stdout,stderr:h=process.stderr,variables:p={},glob:d=A}={}){const C={};for(const[e,t]of Object.entries(g))void 0!==t&&(C[e]=t);const f=new Map(x);for(const[e,t]of Object.entries(s))f.set(e,t);null===l&&(l=new a.PassThrough).end();const I=(0,i.parseShell)(e,d);if(!_(I)&&I.length>0&&t.length>0){let e=I[I.length-1];for(;e.then;)e=e.then.line;let r=e.chain;for(;r.then;)r=r.then.chain;"command"===r.type&&(r.args=r.args.concat(t.map(e=>({type:"argument",segments:[{type:"text",text:e}]}))))}return await W(I,{args:t,baseFs:r,builtins:f,initialStdin:l,initialStdout:u,initialStderr:h,glob:d},{cwd:c,environment:C,exitCode:null,procedures:{},stdin:l,stdout:u,stderr:h,variables:Object.assign({},p,{"?":0})})}},45330:(e,t,r)=>{t.e=()=>({modules:new Map([["@yarnpkg/cli",r(25413)],["@yarnpkg/core",r(53836)],["@yarnpkg/fslib",r(43896)],["@yarnpkg/libzip",r(65281)],["@yarnpkg/parsers",r(11640)],["@yarnpkg/shell",r(76756)],["clipanion",r(40822)],["semver",r(53887)],["yup",r(15966)],["@yarnpkg/plugin-essentials",r(34777)],["@yarnpkg/plugin-compat",r(44692)],["@yarnpkg/plugin-dlx",r(10189)],["@yarnpkg/plugin-file",r(68023)],["@yarnpkg/plugin-git",r(75641)],["@yarnpkg/plugin-github",r(68126)],["@yarnpkg/plugin-http",r(99148)],["@yarnpkg/plugin-init",r(64314)],["@yarnpkg/plugin-link",r(92994)],["@yarnpkg/plugin-node-modules",r(8375)],["@yarnpkg/plugin-npm",r(14224)],["@yarnpkg/plugin-npm-cli",r(8190)],["@yarnpkg/plugin-pack",r(49881)],["@yarnpkg/plugin-patch",r(29936)],["@yarnpkg/plugin-pnp",r(83228)]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-node-modules","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp"])})},29148:(e,t,r)=>{const A=r(74988),n=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,o=new A;e.exports=(e,t=0,r=e.length)=>{if(t<0||r<0)throw new RangeError("Negative indices aren't supported by this implementation");const A=r-t;let i="",s=0,a=0;for(;e.length>0;){const r=e.match(n)||[e,e,void 0];let c=o.splitGraphemes(r[1]);const g=Math.min(t-s,c.length);c=c.slice(g);const l=Math.min(A-a,c.length);i+=c.slice(0,l).join(""),s+=g,a+=l,void 0!==r[2]&&(i+=r[2]),e=e.slice(r[0].length)}return i}},72912:e=>{function t(){return e.exports=t=Object.assign||function(e){for(var t=1;t{e.exports=function(e){return e&&e.__esModule?e:{default:e}}},19228:(e,t,r)=>{var A=r(54694);function n(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return n=function(){return e},e}e.exports=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==A(e)&&"function"!=typeof e)return{default:e};var t=n();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if(Object.prototype.hasOwnProperty.call(e,i)){var s=o?Object.getOwnPropertyDescriptor(e,i):null;s&&(s.get||s.set)?Object.defineProperty(r,i,s):r[i]=e[i]}return r.default=e,t&&t.set(e,r),r}},74943:e=>{e.exports=function(e,t){if(null==e)return{};var r,A,n={},o=Object.keys(e);for(A=0;A=0||(n[r]=e[r]);return n}},62407:e=>{e.exports=function(e,t){return t||(t=e.slice(0)),e.raw=t,e}},54694:e=>{function t(r){return"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?e.exports=t=function(e){return typeof e}:e.exports=t=function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t(r)}e.exports=t},96117:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(35747);t.FILE_SYSTEM_ADAPTER={lstat:A.lstat,stat:A.stat,lstatSync:A.lstatSync,statSync:A.statSync,readdir:A.readdir,readdirSync:A.readdirSync},t.createFileSystemAdapter=function(e){return void 0===e?t.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},t.FILE_SYSTEM_ADAPTER),e)}},79774:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=process.versions.node.split("."),A=parseInt(r[0],10),n=parseInt(r[1],10),o=A>10,i=10===A&&n>=10;t.IS_SUPPORT_READDIR_WITH_FILE_TYPES=o||i},85670:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(31020),n=r(35516),o=r(38844);function i(e={}){return e instanceof o.default?e:new o.default(e)}t.Settings=o.default,t.scandir=function(e,t,r){if("function"==typeof t)return A.read(e,i(),t);A.read(e,i(t),r)},t.scandirSync=function(e,t){const r=i(t);return n.read(e,r)}},31020:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(53403),n=r(69078),o=r(79774),i=r(65225);function s(e,t,r){t.fs.readdir(e,{withFileTypes:!0},(A,o)=>{if(null!==A)return c(r,A);const s=o.map(r=>({dirent:r,name:r.name,path:`${e}${t.pathSegmentSeparator}${r.name}`}));if(!t.followSymbolicLinks)return g(r,s);const a=s.map(e=>function(e,t){return r=>{if(!e.dirent.isSymbolicLink())return r(null,e);t.fs.stat(e.path,(A,n)=>null!==A?t.throwErrorOnBrokenSymbolicLink?r(A):r(null,e):(e.dirent=i.fs.createDirentFromStats(e.name,n),r(null,e)))}}(e,t));n(a,(e,t)=>{if(null!==e)return c(r,e);g(r,t)})})}function a(e,t,r){t.fs.readdir(e,(o,s)=>{if(null!==o)return c(r,o);const a=s.map(r=>`${e}${t.pathSegmentSeparator}${r}`),l=a.map(e=>r=>A.stat(e,t.fsStatSettings,r));n(l,(e,A)=>{if(null!==e)return c(r,e);const n=[];s.forEach((e,r)=>{const o=A[r],s={name:e,path:a[r],dirent:i.fs.createDirentFromStats(e,o)};t.stats&&(s.stats=o),n.push(s)}),g(r,n)})})}function c(e,t){e(t)}function g(e,t){e(null,t)}t.read=function(e,t,r){return!t.stats&&o.IS_SUPPORT_READDIR_WITH_FILE_TYPES?s(e,t,r):a(e,t,r)},t.readdirWithFileTypes=s,t.readdir=a},35516:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(53403),n=r(79774),o=r(65225);function i(e,t){return t.fs.readdirSync(e,{withFileTypes:!0}).map(r=>{const A={dirent:r,name:r.name,path:`${e}${t.pathSegmentSeparator}${r.name}`};if(A.dirent.isSymbolicLink()&&t.followSymbolicLinks)try{const e=t.fs.statSync(A.path);A.dirent=o.fs.createDirentFromStats(A.name,e)}catch(e){if(t.throwErrorOnBrokenSymbolicLink)throw e}return A})}function s(e,t){return t.fs.readdirSync(e).map(r=>{const n=`${e}${t.pathSegmentSeparator}${r}`,i=A.statSync(n,t.fsStatSettings),s={name:r,path:n,dirent:o.fs.createDirentFromStats(r,i)};return t.stats&&(s.stats=i),s})}t.read=function(e,t){return!t.stats&&n.IS_SUPPORT_READDIR_WITH_FILE_TYPES?i(e,t):s(e,t)},t.readdirWithFileTypes=i,t.readdir=s},38844:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(85622),n=r(53403),o=r(96117);t.default=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=o.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,A.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new n.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return void 0===e?t:e}}},72156:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}}t.createDirentFromStats=function(e,t){return new r(e,t)}},65225:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(72156);t.fs=A},71208:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(35747);t.FILE_SYSTEM_ADAPTER={lstat:A.lstat,stat:A.stat,lstatSync:A.lstatSync,statSync:A.statSync},t.createFileSystemAdapter=function(e){return void 0===e?t.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},t.FILE_SYSTEM_ADAPTER),e)}},53403:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(17790),n=r(34846),o=r(92687);function i(e={}){return e instanceof o.default?e:new o.default(e)}t.Settings=o.default,t.stat=function(e,t,r){if("function"==typeof t)return A.read(e,i(),t);A.read(e,i(t),r)},t.statSync=function(e,t){const r=i(t);return n.read(e,r)}},17790:(e,t)=>{"use strict";function r(e,t){e(t)}function A(e,t){e(null,t)}Object.defineProperty(t,"__esModule",{value:!0}),t.read=function(e,t,n){t.fs.lstat(e,(o,i)=>null!==o?r(n,o):i.isSymbolicLink()&&t.followSymbolicLink?void t.fs.stat(e,(e,o)=>{if(null!==e)return t.throwErrorOnBrokenSymbolicLink?r(n,e):A(n,i);t.markSymbolicLink&&(o.isSymbolicLink=()=>!0),A(n,o)}):A(n,i))}},34846:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.read=function(e,t){const r=t.fs.lstatSync(e);if(!r.isSymbolicLink()||!t.followSymbolicLink)return r;try{const r=t.fs.statSync(e);return t.markSymbolicLink&&(r.isSymbolicLink=()=>!0),r}catch(e){if(!t.throwErrorOnBrokenSymbolicLink)return r;throw e}}},92687:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(71208);t.default=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=A.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,t){return void 0===e?t:e}}},72897:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(42369),n=r(27696),o=r(22111),i=r(14954);function s(e={}){return e instanceof i.default?e:new i.default(e)}t.Settings=i.default,t.walk=function(e,t,r){if("function"==typeof t)return new A.default(e,s()).read(t);new A.default(e,s(t)).read(r)},t.walkSync=function(e,t){const r=s(t);return new o.default(e,r).read()},t.walkStream=function(e,t){const r=s(t);return new n.default(e,r).read()}},42369:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(98566);t.default=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new A.default(this._root,this._settings),this._storage=new Set}read(e){this._reader.onError(t=>{!function(e,t){e(t)}(e,t)}),this._reader.onEntry(e=>{this._storage.add(e)}),this._reader.onEnd(()=>{!function(e,t){e(null,t)}(e,[...this._storage])}),this._reader.read()}}},27696:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(92413),n=r(98566);t.default=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new n.default(this._root,this._settings),this._stream=new A.Readable({objectMode:!0,read:()=>{},destroy:this._reader.destroy.bind(this._reader)})}read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}}},22111:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(97835);t.default=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new A.default(this._root,this._settings)}read(){return this._reader.read()}}},98566:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(28614),n=r(85670),o=r(98360),i=r(10750),s=r(75504);class a extends s.default{constructor(e,t){super(e,t),this._settings=t,this._scandir=n.scandir,this._emitter=new A.EventEmitter,this._queue=o(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit("end")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}destroy(){if(this._isDestroyed)throw new Error("The reader is already destroyed");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on("entry",e)}onError(e){this._emitter.once("error",e)}onEnd(e){this._emitter.once("end",e)}_pushToQueue(e,t){const r={directory:e,base:t};this._queue.push(r,e=>{null!==e&&this._handleError(e)})}_worker(e,t){this._scandir(e.directory,this._settings.fsScandirSettings,(r,A)=>{if(null!==r)return t(r,void 0);for(const t of A)this._handleEntry(t,e.base);t(null,void 0)})}_handleError(e){i.isFatalError(this._settings,e)&&(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,t){if(this._isDestroyed||this._isFatalError)return;const r=e.path;void 0!==t&&(e.path=i.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),i.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&i.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(r,e.path)}_emitEntry(e){this._emitter.emit("entry",e)}}t.default=a},10750:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isFatalError=function(e,t){return null===e.errorFilter||!e.errorFilter(t)},t.isAppliedFilter=function(e,t){return null===e||e(t)},t.replacePathSegmentSeparator=function(e,t){return e.split(/[\\/]/).join(t)},t.joinPathSegments=function(e,t,r){return""===e?t:e+r+t}},75504:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(10750);t.default=class{constructor(e,t){this._root=e,this._settings=t,this._root=A.replacePathSegmentSeparator(e,t.pathSegmentSeparator)}}},97835:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(85670),n=r(10750),o=r(75504);class i extends o.default{constructor(){super(...arguments),this._scandir=A.scandirSync,this._storage=new Set,this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),[...this._storage]}_pushToQueue(e,t){this._queue.add({directory:e,base:t})}_handleQueue(){for(const e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,t){try{const r=this._scandir(e,this._settings.fsScandirSettings);for(const e of r)this._handleEntry(e,t)}catch(e){this._handleError(e)}}_handleError(e){if(n.isFatalError(this._settings,e))throw e}_handleEntry(e,t){const r=e.path;void 0!==t&&(e.path=n.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),n.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&n.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(r,e.path)}_pushToStorage(e){this._storage.add(e)}}t.default=i},14954:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(85622),n=r(85670);t.default=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,1/0),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,A.sep),this.fsScandirSettings=new n.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return void 0===e?t:e}}},7966:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];const A=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","HTMLElement",...r];const n=["null","undefined","string","number","bigint","boolean","symbol"];function o(e){return t=>typeof t===e}const{toString:i}=Object.prototype,s=e=>{const t=i.call(e).slice(8,-1);return/HTML\w+Element/.test(t)&&c.domElement(e)?"HTMLElement":(r=t,A.includes(r)?t:void 0);var r},a=e=>t=>s(t)===e;function c(e){if(null===e)return"null";switch(typeof e){case"undefined":return"undefined";case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"function":return"Function";case"bigint":return"bigint";case"symbol":return"symbol"}if(c.observable(e))return"Observable";if(c.array(e))return"Array";if(c.buffer(e))return"Buffer";const t=s(e);if(t)return t;if(e instanceof String||e instanceof Boolean||e instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}c.undefined=o("undefined"),c.string=o("string");const g=o("number");c.number=e=>g(e)&&!c.nan(e),c.bigint=o("bigint"),c.function_=o("function"),c.null_=e=>null===e,c.class_=e=>c.function_(e)&&e.toString().startsWith("class "),c.boolean=e=>!0===e||!1===e,c.symbol=o("symbol"),c.numericString=e=>c.string(e)&&!c.emptyStringOrWhitespace(e)&&!Number.isNaN(Number(e)),c.array=(e,t)=>!!Array.isArray(e)&&(!c.function_(t)||e.every(t)),c.buffer=e=>{var t,r,A,n;return null!==(n=null===(A=null===(r=null===(t=e)||void 0===t?void 0:t.constructor)||void 0===r?void 0:r.isBuffer)||void 0===A?void 0:A.call(r,e))&&void 0!==n&&n},c.nullOrUndefined=e=>c.null_(e)||c.undefined(e),c.object=e=>!c.null_(e)&&("object"==typeof e||c.function_(e)),c.iterable=e=>{var t;return c.function_(null===(t=e)||void 0===t?void 0:t[Symbol.iterator])},c.asyncIterable=e=>{var t;return c.function_(null===(t=e)||void 0===t?void 0:t[Symbol.asyncIterator])},c.generator=e=>c.iterable(e)&&c.function_(e.next)&&c.function_(e.throw),c.asyncGenerator=e=>c.asyncIterable(e)&&c.function_(e.next)&&c.function_(e.throw),c.nativePromise=e=>a("Promise")(e);c.promise=e=>c.nativePromise(e)||(e=>{var t,r;return c.function_(null===(t=e)||void 0===t?void 0:t.then)&&c.function_(null===(r=e)||void 0===r?void 0:r.catch)})(e),c.generatorFunction=a("GeneratorFunction"),c.asyncGeneratorFunction=e=>"AsyncGeneratorFunction"===s(e),c.asyncFunction=e=>"AsyncFunction"===s(e),c.boundFunction=e=>c.function_(e)&&!e.hasOwnProperty("prototype"),c.regExp=a("RegExp"),c.date=a("Date"),c.error=a("Error"),c.map=e=>a("Map")(e),c.set=e=>a("Set")(e),c.weakMap=e=>a("WeakMap")(e),c.weakSet=e=>a("WeakSet")(e),c.int8Array=a("Int8Array"),c.uint8Array=a("Uint8Array"),c.uint8ClampedArray=a("Uint8ClampedArray"),c.int16Array=a("Int16Array"),c.uint16Array=a("Uint16Array"),c.int32Array=a("Int32Array"),c.uint32Array=a("Uint32Array"),c.float32Array=a("Float32Array"),c.float64Array=a("Float64Array"),c.bigInt64Array=a("BigInt64Array"),c.bigUint64Array=a("BigUint64Array"),c.arrayBuffer=a("ArrayBuffer"),c.sharedArrayBuffer=a("SharedArrayBuffer"),c.dataView=a("DataView"),c.directInstanceOf=(e,t)=>Object.getPrototypeOf(e)===t.prototype,c.urlInstance=e=>a("URL")(e),c.urlString=e=>{if(!c.string(e))return!1;try{return new URL(e),!0}catch(e){return!1}},c.truthy=e=>Boolean(e),c.falsy=e=>!e,c.nan=e=>Number.isNaN(e),c.primitive=e=>{return c.null_(e)||(t=typeof e,n.includes(t));var t},c.integer=e=>Number.isInteger(e),c.safeInteger=e=>Number.isSafeInteger(e),c.plainObject=e=>{if("[object Object]"!==i.call(e))return!1;const t=Object.getPrototypeOf(e);return null===t||t===Object.getPrototypeOf({})},c.typedArray=e=>{return t=s(e),r.includes(t);var t};c.arrayLike=e=>!c.nullOrUndefined(e)&&!c.function_(e)&&(e=>c.safeInteger(e)&&e>=0)(e.length),c.inRange=(e,t)=>{if(c.number(t))return e>=Math.min(0,t)&&e<=Math.max(t,0);if(c.array(t)&&2===t.length)return e>=Math.min(...t)&&e<=Math.max(...t);throw new TypeError("Invalid range: "+JSON.stringify(t))};const l=["innerHTML","ownerDocument","style","attributes","nodeValue"];c.domElement=e=>c.object(e)&&1===e.nodeType&&c.string(e.nodeName)&&!c.plainObject(e)&&l.every(t=>t in e),c.observable=e=>{var t,r,A,n;return!!e&&(e===(null===(r=(t=e)[Symbol.observable])||void 0===r?void 0:r.call(t))||e===(null===(n=(A=e)["@@observable"])||void 0===n?void 0:n.call(A)))},c.nodeStream=e=>c.object(e)&&c.function_(e.pipe)&&!c.observable(e),c.infinite=e=>e===1/0||e===-1/0;const u=e=>t=>c.integer(t)&&Math.abs(t%2)===e;c.evenInteger=u(0),c.oddInteger=u(1),c.emptyArray=e=>c.array(e)&&0===e.length,c.nonEmptyArray=e=>c.array(e)&&e.length>0,c.emptyString=e=>c.string(e)&&0===e.length,c.nonEmptyString=e=>c.string(e)&&e.length>0;c.emptyStringOrWhitespace=e=>c.emptyString(e)||(e=>c.string(e)&&!/\S/.test(e))(e),c.emptyObject=e=>c.object(e)&&!c.map(e)&&!c.set(e)&&0===Object.keys(e).length,c.nonEmptyObject=e=>c.object(e)&&!c.map(e)&&!c.set(e)&&Object.keys(e).length>0,c.emptySet=e=>c.set(e)&&0===e.size,c.nonEmptySet=e=>c.set(e)&&e.size>0,c.emptyMap=e=>c.map(e)&&0===e.size,c.nonEmptyMap=e=>c.map(e)&&e.size>0;const h=(e,t,r)=>{if(!c.function_(t))throw new TypeError("Invalid predicate: "+JSON.stringify(t));if(0===r.length)throw new TypeError("Invalid number of values");return e.call(r,t)};c.any=(e,...t)=>(c.array(e)?e:[e]).some(e=>h(Array.prototype.some,e,t)),c.all=(e,...t)=>h(Array.prototype.every,e,t);const p=(e,t,r)=>{if(!e)throw new TypeError(`Expected value which is \`${t}\`, received value of type \`${c(r)}\`.`)};t.assert={undefined:e=>p(c.undefined(e),"undefined",e),string:e=>p(c.string(e),"string",e),number:e=>p(c.number(e),"number",e),bigint:e=>p(c.bigint(e),"bigint",e),function_:e=>p(c.function_(e),"Function",e),null_:e=>p(c.null_(e),"null",e),class_:e=>p(c.class_(e),"Class",e),boolean:e=>p(c.boolean(e),"boolean",e),symbol:e=>p(c.symbol(e),"symbol",e),numericString:e=>p(c.numericString(e),"string with a number",e),array:(e,t)=>{p(c.array(e),"Array",e),t&&e.forEach(t)},buffer:e=>p(c.buffer(e),"Buffer",e),nullOrUndefined:e=>p(c.nullOrUndefined(e),"null or undefined",e),object:e=>p(c.object(e),"Object",e),iterable:e=>p(c.iterable(e),"Iterable",e),asyncIterable:e=>p(c.asyncIterable(e),"AsyncIterable",e),generator:e=>p(c.generator(e),"Generator",e),asyncGenerator:e=>p(c.asyncGenerator(e),"AsyncGenerator",e),nativePromise:e=>p(c.nativePromise(e),"native Promise",e),promise:e=>p(c.promise(e),"Promise",e),generatorFunction:e=>p(c.generatorFunction(e),"GeneratorFunction",e),asyncGeneratorFunction:e=>p(c.asyncGeneratorFunction(e),"AsyncGeneratorFunction",e),asyncFunction:e=>p(c.asyncFunction(e),"AsyncFunction",e),boundFunction:e=>p(c.boundFunction(e),"Function",e),regExp:e=>p(c.regExp(e),"RegExp",e),date:e=>p(c.date(e),"Date",e),error:e=>p(c.error(e),"Error",e),map:e=>p(c.map(e),"Map",e),set:e=>p(c.set(e),"Set",e),weakMap:e=>p(c.weakMap(e),"WeakMap",e),weakSet:e=>p(c.weakSet(e),"WeakSet",e),int8Array:e=>p(c.int8Array(e),"Int8Array",e),uint8Array:e=>p(c.uint8Array(e),"Uint8Array",e),uint8ClampedArray:e=>p(c.uint8ClampedArray(e),"Uint8ClampedArray",e),int16Array:e=>p(c.int16Array(e),"Int16Array",e),uint16Array:e=>p(c.uint16Array(e),"Uint16Array",e),int32Array:e=>p(c.int32Array(e),"Int32Array",e),uint32Array:e=>p(c.uint32Array(e),"Uint32Array",e),float32Array:e=>p(c.float32Array(e),"Float32Array",e),float64Array:e=>p(c.float64Array(e),"Float64Array",e),bigInt64Array:e=>p(c.bigInt64Array(e),"BigInt64Array",e),bigUint64Array:e=>p(c.bigUint64Array(e),"BigUint64Array",e),arrayBuffer:e=>p(c.arrayBuffer(e),"ArrayBuffer",e),sharedArrayBuffer:e=>p(c.sharedArrayBuffer(e),"SharedArrayBuffer",e),dataView:e=>p(c.dataView(e),"DataView",e),urlInstance:e=>p(c.urlInstance(e),"URL",e),urlString:e=>p(c.urlString(e),"string with a URL",e),truthy:e=>p(c.truthy(e),"truthy",e),falsy:e=>p(c.falsy(e),"falsy",e),nan:e=>p(c.nan(e),"NaN",e),primitive:e=>p(c.primitive(e),"primitive",e),integer:e=>p(c.integer(e),"integer",e),safeInteger:e=>p(c.safeInteger(e),"integer",e),plainObject:e=>p(c.plainObject(e),"plain object",e),typedArray:e=>p(c.typedArray(e),"TypedArray",e),arrayLike:e=>p(c.arrayLike(e),"array-like",e),domElement:e=>p(c.domElement(e),"HTMLElement",e),observable:e=>p(c.observable(e),"Observable",e),nodeStream:e=>p(c.nodeStream(e),"Node.js Stream",e),infinite:e=>p(c.infinite(e),"infinite number",e),emptyArray:e=>p(c.emptyArray(e),"empty array",e),nonEmptyArray:e=>p(c.nonEmptyArray(e),"non-empty array",e),emptyString:e=>p(c.emptyString(e),"empty string",e),nonEmptyString:e=>p(c.nonEmptyString(e),"non-empty string",e),emptyStringOrWhitespace:e=>p(c.emptyStringOrWhitespace(e),"empty string or whitespace",e),emptyObject:e=>p(c.emptyObject(e),"empty object",e),nonEmptyObject:e=>p(c.nonEmptyObject(e),"non-empty object",e),emptySet:e=>p(c.emptySet(e),"empty set",e),nonEmptySet:e=>p(c.nonEmptySet(e),"non-empty set",e),emptyMap:e=>p(c.emptyMap(e),"empty map",e),nonEmptyMap:e=>p(c.nonEmptyMap(e),"non-empty map",e),evenInteger:e=>p(c.evenInteger(e),"even integer",e),oddInteger:e=>p(c.oddInteger(e),"odd integer",e),directInstanceOf:(e,t)=>p(c.directInstanceOf(e,t),"T",e),inRange:(e,t)=>p(c.inRange(e,t),"in range",e),any:(e,...t)=>p(c.any(e,...t),"predicate returns truthy for any value",t),all:(e,...t)=>p(c.all(e,...t),"predicate returns truthy for all values",t)},Object.defineProperties(c,{class:{value:c.class_},function:{value:c.function_},null:{value:c.null_}}),Object.defineProperties(t.assert,{class:{value:t.assert.class_},function:{value:t.assert.function_},null:{value:t.assert.null_}}),t.default=c,e.exports=c,e.exports.default=c,e.exports.assert=t.assert},98298:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(93121),n=Number(process.versions.node.split(".")[0]),o=e=>{const t={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};e.timings=t;const r=e=>{const r=e.emit.bind(e);e.emit=(A,...n)=>("error"===A&&(t.error=Date.now(),t.phases.total=t.error-t.start,e.emit=r),r(A,...n))};r(e),e.prependOnceListener("abort",()=>{t.abort=Date.now(),(!t.response||n>=13)&&(t.phases.total=Date.now()-t.start)});const o=e=>{t.socket=Date.now(),t.phases.wait=t.socket-t.start;const r=()=>{t.lookup=Date.now(),t.phases.dns=t.lookup-t.socket};e.prependOnceListener("lookup",r),A.default(e,{connect:()=>{t.connect=Date.now(),void 0===t.lookup&&(e.removeListener("lookup",r),t.lookup=t.connect,t.phases.dns=t.lookup-t.socket),t.phases.tcp=t.connect-t.lookup},secureConnect:()=>{t.secureConnect=Date.now(),t.phases.tls=t.secureConnect-t.connect}})};e.socket?o(e.socket):e.prependOnceListener("socket",o);const i=()=>{var e;t.upload=Date.now(),t.phases.request=t.upload-(null!=(e=t.secureConnect)?e:t.connect)};return("boolean"==typeof e.writableFinished?!e.writableFinished:!e.finished||0!==e.outputSize||e.socket&&0!==e.socket.writableLength)?e.prependOnceListener("finish",i):i(),e.prependOnceListener("response",e=>{t.response=Date.now(),t.phases.firstByte=t.response-t.upload,e.timings=t,r(e),e.prependOnceListener("end",()=>{t.end=Date.now(),t.phases.download=t.end-t.response,t.phases.total=t.end-t.start})}),t};t.default=o,e.exports=o,e.exports.default=o},58069:(e,t,r)=>{"use strict";l.ifExists=function(e,t,r){return l(e,t,r).catch(()=>{})};const A=r(31669),n=r(46227),o=r(85622),i=r(97369),s=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,a={createPwshFile:!0,createCmdFile:i(),fs:r(35747)},c=new Map([[".js","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function g(e){const t={...a,...e},r=t.fs;return t.fs_={chmod:r.chmod?A.promisify(r.chmod):async()=>{},stat:A.promisify(r.stat),unlink:A.promisify(r.unlink),readFile:A.promisify(r.readFile),writeFile:A.promisify(r.writeFile)},t}async function l(e,t,r){const A=g(r);await A.fs_.stat(e),await async function(e,t,r){const A=await async function(e,t){const r=await t.fs_.readFile(e,"utf8"),A=r.trim().split(/\r*\n/)[0].match(s);if(!A){const t=o.extname(e).toLowerCase();return{program:c.get(t)||null,additionalArgs:""}}return{program:A[1],additionalArgs:A[2]}}(e,r);return await function(e,t){return n(o.dirname(e),{fs:t.fs})}(t,r),function(e,t,r,A){const n=g(A),o=[{generator:h,extension:""}];n.createCmdFile&&o.push({generator:u,extension:".cmd"});n.createPwshFile&&o.push({generator:p,extension:".ps1"});return Promise.all(o.map(A=>async function(e,t,r,A,n){const o=n.preserveSymlinks?"--preserve-symlinks":"",i=[r.additionalArgs,o].filter(e=>e).join(" ");return n=Object.assign({},n,{prog:r.program,args:i}),await function(e,t){return function(e,t){return t.fs_.unlink(e).catch(()=>{})}(e,t)}(t,n),await n.fs_.writeFile(t,A(e,t,n),"utf8"),function(e,t){return function(e,t){return t.fs_.chmod(e,493)}(e,t)}(t,n)}(e,t+A.extension,r,A.generator,n)))}(e,t,A,r)}(e,t,A)}function u(e,t,r){let A=o.relative(o.dirname(t),e).split("/").join("\\");const n=o.isAbsolute(A)?`"${A}"`:`"%~dp0\\${A}"`;let i,s=r.prog,a=r.args||"";const c=d(r.nodePath).win32;s?(i=`"%~dp0\\${s}.exe"`,A=n):(s=n,a="",A="");let g=r.progArgs?r.progArgs.join(" ")+" ":"",l=c?`@SET NODE_PATH=${c}\r\n`:"";return l+=i?`@IF EXIST ${i} (\r\n ${i} ${a} ${A} ${g}%*\r\n) ELSE (\r\n @SETLOCAL\r\n @SET PATHEXT=%PATHEXT:;.JS;=;%\r\n ${s} ${a} ${A} ${g}%*\r\n)`:`@${s} ${a} ${A} ${g}%*\r\n`,l}function h(e,t,r){let A,n=o.relative(o.dirname(t),e),i=r.prog&&r.prog.split("\\").join("/");n=n.split("\\").join("/");const s=o.isAbsolute(n)?`"${n}"`:`"$basedir/${n}"`;let a=r.args||"";const c=d(r.nodePath).posix;i?(A=`"$basedir/${r.prog}"`,n=s):(i=s,a="",n="");let g=r.progArgs?r.progArgs.join(" ")+" ":"",l="#!/bin/sh\n";l+='basedir=$(dirname "$(echo "$0" | sed -e \'s,\\\\,/,g\')")\n\ncase `uname` in\n *CYGWIN*) basedir=`cygpath -w "$basedir"`;;\nesac\n\n';const u=r.nodePath?`export NODE_PATH="${c}"\n`:"";return l+=A?u+`if [ -x ${A} ]; then\n`+` exec ${A} ${a} ${n} ${g}"$@"\nelse \n`+` exec ${i} ${a} ${n} ${g}"$@"\nfi\n`:`${u}${i} ${a} ${n} ${g}"$@"\nexit $?\n`,l}function p(e,t,r){let A=o.relative(o.dirname(t),e);const n=r.prog&&r.prog.split("\\").join("/");let i,s=n&&`"${n}$exe"`;A=A.split("\\").join("/");const a=o.isAbsolute(A)?`"${A}"`:`"$basedir/${A}"`;let c=r.args||"",g=d(r.nodePath);const l=g.win32,u=g.posix;s?(i=`"$basedir/${r.prog}$exe"`,A=a):(s=a,c="",A="");let h=r.progArgs?r.progArgs.join(" ")+" ":"",p='#!/usr/bin/env pwsh\n$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\n\n$exe=""\n'+(r.nodePath?`$env_node_path=$env:NODE_PATH\n$env:NODE_PATH="${l}"\n`:"")+'if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {\n # Fix case when both the Windows and Linux builds of Node\n # are installed in the same directory\n $exe=".exe"\n}';return r.nodePath&&(p=p+" else {\n"+` $env:NODE_PATH="${u}"\n}`),p+="\n",p=i?p+"$ret=0\n"+`if (Test-Path ${i}) {\n # Support pipeline input\n if ($MyInvocation.ExpectingInput) {\n`+` $input | & ${i} ${c} ${A} ${h}$args\n } else {\n`+` & ${i} ${c} ${A} ${h}$args\n }\n $ret=$LASTEXITCODE\n} else {\n # Support pipeline input\n if ($MyInvocation.ExpectingInput) {\n`+` $input | & ${s} ${c} ${A} ${h}$args\n } else {\n`+` & ${s} ${c} ${A} ${h}$args\n }\n $ret=$LASTEXITCODE\n}\n`+(r.nodePath?"$env:NODE_PATH=$env_node_path\n":"")+"exit $ret\n":p+"# Support pipeline input\nif ($MyInvocation.ExpectingInput) {\n"+` $input | & ${s} ${c} ${A} ${h}$args\n} else {\n`+` & ${s} ${c} ${A} ${h}$args\n}\n`+(r.nodePath?"$env:NODE_PATH=$env_node_path\n":"")+"exit $LASTEXITCODE\n",p}function d(e){if(!e)return{win32:"",posix:""};let t="string"==typeof e?e.split(o.delimiter):Array.from(e),r={};for(let e=0;e"/mnt/"+t.toLowerCase()):t[e];r.win32=r.win32?`${r.win32};${A}`:A,r.posix=r.posix?`${r.posix}:${n}`:n,r[e]={win32:A,posix:n}}return r}e.exports=l},97991:(e,t,r)=>{"use strict";const A=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,n=()=>{const e={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(e.enabled="0"!==process.env.FORCE_COLOR);const t=(e,t,r)=>"function"==typeof e?e(t):e.wrap(t,r),n=(r,A)=>{if(""===r||null==r)return"";if(!1===e.enabled)return r;if(!1===e.visible)return"";let n=""+r,o=n.includes("\n"),i=A.length;for(i>0&&A.includes("unstyle")&&(A=[...new Set(["unstyle",...A])].reverse());i-- >0;)n=t(e.styles[A[i]],n,o);return n},o=(t,r,A)=>{e.styles[t]=(e=>{let t=e.open=`[${e.codes[0]}m`,r=e.close=`[${e.codes[1]}m`,A=e.regex=new RegExp(`\\u001b\\[${e.codes[1]}m`,"g");return e.wrap=(e,n)=>{e.includes(r)&&(e=e.replace(A,r+t));let o=t+e+r;return n?o.replace(/\r*\n/g,`${r}$&${t}`):o},e})({name:t,codes:r}),(e.keys[A]||(e.keys[A]=[])).push(t),Reflect.defineProperty(e,t,{configurable:!0,enumerable:!0,set(r){e.alias(t,r)},get(){let r=e=>n(e,r.stack);return Reflect.setPrototypeOf(r,e),r.stack=this.stack?this.stack.concat(t):[t],r}})};return o("reset",[0,0],"modifier"),o("bold",[1,22],"modifier"),o("dim",[2,22],"modifier"),o("italic",[3,23],"modifier"),o("underline",[4,24],"modifier"),o("inverse",[7,27],"modifier"),o("hidden",[8,28],"modifier"),o("strikethrough",[9,29],"modifier"),o("black",[30,39],"color"),o("red",[31,39],"color"),o("green",[32,39],"color"),o("yellow",[33,39],"color"),o("blue",[34,39],"color"),o("magenta",[35,39],"color"),o("cyan",[36,39],"color"),o("white",[37,39],"color"),o("gray",[90,39],"color"),o("grey",[90,39],"color"),o("bgBlack",[40,49],"bg"),o("bgRed",[41,49],"bg"),o("bgGreen",[42,49],"bg"),o("bgYellow",[43,49],"bg"),o("bgBlue",[44,49],"bg"),o("bgMagenta",[45,49],"bg"),o("bgCyan",[46,49],"bg"),o("bgWhite",[47,49],"bg"),o("blackBright",[90,39],"bright"),o("redBright",[91,39],"bright"),o("greenBright",[92,39],"bright"),o("yellowBright",[93,39],"bright"),o("blueBright",[94,39],"bright"),o("magentaBright",[95,39],"bright"),o("cyanBright",[96,39],"bright"),o("whiteBright",[97,39],"bright"),o("bgBlackBright",[100,49],"bgBright"),o("bgRedBright",[101,49],"bgBright"),o("bgGreenBright",[102,49],"bgBright"),o("bgYellowBright",[103,49],"bgBright"),o("bgBlueBright",[104,49],"bgBright"),o("bgMagentaBright",[105,49],"bgBright"),o("bgCyanBright",[106,49],"bgBright"),o("bgWhiteBright",[107,49],"bgBright"),e.ansiRegex=A,e.hasColor=e.hasAnsi=t=>(e.ansiRegex.lastIndex=0,"string"==typeof t&&""!==t&&e.ansiRegex.test(t)),e.alias=(t,r)=>{let A="string"==typeof r?e[r]:r;if("function"!=typeof A)throw new TypeError("Expected alias to be the name of an existing color (string) or a function");A.stack||(Reflect.defineProperty(A,"name",{value:t}),e.styles[t]=A,A.stack=[t]),Reflect.defineProperty(e,t,{configurable:!0,enumerable:!0,set(r){e.alias(t,r)},get(){let t=e=>n(e,t.stack);return Reflect.setPrototypeOf(t,e),t.stack=this.stack?this.stack.concat(A.stack):A.stack,t}})},e.theme=t=>{if(null===(r=t)||"object"!=typeof r||Array.isArray(r))throw new TypeError("Expected theme to be an object");var r;for(let r of Object.keys(t))e.alias(r,t[r]);return e},e.alias("unstyle",t=>"string"==typeof t&&""!==t?(e.ansiRegex.lastIndex=0,t.replace(e.ansiRegex,"")):""),e.alias("noop",e=>e),e.none=e.clear=e.noop,e.stripColor=e.unstyle,e.symbols=r(31283),e.define=o,e};e.exports=n(),e.exports.create=n},31283:e=>{"use strict";const t="Hyper"===process.env.TERM_PROGRAM,r="win32"===process.platform,A="linux"===process.platform,n={ballotDisabled:"☒",ballotOff:"â˜",ballotOn:"☑",bullet:"•",bulletWhite:"â—¦",fullBlock:"â–ˆ",heart:"â¤",identicalTo:"≡",line:"─",mark:"※",middot:"·",minus:"ï¼",multiplication:"×",obelus:"÷",pencilDownRight:"✎",pencilRight:"âœ",pencilUpRight:"âœ",percent:"%",pilcrow2:"â¡",pilcrow:"¶",plusMinus:"±",section:"§",starsOff:"☆",starsOn:"★",upDownArrow:"↕"},o=Object.assign({},n,{check:"√",cross:"×",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"»",radioOff:"( )",radioOn:"(*)",warning:"‼"}),i=Object.assign({},n,{ballotCross:"✘",check:"✔",cross:"✖",ellipsisLarge:"⋯",ellipsis:"…",info:"ℹ",question:"?",questionFull:"?",questionSmall:"ï¹–",pointer:A?"â–¸":"â¯",pointerSmall:A?"‣":"›",radioOff:"â—¯",radioOn:"â—‰",warning:"âš "});e.exports=r&&!t?o:i,Reflect.defineProperty(e.exports,"common",{enumerable:!1,value:n}),Reflect.defineProperty(e.exports,"windows",{enumerable:!1,value:o}),Reflect.defineProperty(e.exports,"other",{enumerable:!1,value:i})},18483:(e,t,r)=>{"use strict";e=r.nmd(e);const A=(e,t)=>(...r)=>`[${e(...r)+t}m`,n=(e,t)=>(...r)=>{const A=e(...r);return`[${38+t};5;${A}m`},o=(e,t)=>(...r)=>{const A=e(...r);return`[${38+t};2;${A[0]};${A[1]};${A[2]}m`},i=e=>e,s=(e,t,r)=>[e,t,r],a=(e,t,r)=>{Object.defineProperty(e,t,{get:()=>{const A=r();return Object.defineProperty(e,t,{value:A,enumerable:!0,configurable:!0}),A},enumerable:!0,configurable:!0})};let c;const g=(e,t,A,n)=>{void 0===c&&(c=r(2744));const o=n?10:0,i={};for(const[r,n]of Object.entries(c)){const s="ansi16"===r?"ansi":r;r===t?i[s]=e(A,o):"object"==typeof n&&(i[s]=e(n[t],o))}return i};Object.defineProperty(e,"exports",{enumerable:!0,get:function(){const e=new Map,t={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};t.color.gray=t.color.blackBright,t.bgColor.bgGray=t.bgColor.bgBlackBright,t.color.grey=t.color.blackBright,t.bgColor.bgGrey=t.bgColor.bgBlackBright;for(const[r,A]of Object.entries(t)){for(const[r,n]of Object.entries(A))t[r]={open:`[${n[0]}m`,close:`[${n[1]}m`},A[r]=t[r],e.set(n[0],n[1]);Object.defineProperty(t,r,{value:A,enumerable:!1})}return Object.defineProperty(t,"codes",{value:e,enumerable:!1}),t.color.close="",t.bgColor.close="",a(t.color,"ansi",()=>g(A,"ansi16",i,!1)),a(t.color,"ansi256",()=>g(n,"ansi256",i,!1)),a(t.color,"ansi16m",()=>g(o,"rgb",s,!1)),a(t.bgColor,"ansi",()=>g(A,"ansi16",i,!0)),a(t.bgColor,"ansi256",()=>g(n,"ansi256",i,!0)),a(t.bgColor,"ansi16m",()=>g(o,"rgb",s,!0)),t}})},39920:e=>{"use strict";e.exports=(...e)=>[...new Set([].concat(...e))]},67648:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getBinjumper=void 0;const A=r(78761);let n=null;t.getBinjumper=function(){return n||(n=A.gunzipSync(Buffer.from("H4sIAAAAAAAACu18DXgU1dXwzOwkLMmaWTUgYtQlXRRKCASwJRh0Q7IBJdHwE0BJCCHZhejmx91ZCELM4uxqpuPWaG1rW3wV0YqVT7GlCf4U80cSLNKIgAhUUWmdZdFGsCEhkP3OuXM32fBT+/Tp+3zv99bNc/f+nb977rnnnntnsjn31jE6hmF4SKEQw+xgtI+F+faPB1LcjW/GMduHvzdmB5v93piFq0pdpkpnxUpnUZmpuKi8vEI0rbCZnO5yU2m5KfPuBaayihJb8hVXxJgpjVwrw2Szw5lP214sDNM9xgi6WJYzMdOgsgQSxzCdV0FuRAQqnVFrR7lZKj/5dGqVxVNYMi6GMWmw+GXUQIyRg6hjmFHDIG8EVPafGPQFH34b4F+iffkTwOcf0EsWbVUi5OapVKBpkYOgNJjc5cklRWIRlOOxAccOY2amD4WzMJMbk50aYOYwgsgwekgzLoKzJNtWFdphdipjoaESkgHSrEvArXC5sFyFX55Lj8GDfEs1vkSHdZTvXZeQL2P+QiwTXT1Hx7HoEnCig/A14dc2CrfkUuN1OYsZOmeNFO7ei+EuLfl3n/BHOpmgZJpNCqMwM38CmhSvW5M983ooCN490L26JsoVCt2esk/q4dfc3J5pJibazptxmtWlyUCghxW8B6HmaxR8/ZCn7JM7pdaEZp7xizcxM58CWu61F2KO0TDd72IHG9Ghh443Q/AJvoHodTOjEP+VCHw0XPXTiZTzs4Sz+CPaEeokyIG18KXh/wzH4lsJ9QgamKvPaDTEdSC5NwsBtI4wjVvgq+5C+VZNJGWkoz4nUFkDMciuPmKAYRpf92t82QjZxyLfd0OBA0P7iEzDad8b/VT+BdLJUZu2FFlwkAkArSdMAItjBgQJdUonDVg2Whj1NaRwkldbohlmE59rYWTerHbHAe0rwR9uMnuQlPtO9W6AU0boEcCo/hW8gHS8S70NyKszsYeRgdcmBqChwG/iPRqhAPTJLWoMZglm9bcIen3XExrUZqSmZBgRsDGJMsMOJWMytm0d2paLbU9DW6AC1bf9Js0e0/yZ5iQyVxqkcZMJCqggyKRjLHQlISR0GQB0HAqqPgFNUmtaSx3YM4CiSkMjjoJc6lv9A7RRoVo/N9j/q6H9obGGJy1MuGE11M8BVN3AJ0/+yyKYEyOqezmgr0oi6obZcdMmUM9UrXGziILDSK7GZlCX1q6X27BxPG28ARo3M6A56PF1i1din14bcUelhQkdhMKxq4FVEWrJ1rN0WUHLoHztUYiKn534FfxDuEvLUF60IAQCGYeHiXZuEokhiLE4CX+cQOTd3ULGt3iR/w/HQSsLNpxMAkXK6808Gh7aadjyHyQIBrnFb4kOmzASevP7GjyU5Tb2tPr97xM7QZBM1NZoqPtt38hdS5cVFrQQXgvmK9Z4Jc8gW7sUq/FHBV0K4z3i5tt4LlFx6y0/ivP0xohjPL2J4lTvbn8V677NU93FUACrUZ6+hNACnDhsasvkWBN8cYlSoy54HTQPh+Z8bIYWLjgcWnS1Bk7uyQpurqPjhQnN7o5CM+Pccera86jnbwjZOvUlHIKtEUfUos4fD/JnMlc2qXzTMV792ziGGd+q2af1OGpG2HmrXzQbxzKZgOXukDqMsrXVn8HKfbJ1vy+kOdV26x5iwF0p+9qtnRGzBfPp6btdeHwx2Kenb4zw+DJQrH+a0bdP8O7jSL/UyLZZQvmpXe6/Kzmdvt2CrxkQN3WCkUrTWcH3GNYYMGGF6earLIIXnDqT6u4QHt4HBSVvD9DytQ8VIvAIFpqJv0nN63AOU6x7wDTMfuuhNo6ss7DjUaytZO1aO3C2u0Zjy9HNuDAV67HNuGAVW2NYd4QeTj3ap5xmVt8ep+0SZWDIUmi44C0ZXPe1N/izWNhmrPtZpXq/sLMmJPeBvnwnwRBx+AUAyjbb68Lj73T/PZCL6CBj9FAZ3a2yCDJWd0h7WWR7x2ici1a5B9VNBh18mnK11/nnfuzpvV549GfAR6jfHTL7N4Kh+p0gYI3wVJP8J03LP20a3otiLMAJWTiZHcCPkEc+6N0teKeCUG1cjd/JBsZBUTMro+C9BRjI77/fK3ivBxpsU9jfUfwO99+l6s5Ecbj0Gexq70NPG3uzP50lMuPyCnw6QOAAQwjUX4x/s7gG8N1Oyd2ZKHcM4r7YH96fPH33Cj9+GS187oueXrPw6DPnwwOPh12G0JgrNbMBJ6I4qfwmbSLeQGJoQL0oS3MgfnD+2tjEIdJOpRtYG5MPIgbMUAWhbo4UyohE2gK3nCe0dmKtKfDDEMm6oEb87caNS+TmWzAezH1m45JnUjpfxrLgDQCFBSmNwvO4eR+Byg6kKTyf0tjdxoo6qYPt3mUSo67A0LW7zYMt3JlmjFmxyGORYcUyqUMPHmDDSQwfYQMUXuXNykZzB3Ru2E6yjxuvZoRXDWZZa0WAR8NFg3mqVty9oQ/h3DcQshxyMJIij0VTdxORyLJ5HKgSD1ge4fmZmK0ei1J7UGrfvrVRO/AkQ/AsIDmKNDwKUZaebhnYfzYZcI9Fzz0WHLC9Djw5tvhzecXCyyMMxM+7A1KrQVt/LRfsBxhPKNcbM2Cq+0LieN8R8UoCF4p/hjQGWfc34OW3XQveuqsHJq111NIW8DspjZr9yC0wnUq8D4F9+9xdF244m5K0fWVYC42HorAB5yboRfm1eNMs9ejEeAAzkmnDcNFAtt864l4WmsdhUCovNOvRz8zh6PRSOMqQ0EffHS/NXIW+GwmLMe1RpILgPZx4DUZ486XWeEJg6bIwnx3xz1mYifgltzX1c77Gh46kHIFxKvwz2AiicRBWtbCpH9ecHIqtcQde4wZ2PvA8RF6QdSOLYl4MH9Z/SuPgXOKHyA8KnwMyq/ebMZyyYJwDIcURcaK9TtEh1X3fIxu03KbqzehD3QaIFPRKBi9PM4c6laV63xH3gTCVP2jAIMXSZS2bMrWALzwfOP8ot0ELH1FMlf8ezisM2YKjoGRkHapTzuDVA9C9CYWSw6KFQTL0ai50pjQSdmAoUkco2D1kfkj8ijIo+WYTyCEAXErj0rBZ1oWFrgwz0YKpcSm7gwacKLnJt08cLXcqxtTDSq7e/TffbnGCPI/YxXM8GQPB70iMlGNwP5VHINFgZ5jfgP2xYjwaYSEwmxA2rhZ7HdWXWNMelUkNd6AX5QnrczYp4BGmmYqgIZDw6JVEMgPBlwbpbVSvApc2SCq8f6h94P7CtASfE08+r2JcR8fVM4aQCuCeOWAvmzDixv3uGhykaDb7l1gGjDHfjGeBreDM1T4TMVQT7Id6CMNwbak10KaOHhOen7zF8oeL5L0LYF2TyDseySZoRs1jeDqbCGBAN/sCtXupB/wTHAjdiWCFRnDC9YZhtQYdOIbULucpCMO17b+erhOT32E2IlkSBzjMBrLGgRWJIUxI3qhkm8cRYvuEev6aWv5q2IJSTwGxXov4qtTLiy8DgpEia4stgsgrGpEwZ1CBHtWRoNl4K6qile5Hm5Zf6J+Wh6c5cyV4BPySeoY9dIxEhSZlhNYQKzz+JMC8hTXcAGcABiw/jGYmkaKeTF8VG9ar1GLY0IfQrmxFp8zlhfoFev8OvJPwv47fige/pbMQGcgIftbkLhnfo4t+g9eQYXgJ/oXmBLlLvQdE12g5t0utJhhihH2jMFvQ786Bfrk9dmY25ILvL6j6EblQfgu/AnPC52HprF6cC44V13DSCmJFCcRmN2NMsJoRGp5AweywH0VveBfvBMeffQOdKdtJxMkkIrUBcOBaNEmhPs67G0B3A2RofC/CsB1vUK+IoL9C0K8G4g+iQW00gpQ8GD8oC3hFRwev1z1MFPVb8j3INff8gCI6qSLqCL2AiMFDJhlUD872wXM0fKDr3QTDNHhuxC3hvJgt9ZwTJ4ENLJB6QuIcqadfnPCRSWiwIB9DN9lyjWKU8OpCswFcCq5WPGcZYWvtx0P9CBVWX/DDsP1gOzYf+TyI/gOrwV8P+HfpZJIfLVezVnIM/sVoclgKjSiBMF1qTRqyIeQRu0sTdo6TceCwLOSgdH6iFuPIzdL5AsHbSdfhWLwHlXEtqPIB+bDcEoytkw9OEM0JsJRK/NWs/LHUR+GlPqDRgOHbEcH7Djb0TxK89aSQL3j/DwY0O2+Uz8unUF3g4OrleDOIYFYXgX3IbQpOAe7FUIP92Ty+zdft3ih/BG59nHxC+tzkn8V6egvEUk9vjXiNd7e4TKi/k4VDhdY8H5rdAWwC/r4b8Szj5ORmuSu4X9OjUD+H9eeytzrMCYL3JRalCQSuGbQPYWcB6+krEK8Rdp4GziacmEg/I59/cyIGlbdRQ/dXc+AtzKCX9eYk+Ywimk1BI+4HwQn55gRpF8gh3px6vroGiAXlJDO0qI7rcB8Mj3QZ1Ma3wMb6EY4XHZQCpIT6+Zz0qck/m/WcBdWuAXaeszXijV44HKwKYSi9mJXbw91LtG73p9iMh7U/4Kot5OR2+VBwD9nf+uUTSFdBYddDOiMfBMGxbgoK9jr5NJH3K5R3Qmq/8OMgzuGX7i9g54dWdcfoSJl/M5rKfABkTqIymy+QuaU/Qubt/RfK/EL/BTLLkTLL7QFmcFYgPoH5H5h9wbsSkXuRNhyFlhDag1YgeOdo3UgbLcF9ZdgKBvZnuTn4O6KX5sBvYLnXyf04gsBd56n/Av7TIvnnybsWL5IPwpqBqZkh7DTCSbvT05cseKegLy5g8dTWiwbyJ+kLE2g4Xj6Tdrvg/Qaa0pYK3o2Yf19c2t1kcg+XztYI3lnE+KK9jaIbb5+6d1kEH95v4nrIBjUvNI9SZ10L9V1kSwKtT4Ma6DoBdD5q/C7fl9qt5ISFZmNwCoSQQr0OOHSn7AOSifLeDXvxiYX8tXxWPqTOhLHgvYzUznpqQoxbhSXemiR3DhyghZ0jcQQ4GE81O0askQ+BFEZ1fx94vF24K+tQ3noUwCjs7IQRS204aF88scYaVu6B5jOHgy8R/Xlug8PTYbLgdPKfg+/JB8bvCtwxqFHP2WRx6ZkmFBGsFU9tJ5IDpYP9/gIO+YPo80ECZCo3C/VWDqK0JPnPgQfD+4ywM4+o/rfo+Qu4wG/o/gvyBR6AclqB2wB4On+BjsD772fTCsQRaTXi9aCmKUJ9BisHSaM7iJWAKUT2J9BxPNbh7DHcv4CTg/KB4F45GHznzQJc/u8A6Tdvx9LvsbQUS6/0R9jLYv8cdhFEO8JOjAKKmk5EpYTkg1I3K/2VDX4PzvM93xfvl3puF+1Sz1L5j8JTEN00yu3CTp3UxALGJKmnxh0tn/Lucyf5QmKnFGIfglioQPyB/EepZ4x4ELJ2FmABA7zo+2S3hgF61rGMfy4njgKkF4OHB+RZSkJCAEppDH4A4wNjblsgf4Ah0SyDbhbv5316Go0ps0jUO3oEufG+CYIKZYEBYnD/WpZ9nz0rr4PTQG07X0fCj1aIy5A3FOhZRJMD1wrGevHkDBmlngS1QvQCZR484RgS04jD5FPqB3gQh/jv1l48BOJRQlt/p9R7MEY9SEeA4iI1i8G/hPXzzxBfDFJWjYQ8C+mOac8i1+6+Iw/FgX6DbDv/NNbd36APR8I78EFd8DShH76Pc8jWVjmvU87p8PyVF3wzMciqbpVtb+ONzh9BBbBZSI1GehFnH4EXcbDRGsiZUbuBVI+P0GTZMpwJ38/JVphMv/WQmonDs+7HAG4DsIdZuUoBdj3qkfO4IgVfbxReJTXKn4OjVe8dgTctYW498chNPuVfD/x6YVvBe+UmVj5Vmx4C471OqOf8Tjatxn1CqJ+FtiA1c6TL/ReU/st4FGc/iZGO4grGB5X+vEMqhhcgk5KzH93uCdgklYJWNPY02KqnAlAa7NQTdHjp1uiZngz7KJQ9VbhSR0Cp29ppFHyvRTNMm/XZ/HYrefYVuEunnYNsO+Q2VMbj8ZFDmRiPnuAG0B2Opfpt/12wy9aIiZ6+dWJm7Y2wJ3ghXvgFh1DLWHkvKI9AuD/GetuwGu8Rt8GfxYHNQ2dTcE9tIfgfDkhK7VzwdXsdQTslgyJz9oNStMjwULt1D97hp60TJ1A7qvmBFzRxA3SnJYEj7mUF75WE6ywOFA3aXOc+ihWi5+BXA+snrVrwjcIzd4B175Oq96yDOQMFUpddvV+p7lSs+99EtiC24H2aoc8B2li5ydNXLZZ7+pIE3+9JDA4R/FZEO/UWS8HqYOeC7ZPF/TIh8Ddm4CAv1OdyUiMH7YLvEKNNg/tEGxueWcW2A/gOXIUOxOvSCRgZ3r+2sdX+dBbVg3L5HMRbL+PamBr/HK52CehdvB8adFKbLrAwIk7O2d82bJ28FxQeuBsdWzrgr3Pr29h1cGQKvlZ7LczIy8Fp4f00DWg3kH14Focafo1c68EEzdLJpwKbB+LyNgsXFj1gGWRX5zm7TlznOVsteJ+HKkYMo0Lkvu7zfuKP5S449uG5od6Iht7I1s4LgW/sUqx6+az0JxZMTsnpUKxvq4kQk+Ox+xee20DhT1KTCizT6ICyFNvbl9BXC4QPgdUDcuI4wHrWkWkKfA6LFTQd+LQv3A/+RfCWaiJaAAuWCom5ryT+Q8lr9ScMg60v9RPXNWR+0yaJCWn5YgziQfNh91fQEgMt0biIglcT/riDTxK/gdau2rxnlepjoCk8EynDcPn+ABdqTqdcsEPu2/ApPiyXc1qD2Zo8sCjhnKxUd4CHSVTfvZI+WuPJvU7oQ/CPBu2enJqNTmohvqv1NMiuQ/JfoHVX72fFo+QZWgw6MbyefxGG1m7dTlxro3iFdlH0uhG7tyvW7e3WbUQfjZxsfW5Qn4p1D8LZDBjUI/nJmmcF8aKlh/RG98f+hwwwGsW6Qz6r/lc3OkP3u0LDXdGK9TnZttWfyQrUd3wtoIfcDr4DDkpy3ha509ct+G5HcWGR5r0AcYLmir9AjouN+PjhBYiiVIMx0gX9hpDZQt239QWIAEdGzH8zOJbaWdSvRoP30fxqFjhV9DSky/0XBfCAyZNASz6nDWw6Tkv1fthkQhxs45LKjmkHhwATYhG8n6Gu8/QYJ+EzFsW2NfCZ5n0Ds86Rpwq4G1DbbfTs9ajFvVr3srNoVESJ+A6FYt2GzDLR1PL0UFN/2QMH3mlIDDYOVtCcvGgm3MTrIVNH9SCJYxBQw25w5Gs04bcDe/toYzAASoXZzHkaI068ucGbmLwX1BECmn/mtFhQo5LzNG4KrzPapvAyQ6YCAqpna/kp/swpbKAKJarehs+cQthrBQPdop0YW4I3Dt4/PR4HnYKyGPb9Gk5+F2S8Rv5Qma0H6ZExBOlH1akAEzysFGyRrVvgiI13h+rPES9vCw6eXN1X6tst2uN1hpjkvofGyLP5wPOaYuD0nngG9PITsiS3s52BQ3jtPyzwMBGzVdt7C7vppizqYecL3IIqTzPLn6uHr4i0mKoryP7b6xfBYE4FjXIv2AIxBMH7KPF1LMREYCd/FerTYf/lgp+Epf70ClwfZMr0RJRtFwoe6ALBYDViTBI4fn4w8NWycHySpLjjlQK9Uk1uYs+0ozsQZ2y4bckKCyNeAcP9HMbSHo1V0KSSYyTh/g1n8OkG3kvfiI9BOyKek2WhfIPPb6UvjLDgrUdl23GMwj4yRCpgjQE9zlGyZHgZjKY5eHUYD9ZL38B60fnX0fWSQdZLy+B6OSbnEIdSiLRsx4EcKsWOnvOUnHNcdf0d1JNzPHLvQUHJ4I14nKZjjYMIM+JKSnmIV5YZfKGHrmM/QXglS6/wT6MXBV5/+yoUSv3EHYRGvLbQMAMffRW+rIl4HpsU8bYG6lY9E0svqWOQ0sukhjCOFZYBmA9wQebofbvBfqx6z3TGXRX5ykS5BopVsnb9lSw+KdzkoC83NEKcuJlURO0CERGwIyOW3KvyYT73x2qvP9wIkiu3IMbgQ22qB9l2dPChqZ5yJRewi2LJw9bBp8gvxxBzhsAVIEkclqZd1SbF4ts0sGfK1kN2OX620DBs9e1yk122fiY0zObk6uN2qRe8gB6EghL4gX4WSz0z3BC5gWEcBzAewYNCeD/HGkGs/oxxX6XYjgYOR7wAgfsDIOV9BqHctVq832aXzuaL3xMaFmG8Ywf/MA1aJsHaajCSgvb8CPpog/gNwfgKMAF4GFDC+7PUnOPCw4/jBt5g/QxEnCReCd/5YiwwfCMZXZEMwz+ess8u53JhzZFXD+iEvTOcxPx4dalNWN5xnBqDHt3QcW3a2iKj/x8PHzpp9cO1SbvvJDrco4E7YNz2OrlDCnAonJSD5+gGlsgWILJ9ntJol9NhXMPkXtJ8FTYLvvcG3UGd0DAPYlKODPw0GfiX8rvjz0pneeHHL+IQeu24rjAWlwuOy+8GzTSOabgXDgkcIej9OQmK5VMEFO+ZkaKc3o9M3QeEhtF2qS9fNMiHIJ/k/ojcCzRALNzMEbFOE2m/DDaCnu2pYBy+63FsUg0PJwN87BCphtf0mhqKg6AGt568oWRPnc0JvnkYgjawgbmR9yvgXx8m67jguGI9lNJtl1PwBh6VjCEe6PkmnAG3XuqBneYxINbGRzMBCd2w7238bnDDfPdDUGXHm0bflnBb6gPA85ekNo9H/WnoqEPB+7D2NHhdf4RroM/L5A82nFxIHsOT2xc0CHX0cPpiDd7oiimN/rkGu5wRDbulOa02wwDO8GY4Xw8j99sZ0RClYq99Js8KDXC+z+TTpPeZWhYc4zG80zEvkXqMa0bA0XpDK3LClR1e1+0ZenyFMbKDzKdaoSdvRqnDIBsl9elEs3oUyhumxwIgVP4EFWk6J25Vdw3DvWYkevtn1R2kgjMTfFJ9hVTwVc+gL3y+vuR4E/V0vPje0aWGOw6Gq9fs5L9pvDU4np6rxD3q36PDQ7gYndxna+8RKV6zhSUvgHhfw9us6YzgfYQlz68Swu8XkVAHwqZfAknPenMCxPhijhIjNfP+DaH+/v4z74/pGOuBj3jiZQ8E2oJ3GmK1MC3SYd34U0J9dvx1fn6kp3eSaPH05ou3vpGvuRZ/5kg2OBH92z8i9iGjEZM7pUM6fJeJkU/bZaMCpwDe/zDB2TemMxLHHd2kGmFblZuYJumIbvxpv5TAarcOq6PwjpBE8Ogv5rJ+Dzmo9vLO+cpCw6imIF6pLtSfkz86/aJ8Qk3EgMiH7wyTpbQZkHZgrd1K4pJ2Xzx9nRhcOL+hlbyapQ4EELDnvSXUj6w1djdx4utCw8K4fjsQ7w++qM0XitnMBW4I38/RelP4PUN1Eoib8mV4HiOpa/Mt0H5it55B/5BkTvlSHfkFxHZ4/a2q+EyWvFQcwMtvfN8AH9cZwVCnKXXxZLb8d7JyLRYhSBypeHCQ8mH1qvPkfHht45nOMS1Sq14+tLQF4tOfA8GUI+3McOSrau8v4KPkIxBSS0aq68So8Ft4Avq2R/8aCuHl0qilLepiIhBi7yCvlQaGxnMR9EYM0tvHU3rua9SRAwSGPFqWRmli348XsRKdNvFouxSeJgJdJ5000OHHKJ548nKAoUVt1g0V6sSAPsnzXQivzESo7qq7cTyL8Za4W/yh9BbyCbmvCyaF1xeV+bD6QR+5Sb5aIQLAkpdJIbVr/VF6fafN42xd2PtozUPdK33+hFOWgKYrYfxySyU+M+0W1/oX6VOb1zj9ueeU9RC+fXZOuUr+QH5f+lwnfXpOLuRlIXXvmgX+yp7Ur9dkw/GP725mYf2myuf9a4ad+TPYCj7WkKv10mecGOtfwDad4JT4J9j3SXOeAdymW+dfE6skmdmvx7w3/kCq6sbHZjyYA7FFO74vAKen0E44CzHvYJAQ3DpEfvrYNt88GZQ4DWZ1BkRURnz4DTuWiuaf2iLeBIO5IRX8jnOy+kNuUB8m7c6U7Hf5gCWSR+ChEavIgzrywJEcyNZrj8aNGhJ5DjlUfwnIXIlGU3oHXd8ivdyuZPH+e4dJx3RSD47y3lgY2HT2ELkMiCbPA5GNMjK1Gfwig4sNpvMeJRtGMhEnYPz7vi/dSzZjUSnndcsMbMvwXWyHnKyU68/8eUxwwjKD/GcYXMKEhebJ7Ie3rjdPX5MCourDT/IxbFGipSAvfX5O1kmtCRHuoy511+qXg8/b62Bipwd3R8SDDvNkAF26TFbxdci6ebkz8d8V/Nlmg3PEhgCWpeHMRMxJx5rg+CZoWHIPwIbGtpJ3Z0NjG2m+/Ektz6f5EpovpHkuzbNpPofmmTS30DyN5tNpPo3mk2meRPNxNDfT3ETzBJqPonk8zY0019Ocp3kPlf8bmp+k+XGaH6P5IZrvp/kemu+g+Xaab6P5VppvofkLNH+O5htp/jTNn6J5Hc0fo3ktzb0099B8Pc2raC7SvJLmDpqvonlJeJ5IDpPMS8e7Qg+c005l8zacxFcNFFZZC4cLr2o8POQFdhJe4hM+teEDrePO5eT8JFs9ah25B/CAR70Cr4BSoRq4miPnMjy+0MMcCfoB4afrcS/J7tceQaRpeeRRjgAC2fFINscTlsKfTs6ZU7VWua2N1zPkGiqfvB868J7y2fOEor+gVg3hFSLhh3LlHMNLAS/EIPjGAH2fRj9nkGWtmvUBfY/nVqu3elwkWBhKiX8UZENyoz9Ach5L8APFWhsWwIIS1JFbhscI0RbobON1jN/6GImtNeaMRpVXD+wjd0k7ybtaWz9Bio/d6vZWTwAcExyJAG0APpOMlVf4hiw57zFk9HPADr6n5NWmNovXox4IjPYCSDa+k/3rczAVtai8vC0QSrpfeAP9mvyhP++pdusLmVA+/Yr8IXk1AwoLzXgnZQq/NgL5KJrH09xIcwPN9eGBhE9yP8WN/uQ4MIUENfU8+beLmuXaPwWo156jyg1mK9anUGO4P+I4GqAnN9dv1d4QtD6FbTqcO+tT8+djJYtUnp6H5RlQXoSmU/0xNtb5bV33oK/zF50Dv2SP+AtM6BxyxEB2TIb2Hhcp/wd8zuM4YcimDMt/zJi/+2gfR+mKlcXFha7CkjVTJqYklzgcTGGh07ay1CXanOQ/BW2FpeX2CmgtsV2qHT7JpOBkcoucrtLylSZ7UanDVpJkslVV2opFW4lpLFRWVoiQxySZEMpWMsN081jXzUyG01Yk2nKdFcU2l4simsaNLRmfHMMwr15jYZ4fMTQtj2gbec3Q/N+RkNb1oyyMMOrfR/NfkeHCvHG0hckB5a7Bf6YVS8tsRFlup21GDGMyLSp1iu4ixzy3zbk2rEV7hRMUblqxVrS5TEWiqaikxIlKHov/9Qk4eeX3l1esKTdVumzukgqT0+aoKC4SSyvK8R94xYriCodptQ0mFBrGluB0/EOcFaWiyVX6oC0Mu9JRsQLsafLEMhR66hTN2pLJ9+yMjBmmcTCa2YuTK5wrTRnOCpdrIrSaZrlLHSUTp0yeMnnyLVNTJqaMN6UmT0me/G/CiYAeAPp/Jct3ON/hfIfzvwPn/+dPPM3ZB+cz7Ho9e52B52tZ7f/0McI/9mwo9CsMyDPiTNyimDh+diwzjtF+gqBkE5wcEDk9Ti9xALAiLh6+s+MSEPi+mLiEWEK/BNK450MhfC8P6FjWxfHkJw/WQ8qF9hFauwnb8O21/Ava8P8OVkFbNJUV2/DfqEoi2i43jnF0HHMAdhOV1cfNuiLK+ohO4rl1MS3pbem7AHhurAYHaQ/AJkfC3ocAl+eRRHm0Ap4jEm/Wo7pH+BwpiluEXNrTNTIEPhvhNodCGyLhMxEewNNjBuHTY8lvcaCuKveGQgfxsJwJR87ZxijOzWQJOndltHEY515vjObcVUYd5xZ1f+CaACKdEslArpeTPY3K3gOy/0oXIUuWJsv8CFFmxep+yEbUs2IvrxMzpWv5dSg0DO2nAG2Em2OIMvh0HKLrucKWOP5y+PEU3/hSKJSCAHfFGfPBbvB3IfCnMqZD+/xI26uIidOnA8HMWGIf+JMRIsAkfIt9JFA+qwA2g9pcHpj5nNjlcThXeP5FHT390qD9PMKlxxkkHUCWxMQZslqAcRtiVETU7owtHKxQm/Ui/pZQSPctMk2nMh0Hnssv4gnL6444Uy5ZZPeR74w4Q3qYUxIdux74kB/SmEf144pLuCvOdHdcghUQqK7AtpAXHv6XAHxtpD5zASYDYO6IBYZz4kxVQzDn4i8ZoO9rhbQVcN+mursXdJcRuxS+rbGlRDpsuTO2hJS/fR5ML4dCd140Zs2H4DzkQv/JgTUD/Y9Cv/ERPiMuXoqyxuUuicvMiMsti4mLBzGNoBJDejuIvAsdV0mcBfq4WSTLuAQI6APXP/qbQ8DnBNrtfXH6R5HPI7r0OKMEfCZzP4kBtBZAawO0dlQG13dB06zYfzC/Yd9a8kootIbqDdY8sd1vWw/bAMes4UxGC/22dY3wN+uG6Csd9ZWO+gI16G5iL6krxMdnZ8+9CvhcGD9jAD9Dw7dw7wJ6xgXo1ljCH9+tr9sWCj1D5+tRLnNAj9z9MRHqssbeg9UsWoV5wHV3FFIX4OcP4JN5yEB8sEXOAkrPiKCSHgtdWRENjOb/8b8c9a+HQncM2FUG2pWVOI2BpZMVi7C56M8Bdu5QWJihByNg04l+1gNsLsA+qWcu8pu63VyEp5wbq0tkh9Rxnb4N+NveCIX+zlyMz2UNdbS4B5zEx6ZvhkKLh+qD2qXp7gtsEBzS0IZv27+8QPsq/hKybI+QZc7lbdRC6eTvHIwL6BqeE3eMy407BMo8xnGLQZMZA14zJ6I2Oxb3RfLzRe+EQjv+RRpLBysM/ugQvghZ9Q7+gMBl1kFWXCOnW8Be0pK5BZdonh2L+5Ae6JmaQqG7I/ymcTX1mxlanIQPUrMBZlakb11EnOG8QS+szcESgK0E2MKLYedT2DmxNq2APgR1/hzA36z5AyMQJMRwf3wB+rZD3wMX+VJufoQhz469a7Dybb7kOND7HXMZHWbEJXBPXsKVZFzeXhZSutnN1A9eZNOTqy5Y4tbYhRdYeXrsgqENl/e7uWH7BH4fX34ck7kXLzHlWbChDwwugzZqfC7Hz0j5bWwPhaKY/5mf3LrB8pyfab9bti2ibTn+fhK0vR3RZvg5xMhPXJpe5ZMM8xCkOkhbIDVC2gvpMKSTkM5BivkJ6AXSFEizIC2B5ID0EKRfQvotpGZIxyB9hb9f8hTo8imN/k2QT6blNMizIeVDckB6ENJjkH4G6TlIWyHtwN+fgrQH0kFIxyCdgNQNqR+S/qcMcxWkBEhmSEmQpkFKg5QFKRdSPiQ7pEpID0LyQqqD9EtIL0B6FdIOSM2Q9kI6DOmzn36nj0vpYwGT4ahw2eYUlZc4bBBpDbkATsef78u0OWyiLcNZKpYWFzkW2IrxfpH5krGWizbnhc3MKNZaVSpSfGYim1VaXkI4MCmknFXqdIlZpQ4b0J5FWu6yVdGGIjbLabNll65wFjnXMj52tk3MqCgrA9GyS8uh/2NsQfIZFSVhERkmhK3ZRS7R6nRWOGEmOKjnVJS4HTYke1dRGfK6arBVGyvyxzakk65dxTLMJ9wd5TCgIkfpgxeNeJIu21a0+qJmZoouu6KohEoNVB38ApuYV76KcCmxVhXbKhEQZAF9MX5+ocMFbBcVOdw25vc8vSkGKUQgyDANfOTdMcO8wy8uKhWzKpwLSstXOmx3r7gPweYxhS7RWeKuhPnDUmlxhcPB3MMUFq60iWVFpeVFzpUupgrqZSsKi93OwrKiKjzvFBZWFhbayleXOlHyR7S6HX8DEqwFai6bWFhUWVkorq2Elg+ZwmIbqBtntdDmdJZXMMztbKG9EpRlg9Z7oOx2OCqLxFXMRrawtGIFw2yC3FWs4b/MFZbhHTRYOldYUU5I/Z4rrNS6T3LITuP9A75oRYVTZG7jwfgIRysPOnZUFDPMfN5eTAyIKeDtFZW2csbG28FKS0DTdpfNdj9TzttFG4z/Ad6+BmYHIP+LL6PYL/JlK1xixZpimN3f8GW2suJK0OpWLJVVrLYxr/OVNs1ufsdXOkvLRTvDtPEgGN6kw4ro4F2lK8uLHAxzgAdFEz0fJCWkcxRLDhCJ6eHFCkfFGpjhEL/aHqY0LgoYixUgAqxQlNqGMwrCa8KhD/9vSnOt8++yZk+dQp4gwSe+TktlrtXFTlFrHVf3PztFyvqf9MFnS5Wj/5lffP3u87/xw26zMAmQ0jwWhn/uOzv4z/2w5G5q1EW/+MuSX8iZfIn24bx2Z76kkWEeYAd70m6vKht4gDwzMSV5cqLJVl5cUQJhxczEvIVZE6cnmlwiBC1FDtiqZyautbkSb78tJq3I5bKVrXCsNQF+uWtmottZPsNVvMpWVuSaWFZa7KxwVdjFicUVZTOKXGXJq1MSTRCwldptLnFRJLPbYkymNNHpdol3lNsr/kliUwkaILpsEMSUimu1KjQ4bQ+4gYWtJNdZuhqivJU2V7gvstdaBYgYfWXbVtscJgd+z0wsct1Rvrrifpsz0eQuTS/GMHJmor3I4bIlThrgMOmyLNImRYqTNmlgVKCtSWF13fYvzvj/BUaIzSoAXAAA","base64"))),n}},50730:(e,t,r)=>{"use strict";t.O9=void 0;const A=r(85622),n=r(35747),o=r(31669),i=r(67648);Object.defineProperty(t,"O9",{enumerable:!0,get:function(){return i.getBinjumper}})},73975:(e,t,r)=>{"use strict";var A=r(86897).Duplex;function n(e){if(!(this instanceof n))return new n(e);if(this._bufs=[],this.length=0,"function"==typeof e){this._callback=e;var t=function(e){this._callback&&(this._callback(e),this._callback=null)}.bind(this);this.on("pipe",(function(e){e.on("error",t)})),this.on("unpipe",(function(e){e.removeListener("error",t)}))}else this.append(e);A.call(this)}r(31669).inherits(n,A),n.prototype._offset=function(e){var t,r=0,A=0;if(0===e)return[0,0];for(;Athis.length||e<0)){var t=this._offset(e);return this._bufs[t[0]][t[1]]}},n.prototype.slice=function(e,t){return"number"==typeof e&&e<0&&(e+=this.length),"number"==typeof t&&t<0&&(t+=this.length),this.copy(null,0,e,t)},n.prototype.copy=function(e,t,r,A){if(("number"!=typeof r||r<0)&&(r=0),("number"!=typeof A||A>this.length)&&(A=this.length),r>=this.length)return e||Buffer.alloc(0);if(A<=0)return e||Buffer.alloc(0);var n,o,i=!!e,s=this._offset(r),a=A-r,c=a,g=i&&t||0,l=s[1];if(0===r&&A==this.length){if(!i)return 1===this._bufs.length?this._bufs[0]:Buffer.concat(this._bufs,this.length);for(o=0;o(n=this._bufs[o].length-l))){this._bufs[o].copy(e,g,l,l+c);break}this._bufs[o].copy(e,g,l),g+=n,c-=n,l&&(l=0)}return e},n.prototype.shallowSlice=function(e,t){if(e=e||0,t="number"!=typeof t?this.length:t,e<0&&(e+=this.length),t<0&&(t+=this.length),e===t)return new n;var r=this._offset(e),A=this._offset(t),o=this._bufs.slice(r[0],A[0]+1);return 0==A[1]?o.pop():o[o.length-1]=o[o.length-1].slice(0,A[1]),0!=r[1]&&(o[0]=o[0].slice(r[1])),new n(o)},n.prototype.toString=function(e,t,r){return this.slice(t,r).toString(e)},n.prototype.consume=function(e){for(;this._bufs.length;){if(!(e>=this._bufs[0].length)){this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift()}return this},n.prototype.duplicate=function(){for(var e=0,t=new n;ethis.length?this.length:t;for(var A=this._offset(t),o=A[0],i=A[1];o=e.length){var a=s.indexOf(e,i);if(-1!==a)return this._reverseOffset([o,a]);i=s.length-e.length+1}else{var c=this._reverseOffset([o,i]);if(this._match(c,e))return c;i++}}i=0}return-1},n.prototype._match=function(e,t){if(this.length-e{"use strict";const A=r(54900),n=r(44617),o=r(1495),i=r(425),s=(e,t={})=>{let r=[];if(Array.isArray(e))for(let A of e){let e=s.create(A,t);Array.isArray(e)?r.push(...e):r.push(e)}else r=[].concat(s.create(e,t));return t&&!0===t.expand&&!0===t.nodupes&&(r=[...new Set(r)]),r};s.parse=(e,t={})=>i(e,t),s.stringify=(e,t={})=>A("string"==typeof e?s.parse(e,t):e,t),s.compile=(e,t={})=>("string"==typeof e&&(e=s.parse(e,t)),n(e,t)),s.expand=(e,t={})=>{"string"==typeof e&&(e=s.parse(e,t));let r=o(e,t);return!0===t.noempty&&(r=r.filter(Boolean)),!0===t.nodupes&&(r=[...new Set(r)]),r},s.create=(e,t={})=>""===e||e.length<3?[e]:!0!==t.expand?s.compile(e,t):s.expand(e,t),e.exports=s},44617:(e,t,r)=>{"use strict";const A=r(52169),n=r(4542);e.exports=(e,t={})=>{let r=(e,o={})=>{let i=n.isInvalidBrace(o),s=!0===e.invalid&&!0===t.escapeInvalid,a=!0===i||!0===s,c=!0===t.escapeInvalid?"\\":"",g="";if(!0===e.isOpen)return c+e.value;if(!0===e.isClose)return c+e.value;if("open"===e.type)return a?c+e.value:"(";if("close"===e.type)return a?c+e.value:")";if("comma"===e.type)return"comma"===e.prev.type?"":a?e.value:"|";if(e.value)return e.value;if(e.nodes&&e.ranges>0){let r=n.reduce(e.nodes),o=A(...r,{...t,wrap:!1,toRegex:!0});if(0!==o.length)return r.length>1&&o.length>1?`(${o})`:o}if(e.nodes)for(let t of e.nodes)g+=r(t,e);return g};return r(e)}},5384:e=>{"use strict";e.exports={MAX_LENGTH:65536,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:"\n",CHAR_NO_BREAK_SPACE:" ",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:"\t",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\ufeff"}},1495:(e,t,r)=>{"use strict";const A=r(52169),n=r(54900),o=r(4542),i=(e="",t="",r=!1)=>{let A=[];if(e=[].concat(e),!(t=[].concat(t)).length)return e;if(!e.length)return r?o.flatten(t).map(e=>`{${e}}`):t;for(let n of e)if(Array.isArray(n))for(let e of n)A.push(i(e,t,r));else for(let e of t)!0===r&&"string"==typeof e&&(e=`{${e}}`),A.push(Array.isArray(e)?i(n,e,r):n+e);return o.flatten(A)};e.exports=(e,t={})=>{let r=void 0===t.rangeLimit?1e3:t.rangeLimit,s=(e,a={})=>{e.queue=[];let c=a,g=a.queue;for(;"brace"!==c.type&&"root"!==c.type&&c.parent;)c=c.parent,g=c.queue;if(e.invalid||e.dollar)return void g.push(i(g.pop(),n(e,t)));if("brace"===e.type&&!0!==e.invalid&&2===e.nodes.length)return void g.push(i(g.pop(),["{}"]));if(e.nodes&&e.ranges>0){let s=o.reduce(e.nodes);if(o.exceedsLimit(...s,t.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let a=A(...s,t);return 0===a.length&&(a=n(e,t)),g.push(i(g.pop(),a)),void(e.nodes=[])}let l=o.encloseBrace(e),u=e.queue,h=e;for(;"brace"!==h.type&&"root"!==h.type&&h.parent;)h=h.parent,u=h.queue;for(let t=0;t{"use strict";const A=r(54900),{MAX_LENGTH:n,CHAR_BACKSLASH:o,CHAR_BACKTICK:i,CHAR_COMMA:s,CHAR_DOT:a,CHAR_LEFT_PARENTHESES:c,CHAR_RIGHT_PARENTHESES:g,CHAR_LEFT_CURLY_BRACE:l,CHAR_RIGHT_CURLY_BRACE:u,CHAR_LEFT_SQUARE_BRACKET:h,CHAR_RIGHT_SQUARE_BRACKET:p,CHAR_DOUBLE_QUOTE:d,CHAR_SINGLE_QUOTE:C,CHAR_NO_BREAK_SPACE:f,CHAR_ZERO_WIDTH_NOBREAK_SPACE:I}=r(5384);e.exports=(e,t={})=>{if("string"!=typeof e)throw new TypeError("Expected a string");let r=t||{},E="number"==typeof r.maxLength?Math.min(n,r.maxLength):n;if(e.length>E)throw new SyntaxError(`Input length (${e.length}), exceeds max characters (${E})`);let B,y={type:"root",input:e,nodes:[]},m=[y],w=y,Q=y,D=0,b=e.length,v=0,S=0;const k=()=>e[v++],N=e=>{if("text"===e.type&&"dot"===Q.type&&(Q.type="text"),!Q||"text"!==Q.type||"text"!==e.type)return w.nodes.push(e),e.parent=w,e.prev=Q,Q=e,e;Q.value+=e.value};for(N({type:"bos"});v0){if(w.ranges>0){w.ranges=0;let e=w.nodes.shift();w.nodes=[e,{type:"text",value:A(w)}]}N({type:"comma",value:B}),w.commas++}else if(B===a&&S>0&&0===w.commas){let e=w.nodes;if(0===S||0===e.length){N({type:"text",value:B});continue}if("dot"===Q.type){if(w.range=[],Q.value+=B,Q.type="range",3!==w.nodes.length&&5!==w.nodes.length){w.invalid=!0,w.ranges=0,Q.type="text";continue}w.ranges++,w.args=[];continue}if("range"===Q.type){e.pop();let t=e[e.length-1];t.value+=Q.value+B,Q=t,w.ranges--;continue}N({type:"dot",value:B})}else N({type:"text",value:B});else{if("brace"!==w.type){N({type:"text",value:B});continue}let e="close";w=m.pop(),w.close=!0,N({type:e,value:B}),S--,w=m[m.length-1]}else{S++;let e=Q.value&&"$"===Q.value.slice(-1)||!0===w.dollar;w=N({type:"brace",open:!0,close:!1,dollar:e,depth:S,commas:0,ranges:0,nodes:[]}),m.push(w),N({type:"open",value:B})}else{let e,r=B;for(!0!==t.keepQuotes&&(B="");v{e.nodes||("open"===e.type&&(e.isOpen=!0),"close"===e.type&&(e.isClose=!0),e.nodes||(e.type="text"),e.invalid=!0)});let e=m[m.length-1],t=e.nodes.indexOf(w);e.nodes.splice(t,1,...w.nodes)}}while(m.length>0);return N({type:"eos"}),y}},54900:(e,t,r)=>{"use strict";const A=r(4542);e.exports=(e,t={})=>{let r=(e,n={})=>{let o=t.escapeInvalid&&A.isInvalidBrace(n),i=!0===e.invalid&&!0===t.escapeInvalid,s="";if(e.value)return(o||i)&&A.isOpenOrClose(e)?"\\"+e.value:e.value;if(e.value)return e.value;if(e.nodes)for(let t of e.nodes)s+=r(t);return s};return r(e)}},4542:(e,t)=>{"use strict";t.isInteger=e=>"number"==typeof e?Number.isInteger(e):"string"==typeof e&&""!==e.trim()&&Number.isInteger(Number(e)),t.find=(e,t)=>e.nodes.find(e=>e.type===t),t.exceedsLimit=(e,r,A=1,n)=>!1!==n&&(!(!t.isInteger(e)||!t.isInteger(r))&&(Number(r)-Number(e))/Number(A)>=n),t.escapeNode=(e,t=0,r)=>{let A=e.nodes[t];A&&(r&&A.type===r||"open"===A.type||"close"===A.type)&&!0!==A.escaped&&(A.value="\\"+A.value,A.escaped=!0)},t.encloseBrace=e=>"brace"===e.type&&(e.commas>>0+e.ranges>>0==0&&(e.invalid=!0,!0)),t.isInvalidBrace=e=>"brace"===e.type&&(!(!0!==e.invalid&&!e.dollar)||(e.commas>>0+e.ranges>>0==0||!0!==e.open||!0!==e.close)&&(e.invalid=!0,!0)),t.isOpenOrClose=e=>"open"===e.type||"close"===e.type||(!0===e.open||!0===e.close),t.reduce=e=>e.reduce((e,t)=>("text"===t.type&&e.push(t.value),"range"===t.type&&(t.type="text"),e),[]),t.flatten=(...e)=>{const t=[],r=e=>{for(let A=0;A{"use strict";const{V4MAPPED:A,ADDRCONFIG:n,ALL:o,promises:{Resolver:i},lookup:s}=r(40881),{promisify:a}=r(31669),c=r(12087),g=Symbol("cacheableLookupCreateConnection"),l=Symbol("cacheableLookupInstance"),u=Symbol("expires"),h="number"==typeof o,p=e=>{if(!e||"function"!=typeof e.createConnection)throw new Error("Expected an Agent instance as the first argument")},d=()=>{let e=!1,t=!1;for(const r of Object.values(c.networkInterfaces()))for(const A of r)if(!A.internal&&("IPv6"===A.family?t=!0:e=!0,e&&t))return{has4:e,has6:t};return{has4:e,has6:t}},C={ttl:!0},f={all:!0};class I{constructor({cache:e=new Map,maxTtl:t=1/0,fallbackDuration:r=3600,errorTtl:A=.15,resolver:n=new i,lookup:o=s}={}){if(this.maxTtl=t,this.errorTtl=A,this._cache=e,this._resolver=n,this._dnsLookup=a(o),this._resolver instanceof i?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=a(this._resolver.resolve4.bind(this._resolver)),this._resolve6=a(this._resolver.resolve6.bind(this._resolver))),this._iface=d(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,r<1)this._fallback=!1;else{this._fallback=!0;const e=setInterval(()=>{this._hostnamesToFallback.clear()},1e3*r);e.unref&&e.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,t,r){if("function"==typeof t?(r=t,t={}):"number"==typeof t&&(t={family:t}),!r)throw new Error("Callback must be a function.");this.lookupAsync(e,t).then(e=>{t.all?r(null,e):r(null,e.address,e.family,e.expires,e.ttl)},r)}async lookupAsync(e,t={}){"number"==typeof t&&(t={family:t});let r=await this.query(e);if(6===t.family){const e=r.filter(e=>6===e.family);t.hints&A&&(h&&t.hints&o||0===e.length)?(e=>{for(const t of e)6!==t.family&&(t.address="::ffff:"+t.address,t.family=6)})(r):r=e}else 4===t.family&&(r=r.filter(e=>4===e.family));if(t.hints&n){const{_iface:e}=this;r=r.filter(t=>6===t.family?e.has6:e.has4)}if(0===r.length){const t=new Error("cacheableLookup ENOTFOUND "+e);throw t.code="ENOTFOUND",t.hostname=e,t}return t.all?r:r[0]}async query(e){let t=await this._cache.get(e);if(!t){const r=this._pending[e];if(r)t=await r;else{const r=this.queryAndCache(e);this._pending[e]=r,t=await r}}return t=t.map(e=>({...e})),t}async _resolve(e){const[t,r]=await Promise.all([this._resolve4(e,C),this._resolve6(e,C)].map(e=>(async e=>{try{return await e}catch(e){if("ENODATA"===e.code||"ENOTFOUND"===e.code)return[];throw e}})(e)));let A=0,n=0,o=0;const i=Date.now();for(const e of t)e.family=4,e.expires=i+1e3*e.ttl,A=Math.max(A,e.ttl);for(const e of r)e.family=6,e.expires=i+1e3*e.ttl,n=Math.max(n,e.ttl);return o=t.length>0?r.length>0?Math.min(A,n):A:n,{entries:[...t,...r],cacheTtl:o}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch(e){return{entries:[],cacheTtl:0}}}async _set(e,t,r){if(this.maxTtl>0&&r>0){r=1e3*Math.min(r,this.maxTtl),t[u]=Date.now()+r;try{await this._cache.set(e,t,r)}catch(e){this.lookupAsync=async()=>{const t=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw t.cause=e,t}}A=this._cache,Symbol.iterator in A&&this._tick(r)}var A}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,f);try{let t=await this._resolve(e);0===t.entries.length&&this._fallback&&(t=await this._lookup(e),0!==t.entries.length&&this._hostnamesToFallback.add(e));const r=0===t.entries.length?this.errorTtl:t.cacheTtl;return await this._set(e,t.entries,r),delete this._pending[e],t.entries}catch(t){throw delete this._pending[e],t}}_tick(e){const t=this._nextRemovalTime;(!t||e{this._nextRemovalTime=!1;let e=1/0;const t=Date.now();for(const[r,A]of this._cache){const n=A[u];t>=n?this._cache.delete(r):n("lookup"in t||(t.lookup=this.lookup),e[g](t,r))}uninstall(e){if(p(e),e[g]){if(e[l]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[g],delete e[g],delete e[l]}}updateInterfaceInfo(){const{_iface:e}=this;this._iface=d(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){e?this._cache.delete(e):this._cache.clear()}}e.exports=I,e.exports.default=I},11200:(e,t,r)=>{"use strict";const A=r(28614),n=r(78835),o=r(19793),i=r(58764),s=r(86834),a=r(48491),c=r(55737),g=r(15751),l=r(72515);class u{constructor(e,t){if("function"!=typeof e)throw new TypeError("Parameter `request` must be a function");return this.cache=new l({uri:"string"==typeof t&&t,store:"string"!=typeof t&&t,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(t,r)=>{let l;if("string"==typeof t)l=p(n.parse(t)),t={};else if(t instanceof n.URL)l=p(n.parse(t.toString())),t={};else{const[e,...r]=(t.path||"").split("?"),A=r.length>0?"?"+r.join("?"):"";l=p({...t,pathname:e,search:A})}(t={headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1,...t,...h(l)}).headers=c(t.headers);const d=new A,C=o(n.format(l),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),f=`${t.method}:${C}`;let I=!1,E=!1;const B=t=>{E=!0;let A,n=!1;const o=new Promise(e=>{A=()=>{n||(n=!0,e())}}),c=e=>{if(I&&!t.forceRefresh){e.status=e.statusCode;const r=s.fromObject(I.cachePolicy).revalidatedPolicy(t,e);if(!r.modified){const t=r.policy.responseHeaders();(e=new a(I.statusCode,t,I.body,I.url)).cachePolicy=r.policy,e.fromCache=!0}}let A;e.fromCache||(e.cachePolicy=new s(t,e,t),e.fromCache=!1),t.cache&&e.cachePolicy.storable()?(A=g(e),(async()=>{try{const r=i.buffer(e);if(await Promise.race([o,new Promise(t=>e.once("end",t))]),n)return;const A=await r,s={cachePolicy:e.cachePolicy.toObject(),url:e.url,statusCode:e.fromCache?I.statusCode:e.statusCode,body:A};let a=t.strictTtl?e.cachePolicy.timeToLive():void 0;t.maxTtl&&(a=a?Math.min(a,t.maxTtl):t.maxTtl),await this.cache.set(f,s,a)}catch(e){d.emit("error",new u.CacheError(e))}})()):t.cache&&I&&(async()=>{try{await this.cache.delete(f)}catch(e){d.emit("error",new u.CacheError(e))}})(),d.emit("response",A||e),"function"==typeof r&&r(A||e)};try{const r=e(t,c);r.once("error",A),r.once("abort",A),d.emit("request",r)}catch(e){d.emit("error",new u.RequestError(e))}};return(async()=>{const e=async e=>{await Promise.resolve();const t=e.cache?await this.cache.get(f):void 0;if(void 0===t)return B(e);const A=s.fromObject(t.cachePolicy);if(A.satisfiesWithoutRevalidation(e)&&!e.forceRefresh){const e=A.responseHeaders(),n=new a(t.statusCode,e,t.body,t.url);n.cachePolicy=A,n.fromCache=!0,d.emit("response",n),"function"==typeof r&&r(n)}else I=t,e.headers=A.revalidationHeaders(e),B(e)},A=e=>d.emit("error",new u.CacheError(e));this.cache.once("error",A),d.on("response",()=>this.cache.removeListener("error",A));try{await e(t)}catch(e){t.automaticFailover&&!E&&B(t),d.emit("error",new u.CacheError(e))}})(),d}}}function h(e){const t={...e};return t.path=`${e.pathname||"/"}${e.search||""}`,delete t.pathname,delete t.search,t}function p(e){return{protocol:e.protocol,auth:e.auth,hostname:e.hostname||e.host||"localhost",port:e.port,pathname:e.pathname,search:e.search}}u.RequestError=class extends Error{constructor(e){super(e.message),this.name="RequestError",Object.assign(this,e)}},u.CacheError=class extends Error{constructor(e){super(e.message),this.name="CacheError",Object.assign(this,e)}},e.exports=u},54738:e=>{"use strict";const t=(e,t)=>{if("string"!=typeof e&&!Array.isArray(e))throw new TypeError("Expected the input to be `string | string[]`");t=Object.assign({pascalCase:!1},t);if(0===(e=Array.isArray(e)?e.map(e=>e.trim()).filter(e=>e.length).join("-"):e.trim()).length)return"";if(1===e.length)return t.pascalCase?e.toUpperCase():e.toLowerCase();return e!==e.toLowerCase()&&(e=(e=>{let t=!1,r=!1,A=!1;for(let n=0;nt.toUpperCase()).replace(/\d+(\w|$)/g,e=>e.toUpperCase()),r=e,t.pascalCase?r.charAt(0).toUpperCase()+r.slice(1):r;var r};e.exports=t,e.exports.default=t},95882:(e,t,r)=>{"use strict";const A=r(18483),{stdout:n,stderr:o}=r(59428),{stringReplaceAll:i,stringEncaseCRLFWithFirstIndex:s}=r(73327),a=["ansi","ansi","ansi256","ansi16m"],c=Object.create(null);class g{constructor(e){return l(e)}}const l=e=>{const t={};return((e,t={})=>{if(t.level>3||t.level<0)throw new Error("The `level` option should be an integer from 0 to 3");const r=n?n.level:0;e.level=void 0===t.level?r:t.level})(t,e),t.template=(...e)=>E(t.template,...e),Object.setPrototypeOf(t,u.prototype),Object.setPrototypeOf(t.template,t),t.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},t.template.Instance=g,t.template};function u(e){return l(e)}for(const[e,t]of Object.entries(A))c[e]={get(){const r=C(this,d(t.open,t.close,this._styler),this._isEmpty);return Object.defineProperty(this,e,{value:r}),r}};c.visible={get(){const e=C(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:e}),e}};const h=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(const e of h)c[e]={get(){const{level:t}=this;return function(...r){const n=d(A.color[a[t]][e](...r),A.color.close,this._styler);return C(this,n,this._isEmpty)}}};for(const e of h){c["bg"+e[0].toUpperCase()+e.slice(1)]={get(){const{level:t}=this;return function(...r){const n=d(A.bgColor[a[t]][e](...r),A.bgColor.close,this._styler);return C(this,n,this._isEmpty)}}}}const p=Object.defineProperties(()=>{},{...c,level:{enumerable:!0,get(){return this._generator.level},set(e){this._generator.level=e}}}),d=(e,t,r)=>{let A,n;return void 0===r?(A=e,n=t):(A=r.openAll+e,n=t+r.closeAll),{open:e,close:t,openAll:A,closeAll:n,parent:r}},C=(e,t,r)=>{const A=(...e)=>f(A,1===e.length?""+e[0]:e.join(" "));return A.__proto__=p,A._generator=e,A._styler=t,A._isEmpty=r,A},f=(e,t)=>{if(e.level<=0||!t)return e._isEmpty?"":t;let r=e._styler;if(void 0===r)return t;const{openAll:A,closeAll:n}=r;if(-1!==t.indexOf(""))for(;void 0!==r;)t=i(t,r.close,r.open),r=r.parent;const o=t.indexOf("\n");return-1!==o&&(t=s(t,n,A,o)),A+t+n};let I;const E=(e,...t)=>{const[A]=t;if(!Array.isArray(A))return t.join(" ");const n=t.slice(1),o=[A.raw[0]];for(let e=1;e{"use strict";const t=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,r=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,A=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,n=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,o=new Map([["n","\n"],["r","\r"],["t","\t"],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a",""]]);function i(e){const t="u"===e[0],r="{"===e[1];return t&&!r&&5===e.length||"x"===e[0]&&3===e.length?String.fromCharCode(parseInt(e.slice(1),16)):t&&r?String.fromCodePoint(parseInt(e.slice(2,-1),16)):o.get(e)||e}function s(e,t){const r=[],o=t.trim().split(/\s*,\s*/g);let s;for(const t of o){const o=Number(t);if(Number.isNaN(o)){if(!(s=t.match(A)))throw new Error(`Invalid Chalk template style argument: ${t} (in style '${e}')`);r.push(s[2].replace(n,(e,t,r)=>t?i(t):r))}else r.push(o)}return r}function a(e){r.lastIndex=0;const t=[];let A;for(;null!==(A=r.exec(e));){const e=A[1];if(A[2]){const r=s(e,A[2]);t.push([e].concat(r))}else t.push([e])}return t}function c(e,t){const r={};for(const e of t)for(const t of e.styles)r[t[0]]=e.inverse?null:t.slice(1);let A=e;for(const[e,t]of Object.entries(r))if(Array.isArray(t)){if(!(e in A))throw new Error("Unknown Chalk style: "+e);A=t.length>0?A[e](...t):A[e]}return A}e.exports=(e,r)=>{const A=[],n=[];let o=[];if(r.replace(t,(t,r,s,g,l,u)=>{if(r)o.push(i(r));else if(g){const t=o.join("");o=[],n.push(0===A.length?t:c(e,A)(t)),A.push({inverse:s,styles:a(g)})}else if(l){if(0===A.length)throw new Error("Found extraneous } in Chalk template literal");n.push(c(e,A)(o.join(""))),o=[],A.pop()}else o.push(u)}),n.push(o.join("")),A.length>0){const e=`Chalk template literal is missing ${A.length} closing bracket${1===A.length?"":"s"} (\`}\`)`;throw new Error(e)}return n.join("")}},73327:e=>{"use strict";e.exports={stringReplaceAll:(e,t,r)=>{let A=e.indexOf(t);if(-1===A)return e;const n=t.length;let o=0,i="";do{i+=e.substr(o,A-o)+t+r,o=A+n,A=e.indexOf(t,o)}while(-1!==A);return i+=e.substr(o),i},stringEncaseCRLFWithFirstIndex:(e,t,r,A)=>{let n=0,o="";do{const i="\r"===e[A-1];o+=e.substr(n,(i?A-1:A)-n)+t+(i?"\r\n":"\n")+r,n=A+1,A=e.indexOf("\n",n)}while(-1!==A);return o+=e.substr(n),o}}},5864:(e,t,r)=>{"use strict";var A=r(85832),n=process.env;function o(e){return"string"==typeof e?!!n[e]:Object.keys(e).every((function(t){return n[t]===e[t]}))}Object.defineProperty(t,"_vendors",{value:A.map((function(e){return e.constant}))}),t.name=null,t.isPR=null,A.forEach((function(e){var r=(Array.isArray(e.env)?e.env:[e.env]).every((function(e){return o(e)}));if(t[e.constant]=r,r)switch(t.name=e.name,typeof e.pr){case"string":t.isPR=!!n[e.pr];break;case"object":"env"in e.pr?t.isPR=e.pr.env in n&&n[e.pr.env]!==e.pr.ne:"any"in e.pr?t.isPR=e.pr.any.some((function(e){return!!n[e]})):t.isPR=o(e.pr);break;default:t.isPR=null}})),t.isCI=!!(n.CI||n.CONTINUOUS_INTEGRATION||n.BUILD_NUMBER||n.RUN_ID||t.name)},85832:e=>{"use strict";e.exports=JSON.parse('[{"name":"AppVeyor","constant":"APPVEYOR","env":"APPVEYOR","pr":"APPVEYOR_PULL_REQUEST_NUMBER"},{"name":"Azure Pipelines","constant":"AZURE_PIPELINES","env":"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI","pr":"SYSTEM_PULLREQUEST_PULLREQUESTID"},{"name":"Bamboo","constant":"BAMBOO","env":"bamboo_planKey"},{"name":"Bitbucket Pipelines","constant":"BITBUCKET","env":"BITBUCKET_COMMIT","pr":"BITBUCKET_PR_ID"},{"name":"Bitrise","constant":"BITRISE","env":"BITRISE_IO","pr":"BITRISE_PULL_REQUEST"},{"name":"Buddy","constant":"BUDDY","env":"BUDDY_WORKSPACE_ID","pr":"BUDDY_EXECUTION_PULL_REQUEST_ID"},{"name":"Buildkite","constant":"BUILDKITE","env":"BUILDKITE","pr":{"env":"BUILDKITE_PULL_REQUEST","ne":"false"}},{"name":"CircleCI","constant":"CIRCLE","env":"CIRCLECI","pr":"CIRCLE_PULL_REQUEST"},{"name":"Cirrus CI","constant":"CIRRUS","env":"CIRRUS_CI","pr":"CIRRUS_PR"},{"name":"AWS CodeBuild","constant":"CODEBUILD","env":"CODEBUILD_BUILD_ARN"},{"name":"Codeship","constant":"CODESHIP","env":{"CI_NAME":"codeship"}},{"name":"Drone","constant":"DRONE","env":"DRONE","pr":{"DRONE_BUILD_EVENT":"pull_request"}},{"name":"dsari","constant":"DSARI","env":"DSARI"},{"name":"GitLab CI","constant":"GITLAB","env":"GITLAB_CI"},{"name":"GoCD","constant":"GOCD","env":"GO_PIPELINE_LABEL"},{"name":"Hudson","constant":"HUDSON","env":"HUDSON_URL"},{"name":"Jenkins","constant":"JENKINS","env":["JENKINS_URL","BUILD_ID"],"pr":{"any":["ghprbPullId","CHANGE_ID"]}},{"name":"Magnum CI","constant":"MAGNUM","env":"MAGNUM"},{"name":"Netlify CI","constant":"NETLIFY","env":"NETLIFY_BUILD_BASE","pr":{"env":"PULL_REQUEST","ne":"false"}},{"name":"Sail CI","constant":"SAIL","env":"SAILCI","pr":"SAIL_PULL_REQUEST_NUMBER"},{"name":"Semaphore","constant":"SEMAPHORE","env":"SEMAPHORE","pr":"PULL_REQUEST_NUMBER"},{"name":"Shippable","constant":"SHIPPABLE","env":"SHIPPABLE","pr":{"IS_PULL_REQUEST":"true"}},{"name":"Solano CI","constant":"SOLANO","env":"TDDIUM","pr":"TDDIUM_PR_ID"},{"name":"Strider CD","constant":"STRIDER","env":"STRIDER"},{"name":"TaskCluster","constant":"TASKCLUSTER","env":["TASK_ID","RUN_ID"]},{"name":"TeamCity","constant":"TEAMCITY","env":"TEAMCITY_VERSION"},{"name":"Travis CI","constant":"TRAVIS","env":"TRAVIS","pr":{"env":"TRAVIS_PULL_REQUEST","ne":"false"}}]')},40822:(e,t,r)=>{"use strict";r.r(t),r.d(t,{Cli:()=>Y,Command:()=>M,UsageError:()=>a});const A=/^(-h|--help)(?:=([0-9]+))?$/,n=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,o=/^-[a-zA-Z]{2,}$/,i=/^([^=]+)=([\s\S]*)$/,s="1"===process.env.DEBUG_CLI;class a extends Error{constructor(e){super(e),this.clipanion={type:"usage"},this.name="UsageError"}}class c extends Error{constructor(e,t){if(super(),this.input=e,this.candidates=t,this.clipanion={type:"none"},this.name="UnknownSyntaxError",0===this.candidates.length)this.message="Command not found, but we're not sure what's the alternative.";else if(1===this.candidates.length&&null!==this.candidates[0].reason){const[{usage:e,reason:t}]=this.candidates;this.message=`${t}\n\n$ ${e}`}else if(1===this.candidates.length){const[{usage:t}]=this.candidates;this.message=`Command not found; did you mean:\n\n$ ${t}\n${l(e)}`}else this.message=`Command not found; did you mean one of:\n\n${this.candidates.map(({usage:e},t)=>`${(t+".").padStart(4)} ${e}`).join("\n")}\n\n${l(e)}`}}class g extends Error{constructor(e,t){super(),this.input=e,this.usages=t,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find who to pick amongst the following alternatives:\n\n${this.usages.map((e,t)=>`${(t+".").padStart(4)} ${e}`).join("\n")}\n\n${l(e)}`}}const l=e=>"While running "+e.filter(e=>"\0"!==e).map(e=>{const t=JSON.stringify(e);return e.match(/\s/)||0===e.length||t!==`"${e}"`?t:e}).join(" ");function u(e){s&&console.log(e)}const h={candidateUsage:null,errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:-1};function p(e,t){return e.nodes.push(t),e.nodes.length-1}function d(e,t,r=!1){u("Running a vm on "+JSON.stringify(t));let A=[{node:0,state:{candidateUsage:null,errorMessage:null,ignoreOptions:!1,options:[],path:[],positionals:[],remainder:null,selectedIndex:null}}];!function(e,{prefix:t=""}={}){u(t+"Nodes are:");for(let r=0;r2!==e).map(({state:e})=>({usage:e.candidateUsage,reason:null})));if(s.every(({node:e})=>2===e))throw new c(t,s.map(({state:e})=>({usage:e.candidateUsage,reason:e.errorMessage})));A=I(s)}if(A.length>0){u(" Results:");for(const e of A)u(` - ${e.node} -> ${JSON.stringify(e.state)}`)}else u(" No results");return A}function C(e,t){if(null!==t.selectedIndex)return!0;if(Object.prototype.hasOwnProperty.call(e.statics,"\0"))for(const{to:t}of e.statics["\0"])if(1===t)return!0;return!1}function f(e,t){return function(e,t){const r=t.filter(e=>null!==e.selectedIndex);if(0===r.length)throw new Error;let A=0;for(const e of r)e.path.length>A&&(A=e.path.length);const n=r.filter(e=>e.path.length===A),o=e=>e.positionals.filter(({extra:e})=>!e).length+e.options.length,i=n.map(e=>({state:e,positionalCount:o(e)}));let s=0;for(const{positionalCount:e}of i)e>s&&(s=e);const a=function(e){const t=[],r=[];for(const A of e)-1===A.selectedIndex?r.push(A):t.push(A);r.length>0&&t.push(Object.assign(Object.assign({},h),{path:E(...r.map(e=>e.path)),options:r.reduce((e,t)=>e.concat(t.options),[])}));return t}(i.filter(({positionalCount:e})=>e===s).map(({state:e})=>e));if(a.length>1)throw new g(e,a.map(e=>e.candidateUsage));return a[0]}(t,d(e,[...t,"\0"]).map(({state:e})=>e))}function I(e){let t=0;for(const{state:r}of e)r.path.length>t&&(t=r.path.length);return e.filter(({state:e})=>e.path.length===t)}function E(e,t,...r){return void 0===t?Array.from(e):E(e.filter((e,r)=>e===t[r]),...r)}function B(e){return 1===e||2===e}function y(e,t=0){return{to:B(e.to)?e.to:e.to>2?e.to+t-2:e.to+t,reducer:e.reducer}}function m(e,t=0){const r={dynamics:[],shortcuts:[],statics:{}};for(const[A,n]of e.dynamics)r.dynamics.push([A,y(n,t)]);for(const A of e.shortcuts)r.shortcuts.push(y(A,t));for(const[A,n]of Object.entries(e.statics))r.statics[A]=n.map(e=>y(e,t));return r}function w(e,t,r,A,n){e.nodes[t].dynamics.push([r,{to:A,reducer:n}])}function Q(e,t,r,A){e.nodes[t].shortcuts.push({to:r,reducer:A})}function D(e,t,r,A,n){(Object.prototype.hasOwnProperty.call(e.nodes[t].statics,r)?e.nodes[t].statics[r]:e.nodes[t].statics[r]=[]).push({to:A,reducer:n})}function b(e,t,r,A){if(Array.isArray(t)){const[n,...o]=t;return e[n](r,A,...o)}return e[t](r,A)}function v(e,t){const r=Array.isArray(e)?S[e[0]]:S[e];if(void 0===r.suggest)return null;const A=Array.isArray(e)?e.slice(1):[];return r.suggest(t,...A)}const S={always:()=>!0,isOptionLike:(e,t)=>!e.ignoreOptions&&t.startsWith("-"),isNotOptionLike:(e,t)=>e.ignoreOptions||!t.startsWith("-"),isOption:(e,t,r,A)=>!e.ignoreOptions&&t===r,isBatchOption:(e,t,r)=>!e.ignoreOptions&&o.test(t)&&[...t.slice(1)].every(e=>r.includes("-"+e)),isBoundOption:(e,t,r,A)=>{const o=t.match(i);return!e.ignoreOptions&&!!o&&n.test(o[1])&&r.includes(o[1])&&A.filter(e=>e.names.includes(o[1])).every(e=>e.allowBinding)},isNegatedOption:(e,t,r)=>!e.ignoreOptions&&t==="--no-"+r.slice(2),isHelp:(e,t)=>!e.ignoreOptions&&A.test(t),isUnsupportedOption:(e,t,r)=>!e.ignoreOptions&&t.startsWith("-")&&n.test(t)&&!r.includes(t),isInvalidOption:(e,t)=>!e.ignoreOptions&&t.startsWith("-")&&!n.test(t)};S.isOption.suggest=(e,t,r=!0)=>r?null:[t];const k={setCandidateUsage:(e,t,r)=>Object.assign(Object.assign({},e),{candidateUsage:r}),setSelectedIndex:(e,t,r)=>Object.assign(Object.assign({},e),{selectedIndex:r}),pushBatch:(e,t)=>Object.assign(Object.assign({},e),{options:e.options.concat([...t.slice(1)].map(e=>({name:"-"+e,value:!0})))}),pushBound:(e,t)=>{const[,r,A]=t.match(i);return Object.assign(Object.assign({},e),{options:e.options.concat({name:r,value:A})})},pushPath:(e,t)=>Object.assign(Object.assign({},e),{path:e.path.concat(t)}),pushPositional:(e,t)=>Object.assign(Object.assign({},e),{positionals:e.positionals.concat({value:t,extra:!1})}),pushExtra:(e,t)=>Object.assign(Object.assign({},e),{positionals:e.positionals.concat({value:t,extra:!0})}),pushExtraNoLimits:(e,t)=>Object.assign(Object.assign({},e),{positionals:e.positionals.concat({value:t,extra:N})}),pushTrue:(e,t,r=t)=>Object.assign(Object.assign({},e),{options:e.options.concat({name:t,value:!0})}),pushFalse:(e,t,r=t)=>Object.assign(Object.assign({},e),{options:e.options.concat({name:r,value:!1})}),pushUndefined:(e,t)=>Object.assign(Object.assign({},e),{options:e.options.concat({name:t,value:void 0})}),pushStringValue:(e,t)=>{var r;const A=Object.assign(Object.assign({},e),{options:[...e.options]}),n=e.options[e.options.length-1];return n.value=(null!==(r=n.value)&&void 0!==r?r:[]).concat([t]),A},setStringValue:(e,t)=>{const r=Object.assign(Object.assign({},e),{options:[...e.options]});return e.options[e.options.length-1].value=t,r},inhibateOptions:e=>Object.assign(Object.assign({},e),{ignoreOptions:!0}),useHelp:(e,t,r)=>{const[,n,o]=t.match(A);return void 0!==o?Object.assign(Object.assign({},e),{options:[{name:"-c",value:String(r)},{name:"-i",value:o}]}):Object.assign(Object.assign({},e),{options:[{name:"-c",value:String(r)}]})},setError:(e,t,r)=>"\0"===t?Object.assign(Object.assign({},e),{errorMessage:r+"."}):Object.assign(Object.assign({},e),{errorMessage:`${r} ("${t}").`}),setOptionArityError:(e,t)=>{const r=e.options[e.options.length-1];return Object.assign(Object.assign({},e),{errorMessage:`Not enough arguments to option ${r.name}.`})}},N=Symbol();class F{constructor(e,t){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=t}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:t=this.arity.trailing,extra:r=this.arity.extra,proxy:A=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:t,extra:r,proxy:A})}addPositional({name:e="arg",required:t=!0}={}){if(!t&&this.arity.extra===N)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!t&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");t||this.arity.extra===N?this.arity.extra!==N&&0===this.arity.extra.length?this.arity.leading.push(e):this.arity.trailing.push(e):this.arity.extra.push(e)}addRest({name:e="arg",required:t=0}={}){if(this.arity.extra===N)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let r=0;r1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(r))throw new Error("The arity must be an integer, got "+r);if(r<0)throw new Error("The arity must be positive, got "+r);this.allOptionNames.push(...e),this.options.push({names:e,description:t,arity:r,hidden:A,allowBinding:n})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:t=!0}={}){const r=[this.cliOpts.binaryName],A=[];if(this.paths.length>0&&r.push(...this.paths[0]),e){for(const{names:e,arity:n,hidden:o,description:i}of this.options){if(o)continue;const s=[];for(let e=0;e`<${e}>`)),this.arity.extra===N?r.push("..."):r.push(...this.arity.extra.map(e=>`[${e}]`)),r.push(...this.arity.trailing.map(e=>`<${e}>`))}return{usage:r.join(" "),options:A}}compile(){if(void 0===this.context)throw new Error("Assertion failed: No context attached");const e={nodes:[{dynamics:[],shortcuts:[],statics:{}},{dynamics:[],shortcuts:[],statics:{}},{dynamics:[],shortcuts:[],statics:{}}]};let t=0;t=p(e,{dynamics:[],shortcuts:[],statics:{}}),D(e,0,"",t,["setCandidateUsage",this.usage().usage]);const r=this.arity.proxy?"always":"isNotOptionLike",A=this.paths.length>0?this.paths:[[]];for(const n of A){let A=t;if(n.length>0){const t=p(e,{dynamics:[],shortcuts:[],statics:{}});Q(e,A,t),this.registerOptions(e,t),A=t}for(let t=0;t0||!this.arity.proxy){const t=p(e,{dynamics:[],shortcuts:[],statics:{}});w(e,A,"isHelp",t,["useHelp",this.cliIndex]),D(e,t,"\0",1,["setSelectedIndex",-1]),this.registerOptions(e,A)}this.arity.leading.length>0&&D(e,A,"\0",2,["setError","Not enough positional arguments"]);let o=A;for(let t=0;t0||t+1!==this.arity.leading.length)&&D(e,r,"\0",2,["setError","Not enough positional arguments"]),w(e,o,"isNotOptionLike",r,"pushPositional"),o=r}let i=o;if(this.arity.extra===N||this.arity.extra.length>0){const t=p(e,{dynamics:[],shortcuts:[],statics:{}});if(Q(e,o,t),this.arity.extra===N){const A=p(e,{dynamics:[],shortcuts:[],statics:{}});this.arity.proxy||this.registerOptions(e,A),w(e,o,r,A,"pushExtraNoLimits"),w(e,A,r,A,"pushExtraNoLimits"),Q(e,A,t)}else for(let A=0;A0&&D(e,i,"\0",2,["setError","Not enough positional arguments"]);let s=i;for(let t=0;tt.length>e.length?t:e,"");if(0===r.arity)for(const n of r.names)w(e,t,["isOption",n,r.hidden||n!==A],t,"pushTrue"),n.startsWith("--")&&!n.startsWith("--no-")&&w(e,t,["isNegatedOption",n],t,["pushFalse",n]);else{let n=p(e,{dynamics:[],shortcuts:[],statics:{}});for(const o of r.names)w(e,t,["isOption",o,r.hidden||o!==A],n,"pushUndefined");for(let t=0;t=0&&e{if(t.has(A))return;t.add(A);const n=e.nodes[A];for(const e of Object.values(n.statics))for(const{to:t}of e)r(t);for(const[,{to:e}]of n.dynamics)r(e);for(const{to:e}of n.shortcuts)r(e);const o=new Set(n.shortcuts.map(({to:e})=>e));for(;n.shortcuts.length>0;){const{to:t}=n.shortcuts.shift(),r=e.nodes[t];for(const[e,t]of Object.entries(r.statics)){let r=Object.prototype.hasOwnProperty.call(n.statics,e)?n.statics[e]:n.statics[e]=[];for(const e of t)r.some(({to:t})=>e.to===t)||r.push(e)}for(const[e,t]of r.dynamics)n.dynamics.some(([r,{to:A}])=>e===r&&t.to===A)||n.dynamics.push([e,t]);for(const e of r.shortcuts)o.has(e.to)||(n.shortcuts.push(e),o.add(e.to))}};r(0)}(r),{machine:r,contexts:t,process:e=>f(r,e),suggest:(e,t)=>function(e,t,r){const A=r&&t.length>0?[""]:[],n=d(e,t,r),o=[],i=new Set,s=(t,r,A=!0)=>{let n=[r];for(;n.length>0;){const r=n;n=[];for(const o of r){const r=e.nodes[o],i=Object.keys(r.statics);for(const e of Object.keys(r.statics)){const e=i[0];for(const{to:o,reducer:i}of r.statics[e])"pushPath"===i&&(A||t.push(e),n.push(o))}}A=!1}const s=JSON.stringify(t);i.has(s)||(o.push(t),i.add(s))};for(const{node:t,state:r}of n){if(null!==r.remainder){s([r.remainder],t);continue}const n=e.nodes[t],o=C(n,r);for(const[e,r]of Object.entries(n.statics))(o&&"\0"!==e||!e.startsWith("-")&&r.some(({reducer:e})=>"pushPath"===e))&&s([...A,e],t);if(o)for(const[e,{to:o}]of n.dynamics){if(2===o)continue;const n=v(e,r);if(null!==n)for(const e of n)s([...A,e],t)}}return[...o].sort()}(r,e,t)}}}class M{constructor(){this.help=!1}static getMeta(e){const t=e.constructor;return t.meta=Object.prototype.hasOwnProperty.call(t,"meta")?t.meta:{definitions:[],transformers:[(e,t)=>{for(const{name:r,value:A}of e.options)"-h"!==r&&"--help"!==r||(t.help=A)}]}}static resolveMeta(e){const t=[],r=[];for(let A=e;A instanceof M;A=A.__proto__){const e=this.getMeta(A);for(const r of e.definitions)t.push(r);for(const t of e.transformers)r.push(t)}return{definitions:t,transformers:r}}static registerDefinition(e,t){this.getMeta(e).definitions.push(t)}static registerTransformer(e,t){this.getMeta(e).transformers.push(t)}static addPath(...e){this.Path(...e)(this.prototype,"execute")}static addOption(e,t){t(this.prototype,e)}static Path(...e){return(t,r)=>{this.registerDefinition(t,t=>{t.addPath(e)})}}static Boolean(e,{hidden:t=!1,description:r}={}){return(A,n)=>{const o=e.split(",");this.registerDefinition(A,e=>{e.addOption({names:o,arity:0,hidden:t,allowBinding:!1,description:r})}),this.registerTransformer(A,(e,t)=>{for(const{name:r,value:A}of e.options)o.includes(r)&&(t[n]=A)})}}static Counter(e,{hidden:t=!1,description:r}={}){return(A,n)=>{const o=e.split(",");this.registerDefinition(A,e=>{e.addOption({names:o,arity:0,hidden:t,allowBinding:!1,description:r})}),this.registerTransformer(A,(e,t)=>{var r;for(const{name:A,value:i}of e.options)o.includes(A)&&(null!==(r=t[n])&&void 0!==r||(t[n]=0),i?t[n]++:t[n]=0)})}}static String(e={},{arity:t=1,tolerateBoolean:r=!1,hidden:A=!1,description:n}={}){return(o,i)=>{if("string"==typeof e){const s=e.split(",");this.registerDefinition(o,e=>{e.addOption({names:s,arity:r?0:t,hidden:A,description:n})}),this.registerTransformer(o,(e,t)=>{for(const{name:r,value:A}of e.options)s.includes(r)&&(t[i]=A)})}else{const{name:t=i,required:r=!0}=e;this.registerDefinition(o,e=>{e.addPositional({name:t,required:r})}),this.registerTransformer(o,(e,t)=>{for(let A=0;A{if(0===t)throw new Error("Array options are expected to have at least an arity of 1");const i=e.split(",");this.registerDefinition(n,e=>{e.addOption({names:i,arity:t,hidden:r,description:A})}),this.registerTransformer(n,(e,t)=>{for(const{name:r,value:A}of e.options)i.includes(r)&&(t[o]=t[o]||[],t[o].push(A))})}}static Rest({required:e=0}={}){return(t,r)=>{this.registerDefinition(t,t=>{t.addRest({name:r,required:e})}),this.registerTransformer(t,(e,t,A)=>{const n=t=>{const r=e.positionals[t];return r.extra===N||!1===r.extra&&te)})}}static Proxy({required:e=0}={}){return(t,r)=>{this.registerDefinition(t,t=>{t.addProxy({required:e})}),this.registerTransformer(t,(e,t)=>{t[r]=e.positionals.map(({value:e})=>e)})}}static Usage(e){return e}static Schema(e){return e}async catch(e){throw e}async validateAndExecute(){const e=this.constructor.schema;if(void 0!==e)try{await e.validate(this)}catch(e){throw"ValidationError"===e.name&&(e.clipanion={type:"usage"}),e}const t=await this.execute();return void 0!==t?t:0}} +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +function R(e,t,r,A){var n,o=arguments.length,i=o<3?t:null===A?A=Object.getOwnPropertyDescriptor(t,r):A;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,A);else for(var s=e.length-1;s>=0;s--)(n=e[s])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}M.Entries={};class x extends M{async execute(){this.context.stdout.write(this.cli.usage(null))}}R([M.Path("--help"),M.Path("-h")],x.prototype,"execute",null);class L extends M{async execute(){var e;this.context.stdout.write((null!==(e=this.cli.binaryVersion)&&void 0!==e?e:"")+"\n")}}R([M.Path("--version"),M.Path("-v")],L.prototype,"execute",null);const P={bold:e=>`${e}`,error:e=>`${e}`,code:e=>`${e}`},O={bold:e=>e,error:e=>e,code:e=>e};function U(e,{format:t,paragraphs:r}){return e=(e=(e=(e=(e=e.replace(/\r\n?/g,"\n")).replace(/^[\t ]+|[\t ]+$/gm,"")).replace(/^\n+|\n+$/g,"")).replace(/^-([^\n]*?)\n+/gm,"-$1\n\n")).replace(/\n(\n)?\n*/g,"$1"),r&&(e=e.split(/\n/).map((function(e){let t=e.match(/^[*-][\t ]+(.*)/);return t?t[1].match(/(.{1,78})(?: |$)/g).map((e,t)=>(0===t?"- ":" ")+e).join("\n"):e.match(/(.{1,80})(?: |$)/g).join("\n")})).join("\n\n")),(e=e.replace(/(`+)((?:.|[\n])*?)\1/g,(function(e,r,A){return t.code(r+A+r)})))?e+"\n":""}class T extends M{constructor(e){super(),this.contexts=e,this.commands=[]}static from(e,t){const r=new T(t);r.path=e.path;for(const t of e.options)switch(t.name){case"-c":r.commands.push(Number(t.value));break;case"-i":r.index=Number(t.value)}return r}async execute(){let e=this.commands;if(void 0!==this.index&&this.index>=0&&this.index1){this.context.stdout.write("Multiple commands match your selection:\n"),this.context.stdout.write("\n");let e=0;for(const t of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[t].commandClass,{prefix:(e+++". ").padStart(5)}));this.context.stdout.write("\n"),this.context.stdout.write("Run again with -h= to see the longer details of any of those commands.\n")}}}function j(){return"0"!==process.env.FORCE_COLOR&&("1"===process.env.FORCE_COLOR||!(void 0===process.stdout||!process.stdout.isTTY))}class Y{constructor({binaryLabel:e,binaryName:t="...",binaryVersion:r,enableColors:A=j()}={}){this.registrations=new Map,this.builder=new K({binaryName:t}),this.binaryLabel=e,this.binaryName=t,this.binaryVersion=r,this.enableColors=A}static from(e,t={}){const r=new Y(t);for(const t of e)r.register(t);return r}register(e){const t=this.builder.command();this.registrations.set(e,t.cliIndex);const{definitions:r}=e.resolveMeta(e.prototype);for(const e of r)e(t);t.setContext({commandClass:e})}process(e){const{contexts:t,process:r}=this.builder.compile(),A=r(e);switch(A.selectedIndex){case-1:return T.from(A,t);default:{const{commandClass:e}=t[A.selectedIndex],r=this.registrations.get(e);if(void 0===r)throw new Error("Assertion failed: Expected the command class to have been registered.");const n=this.builder.getBuilderByIndex(r),o=new e;o.path=A.path;const{transformers:i}=e.resolveMeta(e.prototype);for(const e of i)e(A,o,n);return o}}}async run(e,t){let r,A;if(Array.isArray(e))try{r=this.process(e)}catch(e){return t.stdout.write(this.error(e)),1}else r=e;if(r.help)return t.stdout.write(this.usage(r,{detailed:!0})),0;r.context=t,r.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableColors:this.enableColors,definitions:()=>this.definitions(),error:(e,t)=>this.error(e,t),process:e=>this.process(e),run:(e,r)=>this.run(e,Object.assign(Object.assign({},t),r)),usage:(e,t)=>this.usage(e,t)};try{A=await r.validateAndExecute().catch(e=>r.catch(e).then(()=>0))}catch(e){return t.stdout.write(this.error(e,{command:r})),1}return A}async runExit(e,t){process.exitCode=await this.run(e,t)}suggest(e,t){const{contexts:r,process:A,suggest:n}=this.builder.compile();return n(e,t)}definitions({colored:e=!1}={}){const t=[];for(const[r,A]of this.registrations){if(void 0===r.usage)continue;const{usage:n}=this.getUsageByIndex(A,{detailed:!1}),{usage:o,options:i}=this.getUsageByIndex(A,{detailed:!0,inlineOptions:!1}),s=void 0!==r.usage.category?U(r.usage.category,{format:this.format(e),paragraphs:!1}):void 0,a=void 0!==r.usage.description?U(r.usage.description,{format:this.format(e),paragraphs:!1}):void 0,c=void 0!==r.usage.details?U(r.usage.details,{format:this.format(e),paragraphs:!0}):void 0,g=void 0!==r.usage.examples?r.usage.examples.map(([t,r])=>[U(t,{format:this.format(e),paragraphs:!1}),r.replace(/\$0/g,this.binaryName)]):void 0;t.push({path:n,usage:o,category:s,description:a,details:c,examples:g,options:i})}return t}usage(e=null,{colored:t,detailed:r=!1,prefix:A="$ "}={}){const n=null!==e&&void 0===e.getMeta?e.constructor:e;let o="";if(n)if(r){const{description:e="",details:r="",examples:i=[]}=n.usage||{};""!==e&&(o+=U(e,{format:this.format(t),paragraphs:!1}).replace(/^./,e=>e.toUpperCase()),o+="\n"),(""!==r||i.length>0)&&(o+=this.format(t).bold("Usage:")+"\n",o+="\n");const{usage:s,options:a}=this.getUsageByRegistration(n,{inlineOptions:!1});if(o+=`${this.format(t).bold(A)}${s}\n`,a.length>0){o+="\n",o+=P.bold("Options:")+"\n";const e=a.reduce((e,t)=>Math.max(e,t.definition.length),0);o+="\n";for(const{definition:r,description:A}of a)o+=` ${r.padEnd(e)} ${U(A,{format:this.format(t),paragraphs:!1})}`}if(""!==r&&(o+="\n",o+=this.format(t).bold("Details:")+"\n",o+="\n",o+=U(r,{format:this.format(t),paragraphs:!0})),i.length>0){o+="\n",o+=this.format(t).bold("Examples:")+"\n";for(let[e,r]of i)o+="\n",o+=U(e,{format:this.format(t),paragraphs:!1}),o+=r.replace(/^/m," "+this.format(t).bold(A)).replace(/\$0/g,this.binaryName)+"\n"}}else{const{usage:e}=this.getUsageByRegistration(n);o+=`${this.format(t).bold(A)}${e}\n`}else{const e=new Map;for(const[r,A]of this.registrations.entries()){if(void 0===r.usage)continue;const n=void 0!==r.usage.category?U(r.usage.category,{format:this.format(t),paragraphs:!1}):null;let o=e.get(n);void 0===o&&e.set(n,o=[]);const{usage:i}=this.getUsageByIndex(A);o.push({commandClass:r,usage:i})}const r=Array.from(e.keys()).sort((e,t)=>null===e?-1:null===t?1:e.localeCompare(t,"en",{usage:"sort",caseFirst:"upper"})),n=void 0!==this.binaryLabel,i=void 0!==this.binaryVersion;n||i?(o+=n&&i?this.format(t).bold(`${this.binaryLabel} - ${this.binaryVersion}`)+"\n\n":n?this.format(t).bold(""+this.binaryLabel)+"\n":this.format(t).bold(""+this.binaryVersion)+"\n",o+=` ${this.format(t).bold(A)}${this.binaryName} \n`):o+=`${this.format(t).bold(A)}${this.binaryName} \n`;for(let A of r){const r=e.get(A).slice().sort((e,t)=>e.usage.localeCompare(t.usage,"en",{usage:"sort",caseFirst:"upper"})),n=null!==A?A.trim():"Where is one of";o+="\n",o+=this.format(t).bold(n+":")+"\n";for(let{commandClass:e,usage:A}of r){const r=e.usage.description||"undocumented";o+="\n",o+=` ${this.format(t).bold(A)}\n`,o+=" "+U(r,{format:this.format(t),paragraphs:!1})}}o+="\n",o+=U("You can also print more details about any of these commands by calling them after adding the `-h,--help` flag right after the command name.",{format:this.format(t),paragraphs:!0})}return o}error(e,{colored:t,command:r=null}={}){e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let A="",n=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");"Error"===n&&(n="Internal Error"),A+=`${this.format(t).error(n)}: ${e.message}\n`;const o=e.clipanion;return void 0!==o?"usage"===o.type&&(A+="\n",A+=this.usage(r)):e.stack&&(A+=e.stack.replace(/^.*\n/,"")+"\n"),A}getUsageByRegistration(e,t){const r=this.registrations.get(e);if(void 0===r)throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(r,t)}getUsageByIndex(e,t){return this.builder.getBuilderByIndex(e).usage(t)}format(e=this.enableColors){return e?P:O}}Y.defaultContext={stdin:process.stdin,stdout:process.stdout,stderr:process.stderr},M.Entries.Help=x,M.Entries.Version=L},15751:(e,t,r)=>{"use strict";const A=r(92413).PassThrough,n=r(65007);e.exports=e=>{if(!e||!e.pipe)throw new TypeError("Parameter `response` must be a response stream.");const t=new A;return n(e,t),e.pipe(t)}},15311:(e,t,r)=>{const A=r(93300),n={};for(const e of Object.keys(A))n[A[e]]=e;const o={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};e.exports=o;for(const e of Object.keys(o)){if(!("channels"in o[e]))throw new Error("missing channels property: "+e);if(!("labels"in o[e]))throw new Error("missing channel labels property: "+e);if(o[e].labels.length!==o[e].channels)throw new Error("channel and label counts mismatch: "+e);const{channels:t,labels:r}=o[e];delete o[e].channels,delete o[e].labels,Object.defineProperty(o[e],"channels",{value:t}),Object.defineProperty(o[e],"labels",{value:r})}o.rgb.hsl=function(e){const t=e[0]/255,r=e[1]/255,A=e[2]/255,n=Math.min(t,r,A),o=Math.max(t,r,A),i=o-n;let s,a;o===n?s=0:t===o?s=(r-A)/i:r===o?s=2+(A-t)/i:A===o&&(s=4+(t-r)/i),s=Math.min(60*s,360),s<0&&(s+=360);const c=(n+o)/2;return a=o===n?0:c<=.5?i/(o+n):i/(2-o-n),[s,100*a,100*c]},o.rgb.hsv=function(e){let t,r,A,n,o;const i=e[0]/255,s=e[1]/255,a=e[2]/255,c=Math.max(i,s,a),g=c-Math.min(i,s,a),l=function(e){return(c-e)/6/g+.5};return 0===g?(n=0,o=0):(o=g/c,t=l(i),r=l(s),A=l(a),i===c?n=A-r:s===c?n=1/3+t-A:a===c&&(n=2/3+r-t),n<0?n+=1:n>1&&(n-=1)),[360*n,100*o,100*c]},o.rgb.hwb=function(e){const t=e[0],r=e[1];let A=e[2];const n=o.rgb.hsl(e)[0],i=1/255*Math.min(t,Math.min(r,A));return A=1-1/255*Math.max(t,Math.max(r,A)),[n,100*i,100*A]},o.rgb.cmyk=function(e){const t=e[0]/255,r=e[1]/255,A=e[2]/255,n=Math.min(1-t,1-r,1-A);return[100*((1-t-n)/(1-n)||0),100*((1-r-n)/(1-n)||0),100*((1-A-n)/(1-n)||0),100*n]},o.rgb.keyword=function(e){const t=n[e];if(t)return t;let r,o=1/0;for(const t of Object.keys(A)){const n=A[t],a=(s=n,((i=e)[0]-s[0])**2+(i[1]-s[1])**2+(i[2]-s[2])**2);a.04045?((t+.055)/1.055)**2.4:t/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,A=A>.04045?((A+.055)/1.055)**2.4:A/12.92;return[100*(.4124*t+.3576*r+.1805*A),100*(.2126*t+.7152*r+.0722*A),100*(.0193*t+.1192*r+.9505*A)]},o.rgb.lab=function(e){const t=o.rgb.xyz(e);let r=t[0],A=t[1],n=t[2];r/=95.047,A/=100,n/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,A=A>.008856?A**(1/3):7.787*A+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;return[116*A-16,500*(r-A),200*(A-n)]},o.hsl.rgb=function(e){const t=e[0]/360,r=e[1]/100,A=e[2]/100;let n,o,i;if(0===r)return i=255*A,[i,i,i];n=A<.5?A*(1+r):A+r-A*r;const s=2*A-n,a=[0,0,0];for(let e=0;e<3;e++)o=t+1/3*-(e-1),o<0&&o++,o>1&&o--,i=6*o<1?s+6*(n-s)*o:2*o<1?n:3*o<2?s+(n-s)*(2/3-o)*6:s,a[e]=255*i;return a},o.hsl.hsv=function(e){const t=e[0];let r=e[1]/100,A=e[2]/100,n=r;const o=Math.max(A,.01);A*=2,r*=A<=1?A:2-A,n*=o<=1?o:2-o;return[t,100*(0===A?2*n/(o+n):2*r/(A+r)),100*((A+r)/2)]},o.hsv.rgb=function(e){const t=e[0]/60,r=e[1]/100;let A=e[2]/100;const n=Math.floor(t)%6,o=t-Math.floor(t),i=255*A*(1-r),s=255*A*(1-r*o),a=255*A*(1-r*(1-o));switch(A*=255,n){case 0:return[A,a,i];case 1:return[s,A,i];case 2:return[i,A,a];case 3:return[i,s,A];case 4:return[a,i,A];case 5:return[A,i,s]}},o.hsv.hsl=function(e){const t=e[0],r=e[1]/100,A=e[2]/100,n=Math.max(A,.01);let o,i;i=(2-r)*A;const s=(2-r)*n;return o=r*n,o/=s<=1?s:2-s,o=o||0,i/=2,[t,100*o,100*i]},o.hwb.rgb=function(e){const t=e[0]/360;let r=e[1]/100,A=e[2]/100;const n=r+A;let o;n>1&&(r/=n,A/=n);const i=Math.floor(6*t),s=1-A;o=6*t-i,0!=(1&i)&&(o=1-o);const a=r+o*(s-r);let c,g,l;switch(i){default:case 6:case 0:c=s,g=a,l=r;break;case 1:c=a,g=s,l=r;break;case 2:c=r,g=s,l=a;break;case 3:c=r,g=a,l=s;break;case 4:c=a,g=r,l=s;break;case 5:c=s,g=r,l=a}return[255*c,255*g,255*l]},o.cmyk.rgb=function(e){const t=e[0]/100,r=e[1]/100,A=e[2]/100,n=e[3]/100;return[255*(1-Math.min(1,t*(1-n)+n)),255*(1-Math.min(1,r*(1-n)+n)),255*(1-Math.min(1,A*(1-n)+n))]},o.xyz.rgb=function(e){const t=e[0]/100,r=e[1]/100,A=e[2]/100;let n,o,i;return n=3.2406*t+-1.5372*r+-.4986*A,o=-.9689*t+1.8758*r+.0415*A,i=.0557*t+-.204*r+1.057*A,n=n>.0031308?1.055*n**(1/2.4)-.055:12.92*n,o=o>.0031308?1.055*o**(1/2.4)-.055:12.92*o,i=i>.0031308?1.055*i**(1/2.4)-.055:12.92*i,n=Math.min(Math.max(0,n),1),o=Math.min(Math.max(0,o),1),i=Math.min(Math.max(0,i),1),[255*n,255*o,255*i]},o.xyz.lab=function(e){let t=e[0],r=e[1],A=e[2];t/=95.047,r/=100,A/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,A=A>.008856?A**(1/3):7.787*A+16/116;return[116*r-16,500*(t-r),200*(r-A)]},o.lab.xyz=function(e){let t,r,A;r=(e[0]+16)/116,t=e[1]/500+r,A=r-e[2]/200;const n=r**3,o=t**3,i=A**3;return r=n>.008856?n:(r-16/116)/7.787,t=o>.008856?o:(t-16/116)/7.787,A=i>.008856?i:(A-16/116)/7.787,t*=95.047,r*=100,A*=108.883,[t,r,A]},o.lab.lch=function(e){const t=e[0],r=e[1],A=e[2];let n;n=360*Math.atan2(A,r)/2/Math.PI,n<0&&(n+=360);return[t,Math.sqrt(r*r+A*A),n]},o.lch.lab=function(e){const t=e[0],r=e[1],A=e[2]/360*2*Math.PI;return[t,r*Math.cos(A),r*Math.sin(A)]},o.rgb.ansi16=function(e,t=null){const[r,A,n]=e;let i=null===t?o.rgb.hsv(e)[2]:t;if(i=Math.round(i/50),0===i)return 30;let s=30+(Math.round(n/255)<<2|Math.round(A/255)<<1|Math.round(r/255));return 2===i&&(s+=60),s},o.hsv.ansi16=function(e){return o.rgb.ansi16(o.hsv.rgb(e),e[2])},o.rgb.ansi256=function(e){const t=e[0],r=e[1],A=e[2];if(t===r&&r===A)return t<8?16:t>248?231:Math.round((t-8)/247*24)+232;return 16+36*Math.round(t/255*5)+6*Math.round(r/255*5)+Math.round(A/255*5)},o.ansi16.rgb=function(e){let t=e%10;if(0===t||7===t)return e>50&&(t+=3.5),t=t/10.5*255,[t,t,t];const r=.5*(1+~~(e>50));return[(1&t)*r*255,(t>>1&1)*r*255,(t>>2&1)*r*255]},o.ansi256.rgb=function(e){if(e>=232){const t=10*(e-232)+8;return[t,t,t]}let t;e-=16;return[Math.floor(e/36)/5*255,Math.floor((t=e%36)/6)/5*255,t%6/5*255]},o.rgb.hex=function(e){const t=(((255&Math.round(e[0]))<<16)+((255&Math.round(e[1]))<<8)+(255&Math.round(e[2]))).toString(16).toUpperCase();return"000000".substring(t.length)+t},o.hex.rgb=function(e){const t=e.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!t)return[0,0,0];let r=t[0];3===t[0].length&&(r=r.split("").map(e=>e+e).join(""));const A=parseInt(r,16);return[A>>16&255,A>>8&255,255&A]},o.rgb.hcg=function(e){const t=e[0]/255,r=e[1]/255,A=e[2]/255,n=Math.max(Math.max(t,r),A),o=Math.min(Math.min(t,r),A),i=n-o;let s,a;return s=i<1?o/(1-i):0,a=i<=0?0:n===t?(r-A)/i%6:n===r?2+(A-t)/i:4+(t-r)/i,a/=6,a%=1,[360*a,100*i,100*s]},o.hsl.hcg=function(e){const t=e[1]/100,r=e[2]/100,A=r<.5?2*t*r:2*t*(1-r);let n=0;return A<1&&(n=(r-.5*A)/(1-A)),[e[0],100*A,100*n]},o.hsv.hcg=function(e){const t=e[1]/100,r=e[2]/100,A=t*r;let n=0;return A<1&&(n=(r-A)/(1-A)),[e[0],100*A,100*n]},o.hcg.rgb=function(e){const t=e[0]/360,r=e[1]/100,A=e[2]/100;if(0===r)return[255*A,255*A,255*A];const n=[0,0,0],o=t%1*6,i=o%1,s=1-i;let a=0;switch(Math.floor(o)){case 0:n[0]=1,n[1]=i,n[2]=0;break;case 1:n[0]=s,n[1]=1,n[2]=0;break;case 2:n[0]=0,n[1]=1,n[2]=i;break;case 3:n[0]=0,n[1]=s,n[2]=1;break;case 4:n[0]=i,n[1]=0,n[2]=1;break;default:n[0]=1,n[1]=0,n[2]=s}return a=(1-r)*A,[255*(r*n[0]+a),255*(r*n[1]+a),255*(r*n[2]+a)]},o.hcg.hsv=function(e){const t=e[1]/100,r=t+e[2]/100*(1-t);let A=0;return r>0&&(A=t/r),[e[0],100*A,100*r]},o.hcg.hsl=function(e){const t=e[1]/100,r=e[2]/100*(1-t)+.5*t;let A=0;return r>0&&r<.5?A=t/(2*r):r>=.5&&r<1&&(A=t/(2*(1-r))),[e[0],100*A,100*r]},o.hcg.hwb=function(e){const t=e[1]/100,r=t+e[2]/100*(1-t);return[e[0],100*(r-t),100*(1-r)]},o.hwb.hcg=function(e){const t=e[1]/100,r=1-e[2]/100,A=r-t;let n=0;return A<1&&(n=(r-A)/(1-A)),[e[0],100*A,100*n]},o.apple.rgb=function(e){return[e[0]/65535*255,e[1]/65535*255,e[2]/65535*255]},o.rgb.apple=function(e){return[e[0]/255*65535,e[1]/255*65535,e[2]/255*65535]},o.gray.rgb=function(e){return[e[0]/100*255,e[0]/100*255,e[0]/100*255]},o.gray.hsl=function(e){return[0,0,e[0]]},o.gray.hsv=o.gray.hsl,o.gray.hwb=function(e){return[0,100,e[0]]},o.gray.cmyk=function(e){return[0,0,0,e[0]]},o.gray.lab=function(e){return[e[0],0,0]},o.gray.hex=function(e){const t=255&Math.round(e[0]/100*255),r=((t<<16)+(t<<8)+t).toString(16).toUpperCase();return"000000".substring(r.length)+r},o.rgb.gray=function(e){return[(e[0]+e[1]+e[2])/3/255*100]}},2744:(e,t,r)=>{const A=r(15311),n=r(78577),o={};Object.keys(A).forEach(e=>{o[e]={},Object.defineProperty(o[e],"channels",{value:A[e].channels}),Object.defineProperty(o[e],"labels",{value:A[e].labels});const t=n(e);Object.keys(t).forEach(r=>{const A=t[r];o[e][r]=function(e){const t=function(...t){const r=t[0];if(null==r)return r;r.length>1&&(t=r);const A=e(t);if("object"==typeof A)for(let e=A.length,t=0;t1&&(t=r),e(t))};return"conversion"in e&&(t.conversion=e.conversion),t}(A)})}),e.exports=o},78577:(e,t,r)=>{const A=r(15311);function n(e){const t=function(){const e={},t=Object.keys(A);for(let r=t.length,A=0;A{"use strict";e.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},67566:(e,t,r)=>{"use strict";const A=r(63129),n=r(14951),o=r(10779);function i(e,t,r){const i=n(e,t,r),s=A.spawn(i.command,i.args,i.options);return o.hookChildProcess(s,i),s}e.exports=i,e.exports.spawn=i,e.exports.sync=function(e,t,r){const i=n(e,t,r),s=A.spawnSync(i.command,i.args,i.options);return s.error=s.error||o.verifyENOENTSync(s.status,i),s},e.exports._parse=n,e.exports._enoent=o},10779:e=>{"use strict";const t="win32"===process.platform;function r(e,t){return Object.assign(new Error(`${t} ${e.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${t} ${e.command}`,path:e.command,spawnargs:e.args})}function A(e,A){return t&&1===e&&!A.file?r(A.original,"spawn"):null}e.exports={hookChildProcess:function(e,r){if(!t)return;const n=e.emit;e.emit=function(t,o){if("exit"===t){const t=A(o,r);if(t)return n.call(e,"error",t)}return n.apply(e,arguments)}},verifyENOENT:A,verifyENOENTSync:function(e,A){return t&&1===e&&!A.file?r(A.original,"spawnSync"):null},notFoundError:r}},14951:(e,t,r)=>{"use strict";const A=r(85622),n=r(47447),o=r(27066),i=r(35187),s="win32"===process.platform,a=/\.(?:com|exe)$/i,c=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function g(e){if(!s)return e;const t=function(e){e.file=n(e);const t=e.file&&i(e.file);return t?(e.args.unshift(e.file),e.command=t,n(e)):e.file}(e),r=!a.test(t);if(e.options.forceShell||r){const r=c.test(t);e.command=A.normalize(e.command),e.command=o.command(e.command),e.args=e.args.map(e=>o.argument(e,r));const n=[e.command].concat(e.args).join(" ");e.args=["/d","/s","/c",`"${n}"`],e.command=process.env.comspec||"cmd.exe",e.options.windowsVerbatimArguments=!0}return e}e.exports=function(e,t,r){t&&!Array.isArray(t)&&(r=t,t=null);const A={command:e,args:t=t?t.slice(0):[],options:r=Object.assign({},r),file:void 0,original:{command:e,args:t}};return r.shell?A:g(A)}},27066:e=>{"use strict";const t=/([()\][%!^"`<>&|;, *?])/g;e.exports.command=function(e){return e=e.replace(t,"^$1")},e.exports.argument=function(e,r){return e=(e=`"${e=(e=(e=""+e).replace(/(\\*)"/g,'$1$1\\"')).replace(/(\\*)$/,"$1$1")}"`).replace(t,"^$1"),r&&(e=e.replace(t,"^$1")),e}},35187:(e,t,r)=>{"use strict";const A=r(35747),n=r(91470);e.exports=function(e){const t=Buffer.alloc(150);let r;try{r=A.openSync(e,"r"),A.readSync(r,t,0,150,0),A.closeSync(r)}catch(e){}return n(t.toString())}},47447:(e,t,r)=>{"use strict";const A=r(85622),n=r(87945),o=r(37127);function i(e,t){const r=e.options.env||process.env,i=process.cwd(),s=null!=e.options.cwd,a=s&&void 0!==process.chdir&&!process.chdir.disabled;if(a)try{process.chdir(e.options.cwd)}catch(e){}let c;try{c=n.sync(e.command,{path:r[o({env:r})],pathExt:t?A.delimiter:void 0})}catch(e){}finally{a&&process.chdir(i)}return c&&(c=A.resolve(s?e.options.cwd:"",c)),c}e.exports=function(e){return i(e)||i(e,!0)}},93868:(e,t,r)=>{"use strict";const{Transform:A,PassThrough:n}=r(92413),o=r(78761),i=r(33527);e.exports=e=>{const t=(e.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(t))return e;const r="br"===t;if(r&&"function"!=typeof o.createBrotliDecompress)return e.destroy(new Error("Brotli is not supported on Node.js < 12")),e;let s=!0;const a=new A({transform(e,t,r){s=!1,r(null,e)},flush(e){e()}}),c=new n({autoDestroy:!1,destroy(t,r){e.destroy(),r(t)}}),g=r?o.createBrotliDecompress():o.createUnzip();return g.once("error",t=>{!s||e.readable?c.destroy(t):c.end()}),i(e,c),e.pipe(a).pipe(g).pipe(c),c}},93121:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(4016),n=(e,t)=>{let r;if("function"==typeof t){r={connect:t}}else r=t;const n="function"==typeof r.connect,o="function"==typeof r.secureConnect,i="function"==typeof r.close,s=()=>{n&&r.connect(),e instanceof A.TLSSocket&&o&&(e.authorized?r.secureConnect():e.authorizationError||e.once("secureConnect",r.secureConnect)),i&&e.once("close",r.close)};e.writable&&!e.connecting?s():e.connecting?e.once("connect",s):e.destroyed&&i&&r.close(e._hadError)};t.default=n,e.exports=n,e.exports.default=n},66241:(e,t,r)=>{"use strict";const A=r(85622),n=r(5763),o=e=>e.length>1?`{${e.join(",")}}`:e[0],i=(e,t)=>{const r="!"===e[0]?e.slice(1):e;return A.isAbsolute(r)?r:A.join(t,r)},s=(e,t)=>{if(t.files&&!Array.isArray(t.files))throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof t.files}\``);if(t.extensions&&!Array.isArray(t.extensions))throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof t.extensions}\``);return t.files&&t.extensions?t.files.map(r=>{return A.posix.join(e,(n=r,i=t.extensions,A.extname(n)?"**/"+n:`**/${n}.${o(i)}`));var n,i}):t.files?t.files.map(t=>A.posix.join(e,"**/"+t)):t.extensions?[A.posix.join(e,"**/*."+o(t.extensions))]:[A.posix.join(e,"**")]};e.exports=async(e,t)=>{if("string"!=typeof(t={cwd:process.cwd(),...t}).cwd)throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof t.cwd}\``);const r=await Promise.all([].concat(e).map(async e=>await n.isDirectory(i(e,t.cwd))?s(e,t):e));return[].concat.apply([],r)},e.exports.sync=(e,t)=>{if("string"!=typeof(t={cwd:process.cwd(),...t}).cwd)throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof t.cwd}\``);const r=[].concat(e).map(e=>n.isDirectorySync(i(e,t.cwd))?s(e,t):e);return[].concat.apply([],r)}},97681:(e,t,r)=>{var A=r(91162),n=function(){},o=function(e,t,r){if("function"==typeof t)return o(e,null,t);t||(t={}),r=A(r||n);var i=e._writableState,s=e._readableState,a=t.readable||!1!==t.readable&&e.readable,c=t.writable||!1!==t.writable&&e.writable,g=function(){e.writable||l()},l=function(){c=!1,a||r()},u=function(){a=!1,c||r()},h=function(e){r(e?new Error("exited with error code: "+e):null)},p=function(){return(!a||s&&s.ended)&&(!c||i&&i.ended)?void 0:r(new Error("premature close"))},d=function(){e.req.on("finish",l)};return!function(e){return e.setHeader&&"function"==typeof e.abort}(e)?c&&!i&&(e.on("end",g),e.on("close",g)):(e.on("complete",l),e.on("abort",p),e.req?d():e.on("request",d)),function(e){return e.stdio&&Array.isArray(e.stdio)&&3===e.stdio.length}(e)&&e.on("exit",h),e.on("end",u),e.on("finish",l),!1!==t.error&&e.on("error",r),e.on("close",p),function(){e.removeListener("complete",l),e.removeListener("abort",p),e.removeListener("request",d),e.req&&e.req.removeListener("finish",l),e.removeListener("end",g),e.removeListener("close",g),e.removeListener("finish",l),e.removeListener("exit",h),e.removeListener("end",u),e.removeListener("error",r),e.removeListener("close",p)}};e.exports=o},17067:(e,t,r)=>{var A=r(27180),n=function(){},o=function(e,t,r){if("function"==typeof t)return o(e,null,t);t||(t={}),r=A(r||n);var i=e._writableState,s=e._readableState,a=t.readable||!1!==t.readable&&e.readable,c=t.writable||!1!==t.writable&&e.writable,g=function(){e.writable||l()},l=function(){c=!1,a||r.call(e)},u=function(){a=!1,c||r.call(e)},h=function(t){r.call(e,t?new Error("exited with error code: "+t):null)},p=function(t){r.call(e,t)},d=function(){return(!a||s&&s.ended)&&(!c||i&&i.ended)?void 0:r.call(e,new Error("premature close"))},C=function(){e.req.on("finish",l)};return!function(e){return e.setHeader&&"function"==typeof e.abort}(e)?c&&!i&&(e.on("end",g),e.on("close",g)):(e.on("complete",l),e.on("abort",d),e.req?C():e.on("request",C)),function(e){return e.stdio&&Array.isArray(e.stdio)&&3===e.stdio.length}(e)&&e.on("exit",h),e.on("end",u),e.on("finish",l),!1!==t.error&&e.on("error",p),e.on("close",d),function(){e.removeListener("complete",l),e.removeListener("abort",d),e.removeListener("request",C),e.req&&e.req.removeListener("finish",l),e.removeListener("end",g),e.removeListener("close",g),e.removeListener("finish",l),e.removeListener("exit",h),e.removeListener("end",u),e.removeListener("error",p),e.removeListener("close",d)}};e.exports=o},61899:(e,t,r)=>{"use strict";const A=r(42357),n=r(28614),o=r(10278);class i extends n{constructor(e,t){super(),this.options=o.merge({},e),this.answers={...t}}register(e,t){if(o.isObject(e)){for(let t of Object.keys(e))this.register(t,e[t]);return this}A.equal(typeof t,"function","expected a function");let r=e.toLowerCase();return t.prototype instanceof this.Prompt?this.prompts[r]=t:this.prompts[r]=t(this.Prompt,this),this}async prompt(e=[]){for(let t of[].concat(e))try{"function"==typeof t&&(t=await t.call(this)),await this.ask(o.merge({},this.options,t))}catch(e){return Promise.reject(e)}return this.answers}async ask(e){"function"==typeof e&&(e=await e.call(this));let t=o.merge({},this.options,e),{type:r,name:n}=e,{set:i,get:s}=o;if("function"==typeof r&&(r=await r.call(this,e,this.answers)),!r)return this.answers[n];A(this.prompts[r],`Prompt "${r}" is not registered`);let a=new this.prompts[r](t),c=s(this.answers,n);a.state.answers=this.answers,a.enquirer=this,n&&a.on("submit",e=>{this.emit("answer",n,e,a),i(this.answers,n,e)});let g=a.emit.bind(a);return a.emit=(...e)=>(this.emit.call(this,...e),g(...e)),this.emit("prompt",a,this),t.autofill&&null!=c?(a.value=a.input=c,"show"===t.autofill&&await a.submit()):c=a.value=await a.run(),c}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||r(58386)}static get prompts(){return r(53609)}static get types(){return r(13235)}static get prompt(){const e=(t,...r)=>{let A=new this(...r),n=A.emit.bind(A);return A.emit=(...t)=>(e.emit(...t),n(...t)),A.prompt(t)};return o.mixinEmitter(e,new n),e}}o.mixinEmitter(i,new n);const s=i.prompts;for(let e of Object.keys(s)){let t=e.toLowerCase(),r=t=>new s[e](t).run();i.prompt[t]=r,i[t]=r,i[e]||Reflect.defineProperty(i,e,{get:()=>s[e]})}const a=e=>{o.defineExport(i,e,()=>i.types[e])};a("ArrayPrompt"),a("AuthPrompt"),a("BooleanPrompt"),a("NumberPrompt"),a("StringPrompt"),e.exports=i},72380:(e,t,r)=>{"use strict";const A="Apple_Terminal"===process.env.TERM_PROGRAM,n=r(97991),o=r(10278),i=e.exports=t,s="[";let a=!1;const c=i.code={bell:"",beep:"",beginning:"",down:"",esc:s,getPosition:"",hide:"[?25l",line:"",lineEnd:"",lineStart:"",restorePosition:s+(A?"8":"u"),savePosition:s+(A?"7":"s"),screen:"",show:"[?25h",up:""},g=i.cursor={get hidden(){return a},hide:()=>(a=!0,c.hide),show:()=>(a=!1,c.show),forward:(e=1)=>`[${e}C`,backward:(e=1)=>`[${e}D`,nextLine:(e=1)=>"".repeat(e),prevLine:(e=1)=>"".repeat(e),up:(e=1)=>e?`[${e}A`:"",down:(e=1)=>e?`[${e}B`:"",right:(e=1)=>e?`[${e}C`:"",left:(e=1)=>e?`[${e}D`:"",to:(e,t)=>t?`[${t+1};${e+1}H`:`[${e+1}G`,move(e=0,t=0){let r="";return r+=e<0?g.left(-e):e>0?g.right(e):"",r+=t<0?g.up(-t):t>0?g.down(t):"",r},restore(e={}){let{after:t,cursor:r,initial:A,input:n,prompt:s,size:a,value:c}=e;if(A=o.isPrimitive(A)?String(A):"",n=o.isPrimitive(n)?String(n):"",c=o.isPrimitive(c)?String(c):"",a){let e=i.cursor.up(a)+i.cursor.to(s.length),t=n.length-r;return t>0&&(e+=i.cursor.left(t)),e}if(c||t){let e=!n&&A?-A.length:-n.length+r;return t&&(e-=t.length),""===n&&A&&!s.includes(A)&&(e+=A.length),i.cursor.move(e)}}},l=i.erase={screen:c.screen,up:c.up,down:c.down,line:c.line,lineEnd:c.lineEnd,lineStart:c.lineStart,lines(e){let t="";for(let r=0;r{if(!t)return l.line+g.to(0);let r=e.split(/\r?\n/),A=0;for(let e of r)A+=1+Math.floor(Math.max((o=e,[...n.unstyle(o)].length-1),0)/t);var o;return(l.line+g.prevLine()).repeat(A-1)+l.line+g.to(0)}},62475:(e,t)=>{"use strict";t.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"},t.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"},t.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"},t.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"},t.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}},64083:e=>{"use strict";const t=e=>(e=>e.filter((t,r)=>e.lastIndexOf(t)===r))(e).filter(Boolean);e.exports=(e,r={},A="")=>{let n,o,{past:i=[],present:s=""}=r;switch(e){case"prev":case"undo":return n=i.slice(0,i.length-1),o=i[i.length-1]||"",{past:t([A,...n]),present:o};case"next":case"redo":return n=i.slice(1),o=i[0]||"",{past:t([...n,A]),present:o};case"save":return{past:t([...i,A]),present:""};case"remove":return o=t(i.filter(e=>e!==A)),s="",o.length&&(s=o.pop()),{past:o,present:s};default:throw new Error(`Invalid action: "${e}"`)}}},84368:(e,t,r)=>{"use strict";const A=r(97991);class n{constructor(e){this.name=e.key,this.field=e.field||{},this.value=((e="")=>"string"==typeof e?e.replace(/^['"]|['"]$/g,""):"")(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}}function o(e,t,r,A){return(r,n,o,i)=>"function"==typeof o.field[e]?o.field[e].call(t,r,n,o,i):[A,r].find(e=>t.isValue(e))}e.exports=async e=>{let t=e.options,r=new Set(!0===t.required?[]:t.required||[]),i={...t.values,...t.initial},{tabstops:s,items:a,keys:c}=await(async(e={},t={},r=(e=>e))=>{let A=new Set,o=e.fields||[],i=e.template,s=[],a=[],c=[],g=1;"function"==typeof i&&(i=await i());let l=-1,u=()=>i[++l],h=()=>i[l+1],p=e=>{e.line=g,s.push(e)};for(p({type:"bos",value:""});le.name===s.key);s.field=o.find(e=>e.name===s.key),g||(g=new n(s),a.push(g)),g.lines.push(s.line-1);continue}let i=s[s.length-1];"text"===i.type&&i.line===g?i.value+=e:p({type:"text",value:e})}return p({type:"eos",value:""}),{input:i,tabstops:s,unique:A,keys:c,items:a}})(t,i),g=o("result",e,t),l=o("format",e,t),u=o("validate",e,t,!0),h=e.isValue.bind(e);return async(n={},o=!1)=>{let i=0;n.required=r,n.items=a,n.keys=c,n.output="";let p=async(e,t,r,A)=>{let n=await u(e,t,r,A);return!1===n?"Invalid field "+r.name:n};for(let r of s){let s=r.value,c=r.key;if("template"===r.type){if("template"===r.type){let u=a.find(e=>e.name===c);!0===t.required&&n.required.add(u.name);let d=[u.input,n.values[u.value],u.value,s].find(h),C=(u.field||{}).message||r.inner;if(o){let e=await p(n.values[c],n,u,i);if(e&&"string"==typeof e||!1===e){n.invalid.set(c,e);continue}n.invalid.delete(c);let t=await g(n.values[c],n,u,i);n.output+=A.unstyle(t);continue}u.placeholder=!1;let f=s;s=await l(s,n,u,i),d!==s?(n.values[c]=d,s=e.styles.typing(d),n.missing.delete(C)):(n.values[c]=void 0,d=`<${C}>`,s=e.styles.primary(d),u.placeholder=!0,n.required.has(c)&&n.missing.add(C)),n.missing.has(C)&&n.validating&&(s=e.styles.warning(d)),n.invalid.has(c)&&n.validating&&(s=e.styles.danger(d)),i===n.index&&(s=f!==s?e.styles.underline(s):e.styles.heading(A.unstyle(s))),i++}s&&(n.output+=s)}else s&&(n.output+=s)}let d=n.output.split("\n").map(e=>" "+e),C=a.length,f=0;for(let t of a)n.invalid.has(t.name)&&t.lines.forEach(e=>{" "===d[e][0]&&(d[e]=n.styles.danger(n.symbols.bullet)+d[e].slice(1))}),e.isValue(n.values[t.name])&&f++;return n.completed=(f/C*100).toFixed(0),n.output=d.join("\n"),n.output}}},30650:(e,t,r)=>{"use strict";const A=r(51058),n=r(62475),o=/^(?:\x1b)([a-zA-Z0-9])$/,i=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,s={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};const a=(e="",t={})=>{let r,A={name:t.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:e,raw:e,...t};if(Buffer.isBuffer(e)?e[0]>127&&void 0===e[1]?(e[0]-=128,e=""+String(e)):e=String(e):void 0!==e&&"string"!=typeof e?e=String(e):e||(e=A.sequence||""),A.sequence=A.sequence||e||A.name,"\r"===e)A.raw=void 0,A.name="return";else if("\n"===e)A.name="enter";else if("\t"===e)A.name="tab";else if("\b"===e||""===e||""===e||"\b"===e)A.name="backspace",A.meta=""===e.charAt(0);else if(""===e||""===e)A.name="escape",A.meta=2===e.length;else if(" "===e||" "===e)A.name="space",A.meta=2===e.length;else if(e<="")A.name=String.fromCharCode(e.charCodeAt(0)+"a".charCodeAt(0)-1),A.ctrl=!0;else if(1===e.length&&e>="0"&&e<="9")A.name="number";else if(1===e.length&&e>="a"&&e<="z")A.name=e;else if(1===e.length&&e>="A"&&e<="Z")A.name=e.toLowerCase(),A.shift=!0;else if(r=o.exec(e))A.meta=!0,A.shift=/^[A-Z]$/.test(r[1]);else if(r=i.exec(e)){let t=[...e];""===t[0]&&""===t[1]&&(A.option=!0);let n=[r[1],r[2],r[4],r[6]].filter(Boolean).join(""),o=(r[3]||r[5]||1)-1;A.ctrl=!!(4&o),A.meta=!!(10&o),A.shift=!!(1&o),A.code=n,A.name=s[n],A.shift=function(e){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(e)}(n)||A.shift,A.ctrl=function(e){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(e)}(n)||A.ctrl}return A};a.listen=(e={},t)=>{let{stdin:r}=e;if(!r||r!==process.stdin&&!r.isTTY)throw new Error("Invalid stream passed");let n=A.createInterface({terminal:!0,input:r});A.emitKeypressEvents(r,n);let o=(e,r)=>t(e,a(e,r),n),i=r.isRaw;r.isTTY&&r.setRawMode(!0),r.on("keypress",o),n.resume();return()=>{r.isTTY&&r.setRawMode(i),r.removeListener("keypress",o),n.pause(),n.close()}},a.action=(e,t,r)=>{let A={...n,...r};return t.ctrl?(t.action=A.ctrl[t.name],t):t.option&&A.option?(t.action=A.option[t.name],t):t.shift?(t.action=A.shift[t.name],t):(t.action=A.keys[t.name],t)},e.exports=a},96496:(e,t,r)=>{"use strict";const A=r(10278);e.exports=(e,t={})=>{e.cursorHide();let{input:r="",initial:n="",pos:o,showCursor:i=!0,color:s}=t,a=s||e.styles.placeholder,c=A.inverse(e.styles.primary),g=t=>c(e.styles.black(t)),l=r,u=g(" ");if(e.blink&&!0===e.blink.off&&(g=e=>e,u=""),i&&0===o&&""===n&&""===r)return g(" ");if(i&&0===o&&(r===n||""===r))return g(n[0])+a(n.slice(1));n=A.isPrimitive(n)?""+n:"",r=A.isPrimitive(r)?""+r:"";let h=n&&n.startsWith(r)&&n!==r,p=h?g(n[r.length]):u;if(o!==r.length&&!0===i&&(l=r.slice(0,o)+g(r[o])+r.slice(o+1),p=""),!1===i&&(p=""),h){let t=e.styles.unstyle(l+p);return l+p+a(n.slice(t.length))}return l+p}},58386:(e,t,r)=>{"use strict";const A=r(28614),n=r(97991),o=r(30650),i=r(47159),s=r(61807),a=r(26205),c=r(10278),g=r(72380);class l extends A{constructor(e={}){super(),this.name=e.name,this.type=e.type,this.options=e,a(this),i(this),this.state=new s(this),this.initial=[e.initial,e.default].find(e=>null!=e),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=function(e){"number"==typeof e&&(e=[e,e,e,e]);let t=[].concat(e||[]),r=e=>e%2==0?"\n":" ",A=[];for(let e=0;e<4;e++){let n=r(e);t[e]?A.push(n.repeat(t[e])):A.push("")}return A}(this.options.margin),this.setMaxListeners(0),function(e){let t=t=>void 0===e[t]||"function"==typeof e[t],r=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],A=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let n of Object.keys(e.options)){if(r.includes(n))continue;if(/^on[A-Z]/.test(n))continue;let o=e.options[n];"function"==typeof o&&t(n)?A.includes(n)||(e[n]=o.bind(e)):"function"!=typeof e[n]&&(e[n]=o)}}(this)}async keypress(e,t={}){this.keypressed=!0;let r=o.action(e,o(e,t),this.options.actions);this.state.keypress=r,this.emit("keypress",e,r),this.emit("state",this.state.clone());let A=this.options[r.action]||this[r.action]||this.dispatch;if("function"==typeof A)return await A.call(this,e,r);this.alert()}alert(){delete this.state.alert,!1===this.options.show?this.emit("alert"):this.stdout.write(g.code.beep)}cursorHide(){this.stdout.write(g.cursor.hide()),c.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(g.cursor.show())}write(e){e&&(this.stdout&&!1!==this.state.show&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let t=this.state.buffer;this.state.buffer="",(t||e)&&!1!==this.options.show&&this.stdout.write(g.cursor.down(e)+g.clear(t,this.width))}restore(){if(this.state.closed||!1===this.options.show)return;let{prompt:e,after:t,rest:r}=this.sections(),{cursor:A,initial:n="",input:o="",value:i=""}=this,s={after:t,cursor:A,initial:n,input:o,prompt:e,size:this.state.size=r.length,value:i},a=g.cursor.restore(s);a&&this.stdout.write(a)}sections(){let{buffer:e,input:t,prompt:r}=this.state;r=n.unstyle(r);let A=n.unstyle(e),o=A.indexOf(r),i=A.slice(0,o),s=A.slice(o).split("\n"),a=s[0],c=s[s.length-1],g=(r+(t?" "+t:"")).length,l=ge.call(this,this.value),this.result=()=>r.call(this,this.value),"function"==typeof t.initial&&(this.initial=await t.initial.call(this,this)),"function"==typeof t.onRun&&await t.onRun.call(this,this),"function"==typeof t.onSubmit){let e=t.onSubmit.bind(this),r=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await e(this.name,this.value,this),r())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,t)=>{if(this.once("submit",e),this.once("cancel",t),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,t,r){let{options:A,state:n,symbols:o,timers:i}=this,s=i&&i[e];n.timer=s;let a=A[e]||n[e]||o[e],c=t&&null!=t[e]?t[e]:await a;if(""===c)return c;let g=await this.resolve(c,n,t,r);return!g&&t&&t[e]?this.resolve(a,n,t,r):g}async prefix(){let e=await this.element("prefix")||this.symbols,t=this.timers&&this.timers.prefix,r=this.state;if(r.timer=t,c.isObject(e)&&(e=e[r.status]||e.pending),!c.hasColor(e)){return(this.styles[r.status]||this.styles.pending)(e)}return e}async message(){let e=await this.element("message");return c.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,t=this.timers&&this.timers.separator,r=this.state;r.timer=t;let A=e[r.status]||e.pending||r.separator,n=await this.resolve(A,r);return c.isObject(n)&&(n=n[r.status]||n.pending),c.hasColor(n)?n:this.styles.muted(n)}async pointer(e,t){let r=await this.element("pointer",e,t);if("string"==typeof r&&c.hasColor(r))return r;if(r){let e=this.styles,A=this.index===t,n=A?e.primary:e=>e,o=await this.resolve(r[A?"on":"off"]||r,this.state),i=c.hasColor(o)?o:n(o);return A?i:" ".repeat(o.length)}}async indicator(e,t){let r=await this.element("indicator",e,t);if("string"==typeof r&&c.hasColor(r))return r;if(r){let t=this.styles,A=!0===e.enabled,n=A?t.success:t.dark,o=r[A?"on":"off"]||r;return c.hasColor(o)?o:n(o)}return""}body(){return null}footer(){if("pending"===this.state.status)return this.element("footer")}header(){if("pending"===this.state.status)return this.element("header")}async hint(){if("pending"===this.state.status&&!this.isValue(this.state.input)){let e=await this.element("hint");return c.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?"":e||this.state.error}format(e){return e}result(e){return e}validate(e){return!0!==this.options.required||this.isValue(e)}isValue(e){return null!=e&&""!==e}resolve(e,...t){return c.resolve(this,e,...t)}get base(){return l.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||c.height(this.stdout,25)}get width(){return this.options.columns||c.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:t}=this.state,r=[t,e].find(this.isValue.bind(this));return this.isValue(r)?r:this.initial}static get prompt(){return e=>new this(e).run()}}e.exports=l},63310:(e,t,r)=>{"use strict";const A=r(31557);e.exports=class extends A{constructor(e){super(e),this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:t,input:r}=this.state;return this.input=r.slice(0,t)+e+r.slice(t),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:t}=this.state;return t?(this.input=t.slice(0,e-1)+t.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:t}=this.state;return void 0===t[e]?this.alert():(this.input=(""+t).slice(0,e)+(""+t).slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,t=this.state._choices){if("function"==typeof this.options.suggest)return this.options.suggest.call(this,e,t);let r=e.toLowerCase();return t.filter(e=>e.message.toLowerCase().includes(r))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if("pending"!==this.state.status)return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,t=((e,t)=>{let r=e.toLowerCase();return e=>{let A=e.toLowerCase().indexOf(r),n=t(e.slice(A,A+r.length));return A>=0?e.slice(0,A)+n+e.slice(A+r.length):e}})(this.input,e),r=this.choices;this.choices=r.map(e=>({...e,message:t(e.message)})),await super.render(),this.choices=r}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}}},52810:(e,t,r)=>{"use strict";const A=r(46614);function n(e,t){return e.username===this.options.username&&e.password===this.options.password}const o=(e=n)=>{const t=[{name:"username",message:"username"},{name:"password",message:"password",format(e){if(this.options.showPassword)return e;return(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length))}}];class r extends(A.create(e)){constructor(e){super({...e,choices:t})}static create(e){return o(e)}}return r};e.exports=o()},65742:(e,t,r)=>{"use strict";const A=r(82710);e.exports=class extends A{constructor(e){super(e),this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}}},24570:(e,t,r)=>{"use strict";const A=r(31557),n=r(71447).prototype;e.exports=class extends A{constructor(e){super({...e,multiple:!0}),this.align=[this.options.align,"left"].find(e=>null!=e),this.emptyError="",this.values={}}dispatch(e,t){let r=this.focused,A=r.parent||{};return r.editable||A.editable||"a"!==e&&"i"!==e?n.dispatch.call(this,e,t):super[e]()}append(e,t){return n.append.call(this,e,t)}delete(e,t){return n.delete.call(this,e,t)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?n.next.call(this):super.next()}prev(){return this.focused.editable?n.prev.call(this):super.prev()}async indicator(e,t){let r=e.indicator||"",A=e.editable?r:super.indicator(e,t);return await this.resolve(A,this.state,e,t)||""}indent(e){return"heading"===e.role?"":e.editable?" ":" "}async renderChoice(e,t){return e.indent="",e.editable?n.renderChoice.call(this,e,t):super.renderChoice(e,t)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let t of this.choices){if("function"!=typeof t.validate)continue;if("heading"===t.role)continue;let r=t.parent?this.value[t.parent.name]:this.value;if(t.editable?r=t.value===t.name?t.initial||"":t.value:this.isDisabled(t)||(r=!0===t.enabled),e=await t.validate(r,this.state),!0!==e)break}return!0!==e&&(this.state.error="string"==typeof e?e:"Invalid Input"),e}submit(){if(!0===this.focused.newChoice)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let t=e.parent?this.value[e.parent.name]:this.value;"heading"!==e.role?e.editable?t[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(t[e.name]=!0===e.enabled):this.value[e.name]={}}return this.base.submit.call(this)}}},71447:(e,t,r)=>{"use strict";const A=r(97991),n=r(31557),o=r(96496);e.exports=class extends n{constructor(e){super({...e,multiple:!0}),this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(e=>null!=e),this.emptyError="",this.values={}}async reset(e){return await super.reset(),!0===e&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(e=>e.reset&&e.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let t=this.focused;if(!t)return this.alert();let{cursor:r,input:A}=t;return t.value=t.input=A.slice(0,r)+e+A.slice(r),t.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:t,input:r}=e;return e.value=e.input=r.slice(0,t-1)+r.slice(t),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:t,input:r}=e;if(void 0===r[t])return this.alert();let A=(""+r).slice(0,t)+(""+r).slice(t+1);return e.value=e.input=A,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,t){return this.dispatch(e,t)}number(e,t){return this.dispatch(e,t)}next(){let e=this.focused;if(!e)return this.alert();let{initial:t,input:r}=e;return t&&t.startsWith(r)&&r!==t?(e.value=e.input=t,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?0===e.cursor?super.prev():(e.value=e.input="",e.cursor=0,this.render()):this.alert()}separator(){return""}format(e){return this.state.submitted?"":super.format(e)}pointer(){return""}indicator(e){return e.input?"⦿":"⊙"}async choiceSeparator(e,t){let r=await this.resolve(e.separator,this.state,e,t)||":";return r?" "+this.styles.disabled(r):""}async renderChoice(e,t){await this.onChoice(e,t);let{state:r,styles:n}=this,{cursor:i,initial:s="",name:a,hint:c,input:g=""}=e,{muted:l,submitted:u,primary:h,danger:p}=n,d=c,C=this.index===t,f=e.validate||(()=>!0),I=await this.choiceSeparator(e,t),E=e.message;"right"===this.align&&(E=E.padStart(this.longest+1," ")),"left"===this.align&&(E=E.padEnd(this.longest+1," "));let B=this.values[a]=g||s,y=g?"success":"dark";!0!==await f.call(e,B,this.state)&&(y="danger");let m=(0,n[y])(await this.indicator(e,t))+(e.pad||""),w=this.indent(e),Q=()=>[w,m,E+I,g,d].filter(Boolean).join(" ");if(r.submitted)return E=A.unstyle(E),g=u(g),d="",Q();if(e.format)g=await e.format.call(this,g,e,t);else{let e=this.styles.muted;g=o(this,{input:g,initial:s,pos:i,showCursor:C,color:e})}return this.isValue(g)||(g=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[a]=await e.result.call(this,B,e,t)),C&&(E=h(E)),e.error?g+=(g?" ":"")+p(e.error.trim()):e.hint&&(g+=(g?" ":"")+l(e.hint.trim())),Q()}async submit(){return this.value=this.values,super.base.submit.call(this)}}},53609:(e,t,r)=>{"use strict";const A=r(10278),n=(e,r)=>{A.defineExport(t,e,r),A.defineExport(t,e.toLowerCase(),r)};n("AutoComplete",()=>r(63310)),n("BasicAuth",()=>r(52810)),n("Confirm",()=>r(65742)),n("Editable",()=>r(24570)),n("Form",()=>r(71447)),n("Input",()=>r(12372)),n("Invisible",()=>r(32684)),n("List",()=>r(40876)),n("MultiSelect",()=>r(42293)),n("Numeral",()=>r(42126)),n("Password",()=>r(84697)),n("Scale",()=>r(99580)),n("Select",()=>r(31557)),n("Snippet",()=>r(98094)),n("Sort",()=>r(60042)),n("Survey",()=>r(25223)),n("Text",()=>r(97298)),n("Toggle",()=>r(41817)),n("Quiz",()=>r(88677))},12372:(e,t,r)=>{"use strict";const A=r(45853),n=r(64083);e.exports=class extends A{constructor(e){super(e);let t=this.options.history;if(t&&t.store){let e=t.values||this.initial;this.autosave=!!t.autosave,this.store=t.store,this.data=this.store.get("values")||{past:[],present:e},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=n(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){this.store&&(this.data=n("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&!0===this.autosave&&this.save(),super.submit()}}},32684:(e,t,r)=>{"use strict";const A=r(45853);e.exports=class extends A{format(){return""}}},40876:(e,t,r)=>{"use strict";const A=r(45853);e.exports=class extends A{constructor(e={}){super(e),this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:e=>e;return this.list.map(e).join(", ")}async submit(e){let t=this.state.error||await this.validate(this.list,this.state);return!0!==t?(this.state.error=t,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}}},42293:(e,t,r)=>{"use strict";const A=r(31557);e.exports=class extends A{constructor(e){super({...e,multiple:!0})}}},42126:(e,t,r)=>{e.exports=r(64987)},84697:(e,t,r)=>{"use strict";const A=r(45853);e.exports=class extends A{constructor(e){super(e),this.cursorShow()}format(e=this.input){if(!this.keypressed)return"";return(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length))}}},88677:(e,t,r)=>{"use strict";const A=r(31557);e.exports=class extends A{constructor(e){if(super(e),"number"!=typeof this.options.correctChoice||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,t){let r=await super.toChoices(e,t);if(r.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>r.length)throw new Error("Please specify the index of the correct answer from the list of choices");return r}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}}},99580:(e,t,r)=>{"use strict";const A=r(97991),n=r(14723),o=r(10278);e.exports=class extends n{constructor(e={}){super(e),this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||"\n ";let t=e.startNumber||1;"number"==typeof this.scale&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((e,r)=>({name:r+t})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(!0===this.tableized)return;this.tableized=!0;let e=0;for(let t of this.choices){e=Math.max(e,t.message.length),t.scaleIndex=t.initial||2,t.scale=[];for(let e=0;e=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return""}format(){if(this.state.submitted){return this.choices.map(e=>this.styles.info(e.index)).join(", ")}return""}pointer(){return""}renderScaleKey(){if(!1===this.scaleKey)return"";if(this.state.submitted)return"";return["",...this.scale.map(e=>` ${e.name} - ${e.message}`)].map(e=>this.styles.muted(e)).join("\n")}renderScaleHeading(e){let t=this.scale.map(e=>e.name);"function"==typeof this.options.renderScaleHeading&&(t=this.options.renderScaleHeading.call(this,e));let r=this.scaleLength-t.join("").length,A=Math.round(r/(t.length-1)),n=t.map(e=>this.styles.strong(e)).join(" ".repeat(A)),o=" ".repeat(this.widths[0]);return this.margin[3]+o+this.margin[1]+n}scaleIndicator(e,t,r){if("function"==typeof this.options.scaleIndicator)return this.options.scaleIndicator.call(this,e,t,r);let A=e.scaleIndex===t.index;return t.disabled?this.styles.hint(this.symbols.radio.disabled):A?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,t){let r=e.scale.map(r=>this.scaleIndicator(e,r,t)),A="Hyper"===this.term?"":" ";return r.join(A+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,t){await this.onChoice(e,t);let r=this.index===t,n=await this.pointer(e,t),i=await e.hint;i&&!o.hasColor(i)&&(i=this.styles.muted(i));let s=e=>this.margin[3]+e.replace(/\s+$/,"").padEnd(this.widths[0]," "),a=this.newline,c=this.indent(e),g=await this.resolve(e.message,this.state,e,t),l=await this.renderScale(e,t),u=this.margin[1]+this.margin[3];this.scaleLength=A.unstyle(l).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-u.length);let h=o.wordWrap(g,{width:this.widths[0],newline:a}).split("\n").map(e=>s(e)+this.margin[1]);return r&&(l=this.styles.info(l),h=h.map(e=>this.styles.info(e))),h[0]+=l,this.linebreak&&h.push(""),[c+n,h.join("\n")].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(e,t)=>await this.renderChoice(e,t)),t=await Promise.all(e),r=await this.renderScaleHeading();return this.margin[0]+[r,...t.map(e=>e.join(" "))].join("\n")}async render(){let{submitted:e,size:t}=this.state,r=await this.prefix(),A=await this.separator(),n=await this.message(),o="";!1!==this.options.promptLine&&(o=[r,n,A,""].join(" "),this.state.prompt=o);let i=await this.header(),s=await this.format(),a=await this.renderScaleKey(),c=await this.error()||await this.hint(),g=await this.renderChoices(),l=await this.footer(),u=this.emptyError;s&&(o+=s),c&&!o.includes(c)&&(o+=" "+c),e&&!s&&!g.trim()&&this.multiple&&null!=u&&(o+=this.styles.danger(u)),this.clear(t),this.write([i,o,a,g,l].filter(Boolean).join("\n")),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}}},31557:(e,t,r)=>{"use strict";const A=r(14723),n=r(10278);e.exports=class extends A{constructor(e){super(e),this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,t){if(this.multiple)return this[t.name]?await this[t.name](e,t):await super.dispatch(e,t);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,t){return!this.multiple||this.options.pointer?super.pointer(e,t):""}indicator(e,t){return this.multiple?super.indicator(e,t):""}choiceMessage(e,t){let r=this.resolve(e.message,this.state,e,t);return"heading"!==e.role||n.hasColor(r)||(r=this.styles.strong(r)),this.resolve(r,this.state,e,t)}choiceSeparator(){return":"}async renderChoice(e,t){await this.onChoice(e,t);let r=this.index===t,A=await this.pointer(e,t),o=await this.indicator(e,t)+(e.pad||""),i=await this.resolve(e.hint,this.state,e,t);i&&!n.hasColor(i)&&(i=this.styles.muted(i));let s=this.indent(e),a=await this.choiceMessage(e,t),c=()=>[this.margin[3],s+A+o,a,this.margin[1],i].filter(Boolean).join(" ");return"heading"===e.role?c():e.disabled?(n.hasColor(a)||(a=this.styles.disabled(a)),c()):(r&&(a=this.styles.em(a)),c())}async renderChoices(){if("choices"===this.state.loading)return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(e,t)=>await this.renderChoice(e,t)),t=await Promise.all(e);t.length||t.push(this.styles.danger("No matching choices"));let r,A=this.margin[0]+t.join("\n");return this.options.choicesHeader&&(r=await this.resolve(this.options.choicesHeader,this.state)),[r,A].filter(Boolean).join("\n")}format(){return!this.state.submitted||this.state.cancelled?"":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(", "):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:t}=this.state,r="",A=await this.header(),n=await this.prefix(),o=await this.separator(),i=await this.message();!1!==this.options.promptLine&&(r=[n,i,o,""].join(" "),this.state.prompt=r);let s=await this.format(),a=await this.error()||await this.hint(),c=await this.renderChoices(),g=await this.footer();s&&(r+=s),a&&!r.includes(a)&&(r+=" "+a),e&&!s&&!c.trim()&&this.multiple&&null!=this.emptyError&&(r+=this.styles.danger(this.emptyError)),this.clear(t),this.write([A,r,c,g].filter(Boolean).join("\n")),this.write(this.margin[2]),this.restore()}}},98094:(e,t,r)=>{"use strict";const A=r(97991),n=r(84368),o=r(58386);e.exports=class extends o{constructor(e){super(e),this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await n(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},!0!==e&&(await this.initialize(),await this.render())}moveCursor(e){let t=this.getItem();this.cursor+=e,t.cursor+=e}dispatch(e,t){t.code||t.ctrl||null==e||!this.getItem()?this.alert():this.append(e,t)}append(e,t){let r=this.getItem(),A=r.input.slice(0,this.cursor),n=r.input.slice(this.cursor);this.input=r.input=`${A}${e}${n}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let t=e.input.slice(this.cursor),r=e.input.slice(0,this.cursor-1);this.input=e.input=`${r}${t}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let t=this.state.completed<100?this.styles.warning:this.styles.success;return!0===this.state.submitted&&100!==this.state.completed&&(t=this.styles.danger),t(this.state.completed+"% completed")}async render(){let{index:e,keys:t=[],submitted:r,size:A}=this.state,n=[this.options.newline,"\n"].find(e=>null!=e),o=await this.prefix(),i=await this.separator(),s=[o,await this.message(),i].filter(Boolean).join(" ");this.state.prompt=s;let a=await this.header(),c=await this.error()||"",g=await this.hint()||"",l=r?"":await this.interpolate(this.state),u=this.state.key=t[e]||"",h=await this.format(u),p=await this.footer();h&&(s+=" "+h),g&&!h&&0===this.state.completed&&(s+=" "+g),this.clear(A);let d=[a,s,l,p,c.trim()];this.write(d.filter(Boolean).join(n)),this.restore()}getItem(e){let{items:t,keys:r,index:A}=this.state,n=t.find(e=>e.name===r[A]);return n&&null!=n.input&&(this.input=n.input,this.cursor=n.cursor),n}async submit(){"function"!=typeof this.interpolate&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:t,output:r,values:n}=this.state;if(e.size){let t="";for(let[r,A]of e)t+=`Invalid ${r}: ${A}\n`;return this.state.error=t,super.submit()}if(t.size)return this.state.error="Required: "+[...t.keys()].join(", "),super.submit();let o=A.unstyle(r).split("\n").map(e=>e.slice(1)).join("\n");return this.value={values:n,result:o},super.submit()}}},60042:(e,t,r)=>{"use strict";const A="(Use + to sort)",n=r(31557);e.exports=class extends n{constructor(e){super({...e,reorder:!1,sort:!0,multiple:!0}),this.state.hint=[this.options.hint,A].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,t){let r=await super.renderChoice(e,t),A=this.symbols.identicalTo+" ",n=this.index===t&&this.sorting?this.styles.muted(A):" ";return!1===this.options.drag&&(n=""),!0===this.options.numbered?n+(t+1+" - ")+r:n+r}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}}},25223:(e,t,r)=>{"use strict";const A=r(14723);function n(e,t={}){if(Array.isArray(t.scale))return t.scale.map(e=>({...e}));let r=[];for(let t=1;tthis.styles.muted(e)),this.state.header=e.join("\n ")}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let t=await super.toChoices(...e);for(let e of t)e.scale=n(5,this.options),e.scaleIdx=2;return t}dispatch(){this.alert()}space(){let e=this.focused,t=e.scale[e.scaleIdx],r=t.selected;return e.scale.forEach(e=>e.selected=!1),t.selected=!r,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return" "}async renderChoice(e,t){await this.onChoice(e,t);let r=this.index===t,A="Hyper"===this.term,n=A?9:8,o=A?"":" ",i=this.symbols.line.repeat(n),s=" ".repeat(n+(A?0:1)),a=e=>(e?this.styles.success("â—‰"):"â—¯")+o,c=t+1+".",g=r?this.styles.heading:this.styles.noop,l=await this.resolve(e.message,this.state,e,t),u=this.indent(e),h=u+e.scale.map((t,r)=>a(r===e.scaleIdx)).join(i),p=u+e.scale.map((t,r)=>(t=>t===e.scaleIdx?g(t):t)(r)).join(s);return r&&(h=this.styles.cyan(h),p=this.styles.cyan(p)),[[c,l].filter(Boolean).join(" "),h,p," "].filter(Boolean).join("\n")}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(e,t)=>await this.renderChoice(e,t)),t=await Promise.all(e);return t.length||t.push(this.styles.danger("No matching choices")),t.join("\n")}format(){if(this.state.submitted){return this.choices.map(e=>this.styles.info(e.scaleIdx)).join(", ")}return""}async render(){let{submitted:e,size:t}=this.state,r=await this.prefix(),A=await this.separator(),n=[r,await this.message(),A].filter(Boolean).join(" ");this.state.prompt=n;let o=await this.header(),i=await this.format(),s=await this.error()||await this.hint(),a=await this.renderChoices(),c=await this.footer();!i&&s||(n+=" "+i),s&&!n.includes(s)&&(n+=" "+s),e&&!i&&!a&&this.multiple&&"form"!==this.type&&(n+=this.styles.danger(this.emptyError)),this.clear(t),this.write([n,o,a,c].filter(Boolean).join("\n")),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}}},97298:(e,t,r)=>{e.exports=r(12372)},41817:(e,t,r)=>{"use strict";const A=r(82710);e.exports=class extends A{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(!0===this.value)return this.alert();this.value=!0,this.render()}disable(){if(!1===this.value)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",t){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=e=>this.styles.primary.underline(e);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,t=await this.header(),r=await this.prefix(),A=await this.separator(),n=await this.message(),o=await this.format(),i=await this.error()||await this.hint(),s=await this.footer(),a=[r,n,A,o].join(" ");this.state.prompt=a,i&&!a.includes(i)&&(a+=" "+i),this.clear(e),this.write([t,a,s].filter(Boolean).join("\n")),this.write(this.margin[2]),this.restore()}}},27011:(e,t,r)=>{"use strict";const A=r(10278),n={default:(e,t)=>t,checkbox(e,t){throw new Error("checkbox role is not implemented yet")},editable(e,t){throw new Error("editable role is not implemented yet")},expandable(e,t){throw new Error("expandable role is not implemented yet")},heading:(e,t)=>(t.disabled="",t.indicator=[t.indicator," "].find(e=>null!=e),t.message=t.message||"",t),input(e,t){throw new Error("input role is not implemented yet")},option:(e,t)=>n.default(e,t),radio(e,t){throw new Error("radio role is not implemented yet")},separator:(e,t)=>(t.disabled="",t.indicator=[t.indicator," "].find(e=>null!=e),t.message=t.message||e.symbols.line.repeat(5),t),spacer:(e,t)=>t};e.exports=(e,t={})=>{let r=A.merge({},n,t.roles);return r[e]||r.default}},61807:(e,t,r)=>{"use strict";const{define:A,width:n}=r(10278);e.exports=class{constructor(e){let t=e.options;A(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=n(t.stdout||process.stdout),Object.assign(this,t),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e={...this};return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let t=this._color||e[this.status];return"function"==typeof t?t:e.pending}set loading(e){this._loading=e}get loading(){return"boolean"==typeof this._loading?this._loading:!!this.loadingChoices&&"choices"}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}}},64402:(e,t,r)=>{"use strict";const A=r(10278),n=r(97991),o={default:n.noop,noop:n.noop,set inverse(e){this._inverse=e},get inverse(){return this._inverse||A.inverse(this.primary)},set complement(e){this._complement=e},get complement(){return this._complement||A.complement(this.primary)},primary:n.cyan,success:n.green,danger:n.magenta,strong:n.bold,warning:n.yellow,muted:n.dim,disabled:n.gray,dark:n.dim.gray,underline:n.underline,set info(e){this._info=e},get info(){return this._info||this.primary},set em(e){this._em=e},get em(){return this._em||this.primary.underline},set heading(e){this._heading=e},get heading(){return this._heading||this.muted.underline},set pending(e){this._pending=e},get pending(){return this._pending||this.primary},set submitted(e){this._submitted=e},get submitted(){return this._submitted||this.success},set cancelled(e){this._cancelled=e},get cancelled(){return this._cancelled||this.danger},set typing(e){this._typing=e},get typing(){return this._typing||this.dim},set placeholder(e){this._placeholder=e},get placeholder(){return this._placeholder||this.primary.dim},set highlight(e){this._highlight=e},get highlight(){return this._highlight||this.inverse},merge:(e={})=>{e.styles&&"boolean"==typeof e.styles.enabled&&(n.enabled=e.styles.enabled),e.styles&&"boolean"==typeof e.styles.visible&&(n.visible=e.styles.visible);let t=A.merge({},o,e.styles);delete t.merge;for(let e of Object.keys(n))t.hasOwnProperty(e)||Reflect.defineProperty(t,e,{get:()=>n[e]});for(let e of Object.keys(n.styles))t.hasOwnProperty(e)||Reflect.defineProperty(t,e,{get:()=>n[e]});return t}};e.exports=o},50511:(e,t,r)=>{"use strict";const A="win32"===process.platform,n=r(97991),o=r(10278),i={...n.symbols,upDownDoubleArrow:"⇕",upDownDoubleArrow2:"â¬",upDownArrow:"↕",asterisk:"*",asterism:"â‚",bulletWhite:"â—¦",electricArrow:"âŒ",ellipsisLarge:"⋯",ellipsisSmall:"…",fullBlock:"â–ˆ",identicalTo:"≡",indicator:n.symbols.check,leftAngle:"‹",mark:"※",minus:"−",multiplication:"×",obelus:"÷",percent:"%",pilcrow:"¶",pilcrow2:"â¡",pencilUpRight:"âœ",pencilDownRight:"✎",pencilRight:"âœ",plus:"+",plusMinus:"±",pointRight:"☞",rightAngle:"›",section:"§",hexagon:{off:"⬡",on:"⬢",disabled:"⬢"},ballot:{on:"☑",off:"â˜",disabled:"☒"},stars:{on:"★",off:"☆",disabled:"☆"},folder:{on:"â–¼",off:"â–¶",disabled:"â–¶"},prefix:{pending:n.symbols.question,submitted:n.symbols.check,cancelled:n.symbols.cross},separator:{pending:n.symbols.pointerSmall,submitted:n.symbols.middot,cancelled:n.symbols.middot},radio:{off:A?"( )":"â—¯",on:A?"(*)":"â—‰",disabled:A?"(|)":"â’¾"},numbers:["⓪","â‘ ","â‘¡","â‘¢","â‘£","⑤","â‘¥","⑦","⑧","⑨","â‘©","⑪","â‘«","⑬","â‘­","â‘®","⑯","â‘°","⑱","⑲","⑳","㉑","㉒","㉓","㉔","㉕","㉖","㉗","㉘","㉙","㉚","㉛","㉜","ã‰","㉞","㉟","㊱","㊲","㊳","㊴","㊵","㊶","㊷","㊸","㊹","㊺","㊻","㊼","㊽","㊾","㊿"]};i.merge=e=>{let t=o.merge({},n.symbols,i,e.symbols);return delete t.merge,t},e.exports=i},26205:(e,t,r)=>{"use strict";const A=r(64402),n=r(50511),o=r(10278);e.exports=e=>{e.options=o.merge({},e.options.theme,e.options),e.symbols=n.merge(e.options),e.styles=A.merge(e.options)}},47159:e=>{"use strict";function t(e,t,r={}){let A=e.timers[t]={name:t,start:Date.now(),ms:0,tick:0},n=r.interval||120;A.frames=r.frames||[],A.loading=!0;let o=setInterval(()=>{A.ms=Date.now()-A.start,A.tick++,e.render()},n);return A.stop=()=>{A.loading=!1,clearInterval(o)},Reflect.defineProperty(A,"interval",{value:o}),e.once("close",()=>A.stop()),A.stop}e.exports=e=>{e.timers=e.timers||{};let r=e.options.timers;if(r)for(let A of Object.keys(r)){let n=r[A];"number"==typeof n&&(n={interval:n}),t(e,A,n)}}},14723:(e,t,r)=>{"use strict";const A=r(97991),n=r(58386),o=r(27011),i=r(10278),{reorder:s,scrollUp:a,scrollDown:c,isObject:g,swap:l}=i;function u(e,t){if(t instanceof Promise)return t;if("function"==typeof t){if(i.isAsyncFn(t))return t;t=t.call(e,e)}for(let r of t){if(Array.isArray(r.choices)){let t=r.choices.filter(t=>!e.isDisabled(t));r.enabled=t.every(e=>!0===e.enabled)}!0===e.isDisabled(r)&&delete r.enabled}return t}e.exports=class extends n{constructor(e){super(e),this.cursorHide(),this.maxSelected=e.maxSelected||1/0,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){"function"==typeof this.options.initial&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:t,autofocus:r,suggest:A}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(e=>e.enabled=!1),"function"!=typeof A&&0===this.selectable.length)throw new Error("At least one choice must be selectable");g(t)&&(t=Object.keys(t)),Array.isArray(t)?(null!=r&&(this.index=this.findIndex(r)),t.forEach(e=>this.enable(this.find(e))),await this.render()):(null!=r&&(t=r),"string"==typeof t&&(t=this.findIndex(t)),"number"==typeof t&&t>-1&&(this.index=Math.max(0,Math.min(t,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,t){this.state.loadingChoices=!0;let r=[],A=0,n=async(e,t)=>{"function"==typeof e&&(e=await e.call(this)),e instanceof Promise&&(e=await e);for(let o=0;o(this.state.loadingChoices=!1,e))}async toChoice(e,t,r){if("function"==typeof e&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),"string"==typeof e&&(e={name:e}),e.normalized)return e;e.normalized=!0;let n=e.value,s=o(e.role,this.options);if("string"!=typeof(e=s(this,e)).disabled||e.hint||(e.hint=e.disabled,e.disabled=!0),!0===e.disabled&&null==e.hint&&(e.hint="(disabled)"),null!=e.index)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=t,e.cursor=0,i.define(e,"parent",r),e.level=r?r.level+1:1,null==e.indent&&(e.indent=r?r.indent+" ":e.indent||""),e.path=r?r.path+"."+e.name:e.name,e.enabled=!(!this.multiple||this.isDisabled(e)||!e.enabled&&!this.isSelected(e)),this.isDisabled(e)||(this.longest=Math.max(this.longest,A.unstyle(e.message).length));let a={...e};return e.reset=(t=a.input,r=a.value)=>{for(let t of Object.keys(a))e[t]=a[t];e.input=t,e.value=r},null==n&&"function"==typeof e.initial&&(e.input=await e.initial.call(this,this.state,e,t)),e}async onChoice(e,t){this.emit("choice",e,t,this),"function"==typeof e.onChoice&&await e.onChoice.call(this,this.state,e,t)}async addChoice(e,t,r){let A=await this.toChoice(e,t,r);return this.choices.push(A),this.index=this.choices.length-1,this.limit=this.choices.length,A}async newItem(e,t,r){let A={name:"New choice name?",editable:!0,newChoice:!0,...e},n=await this.addChoice(A,t,r);return n.updateChoice=()=>{delete n.newChoice,n.name=n.message=n.input,n.input="",n.cursor=0},this.render()}indent(e){return null==e.indent?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,t){if(this.multiple&&this[t.name])return this[t.name]();this.alert()}focus(e,t){return"boolean"!=typeof t&&(t=e.enabled),t&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=t&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectede.enabled);return this.choices.forEach(t=>t.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(e=>!!e.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,t){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();"boolean"!=typeof t&&(t=!e.enabled),e.enabled=t,e.choices&&e.choices.forEach(e=>this.toggle(e,t));let r=e.parent;for(;r;){let e=r.choices.filter(e=>this.isDisabled(e));r.enabled=e.every(e=>!0===e.enabled),r=r.parent}return u(this,this.choices),this.emit("toggle",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let t=e=>{let t=Number(e);if(t>this.choices.length-1)return this.alert();let r=this.focused,A=this.choices.find(e=>t===e.index);if(!A.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(-1===this.visible.indexOf(A)){let e=s(this.choices),t=e.indexOf(A);if(r.index>t){let r=e.slice(t,t+this.limit),A=e.filter(e=>!r.includes(e));this.choices=r.concat(A)}else{let r=t-this.limit+1;this.choices=e.slice(r).concat(e.slice(0,r))}}return this.index=this.choices.indexOf(A),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(e=>{let r=this.choices.length,A=this.num,n=(r=!1,n)=>{clearTimeout(this.numberTimeout),r&&(n=t(A)),this.num="",e(n)};return"0"===A||1===A.length&&Number(A+"0")>r?n(!0):Number(A)>r?n(!1,this.alert()):void(this.numberTimeout=setTimeout(()=>n(!0),this.delay))})}home(){return this.choices=s(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,t=s(this.choices);return this.choices=t.slice(e).concat(t.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,t=this.visible.length,r=this.index;return!1===this.options.scroll&&0===r?this.alert():e>t&&0===r?this.scrollUp():(this.index=(r-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,t=this.visible.length,r=this.index;return!1===this.options.scroll&&r===t-1?this.alert():e>t&&r===t-1?this.scrollDown():(this.index=(r+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=a(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=c(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){return!0===this.options.sort?(this.sorting=!0,this.swap(this.index-1),await this.up(),void(this.sorting=!1)):this.scrollUp(this.index)}async shiftDown(){return!0===this.options.sort?(this.sorting=!0,this.swap(this.index+1),await this.down(),void(this.sorting=!1)):this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){l(this.choices,this.index,e)}isDisabled(e=this.focused){return!(!e||!["disabled","collapsed","hidden","completing","readonly"].some(t=>!0===e[t]))||e&&"heading"===e.role}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(e=>this.isEnabled(e));if(e.choices){let t=e.choices.filter(e=>!this.isDisabled(e));return e.enabled&&t.every(e=>this.isEnabled(e))}return e.enabled&&!this.isDisabled(e)}isChoice(e,t){return e.name===t||e.index===Number(t)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(t=>this.isChoice(e,t)):this.isChoice(e,this.initial)}map(e=[],t="value"){return[].concat(e||[]).reduce((e,r)=>(e[r]=this.find(r,t),e),{})}filter(e,t){let r="function"==typeof e?e:(t,r)=>[t.name,r].includes(e),A=(this.options.multiple?this.state._choices:this.choices).filter(r);return t?A.map(e=>e[t]):A}find(e,t){if(g(e))return t?e[t]:e;let r="function"==typeof e?e:(t,r)=>[t.name,r].includes(e),A=this.choices.find(r);return A?t?A[t]:A:void 0}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(e=>e.newChoice))return this.alert();let{reorder:t,sort:r}=this.options,A=!0===this.multiple,n=this.selected;return void 0===n?this.alert():(Array.isArray(n)&&!1!==t&&!0!==r&&(n=i.reorder(n)),this.value=A?n.map(e=>e.name):n.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let t of e)this.state._choices.some(e=>e.name===t.name)||this.state._choices.push(t);if(!this._initial&&this.options.initial){this._initial=!0;let e=this.initial;if("string"==typeof e||"number"==typeof e){let t=this.find(e);t&&(this.initial=t.index,this.focus(t,!0))}}}get choices(){return u(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:t,choices:r}=this,A=e.limit||this._limit||t.limit||r.length;return Math.min(A,this.height)}set value(e){super.value=e}get value(){return"string"!=typeof super.value&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&!0!==this.multiple&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}}},46614:(e,t,r)=>{"use strict";const A=r(71447),n=()=>{throw new Error("expected prompt to have a custom authenticate method")},o=(e=n)=>class extends A{constructor(e){super(e)}async submit(){this.value=await e.call(this,this.values,this.state),super.base.submit.call(this)}static create(e){return o(e)}};e.exports=o()},82710:(e,t,r)=>{"use strict";const A=r(58386),{isPrimitive:n,hasColor:o}=r(10278);e.exports=class extends A{constructor(e){super(e),this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:t,state:r}=this;return r.submitted?t.success(e):t.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return n(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if("pending"===this.state.status){let e=await this.element("hint");return o(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:t}=this.state,r=await this.prefix(),A=await this.separator(),n=[r,await this.message(),this.styles.muted(this.default),A].filter(Boolean).join(" ");this.state.prompt=n;let o=await this.header(),i=this.value=this.cast(e),s=await this.format(i),a=await this.error()||await this.hint(),c=await this.footer();a&&!n.includes(a)&&(s+=" "+a),n+=" "+s,this.clear(t),this.write([o,n,c].filter(Boolean).join("\n")),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}}},13235:(e,t,r)=>{e.exports={ArrayPrompt:r(14723),AuthPrompt:r(46614),BooleanPrompt:r(82710),NumberPrompt:r(64987),StringPrompt:r(45853)}},64987:(e,t,r)=>{"use strict";const A=r(45853);e.exports=class extends A{constructor(e={}){super({style:"number",...e}),this.min=this.isValue(e.min)?this.toNumber(e.min):-1/0,this.max=this.isValue(e.max)?this.toNumber(e.max):1/0,this.delay=null!=e.delay?e.delay:1e3,this.float=!1!==e.float,this.round=!0===e.round||!1===e.float,this.major=e.major||10,this.minor=e.minor||1,this.initial=null!=e.initial?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||"."===e&&this.input.includes(".")?this.alert("invalid number"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let t=e||this.minor,r=this.toNumber(this.input);return r>this.max+t?this.alert():(this.input=""+(r+t),this.render())}down(e){let t=e||this.minor,r=this.toNumber(this.input);return rthis.isValue(e));return this.value=this.toNumber(e||0),super.submit()}}},45853:(e,t,r)=>{"use strict";const A=r(58386),n=r(96496),{isPrimitive:o}=r(10278);e.exports=class extends A{constructor(e){super(e),this.initial=o(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,t={}){let r=this.state.prevKeypress;return this.state.prevKeypress=t,!0!==this.options.multiline||"return"!==t.name||r&&"return"===r.name?super.keypress(e,t):this.append("\n",t)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,t){if(!e||t.ctrl||t.code)return this.alert();this.append(e)}append(e){let{cursor:t,input:r}=this.state;this.input=(""+r).slice(0,t)+e+(""+r).slice(t),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:t}=this.state;if(e<=0)return this.alert();this.input=(""+t).slice(0,e-1)+(""+t).slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:t}=this.state;if(void 0===t[e])return this.alert();this.input=(""+t).slice(0,e)+(""+t).slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(0===e)return this.alert();let t=this.input.slice(0,e),r=this.input.slice(e),A=t.split(" ");this.state.clipboard.push(A.pop()),this.input=A.join(" "),this.cursor=this.input.length,this.input+=r,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=null!=this.initial?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let t=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||t):n(this,{input:e,initial:t,pos:this.cursor})}async render(){let e=this.state.size,t=await this.prefix(),r=await this.separator(),A=[t,await this.message(),r].filter(Boolean).join(" ");this.state.prompt=A;let n=await this.header(),o=await this.format(),i=await this.error()||await this.hint(),s=await this.footer();i&&!o.includes(i)&&(o+=" "+i),A+=" "+o,this.clear(e),this.write([n,A,s].filter(Boolean).join("\n")),this.restore()}}},10278:(e,t,r)=>{"use strict";const A=Object.prototype.toString,n=r(97991);let o=!1,i=[];const s={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};t.longest=(e,t)=>e.reduce((e,r)=>Math.max(e,t?r[t].length:r.length),0),t.hasColor=e=>!!e&&n.hasColor(e);const a=t.isObject=e=>null!==e&&"object"==typeof e&&!Array.isArray(e);t.nativeType=e=>A.call(e).slice(8,-1).toLowerCase().replace(/\s/g,""),t.isAsyncFn=e=>"asyncfunction"===t.nativeType(e),t.isPrimitive=e=>null!=e&&"object"!=typeof e&&"function"!=typeof e,t.resolve=(e,t,...r)=>"function"==typeof t?t.call(e,...r):t,t.scrollDown=(e=[])=>[...e.slice(1),e[0]],t.scrollUp=(e=[])=>[e.pop(),...e],t.reorder=(e=[])=>{let t=e.slice();return t.sort((e,t)=>e.index>t.index?1:e.index{let A=e.length,n=r===A?0:r<0?A-1:r,o=e[t];e[t]=e[n],e[n]=o},t.width=(e,t=80)=>{let r=e&&e.columns?e.columns:t;return e&&"function"==typeof e.getWindowSize&&(r=e.getWindowSize()[0]),"win32"===process.platform?r-1:r},t.height=(e,t=20)=>{let r=e&&e.rows?e.rows:t;return e&&"function"==typeof e.getWindowSize&&(r=e.getWindowSize()[1]),r},t.wordWrap=(e,t={})=>{if(!e)return e;"number"==typeof t&&(t={width:t});let{indent:r="",newline:A="\n"+r,width:n=80}=t,o=(A+r).match(/[^\S\n]/g)||[];n-=o.length;let i=`.{1,${n}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,s=e.trim(),a=new RegExp(i,"g"),c=s.match(a)||[];return c=c.map(e=>e.replace(/\n$/,"")),t.padEnd&&(c=c.map(e=>e.padEnd(n," "))),t.padStart&&(c=c.map(e=>e.padStart(n," "))),r+c.join(A)},t.unmute=e=>{let t=e.stack.find(e=>n.keys.color.includes(e));return t?n[t]:e.stack.find(e=>"bg"===e.slice(2))?n[t.slice(2)]:e=>e},t.pascal=e=>e?e[0].toUpperCase()+e.slice(1):"",t.inverse=e=>{if(!e||!e.stack)return e;let r=e.stack.find(e=>n.keys.color.includes(e));if(r){let A=n["bg"+t.pascal(r)];return A?A.black:e}let A=e.stack.find(e=>"bg"===e.slice(0,2));return A?n[A.slice(2).toLowerCase()]||e:n.none},t.complement=e=>{if(!e||!e.stack)return e;let r=e.stack.find(e=>n.keys.color.includes(e)),A=e.stack.find(e=>"bg"===e.slice(0,2));if(r&&!A)return n[s[r]||r];if(A){let r=A.slice(2).toLowerCase(),o=s[r];return o&&n["bg"+t.pascal(o)]||e}return n.none},t.meridiem=e=>{let t=e.getHours(),r=e.getMinutes(),A=t>=12?"pm":"am";return t%=12,(0===t?12:t)+":"+(r<10?"0"+r:r)+" "+A},t.set=(e={},r="",A)=>r.split(".").reduce((e,r,n,o)=>{let i=o.length-1>n?e[r]||{}:A;return!t.isObject(i)&&n{let A=null==e[t]?t.split(".").reduce((e,t)=>e&&e[t],e):e[t];return null==A?r:A},t.mixin=(e,r)=>{if(!a(e))return r;if(!a(r))return e;for(let A of Object.keys(r)){let n=Object.getOwnPropertyDescriptor(r,A);if(n.hasOwnProperty("value"))if(e.hasOwnProperty(A)&&a(n.value)){let o=Object.getOwnPropertyDescriptor(e,A);a(o.value)?e[A]=t.merge({},e[A],r[A]):Reflect.defineProperty(e,A,n)}else Reflect.defineProperty(e,A,n);else Reflect.defineProperty(e,A,n)}return e},t.merge=(...e)=>{let r={};for(let A of e)t.mixin(r,A);return r},t.mixinEmitter=(e,r)=>{let A=r.constructor.prototype;for(let n of Object.keys(A)){let o=A[n];"function"==typeof o?t.define(e,n,o.bind(r)):t.define(e,n,o)}},t.onExit=e=>{const t=(e,t)=>{o||(o=!0,i.forEach(e=>e()),!0===e&&process.exit(128+t))};0===i.length&&(process.once("SIGTERM",t.bind(null,!0,15)),process.once("SIGINT",t.bind(null,!0,2)),process.once("exit",t)),i.push(e)},t.define=(e,t,r)=>{Reflect.defineProperty(e,t,{value:r})},t.defineExport=(e,t,r)=>{let A;Reflect.defineProperty(e,t,{enumerable:!0,configurable:!0,set(e){A=e},get:()=>A?A():r()})}},19347:(e,t,r)=>{"use strict";const A=r(80598),n=r(58182),o=r(67652),i=r(81340),s=r(43754),a=r(16777);async function c(e,t){l(e);const r=g(e,n.default,t),A=await Promise.all(r);return a.array.flatten(A)}function g(e,t,r){const n=[].concat(e),o=new s.default(r),i=A.generate(n,o),a=new t(o);return i.map(a.read,a)}function l(e){if(![].concat(e).every(e=>a.string.isString(e)&&!a.string.isEmpty(e)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}!function(e){e.sync=function(e,t){l(e);const r=g(e,i.default,t);return a.array.flatten(r)},e.stream=function(e,t){l(e);const r=g(e,o.default,t);return a.stream.merge(r)},e.generateTasks=function(e,t){l(e);const r=[].concat(e),n=new s.default(t);return A.generate(r,n)},e.isDynamicPattern=function(e,t){l(e);const r=new s.default(t);return a.pattern.isDynamicPattern(e,r)},e.escapePath=function(e){return l(e),a.path.escape(e)}}(c||(c={})),e.exports=c},80598:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(16777);function n(e,t,r){const A=s(e);if("."in A){return[c(".",e,t,r)]}return a(A,t,r)}function o(e){return A.pattern.getPositivePatterns(e)}function i(e,t){return A.pattern.getNegativePatterns(e).concat(t).map(A.pattern.convertToPositivePattern)}function s(e){return e.reduce((e,t)=>{const r=A.pattern.getBaseDirectory(t);return r in e?e[r].push(t):e[r]=[t],e},{})}function a(e,t,r){return Object.keys(e).map(A=>c(A,e[A],t,r))}function c(e,t,r,n){return{dynamic:n,positive:t,negative:r,base:e,patterns:[].concat(t,r.map(A.pattern.convertToNegativePattern))}}t.generate=function(e,t){const r=o(e),s=i(e,t.ignore),a=r.filter(e=>A.pattern.isStaticPattern(e,t)),c=r.filter(e=>A.pattern.isDynamicPattern(e,t)),g=n(a,s,!1),l=n(c,s,!0);return g.concat(l)},t.convertPatternsToTasks=n,t.getPositivePatterns=o,t.getNegativePatternsAsPositive=i,t.groupPatternsByBaseDirectory=s,t.convertPatternGroupsToTasks=a,t.convertPatternGroupToTask=c},58182:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(82774),n=r(40545);class o extends n.default{constructor(){super(...arguments),this._reader=new A.default(this._settings)}read(e){const t=this._getRootDirectory(e),r=this._getReaderOptions(e),A=[];return new Promise((n,o)=>{const i=this.api(t,e,r);i.once("error",o),i.on("data",e=>A.push(r.transform(e))),i.once("end",()=>n(A))})}api(e,t,r){return t.dynamic?this._reader.dynamic(e,r):this._reader.static(t.patterns,r)}}t.default=o},65989:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(16777),n=r(42585);t.default=class{constructor(e,t){this._settings=e,this._micromatchOptions=t}getFilter(e,t,r){const A=this._getMatcher(t),n=this._getNegativePatternsRe(r);return t=>this._filter(e,t,A,n)}_getMatcher(e){return new n.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){const t=e.filter(A.pattern.isAffectDepthOfReadingPattern);return A.pattern.convertPatternsToRe(t,this._micromatchOptions)}_filter(e,t,r,n){const o=this._getEntryLevel(e,t.path);if(this._isSkippedByDeep(o))return!1;if(this._isSkippedSymbolicLink(t))return!1;const i=A.path.removeLeadingDotSegment(t.path);return!this._isSkippedByPositivePatterns(i,r)&&this._isSkippedByNegativePatterns(i,n)}_isSkippedByDeep(e){return e>=this._settings.deep}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_getEntryLevel(e,t){const r=e.split("/").length;return t.split("/").length-(""===e?0:r)}_isSkippedByPositivePatterns(e,t){return!this._settings.baseNameMatch&&!t.match(e)}_isSkippedByNegativePatterns(e,t){return!A.pattern.matchAny(e,t)}}},37338:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(16777);t.default=class{constructor(e,t){this._settings=e,this._micromatchOptions=t,this.index=new Map}getFilter(e,t){const r=A.pattern.convertPatternsToRe(e,this._micromatchOptions),n=A.pattern.convertPatternsToRe(t,this._micromatchOptions);return e=>this._filter(e,r,n)}_filter(e,t,r){if(this._settings.unique){if(this._isDuplicateEntry(e))return!1;this._createIndexRecord(e)}if(this._onlyFileFilter(e)||this._onlyDirectoryFilter(e))return!1;if(this._isSkippedByAbsoluteNegativePatterns(e,r))return!1;const A=this._settings.baseNameMatch?e.name:e.path;return this._isMatchToPatterns(A,t)&&!this._isMatchToPatterns(e.path,r)}_isDuplicateEntry(e){return this.index.has(e.path)}_createIndexRecord(e){this.index.set(e.path,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,t){if(!this._settings.absolute)return!1;const r=A.path.makeAbsolute(this._settings.cwd,e.path);return this._isMatchToPatterns(r,t)}_isMatchToPatterns(e,t){const r=A.path.removeLeadingDotSegment(e);return A.pattern.matchAny(r,t)}}},54345:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(16777);t.default=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return A.errno.isEnoentCodeError(e)||this._settings.suppressErrors}}},34789:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(16777);t.default=class{constructor(e,t,r){this._patterns=e,this._settings=t,this._micromatchOptions=r,this._storage=[],this._fillStorage()}_fillStorage(){const e=A.pattern.expandPatternsWithBraceExpansion(this._patterns);for(const t of e){const e=this._getPatternSegments(t),r=this._splitSegmentsIntoSections(e);this._storage.push({complete:r.length<=1,pattern:t,segments:e,sections:r})}}_getPatternSegments(e){return A.pattern.getPatternParts(e,this._micromatchOptions).map(e=>A.pattern.isDynamicPattern(e,this._settings)?{dynamic:!0,pattern:e,patternRe:A.pattern.makeRe(e,this._micromatchOptions)}:{dynamic:!1,pattern:e})}_splitSegmentsIntoSections(e){return A.array.splitWhen(e,e=>e.dynamic&&A.pattern.hasGlobStar(e.pattern))}}},42585:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(34789);class n extends A.default{match(e){const t=e.split("/"),r=t.length,A=this._storage.filter(e=>!e.complete||e.segments.length>r);for(const e of A){const A=e.sections[0];if(!e.complete&&r>A.length)return!0;if(t.every((t,r)=>{const A=e.segments[r];return!(!A.dynamic||!A.patternRe.test(t))||!A.dynamic&&A.pattern===t}))return!0}return!1}}t.default=n},40545:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(85622),n=r(65989),o=r(37338),i=r(54345),s=r(77541);t.default=class{constructor(e){this._settings=e,this.errorFilter=new i.default(this._settings),this.entryFilter=new o.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new n.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new s.default(this._settings)}_getRootDirectory(e){return A.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){const t="."===e.base?"":e.base;return{basePath:t,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(t,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}}},67652:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(92413),n=r(82774),o=r(40545);class i extends o.default{constructor(){super(...arguments),this._reader=new n.default(this._settings)}read(e){const t=this._getRootDirectory(e),r=this._getReaderOptions(e),n=this.api(t,e,r),o=new A.Readable({objectMode:!0,read:()=>{}});return n.once("error",e=>o.emit("error",e)).on("data",e=>o.emit("data",r.transform(e))).once("end",()=>o.emit("end")),o.once("close",()=>n.destroy()),o}api(e,t,r){return t.dynamic?this._reader.dynamic(e,r):this._reader.static(t.patterns,r)}}t.default=i},81340:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(29543),n=r(40545);class o extends n.default{constructor(){super(...arguments),this._reader=new A.default(this._settings)}read(e){const t=this._getRootDirectory(e),r=this._getReaderOptions(e);return this.api(t,e,r).map(r.transform)}api(e,t,r){return t.dynamic?this._reader.dynamic(e,r):this._reader.static(t.patterns,r)}}t.default=o},77541:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(16777);t.default=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let t=e.path;return this._settings.absolute&&(t=A.path.makeAbsolute(this._settings.cwd,t),t=A.path.unixify(t)),this._settings.markDirectories&&e.dirent.isDirectory()&&(t+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:t}):t}}},99458:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(85622),n=r(53403),o=r(16777);t.default=class{constructor(e){this._settings=e,this._fsStatSettings=new n.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return A.resolve(this._settings.cwd,e)}_makeEntry(e,t){const r={name:t,path:t,dirent:o.fs.createDirentFromStats(t,e)};return this._settings.stats&&(r.stats=e),r}_isFatalError(e){return!o.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}}},82774:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(92413),n=r(53403),o=r(72897),i=r(99458);class s extends i.default{constructor(){super(...arguments),this._walkStream=o.walkStream,this._stat=n.stat}dynamic(e,t){return this._walkStream(e,t)}static(e,t){const r=e.map(this._getFullEntryPath,this),n=new A.PassThrough({objectMode:!0});n._write=(A,o,i)=>this._getEntry(r[A],e[A],t).then(e=>{null!==e&&t.entryFilter(e)&&n.push(e),A===r.length-1&&n.end(),i()}).catch(i);for(let e=0;ethis._makeEntry(e,t)).catch(e=>{if(r.errorFilter(e))return null;throw e})}_getStat(e){return new Promise((t,r)=>{this._stat(e,this._fsStatSettings,(e,A)=>null===e?t(A):r(e))})}}t.default=s},29543:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(53403),n=r(72897),o=r(99458);class i extends o.default{constructor(){super(...arguments),this._walkSync=n.walkSync,this._statSync=A.statSync}dynamic(e,t){return this._walkSync(e,t)}static(e,t){const r=[];for(const A of e){const e=this._getFullEntryPath(A),n=this._getEntry(e,A,t);null!==n&&t.entryFilter(n)&&r.push(n)}return r}_getEntry(e,t,r){try{const r=this._getStat(e);return this._makeEntry(r,t)}catch(e){if(r.errorFilter(e))return null;throw e}}_getStat(e){return this._statSync(e,this._fsStatSettings)}}t.default=i},43754:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(35747),n=r(12087).cpus().length;t.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:A.lstat,lstatSync:A.lstatSync,stat:A.stat,statSync:A.statSync,readdir:A.readdir,readdirSync:A.readdirSync};t.default=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,n),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,1/0),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0)}_getValue(e,t){return void 0===e?t:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},t.DEFAULT_FILE_SYSTEM_ADAPTER),e)}}},60919:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.flatten=function(e){return e.reduce((e,t)=>[].concat(e,t),[])},t.splitWhen=function(e,t){const r=[[]];let A=0;for(const n of e)t(n)?(A++,r[A]=[]):r[A].push(n);return r}},35525:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isEnoentCodeError=function(e){return"ENOENT"===e.code}},62524:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}}t.createDirentFromStats=function(e,t){return new r(e,t)}},16777:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(60919);t.array=A;const n=r(35525);t.errno=n;const o=r(62524);t.fs=o;const i=r(71462);t.path=i;const s=r(14659);t.pattern=s;const a=r(2042);t.stream=a;const c=r(10217);t.string=c},71462:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(85622),n=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g;t.unixify=function(e){return e.replace(/\\/g,"/")},t.makeAbsolute=function(e,t){return A.resolve(e,t)},t.escape=function(e){return e.replace(n,"\\$2")},t.removeLeadingDotSegment=function(e){if("."===e.charAt(0)){const t=e.charAt(1);if("/"===t||"\\"===t)return e.slice(2)}return e}},14659:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(85622),n=r(97098),o=r(2401),i=r(54722),s=/[*?]|^!/,a=/\[.*]/,c=/(?:^|[^!*+?@])\(.*\|.*\)/,g=/[!*+?@]\(.*\)/,l=/{.*(?:,|\.\.).*}/;function u(e,t={}){return!h(e,t)}function h(e,t={}){return!(!1!==t.caseSensitiveMatch&&!e.includes("\\"))||(!!(s.test(e)||a.test(e)||c.test(e))||(!(!1===t.extglob||!g.test(e))||!(!1===t.braceExpansion||!l.test(e))))}function p(e){return e.startsWith("!")&&"("!==e[1]}function d(e){return!p(e)}function C(e){return e.endsWith("/**")}function f(e){return o.braces(e,{expand:!0,nodupes:!0})}function I(e,t){return o.makeRe(e,t)}t.isStaticPattern=u,t.isDynamicPattern=h,t.convertToPositivePattern=function(e){return p(e)?e.slice(1):e},t.convertToNegativePattern=function(e){return"!"+e},t.isNegativePattern=p,t.isPositivePattern=d,t.getNegativePatterns=function(e){return e.filter(p)},t.getPositivePatterns=function(e){return e.filter(d)},t.getBaseDirectory=function(e){return n(e,{flipBackslashes:!1})},t.hasGlobStar=function(e){return e.includes("**")},t.endsWithSlashGlobStar=C,t.isAffectDepthOfReadingPattern=function(e){const t=A.basename(e);return C(e)||u(t)},t.expandPatternsWithBraceExpansion=function(e){return e.reduce((e,t)=>e.concat(f(t)),[])},t.expandBraceExpansion=f,t.getPatternParts=function(e,t){const r=i.scan(e,Object.assign(Object.assign({},t),{parts:!0}));return 0===r.parts.length?[e]:r.parts},t.makeRe=I,t.convertPatternsToRe=function(e,t){return e.map(e=>I(e,t))},t.matchAny=function(e,t){return t.some(t=>t.test(e))}},2042:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(55598);function n(e){e.forEach(e=>e.emit("close"))}t.merge=function(e){const t=A(e);return e.forEach(e=>{e.once("error",e=>t.emit("error",e))}),t.once("close",()=>n(e)),t.once("end",()=>n(e)),t}},10217:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isString=function(e){return"string"==typeof e},t.isEmpty=function(e){return""===e}},98360:(e,t,r)=>{"use strict";var A=r(2383);function n(){}function o(){this.value=null,this.callback=n,this.next=null,this.release=n,this.context=null;var e=this;this.worked=function(t,r){var A=e.callback;e.value=null,e.callback=n,A.call(e.context,t,r),e.release(e)}}e.exports=function(e,t,r){"function"==typeof e&&(r=t,t=e,e=null);var i=A(o),s=null,a=null,c=0,g={push:function(r,A){var o=i.get();o.context=e,o.release=l,o.value=r,o.callback=A||n,c===g.concurrency||g.paused?a?(a.next=o,a=o):(s=o,a=o,g.saturated()):(c++,t.call(e,o.value,o.worked))},drain:n,saturated:n,pause:function(){g.paused=!0},paused:!1,concurrency:r,running:function(){return c},resume:function(){if(!g.paused)return;g.paused=!1;for(var e=0;e{"use strict";class A{constructor(e,t,r){this.__specs=e||{},Object.keys(this.__specs).forEach(e=>{if("string"==typeof this.__specs[e]){const t=this.__specs[e],r=this.__specs[t];if(!r)throw new Error(`Alias refers to invalid key: ${t} -> ${e}`);{const A=r.aliases||[];A.push(e,t),r.aliases=[...new Set(A)],this.__specs[e]=r}}}),this.__opts=t||{},this.__providers=s(r.filter(e=>null!=e&&"object"==typeof e)),this.__isFiggyPudding=!0}get(e){return n(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,t=this){for(let[r,A]of this.entries())e.call(t,A,r,this)}toJSON(){const e={};return this.forEach((t,r)=>{e[r]=t}),e}*entries(e){for(let e of Object.keys(this.__specs))yield[e,this.get(e)];const t=e||this.__opts.other;if(t){const e=new Set;for(let r of this.__providers){const A=r.entries?r.entries(t):a(r);for(let[r,n]of A)t(r)&&!e.has(r)&&(e.add(r),yield[r,n])}}}*[Symbol.iterator](){for(let[e,t]of this.entries())yield[e,t]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new A(this.__specs,this.__opts,s(this.__providers).concat(e)),i)}}try{const e=r(31669);A.prototype[e.inspect.custom]=function(t,r){return this[Symbol.toStringTag]+" "+e.inspect(this.toJSON(),r)}}catch(e){}function n(e,t,r){let A=e.__specs[t];if(!r||A||e.__opts.other&&e.__opts.other(t)){let r;A||(A={});for(let n of e.__providers){if(r=o(t,n),void 0===r&&A.aliases&&A.aliases.length)for(let e of A.aliases)if(e!==t&&(r=o(e,n),void 0!==r))break;if(void 0!==r)break}return void 0===r&&void 0!==A.default?"function"==typeof A.default?A.default(e):A.default:r}!function(e){throw Object.assign(new Error("invalid config key requested: "+e),{code:"EBADKEY"})}(t)}function o(e,t){let r;return r=t.__isFiggyPudding?n(t,e,!1):"function"==typeof t.get?t.get(e):t[e],r}const i={has:(e,t)=>t in e.__specs&&void 0!==n(e,t,!1),ownKeys:e=>Object.keys(e.__specs),get:(e,t)=>"symbol"==typeof t||"__"===t.slice(0,2)||t in A.prototype?e[t]:e.get(t),set(e,t,r){if("symbol"==typeof t||"__"===t.slice(0,2))return e[t]=r,!0;throw new Error("figgyPudding options cannot be modified. Use .concat() instead.")},deleteProperty(){throw new Error("figgyPudding options cannot be deleted. Use .concat() and shadow them instead.")}};function s(e){const t=[];return e.forEach(e=>t.unshift(e)),t}function a(e){return Object.keys(e).map(t=>[t,e[t]])}e.exports=function(e,t){return function(...r){return new Proxy(new A(e,t,r),i)}}},52169:(e,t,r)=>{"use strict"; +/*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + */const A=r(31669),n=r(84615),o=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),i=e=>"number"==typeof e||"string"==typeof e&&""!==e,s=e=>Number.isInteger(+e),a=e=>{let t=""+e,r=-1;if("-"===t[0]&&(t=t.slice(1)),"0"===t)return!1;for(;"0"===t[++r];);return r>0},c=(e,t,r)=>{if(t>0){let r="-"===e[0]?"-":"";r&&(e=e.slice(1)),e=r+e.padStart(r?t-1:t,"0")}return!1===r?String(e):e},g=(e,t)=>{let r="-"===e[0]?"-":"";for(r&&(e=e.slice(1),t--);e.length{if(r)return n(e,t,{wrap:!1,...A});let o=String.fromCharCode(e);return e===t?o:`[${o}-${String.fromCharCode(t)}]`},u=(e,t,r)=>{if(Array.isArray(e)){let t=!0===r.wrap,A=r.capture?"":"?:";return t?`(${A}${e.join("|")})`:e.join("|")}return n(e,t,r)},h=(...e)=>new RangeError("Invalid range arguments: "+A.inspect(...e)),p=(e,t,r)=>{if(!0===r.strictRanges)throw h([e,t]);return[]},d=(e,t,r=1,A={})=>{let n=Number(e),o=Number(t);if(!Number.isInteger(n)||!Number.isInteger(o)){if(!0===A.strictRanges)throw h([e,t]);return[]}0===n&&(n=0),0===o&&(o=0);let i=n>o,s=String(e),p=String(t),d=String(r);r=Math.max(Math.abs(r),1);let C=a(s)||a(p)||a(d),f=C?Math.max(s.length,p.length,d.length):0,I=!1===C&&!1===((e,t,r)=>"string"==typeof e||"string"==typeof t||!0===r.stringify)(e,t,A),E=A.transform||(e=>t=>!0===e?Number(t):String(t))(I);if(A.toRegex&&1===r)return l(g(e,f),g(t,f),!0,A);let B={negatives:[],positives:[]},y=[],m=0;for(;i?n>=o:n<=o;)!0===A.toRegex&&r>1?B[(w=n)<0?"negatives":"positives"].push(Math.abs(w)):y.push(c(E(n,m),f,I)),n=i?n-r:n+r,m++;var w;return!0===A.toRegex?r>1?((e,t)=>{e.negatives.sort((e,t)=>et?1:0),e.positives.sort((e,t)=>et?1:0);let r,A=t.capture?"":"?:",n="",o="";return e.positives.length&&(n=e.positives.join("|")),e.negatives.length&&(o=`-(${A}${e.negatives.join("|")})`),r=n&&o?`${n}|${o}`:n||o,t.wrap?`(${A}${r})`:r})(B,A):u(y,null,{wrap:!1,...A}):y},C=(e,t,r,A={})=>{if(null==t&&i(e))return[e];if(!i(e)||!i(t))return p(e,t,A);if("function"==typeof r)return C(e,t,1,{transform:r});if(o(r))return C(e,t,0,r);let n={...A};return!0===n.capture&&(n.wrap=!0),r=r||n.step||1,s(r)?s(e)&&s(t)?d(e,t,r,n):((e,t,r=1,A={})=>{if(!s(e)&&e.length>1||!s(t)&&t.length>1)return p(e,t,A);let n=A.transform||(e=>String.fromCharCode(e)),o=(""+e).charCodeAt(0),i=(""+t).charCodeAt(0),a=o>i,c=Math.min(o,i),g=Math.max(o,i);if(A.toRegex&&1===r)return l(c,g,!1,A);let h=[],d=0;for(;a?o>=i:o<=i;)h.push(n(o,d)),o=a?o-r:o+r,d++;return!0===A.toRegex?u(h,null,{wrap:!1,options:A}):h})(e,t,Math.max(Math.abs(r),1),n):null==r||o(r)?C(e,t,1,r):((e,t)=>{if(!0===t.strictRanges)throw new TypeError(`Expected step "${e}" to be a number`);return[]})(r,n)};e.exports=C},50683:e=>{e.exports=function(e){return[...e].reduce((e,[t,r])=>(e[t]=r,e),{})}},13302:(e,t,r)=>{e.exports=r(35747).constants||r(27619)},72137:(e,t,r)=>{"use strict";const{PassThrough:A}=r(92413);e.exports=e=>{e={...e};const{array:t}=e;let{encoding:r}=e;const n="buffer"===r;let o=!1;t?o=!(r||n):r=r||"utf8",n&&(r=null);const i=new A({objectMode:o});r&&i.setEncoding(r);let s=0;const a=[];return i.on("data",e=>{a.push(e),o?s=a.length:s+=e.length}),i.getBufferedValue=()=>t?a:n?Buffer.concat(a,s):a.join(""),i.getBufferedLength=()=>s,i}},58764:(e,t,r)=>{"use strict";const A=r(50372),n=r(72137);class o extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}}async function i(e,t){if(!e)return Promise.reject(new Error("Expected a stream"));t={maxBuffer:1/0,...t};const{maxBuffer:r}=t;let i;return await new Promise((s,a)=>{const c=e=>{e&&(e.bufferedData=i.getBufferedValue()),a(e)};i=A(e,n(t),e=>{e?c(e):s()}),i.on("data",()=>{i.getBufferedLength()>r&&c(new o)})}),i.getBufferedValue()}e.exports=i,e.exports.default=i,e.exports.buffer=(e,t)=>i(e,{...t,encoding:"buffer"}),e.exports.array=(e,t)=>i(e,{...t,array:!0}),e.exports.MaxBufferError=o},97098:(e,t,r)=>{"use strict";var A=r(18193),n=r(85622).posix.dirname,o="win32"===r(12087).platform(),i=/\\/g,s=/[\{\[].*[\/]*.*[\}\]]$/,a=/(^|[^\\])([\{\[]|\([^\)]+$)/,c=/\\([\*\?\|\[\]\(\)\{\}])/g;e.exports=function(e,t){Object.assign({flipBackslashes:!0},t).flipBackslashes&&o&&e.indexOf("/")<0&&(e=e.replace(i,"/")),s.test(e)&&(e+="/"),e+="a";do{e=n(e)}while(A(e)||a.test(e));return e.replace(c,"$1")}},90734:(e,t,r)=>{"use strict";const{promisify:A}=r(31669),n=r(35747),o=r(85622),i=r(19347),s=r(46458),a=r(17234),c=["**/node_modules/**","**/flow-typed/**","**/coverage/**","**/.git"],g=A(n.readFile),l=(e,t)=>{const r=a(o.relative(t.cwd,o.dirname(t.fileName)));return e.split(/\r?\n/).filter(Boolean).filter(e=>!e.startsWith("#")).map((e=>t=>t.startsWith("!")?"!"+o.posix.join(e,t.slice(1)):o.posix.join(e,t))(r))},u=e=>e.reduce((e,t)=>(e.add(l(t.content,{cwd:t.cwd,fileName:t.filePath})),e),s()),h=(e,t)=>r=>e.ignores(a(o.relative(t,((e,t)=>{if(e=a(e),o.isAbsolute(t)){if(t.startsWith(e))return t;throw new Error(`Path ${t} is not in cwd ${e}`)}return o.join(e,t)})(t,r)))),p=({ignore:e=[],cwd:t=a(process.cwd())}={})=>({ignore:e,cwd:t});e.exports=async e=>{e=p(e);const t=await i("**/.gitignore",{ignore:c.concat(e.ignore),cwd:e.cwd}),r=await Promise.all(t.map(t=>(async(e,t)=>{const r=o.join(t,e);return{cwd:t,filePath:r,content:await g(r,"utf8")}})(t,e.cwd))),A=u(r);return h(A,e.cwd)},e.exports.sync=e=>{e=p(e);const t=i.sync("**/.gitignore",{ignore:c.concat(e.ignore),cwd:e.cwd}).map(t=>((e,t)=>{const r=o.join(t,e);return{cwd:t,filePath:r,content:n.readFileSync(r,"utf8")}})(t,e.cwd)),r=u(t);return h(r,e.cwd)}},58592:(e,t,r)=>{"use strict";const A=r(35747),n=r(39920),o=r(55598),i=r(19347),s=r(66241),a=r(90734),{FilterStream:c,UniqueStream:g}=r(66160),l=()=>!1,u=e=>"!"===e[0],h=(e,t)=>{(e=>{if(!e.every(e=>"string"==typeof e))throw new TypeError("Patterns must be a string or an array of strings")})(e=n([].concat(e))),((e={})=>{if(!e.cwd)return;let t;try{t=A.statSync(e.cwd)}catch(e){return}if(!t.isDirectory())throw new Error("The `cwd` option must be a path to a directory")})(t);const r=[];t={ignore:[],expandDirectories:!0,...t};for(const[A,n]of e.entries()){if(u(n))continue;const o=e.slice(A).filter(u).map(e=>e.slice(1)),i={...t,ignore:t.ignore.concat(o)};r.push({pattern:n,options:i})}return r},p=(e,t)=>e.options.expandDirectories?((e,t)=>{let r={};return e.options.cwd&&(r.cwd=e.options.cwd),Array.isArray(e.options.expandDirectories)?r={...r,files:e.options.expandDirectories}:"object"==typeof e.options.expandDirectories&&(r={...r,...e.options.expandDirectories}),t(e.pattern,r)})(e,t):[e.pattern],d=e=>e&&e.gitignore?a.sync({cwd:e.cwd,ignore:e.ignore}):l,C=e=>t=>{const{options:r}=e;return r.ignore&&Array.isArray(r.ignore)&&r.expandDirectories&&(r.ignore=s.sync(r.ignore)),{pattern:t,options:r}};e.exports=async(e,t)=>{const r=h(e,t),[o,c]=await Promise.all([(async()=>t&&t.gitignore?a({cwd:t.cwd,ignore:t.ignore}):l)(),(async()=>{const e=await Promise.all(r.map(async e=>{const t=await p(e,s);return Promise.all(t.map(C(e)))}));return n(...e)})()]),g=await Promise.all(c.map(e=>i(e.pattern,e.options)));return n(...g).filter(e=>{return!o((t=e,t.stats instanceof A.Stats?t.path:t));var t})},e.exports.sync=(e,t)=>{const r=h(e,t).reduce((e,t)=>{const r=p(t,s.sync).map(C(t));return e.concat(r)},[]),A=d(t);return r.reduce((e,t)=>n(e,i.sync(t.pattern,t.options)),[]).filter(e=>!A(e))},e.exports.stream=(e,t)=>{const r=h(e,t).reduce((e,t)=>{const r=p(t,s.sync).map(C(t));return e.concat(r)},[]),A=d(t),n=new c(e=>!A(e)),a=new g;return o(r.map(e=>i.stream(e.pattern,e.options))).pipe(n).pipe(a)},e.exports.generateGlobTasks=h,e.exports.hasMagic=(e,t)=>[].concat(e).some(e=>i.isDynamicPattern(e,t)),e.exports.gitignore=a},66160:(e,t,r)=>{"use strict";const{Transform:A}=r(92413);class n extends A{constructor(){super({objectMode:!0})}}e.exports={FilterStream:class extends n{constructor(e){super(),this._filter=e}_transform(e,t,r){this._filter(e)&&this.push(e),r()}},UniqueStream:class extends n{constructor(){super(),this._pushed=new Set}_transform(e,t,r){this._pushed.has(e)||(this.push(e),this._pushed.add(e)),r()}}}},93576:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(14756);t.default=function(e,...t){const r=(async()=>{if(e instanceof A.RequestError)try{for(const r of t)if(r)for(const t of r)e=await t(e)}catch(t){e=t}throw e})(),n=()=>r;return r.json=n,r.text=n,r.buffer=n,r.on=n,r}},81588:function(e,t,r){"use strict";var A=this&&this.__createBinding||(Object.create?function(e,t,r,A){void 0===A&&(A=r),Object.defineProperty(e,A,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,A){void 0===A&&(A=r),e[A]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||A(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0});const o=r(28614),i=r(7966),s=r(59351),a=r(14756),c=r(54718),g=r(9048),l=r(51743),u=r(57854),h=r(38206),p=["request","response","redirect","uploadProgress","downloadProgress"];t.default=function e(t){let r,A;const n=new o.EventEmitter,d=new s((o,s,C)=>{const f=I=>{const E=new g.default(void 0,t);E.retryCount=I,E._noPipe=!0,C(()=>E.destroy()),C.shouldReject=!1,C(()=>s(new a.CancelError(E))),r=E,E.once("response",async t=>{var r;if(t.retryCount=I,t.request.aborted)return;let n;try{n=await u.default(E),t.rawBody=n}catch(e){return}if(E._isAboutToError)return;const i=(null!==(r=t.headers["content-encoding"])&&void 0!==r?r:"").toLowerCase(),s=["gzip","deflate","br"].includes(i),{options:l}=E;if(s&&!l.decompress)t.body=n;else try{t.body=c.default(t,l.responseType,l.parseJson,l.encoding)}catch(e){if(t.body=n.toString(),h.isResponseOk(t))return void E._beforeError(e)}try{for(const[r,A]of l.hooks.afterResponse.entries())t=await A(t,async t=>{const A=g.default.normalizeArguments(void 0,{...t,retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1},l);A.hooks.afterResponse=A.hooks.afterResponse.slice(0,r);for(const e of A.hooks.beforeRetry)await e(A);const n=e(A);return C(()=>{n.catch(()=>{}),n.cancel()}),n})}catch(e){return void E._beforeError(new a.RequestError(e.message,e,E))}h.isResponseOk(t)?(A=t,o(E.options.resolveBodyOnly?t.body:t)):E._beforeError(new a.HTTPError(t))});const B=e=>{if(d.isCanceled)return;const{options:t}=E;if(e instanceof a.HTTPError&&!t.throwHttpErrors){const{response:t}=e;o(E.options.resolveBodyOnly?t.body:t)}else s(e)};E.once("error",B),E.once("retry",(e,t)=>{var r;i.default.nodeStream(null===(r=t.request)||void 0===r?void 0:r.options.body)?B(t):f(e)}),l.default(E,n,p)};f(0)});d.on=(e,t)=>(n.on(e,t),d);const C=e=>{const t=(async()=>{await d;const{options:t}=A.request;return c.default(A,e,t.parseJson,t.encoding)})();return Object.defineProperties(t,Object.getOwnPropertyDescriptors(d)),t};return d.json=()=>{const{headers:e}=r.options;return r.writableFinished||void 0!==e.accept||(e.accept="application/json"),C("json")},d.buffer=()=>C("buffer"),d.text=()=>C("text"),d},n(r(14756),t)},41514:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(7966);t.default=(e,t)=>{if(A.default.null_(e.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");A.assert.any([A.default.string,A.default.undefined],e.encoding),A.assert.any([A.default.boolean,A.default.undefined],e.resolveBodyOnly),A.assert.any([A.default.boolean,A.default.undefined],e.methodRewriting),A.assert.any([A.default.boolean,A.default.undefined],e.isStream),A.assert.any([A.default.string,A.default.undefined],e.responseType),void 0===e.responseType&&(e.responseType="text");const{retry:r}=e;if(e.retry=t?{...t.retry}:{calculateDelay:e=>e.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},A.default.object(r)?(e.retry={...e.retry,...r},e.retry.methods=[...new Set(e.retry.methods.map(e=>e.toUpperCase()))],e.retry.statusCodes=[...new Set(e.retry.statusCodes)],e.retry.errorCodes=[...new Set(e.retry.errorCodes)]):A.default.number(r)&&(e.retry.limit=r),A.default.undefined(e.retry.maxRetryAfter)&&(e.retry.maxRetryAfter=Math.min(...[e.timeout.request,e.timeout.connect].filter(A.default.number))),A.default.object(e.pagination)){t&&(e.pagination={...t.pagination,...e.pagination});const{pagination:r}=e;if(!A.default.function_(r.transform))throw new Error("`options.pagination.transform` must be implemented");if(!A.default.function_(r.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!A.default.function_(r.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!A.default.function_(r.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return"json"===e.responseType&&void 0===e.headers.accept&&(e.headers.accept="application/json"),e}},54718:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(14756);t.default=(e,t,r,n)=>{const{rawBody:o}=e;try{if("text"===t)return o.toString(n);if("json"===t)return 0===o.length?"":r(o.toString());if("buffer"===t)return o;throw new A.ParseError({message:`Unknown body type '${t}'`,name:"Error"},e)}catch(t){throw new A.ParseError(t,e)}}},14756:function(e,t,r){"use strict";var A=this&&this.__createBinding||(Object.create?function(e,t,r,A){void 0===A&&(A=r),Object.defineProperty(e,A,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,A){void 0===A&&(A=r),e[A]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||A(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.CancelError=t.ParseError=void 0;const o=r(9048);class i extends o.RequestError{constructor(e,t){const{options:r}=t.request;super(`${e.message} in "${r.url.toString()}"`,e,t.request),this.name="ParseError"}}t.ParseError=i;class s extends o.RequestError{constructor(e){super("Promise was canceled",{},e),this.name="CancelError"}get isCanceled(){return!0}}t.CancelError=s,n(r(9048),t)},53843:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.retryAfterStatusCodes=void 0,t.retryAfterStatusCodes=new Set([413,429,503]);t.default=({attemptCount:e,retryOptions:t,error:r,retryAfter:A})=>{if(e>t.limit)return 0;const n=t.methods.includes(r.options.method),o=t.errorCodes.includes(r.code),i=r.response&&t.statusCodes.includes(r.response.statusCode);if(!n||!o&&!i)return 0;if(r.response){if(A)return void 0===t.maxRetryAfter||A>t.maxRetryAfter?0:A;if(413===r.response.statusCode)return 0}return 2**(e-1)*1e3+100*Math.random()}},9048:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UnsupportedProtocolError=t.ReadError=t.TimeoutError=t.UploadError=t.CacheError=t.HTTPError=t.MaxRedirectsError=t.RequestError=t.setNonEnumerableProperties=t.knownHookEvents=t.withoutBody=t.kIsNormalizedAlready=void 0;const A=r(31669),n=r(92413),o=r(35747),i=r(78835),s=r(98605),a=r(98605),c=r(57211),g=r(98298),l=r(30093),u=r(11200),h=r(93868),p=r(92353),d=r(55737),C=r(7966),f=r(78586),I=r(2920),E=r(51743),B=r(44947),y=r(50116),m=r(82524),w=r(85551),Q=r(57854),D=r(11338),b=r(38206),v=r(54595),S=r(41514),k=r(53843),N=new l.default,F=Symbol("request"),K=Symbol("response"),M=Symbol("responseSize"),R=Symbol("downloadedSize"),x=Symbol("bodySize"),L=Symbol("uploadedSize"),P=Symbol("serverResponsesPiped"),O=Symbol("unproxyEvents"),U=Symbol("isFromCache"),T=Symbol("cancelTimeouts"),j=Symbol("startedReading"),Y=Symbol("stopReading"),G=Symbol("triggerRead"),H=Symbol("body"),J=Symbol("jobs"),q=Symbol("originalResponse"),z=Symbol("retryTimeout");t.kIsNormalizedAlready=Symbol("isNormalizedAlready");const W=C.default.string(process.versions.brotli);t.withoutBody=new Set(["GET","HEAD"]),t.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];const V=new w.default,X=new Set([300,301,302,303,304,307,308]),_=["context","body","json","form"];t.setNonEnumerableProperties=(e,t)=>{const r={};for(const t of e)if(t)for(const e of _)e in t&&(r[e]={writable:!0,configurable:!0,enumerable:!1,value:t[e]});Object.defineProperties(t,r)};class Z extends Error{constructor(e,t,r){var A;if(super(e),Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=t.code,r instanceof se?(Object.defineProperty(this,"request",{enumerable:!1,value:r}),Object.defineProperty(this,"response",{enumerable:!1,value:r[K]}),Object.defineProperty(this,"options",{enumerable:!1,value:r.options})):Object.defineProperty(this,"options",{enumerable:!1,value:r}),this.timings=null===(A=this.request)||void 0===A?void 0:A.timings,!C.default.undefined(t.stack)){const e=this.stack.indexOf(this.message)+this.message.length,r=this.stack.slice(e).split("\n").reverse(),A=t.stack.slice(t.stack.indexOf(t.message)+t.message.length).split("\n").reverse();for(;0!==A.length&&A[0]===r[0];)r.shift();this.stack=`${this.stack.slice(0,e)}${r.reverse().join("\n")}${A.reverse().join("\n")}`}}}t.RequestError=Z;class $ extends Z{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e),this.name="MaxRedirectsError"}}t.MaxRedirectsError=$;class ee extends Z{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request),this.name="HTTPError"}}t.HTTPError=ee;class te extends Z{constructor(e,t){super(e.message,e,t),this.name="CacheError"}}t.CacheError=te;class re extends Z{constructor(e,t){super(e.message,e,t),this.name="UploadError"}}t.UploadError=re;class Ae extends Z{constructor(e,t,r){super(e.message,e,r),this.name="TimeoutError",this.event=e.event,this.timings=t}}t.TimeoutError=Ae;class ne extends Z{constructor(e,t){super(e.message,e,t),this.name="ReadError"}}t.ReadError=ne;class oe extends Z{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e),this.name="UnsupportedProtocolError"}}t.UnsupportedProtocolError=oe;const ie=["socket","connect","continue","information","upgrade","timeout"];class se extends n.Duplex{constructor(e,r={},A){super({autoDestroy:!1,highWaterMark:0}),this[R]=0,this[L]=0,this.requestInitialized=!1,this[P]=new Set,this.redirects=[],this[Y]=!1,this[G]=!1,this[J]=[],this.retryCount=0,this._progressCallbacks=[];const n=()=>this._unlockWrite(),i=()=>this._lockWrite();this.on("pipe",e=>{e.prependListener("data",n),e.on("data",i),e.prependListener("end",n),e.on("end",i)}),this.on("unpipe",e=>{e.off("data",n),e.off("data",i),e.off("end",n),e.off("end",i)}),this.on("pipe",e=>{e instanceof a.IncomingMessage&&(this.options.headers={...e.headers,...this.options.headers})});const{json:s,body:c,form:g}=r;if((s||c||g)&&this._lockWrite(),t.kIsNormalizedAlready in r)this.options=r;else try{this.options=this.constructor.normalizeArguments(e,r,A)}catch(e){return C.default.nodeStream(r.body)&&r.body.destroy(),void this.destroy(e)}(async()=>{var e;try{this.options.body instanceof o.ReadStream&&await(async e=>new Promise((t,r)=>{const A=e=>{r(e)};e.pending||t(),e.once("error",A),e.once("ready",()=>{e.off("error",A),t()})}))(this.options.body);const{url:t}=this.options;if(!t)throw new TypeError("Missing `url` property");if(this.requestUrl=t.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed)return void(null===(e=this[F])||void 0===e||e.destroy());for(const e of this[J])e();this[J].length=0,this.requestInitialized=!0}catch(e){if(e instanceof Z)return void this._beforeError(e);this.destroyed||this.destroy(e)}})()}static normalizeArguments(e,r,n){var o,s,a,c,g;const l=r;if(C.default.object(e)&&!C.default.urlInstance(e))r={...n,...e,...r};else{if(e&&r&&void 0!==r.url)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");r={...n,...r},void 0!==e&&(r.url=e),C.default.urlInstance(r.url)&&(r.url=new i.URL(r.url.toString()))}if(!1===r.cache&&(r.cache=void 0),!1===r.dnsCache&&(r.dnsCache=void 0),C.assert.any([C.default.string,C.default.undefined],r.method),C.assert.any([C.default.object,C.default.undefined],r.headers),C.assert.any([C.default.string,C.default.urlInstance,C.default.undefined],r.prefixUrl),C.assert.any([C.default.object,C.default.undefined],r.cookieJar),C.assert.any([C.default.object,C.default.string,C.default.undefined],r.searchParams),C.assert.any([C.default.object,C.default.string,C.default.undefined],r.cache),C.assert.any([C.default.object,C.default.number,C.default.undefined],r.timeout),C.assert.any([C.default.object,C.default.undefined],r.context),C.assert.any([C.default.object,C.default.undefined],r.hooks),C.assert.any([C.default.boolean,C.default.undefined],r.decompress),C.assert.any([C.default.boolean,C.default.undefined],r.ignoreInvalidCookies),C.assert.any([C.default.boolean,C.default.undefined],r.followRedirect),C.assert.any([C.default.number,C.default.undefined],r.maxRedirects),C.assert.any([C.default.boolean,C.default.undefined],r.throwHttpErrors),C.assert.any([C.default.boolean,C.default.undefined],r.http2),C.assert.any([C.default.boolean,C.default.undefined],r.allowGetBody),C.assert.any([C.default.string,C.default.undefined],r.localAddress),C.assert.any([D.isDnsLookupIpVersion,C.default.undefined],r.dnsLookupIpVersion),C.assert.any([C.default.object,C.default.undefined],r.https),C.assert.any([C.default.boolean,C.default.undefined],r.rejectUnauthorized),r.https&&(C.assert.any([C.default.boolean,C.default.undefined],r.https.rejectUnauthorized),C.assert.any([C.default.function_,C.default.undefined],r.https.checkServerIdentity),C.assert.any([C.default.string,C.default.object,C.default.array,C.default.undefined],r.https.certificateAuthority),C.assert.any([C.default.string,C.default.object,C.default.array,C.default.undefined],r.https.key),C.assert.any([C.default.string,C.default.object,C.default.array,C.default.undefined],r.https.certificate),C.assert.any([C.default.string,C.default.undefined],r.https.passphrase),C.assert.any([C.default.string,C.default.buffer,C.default.array,C.default.undefined],r.https.pfx)),C.assert.any([C.default.object,C.default.undefined],r.cacheOptions),C.default.string(r.method)?r.method=r.method.toUpperCase():r.method="GET",r.headers===(null==n?void 0:n.headers)?r.headers={...r.headers}:r.headers=d({...null==n?void 0:n.headers,...r.headers}),"slashes"in r)throw new TypeError("The legacy `url.Url` has been deprecated. Use `URL` instead.");if("auth"in r)throw new TypeError("Parameter `auth` is deprecated. Use `username` / `password` instead.");if("searchParams"in r&&r.searchParams&&r.searchParams!==(null==n?void 0:n.searchParams)){let e;if(C.default.string(r.searchParams)||r.searchParams instanceof i.URLSearchParams)e=new i.URLSearchParams(r.searchParams);else{!function(e){for(const t in e){const r=e[t];if(!(C.default.string(r)||C.default.number(r)||C.default.boolean(r)||C.default.null_(r)||C.default.undefined(r)))throw new TypeError(`The \`searchParams\` value '${String(r)}' must be a string, number, boolean or null`)}}(r.searchParams),e=new i.URLSearchParams;for(const t in r.searchParams){const A=r.searchParams[t];null===A?e.append(t,""):void 0!==A&&e.append(t,A)}}null===(o=null==n?void 0:n.searchParams)||void 0===o||o.forEach((t,r)=>{e.has(r)||e.append(r,t)}),r.searchParams=e}if(r.username=null!==(s=r.username)&&void 0!==s?s:"",r.password=null!==(a=r.password)&&void 0!==a?a:"",C.default.undefined(r.prefixUrl)?r.prefixUrl=null!==(c=null==n?void 0:n.prefixUrl)&&void 0!==c?c:"":(r.prefixUrl=r.prefixUrl.toString(),""===r.prefixUrl||r.prefixUrl.endsWith("/")||(r.prefixUrl+="/")),C.default.string(r.url)){if(r.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");r.url=m.default(r.prefixUrl+r.url,r)}else(C.default.undefined(r.url)&&""!==r.prefixUrl||r.protocol)&&(r.url=m.default(r.prefixUrl,r));if(r.url){"port"in r&&delete r.port;let{prefixUrl:e}=r;Object.defineProperty(r,"prefixUrl",{set:t=>{const A=r.url;if(!A.href.startsWith(t))throw new Error(`Cannot change \`prefixUrl\` from ${e} to ${t}: ${A.href}`);r.url=new i.URL(t+A.href.slice(e.length)),e=t},get:()=>e});let{protocol:t}=r.url;if("unix:"===t&&(t="http:",r.url=new i.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),"http:"!==t&&"https:"!==t)throw new oe(r);""===r.username?r.username=r.url.username:r.url.username=r.username,""===r.password?r.password=r.url.password:r.url.password=r.password}const{cookieJar:h}=r;if(h){let{setCookie:e,getCookieString:t}=h;C.assert.function_(e),C.assert.function_(t),4===e.length&&0===t.length&&(e=A.promisify(e.bind(r.cookieJar)),t=A.promisify(t.bind(r.cookieJar)),r.cookieJar={setCookie:e,getCookieString:t})}const{cache:p}=r;if(p&&(V.has(p)||V.set(p,new u((e,t)=>{const r=e[F](e,t);return C.default.promise(r)&&(r.once=(e,t)=>{if("error"===e)r.catch(t);else{if("abort"!==e)throw new Error("Unknown HTTP2 promise event: "+e);(async()=>{try{(await r).once("abort",t)}catch(e){}})()}return r}),r},p))),r.cacheOptions={...r.cacheOptions},!0===r.dnsCache)r.dnsCache=N;else if(!C.default.undefined(r.dnsCache)&&!r.dnsCache.lookup)throw new TypeError("Parameter `dnsCache` must be a CacheableLookup instance or a boolean, got "+C.default(r.dnsCache));C.default.number(r.timeout)?r.timeout={request:r.timeout}:n&&r.timeout!==n.timeout?r.timeout={...n.timeout,...r.timeout}:r.timeout={...r.timeout},r.context||(r.context={});const f=r.hooks===(null==n?void 0:n.hooks);r.hooks={...r.hooks};for(const e of t.knownHookEvents)if(e in r.hooks){if(!C.default.array(r.hooks[e]))throw new TypeError(`Parameter \`${e}\` must be an Array, got ${C.default(r.hooks[e])}`);r.hooks[e]=[...r.hooks[e]]}else r.hooks[e]=[];if(n&&!f)for(const e of t.knownHookEvents){0!==n.hooks[e].length&&(r.hooks[e]=[...n.hooks[e],...r.hooks[e]])}if("family"in r&&v.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),(null==n?void 0:n.https)&&(r.https={...n.https,...r.https}),"rejectUnauthorized"in r&&v.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in r&&v.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in r&&v.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in r&&v.default('"options.key" was never documented, please use "options.https.key"'),"cert"in r&&v.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in r&&v.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in r&&v.default('"options.pfx" was never documented, please use "options.https.pfx"'),"followRedirects"in r)throw new TypeError("The `followRedirects` option does not exist. Use `followRedirect` instead.");if(r.agent)for(const e in r.agent)if("http"!==e&&"https"!==e&&"http2"!==e)throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${e}\``);return r.maxRedirects=null!==(g=r.maxRedirects)&&void 0!==g?g:0,t.setNonEnumerableProperties([n,l],r),S.default(r,n)}_lockWrite(){const e=()=>{throw new TypeError("The payload has been already provided")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){const{options:e}=this,{headers:r}=e,A=!C.default.undefined(e.form),o=!C.default.undefined(e.json),s=!C.default.undefined(e.body),a=A||o||s,c=t.withoutBody.has(e.method)&&!("GET"===e.method&&e.allowGetBody);if(this._cannotHaveBody=c,a){if(c)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([s,A,o].filter(e=>e).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(s&&!(e.body instanceof n.Readable)&&!C.default.string(e.body)&&!C.default.buffer(e.body)&&!I.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(A&&!C.default.object(e.form))throw new TypeError("The `form` option must be an Object");{const t=!C.default.string(r["content-type"]);s?(I.default(e.body)&&t&&(r["content-type"]="multipart/form-data; boundary="+e.body.getBoundary()),this[H]=e.body):A?(t&&(r["content-type"]="application/x-www-form-urlencoded"),this[H]=new i.URLSearchParams(e.form).toString()):(t&&(r["content-type"]="application/json"),this[H]=e.stringifyJson(e.json));const n=await f.default(this[H],e.headers);C.default.undefined(r["content-length"])&&C.default.undefined(r["transfer-encoding"])&&(c||C.default.undefined(n)||(r["content-length"]=String(n)))}}else c?this._lockWrite():this._unlockWrite();this[x]=Number(r["content-length"])||void 0}async _onResponseBase(e){const{options:t}=this,{url:r}=t;this[q]=e,t.decompress&&(e=h(e));const A=e.statusCode,n=e;n.statusMessage=n.statusMessage?n.statusMessage:s.STATUS_CODES[A],n.url=t.url.toString(),n.requestUrl=this.requestUrl,n.redirectUrls=this.redirects,n.request=this,n.isFromCache=e.fromCache||!1,n.ip=this.ip,n.retryCount=this.retryCount,this[U]=n.isFromCache,this[M]=Number(e.headers["content-length"])||void 0,this[K]=e,e.once("end",()=>{this[M]=this[R],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",t=>{e.destroy(),this._beforeError(new ne(t,this))}),e.once("aborted",()=>{this._beforeError(new ne({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);const o=e.headers["set-cookie"];if(C.default.object(t.cookieJar)&&o){let e=o.map(async e=>t.cookieJar.setCookie(e,r.toString()));t.ignoreInvalidCookies&&(e=e.map(async e=>e.catch(()=>{})));try{await Promise.all(e)}catch(e){return void this._beforeError(e)}}if(t.followRedirect&&e.headers.location&&X.has(A)){e.resume(),this[F]&&(this[T](),delete this[F],this[O]());if(!(303===A&&"GET"!==t.method&&"HEAD"!==t.method)&&t.methodRewriting||(t.method="GET","body"in t&&delete t.body,"json"in t&&delete t.json,"form"in t&&delete t.form,this[H]=void 0,delete t.headers["content-length"]),this.redirects.length>=t.maxRedirects)return void this._beforeError(new $(this));try{const A=Buffer.from(e.headers.location,"binary").toString(),o=new i.URL(A,r),s=o.toString();decodeURI(s),o.hostname!==r.hostname||o.port!==r.port?("host"in t.headers&&delete t.headers.host,"cookie"in t.headers&&delete t.headers.cookie,"authorization"in t.headers&&delete t.headers.authorization,(t.username||t.password)&&(t.username="",t.password="")):(o.username=t.username,o.password=t.password),this.redirects.push(s),t.url=o;for(const e of t.hooks.beforeRedirect)await e(t,n);this.emit("redirect",n,t),await this._makeRequest()}catch(e){return void this._beforeError(e)}}else if(t.isStream&&t.throwHttpErrors&&!b.isResponseOk(n))this._beforeError(new ee(n));else{e.on("readable",()=>{this[G]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(const r of this[P])if(!r.headersSent){for(const A in e.headers){const n=!t.decompress||"content-encoding"!==A,o=e.headers[A];n&&r.setHeader(A,o)}r.statusCode=A}}}async _onResponse(e){try{await this._onResponseBase(e)}catch(e){this._beforeError(e)}}_onRequest(e){const{options:t}=this,{timeout:r,url:A}=t;g.default(e),this[T]=B.default(e,r,A);const n=t.cache?"cacheableResponse":"response";e.once(n,e=>{this._onResponse(e)}),e.once("error",t=>{var r;e.destroy(),null===(r=e.res)||void 0===r||r.removeAllListeners("end"),t=t instanceof B.TimeoutError?new Ae(t,this.timings,this):new Z(t.message,t,this),this._beforeError(t)}),this[O]=E.default(e,this,ie),this[F]=e,this.emit("uploadProgress",this.uploadProgress);const o=this[H],i=0===this.redirects.length?this:e;C.default.nodeStream(o)?(o.pipe(i),o.once("error",e=>{this._beforeError(new re(e,this))})):(this._unlockWrite(),C.default.undefined(o)?(this._cannotHaveBody||this._noPipe)&&(i.end(),this._lockWrite()):(this._writeRequest(o,void 0,()=>{}),i.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,t){return new Promise((r,A)=>{let n;Object.assign(t,y.default(e)),delete t.url;const o=V.get(t.cache)(t,async e=>{e._readableState.autoDestroy=!1,n&&(await n).emit("cacheableResponse",e),r(e)});t.url=e,o.once("error",A),o.once("request",async e=>{n=e,r(n)})})}async _makeRequest(){var e,t,r,A,n;const{options:o}=this,{headers:i}=o;for(const e in i)if(C.default.undefined(i[e]))delete i[e];else if(C.default.null_(i[e]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${e}\` header`);if(o.decompress&&C.default.undefined(i["accept-encoding"])&&(i["accept-encoding"]=W?"gzip, deflate, br":"gzip, deflate"),o.cookieJar){const e=await o.cookieJar.getCookieString(o.url.toString());C.default.nonEmptyString(e)&&(o.headers.cookie=e)}for(const e of o.hooks.beforeRequest){const t=await e(o);if(!C.default.undefined(t)){o.request=()=>t;break}}o.body&&this[H]!==o.body&&(this[H]=o.body);const{agent:a,request:g,timeout:l,url:h}=o;if(o.dnsCache&&!("lookup"in o)&&(o.lookup=o.dnsCache.lookup),"unix"===h.hostname){const e=/(?.+?):(?.+)/.exec(`${h.pathname}${h.search}`);if(null==e?void 0:e.groups){const{socketPath:t,path:r}=e.groups;Object.assign(o,{socketPath:t,path:r,host:""})}}const d="https:"===h.protocol;let f;f=o.http2?p.auto:d?c.request:s.request;const I=null!==(e=o.request)&&void 0!==e?e:f,E=o.cache?this._createCacheableRequest:I;a&&!o.http2&&(o.agent=a[d?"https":"http"]),o[F]=I,delete o.request,delete o.timeout;const B=o;if(B.shared=null===(t=o.cacheOptions)||void 0===t?void 0:t.shared,B.cacheHeuristic=null===(r=o.cacheOptions)||void 0===r?void 0:r.cacheHeuristic,B.immutableMinTimeToLive=null===(A=o.cacheOptions)||void 0===A?void 0:A.immutableMinTimeToLive,B.ignoreCargoCult=null===(n=o.cacheOptions)||void 0===n?void 0:n.ignoreCargoCult,void 0!==o.dnsLookupIpVersion)try{B.family=D.dnsLookupIpVersionToFamily(o.dnsLookupIpVersion)}catch(e){throw new Error("Invalid `dnsLookupIpVersion` option value")}o.https&&("rejectUnauthorized"in o.https&&(B.rejectUnauthorized=o.https.rejectUnauthorized),o.https.checkServerIdentity&&(B.checkServerIdentity=o.https.checkServerIdentity),o.https.certificateAuthority&&(B.ca=o.https.certificateAuthority),o.https.certificate&&(B.cert=o.https.certificate),o.https.key&&(B.key=o.https.key),o.https.passphrase&&(B.passphrase=o.https.passphrase),o.https.pfx&&(B.pfx=o.https.pfx));try{let e=await E(h,B);C.default.undefined(e)&&(e=f(h,B)),o.request=g,o.timeout=l,o.agent=a,o.https&&("rejectUnauthorized"in o.https&&delete B.rejectUnauthorized,o.https.checkServerIdentity&&delete B.checkServerIdentity,o.https.certificateAuthority&&delete B.ca,o.https.certificate&&delete B.cert,o.https.key&&delete B.key,o.https.passphrase&&delete B.passphrase,o.https.pfx&&delete B.pfx),y=e,C.default.object(y)&&!("statusCode"in y)?this._onRequest(e):this.writable?(this.once("finish",()=>{this._onResponse(e)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(e)}catch(e){if(e instanceof u.CacheError)throw new te(e,this);throw new Z(e.message,e,this)}var y}async _error(e){try{for(const t of this.options.hooks.beforeError)e=await t(e)}catch(t){e=new Z(t.message,t,this)}this.destroy(e)}_beforeError(e){if(this[Y])return;const{options:t}=this,r=this.retryCount+1;this[Y]=!0,e instanceof Z||(e=new Z(e.message,e,this));const A=e,{response:n}=A;(async()=>{if(n&&!n.body){n.setEncoding(this._readableState.encoding);try{n.rawBody=await Q.default(n),n.body=n.rawBody.toString()}catch(e){}}if(0!==this.listenerCount("retry")){let o;try{let e;n&&"retry-after"in n.headers&&(e=Number(n.headers["retry-after"]),Number.isNaN(e)?(e=Date.parse(n.headers["retry-after"])-Date.now(),e<=0&&(e=1)):e*=1e3),o=await t.retry.calculateDelay({attemptCount:r,retryOptions:t.retry,error:A,retryAfter:e,computedValue:k.default({attemptCount:r,retryOptions:t.retry,error:A,retryAfter:e,computedValue:0})})}catch(e){return void this._error(new Z(e.message,e,this))}if(o){const t=async()=>{try{for(const e of this.options.hooks.beforeRetry)await e(this.options,A,r)}catch(t){return void this._error(new Z(t.message,e,this))}this.destroyed||(this.destroy(),this.emit("retry",r,e))};return void(this[z]=setTimeout(t,o))}}this._error(A)})()}_read(){this[G]=!0;const e=this[K];if(e&&!this[Y]){let t;for(e.readableLength&&(this[G]=!1);null!==(t=e.read());){this[R]+=t.length,this[j]=!0;const e=this.downloadProgress;e.percent<1&&this.emit("downloadProgress",e),this.push(t)}}}_write(e,t,r){const A=()=>{this._writeRequest(e,t,r)};this.requestInitialized?A():this[J].push(A)}_writeRequest(e,t,r){this[F].destroyed||(this._progressCallbacks.push(()=>{this[L]+=Buffer.byteLength(e,t);const r=this.uploadProgress;r.percent<1&&this.emit("uploadProgress",r)}),this[F].write(e,t,e=>{e||0===this._progressCallbacks.length||this._progressCallbacks.shift()(),r(e)}))}_final(e){const t=()=>{for(;0!==this._progressCallbacks.length;)this._progressCallbacks.shift()();F in this?this[F].destroyed?e():this[F].end(t=>{t||(this[x]=this[L],this.emit("uploadProgress",this.uploadProgress),this[F].emit("upload-complete")),e(t)}):e()};this.requestInitialized?t():this[J].push(t)}_destroy(e,t){var r;this[Y]=!0,clearTimeout(this[z]),F in this&&(this[T](),(null===(r=this[K])||void 0===r?void 0:r.complete)||this[F].destroy()),null===e||C.default.undefined(e)||e instanceof Z||(e=new Z(e.message,e,this)),t(e)}get _isAboutToError(){return this[Y]}get ip(){var e;return null===(e=this[F])||void 0===e?void 0:e.socket.remoteAddress}get aborted(){var e,t,r;return(null!==(t=null===(e=this[F])||void 0===e?void 0:e.destroyed)&&void 0!==t?t:this.destroyed)&&!(null===(r=this[q])||void 0===r?void 0:r.complete)}get socket(){var e;return null===(e=this[F])||void 0===e?void 0:e.socket}get downloadProgress(){let e;return e=this[M]?this[R]/this[M]:this[M]===this[R]?1:0,{percent:e,transferred:this[R],total:this[M]}}get uploadProgress(){let e;return e=this[x]?this[L]/this[x]:this[x]===this[L]?1:0,{percent:e,transferred:this[L],total:this[x]}}get timings(){var e;return null===(e=this[F])||void 0===e?void 0:e.timings}get isFromCache(){return this[U]}pipe(e,t){if(this[j])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof a.ServerResponse&&this[P].add(e),super.pipe(e,t)}unpipe(e){return e instanceof a.ServerResponse&&this[P].delete(e),super.unpipe(e),this}}t.default=se},11338:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.dnsLookupIpVersionToFamily=t.isDnsLookupIpVersion=void 0;const r={auto:0,ipv4:4,ipv6:6};t.isDnsLookupIpVersion=e=>e in r,t.dnsLookupIpVersionToFamily=e=>{if(t.isDnsLookupIpVersion(e))return r[e];throw new Error("Invalid DNS lookup IP version")}},78586:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(35747),n=r(31669),o=r(7966),i=r(2920),s=n.promisify(A.stat);t.default=async(e,t)=>{if(t&&"content-length"in t)return Number(t["content-length"]);if(!e)return 0;if(o.default.string(e))return Buffer.byteLength(e);if(o.default.buffer(e))return e.length;if(i.default(e))return n.promisify(e.getLength.bind(e))();if(e instanceof A.ReadStream){const{size:t}=await s(e.path);return t}}},57854:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.default=async e=>{const t=[];let r=0;for await(const A of e)t.push(A),r+=Buffer.byteLength(A);return Buffer.isBuffer(t[0])?Buffer.concat(t,r):Buffer.from(t.join(""))}},2920:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(7966);t.default=e=>A.default.nodeStream(e)&&A.default.function_(e.getBoundary)},38206:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isResponseOk=void 0,t.isResponseOk=e=>{const{statusCode:t}=e,r=e.request.options.followRedirect?299:399;return t>=200&&t<=r||304===t}},82524:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(78835),n=["protocol","host","hostname","port","pathname","search"];t.default=(e,t)=>{var r,o;if(t.path){if(t.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(t.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(t.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(t.search&&t.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!e){if(!t.protocol)throw new TypeError("No URL protocol specified");e=`${t.protocol}//${null!==(o=null!==(r=t.hostname)&&void 0!==r?r:t.host)&&void 0!==o?o:""}`}const i=new A.URL(e);if(t.path){const e=t.path.indexOf("?");-1===e?t.pathname=t.path:(t.pathname=t.path.slice(0,e),t.search=t.path.slice(e+1)),delete t.path}for(const e of n)t[e]&&(i[e]=t[e].toString());return i}},51743:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){const A={};for(const n of r)A[n]=(...e)=>{t.emit(n,...e)},e.on(n,A[n]);return()=>{for(const t of r)e.off(t,A[t])}}},44947:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TimeoutError=void 0;const A=r(11631),n=r(70148),o=Symbol("reentry"),i=()=>{};class s extends Error{constructor(e,t){super(`Timeout awaiting '${t}' for ${e}ms`),this.event=t,this.name="TimeoutError",this.code="ETIMEDOUT"}}t.TimeoutError=s,t.default=(e,t,r)=>{if(o in e)return i;e[o]=!0;const a=[],{once:c,unhandleAll:g}=n.default(),l=(e,t,r)=>{var A;const n=setTimeout(t,e,e,r);null===(A=n.unref)||void 0===A||A.call(n);const o=()=>{clearTimeout(n)};return a.push(o),o},{host:u,hostname:h}=r,p=(t,r)=>{e.destroy(new s(t,r))},d=()=>{for(const e of a)e();g()};if(e.once("error",t=>{if(d(),0===e.listenerCount("error"))throw t}),e.once("close",d),c(e,"response",e=>{c(e,"end",d)}),void 0!==t.request&&l(t.request,p,"request"),void 0!==t.socket){const r=()=>{p(t.socket,"socket")};e.setTimeout(t.socket,r),a.push(()=>{e.removeListener("timeout",r)})}return c(e,"socket",n=>{var o;const{socketPath:i}=e;if(n.connecting){const e=Boolean(null!=i?i:0!==A.isIP(null!==(o=null!=h?h:u)&&void 0!==o?o:""));if(void 0!==t.lookup&&!e&&void 0===n.address().address){const e=l(t.lookup,p,"lookup");c(n,"lookup",e)}if(void 0!==t.connect){const r=()=>l(t.connect,p,"connect");e?c(n,"connect",r()):c(n,"lookup",e=>{null===e&&c(n,"connect",r())})}void 0!==t.secureConnect&&"https:"===r.protocol&&c(n,"connect",()=>{const e=l(t.secureConnect,p,"secureConnect");c(n,"secureConnect",e)})}if(void 0!==t.send){const r=()=>l(t.send,p,"send");n.connecting?c(n,"connect",()=>{c(e,"upload-complete",r())}):c(e,"upload-complete",r())}}),void 0!==t.response&&c(e,"upload-complete",()=>{const r=l(t.response,p,"response");c(e,"response",r)}),d}},70148:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=()=>{const e=[];return{once(t,r,A){t.once(r,A),e.push({origin:t,event:r,fn:A})},unhandleAll(){for(const t of e){const{origin:e,event:r,fn:A}=t;e.removeListener(r,A)}e.length=0}}}},50116:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(7966);t.default=e=>{const t={protocol:(e=e).protocol,hostname:A.default.string(e.hostname)&&e.hostname.startsWith("[")?e.hostname.slice(1,-1):e.hostname,host:e.host,hash:e.hash,search:e.search,pathname:e.pathname,href:e.href,path:`${e.pathname||""}${e.search||""}`};return A.default.string(e.port)&&0!==e.port.length&&(t.port=Number(e.port)),(e.username||e.password)&&(t.auth=`${e.username||""}:${e.password||""}`),t}},85551:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.default=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,t){"object"==typeof e?this.weakMap.set(e,t):this.map.set(e,t)}get(e){return"object"==typeof e?this.weakMap.get(e):this.map.get(e)}has(e){return"object"==typeof e?this.weakMap.has(e):this.map.has(e)}}},39226:function(e,t,r){"use strict";var A=this&&this.__createBinding||(Object.create?function(e,t,r,A){void 0===A&&(A=r),Object.defineProperty(e,A,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,A){void 0===A&&(A=r),e[A]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||A(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.defaultHandler=void 0;const o=r(7966),i=r(81588),s=r(93576),a=r(9048),c=r(9743),g={RequestError:i.RequestError,CacheError:i.CacheError,ReadError:i.ReadError,HTTPError:i.HTTPError,MaxRedirectsError:i.MaxRedirectsError,TimeoutError:i.TimeoutError,ParseError:i.ParseError,CancelError:i.CancelError,UnsupportedProtocolError:i.UnsupportedProtocolError,UploadError:i.UploadError},l=async e=>new Promise(t=>{setTimeout(t,e)}),{normalizeArguments:u}=a.default,h=(...e)=>{let t;for(const r of e)t=u(void 0,r,t);return t},p=e=>e.isStream?new a.default(void 0,e):i.default(e),d=e=>"defaults"in e&&"options"in e.defaults,C=["get","post","put","patch","head","delete"];t.defaultHandler=(e,t)=>t(e);const f=(e,t)=>{if(e)for(const r of e)r(t)},I=e=>{e._rawHandlers=e.handlers,e.handlers=e.handlers.map(e=>(t,r)=>{let A;const n=e(t,e=>(A=r(e),A));if(n!==A&&!t.isStream&&A){const e=n,{then:t,catch:r,finally:o}=e;Object.setPrototypeOf(e,Object.getPrototypeOf(A)),Object.defineProperties(e,Object.getOwnPropertyDescriptors(A)),e.then=t,e.catch=r,e.finally=o}return n});const r=(t,r,A)=>{var n,c;let g=0;const l=t=>e.handlers[g++](t,g===e.handlers.length?p:l);if(o.default.plainObject(t)){const e={...t,...r};a.setNonEnumerableProperties([t,r],e),r=e,t=void 0}try{let o;try{f(e.options.hooks.init,r),f(null===(n=null==r?void 0:r.hooks)||void 0===n?void 0:n.init,r)}catch(e){o=e}const s=u(t,r,null!=A?A:e.options);if(s[a.kIsNormalizedAlready]=!0,o)throw new i.RequestError(o.message,o,s);return l(s)}catch(t){if(null==r?void 0:r.isStream)throw t;return s.default(t,e.options.hooks.beforeError,null===(c=null==r?void 0:r.hooks)||void 0===c?void 0:c.beforeError)}};r.extend=(...r)=>{const A=[e.options];let n,o=[...e._rawHandlers];for(const e of r)d(e)?(A.push(e.defaults.options),o.push(...e.defaults._rawHandlers),n=e.defaults.mutableDefaults):(A.push(e),"handlers"in e&&o.push(...e.handlers),n=e.mutableDefaults);return o=o.filter(e=>e!==t.defaultHandler),0===o.length&&o.push(t.defaultHandler),I({options:h(...A),handlers:o,mutableDefaults:Boolean(n)})};const A=async function*(t,A){let n=u(t,A,e.options);n.resolveBodyOnly=!1;const i=n.pagination;if(!o.default.object(i))throw new TypeError("`options.pagination` must be implemented");const s=[];let{countLimit:a}=i,c=0;for(;c{const r=[];for await(const n of A(e,t))r.push(n);return r},r.paginate.each=A,r.stream=(e,t)=>r(e,{...t,isStream:!0});for(const e of C)r[e]=(t,A)=>r(t,{...A,method:e}),r.stream[e]=(t,A)=>r(t,{...A,method:e,isStream:!0});return Object.assign(r,g),Object.defineProperty(r,"defaults",{value:e.mutableDefaults?e:c.default(e),writable:e.mutableDefaults,configurable:e.mutableDefaults,enumerable:!0}),r.mergeOptions=h,r};t.default=I,n(r(69022),t)},48722:function(e,t,r){"use strict";var A=this&&this.__createBinding||(Object.create?function(e,t,r,A){void 0===A&&(A=r),Object.defineProperty(e,A,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,A){void 0===A&&(A=r),e[A]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||A(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0});const o=r(78835),i=r(39226),s={options:{method:"GET",retry:{limit:2,methods:["GET","PUT","HEAD","DELETE","OPTIONS","TRACE"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:["ETIMEDOUT","ECONNRESET","EADDRINUSE","ECONNREFUSED","EPIPE","ENOTFOUND","ENETUNREACH","EAI_AGAIN"],maxRetryAfter:void 0,calculateDelay:({computedValue:e})=>e},timeout:{},headers:{"user-agent":"got (https://github.com/sindresorhus/got)"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:"text",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:"",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:e=>"json"===e.request.options.responseType?e.body:JSON.parse(e.body),paginate:e=>{if(!Reflect.has(e.headers,"link"))return!1;const t=e.headers.link.split(",");let r;for(const e of t){const t=e.split(";");if(t[1].includes("next")){r=t[0].trimStart().trim(),r=r.slice(1,-1);break}}if(r){return{url:new o.URL(r)}}return!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:1/0,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:e=>JSON.parse(e),stringifyJson:e=>JSON.stringify(e),cacheOptions:{}},handlers:[i.defaultHandler],mutableDefaults:!1},a=i.default(s);t.default=a,e.exports=a,e.exports.default=a,e.exports.__esModule=!0,n(r(39226),t),n(r(81588),t)},69022:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},9743:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const A=r(7966);t.default=function e(t){for(const r of Object.values(t))(A.default.plainObject(r)||A.default.array(r))&&e(r);return Object.freeze(t)}},54595:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=new Set;t.default=e=>{r.has(e)||(r.add(e),process.emitWarning("Got: "+e,{type:"DeprecationWarning"}))}},74988:e=>{e.exports&&(e.exports=function(){var e=3,t=4,r=12,A=13,n=16,o=17;function i(e,t){void 0===t&&(t=0);var r=e.charCodeAt(t);if(55296<=r&&r<=56319&&t=1){var n=r;return 55296<=(A=e.charCodeAt(t-1))&&A<=56319?1024*(A-55296)+(n-56320)+65536:n}return r}function s(i,s,a){var c=[i].concat(s).concat([a]),g=c[c.length-2],l=a,u=c.lastIndexOf(14);if(u>1&&c.slice(1,u).every((function(t){return t==e}))&&-1==[e,A,o].indexOf(i))return 2;var h=c.lastIndexOf(t);if(h>0&&c.slice(1,h).every((function(e){return e==t}))&&-1==[r,t].indexOf(g))return c.filter((function(e){return e==t})).length%2==1?3:4;if(0==g&&1==l)return 0;if(2==g||0==g||1==g)return 14==l&&s.every((function(t){return t==e}))?2:1;if(2==l||0==l||1==l)return 1;if(6==g&&(6==l||7==l||9==l||10==l))return 0;if(!(9!=g&&7!=g||7!=l&&8!=l))return 0;if((10==g||8==g)&&8==l)return 0;if(l==e||15==l)return 0;if(5==l)return 0;if(g==r)return 0;var p=-1!=c.indexOf(e)?c.lastIndexOf(e)-1:c.length-2;return-1!=[A,o].indexOf(c[p])&&c.slice(p+1,-1).every((function(t){return t==e}))&&14==l||15==g&&-1!=[n,o].indexOf(l)?0:-1!=s.indexOf(t)?2:g==t&&l==t?0:1}function a(i){return 1536<=i&&i<=1541||1757==i||1807==i||2274==i||3406==i||69821==i||70082<=i&&i<=70083||72250==i||72326<=i&&i<=72329||73030==i?r:13==i?0:10==i?1:0<=i&&i<=9||11<=i&&i<=12||14<=i&&i<=31||127<=i&&i<=159||173==i||1564==i||6158==i||8203==i||8206<=i&&i<=8207||8232==i||8233==i||8234<=i&&i<=8238||8288<=i&&i<=8292||8293==i||8294<=i&&i<=8303||55296<=i&&i<=57343||65279==i||65520<=i&&i<=65528||65529<=i&&i<=65531||113824<=i&&i<=113827||119155<=i&&i<=119162||917504==i||917505==i||917506<=i&&i<=917535||917632<=i&&i<=917759||918e3<=i&&i<=921599?2:768<=i&&i<=879||1155<=i&&i<=1159||1160<=i&&i<=1161||1425<=i&&i<=1469||1471==i||1473<=i&&i<=1474||1476<=i&&i<=1477||1479==i||1552<=i&&i<=1562||1611<=i&&i<=1631||1648==i||1750<=i&&i<=1756||1759<=i&&i<=1764||1767<=i&&i<=1768||1770<=i&&i<=1773||1809==i||1840<=i&&i<=1866||1958<=i&&i<=1968||2027<=i&&i<=2035||2070<=i&&i<=2073||2075<=i&&i<=2083||2085<=i&&i<=2087||2089<=i&&i<=2093||2137<=i&&i<=2139||2260<=i&&i<=2273||2275<=i&&i<=2306||2362==i||2364==i||2369<=i&&i<=2376||2381==i||2385<=i&&i<=2391||2402<=i&&i<=2403||2433==i||2492==i||2494==i||2497<=i&&i<=2500||2509==i||2519==i||2530<=i&&i<=2531||2561<=i&&i<=2562||2620==i||2625<=i&&i<=2626||2631<=i&&i<=2632||2635<=i&&i<=2637||2641==i||2672<=i&&i<=2673||2677==i||2689<=i&&i<=2690||2748==i||2753<=i&&i<=2757||2759<=i&&i<=2760||2765==i||2786<=i&&i<=2787||2810<=i&&i<=2815||2817==i||2876==i||2878==i||2879==i||2881<=i&&i<=2884||2893==i||2902==i||2903==i||2914<=i&&i<=2915||2946==i||3006==i||3008==i||3021==i||3031==i||3072==i||3134<=i&&i<=3136||3142<=i&&i<=3144||3146<=i&&i<=3149||3157<=i&&i<=3158||3170<=i&&i<=3171||3201==i||3260==i||3263==i||3266==i||3270==i||3276<=i&&i<=3277||3285<=i&&i<=3286||3298<=i&&i<=3299||3328<=i&&i<=3329||3387<=i&&i<=3388||3390==i||3393<=i&&i<=3396||3405==i||3415==i||3426<=i&&i<=3427||3530==i||3535==i||3538<=i&&i<=3540||3542==i||3551==i||3633==i||3636<=i&&i<=3642||3655<=i&&i<=3662||3761==i||3764<=i&&i<=3769||3771<=i&&i<=3772||3784<=i&&i<=3789||3864<=i&&i<=3865||3893==i||3895==i||3897==i||3953<=i&&i<=3966||3968<=i&&i<=3972||3974<=i&&i<=3975||3981<=i&&i<=3991||3993<=i&&i<=4028||4038==i||4141<=i&&i<=4144||4146<=i&&i<=4151||4153<=i&&i<=4154||4157<=i&&i<=4158||4184<=i&&i<=4185||4190<=i&&i<=4192||4209<=i&&i<=4212||4226==i||4229<=i&&i<=4230||4237==i||4253==i||4957<=i&&i<=4959||5906<=i&&i<=5908||5938<=i&&i<=5940||5970<=i&&i<=5971||6002<=i&&i<=6003||6068<=i&&i<=6069||6071<=i&&i<=6077||6086==i||6089<=i&&i<=6099||6109==i||6155<=i&&i<=6157||6277<=i&&i<=6278||6313==i||6432<=i&&i<=6434||6439<=i&&i<=6440||6450==i||6457<=i&&i<=6459||6679<=i&&i<=6680||6683==i||6742==i||6744<=i&&i<=6750||6752==i||6754==i||6757<=i&&i<=6764||6771<=i&&i<=6780||6783==i||6832<=i&&i<=6845||6846==i||6912<=i&&i<=6915||6964==i||6966<=i&&i<=6970||6972==i||6978==i||7019<=i&&i<=7027||7040<=i&&i<=7041||7074<=i&&i<=7077||7080<=i&&i<=7081||7083<=i&&i<=7085||7142==i||7144<=i&&i<=7145||7149==i||7151<=i&&i<=7153||7212<=i&&i<=7219||7222<=i&&i<=7223||7376<=i&&i<=7378||7380<=i&&i<=7392||7394<=i&&i<=7400||7405==i||7412==i||7416<=i&&i<=7417||7616<=i&&i<=7673||7675<=i&&i<=7679||8204==i||8400<=i&&i<=8412||8413<=i&&i<=8416||8417==i||8418<=i&&i<=8420||8421<=i&&i<=8432||11503<=i&&i<=11505||11647==i||11744<=i&&i<=11775||12330<=i&&i<=12333||12334<=i&&i<=12335||12441<=i&&i<=12442||42607==i||42608<=i&&i<=42610||42612<=i&&i<=42621||42654<=i&&i<=42655||42736<=i&&i<=42737||43010==i||43014==i||43019==i||43045<=i&&i<=43046||43204<=i&&i<=43205||43232<=i&&i<=43249||43302<=i&&i<=43309||43335<=i&&i<=43345||43392<=i&&i<=43394||43443==i||43446<=i&&i<=43449||43452==i||43493==i||43561<=i&&i<=43566||43569<=i&&i<=43570||43573<=i&&i<=43574||43587==i||43596==i||43644==i||43696==i||43698<=i&&i<=43700||43703<=i&&i<=43704||43710<=i&&i<=43711||43713==i||43756<=i&&i<=43757||43766==i||44005==i||44008==i||44013==i||64286==i||65024<=i&&i<=65039||65056<=i&&i<=65071||65438<=i&&i<=65439||66045==i||66272==i||66422<=i&&i<=66426||68097<=i&&i<=68099||68101<=i&&i<=68102||68108<=i&&i<=68111||68152<=i&&i<=68154||68159==i||68325<=i&&i<=68326||69633==i||69688<=i&&i<=69702||69759<=i&&i<=69761||69811<=i&&i<=69814||69817<=i&&i<=69818||69888<=i&&i<=69890||69927<=i&&i<=69931||69933<=i&&i<=69940||70003==i||70016<=i&&i<=70017||70070<=i&&i<=70078||70090<=i&&i<=70092||70191<=i&&i<=70193||70196==i||70198<=i&&i<=70199||70206==i||70367==i||70371<=i&&i<=70378||70400<=i&&i<=70401||70460==i||70462==i||70464==i||70487==i||70502<=i&&i<=70508||70512<=i&&i<=70516||70712<=i&&i<=70719||70722<=i&&i<=70724||70726==i||70832==i||70835<=i&&i<=70840||70842==i||70845==i||70847<=i&&i<=70848||70850<=i&&i<=70851||71087==i||71090<=i&&i<=71093||71100<=i&&i<=71101||71103<=i&&i<=71104||71132<=i&&i<=71133||71219<=i&&i<=71226||71229==i||71231<=i&&i<=71232||71339==i||71341==i||71344<=i&&i<=71349||71351==i||71453<=i&&i<=71455||71458<=i&&i<=71461||71463<=i&&i<=71467||72193<=i&&i<=72198||72201<=i&&i<=72202||72243<=i&&i<=72248||72251<=i&&i<=72254||72263==i||72273<=i&&i<=72278||72281<=i&&i<=72283||72330<=i&&i<=72342||72344<=i&&i<=72345||72752<=i&&i<=72758||72760<=i&&i<=72765||72767==i||72850<=i&&i<=72871||72874<=i&&i<=72880||72882<=i&&i<=72883||72885<=i&&i<=72886||73009<=i&&i<=73014||73018==i||73020<=i&&i<=73021||73023<=i&&i<=73029||73031==i||92912<=i&&i<=92916||92976<=i&&i<=92982||94095<=i&&i<=94098||113821<=i&&i<=113822||119141==i||119143<=i&&i<=119145||119150<=i&&i<=119154||119163<=i&&i<=119170||119173<=i&&i<=119179||119210<=i&&i<=119213||119362<=i&&i<=119364||121344<=i&&i<=121398||121403<=i&&i<=121452||121461==i||121476==i||121499<=i&&i<=121503||121505<=i&&i<=121519||122880<=i&&i<=122886||122888<=i&&i<=122904||122907<=i&&i<=122913||122915<=i&&i<=122916||122918<=i&&i<=122922||125136<=i&&i<=125142||125252<=i&&i<=125258||917536<=i&&i<=917631||917760<=i&&i<=917999?e:127462<=i&&i<=127487?t:2307==i||2363==i||2366<=i&&i<=2368||2377<=i&&i<=2380||2382<=i&&i<=2383||2434<=i&&i<=2435||2495<=i&&i<=2496||2503<=i&&i<=2504||2507<=i&&i<=2508||2563==i||2622<=i&&i<=2624||2691==i||2750<=i&&i<=2752||2761==i||2763<=i&&i<=2764||2818<=i&&i<=2819||2880==i||2887<=i&&i<=2888||2891<=i&&i<=2892||3007==i||3009<=i&&i<=3010||3014<=i&&i<=3016||3018<=i&&i<=3020||3073<=i&&i<=3075||3137<=i&&i<=3140||3202<=i&&i<=3203||3262==i||3264<=i&&i<=3265||3267<=i&&i<=3268||3271<=i&&i<=3272||3274<=i&&i<=3275||3330<=i&&i<=3331||3391<=i&&i<=3392||3398<=i&&i<=3400||3402<=i&&i<=3404||3458<=i&&i<=3459||3536<=i&&i<=3537||3544<=i&&i<=3550||3570<=i&&i<=3571||3635==i||3763==i||3902<=i&&i<=3903||3967==i||4145==i||4155<=i&&i<=4156||4182<=i&&i<=4183||4228==i||6070==i||6078<=i&&i<=6085||6087<=i&&i<=6088||6435<=i&&i<=6438||6441<=i&&i<=6443||6448<=i&&i<=6449||6451<=i&&i<=6456||6681<=i&&i<=6682||6741==i||6743==i||6765<=i&&i<=6770||6916==i||6965==i||6971==i||6973<=i&&i<=6977||6979<=i&&i<=6980||7042==i||7073==i||7078<=i&&i<=7079||7082==i||7143==i||7146<=i&&i<=7148||7150==i||7154<=i&&i<=7155||7204<=i&&i<=7211||7220<=i&&i<=7221||7393==i||7410<=i&&i<=7411||7415==i||43043<=i&&i<=43044||43047==i||43136<=i&&i<=43137||43188<=i&&i<=43203||43346<=i&&i<=43347||43395==i||43444<=i&&i<=43445||43450<=i&&i<=43451||43453<=i&&i<=43456||43567<=i&&i<=43568||43571<=i&&i<=43572||43597==i||43755==i||43758<=i&&i<=43759||43765==i||44003<=i&&i<=44004||44006<=i&&i<=44007||44009<=i&&i<=44010||44012==i||69632==i||69634==i||69762==i||69808<=i&&i<=69810||69815<=i&&i<=69816||69932==i||70018==i||70067<=i&&i<=70069||70079<=i&&i<=70080||70188<=i&&i<=70190||70194<=i&&i<=70195||70197==i||70368<=i&&i<=70370||70402<=i&&i<=70403||70463==i||70465<=i&&i<=70468||70471<=i&&i<=70472||70475<=i&&i<=70477||70498<=i&&i<=70499||70709<=i&&i<=70711||70720<=i&&i<=70721||70725==i||70833<=i&&i<=70834||70841==i||70843<=i&&i<=70844||70846==i||70849==i||71088<=i&&i<=71089||71096<=i&&i<=71099||71102==i||71216<=i&&i<=71218||71227<=i&&i<=71228||71230==i||71340==i||71342<=i&&i<=71343||71350==i||71456<=i&&i<=71457||71462==i||72199<=i&&i<=72200||72249==i||72279<=i&&i<=72280||72343==i||72751==i||72766==i||72873==i||72881==i||72884==i||94033<=i&&i<=94078||119142==i||119149==i?5:4352<=i&&i<=4447||43360<=i&&i<=43388?6:4448<=i&&i<=4519||55216<=i&&i<=55238?7:4520<=i&&i<=4607||55243<=i&&i<=55291?8:44032==i||44060==i||44088==i||44116==i||44144==i||44172==i||44200==i||44228==i||44256==i||44284==i||44312==i||44340==i||44368==i||44396==i||44424==i||44452==i||44480==i||44508==i||44536==i||44564==i||44592==i||44620==i||44648==i||44676==i||44704==i||44732==i||44760==i||44788==i||44816==i||44844==i||44872==i||44900==i||44928==i||44956==i||44984==i||45012==i||45040==i||45068==i||45096==i||45124==i||45152==i||45180==i||45208==i||45236==i||45264==i||45292==i||45320==i||45348==i||45376==i||45404==i||45432==i||45460==i||45488==i||45516==i||45544==i||45572==i||45600==i||45628==i||45656==i||45684==i||45712==i||45740==i||45768==i||45796==i||45824==i||45852==i||45880==i||45908==i||45936==i||45964==i||45992==i||46020==i||46048==i||46076==i||46104==i||46132==i||46160==i||46188==i||46216==i||46244==i||46272==i||46300==i||46328==i||46356==i||46384==i||46412==i||46440==i||46468==i||46496==i||46524==i||46552==i||46580==i||46608==i||46636==i||46664==i||46692==i||46720==i||46748==i||46776==i||46804==i||46832==i||46860==i||46888==i||46916==i||46944==i||46972==i||47e3==i||47028==i||47056==i||47084==i||47112==i||47140==i||47168==i||47196==i||47224==i||47252==i||47280==i||47308==i||47336==i||47364==i||47392==i||47420==i||47448==i||47476==i||47504==i||47532==i||47560==i||47588==i||47616==i||47644==i||47672==i||47700==i||47728==i||47756==i||47784==i||47812==i||47840==i||47868==i||47896==i||47924==i||47952==i||47980==i||48008==i||48036==i||48064==i||48092==i||48120==i||48148==i||48176==i||48204==i||48232==i||48260==i||48288==i||48316==i||48344==i||48372==i||48400==i||48428==i||48456==i||48484==i||48512==i||48540==i||48568==i||48596==i||48624==i||48652==i||48680==i||48708==i||48736==i||48764==i||48792==i||48820==i||48848==i||48876==i||48904==i||48932==i||48960==i||48988==i||49016==i||49044==i||49072==i||49100==i||49128==i||49156==i||49184==i||49212==i||49240==i||49268==i||49296==i||49324==i||49352==i||49380==i||49408==i||49436==i||49464==i||49492==i||49520==i||49548==i||49576==i||49604==i||49632==i||49660==i||49688==i||49716==i||49744==i||49772==i||49800==i||49828==i||49856==i||49884==i||49912==i||49940==i||49968==i||49996==i||50024==i||50052==i||50080==i||50108==i||50136==i||50164==i||50192==i||50220==i||50248==i||50276==i||50304==i||50332==i||50360==i||50388==i||50416==i||50444==i||50472==i||50500==i||50528==i||50556==i||50584==i||50612==i||50640==i||50668==i||50696==i||50724==i||50752==i||50780==i||50808==i||50836==i||50864==i||50892==i||50920==i||50948==i||50976==i||51004==i||51032==i||51060==i||51088==i||51116==i||51144==i||51172==i||51200==i||51228==i||51256==i||51284==i||51312==i||51340==i||51368==i||51396==i||51424==i||51452==i||51480==i||51508==i||51536==i||51564==i||51592==i||51620==i||51648==i||51676==i||51704==i||51732==i||51760==i||51788==i||51816==i||51844==i||51872==i||51900==i||51928==i||51956==i||51984==i||52012==i||52040==i||52068==i||52096==i||52124==i||52152==i||52180==i||52208==i||52236==i||52264==i||52292==i||52320==i||52348==i||52376==i||52404==i||52432==i||52460==i||52488==i||52516==i||52544==i||52572==i||52600==i||52628==i||52656==i||52684==i||52712==i||52740==i||52768==i||52796==i||52824==i||52852==i||52880==i||52908==i||52936==i||52964==i||52992==i||53020==i||53048==i||53076==i||53104==i||53132==i||53160==i||53188==i||53216==i||53244==i||53272==i||53300==i||53328==i||53356==i||53384==i||53412==i||53440==i||53468==i||53496==i||53524==i||53552==i||53580==i||53608==i||53636==i||53664==i||53692==i||53720==i||53748==i||53776==i||53804==i||53832==i||53860==i||53888==i||53916==i||53944==i||53972==i||54e3==i||54028==i||54056==i||54084==i||54112==i||54140==i||54168==i||54196==i||54224==i||54252==i||54280==i||54308==i||54336==i||54364==i||54392==i||54420==i||54448==i||54476==i||54504==i||54532==i||54560==i||54588==i||54616==i||54644==i||54672==i||54700==i||54728==i||54756==i||54784==i||54812==i||54840==i||54868==i||54896==i||54924==i||54952==i||54980==i||55008==i||55036==i||55064==i||55092==i||55120==i||55148==i||55176==i?9:44033<=i&&i<=44059||44061<=i&&i<=44087||44089<=i&&i<=44115||44117<=i&&i<=44143||44145<=i&&i<=44171||44173<=i&&i<=44199||44201<=i&&i<=44227||44229<=i&&i<=44255||44257<=i&&i<=44283||44285<=i&&i<=44311||44313<=i&&i<=44339||44341<=i&&i<=44367||44369<=i&&i<=44395||44397<=i&&i<=44423||44425<=i&&i<=44451||44453<=i&&i<=44479||44481<=i&&i<=44507||44509<=i&&i<=44535||44537<=i&&i<=44563||44565<=i&&i<=44591||44593<=i&&i<=44619||44621<=i&&i<=44647||44649<=i&&i<=44675||44677<=i&&i<=44703||44705<=i&&i<=44731||44733<=i&&i<=44759||44761<=i&&i<=44787||44789<=i&&i<=44815||44817<=i&&i<=44843||44845<=i&&i<=44871||44873<=i&&i<=44899||44901<=i&&i<=44927||44929<=i&&i<=44955||44957<=i&&i<=44983||44985<=i&&i<=45011||45013<=i&&i<=45039||45041<=i&&i<=45067||45069<=i&&i<=45095||45097<=i&&i<=45123||45125<=i&&i<=45151||45153<=i&&i<=45179||45181<=i&&i<=45207||45209<=i&&i<=45235||45237<=i&&i<=45263||45265<=i&&i<=45291||45293<=i&&i<=45319||45321<=i&&i<=45347||45349<=i&&i<=45375||45377<=i&&i<=45403||45405<=i&&i<=45431||45433<=i&&i<=45459||45461<=i&&i<=45487||45489<=i&&i<=45515||45517<=i&&i<=45543||45545<=i&&i<=45571||45573<=i&&i<=45599||45601<=i&&i<=45627||45629<=i&&i<=45655||45657<=i&&i<=45683||45685<=i&&i<=45711||45713<=i&&i<=45739||45741<=i&&i<=45767||45769<=i&&i<=45795||45797<=i&&i<=45823||45825<=i&&i<=45851||45853<=i&&i<=45879||45881<=i&&i<=45907||45909<=i&&i<=45935||45937<=i&&i<=45963||45965<=i&&i<=45991||45993<=i&&i<=46019||46021<=i&&i<=46047||46049<=i&&i<=46075||46077<=i&&i<=46103||46105<=i&&i<=46131||46133<=i&&i<=46159||46161<=i&&i<=46187||46189<=i&&i<=46215||46217<=i&&i<=46243||46245<=i&&i<=46271||46273<=i&&i<=46299||46301<=i&&i<=46327||46329<=i&&i<=46355||46357<=i&&i<=46383||46385<=i&&i<=46411||46413<=i&&i<=46439||46441<=i&&i<=46467||46469<=i&&i<=46495||46497<=i&&i<=46523||46525<=i&&i<=46551||46553<=i&&i<=46579||46581<=i&&i<=46607||46609<=i&&i<=46635||46637<=i&&i<=46663||46665<=i&&i<=46691||46693<=i&&i<=46719||46721<=i&&i<=46747||46749<=i&&i<=46775||46777<=i&&i<=46803||46805<=i&&i<=46831||46833<=i&&i<=46859||46861<=i&&i<=46887||46889<=i&&i<=46915||46917<=i&&i<=46943||46945<=i&&i<=46971||46973<=i&&i<=46999||47001<=i&&i<=47027||47029<=i&&i<=47055||47057<=i&&i<=47083||47085<=i&&i<=47111||47113<=i&&i<=47139||47141<=i&&i<=47167||47169<=i&&i<=47195||47197<=i&&i<=47223||47225<=i&&i<=47251||47253<=i&&i<=47279||47281<=i&&i<=47307||47309<=i&&i<=47335||47337<=i&&i<=47363||47365<=i&&i<=47391||47393<=i&&i<=47419||47421<=i&&i<=47447||47449<=i&&i<=47475||47477<=i&&i<=47503||47505<=i&&i<=47531||47533<=i&&i<=47559||47561<=i&&i<=47587||47589<=i&&i<=47615||47617<=i&&i<=47643||47645<=i&&i<=47671||47673<=i&&i<=47699||47701<=i&&i<=47727||47729<=i&&i<=47755||47757<=i&&i<=47783||47785<=i&&i<=47811||47813<=i&&i<=47839||47841<=i&&i<=47867||47869<=i&&i<=47895||47897<=i&&i<=47923||47925<=i&&i<=47951||47953<=i&&i<=47979||47981<=i&&i<=48007||48009<=i&&i<=48035||48037<=i&&i<=48063||48065<=i&&i<=48091||48093<=i&&i<=48119||48121<=i&&i<=48147||48149<=i&&i<=48175||48177<=i&&i<=48203||48205<=i&&i<=48231||48233<=i&&i<=48259||48261<=i&&i<=48287||48289<=i&&i<=48315||48317<=i&&i<=48343||48345<=i&&i<=48371||48373<=i&&i<=48399||48401<=i&&i<=48427||48429<=i&&i<=48455||48457<=i&&i<=48483||48485<=i&&i<=48511||48513<=i&&i<=48539||48541<=i&&i<=48567||48569<=i&&i<=48595||48597<=i&&i<=48623||48625<=i&&i<=48651||48653<=i&&i<=48679||48681<=i&&i<=48707||48709<=i&&i<=48735||48737<=i&&i<=48763||48765<=i&&i<=48791||48793<=i&&i<=48819||48821<=i&&i<=48847||48849<=i&&i<=48875||48877<=i&&i<=48903||48905<=i&&i<=48931||48933<=i&&i<=48959||48961<=i&&i<=48987||48989<=i&&i<=49015||49017<=i&&i<=49043||49045<=i&&i<=49071||49073<=i&&i<=49099||49101<=i&&i<=49127||49129<=i&&i<=49155||49157<=i&&i<=49183||49185<=i&&i<=49211||49213<=i&&i<=49239||49241<=i&&i<=49267||49269<=i&&i<=49295||49297<=i&&i<=49323||49325<=i&&i<=49351||49353<=i&&i<=49379||49381<=i&&i<=49407||49409<=i&&i<=49435||49437<=i&&i<=49463||49465<=i&&i<=49491||49493<=i&&i<=49519||49521<=i&&i<=49547||49549<=i&&i<=49575||49577<=i&&i<=49603||49605<=i&&i<=49631||49633<=i&&i<=49659||49661<=i&&i<=49687||49689<=i&&i<=49715||49717<=i&&i<=49743||49745<=i&&i<=49771||49773<=i&&i<=49799||49801<=i&&i<=49827||49829<=i&&i<=49855||49857<=i&&i<=49883||49885<=i&&i<=49911||49913<=i&&i<=49939||49941<=i&&i<=49967||49969<=i&&i<=49995||49997<=i&&i<=50023||50025<=i&&i<=50051||50053<=i&&i<=50079||50081<=i&&i<=50107||50109<=i&&i<=50135||50137<=i&&i<=50163||50165<=i&&i<=50191||50193<=i&&i<=50219||50221<=i&&i<=50247||50249<=i&&i<=50275||50277<=i&&i<=50303||50305<=i&&i<=50331||50333<=i&&i<=50359||50361<=i&&i<=50387||50389<=i&&i<=50415||50417<=i&&i<=50443||50445<=i&&i<=50471||50473<=i&&i<=50499||50501<=i&&i<=50527||50529<=i&&i<=50555||50557<=i&&i<=50583||50585<=i&&i<=50611||50613<=i&&i<=50639||50641<=i&&i<=50667||50669<=i&&i<=50695||50697<=i&&i<=50723||50725<=i&&i<=50751||50753<=i&&i<=50779||50781<=i&&i<=50807||50809<=i&&i<=50835||50837<=i&&i<=50863||50865<=i&&i<=50891||50893<=i&&i<=50919||50921<=i&&i<=50947||50949<=i&&i<=50975||50977<=i&&i<=51003||51005<=i&&i<=51031||51033<=i&&i<=51059||51061<=i&&i<=51087||51089<=i&&i<=51115||51117<=i&&i<=51143||51145<=i&&i<=51171||51173<=i&&i<=51199||51201<=i&&i<=51227||51229<=i&&i<=51255||51257<=i&&i<=51283||51285<=i&&i<=51311||51313<=i&&i<=51339||51341<=i&&i<=51367||51369<=i&&i<=51395||51397<=i&&i<=51423||51425<=i&&i<=51451||51453<=i&&i<=51479||51481<=i&&i<=51507||51509<=i&&i<=51535||51537<=i&&i<=51563||51565<=i&&i<=51591||51593<=i&&i<=51619||51621<=i&&i<=51647||51649<=i&&i<=51675||51677<=i&&i<=51703||51705<=i&&i<=51731||51733<=i&&i<=51759||51761<=i&&i<=51787||51789<=i&&i<=51815||51817<=i&&i<=51843||51845<=i&&i<=51871||51873<=i&&i<=51899||51901<=i&&i<=51927||51929<=i&&i<=51955||51957<=i&&i<=51983||51985<=i&&i<=52011||52013<=i&&i<=52039||52041<=i&&i<=52067||52069<=i&&i<=52095||52097<=i&&i<=52123||52125<=i&&i<=52151||52153<=i&&i<=52179||52181<=i&&i<=52207||52209<=i&&i<=52235||52237<=i&&i<=52263||52265<=i&&i<=52291||52293<=i&&i<=52319||52321<=i&&i<=52347||52349<=i&&i<=52375||52377<=i&&i<=52403||52405<=i&&i<=52431||52433<=i&&i<=52459||52461<=i&&i<=52487||52489<=i&&i<=52515||52517<=i&&i<=52543||52545<=i&&i<=52571||52573<=i&&i<=52599||52601<=i&&i<=52627||52629<=i&&i<=52655||52657<=i&&i<=52683||52685<=i&&i<=52711||52713<=i&&i<=52739||52741<=i&&i<=52767||52769<=i&&i<=52795||52797<=i&&i<=52823||52825<=i&&i<=52851||52853<=i&&i<=52879||52881<=i&&i<=52907||52909<=i&&i<=52935||52937<=i&&i<=52963||52965<=i&&i<=52991||52993<=i&&i<=53019||53021<=i&&i<=53047||53049<=i&&i<=53075||53077<=i&&i<=53103||53105<=i&&i<=53131||53133<=i&&i<=53159||53161<=i&&i<=53187||53189<=i&&i<=53215||53217<=i&&i<=53243||53245<=i&&i<=53271||53273<=i&&i<=53299||53301<=i&&i<=53327||53329<=i&&i<=53355||53357<=i&&i<=53383||53385<=i&&i<=53411||53413<=i&&i<=53439||53441<=i&&i<=53467||53469<=i&&i<=53495||53497<=i&&i<=53523||53525<=i&&i<=53551||53553<=i&&i<=53579||53581<=i&&i<=53607||53609<=i&&i<=53635||53637<=i&&i<=53663||53665<=i&&i<=53691||53693<=i&&i<=53719||53721<=i&&i<=53747||53749<=i&&i<=53775||53777<=i&&i<=53803||53805<=i&&i<=53831||53833<=i&&i<=53859||53861<=i&&i<=53887||53889<=i&&i<=53915||53917<=i&&i<=53943||53945<=i&&i<=53971||53973<=i&&i<=53999||54001<=i&&i<=54027||54029<=i&&i<=54055||54057<=i&&i<=54083||54085<=i&&i<=54111||54113<=i&&i<=54139||54141<=i&&i<=54167||54169<=i&&i<=54195||54197<=i&&i<=54223||54225<=i&&i<=54251||54253<=i&&i<=54279||54281<=i&&i<=54307||54309<=i&&i<=54335||54337<=i&&i<=54363||54365<=i&&i<=54391||54393<=i&&i<=54419||54421<=i&&i<=54447||54449<=i&&i<=54475||54477<=i&&i<=54503||54505<=i&&i<=54531||54533<=i&&i<=54559||54561<=i&&i<=54587||54589<=i&&i<=54615||54617<=i&&i<=54643||54645<=i&&i<=54671||54673<=i&&i<=54699||54701<=i&&i<=54727||54729<=i&&i<=54755||54757<=i&&i<=54783||54785<=i&&i<=54811||54813<=i&&i<=54839||54841<=i&&i<=54867||54869<=i&&i<=54895||54897<=i&&i<=54923||54925<=i&&i<=54951||54953<=i&&i<=54979||54981<=i&&i<=55007||55009<=i&&i<=55035||55037<=i&&i<=55063||55065<=i&&i<=55091||55093<=i&&i<=55119||55121<=i&&i<=55147||55149<=i&&i<=55175||55177<=i&&i<=55203?10:9757==i||9977==i||9994<=i&&i<=9997||127877==i||127938<=i&&i<=127940||127943==i||127946<=i&&i<=127948||128066<=i&&i<=128067||128070<=i&&i<=128080||128110==i||128112<=i&&i<=128120||128124==i||128129<=i&&i<=128131||128133<=i&&i<=128135||128170==i||128372<=i&&i<=128373||128378==i||128400==i||128405<=i&&i<=128406||128581<=i&&i<=128583||128587<=i&&i<=128591||128675==i||128692<=i&&i<=128694||128704==i||128716==i||129304<=i&&i<=129308||129310<=i&&i<=129311||129318==i||129328<=i&&i<=129337||129341<=i&&i<=129342||129489<=i&&i<=129501?A:127995<=i&&i<=127999?14:8205==i?15:9792==i||9794==i||9877<=i&&i<=9878||9992==i||10084==i||127752==i||127806==i||127859==i||127891==i||127908==i||127912==i||127979==i||127981==i||128139==i||128187<=i&&i<=128188||128295==i||128300==i||128488==i||128640==i||128658==i?n:128102<=i&&i<=128105?o:11}return this.nextBreak=function(e,t){if(void 0===t&&(t=0),t<0)return 0;if(t>=e.length-1)return e.length;for(var r,A,n=a(i(e,t)),o=[],c=t+1;c{"use strict";e.exports=(e,t=process.argv)=>{const r=e.startsWith("-")?"":1===e.length?"-":"--",A=t.indexOf(r+e),n=t.indexOf("--");return-1!==A&&(-1===n||A{"use strict";const t=[200,203,204,206,300,301,404,405,410,414,501],r=[200,203,204,300,301,302,303,307,308,404,405,410,414,501],A={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},n={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function o(e){const t={};if(!e)return t;const r=e.trim().split(/\s*,\s*/);for(const e of r){const[r,A]=e.split(/\s*=\s*/,2);t[r]=void 0===A||A.replace(/^"|"$/g,"")}return t}function i(e){let t=[];for(const r in e){const A=e[r];t.push(!0===A?r:r+"="+A)}if(t.length)return t.join(", ")}e.exports=class{constructor(e,t,{shared:r,cacheHeuristic:A,immutableMinTimeToLive:n,ignoreCargoCult:s,trustServerDate:a,_fromObject:c}={}){if(c)this._fromObject(c);else{if(!t||!t.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=!1!==r,this._trustServerDate=void 0===a||a,this._cacheHeuristic=void 0!==A?A:.1,this._immutableMinTtl=void 0!==n?n:864e5,this._status="status"in t?t.status:200,this._resHeaders=t.headers,this._rescc=o(t.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=t.headers.vary?e.headers:null,this._reqcc=o(e.headers["cache-control"]),s&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":i(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),!t.headers["cache-control"]&&/no-cache/.test(t.headers.pragma)&&(this._rescc["no-cache"]=!0)}}now(){return Date.now()}storable(){return!(this._reqcc["no-store"]||!("GET"===this._method||"HEAD"===this._method||"POST"===this._method&&this._hasExplicitExpiration())||-1===r.indexOf(this._status)||this._rescc["no-store"]||this._isShared&&this._rescc.private||this._isShared&&!this._noAuthorization&&!this._allowsStoringAuthenticated()||!(this._resHeaders.expires||this._rescc.public||this._rescc["max-age"]||this._rescc["s-maxage"]||-1!==t.indexOf(this._status)))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);const t=o(e.headers["cache-control"]);if(t["no-cache"]||/no-cache/.test(e.headers.pragma))return!1;if(t["max-age"]&&this.age()>t["max-age"])return!1;if(t["min-fresh"]&&this.timeToLive()<1e3*t["min-fresh"])return!1;if(this.stale()){if(!(t["max-stale"]&&!this._rescc["must-revalidate"]&&(!0===t["max-stale"]||t["max-stale"]>this.age()-this.maxAge())))return!1}return this._requestMatches(e,!1)}_requestMatches(e,t){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||t&&"HEAD"===e.method)&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if("*"===this._resHeaders.vary)return!1;const t=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(const r of t)if(e.headers[r]!==this._reqHeaders[r])return!1;return!0}_copyWithoutHopByHopHeaders(e){const t={};for(const r in e)A[r]||(t[r]=e[r]);if(e.connection){const r=e.connection.trim().split(/\s*,\s*/);for(const e of r)delete t[e]}if(t.warning){const e=t.warning.split(/,/).filter(e=>!/^\s*1[0-9][0-9]/.test(e));e.length?t.warning=e.join(",").trim():delete t.warning}return t}responseHeaders(){const e=this._copyWithoutHopByHopHeaders(this._resHeaders),t=this.age();return t>86400&&!this._hasExplicitExpiration()&&this.maxAge()>86400&&(e.warning=(e.warning?e.warning+", ":"")+'113 - "rfc7234 5.5.4"'),e.age=""+Math.round(t),e.date=new Date(this.now()).toUTCString(),e}date(){return this._trustServerDate?this._serverDate():this._responseTime}_serverDate(){const e=Date.parse(this._resHeaders.date);if(isFinite(e)){const t=288e5;if(Math.abs(this._responseTime-e)e&&(e=t)}return e+(this.now()-this._responseTime)/1e3}_ageValue(){const e=parseInt(this._resHeaders.age);return isFinite(e)?e:0}maxAge(){if(!this.storable()||this._rescc["no-cache"])return 0;if(this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable)return 0;if("*"===this._resHeaders.vary)return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return parseInt(this._rescc["s-maxage"],10)}if(this._rescc["max-age"])return parseInt(this._rescc["max-age"],10);const e=this._rescc.immutable?this._immutableMinTtl:0,t=this._serverDate();if(this._resHeaders.expires){const r=Date.parse(this._resHeaders.expires);return Number.isNaN(r)||rr)return Math.max(e,(t-r)/1e3*this._cacheHeuristic)}return e}timeToLive(){return 1e3*Math.max(0,this.maxAge()-this.age())}stale(){return this.maxAge()<=this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||1!==e.v)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=void 0!==e.imm?e.imm:864e5,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);const t=this._copyWithoutHopByHopHeaders(e.headers);if(delete t["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete t["if-none-match"],delete t["if-modified-since"],t;this._resHeaders.etag&&(t["if-none-match"]=t["if-none-match"]?`${t["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag);if(t["accept-ranges"]||t["if-match"]||t["if-unmodified-since"]||this._method&&"GET"!=this._method){if(delete t["if-modified-since"],t["if-none-match"]){const e=t["if-none-match"].split(/,/).filter(e=>!/^\s*W\//.test(e));e.length?t["if-none-match"]=e.join(",").trim():delete t["if-none-match"]}}else this._resHeaders["last-modified"]&&!t["if-modified-since"]&&(t["if-modified-since"]=this._resHeaders["last-modified"]);return t}revalidatedPolicy(e,t){if(this._assertRequestHasHeaders(e),!t||!t.headers)throw Error("Response headers missing");let r=!1;if(void 0!==t.status&&304!=t.status?r=!1:t.headers.etag&&!/^\s*W\//.test(t.headers.etag)?r=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===t.headers.etag:this._resHeaders.etag&&t.headers.etag?r=this._resHeaders.etag.replace(/^\s*W\//,"")===t.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?r=this._resHeaders["last-modified"]===t.headers["last-modified"]:this._resHeaders.etag||this._resHeaders["last-modified"]||t.headers.etag||t.headers["last-modified"]||(r=!0),!r)return{policy:new this.constructor(e,t),modified:304!=t.status,matches:!1};const A={};for(const e in this._resHeaders)A[e]=e in t.headers&&!n[e]?t.headers[e]:this._resHeaders[e];const o=Object.assign({},t,{status:this._status,method:this._method,headers:A});return{policy:new this.constructor(e,o,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl,trustServerDate:this._trustServerDate}),modified:!1,matches:!0}}}},94935:(e,t,r)=>{"use strict";const A=r(28614),n=r(4016),o=r(97565),i=r(49601),s=Symbol("currentStreamsCount"),a=Symbol("request"),c=Symbol("cachedOriginSet"),g=Symbol("gracefullyClosing"),l=["maxDeflateDynamicTableSize","maxSessionMemory","maxHeaderListPairs","maxOutstandingPings","maxReservedRemoteStreams","maxSendHeaderBlockLength","paddingStrategy","localAddress","path","rejectUnauthorized","minDHSize","ca","cert","clientCertEngine","ciphers","key","pfx","servername","minVersion","maxVersion","secureProtocol","crl","honorCipherOrder","ecdhCurve","dhparam","secureOptions","sessionIdContext"],u=(e,t)=>e.remoteSettings.maxConcurrentStreams>t.remoteSettings.maxConcurrentStreams,h=(e,t)=>{for(const r of e)r[c].lengtht[c].includes(e))&&r[s]+t[s]<=t.remoteSettings.maxConcurrentStreams&&d(r)},p=({agent:e,isFree:t})=>{const r={};for(const A in e.sessions){const n=e.sessions[A].filter(e=>{const r=e[C.kCurrentStreamsCount]{e[g]=!0,0===e[s]&&e.close()};class C extends A{constructor({timeout:e=6e4,maxSessions:t=1/0,maxFreeSessions:r=10,maxCachedTlsSessions:A=100}={}){super(),this.sessions={},this.queue={},this.timeout=e,this.maxSessions=t,this.maxFreeSessions=r,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new i({maxSize:A})}static normalizeOrigin(e,t){return"string"==typeof e&&(e=new URL(e)),t&&e.hostname!==t&&(e.hostname=t),e.origin}normalizeOptions(e){let t="";if(e)for(const r of l)e[r]&&(t+=":"+e[r]);return t}_tryToCreateNewSession(e,t){if(!(e in this.queue)||!(t in this.queue[e]))return;const r=this.queue[e][t];this._sessionsCount{Array.isArray(r)?(r=[...r],A()):r=[{resolve:A,reject:n}];const i=this.normalizeOptions(t),l=C.normalizeOrigin(e,t&&t.servername);if(void 0===l){for(const{reject:e}of r)e(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(i in this.sessions){const e=this.sessions[i];let t,A=-1,n=-1;for(const r of e){const e=r.remoteSettings.maxConcurrentStreams;if(e=e||r[g]||r.destroyed)continue;t||(A=e),o>n&&(t=r,n=o)}}if(t){if(1!==r.length){for(const{reject:e}of r){e(new Error(`Expected the length of listeners to be 1, got ${r.length}.\nPlease report this to https://github.com/szmarczak/http2-wrapper/`))}return}return void r[0].resolve(t)}}if(i in this.queue){if(l in this.queue[i])return this.queue[i][l].listeners.push(...r),void this._tryToCreateNewSession(i,l)}else this.queue[i]={};const p=()=>{i in this.queue&&this.queue[i][l]===f&&(delete this.queue[i][l],0===Object.keys(this.queue[i]).length&&delete this.queue[i])},f=()=>{const A=`${l}:${i}`;let n=!1;try{const C=o.connect(e,{createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(A),...t});C[s]=0,C[g]=!1;const I=()=>C[s]{this.tlsSessionCache.set(A,e)}),C.once("error",e=>{for(const{reject:t}of r)t(e);this.tlsSessionCache.delete(A)}),C.setTimeout(this.timeout,()=>{C.destroy()}),C.once("close",()=>{if(n){E&&this._freeSessionsCount--,this._sessionsCount--;const e=this.sessions[i];e.splice(e.indexOf(C),1),0===e.length&&delete this.sessions[i]}else{const e=new Error("Session closed without receiving a SETTINGS frame");e.code="HTTP2WRAPPER_NOSETTINGS";for(const{reject:t}of r)t(e);p()}this._tryToCreateNewSession(i,l)});const B=()=>{if(i in this.queue&&I())for(const e of C[c])if(e in this.queue[i]){const{listeners:t}=this.queue[i][e];for(;0!==t.length&&I();)t.shift().resolve(C);const r=this.queue[i];if(0===r[e].listeners.length&&(delete r[e],0===Object.keys(r).length)){delete this.queue[i];break}if(!I())break}};C.on("origin",()=>{C[c]=C.originSet,I()&&(B(),h(this.sessions[i],C))}),C.once("remoteSettings",()=>{if(C.ref(),C.unref(),this._sessionsCount++,f.destroyed){const e=new Error("Agent has been destroyed");for(const t of r)t.reject(e);C.destroy()}else{C[c]=C.originSet;{const e=this.sessions;if(i in e){const t=e[i];t.splice(((e,t,r)=>{let A=0,n=e.length;for(;A>>1;r(e[o],t)?A=o+1:n=o}return A})(t,C,u),0,C)}else e[i]=[C]}this._freeSessionsCount+=1,n=!0,this.emit("session",C),B(),p(),0===C[s]&&this._freeSessionsCount>this.maxFreeSessions&&C.close(),0!==r.length&&(this.getSession(l,t,r),r.length=0),C.on("remoteSettings",()=>{B(),h(this.sessions[i],C)})}}),C[a]=C.request,C.request=(e,t)=>{if(C[g])throw new Error("The session is gracefully closing. No new streams are allowed.");const r=C[a](e,t);return C.ref(),++C[s],C[s]===C.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,r.once("close",()=>{if(E=I(),--C[s],!C.destroyed&&!C.closed&&(((e,t)=>{for(const r of e)t[c].lengthr[c].includes(e))&&t[s]+r[s]<=r.remoteSettings.maxConcurrentStreams&&d(t)})(this.sessions[i],C),I()&&!C.closed)){E||(this._freeSessionsCount++,E=!0);const e=0===C[s];e&&C.unref(),e&&(this._freeSessionsCount>this.maxFreeSessions||C[g])?C.close():(h(this.sessions[i],C),B())}}),r}}catch(e){for(const t of r)t.reject(e);p()}};f.listeners=r,f.completed=!1,f.destroyed=!1,this.queue[i][l]=f,this._tryToCreateNewSession(i,l)})}request(e,t,r,A){return new Promise((n,o)=>{this.getSession(e,t,[{reject:o,resolve:e=>{try{n(e.request(r,A))}catch(e){o(e)}}}])})}createConnection(e,t){return C.connect(e,t)}static connect(e,t){t.ALPNProtocols=["h2"];const r=e.port||443,A=e.hostname||e.host;return void 0===t.servername&&(t.servername=A),n.connect(r,A,t)}closeFreeSessions(){for(const e of Object.values(this.sessions))for(const t of e)0===t[s]&&t.close()}destroy(e){for(const t of Object.values(this.sessions))for(const r of t)r.destroy(e);for(const e of Object.values(this.queue))for(const t of Object.values(e))t.destroyed=!0;this.queue={}}get freeSessions(){return p({agent:this,isFree:!0})}get busySessions(){return p({agent:this,isFree:!1})}}C.kCurrentStreamsCount=s,C.kGracefullyClosing=g,e.exports={Agent:C,globalAgent:new C}},2398:(e,t,r)=>{"use strict";const A=r(98605),n=r(57211),o=r(19476),i=r(49601),s=r(33134),a=r(5209),c=r(50075),g=new i({maxSize:100}),l=new Map,u=(e,t,r)=>{t._httpMessage={shouldKeepAlive:!0};const A=()=>{e.emit("free",t,r)};t.on("free",A);const n=()=>{e.removeSocket(t,r)};t.on("close",n);const o=()=>{e.removeSocket(t,r),t.off("close",n),t.off("free",A),t.off("agentRemove",o)};t.on("agentRemove",o),e.emit("free",t,r)};e.exports=async(e,t,r)=>{if(("string"==typeof e||e instanceof URL)&&(e=c(new URL(e))),"function"==typeof t&&(r=t,t=void 0),t={ALPNProtocols:["h2","http/1.1"],...e,...t,resolveSocket:!0},!Array.isArray(t.ALPNProtocols)||0===t.ALPNProtocols.length)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");t.protocol=t.protocol||"https:";const i="https:"===t.protocol;t.host=t.hostname||t.host||"localhost",t.session=t.tlsSession,t.servername=t.servername||a(t),t.port=t.port||(i?443:80),t._defaultAgent=i?n.globalAgent:A.globalAgent;const h=t.agent;if(h){if(h.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");t.agent=h[i?"https":"http"]}if(i){if("h2"===await(async e=>{const t=`${e.host}:${e.port}:${e.ALPNProtocols.sort()}`;if(!g.has(t)){if(l.has(t)){return(await l.get(t)).alpnProtocol}const{path:r,agent:A}=e;e.path=e.socketPath;const i=o(e);l.set(t,i);try{const{socket:o,alpnProtocol:s}=await i;if(g.set(t,s),e.path=r,"h2"===s)o.destroy();else{const{globalAgent:t}=n,r=n.Agent.prototype.createConnection;A?A.createConnection===r?u(A,o,e):o.destroy():t.createConnection===r?u(t,o,e):o.destroy()}return l.delete(t),s}catch(e){throw l.delete(t),e}}return g.get(t)})(t))return h&&(t.agent=h.http2),new s(t,r)}return A.request(t,r)},e.exports.protocolCache=g},33134:(e,t,r)=>{"use strict";const A=r(97565),{Writable:n}=r(92413),{Agent:o,globalAgent:i}=r(94935),s=r(53433),a=r(50075),c=r(66192),g=r(50978),{ERR_INVALID_ARG_TYPE:l,ERR_INVALID_PROTOCOL:u,ERR_HTTP_HEADERS_SENT:h,ERR_INVALID_HTTP_TOKEN:p,ERR_HTTP_INVALID_HEADER_VALUE:d,ERR_INVALID_CHAR:C}=r(64080),{HTTP2_HEADER_STATUS:f,HTTP2_HEADER_METHOD:I,HTTP2_HEADER_PATH:E,HTTP2_METHOD_CONNECT:B}=A.constants,y=Symbol("headers"),m=Symbol("origin"),w=Symbol("session"),Q=Symbol("options"),D=Symbol("flushedHeaders"),b=Symbol("jobs"),v=/^[\^`\-\w!#$%&*+.|~]+$/,S=/[^\t\u0020-\u007E\u0080-\u00FF]/;e.exports=class extends n{constructor(e,t,r){super({autoDestroy:!1});const A="string"==typeof e||e instanceof URL;if(A&&(e=a(e instanceof URL?e:new URL(e))),"function"==typeof t||void 0===t?(r=t,t=A?e:{...e}):t={...e,...t},t.h2session)this[w]=t.h2session;else if(!1===t.agent)this.agent=new o({maxFreeSessions:0});else if(void 0===t.agent||null===t.agent)"function"==typeof t.createConnection?(this.agent=new o({maxFreeSessions:0}),this.agent.createConnection=t.createConnection):this.agent=i;else{if("function"!=typeof t.agent.request)throw new l("options.agent",["Agent-like Object","undefined","false"],t.agent);this.agent=t.agent}if(t.protocol&&"https:"!==t.protocol)throw new u(t.protocol,"https:");const n=t.port||t.defaultPort||this.agent&&this.agent.defaultPort||443,s=t.hostname||t.host||"localhost";delete t.hostname,delete t.host,delete t.port;const{timeout:c}=t;if(t.timeout=void 0,this[y]=Object.create(null),this[b]=[],this.socket=null,this.connection=null,this.method=t.method||"GET",this.path=t.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,t.headers)for(const[e,r]of Object.entries(t.headers))this.setHeader(e,r);t.auth&&!("authorization"in this[y])&&(this[y].authorization="Basic "+Buffer.from(t.auth).toString("base64")),t.session=t.tlsSession,t.path=t.socketPath,this[Q]=t,443===n?(this[m]="https://"+s,":authority"in this[y]||(this[y][":authority"]=s)):(this[m]=`https://${s}:${n}`,":authority"in this[y]||(this[y][":authority"]=`${s}:${n}`)),c&&this.setTimeout(c),r&&this.once("response",r),this[D]=!1}get method(){return this[y][I]}set method(e){e&&(this[y][I]=e.toUpperCase())}get path(){return this[y][E]}set path(e){e&&(this[y][E]=e)}get _mustNotHaveABody(){return"GET"===this.method||"HEAD"===this.method||"DELETE"===this.method}_write(e,t,r){if(this._mustNotHaveABody)return void r(new Error("The GET, HEAD and DELETE methods must NOT have a body"));this.flushHeaders();const A=()=>this._request.write(e,t,r);this._request?A():this[b].push(A)}_final(e){if(this.destroyed)return;this.flushHeaders();const t=()=>{this._mustNotHaveABody?e():this._request.end(e)};this._request?t():this[b].push(t)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,t){this.res&&this.res._dump(),this._request&&this._request.destroy(),t(e)}async flushHeaders(){if(this[D]||this.destroyed)return;this[D]=!0;const e=this.method===B,t=t=>{if(this._request=t,this.destroyed)return void t.destroy();e||c(t,this,["timeout","continue","close","error"]);const r=e=>(...t)=>{this.writable||this.destroyed?this.once("finish",()=>{e(...t)}):e(...t)};t.once("response",r((r,A,n)=>{const o=new s(this.socket,t.readableHighWaterMark);this.res=o,o.req=this,o.statusCode=r[f],o.headers=r,o.rawHeaders=n,o.once("end",()=>{this.aborted?(o.aborted=!0,o.emit("aborted")):(o.complete=!0,o.socket=null,o.connection=null)}),e?(o.upgrade=!0,this.emit("connect",o,t,Buffer.alloc(0))?this.emit("close"):t.destroy()):(t.on("data",e=>{o._dumped||o.push(e)||t.pause()}),t.once("end",()=>{o.push(null)}),this.emit("response",o)||o._dump())})),t.once("headers",r(e=>this.emit("information",{statusCode:e[f]}))),t.once("trailers",r((e,t,r)=>{const{res:A}=this;A.trailers=e,A.rawTrailers=r}));const{socket:A}=t.session;this.socket=A,this.connection=A;for(const e of this[b])e();this.emit("socket",this.socket)};if(this[w])try{t(this[w].request(this[y]))}catch(e){this.emit("error",e)}else{this.reusedSocket=!0;try{t(await this.agent.request(this[m],this[Q],this[y]))}catch(e){this.emit("error",e)}}}getHeader(e){if("string"!=typeof e)throw new l("name","string",e);return this[y][e.toLowerCase()]}get headersSent(){return this[D]}removeHeader(e){if("string"!=typeof e)throw new l("name","string",e);if(this.headersSent)throw new h("remove");delete this[y][e.toLowerCase()]}setHeader(e,t){if(this.headersSent)throw new h("set");if("string"!=typeof e||!v.test(e)&&!g(e))throw new p("Header name",e);if(void 0===t)throw new d(t,e);if(S.test(t))throw new C("header content",e);this[y][e.toLowerCase()]=t}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,t){const r=()=>this._request.setTimeout(e,t);return this._request?r():this[b].push(r),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}}},53433:(e,t,r)=>{"use strict";const{Readable:A}=r(92413);e.exports=class extends A{constructor(e,t){super({highWaterMark:t,autoDestroy:!1}),this.statusCode=null,this.statusMessage="",this.httpVersion="2.0",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,t){return this.req.setTimeout(e,t),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}}},92353:(e,t,r)=>{"use strict";const A=r(97565),n=r(94935),o=r(33134),i=r(53433),s=r(2398);e.exports={...A,ClientRequest:o,IncomingMessage:i,...n,request:(e,t,r)=>new o(e,t,r),get:(e,t,r)=>{const A=new o(e,t,r);return A.end(),A},auto:s}},5209:(e,t,r)=>{"use strict";const A=r(11631);e.exports=e=>{let t=e.host;const r=e.headers&&e.headers.host;if(r)if(r.startsWith("[")){t=-1===r.indexOf("]")?r:r.slice(1,-1)}else t=r.split(":",1)[0];return A.isIP(t)?"":t}},64080:e=>{"use strict";const t=(t,r,A)=>{e.exports[r]=class extends t{constructor(...e){super("string"==typeof A?A:A(e)),this.name=`${super.name} [${r}]`,this.code=r}}};t(TypeError,"ERR_INVALID_ARG_TYPE",e=>{const t=e[0].includes(".")?"property":"argument";let r=e[1];const A=Array.isArray(r);return A&&(r=`${r.slice(0,-1).join(", ")} or ${r.slice(-1)}`),`The "${e[0]}" ${t} must be ${A?"one of":"of"} type ${r}. Received ${typeof e[2]}`}),t(TypeError,"ERR_INVALID_PROTOCOL",e=>`Protocol "${e[0]}" not supported. Expected "${e[1]}"`),t(Error,"ERR_HTTP_HEADERS_SENT",e=>`Cannot ${e[0]} headers after they are sent to the client`),t(TypeError,"ERR_INVALID_HTTP_TOKEN",e=>`${e[0]} must be a valid HTTP token [${e[1]}]`),t(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",e=>`Invalid value "${e[0]} for header "${e[1]}"`),t(TypeError,"ERR_INVALID_CHAR",e=>`Invalid character in ${e[0]} [${e[1]}]`)},50978:e=>{"use strict";e.exports=e=>{switch(e){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}},66192:e=>{"use strict";e.exports=(e,t,r)=>{for(const A of r)e.on(A,(...e)=>t.emit(A,...e))}},50075:e=>{"use strict";e.exports=e=>{const t={protocol:e.protocol,hostname:"string"==typeof e.hostname&&e.hostname.startsWith("[")?e.hostname.slice(1,-1):e.hostname,host:e.host,hash:e.hash,search:e.search,pathname:e.pathname,href:e.href,path:`${e.pathname||""}${e.search||""}`};return"string"==typeof e.port&&0!==e.port.length&&(t.port=Number(e.port)),(e.username||e.password)&&(t.auth=`${e.username||""}:${e.password||""}`),t}},46458:e=>{function t(e){return Array.isArray(e)?e:[e]}const r=/^\s+$/,A=/^\\!/,n=/^\\#/,o=/\r?\n/g,i=/^\.*\/|^\.+$/,s="undefined"!=typeof Symbol?Symbol.for("node-ignore"):"node-ignore",a=/([0-z])-([0-z])/g,c=[[/\\?\s+$/,e=>0===e.indexOf("\\")?" ":""],[/\\\s/g,()=>" "],[/[\\^$.|*+(){]/g,e=>"\\"+e],[/\[([^\]/]*)($|\])/g,(e,t,r)=>{return"]"===r?`[${A=t,A.replace(a,(e,t,r)=>t.charCodeAt(0)<=r.charCodeAt(0)?e:"")}]`:"\\"+e;var A}],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/(?:[^*])$/,e=>/\/$/.test(e)?e+"$":e+"(?=$|\\/$)"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(e,t,r)=>t+6t+"[^\\/]*"],[/(\^|\\\/)?\\\*$/,(e,t)=>(t?t+"[^/]+":"[^/]*")+"(?=$|\\/$)"],[/\\\\\\/g,()=>"\\"]],g=Object.create(null),l=e=>"string"==typeof e;class u{constructor(e,t,r,A){this.origin=e,this.pattern=t,this.negative=r,this.regex=A}}const h=(e,t)=>{const r=e;let o=!1;0===e.indexOf("!")&&(o=!0,e=e.substr(1));const i=((e,t,r)=>{const A=g[e];if(A)return A;const n=c.reduce((t,r)=>t.replace(r[0],r[1].bind(e)),e);return g[e]=r?new RegExp(n,"i"):new RegExp(n)})(e=e.replace(A,"!").replace(n,"#"),0,t);return new u(r,e,o,i)},p=(e,t)=>{throw new t(e)},d=(e,t,r)=>{if(!l(e))return r(`path must be a string, but got \`${t}\``,TypeError);if(!e)return r("path must not be empty",TypeError);if(d.isNotRelative(e)){return r(`path should be a ${"`path.relative()`d"} string, but got "${t}"`,RangeError)}return!0},C=e=>i.test(e);d.isNotRelative=C,d.convert=e=>e;class f{constructor({ignorecase:e=!0}={}){var t,r,A;this._rules=[],this._ignorecase=e,t=this,r=s,A=!0,Object.defineProperty(t,r,{value:A}),this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[s])return this._rules=this._rules.concat(e._rules),void(this._added=!0);if((e=>e&&l(e)&&!r.test(e)&&0!==e.indexOf("#"))(e)){const t=h(e,this._ignorecase);this._added=!0,this._rules.push(t)}}add(e){return this._added=!1,t(l(e)?(e=>e.split(o))(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,t){let r=!1,A=!1;return this._rules.forEach(n=>{const{negative:o}=n;if(A===o&&r!==A||o&&!r&&!A&&!t)return;n.regex.test(e)&&(r=!o,A=o)}),{ignored:r,unignored:A}}_test(e,t,r,A){const n=e&&d.convert(e);return d(n,e,p),this._t(n,t,r,A)}_t(e,t,r,A){if(e in t)return t[e];if(A||(A=e.split("/")),A.pop(),!A.length)return t[e]=this._testOne(e,r);const n=this._t(A.join("/")+"/",t,r,A);return t[e]=n.ignored?n:this._testOne(e,r)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return t(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}}const I=e=>new f(e),E=()=>!1;if(I.isPathValid=e=>d(e&&d.convert(e),e,E),I.default=I,e.exports=I,"undefined"!=typeof process&&(process.env&&process.env.IGNORE_TEST_WIN32||"win32"===process.platform)){const e=e=>/^\\\\\?\\/.test(e)||/["<>|\u0000-\u001F]+/u.test(e)?e:e.replace(/\\/g,"/");d.convert=e;const t=/^[a-z]:\//i;d.isNotRelative=e=>t.test(e)||C(e)}},85870:(e,t,r)=>{try{var A=r(31669);if("function"!=typeof A.inherits)throw"";e.exports=A.inherits}catch(t){e.exports=r(48145)}},48145:e=>{"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e}},44486:e=>{ +/*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ +e.exports=function(e){if("string"!=typeof e||""===e)return!1;for(var t;t=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(t[2])return!0;e=e.slice(t.index+t[0].length)}return!1}},18193:(e,t,r)=>{ +/*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ +var A=r(44486),n={"{":"}","(":")","[":"]"},o=/\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/,i=/\\(.)|(^!|[*?{}()[\]]|\(\?)/;e.exports=function(e,t){if("string"!=typeof e||""===e)return!1;if(A(e))return!0;var r,s=o;for(t&&!1===t.strict&&(s=i);r=s.exec(e);){if(r[2])return!0;var a=r.index+r[0].length,c=r[1],g=c?n[c]:null;if(c&&g){var l=e.indexOf(g,a);-1!==l&&(a=l+1)}e=e.slice(a)}return!1}},59235:e=>{"use strict"; +/*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + */e.exports=function(e){return"number"==typeof e?e-e==0:"string"==typeof e&&""!==e.trim()&&(Number.isFinite?Number.isFinite(+e):isFinite(+e))}},97369:(e,t)=>{var r,A,n,o; +/*! + * is-windows + * + * Copyright © 2015-2018, Jon Schlinkert. + * Released under the MIT License. + */o=function(){"use strict";return function(){return process&&("win32"===process.platform||/^(msys|cygwin)$/.test(process.env.OSTYPE))}},t&&"object"==typeof t?e.exports=o():(A=[],void 0===(n="function"==typeof(r=o)?r.apply(t,A):r)||(e.exports=n))},64151:(e,t,r)=>{var A;r(35747);function n(e,t,r){if("function"==typeof t&&(r=t,t={}),!r){if("function"!=typeof Promise)throw new TypeError("callback not provided");return new Promise((function(r,A){n(e,t||{},(function(e,t){e?A(e):r(t)}))}))}A(e,t||{},(function(e,A){e&&("EACCES"===e.code||t&&t.ignoreErrors)&&(e=null,A=!1),r(e,A)}))}A="win32"===process.platform||global.TESTING_WINDOWS?r(3202):r(2151),e.exports=n,n.sync=function(e,t){try{return A.sync(e,t||{})}catch(e){if(t&&t.ignoreErrors||"EACCES"===e.code)return!1;throw e}}},2151:(e,t,r)=>{e.exports=n,n.sync=function(e,t){return o(A.statSync(e),t)};var A=r(35747);function n(e,t,r){A.stat(e,(function(e,A){r(e,!e&&o(A,t))}))}function o(e,t){return e.isFile()&&function(e,t){var r=e.mode,A=e.uid,n=e.gid,o=void 0!==t.uid?t.uid:process.getuid&&process.getuid(),i=void 0!==t.gid?t.gid:process.getgid&&process.getgid(),s=parseInt("100",8),a=parseInt("010",8),c=parseInt("001",8),g=s|a;return r&c||r&a&&n===i||r&s&&A===o||r&g&&0===o}(e,t)}},3202:(e,t,r)=>{e.exports=o,o.sync=function(e,t){return n(A.statSync(e),e,t)};var A=r(35747);function n(e,t,r){return!(!e.isSymbolicLink()&&!e.isFile())&&function(e,t){var r=void 0!==t.pathExt?t.pathExt:process.env.PATHEXT;if(!r)return!0;if(-1!==(r=r.split(";")).indexOf(""))return!0;for(var A=0;A{"use strict";var A=r(40744);e.exports=A},40744:(e,t,r)=>{"use strict";var A=r(55384),n=r(24129);function o(e){return function(){throw new Error("Function "+e+" is deprecated and cannot be used.")}}e.exports.Type=r(81704),e.exports.Schema=r(8212),e.exports.FAILSAFE_SCHEMA=r(44413),e.exports.JSON_SCHEMA=r(45247),e.exports.CORE_SCHEMA=r(8769),e.exports.DEFAULT_SAFE_SCHEMA=r(65483),e.exports.DEFAULT_FULL_SCHEMA=r(5235),e.exports.load=A.load,e.exports.loadAll=A.loadAll,e.exports.safeLoad=A.safeLoad,e.exports.safeLoadAll=A.safeLoadAll,e.exports.dump=n.dump,e.exports.safeDump=n.safeDump,e.exports.YAMLException=r(17345),e.exports.MINIMAL_SCHEMA=r(44413),e.exports.SAFE_SCHEMA=r(65483),e.exports.DEFAULT_SCHEMA=r(5235),e.exports.scan=o("scan"),e.exports.parse=o("parse"),e.exports.compose=o("compose"),e.exports.addConstructor=o("addConstructor")},28149:e=>{"use strict";function t(e){return null==e}e.exports.isNothing=t,e.exports.isObject=function(e){return"object"==typeof e&&null!==e},e.exports.toArray=function(e){return Array.isArray(e)?e:t(e)?[]:[e]},e.exports.repeat=function(e,t){var r,A="";for(r=0;r{"use strict";var A=r(28149),n=r(17345),o=r(5235),i=r(65483),s=Object.prototype.toString,a=Object.prototype.hasOwnProperty,c={0:"\\0",7:"\\a",8:"\\b",9:"\\t",10:"\\n",11:"\\v",12:"\\f",13:"\\r",27:"\\e",34:'\\"',92:"\\\\",133:"\\N",160:"\\_",8232:"\\L",8233:"\\P"},g=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function l(e){var t,r,o;if(t=e.toString(16).toUpperCase(),e<=255)r="x",o=2;else if(e<=65535)r="u",o=4;else{if(!(e<=4294967295))throw new n("code point within a string may not be greater than 0xFFFFFFFF");r="U",o=8}return"\\"+r+A.repeat("0",o-t.length)+t}function u(e){this.schema=e.schema||o,this.indent=Math.max(1,e.indent||2),this.noArrayIndent=e.noArrayIndent||!1,this.skipInvalid=e.skipInvalid||!1,this.flowLevel=A.isNothing(e.flowLevel)?-1:e.flowLevel,this.styleMap=function(e,t){var r,A,n,o,i,s,c;if(null===t)return{};for(r={},n=0,o=(A=Object.keys(t)).length;nA&&" "!==e[l+1],l=o);else if(!C(i))return 5;u=u&&f(i)}c=c||g&&o-l-1>A&&" "!==e[l+1]}return a||c?r>9&&I(e)?5:c?4:3:u&&!n(e)?1:2}function B(e,t,r,A){e.dump=function(){if(0===t.length)return"''";if(!e.noCompatMode&&-1!==g.indexOf(t))return"'"+t+"'";var o=e.indent*Math.max(1,r),i=-1===e.lineWidth?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-o),s=A||e.flowLevel>-1&&r>=e.flowLevel;switch(E(t,s,e.indent,i,(function(t){return function(e,t){var r,A;for(r=0,A=e.implicitTypes.length;r"+y(t,e.indent)+m(h(function(e,t){var r,A,n=/(\n+)([^\n]*)/g,o=(s=e.indexOf("\n"),s=-1!==s?s:e.length,n.lastIndex=s,w(e.slice(0,s),t)),i="\n"===e[0]||" "===e[0];var s;for(;A=n.exec(e);){var a=A[1],c=A[2];r=" "===c[0],o+=a+(i||r||""===c?"":"\n")+w(c,t),i=r}return o}(t,i),o));case 5:return'"'+function(e){for(var t,r,A,n="",o=0;o=55296&&t<=56319&&(r=e.charCodeAt(o+1))>=56320&&r<=57343?(n+=l(1024*(t-55296)+r-56320+65536),o++):(A=c[t],n+=!A&&C(t)?e[o]:A||l(t));return n}(t)+'"';default:throw new n("impossible error: invalid scalar style")}}()}function y(e,t){var r=I(e)?String(t):"",A="\n"===e[e.length-1];return r+(A&&("\n"===e[e.length-2]||"\n"===e)?"+":A?"":"-")+"\n"}function m(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function w(e,t){if(""===e||" "===e[0])return e;for(var r,A,n=/ [^ ]/g,o=0,i=0,s=0,a="";r=n.exec(e);)(s=r.index)-o>t&&(A=i>o?i:s,a+="\n"+e.slice(o,A),o=A+1),i=s;return a+="\n",e.length-o>t&&i>o?a+=e.slice(o,i)+"\n"+e.slice(i+1):a+=e.slice(o),a.slice(1)}function Q(e,t,r){var A,o,i,c,g,l;for(i=0,c=(o=r?e.explicitTypes:e.implicitTypes).length;i tag resolver accepts not "'+l+'" style');A=g.represent[l](t,l)}e.dump=A}return!0}return!1}function D(e,t,r,A,o,i){e.tag=null,e.dump=r,Q(e,r,!1)||Q(e,r,!0);var a=s.call(e.dump);A&&(A=e.flowLevel<0||e.flowLevel>t);var c,g,l="[object Object]"===a||"[object Array]"===a;if(l&&(g=-1!==(c=e.duplicates.indexOf(r))),(null!==e.tag&&"?"!==e.tag||g||2!==e.indent&&t>0)&&(o=!1),g&&e.usedDuplicates[c])e.dump="*ref_"+c;else{if(l&&g&&!e.usedDuplicates[c]&&(e.usedDuplicates[c]=!0),"[object Object]"===a)A&&0!==Object.keys(e.dump).length?(!function(e,t,r,A){var o,i,s,a,c,g,l="",u=e.tag,h=Object.keys(r);if(!0===e.sortKeys)h.sort();else if("function"==typeof e.sortKeys)h.sort(e.sortKeys);else if(e.sortKeys)throw new n("sortKeys must be a boolean or a function");for(o=0,i=h.length;o1024)&&(e.dump&&10===e.dump.charCodeAt(0)?g+="?":g+="? "),g+=e.dump,c&&(g+=p(e,t)),D(e,t+1,a,!0,c)&&(e.dump&&10===e.dump.charCodeAt(0)?g+=":":g+=": ",l+=g+=e.dump));e.tag=u,e.dump=l||"{}"}(e,t,e.dump,o),g&&(e.dump="&ref_"+c+e.dump)):(!function(e,t,r){var A,n,o,i,s,a="",c=e.tag,g=Object.keys(r);for(A=0,n=g.length;A1024&&(s+="? "),s+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),D(e,t,i,!1,!1)&&(a+=s+=e.dump));e.tag=c,e.dump="{"+a+"}"}(e,t,e.dump),g&&(e.dump="&ref_"+c+" "+e.dump));else if("[object Array]"===a){var u=e.noArrayIndent&&t>0?t-1:t;A&&0!==e.dump.length?(!function(e,t,r,A){var n,o,i="",s=e.tag;for(n=0,o=r.length;n "+e.dump)}return!0}function b(e,t){var r,A,n=[],o=[];for(function e(t,r,A){var n,o,i;if(null!==t&&"object"==typeof t)if(-1!==(o=r.indexOf(t)))-1===A.indexOf(o)&&A.push(o);else if(r.push(t),Array.isArray(t))for(o=0,i=t.length;o{"use strict";function t(e,t){Error.call(this),this.name="YAMLException",this.reason=e,this.mark=t,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||""}t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t},e.exports=t},55384:(e,t,r)=>{"use strict";var A=r(28149),n=r(17345),o=r(30399),i=r(65483),s=r(5235),a=Object.prototype.hasOwnProperty,c=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,g=/[\x85\u2028\u2029]/,l=/[,\[\]\{\}]/,u=/^(?:!|!!|![a-z\-]+!)$/i,h=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function p(e){return 10===e||13===e}function d(e){return 9===e||32===e}function C(e){return 9===e||32===e||10===e||13===e}function f(e){return 44===e||91===e||93===e||123===e||125===e}function I(e){var t;return 48<=e&&e<=57?e-48:97<=(t=32|e)&&t<=102?t-97+10:-1}function E(e){return 48===e?"\0":97===e?"":98===e?"\b":116===e||9===e?"\t":110===e?"\n":118===e?"\v":102===e?"\f":114===e?"\r":101===e?"":32===e?" ":34===e?'"':47===e?"/":92===e?"\\":78===e?"Â…":95===e?" ":76===e?"\u2028":80===e?"\u2029":""}function B(e){return e<=65535?String.fromCharCode(e):String.fromCharCode(55296+(e-65536>>10),56320+(e-65536&1023))}for(var y=new Array(256),m=new Array(256),w=0;w<256;w++)y[w]=E(w)?1:0,m[w]=E(w);function Q(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||s,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function D(e,t){return new n(t,new o(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function b(e,t){throw D(e,t)}function v(e,t){e.onWarning&&e.onWarning.call(null,D(e,t))}var S={YAML:function(e,t,r){var A,n,o;null!==e.version&&b(e,"duplication of %YAML directive"),1!==r.length&&b(e,"YAML directive accepts exactly one argument"),null===(A=/^([0-9]+)\.([0-9]+)$/.exec(r[0]))&&b(e,"ill-formed argument of the YAML directive"),n=parseInt(A[1],10),o=parseInt(A[2],10),1!==n&&b(e,"unacceptable YAML version of the document"),e.version=r[0],e.checkLineBreaks=o<2,1!==o&&2!==o&&v(e,"unsupported YAML version of the document")},TAG:function(e,t,r){var A,n;2!==r.length&&b(e,"TAG directive accepts exactly two arguments"),A=r[0],n=r[1],u.test(A)||b(e,"ill-formed tag handle (first argument) of the TAG directive"),a.call(e.tagMap,A)&&b(e,'there is a previously declared suffix for "'+A+'" tag handle'),h.test(n)||b(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[A]=n}};function k(e,t,r,A){var n,o,i,s;if(t1&&(e.result+=A.repeat("\n",t-1))}function L(e,t){var r,A,n=e.tag,o=e.anchor,i=[],s=!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=i),A=e.input.charCodeAt(e.position);0!==A&&45===A&&C(e.input.charCodeAt(e.position+1));)if(s=!0,e.position++,M(e,!0,-1)&&e.lineIndent<=t)i.push(null),A=e.input.charCodeAt(e.position);else if(r=e.line,U(e,t,3,!1,!0),i.push(e.result),M(e,!0,-1),A=e.input.charCodeAt(e.position),(e.line===r||e.lineIndent>t)&&0!==A)b(e,"bad indentation of a sequence entry");else if(e.lineIndentt?w=1:e.lineIndent===t?w=0:e.lineIndentt?w=1:e.lineIndent===t?w=0:e.lineIndentt)&&(U(e,t,4,!0,n)&&(f?h=e.result:p=e.result),f||(F(e,g,l,u,h,p,o,i),u=h=p=null),M(e,!0,-1),s=e.input.charCodeAt(e.position)),e.lineIndent>t&&0!==s)b(e,"bad indentation of a mapping entry");else if(e.lineIndent=0))break;0===o?b(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):g?b(e,"repeat of an indentation width identifier"):(l=t+o-1,g=!0)}if(d(i)){do{i=e.input.charCodeAt(++e.position)}while(d(i));if(35===i)do{i=e.input.charCodeAt(++e.position)}while(!p(i)&&0!==i)}for(;0!==i;){for(K(e),e.lineIndent=0,i=e.input.charCodeAt(e.position);(!g||e.lineIndentl&&(l=e.lineIndent),p(i))u++;else{if(e.lineIndent0){for(n=i,o=0;n>0;n--)(i=I(s=e.input.charCodeAt(++e.position)))>=0?o=(o<<4)+i:b(e,"expected hexadecimal character");e.result+=B(o),e.position++}else b(e,"unknown escape sequence");r=A=e.position}else p(s)?(k(e,r,A,!0),x(e,M(e,!1,t)),r=A=e.position):e.position===e.lineStart&&R(e)?b(e,"unexpected end of the document within a double quoted scalar"):(e.position++,A=e.position)}b(e,"unexpected end of the stream within a double quoted scalar")}(e,h)?D=!0:!function(e){var t,r,A;if(42!==(A=e.input.charCodeAt(e.position)))return!1;for(A=e.input.charCodeAt(++e.position),t=e.position;0!==A&&!C(A)&&!f(A);)A=e.input.charCodeAt(++e.position);return e.position===t&&b(e,"name of an alias node must contain at least one character"),r=e.input.slice(t,e.position),e.anchorMap.hasOwnProperty(r)||b(e,'unidentified alias "'+r+'"'),e.result=e.anchorMap[r],M(e,!0,-1),!0}(e)?function(e,t,r){var A,n,o,i,s,a,c,g,l=e.kind,u=e.result;if(C(g=e.input.charCodeAt(e.position))||f(g)||35===g||38===g||42===g||33===g||124===g||62===g||39===g||34===g||37===g||64===g||96===g)return!1;if((63===g||45===g)&&(C(A=e.input.charCodeAt(e.position+1))||r&&f(A)))return!1;for(e.kind="scalar",e.result="",n=o=e.position,i=!1;0!==g;){if(58===g){if(C(A=e.input.charCodeAt(e.position+1))||r&&f(A))break}else if(35===g){if(C(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&R(e)||r&&f(g))break;if(p(g)){if(s=e.line,a=e.lineStart,c=e.lineIndent,M(e,!1,-1),e.lineIndent>=t){i=!0,g=e.input.charCodeAt(e.position);continue}e.position=o,e.line=s,e.lineStart=a,e.lineIndent=c;break}}i&&(k(e,n,o,!1),x(e,e.line-s),n=o=e.position,i=!1),d(g)||(o=e.position+1),g=e.input.charCodeAt(++e.position)}return k(e,n,o,!1),!!e.result||(e.kind=l,e.result=u,!1)}(e,h,1===r)&&(D=!0,null===e.tag&&(e.tag="?")):(D=!0,null===e.tag&&null===e.anchor||b(e,"alias node should not have any properties")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===w&&(D=c&&L(e,E))),null!==e.tag&&"!"!==e.tag)if("?"===e.tag){for(g=0,l=e.implicitTypes.length;g tag; it should be "'+u.kind+'", not "'+e.kind+'"'),u.resolve(e.result)?(e.result=u.construct(e.result),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):b(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")):b(e,"unknown tag !<"+e.tag+">");return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||D}function T(e){var t,r,A,n,o=e.position,i=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap={},e.anchorMap={};0!==(n=e.input.charCodeAt(e.position))&&(M(e,!0,-1),n=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==n));){for(i=!0,n=e.input.charCodeAt(++e.position),t=e.position;0!==n&&!C(n);)n=e.input.charCodeAt(++e.position);for(A=[],(r=e.input.slice(t,e.position)).length<1&&b(e,"directive name must not be less than one character in length");0!==n;){for(;d(n);)n=e.input.charCodeAt(++e.position);if(35===n){do{n=e.input.charCodeAt(++e.position)}while(0!==n&&!p(n));break}if(p(n))break;for(t=e.position;0!==n&&!C(n);)n=e.input.charCodeAt(++e.position);A.push(e.input.slice(t,e.position))}0!==n&&K(e),a.call(S,r)?S[r](e,r,A):v(e,'unknown document directive "'+r+'"')}M(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,M(e,!0,-1)):i&&b(e,"directives end mark is expected"),U(e,e.lineIndent-1,4,!1,!0),M(e,!0,-1),e.checkLineBreaks&&g.test(e.input.slice(o,e.position))&&v(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&R(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,M(e,!0,-1)):e.position{"use strict";var A=r(28149);function n(e,t,r,A,n){this.name=e,this.buffer=t,this.position=r,this.line=A,this.column=n}n.prototype.getSnippet=function(e,t){var r,n,o,i,s;if(!this.buffer)return null;for(e=e||4,t=t||75,r="",n=this.position;n>0&&-1==="\0\r\nÂ…\u2028\u2029".indexOf(this.buffer.charAt(n-1));)if(n-=1,this.position-n>t/2-1){r=" ... ",n+=5;break}for(o="",i=this.position;it/2-1){o=" ... ",i-=5;break}return s=this.buffer.slice(n,i),A.repeat(" ",e)+r+s+o+"\n"+A.repeat(" ",e+this.position-n+r.length)+"^"},n.prototype.toString=function(e){var t,r="";return this.name&&(r+='in "'+this.name+'" '),r+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet())&&(r+=":\n"+t),r},e.exports=n},8212:(e,t,r)=>{"use strict";var A=r(28149),n=r(17345),o=r(81704);function i(e,t,r){var A=[];return e.include.forEach((function(e){r=i(e,t,r)})),e[t].forEach((function(e){r.forEach((function(t,r){t.tag===e.tag&&t.kind===e.kind&&A.push(r)})),r.push(e)})),r.filter((function(e,t){return-1===A.indexOf(t)}))}function s(e){this.include=e.include||[],this.implicit=e.implicit||[],this.explicit=e.explicit||[],this.implicit.forEach((function(e){if(e.loadKind&&"scalar"!==e.loadKind)throw new n("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.")})),this.compiledImplicit=i(this,"implicit",[]),this.compiledExplicit=i(this,"explicit",[]),this.compiledTypeMap=function(){var e,t,r={scalar:{},sequence:{},mapping:{},fallback:{}};function A(e){r[e.kind][e.tag]=r.fallback[e.tag]=e}for(e=0,t=arguments.length;e{"use strict";var A=r(8212);e.exports=new A({include:[r(45247)]})},5235:(e,t,r)=>{"use strict";var A=r(8212);e.exports=A.DEFAULT=new A({include:[r(65483)],explicit:[r(61425),r(61872),r(79982)]})},65483:(e,t,r)=>{"use strict";var A=r(8212);e.exports=new A({include:[r(8769)],implicit:[r(83516),r(95441)],explicit:[r(34836),r(6847),r(65173),r(92025)]})},44413:(e,t,r)=>{"use strict";var A=r(8212);e.exports=new A({explicit:[r(19952),r(46557),r(90173)]})},45247:(e,t,r)=>{"use strict";var A=r(8212);e.exports=new A({include:[r(44413)],implicit:[r(40188),r(58357),r(82106),r(71945)]})},81704:(e,t,r)=>{"use strict";var A=r(17345),n=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],o=["scalar","sequence","mapping"];e.exports=function(e,t){var r,i;if(t=t||{},Object.keys(t).forEach((function(t){if(-1===n.indexOf(t))throw new A('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')})),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=(r=t.styleAliases||null,i={},null!==r&&Object.keys(r).forEach((function(e){r[e].forEach((function(t){i[String(t)]=e}))})),i),-1===o.indexOf(this.kind))throw new A('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}},34836:(e,t,r)=>{"use strict";var A;try{A=r(64293).Buffer}catch(e){}var n=r(81704),o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";e.exports=new n("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,r,A=0,n=e.length,i=o;for(r=0;r64)){if(t<0)return!1;A+=6}return A%8==0},construct:function(e){var t,r,n=e.replace(/[\r\n=]/g,""),i=n.length,s=o,a=0,c=[];for(t=0;t>16&255),c.push(a>>8&255),c.push(255&a)),a=a<<6|s.indexOf(n.charAt(t));return 0===(r=i%4*6)?(c.push(a>>16&255),c.push(a>>8&255),c.push(255&a)):18===r?(c.push(a>>10&255),c.push(a>>2&255)):12===r&&c.push(a>>4&255),A?A.from?A.from(c):new A(c):c},predicate:function(e){return A&&A.isBuffer(e)},represent:function(e){var t,r,A="",n=0,i=e.length,s=o;for(t=0;t>18&63],A+=s[n>>12&63],A+=s[n>>6&63],A+=s[63&n]),n=(n<<8)+e[t];return 0===(r=i%3)?(A+=s[n>>18&63],A+=s[n>>12&63],A+=s[n>>6&63],A+=s[63&n]):2===r?(A+=s[n>>10&63],A+=s[n>>4&63],A+=s[n<<2&63],A+=s[64]):1===r&&(A+=s[n>>2&63],A+=s[n<<4&63],A+=s[64],A+=s[64]),A}})},58357:(e,t,r)=>{"use strict";var A=r(81704);e.exports=new A("tag:yaml.org,2002:bool",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t=e.length;return 4===t&&("true"===e||"True"===e||"TRUE"===e)||5===t&&("false"===e||"False"===e||"FALSE"===e)},construct:function(e){return"true"===e||"True"===e||"TRUE"===e},predicate:function(e){return"[object Boolean]"===Object.prototype.toString.call(e)},represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"})},71945:(e,t,r)=>{"use strict";var A=r(28149),n=r(81704),o=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var i=/^[-+]?[0-9]+e/;e.exports=new n("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(e){return null!==e&&!(!o.test(e)||"_"===e[e.length-1])},construct:function(e){var t,r,A,n;return r="-"===(t=e.replace(/_/g,"").toLowerCase())[0]?-1:1,n=[],"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===r?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?NaN:t.indexOf(":")>=0?(t.split(":").forEach((function(e){n.unshift(parseFloat(e,10))})),t=0,A=1,n.forEach((function(e){t+=e*A,A*=60})),r*t):r*parseFloat(t,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!=0||A.isNegativeZero(e))},represent:function(e,t){var r;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(A.isNegativeZero(e))return"-0.0";return r=e.toString(10),i.test(r)?r.replace("e",".e"):r},defaultStyle:"lowercase"})},82106:(e,t,r)=>{"use strict";var A=r(28149),n=r(81704);function o(e){return 48<=e&&e<=55}function i(e){return 48<=e&&e<=57}e.exports=new n("tag:yaml.org,2002:int",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,r,A=e.length,n=0,s=!1;if(!A)return!1;if("-"!==(t=e[n])&&"+"!==t||(t=e[++n]),"0"===t){if(n+1===A)return!0;if("b"===(t=e[++n])){for(n++;n=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0"+e.toString(8):"-0"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})},79982:(e,t,r)=>{"use strict";var A;try{A=r(Object(function(){var e=new Error("Cannot find module 'esprima'");throw e.code="MODULE_NOT_FOUND",e}()))}catch(e){"undefined"!=typeof window&&(A=window.esprima)}var n=r(81704);e.exports=new n("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:function(e){if(null===e)return!1;try{var t="("+e+")",r=A.parse(t,{range:!0});return"Program"===r.type&&1===r.body.length&&"ExpressionStatement"===r.body[0].type&&("ArrowFunctionExpression"===r.body[0].expression.type||"FunctionExpression"===r.body[0].expression.type)}catch(e){return!1}},construct:function(e){var t,r="("+e+")",n=A.parse(r,{range:!0}),o=[];if("Program"!==n.type||1!==n.body.length||"ExpressionStatement"!==n.body[0].type||"ArrowFunctionExpression"!==n.body[0].expression.type&&"FunctionExpression"!==n.body[0].expression.type)throw new Error("Failed to resolve function");return n.body[0].expression.params.forEach((function(e){o.push(e.name)})),t=n.body[0].expression.body.range,"BlockStatement"===n.body[0].expression.body.type?new Function(o,r.slice(t[0]+1,t[1]-1)):new Function(o,"return "+r.slice(t[0],t[1]))},predicate:function(e){return"[object Function]"===Object.prototype.toString.call(e)},represent:function(e){return e.toString()}})},61872:(e,t,r)=>{"use strict";var A=r(81704);e.exports=new A("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:function(e){if(null===e)return!1;if(0===e.length)return!1;var t=e,r=/\/([gim]*)$/.exec(e),A="";if("/"===t[0]){if(r&&(A=r[1]),A.length>3)return!1;if("/"!==t[t.length-A.length-1])return!1}return!0},construct:function(e){var t=e,r=/\/([gim]*)$/.exec(e),A="";return"/"===t[0]&&(r&&(A=r[1]),t=t.slice(1,t.length-A.length-1)),new RegExp(t,A)},predicate:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},represent:function(e){var t="/"+e.source+"/";return e.global&&(t+="g"),e.multiline&&(t+="m"),e.ignoreCase&&(t+="i"),t}})},61425:(e,t,r)=>{"use strict";var A=r(81704);e.exports=new A("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:function(){return!0},construct:function(){},predicate:function(e){return void 0===e},represent:function(){return""}})},90173:(e,t,r)=>{"use strict";var A=r(81704);e.exports=new A("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return null!==e?e:{}}})},95441:(e,t,r)=>{"use strict";var A=r(81704);e.exports=new A("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(e){return"<<"===e||null===e}})},40188:(e,t,r)=>{"use strict";var A=r(81704);e.exports=new A("tag:yaml.org,2002:null",{kind:"scalar",resolve:function(e){if(null===e)return!0;var t=e.length;return 1===t&&"~"===e||4===t&&("null"===e||"Null"===e||"NULL"===e)},construct:function(){return null},predicate:function(e){return null===e},represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})},6847:(e,t,r)=>{"use strict";var A=r(81704),n=Object.prototype.hasOwnProperty,o=Object.prototype.toString;e.exports=new A("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(e){if(null===e)return!0;var t,r,A,i,s,a=[],c=e;for(t=0,r=c.length;t{"use strict";var A=r(81704),n=Object.prototype.toString;e.exports=new A("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:function(e){if(null===e)return!0;var t,r,A,o,i,s=e;for(i=new Array(s.length),t=0,r=s.length;t{"use strict";var A=r(81704);e.exports=new A("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(e){return null!==e?e:[]}})},92025:(e,t,r)=>{"use strict";var A=r(81704),n=Object.prototype.hasOwnProperty;e.exports=new A("tag:yaml.org,2002:set",{kind:"mapping",resolve:function(e){if(null===e)return!0;var t,r=e;for(t in r)if(n.call(r,t)&&null!==r[t])return!1;return!0},construct:function(e){return null!==e?e:{}}})},19952:(e,t,r)=>{"use strict";var A=r(81704);e.exports=new A("tag:yaml.org,2002:str",{kind:"scalar",construct:function(e){return null!==e?e:""}})},83516:(e,t,r)=>{"use strict";var A=r(81704),n=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),o=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");e.exports=new A("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(e){return null!==e&&(null!==n.exec(e)||null!==o.exec(e))},construct:function(e){var t,r,A,i,s,a,c,g,l=0,u=null;if(null===(t=n.exec(e))&&(t=o.exec(e)),null===t)throw new Error("Date resolve error");if(r=+t[1],A=+t[2]-1,i=+t[3],!t[4])return new Date(Date.UTC(r,A,i));if(s=+t[4],a=+t[5],c=+t[6],t[7]){for(l=t[7].slice(0,3);l.length<3;)l+="0";l=+l}return t[9]&&(u=6e4*(60*+t[10]+ +(t[11]||0)),"-"===t[9]&&(u=-u)),g=new Date(Date.UTC(r,A,i,s,a,c,l)),u&&g.setTime(g.getTime()-u),g},instanceOf:Date,represent:function(e){return e.toISOString()}})},7427:(e,t)=>{t.stringify=function e(t){if(void 0===t)return t;if(t&&Buffer.isBuffer(t))return JSON.stringify(":base64:"+t.toString("base64"));if(t&&t.toJSON&&(t=t.toJSON()),t&&"object"==typeof t){var r="",A=Array.isArray(t);r=A?"[":"{";var n=!0;for(var o in t){var i="function"==typeof t[o]||!A&&void 0===t[o];Object.hasOwnProperty.call(t,o)&&!i&&(n||(r+=","),n=!1,A?null==t[o]?r+="null":r+=e(t[o]):void 0!==t[o]&&(r+=e(o)+":"+e(t[o])))}return r+=A?"]":"}"}return"string"==typeof t?JSON.stringify(/^:/.test(t)?":"+t:t):void 0===t?"null":JSON.stringify(t)},t.parse=function(e){return JSON.parse(e,(function(e,t){return"string"==typeof t?/^:base64:/.test(t)?Buffer.from(t.substring(8),"base64"):/^:/.test(t)?t.substring(1):t:t}))}},72515:(e,t,r)=>{"use strict";const A=r(28614),n=r(7427);e.exports=class extends A{constructor(e,t){if(super(),this.opts=Object.assign({namespace:"keyv",serialize:n.stringify,deserialize:n.parse},"string"==typeof e?{uri:e}:e,t),!this.opts.store){const e=Object.assign({},this.opts);this.opts.store=(e=>{const t={redis:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql"};if(e.adapter||e.uri){const A=e.adapter||/^[^:]*/.exec(e.uri)[0];return new(r(89112)(t[A]))(e)}return new Map})(e)}"function"==typeof this.opts.store.on&&this.opts.store.on("error",e=>this.emit("error",e)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e,t){e=this._getKeyPrefix(e);const{store:r}=this.opts;return Promise.resolve().then(()=>r.get(e)).then(e=>"string"==typeof e?this.opts.deserialize(e):e).then(r=>{if(void 0!==r){if(!("number"==typeof r.expires&&Date.now()>r.expires))return t&&t.raw?r:r.value;this.delete(e)}})}set(e,t,r){e=this._getKeyPrefix(e),void 0===r&&(r=this.opts.ttl),0===r&&(r=void 0);const{store:A}=this.opts;return Promise.resolve().then(()=>{const e="number"==typeof r?Date.now()+r:null;return t={value:t,expires:e},this.opts.serialize(t)}).then(t=>A.set(e,t,r)).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);const{store:t}=this.opts;return Promise.resolve().then(()=>t.delete(e))}clear(){const{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}}},89112:e=>{function t(e){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}t.keys=()=>[],t.resolve=t,t.id=89112,e.exports=t},78962:(e,t,r)=>{var A=r(99513)(r(76169),"DataView");e.exports=A},72574:(e,t,r)=>{var A=r(31713),n=r(86688),o=r(45937),i=r(5017),s=r(79457);function a(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t{var A=r(14620),n=r(73682),o=r(43112),i=r(90640),s=r(9380);function a(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t{var A=r(99513)(r(76169),"Map");e.exports=A},75009:(e,t,r)=>{var A=r(18209),n=r(89706),o=r(43786),i=r(17926),s=r(87345);function a(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t{var A=r(99513)(r(76169),"Promise");e.exports=A},43231:(e,t,r)=>{var A=r(99513)(r(76169),"Set");e.exports=A},46235:(e,t,r)=>{var A=r(75009),n=r(74785),o=r(87760);function i(e){var t=-1,r=null==e?0:e.length;for(this.__data__=new A;++t{var A=r(29197),n=r(35678),o=r(33336),i=r(97163),s=r(43737),a=r(48548);function c(e){var t=this.__data__=new A(e);this.size=t.size}c.prototype.clear=n,c.prototype.delete=o,c.prototype.get=i,c.prototype.has=s,c.prototype.set=a,e.exports=c},69976:(e,t,r)=>{var A=r(76169).Symbol;e.exports=A},2740:(e,t,r)=>{var A=r(76169).Uint8Array;e.exports=A},47063:(e,t,r)=>{var A=r(99513)(r(76169),"WeakMap");e.exports=A},66636:e=>{e.exports=function(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)}},33326:e=>{e.exports=function(e,t){for(var r=-1,A=null==e?0:e.length;++r{e.exports=function(e,t){for(var r=-1,A=null==e?0:e.length,n=0,o=[];++r{var A=r(7089),n=r(61771),o=r(82664),i=r(10667),s=r(98041),a=r(32565),c=Object.prototype.hasOwnProperty;e.exports=function(e,t){var r=o(e),g=!r&&n(e),l=!r&&!g&&i(e),u=!r&&!g&&!l&&a(e),h=r||g||l||u,p=h?A(e.length,String):[],d=p.length;for(var C in e)!t&&!c.call(e,C)||h&&("length"==C||l&&("offset"==C||"parent"==C)||u&&("buffer"==C||"byteLength"==C||"byteOffset"==C)||s(C,d))||p.push(C);return p}},60783:e=>{e.exports=function(e,t){for(var r=-1,A=null==e?0:e.length,n=Array(A);++r{e.exports=function(e,t){for(var r=-1,A=t.length,n=e.length;++r{e.exports=function(e,t,r,A){var n=-1,o=null==e?0:e.length;for(A&&o&&(r=e[++n]);++n{e.exports=function(e,t){for(var r=-1,A=null==e?0:e.length;++r{e.exports=function(e){return e.split("")}},11852:e=>{var t=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;e.exports=function(e){return e.match(t)||[]}},26943:(e,t,r)=>{var A=r(91198),n=r(71074);e.exports=function(e,t,r){(void 0!==r&&!n(e[t],r)||void 0===r&&!(t in e))&&A(e,t,r)}},65759:(e,t,r)=>{var A=r(91198),n=r(71074),o=Object.prototype.hasOwnProperty;e.exports=function(e,t,r){var i=e[t];o.call(e,t)&&n(i,r)&&(void 0!==r||t in e)||A(e,t,r)}},39836:(e,t,r)=>{var A=r(71074);e.exports=function(e,t){for(var r=e.length;r--;)if(A(e[r][0],t))return r;return-1}},28628:(e,t,r)=>{var A=r(75182),n=r(42185);e.exports=function(e,t){return e&&A(t,n(t),e)}},78707:(e,t,r)=>{var A=r(75182),n=r(24887);e.exports=function(e,t){return e&&A(t,n(t),e)}},91198:(e,t,r)=>{var A=r(65);e.exports=function(e,t,r){"__proto__"==t&&A?A(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):e[t]=r}},41076:(e,t,r)=>{var A=r(22851),n=r(33326),o=r(65759),i=r(28628),s=r(78707),a=r(64266),c=r(87229),g=r(23105),l=r(60741),u=r(60753),h=r(64420),p=r(79435),d=r(27908),C=r(37836),f=r(88438),I=r(82664),E=r(10667),B=r(13349),y=r(46778),m=r(33931),w=r(42185),Q={};Q["[object Arguments]"]=Q["[object Array]"]=Q["[object ArrayBuffer]"]=Q["[object DataView]"]=Q["[object Boolean]"]=Q["[object Date]"]=Q["[object Float32Array]"]=Q["[object Float64Array]"]=Q["[object Int8Array]"]=Q["[object Int16Array]"]=Q["[object Int32Array]"]=Q["[object Map]"]=Q["[object Number]"]=Q["[object Object]"]=Q["[object RegExp]"]=Q["[object Set]"]=Q["[object String]"]=Q["[object Symbol]"]=Q["[object Uint8Array]"]=Q["[object Uint8ClampedArray]"]=Q["[object Uint16Array]"]=Q["[object Uint32Array]"]=!0,Q["[object Error]"]=Q["[object Function]"]=Q["[object WeakMap]"]=!1,e.exports=function e(t,r,D,b,v,S){var k,N=1&r,F=2&r,K=4&r;if(D&&(k=v?D(t,b,v,S):D(t)),void 0!==k)return k;if(!y(t))return t;var M=I(t);if(M){if(k=d(t),!N)return c(t,k)}else{var R=p(t),x="[object Function]"==R||"[object GeneratorFunction]"==R;if(E(t))return a(t,N);if("[object Object]"==R||"[object Arguments]"==R||x&&!v){if(k=F||x?{}:f(t),!N)return F?l(t,s(k,t)):g(t,i(k,t))}else{if(!Q[R])return v?t:{};k=C(t,R,N)}}S||(S=new A);var L=S.get(t);if(L)return L;S.set(t,k),m(t)?t.forEach((function(A){k.add(e(A,r,D,A,t,S))})):B(t)&&t.forEach((function(A,n){k.set(n,e(A,r,D,n,t,S))}));var P=K?F?h:u:F?keysIn:w,O=M?void 0:P(t);return n(O||t,(function(A,n){O&&(A=t[n=A]),o(k,n,e(A,r,D,n,t,S))})),k}},15178:(e,t,r)=>{var A=r(46778),n=Object.create,o=function(){function e(){}return function(t){if(!A(t))return{};if(n)return n(t);e.prototype=t;var r=new e;return e.prototype=void 0,r}}();e.exports=o},93274:(e,t,r)=>{var A=r(40945),n=r(958);e.exports=function e(t,r,o,i,s){var a=-1,c=t.length;for(o||(o=n),s||(s=[]);++a0&&o(g)?r>1?e(g,r-1,o,i,s):A(s,g):i||(s[s.length]=g)}return s}},31689:(e,t,r)=>{var A=r(59907)();e.exports=A},62164:(e,t,r)=>{var A=r(31689),n=r(42185);e.exports=function(e,t){return e&&A(e,t,n)}},84173:(e,t,r)=>{var A=r(56725),n=r(49874);e.exports=function(e,t){for(var r=0,o=(t=A(t,e)).length;null!=e&&r{var A=r(40945),n=r(82664);e.exports=function(e,t,r){var o=t(e);return n(e)?o:A(o,r(e))}},52502:(e,t,r)=>{var A=r(69976),n=r(2854),o=r(87427),i=A?A.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?n(e):o(e)}},95325:e=>{var t=Object.prototype.hasOwnProperty;e.exports=function(e,r){return null!=e&&t.call(e,r)}},3881:e=>{e.exports=function(e,t){return null!=e&&t in Object(e)}},76357:(e,t,r)=>{var A=r(52502),n=r(38496);e.exports=function(e){return n(e)&&"[object Arguments]"==A(e)}},74195:(e,t,r)=>{var A=r(48957),n=r(38496);e.exports=function e(t,r,o,i,s){return t===r||(null==t||null==r||!n(t)&&!n(r)?t!=t&&r!=r:A(t,r,o,i,e,s))}},48957:(e,t,r)=>{var A=r(22851),n=r(75500),o=r(28475),i=r(50245),s=r(79435),a=r(82664),c=r(10667),g=r(32565),l="[object Object]",u=Object.prototype.hasOwnProperty;e.exports=function(e,t,r,h,p,d){var C=a(e),f=a(t),I=C?"[object Array]":s(e),E=f?"[object Array]":s(t),B=(I="[object Arguments]"==I?l:I)==l,y=(E="[object Arguments]"==E?l:E)==l,m=I==E;if(m&&c(e)){if(!c(t))return!1;C=!0,B=!1}if(m&&!B)return d||(d=new A),C||g(e)?n(e,t,r,h,p,d):o(e,t,I,r,h,p,d);if(!(1&r)){var w=B&&u.call(e,"__wrapped__"),Q=y&&u.call(t,"__wrapped__");if(w||Q){var D=w?e.value():e,b=Q?t.value():t;return d||(d=new A),p(D,b,r,h,d)}}return!!m&&(d||(d=new A),i(e,t,r,h,p,d))}},55994:(e,t,r)=>{var A=r(79435),n=r(38496);e.exports=function(e){return n(e)&&"[object Map]"==A(e)}},66470:(e,t,r)=>{var A=r(22851),n=r(74195);e.exports=function(e,t,r,o){var i=r.length,s=i,a=!o;if(null==e)return!s;for(e=Object(e);i--;){var c=r[i];if(a&&c[2]?c[1]!==e[c[0]]:!(c[0]in e))return!1}for(;++i{var A=r(92533),n=r(15061),o=r(46778),i=r(76384),s=/^\[object .+?Constructor\]$/,a=Function.prototype,c=Object.prototype,g=a.toString,l=c.hasOwnProperty,u=RegExp("^"+g.call(l).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=function(e){return!(!o(e)||n(e))&&(A(e)?u:s).test(i(e))}},28612:(e,t,r)=>{var A=r(79435),n=r(38496);e.exports=function(e){return n(e)&&"[object Set]"==A(e)}},98998:(e,t,r)=>{var A=r(52502),n=r(46369),o=r(38496),i={};i["[object Float32Array]"]=i["[object Float64Array]"]=i["[object Int8Array]"]=i["[object Int16Array]"]=i["[object Int32Array]"]=i["[object Uint8Array]"]=i["[object Uint8ClampedArray]"]=i["[object Uint16Array]"]=i["[object Uint32Array]"]=!0,i["[object Arguments]"]=i["[object Array]"]=i["[object ArrayBuffer]"]=i["[object Boolean]"]=i["[object DataView]"]=i["[object Date]"]=i["[object Error]"]=i["[object Function]"]=i["[object Map]"]=i["[object Number]"]=i["[object Object]"]=i["[object RegExp]"]=i["[object Set]"]=i["[object String]"]=i["[object WeakMap]"]=!1,e.exports=function(e){return o(e)&&n(e.length)&&!!i[A(e)]}},42208:(e,t,r)=>{var A=r(96962),n=r(90348),o=r(61977),i=r(82664),s=r(7430);e.exports=function(e){return"function"==typeof e?e:null==e?o:"object"==typeof e?i(e)?n(e[0],e[1]):A(e):s(e)}},50994:(e,t,r)=>{var A=r(89513),n=r(60657),o=Object.prototype.hasOwnProperty;e.exports=function(e){if(!A(e))return n(e);var t=[];for(var r in Object(e))o.call(e,r)&&"constructor"!=r&&t.push(r);return t}},8372:(e,t,r)=>{var A=r(46778),n=r(89513),o=r(95632),i=Object.prototype.hasOwnProperty;e.exports=function(e){if(!A(e))return o(e);var t=n(e),r=[];for(var s in e)("constructor"!=s||!t&&i.call(e,s))&&r.push(s);return r}},96962:(e,t,r)=>{var A=r(66470),n=r(98705),o=r(12757);e.exports=function(e){var t=n(e);return 1==t.length&&t[0][2]?o(t[0][0],t[0][1]):function(r){return r===e||A(r,e,t)}}},90348:(e,t,r)=>{var A=r(74195),n=r(44674),o=r(34878),i=r(70474),s=r(20925),a=r(12757),c=r(49874);e.exports=function(e,t){return i(e)&&s(t)?a(c(e),t):function(r){var i=n(r,e);return void 0===i&&i===t?o(r,e):A(t,i,3)}}},51264:(e,t,r)=>{var A=r(22851),n=r(26943),o=r(31689),i=r(16834),s=r(46778),a=r(24887),c=r(36883);e.exports=function e(t,r,g,l,u){t!==r&&o(r,(function(o,a){if(u||(u=new A),s(o))i(t,r,a,g,e,l,u);else{var h=l?l(c(t,a),o,a+"",t,r,u):void 0;void 0===h&&(h=o),n(t,a,h)}}),a)}},16834:(e,t,r)=>{var A=r(26943),n=r(64266),o=r(58042),i=r(87229),s=r(88438),a=r(61771),c=r(82664),g=r(16064),l=r(10667),u=r(92533),h=r(46778),p=r(11672),d=r(32565),C=r(36883),f=r(36506);e.exports=function(e,t,r,I,E,B,y){var m=C(e,r),w=C(t,r),Q=y.get(w);if(Q)A(e,r,Q);else{var D=B?B(m,w,r+"",e,t,y):void 0,b=void 0===D;if(b){var v=c(w),S=!v&&l(w),k=!v&&!S&&d(w);D=w,v||S||k?c(m)?D=m:g(m)?D=i(m):S?(b=!1,D=n(w,!0)):k?(b=!1,D=o(w,!0)):D=[]:p(w)||a(w)?(D=m,a(m)?D=f(m):h(m)&&!u(m)||(D=s(w))):b=!1}b&&(y.set(w,D),E(D,w,I,B,y),y.delete(w)),A(e,r,D)}}},72204:(e,t,r)=>{var A=r(35314),n=r(34878);e.exports=function(e,t){return A(e,t,(function(t,r){return n(e,r)}))}},35314:(e,t,r)=>{var A=r(84173),n=r(10624),o=r(56725);e.exports=function(e,t,r){for(var i=-1,s=t.length,a={};++i{e.exports=function(e){return function(t){return null==t?void 0:t[e]}}},43018:(e,t,r)=>{var A=r(84173);e.exports=function(e){return function(t){return A(t,e)}}},51587:e=>{e.exports=function(e){return function(t){return null==e?void 0:e[t]}}},30383:(e,t,r)=>{var A=r(61977),n=r(44322),o=r(3111);e.exports=function(e,t){return o(n(e,t,A),e+"")}},10624:(e,t,r)=>{var A=r(65759),n=r(56725),o=r(98041),i=r(46778),s=r(49874);e.exports=function(e,t,r,a){if(!i(e))return e;for(var c=-1,g=(t=n(t,e)).length,l=g-1,u=e;null!=u&&++c{var A=r(4967),n=r(65),o=r(61977),i=n?function(e,t){return n(e,"toString",{configurable:!0,enumerable:!1,value:A(t),writable:!0})}:o;e.exports=i},27708:e=>{e.exports=function(e,t,r){var A=-1,n=e.length;t<0&&(t=-t>n?0:n+t),(r=r>n?n:r)<0&&(r+=n),n=t>r?0:r-t>>>0,t>>>=0;for(var o=Array(n);++A{e.exports=function(e,t){for(var r=-1,A=Array(e);++r{var A=r(69976),n=r(60783),o=r(82664),i=r(65558),s=A?A.prototype:void 0,a=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(o(t))return n(t,e)+"";if(i(t))return a?a.call(t):"";var r=t+"";return"0"==r&&1/t==-1/0?"-0":r}},73635:e=>{e.exports=function(e){return function(t){return e(t)}}},18290:(e,t,r)=>{var A=r(60783);e.exports=function(e,t){return A(t,(function(t){return e[t]}))}},93022:e=>{e.exports=function(e,t){return e.has(t)}},56725:(e,t,r)=>{var A=r(82664),n=r(70474),o=r(8689),i=r(33580);e.exports=function(e,t){return A(e)?e:n(e,t)?[e]:o(i(e))}},92568:(e,t,r)=>{var A=r(27708);e.exports=function(e,t,r){var n=e.length;return r=void 0===r?n:r,!t&&r>=n?e:A(e,t,r)}},76255:(e,t,r)=>{var A=r(2740);e.exports=function(e){var t=new e.constructor(e.byteLength);return new A(t).set(new A(e)),t}},64266:(e,t,r)=>{e=r.nmd(e);var A=r(76169),n=t&&!t.nodeType&&t,o=n&&e&&!e.nodeType&&e,i=o&&o.exports===n?A.Buffer:void 0,s=i?i.allocUnsafe:void 0;e.exports=function(e,t){if(t)return e.slice();var r=e.length,A=s?s(r):new e.constructor(r);return e.copy(A),A}},63749:(e,t,r)=>{var A=r(76255);e.exports=function(e,t){var r=t?A(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.byteLength)}},41705:e=>{var t=/\w*$/;e.exports=function(e){var r=new e.constructor(e.source,t.exec(e));return r.lastIndex=e.lastIndex,r}},25791:(e,t,r)=>{var A=r(69976),n=A?A.prototype:void 0,o=n?n.valueOf:void 0;e.exports=function(e){return o?Object(o.call(e)):{}}},58042:(e,t,r)=>{var A=r(76255);e.exports=function(e,t){var r=t?A(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.length)}},87229:e=>{e.exports=function(e,t){var r=-1,A=e.length;for(t||(t=Array(A));++r{var A=r(65759),n=r(91198);e.exports=function(e,t,r,o){var i=!r;r||(r={});for(var s=-1,a=t.length;++s{var A=r(75182),n=r(68727);e.exports=function(e,t){return A(e,n(e),t)}},60741:(e,t,r)=>{var A=r(75182),n=r(35368);e.exports=function(e,t){return A(e,n(e),t)}},14429:(e,t,r)=>{var A=r(76169)["__core-js_shared__"];e.exports=A},27913:(e,t,r)=>{var A=r(30383),n=r(33193);e.exports=function(e){return A((function(t,r){var A=-1,o=r.length,i=o>1?r[o-1]:void 0,s=o>2?r[2]:void 0;for(i=e.length>3&&"function"==typeof i?(o--,i):void 0,s&&n(r[0],r[1],s)&&(i=o<3?void 0:i,o=1),t=Object(t);++A{e.exports=function(e){return function(t,r,A){for(var n=-1,o=Object(t),i=A(t),s=i.length;s--;){var a=i[e?s:++n];if(!1===r(o[a],a,o))break}return t}}},56989:(e,t,r)=>{var A=r(92568),n=r(93024),o=r(30475),i=r(33580);e.exports=function(e){return function(t){t=i(t);var r=n(t)?o(t):void 0,s=r?r[0]:t.charAt(0),a=r?A(r,1).join(""):t.slice(1);return s[e]()+a}}},30369:(e,t,r)=>{var A=r(66054),n=r(68968),o=r(97684),i=RegExp("['’]","g");e.exports=function(e){return function(t){return A(o(n(t).replace(i,"")),e,"")}}},69922:(e,t,r)=>{var A=r(51587)({À:"A",Ã:"A",Â:"A",Ã:"A",Ä:"A",Ã…:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",Ã¥:"a",Ç:"C",ç:"c",Ã:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",ÃŒ:"I",Ã:"I",ÃŽ:"I",Ã:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ã’:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ãœ:"U",ù:"u",ú:"u",û:"u",ü:"u",Ã:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ä€:"A",Ä‚:"A",Ä„:"A",Ä:"a",ă:"a",Ä…:"a",Ć:"C",Ĉ:"C",ÄŠ:"C",ÄŒ:"C",ć:"c",ĉ:"c",Ä‹:"c",Ä:"c",ÄŽ:"D",Ä:"D",Ä:"d",Ä‘:"d",Ä’:"E",Ä”:"E",Ä–:"E",Ę:"E",Äš:"E",Ä“:"e",Ä•:"e",Ä—:"e",Ä™:"e",Ä›:"e",Äœ:"G",Äž:"G",Ä :"G",Ä¢:"G",Ä:"g",ÄŸ:"g",Ä¡:"g",Ä£:"g",Ĥ:"H",Ħ:"H",Ä¥:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Ä®:"I",Ä°:"I",Ä©:"i",Ä«:"i",Ä­:"i",į:"i",ı:"i",Ä´:"J",ĵ:"j",Ķ:"K",Ä·:"k",ĸ:"k",Ĺ:"L",Ä»:"L",Ľ:"L",Ä¿:"L",Å:"L",ĺ:"l",ļ:"l",ľ:"l",Å€:"l",Å‚:"l",Ń:"N",Å…:"N",Ň:"N",ÅŠ:"N",Å„:"n",ņ:"n",ň:"n",Å‹:"n",ÅŒ:"O",ÅŽ:"O",Å:"O",Å:"o",Å:"o",Å‘:"o",Å”:"R",Å–:"R",Ř:"R",Å•:"r",Å—:"r",Å™:"r",Åš:"S",Åœ:"S",Åž:"S",Å :"S",Å›:"s",Å:"s",ÅŸ:"s",Å¡:"s",Å¢:"T",Ť:"T",Ŧ:"T",Å£:"t",Å¥:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Å®:"U",Å°:"U",Ų:"U",Å©:"u",Å«:"u",Å­:"u",ů:"u",ű:"u",ų:"u",Å´:"W",ŵ:"w",Ŷ:"Y",Å·:"y",Ÿ:"Y",Ź:"Z",Å»:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Å’:"Oe",Å“:"oe",ʼn:"'n",Å¿:"s"});e.exports=A},65:(e,t,r)=>{var A=r(99513),n=function(){try{var e=A(Object,"defineProperty");return e({},"",{}),e}catch(e){}}();e.exports=n},75500:(e,t,r)=>{var A=r(46235),n=r(17765),o=r(93022);e.exports=function(e,t,r,i,s,a){var c=1&r,g=e.length,l=t.length;if(g!=l&&!(c&&l>g))return!1;var u=a.get(e);if(u&&a.get(t))return u==t;var h=-1,p=!0,d=2&r?new A:void 0;for(a.set(e,t),a.set(t,e);++h{var A=r(69976),n=r(2740),o=r(71074),i=r(75500),s=r(7877),a=r(7442),c=A?A.prototype:void 0,g=c?c.valueOf:void 0;e.exports=function(e,t,r,A,c,l,u){switch(r){case"[object DataView]":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case"[object ArrayBuffer]":return!(e.byteLength!=t.byteLength||!l(new n(e),new n(t)));case"[object Boolean]":case"[object Date]":case"[object Number]":return o(+e,+t);case"[object Error]":return e.name==t.name&&e.message==t.message;case"[object RegExp]":case"[object String]":return e==t+"";case"[object Map]":var h=s;case"[object Set]":var p=1&A;if(h||(h=a),e.size!=t.size&&!p)return!1;var d=u.get(e);if(d)return d==t;A|=2,u.set(e,t);var C=i(h(e),h(t),A,c,l,u);return u.delete(e),C;case"[object Symbol]":if(g)return g.call(e)==g.call(t)}return!1}},50245:(e,t,r)=>{var A=r(60753),n=Object.prototype.hasOwnProperty;e.exports=function(e,t,r,o,i,s){var a=1&r,c=A(e),g=c.length;if(g!=A(t).length&&!a)return!1;for(var l=g;l--;){var u=c[l];if(!(a?u in t:n.call(t,u)))return!1}var h=s.get(e);if(h&&s.get(t))return h==t;var p=!0;s.set(e,t),s.set(t,e);for(var d=a;++l{var A=r(54690),n=r(44322),o=r(3111);e.exports=function(e){return o(n(e,void 0,A),e+"")}},68399:e=>{var t="object"==typeof global&&global&&global.Object===Object&&global;e.exports=t},60753:(e,t,r)=>{var A=r(40104),n=r(68727),o=r(42185);e.exports=function(e){return A(e,o,n)}},64420:(e,t,r)=>{var A=r(40104),n=r(35368),o=r(24887);e.exports=function(e){return A(e,o,n)}},59253:(e,t,r)=>{var A=r(69448);e.exports=function(e,t){var r=e.__data__;return A(t)?r["string"==typeof t?"string":"hash"]:r.map}},98705:(e,t,r)=>{var A=r(20925),n=r(42185);e.exports=function(e){for(var t=n(e),r=t.length;r--;){var o=t[r],i=e[o];t[r]=[o,i,A(i)]}return t}},99513:(e,t,r)=>{var A=r(91686),n=r(98054);e.exports=function(e,t){var r=n(e,t);return A(r)?r:void 0}},41181:(e,t,r)=>{var A=r(64309)(Object.getPrototypeOf,Object);e.exports=A},2854:(e,t,r)=>{var A=r(69976),n=Object.prototype,o=n.hasOwnProperty,i=n.toString,s=A?A.toStringTag:void 0;e.exports=function(e){var t=o.call(e,s),r=e[s];try{e[s]=void 0;var A=!0}catch(e){}var n=i.call(e);return A&&(t?e[s]=r:delete e[s]),n}},68727:(e,t,r)=>{var A=r(9073),n=r(62162),o=Object.prototype.propertyIsEnumerable,i=Object.getOwnPropertySymbols,s=i?function(e){return null==e?[]:(e=Object(e),A(i(e),(function(t){return o.call(e,t)})))}:n;e.exports=s},35368:(e,t,r)=>{var A=r(40945),n=r(41181),o=r(68727),i=r(62162),s=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)A(t,o(e)),e=n(e);return t}:i;e.exports=s},79435:(e,t,r)=>{var A=r(78962),n=r(63603),o=r(5825),i=r(43231),s=r(47063),a=r(52502),c=r(76384),g=c(A),l=c(n),u=c(o),h=c(i),p=c(s),d=a;(A&&"[object DataView]"!=d(new A(new ArrayBuffer(1)))||n&&"[object Map]"!=d(new n)||o&&"[object Promise]"!=d(o.resolve())||i&&"[object Set]"!=d(new i)||s&&"[object WeakMap]"!=d(new s))&&(d=function(e){var t=a(e),r="[object Object]"==t?e.constructor:void 0,A=r?c(r):"";if(A)switch(A){case g:return"[object DataView]";case l:return"[object Map]";case u:return"[object Promise]";case h:return"[object Set]";case p:return"[object WeakMap]"}return t}),e.exports=d},98054:e=>{e.exports=function(e,t){return null==e?void 0:e[t]}},71507:(e,t,r)=>{var A=r(56725),n=r(61771),o=r(82664),i=r(98041),s=r(46369),a=r(49874);e.exports=function(e,t,r){for(var c=-1,g=(t=A(t,e)).length,l=!1;++c{var t=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");e.exports=function(e){return t.test(e)}},60466:e=>{var t=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;e.exports=function(e){return t.test(e)}},31713:(e,t,r)=>{var A=r(52437);e.exports=function(){this.__data__=A?A(null):{},this.size=0}},86688:e=>{e.exports=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}},45937:(e,t,r)=>{var A=r(52437),n=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;if(A){var r=t[e];return"__lodash_hash_undefined__"===r?void 0:r}return n.call(t,e)?t[e]:void 0}},5017:(e,t,r)=>{var A=r(52437),n=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;return A?void 0!==t[e]:n.call(t,e)}},79457:(e,t,r)=>{var A=r(52437);e.exports=function(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=A&&void 0===t?"__lodash_hash_undefined__":t,this}},27908:e=>{var t=Object.prototype.hasOwnProperty;e.exports=function(e){var r=e.length,A=new e.constructor(r);return r&&"string"==typeof e[0]&&t.call(e,"index")&&(A.index=e.index,A.input=e.input),A}},37836:(e,t,r)=>{var A=r(76255),n=r(63749),o=r(41705),i=r(25791),s=r(58042);e.exports=function(e,t,r){var a=e.constructor;switch(t){case"[object ArrayBuffer]":return A(e);case"[object Boolean]":case"[object Date]":return new a(+e);case"[object DataView]":return n(e,r);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return s(e,r);case"[object Map]":return new a;case"[object Number]":case"[object String]":return new a(e);case"[object RegExp]":return o(e);case"[object Set]":return new a;case"[object Symbol]":return i(e)}}},88438:(e,t,r)=>{var A=r(15178),n=r(41181),o=r(89513);e.exports=function(e){return"function"!=typeof e.constructor||o(e)?{}:A(n(e))}},958:(e,t,r)=>{var A=r(69976),n=r(61771),o=r(82664),i=A?A.isConcatSpreadable:void 0;e.exports=function(e){return o(e)||n(e)||!!(i&&e&&e[i])}},98041:e=>{var t=/^(?:0|[1-9]\d*)$/;e.exports=function(e,r){var A=typeof e;return!!(r=null==r?9007199254740991:r)&&("number"==A||"symbol"!=A&&t.test(e))&&e>-1&&e%1==0&&e{var A=r(71074),n=r(41929),o=r(98041),i=r(46778);e.exports=function(e,t,r){if(!i(r))return!1;var s=typeof t;return!!("number"==s?n(r)&&o(t,r.length):"string"==s&&t in r)&&A(r[t],e)}},70474:(e,t,r)=>{var A=r(82664),n=r(65558),o=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,i=/^\w*$/;e.exports=function(e,t){if(A(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!n(e))||(i.test(e)||!o.test(e)||null!=t&&e in Object(t))}},69448:e=>{e.exports=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}},15061:(e,t,r)=>{var A,n=r(14429),o=(A=/[^.]+$/.exec(n&&n.keys&&n.keys.IE_PROTO||""))?"Symbol(src)_1."+A:"";e.exports=function(e){return!!o&&o in e}},89513:e=>{var t=Object.prototype;e.exports=function(e){var r=e&&e.constructor;return e===("function"==typeof r&&r.prototype||t)}},20925:(e,t,r)=>{var A=r(46778);e.exports=function(e){return e==e&&!A(e)}},82262:e=>{e.exports=function(e){for(var t,r=[];!(t=e.next()).done;)r.push(t.value);return r}},14620:e=>{e.exports=function(){this.__data__=[],this.size=0}},73682:(e,t,r)=>{var A=r(39836),n=Array.prototype.splice;e.exports=function(e){var t=this.__data__,r=A(t,e);return!(r<0)&&(r==t.length-1?t.pop():n.call(t,r,1),--this.size,!0)}},43112:(e,t,r)=>{var A=r(39836);e.exports=function(e){var t=this.__data__,r=A(t,e);return r<0?void 0:t[r][1]}},90640:(e,t,r)=>{var A=r(39836);e.exports=function(e){return A(this.__data__,e)>-1}},9380:(e,t,r)=>{var A=r(39836);e.exports=function(e,t){var r=this.__data__,n=A(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this}},18209:(e,t,r)=>{var A=r(72574),n=r(29197),o=r(63603);e.exports=function(){this.size=0,this.__data__={hash:new A,map:new(o||n),string:new A}}},89706:(e,t,r)=>{var A=r(59253);e.exports=function(e){var t=A(this,e).delete(e);return this.size-=t?1:0,t}},43786:(e,t,r)=>{var A=r(59253);e.exports=function(e){return A(this,e).get(e)}},17926:(e,t,r)=>{var A=r(59253);e.exports=function(e){return A(this,e).has(e)}},87345:(e,t,r)=>{var A=r(59253);e.exports=function(e,t){var r=A(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this}},7877:e=>{e.exports=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e,A){r[++t]=[A,e]})),r}},12757:e=>{e.exports=function(e,t){return function(r){return null!=r&&(r[e]===t&&(void 0!==t||e in Object(r)))}}},31948:(e,t,r)=>{var A=r(74499);e.exports=function(e){var t=A(e,(function(e){return 500===r.size&&r.clear(),e})),r=t.cache;return t}},52437:(e,t,r)=>{var A=r(99513)(Object,"create");e.exports=A},60657:(e,t,r)=>{var A=r(64309)(Object.keys,Object);e.exports=A},95632:e=>{e.exports=function(e){var t=[];if(null!=e)for(var r in Object(e))t.push(r);return t}},26391:(e,t,r)=>{e=r.nmd(e);var A=r(68399),n=t&&!t.nodeType&&t,o=n&&e&&!e.nodeType&&e,i=o&&o.exports===n&&A.process,s=function(){try{var e=o&&o.require&&o.require("util").types;return e||i&&i.binding&&i.binding("util")}catch(e){}}();e.exports=s},87427:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},64309:e=>{e.exports=function(e,t){return function(r){return e(t(r))}}},44322:(e,t,r)=>{var A=r(66636),n=Math.max;e.exports=function(e,t,r){return t=n(void 0===t?e.length-1:t,0),function(){for(var o=arguments,i=-1,s=n(o.length-t,0),a=Array(s);++i{var A=r(68399),n="object"==typeof self&&self&&self.Object===Object&&self,o=A||n||Function("return this")();e.exports=o},36883:e=>{e.exports=function(e,t){if(("constructor"!==t||"function"!=typeof e[t])&&"__proto__"!=t)return e[t]}},74785:e=>{e.exports=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this}},87760:e=>{e.exports=function(e){return this.__data__.has(e)}},7442:e=>{e.exports=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e){r[++t]=e})),r}},3111:(e,t,r)=>{var A=r(4899),n=r(19908)(A);e.exports=n},19908:e=>{var t=Date.now;e.exports=function(e){var r=0,A=0;return function(){var n=t(),o=16-(n-A);if(A=n,o>0){if(++r>=800)return arguments[0]}else r=0;return e.apply(void 0,arguments)}}},35678:(e,t,r)=>{var A=r(29197);e.exports=function(){this.__data__=new A,this.size=0}},33336:e=>{e.exports=function(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r}},97163:e=>{e.exports=function(e){return this.__data__.get(e)}},43737:e=>{e.exports=function(e){return this.__data__.has(e)}},48548:(e,t,r)=>{var A=r(29197),n=r(63603),o=r(75009);e.exports=function(e,t){var r=this.__data__;if(r instanceof A){var i=r.__data__;if(!n||i.length<199)return i.push([e,t]),this.size=++r.size,this;r=this.__data__=new o(i)}return r.set(e,t),this.size=r.size,this}},30475:(e,t,r)=>{var A=r(1051),n=r(93024),o=r(297);e.exports=function(e){return n(e)?o(e):A(e)}},8689:(e,t,r)=>{var A=r(31948),n=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,o=/\\(\\)?/g,i=A((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(n,(function(e,r,A,n){t.push(A?n.replace(o,"$1"):r||e)})),t}));e.exports=i},49874:(e,t,r)=>{var A=r(65558);e.exports=function(e){if("string"==typeof e||A(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}},76384:e=>{var t=Function.prototype.toString;e.exports=function(e){if(null!=e){try{return t.call(e)}catch(e){}try{return e+""}catch(e){}}return""}},297:e=>{var t="[\\ud800-\\udfff]",r="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",A="\\ud83c[\\udffb-\\udfff]",n="[^\\ud800-\\udfff]",o="(?:\\ud83c[\\udde6-\\uddff]){2}",i="[\\ud800-\\udbff][\\udc00-\\udfff]",s="(?:"+r+"|"+A+")"+"?",a="[\\ufe0e\\ufe0f]?"+s+("(?:\\u200d(?:"+[n,o,i].join("|")+")[\\ufe0e\\ufe0f]?"+s+")*"),c="(?:"+[n+r+"?",r,o,i,t].join("|")+")",g=RegExp(A+"(?="+A+")|"+c+a,"g");e.exports=function(e){return e.match(g)||[]}},89887:e=>{var t="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",r="["+t+"]",A="\\d+",n="[\\u2700-\\u27bf]",o="[a-z\\xdf-\\xf6\\xf8-\\xff]",i="[^\\ud800-\\udfff"+t+A+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",s="(?:\\ud83c[\\udde6-\\uddff]){2}",a="[\\ud800-\\udbff][\\udc00-\\udfff]",c="[A-Z\\xc0-\\xd6\\xd8-\\xde]",g="(?:"+o+"|"+i+")",l="(?:"+c+"|"+i+")",u="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",h="[\\ufe0e\\ufe0f]?"+u+("(?:\\u200d(?:"+["[^\\ud800-\\udfff]",s,a].join("|")+")[\\ufe0e\\ufe0f]?"+u+")*"),p="(?:"+[n,s,a].join("|")+")"+h,d=RegExp([c+"?"+o+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[r,c,"$"].join("|")+")",l+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[r,c+g,"$"].join("|")+")",c+"?"+g+"+(?:['’](?:d|ll|m|re|s|t|ve))?",c+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",A,p].join("|"),"g");e.exports=function(e){return e.match(d)||[]}},89170:(e,t,r)=>{var A=r(61814),n=r(30369)((function(e,t,r){return t=t.toLowerCase(),e+(r?A(t):t)}));e.exports=n},61814:(e,t,r)=>{var A=r(33580),n=r(72609);e.exports=function(e){return n(A(e).toLowerCase())}},82558:(e,t,r)=>{var A=r(41076);e.exports=function(e){return A(e,5)}},26052:(e,t,r)=>{var A=r(41076);e.exports=function(e,t){return A(e,5,t="function"==typeof t?t:void 0)}},4967:e=>{e.exports=function(e){return function(){return e}}},68968:(e,t,r)=>{var A=r(69922),n=r(33580),o=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,i=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");e.exports=function(e){return(e=n(e))&&e.replace(o,A).replace(i,"")}},71074:e=>{e.exports=function(e,t){return e===t||e!=e&&t!=t}},54690:(e,t,r)=>{var A=r(93274);e.exports=function(e){return(null==e?0:e.length)?A(e,1):[]}},44674:(e,t,r)=>{var A=r(84173);e.exports=function(e,t,r){var n=null==e?void 0:A(e,t);return void 0===n?r:n}},15215:(e,t,r)=>{var A=r(95325),n=r(71507);e.exports=function(e,t){return null!=e&&n(e,t,A)}},34878:(e,t,r)=>{var A=r(3881),n=r(71507);e.exports=function(e,t){return null!=e&&n(e,t,A)}},61977:e=>{e.exports=function(e){return e}},61771:(e,t,r)=>{var A=r(76357),n=r(38496),o=Object.prototype,i=o.hasOwnProperty,s=o.propertyIsEnumerable,a=A(function(){return arguments}())?A:function(e){return n(e)&&i.call(e,"callee")&&!s.call(e,"callee")};e.exports=a},82664:e=>{var t=Array.isArray;e.exports=t},41929:(e,t,r)=>{var A=r(92533),n=r(46369);e.exports=function(e){return null!=e&&n(e.length)&&!A(e)}},16064:(e,t,r)=>{var A=r(41929),n=r(38496);e.exports=function(e){return n(e)&&A(e)}},10667:(e,t,r)=>{e=r.nmd(e);var A=r(76169),n=r(88988),o=t&&!t.nodeType&&t,i=o&&e&&!e.nodeType&&e,s=i&&i.exports===o?A.Buffer:void 0,a=(s?s.isBuffer:void 0)||n;e.exports=a},92533:(e,t,r)=>{var A=r(52502),n=r(46778);e.exports=function(e){if(!n(e))return!1;var t=A(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t}},46369:e=>{e.exports=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}},13349:(e,t,r)=>{var A=r(55994),n=r(73635),o=r(26391),i=o&&o.isMap,s=i?n(i):A;e.exports=s},46778:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},38496:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},11672:(e,t,r)=>{var A=r(52502),n=r(41181),o=r(38496),i=Function.prototype,s=Object.prototype,a=i.toString,c=s.hasOwnProperty,g=a.call(Object);e.exports=function(e){if(!o(e)||"[object Object]"!=A(e))return!1;var t=n(e);if(null===t)return!0;var r=c.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&a.call(r)==g}},33931:(e,t,r)=>{var A=r(28612),n=r(73635),o=r(26391),i=o&&o.isSet,s=i?n(i):A;e.exports=s},221:(e,t,r)=>{var A=r(52502),n=r(82664),o=r(38496);e.exports=function(e){return"string"==typeof e||!n(e)&&o(e)&&"[object String]"==A(e)}},65558:(e,t,r)=>{var A=r(52502),n=r(38496);e.exports=function(e){return"symbol"==typeof e||n(e)&&"[object Symbol]"==A(e)}},32565:(e,t,r)=>{var A=r(98998),n=r(73635),o=r(26391),i=o&&o.isTypedArray,s=i?n(i):A;e.exports=s},42185:(e,t,r)=>{var A=r(11886),n=r(50994),o=r(41929);e.exports=function(e){return o(e)?A(e):n(e)}},24887:(e,t,r)=>{var A=r(11886),n=r(8372),o=r(41929);e.exports=function(e){return o(e)?A(e,!0):n(e)}},5253:(e,t,r)=>{var A=r(91198),n=r(62164),o=r(42208);e.exports=function(e,t){var r={};return t=o(t,3),n(e,(function(e,n,o){A(r,t(e,n,o),e)})),r}},89612:(e,t,r)=>{var A=r(91198),n=r(62164),o=r(42208);e.exports=function(e,t){var r={};return t=o(t,3),n(e,(function(e,n,o){A(r,n,t(e,n,o))})),r}},74499:(e,t,r)=>{var A=r(75009);function n(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var r=function(){var A=arguments,n=t?t.apply(this,A):A[0],o=r.cache;if(o.has(n))return o.get(n);var i=e.apply(this,A);return r.cache=o.set(n,i)||o,i};return r.cache=new(n.Cache||A),r}n.Cache=A,e.exports=n},80305:(e,t,r)=>{var A=r(51264),n=r(27913)((function(e,t,r){A(e,t,r)}));e.exports=n},75130:(e,t,r)=>{var A=r(72204),n=r(87298)((function(e,t){return null==e?{}:A(e,t)}));e.exports=n},7430:(e,t,r)=>{var A=r(35400),n=r(43018),o=r(70474),i=r(49874);e.exports=function(e){return o(e)?A(i(e)):n(e)}},81534:(e,t,r)=>{var A=r(10624);e.exports=function(e,t,r){return null==e?e:A(e,t,r)}},36494:(e,t,r)=>{var A=r(30369)((function(e,t,r){return e+(r?"_":"")+t.toLowerCase()}));e.exports=A},62162:e=>{e.exports=function(){return[]}},88988:e=>{e.exports=function(){return!1}},78700:(e,t,r)=>{var A=r(69976),n=r(87229),o=r(79435),i=r(41929),s=r(221),a=r(82262),c=r(7877),g=r(7442),l=r(30475),u=r(24448),h=A?A.iterator:void 0;e.exports=function(e){if(!e)return[];if(i(e))return s(e)?l(e):n(e);if(h&&e[h])return a(e[h]());var t=o(e);return("[object Map]"==t?c:"[object Set]"==t?g:u)(e)}},36506:(e,t,r)=>{var A=r(75182),n=r(24887);e.exports=function(e){return A(e,n(e))}},33580:(e,t,r)=>{var A=r(35);e.exports=function(e){return null==e?"":A(e)}},72609:(e,t,r)=>{var A=r(56989)("toUpperCase");e.exports=A},24448:(e,t,r)=>{var A=r(18290),n=r(42185);e.exports=function(e){return null==e?[]:A(e,n(e))}},97684:(e,t,r)=>{var A=r(11852),n=r(60466),o=r(33580),i=r(89887);e.exports=function(e,t,r){return e=o(e),void 0===(t=r?void 0:t)?n(e)?i(e):A(e):e.match(t)||[]}},55737:e=>{"use strict";e.exports=e=>{const t={};for(const[r,A]of Object.entries(e))t[r.toLowerCase()]=A;return t}},46227:(e,t,r)=>{"use strict";const A=r(35747),n=r(85622),{promisify:o}=r(31669),i=r(95584).satisfies(process.version,">=10.12.0"),s=e=>{if("win32"===process.platform){if(/[<>:"|?*]/.test(e.replace(n.parse(e).root,""))){const t=new Error("Path contains invalid characters: "+e);throw t.code="EINVAL",t}}},a=e=>({...{mode:511,fs:A},...e}),c=e=>{const t=new Error(`operation not permitted, mkdir '${e}'`);return t.code="EPERM",t.errno=-4048,t.path=e,t.syscall="mkdir",t};e.exports=async(e,t)=>{s(e),t=a(t);const r=o(t.fs.mkdir),g=o(t.fs.stat);if(i&&t.fs.mkdir===A.mkdir){const A=n.resolve(e);return await r(A,{mode:t.mode,recursive:!0}),A}const l=async e=>{try{return await r(e,t.mode),e}catch(t){if("EPERM"===t.code)throw t;if("ENOENT"===t.code){if(n.dirname(e)===e)throw c(e);if(t.message.includes("null bytes"))throw t;return await l(n.dirname(e)),l(e)}try{if(!(await g(e)).isDirectory())throw new Error("The path is not a directory")}catch(e){throw t}return e}};return l(n.resolve(e))},e.exports.sync=(e,t)=>{if(s(e),t=a(t),i&&t.fs.mkdirSync===A.mkdirSync){const r=n.resolve(e);return A.mkdirSync(r,{mode:t.mode,recursive:!0}),r}const r=e=>{try{t.fs.mkdirSync(e,t.mode)}catch(A){if("EPERM"===A.code)throw A;if("ENOENT"===A.code){if(n.dirname(e)===e)throw c(e);if(A.message.includes("null bytes"))throw A;return r(n.dirname(e)),r(e)}try{if(!t.fs.statSync(e).isDirectory())throw new Error("The path is not a directory")}catch(e){throw A}}return e};return r(n.resolve(e))}},55598:(e,t,r)=>{"use strict";const A=r(92413).PassThrough,n=Array.prototype.slice;function o(e,t){if(Array.isArray(e))for(let r=0,A=e.length;r0||(t=!1,g())}function o(e){function t(){e.removeListener("merge2UnpipeEnd",t),e.removeListener("end",t),n()}if(e._readableState.endEmitted)return n();e.on("merge2UnpipeEnd",t),e.on("end",t),e.pipe(a,{end:!1}),e.resume()}for(let e=0;e{"use strict";const A=r(31669),n=r(12235),o=r(54722),i=r(3598),s=e=>"string"==typeof e&&(""===e||"./"===e),a=(e,t,r)=>{t=[].concat(t),e=[].concat(e);let A=new Set,n=new Set,i=new Set,s=0,a=e=>{i.add(e.output),r&&r.onResult&&r.onResult(e)};for(let i=0;i!A.has(e));if(r&&0===c.length){if(!0===r.failglob)throw new Error(`No matches found for "${t.join(", ")}"`);if(!0===r.nonull||!0===r.nullglob)return r.unescape?t.map(e=>e.replace(/\\/g,"")):t}return c};a.match=a,a.matcher=(e,t)=>o(e,t),a.any=a.isMatch=(e,t,r)=>o(t,r)(e),a.not=(e,t,r={})=>{t=[].concat(t).map(String);let A=new Set,n=[],o=a(e,t,{...r,onResult:e=>{r.onResult&&r.onResult(e),n.push(e.output)}});for(let e of n)o.includes(e)||A.add(e);return[...A]},a.contains=(e,t,r)=>{if("string"!=typeof e)throw new TypeError(`Expected a string: "${A.inspect(e)}"`);if(Array.isArray(t))return t.some(t=>a.contains(e,t,r));if("string"==typeof t){if(s(e)||s(t))return!1;if(e.includes(t)||e.startsWith("./")&&e.slice(2).includes(t))return!0}return a.isMatch(e,t,{...r,contains:!0})},a.matchKeys=(e,t,r)=>{if(!i.isObject(e))throw new TypeError("Expected the first argument to be an object");let A=a(Object.keys(e),t,r),n={};for(let t of A)n[t]=e[t];return n},a.some=(e,t,r)=>{let A=[].concat(e);for(let e of[].concat(t)){let t=o(String(e),r);if(A.some(e=>t(e)))return!0}return!1},a.every=(e,t,r)=>{let A=[].concat(e);for(let e of[].concat(t)){let t=o(String(e),r);if(!A.every(e=>t(e)))return!1}return!0},a.all=(e,t,r)=>{if("string"!=typeof e)throw new TypeError(`Expected a string: "${A.inspect(e)}"`);return[].concat(t).every(t=>o(t,r)(e))},a.capture=(e,t,r)=>{let A=i.isWindows(r),n=o.makeRe(String(e),{...r,capture:!0}).exec(A?i.toPosixSlashes(t):t);if(n)return n.slice(1).map(e=>void 0===e?"":e)},a.makeRe=(...e)=>o.makeRe(...e),a.scan=(...e)=>o.scan(...e),a.parse=(e,t)=>{let r=[];for(let A of[].concat(e||[]))for(let e of n(String(A),t))r.push(o.parse(e,t));return r},a.braces=(e,t)=>{if("string"!=typeof e)throw new TypeError("Expected a string");return t&&!0===t.nobrace||!/\{.*\}/.test(e)?[e]:n(e,t)},a.braceExpand=(e,t)=>{if("string"!=typeof e)throw new TypeError("Expected a string");return a.braces(e,{...t,expand:!0})},e.exports=a},65007:e=>{"use strict";const t=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];e.exports=(e,r)=>{const A=new Set(Object.keys(e).concat(t));for(const t of A)t in r||(r[t]="function"==typeof e[t]?e[t].bind(e):e[t])}},33527:e=>{"use strict";const t=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];e.exports=(e,r)=>{if(r._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");const A=new Set(Object.keys(e).concat(t)),n={};for(const t of A)t in r||(n[t]={get(){const r=e[t];return"function"==typeof r?r.bind(e):r},set(r){e[t]=r},enumerable:!0,configurable:!1});return Object.defineProperties(r,n),e.once("aborted",()=>{r.destroy(),r.emit("aborted")}),e.once("close",()=>{e.complete&&r.readable?r.once("end",()=>{r.emit("close")}):r.emit("close")}),r}},19793:(e,t,r)=>{"use strict";const A="undefined"==typeof URL?r(78835).URL:URL,n=(e,t)=>t.some(t=>t instanceof RegExp?t.test(e):t===e),o=(e,t)=>{if(t={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...t},Reflect.has(t,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(t,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(t,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(e=e.trim(),/^data:/i.test(e))return((e,{stripHash:t})=>{const r=e.match(/^data:(.*?),(.*?)(?:#(.*))?$/);if(!r)throw new Error("Invalid URL: "+e);const A=r[1].split(";"),n=r[2],o=t?"":r[3];let i=!1;"base64"===A[A.length-1]&&(A.pop(),i=!0);const s=(A.shift()||"").toLowerCase(),a=[...A.map(e=>{let[t,r=""]=e.split("=").map(e=>e.trim());return"charset"===t&&(r=r.toLowerCase(),"us-ascii"===r)?"":`${t}${r?"="+r:""}`}).filter(Boolean)];return i&&a.push("base64"),(0!==a.length||s&&"text/plain"!==s)&&a.unshift(s),`data:${a.join(";")},${i?n.trim():n}${o?"#"+o:""}`})(e,t);const r=e.startsWith("//");!r&&/^\.*\//.test(e)||(e=e.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,t.defaultProtocol));const o=new A(e);if(t.forceHttp&&t.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(t.forceHttp&&"https:"===o.protocol&&(o.protocol="http:"),t.forceHttps&&"http:"===o.protocol&&(o.protocol="https:"),t.stripAuthentication&&(o.username="",o.password=""),t.stripHash&&(o.hash=""),o.pathname&&(o.pathname=o.pathname.replace(/((?!:).|^)\/{2,}/g,(e,t)=>/^(?!\/)/g.test(t)?t+"/":"/")),o.pathname&&(o.pathname=decodeURI(o.pathname)),!0===t.removeDirectoryIndex&&(t.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(t.removeDirectoryIndex)&&t.removeDirectoryIndex.length>0){let e=o.pathname.split("/");const r=e[e.length-1];n(r,t.removeDirectoryIndex)&&(e=e.slice(0,e.length-1),o.pathname=e.slice(1).join("/")+"/")}if(o.hostname&&(o.hostname=o.hostname.replace(/\.$/,""),t.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(o.hostname)&&(o.hostname=o.hostname.replace(/^www\./,""))),Array.isArray(t.removeQueryParameters))for(const e of[...o.searchParams.keys()])n(e,t.removeQueryParameters)&&o.searchParams.delete(e);return t.sortQueryParameters&&o.searchParams.sort(),t.removeTrailingSlash&&(o.pathname=o.pathname.replace(/\/$/,"")),e=o.toString(),!t.removeTrailingSlash&&"/"!==o.pathname||""!==o.hash||(e=e.replace(/\/$/,"")),r&&!t.normalizeProtocol&&(e=e.replace(/^http:\/\//,"//")),t.stripProtocol&&(e=e.replace(/^(?:https?:)?\/\//,"")),e};e.exports=o,e.exports.default=o},91162:(e,t,r)=>{var A=r(98984);function n(e){var t=function(){return t.called?t.value:(t.called=!0,t.value=e.apply(this,arguments))};return t.called=!1,t}e.exports=A(n),n.proto=n((function(){Object.defineProperty(Function.prototype,"once",{value:function(){return n(this)},configurable:!0})}))},27180:(e,t,r)=>{var A=r(98984);function n(e){var t=function(){return t.called?t.value:(t.called=!0,t.value=e.apply(this,arguments))};return t.called=!1,t}function o(e){var t=function(){if(t.called)throw new Error(t.onceError);return t.called=!0,t.value=e.apply(this,arguments)},r=e.name||"Function wrapped with `once`";return t.onceError=r+" shouldn't be called more than once",t.called=!1,t}e.exports=A(n),e.exports.strict=A(o),n.proto=n((function(){Object.defineProperty(Function.prototype,"once",{value:function(){return n(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return o(this)},configurable:!0})}))},59351:e=>{"use strict";class t extends Error{constructor(e){super(e||"Promise was canceled"),this.name="CancelError"}get isCanceled(){return!0}}class r{static fn(e){return(...t)=>new r((r,A,n)=>{t.push(n),e(...t).then(r,A)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((t,r)=>{this._reject=r;const A=e=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(e)};return Object.defineProperties(A,{shouldReject:{get:()=>this._rejectOnCancel,set:e=>{this._rejectOnCancel=e}}}),e(e=>{this._isPending=!1,t(e)},e=>{this._isPending=!1,r(e)},A)})}then(e,t){return this._promise.then(e,t)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(this._isPending&&!this._isCanceled){if(this._cancelHandlers.length>0)try{for(const e of this._cancelHandlers)e()}catch(e){this._reject(e)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new t(e))}}get isCanceled(){return this._isCanceled}}Object.setPrototypeOf(r.prototype,Promise.prototype),e.exports=r,e.exports.CancelError=t},61578:(e,t,r)=>{"use strict";const A=r(60550),n=e=>{if(e<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");const t=[];let r=0;const n=()=>{r--,t.length>0&&t.shift()()},o=(e,t,...o)=>{r++;const i=A(e,...o);t(i),i.then(n,n)},i=(A,...n)=>new Promise(i=>((A,n,...i)=>{rr},pendingCount:{get:()=>t.length}}),i};e.exports=n,e.exports.default=n},60550:e=>{"use strict";e.exports=(e,...t)=>new Promise(r=>{r(e(...t))})},37127:e=>{"use strict";const t=(e={})=>{const t=e.env||process.env;return"win32"!==(e.platform||process.platform)?"PATH":Object.keys(t).reverse().find(e=>"PATH"===e.toUpperCase())||"Path"};e.exports=t,e.exports.default=t},5763:(e,t,r)=>{"use strict";const{promisify:A}=r(31669),n=r(35747);async function o(e,t,r){if("string"!=typeof r)throw new TypeError("Expected a string, got "+typeof r);try{return(await A(n[e])(r))[t]()}catch(e){if("ENOENT"===e.code)return!1;throw e}}function i(e,t,r){if("string"!=typeof r)throw new TypeError("Expected a string, got "+typeof r);try{return n[e](r)[t]()}catch(e){if("ENOENT"===e.code)return!1;throw e}}t.isFile=o.bind(null,"stat","isFile"),t.isDirectory=o.bind(null,"stat","isDirectory"),t.isSymlink=o.bind(null,"lstat","isSymbolicLink"),t.isFileSync=i.bind(null,"statSync","isFile"),t.isDirectorySync=i.bind(null,"statSync","isDirectory"),t.isSymlinkSync=i.bind(null,"lstatSync","isSymbolicLink")},54722:(e,t,r)=>{"use strict";e.exports=r(18828)},71086:(e,t,r)=>{"use strict";const A=r(85622),n={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR:"(?=.)",QMARK:"[^/]",END_ANCHOR:"(?:\\/|$)",DOTS_SLASH:"\\.{1,2}(?:\\/|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|\\/)\\.{1,2}(?:\\/|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:\\/|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:\\/|$))",QMARK_NO_DOT:"[^.\\/]",STAR:"[^/]*?",START_ANCHOR:"(?:^|\\/)"},o={...n,SLASH_LITERAL:"[\\\\/]",QMARK:"[^\\\\/]",STAR:"[^\\\\/]*?",DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)"};e.exports={MAX_LENGTH:65536,POSIX_REGEX_SOURCE:{alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"},REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:A.sep,extglobChars:e=>({"!":{type:"negate",open:"(?:(?!(?:",close:`))${e.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}),globChars:e=>!0===e?o:n}},47974:(e,t,r)=>{"use strict";const A=r(71086),n=r(3598),{MAX_LENGTH:o,POSIX_REGEX_SOURCE:i,REGEX_NON_SPECIAL_CHARS:s,REGEX_SPECIAL_CHARS_BACKREF:a,REPLACEMENTS:c}=A,g=(e,t)=>{if("function"==typeof t.expandRange)return t.expandRange(...e,t);e.sort();const r=`[${e.join("-")}]`;try{new RegExp(r)}catch(t){return e.map(e=>n.escapeRegex(e)).join("..")}return r},l=(e,t)=>`Missing ${e}: "${t}" - use "\\\\${t}" to match literal characters`,u=(e,t)=>{if("string"!=typeof e)throw new TypeError("Expected a string");e=c[e]||e;const r={...t},u="number"==typeof r.maxLength?Math.min(o,r.maxLength):o;let h=e.length;if(h>u)throw new SyntaxError(`Input length: ${h}, exceeds maximum allowed length: ${u}`);const p={type:"bos",value:"",output:r.prepend||""},d=[p],C=r.capture?"":"?:",f=n.isWindows(t),I=A.globChars(f),E=A.extglobChars(I),{DOT_LITERAL:B,PLUS_LITERAL:y,SLASH_LITERAL:m,ONE_CHAR:w,DOTS_SLASH:Q,NO_DOT:D,NO_DOT_SLASH:b,NO_DOTS_SLASH:v,QMARK:S,QMARK_NO_DOT:k,STAR:N,START_ANCHOR:F}=I,K=e=>`(${C}(?:(?!${F}${e.dot?Q:B}).)*?)`,M=r.dot?"":D,R=r.dot?S:k;let x=!0===r.bash?K(r):N;r.capture&&(x=`(${x})`),"boolean"==typeof r.noext&&(r.noextglob=r.noext);const L={input:e,index:-1,start:0,dot:!0===r.dot,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:d};e=n.removePrefix(e,L),h=e.length;const P=[],O=[],U=[];let T,j=p;const Y=()=>L.index===h-1,G=L.peek=(t=1)=>e[L.index+t],H=L.advance=()=>e[++L.index],J=()=>e.slice(L.index+1),q=(e="",t=0)=>{L.consumed+=e,L.index+=t},z=e=>{L.output+=null!=e.output?e.output:e.value,q(e.value)},W=()=>{let e=1;for(;"!"===G()&&("("!==G(2)||"?"===G(3));)H(),L.start++,e++;return e%2!=0&&(L.negated=!0,L.start++,!0)},V=e=>{L[e]++,U.push(e)},X=e=>{L[e]--,U.pop()},_=e=>{if("globstar"===j.type){const t=L.braces>0&&("comma"===e.type||"brace"===e.type),r=!0===e.extglob||P.length&&("pipe"===e.type||"paren"===e.type);"slash"===e.type||"paren"===e.type||t||r||(L.output=L.output.slice(0,-j.output.length),j.type="star",j.value="*",j.output=x,L.output+=j.output)}if(P.length&&"paren"!==e.type&&!E[e.value]&&(P[P.length-1].inner+=e.value),(e.value||e.output)&&z(e),j&&"text"===j.type&&"text"===e.type)return j.value+=e.value,void(j.output=(j.output||"")+e.value);e.prev=j,d.push(e),j=e},Z=(e,t)=>{const A={...E[t],conditions:1,inner:""};A.prev=j,A.parens=L.parens,A.output=L.output;const n=(r.capture?"(":"")+A.open;V("parens"),_({type:e,value:t,output:L.output?"":w}),_({type:"paren",extglob:!0,value:H(),output:n}),P.push(A)},$=e=>{let t=e.close+(r.capture?")":"");if("negate"===e.type){let A=x;e.inner&&e.inner.length>1&&e.inner.includes("/")&&(A=K(r)),(A!==x||Y()||/^\)+$/.test(J()))&&(t=e.close=")$))"+A),"bos"===e.prev.type&&Y()&&(L.negatedExtglob=!0)}_({type:"paren",extglob:!0,value:T,output:t}),X("parens")};if(!1!==r.fastpaths&&!/(^[*!]|[/()[\]{}"])/.test(e)){let A=!1,o=e.replace(a,(e,t,r,n,o,i)=>"\\"===n?(A=!0,e):"?"===n?t?t+n+(o?S.repeat(o.length):""):0===i?R+(o?S.repeat(o.length):""):S.repeat(r.length):"."===n?B.repeat(r.length):"*"===n?t?t+n+(o?x:""):x:t?e:"\\"+e);return!0===A&&(o=!0===r.unescape?o.replace(/\\/g,""):o.replace(/\\+/g,e=>e.length%2==0?"\\\\":e?"\\":"")),o===e&&!0===r.contains?(L.output=e,L):(L.output=n.wrapOutput(o,L,t),L)}for(;!Y();){if(T=H(),"\0"===T)continue;if("\\"===T){const e=G();if("/"===e&&!0!==r.bash)continue;if("."===e||";"===e)continue;if(!e){T+="\\",_({type:"text",value:T});continue}const t=/^\\+/.exec(J());let A=0;if(t&&t[0].length>2&&(A=t[0].length,L.index+=A,A%2!=0&&(T+="\\")),!0===r.unescape?T=H()||"":T+=H()||"",0===L.brackets){_({type:"text",value:T});continue}}if(L.brackets>0&&("]"!==T||"["===j.value||"[^"===j.value)){if(!1!==r.posix&&":"===T){const e=j.value.slice(1);if(e.includes("[")&&(j.posix=!0,e.includes(":"))){const e=j.value.lastIndexOf("["),t=j.value.slice(0,e),r=j.value.slice(e+2),A=i[r];if(A){j.value=t+A,L.backtrack=!0,H(),p.output||1!==d.indexOf(j)||(p.output=w);continue}}}("["===T&&":"!==G()||"-"===T&&"]"===G())&&(T="\\"+T),"]"!==T||"["!==j.value&&"[^"!==j.value||(T="\\"+T),!0===r.posix&&"!"===T&&"["===j.value&&(T="^"),j.value+=T,z({value:T});continue}if(1===L.quotes&&'"'!==T){T=n.escapeRegex(T),j.value+=T,z({value:T});continue}if('"'===T){L.quotes=1===L.quotes?0:1,!0===r.keepQuotes&&_({type:"text",value:T});continue}if("("===T){V("parens"),_({type:"paren",value:T});continue}if(")"===T){if(0===L.parens&&!0===r.strictBrackets)throw new SyntaxError(l("opening","("));const e=P[P.length-1];if(e&&L.parens===e.parens+1){$(P.pop());continue}_({type:"paren",value:T,output:L.parens?")":"\\)"}),X("parens");continue}if("["===T){if(!0!==r.nobracket&&J().includes("]"))V("brackets");else{if(!0!==r.nobracket&&!0===r.strictBrackets)throw new SyntaxError(l("closing","]"));T="\\"+T}_({type:"bracket",value:T});continue}if("]"===T){if(!0===r.nobracket||j&&"bracket"===j.type&&1===j.value.length){_({type:"text",value:T,output:"\\"+T});continue}if(0===L.brackets){if(!0===r.strictBrackets)throw new SyntaxError(l("opening","["));_({type:"text",value:T,output:"\\"+T});continue}X("brackets");const e=j.value.slice(1);if(!0===j.posix||"^"!==e[0]||e.includes("/")||(T="/"+T),j.value+=T,z({value:T}),!1===r.literalBrackets||n.hasRegexChars(e))continue;const t=n.escapeRegex(j.value);if(L.output=L.output.slice(0,-j.value.length),!0===r.literalBrackets){L.output+=t,j.value=t;continue}j.value=`(${C}${t}|${j.value})`,L.output+=j.value;continue}if("{"===T&&!0!==r.nobrace){V("braces");const e={type:"brace",value:T,output:"(",outputIndex:L.output.length,tokensIndex:L.tokens.length};O.push(e),_(e);continue}if("}"===T){const e=O[O.length-1];if(!0===r.nobrace||!e){_({type:"text",value:T,output:T});continue}let t=")";if(!0===e.dots){const e=d.slice(),A=[];for(let t=e.length-1;t>=0&&(d.pop(),"brace"!==e[t].type);t--)"dots"!==e[t].type&&A.unshift(e[t].value);t=g(A,r),L.backtrack=!0}if(!0!==e.comma&&!0!==e.dots){const r=L.output.slice(0,e.outputIndex),A=L.tokens.slice(e.tokensIndex);e.value=e.output="\\{",T=t="\\}",L.output=r;for(const e of A)L.output+=e.output||e.value}_({type:"brace",value:T,output:t}),X("braces"),O.pop();continue}if("|"===T){P.length>0&&P[P.length-1].conditions++,_({type:"text",value:T});continue}if(","===T){let e=T;const t=O[O.length-1];t&&"braces"===U[U.length-1]&&(t.comma=!0,e="|"),_({type:"comma",value:T,output:e});continue}if("/"===T){if("dot"===j.type&&L.index===L.start+1){L.start=L.index+1,L.consumed="",L.output="",d.pop(),j=p;continue}_({type:"slash",value:T,output:m});continue}if("."===T){if(L.braces>0&&"dot"===j.type){"."===j.value&&(j.output=B);const e=O[O.length-1];j.type="dots",j.output+=T,j.value+=T,e.dots=!0;continue}if(L.braces+L.parens===0&&"bos"!==j.type&&"slash"!==j.type){_({type:"text",value:T,output:B});continue}_({type:"dot",value:T,output:B});continue}if("?"===T){if(!(j&&"("===j.value)&&!0!==r.noextglob&&"("===G()&&"?"!==G(2)){Z("qmark",T);continue}if(j&&"paren"===j.type){const e=G();let t=T;if("<"===e&&!n.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");("("===j.value&&!/[!=<:]/.test(e)||"<"===e&&!/<([!=]|\w+>)/.test(J()))&&(t="\\"+T),_({type:"text",value:T,output:t});continue}if(!0!==r.dot&&("slash"===j.type||"bos"===j.type)){_({type:"qmark",value:T,output:k});continue}_({type:"qmark",value:T,output:S});continue}if("!"===T){if(!0!==r.noextglob&&"("===G()&&("?"!==G(2)||!/[!=<:]/.test(G(3)))){Z("negate",T);continue}if(!0!==r.nonegate&&0===L.index){W();continue}}if("+"===T){if(!0!==r.noextglob&&"("===G()&&"?"!==G(2)){Z("plus",T);continue}if(j&&"("===j.value||!1===r.regex){_({type:"plus",value:T,output:y});continue}if(j&&("bracket"===j.type||"paren"===j.type||"brace"===j.type)||L.parens>0){_({type:"plus",value:T});continue}_({type:"plus",value:y});continue}if("@"===T){if(!0!==r.noextglob&&"("===G()&&"?"!==G(2)){_({type:"at",extglob:!0,value:T,output:""});continue}_({type:"text",value:T});continue}if("*"!==T){"$"!==T&&"^"!==T||(T="\\"+T);const e=s.exec(J());e&&(T+=e[0],L.index+=e[0].length),_({type:"text",value:T});continue}if(j&&("globstar"===j.type||!0===j.star)){j.type="star",j.star=!0,j.value+=T,j.output=x,L.backtrack=!0,L.globstar=!0,q(T);continue}let t=J();if(!0!==r.noextglob&&/^\([^?]/.test(t)){Z("star",T);continue}if("star"===j.type){if(!0===r.noglobstar){q(T);continue}const A=j.prev,n=A.prev,o="slash"===A.type||"bos"===A.type,i=n&&("star"===n.type||"globstar"===n.type);if(!0===r.bash&&(!o||t[0]&&"/"!==t[0])){_({type:"star",value:T,output:""});continue}const s=L.braces>0&&("comma"===A.type||"brace"===A.type),a=P.length&&("pipe"===A.type||"paren"===A.type);if(!o&&"paren"!==A.type&&!s&&!a){_({type:"star",value:T,output:""});continue}for(;"/**"===t.slice(0,3);){const r=e[L.index+4];if(r&&"/"!==r)break;t=t.slice(3),q("/**",3)}if("bos"===A.type&&Y()){j.type="globstar",j.value+=T,j.output=K(r),L.output=j.output,L.globstar=!0,q(T);continue}if("slash"===A.type&&"bos"!==A.prev.type&&!i&&Y()){L.output=L.output.slice(0,-(A.output+j.output).length),A.output="(?:"+A.output,j.type="globstar",j.output=K(r)+(r.strictSlashes?")":"|$)"),j.value+=T,L.globstar=!0,L.output+=A.output+j.output,q(T);continue}if("slash"===A.type&&"bos"!==A.prev.type&&"/"===t[0]){const e=void 0!==t[1]?"|$":"";L.output=L.output.slice(0,-(A.output+j.output).length),A.output="(?:"+A.output,j.type="globstar",j.output=`${K(r)}${m}|${m}${e})`,j.value+=T,L.output+=A.output+j.output,L.globstar=!0,q(T+H()),_({type:"slash",value:"/",output:""});continue}if("bos"===A.type&&"/"===t[0]){j.type="globstar",j.value+=T,j.output=`(?:^|${m}|${K(r)}${m})`,L.output=j.output,L.globstar=!0,q(T+H()),_({type:"slash",value:"/",output:""});continue}L.output=L.output.slice(0,-j.output.length),j.type="globstar",j.output=K(r),j.value+=T,L.output+=j.output,L.globstar=!0,q(T);continue}const A={type:"star",value:T,output:x};!0!==r.bash?!j||"bracket"!==j.type&&"paren"!==j.type||!0!==r.regex?(L.index!==L.start&&"slash"!==j.type&&"dot"!==j.type||("dot"===j.type?(L.output+=b,j.output+=b):!0===r.dot?(L.output+=v,j.output+=v):(L.output+=M,j.output+=M),"*"!==G()&&(L.output+=w,j.output+=w)),_(A)):(A.output=T,_(A)):(A.output=".*?","bos"!==j.type&&"slash"!==j.type||(A.output=M+A.output),_(A))}for(;L.brackets>0;){if(!0===r.strictBrackets)throw new SyntaxError(l("closing","]"));L.output=n.escapeLast(L.output,"["),X("brackets")}for(;L.parens>0;){if(!0===r.strictBrackets)throw new SyntaxError(l("closing",")"));L.output=n.escapeLast(L.output,"("),X("parens")}for(;L.braces>0;){if(!0===r.strictBrackets)throw new SyntaxError(l("closing","}"));L.output=n.escapeLast(L.output,"{"),X("braces")}if(!0===r.strictSlashes||"star"!==j.type&&"bracket"!==j.type||_({type:"maybe_slash",value:"",output:m+"?"}),!0===L.backtrack){L.output="";for(const e of L.tokens)L.output+=null!=e.output?e.output:e.value,e.suffix&&(L.output+=e.suffix)}return L};u.fastpaths=(e,t)=>{const r={...t},i="number"==typeof r.maxLength?Math.min(o,r.maxLength):o,s=e.length;if(s>i)throw new SyntaxError(`Input length: ${s}, exceeds maximum allowed length: ${i}`);e=c[e]||e;const a=n.isWindows(t),{DOT_LITERAL:g,SLASH_LITERAL:l,ONE_CHAR:u,DOTS_SLASH:h,NO_DOT:p,NO_DOTS:d,NO_DOTS_SLASH:C,STAR:f,START_ANCHOR:I}=A.globChars(a),E=r.dot?d:p,B=r.dot?C:p,y=r.capture?"":"?:";let m=!0===r.bash?".*?":f;r.capture&&(m=`(${m})`);const w=e=>!0===e.noglobstar?m:`(${y}(?:(?!${I}${e.dot?h:g}).)*?)`,Q=e=>{switch(e){case"*":return`${E}${u}${m}`;case".*":return`${g}${u}${m}`;case"*.*":return`${E}${m}${g}${u}${m}`;case"*/*":return`${E}${m}${l}${u}${B}${m}`;case"**":return E+w(r);case"**/*":return`(?:${E}${w(r)}${l})?${B}${u}${m}`;case"**/*.*":return`(?:${E}${w(r)}${l})?${B}${m}${g}${u}${m}`;case"**/.*":return`(?:${E}${w(r)}${l})?${g}${u}${m}`;default:{const t=/^(.*?)\.(\w+)$/.exec(e);if(!t)return;const r=Q(t[1]);if(!r)return;return r+g+t[2]}}},D=n.removePrefix(e,{negated:!1,prefix:""});let b=Q(D);return b&&!0!==r.strictSlashes&&(b+=l+"?"),b},e.exports=u},18828:(e,t,r)=>{"use strict";const A=r(85622),n=r(95321),o=r(47974),i=r(3598),s=r(71086),a=(e,t,r=!1)=>{if(Array.isArray(e)){const A=e.map(e=>a(e,t,r));return e=>{for(const t of A){const r=t(e);if(r)return r}return!1}}const A=(n=e)&&"object"==typeof n&&!Array.isArray(n)&&e.tokens&&e.input;var n;if(""===e||"string"!=typeof e&&!A)throw new TypeError("Expected pattern to be a non-empty string");const o=t||{},s=i.isWindows(t),c=A?a.compileRe(e,t):a.makeRe(e,t,!1,!0),g=c.state;delete c.state;let l=()=>!1;if(o.ignore){const e={...t,ignore:null,onMatch:null,onResult:null};l=a(o.ignore,e,r)}const u=(r,A=!1)=>{const{isMatch:n,match:i,output:u}=a.test(r,c,t,{glob:e,posix:s}),h={glob:e,state:g,regex:c,posix:s,input:r,output:u,match:i,isMatch:n};return"function"==typeof o.onResult&&o.onResult(h),!1===n?(h.isMatch=!1,!!A&&h):l(r)?("function"==typeof o.onIgnore&&o.onIgnore(h),h.isMatch=!1,!!A&&h):("function"==typeof o.onMatch&&o.onMatch(h),!A||h)};return r&&(u.state=g),u};a.test=(e,t,r,{glob:A,posix:n}={})=>{if("string"!=typeof e)throw new TypeError("Expected input to be a string");if(""===e)return{isMatch:!1,output:""};const o=r||{},s=o.format||(n?i.toPosixSlashes:null);let c=e===A,g=c&&s?s(e):e;return!1===c&&(g=s?s(e):e,c=g===A),!1!==c&&!0!==o.capture||(c=!0===o.matchBase||!0===o.basename?a.matchBase(e,t,r,n):t.exec(g)),{isMatch:Boolean(c),match:c,output:g}},a.matchBase=(e,t,r,n=i.isWindows(r))=>(t instanceof RegExp?t:a.makeRe(t,r)).test(A.basename(e)),a.isMatch=(e,t,r)=>a(t,r)(e),a.parse=(e,t)=>Array.isArray(e)?e.map(e=>a.parse(e,t)):o(e,{...t,fastpaths:!1}),a.scan=(e,t)=>n(e,t),a.compileRe=(e,t,r=!1,A=!1)=>{if(!0===r)return e.output;const n=t||{},o=n.contains?"":"^",i=n.contains?"":"$";let s=`${o}(?:${e.output})${i}`;e&&!0===e.negated&&(s=`^(?!${s}).*$`);const c=a.toRegex(s,t);return!0===A&&(c.state=e),c},a.makeRe=(e,t,r=!1,A=!1)=>{if(!e||"string"!=typeof e)throw new TypeError("Expected a non-empty string");const n=t||{};let i,s={negated:!1,fastpaths:!0},c="";return e.startsWith("./")&&(e=e.slice(2),c=s.prefix="./"),!1===n.fastpaths||"."!==e[0]&&"*"!==e[0]||(i=o.fastpaths(e,t)),void 0===i?(s=o(e,t),s.prefix=c+(s.prefix||"")):s.output=i,a.compileRe(s,t,r,A)},a.toRegex=(e,t)=>{try{const r=t||{};return new RegExp(e,r.flags||(r.nocase?"i":""))}catch(e){if(t&&!0===t.debug)throw e;return/$^/}},a.constants=s,e.exports=a},95321:(e,t,r)=>{"use strict";const A=r(3598),{CHAR_ASTERISK:n,CHAR_AT:o,CHAR_BACKWARD_SLASH:i,CHAR_COMMA:s,CHAR_DOT:a,CHAR_EXCLAMATION_MARK:c,CHAR_FORWARD_SLASH:g,CHAR_LEFT_CURLY_BRACE:l,CHAR_LEFT_PARENTHESES:u,CHAR_LEFT_SQUARE_BRACKET:h,CHAR_PLUS:p,CHAR_QUESTION_MARK:d,CHAR_RIGHT_CURLY_BRACE:C,CHAR_RIGHT_PARENTHESES:f,CHAR_RIGHT_SQUARE_BRACKET:I}=r(71086),E=e=>e===g||e===i,B=e=>{!0!==e.isPrefix&&(e.depth=e.isGlobstar?1/0:1)};e.exports=(e,t)=>{const r=t||{},y=e.length-1,m=!0===r.parts||!0===r.scanToEnd,w=[],Q=[],D=[];let b,v,S=e,k=-1,N=0,F=0,K=!1,M=!1,R=!1,x=!1,L=!1,P=!1,O=!1,U=!1,T=!1,j=0,Y={value:"",depth:0,isGlob:!1};const G=()=>k>=y,H=()=>(b=v,S.charCodeAt(++k));for(;k0&&(q=S.slice(0,N),S=S.slice(N),F-=N),J&&!0===R&&F>0?(J=S.slice(0,F),z=S.slice(F)):!0===R?(J="",z=S):J=S,J&&""!==J&&"/"!==J&&J!==S&&E(J.charCodeAt(J.length-1))&&(J=J.slice(0,-1)),!0===r.unescape&&(z&&(z=A.removeBackslashes(z)),J&&!0===O&&(J=A.removeBackslashes(J)));const W={prefix:q,input:e,start:N,base:J,glob:z,isBrace:K,isBracket:M,isGlob:R,isExtglob:x,isGlobstar:L,negated:U};if(!0===r.tokens&&(W.maxDepth=0,E(v)||Q.push(Y),W.tokens=Q),!0===r.parts||!0===r.tokens){let t;for(let A=0;A{"use strict";const A=r(85622),n="win32"===process.platform,{REGEX_BACKSLASH:o,REGEX_REMOVE_BACKSLASH:i,REGEX_SPECIAL_CHARS:s,REGEX_SPECIAL_CHARS_GLOBAL:a}=r(71086);t.isObject=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),t.hasRegexChars=e=>s.test(e),t.isRegexChar=e=>1===e.length&&t.hasRegexChars(e),t.escapeRegex=e=>e.replace(a,"\\$1"),t.toPosixSlashes=e=>e.replace(o,"/"),t.removeBackslashes=e=>e.replace(i,e=>"\\"===e?"":e),t.supportsLookbehinds=()=>{const e=process.version.slice(1).split(".").map(Number);return 3===e.length&&e[0]>=9||8===e[0]&&e[1]>=10},t.isWindows=e=>e&&"boolean"==typeof e.windows?e.windows:!0===n||"\\"===A.sep,t.escapeLast=(e,r,A)=>{const n=e.lastIndexOf(r,A);return-1===n?e:"\\"===e[n-1]?t.escapeLast(e,r,n-1):`${e.slice(0,n)}\\${e.slice(n)}`},t.removePrefix=(e,t={})=>{let r=e;return r.startsWith("./")&&(r=r.slice(2),t.prefix="./"),r},t.wrapOutput=(e,t={},r={})=>{let A=`${r.contains?"":"^"}(?:${e})${r.contains?"":"$"}`;return!0===t.negated&&(A=`(?:^(?!${A}).*$)`),A}},79588:e=>{"use strict";function t(e){this._maxSize=e,this.clear()}t.prototype.clear=function(){this._size=0,this._values={}},t.prototype.get=function(e){return this._values[e]},t.prototype.set=function(e,t){return this._size>=this._maxSize&&this.clear(),this._values.hasOwnProperty(e)||this._size++,this._values[e]=t};var r=/[^.^\]^[]+|(?=\[\]|\.\.)/g,A=/^\d+$/,n=/^\d/,o=/[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g,i=/^\s*(['"]?)(.*?)(\1)\s*$/,s=!1,a=new t(512),c=new t(512),g=new t(512);try{new Function("")}catch(e){s=!0}function l(e){return a.get(e)||a.set(e,u(e).map((function(e){return e.replace(i,"$2")})))}function u(e){return e.match(r)}function h(e,t,r){return"string"==typeof t&&(r=t,t=!1),r=r||"data",(e=e||"")&&"["!==e.charAt(0)&&(e="."+e),t?function(e,t){var r,A=t,n=u(e);return p(n,(function(e,t,n,o,i){r=o===i.length-1,A+=(e=t||n?"["+e+"]":"."+e)+(r?")":" || {})")})),new Array(n.length+1).join("(")+A}(e,r):r+e}function p(e,t,r){var A,n,o,i,s=e.length;for(n=0;n{var A=r(91162),n=r(97681),o=r(35747),i=function(){},s=/^v?\.0/.test(process.version),a=function(e){return"function"==typeof e},c=function(e,t,r,c){c=A(c);var g=!1;e.on("close",(function(){g=!0})),n(e,{readable:t,writable:r},(function(e){if(e)return c(e);g=!0,c()}));var l=!1;return function(t){if(!g&&!l)return l=!0,function(e){return!!s&&(!!o&&((e instanceof(o.ReadStream||i)||e instanceof(o.WriteStream||i))&&a(e.close)))}(e)?e.close(i):function(e){return e.setHeader&&a(e.abort)}(e)?e.abort():a(e.destroy)?e.destroy():void c(t||new Error("stream was destroyed"))}},g=function(e){e()},l=function(e,t){return e.pipe(t)};e.exports=function(){var e,t=Array.prototype.slice.call(arguments),r=a(t[t.length-1]||i)&&t.pop()||i;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error("pump requires two streams per minimum");var A=t.map((function(n,o){var i=o0,(function(t){e||(e=t),t&&A.forEach(g),i||(A.forEach(g),r(e))}))}));return t.reduce(l)}},49601:e=>{"use strict";class t{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,t){if(this.cache.set(e,t),this._size++,this._size>=this.maxSize){if(this._size=0,"function"==typeof this.onEviction)for(const[e,t]of this.oldCache.entries())this.onEviction(e,t);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){const t=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,t),t}}set(e,t){return this.cache.has(e)?this.cache.set(e,t):this._set(e,t),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){return this.cache.has(e)?this.cache.get(e):this.oldCache.has(e)?this.oldCache.get(e):void 0}delete(e){const t=this.cache.delete(e);return t&&this._size--,this.oldCache.delete(e)||t}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(const[e]of this)yield e}*values(){for(const[,e]of this)yield e}*[Symbol.iterator](){for(const e of this.cache)yield e;for(const e of this.oldCache){const[t]=e;this.cache.has(t)||(yield e)}}get size(){let e=0;for(const t of this.oldCache.keys())this.cache.has(t)||e++;return Math.min(this._size+e,this.maxSize)}}e.exports=t},20663:e=>{"use strict";const t={};function r(e,r,A){A||(A=Error);class n extends A{constructor(e,t,A){super(function(e,t,A){return"string"==typeof r?r:r(e,t,A)}(e,t,A))}}n.prototype.name=A.name,n.prototype.code=e,t[e]=n}function A(e,t){if(Array.isArray(e)){const r=e.length;return e=e.map(e=>String(e)),r>2?`one of ${t} ${e.slice(0,r-1).join(", ")}, or `+e[r-1]:2===r?`one of ${t} ${e[0]} or ${e[1]}`:`of ${t} ${e[0]}`}return`of ${t} ${String(e)}`}r("ERR_INVALID_OPT_VALUE",(function(e,t){return'The value "'+t+'" is invalid for option "'+e+'"'}),TypeError),r("ERR_INVALID_ARG_TYPE",(function(e,t,r){let n;var o,i;let s;if("string"==typeof t&&(o="not ",t.substr(!i||i<0?0:+i,o.length)===o)?(n="must not be",t=t.replace(/^not /,"")):n="must be",function(e,t,r){return(void 0===r||r>e.length)&&(r=e.length),e.substring(r-t.length,r)===t}(e," argument"))s=`The ${e} ${n} ${A(t,"type")}`;else{s=`The "${e}" ${function(e,t,r){return"number"!=typeof r&&(r=0),!(r+t.length>e.length)&&-1!==e.indexOf(t,r)}(e,".")?"property":"argument"} ${n} ${A(t,"type")}`}return s+=". Received type "+typeof r,s}),TypeError),r("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF"),r("ERR_METHOD_NOT_IMPLEMENTED",(function(e){return"The "+e+" method is not implemented"})),r("ERR_STREAM_PREMATURE_CLOSE","Premature close"),r("ERR_STREAM_DESTROYED",(function(e){return"Cannot call "+e+" after a stream was destroyed"})),r("ERR_MULTIPLE_CALLBACK","Callback called multiple times"),r("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable"),r("ERR_STREAM_WRITE_AFTER_END","write after end"),r("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),r("ERR_UNKNOWN_ENCODING",(function(e){return"Unknown encoding: "+e}),TypeError),r("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event"),e.exports.q=t},39138:e=>{"use strict";var t=new Set;e.exports.emitExperimentalWarning=process.emitWarning?function(e){if(!t.has(e)){var r=e+" is an experimental feature. This feature could change at any time";t.add(e),process.emitWarning(r,"ExperimentalWarning")}}:function(){}},72434:(e,t,r)=>{"use strict";var A=Object.keys||function(e){var t=[];for(var r in e)t.push(r);return t};e.exports=c;var n=r(58020),o=r(6729);r(85870)(c,n);for(var i=A(o.prototype),s=0;s{"use strict";e.exports=n;var A=r(54801);function n(e){if(!(this instanceof n))return new n(e);A.call(this,e)}r(85870)(n,A),n.prototype._transform=function(e,t,r){r(null,e)}},58020:(e,t,r)=>{"use strict";var A;e.exports=w,w.ReadableState=m;r(28614).EventEmitter;var n=function(e,t){return e.listeners(t).length},o=r(49298),i=r(64293).Buffer,s=global.Uint8Array||function(){};var a,c=r(31669);a=c&&c.debuglog?c.debuglog("stream"):function(){};var g,l,u=r(43117),h=r(32340),p=r(77433).getHighWaterMark,d=r(20663).q,C=d.ERR_INVALID_ARG_TYPE,f=d.ERR_STREAM_PUSH_AFTER_EOF,I=d.ERR_METHOD_NOT_IMPLEMENTED,E=d.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,B=r(39138).emitExperimentalWarning;r(85870)(w,o);var y=["error","close","destroy","pause","resume"];function m(e,t,n){A=A||r(72434),e=e||{},"boolean"!=typeof n&&(n=t instanceof A),this.objectMode=!!e.objectMode,n&&(this.objectMode=this.objectMode||!!e.readableObjectMode),this.highWaterMark=p(this,e,"readableHighWaterMark",n),this.buffer=new u,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=!1!==e.emitClose,this.destroyed=!1,this.defaultEncoding=e.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(g||(g=r(69538).s),this.decoder=new g(e.encoding),this.encoding=e.encoding)}function w(e){if(A=A||r(72434),!(this instanceof w))return new w(e);var t=this instanceof A;this._readableState=new m(e,this,t),this.readable=!0,e&&("function"==typeof e.read&&(this._read=e.read),"function"==typeof e.destroy&&(this._destroy=e.destroy)),o.call(this)}function Q(e,t,r,A,n){a("readableAddChunk",t);var o,c=e._readableState;if(null===t)c.reading=!1,function(e,t){if(t.ended)return;if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,t.sync?v(e):(t.needReadable=!1,t.emittedReadable||(t.emittedReadable=!0,S(e)))}(e,c);else if(n||(o=function(e,t){var r;A=t,i.isBuffer(A)||A instanceof s||"string"==typeof t||void 0===t||e.objectMode||(r=new C("chunk",["string","Buffer","Uint8Array"],t));var A;return r}(c,t)),o)e.emit("error",o);else if(c.objectMode||t&&t.length>0)if("string"==typeof t||c.objectMode||Object.getPrototypeOf(t)===i.prototype||(t=function(e){return i.from(e)}(t)),A)c.endEmitted?e.emit("error",new E):D(e,c,t,!0);else if(c.ended)e.emit("error",new f);else{if(c.destroyed)return!1;c.reading=!1,c.decoder&&!r?(t=c.decoder.write(t),c.objectMode||0!==t.length?D(e,c,t,!1):k(e,c)):D(e,c,t,!1)}else A||(c.reading=!1,k(e,c));return!c.ended&&(c.lengtht.highWaterMark&&(t.highWaterMark=function(e){return e>=8388608?e=8388608:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function v(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(a("emitReadable",t.flowing),t.emittedReadable=!0,process.nextTick(S,e))}function S(e){var t=e._readableState;a("emitReadable_",t.destroyed,t.length,t.ended),t.destroyed||!t.length&&!t.ended||e.emit("readable"),t.needReadable=!t.flowing&&!t.ended&&t.length<=t.highWaterMark,R(e)}function k(e,t){t.readingMore||(t.readingMore=!0,process.nextTick(N,e,t))}function N(e,t){for(var r=t.length;!t.reading&&!t.ended&&t.length0,t.resumeScheduled&&!t.paused?t.flowing=!0:e.listenerCount("data")>0&&e.resume()}function K(e){a("readable nexttick read 0"),e.read(0)}function M(e,t){a("resume",t.reading),t.reading||e.read(0),t.resumeScheduled=!1,e.emit("resume"),R(e),t.flowing&&!t.reading&&e.read(0)}function R(e){var t=e._readableState;for(a("flow",t.flowing);t.flowing&&null!==e.read(););}function x(e,t){return 0===t.length?null:(t.objectMode?r=t.buffer.shift():!e||e>=t.length?(r=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.first():t.buffer.concat(t.length),t.buffer.clear()):r=t.buffer.consume(e,t.decoder),r);var r}function L(e){var t=e._readableState;a("endReadable",t.endEmitted),t.endEmitted||(t.ended=!0,process.nextTick(P,t,e))}function P(e,t){a("endReadableNT",e.endEmitted,e.length),e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function O(e,t){for(var r=0,A=e.length;r=t.highWaterMark:t.length>0)||t.ended))return a("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?L(this):v(this),null;if(0===(e=b(e,t))&&t.ended)return 0===t.length&&L(this),null;var A,n=t.needReadable;return a("need readable",n),(0===t.length||t.length-e0?x(e,t):null)?(t.needReadable=!0,e=0):(t.length-=e,t.awaitDrain=0),0===t.length&&(t.ended||(t.needReadable=!0),r!==e&&t.ended&&L(this)),null!==A&&this.emit("data",A),A},w.prototype._read=function(e){this.emit("error",new I("_read()"))},w.prototype.pipe=function(e,t){var r=this,A=this._readableState;switch(A.pipesCount){case 0:A.pipes=e;break;case 1:A.pipes=[A.pipes,e];break;default:A.pipes.push(e)}A.pipesCount+=1,a("pipe count=%d opts=%j",A.pipesCount,t);var o=(!t||!1!==t.end)&&e!==process.stdout&&e!==process.stderr?s:d;function i(t,n){a("onunpipe"),t===r&&n&&!1===n.hasUnpiped&&(n.hasUnpiped=!0,a("cleanup"),e.removeListener("close",h),e.removeListener("finish",p),e.removeListener("drain",c),e.removeListener("error",u),e.removeListener("unpipe",i),r.removeListener("end",s),r.removeListener("end",d),r.removeListener("data",l),g=!0,!A.awaitDrain||e._writableState&&!e._writableState.needDrain||c())}function s(){a("onend"),e.end()}A.endEmitted?process.nextTick(o):r.once("end",o),e.on("unpipe",i);var c=function(e){return function(){var t=e._readableState;a("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&n(e,"data")&&(t.flowing=!0,R(e))}}(r);e.on("drain",c);var g=!1;function l(t){a("ondata");var n=e.write(t);a("dest.write",n),!1===n&&((1===A.pipesCount&&A.pipes===e||A.pipesCount>1&&-1!==O(A.pipes,e))&&!g&&(a("false write response, pause",A.awaitDrain),A.awaitDrain++),r.pause())}function u(t){a("onerror",t),d(),e.removeListener("error",u),0===n(e,"error")&&e.emit("error",t)}function h(){e.removeListener("finish",p),d()}function p(){a("onfinish"),e.removeListener("close",h),d()}function d(){a("unpipe"),r.unpipe(e)}return r.on("data",l),function(e,t,r){if("function"==typeof e.prependListener)return e.prependListener(t,r);e._events&&e._events[t]?Array.isArray(e._events[t])?e._events[t].unshift(r):e._events[t]=[r,e._events[t]]:e.on(t,r)}(e,"error",u),e.once("close",h),e.once("finish",p),e.emit("pipe",r),A.flowing||(a("pipe resume"),r.resume()),e},w.prototype.unpipe=function(e){var t=this._readableState,r={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes||(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this,r)),this;if(!e){var A=t.pipes,n=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var o=0;o0,!1!==A.flowing&&this.resume()):"readable"===e&&(A.endEmitted||A.readableListening||(A.readableListening=A.needReadable=!0,A.flowing=!1,A.emittedReadable=!1,a("on readable",A.length,A.reading),A.length?v(this):A.reading||process.nextTick(K,this))),r},w.prototype.addListener=w.prototype.on,w.prototype.removeListener=function(e,t){var r=o.prototype.removeListener.call(this,e,t);return"readable"===e&&process.nextTick(F,this),r},w.prototype.removeAllListeners=function(e){var t=o.prototype.removeAllListeners.apply(this,arguments);return"readable"!==e&&void 0!==e||process.nextTick(F,this),t},w.prototype.resume=function(){var e=this._readableState;return e.flowing||(a("resume"),e.flowing=!e.readableListening,function(e,t){t.resumeScheduled||(t.resumeScheduled=!0,process.nextTick(M,e,t))}(this,e)),e.paused=!1,this},w.prototype.pause=function(){return a("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(a("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this},w.prototype.wrap=function(e){var t=this,r=this._readableState,A=!1;for(var n in e.on("end",(function(){if(a("wrapped end"),r.decoder&&!r.ended){var e=r.decoder.end();e&&e.length&&t.push(e)}t.push(null)})),e.on("data",(function(n){(a("wrapped data"),r.decoder&&(n=r.decoder.write(n)),r.objectMode&&null==n)||(r.objectMode||n&&n.length)&&(t.push(n)||(A=!0,e.pause()))})),e)void 0===this[n]&&"function"==typeof e[n]&&(this[n]=function(t){return function(){return e[t].apply(e,arguments)}}(n));for(var o=0;o{"use strict";e.exports=g;var A=r(20663).q,n=A.ERR_METHOD_NOT_IMPLEMENTED,o=A.ERR_MULTIPLE_CALLBACK,i=A.ERR_TRANSFORM_ALREADY_TRANSFORMING,s=A.ERR_TRANSFORM_WITH_LENGTH_0,a=r(72434);function c(e,t){var r=this._transformState;r.transforming=!1;var A=r.writecb;if(null===A)return this.emit("error",new o);r.writechunk=null,r.writecb=null,null!=t&&this.push(t),A(e);var n=this._readableState;n.reading=!1,(n.needReadable||n.length{"use strict";function A(e){var t=this;this.next=null,this.entry=null,this.finish=function(){!function(e,t,r){var A=e.entry;e.entry=null;for(;A;){var n=A.callback;t.pendingcb--,n(r),A=A.next}t.corkedRequestsFree.next=e}(t,e)}}var n;e.exports=w,w.WritableState=m;var o={deprecate:r(73212)},i=r(49298),s=r(64293).Buffer,a=global.Uint8Array||function(){};var c,g=r(32340),l=r(77433).getHighWaterMark,u=r(20663).q,h=u.ERR_INVALID_ARG_TYPE,p=u.ERR_METHOD_NOT_IMPLEMENTED,d=u.ERR_MULTIPLE_CALLBACK,C=u.ERR_STREAM_CANNOT_PIPE,f=u.ERR_STREAM_DESTROYED,I=u.ERR_STREAM_NULL_VALUES,E=u.ERR_STREAM_WRITE_AFTER_END,B=u.ERR_UNKNOWN_ENCODING;function y(){}function m(e,t,o){n=n||r(72434),e=e||{},"boolean"!=typeof o&&(o=t instanceof n),this.objectMode=!!e.objectMode,o&&(this.objectMode=this.objectMode||!!e.writableObjectMode),this.highWaterMark=l(this,e,"writableHighWaterMark",o),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var i=!1===e.decodeStrings;this.decodeStrings=!i,this.defaultEncoding=e.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){!function(e,t){var r=e._writableState,A=r.sync,n=r.writecb;if("function"!=typeof n)throw new d;if(function(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}(r),t)!function(e,t,r,A,n){--t.pendingcb,r?(process.nextTick(n,A),process.nextTick(k,e,t),e._writableState.errorEmitted=!0,e.emit("error",A)):(n(A),e._writableState.errorEmitted=!0,e.emit("error",A),k(e,t))}(e,r,A,t,n);else{var o=v(r)||e.destroyed;o||r.corked||r.bufferProcessing||!r.bufferedRequest||b(e,r),A?process.nextTick(D,e,r,o,n):D(e,r,o,n)}}(t,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=!1!==e.emitClose,this.bufferedRequestCount=0,this.corkedRequestsFree=new A(this)}function w(e){var t=this instanceof(n=n||r(72434));if(!t&&!c.call(w,this))return new w(e);this._writableState=new m(e,this,t),this.writable=!0,e&&("function"==typeof e.write&&(this._write=e.write),"function"==typeof e.writev&&(this._writev=e.writev),"function"==typeof e.destroy&&(this._destroy=e.destroy),"function"==typeof e.final&&(this._final=e.final)),i.call(this)}function Q(e,t,r,A,n,o,i){t.writelen=A,t.writecb=i,t.writing=!0,t.sync=!0,t.destroyed?t.onwrite(new f("write")):r?e._writev(n,t.onwrite):e._write(n,o,t.onwrite),t.sync=!1}function D(e,t,r,A){r||function(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit("drain"))}(e,t),t.pendingcb--,A(),k(e,t)}function b(e,t){t.bufferProcessing=!0;var r=t.bufferedRequest;if(e._writev&&r&&r.next){var n=t.bufferedRequestCount,o=new Array(n),i=t.corkedRequestsFree;i.entry=r;for(var s=0,a=!0;r;)o[s]=r,r.isBuf||(a=!1),r=r.next,s+=1;o.allBuffers=a,Q(e,t,!0,t.length,o,"",i.finish),t.pendingcb++,t.lastBufferedRequest=null,i.next?(t.corkedRequestsFree=i.next,i.next=null):t.corkedRequestsFree=new A(t),t.bufferedRequestCount=0}else{for(;r;){var c=r.chunk,g=r.encoding,l=r.callback;if(Q(e,t,!1,t.objectMode?1:c.length,c,g,l),r=r.next,t.bufferedRequestCount--,t.writing)break}null===r&&(t.lastBufferedRequest=null)}t.bufferedRequest=r,t.bufferProcessing=!1}function v(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function S(e,t){e._final((function(r){t.pendingcb--,r&&e.emit("error",r),t.prefinished=!0,e.emit("prefinish"),k(e,t)}))}function k(e,t){var r=v(t);return r&&(!function(e,t){t.prefinished||t.finalCalled||("function"!=typeof e._final||t.destroyed?(t.prefinished=!0,e.emit("prefinish")):(t.pendingcb++,t.finalCalled=!0,process.nextTick(S,e,t)))}(e,t),0===t.pendingcb&&(t.finished=!0,e.emit("finish"))),r}r(85870)(w,i),m.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(m.prototype,"buffer",{get:o.deprecate((function(){return this.getBuffer()}),"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(e){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(c=Function.prototype[Symbol.hasInstance],Object.defineProperty(w,Symbol.hasInstance,{value:function(e){return!!c.call(this,e)||this===w&&(e&&e._writableState instanceof m)}})):c=function(e){return e instanceof this},w.prototype.pipe=function(){this.emit("error",new C)},w.prototype.write=function(e,t,r){var A,n=this._writableState,o=!1,i=!n.objectMode&&(A=e,s.isBuffer(A)||A instanceof a);return i&&!s.isBuffer(e)&&(e=function(e){return s.from(e)}(e)),"function"==typeof t&&(r=t,t=null),i?t="buffer":t||(t=n.defaultEncoding),"function"!=typeof r&&(r=y),n.ending?function(e,t){var r=new E;e.emit("error",r),process.nextTick(t,r)}(this,r):(i||function(e,t,r,A){var n;return null===r?n=new I:"string"==typeof r||t.objectMode||(n=new h("chunk",["string","Buffer"],r)),!n||(e.emit("error",n),process.nextTick(A,n),!1)}(this,n,e,r))&&(n.pendingcb++,o=function(e,t,r,A,n,o){if(!r){var i=function(e,t,r){e.objectMode||!1===e.decodeStrings||"string"!=typeof t||(t=s.from(t,r));return t}(t,A,n);A!==i&&(r=!0,n="buffer",A=i)}var a=t.objectMode?1:A.length;t.length+=a;var c=t.length-1))throw new B(e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(w.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(w.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),w.prototype._write=function(e,t,r){r(new p("_write()"))},w.prototype._writev=null,w.prototype.end=function(e,t,r){var A=this._writableState;return"function"==typeof e?(r=e,e=null,t=null):"function"==typeof t&&(r=t,t=null),null!=e&&this.write(e,t),A.corked&&(A.corked=1,this.uncork()),A.ending||function(e,t,r){t.ending=!0,k(e,t),r&&(t.finished?process.nextTick(r):e.once("finish",r));t.ended=!0,e.writable=!1}(this,A,r),this},Object.defineProperty(w.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}}),Object.defineProperty(w.prototype,"destroyed",{enumerable:!1,get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),w.prototype.destroy=g.destroy,w.prototype._undestroy=g.undestroy,w.prototype._destroy=function(e,t){t(e)}},4245:(e,t,r)=>{"use strict";var A;function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var o=r(91327),i=Symbol("lastResolve"),s=Symbol("lastReject"),a=Symbol("error"),c=Symbol("ended"),g=Symbol("lastPromise"),l=Symbol("handlePromise"),u=Symbol("stream");function h(e,t){return{value:e,done:t}}function p(e){var t=e[i];if(null!==t){var r=e[u].read();null!==r&&(e[g]=null,e[i]=null,e[s]=null,t(h(r,!1)))}}function d(e){process.nextTick(p,e)}var C=Object.getPrototypeOf((function(){})),f=Object.setPrototypeOf((n(A={get stream(){return this[u]},next:function(){var e=this,t=this[a];if(null!==t)return Promise.reject(t);if(this[c])return Promise.resolve(h(null,!0));if(this[u].destroyed)return new Promise((function(t,r){process.nextTick((function(){e[a]?r(e[a]):t(h(null,!0))}))}));var r,A=this[g];if(A)r=new Promise(function(e,t){return function(r,A){e.then((function(){t[l](r,A)}),A)}}(A,this));else{var n=this[u].read();if(null!==n)return Promise.resolve(h(n,!1));r=new Promise(this[l])}return this[g]=r,r}},Symbol.asyncIterator,(function(){return this})),n(A,"return",(function(){var e=this;return new Promise((function(t,r){e[u].destroy(null,(function(e){e?r(e):t(h(null,!0))}))}))})),A),C);e.exports=function(e){var t,r=Object.create(f,(n(t={},u,{value:e,writable:!0}),n(t,i,{value:null,writable:!0}),n(t,s,{value:null,writable:!0}),n(t,a,{value:null,writable:!0}),n(t,c,{value:e._readableState.endEmitted,writable:!0}),n(t,g,{value:null,writable:!0}),n(t,l,{value:function(e,t){var A=r[u].read();A?(r[g]=null,r[i]=null,r[s]=null,e(h(A,!1))):(r[i]=e,r[s]=t)},writable:!0}),t));return o(e,(function(e){if(e&&"ERR_STREAM_PREMATURE_CLOSE"!==e.code){var t=r[s];return null!==t&&(r[g]=null,r[i]=null,r[s]=null,t(e)),void(r[a]=e)}var A=r[i];null!==A&&(r[g]=null,r[i]=null,r[s]=null,A(h(null,!0))),r[c]=!0})),e.on("readable",d.bind(null,r)),r}},43117:(e,t,r)=>{"use strict";function A(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var n=r(64293).Buffer,o=r(31669).inspect,i=o&&o.custom||"inspect";e.exports=function(){function e(){this.head=null,this.tail=null,this.length=0}var t=e.prototype;return t.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},t.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},t.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},t.clear=function(){this.head=this.tail=null,this.length=0},t.join=function(e){if(0===this.length)return"";for(var t=this.head,r=""+t.data;t=t.next;)r+=e+t.data;return r},t.concat=function(e){if(0===this.length)return n.alloc(0);for(var t,r,A,o=n.allocUnsafe(e>>>0),i=this.head,s=0;i;)t=i.data,r=o,A=s,n.prototype.copy.call(t,r,A),s+=i.data.length,i=i.next;return o},t.consume=function(e,t){var r;return en.length?n.length:e;if(o===n.length?A+=n:A+=n.slice(0,e),0===(e-=o)){o===n.length?(++r,t.next?this.head=t.next:this.head=this.tail=null):(this.head=t,t.data=n.slice(o));break}++r}return this.length-=r,A},t._getBuffer=function(e){var t=n.allocUnsafe(e),r=this.head,A=1;for(r.data.copy(t),e-=r.data.length;r=r.next;){var o=r.data,i=e>o.length?o.length:e;if(o.copy(t,t.length-e,0,i),0===(e-=i)){i===o.length?(++A,r.next?this.head=r.next:this.head=this.tail=null):(this.head=r,r.data=o.slice(i));break}++A}return this.length-=A,t},t[i]=function(e,t){return o(this,function(e){for(var t=1;t{"use strict";function t(e,t){A(e,t),r(e)}function r(e){e._writableState&&!e._writableState.emitClose||e._readableState&&!e._readableState.emitClose||e.emit("close")}function A(e,t){e.emit("error",t)}e.exports={destroy:function(e,n){var o=this,i=this._readableState&&this._readableState.destroyed,s=this._writableState&&this._writableState.destroyed;return i||s?(n?n(e):!e||this._writableState&&this._writableState.errorEmitted||process.nextTick(A,this,e),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(e||null,(function(e){!n&&e?(process.nextTick(t,o,e),o._writableState&&(o._writableState.errorEmitted=!0)):n?(process.nextTick(r,o),n(e)):process.nextTick(r,o)})),this)},undestroy:function(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}}},91327:(e,t,r)=>{"use strict";var A=r(20663).q.ERR_STREAM_PREMATURE_CLOSE;function n(){}e.exports=function e(t,r,o){if("function"==typeof r)return e(t,null,r);r||(r={}),o=function(e){var t=!1;return function(r){t||(t=!0,e.call(this,r))}}(o||n);var i=t._writableState,s=t._readableState,a=r.readable||!1!==r.readable&&t.readable,c=r.writable||!1!==r.writable&&t.writable,g=function(){t.writable||l()},l=function(){c=!1,a||o.call(t)},u=function(){a=!1,c||o.call(t)},h=function(e){o.call(t,e)},p=function(){return(!a||s&&s.ended)&&(!c||i&&i.ended)?void 0:o.call(t,new A)},d=function(){t.req.on("finish",l)};return!function(e){return e.setHeader&&"function"==typeof e.abort}(t)?c&&!i&&(t.on("end",g),t.on("close",g)):(t.on("complete",l),t.on("abort",p),t.req?d():t.on("request",d)),t.on("end",u),t.on("finish",l),!1!==r.error&&t.on("error",h),t.on("close",p),function(){t.removeListener("complete",l),t.removeListener("abort",p),t.removeListener("request",d),t.req&&t.req.removeListener("finish",l),t.removeListener("end",g),t.removeListener("close",g),t.removeListener("finish",l),t.removeListener("end",u),t.removeListener("error",h),t.removeListener("close",p)}}},4939:(e,t,r)=>{"use strict";var A;var n=r(20663).q,o=n.ERR_MISSING_ARGS,i=n.ERR_STREAM_DESTROYED;function s(e){if(e)throw e}function a(e,t,n,o){o=function(e){var t=!1;return function(){t||(t=!0,e.apply(void 0,arguments))}}(o);var s=!1;e.on("close",(function(){s=!0})),void 0===A&&(A=r(91327)),A(e,{readable:t,writable:n},(function(e){if(e)return o(e);s=!0,o()}));var a=!1;return function(t){if(!s&&!a)return a=!0,function(e){return e.setHeader&&"function"==typeof e.abort}(e)?e.abort():"function"==typeof e.destroy?e.destroy():void o(t||new i("pipe"))}}function c(e){e()}function g(e,t){return e.pipe(t)}function l(e){return e.length?"function"!=typeof e[e.length-1]?s:e.pop():s}e.exports=function(){for(var e=arguments.length,t=new Array(e),r=0;r0,(function(e){A||(A=e),e&&i.forEach(c),o||(i.forEach(c),n(A))}))}));return t.reduce(g)}},77433:(e,t,r)=>{"use strict";var A=r(20663).q.ERR_INVALID_OPT_VALUE;e.exports={getHighWaterMark:function(e,t,r,n){var o=function(e,t,r){return null!=e.highWaterMark?e.highWaterMark:t?e[r]:null}(t,n,r);if(null!=o){if(!isFinite(o)||Math.floor(o)!==o||o<0)throw new A(n?r:"highWaterMark",o);return Math.floor(o)}return e.objectMode?16:16384}}},49298:(e,t,r)=>{e.exports=r(92413)},86897:(e,t,r)=>{var A=r(92413);"disable"===process.env.READABLE_STREAM&&A?(e.exports=A.Readable,Object.assign(e.exports,A),e.exports.Stream=A):((t=e.exports=r(58020)).Stream=A||t,t.Readable=t,t.Writable=r(6729),t.Duplex=r(72434),t.Transform=r(54801),t.PassThrough=r(52444),t.finished=r(91327),t.pipeline=r(4939))},19476:(e,t,r)=>{"use strict";const A=r(4016);e.exports=(e={})=>new Promise((t,r)=>{const n=A.connect(e,()=>{e.resolveSocket?(n.off("error",r),t({alpnProtocol:n.alpnProtocol,socket:n})):(n.destroy(),t({alpnProtocol:n.alpnProtocol}))});n.on("error",r)})},48491:(e,t,r)=>{"use strict";const A=r(92413).Readable,n=r(55737);e.exports=class extends A{constructor(e,t,r,A){if("number"!=typeof e)throw new TypeError("Argument `statusCode` should be a number");if("object"!=typeof t)throw new TypeError("Argument `headers` should be an object");if(!(r instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if("string"!=typeof A)throw new TypeError("Argument `url` should be a string");super(),this.statusCode=e,this.headers=n(t),this.body=r,this.url=A}_read(){this.push(this.body),this.push(null)}}},2383:e=>{"use strict";e.exports=function(e){var t=new e,r=t;return{get:function(){var A=t;return A.next?t=A.next:(t=new e,r=t),A.next=null,A},release:function(e){r.next=e,r=e}}}},69078:e=>{e.exports=function(e,t){var r,A,n,o=!0;Array.isArray(e)?(r=[],A=e.length):(n=Object.keys(e),r={},A=n.length);function i(e){function A(){t&&t(e,r),t=null}o?process.nextTick(A):A()}function s(e,t,n){r[e]=n,(0==--A||t)&&i(t)}A?n?n.forEach((function(t){e[t]((function(e,r){s(t,e,r)}))})):e.forEach((function(e,t){e((function(e,r){s(t,e,r)}))})):i(null);o=!1}},13499:(e,t,r)=>{var A=r(64293),n=A.Buffer;function o(e,t){for(var r in e)t[r]=e[r]}function i(e,t,r){return n(e,t,r)}n.from&&n.alloc&&n.allocUnsafe&&n.allocUnsafeSlow?e.exports=A:(o(A,t),t.Buffer=i),o(n,i),i.from=function(e,t,r){if("number"==typeof e)throw new TypeError("Argument must not be a number");return n(e,t,r)},i.alloc=function(e,t,r){if("number"!=typeof e)throw new TypeError("Argument must be a number");var A=n(e);return void 0!==t?"string"==typeof r?A.fill(t,r):A.fill(t):A.fill(0),A},i.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return n(e)},i.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return A.SlowBuffer(e)}},95584:(e,t)=>{var r;t=e.exports=l,r="object"==typeof process&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?function(){var e=Array.prototype.slice.call(arguments,0);e.unshift("SEMVER"),console.log.apply(console,e)}:function(){},t.SEMVER_SPEC_VERSION="2.0.0";var A=Number.MAX_SAFE_INTEGER||9007199254740991,n=t.re=[],o=t.src=[],i=t.tokens={},s=0;function a(e){i[e]=s++}a("NUMERICIDENTIFIER"),o[i.NUMERICIDENTIFIER]="0|[1-9]\\d*",a("NUMERICIDENTIFIERLOOSE"),o[i.NUMERICIDENTIFIERLOOSE]="[0-9]+",a("NONNUMERICIDENTIFIER"),o[i.NONNUMERICIDENTIFIER]="\\d*[a-zA-Z-][a-zA-Z0-9-]*",a("MAINVERSION"),o[i.MAINVERSION]="("+o[i.NUMERICIDENTIFIER]+")\\.("+o[i.NUMERICIDENTIFIER]+")\\.("+o[i.NUMERICIDENTIFIER]+")",a("MAINVERSIONLOOSE"),o[i.MAINVERSIONLOOSE]="("+o[i.NUMERICIDENTIFIERLOOSE]+")\\.("+o[i.NUMERICIDENTIFIERLOOSE]+")\\.("+o[i.NUMERICIDENTIFIERLOOSE]+")",a("PRERELEASEIDENTIFIER"),o[i.PRERELEASEIDENTIFIER]="(?:"+o[i.NUMERICIDENTIFIER]+"|"+o[i.NONNUMERICIDENTIFIER]+")",a("PRERELEASEIDENTIFIERLOOSE"),o[i.PRERELEASEIDENTIFIERLOOSE]="(?:"+o[i.NUMERICIDENTIFIERLOOSE]+"|"+o[i.NONNUMERICIDENTIFIER]+")",a("PRERELEASE"),o[i.PRERELEASE]="(?:-("+o[i.PRERELEASEIDENTIFIER]+"(?:\\."+o[i.PRERELEASEIDENTIFIER]+")*))",a("PRERELEASELOOSE"),o[i.PRERELEASELOOSE]="(?:-?("+o[i.PRERELEASEIDENTIFIERLOOSE]+"(?:\\."+o[i.PRERELEASEIDENTIFIERLOOSE]+")*))",a("BUILDIDENTIFIER"),o[i.BUILDIDENTIFIER]="[0-9A-Za-z-]+",a("BUILD"),o[i.BUILD]="(?:\\+("+o[i.BUILDIDENTIFIER]+"(?:\\."+o[i.BUILDIDENTIFIER]+")*))",a("FULL"),a("FULLPLAIN"),o[i.FULLPLAIN]="v?"+o[i.MAINVERSION]+o[i.PRERELEASE]+"?"+o[i.BUILD]+"?",o[i.FULL]="^"+o[i.FULLPLAIN]+"$",a("LOOSEPLAIN"),o[i.LOOSEPLAIN]="[v=\\s]*"+o[i.MAINVERSIONLOOSE]+o[i.PRERELEASELOOSE]+"?"+o[i.BUILD]+"?",a("LOOSE"),o[i.LOOSE]="^"+o[i.LOOSEPLAIN]+"$",a("GTLT"),o[i.GTLT]="((?:<|>)?=?)",a("XRANGEIDENTIFIERLOOSE"),o[i.XRANGEIDENTIFIERLOOSE]=o[i.NUMERICIDENTIFIERLOOSE]+"|x|X|\\*",a("XRANGEIDENTIFIER"),o[i.XRANGEIDENTIFIER]=o[i.NUMERICIDENTIFIER]+"|x|X|\\*",a("XRANGEPLAIN"),o[i.XRANGEPLAIN]="[v=\\s]*("+o[i.XRANGEIDENTIFIER]+")(?:\\.("+o[i.XRANGEIDENTIFIER]+")(?:\\.("+o[i.XRANGEIDENTIFIER]+")(?:"+o[i.PRERELEASE]+")?"+o[i.BUILD]+"?)?)?",a("XRANGEPLAINLOOSE"),o[i.XRANGEPLAINLOOSE]="[v=\\s]*("+o[i.XRANGEIDENTIFIERLOOSE]+")(?:\\.("+o[i.XRANGEIDENTIFIERLOOSE]+")(?:\\.("+o[i.XRANGEIDENTIFIERLOOSE]+")(?:"+o[i.PRERELEASELOOSE]+")?"+o[i.BUILD]+"?)?)?",a("XRANGE"),o[i.XRANGE]="^"+o[i.GTLT]+"\\s*"+o[i.XRANGEPLAIN]+"$",a("XRANGELOOSE"),o[i.XRANGELOOSE]="^"+o[i.GTLT]+"\\s*"+o[i.XRANGEPLAINLOOSE]+"$",a("COERCE"),o[i.COERCE]="(^|[^\\d])(\\d{1,16})(?:\\.(\\d{1,16}))?(?:\\.(\\d{1,16}))?(?:$|[^\\d])",a("COERCERTL"),n[i.COERCERTL]=new RegExp(o[i.COERCE],"g"),a("LONETILDE"),o[i.LONETILDE]="(?:~>?)",a("TILDETRIM"),o[i.TILDETRIM]="(\\s*)"+o[i.LONETILDE]+"\\s+",n[i.TILDETRIM]=new RegExp(o[i.TILDETRIM],"g");a("TILDE"),o[i.TILDE]="^"+o[i.LONETILDE]+o[i.XRANGEPLAIN]+"$",a("TILDELOOSE"),o[i.TILDELOOSE]="^"+o[i.LONETILDE]+o[i.XRANGEPLAINLOOSE]+"$",a("LONECARET"),o[i.LONECARET]="(?:\\^)",a("CARETTRIM"),o[i.CARETTRIM]="(\\s*)"+o[i.LONECARET]+"\\s+",n[i.CARETTRIM]=new RegExp(o[i.CARETTRIM],"g");a("CARET"),o[i.CARET]="^"+o[i.LONECARET]+o[i.XRANGEPLAIN]+"$",a("CARETLOOSE"),o[i.CARETLOOSE]="^"+o[i.LONECARET]+o[i.XRANGEPLAINLOOSE]+"$",a("COMPARATORLOOSE"),o[i.COMPARATORLOOSE]="^"+o[i.GTLT]+"\\s*("+o[i.LOOSEPLAIN]+")$|^$",a("COMPARATOR"),o[i.COMPARATOR]="^"+o[i.GTLT]+"\\s*("+o[i.FULLPLAIN]+")$|^$",a("COMPARATORTRIM"),o[i.COMPARATORTRIM]="(\\s*)"+o[i.GTLT]+"\\s*("+o[i.LOOSEPLAIN]+"|"+o[i.XRANGEPLAIN]+")",n[i.COMPARATORTRIM]=new RegExp(o[i.COMPARATORTRIM],"g");a("HYPHENRANGE"),o[i.HYPHENRANGE]="^\\s*("+o[i.XRANGEPLAIN]+")\\s+-\\s+("+o[i.XRANGEPLAIN]+")\\s*$",a("HYPHENRANGELOOSE"),o[i.HYPHENRANGELOOSE]="^\\s*("+o[i.XRANGEPLAINLOOSE]+")\\s+-\\s+("+o[i.XRANGEPLAINLOOSE]+")\\s*$",a("STAR"),o[i.STAR]="(<|>)?=?\\s*\\*";for(var c=0;c256)return null;if(!(t.loose?n[i.LOOSE]:n[i.FULL]).test(e))return null;try{return new l(e,t)}catch(e){return null}}function l(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof l){if(e.loose===t.loose)return e;e=e.version}else if("string"!=typeof e)throw new TypeError("Invalid Version: "+e);if(e.length>256)throw new TypeError("version is longer than 256 characters");if(!(this instanceof l))return new l(e,t);r("SemVer",e,t),this.options=t,this.loose=!!t.loose;var o=e.trim().match(t.loose?n[i.LOOSE]:n[i.FULL]);if(!o)throw new TypeError("Invalid Version: "+e);if(this.raw=e,this.major=+o[1],this.minor=+o[2],this.patch=+o[3],this.major>A||this.major<0)throw new TypeError("Invalid major version");if(this.minor>A||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>A||this.patch<0)throw new TypeError("Invalid patch version");o[4]?this.prerelease=o[4].split(".").map((function(e){if(/^[0-9]+$/.test(e)){var t=+e;if(t>=0&&t=0;)"number"==typeof this.prerelease[r]&&(this.prerelease[r]++,r=-2);-1===r&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error("invalid increment argument: "+e)}return this.format(),this.raw=this.version,this},t.inc=function(e,t,r,A){"string"==typeof r&&(A=r,r=void 0);try{return new l(e,r).inc(t,A).version}catch(e){return null}},t.diff=function(e,t){if(f(e,t))return null;var r=g(e),A=g(t),n="";if(r.prerelease.length||A.prerelease.length){n="pre";var o="prerelease"}for(var i in r)if(("major"===i||"minor"===i||"patch"===i)&&r[i]!==A[i])return n+i;return o},t.compareIdentifiers=h;var u=/^[0-9]+$/;function h(e,t){var r=u.test(e),A=u.test(t);return r&&A&&(e=+e,t=+t),e===t?0:r&&!A?-1:A&&!r?1:e0}function C(e,t,r){return p(e,t,r)<0}function f(e,t,r){return 0===p(e,t,r)}function I(e,t,r){return 0!==p(e,t,r)}function E(e,t,r){return p(e,t,r)>=0}function B(e,t,r){return p(e,t,r)<=0}function y(e,t,r,A){switch(t){case"===":return"object"==typeof e&&(e=e.version),"object"==typeof r&&(r=r.version),e===r;case"!==":return"object"==typeof e&&(e=e.version),"object"==typeof r&&(r=r.version),e!==r;case"":case"=":case"==":return f(e,r,A);case"!=":return I(e,r,A);case">":return d(e,r,A);case">=":return E(e,r,A);case"<":return C(e,r,A);case"<=":return B(e,r,A);default:throw new TypeError("Invalid operator: "+t)}}function m(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof m){if(e.loose===!!t.loose)return e;e=e.value}if(!(this instanceof m))return new m(e,t);r("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===w?this.value="":this.value=this.operator+this.semver.version,r("comp",this)}t.rcompareIdentifiers=function(e,t){return h(t,e)},t.major=function(e,t){return new l(e,t).major},t.minor=function(e,t){return new l(e,t).minor},t.patch=function(e,t){return new l(e,t).patch},t.compare=p,t.compareLoose=function(e,t){return p(e,t,!0)},t.compareBuild=function(e,t,r){var A=new l(e,r),n=new l(t,r);return A.compare(n)||A.compareBuild(n)},t.rcompare=function(e,t,r){return p(t,e,r)},t.sort=function(e,r){return e.sort((function(e,A){return t.compareBuild(e,A,r)}))},t.rsort=function(e,r){return e.sort((function(e,A){return t.compareBuild(A,e,r)}))},t.gt=d,t.lt=C,t.eq=f,t.neq=I,t.gte=E,t.lte=B,t.cmp=y,t.Comparator=m;var w={};function Q(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof Q)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new Q(e.raw,t);if(e instanceof m)return new Q(e.value,t);if(!(this instanceof Q))return new Q(e,t);if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map((function(e){return this.parseRange(e.trim())}),this).filter((function(e){return e.length})),!this.set.length)throw new TypeError("Invalid SemVer Range: "+e);this.format()}function D(e,t){for(var r=!0,A=e.slice(),n=A.pop();r&&A.length;)r=A.every((function(e){return n.intersects(e,t)})),n=A.pop();return r}function b(e){return!e||"x"===e.toLowerCase()||"*"===e}function v(e,t,r,A,n,o,i,s,a,c,g,l,u){return((t=b(r)?"":b(A)?">="+r+".0.0":b(n)?">="+r+"."+A+".0":">="+t)+" "+(s=b(a)?"":b(c)?"<"+(+a+1)+".0.0":b(g)?"<"+a+"."+(+c+1)+".0":l?"<="+a+"."+c+"."+g+"-"+l:"<="+s)).trim()}function S(e,t,A){for(var n=0;n0){var o=e[n].semver;if(o.major===t.major&&o.minor===t.minor&&o.patch===t.patch)return!0}return!1}return!0}function k(e,t,r){try{t=new Q(t,r)}catch(e){return!1}return t.test(e)}function N(e,t,r,A){var n,o,i,s,a;switch(e=new l(e,A),t=new Q(t,A),r){case">":n=d,o=B,i=C,s=">",a=">=";break;case"<":n=C,o=E,i=d,s="<",a="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(k(e,t,A))return!1;for(var c=0;c=0.0.0")),u=u||e,h=h||e,n(e.semver,u.semver,A)?u=e:i(e.semver,h.semver,A)&&(h=e)})),u.operator===s||u.operator===a)return!1;if((!h.operator||h.operator===s)&&o(e,h.semver))return!1;if(h.operator===a&&i(e,h.semver))return!1}return!0}m.prototype.parse=function(e){var t=this.options.loose?n[i.COMPARATORLOOSE]:n[i.COMPARATOR],r=e.match(t);if(!r)throw new TypeError("Invalid comparator: "+e);this.operator=void 0!==r[1]?r[1]:"","="===this.operator&&(this.operator=""),r[2]?this.semver=new l(r[2],this.options.loose):this.semver=w},m.prototype.toString=function(){return this.value},m.prototype.test=function(e){if(r("Comparator.test",e,this.options.loose),this.semver===w||e===w)return!0;if("string"==typeof e)try{e=new l(e,this.options)}catch(e){return!1}return y(e,this.operator,this.semver,this.options)},m.prototype.intersects=function(e,t){if(!(e instanceof m))throw new TypeError("a Comparator is required");var r;if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),""===this.operator)return""===this.value||(r=new Q(e.value,t),k(this.value,r,t));if(""===e.operator)return""===e.value||(r=new Q(this.value,t),k(e.semver,r,t));var A=!(">="!==this.operator&&">"!==this.operator||">="!==e.operator&&">"!==e.operator),n=!("<="!==this.operator&&"<"!==this.operator||"<="!==e.operator&&"<"!==e.operator),o=this.semver.version===e.semver.version,i=!(">="!==this.operator&&"<="!==this.operator||">="!==e.operator&&"<="!==e.operator),s=y(this.semver,"<",e.semver,t)&&(">="===this.operator||">"===this.operator)&&("<="===e.operator||"<"===e.operator),a=y(this.semver,">",e.semver,t)&&("<="===this.operator||"<"===this.operator)&&(">="===e.operator||">"===e.operator);return A||n||o&&i||s||a},t.Range=Q,Q.prototype.format=function(){return this.range=this.set.map((function(e){return e.join(" ").trim()})).join("||").trim(),this.range},Q.prototype.toString=function(){return this.range},Q.prototype.parseRange=function(e){var t=this.options.loose;e=e.trim();var A=t?n[i.HYPHENRANGELOOSE]:n[i.HYPHENRANGE];e=e.replace(A,v),r("hyphen replace",e),e=e.replace(n[i.COMPARATORTRIM],"$1$2$3"),r("comparator trim",e,n[i.COMPARATORTRIM]),e=(e=(e=e.replace(n[i.TILDETRIM],"$1~")).replace(n[i.CARETTRIM],"$1^")).split(/\s+/).join(" ");var o=t?n[i.COMPARATORLOOSE]:n[i.COMPARATOR],s=e.split(" ").map((function(e){return function(e,t){return r("comp",e,t),e=function(e,t){return e.trim().split(/\s+/).map((function(e){return function(e,t){r("caret",e,t);var A=t.loose?n[i.CARETLOOSE]:n[i.CARET];return e.replace(A,(function(t,A,n,o,i){var s;return r("caret",e,t,A,n,o,i),b(A)?s="":b(n)?s=">="+A+".0.0 <"+(+A+1)+".0.0":b(o)?s="0"===A?">="+A+"."+n+".0 <"+A+"."+(+n+1)+".0":">="+A+"."+n+".0 <"+(+A+1)+".0.0":i?(r("replaceCaret pr",i),s="0"===A?"0"===n?">="+A+"."+n+"."+o+"-"+i+" <"+A+"."+n+"."+(+o+1):">="+A+"."+n+"."+o+"-"+i+" <"+A+"."+(+n+1)+".0":">="+A+"."+n+"."+o+"-"+i+" <"+(+A+1)+".0.0"):(r("no pr"),s="0"===A?"0"===n?">="+A+"."+n+"."+o+" <"+A+"."+n+"."+(+o+1):">="+A+"."+n+"."+o+" <"+A+"."+(+n+1)+".0":">="+A+"."+n+"."+o+" <"+(+A+1)+".0.0"),r("caret return",s),s}))}(e,t)})).join(" ")}(e,t),r("caret",e),e=function(e,t){return e.trim().split(/\s+/).map((function(e){return function(e,t){var A=t.loose?n[i.TILDELOOSE]:n[i.TILDE];return e.replace(A,(function(t,A,n,o,i){var s;return r("tilde",e,t,A,n,o,i),b(A)?s="":b(n)?s=">="+A+".0.0 <"+(+A+1)+".0.0":b(o)?s=">="+A+"."+n+".0 <"+A+"."+(+n+1)+".0":i?(r("replaceTilde pr",i),s=">="+A+"."+n+"."+o+"-"+i+" <"+A+"."+(+n+1)+".0"):s=">="+A+"."+n+"."+o+" <"+A+"."+(+n+1)+".0",r("tilde return",s),s}))}(e,t)})).join(" ")}(e,t),r("tildes",e),e=function(e,t){return r("replaceXRanges",e,t),e.split(/\s+/).map((function(e){return function(e,t){e=e.trim();var A=t.loose?n[i.XRANGELOOSE]:n[i.XRANGE];return e.replace(A,(function(A,n,o,i,s,a){r("xRange",e,A,n,o,i,s,a);var c=b(o),g=c||b(i),l=g||b(s),u=l;return"="===n&&u&&(n=""),a=t.includePrerelease?"-0":"",c?A=">"===n||"<"===n?"<0.0.0-0":"*":n&&u?(g&&(i=0),s=0,">"===n?(n=">=",g?(o=+o+1,i=0,s=0):(i=+i+1,s=0)):"<="===n&&(n="<",g?o=+o+1:i=+i+1),A=n+o+"."+i+"."+s+a):g?A=">="+o+".0.0"+a+" <"+(+o+1)+".0.0"+a:l&&(A=">="+o+"."+i+".0"+a+" <"+o+"."+(+i+1)+".0"+a),r("xRange return",A),A}))}(e,t)})).join(" ")}(e,t),r("xrange",e),e=function(e,t){return r("replaceStars",e,t),e.trim().replace(n[i.STAR],"")}(e,t),r("stars",e),e}(e,this.options)}),this).join(" ").split(/\s+/);return this.options.loose&&(s=s.filter((function(e){return!!e.match(o)}))),s=s.map((function(e){return new m(e,this.options)}),this)},Q.prototype.intersects=function(e,t){if(!(e instanceof Q))throw new TypeError("a Range is required");return this.set.some((function(r){return D(r,t)&&e.set.some((function(e){return D(e,t)&&r.every((function(r){return e.every((function(e){return r.intersects(e,t)}))}))}))}))},t.toComparators=function(e,t){return new Q(e,t).set.map((function(e){return e.map((function(e){return e.value})).join(" ").trim().split(" ")}))},Q.prototype.test=function(e){if(!e)return!1;if("string"==typeof e)try{e=new l(e,this.options)}catch(e){return!1}for(var t=0;t":0===t.prerelease.length?t.patch++:t.prerelease.push(0),t.raw=t.format();case"":case">=":r&&!d(r,t)||(r=t);break;case"<":case"<=":break;default:throw new Error("Unexpected operation: "+e.operator)}}))}if(r&&e.test(r))return r;return null},t.validRange=function(e,t){try{return new Q(e,t).range||"*"}catch(e){return null}},t.ltr=function(e,t,r){return N(e,t,"<",r)},t.gtr=function(e,t,r){return N(e,t,">",r)},t.outside=N,t.prerelease=function(e,t){var r=g(e,t);return r&&r.prerelease.length?r.prerelease:null},t.intersects=function(e,t,r){return e=new Q(e,r),t=new Q(t,r),e.intersects(t)},t.coerce=function(e,t){if(e instanceof l)return e;"number"==typeof e&&(e=String(e));if("string"!=typeof e)return null;var r=null;if((t=t||{}).rtl){for(var A;(A=n[i.COERCERTL].exec(e))&&(!r||r.index+r[0].length!==e.length);)r&&A.index+A[0].length===r.index+r[0].length||(r=A),n[i.COERCERTL].lastIndex=A.index+A[1].length+A[2].length;n[i.COERCERTL].lastIndex=-1}else r=e.match(n[i.COERCE]);if(null===r)return null;return g(r[2]+"."+(r[3]||"0")+"."+(r[4]||"0"),t)}},29069:(e,t,r)=>{const A=Symbol("SemVer ANY");class n{static get ANY(){return A}constructor(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof n){if(e.loose===!!t.loose)return e;e=e.value}a("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===A?this.value="":this.value=this.operator+this.semver.version,a("comp",this)}parse(e){const t=this.options.loose?o[i.COMPARATORLOOSE]:o[i.COMPARATOR],r=e.match(t);if(!r)throw new TypeError("Invalid comparator: "+e);this.operator=void 0!==r[1]?r[1]:"","="===this.operator&&(this.operator=""),r[2]?this.semver=new c(r[2],this.options.loose):this.semver=A}toString(){return this.value}test(e){if(a("Comparator.test",e,this.options.loose),this.semver===A||e===A)return!0;if("string"==typeof e)try{e=new c(e,this.options)}catch(e){return!1}return s(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof n))throw new TypeError("a Comparator is required");if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),""===this.operator)return""===this.value||new g(e.value,t).test(this.value);if(""===e.operator)return""===e.value||new g(this.value,t).test(e.semver);const r=!(">="!==this.operator&&">"!==this.operator||">="!==e.operator&&">"!==e.operator),A=!("<="!==this.operator&&"<"!==this.operator||"<="!==e.operator&&"<"!==e.operator),o=this.semver.version===e.semver.version,i=!(">="!==this.operator&&"<="!==this.operator||">="!==e.operator&&"<="!==e.operator),a=s(this.semver,"<",e.semver,t)&&(">="===this.operator||">"===this.operator)&&("<="===e.operator||"<"===e.operator),c=s(this.semver,">",e.semver,t)&&("<="===this.operator||"<"===this.operator)&&(">="===e.operator||">"===e.operator);return r||A||o&&i||a||c}}e.exports=n;const{re:o,t:i}=r(49439),s=r(38754),a=r(6029),c=r(14772),g=r(73004)},73004:(e,t,r)=>{class A{constructor(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof A)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new A(e.raw,t);if(e instanceof n)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(e=>this.parseRange(e.trim())).filter(e=>e.length),!this.set.length)throw new TypeError("Invalid SemVer Range: "+e);this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){const t=this.options.loose;e=e.trim();const r=t?s[a.HYPHENRANGELOOSE]:s[a.HYPHENRANGE];e=e.replace(r,w(this.options.includePrerelease)),o("hyphen replace",e),e=e.replace(s[a.COMPARATORTRIM],c),o("comparator trim",e,s[a.COMPARATORTRIM]),e=(e=(e=e.replace(s[a.TILDETRIM],g)).replace(s[a.CARETTRIM],l)).split(/\s+/).join(" ");const A=t?s[a.COMPARATORLOOSE]:s[a.COMPARATOR];return e.split(" ").map(e=>h(e,this.options)).join(" ").split(/\s+/).map(e=>m(e,this.options)).filter(this.options.loose?e=>!!e.match(A):()=>!0).map(e=>new n(e,this.options))}intersects(e,t){if(!(e instanceof A))throw new TypeError("a Range is required");return this.set.some(r=>u(r,t)&&e.set.some(e=>u(e,t)&&r.every(r=>e.every(e=>r.intersects(e,t)))))}test(e){if(!e)return!1;if("string"==typeof e)try{e=new i(e,this.options)}catch(e){return!1}for(let t=0;t{let r=!0;const A=e.slice();let n=A.pop();for(;r&&A.length;)r=A.every(e=>n.intersects(e,t)),n=A.pop();return r},h=(e,t)=>(o("comp",e,t),e=f(e,t),o("caret",e),e=d(e,t),o("tildes",e),e=E(e,t),o("xrange",e),e=y(e,t),o("stars",e),e),p=e=>!e||"x"===e.toLowerCase()||"*"===e,d=(e,t)=>e.trim().split(/\s+/).map(e=>C(e,t)).join(" "),C=(e,t)=>{const r=t.loose?s[a.TILDELOOSE]:s[a.TILDE];return e.replace(r,(t,r,A,n,i)=>{let s;return o("tilde",e,t,r,A,n,i),p(r)?s="":p(A)?s=`>=${r}.0.0 <${+r+1}.0.0-0`:p(n)?s=`>=${r}.${A}.0 <${r}.${+A+1}.0-0`:i?(o("replaceTilde pr",i),s=`>=${r}.${A}.${n}-${i} <${r}.${+A+1}.0-0`):s=`>=${r}.${A}.${n} <${r}.${+A+1}.0-0`,o("tilde return",s),s})},f=(e,t)=>e.trim().split(/\s+/).map(e=>I(e,t)).join(" "),I=(e,t)=>{o("caret",e,t);const r=t.loose?s[a.CARETLOOSE]:s[a.CARET],A=t.includePrerelease?"-0":"";return e.replace(r,(t,r,n,i,s)=>{let a;return o("caret",e,t,r,n,i,s),p(r)?a="":p(n)?a=`>=${r}.0.0${A} <${+r+1}.0.0-0`:p(i)?a="0"===r?`>=${r}.${n}.0${A} <${r}.${+n+1}.0-0`:`>=${r}.${n}.0${A} <${+r+1}.0.0-0`:s?(o("replaceCaret pr",s),a="0"===r?"0"===n?`>=${r}.${n}.${i}-${s} <${r}.${n}.${+i+1}-0`:`>=${r}.${n}.${i}-${s} <${r}.${+n+1}.0-0`:`>=${r}.${n}.${i}-${s} <${+r+1}.0.0-0`):(o("no pr"),a="0"===r?"0"===n?`>=${r}.${n}.${i}${A} <${r}.${n}.${+i+1}-0`:`>=${r}.${n}.${i}${A} <${r}.${+n+1}.0-0`:`>=${r}.${n}.${i} <${+r+1}.0.0-0`),o("caret return",a),a})},E=(e,t)=>(o("replaceXRanges",e,t),e.split(/\s+/).map(e=>B(e,t)).join(" ")),B=(e,t)=>{e=e.trim();const r=t.loose?s[a.XRANGELOOSE]:s[a.XRANGE];return e.replace(r,(r,A,n,i,s,a)=>{o("xRange",e,r,A,n,i,s,a);const c=p(n),g=c||p(i),l=g||p(s),u=l;return"="===A&&u&&(A=""),a=t.includePrerelease?"-0":"",c?r=">"===A||"<"===A?"<0.0.0-0":"*":A&&u?(g&&(i=0),s=0,">"===A?(A=">=",g?(n=+n+1,i=0,s=0):(i=+i+1,s=0)):"<="===A&&(A="<",g?n=+n+1:i=+i+1),"<"===A&&(a="-0"),r=`${A+n}.${i}.${s}${a}`):g?r=`>=${n}.0.0${a} <${+n+1}.0.0-0`:l&&(r=`>=${n}.${i}.0${a} <${n}.${+i+1}.0-0`),o("xRange return",r),r})},y=(e,t)=>(o("replaceStars",e,t),e.trim().replace(s[a.STAR],"")),m=(e,t)=>(o("replaceGTE0",e,t),e.trim().replace(s[t.includePrerelease?a.GTE0PRE:a.GTE0],"")),w=e=>(t,r,A,n,o,i,s,a,c,g,l,u,h)=>`${r=p(A)?"":p(n)?`>=${A}.0.0${e?"-0":""}`:p(o)?`>=${A}.${n}.0${e?"-0":""}`:i?">="+r:`>=${r}${e?"-0":""}`} ${a=p(c)?"":p(g)?`<${+c+1}.0.0-0`:p(l)?`<${c}.${+g+1}.0-0`:u?`<=${c}.${g}.${l}-${u}`:e?`<${c}.${g}.${+l+1}-0`:"<="+a}`.trim(),Q=(e,t,r)=>{for(let r=0;r0){const A=e[r].semver;if(A.major===t.major&&A.minor===t.minor&&A.patch===t.patch)return!0}return!1}return!0}},14772:(e,t,r)=>{const A=r(6029),{MAX_LENGTH:n,MAX_SAFE_INTEGER:o}=r(76483),{re:i,t:s}=r(49439),{compareIdentifiers:a}=r(99297);class c{constructor(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof c){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if("string"!=typeof e)throw new TypeError("Invalid Version: "+e);if(e.length>n)throw new TypeError(`version is longer than ${n} characters`);A("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;const r=e.trim().match(t.loose?i[s.LOOSE]:i[s.FULL]);if(!r)throw new TypeError("Invalid Version: "+e);if(this.raw=e,this.major=+r[1],this.minor=+r[2],this.patch=+r[3],this.major>o||this.major<0)throw new TypeError("Invalid major version");if(this.minor>o||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>o||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map(e=>{if(/^[0-9]+$/.test(e)){const t=+e;if(t>=0&&t=0;)"number"==typeof this.prerelease[e]&&(this.prerelease[e]++,e=-2);-1===e&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error("invalid increment argument: "+e)}return this.format(),this.raw=this.version,this}}e.exports=c},31192:(e,t,r)=>{const A=r(21883);e.exports=(e,t)=>{const r=A(e.trim().replace(/^[=v]+/,""),t);return r?r.version:null}},38754:(e,t,r)=>{const A=r(78760),n=r(83286),o=r(26544),i=r(44984),s=r(65069),a=r(93845);e.exports=(e,t,r,c)=>{switch(t){case"===":return"object"==typeof e&&(e=e.version),"object"==typeof r&&(r=r.version),e===r;case"!==":return"object"==typeof e&&(e=e.version),"object"==typeof r&&(r=r.version),e!==r;case"":case"=":case"==":return A(e,r,c);case"!=":return n(e,r,c);case">":return o(e,r,c);case">=":return i(e,r,c);case"<":return s(e,r,c);case"<=":return a(e,r,c);default:throw new TypeError("Invalid operator: "+t)}}},38113:(e,t,r)=>{const A=r(14772),n=r(21883),{re:o,t:i}=r(49439);e.exports=(e,t)=>{if(e instanceof A)return e;if("number"==typeof e&&(e=String(e)),"string"!=typeof e)return null;let r=null;if((t=t||{}).rtl){let t;for(;(t=o[i.COERCERTL].exec(e))&&(!r||r.index+r[0].length!==e.length);)r&&t.index+t[0].length===r.index+r[0].length||(r=t),o[i.COERCERTL].lastIndex=t.index+t[1].length+t[2].length;o[i.COERCERTL].lastIndex=-1}else r=e.match(o[i.COERCE]);return null===r?null:n(`${r[2]}.${r[3]||"0"}.${r[4]||"0"}`,t)}},63353:(e,t,r)=>{const A=r(14772);e.exports=(e,t,r)=>{const n=new A(e,r),o=new A(t,r);return n.compare(o)||n.compareBuild(o)}},58566:(e,t,r)=>{const A=r(17340);e.exports=(e,t)=>A(e,t,!0)},17340:(e,t,r)=>{const A=r(14772);e.exports=(e,t,r)=>new A(e,r).compare(new A(t,r))},29301:(e,t,r)=>{const A=r(21883),n=r(78760);e.exports=(e,t)=>{if(n(e,t))return null;{const r=A(e),n=A(t),o=r.prerelease.length||n.prerelease.length,i=o?"pre":"",s=o?"prerelease":"";for(const e in r)if(("major"===e||"minor"===e||"patch"===e)&&r[e]!==n[e])return i+e;return s}}},78760:(e,t,r)=>{const A=r(17340);e.exports=(e,t,r)=>0===A(e,t,r)},26544:(e,t,r)=>{const A=r(17340);e.exports=(e,t,r)=>A(e,t,r)>0},44984:(e,t,r)=>{const A=r(17340);e.exports=(e,t,r)=>A(e,t,r)>=0},24063:(e,t,r)=>{const A=r(14772);e.exports=(e,t,r,n)=>{"string"==typeof r&&(n=r,r=void 0);try{return new A(e,r).inc(t,n).version}catch(e){return null}}},65069:(e,t,r)=>{const A=r(17340);e.exports=(e,t,r)=>A(e,t,r)<0},93845:(e,t,r)=>{const A=r(17340);e.exports=(e,t,r)=>A(e,t,r)<=0},75157:(e,t,r)=>{const A=r(14772);e.exports=(e,t)=>new A(e,t).major},5195:(e,t,r)=>{const A=r(14772);e.exports=(e,t)=>new A(e,t).minor},83286:(e,t,r)=>{const A=r(17340);e.exports=(e,t,r)=>0!==A(e,t,r)},21883:(e,t,r)=>{const{MAX_LENGTH:A}=r(76483),{re:n,t:o}=r(49439),i=r(14772);e.exports=(e,t)=>{if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof i)return e;if("string"!=typeof e)return null;if(e.length>A)return null;if(!(t.loose?n[o.LOOSE]:n[o.FULL]).test(e))return null;try{return new i(e,t)}catch(e){return null}}},39592:(e,t,r)=>{const A=r(14772);e.exports=(e,t)=>new A(e,t).patch},27050:(e,t,r)=>{const A=r(21883);e.exports=(e,t)=>{const r=A(e,t);return r&&r.prerelease.length?r.prerelease:null}},93788:(e,t,r)=>{const A=r(17340);e.exports=(e,t,r)=>A(t,e,r)},15213:(e,t,r)=>{const A=r(63353);e.exports=(e,t)=>e.sort((e,r)=>A(r,e,t))},73011:(e,t,r)=>{const A=r(73004);e.exports=(e,t,r)=>{try{t=new A(t,r)}catch(e){return!1}return t.test(e)}},71102:(e,t,r)=>{const A=r(63353);e.exports=(e,t)=>e.sort((e,r)=>A(e,r,t))},99589:(e,t,r)=>{const A=r(21883);e.exports=(e,t)=>{const r=A(e,t);return r?r.version:null}},53887:(e,t,r)=>{const A=r(49439);e.exports={re:A.re,src:A.src,tokens:A.t,SEMVER_SPEC_VERSION:r(76483).SEMVER_SPEC_VERSION,SemVer:r(14772),compareIdentifiers:r(99297).compareIdentifiers,rcompareIdentifiers:r(99297).rcompareIdentifiers,parse:r(21883),valid:r(99589),clean:r(31192),inc:r(24063),diff:r(29301),major:r(75157),minor:r(5195),patch:r(39592),prerelease:r(27050),compare:r(17340),rcompare:r(93788),compareLoose:r(58566),compareBuild:r(63353),sort:r(71102),rsort:r(15213),gt:r(26544),lt:r(65069),eq:r(78760),neq:r(83286),gte:r(44984),lte:r(93845),cmp:r(38754),coerce:r(38113),Comparator:r(29069),Range:r(73004),satisfies:r(73011),toComparators:r(47753),maxSatisfying:r(1895),minSatisfying:r(33252),minVersion:r(4224),validRange:r(44315),outside:r(842),gtr:r(69258),ltr:r(36928),intersects:r(87395),simplifyRange:r(3530),subset:r(74264)}},76483:e=>{const t=Number.MAX_SAFE_INTEGER||9007199254740991;e.exports={SEMVER_SPEC_VERSION:"2.0.0",MAX_LENGTH:256,MAX_SAFE_INTEGER:t,MAX_SAFE_COMPONENT_LENGTH:16}},6029:e=>{const t="object"==typeof process&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...e)=>console.error("SEMVER",...e):()=>{};e.exports=t},99297:e=>{const t=/^[0-9]+$/,r=(e,r)=>{const A=t.test(e),n=t.test(r);return A&&n&&(e=+e,r=+r),e===r?0:A&&!n?-1:n&&!A?1:er(t,e)}},49439:(e,t,r)=>{const{MAX_SAFE_COMPONENT_LENGTH:A}=r(76483),n=r(6029),o=(t=e.exports={}).re=[],i=t.src=[],s=t.t={};let a=0;const c=(e,t,r)=>{const A=a++;n(A,t),s[e]=A,i[A]=t,o[A]=new RegExp(t,r?"g":void 0)};c("NUMERICIDENTIFIER","0|[1-9]\\d*"),c("NUMERICIDENTIFIERLOOSE","[0-9]+"),c("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*"),c("MAINVERSION",`(${i[s.NUMERICIDENTIFIER]})\\.(${i[s.NUMERICIDENTIFIER]})\\.(${i[s.NUMERICIDENTIFIER]})`),c("MAINVERSIONLOOSE",`(${i[s.NUMERICIDENTIFIERLOOSE]})\\.(${i[s.NUMERICIDENTIFIERLOOSE]})\\.(${i[s.NUMERICIDENTIFIERLOOSE]})`),c("PRERELEASEIDENTIFIER",`(?:${i[s.NUMERICIDENTIFIER]}|${i[s.NONNUMERICIDENTIFIER]})`),c("PRERELEASEIDENTIFIERLOOSE",`(?:${i[s.NUMERICIDENTIFIERLOOSE]}|${i[s.NONNUMERICIDENTIFIER]})`),c("PRERELEASE",`(?:-(${i[s.PRERELEASEIDENTIFIER]}(?:\\.${i[s.PRERELEASEIDENTIFIER]})*))`),c("PRERELEASELOOSE",`(?:-?(${i[s.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${i[s.PRERELEASEIDENTIFIERLOOSE]})*))`),c("BUILDIDENTIFIER","[0-9A-Za-z-]+"),c("BUILD",`(?:\\+(${i[s.BUILDIDENTIFIER]}(?:\\.${i[s.BUILDIDENTIFIER]})*))`),c("FULLPLAIN",`v?${i[s.MAINVERSION]}${i[s.PRERELEASE]}?${i[s.BUILD]}?`),c("FULL",`^${i[s.FULLPLAIN]}$`),c("LOOSEPLAIN",`[v=\\s]*${i[s.MAINVERSIONLOOSE]}${i[s.PRERELEASELOOSE]}?${i[s.BUILD]}?`),c("LOOSE",`^${i[s.LOOSEPLAIN]}$`),c("GTLT","((?:<|>)?=?)"),c("XRANGEIDENTIFIERLOOSE",i[s.NUMERICIDENTIFIERLOOSE]+"|x|X|\\*"),c("XRANGEIDENTIFIER",i[s.NUMERICIDENTIFIER]+"|x|X|\\*"),c("XRANGEPLAIN",`[v=\\s]*(${i[s.XRANGEIDENTIFIER]})(?:\\.(${i[s.XRANGEIDENTIFIER]})(?:\\.(${i[s.XRANGEIDENTIFIER]})(?:${i[s.PRERELEASE]})?${i[s.BUILD]}?)?)?`),c("XRANGEPLAINLOOSE",`[v=\\s]*(${i[s.XRANGEIDENTIFIERLOOSE]})(?:\\.(${i[s.XRANGEIDENTIFIERLOOSE]})(?:\\.(${i[s.XRANGEIDENTIFIERLOOSE]})(?:${i[s.PRERELEASELOOSE]})?${i[s.BUILD]}?)?)?`),c("XRANGE",`^${i[s.GTLT]}\\s*${i[s.XRANGEPLAIN]}$`),c("XRANGELOOSE",`^${i[s.GTLT]}\\s*${i[s.XRANGEPLAINLOOSE]}$`),c("COERCE",`(^|[^\\d])(\\d{1,${A}})(?:\\.(\\d{1,${A}}))?(?:\\.(\\d{1,${A}}))?(?:$|[^\\d])`),c("COERCERTL",i[s.COERCE],!0),c("LONETILDE","(?:~>?)"),c("TILDETRIM",`(\\s*)${i[s.LONETILDE]}\\s+`,!0),t.tildeTrimReplace="$1~",c("TILDE",`^${i[s.LONETILDE]}${i[s.XRANGEPLAIN]}$`),c("TILDELOOSE",`^${i[s.LONETILDE]}${i[s.XRANGEPLAINLOOSE]}$`),c("LONECARET","(?:\\^)"),c("CARETTRIM",`(\\s*)${i[s.LONECARET]}\\s+`,!0),t.caretTrimReplace="$1^",c("CARET",`^${i[s.LONECARET]}${i[s.XRANGEPLAIN]}$`),c("CARETLOOSE",`^${i[s.LONECARET]}${i[s.XRANGEPLAINLOOSE]}$`),c("COMPARATORLOOSE",`^${i[s.GTLT]}\\s*(${i[s.LOOSEPLAIN]})$|^$`),c("COMPARATOR",`^${i[s.GTLT]}\\s*(${i[s.FULLPLAIN]})$|^$`),c("COMPARATORTRIM",`(\\s*)${i[s.GTLT]}\\s*(${i[s.LOOSEPLAIN]}|${i[s.XRANGEPLAIN]})`,!0),t.comparatorTrimReplace="$1$2$3",c("HYPHENRANGE",`^\\s*(${i[s.XRANGEPLAIN]})\\s+-\\s+(${i[s.XRANGEPLAIN]})\\s*$`),c("HYPHENRANGELOOSE",`^\\s*(${i[s.XRANGEPLAINLOOSE]})\\s+-\\s+(${i[s.XRANGEPLAINLOOSE]})\\s*$`),c("STAR","(<|>)?=?\\s*\\*"),c("GTE0","^\\s*>=\\s*0.0.0\\s*$"),c("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")},69258:(e,t,r)=>{const A=r(842);e.exports=(e,t,r)=>A(e,t,">",r)},87395:(e,t,r)=>{const A=r(73004);e.exports=(e,t,r)=>(e=new A(e,r),t=new A(t,r),e.intersects(t))},36928:(e,t,r)=>{const A=r(842);e.exports=(e,t,r)=>A(e,t,"<",r)},1895:(e,t,r)=>{const A=r(14772),n=r(73004);e.exports=(e,t,r)=>{let o=null,i=null,s=null;try{s=new n(t,r)}catch(e){return null}return e.forEach(e=>{s.test(e)&&(o&&-1!==i.compare(e)||(o=e,i=new A(o,r)))}),o}},33252:(e,t,r)=>{const A=r(14772),n=r(73004);e.exports=(e,t,r)=>{let o=null,i=null,s=null;try{s=new n(t,r)}catch(e){return null}return e.forEach(e=>{s.test(e)&&(o&&1!==i.compare(e)||(o=e,i=new A(o,r)))}),o}},4224:(e,t,r)=>{const A=r(14772),n=r(73004),o=r(26544);e.exports=(e,t)=>{e=new n(e,t);let r=new A("0.0.0");if(e.test(r))return r;if(r=new A("0.0.0-0"),e.test(r))return r;r=null;for(let t=0;t{const t=new A(e.semver.version);switch(e.operator){case">":0===t.prerelease.length?t.patch++:t.prerelease.push(0),t.raw=t.format();case"":case">=":r&&!o(r,t)||(r=t);break;case"<":case"<=":break;default:throw new Error("Unexpected operation: "+e.operator)}})}return r&&e.test(r)?r:null}},842:(e,t,r)=>{const A=r(14772),n=r(29069),{ANY:o}=n,i=r(73004),s=r(73011),a=r(26544),c=r(65069),g=r(93845),l=r(44984);e.exports=(e,t,r,u)=>{let h,p,d,C,f;switch(e=new A(e,u),t=new i(t,u),r){case">":h=a,p=g,d=c,C=">",f=">=";break;case"<":h=c,p=l,d=a,C="<",f="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(s(e,t,u))return!1;for(let r=0;r{e.semver===o&&(e=new n(">=0.0.0")),i=i||e,s=s||e,h(e.semver,i.semver,u)?i=e:d(e.semver,s.semver,u)&&(s=e)}),i.operator===C||i.operator===f)return!1;if((!s.operator||s.operator===C)&&p(e,s.semver))return!1;if(s.operator===f&&d(e,s.semver))return!1}return!0}},3530:(e,t,r)=>{const A=r(73011),n=r(17340);e.exports=(e,t,r)=>{const o=[];let i=null,s=null;const a=e.sort((e,t)=>n(e,t,r));for(const e of a){A(e,t,r)?(s=e,i||(i=e)):(s&&o.push([i,s]),s=null,i=null)}i&&o.push([i,null]);const c=[];for(const[e,t]of o)e===t?c.push(e):t||e!==a[0]?t?e===a[0]?c.push("<="+t):c.push(`${e} - ${t}`):c.push(">="+e):c.push("*");const g=c.join(" || "),l="string"==typeof t.raw?t.raw:String(t);return g.length{const A=r(73004),{ANY:n}=r(29069),o=r(73011),i=r(17340),s=(e,t,r)=>{if(1===e.length&&e[0].semver===n)return 1===t.length&&t[0].semver===n;const A=new Set;let s,g,l,u,h,p,d;for(const t of e)">"===t.operator||">="===t.operator?s=a(s,t,r):"<"===t.operator||"<="===t.operator?g=c(g,t,r):A.add(t.semver);if(A.size>1)return null;if(s&&g){if(l=i(s.semver,g.semver,r),l>0)return null;if(0===l&&(">="!==s.operator||"<="!==g.operator))return null}for(const e of A){if(s&&!o(e,String(s),r))return null;if(g&&!o(e,String(g),r))return null;for(const A of t)if(!o(e,String(A),r))return!1;return!0}for(const e of t){if(d=d||">"===e.operator||">="===e.operator,p=p||"<"===e.operator||"<="===e.operator,s)if(">"===e.operator||">="===e.operator){if(u=a(s,e,r),u===e)return!1}else if(">="===s.operator&&!o(s.semver,String(e),r))return!1;if(g)if("<"===e.operator||"<="===e.operator){if(h=c(g,e,r),h===e)return!1}else if("<="===g.operator&&!o(g.semver,String(e),r))return!1;if(!e.operator&&(g||s)&&0!==l)return!1}return!(s&&p&&!g&&0!==l)&&!(g&&d&&!s&&0!==l)},a=(e,t,r)=>{if(!e)return t;const A=i(e.semver,t.semver,r);return A>0?e:A<0||">"===t.operator&&">="===e.operator?t:e},c=(e,t,r)=>{if(!e)return t;const A=i(e.semver,t.semver,r);return A<0?e:A>0||"<"===t.operator&&"<="===e.operator?t:e};e.exports=(e,t,r)=>{e=new A(e,r),t=new A(t,r);let n=!1;e:for(const A of e.set){for(const e of t.set){const t=s(A,e,r);if(n=n||null!==t,t)continue e}if(n)return!1}return!0}},47753:(e,t,r)=>{const A=r(73004);e.exports=(e,t)=>new A(e,t).set.map(e=>e.map(e=>e.value).join(" ").trim().split(" "))},44315:(e,t,r)=>{const A=r(73004);e.exports=(e,t)=>{try{return new A(e,t).range||"*"}catch(e){return null}}},91470:(e,t,r)=>{"use strict";const A=r(67719);e.exports=(e="")=>{const t=e.match(A);if(!t)return null;const[r,n]=t[0].replace(/#! ?/,"").split(" "),o=r.split("/").pop();return"env"===o?n:n?`${o} ${n}`:o}},67719:e=>{"use strict";e.exports=/^#!(.*)/},17234:e=>{"use strict";e.exports=e=>{const t=/^\\\\\?\\/.test(e),r=/[^\u0000-\u0080]+/.test(e);return t||r?e:e.replace(/\\/g,"/")}},10129:(e,t,r)=>{"use strict";const A=r(76417),n=r(19184),o=r(92413).Transform,i=["sha256","sha384","sha512"],s=/^[a-z0-9+/]+(?:=?=?)$/i,a=/^([^-]+)-([^?]+)([?\S*]*)$/,c=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,g=/^[\x21-\x7E]+$/,l=n({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>B},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}});class u{get isHash(){return!0}constructor(e,t){const r=!!(t=l(t)).strict;this.source=e.trim();const A=this.source.match(r?c:a);if(!A)return;if(r&&!i.some(e=>e===A[1]))return;this.algorithm=A[1],this.digest=A[2];const n=A[3];this.options=n?n.slice(1).split("?"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}toString(e){if((e=l(e)).strict&&!(i.some(e=>e===this.algorithm)&&this.digest.match(s)&&(this.options||[]).every(e=>e.match(g))))return"";const t=this.options&&this.options.length?"?"+this.options.join("?"):"";return`${this.algorithm}-${this.digest}${t}`}}class h{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){let t=(e=l(e)).sep||" ";return e.strict&&(t=t.replace(/\S+/g," ")),Object.keys(this).map(r=>this[r].map(t=>u.prototype.toString.call(t,e)).filter(e=>e.length).join(t)).filter(e=>e.length).join(t)}concat(e,t){t=l(t);const r="string"==typeof e?e:C(e,t);return p(`${this.toString(t)} ${r}`,t)}hexDigest(){return p(this,{single:!0}).hexDigest()}match(e,t){const r=p(e,t=l(t)),A=r.pickAlgorithm(t);return this[A]&&r[A]&&this[A].find(e=>r[A].find(t=>e.digest===t.digest))||!1}pickAlgorithm(e){const t=(e=l(e)).pickAlgorithm,r=Object.keys(this);if(!r.length)throw new Error("No algorithms available for "+JSON.stringify(this.toString()));return r.reduce((e,r)=>t(e,r)||e)}}function p(e,t){if(t=l(t),"string"==typeof e)return d(e,t);if(e.algorithm&&e.digest){const r=new h;return r[e.algorithm]=[e],d(C(r,t),t)}return d(C(e,t),t)}function d(e,t){return t.single?new u(e,t):e.trim().split(/\s+/).reduce((e,r)=>{const A=new u(r,t);if(A.algorithm&&A.digest){const t=A.algorithm;e[t]||(e[t]=[]),e[t].push(A)}return e},new h)}function C(e,t){return t=l(t),e.algorithm&&e.digest?u.prototype.toString.call(e,t):"string"==typeof e?C(p(e,t),t):h.prototype.toString.call(e,t)}function f(e){const t=(e=l(e)).integrity&&p(e.integrity,e),r=t&&Object.keys(t).length,n=r&&t.pickAlgorithm(e),i=r&&t[n],s=Array.from(new Set(e.algorithms.concat(n?[n]:[]))),a=s.map(A.createHash);let c=0;const g=new o({transform(e,t,r){c+=e.length,a.forEach(r=>r.update(e,t)),r(null,e,t)}}).on("end",()=>{const A=e.options&&e.options.length?"?"+e.options.join("?"):"",o=p(a.map((e,t)=>`${s[t]}-${e.digest("base64")}${A}`).join(" "),e),l=r&&o.match(t,e);if("number"==typeof e.size&&c!==e.size){const r=new Error(`stream size mismatch when checking ${t}.\n Wanted: ${e.size}\n Found: ${c}`);r.code="EBADSIZE",r.found=c,r.expected=e.size,r.sri=t,g.emit("error",r)}else if(e.integrity&&!l){const e=new Error(`${t} integrity checksum failed when using ${n}: wanted ${i} but got ${o}. (${c} bytes)`);e.code="EINTEGRITY",e.found=o,e.expected=i,e.algorithm=n,e.sri=t,g.emit("error",e)}else g.emit("size",c),g.emit("integrity",o),l&&g.emit("verified",l)});return g}e.exports.Sd=function(e,t){const r=(t=l(t)).algorithms,n=t.options&&t.options.length?"?"+t.options.join("?"):"";return r.reduce((r,o)=>{const i=A.createHash(o).update(e).digest("base64"),s=new u(`${o}-${i}${n}`,t);if(s.algorithm&&s.digest){const e=s.algorithm;r[e]||(r[e]=[]),r[e].push(s)}return r},new h)};const I=new Set(A.getHashes()),E=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(e=>I.has(e));function B(e,t){return E.indexOf(e.toLowerCase())>=E.indexOf(t.toLowerCase())?e:t}},69538:(e,t,r)=>{"use strict";var A=r(13499).Buffer,n=A.isEncoding||function(e){switch((e=""+e)&&e.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function o(e){var t;switch(this.encoding=function(e){var t=function(e){if(!e)return"utf8";for(var t;;)switch(e){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return e;default:if(t)return;e=(""+e).toLowerCase(),t=!0}}(e);if("string"!=typeof t&&(A.isEncoding===n||!n(e)))throw new Error("Unknown encoding: "+e);return t||e}(e),this.encoding){case"utf16le":this.text=a,this.end=c,t=4;break;case"utf8":this.fillLast=s,t=4;break;case"base64":this.text=g,this.end=l,t=3;break;default:return this.write=u,void(this.end=h)}this.lastNeed=0,this.lastTotal=0,this.lastChar=A.allocUnsafe(t)}function i(e){return e<=127?0:e>>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function s(e){var t=this.lastTotal-this.lastNeed,r=function(e,t,r){if(128!=(192&t[0]))return e.lastNeed=0,"�";if(e.lastNeed>1&&t.length>1){if(128!=(192&t[1]))return e.lastNeed=1,"�";if(e.lastNeed>2&&t.length>2&&128!=(192&t[2]))return e.lastNeed=2,"�"}}(this,e);return void 0!==r?r:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function a(e,t){if((e.length-t)%2==0){var r=e.toString("utf16le",t);if(r){var A=r.charCodeAt(r.length-1);if(A>=55296&&A<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString("utf16le",t,e.length-1)}function c(e){var t=e&&e.length?this.write(e):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return t+this.lastChar.toString("utf16le",0,r)}return t}function g(e,t){var r=(e.length-t)%3;return 0===r?e.toString("base64",t):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString("base64",t,e.length-r))}function l(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function u(e){return e.toString(this.encoding)}function h(e){return e&&e.length?this.write(e):""}t.s=o,o.prototype.write=function(e){if(0===e.length)return"";var t,r;if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r=0)return n>0&&(e.lastNeed=n-1),n;if(--A=0)return n>0&&(e.lastNeed=n-2),n;if(--A=0)return n>0&&(2===n?n=0:e.lastNeed=n-3),n;return 0}(this,e,t);if(!this.lastNeed)return e.toString("utf8",t);this.lastTotal=r;var A=e.length-(r-this.lastNeed);return e.copy(this.lastChar,0,A),e.toString("utf8",t,A)},o.prototype.fillLast=function(e){if(this.lastNeed<=e.length)return e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,e.length),this.lastNeed-=e.length}},59428:(e,t,r)=>{"use strict";const A=r(12087),n=r(33867),o=r(72918),{env:i}=process;let s;function a(e){return 0!==e&&{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function c(e,t){if(0===s)return 0;if(o("color=16m")||o("color=full")||o("color=truecolor"))return 3;if(o("color=256"))return 2;if(e&&!t&&void 0===s)return 0;const r=s||0;if("dumb"===i.TERM)return r;if("win32"===process.platform){const e=A.release().split(".");return Number(e[0])>=10&&Number(e[2])>=10586?Number(e[2])>=14931?3:2:1}if("CI"in i)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(e=>e in i)||"codeship"===i.CI_NAME?1:r;if("TEAMCITY_VERSION"in i)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(i.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in i)return 1;if("truecolor"===i.COLORTERM)return 3;if("TERM_PROGRAM"in i){const e=parseInt((i.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(i.TERM_PROGRAM){case"iTerm.app":return e>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(i.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(i.TERM)||"COLORTERM"in i?1:r}o("no-color")||o("no-colors")||o("color=false")||o("color=never")?s=0:(o("color")||o("colors")||o("color=true")||o("color=always"))&&(s=1),"FORCE_COLOR"in i&&(s="true"===i.FORCE_COLOR?1:"false"===i.FORCE_COLOR?0:0===i.FORCE_COLOR.length?1:Math.min(parseInt(i.FORCE_COLOR,10),3)),e.exports={supportsColor:function(e){return a(c(e,e&&e.isTTY))},stdout:a(c(!0,n.isatty(1))),stderr:a(c(!0,n.isatty(2)))}},93255:e=>{"use strict";function t(e){return Array.prototype.slice.apply(e)}function r(e){this.status="pending",this._continuations=[],this._parent=null,this._paused=!1,e&&e.call(this,this._continueWith.bind(this),this._failWith.bind(this))}function A(e){return e&&"function"==typeof e.then}function n(e){return e}if(r.prototype={then:function(e,t){var n=r.unresolved()._setParent(this);if(this._isRejected()){if(this._paused)return this._continuations.push({promise:n,nextFn:e,catchFn:t}),n;if(t)try{var o=t(this._error);return A(o)?(this._chainPromiseData(o,n),n):r.resolve(o)._setParent(this)}catch(e){return r.reject(e)._setParent(this)}return r.reject(this._error)._setParent(this)}return this._continuations.push({promise:n,nextFn:e,catchFn:t}),this._runResolutions(),n},catch:function(e){if(this._isResolved())return r.resolve(this._data)._setParent(this);var t=r.unresolved()._setParent(this);return this._continuations.push({promise:t,catchFn:e}),this._runRejections(),t},finally:function(e){var t=!1;function r(r,o){if(!t){t=!0,e||(e=n);var i=e(r);return A(i)?i.then((function(){if(o)throw o;return r})):r}}return this.then((function(e){return r(e)})).catch((function(e){return r(null,e)}))},pause:function(){return this._paused=!0,this},resume:function(){var e=this._findFirstPaused();return e&&(e._paused=!1,e._runResolutions(),e._runRejections()),this},_findAncestry:function(){return this._continuations.reduce((function(e,t){if(t.promise){var r={promise:t.promise,children:t.promise._findAncestry()};e.push(r)}return e}),[])},_setParent:function(e){if(this._parent)throw new Error("parent already set");return this._parent=e,this},_continueWith:function(e){var t=this._findFirstPending();t&&(t._data=e,t._setResolved())},_findFirstPending:function(){return this._findFirstAncestor((function(e){return e._isPending&&e._isPending()}))},_findFirstPaused:function(){return this._findFirstAncestor((function(e){return e._paused}))},_findFirstAncestor:function(e){for(var t,r=this;r;)e(r)&&(t=r),r=r._parent;return t},_failWith:function(e){var t=this._findFirstPending();t&&(t._error=e,t._setRejected())},_takeContinuations:function(){return this._continuations.splice(0,this._continuations.length)},_runRejections:function(){if(!this._paused&&this._isRejected()){var e=this._error,t=this._takeContinuations(),r=this;t.forEach((function(t){if(t.catchFn)try{var A=t.catchFn(e);r._handleUserFunctionResult(A,t.promise)}catch(e){t.promise.reject(e)}else t.promise.reject(e)}))}},_runResolutions:function(){if(!this._paused&&this._isResolved()&&!this._isPending()){var e=this._takeContinuations();if(A(this._data))return this._handleWhenResolvedDataIsPromise(this._data);var t=this._data,r=this;e.forEach((function(e){if(e.nextFn)try{var A=e.nextFn(t);r._handleUserFunctionResult(A,e.promise)}catch(t){r._handleResolutionError(t,e)}else e.promise&&e.promise.resolve(t)}))}},_handleResolutionError:function(e,t){if(this._setRejected(),t.catchFn)try{return void t.catchFn(e)}catch(t){e=t}t.promise&&t.promise.reject(e)},_handleWhenResolvedDataIsPromise:function(e){var t=this;return e.then((function(e){t._data=e,t._runResolutions()})).catch((function(e){t._error=e,t._setRejected(),t._runRejections()}))},_handleUserFunctionResult:function(e,t){A(e)?this._chainPromiseData(e,t):t.resolve(e)},_chainPromiseData:function(e,t){e.then((function(e){t.resolve(e)})).catch((function(e){t.reject(e)}))},_setResolved:function(){this.status="resolved",this._paused||this._runResolutions()},_setRejected:function(){this.status="rejected",this._paused||this._runRejections()},_isPending:function(){return"pending"===this.status},_isResolved:function(){return"resolved"===this.status},_isRejected:function(){return"rejected"===this.status}},r.resolve=function(e){return new r((function(t,r){A(e)?e.then((function(e){t(e)})).catch((function(e){r(e)})):t(e)}))},r.reject=function(e){return new r((function(t,r){r(e)}))},r.unresolved=function(){return new r((function(e,t){this.resolve=e,this.reject=t}))},r.all=function(){var e=t(arguments);return Array.isArray(e[0])&&(e=e[0]),e.length?new r((function(t,A){var n=[],o=0,i=!1;e.forEach((function(s,a){r.resolve(s).then((function(r){n[a]=r,(o+=1)===e.length&&t(n)})).catch((function(e){!function(e){i||(i=!0,A(e))}(e)}))}))})):r.resolve([])},Promise===r)throw new Error("Please use SynchronousPromise.installGlobally() to install globally");var o=Promise;r.installGlobally=function(e){if(Promise===r)return e;var A=function(e){if(void 0===e||e.__patched)return e;var r=e;return(e=function(){r.apply(this,t(arguments))}).__patched=!0,e}(e);return Promise=r,A},r.uninstallGlobally=function(){Promise===r&&(Promise=o)},e.exports={SynchronousPromise:r}},75799:(e,t,r)=>{var A=r(31669),n=r(73975),o=r(77686),i=r(86897).Writable,s=r(86897).PassThrough,a=function(){},c=function(e){return(e&=511)&&512-e},g=function(e,t){this._parent=e,this.offset=t,s.call(this)};A.inherits(g,s),g.prototype.destroy=function(e){this._parent.destroy(e)};var l=function(e){if(!(this instanceof l))return new l(e);i.call(this,e),e=e||{},this._offset=0,this._buffer=n(),this._missing=0,this._partial=!1,this._onparse=a,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var t=this,r=t._buffer,A=function(){t._continue()},s=function(e){if(t._locked=!1,e)return t.destroy(e);t._stream||A()},u=function(){t._stream=null;var e=c(t._header.size);e?t._parse(e,h):t._parse(512,I),t._locked||A()},h=function(){t._buffer.consume(c(t._header.size)),t._parse(512,I),A()},p=function(){var e=t._header.size;t._paxGlobal=o.decodePax(r.slice(0,e)),r.consume(e),u()},d=function(){var e=t._header.size;t._pax=o.decodePax(r.slice(0,e)),t._paxGlobal&&(t._pax=Object.assign({},t._paxGlobal,t._pax)),r.consume(e),u()},C=function(){var A=t._header.size;this._gnuLongPath=o.decodeLongPath(r.slice(0,A),e.filenameEncoding),r.consume(A),u()},f=function(){var A=t._header.size;this._gnuLongLinkPath=o.decodeLongPath(r.slice(0,A),e.filenameEncoding),r.consume(A),u()},I=function(){var n,i=t._offset;try{n=t._header=o.decode(r.slice(0,512),e.filenameEncoding)}catch(e){t.emit("error",e)}return r.consume(512),n?"gnu-long-path"===n.type?(t._parse(n.size,C),void A()):"gnu-long-link-path"===n.type?(t._parse(n.size,f),void A()):"pax-global-header"===n.type?(t._parse(n.size,p),void A()):"pax-header"===n.type?(t._parse(n.size,d),void A()):(t._gnuLongPath&&(n.name=t._gnuLongPath,t._gnuLongPath=null),t._gnuLongLinkPath&&(n.linkname=t._gnuLongLinkPath,t._gnuLongLinkPath=null),t._pax&&(t._header=n=function(e,t){return t.path&&(e.name=t.path),t.linkpath&&(e.linkname=t.linkpath),t.size&&(e.size=parseInt(t.size,10)),e.pax=t,e}(n,t._pax),t._pax=null),t._locked=!0,n.size&&"directory"!==n.type?(t._stream=new g(t,i),t.emit("entry",n,t._stream,s),t._parse(n.size,u),void A()):(t._parse(512,I),void t.emit("entry",n,function(e,t){var r=new g(e,t);return r.end(),r}(t,i),s))):(t._parse(512,I),void A())};this._onheader=I,this._parse(512,I)};A.inherits(l,i),l.prototype.destroy=function(e){this._destroyed||(this._destroyed=!0,e&&this.emit("error",e),this.emit("close"),this._stream&&this._stream.emit("close"))},l.prototype._parse=function(e,t){this._destroyed||(this._offset+=e,this._missing=e,t===this._onheader&&(this._partial=!1),this._onparse=t)},l.prototype._continue=function(){if(!this._destroyed){var e=this._cb;this._cb=a,this._overflow?this._write(this._overflow,void 0,e):e()}},l.prototype._write=function(e,t,r){if(!this._destroyed){var A=this._stream,n=this._buffer,o=this._missing;if(e.length&&(this._partial=!0),e.lengtho&&(i=e.slice(o),e=e.slice(0,o)),A?A.end(e):n.append(e),this._overflow=i,this._onparse()}},l.prototype._final=function(e){if(this._partial)return this.destroy(new Error("Unexpected end of data"));e()},e.exports=l},77686:(e,t)=>{var r=Buffer.alloc,A="0".charCodeAt(0),n=parseInt("7777",8),o=function(e,t,r,A){for(;rt?"7777777777777777777".slice(0,t)+" ":"0000000000000000000".slice(0,t-e.length)+e+" "};var a=function(e,t,r){if(128&(e=e.slice(t,t+r))[t=0])return function(e){var t;if(128===e[0])t=!0;else{if(255!==e[0])return null;t=!1}for(var r=!1,A=[],n=e.length-1;n>0;n--){var o=e[n];t?A.push(o):r&&0===o?A.push(0):r?(r=!1,A.push(256-o)):A.push(255-o)}var i=0,s=A.length;for(n=0;n=i?i:n>=0||(n+=i)>=0?n:0);t=Math.pow(10,r)&&r++,t+r+e};t.decodeLongPath=function(e,t){return c(e,0,e.length,t)},t.encodePax=function(e){var t="";e.name&&(t+=g(" path="+e.name+"\n")),e.linkname&&(t+=g(" linkpath="+e.linkname+"\n"));var r=e.pax;if(r)for(var A in r)t+=g(" "+A+"="+r[A]+"\n");return Buffer.from(t)},t.decodePax=function(e){for(var t={};e.length;){for(var r=0;r100;){var c=o.indexOf("/");if(-1===c)return null;a+=a?"/"+o.slice(0,c):o.slice(0,c),o=o.slice(c+1)}return Buffer.byteLength(o)>100||Buffer.byteLength(a)>155||e.linkname&&Buffer.byteLength(e.linkname)>100?null:(t.write(o),t.write(s(e.mode&n,6),100),t.write(s(e.uid,6),108),t.write(s(e.gid,6),116),t.write(s(e.size,11),124),t.write(s(e.mtime.getTime()/1e3|0,11),136),t[156]=A+function(e){switch(e){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0}(e.type),e.linkname&&t.write(e.linkname,157),t.write("ustar\x0000",257),e.uname&&t.write(e.uname,265),e.gname&&t.write(e.gname,297),t.write(s(e.devmajor||0,6),329),t.write(s(e.devminor||0,6),337),a&&t.write(a,345),t.write(s(i(t),6),148),t)},t.decode=function(e,t){var r=0===e[156]?0:e[156]-A,n=c(e,0,100,t),o=a(e,100,8),s=a(e,108,8),g=a(e,116,8),l=a(e,124,12),u=a(e,136,12),h=function(e){switch(e){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null}(r),p=0===e[157]?null:c(e,157,100,t),d=c(e,265,32),C=c(e,297,32),f=a(e,329,8),I=a(e,337,8);e[345]&&(n=c(e,345,155,t)+"/"+n),0===r&&n&&"/"===n[n.length-1]&&(r=5);var E=i(e);if(256===E)return null;if(E!==a(e,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");return{name:n,mode:o,uid:s,gid:g,size:l,mtime:new Date(1e3*u),type:h,linkname:p,uname:d,gname:C,devmajor:f,devminor:I}}},59938:(e,t,r)=>{t.extract=r(75799),t.pack=r(72203)},72203:(e,t,r)=>{var A=r(13302),n=r(17067),o=r(85870),i=Buffer.alloc,s=r(86897).Readable,a=r(86897).Writable,c=r(24304).StringDecoder,g=r(77686),l=parseInt("755",8),u=parseInt("644",8),h=i(1024),p=function(){},d=function(e,t){(t&=511)&&e.push(h.slice(0,512-t))};var C=function(e){a.call(this),this.written=0,this._to=e,this._destroyed=!1};o(C,a),C.prototype._write=function(e,t,r){if(this.written+=e.length,this._to.push(e))return r();this._to._drain=r},C.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var f=function(){a.call(this),this.linkname="",this._decoder=new c("utf-8"),this._destroyed=!1};o(f,a),f.prototype._write=function(e,t,r){this.linkname+=this._decoder.write(e),r()},f.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var I=function(){a.call(this),this._destroyed=!1};o(I,a),I.prototype._write=function(e,t,r){r(new Error("No body allowed for this entry"))},I.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var E=function(e){if(!(this instanceof E))return new E(e);s.call(this,e),this._drain=p,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};o(E,s),E.prototype.entry=function(e,t,r){if(this._stream)throw new Error("already piping an entry");if(!this._finalized&&!this._destroyed){"function"==typeof t&&(r=t,t=null),r||(r=p);var o=this;if(e.size&&"symlink"!==e.type||(e.size=0),e.type||(e.type=function(e){switch(e&A.S_IFMT){case A.S_IFBLK:return"block-device";case A.S_IFCHR:return"character-device";case A.S_IFDIR:return"directory";case A.S_IFIFO:return"fifo";case A.S_IFLNK:return"symlink"}return"file"}(e.mode)),e.mode||(e.mode="directory"===e.type?l:u),e.uid||(e.uid=0),e.gid||(e.gid=0),e.mtime||(e.mtime=new Date),"string"==typeof t&&(t=Buffer.from(t)),Buffer.isBuffer(t))return e.size=t.length,this._encode(e),this.push(t),d(o,e.size),process.nextTick(r),new I;if("symlink"===e.type&&!e.linkname){var i=new f;return n(i,(function(t){if(t)return o.destroy(),r(t);e.linkname=i.linkname,o._encode(e),r()})),i}if(this._encode(e),"file"!==e.type&&"contiguous-file"!==e.type)return process.nextTick(r),new I;var s=new C(this);return this._stream=s,n(s,(function(t){return o._stream=null,t?(o.destroy(),r(t)):s.written!==e.size?(o.destroy(),r(new Error("size mismatch"))):(d(o,e.size),o._finalizing&&o.finalize(),void r())})),s}},E.prototype.finalize=function(){this._stream?this._finalizing=!0:this._finalized||(this._finalized=!0,this.push(h),this.push(null))},E.prototype.destroy=function(e){this._destroyed||(this._destroyed=!0,e&&this.emit("error",e),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())},E.prototype._encode=function(e){if(!e.pax){var t=g.encode(e);if(t)return void this.push(t)}this._encodePax(e)},E.prototype._encodePax=function(e){var t=g.encodePax({name:e.name,linkname:e.linkname,pax:e.pax}),r={name:"PaxHeader",mode:e.mode,uid:e.uid,gid:e.gid,size:t.length,mtime:e.mtime,type:"pax-header",linkname:e.linkname&&"PaxHeader",uname:e.uname,gname:e.gname,devmajor:e.devmajor,devminor:e.devminor};this.push(g.encode(r)),this.push(t),d(this,t.length),r.size=e.size,r.type=e.type,this.push(g.encode(r))},E.prototype._read=function(e){var t=this._drain;this._drain=p,t()},e.exports=E},84615:(e,t,r)=>{"use strict"; +/*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + */const A=r(59235),n=(e,t,r)=>{if(!1===A(e))throw new TypeError("toRegexRange: expected the first argument to be a number");if(void 0===t||e===t)return String(e);if(!1===A(t))throw new TypeError("toRegexRange: expected the second argument to be a number.");let o={relaxZeros:!0,...r};"boolean"==typeof o.strictZeros&&(o.relaxZeros=!1===o.strictZeros);let a=e+":"+t+"="+String(o.relaxZeros)+String(o.shorthand)+String(o.capture)+String(o.wrap);if(n.cache.hasOwnProperty(a))return n.cache[a].result;let c=Math.min(e,t),g=Math.max(e,t);if(1===Math.abs(c-g)){let r=e+"|"+t;return o.capture?`(${r})`:!1===o.wrap?r:`(?:${r})`}let l=p(e)||p(t),u={min:e,max:t,a:c,b:g},h=[],d=[];if(l&&(u.isPadded=l,u.maxLen=String(u.max).length),c<0){d=i(g<0?Math.abs(g):1,Math.abs(c),u,o),c=u.a=0}return g>=0&&(h=i(c,g,u,o)),u.negatives=d,u.positives=h,u.result=function(e,t,r){let A=s(e,t,"-",!1,r)||[],n=s(t,e,"",!1,r)||[],o=s(e,t,"-?",!0,r)||[];return A.concat(o).concat(n).join("|")}(d,h,o),!0===o.capture?u.result=`(${u.result})`:!1!==o.wrap&&h.length+d.length>1&&(u.result=`(?:${u.result})`),n.cache[a]=u,u.result};function o(e,t,r){if(e===t)return{pattern:e,count:[],digits:0};let A=function(e,t){let r=[];for(let A=0;A1&&n.count.pop(),n.count.push(a.count[0]),n.string=n.pattern+u(n.count),c=t+1)}return s}function s(e,t,r,A,n){let o=[];for(let n of e){let{string:e}=n;A||c(t,"string",e)||o.push(r+e),A&&c(t,"string",e)&&o.push(r+e)}return o}function a(e,t){return e>t?1:t>e?-1:0}function c(e,t,r){return e.some(e=>e[t]===r)}function g(e,t){return Number(String(e).slice(0,-t)+"9".repeat(t))}function l(e,t){return e-e%Math.pow(10,t)}function u(e){let[t=0,r=""]=e;return r||t>1?`{${t+(r?","+r:"")}}`:""}function h(e,t,r){return`[${e}${t-e==1?"":"-"}${t}]`}function p(e){return/^-?(0+)\d/.test(e)}function d(e,t,r){if(!t.isPadded)return e;let A=Math.abs(t.maxLen-String(e).length),n=!1!==r.relaxZeros;switch(A){case 0:return"";case 1:return n?"0?":"0";case 2:return n?"0{0,2}":"00";default:return n?`0{0,${A}}`:`0{${A}}`}}n.cache={},n.clearCache=()=>n.cache={},e.exports=n},75158:e=>{function t(e,t){var r=e.length,A=new Array(r),n={},o=r,i=function(e){for(var t=new Map,r=0,A=e.length;r0&&(n.forEach((function(e,t){t>0&&(g+=(e[1]?" ":"│")+" "),c||e[0]!==r||(c=!0)})),g+=function(e,t){var r=t?"â””":"├";return r+=e?"─ ":"──â”"}(t,A)+t,o&&("object"!=typeof r||r instanceof Date)&&(g+=": "+r),c&&(g+=" (circular ref.)"),s(g)),!c&&"object"==typeof r){var h=function(e,t){var r=[];for(var A in e)e.hasOwnProperty(A)&&(t&&"function"==typeof e[A]||r.push(A));return r}(r,i);h.forEach((function(t){a=++l===h.length,e(t,r[t],a,u,o,i,s)}))}}var t={asLines:function(t,r,A,n){e(".",t,!1,[],r,"function"!=typeof A&&A,n||A)},asTree:function(t,r,A){var n="";return e(".",t,!1,[],r,A,(function(e){n+=e+"\n"})),n}};return t}()},36370:(e,t,r)=>{"use strict";r.d(t,{gn:()=>A});function A(e,t,r,A){var n,o=arguments.length,i=o<3?t:null===A?A=Object.getOwnPropertyDescriptor(t,r):A;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,A);else for(var s=e.length-1;s>=0;s--)(n=e[s])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}},98161:(e,t,r)=>{e.exports=r(69876)},69876:(e,t,r)=>{"use strict";r(11631);var A,n=r(4016),o=r(98605),i=r(57211),s=r(28614),a=(r(42357),r(31669));function c(e){var t=this;t.options=e||{},t.proxyOptions=t.options.proxy||{},t.maxSockets=t.options.maxSockets||o.Agent.defaultMaxSockets,t.requests=[],t.sockets=[],t.on("free",(function(e,r,A,n){for(var o=l(r,A,n),i=0,s=t.requests.length;i=this.maxSockets?n.requests.push(o):n.createSocket(o,(function(t){function r(){n.emit("free",t,o)}function A(e){n.removeSocket(t),t.removeListener("free",r),t.removeListener("close",A),t.removeListener("agentRemove",A)}t.on("free",r),t.on("close",A),t.on("agentRemove",A),e.onSocket(t)}))},c.prototype.createSocket=function(e,t){var r=this,n={};r.sockets.push(n);var o=u({},r.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(o.localAddress=e.localAddress),o.proxyAuth&&(o.headers=o.headers||{},o.headers["Proxy-Authorization"]="Basic "+new Buffer(o.proxyAuth).toString("base64")),A("making CONNECT request");var i=r.request(o);function s(o,s,a){var c;return i.removeAllListeners(),s.removeAllListeners(),200!==o.statusCode?(A("tunneling socket could not be established, statusCode=%d",o.statusCode),s.destroy(),(c=new Error("tunneling socket could not be established, statusCode="+o.statusCode)).code="ECONNRESET",e.request.emit("error",c),void r.removeSocket(n)):a.length>0?(A("got illegal response body from proxy"),s.destroy(),(c=new Error("got illegal response body from proxy")).code="ECONNRESET",e.request.emit("error",c),void r.removeSocket(n)):(A("tunneling connection has established"),r.sockets[r.sockets.indexOf(n)]=s,t(s))}i.useChunkedEncodingByDefault=!1,i.once("response",(function(e){e.upgrade=!0})),i.once("upgrade",(function(e,t,r){process.nextTick((function(){s(e,t,r)}))})),i.once("connect",s),i.once("error",(function(t){i.removeAllListeners(),A("tunneling socket could not be established, cause=%s\n",t.message,t.stack);var o=new Error("tunneling socket could not be established, cause="+t.message);o.code="ECONNRESET",e.request.emit("error",o),r.removeSocket(n)})),i.end()},c.prototype.removeSocket=function(e){var t=this.sockets.indexOf(e);if(-1!==t){this.sockets.splice(t,1);var r=this.requests.shift();r&&this.createSocket(r,(function(e){r.request.onSocket(e)}))}},A=process.env.NODE_DEBUG&&/\btunnel\b/.test(process.env.NODE_DEBUG)?function(){var e=Array.prototype.slice.call(arguments);"string"==typeof e[0]?e[0]="TUNNEL: "+e[0]:e.unshift("TUNNEL:"),console.error.apply(console,e)}:function(){}},73212:(e,t,r)=>{e.exports=r(31669).deprecate},87945:(e,t,r)=>{const A="win32"===process.platform||"cygwin"===process.env.OSTYPE||"msys"===process.env.OSTYPE,n=r(85622),o=A?";":":",i=r(64151),s=e=>Object.assign(new Error("not found: "+e),{code:"ENOENT"}),a=(e,t)=>{const r=t.colon||o,n=e.match(/\//)||A&&e.match(/\\/)?[""]:[...A?[process.cwd()]:[],...(t.path||process.env.PATH||"").split(r)],i=A?t.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=A?i.split(r):[""];return A&&-1!==e.indexOf(".")&&""!==s[0]&&s.unshift(""),{pathEnv:n,pathExt:s,pathExtExe:i}},c=(e,t,r)=>{"function"==typeof t&&(r=t,t={}),t||(t={});const{pathEnv:A,pathExt:o,pathExtExe:c}=a(e,t),g=[],l=r=>new Promise((o,i)=>{if(r===A.length)return t.all&&g.length?o(g):i(s(e));const a=A[r],c=/^".*"$/.test(a)?a.slice(1,-1):a,l=n.join(c,e),h=!c&&/^\.[\\\/]/.test(e)?e.slice(0,2)+l:l;o(u(h,r,0))}),u=(e,r,A)=>new Promise((n,s)=>{if(A===o.length)return n(l(r+1));const a=o[A];i(e+a,{pathExt:c},(o,i)=>{if(!o&&i){if(!t.all)return n(e+a);g.push(e+a)}return n(u(e,r,A+1))})});return r?l(0).then(e=>r(null,e),r):l(0)};e.exports=c,c.sync=(e,t)=>{t=t||{};const{pathEnv:r,pathExt:A,pathExtExe:o}=a(e,t),c=[];for(let s=0;s{e.exports=function e(t,r){if(t&&r)return e(t)(r);if("function"!=typeof t)throw new TypeError("need wrapper function");return Object.keys(t).forEach((function(e){A[e]=t[e]})),A;function A(){for(var e=new Array(arguments.length),r=0;r{"use strict";var A=r(60087);t.__esModule=!0,t.default=void 0;var n=A(r(15215)),o=A(r(11050)),i=function(){function e(e,t){if(this.refs=e,"function"!=typeof t){if(!(0,n.default)(t,"is"))throw new TypeError("`is:` is required for `when()` conditions");if(!t.then&&!t.otherwise)throw new TypeError("either `then:` or `otherwise:` is required for `when()` conditions");var r=t.is,A=t.then,o=t.otherwise,i="function"==typeof r?r:function(){for(var e=arguments.length,t=new Array(e),A=0;A{"use strict";var A=r(60087);t.__esModule=!0,t.default=void 0;var n=A(r(11050)),o=function(){function e(e){this._resolve=function(t,r){var A=e(t,r);if(!(0,n.default)(A))throw new TypeError("lazy() functions must return a valid schema");return A.resolve(r)}}var t=e.prototype;return t.resolve=function(e){return this._resolve(e.value,e)},t.cast=function(e,t){return this._resolve(e,t).cast(e,t)},t.validate=function(e,t){return this._resolve(e,t).validate(e,t)},t.validateSync=function(e,t){return this._resolve(e,t).validateSync(e,t)},t.validateAt=function(e,t,r){return this._resolve(t,r).validateAt(e,t,r)},t.validateSyncAt=function(e,t,r){return this._resolve(t,r).validateSyncAt(e,t,r)},e}();o.prototype.__isYupSchema__=!0;var i=o;t.default=i,e.exports=t.default},95814:(e,t,r)=>{"use strict";var A=r(60087);t.__esModule=!0,t.default=void 0;var n=A(r(72912)),o=r(79588),i="$",s=".",a=function(){function e(e,t){if(void 0===t&&(t={}),"string"!=typeof e)throw new TypeError("ref must be a string, got: "+e);if(this.key=e.trim(),""===e)throw new TypeError("ref must be a non-empty string");this.isContext=this.key[0]===i,this.isValue=this.key[0]===s,this.isSibling=!this.isContext&&!this.isValue;var r=this.isContext?i:this.isValue?s:"";this.path=this.key.slice(r.length),this.getter=this.path&&(0,o.getter)(this.path,!0),this.map=t.map}var t=e.prototype;return t.getValue=function(e){var t=this.isContext?e.context:this.isValue?e.value:e.parent;return this.getter&&(t=this.getter(t||{})),this.map&&(t=this.map(t)),t},t.cast=function(e,t){return this.getValue((0,n.default)({},t,{value:e}))},t.resolve=function(){return this},t.describe=function(){return{type:"ref",key:this.key}},t.toString=function(){return"Ref("+this.key+")"},e.isRef=function(e){return e&&e.__isYupRef},e}();t.default=a,a.prototype.__isYupRef=!0,e.exports=t.default},40828:(e,t,r)=>{"use strict";var A=r(60087);t.__esModule=!0,t.default=s;var n=A(r(21043)),o=/\$\{\s*(\w+)\s*\}/g,i=function(e){return function(t){return e.replace(o,(function(e,r){return(0,n.default)(t[r])}))}};function s(e,t,r,A){var n=this;this.name="ValidationError",this.value=t,this.path=r,this.type=A,this.errors=[],this.inner=[],e&&[].concat(e).forEach((function(e){n.errors=n.errors.concat(e.errors||e),e.inner&&(n.inner=n.inner.concat(e.inner.length?e.inner:e))})),this.message=this.errors.length>1?this.errors.length+" errors occurred":this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,s)}s.prototype=Object.create(Error.prototype),s.prototype.constructor=s,s.isError=function(e){return e&&"ValidationError"===e.name},s.formatError=function(e,t){"string"==typeof e&&(e=i(e));var r=function(t){return t.path=t.label||t.path||"this","function"==typeof e?e(t):e};return 1===arguments.length?r:r(t)},e.exports=t.default},18830:(e,t,r)=>{"use strict";var A=r(19228),n=r(60087);t.__esModule=!0,t.default=void 0;var o=n(r(72912)),i=n(r(62407)),s=n(r(31490)),a=n(r(71665)),c=n(r(11050)),g=n(r(7045)),l=n(r(21043)),u=n(r(16434)),h=r(63802),p=A(r(80180));function d(){var e=(0,i.default)(["","[","]"]);return d=function(){return e},e}var C=f;function f(e){var t=this;if(!(this instanceof f))return new f(e);u.default.call(this,{type:"array"}),this._subType=void 0,this.withMutation((function(){t.transform((function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e=null}return this.isType(e)?e:null})),e&&t.of(e)}))}t.default=C,(0,s.default)(f,u.default,{_typeCheck:function(e){return Array.isArray(e)},_cast:function(e,t){var r=this,A=u.default.prototype._cast.call(this,e,t);if(!this._typeCheck(A)||!this._subType)return A;var n=!1,o=A.map((function(e){var A=r._subType.cast(e,t);return A!==e&&(n=!0),A}));return n?o:A},_validate:function(e,t){var r=this;void 0===t&&(t={});var A=[],n=t.sync,i=t.path,s=this._subType,a=this._option("abortEarly",t),c=this._option("recursive",t),l=null!=t.originalValue?t.originalValue:e;return u.default.prototype._validate.call(this,e,t).catch((0,p.propagateErrors)(a,A)).then((function(e){if(!c||!s||!r._typeCheck(e)){if(A.length)throw A[0];return e}l=l||e;var u=e.map((function(r,A){var n=(0,g.default)(d(),t.path,A),i=(0,o.default)({},t,{path:n,strict:!0,parent:e,originalValue:l[A]});return!s.validate||s.validate(r,i)}));return(0,p.default)({sync:n,path:i,value:e,errors:A,endEarly:a,validations:u})}))},_isPresent:function(e){return u.default.prototype._cast.call(this,e)&&e.length>0},of:function(e){var t=this.clone();if(!1!==e&&!(0,c.default)(e))throw new TypeError("`array.of()` sub-schema must be a valid yup schema, or `false` to negate a current sub-schema. not: "+(0,l.default)(e));return t._subType=e,t},min:function(e,t){return t=t||h.array.min,this.test({message:t,name:"min",exclusive:!0,params:{min:e},test:function(t){return(0,a.default)(t)||t.length>=this.resolve(e)}})},max:function(e,t){return t=t||h.array.max,this.test({message:t,name:"max",exclusive:!0,params:{max:e},test:function(t){return(0,a.default)(t)||t.length<=this.resolve(e)}})},ensure:function(){var e=this;return this.default((function(){return[]})).transform((function(t){return e.isType(t)?t:null===t?[]:[].concat(t)}))},compact:function(e){var t=e?function(t,r,A){return!e(t,r,A)}:function(e){return!!e};return this.transform((function(e){return null!=e?e.filter(t):e}))},describe:function(){var e=u.default.prototype.describe.call(this);return this._subType&&(e.innerType=this._subType.describe()),e}}),e.exports=t.default},76595:(e,t,r)=>{"use strict";var A=r(60087);t.__esModule=!0,t.default=void 0;var n=A(r(31490)),o=A(r(16434)),i=s;function s(){var e=this;if(!(this instanceof s))return new s;o.default.call(this,{type:"boolean"}),this.withMutation((function(){e.transform((function(e){if(!this.isType(e)){if(/^(true|1)$/i.test(e))return!0;if(/^(false|0)$/i.test(e))return!1}return e}))}))}t.default=i,(0,n.default)(s,o.default,{_typeCheck:function(e){return e instanceof Boolean&&(e=e.valueOf()),"boolean"==typeof e}}),e.exports=t.default},41755:(e,t,r)=>{"use strict";var A=r(60087);t.__esModule=!0,t.default=void 0;var n=A(r(16434)),o=A(r(31490)),i=A(r(76813)),s=r(63802),a=A(r(71665)),c=A(r(95814)),g=new Date(""),l=u;function u(){var e=this;if(!(this instanceof u))return new u;n.default.call(this,{type:"date"}),this.withMutation((function(){e.transform((function(e){return this.isType(e)?e:(e=(0,i.default)(e))?new Date(e):g}))}))}t.default=l,(0,o.default)(u,n.default,{_typeCheck:function(e){return t=e,"[object Date]"===Object.prototype.toString.call(t)&&!isNaN(e.getTime());var t},min:function(e,t){void 0===t&&(t=s.date.min);var r=e;if(!c.default.isRef(r)&&(r=this.cast(e),!this._typeCheck(r)))throw new TypeError("`min` must be a Date or a value that can be `cast()` to a Date");return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test:function(e){return(0,a.default)(e)||e>=this.resolve(r)}})},max:function(e,t){void 0===t&&(t=s.date.max);var r=e;if(!c.default.isRef(r)&&(r=this.cast(e),!this._typeCheck(r)))throw new TypeError("`max` must be a Date or a value that can be `cast()` to a Date");return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test:function(e){return(0,a.default)(e)||e<=this.resolve(r)}})}}),e.exports=t.default},15966:(e,t,r)=>{"use strict";var A=r(60087);t.__esModule=!0,t.addMethod=function(e,t,r){if(!e||!(0,d.default)(e.prototype))throw new TypeError("You must provide a yup schema constructor function");if("string"!=typeof t)throw new TypeError("A Method name must be provided");if("function"!=typeof r)throw new TypeError("Method function must be provided");e.prototype[t]=r},t.lazy=t.ref=t.boolean=void 0;var n=A(r(16434));t.mixed=n.default;var o=A(r(76595));t.bool=o.default;var i=A(r(45167));t.string=i.default;var s=A(r(72068));t.number=s.default;var a=A(r(41755));t.date=a.default;var c=A(r(51727));t.object=c.default;var g=A(r(18830));t.array=g.default;var l=A(r(95814)),u=A(r(6856)),h=A(r(40828));t.ValidationError=h.default;var p=A(r(43910));t.reach=p.default;var d=A(r(11050));t.isSchema=d.default;var C=A(r(24280));t.setLocale=C.default;var f=o.default;t.boolean=f;t.ref=function(e,t){return new l.default(e,t)};t.lazy=function(e){return new u.default(e)}},63802:(e,t,r)=>{"use strict";var A=r(60087);t.__esModule=!0,t.default=t.array=t.object=t.boolean=t.date=t.number=t.string=t.mixed=void 0;var n=A(r(21043)),o={default:"${path} is invalid",required:"${path} is a required field",oneOf:"${path} must be one of the following values: ${values}",notOneOf:"${path} must not be one of the following values: ${values}",notType:function(e){var t=e.path,r=e.type,A=e.value,o=e.originalValue,i=null!=o&&o!==A,s=t+" must be a `"+r+"` type, but the final value was: `"+(0,n.default)(A,!0)+"`"+(i?" (cast from the value `"+(0,n.default)(o,!0)+"`).":".");return null===A&&(s+='\n If "null" is intended as an empty value be sure to mark the schema as `.nullable()`'),s}};t.mixed=o;var i={length:"${path} must be exactly ${length} characters",min:"${path} must be at least ${min} characters",max:"${path} must be at most ${max} characters",matches:'${path} must match the following: "${regex}"',email:"${path} must be a valid email",url:"${path} must be a valid URL",trim:"${path} must be a trimmed string",lowercase:"${path} must be a lowercase string",uppercase:"${path} must be a upper case string"};t.string=i;var s={min:"${path} must be greater than or equal to ${min}",max:"${path} must be less than or equal to ${max}",lessThan:"${path} must be less than ${less}",moreThan:"${path} must be greater than ${more}",notEqual:"${path} must be not equal to ${notEqual}",positive:"${path} must be a positive number",negative:"${path} must be a negative number",integer:"${path} must be an integer"};t.number=s;var a={min:"${path} field must be later than ${min}",max:"${path} field must be at earlier than ${max}"};t.date=a;var c={};t.boolean=c;var g={noUnknown:"${path} field cannot have keys not specified in the object shape"};t.object=g;var l={min:"${path} field must have at least ${min} items",max:"${path} field must have less than or equal to ${max} items"};t.array=l;var u={mixed:o,string:i,number:s,date:a,object:g,array:l,boolean:c};t.default=u},16434:(e,t,r)=>{"use strict";var A=r(60087);t.__esModule=!0,t.default=I;var n=A(r(72912)),o=A(r(15215)),i=A(r(26052)),s=A(r(78700)),a=r(63802),c=A(r(94916)),g=A(r(80180)),l=A(r(22808)),u=A(r(11050)),h=A(r(54107)),p=A(r(21043)),d=A(r(95814)),C=r(43910),f=function(){function e(){this.list=new Set,this.refs=new Map}var t=e.prototype;return t.toArray=function(){return(0,s.default)(this.list).concat((0,s.default)(this.refs.values()))},t.add=function(e){d.default.isRef(e)?this.refs.set(e.key,e):this.list.add(e)},t.delete=function(e){d.default.isRef(e)?this.refs.delete(e.key,e):this.list.delete(e)},t.has=function(e,t){if(this.list.has(e))return!0;for(var r,A=this.refs.values();!(r=A.next()).done;)if(t(r.value)===e)return!0;return!1},e}();function I(e){var t=this;if(void 0===e&&(e={}),!(this instanceof I))return new I;this._deps=[],this._conditions=[],this._options={abortEarly:!0,recursive:!0},this._exclusive=Object.create(null),this._whitelist=new f,this._blacklist=new f,this.tests=[],this.transforms=[],this.withMutation((function(){t.typeError(a.mixed.notType)})),(0,o.default)(e,"default")&&(this._defaultDefault=e.default),this._type=e.type||"mixed"}for(var E=I.prototype={__isYupSchema__:!0,constructor:I,clone:function(){var e=this;return this._mutate?this:(0,i.default)(this,(function(t){if((0,u.default)(t)&&t!==e)return t}))},label:function(e){var t=this.clone();return t._label=e,t},meta:function(e){if(0===arguments.length)return this._meta;var t=this.clone();return t._meta=(0,n.default)(t._meta||{},e),t},withMutation:function(e){var t=this._mutate;this._mutate=!0;var r=e(this);return this._mutate=t,r},concat:function(e){if(!e||e===this)return this;if(e._type!==this._type&&"mixed"!==this._type)throw new TypeError("You cannot `concat()` schema's of different types: "+this._type+" and "+e._type);var t=(0,l.default)(e.clone(),this);return(0,o.default)(e,"_default")&&(t._default=e._default),t.tests=this.tests,t._exclusive=this._exclusive,t.withMutation((function(t){e.tests.forEach((function(e){t.test(e.OPTIONS)}))})),t},isType:function(e){return!(!this._nullable||null!==e)||(!this._typeCheck||this._typeCheck(e))},resolve:function(e){var t=this;if(t._conditions.length){var r=t._conditions;(t=t.clone())._conditions=[],t=(t=r.reduce((function(t,r){return r.resolve(t,e)}),t)).resolve(e)}return t},cast:function(e,t){void 0===t&&(t={});var r=this.resolve((0,n.default)({},t,{value:e})),A=r._cast(e,t);if(void 0!==e&&!1!==t.assert&&!0!==r.isType(A)){var o=(0,p.default)(e),i=(0,p.default)(A);throw new TypeError("The value of "+(t.path||"field")+' could not be cast to a value that satisfies the schema type: "'+r._type+'". \n\nattempted value: '+o+" \n"+(i!==o?"result of cast: "+i:""))}return A},_cast:function(e){var t=this,r=void 0===e?e:this.transforms.reduce((function(r,A){return A.call(t,r,e)}),e);return void 0===r&&(0,o.default)(this,"_default")&&(r=this.default()),r},_validate:function(e,t){var r=this;void 0===t&&(t={});var A=e,o=null!=t.originalValue?t.originalValue:e,i=this._option("strict",t),s=this._option("abortEarly",t),a=t.sync,c=t.path,l=this._label;i||(A=this._cast(A,(0,n.default)({assert:!1},t)));var u={value:A,path:c,schema:this,options:t,label:l,originalValue:o,sync:a},h=[];return this._typeError&&h.push(this._typeError(u)),this._whitelistError&&h.push(this._whitelistError(u)),this._blacklistError&&h.push(this._blacklistError(u)),(0,g.default)({validations:h,endEarly:s,value:A,path:c,sync:a}).then((function(e){return(0,g.default)({path:c,sync:a,value:e,endEarly:s,validations:r.tests.map((function(e){return e(u)}))})}))},validate:function(e,t){return void 0===t&&(t={}),this.resolve((0,n.default)({},t,{value:e}))._validate(e,t)},validateSync:function(e,t){var r,A;if(void 0===t&&(t={}),this.resolve((0,n.default)({},t,{value:e}))._validate(e,(0,n.default)({},t,{sync:!0})).then((function(e){return r=e})).catch((function(e){return A=e})),A)throw A;return r},isValid:function(e,t){return this.validate(e,t).then((function(){return!0})).catch((function(e){if("ValidationError"===e.name)return!1;throw e}))},isValidSync:function(e,t){try{return this.validateSync(e,t),!0}catch(e){if("ValidationError"===e.name)return!1;throw e}},getDefault:function(e){return void 0===e&&(e={}),this.resolve(e).default()},default:function(e){if(0===arguments.length){var t=(0,o.default)(this,"_default")?this._default:this._defaultDefault;return"function"==typeof t?t.call(this):(0,i.default)(t)}var r=this.clone();return r._default=e,r},strict:function(e){void 0===e&&(e=!0);var t=this.clone();return t._options.strict=e,t},_isPresent:function(e){return null!=e},required:function(e){return void 0===e&&(e=a.mixed.required),this.test({message:e,name:"required",exclusive:!0,test:function(e){return this.schema._isPresent(e)}})},notRequired:function(){var e=this.clone();return e.tests=e.tests.filter((function(e){return"required"!==e.OPTIONS.name})),e},nullable:function(e){void 0===e&&(e=!0);var t=this.clone();return t._nullable=e,t},transform:function(e){var t=this.clone();return t.transforms.push(e),t},test:function(){var e;if(void 0===(e=1===arguments.length?"function"==typeof(arguments.length<=0?void 0:arguments[0])?{test:arguments.length<=0?void 0:arguments[0]}:arguments.length<=0?void 0:arguments[0]:2===arguments.length?{name:arguments.length<=0?void 0:arguments[0],test:arguments.length<=1?void 0:arguments[1]}:{name:arguments.length<=0?void 0:arguments[0],message:arguments.length<=1?void 0:arguments[1],test:arguments.length<=2?void 0:arguments[2]}).message&&(e.message=a.mixed.default),"function"!=typeof e.test)throw new TypeError("`test` is a required parameters");var t=this.clone(),r=(0,h.default)(e),A=e.exclusive||e.name&&!0===t._exclusive[e.name];if(e.exclusive&&!e.name)throw new TypeError("Exclusive tests must provide a unique `name` identifying the test");return t._exclusive[e.name]=!!e.exclusive,t.tests=t.tests.filter((function(t){if(t.OPTIONS.name===e.name){if(A)return!1;if(t.OPTIONS.test===r.OPTIONS.test)return!1}return!0})),t.tests.push(r),t},when:function(e,t){1===arguments.length&&(t=e,e=".");var r=this.clone(),A=[].concat(e).map((function(e){return new d.default(e)}));return A.forEach((function(e){e.isSibling&&r._deps.push(e.key)})),r._conditions.push(new c.default(A,t)),r},typeError:function(e){var t=this.clone();return t._typeError=(0,h.default)({message:e,name:"typeError",test:function(e){return!(void 0!==e&&!this.schema.isType(e))||this.createError({params:{type:this.schema._type}})}}),t},oneOf:function(e,t){void 0===t&&(t=a.mixed.oneOf);var r=this.clone();return e.forEach((function(e){r._whitelist.add(e),r._blacklist.delete(e)})),r._whitelistError=(0,h.default)({message:t,name:"oneOf",test:function(e){if(void 0===e)return!0;var t=this.schema._whitelist;return!!t.has(e,this.resolve)||this.createError({params:{values:t.toArray().join(", ")}})}}),r},notOneOf:function(e,t){void 0===t&&(t=a.mixed.notOneOf);var r=this.clone();return e.forEach((function(e){r._blacklist.add(e),r._whitelist.delete(e)})),r._blacklistError=(0,h.default)({message:t,name:"notOneOf",test:function(e){var t=this.schema._blacklist;return!t.has(e,this.resolve)||this.createError({params:{values:t.toArray().join(", ")}})}}),r},strip:function(e){void 0===e&&(e=!0);var t=this.clone();return t._strip=e,t},_option:function(e,t){return(0,o.default)(t,e)?t[e]:this._options[e]},describe:function(){var e=this.clone();return{type:e._type,meta:e._meta,label:e._label,tests:e.tests.map((function(e){return{name:e.OPTIONS.name,params:e.OPTIONS.params}})).filter((function(e,t,r){return r.findIndex((function(t){return t.name===e.name}))===t}))}}},B=["validate","validateSync"],y=function(){var e=B[m];E[e+"At"]=function(t,r,A){void 0===A&&(A={});var o=(0,C.getIn)(this,t,r,A.context),i=o.parent,s=o.parentPath;return o.schema[e](i&&i[s],(0,n.default)({},A,{parent:i,path:t}))}},m=0;m{"use strict";var A=r(60087);t.__esModule=!0,t.default=c;var n=A(r(31490)),o=A(r(16434)),i=r(63802),s=A(r(71665)),a=function(e){return(0,s.default)(e)||e===(0|e)};function c(){var e=this;if(!(this instanceof c))return new c;o.default.call(this,{type:"number"}),this.withMutation((function(){e.transform((function(e){var t=e;if("string"==typeof t){if(""===(t=t.replace(/\s/g,"")))return NaN;t=+t}return this.isType(t)?t:parseFloat(t)}))}))}(0,n.default)(c,o.default,{_typeCheck:function(e){return e instanceof Number&&(e=e.valueOf()),"number"==typeof e&&!function(e){return e!=+e}(e)},min:function(e,t){return void 0===t&&(t=i.number.min),this.test({message:t,name:"min",exclusive:!0,params:{min:e},test:function(t){return(0,s.default)(t)||t>=this.resolve(e)}})},max:function(e,t){return void 0===t&&(t=i.number.max),this.test({message:t,name:"max",exclusive:!0,params:{max:e},test:function(t){return(0,s.default)(t)||t<=this.resolve(e)}})},lessThan:function(e,t){return void 0===t&&(t=i.number.lessThan),this.test({message:t,name:"max",exclusive:!0,params:{less:e},test:function(t){return(0,s.default)(t)||tthis.resolve(e)}})},positive:function(e){return void 0===e&&(e=i.number.positive),this.moreThan(0,e)},negative:function(e){return void 0===e&&(e=i.number.negative),this.lessThan(0,e)},integer:function(e){return void 0===e&&(e=i.number.integer),this.test({name:"integer",message:e,test:a})},truncate:function(){return this.transform((function(e){return(0,s.default)(e)?e:0|e}))},round:function(e){var t=["ceil","floor","round","trunc"];if("trunc"===(e=e&&e.toLowerCase()||"round"))return this.truncate();if(-1===t.indexOf(e.toLowerCase()))throw new TypeError("Only valid options for round() are: "+t.join(", "));return this.transform((function(t){return(0,s.default)(t)?t:Math[e](t)}))}}),e.exports=t.default},51727:(e,t,r)=>{"use strict";var A=r(19228),n=r(60087);t.__esModule=!0,t.default=w;var o=n(r(62407)),i=n(r(72912)),s=n(r(15215)),a=n(r(36494)),c=n(r(89170)),g=n(r(5253)),l=n(r(89612)),u=r(79588),h=n(r(16434)),p=r(63802),d=n(r(18417)),C=n(r(23316)),f=n(r(31490)),I=n(r(7045)),E=A(r(80180));function B(){var e=(0,o.default)(["",".",""]);return B=function(){return e},e}function y(){var e=(0,o.default)(["",".",""]);return y=function(){return e},e}var m=function(e){return"[object Object]"===Object.prototype.toString.call(e)};function w(e){var t=this;if(!(this instanceof w))return new w(e);h.default.call(this,{type:"object",default:function(){var e=this;if(this._nodes.length){var t={};return this._nodes.forEach((function(r){t[r]=e.fields[r].default?e.fields[r].default():void 0})),t}}}),this.fields=Object.create(null),this._nodes=[],this._excludedEdges=[],this.withMutation((function(){t.transform((function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e=null}return this.isType(e)?e:null})),e&&t.shape(e)}))}(0,f.default)(w,h.default,{_typeCheck:function(e){return m(e)||"function"==typeof e},_cast:function(e,t){var r=this;void 0===t&&(t={});var A=h.default.prototype._cast.call(this,e,t);if(void 0===A)return this.default();if(!this._typeCheck(A))return A;var n=this.fields,o=!0===this._option("stripUnknown",t),a=this._nodes.concat(Object.keys(A).filter((function(e){return-1===r._nodes.indexOf(e)}))),c={},g=(0,i.default)({},t,{parent:c,__validating:!1}),l=!1;return a.forEach((function(e){var r=n[e],i=(0,s.default)(A,e);if(r){var a,u=r._options&&r._options.strict;if(g.path=(0,I.default)(y(),t.path,e),g.value=A[e],!0===(r=r.resolve(g))._strip)return void(l=l||e in A);void 0!==(a=t.__validating&&u?A[e]:r.cast(A[e],g))&&(c[e]=a)}else i&&!o&&(c[e]=A[e]);c[e]!==A[e]&&(l=!0)})),l?c:A},_validate:function(e,t){var r,A,n=this;void 0===t&&(t={});var o=t.sync,s=[],a=null!=t.originalValue?t.originalValue:e;return r=this._option("abortEarly",t),A=this._option("recursive",t),t=(0,i.default)({},t,{__validating:!0,originalValue:a}),h.default.prototype._validate.call(this,e,t).catch((0,E.propagateErrors)(r,s)).then((function(e){if(!A||!m(e)){if(s.length)throw s[0];return e}a=a||e;var c=n._nodes.map((function(r){var A=(0,I.default)(B(),t.path,r),o=n.fields[r],s=(0,i.default)({},t,{path:A,parent:e,originalValue:a[r]});return o&&o.validate?(s.strict=!0,o.validate(e[r],s)):Promise.resolve(!0)}));return(0,E.default)({sync:o,validations:c,value:e,errors:s,endEarly:r,path:t.path,sort:(0,C.default)(n.fields)})}))},concat:function(e){var t=h.default.prototype.concat.call(this,e);return t._nodes=(0,d.default)(t.fields,t._excludedEdges),t},shape:function(e,t){void 0===t&&(t=[]);var r=this.clone(),A=(0,i.default)(r.fields,e);if(r.fields=A,t.length){Array.isArray(t[0])||(t=[t]);var n=t.map((function(e){return e[0]+"-"+e[1]}));r._excludedEdges=r._excludedEdges.concat(n)}return r._nodes=(0,d.default)(A,r._excludedEdges),r},from:function(e,t,r){var A=(0,u.getter)(e,!0);return this.transform((function(n){if(null==n)return n;var o=n;return(0,s.default)(n,e)&&(o=(0,i.default)({},n),r||delete o[e],o[t]=A(n)),o}))},noUnknown:function(e,t){void 0===e&&(e=!0),void 0===t&&(t=p.object.noUnknown),"string"==typeof e&&(t=e,e=!0);var r=this.test({name:"noUnknown",exclusive:!0,message:t,test:function(t){return null==t||!e||0===function(e,t){var r=Object.keys(e.fields);return Object.keys(t).filter((function(e){return-1===r.indexOf(e)}))}(this.schema,t).length}});return r._options.stripUnknown=e,r},unknown:function(e,t){return void 0===e&&(e=!0),void 0===t&&(t=p.object.noUnknown),this.noUnknown(!e,t)},transformKeys:function(e){return this.transform((function(t){return t&&(0,g.default)(t,(function(t,r){return e(r)}))}))},camelCase:function(){return this.transformKeys(c.default)},snakeCase:function(){return this.transformKeys(a.default)},constantCase:function(){return this.transformKeys((function(e){return(0,a.default)(e).toUpperCase()}))},describe:function(){var e=h.default.prototype.describe.call(this);return e.fields=(0,l.default)(this.fields,(function(e){return e.describe()})),e}}),e.exports=t.default},24280:(e,t,r)=>{"use strict";var A=r(60087);t.__esModule=!0,t.default=function(e){Object.keys(e).forEach((function(t){Object.keys(e[t]).forEach((function(r){n.default[t][r]=e[t][r]}))}))};var n=A(r(63802));e.exports=t.default},45167:(e,t,r)=>{"use strict";var A=r(60087);t.__esModule=!0,t.default=l;var n=A(r(31490)),o=A(r(16434)),i=r(63802),s=A(r(71665)),a=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,c=/^((https?|ftp):)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,g=function(e){return(0,s.default)(e)||e===e.trim()};function l(){var e=this;if(!(this instanceof l))return new l;o.default.call(this,{type:"string"}),this.withMutation((function(){e.transform((function(e){return this.isType(e)?e:null!=e&&e.toString?e.toString():e}))}))}(0,n.default)(l,o.default,{_typeCheck:function(e){return e instanceof String&&(e=e.valueOf()),"string"==typeof e},_isPresent:function(e){return o.default.prototype._cast.call(this,e)&&e.length>0},length:function(e,t){return void 0===t&&(t=i.string.length),this.test({message:t,name:"length",exclusive:!0,params:{length:e},test:function(t){return(0,s.default)(t)||t.length===this.resolve(e)}})},min:function(e,t){return void 0===t&&(t=i.string.min),this.test({message:t,name:"min",exclusive:!0,params:{min:e},test:function(t){return(0,s.default)(t)||t.length>=this.resolve(e)}})},max:function(e,t){return void 0===t&&(t=i.string.max),this.test({name:"max",exclusive:!0,message:t,params:{max:e},test:function(t){return(0,s.default)(t)||t.length<=this.resolve(e)}})},matches:function(e,t){var r,A=!1;return t&&(t.message||t.hasOwnProperty("excludeEmptyString")?(A=t.excludeEmptyString,r=t.message):r=t),this.test({message:r||i.string.matches,params:{regex:e},test:function(t){return(0,s.default)(t)||""===t&&A||e.test(t)}})},email:function(e){return void 0===e&&(e=i.string.email),this.matches(a,{message:e,excludeEmptyString:!0})},url:function(e){return void 0===e&&(e=i.string.url),this.matches(c,{message:e,excludeEmptyString:!0})},ensure:function(){return this.default("").transform((function(e){return null===e?"":e}))},trim:function(e){return void 0===e&&(e=i.string.trim),this.transform((function(e){return null!=e?e.trim():e})).test({message:e,name:"trim",test:g})},lowercase:function(e){return void 0===e&&(e=i.string.lowercase),this.transform((function(e){return(0,s.default)(e)?e:e.toLowerCase()})).test({message:e,name:"string_case",exclusive:!0,test:function(e){return(0,s.default)(e)||e===e.toLowerCase()}})},uppercase:function(e){return void 0===e&&(e=i.string.uppercase),this.transform((function(e){return(0,s.default)(e)?e:e.toUpperCase()})).test({message:e,name:"string_case",exclusive:!0,test:function(e){return(0,s.default)(e)||e===e.toUpperCase()}})}}),e.exports=t.default},54107:(e,t,r)=>{"use strict";var A=r(60087);t.__esModule=!0,t.createErrorFactory=l,t.default=function(e){var t=e.name,r=e.message,A=e.test,i=e.params;function g(e){var g=e.value,u=e.path,h=e.label,p=e.options,d=e.originalValue,C=e.sync,f=(0,n.default)(e,["value","path","label","options","originalValue","sync"]),I=p.parent,E=function(e){return a.default.isRef(e)?e.getValue({value:g,parent:I,context:p.context}):e},B=l({message:r,path:u,value:g,originalValue:d,params:i,label:h,resolve:E,name:t}),y=(0,o.default)({path:u,parent:I,type:t,createError:B,resolve:E,options:p},f);return function(e,t,r,A){var n=e.call(t,r);if(!A)return Promise.resolve(n);if(o=n,o&&"function"==typeof o.then&&"function"==typeof o.catch)throw new Error('Validation test of type: "'+t.type+'" returned a Promise during a synchronous validate. This test will finish after the validate call has returned');var o;return c.SynchronousPromise.resolve(n)}(A,y,g,C).then((function(e){if(s.default.isError(e))throw e;if(!e)throw B()}))}return g.OPTIONS=e,g};var n=A(r(74943)),o=A(r(72912)),i=A(r(89612)),s=A(r(40828)),a=A(r(95814)),c=r(93255),g=s.default.formatError;function l(e){var t=e.value,r=e.label,A=e.resolve,a=e.originalValue,c=(0,n.default)(e,["value","label","resolve","originalValue"]);return function(e){var n=void 0===e?{}:e,l=n.path,u=void 0===l?c.path:l,h=n.message,p=void 0===h?c.message:h,d=n.type,C=void 0===d?c.name:d,f=n.params;return f=(0,o.default)({path:u,value:t,originalValue:a,label:r},function(e,t,r){return(0,i.default)((0,o.default)({},e,t),r)}(c.params,f,A)),(0,o.default)(new s.default(g(p,f),t,u,C),{params:f})}}},31490:(e,t,r)=>{"use strict";var A=r(60087);t.__esModule=!0,t.default=function(e,t,r){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),(0,n.default)(e.prototype,r)};var n=A(r(72912));e.exports=t.default},71665:(e,t)=>{"use strict";t.__esModule=!0,t.default=void 0;t.default=function(e){return null==e},e.exports=t.default},11050:(e,t)=>{"use strict";t.__esModule=!0,t.default=void 0;t.default=function(e){return e&&e.__isYupSchema__},e.exports=t.default},76813:(e,t)=>{"use strict";t.__esModule=!0,t.default=function(e){var t,A,n=[1,4,5,6,7,10,11],o=0;if(A=r.exec(e)){for(var i,s=0;i=n[s];++s)A[i]=+A[i]||0;A[2]=(+A[2]||1)-1,A[3]=+A[3]||1,A[7]=A[7]?String(A[7]).substr(0,3):0,void 0!==A[8]&&""!==A[8]||void 0!==A[9]&&""!==A[9]?("Z"!==A[8]&&void 0!==A[9]&&(o=60*A[10]+A[11],"+"===A[9]&&(o=0-o)),t=Date.UTC(A[1],A[2],A[3],A[4],A[5]+o,A[6],A[7])):t=+new Date(A[1],A[2],A[3],A[4],A[5],A[6],A[7])}else t=Date.parse?Date.parse(e):NaN;return t};var r=/^(\d{4}|[+\-]\d{6})(?:-?(\d{2})(?:-?(\d{2}))?)?(?:[ T]?(\d{2}):?(\d{2})(?::?(\d{2})(?:[,\.](\d{1,}))?)?(?:(Z)|([+\-])(\d{2})(?::?(\d{2}))?)?)?$/;e.exports=t.default},7045:(e,t)=>{"use strict";t.__esModule=!0,t.default=function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),A=1;A{"use strict";var A=r(60087);t.__esModule=!0,t.default=function e(t,r){for(var A in r)if((0,n.default)(r,A)){var s=r[A],a=t[A];if(void 0===a)t[A]=s;else{if(a===s)continue;(0,o.default)(a)?(0,o.default)(s)&&(t[A]=s.concat(a)):i(a)?i(s)&&(t[A]=e(a,s)):Array.isArray(a)&&Array.isArray(s)&&(t[A]=s.concat(a))}}return t};var n=A(r(15215)),o=A(r(11050)),i=function(e){return"[object Object]"===Object.prototype.toString.call(e)};e.exports=t.default},21043:(e,t)=>{"use strict";t.__esModule=!0,t.default=function(e,t){var r=s(e,t);return null!==r?r:JSON.stringify(e,(function(e,r){var A=s(this[e],t);return null!==A?A:r}),2)};var r=Object.prototype.toString,A=Error.prototype.toString,n=RegExp.prototype.toString,o="undefined"!=typeof Symbol?Symbol.prototype.toString:function(){return""},i=/^Symbol\((.*)\)(.*)$/;function s(e,t){if(void 0===t&&(t=!1),null==e||!0===e||!1===e)return""+e;var s=typeof e;if("number"===s)return function(e){return e!=+e?"NaN":0===e&&1/e<0?"-0":""+e}(e);if("string"===s)return t?'"'+e+'"':e;if("function"===s)return"[Function "+(e.name||"anonymous")+"]";if("symbol"===s)return o.call(e).replace(i,"Symbol($1)");var a=r.call(e).slice(8,-1);return"Date"===a?isNaN(e.getTime())?""+e:e.toISOString(e):"Error"===a||e instanceof Error?"["+A.call(e)+"]":"RegExp"===a?n.call(e):null}e.exports=t.default},43910:(e,t,r)=>{"use strict";var A=r(60087);t.__esModule=!0,t.getIn=i,t.default=void 0;var n=r(79588),o=A(r(15215));function i(e,t,r,A){var i,s,a;return A=A||r,t?((0,n.forEach)(t,(function(n,c,g){var l=c?function(e){return e.substr(0,e.length-1).substr(1)}(n):n;if(g||(0,o.default)(e,"_subType")){var u=g?parseInt(l,10):0;if(e=e.resolve({context:A,parent:i,value:r})._subType,r){if(g&&u>=r.length)throw new Error("Yup.reach cannot resolve an array item at index: "+n+", in the path: "+t+". because there is no value at that index. ");r=r[u]}}if(!g){if(e=e.resolve({context:A,parent:i,value:r}),!(0,o.default)(e,"fields")||!(0,o.default)(e.fields,l))throw new Error("The schema does not contain the path: "+t+". (failed at: "+a+' which is a type: "'+e._type+'") ');e=e.fields[l],i=r,r=r&&r[l],s=l,a=c?"["+n+"]":"."+n}})),{schema:e,parent:i,parentPath:s}):{parent:i,parentPath:t,schema:e}}var s=function(e,t,r,A){return i(e,t,r,A).schema};t.default=s},80180:(e,t,r)=>{"use strict";var A=r(60087);t.__esModule=!0,t.propagateErrors=function(e,t){return e?null:function(e){return t.push(e),e.value}},t.settled=a,t.collectErrors=c,t.default=function(e){var t=e.endEarly,r=(0,n.default)(e,["endEarly"]);return t?function(e,t,r){return s(r).all(e).catch((function(e){throw"ValidationError"===e.name&&(e.value=t),e})).then((function(){return t}))}(r.validations,r.value,r.sync):c(r)};var n=A(r(74943)),o=r(93255),i=A(r(40828)),s=function(e){return e?o.SynchronousPromise:Promise};function a(e,t){var r=s(t);return r.all(e.map((function(e){return r.resolve(e).then((function(e){return{fulfilled:!0,value:e}}),(function(e){return{fulfilled:!1,value:e}}))})))}function c(e){var t=e.validations,r=e.value,A=e.path,n=e.sync,o=e.errors,s=e.sort;return o=function(e){return void 0===e&&(e=[]),e.inner&&e.inner.length?e.inner:[].concat(e)}(o),a(t,n).then((function(e){var t=e.filter((function(e){return!e.fulfilled})).reduce((function(e,t){var r=t.value;if(!i.default.isError(r))throw r;return e.concat(r)}),[]);if(s&&t.sort(s),(o=t.concat(o)).length)throw new i.default(o,r,A);return r}))}},23316:(e,t)=>{"use strict";function r(e,t){var r=1/0;return e.some((function(e,A){if(-1!==t.path.indexOf(e))return r=A,!0})),r}t.__esModule=!0,t.default=function(e){var t=Object.keys(e);return function(e,A){return r(t,e)-r(t,A)}},e.exports=t.default},18417:(e,t,r)=>{"use strict";var A=r(60087);t.__esModule=!0,t.default=function(e,t){void 0===t&&(t=[]);var r=[],A=[];function c(e,n){var o=(0,i.split)(e)[0];~A.indexOf(o)||A.push(o),~t.indexOf(n+"-"+o)||r.push([n,o])}for(var g in e)if((0,n.default)(e,g)){var l=e[g];~A.indexOf(g)||A.push(g),s.default.isRef(l)&&l.isSibling?c(l.path,g):(0,a.default)(l)&&l._deps&&l._deps.forEach((function(e){return c(e,g)}))}return o.default.array(A,r).reverse()};var n=A(r(15215)),o=A(r(75158)),i=r(79588),s=A(r(95814)),a=A(r(11050));e.exports=t.default},60306:e=>{"use strict";e.exports=JSON.parse('{"name":"@yarnpkg/cli","version":"2.4.1","license":"BSD-2-Clause","main":"./sources/index.ts","dependencies":{"@yarnpkg/core":"workspace:^2.4.0","@yarnpkg/fslib":"workspace:^2.4.0","@yarnpkg/libzip":"workspace:^2.2.1","@yarnpkg/parsers":"workspace:^2.3.0","@yarnpkg/plugin-compat":"workspace:^2.2.1","@yarnpkg/plugin-dlx":"workspace:^2.1.4","@yarnpkg/plugin-essentials":"workspace:^2.4.0","@yarnpkg/plugin-file":"workspace:^2.2.0","@yarnpkg/plugin-git":"workspace:^2.3.0","@yarnpkg/plugin-github":"workspace:^2.1.2","@yarnpkg/plugin-http":"workspace:^2.1.2","@yarnpkg/plugin-init":"workspace:^2.2.2","@yarnpkg/plugin-link":"workspace:^2.1.1","@yarnpkg/plugin-node-modules":"workspace:^2.3.0","@yarnpkg/plugin-npm":"workspace:^2.4.0","@yarnpkg/plugin-npm-cli":"workspace:^2.3.0","@yarnpkg/plugin-pack":"workspace:^2.2.3","@yarnpkg/plugin-patch":"workspace:^2.1.2","@yarnpkg/plugin-pnp":"workspace:^2.4.0","@yarnpkg/shell":"workspace:^2.4.1","chalk":"^3.0.0","ci-info":"^2.0.0","clipanion":"^2.6.2","fromentries":"^1.2.0","semver":"^7.1.2","tslib":"^1.13.0","yup":"^0.27.0"},"devDependencies":{"@types/ci-info":"^2","@types/yup":"0.26.12","@yarnpkg/builder":"workspace:^2.1.3","@yarnpkg/monorepo":"workspace:0.0.0","@yarnpkg/pnpify":"workspace:^2.4.0","micromatch":"^4.0.2","typescript":"4.1.0-beta"},"peerDependencies":{"@yarnpkg/core":"^2.4.0"},"scripts":{"postpack":"rm -rf lib","prepack":"run build:compile \\"$(pwd)\\"","build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},"publishConfig":{"main":"./lib/index.js","types":"./lib/index.d.ts","bin":null},"files":["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{"bundles":{"standard":["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-node-modules","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp"]}},"repository":{"type":"git","url":"ssh://git@github.com/yarnpkg/berry.git"},"engines":{"node":">=10.19.0"}}')},98497:e=>{function t(e){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}t.keys=()=>[],t.resolve=t,t.id=98497,e.exports=t},32178:e=>{function t(e){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}t.keys=()=>[],t.resolve=t,t.id=32178,e.exports=t},3368:(e,t,r)=>{var A,n=Object.assign({},r(35747)),o=void 0!==o?o:{},i={};for(A in o)o.hasOwnProperty(A)&&(i[A]=o[A]);var s,a,c,g,l=[],u="";u=__dirname+"/",s=function(e,t){var A=Qe(e);return A?t?A:A.toString():(c||(c=n),g||(g=r(85622)),e=g.normalize(e),c.readFileSync(e,t?null:"utf8"))},a=function(e){var t=s(e,!0);return t.buffer||(t=new Uint8Array(t)),E(t.buffer),t},process.argv.length>1&&process.argv[1].replace(/\\/g,"/"),l=process.argv.slice(2),e.exports=o,o.inspect=function(){return"[Emscripten Module object]"};var h=o.print||console.log.bind(console),p=o.printErr||console.warn.bind(console);for(A in i)i.hasOwnProperty(A)&&(o[A]=i[A]);i=null,o.arguments&&(l=o.arguments),o.thisProgram&&o.thisProgram,o.quit&&o.quit;var d,C;o.wasmBinary&&(d=o.wasmBinary),o.noExitRuntime&&o.noExitRuntime,"object"!=typeof WebAssembly&&_("no native wasm support detected");var f=new WebAssembly.Table({initial:31,maximum:31,element:"anyfunc"}),I=!1;function E(e,t){e||_("Assertion failed: "+t)}function B(e){var t=o["_"+e];return E(t,"Cannot call unknown function "+e+", make sure it is exported"),t}function y(e,t,r,A,n){var o={string:function(e){var t=0;if(null!=e&&0!==e){var r=1+(e.length<<2);b(e,t=xe(r),r)}return t},array:function(e){var t=xe(e.length);return function(e,t){N.set(e,t)}(e,t),t}};var i=B(e),s=[],a=0;if(A)for(var c=0;c=A);)++n;if(n-t>16&&e.subarray&&m)return m.decode(e.subarray(t,n));for(var o="";t>10,56320|1023&c)}}else o+=String.fromCharCode((31&i)<<6|s)}else o+=String.fromCharCode(i)}return o}function Q(e,t){return e?w(F,e,t):""}function D(e,t,r,A){if(!(A>0))return 0;for(var n=r,o=r+A-1,i=0;i=55296&&s<=57343)s=65536+((1023&s)<<10)|1023&e.charCodeAt(++i);if(s<=127){if(r>=o)break;t[r++]=s}else if(s<=2047){if(r+1>=o)break;t[r++]=192|s>>6,t[r++]=128|63&s}else if(s<=65535){if(r+2>=o)break;t[r++]=224|s>>12,t[r++]=128|s>>6&63,t[r++]=128|63&s}else{if(r+3>=o)break;t[r++]=240|s>>18,t[r++]=128|s>>12&63,t[r++]=128|s>>6&63,t[r++]=128|63&s}}return t[r]=0,r-n}function b(e,t,r){return D(e,F,t,r)}function v(e){for(var t=0,r=0;r=55296&&A<=57343&&(A=65536+((1023&A)<<10)|1023&e.charCodeAt(++r)),A<=127?++t:t+=A<=2047?2:A<=65535?3:4}return t}function S(e){var t=v(e)+1,r=Le(t);return r&&D(e,N,r,t),r}var k,N,F,K,M,R,x;function L(e){k=e,o.HEAP8=N=new Int8Array(e),o.HEAP16=K=new Int16Array(e),o.HEAP32=M=new Int32Array(e),o.HEAPU8=F=new Uint8Array(e),o.HEAPU16=new Uint16Array(e),o.HEAPU32=new Uint32Array(e),o.HEAPF32=R=new Float32Array(e),o.HEAPF64=x=new Float64Array(e)}var P=o.INITIAL_MEMORY||16777216;(C=o.wasmMemory?o.wasmMemory:new WebAssembly.Memory({initial:P/65536,maximum:32768}))&&(k=C.buffer),P=k.byteLength,L(k);var O=[],U=[],T=[],j=[];var Y=Math.abs,G=Math.ceil,H=Math.floor,J=Math.min,q=0,z=null,W=null;function V(e){q++,o.monitorRunDependencies&&o.monitorRunDependencies(q)}function X(e){if(q--,o.monitorRunDependencies&&o.monitorRunDependencies(q),0==q&&(null!==z&&(clearInterval(z),z=null),W)){var t=W;W=null,t()}}function _(e){throw o.onAbort&&o.onAbort(e),p(e+=""),I=!0,1,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.",new WebAssembly.RuntimeError(e)}o.preloadedImages={},o.preloadedAudios={};function Z(e){return t=e,r="data:application/octet-stream;base64,",String.prototype.startsWith?t.startsWith(r):0===t.indexOf(r);var t,r}var $,ee,te,re="data:application/octet-stream;base64,AGFzbQEAAAAB0QIwYAF/AX9gA39/fwF/YAJ/fwF/YAF/AGACf38AYAR/f39/AX9gBX9/f39/AX9gA39/fwBgBH9+f38Bf2AAAX9gAn9+AX9gA39+fwF/YAF/AX5gBX9/f35/AX5gA39/fgF+YAR/f35/AX5gA39+fwF+YAN/f34Bf2AEf39+fwF/YAR/f39/AX5gBH9/f38AYAZ/f39/f38Bf2AFf39+f38Bf2ACfn8Bf2ADf39/AX5gBH9+fn8AYAN/fH8AYAV/fn9/fwF/YAZ/fH9/f38Bf2ACf38BfmAAAGAFf39/f38AYAV/f39+fwBgAn9+AGADf35/AGACf3wAYAN/fHwAYAR/f35+AX9gBH9+fn8Bf2AIf35+f39/fn8Bf2ABfgF/YAN+f38Bf2AFf39/f38BfmAEf39/fgF+YAJ/fgF+YAV+fn9+fwF+YAJ+fgF8YAJ8fwF8ApIBFwFhAWMAAwFhAWQAAAFhAWUAAgFhAWYABQFhAWcAAQFhAWgAAAFhAWkAAAFhAWoAAgFhAWsAAgFhAWwAAgFhAW0AAgFhAW4ABgFhAW8AAAFhAXAABQFhAXEAAQFhAXIAAgFhAXMAAQFhAXQAAQFhAXUAAAFhAXYAAQFhAXcAAAFhAWECAYACgIACAWEBYgFwAB8DgQP/AgcDAwQAAQEDAwAKBAQPBwMDAx8LFAoAAAohDgwMAAcDDBEdAwIDAgMAAQMHCA4XBAgABQAADAAEAggIBQUAAQATAxQjAQECAwMBBgYSAwMFGAEIAwEDAAACGAcGARUBAAcEAiASCAIAFicQAgECAAYCAgIABgQAAy0FAAEBAQQACwsCAgwMAAIIGxsTCgcALwIBAAoWAQEDBgIBAgIABwcHBAMDAwMsEgsICAsBKgcBCxcKAAIJDgMJCgACAAUAAQEBAAMGAAUFBgYGAQIFBQUGFRUFAQEAAwkABQgCCBYSAgoBAgEAAgAADyYAAQEQAAICCQAJAwEAAgQAAB0OCwEACAAAABMAGAgMBAoCAgACAQcEHBcpBwEACQkJLhkZAhERCgECAAAADSsEDQUFAAEBAxEAAAADAQABAAMAAAIAAAQCAgICAgMJAwAAAgIHBBQAAAMDAwEEAQICDQYPDgsPAAokAwMDKCITAwMABAMCAg0lEAkEAgICCQAOAAkeBgkBfwFB0KHBAgsHsQI5AXgAkwMBeQCSAwF6AN0CAUEAlwIBQgDXAQFDANMBAUQAzwEBRQDNAQFGAMoBAUcAyAEBSACRAwFJAI8DAUoAugIBSwDqAQFMAOkBAU0APwFOAL8CAU8AmQIBUACYAgFRAKMCAVIAmwIBUwDoAQFUAOcBAVUA5gEBVgDlAQFXAJQCAVgA5AEBWQDjAQFaAOIBAV8A4QEBJADgAQJhYQD5AQJiYQCSAQJjYQDfAQJkYQDeAQJlYQDdAQJmYQAyAmdhAM8CAmhhABwCaWEA2AECamEASQJrYQDcAQJsYQDbAQJtYQBtAm5hANoBAm9hAO8BAnBhANkBAnFhAO4BAnJhAIkDAnNhALACAnRhAK8CAnVhAK4CAnZhAO0BAndhAOwBAnhhAOsBAnlhABkCemEAFglBAQBBAQsehgP1AvAC8QLtAuwCsQHYAtcCzALLAsoCyQLIAscCxgLFAsQCwAK9AqgCpwKlAqICW4MCggKBAoAC/gEK05oJ/wJAAQF/IwBBEGsiAyAANgIMIAMgATYCCCADIAI2AgQgAygCDARAIAMoAgwgAygCCDYCACADKAIMIAMoAgQ2AgQLC6oNAQd/AkAgAEUNACAAQXhqIgMgAEF8aigCACIBQXhxIgBqIQUCQCABQQFxDQAgAUEDcUUNASADIAMoAgAiAmsiA0HInAEoAgAiBEkNASAAIAJqIQAgA0HMnAEoAgBHBEAgAkH/AU0EQCADKAIIIgQgAkEDdiICQQN0QeCcAWpHGiAEIAMoAgwiAUYEQEG4nAFBuJwBKAIAQX4gAndxNgIADAMLIAQgATYCDCABIAQ2AggMAgsgAygCGCEGAkAgAyADKAIMIgFHBEAgBCADKAIIIgJNBEAgAigCDBoLIAIgATYCDCABIAI2AggMAQsCQCADQRRqIgIoAgAiBA0AIANBEGoiAigCACIEDQBBACEBDAELA0AgAiEHIAQiAUEUaiICKAIAIgQNACABQRBqIQIgASgCECIEDQALIAdBADYCAAsgBkUNAQJAIAMgAygCHCICQQJ0QeieAWoiBCgCAEYEQCAEIAE2AgAgAQ0BQbycAUG8nAEoAgBBfiACd3E2AgAMAwsgBkEQQRQgBigCECADRhtqIAE2AgAgAUUNAgsgASAGNgIYIAMoAhAiAgRAIAEgAjYCECACIAE2AhgLIAMoAhQiAkUNASABIAI2AhQgAiABNgIYDAELIAUoAgQiAUEDcUEDRw0AQcCcASAANgIAIAUgAUF+cTYCBCADIABBAXI2AgQgACADaiAANgIADwsgBSADTQ0AIAUoAgQiAUEBcUUNAAJAIAFBAnFFBEAgBUHQnAEoAgBGBEBB0JwBIAM2AgBBxJwBQcScASgCACAAaiIANgIAIAMgAEEBcjYCBCADQcycASgCAEcNA0HAnAFBADYCAEHMnAFBADYCAA8LIAVBzJwBKAIARgRAQcycASADNgIAQcCcAUHAnAEoAgAgAGoiADYCACADIABBAXI2AgQgACADaiAANgIADwsgAUF4cSAAaiEAAkAgAUH/AU0EQCAFKAIMIQIgBSgCCCIEIAFBA3YiAUEDdEHgnAFqIgdHBEBByJwBKAIAGgsgAiAERgRAQbicAUG4nAEoAgBBfiABd3E2AgAMAgsgAiAHRwRAQcicASgCABoLIAQgAjYCDCACIAQ2AggMAQsgBSgCGCEGAkAgBSAFKAIMIgFHBEBByJwBKAIAIAUoAggiAk0EQCACKAIMGgsgAiABNgIMIAEgAjYCCAwBCwJAIAVBFGoiAigCACIEDQAgBUEQaiICKAIAIgQNAEEAIQEMAQsDQCACIQcgBCIBQRRqIgIoAgAiBA0AIAFBEGohAiABKAIQIgQNAAsgB0EANgIACyAGRQ0AAkAgBSAFKAIcIgJBAnRB6J4BaiIEKAIARgRAIAQgATYCACABDQFBvJwBQbycASgCAEF+IAJ3cTYCAAwCCyAGQRBBFCAGKAIQIAVGG2ogATYCACABRQ0BCyABIAY2AhggBSgCECICBEAgASACNgIQIAIgATYCGAsgBSgCFCICRQ0AIAEgAjYCFCACIAE2AhgLIAMgAEEBcjYCBCAAIANqIAA2AgAgA0HMnAEoAgBHDQFBwJwBIAA2AgAPCyAFIAFBfnE2AgQgAyAAQQFyNgIEIAAgA2ogADYCAAsgAEH/AU0EQCAAQQN2IgFBA3RB4JwBaiEAAn9BuJwBKAIAIgJBASABdCIBcUUEQEG4nAEgASACcjYCACAADAELIAAoAggLIQIgACADNgIIIAIgAzYCDCADIAA2AgwgAyACNgIIDwsgA0IANwIQIAMCf0EAIABBCHYiAUUNABpBHyAAQf///wdLDQAaIAEgAUGA/j9qQRB2QQhxIgF0IgIgAkGA4B9qQRB2QQRxIgJ0IgQgBEGAgA9qQRB2QQJxIgR0QQ92IAEgAnIgBHJrIgFBAXQgACABQRVqdkEBcXJBHGoLIgI2AhwgAkECdEHongFqIQECQAJAAkBBvJwBKAIAIgRBASACdCIHcUUEQEG8nAEgBCAHcjYCACABIAM2AgAgAyABNgIYDAELIABBAEEZIAJBAXZrIAJBH0YbdCECIAEoAgAhAQNAIAEiBCgCBEF4cSAARg0CIAJBHXYhASACQQF0IQIgBCABQQRxaiIHQRBqKAIAIgENAAsgByADNgIQIAMgBDYCGAsgAyADNgIMIAMgAzYCCAwBCyAEKAIIIgAgAzYCDCAEIAM2AgggA0EANgIYIAMgBDYCDCADIAA2AggLQdicAUHYnAEoAgBBf2oiADYCACAADQBBgKABIQMDQCADKAIAIgBBCGohAyAADQALQdicAUF/NgIACwtCAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDC0AAUEBcQRAIAEoAgwoAgQQFgsgASgCDBAWCyABQRBqJAALQwEBfyMAQRBrIgIkACACIAA2AgwgAiABNgIIIAIoAgwCfyMAQRBrIgAgAigCCDYCDCAAKAIMQQxqCxBEIAJBEGokAAvcLgEMfyMAQRBrIgwkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAQfQBTQRAQbicASgCACIGQRAgAEELakF4cSAAQQtJGyIFQQN2IgB2IgFBA3EEQCABQX9zQQFxIABqIgJBA3QiBUHonAFqKAIAIgFBCGohAAJAIAEoAggiAyAFQeCcAWoiBUYEQEG4nAEgBkF+IAJ3cTYCAAwBC0HInAEoAgAaIAMgBTYCDCAFIAM2AggLIAEgAkEDdCICQQNyNgIEIAEgAmoiASABKAIEQQFyNgIEDA0LIAVBwJwBKAIAIghNDQEgAQRAAkBBAiAAdCICQQAgAmtyIAEgAHRxIgBBACAAa3FBf2oiACAAQQx2QRBxIgB2IgFBBXZBCHEiAiAAciABIAJ2IgBBAnZBBHEiAXIgACABdiIAQQF2QQJxIgFyIAAgAXYiAEEBdkEBcSIBciAAIAF2aiICQQN0IgNB6JwBaigCACIBKAIIIgAgA0HgnAFqIgNGBEBBuJwBIAZBfiACd3EiBjYCAAwBC0HInAEoAgAaIAAgAzYCDCADIAA2AggLIAFBCGohACABIAVBA3I2AgQgASAFaiIEIAJBA3QiAiAFayIDQQFyNgIEIAEgAmogAzYCACAIBEAgCEEDdiIFQQN0QeCcAWohAUHMnAEoAgAhAgJ/IAZBASAFdCIFcUUEQEG4nAEgBSAGcjYCACABDAELIAEoAggLIQUgASACNgIIIAUgAjYCDCACIAE2AgwgAiAFNgIIC0HMnAEgBDYCAEHAnAEgAzYCAAwNC0G8nAEoAgAiCkUNASAKQQAgCmtxQX9qIgAgAEEMdkEQcSIAdiIBQQV2QQhxIgIgAHIgASACdiIAQQJ2QQRxIgFyIAAgAXYiAEEBdkECcSIBciAAIAF2IgBBAXZBAXEiAXIgACABdmpBAnRB6J4BaigCACIBKAIEQXhxIAVrIQQgASECA0ACQCACKAIQIgBFBEAgAigCFCIARQ0BCyAAKAIEQXhxIAVrIgIgBCACIARJIgIbIQQgACABIAIbIQEgACECDAELCyABIAVqIgsgAU0NAiABKAIYIQkgASABKAIMIgNHBEBByJwBKAIAIAEoAggiAE0EQCAAKAIMGgsgACADNgIMIAMgADYCCAwMCyABQRRqIgIoAgAiAEUEQCABKAIQIgBFDQQgAUEQaiECCwNAIAIhByAAIgNBFGoiAigCACIADQAgA0EQaiECIAMoAhAiAA0ACyAHQQA2AgAMCwtBfyEFIABBv39LDQAgAEELaiIAQXhxIQVBvJwBKAIAIghFDQBBACAFayEEAkACQAJAAn9BACAAQQh2IgBFDQAaQR8gBUH///8HSw0AGiAAIABBgP4/akEQdkEIcSIAdCIBIAFBgOAfakEQdkEEcSIBdCICIAJBgIAPakEQdkECcSICdEEPdiAAIAFyIAJyayIAQQF0IAUgAEEVanZBAXFyQRxqCyIHQQJ0QeieAWooAgAiAkUEQEEAIQAMAQtBACEAIAVBAEEZIAdBAXZrIAdBH0YbdCEBA0ACQCACKAIEQXhxIAVrIgYgBE8NACACIQMgBiIEDQBBACEEIAIhAAwDCyAAIAIoAhQiBiAGIAIgAUEddkEEcWooAhAiAkYbIAAgBhshACABQQF0IQEgAg0ACwsgACADckUEQEECIAd0IgBBACAAa3IgCHEiAEUNAyAAQQAgAGtxQX9qIgAgAEEMdkEQcSIAdiIBQQV2QQhxIgIgAHIgASACdiIAQQJ2QQRxIgFyIAAgAXYiAEEBdkECcSIBciAAIAF2IgBBAXZBAXEiAXIgACABdmpBAnRB6J4BaigCACEACyAARQ0BCwNAIAAoAgRBeHEgBWsiAiAESSEBIAIgBCABGyEEIAAgAyABGyEDIAAoAhAiAQR/IAEFIAAoAhQLIgANAAsLIANFDQAgBEHAnAEoAgAgBWtPDQAgAyAFaiIHIANNDQEgAygCGCEJIAMgAygCDCIBRwRAQcicASgCACADKAIIIgBNBEAgACgCDBoLIAAgATYCDCABIAA2AggMCgsgA0EUaiICKAIAIgBFBEAgAygCECIARQ0EIANBEGohAgsDQCACIQYgACIBQRRqIgIoAgAiAA0AIAFBEGohAiABKAIQIgANAAsgBkEANgIADAkLQcCcASgCACIBIAVPBEBBzJwBKAIAIQACQCABIAVrIgJBEE8EQEHAnAEgAjYCAEHMnAEgACAFaiIDNgIAIAMgAkEBcjYCBCAAIAFqIAI2AgAgACAFQQNyNgIEDAELQcycAUEANgIAQcCcAUEANgIAIAAgAUEDcjYCBCAAIAFqIgEgASgCBEEBcjYCBAsgAEEIaiEADAsLQcScASgCACIBIAVLBEBBxJwBIAEgBWsiATYCAEHQnAFB0JwBKAIAIgAgBWoiAjYCACACIAFBAXI2AgQgACAFQQNyNgIEIABBCGohAAwLC0EAIQAgBUEvaiIEAn9BkKABKAIABEBBmKABKAIADAELQZygAUJ/NwIAQZSgAUKAoICAgIAENwIAQZCgASAMQQxqQXBxQdiq1aoFczYCAEGkoAFBADYCAEH0nwFBADYCAEGAIAsiAmoiBkEAIAJrIgdxIgIgBU0NCkHwnwEoAgAiAwRAQeifASgCACIIIAJqIgkgCE0NCyAJIANLDQsLQfSfAS0AAEEEcQ0FAkACQEHQnAEoAgAiAwRAQfifASEAA0AgACgCACIIIANNBEAgCCAAKAIEaiADSw0DCyAAKAIIIgANAAsLQQAQPSIBQX9GDQYgAiEGQZSgASgCACIAQX9qIgMgAXEEQCACIAFrIAEgA2pBACAAa3FqIQYLIAYgBU0NBiAGQf7///8HSw0GQfCfASgCACIABEBB6J8BKAIAIgMgBmoiByADTQ0HIAcgAEsNBwsgBhA9IgAgAUcNAQwICyAGIAFrIAdxIgZB/v///wdLDQUgBhA9IgEgACgCACAAKAIEakYNBCABIQALAkAgBUEwaiAGTQ0AIABBf0YNAEGYoAEoAgAiASAEIAZrakEAIAFrcSIBQf7///8HSwRAIAAhAQwICyABED1Bf0cEQCABIAZqIQYgACEBDAgLQQAgBmsQPRoMBQsgACIBQX9HDQYMBAsAC0EAIQMMBwtBACEBDAULIAFBf0cNAgtB9J8BQfSfASgCAEEEcjYCAAsgAkH+////B0sNASACED0iAUEAED0iAE8NASABQX9GDQEgAEF/Rg0BIAAgAWsiBiAFQShqTQ0BC0HonwFB6J8BKAIAIAZqIgA2AgAgAEHsnwEoAgBLBEBB7J8BIAA2AgALAkACQAJAQdCcASgCACIEBEBB+J8BIQADQCABIAAoAgAiAiAAKAIEIgNqRg0CIAAoAggiAA0ACwwCC0HInAEoAgAiAEEAIAEgAE8bRQRAQcicASABNgIAC0EAIQBB/J8BIAY2AgBB+J8BIAE2AgBB2JwBQX82AgBB3JwBQZCgASgCADYCAEGEoAFBADYCAANAIABBA3QiAkHonAFqIAJB4JwBaiIDNgIAIAJB7JwBaiADNgIAIABBAWoiAEEgRw0AC0HEnAEgBkFYaiIAQXggAWtBB3FBACABQQhqQQdxGyICayIDNgIAQdCcASABIAJqIgI2AgAgAiADQQFyNgIEIAAgAWpBKDYCBEHUnAFBoKABKAIANgIADAILIAAtAAxBCHENACABIARNDQAgAiAESw0AIAAgAyAGajYCBEHQnAEgBEF4IARrQQdxQQAgBEEIakEHcRsiAGoiATYCAEHEnAFBxJwBKAIAIAZqIgIgAGsiADYCACABIABBAXI2AgQgAiAEakEoNgIEQdScAUGgoAEoAgA2AgAMAQsgAUHInAEoAgAiA0kEQEHInAEgATYCACABIQMLIAEgBmohAkH4nwEhAAJAAkACQAJAAkACQANAIAIgACgCAEcEQCAAKAIIIgANAQwCCwsgAC0ADEEIcUUNAQtB+J8BIQADQCAAKAIAIgIgBE0EQCACIAAoAgRqIgMgBEsNAwsgACgCCCEADAAACwALIAAgATYCACAAIAAoAgQgBmo2AgQgAUF4IAFrQQdxQQAgAUEIakEHcRtqIgkgBUEDcjYCBCACQXggAmtBB3FBACACQQhqQQdxG2oiASAJayAFayEAIAUgCWohByABIARGBEBB0JwBIAc2AgBBxJwBQcScASgCACAAaiIANgIAIAcgAEEBcjYCBAwDCyABQcycASgCAEYEQEHMnAEgBzYCAEHAnAFBwJwBKAIAIABqIgA2AgAgByAAQQFyNgIEIAAgB2ogADYCAAwDCyABKAIEIgJBA3FBAUYEQCACQXhxIQoCQCACQf8BTQRAIAEoAggiAyACQQN2IgVBA3RB4JwBakcaIAMgASgCDCICRgRAQbicAUG4nAEoAgBBfiAFd3E2AgAMAgsgAyACNgIMIAIgAzYCCAwBCyABKAIYIQgCQCABIAEoAgwiBkcEQCADIAEoAggiAk0EQCACKAIMGgsgAiAGNgIMIAYgAjYCCAwBCwJAIAFBFGoiBCgCACIFDQAgAUEQaiIEKAIAIgUNAEEAIQYMAQsDQCAEIQIgBSIGQRRqIgQoAgAiBQ0AIAZBEGohBCAGKAIQIgUNAAsgAkEANgIACyAIRQ0AAkAgASABKAIcIgJBAnRB6J4BaiIDKAIARgRAIAMgBjYCACAGDQFBvJwBQbycASgCAEF+IAJ3cTYCAAwCCyAIQRBBFCAIKAIQIAFGG2ogBjYCACAGRQ0BCyAGIAg2AhggASgCECICBEAgBiACNgIQIAIgBjYCGAsgASgCFCICRQ0AIAYgAjYCFCACIAY2AhgLIAEgCmohASAAIApqIQALIAEgASgCBEF+cTYCBCAHIABBAXI2AgQgACAHaiAANgIAIABB/wFNBEAgAEEDdiIBQQN0QeCcAWohAAJ/QbicASgCACICQQEgAXQiAXFFBEBBuJwBIAEgAnI2AgAgAAwBCyAAKAIICyEBIAAgBzYCCCABIAc2AgwgByAANgIMIAcgATYCCAwDCyAHAn9BACAAQQh2IgFFDQAaQR8gAEH///8HSw0AGiABIAFBgP4/akEQdkEIcSIBdCICIAJBgOAfakEQdkEEcSICdCIDIANBgIAPakEQdkECcSIDdEEPdiABIAJyIANyayIBQQF0IAAgAUEVanZBAXFyQRxqCyIBNgIcIAdCADcCECABQQJ0QeieAWohAgJAQbycASgCACIDQQEgAXQiBXFFBEBBvJwBIAMgBXI2AgAgAiAHNgIADAELIABBAEEZIAFBAXZrIAFBH0YbdCEEIAIoAgAhAQNAIAEiAigCBEF4cSAARg0DIARBHXYhASAEQQF0IQQgAiABQQRxaiIDKAIQIgENAAsgAyAHNgIQCyAHIAI2AhggByAHNgIMIAcgBzYCCAwCC0HEnAEgBkFYaiIAQXggAWtBB3FBACABQQhqQQdxGyICayIHNgIAQdCcASABIAJqIgI2AgAgAiAHQQFyNgIEIAAgAWpBKDYCBEHUnAFBoKABKAIANgIAIAQgA0EnIANrQQdxQQAgA0FZakEHcRtqQVFqIgAgACAEQRBqSRsiAkEbNgIEIAJBgKABKQIANwIQIAJB+J8BKQIANwIIQYCgASACQQhqNgIAQfyfASAGNgIAQfifASABNgIAQYSgAUEANgIAIAJBGGohAANAIABBBzYCBCAAQQhqIQEgAEEEaiEAIAMgAUsNAAsgAiAERg0DIAIgAigCBEF+cTYCBCAEIAIgBGsiA0EBcjYCBCACIAM2AgAgA0H/AU0EQCADQQN2IgFBA3RB4JwBaiEAAn9BuJwBKAIAIgJBASABdCIBcUUEQEG4nAEgASACcjYCACAADAELIAAoAggLIQEgACAENgIIIAEgBDYCDCAEIAA2AgwgBCABNgIIDAQLIARCADcCECAEAn9BACADQQh2IgBFDQAaQR8gA0H///8HSw0AGiAAIABBgP4/akEQdkEIcSIAdCIBIAFBgOAfakEQdkEEcSIBdCICIAJBgIAPakEQdkECcSICdEEPdiAAIAFyIAJyayIAQQF0IAMgAEEVanZBAXFyQRxqCyIANgIcIABBAnRB6J4BaiEBAkBBvJwBKAIAIgJBASAAdCIGcUUEQEG8nAEgAiAGcjYCACABIAQ2AgAgBCABNgIYDAELIANBAEEZIABBAXZrIABBH0YbdCEAIAEoAgAhAQNAIAEiAigCBEF4cSADRg0EIABBHXYhASAAQQF0IQAgAiABQQRxaiIGKAIQIgENAAsgBiAENgIQIAQgAjYCGAsgBCAENgIMIAQgBDYCCAwDCyACKAIIIgAgBzYCDCACIAc2AgggB0EANgIYIAcgAjYCDCAHIAA2AggLIAlBCGohAAwFCyACKAIIIgAgBDYCDCACIAQ2AgggBEEANgIYIAQgAjYCDCAEIAA2AggLQcScASgCACIAIAVNDQBBxJwBIAAgBWsiATYCAEHQnAFB0JwBKAIAIgAgBWoiAjYCACACIAFBAXI2AgQgACAFQQNyNgIEIABBCGohAAwDC0G0nAFBMDYCAEEAIQAMAgsCQCAJRQ0AAkAgAygCHCIAQQJ0QeieAWoiAigCACADRgRAIAIgATYCACABDQFBvJwBIAhBfiAAd3EiCDYCAAwCCyAJQRBBFCAJKAIQIANGG2ogATYCACABRQ0BCyABIAk2AhggAygCECIABEAgASAANgIQIAAgATYCGAsgAygCFCIARQ0AIAEgADYCFCAAIAE2AhgLAkAgBEEPTQRAIAMgBCAFaiIAQQNyNgIEIAAgA2oiACAAKAIEQQFyNgIEDAELIAMgBUEDcjYCBCAHIARBAXI2AgQgBCAHaiAENgIAIARB/wFNBEAgBEEDdiIBQQN0QeCcAWohAAJ/QbicASgCACICQQEgAXQiAXFFBEBBuJwBIAEgAnI2AgAgAAwBCyAAKAIICyEBIAAgBzYCCCABIAc2AgwgByAANgIMIAcgATYCCAwBCyAHAn9BACAEQQh2IgBFDQAaQR8gBEH///8HSw0AGiAAIABBgP4/akEQdkEIcSIAdCIBIAFBgOAfakEQdkEEcSIBdCICIAJBgIAPakEQdkECcSICdEEPdiAAIAFyIAJyayIAQQF0IAQgAEEVanZBAXFyQRxqCyIANgIcIAdCADcCECAAQQJ0QeieAWohAQJAAkAgCEEBIAB0IgJxRQRAQbycASACIAhyNgIAIAEgBzYCAAwBCyAEQQBBGSAAQQF2ayAAQR9GG3QhACABKAIAIQUDQCAFIgEoAgRBeHEgBEYNAiAAQR12IQIgAEEBdCEAIAEgAkEEcWoiAigCECIFDQALIAIgBzYCEAsgByABNgIYIAcgBzYCDCAHIAc2AggMAQsgASgCCCIAIAc2AgwgASAHNgIIIAdBADYCGCAHIAE2AgwgByAANgIICyADQQhqIQAMAQsCQCAJRQ0AAkAgASgCHCIAQQJ0QeieAWoiAigCACABRgRAIAIgAzYCACADDQFBvJwBIApBfiAAd3E2AgAMAgsgCUEQQRQgCSgCECABRhtqIAM2AgAgA0UNAQsgAyAJNgIYIAEoAhAiAARAIAMgADYCECAAIAM2AhgLIAEoAhQiAEUNACADIAA2AhQgACADNgIYCwJAIARBD00EQCABIAQgBWoiAEEDcjYCBCAAIAFqIgAgACgCBEEBcjYCBAwBCyABIAVBA3I2AgQgCyAEQQFyNgIEIAQgC2ogBDYCACAIBEAgCEEDdiIDQQN0QeCcAWohAEHMnAEoAgAhAgJ/QQEgA3QiAyAGcUUEQEG4nAEgAyAGcjYCACAADAELIAAoAggLIQMgACACNgIIIAMgAjYCDCACIAA2AgwgAiADNgIIC0HMnAEgCzYCAEHAnAEgBDYCAAsgAUEIaiEACyAMQRBqJAAgAAuCBAEDfyACQYAETwRAIAAgASACEBMaIAAPCyAAIAJqIQMCQCAAIAFzQQNxRQRAAkAgAkEBSARAIAAhAgwBCyAAQQNxRQRAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADTw0BIAJBA3ENAAsLAkAgA0F8cSIEQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgA0F8aiIEIABJBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAs/AQF/IwBBEGsiAyQAIAMgADYCDCADIAE2AgggAyACNgIEIAMoAgwgAygCCCADKAIEENYBIQAgA0EQaiQAIAAL3QEBAX8jAEEQayIBJAAgASAANgIMAkAgASgCDEUNACABKAIMKAIwQQBLBEAgASgCDCIAIAAoAjBBf2o2AjALIAEoAgwoAjBBAEsNACABKAIMKAIgQQBLBEAgASgCDEEBNgIgIAEoAgwQMhoLIAEoAgwoAiRBAUYEQCABKAIMEGoLAkAgASgCDCgCLEUNACABKAIMLQAoQQFxDQAgASgCDCgCLCABKAIMEIIDCyABKAIMQQBCAEEFECIaIAEoAgwoAgAEQCABKAIMKAIAEBwLIAEoAgwQFgsgAUEQaiQAC4ECAQF/IwBBEGsiASQAIAEgADYCDCABIAEoAgwoAhw2AgQgASgCBBDpAiABIAEoAgQoAhQ2AgggASgCCCABKAIMKAIQSwRAIAEgASgCDCgCEDYCCAsCQCABKAIIRQ0AIAEoAgwoAgwgASgCBCgCECABKAIIEBoaIAEoAgwiACABKAIIIAAoAgxqNgIMIAEoAgQiACABKAIIIAAoAhBqNgIQIAEoAgwiACABKAIIIAAoAhRqNgIUIAEoAgwiACAAKAIQIAEoAghrNgIQIAEoAgQiACAAKAIUIAEoAghrNgIUIAEoAgQoAhQNACABKAIEIAEoAgQoAgg2AhALIAFBEGokAAtgAQF/IwBBEGsiASQAIAEgADYCCCABIAEoAghCAhAfNgIEAkAgASgCBEUEQCABQQA7AQ4MAQsgASABKAIELQAAIAEoAgQtAAFBCHRqOwEOCyABLwEOIQAgAUEQaiQAIAALWgEBfyMAQSBrIgIkACACIAA2AhwgAiABNwMQIAIgAigCHCACKQMQEM4BNgIMIAIoAgwEQCACKAIcIgAgAikDECAAKQMQfDcDEAsgAigCDCEAIAJBIGokACAAC28BAX8jAEEQayICJAAgAiAANgIIIAIgATsBBiACIAIoAghCAhAfNgIAAkAgAigCAEUEQCACQX82AgwMAQsgAigCACACLwEGOgAAIAIoAgAgAi8BBkEIdToAASACQQA2AgwLIAIoAgwaIAJBEGokAAuPAQEBfyMAQRBrIgIkACACIAA2AgggAiABNgIEIAIgAigCCEIEEB82AgACQCACKAIARQRAIAJBfzYCDAwBCyACKAIAIAIoAgQ6AAAgAigCACACKAIEQQh2OgABIAIoAgAgAigCBEEQdjoAAiACKAIAIAIoAgRBGHY6AAMgAkEANgIMCyACKAIMGiACQRBqJAALtgIBAX8jAEEwayIEJAAgBCAANgIkIAQgATYCICAEIAI3AxggBCADNgIUAkAgBCgCJCkDGEIBIAQoAhSthoNQBEAgBCgCJEEMakEcQQAQFSAEQn83AygMAQsCQCAEKAIkKAIARQRAIAQgBCgCJCgCCCAEKAIgIAQpAxggBCgCFCAEKAIkKAIEEQ8ANwMIDAELIAQgBCgCJCgCACAEKAIkKAIIIAQoAiAgBCkDGCAEKAIUIAQoAiQoAgQRDQA3AwgLIAQpAwhCAFMEQAJAIAQoAhRBBEYNACAEKAIUQQ5GDQACQCAEKAIkIARCCEEEECJCAFMEQCAEKAIkQQxqQRRBABAVDAELIAQoAiRBDGogBCgCACAEKAIEEBULCwsgBCAEKQMINwMoCyAEKQMoIQIgBEEwaiQAIAILFwAgAC0AAEEgcUUEQCABIAIgABBxGgsLUAEBfyMAQRBrIgEkACABIAA2AgwDQCABKAIMBEAgASABKAIMKAIANgIIIAEoAgwoAgwQFiABKAIMEBYgASABKAIINgIMDAELCyABQRBqJAALfQEBfyMAQRBrIgEkACABIAA2AgwgASgCDARAIAFCADcDAANAIAEpAwAgASgCDCkDCFpFBEAgASgCDCgCACABKQMAp0EEdGoQYiABIAEpAwBCAXw3AwAMAQsLIAEoAgwoAgAQFiABKAIMKAIoECYgASgCDBAWCyABQRBqJAALPgEBfyMAQRBrIgEkACABIAA2AgwgASgCDARAIAEoAgwoAgAQFiABKAIMKAIMEBYgASgCDBAWCyABQRBqJAALbgEBfyMAQYACayIFJAACQCACIANMDQAgBEGAwARxDQAgBSABQf8BcSACIANrIgJBgAIgAkGAAkkiARsQMyABRQRAA0AgACAFQYACECMgAkGAfmoiAkH/AUsNAAsLIAAgBSACECMLIAVBgAJqJAAL1AEBAX8jAEEwayIDJAAgAyAANgIoIAMgATcDICADIAI2AhwCQCADKAIoLQAoQQFxBEAgA0F/NgIsDAELAkAgAygCKCgCIEEASwRAIAMoAhxFDQEgAygCHEEBRg0BIAMoAhxBAkYNAQsgAygCKEEMakESQQAQFSADQX82AiwMAQsgAyADKQMgNwMIIAMgAygCHDYCECADKAIoIANBCGpCEEEGECJCAFMEQCADQX82AiwMAQsgAygCKEEAOgA0IANBADYCLAsgAygCLCEAIANBMGokACAAC7gIAQF/IwBBMGsiBCQAIAQgADYCLCAEIAE2AiggBCACNgIkIAQgAzYCICAEQQA2AhQCQCAEKAIsKAKEAUEASgRAIAQoAiwoAgAoAixBAkYEQCAEKAIsEOcCIQAgBCgCLCgCACAANgIsCyAEKAIsIAQoAixBmBZqEHYgBCgCLCAEKAIsQaQWahB2IAQgBCgCLBDmAjYCFCAEIAQoAiwoAqgtQQpqQQN2NgIcIAQgBCgCLCgCrC1BCmpBA3Y2AhggBCgCGCAEKAIcTQRAIAQgBCgCGDYCHAsMAQsgBCAEKAIkQQVqIgA2AhggBCAANgIcCwJAAkAgBCgCJEEEaiAEKAIcSw0AIAQoAihFDQAgBCgCLCAEKAIoIAQoAiQgBCgCIBBXDAELAkACQCAEKAIsKAKIAUEERwRAIAQoAhggBCgCHEcNAQsgBEEDNgIQAkAgBCgCLCgCvC1BECAEKAIQa0oEQCAEIAQoAiBBAmo2AgwgBCgCLCIAIAAvAbgtIAQoAgxB//8DcSAEKAIsKAK8LXRyOwG4LSAEKAIsLwG4LUH/AXEhASAEKAIsKAIIIQIgBCgCLCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAIsLwG4LUEIdSEBIAQoAiwoAgghAiAEKAIsIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAiwgBCgCDEH//wNxQRAgBCgCLCgCvC1rdTsBuC0gBCgCLCIAIAAoArwtIAQoAhBBEGtqNgK8LQwBCyAEKAIsIgAgAC8BuC0gBCgCIEECakH//wNxIAQoAiwoArwtdHI7AbgtIAQoAiwiACAEKAIQIAAoArwtajYCvC0LIAQoAixBwNsAQcDkABC1AQwBCyAEQQM2AggCQCAEKAIsKAK8LUEQIAQoAghrSgRAIAQgBCgCIEEEajYCBCAEKAIsIgAgAC8BuC0gBCgCBEH//wNxIAQoAiwoArwtdHI7AbgtIAQoAiwvAbgtQf8BcSEBIAQoAiwoAgghAiAEKAIsIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAiwvAbgtQQh1IQEgBCgCLCgCCCECIAQoAiwiAygCFCEAIAMgAEEBajYCFCAAIAJqIAE6AAAgBCgCLCAEKAIEQf//A3FBECAEKAIsKAK8LWt1OwG4LSAEKAIsIgAgACgCvC0gBCgCCEEQa2o2ArwtDAELIAQoAiwiACAALwG4LSAEKAIgQQRqQf//A3EgBCgCLCgCvC10cjsBuC0gBCgCLCIAIAQoAgggACgCvC1qNgK8LQsgBCgCLCAEKAIsKAKcFkEBaiAEKAIsKAKoFkEBaiAEKAIUQQFqEOUCIAQoAiwgBCgCLEGUAWogBCgCLEGIE2oQtQELCyAEKAIsELkBIAQoAiAEQCAEKAIsELgBCyAEQTBqJAAL1AEBAX8jAEEgayICJAAgAiAANgIYIAIgATcDECACIAIoAhhFOgAPAkAgAigCGEUEQCACIAIpAxCnEBkiADYCGCAARQRAIAJBADYCHAwCCwsgAkEYEBkiADYCCCAARQRAIAItAA9BAXEEQCACKAIYEBYLIAJBADYCHAwBCyACKAIIQQE6AAAgAigCCCACKAIYNgIEIAIoAgggAikDEDcDCCACKAIIQgA3AxAgAigCCCACLQAPQQFxOgABIAIgAigCCDYCHAsgAigCHCEAIAJBIGokACAAC3gBAX8jAEEQayIBJAAgASAANgIIIAEgASgCCEIEEB82AgQCQCABKAIERQRAIAFBADYCDAwBCyABIAEoAgQtAAAgASgCBC0AASABKAIELQACIAEoAgQtAANBCHRqQQh0akEIdGo2AgwLIAEoAgwhACABQRBqJAAgAAuQAQEDfyAAIQECQAJAIABBA3FFDQAgAC0AAEUEQEEADwsDQCABQQFqIgFBA3FFDQEgAS0AAA0ACwwBCwNAIAEiAkEEaiEBIAIoAgAiA0F/cyADQf/9+3dqcUGAgYKEeHFFDQALIANB/wFxRQRAIAIgAGsPCwNAIAItAAEhAyACQQFqIgEhAiADDQALCyABIABrC2EBAX8jAEEQayICIAA2AgggAiABNwMAAkAgAikDACACKAIIKQMIVgRAIAIoAghBADoAACACQX82AgwMAQsgAigCCEEBOgAAIAIoAgggAikDADcDECACQQA2AgwLIAIoAgwL7wEBAX8jAEEgayICJAAgAiAANgIYIAIgATcDECACIAIoAhhCCBAfNgIMAkAgAigCDEUEQCACQX82AhwMAQsgAigCDCACKQMQQv8BgzwAACACKAIMIAIpAxBCCIhC/wGDPAABIAIoAgwgAikDEEIQiEL/AYM8AAIgAigCDCACKQMQQhiIQv8BgzwAAyACKAIMIAIpAxBCIIhC/wGDPAAEIAIoAgwgAikDEEIoiEL/AYM8AAUgAigCDCACKQMQQjCIQv8BgzwABiACKAIMIAIpAxBCOIhC/wGDPAAHIAJBADYCHAsgAigCHBogAkEgaiQAC4sDAQF/IwBBMGsiAyQAIAMgADYCJCADIAE2AiAgAyACNwMYAkAgAygCJC0AKEEBcQRAIANCfzcDKAwBCwJAAkAgAygCJCgCIEEATQ0AIAMpAxhC////////////AFYNACADKQMYQgBYDQEgAygCIA0BCyADKAIkQQxqQRJBABAVIANCfzcDKAwBCyADKAIkLQA1QQFxBEAgA0J/NwMoDAELAn8jAEEQayIAIAMoAiQ2AgwgACgCDC0ANEEBcQsEQCADQgA3AygMAQsgAykDGFAEQCADQgA3AygMAQsgA0IANwMQA0AgAykDECADKQMYVARAIAMgAygCJCADKAIgIAMpAxCnaiADKQMYIAMpAxB9QQEQIiICNwMIIAJCAFMEQCADKAIkQQE6ADUgAykDEFAEQCADQn83AygMBAsgAyADKQMQNwMoDAMLIAMpAwhQBEAgAygCJEEBOgA0BSADIAMpAwggAykDEHw3AxAMAgsLCyADIAMpAxA3AygLIAMpAyghAiADQTBqJAAgAgs2AQF/IwBBEGsiASAANgIMAn4gASgCDC0AAEEBcQRAIAEoAgwpAwggASgCDCkDEH0MAQtCAAsLsgECAX8BfiMAQRBrIgEkACABIAA2AgQgASABKAIEQggQHzYCAAJAIAEoAgBFBEAgAUIANwMIDAELIAEgASgCAC0AAK0gASgCAC0AB61COIYgASgCAC0ABq1CMIZ8IAEoAgAtAAWtQiiGfCABKAIALQAErUIghnwgASgCAC0AA61CGIZ8IAEoAgAtAAKtQhCGfCABKAIALQABrUIIhnx8NwMICyABKQMIIQIgAUEQaiQAIAILqAEBAX8jAEEQayIBJAAgASAANgIIAkAgASgCCCgCIEEATQRAIAEoAghBDGpBEkEAEBUgAUF/NgIMDAELIAEoAggiACAAKAIgQX9qNgIgIAEoAggoAiBFBEAgASgCCEEAQgBBAhAiGiABKAIIKAIABEAgASgCCCgCABAyQQBIBEAgASgCCEEMakEUQQAQFQsLCyABQQA2AgwLIAEoAgwhACABQRBqJAAgAAvxAgICfwF+AkAgAkUNACAAIAJqIgNBf2ogAToAACAAIAE6AAAgAkEDSQ0AIANBfmogAToAACAAIAE6AAEgA0F9aiABOgAAIAAgAToAAiACQQdJDQAgA0F8aiABOgAAIAAgAToAAyACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiADYCACADIAIgBGtBfHEiAmoiAUF8aiAANgIAIAJBCUkNACADIAA2AgggAyAANgIEIAFBeGogADYCACABQXRqIAA2AgAgAkEZSQ0AIAMgADYCGCADIAA2AhQgAyAANgIQIAMgADYCDCABQXBqIAA2AgAgAUFsaiAANgIAIAFBaGogADYCACABQWRqIAA2AgAgAiADQQRxQRhyIgFrIgJBIEkNACAArSIFQiCGIAWEIQUgASADaiEBA0AgASAFNwMYIAEgBTcDECABIAU3AwggASAFNwMAIAFBIGohASACQWBqIgJBH0sNAAsLC9wBAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDCgCKARAIAEoAgwoAihBADYCKCABKAIMKAIoQgA3AyAgASgCDAJ+IAEoAgwpAxggASgCDCkDIFYEQCABKAIMKQMYDAELIAEoAgwpAyALNwMYCyABIAEoAgwpAxg3AwADQCABKQMAIAEoAgwpAwhaRQRAIAEoAgwoAgAgASkDAKdBBHRqKAIAEBYgASABKQMAQgF8NwMADAELCyABKAIMKAIAEBYgASgCDCgCBBAWIAEoAgwQFgsgAUEQaiQAC2ACAX8BfiMAQRBrIgEkACABIAA2AgQCQCABKAIEKAIkQQFHBEAgASgCBEEMakESQQAQFSABQn83AwgMAQsgASABKAIEQQBCAEENECI3AwgLIAEpAwghAiABQRBqJAAgAgugAQEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjcDCCADIAMoAhgoAgAgAygCFCADKQMIEMsBIgI3AwACQCACQgBTBEAgAygCGEEIaiADKAIYKAIAEBggA0F/NgIcDAELIAMpAwAgAykDCFIEQCADKAIYQQhqQQZBGxAVIANBfzYCHAwBCyADQQA2AhwLIAMoAhwhACADQSBqJAAgAAtrAQF/IwBBIGsiAiAANgIcIAJCASACKAIcrYY3AxAgAkEMaiABNgIAA0AgAiACKAIMIgBBBGo2AgwgAiAAKAIANgIIIAIoAghBAEhFBEAgAiACKQMQQgEgAigCCK2GhDcDEAwBCwsgAikDEAsvAQF/IwBBEGsiASQAIAEgADYCDCABKAIMKAIIEBYgASgCDEEANgIIIAFBEGokAAvNAQEBfyMAQRBrIgIkACACIAA2AgggAiABNgIEAkAgAigCCC0AKEEBcQRAIAJBfzYCDAwBCyACKAIERQRAIAIoAghBDGpBEkEAEBUgAkF/NgIMDAELIAIoAgQQPCACKAIIKAIABEAgAigCCCgCACACKAIEEDlBAEgEQCACKAIIQQxqIAIoAggoAgAQGCACQX82AgwMAgsLIAIoAgggAigCBEI4QQMQIkIAUwRAIAJBfzYCDAwBCyACQQA2AgwLIAIoAgwhACACQRBqJAAgAAsxAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDBBcIAEoAgwQFgsgAUEQaiQAC98EAQF/IwBBIGsiAiAANgIYIAIgATYCFAJAIAIoAhhFBEAgAkEBNgIcDAELIAIgAigCGCgCADYCDAJAIAIoAhgoAggEQCACIAIoAhgoAgg2AhAMAQsgAkEBNgIQIAJBADYCCANAAkAgAigCCCACKAIYLwEETw0AAkAgAigCDCACKAIIai0AAEEfSgRAIAIoAgwgAigCCGotAABBgAFIDQELIAIoAgwgAigCCGotAABBDUYNACACKAIMIAIoAghqLQAAQQpGDQAgAigCDCACKAIIai0AAEEJRgRADAELIAJBAzYCEAJAIAIoAgwgAigCCGotAABB4AFxQcABRgRAIAJBATYCAAwBCwJAIAIoAgwgAigCCGotAABB8AFxQeABRgRAIAJBAjYCAAwBCwJAIAIoAgwgAigCCGotAABB+AFxQfABRgRAIAJBAzYCAAwBCyACQQQ2AhAMBAsLCyACKAIIIAIoAgBqIAIoAhgvAQRPBEAgAkEENgIQDAILIAJBATYCBANAIAIoAgQgAigCAE0EQCACKAIMIAIoAgggAigCBGpqLQAAQcABcUGAAUcEQCACQQQ2AhAMBgUgAiACKAIEQQFqNgIEDAILAAsLIAIgAigCACACKAIIajYCCAsgAiACKAIIQQFqNgIIDAELCwsgAigCGCACKAIQNgIIIAIoAhQEQAJAIAIoAhRBAkcNACACKAIQQQNHDQAgAkECNgIQIAIoAhhBAjYCCAsCQCACKAIUIAIoAhBGDQAgAigCEEEBRg0AIAJBBTYCHAwCCwsgAiACKAIQNgIcCyACKAIcC2oBAX8jAEEQayIBIAA2AgwgASgCDEIANwMAIAEoAgxBADYCCCABKAIMQn83AxAgASgCDEEANgIsIAEoAgxBfzYCKCABKAIMQgA3AxggASgCDEIANwMgIAEoAgxBADsBMCABKAIMQQA7ATILbwEBfwJAIABBA2pBfHEiAUEBTkEAAn9BqKABKAIAIgBFBEBBqKABQdChwQI2AgBB0KHBAiEACyAAIAFqIgEgAE0LGw0AIAE/AEEQdEsEQCABEBRFDQELQaigASABNgIAIAAPC0G0nAFBMDYCAEF/Cz8BAX8jAEEQayIDJAAgAyAANgIMIAMgATYCCCADIAI2AgQgAygCDCADKAIIIAMoAgQQ6wIhACADQRBqJAAgAAuqAgEBfyMAQRBrIgEkACABIAA2AgwgASgCDARAIAEoAgwoAgAEQCABKAIMKAIAEDIaIAEoAgwoAgAQHAsgASgCDCgCHBAWIAEoAgwoAiAQJiABKAIMKAIkECYgASgCDCgCUBCAAyABKAIMKAJABEAgAUIANwMAA0AgASkDACABKAIMKQMwWkUEQCABKAIMKAJAIAEpAwCnQQR0ahBiIAEgASkDAEIBfDcDAAwBCwsgASgCDCgCQBAWCyABQgA3AwADQCABKQMAIAEoAgwoAkStWkUEQCABKAIMKAJMIAEpAwCnQQJ0aigCABCDAyABIAEpAwBCAXw3AwAMAQsLIAEoAgwoAkwQFiABKAIMKAJUEPoCIAEoAgxBCGoQOCABKAIMEBYLIAFBEGokAAtvAQF/IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNgIQIAMgAygCGCADKAIQrRAfNgIMAkAgAygCDEUEQCADQX82AhwMAQsgAygCDCADKAIUIAMoAhAQGhogA0EANgIcCyADKAIcGiADQSBqJAALogEBAX8jAEEgayIEJAAgBCAANgIYIAQgATcDECAEIAI2AgwgBCADNgIIIAQgBCgCDCAEKQMQECoiADYCBAJAIABFBEAgBCgCCEEOQQAQFSAEQQA2AhwMAQsgBCgCGCAEKAIEKAIEIAQpAxAgBCgCCBBhQQBIBEAgBCgCBBAXIARBADYCHAwBCyAEIAQoAgQ2AhwLIAQoAhwhACAEQSBqJAAgAAugAQEBfyMAQSBrIgMkACADIAA2AhQgAyABNgIQIAMgAjcDCCADIAMoAhA2AgQCQCADKQMIQghUBEAgA0J/NwMYDAELIwBBEGsiACADKAIUNgIMIAAoAgwoAgAhACADKAIEIAA2AgAjAEEQayIAIAMoAhQ2AgwgACgCDCgCBCEAIAMoAgQgADYCBCADQgg3AxgLIAMpAxghAiADQSBqJAAgAguDAQIDfwF+AkAgAEKAgICAEFQEQCAAIQUMAQsDQCABQX9qIgEgACAAQgqAIgVCCn59p0EwcjoAACAAQv////+fAVYhAiAFIQAgAg0ACwsgBaciAgRAA0AgAUF/aiIBIAIgAkEKbiIDQQpsa0EwcjoAACACQQlLIQQgAyECIAQNAAsLIAELPwEBfyMAQRBrIgIgADYCDCACIAE2AgggAigCDARAIAIoAgwgAigCCCgCADYCACACKAIMIAIoAggoAgQ2AgQLC7wCAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE3AxAgBCACNgIMIAQgAzYCCCAEKAIIRQRAIAQgBCgCGEEIajYCCAsCQCAEKQMQIAQoAhgpAzBaBEAgBCgCCEESQQAQFSAEQQA2AhwMAQsCQCAEKAIMQQhxRQRAIAQoAhgoAkAgBCkDEKdBBHRqKAIEDQELIAQoAhgoAkAgBCkDEKdBBHRqKAIARQRAIAQoAghBEkEAEBUgBEEANgIcDAILAkAgBCgCGCgCQCAEKQMQp0EEdGotAAxBAXFFDQAgBCgCDEEIcQ0AIAQoAghBF0EAEBUgBEEANgIcDAILIAQgBCgCGCgCQCAEKQMQp0EEdGooAgA2AhwMAQsgBCAEKAIYKAJAIAQpAxCnQQR0aigCBDYCHAsgBCgCHCEAIARBIGokACAAC4QBAQF/IwBBEGsiASQAIAEgADYCCCABQdgAEBkiADYCBAJAIABFBEAgAUEANgIMDAELAkAgASgCCARAIAEoAgQgASgCCEHYABAaGgwBCyABKAIEEF0LIAEoAgRBADYCACABKAIEQQE6AAUgASABKAIENgIMCyABKAIMIQAgAUEQaiQAIAAL1AIBAX8jAEEgayIEJAAgBCAANgIYIAQgATYCFCAEIAI2AhAgBCADNgIMAkAgBCgCGEUEQCAEKAIUBEAgBCgCFEEANgIACyAEQbDTADYCHAwBCyAEKAIQQcAAcUUEQCAEKAIYKAIIRQRAIAQoAhhBABA7GgsCQAJAAkAgBCgCEEGAAXFFDQAgBCgCGCgCCEEBRg0AIAQoAhgoAghBAkcNAQsgBCgCGCgCCEEERw0BCyAEKAIYKAIMRQRAIAQoAhgoAgAgBCgCGC8BBCAEKAIYQRBqIAQoAgwQ0gEhACAEKAIYIAA2AgwgAEUEQCAEQQA2AhwMBAsLIAQoAhQEQCAEKAIUIAQoAhgoAhA2AgALIAQgBCgCGCgCDDYCHAwCCwsgBCgCFARAIAQoAhQgBCgCGC8BBDYCAAsgBCAEKAIYKAIANgIcCyAEKAIcIQAgBEEgaiQAIAALOQEBfyMAQRBrIgEgADYCDEEAIQAgASgCDC0AAEEBcQR/IAEoAgwpAxAgASgCDCkDCFEFQQALQQFxC/ICAQF/IwBBEGsiASQAIAEgADYCCAJAIAEoAggtAChBAXEEQCABQX82AgwMAQsgASgCCCgCJEEDRgRAIAEoAghBDGpBF0EAEBUgAUF/NgIMDAELAkAgASgCCCgCIEEASwRAAn8jAEEQayIAIAEoAgg2AgwgACgCDCkDGELAAINQCwRAIAEoAghBDGpBHUEAEBUgAUF/NgIMDAMLDAELIAEoAggoAgAEQCABKAIIKAIAEElBAEgEQCABKAIIQQxqIAEoAggoAgAQGCABQX82AgwMAwsLIAEoAghBAEIAQQAQIkIAUwRAIAEoAggoAgAEQCABKAIIKAIAEDIaCyABQX82AgwMAgsLIAEoAghBADoANCABKAIIQQA6ADUjAEEQayIAIAEoAghBDGo2AgwgACgCDARAIAAoAgxBADYCACAAKAIMQQA2AgQLIAEoAggiACAAKAIgQQFqNgIgIAFBADYCDAsgASgCDCEAIAFBEGokACAAC3cCAX8BfiMAQRBrIgEkACABIAA2AgQCQCABKAIELQAoQQFxBEAgAUJ/NwMIDAELIAEoAgQoAiBBAE0EQCABKAIEQQxqQRJBABAVIAFCfzcDCAwBCyABIAEoAgRBAEIAQQcQIjcDCAsgASkDCCECIAFBEGokACACC50BAQF/IwBBEGsiASAANgIIAkACQAJAIAEoAghFDQAgASgCCCgCIEUNACABKAIIKAIkDQELIAFBATYCDAwBCyABIAEoAggoAhw2AgQCQAJAIAEoAgRFDQAgASgCBCgCACABKAIIRw0AIAEoAgQoAgRBtP4ASQ0AIAEoAgQoAgRB0/4ATQ0BCyABQQE2AgwMAQsgAUEANgIMCyABKAIMC4ABAQN/IwBBEGsiAiAANgIMIAIgATYCCCACKAIIQQh2IQEgAigCDCgCCCEDIAIoAgwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AAAgAigCCEH/AXEhASACKAIMKAIIIQMgAigCDCICKAIUIQAgAiAAQQFqNgIUIAAgA2ogAToAAAuCAQECfyAARQRAIAEQGQ8LIAFBQE8EQEG0nAFBMDYCAEEADwsgAEF4akEQIAFBC2pBeHEgAUELSRsQ7gIiAgRAIAJBCGoPCyABEBkiAkUEQEEADwsgAiAAQXxBeCAAQXxqKAIAIgNBA3EbIANBeHFqIgMgASADIAFJGxAaGiAAEBYgAgubBQEBfyMAQUBqIgQkACAEIAA2AjggBCABNwMwIAQgAjYCLCAEIAM2AiggBEHIABAZIgA2AiQCQCAARQRAIARBADYCPAwBCyAEKAIkQgA3AzggBCgCJEIANwMYIAQoAiRCADcDMCAEKAIkQQA2AgAgBCgCJEEANgIEIAQoAiRCADcDCCAEKAIkQgA3AxAgBCgCJEEANgIoIAQoAiRCADcDIAJAIAQpAzBQBEBBCBAZIQAgBCgCJCAANgIEIABFBEAgBCgCJBAWIAQoAihBDkEAEBUgBEEANgI8DAMLIAQoAiQoAgRCADcDAAwBCyAEKAIkIAQpAzBBABC9AUEBcUUEQCAEKAIoQQ5BABAVIAQoAiQQNCAEQQA2AjwMAgsgBEIANwMIIARCADcDGCAEQgA3AxADQCAEKQMYIAQpAzBUBEAgBCgCOCAEKQMYp0EEdGopAwhQRQRAIAQoAjggBCkDGKdBBHRqKAIARQRAIAQoAihBEkEAEBUgBCgCJBA0IARBADYCPAwFCyAEKAIkKAIAIAQpAxCnQQR0aiAEKAI4IAQpAxinQQR0aigCADYCACAEKAIkKAIAIAQpAxCnQQR0aiAEKAI4IAQpAxinQQR0aikDCDcDCCAEKAIkKAIEIAQpAxinQQN0aiAEKQMINwMAIAQgBCgCOCAEKQMYp0EEdGopAwggBCkDCHw3AwggBCAEKQMQQgF8NwMQCyAEIAQpAxhCAXw3AxgMAQsLIAQoAiQgBCkDEDcDCCAEKAIkAn5CACAEKAIsDQAaIAQoAiQpAwgLNwMYIAQoAiQoAgQgBCgCJCkDCKdBA3RqIAQpAwg3AwAgBCgCJCAEKQMINwMwCyAEIAQoAiQ2AjwLIAQoAjwhACAEQUBrJAAgAAueAQEBfyMAQSBrIgQkACAEIAA2AhggBCABNwMQIAQgAjYCDCAEIAM2AgggBCAEKAIYIAQpAxAgBCgCDCAEKAIIEEUiADYCBAJAIABFBEAgBEEANgIcDAELIAQgBCgCBCgCMEEAIAQoAgwgBCgCCBBHIgA2AgAgAEUEQCAEQQA2AhwMAQsgBCAEKAIANgIcCyAEKAIcIQAgBEEgaiQAIAAL2gEBAX8jAEEgayIEJAAgBCAAOwEaIAQgATsBGCAEIAI2AhQgBCADNgIQIARBEBAZIgA2AgwCQCAARQRAIARBADYCHAwBCyAEKAIMQQA2AgAgBCgCDCAEKAIQNgIEIAQoAgwgBC8BGjsBCCAEKAIMIAQvARg7AQoCQCAELwEYQQBKBEAgBCgCFCAELwEYEMkBIQAgBCgCDCAANgIMIABFBEAgBCgCDBAWIARBADYCHAwDCwwBCyAEKAIMQQA2AgwLIAQgBCgCDDYCHAsgBCgCHCEAIARBIGokACAAC4wDAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE7ARYgBCACNgIQIAQgAzYCDAJAIAQvARZFBEAgBEEANgIcDAELAkACQAJAAkAgBCgCEEGAMHEiAARAIABBgBBGDQEgAEGAIEYNAgwDCyAEQQA2AgQMAwsgBEECNgIEDAILIARBBDYCBAwBCyAEKAIMQRJBABAVIARBADYCHAwBCyAEQRQQGSIANgIIIABFBEAgBCgCDEEOQQAQFSAEQQA2AhwMAQsgBC8BFkEBahAZIQAgBCgCCCAANgIAIABFBEAgBCgCCBAWIARBADYCHAwBCyAEKAIIKAIAIAQoAhggBC8BFhAaGiAEKAIIKAIAIAQvARZqQQA6AAAgBCgCCCAELwEWOwEEIAQoAghBADYCCCAEKAIIQQA2AgwgBCgCCEEANgIQIAQoAgQEQCAEKAIIIAQoAgQQO0EFRgRAIAQoAggQJiAEKAIMQRJBABAVIARBADYCHAwCCwsgBCAEKAIINgIcCyAEKAIcIQAgBEEgaiQAIAALNwEBfyMAQRBrIgEgADYCCAJAIAEoAghFBEAgAUEAOwEODAELIAEgASgCCC8BBDsBDgsgAS8BDgtDAQN/AkAgAkUNAANAIAAtAAAiBCABLQAAIgVGBEAgAUEBaiEBIABBAWohACACQX9qIgINAQwCCwsgBCAFayEDCyADC5YBAQV/IAAoAkxBAE4EQEEBIQMLIAAoAgBBAXEiBEUEQCAAKAI0IgEEQCABIAAoAjg2AjgLIAAoAjgiAgRAIAIgATYCNAsgAEGwoQEoAgBGBEBBsKEBIAI2AgALCyAAEJsBIQEgACAAKAIMEQAAIQIgACgCYCIFBEAgBRAWCwJAIARFBEAgABAWDAELIANFDQALIAEgAnILjgMCAX8BfiMAQTBrIgQkACAEIAA2AiQgBCABNgIgIAQgAjYCHCAEIAM2AhgCQCAEKAIkRQRAIARCfzcDKAwBCyAEKAIgRQRAIAQoAhhBEkEAEBUgBEJ/NwMoDAELIAQoAhxBgyBxBEAgBEEYQRkgBCgCHEEBcRs2AhQgBEIANwMAA0AgBCkDACAEKAIkKQMwVARAIAQgBCgCJCAEKQMAIAQoAhwgBCgCGBBPNgIQIAQoAhAEQCAEKAIcQQJxBEAgBCAEKAIQIgAgABAsQQFqEKECNgIMIAQoAgwEQCAEIAQoAgxBAWo2AhALCyAEKAIgIAQoAhAgBCgCFBECAEUEQCMAQRBrIgAgBCgCGDYCDCAAKAIMBEAgACgCDEEANgIAIAAoAgxBADYCBAsgBCAEKQMANwMoDAULCyAEIAQpAwBCAXw3AwAMAQsLIAQoAhhBCUEAEBUgBEJ/NwMoDAELIAQgBCgCJCgCUCAEKAIgIAQoAhwgBCgCGBD+AjcDKAsgBCkDKCEFIARBMGokACAFC9AHAQF/IwBBIGsiASQAIAEgADYCHCABIAEoAhwoAiw2AhADQCABIAEoAhwoAjwgASgCHCgCdGsgASgCHCgCbGs2AhQgASgCHCgCbCABKAIQIAEoAhwoAixBhgJrak8EQCABKAIcKAI4IAEoAhwoAjggASgCEGogASgCECABKAIUaxAaGiABKAIcIgAgACgCcCABKAIQazYCcCABKAIcIgAgACgCbCABKAIQazYCbCABKAIcIgAgACgCXCABKAIQazYCXCABKAIcENwCIAEgASgCECABKAIUajYCFAsgASgCHCgCACgCBARAIAEgASgCHCgCACABKAIcKAJ0IAEoAhwoAjggASgCHCgCbGpqIAEoAhQQczYCGCABKAIcIgAgASgCGCAAKAJ0ajYCdCABKAIcKAJ0IAEoAhwoArQtakEDTwRAIAEgASgCHCgCbCABKAIcKAK0LWs2AgwgASgCHCABKAIcKAI4IAEoAgxqLQAANgJIIAEoAhwgASgCHCgCVCABKAIcKAI4IAEoAgxBAWpqLQAAIAEoAhwoAkggASgCHCgCWHRzcTYCSANAIAEoAhwoArQtBEAgASgCHCABKAIcKAJUIAEoAhwoAjggASgCDEECamotAAAgASgCHCgCSCABKAIcKAJYdHNxNgJIIAEoAhwoAkAgASgCDCABKAIcKAI0cUEBdGogASgCHCgCRCABKAIcKAJIQQF0ai8BADsBACABKAIcKAJEIAEoAhwoAkhBAXRqIAEoAgw7AQAgASABKAIMQQFqNgIMIAEoAhwiACAAKAK0LUF/ajYCtC0gASgCHCgCdCABKAIcKAK0LWpBA08NAQsLC0EAIQAgASgCHCgCdEGGAkkEfyABKAIcKAIAKAIEQQBHBUEAC0EBcQ0BCwsgASgCHCgCwC0gASgCHCgCPEkEQCABIAEoAhwoAmwgASgCHCgCdGo2AggCQCABKAIcKALALSABKAIISQRAIAEgASgCHCgCPCABKAIIazYCBCABKAIEQYICSwRAIAFBggI2AgQLIAEoAhwoAjggASgCCGpBACABKAIEEDMgASgCHCABKAIIIAEoAgRqNgLALQwBCyABKAIcKALALSABKAIIQYICakkEQCABIAEoAghBggJqIAEoAhwoAsAtazYCBCABKAIEIAEoAhwoAjwgASgCHCgCwC1rSwRAIAEgASgCHCgCPCABKAIcKALALWs2AgQLIAEoAhwoAjggASgCHCgCwC1qQQAgASgCBBAzIAEoAhwiACABKAIEIAAoAsAtajYCwC0LCwsgAUEgaiQAC4YFAQF/IwBBIGsiBCQAIAQgADYCHCAEIAE2AhggBCACNgIUIAQgAzYCECAEQQM2AgwCQCAEKAIcKAK8LUEQIAQoAgxrSgRAIAQgBCgCEDYCCCAEKAIcIgAgAC8BuC0gBCgCCEH//wNxIAQoAhwoArwtdHI7AbgtIAQoAhwvAbgtQf8BcSEBIAQoAhwoAgghAiAEKAIcIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAhwvAbgtQQh1IQEgBCgCHCgCCCECIAQoAhwiAygCFCEAIAMgAEEBajYCFCAAIAJqIAE6AAAgBCgCHCAEKAIIQf//A3FBECAEKAIcKAK8LWt1OwG4LSAEKAIcIgAgACgCvC0gBCgCDEEQa2o2ArwtDAELIAQoAhwiACAALwG4LSAEKAIQQf//A3EgBCgCHCgCvC10cjsBuC0gBCgCHCIAIAQoAgwgACgCvC1qNgK8LQsgBCgCHBC4ASAEKAIUQf8BcSEBIAQoAhwoAgghAiAEKAIcIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAhRB//8DcUEIdSEBIAQoAhwoAgghAiAEKAIcIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAhRBf3NB/wFxIQEgBCgCHCgCCCECIAQoAhwiAygCFCEAIAMgAEEBajYCFCAAIAJqIAE6AAAgBCgCFEF/c0H//wNxQQh1IQEgBCgCHCgCCCECIAQoAhwiAygCFCEAIAMgAEEBajYCFCAAIAJqIAE6AAAgBCgCHCgCCCAEKAIcKAIUaiAEKAIYIAQoAhQQGhogBCgCHCIAIAQoAhQgACgCFGo2AhQgBEEgaiQAC/kBAQF/IwBBIGsiAiQAIAIgADYCHCACIAE5AxACQCACKAIcRQ0AIAICfAJ8IAIrAxBEAAAAAAAAAABkBEAgAisDEAwBC0QAAAAAAAAAAAtEAAAAAAAA8D9jBEACfCACKwMQRAAAAAAAAAAAZARAIAIrAxAMAQtEAAAAAAAAAAALDAELRAAAAAAAAPA/CyACKAIcKwMoIAIoAhwrAyChoiACKAIcKwMgoDkDCCACKwMIIAIoAhwrAxihIAIoAhwrAxBkRQ0AIAIoAhwoAgAgAisDCCACKAIcKAIMIAIoAhwoAgQRGgAgAigCHCACKwMIOQMYCyACQSBqJAAL1AMBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhACQAJAIAMoAhgEQCADKAIUDQELIAMoAhBBEkEAEBUgA0EAOgAfDAELIAMoAhgpAwhCAFYEQCADIAMoAhQQfDYCDCADIAMoAgwgAygCGCgCAHA2AgggA0EANgIAIAMgAygCGCgCECADKAIIQQJ0aigCADYCBANAIAMoAgQEQAJAIAMoAgQoAhwgAygCDEcNACADKAIUIAMoAgQoAgAQWw0AAkAgAygCBCkDCEJ/UQRAAkAgAygCAARAIAMoAgAgAygCBCgCGDYCGAwBCyADKAIYKAIQIAMoAghBAnRqIAMoAgQoAhg2AgALIAMoAgQQFiADKAIYIgAgACkDCEJ/fDcDCAJAIAMoAhgiACkDCLogACgCALhEexSuR+F6hD+iY0UNACADKAIYKAIAQYACTQ0AIAMoAhggAygCGCgCAEEBdiADKAIQEFpBAXFFBEAgA0EAOgAfDAgLCwwBCyADKAIEQn83AxALIANBAToAHwwECyADIAMoAgQ2AgAgAyADKAIEKAIYNgIEDAELCwsgAygCEEEJQQAQFSADQQA6AB8LIAMtAB9BAXEhACADQSBqJAAgAAvfAgEBfyMAQTBrIgMkACADIAA2AiggAyABNgIkIAMgAjYCIAJAIAMoAiQgAygCKCgCAEYEQCADQQE6AC8MAQsgAyADKAIkQQQQeyIANgIcIABFBEAgAygCIEEOQQAQFSADQQA6AC8MAQsgAygCKCkDCEIAVgRAIANBADYCGANAIAMoAhggAygCKCgCAE9FBEAgAyADKAIoKAIQIAMoAhhBAnRqKAIANgIUA0AgAygCFARAIAMgAygCFCgCGDYCECADIAMoAhQoAhwgAygCJHA2AgwgAygCFCADKAIcIAMoAgxBAnRqKAIANgIYIAMoAhwgAygCDEECdGogAygCFDYCACADIAMoAhA2AhQMAQsLIAMgAygCGEEBajYCGAwBCwsLIAMoAigoAhAQFiADKAIoIAMoAhw2AhAgAygCKCADKAIkNgIAIANBAToALwsgAy0AL0EBcSEAIANBMGokACAAC00BAn8gAS0AACECAkAgAC0AACIDRQ0AIAIgA0cNAANAIAEtAAEhAiAALQABIgNFDQEgAUEBaiEBIABBAWohACACIANGDQALCyADIAJrC4kCAQF/IwBBEGsiASQAIAEgADYCDAJAIAEoAgwtAAVBAXEEQCABKAIMKAIAQQJxRQ0BCyABKAIMKAIwECYgASgCDEEANgIwCwJAIAEoAgwtAAVBAXEEQCABKAIMKAIAQQhxRQ0BCyABKAIMKAI0ECQgASgCDEEANgI0CwJAIAEoAgwtAAVBAXEEQCABKAIMKAIAQQRxRQ0BCyABKAIMKAI4ECYgASgCDEEANgI4CwJAIAEoAgwtAAVBAXEEQCABKAIMKAIAQYABcUUNAQsgASgCDCgCVARAIAEoAgwoAlRBACABKAIMKAJUECwQMwsgASgCDCgCVBAWIAEoAgxBADYCVAsgAUEQaiQAC/EBAQF/IwBBEGsiASAANgIMIAEoAgxBADYCACABKAIMQQA6AAQgASgCDEEAOgAFIAEoAgxBAToABiABKAIMQb8GOwEIIAEoAgxBCjsBCiABKAIMQQA7AQwgASgCDEF/NgIQIAEoAgxBADYCFCABKAIMQQA2AhggASgCDEIANwMgIAEoAgxCADcDKCABKAIMQQA2AjAgASgCDEEANgI0IAEoAgxBADYCOCABKAIMQQA2AjwgASgCDEEAOwFAIAEoAgxBgIDYjXg2AkQgASgCDEIANwNIIAEoAgxBADsBUCABKAIMQQA7AVIgASgCDEEANgJUC9oTAQF/IwBBsAFrIgMkACADIAA2AqgBIAMgATYCpAEgAyACNgKgASADQQA2ApABIAMgAygCpAEoAjBBABA7NgKUASADIAMoAqQBKAI4QQAQOzYCmAECQAJAAkACQCADKAKUAUECRgRAIAMoApgBQQFGDQELIAMoApQBQQFGBEAgAygCmAFBAkYNAQsgAygClAFBAkcNASADKAKYAUECRw0BCyADKAKkASIAIAAvAQxBgBByOwEMDAELIAMoAqQBIgAgAC8BDEH/7wNxOwEMIAMoApQBQQJGBEAgA0H14AEgAygCpAEoAjAgAygCqAFBCGoQxAE2ApABIAMoApABRQRAIANBfzYCrAEMAwsLAkAgAygCoAFBgAJxDQAgAygCmAFBAkcNACADQfXGASADKAKkASgCOCADKAKoAUEIahDEATYCSCADKAJIRQRAIAMoApABECQgA0F/NgKsAQwDCyADKAJIIAMoApABNgIAIAMgAygCSDYCkAELCwJAIAMoAqQBLwFSRQRAIAMoAqQBIgAgAC8BDEH+/wNxOwEMDAELIAMoAqQBIgAgAC8BDEEBcjsBDAsgAyADKAKkASADKAKgARCAAUEBcToAhgEgAyADKAKgAUGACnFBgApHBH8gAy0AhgEFQQELQQFxOgCHASADAn9BASADKAKkAS8BUkGBAkYNABpBASADKAKkAS8BUkGCAkYNABogAygCpAEvAVJBgwJGC0EBcToAhQEgAy0AhwFBAXEEQCADIANBIGpCHBAqNgIcIAMoAhxFBEAgAygCqAFBCGpBDkEAEBUgAygCkAEQJCADQX82AqwBDAILAkAgAygCoAFBgAJxBEACQCADKAKgAUGACHENACADKAKkASkDIEL/////D1YNACADKAKkASkDKEL/////D1gNAgsgAygCHCADKAKkASkDKBAuIAMoAhwgAygCpAEpAyAQLgwBCwJAAkAgAygCoAFBgAhxDQAgAygCpAEpAyBC/////w9WDQAgAygCpAEpAyhC/////w9WDQAgAygCpAEpA0hC/////w9YDQELIAMoAqQBKQMoQv////8PWgRAIAMoAhwgAygCpAEpAygQLgsgAygCpAEpAyBC/////w9aBEAgAygCHCADKAKkASkDIBAuCyADKAKkASkDSEL/////D1oEQCADKAIcIAMoAqQBKQNIEC4LCwsCfyMAQRBrIgAgAygCHDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFSADKAIcEBcgAygCkAEQJCADQX82AqwBDAILIANBAQJ/IwBBEGsiACADKAIcNgIMAn4gACgCDC0AAEEBcQRAIAAoAgwpAxAMAQtCAAunQf//A3ELIANBIGpBgAYQUDYCjAEgAygCHBAXIAMoAowBIAMoApABNgIAIAMgAygCjAE2ApABCyADLQCFAUEBcQRAIAMgA0EVakIHECo2AhAgAygCEEUEQCADKAKoAUEIakEOQQAQFSADKAKQARAkIANBfzYCrAEMAgsgAygCEEECECAgAygCEEHP0wBBAhBAIAMoAhAgAygCpAEvAVJB/wFxEIoBIAMoAhAgAygCpAEoAhBB//8DcRAgAn8jAEEQayIAIAMoAhA2AgwgACgCDC0AAEEBcUULBEAgAygCqAFBCGpBFEEAEBUgAygCEBAXIAMoApABECQgA0F/NgKsAQwCCyADQYGyAkEHIANBFWpBgAYQUDYCDCADKAIQEBcgAygCDCADKAKQATYCACADIAMoAgw2ApABCyADIANB0ABqQi4QKiIANgJMIABFBEAgAygCqAFBCGpBDkEAEBUgAygCkAEQJCADQX82AqwBDAELIAMoAkxBxdMAQcrTACADKAKgAUGAAnEbQQQQQCADKAKgAUGAAnFFBEAgAygCTAJ/QS0gAy0AhgFBAXENABogAygCpAEvAQgLQf//A3EQIAsgAygCTAJ/QS0gAy0AhgFBAXENABogAygCpAEvAQoLQf//A3EQICADKAJMIAMoAqQBLwEMECACQCADLQCFAUEBcQRAIAMoAkxB4wAQIAwBCyADKAJMIAMoAqQBKAIQQf//A3EQIAsgAygCpAEoAhQgA0GeAWogA0GcAWoQwwEgAygCTCADLwGeARAgIAMoAkwgAy8BnAEQIAJAAkAgAy0AhQFBAXFFDQAgAygCpAEpAyhCFFoNACADKAJMQQAQIQwBCyADKAJMIAMoAqQBKAIYECELAkACQCADKAKgAUGAAnFBgAJHDQAgAygCpAEpAyBC/////w9UBEAgAygCpAEpAyhC/////w9UDQELIAMoAkxBfxAhIAMoAkxBfxAhDAELAkAgAygCpAEpAyBC/////w9UBEAgAygCTCADKAKkASkDIKcQIQwBCyADKAJMQX8QIQsCQCADKAKkASkDKEL/////D1QEQCADKAJMIAMoAqQBKQMopxAhDAELIAMoAkxBfxAhCwsgAygCTCADKAKkASgCMBBSQf//A3EQICADIAMoAqQBKAI0IAMoAqABEIIBQf//A3EgAygCkAFBgAYQggFB//8DcWo2AogBIAMoAkwgAygCiAFB//8DcRAgIAMoAqABQYACcUUEQCADKAJMIAMoAqQBKAI4EFJB//8DcRAgIAMoAkwgAygCpAEoAjxB//8DcRAgIAMoAkwgAygCpAEvAUAQICADKAJMIAMoAqQBKAJEECECQCADKAKkASkDSEL/////D1QEQCADKAJMIAMoAqQBKQNIpxAhDAELIAMoAkxBfxAhCwsCfyMAQRBrIgAgAygCTDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFSADKAJMEBcgAygCkAEQJCADQX82AqwBDAELIAMoAqgBIANB0ABqAn4jAEEQayIAIAMoAkw2AgwCfiAAKAIMLQAAQQFxBEAgACgCDCkDEAwBC0IACwsQNkEASARAIAMoAkwQFyADKAKQARAkIANBfzYCrAEMAQsgAygCTBAXIAMoAqQBKAIwBEAgAygCqAEgAygCpAEoAjAQhgFBAEgEQCADKAKQARAkIANBfzYCrAEMAgsLIAMoApABBEAgAygCqAEgAygCkAFBgAYQgQFBAEgEQCADKAKQARAkIANBfzYCrAEMAgsLIAMoApABECQgAygCpAEoAjQEQCADKAKoASADKAKkASgCNCADKAKgARCBAUEASARAIANBfzYCrAEMAgsLIAMoAqABQYACcUUEQCADKAKkASgCOARAIAMoAqgBIAMoAqQBKAI4EIYBQQBIBEAgA0F/NgKsAQwDCwsLIAMgAy0AhwFBAXE2AqwBCyADKAKsASEAIANBsAFqJAAgAAuCAgEBfyMAQSBrIgUkACAFIAA2AhggBSABNgIUIAUgAjsBEiAFQQA7ARAgBSADNgIMIAUgBDYCCCAFQQA2AgQCQANAIAUoAhgEQAJAIAUoAhgvAQggBS8BEkcNACAFKAIYKAIEIAUoAgxxQYAGcUUNACAFKAIEIAUvARBIBEAgBSAFKAIEQQFqNgIEDAELIAUoAhQEQCAFKAIUIAUoAhgvAQo7AQALIAUoAhgvAQpBAEoEQCAFIAUoAhgoAgw2AhwMBAsgBUGx0wA2AhwMAwsgBSAFKAIYKAIANgIYDAELCyAFKAIIQQlBABAVIAVBADYCHAsgBSgCHCEAIAVBIGokACAAC4EDAQF/IwBBMGsiBSQAIAUgADYCKCAFIAE2AiQgBSACNgIgIAUgAzoAHyAFIAQ2AhgCQAJAIAUoAiANACAFLQAfQQFxDQAgBUEANgIsDAELIAUgBSgCICAFLQAfQQFxRUVqEBk2AhQgBSgCFEUEQCAFKAIYQQ5BABAVIAVBADYCLAwBCwJAIAUoAigEQCAFIAUoAiggBSgCIK0QHzYCECAFKAIQRQRAIAUoAhhBDkEAEBUgBSgCFBAWIAVBADYCLAwDCyAFKAIUIAUoAhAgBSgCIBAaGgwBCyAFKAIkIAUoAhQgBSgCIK0gBSgCGBBhQQBIBEAgBSgCFBAWIAVBADYCLAwCCwsgBS0AH0EBcQRAIAUoAhQgBSgCIGpBADoAACAFIAUoAhQ2AgwDQCAFKAIMIAUoAhQgBSgCIGpJBEAgBSgCDC0AAEUEQCAFKAIMQSA6AAALIAUgBSgCDEEBajYCDAwBCwsLIAUgBSgCFDYCLAsgBSgCLCEAIAVBMGokACAAC8IBAQF/IwBBMGsiBCQAIAQgADYCKCAEIAE2AiQgBCACNwMYIAQgAzYCFAJAIAQpAxhC////////////AFYEQCAEKAIUQRRBABAVIARBfzYCLAwBCyAEIAQoAiggBCgCJCAEKQMYEC8iAjcDCCACQgBTBEAgBCgCFCAEKAIoEBggBEF/NgIsDAELIAQpAwggBCkDGFMEQCAEKAIUQRFBABAVIARBfzYCLAwBCyAEQQA2AiwLIAQoAiwhACAEQTBqJAAgAAs2AQF/IwBBEGsiASQAIAEgADYCDCABKAIMEGMgASgCDCgCABA6IAEoAgwoAgQQOiABQRBqJAALqwEBAX8jAEEQayIBJAAgASAANgIMIAEoAgwoAggEQCABKAIMKAIIEBwgASgCDEEANgIICwJAIAEoAgwoAgRFDQAgASgCDCgCBCgCAEEBcUUNACABKAIMKAIEKAIQQX5HDQAgASgCDCgCBCIAIAAoAgBBfnE2AgAgASgCDCgCBCgCAEUEQCABKAIMKAIEEDogASgCDEEANgIECwsgASgCDEEAOgAMIAFBEGokAAttAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE2AhQgBCACNgIQIAQgAzYCDAJAIAQoAhhFBEAgBEEANgIcDAELIAQgBCgCFCAEKAIQIAQoAgwgBCgCGEEIahCOATYCHAsgBCgCHCEAIARBIGokACAAC4EGAgF/AX4jAEGQAWsiAyQAIAMgADYChAEgAyABNgKAASADIAI2AnwgAxBdAkAgAygCgAEpAwhCAFIEQCADIAMoAoABKAIAKAIAKQNINwNgIAMgAygCgAEoAgAoAgApA0g3A2gMAQsgA0IANwNgIANCADcDaAsgA0IANwNwAkADQCADKQNwIAMoAoABKQMIVARAIAMoAoABKAIAIAMpA3CnQQR0aigCACkDSCADKQNoVARAIAMgAygCgAEoAgAgAykDcKdBBHRqKAIAKQNINwNoCyADKQNoIAMoAoABKQMgVgRAIAMoAnxBE0EAEBUgA0J/NwOIAQwDCyADIAMoAoABKAIAIAMpA3CnQQR0aigCACkDSCADKAKAASgCACADKQNwp0EEdGooAgApAyB8IAMoAoABKAIAIAMpA3CnQQR0aigCACgCMBBSQf//A3GtfEIefDcDWCADKQNYIAMpA2BWBEAgAyADKQNYNwNgCyADKQNgIAMoAoABKQMgVgRAIAMoAnxBE0EAEBUgA0J/NwOIAQwDCyADKAKEASgCACADKAKAASgCACADKQNwp0EEdGooAgApA0hBABAoQQBIBEAgAygCfCADKAKEASgCABAYIANCfzcDiAEMAwsgAyADKAKEASgCAEEAQQEgAygCfBDCAUJ/UQRAIAMQXCADQn83A4gBDAMLIAMoAoABKAIAIAMpA3CnQQR0aigCACADEPEBBEAgAygCfEEVQQAQFSADEFwgA0J/NwOIAQwDBSADKAKAASgCACADKQNwp0EEdGooAgAoAjQgAygCNBCFASEAIAMoAoABKAIAIAMpA3CnQQR0aigCACAANgI0IAMoAoABKAIAIAMpA3CnQQR0aigCAEEBOgAEIANBADYCNCADEFwgAyADKQNwQgF8NwNwDAILAAsLIAMCfiADKQNgIAMpA2h9Qv///////////wBUBEAgAykDYCADKQNofQwBC0L///////////8ACzcDiAELIAMpA4gBIQQgA0GQAWokACAEC6YBAQF/IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNgIQIAMgAygCEBD6ASIANgIMAkAgAEUEQCADQQA2AhwMAQsgAygCDCADKAIYNgIAIAMoAgwgAygCFDYCBCADKAIUQRBxBEAgAygCDCIAIAAoAhRBAnI2AhQgAygCDCIAIAAoAhhBAnI2AhgLIAMgAygCDDYCHAsgAygCHCEAIANBIGokACAAC9UBAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE3AxAgBCACNgIMIAQgAzYCCAJAAkAgBCkDEEL///////////8AVwRAIAQpAxBCgICAgICAgICAf1kNAQsgBCgCCEEEQT0QFSAEQX82AhwMAQsCfyAEKQMQIQEgBCgCDCEAIAQoAhgiAigCTEF/TARAIAIgASAAEJYBDAELIAIgASAAEJYBC0EASARAIAQoAghBBEG0nAEoAgAQFSAEQX82AhwMAQsgBEEANgIcCyAEKAIcIQAgBEEgaiQAIAALJwACf0EAQQAgABAFIgAgAEEbRhsiAEUNABpBtJwBIAA2AgBBAAsaC14BAX8jAEEQayIDJAAgAyABQcCAgAJxBH8gAyACQQRqNgIMIAIoAgAFQQALNgIAIAAgAUGAgAJyIAMQESIAQYFgTwRAQbScAUEAIABrNgIAQX8hAAsgA0EQaiQAIAALVQEBfyMAQRBrIgEkACABIAA2AgwCQAJAIAEoAgwoAiRBAUYNACABKAIMKAIkQQJGDQAMAQsgASgCDEEAQgBBChAiGiABKAIMQQA2AiQLIAFBEGokAAszAQF/An8gABAGIgFBYUYEQCAAEBIhAQsgAUGBYE8LBH9BtJwBQQAgAWs2AgBBfwUgAQsLaQECfwJAIAAoAhQgACgCHE0NACAAQQBBACAAKAIkEQEAGiAAKAIUDQBBfw8LIAAoAgQiASAAKAIIIgJJBEAgACABIAJrrEEBIAAoAigREAAaCyAAQQA2AhwgAEIANwMQIABCADcCBEEAC6YBAQF/IwBBEGsiAiQAIAIgADYCCCACIAE2AgQCQCACKAIILQAoQQFxBEAgAkF/NgIMDAELIAIoAggoAgAEQCACKAIIKAIAIAIoAgQQbUEASARAIAIoAghBDGogAigCCCgCABAYIAJBfzYCDAwCCwsgAigCCCACQQRqQgRBExAiQgBTBEAgAkF/NgIMDAELIAJBADYCDAsgAigCDCEAIAJBEGokACAAC0gCAX8BfiMAQRBrIgMkACADIAA2AgwgAyABNgIIIAMgAjYCBCADKAIMIAMoAgggAygCBCADKAIMQQhqEFUhBCADQRBqJAAgBAskAQF/IwBBEGsiAyQAIAMgAjYCDCAAIAEgAhCmAiADQRBqJAALpxECD38BfiMAQdAAayIFJAAgBSABNgJMIAVBN2ohEyAFQThqIRFBACEBAkADQAJAIA5BAEgNACABQf////8HIA5rSgRAQbScAUE9NgIAQX8hDgwBCyABIA5qIQ4LIAUoAkwiCiEBAkACQAJAIAotAAAiBgRAA0ACQAJAIAZB/wFxIgZFBEAgASEGDAELIAZBJUcNASABIQYDQCABLQABQSVHDQEgBSABQQJqIgg2AkwgBkEBaiEGIAEtAAIhCSAIIQEgCUElRg0ACwsgBiAKayEBIAAEQCAAIAogARAjCyABDQYgBSgCTCEBIAUCfwJAIAUoAkwsAAFBUGpBCk8NACABLQACQSRHDQAgASwAAUFQaiEQQQEhEiABQQNqDAELQX8hECABQQFqCyIBNgJMQQAhDwJAIAEsAAAiC0FgaiIIQR9LBEAgASEGDAELIAEhBkEBIAh0IglBidEEcUUNAANAIAUgAUEBaiIGNgJMIAkgD3IhDyABLAABIgtBYGoiCEEgTw0BIAYhAUEBIAh0IglBidEEcQ0ACwsCQCALQSpGBEAgBQJ/AkAgBiwAAUFQakEKTw0AIAUoAkwiAS0AAkEkRw0AIAEsAAFBAnQgBGpBwH5qQQo2AgAgASwAAUEDdCADakGAfWooAgAhDEEBIRIgAUEDagwBCyASDQZBACESQQAhDCAABEAgAiACKAIAIgFBBGo2AgAgASgCACEMCyAFKAJMQQFqCyIBNgJMIAxBf0oNAUEAIAxrIQwgD0GAwAByIQ8MAQsgBUHMAGoQowEiDEEASA0EIAUoAkwhAQtBfyEHAkAgAS0AAEEuRw0AIAEtAAFBKkYEQAJAIAEsAAJBUGpBCk8NACAFKAJMIgEtAANBJEcNACABLAACQQJ0IARqQcB+akEKNgIAIAEsAAJBA3QgA2pBgH1qKAIAIQcgBSABQQRqIgE2AkwMAgsgEg0FIAAEfyACIAIoAgAiAUEEajYCACABKAIABUEACyEHIAUgBSgCTEECaiIBNgJMDAELIAUgAUEBajYCTCAFQcwAahCjASEHIAUoAkwhAQtBACEGA0AgBiEJQX8hDSABLAAAQb9/akE5Sw0IIAUgAUEBaiILNgJMIAEsAAAhBiALIQEgBiAJQTpsakHvggFqLQAAIgZBf2pBCEkNAAsCQAJAIAZBE0cEQCAGRQ0KIBBBAE4EQCAEIBBBAnRqIAY2AgAgBSADIBBBA3RqKQMANwNADAILIABFDQggBUFAayAGIAIQogEgBSgCTCELDAILIBBBf0oNCQtBACEBIABFDQcLIA9B//97cSIIIA8gD0GAwABxGyEGQQAhDUGXgwEhECARIQ8CQAJAAkACfwJAAkACQAJAAn8CQAJAAkACQAJAAkACQCALQX9qLAAAIgFBX3EgASABQQ9xQQNGGyABIAkbIgFBqH9qDiEEFBQUFBQUFBQOFA8GDg4OFAYUFBQUAgUDFBQJFAEUFAQACwJAIAFBv39qDgcOFAsUDg4OAAsgAUHTAEYNCQwTCyAFKQNAIRRBl4MBDAULQQAhAQJAAkACQAJAAkACQAJAIAlB/wFxDggAAQIDBBoFBhoLIAUoAkAgDjYCAAwZCyAFKAJAIA42AgAMGAsgBSgCQCAOrDcDAAwXCyAFKAJAIA47AQAMFgsgBSgCQCAOOgAADBULIAUoAkAgDjYCAAwUCyAFKAJAIA6sNwMADBMLIAdBCCAHQQhLGyEHIAZBCHIhBkH4ACEBCyAFKQNAIBEgAUEgcRCqAiEKIAZBCHFFDQMgBSkDQFANAyABQQR2QZeDAWohEEECIQ0MAwsgBSkDQCAREKkCIQogBkEIcUUNAiAHIBEgCmsiAUEBaiAHIAFKGyEHDAILIAUpA0AiFEJ/VwRAIAVCACAUfSIUNwNAQQEhDUGXgwEMAQsgBkGAEHEEQEEBIQ1BmIMBDAELQZmDAUGXgwEgBkEBcSINGwshECAUIBEQQyEKCyAGQf//e3EgBiAHQX9KGyEGIAUpA0AhFAJAIAcNACAUUEUNAEEAIQcgESEKDAwLIAcgFFAgESAKa2oiASAHIAFKGyEHDAsLIAUoAkAiAUGhgwEgARsiCkEAIAcQpgEiASAHIApqIAEbIQ8gCCEGIAEgCmsgByABGyEHDAoLIAcEQCAFKAJADAILQQAhASAAQSAgDEEAIAYQJwwCCyAFQQA2AgwgBSAFKQNAPgIIIAUgBUEIajYCQEF/IQcgBUEIagshCUEAIQECQANAIAkoAgAiCEUNAQJAIAVBBGogCBClASIKQQBIIggNACAKIAcgAWtLDQAgCUEEaiEJIAcgASAKaiIBSw0BDAILC0F/IQ0gCA0LCyAAQSAgDCABIAYQJyABRQRAQQAhAQwBC0EAIQsgBSgCQCEJA0AgCSgCACIIRQ0BIAVBBGogCBClASIIIAtqIgsgAUoNASAAIAVBBGogCBAjIAlBBGohCSALIAFJDQALCyAAQSAgDCABIAZBgMAAcxAnIAwgASAMIAFKGyEBDAgLIAAgBSsDQCAMIAcgBiABQRURHAAhAQwHCyAFIAUpA0A8ADdBASEHIBMhCiAIIQYMBAsgBSABQQFqIgg2AkwgAS0AASEGIAghAQwAAAsACyAOIQ0gAA0EIBJFDQJBASEBA0AgBCABQQJ0aigCACIABEAgAyABQQN0aiAAIAIQogFBASENIAFBAWoiAUEKRw0BDAYLC0EBIQ0gAUEKTw0EA0AgBCABQQJ0aigCAA0BIAFBAWoiAUEKRw0ACwwEC0F/IQ0MAwsgAEEgIA0gDyAKayIJIAcgByAJSBsiCGoiCyAMIAwgC0gbIgEgCyAGECcgACAQIA0QIyAAQTAgASALIAZBgIAEcxAnIABBMCAIIAlBABAnIAAgCiAJECMgAEEgIAEgCyAGQYDAAHMQJwwBCwtBACENCyAFQdAAaiQAIA0LtwEBBH8CQCACKAIQIgMEfyADBSACEK0CDQEgAigCEAsgAigCFCIFayABSQRAIAIgACABIAIoAiQRAQAPCwJAIAIsAEtBAEgNACABIQQDQCAEIgNFDQEgACADQX9qIgRqLQAAQQpHDQALIAIgACADIAIoAiQRAQAiBCADSQ0BIAAgA2ohACABIANrIQEgAigCFCEFIAMhBgsgBSAAIAEQGhogAiACKAIUIAFqNgIUIAEgBmohBAsgBAvSEQEBfyMAQbABayIGJAAgBiAANgKoASAGIAE2AqQBIAYgAjYCoAEgBiADNgKcASAGIAQ2ApgBIAYgBTYClAEgBkEANgKQAQNAIAYoApABQQ9LRQRAIAZBIGogBigCkAFBAXRqQQA7AQAgBiAGKAKQAUEBajYCkAEMAQsLIAZBADYCjAEDQCAGKAKMASAGKAKgAU9FBEAgBkEgaiAGKAKkASAGKAKMAUEBdGovAQBBAXRqIgAgAC8BAEEBajsBACAGIAYoAowBQQFqNgKMAQwBCwsgBiAGKAKYASgCADYCgAEgBkEPNgKEAQNAAkAgBigChAFBAUkNACAGQSBqIAYoAoQBQQF0ai8BAA0AIAYgBigChAFBf2o2AoQBDAELCyAGKAKAASAGKAKEAUsEQCAGIAYoAoQBNgKAAQsCQCAGKAKEAUUEQCAGQcAAOgBYIAZBAToAWSAGQQA7AVogBigCnAEiASgCACEAIAEgAEEEajYCACAAIAZB2ABqIgEoAQA2AQAgBigCnAEiAigCACEAIAIgAEEEajYCACAAIAEoAQA2AQAgBigCmAFBATYCACAGQQA2AqwBDAELIAZBATYCiAEDQAJAIAYoAogBIAYoAoQBTw0AIAZBIGogBigCiAFBAXRqLwEADQAgBiAGKAKIAUEBajYCiAEMAQsLIAYoAoABIAYoAogBSQRAIAYgBigCiAE2AoABCyAGQQE2AnQgBkEBNgKQAQNAIAYoApABQQ9NBEAgBiAGKAJ0QQF0NgJ0IAYgBigCdCAGQSBqIAYoApABQQF0ai8BAGs2AnQgBigCdEEASARAIAZBfzYCrAEMAwUgBiAGKAKQAUEBajYCkAEMAgsACwsCQCAGKAJ0QQBMDQAgBigCqAEEQCAGKAKEAUEBRg0BCyAGQX82AqwBDAELIAZBADsBAiAGQQE2ApABA0AgBigCkAFBD09FBEAgBigCkAFBAWpBAXQgBmogBigCkAFBAXQgBmovAQAgBkEgaiAGKAKQAUEBdGovAQBqOwEAIAYgBigCkAFBAWo2ApABDAELCyAGQQA2AowBA0AgBigCjAEgBigCoAFJBEAgBigCpAEgBigCjAFBAXRqLwEABEAgBigClAEhASAGKAKkASAGKAKMASICQQF0ai8BAEEBdCAGaiIDLwEAIQAgAyAAQQFqOwEAIABB//8DcUEBdCABaiACOwEACyAGIAYoAowBQQFqNgKMAQwBCwsCQAJAAkACQCAGKAKoAQ4CAAECCyAGIAYoApQBIgA2AkwgBiAANgJQIAZBFDYCSAwCCyAGQbDrADYCUCAGQfDrADYCTCAGQYECNgJIDAELIAZBsOwANgJQIAZB8OwANgJMIAZBADYCSAsgBkEANgJsIAZBADYCjAEgBiAGKAKIATYCkAEgBiAGKAKcASgCADYCVCAGIAYoAoABNgJ8IAZBADYCeCAGQX82AmAgBkEBIAYoAoABdDYCcCAGIAYoAnBBAWs2AlwCQAJAIAYoAqgBQQFGBEAgBigCcEHUBksNAQsgBigCqAFBAkcNASAGKAJwQdAETQ0BCyAGQQE2AqwBDAELA0AgBiAGKAKQASAGKAJ4azoAWQJAIAYoApQBIAYoAowBQQF0ai8BAEEBaiAGKAJISQRAIAZBADoAWCAGIAYoApQBIAYoAowBQQF0ai8BADsBWgwBCwJAIAYoApQBIAYoAowBQQF0ai8BACAGKAJITwRAIAYgBigCTCAGKAKUASAGKAKMAUEBdGovAQAgBigCSGtBAXRqLwEAOgBYIAYgBigCUCAGKAKUASAGKAKMAUEBdGovAQAgBigCSGtBAXRqLwEAOwFaDAELIAZB4AA6AFggBkEAOwFaCwsgBkEBIAYoApABIAYoAnhrdDYCaCAGQQEgBigCfHQ2AmQgBiAGKAJkNgKIAQNAIAYgBigCZCAGKAJoazYCZCAGKAJUIAYoAmQgBigCbCAGKAJ4dmpBAnRqIAZB2ABqKAEANgEAIAYoAmQNAAsgBkEBIAYoApABQQFrdDYCaANAIAYoAmwgBigCaHEEQCAGIAYoAmhBAXY2AmgMAQsLAkAgBigCaARAIAYgBigCbCAGKAJoQQFrcTYCbCAGIAYoAmggBigCbGo2AmwMAQsgBkEANgJsCyAGIAYoAowBQQFqNgKMASAGQSBqIAYoApABQQF0aiIBLwEAQX9qIQAgASAAOwEAAkAgAEH//wNxRQRAIAYoApABIAYoAoQBRg0BIAYgBigCpAEgBigClAEgBigCjAFBAXRqLwEAQQF0ai8BADYCkAELAkAgBigCkAEgBigCgAFNDQAgBigCYCAGKAJsIAYoAlxxRg0AIAYoAnhFBEAgBiAGKAKAATYCeAsgBiAGKAJUIAYoAogBQQJ0ajYCVCAGIAYoApABIAYoAnhrNgJ8IAZBASAGKAJ8dDYCdANAAkAgBigCfCAGKAJ4aiAGKAKEAU8NACAGIAYoAnQgBkEgaiAGKAJ8IAYoAnhqQQF0ai8BAGs2AnQgBigCdEEATA0AIAYgBigCfEEBajYCfCAGIAYoAnRBAXQ2AnQMAQsLIAYgBigCcEEBIAYoAnx0ajYCcAJAAkAgBigCqAFBAUYEQCAGKAJwQdQGSw0BCyAGKAKoAUECRw0BIAYoAnBB0ARNDQELIAZBATYCrAEMBAsgBiAGKAJsIAYoAlxxNgJgIAYoApwBKAIAIAYoAmBBAnRqIAYoAnw6AAAgBigCnAEoAgAgBigCYEECdGogBigCgAE6AAEgBigCnAEoAgAgBigCYEECdGogBigCVCAGKAKcASgCAGtBAnU7AQILDAELCyAGKAJsBEAgBkHAADoAWCAGIAYoApABIAYoAnhrOgBZIAZBADsBWiAGKAJUIAYoAmxBAnRqIAZB2ABqKAEANgEACyAGKAKcASIAIAAoAgAgBigCcEECdGo2AgAgBigCmAEgBigCgAE2AgAgBkEANgKsAQsgBigCrAEhACAGQbABaiQAIAALsQIBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAyADKAIYKAIENgIMIAMoAgwgAygCEEsEQCADIAMoAhA2AgwLAkAgAygCDEUEQCADQQA2AhwMAQsgAygCGCIAIAAoAgQgAygCDGs2AgQgAygCFCADKAIYKAIAIAMoAgwQGhoCQCADKAIYKAIcKAIYQQFGBEAgAygCGCgCMCADKAIUIAMoAgwQPiEAIAMoAhggADYCMAwBCyADKAIYKAIcKAIYQQJGBEAgAygCGCgCMCADKAIUIAMoAgwQGyEAIAMoAhggADYCMAsLIAMoAhgiACADKAIMIAAoAgBqNgIAIAMoAhgiACADKAIMIAAoAghqNgIIIAMgAygCDDYCHAsgAygCHCEAIANBIGokACAAC+0BAQF/IwBBEGsiASAANgIIAkACQAJAIAEoAghFDQAgASgCCCgCIEUNACABKAIIKAIkDQELIAFBATYCDAwBCyABIAEoAggoAhw2AgQCQAJAIAEoAgRFDQAgASgCBCgCACABKAIIRw0AIAEoAgQoAgRBKkYNASABKAIEKAIEQTlGDQEgASgCBCgCBEHFAEYNASABKAIEKAIEQckARg0BIAEoAgQoAgRB2wBGDQEgASgCBCgCBEHnAEYNASABKAIEKAIEQfEARg0BIAEoAgQoAgRBmgVGDQELIAFBATYCDAwBCyABQQA2AgwLIAEoAgwL0gQBAX8jAEEgayIDIAA2AhwgAyABNgIYIAMgAjYCFCADIAMoAhxB3BZqIAMoAhRBAnRqKAIANgIQIAMgAygCFEEBdDYCDANAAkAgAygCDCADKAIcKALQKEoNAAJAIAMoAgwgAygCHCgC0ChODQAgAygCGCADKAIcIAMoAgxBAnRqQeAWaigCAEECdGovAQAgAygCGCADKAIcQdwWaiADKAIMQQJ0aigCAEECdGovAQBOBEAgAygCGCADKAIcIAMoAgxBAnRqQeAWaigCAEECdGovAQAgAygCGCADKAIcQdwWaiADKAIMQQJ0aigCAEECdGovAQBHDQEgAygCHCADKAIMQQJ0akHgFmooAgAgAygCHEHYKGpqLQAAIAMoAhxB3BZqIAMoAgxBAnRqKAIAIAMoAhxB2Chqai0AAEoNAQsgAyADKAIMQQFqNgIMCyADKAIYIAMoAhBBAnRqLwEAIAMoAhggAygCHEHcFmogAygCDEECdGooAgBBAnRqLwEASA0AAkAgAygCGCADKAIQQQJ0ai8BACADKAIYIAMoAhxB3BZqIAMoAgxBAnRqKAIAQQJ0ai8BAEcNACADKAIQIAMoAhxB2Chqai0AACADKAIcQdwWaiADKAIMQQJ0aigCACADKAIcQdgoamotAABKDQAMAQsgAygCHEHcFmogAygCFEECdGogAygCHEHcFmogAygCDEECdGooAgA2AgAgAyADKAIMNgIUIAMgAygCDEEBdDYCDAwBCwsgAygCHEHcFmogAygCFEECdGogAygCEDYCAAvnCAEDfyMAQTBrIgIkACACIAA2AiwgAiABNgIoIAIgAigCKCgCADYCJCACIAIoAigoAggoAgA2AiAgAiACKAIoKAIIKAIMNgIcIAJBfzYCECACKAIsQQA2AtAoIAIoAixBvQQ2AtQoIAJBADYCGANAIAIoAhggAigCHE5FBEACQCACKAIkIAIoAhhBAnRqLwEABEAgAiACKAIYIgE2AhAgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQAgBCAANgLQKCAAQQJ0IANqIAE2AgAgAigCGCACKAIsQdgoampBADoAAAwBCyACKAIkIAIoAhhBAnRqQQA7AQILIAIgAigCGEEBajYCGAwBCwsDQCACKAIsKALQKEECSARAAkAgAigCEEECSARAIAIgAigCEEEBaiIANgIQDAELQQAhAAsgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQEgBCABNgLQKCABQQJ0IANqIAA2AgAgAiAANgIMIAIoAiQgAigCDEECdGpBATsBACACKAIMIAIoAixB2ChqakEAOgAAIAIoAiwiACAAKAKoLUF/ajYCqC0gAigCIARAIAIoAiwiACAAKAKsLSACKAIgIAIoAgxBAnRqLwECazYCrC0LDAELCyACKAIoIAIoAhA2AgQgAiACKAIsKALQKEECbTYCGANAIAIoAhhBAUhFBEAgAigCLCACKAIkIAIoAhgQdSACIAIoAhhBf2o2AhgMAQsLIAIgAigCHDYCDANAIAIgAigCLCgC4BY2AhggAigCLEHcFmohASACKAIsIgMoAtAoIQAgAyAAQX9qNgLQKCACKAIsIABBAnQgAWooAgA2AuAWIAIoAiwgAigCJEEBEHUgAiACKAIsKALgFjYCFCACKAIYIQEgAigCLEHcFmohAyACKAIsIgQoAtQoQX9qIQAgBCAANgLUKCAAQQJ0IANqIAE2AgAgAigCFCEBIAIoAixB3BZqIQMgAigCLCIEKALUKEF/aiEAIAQgADYC1CggAEECdCADaiABNgIAIAIoAiQgAigCDEECdGogAigCJCACKAIYQQJ0ai8BACACKAIkIAIoAhRBAnRqLwEAajsBACACKAIMIAIoAixB2ChqagJ/IAIoAhggAigCLEHYKGpqLQAAIAIoAhQgAigCLEHYKGpqLQAATgRAIAIoAhggAigCLEHYKGpqLQAADAELIAIoAhQgAigCLEHYKGpqLQAAC0EBajoAACACKAIkIAIoAhRBAnRqIAIoAgwiADsBAiACKAIkIAIoAhhBAnRqIAA7AQIgAiACKAIMIgBBAWo2AgwgAigCLCAANgLgFiACKAIsIAIoAiRBARB1IAIoAiwoAtAoQQJODQALIAIoAiwoAuAWIQEgAigCLEHcFmohAyACKAIsIgQoAtQoQX9qIQAgBCAANgLUKCAAQQJ0IANqIAE2AgAgAigCLCACKAIoEOQCIAIoAiQgAigCECACKAIsQbwWahDjAiACQTBqJAALTgEBfyMAQRBrIgIgADsBCiACIAE2AgQCQCACLwEKQQFGBEAgAigCBEEBRgRAIAJBADYCDAwCCyACQQQ2AgwMAQsgAkEANgIMCyACKAIMC80CAQF/IwBBMGsiBSQAIAUgADYCLCAFIAE2AiggBSACNgIkIAUgAzcDGCAFIAQ2AhQgBUIANwMIA0AgBSkDCCAFKQMYVARAIAUgBSgCJCAFKQMIp2otAAA6AAcgBSgCFEUEQCAFIAUoAiwoAhRBAnI7ARIgBSAFLwESIAUvARJBAXNsQQh2OwESIAUgBS0AByAFLwESQf8BcXM6AAcLIAUoAigEQCAFKAIoIAUpAwinaiAFLQAHOgAACyAFKAIsKAIMQX9zIAVBB2oiAEEBEBtBf3MhASAFKAIsIAE2AgwgBSgCLCAFKAIsKAIQIAUoAiwoAgxB/wFxakGFiKLAAGxBAWo2AhAgBSAFKAIsKAIQQRh2OgAHIAUoAiwoAhRBf3MgAEEBEBtBf3MhACAFKAIsIAA2AhQgBSAFKQMIQgF8NwMIDAELCyAFQTBqJAALbQEBfyMAQSBrIgQkACAEIAA2AhggBCABNgIUIAQgAjcDCCAEIAM2AgQCQCAEKAIYRQRAIARBADYCHAwBCyAEIAQoAhQgBCkDCCAEKAIEIAQoAhhBCGoQvwE2AhwLIAQoAhwhACAEQSBqJAAgAAunAwEBfyMAQSBrIgQkACAEIAA2AhggBCABNwMQIAQgAjYCDCAEIAM2AgggBCAEKAIYIAQpAxAgBCgCDEEAEEUiADYCAAJAIABFBEAgBEF/NgIcDAELIAQgBCgCGCAEKQMQIAQoAgwQwAEiADYCBCAARQRAIARBfzYCHAwBCwJAAkAgBCgCDEEIcQ0AIAQoAhgoAkAgBCkDEKdBBHRqKAIIRQ0AIAQoAhgoAkAgBCkDEKdBBHRqKAIIIAQoAggQOUEASARAIAQoAhhBCGpBD0EAEBUgBEF/NgIcDAMLDAELIAQoAggQPCAEKAIIIAQoAgAoAhg2AiwgBCgCCCAEKAIAKQMoNwMYIAQoAgggBCgCACgCFDYCKCAEKAIIIAQoAgApAyA3AyAgBCgCCCAEKAIAKAIQOwEwIAQoAgggBCgCAC8BUjsBMiAEKAIIQSBBACAEKAIALQAGQQFxG0HcAXKtNwMACyAEKAIIIAQpAxA3AxAgBCgCCCAEKAIENgIIIAQoAggiACAAKQMAQgOENwMAIARBADYCHAsgBCgCHCEAIARBIGokACAAC1kCAX8BfgJAAn9BACAARQ0AGiAArSABrX4iA6ciAiAAIAFyQYCABEkNABpBfyACIANCIIinGwsiAhAZIgBFDQAgAEF8ai0AAEEDcUUNACAAQQAgAhAzCyAAC3cBAX8jAEEQayIBIAA2AgggAUKFKjcDAAJAIAEoAghFBEAgAUEANgIMDAELA0AgASgCCC0AAARAIAEgASgCCC0AAK0gASkDAEIhfnxC/////w+DNwMAIAEgASgCCEEBajYCCAwBCwsgASABKQMAPgIMCyABKAIMC4cFAQF/IwBBMGsiBSQAIAUgADYCKCAFIAE2AiQgBSACNwMYIAUgAzYCFCAFIAQ2AhACQAJAAkAgBSgCKEUNACAFKAIkRQ0AIAUpAxhC////////////AFgNAQsgBSgCEEESQQAQFSAFQQA6AC8MAQsgBSgCKCgCAEUEQCAFKAIoQYACIAUoAhAQWkEBcUUEQCAFQQA6AC8MAgsLIAUgBSgCJBB8NgIMIAUgBSgCDCAFKAIoKAIAcDYCCCAFIAUoAigoAhAgBSgCCEECdGooAgA2AgQDQAJAIAUoAgRFDQACQCAFKAIEKAIcIAUoAgxHDQAgBSgCJCAFKAIEKAIAEFsNAAJAAkAgBSgCFEEIcQRAIAUoAgQpAwhCf1INAQsgBSgCBCkDEEJ/UQ0BCyAFKAIQQQpBABAVIAVBADoALwwECwwBCyAFIAUoAgQoAhg2AgQMAQsLIAUoAgRFBEAgBUEgEBkiADYCBCAARQRAIAUoAhBBDkEAEBUgBUEAOgAvDAILIAUoAgQgBSgCJDYCACAFKAIEIAUoAigoAhAgBSgCCEECdGooAgA2AhggBSgCKCgCECAFKAIIQQJ0aiAFKAIENgIAIAUoAgQgBSgCDDYCHCAFKAIEQn83AwggBSgCKCIAIAApAwhCAXw3AwgCQCAFKAIoIgApAwi6IAAoAgC4RAAAAAAAAOg/omRFDQAgBSgCKCgCAEGAgICAeE8NACAFKAIoIAUoAigoAgBBAXQgBSgCEBBaQQFxRQRAIAVBADoALwwDCwsLIAUoAhRBCHEEQCAFKAIEIAUpAxg3AwgLIAUoAgQgBSkDGDcDECAFQQE6AC8LIAUtAC9BAXEhACAFQTBqJAAgAAv0AwEBfyMAQdAAayIIJAAgCCAANgJIIAggATcDQCAIIAI3AzggCCADNgI0IAggBDoAMyAIIAU2AiwgCCAGNwMgIAggBzYCHAJAAkACQCAIKAJIRQ0AIAgpA0AgCCkDOHwgCCkDQFQNACAIKAIsDQEgCCkDIFANAQsgCCgCHEESQQAQFSAIQQA2AkwMAQsgCEGAARAZIgA2AhggAEUEQCAIKAIcQQ5BABAVIAhBADYCTAwBCyAIKAIYIAgpA0A3AwAgCCgCGCAIKQNAIAgpAzh8NwMIIAgoAhhBKGoQPCAIKAIYIAgtADM6AGAgCCgCGCAIKAIsNgIQIAgoAhggCCkDIDcDGCMAQRBrIgAgCCgCGEHkAGo2AgwgACgCDEEANgIAIAAoAgxBADYCBCAAKAIMQQA2AggjAEEQayIAIAgoAkg2AgwgACgCDCkDGEL/gQGDIQEgCEF/NgIIIAhBBzYCBCAIQQ42AgBBECAIEDcgAYQhASAIKAIYIAE3A3AgCCgCGCAIKAIYKQNwQsAAg0IAUkEARzoAeCAIKAI0BEAgCCgCGEEoaiAIKAI0IAgoAhwQkQFBAEgEQCAIKAIYEBYgCEEANgJMDAILCyAIIAgoAkhBASAIKAIYIAgoAhwQjgE2AkwLIAgoAkwhACAIQdAAaiQAIAALlgIBAX8jAEEwayIDJAAgAyAANgIkIAMgATcDGCADIAI2AhQCQCADKAIkKAJAIAMpAxinQQR0aigCAEUEQCADKAIUQRRBABAVIANCADcDKAwBCyADIAMoAiQoAkAgAykDGKdBBHRqKAIAKQNINwMIIAMoAiQoAgAgAykDCEEAEChBAEgEQCADKAIUIAMoAiQoAgAQGCADQgA3AygMAQsgAyADKAIkKAIAIAMoAhQQiwMiADYCBCAAQQBIBEAgA0IANwMoDAELIAMpAwggAygCBK18Qv///////////wBWBEAgAygCFEEEQRYQFSADQgA3AygMAQsgAyADKQMIIAMoAgStfDcDKAsgAykDKCEBIANBMGokACABC3cBAX8jAEEQayICIAA2AgggAiABNgIEAkACQAJAIAIoAggpAyhC/////w9aDQAgAigCCCkDIEL/////D1oNACACKAIEQYAEcUUNASACKAIIKQNIQv////8PVA0BCyACQQE6AA8MAQsgAkEAOgAPCyACLQAPQQFxC9kCAQF/IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNgIQIAMgA0EMakIEECo2AggCQCADKAIIRQRAIANBfzYCHAwBCwNAIAMoAhQEQCADKAIUKAIEIAMoAhBxQYAGcQRAIAMoAghCABAtGiADKAIIIAMoAhQvAQgQICADKAIIIAMoAhQvAQoQIAJ/IwBBEGsiACADKAIINgIMIAAoAgwtAABBAXFFCwRAIAMoAhhBCGpBFEEAEBUgAygCCBAXIANBfzYCHAwECyADKAIYIANBDGpCBBA2QQBIBEAgAygCCBAXIANBfzYCHAwECyADKAIULwEKQQBKBEAgAygCGCADKAIUKAIMIAMoAhQvAQqtEDZBAEgEQCADKAIIEBcgA0F/NgIcDAULCwsgAyADKAIUKAIANgIUDAELCyADKAIIEBcgA0EANgIcCyADKAIcIQAgA0EgaiQAIAALaAEBfyMAQRBrIgIgADYCDCACIAE2AgggAkEAOwEGA0AgAigCDARAIAIoAgwoAgQgAigCCHFBgAZxBEAgAiACKAIMLwEKIAIvAQZBBGpqOwEGCyACIAIoAgwoAgA2AgwMAQsLIAIvAQYL8AEBAX8jAEEQayIBJAAgASAANgIMIAEgASgCDDYCCCABQQA2AgQDQCABKAIMBEACQAJAIAEoAgwvAQhB9cYBRg0AIAEoAgwvAQhB9eABRg0AIAEoAgwvAQhBgbICRg0AIAEoAgwvAQhBAUcNAQsgASABKAIMKAIANgIAIAEoAgggASgCDEYEQCABIAEoAgA2AggLIAEoAgxBADYCACABKAIMECQgASgCBARAIAEoAgQgASgCADYCAAsgASABKAIANgIMDAILIAEgASgCDDYCBCABIAEoAgwoAgA2AgwMAQsLIAEoAgghACABQRBqJAAgAAuzBAEBfyMAQUBqIgUkACAFIAA2AjggBSABOwE2IAUgAjYCMCAFIAM2AiwgBSAENgIoIAUgBSgCOCAFLwE2rRAqIgA2AiQCQCAARQRAIAUoAihBDkEAEBUgBUEAOgA/DAELIAVBADYCICAFQQA2AhgDQAJ/IwBBEGsiACAFKAIkNgIMIAAoAgwtAABBAXELBH8gBSgCJBAwQgRaBUEAC0EBcQRAIAUgBSgCJBAeOwEWIAUgBSgCJBAeOwEUIAUgBSgCJCAFLwEUrRAfNgIQIAUoAhBFBEAgBSgCKEEVQQAQFSAFKAIkEBcgBSgCGBAkIAVBADoAPwwDCyAFIAUvARYgBS8BFCAFKAIQIAUoAjAQUCIANgIcIABFBEAgBSgCKEEOQQAQFSAFKAIkEBcgBSgCGBAkIAVBADoAPwwDCwJAIAUoAhgEQCAFKAIgIAUoAhw2AgAgBSAFKAIcNgIgDAELIAUgBSgCHCIANgIgIAUgADYCGAsMAQsLIAUoAiQQSEEBcUUEQCAFIAUoAiQQMD4CDCAFIAUoAiQgBSgCDK0QHzYCCAJAAkAgBSgCDEEETw0AIAUoAghFDQAgBSgCCEGy0wAgBSgCDBBTRQ0BCyAFKAIoQRVBABAVIAUoAiQQFyAFKAIYECQgBUEAOgA/DAILCyAFKAIkEBcCQCAFKAIsBEAgBSgCLCAFKAIYNgIADAELIAUoAhgQJAsgBUEBOgA/CyAFLQA/QQFxIQAgBUFAayQAIAAL7wIBAX8jAEEgayICJAAgAiAANgIYIAIgATYCFAJAIAIoAhhFBEAgAiACKAIUNgIcDAELIAIgAigCGDYCCANAIAIoAggoAgAEQCACIAIoAggoAgA2AggMAQsLA0AgAigCFARAIAIgAigCFCgCADYCECACQQA2AgQgAiACKAIYNgIMA0ACQCACKAIMRQ0AAkAgAigCDC8BCCACKAIULwEIRw0AIAIoAgwvAQogAigCFC8BCkcNACACKAIMLwEKBEAgAigCDCgCDCACKAIUKAIMIAIoAgwvAQoQUw0BCyACKAIMIgAgACgCBCACKAIUKAIEQYAGcXI2AgQgAkEBNgIEDAELIAIgAigCDCgCADYCDAwBCwsgAigCFEEANgIAAkAgAigCBARAIAIoAhQQJAwBCyACKAIIIAIoAhQiADYCACACIAA2AggLIAIgAigCEDYCFAwBCwsgAiACKAIYNgIcCyACKAIcIQAgAkEgaiQAIAALXQEBfyMAQRBrIgIkACACIAA2AgggAiABNgIEAkAgAigCBEUEQCACQQA2AgwMAQsgAiACKAIIIAIoAgQoAgAgAigCBC8BBK0QNjYCDAsgAigCDCEAIAJBEGokACAAC48BAQF/IwBBEGsiAiQAIAIgADYCCCACIAE2AgQCQAJAIAIoAggEQCACKAIEDQELIAIgAigCCCACKAIERjYCDAwBCyACKAIILwEEIAIoAgQvAQRHBEAgAkEANgIMDAELIAIgAigCCCgCACACKAIEKAIAIAIoAggvAQQQU0U2AgwLIAIoAgwhACACQRBqJAAgAAtVAQF/IwBBEGsiASQAIAEgADYCDCABQQBBAEEAEBs2AgggASgCDARAIAEgASgCCCABKAIMKAIAIAEoAgwvAQQQGzYCCAsgASgCCCEAIAFBEGokACAAC6ABAQF/IwBBIGsiBSQAIAUgADYCGCAFIAE2AhQgBSACOwESIAUgAzoAESAFIAQ2AgwgBSAFKAIYIAUoAhQgBS8BEiAFLQARQQFxIAUoAgwQYCIANgIIAkAgAEUEQCAFQQA2AhwMAQsgBSAFKAIIIAUvARJBACAFKAIMEFE2AgQgBSgCCBAWIAUgBSgCBDYCHAsgBSgCHCEAIAVBIGokACAAC18BAX8jAEEQayICJAAgAiAANgIIIAIgAToAByACIAIoAghCARAfNgIAAkAgAigCAEUEQCACQX82AgwMAQsgAigCACACLQAHOgAAIAJBADYCDAsgAigCDBogAkEQaiQAC1QBAX8jAEEQayIBJAAgASAANgIIIAEgASgCCEIBEB82AgQCQCABKAIERQRAIAFBADoADwwBCyABIAEoAgQtAAA6AA8LIAEtAA8hACABQRBqJAAgAAs4AQF/IwBBEGsiASAANgIMIAEoAgxBADYCACABKAIMQQA2AgQgASgCDEEANgIIIAEoAgxBADoADAufAgEBfyMAQUBqIgUkACAFIAA3AzAgBSABNwMoIAUgAjYCJCAFIAM3AxggBSAENgIUIAUCfyAFKQMYQhBUBEAgBSgCFEESQQAQFUEADAELIAUoAiQLNgIEAkAgBSgCBEUEQCAFQn83AzgMAQsCQAJAAkACQAJAIAUoAgQoAggOAwIAAQMLIAUgBSkDMCAFKAIEKQMAfDcDCAwDCyAFIAUpAyggBSgCBCkDAHw3AwgMAgsgBSAFKAIEKQMANwMIDAELIAUoAhRBEkEAEBUgBUJ/NwM4DAELAkAgBSkDCEIAWQRAIAUpAwggBSkDKFgNAQsgBSgCFEESQQAQFSAFQn83AzgMAQsgBSAFKQMINwM4CyAFKQM4IQAgBUFAayQAIAAL6gECAX8BfiMAQSBrIgQkACAEIAA2AhggBCABNgIUIAQgAjYCECAEIAM2AgwgBCAEKAIMEI8BIgA2AggCQCAARQRAIARBADYCHAwBCyMAQRBrIgAgBCgCGDYCDCAAKAIMIgAgACgCMEEBajYCMCAEKAIIIAQoAhg2AgAgBCgCCCAEKAIUNgIEIAQoAgggBCgCEDYCCCAEKAIYIAQoAhBBAEIAQQ4gBCgCFBENACEFIAQoAgggBTcDGCAEKAIIKQMYQgBTBEAgBCgCCEI/NwMYCyAEIAQoAgg2AhwLIAQoAhwhACAEQSBqJAAgAAvqAQEBfyMAQRBrIgEkACABIAA2AgggAUE4EBkiADYCBAJAIABFBEAgASgCCEEOQQAQFSABQQA2AgwMAQsgASgCBEEANgIAIAEoAgRBADYCBCABKAIEQQA2AgggASgCBEEANgIgIAEoAgRBADYCJCABKAIEQQA6ACggASgCBEEANgIsIAEoAgRBATYCMCMAQRBrIgAgASgCBEEMajYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCABKAIEQQA6ADQgASgCBEEAOgA1IAEgASgCBDYCDAsgASgCDCEAIAFBEGokACAAC7ABAgF/AX4jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAyADKAIQEI8BIgA2AgwCQCAARQRAIANBADYCHAwBCyADKAIMIAMoAhg2AgQgAygCDCADKAIUNgIIIAMoAhRBAEIAQQ4gAygCGBEPACEEIAMoAgwgBDcDGCADKAIMKQMYQgBTBEAgAygCDEI/NwMYCyADIAMoAgw2AhwLIAMoAhwhACADQSBqJAAgAAvDAgEBfyMAQRBrIgMgADYCDCADIAE2AgggAyACNgIEIAMoAggpAwBCAoNCAFIEQCADKAIMIAMoAggpAxA3AxALIAMoAggpAwBCBINCAFIEQCADKAIMIAMoAggpAxg3AxgLIAMoAggpAwBCCINCAFIEQCADKAIMIAMoAggpAyA3AyALIAMoAggpAwBCEINCAFIEQCADKAIMIAMoAggoAig2AigLIAMoAggpAwBCIINCAFIEQCADKAIMIAMoAggoAiw2AiwLIAMoAggpAwBCwACDQgBSBEAgAygCDCADKAIILwEwOwEwCyADKAIIKQMAQoABg0IAUgRAIAMoAgwgAygCCC8BMjsBMgsgAygCCCkDAEKAAoNCAFIEQCADKAIMIAMoAggoAjQ2AjQLIAMoAgwiACADKAIIKQMAIAApAwCENwMAQQALggUBAX8jAEHgAGsiAyQAIAMgADYCWCADIAE2AlQgAyACNgJQAkACQCADKAJUQQBOBEAgAygCWA0BCyADKAJQQRJBABAVIANBADYCXAwBCyADIAMoAlQ2AkwjAEEQayIAIAMoAlg2AgwgAyAAKAIMKQMYNwNAQeCbASkDAEJ/UQRAIANBfzYCFCADQQM2AhAgA0EHNgIMIANBBjYCCCADQQI2AgQgA0EBNgIAQeCbAUEAIAMQNzcDACADQX82AjQgA0EPNgIwIANBDTYCLCADQQw2AiggA0EKNgIkIANBCTYCIEHomwFBCCADQSBqEDc3AwALQeCbASkDACADKQNAQeCbASkDAINSBEAgAygCUEEcQQAQFSADQQA2AlwMAQtB6JsBKQMAIAMpA0BB6JsBKQMAg1IEQCADIAMoAkxBEHI2AkwLIAMoAkxBGHFBGEYEQCADKAJQQRlBABAVIANBADYCXAwBCyADIAMoAlggAygCUBD4ATYCPAJAAkACQCADKAI8QQFqDgIAAQILIANBADYCXAwCCyADKAJMQQFxRQRAIAMoAlBBCUEAEBUgA0EANgJcDAILIAMgAygCWCADKAJMIAMoAlAQZjYCXAwBCyADKAJMQQJxBEAgAygCUEEKQQAQFSADQQA2AlwMAQsgAygCWBBJQQBIBEAgAygCUCADKAJYEBggA0EANgJcDAELAkAgAygCTEEIcQRAIAMgAygCWCADKAJMIAMoAlAQZjYCOAwBCyADIAMoAlggAygCTCADKAJQEPcBNgI4CyADKAI4RQRAIAMoAlgQMhogA0EANgJcDAELIAMgAygCODYCXAsgAygCXCEAIANB4ABqJAAgAAuOAQEBfyMAQRBrIgIkACACIAA2AgwgAiABNgIIIAJBADYCBCACKAIIBEAjAEEQayIAIAIoAgg2AgwgAiAAKAIMKAIANgIEIAIoAggQpwFBAUYEQCMAQRBrIgAgAigCCDYCDEG0nAEgACgCDCgCBDYCAAsLIAIoAgwEQCACKAIMIAIoAgQ2AgALIAJBEGokAAuVAQEBfyMAQRBrIgEkACABIAA2AggCQAJ/IwBBEGsiACABKAIINgIMIAAoAgwpAxhCgIAQg1ALBEAgASgCCCgCAARAIAEgASgCCCgCABCUAUEBcToADwwCCyABQQE6AA8MAQsgASABKAIIQQBCAEESECI+AgQgASABKAIEQQBHOgAPCyABLQAPQQFxIQAgAUEQaiQAIAALfwEBfyMAQSBrIgMkACADIAA2AhggAyABNwMQIANBADYCDCADIAI2AggCQCADKQMQQv///////////wBWBEAgAygCCEEEQT0QFSADQX82AhwMAQsgAyADKAIYIAMpAxAgAygCDCADKAIIEGc2AhwLIAMoAhwhACADQSBqJAAgAAt9ACACQQFGBEAgASAAKAIIIAAoAgRrrH0hAQsCQCAAKAIUIAAoAhxLBEAgAEEAQQAgACgCJBEBABogACgCFEUNAQsgAEEANgIcIABCADcDECAAIAEgAiAAKAIoERAAQgBTDQAgAEIANwIEIAAgACgCAEFvcTYCAEEADwtBfwviAgECfyMAQSBrIgMkAAJ/AkACQEH0lwEgASwAABCYAUUEQEG0nAFBHDYCAAwBC0GYCRAZIgINAQtBAAwBCyACQQBBkAEQMyABQSsQmAFFBEAgAkEIQQQgAS0AAEHyAEYbNgIACwJAIAEtAABB4QBHBEAgAigCACEBDAELIABBA0EAEAQiAUGACHFFBEAgAyABQYAIcjYCECAAQQQgA0EQahAEGgsgAiACKAIAQYABciIBNgIACyACQf8BOgBLIAJBgAg2AjAgAiAANgI8IAIgAkGYAWo2AiwCQCABQQhxDQAgAyADQRhqNgIAIABBk6gBIAMQDg0AIAJBCjoASwsgAkEaNgIoIAJBGzYCJCACQRw2AiAgAkEdNgIMQdygASgCAEUEQCACQX82AkwLIAJBsKEBKAIANgI4QbChASgCACIABEAgACACNgI0C0GwoQEgAjYCACACCyEAIANBIGokACAACxoAIAAgARCFAiIAQQAgAC0AACABQf8BcUYbCxgAIAAoAkxBf0wEQCAAEJoBDwsgABCaAQtgAgJ/AX4gACgCKCEBQQEhAiAAQgAgAC0AAEGAAXEEf0ECQQEgACgCFCAAKAIcSxsFQQELIAEREAAiA0IAWQR+IAAoAhQgACgCHGusIAMgACgCCCAAKAIEa6x9fAUgAwsLdgEBfyAABEAgACgCTEF/TARAIAAQbA8LIAAQbA8LQbShASgCAARAQbShASgCABCbASEBC0GwoQEoAgAiAARAA0AgACgCTEEATgR/QQEFQQALGiAAKAIUIAAoAhxLBEAgABBsIAFyIQELIAAoAjgiAA0ACwsgAQsiACAAIAEQAiIAQYFgTwR/QbScAUEAIABrNgIAQX8FIAALC9YBAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE3AxAgBCACNgIMIAQgAzYCCCAEIAQoAhggBCgCGCAEKQMQIAQoAgwgBCgCCBCpASIANgIAAkAgAEUEQCAEQQA2AhwMAQsgBCgCABBJQQBIBEAgBCgCGEEIaiAEKAIAEBggBCgCABAcIARBADYCHAwBCyAEIAQoAhgQlQIiADYCBCAARQRAIAQoAgAQHCAEQQA2AhwMAQsgBCgCBCAEKAIANgIUIAQgBCgCBDYCHAsgBCgCHCEAIARBIGokACAAC6YBAQF/IwBBIGsiBSQAIAUgADYCGCAFIAE3AxAgBSACNgIMIAUgAzYCCCAFIAQ2AgQgBSAFKAIYIAUpAxAgBSgCDEEAEEUiADYCAAJAIABFBEAgBUF/NgIcDAELIAUoAggEQCAFKAIIIAUoAgAvAQhBCHU6AAALIAUoAgQEQCAFKAIEIAUoAgAoAkQ2AgALIAVBADYCHAsgBSgCHCEAIAVBIGokACAAC6UEAQF/IwBBMGsiBSQAIAUgADYCKCAFIAE3AyAgBSACNgIcIAUgAzoAGyAFIAQ2AhQCQCAFKAIoIAUpAyBBAEEAEEVFBEAgBUF/NgIsDAELIAUoAigoAhhBAnEEQCAFKAIoQQhqQRlBABAVIAVBfzYCLAwBCyAFIAUoAigoAkAgBSkDIKdBBHRqNgIQIAUCfyAFKAIQKAIABEAgBSgCECgCAC8BCEEIdQwBC0EDCzoACyAFAn8gBSgCECgCAARAIAUoAhAoAgAoAkQMAQtBgIDYjXgLNgIEQQEhACAFIAUtABsgBS0AC0YEfyAFKAIUIAUoAgRHBUEBC0EBcTYCDAJAIAUoAgwEQCAFKAIQKAIERQRAIAUoAhAoAgAQRiEAIAUoAhAgADYCBCAARQRAIAUoAihBCGpBDkEAEBUgBUF/NgIsDAQLCyAFKAIQKAIEIAUoAhAoAgQvAQhB/wFxIAUtABtBCHRyOwEIIAUoAhAoAgQgBSgCFDYCRCAFKAIQKAIEIgAgACgCAEEQcjYCAAwBCyAFKAIQKAIEBEAgBSgCECgCBCIAIAAoAgBBb3E2AgACQCAFKAIQKAIEKAIARQRAIAUoAhAoAgQQOiAFKAIQQQA2AgQMAQsgBSgCECgCBCAFKAIQKAIELwEIQf8BcSAFLQALQQh0cjsBCCAFKAIQKAIEIAUoAgQ2AkQLCwsgBUEANgIsCyAFKAIsIQAgBUEwaiQAIAAL7QQCAX8BfiMAQUBqIgQkACAEIAA2AjQgBEJ/NwMoIAQgATYCJCAEIAI2AiAgBCADNgIcAkAgBCgCNCgCGEECcQRAIAQoAjRBCGpBGUEAEBUgBEJ/NwM4DAELIAQgBCgCNCkDMDcDECAEKQMoQn9RBEAgBEJ/NwMIIAQoAhxBgMAAcQRAIAQgBCgCNCAEKAIkIAQoAhxBABBVNwMICyAEKQMIQn9RBEAgBCAEKAI0EJ4CIgU3AwggBUIAUwRAIARCfzcDOAwDCwsgBCAEKQMINwMoCwJAIAQoAiRFDQAgBCgCNCAEKQMoIAQoAiQgBCgCHBCdAkUNACAEKAI0KQMwIAQpAxBSBEAgBCgCNCgCQCAEKQMop0EEdGoQYiAEKAI0IAQpAxA3AzALIARCfzcDOAwBCyAEKAI0KAJAIAQpAyinQQR0ahBjAkAgBCgCNCgCQCAEKQMop0EEdGooAgBFDQAgBCgCNCgCQCAEKQMop0EEdGooAgQEQCAEKAI0KAJAIAQpAyinQQR0aigCBCgCAEEBcQ0BCyAEKAI0KAJAIAQpAyinQQR0aigCBEUEQCAEKAI0KAJAIAQpAyinQQR0aigCABBGIQAgBCgCNCgCQCAEKQMop0EEdGogADYCBCAARQRAIAQoAjRBCGpBDkEAEBUgBEJ/NwM4DAMLCyAEKAI0KAJAIAQpAyinQQR0aigCBEF+NgIQIAQoAjQoAkAgBCkDKKdBBHRqKAIEIgAgACgCAEEBcjYCAAsgBCgCNCgCQCAEKQMop0EEdGogBCgCIDYCCCAEIAQpAyg3AzgLIAQpAzghBSAEQUBrJAAgBQuFAgEBfyMAQSBrIgIkACACIAA2AhggAiABNwMQAkAgAikDECACKAIYKQMwWgRAIAIoAhhBCGpBEkEAEBUgAkF/NgIcDAELIAIoAhgoAhhBAnEEQCACKAIYQQhqQRlBABAVIAJBfzYCHAwBCyACIAIoAhggAikDEEEAIAIoAhhBCGoQTyIANgIMIABFBEAgAkF/NgIcDAELIAIoAhgoAlAgAigCDCACKAIYQQhqEFlBAXFFBEAgAkF/NgIcDAELIAIoAhggAikDEBCgAgRAIAJBfzYCHAwBCyACKAIYKAJAIAIpAxCnQQR0akEBOgAMIAJBADYCHAsgAigCHCEAIAJBIGokACAAC5gCAAJAAkAgAUEUSw0AAkACQAJAAkACQAJAAkACQCABQXdqDgoAAQIJAwQFBgkHCAsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgACACQRYRBAALDwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC0oBA38gACgCACwAAEFQakEKSQRAA0AgACgCACIBLAAAIQMgACABQQFqNgIAIAMgAkEKbGpBUGohAiABLAABQVBqQQpJDQALCyACC38CAX8BfiAAvSIDQjSIp0H/D3EiAkH/D0cEfCACRQRAIAEgAEQAAAAAAAAAAGEEf0EABSAARAAAAAAAAPBDoiABEKQBIQAgASgCAEFAags2AgAgAA8LIAEgAkGCeGo2AgAgA0L/////////h4B/g0KAgICAgICA8D+EvwUgAAsLEgAgAEUEQEEADwsgACABELQCC+UBAQJ/IAJBAEchAwJAAkACQCACRQ0AIABBA3FFDQAgAUH/AXEhBANAIAAtAAAgBEYNAiAAQQFqIQAgAkF/aiICQQBHIQMgAkUNASAAQQNxDQALCyADRQ0BCwJAIAAtAAAgAUH/AXFGDQAgAkEESQ0AIAFB/wFxQYGChAhsIQMDQCAAKAIAIANzIgRBf3MgBEH//ft3anFBgIGChHhxDQEgAEEEaiEAIAJBfGoiAkEDSw0ACwsgAkUNACABQf8BcSEBA0AgASAALQAARgRAIAAPCyAAQQFqIQAgAkF/aiICDQALC0EAC1oBAX8jAEEQayIBIAA2AggCQAJAIAEoAggoAgBBAE4EQCABKAIIKAIAQaAOKAIASA0BCyABQQA2AgwMAQsgASABKAIIKAIAQQJ0QbAOaigCADYCDAsgASgCDAuqAQEBfyMAQTBrIgIkACACIAA2AiggAiABNwMgIAJBADYCHAJAAkAgAigCKCgCJEEBRgRAIAIoAhxFDQEgAigCHEEBRg0BIAIoAhxBAkYNAQsgAigCKEEMakESQQAQFSACQX82AiwMAQsgAiACKQMgNwMIIAIgAigCHDYCECACQX9BACACKAIoIAJBCGpCEEEMECJCAFMbNgIsCyACKAIsIQAgAkEwaiQAIAALzQsBAX8jAEHAAWsiBSQAIAUgADYCuAEgBSABNgK0ASAFIAI3A6gBIAUgAzYCpAEgBUIANwOYASAFQgA3A5ABIAUgBDYCjAECQCAFKAK4AUUEQCAFQQA2ArwBDAELAkAgBSgCtAEEQCAFKQOoASAFKAK0ASkDMFQNAQsgBSgCuAFBCGpBEkEAEBUgBUEANgK8AQwBCwJAIAUoAqQBQQhxDQAgBSgCtAEoAkAgBSkDqAGnQQR0aigCCEUEQCAFKAK0ASgCQCAFKQOoAadBBHRqLQAMQQFxRQ0BCyAFKAK4AUEIakEPQQAQFSAFQQA2ArwBDAELIAUoArQBIAUpA6gBIAUoAqQBQQhyIAVByABqEHpBAEgEQCAFKAK4AUEIakEUQQAQFSAFQQA2ArwBDAELIAUoAqQBQSBxBEAgBSAFKAKkAUEEcjYCpAELAkAgBSkDmAFCAFgEQCAFKQOQAUIAWA0BCyAFKAKkAUEEcUUNACAFKAK4AUEIakESQQAQFSAFQQA2ArwBDAELAkAgBSkDmAFCAFgEQCAFKQOQAUIAWA0BCyAFKQOYASAFKQOQAXwgBSkDmAFaBEAgBSkDmAEgBSkDkAF8IAUpA2BYDQELIAUoArgBQQhqQRJBABAVIAVBADYCvAEMAQsgBSkDkAFQBEAgBSAFKQNgIAUpA5gBfTcDkAELIAUgBSkDkAEgBSkDYFQ6AEcgBSAFKAKkAUEgcQR/QQAFIAUvAXpBAEcLQQFxOgBFIAUgBSgCpAFBBHEEf0EABSAFLwF4QQBHC0EBcToARCAFAn8gBSgCpAFBBHEEQEEAIAUvAXgNARoLIAUtAEdBf3MLQQFxOgBGIAUtAEVBAXEEQCAFKAKMAUUEQCAFIAUoArgBKAIcNgKMAQsgBSgCjAFFBEAgBSgCuAFBCGpBGkEAEBUgBUEANgK8AQwCCwsgBSkDaFAEQCAFIAUoArgBQQBCAEEAEHk2ArwBDAELAkACQCAFLQBHQQFxRQ0AIAUtAEVBAXENACAFLQBEQQFxDQAgBSAFKQOQATcDICAFIAUpA5ABNwMoIAVBADsBOCAFIAUoAnA2AjAgBULcADcDCCAFIAUoArQBKAIAIAUpA5gBIAUpA5ABIAVBCGpBACAFKAK0ASAFKQOoASAFKAK4AUEIahB+IgA2AogBDAELIAUgBSgCtAEgBSkDqAEgBSgCpAEgBSgCuAFBCGoQRSIANgIEIABFBEAgBUEANgK8AQwCCyAFIAUoArQBKAIAQgAgBSkDaCAFQcgAaiAFKAIELwEMQQF1QQNxIAUoArQBIAUpA6gBIAUoArgBQQhqEH4iADYCiAELIABFBEAgBUEANgK8AQwBCyAFKAKIASAFKAK0ARCFA0EASARAIAUoAogBEBwgBUEANgK8AQwBCyAFLQBFQQFxBEAgBSAFLwF6QQAQdyIANgIAIABFBEAgBSgCuAFBCGpBGEEAEBUgBUEANgK8AQwCCyAFIAUoArgBIAUoAogBIAUvAXpBACAFKAKMASAFKAIAEQYANgKEASAFKAKIARAcIAUoAoQBRQRAIAVBADYCvAEMAgsgBSAFKAKEATYCiAELIAUtAERBAXEEQCAFIAUoArgBIAUoAogBIAUvAXgQqwE2AoQBIAUoAogBEBwgBSgChAFFBEAgBUEANgK8AQwCCyAFIAUoAoQBNgKIAQsgBS0ARkEBcQRAIAUgBSgCuAEgBSgCiAFBARCqATYChAEgBSgCiAEQHCAFKAKEAUUEQCAFQQA2ArwBDAILIAUgBSgChAE2AogBCwJAIAUtAEdBAXFFDQAgBS0ARUEBcUUEQCAFLQBEQQFxRQ0BCyAFIAUoArgBIAUoAogBIAUpA5gBIAUpA5ABEIcDNgKEASAFKAKIARAcIAUoAoQBRQRAIAVBADYCvAEMAgsgBSAFKAKEATYCiAELIAUgBSgCiAE2ArwBCyAFKAK8ASEAIAVBwAFqJAAgAAuEAgEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCEAJAIAMoAhRFBEAgAygCGEEIakESQQAQFSADQQA2AhwMAQsgA0E4EBkiADYCDCAARQRAIAMoAhhBCGpBDkEAEBUgA0EANgIcDAELIwBBEGsiACADKAIMQQhqNgIMIAAoAgxBADYCACAAKAIMQQA2AgQgACgCDEEANgIIIAMoAgwgAygCEDYCACADKAIMQQA2AgQgAygCDEIANwMoQQBBAEEAEBshACADKAIMIAA2AjAgAygCDEIANwMYIAMgAygCGCADKAIUQRQgAygCDBBkNgIcCyADKAIcIQAgA0EgaiQAIAALQwEBfyMAQRBrIgMkACADIAA2AgwgAyABNgIIIAMgAjYCBCADKAIMIAMoAgggAygCBEEAQQAQrQEhACADQRBqJAAgAAtJAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDCgCrEAgASgCDCgCqEAoAgQRAwAgASgCDBA4IAEoAgwQFgsgAUEQaiQAC5cCAQF/IwBBMGsiBSQAIAUgADYCKCAFIAE2AiQgBSACNgIgIAUgAzoAHyAFIAQ2AhggBUEANgIMAkAgBSgCJEUEQCAFKAIoQQhqQRJBABAVIAVBADYCLAwBCyAFIAUoAiAgBS0AH0EBcRCuASIANgIMIABFBEAgBSgCKEEIakEQQQAQFSAFQQA2AiwMAQsgBSAFKAIgIAUtAB9BAXEgBSgCGCAFKAIMEMECIgA2AhQgAEUEQCAFKAIoQQhqQQ5BABAVIAVBADYCLAwBCyAFIAUoAiggBSgCJEETIAUoAhQQZCIANgIQIABFBEAgBSgCFBCsASAFQQA2AiwMAQsgBSAFKAIQNgIsCyAFKAIsIQAgBUEwaiQAIAALzAEBAX8jAEEgayICIAA2AhggAiABOgAXIAICfwJAIAIoAhhBf0cEQCACKAIYQX5HDQELQQgMAQsgAigCGAs7AQ4gAkEANgIQAkADQCACKAIQQdCYASgCAEkEQCACKAIQQQxsQdSYAWovAQAgAi8BDkYEQCACLQAXQQFxBEAgAiACKAIQQQxsQdSYAWooAgQ2AhwMBAsgAiACKAIQQQxsQdSYAWooAgg2AhwMAwUgAiACKAIQQQFqNgIQDAILAAsLIAJBADYCHAsgAigCHAvkAQEBfyMAQSBrIgMkACADIAA6ABsgAyABNgIUIAMgAjYCECADQcgAEBkiADYCDAJAIABFBEAgAygCEEEBQbScASgCABAVIANBADYCHAwBCyADKAIMIAMoAhA2AgAgAygCDCADLQAbQQFxOgAEIAMoAgwgAygCFDYCCAJAIAMoAgwoAghBAU4EQCADKAIMKAIIQQlMDQELIAMoAgxBCTYCCAsgAygCDEEAOgAMIAMoAgxBADYCMCADKAIMQQA2AjQgAygCDEEANgI4IAMgAygCDDYCHAsgAygCHCEAIANBIGokACAAC+MIAQF/IwBBQGoiAiAANgI4IAIgATYCNCACIAIoAjgoAnw2AjAgAiACKAI4KAI4IAIoAjgoAmxqNgIsIAIgAigCOCgCeDYCICACIAIoAjgoApABNgIcIAICfyACKAI4KAJsIAIoAjgoAixBhgJrSwRAIAIoAjgoAmwgAigCOCgCLEGGAmtrDAELQQALNgIYIAIgAigCOCgCQDYCFCACIAIoAjgoAjQ2AhAgAiACKAI4KAI4IAIoAjgoAmxqQYICajYCDCACIAIoAiwgAigCIEEBa2otAAA6AAsgAiACKAIsIAIoAiBqLQAAOgAKIAIoAjgoAnggAigCOCgCjAFPBEAgAiACKAIwQQJ2NgIwCyACKAIcIAIoAjgoAnRLBEAgAiACKAI4KAJ0NgIcCwNAAkAgAiACKAI4KAI4IAIoAjRqNgIoAkAgAigCKCACKAIgai0AACACLQAKRw0AIAIoAiggAigCIEEBa2otAAAgAi0AC0cNACACKAIoLQAAIAIoAiwtAABHDQAgAiACKAIoIgBBAWo2AiggAC0AASACKAIsLQABRwRADAELIAIgAigCLEECajYCLCACIAIoAihBAWo2AigDQCACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AigCf0EAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACKAIsIAIoAgxJC0EBcQ0ACyACQYICIAIoAgwgAigCLGtrNgIkIAIgAigCDEH+fWo2AiwgAigCJCACKAIgSgRAIAIoAjggAigCNDYCcCACIAIoAiQ2AiAgAigCJCACKAIcTg0CIAIgAigCLCACKAIgQQFrai0AADoACyACIAIoAiwgAigCIGotAAA6AAoLCyACIAIoAhQgAigCNCACKAIQcUEBdGovAQAiATYCNEEAIQAgASACKAIYSwR/IAIgAigCMEF/aiIANgIwIABBAEcFQQALQQFxDQELCwJAIAIoAiAgAigCOCgCdE0EQCACIAIoAiA2AjwMAQsgAiACKAI4KAJ0NgI8CyACKAI8C5gQAQF/IwBBMGsiAiQAIAIgADYCKCACIAE2AiQgAgJ/IAIoAigoAgxBBWsgAigCKCgCLEsEQCACKAIoKAIsDAELIAIoAigoAgxBBWsLNgIgIAJBADYCECACIAIoAigoAgAoAgQ2AgwDQAJAIAJB//8DNgIcIAIgAigCKCgCvC1BKmpBA3U2AhQgAigCKCgCACgCECACKAIUSQ0AIAIgAigCKCgCACgCECACKAIUazYCFCACIAIoAigoAmwgAigCKCgCXGs2AhggAigCHCACKAIYIAIoAigoAgAoAgRqSwRAIAIgAigCGCACKAIoKAIAKAIEajYCHAsgAigCHCACKAIUSwRAIAIgAigCFDYCHAsCQCACKAIcIAIoAiBPDQACQCACKAIcRQRAIAIoAiRBBEcNAQsgAigCJEUNACACKAIcIAIoAhggAigCKCgCACgCBGpGDQELDAELQQAhACACIAIoAiRBBEYEfyACKAIcIAIoAhggAigCKCgCACgCBGpGBUEAC0EBcUVFNgIQIAIoAihBAEEAIAIoAhAQVyACKAIoKAIIIAIoAigoAhRBBGtqIAIoAhw6AAAgAigCKCgCCCACKAIoKAIUQQNraiACKAIcQQh2OgAAIAIoAigoAgggAigCKCgCFEECa2ogAigCHEF/czoAACACKAIoKAIIIAIoAigoAhRBAWtqIAIoAhxBf3NBCHY6AAAgAigCKCgCABAdIAIoAhgEQCACKAIYIAIoAhxLBEAgAiACKAIcNgIYCyACKAIoKAIAKAIMIAIoAigoAjggAigCKCgCXGogAigCGBAaGiACKAIoKAIAIgAgAigCGCAAKAIMajYCDCACKAIoKAIAIgAgACgCECACKAIYazYCECACKAIoKAIAIgAgAigCGCAAKAIUajYCFCACKAIoIgAgAigCGCAAKAJcajYCXCACIAIoAhwgAigCGGs2AhwLIAIoAhwEQCACKAIoKAIAIAIoAigoAgAoAgwgAigCHBBzGiACKAIoKAIAIgAgAigCHCAAKAIMajYCDCACKAIoKAIAIgAgACgCECACKAIcazYCECACKAIoKAIAIgAgAigCHCAAKAIUajYCFAsgAigCEEUNAQsLIAIgAigCDCACKAIoKAIAKAIEazYCDCACKAIMBEACQCACKAIMIAIoAigoAixPBEAgAigCKEECNgKwLSACKAIoKAI4IAIoAigoAgAoAgAgAigCKCgCLGsgAigCKCgCLBAaGiACKAIoIAIoAigoAiw2AmwMAQsgAigCKCgCPCACKAIoKAJsayACKAIMTQRAIAIoAigiACAAKAJsIAIoAigoAixrNgJsIAIoAigoAjggAigCKCgCOCACKAIoKAIsaiACKAIoKAJsEBoaIAIoAigoArAtQQJJBEAgAigCKCIAIAAoArAtQQFqNgKwLQsLIAIoAigoAjggAigCKCgCbGogAigCKCgCACgCACACKAIMayACKAIMEBoaIAIoAigiACACKAIMIAAoAmxqNgJsCyACKAIoIAIoAigoAmw2AlwgAigCKCIBAn8gAigCDCACKAIoKAIsIAIoAigoArQta0sEQCACKAIoKAIsIAIoAigoArQtawwBCyACKAIMCyABKAK0LWo2ArQtCyACKAIoKALALSACKAIoKAJsSQRAIAIoAiggAigCKCgCbDYCwC0LAkAgAigCEARAIAJBAzYCLAwBCwJAIAIoAiRFDQAgAigCJEEERg0AIAIoAigoAgAoAgQNACACKAIoKAJsIAIoAigoAlxHDQAgAkEBNgIsDAELIAIgAigCKCgCPCACKAIoKAJsa0EBazYCFAJAIAIoAigoAgAoAgQgAigCFE0NACACKAIoKAJcIAIoAigoAixIDQAgAigCKCIAIAAoAlwgAigCKCgCLGs2AlwgAigCKCIAIAAoAmwgAigCKCgCLGs2AmwgAigCKCgCOCACKAIoKAI4IAIoAigoAixqIAIoAigoAmwQGhogAigCKCgCsC1BAkkEQCACKAIoIgAgACgCsC1BAWo2ArAtCyACIAIoAigoAiwgAigCFGo2AhQLIAIoAhQgAigCKCgCACgCBEsEQCACIAIoAigoAgAoAgQ2AhQLIAIoAhQEQCACKAIoKAIAIAIoAigoAjggAigCKCgCbGogAigCFBBzGiACKAIoIgAgAigCFCAAKAJsajYCbAsgAigCKCgCwC0gAigCKCgCbEkEQCACKAIoIAIoAigoAmw2AsAtCyACIAIoAigoArwtQSpqQQN1NgIUIAICf0H//wMgAigCKCgCDCACKAIUa0H//wNLDQAaIAIoAigoAgwgAigCFGsLNgIUIAICfyACKAIUIAIoAigoAixLBEAgAigCKCgCLAwBCyACKAIUCzYCICACIAIoAigoAmwgAigCKCgCXGs2AhgCQCACKAIYIAIoAiBJBEAgAigCGEUEQCACKAIkQQRHDQILIAIoAiRFDQEgAigCKCgCACgCBA0BIAIoAhggAigCFEsNAQsgAgJ/IAIoAhggAigCFEsEQCACKAIUDAELIAIoAhgLNgIcIAICf0EAIAIoAiRBBEcNABpBACACKAIoKAIAKAIEDQAaIAIoAhwgAigCGEYLQQFxRUU2AhAgAigCKCACKAIoKAI4IAIoAigoAlxqIAIoAhwgAigCEBBXIAIoAigiACACKAIcIAAoAlxqNgJcIAIoAigoAgAQHQsgAkECQQAgAigCEBs2AiwLIAIoAiwhACACQTBqJAAgAAuyAgEBfyMAQRBrIgEkACABIAA2AggCQCABKAIIEHQEQCABQX42AgwMAQsgASABKAIIKAIcKAIENgIEIAEoAggoAhwoAggEQCABKAIIKAIoIAEoAggoAhwoAgggASgCCCgCJBEEAAsgASgCCCgCHCgCRARAIAEoAggoAiggASgCCCgCHCgCRCABKAIIKAIkEQQACyABKAIIKAIcKAJABEAgASgCCCgCKCABKAIIKAIcKAJAIAEoAggoAiQRBAALIAEoAggoAhwoAjgEQCABKAIIKAIoIAEoAggoAhwoAjggASgCCCgCJBEEAAsgASgCCCgCKCABKAIIKAIcIAEoAggoAiQRBAAgASgCCEEANgIcIAFBfUEAIAEoAgRB8QBGGzYCDAsgASgCDCEAIAFBEGokACAAC+sXAQJ/IwBB8ABrIgMgADYCbCADIAE2AmggAyACNgJkIANBfzYCXCADIAMoAmgvAQI2AlQgA0EANgJQIANBBzYCTCADQQQ2AkggAygCVEUEQCADQYoBNgJMIANBAzYCSAsgA0EANgJgA0AgAygCYCADKAJkSkUEQCADIAMoAlQ2AlggAyADKAJoIAMoAmBBAWpBAnRqLwECNgJUIAMgAygCUEEBaiIANgJQAkACQCAAIAMoAkxODQAgAygCWCADKAJURw0ADAELAkAgAygCUCADKAJISARAA0AgAyADKAJsQfwUaiADKAJYQQJ0ai8BAjYCRAJAIAMoAmwoArwtQRAgAygCRGtKBEAgAyADKAJsQfwUaiADKAJYQQJ0ai8BADYCQCADKAJsIgAgAC8BuC0gAygCQEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh1IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAJAQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCREEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJsQfwUaiADKAJYQQJ0ai8BACADKAJsKAK8LXRyOwG4LSADKAJsIgAgAygCRCAAKAK8LWo2ArwtCyADIAMoAlBBf2oiADYCUCAADQALDAELAkAgAygCWARAIAMoAlggAygCXEcEQCADIAMoAmxB/BRqIAMoAlhBAnRqLwECNgI8AkAgAygCbCgCvC1BECADKAI8a0oEQCADIAMoAmxB/BRqIAMoAlhBAnRqLwEANgI4IAMoAmwiACAALwG4LSADKAI4Qf//A3EgAygCbCgCvC10cjsBuC0gAygCbC8BuC1B/wFxIQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbC8BuC1BCHUhASADKAJsKAIIIQIgAygCbCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJsIAMoAjhB//8DcUEQIAMoAmwoArwta3U7AbgtIAMoAmwiACAAKAK8LSADKAI8QRBrajYCvC0MAQsgAygCbCIAIAAvAbgtIAMoAmxB/BRqIAMoAlhBAnRqLwEAIAMoAmwoArwtdHI7AbgtIAMoAmwiACADKAI8IAAoArwtajYCvC0LIAMgAygCUEF/ajYCUAsgAyADKAJsLwG+FTYCNAJAIAMoAmwoArwtQRAgAygCNGtKBEAgAyADKAJsLwG8FTYCMCADKAJsIgAgAC8BuC0gAygCMEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh1IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIwQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCNEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJsLwG8FSADKAJsKAK8LXRyOwG4LSADKAJsIgAgAygCNCAAKAK8LWo2ArwtCyADQQI2AiwCQCADKAJsKAK8LUEQIAMoAixrSgRAIAMgAygCUEEDazYCKCADKAJsIgAgAC8BuC0gAygCKEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh1IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIoQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCLEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJQQQNrQf//A3EgAygCbCgCvC10cjsBuC0gAygCbCIAIAMoAiwgACgCvC1qNgK8LQsMAQsCQCADKAJQQQpMBEAgAyADKAJsLwHCFTYCJAJAIAMoAmwoArwtQRAgAygCJGtKBEAgAyADKAJsLwHAFTYCICADKAJsIgAgAC8BuC0gAygCIEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh1IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIgQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCJEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJsLwHAFSADKAJsKAK8LXRyOwG4LSADKAJsIgAgAygCJCAAKAK8LWo2ArwtCyADQQM2AhwCQCADKAJsKAK8LUEQIAMoAhxrSgRAIAMgAygCUEEDazYCGCADKAJsIgAgAC8BuC0gAygCGEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh1IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIYQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCHEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJQQQNrQf//A3EgAygCbCgCvC10cjsBuC0gAygCbCIAIAMoAhwgACgCvC1qNgK8LQsMAQsgAyADKAJsLwHGFTYCFAJAIAMoAmwoArwtQRAgAygCFGtKBEAgAyADKAJsLwHEFTYCECADKAJsIgAgAC8BuC0gAygCEEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh1IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIQQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCFEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJsLwHEFSADKAJsKAK8LXRyOwG4LSADKAJsIgAgAygCFCAAKAK8LWo2ArwtCyADQQc2AgwCQCADKAJsKAK8LUEQIAMoAgxrSgRAIAMgAygCUEELazYCCCADKAJsIgAgAC8BuC0gAygCCEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh1IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIIQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCDEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJQQQtrQf//A3EgAygCbCgCvC10cjsBuC0gAygCbCIAIAMoAgwgACgCvC1qNgK8LQsLCwsgA0EANgJQIAMgAygCWDYCXAJAIAMoAlRFBEAgA0GKATYCTCADQQM2AkgMAQsCQCADKAJYIAMoAlRGBEAgA0EGNgJMIANBAzYCSAwBCyADQQc2AkwgA0EENgJICwsLIAMgAygCYEEBajYCYAwBCwsLkQQBAX8jAEEwayIDIAA2AiwgAyABNgIoIAMgAjYCJCADQX82AhwgAyADKAIoLwECNgIUIANBADYCECADQQc2AgwgA0EENgIIIAMoAhRFBEAgA0GKATYCDCADQQM2AggLIAMoAiggAygCJEEBakECdGpB//8DOwECIANBADYCIANAIAMoAiAgAygCJEpFBEAgAyADKAIUNgIYIAMgAygCKCADKAIgQQFqQQJ0ai8BAjYCFCADIAMoAhBBAWoiADYCEAJAAkAgACADKAIMTg0AIAMoAhggAygCFEcNAAwBCwJAIAMoAhAgAygCCEgEQCADKAIsQfwUaiADKAIYQQJ0aiIAIAMoAhAgAC8BAGo7AQAMAQsCQCADKAIYBEAgAygCGCADKAIcRwRAIAMoAiwgAygCGEECdGpB/BRqIgAgAC8BAEEBajsBAAsgAygCLCIAIABBvBVqLwEAQQFqOwG8FQwBCwJAIAMoAhBBCkwEQCADKAIsIgAgAEHAFWovAQBBAWo7AcAVDAELIAMoAiwiACAAQcQVai8BAEEBajsBxBULCwsgA0EANgIQIAMgAygCGDYCHAJAIAMoAhRFBEAgA0GKATYCDCADQQM2AggMAQsCQCADKAIYIAMoAhRGBEAgA0EGNgIMIANBAzYCCAwBCyADQQc2AgwgA0EENgIICwsLIAMgAygCIEEBajYCIAwBCwsLpxIBAn8jAEHQAGsiAyAANgJMIAMgATYCSCADIAI2AkQgA0EANgI4IAMoAkwoAqAtBEADQCADIAMoAkwoAqQtIAMoAjhBAXRqLwEANgJAIAMoAkwoApgtIQAgAyADKAI4IgFBAWo2AjggAyAAIAFqLQAANgI8AkAgAygCQEUEQCADIAMoAkggAygCPEECdGovAQI2AiwCQCADKAJMKAK8LUEQIAMoAixrSgRAIAMgAygCSCADKAI8QQJ0ai8BADYCKCADKAJMIgAgAC8BuC0gAygCKEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwvAbgtQf8BcSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwvAbgtQQh1IQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTCADKAIoQf//A3FBECADKAJMKAK8LWt1OwG4LSADKAJMIgAgACgCvC0gAygCLEEQa2o2ArwtDAELIAMoAkwiACAALwG4LSADKAJIIAMoAjxBAnRqLwEAIAMoAkwoArwtdHI7AbgtIAMoAkwiACADKAIsIAAoArwtajYCvC0LDAELIAMgAygCPC0AgFk2AjQgAyADKAJIIAMoAjRBgQJqQQJ0ai8BAjYCJAJAIAMoAkwoArwtQRAgAygCJGtKBEAgAyADKAJIIAMoAjRBgQJqQQJ0ai8BADYCICADKAJMIgAgAC8BuC0gAygCIEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwvAbgtQf8BcSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwvAbgtQQh1IQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTCADKAIgQf//A3FBECADKAJMKAK8LWt1OwG4LSADKAJMIgAgACgCvC0gAygCJEEQa2o2ArwtDAELIAMoAkwiACAALwG4LSADKAJIIAMoAjRBgQJqQQJ0ai8BACADKAJMKAK8LXRyOwG4LSADKAJMIgAgAygCJCAAKAK8LWo2ArwtCyADIAMoAjRBAnRBwOUAaigCADYCMCADKAIwBEAgAyADKAI8IAMoAjRBAnRBsOgAaigCAGs2AjwgAyADKAIwNgIcAkAgAygCTCgCvC1BECADKAIca0oEQCADIAMoAjw2AhggAygCTCIAIAAvAbgtIAMoAhhB//8DcSADKAJMKAK8LXRyOwG4LSADKAJMLwG4LUH/AXEhASADKAJMKAIIIQIgAygCTCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJMLwG4LUEIdSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwgAygCGEH//wNxQRAgAygCTCgCvC1rdTsBuC0gAygCTCIAIAAoArwtIAMoAhxBEGtqNgK8LQwBCyADKAJMIgAgAC8BuC0gAygCPEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwiACADKAIcIAAoArwtajYCvC0LCyADIAMoAkBBf2o2AkAgAwJ/IAMoAkBBgAJJBEAgAygCQC0AgFUMAQsgAygCQEEHdkGAAmotAIBVCzYCNCADIAMoAkQgAygCNEECdGovAQI2AhQCQCADKAJMKAK8LUEQIAMoAhRrSgRAIAMgAygCRCADKAI0QQJ0ai8BADYCECADKAJMIgAgAC8BuC0gAygCEEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwvAbgtQf8BcSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwvAbgtQQh1IQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTCADKAIQQf//A3FBECADKAJMKAK8LWt1OwG4LSADKAJMIgAgACgCvC0gAygCFEEQa2o2ArwtDAELIAMoAkwiACAALwG4LSADKAJEIAMoAjRBAnRqLwEAIAMoAkwoArwtdHI7AbgtIAMoAkwiACADKAIUIAAoArwtajYCvC0LIAMgAygCNEECdEHA5gBqKAIANgIwIAMoAjAEQCADIAMoAkAgAygCNEECdEGw6QBqKAIAazYCQCADIAMoAjA2AgwCQCADKAJMKAK8LUEQIAMoAgxrSgRAIAMgAygCQDYCCCADKAJMIgAgAC8BuC0gAygCCEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwvAbgtQf8BcSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwvAbgtQQh1IQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTCADKAIIQf//A3FBECADKAJMKAK8LWt1OwG4LSADKAJMIgAgACgCvC0gAygCDEEQa2o2ArwtDAELIAMoAkwiACAALwG4LSADKAJAQf//A3EgAygCTCgCvC10cjsBuC0gAygCTCIAIAMoAgwgACgCvC1qNgK8LQsLCyADKAI4IAMoAkwoAqAtSQ0ACwsgAyADKAJILwGCCDYCBAJAIAMoAkwoArwtQRAgAygCBGtKBEAgAyADKAJILwGACDYCACADKAJMIgAgAC8BuC0gAygCAEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwvAbgtQf8BcSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwvAbgtQQh1IQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTCADKAIAQf//A3FBECADKAJMKAK8LWt1OwG4LSADKAJMIgAgACgCvC0gAygCBEEQa2o2ArwtDAELIAMoAkwiACAALwG4LSADKAJILwGACCADKAJMKAK8LXRyOwG4LSADKAJMIgAgAygCBCAAKAK8LWo2ArwtCwuqDAEGfyAAIAFqIQUCQAJAIAAoAgQiAkEBcQ0AIAJBA3FFDQEgACgCACIDIAFqIQEgACADayIAQcycASgCAEcEQEHInAEoAgAhBCADQf8BTQRAIAAoAggiBCADQQN2IgNBA3RB4JwBakcaIAQgACgCDCICRgRAQbicAUG4nAEoAgBBfiADd3E2AgAMAwsgBCACNgIMIAIgBDYCCAwCCyAAKAIYIQYCQCAAIAAoAgwiAkcEQCAEIAAoAggiA00EQCADKAIMGgsgAyACNgIMIAIgAzYCCAwBCwJAIABBFGoiAygCACIEDQAgAEEQaiIDKAIAIgQNAEEAIQIMAQsDQCADIQcgBCICQRRqIgMoAgAiBA0AIAJBEGohAyACKAIQIgQNAAsgB0EANgIACyAGRQ0BAkAgACAAKAIcIgNBAnRB6J4BaiIEKAIARgRAIAQgAjYCACACDQFBvJwBQbycASgCAEF+IAN3cTYCAAwDCyAGQRBBFCAGKAIQIABGG2ogAjYCACACRQ0CCyACIAY2AhggACgCECIDBEAgAiADNgIQIAMgAjYCGAsgACgCFCIDRQ0BIAIgAzYCFCADIAI2AhgMAQsgBSgCBCICQQNxQQNHDQBBwJwBIAE2AgAgBSACQX5xNgIEIAAgAUEBcjYCBCAFIAE2AgAPCwJAIAUoAgQiAkECcUUEQCAFQdCcASgCAEYEQEHQnAEgADYCAEHEnAFBxJwBKAIAIAFqIgE2AgAgACABQQFyNgIEIABBzJwBKAIARw0DQcCcAUEANgIAQcycAUEANgIADwsgBUHMnAEoAgBGBEBBzJwBIAA2AgBBwJwBQcCcASgCACABaiIBNgIAIAAgAUEBcjYCBCAAIAFqIAE2AgAPC0HInAEoAgAhAyACQXhxIAFqIQECQCACQf8BTQRAIAUoAggiBCACQQN2IgJBA3RB4JwBakcaIAQgBSgCDCIDRgRAQbicAUG4nAEoAgBBfiACd3E2AgAMAgsgBCADNgIMIAMgBDYCCAwBCyAFKAIYIQYCQCAFIAUoAgwiAkcEQCADIAUoAggiA00EQCADKAIMGgsgAyACNgIMIAIgAzYCCAwBCwJAIAVBFGoiAygCACIEDQAgBUEQaiIDKAIAIgQNAEEAIQIMAQsDQCADIQcgBCICQRRqIgMoAgAiBA0AIAJBEGohAyACKAIQIgQNAAsgB0EANgIACyAGRQ0AAkAgBSAFKAIcIgNBAnRB6J4BaiIEKAIARgRAIAQgAjYCACACDQFBvJwBQbycASgCAEF+IAN3cTYCAAwCCyAGQRBBFCAGKAIQIAVGG2ogAjYCACACRQ0BCyACIAY2AhggBSgCECIDBEAgAiADNgIQIAMgAjYCGAsgBSgCFCIDRQ0AIAIgAzYCFCADIAI2AhgLIAAgAUEBcjYCBCAAIAFqIAE2AgAgAEHMnAEoAgBHDQFBwJwBIAE2AgAPCyAFIAJBfnE2AgQgACABQQFyNgIEIAAgAWogATYCAAsgAUH/AU0EQCABQQN2IgJBA3RB4JwBaiEBAn9BuJwBKAIAIgNBASACdCICcUUEQEG4nAEgAiADcjYCACABDAELIAEoAggLIQMgASAANgIIIAMgADYCDCAAIAE2AgwgACADNgIIDwsgAEIANwIQIAACf0EAIAFBCHYiAkUNABpBHyABQf///wdLDQAaIAIgAkGA/j9qQRB2QQhxIgJ0IgMgA0GA4B9qQRB2QQRxIgN0IgQgBEGAgA9qQRB2QQJxIgR0QQ92IAIgA3IgBHJrIgJBAXQgASACQRVqdkEBcXJBHGoLIgM2AhwgA0ECdEHongFqIQICQAJAQbycASgCACIEQQEgA3QiB3FFBEBBvJwBIAQgB3I2AgAgAiAANgIAIAAgAjYCGAwBCyABQQBBGSADQQF2ayADQR9GG3QhAyACKAIAIQIDQCACIgQoAgRBeHEgAUYNAiADQR12IQIgA0EBdCEDIAQgAkEEcWoiB0EQaigCACICDQALIAcgADYCECAAIAQ2AhgLIAAgADYCDCAAIAA2AggPCyAEKAIIIgEgADYCDCAEIAA2AgggAEEANgIYIAAgBDYCDCAAIAE2AggLC5cCAQR/IwBBEGsiASAANgIMAkAgASgCDCgCvC1BEEYEQCABKAIMLwG4LUH/AXEhAiABKAIMKAIIIQMgASgCDCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAjoAACABKAIMLwG4LUEIdSECIAEoAgwoAgghAyABKAIMIgQoAhQhACAEIABBAWo2AhQgACADaiACOgAAIAEoAgxBADsBuC0gASgCDEEANgK8LQwBCyABKAIMKAK8LUEITgRAIAEoAgwvAbgtIQIgASgCDCgCCCEDIAEoAgwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAI6AAAgASgCDCIAIAAvAbgtQQh1OwG4LSABKAIMIgAgACgCvC1BCGs2ArwtCwsL7wEBBH8jAEEQayIBIAA2AgwCQCABKAIMKAK8LUEISgRAIAEoAgwvAbgtQf8BcSECIAEoAgwoAgghAyABKAIMIgQoAhQhACAEIABBAWo2AhQgACADaiACOgAAIAEoAgwvAbgtQQh1IQIgASgCDCgCCCEDIAEoAgwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAI6AAAMAQsgASgCDCgCvC1BAEoEQCABKAIMLwG4LSECIAEoAgwoAgghAyABKAIMIgQoAhQhACAEIABBAWo2AhQgACADaiACOgAACwsgASgCDEEAOwG4LSABKAIMQQA2ArwtC/wBAQF/IwBBEGsiASAANgIMIAFBADYCCANAIAEoAghBngJORQRAIAEoAgxBlAFqIAEoAghBAnRqQQA7AQAgASABKAIIQQFqNgIIDAELCyABQQA2AggDQCABKAIIQR5ORQRAIAEoAgxBiBNqIAEoAghBAnRqQQA7AQAgASABKAIIQQFqNgIIDAELCyABQQA2AggDQCABKAIIQRNORQRAIAEoAgxB/BRqIAEoAghBAnRqQQA7AQAgASABKAIIQQFqNgIIDAELCyABKAIMQQE7AZQJIAEoAgxBADYCrC0gASgCDEEANgKoLSABKAIMQQA2ArAtIAEoAgxBADYCoC0LIgEBfyMAQRBrIgEkACABIAA2AgwgASgCDBAWIAFBEGokAAvpAQEBfyMAQTBrIgIgADYCJCACIAE3AxggAkIANwMQIAIgAigCJCkDCEIBfTcDCAJAA0AgAikDECACKQMIVARAIAIgAikDECACKQMIIAIpAxB9QgGIfDcDAAJAIAIoAiQoAgQgAikDAKdBA3RqKQMAIAIpAxhWBEAgAiACKQMAQgF9NwMIDAELAkAgAikDACACKAIkKQMIUgRAIAIoAiQoAgQgAikDAEIBfKdBA3RqKQMAIAIpAxhYDQELIAIgAikDADcDKAwECyACIAIpAwBCAXw3AxALDAELCyACIAIpAxA3AygLIAIpAygLpwEBAX8jAEEwayIEJAAgBCAANgIoIAQgATYCJCAEIAI3AxggBCADNgIUIAQgBCgCKCkDOCAEKAIoKQMwIAQoAiQgBCkDGCAEKAIUEI0BNwMIAkAgBCkDCEIAUwRAIARBfzYCLAwBCyAEKAIoIAQpAwg3AzggBCgCKCAEKAIoKQM4ELsBIQIgBCgCKCACNwNAIARBADYCLAsgBCgCLCEAIARBMGokACAAC+sBAQF/IwBBIGsiAyQAIAMgADYCGCADIAE3AxAgAyACNgIMAkAgAykDECADKAIYKQMQVARAIANBAToAHwwBCyADIAMoAhgoAgAgAykDEEIEhqcQTSIANgIIIABFBEAgAygCDEEOQQAQFSADQQA6AB8MAQsgAygCGCADKAIINgIAIAMgAygCGCgCBCADKQMQQgF8QgOGpxBNIgA2AgQgAEUEQCADKAIMQQ5BABAVIANBADoAHwwBCyADKAIYIAMoAgQ2AgQgAygCGCADKQMQNwMQIANBAToAHwsgAy0AH0EBcSEAIANBIGokACAAC9ACAQF/IwBBMGsiBCQAIAQgADYCKCAEIAE3AyAgBCACNgIcIAQgAzYCGAJAAkAgBCgCKA0AIAQpAyBCAFgNACAEKAIYQRJBABAVIARBADYCLAwBCyAEIAQoAiggBCkDICAEKAIcIAQoAhgQTiIANgIMIABFBEAgBEEANgIsDAELIARBGBAZIgA2AhQgAEUEQCAEKAIYQQ5BABAVIAQoAgwQNCAEQQA2AiwMAQsgBCgCFCAEKAIMNgIQIAQoAhRBADYCFEEAEAEhACAEKAIUIAA2AgwjAEEQayIAIAQoAhQ2AgwgACgCDEEANgIAIAAoAgxBADYCBCAAKAIMQQA2AgggBEECIAQoAhQgBCgCGBCQASIANgIQIABFBEAgBCgCFCgCEBA0IAQoAhQQFiAEQQA2AiwMAQsgBCAEKAIQNgIsCyAEKAIsIQAgBEEwaiQAIAALqQEBAX8jAEEwayIEJAAgBCAANgIoIAQgATcDICAEIAI2AhwgBCADNgIYAkAgBCgCKEUEQCAEKQMgQgBWBEAgBCgCGEESQQAQFSAEQQA2AiwMAgsgBEEAQgAgBCgCHCAEKAIYEL4BNgIsDAELIAQgBCgCKDYCCCAEIAQpAyA3AxAgBCAEQQhqQgEgBCgCHCAEKAIYEL4BNgIsCyAEKAIsIQAgBEEwaiQAIAALRgEBfyMAQSBrIgMkACADIAA2AhwgAyABNwMQIAMgAjYCDCADKAIcIAMpAxAgAygCDCADKAIcQQhqEE8hACADQSBqJAAgAAuNAgEBfyMAQTBrIgMkACADIAA2AiggAyABOwEmIAMgAjYCICADIAMoAigoAjQgA0EeaiADLwEmQYAGQQAQXzYCEAJAIAMoAhBFDQAgAy8BHkEFSA0AAkAgAygCEC0AAEEBRg0ADAELIAMgAygCECADLwEerRAqIgA2AhQgAEUEQAwBCyADKAIUEIsBGiADIAMoAhQQKzYCGCADKAIgEIgBIAMoAhhGBEAgAyADKAIUEDA9AQ4gAyADKAIUIAMvAQ6tEB8gAy8BDkGAEEEAEFE2AgggAygCCARAIAMoAiAQJiADIAMoAgg2AiALCyADKAIUEBcLIAMgAygCIDYCLCADKAIsIQAgA0EwaiQAIAALuRECAX8BfiMAQYABayIFJAAgBSAANgJ0IAUgATYCcCAFIAI2AmwgBSADOgBrIAUgBDYCZCAFIAUoAmxBAEc6AB0gBUEeQS4gBS0Aa0EBcRs2AigCQAJAIAUoAmwEQCAFKAJsEDAgBSgCKK1UBEAgBSgCZEETQQAQFSAFQn83A3gMAwsMAQsgBSAFKAJwIAUoAiitIAVBMGogBSgCZBBBIgA2AmwgAEUEQCAFQn83A3gMAgsLIAUoAmxCBBAfIQBBxdMAQcrTACAFLQBrQQFxGygAACAAKAAARwRAIAUoAmRBE0EAEBUgBS0AHUEBcUUEQCAFKAJsEBcLIAVCfzcDeAwBCyAFKAJ0EF0CQCAFLQBrQQFxRQRAIAUoAmwQHiEAIAUoAnQgADsBCAwBCyAFKAJ0QQA7AQgLIAUoAmwQHiEAIAUoAnQgADsBCiAFKAJsEB4hACAFKAJ0IAA7AQwgBSgCbBAeQf//A3EhACAFKAJ0IAA2AhAgBSAFKAJsEB47AS4gBSAFKAJsEB47ASwgBS8BLiAFLwEsEI0DIQAgBSgCdCAANgIUIAUoAmwQKyEAIAUoAnQgADYCGCAFKAJsECutIQYgBSgCdCAGNwMgIAUoAmwQK60hBiAFKAJ0IAY3AyggBSAFKAJsEB47ASIgBSAFKAJsEB47AR4CQCAFLQBrQQFxBEAgBUEAOwEgIAUoAnRBADYCPCAFKAJ0QQA7AUAgBSgCdEEANgJEIAUoAnRCADcDSAwBCyAFIAUoAmwQHjsBICAFKAJsEB5B//8DcSEAIAUoAnQgADYCPCAFKAJsEB4hACAFKAJ0IAA7AUAgBSgCbBArIQAgBSgCdCAANgJEIAUoAmwQK60hBiAFKAJ0IAY3A0gLAn8jAEEQayIAIAUoAmw2AgwgACgCDC0AAEEBcUULBEAgBSgCZEEUQQAQFSAFLQAdQQFxRQRAIAUoAmwQFwsgBUJ/NwN4DAELAkAgBSgCdC8BDEEBcQRAIAUoAnQvAQxBwABxBEAgBSgCdEH//wM7AVIMAgsgBSgCdEEBOwFSDAELIAUoAnRBADsBUgsgBSgCdEEANgIwIAUoAnRBADYCNCAFKAJ0QQA2AjggBSAFLwEgIAUvASIgBS8BHmpqNgIkAkAgBS0AHUEBcQRAIAUoAmwQMCAFKAIkrVQEQCAFKAJkQRVBABAVIAVCfzcDeAwDCwwBCyAFKAJsEBcgBSAFKAJwIAUoAiStQQAgBSgCZBBBIgA2AmwgAEUEQCAFQn83A3gMAgsLIAUvASIEQCAFKAJsIAUoAnAgBS8BIkEBIAUoAmQQiQEhACAFKAJ0IAA2AjAgBSgCdCgCMEUEQAJ/IwBBEGsiACAFKAJkNgIMIAAoAgwoAgBBEUYLBEAgBSgCZEEVQQAQFQsgBS0AHUEBcUUEQCAFKAJsEBcLIAVCfzcDeAwCCyAFKAJ0LwEMQYAQcQRAIAUoAnQoAjBBAhA7QQVGBEAgBSgCZEEVQQAQFSAFLQAdQQFxRQRAIAUoAmwQFwsgBUJ/NwN4DAMLCwsgBS8BHgRAIAUgBSgCbCAFKAJwIAUvAR5BACAFKAJkEGA2AhggBSgCGEUEQCAFLQAdQQFxRQRAIAUoAmwQFwsgBUJ/NwN4DAILIAUoAhggBS8BHkGAAkGABCAFLQBrQQFxGyAFKAJ0QTRqIAUoAmQQhAFBAXFFBEAgBSgCGBAWIAUtAB1BAXFFBEAgBSgCbBAXCyAFQn83A3gMAgsgBSgCGBAWIAUtAGtBAXEEQCAFKAJ0QQE6AAQLCyAFLwEgBEAgBSgCbCAFKAJwIAUvASBBACAFKAJkEIkBIQAgBSgCdCAANgI4IAUoAnQoAjhFBEAgBS0AHUEBcUUEQCAFKAJsEBcLIAVCfzcDeAwCCyAFKAJ0LwEMQYAQcQRAIAUoAnQoAjhBAhA7QQVGBEAgBSgCZEEVQQAQFSAFLQAdQQFxRQRAIAUoAmwQFwsgBUJ/NwN4DAMLCwsgBSgCdEH14AEgBSgCdCgCMBDBASEAIAUoAnQgADYCMCAFKAJ0QfXGASAFKAJ0KAI4EMEBIQAgBSgCdCAANgI4AkACQCAFKAJ0KQMoQv////8PUQ0AIAUoAnQpAyBC/////w9RDQAgBSgCdCkDSEL/////D1INAQsgBSAFKAJ0KAI0IAVBFmpBAUGAAkGABCAFLQBrQQFxGyAFKAJkEF82AgwgBSgCDEUEQCAFLQAdQQFxRQRAIAUoAmwQFwsgBUJ/NwN4DAILIAUgBSgCDCAFLwEWrRAqIgA2AhAgAEUEQCAFKAJkQQ5BABAVIAUtAB1BAXFFBEAgBSgCbBAXCyAFQn83A3gMAgsCQCAFKAJ0KQMoQv////8PUQRAIAUoAhAQMSEGIAUoAnQgBjcDKAwBCyAFLQBrQQFxBEAgBSgCEBDMAQsLIAUoAnQpAyBC/////w9RBEAgBSgCEBAxIQYgBSgCdCAGNwMgCyAFLQBrQQFxRQRAIAUoAnQpA0hC/////w9RBEAgBSgCEBAxIQYgBSgCdCAGNwNICyAFKAJ0KAI8Qf//A0YEQCAFKAIQECshACAFKAJ0IAA2AjwLCyAFKAIQEEhBAXFFBEAgBSgCZEEVQQAQFSAFKAIQEBcgBS0AHUEBcUUEQCAFKAJsEBcLIAVCfzcDeAwCCyAFKAIQEBcLAn8jAEEQayIAIAUoAmw2AgwgACgCDC0AAEEBcUULBEAgBSgCZEEUQQAQFSAFLQAdQQFxRQRAIAUoAmwQFwsgBUJ/NwN4DAELIAUtAB1BAXFFBEAgBSgCbBAXCyAFKAJ0KQNIQv///////////wBWBEAgBSgCZEEEQRYQFSAFQn83A3gMAQsgBSgCdCAFKAJkEIwDQQFxRQRAIAVCfzcDeAwBCyAFKAJ0KAI0EIMBIQAgBSgCdCAANgI0IAUgBSgCKCAFKAIkaq03A3gLIAUpA3ghBiAFQYABaiQAIAYLzQEBAX8jAEEQayIDJAAgAyAANgIMIAMgATYCCCADIAI2AgQgAyADQQxqQaygARAKNgIAAkAgAygCAEUEQCADKAIEQSE7AQAgAygCCEEAOwEADAELIAMoAgAoAhRB0ABIBEAgAygCAEHQADYCFAsgAygCBCADKAIAKAIMIAMoAgAoAhRBCXQgAygCACgCEEEFdGpBoMB9amo7AQAgAygCCCADKAIAKAIIQQt0IAMoAgAoAgRBBXRqIAMoAgAoAgBBAXVqOwEACyADQRBqJAALgwMBAX8jAEEgayIDJAAgAyAAOwEaIAMgATYCFCADIAI2AhAgAyADKAIUIANBCGpBwABBABBHIgA2AgwCQCAARQRAIANBADYCHAwBCyADKAIIQQVqQf//A0sEQCADKAIQQRJBABAVIANBADYCHAwBCyADQQAgAygCCEEFaq0QKiIANgIEIABFBEAgAygCEEEOQQAQFSADQQA2AhwMAQsgAygCBEEBEIoBIAMoAgQgAygCFBCIARAhIAMoAgQgAygCDCADKAIIEEACfyMAQRBrIgAgAygCBDYCDCAAKAIMLQAAQQFxRQsEQCADKAIQQRRBABAVIAMoAgQQFyADQQA2AhwMAQsgAyADLwEaAn8jAEEQayIAIAMoAgQ2AgwCfiAAKAIMLQAAQQFxBEAgACgCDCkDEAwBC0IAC6dB//8DcQsCfyMAQRBrIgAgAygCBDYCDCAAKAIMKAIEC0GABhBQNgIAIAMoAgQQFyADIAMoAgA2AhwLIAMoAhwhACADQSBqJAAgAAu0AgEBfyMAQTBrIgMkACADIAA2AiggAyABNwMgIAMgAjYCHAJAIAMpAyBQBEAgA0EBOgAvDAELIAMgAygCKCkDECADKQMgfDcDCAJAIAMpAwggAykDIFoEQCADKQMIQv////8AWA0BCyADKAIcQQ5BABAVIANBADoALwwBCyADIAMoAigoAgAgAykDCKdBBHQQTSIANgIEIABFBEAgAygCHEEOQQAQFSADQQA6AC8MAQsgAygCKCADKAIENgIAIAMgAygCKCkDCDcDEANAIAMpAxAgAykDCFpFBEAgAygCKCgCACADKQMQp0EEdGoQjAEgAyADKQMQQgF8NwMQDAELCyADKAIoIAMpAwgiATcDECADKAIoIAE3AwggA0EBOgAvCyADLQAvQQFxIQAgA0EwaiQAIAALzAEBAX8jAEEgayICJAAgAiAANwMQIAIgATYCDCACQTAQGSIBNgIIAkAgAUUEQCACKAIMQQ5BABAVIAJBADYCHAwBCyACKAIIQQA2AgAgAigCCEIANwMQIAIoAghCADcDCCACKAIIQgA3AyAgAigCCEIANwMYIAIoAghBADYCKCACKAIIQQA6ACwgAigCCCACKQMQIAIoAgwQxQFBAXFFBEAgAigCCBAlIAJBADYCHAwBCyACIAIoAgg2AhwLIAIoAhwhASACQSBqJAAgAQu2BQEBfyMAQTBrIgIkACACIAA2AiggAiABNwMgAkAgAikDICACKAIoKQMwWgRAIAIoAihBCGpBEkEAEBUgAkF/NgIsDAELIAIgAigCKCgCQCACKQMgp0EEdGo2AhwCQCACKAIcKAIABEAgAigCHCgCAC0ABEEBcUUNAQsgAkEANgIsDAELIAIoAhwoAgApA0hCGnxC////////////AFYEQCACKAIoQQhqQQRBFhAVIAJBfzYCLAwBCyACKAIoKAIAIAIoAhwoAgApA0hCGnxBABAoQQBIBEAgAigCKEEIaiACKAIoKAIAEBggAkF/NgIsDAELIAIgAigCKCgCAEIEIAJBGGogAigCKEEIahBBIgA2AhQgAEUEQCACQX82AiwMAQsgAiACKAIUEB47ARIgAiACKAIUEB47ARAgAigCFBBIQQFxRQRAIAIoAhQQFyACKAIoQQhqQRRBABAVIAJBfzYCLAwBCyACKAIUEBcgAi8BEEEASgRAIAIoAigoAgAgAi8BEq1BARAoQQBIBEAgAigCKEEIakEEQbScASgCABAVIAJBfzYCLAwCCyACQQAgAigCKCgCACACLwEQQQAgAigCKEEIahBgNgIIIAIoAghFBEAgAkF/NgIsDAILIAIoAgggAi8BEEGAAiACQQxqIAIoAihBCGoQhAFBAXFFBEAgAigCCBAWIAJBfzYCLAwCCyACKAIIEBYgAigCDARAIAIgAigCDBCDATYCDCACKAIcKAIAKAI0IAIoAgwQhQEhACACKAIcKAIAIAA2AjQLCyACKAIcKAIAQQE6AAQCQCACKAIcKAIERQ0AIAIoAhwoAgQtAARBAXENACACKAIcKAIEIAIoAhwoAgAoAjQ2AjQgAigCHCgCBEEBOgAECyACQQA2AiwLIAIoAiwhACACQTBqJAAgAAsHACAAKAIAC4wBAQF/IwBBIGsiAiQAIAIgADYCGCACIAE2AhQgAkEANgIQAkAgAigCFEUEQCACQQA2AhwMAQsgAiACKAIUEBk2AgwgAigCDEUEQCACKAIQQQ5BABAVIAJBADYCHAwBCyACKAIMIAIoAhggAigCFBAaGiACIAIoAgw2AhwLIAIoAhwhACACQSBqJAAgAAsYAEGonAFCADcCAEGwnAFBADYCAEGonAELiAEBAX8jAEEgayIDJAAgAyAANgIUIAMgATYCECADIAI3AwgCQAJAIAMoAhQoAiRBAUYEQCADKQMIQv///////////wBYDQELIAMoAhRBDGpBEkEAEBUgA0J/NwMYDAELIAMgAygCFCADKAIQIAMpAwhBCxAiNwMYCyADKQMYIQIgA0EgaiQAIAILcwEBfyMAQSBrIgEkACABIAA2AhggAUIINwMQIAEgASgCGCkDECABKQMQfDcDCAJAIAEpAwggASgCGCkDEFQEQCABKAIYQQA6AAAgAUF/NgIcDAELIAEgASgCGCABKQMIEC02AhwLIAEoAhwaIAFBIGokAAsIAEEBQQwQewuWAQEBfyMAQSBrIgIgADYCGCACIAE3AxACQAJAAkAgAigCGC0AAEEBcUUNACACKAIYKQMQIAIpAxB8IAIpAxBUDQAgAigCGCkDECACKQMQfCACKAIYKQMIWA0BCyACKAIYQQA6AAAgAkEANgIcDAELIAIgAigCGCgCBCACKAIYKQMQp2o2AgwgAiACKAIMNgIcCyACKAIcCwcAIAAoAigLuQIBAX8jAEEQayICIAA2AgggAiABNgIEAkAgAigCCEGAAUkEQCACKAIEIAIoAgg6AAAgAkEBNgIMDAELIAIoAghBgBBJBEAgAigCBCACKAIIQQZ2QR9xQcABcjoAACACKAIEIAIoAghBP3FBgAFyOgABIAJBAjYCDAwBCyACKAIIQYCABEkEQCACKAIEIAIoAghBDHZBD3FB4AFyOgAAIAIoAgQgAigCCEEGdkE/cUGAAXI6AAEgAigCBCACKAIIQT9xQYABcjoAAiACQQM2AgwMAQsgAigCBCACKAIIQRJ2QQdxQfABcjoAACACKAIEIAIoAghBDHZBP3FBgAFyOgABIAIoAgQgAigCCEEGdkE/cUGAAXI6AAIgAigCBCACKAIIQT9xQYABcjoAAyACQQQ2AgwLIAIoAgwLXwEBfyMAQRBrIgEgADYCCAJAIAEoAghBgAFJBEAgAUEBNgIMDAELIAEoAghBgBBJBEAgAUECNgIMDAELIAEoAghBgIAESQRAIAFBAzYCDAwBCyABQQQ2AgwLIAEoAgwL/gIBAX8jAEEwayIEJAAgBCAANgIoIAQgATYCJCAEIAI2AiAgBCADNgIcIAQgBCgCKDYCGAJAIAQoAiRFBEAgBCgCIARAIAQoAiBBADYCAAsgBEEANgIsDAELIARBATYCECAEQQA2AgwDQCAEKAIMIAQoAiRPRQRAIAQgBCgCGCAEKAIMai0AAEEBdEGwzwBqLwEAENEBIAQoAhBqNgIQIAQgBCgCDEEBajYCDAwBCwsgBCAEKAIQEBkiADYCFCAARQRAIAQoAhxBDkEAEBUgBEEANgIsDAELIARBADYCCCAEQQA2AgwDQCAEKAIMIAQoAiRPRQRAIAQgBCgCGCAEKAIMai0AAEEBdEGwzwBqLwEAIAQoAhQgBCgCCGoQ0AEgBCgCCGo2AgggBCAEKAIMQQFqNgIMDAELCyAEKAIUIAQoAhBBAWtqQQA6AAAgBCgCIARAIAQoAiAgBCgCEEEBazYCAAsgBCAEKAIUNgIsCyAEKAIsIQAgBEEwaiQAIAALBwAgACgCGAvyCwEBfyMAQSBrIgMgADYCHCADIAE2AhggAyACNgIUIAMgAygCHEEIdkGA/gNxIAMoAhxBGHZqIAMoAhxBgP4DcUEIdGogAygCHEH/AXFBGHRqNgIQIAMgAygCEEF/czYCEANAQQAhACADKAIUBH8gAygCGEEDcUEARwVBAAtBAXEEQCADKAIQQRh2IQAgAyADKAIYIgFBAWo2AhggAyABLQAAIABzQQJ0QbAvaigCACADKAIQQQh0czYCECADIAMoAhRBf2o2AhQMAQsLIAMgAygCGDYCDANAIAMoAhRBIElFBEAgAyADKAIMIgBBBGo2AgwgAyAAKAIAIAMoAhBzNgIQIAMgAygCEEEYdkECdEGwxwBqKAIAIAMoAhBBEHZB/wFxQQJ0QbA/aigCACADKAIQQf8BcUECdEGwL2ooAgAgAygCEEEIdkH/AXFBAnRBsDdqKAIAc3NzNgIQIAMgAygCDCIAQQRqNgIMIAMgACgCACADKAIQczYCECADIAMoAhBBGHZBAnRBsMcAaigCACADKAIQQRB2Qf8BcUECdEGwP2ooAgAgAygCEEH/AXFBAnRBsC9qKAIAIAMoAhBBCHZB/wFxQQJ0QbA3aigCAHNzczYCECADIAMoAgwiAEEEajYCDCADIAAoAgAgAygCEHM2AhAgAyADKAIQQRh2QQJ0QbDHAGooAgAgAygCEEEQdkH/AXFBAnRBsD9qKAIAIAMoAhBB/wFxQQJ0QbAvaigCACADKAIQQQh2Qf8BcUECdEGwN2ooAgBzc3M2AhAgAyADKAIMIgBBBGo2AgwgAyAAKAIAIAMoAhBzNgIQIAMgAygCEEEYdkECdEGwxwBqKAIAIAMoAhBBEHZB/wFxQQJ0QbA/aigCACADKAIQQf8BcUECdEGwL2ooAgAgAygCEEEIdkH/AXFBAnRBsDdqKAIAc3NzNgIQIAMgAygCDCIAQQRqNgIMIAMgACgCACADKAIQczYCECADIAMoAhBBGHZBAnRBsMcAaigCACADKAIQQRB2Qf8BcUECdEGwP2ooAgAgAygCEEH/AXFBAnRBsC9qKAIAIAMoAhBBCHZB/wFxQQJ0QbA3aigCAHNzczYCECADIAMoAgwiAEEEajYCDCADIAAoAgAgAygCEHM2AhAgAyADKAIQQRh2QQJ0QbDHAGooAgAgAygCEEEQdkH/AXFBAnRBsD9qKAIAIAMoAhBB/wFxQQJ0QbAvaigCACADKAIQQQh2Qf8BcUECdEGwN2ooAgBzc3M2AhAgAyADKAIMIgBBBGo2AgwgAyAAKAIAIAMoAhBzNgIQIAMgAygCEEEYdkECdEGwxwBqKAIAIAMoAhBBEHZB/wFxQQJ0QbA/aigCACADKAIQQf8BcUECdEGwL2ooAgAgAygCEEEIdkH/AXFBAnRBsDdqKAIAc3NzNgIQIAMgAygCDCIAQQRqNgIMIAMgACgCACADKAIQczYCECADIAMoAhBBGHZBAnRBsMcAaigCACADKAIQQRB2Qf8BcUECdEGwP2ooAgAgAygCEEH/AXFBAnRBsC9qKAIAIAMoAhBBCHZB/wFxQQJ0QbA3aigCAHNzczYCECADIAMoAhRBIGs2AhQMAQsLA0AgAygCFEEESUUEQCADIAMoAgwiAEEEajYCDCADIAAoAgAgAygCEHM2AhAgAyADKAIQQRh2QQJ0QbDHAGooAgAgAygCEEEQdkH/AXFBAnRBsD9qKAIAIAMoAhBB/wFxQQJ0QbAvaigCACADKAIQQQh2Qf8BcUECdEGwN2ooAgBzc3M2AhAgAyADKAIUQQRrNgIUDAELCyADIAMoAgw2AhggAygCFARAA0AgAygCEEEYdiEAIAMgAygCGCIBQQFqNgIYIAMgAS0AACAAc0ECdEGwL2ooAgAgAygCEEEIdHM2AhAgAyADKAIUQX9qIgA2AhQgAA0ACwsgAyADKAIQQX9zNgIQIAMoAhBBCHZBgP4DcSADKAIQQRh2aiADKAIQQYD+A3FBCHRqIAMoAhBB/wFxQRh0aguTCwEBfyMAQSBrIgMgADYCHCADIAE2AhggAyACNgIUIAMgAygCHDYCECADIAMoAhBBf3M2AhADQEEAIQAgAygCFAR/IAMoAhhBA3FBAEcFQQALQQFxBEAgAygCECEAIAMgAygCGCIBQQFqNgIYIAMgAS0AACAAc0H/AXFBAnRBsA9qKAIAIAMoAhBBCHZzNgIQIAMgAygCFEF/ajYCFAwBCwsgAyADKAIYNgIMA0AgAygCFEEgSUUEQCADIAMoAgwiAEEEajYCDCADIAAoAgAgAygCEHM2AhAgAyADKAIQQRh2QQJ0QbAPaigCACADKAIQQRB2Qf8BcUECdEGwF2ooAgAgAygCEEH/AXFBAnRBsCdqKAIAIAMoAhBBCHZB/wFxQQJ0QbAfaigCAHNzczYCECADIAMoAgwiAEEEajYCDCADIAAoAgAgAygCEHM2AhAgAyADKAIQQRh2QQJ0QbAPaigCACADKAIQQRB2Qf8BcUECdEGwF2ooAgAgAygCEEH/AXFBAnRBsCdqKAIAIAMoAhBBCHZB/wFxQQJ0QbAfaigCAHNzczYCECADIAMoAgwiAEEEajYCDCADIAAoAgAgAygCEHM2AhAgAyADKAIQQRh2QQJ0QbAPaigCACADKAIQQRB2Qf8BcUECdEGwF2ooAgAgAygCEEH/AXFBAnRBsCdqKAIAIAMoAhBBCHZB/wFxQQJ0QbAfaigCAHNzczYCECADIAMoAgwiAEEEajYCDCADIAAoAgAgAygCEHM2AhAgAyADKAIQQRh2QQJ0QbAPaigCACADKAIQQRB2Qf8BcUECdEGwF2ooAgAgAygCEEH/AXFBAnRBsCdqKAIAIAMoAhBBCHZB/wFxQQJ0QbAfaigCAHNzczYCECADIAMoAgwiAEEEajYCDCADIAAoAgAgAygCEHM2AhAgAyADKAIQQRh2QQJ0QbAPaigCACADKAIQQRB2Qf8BcUECdEGwF2ooAgAgAygCEEH/AXFBAnRBsCdqKAIAIAMoAhBBCHZB/wFxQQJ0QbAfaigCAHNzczYCECADIAMoAgwiAEEEajYCDCADIAAoAgAgAygCEHM2AhAgAyADKAIQQRh2QQJ0QbAPaigCACADKAIQQRB2Qf8BcUECdEGwF2ooAgAgAygCEEH/AXFBAnRBsCdqKAIAIAMoAhBBCHZB/wFxQQJ0QbAfaigCAHNzczYCECADIAMoAgwiAEEEajYCDCADIAAoAgAgAygCEHM2AhAgAyADKAIQQRh2QQJ0QbAPaigCACADKAIQQRB2Qf8BcUECdEGwF2ooAgAgAygCEEH/AXFBAnRBsCdqKAIAIAMoAhBBCHZB/wFxQQJ0QbAfaigCAHNzczYCECADIAMoAgwiAEEEajYCDCADIAAoAgAgAygCEHM2AhAgAyADKAIQQRh2QQJ0QbAPaigCACADKAIQQRB2Qf8BcUECdEGwF2ooAgAgAygCEEH/AXFBAnRBsCdqKAIAIAMoAhBBCHZB/wFxQQJ0QbAfaigCAHNzczYCECADIAMoAhRBIGs2AhQMAQsLA0AgAygCFEEESUUEQCADIAMoAgwiAEEEajYCDCADIAAoAgAgAygCEHM2AhAgAyADKAIQQRh2QQJ0QbAPaigCACADKAIQQRB2Qf8BcUECdEGwF2ooAgAgAygCEEH/AXFBAnRBsCdqKAIAIAMoAhBBCHZB/wFxQQJ0QbAfaigCAHNzczYCECADIAMoAhRBBGs2AhQMAQsLIAMgAygCDDYCGCADKAIUBEADQCADKAIQIQAgAyADKAIYIgFBAWo2AhggAyABLQAAIABzQf8BcUECdEGwD2ooAgAgAygCEEEIdnM2AhAgAyADKAIUQX9qIgA2AhQgAA0ACwsgAyADKAIQQX9zNgIQIAMoAhALhgEBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhACQCADKAIURQRAIANBADYCHAwBCyADQQE2AgwgAy0ADARAIAMgAygCGCADKAIUIAMoAhAQ1QE2AhwMAQsgAyADKAIYIAMoAhQgAygCEBDUATYCHAsgAygCHCEAIANBIGokACAACwcAIAAoAhALIgEBfyMAQRBrIgEgADYCDCABKAIMIgAgACgCMEEBajYCMAsUACAAIAGtIAKtQiCGhCADIAQQegsTAQF+IAAQSiIBQiCIpxAAIAGnCxIAIAAgAa0gAq1CIIaEIAMQKAsfAQF+IAAgASACrSADrUIghoQQLyIEQiCIpxAAIASnCxUAIAAgAa0gAq1CIIaEIAMgBBC/AQsUACAAIAEgAq0gA61CIIaEIAQQeQsVACAAIAGtIAKtQiCGhCADIAQQ8AELFwEBfiAAIAEgAhBuIgNCIIinEAAgA6cLFgEBfiAAIAEQkQIiAkIgiKcQACACpwsTACAAIAGtIAKtQiCGhCADEMABCyABAX4gACABIAKtIAOtQiCGhBCSAiIEQiCIpxAAIASnCxMAIAAgAa0gAq1CIIaEIAMQkwILFQAgACABrSACrUIghoQgAyAEEJYCCxcAIAAgAa0gAq1CIIaEIAMgBCAFEJ8BCxcAIAAgAa0gAq1CIIaEIAMgBCAFEJ4BCxoBAX4gACABIAIgAxCaAiIEQiCIpxAAIASnCxgBAX4gACABIAIQnAIiA0IgiKcQACADpwsRACAAIAGtIAKtQiCGhBChAQsQACMAIABrQXBxIgAkACAACwYAIAAkAAsEACMAC8QBAQF/IwBBMGsiASQAIAEgADYCKCABQQA2AiQgAUIANwMYAkADQCABKQMYIAEoAigpAzBUBEAgASABKAIoIAEpAxhBACABQRdqIAFBEGoQngE2AgwgASgCDEF/RgRAIAFBfzYCLAwDBQJAIAEtABdBA0cNACABKAIQQRB2QYDgA3FBgMACRw0AIAEgASgCJEEBajYCJAsgASABKQMYQgF8NwMYDAILAAsLIAEgASgCJDYCLAsgASgCLCEAIAFBMGokACAAC4IBAgF/AX4jAEEgayIEJAAgBCAANgIYIAQgATYCFCAEIAI2AhAgBCADNgIMIAQgBCgCGCAEKAIUIAQoAhAQbiIFNwMAAkAgBUIAUwRAIARBfzYCHAwBCyAEIAQoAhggBCkDACAEKAIQIAQoAgwQejYCHAsgBCgCHCEAIARBIGokACAAC9IDAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE3AxAgBCACNgIMIAQgAzYCCAJAAkAgBCkDECAEKAIYKQMwVARAIAQoAghBCU0NAQsgBCgCGEEIakESQQAQFSAEQX82AhwMAQsgBCgCGCgCGEECcQRAIAQoAhhBCGpBGUEAEBUgBEF/NgIcDAELIAQoAgwQwwJBAXFFBEAgBCgCGEEIakEQQQAQFSAEQX82AhwMAQsgBCAEKAIYKAJAIAQpAxCnQQR0ajYCBCAEAn9BfyAEKAIEKAIARQ0AGiAEKAIEKAIAKAIQCzYCAAJAIAQoAgwgBCgCAEYEQCAEKAIEKAIEBEAgBCgCBCgCBCIAIAAoAgBBfnE2AgAgBCgCBCgCBEEAOwFQIAQoAgQoAgQoAgBFBEAgBCgCBCgCBBA6IAQoAgRBADYCBAsLDAELIAQoAgQoAgRFBEAgBCgCBCgCABBGIQAgBCgCBCAANgIEIABFBEAgBCgCGEEIakEOQQAQFSAEQX82AhwMAwsLIAQoAgQoAgQgBCgCDDYCECAEKAIEKAIEIAQoAgg7AVAgBCgCBCgCBCIAIAAoAgBBAXI2AgALIARBADYCHAsgBCgCHCEAIARBIGokACAAC5ACAQF/IwBBEGsiAiQAIAIgADYCCCACIAE2AgQCQAJAAkAgAigCCC8BCiACKAIELwEKSA0AIAIoAggoAhAgAigCBCgCEEcNACACKAIIKAIUIAIoAgQoAhRHDQAgAigCCCgCMCACKAIEKAIwEIcBDQELIAJBfzYCDAwBCwJAAkAgAigCCCgCGCACKAIEKAIYRw0AIAIoAggpAyAgAigCBCkDIFINACACKAIIKQMoIAIoAgQpAyhRDQELAkACQCACKAIELwEMQQhxRQ0AIAIoAgQoAhgNACACKAIEKQMgQgBSDQAgAigCBCkDKFANAQsgAkF/NgIMDAILCyACQQA2AgwLIAIoAgwhACACQRBqJAAgAAv6AwEBfyMAQdAAayIEJAAgBCAANgJIIAQgATcDQCAEIAI2AjwgBCADNgI4AkAgBCgCSBAwQhZUBEAgBCgCOEEVQQAQFSAEQQA2AkwMAQsjAEEQayIAIAQoAkg2AgwgBAJ+IAAoAgwtAABBAXEEQCAAKAIMKQMQDAELQgALNwMIIAQoAkhCBBAfGiAEKAJIECsEQCAEKAI4QQFBABAVIARBADYCTAwBCyAEIAQoAkgQHkH//wNxrTcDKCAEIAQoAkgQHkH//wNxrTcDICAEKQMgIAQpAyhSBEAgBCgCOEETQQAQFSAEQQA2AkwMAQsgBCAEKAJIECutNwMYIAQgBCgCSBArrTcDECAEKQMQIAQpAxh8IAQpAxBUBEAgBCgCOEEEQRYQFSAEQQA2AkwMAQsgBCkDECAEKQMYfCAEKQNAIAQpAwh8VgRAIAQoAjhBFUEAEBUgBEEANgJMDAELAkAgBCgCPEEEcUUNACAEKQMQIAQpAxh8IAQpA0AgBCkDCHxRDQAgBCgCOEEVQQAQFSAEQQA2AkwMAQsgBCAEKQMgIAQoAjgQxgEiADYCNCAARQRAIARBADYCTAwBCyAEKAI0QQA6ACwgBCgCNCAEKQMYNwMYIAQoAjQgBCkDEDcDICAEIAQoAjQ2AkwLIAQoAkwhACAEQdAAaiQAIAAL1QoBAX8jAEGwAWsiBSQAIAUgADYCqAEgBSABNgKkASAFIAI3A5gBIAUgAzYClAEgBSAENgKQASMAQRBrIgAgBSgCpAE2AgwgBQJ+IAAoAgwtAABBAXEEQCAAKAIMKQMQDAELQgALNwMYIAUoAqQBQgQQHxogBSAFKAKkARAeQf//A3E2AhAgBSAFKAKkARAeQf//A3E2AgggBSAFKAKkARAxNwM4AkAgBSkDOEL///////////8AVgRAIAUoApABQQRBFhAVIAVBADYCrAEMAQsgBSkDOEI4fCAFKQMYIAUpA5gBfFYEQCAFKAKQAUEVQQAQFSAFQQA2AqwBDAELAkACQCAFKQM4IAUpA5gBVA0AIAUpAzhCOHwgBSkDmAECfiMAQRBrIgAgBSgCpAE2AgwgACgCDCkDCAt8Vg0AIAUoAqQBIAUpAzggBSkDmAF9EC0aIAVBADoAFwwBCyAFKAKoASAFKQM4QQAQKEEASARAIAUoApABIAUoAqgBEBggBUEANgKsAQwCCyAFIAUoAqgBQjggBUFAayAFKAKQARBBIgA2AqQBIABFBEAgBUEANgKsAQwCCyAFQQE6ABcLIAUoAqQBQgQQHygAAEHQlpkwRwRAIAUoApABQRVBABAVIAUtABdBAXEEQCAFKAKkARAXCyAFQQA2AqwBDAELIAUgBSgCpAEQMTcDMAJAIAUoApQBQQRxRQ0AIAUpAzAgBSkDOHxCDHwgBSkDmAEgBSkDGHxRDQAgBSgCkAFBFUEAEBUgBS0AF0EBcQRAIAUoAqQBEBcLIAVBADYCrAEMAQsgBSgCpAFCBBAfGiAFIAUoAqQBECs2AgwgBSAFKAKkARArNgIEIAUoAhBB//8DRgRAIAUgBSgCDDYCEAsgBSgCCEH//wNGBEAgBSAFKAIENgIICwJAIAUoApQBQQRxRQ0AIAUoAgggBSgCBEYEQCAFKAIQIAUoAgxGDQELIAUoApABQRVBABAVIAUtABdBAXEEQCAFKAKkARAXCyAFQQA2AqwBDAELAkAgBSgCEEUEQCAFKAIIRQ0BCyAFKAKQAUEBQQAQFSAFLQAXQQFxBEAgBSgCpAEQFwsgBUEANgKsAQwBCyAFIAUoAqQBEDE3AyggBSAFKAKkARAxNwMgIAUpAyggBSkDIFIEQCAFKAKQAUEBQQAQFSAFLQAXQQFxBEAgBSgCpAEQFwsgBUEANgKsAQwBCyAFIAUoAqQBEDE3AzAgBSAFKAKkARAxNwOAAQJ/IwBBEGsiACAFKAKkATYCDCAAKAIMLQAAQQFxRQsEQCAFKAKQAUEUQQAQFSAFLQAXQQFxBEAgBSgCpAEQFwsgBUEANgKsAQwBCyAFLQAXQQFxBEAgBSgCpAEQFwsCQCAFKQOAAUL///////////8AWARAIAUpA4ABIAUpAzB8IAUpA4ABWg0BCyAFKAKQAUEEQRYQFSAFQQA2AqwBDAELIAUpA4ABIAUpAzB8IAUpA5gBIAUpAzh8VgRAIAUoApABQRVBABAVIAVBADYCrAEMAQsCQCAFKAKUAUEEcUUNACAFKQOAASAFKQMwfCAFKQOYASAFKQM4fFENACAFKAKQAUEVQQAQFSAFQQA2AqwBDAELIAUpAyggBSkDMEIugFYEQCAFKAKQAUEVQQAQFSAFQQA2AqwBDAELIAUgBSkDKCAFKAKQARDGASIANgKMASAARQRAIAVBADYCrAEMAQsgBSgCjAFBAToALCAFKAKMASAFKQMwNwMYIAUoAowBIAUpA4ABNwMgIAUgBSgCjAE2AqwBCyAFKAKsASEAIAVBsAFqJAAgAAviCwEBfyMAQfAAayIEJAAgBCAANgJoIAQgATYCZCAEIAI3A1ggBCADNgJUIwBBEGsiACAEKAJkNgIMIAQCfiAAKAIMLQAAQQFxBEAgACgCDCkDEAwBC0IACzcDMAJAIAQoAmQQMEIWVARAIAQoAlRBE0EAEBUgBEEANgJsDAELIAQoAmRCBBAfKAAAQdCWlTBHBEAgBCgCVEETQQAQFSAEQQA2AmwMAQsCQAJAIAQpAzBCFFQNACMAQRBrIgAgBCgCZDYCDCAAKAIMKAIEIAQpAzCnakFsaigAAEHQlpk4Rw0AIAQoAmQgBCkDMEIUfRAtGiAEIAQoAmgoAgAgBCgCZCAEKQNYIAQoAmgoAhQgBCgCVBDzATYCUAwBCyAEKAJkIAQpAzAQLRogBCAEKAJkIAQpA1ggBCgCaCgCFCAEKAJUEPIBNgJQCyAEKAJQRQRAIARBADYCbAwBCyAEKAJkIAQpAzBCFHwQLRogBCAEKAJkEB47AU4gBCgCUCkDICAEKAJQKQMYfCAEKQNYIAQpAzB8VgRAIAQoAlRBFUEAEBUgBCgCUBAlIARBADYCbAwBCwJAIAQvAU5FBEAgBCgCaCgCBEEEcUUNAQsgBCgCZCAEKQMwQhZ8EC0aIAQgBCgCZBAwNwMgAkAgBCkDICAELwFOrVoEQCAEKAJoKAIEQQRxRQ0BIAQpAyAgBC8BTq1RDQELIAQoAlRBFUEAEBUgBCgCUBAlIARBADYCbAwCCyAELwFOBEAgBCgCZCAELwFOrRAfIAQvAU5BACAEKAJUEFEhACAEKAJQIAA2AiggAEUEQCAEKAJQECUgBEEANgJsDAMLCwsCQCAEKAJQKQMgIAQpA1haBEAgBCgCZCAEKAJQKQMgIAQpA1h9EC0aIAQgBCgCZCAEKAJQKQMYEB8iADYCHCAARQRAIAQoAlRBFUEAEBUgBCgCUBAlIARBADYCbAwDCyAEIAQoAhwgBCgCUCkDGBAqIgA2AiwgAEUEQCAEKAJUQQ5BABAVIAQoAlAQJSAEQQA2AmwMAwsMAQsgBEEANgIsIAQoAmgoAgAgBCgCUCkDIEEAEChBAEgEQCAEKAJUIAQoAmgoAgAQGCAEKAJQECUgBEEANgJsDAILIAQoAmgoAgAQSiAEKAJQKQMgUgRAIAQoAlRBE0EAEBUgBCgCUBAlIARBADYCbAwCCwsgBCAEKAJQKQMYNwM4IARCADcDQANAAkAgBCkDOEIAWA0AIARBADoAGyAEKQNAIAQoAlApAwhRBEAgBCgCUC0ALEEBcQ0BIAQpAzhCLlQNASAEKAJQQoCABCAEKAJUEMUBQQFxRQRAIAQoAlAQJSAEKAIsEBcgBEEANgJsDAQLIARBAToAGwsQjgMhACAEKAJQKAIAIAQpA0CnQQR0aiAANgIAAkAgAARAIAQgBCgCUCgCACAEKQNAp0EEdGooAgAgBCgCaCgCACAEKAIsQQAgBCgCVBDCASICNwMQIAJCAFkNAQsCQCAELQAbQQFxRQ0AIwBBEGsiACAEKAJUNgIMIAAoAgwoAgBBE0cNACAEKAJUQRVBABAVCyAEKAJQECUgBCgCLBAXIARBADYCbAwDCyAEIAQpA0BCAXw3A0AgBCAEKQM4IAQpAxB9NwM4DAELCwJAIAQpA0AgBCgCUCkDCFEEQCAEKQM4QgBYDQELIAQoAlRBFUEAEBUgBCgCLBAXIAQoAlAQJSAEQQA2AmwMAQsgBCgCaCgCBEEEcQRAAkAgBCgCLARAIAQgBCgCLBBIQQFxOgAPDAELIAQgBCgCaCgCABBKNwMAIAQpAwBCAFMEQCAEKAJUIAQoAmgoAgAQGCAEKAJQECUgBEEANgJsDAMLIAQgBCkDACAEKAJQKQMgIAQoAlApAxh8UToADwsgBC0AD0EBcUUEQCAEKAJUQRVBABAVIAQoAiwQFyAEKAJQECUgBEEANgJsDAILCyAEKAIsEBcgBCAEKAJQNgJsCyAEKAJsIQAgBEHwAGokACAAC9cBAQF/IwBBIGsiAiQAIAIgADYCGCACIAE2AhQgAkGJmAE2AhAgAkEENgIMAkACQCACKAIUIAIoAgxPBEAgAigCDA0BCyACQQA2AhwMAQsgAiACKAIYQX9qNgIIA0ACQCACIAIoAghBAWogAigCEC0AACACKAIYIAIoAghrIAIoAhQgAigCDGtqEKYBIgA2AgggAEUNACACKAIIQQFqIAIoAhBBAWogAigCDEEBaxBTDQEgAiACKAIINgIcDAILCyACQQA2AhwLIAIoAhwhACACQSBqJAAgAAvBBgEBfyMAQeAAayICJAAgAiAANgJYIAIgATcDUAJAIAIpA1BCFlQEQCACKAJYQQhqQRNBABAVIAJBADYCXAwBCyACAn4gAikDUEKqgARUBEAgAikDUAwBC0KqgAQLNwMwIAIoAlgoAgBCACACKQMwfUECEChBAEgEQCMAQRBrIgAgAigCWCgCADYCDCACIAAoAgxBDGo2AggCQAJ/IwBBEGsiACACKAIINgIMIAAoAgwoAgBBBEYLBEAjAEEQayIAIAIoAgg2AgwgACgCDCgCBEEWRg0BCyACKAJYQQhqIAIoAggQRCACQQA2AlwMAgsLIAIgAigCWCgCABBKIgE3AzggAUIAUwRAIAIoAlhBCGogAigCWCgCABAYIAJBADYCXAwBCyACIAIoAlgoAgAgAikDMEEAIAIoAlhBCGoQQSIANgIMIABFBEAgAkEANgJcDAELIAJCfzcDICACQQA2AkwgAikDMEKqgARaBEAgAigCDEIUEC0aCyACQRBqQRNBABAVIAIgAigCDEIAEB82AkQDQAJAIAIgAigCRCACKAIMEDBCEn2nEPUBIgA2AkQgAEUNACACKAIMIAIoAkQCfyMAQRBrIgAgAigCDDYCDCAAKAIMKAIEC2usEC0aIAIgAigCWCACKAIMIAIpAzggAkEQahD0ASIANgJIIAAEQAJAIAIoAkwEQCACKQMgQgBXBEAgAiACKAJYIAIoAkwgAkEQahBlNwMgCyACIAIoAlggAigCSCACQRBqEGU3AygCQCACKQMgIAIpAyhTBEAgAigCTBAlIAIgAigCSDYCTCACIAIpAyg3AyAMAQsgAigCSBAlCwwBCyACIAIoAkg2AkwCQCACKAJYKAIEQQRxBEAgAiACKAJYIAIoAkwgAkEQahBlNwMgDAELIAJCADcDIAsLIAJBADYCSAsgAiACKAJEQQFqNgJEIAIoAgwgAigCRAJ/IwBBEGsiACACKAIMNgIMIAAoAgwoAgQLa6wQLRoMAQsLIAIoAgwQFyACKQMgQgBTBEAgAigCWEEIaiACQRBqEEQgAigCTBAlIAJBADYCXAwBCyACIAIoAkw2AlwLIAIoAlwhACACQeAAaiQAIAALvwUBAX8jAEHwAGsiAyQAIAMgADYCaCADIAE2AmQgAyACNgJgIANBIGoiABA8AkAgAygCaCAAEDlBAEgEQCADKAJgIAMoAmgQGCADQQA2AmwMAQsgAykDIEIEg1AEQCADKAJgQQRBigEQFSADQQA2AmwMAQsgAyADKQM4NwMYIAMgAygCaCADKAJkIAMoAmAQZiIANgJcIABFBEAgA0EANgJsDAELAkAgAykDGFBFDQAgAygCaBCUAUEBcUUNACADIAMoAlw2AmwMAQsgAyADKAJcIAMpAxgQ9gEiADYCWCAARQRAIAMoAmAgAygCXEEIahBEIwBBEGsiACADKAJoNgIMIAAoAgwiACAAKAIwQQFqNgIwIAMoAlwQPyADQQA2AmwMAQsgAygCXCADKAJYKAIANgJAIAMoAlwgAygCWCkDCDcDMCADKAJcIAMoAlgpAxA3AzggAygCXCADKAJYKAIoNgIgIAMoAlgQFiADKAJcKAJQIAMoAlwpAzAgAygCXEEIahD9AiADQgA3AxADQCADKQMQIAMoAlwpAzBUBEAgAyADKAJcKAJAIAMpAxCnQQR0aigCACgCMEEAQQAgAygCYBBHNgIMIAMoAgxFBEAjAEEQayIAIAMoAmg2AgwgACgCDCIAIAAoAjBBAWo2AjAgAygCXBA/IANBADYCbAwDCyADKAJcKAJQIAMoAgwgAykDEEEIIAMoAlxBCGoQfUEBcUUEQAJAIAMoAlwoAghBCkYEQCADKAJkQQRxRQ0BCyADKAJgIAMoAlxBCGoQRCMAQRBrIgAgAygCaDYCDCAAKAIMIgAgACgCMEEBajYCMCADKAJcED8gA0EANgJsDAQLCyADIAMpAxBCAXw3AxAMAQsLIAMoAlwgAygCXCgCFDYCGCADIAMoAlw2AmwLIAMoAmwhACADQfAAaiQAIAALwQEBAX8jAEHQAGsiAiQAIAIgADYCSCACIAE2AkQgAkEIaiIAEDwCQCACKAJIIAAQOQRAIwBBEGsiACACKAJINgIMIAIgACgCDEEMajYCBCMAQRBrIgAgAigCBDYCDAJAIAAoAgwoAgBBBUcNACMAQRBrIgAgAigCBDYCDCAAKAIMKAIEQSxHDQAgAkEANgJMDAILIAIoAkQgAigCBBBEIAJBfzYCTAwBCyACQQE2AkwLIAIoAkwhACACQdAAaiQAIAAL6gEBAX8jAEEwayIDJAAgAyAANgIoIAMgATYCJCADIAI2AiAjAEEQayIAIANBCGoiATYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCADIAMoAiggARD7ASIANgIYAkAgAEUEQCADKAIgIANBCGoiABCTASAAEDggA0EANgIsDAELIAMgAygCGCADKAIkIANBCGoQkgEiADYCHCAARQRAIAMoAhgQHCADKAIgIANBCGoiABCTASAAEDggA0EANgIsDAELIANBCGoQOCADIAMoAhw2AiwLIAMoAiwhACADQTBqJAAgAAvIAgEBfyMAQRBrIgEkACABIAA2AgggAUHYABAZNgIEAkAgASgCBEUEQCABKAIIQQ5BABAVIAFBADYCDAwBCyABKAIIEIEDIQAgASgCBCAANgJQIABFBEAgASgCBBAWIAFBADYCDAwBCyABKAIEQQA2AgAgASgCBEEANgIEIwBBEGsiACABKAIEQQhqNgIMIAAoAgxBADYCACAAKAIMQQA2AgQgACgCDEEANgIIIAEoAgRBADYCGCABKAIEQQA2AhQgASgCBEEANgIcIAEoAgRBADYCJCABKAIEQQA2AiAgASgCBEEAOgAoIAEoAgRCADcDOCABKAIEQgA3AzAgASgCBEEANgJAIAEoAgRBADYCSCABKAIEQQA2AkQgASgCBEEANgJMIAEoAgRBADYCVCABIAEoAgQ2AgwLIAEoAgwhACABQRBqJAAgAAuBAQEBfyMAQSBrIgIkACACIAA2AhggAkIANwMQIAJCfzcDCCACIAE2AgQCQAJAIAIoAhgEQCACKQMIQn9ZDQELIAIoAgRBEkEAEBUgAkEANgIcDAELIAIgAigCGCACKQMQIAIpAwggAigCBBD/ATYCHAsgAigCHCEAIAJBIGokACAAC80BAQJ/IwBBIGsiASQAIAEgADYCGCABQQA6ABcgAUGAgCA2AgwCQCABLQAXQQFxBEAgASABKAIMQQJyNgIMDAELIAEgASgCDDYCDAsgASgCGCEAIAEoAgwhAiABQbYDNgIAIAEgACACIAEQaSIANgIQAkAgAEEASARAIAFBADYCHAwBCyABIAEoAhBBgpgBQYaYASABLQAXQQFxGxCXASIANgIIIABFBEAgAUEANgIcDAELIAEgASgCCDYCHAsgASgCHCEAIAFBIGokACAAC8gCAQF/IwBBgAFrIgEkACABIAA2AnggASABKAJ4KAIYECxBCGoQGSIANgJ0AkAgAEUEQCABKAJ4QQ5BABAVIAFBfzYCfAwBCwJAIAEoAngoAhggAUEQahCcAUUEQCABIAEoAhw2AmwMAQsgAUF/NgJsCyABKAJ0IQAgASABKAJ4KAIYNgIAIABB+JcBIAEQbyABIAEoAnQgASgCbBCGAiIANgJwIABBf0YEQCABKAJ4QQxBtJwBKAIAEBUgASgCdBAWIAFBfzYCfAwBCyABIAEoAnBBgpgBEJcBIgA2AmggAEUEQCABKAJ4QQxBtJwBKAIAEBUgASgCcBBoIAEoAnQQaxogASgCdBAWIAFBfzYCfAwBCyABKAJ4IAEoAmg2AoQBIAEoAnggASgCdDYCgAEgAUEANgJ8CyABKAJ8IQAgAUGAAWokACAAC8AQAQF/IwBB4ABrIgQkACAEIAA2AlQgBCABNgJQIAQgAjcDSCAEIAM2AkQgBCAEKAJUNgJAIAQgBCgCUDYCPAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAQoAkQOEwYHAgwEBQoOAQMJEAsPDQgREQARCyAEQgA3A1gMEQsgBCgCQCgCGEUEQCAEKAJAQRxBABAVIARCfzcDWAwRCyAEIAQoAkAQ/QGsNwNYDBALIAQoAkAoAhgEQCAEKAJAKAIcEFQaIAQoAkBBADYCHAsgBEIANwNYDA8LIAQoAkAoAoQBEFRBAEgEQCAEKAJAQQA2AoQBIAQoAkBBBkG0nAEoAgAQFQsgBCgCQEEANgKEASAEKAJAKAKAASAEKAJAKAIYEAciAEGBYE8Ef0G0nAFBACAAazYCAEF/BSAAC0EASARAIAQoAkBBAkG0nAEoAgAQFSAEQn83A1gMDwsgBCgCQCgCgAEQFiAEKAJAQQA2AoABIARCADcDWAwOCyAEIAQoAkAgBCgCUCAEKQNIEEI3A1gMDQsgBCgCQCgCGBAWIAQoAkAoAoABEBYgBCgCQCgCHARAIAQoAkAoAhwQVBoLIAQoAkAQFiAEQgA3A1gMDAsgBCgCQCgCGARAIAQoAkAoAhgQ/AEhACAEKAJAIAA2AhwgAEUEQCAEKAJAQQtBtJwBKAIAEBUgBEJ/NwNYDA0LCyAEKAJAKQNoQgBWBEAgBCgCQCgCHCAEKAJAKQNoIAQoAkAQlQFBAEgEQCAEQn83A1gMDQsLIAQoAkBCADcDeCAEQgA3A1gMCwsCQCAEKAJAKQNwQgBWBEAgBCAEKAJAKQNwIAQoAkApA3h9NwMwIAQpAzAgBCkDSFYEQCAEIAQpA0g3AzALDAELIAQgBCkDSDcDMAsgBCkDMEL/////D1YEQCAEQv////8PNwMwCyAEIAQoAjwgBCkDMKcgBCgCQCgCHBCLAiIANgIsIABFBEACfyAEKAJAKAIcIgAoAkxBf0wEQCAAKAIADAELIAAoAgALQQV2QQFxBEAgBCgCQEEFQbScASgCABAVIARCfzcDWAwMCwsgBCgCQCIAIAApA3ggBCgCLK18NwN4IAQgBCgCLK03A1gMCgsgBCgCQCgCGBBrQQBIBEAgBCgCQEEWQbScASgCABAVIARCfzcDWAwKCyAEQgA3A1gMCQsgBCgCQCgChAEEQCAEKAJAKAKEARBUGiAEKAJAQQA2AoQBCyAEKAJAKAKAARBrGiAEKAJAKAKAARAWIAQoAkBBADYCgAEgBEIANwNYDAgLIAQCfyAEKQNIQhBUBEAgBCgCQEESQQAQFUEADAELIAQoAlALNgIYIAQoAhhFBEAgBEJ/NwNYDAgLIARBATYCHAJAAkACQAJAAkAgBCgCGCgCCA4DAAIBAwsgBCAEKAIYKQMANwMgDAMLAkAgBCgCQCkDcFAEQCAEKAJAKAIcIAQoAhgpAwBBAiAEKAJAEGdBAEgEQCAEQn83A1gMDQsgBCAEKAJAKAIcEJkBIgI3AyAgAkIAUwRAIAQoAkBBBEG0nAEoAgAQFSAEQn83A1gMDQsgBCAEKQMgIAQoAkApA2h9NwMgIARBADYCHAwBCyAEIAQoAkApA3AgBCgCGCkDAHw3AyALDAILIAQgBCgCQCkDeCAEKAIYKQMAfDcDIAwBCyAEKAJAQRJBABAVIARCfzcDWAwICwJAAkAgBCkDIEIAUw0AIAQoAkApA3BCAFIEQCAEKQMgIAQoAkApA3BWDQELIAQpAyAgBCgCQCkDaHwgBCgCQCkDaFoNAQsgBCgCQEESQQAQFSAEQn83A1gMCAsgBCgCQCAEKQMgNwN4IAQoAhwEQCAEKAJAKAIcIAQoAkApA3ggBCgCQCkDaHwgBCgCQBCVAUEASARAIARCfzcDWAwJCwsgBEIANwNYDAcLIAQCfyAEKQNIQhBUBEAgBCgCQEESQQAQFUEADAELIAQoAlALNgIUIAQoAhRFBEAgBEJ/NwNYDAcLIAQoAkAoAoQBIAQoAhQpAwAgBCgCFCgCCCAEKAJAEGdBAEgEQCAEQn83A1gMBwsgBEIANwNYDAYLIAQpA0hCOFQEQCAEQn83A1gMBgsCfyMAQRBrIgAgBCgCQEHYAGo2AgwgACgCDCgCAAsEQCAEKAJAAn8jAEEQayIAIAQoAkBB2ABqNgIMIAAoAgwoAgALAn8jAEEQayIAIAQoAkBB2ABqNgIMIAAoAgwoAgQLEBUgBEJ/NwNYDAYLIAQoAlAiACAEKAJAIgEpACA3AAAgACABKQBQNwAwIAAgASkASDcAKCAAIAEpAEA3ACAgACABKQA4NwAYIAAgASkAMDcAECAAIAEpACg3AAggBEI4NwNYDAULIAQgBCgCQCkDEDcDWAwECyAEIAQoAkApA3g3A1gMAwsgBCAEKAJAKAKEARCZATcDCCAEKQMIQgBTBEAgBCgCQEEeQbScASgCABAVIARCfzcDWAwDCyAEIAQpAwg3A1gMAgsCQCAEKAJAKAKEASIAKAJMQQBOBEAgACAAKAIAQU9xNgIADAELIAAgACgCAEFPcTYCAAsgBCAEKAJQIAQpA0inIAQoAkAoAoQBEKwCNgIEAkAgBCkDSCAEKAIErVEEQAJ/IAQoAkAoAoQBIgAoAkxBf0wEQCAAKAIADAELIAAoAgALQQV2QQFxRQ0BCyAEKAJAQQZBtJwBKAIAEBUgBEJ/NwNYDAILIAQgBCgCBK03A1gMAQsgBCgCQEEcQQAQFSAEQn83A1gLIAQpA1ghAiAEQeAAaiQAIAILoAkBAX8jAEGgAWsiBCQAIAQgADYCmAEgBEEANgKUASAEIAE3A4gBIAQgAjcDgAEgBEEANgJ8IAQgAzYCeAJAAkAgBCgClAENACAEKAKYAQ0AIAQoAnhBEkEAEBUgBEEANgKcAQwBCyAEKQOAAUIAUwRAIARCADcDgAELAkAgBCkDiAFC////////////AFgEQCAEKQOIASAEKQOAAXwgBCkDiAFaDQELIAQoAnhBEkEAEBUgBEEANgKcAQwBCyAEQYgBEBkiADYCdCAARQRAIAQoAnhBDkEAEBUgBEEANgKcAQwBCyAEKAJ0QQA2AhggBCgCmAEEQCAEKAKYARCQAiEAIAQoAnQgADYCGCAARQRAIAQoAnhBDkEAEBUgBCgCdBAWIARBADYCnAEMAgsLIAQoAnQgBCgClAE2AhwgBCgCdCAEKQOIATcDaCAEKAJ0IAQpA4ABNwNwAkAgBCgCfARAIAQoAnQiACAEKAJ8IgMpAwA3AyAgACADKQMwNwNQIAAgAykDKDcDSCAAIAMpAyA3A0AgACADKQMYNwM4IAAgAykDEDcDMCAAIAMpAwg3AyggBCgCdEEANgIoIAQoAnQiACAAKQMgQv7///8PgzcDIAwBCyAEKAJ0QSBqEDwLIAQoAnQpA3BCAFYEQCAEKAJ0IAQoAnQpA3A3AzggBCgCdCIAIAApAyBCBIQ3AyALIwBBEGsiACAEKAJ0QdgAajYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCAEKAJ0QQA2AoABIAQoAnRBADYChAEjAEEQayIAIAQoAnQ2AgwgACgCDEEANgIAIAAoAgxBADYCBCAAKAIMQQA2AgggBEF/NgIEIARBBzYCAEEOIAQQN0I/hCEBIAQoAnQgATcDEAJAIAQoAnQoAhgEQCAEIAQoAnQoAhggBEEYahCcAUEATjoAFyAELQAXQQFxRQRAAkAgBCgCdCkDaFBFDQAgBCgCdCkDcFBFDQAgBCgCdEL//wM3AxALCwwBCyAEAn8CQCAEKAJ0KAIcIgAoAkxBAEgNAAsgACgCPAsgBEEYahCNAkEATjoAFwsCQCAELQAXQQFxRQRAIAQoAnRB2ABqQQVBtJwBKAIAEBUMAQsgBCgCdCkDIEIQg1AEQCAEKAJ0IAQoAlg2AkggBCgCdCIAIAApAyBCEIQ3AyALIAQoAiRBgOADcUGAgAJGBEAgBCgCdEL/gQE3AxAgBCgCdCkDaCAEKAJ0KQNwfCAEKQNAVgRAIAQoAnhBEkEAEBUgBCgCdCgCGBAWIAQoAnQQFiAEQQA2ApwBDAMLIAQoAnQpA3BQBEAgBCgCdCAEKQNAIAQoAnQpA2h9NwM4IAQoAnQiACAAKQMgQgSENwMgAkAgBCgCdCgCGEUNACAEKQOIAVBFDQAgBCgCdEL//wM3AxALCwsLIAQoAnQiACAAKQMQQoCAEIQ3AxAgBEEeIAQoAnQgBCgCeBCQASIANgJwIABFBEAgBCgCdCgCGBAWIAQoAnQQFiAEQQA2ApwBDAELIAQgBCgCcDYCnAELIAQoApwBIQAgBEGgAWokACAACwkAIAAoAjwQBQv3AQEEfyMAQSBrIgMkACADIAE2AhAgAyACIAAoAjAiBEEAR2s2AhQgACgCLCEFIAMgBDYCHCADIAU2AhgCQAJAAn8Cf0EAIAAoAjwgA0EQakECIANBDGoQDSIERQ0AGkG0nAEgBDYCAEF/CwRAIANBfzYCDEF/DAELIAMoAgwiBEEASg0BIAQLIQIgACAAKAIAIAJBMHFBEHNyNgIADAELIAQgAygCFCIGTQRAIAQhAgwBCyAAIAAoAiwiBTYCBCAAIAUgBCAGa2o2AgggACgCMEUNACAAIAVBAWo2AgQgASACakF/aiAFLQAAOgAACyADQSBqJAAgAguBAwEHfyMAQSBrIgMkACADIAAoAhwiBTYCECAAKAIUIQQgAyACNgIcIAMgATYCGCADIAQgBWsiATYCFCABIAJqIQVBAiEHIANBEGohAQJ/AkACQAJ/QQAgACgCPCADQRBqQQIgA0EMahADIgRFDQAaQbScASAENgIAQX8LRQRAA0AgBSADKAIMIgRGDQIgBEF/TA0DIAEgBCABKAIEIghLIgZBA3RqIgkgBCAIQQAgBhtrIgggCSgCAGo2AgAgAUEMQQQgBhtqIgkgCSgCACAIazYCACAFIARrIQUCf0EAIAAoAjwgAUEIaiABIAYbIgEgByAGayIHIANBDGoQAyIERQ0AGkG0nAEgBDYCAEF/C0UNAAsLIANBfzYCDCAFQX9HDQELIAAgACgCLCIBNgIcIAAgATYCFCAAIAEgACgCMGo2AhAgAgwBCyAAQQA2AhwgAEIANwMQIAAgACgCAEEgcjYCAEEAIAdBAkYNABogAiABKAIEawshACADQSBqJAAgAAtgAQF/IwBBEGsiAyQAAn4Cf0EAIAAoAjwgAacgAUIgiKcgAkH/AXEgA0EIahALIgBFDQAaQbScASAANgIAQX8LRQRAIAMpAwgMAQsgA0J/NwMIQn8LIQEgA0EQaiQAIAELoQEBAX8jAEEQayIBJAAgASAANgIIAkAgASgCCCgCJEEDRgRAIAFBADYCDAwBCyABKAIIKAIgQQBLBEAgASgCCBAyQQBIBEAgAUF/NgIMDAILCyABKAIIKAIkBEAgASgCCBBqCyABKAIIQQBCAEEPECJCAFMEQCABQX82AgwMAQsgASgCCEEDNgIkIAFBADYCDAsgASgCDCEAIAFBEGokACAAC9oBAQJ/AkAgAUH/AXEiAwRAIABBA3EEQANAIAAtAAAiAkUNAyACIAFB/wFxRg0DIABBAWoiAEEDcQ0ACwsCQCAAKAIAIgJBf3MgAkH//ft3anFBgIGChHhxDQAgA0GBgoQIbCEDA0AgAiADcyICQX9zIAJB//37d2pxQYCBgoR4cQ0BIAAoAgQhAiAAQQRqIQAgAkH//ft3aiACQX9zcUGAgYKEeHFFDQALCwNAIAAiAi0AACIDBEAgAkEBaiEAIAMgAUH/AXFHDQELCyACDwsgABAsIABqDwsgAAvFAwEBfyMAQTBrIgIkACACIAA2AiggAiABNgIkIAJBADYCECACIAIoAiggAigCKBAsajYCGCACIAIoAhhBf2o2AhwDQCACKAIcIAIoAihPBH8gAigCHCwAAEHYAEYFQQALQQFxBEAgAiACKAIQQQFqNgIQIAIgAigCHEF/ajYCHAwBCwsCQCACKAIQRQRAQbScAUEcNgIAIAJBfzYCLAwBCyACIAIoAhxBAWo2AhwDQCACEIcCNgIMIAIgAigCHDYCFANAIAIoAhQgAigCGEkEQCACIAIoAgxBJHA6AAsCfyACLAALQQpIBEAgAiwAC0EwagwBCyACLAALQdcAagshACACIAIoAhQiAUEBajYCFCABIAA6AAAgAiACKAIMQSRuNgIMDAELCyACKAIoIQAgAgJ/QbYDIAIoAiRBf0YNABogAigCJAs2AgAgAiAAQcKBICACEGkiADYCICAAQQBOBEAgAigCJEF/RwRAIAIoAiggAigCJBAPIgBBgWBPBH9BtJwBQQAgAGs2AgBBAAUgAAsaCyACIAIoAiA2AiwMAgtBtJwBKAIAQRRGDQALIAJBfzYCLAsgAigCLCEAIAJBMGokACAAC1cBAn8jAEEQayIAJAACQCAAQQhqEIgCQQFxBEAgACAAKAIINgIMDAELQcShAS0AAEEBcUUEQEEAEAEQigILIAAQiQI2AgwLIAAoAgwhASAAQRBqJAAgAQulAQEBfyMAQRBrIgEkACABIAA2AgggAUEEOwEGIAFB55cBQQBBABBpIgA2AgACQCAAQQBIBEAgAUEAOgAPDAELIAEoAgAgASgCCCABLwEGEBAiAEGBYE8Ef0G0nAFBACAAazYCAEF/BSAACyABLwEGRwRAIAEoAgAQaCABQQA6AA8MAQsgASgCABBoIAFBAToADwsgAS0AD0EBcSEAIAFBEGokACAAC6EBAQR/QcyaASgCACEAAkBByJoBKAIAIgNFBEAgACAAKAIAQe2cmY4EbEG54ABqQf////8HcSIANgIADAELIABB0JoBKAIAIgJBAnRqIgEgASgCACAAQcChASgCACIBQQJ0aigCAGoiADYCAEHAoQFBACABQQFqIgEgASADRhs2AgBB0JoBQQAgAkEBaiICIAIgA0YbNgIAIABBAXYhAAsgAAujAQIDfwF+QciaASgCACIBRQRAQcyaASgCACAANgIADwtB0JoBQQNBA0EBIAFBB0YbIAFBH0YbNgIAQcChAUEANgIAAkAgAUEATARAQcyaASgCACECDAELQcyaASgCACECIACtIQQDQCACIANBAnRqIARCrf7V5NSF/ajYAH5CAXwiBEIgiD4CACADQQFqIgMgAUcNAAsLIAIgAigCAEEBcjYCAAuxAQECfyACKAJMQQBOBH9BAQVBAAsaIAIgAi0ASiIDQX9qIANyOgBKAn8gASACKAIIIAIoAgQiBGsiA0EBSA0AGiAAIAQgAyABIAMgAUkbIgMQGhogAiACKAIEIANqNgIEIAAgA2ohACABIANrCyIDBEADQAJAIAIQjAJFBEAgAiAAIAMgAigCIBEBACIEQQFqQQFLDQELIAEgA2sPCyAAIARqIQAgAyAEayIDDQALCyABC3wBAn8gACAALQBKIgFBf2ogAXI6AEogACgCFCAAKAIcSwRAIABBAEEAIAAoAiQRAQAaCyAAQQA2AhwgAEIANwMQIAAoAgAiAUEEcQRAIAAgAUEgcjYCAEF/DwsgACAAKAIsIAAoAjBqIgI2AgggACACNgIEIAFBG3RBH3ULdgECfyMAQSBrIgIkAAJ/AkAgACABEAkiA0F4RgRAIAAQjwINAQsgA0GBYE8Ef0G0nAFBACADazYCAEF/BSADCwwBCyACIAAQjgIgAiABEAIiAEGBYE8Ef0G0nAFBACAAazYCAEF/BSAACwshACACQSBqJAAgAAueAQEDfwNAIAAgAmoiAyACQdiXAWotAAA6AAAgAkEORyEEIAJBAWohAiAEDQALIAEEQEEOIQIgASEDA0AgAkEBaiECIANBCUshBCADQQpuIQMgBA0ACyAAIAJqQQA6AAADQCAAIAJBf2oiAmogASABQQpuIgNBCmxrQTByOgAAIAFBCUshBCADIQEgBA0ACw8LIANBMDoAACAAQQA6AA8LNwEBfyMAQSBrIgEkAAJ/QQEgACABQQhqEAgiAEUNABpBtJwBIAA2AgBBAAshACABQSBqJAAgAAsgAQJ/IAAQLEEBaiIBEBkiAkUEQEEADwsgAiAAIAEQGgulAQEBfyMAQSBrIgIgADYCFCACIAE2AhACQCACKAIURQRAIAJCfzcDGAwBCyACKAIQQQhxBEAgAiACKAIUKQMwNwMIA0BBACEAIAIpAwhCAFYEfyACKAIUKAJAIAIpAwhCAX2nQQR0aigCAEUFQQALQQFxBEAgAiACKQMIQn98NwMIDAELCyACIAIpAwg3AxgMAQsgAiACKAIUKQMwNwMYCyACKQMYC/IBAQF/IwBBIGsiAyQAIAMgADYCFCADIAE2AhAgAyACNwMIAkAgAygCFEUEQCADQn83AxgMAQsgAygCFCgCBARAIANCfzcDGAwBCyADKQMIQv///////////wBWBEAgAygCFEEEakESQQAQFSADQn83AxgMAQsCQCADKAIULQAQQQFxRQRAIAMpAwhQRQ0BCyADQgA3AxgMAQsgAyADKAIUKAIUIAMoAhAgAykDCBAvIgI3AwAgAkIAUwRAIAMoAhRBBGogAygCFCgCFBAYIANCfzcDGAwBCyADIAMpAwA3AxgLIAMpAxghAiADQSBqJAAgAgtHAQF/IwBBIGsiAyQAIAMgADYCHCADIAE3AxAgAyACNgIMIAMoAhwgAykDECADKAIMIAMoAhwoAhwQnQEhACADQSBqJAAgAAt/AgF/AX4jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAyADKAIYIAMoAhQgAygCEBBuIgQ3AwgCQCAEQgBTBEAgA0EANgIcDAELIAMgAygCGCADKQMIIAMoAhAgAygCGCgCHBCdATYCHAsgAygCHCEAIANBIGokACAAC6oBAQF/IwBBEGsiASQAIAEgADYCCCABQRgQGSIANgIEAkAgAEUEQCABKAIIQQhqQQ5BABAVIAFBADYCDAwBCyABKAIEIAEoAgg2AgAjAEEQayIAIAEoAgRBBGo2AgwgACgCDEEANgIAIAAoAgxBADYCBCAAKAIMQQA2AgggASgCBEEAOgAQIAEoAgRBADYCFCABIAEoAgQ2AgwLIAEoAgwhACABQRBqJAAgAAvVAwEBfyMAQSBrIgQkACAEIAA2AhggBCABNwMQIAQgAjYCDCAEIAM2AggCQCAEKAIYIAQpAxBBAEEAEEVFBEAgBEF/NgIcDAELIAQoAhgoAhhBAnEEQCAEKAIYQQhqQRlBABAVIARBfzYCHAwBCyAEKAIYKAJAIAQpAxCnQQR0aigCCARAIAQoAhgoAkAgBCkDEKdBBHRqKAIIIAQoAgwQbUEASARAIAQoAhhBCGpBD0EAEBUgBEF/NgIcDAILIARBADYCHAwBCyAEIAQoAhgoAkAgBCkDEKdBBHRqNgIEQQEhACAEIAQoAgQoAgAEfyAEKAIMIAQoAgQoAgAoAhRHBUEBC0EBcTYCAAJAIAQoAgAEQCAEKAIEKAIERQRAIAQoAgQoAgAQRiEAIAQoAgQgADYCBCAARQRAIAQoAhhBCGpBDkEAEBUgBEF/NgIcDAQLCyAEKAIEKAIEIAQoAgw2AhQgBCgCBCgCBCIAIAAoAgBBIHI2AgAMAQsgBCgCBCgCBARAIAQoAgQoAgQiACAAKAIAQV9xNgIAIAQoAgQoAgQoAgBFBEAgBCgCBCgCBBA6IAQoAgRBADYCBAsLCyAEQQA2AhwLIAQoAhwhACAEQSBqJAAgAAsHACAAKAIICxgBAX8jAEEQayIBIAA2AgwgASgCDEEEagsYAQF/IwBBEGsiASAANgIMIAEoAgxBCGoLgwECAX8BfiMAQSBrIgQkACAEIAA2AhQgBCABNgIQIAQgAjYCDCAEIAM2AggCQAJAIAQoAhAEQCAEKAIMDQELIAQoAhRBCGpBEkEAEBUgBEJ/NwMYDAELIAQgBCgCFCAEKAIQIAQoAgwgBCgCCBCgATcDGAsgBCkDGCEFIARBIGokACAFC2kBAX8jAEEQayIBJAAgASAANgIMIAEoAgwoAhQEQCABKAIMKAIUEBwLIAFBADYCCCABKAIMKAIEBEAgASABKAIMKAIENgIICyABKAIMQQRqEDggASgCDBAWIAEoAgghACABQRBqJAAgAAu4AwIBfwF+IwBBMGsiAyQAIAMgADYCJCADIAE2AiAgAyACNgIcAkAgAygCJCgCGEECcQRAIAMoAiRBCGpBGUEAEBUgA0J/NwMoDAELIAMoAiBFBEAgAygCJEEIakESQQAQFSADQn83AygMAQsgA0EANgIMIAMgAygCIBAsNgIYIAMoAiAgAygCGEEBa2osAABBL0cEQCADIAMoAhhBAmoQGSIANgIMIABFBEAgAygCJEEIakEOQQAQFSADQn83AygMAgsgAygCDCADKAIgEJ8CIAMoAgwgAygCGGpBLzoAACADKAIMIAMoAhhBAWpqQQA6AAALIAMgAygCJEEAQgBBABB5IgA2AgggAEUEQCADKAIMEBYgA0J/NwMoDAELIAMgAygCJAJ/IAMoAgwEQCADKAIMDAELIAMoAiALIAMoAgggAygCHBCgATcDECADKAIMEBYCQCADKQMQQgBTBEAgAygCCBAcDAELIAMoAiQgAykDEEEAQQNBgID8jwQQnwFBAEgEQCADKAIkIAMpAxAQoQEaIANCfzcDKAwCCwsgAyADKQMQNwMoCyADKQMoIQQgA0EwaiQAIAQLmQgBAX8jAEFAaiIEJAAgBCAANgI4IAQgATcDMCAEIAI2AiwgBCADNgIoAkAgBCkDMCAEKAI4KQMwWgRAIAQoAjhBCGpBEkEAEBUgBEF/NgI8DAELIAQoAjgoAhhBAnEEQCAEKAI4QQhqQRlBABAVIARBfzYCPAwBCwJAAkAgBCgCLEUNACAEKAIsLAAARQ0AIAQgBCgCLCAEKAIsECxB//8DcSAEKAIoIAQoAjhBCGoQUSIANgIgIABFBEAgBEF/NgI8DAMLAkAgBCgCKEGAMHENACAEKAIgQQAQO0EDRw0AIAQoAiBBAjYCCAsMAQsgBEEANgIgCyAEIAQoAjggBCgCLEEAQQAQVSIBNwMQAkAgAUIAUw0AIAQpAxAgBCkDMFENACAEKAIgECYgBCgCOEEIakEKQQAQFSAEQX82AjwMAQsCQCAEKQMQQgBTDQAgBCkDECAEKQMwUg0AIAQoAiAQJiAEQQA2AjwMAQsgBCAEKAI4KAJAIAQpAzCnQQR0ajYCJAJAIAQoAiQoAgAEQCAEIAQoAiQoAgAoAjAgBCgCIBCHAUEARzoAHwwBCyAEQQA6AB8LAkAgBC0AH0EBcQ0AIAQoAiQoAgQNACAEKAIkKAIAEEYhACAEKAIkIAA2AgQgAEUEQCAEKAI4QQhqQQ5BABAVIAQoAiAQJiAEQX82AjwMAgsLIAQCfyAELQAfQQFxBEAgBCgCJCgCACgCMAwBCyAEKAIgC0EAQQAgBCgCOEEIahBHIgA2AgggAEUEQCAEKAIgECYgBEF/NgI8DAELAkAgBCgCJCgCBARAIAQgBCgCJCgCBCgCMDYCBAwBCwJAIAQoAiQoAgAEQCAEIAQoAiQoAgAoAjA2AgQMAQsgBEEANgIECwsCQCAEKAIEBEAgBCAEKAIEQQBBACAEKAI4QQhqEEciADYCDCAARQRAIAQoAiAQJiAEQX82AjwMAwsMAQsgBEEANgIMCyAEKAI4KAJQIAQoAgggBCkDMEEAIAQoAjhBCGoQfUEBcUUEQCAEKAIgECYgBEF/NgI8DAELIAQoAgwEQCAEKAI4KAJQIAQoAgxBABBZGgsCQCAELQAfQQFxBEAgBCgCJCgCBARAIAQoAiQoAgQoAgBBAnEEQCAEKAIkKAIEKAIwECYgBCgCJCgCBCIAIAAoAgBBfXE2AgACQCAEKAIkKAIEKAIARQRAIAQoAiQoAgQQOiAEKAIkQQA2AgQMAQsgBCgCJCgCBCAEKAIkKAIAKAIwNgIwCwsLIAQoAiAQJgwBCyAEKAIkKAIEKAIAQQJxBEAgBCgCJCgCBCgCMBAmCyAEKAIkKAIEIgAgACgCAEECcjYCACAEKAIkKAIEIAQoAiA2AjALIARBADYCPAsgBCgCPCEAIARBQGskACAAC98CAgF/AX4jAEFAaiIBJAAgASAANgI0AkAgASgCNCkDMEIBfCABKAI0KQM4WgRAIAEgASgCNCkDODcDGCABIAEpAxhCAYY3AxACQCABKQMQQhBUBEAgAUIQNwMQDAELIAEpAxBCgAhWBEAgAUKACDcDEAsLIAEgASkDECABKQMYfDcDGCABIAEpAxinQQR0rTcDCCABKAI0KQM4p0EEdK0gASkDCFYEQCABKAI0QQhqQQ5BABAVIAFCfzcDOAwCCyABIAEoAjQoAkAgASkDGKdBBHQQTTYCJCABKAIkRQRAIAEoAjRBCGpBDkEAEBUgAUJ/NwM4DAILIAEoAjQgASgCJDYCQCABKAI0IAEpAxg3AzgLIAEoAjQiACkDMCECIAAgAkIBfDcDMCABIAI3AyggASgCNCgCQCABKQMop0EEdGoQjAEgASABKQMoNwM4CyABKQM4IQIgAUFAayQAIAILyAEBAX8CQAJAIAAgAXNBA3ENACABQQNxBEADQCAAIAEtAAAiAjoAACACRQ0DIABBAWohACABQQFqIgFBA3ENAAsLIAEoAgAiAkF/cyACQf/9+3dqcUGAgYKEeHENAANAIAAgAjYCACABKAIEIQIgAEEEaiEAIAFBBGohASACQf/9+3dqIAJBf3NxQYCBgoR4cUUNAAsLIAAgAS0AACICOgAAIAJFDQADQCAAIAEtAAEiAjoAASAAQQFqIQAgAUEBaiEBIAINAAsLC5cEAQF/IwBBMGsiAiQAIAIgADYCKCACIAE3AyAgAkEBNgIcAkAgAikDICACKAIoKQMwWgRAIAIoAihBCGpBEkEAEBUgAkF/NgIsDAELAkAgAigCHA0AIAIoAigoAkAgAikDIKdBBHRqKAIERQ0AIAIoAigoAkAgAikDIKdBBHRqKAIEKAIAQQJxRQ0AAkAgAigCKCgCQCACKQMgp0EEdGooAgAEQCACIAIoAiggAikDIEEIIAIoAihBCGoQTyIANgIMIABFBEAgAkF/NgIsDAQLIAIgAigCKCACKAIMQQBBABBVNwMQAkAgAikDEEIAUw0AIAIpAxAgAikDIFENACACKAIoQQhqQQpBABAVIAJBfzYCLAwECwwBCyACQQA2AgwLIAIgAigCKCACKQMgQQAgAigCKEEIahBPIgA2AgggAEUEQCACQX82AiwMAgsgAigCDARAIAIoAigoAlAgAigCDCACKQMgQQAgAigCKEEIahB9QQFxRQRAIAJBfzYCLAwDCwsgAigCKCgCUCACKAIIIAIoAihBCGoQWUEBcUUEQCACKAIoKAJQIAIoAgxBABBZGiACQX82AiwMAgsLIAIoAigoAkAgAikDIKdBBHRqKAIEEDogAigCKCgCQCACKQMgp0EEdGpBADYCBCACKAIoKAJAIAIpAyCnQQR0ahBjIAJBADYCLAsgAigCLCEAIAJBMGokACAACyYBAX8DQCABRQRAQQAPCyAAIAFBf2oiAWoiAi0AAEEvRw0ACyACC6kBAQN/AkAgAC0AACICRQ0AA0AgAS0AACIERQRAIAIhAwwCCwJAIAIgBEYNACACQSByIAIgAkG/f2pBGkkbIAEtAAAiAkEgciACIAJBv39qQRpJG0YNACAALQAAIQMMAgsgAUEBaiEBIAAtAAEhAiAAQQFqIQAgAg0ACwsgA0H/AXEiAEEgciAAIABBv39qQRpJGyABLQAAIgBBIHIgACAAQb9/akEaSRtrC+gDAQN/IwBBsAFrIgEkACABIAA2AqgBIAEoAqgBEDgCQAJAIAEoAqgBKAIAQQBOBEAgASgCqAEoAgBBoA4oAgBIDQELIAEgASgCqAEoAgA2AhAgAUEgakG8lwEgAUEQahBvIAFBADYCpAEgASABQSBqNgKgAQwBCyABIAEoAqgBKAIAQQJ0QaANaigCADYCpAECQAJAAkACQCABKAKoASgCAEECdEGwDmooAgBBf2oOAgABAgsgASABKAKoASgCBEGQmgEoAgAQpAI2AqABDAILIwBBEGsiACABKAKoASgCBDYCDCABQQAgACgCDGtBAnRB2NQAaigCADYCoAEMAQsgAUEANgKgAQsLAkAgASgCoAFFBEAgASABKAKkATYCrAEMAQsgASABKAKgARAsAn8gASgCpAEEQCABKAKkARAsQQJqDAELQQALakEBahAZIgA2AhwgAEUEQCABQdgNKAIANgKsAQwBCyABKAIcIQACfyABKAKkAQRAIAEoAqQBDAELQdSXAQshAkHVlwFB1JcBIAEoAqQBGyEDIAEgASgCoAE2AgggASADNgIEIAEgAjYCACAAQc2XASABEG8gASgCqAEgASgCHDYCCCABIAEoAhw2AqwBCyABKAKsASEAIAFBsAFqJAAgAAtxAQN/AkACQANAIAAgAkHQiAFqLQAARwRAQdcAIQMgAkEBaiICQdcARw0BDAILCyACIgMNAEGwiQEhAAwBC0GwiQEhAgNAIAItAAAhBCACQQFqIgAhAiAEDQAgACECIANBf2oiAw0ACwsgASgCFBogAAszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQGhogACAAKAIUIAFqNgIUIAILigEBAn8jAEGgAWsiAyQAIANBCGpBuIcBQZABEBoaIAMgADYCNCADIAA2AhwgA0F+IABrIgRB/////wdB/////wcgBEsbIgQ2AjggAyAAIARqIgA2AiQgAyAANgIYIANBCGogASACEKsCIAQEQCADKAIcIgAgACADKAIYRmtBADoAAAsgA0GgAWokAAspACABIAEoAgBBD2pBcHEiAUEQajYCACAAIAEpAwAgASkDCBCxAjkDAAuKFwMSfwJ+AXwjAEGwBGsiCSQAIAlBADYCLAJ/IAG9IhhCf1cEQEEBIRIgAZoiAb0hGEGQhwEMAQtBASESQZOHASAEQYAQcQ0AGkGWhwEgBEEBcQ0AGkEAIRJBASETQZGHAQshFQJAIBhCgICAgICAgPj/AINCgICAgICAgPj/AFEEQCAAQSAgAiASQQNqIg0gBEH//3txECcgACAVIBIQIyAAQauHAUGvhwEgBUEgcSIDG0GjhwFBp4cBIAMbIAEgAWIbQQMQIwwBCyAJQRBqIRACQAJ/AkAgASAJQSxqEKQBIgEgAaAiAUQAAAAAAAAAAGIEQCAJIAkoAiwiBkF/ajYCLCAFQSByIhZB4QBHDQEMAwsgBUEgciIWQeEARg0CIAkoAiwhC0EGIAMgA0EASBsMAQsgCSAGQWNqIgs2AiwgAUQAAAAAAACwQaIhAUEGIAMgA0EASBsLIQogCUEwaiAJQdACaiALQQBIGyIPIQgDQCAIAn8gAUQAAAAAAADwQWMgAUQAAAAAAAAAAGZxBEAgAasMAQtBAAsiAzYCACAIQQRqIQggASADuKFEAAAAAGXNzUGiIgFEAAAAAAAAAABiDQALAkAgC0EBSARAIAshAyAIIQYgDyEHDAELIA8hByALIQMDQCADQR0gA0EdSBshDAJAIAhBfGoiBiAHSQ0AIAytIRlCACEYA0AgBiAYQv////8PgyAGNQIAIBmGfCIYIBhCgJTr3AOAIhhCgJTr3AN+fT4CACAGQXxqIgYgB08NAAsgGKciA0UNACAHQXxqIgcgAzYCAAsDQCAIIgYgB0sEQCAGQXxqIggoAgBFDQELCyAJIAkoAiwgDGsiAzYCLCAGIQggA0EASg0ACwsgA0F/TARAIApBGWpBCW1BAWohESAWQeYARiENA0BBCUEAIANrIANBd0gbIRcCQCAHIAZPBEAgByAHQQRqIAcoAgAbIQcMAQtBgJTr3AMgF3YhFEF/IBd0QX9zIQ5BACEDIAchCANAIAggAyAIKAIAIgwgF3ZqNgIAIAwgDnEgFGwhAyAIQQRqIgggBkkNAAsgByAHQQRqIAcoAgAbIQcgA0UNACAGIAM2AgAgBkEEaiEGCyAJIAkoAiwgF2oiAzYCLCAPIAcgDRsiCCARQQJ0aiAGIAYgCGtBAnUgEUobIQYgA0EASA0ACwtBACEIAkAgByAGTw0AIA8gB2tBAnVBCWwhCEEKIQMgBygCACIMQQpJDQADQCAIQQFqIQggDCADQQpsIgNPDQALCyAKQQAgCCAWQeYARhtrIBZB5wBGIApBAEdxayIDIAYgD2tBAnVBCWxBd2pIBEAgA0GAyABqIg5BCW0iDEECdCAJQTBqQQRyIAlB1AJqIAtBAEgbakGAYGohDUEKIQMgDiAMQQlsayIOQQdMBEADQCADQQpsIQMgDkEBaiIOQQhHDQALCwJAQQAgBiANQQRqIhFGIA0oAgAiDiAOIANuIgwgA2xrIhQbDQBEAAAAAAAA4D9EAAAAAAAA8D9EAAAAAAAA+D8gFCADQQF2IgtGG0QAAAAAAAD4PyAGIBFGGyAUIAtJGyEaRAEAAAAAAEBDRAAAAAAAAEBDIAxBAXEbIQECQCATDQAgFS0AAEEtRw0AIBqaIRogAZohAQsgDSAOIBRrIgs2AgAgASAaoCABYQ0AIA0gAyALaiIDNgIAIANBgJTr3ANPBEADQCANQQA2AgAgDUF8aiINIAdJBEAgB0F8aiIHQQA2AgALIA0gDSgCAEEBaiIDNgIAIANB/5Pr3ANLDQALCyAPIAdrQQJ1QQlsIQhBCiEDIAcoAgAiC0EKSQ0AA0AgCEEBaiEIIAsgA0EKbCIDTw0ACwsgDUEEaiIDIAYgBiADSxshBgsDQCAGIgsgB00iDEUEQCALQXxqIgYoAgBFDQELCwJAIBZB5wBHBEAgBEEIcSETDAELIAhBf3NBfyAKQQEgChsiBiAISiAIQXtKcSIDGyAGaiEKQX9BfiADGyAFaiEFIARBCHEiEw0AQXchBgJAIAwNACALQXxqKAIAIgxFDQBBCiEOQQAhBiAMQQpwDQADQCAGIgNBAWohBiAMIA5BCmwiDnBFDQALIANBf3MhBgsgCyAPa0ECdUEJbCEDIAVBX3FBxgBGBEBBACETIAogAyAGakF3aiIDQQAgA0EAShsiAyAKIANIGyEKDAELQQAhEyAKIAMgCGogBmpBd2oiA0EAIANBAEobIgMgCiADSBshCgsgCiATciIUQQBHIQ4gAEEgIAICfyAIQQAgCEEAShsgBUFfcSIMQcYARg0AGiAQIAggCEEfdSIDaiADc60gEBBDIgZrQQFMBEADQCAGQX9qIgZBMDoAACAQIAZrQQJIDQALCyAGQX5qIhEgBToAACAGQX9qQS1BKyAIQQBIGzoAACAQIBFrCyAKIBJqIA5qakEBaiINIAQQJyAAIBUgEhAjIABBMCACIA0gBEGAgARzECcCQAJAAkAgDEHGAEYEQCAJQRBqQQhyIQMgCUEQakEJciEIIA8gByAHIA9LGyIFIQcDQCAHNQIAIAgQQyEGAkAgBSAHRwRAIAYgCUEQak0NAQNAIAZBf2oiBkEwOgAAIAYgCUEQaksNAAsMAQsgBiAIRw0AIAlBMDoAGCADIQYLIAAgBiAIIAZrECMgB0EEaiIHIA9NDQALIBQEQCAAQbOHAUEBECMLIAcgC08NASAKQQFIDQEDQCAHNQIAIAgQQyIGIAlBEGpLBEADQCAGQX9qIgZBMDoAACAGIAlBEGpLDQALCyAAIAYgCkEJIApBCUgbECMgCkF3aiEGIAdBBGoiByALTw0DIApBCUohAyAGIQogAw0ACwwCCwJAIApBAEgNACALIAdBBGogCyAHSxshBSAJQRBqQQhyIQMgCUEQakEJciELIAchCANAIAsgCDUCACALEEMiBkYEQCAJQTA6ABggAyEGCwJAIAcgCEcEQCAGIAlBEGpNDQEDQCAGQX9qIgZBMDoAACAGIAlBEGpLDQALDAELIAAgBkEBECMgBkEBaiEGIBNFQQAgCkEBSBsNACAAQbOHAUEBECMLIAAgBiALIAZrIgYgCiAKIAZKGxAjIAogBmshCiAIQQRqIgggBU8NASAKQX9KDQALCyAAQTAgCkESakESQQAQJyAAIBEgECARaxAjDAILIAohBgsgAEEwIAZBCWpBCUEAECcLDAELIBVBCWogFSAFQSBxIgsbIQoCQCADQQtLDQBBDCADayIGRQ0ARAAAAAAAACBAIRoDQCAaRAAAAAAAADBAoiEaIAZBf2oiBg0ACyAKLQAAQS1GBEAgGiABmiAaoaCaIQEMAQsgASAaoCAaoSEBCyAQIAkoAiwiBiAGQR91IgZqIAZzrSAQEEMiBkYEQCAJQTA6AA8gCUEPaiEGCyASQQJyIQ8gCSgCLCEIIAZBfmoiDCAFQQ9qOgAAIAZBf2pBLUErIAhBAEgbOgAAIARBCHEhCCAJQRBqIQcDQCAHIgUCfyABmUQAAAAAAADgQWMEQCABqgwBC0GAgICAeAsiBkGAhwFqLQAAIAtyOgAAIAEgBrehRAAAAAAAADBAoiEBAkAgBUEBaiIHIAlBEGprQQFHDQACQCAIDQAgA0EASg0AIAFEAAAAAAAAAABhDQELIAVBLjoAASAFQQJqIQcLIAFEAAAAAAAAAABiDQALIABBICACIA8CfwJAIANFDQAgByAJa0FuaiADTg0AIAMgEGogDGtBAmoMAQsgECAJQRBqayAMayAHagsiA2oiDSAEECcgACAKIA8QIyAAQTAgAiANIARBgIAEcxAnIAAgCUEQaiAHIAlBEGprIgUQIyAAQTAgAyAFIBAgDGsiA2prQQBBABAnIAAgDCADECMLIABBICACIA0gBEGAwABzECcgCUGwBGokACACIA0gDSACSBsLLQAgAFBFBEADQCABQX9qIgEgAKdBB3FBMHI6AAAgAEIDiCIAQgBSDQALCyABCzUAIABQRQRAA0AgAUF/aiIBIACnQQ9xQYCHAWotAAAgAnI6AAAgAEIEiCIAQgBSDQALCyABC8sCAQN/IwBB0AFrIgMkACADIAI2AswBQQAhAiADQaABakEAQSgQMyADIAMoAswBNgLIAQJAQQAgASADQcgBaiADQdAAaiADQaABahBwQQBIDQAgACgCTEEATgRAQQEhAgsgACgCACEEIAAsAEpBAEwEQCAAIARBX3E2AgALIARBIHEhBQJ/IAAoAjAEQCAAIAEgA0HIAWogA0HQAGogA0GgAWoQcAwBCyAAQdAANgIwIAAgA0HQAGo2AhAgACADNgIcIAAgAzYCFCAAKAIsIQQgACADNgIsIAAgASADQcgBaiADQdAAaiADQaABahBwIARFDQAaIABBAEEAIAAoAiQRAQAaIABBADYCMCAAIAQ2AiwgAEEANgIcIABBADYCECAAKAIUGiAAQQA2AhRBAAsaIAAgACgCACAFcjYCACACRQ0ACyADQdABaiQACy8AIAECfyACKAJMQX9MBEAgACABIAIQcQwBCyAAIAEgAhBxCyIARgRAIAEPCyAAC1kBAX8gACAALQBKIgFBf2ogAXI6AEogACgCACIBQQhxBEAgACABQSByNgIAQX8PCyAAQgA3AgQgACAAKAIsIgE2AhwgACABNgIUIAAgASAAKAIwajYCEEEACwYAQaShAQsGAEGgoQELBgBBmKEBC9kDAgJ/An4jAEEgayICJAACQCABQv///////////wCDIgVCgICAgICAwP9DfCAFQoCAgICAgMCAvH98VARAIAFCBIYgAEI8iIQhBCAAQv//////////D4MiAEKBgICAgICAgAhaBEAgBEKBgICAgICAgMAAfCEEDAILIARCgICAgICAgIBAfSEEIABCgICAgICAgIAIhUIAUg0BIARCAYMgBHwhBAwBCyAAUCAFQoCAgICAgMD//wBUIAVCgICAgICAwP//AFEbRQRAIAFCBIYgAEI8iIRC/////////wODQoCAgICAgID8/wCEIQQMAQtCgICAgICAgPj/ACEEIAVC////////v//DAFYNAEIAIQQgBUIwiKciA0GR9wBJDQAgAkEQaiAAIAFC////////P4NCgICAgICAwACEIgQgA0H/iH9qELMCIAIgACAEQYH4ACADaxCyAiACKQMIQgSGIAIpAwAiAEI8iIQhBCACKQMQIAIpAxiEQgBSrSAAQv//////////D4OEIgBCgYCAgICAgIAIWgRAIARCAXwhBAwBCyAAQoCAgICAgICACIVCAFINACAEQgGDIAR8IQQLIAJBIGokACAEIAFCgICAgICAgICAf4OEvwtQAQF+AkAgA0HAAHEEQCACIANBQGqtiCEBQgAhAgwBCyADRQ0AIAJBwAAgA2uthiABIAOtIgSIhCEBIAIgBIghAgsgACABNwMAIAAgAjcDCAtQAQF+AkAgA0HAAHEEQCABIANBQGqthiECQgAhAQwBCyADRQ0AIAIgA60iBIYgAUHAACADa62IhCECIAEgBIYhAQsgACABNwMAIAAgAjcDCAuLAgACQCAABH8gAUH/AE0NAQJAQZCaASgCACgCAEUEQCABQYB/cUGAvwNGDQMMAQsgAUH/D00EQCAAIAFBP3FBgAFyOgABIAAgAUEGdkHAAXI6AABBAg8LIAFBgLADT0EAIAFBgEBxQYDAA0cbRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMPCyABQYCAfGpB//8/TQRAIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBA8LC0G0nAFBGTYCAEF/BUEBCw8LIAAgAToAAEEBC74CAQF/IwBBwMAAayIDJAAgAyAANgK4QCADIAE2ArRAIAMgAjcDqEACQCADKAK0QBBJQQBIBEAgAygCuEBBCGogAygCtEAQGCADQX82ArxADAELIANBADYCDCADQgA3AxADQAJAIAMgAygCtEAgA0EgakKAwAAQLyICNwMYIAJCAFcNACADKAK4QCADQSBqIAMpAxgQNkEASARAIANBfzYCDAUgAykDGEKAwABSDQIgAygCuEAoAlRFDQIgAykDqEBCAFcNAiADIAMpAxggAykDEHw3AxAgAygCuEAoAlQgAykDELkgAykDqEC5oxBYDAILCwsgAykDGEIAUwRAIAMoArhAQQhqIAMoArRAEBggA0F/NgIMCyADKAK0QBAyGiADIAMoAgw2ArxACyADKAK8QCEAIANBwMAAaiQAIAALqgEBAX8jAEEwayIDJAAgAyAANgIoIAMgATYCJCADIAI3AxggAyADKAIoKAIAEDUiAjcDEAJAIAJCAFMEQCADQX82AiwMAQsgAyADKAIoIAMoAiQgAykDGBCQAyICNwMAIAJCAFMEQCADQX82AiwMAQsgAyADKAIoKAIAEDUiAjcDCCACQgBTBEAgA0F/NgIsDAELIANBADYCLAsgAygCLCEAIANBMGokACAAC/4BAQF/IwBBoMAAayICJAAgAiAANgKYQCACIAE3A5BAIAIgAikDkEC6OQMAAkADQCACKQOQQEIAVgRAIAICfkKAwAAgAikDkEBCgMAAVg0AGiACKQOQQAs+AgwgAigCmEAoAgAgAkEQaiACKAIMrSACKAKYQEEIahBhQQBIBEAgAkF/NgKcQAwDCyACKAKYQCACQRBqIAIoAgytEDZBAEgEQCACQX82ApxADAMFIAIgAikDkEAgAjUCDH03A5BAIAIoAphAKAJUIAIrAwAgAikDkEC6oSACKwMAoxBYDAILAAsLIAJBADYCnEALIAIoApxAIQAgAkGgwABqJAAgAAvnEQIBfwF+IwBBoAFrIgMkACADIAA2ApgBIAMgATYClAEgAyACNgKQAQJAIAMoApQBIANBOGoQOUEASARAIAMoApgBQQhqIAMoApQBEBggA0F/NgKcAQwBCyADKQM4QsAAg1AEQCADIAMpAzhCwACENwM4IANBADsBaAsCQAJAIAMoApABKAIQQX9HBEAgAygCkAEoAhBBfkcNAQsgAy8BaEUNACADKAKQASADLwFoNgIQDAELAkACQCADKAKQASgCEA0AIAMpAzhCBINQDQAgAyADKQM4QgiENwM4IAMgAykDUDcDWAwBCyADIAMpAzhC9////w+DNwM4CwsgAykDOEKAAYNQBEAgAyADKQM4QoABhDcDOCADQQA7AWoLIANBgAI2AiQCQCADKQM4QgSDUARAIAMgAygCJEGACHI2AiQgA0J/NwNwDAELIAMoApABIAMpA1A3AyggAyADKQNQNwNwAkAgAykDOEIIg1AEQAJAAkACQAJAAkACfwJAIAMoApABKAIQQX9HBEAgAygCkAEoAhBBfkcNAQtBCAwBCyADKAKQASgCEAtB//8DcQ4NAgMDAwMDAwMBAwMDAAMLIANClMLk8w83AxAMAwsgA0KDg7D/DzcDEAwCCyADQv////8PNwMQDAELIANCADcDEAsgAykDUCADKQMQVgRAIAMgAygCJEGACHI2AiQLDAELIAMoApABIAMpA1g3AyALCyADIAMoApgBKAIAEDUiBDcDiAEgBEIAUwRAIAMoApgBQQhqIAMoApgBKAIAEBggA0F/NgKcAQwBCyADKAKQASIAIAAvAQxB9/8DcTsBDCADIAMoApgBIAMoApABIAMoAiQQXiIANgIoIABBAEgEQCADQX82ApwBDAELIAMgAy8BaAJ/AkAgAygCkAEoAhBBf0cEQCADKAKQASgCEEF+Rw0BC0EIDAELIAMoApABKAIQC0H//wNxRzoAIiADIAMtACJBAXEEfyADLwFoQQBHBUEAC0EBcToAISADIAMvAWgEfyADLQAhBUEBC0EBcToAICADIAMtACJBAXEEfyADKAKQASgCEEEARwVBAAtBAXE6AB8gAwJ/QQEgAy0AIkEBcQ0AGkEBIAMoApABKAIAQYABcQ0AGiADKAKQAS8BUiADLwFqRwtBAXE6AB4gAyADLQAeQQFxBH8gAy8BakEARwVBAAtBAXE6AB0gAyADLQAeQQFxBH8gAygCkAEvAVJBAEcFQQALQQFxOgAcIAMgAygClAE2AjQjAEEQayIAIAMoAjQ2AgwgACgCDCIAIAAoAjBBAWo2AjAgAy0AHUEBcQRAIAMgAy8BakEAEHciADYCDCAARQRAIAMoApgBQQhqQRhBABAVIAMoAjQQHCADQX82ApwBDAILIAMgAygCmAEgAygCNCADLwFqQQAgAygCmAEoAhwgAygCDBEGACIANgIwIABFBEAgAygCNBAcIANBfzYCnAEMAgsgAygCNBAcIAMgAygCMDYCNAsgAy0AIUEBcQRAIAMgAygCmAEgAygCNCADLwFoEKsBIgA2AjAgAEUEQCADKAI0EBwgA0F/NgKcAQwCCyADKAI0EBwgAyADKAIwNgI0CyADLQAgQQFxBEAgAyADKAKYASADKAI0QQAQqgEiADYCMCAARQRAIAMoAjQQHCADQX82ApwBDAILIAMoAjQQHCADIAMoAjA2AjQLIAMtAB9BAXEEQCADIAMoApgBIAMoAjQgAygCkAEoAhAgAygCkAEvAVAQwgIiADYCMCAARQRAIAMoAjQQHCADQX82ApwBDAILIAMoAjQQHCADIAMoAjA2AjQLIAMtABxBAXEEQCADQQA2AgQCQCADKAKQASgCVARAIAMgAygCkAEoAlQ2AgQMAQsgAygCmAEoAhwEQCADIAMoApgBKAIcNgIECwsgAyADKAKQAS8BUkEBEHciADYCCCAARQRAIAMoApgBQQhqQRhBABAVIAMoAjQQHCADQX82ApwBDAILIAMgAygCmAEgAygCNCADKAKQAS8BUkEBIAMoAgQgAygCCBEGACIANgIwIABFBEAgAygCNBAcIANBfzYCnAEMAgsgAygCNBAcIAMgAygCMDYCNAsgAyADKAKYASgCABA1IgQ3A4ABIARCAFMEQCADKAKYAUEIaiADKAKYASgCABAYIANBfzYCnAEMAQsgAyADKAKYASADKAI0IAMpA3AQtQI2AiwgAygCNCADQThqEDlBAEgEQCADKAKYAUEIaiADKAI0EBggA0F/NgIsCyADIAMoAjQQuwIiADoAIyAAQRh0QRh1QQBIBEAgAygCmAFBCGogAygCNBAYIANBfzYCLAsgAygCNBAcIAMoAixBAEgEQCADQX82ApwBDAELIAMgAygCmAEoAgAQNSIENwN4IARCAFMEQCADKAKYAUEIaiADKAKYASgCABAYIANBfzYCnAEMAQsgAygCmAEoAgAgAykDiAEQqAFBAEgEQCADKAKYAUEIaiADKAKYASgCABAYIANBfzYCnAEMAQsgAykDOELkAINC5ABSBEAgAygCmAFBCGpBFEEAEBUgA0F/NgKcAQwBCyADKAKQASgCAEEgcUUEQAJAIAMpAzhCEINCAFIEQCADKAKQASADKAJgNgIUDAELIAMoApABQRRqEAEaCwsgAygCkAEgAy8BaDYCECADKAKQASADKAJkNgIYIAMoApABIAMpA1A3AyggAygCkAEgAykDeCADKQOAAX03AyAgAygCkAEgAygCkAEvAQxB+f8DcSADLQAjQQF0cjsBDCADKAKQASADKAIkQYAIcUEARxCKAyADIAMoApgBIAMoApABIAMoAiQQXiIANgIsIABBAEgEQCADQX82ApwBDAELIAMoAiggAygCLEcEQCADKAKYAUEIakEUQQAQFSADQX82ApwBDAELIAMoApgBKAIAIAMpA3gQqAFBAEgEQCADKAKYAUEIaiADKAKYASgCABAYIANBfzYCnAEMAQsgA0EANgKcAQsgAygCnAEhACADQaABaiQAIAALrwIBAX8jAEEgayICIAA2AhwgAiABNgIYIAJBADYCFCACQgA3AwACQCACKAIcLQAoQQFxRQRAIAIoAhwoAhggAigCHCgCFEYNAQsgAkEBNgIUCyACQgA3AwgDQCACKQMIIAIoAhwpAzBUBEACQAJAIAIoAhwoAkAgAikDCKdBBHRqKAIIDQAgAigCHCgCQCACKQMIp0EEdGotAAxBAXENACACKAIcKAJAIAIpAwinQQR0aigCBEUNASACKAIcKAJAIAIpAwinQQR0aigCBCgCAEUNAQsgAkEBNgIUCyACKAIcKAJAIAIpAwinQQR0ai0ADEEBcUUEQCACIAIpAwBCAXw3AwALIAIgAikDCEIBfDcDCAwBCwsgAigCGARAIAIoAhggAikDADcDAAsgAigCFAuMEAMCfwF+AXwjAEHgAGsiASQAIAEgADYCWAJAIAEoAlhFBEAgAUF/NgJcDAELIAEgASgCWCABQUBrELkCNgIkIAEpA0BQBEACQCABKAJYKAIEQQhxRQRAIAEoAiRFDQELIAEoAlgoAgAQhAJBAEgEQAJAAn8jAEEQayICIAEoAlgoAgA2AgwjAEEQayIAIAIoAgxBDGo2AgwgACgCDCgCAEEWRgsEQCMAQRBrIgIgASgCWCgCADYCDCMAQRBrIgAgAigCDEEMajYCDCAAKAIMKAIEQSxGDQELIAEoAlhBCGogASgCWCgCABAYIAFBfzYCXAwECwsLIAEoAlgQPyABQQA2AlwMAQsgASgCJEUEQCABKAJYED8gAUEANgJcDAELIAEpA0AgASgCWCkDMFYEQCABKAJYQQhqQRRBABAVIAFBfzYCXAwBCyABIAEpA0CnQQN0EBkiADYCKCAARQRAIAFBfzYCXAwBCyABQn83AzggAUIANwNIIAFCADcDUANAIAEpA1AgASgCWCkDMFQEQAJAIAEoAlgoAkAgASkDUKdBBHRqKAIARQ0AAkAgASgCWCgCQCABKQNQp0EEdGooAggNACABKAJYKAJAIAEpA1CnQQR0ai0ADEEBcQ0AIAEoAlgoAkAgASkDUKdBBHRqKAIERQ0BIAEoAlgoAkAgASkDUKdBBHRqKAIEKAIARQ0BCyABAn4gASkDOCABKAJYKAJAIAEpA1CnQQR0aigCACkDSFQEQCABKQM4DAELIAEoAlgoAkAgASkDUKdBBHRqKAIAKQNICzcDOAsgASgCWCgCQCABKQNQp0EEdGotAAxBAXFFBEAgASkDSCABKQNAWgRAIAEoAigQFiABKAJYQQhqQRRBABAVIAFBfzYCXAwECyABKAIoIAEpA0inQQN0aiABKQNQNwMAIAEgASkDSEIBfDcDSAsgASABKQNQQgF8NwNQDAELCyABKQNIIAEpA0BUBEAgASgCKBAWIAEoAlhBCGpBFEEAEBUgAUF/NgJcDAELAkACfyMAQRBrIgAgASgCWCgCADYCDCAAKAIMKQMYQoCACINQCwRAIAFCADcDOAwBCyABKQM4Qn9RBEAgAUJ/NwMYIAFCADcDOCABQgA3A1ADQCABKQNQIAEoAlgpAzBUBEAgASgCWCgCQCABKQNQp0EEdGooAgAEQCABKAJYKAJAIAEpA1CnQQR0aigCACkDSCABKQM4WgRAIAEgASgCWCgCQCABKQNQp0EEdGooAgApA0g3AzggASABKQNQNwMYCwsgASABKQNQQgF8NwNQDAELCyABKQMYQn9SBEAgASABKAJYIAEpAxggASgCWEEIahCIAyIDNwM4IANQBEAgASgCKBAWIAFBfzYCXAwECwsLIAEpAzhCAFYEQCABKAJYKAIAIAEpAzgQ9wJBAEgEQCABQgA3AzgLCwsgASkDOFAEQCABKAJYKAIAEPYCQQBIBEAgASgCWEEIaiABKAJYKAIAEBggASgCKBAWIAFBfzYCXAwCCwsgASgCWCgCVBD5AiABQQA2AiwgAUIANwNIA0ACQCABKQNIIAEpA0BaDQAgASgCWCgCVCABKQNIIgO6IAEpA0C6IgSjIANCAXy6IASjEPgCIAEgASgCKCABKQNIp0EDdGopAwA3A1AgASABKAJYKAJAIAEpA1CnQQR0ajYCEAJAAkAgASgCECgCAEUNACABKAIQKAIAKQNIIAEpAzhaDQAMAQsgAQJ/QQEgASgCECgCCA0AGiABKAIQKAIEBEBBASABKAIQKAIEKAIAQQFxDQEaCyABKAIQKAIEBH8gASgCECgCBCgCAEHAAHFBAEcFQQALC0EBcTYCFCABKAIQKAIERQRAIAEoAhAoAgAQRiEAIAEoAhAgADYCBCAARQRAIAEoAlhBCGpBDkEAEBUgAUEBNgIsDAMLCyABIAEoAhAoAgQ2AgwgASgCWCABKQNQEMcBQQBIBEAgAUEBNgIsDAILIAEgASgCWCgCABA1IgM3AzAgA0IAUwRAIAFBATYCLAwCCyABKAIMIAEpAzA3A0gCQCABKAIUBEAgAUEANgIIIAEoAhAoAghFBEAgASABKAJYIAEoAlggASkDUEEIQQAQqQEiADYCCCAARQRAIAFBATYCLAwFCwsgASgCWAJ/IAEoAggEQCABKAIIDAELIAEoAhAoAggLIAEoAgwQuAJBAEgEQCABQQE2AiwgASgCCARAIAEoAggQHAsMBAsgASgCCARAIAEoAggQHAsMAQsgASgCDCIAIAAvAQxB9/8DcTsBDCABKAJYIAEoAgxBgAIQXkEASARAIAFBATYCLAwDCyABIAEoAlggASkDUCABKAJYQQhqEH8iAzcDACADUARAIAFBATYCLAwDCyABKAJYKAIAIAEpAwBBABAoQQBIBEAgASgCWEEIaiABKAJYKAIAEBggAUEBNgIsDAMLIAEoAlggASgCDCkDIBC3AkEASARAIAFBATYCLAwDCwsLIAEgASkDSEIBfDcDSAwBCwsgASgCLEUEQCABKAJYIAEoAiggASkDQBC2AkEASARAIAFBATYCLAsLIAEoAigQFiABKAIsRQRAIAEoAlgoAgAQvAIEQCABKAJYQQhqIAEoAlgoAgAQGCABQQE2AiwLCyABKAJYKAJUEPsCIAEoAiwEQCABKAJYKAIAEGogAUF/NgJcDAELIAEoAlgQPyABQQA2AlwLIAEoAlwhACABQeAAaiQAIAALswEBAX8jAEEQayIBJAAgASAANgIIAkADQCABKAIIBEAgASgCCCkDGEKAgASDQgBSBEAgASABKAIIQQBCAEEQECI3AwAgASkDAEIAUwRAIAFB/wE6AA8MBAsgASkDAEIDVQRAIAEoAghBDGpBFEEAEBUgAUH/AToADwwECyABIAEpAwA8AA8MAwUgASABKAIIKAIANgIIDAILAAsLIAFBADoADwsgASwADyEAIAFBEGokACAAC8wBAQF/IwBBEGsiASQAIAEgADYCCAJAIAEoAggoAiRBAUcEQCABKAIIQQxqQRJBABAVIAFBfzYCDAwBCyABKAIIKAIgQQFLBEAgASgCCEEMakEdQQAQFSABQX82AgwMAQsgASgCCCgCIEEASwRAIAEoAggQMkEASARAIAFBfzYCDAwCCwsgASgCCEEAQgBBCRAiQgBTBEAgASgCCEECNgIkIAFBfzYCDAwBCyABKAIIQQA2AiQgAUEANgIMCyABKAIMIQAgAUEQaiQAIAAL2gkBAX8jAEGwAWsiBSQAIAUgADYCpAEgBSABNgKgASAFIAI2ApwBIAUgAzcDkAEgBSAENgKMASAFIAUoAqABNgKIAQJAAkACQAJAAkACQAJAAkACQAJAAkAgBSgCjAEODwABAgMEBQcICQkJCQkJBgkLIAUoAogBQgA3AyAgBUIANwOoAQwJCyAFIAUoAqQBIAUoApwBIAUpA5ABEC8iAzcDgAEgA0IAUwRAIAUoAogBQQhqIAUoAqQBEBggBUJ/NwOoAQwJCwJAIAUpA4ABUARAIAUoAogBKQMoIAUoAogBKQMgUQRAIAUoAogBQQE2AgQgBSgCiAEgBSgCiAEpAyA3AxggBSgCiAEoAgAEQCAFKAKkASAFQcgAahA5QQBIBEAgBSgCiAFBCGogBSgCpAEQGCAFQn83A6gBDA0LAkAgBSkDSEIgg1ANACAFKAJ0IAUoAogBKAIwRg0AIAUoAogBQQhqQQdBABAVIAVCfzcDqAEMDQsCQCAFKQNIQgSDUA0AIAUpA2AgBSgCiAEpAxhRDQAgBSgCiAFBCGpBFUEAEBUgBUJ/NwOoAQwNCwsLDAELAkAgBSgCiAEoAgQNACAFKAKIASkDICAFKAKIASkDKFYNACAFIAUoAogBKQMoIAUoAogBKQMgfTcDQANAIAUpA0AgBSkDgAFUBEAgBQJ+Qv////8PQv////8PIAUpA4ABIAUpA0B9VA0AGiAFKQOAASAFKQNAfQs3AzggBSgCiAEoAjAgBSgCnAEgBSkDQKdqIAUpAzinEBshACAFKAKIASAANgIwIAUoAogBIgAgBSkDOCAAKQMofDcDKCAFIAUpAzggBSkDQHw3A0AMAQsLCwsgBSgCiAEiACAFKQOAASAAKQMgfDcDICAFIAUpA4ABNwOoAQwICyAFQgA3A6gBDAcLIAUgBSgCnAE2AjQgBSgCiAEoAgQEQCAFKAI0IAUoAogBKQMYNwMYIAUoAjQgBSgCiAEoAjA2AiwgBSgCNCAFKAKIASkDGDcDICAFKAI0QQA7ATAgBSgCNEEAOwEyIAUoAjQiACAAKQMAQuwBhDcDAAsgBUIANwOoAQwGCyAFIAUoAogBQQhqIAUoApwBIAUpA5ABEEI3A6gBDAULIAUoAogBEBYgBUIANwOoAQwECyMAQRBrIgAgBSgCpAE2AgwgBSAAKAIMKQMYNwMoIAUpAyhCAFMEQCAFKAKIAUEIaiAFKAKkARAYIAVCfzcDqAEMBAsgBSkDKCEDIAVBfzYCGCAFQRA2AhQgBUEPNgIQIAVBDTYCDCAFQQw2AgggBUEKNgIEIAVBCTYCACAFQQggBRA3Qn+FIAODNwOoAQwDCyAFAn8gBSkDkAFCEFQEQCAFKAKIAUEIakESQQAQFUEADAELIAUoApwBCzYCHCAFKAIcRQRAIAVCfzcDqAEMAwsCQCAFKAKkASAFKAIcKQMAIAUoAhwoAggQKEEATgRAIAUgBSgCpAEQSiIDNwMgIANCAFkNAQsgBSgCiAFBCGogBSgCpAEQGCAFQn83A6gBDAMLIAUoAogBIAUpAyA3AyAgBUIANwOoAQwCCyAFIAUoAogBKQMgNwOoAQwBCyAFKAKIAUEIakEcQQAQFSAFQn83A6gBCyAFKQOoASEDIAVBsAFqJAAgAwvDBgEBfyMAQUBqIgQkACAEIAA2AjQgBCABNgIwIAQgAjYCLCAEIAM3AyACQAJ/IwBBEGsiACAEKAIwNgIMIAAoAgwoAgALBEAgBEJ/NwM4DAELAkAgBCkDIFBFBEAgBCgCMC0ADUEBcUUNAQsgBEIANwM4DAELIARCADcDCCAEQQA6ABsDQCAELQAbQQFxBH9BAAUgBCkDCCAEKQMgVAtBAXEEQCAEIAQpAyAgBCkDCH03AwAgBCAEKAIwKAKsQCAEKAIsIAQpAwinaiAEIAQoAjAoAqhAKAIcEQEANgIcIAQoAhxBAkcEQCAEIAQpAwAgBCkDCHw3AwgLAkACQAJAAkAgBCgCHEEBaw4DAAIBAwsgBCgCMEEBOgANAkAgBCgCMC0ADEEBcQ0ACyAEKAIwKQMgQgBTBEAgBCgCMEEUQQAQFSAEQQE6ABsMAwsCQCAEKAIwLQAOQQFxRQ0AIAQoAjApAyAgBCkDCFYNACAEKAIwQQE6AA8gBCgCMCAEKAIwKQMgNwMYIAQoAiwgBCgCMEEoaiAEKAIwKQMYpxAaGiAEIAQoAjApAxg3AzgMBgsgBEEBOgAbDAILIAQoAjAtAAxBAXEEQCAEQQE6ABsMAgsgBCAEKAI0IAQoAjBBKGpCgMAAEC8iAzcDECADQgBTBEAgBCgCMCAEKAI0EBggBEEBOgAbDAILAkAgBCkDEFAEQCAEKAIwQQE6AAwgBCgCMCgCrEAgBCgCMCgCqEAoAhgRAwAgBCgCMCkDIEIAUwRAIAQoAjBCADcDIAsMAQsCQCAEKAIwKQMgQgBZBEAgBCgCMEEAOgAODAELIAQoAjAgBCkDEDcDIAsgBCgCMCgCrEAgBCgCMEEoaiAEKQMQIAQoAjAoAqhAKAIUEREAGgsMAQsCfyMAQRBrIgAgBCgCMDYCDCAAKAIMKAIARQsEQCAEKAIwQRRBABAVCyAEQQE6ABsLDAELCyAEKQMIQgBWBEAgBCgCMEEAOgAOIAQoAjAiACAEKQMIIAApAxh8NwMYIAQgBCkDCDcDOAwBCyAEQX9BAAJ/IwBBEGsiACAEKAIwNgIMIAAoAgwoAgALG6w3AzgLIAQpAzghAyAEQUBrJAAgAwuIAQEBfyMAQRBrIgIkACACIAA2AgwgAiABNgIIIwBBEGsiACACKAIMNgIMIAAoAgxBADYCACAAKAIMQQA2AgQgACgCDEEANgIIIAIoAgwgAigCCDYCAAJAIAIoAgwQpwFBAUYEQCACKAIMQbScASgCADYCBAwBCyACKAIMQQA2AgQLIAJBEGokAAvcBQEBfyMAQTBrIgUkACAFIAA2AiQgBSABNgIgIAUgAjYCHCAFIAM3AxAgBSAENgIMIAUgBSgCIDYCCAJAAkACQAJAAkACQAJAAkACQAJAIAUoAgwOEQABAgMFBggICAgICAgIBwgECAsgBSgCCEIANwMYIAUoAghBADoADCAFKAIIQQA6AA0gBSgCCEEAOgAPIAUoAghCfzcDICAFKAIIKAKsQCAFKAIIKAKoQCgCDBEAAEEBcUUEQCAFQn83AygMCQsgBUIANwMoDAgLIAUgBSgCJCAFKAIIIAUoAhwgBSkDEBC+AjcDKAwHCyAFKAIIKAKsQCAFKAIIKAKoQCgCEBEAAEEBcUUEQCAFQn83AygMBwsgBUIANwMoDAYLIAUgBSgCHDYCBAJAIAUoAggtABBBAXEEQCAFKAIILQANQQFxBEAgBSgCBAJ/QQAgBSgCCC0AD0EBcQ0AGgJ/AkAgBSgCCCgCFEF/RwRAIAUoAggoAhRBfkcNAQtBCAwBCyAFKAIIKAIUC0H//wNxCzsBMCAFKAIEIAUoAggpAxg3AyAgBSgCBCIAIAApAwBCyACENwMADAILIAUoAgQiACAAKQMAQrf///8PgzcDAAwBCyAFKAIEQQA7ATAgBSgCBCIAIAApAwBCwACENwMAAkAgBSgCCC0ADUEBcQRAIAUoAgQgBSgCCCkDGDcDGCAFKAIEIgAgACkDAEIEhDcDAAwBCyAFKAIEIgAgACkDAEL7////D4M3AwALCyAFQgA3AygMBQsgBQJ/QQAgBSgCCC0AD0EBcQ0AGiAFKAIIKAKsQCAFKAIIKAKoQCgCCBEAAAusNwMoDAQLIAUgBSgCCCAFKAIcIAUpAxAQQjcDKAwDCyAFKAIIEKwBIAVCADcDKAwCCyAFQX82AgAgBUEQIAUQN0I/hDcDKAwBCyAFKAIIQRRBABAVIAVCfzcDKAsgBSkDKCEDIAVBMGokACADC/4CAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE6ABcgBCACNgIQIAQgAzYCDCAEQbDAABAZIgA2AggCQCAARQRAIARBADYCHAwBCyMAQRBrIgAgBCgCCDYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCAEKAIIAn8gBC0AF0EBcQRAIAQoAhhBf0cEfyAEKAIYQX5GBUEBC0EBcQwBC0EAC0EARzoADiAEKAIIIAQoAgw2AqhAIAQoAgggBCgCGDYCFCAEKAIIIAQtABdBAXE6ABAgBCgCCEEAOgAMIAQoAghBADoADSAEKAIIQQA6AA8gBCgCCCgCqEAoAgAhAAJ/AkAgBCgCGEF/RwRAIAQoAhhBfkcNAQtBCAwBCyAEKAIYC0H//wNxIAQoAhAgBCgCCCAAEQEAIQAgBCgCCCAANgKsQCAARQRAIAQoAggQOCAEKAIIEBYgBEEANgIcDAELIAQgBCgCCDYCHAsgBCgCHCEAIARBIGokACAAC00BAX8jAEEQayIEJAAgBCAANgIMIAQgATYCCCAEIAI2AgQgBCADNgIAIAQoAgwgBCgCCCAEKAIEQQEgBCgCABCtASEAIARBEGokACAAC1sBAX8jAEEQayIBJAAgASAANgIIIAFBAToABwJAIAEoAghFBEAgAUEBOgAPDAELIAEgASgCCCABLQAHQQFxEK4BQQBHOgAPCyABLQAPQQFxIQAgAUEQaiQAIAALPAEBfyMAQRBrIgMkACADIAA7AQ4gAyABNgIIIAMgAjYCBEEAIAMoAgggAygCBBCvASEAIANBEGokACAAC68CAQF/IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNgIQIAMgAygCGDYCDCADKAIMAn5C/////w9C/////w8gAygCECkDAFQNABogAygCECkDAAs+AiAgAygCDCADKAIUNgIcAkAgAygCDC0ABEEBcQRAIAMgAygCDEEQakEEQQAgAygCDC0ADEEBcRsQ2wI2AggMAQsgAyADKAIMQRBqENECNgIICyADKAIQIgAgACkDACADKAIMNQIgfTcDAAJAAkACQAJAAkAgAygCCEEFag4HAgMDAwMAAQMLIANBADYCHAwDCyADQQE2AhwMAgsgAygCDCgCFEUEQCADQQM2AhwMAgsLIAMoAgwoAgBBDSADKAIIEBUgA0ECNgIcCyADKAIcIQAgA0EgaiQAIAALJAEBfyMAQRBrIgEgADYCDCABIAEoAgw2AgggASgCCEEBOgAMC5kBAQF/IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNwMIIAMgAygCGDYCBAJAAkAgAykDCEL/////D1gEQCADKAIEKAIUQQBNDQELIAMoAgQoAgBBEkEAEBUgA0EAOgAfDAELIAMoAgQgAykDCD4CFCADKAIEIAMoAhQ2AhAgA0EBOgAfCyADLQAfQQFxIQAgA0EgaiQAIAALkAEBAX8jAEEQayIBJAAgASAANgIIIAEgASgCCDYCBAJAIAEoAgQtAARBAXEEQCABIAEoAgRBEGoQsgE2AgAMAQsgASABKAIEQRBqEM0CNgIACwJAIAEoAgAEQCABKAIEKAIAQQ0gASgCABAVIAFBADoADwwBCyABQQE6AA8LIAEtAA9BAXEhACABQRBqJAAgAAvAAQEBfyMAQRBrIgEkACABIAA2AgggASABKAIINgIEIAEoAgRBADYCFCABKAIEQQA2AhAgASgCBEEANgIgIAEoAgRBADYCHAJAIAEoAgQtAARBAXEEQCABIAEoAgRBEGogASgCBCgCCBDhAjYCAAwBCyABIAEoAgRBEGoQ0gI2AgALAkAgASgCAARAIAEoAgQoAgBBDSABKAIAEBUgAUEAOgAPDAELIAFBAToADwsgAS0AD0EBcSEAIAFBEGokACAAC28BAX8jAEEQayIBIAA2AgggASABKAIINgIEAkAgASgCBC0ABEEBcUUEQCABQQA2AgwMAQsgASgCBCgCCEEDSARAIAFBAjYCDAwBCyABKAIEKAIIQQdKBEAgAUEBNgIMDAELIAFBADYCDAsgASgCDAssAQF/IwBBEGsiASQAIAEgADYCDCABIAEoAgw2AgggASgCCBAWIAFBEGokAAs8AQF/IwBBEGsiAyQAIAMgADsBDiADIAE2AgggAyACNgIEQQEgAygCCCADKAIEEK8BIQAgA0EQaiQAIAALmQEBAX8jAEEQayIBJAAgASAANgIIAkAgASgCCBBLBEAgAUF+NgIMDAELIAEgASgCCCgCHDYCBCABKAIEKAI4BEAgASgCCCgCKCABKAIEKAI4IAEoAggoAiQRBAALIAEoAggoAiggASgCCCgCHCABKAIIKAIkEQQAIAEoAghBADYCHCABQQA2AgwLIAEoAgwhACABQRBqJAAgAAudBAEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCECADIAMoAhgoAhw2AgwCQCADKAIMKAI4RQRAIAMoAhgoAihBASADKAIMKAIodEEBIAMoAhgoAiARAQAhACADKAIMIAA2AjggAygCDCgCOEUEQCADQQE2AhwMAgsLIAMoAgwoAixFBEAgAygCDEEBIAMoAgwoAih0NgIsIAMoAgxBADYCNCADKAIMQQA2AjALAkAgAygCECADKAIMKAIsTwRAIAMoAgwoAjggAygCFCADKAIMKAIsayADKAIMKAIsEBoaIAMoAgxBADYCNCADKAIMIAMoAgwoAiw2AjAMAQsgAyADKAIMKAIsIAMoAgwoAjRrNgIIIAMoAgggAygCEEsEQCADIAMoAhA2AggLIAMoAgwoAjggAygCDCgCNGogAygCFCADKAIQayADKAIIEBoaIAMgAygCECADKAIIazYCEAJAIAMoAhAEQCADKAIMKAI4IAMoAhQgAygCEGsgAygCEBAaGiADKAIMIAMoAhA2AjQgAygCDCADKAIMKAIsNgIwDAELIAMoAgwiACADKAIIIAAoAjRqNgI0IAMoAgwoAjQgAygCDCgCLEYEQCADKAIMQQA2AjQLIAMoAgwoAjAgAygCDCgCLEkEQCADKAIMIgAgAygCCCAAKAIwajYCMAsLCyADQQA2AhwLIAMoAhwhACADQSBqJAAgAAsYAQF/IwBBEGsiASAANgIMIAEoAgxBDGoLPAEBfyMAQRBrIgEgADYCDCABKAIMQZDyADYCUCABKAIMQQk2AlggASgCDEGQggE2AlQgASgCDEEFNgJcC5ZPAQR/IwBB4ABrIgEkACABIAA2AlggAUECNgJUAkACQAJAIAEoAlgQSw0AIAEoAlgoAgxFDQAgASgCWCgCAA0BIAEoAlgoAgRFDQELIAFBfjYCXAwBCyABIAEoAlgoAhw2AlAgASgCUCgCBEG//gBGBEAgASgCUEHA/gA2AgQLIAEgASgCWCgCDDYCSCABIAEoAlgoAhA2AkAgASABKAJYKAIANgJMIAEgASgCWCgCBDYCRCABIAEoAlAoAjw2AjwgASABKAJQKAJANgI4IAEgASgCRDYCNCABIAEoAkA2AjAgAUEANgIQA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCUCgCBEHMgX9qDh8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHwsgASgCUCgCDEUEQCABKAJQQcD+ADYCBAwhCwNAIAEoAjhBEEkEQCABKAJERQ0hIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCwJAIAEoAlAoAgxBAnFFDQAgASgCPEGflgJHDQAgASgCUCgCKEUEQCABKAJQQQ82AigLQQBBAEEAEBshACABKAJQIAA2AhwgASABKAI8OgAMIAEgASgCPEEIdjoADSABKAJQKAIcIAFBDGpBAhAbIQAgASgCUCAANgIcIAFBADYCPCABQQA2AjggASgCUEG1/gA2AgQMIQsgASgCUEEANgIUIAEoAlAoAiQEQCABKAJQKAIkQX82AjALAkAgASgCUCgCDEEBcQRAIAEoAjxB/wFxQQh0IAEoAjxBCHZqQR9wRQ0BCyABKAJYQbbuADYCGCABKAJQQdH+ADYCBAwhCyABKAI8QQ9xQQhHBEAgASgCWEHN7gA2AhggASgCUEHR/gA2AgQMIQsgASABKAI8QQR2NgI8IAEgASgCOEEEazYCOCABIAEoAjxBD3FBCGo2AhQgASgCUCgCKEUEQCABKAJQIAEoAhQ2AigLAkAgASgCFEEPTQRAIAEoAhQgASgCUCgCKE0NAQsgASgCWEHo7gA2AhggASgCUEHR/gA2AgQMIQsgASgCUEEBIAEoAhR0NgIYQQBBAEEAED4hACABKAJQIAA2AhwgASgCWCAANgIwIAEoAlBBvf4AQb/+ACABKAI8QYAEcRs2AgQgAUEANgI8IAFBADYCOAwgCwNAIAEoAjhBEEkEQCABKAJERQ0gIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCyABKAJQIAEoAjw2AhQgASgCUCgCFEH/AXFBCEcEQCABKAJYQc3uADYCGCABKAJQQdH+ADYCBAwgCyABKAJQKAIUQYDAA3EEQCABKAJYQfzuADYCGCABKAJQQdH+ADYCBAwgCyABKAJQKAIkBEAgASgCUCgCJCABKAI8QQh2QQFxNgIACwJAIAEoAlAoAhRBgARxRQ0AIAEoAlAoAgxBBHFFDQAgASABKAI8OgAMIAEgASgCPEEIdjoADSABKAJQKAIcIAFBDGpBAhAbIQAgASgCUCAANgIcCyABQQA2AjwgAUEANgI4IAEoAlBBtv4ANgIECwNAIAEoAjhBIEkEQCABKAJERQ0fIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCyABKAJQKAIkBEAgASgCUCgCJCABKAI8NgIECwJAIAEoAlAoAhRBgARxRQ0AIAEoAlAoAgxBBHFFDQAgASABKAI8OgAMIAEgASgCPEEIdjoADSABIAEoAjxBEHY6AA4gASABKAI8QRh2OgAPIAEoAlAoAhwgAUEMakEEEBshACABKAJQIAA2AhwLIAFBADYCPCABQQA2AjggASgCUEG3/gA2AgQLA0AgASgCOEEQSQRAIAEoAkRFDR4gASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLIAEoAlAoAiQEQCABKAJQKAIkIAEoAjxB/wFxNgIIIAEoAlAoAiQgASgCPEEIdjYCDAsCQCABKAJQKAIUQYAEcUUNACABKAJQKAIMQQRxRQ0AIAEgASgCPDoADCABIAEoAjxBCHY6AA0gASgCUCgCHCABQQxqQQIQGyEAIAEoAlAgADYCHAsgAUEANgI8IAFBADYCOCABKAJQQbj+ADYCBAsCQCABKAJQKAIUQYAIcQRAA0AgASgCOEEQSQRAIAEoAkRFDR8gASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLIAEoAlAgASgCPDYCRCABKAJQKAIkBEAgASgCUCgCJCABKAI8NgIUCwJAIAEoAlAoAhRBgARxRQ0AIAEoAlAoAgxBBHFFDQAgASABKAI8OgAMIAEgASgCPEEIdjoADSABKAJQKAIcIAFBDGpBAhAbIQAgASgCUCAANgIcCyABQQA2AjwgAUEANgI4DAELIAEoAlAoAiQEQCABKAJQKAIkQQA2AhALCyABKAJQQbn+ADYCBAsgASgCUCgCFEGACHEEQCABIAEoAlAoAkQ2AiwgASgCLCABKAJESwRAIAEgASgCRDYCLAsgASgCLARAAkAgASgCUCgCJEUNACABKAJQKAIkKAIQRQ0AIAEgASgCUCgCJCgCFCABKAJQKAJEazYCFCABKAJQKAIkKAIQIAEoAhRqIAEoAkwCfyABKAIUIAEoAixqIAEoAlAoAiQoAhhLBEAgASgCUCgCJCgCGCABKAIUawwBCyABKAIsCxAaGgsCQCABKAJQKAIUQYAEcUUNACABKAJQKAIMQQRxRQ0AIAEoAlAoAhwgASgCTCABKAIsEBshACABKAJQIAA2AhwLIAEgASgCRCABKAIsazYCRCABIAEoAiwgASgCTGo2AkwgASgCUCIAIAAoAkQgASgCLGs2AkQLIAEoAlAoAkQNGwsgASgCUEEANgJEIAEoAlBBuv4ANgIECwJAIAEoAlAoAhRBgBBxBEAgASgCREUNGyABQQA2AiwDQCABKAJMIQAgASABKAIsIgJBAWo2AiwgASAAIAJqLQAANgIUAkAgASgCUCgCJEUNACABKAJQKAIkKAIcRQ0AIAEoAlAoAkQgASgCUCgCJCgCIE8NACABKAIUIQIgASgCUCgCJCgCHCEDIAEoAlAiBCgCRCEAIAQgAEEBajYCRCAAIANqIAI6AAALIAEoAhQEfyABKAIsIAEoAkRJBUEAC0EBcQ0ACwJAIAEoAlAoAhRBgARxRQ0AIAEoAlAoAgxBBHFFDQAgASgCUCgCHCABKAJMIAEoAiwQGyEAIAEoAlAgADYCHAsgASABKAJEIAEoAixrNgJEIAEgASgCLCABKAJMajYCTCABKAIUDRsMAQsgASgCUCgCJARAIAEoAlAoAiRBADYCHAsLIAEoAlBBADYCRCABKAJQQbv+ADYCBAsCQCABKAJQKAIUQYAgcQRAIAEoAkRFDRogAUEANgIsA0AgASgCTCEAIAEgASgCLCICQQFqNgIsIAEgACACai0AADYCFAJAIAEoAlAoAiRFDQAgASgCUCgCJCgCJEUNACABKAJQKAJEIAEoAlAoAiQoAihPDQAgASgCFCECIAEoAlAoAiQoAiQhAyABKAJQIgQoAkQhACAEIABBAWo2AkQgACADaiACOgAACyABKAIUBH8gASgCLCABKAJESQVBAAtBAXENAAsCQCABKAJQKAIUQYAEcUUNACABKAJQKAIMQQRxRQ0AIAEoAlAoAhwgASgCTCABKAIsEBshACABKAJQIAA2AhwLIAEgASgCRCABKAIsazYCRCABIAEoAiwgASgCTGo2AkwgASgCFA0aDAELIAEoAlAoAiQEQCABKAJQKAIkQQA2AiQLCyABKAJQQbz+ADYCBAsgASgCUCgCFEGABHEEQANAIAEoAjhBEEkEQCABKAJERQ0aIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCwJAIAEoAlAoAgxBBHFFDQAgASgCPCABKAJQKAIcQf//A3FGDQAgASgCWEGV7wA2AhggASgCUEHR/gA2AgQMGgsgAUEANgI8IAFBADYCOAsgASgCUCgCJARAIAEoAlAoAiQgASgCUCgCFEEJdUEBcTYCLCABKAJQKAIkQQE2AjALQQBBAEEAEBshACABKAJQIAA2AhwgASgCWCAANgIwIAEoAlBBv/4ANgIEDBgLA0AgASgCOEEgSQRAIAEoAkRFDRggASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLIAEoAlAgASgCPEEIdkGA/gNxIAEoAjxBGHZqIAEoAjxBgP4DcUEIdGogASgCPEH/AXFBGHRqIgA2AhwgASgCWCAANgIwIAFBADYCPCABQQA2AjggASgCUEG+/gA2AgQLIAEoAlAoAhBFBEAgASgCWCABKAJINgIMIAEoAlggASgCQDYCECABKAJYIAEoAkw2AgAgASgCWCABKAJENgIEIAEoAlAgASgCPDYCPCABKAJQIAEoAjg2AkAgAUECNgJcDBgLQQBBAEEAED4hACABKAJQIAA2AhwgASgCWCAANgIwIAEoAlBBv/4ANgIECyABKAJUQQVGDRQgASgCVEEGRg0UCyABKAJQKAIIBEAgASABKAI8IAEoAjhBB3F2NgI8IAEgASgCOCABKAI4QQdxazYCOCABKAJQQc7+ADYCBAwVCwNAIAEoAjhBA0kEQCABKAJERQ0VIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCyABKAJQIAEoAjxBAXE2AgggASABKAI8QQF2NgI8IAEgASgCOEEBazYCOAJAAkACQAJAAkAgASgCPEEDcQ4EAAECAwQLIAEoAlBBwf4ANgIEDAMLIAEoAlAQ0AIgASgCUEHH/gA2AgQgASgCVEEGRgRAIAEgASgCPEECdjYCPCABIAEoAjhBAms2AjgMFwsMAgsgASgCUEHE/gA2AgQMAQsgASgCWEGp7wA2AhggASgCUEHR/gA2AgQLIAEgASgCPEECdjYCPCABIAEoAjhBAms2AjgMFAsgASABKAI8IAEoAjhBB3F2NgI8IAEgASgCOCABKAI4QQdxazYCOANAIAEoAjhBIEkEQCABKAJERQ0UIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCyABKAI8Qf//A3EgASgCPEEQdkH//wNzRwRAIAEoAlhBvO8ANgIYIAEoAlBB0f4ANgIEDBQLIAEoAlAgASgCPEH//wNxNgJEIAFBADYCPCABQQA2AjggASgCUEHC/gA2AgQgASgCVEEGRg0SCyABKAJQQcP+ADYCBAsgASABKAJQKAJENgIsIAEoAiwEQCABKAIsIAEoAkRLBEAgASABKAJENgIsCyABKAIsIAEoAkBLBEAgASABKAJANgIsCyABKAIsRQ0RIAEoAkggASgCTCABKAIsEBoaIAEgASgCRCABKAIsazYCRCABIAEoAiwgASgCTGo2AkwgASABKAJAIAEoAixrNgJAIAEgASgCLCABKAJIajYCSCABKAJQIgAgACgCRCABKAIsazYCRAwSCyABKAJQQb/+ADYCBAwRCwNAIAEoAjhBDkkEQCABKAJERQ0RIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCyABKAJQIAEoAjxBH3FBgQJqNgJkIAEgASgCPEEFdjYCPCABIAEoAjhBBWs2AjggASgCUCABKAI8QR9xQQFqNgJoIAEgASgCPEEFdjYCPCABIAEoAjhBBWs2AjggASgCUCABKAI8QQ9xQQRqNgJgIAEgASgCPEEEdjYCPCABIAEoAjhBBGs2AjgCQCABKAJQKAJkQZ4CTQRAIAEoAlAoAmhBHk0NAQsgASgCWEHZ7wA2AhggASgCUEHR/gA2AgQMEQsgASgCUEEANgJsIAEoAlBBxf4ANgIECwNAIAEoAlAoAmwgASgCUCgCYEkEQANAIAEoAjhBA0kEQCABKAJERQ0SIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCyABKAI8QQdxIQIgASgCUEH0AGohAyABKAJQIgQoAmwhACAEIABBAWo2AmwgAEEBdEGQ7gBqLwEAQQF0IANqIAI7AQAgASABKAI8QQN2NgI8IAEgASgCOEEDazYCOAwBCwsDQCABKAJQKAJsQRNJBEAgASgCUEH0AGohAiABKAJQIgMoAmwhACADIABBAWo2AmwgAEEBdEGQ7gBqLwEAQQF0IAJqQQA7AQAMAQsLIAEoAlAgASgCUEG0Cmo2AnAgASgCUCABKAJQKAJwNgJQIAEoAlBBBzYCWCABQQAgASgCUEH0AGpBEyABKAJQQfAAaiABKAJQQdgAaiABKAJQQfQFahByNgIQIAEoAhAEQCABKAJYQf3vADYCGCABKAJQQdH+ADYCBAwQCyABKAJQQQA2AmwgASgCUEHG/gA2AgQLA0ACQCABKAJQKAJsIAEoAlAoAmQgASgCUCgCaGpPDQADQAJAIAEgASgCUCgCUCABKAI8QQEgASgCUCgCWHRBAWtxQQJ0aigBADYBICABLQAhIAEoAjhNDQAgASgCREUNESABIAEoAkRBf2o2AkQgASABKAJMIgBBAWo2AkwgASABKAI8IAAtAAAgASgCOHRqNgI8IAEgASgCOEEIajYCOAwBCwsCQCABLwEiQRBIBEAgASABKAI8IAEtACF2NgI8IAEgASgCOCABLQAhazYCOCABLwEiIQIgASgCUEH0AGohAyABKAJQIgQoAmwhACAEIABBAWo2AmwgAEEBdCADaiACOwEADAELAkAgAS8BIkEQRgRAA0AgASgCOCABLQAhQQJqSQRAIAEoAkRFDRQgASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLIAEgASgCPCABLQAhdjYCPCABIAEoAjggAS0AIWs2AjggASgCUCgCbEUEQCABKAJYQZbwADYCGCABKAJQQdH+ADYCBAwECyABIAEoAlAgASgCUCgCbEEBdGovAXI2AhQgASABKAI8QQNxQQNqNgIsIAEgASgCPEECdjYCPCABIAEoAjhBAms2AjgMAQsCQCABLwEiQRFGBEADQCABKAI4IAEtACFBA2pJBEAgASgCREUNFSABIAEoAkRBf2o2AkQgASABKAJMIgBBAWo2AkwgASABKAI8IAAtAAAgASgCOHRqNgI8IAEgASgCOEEIajYCOAwBCwsgASABKAI8IAEtACF2NgI8IAEgASgCOCABLQAhazYCOCABQQA2AhQgASABKAI8QQdxQQNqNgIsIAEgASgCPEEDdjYCPCABIAEoAjhBA2s2AjgMAQsDQCABKAI4IAEtACFBB2pJBEAgASgCREUNFCABIAEoAkRBf2o2AkQgASABKAJMIgBBAWo2AkwgASABKAI8IAAtAAAgASgCOHRqNgI8IAEgASgCOEEIajYCOAwBCwsgASABKAI8IAEtACF2NgI8IAEgASgCOCABLQAhazYCOCABQQA2AhQgASABKAI8Qf8AcUELajYCLCABIAEoAjxBB3Y2AjwgASABKAI4QQdrNgI4CwsgASgCUCgCbCABKAIsaiABKAJQKAJkIAEoAlAoAmhqSwRAIAEoAlhBlvAANgIYIAEoAlBB0f4ANgIEDAILA0AgASABKAIsIgBBf2o2AiwgAARAIAEoAhQhAiABKAJQQfQAaiEDIAEoAlAiBCgCbCEAIAQgAEEBajYCbCAAQQF0IANqIAI7AQAMAQsLCwwBCwsgASgCUCgCBEHR/gBGDQ4gASgCUC8B9ARFBEAgASgCWEGw8AA2AhggASgCUEHR/gA2AgQMDwsgASgCUCABKAJQQbQKajYCcCABKAJQIAEoAlAoAnA2AlAgASgCUEEJNgJYIAFBASABKAJQQfQAaiABKAJQKAJkIAEoAlBB8ABqIAEoAlBB2ABqIAEoAlBB9AVqEHI2AhAgASgCEARAIAEoAlhB1fAANgIYIAEoAlBB0f4ANgIEDA8LIAEoAlAgASgCUCgCcDYCVCABKAJQQQY2AlwgAUECIAEoAlBB9ABqIAEoAlAoAmRBAXRqIAEoAlAoAmggASgCUEHwAGogASgCUEHcAGogASgCUEH0BWoQcjYCECABKAIQBEAgASgCWEHx8AA2AhggASgCUEHR/gA2AgQMDwsgASgCUEHH/gA2AgQgASgCVEEGRg0NCyABKAJQQcj+ADYCBAsCQCABKAJEQQZJDQAgASgCQEGCAkkNACABKAJYIAEoAkg2AgwgASgCWCABKAJANgIQIAEoAlggASgCTDYCACABKAJYIAEoAkQ2AgQgASgCUCABKAI8NgI8IAEoAlAgASgCODYCQCABKAJYIAEoAjAQ1gIgASABKAJYKAIMNgJIIAEgASgCWCgCEDYCQCABIAEoAlgoAgA2AkwgASABKAJYKAIENgJEIAEgASgCUCgCPDYCPCABIAEoAlAoAkA2AjggASgCUCgCBEG//gBGBEAgASgCUEF/NgLINwsMDQsgASgCUEEANgLINwNAAkAgASABKAJQKAJQIAEoAjxBASABKAJQKAJYdEEBa3FBAnRqKAEANgEgIAEtACEgASgCOE0NACABKAJERQ0NIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCwJAIAEtACBFDQAgAS0AIEHwAXENACABIAEoASA2ARgDQAJAIAEgASgCUCgCUCABLwEaIAEoAjxBASABLQAZIAEtABhqdEEBa3EgAS0AGXZqQQJ0aigBADYBICABLQAZIAEtACFqIAEoAjhNDQAgASgCREUNDiABIAEoAkRBf2o2AkQgASABKAJMIgBBAWo2AkwgASABKAI8IAAtAAAgASgCOHRqNgI8IAEgASgCOEEIajYCOAwBCwsgASABKAI8IAEtABl2NgI8IAEgASgCOCABLQAZazYCOCABKAJQIgAgAS0AGSAAKALIN2o2Asg3CyABIAEoAjwgAS0AIXY2AjwgASABKAI4IAEtACFrNgI4IAEoAlAiACABLQAhIAAoAsg3ajYCyDcgASgCUCABLwEiNgJEIAEtACBFBEAgASgCUEHN/gA2AgQMDQsgAS0AIEEgcQRAIAEoAlBBfzYCyDcgASgCUEG//gA2AgQMDQsgAS0AIEHAAHEEQCABKAJYQYfxADYCGCABKAJQQdH+ADYCBAwNCyABKAJQIAEtACBBD3E2AkwgASgCUEHJ/gA2AgQLIAEoAlAoAkwEQANAIAEoAjggASgCUCgCTEkEQCABKAJERQ0NIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCyABKAJQIgAgACgCRCABKAI8QQEgASgCUCgCTHRBAWtxajYCRCABIAEoAjwgASgCUCgCTHY2AjwgASABKAI4IAEoAlAoAkxrNgI4IAEoAlAiACABKAJQKAJMIAAoAsg3ajYCyDcLIAEoAlAgASgCUCgCRDYCzDcgASgCUEHK/gA2AgQLA0ACQCABIAEoAlAoAlQgASgCPEEBIAEoAlAoAlx0QQFrcUECdGooAQA2ASAgAS0AISABKAI4TQ0AIAEoAkRFDQsgASABKAJEQX9qNgJEIAEgASgCTCIAQQFqNgJMIAEgASgCPCAALQAAIAEoAjh0ajYCPCABIAEoAjhBCGo2AjgMAQsLIAEtACBB8AFxRQRAIAEgASgBIDYBGANAAkAgASABKAJQKAJUIAEvARogASgCPEEBIAEtABkgAS0AGGp0QQFrcSABLQAZdmpBAnRqKAEANgEgIAEtABkgAS0AIWogASgCOE0NACABKAJERQ0MIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCyABIAEoAjwgAS0AGXY2AjwgASABKAI4IAEtABlrNgI4IAEoAlAiACABLQAZIAAoAsg3ajYCyDcLIAEgASgCPCABLQAhdjYCPCABIAEoAjggAS0AIWs2AjggASgCUCIAIAEtACEgACgCyDdqNgLINyABLQAgQcAAcQRAIAEoAlhBo/EANgIYIAEoAlBB0f4ANgIEDAsLIAEoAlAgAS8BIjYCSCABKAJQIAEtACBBD3E2AkwgASgCUEHL/gA2AgQLIAEoAlAoAkwEQANAIAEoAjggASgCUCgCTEkEQCABKAJERQ0LIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCyABKAJQIgAgACgCSCABKAI8QQEgASgCUCgCTHRBAWtxajYCSCABIAEoAjwgASgCUCgCTHY2AjwgASABKAI4IAEoAlAoAkxrNgI4IAEoAlAiACABKAJQKAJMIAAoAsg3ajYCyDcLIAEoAlBBzP4ANgIECyABKAJARQ0HIAEgASgCMCABKAJAazYCLAJAIAEoAlAoAkggASgCLEsEQCABIAEoAlAoAkggASgCLGs2AiwgASgCLCABKAJQKAIwSwRAIAEoAlAoAsQ3BEAgASgCWEG58QA2AhggASgCUEHR/gA2AgQMDAsLAkAgASgCLCABKAJQKAI0SwRAIAEgASgCLCABKAJQKAI0azYCLCABIAEoAlAoAjggASgCUCgCLCABKAIsa2o2AigMAQsgASABKAJQKAI4IAEoAlAoAjQgASgCLGtqNgIoCyABKAIsIAEoAlAoAkRLBEAgASABKAJQKAJENgIsCwwBCyABIAEoAkggASgCUCgCSGs2AiggASABKAJQKAJENgIsCyABKAIsIAEoAkBLBEAgASABKAJANgIsCyABIAEoAkAgASgCLGs2AkAgASgCUCIAIAAoAkQgASgCLGs2AkQDQCABIAEoAigiAEEBajYCKCAALQAAIQAgASABKAJIIgJBAWo2AkggAiAAOgAAIAEgASgCLEF/aiIANgIsIAANAAsgASgCUCgCREUEQCABKAJQQcj+ADYCBAsMCAsgASgCQEUNBiABKAJQKAJEIQAgASABKAJIIgJBAWo2AkggAiAAOgAAIAEgASgCQEF/ajYCQCABKAJQQcj+ADYCBAwHCyABKAJQKAIMBEADQCABKAI4QSBJBEAgASgCREUNCCABIAEoAkRBf2o2AkQgASABKAJMIgBBAWo2AkwgASABKAI8IAAtAAAgASgCOHRqNgI8IAEgASgCOEEIajYCOAwBCwsgASABKAIwIAEoAkBrNgIwIAEoAlgiACABKAIwIAAoAhRqNgIUIAEoAlAiACABKAIwIAAoAiBqNgIgAkAgASgCUCgCDEEEcUUNACABKAIwRQ0AAn8gASgCUCgCFARAIAEoAlAoAhwgASgCSCABKAIwayABKAIwEBsMAQsgASgCUCgCHCABKAJIIAEoAjBrIAEoAjAQPgshACABKAJQIAA2AhwgASgCWCAANgIwCyABIAEoAkA2AjACQCABKAJQKAIMQQRxRQ0AAn8gASgCUCgCFARAIAEoAjwMAQsgASgCPEEIdkGA/gNxIAEoAjxBGHZqIAEoAjxBgP4DcUEIdGogASgCPEH/AXFBGHRqCyABKAJQKAIcRg0AIAEoAlhB1/EANgIYIAEoAlBB0f4ANgIEDAgLIAFBADYCPCABQQA2AjgLIAEoAlBBz/4ANgIECwJAIAEoAlAoAgxFDQAgASgCUCgCFEUNAANAIAEoAjhBIEkEQCABKAJERQ0HIAEgASgCREF/ajYCRCABIAEoAkwiAEEBajYCTCABIAEoAjwgAC0AACABKAI4dGo2AjwgASABKAI4QQhqNgI4DAELCyABKAI8IAEoAlAoAiBHBEAgASgCWEHs8QA2AhggASgCUEHR/gA2AgQMBwsgAUEANgI8IAFBADYCOAsgASgCUEHQ/gA2AgQLIAFBATYCEAwDCyABQX02AhAMAgsgAUF8NgJcDAMLIAFBfjYCXAwCCwsgASgCWCABKAJINgIMIAEoAlggASgCQDYCECABKAJYIAEoAkw2AgAgASgCWCABKAJENgIEIAEoAlAgASgCPDYCPCABKAJQIAEoAjg2AkACQAJAIAEoAlAoAiwNACABKAIwIAEoAlgoAhBGDQEgASgCUCgCBEHR/gBPDQEgASgCUCgCBEHO/gBJDQAgASgCVEEERg0BCyABKAJYIAEoAlgoAgwgASgCMCABKAJYKAIQaxDOAgRAIAEoAlBB0v4ANgIEIAFBfDYCXAwCCwsgASABKAI0IAEoAlgoAgRrNgI0IAEgASgCMCABKAJYKAIQazYCMCABKAJYIgAgASgCNCAAKAIIajYCCCABKAJYIgAgASgCMCAAKAIUajYCFCABKAJQIgAgASgCMCAAKAIgajYCIAJAIAEoAlAoAgxBBHFFDQAgASgCMEUNAAJ/IAEoAlAoAhQEQCABKAJQKAIcIAEoAlgoAgwgASgCMGsgASgCMBAbDAELIAEoAlAoAhwgASgCWCgCDCABKAIwayABKAIwED4LIQAgASgCUCAANgIcIAEoAlggADYCMAsgASgCWCABKAJQKAJAQcAAQQAgASgCUCgCCBtqQYABQQAgASgCUCgCBEG//gBGG2pBgAJBACABKAJQKAIEQcf+AEcEfyABKAJQKAIEQcL+AEYFQQELQQFxG2o2AiwCQAJAIAEoAjRFBEAgASgCMEUNAQsgASgCVEEERw0BCyABKAIQDQAgAUF7NgIQCyABIAEoAhA2AlwLIAEoAlwhACABQeAAaiQAIAAL6AIBAX8jAEEgayIBJAAgASAANgIYIAFBcTYCFCABQZCDATYCECABQTg2AgwCQAJAAkAgASgCEEUNACABKAIQLAAAQYDuACwAAEcNACABKAIMQThGDQELIAFBejYCHAwBCyABKAIYRQRAIAFBfjYCHAwBCyABKAIYQQA2AhggASgCGCgCIEUEQCABKAIYQQU2AiAgASgCGEEANgIoCyABKAIYKAIkRQRAIAEoAhhBBjYCJAsgASABKAIYKAIoQQFB0DcgASgCGCgCIBEBADYCBCABKAIERQRAIAFBfDYCHAwBCyABKAIYIAEoAgQ2AhwgASgCBCABKAIYNgIAIAEoAgRBADYCOCABKAIEQbT+ADYCBCABIAEoAhggASgCFBDTAjYCCCABKAIIBEAgASgCGCgCKCABKAIEIAEoAhgoAiQRBAAgASgCGEEANgIcCyABIAEoAgg2AhwLIAEoAhwhACABQSBqJAAgAAutAgEBfyMAQSBrIgIkACACIAA2AhggAiABNgIUAkAgAigCGBBLBEAgAkF+NgIcDAELIAIgAigCGCgCHDYCDAJAIAIoAhRBAEgEQCACQQA2AhAgAkEAIAIoAhRrNgIUDAELIAIgAigCFEEEdUEFajYCECACKAIUQTBIBEAgAiACKAIUQQ9xNgIUCwsCQCACKAIURQ0AIAIoAhRBCE4EQCACKAIUQQ9MDQELIAJBfjYCHAwBCwJAIAIoAgwoAjhFDQAgAigCDCgCKCACKAIURg0AIAIoAhgoAiggAigCDCgCOCACKAIYKAIkEQQAIAIoAgxBADYCOAsgAigCDCACKAIQNgIMIAIoAgwgAigCFDYCKCACIAIoAhgQ1AI2AhwLIAIoAhwhACACQSBqJAAgAAtyAQF/IwBBEGsiASQAIAEgADYCCAJAIAEoAggQSwRAIAFBfjYCDAwBCyABIAEoAggoAhw2AgQgASgCBEEANgIsIAEoAgRBADYCMCABKAIEQQA2AjQgASABKAIIENUCNgIMCyABKAIMIQAgAUEQaiQAIAALmwIBAX8jAEEQayIBJAAgASAANgIIAkAgASgCCBBLBEAgAUF+NgIMDAELIAEgASgCCCgCHDYCBCABKAIEQQA2AiAgASgCCEEANgIUIAEoAghBADYCCCABKAIIQQA2AhggASgCBCgCDARAIAEoAgggASgCBCgCDEEBcTYCMAsgASgCBEG0/gA2AgQgASgCBEEANgIIIAEoAgRBADYCECABKAIEQYCAAjYCGCABKAIEQQA2AiQgASgCBEEANgI8IAEoAgRBADYCQCABKAIEIAEoAgRBtApqIgA2AnAgASgCBCAANgJUIAEoAgQgADYCUCABKAIEQQE2AsQ3IAEoAgRBfzYCyDcgAUEANgIMCyABKAIMIQAgAUEQaiQAIAALkhUBAX8jAEHgAGsiAiAANgJcIAIgATYCWCACIAIoAlwoAhw2AlQgAiACKAJcKAIANgJQIAIgAigCUCACKAJcKAIEQQVrajYCTCACIAIoAlwoAgw2AkggAiACKAJIIAIoAlggAigCXCgCEGtrNgJEIAIgAigCSCACKAJcKAIQQYECa2o2AkAgAiACKAJUKAIsNgI8IAIgAigCVCgCMDYCOCACIAIoAlQoAjQ2AjQgAiACKAJUKAI4NgIwIAIgAigCVCgCPDYCLCACIAIoAlQoAkA2AiggAiACKAJUKAJQNgIkIAIgAigCVCgCVDYCICACQQEgAigCVCgCWHRBAWs2AhwgAkEBIAIoAlQoAlx0QQFrNgIYA0AgAigCKEEPSQRAIAIgAigCUCIAQQFqNgJQIAIgAigCLCAALQAAIAIoAih0ajYCLCACIAIoAihBCGo2AiggAiACKAJQIgBBAWo2AlAgAiACKAIsIAAtAAAgAigCKHRqNgIsIAIgAigCKEEIajYCKAsgAkEQaiACKAIkIAIoAiwgAigCHHFBAnRqKAEANgEAAkACQANAIAIgAi0AETYCDCACIAIoAiwgAigCDHY2AiwgAiACKAIoIAIoAgxrNgIoIAIgAi0AEDYCDCACKAIMRQRAIAIvARIhACACIAIoAkgiAUEBajYCSCABIAA6AAAMAgsgAigCDEEQcQRAIAIgAi8BEjYCCCACIAIoAgxBD3E2AgwgAigCDARAIAIoAiggAigCDEkEQCACIAIoAlAiAEEBajYCUCACIAIoAiwgAC0AACACKAIodGo2AiwgAiACKAIoQQhqNgIoCyACIAIoAgggAigCLEEBIAIoAgx0QQFrcWo2AgggAiACKAIsIAIoAgx2NgIsIAIgAigCKCACKAIMazYCKAsgAigCKEEPSQRAIAIgAigCUCIAQQFqNgJQIAIgAigCLCAALQAAIAIoAih0ajYCLCACIAIoAihBCGo2AiggAiACKAJQIgBBAWo2AlAgAiACKAIsIAAtAAAgAigCKHRqNgIsIAIgAigCKEEIajYCKAsgAkEQaiACKAIgIAIoAiwgAigCGHFBAnRqKAEANgEAAkADQCACIAItABE2AgwgAiACKAIsIAIoAgx2NgIsIAIgAigCKCACKAIMazYCKCACIAItABA2AgwgAigCDEEQcQRAIAIgAi8BEjYCBCACIAIoAgxBD3E2AgwgAigCKCACKAIMSQRAIAIgAigCUCIAQQFqNgJQIAIgAigCLCAALQAAIAIoAih0ajYCLCACIAIoAihBCGo2AiggAigCKCACKAIMSQRAIAIgAigCUCIAQQFqNgJQIAIgAigCLCAALQAAIAIoAih0ajYCLCACIAIoAihBCGo2AigLCyACIAIoAgQgAigCLEEBIAIoAgx0QQFrcWo2AgQgAiACKAIsIAIoAgx2NgIsIAIgAigCKCACKAIMazYCKCACIAIoAkggAigCRGs2AgwCQCACKAIEIAIoAgxLBEAgAiACKAIEIAIoAgxrNgIMIAIoAgwgAigCOEsEQCACKAJUKALENwRAIAIoAlxBsO0ANgIYIAIoAlRB0f4ANgIEDAoLCyACIAIoAjA2AgACQCACKAI0RQRAIAIgAigCACACKAI8IAIoAgxrajYCACACKAIMIAIoAghJBEAgAiACKAIIIAIoAgxrNgIIA0AgAiACKAIAIgBBAWo2AgAgAC0AACEAIAIgAigCSCIBQQFqNgJIIAEgADoAACACIAIoAgxBf2oiADYCDCAADQALIAIgAigCSCACKAIEazYCAAsMAQsCQCACKAI0IAIoAgxJBEAgAiACKAIAIAIoAjwgAigCNGogAigCDGtqNgIAIAIgAigCDCACKAI0azYCDCACKAIMIAIoAghJBEAgAiACKAIIIAIoAgxrNgIIA0AgAiACKAIAIgBBAWo2AgAgAC0AACEAIAIgAigCSCIBQQFqNgJIIAEgADoAACACIAIoAgxBf2oiADYCDCAADQALIAIgAigCMDYCACACKAI0IAIoAghJBEAgAiACKAI0NgIMIAIgAigCCCACKAIMazYCCANAIAIgAigCACIAQQFqNgIAIAAtAAAhACACIAIoAkgiAUEBajYCSCABIAA6AAAgAiACKAIMQX9qIgA2AgwgAA0ACyACIAIoAkggAigCBGs2AgALCwwBCyACIAIoAgAgAigCNCACKAIMa2o2AgAgAigCDCACKAIISQRAIAIgAigCCCACKAIMazYCCANAIAIgAigCACIAQQFqNgIAIAAtAAAhACACIAIoAkgiAUEBajYCSCABIAA6AAAgAiACKAIMQX9qIgA2AgwgAA0ACyACIAIoAkggAigCBGs2AgALCwsDQCACKAIIQQJNRQRAIAIgAigCACIAQQFqNgIAIAAtAAAhACACIAIoAkgiAUEBajYCSCABIAA6AAAgAiACKAIAIgBBAWo2AgAgAC0AACEAIAIgAigCSCIBQQFqNgJIIAEgADoAACACIAIoAgAiAEEBajYCACAALQAAIQAgAiACKAJIIgFBAWo2AkggASAAOgAAIAIgAigCCEEDazYCCAwBCwsMAQsgAiACKAJIIAIoAgRrNgIAA0AgAiACKAIAIgBBAWo2AgAgAC0AACEAIAIgAigCSCIBQQFqNgJIIAEgADoAACACIAIoAgAiAEEBajYCACAALQAAIQAgAiACKAJIIgFBAWo2AkggASAAOgAAIAIgAigCACIAQQFqNgIAIAAtAAAhACACIAIoAkgiAUEBajYCSCABIAA6AAAgAiACKAIIQQNrNgIIIAIoAghBAksNAAsLIAIoAggEQCACIAIoAgAiAEEBajYCACAALQAAIQAgAiACKAJIIgFBAWo2AkggASAAOgAAIAIoAghBAUsEQCACIAIoAgAiAEEBajYCACAALQAAIQAgAiACKAJIIgFBAWo2AkggASAAOgAACwsMAgsgAigCDEHAAHFFBEAgAkEQaiACKAIgIAIvARIgAigCLEEBIAIoAgx0QQFrcWpBAnRqKAEANgEADAELCyACKAJcQc7tADYCGCACKAJUQdH+ADYCBAwECwwCCyACKAIMQcAAcUUEQCACQRBqIAIoAiQgAi8BEiACKAIsQQEgAigCDHRBAWtxakECdGooAQA2AQAMAQsLIAIoAgxBIHEEQCACKAJUQb/+ADYCBAwCCyACKAJcQeTtADYCGCACKAJUQdH+ADYCBAwBC0EAIQAgAigCUCACKAJMSQR/IAIoAkggAigCQEkFQQALQQFxDQELCyACIAIoAihBA3Y2AgggAiACKAJQIAIoAghrNgJQIAIgAigCKCACKAIIQQN0azYCKCACIAIoAixBASACKAIodEEBa3E2AiwgAigCXCACKAJQNgIAIAIoAlwgAigCSDYCDCACKAJcAn8gAigCUCACKAJMSQRAIAIoAkwgAigCUGtBBWoMAQtBBSACKAJQIAIoAkxraws2AgQgAigCXAJ/IAIoAkggAigCQEkEQCACKAJAIAIoAkhrQYECagwBC0GBAiACKAJIIAIoAkBraws2AhAgAigCVCACKAIsNgI8IAIoAlQgAigCKDYCQAvBEAECfyMAQSBrIgIkACACIAA2AhggAiABNgIUAkADQAJAIAIoAhgoAnRBhgJJBEAgAigCGBBWAkAgAigCGCgCdEGGAk8NACACKAIUDQAgAkEANgIcDAQLIAIoAhgoAnRFDQELIAJBADYCECACKAIYKAJ0QQNPBEAgAigCGCACKAIYKAJUIAIoAhgoAjggAigCGCgCbEECamotAAAgAigCGCgCSCACKAIYKAJYdHNxNgJIIAIoAhgoAkAgAigCGCgCbCACKAIYKAI0cUEBdGogAigCGCgCRCACKAIYKAJIQQF0ai8BACIAOwEAIAIgAEH//wNxNgIQIAIoAhgoAkQgAigCGCgCSEEBdGogAigCGCgCbDsBAAsgAigCGCACKAIYKAJgNgJ4IAIoAhggAigCGCgCcDYCZCACKAIYQQI2AmACQCACKAIQRQ0AIAIoAhgoAnggAigCGCgCgAFPDQAgAigCGCgCbCACKAIQayACKAIYKAIsQYYCa0sNACACKAIYIAIoAhAQsAEhACACKAIYIAA2AmACQCACKAIYKAJgQQVLDQAgAigCGCgCiAFBAUcEQCACKAIYKAJgQQNHDQEgAigCGCgCbCACKAIYKAJwa0GAIE0NAQsgAigCGEECNgJgCwsCQAJAIAIoAhgoAnhBA0kNACACKAIYKAJgIAIoAhgoAnhLDQAgAiACKAIYIgAoAmwgACgCdGpBfWo2AgggAiACKAIYKAJ4QX1qOgAHIAIgAigCGCIAKAJsIAAoAmRBf3NqOwEEIAIoAhgiACgCpC0gACgCoC1BAXRqIAIvAQQ7AQAgAi0AByEBIAIoAhgiACgCmC0hAyAAIAAoAqAtIgBBAWo2AqAtIAAgA2ogAToAACACIAIvAQRBf2o7AQQgAigCGCACLQAHQYDZAGotAABBAnRqQZgJaiIAIAAvAQBBAWo7AQAgAigCGEGIE2oCfyACLwEEQYACSARAIAIvAQQtAIBVDAELIAIvAQRBB3VBgAJqLQCAVQtBAnRqIgAgAC8BAEEBajsBACACIAIoAhgoAqAtIAIoAhgoApwtQQFrRjYCDCACKAIYIgAgACgCdCACKAIYKAJ4QQFrazYCdCACKAIYIgAgACgCeEECazYCeANAIAIoAhgiASgCbEEBaiEAIAEgADYCbCAAIAIoAghNBEAgAigCGCACKAIYKAJUIAIoAhgoAjggAigCGCgCbEECamotAAAgAigCGCgCSCACKAIYKAJYdHNxNgJIIAIoAhgoAkAgAigCGCgCbCACKAIYKAI0cUEBdGogAigCGCgCRCACKAIYKAJIQQF0ai8BACIAOwEAIAIgAEH//wNxNgIQIAIoAhgoAkQgAigCGCgCSEEBdGogAigCGCgCbDsBAAsgAigCGCIBKAJ4QX9qIQAgASAANgJ4IAANAAsgAigCGEEANgJoIAIoAhhBAjYCYCACKAIYIgAgACgCbEEBajYCbCACKAIMBEAgAigCGAJ/IAIoAhgoAlxBAE4EQCACKAIYKAI4IAIoAhgoAlxqDAELQQALIAIoAhgoAmwgAigCGCgCXGtBABApIAIoAhggAigCGCgCbDYCXCACKAIYKAIAEB0gAigCGCgCACgCEEUEQCACQQA2AhwMBgsLDAELAkAgAigCGCgCaARAIAIgAigCGCIAKAI4IAAoAmxqQX9qLQAAOgADIAIoAhgiACgCpC0gACgCoC1BAXRqQQA7AQAgAi0AAyEBIAIoAhgiACgCmC0hAyAAIAAoAqAtIgBBAWo2AqAtIAAgA2ogAToAACACKAIYIAItAANBAnRqIgAgAC8BlAFBAWo7AZQBIAIgAigCGCgCoC0gAigCGCgCnC1BAWtGNgIMIAIoAgwEQCACKAIYAn8gAigCGCgCXEEATgRAIAIoAhgoAjggAigCGCgCXGoMAQtBAAsgAigCGCgCbCACKAIYKAJca0EAECkgAigCGCACKAIYKAJsNgJcIAIoAhgoAgAQHQsgAigCGCIAIAAoAmxBAWo2AmwgAigCGCIAIAAoAnRBf2o2AnQgAigCGCgCACgCEEUEQCACQQA2AhwMBgsMAQsgAigCGEEBNgJoIAIoAhgiACAAKAJsQQFqNgJsIAIoAhgiACAAKAJ0QX9qNgJ0CwsMAQsLIAIoAhgoAmgEQCACIAIoAhgiACgCOCAAKAJsakF/ai0AADoAAiACKAIYIgAoAqQtIAAoAqAtQQF0akEAOwEAIAItAAIhASACKAIYIgAoApgtIQMgACAAKAKgLSIAQQFqNgKgLSAAIANqIAE6AAAgAigCGCACLQACQQJ0aiIAIAAvAZQBQQFqOwGUASACIAIoAhgoAqAtIAIoAhgoApwtQQFrRjYCDCACKAIYQQA2AmgLIAIoAhgCfyACKAIYKAJsQQJJBEAgAigCGCgCbAwBC0ECCzYCtC0gAigCFEEERgRAIAIoAhgCfyACKAIYKAJcQQBOBEAgAigCGCgCOCACKAIYKAJcagwBC0EACyACKAIYKAJsIAIoAhgoAlxrQQEQKSACKAIYIAIoAhgoAmw2AlwgAigCGCgCABAdIAIoAhgoAgAoAhBFBEAgAkECNgIcDAILIAJBAzYCHAwBCyACKAIYKAKgLQRAIAIoAhgCfyACKAIYKAJcQQBOBEAgAigCGCgCOCACKAIYKAJcagwBC0EACyACKAIYKAJsIAIoAhgoAlxrQQAQKSACKAIYIAIoAhgoAmw2AlwgAigCGCgCABAdIAIoAhgoAgAoAhBFBEAgAkEANgIcDAILCyACQQE2AhwLIAIoAhwhACACQSBqJAAgAAuVDQECfyMAQSBrIgIkACACIAA2AhggAiABNgIUAkADQAJAIAIoAhgoAnRBhgJJBEAgAigCGBBWAkAgAigCGCgCdEGGAk8NACACKAIUDQAgAkEANgIcDAQLIAIoAhgoAnRFDQELIAJBADYCECACKAIYKAJ0QQNPBEAgAigCGCACKAIYKAJUIAIoAhgoAjggAigCGCgCbEECamotAAAgAigCGCgCSCACKAIYKAJYdHNxNgJIIAIoAhgoAkAgAigCGCgCbCACKAIYKAI0cUEBdGogAigCGCgCRCACKAIYKAJIQQF0ai8BACIAOwEAIAIgAEH//wNxNgIQIAIoAhgoAkQgAigCGCgCSEEBdGogAigCGCgCbDsBAAsCQCACKAIQRQ0AIAIoAhgoAmwgAigCEGsgAigCGCgCLEGGAmtLDQAgAigCGCACKAIQELABIQAgAigCGCAANgJgCwJAIAIoAhgoAmBBA08EQCACIAIoAhgoAmBBfWo6AAsgAiACKAIYIgAoAmwgACgCcGs7AQggAigCGCIAKAKkLSAAKAKgLUEBdGogAi8BCDsBACACLQALIQEgAigCGCIAKAKYLSEDIAAgACgCoC0iAEEBajYCoC0gACADaiABOgAAIAIgAi8BCEF/ajsBCCACKAIYIAItAAtBgNkAai0AAEECdGpBmAlqIgAgAC8BAEEBajsBACACKAIYQYgTagJ/IAIvAQhBgAJIBEAgAi8BCC0AgFUMAQsgAi8BCEEHdUGAAmotAIBVC0ECdGoiACAALwEAQQFqOwEAIAIgAigCGCgCoC0gAigCGCgCnC1BAWtGNgIMIAIoAhgiACAAKAJ0IAIoAhgoAmBrNgJ0AkACQCACKAIYKAJgIAIoAhgoAoABSw0AIAIoAhgoAnRBA0kNACACKAIYIgAgACgCYEF/ajYCYANAIAIoAhgiACAAKAJsQQFqNgJsIAIoAhggAigCGCgCVCACKAIYKAI4IAIoAhgoAmxBAmpqLQAAIAIoAhgoAkggAigCGCgCWHRzcTYCSCACKAIYKAJAIAIoAhgoAmwgAigCGCgCNHFBAXRqIAIoAhgoAkQgAigCGCgCSEEBdGovAQAiADsBACACIABB//8DcTYCECACKAIYKAJEIAIoAhgoAkhBAXRqIAIoAhgoAmw7AQAgAigCGCIBKAJgQX9qIQAgASAANgJgIAANAAsgAigCGCIAIAAoAmxBAWo2AmwMAQsgAigCGCIAIAIoAhgoAmAgACgCbGo2AmwgAigCGEEANgJgIAIoAhggAigCGCgCOCACKAIYKAJsai0AADYCSCACKAIYIAIoAhgoAlQgAigCGCgCOCACKAIYKAJsQQFqai0AACACKAIYKAJIIAIoAhgoAlh0c3E2AkgLDAELIAIgAigCGCIAKAI4IAAoAmxqLQAAOgAHIAIoAhgiACgCpC0gACgCoC1BAXRqQQA7AQAgAi0AByEBIAIoAhgiACgCmC0hAyAAIAAoAqAtIgBBAWo2AqAtIAAgA2ogAToAACACKAIYIAItAAdBAnRqIgAgAC8BlAFBAWo7AZQBIAIgAigCGCgCoC0gAigCGCgCnC1BAWtGNgIMIAIoAhgiACAAKAJ0QX9qNgJ0IAIoAhgiACAAKAJsQQFqNgJsCyACKAIMBEAgAigCGAJ/IAIoAhgoAlxBAE4EQCACKAIYKAI4IAIoAhgoAlxqDAELQQALIAIoAhgoAmwgAigCGCgCXGtBABApIAIoAhggAigCGCgCbDYCXCACKAIYKAIAEB0gAigCGCgCACgCEEUEQCACQQA2AhwMBAsLDAELCyACKAIYAn8gAigCGCgCbEECSQRAIAIoAhgoAmwMAQtBAgs2ArQtIAIoAhRBBEYEQCACKAIYAn8gAigCGCgCXEEATgRAIAIoAhgoAjggAigCGCgCXGoMAQtBAAsgAigCGCgCbCACKAIYKAJca0EBECkgAigCGCACKAIYKAJsNgJcIAIoAhgoAgAQHSACKAIYKAIAKAIQRQRAIAJBAjYCHAwCCyACQQM2AhwMAQsgAigCGCgCoC0EQCACKAIYAn8gAigCGCgCXEEATgRAIAIoAhgoAjggAigCGCgCXGoMAQtBAAsgAigCGCgCbCACKAIYKAJca0EAECkgAigCGCACKAIYKAJsNgJcIAIoAhgoAgAQHSACKAIYKAIAKAIQRQRAIAJBADYCHAwCCwsgAkEBNgIcCyACKAIcIQAgAkEgaiQAIAALuwwBAn8jAEEwayICJAAgAiAANgIoIAIgATYCJAJAA0ACQCACKAIoKAJ0QYICTQRAIAIoAigQVgJAIAIoAigoAnRBggJLDQAgAigCJA0AIAJBADYCLAwECyACKAIoKAJ0RQ0BCyACKAIoQQA2AmACQCACKAIoKAJ0QQNJDQAgAigCKCgCbEEATQ0AIAIgAigCKCgCOCACKAIoKAJsakF/ajYCGCACIAIoAhgtAAA2AhwgAigCHCEAIAIgAigCGCIBQQFqNgIYAkAgAS0AASAARw0AIAIoAhwhACACIAIoAhgiAUEBajYCGCABLQABIABHDQAgAigCHCEAIAIgAigCGCIBQQFqNgIYIAEtAAEgAEcNACACIAIoAigoAjggAigCKCgCbGpBggJqNgIUA0AgAigCHCEBIAIgAigCGCIDQQFqNgIYAn9BACADLQABIAFHDQAaIAIoAhwhASACIAIoAhgiA0EBajYCGEEAIAMtAAEgAUcNABogAigCHCEBIAIgAigCGCIDQQFqNgIYQQAgAy0AASABRw0AGiACKAIcIQEgAiACKAIYIgNBAWo2AhhBACADLQABIAFHDQAaIAIoAhwhASACIAIoAhgiA0EBajYCGEEAIAMtAAEgAUcNABogAigCHCEBIAIgAigCGCIDQQFqNgIYQQAgAy0AASABRw0AGiACKAIcIQEgAiACKAIYIgNBAWo2AhhBACADLQABIAFHDQAaIAIoAhwhASACIAIoAhgiA0EBajYCGEEAIAMtAAEgAUcNABogAigCGCACKAIUSQtBAXENAAsgAigCKEGCAiACKAIUIAIoAhhrazYCYCACKAIoKAJgIAIoAigoAnRLBEAgAigCKCACKAIoKAJ0NgJgCwsLAkAgAigCKCgCYEEDTwRAIAIgAigCKCgCYEF9ajoAEyACQQE7ARAgAigCKCIAKAKkLSAAKAKgLUEBdGogAi8BEDsBACACLQATIQEgAigCKCIAKAKYLSEDIAAgACgCoC0iAEEBajYCoC0gACADaiABOgAAIAIgAi8BEEF/ajsBECACKAIoIAItABNBgNkAai0AAEECdGpBmAlqIgAgAC8BAEEBajsBACACKAIoQYgTagJ/IAIvARBBgAJIBEAgAi8BEC0AgFUMAQsgAi8BEEEHdUGAAmotAIBVC0ECdGoiACAALwEAQQFqOwEAIAIgAigCKCgCoC0gAigCKCgCnC1BAWtGNgIgIAIoAigiACAAKAJ0IAIoAigoAmBrNgJ0IAIoAigiACACKAIoKAJgIAAoAmxqNgJsIAIoAihBADYCYAwBCyACIAIoAigiACgCOCAAKAJsai0AADoADyACKAIoIgAoAqQtIAAoAqAtQQF0akEAOwEAIAItAA8hASACKAIoIgAoApgtIQMgACAAKAKgLSIAQQFqNgKgLSAAIANqIAE6AAAgAigCKCACLQAPQQJ0aiIAIAAvAZQBQQFqOwGUASACIAIoAigoAqAtIAIoAigoApwtQQFrRjYCICACKAIoIgAgACgCdEF/ajYCdCACKAIoIgAgACgCbEEBajYCbAsgAigCIARAIAIoAigCfyACKAIoKAJcQQBOBEAgAigCKCgCOCACKAIoKAJcagwBC0EACyACKAIoKAJsIAIoAigoAlxrQQAQKSACKAIoIAIoAigoAmw2AlwgAigCKCgCABAdIAIoAigoAgAoAhBFBEAgAkEANgIsDAQLCwwBCwsgAigCKEEANgK0LSACKAIkQQRGBEAgAigCKAJ/IAIoAigoAlxBAE4EQCACKAIoKAI4IAIoAigoAlxqDAELQQALIAIoAigoAmwgAigCKCgCXGtBARApIAIoAiggAigCKCgCbDYCXCACKAIoKAIAEB0gAigCKCgCACgCEEUEQCACQQI2AiwMAgsgAkEDNgIsDAELIAIoAigoAqAtBEAgAigCKAJ/IAIoAigoAlxBAE4EQCACKAIoKAI4IAIoAigoAlxqDAELQQALIAIoAigoAmwgAigCKCgCXGtBABApIAIoAiggAigCKCgCbDYCXCACKAIoKAIAEB0gAigCKCgCACgCEEUEQCACQQA2AiwMAgsLIAJBATYCLAsgAigCLCEAIAJBMGokACAAC8AFAQJ/IwBBIGsiAiQAIAIgADYCGCACIAE2AhQCQANAAkAgAigCGCgCdEUEQCACKAIYEFYgAigCGCgCdEUEQCACKAIURQRAIAJBADYCHAwFCwwCCwsgAigCGEEANgJgIAIgAigCGCIAKAI4IAAoAmxqLQAAOgAPIAIoAhgiACgCpC0gACgCoC1BAXRqQQA7AQAgAi0ADyEBIAIoAhgiACgCmC0hAyAAIAAoAqAtIgBBAWo2AqAtIAAgA2ogAToAACACKAIYIAItAA9BAnRqIgAgAC8BlAFBAWo7AZQBIAIgAigCGCgCoC0gAigCGCgCnC1BAWtGNgIQIAIoAhgiACAAKAJ0QX9qNgJ0IAIoAhgiACAAKAJsQQFqNgJsIAIoAhAEQCACKAIYAn8gAigCGCgCXEEATgRAIAIoAhgoAjggAigCGCgCXGoMAQtBAAsgAigCGCgCbCACKAIYKAJca0EAECkgAigCGCACKAIYKAJsNgJcIAIoAhgoAgAQHSACKAIYKAIAKAIQRQRAIAJBADYCHAwECwsMAQsLIAIoAhhBADYCtC0gAigCFEEERgRAIAIoAhgCfyACKAIYKAJcQQBOBEAgAigCGCgCOCACKAIYKAJcagwBC0EACyACKAIYKAJsIAIoAhgoAlxrQQEQKSACKAIYIAIoAhgoAmw2AlwgAigCGCgCABAdIAIoAhgoAgAoAhBFBEAgAkECNgIcDAILIAJBAzYCHAwBCyACKAIYKAKgLQRAIAIoAhgCfyACKAIYKAJcQQBOBEAgAigCGCgCOCACKAIYKAJcagwBC0EACyACKAIYKAJsIAIoAhgoAlxrQQAQKSACKAIYIAIoAhgoAmw2AlwgAigCGCgCABAdIAIoAhgoAgAoAhBFBEAgAkEANgIcDAILCyACQQE2AhwLIAIoAhwhACACQSBqJAAgAAuuJQEDfyMAQUBqIgIkACACIAA2AjggAiABNgI0AkACQAJAIAIoAjgQdA0AIAIoAjRBBUoNACACKAI0QQBODQELIAJBfjYCPAwBCyACIAIoAjgoAhw2AiwCQAJAIAIoAjgoAgxFDQAgAigCOCgCBARAIAIoAjgoAgBFDQELIAIoAiwoAgRBmgVHDQEgAigCNEEERg0BCyACKAI4QeDUACgCADYCGCACQX42AjwMAQsgAigCOCgCEEUEQCACKAI4QezUACgCADYCGCACQXs2AjwMAQsgAiACKAIsKAIoNgIwIAIoAiwgAigCNDYCKAJAIAIoAiwoAhQEQCACKAI4EB0gAigCOCgCEEUEQCACKAIsQX82AiggAkEANgI8DAMLDAELAkAgAigCOCgCBA0AIAIoAjRBAXRBCUEAIAIoAjRBBEobayACKAIwQQF0QQlBACACKAIwQQRKG2tKDQAgAigCNEEERg0AIAIoAjhB7NQAKAIANgIYIAJBezYCPAwCCwsCQCACKAIsKAIEQZoFRw0AIAIoAjgoAgRFDQAgAigCOEHs1AAoAgA2AhggAkF7NgI8DAELIAIoAiwoAgRBKkYEQCACIAIoAiwoAjBBBHRBiH9qQQh0NgIoAkACQCACKAIsKAKIAUECSARAIAIoAiwoAoQBQQJODQELIAJBADYCJAwBCwJAIAIoAiwoAoQBQQZIBEAgAkEBNgIkDAELAkAgAigCLCgChAFBBkYEQCACQQI2AiQMAQsgAkEDNgIkCwsLIAIgAigCKCACKAIkQQZ0cjYCKCACKAIsKAJsBEAgAiACKAIoQSByNgIoCyACIAIoAihBHyACKAIoQR9wa2o2AiggAigCLCACKAIoEEwgAigCLCgCbARAIAIoAiwgAigCOCgCMEEQdhBMIAIoAiwgAigCOCgCMEH//wNxEEwLQQBBAEEAED4hACACKAI4IAA2AjAgAigCLEHxADYCBCACKAI4EB0gAigCLCgCFARAIAIoAixBfzYCKCACQQA2AjwMAgsLIAIoAiwoAgRBOUYEQEEAQQBBABAbIQAgAigCOCAANgIwIAIoAiwoAgghASACKAIsIgMoAhQhACADIABBAWo2AhQgACABakEfOgAAIAIoAiwoAgghASACKAIsIgMoAhQhACADIABBAWo2AhQgACABakGLAToAACACKAIsKAIIIQEgAigCLCIDKAIUIQAgAyAAQQFqNgIUIAAgAWpBCDoAAAJAIAIoAiwoAhxFBEAgAigCLCgCCCEBIAIoAiwiAygCFCEAIAMgAEEBajYCFCAAIAFqQQA6AAAgAigCLCgCCCEBIAIoAiwiAygCFCEAIAMgAEEBajYCFCAAIAFqQQA6AAAgAigCLCgCCCEBIAIoAiwiAygCFCEAIAMgAEEBajYCFCAAIAFqQQA6AAAgAigCLCgCCCEBIAIoAiwiAygCFCEAIAMgAEEBajYCFCAAIAFqQQA6AAAgAigCLCgCCCEBIAIoAiwiAygCFCEAIAMgAEEBajYCFCAAIAFqQQA6AAACf0ECIAIoAiwoAoQBQQlGDQAaQQEhAEEEQQAgAigCLCgCiAFBAkgEfyACKAIsKAKEAUECSAVBAQtBAXEbCyEAIAIoAiwoAgghAyACKAIsIgQoAhQhASAEIAFBAWo2AhQgASADaiAAOgAAIAIoAiwoAgghASACKAIsIgMoAhQhACADIABBAWo2AhQgACABakEDOgAAIAIoAixB8QA2AgQgAigCOBAdIAIoAiwoAhQEQCACKAIsQX82AiggAkEANgI8DAQLDAELIAIoAiwoAhwoAgBFRUECQQAgAigCLCgCHCgCLBtqQQRBACACKAIsKAIcKAIQG2pBCEEAIAIoAiwoAhwoAhwbakEQQQAgAigCLCgCHCgCJBtqIQEgAigCLCgCCCEDIAIoAiwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AAAgAigCLCgCHCgCBEH/AXEhASACKAIsKAIIIQMgAigCLCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAToAACACKAIsKAIcKAIEQQh2Qf8BcSEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAIAIoAiwoAhwoAgRBEHZB/wFxIQEgAigCLCgCCCEDIAIoAiwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AAAgAigCLCgCHCgCBEEYdiEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAAn9BAiACKAIsKAKEAUEJRg0AGkEBIQBBBEEAIAIoAiwoAogBQQJIBH8gAigCLCgChAFBAkgFQQELQQFxGwshACACKAIsKAIIIQMgAigCLCIEKAIUIQEgBCABQQFqNgIUIAEgA2ogADoAACACKAIsKAIcKAIMQf8BcSEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAIAIoAiwoAhwoAhAEQCACKAIsKAIcKAIUQf8BcSEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAIAIoAiwoAhwoAhRBCHZB/wFxIQEgAigCLCgCCCEDIAIoAiwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AAALIAIoAiwoAhwoAiwEQCACKAI4KAIwIAIoAiwoAgggAigCLCgCFBAbIQAgAigCOCAANgIwCyACKAIsQQA2AiAgAigCLEHFADYCBAsLIAIoAiwoAgRBxQBGBEAgAigCLCgCHCgCEARAIAIgAigCLCgCFDYCICACIAIoAiwoAhwoAhRB//8DcSACKAIsKAIgazYCHANAIAIoAiwoAhQgAigCHGogAigCLCgCDEsEQCACIAIoAiwoAgwgAigCLCgCFGs2AhggAigCLCgCCCACKAIsKAIUaiACKAIsKAIcKAIQIAIoAiwoAiBqIAIoAhgQGhogAigCLCACKAIsKAIMNgIUAkAgAigCLCgCHCgCLEUNACACKAIsKAIUIAIoAiBNDQAgAigCOCgCMCACKAIsKAIIIAIoAiBqIAIoAiwoAhQgAigCIGsQGyEAIAIoAjggADYCMAsgAigCLCIAIAIoAhggACgCIGo2AiAgAigCOBAdIAIoAiwoAhQEQCACKAIsQX82AiggAkEANgI8DAUFIAJBADYCICACIAIoAhwgAigCGGs2AhwMAgsACwsgAigCLCgCCCACKAIsKAIUaiACKAIsKAIcKAIQIAIoAiwoAiBqIAIoAhwQGhogAigCLCIAIAIoAhwgACgCFGo2AhQCQCACKAIsKAIcKAIsRQ0AIAIoAiwoAhQgAigCIE0NACACKAI4KAIwIAIoAiwoAgggAigCIGogAigCLCgCFCACKAIgaxAbIQAgAigCOCAANgIwCyACKAIsQQA2AiALIAIoAixByQA2AgQLIAIoAiwoAgRByQBGBEAgAigCLCgCHCgCHARAIAIgAigCLCgCFDYCFANAIAIoAiwoAhQgAigCLCgCDEYEQAJAIAIoAiwoAhwoAixFDQAgAigCLCgCFCACKAIUTQ0AIAIoAjgoAjAgAigCLCgCCCACKAIUaiACKAIsKAIUIAIoAhRrEBshACACKAI4IAA2AjALIAIoAjgQHSACKAIsKAIUBEAgAigCLEF/NgIoIAJBADYCPAwFCyACQQA2AhQLIAIoAiwoAhwoAhwhASACKAIsIgMoAiAhACADIABBAWo2AiAgAiAAIAFqLQAANgIQIAIoAhAhASACKAIsKAIIIQMgAigCLCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAToAACACKAIQDQALAkAgAigCLCgCHCgCLEUNACACKAIsKAIUIAIoAhRNDQAgAigCOCgCMCACKAIsKAIIIAIoAhRqIAIoAiwoAhQgAigCFGsQGyEAIAIoAjggADYCMAsgAigCLEEANgIgCyACKAIsQdsANgIECyACKAIsKAIEQdsARgRAIAIoAiwoAhwoAiQEQCACIAIoAiwoAhQ2AgwDQCACKAIsKAIUIAIoAiwoAgxGBEACQCACKAIsKAIcKAIsRQ0AIAIoAiwoAhQgAigCDE0NACACKAI4KAIwIAIoAiwoAgggAigCDGogAigCLCgCFCACKAIMaxAbIQAgAigCOCAANgIwCyACKAI4EB0gAigCLCgCFARAIAIoAixBfzYCKCACQQA2AjwMBQsgAkEANgIMCyACKAIsKAIcKAIkIQEgAigCLCIDKAIgIQAgAyAAQQFqNgIgIAIgACABai0AADYCCCACKAIIIQEgAigCLCgCCCEDIAIoAiwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AAAgAigCCA0ACwJAIAIoAiwoAhwoAixFDQAgAigCLCgCFCACKAIMTQ0AIAIoAjgoAjAgAigCLCgCCCACKAIMaiACKAIsKAIUIAIoAgxrEBshACACKAI4IAA2AjALCyACKAIsQecANgIECyACKAIsKAIEQecARgRAIAIoAiwoAhwoAiwEQCACKAIsKAIUQQJqIAIoAiwoAgxLBEAgAigCOBAdIAIoAiwoAhQEQCACKAIsQX82AiggAkEANgI8DAQLCyACKAI4KAIwQf8BcSEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAIAIoAjgoAjBBCHZB/wFxIQEgAigCLCgCCCEDIAIoAiwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AABBAEEAQQAQGyEAIAIoAjggADYCMAsgAigCLEHxADYCBCACKAI4EB0gAigCLCgCFARAIAIoAixBfzYCKCACQQA2AjwMAgsLAkACQCACKAI4KAIEDQAgAigCLCgCdA0AIAIoAjRFDQEgAigCLCgCBEGaBUYNAQsgAgJ/IAIoAiwoAoQBRQRAIAIoAiwgAigCNBCxAQwBCwJ/IAIoAiwoAogBQQJGBEAgAigCLCACKAI0ENoCDAELAn8gAigCLCgCiAFBA0YEQCACKAIsIAIoAjQQ2QIMAQsgAigCLCACKAI0IAIoAiwoAoQBQQxsQbDqAGooAggRAgALCws2AgQCQCACKAIEQQJHBEAgAigCBEEDRw0BCyACKAIsQZoFNgIECwJAIAIoAgQEQCACKAIEQQJHDQELIAIoAjgoAhBFBEAgAigCLEF/NgIoCyACQQA2AjwMAgsgAigCBEEBRgRAAkAgAigCNEEBRgRAIAIoAiwQ6AIMAQsgAigCNEEFRwRAIAIoAixBAEEAQQAQVyACKAI0QQNGBEAgAigCLCgCRCACKAIsKAJMQQFrQQF0akEAOwEAIAIoAiwoAkRBACACKAIsKAJMQQFrQQF0EDMgAigCLCgCdEUEQCACKAIsQQA2AmwgAigCLEEANgJcIAIoAixBADYCtC0LCwsLIAIoAjgQHSACKAI4KAIQRQRAIAIoAixBfzYCKCACQQA2AjwMAwsLCyACKAI0QQRHBEAgAkEANgI8DAELIAIoAiwoAhhBAEwEQCACQQE2AjwMAQsCQCACKAIsKAIYQQJGBEAgAigCOCgCMEH/AXEhASACKAIsKAIIIQMgAigCLCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAToAACACKAI4KAIwQQh2Qf8BcSEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAIAIoAjgoAjBBEHZB/wFxIQEgAigCLCgCCCEDIAIoAiwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AAAgAigCOCgCMEEYdiEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAIAIoAjgoAghB/wFxIQEgAigCLCgCCCEDIAIoAiwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AAAgAigCOCgCCEEIdkH/AXEhASACKAIsKAIIIQMgAigCLCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAToAACACKAI4KAIIQRB2Qf8BcSEBIAIoAiwoAgghAyACKAIsIgQoAhQhACAEIABBAWo2AhQgACADaiABOgAAIAIoAjgoAghBGHYhASACKAIsKAIIIQMgAigCLCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAToAAAwBCyACKAIsIAIoAjgoAjBBEHYQTCACKAIsIAIoAjgoAjBB//8DcRBMCyACKAI4EB0gAigCLCgCGEEASgRAIAIoAixBACACKAIsKAIYazYCGAsgAiACKAIsKAIURTYCPAsgAigCPCEAIAJBQGskACAAC44CAQF/IwBBIGsiASAANgIcIAEgASgCHCgCLDYCDCABIAEoAhwoAkw2AhggASABKAIcKAJEIAEoAhhBAXRqNgIQA0AgASABKAIQQX5qIgA2AhAgASAALwEANgIUIAEoAhACfyABKAIUIAEoAgxPBEAgASgCFCABKAIMawwBC0EACzsBACABIAEoAhhBf2oiADYCGCAADQALIAEgASgCDDYCGCABIAEoAhwoAkAgASgCGEEBdGo2AhADQCABIAEoAhBBfmoiADYCECABIAAvAQA2AhQgASgCEAJ/IAEoAhQgASgCDE8EQCABKAIUIAEoAgxrDAELQQALOwEAIAEgASgCGEF/aiIANgIYIAANAAsLRQBBoJwBQgA3AwBBmJwBQgA3AwBBkJwBQgA3AwBBiJwBQgA3AwBBgJwBQgA3AwBB+JsBQgA3AwBB8JsBQgA3AwBB8JsBC6gCAQF/IwBBEGsiASQAIAEgADYCDCABKAIMIAEoAgwoAixBAXQ2AjwgASgCDCgCRCABKAIMKAJMQQFrQQF0akEAOwEAIAEoAgwoAkRBACABKAIMKAJMQQFrQQF0EDMgASgCDCABKAIMKAKEAUEMbEGw6gBqLwECNgKAASABKAIMIAEoAgwoAoQBQQxsQbDqAGovAQA2AowBIAEoAgwgASgCDCgChAFBDGxBsOoAai8BBDYCkAEgASgCDCABKAIMKAKEAUEMbEGw6gBqLwEGNgJ8IAEoAgxBADYCbCABKAIMQQA2AlwgASgCDEEANgJ0IAEoAgxBADYCtC0gASgCDEECNgJ4IAEoAgxBAjYCYCABKAIMQQA2AmggASgCDEEANgJIIAFBEGokAAubAgEBfyMAQRBrIgEkACABIAA2AggCQCABKAIIEHQEQCABQX42AgwMAQsgASgCCEEANgIUIAEoAghBADYCCCABKAIIQQA2AhggASgCCEECNgIsIAEgASgCCCgCHDYCBCABKAIEQQA2AhQgASgCBCABKAIEKAIINgIQIAEoAgQoAhhBAEgEQCABKAIEQQAgASgCBCgCGGs2AhgLIAEoAgQCf0E5IAEoAgQoAhhBAkYNABpBKkHxACABKAIEKAIYGws2AgQCfyABKAIEKAIYQQJGBEBBAEEAQQAQGwwBC0EAQQBBABA+CyEAIAEoAgggADYCMCABKAIEQQA2AiggASgCBBDqAiABQQA2AgwLIAEoAgwhACABQRBqJAAgAAtFAQF/IwBBEGsiASQAIAEgADYCDCABIAEoAgwQ3wI2AgggASgCCEUEQCABKAIMKAIcEN4CCyABKAIIIQAgAUEQaiQAIAAL4AgBAX8jAEEwayICJAAgAiAANgIoIAIgATYCJCACQQg2AiAgAkFxNgIcIAJBCTYCGCACQQA2AhQgAkGQgwE2AhAgAkE4NgIMIAJBATYCBAJAAkACQCACKAIQRQ0AIAIoAhAsAABBqOoALAAARw0AIAIoAgxBOEYNAQsgAkF6NgIsDAELIAIoAihFBEAgAkF+NgIsDAELIAIoAihBADYCGCACKAIoKAIgRQRAIAIoAihBBTYCICACKAIoQQA2AigLIAIoAigoAiRFBEAgAigCKEEGNgIkCyACKAIkQX9GBEAgAkEGNgIkCwJAIAIoAhxBAEgEQCACQQA2AgQgAkEAIAIoAhxrNgIcDAELIAIoAhxBD0oEQCACQQI2AgQgAiACKAIcQRBrNgIcCwsCQAJAIAIoAhhBAUgNACACKAIYQQlKDQAgAigCIEEIRw0AIAIoAhxBCEgNACACKAIcQQ9KDQAgAigCJEEASA0AIAIoAiRBCUoNACACKAIUQQBIDQAgAigCFEEESg0AIAIoAhxBCEcNASACKAIEQQFGDQELIAJBfjYCLAwBCyACKAIcQQhGBEAgAkEJNgIcCyACIAIoAigoAihBAUHELSACKAIoKAIgEQEANgIIIAIoAghFBEAgAkF8NgIsDAELIAIoAiggAigCCDYCHCACKAIIIAIoAig2AgAgAigCCEEqNgIEIAIoAgggAigCBDYCGCACKAIIQQA2AhwgAigCCCACKAIcNgIwIAIoAghBASACKAIIKAIwdDYCLCACKAIIIAIoAggoAixBAWs2AjQgAigCCCACKAIYQQdqNgJQIAIoAghBASACKAIIKAJQdDYCTCACKAIIIAIoAggoAkxBAWs2AlQgAigCCCACKAIIKAJQQQJqQQNuNgJYIAIoAigoAiggAigCCCgCLEECIAIoAigoAiARAQAhACACKAIIIAA2AjggAigCKCgCKCACKAIIKAIsQQIgAigCKCgCIBEBACEAIAIoAgggADYCQCACKAIoKAIoIAIoAggoAkxBAiACKAIoKAIgEQEAIQAgAigCCCAANgJEIAIoAghBADYCwC0gAigCCEEBIAIoAhhBBmp0NgKcLSACIAIoAigoAiggAigCCCgCnC1BBCACKAIoKAIgEQEANgIAIAIoAgggAigCADYCCCACKAIIIAIoAggoApwtQQJ0NgIMAkACQCACKAIIKAI4RQ0AIAIoAggoAkBFDQAgAigCCCgCREUNACACKAIIKAIIDQELIAIoAghBmgU2AgQgAigCKEHo1AAoAgA2AhggAigCKBCyARogAkF8NgIsDAELIAIoAgggAigCACACKAIIKAKcLUEBdkEBdGo2AqQtIAIoAgggAigCCCgCCCACKAIIKAKcLUEDbGo2ApgtIAIoAgggAigCJDYChAEgAigCCCACKAIUNgKIASACKAIIIAIoAiA6ACQgAiACKAIoEOACNgIsCyACKAIsIQAgAkEwaiQAIAALbAEBfyMAQRBrIgIgADYCDCACIAE2AgggAkEANgIEA0AgAiACKAIEIAIoAgxBAXFyNgIEIAIgAigCDEEBdjYCDCACIAIoAgRBAXQ2AgQgAiACKAIIQX9qIgA2AgggAEEASg0ACyACKAIEQQF2C5UCAQF/IwBBQGoiAyQAIAMgADYCPCADIAE2AjggAyACNgI0IANBADYCDCADQQE2AggDQCADKAIIQQ9KRQRAIAMgAygCDCADKAI0IAMoAghBAWtBAXRqLwEAakEBdDYCDCADQRBqIAMoAghBAXRqIAMoAgw7AQAgAyADKAIIQQFqNgIIDAELCyADQQA2AgQDQCADKAIEIAMoAjhMBEAgAyADKAI8IAMoAgRBAnRqLwECNgIAIAMoAgAEQCADQRBqIAMoAgBBAXRqIgEvAQAhACABIABBAWo7AQAgAEH//wNxIAMoAgAQ4gIhACADKAI8IAMoAgRBAnRqIAA7AQALIAMgAygCBEEBajYCBAwBCwsgA0FAayQAC4gIAQF/IwBBQGoiAiAANgI8IAIgATYCOCACIAIoAjgoAgA2AjQgAiACKAI4KAIENgIwIAIgAigCOCgCCCgCADYCLCACIAIoAjgoAggoAgQ2AiggAiACKAI4KAIIKAIINgIkIAIgAigCOCgCCCgCEDYCICACQQA2AgQgAkEANgIQA0AgAigCEEEPSkUEQCACKAI8QbwWaiACKAIQQQF0akEAOwEAIAIgAigCEEEBajYCEAwBCwsgAigCNCACKAI8QdwWaiACKAI8KALUKEECdGooAgBBAnRqQQA7AQIgAiACKAI8KALUKEEBajYCHANAIAIoAhxBvQRIBEAgAiACKAI8QdwWaiACKAIcQQJ0aigCADYCGCACIAIoAjQgAigCNCACKAIYQQJ0ai8BAkECdGovAQJBAWo2AhAgAigCECACKAIgSgRAIAIgAigCIDYCECACIAIoAgRBAWo2AgQLIAIoAjQgAigCGEECdGogAigCEDsBAiACKAIYIAIoAjBMBEAgAigCPCACKAIQQQF0akG8FmoiACAALwEAQQFqOwEAIAJBADYCDCACKAIYIAIoAiROBEAgAiACKAIoIAIoAhggAigCJGtBAnRqKAIANgIMCyACIAIoAjQgAigCGEECdGovAQA7AQogAigCPCIAIAAoAqgtIAIvAQogAigCECACKAIMamxqNgKoLSACKAIsBEAgAigCPCIAIAAoAqwtIAIvAQogAigCLCACKAIYQQJ0ai8BAiACKAIMamxqNgKsLQsLIAIgAigCHEEBajYCHAwBCwsCQCACKAIERQ0AA0AgAiACKAIgQQFrNgIQA0AgAigCPEG8FmogAigCEEEBdGovAQBFBEAgAiACKAIQQX9qNgIQDAELCyACKAI8IAIoAhBBAXRqQbwWaiIAIAAvAQBBf2o7AQAgAigCPCACKAIQQQF0akG+FmoiACAALwEAQQJqOwEAIAIoAjwgAigCIEEBdGpBvBZqIgAgAC8BAEF/ajsBACACIAIoAgRBAms2AgQgAigCBEEASg0ACyACIAIoAiA2AhADQCACKAIQRQ0BIAIgAigCPEG8FmogAigCEEEBdGovAQA2AhgDQCACKAIYBEAgAigCPEHcFmohACACIAIoAhxBf2oiATYCHCACIAFBAnQgAGooAgA2AhQgAigCFCACKAIwSg0BIAIoAjQgAigCFEECdGovAQIgAigCEEcEQCACKAI8IgAgACgCqC0gAigCNCACKAIUQQJ0ai8BACACKAIQIAIoAjQgAigCFEECdGovAQJrbGo2AqgtIAIoAjQgAigCFEECdGogAigCEDsBAgsgAiACKAIYQX9qNgIYDAELCyACIAIoAhBBf2o2AhAMAAALAAsLpQsBAX8jAEFAaiIEJAAgBCAANgI8IAQgATYCOCAEIAI2AjQgBCADNgIwIARBBTYCKAJAIAQoAjwoArwtQRAgBCgCKGtKBEAgBCAEKAI4QYECazYCJCAEKAI8IgAgAC8BuC0gBCgCJEH//wNxIAQoAjwoArwtdHI7AbgtIAQoAjwvAbgtQf8BcSEBIAQoAjwoAgghAiAEKAI8IgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAjwvAbgtQQh1IQEgBCgCPCgCCCECIAQoAjwiAygCFCEAIAMgAEEBajYCFCAAIAJqIAE6AAAgBCgCPCAEKAIkQf//A3FBECAEKAI8KAK8LWt1OwG4LSAEKAI8IgAgACgCvC0gBCgCKEEQa2o2ArwtDAELIAQoAjwiACAALwG4LSAEKAI4QYECa0H//wNxIAQoAjwoArwtdHI7AbgtIAQoAjwiACAEKAIoIAAoArwtajYCvC0LIARBBTYCIAJAIAQoAjwoArwtQRAgBCgCIGtKBEAgBCAEKAI0QQFrNgIcIAQoAjwiACAALwG4LSAEKAIcQf//A3EgBCgCPCgCvC10cjsBuC0gBCgCPC8BuC1B/wFxIQEgBCgCPCgCCCECIAQoAjwiAygCFCEAIAMgAEEBajYCFCAAIAJqIAE6AAAgBCgCPC8BuC1BCHUhASAEKAI8KAIIIQIgBCgCPCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAI8IAQoAhxB//8DcUEQIAQoAjwoArwta3U7AbgtIAQoAjwiACAAKAK8LSAEKAIgQRBrajYCvC0MAQsgBCgCPCIAIAAvAbgtIAQoAjRBAWtB//8DcSAEKAI8KAK8LXRyOwG4LSAEKAI8IgAgBCgCICAAKAK8LWo2ArwtCyAEQQQ2AhgCQCAEKAI8KAK8LUEQIAQoAhhrSgRAIAQgBCgCMEEEazYCFCAEKAI8IgAgAC8BuC0gBCgCFEH//wNxIAQoAjwoArwtdHI7AbgtIAQoAjwvAbgtQf8BcSEBIAQoAjwoAgghAiAEKAI8IgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAjwvAbgtQQh1IQEgBCgCPCgCCCECIAQoAjwiAygCFCEAIAMgAEEBajYCFCAAIAJqIAE6AAAgBCgCPCAEKAIUQf//A3FBECAEKAI8KAK8LWt1OwG4LSAEKAI8IgAgACgCvC0gBCgCGEEQa2o2ArwtDAELIAQoAjwiACAALwG4LSAEKAIwQQRrQf//A3EgBCgCPCgCvC10cjsBuC0gBCgCPCIAIAQoAhggACgCvC1qNgK8LQsgBEEANgIsA0AgBCgCLCAEKAIwTkUEQCAEQQM2AhACQCAEKAI8KAK8LUEQIAQoAhBrSgRAIAQgBCgCPEH8FGogBCgCLC0AkGhBAnRqLwECNgIMIAQoAjwiACAALwG4LSAEKAIMQf//A3EgBCgCPCgCvC10cjsBuC0gBCgCPC8BuC1B/wFxIQEgBCgCPCgCCCECIAQoAjwiAygCFCEAIAMgAEEBajYCFCAAIAJqIAE6AAAgBCgCPC8BuC1BCHUhASAEKAI8KAIIIQIgBCgCPCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAI8IAQoAgxB//8DcUEQIAQoAjwoArwta3U7AbgtIAQoAjwiACAAKAK8LSAEKAIQQRBrajYCvC0MAQsgBCgCPCIAIAAvAbgtIAQoAjxB/BRqIAQoAiwtAJBoQQJ0ai8BAiAEKAI8KAK8LXRyOwG4LSAEKAI8IgAgBCgCECAAKAK8LWo2ArwtCyAEIAQoAixBAWo2AiwMAQsLIAQoAjwgBCgCPEGUAWogBCgCOEEBaxCzASAEKAI8IAQoAjxBiBNqIAQoAjRBAWsQswEgBEFAayQAC8YBAQF/IwBBEGsiASQAIAEgADYCDCABKAIMIAEoAgxBlAFqIAEoAgwoApwWELQBIAEoAgwgASgCDEGIE2ogASgCDCgCqBYQtAEgASgCDCABKAIMQbAWahB2IAFBEjYCCANAAkAgASgCCEEDSA0AIAEoAgxB/BRqIAEoAggtAJBoQQJ0ai8BAg0AIAEgASgCCEF/ajYCCAwBCwsgASgCDCIAIAAoAqgtIAEoAghBA2xBEWpqNgKoLSABKAIIIQAgAUEQaiQAIAALgwIBAX8jAEEQayIBIAA2AgggAUH/gP+ffzYCBCABQQA2AgACQANAIAEoAgBBH0wEQAJAIAEoAgRBAXFFDQAgASgCCEGUAWogASgCAEECdGovAQBFDQAgAUEANgIMDAMLIAEgASgCAEEBajYCACABIAEoAgRBAXY2AgQMAQsLAkACQCABKAIILwG4AQ0AIAEoAggvAbwBDQAgASgCCC8ByAFFDQELIAFBATYCDAwBCyABQSA2AgADQCABKAIAQYACSARAIAEoAghBlAFqIAEoAgBBAnRqLwEABEAgAUEBNgIMDAMFIAEgASgCAEEBajYCAAwCCwALCyABQQA2AgwLIAEoAgwLjgUBBH8jAEEgayIBJAAgASAANgIcIAFBAzYCGAJAIAEoAhwoArwtQRAgASgCGGtKBEAgAUECNgIUIAEoAhwiACAALwG4LSABKAIUQf//A3EgASgCHCgCvC10cjsBuC0gASgCHC8BuC1B/wFxIQIgASgCHCgCCCEDIAEoAhwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAI6AAAgASgCHC8BuC1BCHUhAiABKAIcKAIIIQMgASgCHCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAjoAACABKAIcIAEoAhRB//8DcUEQIAEoAhwoArwta3U7AbgtIAEoAhwiACAAKAK8LSABKAIYQRBrajYCvC0MAQsgASgCHCIAIAAvAbgtQQIgASgCHCgCvC10cjsBuC0gASgCHCIAIAEoAhggACgCvC1qNgK8LQsgAUHC4wAvAQA2AhACQCABKAIcKAK8LUEQIAEoAhBrSgRAIAFBwOMALwEANgIMIAEoAhwiACAALwG4LSABKAIMQf//A3EgASgCHCgCvC10cjsBuC0gASgCHC8BuC1B/wFxIQIgASgCHCgCCCEDIAEoAhwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAI6AAAgASgCHC8BuC1BCHUhAiABKAIcKAIIIQMgASgCHCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAjoAACABKAIcIAEoAgxB//8DcUEQIAEoAhwoArwta3U7AbgtIAEoAhwiACAAKAK8LSABKAIQQRBrajYCvC0MAQsgASgCHCIAIAAvAbgtQcDjAC8BACABKAIcKAK8LXRyOwG4LSABKAIcIgAgASgCECAAKAK8LWo2ArwtCyABKAIcELcBIAFBIGokAAsjAQF/IwBBEGsiASQAIAEgADYCDCABKAIMELcBIAFBEGokAAuWAQEBfyMAQRBrIgEkACABIAA2AgwgASgCDCABKAIMQZQBajYCmBYgASgCDEGA2wA2AqAWIAEoAgwgASgCDEGIE2o2AqQWIAEoAgxBlNsANgKsFiABKAIMIAEoAgxB/BRqNgKwFiABKAIMQajbADYCuBYgASgCDEEAOwG4LSABKAIMQQA2ArwtIAEoAgwQuQEgAUEQaiQAC9cNAQF/IwBBIGsiAyAANgIYIAMgATYCFCADIAI2AhAgAyADKAIYQRB2NgIMIAMgAygCGEH//wNxNgIYAkAgAygCEEEBRgRAIAMgAygCFC0AACADKAIYajYCGCADKAIYQfH/A08EQCADIAMoAhhB8f8DazYCGAsgAyADKAIYIAMoAgxqNgIMIAMoAgxB8f8DTwRAIAMgAygCDEHx/wNrNgIMCyADIAMoAhggAygCDEEQdHI2AhwMAQsgAygCFEUEQCADQQE2AhwMAQsgAygCEEEQSQRAA0AgAyADKAIQIgBBf2o2AhAgAARAIAMgAygCFCIAQQFqNgIUIAMgAC0AACADKAIYajYCGCADIAMoAhggAygCDGo2AgwMAQsLIAMoAhhB8f8DTwRAIAMgAygCGEHx/wNrNgIYCyADIAMoAgxB8f8DcDYCDCADIAMoAhggAygCDEEQdHI2AhwMAQsDQCADKAIQQbArSUUEQCADIAMoAhBBsCtrNgIQIANB2wI2AggDQCADIAMoAhQtAAAgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0AASADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQACIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAMgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0ABCADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQAFIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAYgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0AByADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQAIIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAkgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0ACiADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQALIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAwgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0ADSADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQAOIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAA8gAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFEEQajYCFCADIAMoAghBf2oiADYCCCAADQALIAMgAygCGEHx/wNwNgIYIAMgAygCDEHx/wNwNgIMDAELCyADKAIQBEADQCADKAIQQRBJRQRAIAMgAygCEEEQazYCECADIAMoAhQtAAAgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0AASADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQACIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAMgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0ABCADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQAFIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAYgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0AByADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQAIIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAkgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0ACiADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQALIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAAwgAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFC0ADSADKAIYajYCGCADIAMoAhggAygCDGo2AgwgAyADKAIULQAOIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDCADIAMoAhQtAA8gAygCGGo2AhggAyADKAIYIAMoAgxqNgIMIAMgAygCFEEQajYCFAwBCwsDQCADIAMoAhAiAEF/ajYCECAABEAgAyADKAIUIgBBAWo2AhQgAyAALQAAIAMoAhhqNgIYIAMgAygCGCADKAIMajYCDAwBCwsgAyADKAIYQfH/A3A2AhggAyADKAIMQfH/A3A2AgwLIAMgAygCGCADKAIMQRB0cjYCHAsgAygCHAspAQF/IwBBEGsiAiQAIAIgADYCDCACIAE2AgggAigCCBAWIAJBEGokAAs6AQF/IwBBEGsiAyQAIAMgADYCDCADIAE2AgggAyACNgIEIAMoAgggAygCBGwQGSEAIANBEGokACAAC70HAQl/IAAoAgQiB0EDcSECIAAgB0F4cSIGaiEEAkBByJwBKAIAIgUgAEsNACACQQFGDQALAkAgAkUEQEEAIQIgAUGAAkkNASAGIAFBBGpPBEAgACECIAYgAWtBmKABKAIAQQF0TQ0CC0EADwsCQCAGIAFPBEAgBiABayICQRBJDQEgACAHQQFxIAFyQQJyNgIEIAAgAWoiASACQQNyNgIEIAQgBCgCBEEBcjYCBCABIAIQtgEMAQtBACECIARB0JwBKAIARgRAQcScASgCACAGaiIFIAFNDQIgACAHQQFxIAFyQQJyNgIEIAAgAWoiAiAFIAFrIgFBAXI2AgRBxJwBIAE2AgBB0JwBIAI2AgAMAQsgBEHMnAEoAgBGBEBBwJwBKAIAIAZqIgUgAUkNAgJAIAUgAWsiAkEQTwRAIAAgB0EBcSABckECcjYCBCAAIAFqIgEgAkEBcjYCBCAAIAVqIgUgAjYCACAFIAUoAgRBfnE2AgQMAQsgACAHQQFxIAVyQQJyNgIEIAAgBWoiASABKAIEQQFyNgIEQQAhAkEAIQELQcycASABNgIAQcCcASACNgIADAELIAQoAgQiA0ECcQ0BIANBeHEgBmoiCSABSQ0BIAkgAWshCgJAIANB/wFNBEAgBCgCCCIGIANBA3YiBUEDdEHgnAFqRxogBiAEKAIMIghGBEBBuJwBQbicASgCAEF+IAV3cTYCAAwCCyAGIAg2AgwgCCAGNgIIDAELIAQoAhghCAJAIAQgBCgCDCIDRwRAIAUgBCgCCCICTQRAIAIoAgwaCyACIAM2AgwgAyACNgIIDAELAkAgBEEUaiICKAIAIgYNACAEQRBqIgIoAgAiBg0AQQAhAwwBCwNAIAIhBSAGIgNBFGoiAigCACIGDQAgA0EQaiECIAMoAhAiBg0ACyAFQQA2AgALIAhFDQACQCAEIAQoAhwiBUECdEHongFqIgIoAgBGBEAgAiADNgIAIAMNAUG8nAFBvJwBKAIAQX4gBXdxNgIADAILIAhBEEEUIAgoAhAgBEYbaiADNgIAIANFDQELIAMgCDYCGCAEKAIQIgIEQCADIAI2AhAgAiADNgIYCyAEKAIUIgJFDQAgAyACNgIUIAIgAzYCGAsgCkEPTQRAIAAgB0EBcSAJckECcjYCBCAAIAlqIgEgASgCBEEBcjYCBAwBCyAAIAdBAXEgAXJBAnI2AgQgACABaiICIApBA3I2AgQgACAJaiIBIAEoAgRBAXI2AgQgAiAKELYBCyAAIQILIAILhAICAX8BfiMAQeAAayICJAAgAiAANgJYIAIgATYCVCACIAIoAlggAkHIAGpCDBAvIgM3AwgCQCADQgBTBEAgAigCVCACKAJYEBggAkF/NgJcDAELIAIpAwhCDFIEQCACKAJUQRFBABAVIAJBfzYCXAwBCyACKAJUIAJByABqIgAgAEIMQQAQeCACKAJYIAJBEGoQOUEASARAIAJBADYCXAwBCyACKAI4IAJBBmogAkEEahDDAQJAIAItAFMgAigCPEEYdkYNACACLQBTIAIvAQZBCHVGDQAgAigCVEEbQQAQFSACQX82AlwMAQsgAkEANgJcCyACKAJcIQAgAkHgAGokACAAC8oDAQF/IwBB0ABrIgUkACAFIAA2AkQgBSABNgJAIAUgAjYCPCAFIAM3AzAgBSAENgIsIAUgBSgCQDYCKAJAAkACQAJAAkACQAJAAkACQCAFKAIsDg8AAQIDBQYHBwcHBwcHBwQHCyAFKAJEIAUoAigQ7wJBAEgEQCAFQn83A0gMCAsgBUIANwNIDAcLIAUgBSgCRCAFKAI8IAUpAzAQLyIDNwMgIANCAFMEQCAFKAIoIAUoAkQQGCAFQn83A0gMBwsgBSgCQCAFKAI8IAUoAjwgBSkDIEEAEHggBSAFKQMgNwNIDAYLIAVCADcDSAwFCyAFIAUoAjw2AhwgBSgCHEEAOwEyIAUoAhwiACAAKQMAQoABhDcDACAFKAIcKQMAQgiDQgBSBEAgBSgCHCIAIAApAyBCDH03AyALIAVCADcDSAwECyAFQX82AhQgBUEFNgIQIAVBBDYCDCAFQQM2AgggBUECNgIEIAVBATYCACAFQQAgBRA3NwNIDAMLIAUgBSgCKCAFKAI8IAUpAzAQQjcDSAwCCyAFKAIoELoBIAVCADcDSAwBCyAFKAIoQRJBABAVIAVCfzcDSAsgBSkDSCEDIAVB0ABqJAAgAwvuAgEBfyMAQSBrIgUkACAFIAA2AhggBSABNgIUIAUgAjsBEiAFIAM2AgwgBSAENgIIAkACQAJAIAUoAghFDQAgBSgCFEUNACAFLwESQQFGDQELIAUoAhhBCGpBEkEAEBUgBUEANgIcDAELIAUoAgxBAXEEQCAFKAIYQQhqQRhBABAVIAVBADYCHAwBCyAFQRgQGSIANgIEIABFBEAgBSgCGEEIakEOQQAQFSAFQQA2AhwMAQsjAEEQayIAIAUoAgQ2AgwgACgCDEEANgIAIAAoAgxBADYCBCAAKAIMQQA2AgggBSgCBEH4rNGRATYCDCAFKAIEQYnPlZoCNgIQIAUoAgRBkPHZogM2AhQgBSgCBEEAIAUoAgggBSgCCBAsrUEBEHggBSAFKAIYIAUoAhRBAyAFKAIEEGQiADYCACAARQRAIAUoAgQQugEgBUEANgIcDAELIAUgBSgCADYCHAsgBSgCHCEAIAVBIGokACAAC+gGAQF/IwBB4ABrIgQkACAEIAA2AlQgBCABNgJQIAQgAjcDSCAEIAM2AkQCQCAEKAJUKQM4IAQpA0h8QoCABHxCAX0gBCkDSFQEQCAEKAJEQRJBABAVIARCfzcDWAwBCyAEIAQoAlQoAgQgBCgCVCkDCKdBA3RqKQMANwMgIAQoAlQpAzggBCkDSHwgBCkDIFYEQCAEIAQoAlQpAwggBCkDSCAEKQMgIAQoAlQpAzh9fUKAgAR8QgF9QhCIfDcDGCAEKQMYIAQoAlQpAxBWBEAgBCAEKAJUKQMQNwMQIAQpAxBQBEAgBEIQNwMQCwNAIAQpAxAgBCkDGFpFBEAgBCAEKQMQQgGGNwMQDAELCyAEKAJUIAQpAxAgBCgCRBC9AUEBcUUEQCAEKAJEQQ5BABAVIARCfzcDWAwDCwsDQCAEKAJUKQMIIAQpAxhUBEBBgIAEEBkhACAEKAJUKAIAIAQoAlQpAwinQQR0aiAANgIAIAAEQCAEKAJUKAIAIAQoAlQpAwinQQR0akKAgAQ3AwggBCgCVCIAIAApAwhCAXw3AwggBCAEKQMgQoCABHw3AyAgBCgCVCgCBCAEKAJUKQMIp0EDdGogBCkDIDcDAAwCBSAEKAJEQQ5BABAVIARCfzcDWAwECwALCwsgBCAEKAJUKQNANwMwIAQgBCgCVCkDOCAEKAJUKAIEIAQpAzCnQQN0aikDAH03AyggBEIANwM4A0AgBCkDOCAEKQNIVARAIAQCfiAEKQNIIAQpAzh9IAQoAlQoAgAgBCkDMKdBBHRqKQMIIAQpAyh9VARAIAQpA0ggBCkDOH0MAQsgBCgCVCgCACAEKQMwp0EEdGopAwggBCkDKH0LNwMIIAQoAlQoAgAgBCkDMKdBBHRqKAIAIAQpAyinaiAEKAJQIAQpAzinaiAEKQMIpxAaGiAEKQMIIAQoAlQoAgAgBCkDMKdBBHRqKQMIIAQpAyh9UQRAIAQgBCkDMEIBfDcDMAsgBCAEKQMIIAQpAzh8NwM4IARCADcDKAwBCwsgBCgCVCIAIAQpAzggACkDOHw3AzggBCgCVCAEKQMwNwNAIAQoAlQpAzggBCgCVCkDMFYEQCAEKAJUIAQoAlQpAzg3AzALIAQgBCkDODcDWAsgBCkDWCECIARB4ABqJAAgAgvnAwEBfyMAQUBqIgMkACADIAA2AjQgAyABNgIwIAMgAjcDKCADAn4gAykDKCADKAI0KQMwIAMoAjQpAzh9VARAIAMpAygMAQsgAygCNCkDMCADKAI0KQM4fQs3AygCQCADKQMoUARAIANCADcDOAwBCyADKQMoQv///////////wBWBEAgA0J/NwM4DAELIAMgAygCNCkDQDcDGCADIAMoAjQpAzggAygCNCgCBCADKQMYp0EDdGopAwB9NwMQIANCADcDIANAIAMpAyAgAykDKFQEQCADAn4gAykDKCADKQMgfSADKAI0KAIAIAMpAxinQQR0aikDCCADKQMQfVQEQCADKQMoIAMpAyB9DAELIAMoAjQoAgAgAykDGKdBBHRqKQMIIAMpAxB9CzcDCCADKAIwIAMpAyCnaiADKAI0KAIAIAMpAxinQQR0aigCACADKQMQp2ogAykDCKcQGhogAykDCCADKAI0KAIAIAMpAxinQQR0aikDCCADKQMQfVEEQCADIAMpAxhCAXw3AxgLIAMgAykDCCADKQMgfDcDICADQgA3AxAMAQsLIAMoAjQiACADKQMgIAApAzh8NwM4IAMoAjQgAykDGDcDQCADIAMpAyA3AzgLIAMpAzghAiADQUBrJAAgAguuBAEBfyMAQUBqIgMkACADIAA2AjggAyABNwMwIAMgAjYCLAJAIAMpAzBQBEAgA0EAQgBBASADKAIsEE42AjwMAQsgAykDMCADKAI4KQMwVgRAIAMoAixBEkEAEBUgA0EANgI8DAELIAMoAjgoAigEQCADKAIsQR1BABAVIANBADYCPAwBCyADIAMoAjggAykDMBC7ATcDICADIAMpAzAgAygCOCgCBCADKQMgp0EDdGopAwB9NwMYIAMpAxhQBEAgAyADKQMgQn98NwMgIAMgAygCOCgCACADKQMgp0EEdGopAwg3AxgLIAMgAygCOCgCACADKQMgp0EEdGopAwggAykDGH03AxAgAykDECADKQMwVgRAIAMoAixBHEEAEBUgA0EANgI8DAELIAMgAygCOCgCACADKQMgQgF8QQAgAygCLBBOIgA2AgwgAEUEQCADQQA2AjwMAQsgAygCDCgCACADKAIMKQMIQgF9p0EEdGogAykDGDcDCCADKAIMKAIEIAMoAgwpAwinQQN0aiADKQMwNwMAIAMoAgwgAykDMDcDMCADKAIMAn4gAygCOCkDGCADKAIMKQMIQgF9VARAIAMoAjgpAxgMAQsgAygCDCkDCEIBfQs3AxggAygCOCADKAIMNgIoIAMoAgwgAygCODYCKCADKAI4IAMoAgwpAwg3AyAgAygCDCADKQMgQgF8NwMgIAMgAygCDDYCPAsgAygCPCEAIANBQGskACAAC8gJAQF/IwBB8ABrIgQkACAEIAA2AmQgBCABNgJgIAQgAjcDWCAEIAM2AlQgBCAEKAJkNgJQAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAEKAJUDhQGBwIMBAUKDwADCRELEA4IEgESDRILQQBCAEEAIAQoAlAQTiEAIAQoAlAgADYCFCAARQRAIARCfzcDaAwTCyAEKAJQKAIUQgA3AzggBCgCUCgCFEIANwNAIARCADcDaAwSCyAEKAJQKAIQIAQpA1ggBCgCUBD0AiEAIAQoAlAgADYCFCAARQRAIARCfzcDaAwSCyAEKAJQKAIUIAQpA1g3AzggBCgCUCgCFCAEKAJQKAIUKQMINwNAIARCADcDaAwRCyAEQgA3A2gMEAsgBCgCUCgCEBA0IAQoAlAgBCgCUCgCFDYCECAEKAJQQQA2AhQgBEIANwNoDA8LIAQgBCgCUCAEKAJgIAQpA1gQQjcDaAwOCyAEKAJQKAIQEDQgBCgCUCgCFBA0IAQoAlAQFiAEQgA3A2gMDQsgBCgCUCgCEEIANwM4IAQoAlAoAhBCADcDQCAEQgA3A2gMDAsgBCkDWEL///////////8AVgRAIAQoAlBBEkEAEBUgBEJ/NwNoDAwLIAQgBCgCUCgCECAEKAJgIAQpA1gQ8wI3A2gMCwsgBEEAQgBBACAEKAJQEE42AkwgBCgCTEUEQCAEQn83A2gMCwsgBCgCUCgCEBA0IAQoAlAgBCgCTDYCECAEQgA3A2gMCgsgBCgCUCgCFBA0IAQoAlBBADYCFCAEQgA3A2gMCQsgBCAEKAJQKAIQIAQoAmAgBCkDWCAEKAJQELwBrDcDaAwICyAEIAQoAlAoAhQgBCgCYCAEKQNYIAQoAlAQvAGsNwNoDAcLIAQpA1hCOFQEQCAEKAJQQRJBABAVIARCfzcDaAwHCyAEIAQoAmA2AkggBCgCSBA8IAQoAkggBCgCUCgCDDYCKCAEKAJIIAQoAlAoAhApAzA3AxggBCgCSCAEKAJIKQMYNwMgIAQoAkhBADsBMCAEKAJIQQA7ATIgBCgCSELcATcDACAEQjg3A2gMBgsgBCgCUCAEKAJgKAIANgIMIARCADcDaAwFCyAEQX82AkAgBEETNgI8IARBCzYCOCAEQQ02AjQgBEEMNgIwIARBCjYCLCAEQQ82AiggBEEJNgIkIARBETYCICAEQQg2AhwgBEEHNgIYIARBBjYCFCAEQQU2AhAgBEEENgIMIARBAzYCCCAEQQI2AgQgBEEBNgIAIARBACAEEDc3A2gMBAsgBCgCUCgCECkDOEL///////////8AVgRAIAQoAlBBHkE9EBUgBEJ/NwNoDAQLIAQgBCgCUCgCECkDODcDaAwDCyAEKAJQKAIUKQM4Qv///////////wBWBEAgBCgCUEEeQT0QFSAEQn83A2gMAwsgBCAEKAJQKAIUKQM4NwNoDAILIAQpA1hC////////////AFYEQCAEKAJQQRJBABAVIARCfzcDaAwCCyAEIAQoAlAoAhQgBCgCYCAEKQNYIAQoAlAQ8gI3A2gMAQsgBCgCUEEcQQAQFSAEQn83A2gLIAQpA2ghAiAEQfAAaiQAIAILeQEBfyMAQRBrIgEkACABIAA2AggCQCABKAIIKAIkQQFGBEAgASgCCEEMakESQQAQFSABQX82AgwMAQsgASgCCEEAQgBBCBAiQgBTBEAgAUF/NgIMDAELIAEoAghBATYCJCABQQA2AgwLIAEoAgwhACABQRBqJAAgAAuDAQEBfyMAQRBrIgIkACACIAA2AgggAiABNwMAAkAgAigCCCgCJEEBRgRAIAIoAghBDGpBEkEAEBUgAkF/NgIMDAELIAIoAghBACACKQMAQREQIkIAUwRAIAJBfzYCDAwBCyACKAIIQQE2AiQgAkEANgIMCyACKAIMIQAgAkEQaiQAIAALWwEBfyMAQSBrIgMkACADIAA2AhwgAyABOQMQIAMgAjkDCCADKAIcBEAgAygCHCADKwMQOQMgIAMoAhwgAysDCDkDKCADKAIcRAAAAAAAAAAAEFgLIANBIGokAAtYAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDEQAAAAAAAAAADkDGCABKAIMKAIARAAAAAAAAAAAIAEoAgwoAgwgASgCDCgCBBEaAAsgAUEQaiQAC0gBAX8jAEEQayIBJAAgASAANgIMIAEoAgwEQCABKAIMKAIIBEAgASgCDCgCDCABKAIMKAIIEQMACyABKAIMEBYLIAFBEGokAAsrAQF/IwBBEGsiASQAIAEgADYCDCABKAIMRAAAAAAAAPA/EFggAUEQaiQAC5wCAgF/AXwjAEEgayIBIAA3AxAgASABKQMQukQAAAAAAADoP6M5AwgCQCABKwMIRAAA4P///+9BZARAIAFBfzYCBAwBCyABAn8gASsDCCICRAAAAAAAAPBBYyACRAAAAAAAAAAAZnEEQCACqwwBC0EACzYCBAsCQCABKAIEQYCAgIB4SwRAIAFBgICAgHg2AhwMAQsgASABKAIEQX9qNgIEIAEgASgCBCABKAIEQQF2cjYCBCABIAEoAgQgASgCBEECdnI2AgQgASABKAIEIAEoAgRBBHZyNgIEIAEgASgCBCABKAIEQQh2cjYCBCABIAEoAgQgASgCBEEQdnI2AgQgASABKAIEQQFqNgIEIAEgASgCBDYCHAsgASgCHAuTAQEBfyMAQSBrIgMkACADIAA2AhggAyABNwMQIAMgAjYCDAJAIAMpAxBQBEAgA0EBOgAfDAELIAMgAykDEBD8AjYCCCADKAIIIAMoAhgoAgBNBEAgA0EBOgAfDAELIAMoAhggAygCCCADKAIMEFpBAXFFBEAgA0EAOgAfDAELIANBAToAHwsgAy0AHxogA0EgaiQAC7MCAgF/AX4jAEEwayIEJAAgBCAANgIkIAQgATYCICAEIAI2AhwgBCADNgIYAkACQCAEKAIkBEAgBCgCIA0BCyAEKAIYQRJBABAVIARCfzcDKAwBCyAEKAIkKQMIQgBWBEAgBCAEKAIgEHw2AhQgBCAEKAIUIAQoAiQoAgBwNgIQIAQgBCgCJCgCECAEKAIQQQJ0aigCADYCDANAAkAgBCgCDEUNACAEKAIgIAQoAgwoAgAQWwRAIAQgBCgCDCgCGDYCDAwCBSAEKAIcQQhxBEAgBCgCDCkDCEJ/UgRAIAQgBCgCDCkDCDcDKAwGCwwCCyAEKAIMKQMQQn9SBEAgBCAEKAIMKQMQNwMoDAULCwsLCyAEKAIYQQlBABAVIARCfzcDKAsgBCkDKCEFIARBMGokACAFC0YBAX8jAEEQayIBJAAgASAANgIMA0AgASgCDARAIAEgASgCDCgCGDYCCCABKAIMEBYgASABKAIINgIMDAELCyABQRBqJAALlwEBAX8jAEEQayIBJAAgASAANgIMIAEoAgwEQCABKAIMKAIQBEAgAUEANgIIA0AgASgCCCABKAIMKAIASQRAIAEoAgwoAhAgASgCCEECdGooAgAEQCABKAIMKAIQIAEoAghBAnRqKAIAEP8CCyABIAEoAghBAWo2AggMAQsLIAEoAgwoAhAQFgsgASgCDBAWCyABQRBqJAALdAEBfyMAQRBrIgEkACABIAA2AgggAUEYEBkiADYCBAJAIABFBEAgASgCCEEOQQAQFSABQQA2AgwMAQsgASgCBEEANgIAIAEoAgRCADcDCCABKAIEQQA2AhAgASABKAIENgIMCyABKAIMIQAgAUEQaiQAIAALnwEBAX8jAEEQayICIAA2AgwgAiABNgIIIAJBADYCBANAIAIoAgQgAigCDCgCREkEQCACKAIMKAJMIAIoAgRBAnRqKAIAIAIoAghGBEAgAigCDCgCTCACKAIEQQJ0aiACKAIMKAJMIAIoAgwoAkRBAWtBAnRqKAIANgIAIAIoAgwiACAAKAJEQX9qNgJEBSACIAIoAgRBAWo2AgQMAgsLCwtUAQF/IwBBEGsiASQAIAEgADYCDCABKAIMQQE6ACgCfyMAQRBrIgAgASgCDEEMajYCDCAAKAIMKAIARQsEQCABKAIMQQxqQQhBABAVCyABQRBqJAAL4QEBA38jAEEgayICJAAgAiAANgIYIAIgATYCFAJAIAIoAhgoAkRBAWogAigCGCgCSE8EQCACIAIoAhgoAkhBCmo2AgwgAiACKAIYKAJMIAIoAgxBAnQQTTYCECACKAIQRQRAIAIoAhhBCGpBDkEAEBUgAkF/NgIcDAILIAIoAhggAigCDDYCSCACKAIYIAIoAhA2AkwLIAIoAhQhASACKAIYKAJMIQMgAigCGCIEKAJEIQAgBCAAQQFqNgJEIABBAnQgA2ogATYCACACQQA2AhwLIAIoAhwhACACQSBqJAAgAAtAAQF/IwBBEGsiAiQAIAIgADYCDCACIAE2AgggAigCDCACKAIINgIsIAIoAgggAigCDBCEAyEAIAJBEGokACAAC7cJAQF/IwBB4MAAayIFJAAgBSAANgLUQCAFIAE2AtBAIAUgAjYCzEAgBSADNwPAQCAFIAQ2ArxAIAUgBSgC0EA2ArhAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAUoArxADhEDBAAGAQIFCQoKCgoKCggKBwoLIAVCADcD2EAMCgsgBSAFKAK4QEHkAGogBSgCzEAgBSkDwEAQQjcD2EAMCQsgBSgCuEAQFiAFQgA3A9hADAgLIAUoArhAKAIQBEAgBSAFKAK4QCgCECAFKAK4QCkDGCAFKAK4QEHkAGoQfyIDNwOYQCADUARAIAVCfzcD2EAMCQsgBSgCuEApAwggBSkDmEB8IAUoArhAKQMIVARAIAUoArhAQeQAakEVQQAQFSAFQn83A9hADAkLIAUoArhAIgAgBSkDmEAgACkDAHw3AwAgBSgCuEAiACAFKQOYQCAAKQMIfDcDCCAFKAK4QEEANgIQCyAFKAK4QC0AeEEBcUUEQCAFQgA3A6hAA0AgBSkDqEAgBSgCuEApAwBUBEAgBQJ+QoDAACAFKAK4QCkDACAFKQOoQH1CgMAAVg0AGiAFKAK4QCkDACAFKQOoQH0LNwOgQCAFIAUoAtRAIAVBEGogBSkDoEAQLyIDNwOwQCADQgBTBEAgBSgCuEBB5ABqIAUoAtRAEBggBUJ/NwPYQAwLCyAFKQOwQFAEQCAFKAK4QEHkAGpBEUEAEBUgBUJ/NwPYQAwLBSAFIAUpA7BAIAUpA6hAfDcDqEAMAgsACwsLIAUoArhAIAUoArhAKQMANwMgIAVCADcD2EAMBwsgBSkDwEAgBSgCuEApAwggBSgCuEApAyB9VgRAIAUgBSgCuEApAwggBSgCuEApAyB9NwPAQAsgBSkDwEBQBEAgBUIANwPYQAwHCyAFKAK4QC0AeEEBcQRAIAUoAtRAIAUoArhAKQMgQQAQKEEASARAIAUoArhAQeQAaiAFKALUQBAYIAVCfzcD2EAMCAsLIAUgBSgC1EAgBSgCzEAgBSkDwEAQLyIDNwOwQCADQgBTBEAgBSgCuEBB5ABqQRFBABAVIAVCfzcD2EAMBwsgBSgCuEAiACAFKQOwQCAAKQMgfDcDICAFKQOwQFAEQCAFKAK4QCkDICAFKAK4QCkDCFQEQCAFKAK4QEHkAGpBEUEAEBUgBUJ/NwPYQAwICwsgBSAFKQOwQDcD2EAMBgsgBSAFKAK4QCkDICAFKAK4QCkDAH0gBSgCuEApAwggBSgCuEApAwB9IAUoAsxAIAUpA8BAIAUoArhAQeQAahCNATcDCCAFKQMIQgBTBEAgBUJ/NwPYQAwGCyAFKAK4QCAFKQMIIAUoArhAKQMAfDcDICAFQgA3A9hADAULIAUgBSgCzEA2AgQgBSgCBCAFKAK4QEEoaiAFKAK4QEHkAGoQkQFBAEgEQCAFQn83A9hADAULIAVCADcD2EAMBAsgBSAFKAK4QCwAYKw3A9hADAMLIAUgBSgCuEApA3A3A9hADAILIAUgBSgCuEApAyAgBSgCuEApAwB9NwPYQAwBCyAFKAK4QEHkAGpBHEEAEBUgBUJ/NwPYQAsgBSkD2EAhAyAFQeDAAGokACADC1UBAX8jAEEgayIEJAAgBCAANgIcIAQgATYCGCAEIAI3AxAgBCADNwMIIAQoAhggBCkDECAEKQMIQQBBAEEAQgAgBCgCHEEIahB+IQAgBEEgaiQAIAALtAMBAX8jAEEwayIDJAAgAyAANgIkIAMgATcDGCADIAI2AhQgAyADKAIkIAMpAxggAygCFBB/IgE3AwgCQCABUARAIANCADcDKAwBCyADIAMoAiQoAkAgAykDGKdBBHRqKAIANgIEAkAgAykDCCADKAIEKQMgfCADKQMIWgRAIAMpAwggAygCBCkDIHxC////////////AFgNAQsgAygCFEEEQRYQFSADQgA3AygMAQsgAyADKAIEKQMgIAMpAwh8NwMIIAMoAgQvAQxBCHEEQCADKAIkKAIAIAMpAwhBABAoQQBIBEAgAygCFCADKAIkKAIAEBggA0IANwMoDAILIAMoAiQoAgAgA0IEEC9CBFIEQCADKAIUIAMoAiQoAgAQGCADQgA3AygMAgsgAygAAEHQlp3AAEYEQCADIAMpAwhCBHw3AwgLIAMgAykDCEIMfDcDCCADKAIEQQAQgAFBAXEEQCADIAMpAwhCCHw3AwgLIAMpAwhC////////////AFYEQCADKAIUQQRBFhAVIANCADcDKAwCCwsgAyADKQMINwMoCyADKQMoIQEgA0EwaiQAIAELBgBBtJwBC/8BAQF/IwBBEGsiAiQAIAIgADYCDCACIAE6AAsCQCACKAIMKAIQQQ5GBEAgAigCDEE/OwEKDAELIAIoAgwoAhBBDEYEQCACKAIMQS47AQoMAQsCQCACLQALQQFxRQRAIAIoAgxBABCAAUEBcUUNAQsgAigCDEEtOwEKDAELAkAgAigCDCgCEEEIRwRAIAIoAgwvAVJBAUcNAQsgAigCDEEUOwEKDAELIAIgAigCDCgCMBBSIgA7AQggAEH//wNxQQBKBEAgAigCDCgCMCgCACACLwEIQQFrai0AAEEvRgRAIAIoAgxBFDsBCgwCCwsgAigCDEEKOwEKCyACQRBqJAALwAIBAX8jAEEwayICJAAgAiAANgIoIAJBgAI7ASYgAiABNgIgIAIgAi8BJkGAAnFBAEc6ABsgAkEeQS4gAi0AG0EBcRs2AhwCQCACKAIoQRpBHCACLQAbQQFxG6xBARAoQQBIBEAgAigCICACKAIoEBggAkF/NgIsDAELIAIgAigCKEEEQQYgAi0AG0EBcRusIAJBDmogAigCIBBBIgA2AgggAEUEQCACQX82AiwMAQsgAkEANgIUA0AgAigCFEECQQMgAi0AG0EBcRtIBEAgAiACKAIIEB5B//8DcSACKAIcajYCHCACIAIoAhRBAWo2AhQMAQsLIAIoAggQSEEBcUUEQCACKAIgQRRBABAVIAIoAggQFyACQX82AiwMAQsgAigCCBAXIAIgAigCHDYCLAsgAigCLCEAIAJBMGokACAAC/8DAQF/IwBBIGsiAiQAIAIgADYCGCACIAE2AhQCQCACKAIYKAIQQeMARwRAIAJBAToAHwwBCyACIAIoAhgoAjQgAkESakGBsgJBgAZBABBfNgIIAkAgAigCCARAIAIvARJBB04NAQsgAigCFEEVQQAQFSACQQA6AB8MAQsgAiACKAIIIAIvARKtECoiADYCDCAARQRAIAIoAhRBFEEAEBUgAkEAOgAfDAELIAJBAToABwJAAkACQCACKAIMEB5Bf2oOAgIAAQsgAigCGCkDKEIUVARAIAJBADoABwsMAQsgAigCFEEYQQAQFSACKAIMEBcgAkEAOgAfDAELIAIoAgxCAhAfLwAAQcGKAUcEQCACKAIUQRhBABAVIAIoAgwQFyACQQA6AB8MAQsCQAJAAkACQAJAIAIoAgwQiwFBf2oOAwABAgMLIAJBgQI7AQQMAwsgAkGCAjsBBAwCCyACQYMCOwEEDAELIAIoAhRBGEEAEBUgAigCDBAXIAJBADoAHwwBCyACLwESQQdHBEAgAigCFEEVQQAQFSACKAIMEBcgAkEAOgAfDAELIAIoAhggAi0AB0EBcToABiACKAIYIAIvAQQ7AVIgAigCDBAeQf//A3EhACACKAIYIAA2AhAgAigCDBAXIAJBAToAHwsgAi0AH0EBcSEAIAJBIGokACAAC7kBAQF/IwBBMGsiAiQAIAIgADsBLiACIAE7ASwgAkIANwIAIAJBADYCKCACQgA3AiAgAkIANwIYIAJCADcCECACQgA3AgggAkEANgIgIAIgAi8BLEEJdUHQAGo2AhQgAiACLwEsQQV1QQ9xQQFrNgIQIAIgAi8BLEEfcTYCDCACIAIvAS5BC3U2AgggAiACLwEuQQV1QT9xNgIEIAIgAi8BLkEBdEE+cTYCACACEAwhACACQTBqJAAgAAtMAQJ/IwBBEGsiACQAIABB2AAQGSIBNgIIAkAgAUUEQCAAQQA2AgwMAQsgACgCCBBdIAAgACgCCDYCDAsgACgCDCEBIABBEGokACABCwcAIAAvATAL4AgBAX8jAEHAAWsiAyQAIAMgADYCtAEgAyABNgKwASADIAI3A6gBIAMgAygCtAEoAgAQNSICNwMgAkAgAkIAUwRAIAMoArQBQQhqIAMoArQBKAIAEBggA0J/NwO4AQwBCyADIAMpAyA3A6ABIANBADoAFyADQgA3AxgDQCADKQMYIAMpA6gBVARAIAMgAygCtAEoAkAgAygCsAEgAykDGKdBA3RqKQMAp0EEdGo2AgwgAyADKAK0AQJ/IAMoAgwoAgQEQCADKAIMKAIEDAELIAMoAgwoAgALQYAEEF4iADYCECAAQQBIBEAgA0J/NwO4AQwDCyADKAIQBEAgA0EBOgAXCyADIAMpAxhCAXw3AxgMAQsLIAMgAygCtAEoAgAQNSICNwMgIAJCAFMEQCADKAK0AUEIaiADKAK0ASgCABAYIANCfzcDuAEMAQsgAyADKQMgIAMpA6ABfTcDmAECQCADKQOgAUL/////D1gEQCADKQOoAUL//wNYDQELIANBAToAFwsgAyADQTBqQuIAECoiADYCLCAARQRAIAMoArQBQQhqQQ5BABAVIANCfzcDuAEMAQsgAy0AF0EBcQRAIAMoAixBttMAQQQQQCADKAIsQiwQLiADKAIsQS0QICADKAIsQS0QICADKAIsQQAQISADKAIsQQAQISADKAIsIAMpA6gBEC4gAygCLCADKQOoARAuIAMoAiwgAykDmAEQLiADKAIsIAMpA6ABEC4gAygCLEG70wBBBBBAIAMoAixBABAhIAMoAiwgAykDoAEgAykDmAF8EC4gAygCLEEBECELIAMoAixBwNMAQQQQQCADKAIsQQAQISADKAIsAn5C//8DIAMpA6gBQv//A1oNABogAykDqAELp0H//wNxECAgAygCLAJ+Qv//AyADKQOoAUL//wNaDQAaIAMpA6gBC6dB//8DcRAgIAMoAiwCf0F/IAMpA5gBQv////8PWg0AGiADKQOYAacLECEgAygCLAJ/QX8gAykDoAFC/////w9aDQAaIAMpA6ABpwsQISADAn8gAygCtAEtAChBAXEEQCADKAK0ASgCJAwBCyADKAK0ASgCIAs2ApQBIAMoAiwCfyADKAKUAQRAIAMoApQBLwEEDAELQQALQf//A3EQIAJ/IwBBEGsiACADKAIsNgIMIAAoAgwtAABBAXFFCwRAIAMoArQBQQhqQRRBABAVIAMoAiwQFyADQn83A7gBDAELIAMoArQBAn8jAEEQayIAIAMoAiw2AgwgACgCDCgCBAsCfiMAQRBrIgAgAygCLDYCDAJ+IAAoAgwtAABBAXEEQCAAKAIMKQMQDAELQgALCxA2QQBIBEAgAygCLBAXIANCfzcDuAEMAQsgAygCLBAXIAMoApQBBEAgAygCtAEgAygClAEoAgAgAygClAEvAQStEDZBAEgEQCADQn83A7gBDAILCyADIAMpA5gBNwO4AQsgAykDuAEhAiADQcABaiQAIAILBwAgACgCIAsIAEEBQTgQewsDAAELC/KNAScAQYAIC5QFTm8gZXJyb3IATXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRlZABSZW5hbWluZyB0ZW1wb3JhcnkgZmlsZSBmYWlsZWQAQ2xvc2luZyB6aXAgYXJjaGl2ZSBmYWlsZWQAU2VlayBlcnJvcgBSZWFkIGVycm9yAFdyaXRlIGVycm9yAENSQyBlcnJvcgBDb250YWluaW5nIHppcCBhcmNoaXZlIHdhcyBjbG9zZWQATm8gc3VjaCBmaWxlAEZpbGUgYWxyZWFkeSBleGlzdHMAQ2FuJ3Qgb3BlbiBmaWxlAEZhaWx1cmUgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlAFpsaWIgZXJyb3IATWFsbG9jIGZhaWx1cmUARW50cnkgaGFzIGJlZW4gY2hhbmdlZABDb21wcmVzc2lvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABQcmVtYXR1cmUgZW5kIG9mIGZpbGUASW52YWxpZCBhcmd1bWVudABOb3QgYSB6aXAgYXJjaGl2ZQBJbnRlcm5hbCBlcnJvcgBaaXAgYXJjaGl2ZSBpbmNvbnNpc3RlbnQAQ2FuJ3QgcmVtb3ZlIGZpbGUARW50cnkgaGFzIGJlZW4gZGVsZXRlZABFbmNyeXB0aW9uIG1ldGhvZCBub3Qgc3VwcG9ydGVkAFJlYWQtb25seSBhcmNoaXZlAE5vIHBhc3N3b3JkIHByb3ZpZGVkAFdyb25nIHBhc3N3b3JkIHByb3ZpZGVkAE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkAFJlc291cmNlIHN0aWxsIGluIHVzZQBUZWxsIGVycm9yAENvbXByZXNzZWQgZGF0YSBpbnZhbGlkAEGhDQuAAQQAAAkEAAAvBAAATgQAAGkEAAB0BAAAfwQAAIsEAACVBAAAtwQAAMQEAADYBAAA6AQAAAkFAAAUBQAAIwUAADoFAABbBQAAcQUAAIIFAACUBQAAowUAALwFAADOBQAA5QUAAAUGAAAXBgAALAYAAEQGAABcBgAAcgYAAH0GAAAgAEG4DgsRAQAAAAEAAAABAAAAAQAAAAEAQdwOCwkBAAAAAQAAAAIAQYgPCwEBAEGoDwsBAQBBtA8LkkWWMAd3LGEO7rpRCZkZxG0Hj/RqcDWlY+mjlWSeMojbDqS43Hke6dXgiNnSlytMtgm9fLF+By2455Edv5BkELcd8iCwakhxufPeQb6EfdTaGuvk3W1RtdT0x4XTg1aYbBPAqGtkevli/ezJZYpPXAEU2WwGY2M9D/r1DQiNyCBuO14QaUzkQWDVcnFnotHkAzxH1ARL/YUN0mu1CqX6qLU1bJiyQtbJu9tA+bys42zYMnVc30XPDdbcWT3Rq6ww2SY6AN5RgFHXyBZh0L+19LQhI8SzVpmVus8Ppb24nrgCKAiIBV+y2QzGJOkLsYd8by8RTGhYqx1hwT0tZraQQdx2BnHbAbwg0pgqENXviYWxcR+1tgal5L+fM9S46KLJB3g0+QAPjqgJlhiYDuG7DWp/LT1tCJdsZJEBXGPm9FFra2JhbBzYMGWFTgBi8u2VBmx7pQEbwfQIglfED/XG2bBlUOm3Euq4vot8iLn83x3dYkkt2hXzfNOMZUzU+1hhsk3OUbU6dAC8o+Iwu9RBpd9K15XYPW3E0aT79NbTaulpQ/zZbjRGiGet0Lhg2nMtBETlHQMzX0wKqsl8Dd08cQVQqkECJxAQC76GIAzJJbVoV7OFbyAJ1Ga5n+Rhzg753l6YydkpIpjQsLSo18cXPbNZgQ20LjtcvbetbLrAIIO47bazv5oM4rYDmtKxdDlH1eqvd9KdFSbbBIMW3HMSC2PjhDtklD5qbQ2oWmp6C88O5J3/CZMnrgAKsZ4HfUSTD/DSowiHaPIBHv7CBmldV2L3y2dlgHE2bBnnBmtudhvU/uAr04laetoQzErdZ2/fufn5776OQ763F9WOsGDoo9bWfpPRocTC2DhS8t9P8We70WdXvKbdBrU/SzaySNorDdhMGwqv9koDNmB6BEHD72DfVd9nqO+ObjF5vmlGjLNhyxqDZryg0m8lNuJoUpV3DMwDRwu7uRYCIi8mBVW+O7rFKAu9spJatCsEarNcp//XwjHP0LWLntksHa7eW7DCZJsm8mPsnKNqdQqTbQKpBgmcPzYO64VnB3ITVwAFgkq/lRR6uOKuK7F7OBu2DJuO0pINvtXlt+/cfCHf2wvU0tOGQuLU8fiz3Whug9ofzRa+gVsmufbhd7Bvd0e3GOZaCIhwag//yjsGZlwLARH/nmWPaa5i+NP/a2FFz2wWeOIKoO7SDddUgwROwrMDOWEmZ6f3FmDQTUdpSdt3bj5KatGu3FrW2WYL30DwO9g3U668qcWeu95/z7JH6f+1MBzyvb2KwrrKMJOzU6ajtCQFNtC6kwbXzSlX3lS/Z9kjLnpms7hKYcQCG2hdlCtvKje+C7ShjgzDG98FWo3vAi0AAAAAQTEbGYJiNjLDUy0rBMVsZEX0d32Gp1pWx5ZBTwiK2chJu8LRiujv+svZ9OMMT7WsTX6utY4tg57PHJiHURLCShAj2VPTcPR4kkHvYVXXri4U5rU317WYHJaEgwVZmBuCGKkAm9v6LbCayzapXV135hxsbP/fP0HUng5azaIkhJXjFZ+MIEayp2F3qb6m4ejx59Dz6CSD3sNlssXaqq5dXeufRkQozGtvaf1wdq5rMTnvWiogLAkHC204HBLzNkbfsgddxnFUcO0wZWv09/Mqu7bCMaJ1kRyJNKAHkPu8nxe6jYQOed6pJTjvsjz/efNzvkjoan0bxUE8Kt5YBU958ER+YumHLU/CxhxU2wGKFZRAuw6Ng+gjpsLZOL8NxaA4TPS7IY+nlgrOlo0TCQDMXEgx10WLYvpuylPhd1Rdu7oVbKCj1j+NiJcOlpFQmNfeEanMx9L64eyTy/r1XNdich3meWvetVRAn4RPWVgSDhYZIxUP2nA4JJtBIz2na/1l5lrmfCUJy1dkONBOo66RAeKfihghzKczYP28Kq/hJK3u0D+0LYMSn2yyCYarJEjJ6hVT0ClGfvtod2Xi9nk/L7dIJDZ0GwkdNSoSBPK8U0uzjUhScN5leTHvfmD+8+bnv8L9/nyR0NU9oMvM+jaKg7sHkZp4VLyxOWWnqEuYgzsKqZgiyfq1CYjLrhBPXe9fDmz0Rs0/2W2MDsJ0QxJa8wIjQerBcGzBgEF32EfXNpcG5i2OxbUApYSEG7waikFxW7taaJjod0PZ2WxaHk8tFV9+NgycLRsn3RwAPhIAmLlTMYOgkGKui9FTtZIWxfTdV/TvxJSnwu/Vltn26bwHrqiNHLdr3jGcKu8qhe15a8qsSHDTbxtd+C4qRuHhNt5moAfFf2NU6FQiZfNN5fOyAqTCqRtnkYQwJqCfKbiuxeT5n979Oszz1nv96M+8a6mA/VqymT4Jn7J/OISrsCQcLPEVBzUyRioec3cxB7ThcEj10GtRNoNGeneyXWNO1/rLD+bh0sy1zPmNhNfgShKWrwsjjbbIcKCdiUG7hEZdIwMHbDgaxD8VMYUODihCmE9nA6lUfsD6eVWBy2JMH8U4gV70I5idpw6z3JYVqhsAVOVaMU/8mWJi19hTec4XT+FJVn76UJUt13vUHMxiE4qNLVK7ljSR6Lsf0NmgBuzzfl6twmVHbpFIbC+gU3XoNhI6qQcJI2pUJAgrZT8R5HmnlqVIvI9mG5GkJyqKveC8y/KhjdDrYt79wCPv5tm94bwU/NCnDT+DiiZ+spE/uSTQcPgVy2k7RuZCenf9W7VrZdz0Wn7FNwlT7nY4SPexrgm48J8SoTPMP4py/SSTAAAAADdqwgFu1IQDWb5GAtyoCQfrwssGsnyNBIUWTwW4URMOjzvRD9aFlw3h71UMZPkaCVOT2AgKLZ4KPUdcC3CjJhxHyeQdHneiHykdYB6sCy8bm2HtGsLfqxj1tWkZyPI1Ev+Y9xOmJrERkUxzEBRaPBUjMP4Ueo64Fk3kehfgRk041yyPOY6SyTu5+As6PO5EPwuEhj5SOsA8ZVACPVgXXjZvfZw3NsPaNQGpGDSEv1cxs9WVMOpr0zLdAREzkOVrJKePqSX+Me8nyVstJkxNYiN7J6AiIpnmIBXzJCEotHgqH966K0Zg/ClxCj4o9BxxLcN2syyayPUuraI3L8CNmnD351hxrlkec5kz3HIcJZN3K09RdnLxF3RFm9V1eNyJfk+2S38WCA19IWLPfKR0gHmTHkJ4yqAEev3KxnuwLrxsh0R+bd76OG/pkPpubIa1a1vsd2oCUjFoNTjzaQh/r2I/FW1jZqsrYVHB6WDU16Zl471kZLoDImaNaeBnIMvXSBehFUlOH1NLeXWRSvxj3k/LCRxOkrdaTKXdmE2YmsRGr/AGR/ZOQEXBJIJERDLNQXNYD0Aq5klCHYyLQ1Bo8VRnAjNVPrx1VwnWt1aMwPhTu6o6UuIUfFDVfr5R6DniWt9TIFuG7WZZsYekWDSR610D+ylcWkVvXm0vrV+AGzXht3H34O7PseLZpXPjXLM85mvZ/ucyZ7jlBQ165DhKJu8PIOTuVp6i7GH0YO3k4i/o04jt6Yo2q+u9XGnq8LgT/cfS0fyebJf+qQZV/ywQGvobetj7QsSe+XWuXPhI6QDzf4PC8iY9hPARV0bxlEEJ9KMry/X6lY33zf9P9mBdeNlXN7rYDon82jnjPtu89XHei5+z39Ih9d3lSzfc2Axr1+9mqda22O/UgbIt1QSkYtAzzqDRanDm010aJNIQ/l7FJ5ScxH4q2sZJQBjHzFZXwvs8lcOigtPBlegRwKivTcufxY/KxnvJyPERC8l0B0TMQ22GzRrTwM8tuQLOQJavkXf8bZAuQiuSGSjpk5w+pparVGSX8uoilcWA4JT4x7yfz61+npYTOJyhefqdJG+1mBMFd5lKuzGbfdHzmjA1iY0HX0uMXuENjmmLz4/snYCK2/dCi4JJBIm1I8aIiGSag78OWILmsB6A0drcgVTMk4RjplGFOhgXhw1y1Yag0OKpl7ogqM4EZqr5bqSrfHjrrksSKa8SrG+tJcatrBiB8acv6zOmdlV1pEE/t6XEKfig80M6oar9fKOdl76i0HPEtecZBrS+p0C2ic2CtwzbzbI7sQ+zYg9JsVVli7BoIte7X0gVugb2U7gxnJG5tIrevIPgHL3aXlq/7TSYvgAAAABlZ7y4i8gJqu6vtRJXl2KPMvDeN9xfayW5ONed7yi0xYpPCH1k4L1vAYcB17i/1krd2GryM3ff4FYQY1ifVxlQ+jCl6BSfEPpx+KxCyMB7362nx2dDCHJ1Jm/OzXB/rZUVGBEt+7ekP57QGIcn6M8aQo9zoqwgxrDJR3oIPq8yoFvIjhi1ZzsK0ACHsmk4UC8MX+yX4vBZhYeX5T3Rh4ZltOA63VpPj88/KDN3hhDk6uN3WFIN2O1AaL9R+KH4K/DEn5dIKjAiWk9XnuL2b0l/kwj1x32nQNUYwPxtTtCfNSu3I43FGJafoH8qJxlH/bp8IEECko/0EPfoSKg9WBSbWD+oI7aQHTHT96GJas92FA+oyqzhB3++hGDDBtJwoF63FxzmWbip9DzfFUyF58LR4IB+aQ4vy3trSHfDog8Ny8dosXMpxwRhTKC42fWYb0SQ/9P8flBm7hs32lZNJ7kOKEAFtsbvsKSjiAwcGrDbgX/XZzmReNIr9B9ukwP3JjtmkJqDiD8vke1YkylUYES0MQf4DN+oTR66z/Gm7N+S/om4LkZnF5tUAnAn7LtI8HHeL0zJMID521XnRWOcoD9r+ceD0xdoNsFyD4p5yzdd5K5Q4VxA/1ROJZjo9nOIi64W7zcW+ECCBJ0nPrwkH+khQXhVma/X4IvKsFwzO7ZZ7V7R5VWwflBH1Rns/2whO2IJRofa5+kyyIKOjnDUnu0osflRkF9W5II6MVg6gwmPp+ZuMx8IwYYNbaY6taThQL3BhvwFLylJF0pO9a/zdiIylhGeini+K5gd2ZcgS8n0eC6uSMDAAf3SpWZBahxelvd5OSpPl5afXfLxI+UFGWtNYH7X9Y7RYufrtt5fUo4JwjfptXrZRgBovCG80Oox34iPVmMwYfnWIgSeapq9pr0H2MEBvzZutK1TCQgVmk5yHf8pzqURhnu3dOHHD83ZEJKovqwqRhEZOCN2pYB1ZsbYEAF6YP6uz3KbyXPKIvGkV0eWGO+pOa39zF4RRQbuTXZjifHOjSZE3OhB+GRReS/5NB6TQdqxJlO/1prr6cb5s4yhRQtiDvAZB2lMob5RmzzbNieENZmSllD+Li6ZuVQm/N7onhJxXYx3FuE0zi42qatJihFF5j8DIIGDu3aR4OMT9lxb/VnpSZg+VfEhBoJsRGE+1KrOi8bPqTd+OEF/1l0mw26ziXZ81u7KxG/WHVkKsaHh5B4U84F5qEvXacsTsg53q1yhwrk5xn4BgP6pnOWZFSQLNqA2blEcjqcWZobCcdo+LN5vLEm505TwgQQJlea4sXtJDaMeLrEbSD7SQy1ZbvvD9tvpppFnUR+psMx6zgx0lGG5ZvEGBd4AAAAAdwcwlu4OYSyZCVG6B23EGXBq9I/pY6U1nmSVow7biDJ53Lik4NXpHpfS2YgJtkwrfrF8vee4LQeQvx2RHbcQZGqwIPLzuXFIhL5B3hra1H1t3eTr9NS1UYPThccTbJhWZGuowP1i+XqKZcnsFAFcT2MGbNn6Dz1jjQgN9TtuIMhMaRBe1WBB5KJncXI8A+TRSwTUR9INhf2lCrVrNbWo+kKymGzbu8nWrLz5QDLYbONF31x13NYNz6vRPVkm2TCsUd4AOsjXUYC/0GEWIbT0tVazxCPPupWZuL2lDygCuJ5fBYgIxgzZsrEL6SQvb3yHWGhMEcFhHau2Zi09dtxBkAHbcQaY0iC879UQKnGxhYkGtrUfn7/kpei41DN4B8miDwD5NJYJqI7hDpgYf2oNuwhtPS2RZGyX5mNcAWtrUfQcbGFihWUw2PJiAE5sBpXtGwGle4II9MH1D8RXZbDZxhK36VCLvrjq/LmIfGLdHd8V2i1JjNN88/vUTGVNsmFYOrVRzqO8AHTUuzDiSt+lQT3Yldek0cRt09b0+0Np6Wo0btn8rWeIRtpguNBEBC1zMwMd5aoKTF/dDXzJUAVxPCcCQaq+CxAQyQwghldotSUgb4WzuWbUCc5h5J9e3vkOKdnJmLDQmCLH16i0WbM9Fy60DYG3vVw7wLpsre24gyCav7O2A7biDHSx0prq1Uc5ndJ3rwTbJhVz3BaD42MLEpRkO4QNbWo+empaqOQOzwuTCf+dCgCuJ30HnrHwD5NEhwij0h4B8mhpBsL+92JXXYBlZ8sZbDZxbmsG5/7UG3aJ0yvgENp6WmfdSsz5ud9vjr7v+Re3vkNgsI7V1taj6KHRk3442MLET9/yUtG7Z/GmvFdnP7UG3UiyNkvYDSvarwobTDYDSvZBBHpg32Dvw6hn31Uxbo7vRmm+ecths4y8ZoMaJW/SoFJo4jbMDHeVuwtHAyICFrlVBSYvxbo7vrK9CygrtFqSXLNqBMLX/6e10M8xLNmei1verh2bZMKw7GPyJnVqo5wCbZMKnAkGqesONj9yB2eFBQBXE5W/SoLiuHoUe7Errgy2GziS0o6b5dW+DXzc77cL298hhtPS1PHU4kJo3bP4H9qDboG+Fs32uSZbb7B34Ri3R3eICFrm/w9qcGYGO8oRAQtcj2We//hirmlha//TFmzPRaAK4njXDdLuTgSDVDkDs8KnZyZh0GAW90lpR00+bnfbrtFqStnWWtxA3wtmN9g78Km8rlPeu57FR7LPfzC1/+m9vfIcyrrCilOzkzAktKOmutA2Bc3XBpNU3lcpI9lnv7Nmei7EYUq4XWgbAipvK5S0C743wwyOoVoF3xstAu+NAAAAABkbMUEyNmKCKy1Tw2RsxQR9d/RFVlqnhk9BlsfI2YoI0cK7Sfrv6Irj9NnLrLVPDLWufk2egy2Oh5gcz0rCElFT2SMQePRw02HvQZIurtdVN7XmFByYtdcFg4SWghuYWZsAqRiwLfrbqTbLmuZ3XV3/bGwc1EE/381aDp6VhCSijJ8V46eyRiC+qXdh8ejhpujz0OfD3oMk2sWyZV1drqpERp/rb2vMKHZw/Wk5MWuuICpa7wsHCSwSHDht30Y288ZdB7LtcFRx9GtlMLsq8/eiMcK2iRyRdZAHoDQXn7z7DoSNuiWp3nk8su84c/N5/2roSL5BxRt9WN4qPPB5TwXpYn5Ewk8th9tUHMaUFYoBjQ67QKYj6IO/ONnCOKDFDSG79EwKlqePE42WzlzMAAlF1zFIbvpii3fhU8q6u11Uo6BsFYiNP9aRlg6X3teYUMfMqRHs4frS9frLk3Ji11xreeYdQFS13llPhJ8WDhJYDxUjGSQ4cNo9I0GbZf1rp3zmWuZXywklTtA4ZAGRrqMYip/iM6fMISq8/WCtJOGvtD/Q7p8Sgy2GCbJsyUgkq9BTFer7fkYp4mV3aC8/efY2JEi3HQkbdAQSKjVLU7zyUkiNs3ll3nBgfu8x5+bz/v79wr/V0JF8zMugPYOKNvqakQe7sbxUeKinZTk7g5hLIpipCgm1+skQrsuIX+9dT0b0bA5t2T/NdMIOjPNaEkPqQSMCwWxwwdh3QYCXNtdHji3mBqUAtcW8G4SEcUGKGmhau1tDd+iYWmzZ2RUtTx4MNn5fJxstnD4AHN25mAASoIMxU4uuYpCStVPR3fTFFsTv9FfvwqeU9tmW1a4HvOm3HI2onDHea4Uq7yrKa3nt03BIrPhdG2/hRiouZt424X/FB6BU6FRjTfNlIgKy8+UbqcKkMISRZymfoCbkxa64/d6f+dbzzDrP6P17gKlrvJmyWv2ynwk+q4Q4fywcJLA1BxXxHipGMgcxd3NIcOG0UWvQ9XpGgzZjXbJ3y/rXTtLh5g/5zLXM4NeEja+WEkq2jSMLnaBwyIS7QYkDI11GGjhsBzEVP8QoDg6FZ0+YQn5UqQNVefrATGLLgYE4xR+YI/Resw6nnaoVltzlVAAb/E8xWtdiYpnOeVPYSeFPF1D6flZ71y2VYswc1C2NihM0lrtSH7vokQag2dBefvPsR2XCrWxIkW51U6AvOhI26CMJB6kIJFRqET9lK5aneeSPvEilpJEbZr2KKifyy7zg69CNocD93mLZ5u8jFLzhvQ2n0PwmioM/P5GyfnDQJLlpyxX4QuZGO1v9d3rcZWu1xX5a9O5TCTf3SDh2uAmusaESn/CKP8wzkyT9cgAAAAABwmo3A4TUbgJGvlkHCajcBsvC6wSNfLIFTxaFDhNRuA/RO48Nl4XWDFXv4Qka+WQI2JNTCp4tCgtcRz0cJqNwHeTJRx+idx4eYB0pGy8LrBrtYZsYq9/CGWm19RI18sgT95j/EbEmphBzTJEVPFoUFP4wIxa4jnoXeuRNOE1G4DmPLNc7yZKOOgv4uT9E7jw+hoQLPMA6Uj0CUGU2XhdYN5x9bzXawzY0GKkBMVe/hDCV1bMy02vqMxEB3SRr5ZAlqY+nJ+8x/iYtW8kjYk1MIqAneyDmmSIhJPMVKni0KCu63h8p/GBGKD4KcS1xHPQss3bDLvXImi83oq1wmo3AcVjn93MeWa5y3DOZd5MlHHZRTyt0F/FyddWbRX6J3Hh/S7ZPfQ0IFnzPYiF5gHSkeEIek3oEoMp7xsr9bLwusG1+RIdvOPrebvqQ6Wu1hmxqd+xbaDFSAmnzODVir38IY20VP2Erq2Zg6cFRZabX1GRkveNmIgO6Z+BpjUjXyyBJFaEXS1MfTkqRdXlP3mP8ThwJy0xat5JNmN2lRsSamEcG8K9FQE72RIIkwUHNMkRAD1hzQknmKkOLjB1U8WhQVTMCZ1d1vD5Wt9YJU/jAjFI6qrtQfBTiUb5+1VriOehbIFPfWWbthlikh7Fd65E0XCn7A15vRVpfrS9t4TUbgOD3cbfisc/u43Ol2eY8s1zn/tlr5bhnMuR6DQXvJko47uQgD+yinlbtYPRh6C/i5OntiNPrqzaK6mlcvf0TuPD80dLH/pdsnv9VBqn6GhAs+9h6G/mexEL4XK518wDpSPLCg3/whD0m8UZXEfQJQZT1yyuj942V+vZP/83ZeF1g2Lo3V9r8iQ7bPuM53nH1vN+zn4vd9SHS3DdL5ddrDNjWqWbv1O/YttUtsoHQYqQE0aDOM9PmcGrSJBpdxV7+EMSclCfG2ip+xxhAScJXVszDlTz7wdOCosAR6JXLTa+oyo/Fn8jJe8bJCxHxzEQHdM2GbUPPwNMazgK5LZGvlkCQbfx3kitCLpPpKBmWpj6cl2RUq5Ui6vKU4IDFn7zH+J5+rc+cOBOWnfp5oZi1bySZdwUTmzG7Sprz0X2NiTUwjEtfB44N4V6Pz4tpioCd7ItC99uJBEmCiMYjtYOaZIiCWA6/gB6w5oHc2tGEk8xUhVGmY4cXGDqG1XINqeLQoKggupeqZgTOq6Ru+a7reHyvKRJLrW+sEqytxiWn8YEYpjPrL6R1VXaltz9BoPgpxKE6Q/OjfP2qor6XnbXEc9C0BhnntkCnvreCzYmyzdsMsw+xO7FJD2Kwi2VVu9ciaLoVSF+4U/YGuZGcMbzeirS9HOCDv1pe2r6YNO0AAAAAuLxnZaoJyIsSta/uj2KXVzfe8DIla1/cndc4ucW0KO99CE+Kb73gZNcBhwFK1r+48mrY3eDfdzNYYxBWUBlXn+ilMPr6EJ8UQqz4cd97wMhnx6etdXIIQ83ObyaVrX9wLREYFT+kt/uHGNCeGs/oJ6Jzj0KwxiCsCHpHyaAyrz4YjshbCjtntbKHANAvUDhpl+xfDIVZ8OI95ZeHZYaH0d064LTPj09adzMoP+rkEIZSWHfjQO3YDfhRv2jwK/ihSJefxFoiMCrinldPf0lv9sf1CJPVQKd9bfzAGDWf0E6NI7crn5YYxScqf6C6/UcZAkEgfBD0j5KoSOj3mxRYPSOoP1gxHZC2iaH30xR2z2qsyqgPvn8H4QbDYIReoHDS5hwXt/SpuFlMFd880cLnhWl+gOB7yy8Ow3dIa8sND6JzsWjHYQTHKdm4oExEb5j1/NP/kO5mUH5W2jcbDrknTbYFQCiksO/GHAyIo4HbsBo5Z9d/K9J4kZNuH/Q7JvcDg5qQZpEvP4gpk1jttERgVAz4BzEeTajfpvHPuv6S3+xGLriJVJsXZ+wncAJx8Ei7yUwv3tv5gDBjRedVaz+gnNODx/nBNmgXeYoPcuRdN8tc4VCuTlT/QPbomCWui4hzFjfvFgSCQPi8PiedIekfJJlVeEGL4NevM1ywyu1ZtjtV5dFeR1B+sP/sGdViOyFs2odGCcgy6edwjo6CKO2e1JBR+bGC5FZfOlgxOqePCYMfM27mDYbBCLU6pm29QOGkBfyGwRdJKS+v9U5KMiJ284qeEZaYK754IJfZHXj0yUvASK4u0v0BwGpBZqX3ll4cTyo5eV2flpflI/HyTWsZBfXXfmDnYtGOX96268IJjlJ6tek3aABG2dC8IbyI3zHqMGNWjyLW+WGaap4EB72mvb8BwdittG42FQgJUx1yTpqlzin/t3uGEQ/H4XSSENnNKqy+qDgZEUaApXYj2MZmdWB6ARByz67+ynPJm1ek8SLvGJZH/a05qUURXsx2Te4GzvGJY9xEJo1k+EHo+S95UUGTHjRTJrHa65rWv7P5xukLRaGMGfAOYqFMaQc8m1G+hCc225aSmTUuLv5QJlS5mZ7o3vyMXXESNOEWd6k2Ls4RikmrAz/mRbuDgSDj4JF2W1z2E0npWf3xVT6YbIIGIdQ+YUTGi86qfjepz9Z/QThuwyZdfHaJs8TK7tZZHdZv4aGxCvMUHuRLqHmBE8tp16t3DrK5wqFcAX7GOZyp/oAkFZnlNqA2C44cUW6GZhanPtpxwixv3iyU07lJCQSB8LG45pWjDUl7G7EuHkPSPkj7blkt6dv2w1FnkabMsKkfdAzOema5YZTeBQbxAAA6JjsmZSZmJmMmYCYiINglyyXZJUImQCZqJmsmPCa6JcQllSE8ILYApwCsJaghkSGTIZIhkCEfIpQhsiW8JSAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAYwBkAGUAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAcgBzAHQAdQB2AHcAeAB5AHoAewB8AH0AfgACI8cA/ADpAOIA5ADgAOUA5wDqAOsA6ADvAO4A7ADEAMUAyQDmAMYA9AD2APIA+wD5AP8A1gDcAKIAowClAKcgkgHhAO0A8wD6APEA0QCqALoAvwAQI6wAvQC8AKEAqwC7AJElkiWTJQIlJCVhJWIlViVVJWMlUSVXJV0lXCVbJRAlFCU0JSwlHCUAJTwlXiVfJVolVCVpJWYlYCVQJWwlZyVoJWQlZSVZJVglUiVTJWslaiUYJQwliCWEJYwlkCWAJbED3wCTA8ADowPDA7UAxAOmA5gDqQO0Ax4ixgO1AykiYSKxAGUiZCIgIyEj9wBIIrAAGSK3ABoifyCyAKAloAAAAAAAAABQSwYGAFBLBgcAUEsFBgBQSwMEAFBLAQIAQUUAbmVlZCBkaWN0aW9uYXJ5AHN0cmVhbSBlbmQAAGZpbGUgZXJyb3IAc3RyZWFtIGVycm9yAGRhdGEgZXJyb3IAaW5zdWZmaWNpZW50IG1lbW9yeQBidWZmZXIgZXJyb3IAaW5jb21wYXRpYmxlIHZlcnNpb24AQdDUAAsm0ikAAOIpAADtKQAA7ikAAPkpAAAGKgAAESoAACUqAAAyKgAA7SkAQYHVAAu2EAECAwQEBQUGBgYGBwcHBwgICAgICAgICQkJCQkJCQkKCgoKCgoKCgoKCgoKCgoKCwsLCwsLCwsLCwsLCwsLCwwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAEBESEhMTFBQUFBUVFRUWFhYWFhYWFhcXFxcXFxcXGBgYGBgYGBgYGBgYGBgYGBkZGRkZGRkZGRkZGRkZGRkaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0AAQIDBAUGBwgICQkKCgsLDAwMDA0NDQ0ODg4ODw8PDxAQEBAQEBAQERERERERERESEhISEhISEhMTExMTExMTFBQUFBQUFBQUFBQUFBQUFBUVFRUVFRUVFRUVFRUVFRUWFhYWFhYWFhYWFhYWFhYWFxcXFxcXFxcXFxcXFxcXFxgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxscwC0AAMAyAAABAQAAHgEAAA8AAABAMgAAQDMAAAAAAAAeAAAADwAAAAAAAADAMwAAAAAAABMAAAAHAAAAAAAAAAwACACMAAgATAAIAMwACAAsAAgArAAIAGwACADsAAgAHAAIAJwACABcAAgA3AAIADwACAC8AAgAfAAIAPwACAACAAgAggAIAEIACADCAAgAIgAIAKIACABiAAgA4gAIABIACACSAAgAUgAIANIACAAyAAgAsgAIAHIACADyAAgACgAIAIoACABKAAgAygAIACoACACqAAgAagAIAOoACAAaAAgAmgAIAFoACADaAAgAOgAIALoACAB6AAgA+gAIAAYACACGAAgARgAIAMYACAAmAAgApgAIAGYACADmAAgAFgAIAJYACABWAAgA1gAIADYACAC2AAgAdgAIAPYACAAOAAgAjgAIAE4ACADOAAgALgAIAK4ACABuAAgA7gAIAB4ACACeAAgAXgAIAN4ACAA+AAgAvgAIAH4ACAD+AAgAAQAIAIEACABBAAgAwQAIACEACAChAAgAYQAIAOEACAARAAgAkQAIAFEACADRAAgAMQAIALEACABxAAgA8QAIAAkACACJAAgASQAIAMkACAApAAgAqQAIAGkACADpAAgAGQAIAJkACABZAAgA2QAIADkACAC5AAgAeQAIAPkACAAFAAgAhQAIAEUACADFAAgAJQAIAKUACABlAAgA5QAIABUACACVAAgAVQAIANUACAA1AAgAtQAIAHUACAD1AAgADQAIAI0ACABNAAgAzQAIAC0ACACtAAgAbQAIAO0ACAAdAAgAnQAIAF0ACADdAAgAPQAIAL0ACAB9AAgA/QAIABMACQATAQkAkwAJAJMBCQBTAAkAUwEJANMACQDTAQkAMwAJADMBCQCzAAkAswEJAHMACQBzAQkA8wAJAPMBCQALAAkACwEJAIsACQCLAQkASwAJAEsBCQDLAAkAywEJACsACQArAQkAqwAJAKsBCQBrAAkAawEJAOsACQDrAQkAGwAJABsBCQCbAAkAmwEJAFsACQBbAQkA2wAJANsBCQA7AAkAOwEJALsACQC7AQkAewAJAHsBCQD7AAkA+wEJAAcACQAHAQkAhwAJAIcBCQBHAAkARwEJAMcACQDHAQkAJwAJACcBCQCnAAkApwEJAGcACQBnAQkA5wAJAOcBCQAXAAkAFwEJAJcACQCXAQkAVwAJAFcBCQDXAAkA1wEJADcACQA3AQkAtwAJALcBCQB3AAkAdwEJAPcACQD3AQkADwAJAA8BCQCPAAkAjwEJAE8ACQBPAQkAzwAJAM8BCQAvAAkALwEJAK8ACQCvAQkAbwAJAG8BCQDvAAkA7wEJAB8ACQAfAQkAnwAJAJ8BCQBfAAkAXwEJAN8ACQDfAQkAPwAJAD8BCQC/AAkAvwEJAH8ACQB/AQkA/wAJAP8BCQAAAAcAQAAHACAABwBgAAcAEAAHAFAABwAwAAcAcAAHAAgABwBIAAcAKAAHAGgABwAYAAcAWAAHADgABwB4AAcABAAHAEQABwAkAAcAZAAHABQABwBUAAcANAAHAHQABwADAAgAgwAIAEMACADDAAgAIwAIAKMACABjAAgA4wAIAAAABQAQAAUACAAFABgABQAEAAUAFAAFAAwABQAcAAUAAgAFABIABQAKAAUAGgAFAAYABQAWAAUADgAFAB4ABQABAAUAEQAFAAkABQAZAAUABQAFABUABQANAAUAHQAFAAMABQATAAUACwAFABsABQAHAAUAFwAFAEHg5QALTQEAAAABAAAAAQAAAAEAAAACAAAAAgAAAAIAAAACAAAAAwAAAAMAAAADAAAAAwAAAAQAAAAEAAAABAAAAAQAAAAFAAAABQAAAAUAAAAFAEHQ5gALZQEAAAABAAAAAgAAAAIAAAADAAAAAwAAAAQAAAAEAAAABQAAAAUAAAAGAAAABgAAAAcAAAAHAAAACAAAAAgAAAAJAAAACQAAAAoAAAAKAAAACwAAAAsAAAAMAAAADAAAAA0AAAANAEGA6AALIwIAAAADAAAABwAAAAAAAAAQERIACAcJBgoFCwQMAw0CDgEPAEG06AALaQEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4ABBtOkAC3oBAAAAAgAAAAMAAAAEAAAABgAAAAgAAAAMAAAAEAAAABgAAAAgAAAAMAAAAEAAAABgAAAAgAAAAMAAAAAAAQAAgAEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAADEuMi4xMQBBuOoAC20HAAAABAAEAAgABAAIAAAABAAFABAACAAIAAAABAAGACAAIAAIAAAABAAEABAAEAAJAAAACAAQACAAIAAJAAAACAAQAIAAgAAJAAAACAAgAIAAAAEJAAAAIACAAAIBAAQJAAAAIAACAQIBABAJAEGw6wAL1gIDAAQABQAGAAcACAAJAAoACwANAA8AEQATABcAGwAfACMAKwAzADsAQwBTAGMAcwCDAKMAwwDjAAIBAAAAAAAAEAAQABAAEAAQABAAEAAQABEAEQARABEAEgASABIAEgATABMAEwATABQAFAAUABQAFQAVABUAFQAQAE0AygAAAAEAAgADAAQABQAHAAkADQARABkAIQAxAEEAYQCBAMEAAQGBAQECAQMBBAEGAQgBDAEQARgBIAEwAUABYAAAAAAQABAAEAAQABEAEQASABIAEwATABQAFAAVABUAFgAWABcAFwAYABgAGQAZABoAGgAbABsAHAAcAB0AHQBAAEAAaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2sAaW52YWxpZCBkaXN0YW5jZSBjb2RlAGludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZQAxLjIuMTEAQZDuAAvyAxAAEQASAAAACAAHAAkABgAKAAUACwAEAAwAAwANAAIADgABAA8AaW5jb3JyZWN0IGhlYWRlciBjaGVjawB1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZABpbnZhbGlkIHdpbmRvdyBzaXplAHVua25vd24gaGVhZGVyIGZsYWdzIHNldABoZWFkZXIgY3JjIG1pc21hdGNoAGludmFsaWQgYmxvY2sgdHlwZQBpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzAHRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzAGludmFsaWQgY29kZSBsZW5ndGhzIHNldABpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0AGludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jawBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQAaW52YWxpZCBkaXN0YW5jZXMgc2V0AGludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZQBpbnZhbGlkIGRpc3RhbmNlIGNvZGUAaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2sAaW5jb3JyZWN0IGRhdGEgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBBkPIAC5cRYAcAAAAIUAAACBAAFAhzABIHHwAACHAAAAgwAAAJwAAQBwoAAAhgAAAIIAAACaAAAAgAAAAIgAAACEAAAAngABAHBgAACFgAAAgYAAAJkAATBzsAAAh4AAAIOAAACdAAEQcRAAAIaAAACCgAAAmwAAAICAAACIgAAAhIAAAJ8AAQBwQAAAhUAAAIFAAVCOMAEwcrAAAIdAAACDQAAAnIABEHDQAACGQAAAgkAAAJqAAACAQAAAiEAAAIRAAACegAEAcIAAAIXAAACBwAAAmYABQHUwAACHwAAAg8AAAJ2AASBxcAAAhsAAAILAAACbgAAAgMAAAIjAAACEwAAAn4ABAHAwAACFIAAAgSABUIowATByMAAAhyAAAIMgAACcQAEQcLAAAIYgAACCIAAAmkAAAIAgAACIIAAAhCAAAJ5AAQBwcAAAhaAAAIGgAACZQAFAdDAAAIegAACDoAAAnUABIHEwAACGoAAAgqAAAJtAAACAoAAAiKAAAISgAACfQAEAcFAAAIVgAACBYAQAgAABMHMwAACHYAAAg2AAAJzAARBw8AAAhmAAAIJgAACawAAAgGAAAIhgAACEYAAAnsABAHCQAACF4AAAgeAAAJnAAUB2MAAAh+AAAIPgAACdwAEgcbAAAIbgAACC4AAAm8AAAIDgAACI4AAAhOAAAJ/ABgBwAAAAhRAAAIEQAVCIMAEgcfAAAIcQAACDEAAAnCABAHCgAACGEAAAghAAAJogAACAEAAAiBAAAIQQAACeIAEAcGAAAIWQAACBkAAAmSABMHOwAACHkAAAg5AAAJ0gARBxEAAAhpAAAIKQAACbIAAAgJAAAIiQAACEkAAAnyABAHBAAACFUAAAgVABAIAgETBysAAAh1AAAINQAACcoAEQcNAAAIZQAACCUAAAmqAAAIBQAACIUAAAhFAAAJ6gAQBwgAAAhdAAAIHQAACZoAFAdTAAAIfQAACD0AAAnaABIHFwAACG0AAAgtAAAJugAACA0AAAiNAAAITQAACfoAEAcDAAAIUwAACBMAFQjDABMHIwAACHMAAAgzAAAJxgARBwsAAAhjAAAIIwAACaYAAAgDAAAIgwAACEMAAAnmABAHBwAACFsAAAgbAAAJlgAUB0MAAAh7AAAIOwAACdYAEgcTAAAIawAACCsAAAm2AAAICwAACIsAAAhLAAAJ9gAQBwUAAAhXAAAIFwBACAAAEwczAAAIdwAACDcAAAnOABEHDwAACGcAAAgnAAAJrgAACAcAAAiHAAAIRwAACe4AEAcJAAAIXwAACB8AAAmeABQHYwAACH8AAAg/AAAJ3gASBxsAAAhvAAAILwAACb4AAAgPAAAIjwAACE8AAAn+AGAHAAAACFAAAAgQABQIcwASBx8AAAhwAAAIMAAACcEAEAcKAAAIYAAACCAAAAmhAAAIAAAACIAAAAhAAAAJ4QAQBwYAAAhYAAAIGAAACZEAEwc7AAAIeAAACDgAAAnRABEHEQAACGgAAAgoAAAJsQAACAgAAAiIAAAISAAACfEAEAcEAAAIVAAACBQAFQjjABMHKwAACHQAAAg0AAAJyQARBw0AAAhkAAAIJAAACakAAAgEAAAIhAAACEQAAAnpABAHCAAACFwAAAgcAAAJmQAUB1MAAAh8AAAIPAAACdkAEgcXAAAIbAAACCwAAAm5AAAIDAAACIwAAAhMAAAJ+QAQBwMAAAhSAAAIEgAVCKMAEwcjAAAIcgAACDIAAAnFABEHCwAACGIAAAgiAAAJpQAACAIAAAiCAAAIQgAACeUAEAcHAAAIWgAACBoAAAmVABQHQwAACHoAAAg6AAAJ1QASBxMAAAhqAAAIKgAACbUAAAgKAAAIigAACEoAAAn1ABAHBQAACFYAAAgWAEAIAAATBzMAAAh2AAAINgAACc0AEQcPAAAIZgAACCYAAAmtAAAIBgAACIYAAAhGAAAJ7QAQBwkAAAheAAAIHgAACZ0AFAdjAAAIfgAACD4AAAndABIHGwAACG4AAAguAAAJvQAACA4AAAiOAAAITgAACf0AYAcAAAAIUQAACBEAFQiDABIHHwAACHEAAAgxAAAJwwAQBwoAAAhhAAAIIQAACaMAAAgBAAAIgQAACEEAAAnjABAHBgAACFkAAAgZAAAJkwATBzsAAAh5AAAIOQAACdMAEQcRAAAIaQAACCkAAAmzAAAICQAACIkAAAhJAAAJ8wAQBwQAAAhVAAAIFQAQCAIBEwcrAAAIdQAACDUAAAnLABEHDQAACGUAAAglAAAJqwAACAUAAAiFAAAIRQAACesAEAcIAAAIXQAACB0AAAmbABQHUwAACH0AAAg9AAAJ2wASBxcAAAhtAAAILQAACbsAAAgNAAAIjQAACE0AAAn7ABAHAwAACFMAAAgTABUIwwATByMAAAhzAAAIMwAACccAEQcLAAAIYwAACCMAAAmnAAAIAwAACIMAAAhDAAAJ5wAQBwcAAAhbAAAIGwAACZcAFAdDAAAIewAACDsAAAnXABIHEwAACGsAAAgrAAAJtwAACAsAAAiLAAAISwAACfcAEAcFAAAIVwAACBcAQAgAABMHMwAACHcAAAg3AAAJzwARBw8AAAhnAAAIJwAACa8AAAgHAAAIhwAACEcAAAnvABAHCQAACF8AAAgfAAAJnwAUB2MAAAh/AAAIPwAACd8AEgcbAAAIbwAACC8AAAm/AAAIDwAACI8AAAhPAAAJ/wAQBQEAFwUBARMFEQAbBQEQEQUFABkFAQQVBUEAHQUBQBAFAwAYBQECFAUhABwFASASBQkAGgUBCBYFgQBABQAAEAUCABcFgQETBRkAGwUBGBEFBwAZBQEGFQVhAB0FAWAQBQQAGAUBAxQFMQAcBQEwEgUNABoFAQwWBcEAQAUAADEuMi4xMQAtKyAgIDBYMHgAKG51bGwpAEGwgwELQREACgAREREAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAEQAPChEREQMKBwABAAkLCwAACQYLAAALAAYRAAAAERERAEGBhAELIQsAAAAAAAAAABEACgoREREACgAAAgAJCwAAAAkACwAACwBBu4QBCwEMAEHHhAELFQwAAAAADAAAAAAJDAAAAAAADAAADABB9YQBCwEOAEGBhQELFQ0AAAAEDQAAAAAJDgAAAAAADgAADgBBr4UBCwEQAEG7hQELHg8AAAAADwAAAAAJEAAAAAAAEAAAEAAAEgAAABISEgBB8oUBCw4SAAAAEhISAAAAAAAACQBBo4YBCwELAEGvhgELFQoAAAAACgAAAAAJCwAAAAAACwAACwBB3YYBCwEMAEHphgELSwwAAAAADAAAAAAJDAAAAAAADAAADAAAMDEyMzQ1Njc4OUFCQ0RFRi0wWCswWCAwWC0weCsweCAweABpbmYASU5GAG5hbgBOQU4ALgBB3IcBCwEXAEGDiAELBf//////AEHQiAELVxkSRDsCPyxHFD0zMAobBkZLRTcPSQ6OFwNAHTxpKzYfSi0cASAlKSEIDBUWIi4QOD4LNDEYZHR1di9BCX85ESNDMkKJiosFBCYoJw0qHjWMBxpIkxOUlQBBsIkBC90OSWxsZWdhbCBieXRlIHNlcXVlbmNlAERvbWFpbiBlcnJvcgBSZXN1bHQgbm90IHJlcHJlc2VudGFibGUATm90IGEgdHR5AFBlcm1pc3Npb24gZGVuaWVkAE9wZXJhdGlvbiBub3QgcGVybWl0dGVkAE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkATm8gc3VjaCBwcm9jZXNzAEZpbGUgZXhpc3RzAFZhbHVlIHRvbyBsYXJnZSBmb3IgZGF0YSB0eXBlAE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlAE91dCBvZiBtZW1vcnkAUmVzb3VyY2UgYnVzeQBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbABSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQBJbnZhbGlkIHNlZWsAQ3Jvc3MtZGV2aWNlIGxpbmsAUmVhZC1vbmx5IGZpbGUgc3lzdGVtAERpcmVjdG9yeSBub3QgZW1wdHkAQ29ubmVjdGlvbiByZXNldCBieSBwZWVyAE9wZXJhdGlvbiB0aW1lZCBvdXQAQ29ubmVjdGlvbiByZWZ1c2VkAEhvc3QgaXMgZG93bgBIb3N0IGlzIHVucmVhY2hhYmxlAEFkZHJlc3MgaW4gdXNlAEJyb2tlbiBwaXBlAEkvTyBlcnJvcgBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzAEJsb2NrIGRldmljZSByZXF1aXJlZABObyBzdWNoIGRldmljZQBOb3QgYSBkaXJlY3RvcnkASXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AAFVua25vd24gZXJyb3IgJWQAJXMlcyVzAAA6IAAvcHJvYy9zZWxmL2ZkLwAvZGV2L3VyYW5kb20AcndhACVzLlhYWFhYWAByK2IAcmIAUEsFBgBBkJgBC04KAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAAQAAAAgAAAAQTAAAMEwAQZCaAQsCgFAAQciaAQsJHwAAAGRNAAADAEHkmgELjAEt9FFYz4yxwEb2tcspMQPHBFtwMLRd/SB4f4ua2FkpUGhIiaunVgNs/7fNiD/Ud7QrpaNw8brkqPxBg/3Zb+GKei8tdJYHHw0JXgN2LHD3QKUsp29XQaiqdN+gWGQDSsfEPFOur18YBBWx420ohqsMpL9D8OlQgTlXFlI3/////////////////////w==";function Ae(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var r=t.func;"number"==typeof r?void 0===t.arg?f.get(r)():f.get(r)(t.arg):r(void 0===t.arg?null:t.arg)}else t(o)}}function ne(){var e=function(){var e=new Error;if(!e.stack){try{throw new Error}catch(t){e=t}if(!e.stack)return"(no stack trace available)"}return e.stack.toString()}();return o.extraStackTrace&&(e+="\n"+o.extraStackTrace()),e.replace(/\b_Z[\w\d_]+/g,(function(e){return e==e?e:e+" ["+e+"]"}))}function oe(e,t){var r=new Date(1e3*M[e>>2]);M[t>>2]=r.getUTCSeconds(),M[t+4>>2]=r.getUTCMinutes(),M[t+8>>2]=r.getUTCHours(),M[t+12>>2]=r.getUTCDate(),M[t+16>>2]=r.getUTCMonth(),M[t+20>>2]=r.getUTCFullYear()-1900,M[t+24>>2]=r.getUTCDay(),M[t+36>>2]=0,M[t+32>>2]=0;var A=Date.UTC(r.getUTCFullYear(),0,1,0,0,0,0),n=(r.getTime()-A)/864e5|0;return M[t+28>>2]=n,oe.GMTString||(oe.GMTString=S("GMT")),M[t+40>>2]=oe.GMTString,t}Z(re)||($=re,re=o.locateFile?o.locateFile($,u):u+$),U.push({func:function(){Se()}});var ie={splitPath:function(e){return/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(e).slice(1)},normalizeArray:function(e,t){for(var r=0,A=e.length-1;A>=0;A--){var n=e[A];"."===n?e.splice(A,1):".."===n?(e.splice(A,1),r++):r&&(e.splice(A,1),r--)}if(t)for(;r;r--)e.unshift("..");return e},normalize:function(e){var t="/"===e.charAt(0),r="/"===e.substr(-1);return(e=ie.normalizeArray(e.split("/").filter((function(e){return!!e})),!t).join("/"))||t||(e="."),e&&r&&(e+="/"),(t?"/":"")+e},dirname:function(e){var t=ie.splitPath(e),r=t[0],A=t[1];return r||A?(A&&(A=A.substr(0,A.length-1)),r+A):"."},basename:function(e){if("/"===e)return"/";var t=(e=(e=ie.normalize(e)).replace(/\/$/,"")).lastIndexOf("/");return-1===t?e:e.substr(t+1)},extname:function(e){return ie.splitPath(e)[3]},join:function(){var e=Array.prototype.slice.call(arguments,0);return ie.normalize(e.join("/"))},join2:function(e,t){return ie.normalize(e+"/"+t)}};function se(e){return M[ke()>>2]=e,e}var ae={resolve:function(){for(var e="",t=!1,r=arguments.length-1;r>=-1&&!t;r--){var A=r>=0?arguments[r]:pe.cwd();if("string"!=typeof A)throw new TypeError("Arguments to path.resolve must be strings");if(!A)return"";e=A+"/"+e,t="/"===A.charAt(0)}return(t?"/":"")+(e=ie.normalizeArray(e.split("/").filter((function(e){return!!e})),!t).join("/"))||"."},relative:function(e,t){function r(e){for(var t=0;t=0&&""===e[r];r--);return t>r?[]:e.slice(t,r-t+1)}e=ae.resolve(e).substr(1),t=ae.resolve(t).substr(1);for(var A=r(e.split("/")),n=r(t.split("/")),o=Math.min(A.length,n.length),i=o,s=0;s0?r.slice(0,A).toString("utf-8"):null))return null;e.input=we(t,!0)}return e.input.shift()},put_char:function(e,t){null===t||10===t?(h(w(e.output,0)),e.output=[]):0!=t&&e.output.push(t)},flush:function(e){e.output&&e.output.length>0&&(h(w(e.output,0)),e.output=[])}},default_tty1_ops:{put_char:function(e,t){null===t||10===t?(p(w(e.output,0)),e.output=[]):0!=t&&e.output.push(t)},flush:function(e){e.output&&e.output.length>0&&(p(w(e.output,0)),e.output=[])}}},ge={ops_table:null,mount:function(e){return ge.createNode(null,"/",16895,0)},createNode:function(e,t,r,A){if(pe.isBlkdev(r)||pe.isFIFO(r))throw new pe.ErrnoError(63);ge.ops_table||(ge.ops_table={dir:{node:{getattr:ge.node_ops.getattr,setattr:ge.node_ops.setattr,lookup:ge.node_ops.lookup,mknod:ge.node_ops.mknod,rename:ge.node_ops.rename,unlink:ge.node_ops.unlink,rmdir:ge.node_ops.rmdir,readdir:ge.node_ops.readdir,symlink:ge.node_ops.symlink},stream:{llseek:ge.stream_ops.llseek}},file:{node:{getattr:ge.node_ops.getattr,setattr:ge.node_ops.setattr},stream:{llseek:ge.stream_ops.llseek,read:ge.stream_ops.read,write:ge.stream_ops.write,allocate:ge.stream_ops.allocate,mmap:ge.stream_ops.mmap,msync:ge.stream_ops.msync}},link:{node:{getattr:ge.node_ops.getattr,setattr:ge.node_ops.setattr,readlink:ge.node_ops.readlink},stream:{}},chrdev:{node:{getattr:ge.node_ops.getattr,setattr:ge.node_ops.setattr},stream:pe.chrdev_stream_ops}});var n=pe.createNode(e,t,r,A);return pe.isDir(n.mode)?(n.node_ops=ge.ops_table.dir.node,n.stream_ops=ge.ops_table.dir.stream,n.contents={}):pe.isFile(n.mode)?(n.node_ops=ge.ops_table.file.node,n.stream_ops=ge.ops_table.file.stream,n.usedBytes=0,n.contents=null):pe.isLink(n.mode)?(n.node_ops=ge.ops_table.link.node,n.stream_ops=ge.ops_table.link.stream):pe.isChrdev(n.mode)&&(n.node_ops=ge.ops_table.chrdev.node,n.stream_ops=ge.ops_table.chrdev.stream),n.timestamp=Date.now(),e&&(e.contents[t]=n),n},getFileDataAsRegularArray:function(e){if(e.contents&&e.contents.subarray){for(var t=[],r=0;r=t)){t=Math.max(t,r*(r<1048576?2:1.125)>>>0),0!=r&&(t=Math.max(t,256));var A=e.contents;e.contents=new Uint8Array(t),e.usedBytes>0&&e.contents.set(A.subarray(0,e.usedBytes),0)}},resizeFileStorage:function(e,t){if(e.usedBytes!=t){if(0==t)return e.contents=null,void(e.usedBytes=0);if(!e.contents||e.contents.subarray){var r=e.contents;return e.contents=new Uint8Array(t),r&&e.contents.set(r.subarray(0,Math.min(t,e.usedBytes))),void(e.usedBytes=t)}if(e.contents||(e.contents=[]),e.contents.length>t)e.contents.length=t;else for(;e.contents.length=e.node.usedBytes)return 0;var i=Math.min(e.node.usedBytes-n,A);if(i>8&&o.subarray)t.set(o.subarray(n,n+i),r);else for(var s=0;s0||A+r>2)}catch(e){if(!e.code)throw e;throw new pe.ErrnoError(ue.convertNodeCode(e))}return t.mode},realPath:function(e){for(var t=[];e.parent!==e;)t.push(e.name),e=e.parent;return t.push(e.mount.opts.root),t.reverse(),ie.join.apply(null,t)},flagsForNode:function(e){e&=-2097153,e&=-2049,e&=-32769,e&=-524289;var t=0;for(var r in ue.flagsForNodeMap)e&r&&(t|=ue.flagsForNodeMap[r],e^=r);if(e)throw new pe.ErrnoError(28);return t},node_ops:{getattr:function(e){var t,r=ue.realPath(e);try{t=Ie.lstatSync(r)}catch(e){if(!e.code)throw e;throw new pe.ErrnoError(ue.convertNodeCode(e))}return ue.isWindows&&!t.blksize&&(t.blksize=4096),ue.isWindows&&!t.blocks&&(t.blocks=(t.size+t.blksize-1)/t.blksize|0),{dev:t.dev,ino:t.ino,mode:t.mode,nlink:t.nlink,uid:t.uid,gid:t.gid,rdev:t.rdev,size:t.size,atime:t.atime,mtime:t.mtime,ctime:t.ctime,blksize:t.blksize,blocks:t.blocks}},setattr:function(e,t){var r=ue.realPath(e);try{if(void 0!==t.mode&&(Ie.chmodSync(r,t.mode),e.mode=t.mode),void 0!==t.timestamp){var A=new Date(t.timestamp);Ie.utimesSync(r,A,A)}void 0!==t.size&&Ie.truncateSync(r,t.size)}catch(e){if(!e.code)throw e;throw new pe.ErrnoError(ue.convertNodeCode(e))}},lookup:function(e,t){var r=ie.join2(ue.realPath(e),t),A=ue.getMode(r);return ue.createNode(e,t,A)},mknod:function(e,t,r,A){var n=ue.createNode(e,t,r,A),o=ue.realPath(n);try{pe.isDir(n.mode)?Ie.mkdirSync(o,n.mode):Ie.writeFileSync(o,"",{mode:n.mode})}catch(e){if(!e.code)throw e;throw new pe.ErrnoError(ue.convertNodeCode(e))}return n},rename:function(e,t,r){var A=ue.realPath(e),n=ie.join2(ue.realPath(t),r);try{Ie.renameSync(A,n)}catch(e){if(!e.code)throw e;throw new pe.ErrnoError(ue.convertNodeCode(e))}e.name=r},unlink:function(e,t){var r=ie.join2(ue.realPath(e),t);try{Ie.unlinkSync(r)}catch(e){if(!e.code)throw e;throw new pe.ErrnoError(ue.convertNodeCode(e))}},rmdir:function(e,t){var r=ie.join2(ue.realPath(e),t);try{Ie.rmdirSync(r)}catch(e){if(!e.code)throw e;throw new pe.ErrnoError(ue.convertNodeCode(e))}},readdir:function(e){var t=ue.realPath(e);try{return Ie.readdirSync(t)}catch(e){if(!e.code)throw e;throw new pe.ErrnoError(ue.convertNodeCode(e))}},symlink:function(e,t,r){var A=ie.join2(ue.realPath(e),t);try{Ie.symlinkSync(r,A)}catch(e){if(!e.code)throw e;throw new pe.ErrnoError(ue.convertNodeCode(e))}},readlink:function(e){var t=ue.realPath(e);try{return t=Ie.readlinkSync(t),t=Ee.relative(Ee.resolve(e.mount.opts.root),t)}catch(e){if(!e.code)throw e;throw new pe.ErrnoError(ue.convertNodeCode(e))}}},stream_ops:{open:function(e){var t=ue.realPath(e.node);try{pe.isFile(e.node.mode)&&(e.nfd=Ie.openSync(t,ue.flagsForNode(e.flags)))}catch(e){if(!e.code)throw e;throw new pe.ErrnoError(ue.convertNodeCode(e))}},close:function(e){try{pe.isFile(e.node.mode)&&e.nfd&&Ie.closeSync(e.nfd)}catch(e){if(!e.code)throw e;throw new pe.ErrnoError(ue.convertNodeCode(e))}},read:function(e,t,r,A,n){if(0===A)return 0;try{return Ie.readSync(e.nfd,ue.bufferFrom(t.buffer),r,A,n)}catch(e){throw new pe.ErrnoError(ue.convertNodeCode(e))}},write:function(e,t,r,A,n){try{return Ie.writeSync(e.nfd,ue.bufferFrom(t.buffer),r,A,n)}catch(e){throw new pe.ErrnoError(ue.convertNodeCode(e))}},llseek:function(e,t,r){var A=t;if(1===r)A+=e.position;else if(2===r&&pe.isFile(e.node.mode))try{A+=Ie.fstatSync(e.nfd).size}catch(e){throw new pe.ErrnoError(ue.convertNodeCode(e))}if(A<0)throw new pe.ErrnoError(28);return A},mmap:function(e,t,r,A,n,o){if(E(0===t),!pe.isFile(e.node.mode))throw new pe.ErrnoError(43);var i=pe.mmapAlloc(r);return ue.stream_ops.read(e,N,i,r,A),{ptr:i,allocated:!0}},msync:function(e,t,r,A,n){if(!pe.isFile(e.node.mode))throw new pe.ErrnoError(43);if(2&n)return 0;ue.stream_ops.write(e,t,0,A,r,!1);return 0}}},he={lookupPath:function(e){return{path:e,node:{mode:ue.getMode(e)}}},createStandardStreams:function(){pe.streams[0]={fd:0,nfd:0,position:0,path:"",flags:0,tty:!0,seekable:!1};for(var e=1;e<3;e++)pe.streams[e]={fd:e,nfd:e,position:0,path:"",flags:577,tty:!0,seekable:!1}},cwd:function(){return process.cwd()},chdir:function(){process.chdir.apply(void 0,arguments)},mknod:function(e,t){pe.isDir(e)?Ie.mkdirSync(e,t):Ie.writeFileSync(e,"",{mode:t})},mkdir:function(){Ie.mkdirSync.apply(void 0,arguments)},symlink:function(){Ie.symlinkSync.apply(void 0,arguments)},rename:function(){Ie.renameSync.apply(void 0,arguments)},rmdir:function(){Ie.rmdirSync.apply(void 0,arguments)},readdir:function(){Ie.readdirSync.apply(void 0,arguments)},unlink:function(){Ie.unlinkSync.apply(void 0,arguments)},readlink:function(){return Ie.readlinkSync.apply(void 0,arguments)},stat:function(){return Ie.statSync.apply(void 0,arguments)},lstat:function(){return Ie.lstatSync.apply(void 0,arguments)},chmod:function(){Ie.chmodSync.apply(void 0,arguments)},fchmod:function(){Ie.fchmodSync.apply(void 0,arguments)},chown:function(){Ie.chownSync.apply(void 0,arguments)},fchown:function(){Ie.fchownSync.apply(void 0,arguments)},truncate:function(){Ie.truncateSync.apply(void 0,arguments)},ftruncate:function(){Ie.ftruncateSync.apply(void 0,arguments)},utime:function(){Ie.utimesSync.apply(void 0,arguments)},open:function(e,t,r,A){"string"==typeof t&&(t=ye.modeStringToFlags(t));var n=Ie.openSync(e,ue.flagsForNode(t),r),o=null!=A?A:pe.nextfd(n),i={fd:o,nfd:n,position:0,path:e,flags:t,seekable:!0};return pe.streams[o]=i,i},close:function(e){e.stream_ops||Ie.closeSync(e.nfd),pe.closeStream(e.fd)},llseek:function(e,t,r){if(e.stream_ops)return ye.llseek(e,t,r);var A=t;if(1===r)A+=e.position;else if(2===r)A+=Ie.fstatSync(e.nfd).size;else if(0!==r)throw new pe.ErrnoError(le.EINVAL);if(A<0)throw new pe.ErrnoError(le.EINVAL);return e.position=A,A},read:function(e,t,r,A,n){if(e.stream_ops)return ye.read(e,t,r,A,n);var o=void 0!==n;!o&&e.seekable&&(n=e.position);var i=Ie.readSync(e.nfd,ue.bufferFrom(t.buffer),r,A,n);return o||(e.position+=i),i},write:function(e,t,r,A,n){if(e.stream_ops)return ye.write(e,t,r,A,n);1024&e.flags&&pe.llseek(e,0,2);var o=void 0!==n;!o&&e.seekable&&(n=e.position);var i=Ie.writeSync(e.nfd,ue.bufferFrom(t.buffer),r,A,n);return o||(e.position+=i),i},allocate:function(){throw new pe.ErrnoError(le.EOPNOTSUPP)},mmap:function(){throw new pe.ErrnoError(le.ENODEV)},msync:function(){return 0},munmap:function(){return 0},ioctl:function(){throw new pe.ErrnoError(le.ENOTTY)}},pe={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:function(e){if(!(e instanceof pe.ErrnoError))throw e+" : "+ne();return se(e.errno)},lookupPath:function(e,t){if(t=t||{},!(e=ae.resolve(pe.cwd(),e)))return{path:"",node:null};var r={follow_mount:!0,recurse_count:0};for(var A in r)void 0===t[A]&&(t[A]=r[A]);if(t.recurse_count>8)throw new pe.ErrnoError(32);for(var n=ie.normalizeArray(e.split("/").filter((function(e){return!!e})),!1),o=pe.root,i="/",s=0;s40)throw new pe.ErrnoError(32)}}return{path:i,node:o}},getPath:function(e){for(var t;;){if(pe.isRoot(e)){var r=e.mount.mountpoint;return t?"/"!==r[r.length-1]?r+"/"+t:r+t:r}t=t?e.name+"/"+t:e.name,e=e.parent}},hashName:function(e,t){for(var r=0,A=0;A>>0)%pe.nameTable.length},hashAddNode:function(e){var t=pe.hashName(e.parent.id,e.name);e.name_next=pe.nameTable[t],pe.nameTable[t]=e},hashRemoveNode:function(e){var t=pe.hashName(e.parent.id,e.name);if(pe.nameTable[t]===e)pe.nameTable[t]=e.name_next;else for(var r=pe.nameTable[t];r;){if(r.name_next===e){r.name_next=e.name_next;break}r=r.name_next}},lookupNode:function(e,t){var r=pe.mayLookup(e);if(r)throw new pe.ErrnoError(r,e);for(var A=pe.hashName(e.id,t),n=pe.nameTable[A];n;n=n.name_next){var o=n.name;if(n.parent.id===e.id&&o===t)return n}return pe.lookup(e,t)},createNode:function(e,t,r,A){var n=new pe.FSNode(e,t,r,A);return pe.hashAddNode(n),n},destroyNode:function(e){pe.hashRemoveNode(e)},isRoot:function(e){return e===e.parent},isMountpoint:function(e){return!!e.mounted},isFile:function(e){return 32768==(61440&e)},isDir:function(e){return 16384==(61440&e)},isLink:function(e){return 40960==(61440&e)},isChrdev:function(e){return 8192==(61440&e)},isBlkdev:function(e){return 24576==(61440&e)},isFIFO:function(e){return 4096==(61440&e)},isSocket:function(e){return 49152==(49152&e)},flagModes:{r:0,rs:1052672,"r+":2,w:577,wx:705,xw:705,"w+":578,"wx+":706,"xw+":706,a:1089,ax:1217,xa:1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function(e){var t=pe.flagModes[e];if(void 0===t)throw new Error("Unknown file open mode: "+e);return t},flagsToPermissionString:function(e){var t=["r","w","rw"][3&e];return 512&e&&(t+="w"),t},nodePermissions:function(e,t){return pe.ignorePermissions||(-1===t.indexOf("r")||292&e.mode)&&(-1===t.indexOf("w")||146&e.mode)&&(-1===t.indexOf("x")||73&e.mode)?0:2},mayLookup:function(e){var t=pe.nodePermissions(e,"x");return t||(e.node_ops.lookup?0:2)},mayCreate:function(e,t){try{pe.lookupNode(e,t);return 20}catch(e){}return pe.nodePermissions(e,"wx")},mayDelete:function(e,t,r){var A;try{A=pe.lookupNode(e,t)}catch(e){return e.errno}var n=pe.nodePermissions(e,"wx");if(n)return n;if(r){if(!pe.isDir(A.mode))return 54;if(pe.isRoot(A)||pe.getPath(A)===pe.cwd())return 10}else if(pe.isDir(A.mode))return 31;return 0},mayOpen:function(e,t){return e?pe.isLink(e.mode)?32:pe.isDir(e.mode)&&("r"!==pe.flagsToPermissionString(t)||512&t)?31:pe.nodePermissions(e,pe.flagsToPermissionString(t)):44},MAX_OPEN_FDS:4096,nextfd:function(e,t){e=e||0,t=t||pe.MAX_OPEN_FDS;for(var r=e;r<=t;r++)if(!pe.streams[r])return r;throw new pe.ErrnoError(33)},getStream:function(e){return pe.streams[e]},createStream:function(e,t,r){pe.FSStream||(pe.FSStream=function(){},pe.FSStream.prototype={object:{get:function(){return this.node},set:function(e){this.node=e}},isRead:{get:function(){return 1!=(2097155&this.flags)}},isWrite:{get:function(){return 0!=(2097155&this.flags)}},isAppend:{get:function(){return 1024&this.flags}}});var A=new pe.FSStream;for(var n in e)A[n]=e[n];e=A;var o=pe.nextfd(t,r);return e.fd=o,pe.streams[o]=e,e},closeStream:function(e){pe.streams[e]=null},chrdev_stream_ops:{open:function(e){var t=pe.getDevice(e.node.rdev);e.stream_ops=t.stream_ops,e.stream_ops.open&&e.stream_ops.open(e)},llseek:function(){throw new pe.ErrnoError(70)}},major:function(e){return e>>8},minor:function(e){return 255&e},makedev:function(e,t){return e<<8|t},registerDevice:function(e,t){pe.devices[e]={stream_ops:t}},getDevice:function(e){return pe.devices[e]},getMounts:function(e){for(var t=[],r=[e];r.length;){var A=r.pop();t.push(A),r.push.apply(r,A.mounts)}return t},syncfs:function(e,t){"function"==typeof e&&(t=e,e=!1),pe.syncFSRequests++,pe.syncFSRequests>1&&p("warning: "+pe.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var r=pe.getMounts(pe.root.mount),A=0;function n(e){return pe.syncFSRequests--,t(e)}function o(e){if(e)return o.errored?void 0:(o.errored=!0,n(e));++A>=r.length&&n(null)}r.forEach((function(t){if(!t.type.syncfs)return o(null);t.type.syncfs(t,e,o)}))},mount:function(e,t,r){var A,n="/"===r,o=!r;if(n&&pe.root)throw new pe.ErrnoError(10);if(!n&&!o){var i=pe.lookupPath(r,{follow_mount:!1});if(r=i.path,A=i.node,pe.isMountpoint(A))throw new pe.ErrnoError(10);if(!pe.isDir(A.mode))throw new pe.ErrnoError(54)}var s={type:e,opts:t,mountpoint:r,mounts:[]},a=e.mount(s);return a.mount=s,s.root=a,n?pe.root=a:A&&(A.mounted=s,A.mount&&A.mount.mounts.push(s)),a},unmount:function(e){var t=pe.lookupPath(e,{follow_mount:!1});if(!pe.isMountpoint(t.node))throw new pe.ErrnoError(28);var r=t.node,A=r.mounted,n=pe.getMounts(A);Object.keys(pe.nameTable).forEach((function(e){for(var t=pe.nameTable[e];t;){var r=t.name_next;-1!==n.indexOf(t.mount)&&pe.destroyNode(t),t=r}})),r.mounted=null;var o=r.mount.mounts.indexOf(A);r.mount.mounts.splice(o,1)},lookup:function(e,t){return e.node_ops.lookup(e,t)},mknod:function(e,t,r){var A=pe.lookupPath(e,{parent:!0}).node,n=ie.basename(e);if(!n||"."===n||".."===n)throw new pe.ErrnoError(28);var o=pe.mayCreate(A,n);if(o)throw new pe.ErrnoError(o);if(!A.node_ops.mknod)throw new pe.ErrnoError(63);return A.node_ops.mknod(A,n,t,r)},create:function(e,t){return t=void 0!==t?t:438,t&=4095,t|=32768,pe.mknod(e,t,0)},mkdir:function(e,t){return t=void 0!==t?t:511,t&=1023,t|=16384,pe.mknod(e,t,0)},mkdirTree:function(e,t){for(var r=e.split("/"),A="",n=0;nthis.length-1||e<0)){var t=e%this.chunkSize,r=e/this.chunkSize|0;return this.getter(r)[t]}},o.prototype.setDataGetter=function(e){this.getter=e},o.prototype.cacheLength=function(){var e=new XMLHttpRequest;if(e.open("HEAD",r,!1),e.send(null),!(e.status>=200&&e.status<300||304===e.status))throw new Error("Couldn't load "+r+". Status: "+e.status);var t,A=Number(e.getResponseHeader("Content-length")),n=(t=e.getResponseHeader("Accept-Ranges"))&&"bytes"===t,o=(t=e.getResponseHeader("Content-Encoding"))&&"gzip"===t,i=1048576;n||(i=A);var s=this;s.setDataGetter((function(e){var t=e*i,n=(e+1)*i-1;if(n=Math.min(n,A-1),void 0===s.chunks[e]&&(s.chunks[e]=function(e,t){if(e>t)throw new Error("invalid range ("+e+", "+t+") or no bytes requested!");if(t>A-1)throw new Error("only "+A+" bytes available! programmer error!");var n=new XMLHttpRequest;if(n.open("GET",r,!1),A!==i&&n.setRequestHeader("Range","bytes="+e+"-"+t),"undefined"!=typeof Uint8Array&&(n.responseType="arraybuffer"),n.overrideMimeType&&n.overrideMimeType("text/plain; charset=x-user-defined"),n.send(null),!(n.status>=200&&n.status<300||304===n.status))throw new Error("Couldn't load "+r+". Status: "+n.status);return void 0!==n.response?new Uint8Array(n.response||[]):we(n.responseText||"",!0)}(t,n)),void 0===s.chunks[e])throw new Error("doXHR failed!");return s.chunks[e]})),!o&&A||(i=A=1,A=this.getter(0).length,i=A,h("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=A,this._chunkSize=i,this.lengthKnown=!0},"undefined"!=typeof XMLHttpRequest)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var i={isDevice:!1,url:r},s=pe.createFile(e,t,i,A,n);i.contents?s.contents=i.contents:i.url&&(s.contents=null,s.url=i.url),Object.defineProperties(s,{usedBytes:{get:function(){return this.contents.length}}});var a={};return Object.keys(s.stream_ops).forEach((function(e){var t=s.stream_ops[e];a[e]=function(){if(!pe.forceLoadFile(s))throw new pe.ErrnoError(29);return t.apply(null,arguments)}})),a.read=function(e,t,r,A,n){if(!pe.forceLoadFile(s))throw new pe.ErrnoError(29);var o=e.node.contents;if(n>=o.length)return 0;var i=Math.min(o.length-n,A);if(o.slice)for(var a=0;a>2]=A.dev,M[r+4>>2]=0,M[r+8>>2]=A.ino,M[r+12>>2]=A.mode,M[r+16>>2]=A.nlink,M[r+20>>2]=A.uid,M[r+24>>2]=A.gid,M[r+28>>2]=A.rdev,M[r+32>>2]=0,te=[A.size>>>0,(ee=A.size,+Y(ee)>=1?ee>0?(0|J(+H(ee/4294967296),4294967295))>>>0:~~+G((ee-+(~~ee>>>0))/4294967296)>>>0:0)],M[r+40>>2]=te[0],M[r+44>>2]=te[1],M[r+48>>2]=4096,M[r+52>>2]=A.blocks,M[r+56>>2]=A.atime.getTime()/1e3|0,M[r+60>>2]=0,M[r+64>>2]=A.mtime.getTime()/1e3|0,M[r+68>>2]=0,M[r+72>>2]=A.ctime.getTime()/1e3|0,M[r+76>>2]=0,te=[A.ino>>>0,(ee=A.ino,+Y(ee)>=1?ee>0?(0|J(+H(ee/4294967296),4294967295))>>>0:~~+G((ee-+(~~ee>>>0))/4294967296)>>>0:0)],M[r+80>>2]=te[0],M[r+84>>2]=te[1],0},doMsync:function(e,t,r,A,n){var o=F.slice(e,e+r);pe.msync(t,o,n,r,A)},doMkdir:function(e,t){return"/"===(e=ie.normalize(e))[e.length-1]&&(e=e.substr(0,e.length-1)),pe.mkdir(e,t,0),0},doMknod:function(e,t,r){switch(61440&t){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return pe.mknod(e,t,r),0},doReadlink:function(e,t,r){if(r<=0)return-28;var A=pe.readlink(e),n=Math.min(r,v(A)),o=N[t+n];return b(A,t,r+1),N[t+n]=o,n},doAccess:function(e,t){if(-8&t)return-28;var r;if(!(r=pe.lookupPath(e,{follow:!0}).node))return-44;var A="";return 4&t&&(A+="r"),2&t&&(A+="w"),1&t&&(A+="x"),A&&pe.nodePermissions(r,A)?-2:0},doDup:function(e,t,r){var A=pe.getStream(r);return A&&pe.close(A),pe.open(e,t,0,r,r).fd},doReadv:function(e,t,r,A){for(var n=0,o=0;o>2],s=M[t+(8*o+4)>>2],a=pe.read(e,N,i,s,A);if(a<0)return-1;if(n+=a,a>2],s=M[t+(8*o+4)>>2],a=pe.write(e,N,i,s,A);if(a<0)return-1;n+=a}return n},varargs:void 0,get:function(){return de.varargs+=4,M[de.varargs-4>>2]},getStr:function(e){return Q(e)},getStreamFromFD:function(e){var t=pe.getStream(e);if(!t)throw new pe.ErrnoError(8);return t},get64:function(e,t){return e}};function Ce(e){try{return C.grow(e-k.byteLength+65535>>>16),L(C.buffer),1}catch(e){}}var fe=function(e,t,r,A){e||(e=this),this.parent=e,this.mount=e.mount,this.mounted=null,this.id=pe.nextInode++,this.name=t,this.mode=r,this.node_ops={},this.stream_ops={},this.rdev=A};Object.defineProperties(fe.prototype,{read:{get:function(){return 365==(365&this.mode)},set:function(e){e?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146==(146&this.mode)},set:function(e){e?this.mode|=146:this.mode&=-147}},isFolder:{get:function(){return pe.isDir(this.mode)}},isDevice:{get:function(){return pe.isChrdev(this.mode)}}}),pe.FSNode=fe,pe.staticInit();var Ie=n,Ee=r(85622);ue.staticInit();var Be=function(e){return function(){try{return e.apply(this,arguments)}catch(e){if(!e.code)throw e;throw new pe.ErrnoError(le[e.code])}}},ye=Object.assign({},pe);for(var me in he)pe[me]=Be(he[me]);function we(e,t,r){var A=r>0?r:v(e)+1,n=new Array(A),o=D(e,n,0,n.length);return t&&(n.length=o),n}"function"==typeof atob&&atob;function Qe(e){if(Z(e))return function(e){var t;try{t=Buffer.from(e,"base64")}catch(r){t=new Buffer(e,"base64")}return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}(e.slice("data:application/octet-stream;base64,".length))}var De,be={m:function(e,t){return oe(e,t)},b:f,r:function(e,t){try{return e=de.getStr(e),pe.chmod(e,t),0}catch(e){return void 0!==pe&&e instanceof pe.ErrnoError||_(e),-e.errno}},g:function(e,t,r){de.varargs=r;try{var A=de.getStreamFromFD(e);switch(t){case 0:return(n=de.get())<0?-28:pe.open(A.path,A.flags,0,n).fd;case 1:case 2:return 0;case 3:return A.flags;case 4:var n=de.get();return A.flags|=n,0;case 12:n=de.get();return K[n+0>>1]=2,0;case 13:case 14:return 0;case 16:case 8:return-28;case 9:return se(28),-1;default:return-28}}catch(e){return void 0!==pe&&e instanceof pe.ErrnoError||_(e),-e.errno}},l:function(e,t){try{var r=de.getStreamFromFD(e);return de.doStat(pe.stat,r.path,t)}catch(e){return void 0!==pe&&e instanceof pe.ErrnoError||_(e),-e.errno}},q:function(e,t,r){de.varargs=r;try{var A=de.getStreamFromFD(e);switch(t){case 21509:case 21505:return A.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return A.tty?0:-59;case 21519:if(!A.tty)return-59;var n=de.get();return M[n>>2]=0,0;case 21520:return A.tty?-28:-59;case 21531:n=de.get();return pe.ioctl(A,t,n);case 21523:case 21524:return A.tty?0:-59;default:_("bad ioctl syscall "+t)}}catch(e){return void 0!==pe&&e instanceof pe.ErrnoError||_(e),-e.errno}},t:function(e,t,r){de.varargs=r;try{var A=de.getStr(e),n=de.get();return pe.open(A,t,n).fd}catch(e){return void 0!==pe&&e instanceof pe.ErrnoError||_(e),-e.errno}},s:function(e,t,r){try{var A=de.getStreamFromFD(e);return pe.read(A,N,t,r)}catch(e){return void 0!==pe&&e instanceof pe.ErrnoError||_(e),-e.errno}},j:function(e,t){try{return e=de.getStr(e),t=de.getStr(t),pe.rename(e,t),0}catch(e){return void 0!==pe&&e instanceof pe.ErrnoError||_(e),-e.errno}},u:function(e){try{return e=de.getStr(e),pe.rmdir(e),0}catch(e){return void 0!==pe&&e instanceof pe.ErrnoError||_(e),-e.errno}},e:function(e,t){try{return e=de.getStr(e),de.doStat(pe.stat,e,t)}catch(e){return void 0!==pe&&e instanceof pe.ErrnoError||_(e),-e.errno}},i:function(e){try{return e=de.getStr(e),pe.unlink(e),0}catch(e){return void 0!==pe&&e instanceof pe.ErrnoError||_(e),-e.errno}},v:function(e,t,r){F.copyWithin(e,t,t+r)},w:function(e){e>>>=0;var t=F.length;if(e>2147483648)return!1;for(var r,A,n=1;n<=4;n*=2){var o=t*(1+.2/n);if(o=Math.min(o,e+100663296),Ce(Math.min(2147483648,((r=Math.max(16777216,e,o))%(A=65536)>0&&(r+=A-r%A),r))))return!0}return!1},h:function(e){try{var t=de.getStreamFromFD(e);return pe.close(t),0}catch(e){return void 0!==pe&&e instanceof pe.ErrnoError||_(e),e.errno}},k:function(e,t){try{var r=de.getStreamFromFD(e),A=r.tty?2:pe.isDir(r.mode)?3:pe.isLink(r.mode)?7:4;return N[t>>0]=A,0}catch(e){return void 0!==pe&&e instanceof pe.ErrnoError||_(e),e.errno}},p:function(e,t,r,A){try{var n=de.getStreamFromFD(e),o=de.doReadv(n,t,r);return M[A>>2]=o,0}catch(e){return void 0!==pe&&e instanceof pe.ErrnoError||_(e),e.errno}},n:function(e,t,r,A,n){try{var o=de.getStreamFromFD(e),i=4294967296*r+(t>>>0);return i<=-9007199254740992||i>=9007199254740992?-61:(pe.llseek(o,i,A),te=[o.position>>>0,(ee=o.position,+Y(ee)>=1?ee>0?(0|J(+H(ee/4294967296),4294967295))>>>0:~~+G((ee-+(~~ee>>>0))/4294967296)>>>0:0)],M[n>>2]=te[0],M[n+4>>2]=te[1],o.getdents&&0===i&&0===A&&(o.getdents=null),0)}catch(e){return void 0!==pe&&e instanceof pe.ErrnoError||_(e),e.errno}},f:function(e,t,r,A){try{var n=de.getStreamFromFD(e),o=de.doWritev(n,t,r);return M[A>>2]=o,0}catch(e){return void 0!==pe&&e instanceof pe.ErrnoError||_(e),e.errno}},a:C,c:function(e){0|e},d:function(e){var t=Date.now()/1e3|0;return e&&(M[e>>2]=t),t},o:function(e){!function e(){if(!e.called){e.called=!0,M[Ke()>>2]=60*(new Date).getTimezoneOffset();var t=(new Date).getFullYear(),r=new Date(t,0,1),A=new Date(t,6,1);M[Fe()>>2]=Number(r.getTimezoneOffset()!=A.getTimezoneOffset());var n=a(r),o=a(A),i=S(n),s=S(o);A.getTimezoneOffset()>2]=i,M[Ne()+4>>2]=s):(M[Ne()>>2]=s,M[Ne()+4>>2]=i)}function a(e){var t=e.toTimeString().match(/\(([A-Za-z ]+)\)$/);return t?t[1]:"GMT"}}();var t=Date.UTC(M[e+20>>2]+1900,M[e+16>>2],M[e+12>>2],M[e+8>>2],M[e+4>>2],M[e>>2],0),r=new Date(t);M[e+24>>2]=r.getUTCDay();var A=Date.UTC(r.getUTCFullYear(),0,1,0,0,0,0),n=(r.getTime()-A)/864e5|0;return M[e+28>>2]=n,r.getTime()/1e3|0}},ve=function(){var e={a:be};function t(e,t){var r=e.exports;o.asm=r,X()}if(V(),o.instantiateWasm)try{return o.instantiateWasm(e,t)}catch(e){return p("Module.instantiateWasm callback failed with error: "+e),!1}return function(){var r,A,n;try{n=function(){try{if(d)return new Uint8Array(d);var e=Qe(re);if(e)return e;if(a)return a(re);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(e){_(e)}}(),A=new WebAssembly.Module(n),r=new WebAssembly.Instance(A,e)}catch(e){var o=e.toString();throw p("failed to compile wasm module: "+o),(o.indexOf("imported Memory")>=0||o.indexOf("memory import")>=0)&&p("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),e}t(r)}(),o.asm}(),Se=o.___wasm_call_ctors=ve.x,ke=(o._zipstruct_stat=ve.y,o._zipstruct_statS=ve.z,o._zipstruct_stat_name=ve.A,o._zipstruct_stat_index=ve.B,o._zipstruct_stat_size=ve.C,o._zipstruct_stat_mtime=ve.D,o._zipstruct_error=ve.E,o._zipstruct_errorS=ve.F,o._zipstruct_error_code_zip=ve.G,o._zipstruct_stat_comp_size=ve.H,o._zipstruct_stat_comp_method=ve.I,o._zip_close=ve.J,o._zip_delete=ve.K,o._zip_dir_add=ve.L,o._zip_discard=ve.M,o._zip_error_init_with_code=ve.N,o._zip_get_error=ve.O,o._zip_file_get_error=ve.P,o._zip_error_strerror=ve.Q,o._zip_fclose=ve.R,o._zip_file_add=ve.S,o._zip_file_get_external_attributes=ve.T,o._zip_file_set_external_attributes=ve.U,o._zip_file_set_mtime=ve.V,o._zip_fopen=ve.W,o._zip_fopen_index=ve.X,o._zip_fread=ve.Y,o._zip_get_name=ve.Z,o._zip_get_num_entries=ve._,o._zip_name_locate=ve.$,o._zip_open=ve.aa,o._zip_open_from_source=ve.ba,o._zip_set_file_compression=ve.ca,o._zip_source_buffer=ve.da,o._zip_source_buffer_create=ve.ea,o._zip_source_close=ve.fa,o._zip_source_error=ve.ga,o._zip_source_free=ve.ha,o._zip_source_keep=ve.ia,o._zip_source_open=ve.ja,o._zip_source_read=ve.ka,o._zip_source_seek=ve.la,o._zip_source_set_mtime=ve.ma,o._zip_source_tell=ve.na,o._zip_stat=ve.oa,o._zip_stat_index=ve.pa,o._zip_ext_count_symlinks=ve.qa,o.___errno_location=ve.ra),Ne=o.__get_tzname=ve.sa,Fe=o.__get_daylight=ve.ta,Ke=o.__get_timezone=ve.ua,Me=o.stackSave=ve.va,Re=o.stackRestore=ve.wa,xe=o.stackAlloc=ve.xa,Le=o._malloc=ve.ya;o._free=ve.za;function Pe(e){function t(){De||(De=!0,o.calledRun=!0,I||(!0,o.noFSInit||pe.init.initialized||pe.init(),ce.init(),Ae(U),pe.ignorePermissions=!1,Ae(T),o.onRuntimeInitialized&&o.onRuntimeInitialized(),function(){if(o.postRun)for("function"==typeof o.postRun&&(o.postRun=[o.postRun]);o.postRun.length;)e=o.postRun.shift(),j.unshift(e);var e;Ae(j)}()))}e=e||l,q>0||(!function(){if(o.preRun)for("function"==typeof o.preRun&&(o.preRun=[o.preRun]);o.preRun.length;)e=o.preRun.shift(),O.unshift(e);var e;Ae(O)}(),q>0||(o.setStatus?(o.setStatus("Running..."),setTimeout((function(){setTimeout((function(){o.setStatus("")}),1),t()}),1)):t()))}if(o.cwrap=function(e,t,r,A){var n=(r=r||[]).every((function(e){return"number"===e}));return"string"!==t&&n&&!A?B(e):function(){return y(e,t,r,arguments)}},o.getValue=function(e,t,r){switch("*"===(t=t||"i8").charAt(t.length-1)&&(t="i32"),t){case"i1":case"i8":return N[e>>0];case"i16":return K[e>>1];case"i32":case"i64":return M[e>>2];case"float":return R[e>>2];case"double":return x[e>>3];default:_("invalid type for getValue: "+t)}return null},W=function e(){De||Pe(),De||(W=e)},o.run=Pe,o.preInit)for("function"==typeof o.preInit&&(o.preInit=[o.preInit]);o.preInit.length>0;)o.preInit.pop()();Pe()},98261:e=>{"use strict";function t(e,r,A,n){this.message=e,this.expected=r,this.found=A,this.location=n,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t)}!function(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}(t,Error),t.buildMessage=function(e,t){var r={literal:function(e){return`"${n(e.text)}"`},class:function(e){var t,r="";for(t=0;t0){for(t=1,A=1;tf&&(f=p,I=[]),I.push(e))}function Q(e,r,A){return new t(t.buildMessage(e,r),e,r,A)}function D(){var t,r,A,o;return t=p,(r=b())!==n?(47===e.charCodeAt(p)?(A="/",p++):(A=n,w(s)),A!==n&&(o=b())!==n?(d=t,t=r={from:r,descriptor:o}):(p=t,t=n)):(p=t,t=n),t===n&&(t=p,(r=b())!==n&&(d=t,r=function(e){return{descriptor:e}}(r)),t=r),t}function b(){var t,r,A,o;return t=p,(r=v())!==n?(64===e.charCodeAt(p)?(A="@",p++):(A=n,w(a)),A!==n&&(o=function(){var t,r,A;t=p,r=[],u.test(e.charAt(p))?(A=e.charAt(p),p++):(A=n,w(h));if(A!==n)for(;A!==n;)r.push(A),u.test(e.charAt(p))?(A=e.charAt(p),p++):(A=n,w(h));else r=n;r!==n&&(d=t,r=c());return t=r}())!==n?(d=t,t=r={fullName:r,description:o}):(p=t,t=n)):(p=t,t=n),t===n&&(t=p,(r=v())!==n&&(d=t,r=function(e){return{fullName:e}}(r)),t=r),t}function v(){var t,r,A;return t=p,64===e.charCodeAt(p)?(r="@",p++):(r=n,w(a)),r!==n&&S()!==n?(47===e.charCodeAt(p)?(A="/",p++):(A=n,w(s)),A!==n&&S()!==n?(d=t,t=r=c()):(p=t,t=n)):(p=t,t=n),t===n&&(t=p,(r=S())!==n&&(d=t,r=c()),t=r),t}function S(){var t,r,A;if(t=p,r=[],g.test(e.charAt(p))?(A=e.charAt(p),p++):(A=n,w(l)),A!==n)for(;A!==n;)r.push(A),g.test(e.charAt(p))?(A=e.charAt(p),p++):(A=n,w(l));else r=n;return r!==n&&(d=t,r=c()),t=r}if((A=i())!==n&&p===e.length)return A;throw A!==n&&p{"use strict";function t(e,r,A,n){this.message=e,this.expected=r,this.found=A,this.location=n,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t)}!function(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}(t,Error),t.buildMessage=function(e,t){var r={literal:function(e){return'"'+n(e.text)+'"'},class:function(e){var t,r="";for(t=0;t0){for(t=1,A=1;t>",!1),I=le(">&",!1),E=le(">",!1),B=le("<<<",!1),y=le("<&",!1),m=le("<",!1),w=le("'",!1),Q=le('"',!1),D=function(e){return{type:"text",text:e}},b=le("\\",!1),v={type:"any"},S=/^[^']/,k=ue(["'"],!0,!1),N=function(e){return e.join("")},F=/^[^$"]/,K=ue(["$",'"'],!0,!1),M=le("-",!1),R=le("+",!1),x=/^[0-9]/,L=ue([["0","9"]],!1,!1),P=le(".",!1),O=le("*",!1),U=le("/",!1),T=le("$((",!1),j=le("))",!1),Y=le("$(",!1),G=le("${",!1),H=le(":-",!1),J=le(":-}",!1),q=function(e){return{name:e}},z=le("$",!1),W=/^[a-zA-Z0-9_]/,V=ue([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),X=function(){return e.substring(ie,oe)},_=/^[$@*?#a-zA-Z0-9_\-]/,Z=ue(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),$=/^[(){}<>$|&; \t"']/,ee=ue(["(",")","{","}","<",">","$","|","&",";"," ","\t",'"',"'"],!1,!1),te=/^[<>&; \t"']/,re=ue(["<",">","&",";"," ","\t",'"',"'"],!1,!1),Ae=/^[ \t]/,ne=ue([" ","\t"],!1,!1),oe=0,ie=0,se=[{line:1,column:1}],ae=0,ce=[],ge=0;if("startRule"in r){if(!(r.startRule in o))throw new Error("Can't start parsing from rule \""+r.startRule+'".');i=o[r.startRule]}function le(e,t){return{type:"literal",text:e,ignoreCase:t}}function ue(e,t,r){return{type:"class",parts:e,inverted:t,ignoreCase:r}}function he(t){var r,A=se[t];if(A)return A;for(r=t-1;!se[r];)r--;for(A={line:(A=se[r]).line,column:A.column};rae&&(ae=oe,ce=[]),ce.push(e))}function Ce(e,r,A){return new t(t.buildMessage(e,r),e,r,A)}function fe(){var e,t;return e=oe,(t=Ie())===n&&(t=null),t!==n&&(ie=e,t=t||[]),e=t}function Ie(){var e,t,r,A,o;if(e=oe,(t=Be())!==n){for(r=[],A=Te();A!==n;)r.push(A),A=Te();r!==n&&(A=Ee())!==n?((o=function(){var e,t,r,A,o;e=oe,t=[],r=Te();for(;r!==n;)t.push(r),r=Te();if(t!==n)if((r=Ie())!==n){for(A=[],o=Te();o!==n;)A.push(o),o=Te();A!==n?(ie=e,e=t=r):(oe=e,e=n)}else oe=e,e=n;else oe=e,e=n;return e}())===n&&(o=null),o!==n?(ie=e,e=t=[t].concat(o||[])):(oe=e,e=n)):(oe=e,e=n)}else oe=e,e=n;if(e===n)if(e=oe,(t=Be())!==n){for(r=[],A=Te();A!==n;)r.push(A),A=Te();r!==n?((A=Ee())===n&&(A=null),A!==n?(ie=e,e=t=function(e,t){return[e]}(t)):(oe=e,e=n)):(oe=e,e=n)}else oe=e,e=n;return e}function Ee(){var t;return 59===e.charCodeAt(oe)?(t=";",oe++):(t=n,0===ge&&de(s)),t}function Be(){var t,r,A,o,i;return t=oe,(r=ye())!==n?((A=function(){var t,r,A,o,i,s,g;t=oe,r=[],A=Te();for(;A!==n;)r.push(A),A=Te();if(r!==n)if((A=function(){var t;"&&"===e.substr(oe,2)?(t="&&",oe+=2):(t=n,0===ge&&de(a));t===n&&("||"===e.substr(oe,2)?(t="||",oe+=2):(t=n,0===ge&&de(c)));return t}())!==n){for(o=[],i=Te();i!==n;)o.push(i),i=Te();if(o!==n)if((i=Be())!==n){for(s=[],g=Te();g!==n;)s.push(g),g=Te();s!==n?(ie=t,t=r={type:A,line:i}):(oe=t,t=n)}else oe=t,t=n;else oe=t,t=n}else oe=t,t=n;else oe=t,t=n;return t}())===n&&(A=null),A!==n?(ie=t,o=r,t=r=(i=A)?{chain:o,then:i}:{chain:o}):(oe=t,t=n)):(oe=t,t=n),t}function ye(){var t,r,A,o,i;return t=oe,(r=function(){var t,r,A,o,i,s,a,c,g,l,u;t=oe,r=[],A=Te();for(;A!==n;)r.push(A),A=Te();if(r!==n)if(40===e.charCodeAt(oe)?(A="(",oe++):(A=n,0===ge&&de(h)),A!==n){for(o=[],i=Te();i!==n;)o.push(i),i=Te();if(o!==n)if((i=Ie())!==n){for(s=[],a=Te();a!==n;)s.push(a),a=Te();if(s!==n)if(41===e.charCodeAt(oe)?(a=")",oe++):(a=n,0===ge&&de(p)),a!==n){for(c=[],g=Te();g!==n;)c.push(g),g=Te();if(c!==n){for(g=[],l=Qe();l!==n;)g.push(l),l=Qe();if(g!==n){for(l=[],u=Te();u!==n;)l.push(u),u=Te();l!==n?(ie=t,t=r={type:"subshell",subshell:i,args:g}):(oe=t,t=n)}else oe=t,t=n}else oe=t,t=n}else oe=t,t=n;else oe=t,t=n}else oe=t,t=n;else oe=t,t=n}else oe=t,t=n;else oe=t,t=n;if(t===n){for(t=oe,r=[],A=Te();A!==n;)r.push(A),A=Te();if(r!==n)if(123===e.charCodeAt(oe)?(A="{",oe++):(A=n,0===ge&&de(d)),A!==n){for(o=[],i=Te();i!==n;)o.push(i),i=Te();if(o!==n)if((i=Ie())!==n){for(s=[],a=Te();a!==n;)s.push(a),a=Te();if(s!==n)if(125===e.charCodeAt(oe)?(a="}",oe++):(a=n,0===ge&&de(C)),a!==n){for(c=[],g=Te();g!==n;)c.push(g),g=Te();if(c!==n){for(g=[],l=Qe();l!==n;)g.push(l),l=Qe();if(g!==n){for(l=[],u=Te();u!==n;)l.push(u),u=Te();l!==n?(ie=t,r=function(e,t){return{type:"group",group:e,args:t}}(i,g),t=r):(oe=t,t=n)}else oe=t,t=n}else oe=t,t=n}else oe=t,t=n;else oe=t,t=n}else oe=t,t=n;else oe=t,t=n}else oe=t,t=n;else oe=t,t=n;if(t===n){for(t=oe,r=[],A=Te();A!==n;)r.push(A),A=Te();if(r!==n){for(A=[],o=me();o!==n;)A.push(o),o=me();if(A!==n){for(o=[],i=Te();i!==n;)o.push(i),i=Te();if(o!==n){if(i=[],(s=we())!==n)for(;s!==n;)i.push(s),s=we();else i=n;if(i!==n){for(s=[],a=Te();a!==n;)s.push(a),a=Te();s!==n?(ie=t,r=function(e,t){return{type:"command",args:t,envs:e}}(A,i),t=r):(oe=t,t=n)}else oe=t,t=n}else oe=t,t=n}else oe=t,t=n}else oe=t,t=n;if(t===n){for(t=oe,r=[],A=Te();A!==n;)r.push(A),A=Te();if(r!==n){if(A=[],(o=me())!==n)for(;o!==n;)A.push(o),o=me();else A=n;if(A!==n){for(o=[],i=Te();i!==n;)o.push(i),i=Te();o!==n?(ie=t,t=r={type:"envs",envs:A}):(oe=t,t=n)}else oe=t,t=n}else oe=t,t=n}}}return t}())!==n?((A=function(){var t,r,A,o,i,s,a;t=oe,r=[],A=Te();for(;A!==n;)r.push(A),A=Te();if(r!==n)if((A=function(){var t;"|&"===e.substr(oe,2)?(t="|&",oe+=2):(t=n,0===ge&&de(g));t===n&&(124===e.charCodeAt(oe)?(t="|",oe++):(t=n,0===ge&&de(l)));return t}())!==n){for(o=[],i=Te();i!==n;)o.push(i),i=Te();if(o!==n)if((i=ye())!==n){for(s=[],a=Te();a!==n;)s.push(a),a=Te();s!==n?(ie=t,t=r={type:A,chain:i}):(oe=t,t=n)}else oe=t,t=n;else oe=t,t=n}else oe=t,t=n;else oe=t,t=n;return t}())===n&&(A=null),A!==n?(ie=t,o=r,t=r=(i=A)?{...o,then:i}:o):(oe=t,t=n)):(oe=t,t=n),t}function me(){var t,r,A,o,i,s;if(t=oe,(r=Le())!==n)if(61===e.charCodeAt(oe)?(A="=",oe++):(A=n,0===ge&&de(u)),A!==n)if((o=be())!==n){for(i=[],s=Te();s!==n;)i.push(s),s=Te();i!==n?(ie=t,t=r={name:r,args:[o]}):(oe=t,t=n)}else oe=t,t=n;else oe=t,t=n;else oe=t,t=n;if(t===n)if(t=oe,(r=Le())!==n)if(61===e.charCodeAt(oe)?(A="=",oe++):(A=n,0===ge&&de(u)),A!==n){for(o=[],i=Te();i!==n;)o.push(i),i=Te();o!==n?(ie=t,t=r=function(e){return{name:e,args:[]}}(r)):(oe=t,t=n)}else oe=t,t=n;else oe=t,t=n;return t}function we(){var e,t,r;for(e=oe,t=[],r=Te();r!==n;)t.push(r),r=Te();if(t!==n&&(r=Qe())!==n?(ie=e,e=t=r):(oe=e,e=n),e===n){for(e=oe,t=[],r=Te();r!==n;)t.push(r),r=Te();t!==n&&(r=De())!==n?(ie=e,e=t=r):(oe=e,e=n)}return e}function Qe(){var t,r,A,o;for(t=oe,r=[],A=Te();A!==n;)r.push(A),A=Te();return r!==n&&(A=function(){var t;">>"===e.substr(oe,2)?(t=">>",oe+=2):(t=n,0===ge&&de(f));t===n&&(">&"===e.substr(oe,2)?(t=">&",oe+=2):(t=n,0===ge&&de(I)),t===n&&(62===e.charCodeAt(oe)?(t=">",oe++):(t=n,0===ge&&de(E)),t===n&&("<<<"===e.substr(oe,3)?(t="<<<",oe+=3):(t=n,0===ge&&de(B)),t===n&&("<&"===e.substr(oe,2)?(t="<&",oe+=2):(t=n,0===ge&&de(y)),t===n&&(60===e.charCodeAt(oe)?(t="<",oe++):(t=n,0===ge&&de(m)))))));return t}())!==n&&(o=De())!==n?(ie=t,t=r={type:"redirection",subtype:A,args:[o]}):(oe=t,t=n),t}function De(){var e,t,r;for(e=oe,t=[],r=Te();r!==n;)t.push(r),r=Te();return t!==n&&(r=be())!==n?(ie=e,e=t=r):(oe=e,e=n),e}function be(){var e,t,r,A;if(e=oe,t=[],(r=ve())!==n)for(;r!==n;)t.push(r),r=ve();else t=n;return t!==n&&(ie=e,A=t,t={type:"argument",segments:[].concat(...A)}),e=t}function ve(){var t,r;return t=oe,(r=function(){var t,r,A,o;t=oe,39===e.charCodeAt(oe)?(r="'",oe++):(r=n,0===ge&&de(w));r!==n&&(A=function(){var t,r,A,o,i;t=oe,r=[],A=oe,92===e.charCodeAt(oe)?(o="\\",oe++):(o=n,0===ge&&de(b));o!==n?(e.length>oe?(i=e.charAt(oe),oe++):(i=n,0===ge&&de(v)),i!==n?(ie=A,A=o=i):(oe=A,A=n)):(oe=A,A=n);A===n&&(S.test(e.charAt(oe))?(A=e.charAt(oe),oe++):(A=n,0===ge&&de(k)));for(;A!==n;)r.push(A),A=oe,92===e.charCodeAt(oe)?(o="\\",oe++):(o=n,0===ge&&de(b)),o!==n?(e.length>oe?(i=e.charAt(oe),oe++):(i=n,0===ge&&de(v)),i!==n?(ie=A,A=o=i):(oe=A,A=n)):(oe=A,A=n),A===n&&(S.test(e.charAt(oe))?(A=e.charAt(oe),oe++):(A=n,0===ge&&de(k)));r!==n&&(ie=t,r=N(r));return t=r}())!==n?(39===e.charCodeAt(oe)?(o="'",oe++):(o=n,0===ge&&de(w)),o!==n?(ie=t,r=function(e){return[{type:"text",text:e}]}(A),t=r):(oe=t,t=n)):(oe=t,t=n);return t}())!==n&&(ie=t,r=r),(t=r)===n&&(t=oe,(r=function(){var t,r,A,o;t=oe,34===e.charCodeAt(oe)?(r='"',oe++):(r=n,0===ge&&de(Q));if(r!==n){for(A=[],o=Se();o!==n;)A.push(o),o=Se();A!==n?(34===e.charCodeAt(oe)?(o='"',oe++):(o=n,0===ge&&de(Q)),o!==n?(ie=t,t=r=A):(oe=t,t=n)):(oe=t,t=n)}else oe=t,t=n;return t}())!==n&&(ie=t,r=r),(t=r)===n&&(t=oe,(r=function(){var e,t,r;if(e=oe,t=[],(r=ke())!==n)for(;r!==n;)t.push(r),r=ke();else t=n;t!==n&&(ie=e,t=t);return e=t}())!==n&&(ie=t,r=r),t=r)),t}function Se(){var t,r,A;return t=oe,(r=Me())!==n&&(ie=t,r={type:"arithmetic",arithmetic:r,quoted:!0}),(t=r)===n&&(t=oe,(r=Re())!==n&&(ie=t,r={type:"shell",shell:r,quoted:!0}),(t=r)===n&&(t=oe,(r=xe())!==n&&(ie=t,A=r,r={type:"variable",...A,quoted:!0}),(t=r)===n&&(t=oe,(r=function(){var t,r,A,o,i;t=oe,r=[],A=oe,92===e.charCodeAt(oe)?(o="\\",oe++):(o=n,0===ge&&de(b));o!==n?(e.length>oe?(i=e.charAt(oe),oe++):(i=n,0===ge&&de(v)),i!==n?(ie=A,A=o=i):(oe=A,A=n)):(oe=A,A=n);A===n&&(F.test(e.charAt(oe))?(A=e.charAt(oe),oe++):(A=n,0===ge&&de(K)));if(A!==n)for(;A!==n;)r.push(A),A=oe,92===e.charCodeAt(oe)?(o="\\",oe++):(o=n,0===ge&&de(b)),o!==n?(e.length>oe?(i=e.charAt(oe),oe++):(i=n,0===ge&&de(v)),i!==n?(ie=A,A=o=i):(oe=A,A=n)):(oe=A,A=n),A===n&&(F.test(e.charAt(oe))?(A=e.charAt(oe),oe++):(A=n,0===ge&&de(K)));else r=n;r!==n&&(ie=t,r=N(r));return t=r}())!==n&&(ie=t,r=D(r)),t=r))),t}function ke(){var t,A,o;return t=oe,(A=Me())!==n&&(ie=t,A={type:"arithmetic",arithmetic:A,quoted:!1}),(t=A)===n&&(t=oe,(A=Re())!==n&&(ie=t,A={type:"shell",shell:A,quoted:!1}),(t=A)===n&&(t=oe,(A=xe())!==n&&(ie=t,o=A,A={type:"variable",...o,quoted:!1}),(t=A)===n&&(t=oe,(A=function(){var t,A;t=oe,(A=function(){var t,r,A,o,i;t=oe,r=[],A=oe,o=oe,ge++,i=Ue(),ge--,i===n?o=void 0:(oe=o,o=n);o!==n?(e.length>oe?(i=e.charAt(oe),oe++):(i=n,0===ge&&de(v)),i!==n?(ie=A,A=o=i):(oe=A,A=n)):(oe=A,A=n);if(A!==n)for(;A!==n;)r.push(A),A=oe,o=oe,ge++,i=Ue(),ge--,i===n?o=void 0:(oe=o,o=n),o!==n?(e.length>oe?(i=e.charAt(oe),oe++):(i=n,0===ge&&de(v)),i!==n?(ie=A,A=o=i):(oe=A,A=n)):(oe=A,A=n);else r=n;r!==n&&(ie=t,r=N(r));return t=r}())!==n?(ie=oe,o=A,(r.isGlobPattern(o)?void 0:n)!==n?(ie=t,t=A=A):(oe=t,t=n)):(oe=t,t=n);var o;return t}())!==n&&(ie=t,A={type:"glob",pattern:A}),(t=A)===n&&(t=oe,(A=function(){var t,r,A,o,i;t=oe,r=[],A=oe,92===e.charCodeAt(oe)?(o="\\",oe++):(o=n,0===ge&&de(b));o!==n?(e.length>oe?(i=e.charAt(oe),oe++):(i=n,0===ge&&de(v)),i!==n?(ie=A,A=o=i):(oe=A,A=n)):(oe=A,A=n);A===n&&(A=oe,o=oe,ge++,i=Oe(),ge--,i===n?o=void 0:(oe=o,o=n),o!==n?(e.length>oe?(i=e.charAt(oe),oe++):(i=n,0===ge&&de(v)),i!==n?(ie=A,A=o=i):(oe=A,A=n)):(oe=A,A=n));if(A!==n)for(;A!==n;)r.push(A),A=oe,92===e.charCodeAt(oe)?(o="\\",oe++):(o=n,0===ge&&de(b)),o!==n?(e.length>oe?(i=e.charAt(oe),oe++):(i=n,0===ge&&de(v)),i!==n?(ie=A,A=o=i):(oe=A,A=n)):(oe=A,A=n),A===n&&(A=oe,o=oe,ge++,i=Oe(),ge--,i===n?o=void 0:(oe=o,o=n),o!==n?(e.length>oe?(i=e.charAt(oe),oe++):(i=n,0===ge&&de(v)),i!==n?(ie=A,A=o=i):(oe=A,A=n)):(oe=A,A=n));else r=n;r!==n&&(ie=t,r=N(r));return t=r}())!==n&&(ie=t,A=D(A)),t=A)))),t}function Ne(){var t,r,A,o,i,s,a,c;if(t=oe,45===e.charCodeAt(oe)?(r="-",oe++):(r=n,0===ge&&de(M)),r===n&&(43===e.charCodeAt(oe)?(r="+",oe++):(r=n,0===ge&&de(R))),r===n&&(r=null),r!==n){if(A=[],x.test(e.charAt(oe))?(o=e.charAt(oe),oe++):(o=n,0===ge&&de(L)),o!==n)for(;o!==n;)A.push(o),x.test(e.charAt(oe))?(o=e.charAt(oe),oe++):(o=n,0===ge&&de(L));else A=n;if(A!==n)if(46===e.charCodeAt(oe)?(o=".",oe++):(o=n,0===ge&&de(P)),o!==n){if(i=[],x.test(e.charAt(oe))?(s=e.charAt(oe),oe++):(s=n,0===ge&&de(L)),s!==n)for(;s!==n;)i.push(s),x.test(e.charAt(oe))?(s=e.charAt(oe),oe++):(s=n,0===ge&&de(L));else i=n;i!==n?(ie=t,a=i,t=r={type:"number",value:("-"===r?-1:1)*parseFloat(A.join("")+"."+a.join(""))}):(oe=t,t=n)}else oe=t,t=n;else oe=t,t=n}else oe=t,t=n;if(t===n){if(t=oe,45===e.charCodeAt(oe)?(r="-",oe++):(r=n,0===ge&&de(M)),r===n&&(43===e.charCodeAt(oe)?(r="+",oe++):(r=n,0===ge&&de(R))),r===n&&(r=null),r!==n){if(A=[],x.test(e.charAt(oe))?(o=e.charAt(oe),oe++):(o=n,0===ge&&de(L)),o!==n)for(;o!==n;)A.push(o),x.test(e.charAt(oe))?(o=e.charAt(oe),oe++):(o=n,0===ge&&de(L));else A=n;A!==n?(ie=t,t=r=function(e,t){return{type:"number",value:("-"===e?-1:1)*parseInt(t.join(""))}}(r,A)):(oe=t,t=n)}else oe=t,t=n;if(t===n&&(t=oe,(r=xe())!==n&&(ie=t,c=r,r={type:"variable",...c}),(t=r)===n&&(t=oe,(r=Pe())!==n&&(ie=t,r={type:"variable",name:r}),(t=r)===n)))if(t=oe,40===e.charCodeAt(oe)?(r="(",oe++):(r=n,0===ge&&de(h)),r!==n){for(A=[],o=Te();o!==n;)A.push(o),o=Te();if(A!==n)if((o=Ke())!==n){for(i=[],s=Te();s!==n;)i.push(s),s=Te();i!==n?(41===e.charCodeAt(oe)?(s=")",oe++):(s=n,0===ge&&de(p)),s!==n?(ie=t,t=r=o):(oe=t,t=n)):(oe=t,t=n)}else oe=t,t=n;else oe=t,t=n}else oe=t,t=n}return t}function Fe(){var t,r,A,o,i,s;if(t=oe,(r=Ne())!==n){for(A=[],o=Te();o!==n;)A.push(o),o=Te();if(A!==n)if(42===e.charCodeAt(oe)?(o="*",oe++):(o=n,0===ge&&de(O)),o!==n){for(i=[],s=Te();s!==n;)i.push(s),s=Te();i!==n&&(s=Fe())!==n?(ie=t,t=r={type:"multiplication",left:r,right:s}):(oe=t,t=n)}else oe=t,t=n;else oe=t,t=n}else oe=t,t=n;if(t===n){if(t=oe,(r=Ne())!==n){for(A=[],o=Te();o!==n;)A.push(o),o=Te();if(A!==n)if(47===e.charCodeAt(oe)?(o="/",oe++):(o=n,0===ge&&de(U)),o!==n){for(i=[],s=Te();s!==n;)i.push(s),s=Te();i!==n&&(s=Fe())!==n?(ie=t,t=r=function(e,t){return{type:"division",left:e,right:t}}(r,s)):(oe=t,t=n)}else oe=t,t=n;else oe=t,t=n}else oe=t,t=n;t===n&&(t=Ne())}return t}function Ke(){var t,r,A,o,i,s;if(t=oe,(r=Fe())!==n){for(A=[],o=Te();o!==n;)A.push(o),o=Te();if(A!==n)if(43===e.charCodeAt(oe)?(o="+",oe++):(o=n,0===ge&&de(R)),o!==n){for(i=[],s=Te();s!==n;)i.push(s),s=Te();i!==n&&(s=Ke())!==n?(ie=t,t=r={type:"addition",left:r,right:s}):(oe=t,t=n)}else oe=t,t=n;else oe=t,t=n}else oe=t,t=n;if(t===n){if(t=oe,(r=Fe())!==n){for(A=[],o=Te();o!==n;)A.push(o),o=Te();if(A!==n)if(45===e.charCodeAt(oe)?(o="-",oe++):(o=n,0===ge&&de(M)),o!==n){for(i=[],s=Te();s!==n;)i.push(s),s=Te();i!==n&&(s=Ke())!==n?(ie=t,t=r=function(e,t){return{type:"subtraction",left:e,right:t}}(r,s)):(oe=t,t=n)}else oe=t,t=n;else oe=t,t=n}else oe=t,t=n;t===n&&(t=Fe())}return t}function Me(){var t,r,A,o,i,s;if(t=oe,"$(("===e.substr(oe,3)?(r="$((",oe+=3):(r=n,0===ge&&de(T)),r!==n){for(A=[],o=Te();o!==n;)A.push(o),o=Te();if(A!==n)if((o=Ke())!==n){for(i=[],s=Te();s!==n;)i.push(s),s=Te();i!==n?("))"===e.substr(oe,2)?(s="))",oe+=2):(s=n,0===ge&&de(j)),s!==n?(ie=t,t=r=o):(oe=t,t=n)):(oe=t,t=n)}else oe=t,t=n;else oe=t,t=n}else oe=t,t=n;return t}function Re(){var t,r,A,o;return t=oe,"$("===e.substr(oe,2)?(r="$(",oe+=2):(r=n,0===ge&&de(Y)),r!==n&&(A=Ie())!==n?(41===e.charCodeAt(oe)?(o=")",oe++):(o=n,0===ge&&de(p)),o!==n?(ie=t,t=r=A):(oe=t,t=n)):(oe=t,t=n),t}function xe(){var t,r,A,o,i,s;return t=oe,"${"===e.substr(oe,2)?(r="${",oe+=2):(r=n,0===ge&&de(G)),r!==n&&(A=Pe())!==n?(":-"===e.substr(oe,2)?(o=":-",oe+=2):(o=n,0===ge&&de(H)),o!==n&&(i=function(){var e,t,r,A,o;for(e=oe,t=[],r=Te();r!==n;)t.push(r),r=Te();if(t!==n){if(r=[],(A=De())!==n)for(;A!==n;)r.push(A),A=De();else r=n;if(r!==n){for(A=[],o=Te();o!==n;)A.push(o),o=Te();A!==n?(ie=e,e=t=r):(oe=e,e=n)}else oe=e,e=n}else oe=e,e=n;return e}())!==n?(125===e.charCodeAt(oe)?(s="}",oe++):(s=n,0===ge&&de(C)),s!==n?(ie=t,t=r={name:A,defaultValue:i}):(oe=t,t=n)):(oe=t,t=n)):(oe=t,t=n),t===n&&(t=oe,"${"===e.substr(oe,2)?(r="${",oe+=2):(r=n,0===ge&&de(G)),r!==n&&(A=Pe())!==n?(":-}"===e.substr(oe,3)?(o=":-}",oe+=3):(o=n,0===ge&&de(J)),o!==n?(ie=t,t=r=function(e){return{name:e,defaultValue:[]}}(A)):(oe=t,t=n)):(oe=t,t=n),t===n&&(t=oe,"${"===e.substr(oe,2)?(r="${",oe+=2):(r=n,0===ge&&de(G)),r!==n&&(A=Pe())!==n?(125===e.charCodeAt(oe)?(o="}",oe++):(o=n,0===ge&&de(C)),o!==n?(ie=t,t=r=q(A)):(oe=t,t=n)):(oe=t,t=n),t===n&&(t=oe,36===e.charCodeAt(oe)?(r="$",oe++):(r=n,0===ge&&de(z)),r!==n&&(A=Pe())!==n?(ie=t,t=r=q(A)):(oe=t,t=n)))),t}function Le(){var t,r,A;if(t=oe,r=[],W.test(e.charAt(oe))?(A=e.charAt(oe),oe++):(A=n,0===ge&&de(V)),A!==n)for(;A!==n;)r.push(A),W.test(e.charAt(oe))?(A=e.charAt(oe),oe++):(A=n,0===ge&&de(V));else r=n;return r!==n&&(ie=t,r=X()),t=r}function Pe(){var t,r,A;if(t=oe,r=[],_.test(e.charAt(oe))?(A=e.charAt(oe),oe++):(A=n,0===ge&&de(Z)),A!==n)for(;A!==n;)r.push(A),_.test(e.charAt(oe))?(A=e.charAt(oe),oe++):(A=n,0===ge&&de(Z));else r=n;return r!==n&&(ie=t,r=X()),t=r}function Oe(){var t;return $.test(e.charAt(oe))?(t=e.charAt(oe),oe++):(t=n,0===ge&&de(ee)),t}function Ue(){var t;return te.test(e.charAt(oe))?(t=e.charAt(oe),oe++):(t=n,0===ge&&de(re)),t}function Te(){var t,r;if(t=[],Ae.test(e.charAt(oe))?(r=e.charAt(oe),oe++):(r=n,0===ge&&de(ne)),r!==n)for(;r!==n;)t.push(r),Ae.test(e.charAt(oe))?(r=e.charAt(oe),oe++):(r=n,0===ge&&de(ne));else t=n;return t}if((A=i())!==n&&oe===e.length)return A;throw A!==n&&oe{"use strict";function t(e,r,A,n){this.message=e,this.expected=r,this.found=A,this.location=n,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t)}!function(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}(t,Error),t.buildMessage=function(e,t){var r={literal:function(e){return`"${n(e.text)}"`},class:function(e){var t,r="";for(t=0;t0){for(t=1,A=1;t'"%@`\-]/,I=oe(["\r","\n","\t"," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),E=/^[^\r\n\t ,\][{}:#"']/,B=oe(["\r","\n","\t"," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),y=function(){return Ae().replace(/^ *| *$/g,"")},m=ne("--",!1),w=/^[a-zA-Z\/0-9]/,Q=oe([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),D=/^[^\r\n\t :,]/,b=oe(["\r","\n","\t"," ",":",","],!0,!1),v=ne("null",!1),S=ne("true",!1),k=ne("false",!1),N=ie("string"),F=ne('"',!1),K=/^[^"\\\0-\x1F\x7F]/,M=oe(['"',"\\",["\0",""],""],!0,!1),R=ne('\\"',!1),x=ne("\\\\",!1),L=ne("\\/",!1),P=ne("\\b",!1),O=ne("\\f",!1),U=ne("\\n",!1),T=ne("\\r",!1),j=ne("\\t",!1),Y=ne("\\u",!1),G=/^[0-9a-fA-F]/,H=oe([["0","9"],["a","f"],["A","F"]],!1,!1),J=ie("blank space"),q=/^[ \t]/,z=oe([" ","\t"],!1,!1),W=(ie("white space"),oe([" ","\t","\n","\r"],!1,!1),ne("\r\n",!1)),V=ne("\n",!1),X=ne("\r",!1),_=0,Z=0,$=[{line:1,column:1}],ee=0,te=[],re=0;if("startRule"in r){if(!(r.startRule in o))throw new Error(`Can't start parsing from rule "${r.startRule}".`);i=o[r.startRule]}function Ae(){return e.substring(Z,_)}function ne(e,t){return{type:"literal",text:e,ignoreCase:t}}function oe(e,t,r){return{type:"class",parts:e,inverted:t,ignoreCase:r}}function ie(e){return{type:"other",description:e}}function se(t){var r,A=$[t];if(A)return A;for(r=t-1;!$[r];)r--;for(A={line:(A=$[r]).line,column:A.column};ree&&(ee=_,te=[]),te.push(e))}function ge(e,r,A){return new t(t.buildMessage(e,r),e,r,A)}function le(){return he()}function ue(){var t,r,A;return t=_,Ce()!==n?(45===e.charCodeAt(_)?(r="-",_++):(r=n,0===re&&ce(s)),r!==n&&be()!==n&&(A=de())!==n?(Z=t,t=A):(_=t,t=n)):(_=t,t=n),t}function he(){var e,t,r,A;for(e=_,t=[],r=pe();r!==n;)t.push(r),r=pe();return t!==n&&(Z=e,A=t,t=Object.assign({},...A)),e=t}function pe(){var t,r,A,o,i,s,p,d,C,f,I,E;if(t=_,(r=be())===n&&(r=null),r!==n){if(A=_,35===e.charCodeAt(_)?(o="#",_++):(o=n,0===re&&ce(a)),o!==n){if(i=[],s=_,p=_,re++,d=Se(),re--,d===n?p=void 0:(_=p,p=n),p!==n?(e.length>_?(d=e.charAt(_),_++):(d=n,0===re&&ce(c)),d!==n?s=p=[p,d]:(_=s,s=n)):(_=s,s=n),s!==n)for(;s!==n;)i.push(s),s=_,p=_,re++,d=Se(),re--,d===n?p=void 0:(_=p,p=n),p!==n?(e.length>_?(d=e.charAt(_),_++):(d=n,0===re&&ce(c)),d!==n?s=p=[p,d]:(_=s,s=n)):(_=s,s=n);else i=n;i!==n?A=o=[o,i]:(_=A,A=n)}else _=A,A=n;if(A===n&&(A=null),A!==n){if(o=[],(i=ve())!==n)for(;i!==n;)o.push(i),i=ve();else o=n;o!==n?(Z=t,t=r={}):(_=t,t=n)}else _=t,t=n}else _=t,t=n;if(t===n&&(t=_,(r=Ce())!==n&&(A=function(){var e;(e=we())===n&&(e=Be());return e}())!==n?((o=be())===n&&(o=null),o!==n?(58===e.charCodeAt(_)?(i=":",_++):(i=n,0===re&&ce(g)),i!==n?((s=be())===n&&(s=null),s!==n&&(p=de())!==n?(Z=t,t=r=l(A,p)):(_=t,t=n)):(_=t,t=n)):(_=t,t=n)):(_=t,t=n),t===n&&(t=_,(r=Ce())!==n&&(A=Ee())!==n?((o=be())===n&&(o=null),o!==n?(58===e.charCodeAt(_)?(i=":",_++):(i=n,0===re&&ce(g)),i!==n?((s=be())===n&&(s=null),s!==n&&(p=de())!==n?(Z=t,t=r=l(A,p)):(_=t,t=n)):(_=t,t=n)):(_=t,t=n)):(_=t,t=n),t===n))){if(t=_,(r=Ce())!==n)if((A=Ee())!==n)if((o=be())!==n)if((i=function(){var e;(e=me())===n&&(e=we())===n&&(e=ye());return e}())!==n){if(s=[],(p=ve())!==n)for(;p!==n;)s.push(p),p=ve();else s=n;s!==n?(Z=t,t=r=l(A,i)):(_=t,t=n)}else _=t,t=n;else _=t,t=n;else _=t,t=n;else _=t,t=n;if(t===n)if(t=_,(r=Ce())!==n)if((A=Ee())!==n){if(o=[],i=_,(s=be())===n&&(s=null),s!==n?(44===e.charCodeAt(_)?(p=",",_++):(p=n,0===re&&ce(u)),p!==n?((d=be())===n&&(d=null),d!==n&&(C=Ee())!==n?(Z=i,i=s=h(0,C)):(_=i,i=n)):(_=i,i=n)):(_=i,i=n),i!==n)for(;i!==n;)o.push(i),i=_,(s=be())===n&&(s=null),s!==n?(44===e.charCodeAt(_)?(p=",",_++):(p=n,0===re&&ce(u)),p!==n?((d=be())===n&&(d=null),d!==n&&(C=Ee())!==n?(Z=i,i=s=h(0,C)):(_=i,i=n)):(_=i,i=n)):(_=i,i=n);else o=n;o!==n?((i=be())===n&&(i=null),i!==n?(58===e.charCodeAt(_)?(s=":",_++):(s=n,0===re&&ce(g)),s!==n?((p=be())===n&&(p=null),p!==n&&(d=de())!==n?(Z=t,f=A,I=o,E=d,t=r=Object.assign({},...[f].concat(I).map(e=>({[e]:E})))):(_=t,t=n)):(_=t,t=n)):(_=t,t=n)):(_=t,t=n)}else _=t,t=n;else _=t,t=n}return t}function de(){var t,r,A,o,i,a,c;if(t=_,r=_,re++,A=_,(o=Se())!==n&&(i=function(){var t,r,A;t=_,r=[],32===e.charCodeAt(_)?(A=" ",_++):(A=n,0===re&&ce(d));for(;A!==n;)r.push(A),32===e.charCodeAt(_)?(A=" ",_++):(A=n,0===re&&ce(d));r!==n?(Z=_,(A=(A=r.length===(Ne+1)*ke)?void 0:n)!==n?t=r=[r,A]:(_=t,t=n)):(_=t,t=n);return t}())!==n?(45===e.charCodeAt(_)?(a="-",_++):(a=n,0===re&&ce(s)),a!==n&&(c=be())!==n?A=o=[o,i,a,c]:(_=A,A=n)):(_=A,A=n),re--,A!==n?(_=r,r=void 0):r=n,r!==n&&(A=ve())!==n&&(o=fe())!==n&&(i=function(){var e,t,r,A;for(e=_,t=[],r=ue();r!==n;)t.push(r),r=ue();return t!==n&&(Z=e,A=t,t=[].concat(...A)),e=t}())!==n&&(a=Ie())!==n?(Z=t,t=r=i):(_=t,t=n),t===n&&(t=_,(r=Se())!==n&&(A=fe())!==n&&(o=he())!==n&&(i=Ie())!==n?(Z=t,t=r=o):(_=t,t=n),t===n))if(t=_,(r=function(){var t;(t=me())===n&&(t=function(){var t,r;t=_,"true"===e.substr(_,4)?(r="true",_+=4):(r=n,0===re&&ce(S));r!==n&&(Z=t,r=!0);(t=r)===n&&(t=_,"false"===e.substr(_,5)?(r="false",_+=5):(r=n,0===re&&ce(k)),r!==n&&(Z=t,r=!1),t=r);return t}())===n&&(t=we())===n&&(t=Be());return t}())!==n){if(A=[],(o=ve())!==n)for(;o!==n;)A.push(o),o=ve();else A=n;A!==n?(Z=t,t=r=r):(_=t,t=n)}else _=t,t=n;return t}function Ce(){var t,r,A;for(re++,t=_,r=[],32===e.charCodeAt(_)?(A=" ",_++):(A=n,0===re&&ce(d));A!==n;)r.push(A),32===e.charCodeAt(_)?(A=" ",_++):(A=n,0===re&&ce(d));return r!==n?(Z=_,(A=(A=r.length===Ne*ke)?void 0:n)!==n?t=r=[r,A]:(_=t,t=n)):(_=t,t=n),re--,t===n&&(r=n,0===re&&ce(p)),t}function fe(){return Z=_,Ne++,!0?void 0:n}function Ie(){return Z=_,Ne--,!0?void 0:n}function Ee(){var e,t,r;if((e=we())===n){if(e=_,t=[],(r=ye())!==n)for(;r!==n;)t.push(r),r=ye();else t=n;t!==n&&(Z=e,t=Ae()),e=t}return e}function Be(){var t,r,A,o,i,s;if(re++,t=_,f.test(e.charAt(_))?(r=e.charAt(_),_++):(r=n,0===re&&ce(I)),r!==n){for(A=[],o=_,(i=be())===n&&(i=null),i!==n?(E.test(e.charAt(_))?(s=e.charAt(_),_++):(s=n,0===re&&ce(B)),s!==n?o=i=[i,s]:(_=o,o=n)):(_=o,o=n);o!==n;)A.push(o),o=_,(i=be())===n&&(i=null),i!==n?(E.test(e.charAt(_))?(s=e.charAt(_),_++):(s=n,0===re&&ce(B)),s!==n?o=i=[i,s]:(_=o,o=n)):(_=o,o=n);A!==n?(Z=t,t=r=y()):(_=t,t=n)}else _=t,t=n;return re--,t===n&&(r=n,0===re&&ce(C)),t}function ye(){var t,r,A,o,i;if(t=_,"--"===e.substr(_,2)?(r="--",_+=2):(r=n,0===re&&ce(m)),r===n&&(r=null),r!==n)if(w.test(e.charAt(_))?(A=e.charAt(_),_++):(A=n,0===re&&ce(Q)),A!==n){for(o=[],D.test(e.charAt(_))?(i=e.charAt(_),_++):(i=n,0===re&&ce(b));i!==n;)o.push(i),D.test(e.charAt(_))?(i=e.charAt(_),_++):(i=n,0===re&&ce(b));o!==n?(Z=t,t=r=y()):(_=t,t=n)}else _=t,t=n;else _=t,t=n;return t}function me(){var t,r;return t=_,"null"===e.substr(_,4)?(r="null",_+=4):(r=n,0===re&&ce(v)),r!==n&&(Z=t,r=null),t=r}function we(){var t,r,A,o;return re++,t=_,34===e.charCodeAt(_)?(r='"',_++):(r=n,0===re&&ce(F)),r!==n?(34===e.charCodeAt(_)?(A='"',_++):(A=n,0===re&&ce(F)),A!==n?(Z=t,t=r=""):(_=t,t=n)):(_=t,t=n),t===n&&(t=_,34===e.charCodeAt(_)?(r='"',_++):(r=n,0===re&&ce(F)),r!==n&&(A=function(){var e,t,r;if(e=_,t=[],(r=Qe())!==n)for(;r!==n;)t.push(r),r=Qe();else t=n;t!==n&&(Z=e,t=t.join(""));return e=t}())!==n?(34===e.charCodeAt(_)?(o='"',_++):(o=n,0===re&&ce(F)),o!==n?(Z=t,t=r=A):(_=t,t=n)):(_=t,t=n)),re--,t===n&&(r=n,0===re&&ce(N)),t}function Qe(){var t,r,A,o,i,s,a,c,g,l;return K.test(e.charAt(_))?(t=e.charAt(_),_++):(t=n,0===re&&ce(M)),t===n&&(t=_,'\\"'===e.substr(_,2)?(r='\\"',_+=2):(r=n,0===re&&ce(R)),r!==n&&(Z=t,r='"'),(t=r)===n&&(t=_,"\\\\"===e.substr(_,2)?(r="\\\\",_+=2):(r=n,0===re&&ce(x)),r!==n&&(Z=t,r="\\"),(t=r)===n&&(t=_,"\\/"===e.substr(_,2)?(r="\\/",_+=2):(r=n,0===re&&ce(L)),r!==n&&(Z=t,r="/"),(t=r)===n&&(t=_,"\\b"===e.substr(_,2)?(r="\\b",_+=2):(r=n,0===re&&ce(P)),r!==n&&(Z=t,r="\b"),(t=r)===n&&(t=_,"\\f"===e.substr(_,2)?(r="\\f",_+=2):(r=n,0===re&&ce(O)),r!==n&&(Z=t,r="\f"),(t=r)===n&&(t=_,"\\n"===e.substr(_,2)?(r="\\n",_+=2):(r=n,0===re&&ce(U)),r!==n&&(Z=t,r="\n"),(t=r)===n&&(t=_,"\\r"===e.substr(_,2)?(r="\\r",_+=2):(r=n,0===re&&ce(T)),r!==n&&(Z=t,r="\r"),(t=r)===n&&(t=_,"\\t"===e.substr(_,2)?(r="\\t",_+=2):(r=n,0===re&&ce(j)),r!==n&&(Z=t,r="\t"),(t=r)===n&&(t=_,"\\u"===e.substr(_,2)?(r="\\u",_+=2):(r=n,0===re&&ce(Y)),r!==n&&(A=De())!==n&&(o=De())!==n&&(i=De())!==n&&(s=De())!==n?(Z=t,a=A,c=o,g=i,l=s,t=r=String.fromCharCode(parseInt(`0x${a}${c}${g}${l}`))):(_=t,t=n)))))))))),t}function De(){var t;return G.test(e.charAt(_))?(t=e.charAt(_),_++):(t=n,0===re&&ce(H)),t}function be(){var t,r;if(re++,t=[],q.test(e.charAt(_))?(r=e.charAt(_),_++):(r=n,0===re&&ce(z)),r!==n)for(;r!==n;)t.push(r),q.test(e.charAt(_))?(r=e.charAt(_),_++):(r=n,0===re&&ce(z));else t=n;return re--,t===n&&(r=n,0===re&&ce(J)),t}function ve(){var e,t,r,A,o,i;if(e=_,(t=Se())!==n){for(r=[],A=_,(o=be())===n&&(o=null),o!==n&&(i=Se())!==n?A=o=[o,i]:(_=A,A=n);A!==n;)r.push(A),A=_,(o=be())===n&&(o=null),o!==n&&(i=Se())!==n?A=o=[o,i]:(_=A,A=n);r!==n?e=t=[t,r]:(_=e,e=n)}else _=e,e=n;return e}function Se(){var t;return"\r\n"===e.substr(_,2)?(t="\r\n",_+=2):(t=n,0===re&&ce(W)),t===n&&(10===e.charCodeAt(_)?(t="\n",_++):(t=n,0===re&&ce(V)),t===n&&(13===e.charCodeAt(_)?(t="\r",_++):(t=n,0===re&&ce(X)))),t}const ke=2;let Ne=0;if((A=i())!==n&&_===e.length)return A;throw A!==n&&_{let A;e.exports=()=>(void 0===A&&(A=r(78761).brotliDecompressSync(Buffer.from("W4VmWMM2BubfuhOQtPrf2v23OidkIrLQsV6vuo6ON5J6yagfMdrY7lWBqNRd9a47LpsBgqCqmpd0iExCZ1KAzk71/+8domYYLado6QgLVcDZGShUGZeMQlqNVNopK7ifA0nn9MKZyFF65wTuzVq9y8KLJIXtKHLGSuK1rAktpPEa3o/D+bTWy0Lum8P5dbi+afFDC2tbv6C+vb8PfoBYODmqfft9Hf5Pe0ggAgnkcyCScddvJcAQUaLFtBxiDzlFX6Xu3f20V3zi9/KX9v3n56uXPdxdESLXXGIvbEJOH2X8Th4liNWx9UwsCsmzw1aZ510Tdb5Rj+J7MJ8y4+/0oG7C5N5U/e6+nCb6u2syhiiXVOk32T1VbmmOnkICBEwLGCIzQ4HSPv1vU+s8vpwklpeRcMyX3CZhQ0hpXNKalPCFW0gBPcDD7EDWf21mpzNkxFiDnHpaxMPpp+2Fb0z5U8DCOE7xbpaa//u8NH5Zl8StbCqWBFeISIAGQJVrsNMLfOS+6WPU487yt6HHvVyqxkCGr9rxWKj5mb72aqpVcNinJQUMBonXOVfO3ff9fGydsqWp75+uSrpgOe34S2n6rY3EkbmxyDG4JPxoICAtZfP8L7kEnGpRcJiK7IrwPCabx4MHO4eKx/eTtA0Q4INF6w2rfFzV6uoWdLNp/e/zQ9s80fgiyQayGUyu1EbdOJV0LmX3p9qP6wXd/TIC/1lwJelIZmsp/rZYUk38z63G5Xvw7dummA0Go0VwYLs5GsIE/AD7Yf7W8eCBquyuHN9MJmn6ZRoK1BsfCbWLiKgVF1+m/efnuW234z4lWU4CSaniecD+KO8qKwbSjr1LjR81tj8eOkhlfTy+WQYYFGxASroh5mLUXxVrJYvaq/HHw/sYfzZRjlU9DQwC5EbGiXyTlXVDtDGWUDwofvwP59Pnx+7u49XU5n2emTsXhgA64E3EvxTrkKDBFhUtPGU2++PxO8t2fC0LEHuTzHaEZNJqi+WnICMb389Zli3hnEpdFg6ZtdTpSzwwO+DAMYS/NbQ/XoGUnXoEW12ZkX5IfFBvSTJfos/EWRVFnv9PNS1bh9RePIHCn43YkDqJK81QPoSd4ffvm5aSJ3dWxvlQSWJ9lrGrbr27/Kb7TDca2AFA8IzhOnJn1pqqeq+xvxuYOQCG2kNyJlhjZZyJdJREihIXKk1WSmX2e/s37pQhjCgxbs/Vfe0coZkJeFKrT/8UkL0B4CVkAeWaGWe0ZYbWf97303pT0HRTxpkkkiISZPMbY5Owa5uzhvVMiSgUMQOAgNQku3+bcc2W8Wftvc+97716hSkUQIoEexzlnMukVEmi/OtnMpHC6KEoQ1mXTaj/m1rSaZq5d76a+NIaQAEsmpEs36Z1QkOlP/4vUXvvdvc2vaLKEo1kZ8c6p5UKaACrhAaQYFi6Yf7eVP+t/sy9uyQFkQ4gFYZy/DH2DnRIsShdi+ecu1e8YWFhF+TX7hK0FwDlB4DSNwA+jgnwPazoAPIl6YeQKjomgZBm4ot0iKlMqQu5+607u/O4c/mLzqWr3lXtonbfurf/fW9p1fb97x7uAYAZRGZSpVDdI/Xa3QGCKrNka71YFd679x2j///+tw5XlQh3DzPAI8KKEQjYkEDArKje++4BvO8IMN2DAMsjCGYGQGYNwGLWgKxqM2YLmcgcxapRcjnTy1lss0Zq23evdkIxc6RYSf1vOpbqyDmE8+0FwlRLnUTiEIb/GtyUgCqbJaZMnSoZTEvmDL9CSqjDUeUqnCzPf9yn+v+5k1ltE9tA3wQoxssOHKGghXxpC0LBAltBtPBSe5swB1i7DYxBub83F2EoxiF03obaFB5bsh0Kc1bzrIwh3LQFCHQJIft/5CJOSAK0iCZowEvBt1E6se+QClLxyQDb/P6zGf+p4F3PzaDCAkTKwIoZSUwHunbpXlxNMWf/zySGe2fKzMwV7SAKgg0s2GpiS2JLsSU2hF26mHr3yxBu1v/vXtvs726Ps7eLFkKQEPAgwYpoQimiQYN4BXwmQ8sJtGRi4JvqJhOIEwjkbtY/rpP199/CClNIYbApTjXqCNN2WnKIGmUPa42wSoQ9jPAOe3hI+9ecvrylsbdHMMEED79ocIIGDTco4QgabtDgnVaQN7MkVf57pnDAhQoXIpigwoUh5hDBEBFUqBBBHCpcDGT9/93z0K/7HuDMzIMgOBAEQRAEQRAEF4IgOLBnrQMbmvl/3eIffPefkNv2BIIlFYgKllQgEAgEAoFAnEBcMsRlQVRUVNRvLp4Hn71PVT+xIiLQiIiIiBERESlERISylBVLiUjpFIYyYiiHNu3/0+fVV+2Rf8gGmIx5Oqweg87ORHPWoCK7ErY0QUikWCgWsCCIpSbaKRaQpO/ufT7JheKaKwOv5/+/KO15Qt3RkRCyzMSKsEuNtuxSK6gaK0YX5977m8Tq6Vkg8WFgFXHmNHyNkNthOPkkpeW3tyfaXr3W/Nhgzz10+7keQmIsRg6Nou1V9G2ouQrSXvz7RuQRM+xkIu5hKxFQDMCnijKYAOB5O1MvmlNyXfsYOqP676qcmPtHtcuoDuGsJDHT4rILl0OMh4Zj3fay5erEe+MJIAy9Y/jQEoCMkOML38mHoY0XTN2PnLn+l9AMOgbfm/WChFjb43o/INsWlyw5TyXJGo0jkzBVQhHpGQWQZe3PQzCf6OWq/mVwdbA6RGmy4IFePesVn5f250+VPdv2wODMfQYJsAZvRPbpDZCkhOhUNSmnVXaZszIeZNX51IJ9Ol16VNEUgkNtPXZqIfxDs1/MGXprB/9PAnj/JMnlUIzwIJyX8qe8LKT/bYffcwJHBscc2utF+e5/57jWSqHVooqW/YjHiFl4XEUJ9s98myoPWIzhQzVTOQ4kLey5KUDYV2MQ1cY4+7d9Cf+Bjv1hF1vvbJWYwy5BvlGKS9DkREkpgx8xST5PU4ikNC5wLB7cOmcGp+bpTrwJ73OkrOWEWGV/hSRJkwh87Z7aHxsaQMuNwvYREDvirh/o6xQ/MKgiU6hXgP2Sc1p6PQTcPPbG9kYfexMBckCiE8YsNTtM+02OimepUlRaPoVsFrSaU5Yd8oVSc0oD9/mSJJ30VeAbYu6fPRizwyyv9iWtAOH6fYetXKdOw73xEh4YJx5Xj7NZdnoNcknKz6B9i2bFto9LVeHtpL4aQBlkNaFQdMjwE/8v1Yr7beThYGvLiZC1769LxOjL0M4UhQIqHajDClFvQdp+wycLk0s6nzBWe3esZZ9hKyGKe5Ib2RI4XcGMnY+N3AKRpDW4dMcuQIm7bt/iJ7Hei2XIrGpFTj1nSVJjTSKeshvOEJV3PyKGVS2rxDCkrrr9QlilCBTyjsKyOhLZJEHH/43MSNIK/76cE+J1GpGrWksmgU1Y0zQShuPd6n2xtG5LBWlRW1xSP0VKlr9TkjFlvUpkTwAMwKfOnKWEGmYB9sjl06lKyNWDom5mkSN8ba+PY37qy1izbKkD/j1fmTLDzYfDN++/b4/PIV//LfryKYWIt/Tin5RpX2t+YFhbfnyyty8EWhXyY2vcfvoD2p9L9pAvbTGNcxsOlKNz/WLlfxU4n1ZKGsakG7dMjpCOY7N55I+jxutb+2jg6/h+JH3z0vnKHzf9o+t9hPrwAO1YpcActX78v14SNmwMb3FfJNbWvrLdzjQxjujYFjj0h1K6v9bH0JX36+g2yUAsD8kBbSxrwb4R5UP25WJf5bhjzAU/xW3ty6FuN/yfjiQAxG9w9up/rSjCsHZdqO9ogNUk9Rg739V0ncE2mB167H9FiyzIP1UEHIzsCZZRf4hrME2lgK0TVIrZjgSrZOJLegE2O/oEtdEO3UPPdbKqZXD4JwDEtQWScWmNgbbHGaqkBYljkIY1sAQzpHTpWK2zpZtLbg1Y11SHxM+0uVGqd9jOez6W45/k1HFwCUYm2LjHI4z/GJEs7M+OOW7rfmk7jWpaJRyn25rmgMfSJyMd9gXOengtpUtG3p44XehGvj3kHe5pHLW1grUtJHk+vznHp13/p0bqbiiRsZmTOprJNCxF7ClPs1mKjyxc+GNRgsW5NnTKNhdBsMS+w9TYO1wGImfKvoZPoMJNsWP5aAQrLUhxtod5bAsvxXSwMeZFjxIHf1fORSeMPxvOxpKgmtI1y4gKxCwt3B25pu94u+I7k8oXzyzmgKwAOcMSiK58m0YylrR6zVGOL7+BKLEcc1BMICUvQbGZj4JSrXnuKfQd5vNUiHUqMrdDhbaFntQVLBY8NU26PPoJ5pGHYZWGbI1EM2PL6ILZKDl9vPQz2X9OBkSEUcYOrNQBtRYijGVSkk6TRx+CkqYzT3eNkqQ5hFg8Mnu5nzUg5zo53n04Jy/Z9eqGUETJk8e9W8jPWknj/CrUWdOwlNyYI8aoxNuF5xsMDVWvLvqJSx3ETwMWBf++Z7npjTCwjtqJ0mWXB7Li6tDclg2/rfqKfycZIKl8KeiRB6blfTGj/KEs1lRKNTl7tqnyYHLc/lonojXr1bRKR3gqOdSU/7dF4J5/afUU+qlkdPZD5vb/T4mabuc5qnQxDu7+WLjQLoRYPTwo3FZQsqjxsrYaGZAzrBdkAtMZrN+UJQaQUW1HZDwsSaoXyrLuyelQv4nNBpgTcDuHLYTrmO4mpnCs4EcZVy8rGg9gdklu0ebi35f+L6qMlY6QGkpbH/Xe9ZpoC1k2k9Up5VamhCmJ8CwTvStCK2xfpadQlX98NrTrp0BGxI+vF5Zeb+CT2PW0Rv2Jt3X8ZKEo7RVi9VyiPfbYWQdMbd69FFx+fbSnK53UrFsNYomC9m1hmXIrqh9KLPK5o5ib57j9MK5TZfhq8jvNNgjlFtIwWlAoyGHkdDm1xVxBXwuqYAJJ9cHWMDN/k/s5UJIh7GjiLnAktTimKNw1aFdnDZUMz914oN7/PxEMy6umhrpujJcj6Ee5WWLc+5LVZNADEFnu+1uyZ4hllPvKek27k5QnC4T0PThr1742tJO1ceahcXcOKXmCxi4CAlN85CLncdMUCbJaRWJf/ITIttifhyGCpxLI9MSYkmjj5poU4UYUE2U+yxs5+ixzOpC02+8ggSRggUlqbHRHr5/G8hquDdvlcDizInUfhPRDgiKst0IKDE4kAVpop0W9ZjVzy8sXcPovaqGKUShVYVwT0KFipjART2vEhGHjbVVC94uIKciKJ1dTDCX+q4JotaAMWTrNtuRiaSBNPFcazlx5HCMDycTHrq2yzDBV+6HzlyWfz1Ozp4n5qJ2j2YZD4CVHK5/euOjmf8SipVYMFEyI379ZETelNf1CqZBI6410/YHWIxJsZq5AzaHEvaUP85zyxB7WPNjfKrxe2K+KOyIEpc6xFPoOL2DYqNfhLatlNe5q94MPTV7oj8YdNxHB4CgEEezyh3BM1kNyyDJv2qyMRC3v2ja7zhvqjmRVJx//f+v8T4EgRvgIZnD/oa6t9gbswIf1J2iNdtsZaO/MX1I/EdCvKfbdE0U69QwshO80slrAeSSr/ISCIgLuh9o58qSjNqX9D3bMguzPknHn5Fw8ELBiDUWE9n2/auRjQeTVubna1JVxS7FZDqEOwZ4DUV3iXky26Nw7+xU8Y61m+ZySuCOxjJlsRAIrERYTI4QhK/yEGN2VKtBXYRbJTkvSK0rwvXnYcT0tk+3C39ANXwhrp4UKoP7Jaa1WMKRdK1nLMiyBNp89NvzR7pb1EtiNGSFuzsMRG/sXlnKltEBSub32/TvWhz2yUxWdMRCLJXrWYSuHMBsC08S/hbf9uK3+E1f1vpwbqS8CEJduz+hKZyFvR0u00YAKB8xp4VKxIllmzHXmYXcP6Pya1eC2VBdLdxXlB9ot4s4LUjh2Gq9Xan6QjLwLsITV98peRxPBe4fZFhvPdV5GbCl/YLOGMkSHqyme2e+vuxj3XassqCypW3B9TyzrvMkt0uC2ZRrHzPmVx04AmjFgJHmSB5jmqhn1zQCh+HEdM7dR4a6Pqojf/YE7JY0ZpXUpVCrsPZluAWlJcJYsJqHniYMk/nBH7jzNsw1N+3zGUA4myFfQXcgN/nHGGwNYCuAYLwbKRd7d8rIqqvdfMUBdCQWKaxvqqyVyNz1ESg7EB1IVUQ6F0jBU53L+soeWsWSNhEk/S6+v6nj6rMXETB4uffJRMy6CuUI8ms7WkZhL5YDnzpy7gGmm0yJ0ihhgzCdwMTEgHKjY58ub2jyBqgcWyBDtzT1a0Kq54eVyz7Mto103NgLn9ShJiXEFonvmBf3o1hG4X2YAYsQNBHfgvf5+dJLeGBubmAdZSK6pAYe6ikIL/ijhEDEcQIJB8JJKSMZn4Xw2UpgvGvzmxYFg21zOchCaOBzwFpO+iSI7+mqWU7OQw8+6e2xhH7rxKYB5TI0QFGjUSpAK5iZzkSBbk1iM2Eag5jRytvX65NviR6NF2hFCfmhrNgvzCX5+cLqguF9bmFigr/yCxSYCg+V7C3Crx3w2mnblE5t2fSvN7a+tbvi6DYxVk6g/C/r3mGTDv1lhYugGGmrjDDgteUKWx2ojGGU3/hLtheHcIDc0Fm+bqs8g03oXtL8ZjWIO0ZGSBs8olWMzcO8CkAPl2Wdi/L5coM3t/go14CLwv/0qZ6TLkE3g8AgSdFI9kBcGC29Q8BbBtvR7C6brqalTy4T7Nw0iT/95OsG1vH+9523stLye1ahJ5i6BSiX3grDHyjjPS2Id/AGX+i2eFlJM/EitK7QaGYovCg4N++hyDIoGCOjaUJsDf6XN2hbEjrC88vaZl1IiVLlqohvtq6K18M6YiskllOFwA5rWG7ZtNIfNf+/PCiDzOjd4h1EdQbN8cveHQ8adr6aax0mfabY9MYgyDuus3fJxgnjnF7p6/XxKwkFiN8THE1wgZdfUyAvoydjWq8ELUHaJwei87FMSh4BIjcnYh9BtwaNzW24kD2PA4gWqx95VH3VCpnKxbs7FeFq+4cRjVFovhlFYd8GsQJfAZB/UZYg/fU+CobAOcDhrYQS9XDyhdd88YI1uG8Rz26wcL50Eu/f+dGzNYLZ9VLxru45es+CfjmXih1ECnVq/900JLJj3GdRwxVP8dn7rgvWoBOXGb/KSWXOP/Nj4jjN7c45br/q9O0zrY2kFg/UMc+aXb3LrCYQkuwjlU2o3H8wz6r7O9z+7w6IDCDUqPzLzVGwh0P0UTsLg0VqLyj0RwNC8wph3F/dQAKPeM9XoBd52ZBd82+sW3o/kdxYDsJdYP3BXtoTkle0iAzV8riQTkUymeUbowNm/cYvckH/PwEOP7Dr18CYHkn1oiRwILsf4RFrC4ZEgHAyo6GnH+gddJFxDIR8l9Z2sGUEUU3RQ2UR2dYccNhiJycflZXCGreabJAka9eg2sjb9iQrY3DXg5tO0HN7DItWqhMxyOH+V8Q3WSxnddMG3qa8xOR9YXAAuHdib+ZBFPqrF2BlcUaBvCWiIj6Cw3UnX/L5P5a0Rj1j8e3dufotL0buKCGvlYz3d4AmRzrFwjpaAwlm7lU9d6B0HhYd+NFjycC8b5MVU3Nz9AfHbShibHDE9MZGVjRZlcao5HxJhMHIriHcabV7IfsLaEVWFFUN7rvr+PEfcjgMMXQv3BLrXS/2kO3w5Qwt4zCFxX+g1J+s49ht1l2VofLebe2D3OAX5w55iyG0v9s6zmlHTts4YMA6X8COkPsaI/a98PENtk68rAw+ZIbVHOvBTPAitwv+nq855mf1bnKuN3aSoSbSr/7MZzvH5gaJKmCrZdeROYaR3qX/0f/Hat/LhX4WwDGHV2jfqiiVqjswil3YZkUP5EOt6yRkkp6WTw8fTDXDC1Zj6fIb0bKNSLRj1KSj+SsN5P+f/D7GMAwg1h7LLtimpIsP0QTJ1raePPj5binPYxg7xrdJ24FmzGKPOO7GlMI8GcJ24bNxL2IX92o3RwEvq5+ZDTCRBrjar1b/NauEvnOXfn/oZ75S+mvBRjBmU2jzlAj+k/BbCHRTGPJA8jldtJxHr2RQnZ/8Byo7jQxTfgR0kVpvjs9zhtu3WYSj8NjcVu2jnVG/AZa6MvPSw25E/mJ5yj2ZpXw3rpg6+32BmjTrQ91P5G4Eu3/+ZP3f7UyEuBsJW2sv7//2kPJP6Kem/QlO6dwAD9je6divfu1Hyc9GGW7o0As3+Cag4YGefgsTROaIbteMq5VLBVnctR9tgF5Z8nqq5R/XXkPhWzjTjHyj257X9XsC77Un0IYGPn2Qnb1N0AnTXax6R9RXlYDPegTDbXhzt7Rg2sXt5y23hHG9XvDx6Zzsussq5ZuLPeai2queckiXW3JkVUUXZ+f6wT7I2YKV6sSXUlvio30C6/xK7GZKrziOlfxSueAf1lITFE2CV7TzTdpyt4vpbcwy5+DSFhM5SrCr2D6T8lI6iZts5ErZ4Er6V62Z6Ru3SRCvxdfBvlWdSvyWy8M9egAh91CvznZH5/I4I+DAX47htxDsCWDwBNL/c+zCmwWrg35obKXaiKSQiJI5jT+JC0VwKF0nBenuEHFIJSfwoNOqSuep7+3Nv/lbZ6P0EceUkGH1gMTykKkOWL8PgJ9Sg/OCNRiaN/yDxWpCTSTZgAtNGYfcD+DFUDo17a54/9Nqq/9vIIlpl+30UQg2ndWnQQneGEYMJd1m6RGpGYrO52OZ7FDNa9mlbkAef/jRXVsFvFyBnSfcjTqvsLK4OUZUNjEHOKd1AZL/Rmetv7tUeP4PIIj6oc9Qj7E/Ro4v7h/mgD/s4pbFke/E+aXeREdg5gNArlhbeH0Tzg0fDoMXx3CFSygMZyOg7gnh/W3k1O8CBw3kEmVs1xA5HRTTBeMtOd2FdedsRxppNXXWTVP7aCzRZznIRiu4CLvPiyHQsFSwp2e0wBzHZ1lVG1jRdIoc6xCwCwQRspnyk63lsiXsuHrJSK/ySGsf5baxVo4p+orzG6GYWGiYk7bKVT4X9qbmRgIIBqfGmPbqDpLwrIF1bjWOffrCrX47lt7YTlm2vN1yocxDdRY3Dgsq5mWMofThHimEoyvOJEPF1SCcN9yMOUFmWpuVpHMgDeQCBcAqQ5ngXqeOEvYzJfRCvXqJ/avdX+SUCA1kjCVsZN42TjouVmF07Sv6NemBeszR4UGlTC3ijyaJ1M3AYbuCk5EWVlCwpdFA5W92acB3WMpLm7HWYM+rIwB0j/Zj1SzUkTfvGOYM8NWMft86f5TVlNV+6UCN0kfYCbRryRJgBLs8En0ws1y+Cus1AxKMS0PDkgw9FpmHQFxPDxUBiFhFSA9jT6xaaFkHZNuV1O0c9nSI1/xnB1eipNGIOGjljJaRXH9XlOfKDjnoYrcuxx41B2MG0GEaq3Dx/TO239qCPI+izcLpzvaaM1Q984OWmOtYwrUBWT+9OCd8mQyaKuK8kcENfjjjMRCB2NygLjA30Eb8M5v18Q4TQQY2LjFwRnG1EZPmda0wskxFRhXzi9a8D4Y+QKUZm4ItQGIsg3jSRL+Pe/6Xzpxf3/kfs/e2qZpSW/5eAD/9TYsWQkZ8BwPUxyERRTEg5xFrCr1/fpePx2qHs/yUrMzxTglUALMzANyXnAFBXeYfUwyyG/Assot8rvFktnH1JVidGsBJWBo7mSmxlbAa+do7NcSbzky71XKzHupl7lFvO/KvVVJcMwQ9E+M5CDTSWqlFldTX6Z5CFc2TgFCKI0wWY86ctlBQdT2n5+ru5igi99tPOb5ym3HXTVNv2UnCwG98Py4nWUBW6LG5lXCCbRDzzkQ7qxmF3EINSUGkNE3sd4AEw2T7N43QP5hskM7HzQZeRweEhkB8ZAr6TEQKdxhBQLw/BtHVUfz5wjQoHpIWRbFW4tujbzdDC+WyGmIJsF8hcOPiGxVeaq5pBJF7CZClIsj7c4YIuW/935VwCTxRghFtEJ4a77McbmG6acuoUnwhY1o4dH5E4DJujr1tOHUHcuFqX89uthMVGoqE8XpsLr1Ym/3MohGOW79yhz83/egW92PD+gywk4IwLCjGzwgJ4WAVG+GYSfnxl65fpvMDNolNi869ZxyqBPasqmYjZGqoX8qnoL0/il6movMux5fQkPXLjeyVjGzPvHgwPFOLfTfs/Js5wVnnb19EMHLyVwDj5GU8V31iRg7YZAOo2tAdAOKxpimoXAnQc4EQFeg/1nDL9QDFnGkLeR27G7XmLT+3UNeWea0vp9/pe1ff/dgzdbYzlHplivn1vbuQTk0urP2eXotFVixp9dLfVH+u7ID80ctXPlNMZZExej54DvoZCAjsHKqhQnZIrxNqT110T49F8wTGbxEBWZlCIcHMZ5c2BZTFXCmKpktNUoty+GvPykHaCWtSAXAzNalNCVGqdp9FZBgEr5pysySQ4fzsLJqcF1aZL8sU5sDMumje9dgpwsJjqeZ6rD3AO8b4eQDYgzlnpaMgTzT3E6QQjVQafR+sDY3MGAMjqQNhDkGL+BbhtpYFXS6EDEX2jVgSUhhmMsuMDEGckZA2JR9gDST20olD6W2qU1G+pqkRSm/obDGTyWg5HWUDKmdl4vMPg3jMApwMnmzNy9WJmwmrxuRIbSKP2RS+05KElaK2Oh2E2AmFjPNOWjR+c/eN6W5svDuCC5DrQeFvCD/FmOLxyz5t58ngLghRHCvc/UUAsigtTMGdEGpYW79ZGAUP71NK2iHFyjGWe6x+IAMEJ07E9wp34GgUQBRBBM1+bEG/rtJqVOWG4CUOGp2+ppfD85J9VrNO8zljBETA5oNyOe+2WE6drcfiduMHQaMBvTczzUmEkD+iMyHXn4vkO1ciADQDcsQAnXibs20EDlgPgDNUosuNx1VDEeHWtczNnAxgMYd10mXdmRPNLlDUzNyOLYb3jTIjaJHUL4YQrJ2Rh3ZS1xt5ge53TMEgAqAGTszAneHGqR7n9LceHVDQi2sjWmPui1m1jM3grPLc37/034v0Gu9VEKCevozs63baUE2I5cNqUZooJBYsC5WK7z0yQZcpt75mpZhQl5d0hsoq1EVhsiwkGAOiQ3/aS01ZiTFyABKMxWx567SIzdwAMkNUOMoME3hb7p9bnupnRyyZ+OhdApENG57m6D2gRAeAtDSVYy0Pc9ooTRkKps4iQFkakDDvtojLFjKWOFlip7dJayix3btOOjBvJ2/MA3PxCJ8Qy5DK7yNRSciWaHQp0QjwjZkeCTLZZJgBXbJdQCRZxARQWSF/X79IEWFwUuEdPXRiBS18P7zMDJCZIXZuGJVr6BhCm7bVsyBwy1T9LqDwcqATxXVr4b45ocIdW7Hnfc/l+sidiL1qMI4/x4DHwUJB2SNrDCRm/PY7jgiY4Cu2Y28CupBFtR5DzdhN1gSfPdMwK09Xws0YWSLsBcpOwLup3aesb9kBF1obzH91L25xTIPVD9Tqza8IIKHUgUq4GgKgGPAu7iVoJo44GzObiq06MZWbhoivwAGDI/YutmTQATt6/yAoAAAXrxdVsPOp5c1gbxdOTEmN3U7beyqzs8T2rptsnAlJG2kd5oMzoj52QAb63TonT4z5A3YtccZEIGcxIAHaYFLCvdSdlDjo6NBRqtqGVjZI3MCo2Xp4zYmWTuGpVICJk4g/ckLEeiGlgUbBf4WXQwNeRdrUb7GmqcN72rO0DflBmaGNiuFP8xvjJhnye9r3bePTw/9Rst4sw4y0oyNGLbzxiZnLSwvvO+fZ/yU6o0jW1VQQvnfIauL4GcXy8QPGPcWRzZfVTfVCIJ77iaaEOJOxirSwKYkICC4TFMuSrdc3dBK5Ci7u7/69n6jzgyysCW1gQTCNJlV54kWI32HGgZhe1ku6RNkvOMuaFW9NG7O5S91Px7QlhYN/KhKzZc2ggL0AL7bk352gVLC6iiDJhqj58DWkckO5ZEduJJCiELE0eMEYnJiMjcZWyJLkA/prI+zVCJA4P1Tk/HJTkvwb47TEYrW+/l8YaKopDdch4pMWdzMMojibSB2WVoB64WwucXVkSgJoH2YaTvvIx1HXfHd9Hjvsz85DcWAVBFIsyxkQJgfsgHBJHqyJf4JnEyts2LwLgKwp/IZFmDEGc0psSSkubTdawSzb0YdVvoa7k5liXhUqgrmXaMX46rEY7K3F+cbLLc1jPUjEHAc01GYkhEH+5GNsMdSD0eubjKXBsBgDc2LBFYuq9HmrmH8g0HLDRhxZKkapaC8ke4F8UOU95XBsUvyWURtGk9WQGuiYt5RZzSbkhZljmglTF0G6bfzbQ+Hyd2uyc/BHmnNnuXKIiIMc46nmy4Tkap3pqWkm96MqFrP2O5ecTh2DwkfL8STZ273kG5g2SOWg24hysGyxOhA13Q/H52s7XGwUzbMCkY0DD5qwMatg8KLDhwWDbPvzGp2KvemZoJjj7nf/dbSXHVYsdA5gx2SY+h1/Z+XyyWxqwOWd+9iSAf790biQtUCeUxJnhhp12KVzcZAfy7VqH5yIArfcA7BoIHdmkGgIpo03biXtP9n/NSejteizFmXnPt06vD+zsbdR/uxf9dfkkq71/TEd1Fd7J7hPipUL43oE7iyHWnbMbRruLJWd/n1FDLTTxtD8h7dtaA8MovkToU5PtjnnkAXKPYcFM2oTPV77rVcwEDTjaicZI4Rwz7xKeM1c3yzbN4CNye0HxQ4Y+qO28WsRMWPgIpw1yTguyAQcRZrtdOGsLMaZ8Nk8k65ELaaF4sYyUIxE1oIEmJSGKzHvUCvQ2DVRAe0H62YnJixnL/Ua8EdoG1/eWWAKHsJrAZVNKJCmlsk4iQtH+B6Ro9xOAnaK06L1mmQFp94qzaS0CmM1jv8dAGDR2IL2ZD2SaxKztG41cavp1gmtQb5bqyaM3w62lydD+F2/OyhbzAMt0rUEnI9mZOCVw8n36Nqi0EZHviB8PUgy4knq5l0mtv5r7vK+44H2Dcr/y1vIipo6cZLxldNei3bs10pMwF/QU85Eg3hEvhxNRok8blnPf9lehIrQAXqEc4bB3lkCD3XqL5vAWLIWs/Hta9Dj/VhVfFiGr45nTELSU7C3/qJTSBxaExX1NFLjlCNRIxk0BZjJqu2+44hzOPtGgc4AwRDadKHHUv1qeQ7hVFv6V93UdFAyuSGArOZqnsMxHx+wFaNYQcaFiAV+uWIN+4PoR/l7Iiyd4lfhw1xhFrIsT95uqsYZZEP5UtR9e2xSVOx8dulm4idZLOwMFrzoWiyO+I6bknOrmmhXFFswTMqvEX4gPX5E/YcZRrJe1OWaP0wK4FkhglveA+zJBEk3uEbFUvS73mDiy+UKuiiTQltw69dxBWRH0iCHwAEGVj6W5W92zRG/hNMTdS8i2Vm1/rZZUgUYrHiW6P8mZEagE/UkNOoFKUGQCjUdIVOQXV4ngCcIhvmwqIQ4URV5WEUKCedfZ/xTzDKgEweQBA6CIceUHXkxWE2em0USIV42N9euNB2sYDTOfErZBuXBfgvvSUt476XLrTbuZ50DIox14N5fPYdR5lzKl+4Vi4BEQHavRMwNJLvtASdQF4r3K2flfPQ+DYeYzSS1yhq+wd5WHXp6BkqoLVnMhBFjeZoKCAih8bvR6SbCw9KXXNAXbZnyYA+4Rs50aMU1hAQ4GRc2LKFW03cQCOZebUc53kOVxIVVngp8T5ijuU2aAxwiM/OTbvorPW55XykpCYqqSLduALba9xzyj+Zh2kxssNQllfy8sPB3/Sm+H7anuJ2LOIqjFOh+3ObPbAI1qCnvXKFg4sJJ9pgfGj3yDiHVOovAp/SQda8jFL/zwvNKROUYKR97hsQc33wGKFSgLT8iwUCwyrLrO5tSlEeKZp10VJ8Ln0SExkvGf4Jr0mi8LVSzMPnW2xUl76qGCyVif3seHYm/ZXjIwFQGkwKnrQ7M/XXExTHxpis3YlDy/2/0YkirXhdSMamfvjVs083w6cHcwdMontKjdySoBMkEYl2nNVULhcHmKGP959/PKSHsVmBKigNxHEkI3IceJIXW6Xs1JIKt+OmhEa7r7FXOoL5dMnMkpJgyVaWPCcHziFKKl5YXaYH0EK8ggmboPo2IVpfr+wrvo9J6aA8dO1CguwfI5XOymrXDer4OV+nspjb0XVJLw93Ajg0/ZqPR8LC7mTmS/8rk37v3as3EmJwPIpH1ngsLID1U9FsGYbUphUF+k4+Y8ZhuO2YE7hyLJYdxvmQfQyjGFa+Ro9dzAmncIYUioAqSQtcEPIqBXBVaNq0vqV6nS5fTKvYTQZd/VM2eM2iS6ccCVMqNvsaf+kdah3d+ZwEwo0yscC/qh0FGvxddfx+PANq5NcO9Ab7WQ9tdKiOt6BGENENyyzc49UfLrDPlCMsHGRW8zzRXBrSGR2yGwMozEvNkjdGIr1wzlgD0vL82dxi6+gsVpt6HYelL8spCpY0lFubGpk3rUYJXUGFUmG33/Ig8sqtrLFk3V9mzgsUak3JYbPx6WxiTjfAEre9KA5hdIpuAzKNGuJMMP73AIorNw0Iza2h9LfJ5zEWYdtFzzoXcGo3lJyEXxahevdwBZst7ER+HYUpX5bs8ThS8D4mVDg7CdmQB7eP8zMt99eYLHx7sGWYnmaZFXuYofCWFQjgwd60bl9KH65fTYiPWzKkR1W1r+4C26soBW1FgASFkD1AWdgtBhL/dhGlKp1hmF1A4FNPg18CCG6Toij0cO9/20u2zyMYS8kruPjzBSBcpoPIFpQlmqx2jHfo+aGDFa7j0CVebXN/CyvEWvcNA/20T0BP3xiHE9uajnJno88C0wMt+aiOSZYPCIHr05zL/ZI+eMvqzyIM7OQPiOt0yen9P/RlI8InugAk8GKIQaVytwiVAgQBYa1xz+K79uiTg8Ald/xGzkUzq9/1oLxT4roohMMkeVDrUNFYqzX6TeAbR+hTm73F0H1ZGG1zggLVH9gGpEB5UmUjyD/1QeS+5qFkBtcIi6gS4hKI9LetgXU2OLkrqS7i87WHsDmzh1LsFLs0UrtyiCtL10PxOyMWusXuhvdGaGWUHfzXz3ZcX+56qI+ZlLzEGfMcUDj1w/kebJ27mHP36Om2rwE0vBXQkGoCr+1XP08fG0jwB1x7vcTPQAkoENfnYXXB4fkknsxa23ZE65TX+f9PWHwE9WXNUVsw2mbcvTDhX3AKKwGgLITqNwUZd0qwdZnppfYEIY2IaTsRw7gOi3PIOd6fFnaOEhw5Uwv3wm1rTOQ9lw6MY8MgxD1HmCoW4clFYbZMKwoWXl7qnBe8iVYKkPCh/5W+mrMpJrevw1jQNj/lTumN1FQVb7cKgAxbx6S+bpvH2/JARQR8zc/wUDtUV+S92hrihFBBT3v8Y26DWYh9YpJSr3JzC0idU2CoqL0BulZjBNsX0xGxxyYt9VRZihoQ9E2NZKXL3kErt/Bw8QA9NM7Wc4d9WIafmaz0TVF2y4YnjwCacVCQdqPs5ZVA1+XA8cq0lDBruEeihvZntLz6vEX59kWU/efTR15W68E8g/hb1/1hxGfV5EIV4jEOmAn0vL5NDbpOQ18sUX5ML7IBauvNqCNxTRmFA2GMrqTUQ8v8yFYOncxLRMxTgeT82CzVcvswBmkVAYo6vSzFBKeCcV/mXhy+bdzC7PcI5tnBKcM+RGCf7vtKoDoLq4LQN8yhfG+YRvbBh14S1Da+w0f3fEsLz/g3r8lyvYHe3ecx09k1iYH2pAyqAauVua39aKRSZuQGNVNaYrtPDfql2ipAx6xILApr7OpcqYPVITV1U/Vy7+XbXC93jYLea6qxRxxRqNg7wE43hbCErhzlp7XIwXSw6NRUPM64wLEB6DFccpidjGQOZRLna6E+viLKTTzbI8szurQqQjKeJS5AsAsXt/7Omeo3y0TUs+AS8kGqs1EogZhop7KXGcbSMvORBxYyE4ZVjiDpfdLcfSwyxEU/TWJ9PoZeURVCXdnYjr+4sW7ntpYPyzBSF5+gvLDXGj7rHLxU3rz5qRgv0kApNb1v92GR4rhPh3XSKRpAmEpgwBEJqUNYKSrowYNrAJkhIqexF5ET9HrLGQ4xsQAFFqeD4BLI9yA5P8mVRG/hK5arZ8151tF7bP1hK/YGceJGIYXv/PsHW+vRYwIOKUw/fqPpjteln6AJfpWcAM7bJlNKkW7IjDsGeBnaeuLuthE/qPKiUq2VIpC6Ubzj/1w2JJw037aqgbslLf7Gd4Nvah9K4c0d1QnSMCueMrCh/Ole2J1F67X6k60RrswKt81D+579/YXVDXUUNQmlYJLdoyvosaf5mm8W0GOn31DfdLIKC/+iTZkADA+B5g72XwGWQextd4ywF20K1hfD8FC0l2A5j+I00tDTfLqm+UtMPm7j6NlbuP4CWIHUlEMNdppy7FEQaMAosayNn6Nll06y9Y28gXYp5x1W7qv2OEk6Du9tnMDRxctKD9iS9WtJl4xEmQozO7I7uXoVmQFSxOcAWGzSE9Q8yzYouhpr2fibm1HhHSr15TWxUV7OpyT2/EgV4iscC3fXxgb/baaX/IdcbnIFsx1UipwKO4rw8QGRNJ1tB01dzMptJCJNsM0IVLi4ufq3BJM2O0jijv55RqQrCZREZdW9+QP7/LeUzCiPN3wqyX9xTxL6KX22v0SyuQcyR83a91YpRdqFyM0tBIiXxTXIBwK0WdhxrzdszcwWH/LzL0VxzFVuXk/VBNQI7WJWXem+Yw6j0h2ywEu5RoVBuBA4ede6wZLCUsgLqfWGB1zSFiDyXRtOfnSpal8iQquvVlEO13NGLeUCW7FePcUcJYFEaJ8w94idDHw01U02s469Hirschh9F08FCdKQFHdCSTOyzQyXpAiGGUxVw86z3NnLk43orZF0Fzxw0zRDnqyxxcYT1i17Zf/+tpE7+lJC50AmTnO9Ds5qh9s04/KlZqaHEx/bpJQe3Lou4a41tuOdZSyOt9wDzGEg0Vur+InPmB3IQebDIz7llzmbG/fFbrk4jGB5mBF0p/NoqRzryiyBt444Q5mL+x7zkefBGmvKtmMYqFAMNngNLIkcGYC5et9XlMa5vqqdZakXnWnJ4PksNSHL8uzKBR9wIIlNEKzmq5ExsNjP0nUso0A7FU5s4+gJJmG+RTXGH8T+6HxrR4w70XdF5P0XNWJvtTpeT5+WiPcSkJI+JEq/KZ5HXmLRRN2QFPB8q8FewBezdIqqmPGpMDMHX6Jss+F5209AFmfdzoNoFKx3CnmvOpo8P5IPFhqfDy4ZGfQbtzGgk/m1w8mt8VojGwe2RXXO49TLNJLhthzkh0GHdYXLkBPMK433Y5pLPqpNct1bKZQjE+upPQ4KU1nHz3NUWZCUari03L1MJw7l1lVorlQM/aFeJtgAEaV9GcoO9p/V4EsBiVEaQBxNBNa/zsiUkctH0rKocREPr1HIUoDjE5FZBCs27rHh5/rvJ93+8n18lqKJQIn0C1lID6Y9+ChDf7wFEs9KptngHEI+G6ifQBexRQmNvR4e1qx1vbzLGL3Uwg7lgpMRTpP1K6ZOqwu40u0Ob64yAX6uqeeYIT87B0AYA6a8WlFwUnaG0MF5wZPUtZu9iVJXKzZcmyhq451GPD34qnHcsfoiHKECYb/HwGOdu5GECKPD9ktL9cQI9i/QatRyDrbBSgB/EolXzMMNnuEnRx1QtHz6E4QkuZfPc8BDW4YjrwHfqOg4dfenIlRnpjnJmn6UQHlkT/saPDjykC8Al9Q4IILZTY6j4Xbr5hK8EoK+vNzto2Nzgx06Wch/U5RrYPfFvOiv6nk245WRbyaItCYB1NSQg3zWdgd23s+YNNLO7ips+fq8NX6LPOfrK4Va6OcIlgCk87N9WhQyfZj51h/v8KpMO19vAP6h20BTPxsEgBxMQXc7VfM40I84EllUt7DKQ4757AEaMaXPz2ujr29Y0aDbquQ7vPEyxPcu4SO4ZcWOZ4WcnHAezSQPFa142+zVm6vtvEEx7aexd9KXZf3uaf/IhL4wxHyH11sJlx+RqdfJTLTQ7VRYRPwhIZHvD+yMOgGcnf88kfOA2jgNN43G+4Zjl/W5egXnDDjib/fsxTapzNUpbg7RstIlbS279UAQVHg7xrzI6mMqpD9x8IxUN6Vr1/UUNhHDMVGHtPHkBe5ifemTZbPTlftXnSvqqK8Dz0MyYbJBDQTCzW1ryELCJHMwwTdxj7GNRnYWCGU54akwz1xPHNj+R2oPod7V/0yeA0eYQ7mmfyk7wVTB/CGzJ7POfh/ZvwIC7zJ34cYFiLXnnXv03PQ7aVzcgdti0MuPZYQMhotN9Q9uqv29CeiEkat6fcKRmDvdGWDTM0Zs/DSXSCbtSlv2yffiVFTnwsgMQwpBbZ8iRUKFVR/BHExDtCn+szBfZmblqWU51wmK3LQafRo/m0XuzTCp/2YQ32s/1wMMwWAtpDKvkA958oCA7T/wRMi53fqZfklKaFcYVFJXM9iQnL29LSnCbSv9klmIcaLc22QeIA7oGs2DGT93xj/FhxOlKCBDftX3AjZiacN0d4kWXtXXb31+sDk+62adFPTxTn+m6SbTLwu5qNx6TrEzhR1prLPFsXS1k7nieg8Go+v0oA+xVyEnw+vHBWk1ygOXmB+HgUmpfLDHeYFGfFyXc2J+fPkt308Ppf/pFlksp/bJepkx2kl0XSyA2i6jdg8F7RmbtSZqhthV/O+xfGXbpH7lH3g+LH1+6j2Ok0yn6PznpKUkpkg6bgMpq3BOUd+VvHTbjDrO8yeyJ++4pzsIURRtRLAEKmNQi5dvA5O/TJTYKrWYwQZwHkM24erpZ5MiG1Hj8nGFb4U0VCjXpgxmjqeqZSCzD5AYMwnvjRNAlf/3DtGhSUxLTyvhy/uFa2vcrihn6iHBkF9xFq3PxofP6ie7fOQeJQrv0GH9p070Ww76cYkczi8h9O12C4qu/O+n/XLb5zNKJV7PvRjyUnu1opp/mbmL2575GAS0Mrg75wq933SbejxbZ2bErvRUw92yGOIB7bPOV03ZFRnPHVL/Rcc/vunQ5o6OZngn7/s8WhlzGNTBlievj+dJAC2MImK/cxHvE2Ft2WEiij3LzI64mKJclywnlmxqFpp/FtvvROnyOMNW4w6KPb0ubyjXmCXTkuNMqMlWA8R3RDmTBmfm8ZTgFG83xBullGHEkFcvFcumVCB3OTLKjCHDPbvQDIFVU835N3Zy2r+fazq+LhdI4RS/QWyJK8rJtvGnaEO+VLa1qwPWeNi8yFsxUYimO8LkfRiE9kZle9zTB5TC9YAmM46WQwuACsNpOxP3/NDLq/kV6ip8oKClQcqVhk1gSItbmBupqoijPiLyaCLdVOUICGZvcX1ZMt5wqkx9K9lKmLLmzVairAhcF1Ui+m7rlTTTGGXjUAiLKNaLinGmlYUGuKmgxmIuca7IKC3bglHwI78Sj1e0Y1f5A11p0kiqphBGVODZiiCTpLS4YkmmiL4larjdNmooFxp3BAPNVvLDFkyzfYDY54a2WKDZvQsSg2ulDtBqb8dsE7JHMO2+o78pJXbcAfdVZi9s5KC3g9ZamolQcIkCtAfW0Pm4SCVxzlmrf4GqT+u3D9Fg8WPH51U0utK7zrD+Z7817phDtg34njpmB8KMGTO9P8vyMMLKMTq/7Ze6dvfSkvvv5thmXXAGHrj4dKuVICMsAjXkFGKE5H66Eucp7CZUVNhZp7uaDindSzA5LXuQVnDXtFv3Ib0Hz70SUXMuVwkffg4J4gjurXzTvyXZKeWkx3EIZlIncTcfkywjEUy+K5zV9D1deU1ZOJ+Yrr0mbtMg6Lm92QxS85G9c8pXrsDpH/ayvyu/PXe411VzSxsiQWALhf5ioNHuM5Fh1XdgXc7mGOKzPjKYi7pca3sKvfIS+3i8A784xK3J5i9zN4MozezPO9O2b4Hkos8cbpPwuLzI/ID2Hywdn5vI3G+vJ2HF2WrYwGV2FLdB54Ujpt8fX3msV6OdlfOWOp4Ei4Pu91g/u/FzQUFwpWy519lz4d98jL2mXY/CUt3gUoHdFqh9Vxz1UdpbRdXLc7GXdbNPJchXl/zHx1u5/E5gUz3f+fC4OfszRarvNozmPwD4xNPHnJN3TsCEwbfhIYiGObmJy4Nca7OXXZ3VB3aIqeQVL7Ix18zy6XnhvOKMazSTG60p2i47iGeCqzgOkCziMGDiswvpKvDSdW8wlLf+Sa9u5R63AtBYPj3hSKLbHIPKw1xG66xN+088U+no9jDhslq7fmEfqUHhyO7aSZMhLs2AB3YXNFhQgYVorXuLcGvnYh37OB8zDTXRo8V1tdVybeutA1inpR/ExU8OwY1WogTwjHn/gWPwkPnoD39oXvXeUDvkF6PVBr+rNDvtZN8sfe+Cqf4BgWKRgjsP4AsWH/iNZLw9/ndEJrIJH7bHINGhSqWvNBC0ZzG5PN9YdTsC5N4mXELP6Fo/GTvBvnttB8zyBZIsFEHAWQOP58jaJym48P/cQDwWgYaTMZUtE/c3IfgNX9K13HOptZQyDheQhZOPVgmjmZoC+2jD/QArEpHl6Nb113/zYyNl9ZrzOuardToezdEahpOg2jV3rHmzVI0vlQFbHRZqgrvvs1fx3//Yz8vw3JIqYALNX+WN6jz2dDVnu+648p+/91uUNkPB6bSZLJBJLkOGDJ4YWts8klmUsTOQI3cg46x0FE5oNx1pHzwRNyIs+r+RlK93GOHcN0vAKJhahCSTpoh5ch83sHoBHhjlr9SGe84tjRNhPiqK2msFFOh39y2wLGeELm27yGJBpGFPLpYFVeJ6k2wq1rMC1GEwOX49dW4ewL73Lp37/xhsHur0ogmPW/ZOTSRS35Ifss4r2SL9cPrRNlL6Avqdzn30Sxsp/dKJQer6xkyVptS7Xa1TsnE5zgkNCIHGXlcqtuHrKrO+PLW/imdm0xIfb9aUVuKp0Ns9izFgeGLJ0mAlOS5pwLMesfhoePcxVzmFt7syCCanWYMdvUmp3IgmtiuS7jxIgbNzuaQf7TeRaZs+KcNwWPohnvgO8paH7Rjpv3CC02GaleNHa0z31CPVbJHEu/hilmcgLpqw+oqBA32D25NKxYheq/AsgYJPf8EsKijcGFjy/CylroVKy/UkCrkmFmSTw3C7UPVRIz+aM++4Zszj+2P2PVZ6D5NdkCGxBcQLUrJ+hOnu8HoSTNWUs88AsnCv0nTHSB56k7Syer9DzOhAu9m9TtIuVsd1YVoFbuObuyRivFOCTHq5IWjq+pZLkmL9ussPFNXkAbymBnrGleLFI7CbLqt/LJj4PjdA1X8vMFphonHNbdy/7QGO+MgVR5UXTDIo8slsQ4SVbcA1ysHwcOwznQGc/bodIzg/dllNsYHoYIFpPec9GOYLyAlLNEyQapk9V0DowWC9BlS4rPvmx9xywr3qUz66a99TZ76x/m04oh9bWJRt2lqMklS1tFYV8X+T89djO0wtLowIPpXsDuPi8IEJf4iSPq8VI7G0avBc9G0r1pjh4zNwC1JjJXc2msd0yxwDQe8Vxr7TsUl+KlPpwnvh88mSTM33Qt9ZImX+ldL14bUcMZcLHWxLUhUDWmwinWi0n5hBDOsWLQehjcmy+eT8JPWMRsoafZK5RJy0lpD6w6eWUZ1xEiWOZvQF0zAiclKsjaAIxQ4T+fz++qgIb+d/asZjN3B7fby1l+xhhN8FVnHl8iVt5kzpjUxZ97RTiou2Y3Dnk6nBjlQO/Jbq7DO59mm4s8eeZZNfL8AHviIGYz1q/exDxzhwY1pVnZT1z+jfX+8eRNeYfGuxfioZ+PxfPYGLbD0LC6bx+Xw43FmBb3GDSYlWCOnWXGhqPQEi18D6jLlE4Tk0t/rsBDX1L77egO5/EdEVnbZLXQW2+BJDLqdbG+7q1jxM3zuEhgXVXqvBMmAq9suQ5bgef9KAYE0yimTTOtZ38HZGCPbPFppT8hyCl7IE5shOTLn2cY61GrAvw84rFfDix7E1B0v7yiTqSLjaJnj/Str6Tsy1wuboeAuVGmkAm5bDTvlMChtV212U5/InMGu5Mu418zKd0wJGkYXZwu+CRPxYsvdSpg3+MA8wHJud4h+JPMfm0Gh72x/sEJhCmy32XfPwbudntINuNSb++oO5qA/18rwvF/7ZrKhoQ5xobmCSl6PKMCyOvsiVIQQF9pEnz9DDB/vIz6Czsg//trKxYIQR+RBXQYLCCamY9nW3Z8Ob+l/Wc8JHiaPM636qJreb7f3CDBXH1JHlcgaXxlofIAdTnEA733b/wom4ikVwAtTvr1Oa0SwDUOcFHco5WHosa9tBJdROM41psFBbTJWXHydw7iqoJhjDpxjq6JAcf52kd6FJCfw6YryYApjaY20fyBphyK5TOF104SBgOvafb86rtPonQmjNcW0ITLFSbLSViYxhHnRcb10m1YivSnTcF9Xx8LAm0rf1F7Fdm1cgTOcGMSnCFpcbkG7HWptvi5LF6Xh+FqAcmQnBhOAECrSN5sXbXWoUdPp+M9uFY7Hz32bV4pnTPMMhiCwQe83zPk2Bg7CXueZOGfmB7EtQ4VDgu9itp1zF5pER8EF4t2nELrjvnpwnF+vp4dzQHwScSjEsgni4IuDj7OVeEv/uurCMRpnbusf9sQkz7/KPYfGnwvYtEO1cDP/l+LGIUHOpdrlAGyk8FPMpbacNueQs8Mc2qGmrfJQdhbSef/quenMSp9vRztt4HhVTa2znKjyZ28vr+WcK8m72eO5UR7Qapykf69smGOCP7o1aNbDQ/0B2uLAsVTSuw3E1rs44NXI5wjUXKQpQwlyX4oa+dBEGPah4UR10jCDRWyKwkCRqbZD/1RxD36tfeUZWLghD2Dg/ZDBPU0E3z8xGW2rZ7zc2M68rc+5zxmnKiHXUaMtUt42JbC4Zvv60Wnh3gX+zLvezRbcVZqqFg+kI1fksGBWe8Ufk34/E5hcyTaVpAeBKgKLE7zdSgXGrdAkYDv6zAhQP3Ml/Udx1OVT1m0mOjccBowlFcJ4kLN+ef3bIodwc9I1zJFta1tUtfheSgoUtv19bS3zbgfNqwubo+HeEuO6bRZDYOXfARg8cO57/GhucsCN6IR4y1E+iPT4uj52D3zmdoGjNq98+QpWcNJ4cLPkM0G0koy6Lu/Ty0onLy3kKBAEIK4zAED5S6P/3u3qqXg8Y+qBKy/sNRkXAVl851IuJLCv3M7nis8bCAQdR4ODm+KYrJNvsz//jki0jQS1Pak7/6TA22Kp0eXeQFvQNjDj+s8Dwqhdt8UQN5M64axNprVM6sCh4sHvp+bXJ/bcy8dNy+XGBRej0jJXc7FdYeQ49eDNyPjkNymOwUFLFLSbzPpLLwFUSRxBNdX2teA2wsnYH4Wt2k0nBEROdvz8wF3StiFubjvp1/RZFNXp0J9GlrEiLJuS+GFfAq+Tg6YBFtH+oblPRTgO9sSPzH+UvmQFZrmEkTw456ftzm3TTUp/50TveD9J66BtYtxwDnOhsDG2XDRt/X59Q8daqgJS4MM+7z/LVIScwDP5YoMzb0Ajyu2GuVyMPtQaa5dCNqmUbRqryIbKnoeUob7RfiaAosIX+6qFFKgnyu1wnQtEa+/dQadAssYjgRW/XxI5rJUkIAmnXol6mX7lOoO1AZpYhB/LIbpxqjCPWZ+E5RySPhcSv4KknAYO5MMv8yQ/qgKQyXJyY+RJwhmAFS1zwLlly0hY5RwJqHlEAddmF42QXZUBIT6kUO8KRGgd0aAWoz8GfYF9wf1/pv3/j+S9/9RvP9mvL/v0nuoDCnxKZIEzgwUZLuuyP1SrYl4ZQsCvTTqrqeHSrnFwCRJAy8AQlpxm+2XOCfklTqI9NOr7+WtSx4YWFTHdCBMgb7m9LKAy4IOCW32bDvq1nen7/Xsvfi7r9mu/M8fgDMt3KWJtEB23ed3W9xQ6msv/R+o37y3TO3i7/ELohbAIwsafGCRgxiT7nm4bXwN2A+OUzPLg/rdQHhDdK2lFl8U/IeKH/S+bK4PoYU6CklZlIMHAgWgHfXBCS2Xnuqoi++oS+AZVvFyqUObuAgyfoAGLI3gI7ni/dYWn+wfKD8vHHWWiN9Tfl9ezBc76JcfOVUEIdMkT/jAZ6RV9mFX9zuzjU219XxUcPevjpJ2Pkfm/Pgp1f3ceY4DDwl/6fluUps3ZNuvStI//f9Nzh5aTsqT2ML2BpHPqrkWQjAo8NoohJA+en/rWxDIe/vuVx/JPVDklyEKZpaGdQPRGgS97PyRvMsaDA2eurWoY3aiICENRF9m+VA5M5+RsZ02cHHVJP5dzHPyGK3d88qH8pWM1+Jf2j+8dqlfoAQK0LF2K+a5sU5uvs71dqs+1Byaq9Psq1sp5PJUQ7l5QjplKDd+STD6JRaI6mGxUqca0tvcuNuZNU2MW3CejmR+KzKr8wi0WUd87YZ+I6HRV+OInAyZAebkd3QdOtbc48c/K6xQNK+XZmqqIOqNAEeoNGBleAjEV4cAa2gIJAeGQE4P9e+NMVQ9KtxDdAGUtHXbSDYlDBzeMOC3w/o9MoZKtM/GGPmCcAYa1OWbfPhl3yRnVgWQ0nPev23CUG2gxMeoQcYpmQlvKWdtqs1E/BEQWGH1/KdJEgbxiQBwysCWchaQiLgBEFABfRd84xpxV9ZdLoYUeZPqjtH4qeXqBTtVAVrUrHoAXHKm9fdAM7SaC1zM0QZOGsC6Y5nzV/8uNaNKcEo14Hknc+sUIX+6md3j39FCad/BMrsA4yhn3p8CXX2WniAcfuwl6CWRpmDs1YRQ3+ElJha+s7p+NTlL9KX/YW4ULbEghnoYa4+Ms6kNRnfsU/uKnCt9X3cE55Qu1rX0sNj3YuPyTO9v0TJ1Q459agxmZotd3899sMaPnKECMRGMuHNAkPCDQM9BfT/voYXaoD5HsiBZABl330O2X8aUirOgMwUlm9kFtT+NINC7F1BQ9qUbVPf4S4h3jyTInx8gsi5PAHS9MAfTQNI98aetJMLZ73trBhJav7D6IufxPTuX4l932ggGHU7+DaLUb8HENUHDay5Bkx9kYq/Vt5cDj7jyvX/i8cLeRjNvIDa+v4snrjGEhEGWxYrFUa0KdcfBRYuo84b1luMeyk3kDQ9du23FY2VMpGzwTCKtmrZcdTIl9Trwonx+C3H+4ssLjopM8zaFIKkxGXku4/vZw/00bnVif7bPwPMkOx67yQ2vdlDCkL0/keFDmOot08Jd0v+Bz46eNdp/Urs1EvE7sURPHKpwM+42IZC6EQCZY8GVfT+OwZ4JcDcut2ZBct0lyLqxyB0heCZK/PzylfVX2tiDXgkK2PF35wL4PSu/XmnMRfID4uRvqPF4YnxRfgML/BAc6Knv6dBT6rX4jiKh2MQnLdDUvUNRhxpjkWeuYM93+W6XGi/yfajjPXkCY7NP+hYxxEOz/21lvJcJIOFWvus6qmSzLZ2aMppHOig4BSVpcUyj8Vc+lj4tu1U2yMYpJHPxEPZAixY2JI/sYvts1HdbVgLds9j1vlI1ssyaZlGGwSZMu1Tt6D6orcq3IOlXUsjoGJXEIYl1j3NHCQsuzgWI2rmpcBIg9eiOn+anzAOlLO6ge+1uiD7sVHLjssoD4vkrSZ/uWeCDhokY58tQ9hoo43LV1tw5lsVyTQrt59v1BW2jtW278ARsdwdVobn/umZWq+K9OPMb1HE+Eu7UfnQL+DWcr4Q5AKP+IUfHNrCwkynW2X/HUzrG5e9diyQnAHI1Nc8dDqDnHhaSzelndq4RvBsMFfXnzdR7brqeCl4/aAVOLf1UPz55wFr2UJNyzd957MKKaIq01vSeynH4m3v4J4oInFOypIzE/rNDrwPMDCvi5njOf13yrSnjo5q81+WG63SxS1f8bF6pMOz4Wg4B5937PYSZw9cajEO2aGbN+J5nWPSmp/FlxoD1C/Mxgf8gXv80Vj3orXV/epD2lcNcLNUavqUlPBZ9IrvylWpKQCynTID73sWJTFy+mkdNdobHmA8R1dmUfLSB+JaJcGohqKsFmVPwgiy/fh+UQCt4nM/ykvioFJ9qHOrX65xPRndnM0WN+9w1tOlGOs9xHRtXL/XTOP2f0rnMT3H6hb0xQeWq1gwTFu8Jy/WhFelxXmpWFjEzozIwhPtQABtNZI+Lw9ufWa3Vdqi9o3gs5tslZZ8/irbH5eOFFITos6/+vXfO7fjLsrK98bL3FM+FR37cH0smkwINpLa4G0WGhnsJovJc3H0oIjCRuUgxRM1BEdlqHyDb4bKYzn55yYQQIrMjedBkb1Ig19ltczwwxKhI6orLPyKcRaFF5orhrymIekDjiUBXUP+oQ9Iuq8hMIT/e+usGkdCOsVJptsBEZrr4PAnRkSjgMBYvj5po45HQRs/SVr5BaVUMEdsZdZSy16SIXFf+TCFRlKh8Y+oOlIKW1YWWd+kkq4KgUyL1hV2SsNmTCug6+SsbmiUIciG+aES7DDcWCe0U+uOkqTwHRfwQtDgLfYpLLqCfYf0jT7nfH0gTkdRG88NcGXhWOUTsVwExNlCR0s/8MgxtaFHZZuSIVedgIjOF3C9X+BoZHHg2OnidARvCo0IBwSu9ccDxGJk7Z8Vktn0FILoiEWVGuqdAzON7qFNh/UEwLrst8xfibYGnhm6AG9n5cOpFvwDg/mGS46LDfu4BTweMFw7QElFaxeXCn9FBhvejeDQNLetR5BxCxqZ6iC5lvv2xQIHYvQElgQDy8+aw8DYOKIZSUT44+cEE7KzqXNJ2tMW5C1DWwcAqTs5ksekHqDPI1qHRAo5qVTVXc9cklIEloSikhq3sWiRbljrPAwelMKcc534vWVzt1YhTDdI9l9mwDVYjm2/iJUJS1hrVTJ2sunGDabvsJcQ1HpptZ6nx+PGdYY2nPwUkUQ4lS8Tjnvk0C0S8xoG7MBPya1ybM6ZbLR04cN7/3VXjc+lGhLA2lLWotLp13mGI/uQkFfNjP1nM2PNqzuQ5hSdTATKxqOq2TuKn0CjjKQxlPkWwUOUhcw8R2ZOHyRZ28RRnW4E4CBtgxYLqdHsA/nR9HdqIeDnWSN/TeKCot5MJhK6IqhpsAEJJztvaZk41w4FMeFUgG8PP/VJgJhyC/K3jFHPSVXODb0JBbS42KXoUvKVruBwU342CkjT5Ki9BEN+jicJraVDz6/0WdM1ST3TIsQGDVLwRDgu18aHUKVQl52BOwzLOSwHd0g1xxU9ZdWXrSxcV7mXzhwKHIpILzw8AAUyLQpEMzqWBKHCiQhYrqeW5i1r4HVJzu9nH5L23SZtDUXt7rlaIHa8wokBYgE6va8UCD2XjxV4dycKSBvxx9ju6hCfX6Xw/Hx1r9+XmV7aiurpK+lneOYIAv/nyE7LARbYFYUNzzYLBcB/UfbDxdjikKv1hda90Z5rhNDgsz4zVMNpAihRR+mPN9LZO8rbWEtZ2WUxiTRuKCpyBSlkefGngGmLne5EqEKblgny0MMf+apsCWHq5JKkaJuR0UdEs9amW5qg+EYop5A8FWq8DuLWXKhTyONXB73d3yTqKpQihkSxAYi2XlflhHAssNzUo5k9bLy1CPnWzuoCPeVWViHVAVaqbM2iq5hkulP4SOlw7cRmcCx3B8nxoi6kwqHboZ3RZC9BCalIuUMJ7ljC3rlO83MEGb3Quy2i9nQnUz8FxxCrYGKJN2SB/RYZl8NlBDGOLwDiIcU7L/cih8awPsSnCgi5SwhW9oo3dGBGo9elbC63cYOu1cp940k9mRelCSfR8Xk50E9X4JjktXiV02yBox9zx9gaYKB5xPDe7VeyfGkXdMFeRIghsHAJMJTLcJMQairSB29luj7tk4DBQCfsjh5XwmB4DvxyLQ28VyF1tmBXOofV3ZPKBdXhk3ljPxgI6w4FGfOdf40Y1gWqkhTdYX+WhG9H1NrFrt0/rGHR/Sf1tzMl3+ZyvrjwuDsIk6Hv2Lla3GpTPUJSvlv/CGyj0N/plXV2WcRUMX9rqiwItpMtCoDf1ycL1I+dJ1HBnBy/s53JOHf/7Y2yKOdm6ob+LT39wike6atNW2nJJ4U95iYmhr64zgvCHUgXDaW3M/U9x6Ygfmm1zgCfR0tNoPpg6318LguZt38DjTmnfEdKTSseGLKQMH+bufSEqYcdPCwISQwaymURRWLz/1CB8Os/xx9ZI3H+UShFOAHU2N3Dw98QBoO6b8xz6KK5S3U1qgDsImQxfxx0CDgg4cMfh7ThQ4MAch9XwCAlogs+WU3JGdNC0KIU/8otcwEJ2JDtHDlkCEHBIBN6jIYAdBb4OPKkEyxOyz1qs7PvzejfoVacxnCenRdXm1TuV4EbhSfATRQYQ4KKg2+lhKxDvUOS3JrJuq1WPK/W2TDqW8RghQds6N0fEwr8M4QherJfRjM+wdoTFw24/uf1CkEHdDiAlfvdGlXuBalOUYBIX2+T99G7CZK9J9fn4Ccnr2+Ivs7tdDZB8odP5jnY5+e67lIEtceTt7zYKs0/Lv9DQzvtwnxTDSGzjkag9rn6brPgNq+SKXnkVBFmPU0XuF3Gd37rlXDkhHKCedFAQcVUJO0JYShyPB+trl2+yAg1OwGQmH839qC9u/jAWcJfPtIM/585v4dq/W7nQ9e4DfbyVWtO8BLsUUJNY8RPUNY3ZmyzvVpOo7LGreHto1vk2z9T5i8d2qsEKuLo9SHBn8X1IyDa4CIyxrvCaW3I8k286jzq+LP4QG9O3rExzztxQqC0bRTcOfxyJ91PmnB+bFRvHToAWCupEbExWHzDtrYfwawHL354oZsg6BixnUJPk0QYC3Eq5VfSafVCJKbntH4bOeVDYr4PaMeFusiRj+NpZ4pWlRbEJNcfM3g1gvlMtrD/C019fX2F1NJBAW9urec+HDjGN+AwxTqqYmMdjt7JE2Lh3celZlvvMzXwijYfNBjsztw4QudHKSY7evZK8k1uXs0pHcChoKDHyI70JYc7vSvai+OFQ7w0Y4YP7YAUILieIUjZqWebfWCbU93ESuh/DIZ1e5/HqzGI15AawU7pSsxploeUqG4aVUZLnYjP39Ed41YhTiP5saqfNPOfD6hacLsyOY1Nj2FEfCwG/QJsAwjl7p/6kkoUMOp5D6ovZoBMUiFMNQSAiWs2IdwgJuleaVc0u8jyfuhLim9C5p4l3gC0AMRld/3UwRLQFkOeG9z87Dr9uhe6XMKwaEONC+fzB8bD9UewdnSMCJJIscZYKubRc6AR8TbgScEBOb7DmhVwJrosMYv4KQ4PlLGN1RCY4L46b0q/4nsiOX9gNroYVuLi1wgQNyVt3L6AcXNYp4foXGFfCXUlMSiDq6eDqYpNt9Lrh+aStDThaxKRa+HsAtWwHNDk/sCTi6ebWfFeGn/wf/2MwqnZXJWZtwi99Pboe5VNpP18P/fHNYbl+EbDHWt/qcfh0KNeX7e9+syrZXL72v35z632qtyHGSjo6GQX/USx4VSzxx1dP+4dh8yWOl0/max/1vhjqQX95cLctrpq4VSwSlxXT/C2+anvhX5gtedSmNMWD6Hj+erHMlCfIx+6VwVjwxGrDCag+6BHq2kaCVMINn/NFSt4ufDE4eSMCHCpE2IMRMJJrNRJU1wHpUptBdTM7/IofbWCVvyKXeN83skaKfMjysA92z6493NdNZlqSIJhUTyx9FKyQAG9fnkSukKZs5rgPY99MgUPjI7Y21WwqSvK1+cByLlXjW4bthKT6CsM6uSNRL1n0fbgTzibAIHCpo4wO5/T44OrN/h79+7P5eKuR4ld2OJhj+EQGNddJa7JNJZhiwLB8RS+guQ6ApOrhFPUtA65v5RrWExh6FLcDBDq7uf7kCCY9E/8Rkp+bLH9ZBTZjPoKU9P259We7WCWhVJGs+v51yNAbAo2m29o1RAlZt+QTD+FizI6rw5eMHM71Ncj4ZJ2oRuzww4CZ53mPBPX9nn3uQ4RSNBAqfoVlstsUOAq0017udNjyx27/+GulZjDiTrvRLRMYzqe0ziNLwGHzzGsW50bJW58BUqpr33l3COWrm2gPsnpvZ6QKB2kXjLQgDjbxXpe8/yfb/hY3Jmd0S9JtyJNgpbYXn607OgveGOz8SpdUNnwu3ZnsusCnq7JfeLsh2OeR7QJkuwDZ5pYv7iYH7icR9iT03ijincMxPp6ql6EkA0rvt3qAMdIpHqtodXloR7j0HovG8yIIRwBkmN7Z0X8OcbBkjPs2+tkoQFVcO0cuw16ewX8uMnbkjJyOQitUTYI+bkdUcQS3Snx/HVCpEOZ7iaK+j1Wmdix+rJ+eqXXd8C/GcHfenzppRRof7OkihAB8Epv0wOlpuG4o1XGkkgL7vhCnYMIO+2QqEVzvBosHqKc1AYygVCto8NtbUO6NvK6G//cFH94G9l1rJGG/4yC/zPcMnfvlMOemQBCOPCa02LTwu5OPv56/uI4qK/6uKptMVXlgo4AS1NY9WVqc6LorDs/Fp1POQVsBUSae55j4dwCKtCLF0P9IgEceH0TIun1cs7nTuX1AyVZnDDdQMN4iE8PguN+p5KE5Yrw00Ud++VE297NjDMUr6oLJfD4enGmT7yoXZrj1KIxSdXIqRqaYPEisvDIoe3MYq+reKfI2UzCvUToIjK9UIca1nd6iupSfudwcIRzAqHS8keKTYNptcciLqgoZNaTCqhtqBKVRos6/2S+qCr+ynMAC3eqaoOzBB/fAHXzlIQDbSNeWttmwiThGYg9gGcyZ33bFACIDucd2d3HFDHZ8xUtCkY9xEMHLmPCopyCGaaD/BEwwwm29aM/ScXDyGMueBTKTu59t/HAsG1Mw6hQZfX1U+5nMH7VTMnb/HumN275tp7t9oRkYfHAl2oFffXswYTluFSLYq5TylsidcIDw9j0TeoEmO6F1/wreJ/01NlN2CuVRfKiNdqbEejklX5T6XuODRR8KFWdpu/KheGBHoYHQC2ENa3FXyrrsctNb5fSamyW0cYdS5c1zFcyeqO1EcDXQ/KB16YoZFUPSWOiAzHnrfV6Jnxa3NTXb4pN+pqckZpGc8S5c2Kabp+nYBwxqlx7EMpUbgzjvhr0RDhtzG7Q7kqQxoMfBS2GCtQFgESsg8jz6nT0sihZkOXtHOzFz/4mu/aVJrWSx7su+vLHAne+JmPseLcYtsMyLTyH4oV+raRkJzzeo1DV2XYAWQTmGxn+vVe6zaAFH27x3iiMkpLyUUCgRIlPK6sL7b22OXJDx+ttWhImlSiP/LLn0Pw2+RPVamuKEn+Nbra+jNas8UnaxWdS2M28xwQQt5Uf2p1aZcHD9a2Yktqs7+3bHUTK5RfO4rhC4p3Zz6YBuzclDrDWupxr46NrqQ+LLYh+vBNvElG1Iom1WFqNpk7JIpdrVXOpHPShmBlDC6FhiEJMzNn6RtgyaqRUlwBuioASg+mvNCzx74OMgapEn6WdBGDR1zYaMIGsd8toJOYcYbAATjOiGqFNH4QbL4wHVh2f6QnJfkDA+/C/HjnirE5F1n0JqbEZqqLHVBp5gi9ZgvNWGP/cDdATxBltux8+jKQKRR11CmpuoBoLUOW9bQBbaDjlaRHTO0w0mUBFC/itMHcGUjoKgilkOESFW9nIZWgXEN5Y1eJjqgsYSR3bVOFgjQWkJjgOayFegG3qxExMVCCQhpek+2Pe+IFXqFqQrM7WriDBBMVEELezNH5jxHA2ud0Qe/TJMV6hFo3SL5L4UwzURHw5SVeTV7CM4Wy8RtsFSvWNu5NrDxPQYZZ6m87moxCq3Y77WtJ9Tdm4eULQtc2tdqS70s+i4HocinhaWSx8s0d+Z0fQKgA5hj3raomfDEeNoxsZlgf46FC5cyCbBFDzrSRj3kh4urMxXzm1pAwj4PJgYrWoZJKygDtZXNACYZA+dzL2v8/NcEO9FEEco5qbZ0RgnDmYO3Xzm7zovX6IDB3pCFzC9A5uDtoaec+PjoezhsGZVxl0IKhWE4MEYOuastAAo0h14dkijuYkmOak3kpBfgNFuih3aLfjoPtQJS/amEXIczHfqAlCePXzQ5GOoXuHZG8ZucHl7MhOvAKkhG2bMXgt9dbI2cOJdDwe2HQqIPcfuDJxpJmQZlFkpPlnS/91jkRC/Qo20RhGxVLODhPCI/TkZmXBjux8CqHDUadTP3XTWZ725nk1oQXpRsEPmpTWOp30tO0TqEKEpDSwqUuPuw7U89dPlJ0RgLBLH3IsYB1XIobH2wPkL9nErX9ePQFZ9xcBQfGrxVcQh2V1LfMliI8baEkKrt8f5JsTCGpT6w6+X2Aah9QD4wMkLwsPNkQgp0riV8b0PQmdjfWFby0k5F/Evl+RUM6Q6OQWhN6DYBzZcgdEQ4AxWZaphG79O7geQJ24JlcEj94UMp1EnqJbCmHlU6tNwiRY6UTnjTBG3HoZqx4ZBnOIKUCTpwpZA5Hy4ojXs6AzFA/a/WrTCQ5QAZ26IOkROlEEF63aBBjGDZxO9wt7Wy8qG2d54NWCDyNbpyA5UWhvXXTmaWMwVIpZZKBjFkF7LnsDBqNxJyghxjXFz7nPNm26SiJhOLe/GkjIp/hs8W3Mke1+jlS53QRTItz7KjrMfWOGxPWpCLVnY5rFtQWPEG7HRdBPKY0hJ8pssdiOeRPnuXDP6lS8hKkwS07Ry7yoC8aoJTnj+X/Sqc5OmY6TbXFGc09Amyao4nhS1y1u5mC6CN1uhFaVvEg+BjzcSWZzPaAfHCqdUsESFjXNNvKG9DEzN2Q4H1hsEyWBwpLPXh8/uKtZiJx4o12CFBYudRa4Dit2lgkpLSuZDLdimXOzgCo36I2CJiH032cpSRNE48zxba3i5LXNad/utWJ//axS8RA0e+In/3Q8UffjLKS4Nj/led6gn3b6QL91xw4FNxa6hoDqsfPi5dSXE6c0C1Gj+0B3bpVw4feqtO8cMBUPYgyZHcTlSwu8/iEgMHx+L1+NJFbMd4IVyC5v+juEiCpl476Oml3HH90WHixXyrm5ODKJ8DR+pfbMUwm3cuQed9QsVGG5ZLGIl9A+aHJZktaxyRMTdYTN1DVegiy22CKk5txSRE7y54Bx5/YN169ies5cDcEHGnql9d9fde+GROLV8bA/A7ZR4zGP3YJULETQtCbINI5DKCZFvVKFj//GWR2okCiFxwA2DpskTfkCqRum9GRrBmTot0EJogYnz/s0DCPo7mmZ2UNvPvBfP1axW90sN2bhE8AvkIzCDDAl8fce2FS/hIPRv6e3dJ8pGQXQtyYhkBz/FfdwEyoRqxc8Gcxv2PYw6LE3bT7FRrE44hVoOpmXp4woD3xOSLuXpDs6isGFA3d5Yn4Eh2VYp1XdIqWdv9qFcUKzUy6GIxAb+Li+mALdA235rcqW63n+AqWCxODuGUu9IKRILUEdMG9ylWw0f18LEJnsB7DChPvoKeXN4Q/+0JvQhaaOF/NhkcAxuHMpdYRMCvoyZbnucQYrBwSLVA3sa+x4eSLP3eaft+JHE1M23yQ8UnHRRjjjrYqHCdPkUhbU0T4HW16AyQ7sGVmn7qEyZyP6mojZJUeFuIKFwT3W9GzDtjqI4kLg4toAMuCVy3j1vkLLi8uBQ0koNisMbudEAJIyTufE15r/vKLFvbrn52QSTKo9fWvjhOgLHhvjg+wB5GfBXAPKjOjsvRUed3VOPRm4ZqtJUKq86LTW0moaFg6KGrUQIG2mPvaOutX/KsRyLeIfIULNjNgt9LCIlMHlwBPoza61zF1iCu/mD1cmP4LZ4kezPVLmfjrsm6Y1gZUj2BCZAgduoRHxcqlHtNruv57NQpBIaAjduLIBzu30dqMIcTattKY7ZB4Qpszv6n0OCmim75jGVr6gSBoWo47EqU06JEyKvcbezaC+EmQngo/cbEia/yqUJaxb93aGEB9RVroxsAZ6XoXYdEXRghDXYhfF54BBWguz1KF1SeSToPY9sQF50uWhtXvDAYsWONCphCCamU6LrMyxAsDj0oAU9786zrCQQsIxkC2xb43zgtmHgG4/14kAUp5SqGD67BLDDltK/+u7NUMXxWNFeyH1As5IEnFe5HQrwxhlrLWm5iMkc9dXRLUJlGWFuxDwed6xuHlmdCU2aukybrHCsgigRHV0rx7puaw3tfTZs62esH+yU7Qj97cS9Kks/w8bL4s0JMyW23TNqb+ncoXMq4TbBm5a3sTT4acOlPhLkV0hdsgFWkM6EDBURjmQ5XwtMlvZW7okTE3raE90eqBwFGOjqzXccip0n4wsBOs5Ivtxr8fwZUzJNwIH/VcXqTtRcPRfiflgD6MoaxboB8Y0uoxf7qdBYYBk+FnCweGiF2QuLpaE6yKOQOWyNtXsKOcmD47WPFmKDDstJdLLUiGBE9f4nkl1VhwZL0vmFIcwMOAwsGB5vuiHUf6W95T0zgcg8W2o03JQxH4Ww2JVkA9enNeratQ3uW8bPBBI9PpixJq1/Mz9RoJwItlMf3WtswaakaYGJo6S0ZPHK61gjFKtEQo8X7INo1sj/yG0U2VA//8BPuyPTuzem6k2VbVkVlcGFsBmKQtpJ9UiKnytF6Kwv4HgEhE4wNJgPRU8ZCne2prqhft3z3yQbd6OoADyZNUXTf9Va61wcFWEmNxi9bxIP778XjgEXcwbz9iGKgjDfkC9G5pium+CarOmpbu5neEpzm3CFfBtyQRMohksHo1bsCwHSZvkeTxB2CW1B55yBrav0BHp5wSxYiAQH1NVeJfx4k6KQ6nu/sxzuRyze8KxFKcXOrBz57L6/0BRirWcah7QxV1a9h+9cmL8hFmRcSRQDswvYADOKodBbymnh2z/d3PCzN2rFcxc1uSRidRpHd4oI9hsL3YpWDbJFEgZbIXe1rTgqMHbNNJDaYBQkdV/hHekBGZElwrcGBu7Vi2A3KBxqZNFgT2XEa++lgyQmM2plQioOsbF47+mxt1LsdDKNtkcMr03Rhaxka2siu4SD4hVhcwdLdFPuRRaHqHtb/C5n3ONC9r5V7EE5+gG+Za0zpO260iQErqPq5NyqEbeekwds4X1LE6L/fV10Poer8T+Hr9UyhsBAmAs5THx8dz2J0x2kGlqDO7tsvTf4sMn/7ScFvDiFJ4CZq4tFKdflT7b4w/kJtlxqsNMrJG7byMZ2QisURpNX017WgKz1Syecggdyo683nDmKlfGEBY7sBAjerR0DSN6ETzpQdS3jmkYOuHfewuMS+8Skmcky+QuZErP+AXyF6HSVdzQu0EN7RpLZNjrb1kyJgpOwkjaZqbCesWocS8VEoGQXvhLSYkO4LohI04o76gIcx2x+eShjLy3/H/LPTUnB2GvTl5saXWEyJ83QLRRdaZwf1U1oCiHB9LvI8W11zZ8zAXAHOKYrBvBKwDUOxcvSorsQJsp9FyPU9wwYlfVuo2sxq855eziSovCeNKY5uvCFMzWk02zrhyIlFaXm14nUX3278hWWnoJKwMuMTY5XLGlvr2Ju0CC+ZEz7dBZ12mfNAtFRg+2L5uYMo7x1Irb2DqcQ/zbCh0/h8+dFVmyo4Sk2NmsNj6wXjQoqTRSmxcbFi+7YwkNgNVq5fzkgA6v0NPzsZDM1hcItKa7cyC9LdfuJYx3VyvdIvhEvdsAnQ2Tk7FJzcwQqy8w+A4giu3CREou4SmqojNRmT00qmoT7vxAYwUM8gKeO9divnP+qZl6FHstKZlOMdFlOQRdBIgYmkoCTV4k5iX7CoD5dD3fqQhxpzT9/s3k+7WrL+TPxKyZ5fs2m47bELFGNJci7lAKao3lts5pBCpP11kVCrT3j+OWY8c96R7nsEZoQAZKeigoz5dNxyF4dNKrveZI1VpcyiITr9XrlfibGz0Gtx/jMLp6LJBnrW9jzlzfP44XVZeDaKLfazB0LvTL/G7sYA62vgql4nAFUd0/v5XwUJw5i5/ZIReA06xYMm+ZtSo8/yJXUY5wSCkytCHJ8yGYVVPTB8hOe3WOvAAiDD22AeZtBkGktR87Vy4woo66khcLA0bfkYxm41X/UD5LCsdLJPLK8VJn71VnDIvj6aK2hx/HouiE0OWkc/iu9pbHUeJC0U2G76aCu1VqGenRCzW20/VC7Xeel4xc7uwqdnOGmQrQpoqeL1cqd+KcnN6XVqTnN6fvWj7GhS27uaJufIEN7jc7OfNgqFMKRIxvPoL9+j8DBZtt6Eb+CNEP8Hbcc3YAS9JErNhTzxZEo8nIl+bxIk6guW8fMXIv7AGidajtNdWzlDvqeGv9h+U/FwA08NGCJajM8iTIVoKy1zmqS6vOyRhhvFJZc5IFpd0BIIhiAvIjRnSvO1eju7F4XTTTsHQ/Pw8kvAvbabQFqN4hPidWDhNxlTyW4LyrxC49mzsuLKkxAz0tk4uDC8n6b7IpDdqpeWaZUR9at8sDKExUVqY6SGoVSjV/TgjmbKhFKr9kqrXmNnkrooHf+fFFMAKDSxlYDLL/sC0uUHKbexQFZpM3E/Ez9Yn11gmusiACEVZw40gOjoZrz2BTOQtQSOcbUSMaDoh3q//O9FKoRqEfpWJdXf5wGABcwy4DmqrzhjqsubqSDIhY5AU6OLiQxh1AO7yLpFLhbJz8zZb6FHF0jUrloXo5+aQW+4QFuaqX0qEshzYsYqWKL2nVs8/Hbs+fds3812ZcAgBSh9fOVB7PhMvdPGVDWFrkIjMA365hRyHkI7vjJiFhLBHOLA9gP2n1wJxGpNuTnZo9aRi+Ey2N5WB4xfejTNG827l8/KwON8W+PTDUi4TmxZlqxUVUett4p/po3UY7NU9rDO03SHuYFyyJ9KLDxZpOmjO0Ysdi/giB+PQgMHfKTJcUCGnRNk11Fou9rEeyRjRizi7cznSodVIpem0FJfrpyb6+CgLST8ADxfcm861Vn4Aw5rrI5v2E1XoyE8y4Utf19ynDUWOWo5LwTem+pGwZtJFKW1HQylyPoK+cwL7FZ3Og3qOkU46MPvefUMT7yYJdCxQQWw5HGAUUxK45HnF4+CReXFQ+uDQa8uXt/CLBmbPNHi6P2GtjukPeyFPGeERToplEgVF7qEtqRGvwaxUbGZ21leP6cE0hASzsVZiUmSxJ/9mxebPcE1r2j/rgYCm/pyrKYse6xwAJVSOg9VzT3UfDgjZKsAPMwtgS2BXxQbEvRsFopRDCV+qSjqUKSUt9iIRxR1FudiMIJ9xkKM71YqRpqPADqGbAApVpUyIPnCMQhFZx90MRVmkO3/U9lweehXKnegRfmjlf1zumxg+7z/jiaADI61y3A42I/Hx6+V6L4lPvynmn78JqKPGjOz4cvZG8ChWjcALFA3fXGUQsb3nBzIc07R1IMMvI5/7OcJ48yeOVtAjFSZTLIV820Wt6IpsMu7SafKmo64hMUZKSnBwJZcf8wTeWJgPlNgSCdVa9qmFoHPoLp4Cghotu6kjwNopbZGcIXHwaa09jAAqPp0fUucOA5udEKSIHubxpHLPIcuv3r/HMNEoq3f7kZzhBiRBdMnzCUjwtOIstu1hfWJYRfzKiazbdkDHkqnaWbhtNkS+8dfozb1JsfmBF6TiAghM7F+QLEI+M2FNDFIIOyMRMP+rFQRp0+jbPAWgePUxSRuaR6sjQpuSYSYYTUrkXnBnNiLr9GKBwyfblmChry36cGnaw8BTzZcQ3jS4Wgpu+PHT7pHX/BLSSZYAyBBol7dVVNY4iGFRgtH1nq8vhE7ERJHKkHxSNQCTxIxMMnT0cuRfSrKjIQxJo4wsL4j6wF0/RZmRk8+rhVpC812TAx/Qvp4Tq2I9wk9EntRloVsTzVmliaOiLSUUXI8ISMMT9heStlkmyINfgZSg2vmoVISv0I3UJfo0xzY8q+SnVNGXWUrQlezdXwOPoa9xPTlkdWDoGk1NjMrBknAl3XDwTQn0c+Ds46kgA1MEKm8HhRXGdSK74j5Xn7hysBLSEiJetTlia5il6iodzAekhjWZEoEbS58veVcsPrCTbNyFpkiMNtVBJcamIbq19DCXAdXz7MaXulc4umSgKtsoEpki+nWZErHUok7M5BvPEJnkwW70ruIoTR/nwYUgoRNbTL0su6NM0Fl1iAu6n+kPHYMbBo7RGq2D3Ac3mPxXTCGrjuVyEWVEuilS20laS7CzzzmWQIrYKQDRmZn6DAJBETA9RzdX7YNEIs9QXzTLcweDKhsmxeTRVsIVoNINqyOgumSVVhJMqUrzYBeJ2c9rbdvKqRmk7RVNGjbjZcV1qhejw1E1Q7DGThlaRVjYhIXstacj9zJJzwgYzMiCGkhAjCoAsnbnQTluvXaVQ3GfUggbTdAysSEkai/NAKrWaSvHihXrvnqTmNaATD2CI9eJA1ebHQ8OT75CPb+P/Wj6gFwIWWLiohOHvGHQXCcC0OynbvFtpBbt5HpGA2MKEBDTW254s7cDO0QEJ0x/ZmelWm0cxhjapPf5ko5CSE5kWk5G1CnQ7L5LSnpODIVP+60hioqse09UQ7I7cOFCmiZtUZwO8Vw2OK3loNTQ3S4rkq7th7SZ3N+ZOsqI4eGfVs5aXa9wxKn11SAMHK4lPiDm6aj1tHTfMxj1MjfmKeKHwhiEaDqUIZwRFziWZbkSRc3NMqC1k7c41+HEyjqy35tNV/ZlG0mZt3CJFVm9rVtQrpFiXeZDHBJ6uRYoLF6l2Psx5vR+68cOGIHj/2lI6ef2Al+5Fs5fNNUrEm3i7ZdnSI3Ih9ssICu9aE4oBYVkAVLavlZzdJ9p3cidK2uCloTSUENDRw16lRNthR0qRdSc3N9JuiD24ruXAeddv5aQR51rGtS+mXrLytboba7cEGXa7AqXAuGhYNqu+YsqO0udXx6+9hSyN8oBZ7vbR66l2Wjz9373iG/ikYR0sJhw5APw9TgerD5yq7ePEkg1uUdJV2j6zZtTM7fIE6Lhk7OQUmlQ5Ju3mqh8PECHFu9Ai77nJKbd789yWWJV+q/kdLAKEJ2saJr+4AVwFxthEDuyKeWbq2+Sc0npYLsOnBA0Y+imoiC8cnb9SnhAEudjTNnb3KpaHAuME0gdeckaPCzr1qyRZSUxsvwYvgZoIsSkGLbNCmAh5omJUmMPEUrtHEo1zznzAsw5t1p1IAob3B/USMRZHAMVSaoSvfWgHb5YRMYcsTsrKXK/QeIJZj6SEa5x/8vfnRKo5ms8uimML534e9qPEtStDkR0cG/Qj+lgTB5kbhPS/hoB96o9VxTRv0cKMHgO3bjV1qOUsven1NM4BE9CCLIgkqDly5DqJUTBMigNp/xJ65HeS+5r0JQj41plMEbfoz+kh8mieAsxlILhlMxSMtXA1VSbzA7xr+XLQy25CUJGhSfInlot+y3QBR6ZqOKXb7oMlTxUO73xmp4XH8ZgOsYGwxmJ381AbgfENeKlqA2mXhozgcz7t8bSzRZVndwEGDZBB2nBcYQXC59YxvIMRt9aHrmOq6McFeDDBOGJNnXG/MN1mfDHGJ+2GvfwPrJXwnipetyxKFBjUiKWmUeUPO9Eb4vUpsy74fCHoGa88L62WTrPkkeBg7oyCu3bUeF+dgVzaIsTZs6kOs/JzA/tIeI3Td86jugZ9Rpk9AQrybo2GrzOYB/dgglhc9Aoq7UP4H70qd/42fubAez1TuzTe6pC1PUXGWChDNi5Bg23KWL1N6e2uBYp/bHqjHZScu2gkRPov/2ANFVLd9aGVO9isJnWiSbTjIIrv6GrZhsc/KxqudRFCV1UyygMM1pAOgiArogCVYyeejDDL8+XSw03Gy3goAuhRT6yJ24PiHBhIBqbnIumiVpjZeohQgZiOwoy8V9JBD7rLYcxTnMKQLhtt6OqMGa2rnb2JMtZreuxw9odQW8TjrBBLd2nJhR+w22uMWjTIXPOtkl2DGyrIHrRDGwSt7NjwSev1/mUpU7h0oNHlRG7R/GapM+4Yq3yV1TqP+YrSVwusE1XKv7UtAgv2dLCAPlE6d8h91oE59YtWOBgAQpaJuYMyQ/iW26rxArRkOOWvob6Kbug7qc2XtT6Ym852Luq5pv+3vJCp2AUXTgRCcYPqz8wKhaXzxTgyQtjV4pSjiTcspoBpeZCefFse0DxJySZZNsdgkCIHklDlooSv5CrS80XHKNhd+V+flAL8VVLJ9RRnf6hokZa52DrdmGzZIKM2TOpI8V20q3DyvgjIlm6TMpqo2BkHUiNOO1rSEQs60o1XBNpskAV51Ve75y8HS2Qlis48qK4QtYYWqArdqBV0nPuFSaxbAvs2mKao382w+wt+BAbhccrZWocrCKMGBFZRyoryQ1tjjA1EAVfHtlOkW7bMIKAStUbw0tXI7SEzRQ7UyUD+wH2mftakwusfl/GztC1ZEhmHgpo3wmMcYoeiBQbjfk6BdpGlhfawyBSMUxhgO2Wk6DnGGvGTx57vedijQZnSsoS6FH2ppLoY5zr2hgap7Zw/T63k0TC11z+RFPYmFnJIieHQSMvz1osyRnDsYkNWsbYNCv1jXVXBRfmuumD3kNm55lRYZF82yPvCbZ51PaXbwDuNYi2rS/h8EWOpBgCj0Wmwford9Ni2bevHqVNrScL/XMyUTA/Ku0f+Q0URXHhGHZsh4BPw0gDPcUU51x08DcygEI/OYb32eKgVBYWmhs/9+I5H9MgEj8q/bQh0IX6n80ja8NH9oTlW4/LAGYdRp22JU+NXSGSbpBxONMMiOBOCmjKotftcr6JzWz0pd4/hxP8CxcmlAeO4Yl2kV1FvXQh8DfbDSswLUA0++QUAwnXnYDJEJS0mwRyfP6oALQp7L8go84AqY/lLk3AnK9xAme+97PvzqAYx4uN9tgDSr29StBkHr6YcxNIZLBva38Qzirjd5POuykvJ58ovjWDhyIkjrxgCIa+hmMpDXvT8iYZtu8vfXeexcxQ9x0cXJJJrwWb0x20hfYmUnygtvyTLIWu85y+Hdxl3xn1VkvY+Gxj5om5POZ0i/MW44LGJgepWstbEIXamWXQJYG+/YWbF+ZV56YZrQRI9n6aPn8bSbrerxhTuhCSPwVb82Mxl7E1ib3i9Ng0CYn1MwAlPmL/nZZCvmZJUN9IoQYpkx+SeCJWYgblkayc5043raGZ7RvACa5lM8l+eqvGxSxWncix+rLLQKoEn9IHdwnpcNHcS+uGBpAPHO6GgQWsUMEsYUl/KWRbWQOPevU2PjGDDGJsbwJQ6pk7STYX+NUgQDq3Xv6gBru+2YJpWmogEE7MiGmPVpPNsZwvyDd0Es5TRx3dDrqv9uxTKEpjMIdXicpUekywYCjDEBsNXrk50Dce0NANkNYqAOBV2rF7UM91RbAL9HMPQTs8HIHBng5/GcV/AZUmlC9W6rHaJ6T866l2EiZ4I6mfepi8Ap9s7OZodQUcZ2UNDaEHy2f8UWgb/VU7zQ3NulTRr9rgEhGQ6mTfT7S64wxhvKefmEbWTBDHnHY6+8Wqnyq4kAvVkSIokM23KzSPfxWw+vaOqXfxOlS6iKR3PU1NOpLE0vEZKdQUjNzXWojBXqvRzfG2AcSLMNvLKO2vOmM0+szghHs/oy9CAMk6d1K4S1DW7DTXXyoVo1AoZugkgYd8z95k/M565zNO6iJrgydnKsNSIbhxiH00fHIiOju/h4Iv+ul9sBw5Y5f4o1Ydm+baYSWxOaTRK9RrpLsxRch0bB5j3Zc0WLNaFxcfPvXIN0+NnzKYGFQbamyh11uTLoXwYWIpI1XE0y0GXgleMJjpTsZvbkaGbQA8msPJhzwcfoJsVS+AGmwvcGaQ4HTmXw7fDCvtKMFE86nu/bssmlD/IYVop5R6eXYvT99A5nn2OaqSXF43yRlXDpnrmPpi61m3SooogjirwEZilmvceWbrRA9Jz3CPJVsdz3kvErVm0A+twtzDTlf4fSXALbgm/ZkB5OvPoaaMtQa+wgI+8/BJrFXTvETxiuHEecywryxFUjjT93bOIf5reVLPd/J/ObWF1gieARGBvxknmWV5lTS0Y32JsAT9nMbGkqF+mnH0Bx81XpDZAyMZRsEwMfCOZeyKzAz8A2GHtu17714iS86ymSmJ+vNONaQlOb+23HS4paIER0DzbwMi12HmUhMTajUqY/mr6OQjd/EBBvjbB5+hpVNMQKo8RCKIQWfJ8owr08cm162yOHEDgDNhm2A8LBLrUayCvb78ck0TDwzERx5Mi4yh51YNd0pNFh8Jvd/+sJoaYK+bkq55Wf7A2KTadsTQOcM+bgxrF4gWyzfmkiI++Pq1qXeFsDwOZruY47zlJkjKgoXTH88NFO5nNHYVxO7cvMsoUd2fBdrofV+Xhdvrd9Texg0U/P3xGLqPcTGIdZ/+8RERd1ap6j1C6wyeFmRMywo9+/aPnbnC7/h2/FjHzIKdBwEsPh4tqO7bfNrQ0kmv+jXvp/dd9X7rx+d61LvvhEU8z2zlVnVSxexrIAwiUTmCyRP75yAiy4Uq7QCJksoSC3RVKRvHPCu4AubDsAKL5e6Np382fPYYURPqj2K/+fuGXDDjqrlRUAXHl8Fd79KaUxTE4+V/v0BRC62+BdrWklJ1SmbUO0epMkEt856mOk//EMOjfCp1ayXwbYwdOtnxLvacN/zgKgrlAzHXUmVipiiJkLoMmVX5a7A+0V6InINZFe3deigKFJh++AA8bvrJ0bEc4KOX37sHyBppdx31p+sKrWBuySbvwvlyhM0fWzsH99k8ZIJ/qzwlgRSMddsw710N81XMHDxBHDaUiQEqQy4aHPeUozPw9crCp0gTyFSfxbuYXu/XOlaMMhxs18kH0bDDSTuiM1VFE3YuEC51iIBAa8j9ROIx2b3DpUtYuSqI3/7Wyp1SLVUNRkj+X4o4XIyCN6coibsz0zMDcKzhE3awaO6doxD7YAttLzhGZoKzlp0+JE69ryts13w5bIMW9vtS9u2nvW+9XuAlmXdW9Cud/bNoBL4fdZrKjNFPaCRfc8pP1OF/Dndx1GI16Dwq67JFZMaiZEp9VyP0a+D50mnJ4kXrxSbRjfDkcIU5R4mPnkSDIjD593chXG4pczzyaCqAYdvi2/l3dkzoFOilmAHE5fJ1ut8ON4FVjBnMgZvwuSfLACcFUCpnzfg1tTT1tCKfrR11zh+FwnAV2szg4/anXd2fX3swtCnuiQ0A7yd+X1cXxLpKlZa7fh+/OMd8W3BMC6cd8E/iuTTtjeM36S3te7RPxWSajiZGeqPt8pFi+/JtQxXzJsaR2UJ4rJ8+jQMB4rqEsYdt4jZiGWLr3AT2bL0R9KhK54XnOKMX4sNSRiXasduV8wc6/DfbfhEkFMG91RjBD7P4xU3a6Iiaij4VBnPt7Ban24JlInnS6Fvfg03t3OJBtK5mYxqki0CgEI5laXxYDXEMANLt+mZEQB9dmW95uDFjxzk8psPJ34yZgMKj1zszJ+1s56RtYNHzSsNhYkaJWUrT/Zq20s0QESh2bNe6eOYZnw831waDcStBxham2bwCwdTbk2nKNpgTGSxa25abhENOKtbDc7Pycqzp0ft324ZNqBaOA6eQFsrZRnw7gepWozWzoeFmBnGuTRcb4sDRTuKqvWVx3iIhMm7J2hFlcmseV+iyZwvNDoaA4bMDPwwgWjfosI1TmCrfKhLItL6d+SvnnquKHGCz4XFT+7UZJQX6ADzBquLmdx9VC+IsiccvuSL42tj/lL6XtuAJIhJhN2OT9J50AAq7/6QI+3+cC2bgZu+TbOdfDVOHnQp+5sobErukmthBxcbB3IvGYCDii9/pgG3ETs4pB5RBRPZB0sA/UDcQXZ14ilHYrqNjSNioMdZDTDG11Mv4wQ/zfleoU4BplYSXv4iwtexkKtcoZzfOcXMU8TuuTjgelNaFSDGEU+dWtugsCcpM/3U7QfKW3OuxeqfkkpHChAYHW4I6tftcDXzTHXHW8j22MR2s0UfsiDw5riba6fwmy3MxLqq6v+bo7wIPHCD7Jor/Tu56gVceMkkmGFIEeEfuazINyODPPaoiG8alkQwVVxsbB8vZydMl+s18pIC1xJ2NHdnzagpYXfJvtE4tsp3cyQB8rD2FeVr0ECT21VDdi9jaiYrj+UzktQGd/LM1vTxO8y9493EVWt5cOa2xVdNhiO3mLjuTRuj8GOAyOmfTBR8mOGeHg1oyAvc5wcC2Z8BVu4g5jDxLKh495g/tKzamn+Zh5wdkFX98c8Vx9PMYXc5Z6DUZ5BJH+Rm6bcSaGUYDwQl9cuhM19g3OcmGSqi9awOfYcfZVd3R9GrDbGxNCgHtfFFY7pnO4jwDT3K37zNxlAXB4lmN8lYzZS894UzVqXBZ6zkQcLNEfIQQLqTUafbttduWzCNd0O9FV5PWtEO6VCTUvIDVa1jtoa9/XYturLog7m9/tmEA8To19MBRAHrArUjlcucHH5ZkASw0Zzq7MoOUltOvS4P9W0T3O0bRjU8+Tkl4sDtccJw8jitZkDc23DaYroEcKp2mPlD4y5VcpVcewklv93PPVlZbrZWDMfOX93sqXW+UNuDTc5qXDk7+enBYZBNWwZLy23goVL29Yjdi58ND87Y4CPvg+62DRDlPL3jOXP/OcRlVEN6KuytrjpHogFhYsLBRoCbDmPOuLb1sfmWKiak97ien/b5klB5ZenJiRtsq+oKrmlcywTfVqLuOHQUnlOk4LiYcQIfLp6TwBEEV9x/ETlD/OeKSGwVKNGi2kMH66iusmgwdpwAFbqbKqn+LNNM61jX4h0pB34Tps0NAn10CyU/Cxf+9n/X0TfAG8ogezZJERsrrg93s4hRPXj5vJcepIUFF8dgJNOu9sFz+5RgTDmnLKlxO6LHFQ4v9vq83SqV5SshfirBezccqVoPTEJqK6RS/mdYuNE7j72PbCpKeg54GnLArCdB3d8eOFva2WDBUPwmDAHv+3p48UrbRXZaULMcSDPUz7z9OjsXeyYglAwXXz9H7myN9fTsmnxFWnDdNhG0unaMHkrvuOlE++0DRvjZ2nGINgeYfz6ro0QwgIRWShntGkSduTEF14s3bIKSS8271fLHBWCEZyTGiMS5hN5F8B1P/jTPv7uc9XmHJkS27UaaFrfRKUE7jKaEqfVJoKYyFfq3ypmZQRtf/yTOzIPPDG+q3vEpXih0PIcgEplCURc+/7K5ZCJYp1kxBQK9+ahUedLvXr1hIPHoZ5uqGLRSx/Y2U3jJwZdHx3geCYATFdqzNVZ34JF4GP5TThu+MLpV4Uvucs8mQUBqdnhFuqE0zmATGLGJHhMbVd10velrxwdwyegbMmJMXhRMV+XeWFDW6RoFmBmXf4ShGURcDV/iYouPNftUo4hlKUjm59LBczxYs+82VokOycXbsYcNwWPVirIZWowvXRwoTB+AacKOD4gTrGghwiSwuofkdg3AzPouyxo8isQdeSs72eB0VUTkd9iDVzz4piPW5LDTAzeSMDAVBy2gvGh/BvUc+XmcY3GWJSZJSyW2dKsuQhlbBj7LBQ+qQ+oMU9MxgqTZZSxDYN94WKYq3aOmGD2DnJxUmuJxFhiVTJunTITX2nBX5SZ/ktM+/fjuHKet7mfz0bMxGMTwyJYk0I0v3NQu8zHQzqpB4Nli7lgop9rsvgMvSu8cZIouhi7SBpdqh75INtCenAhjQZM0WVA6XxiXJNRomHzgu4k8X1jO0INtRnislcBrr6dFQiT+0q4BRtgTs9JPAhAorCokmX6zZIkF4q5/g1nr8cjue12JXx5Kb5h6BCLJy3n6IzvCw+yYqFWUiJM3NmSGEtLr76rg59NzJZ+YrIXfPaPHr75hrqrApIxg8HfpVMKSCns5ehieL6n8OjWfjbv7sFxEHAmHC3Iclk32VzuhGoddtP+obywTxkXfWGTYXHVCf6dHnaJK5/1Ke/1sAltx3mwhR+ovFCFemkDwdCgBCD9l0VOvwibvXiZTxiLvm/H1bhO0LFZQegr33VB8dtPMIIS9/ZgeFIa6jaVcVXOpNY+yo8pakhP2ZT2ptnE2UKBaR8zkVygK00T+eSi6RlJ2xYlTPybHY85fQxyBykJXbT4o3qhEW+xKlfkLmobrGYlixnpO+pFA3mDzwBXTL+elqWPMWb4VInuL9izxUPE+IiSdmXx9yVlc/lm9QcsSZ/b++jPvp1pWN/92y8n4PyYFe13Odd5TJzk+N8kN/N/B7/Ywe1ab6/Ntx9R+j83WpPHHMNgwYwweYqu0z+a56NlNykXze54kfC+58F0EkRG4TApF4ZNb9r6hhCd9R9lDvk1avwibe/f4rHLm7n2cUeJuYUq3UlgzK4ewy5wuks/s/jnBe2nrJtprik27ygu1YqL+Gn6TCmMewDhb9mj2OEXymbZk71iV+RK7EMW0HYWdvWAiTrXAuXlV/LzLWB1ue1nWeBwBUo9x83ph+R9qdoujoDdIOVh9th+1u9fAdcjkyr1YsD12LS817GQU2TeHXOdpnYDc/QwQu6ld/GzbtzZQcK5rd8ec32X6XazCkpMBo30f82xlQR+DAaDblwRadrn2z5yiHsOFN01XoOMIVKjF+NmW38oHgUFOau13uUF16ghMDnrNNb2H5rtU0EW5892H7XOtP6AcB42bhcUY5GL7gUF9OKFFfKs/mF9bsu9Sel54QGUXDXo86ap3mPeOKkpLNASVybfgOU/pC6v+e6Vnv7YT8dGhtX6WYWO+wmVd2L2Gk2cxeo0tW8paa0f7ABLg1ObvjMIjJxJ/Nmql2npcdhOGYbg8s6wiuw7ffClNlO7OkyxBZxNMmph+SXVfWLKp3L7/oYIxMXT75aOQ9BhBQOiXf/XbI+FBGNXW/jEuPaRgxUSh+2JGsu3lv9pdV0QcYsIIoH9ClqLi/+KlqNdYKobybACMS9ZKMuWV2bqYMlh81c5uqmAFtzCyeJV7gbwPm+wxc50FnFYJPrRCyqHMjzrIt2xwOQJEkt56kexTcypLCu4uRB1lubLOYmuMvWPOvGOKn4Jooy0IfZLtbLMbC2TsvjawWNIIOxzJXUxrBnUlDgWDan7d9a9FZNNr2Q0tGywBGKWCFpnUdZFeDgpY2hkHzL0ONWBERhxkW7KG43UjwVLILnFZjzHu9ybt5s5ANbgPaqiQYp0WInz5J8EjXVa2jw5k5YBm5u4xz5aw5bKiJYM51frhqaAeiFINJAaQyLKZ0fBkpxZo0ulid4Ir6I/CRWS4a0+OqRtPFW/uhNXrpHTJ+0EfzC/Mr2gPM8MLppHCjDgJXDi3VyY85ssT95jx8PqMT0rxqfXlKvT/QuBrgud4SHb6v/5gWpeghKxJXBnB/5oCmM8OSqJLufJGEtYSu15ctY3Q4iJ9EgqeAQQz2kh1Dp3J1+/r57GGbTy8PyeaoRxtyHfQUDNgNT9KAM4nPq2I7r7mXgVdp9q6iCeLcpnZ7qFjcrkXmY8guZNHi9qyl2fc0yZ+LgdcHhs3oHnTs5z9mh1BDjcUKL44ON8NjQHr74bUuzg1BtubB3givRqASP9z9ibFz0I+AYq6I9lBL0Gff01fgL5FXtF/Lrkqo5zFRgvTEQd/vo7Xje5lDUMJZOUtXaWi2NXgsGPjAFgyknaC44y3CDUu3B0skHVKjYwai8Vac2B1ScfKWYJR3buJcqP9s+h6g2gxDF43orKRPu/2X0j6uz4MZP/G8hBPECGttSdZ0lJBr/z8RFlQgFdKB0CCE6jmuEqCTePzz47YkkmDoT+osRH5G6BUx9Q9zFK5VdViYq31eBkbAstibePXYR6E6fkZDGPLfn4VzhTM+beJ6Wq7kXnQSxG8q4wDNSPQpku7V5SG/mLbQtFCqv/22ud8E/iv5BVyE1YPB+zblF8XURN7CtWfubzKKVFvi8gsB+4BlDK16xytdiWMo/maYMWuNiQeXarnMrRPA/iLTa6vysPgjU+wtpkQu8rbUB+rElvAq9PhF8ko6iRMFgYqFDHTbqp4L2NipI4VT1y5KEpHbH0iTPAbBaU3TuWUzhdRqMKRnwsomMxJF7m3/c/qE5d1O9XqfVcIjw8AFBM3mGOxSItNGNsd4oPyX1UEQSISegSNBPDjIvtF9Q9CRtCfZacnyDEW7ThWg7f0slfBi+rB4y7UEGu9BhJCx101NzxX/l9PHHZTSMmSmYzhe9hRpHPrqkKMc7q+siFnCYxbJu4gVFzFakyQdOQVRRy+/hjA3tawUAoUMjYYEqw8zvtEKsQUsx6el083tJeL0VmtAZBDvvifRa46gbe0kjxLMBihfeZkn4dPT5rT4MSUSyOU8qjoKHMR6WyWcB51o41ZctR0eYVMNv14eqpWa2rBXf+yYDvfgzqyR2JbWSVoT2pjwPDiEfk8SLBmNEaoFVRZiLec8gyCt78aHrep592Yd7ofrwtTcR7VGieTA+O6SpAeJLav3VVaZFeorEGNlSUfR37Y6Vdpzsl90jgALLMKyy9VkFu/rMIEsG8RceC+vhLkiYQDnIUezsT1uPBQ+5uejoizGSNw4CeW/iLiJl1hkaT1G2ONDTis8Lly4MZepwy/PtmMGpiKnOOl9+rs3f99t4slt/hclTed17KEAXjJgd/Jy6JLCRmuytgC/1vC7ihkfM6NXq99v6xEk2ObA7UfBMO/wiKqQvIYtZZTtmDc4sB/4iSLmQ7DyveXNoytn2lSPIrhztV0Lnd4BEQ21H5b2N3iwzlEKMJ0+Np7u8PKefCm/3r0bvoOIDTWTyK+evKtDAMQiEx+GyB3XeWbM5EGVX+3Fmwo8KkWgC/G82TYGBWbI3cnrxIW/RLVRcEtNkg1Q7brGL6nHknT69Pvj7c5F66AlK7wDV0YDap1XGbQllmCvqKi8isgmM/lvrwM2ubSET6Ffa8mCEvnIIjX62Z94umkvlvepEqUNJUKje7U+B/IkyjiUQRj3FR6hmsroUyoFsjz/WeDQw7kwk7UTzarFo8YKTdrJ4oqKCDSTkr2cKhuBgxf90VlHy2CGFpz0/in5ZbGiHR+aeMJtsfiUIRTlRU1z6OvimiJgvQR2PA7UCg6bRhysPwZplfjvK1FfYV6OFFFhUTW8S+Se1Tj/yJLs65KUFfT7g/c1Wp8oCCUvVj5VhRJCNWBSh1U8cUdr3Y/65QFTKVecjKF1QWWVnxPRw+icC0uC8n91KG1chp6QPLq42T7LBtayHjaMcNqo9d9rm1NFVssICPpnb9vQNi8E5dWTdWD+MG4FPoLVX6+b+wXQuTUyZDZudF4Nbx/+5XsBYvrfX3jN7gKiHjcfaf+Clm7TTrrW8QH/4ZLoj4CGd42PXRTuC2ps3H+8Z2D0FlrLCYYMjUfIvb+hpogb6iXLzjwWA3YvAZN97fNvqsKMltwAYejt8IE1AaKnWqh404zp+/v6c8AzdUVxReDr3RN6Jfcw1YHfRLvMXXjAdAlYnHusU0NR/y2SCk44DNSiEbBHdaoK8on8ST39oS/po7mk+AvuEzacj2+z80xn9tFxj9sGgCxDt1r+bIxUtAY9IFJarMgHAE9CNh48RiypyPSwOoqHM07c+ukwKKgUEOYf8XizJZFixGbraAhNWpmBm8A9p70CKgLWbB4m/k//2myWOsaPAMnrz/vndFHRwn05BMAs2dL9GAGOXXt5IKtC9QcC+8k98cE9qWTZlifwZOdwGwpHr8iFzK0jHmUWSMUd2XM4mmKcV2776nxGXA1n2TwF1jljizVOjtToJLWjI6hm/v1M1PTo28hWkQWxGqh8aOBKrFKk8osu6Oe19weT6zDdE4yuGPnQnXN03QmgBhwJKFh3d+9KxoDr2AE+n47kc0sMixnwjqntuntc/4WkDIWSH0w4iDgRhhHQVHHQUOFKAcBXkZNYjZp9cVlCxGKTti10koa7ULvxRwyAvaAoXfEYpyXCbbH2pUDzPG0WUjBcrb8LSrYD2pPkMzDqt7jz5IhtajC6oN+olW6ySHwM3x/h07a175ZinmftH8uYHku4BmvyS7rRs/rkA/dHGlN7GYs4fBt8dghozWX/yXHWuuTo+HoF1VZjzZ6JdIPR7c/y3Ex1fmb5yx0a3gTtOYP7GcXWnAnA96ldVsE45t5MbDgyu01U45s2tR10XnSB5yck/Xvi6xz1DZ86686ifUxtT68lWBGkZh71LrKs6SqvNuixlxB8VA5YXkNFnc9wEHtG/XNJCX99pZC0XXNTZ+M4aKMkEtVkFWeduiAFuFyXvp63B/Z6gfv3nJz3W8DEoHxf3Rt1pHzUwnPm7AoNrpemJePh6Cn3w9dN36xicWfBs65RYC+WckReOu/+eI24FGlKjg62NOVy8uvDVYKtKhnP0JrSSRBLA1fkFl3k46sMT3BYp8ovChV1wzgXf7GaQxTDxgP/0xqgGzHqcvYQn2H47Q7t9DGQHLn0cNAFJozC3lOXxjPN6cH5byvDW7KXPF/hXEHX5TtGzOD0907Cvl3hZGeDMxqW/OfFcOFwzYq97S8MUZec2XpOv4Ky+PtTxLAoK4wPXlEoDC6KVwIAomorKaON0HwaLLKC1id3ifD3rCzNnhypaqBbazVwFAPdRqFzrfABVlGsWJzUhehUkWF2afFJYpH8ogBkxQEUEyLSM5GIdd8otUCktyEGVn89Xd2eEKp2aa1nKanx7yo/mIVD7NkVUCpg6scew9WkSPdMAabnuwQ8yOMJ7HiyMTxEzj9TWIwpEALDpm09Iq2GaybbBd+v/oFBwtziIcd0FaKzM09abrc86dJyto8GRyQdeSk+c01UsGwHD0lhN03kt4YowGS6CpdkzuBYMUPATMImkDyi0n/YMGR04i1m7JqawIkRwM4Cq6ik0j0AW8EByR8qVTLDC0DosQU/guRAiCKi6PDssJYqxO462zjiJHguEODV4sEhYhuauF5MlpDHGMzChz68SdujnEmbc0cwZDAxoEUgVNKdZWaCxFm6rcNCUaIPeQmnPSbrFBsAAM+O8WNChE55QZOQBTkGLlcoADkESFJWFwGIx2IZXuQ3KA0362OPYPHEPjLDCA347BaFNCEE4BgEcRSEAE1GGRsTQjAyymIgokTw6CRue1XXsb1zD0jMnPXbwlJ4TksGIM6AMsslNW0D+L9XLIpRTzWrCxHjVecm8MOcmzui25vGJZOJrAa46k5u/R0rNMQqP85EAb9Uu0rEiD0HTcENniNuRyRpx6moEvi7TN/hMtE6teaArWuVyxmDqaKW8apcG1WLlhnhy7yFuO1GQ/oGXDqhN2DZcWaGf+FS3vmaljZ/whyJ36P2i5p47CbspEg8zwhs6OrfpLdPbSqtuisz+t+gM661v1z+jstVX/hM7eWuWb09ORcup4Ox6h7PZ3gQuC278FbHX2t1XfobOxVf+Izr5alS9Oly3VILzdtNRT4V2OVL3wXh6pJ8L77IjvPe/LIwWO982RfOp43x3JJ473hyN1Ibw/Hamz8H48Uo/C++sR6t3zW0Bpr4KKoOPz0da/+A9PdfHFV3aj1i1fnfuhWDAO7lsXkbFzJ1uUjOoy+Q2f5j7y/JVL5LtJcmZzYYDPjfPicpid5zVoeR6fIqEaX7iBpcUykoxF65zDR+IFpsbNnGdDJA3EbNzMOd86HH5OTJE0EPUC04W7Gpbo07mRiDRLHPjBWABs25+iNhEcw72bgIV02y9ReYlSsxqQanwLCkeS0PWpQYcgqB0K4zKPuFIu4BmFiUwtOkBRnqPA4cr8P3hGmRLDUcoJUqZmEJZQVbeIon4/JlItAvsIO+xOpTvCitqhaST1bJzP3xHoZzoyh8K2c8f159LGCAH1SmAWPxoTGZDAHuDewGdHdXGGc0xQVEHdnqfEcHJgOllVv1+YiSE391DymEY2SoZZLcuzidn3RQZFQ5w7R+QvogQlAjNFkAoZHBZbgR1Jko6eaAmFulVgkJZ0jiKOaEVIv81QCR6J0BhgcQ79CyyDoraoLqkRVs0C+/C/7JwLW4H0bAaikG9wKCSg7q4HpDzU0E6HEdrf49GANWWTipZq2XNsQCj7y4kGukFie0Re2HhQksu4nnZQiGPaMTM4noxe48yA3XbyWkeLMJAGUpREgL+hRK3HNJRD6TOskx0icgYsdaV41y06Q9BrRLjH3iSE1mcqbNk7IGw0wAc0AVXw1hYJl9yGTtpC73J0P3yioPL0qB/gpFs1UrvtDtEKGDh6smL141mo+3WyjF33kaFFVuKCEGpFivyyBdtasKc/pNXWdlgpInwAdy+nArk0FI3z+6/I3fcCKc4PW+DoETBBkTLiUdWIODmjh+Bq5/uye23tO8I56s/y1k6WKg8cG2xb3I1Y5s4PIc2m29KzDn1gIszcqcC5MftIDO/DgJgxoXDMddnjsLAzyBwh22Swkn0FvzvjxCDupWI5tYhAjY2KQX/2tbHOyUK5OpFlhZm2JUgtSNT9N8kTmlID7GHDLSrCpaPnas7WE0f2yOGoRxrTLyp/B6Y13gmUj4dxhFU+0qUlUWyQW2zAPkkeprWWUgOaKR/eJ+4kIWVipMjZF5bCBN4XLIO5529nnGUWMjBVOUdA4hmSYQf3Ylh/NROCs+TwriifsgJM46mFFXBsEDwtgUG2wrR4iI7w6h3NK8+NR8DlG9fotKUD7cXnKjjXvBWMOYgKjsBrFjUlpDsP+g6PBQasHDrSXSq/81xE46MIanPIAhREJm2OpNSATkwngB1uZuCzr43imEAcKcc/n7NPa+jBtF+i5kn0qCgFNhzxklezFinv5uBZW5eYLu6W269RmWYXH8m9Wtp/tl/PP4+K3Y+M0sTNvcdHjMlRlPbauqPnlyjMihKYSL/enI7zeOGE701GIRiDmmWI/SkngsiDoCTcv18ilJQGu91PERbIjCJDCijkJGyFmJdKazM3jbZNb5GqxkEIRkU+0r2ntlJkajSd5AaP871qS2MwcIYS7iknE7iuPmIa2cJ8xiloMRM69Vr3PL170RTuyMwj6HPaNUgsj5QsI5JJXNWxxVoQZ3m/rL+IpMKo+ZCBIooouQWbQYCaJNbAYW+aUNPYzuMm4WCman+vK6BSr3i4NrCSLlFjAYGxLhsIGVYHZEbKMGzj4C9N9XaSH4qiJM5dAXwc6qjDQpyOQPNKgfSlMuCrRhvlncq2r+RawsFStSV+j+m1clMM+VomHKnY3bNvF39N41sEvBtxZUdpC3dEwKBz71RaI6QnFUFsK85Faa/LzoHDi8hC1EcA7oJFt048RIGuCH6YNC6TE6P5wlIckBV33D8i9aE1yg4pgYmEE7D6NHBcLlfVph2Qah/elcCQsdvd7rSkm5uHRdt3MimfMGAYQUH5sJJeXohGwV5yX78fE5jGNAT5jcr2fXOEhRgYufXUjYAiPuxl24je0vMdKVum4rtiT7aO/5Q9HtT2Ck/y6nQniKRbikVk1PaEK1nkIyL4pcA9GKEdor+V3nGdoV2J4SIinxNWXUaqSAsytJoYw4deZy8+Es84no/RuLD6aAQPJk34kpATDNcqdEqLQbEpOGGtp9oEFsSpdtGZtC+2Xpyi4n90vT+qbPV4HBOqvpLfiIpWjCgmzz7Eci4RBnb/kXF/8e8PIci4WtopD/sLROhgRgYWD/7L+rYzatYIBLATVrRSDD9uZOLxbRXjwoVzkdkxyWHE/hx1dqSs1U3aiw17DSnsg2vHxOVDGCTKXc+brKRiOJHh7VKRJYqsHsn49vmbGXkDqLdycxDCzWRLwO/UNqFVhTgPYPyFh6sGAdHv/U0dKWGxJ/B0sbzWMhzyxgLQJWUSUR6Ud9jf2f4k4ahN6GyL2Qyk6spn5EdAQWQfpzftqLI/ageGCaRUsxt4GnHmxJiVxyLccmrjvfLtfhkQVcppP9CgA+B1ln17hHMSH23N7SSDbbORW15QrxyNK8EsXqr5+OPEY4FAZdGwXUW2LeTL8kLfnkrC/KAAa+AJoNCZbL30NAJ1JHncC2ZO7t5tI8B5nBnBXTnjpmawh2I6+7diwWNGahCdTTgR+BcEfKduklSMDDMjoI8YM9rRx0Scq3HE4K5iEmgnSSYVrq4X7slRXspZKPF6HSvE8QIstUcTt8iA9FyFq+sj3umKsNAWKhOdDn7Z7szspKaSx8MYJ2guXChOdsCdB5IVVsfE6glRztAe+uQaiw+ZMYwNtw+Yau1EE0COeiFl4k8bTEMg8xXxohrZeuLbzTX5Kfiu3lHahEdHcebVH5jDdj6WBPJSUpxPmcVAVWkl4g9ho+wjevQIAUvd+HKXs+K3kgcO/cOeaTlQsBcDB863wS9dgtjo0rykEGgPrDUHCm1U/qGYpnhYYx0M7PcF9+bfJ58tZ4U/KV7ts8OcCB5BBswEEUK8vK3pZvvx63Z/Gu1q+FqSD9MBcSx4T3nJcf1l5DK5DAqK8hL1Z3r7sc1aM5Tje1IQAPLoh38GoifdT5oeXSRrzYS1oFlFOtZ62B4QA0BEBktyTCB117/qHKoMZJhpXTe4jdRmqxwdX/nMV8/XtFpVYS+VCLRYRHBji40fsjRghTXVPYtF0Re1lB4/OIKeajQrQb8ZuCvr4Sv982HlnoIcea5C+ICiN307kVh5vcHBS0t+dh7xTzzA2NBpPtKExgLcrr7Q7LcpbT216kFsH152FRmQGCpMONga0pxVVyI6ZG0ByRvntCtCFA+XfcBivPDXtwmapITRqhc53POQdZqienBh7Mmo3O31nKfZ5qVbkI4O8szLZk5YgLUjz8lfuKCSHGG9t4VfOKtCxp+0Amk5+OJS3s0+12WDuUUH5hCMJMHLIm8HIibjnwWOs9JmIoBjN47SE7TqT08a0ASlO6Y8CO6xekw8jovxPWGu5X9VeOv3pV+yPU9KJs5dYghuDNwaC5Kqt5fGpZFxeby0TyLpqsHShOd4+9op0dhvwl1MNLPivfh4ALk87UPlqduQP1K+JStZFjjXAA0A1LcpTZVEKI8SwSRc3X8ONAeKIhY/SGsclNxWppPRPtaxu5Iecyr3vv3JdL8Ut0jt8AFyF4IyF+S+rOEPnRO7E/OUuKgptI4rqsENtBLgDfBJTrmRaLUtIv0jQVWioMWmJZiIUH4upBHtxQ5xAstXKNp23XWkcfQ67NwkinNR0Yy9v5MO0ac0+Fh0fjTbfrsr5TYlOiq5DabIDXdU4as82WKxvDX/SHiaMko5fU+a29o0/wV4pvOhn67EvKioLUBg0aN5ya4gxVSDXlK2gKg7zhqUpcXa1a2wYQQA7FF9BoO5MmPyoJLb60PFHUj5J90eq5gzEHVRnD/0DqHRV5TtIM2ZYb+brFzmbdymER9lCA0gmB5a8VT/rbrJXy9o+gZo9X20ipK2AZZ8eUXotZp6qqACqy489h1WpsOxEAUZDe/ZQK6Wg2kAs/NUhE23FlIoqNCcWiyrVoUVHzBDV4wyTKUIz26bLRpTz+NAmEUBwUEvGyJEhkFyYUz5w1Fk5LzfiSI7gigK+SNry9dR86ATyiLC7EUa7mHsxX4bX3WEe9ZnC6YCLpG9ZgWQP3RFpkIWaenKmbeiDWZDx+dCObNmh7Eq33+vR/ZxbGTA9AJTYSYU7lCeFCedzmfdYFHXJKenFQNMvadVVZWvBBM0RVTS1osyCcYmCARpyRqBBOaUbuC3nyI8CkInwiB1TYnt0gryKkMg/Pfo2nJ9udEO0WKngygjEV1XYsTLVsixamGFX4HQdOuKoIQ6uUflo0y0U/y9N2VbP7Tth0dLvmgPp5cIDduPu/w9sWWszhFBDHPXthlHir41wQQA7Kvr0OUGiWfUWSMhxH9Enz5c30z+cEaXXqqprFLFJSUKQ6ICpAzNFNxEj4NFjh71LUwL7cTggV5XHbZELeuGLbe2dqpXs6vwnOf/lbkixkIq8QmVXEeSQfeBrQTt1EtZpQgh/mecMYqsC7h84vYTRPRErKLQ8gvBaLitIAdNQJIEum8aSJAkoCHcpMwXvMcs0snATaw2fCxJtLKlgg3OB0ekWA2m2CtMt3h+Pqw5UBphUqQF4tgBikOKSCVOchL2FcGV54pgrV/u8UhVbrWNOTSsYZYI7n51zZd7jDJD4ZpTMDsdrEW5SOOZ+TRADSCgMEBV4D4AaO5dIrcblQmwPhVQycDWtbQ4HCplLbJ2y3eiFRSs2v8ofwizXyzzf0Z+iLQ+uHSkjwkMx2QkCSiIXv10Wu77/JtgvJIXIi/8bdOUKFn/TR/2A8DKRZE8Wg+CDTxch9eK4mpa89IXUC3e3/2KQJtrRbmBgJi6ERFW1QUIht2yjwwQfBgvSPcocPEx2glEFH4XSemkPiiDwuDIfH1aoVaTxYuK+D0U5CtqxJq0AdVAgiBRU0dtWLEWwoDU3BMEtRDKjyD5Pbo+RgikFGdbioLMBsXGqLFsRwUqiQZ23aAaHDJzMqXQjzcesNrXYLW+4GlPRXOp5/D9DnJ9V9YlVPn75ZdQm1iUOHLbbwYf/0/DAe+BIOFwBWkDuTNoSiK+DVPeJsCtmULEbm6U2uk/02IZNI+zRbGCeYuVG1x2C101sewvgLwBcA25Vrstl02z2sBvfPZsXKn1VI1/drg8PGy9WAfoNIBCnRJx9BQqn4EMDpNICgJbFAkW6adciK59EXUDiZftRtN3kJbOuBOmivwv1aq1RVWxye/stm/F2kYkTcbIpF/TxU6TW4nVZ3Ws6B8gRoRCchqWKLlRyREtN2eIJx120WTtijb57nOUEcOZ0pi6bT7AsgMGDSQS/JetFLx2UC34e+UvrLD4hJlAsnn7ExElubW9sNyEKWEt1XHgWuKGIs9BL/mji0SahsSxStg/J1SPxoT78BdYrB0iZtj6ZGBgZFhDU5KjHjClVQQTi5GKpvDm5LXQGxBV2ANZQNX+ZRay0foBK/vpbtnG7NC1xrmb4x00VgrE1ZVijoxR1pC2qjH6zrUqGYhEZjm2HlCw4a5CyCNRyBMncjfOcw2DAF/MiZ20yE2KTrBiYIEV3GOE2Oy9kS600BWDRTCVobHwo1QLicufEXLb1kiBeLq4nEalYg07nFmUWinsKlMArk4MZ0hidynRhf56MCMFYlNjhFOgeOma3pxy2cwPsoj3metJGAoMLlTFD9h8/6l5pVKg/Z/aJyCSScvzZtEtT8CV1+0iKlLrzYZZtaq5secbVdpdgUzsWWquXM9JmqufzJ4Zgq2WEoSBWvsh7IJgAcXGsFYzgcbXAT+sluiSa6YT+spIOrImQ8QFZmMw7BhMukhOennltVk7AAT1fZ6FBu0en86YANxTW/cZ2Mdkb9T7GhaqTbjPdFqYVYRwZHRgsIdRSQdBI6nAEjXX7C/Qh+ooy6+1ciA6SslXZ/tfE3AC3bGjJG2egdpgskEY1fIRCu3KV4+U+erwFNkvES4T6JRe4dOLPKj0yZEPmJkhOFYSmCNvP4dpqcTX946lboueTGFxBbH/q9/4CvyV7GMfEWtwXD+XpkewE8JLWbH1XhEL0fjGb1EfZAAVrXipocSlkkkFWNkQayLFFVavG/dbBkHM2VCiV9CReAvIRtOnIlJ0APMxa1jEZLcooVte35QEwh4VWf1WUeKMuHURqqvdUnx2ay6Nb87h9tDOTsMwuL6GVrGHI2HgHpwl9ZekDqRbEee6xRxDLdLeFDTCBFNpQbhFYvHpMzW1us5HdnKizGs7WDPxWcneedEgdMGErcorlt15nyFwfMqJdyjEP5bmeM2CPBZn7Y4g4Hlk3Pt7Vs3wavQA6PXmc6QmHr3OF4s9tAFEhl2lHWPFBhYzCRkWXRU0ebjSlmPFeHt0B5AeVtJtyxhzhBYB9FBMx5FxtHICirLJQg1oiZnzSvXp9+T5jl2EDhqwjHFmbLFGfJl7yJIdP4XKZl4f7gIPwGsrUa8/CwEOo13Mq27De/akJzdWvAi2F8KyxSUPbyopC/loKqXEtFMygtD6x6MO7HVPlARFmtsVy8wG5ZoQQT4jk5z+lQ3kv8sAZWOIm/+ZjpoarlDSxX4cbygv//O4nTyfFHbNX2U8+sS3ArNv7B6YaqK3/v2XNXaMJOhsh4XjjOIZo+FLrUO3g3hjoS3iBSAdyq1MoN6eJz6ftW1q4rqDbXTVZj7wrVZQ9O1uCoLQ+ukX09PJ+pKhKFjziA+5p/n+IK4yB8aCgxcPT7xVTlVCLEmJ5BjEjgYQ6qBOaiyZj/aawKBVhAex4A50MnOJWmueaDuxDFUuR6X11A63HiYVUWRruMie/NswbIO1zRCFTiwEr2tSlUS78YE3v5TvrAsnM8p3W5QRYb0tp81STOuCqh+Q+8Ts2p5H1DZV1aQhCjvSNuQawbmQgouUhRyD7yL6uBWazLwPPIVI8630mCPNH1xhDDhCGSGIQqkbC3bnU/1YQ+abnH8+XfkVEgKfnvmd6lkSX3Y9tXH9VGsmUFg6FELO8yLcljZGUMC1n6X/QTMysS0KNcooYfVXknrW9x7bK6QLA9Dco71hGp07E5gP69gGag3nRWmsphwty3Ds6yNGVuMTey/jCABfpP1tNB5glQ0zHTK4KedroqVLWhClve466pLGSO+eYzL9t+vtJEFADU1XnWVXqmL3T7oIBYaZQAWpu0JTW07n8iNmh19KK7jR3E/FjGVgnuryQa/xrHT1tIK+bhMVAm3hvMbBPV4q8m3ST5Nqgj3th3E8eNns7WR23dCejXPBDw7qEkLX1jzkteNV7kNHxRe/4kveFIfRWkKwI7CPI5N+0UOlbF6qb4D/iHtWlJOaaFYgyPmamrKYG66y6BNtqTVnQxfY1H8Liyd8nl4pbjeYRZ5KxGZSp0z9uaZHNw9xp8OOXiR2xXJ9LhKCh7rHejhrAuhgBRcaaN20z/Y6VCrOGuQImup+Q3hEYRZyKxFloYcXAksxdi34OeTNtXPUvMKYRRGRiag4lJMR8qPuKJOVg3Y3eD3cLM4en06HvoHvcv41scZbNU5DWEUMntQjmIbukBEVhNGiGYYHEKHXpYs82J2wR4bGbfgGmHTVYGAp7it720E5Da1XtmIuMQtnnKkEEJKpll+9+l9axJIwaW5pqDIVozEq/iL9XYn9m9AprtfzAWQjo0y8My8AfWjS/wGI2jH2MxzyEFDwcj8meI2vCqklFXONdP+nPAkeK9ZJsU4sZ5HcumM1TwtzGJebv1J234m+bzrh3ZKZADtO0i5szOHvIeRRESosxRSZ3r0+4WuQyV80mKCMUnI3G7XshLnh4QY9r4iFzG3l8oFa8a+Yi+rjvjmnl5mSkDdNdSamnO5ww/FVmBsWmk3X2x+Di1GilHO9UWSoGOlhXt0J9VeIsXcfyNveK/T8FpyZsskpkdBD2Ln3Bl8j1E2Mo/W/Q9CBWPs26lXD2WUwYvK0oA3HCqEYO3ix8Fw9PcDnFdMn+upJwEb1lfPG3OHQ+c6YwdZOXB5SxGpRzXTL9r9D0MCuAvybeHUl3Ic8jGqZmlFbN+uWuj7O93RG0ElqLTTDFSc7u+BxN3q+lbX2T3Ee5PIQfgJceLha7+ODJ/xOlUL+9J0P7wkwj+vqROyecJSAhC4uK7wGTxqupNcyfW9NqzNsd6lLeCGg+QEDTXKiTApCteeh/pCnaQta9/DcMtoDnzBqtG3fUmCWhBE27o0ERf4WxstA+DIlKZB+FlJTR3NxrYoNe9bHAo10bkSOio45KEJaa+lwJ/gGcqfSSXJLJ7nmbyEzLl9IZYzrWSdIde9W5FU7DL8KXxRMX0gX0+IWw9YIirIY0+4tc+JPDCgKWr/yUEqS0CA1IUBaNvXkOdl3FOGiSB/js3kgsaWK6hv8AkOTBLYwWiLFKAJVUD/FEUc2VrVzb4ikn1/erOmvUXM70hBBvzf+bH3UY3CCA2eMUQh0omyK9chw5dJpFwXVk8XTRYUhhFxY/JbXLqXBfP008SIxUd5jJbdEA8uEr4N9Ir5yfRnlHU8qviZ89DKSpbwKqp2q6PtB0Ah00j14NWMo3bwM+00uLTGePwTs9qS0zIbJXBHklNl86QYGj3Cogr7yv0PD/c01P4B7EE3ifjtOCY4h+xMR/8Xq+Ab2SkHD9jUQxXBrpXfoH4N4hrAphsRz/Dg5biXccbBRkVNSmkb79myReqT3ZrJ1q2q52BzhIt24LrQnlVgbFpx4o2gv+xzL1sV9wHjmnZLbpguCKkSeP2IkPHU9FLRqv53nGAotJzptadw5ke5512nDoOjQ+gP21ixHAyeRlMtCAjYXQtqSMX1lwWpavU8vH4peQJXgRPP9FgXL5zowobK2WJqTmM9fdes/HsAECNdw52FE4IdsSlUJ9KjpS543Ys6odA+R8EWIq9SkhBFITWZCEmlXYsFF9in/pujGNFeZIqQV3dqYklawWC4Jc16fqFvj/ouVzgY68LdoTIwSPPxyUZwwC/sZZ6wgoCopEB08yS/SWgmYiGi/B4MGmHT34pVXvvNZqWiW9OhC9bGnbQyVIP9hJu4CILIIEpSr4mpU94Wa8BT+zT7VCpieCqOth8pSdlfoKm66cokh5t2b7WIjVdUHCTvw9TCsfHkU5/Cu8hD8xWQiJb1KWGqDQMAWL2Oc/YSUL2MGLEQoY/cIDULBOCUP2Z1uIznRk72lGi8hDTXgtG3PEiP2ss6tHIZQk6atUopkqc+pktcl4+dq0aXGoFY2b1bQo5gOXHmOapFG2jckusRArdqBxqmUcvxYHIMiPEkbg5MaijndNw/yMAmr63kilm/e0HiZOS9SbdXUJzhnbjW1/GR5HbLIObwiPjiyVG79xXdS7ZLiIZmQ5rcPUdtIQpshxD56XgNpcUTPb6V7OSbz3+A8IKT4ykpv/7XgrE58hkL+AYvt9aZiQExlHClX2rpF6CrEcqPYm+PM/Lnz0G/v2I6zaT6xG+hzittm2Z/X6gueLTscyYeoZE1SLJISpCgK62RHyMykJDNbWjLA1z1ZQrl6QCZLlogd9N+HHsmUfvJby5tpGewz+wQCOCVKIQKxwMJM1Am+qoWwvd1E2X42VuQik8v7RshE+PKcjy9pS1nLrQsTvIgTpzX7WicMKX2OEwtSSkjo54iEiEaftUtnlcq1MjgzKaTzMiTpp4MhWmjoO0UvQHsrZ3Yr5AVyyQLRSUEYtCOIjSPvKvMxUUQjkjYeIac3cUFbge74L/UjCgkYcJSob5MA1W82TaI1vuyYWmpiV7IKGVlYS3YMYaFmWT1odujNT9hBJJg8rTbBckwuGdGrDEtUmWVX8hW0K5KmskLCzac9mfsqVfN/2rYERZb/pBd6JEjUEDCsTTgxIl79aSbA7AmdP7P5/8/NRxbWw68JYMB+b2YgCNT42fQwghgOL5a4eT83bCBTSTGLkxk/U3SzC2OXT/MerJT5VO2NtHIy7Mb3kerlHEr1ts5uAic2uZvOsjQGG2sddi7/S7KuLH9cTNSe8FUaOFzxNWgh7cAG0rzZf97+gTs30z5GRwDanFa/tJDMxSVu8UQJY5Gu0coGMHlDtjnliE6SwO5VOKBznKFS5WXcx95XZbodS+BPYYNfIYHNntD1Uue457SwuS8pPGqlsqI9SUU7P7dRg7j3rnsH08ASSrVIMWC2sF+xPV/ORQPCcRxT1RWRGHCb+KGDPfJDadJejq1CzAzo3sg9lJEPNSZeGJEOQxGrlZvTUxJWZ6l3sO3Cgm1KzJY6QDwE6pgsCdoXCD8K68H73ySSY/zIfUjUMLmmDgI4ZWNlIK3PUKi5UAOg4e2QM5CSQbO6MFnimlGCXBABrKRHWGafGhm+mbl5TNEzLpDoJcDzDE2fv1rE9M6FLEf9LEU8v1ZhVj7KkDJNc3l2/xf+I8cxR1VUqvFNJkKztk7gVi+g3lfmyTsFkUKNfUJpzexT2AALsEMf1zlQu3WpyO8PogK0UePbnjStJ+uV/XVEsKCpqHoFVUmZgpWb1b/THYWmD29j0ZwMN2ClrwXHC0YdzsIlQB09R4GSBeiEQAGR7voQw31EYzhYSG7Mh0Dwu1d/MG5uqBUlYfA8aY5g+pJpPcM3FWKRDXKMqYpOSorCPToEruRbsXnKOAsP0CGdJwVAmBVH5jxKNG2TpBLcuUiJh982uNwFlCDmLvnIuryH6+MUnRbmgxtxp9qWVXkhzHxw+W5mDoIVHRNToqLCHG30d9FYIigAEUGo0AXhWlZq2AEjKgq4WJu8oSN81bLiIxCSmxMwZrHhDbFEQ7paj6Cy6SMdFzOGzA0qsXn4SMZGI0lVlaP982hYi9Qkbk0Id7JQHD2hNbY3voQfiyPK/VvClf6M0NDHxPoJdHS9MUtuOI57DPOq/tmRj/mazmUbkISGZ09ly74Zc1F3ZeoAb7gUAsKDOB5xWkJyxgRoc72XXYsmFWv+9SiN9Nx0ka2KTpulqdFaDS41ixxfc0y6715Vc+Ll5CfdqcREBttY/bBBjvVE/jYKwfbJNLJVX3HSCpCpzUdXbt0gkFmca2O/B7Pq08IJ1tZiG8V5Az47yQhPLVJYuavxEmaaNgiEqUssZ8rHYrcbk4vkMV3ZNAE/G66US0CG2KlSvCnMjZDySwVYKoEHxeVJOSgQVUvwKN2pb539snqQqLJHWVEzoSEelP3Ip/MYJNk2Uh/XfzqdXYLiWJOtyvnY4Tmi+efxck9cdedPtHggLqJPOqppYHPnuenBmi5Vf90llseiuufAEB+ty1Dw30eoiiRb9MsS0ErJApnTyp2mx1MQuWz5H122dvJgEj59s+rxoZFuYTQh/ZaYL0/uqZRi110KkS0c3S4ImXzOHP2fey2wX4z2K+aCGkjl9aBKSynnwirXA7lRNFVDwQBv38AeUQ1P1dF16HpS0NbP/kDbFIU8AXUb/z7y/pigBb065az2LJElHZE9L4dKX8DPBmjsebdg7YuweZb4KrF0RoCwZAx0npWqSeW4XHqjWZ9GyFDRy5wuchUEnNnM0qI1hcBRv3EoMrHoLI4GYBp8ZbdedTbKFcME8JhUJcqx1KAuRp8bus40yntgb8UtO9KCyhBs5BXlCzuSqRTpoMMy83LClIiV6JGRxn5HxJCRvQRYMQslDqH5zwVvAJyEQSsF1J8dcY4ZknJkZIvSeOwV80hWTuf53jztCPY6E+2gXCAbNZYTsXXMKA9IKV1Tn5UsuuYvCTJYUz8mR44cThVYpjrjJ31D8dFxLYGq+G8dpBwpfCz3gmMc4W9Y6YzMqNfgkISr5zyQ01gKD+n44ED/6Y3Yj9vw+L6TPmSjltLO6EkR84rjMFypb3Bl9iQSo+IFC+OVP6te6bUcovoNoa67stITS36EHEg4UQCWsy1iBJr05xzRy0LGYDDNLh2JR04sWmLh9oYtmU7+eDlmCbDb6DtTC/O0RZzq4cSdkOwLJ660NFfXOoSsKoQ8YMS2Z9t3ovzUXCMrK7ZjnNDp6A7TcNFCd2tuOAra/OSvi2aBYpzo/SdSA5Jgyr5vGuG10JrSecI5K/vi+hBbNSye+iQa4Jf2PHr1sS8rPYwGkUJLwbuSux9TpZGOUk91HaObXVO/ve4eKFZua+0q13Pbd9cXLx6CoDTKQ1d5x2TjrAI6PbEMQKf5fiqdNu3+7h8+siKfdYBk8xX34D+Y3/a5L+o3HqO8Xd8F9dvIdipmEW7o4mJXGlv5BgDHLau0AnK3wPFKt9OrtPw7e7qpQgPc/ShA2bWsyXwnw8LtYboAAPdC/fZmX1Y3ZG9Kw3G9LDv0TPviDKtopBd+/2Dvz4IwcqAy14uhMqXROZC+Yrkhq64ZqmRNJOVTdZyNNHOVZPruCC8/EdmqhY2nv6i9XJsE01Hfr30MQqN7plQLOFDqLHF5BPDH1pvnPOn6qi7JOV/hpm6Fqts+2ulsivO6Tr9IG2KNcDa3Gcl6NEbueH1OTlRvEgn52JxlyqS8VSPhycaSjZNt6XSxDoxeXVr33PAHcShnBqPcn7HdfmimFWR2Aah9MnOzTPg7NNpjIImu6yUJCZIUa1/TLpbXYkoKQ1cptZnTolK6qGEIL/YUwNZasyKNo3JU1nMyQ0TW0oSySE0aNRiHSGPOc5YURaUqjU53pmTmAP8LEs2iy/gwrdvEz9rhPhfZ1GEQ3HmW46xLZvXnwNCpna/ay9Q1XXZV3t0d40i2nk2c7PHafthsoMNYSQNe/o7P8wExBMEvpnzAOozQP/ii4C+aNIR28TkinAkMd/pW+8Q2LH4t8qHhoG+0/MPgAS1a1AsGu4lOZlDt3+KfwOfZ67E5J1Ca4rwmx8lL58WpHQK3pr4y8zXmR4tDR56N6kMAIu3VxSVrkrKkTA2NG4tz+6RVolaus0Ka0qEUx6NGc5iq49F6suJU8Bg4/s2d4sbxTnU+IRANwoFl08NhDQ5qKPSbKvDeKQAUjYQ8CFCSEJeFdSrIkU6W44/e0AIfxdsU8uZP9JQ9u4jLWS1lIcULzAK0uEeJ0iC0ja1yl4G4dBeUyPWMn12Nj3ViGTXLKMdjwtFYaqzcEv45our13377tbmLn4dwd+yTvgEjqFS/v9EABFrqNI2aN4zjiWd2PgZa85p9HyPhGB08PvvO0fqkRe5BxourOgtEQCfqqoiUSbyyCosUEli6AtPDrGC48/EWWY3bRCYLJyuW/o6FVNM0j8drStksuMmhG0GONKP6cYKJ9xaety1BAIQa5DBNRfpG2f1MgoYyMMx/cEr6MYNiZvvXS8iCbZoSPXhGHi8BU42y6ZtUo+CIhkiXFl6nPe+6iB0BOJ9AjNMaTQd5QczpOIm/aJ6LZlU90XgGBcmgP9GlJdJMon78UxmVjI7bnhGcF2TEZZU8yn+0mRLJHkvg14rDHYxLIH8jGWGAIGkfrsyXPKHkpFF4UV7b9OiVy5FIC7BHoCf1nk4sUdi7KoXgb2iREVizF1mVPkpXsxy3wXp0z90GdCBvxXy5ZZz4uXNHeN+yFvZW+ioFibAMwSti7dedMSZmTl03kUUEDcmbNNT+2jsHHrfuVtV61a5YZwPNF502GQ9Uzj0nzeVYTn14uKocUS6vTZ8xkAPPr+9y+uzNmuO7jdE3nz/iHZO1T7U+lK1qJ/dybalaXkxvRPcZEbjX/+3c2t4JHDA+vT7OLZqvKB+uTsdpXyb8KKLl1S9+GkqweZmt/+74G/yGgHb6ZO0l4XP2v5Pjw6kaN7l6Fkzzcu8J4egk+n+LQ9SBw4YCGHX3BsQzinvIjZE0bRbNGQhVK4o8eQj+ybKFUczu6sr7B0hvQhMXFYUu/YDJEITOZHSesnQBhxR6t88/E8hiffqGfiQAW/Tww6HrId2ZekTuCPJ0DgJLoQrNUhqpvces+czp9RXiBKiiy46krIeoMcNGtisQWVn5PMAzCR25m41EcFFIUVRoAfrqxwOL0byWjJ7+Q6bL6g3pIv8n8oWPktKwnt0bQZWrLH9R0lud0ILMRsh6KmawK51KRU7cWPf6wM+MbKqcCXCEqdZ2ynlVD58XSH6SlPB7k+lcZ4p46OTkklVhcwBbFua+59+JBjpyizJz7s4vRRh/fQheqmT5CH+PUjkXzm+7c2l5mfC+s9T77q+okJVNpYEV57mh1iB/9nlmd6XjGMpOtNYM5CkWRaV9av22Xhcv8CvOGCq0zOwY+Ilwe6aBSDIJvDegPFOI8FzsnNei1MAXnyqGiLskG2tCnhpXLTek2A1Msjlh2c4wGvLlmlQAq5aQ1vtR5001u2/JiIPWoTGf4A5LhPuurztXrta8MkbSWlmpid+0Uvk7ON23JbbMTor2FUn9K7bvulO0mBiVuiD3mRn44uIlSCSMHDqHhSl9v5V2sxRPKqYp2L+D5/JPzAixb5+q1T3OshFSw1gXyk/SJplQtO3Xid9I60De2ND8bO70GBwqB8oSJn/T+17W3+vymKCxlSu+ZEygtUiX9v4/PxtYd34CD57BRd/sL9xCmjeev0A50yrgVcEz2NYTW09L2CuxACoc7YeXs3+gAzOz3Jlxp41pgohCuhBJ2cXCFORYzxQf7NyPg26gY1Js2fi0x+4Ib5PsOL2S/wAqhlGn0HaNY1adtbFboo+KD69smL2e2Z27xBWfd5Jy8UdviEVjjXvTYUF+sKMfHZ5b8G5613XY0G1oEpUP24GesXV3+Gv+x3CwSG+d5nexUhJVE7BpxdnjAiCrUoWnHYUlda3na5b2rjcbh1MV0WPpGir1ngKp7GHWNhqzOqCQqB0txVt/IGG6J0P9unLoHX94ykKGbsiJW1DraBdESTgzZh9cH7h4uKR95DAiqIsjXzJ93z6C/WzVoNChBd2I2YnrRTMLhvIo3so0V2Ij4QcFwCPtRFKzOBOI+VylXS7PgZMabUd6g4oFUhBRGAbPniKkWdVpDHeafe0pN3JlmUyDI4hqVBYTMZJB6I8IydEPC/CwL8ZPuTOIFKTnzJQTQb0WWxSDEA4R3Yi6OMANmjgZyzbKx6lPSEM3JGuCiVYtkvK6Lot1J/RUpFL3A2Nv/sIBklN8P4Ji/UJE62n3hF36uX4iZK5xgfaTov8LnW1+y3IAJFZuTnoLxIcHQVhR06+IZm4v6zqiqtyXNczDUEhiGUQKOR4I4KeT/kYT7YSgLpBsGIRWV4qnY+2YIbK5UVFIvq88u2v3Z8XBTKliZKWKenL4iU7RylLp5shq/KCWxi44n4kZpoJOoooglRqV4UDDnsDTSDHAyF/UZaZBdSt9O8LJ6Ya0UPizEQIUwea7wHZ+Os0ysaSPasOYVTVVIwsdiL2s1grXAEgbY/TKERPgg9AFhor9r1AYqbws6oO+6TjHv6KdQSFN6VlZDvqZlg5/EXbmLLzZaJjDMRnEWYVzeFyfTyqOUIq3wDjWnYxzhGPHigPmFJLOWbo5L3hUdw9wntMBT+76ywYT69NB7jWe0zm+BdjrKkcT1d62fG4iYEx0KkC3BSSPuc/2qazqSMjwixWZ0FzC+rVEghOcmw2eP2S3O7/El3SNdMmFjhLVYvzELqSE7zhLjbsg9BHN4YvYi8AtcsUhB457oxagALurrZfk+OJeMkVkH1Uh0UwrQB3Cs9j4/zrS76M4WID3wQec3/PtZIxqUWMgOxsKGyMKfAbbLnybOtQLgXY6WvOeckDpgOIAiV3VQaKzlnQXrQO9ew43gN38oH2OK9eFkklRitvedEZre2gkBCEM+tmJo5T1q3i6HYl+VnF90+6X94pXYDpb6z7yTYqoIAlzvxNoFXqJR+8RuSzQzKxXxCcPAusT+gO7uLeNU46280RgypANGoPkDjcVtW7P4LobZxYxMq2LEPiWCamvvJfjvRx932unqqMUQQUcVGRi2Rodg8z4yBU6qUvYi7UKgxhXFMoJJtrxcGNQm8M4Io08GL7p736Q0s1R7xi6yS9+mpz79d/rUvAAKuGWRBvedDhQFZ7+tPPzjs4A7iYUPaOTFyb6BODJFew63S8PBTYg2iMKUlWdeEwHIY1L/GSU5obEvRyi9wXUiuarv+gpz0bUPj+EDMK9ve92fQvZRsKPlp9u+7z1fGYR2wQROo4RpOZx1s0RSN8YjsrVm6u/1YLjbIPzIiBlo2/2s2UCBeGgvE6JFzEusx37MVIAvpR5dH6Sy4tM4UBEGsL5P7vjPMI8l/STH/OHSgKWfbh/QELWUTvBwqxW80WQa9iyd0RQWC0qQD2P/lk7RaiVO4E1sX0aO9huu0MSKOjSxgi2DQfAYtPZ4atNgKe2a7dxJkB92pnEkXWMPowHzhnsWZMnBTMOL3/VLvsCRC6eU2PN2YCQjArh83NqeFtTushP5auOcf8YpEPqFTLWGxUGX1KccropZ6ynnhIdzMV0HiM/AocQSTOro3tkGyITmMKMsnhOeTkrk+d8s06AoyWL7SoPsCIiE91NxIIeGMfnn6KhF5AeX/XSYcgW1NoSa3wr3b3LiSqzjCrwSADMoneAnFSlF1jsiD9hUzczhldqsyWrKJ8s8KBxeTo5tJ3liV+ljgpwbJrA4/bWGuqRqM0bJpajKcqdODY6spxggvXVaVGKHiMu7wE2CHrPcdn9IeypeJiyVgTd9Kc4xgRmwgRf88Z3QrzegR66aaGGlfM2tsj/r0GLIWq0ze+nKPMXulHSGHr5GJlZ0SBYQzjMw+nNqO5TReQ8/+YDZfVAhqpaE6nW0UVavaaRcqKiqg8Tdr1xciLgYWwOCrfSUQJUjV1aee5Qj2rPprU9BmIZsjkacc4RR9q8YmzByKQWUaIbzIBIdX4iD6slYjG25ax/iB6QorYeRZVHNVC1OAeQZBWTJrMyrrbBGIL+GsgCwCkkud176qxc1HkUZcw4VDBm0f9j/6H8XtBCIg4XYWpKffLJw2Mcw41xBZD4hV3iPIi4fe719T2SWFtGBxU1qLQ6FcRwajZDgbJPGBXdeNW8YvEgsjxpUZ8xp+8BLhbpThzLPydTd4tntJ+EvSC0pcATc2RzDiIkrThq2vp0x0jfCcxdTisMAIGCl8NIvkhVMNfv/yVlnnGP4JOHbFj2+g0/z1G8h6TACpyinIUOxLbIkTs9V7VWBB0yTRkPEG6KakVg4mMi786bWl6c4aPAwbIaFK0oHms2lPFQFw6lY/6W9mw73kmlUSJZjCtjSySxvFeZS9bVm5dcSZ29qmpWCiBPVxAybpKJQAyOxqm8PGm7KnQsWLj1nKhWVB0gsM2wqF3CMcsrokDmoXCiFc/iPq7brUOqFLb7doHpW3/b+izW0OlFpRsje/q5cYOetW5O876U3+65UnA//kKHuw8yTy2wdECTs4OKJb66FiLNKjKQBR3xcv0DrYXoYFekztiWpPA9ozhS62wjjgMagZozbbSuPAFRTQynNSS4dVd7/MfZjL4+bL0qttVp3IqbNrVsafOtTVrk1VYsPGdgR/TxYqQrc95Q1WFZXANVVtu9ApbcuVhMiySx7qpXdOS5nJ1CHzmS1n8Yuo7YFpF9WEX0jlvCex+TZjEkRRjoAKd/76fT8dCKSx8nG+aQYgPpC6P+qTFDtIC2JX09JN4F5LwUEl8Uo5/7+GYhOsAkELkR9VOfJ9AADeqXAPTrjfHUI2c11eDmjy4++MOT/wr7SLGFofPLDVSHzOlvu57bsTHPhz2SDQrVvnZVhxOMriIjh3IKZkpbJA69fuj4DIsbH+zNRuSWYQgao7E21h/s/aMdpuWVJbDgRURPq0HLu0EeTCUOnIfoRJtUkdM81h+WEeKSjaq4T3qFw2kk5WyqX2ZvwEhPW59sLZtypaiL1g0FpGCNsOOe33Eg+knyHeALlUSkn74m8fOghKTEppNuzIRGDzezCoKzp9XtYp1M2kQy4+KHPVROSdgIj7RzjbyLsNYeg+cWrhG7lgDRn8xfyqkbKe+5boZxHMOgoBjs3dWPOlPrzyihC7OAKDL1kpTPUG4qNgnQ+l0/AlbBgwgUvWZ+ry4EDdWEUu0t/yhki1GlynGWCX/X2TxIK+YG3piJesTFGAWN0W8nEzJfiLJTJVH3FoydYHDsrrVRuLQiR49rweCI2LWesPKZRNDKBPlMJHBBVpspwREGCfsVpsP3F9i8mq/nEhlc6CwwDLxQvJoq3khGbL64Q/w6zhGeF7C6wCaARtMLxDnAA9kGGBZcI6yOiLpIhtZtWwieEW0AF89K3aaIrkrxojaNLcKeA9BDeS89nVJQxAjx2HEaQ9UpV07cDMACmrCVxbBJlbI40oxsSNlcAp25hUUcG0jYgYGeVnm82giiATWfZAcqeD+pBAjb7B4CXh4ySpqwT1ogtfp6YPEImYcbNu0QC/9F4w3risYxOOfhhkGwuiT+GlVVbmiYOwfBBJnJF8A2cERUBRyNIE9GlBsobjfsshUuPWvmPAKJW7WJgCK3PSSTWnRT+2QPeClns/qaXprSkP6kmpYf4akC8y6QCHUpCxYO1O1iOwArW4gl+8V60waGW/j17AJ+m+yxmIIa8pSbEILq7HdwLS9tJZ8b0pMw/PGW0IvJ4UlziTHhUITHoGfHNwGFAIu+QakCihG0EqzaKj628kq374DtEJt3JN8DuHnq/A0s/zYiXwSO3lvwPLZjNvXqOS6cr+lBwagpuNI7PgbX1Gjjl3oeSHJn7P0s5H8UqSKGbj5Cjszgi3ECBiES0ISKylEonMBwHBBC3cOWB8QKpYmVfxBq9SJADt5WwMhxD88VaM0P2jyQh+Y3b46N7clfHYkxoZNzpLN8lYf4BOcq0keD73KIKr7rhTK5R2y0wGe8sqggGrXuFF+Ispu6tAPcODtKIZPz7xy7CnkoS5RX3sAnOedv00BQ1RjRwzdP3k9nBN9gAJSsljpVCkApUFIYdlAQPZSWjrCuUq+2sR+pizWHuf63qEeFUJK5I8FaIJwXaHrgIn8rSrLqwKlxse0eNsd+S9y4WAZjrba2SqC5/ZiP+8BiPjZQRWkKTdoKZXfQz7jls87p9iblnVWc4MnA6hSP+thxBi1gZSROPZuv4DuvqBkFK8CqZPa6eK9LR4Gecg3uWnxdiXzRC7IEjVwzz5XGFjOjyEWqH6+eCRlO9x1ctMfVl/i/34i40uVOmPYpERridOvJQ5wXeYRqKONTNUGLUEl+RlkyZJqJv9whcwGEAdFHEKz2ldi3WCl9aaST6uuHp3bhgwPn1YxcD49w8+WGuSd+sOVxs8Di8BOWdYDxTavJ6so0zF4uxxueScee9JUJAe3qCdT6CJNpvGDyuvL0HpMOsHQlWcfl5ySLjD8DdT3Qc3fa1jTMpprmiSBdTvdCb3vwnU70fuVJZMym6kvn++vETjNQtgfC2HG7QMqgVbePOnajAVbCyFUkPFol5oaJO8+GeDH+Feo9IArLIbnOlXhKkBPW9td8M4Vnz4FrRDuMKskdwUjig8ZZHM5jBW1TdTVbD6U+4MXY9Pcd2rj2sALxc9e6S7H5Ua/BBJAnAzQEf6csuTB+cY3ptRSq/QrAA+MIrcVLJUqf5mbCJyrIJH/QPODltErvXnsDdeDUHXz+8JTuQLGXpSEyL/6B1zB8vVfsGLyYkLqSJGXz1GkThZecX5NU2MRbs76Szfd8utJ/TlmTU0tEXzNURUwKbsdd72hs/Oh5WQwDM4tpz+WqP/7BDcM1ZxPmtFu3OxGsnFZVD0cK9hrPHAZnhgte3rZYvDG+E4gbdnTaMP9OSMwhdkkP4Hq3G7Kuxte1YEflaOkUd4y1+EH+g69Pmas88ZeTFs2nKPiGAWRB7ahH9ED7U22sYvzxlROaGNknAg/SF4BEvotHo2SPxqR3SiNX1Djgr1z6+Zf+b5hUG0iIJJitEuzKHvMTG+UzXc4MXv2yLJRJmS7vAWZxl9w+09MsYy6QWCdXdtc/9lWQknf2YV+t0XxqjMwy6c+GHS87K7JkxHQmln3s/kRF6oKZ2GpyjvzwbVbLrVJTJoKW6sOPea+Q2prSDWvA8vwYs1G55CQPvl3g8WdP6qbOUufB8D8B1DcNdgDFcLj6zj1//7k7QpX2XHkcfXDftc3XKRtD3hNxEUMq3e4I5lrQfR8SP7X/P/lBj377c3bP7JdrN9WJ28zJ3ZXH0iGI9RvxwSPfz49cl/giWliyLPJkIvYiUKDzkoEuef6KLhZCBwsXJNJvvE5tWEq8Yi/sIg/DIuFWv2z7xDQrmBR8/u9Ja+Im5eeol11ZL2XMTx6IiitcNMuXMNlkF3TBPXiQ/vRWZ3JeZuI47dFLpToxvVOPa9QIB7v8NGXXEs+qLnfIBiu6yLqQDKJtJHRUrYOC8dZnZKIoNn06SWrRMhzI7lO0o/bMIfc39RsyqmCiUoBHbqJzmpcAH+8CCam/+z5r4VQ/NSdQk78sCDIyTMYufCnFUHZvFDU5efkGczFaltp9wwz7iZ7fphmYX2b9Ra1bn7XvOfFZSDwVk2FoxyuKPtKdkpC4oCAyYXwyqp2VEU3k7L5X6/L7PHyeTKStN0PxMiAHw8SbbCyyUEbeGWXn/K2gYOLEOeEK7QsrI08NCiV29nQjiG2/Xlg6hjxHFTQHHE3TUUNiE1t854mp+4bC2MylnnQdUMBxVsmFZ2H7erSVpbEO8IIL5fHqpCa9iyTCpCrBzMIgMTPINXdPEwH9KAk00XE/F7jtt+Aa2bJ4VBEmTbkkgRn2jJUpm1oG7VIsNGwWlFrQzeUGkCdvYbfS7ju7T6GKTP7/wJyOTZvvDs33Wo1HXrRzuz3d42oH1jDdzDM++RaFkJNLnV+bpDFWO3Mv1jlPX40OcchM4nMnRgcT3QHSbpXXcuwmtceqybrzxV4EOt5Kb+nOdgDIGY0EWeRgha86gazP08mMDVn0kQjum8MjOFArDdKK+bDU+YINoaX7CfAy69neJ1VBTeTyj4753zHHrZnxwNpnb9P3TQ6vnXSy0mi/68aaaRTq4J6yBiuvmxkNvolllKNxSeQBbF8uBbqhMBOdpbwqWbEoJJyfrkWas0IfUHAajdB8gogzx4q83g30Hm/QV6ClmFqD9fg3WtkjByuvUReSZzI3ipGtQg6lijRp8igwbPFHmZKrdRfqreelVyzjce8azdli7QBNpb4IkWcUqx1Q7mNlFbyQrjzcpx7Rw1wpVkEgSS1BQ5fN/jvsS2GPswLIoVKZCf6GluQWv00uU/M2QokMFB/KkXHxxCtLujZXtcO7H7AxPXwI/KCxDsWtLbtJMiDl7IgGPGL+O41qt/o/yhELKN5nASZeDTllPMZB7PycsREs8QnxhnGVjiOOjWhkO9L1aOvWCLOpz46cH+nYxQAJYDkhQX4OO8fArZjHwGXUcVgLDF5lRzpAbJUjR9b9QLULu8/vC9TWqy5/j5D1eWZ5PGsVEfz/rCpFrhrfiqTssF9e27EBfM1lwX6gK8P2NVhNyCZ8aMOo3GgqSvP++PWcBiwVfHB+BP5sQZcf05HvhxFu2XOtMyCezsl0xvqAxoiejsU4j2T8op8xi18dyEzQf+jovJ5xl5tNZZgFUvj7pl28/DwEvO3Z9qe5bMUEAECL3/YuMAKujG/vi3bdvIuyYR/Pz6KBgTl/ax55TQ65bihtoUdNF35skF2ETs4aJmN3V0o6Wtu2NHhPzGJ+xL1ITDoUendFO7ASuCxvg4XCkniu153OiEKp0PBYKE00g3bKvQ7FMM+vVceMRkkriOFY6uROrkNLSeGW866QOLbIKLJ9YBoxMX6WD7cxE9V8hdclgd540FRPqqV0eLWSwm+UAkgdrawcW1VK8GZXHLqKcvSoXUbtpJ//L7Aotq+sRU42el6d0QuLxc+oH4loSlohgZlL2b7NMhmLkBEB2B2XkT2siB9Xso5MQcb1G79xUpBdmyhXJI7+iiuWcRoG22Ot31GiVjMskLUInOmZ3JHZL5AJm899z43qUw7BRV0QAdkBuvIGQvNoTOmZyVjlIdvpFoVxZu2mSaZc0SBj5GGOed04hglVqcIBHpcXvok4PHKbZGrLUUn9Ay4xHUJdEGAYxxQ9DV2CsiP2EZVUUp99reRKh1RAt0gOtHiQCoh2ch0YdGB3dDZ6+to+EppDuDDH1BRRg/swPWKFD9qGPHE6N5JnvMDnz8hFAtiCyW88CZpkvDkrvK/NxQBD1vYIe9aSNeggAfcLW8UaM6suOpXT0K52ipFJyRSGkbckMUMldI6D9oipXleucJVI9xrWDa8AzyLSpND+TfzrLGfkT1XmrTso/UqyARcgaZOpsYKVqbLMoIDSXDQwjnaReT0XmzotTiuttUz2eOm//8trrcXycBdcYiu7mNSimWHL4TXf0YxZtwQlg0FINXnmUcc7PbLTeE9RZfaucJ8Jh9nf3SWhZejIMI+u6bE2/WgBCJ0IVB+Ui/fkQsv7lQoXrng5Oy1WNqUZEsFokg3dfr4FgP8IqqBSM44mwhArPdb8QHOOsYi9Np87cFY4xYx8tyAXPJiC0i4EqGq8Ymwi6rAOtu/bJ24cr6C//LTJ7CjKHgNMQV3gtnttUoXfMJOTtiAUK3OQIyLkAHznhToICG9FL2bJe/2GWPPsEG48gKpQewJgjAEtx7HhQo0foKUCI76nq/M9GoqSkxDhW51G9sfplZ6g5QqP5F6d4I7zRf17zQ+qUEc9IH6XQYBGSullc/xQ8Er+cXDX02KhVWcD0gGyjLSwvL8vpzFZ/LqtrPU6808S6AfknS57l0RplSVKsBLEte+tN6sQKn7LMR2E4f0mZzwwR797wSek5+yws346jif/l19nfI1ErOuxIzmsCBqr9HvMnumhwzBNDYmOI1Or8qQI5Kk/pVVyQ2GZGXKsTM7Onithswv7chThkfWqj4Uk8mIUtRsgKz5N5KB+elVvOnf4bbjDfHxSy+IvIQxqJAK3HB09uE0M4jGms1xRGs71i7Ba7DZWBIqgnW/3a7Xo7recKIVJZnAjU7dniechtGyK1VPscJA2pgkYvPK0PvOBscFl4vhD8jsmSM0YMYIe9Q1QlDArb+y/SdJcTAT0cgqxxGmERF+ymQTL3L/NVCt+g7TjXB7NJfrl+c3wim/eEmGM6F3YiUOe5XzKsucA0ab8fnrW5pWD49i11jNrRWiSIB8955Mlw2ZhBKAAU06nLcNCDEnSzqwU/9yNaAk0H+qzG/2XIj1oOD0CJ+VsfgQTIjK1Uv7lNhZc92PR0g9vXwFzX9GX0voDzX9PXSpJ4sshjXgoeEM32k2xC5IRAo7Qt21i2YNWjERtUUPbowwJQP60vJEMLLNamVNhOCME5bAXpmZtRpo2YYmfNc24UezQ9Bc9bRD0tJCJQ5AbDVeZKsors2V7gIsYsM1aQkw+B7D3D68JScvAik+l97rnK2XZmWoqjmU3N/ohR9QGW9mtVF45pjyxYi71QXXO5oJYzx9e/4So1llP/Pii356VAq6mT2e8Gzt3ZcIo2qO5pJr0ilk8WbbgqWfgB+6aVEqK46fXq8bPTHDX8YRmWcBSNyQv6/W2Hqi/usm6rvQ7DKIqsjTVdZ9BpgbHEqn7OoSR2TEhXFd1z3j8NR04naiWN4NsxZy4UAW57ntjdR0n/bod3sstIK4113HbmfFaLQ9wuGRwcST+UIyfGe+f0MnyqSv8hdzC9FPMPvuITw9Slw/X3WdNe7agl14tJmoZlr5p0RP3M0RxdVr86+AqkFjT/obqG1gjhLlaeZJy1etqDsMDZoP0+WK9i2FnJcOtFwS8qWBZghmv0IZTik3mgvmDqqBwmR1CvpSWrZsMG46kx5LZ2PmAps8kqG1vOQ/vmB9Izo2adUtT6fH4aCY8jJIpF+k03xT0iuku/UGa40xLUtwLDO3gydzGd64Bc/yo1YICpUEOVrbCrP9whvR31L3pdT9OwD+w4r+6bNgG+Ui+CMkx4Bsa1yvqEA0U2aCGT9NQdtZrsLqROz9fx5A95HUFQahrKNR4zjw7gx5+43iA36nN8Vf/A2FfD+Vx1LPqhVO4aeIZj8/OQbF1KruTHtbmOFQXR2+RTrtK89AQrkGMD8LIXWQi/JwlwGdi2xZueVyfl5CZi4FM9q+53nuqSKjrHsfY7c59YvBFTpjdcbJ4Qqte5fi0B0U/d5GvJNAM2lw2iy4Lhtrxlhy4iub8mhqZXufzT1Hyr9x5vZUdMMean+zw2Zg1i0DeGSLZCy80RWW9H9j9CouVq/RWep6oFFCeLWs7VKYrNttEqTbcQpPbrp5Hz/aQpsWZHPz0K6CSSiHvfoTtvrdczuoFjZrzgGrecsqY/0RD9KmcPPMLjqSLSZK3aPF3CEB5o7MnuK0vtPloU1gJf/hkwa5e0MC8WKRwh5STacBL1Hf3rOhjq9x9TdHRpgbtViitfOwOn8+78m81siRRdxx/m35bsgaKu1LIgs3fDZfGlKwyXMDxfsUe6RRF8+rJv5g1FnU7kBuEGOGkB1kqIDVvRSROaWBtwK3v4U6fLHMrbHn9DHn/FFdwMrtldIxdPEr3EGULY9yGrDVMNoYDbZvFvjhyrCutMzKLPE/xbWeOeW6nt0lf93ON3Qg6MKpzo/hmfUrvzLFQveEV2PWppBzBgGV+uylC5zQ0rHOGnX17T5rIsOtUBJRZvBha4fTblEVUMmb3Ao93pz8nwDhZugKqVLV3q3+ivPeWigHHrxZ+u2RqA4ia6qG4y3wcg5giFnT5/+Hb9ZTS5b6EmYSTaz8knhgfZSYaGq5QNftmB7qDuNhcKeBpQel9GSNww5J35LDNbzD4bAZ0jK5ybHycy2RQlZWrkJp5ydswJqeIB+tMIPdTt6Fho5tXPGM4i1QK1eyZOY7AGtCLFHDZfGSSb4HE38MTXeKXeOEhfY6oUsY9KGf3ZwbBf0nxo4vINEiJPyFSvmi1VDRmT43iTRCLYfULEw1gyyegVqOdEMhcK52pokT3KCZwv2tjBHyW+Fh9o3Ql0lcC/84CImQKIcsKy2XaoIEOk38AU4Xuehl8USMlK9XSmDA4nu51LK2djbnIQu84v8OF1VIpukNa61QvIBb7rRVey/50ueLFwxejR60Rm2rDfE5E5mZ8XKYHJSV/R/JHtPR3KpP6/8r2rrq/OuJrzSMRldZ07ovbnm0nx2s3CWjpS04C03riVP/dzKTTLN0mavDS0cQ4JTA1nzGL98f7w66ETnB+M8sg3xdKJ8b/K0fTIleHVhPs5w6ykhsmVR5hgFm54sq8kOUpC6zK1aWanxm2P7Pp508hkJaBE+5FFHc24LeU/Jx7WRBu9PwpH0/fDkiOZa73s9QgCwd43ALbYVX/sau7bW7LaPFTpzZvMWXHt5BWWyATv0BwZ7uJKgnm1ZJjO5eQRqL+hLD13gBxfCDjSBuFAWE81uSPlVyAyix2xBviV3PIcQ/0h5Y5gaKVUCnq62OcAR1H/lmBkPVcA4aT49u5/Td/xKHd+kppsM2NSBNbYuRT27U/79Y35FUKpcRPldEp8nhDVZukBTSIsf5G2NYu5LS+BuAp2Zz0Z8oAbwe//xV87oXTlr+S01NuhDknXVMX0CnZpyvfWmbH77ayRDH6MDlze7A8DQJedIw/M9AuxQvW3xZqSyiMHCM3DIs+gkLPBPM3QZ/BZeVJcNpKkKGa0Wy0U4uX6hrafrpvQMx+hYMdxzDpFCYvGy9Q8gR8mzSLEHevtBq+KuUx/o7XI9mUZfOPnesBW5kpwJJHVhM5Yqbop6/k9KzhSe08gPD9MqZekgQOWccDCjdyzsLUj+zuc5SYeSj4Mgyv3GBhCIPcFsm9DZmi1TItqqg3TifsQd0P2YPc3cOuoM/gtNJpJvc5VP9MnyEcmdSoB5rbVMrKp9Iprrqqwx2NJeoKG+PYCFXT9coMoZxIxPh+RN++bRJ4U8926DZACEtACif3CoheiZ4hQ0q+F2RazkW8P/3JB6m3MiJEPT6wwntjBd4MWE9x5Xa5zoOUzJ7DSaEnz3goeSYQ52RUZJG9yY+j8fJf9PGobiT/OEq068hvu7FXlBBpIeIPc3M3jhLkuzmANtgRfdfOSfoOQZRILKfdqA4e97mOehWrE+/IFZ3Jjuvl3G1zkXa0xFQu45dfCl7xe/5y12+7+8DAiXln1J8RWPc+lE84vEJov8N/J/kATHhUp/k8DpQNPS9FyoAhAYVPigR2nS5sxuVhaHB6piTiOaTh1e9jAZ73SsZCO8SzqGIVGpXNvT5EdwzKcf/J5cT884UkqfPZtcj/yiDd7k8hToBJidUs2WPJWCBXn+5k7dB7wuJL8M2j1F/J3Oqj9V8iUKmCvomWTUlAJThtuj9dXUqSKg3vRy8AB5PgatWgDfYAgXj3VFpeaTtLKwDXORg8wZW6Cza74p3tjbtvtwJIX+lsegIGV8g8rkboHx342Pqgn1v/mtWz6FEJ7y+NgoO+C7ikRPhs1I/yV+Y2UAVY8e9NkXOQd0pieNs2Io42p23B9sJlv+CPDGxzwMXtVGY2mcP2z2zDHf/nMRdwUBxKcj7kOJ8rNeautlBKq8/JMGCpJ92GcljPzCX3SIPBLRXSZKlpdMWyQWnOdB9SoF3czNV0HTCphBzSihM+ZIO7GFGcPS+yLjE98nxFtIB1NH9RtSy6CPOL1p/3+2NONjamL49LuFlEzRSHyCm3fBGDh4+Z9uDGrqBSXLZS61B2QpXmZwwUfM+Q9P1Ux2f5adlQxU5by3Yed8t31r4FH91mWdphO0jOVtTC+642VClHd3uxo1Sx0Ms11Jl66CnrXjODmk3nMxlEVFoaqxbKKpmrkncf1OVu3knaCwX79P/sujHsAxzel94PDK8vrROcH7boFa6dL1rvBFYdFzcH/KhaHPmOmLAXT9uZ3RzqizyVIqTevz/+CR4sdT0rhjL93BDKWLflPV+EEeTZenD9BDN4tT5t1UEI3p7lC5pJEPM04dCOlSjx8durFau6qhKlIXvg3KubSkURv+X2Rnkh2j2vEfY0Ac/ank6zrvyYCTJT0XMoo+6AdGXPP23yW08IBtHmedaQFHsPBKx5OTGOGbcfEGnx5Grfe3+/FRFF/MczA0KYz+Yjm0gzazqnST6zsJlf6yFLUs1gSQsrfME35+FpF4asyMeh79bF+gwZMqv7WXgt1aNkfa/BDCbqNu2R5qJ3BKJ0JF4aVz6fmlJqmO6M5tWFd96YAjZsi9YpNIv8WJU6LHYOWPMlY5I3QWdCJ8p0/caZ1yXVqf0xnBDKbO9mBDmv7zdBiqFYVfOVlVJabR9R2ap3PzEXzFcW4lgCnV6otP7IOkJ8tdyfYVt15DNEi2w26QK1UNJkxhQNRPOtii5l3u3p7dkaoRvNbTZcjM+53em0qYSK5uY3ZorZNYs8FSovvOeEt1mWv37fosOajRovaTtfm8gWlB2uG5hIp6mVFiYakd7TbBTyAlVKGCs5VVP87cL2czyE7Loci72pIjqc6osiCvmzoBBrKEaiC2liEESKR7tNDZx8hjFTboJpaz9SjHVrl6S4q5OHnMRxtPIYehWe1qLpdjhb80gxlnqqNWfGtHcM2FITfcgApVozcVTVoyGhVrOxmCKACYfWYByGJXfr/w8k6xCy1slUCq6ZCCMWed5iWojb5zwT55ee6c5SnTEOWZCZ545DSfSKQ0PBA50ji1gKMwy2R5zynghUkAuvkbc6hJU0KPscmgy+Q4InnJF2HA2oXiy9YaJBQzms/nLZcWj3u5VdTIi3r9lbxeX2P37ERfFa2lipy0+Nzdfy6SAWVr0MJsNs8zO1ecioZy7OHqbSfsc/JjRXTaAqzkkh5k/H2MA150QJEneQ7dbMimfB3JhfrD4ZS9aSu/Pukr6bqFXyDiyZERF3bGvpuL+rDWgmcXnEPlZTD33pAikvKWTaPMeVqj3fbnVYvmLz0/VZwQTv3zDdS/fGdiZ1/LjeZhJbc0DRnmPPEg0799pKcW+oGm9+aRnMwCO4C/4w1p7f+lSsfJmLzY3g48i5fZNr0NhZ6pa8RUutjJg30CXd3Z6jwkc63AUoY2Wl+HkLYixb9jyD2xGlppM2py02H6eNRV5oizfn8ly1mKZ134m8HIJzub4Cz0jiQi5HNXEFS58Zblr/CKb5a0rP5dY3Mzijy9Wm5PY+btRs5UWDgoyZCtGppslVuFCOTB8j0hRC0iS/Z8F5gpfLOUAqe116CP8EW9GquD4ZN2J8RbDCnTILoAp82kI5qGu8eCJBkw7cODY5pR7p4CvCSwPE+vuzB6eL0gFBsyt8yCUOLrqE7bAEakfz5hVAuSPHNah96U6b2c0slSSsNXCgz9TnTJzBxRcApZFGSGbESUnpVkbAwaJuGDs6xlLBkml5lWTRRNCcFexDPubQvKpxOF+Q/zvjDSCONCTuW7GYGnOCCdlrCfoinY8KoovLi3mXMlY/E+5FRFHJMbSiMLfY/RExrGz/M3bJqdCuni4V9YyONXsaYeLxWpFcz/fahMmzUuLD14HWUmerH5k8rlB2DX6Jhxz+c8NTzFw2LJRObdWuRnDR3I5I8n7ozHPnkWymGkevg8ujU5eCkUsDvFr5bhJhpeQ4AwtftkQgggxf2QbgqneMrjmwV6cNYzaosKxOMavuuX0rT24zDcoWPyVWd9QBU55bSG/j0hgVIDGASj4GuF5Zy1gq84xcBmAzvBpB4j3wIFAg3wGKljeHgj41VweMtJl0/W64Mz4ega0YnUvyra2T8Q7F5CmUEbfVXcaHJpGVnI5Efjc3ONzxx3ZoQfHiwZifR3CAxD+wDdEtIqomYUCQcGykXaLkBPUCtKTELFWnhtFF0IeX+58x3T0wbHFrkNcpfao5nZ87ouR68ij0G0Ee53V+Mi0ue4/EF8Y8yBrxFKA6397SQv2HIc663wngGAs4RAvzbK9JmzgrIDymx7RlvzOu0XD9MD8Vm9ahk5PXhWI2HPEJ4fcUNA2gVRHXbVcy7AWPJAvTXJzhPFx2wZbzp0fVuJVqh9PIMagz+d80JfpLcwLS4xqqUm5FLEdSS5HNbFB6DU5rhNYpo2X9ZBKmiKFr67EOwjGbtB66yU96yi7PCkmq+QC+dB61V457DTjdtFOTjyfL8RufjSFDqpPWYqGeh9D9PPZf/Bt/TLMsLR1w2NWIz8kpy+ywvdvi3GiDHHUKCuUHGceY4mR5yMgnuLSfUyyia2WUh9SK0fiWmlHFmdQNnXA04h0uuttJx2DeIHJKt7nbiePACQTkm+B2gUOkSPXowiBsLDiFOzKYtm6ZjfPysMpdvg2th3SfggLhBrHmncsCy91HrY9u2ZQ7aosS4K51wa9bM38T6J1KVWg//N/sKvfEdFTpF+1SBRVgiSmYmXmAYN3x4NHPysXxD+2k4XX2bDeh+4o2HDs7tFWaYcmwNGRVetySbv13uli4TBbcR+m9VIy/tBQnZiooV1z930Ugqc6nM9ay+Oq3y/DqRse2quyJ+VLayPMjL0P1UZPMvThF9vP5Mp2Qqv5juKAEW67xepI1CPPNcukAPx1h0vr13iULc+RWdCI6XOeFMepyvyKOyBWtiKG1LZwhuZUQbTurMBTO/q5uTUmBpRVShciM2lyixI0KfqvvA1RD0VcgW4Wyyq843+TNgO/5bHHg0y4842anxTJfIxao/kzs9EEY38XMaQXIJyL3gKdY+fIGz3RunHZApIcZN+JOp/i1p+GBWWHkgRpyLtKhZx335zU0SpI/tbV/N67JUxMhdM/SrvSSVtSbZKu0feHin5D2s6lVdY0EFGwUntyY/JMsDShfbpy0sAzQr7CIksjSizuda2nYDgIoh6R7KWfs4sS0tzG0ftIwA6QtKg/dUVOXYKMorC4o69ZnbKOOptaSThfgCM8d7ZD6o/9YOPjqecflSiguqu/iRvoHpEmua2KZCLGGO3fb1G0JqQKSAIy4QADghMTg+ARkgOIxW2AY9fRyBKYoFh9BhJqlCFUlCcwCnhwYUayT+iNty4nSugbgokTrkNB6ujUK9RQqQzorBLXsr3l49s2qel00PyFy+0M+23EF87bsfEGwlm1nuSgs8ExjTTekMTXnJKh17HriD6zUNzFdBN9l0noEXcvlZ937vVynigyQDGX/NLwmnLOsn3l/1+BrBRICwbRJLPMePpj6W87Aqcl2FwpDIaydqw+rBd4/XFNjKfbt9Vjcxb3RNFWgKvSzp0Xy4i/v8nO66zpqhSQfZlX0qOpqVXnka8AmOazssCw2yFpo2WO6E1vi+SfxOYHiEu2XZqyoCTtb+3FZy9kxAT/BqSnS1pIXyYpnzraWiCNL3H8S92Sy01wiOiN5nDFGjpMscfdJvP/XpZ/o7BSHuUXiokVYJnF4icsncUvIjizRlnRx3KysimOWOH8S12RMQlezwq6xHca4Y2L5I1FjtkXwwm7TFUvcjeYwdxrRNN6i20XzAd1ZmZHFKeGBzHj2h2rnurlmeTDdQ8dLyPKpNHsZcxJO5PKwSdKipsWMUnJsVLlRS1Hb/dCtQg2zuLxik1vB6npVChoIGnjnMK8LH+xhYbUX5sx8gkHovrUkqRgqgn7CIMA+9caeEl6xPLSsYewqwOMNa3uAzqmuXCrbOeTuCfZ68mW+p+x3Y9eJyGWYypXoZAFYegPZJPrl8hXz4nmzIucUf5NkhoROf2e4QFx7KSrnnhjwswhFu4t1tmwdYfaHbabLMXBhOnrqzlXUqlyOVabk1XHOz8nR9yWGl+VCIYOpXJWqYPLdmL6wpIlP/OFW94KjbZ/jlN9cS3oK9/yHp5LF3ib6m//FsyNdUByBcUb/pPKExVNYOn8p6tTuMImdl2GgOrORWBpzLY8qUUUvyeQRRVskVBZYjJSofPTcXApJmyziMiUxnAWMi7MXde+5CeD5sN5zAt/fkbWslnC8xC3tMEz/1BhZ4v6TuCeXtZHF0PYOJvOobAI+ES4d+U3CY01WnP7aUnNb73DcaLpfqs+tWq4bB0i0OQ/qw8aUhDX0LuauMk9pC24juhzN6GvMdwkt6vxvk3Nl2w//LJp7WYdz0dq4dJdEzWcrvHHA9MsiAiDVdvVSTRw3W6yzZs+1Eup2kvyOylLsjwXwMl3Q0av523Fh4Pb8nNMIp2K0lbkTjZbF4SUun8QtASs4se6AaRrGVO+jLb47X6QXS5iPHuDDe1Tjv2i6oTUKP4dxFzvf0GjYmfPf8RwkrgmYOYy6qEXsBVS42yeL7bEwbPErKl9sNC5Cra8I/QyLINkljk/iGJWQ5KytbqQHjH++AiQ/8DyuS70RYE/gZQ+ENKlLDmq7S1EEP5wNek07ROjhDv+FDogvAzpziPTCkSJwmVpi8Ul5su5FHtBQEcAaAg4BEQHueOgEf8GL04DKhbPwgUkpAzKX4HAjynNbQYxHgYCYLVwxWDYHCJcguChTqegagHgYGp7Uk4sTDQXpOXzvBvhXRuRKLW6mnSWBcjFZVbIaNp4WHJA6YaGU0WN1l6pUzZrEn4/bCzQN0yeFh8ShsVb2SuPnEcTY83zmQYkcaKK14BXiHCAy/sfBvRRKAt18WSrM6AVNWUfFrIFmtYHW8LRD2FQNzTJO0Mgn5hPh5BKBNSTypHgkU3PM+zOY7ewgY5t/dV+tlyJe3Rde9orCInV14BfJYQmVZyUQ3QU/VBKkVQZkLeUwZ1mnwLtiuQCpmd8B3AJC+EkOIKIqBiRqLLQijdGN0hKVT6I6hwgWjeaYOOg1XOiT9khMPdbQDfVknFEipEkQlB9WEBPCygZIynNHgrKbJFHTMStYOcAfQEkC81EWxWP8EWOMqPQCkiUIuMBWmpeU22E5Jg+9J4bR7iP+fAPN83jsvvCiEwbjjzCRQIvqnvaigRNqg7yGZzAzUfFYczA/Ix29M1ekuUgoc46F36OVUB1gD0xPnnCCispEeyYZ51s0G9jvSinbSaQxJnm5c2byZSXnXJeHhGwCtzI/AmS+XKkdNWKHblcVRK9l4u0okmiWDNPGi9+8qlstazP4j3D+A9UP2CRlGwmDn7XiQY17unwK/9XZS1Vd/CqbUMmU7sI/8KBZM36ExlzGnIlO4Y9XuOuqxbR3lnCwsi5/eBsxaTH72BU+pyLAfMSZ4YniGd2VUQIZ6xGKxnl1sJn/+sxs4W15sY0INDLvMnZ7xUjyt4fv2yu2FA9moc/CFQgnkYZESO4hMcRz4sQsRg5UkKfmX/HnyhIumOOH+pbq96T4HaX5GBkY00/nMrW2NTNUZRYXneO0aEYBmvHZYea42kxkCoQZYOuvxyHqJXOtRnoT1xkufBuYQHm7xBXtdd2NmsBSGF88PIwDwMzPWKsBE5oCYV/O/j8oURlPB1uY3D0OFaYxJcLXcqwa7YTEdobPM7tpTgsrzkbZg+DVjI2gQVqVxQYY5BgABKSajw1eyoWjILwArpWXluWv0qmYUGktZOzXTTKi5e2O6W3vhuqCrwzB88U89N0WR3ZJTpTTV1tKSC5fskDKPetWwCTSO/HTi9arrd8opRI6p7BznUs8nDBTumSi+Hlnnk1c5XeaalQSSqgMHUzm3VfjY45JCAelzBVyrWdrO9sol3x5TA9laqpbNbcWuUo61pn7Jicry5sFZu2tNnuu5iwNPeKyehOw+CPhxuweNWzkzDsr2UvF9KBvFApNwyQj9YFlP+WtXOS63pd2Qp9br3p5gBFaNomS6r8GDf8+Vl4v1iFXhW3/GFCGNg7vspJ00KCSdFY4AOxznQ9pQzg8+Ve2jPqn6IK7JdGF7mjVlC6XgOepa+d0TQ3F8uNiCfgPNr8/oqh/158vimHabxMNBUQEEqVk2iA4qa21WXYmfPlEn6xDXZamD7IoXerj4CZ/NqLB2QakGRxAJFEaJ9FFsb7Biwira+cH6zJ5f0H8M78shAxfoMDZyi8Nc2cIcGwMAf2Tzn5y4dmvlKN6JlJneS+KFM/5O3licDW5ziyiRulDe+YX3XoKWSKisu57Sb4J6/lcp5YXwc8/RVhtMBMwvAyKm+ONdxZofZc+6dTHie1EjDRkIvrRnkleeFGu1UBjwCIsXnR4P1nK7D90tdmRHEIT8Nps7U2OKQbzARRwOIIYcytb4tenwHGzdgyCbvUV3fweeYFruHqh15t2WRArKN53WpIS3p9PPPR8/Tj9XH4UG1aewLX5nA3s0/22+kd8eQ2Zbuc0NTdvcLOqJjncUfACis2EizQbYvmRsaoJxEF57XOmL9Q8faGdnIgaQn4hwf9DDAmG55/OHFmCfaNYpKAZpXTLleKxVj3rZ0FpqeVkbLGjvY2rmQItjUCqREztVAf/sJdhIYrP0HrNA9kiPjOydfOH0CqjXEBk34yrwuKPgp8JmX5/bDEHCgoaZedieevqdH7WliWDwBxNg8UoWpjVD9/466cpuoGTotGUL0LygUyKKW9letRGJWfap6KUKdny/KpSvXX3cOrLLeyvW8duKYlidc42sB9ZKYnx1qavSdz261Ovh3FUlmc5k52tEN78wPjEnMva4H1q3G+bkYlK4ylWgcTsLUAdzHXqb8pzCf0egaVP8SR/vvkNeO8S2733Zio6w3+ouS6zWGWX+BriE7oQ6hB4XKT9uomd6D2XYYZUl7XUx3zgtpLREyp7K4oIHVfM48DKiS5lFbJ7zdlpa0oex5KoX1sQ4djCdDZRmG20AmUaREfZ1+GdfX8QqR5rg4ZQr+kVNPWjgMgU7u1mXAHoGzwt26/ZKFQgqNmUvOKceoev6iTIqaP6QpEaQjZNy7MrPkcVwUwDYV+qG+ZbjzKi7VzouJ1UaD/msffSJAfawzKScqvKVkKXohHw/7k9iqMWzIXuWogwEdFQRbHrYKxt6ImJNSRypyAqv69q3a7EVdXk43dq/5WlkZp048nnQ1sbhcefzX71ZwJr0IA39L54MzhG7IRp+ar5slWs4h+wRbiaWPoBYtWoAx0FEJuqhbIJ3B0ozxPLyAnomq36ldXvdydxX7zzvKDF/jDFW0Hn1PSahQlt09beTxvatl7PWq/Qo391m4wJ2do4+8KzxeA7f2Q5AglEqbR6Q01fz80J5zDgtZLl95TuSmy/MvOmJ0RO5VU1RJdylVjIQgqalFvJCFqMDlfSubvA/ue4CFkKJYwIx06p1OObO7aVvZfI8qf5/HNaX7td00orX8RBAeqp7zkk5N8wCSneBsfd8FuiGLH0/2tOqNSmkkaTEOwvgJTiWytEwKBs+OiiuLWazREO/N7IehUWerwr8Mr82/JyT0q1imumFVzMS0IOMtU+IGjwcgF8EXnoCkJJl17BxTtG2raejJkpmBFPgR2H5AokyeBrER9WZL4advQHbfOAb1T9TrNucB3nkNSPxiTPr9fhODafwTc4WytA6SETxSb/5ZvreIOA8E9fg71EEr3Wkv3YNCX3voTnhEJsPYGiPhzBX6/83IpURX8sij4/C7CObdlcqVB7mtviJSP4fw5mRyHtBSDjGWjgIQKGm2pyvK77v9joeMyfXi0p7kVbuMD2GRbu2KBQHhJ2IuDGhGzuFYgKfJwVtE8mvaiHyWS60PRuGCf3BMwoI0PPGVRHITc61b10aNSxp9sseEdgDJHrZ/p9K2gJ7FOU+c6ICiVVxhcAqWJxgIIfkUaouqAolOrKSU0OxqK5XiQ92/2I2o89pALWiKUbRLc+majhtjFvkjUqPj7VcNLkDA0OftSc6o4R09JN+wS0Eg947JpprQDU3ZBNCxMdlenUWsr13lsDz5PhajGhuoFNzjXi+mFc3Ssd1BM9w93aqXVevuZqMWOQ6Wb0TiW9AJYdJHdHFKmnJQKvosj1jrg6wlq4pVRk0jrDKz0xUxKMYtak9joT1VwHbOLiU0C5lS5jMDeb5BtM40HZ5E+aSAke0qobU32sFbFuUh2EWMycadgDqtCCwN2OumBIevtyH9JcBFOo/PWFSwilvt+PF+SRJYK8TNXbS/3z61NeUZUTyPiYu4nHhyrOH1H+hJunv+OW8YecBbb8RmaJT9m4rkPQTnyKbZ/ulCipgi58SG88wBTl66q/1Ktv8eCu5UBi5xWkrZ4uwHDQgzwRyaNLaZi/m/cHKxeL7YCd/mUiAfecP+ZkEaaNAhFNXF0bVgDcTSXkJ0z6TtFUnLv4Jf9FYJZ8f9S/urYB7uUakIRnN4vFunTiRPvQMGX4lsrsAQTQHLzDErl5Rr+OU8OvvMIOXcXayl0yEPlcKqUs7KzNqxGk05PJ/dXyrdYdTmC/RpfiOh/LiQQy2fuIex6tIxUw38zPdBt3Bs8h5oKpg/NzLA12sv5hnQ5a5v+mLfWoII0BMgOccUCW/Rc+w1rWkIsFrZ28CGKyU4vwWBvnuy2bvJ9AblCmdLR7aeo7iBUR+cbcHVnU6V4XAfkrWMWO05e4Sf4xPOfwcZXuBoNvwaTF0VHdFemiPo5G+7b62cituvT9fOvGx6mhM1R6CawnSQTeHBoJ0/llO2Y0MIUMWU2Uhvt0OV2M1j8T8CpOgoanvY8u9+HINvo90J84sfCfDlrSPkuBrb7plGWLht05X+xZFnnmAWTj2xQqe3fhb+6B9PvjHuvwkuDrEhdmNpy66i/SI6CQifpB8ziSMhRh2nw2wj5i73C/TLFqjMDWSDk8igINTiUSCt7b7JBoT0kPv+pH+5qWWc4apvC0tyj+UkQqIxACQFkrql3k7yGUT8E3hxQ5GUoGc1Nhoq5KuDl5ez1/D/ccf6UrPK3KjXzs08cg0zgsupfR72L735NMy4v+H+bATXxpuazY848d41KxEmE0PVi757cCDFmn95VJNraLBROqXcB1saGtCJYEo+tt6a3v/XZnE93hCevOpfTNbfpsb3/exr8nGo7iQLD0eLYTStWMEZCyOFKSBpLszOSaRfejmm5LSsvGRPW1PRXeHyo5Zn/KeB3IeHnsvf7+twhpZxvu38lcYWoKC1GgCswtSDbz4+gk7w3DPZb3TxB974oGYPN0fr2vUuXH5D0ZAe24tkEMvfC9sT4SOCszPXyJNe7kjvhefMKM/REKYLsV5H6OWHpgQJFfI+yu1gfXC4LA9MPmJ1h8JwCrjgn1GPzrAlDk/+UnggKOY2P4vHWix9ih1iWWtwALShn5ymWLABy216S6miIH8u5D7B9tSWbmpVwQnOex7/h7pfT6nKEeQqp4fbJjUDPzK6mmtNLk898PtbXuv5k2mD9Roo6znYHBpzQ/RcVc401HSkO3gQS7G7t5u+QKp6wfYtOlQ4p9rAisXbZgUmDAtwFL2RhzOxB6LiOGPw4h+XxwSvy1UMeXbJLucM9G+4/uhCPCwwff7UPuIaOBc+Cww2uyqKKzq0+ARfGLOET9+eByvhRmhx720kqHCWPJbUpm0C1yq6fnP8nXQD3D0v60n1vWN2+bsKunfbsfv2zLgVQRqop7QopZoO5Lm8iiP15uwLYWGGqzpuSonQx62Kb56iedkBZejRZYihWxM4/qd5cUC8h5W1JvFGxlN6aAGecoxAjKVi5yoECgZ36tL51G0dd2EYOlJcX7PUyIenv3uc6sLDPl4DClhDtT4ebJ8uB8lShnf0zVt9WJrJLtYRXNdzsGb+0crvhMWokcdynXGCA2TuM5Ijt8iSTbCRnNwkl2/lyY/muaNqxLuHYnHZSIV9NQLtfvqM+MJ+ga0Kq9nVznCAuwxeec5H4L/pV93o/hXq6u10+ff8KlUAvFR+xCE9IcIcWCA5sKmbZqnD30bocA16jsiTK2cvcjUY5XKoWur9oN/LjChhLK8vBXuOW+9Eke+kD9LYbgozyoufv8O+rQaY0GZGIYJhEgceJhers2EyKNM7miNi8SwmGbsGG7fXxR7g65zKLpblo4p089Y8LdAmG14wtAjrVc9UWPO2NfeKT4rYjyTnt3Wczo/pG9xbJFr1vUKMO2iFq4WYrw2LSnN3b3l1WbleKWYhg2zk9oBsNdwivSjQgl+duMx7rrOzlV++dik8yE6n/oRSlo92tY/e2RHFawmTHJENRoDn83Clxnl2G1s30opilbf8AOV6UuqTVnHY+hiVoOUDpv/dYZLbHlJEQJBm4/rvJfLkAfWka89HLUlNJGmd+boHUCzw7WVUtMvbtKHrw3t2vu1VEqzuWh4nv85Q5EKJaSWvGCanliNO2USX4P1jS9Tem4CaMBH+p6gvvTn0qmKiRja5PZ0MbJxgmrr7U9Idiac0hPN2+WD1AYSfLV+dpOkUouRP+3tgeFlOatJTT0xb1dF8olb858GClilfoSxttqZzNIUaDxsC1hoRzslY9F0JoRwlEayRsvjc5AgII3nUJW3aJ8ZWdbP60mOXvcLtMoEY+cG8Qa8vPUOaXKg8S/sRT69XFMSGQrHdN0pJpwmbR0dwhbyicvZss3XShRBgsjAAmmzRU4UNzEUFd/J66hIswMCI1fDQGi/jNn4fW/UxFOk4TeTIO3wWOBdh3jP3MgTegCablR4rGPEc6MSN9ZoTNre3he2YSsF2vtH8hlFtugS08b2ztPNBx8VacJNKHq2woKKGhP7Od6hASttw98ha+2elFnVg06p7jc0U/2F7tsAAqBnTv6sTZHqhOZRvJpPZ19gNRNRw5YecUzmt7m033qzZaBcXNLHB7U+uZ3Hrjsirg1N5Jf1DxynJw7penf7nP9H5D5Wy4NOtEp+hssWd+tR6GFk+S+C9soQSewKOOBHNJQ8UqgHBSS5DkwMP25khrXkENglF8RKvef+RjDOP4w6bAKSt6ZJ6V/RWVVz5Nd5StgGwSo/9d3zDZeTHPWw6Pnn/fccqo4V/LqrquuuAZge1l9PVE6j3Zdzi735SJRsKevEcexFoDkmfss4Zie/C5v+5JfZdezBz9LH0dyBeL01GnTG3aVfSKCZlih+U1lS5cU/ckt1PMnLIf4OmRVOtF5F8BB5HtWNjwOgl9TxrFGg3I6qfxdBPJPpz5GragbaXOlLVNkstTpaJog61o4dxSyl/CcwHg4pMPpOzIkNCknbSRUz9f/+Gng6bf6TFiX9YYJX1j5vP7zfI6Stu408WBE/NVrdD3k5nz7DG03dVd4itGJk+fYXoenPG2CehIZJ0dKNScjB3ZMMFeV952JOPEQLD8M++ghv/w3InYpS0zhZC6n28saBtYsRtEtR7vK+06V/+BSf2YhWXuY44BVnFNzVMiyREAEfPQbRmxKK89EdaTj97X7ojgDGBKoyXVY41atKhrUqVGLBhS35IyjmWrOkcqAo98R5+sFqLTwqAUvGKT4sgpd7Ka6AKpIv65pd+CQPCnauiO7MMkS3F3kZ3v1plrArCo7S5OS+pBT9qzgkbMU99A0wFIJ0z3zEwadsGKFl2wPLRQbK6XQ3Mro8PH1Fr6fHVqn/jNppnJJnj/2voqUkRlb7QxPYDBXjDCtRyirg7xWvdS/SZ39b2aWXbuRYniFd7GxgwgjhgJswqbYjaxsFK/jgpAVEC1xsIgV9lrFvOphjVcpWk/J1RMdNSqyknstQAh2uC51xhi4AbNTm2RA9ThWolwWrz2XC49X7Ctx2EksFdn3DfCA6fBewtvL0i4wZsk+bEdhesDJpNOzx5arcXDXXyMcAKZ35s5C+a0muZ500+hw6zM0gA9IXsNwXv0e6LmIFEYShYZD4tG2GP0P0pdrnw9APz2tcD2TVvNv84Em/hLZm1JXsFQ4isRnCJeHndi3amV3dow1Me5qDkmkLv1ANKbsnn36F+IN8DTt98x9m6ngm6wU8oGbbhactGx93pAz2/6WiPuVDjCUfnssB5NR5GZfzxpDOH1GUqSU3KglcWXVGXwVKK/aL9m+XdHTs6gQtT0lS9C+qpXioaNOHJX77sQnbU4pkIoIWq7OoqYGVjWZLKnIRN0RNN/NZKTDLtPsHb8VBzJ8uXvX17qu90+GPdBUsU0txWRepx7+nLlA0gqLXq97FJU2hwSdvFU9gBqSYMvwSzdeZ6XS2M1hTf5nEoC0ihZBkbiLNvUVvraIKkm/Dk/kVheE57RxMCaN2fO0Lyl2FXcNhGcZC10sriORxugZt63UutRDCLaekah0CENSTFWi+HKFpgE16jNWtI+TWNtxkIJUOhEFgXi1bSRaHTYqw6sbFT0KCjfnnvE+XpCd36TAXdOX2vKLiV/4VQch8pIxH2iRIkhQ0vu2OXvH0otc086p+C1e2QO+69FU4urSu+LcXDmrsGmWQ9wS5H0bf3+189xTBqOYTkxQImsb4frwDwjzx6QELZScuZ7b7C1ceqMUJDanvaQnJasgz11AVDbrmtAs8XttPmWncApjHIxWBa9ymtU+u1matPQzri461sPEfF/UgZs9BshW5og9H7hnumuY4YRHVwuC7dXQBwgN4EL38cqiBaN+oCNKTS8nl7zbmSguFxP6MA6c9K6EfwSaOZeVq6WJ4dkUTU7IiMmBH5KCKH1l00EZ3BugdlBfhKXNsHGFRtfYp4Sz6sMq+gZ8Cp4rt9wq2KxtusYktSSPuXAKvENzH/ImoTqzqVSFk6yLtQQS+u5vIArY2pnZARcl1lJYD38cDbshbSx3rOWZREN87ph0rNIUgZkQDxH5+0T8fUw3GtTaTqikVfwr9OwazrwNKwangr2GDCr/pdLfT4OM88Ix+odOwNh0WK6pR/3S0GzQARKsw+213BWUmfwtHbqmKv1pyW5pDIem9eoMCvZ6l1wR3vJHBLcYUGCEYx+wpcGXxmPugNySc4uoBLGL7IYdCwL5OB8WYqQMjuYLdWXPpdSdcywJggSxTxgtd/JVZfef+MyNYxb8YBdqgrxzckxVCK+qpib7U1UGr3TfseHkChlRcRZ8bJ6aw61Eipm1fL0H0E7YSIyy8QW/Qv2owW81muGHMuzPOcwIy/DIgoQ4ynGH7+AJr9553QPg62OaTc6G2jdKoWvOMAgG1t/tDFB6DCpNaxtcEHzi/Lha5EK+u0yyH05t2j/o0r1t8SNrsKHTRA4pA55LC6kfCaW+/NjHIjRRXCh/s5xb1NAgxW5ie0n3kMdppazR4AB4kMWrqydlvV6WHQOF82Ly0DadnvMAw8BJRETly5gQdm3bEYuv1d7YkhPMMDOe1GCn7d34KQ95RKh2YbkPkB7hVEBPyo6xGProwSs7kkv2VrTtpzi6uhEyO1qzxsfuZ7tyKrVVPf3OhNFQ0zYOJS7AdpvDmOMjz3ZfpQ8dQpifDG8sr3qd+cE+4BL9zcuSf/lWy7pL4UlR3QoszxjLo1HbiaE1E3pq5V9v5O0UqOfeq5+GlTfWXBarsKO4D4DMNBnbse0iQuWQdiFMIQB1g7ZOj2unJVGE3I+tVLCHY/mKHcAUxXDYJA1oGDpDm0WjkhNM7HB7nvaMYYShK1r6hAV6Hhg4XsFA16gCcDI4thLA2xb/ThhP7V0i2OJj6kUQjiBUbqhYeoEORESDS8rMSFARdKhxfi5Fiy052ZIcQcmDQh9v4AasuU3wASjgCWNahem1RVB5prLqGRDZvhaOC46knnHqhOmXaZpNsaVjhoi0Jl5CDvo2IDT1kbaDo85+4Gn4BmtIywHBcfhU8tu27q2rl3/klhsRw8WlJReSAjRL0cUHbE7JO7Hscg/IrMBUm7vN8OFa+emoevcSsXHit6BXfX0YLq6wF5k7bts6DVeOrfYaT34/XSzvV47BXoRdcUAzZ2t1F7qYksR+MXLIrfugkh8+gpUS59u0VOfHdnbM5A5QuOA+hUP7f6gFh04kl7UQKxvBtVXY4TPyB0wWVDV1/kI+7UQb8PJ52ARACYSxvI3xpmnXK++7qxnCLkePAa3z6UWc93Ul31d90hnS1fWAcLvyBQXeJPpsJ9wz9roM1S88jo+K+GiGzs0mOfWvEoSKjMkLATbREV5Qd33NTK1Y8LmsSxaRIT6mPQlSwxW/zUX+ZHKSmc1kvMUjA2OndIdGi+HkKK69rL+MgpDgCh47Q+YVtgcZReWMzys+1LGYanX5YcjIM7B3LL/Q7tDUKE8pg554qvvUUX15yzLk5HcWDXL36l4GFnIOQ5GrqEy/s3BNX4Het4sVA5H0pFIbmJe6foBwBWhpz5M2sexc/lkNiFGHjQEU8grGFdh3CJvSIRhKPE92ES6suMmnqscyukVFTRRBtB+dtmje9x8x1y2WVylqcOVfnel8A80S82v5LNrtBJYmR2jNQ3DA6v8WUzFYYRReUiSNtQLT43ESdXdeHmweO16Wd/88C/Pb9l6SEeI3Fnf6ld+H3+kSQ0NjN7jWQPWNH2DirHfxplaOslAt2JALFn7TfBMtbyb6G+c8TqO7XT3tJ8ofypaeP7obuwYW/MZecU/b6x3INy24LHX8BkJkUpHerydwBQOrQnqKLqx9772m7b3RE6xaY8nmKe054HgMGPZsHrF5AovlvqA1ilMMxN5khBjDjw4PSPIf9oiDmKhcB8nL2WVR4k1Fg4CXV+12LKF9QHRiHSBC0QRL4SsOC65Gq9cj9RjyIyGIOqhp5hPNQjMNpFTOL9788qQAykSKCF+OxvfXCTdt/45bHBjmJD47j5dodE64LFTNZD+5nlPJJDaoWauCn8XA9g4DJg7Bg5CarGCfHty/r+hVJtSMs/illuiZubfcKEyLIP7Ts0QzNG0bZSQeNPsujYz7F8DzBHefE2FaVxTu7dVBfd+49B3BvWonV+zGU8rHNOzkKi4rV4I9lwmZggXA/TmWRA9WmPgxcFIxTTVSe0xfuwx9Fe/ny01mbymfTImuMBVfZCDVb9gNhA53ZiYhzvlRq2JT0Rn7Wvg9wsTetrJKnCfPvwqd3uU10aCubaoJOAJOmoTjp43ox62szBBN31tq9472Ze0218FqFdQVtdx7RH51R/oiq1qoxm1lddYo8a6TVAKJ0qpDtoTe5RaP/2ZMyUh/7zEWuVMgIWLyvggmImgfgBhJBCficm3J/ggTkE36hyzEkrlMtyjZWA6cmor1GecvgLYTEjj1Bk1qO2kxyqOUptHZlZU+EYpZSt9FSXkaExfFNAc0MkBLcox46/CFBqCL0paFvFea1EAubW+5f5E01LXZW2OTeHalLfnEFroIFzb3bQWrtmRVfDEHTLJUWHgmp+9IIUntsIxWbA4KuVheCafYHsFD2C9qrdFVRctZs7lrKkafgwwv9rvxcXa1ILYuSY2A32ZgkK13LlLpvUc2yEJHHPbwPB9q7y+IoH9nPToZavptj5dzVHcJVmAJ8Kwktaqi4lQ8Nhh4iQLfJAraS5S6Jnz+g8wd9cAfAeXLNKJr88XgqxH0OLuoTtcgHmNjTcF2YU4wacHpCsRStswgRq7IMAAdmFAUvC5T55Ega7HR2vdYZzuisY59sw8uDwTWj++OtG1uODhEdVYYqOirWAUebtXHzFd9xNv/1aQxes/XL5VTVG9Azg79HGWewZBjCO9c2vjB703eJp1dMGJKb4H1h6LSEsL91RXQ2O5ikibAEqFxoj9iOjrKMkYgOXX/C2R4QEeX4ISbNCDa6E4RLq968JQoAvdyBdlJ/U+RgGW97rtrJENwpRL7ZwZ6/fPuY7HOkJ0204MlFGBG7QgDTMtzFMQ1nKBMXHY+t2jLCWuAoJyAdAQA6lvVfmAmkM3Qc7BEoPPtG4CPHCt3nMhnKNJCi3OJsJjujzXm9bukoBV7Nj9SGn6avpkHSNFAel5Ttio17A2YuVRMAWvSKRWnJxwyedswR/AO6fqsg9QeZgh7YzQm8saxYbW5/j+tLMU1sMjhCloBleoppj+vggJdgXPYub4/4GiNNxxheswP7mtJRvYv1FqVP/nBhr8h0KSUezCtPtk+ZL1yziTDIh9/xro1Sc44f2wC4aeXvNInILxToMi++a04yX6nF1SiYnMIWIZlTzQxmaT1jl60shE6qArgL+JcUcr33B/4zuBTCiKIHZc7lyrsIeDUg0Xtrq0E9nFTTPp5Tzta7AWwo/pPaxEPR+CNyM/e7O9bys2qjSDS0z8HW8q/EdEpKjgtuoyseS3ere7HP5KgldeGCV+MePKqUiiwLe0HtYNtz0X4iPUiYbn7EcRx29+hZ91SzrS77nFOtmIiTdVZ7p+3b49f6OO2+72b6k9tnh5AZ+Chm7qtx0kzJgjjk3BwqhJpMsG8CmAvOCxtUwrMep6MiUNOI5S9XRTTVu2p+UTMMC273e47meC+AS4ow3sHvbyq3biNx9bL7N4RavYSM1sQMpC1SsFudy6NOI1p4jiF6aVxh2BxDkfmXhXwFdcFgmmoDIHWXN6+7p7a6p9MjwjFk+DejyLqYzsVMAIF02hGS8jsjBlN6b3H0/XpNQVF7IG9ErDs/c2G7pggXzqhmTbKHOgwazrq90fLLFY4HIVwn6n/32Z6jdqAvTBxml0Z/CWQ23h4y9OqfWJdI4wgHdUOT0xgRLOqabyaT0xKj/OhImK0NlTwcYh4+al5TMxCCtcVWoqDtWjjVj8fmc24xEDThPIBFXN3jrNL4gjRthRLFhMsiLMWUYxdlmjisBvmZQJjs3/zyWNH6WNf7Y3PJiKZqKzHNOLyuX1J0z5TfJlWF27/3OCHdSoGBB4H9VVkaG/QVBxjiWi7Fg6phZoQnR20x378jYM7GuQZi27bSZlnyxisTTGWG4k/zRIxFbDqDVMvA6s8e/qTpEpkKNgvuc9xUHMnNczgMq0L0D9CWzLfy9kWxEovxPBEjIMDv5rfJsc1s+i/PgxYt8ICjqgyjsQLAw5EhbTmULi4JUwCW+mOJvHDAIEZsOZ17Z89d78YawZWmXmFE7uLZ0quny0m7SHPemQk7BiAWbaerp4JlK6p+weD7qwphFWPgzMQU1Di2LtuEhYhhHRjZiZS9XHxsy7T6MdCCobw4khyAT/Vb6hA6DCaMbfFxHEjwBdbqxT2QmJgfb3enFWLROS3+GIsLVoifHzxKlew2VKX5ddpCT3F7xTQ2Nd0KYleKRXTQy8Qcno45OyW9mby+L3yN9ac2Ry1TfpJagb1iXxNYBfhLhWpQCbKDrarGpnFdh3PE2J1q7TLpieJPKVqljB0LWhBPo8DdLMq9JK9Xp2FX1FYEr/9Rd5PxcczMMITRV3ztCFsp3y+AqnuXfbViOjYb5TRwiH8yifbvppWH+zhUbaNmidcpRaYL+XXjj0z2UjN+SUgkciPQ3Dx3b3cTDUGvrKYTr/9dMdoR6RQfQN3Dqk61k/o+PVTeEl5VsCNG806FhKht6p8cyj2n2eRo807U9+fZ07cPCb725KNUGldVDl7NdY3WYPVkKvqcOC6TMYkn5c9xiHkluQ6H44gc0/IFqS0VvewXOPkNJJQLOWN28uzequmMdyw/Jl71ojbx/bPWXjYxpPLdxP1E2zjHqVAbkvgJ7LxOpqFL93p6SDnXyYskKBHjNiZMYjzGtEq0PClzolfFqcUmJ2g9jbvmGq/les6lBe75MTibwLGDrHtw2kyYniS7CCDWaKnPaVKyzjsLiWE9FDOEsBrUYTRLI0W182TCBhtOoa3B5gwBCa6L/n3BdOCbPThr2T6P+VG9maSI94uTuV4hMM+wv4cBp5FB10SFRr+Nbb6tkiH7jicxOLzQ10oF04V/RuXl7cR+gmrMR2hhCtyZw/NMTfhC1ZEONwmkLNLDQClwj1dY1rpoJB4jqd9ZLGdU6R01ltxjrSsYyOH74yzkxch6xFnYRwGgKeLP17YsR1M/7US6zfee5psMJmmF0d3lRpOGLUgv2EE+mfEdK7RnkjBMev7XhP3keyLlj+zF8ubinuayYmsAbTv3ZmJ1HfwZFIkQfunCGJYRYRpaqxAPwmfsgqlelWk7+9TEVREUAvMMicbiHR8Xl1pBEJ9tTKzBbPhj41gvoHy3sy09U4RqEdZvGx8rbtM1BDPV+VJqsxOdRJeqYJVyTf14rOp7FUe7HyG0MlmUSwPZiqdBy9w3gqjGdipjUbDAUfOCFd2hd33xGYaWkibkByTxGl+OnEfuf5jM05n4cc48ttEEjVlDLh6QjiCEhw/RB9rJkrvcDcOEMtO6TOEF59rD1jgDDxttsQAg/Mj5mVu/oAm4/xixU8Wd7EzMxL30Yorhs5ZOgjIKDGe924q7ri2hjbE6h0I+kbIx6JAvUxcRVIT4pL3PLJF/u5s7CDcBWMXokHRIA6gDvF5AYeEir/B6Bsen/UwLnuytNFiKj8zYTuU4prqZrOLMtMv2whxAamlVSi4wDoJpSdjQ/Ys9shVL1T1mNcxa6Gs66rBhBNLMu/EwnF0sNl4ER8Wx99IqwlMPFs34NgXZyqR4lb/RnlXxfLRY5lep9RPnpdf1HEeRAXx+X7quJFjkIyljdYVEIknTQzuogj6JYAw9TabuF9++JL+A20gGmkJ28DviSPNUhS/s7sDrGykgV8PPx3UhmTmCl/HK1wWSfDHMWEihbECgm3zx+to1W3jzca4houHgTLAwRTaFdH76HaN4hYaRUEIHdA0vdpB8mKadYsokqaDJex9Uj3to+TPdUA0Z8qS6+bmw+hKhYW72A45s4EcHuzNXmZIJ0I6Uw3baSi1dDVKsH4IFaOTPybccV3mjUhwBZr3twwiiXKnikUnf45H/BAuTruSLwc14Gb8WXBj6IxH/MCT0DD56Eazmqp5PhJ+WyLlOryIrGnyrIm1EUsSEwsyQaQXu51U09TkaYo764bja488uqgexlhQgru1WXOqXBDSg0oBtbxQ2VAfGLqyvfIkQ+tWB5ojGMwhT/pAr4kVB6HL/b6Pr831LHfWwAqAWkfnkBHGqA2PvLhT88QHmEV70cOLHM/zgv/gSKdQnRiRxPelePov6dZwkd9Ptz756fVea+M6LmJlImmEeLzlZZcTaC0n4/TrhNzCOSkqX1uBA88klb424ly/Pe3vW07ovuE3MIIuP/u9ErpALD7j5Mo1YrlVpGNOostTJoFP68ZC/E4Q3Ep78QtHw2LE8tEi5qSVjGrAVk2zs8mT32KP7/QN1zdDuvc2h7IsLdqTLfPhGuwNdPxpFH6Q/XYNGweUcvmVcrqvOrrFMYlW8lh+h5YQjCC84boirLu7RwfiPKyAPP1q0OxIBadxDs6NpbelfYukw1grpR6Vf/HAxA37AzrLv7yw9Edot5tNIPGmguR+VBkNqenm6/kx74OR7ICz8a+sabrBs6NE07BFZ2CGwprZ9F9QpgIZmd5qW8RR5teocGmfDAHfhFZHU8RlDT9JJf2HK36lE/UdxOS2ryG3EGVXXH4nO9Kwo4+I3f+d7pzCMWiKxH4LbiHf/hSLn7Vvgnk3iochzxZU0bnWl98XdCKoGbHOPAvLB17dnaTo4YO7QycKhmwmT0166ENgMjdMxwC8z6xvwiFVd9h7CXlPNxmCfe5v6GWulC/iOMjhtlNB/Psp+eWct+xYSK590gF2JTru9H1doINYA+sWeNOrPiUidK8raJtF2R1Lfh82DrlmUOpxG78Gj6836Jof8dkSWPXfx7BTtThHzaw6l9GvBfTtvfZC0t5+T5Dy3yS/Iq34YetDEhSfQ8rp9NDRo95FEMdOfprmKmsiT1hrSec4gvUD/FcTUWp1O+lGSVwVR4xkR9orYgalYFqHmmGlVFkZxLGp5heaIznBZknJGmPa6QdclHUha4MkmkOKJOjoAW2RgFzfcpuZnyhTfLPsbZMyUsBs7c3RqYj/qGvdg1qnVyXJp/gqZoMaKC6rUBZeziq3+QTyR3g8F1zGMh6/SWs06pvqz8yy/5vbFn99c0yag0yXju3JiYuSHCjGFl3/Q9uBDWh4XG63HXhDf9ZopGWQjT+agUmiRyPSqvS0tkwjvi5x/BIw91hk/mEXel17RVOoQOm7OIjv63XHanG55wY63irN3WGx1DiR6/b22F1ksurwIu9GYJ5N4bSHUzn1QpG8K7NKkPZPAC3qZB0SD44eW1VzMVuUnAWemXf3K93bifx2/5z8ptGIg378QXuML8hIphYomkuEhvaZvcaxEzUoBA8vxHDe0KqW5wjDhOItStfArsx8PWqbP+76XOJMcJ8tDX8a5IlgDoJhEDRQuKOi20Ghnjx/fLGJ7V49vKnmzheHkW3qzuFIbLsU1gmClQKUCx+jHQ2h4/nDtP+tYPDQjGNgtAsiICW9FSivHtU076I0FBkEqF2smCiYBrAj3Tof4gd8JvPmBxHZieWWNxew1OazQdAKu7EJC4fmHLWdr1PEMaCWi4Bh8vca3+kp0QleCXlc9kP0gt6G6NqN+7vV3y+dK/AFPEf9R8xbMLYivBeUuqGzaTlFeOY9ynOEN0L8dV8K9InLoU1+09AzqH7N+yFuTffNE0uJAccxBTToy/QzvkKFPS+F/Czk3AmyCYW1PVtF85M0OR6Xc8y2DUrtXNmExW3utvk/Uej5aok9nL0ULuiJg84fJzRCcZJMSIq3yk163OAftUEoKoE/Wg6XKPFPlVF8o5p8taff3rzfYzrv0+gMv1yGjB4CbpTKS7TF7Yo4ngKoafwemaOiP8Gx1FCT7Qsxv9n1BKE99oy9uI8Bk7tt3aonmzA9d1D4zOxpbVe12PwqeDybZvd6tkTpycfoKx9ZSK7i6wZaQpPYqZ3Lut1OfNhMEx2AAak+vezx1W0eeLbm1lx8dibZqPBgqj6Z2GHRooo2VaZ7vA5budOjNZY+1JexPp4n2d11RzrbXtcjd40JTetxo9sFDyNLFujjdjCT8ikuGbbtBsYKirVFIuqDhUWKBGzammJkT5l4Ell021mAXU3wneY7je0bTywKD/cofCC1u20C73sud92zfk/bx5xu+qyzYL4z8zGQUckfxSWqaL3qV6/D2JyTfNKNHZhWx2+q2opzxtMH93eD4xSKhiDzLmoTpcdXNA4SZ5eeH92YkimlYnMHi0dQPlzRmcJFon9FnG08HLa+1m6H1mbkR0TgLiJPP7c+tI7vvhSuSJH4y4dp3FaTy/bsy5oJKICHmVQLgD09JqtyIfwNC/dcJqqR5H8hKcUXyauoMpLvp3379cs/U42aAEq1a8aEEMjYZoqj58c/pW4/Xw1SJHImmjJoTduQ3Eq7nQnWXX31tsuvK/ivTqYYxLqgBsV4noebTofsmmKdavswmx3wph9m+N4y6LJRuNnsfW1KPagl+pkUa0w4YFPDCdLalHLLpDXApttKhaQzr3O3aZGEzuJaG1yS1XmreMrLhdIXY5P6xkh+qkuSbrqEURGiQddVn3Ltr2xacvkIYiN4JCXO5YZ+4zPvwQOyzUbM2fjw5gT/VbigrSA5E92W/+6FRAb6Jr7p4mJqBqNiqY8yJFnf4BrU0qE2oXsNLjKoRGPtPePo3hNzwIFsnxjNmIq4EN+iQbGisUUCIjWn/0eMuovSsxE8LJMbpgiz8TQP0ncE26ZV3i7WxGdsAxvv2iLXjDsJbdtjmpb1XB8pWFbLiuZNfFMg3EVR1LoVZ3no0723qPNrFBeasvNaGyWKBh6ewJWtdDUmaOtaNTg6WDg7ezzmWccZSW9eAsxU98XIoge/R46nbdgoAvba6c7H06uQmSBd/69zT6Pl4jb6yyXCw995C0u0iK0F9rYTqfj4RnGO9EZPKxr7jY9HiS5O5SJJlu1FLX8ijP0BXVTnpVGK7pU4Fu+ng4HvXs8tMMV09oFNMoy2chtlKDAmGZcJ3q4hXyNxfvybqVnUEsqolNqMQRXalP0OKk/220sV/Z/1JIbGrCZsFnkG3oVtRgJUnCt2y/Mp1Km23rBum/KnjgWLQsNq42zWCV6mpKySebL9gKEdRrY2jzxO3gbIIHytnWArdTFvvMxtDUq65ER+qai9v6MiCKHXq0cZBZK/eCIwghdHVvTMClzn0uaeajKoixTBW9ofRqFwBIqJkWw5JAW61rXHnPJUDfYEazieNcuwoP6W/vWgIC31gBSY4LSPkklXwCuOa+gHL+VwlreiG7DGWxjqZftBK8iRLdgWBausldJ5wHX17xGgSRogWoYqastWxG/kkG+eOZqSBMVDCHBmhM4Owvj4lljAr4SsKqb2y9tHFettSMEjF72skE4VHsCVAum8WSpy9w7p6Q57vNYemnkJPPTihDKIgYYxL8Pbos7wNnLOZoRdZPZCnR2syDaAwh53ZhGyExvOdn5cs5tu8W9AaQaxU00WUIkEvq+CpxWK3cDMdtFgrC6pdW9FSGH7P3LTXz4jt2bCrxLcxgp/FSy0bOZ1tZl2hCpQrXIn3Fb1TdU3GCBRgDhRX/uQP5NZBOx3sPb1CBkLSG4nlYos6XstZBbHAK8muD7oPtHLOGNZfI6N+PNr6Nusj7NwEER1/0O1L2R8lLPV84lv/75IegvW7ZikJwPBDX7+XyMroavlEGM4ji0N8CRyCIQNLiuwvjXZpz9LoON/mZ4444m9qM8tUz+wnvmUOjKItlOKbNJjcUv+2WmWidHQ6NQ+8Gj04RkWNRgE911GLUv3If9q3JMZj9gUEIWaWra6jrPdiCvKRWIWKbBh6rDgN2PP27TPAbG6fTNecHSzk/a5ebP+IhBr0jkYoe3ltlrv2q1bqndghTicyT/YrzGKZbhsS2ps5D8Z1ttRbh0sB8S7pwsq6p/G3b2BjPK7F7OFEbRhNF3xKuuS0wWzff7DSj7SxWCn0ciwCRQsO59vp8n5MgYhtdh9s771Ukl+N/PJP5dhfNHNW9StH+Us3Kb3vqOlsECApw/P8OgSfWoYI1XJc9TxPRursZQKEF98vAiCAxH9MaX9Pt+tdSkNN59LnLUd3no32yYLlHhJG1LG2fqRWhdpfpaqmZ3IKJCPyjm8sVnJ98dSM2dABD965KytETZa1/eyijfrIiA71FyFuHo69I1fu93ph+6OCtpL/18SnFLNq+g81MbgyYrl1c83EcV6vsyO/2AoKF8r88hYH9v6kKD7ko1cjWi/wgdYXSRC5t8D7/MWvgHW+/311Nai/T8dTtXxLujluwWGPXL2KyKZzcLmp4IlpjGtP8smD1gfYHgz+5oD2Lr5kbLGumSrSb5S7ERHKVpz2yDw5gGA1tjCN5F46nWmyjXCSNoI7GzovnEMF8UYceJg5/AuOyA2V6saQtbpaerJLuoZP0fb243G72EPSrdcd3JUfzATyQ6+dFkbmoixsxXadmHCNzzpE3SOr3IBBH8rJNQnJjbLqfFj7+BP69JNEzcKUUIQm1Gdy3PztMPwvIYfms0ldvUsUMGCLuC1K3ynKvPnB6XnTQob5nldA06/q3yoFnufi8Y2wP5twlcfy/+ID+on9YkOC/2iy1axu2t0xSCOEySLjeX1zo7+pLR0qk2g6RVECsuJ+mspJuo4i6y/zZ6iNMi4MfMxQJBzTv9gQeb6xNX3DWroGDYP/itUQc0FG/u1IiZsQmbeVRbhYx38fMVrxdemwjLgyEtlYq3B1oA3j8o/9GEEvhQLEQY2Avg43Lj1+yAjIGPiaT2Ojtz0RRHfAuoeJGXPmIF73Doc7Vw/XVfSmgBs+fKw8vl5GaOIVOHcYkWQIckZkkbng07bsmOyqG5A3PLdAiK9NwNJS6bt/y5r2QF9ocTBAwf2/O0oqLg2Dq4BfYsOJIoT7Nma+vSzdc7BqYfX5IfbUdNRqaIHjWqObhXKyeJkDVXiWUze1+SQCJurfq1D0LwpDD5v2sIbg/WvgE4boM75AvPVFMMqr4QB6kN0r3Vkv/pZ9HcIAhFjs06NdoIwEieqcUvo9fXV0rlCQSXwj6I3upa6i+bFnOthZze7tYU3q7qg4ADi12cibnu60phYpKLObOqWzRrMuvXFAChyqi5/Y90SeOcA+ksS7zDze4FqEEpsmQDzcv53ogFZv4IygjiJr01wj7h4+qkVusEvdtbzZcXIZRrLoU4yVw9KDriVKYtRXPuOTt9wEGJ4FXIlx+AzIetT2v6lGy8xp3TRr2VwMw2JjS0JxgY+oslA8Y4KzWCjOJFnztwuZxN4fCmTOTq2aZ1uWoqFtVuvGWt6jUgx5dMqzKli6rG5HlHpm8JlHWdQp0cAbJOxcRlUhGHigKkHF8XR0nypwJKprMOTDM5xM/LL82cpxE2Zkm+HELgcs52mk3JCRw8q+FXynzWFnUUR5Xw0WnDRTXLm7KSFSbEmst9ulI96/IMN8x5TlG+8GndHxYHQDof22ZblTsFuDrYdjnlE7Jb0J8W6PfbGjXIVOr/i/EPxH2wFhH+j2yM2IEE7E8nNPCvHm+8jhWXWiMCvu7CrPRXyyadyGbImN45C7Jkd3jS5xZ9qxr8PR/cFsLLPtOxvn5aHTwh+lXZiBRpsbDVaz6P88xVSVCLs4EtNBqE07Ft72M4IKS7VTwnrv9mArjFPoCq7C4M2fASZ88UiIp5BDq4RZtcnlihtLg2WvPbGVgU5hnFuCnUqvQ6doGC48mHmIETxo+PAQH06wDL4bzXWh+4O0bafgrOyvsmb6IZOWDh/5HpGe5McX6N+vDeYre1T8FAS4CayAzA/qO5fAS85ccxWIt16wwbfa1FDn3hJ7hmgRL9dEhuCjvTC9TZDrZhVL70EU6nssJNeizPAfuIp8IiHRE/hgHzLlrmkaYldwbAz9tIrJ4dXuXqT4E24gCg32qBz06soK8dI/uWGAFGWZTIgVv24GT4orMTC2g4ErYMJm4DzfIv3haA+Om9i76GWwlgUvXg2Z13NMOUrWcu9VgakNV20H1AZL5BXOKq5dUpCQByVZcRWWAVqAeRAeqyrmMHp9snjaubrlf1Yw/tWIkt/lmiKWBUd0RZEXZmyraRIC5FlVfxUpMNf2aI6l7yIroBzz4BIICpKbCYSiCpyBlHymDJtvK7GKOKxCGeZcLsImMrlZYaXMbNYk6bd+vM9S23uIY1QVCD1bZPXNsVgX0IBdAl6XKHL3qIGpowcI9W+ZkuuQHZMN6dSeZdwefjtpE4AoHWtkpko0szwOODoRbz12tGSG8d3NYnD4uDu42Arr2SBIxcbKrR0EndUEsXSFUsUNz0NKjn3FWpaJVzlMNLEoFZ/DuSEQ6UxuG6rd8OkKOw2x4KTOqsugI++4kox5gwRZpQavW1LO4/hc9RK/7YKLYL7eeRqvSGwlcwFcwkjB7MEJXWikvsajSesKHT/f9smplS8y6NYgpg/6/EV/fsop0UM6w01Y2YRm5xFPXt3m6VO1AQX/3qfS3WfjghYldvGTEgk8939qmRTBQJiW5YUPeGkUjRXTStydit2oG0VIdrZ9c139z9LeY6+fY3QGNxPXyK6T321Uk6c+2WjBkExgaiHRimaADDQO4F4wHQNLEXSw/eB+tfIS4ADIua14YpkKed1d0llMIHZY7j52mkYyMN9oAAKvTnNWpmITQCGzgX+OZYIqXH+NJJQWHsYGtmPSqDKrnHdsQYI8XWc9TMUN2K92L2eiHMITdwA45rmGp6QGXCbFBPA61JNDXkjuM3UoyetnuyilQ3i07yCau+QF2Nu7maOTf0s3PYXzZC2Ftk95OwP1S3F0hAWl20/M/SFZud6mS6M6Gz7sUGOJBSD7BxCwCIiZPStK9U/t+mthRrFo7fXrYVOgdMQ34zMIxJzz2SMhn1SnV/MER4p5X0TJfMQLsnOkLV0qTBm295fdJPFcXpJcUlNhBQmkvHA4IxOm8rdMA2dVewgjpQjW772MTGUYW9jWZKr75u8GXBiWQhYgSVXO54JSIuaMw+HNU9g537hVQ81K3G3mAEdK1Sqw4/16h/uX3t90qH1OQmi5pAKP25ikM6HaZtnoLH+bzq0Lev8MUFDOdJh7BwmWfjf2IoF7Z6DhvZ5Za0c8Hf3tMmOKbHftYufhyEJLbUvIaOe5nZjD37U/Kk4zUX1CNP1Qw5hEKVWbTHAPBldJKg1S/6Rb4IHwhsh7SLpUM1WyR5rbBNW29bwNHfMiK+0XkhhxUsYJzF3zHIE9zj9+GMAjRtjVeo5ouMr3ZaJGgGkDYXbHttLuAV11+/hv9k8JfE7TzJWizERo6WX8a3byEfvK6jBJInJw3nXToOMR0J9tel+S6Oxj6R/O+jaxYwPAHfNIjYv4DrSeulqIR8r1uMRj8jzt/gaOqPQr6ZC7RAUbTrblVvZH7AKQmaH4G9Ledw4RyLdfHtS0lDpYpd/JSLU2O/J3ddJ/+0qzgwcF8/TxVaUWS/wZNf5irRsNmHe1H/O6HJ/CuvdxyMsCqfnpR6nbXpPd7pmIIcCk6Rs0C5qaKpx0aphkMsJ/JM2jYF2u6Kk8zBdZS7QU4sKpIPaUPz2/XCIHxHztA7QfSom5KeZKpd+VYxxifjFP/iBO3hIk9/UUAuudPBTeXyFOM0MC6eC2e1sieYTCSgwuSZQ6CiKULmAzmYaIKtkeMcGsShQ+sn11e8RFm2cNgcYK9UyU3LmHmjl9lN7ijafjKpeosEu5MAU8AHW2eDK/v9PLLgJeZIAY8WgObcwHDXtuCJ/Y2It/kMGBVCFleUmrLN0iAxk6ZQkFIGW5etVR4GpUR2fqiBqnZHt9k1aF0XEszs4FKe57BJ0cxdOaRWlEXnEPM1BoecdLZ+B7LFtRXtSGyVnprJFIDXWefR5gFJBPOhFHmK9PCukUBO1vij8WujVZsO4mhqDForiYHeQUGCloPRZtRgGQuRupcEJaZRcHq53jM/qZYxZzQ/bwMznIHtMZKFrDI/IO0SVlsCP93PJLkpZqK2CSspPmuizL5hoJAz/QUkdvQcO8JIeUJ2lcFXJv1orbjRZOI9FQfU/+RiOjVNY0daJa0mNX5637m40pxO1QErzfKIG9pzy1d/WQXbTi4kLQXoZpSvOfOukZXJaDen5cLMwAgX271WysUQS56vaWYsrA87wja7D2ckB+WWxa0/UtwDfzS6l8vk23Di2DD1ORUHZSUB1P821ZkeTtM3cxmfKH8eU2gRraHXMrd9xHTORZgswiA/HrtJzkq5BnqZC7YVrQLWx3mIR4yZtt+17k+cEb/U41K8by58EPDeKAsf2xf7u6YmMUMYOC36OYyCAtM5a8+mXK/6/8pBhTxD2YWS8mzLJi0UAkVgEAGEZKWt0ibdI85qOGuhgY8n+q+RnvCsNqWOTMJeOOnw5tpD5SDjBF6ml8EX9h5twah1hSTL0MJkvWXDSQpd6DiTLYTyGang3hMwdDFREOWL08cgTyJf7NLVBjdM5hAtIJp69MNcof0yCKqIiK7YYNHK7EGIXafdCdS1WbBF3qYVMbU3roNvld2aJkwZQQfOVhMVz9I8jPEALSdaec53Lm9iwAIrAFMwKnvPIo4czscuYi6Zl6MDHU8/+rIwh2nW2qn97B/WN4xlMBQW6E6W7w2PhIXfxfi62bIbnFuOxNUXrUwpbZefpsUdfDSQOzzsZYXYFSYBIbhTG3YhHa1w+PXn9GoRtHR752WtQV5Ig+qPMdgEgPKA2Cr6UMsmG6pTNsepcalg9n3m/gtNiacaw/E0OWKBNfwwFy3rP7wE4joErxoGydpyUEABdIgbPOueHVJB46wOIUAtZeEFx3DLkcBrGeXS7yGMQ/h4AMcbBdZ31lTqDBM/Vry/UHEyyY1arnAyyl5vL1y0ODzXGLLhlnL4HPmjE9/NA5ooYW+Jru59fe1rOszt6vF+fJEGWIKihQIT6unUzJ+LfR15QXRJkUCac0R4WsJEFxb/ZKpqv/vNKTvekJoShj8s/tkD8t3lSqX6/ISBqAXL394jlf2AAPYKbbYw9CF+wF1Y2G556wvBMd7WHpNYVQqiT31f0hZn3HfjU+pEzLBUqL5E8xtu2renZQ73aZQRMKO6Ww+SY+Ni2KKOtuVOLJonFlFQwr2F93FydZR+NDrGB4IB+dgbzdGSpP8w3PiUSy8fAagXgXvNhzjFBquNYr6FHgMFNwSvRXOJAHPuZjqY05n0NGT5l0hDDNpE7MSUCEXYftKAWdbq0hWseJ96qyhwaAgAK4ptrfd46gcvEs+A8Z1UZzBO4v444YqcQjDmnhOdZSuGqq1ShSq8ypaD+BHQbU9QDy84l9bHEI7h3faCN0RUOKIQrOhtdQjb84PThJHQKQz3AMzIbSZOHLA3fIBhaoDyhu+7XNhLZAsgbwjJ/KYa3zbXUvIZldcL8r2ekOe5jygfMP/kuPM7vUjdgolXO++MdBoUntVXjcRtoE7iykU2GQ564iCd60KiCKGk0ZZmv1geBZuWc3juZk923UMaHhPucZaJz/hbzhzK9HSMMUFWp93S5PgZPWW956ZFrMWe7TgefqbpIAR3iSYajy9OIQE7kW/fEfrgxPzA7zkpUr6l66BBixU10H7BXO3FE+dSzO4T2VIlLaiyl0YROzmk92i5OgQtzpUPNfPybzGIywKAWzoZcsoN0ZMxcZqAagMlzWcp2Z8E9WzG+ZfbhK02w3S5wS1cN7KusDw/ehmAlMNc4h3r2aX2PpmWpXtbh7mv+9+NcravmbFHirnlV/ry8WPTuNseQBM9xglvBu4G/0pPBr9b26JIvYg4AGZ1BR13pHWAy2c3NjJ+DgnadOJ/N2E3sOCcF/rHngSLSGAUiK1QgnCZBelu5MiCgcikwP6WFcxIalAvx+emml4qjBY9Yg/QF2az7c+pvh8y/PkVuf8xO4bgCJoGQcvJesZ0bo/NHJu7405Zxf9i50u1KCv6djHOYZ9YOZ1W7cPe2MsNZ3EoY0BeZPHJomA4kWHILel6BcUo2DjPhNFH91jY/izNdLTqQANVBKoHB1dO8QhfMOT/85ydQcZaqvKEhCKkLBcZO6n8kiLfPp5GYi0Uff034sglgRg4UzmHEW4xPgTPD1oyGbBC5kh/J73ulGG2aTWnK2DFNr9bsnXXY4yjHOc66NS1K7+0+u7+A0/ezNYu05uRVSXf3+mdmM5mJfVlqfCNAx460+rJB87I6XPxLxjxPUpQ6ZLF8uBRC0xO1AiYS64QStswjFt+rj0atJwWbBzoni26seQnkdCB0UJuRj9OBeEzAeteW6SEPTxrmFECpxktC9yT9vj1gu5s7huI/q4EM3TXoUierDLzVNVYvyYfSP5y6UYhL3dhD+LTHxfn4orp74chjlLYQJq4U8iUf/s5MlPwmGcWG9odA3DETn5npmhZHdZ2iH6H08hcU3Mntc0oweU57/vopV2EnxRr+w/r2GZ0gYf65QQ7ljETaU7rxs2x17zVUSlOrpStxbe60rry5x9UCGeqhbVWpN0tnoxKjWfKxyXYl6OlCSpZXxeHNek6qm+07DJ1cxLRZgv0otepUJ/VR+GxiaoD5AkmTgGrLkdSnioFLNxCQLnCaJRukajG2RcWSSS+jh6SGVIou2n27X0MQlTDVEWl/qMMPQbgXbSfP3/Op+CKMlhX1R2o0OYXSu12pvRy8fwNop9iC1hTV8bnOd3AO50+j7WjTGWfsr5/WUNMeyYErKht2XAzgljOXauINfu4XM9afCKgpXC8SEVZwa5qOdaZYXGTH/orFUqBCOHMEHVojIMUemRHVagwm7YunH9M+btMxORbzNDtZkcieKvHdql1JzYc/Q+u0T7pRuajh1CTTWt8EAhO5ZHNtiVpJFNN214ha9bjtJFwcgO4mEXu555TetIkzSVnUj5xRq6lR8tq7Z/KUKFeDn6m5vHQNjCpjOpzW0DpD9XAGc+f6MQWM2pKiN0O5JEf8GbTILY7oc+IRf9OyIo/rU7hTiYmrguRWmwcWhoHZEZZrxgfsSCyZliQDPJfO+Cz16ZIL17f86L+FNczOvh7R2+bdxhUG+FqT8jK3lVM5qV7/F9AApf36LLJ95T7+pMf+G9LO0Ke/J/Yj8/GUWrHMID+in0Q6mH4D8td/6dUS2/Q7Qgmc/j6Qct8/w+RXRAVPnzFmtz9m4pta3BPIdrQa/j1gO4TDOEZ/fAmpnthvXa8SNfKovbR0xziQ6s2whA5lOk8hsT6v47GDVL65gIDHci+ae4EdEu0JE1h9p+FSDlAkyOU5vzZ9TaIyM++7ZMlLmzVDIlB0KZ3IPvSYj/SES9DYL2MdE0/pa9XzE5F9DzwPWbXWww2GJQdnzg0Fcucv5E36i16mgDBWa5SWfysEnoDU/+NKF7iYOrQnO/RRwRl5/zhe5qb1a0KGzrEsga6L4zldfRH2GmNJeWcYtR/a/gOm3vQpZtP2LA8zv934pNf93qxeBnFSpWCBlGG00KBqGqn09xXGLUq6bZ3Hd49Wg1MPwPOU06HSoljsy0vHytFdhUGnQecZ5237WrltuyLI7le1EIqpvvrlqPudwEqkvbspe1X3RDN8T3SfZ6ePOVnL2qU87MsSC3GE3rgl6VJMjNRMr+wZFGpYVsbaUkjsnvW+5WDPc9loe995GZgOs+SO3nvBNNtYKV0Xbm9+G5Kmv3pX5J2hnj/c22Kf0/0SpTJvESB3ffaJl6SiEKPhmv5zKoTh0eIIXBDbsUXFFwJ0ciCJpdEa+zAysEpWah5lSEqRDG5P4f7wSCDfk7n8Wjgbvo2VeskiEvEmyMH79InyRQd4+edxe18/mG3zJjUPeB8T6xdz/79kfL5YI/jJ5JZjclauyrZlM35/NLq7asTllMRyNFap4DuznKGRFXyIRKzMmMuZ1uiQnueOa5SFyiRWZ5ZejGBCo6VQZnuruijPmXhYj10op1Ze/xYgs+/s9wZqREZWmWLIpc+yHmMnhdexxMO+LKWd4BAuLwnI6NUfTv0AwChOjVH17Q2gNXibla2m3P2KvO9SqCgHQCxLMNrLrEEaLMIEQ3pbnWYKlux8nOCR2GyuOwjfPqqJ5kMa5+zS5Wo/VZA45r52KH/Ljl6Tvh+Zz4WHFUPP1TtAzN370eOuSQ7vzxTOWdLdJPWqqhhmh9O2H/4K/P/EHdAK2Sz3GdLhLoU74cQRlbsPjj6j1dqKXWZD8XOmpocber0cEzwQ6fxuHHKBNr6V/gbkfkUaQfl7amc5i+l+QWXmisc2akp5jv5gJHTxsmkqgW/J+afy4eIF9mdtZZE3ISD+Rd2/jdm2Ih+nS19v6KJpPKdhi1BC4GRv7wj35S/orHo07qeyWwx44cVJF3hCjfCXVtww3Nz+X7HMvqFssul71mAX3Kf8EoKSozv4qWuJQgh3umgBUJu3vmmLhmQvrk/Tz5kg9x6XJrTWfCmXu9H1uCldVKTQls7VS4nFyaK+jBGE9EPcvfaNnxvTVckx2WINk9Meb/8tNvtyRXeccVrbT6yVo2tpJmvRXT+07YxHGIbmu/MCqBR+T47hP+eIb2htH5LXPHfinlkpHr5d7E+RoxBwy3z7fu5I8L4uxeeu9D+G6FjzT4lfxQcMRoqlHqhPVdLwnVv83k0JEMkx91XPcVXd65pN6YeLmIkydKewo8ytT5mllOwunxblFkrJJTLjk5w5/y9Y5TjTjzcU1HF+RZrDgopgrAFFj0qf0IqZc1tK0/hyyjRmMal8iNuPO+6z+/rcQmMgEO6sNBF13JIoij0uTzW7HYIm/Uto12I5RBCYnm/rtqOxZOqbTK/bIxDTlZaRZ5406NP/A9Xxw7lohdi+JOB7pw8NJajBoL7pA6OLOHgDDqVqJqeYXCH77n9/VCO8r6sHV5EfzuaTVfBj5k+JX7UeLvUA6QhaQdCZW9ifWoaehW5z2wHK/04Gnv/jnjK38BjD/DVauR+L1fdE/Xk04cNbfW4m/T3eGDbRalCSiEuYOm52YIUSocY3rwpLtmsiGRcRQJrQte9Ltkl77NG/Ik8rS3FkwAHPZdkuhW4jOoknxRhR40HVAYruUm1NFiu6ihDF9MvurHkYU3JOdBR4BSMKdPLm3/6kDLCP1cOOsYhITTqODFKce0BYImsGyS2nmRsHXUtyqLjdhgZYWgBTgtuzWw177qKcGjrGviQIRkuXHURP27hjO7PBXqtoQH/IzcesyXkfd7qBj5DTsU6Frho4bDJOV7y41at9JqHLuKzc+1u0N/ti6K774R+NvtbPWmsUpDvx4+/rgLzYW/G03Nbpr0K6HhiOymeBLu9t1059behi1g7Hd39FXyBaVVe8ybrrO0sOEio/4q3sQ11+gDllsrje0ViPr05+TaB9cwo1VIILYX4btEac+2jGcAvQqx8psCX35/5dfJp0XZPWMlgPGFBj5Uwx4+YOEF2TrMIMQCWQugHbUe+Vm4gPtrYPNbxDxsRnRkcL2dfLwOnhUvbbEbBx3V2lUCJVDaMf2pyiZEnEJmWOBK5RsEqJyjxPlLPKcBc34wcizWT8x72En0sdVMO+Vkzd7Ovn9bqSINDAxSC0wF1hHcBK9xym68m6wmZPEi9PHj4YsSbA5lXOvP0PeFvAdgR12qsijosZ0MpWPE1zoDRhY05K/hm1SFEI8W8yyg7s6DuYDz1Da7ns67BTe0bfTVRCuYg2k5K7TPBlX/cXWgGwJvqBPEAG11qtm17v1vxHN5dq3UQy1Dr4Wh+x0+BlCxxIay6MwNkdJ9+fJVrLA4mdFO73mVVjCkIXNE2s9wGINQJO6XHW2D+21wRRWvd3T3chys3xzlqKNiiTszXquydR9rtiNOccEoeEiKK4Bxuv6/0i3hxLT2GJe2wVZahIgnxqfMWnO4LgObpV1AkGboap5Vcg9VgFWpbsTbYhOeQo99iSYp+EFSkNwj9qeANv2rBx4lwstoiUrBPL8AphNbxgmXJq7mLt9Y+2gSZLM7EPhlDkhh0kYVUYh7xVu4dyQ13v23WLtW/BF2Q0xWMjKKUIgvO0np7vHu9Ypal5E/X/MN8pPj+77CYxYxdTOKAITukF2WZP2I6YV4NU06p2RTAWVKq6Eh9tDLLYU6pPVas51Y7uFR8LvfyFp4WjHbaY1kGC+4s9gjD7bWePdnoYNEew/OKFald6mz+nIH/k2Q6VnYzicG+nZde6mL5e+p0DC3Rh8pwwPq2vjRUR3btQiRfgF5g2zK1QOIaZ+nk4WfnNck8tXSP4JmoCgGBTtQTzqtV8weNPdqjUqhIsA+mqsgO3/mQ0s8sgHJOdbLsOssNO0e2dGyQxxYFuWlxCiwZsY5d1pTrS0ueqS5dLWDFPbmEmv/YssbznzE3Sf6fT9CaRYTjTz2ANcicPuW46luDkyKmNdF5JZ0gxWBY9nNMPjHKA+GGKV1TWKao1Futodp+FGy7lFyuHHzXzQBX9OkeNO2cMkbSOhSvgcHbi8eXPQj60COSYfnmilWrud2dn/i4RJtJqr6n8BSwrVX4MZzzl/hswjUtBApAQoyV+HATwnwsU/5wL8Or8HK+dIENxCL/bJGNndmVQQAqw4xh77hZxPUdy/S1X3HCwrS+8blxXp1+/mxC8OeLUBONzwkxHKCLZokhZWXZ8+BVypS53yFwpMt1ylDXlQBO4/HH/PeAdkB1ISZ2L3MZhYb98VASRGOSgFhBPBE3FBxebqTMPMoB5Tv1+EMXulFECx8py2bltnzO3bNCgCBTRilAl26lvhKU1d/p9nsZMWS4QOAM4XgzqGs/cErKIGy3qn+8xoOjtnJpmRRkuPc5lz4bVcjlM2A8YVJEXI6jycrRgVEHcDsczzv/5ABn2Zad8p5oWF8NM6KhMWqvauVy4CPipSwtUJYH+0ysATRtOO3OPGqVd3BuqB2fRLyg72339uvMHXK7pwJ4QKgMMy3DesDdN25lbS3fixNzevHKbxjKY62rZF9w69oo+Fcwv6uWNdYrmMDxkU+dm5dxHeZJI7U2tPIurXT+7r9T54fy4SpEXP2hcelvKYo95xQIB18GaBwNdR84pCCYaNPviuopRRCH9Im1+Jb25BexKqnDVXbK1r9sYMnlXlPE1XYY3hvNwopMveSpxsxB8ZMTq0oAHFcUoWJD/EVV8UCA86fieLUzxXJhe/y5PPenb7APLDdSTbshTQQWiCAOU94lwIB+6Es4FpsVLmOUyNQhCjkNnWYQAhxcA+APocQXwwSQEOEuNc51lwc1ag3i0mYgSVLZdAsNb2yCqMyPihm1jNYXxxWtC8+5RYmYPvyDlh3cQtQDvOSK8RBp12doh8j0W6xrTNmOLi6B3gYzg0ZEgHMg3mb6ugno94Z2P45kv0isx6fNLv28q6AYNuSN+8oviPOdmTT1sTLYIsZ2MxNjGHz8EyfMT08MwA+j95ra9P20U7fRoRIS0DMqqAvm0EBkOrI/kpXdJAnrncL/SfK5+QPQfUN6lgSZFvzi1B/Bg9D/xpzXVj2NGRpfBYHV/XXvCNBtqH3bQRO8wNEVV/MCebSVO1IOYUJ0ImapD7AH38srWgCu0QFdyJWUz6PAmPdoW9NxaDfZ6DRuipxSzo4qFn1Mf6dI8UfeOFElQCp6QlxFZr+P21+mXyIytffACiiLG2yNdmCw7O2nZ/xrTVkFDiJ6tHJMqYQ0NUJYAubN5KuMayul2nU2tDoLLKGeI5myohBXd3zhxVJEdkPxccO/xShBeqyrYFrf8Ii4NnJJznMjL6ZB9aQTfLTaMKOh9ullcTpKYi2THvqTLpvg+NkAt3vwGaErS/UIo4PKDErrCseLX39he73AtrFA60OOyIou3MkMy3V8n7mTf0CoV3dsGCA/lSEfR0OUMukwWTzquy1zXH+KynRT9pr49yqcllJsHwLirywQrRJMMDTtv6OFIztRgYmIhMelu5fc/7TNVVcx20VIqtccC8JKIVJGrgNWdrcOYkIss2z1QxaRnGNXb+6UkjvWr1KKrSHo2Szy6rGokp2V5I23qvj02fyZB8F2LHqizYaJ7Aq1zdV6Mbcfb4Xbh3+1syras2j9DmvcYJ5ycz5qDZ1ZQEEPdjaCWQxH/0GmExwxjgLX3ePn/X3n/abQTD+22aKK25LUGGfpWF2XIbVyBxBGjW9q98tCFZlU9+MqV8c0fwdIp774rrl8x21Aru6EOtYK+cOpZTCaqkZsqMfaL5iwHAVorSeYBudA7NQFi/o7Mamp2JreSnM7EdkA1svTaH+WEMwNWtLFP+hxJbdp5WAsxwiwBp/QrobKvB5M5S+T0VYPs9tvPbQCbuvlgmXQHBdx3zGDlB02uGwDoO6ZblH09DRq0EHCvsOw91IrmRSUkMlt2GGxhoV8R/ahfpfE4GJ57SLHnvGiVtDLJdiFWjPZZYLDtN9gZTVbE6Vrfpm6dGGL7Y154mn0TE+qs7GJs5galRl33m3+SUAZoODy5rhiybnmeezecqgvaHphIO34a62N3F5oqw/9ncuvvAhbb7bVkO+RK7Re67KrPktzBBeLuf229eHTyqujQOA0rcupUgpWfM4Jj2r+6CGNCu/lJC6Mqtat/amLq6VsVlYkZTsg3lbTlc36f2wjLor/Jlrb6gaq+xnrVxtdkyDCL1QM8QmE7GX6hG7eFXqlFBrUi3NFIo36VBI/jwGVIOsEvACCLrAW5wm6GmEC6um0dL90RQpkmoI6A0fQh9pB36UvEBVgO/CXv8tL4NQkZPEwyTOwyc9QVIHo4Bg7e/DiaCqYPgzc67UoK/EGjwVG9eEvGPxRotdMqgLt/dgVxY25w+rNzy/C8v9os+rYMDUHyzWzbKXOuPjC+1rGRH5hv6DRkceUEjxIUA7Zo3jdDLO/GkQcshM+nGxb6vHIkEyfJ4dyQczVZyNDdTNERxQ9/sA4smwGLAGeGsBPEwE8jznKb+Czy0W7DZjAh9TzL2u7s713uZPhEuClYxeFunEN51KxmzaaV8u9c0UZule1JAAAYG69J6koifp3gTvqT2dQcZSGTedAKM+TabM4rOcye5hL+cVIl+euLMDaSQGODpjvj/jWFiLBM0kC2HGy5B9apV70ox8bVl/oOyW3ncYfK9IMhkdfxh7H9l6iAy+Pl+xL66RideWXl/qWdWXP+e5qG1+/OVT4HrkwXTG57uJ+1jqjWRlnP2sF5iAhfsApMnD3dAevHQai8mCW0zoC6KpOqZRj347R6TFM4L93YR9uCrVSPUh1QOHMYKo79ta6lEctL5uQ3CxIUapx0CsxOtoDXVQqC4+XEYWJpiZVX37tAApRlPfGZb6b+y3ne7QexviQOTL8I/v1m5TJ5uKyNghKD7jLwX6uwxqNb0gfDSyxPLoi9LvbuRkMIaXhdUhdJMd4CbaMDlPxfrIy0zFJzChwfNJEoLek4mZ1M+4xRBhh8WIDu0gRgNeFT2Xr1kcuea+BpvUsBAswVukFx9yMC0bBrYaFlu2WRcWZ+ENPme3D4tftNFs3OWHw/HGji7pikY7bXLNITfIZS2w6viN42NnLwB12y2H5g6eLZfB/lddeYs0elhZJgc3vycnMZFKlFgO1H1PCFs5vmoXXqseC8bvtnzIPeTYbXeL8d3TKuX05t0fdLC2kWRbsir4mOnNHN9PrC7kSO3LLyG7/UrOb6jSGBmsgk9BczEBLpO4ZL9oFfhVEcVXkEi5gG6UVPNJ0c1GUucndPGNC3+Ck3Tb9Ui3Y0QipiFAdpCJc6bxX+XM8nw0LuYE14rOxRq7lgljdKTXRTWQuTiFLpGvPX02RJOVVPSVGip39aAPx9zel1X1SCDNl2jOs5MQbwGDKvp2oRRUm+CLIbiw1LgwDp4YmOdpWDSzXtRJL9uUGAJIVdHlw1qeVPee6VpT3YeM6IiC+tyPtmoTRsmRlM/jDNrH0jphFyBRWltv/w1ElgGCDsQ5Q+X+OOTNJOCXknHIpnnPax2m1YSxmJRMMVDVmIx6Dxmjfb6HMyFktjWoH81JcVnxmmQLjh+6WD31Bi+YOdxIHzRiFHUL0UqjWsgCSC9klHrxzAUrMqqm+uD4U3rR+qEReMVggi8JRUXdwr3XM69hJzi89Hc1NPxVaBzr910K5OUeOSuWTV3E6xA+5A1J9obfGXg2Axufi5ZJdLjgvEe/PZaauV6qi59X0eYvv3xnzf5zjpW614c69jTcdKx8b5RC7ZQAO3fBhjDvpsutNRsNsE8i71JD3c76s4dlXTA2csrfz0pU0k1rfn2BTEN8bdrGjWjH7wBINzZ0ujx5zyFUVTfuMWKapyfQm5e/LcHbfl1+7ITGs/74ohpC4I1mBIOK/1A+swHHzk7BtfCmIU4NGYY5jjqC/hYBlPSqCBPW4aCLU8UesB9EqhaL6i2k0iZszYfrEeTV27fmpdkIuneHl/qo/3sCJIOtTtHAT1pe3NE2bKw+XtFiD0lWavoLH8uqYo1+UdzDRhgEROUrfnsUkbxbmYOG+l7dWkcDQoqHInph6Zm0axcZMuajUAz24r2rhgSVnGSOtkuyQJr2v6IMrbhTlYSi3TL9+GCxrTPTBC3zUNhMksveKw+0OhskPCHhg9NOcEgjmvM/lk6TQBXaDuKsLWFWyqX47Rtb+IyM6HYunTPhPt12mizBcNahparGkyd7nb4ftmpSP4ZjTkGXCmvo5iMVUskh0eT95ScGYzms1kPmIOxZpyLFf1amGFApvhEL8kFTlvUx+0w6OpLvOIRC04A/KyV8Njy05sDMfLiPk/DB0QU5adePnT+M2uVhJif41c2mB2sFZFRsK3bnRjXDSuXrejvCPkncTQtC+o1go0nWC276Z2w3W3AKsoc/PzNzhqkDsZ4eMVJy/4TKtJu0CZFgDRIpNPBWj3iun26XVeAFoyYHNoOuNlLAT0RLE3hNRq6w197W8msNLhkb+YuJJD8gk+wWO3Ms0ybSgiP4beJaJnMUt4SSJ7d/zbMLyKdvChl4qq00gwdk3nDi+qGyVy09EcrlnS90/lUHmstA/fZWOt8I3xs5s2SvhxytDEvVo9o9qAPCNcQsoKn3uJqEN5Slqsd09DP70/MmQdiIOV2bqUQm+udAM1Or5alp6NwczRDa16QwMYQTRT1ZNQ79xOsezjn9N9VYKW0s6Ay1NxzjXAJ7y4bUTZT9H7Tj3O9je5tC/gHd52vpBrOCTRtg+QGzNwANivZ4aW117Zj/vfITBi5rZ8KH8Q1uqT3sQl96R17W7KBef7Sv9/zJQ77qruJljRviGKzrAzJdf7lh9VOWiPKZ7BcS0g2Rz0ZS4nFTP3wB6Yw0deiar+YaxuzXb+o+R+3myCpK8KIUcPq03hs7rSu3M5wx49viNuAKLzZqbHQlPlNa1PEu+S/13TQDzrmDsXZQ0Ko2CaEjnnaTMnnApDUhMBymsjkX8mFrndt16Y4sJjyZhlm/DxbuESnrT3QRNMRdHqoBoNXfbzM+VzPjmeydKvO7DwqVITucPsE0N5IbIH0WHeNgv1LNICibB7pLNwMRQ6IVNxcvsvrHRw0lMK1v5pUUfJ/Bap4Kp6MxWGPNjiUyKXZY2dyyvom4jbWNjEHWPMdA5QMXHyMiW+cVIdpZ0Mud+//lzmVgyndjl0GGMDIhGz34HKhB4uteZmrpSf4Zcb+8C0+HlRRARBgvhVQdY+NhNwqM7KOM1D5nVJxdX3xIzZqCV7ZZafsfOn1LC7YVg2NQiQviadSkLZPU3fH9lJ1VJ/djxeP+1OJhs5SDRA3hDVK8eJLJD7hOhmUykcaZk2ikCb5h68xDPIkXon78sobJYLt34gh3zA7z66rAIbIY1dt9Q1x17W+22fPmCNYe9i2IUnvnqcyaNwMhOlQ5+5rgxrfAdXyDue4xasmvBqdxqvP93YyO5WmLICkssGWVFm/9hKnqDLaaV5upsk3DDTWjpVyh0P8tSzZjXnmFTp5b6z77XRcW20lWXGF8LHdbGGLFIcXmdpU5YhDfWjKobKhoUHApD5yep1Krz4eByW1yhGVIeMb7RlhAplQTE49oINo8ie6n/lXibBlgOeJxn03mTuMYMCoZnfYig2NEoT2tuPHQ/p6/Lc1baVVlXrQ4oqM1Kh1rjlRZW/gsAusqmTgYz2tLEFFsg4aU8aWzBZYPm2GiaYaKujn0LG2aRDfiZRYJ6ONKi8j7cGA7hWF/AqVIjjYfhyiqYde9/WLNyzQ3KDjUZpQik1LNd6gGTSl2Gyoc4EMhSeUePzBg7Kd/jgckVY7OIR0DISoNB3Jj6UTc0NzTctnvLvBb4py2cD99imXkg5j2T9LLmabYD5fhhq4x+IG4dlZGUrvA/64UpkLldL/d76PJ8oEAeQ6jS2oJ0/QaeutbUDSNmVwSAExkRCgZqTz8ac6SF7FHGSYkrG5HH58iQXb8lR+SnT2G7hvZfhSdW4K2RE2VIzJw80fug3nxfiDPnxXjakfKpnbhaeENDNA44aX8ZLnvYpaRMFcM/lPULxI0odcTSboNjgNkbQO9ZtzCRDZauLng61oB8Y9lwkKVo5cbQR4I3s0sKF367bLdN4FwJmDglz3JD0CqIBHCC+oXe78lsXVw81Zr1wtq1LhJZoszYV5k3aM+bJxRzc0E1rdnPi7LqW/nZS8TQDkAGMuEAA4IRL8T/n5E+BoWp+giYzv74xAufNAuYFkLAsAAvAFnl1jazmyDR+JmG0hXByxyM1vN5+3skJLzfYCHWsuT/XDnV5aTsXU+WL3ZfG/kOzPcWKL6O5FzucK5Bazih8AaL2BMEPjlz8CNty4hSG6GZZY1M1UAswjT4mm3kYluJajGtuv4/bgp3wdALc06uu8pJrvo6VUzmS4vCj99enQbNukO8EqVZStdJKmCcOenOAqdCHtZMh0vfvupQnXk+AaUUMsekRnFmT61zbLOmxhMC8TVE46awREkxL5DMa/V5+qZGPNTigNpZGu3LD8vB54+GO7geunod66htu8V0qnexpT8/SAHkrdnqd63u6g8mOcdyix7tLfVDwSpluhzFO1vNzQrT9gg1eDrb6M6b0Ld8WyuHUm4dPvDdiU7TI4FnFzM7vDvtoQQUyvu/PbLgH0yCpwRXQdEnIlNg0otETInZMNEjrO5a9f+sR3DRnPrC8CKiuJW3DCF7kn3hLxPi5m5ATQmxpRVjhrV2C7UOmh+QdkydwDpHwa8fqgeaKMG3w516/eo+UvjIKT1qVAt/uuDfw/Y4vlt8cpz+3pgIqJtwvnYsdzhXL5ei1ePQZYHzZli9HtcYJSuMBxe++QmpmIdU5oJo9X7huwFTowHdlaZ0tSIWZp5so8ucN7VIpm5H8Zrjv7mRI6/t3/fkB1+XR2dIuvA5T0HbawjEYbOhF7oPad5SdfVW/6p38uFn+Cv2CjUlV3nhX+v1vdvX/h4ZvCY/4jV0rnCRhukka7fWwbDPvv07ln6TSeFrb7pX9xn+k08wBdoRJFVMCn3Boty36Qg5FHAEMnttiSw8HJfXaCmK8YRyG6fdPWLuWKKfdShDD4Olt5ZcZrpRZGOXJP8o3tfGnXS8obje++piMGJ76odfZfellzzrnWVN2cZTUFOfizCvGuVAnpi+lEPWw2C7WZOIsCkB8N1aFCw/OFXcZHTkqZN7erDv8lpV7QSaN8mnQZ6uhI7NecG/YJwBIavlxZU/DTfjquugaeDZVCiYgqa6+UWgzdNFOXP0DR+YExhPYn7jpBOqJm37g+HgCqxO3/sCF6gTenKCtXF8d9VieLqTKxi1nOGZVTzjakukTY2fmVstlt6S6MIjrf2uLy4eDQBragzFOb2IGdHJMqk9aSX2DtR1ykBxt942pJ/yltWNfTzVwSUt63Id0lBvC8iHLthzlXS49H/d9Rb8Yk4rT1L/OxJs7+i8rxRdrMBpIokGdjGLNfuH8sPV565El68yNUW8IsNaZjgckWFwci3S4X3g6tuiQCyJRcnokZtw/11vsrhYIyz3SC580EBMowp1LEpS/wV63R50qkJQc0cnsRyLEKZcp4DnoRJiyvMcszW9ljtjm1TnuCWtvS4GV0rB9N8j/CARBLCIVhEUjxqY7N+TbAyfU9WijeG35JmNEsVDem98r+m+RphZeQZH4/LtFpdNJPfNK7xnUHZWsH3ZtIo73YJoxRCykhw7vakes3gtm28V8xhTjQsyYjcQPR9BsBIuEUpkSxCz1KG5siH3eafIQQJWjPuVsDBLZa6yWVUNzXvKoMXW6Ui7ofiZjL1yl4QPF6EdrUOVYvW8KzrusCiNfRvCsOzMIBNatGCPhXD0j2duRLU0iiPK1YdFgg8iJgcbtXWUtLuyaFlGRXF4SjVD+kQLyY+ZHJM6FlV4wGnkB2aBSGLT9EMIknZqhAOLCcuvZQL9WYC9wHeiLRopIUlhvsSb9bg8zzXzVq60cj6cBsxzZxhzC04M090Wv2G2R3UJ5hLVlOO+KfNcoi8/jo7WxAsTjy+/Zsc8IF+NsWazQ2itx5QhKe77DcnGw4aoBk7LJtapHJ5FlRBGZ6viOJXPyeaX0yE9ihNwEjQSwQOBNEZTmP1TyiRaiM2NieSkFO6AKZWFLTokQg/0ZKHiAt+wjiBoC/J1YQ1iww7rp0vdk7OsH5GBgGRT6hpDfw+XT497cVfuMgthuiGWTvlrfKJb5n4qhC88QgcnovN9q1jVlxN7alqnl8RMFYFOQ044K8kX9lTeqMZZoX8N6iEeGd2mTlod/KI3zoCrtzli3f7xXyHVAsh2MLa1XQ9EElVv5t8+T1cRKUucaebPva4tpErCFfBalAYTbQRlEnu4vrNkGhcWgfbVXcBLk9rhtnsBzKWvLXjltc3jMfXK12ZG5CEBNwWB7ojTAcKZZ2sC5IuMOimQuWYEDYtU1TVO+qp/BRIDia2PvBKlp4cN8xkoQhCDIWT8AMaG8on9MvOJ658w59riUkyAdgzBswwgWxeOTUvHPshUQMLewP+R6bkfogOfokMnjCF2uGVzrFzJ0cLySKuhM1eyFxfzcuhL8MvT2+zn/H/+/nEMGuD+cPzym786afFA9u5J4X8aE5dwz5RpGMww6wldIR3JTHibQckDcUn9MKaqA0VXJfy3urJNX+BFWiFH9QDes1AVQehPcB05WOfaNZ/l4jige7yzT2V/aAqjF7bGHGH8EizDhNE4zFffcIhlyCvmnMXw79Bs4xtBsPrNevDwT5Ss3+S8RgV6t0Ec5C9oQdew1vhUGY5z2CsuuwMOFs+T3ixL+/a005gs+rmQQi8MgA14swF9o6JGJbAQRGga4l6GIBu7ChExfs5ivXmSdlUesnkq2VR86amRTJwF97J20QlDzsVFixJ9xY0JVZKHqCdlO4VCBYERG0voLqbnMmbdUAqo4dXYcWhMwoKeFyNjtmsP421RkxMoi+U3JzgfqvTp8Aw1OcB5gips5Uwixr+betsHlPA1kPQ8PfAAK4s6BHLz4/iuZiLuGfraNfqQxcjNDWb/EkqKmkFvJpjX5KLcyQKULIGqIk4uXQPnEGrIEJ5gPde7hZk3ysZFUzL/R8mNW4xEGGNyhn+9YWITCphQWUINacT9FgZlQVLmAynm1zJYsOklRw7AOFvdi+Vfnb3aVhxqEhvsB8BsuQHINFdXEAnrmpgiLtWq8gGbcCd1HXsOQp4TSJorQ82gixIhKlepGV/xSzHQK7k3HGEPybOrhWTkmBbQ4QyfBL4EWKrKljSftyt8B2oWuoLpYOgqCrfmjdTeoBlnpzPU/V23QC0JumGgoA4DgtrK4tnGvIU4q8ixHQO7ZSbFPTghsVbDrFOuHDf+O9M+3IJtQPFIaS6vSneUFUWKzi/I2aVrzGGxSbzVWYKXJefo3tQZmW5fhdHOvAWXuhb0UOEPmnwWzaS3z1KszWcuaLgmHtdlYiVRPRwSsDFQgkhvVQ4nI6vY+1TtlEnnylIeHKF1OsUZcK4jW77kdA3QqzsaAmGWrLmsBoyIrCbsTzH5r6QMLz6Twh3PPTqIuKxe8I+YBe78huGCYvxVN7Dg2JjOPLtpVKMNgYI03B9PRObPMkoWbOrurZ0i5CbZM9ChfqhXNQ6FXY8NOWH4pxeKK+iJkKb/2lR7o5/b40xV6c+TjQEi7yMObkivGJoprjEqpVMlARFRwZ3P8yasCCe4YYmOeOhidNYZJjfqgkBqpyn8EoXKbM2HJ32BLUYDwqi3DMhA845aGZOFYcjaDb0UkrRYoRgGYhZPjsCasJ2y1Z8Ga5CWPsXhqOIpNbhN9hoOGWMEzEh/xHm+UOxf7zsxkRppU49eNP0zkNkHylAFFMQorQrOiLD2lGHSIvZG6ZSLqakwJ1F9wkukI/0hk4wVVxDjMNpNMi5QByxeqm5+B4wICGnFQeX4kHUaLHkU2naBm/m7IL5qRihgUAUsMZIYlEshgWDIKpAeuBMJW6DiipcbAF1ECKwYzpfmEsJs53+IINIP5n+Tki/w7FHHVtQ1DRezTKeXIZnLoPQX1597JcSKh+dfcPUi8V0vm76hpcFyktoY9TbAlAMpLp+T4zhVmJ8fEC+eQo0835rUDLs6Qw1/XMJl04+QAZDwqocsUE1baL2/GWZoYavxTNsCIighuPVxp3jcJ0hP5Zc0DMl5ABozCU81Sli6XkXN11ZLXbugRRVdDpiDIuW9zjxWH6/zQ3Qg2LLWUlHkEfkfwOJZpmIGtrYHbBdviU7m61u7Th30DRy//9i0+/dhA1DVtR2zbKT+tC54+6QYeDttUlOt48yq0Ftb24DGwawjdl32jxbPiyT4/B44G9jpmA65JtLXQsa8OvO3UqU+w/adR6EgF2gNFGCfk7qPcQcRHTNS7rsBlb7m2nTn61n3j+jmK5eDJKtHrWs4xHYMDZzhY1NZTksaU+kWwEOq9JCdpVX+K/ddc6NZ/myesRTjlG//p+28eZzMQoOWdP1MQswEHq7uMgY0w0rsQNROIqnkwziA9bwvhoCeOCK15xLm1h+uR4GWNugxE/PSGQ4jW9spE/HALnpT5/FCT9/ckACHh7AbS9wl8XH2FASMDzxEp+4bw/mZQq6sFDGKCXR0/Fe8XHINQFJ6jCoOlAO3VWAGwktJjItO0QHgzVZx1bhPbUp//NeKhtmskcbbCMUiZohaBibWugrNh1j3mJ2Y8LZ3KtOLLsu0hnuKoJiXNetuU2gN0GgnMZiuUOYR5uti2Qb+7ITM3Fs+GvCsSLOxmGwdjBcBBc5YoqNG0pHjNOjxBdsCQx2U/15Qer1+jGu54bcGuivZFBgtKEO81MMYu4vmvdKmqLmdsuxrHY/cUOntiw+yaV+OCHeVzxGOchhKoWHY1bEaxA0Yz1v3a95Al+BXuzQcBE6R1Xf8IG0XH/Kc+ol0arpGsvCWGgx20E0bupKPIft7CYUC8+IulKBkgbI/lDw/0DKW7pHPOc3eqdgDIDNw35C99i5FhNmMtHzWYwbNZExlCPB10d3MSn5/ba4Irm1aMx/bdK+Sst9uDMpCNFsbF1Jg/h+RjpfyonmFiQ21TUkom+0VxCoHI/KICCHr/sOCepOROJWYOwYDrbYnZvt43rNTcMzt89CidXb7eHhnGl2kqx/8dqtczbwCFauW6NRWOS29cBwR/6n58KPwjmC39WdhFzySKvKeDbF6WfpS/F/hePQE5TKJRN2M7zdj6mvx0F08eFCM7d4ZNI4jNsBsVTniNIfwvB+bTq21DiOIkUQi9/wZwKNZnXl2JCKBW4h/VO53ghh4WB/3NQRmX+SaeFQ6DTlZPimEwFPHx7/vKh+JY9CdjKeOWp17ngC6Dw/STBKGaRfbjvZpQUo7QEpzo43h7AvziZpy36F8PYLOdvSjE8chpe9C1ACFGODhrei/mYphb3bE6G1X6GP2hJy1U4eLMC47OZlnsAGkL0hPoDLH4flceO4XWrafVN1mIJSY3qUJy/S2q+GxP/U3MpQQprn9ReAuABPQ/4oZs53GePOfOTZ4vdSdh8fajuVWBEkD5NtxrFejjy/RmrAFNoI61gv+RMZXMu1a1Efq8ejDSZ597RYm2+9XLKASAjpvNwop7i5saMuP7nzfMsSbaiBTMcJ1OaEcIuQEUQSJiUfSatyUbu6xIs5elEj5bGR20tEiMPU6GiIJTP2HS9MGYnBA6sZ26tbNnMLuKAtTNZg4kznoclt4naiePyRNWUZHNPAjxN6STzJOlzFkePChGo+77LcBHeU33vaWrpVMxefAKnzD9Iuey4xJ5XQY1fIbNUsiy+O2rdsVgDY9EbbF2zM+2hWgmqutBZoa+RLbwgDPPullGUgi6q5BMFsfqHTm9anEzUWhbZu8giODqVlnwseqRY+4dWMfDvmxL6XzrmRWyBvII1dED/behiyK8EIrFeJ7QtRz+2+6B9LdZsRyitHLtsdYNZkInXzYL8w8BKTH/Zk2UwITWBSTpitKrIZVMYmiOXqvxjcxC6V3+9akMUyuQsvr7Bss/60UiEvr67ZkUMUPsRdX8K8ztrcuDLAhdgByzWQPwDHNQ6U1PioER8pC2Pk6yNabSAPETIq7vVBJV4vgbZvfitCk88Fi6rqLudI+WYOZF9PNsNJIteQ4PdyeVUPe/UY9uG/alJVl0P9A1gyrRt+LNbDCEkNT8fXp0lHlYMXf0cJ03a3NiSjj8uX/xd9GVZbx3NDVbsoyT2gQufp2ZTbRl9VY8EYlVwxqX3/JjG2pWNYfnPjfgPFW3p37lS5Z/P6dJ9yBjH9/y3b4cBUidYZXd03ZC1M8r6f2G2cgy1N7oLPSS7H0+DrFh+rFAJnOl9kaPXgcLU3KOThc0uv6LfhGIDqcsA0tw3PBcRhQ85FlY3Zt91uEImgS4c3lVcvI/9B9Y5HNlUiuU0+i3hFdqpicZaBMRDjtcPIScNe2X3ZIyOTe4xV4D810wl+a7F4x4r0eAdUV+aCpNi1SIeHdjuwNKe7p9zbGJuT0qChVY01TsydZSMM4zz5Cd0ia/JkPImlIx4aHYwn1UJElr23P7khipbC92I3vuQ5KyeZTj2JTZ15GreJA9fDl4mD1zphyyonz435Fudj81sjiu/EDn5YWncZmfLMVatE84g4MwD3Yi2Da16yla8f5ouUPCIqMmbo3Xe2YR3vyz/RNPh1OTz/tAfKJ57KuEQYX/i83JpczSNfpjDv8nQIsxD5Q3oqnIQnpzogfoSMtjGhN0PhPtI+BH82sGRHbC6bnAkPKYPR/4se+9awFj/iquxZFY0SEKxxLvkbImtFwRcPM4I9+kr4jqIb95xgKrfw3S1OYFUZtaKHzQ1E88VGAbifcL+ldwr8NimFY9zsNkYxcQB2NrztgkqVhwvhS9NhCJ83cJBg3kRBJBwZwbgtnHzDandSSSltgbRrakdFQGwjxwCF9YZRGlCBo7z5zADDyqa7e4XNlRmLtP1V10gygEkr2+al8JKri4cpPFYjcbDXzCWG/VPx/ey6q6VDvbVyuOP7+9EJjwvOIYnc5CV3i+8tLxuiPew6P67Z7AgQBU4Fmc/8sSPwPkm0AYYeLM0IkQQrYIMXMFmB7bmC42ce22KY8vd/k95mHi2VWmXLSq09ZgVwlhMdj5p5mamNi0cYRCX12vg+OvyyErZ27xDWZI0pQjqS/pcXyvhTlwZabbMHIS2Hvtv3XQKc2x+risMuuYdotssqE/+H2Zx3LHqxEmOVs1siFhdeWV34ZwYww16uh4F2TS1YV3xKoa2Ed/OIWw1/njK0MBwTQWbSMt1Ncvl0K5yi7mZutRoXBLApemwl6u2q7L/1rQPzd9QCphPYjJb/wTn76qIlqQymRarPY64MoC2rsSrwHN4OGN/W9hDoBUZrYs0HWQBspyhn8tLuPbTr1KgEpcPMyBw0ss8Uyz+WMsOvGqN8Sq9XUH+Uv4r6b+LKO3LaqQ59bxAYRrTLdEHd0AKngbz3FM13iWozhcojPCsD0XBdVYNiUTuUbDWrTZoLfP6Oek70UxsJBc/iaax5HY4vK10GcT/Yn9ulW8EIdrIj5z099iZXBZvhO3yD2GMpsemJ3qjBDwkB2gNytHoz1p2gnYdOL2g+FH0e0kdohndbUw7HH9PH3tABIxxBfC7zXK+3S4Aj97OTUorKOzCJbRpUvdLpqfaRmohN/ZFTMwG1lifVnHC4EPJWFxsArVffTChiFLDX9jv24V3VzC4QpzHsyi3r6zMnoWTEsX8TYld2n7lc0mNu8QcXa8Erf/jaK+u7q4XWCtev/c9PzkrOnqRqrbvEWXjwArfberyvudIMuItpwcLKJt5AFXDdAiy/aZn1pLmNXbh17cpmXqWBKjbPXSFBhyzOXK+o/gAJtjdgTCQKNQnFmg+NLtlD98gmdOBgd9Qq0GTiZAOynh9OPod2/Gu8k29SoEyt6e4QfnKit9WiKnidG+eHH1waFGNu1SWropgmVSr81r6bQsiEj7iWkxAPEU7pHq6PUfUAX6APgvwK0pVNNbTIo75ItjbufrkuZbaHAFjZe/extRiLkBfihBHkWh0wZiLME1ojDkBixyCX4lCpfaAE0F3IuBBS0ErUA6MdBZC3VRAYZUE2/jBgUIAAIAe+tTXnHuERbzra1Z+F+8KlSDz6OgIl88Lfr+7i6x70CVqC4JFrmvLpcO6StBcg+6W8FHYwJM/Rh5lbH0Ob95GCoPFVHGTWfO3vidxtlMdK2LAPshGI4L5Y2zg6AXJdVxTza071XblZMTQl36mXTdAxrB7ln60IvFfgNnSc7azCadQ3WPHVj9apqsdswIARI9UoIYNA/uMO905sexlwVjThb8gxPxYTGL83LKA/O/Msy4OpgEJjRdMLfFxKYHcK52n3Pm6kWfDJB/B4b8iTGHBQrFNl/mReSj7kY8D+IlBGPibiPK8cemLaQDMK07rUJ5f7hO4XVQ9poj2Lw3nMZ0ChsCH+L8kmoN+pGUVP5Rri+1yfbC7eNDZ7pnjlO+CDvLOZM/DbQ2m2DGd5dEb+EC8NlkI64DtUF7GKHpKos2EOAwdr816th2CX9JJB+toO7DJ6eWR6oKbCzZEy2Ke4aobc7+iSFFot+wHXUhITu95OoI+VM7SjPWAg/GEpKzY2BNqHBt2L2cVKfPFPqiZTIMJ9LGf21aRhr8AQC37TGgVpAHRMlw1AIoz0W77FrSGozHiR2hApT5JG3mfnaNqwP+ad67UidVJ6S3DTIbJyv4o+wYfww92naMFF9CVOGEzjYInPoyDkcSksL8qpqHS0haYv4xKixl+Ay47d+QODoSyVcOq7L2zqF7C0wVsZ2baeMgkN6fxZ1XZ67vjKJYGJln/40vBrYn/HRqb8mPMlxtd0lrpejlOasYESobHofYfcufw8jjW+4gSzStBEdRFq6iIJca894w2pFich14Pg/y3vJ0cmYrrHyTHDuNZYjo6IeUYyMLSM7OMzudV9neAXgxO4SNWXUuzi/sZYqA9VXPOEkSlkMSqEhH1iHxy0LnUb3a7lL4HMK3HnXSNhVVJBSV8a3lJbsHoPdnn2cuO1+2hvRsNz0svDmxBCvIPInwdVjS82YBVt6L+D2NUq+b7fdufLp/DTRRo3mpS7CGKG88vPtc5OUmnNJRExtGgEXuosZc9LGq2ckdQrabxQqC/ullG9IjfT6HQ87IKiJ5LlWPiZrsY9bMrXQ2P3e0lW2mwv4Ti8DCmUUVP3wYsRk2cHRd4rK0SyNF0mIvhFcvC1oV8z7j8QTAe83JNfLcAXRaknPpAVV3Pxq1V0Mv9e9mQBMe01XnbUmydwlVqGSlGae0T9aAYOoPKR0fnXFlcJ4iO8vwDjBtMENE8UeeqLIUbbFIjy/LoHlc69kN3oqEKSVqVJx4xw/K1StPNO9xLTulCxX3CIkSHYX4x6IbNCAIaiui6qJx8CdVmagB2GD/784R7dl3zVCtPyCy/uQc0Tw5Ynjy+PfGGB09MKWHXp/X6SBbLSkcTkLacuTOW+srgCO9tm9+XqIpMVrQm+kghmEYxvGFXErUzux1PvignTXCIxViqEQRaYXX6MVT1n86DSla9aJ0t7v6GzjulLYMwyejw4+J60yws8FJW1Y7OXB1zmuZHgltv7BdbBjkOwnjeO+wAN8DFCajRFYzoXnCdGIvTtIGZqJvQs+57PuzNQ5hFG/fI7fB2obkYG7w7M+UoVXjXkwBQxGyb0VEdMuJCav6F6f5n+A8Hj3M8TjibNvwMq6u2h2c5ZfOO6vhp9zw3fDnO+qWRmcGmUMgTGb13xzy+mjK8p3FoLCgJ41uiAaN7SJzzshUeHA/1dQYebAvan4rok8cqyqJVfX7++h/sKrN/x76JZuh/A0ESjvxhA1onBJcILkmWQ9A7m3fAHkkTUxd5noIswGafj301NIp880YzLc9UkmAeWx2a1wgn3N4IxaaF4YiPbnX6xvttoTd8iKXMNe4Hu4Bs1MLa1xFZzLrSshm46V1Aqs+/wN3ODbLrmjRqYru6gxdZsZcOwobj2+TVHkDG5kZTFVPVvmROQPhER/3qeYC9YPLwTJZayEIl6m0umub9teKP7ERStvAVtXQC+IBSE8Mb0a+j0uyXRV6lWhDH+JGqb7PpUTijp4HUCdLReVTSHqG0vQWj7U1KoCuvw9arzDxsfLlu554gALy+aZ0Gpw/FzIDejFuA+gzrSEPeUhXLNS/14qieROupPkPbUub7qs3mEt6fW9ZO67omp9+yD0gEIkQgz9UyHnVjHqU3ql2tpB+thFEFBHq2FwLCe8Q680DZk08QSKfrBvENyLPLFP7pYTsFIneTB6oUwxpwGy+QnePGXUfxm4VZtJH30isZpC0q6NF/0yV6K39MgT9+1W9+bnAcDxnhMgfed86U9bLHe2lQruora1gPKO2w5N5P3/PEuCwzb3k1jzxaWFqsUbMgBCdLq1NE6+tj9l8bnPPeUicR924Wsu76618fKZJ2jr+H55vmjAAKiMmBgy3b/IxdSZV0FK8/eCcQreFkP2Dz+2WqkCLlyX9thB6GJJO11xMqZqrL45MCwZ3nQfyFjo++LcnszXrxmu1aH+Ovs9zpdC4sgskshXSUnkMOeeb7OWp0EgCi+9abhLomSHGoD54ogoj9kNUQ6YCrAlJSMG7cn2IH1WTcGsPJrTCzAhAaorUDqZbvyqw2AdENZxJIlCDE0bvQDbeTsA2Uw81cuw9l9CPGjKnhr3+vx6J85lCOV9FJeeAJkDjxWwVYnMKVUHWQGWaPfUpF5enedxC5VboScKlQf027a446gO1ti/5PTlJ+uHsGz8nGsufADS5mfcBvutS4FgF8PJ8p7Cb8EMG0r1SrpprOiLDPS1/KJpJ0XxGn5wTzLOrd28mjFIpb/Ftw8bWD/Q8n2EYhuHL7WnEC1YcPspxiTm/hXPq/TkO6Zg/k1WCyH8iLHANq/9vl6czcXzQloQDI7WHjAstH2EaTU8xzQ7KgkO5Xm1f+aucUp6rTv6GMmGJg/uofELkUzr0ent7+IyG9LMVWLiBhH6tSd0FdwjeX2DdzGaD3rCxoFoITBzQoWrrxh0gDP4+20oI7/MvHGAOwrZwwX4uoe1xzzoYKg0Zzg6bOO7Tu04f1DzszHSkVeI94YaL96Cj0LDWHfr1knGFf7DCXdUqe/NiwKio+QuPUx1eM+lMUiWYTlnnSWHjX+WE5ZSbTaYJQoPSBuTGl+uxhWbfVy9M5Pi+7LODa88UVKc4c5p5FIfbdx+HqsCHH5WVQk1NVINot5z1V0RdcaJDuDI/tR4AxEOpiGNgWol0u9ZcqJEnXx5U7NsYobpR7Z2vR9/fo4VcIC9JwpLAdbDXK1cyOIPvo0QWLujFxfT7P3NacEcUUIzgPt2OPQllloj4ACbSESPhIdUXXpkyM6vYWTHu2GOrVgxGS4ZNvYoj17vfHh1AnXNfa9jLzNfichKQZDpcaQcZyQVTyxFiVlVUweV104nNhIeYDR9GTk4+3YHZhQrdmenN0N5fOHzm6IQz47Fb/yIWIriUoBb5sN5xl+DnLjppXxEviYzS9EiqIeI9l4AhHvjGIhrCO56gew8BRvrj9kRlFLNI+6j0dI3tPtYNCp/uFLyKLyX7kXVgAudbTb0oW7H8K1yJjpRkKLHQAevABcL6k0gWZAMuOpbmjdIbHyxqD6q/KldrYHPSEPweR7qXvDp70jm8CoijK7ZbhXD4v8ZsjuoSurUZN4TydxQEldaM/QNjYkxQ9K9pm57YsjLH2CT3hF9mCunn3j4vio7lqsOBH6WVli7R0fvrAmHeHQboaSszBLHAoMmVE3a8ITmZ/994N5v5CYKhTDUVBxxJUcW94pWxDTlS1WF7+RfT+LkPaiysrjltdqwa99G62y+u+k1A7Z1v9bMFl6NGiIV8w0EQ6Xd3/zGo83J0y1Gze4hrKk+Zy+kuT/L6dcAfYF2zPZS8mLqWbiwiBlN97CW/+idgYF4T31K/tqq3UpUAeGINscRH7fqlvC7lf+oZuEsgOYYuI74Es58m/cfAY044DQFLrsNUlVUmWKEypZO8rCEpK1L06WAJBir3ogl9Y8Dcfh0l0WqbuH3gD06yBrK0dSSXZjMwId12PN+8vZb7fR8OT8sob5eAUy2yc2c7lsqKm/itqRxDeBUE8CRiQau7hoIMYsl2utasciSJDpJt4ayKlN09YIU4pCsQ7nz+/M8V8nCAP2lo9QjDsSPZRTkrMoaa8GpyJCCbd1Yl/FT26lbsRtbRLB43kPS95G4YhmHYMSU/rKMadbuI+3TVeEQ027j5yqTfOvsi3DKrkvw66E1Wm5PhAdPhm0kKFiY7EB72EpH2z0DrGhMTJ4G7OnxHB+i5kWC9WrDXF9Be7jNYEiWQ+UVKnpNVWJ1A649ZcE+DUGKFEyCrwcZJR1KKmTCozFnof9me5t151UUXxd6obxFvpW87OP0PDWI4+ZgGLOAoIwa+GLvZtE2qGPdRt8XS8bQYAg1Xu6coUONNtG35gbhMNBIVE7FgJtNpF9BkTAN5YcZLReuZLhroeL50JIdGcHh6+EWR2TGD5LHf0z+52vQuVMFQUVKzepGpTX1HGcxXShEEblhASLDrxdMaOmK9POKBRSEzR/ZlnyYkNTtoRGSA5dv+lkUBIEg8z57qs4gEKr7/FOXdSvN/LQafiFO6iykskDnY/aHn7sk1vzSU+VHlcsTG+j5u62schtRRkkOeA9I2VY/sRLYHioypqZKDpQmMeB75fWhe3zFPIe183sRgnP6TW5nKTrP0NTw2qvbnNKgb3/HUPVRwMnxjkAgeZDg1xpvA4rsE8YPSRJqABy4Tpg/pLOJnwMzMTOqnQslypUO/aig8jsDx7EZWsfD0DhQVD73lYh7ix2Mr/v1liWu4g4UvA8Kupab9Qs+W0hFYRP5FBAgcx6rQbO/PIAND68RtOGVgjCm3dojPb5FpSoaki4fRU4+sDLvzASJPayGK6i51hgPD9yma1c98MF/QctSjO4h0hCsKYYQN0TyTvQLpZbyU8iSJmWcJcWZ+6+go296PqH+jKkKrRWfgX3bKN7ZS1c0doOFNiaRF41EzVHHE5Rk8w9Sot0Ypm7VvNd4lbnmrPeJZHdf6qwCBKEWnmchkTCekm1z1fp54HSyY+vT1esZ76jbscnMSBVnLi2KdHU7Gk9RzpDRela0bve6QjBgCe//pdWqwzzlNOA34J9fU+m+B284XWlqyzFNoKqjacm/P5rZCanEmsiYsnB55IjAikdjE9aNa/sW2ptzSEEJVJFnAamUo/YuY6zr55cdp39Wy1XupgFotC0iuW3kgbrKE75Tbq44WCK/7ThQ5fmBf6zpnx99MyiKjseS4O/1/bnaVYKaTN448oHdEeoXOBJrkMrfqGycvKl4C9HcYsmWn2rWiiPcUrygSf6GZi1mGT49vDobz6qUNENZCyy7q4UoCAGu71VG5vfklYAkiCI/Q9CDE38UpBV+k9kpgJIeDdmRyi7NYQGEivgl3nBWHfzQ4usFf++wD/s4Y29jEOltRKnqObm4Mko9C0W9FlC45V5QLoJv4rQsTDuH+0ziOOlYZdsSnymdGpe9C7vGk53xwmt83T5/3uq7iHLjAehgv8TcvNEoSnt6CxJYYwzAMUz7FM16YlXhfyoUSwSKoIMXsRivgmhABPE9euDxk3vEqjurdgJnxKq+1hySNeg7PXu8idVcVpjuVc7+IK+eFk0rbo9j6f8Wi0uo4i7Z7BsvwiVb+TpseHCS23xaFn6ttlErX8thwB8SblhbzITJi4SOGlJszwf9w3zuNSfvnpRitkblsBUcsi2vqXMQKxQC+6z1+4NKK2dbIyO3hbubRAgzaN0l/flFztOs/7vB6klumiMIvjJqJ+RO3a4fDhPjcEZQYYx19HCQcCElCpOQ+dIbZ/3K2fa1ReunIyH8Nd6l4zSaN8jZ/euyCTnjOnaOfHEmtIRRiK2cXknYQXZ4vOzByXjhZAnUcRdKBo83S2yaDdO5BPZPgsFYdBvMmxlJTxz88bqqJuilky69NUiOLeT3taXuIm0pfjE9mwUTnHtROkUti10bBg9hqxwj4wa7xKT3SWGGKQhsyzFNunOZ8+rYaSoScfu/9BuqTUkt6KZdUiHSw2psmRYF34EuheUxiYu2h+28Wxch+cP18553A6PhoMpbVABXuCdE5BEDmSkQLlJ8ztUeV4p5rc5mswHLwbzxGiWeL5otgyce/GjDha3MF52QbwL2M8zlP047lcnpBk2PRf0V5wBV4i6t0hd6DpZWzOum8M3G6DBMdFOUGLX4ExCcSeocP+ejrsVcI1nxcdpMWwpB5x8veC637BgcFPpcquj9+rrbhj7IZjyGGLqzuYGGOmUcLUE1rtlmO9T+Xz9VAyTXcpaKQPO/yw+Om0D5dD7UYS03tyh46QCNqHCfsmFJHmvPpm0+HhINkIKGZCn13I5grEU116R0/fpX03e/kDbgVeg9mcyhkCJ9ZT2iyO6AYhhi64NPgF5wSmYLSdIvlbJOBhAbdZw53wnt3tj9L7vMJ790py8prgyL8/RDtjMLBmy/k7U4TUBVne2AflS5Gpkagt4jqgvW5wctVeD2nzHwKJ+5jyHrJ/eYLee8azX3NfoqbF+vmxhp6DBIVDBnUq5tT1cF3tbdInhraQ0r2p87htuAPl6eGNjODtFWHZfb0xyKVyDpsLOAR6C16d8lLUJHCvjcfIv2dBy1EjpcRwMd/QZKFjtBU2562B9tygA3qguY2JtMbny8SIB4ocnlpnpMsirkd6qKVwon7BD70VkiJZFGLyzhn0SNRBYKh26exzUDwIk6/7WaMhs19zJf65TceH/IDf1DanH5pC0lMREPj6kIQkM91vp/i5p1zFJ0vgz7nZNINSWkTtY92deGk6JK6Xf8cDAIjfddK8e07143WP/zMcGrWdJ0MwhZozK5mgI7FqtDjfJPmVHWkkAQbFkdNznTrreEexJEY+jyftYSLiL7HyVyAyTAMw7BDbgTCZ04ap32w/yDu8TouXYKuGI7b3A40Ox61giSLAhUa6dX7TSh7T5uzvuuhzevRVQ9I1XyI1eJN8UM7J4yij3iGU9nuAyHy7aTKtZ9laJLxJLJfcpaF2GBe1LRXEqUHs7ndo9d7vvm5Pl0pGocomEtPAQsCiFJwxq9E2HJe16tUiBHV53YcsMVlS1V9u179D1k1jy7GgBzRl4ZwuW+r4K7gniO3ocnpA0YDbkTXpXBrRj6HzHmPJ/PtiUIJQlFpyZL6WYjuS0vnaOjHRoFVZxQa0rmfW6aMvPBOPJM/yS+eeXXRis4DdVwUVoAmDiL74uk4+7onHZnYZtss7j/xmsy48AzU2dJnIBtZICYL2zsE6WhJTygWaJkzZ2m8yHsSSQuPNm6VLWBI9I+/wTCjCP+ikt9r16F1G1AbccFwsBDsISadadOZOzZEjJ5VEhi1sbnygdW7R9e7PqBqB8PvXlVJ6YgejI6j3apUxLdqwr9BL3kOVpgLrUBSntbwvqL/FF1p/D3D6J8MljKSu29G0q1gZxC1oXgbBUbcqVrSffKgQ66U13yIxOXq8QXNsNGsL1Y7WQ/Jik0hmnEUWNUJogodKjtDXjKOp/WhHpD/FwydeaDjiM5sU1/UiwP5D94k/exgCKki9RtXYyeWZt5bNjgVeeRvUGndnPoD2eCtrqzdyjUTDByDsx+XEgN06UM5lDP4ifigWRqK1dtmJgz25ngG90Tv85Qt6iRcbJ6l3HfoxG4BcxYRJWGeUASSJk1tdsEnXwJdEk1/irjB6b+YYc54rb7HOfMYI5sIPjGMtyjGG2DXlaycd4a2i9a+KB7+TYv1/WxVQJ9TBGeYfFsTKivIMvNylWHBRn67lqHzCaGsstttKSFg63bLlZ4YgsWgyBJsQIhu79fmqDTaRwFBvhXaYCiem35TvXD58GYEBpZEDZT5//O7Tdgw2WjjfqvTF93INz8DsGEOVn9PoeoMzL7xK3erZDTFW6KmUlgSFES3Q8er1PxpH+cq+oF77J96izcg/uuxgZmV0GdAJAwb0nuGPmfs8yke6SQDr8CwJPXtwf5CaFPOwjeEmEJA4sx4sDlmWNU740u63iQC9rpAooBudTzEPGdLOJ7/GDJMDgrUG51ll6yzVYV24lWiLcI8UY8pCX9ImBxPAXOI2bUGNO6nJ5P3MjhZg5RsVd/24SIxt0evMkQ4HBDMbbUKQnCGyhKDooruJvj0qOHZXFWefQvduKpCnu6IpnX195F/Q9CcuRQ8jU56il9UL+p/ezvIDNnP1C0GaOPSV8+8o+rj+r0x5lypZME3XaJ7kUYX/MZ4Rlu4z/k16vEtcjHTdWSCN4OcZlPPP3w+XTQMwzAM+0wLymB+kDeqdI+DzGV9wR43RzyeWeuK6L+ZyLemezGga2GUOWJxxIvxjTlDBkSOgqimz63YyTVn4f5QoW7mI1e+6r5AV75YlbDQKn2UvrP7maRHstEgJ0UTTLsKTB2NT+M9KOTCtLbs76tCaItLINrYo7wZ1s9LXF2uaQmwhPGTrZsF+aWaZTU3dvm0QPYP0C6ObhsMEfQQF0gBErdlYuIvnf9x9vwJJGkDa4QV2PJcCOfGByH3ZrwCi3rujqfMuCXArALUC3bJGVFDnwywoWzMXH38NHlKq9pGqM0dpHEXgbbUCkqspPGYVnjwK9vOcaA5r9+xMnUUumzwMy0oU4T9TKNGFWX4h/JWWuLGKMup638nJILiV5ZR7saEisot6JGpXTuQIs6/nXQi3sjeUAlKNaCLsBgr+R47nevPdUgw4Crlbdl7ld+bQ0QX3E7vVgJvnvGix0zzb/Fht6OUkiBQaCPCviFpQxSim2Z5DEvucFfmpDQWkQLs2gd9/H2sKmZC7MFG7Q+bW8ajjU425beP+kFvduKqOZnI6B5eNgmFRGm06Agk4irK8ASyaQwuw8Pt7wzzpA2W3rNwQEWtE/oGl8IlfPN4dNKJGoA904sKse2nU7N+F+Q4AId7Z1Vtroh2HUX52Y7d0JJiSeACFHMzycD47YZrvXv0iflB3lg8WuR1dxTghaHWiFQJdcD/DJ7jjuftbFwuwTvxrQ4LRl5OwwNfN4/5mdhuS3Bgh1vz2Zn2vv2ZRkxjcdeQf9k8BZW6DK7lMd90yG4zIbXMAdAtIYFT9Qo6Fms4TD386tk616Dg0/LQRAVpLNSO6qQ+/H1XT2NICNypDVJoWolwg+gLGtI71Tlkbl8Gjs4yfJvAP2N3SXuyh/Kljpflzpt9tEX5DVtgcp7BeSyyk2yOAGW8ZdD2VEi7p7Jr+YYkIBheMXK1hHQr8L4t4xVqHB4/P/o/+ZQWtxyMS6ix7mfA8i2gOFO9WlG5yr3y+wuOXBqIlAe2/ZhG9jcarqfSPQ6ck9cvOnQnp6/2qrFTtPZEMSJusOFBR9xagCm8OJO/DKg4sBdAYbFWNNcrvqQdnH9eWj6BP/0S6a37D8WI2fnB0wtnzWKYiYWE/WPn2i1cSSonR9OXygoT1xlJfyZWliodFzEE2LDEgy9ygZySMFBv0IbSlGBFLPGbBMeKuVW6s2hNc63Vlja+tRHuBWTkXsnfrbmqvkfAIWzf+XbRTCVCsvb2rhMuHMbZeP40u9jN+moC4YBWX9vItuxEPOexUNAcxLbzfA7cfO8V9yfT95eHcTzAa5GiyiPa0yFheNFFl+lL6IkAFoCJdKVSYeR/1e0eLVscf8NrhexEYloQwzAMc+nvnGaL+imHd2bg1SNaHP51RfHKmMFgMZcFdhURpFk0zQmAlpNok5oF2z6iBu8ARk17glZ8Xf5mkrxsFLBjPAPdaNg7IahU4Gw/VpQ0+Rjt/BLVWcaK4lColX9ZuMf0o7tCIvrAcIKXLJlcJR3gohLq30Pa83bcwcmr/GXMt/9Y0h9tzvXnfOaazJjMHfDtOgJvzSthSlkKjaeVnCaZDJUQgem+3UN0Vv7GYgP7ICipF8l171howteteyP9o4Fd66lV/YpLZ3B7N4+lXUPjTR81zKl26Gglndc/I/FRDQmEqZDFPuNJ8nrFVhMcAQZFygxCU7M81OPa4lk9Or1uYnvWYsPNK6cc0mUyCr0u8iPb8W2Nfc+UjDk5nyhutci8h7dPfILeeomjIZYUBRX63EYj0Fgs+X2U9aClklGHyRPqf0S9nDi+rJUTtgivkOM9DJo2OFj4FMh4hPRFzu/D7OeJ6HDdcFigJDOfsmByfrALntIlqNEqNqTmJYMOqd4F3+Cbk67CbWPNOsD9eQpuEzI/xv5C5Wd9vd6yfd2EhwKvpO+dGqpHnALPXDDqSwkd+QXPjZ433vBs71ZlmP1AM5sW/4Iza05NXCWLXVxuaVJngYXc5Y8+6Nj5MnHR1WHtL/b1LTYe59gdZXdVqVRDrapjWAmSjpnVbcDf811wevZniJdi5cIscNjgIZVhZ33igSylxBXNR1Tl0y8Ep1lIBausC+QSh4tpbY3Na22VzSVGbSDkxCc5y+kBsU4I7VjSwNaf9LilqnnATQe4ZnQqQmFbJaRZopE4pqh1Ksc99AU342nYBd0Q+0grm24xOo5Y4X8LXoVIPa71qIDy50dHytZxXE/8nJySFdMEQlCK2o8qcVYDmjGshJQcpeSfgv7yZkhm1H96BERSlq2YwJLIdOcU+5TdeUoYIjqNGrzw56/b+HczeKKXJDigjMWeJ5izqW0fsPFNKgQZs8ZJjxjpVEYswbjs9xMk8M22OsHVQHn6LampDGYQvgWBGx8v4leY9N+SmtCvoC7wAAjyAng0HgSSL/eur+5yRuB7dJM2/l6D7maSIdWMlWyikTkFNcES0HIFguCZN/nBpd+4o44ePqXkgt6fEceCZ1pCVBIDoh+Y2w3Tzvzg5OYX33h8j6kiEsE/IkDzGtXoG/pEkiuKpJQOkAS+1FHEVvfV+tMp6Pjt9XxpWcuZelC+Rp5pKpfpjWXSy91GIF+uvskTK1DnChMnyu8a/mxiwcSkZKXfCi7MIKbzaG4MwmFYEUSElLbZbJ/r+3TvjXZfAJGjyjkeS+kShq9RzwcjKZHCJQ+2Zw89mY/DSZQ38sDiPGS5cWhDXTK/VU0ZnqR+xTr5yzAMofbHlHrppE7GlHBJp5jN+H1xqgbK5HDppk7HZHMZoRbOOHoCpegJsz7coWZNO3iSr6RKO3BCraxOe3QRpXo0BKLyAidm8Aq3zDJnuCc3PuBMofyDpyQ4YSIpk+AblsYj3qiVK/zIHG7wE9ZZIATUxBOUjUpF6AjIjDAQsiRCwa3JmhIalS1lYofsKFt2WVrKnpXJIzazVnnGTmmRIy7SZulxDQ8m7zhjo/KJG9lCX7gJj1kyaaAz+SFVnlQuqDteoEvqgZcsU+qCg8Fx2jHh3wd15BJv1A2X2X9Sj/zF/6eecI0PpIZv9W+ULTf4C9aRs+wvWU/5Zb4jjwzZvZJ31lt9pC6YZn/FOlCo+6QY+M5ovMp8q5syD3xmd80sPDi8DnRRpsImh9C4CttnAOVq/HmCV0DSrxxujRX4mDekOW/J5Y1Qly3xM/zfwHsKOUyN+0XJwSi3pZja96czqGdoFXTp8AkX5eaUhsNbmS0N1n2r3y2N1gl1AzGY39ndMsUPee25bjhRv/HH/KeuCk6T7mSre777l3Y7P+GalwcXLd7C680jMf4F1Xb+GxleDt/um5zXAQAAotvcVpSyEOtow1iKiW5zCpSyQCPaNBBwmwJqLgcjTYyytfeK019NfAoBO4mQjRBlOwGbA4boXtsjicIyeN+gDYHf+Hd5JX4GtaORnlqOF7M0gdJuI5/Yy6ivomo8bvg3VrydZNwnX4velhMUUxFDn3wD41vR9WAVP4D/mitcv/Rg3X8AqrmBsB2Aaz4B33MD19sebesd/LsQCI6sQbSpxNpKcldL/s+9Lms/m30Oc2fDp5DHxedHTp5PDy2W/8VW3iY3/pPlqX0jAE9TTXJMt/9TqlubXblp7spjG96ruy9P9GMoFsLvvH+oNr839tVx+L0wPlYn/Iuqw4FfWsVTvblBTwfOMtp5Oi6MeolO74+f0CCz9eYd0bOK4c9Mt+HkugigjwA6Q3CtETgMw7kb9ar/MWz46emyKyDxDRAUaguAKSAkA+oTnzn8zDGfKXvSQktkqSZcI8O4BMYC4i0Zs3G48QEiVYbxyzd8qVnSeeRzUwfrcBftQpznzZMXU5Lbai3j21U9jy8OydyNy33aWMXeSTmvtkiu3B1trtJI8eZdNc+aJXfu+dyFvXWsvF6YzCvMk3/+kdyztWWc+VbPf6EyBNKogmOdCjYNKthUquDUk+rNCqr30UX1b+DMkgcPfO7Si3WUjheaeZl58uoPye0sLeOXT/X8x4DCcr8KX9sqPO1N8QZzi+TG5Cnpf8ot2jNkMmZJnMot9LQ5ZCzxeSWf+3FVJz+erGOBL465hXBhnHfj4q+LefLXxmqeI7lHJ2Xy6MEyrtUWuWsv6nl3Rxe148UuqTXSvIzLvXtXJe/+WMU9a5a7t1TOu+fjt0+L5Le99TxzTHNrrxemydqvFP8V5rn/tqp5/0gcvJklB2vLeXM+d+5bnZybWH9B8il/HUgWC0QZo91hSZSrorPikwm6oDF4JkmjUv9i6liW5mVpfx7557ft19eueZa8JkEZWXdYEs1V0brjkwm5oNF7IEljqY70ueWRjVeE1zQfFmq7fMHFrR5qZoE7ZqHIMkvKd//DZzoxGKuQvksvTT1gWje9jZZXwIx1ffXd5jOmbGDzrS73jfeCFb9kSai4gkXMPFwYP03DJuLoZmJD6bImcsF5C3NCVVCes9fw6VyW4HLzWNut+lb3tq+9d95w96k9kfA9YZmZN/8Gf+kEka/VAP8eJHvpjqN8X9iXiW/zBRvZ770qHMSHf+ll8iYV+bc6wxdFfd9wwjgxUSUMuKWpbpZgw+3Y2R1bxfsmFueYY0cg6Hh316KAwgkcmhP+fRiqfPVQ/LJoQBGlgg6GGQxwpoIpQblFOlzmACfmmV/MiGa5pUp02XnmiZz9HxAFACCAInMWjiibvBGcyBYsObmslI/6vLJTDWxVQsG3gR+mx49tow39HaDHKyck0KoTUgCtBA0OTSKE6ndCkUn86qzF++iFeQWn5BNckbGSwuxPU4cYTnlABpyxhUZS6KCCWgUCcOKrWwC7BcZ/W4njo54lQfXZ6/iYWBWELTHW/9JaJHGt0s1GpgNi0XoVYLNFHZ8Du75n765qxP6h5+/P5VuY9mvVKx76T7nIEJRW2x3d61Lz8EXduvpFkQjx2UO8Y4BK6jThMqTeWfTB9IbQ29NQTLd7hsfqPebPugkGxEH/vyq+x98s2xizOYynpIM1KZ5DffSGELSExLazuMfp0xh6v6MrBvVVJ6emZ+lfV3QI1G8hfwEZ90fPlr463KJJr2uCWvU46umSWLbZCPsnDafORsxmEcdfcbmnLPXtamX0Qf43fXREf2e1n+kku3AmC/Z+jg2qKazU860oEjZ1BSG2i+XDWS4mMMfnR8Macxo+F/w7ngls34SQxG05x/4YnL69y2wO9cacLwi+7lwByaQq66ioB8gSFb96tGwMzpojuq+f8cfChoQe5R+teiKHL5XIuX/7bRBNIz+s+FKX8SNxqTNSg57RMlbJA4ahCtn/hG37IOGP7c2ERQwpDXqL1uNBfkaMCeoGecK8dhvUJ4gzOGdUILHDiGhTVsmK0aAOeHKrK+a9e1HvEK+wRVNYvCKVQu/RPiGscAqoO8izKceIeoFIhnNr0rrZkTpDn6JdcC+nDmNEXUIeDT2hvkHCDtvExMKOlBF9a2rqj2zJd8L4Rl0Z0ql57RaoV0NcxLlH6UgsDId2ySq5w9ijPhryoBx496gvRvwAW2OKS9iRaoD+ifYF4Q84zVH3hhzU7FiingyRlpWOKdUpI3UL/QLtB3eSpxhvqGbIPqNXqGEkvMI2CotTpJygP6O943G6uIJxBnVryFNWvbtQn424Cc5T1AdD4k8YK7RzxOQDY4OaV55cvGLu3Y06KvEBmzOxOEOqgH5EG4ww4ySoVZHnaHasUM+KSA/nrSnVqx2pe+iXaEVnyClgfKAuFHmM6DPUSUn4HbZvYRFI2aDvTJQelnyPGL9Q14p0g1q7JepNEdfg/ImaFImPGCXaVadLNown1KLIw8DG+y3qqxJfYNtLXMqMVAX6F9o/I3yH0xL1oMhhUI4e9bgjkjjoH29KddyROkH/QTuZIXnE+IOqHdm36B7VMwlXsL0Ji2SkHKE/or2afSquYFyjbnbkqTX3bqE+ZeJGOF+gkpH4D4wF2k2nS24w7lGHLALz3v2o90x8B9vKFBafkaqD/o721whHONWou4w8T8yOM9RLRmSK87No3WaknqKfQ/vdmXIaMf6jLjPyOEFfo75lEn7DdqZiASlBV5PGYzblNMXIqCtIF8yOc9QrxIHzEQWJMECbrKySW4wW9RHyEMx711BfIN5g25jCElakMugD2qiEDqeIuoccgtkxoJ4gohz0zx9J9TwjtUIv0L7VneQCo0c1yL5HD6gBCStsH8LiIGWG3qG9qcfp1xWMKeoW8tSr3p2ozxCX4XyJ+gCJO4yEdqZWyQlji5o7h5sn5r17UEcjPmIrTWFxGaki+gvahxIKJ4daDXluzI416tkQGeC8M2mtGakH6Fdov1bu5ZQwPlEXhjw26HPUyUj4A7ZfJhZRpGyh35kVHuQnYVygrg3pCvParVFvhrgWzl+oyZD4CqNCu15ZJfcYz6jFkIfCgfc/qK9G/ATbk8Slykg1Qf+H9l8JP+G0Qj0Ycul9yFgHWMNremxxlm7KwCxCRsovQ166Kf+w0lBD/lJTqm7K87LCDJSYutTq/CdJGdFypoLyKsi3bsqFmtMyWfkq91TW/OXLgZfn3apO6Ka88qVTjeWHMWfJkjlfDvyqTpf7bso77zmlZCifwrx1U274spKEueFt87iR8U9WRvQ9os1jNvyksrHVETTkMH2lWlBoTUqIWHEgZY6RRqDP0aEjHdDYHg01sTUCKSBIDOryaHJH5YDG95gQR/L4Rcp5rK89MMhxgJEqciTCp9lcMVB5Ve1fQG4E89+pUzCkHuKD8La+QaOnJk8tNsnT7WsxfoBz70l7LRlsMXLL+GNNi+EEHn4NxHBreh3Z8iV5IDDV7AGszQpABfQlAEjLLSSnHlyJjbd5oeRMPbYzcKyNH5D/gfRzr2S8DpAi/WAcqxduQDmHuwCixS5+3aZfDARTCdqxrW3s6PLQtOLfKLUrgR5F8D5n92bMLwOSjp0UTqRRD1sAkDFGfPKXxkrk7lsyXntI/ju49rE6OjEv9yEcf9w16hR/oSsPv62BOuKv5tfu28/DwypFo0EXl8cmf+cxfWes3zlI/4Zr+jdg/Rc8vf7eoau/F8ifhldnbfUGlSU9xoHsdQ/JoyNc0eFigYgLXf4f+fV23DbRKPNpKW0U/G0w7zi8FOWmewz6vIm+RbG5fax/d4dt33SIeF4H1kD1QU73ug7zuoi4f0/L+5/ji5ht+I92RZQP6+x4OudkGjcds8/y9XtJt49Ylk16NqIxFvIi23TOH7cv0T2GbOXzyBY5jc6AkCUSNoKKCYMH85zXFM++x5xC8BFeDtaKxTNjIy7YtcvvLpzlVEh0WUwOgwp0LL4yayLH4dMiJBAW6E88p6mw3t0pOoRvTqGcvkVvozezvrn87TuSRWIoosK2feagcdUBci9Rn8Wrl+OzDKhciGukY4np9U2cxi26Fl9fO37GDmscWsadjPo0izrK8+jn2B64QhL2s5NXe3SOyoffPqk/W9RcHh1roo70wh5naJGVGKy2fOknrct0Pe46n2LHoNE7NStZ9i2nsOZnOs5Fh3phhO4iynLlUqHfWIO8PqqhzCN0wLMiLISdXEIfmB3dTjpwbA430MHerRklJdAxFTGM+Jrt5KYOkrKUGNGMbyAGG9IZ19L7F2ogQi5gOuO60zKr0ZvqVmvCJZ4+WIuEIGwY+nGfNMWgfxU61J3RRx+skVAJakl5MJuxRGLIe6/qzX9uhzmC9NtrMWT6b0kzaGmTDXuqGUr/w+epWFCLXpAKWsH4RrOmvfzT18jaq4SPcLRew6uo1wM9fEh9suu8WsSbUdGXx21akIvIyrnz8SwFH+hIGs1xURGIo+rN54xZdr1LhlqWbumHAGuscbttFikV61FKgrDaEMLhAw0096CqjQTKAfBsrnQylmRBtayBq/mvM+XbPKjXvcv0NAnL0qF+J9pdpUWlNUbCjE5cqTUUliSYv2yRlP0UUGYaTge08ZwR1wR1kbGLa0DdiXfPkiEZt2lR24uS3rRHrizzQ7ec2kSjifh3U57D2tihY0hIudA7O8uMsvbDxFA8Vck2NaT7zq3odlNOl4/I1JOyskYIy4DM8/RuAsHhqnhNTEEYm9rDwFnuTttHW0TbVsY0lZIs0H8CSDvtat/0ES5wJEVU07oQ0k2oVd+WPpcNCEpYuZxa4tD1BnLQR8paqrYHYVHGazvrChhXIGmPvwSVjg5dMkDmfAVGltboqqxK1Js0TBH5wEXCXnra6Lv1Az6fi5YFxcYIGKQNJ2hy0EHZzy4sUXtZokmP/7bHRmHvFs6PKwSf73R8l1KzmUhsxqYMVZiSHsGydg1xOt/u3WgKSNJ2zuLdf3y72QTV+qXtUq3ZWKbevlU6Pi5G+yumh9bJ63ouTsXAbITa6HB2UPqCfM73B4CncI9c5Fqx6U/rrTf4Lv5BXUfIR4Vh+0JKqJ5hSJZAosoOe/qpS2scXCpv3yIo4+drvh11ILVjtjLUpZyQAHxWWoGkCWVCUxZtogNEDHmgTxcjSc0ANXNA8qr/VoNAfKaMBxvWEmh+/ZK38xkDY1FyqKdqUk3fvohNvdXfvePXkunGBc3sBZqmzT4uWSGubWhf37bHwhLpFESsvCzFtBFwaiKkFOjcYAxLFUh3OZbH8IYg1hUSxU5GRh5S44xQvkafw0FL/GEhYp6iJC/4Zfbpm+nwYaNf+6sPZYdptCJ0n+tF3+D4gH8ldwX8QNP6IWL4HUe23yQNVSQHD7tqZ3Ubxw5s/yTumCOD1S5b7pQng3ew1OK9HNVoT6tNOuT1ry7w/wpllJgD1o1bZKxSD0BeFgACpBh+u/af4E170qKY/Nj3PkKOnMWxGo4ts+L5GLpbgh6L1diVIeKwBlKrdNk1h415gGRtdjwYlKSzr5n5UPk+bPbLNiCa5oCkVR11lmoiyw+kxo2J6DKPOlpwrAgdO1m3lSbQRJLDe0ct2KJ17TCVsGz0Ygi0tNthrDrNU9boNP4Yi6OCggeqWxn4rpviUXCAQvRuzhIQdkci0EhxdxfAPJrw5uDaxNZOjL9H4oZTlWJGNAMWYRANMNhT8BYqVxWformrdOTs1AnTbAYpTKyGVhQ4ztx2YwTHGYBSsUZCE9ZAZS36iMNMSwZahpg9ixkxhni9yZXlvUmPn2573UilzO8Utlt56fiulbUNUQwofFxLFMiVNQ5rFIlU67UvbD1tiIiJ1QgbTWXIAdxnJBR5BP7odbTV3OO4+YlsDFrytnpERg7ilxbX3Yg44ZIg5kiWOGx/l2ysTCxCwngOTXYTWPHFF5jrKPProH6nMSWceGCK/saNkWXZHGtORPos/nzCYuXlju+PYdosYLSHmZUEIJ0q8guV0UY9pc2p6i47AxZ61ZmmKI+BSREhlLsrMJcCb30LiARaPp5X24hXg4Bdp6iMMOwNGJB0kfEKvwoWhoDDY5EGSLcGaQt9ZFBjwiZqtWGJefIYYGAMOFu87JEEAQr+Yl10NbQoj1gSElcGX8M1CcgJVSxZC99WauP779Hna/1bE2A6hvjfg2a+UAjAOkPXrHyjiluLF7zDQ6dMYjX44aC4FBIsl0uerCJr3WUkw7GAespxQEl0+pFps/HMyRXA/OfHTv914to2Z0Fl+rdpUlxJ71SlSgHGaYobRjcHMIzuKrIORIGIfOWK+FcMappvpPaMfKVQDSYd57GA8VHEhr7F5M/uCWKMDsGGBi1qW5LOUKjMvJHpkinY6fSeXnFT7cBkW6QboFs4L05BuWHHkGx5dDDK8SZIybYAxM/diGxD9hD5bRSZwoi9y3hlIBq9I538M3XChBysNmkfYlT28kA7dNET/qEA4rBY2E1hT75dPNrdAN/JIt9aTAc91dSC5aPnRpxSPNp17BZ2W/ATSsnXTL1HQIlqq4OCE5RaVf7j6X9/vtXN3+G/fwZYDXCRJ+ZTdWsiButW24fE09HJLOi19m3FBVurN1vf/cff4BJ+jsGuPWO4Sk1uPlcjp1ia5aY4wgoQxe1EwTE6T6+ELQCTi5ZsWarj57jxAkmzoa+27bDSdyGbCTiXsK4Go7tZvERz9e2Vh3NxaJYzV/lutKqGOmOac7WG8l4nIOnVyFFUuPyZt0WbXFjd4kC6YuSuHv79S6vOrUV5Gnk7FglJnIY0wkhlzoYiU5HFtgT60dVxlDVeVWnbvduSaXfrp7v0W6MUhM01LPcGETs1iKj89374kHsY1e+3z79gRg7L+uVIf8iBaw3+9umPWaSr/O+731hSPLh5w9wiuu4Oi3s31tm55q5J4IODBKHmfOU8mvd3fVpsDJ6tmg+PkT8Vxv9DGyx0hCJJOu1GWwL6aX9dJY8jOigNhNCv/HI0w6FCW3JukEO1+uzz5tPsBRFM83+yKK1ccODdOOl3fZ21reL+KYQqLjB2Bi6FL8z26dLsYPm+MLN3EwGxplxDEtcxA0EMdcLK9nCDlXKLa4bnlqFRx+vPX9Xf8/t1FF5cRLhuOXUbFrQA90lw8rbgy6k1LSgiS93esgDhQ7e9KQQkOxaHBKNseP+dQOr3rin4THVdrsel8jKr7ugeUiu1WW9iH0yxU6qqPChXjzb+7mC2vzw8PtiA9lJNBeFJir4inLiCmBaXDyOYkyrLTfCjFL4iSJVtnEPh43Xx8qD7w7SO298QHzPvVG1VNuTNfz/1qbbcMkH1qBXLzbEfQLzSzbGDL8m+TUkADSWkhxRQte7RbMnjkaM2CKv1rsyaeKFjiwMtt18xMRxn6xTZcTbc7E4Q2nTQ3sQ38zyZ09B1dkCkafCFbYy5Sjl5ViNlAcKcxUiA7KxRF14Qh0G6r4MuvZkoWmJ9ZLtTbIXYPVPV2N1ARtEIOuZAuGWvGWBsG3eIf220Lqe6yrFVDkmtBGSJWnG15rgu8t5CokJTs0x6uVStH0rRihx2lHwhpwMQXytNBKc7FGRzGBEzN22zU2y0jbnmTUYedEaBs5rgETJCv+HCFAa7T9Sh2eiiJLHDCzfZ0WyAMG2cmgGbiyHqrKlOqLc+FG6fzL4n48DvheFUgvKIzkYHVkd4BpAWjgcH6jbdG1SbeeIn3LZKM73JCbqCLdOieZggJHe25ktOf6/cr8gf7cJCUJql318mSQggOzm6xbou7by/irvzPf4MPvtWFNs0IAa31CNDLaqtFGVVJKObS/kUIvWLbOTUN8oQ0omYKq9cLG0w28V0fygj6j0/i74nRilD4RYcqgIoVZmOd1s3P6Vxx7UPU1vyNCsAcJrk12BxBrbqg6d0GMelBVkWdkJ9ix72j8BrafJs5L3iEkbFm12YKPq5cYEqJtp9FS8aFK/7j6Rsq+NtqbZpSHTM+/0konixYOOhdLBKzWmhKvP3i4lEr1wrT+MSDeASkMLyXoTXirzmAZ9i6rV4DuMpqHrliBYbfZWAJWVLG6ZGF8+E1alOvuCPEldEQseUnuKUi+ZnauMORVGlLtVKL2BQkWdKiobF1kNeu9xH8UIQH6kBYtLyCBZNLAx+aHq/dXktwftYK8/gisIQMU6bti8jJvzpM0+vELgwf1ULidqKdw6iaxS2Ht1YVb6xdQtnQ7tUXDifDzR6sSkRUfiswK4JJU6NoQKxefKaBCv69JeX48xHR6K8kZivVdwGRubUNq0IURsXDfpJKdutT370ZIdSR/qz0Ss+ifPK0afpMvFX4HgS49KRk+HkyqcOS65AAWuPoIHmTjF6s1K72glNiHCaNdftj8Po1UGDgrp4J7NmCU8AlkS/ES+4mOV85nhG5cpDbeQaQCCuNNIYs4FFhoSsvaW6bgck+HedVXUvKK53ZzcU8IRnWOi1mh01LyXYTvmUdtcNhLjhA0QIq2q1auW2DqUiMf7KaHNM26Rc2Utih5DS9+jxVp0ERs0w6hiGjNgZImckdLbJBXq4B36FSNDdCOtaOJ9MtQDxw9N+KXFf4eGqUp2kOdNH0UNlfkxaWR5YLCJw4qI+OCwrj9XtqFUEpYDUlRj4yChW93hkBSNmUWXFq93x8/vM9KIJnVQuGr8IiPcJCsyhOQ8x5hjctnOo27/OLg3DcLIR7YXcMe6r54k24r6R9+PxfNyzVuz59zb9q5YNA0j6F+lax4tCm5h9e2Npp/leo/Wp+/R8WUgIt68OJmTS9+6DUSCy+ra4Y2bpjChMxj4Og7Mr1KZobj9j4gUb9FdXwXw+2wJJh8lxF1ZRSTCGW/PmRhHbGOchx879vFcg4tJ6Zg5UsTYK0R30JUv3PckPnkk5EcHLlUrrANWt9IUEz4BsSaIP5+EFQZqkg3Vzt4jBZUU17luxjNFGQzz66rSa0PPbw7uveW87ApzlPtXlUlSJ2OuKPrzWhzDqgPOBpvsIV5d6qOwgZt5Zv7+yHCu/18KpJm0HV6HgOoS/fFlJA1IZMA3j1CHY0liMjKQM9BHDB0VpwyAyE0COcj4/QiM+3SB/17xAvy/78owrmBuPFL7gt60VjwPc4pyD8LmVIllCFuVYTNUx4i4rHQtwaBHcvHRq7DYqJHHZ/Co3X+yhWp5Zkx18D3Nwla15q9V17oA6Cl8zfEFJobLzp+gW+eFrbC9232+j18HHCMEDRxM/W18r/TN4Qm0aHcri8vtGoMr0Ldh3cFiB7/ZuqFpk3MZ24r2xRjxL8lK/xXSbT5VcvdY4PbGEovDW0jpGgeO8jyjT+8WXRfIuX77ufMn4hxerFJqkUxoxesvhY04UAgy0gh2LX5f9aCuBXbVIyKxYSb7gGmEfnmD613P/a7OKESMLkLfD2Y4RJWLEf488Y6uRMeq/oZMxZFaC/O8cMkaUiBFtvlLMqaLoe3L/0MgtgFBMqRMuf8BZPznZPdfSjEoxQ9HwME+ZFvAc6cFY2Ij/UDiTxA9YgRAteo0xqlSMYrZJhjfSKLt+VmojvZBFtPJZhAxVqh7KP1XSiNZ0nhsgqfiw+QIZh/NS3tLRgHeNKOjRB+NzQ9dasswOrfnL2XO7zaNLbZTYkZi8XSN0YY1LQicZlOZKcP27vKrWmnprkh6FqCBOQEg7eWARhLQwuYDAevvR5LD0QRPBoJHC32nMZrpewxIxKxCm7zHye//V8CDaPhEAGgBS9hazJjc54uo6HQIyQKDMAwYdfs7aO54tGXKAJ3mDgGwH4qm8+7kf0pVrx86mfORThm5oQoJmUlzrMgllFLxax8G+wZGBKWXFGhdpmb0gv0LKZsx9trZ/lWz7VYoPKoVK0NNmZuhsm4L70O16myS3ipSCQhSIxBISiMfzKXAR8IpC23EaJ+/9zV0ZlfZYMW2n9SA7rDwovMJzreoaf8cg1t6q2BQUspnk4+kuXy9Tt93Zjgzlf4vIMuZKvESDw2qZJoFNV7804p4qed54/cjYPrJEQu3qJO+TcPLXUMgo8DmABbnHyzb3gUJ5fYFXYZe4FCtmv837rbk3s74z1Nq8d2U1oJx6XqOh+kb6etO8UQs4GmiKoV0SFM6OzdGvhT9d2qZlhaPJSRMhN1xoqHjebItXnLGxivPaZ9vOZUU4MrSN1+U4tLMMwfl9Nsg9l2M/ayrVKZwOPOO4gffU9W5xlTrDySS7g+IYC9K+ElYLaEWKT0LBCO3XZ+Xp90mY2+jiKl4rvGu8EUD/RJPhZOyAtghBP51bAIq/OSoK84/Wz94yMxAxnT/O0DVsxvSgowyqjI4Tp4KxHrTGwDh7vdOysI9dfcQGps1g5s9p8QMrvXWTz2kHaUY1BvKF6eU4IKJypQnoV8ic0HkksdjToQczuR1Ud5MRv2nrs5f9UPVIGfup9a6U21160cxKYdaHn8/tYKEIA/MkVDUPL+TocZoy42KIPWQMUQxkwNPogFSaEyRTy8Yn8fEVzyUBkrkZFzq23EQZWhnPntgReu9hdvCh5S4PWOAmsXZWdaw1Upz9LrIJl7HqRF/d5YUqt29QsnigAAXqnBgujRw0INtmxTnWg5p4tUAxSyUHkWCLqTEHHK5J7ngUAGMHiEd27T966CGTCC8YPMQVLuSAKgX96pyx7oCTRIt5BXV0BcXXhCAXk2/PLX+jB5Ug62xdnVG+fD0K5tDjlhNoKrkS4GI0flyblZocr8VHty0dTM31OQF5xOL3nALUbVDJYviHH3NdnHiqVX8RydObxFlFnUubEymtys6op4MUyGKeyfWUqYcRdYMdeiTj2tAEarLTczriVQ13QaK/9+mNZ+gpaVEd1xgED2FUcz6VGD6ks1dVInh3JHe0nMMR8NgSBpLuZ9sezdcm7GPyd6RpMdXil6YaWfpcA6uLnNYd0MK2IvBCx70N1nHPdFRcasHFTdc8cToUqRNPC7/eQ54QN9c/KS07+IV4xckOfQNYEdRCk7Bc5nOSQ7n/IRTAZUIl9gqDn8L1F+PZUUi8Ro1sZBWiFmE8pKqAdtwrgGOPWSyZc3pNt6dafYdDYlQx+Yo7YmGNokbtRk01Xw3SOoEaGaiZc01I1n1GNurWMIYL445Qz8eHXsHbMjpcglVLoS13knroh7Rhgan5Ym4OHWcExKVixeQysHZGZUHJDyeOOpjeHhVIPiRBkagPS6WaahCbLRmzKuG4BtHzYfs4hl1y+hS2HdtZU99l/CKqSyMReyWDnlv0WC1FIIOQ6mskMEw4Ek4NqjwEVVisB255P48JoRlHo0yywL55FYGLbr2NcbUUeyQQlbQrJ0iYo1DYy48L5CeBZTpiyp20ka/2xt9autPxoZhvSqkqwdQ3q0C1zYTiP0JGMOFNOYE7oYFG9TGZEymaCSSTAHCRvQkm1EIJunLQ9uRzG8z7LVZk98yU2RjS5RFpHMjWJoH+nqppHM7HSHzIs6rffQ0aAWRamvQKJTwIyfgj+gKuRXVXDROnT8ymBS+4OovCb/2FWW5ImV8uhug51UZVCDulXun4gH6sPt0QxdlUBTs5tXXY30w1I5bir4p2fpgtGbkge+t6YIpZctr+OXzs7+Psm17JXALR0gfJ5PTvYkHExQWAfGcVygfeEzfNjaoxfUSVJSA2CWdN78TSKoZFKSQyVybk919kmjY8lTpL7PouyAVxbhf5AEyFzF59RIuvjM8cMInjwsP06orgH0z2fEkj+iWwADHpiOGxnI1vfWzCAKZnGjY2RTybEpoDLwQx+mBh1ue6LamA0bDj9xgTPpRVIyJCRmspnQlGFmlU85nUeJUEZBHf4DM7qLVbt3Ghio9cNS1aMLqn/Vi7nfrBZ/amkrpUWgkAz1hPSVdvs04d2ZVZlWJhdIYnKvHWJSWmgs/N0nhKK1XgBVMIfEKaLW4XKdd+CayXaeXFSLV/6Xr1pR05KeOeXn9RHd/m2dS3NlaWqbmdDgZXn2VVESJKRlGrmRFj0QQqGSHLzpP5dE1bP1RH4YW+fe+oy/qhjFpBT5YRsLBVYNriU0qWjLTxMVcukgRV5iKM76lUZK4xr0xpBgfQjdipseonMQJetQeMBbYdme7bRWgf/Y+YAclextSwU8wI8g7Xoh3qJuAULE3S2vdCDSIV73yuo9eYXL+RPrHQitizkJOtEJuDx2bdB9MTJCWvS7f0k+uZtFmEzOs0Q0rJEz09Q343kxlLPKEzDQ4ToAGhoK1k2o7mQPpn63llzDdBQxepomjW1FBLaV1I7wcJObhV64UlAIUBmu0qrDMrWg1JxSnOo2NNETuAyoBLOvBjK3MT8kbl8T0Z0xSlMyCJtNpmeJY9tEThRfwLtQFoQt4tWYmH9ReS6HEwi7qoqjPo45WCVmUZs5jZkpU2nlRyw6fSVjZi/BQAS7pCpRaJ/0S35w03WqAqQu6hRDcpmrNdVFQWwmlpthi9KUF/dfVL0QRlkNhOl0khq+BKLA47oDph+UQ9iUYrkkHzV19qgOBJN9CMTQ34qFisyK6mw1B/9NpA8DRilEFqDrU/dUHKI2JibEkzjUberUdTNXwS7Uf+12RgIu+2BJyw1pq85Ij/cTeKMGcs+s75uoja28y/smDNaI890idqPhrLVYc3SayVSQ0fb4XF+3oxBCrveHqMgE1KjNr8jIkG85WdkxO5r5zwWjdf50ly2AirJOFkSWoWJu6nYMt0jeEM9sEK7GuivQBaHt1NNMinRg8LkX5fPe0ymckxyF7iH/w5oHfkfPJIrOkrdPi2SCZkWPLRj8BDqpHpftwCuiQjP/7wYK8R3V/wH+Xq54BLL5XUQ64DmB7E9/aaPyqFziKY18ldZ16euorZnq7V4qmtsKpg4nwh6res9iLKwzCYCd+0ypgQxF/7eZHHjpPbYfg+h+595WTZGQSHe5oqHr9Fx8Osxq/fcbXI4Yb+DUeZYyozDeDhFpwZ5r+hZ023n+1M7+mEJQPhYNcHS4dRfcz0NubOJHIhdukAA0TkNAzEcYDkh3hd1MX71rkXeKr8gcFt1/Fd0KGGg5DnApLNlQNJ+iqwA5FV1aofiEoLsOy2ZMjW1PUkv614pM6c46hNfGZW5fe9A6tItNABnO0WwrgT3NOGHc9MC+zuV9DB4yJ7+2Xev/Ym1VOE4BmtsA1t5Dz/j0IpeVCcPrmGnhd8o9B1PQzhAcImNbdC/aHecfssnerYUl3Jwvn8F2SA330DUSDcQDaLo62CN8YlXhhpuOnASLY1VlNk9DTHHdmzalyzHcc3/sQPNYKCkoRQ5ciXbiqYcHCZ3sUQT6FDcZtKG6EXi4cBgkahvL3WodkgQJU+CAEfCjZrUbkqbnDjebitXJyA+5wPbZrfNuZuHi1gu4uDpy2nVjNkKddaGR15JBNS/ckNuqOTAziSUNCTdajmpmNwdL3ku11jokEY4keq15w2iMWNAuKESYFIIq/C75ia1MGvDjdJr9Y3Wb06Hal4RX6H7dsm9qkPKo53KO5A4zaO6GPIi/oumndggrwGXCEBTQzlj5CPqDlX4H/RMDtY6dnnscF43I4SeVH4NwUCWpR4Toeh8UObuTrhsnvVzYeK5YxWBFIv7QoQTZPRG0fT7PFp5/SuomDxNbNxm9H5ulX9EDkUCV79Dx9w4YDHF9mygWoW1OS+sV/P+dDadcP/PjipJE/0x9xx14vYKo9tLmK4SeX8VV0ZM3zE3OxiKxW3/E8IrMh72/r7XhfKPj7n8w0TB5xpvWjZ4dfD7RdiEZoAz/+kjJ12nyOpKA/Pd2Lc1Xe2HhF/aQiPo3j+q2Dc0feri5dXUw4pTnsYcL6uEbjuZDy/pjgFBwr9xBbks/z6eEPsvDtSd2kkfNxDOtcxvGDKK7k7kJ+g//zKY7571uY1hEe0Zo00vbtYS317M7IVVruZSaanQBZmeHjOJynjD9CdUnTQy6KysnUUvD5zR3Q9SGdu132+j2fkCZwvTOOHvsubHnVpL2O3QREcHEf3Tw+YwA4ls4HEx3qfPH/Vw3l+FrhesZrVFxv4C5GNLssdxektni9t+SCTFgM6sIGHqM5cZxp//lyHr/9Dt6MHJL1BoieSoeAW2gKEaepfo4fdHtVu8wvVgUdU8nUDq6AfKOzLWe8x/tItU25sTdMZn07GBqRUf3fKqRnQPnY7gU79WN7NnDogRvEMruRz5OnklNjC76GdXQpnHX8FyTpnj3+V1FMxov1GAnupq+zXOZZ8O8q2uRGFi/GKB/SyB/SSz6EcAvQgzIRiKId4SwCy2bpO2IJaj3z9HWhsxWU/EJyv+L6zagFgrg/ZCaCbGWO1vWOVGFlCcQLA5CZQ0Mr2G8eNnqzz3NgKnJecuRlLQG+QM3X0YQTWzjxhuFMk9kvl/LVSEnRAOeDowwDMijlguBNxmFKOlwrT5KCznTp9IZiA9sU8+Ih2UDfRMgD7a+NU97Wg4U7C3W+GS0dNTAFU6T6qDWzbagWkYU8h4AD5R7iBupeYUcYu4/AH6HN4IOWjSM2P3dgnFZ94hgG3W8z/up7jvudLsbnU6tbbG+icyJ1fwgNfU5lynGLrvQFrBGXog7IdcOwXAz+M7MO7wSUKyNn4G80XHqsDKJ8OIQoHiMHxPEEUDoloBnCrDqB9XzriKCRa1h3xX3jp55GOPWYMWm3Z9DSauiEW2+VG00SlXlizJIerNSSZUSXisHa9IJ2fjp4OnjLOYgkYhdyU/AvBS1QHe87R5VnvGDAjKcTObASYkx78Gnlp10/nKLubOKSI0dOYF4YcP+xoIZwxoDdU9+MFOwnRRFOgbeTEskiVzm7D1Yx5tdh4lVhWkkNBL6sGOyd33G7y+fF9bcM0qDg8bFBNnhxkYxsn4y2cHhHE3UmS8LxNK/W/E4evghIqBVAouaaCE2wfagAJTfYSffOn8YQMPZVwd0Jl29TE7TlFEMYTpkrGe4MQzxraYgj8+6NpdeiotZcdg3ExUQZzg6jskpk/OEOmfXfU3CBfq0d4yRsNTxUxcxaKpNt3U4lQFGehSqEfKbzwQ/Dda3JhhcCnC2WnUb2b07OLAEoddc3umkHVHKNcfOoDQqZxtF2qHsv4766OXY7iOJyfmeWFzcjE6xVv3i9moU9o2TmIdJH1+WxK9mwHBwiI2x1i9LkF1YcpvyDGZ07G8waDCMf3PqwKEmQEbCxLi5JTWM9rExWX8bCjqAHzB+wQDspb50A1xPI5VhqZCtnpxSllsjGBMFA+jobbXkc883cTufPHvFihRsKWjr5GzEl5rFBsUhyjqb2jN2BY7bpgS5zlVgNPVMrAWINZpscN7gd4QeHg53XAZbJ9kcVvS3saLwlArHWtF3Lw8ijv+2bPZtJf1bviBUksvL/EC5novdAMYnvIxyj55YmLkbzEgw66Lu9BQX3Ow7Ex9wvBZphQFXg8Dwlv9R++GnZTo7Y5Tm6Z0K4U9kEmtJ9f8q+ECHhZVvMU24DMDfvvtGCMLhx4PoYG4gUtrAFB78/PM9Jymd0SnhewPk9yNCB8wQ4B1oXNjcd2NC+H93tiF3kl1/aFiUoSo3MxlcO+41TQKGrwByX4D3h5ICm25DScPIxLZbe4toOc7gktrL516mI29IIU2gXloo4SEV/m12HYwrD1lWnPoXSSbhQzK39QGCYgMNyyItvFGT6O/OWRw77lP6jgcyASXjknY+1wMdyXly/Rhu2W0AjsCvmq/uAzYO4HfxeP4P2iYtzQLlnDhemnioxomaayiiNXNlK3FLsgAiHiOJxHjF5cIhEWOhHo4hLy1AFqTwHx4ajCOL4Ivy0rB2uRq08z0yq3FN5gZ8Hc2ETd7xaSRdFzdri+WmwZKmSr4weink4nutyrmGbbU44P6v+IKrGNuDdh8YTtHdcVpXfr3F1wG+OexHJo6yyObWzqGC23dv5AxhmfxUZU2gN2aXedaxlzXzqZPcf7XsD6FZsre69ytMEsmoOQ4ofuM+Wgggji1Aa3sscZaeCpVvtz7N7Jsx1iMRkK+0OMhIcJLrepfFg0h8G89JmFPN3BnZYDZure3ptLRc8u95tb50awiAlRv09+LDqXXqrGERFSSQJAHkkFNMBpD78cG1Pgtxa8Bxgpr1ghioy7qFt+Dxit/UhP6HWmK9VL+4NIyfl6+DO8wPpzmhvJbYZOAJY3nBS00Z8BtJkyJlWrNJPtlb/Vp/vyJ4WeIbOZQad3IORtlx6aAPgLbavDrvCz3NIppetTGjVBCwTko2FVEQnlugEd7o9dHEwdLorpbtAp47Kp/ioIsASIfl1Vd4pjscRH7a+6HCHK9kXd93skLLykx+XioCSzytKiBqMAwS/QBwROaE6Pa/AK204HRjyxJBVuJguS8HtgVn/IT03Tu4AvxGV9L447/NgJWiCVEf9+nCqameyFn/AbVU2ZE6Pn8Dm/fZS10eNfpOP0x+/RNeqnQzvgMsaRruVSqPVDRu5oEkIJtaadprmharOwO63pj9q0hJVt0B131AIeJdpNMb+gUyy+Ri2mESRiI7Yk/5OCbzT91mbGG+2fMjZZparWsyKkAS9HWdYlCiQ7HvCExiwL48b79UCU14cz+m4Q9TWrL2Z37gBARgtDiwxN3gA8OAcl58kC4oiNRTdZJgUol0rdDHBJzxS4OXIA7JpRlzDlcSTwqlRHm8x3z02K2DLXFUax3rEI/PqLtjDisZCZurwEj0mxvXLAdGgy6lW9qVG/Aku+dWVMYOM/1ujILba9bEuipjgQz+AYu/VlSxYPTikF63JCMuhIR6ikC96mxKoubtF9f1AYxPOTsSoLe+5BY1bqotm9j3AQ3bY/GiWL5mkEsLYrdB87C5qvnqPT0dwob7ougbuyPlYrOKrotAsW6oiC6FHpch0wH6dX1wk2UaKyAzGCO7Jk7PyV1qFe/faioaLMuFGYKVGGLqAnehQCsbDpOnVfcuLtcyPUnfdQLIRL0MzCBjD4MY8/79txSaB5kiOXXy7olpG85rM4M1HMyQDqjqDNFwuy0szbi6YVwNS0L5Si3WQ2tNHSb8CLsi1U8GscEPi10iIT6EJTgyTDDKowc3QK7TtM4QxFcOfCCssyjpsmtbCHIDCeVU1HMrtGRqPDG5AjbjpwyyWpjulFZzCVzdiJrRbNYzOMsw8yTFA+9cupLq2yV+6+68s0ChdRFA28z6PGOcEIKLVxsc6NFIxyPbD+BF3LBp+eXR1Lu/TfAE8OlT/wtiMgg8ht9O79H9GQgMS6S+7gs7DkJwF/11CmdnaMivEbvbeOOraNLZCfKQfphBxjmdJL6dQSGFI5gQjSvhy5kARhW81nWOQbNOJ+C2iwIexQSewiV8fqTYKR7VQnj+APwkcvDP5TF0W+e0+62VQRdAxRobwFsB76yrenz9DTkrPBGugdJLbe7dsEySXv1YxhCb8hmaa2iFZhB1DdHrgeLR8KKQFzbVy6PGTfY2iI/5Rkab2rgVT500oEwGVGMvx6cHbVu9+uxexX9pPuX0nYtvJMVHGZEDPT3TpW9shqtwCBEQYdsRQhbYUN/OaNHRcAjhBa3NG6ubKe6cTDg2JNbu/GmyOCxa6CFKweWXglsml5QQr5KMFhYl8vHKqKYKOZF0Bn7si4OQP60xLWpX7fHc/SHfuT8TLIaHnY5AuLdGx3N9H3kEmaHMAtrG5UootHpjhX7J4bmw6TCZ9ZeEe4OQUbfG0/9R8rBNvBFofGXkq6fKmMPTSWjwcD39c4d8b1gcx1xlzEb27ReGn0MD2YVr3I9GjHi3E0SqAptyroaN0pWihZKtN3FgBqr6TGZ3FhxkmQtyrh5vZxl+vZSBXC+DSar2Wcymi6KCHi0lik2KVCh3gWeWTXebDlU0F+uQ47Gk4VwpRuLRhQnYhgPbiSEQ96g3BEqVduMB77rcNB9TONSNwQx7ct8Jia0ldDK5b4yZZ4+SyMinH0mz8iI/JwkESknXGIZY78cdjiGrCBOxoxlLafJK6LPyePW61TwyHUrePRau++mds92JyFsmjuzNWeSDeTEGH7OkzYZqC+PathdxzEbJR40C7vSeZHyx1Qz54f68P8XM/MjzMLw+PDL/I2oRNWazOOoZdyMZzhaOxwzjCnovX47zJGDlkJwUpdayvYFlSqFtAt5dKs05Cdt9ro+tdl+puLK6HxZJ/db64OEMmSh0Lv0sCYcvFE8Pkce3VgSq5qq/fE9lE4k8Fcb8MASqYE8j6rrcFH63M3Hebk2HDOBbdmbVCAIe7RBXtWm/6GoarNlixPi4la1MtPCvxwm1K7JyKZb4eqUSfjvoW2cP8W5UouEXgkVHOlnWfjGayPTbOmtbdzlHzgJHP4UeI2luejw8Z5M45017wj0o4+vheDcR+FV6kMF1MFrtbobNBKzCxHpECo3Nz6NbgcciVbrfzSvs2gbUPrvdhTuXPY2daRRx/wf4zlUFLrdEyv4dRncmsKUhpfmy2hGYxXHfMBa9w3Z1Yz8eLY7QhH+RIQAOglSiUE3lplw639qmNyGfwk1e8aAL1FoQ9WVSlqrnL+tppLtsVcCCoRGTTUQMefnVdjx4AZTmft5nAKdMGMjro/RREQcrll2zQdMnIOM1rJ+4qT/+VN643t8OIuYLBsWmrx71rgB/CyKBo2xH7xuS8GE+ekylTB38w1ByT7Y0LnkB1yLky9NIq8swWCg5P1SJDWl4dU3vYcMgtzvSjFp2ixEQYLqA4iUQUVcKD/2P6Hrph1ANzw5jgNCIHDUrs7hUtkm1SWlxWJRWjZgWVw+NMy1osw8chUgQaruIfpTeB2BNmBVjGIIGeQNPnZOKvzWn7cTPCwsDvorQd4VZTbcwnYo+2Ig2DUcHa/LE98lNcWpOa+5urGZMdVTUKzRdB8IPsqL6OBxgjQu8YNvpPh/nscNlWs661cJ65POFM4dzRCH0nGOsE+8Zcip2Y5qHLB7Fm2A89ULg0nd7Z4ilPNIFfZgsbfUounfCiug7nHXe6i85QipmFZP+aQOfQRYGOtPy2IxF2XL08+w7OIWsfwh6nxJszi6nFJIffGMpKxKtscX+qpERwqqzPD7YnQEbEZg/iYEhc0ZSRAaXBAR9F6npBqTv66LIhz7AgOabjA8ycejRqluWAw9xc1MHzxFwLQlMDkWH0UF6y1ZFOgp62GBa5koZpTVtkgwQ3Lrg0r9VxQy9vkM669QJMatLS2NmSqj5P3njAUD5up06eNAN+ED6lp2Q9cMX+es1Qsp9jDO9x53gOTFo6CpFqRs45Ggs2bWvJAgMfFb9lwczd3wO0Hp+jywobEghFf+mXhMV74T7Tb0qJrqTRqSkdX7s12fAuHmwUzRbIYcvJTeHvJ37jHtCL1WsOA32kVj9eBJA+I6je5c6NjdNB+cNFBdiJFYRtTp2unp9Yf8HYjIu+/SIfRQkTjSDbAfpZd6ZL2JLIBPwCoDj/CweYMgKZ8mGf2CIj0cIwhRP2rjqefhx5KNRCum/BZ751XJ/vHGk0m5SD1rJ108hf2UC4+e8GpHkNtomc/YAPr0TUePRwxTPAddvQCoZdZ8nzVi27SwBHo5ki6ZU1ZG+l8dyM22Q+xomLCeBZzb2KbuoXjg60PdEfs4o9HOsieYpCGWt/tXltX6at9RR/mXasnkPbLseTbuWet+vWiRLCForOIdgL2MM8Eji+kYiGGR0hxLoQxUJoaxpaOrqKIniZOnK+Ax/wV2FQSoWYgTs8bleEmzo2HRUfV/SHrSM2owgfIFO90cVOJPRZOrLWKwwlclG4rqDMW0UYXmsy8M1ypwObQJg5usKyNae93v4qQzgZgS+5d3uWeetkfVs2tE866wXPS7TRRAwYx8kZdFpfk0doj+/lJr+jFbK9MoAiEScOjcYziwRGgO55sIT0bmCWJuhCGPIJ0SN/ocOdGsW5DKPer7oumSXJ4JPR+3VN7lIEMvjg6forTSHgdnbn1FmG0YpFV093458yX+NeE/BhxGcupBeqabZt4jIUiJEGaWBcFT7SoE0lrQnwFgy6NjHyR7m2ox5naHLzTojR7ggqxr4HR8jiQEyr0YudEEySxEI7eVup3Cvl3kj8h5ER00NI3n3TU7BQccy9PsNnSA2g47FTjjVue8s1bfzj9+Cm4h4ihtYGfOiPtcknGXGofRhB4/iMN20kioK6gMFIxkL1QPn3rjvoMMAABF3bXbwzNGc++BYyrPptyiplD88tddNwGei+amCf/Kbvlb8NUMM63ZHf1JvwIpcCVT+MS22V0hh2QbQ9BvOAe+qR542aDAZ97af57y8tm9FDiLxrfcjYBmUvIjBUoxOcP3rOKhf5JT9hUSf2ZlngMXBrN6tl2GqzZH1yYNjWdnuLxdcC36kmPUX9B9L/Nl9a7Y3lfwWRAecggZUaiv3yJqfWERh1PHxFb9+v7beIZz6ifV9vfirKV0T4Q/J7vVBDBqawfJnrblmWjCAhLR7Ux0yeA0nknHZUghZEXqSSWX6srp6du/ZnIUSZliQNft7Xdv1TNPdgUTdItL0cEsY6RHwqArL2GgmgXH+p2j5gGC+8zfyOtBf81ggtBGg03h5WRvLD4orjplCEC0baAP4+f4UPDqbEFGJW9cvufecfwZ/epFNrUzPKIydBRITWVNYvjw5lmkiniQMG9IplxfB1TKSIosUHw1zBsEE9ogu3b077iZGX5BGTQ5jfGpruob3T5AgGltL+4qF57tfg+w8MGNPaa4EWSJDTWCXLFocjXV3uFGcjoaJ6fB7uA5H8UuUJh7kdYnZeJW3muMw/MMGK0lApqw5WuaJLnToHVuCVvPMHzdMhmUNUcpyHhaX/mxq+4cGuHSl5rykzhkZ5yE+AvoVroTMcjdlckom+JH6eyoGrSm2fe8HojTeTHds3u1GGTpVKXcYUM+SxLWiIhqSDxGOUHEuCDRQv8IccilkgxISLI30NRyRSNvwrUyLgNMXyG29+y30lIUDqwlwO9/7PVyTFgQkKBWXtJF3rBKzRujfIYA5CMnWqSRvOnHyj0DS92QfF0Y2Z2qi9P7GGBSNXXHKMadfr6UuQuYcb0jZzjbW9gprXA+VL0/4u8I+zrjfuu8R3DbCPfKhizAMboJirc2Jxqgvtb8qbAiu8fXVnpxq92n1PiA5KOUHHUAYjfJlTQbLjVW8iHjhy4UcMnscUlh7hV531/yHxu4miCYIbd5pUrj5OI+8zIHOXID+/86Hpy+I3wBqn26G0ZRzC9fnRyrYjpPcJQdpTUUHdcK16OcIOY8Nde6gFmd06KLW0tAv7OZeyDa8WCQkqA8qEHcJS1BfY7Hm5XH4iVii1Mk8XJyZ0Gd5SA9qNoGrRctqugagstTPiZIvheHIzxSqsG30ky5sZx67ng1qoI3ao/yWqOu5hdAcu8nt2ddauL8mHl6TSc5W14OJ3ixJhtBxsNWxtSM4pR+zdSjuJMT5FUn8c5Z4bt6MR4XV7Dc4FOwcnajyYeozVYpLYUd/ohuD1Nii38owAMtP09Tpz+Xecnki1o95Eu43Yqqi1PZctzVSVzhYlX2rCivnVcOM9XvcXGDg3ix8jcv/sx6iZzR9uRMipzlI5VbLGFnr+PaEUXNczODRmzf/swdOk/DbBY8oCTYfD2mRldW9ZJjIZ4gCpJ5xAngiDSGYU3P0FJMbYKYFOjYEw+QyDrh4ed/P9SEAU8zZh0ST3McaSrKUULm2riYXqPhhAXpQU9XgyfRfdnu2a4mjyl8GfvOlG4wSZGxgOc09PqhMrgbznT4AYBMM7JgJNrhZOKc+/K4L5Y27NdSBkORzUHx6BpE/A1yWwQA3ZiAIKkb/WUXeJSiYicAAUr12Kt/T10C0oScmVbzazKE6NQ7MLB/qLkeiMMb3J84Lkh/TvS5By742SdEBt50qxjnHFtMrnMtTTGDG0MRN0gfvM/qJuxPsMkKyBKhurdKjwvXjWRLWDZqWILDNP+kds6QggTVn/CN+HJ3D5KxPrfnoLgU+Tf2i3l4MVswqjCjY2WIZZJl8I8gS4s33a6VRt50+FLxcre2Kz4x9rzPA8b6BewoAN7q/X8XQ7bwmjaQqkw3UX8Ftx6ZO+3FYayNPlKxJcSOLJHPDVM1o9mNVoqzCKtQOeUFm8JDhyABsgJoALYIvZCnaA/v6v1C496/HdjVpkxaF+PjJW+DyoJliuD2YzGhzRgRah407F0dFbMclPlyQDZNSBjNNa4h09dCkwVK1T33C5r+n4B3Oa6jw7Yvp+iZbWeECua4RMaQnUhQiPqcmwGgBkD6D7OOGV+of/cJzXIH+JBhVFi23HnocSCEwfm5AzqGG/bud10rmD+gQ1oswzw3vdMP1c2QTDdsgswXKGJMjK3feX5et/PFBuBLiTTDq4/xl9Z7XkWXxrHbTSDtOc97jfW+7vT5mu/AcjYi6p9QSCY1aq4eEu7clGWFjfJiVar/EizOFguhxGEKOPLX0sYYbundhIno6Jh+ueFYzP6Xj7nx8rJuMwgLzxhhmsWEb3G2AhKWYVnHCJJLwurBTAWCFD3hbTd92ZCqzE5IbC5xI5MDJ3MNdQOClOgFHeuUHteHgwUojx+8Qr6hkbt+TJAWEEsyZ1Xt9uF5SSGVy1kwCIam4mNhahPwYpt3DWchZWjeVTQtL3HujYNfT3tifn/iCpSjXDYy9Hh+CWiYIQSpQWl4uBO1y8/L6E16Rv81zeWwmK20JJ5hGEoAXDmPM6Gyu6FyWDyvJx1zKwhxJJJk0AWH7UDE5Sx1O6nAeXjiT3YV8EWJTIwyDxPuJEnp8xA15+EVMCSl6H5OI+o3SEYf61HWrN/FbxxunfLGm+gjU0GN3LMHCWDvoFDj5rfs+BhuIqhhR3f5EzkCt6ckS0WkLCAG67z51dzdXVXTx/VzMfFibYHw/SoeI0pG+uhY5IYqUtINP280BBY5lRjFa846/tvsfpby8SLHPjSdhE8uMJ4Qz86oiBS7Z9CTG7TC+UrrqWyt1qQ5wL0dXGznwXUpl8/uDqYIIrsq98cFE8mtEGEmmFcVP2BpsxcCJqzy8P0npppG5x1dV6sY4fGAGQU8aTo9C+3n1zOrdhOqiKTe8C6rPrJgLp1rxj4ngas10Ss3s+FjBAksvaNoykCFu7dAhAfoiNA3AhHdARID1mMAOGIf5rG+sKGnFUXF8K2eQWsTvigfMrFtfxEFdqpf5JXXb5XN/hBWnUAYwefOgXZRjgUtUQTYaE3lhGhfO3qD2rf++C8+rMmRq5KqzF9AMjNiOt4zCuAmGrX8hU7W5GX2QhKqzXqCnmpZJ99fwGCxYOEnjF3PrxsxqNtPt0Vm3hkvvO9u6T8SaTsp/m8kBMGUWKx2fcRTTAJW9qgfg8X3Nqx+prv+srP1/fTD4vwxibeZYBnd3xQK1OvPH4wq0OY4+9vD/yWIuQkwnlnGdF+Ht1CJvpF/YMcgJj670ONup0uixjDq8VFI7i8pNb4gD6d3uk35ta0bVhMmV0OSXzsh5DCzCSU+HUIYc7IrLOgikSmPiVcmh7GhsT32271l7mh7gexaETxnaxik2PxzKtesoB7pu64z6PRoZkxvnGvP1UetljnpsYyC2TyqALp/QXbce5WcgsLZOwqSgbyNqwuVVidgLeZM3EENr1wGV8bOejvFkdPJWy2q4tKHqhq+6OBdPAr5C7SiY7CuucRxTWXx93+AnerJwY0xjGgJ+lkZzY18mZgY9oghqytdXOrzbw+hCyydd3GomQWQ3hPFD3WBH/vEiGfBGmEwYjykU4001JzyJdOQUP6oKkgz+1lxAIHJbwLr0RmunEyLG9oLVzldD3K29aBC7WO9LLa0CewGYud7hB9wDhjQuFTHx8hp8j+FZuLr5RvGgDsw+5itMZjQyy/HIlsP0SKMEtwEmi7x//COajPUIX9LUa/bvqt5shf+dPLVzGL24GEdXnQjoPB4r9VG2Z+uDXRVDpv/LQ7BYwmuWCFj3Y3G+W83SqrO2cISNixRSS8L8SAea2+faHhufLBZeLat0g8NCqc1M9iZpJbo5keVvEq8KwErwC9iizLta6Z2MVFptptu5lbf1mAWiq2z48FqR2ZHJ4SlXL/V2ocRqHK6OG6SS2eHT789umn6jbc/OZOz17yAl0eKqe8sHajr9LFTAVGMbcEOY3Mwmy139a//GAYyhu2P3QXh2WfbKOX0WOJ1PYNzteVelHM2BGRF/1FCsMefbSAIykQVPUsM1jrqz45IuLH9JdiweG/2mNn/EVMWR8qcUEhTw4P6OzAzuB28OT6imDyd9ZnfC7tkkf3OY00a8n+fY996DK1Mchi5nMfwQYTnW5G8i6SyZtO6ArSb3RMQo4ATo/WWgc5jis75Ej4M+kAs/amIv3E7+IKALyH79F1p0hO8lgCu3k2b11Zvkc9Sa0DdTKWBPcbqUNMn9Fa9SCsVOjGk0lKG7f1r5qLHCTnNpAeysu7nfuS2xQeRjyoHOviXOMJHXTIRfLQjacfvBFrrYCgUo9R7rD22Nx+HwGczu3XnIjNV+sP30W34h3PQs60uJ5pZo/VfwRiqwKB7MPBPC9q8OEnPn1RG4liLj3ewsxeK8SdllpOyFHgm+g6/mxw3/y20X8F57Y8Lrscuwm+Hyjz0xWhz49SFn+oBrlqADVBAg5ytFyHkTQeT3IYHPAwlE4QD/Ljvn5uAs5ljhVn7GF2oDHXSGbA5sgD8nDXHcuxZhfZpqSaowpeGHVTqcXuk2PROHK77D9WPx08nde2QhKK6aqOu5DZqUNRS3GHDTLlZN1IBy3jmWa3DkR1MxDawSGKISia/gKlRwh8+W3uT9Kypnx1nfHIsq3DjHucrzA2/I+3GA3t6nhFbsL3fISCfPdxnbBGOHnFsZE8erZHKWtLWkATqsfjilhMIjjPjvpgyVXUFJIXgA7OjJ05EphG9urkfrn0SGqw+RB9xm9xO+trmkcBdIL3M480GXk1czxs78L7SPJXJofSqe9z4d2HRopuMR2R85p86M3NS29oOPhuhvhlZuurJtS9oupdJeIJeCAga+UeYBc8GfeLnpQbuGizgU3V7XGR2sZ0PUsjDNnbNRhwPxb+anLYuIgCy+McELYGMSRA7zbfdeTTv+4ecAxnnalcMI4nrV8W5ZH7Wdmawe6CvhQ7QUHwQauwegcpkWkz6Pb07ZH7uE9dGhtAyIdnbBBjdmLxO2BpvPQSaq0UP4RhkyqnUu2xyXx5Rb4NOitrdfiZJWPc4/OIjt/8OZIyYP71Epg9c7NotIYe6eag2xNBO4Hvq0ADH9FkBDkEbMDQZnD9iNZ7YCOwUl57AZFl9KiwphgBBo4yMZ+7L1iJYkyeO0TIAYviSEgZmc8ujaGJS0aa8cvaayG22vHc9c6rHoKUdPBNUYgO+8At1bsYhBt701pAmEHEJeMXdYJXHmH+FrLJPxqyxF3VPn4QcLRPmQjYv2VJmyfofySvrA5WnrCduDzqdnp6On+VpRSt/CE4a1Fsy4aLDhR95ViWkEvYXTIytjdNvn0674MFbuz34Jwq7nsHK+/RP7bnQGyLZS68Wz3Obz7jVnVtZ+AuyBOMjP87x6KG7FIMIpmGL9jjBa76rRW3oZdq4G470oNhrR6WzlvuzjL/b7vsTBqbSyNuauamI8u/K4WnuKft21b42WcVydDNtPkyqlnWsAP5P6NcosadTy/gLOfOOEe2Pwgsh68CHdcZ0AV6c8l5UaBpuuAMIMAOQ1TCAP3aTrgFzuo9xJX4k+bb732AX2obn8BDlvWMC2TER5JyPsKKimw4enubxxsPY/vgn7cFR6GrkqaH6ZHhP5IsvbSECveFdOHOVOLKnl/CI/qdJqHdmHMsOZGyXkcrcitk6dG2xYnjRyU4QHeu9CC8sWw3hvvg8TLjZMwxBiM9osQ9p8s9rKJyeKg6f533BHdSDmtx3FWNTrFe8JPkU31I08AX9aTVSTwfcRk8Z9ZkTb74Iwbm/BO5UT53ty+MieKv/IZ/2IlRavdr4Pire0M4MU9p4y6bKI5h6vDwrf/rhTbCy3PPwef6Y93oeZeDsCvCOGvXksQwDNfKH9Rd4FfXEfDXMoDX/uqTf6wQF2tvoAeJpVT56xo1RlIozwZCol5ql+sgGdx6fPyMmio/BQnR3YsWPNuIjDt7hw1/JNEYx6umuPfxaL/3WKzLrX9FM7TXhsBB/SjfvSzvN7DtatXtoCBUvrBeWN13HMMVU+GDV8bpTDdr8E5Fy6KPUu7LRkVdI+ifUZAPxm1BPIFF4KZrG8EW5EM8qWnQEB9YwydMF7DsJRdsz62dxSaca9tv25v+GUa305qLxkgpF3z+7DaGz1UiOK++8XSXklNnKhuEi2DSbvXqsxFk30LbsIIbJOtY+bPTb1zTUmzu4IO02c0cxCsMb6UIx0zBnxLzXFK90sMrD6eGrmIopLk2B28WesdIwV+ZyGe3xpzejG/kdLPap3jQ1QaKVbZ5pR8M+OkXGFDZFtOPzxe0wda+lEZdRhq13pPcaz3iIhfPzfhx+R9I+ocMgta1EtVrlxAF+hpZ49+ni0WzI9ExfdHGTVUWb+3TOjbvJ8du//sShI1d9pdqsOqAcE94fMrysmnr8UcNujOX+0URsw8B7gVPeSP0vw5vyDzYIyxgmecxyh8bgl5fOTf4qlgoxTk4QChPjyP2p+T+2EgqCDtp5JuYvpb6lcZ489aPGkeMQRxSVgLpC6/yzeu9oV4+pcCzjD6OryATN6xF/a0oMRG11eZRds7q+bCVxllDpeOUP9tHtsBLofWJEsjiLaK3vjy/8TGZkdGSPwZHOkC1L59n0YIeDRCajlecM3yc50VI1D7mU5/3Zicb/3rrAiPzziOlzYufTjQppBObr/7Oy8pb8p2yBKeP62e+9+pL28vd5ZybPjaRa9M/7vIbz+RabNIdoioZbGhFFmWzIFANvJuwW20/dL+wpBCRv0KFZhbLcP72w01vQfulGv3lN1KBi7r+9mNi7+AsIk8TVa+236oDsWxn9p6Ca7NMjNUHHHtfPg76bH3KTzUXEpzQ/M1p2fxYhiLb7bKdi+I/jxBeI6+XXsOv7g3uKS+XcztQPecRY0mehfMf5rTFsft5RXRwE4cKC18damcPV57QEAeAodCEERWYlk36P9nsWa0Ot+h5318evufb1R8/a3sM9wGxSv31VpwQtQqh4jwyGX+8b1cPPXRKH6bEzRyjLpRCH2dcEQ4hY25dXkUoHEglayW0lcQ9qyften6KO+MSHGIEepPX+zlaGml098XD87XJ6tDAugertf5OLe28kl6MlXaFKNtZnWHBNnbXsxzMiJE/qbGa3Hp2a1PKcHUdfDWW0nr7E3l1Y6lD+eWLTx5tzSfJ6BOc6lTYv7+jfOY/xYmSMDQ3ouBRKNmI0n+ofy9J1b1ecgx9WOk+RwevMIcphi4TFmMNz5MKHebmuPKJvdCg3Qvqb+rlo+dHFq9132bm+lj+r7Ktx9B95ofLMDaWBy2zZhze1k73dupO7N/AEgUV+D3yk8+aJZOLvJouwwrt2pkRdrYSPdTTN8ttkCqemzwQoIVG/+mfDp4JF3EvwyRibA0QtQcaaIG9d3Cu2C5zZCHdNzVMFRt8dJaZTPYuHHf6z0lpyx30SGAyZP2RwghdTSgOaoCuUI8mZ1IA+liI7bbNjT8KU3EFR0ElL1GQ8uRaT/8i/svFZHY+FVaeyuEMZ/99sY0f/kwPraCKep5oD2sA0Z6Ir3AiOESvTnZdJJM6YaCq/jc0j/Kriij/hyjq0heYpYe1/DNndjmXp3/rGMVmPFPlAnNzvSl+5RI3zy9ZWf9RtgyJ1p69omWzVB8qEyey5q9dCMcTuTG/nOm4vVD44mkvNWgrof3IOW++1Rn0paAZSGDD6YLeq2DA7hBcv98BQOaq6ySxTR6F50llWvvRasaUB9/Lg08+2mEzKTmmpZI5TlwXqTcd+t5Lsbq8+e9nhRI7m3t9MEX8Mps3aMiapidRAZudA2em17RSKahGzzX1OPROSU/Lpy/4gdh15WTL5CnI6nG7j2ftrp8cHVp6zeHXIHcNgd0uXfkfWCeGbT/qxRyW5CCsylaYDSthdWB6gO/Yl3Ip9OkfTwFR94p5P3ii6MjygLPgHaiimWX1Foyxl58WtonynRfDOlmxF9G26ie/ZZkU6QmgtyW/24BCH7Ady3nGvLL4/+vMyoVv42723pqn24bNqcec4OA8J6XjWMtV4H5gT9Mz/qYbUpXtDfkvm6J/RIahFwx/7cNqR5YSem2Xmm1m/XKGvcT868tz3y+a5KMw3OHt4i9IQqziRmdb5vH97RXTQ4GdRWDAv2YHJUcOnQ/HCWBelBNBDVkMvUux+w8FwiIRhg5evkPcJ3cOeAKApoQIDAQfZE81NfPPUbY/yy2tC8PRj/tvioU93W3CH2/QTntcZXFX7V7M3s4R+sFv0Ptg+HyZpHwI6+cwlczkcPnpFnY8jNVpB7n8mWsqNmBYnMQfkxd9wW8Jv9e8kAnNSwPtVQavhpWDr8Rbtr52ZdvQvUBK3fXjG8iac9PR395NPgVveXzWUL2ZMG2sCtpdCTWtiC9Yrx9G/unOetnqpRa6PsOvSa1GW86Q5rJtsMiZPVh+BYEt4ytpchOcQdCDslyi7XHoYPpEjrKHpX2dmfbFVbuI34RP/2WGa5HUbjiT0o1tKSOfCtEkxP1d642U5Em9+GPvqhh72/K8rVg276SRFmOM+sWVcwxheVzZ6X86DC7hHssXp6UdKlpI3u55Sdn10uK1rp+kwhqxn4tE1joDXP9gL6gjzz503xMj0KFRJ8g/SctT1JJ3p7Tvz3N7VLOnYWDPulMHeSfAHLlBnan41M3zbt5gELqWaMGoCQSJkQbo04nfXVHs9XfkjUM+T3/JRxiC3XC6f2voK3PSDEfy+ehjTN260jf99hVOwog9Odt4eqD+7roWPl6ahva7Z7B+TSkAGC1X2W/05Pa8TUMb5PBHz/hfzNB2V77j39koRcz+BMcwsOi6W4hIt89bjOMP/j89Y2r/kzcvw83wZ+BnPodw6wTfUeSYA75HAJ+33kIKsdZWz8r0GSSzNUczmQFM/pmzOmysfQedWJKidzJsbH+R2U/LjlcZo8MI/Ituxzacsn2CTt8RDk4v2EUsbRvrFIDU1ABsDiBOYj7hPnA9/lvsRyCIHtrEfbJJthn9i/6m87+wqpvcX9H+xrH/lvx1xyonXav9qJZ/QiJx+CPNP5n/dbnZ/Yj9bCanIW2j2u31cz8GwCvs8pLFk4n1sI/Fet+GgMVQSqb6ZFAn16sETSs3wsmqeYs+vFf9nb09nf0IT9DRrUQHAM8F4eRbnfSBxztXr/wVW2flUfLUzE3CmLwGqfklA20a3lJ/f+YFdNhP2JM8vAtihUsv3715QZ/yvoTL9AlHyq+ueHR8DJQRl2Oo2ApgZUmaAN0y5hNnascYJoC4OhcIrDkInSHYJl6ZQINKF5iXGIGhMMcBmlNprMF/c+IohdhrF1RHN3n70yPfsjR9ZIAtl7CZBkXrqzMgWDNVb2yNC87Zd/41pY0uCJcT0P+jInAGnUPrH4MtY1I9kUZmPLgPu0MflsywnT8/Ks6cyfKRFfItjZPgwyfz+on3+O/t/bneJ9Kpfe9t0g9mxsgFIgFhW9JhsT7a/mJAIHwVR+jw+/xtzKNJ1aUnF62hOnFOKK3URy7vq78O44TQ8roaOlCmG4U6dKIOAt2/XNxZ9DopJsStrvFB/+ZhVGLycRRE5OTWlC+62lKNaPOC/bYgrlmjErOa3n67COVKgOnuIVwMljT3mwx1f7wtGQYpN/lxSVy10Jj+H1jVpPwHMEK7EVo/q6wDYKRtEQFbO/zPfe2CKMmKqumGadmO6/lBGMVJmuVFWdVN2/XDOM3Luu3Hed3P+/31vFIYPbL67Xk4nVgo10l6N4CsF3G4Xn92b3a5hc9XuAXAvXFvd7lD2c3PEVWj0fT3vv+gQKj+lHCGvDg9/vCRBh12ibJJ8u3EsacGWkoDzJJvdobmeG+1A88ESIyCxIf3zYf37YfnHTJ+nrRyJW0Pl/p4Wd1kBXe1qM4NaZcSZdK3BJzbD1YmbvmtNnIeVSsKwBMIHu3C+Si1JYX+aD29jRZVYQHFE5vy2ptztib+Mr17I7eQkJ/arYTWAz1uSWZm9v0D5wmppQ5Xf1jtRLPZQ5WF1aXOwSxDip4/jYdsEqjosDY8Xs1OonTtfDXMwyuJkaF1m8uU1c84fPTtrIIpSu5lH7Vd7T7TI2uxBnfjyUQt6JzTxa3vGsAleGi0rhfJnIwcF/th3lsIiNm7nZlxOgUw0BJNNl9D0ZW4dTKWiX5eHx3Yz5i9HL+DZ5SszxjxkuTH/epW7dk/xp2TQQcZMS4zTMMvMPnLzCy0Exuz8a/K4J+F5hHVw8Tk3vrHZ0j1RPXWT2girwtyusZITeDc7iNSXeFl9pSAwm9wVEtVIFZnSKkss/6M1/4ToPsyTjs1PsN2WistG5Qba123r2X1VnsZCV2VXC4PCYpHNJ7L68HSbWCWUIUIx8R4VW9cdmwBbDr2ZDlu7yIhhHaqqaU6MHod00x7reE+SsHktdOAnwGHdP1jCv99lk8AHm3W8HNhVRv2m8rp79ckF4cECs5XWu18aP3aUvGoVAxtDqsuiySl28iOTWc6DzAjGDh2vIUWnETdphw7mVEQJxHBwe7pYTgrYKVOIzd29upS4b5Wn+dDGOXWuIW0mXARZ/VFPkJTApCQAIxe6iSosyGo66t9EkGigjMWlu+0V78Qi7Q5WL3X3uwCELoMbH44h7ct7QEH6o/5gGpZYs1IYF7j0y8cQ69goSo+h33eBSdJu6mLGXfJloiXJwQa16+w4eA5q3jhxkHBTwUJsL69/W704vj/1wMD9OvowtTe3Vny6XjgPqeE1E5V8UVHMwyxCc5I9L7muwJ1GrnWt+1BT1yCMxLPf48C+WEmSMPV/MHDQQYYo24jWy14gLusSFKnkWv8J7v9Qv6pLIF4gMyAWEYwwo0q7wQwS+IZCYnSc9oYHvguwB/gzaYNk/eplwAkJAADdU5uCG109m1KNCmj6mVHcAvpyVrS6cr2ow6sl6TUiSn7TYyIlJls4ClFYcpM1l/O3HwCdGJA39824SMC1c8HwtrpXhJe6TSMDcx5+lV2/qWWQE45pZXKJ5FYPj5jFkSzASNe/F7/w0+AeQ1tBAtCnT3wQZdharHanVBNWFO3RBw4BHhiwEknsf9JMoIyAicrStdPaKDLNK00R72lSnCmKvo//33hx9SC82Id4pdFgrLbNOwGr8L/UwG91EG27WJUNe2imWmcUH/364ZpBOkki37Tuw1nhi8TVswA4zHp/izkgSyZBCO0npos7YVKqPXmtL9eil0z2Qs6F3SUi0qeVA1BwF3WMYEArXBcifRceOQOQL8DoOJxa5qvAF5BVcMI3XTSADtvP5d2DklvCUy9kKHcvRZPl8JT3oDuhhuC3jL9F0idMXck445HvUzrWXW+82jxbx/Jf2dbGMER+Jqx/eDy9F/kcT8zELB94yIbIMlPuaLAOS5jRCD2MJV1DeRT1pODmQYngLITOmXo7L+DEKPYfIs6Z7IIMkW486iabX+rv9GxZuGXmEUgxHTpgOywZXCqJrHs1+0vPo11i36bDgsGW5H9up1CukAGKpPryZ/5Y5T5/7AJRrmgCTc6TRDAjnzdWywWSLcXC06iHjkxJZQ4472sack7YZjRi6teVB2BrdqPJsyAbT+wsTN+t+q1uFbG7aoVq6oRGMSEf84YEduai5VdaeJYKD7DNjndyvF1P6XYRwVQdxWh3XQbBu/3bgmbLKRowGY6TA2Z3XV4e9YQI4JT/8a0gaDFzcPDznLmFjsQ/60xt3JdqLZWaTOpSeq/7FTNKDKci2BesogYcoi35plHnHs7oWR6OfqHjUnWLJRKsowLuwILs0OILHP54l4On6kc8R4qWJ6bFJT1QCIz8r1Y5hkDJIEdBgvbWNyG6ZO6XWf6+4tkwenW46CILMt1q6//DJt7xNG0Z2CIAq5A+e35U8oW4t+31uhEUsvJgsPvl8aCT48qpoFAtTaS2Nk83LSLe181Uo16fC/HNO+zYDIGvDhH9Op+j2NkPvmsn+gzKwGVf1D8yxZfKjISx4Ko8Z6fGwSNeh6beH7towyMRQKY9kAGHb/F2iR2VNkUy2EQoKiOyzOHgWBjz/VXz8ffyn2LBsw97BTAQ4/NEK4kzJ36BaEENtCuKz2Bqt0OMqfREgD3Ovyji9oXuo+74bvgJOz57Xf33jvM34kfbIlxkV9xilAyyabhpF3gwizObhiDzPMjn9q2YJd43ros+vk4bacK","base64")).toString()),A)},42357:e=>{"use strict";e.exports=require("assert")},64293:e=>{"use strict";e.exports=require("buffer")},63129:e=>{"use strict";e.exports=require("child_process")},27619:e=>{"use strict";e.exports=require("constants")},76417:e=>{"use strict";e.exports=require("crypto")},40881:e=>{"use strict";e.exports=require("dns")},28614:e=>{"use strict";e.exports=require("events")},35747:e=>{"use strict";e.exports=require("fs")},98605:e=>{"use strict";e.exports=require("http")},97565:e=>{"use strict";e.exports=require("http2")},57211:e=>{"use strict";e.exports=require("https")},32282:e=>{"use strict";e.exports=require("module")},11631:e=>{"use strict";e.exports=require("net")},12087:e=>{"use strict";e.exports=require("os")},85622:e=>{"use strict";e.exports=require("path")},71191:e=>{"use strict";e.exports=require("querystring")},51058:e=>{"use strict";e.exports=require("readline")},92413:e=>{"use strict";e.exports=require("stream")},24304:e=>{"use strict";e.exports=require("string_decoder")},4016:e=>{"use strict";e.exports=require("tls")},33867:e=>{"use strict";e.exports=require("tty")},78835:e=>{"use strict";e.exports=require("url")},31669:e=>{"use strict";e.exports=require("util")},78761:e=>{"use strict";e.exports=require("zlib")}},t={};function r(A){if(t[A])return t[A].exports;var n=t[A]={id:A,loaded:!1,exports:{}};return e[A].call(n.exports,n,n.exports,r),n.loaded=!0,n.exports}return r.c=t,r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var A=Object.create(null);r.r(A);var n={};if(2&t&&"object"==typeof e&&e)for(const t in e)n[t]=()=>e[t];return n.default=()=>e,r.d(A,n),A},r.d=(e,t)=>{for(var A in t)r.o(t,A)&&!r.o(e,A)&&Object.defineProperty(e,A,{enumerable:!0,get:t[A]})},r.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r(43418)})(); \ No newline at end of file diff --git a/tgui/.yarn/releases/yarn-berry.js b/tgui/.yarn/releases/yarn-berry.js deleted file mode 100644 index 5b20eeea99f3b..0000000000000 --- a/tgui/.yarn/releases/yarn-berry.js +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env node -module.exports=(()=>{var __webpack_modules__={49775:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/plugin-compat"}')},35729:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/plugin-dlx"}')},37904:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/plugin-essentials"}')},17508:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/plugin-file"}')},84779:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/plugin-git"}')},88454:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/plugin-github"}')},91953:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/plugin-http"}')},63756:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/plugin-init"}')},23100:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/plugin-link"}')},47047:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/plugin-node-modules"}')},31880:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/plugin-npm-cli"}')},67310:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/plugin-npm"}')},74617:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/plugin-pack"}')},12437:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/plugin-patch"}')},8211:e=>{"use strict";e.exports=JSON.parse('{"u2":"@yarnpkg/plugin-pnp"}')},80150:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>u});var n=r(84132);const i={optional:!0},o=[["@samverschueren/stream-to-observable@*",{peerDependenciesMeta:{rxjs:i,zenObservable:i}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:i,zenObservable:i}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@*",{peerDependenciesMeta:{"supports-color":i}}],["got@<11",{dependencies:{"@types/responselike":"^1.0.0","@types/keyv":"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{"@types/keyv":"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{"vscode-jsonrpc":"^5.0.1","vscode-languageserver-protocol":"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{"postcss-html":i,"postcss-jsx":i,"postcss-less":i,"postcss-markdown":i,"postcss-scss":i}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{"tiny-warning":"^1.0.2"}}]],s=r(78761).brotliDecompressSync(Buffer.from("G8EIABwHuTnyDkxeQiomXep01zJ90cJ3iFSgGcnN+dVTE5YC1CBsZn0bRMFnq2+/bPJOWLRlcCblbWaytN6yn94lDuHQVXEMzob/mhDOafB/uXcOjPnzEX5TF8I/4H+A7n4PCzSY0xTuWjDfxxV8F1neM4x7jymltl+dnYEp13SxCOpkQxUClagaNItavHVUdwD73pT3+c52oJFtOTmagkX/GAaKFyr1bLfAnKMY+OZmY+0YsC6Sci7AJQI2zADQHhdIcc03Dz+GOC05kpj3M0kiNKsdFu1U3ornmwco/hOeYDp3IUlCIQqaE6eg8ho+SQaBwAeE4PktvsKmDJJy8fXAx0jTz4Oj2wWKVgNnuMz/CR5AZNuo2eZk0HwujkkFQBytGPu+p1RoCpRBYVcTf7REjfuVBUIa+MgTpb+ZaKgASLlmw2dFNlIsdYEsSntc1vhEJfQLSkVdBXXK67OUoZjcjVu8DPd8oSwu1vK52tVmsLNeekvJW3ss4Z1+thxuul1A0bzLBLT7MQMQxaGNFQUpvaAsmmOVo1hZFKHViytsKRvkULx6+VpOghLO9W/tHqSTQkqQkLWIKtzBlsPNUviOym6eOz3jjDM43Jfi2pXbla5apaLf+jR3njZPcG1zp9bxgi6Acg2V4n8rU8+1ANM2CXkW5tkqS6QfhnL1z8/s5G8r/f4omOaXOkzbHh9HdPhfxz9Tftr698n6L7UYF/L089Ch+9QgeDSlUXdaBAyLU3G6bkC5ygWmNqZMBYJHB6iFj4uo0iI9yR5r3KUooI0Zg1IkiYsgqxR8jMug6VgwtyIaxNxP30CqZH3zo/g16/wof1VdCLhd+YIOeBHFhA/D2eAvyld7FIAT8EiOA1Msg41mq8UNYCwZt2Pc519uZYhp9gP6kOwhcU+Ydc0CsPIqfy0ZGgbIKNYGZ+RP4ESfRzdDW6vhSsXuu2VB29YEdri/7CbQ7XCsVevHtY2mms7dVEMb6Wa/Ln6ZokATZTjZ/kMMNoWEp0AqBKG0DaCyBxlBsylqymr/6xM+mxOAAVREIXXGnW4IXuQ5oSGimw0C7BKZb3ZDLEWtkWXM5FB7jjp37QA=","base64")).toString(),A=r(78761).brotliDecompressSync(Buffer.from("G1QTIIzURnVBnGa0VPvr81orV8AFIqdU0sqrdcVgCdukgAZwi8a50gLk9+19Z2NcUILjmzXkzt4dzm5a6Yoys+/9qnKiaApXukOiuoyUaMcynG4X7X4vBaIE/PL30gwG6HSGJkLxb9PnLjfMr+748n7sM6C/NycK6ber/bX1reVVxta6W/31tZIhfrS+upoE/TPRHj0S/l0T59gTGdtKOp1OmMOJt9rhfucDdLJ2tgyfnO+u4YMkQAcYq/nebTcDmbXhqhgo6iQA4M3m4xya4Cos3p6klmkmQT+S4DLDZfwfMF+sUCx36KleOtaHLQfEIz0Bmncj/Ngi3lqOl4391EWEfIss6gVp3oDUGwsSZJKeOVONJWZg+Mue3KUMV3aMqYJ+7b2219D+GFDi8EV5y/Y+5J+He0oNjKAgqLsJziEsS9uIaCu3BHBKSXxNKKa2ShbfglcWoiiVT2kfGI7Gw+YJ/Sqy1H6wdFWtyVUQIa82JPwbeV25YKLzc5ZIFM6GCPSA+J9dTvJbs5LuuKnLP3f09gCu2jxqsAv6CA+ZySVaUJr2d3A70BC/uBCKr2OVrWgC3fSwb7NlfkgSEEiejrMGvhya9lMbVI6lMsFKN330A1/FOaefHQdNGLEZ3IwFF87H3xVlM0Xxsmbi/7A60oymRcIe0tH90alG6ez/yA7jwYotxuHWZdR+1HlMcddGHAV6QD/gXYPV0wnNv47I+5FGevzZFMqWSO8GU4nQ3FjsdgdJcD+c1rvudERKuLyd7bxiBpnsMDHsvPP4nXdXkld/gUNks3GAE1Otmb90bavDyiw4Mrx496Iw+jbLTgsCZGZXSZ9vM55C7KGe4HyJAKXEk0iT/Cj/PFwLJBN7pcP7ZFfYtUApGTWKkYhI9IE2zt/5ByH72wdvH+88b71zuv/FMCX3w6x5nzhY44Cg5IYv9LeKwHuHIWgPbfgrAcUxOlKkPRdQOIDF/aBuLPJAXD+TgxCNXx4jQxeR/qlBWVikFPfEI4rXMUc4kZ2w9KbPKYRvFUag0dVlVoyUP4zfidbTXAdZF88jAckl+NHjLFCNdX7EQ1PbLSOl+P+MqgwEOCi6dxgWZ7NCwJBjWKpk1LaxwKrhZ4aEC/0lMPJYe5S8xAakDcmA2kSS86GjEMTrv3VEu0S0YGZcxToMV524G4WAc4CReePePdipvs4aXRL5p+aeN96yfMGjsiTbQNxgbdRKc+keQ+NxYIEm1mBtEO29WrcbrqNbQRMR66KpGG4aG0NtmRyZ2JhUvu0paCklRlID8PT3gSiwZrqr4XZXoBBzBMrveWCuOg7iTgGDXDdbGi8XHkQf5KXDGFUxWueu5wkSa6gMWY1599g2piQjwBKIAPt4N5cOZdFBidz2feGwEAy1j1UydGxDSCCUsh314cUIIRV/dWCheceubL2gU8CibewmP7UxmN5kN4I7zfQhPxkP0NCcei8GXQpw4c3krEzW7PR2hgi/hqqqR58UJ/ZVfWxfcH5ZKMo4itkmPK0FCGxzzIRP20lK/gz28Y03sY233KvSVWUKl9rcbX6MbHjpUG8MvNlw72p6FwTejv92zgpnCxVJnIHHZhCBxNcHF5RTveRp513hUtTHHq4BIndlytZT5xoTSYfHKqKNr4o9kcGINIz6tZSKRdtbON3Ydr9cgqxHIeisMNIsvPg/IFMZuBbSqqDLeSO5dak1cGr76FtH2PC7hs0S0Oq3GsmF1Ga4YABAMGcdPAWzTk26B7cKV91I2b0V/GYvnsEQ1YGntRqi5EQqTlgZszbV/32GuZtUF49JOA/r4jAdwUOsbPo6mNoBlJPYjM5axrZaWQf33bFsLWqiyvvDOM4x0Ng802T7cuP2a3q98GWq6yiq6q3M77hcZlOUnmryctRYmI4Hb2F5XixFohkBmySCjU+M7/WQVE5YAtnlxiUJDhFN0y1tNeMWY9E0MfZi2rQ4eC72WXjsAA==","base64")).toString(),a=r(78761).brotliDecompressSync(Buffer.from("W86VFEVuB5UK4bko6sMmtYIRySinFtCygDfEp3qiTyMeV0XbGa83HOCIeIZOe7p527RW/UBFHvKpyWsyuZdjqLKV7SD3nGRg1IR6HFKugLT4n+nszuX08DbJRSJ7hJiW1kirjnBhtWOER/8n3aopYnuXKeh8SCWJIsVpf+DhOHGD9MwoBNVNWaxHXUwsgVcMxMPFf7JplS6RvARajjYJOdsg3CDaGPvXr3oraA1IHpAsL8Ex/fpV3S27PbPAPgCILjyO7pL4kvQ4BspS2ZaH0HAcEUVAh9NlmXEJIy1TGCRGIdXKYBiFxGMEvSikXdr/C8dXGsap+52PapFvMmY13H3V/YqFWNAFhmC2QLpljvUhtBti1P62jZnL769VIYQsogXX1WRMKfm5tYxdDKj5o9/9clUhSRZmGF17rjm5+h/Mr41Oql8lFLk9W/wY93ulOJz4UJ4HhCDgNH9Iy9fSo/HBZ7L8gWH6d73W+w+eP0mSpPEuOlEUpfNlxmMkf2vEU/mK3m3Gvo6IIy/kDNbDY9rOy1fhqIW4HhRRnip6vTtCqh8BO2pHUApo1Rc/qaApGqASxz6kxFdHfKotxxNZ2mKCgYyQBNe7fbD4CzzlKBcSD1aC+/ecbYZAlcGCCQ04fBqTHD2X5CPt0t8xXQVVyvW7D6l7GI7a3Qpfvaw7cbk9X+PTr4lzFrK2/URR71qyBdsakW1k2EOiafCfFanvmRf5RSeoHOzGhYlDCBy3exgQJHgX398QBOlIaTUcFFBPfOKghva78pbNMD4e4xAdYT3uASLfddKESVkPQnay5e55QSwYT6LQ5smX8bdw1o1sQysg1essNWHz4qUylJ5dEq7jDLRv1VQ4B30a2nAOEQKmifEbNN2YxiLNxLucNFYEM62kkjdJjkDLS2EnGNc87K8n9SkjQqCDBDni17SppnRF6XJbEmRCgk9yRVEtAk8kVfx4jUQAs42wKVQ9y+zL9s4rM0hnX0/bgCQE3/5zgnSlHMStrQ+4JO86s1HEMpPIEfNk3H2f2ccGp8nW5vnuhWh52aF/PQbX0IRkUDzeNA+09fqMxFnS8DT4jAPlAex20+oiACkVsVaRtfSDYz7d7e9N6j6mHgNDjHQFfSYmqhiAnYCS0Txw4QUBM8KtAWrJT19b8DbSNBzjOAGqJ1jVr+igsGIRNii9hifP8jGkxQCWyRBNM+gsGs5x7Q7Rs+YM1O8VaZ9eWSUuNwxuTQyhRFoua4BBQGur6IZBBT5/ePtaCu5Fk7wQ/i2tTbL145hIJMnOwQYQFKHgNfmZtoLoB6YsXfwyFUBBdV9RY5Jg3+xhKo66D0/ruAsXb8CO//pUT0fllfQicxnyQo6yVEWd5YcI5Krrx9IQRXoYBXaYW2eIkMfNKVB9eWps8JiSRFY4N2KzQ3Y3H607czQjrSPvtPiObXxlfKrwP/HSxE1yRQV9s4LO8ADkW8hcxmyppS8O+kN3BEbIUcE0XEj6BVJzI+OxiO4y+3wKdpB6n1lU1nm/Mwtlk12VaFS01cordKCPE/ORq07WmbTLsw6kLdeYCdgUJucrcdSmzcKtiG1OasKz1nPsZr3//YwpmTPZzqoh5GY2wLk5q3yVODGerZHUckBwbOB+nn7lkg6lC7+1sm+7IlvT5uNL4KSZXlkumYnmmMH+CPNrhyV1KyYwJAmPz0JYc/PX2rwzGJPcTtun6nXiC2/8QFQJgbrW2eYzIkGoZxgxuYE5xku/oNFpM8aldz7LcTWk7D58+uXU7s4texK5f8he2ENNLhn8OPw0AhSFcI6Cr+rpwF5cjtXhjZ70wcB/eTZzbp+OFkBO0tpkHUnpdNBlEyN8dWl/kkta9CG36qc21UOA5F0da7iyu4ZIv+lmF6shIscXDMy+WbebwZ8nE8jfdAwkaVPM8jjjBHpkPPcE00EbTmL6S9pSCcY+l+6itm+FLQtZyIpOHl81uI1yYN86okqfuJU5bEPgPldkZnFn3m4LSswWtj2w8pEbt7NQccXA7MMTUi6/xuzCYTtbqhkdzm2bEnRvqREgdXIVTAZ6qtpodFblUeSLKFMQi51UQfEyQgApiPpCdMFK9G2MCpfEtt0wnVQ5Sfe3q1rgpIfOm6Aj4/iKOwcqudbul/xzSKkzt5b9C6+hmtVDAFh1baaI46dZ1n+QK/yBSEsClCIy0weU64yaFgnVcIFLKR9yzyTSI3LmA2F6jAgviBdM9pgRWOtADMHvfGNJfExBtICQ6KgRjh5xM2cvliHxLsCIsgb9HhezhMsZJlspiqXbQVNfVD4k7sqVhoOYRgiRO8wQCYYHQ0Hz/JhckHbbv6yj7wWjn8P2VUDYPteDMZw0eX3JcQqv577HTPVF0DtHKTahw9DzPIQ4K9UlqA19w8p72ZemLg1bA1OEia1PDd8hJphNdZaASEj73mNcJ12pFme3THNPvF/u0Zi4TTRuuUK9ae/0H9AwL4t/iqtar3VT3hsuzrUGSd3X1SyiUw6pBt9uoDiP2LensiC9voTWKKm2jpN2GOtJ5Yx6Ug2r60iIrVT/fxEWW+Yl0RrjarDNrwraA9+pqelaSqyLBDaW2U9qtqHl3QYUZf2PF2tQVabOZKgc3ril90aXWypUhHOXT7kNzv6Jx1QIS04gHo1aPO/VBn/Mvx5Aw7GPVVB0t4pfZOEJKm82akLCJZl7a/Bwv5GQq9DWYRn1o0Ld0YhQifUSVaiZuhz35Nzl8qqRbe1vsy9iUd0VT1vHQT4CJeeOVVe5vq6s0bZ5xZmbLQavRNGgSUI5Jbtn2Qol5wiPX7smq1bRLmAGHwXe9d8pr0wRD1PYl73e8heuco8gZe1+L4zPGXMwjPvAyj2qqo5UyUDWaLB5+I1vCu+FBe4PL5pUk6Ts/UvldvVCMK+xW7iYxSoAKpZi4pP1A3lbYW3fQNgKb/rjDfaXlfvd4lNn9AsQIMn0Jku+NSSctDsgZaNUM7bGKgxu6NbSJO0rao0xJ7EnadTC3dr9YFud/HOCQQGzO6ijafKDjubo3vU6PE/zZcntldGfS6Hm+GhCV6fBRhtq9nrpOdTscGGRaqFJJusnWyQu47hkq3kISlkfCWb5J4SPR8e6iFjxXjncoOgSICJMMGMC8Mxjxiq3AICBMzeQmL2F5SpTy9pncKajEvbXCACMo9JQUy0QFLM3HOzyj7kqe3f7Nb7XrRvvXIYEQgexrI8DpzxWXu0WACij0r1cmIlKank7hErOao8AABawygzccmg8OOafcC6At80FvRc8UHHPHQFIAdccM832vgoAzvm+j9/e/370ebjucnAs+OYfs/fmRQ1+Y+U49hGY0GTgFpwCtzFplVsAQMJZ2v1VYTlRaS5rb+PMXSZmf40AgF2cwcY/YiaCdJeY9zrPSB/43cARmqy2ivXVnGnj2y4DAOCcyceWAF3IWWtcTUK//ZkUUK1I/jZ7BQbVAuN31xdc+DH7XNL+qdc6zR5/4BTHk72vcmKMb/tbAIDTqLLRhHpglQz/coLsh0uzuMJVFevfZlemUdWs2v5rBADECoCaapwyueG2Lo5Zgu7HUsZpZfjekMwiELQFAAJgS4YJtnftdhprqvzoEgBINxzqJdfXORTq1Dc6r7YyfN8n3NaH2AIAhHI8li9cAy6R9riYqYJrPmoEAMK5MNI4JQI+QJqH5L32tM3OboIZvse8CgDCGdZC4wIPdkK6cvjkty7d2snJZsd9nzCMD7MFAJrIFmMyXGC6b3+qrBRMeCMA4HYyz/gEDQ0z+it6welQWnv8QEXBVIxk9yva1ocyAADu2nwqjaPszn4mA+uaMNDYb58G9/xh70XKbaSLKT4aq+Y26X4BWZ7kt75CaX34FgDgbifPpHGUmmxwRWMtjonGXjsXcnO0+TATALBLqc1UZtXX1to/rcvZNrEM/0Qai1DgFgAIIVIqI6wKSHG0Ie3r5OZoPrgEANadwX1JyCSRDuHDgefBdHIZvhMxgVsAIAZSSW2IsJ0UoSHtcnITmg82AQC5E9uh/Vg9o3FHapRr+opidtdhXwUA5QzrTph+HJLmlra9N9Vetbd+c/0sGstgGB96CwA0lF2lN5wGA3EXGD5qBACE5IdDnuKVDFo4SJtKeyRX+W3raiToz1HdYH6k3uf6/wN2qXv96xHeTQ6pF7EYk9Bk7ei6SBkEGAQaHSx5p4CIgStvQkJ26he89TBtlO3m52CLg6gGXen1Swf/P35j+hut+ra3zORvR4GPgKGSrA+AzOJ3FPhMkrXMtn4LO1jtvK+Yms+3Ao93KxZvI+Nym8+iYg+FrvVrdM4StRaL248PSz6hZo8MyYkj4JDO3BigGsgtXifQp3lX++8P/fvRfdt4A70FNR7O2tz3atPUaU5TfoSEMEwy1Ju4Al9VbziDeNvvwscvrb0MRmOoBv6PEml4vV9f8U/qGoEdvqGiQwMezz4rRi5TYKjNSL/OeNaOGF8nGyc0AtNdgTk5nQvvDZlpq6E7RpbCLmNfbf2FGKQ3bVMbiKohuLUZQ1QMLQXeXdvAgRY6xtWoArpjKcnwv5OwGFkhUscJzqN1w7xHtIEDIj2/R8VZPVJ/z4IRAus56Osd3XjiI/6+uiTaUw3hEmk943OseTHS2IAOSw5PIt/Rtxnu7PhUf/9+Xypsp3b58y64oAEKlhyU+8RIo3Q6EVISwjTt3lkJUSVsoslllJ2nP0KT8iYm1ZLADGNX1mXcz3wRMIrxYT9FGjJjab8GH4uoY1XkkHnbl9n0ABt5EDJ0+BD+toVDZHpSPsmJXgzfiQi9a0/BgOf4DhuR0sXiEfLIzr0J3T+C+fMhJ1Pe45Pqfy4+9M3jNT9iI47Gd214GUM0A1QB2rkmS0KOMMIjjf9ERe5/+a8ekwaXQ6Zkp/gtihLCuscRsw+jodGc7M22CS77XYDnY89E33nXog1eJp+kE1J7RS7NkyJk25jUXAk1Xi+3B/s/EZvIkyHTpreLFuzibpRyqltH71o+Zhnsz+fYKRmmF5VQrP54tIBK6J9YYgIrv+BGHYxqkiYyQDf7cWzFjWrxXDRtN677187KT1t3bwXLOJnk7S+gmAPHi4SpsV9aWFbCa8/TGnvVk72+JcCMUManxbflw2/6U58sQJglk1hUdkCos3h1JGOm/7BNwsXzZQ3eZH3hZgFcOgWeYZxZhBDLAlb6DhHLy8B0DdAMyvevbOGEbMESRg5xJaA5mGtKlx/LYllt4WS+nmch1KcWD1Ql0m014Z3hcbjO8jhc/SL0cYg+DtEZH+njEH0s5syPob4SbNn5dBuB/5qxDyW7nZFdLDK1I4lfufpmfFukyQGO9c8xeC5v02fIStLDHITEDIj1COr5qSmgbOU8Vdm3ZlKl2130ml3Ac7o7rwKje2wQIuyaZvCt0gfTJ0se4KZlh/lzuAFk3WsKQdoVIR9vAxVIRdkSLBJ7lv80R/QwXz//7ygvy6Am+wloa7O+2oR6Gufgxhy0Y6E2ymMZgfr4awdx/hMDXFKz36TEV+JjkdE7pkUNWLknPblVZMomMcIu/vnnqLssi4sZuYTTpFtsvadPBxOu/fxH09MeV5ncszx8d1pGXXs+1e/vihbJ5All7JNyafRsottNNfnU6nhkrL3+M6OsyX32WTfvkFE0YbhrOcGuZJ6Pka/yySxUsDdozlNmPlj3Do1cl7Q8WlzLF7vW5ZmCoUJzXIkfESJYMvQiAgY4cFuTGhycIYvsEN4hxJ5HdVNLc8nX4oEtv02p04a/bEaUqLV09LfsaTs2wnDAP96W4iuKeNeEexa4cGV8x7YvwI3j8/aK0vHwlSlijzRGaFvMnaGqQ18CBsZ0vpgyasLbBkyzvrWcyFrSdr8QGipAx3yb34P78l6hdUbOFMY0juaUqiXWKvKwPLO9ZQCAJTho9hZeFrxXO1nyfjQBAHKFXiqXqaJeSWCLLgZWv6ZvlnQRYP+aJuZQ3oA1+g5IyXtr316jZ7IzxsycEl5iDdNYedVlAKBBAvxIex2b9mofjfFJXkUTABi+rayWyjeoUrmiQC6dKq7Yp6Gx3ZWeAlQQILe+zcurmG8aHkNTHG/vUgEYU1Mc4OC+zX0Mn95jPZ6mGMZYmlNillhjaExabRkA0JIHXrnFwgxe1o5gwatoAgAOrkwvlbOpMloZgKS8NMnyWdjyJ6LniG562F+ci105KZHlgkYU/XkUwtW2nLjVygCALa4i1L+cQMb/JfPonCvA8naAqtjl78yHC9Qj4m5Y/h/4+RKL0/hetAZMSKBCHazJ90dIGwPqYbk6npyn3AN+MXbQdJbZThmpzkEVbCqGH7SlX+4FMt4vcLE1Lf6aGGE1zxma+UYkee8YXXpFu+WIt4pVwlE5P/1CQojzllx/U/iQQeGcERZp0r+D9Z1GRjwIaTHWj1Gqe5F1xxa+MEEKLGdn30/UeW4fKcNL1YKF1bZErJGUuaUrlBQqX8VcKLVci7i8PRtPqUyv58oCShBbH53QOAonTF//KrgkyxSuOydltdPsOZi25iUTJUtRYGjdGcEiD8djP7guiWZFDc8eKf7ddJ3FazUJDlLdHLZlyyKl0KhFRZYbCk26zMvlkV1oteN79GIPnkXMcesPjJLe0TizLMLczKNHmdP59DgLjBna8+zAnZM61QmX1nkXAVFOVO3w72z4Q20tLR8dMLzjwO5gbl2WXbR/cMe6ioDGfkPYd/RtU2R4DYwi4jHoPzRDKzzdnpiz8BDZaRAcn3/IwAi/EaIMiYNplKckdCWmF+U2mkd6WGNndq7advPLlUB1EG8yOYdZF+DT7O7Hgn+tT6wFWFqIsoE+A4UN8Nx59S1O+VwvwTLlr2egMzmVrEeqXDWi6G/7WQYAxFVP8FeEPVBp8QX26rfZO6Lm1ry8A4u/lwkAdEwN3ZeBHfbwf9wZWPvg5zw2JGIcq/VKqZcrk0+ZiBPrftdddGcv9rbkhmdf1ofBzfnLekHLuOBlIG7Lu/U1mWzfU5JU6w43ZX0aTk5mey/YS/Pt0I3cD5/NU+M+Olrr4Mau3ld/bkcsoEp+aZm0Z/mycR9lblg7QT2IZg29+4ey7dp53QtHjkyhhsLaw608Yv97z4BnT/n9EE4GvXNMo5zhNXzJ++n/l/kEWsuXXhXjx974+++Ld3Y0NVJnvtWI1Dw51GgYi93jDH/ROzobNTUE9yWxQBiJNTfGOOlR0d/+/mvVdIplKiy0b4Ucbi+rJzTGgPVtZfTu5O8y/40vG52N+zLPfM7vqDwyL+1o+LptWCNLrTUrQfZL5PcrUl35qyvDyYFSvS7vqDJVUStlaflHhMHvCHRhLr525DiAKHasTy+5Ub+sG/NFiJngMgAwQ5xDhPnfn7TpyGa/PUWcHdIEACgSnrz7CZDwPkcJACaDWkLkTK6KYk3lNDmSIJTH90ZcqKgbU2PB5meHZm6C1BsfRuUAzA0BqCTNC1/7PHG7/K6FBVjfOkRO9aOJSjkAc0fAKgP3wl/T5SU9uta9pdOJ5iH3esBtEmn+fFvVV0TczmfLAECbFMNDhBtUqAou+u0J4uqAJgCQoLY8anp0z7Vi2CQAgAg=","base64")).toString(),c=new Map([[n.structUtils.makeIdent(null,"fsevents").identHash,s],[n.structUtils.makeIdent(null,"resolve").identHash,A],[n.structUtils.makeIdent(null,"typescript").identHash,a]]),u={hooks:{registerPackageExtensions:async(e,t)=>{for(const[e,r]of o)t(n.structUtils.parseDescriptor(e,!0),r)},getBuiltinPatch:async(e,t)=>{if(!t.startsWith("compat/"))return;const r=n.structUtils.parseIdent(t.slice("compat/".length)),i=c.get(r.identHash);return void 0!==i?i:null},reduceDependency:async(e,t,r,i)=>void 0===c.get(e.identHash)?e:n.structUtils.makeDescriptor(e,n.structUtils.makeRange({protocol:"patch:",source:n.structUtils.stringifyDescriptor(e),selector:`builtin`,params:null}))}}},10420:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>g});var n=r(36370),i=r(95397),o=r(84132),s=r(17278);class A extends i.BaseCommand{constructor(){super(...arguments),this.quiet=!1,this.args=[]}async execute(){const e=[];this.pkg&&e.push("--package",this.pkg),this.quiet&&e.push("--quiet");const t=o.structUtils.parseIdent(this.command),r=o.structUtils.makeIdent(t.scope,"create-"+t.name);return this.cli.run(["dlx",...e,o.structUtils.stringifyIdent(r),...this.args])}}(0,n.gn)([s.Command.String("-p,--package")],A.prototype,"pkg",void 0),(0,n.gn)([s.Command.Boolean("-q,--quiet")],A.prototype,"quiet",void 0),(0,n.gn)([s.Command.String()],A.prototype,"command",void 0),(0,n.gn)([s.Command.Proxy()],A.prototype,"args",void 0),(0,n.gn)([s.Command.Path("create")],A.prototype,"execute",null);var a=r(27122),c=r(40376),u=r(56537),l=r(46009);class h extends i.BaseCommand{constructor(){super(...arguments),this.quiet=!1,this.args=[]}async execute(){return await u.xfs.mktempPromise(async e=>{const t=l.y1.join(e,"dlx-"+process.pid);await u.xfs.mkdirPromise(t),await u.xfs.writeFilePromise(l.y1.join(t,(0,l.Zu)("package.json")),"{}\n"),await u.xfs.writeFilePromise(l.y1.join(t,(0,l.Zu)("yarn.lock")),"");const r=l.y1.join(t,(0,l.Zu)(".yarnrc.yml")),n=await a.VK.findProjectCwd(this.context.cwd,l.QS.lockfile),s=null!==n?l.y1.join(n,(0,l.Zu)(".yarnrc.yml")):null;null!==s&&u.xfs.existsSync(s)?(await u.xfs.copyFilePromise(s,r),await a.VK.updateConfiguration(t,e=>void 0===e.plugins?{enableGlobalCache:!0}:{enableGlobalCache:!0,plugins:e.plugins.map(e=>{const t="string"==typeof e?e:e.path,r=l.cS.isAbsolute(t)?t:l.cS.resolve(l.cS.fromPortablePath(n),t);return"string"==typeof e?r:{path:r,spec:e.spec}})})):await u.xfs.writeFilePromise(r,"enableGlobalCache: true\n");const A=void 0!==this.pkg?[this.pkg]:[this.command],h=o.structUtils.parseDescriptor(this.command).name,g=await this.cli.run(["add","--",...A],{cwd:t,quiet:this.quiet});if(0!==g)return g;this.quiet||this.context.stdout.write("\n");const f=await a.VK.find(t,this.context.plugins),{project:p,workspace:d}=await c.I.find(f,t);if(null===d)throw new i.WorkspaceRequiredError(p.cwd,t);return await p.restoreInstallState(),await o.scriptUtils.executeWorkspaceAccessibleBinary(d,h,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}}h.usage=s.Command.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Also by default Yarn will print the full install logs when installing the given package. This behavior can be disabled by using the `-q,--quiet` flag which will instruct Yarn to only report critical errors.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-react-app to create a new React app","yarn dlx create-react-app ./my-app"]]}),(0,n.gn)([s.Command.String("-p,--package")],h.prototype,"pkg",void 0),(0,n.gn)([s.Command.Boolean("-q,--quiet")],h.prototype,"quiet",void 0),(0,n.gn)([s.Command.String()],h.prototype,"command",void 0),(0,n.gn)([s.Command.Proxy()],h.prototype,"args",void 0),(0,n.gn)([s.Command.Path("dlx")],h.prototype,"execute",null);const g={commands:[A,h]}},72926:(e,t,r)=>{"use strict";r.r(t),r.d(t,{suggestUtils:()=>n,default:()=>Ke});var n={};r.r(n),r.d(n,{Modifier:()=>o,Strategy:()=>s,Target:()=>i,applyModifier:()=>b,extractDescriptorFromPath:()=>k,extractRangeModifier:()=>D,fetchDescriptorFrom:()=>F,findProjectDescriptors:()=>S,getModifier:()=>Q,getSuggestedDescriptors:()=>x});var i,o,s,A=r(27122),a=r(36370),c=r(95397),u=r(28148),l=r(62152),h=r(92659),g=r(40376),f=r(15815),p=r(84132),d=r(17278),C=r(9494),E=r.n(C),I=r(33720),m=r(46611),y=r(46009),w=r(53887),B=r.n(w);function Q(e,t){return e.exact?o.EXACT:e.caret?o.CARET:e.tilde?o.TILDE:t.configuration.get("defaultSemverRangePrefix")}!function(e){e.REGULAR="dependencies",e.DEVELOPMENT="devDependencies",e.PEER="peerDependencies"}(i||(i={})),function(e){e.CARET="^",e.TILDE="~",e.EXACT=""}(o||(o={})),function(e){e.KEEP="keep",e.REUSE="reuse",e.PROJECT="project",e.LATEST="latest",e.CACHE="cache"}(s||(s={}));const v=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function D(e,{project:t}){const r=e.match(v);return r?r[1]:t.configuration.get("defaultSemverRangePrefix")}function b(e,t){let{protocol:r,source:n,params:i,selector:o}=p.structUtils.parseRange(e.range);return B().valid(o)&&(o=`${t}${e.range}`),p.structUtils.makeDescriptor(e,p.structUtils.makeRange({protocol:r,source:n,params:i,selector:o}))}async function S(e,{project:t,target:r}){const n=new Map,o=e=>{let t=n.get(e.descriptorHash);return t||n.set(e.descriptorHash,t={descriptor:e,locators:[]}),t};for(const n of t.workspaces)if(r===i.PEER){const t=n.manifest.peerDependencies.get(e.identHash);void 0!==t&&o(t).locators.push(n.locator)}else{const t=n.manifest.dependencies.get(e.identHash),s=n.manifest.devDependencies.get(e.identHash);r===i.DEVELOPMENT?void 0!==s?o(s).locators.push(n.locator):void 0!==t&&o(t).locators.push(n.locator):void 0!==t?o(t).locators.push(n.locator):void 0!==s&&o(s).locators.push(n.locator)}return n}async function k(e,{cache:t,cwd:r,workspace:n}){y.y1.isAbsolute(e)||(e=y.y1.resolve(r,e));const i=n.project,o=await F(p.structUtils.makeIdent(null,"archive"),e,{project:n.project,cache:t});if(!o)throw new Error("Assertion failed: The descriptor should have been found");const s=new I.$,A=i.configuration.makeResolver(),a=i.configuration.makeFetcher(),c={checksums:i.storedChecksums,project:i,cache:t,fetcher:a,report:s,resolver:A},u=A.bindDescriptor(o,n.anchoredLocator,c),l=p.structUtils.convertDescriptorToLocator(u),h=await a.fetch(l,c),g=await m.G.find(h.prefixPath,{baseFs:h.packageFs});if(!g.name)throw new Error("Target path doesn't have a name");return p.structUtils.makeDescriptor(g.name,e)}async function x(e,{project:t,workspace:r,cache:n,target:o,modifier:A,strategies:a,maxResults:c=1/0}){if(!(c>=0))throw new Error(`Invalid maxResults (${c})`);if("unknown"!==e.range)return[{descriptor:e,reason:"Unambiguous explicit request"}];const u=null!=r&&r.manifest[o].get(e.identHash)||null,l=[];for(const h of a){if(l.length>=c)break;switch(h){case s.KEEP:if(u){const e=`Keep ${p.structUtils.prettyDescriptor(t.configuration,u)} (no changes)`;l.push({descriptor:u,reason:e})}break;case s.REUSE:for(const{descriptor:n,locators:i}of(await S(e,{project:t,target:o})).values()){if(1===i.length&&i[0].locatorHash===r.anchoredLocator.locatorHash&&a.includes(s.KEEP))continue;let e=`Reuse ${p.structUtils.prettyDescriptor(t.configuration,n)} (originally used by ${p.structUtils.prettyLocator(t.configuration,i[0])}`;e+=i.length>1?` and ${i.length-1} other${i.length>2?"s":""})`:")",l.push({descriptor:n,reason:e})}break;case s.CACHE:for(const r of t.storedDescriptors.values())if(r.identHash===e.identHash){const e=`Reuse ${p.structUtils.prettyDescriptor(t.configuration,r)} (already used somewhere in the lockfile)`;l.push({descriptor:r,reason:e})}break;case s.PROJECT:{if(null!==r.manifest.name&&e.identHash===r.manifest.name.identHash)continue;const n=t.tryWorkspaceByIdent(e);if(null===n)continue;const i=`Attach ${p.structUtils.prettyWorkspace(t.configuration,n)} (local workspace at ${n.cwd})`;l.push({descriptor:n.anchoredDescriptor,reason:i})}break;case s.LATEST:if("unknown"!==e.range){const r=`Use ${p.structUtils.prettyRange(t.configuration,e.range)} (explicit range requested)`;l.push({descriptor:e,reason:r})}else if(o===i.PEER){const t="Use * (catch-all peer dependency pattern)";l.push({descriptor:p.structUtils.makeDescriptor(e,"*"),reason:t})}else if(t.configuration.get("enableNetwork")){let r;try{r=await F(e,"latest",{project:t,cache:n,preserveModifier:!1})}catch(e){}if(r){r=b(r,A);const e=`Use ${p.structUtils.prettyDescriptor(t.configuration,r)} (resolved from latest)`;l.push({descriptor:r,reason:e})}}else{const e="Resolve from latest "+t.configuration.format("(unavailable because enableNetwork is toggled off)","grey");l.push({descriptor:null,reason:e})}}}return l.slice(0,c)}async function F(e,t,{project:r,cache:n,preserveModifier:i=!0}){const o=p.structUtils.makeDescriptor(e,t),s=new I.$,A=r.configuration.makeFetcher(),a=r.configuration.makeResolver(),c={checksums:r.storedChecksums,project:r,cache:n,fetcher:A,report:s,resolver:a};let u;try{u=await a.getCandidates(o,new Map,c)}catch(e){return null}if(0===u.length)return null;const l=u[0];let{protocol:h,source:g,params:f,selector:d}=p.structUtils.parseRange(p.structUtils.convertToManifestRange(l.reference));if(h===r.configuration.get("defaultProtocol")&&(h=null),B().valid(d)&&!1!==i){d=D("string"==typeof i?i:o.range,{project:r})+d}return p.structUtils.makeDescriptor(l,p.structUtils.makeRange({protocol:h,source:g,params:f,selector:d}))}class M extends c.BaseCommand{constructor(){super(...arguments),this.packages=[],this.json=!1,this.exact=!1,this.tilde=!1,this.caret=!1,this.dev=!1,this.peer=!1,this.optional=!1,this.preferDev=!1,this.interactive=!1,this.cached=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await g.I.find(e,this.context.cwd),n=await u.C.find(e);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);const o=E().createPromptModule({input:this.context.stdin,output:this.context.stdout}),a=Q(this,t),C=[...this.interactive?[s.REUSE]:[],s.PROJECT,...this.cached?[s.CACHE]:[],s.LATEST],I=this.interactive?1/0:1,m=await Promise.all(this.packages.map(async e=>{const o=e.match(/^\.{0,2}\//)?await k(e,{cache:n,cwd:this.context.cwd,workspace:r}):p.structUtils.parseDescriptor(e),s=function(e,t,{dev:r,peer:n,preferDev:o,optional:s}){const A=e.manifest[i.REGULAR].has(t.identHash),a=e.manifest[i.DEVELOPMENT].has(t.identHash),c=e.manifest[i.PEER].has(t.identHash);if((r||n)&&A)throw new d.UsageError(`Package "${p.structUtils.prettyIdent(e.project.configuration,t)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!n&&c)throw new d.UsageError(`Package "${p.structUtils.prettyIdent(e.project.configuration,t)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(s&&a)throw new d.UsageError(`Package "${p.structUtils.prettyIdent(e.project.configuration,t)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(s&&!n&&c)throw new d.UsageError(`Package "${p.structUtils.prettyIdent(e.project.configuration,t)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((r||o)&&s)throw new d.UsageError(`Package "${p.structUtils.prettyIdent(e.project.configuration,t)}" cannot simultaneously be a dev dependency and an optional dependency`);return n?i.PEER:r||o?i.DEVELOPMENT:A?i.REGULAR:a?i.DEVELOPMENT:i.REGULAR}(r,o,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional});return[o,await x(o,{project:t,workspace:r,cache:n,target:s,modifier:a,strategies:C,maxResults:I}),s]})),y=await l.h.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async r=>{for(const[n,i]of m){0===i.filter(e=>null!==e.descriptor).length&&(t.configuration.get("enableNetwork")?r.reportError(h.b.CANT_SUGGEST_RESOLUTIONS,p.structUtils.prettyDescriptor(e,n)+" can't be resolved to a satisfying range"):r.reportError(h.b.CANT_SUGGEST_RESOLUTIONS,p.structUtils.prettyDescriptor(e,n)+" can't be resolved to a satisfying range (note: network resolution has been disabled)"))}});if(y.hasErrors())return y.exitCode();let w=!1;const B=[],v=[];for(const[,e,n]of m){let i;const s=e.filter(e=>null!==e.descriptor),A=s[0].descriptor,a=s.every(e=>p.structUtils.areDescriptorsEqual(e.descriptor,A));1===s.length||a?i=A:(w=!0,({answer:i}=await o({type:"list",name:"answer",message:"Which range do you want to use?",choices:e.map(({descriptor:e,reason:r})=>e?{name:r,value:e,short:p.structUtils.prettyDescriptor(t.configuration,e)}:{name:r,disabled:()=>!0})})));const c=r.manifest[n].get(i.identHash);void 0!==c&&c.descriptorHash===i.descriptorHash||(r.manifest[n].set(i.identHash,i),this.optional&&("dependencies"===n?r.manifest.ensureDependencyMeta({...i,range:"unknown"}).optional=!0:"peerDependencies"===n&&(r.manifest.ensurePeerDependencyMeta({...i,range:"unknown"}).optional=!0)),void 0===c?B.push([r,n,i,C]):v.push([r,n,c,i]))}await e.triggerMultipleHooks(e=>e.afterWorkspaceDependencyAddition,B),await e.triggerMultipleHooks(e=>e.afterWorkspaceDependencyReplacement,v),w&&this.context.stdout.write("\n");return(await f.P.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!this.context.quiet},async e=>{await t.install({cache:n,report:e})})).exitCode()}}M.usage=d.Command.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `savePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a tag range (such as `latest` or `rc`), Yarn will resolve this tag to a semver version and use that in the resulting package.json entry (meaning that `yarn add foo@latest` will have exactly the same effect as `yarn add foo`).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n If the `--json` flag is set the output will follow a JSON-stream output also known as NDJSON (https://github.com/ndjson/ndjson-spec).\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: .\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"]]}),(0,a.gn)([d.Command.Rest()],M.prototype,"packages",void 0),(0,a.gn)([d.Command.Boolean("--json")],M.prototype,"json",void 0),(0,a.gn)([d.Command.Boolean("-E,--exact")],M.prototype,"exact",void 0),(0,a.gn)([d.Command.Boolean("-T,--tilde")],M.prototype,"tilde",void 0),(0,a.gn)([d.Command.Boolean("-C,--caret")],M.prototype,"caret",void 0),(0,a.gn)([d.Command.Boolean("-D,--dev")],M.prototype,"dev",void 0),(0,a.gn)([d.Command.Boolean("-P,--peer")],M.prototype,"peer",void 0),(0,a.gn)([d.Command.Boolean("-O,--optional")],M.prototype,"optional",void 0),(0,a.gn)([d.Command.Boolean("--prefer-dev")],M.prototype,"preferDev",void 0),(0,a.gn)([d.Command.Boolean("-i,--interactive")],M.prototype,"interactive",void 0),(0,a.gn)([d.Command.Boolean("--cached")],M.prototype,"cached",void 0),(0,a.gn)([d.Command.Path("add")],M.prototype,"execute",null);class N extends c.BaseCommand{constructor(){super(...arguments),this.verbose=!1,this.json=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),{project:t,locator:r}=await g.I.find(e,this.context.cwd);if(await t.restoreInstallState(),this.name){const n=(await p.scriptUtils.getPackageAccessibleBinaries(r,{project:t})).get(this.name);if(!n)throw new d.UsageError(`Couldn't find a binary named "${this.name}" for package "${p.structUtils.prettyLocator(e,r)}"`);const[,i]=n;return this.context.stdout.write(i+"\n"),0}return(await f.P.start({configuration:e,json:this.json,stdout:this.context.stdout},async n=>{const i=await p.scriptUtils.getPackageAccessibleBinaries(r,{project:t}),o=Array.from(i.keys()).reduce((e,t)=>Math.max(e,t.length),0);for(const[e,[t,r]]of i)n.reportJson({name:e,source:p.structUtils.stringifyIdent(t),path:r});if(this.verbose)for(const[t,[r]]of i)n.reportInfo(null,`${t.padEnd(o," ")} ${p.structUtils.prettyLocator(e,r)}`);else for(const e of i.keys())n.reportInfo(null,e)})).exitCode()}}N.usage=d.Command.Usage({description:"get the path to a binary script",details:"\n When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the `-v,--verbose` flag will cause the output to contain both the binary name and the locator of the package that provides the binary.\n\n When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive.\n\n If the `--json` flag is set the output will follow a JSON-stream output also known as NDJSON (https://github.com/ndjson/ndjson-spec).\n ",examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]}),(0,a.gn)([d.Command.String({required:!1})],N.prototype,"name",void 0),(0,a.gn)([d.Command.Boolean("-v,--verbose")],N.prototype,"verbose",void 0),(0,a.gn)([d.Command.Boolean("--json")],N.prototype,"json",void 0),(0,a.gn)([d.Command.Path("bin")],N.prototype,"execute",null);var R=r(56537);class K extends c.BaseCommand{constructor(){super(...arguments),this.mirror=!1,this.all=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),t=await u.C.find(e);return(await f.P.start({configuration:e,stdout:this.context.stdout},async()=>{const e=(this.all||this.mirror)&&null!==t.mirrorCwd,r=!this.mirror;e&&await R.xfs.removePromise(t.mirrorCwd),r&&await R.xfs.removePromise(t.cwd)})).exitCode()}}K.usage=d.Command.Usage({description:"remove the shared cache files",details:"\n This command will remove all the files from the cache.\n\n By default only the local cache will be cleaned. This behavior can be disabled with the `--mirror`, which will lead to the removal of the global cache files instead, or `--all` (which will remove both the local and global caches for the current project).\n ",examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]}),(0,a.gn)([d.Command.Boolean("--mirror")],K.prototype,"mirror",void 0),(0,a.gn)([d.Command.Boolean("--all")],K.prototype,"all",void 0),(0,a.gn)([d.Command.Path("cache","clean")],K.prototype,"execute",null);var L=r(44674),T=r.n(L),P=r(31669);class U extends c.BaseCommand{constructor(){super(...arguments),this.json=!1,this.unsafe=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),t=this.name.replace(/[.[].*$/,""),r=this.name.replace(/^[^.[]*/,"");if(void 0===e.settings.get(t))throw new d.UsageError(`Couldn't find a configuration settings named "${t}"`);const n=_(e.getSpecial(t,{hideSecrets:!this.unsafe,getNativePaths:!0})),i=r?T()(n,r):n,o=await f.P.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async e=>{e.reportJson(i)});if(!this.json){if("string"==typeof i)return this.context.stdout.write(i+"\n"),o.exitCode();P.inspect.styles.name="cyan",this.context.stdout.write((0,P.inspect)(i,{depth:1/0,colors:!0,compact:!1})+"\n")}return o.exitCode()}}function _(e){if(e instanceof Map&&(e=Object.fromEntries(e)),"object"==typeof e&&null!==e)for(const t of Object.keys(e)){const r=e[t];"object"==typeof r&&null!==r&&(e[t]=_(r))}return e}U.usage=d.Command.Usage({description:"read a configuration settings",details:"\n This command will print a configuration setting.\n\n Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the `--no-redacted` to get the untransformed value.\n ",examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration","yarn config get 'npmScopes[\"my-company\"].npmRegistryServer'"],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]}),(0,a.gn)([d.Command.String()],U.prototype,"name",void 0),(0,a.gn)([d.Command.Boolean("--json")],U.prototype,"json",void 0),(0,a.gn)([d.Command.Boolean("--no-redacted")],U.prototype,"unsafe",void 0),(0,a.gn)([d.Command.Path("config","get")],U.prototype,"execute",null);var O=r(82558),j=r.n(O),Y=r(81534),G=r.n(Y);class J extends c.BaseCommand{constructor(){super(...arguments),this.json=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins);if(!e.projectCwd)throw new d.UsageError("This command must be run from within a project folder");const t=this.name.replace(/[.[].*$/,""),r=this.name.replace(/^[^.[]*/,"");if(void 0===e.settings.get(t))throw new d.UsageError(`Couldn't find a configuration settings named "${t}"`);const n=this.json?JSON.parse(this.value):this.value;await A.VK.updateConfiguration(e.projectCwd,e=>{if(r){const t=j()(e);return G()(t,this.name,n),t}return{...e,[t]:n}});const i=_((await A.VK.find(this.context.cwd,this.context.plugins)).getSpecial(t,{hideSecrets:!0,getNativePaths:!0})),o=r?T()(i,r):i;return(await f.P.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async e=>{P.inspect.styles.name="cyan",e.reportInfo(h.b.UNNAMED,`Successfully set ${this.name} to ${(0,P.inspect)(o,{depth:1/0,colors:!0,compact:!1})}`)})).exitCode()}}J.usage=d.Command.Usage({description:"change a configuration settings",details:"\n This command will set a configuration setting.\n\n When used without the `--json` flag, it can only set a simple configuration setting (a string, a number, or a boolean).\n\n When used with the `--json` flag, it can set both simple and complex configuration settings, including Arrays and Objects.\n ",examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",'yarn config set unsafeHttpWhitelist --json \'["*.example.com", "example.com"]\''],["Set a complex configuration setting (an Object) using the `--json` flag",'yarn config set packageExtensions --json \'{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }\'']]}),(0,a.gn)([d.Command.String()],J.prototype,"name",void 0),(0,a.gn)([d.Command.String()],J.prototype,"value",void 0),(0,a.gn)([d.Command.Boolean("--json")],J.prototype,"json",void 0),(0,a.gn)([d.Command.Path("config","set")],J.prototype,"execute",null);class H extends c.BaseCommand{constructor(){super(...arguments),this.verbose=!1,this.why=!1,this.json=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins,{strict:!1});return(await f.P.start({configuration:e,json:this.json,stdout:this.context.stdout},async t=>{if(e.invalid.size>0&&!this.json){for(const[r,n]of e.invalid)t.reportError(h.b.INVALID_CONFIGURATION_KEY,`Invalid configuration key "${r}" in ${n}`);t.reportSeparator()}if(this.json){const r=p.miscUtils.sortMap(e.settings.keys(),e=>e);for(const n of r){const r=e.settings.get(n),i=e.getSpecial(n,{hideSecrets:!0,getNativePaths:!0}),o=e.sources.get(n);this.verbose?t.reportJson({key:n,effective:i,source:o}):t.reportJson({key:n,effective:i,source:o,...r})}}else{const r=p.miscUtils.sortMap(e.settings.keys(),e=>e),n=r.reduce((e,t)=>Math.max(e,t.length),0),i={breakLength:1/0,colors:e.get("enableColors"),maxArrayLength:2};if(this.why||this.verbose){const o=r.map(t=>{const r=e.settings.get(t);if(!r)throw new Error(`Assertion failed: This settings ("${t}") should have been registered`);return[t,this.why?e.sources.get(t)||"":r.description]}),s=o.reduce((e,[,t])=>Math.max(e,t.length),0);for(const[r,A]of o)t.reportInfo(null,`${r.padEnd(n," ")} ${A.padEnd(s," ")} ${(0,P.inspect)(e.getSpecial(r,{hideSecrets:!0,getNativePaths:!0}),i)}`)}else for(const o of r)t.reportInfo(null,`${o.padEnd(n," ")} ${(0,P.inspect)(e.getSpecial(o,{hideSecrets:!0,getNativePaths:!0}),i)}`)}})).exitCode()}}H.usage=d.Command.Usage({description:"display the current configuration",details:"\n This command prints the current active configuration settings.\n\n When used together with the `-v,--verbose` option, the output will contain the settings description on top of the regular key/value information.\n\n When used together with the `--why` flag, the output will also contain the reason why a settings is set a particular way.\n\n If the `--json` flag is set the output will follow a JSON-stream output also known as NDJSON (https://github.com/ndjson/ndjson-spec).\n\n Note that the paths settings will be normalized - especially on Windows. It means that paths such as `C:\\project` will be transparently shown as `/mnt/c/project`.\n ",examples:[["Print the active configuration settings","$0 config"]]}),(0,a.gn)([d.Command.Boolean("-v,--verbose")],H.prototype,"verbose",void 0),(0,a.gn)([d.Command.Boolean("--why")],H.prototype,"why",void 0),(0,a.gn)([d.Command.Boolean("--json")],H.prototype,"json",void 0),(0,a.gn)([d.Command.Path("config")],H.prototype,"execute",null);class q extends d.Command{async execute(){const{plugins:e}=await A.VK.find(this.context.cwd,this.context.plugins),t=[];for(const r of e){const{commands:e}=r[1];if(e){const n=d.Cli.from(e).definitions();t.push([r[0],n])}}const n=this.cli.definitions(),i=r(60306)["@yarnpkg/builder"].bundles.standard;for(const e of t){const t=e[1];for(const r of t)n.find(e=>{return t=e.path,n=r.path,t.split(" ").slice(1).join()===n.split(" ").slice(1).join();var t,n}).plugin={name:e[0],isDefault:i.includes(e[0])}}this.context.stdout.write(JSON.stringify({commands:n},null,2)+"\n")}}(0,a.gn)([d.Command.Path("--clipanion=definitions")],q.prototype,"execute",null);class z extends d.Command{async execute(){this.context.stdout.write(this.cli.usage(null))}}(0,a.gn)([d.Command.Path("help"),d.Command.Path("--help"),d.Command.Path("-h")],z.prototype,"execute",null);class W extends d.Command{constructor(){super(...arguments),this.args=[]}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!p.structUtils.tryParseIdent(this.leadingArgument)){const e=y.y1.resolve(this.context.cwd,y.cS.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:e})}return await this.cli.run(["run",this.leadingArgument,...this.args])}}(0,a.gn)([d.Command.String()],W.prototype,"leadingArgument",void 0),(0,a.gn)([d.Command.Proxy()],W.prototype,"args",void 0);var V=r(59355);class X extends d.Command{async execute(){this.context.stdout.write((V.o||"")+"\n")}}(0,a.gn)([d.Command.Path("-v"),d.Command.Path("--version")],X.prototype,"execute",null);class Z extends c.BaseCommand{constructor(){super(...arguments),this.args=[]}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),{project:t}=await g.I.find(e,this.context.cwd);return await R.xfs.mktempPromise(async e=>{const{code:r}=await p.execUtils.pipevp(this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await p.scriptUtils.makeScriptEnv({project:t,binFolder:e})});return r})}}Z.usage=d.Command.Usage({description:"execute a shell command",details:"\n This command simply executes a shell binary within the context of the root directory of the active workspace.\n\n It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment).\n ",examples:[["Execute a shell command","$0 exec echo Hello World"]]}),(0,a.gn)([d.Command.String()],Z.prototype,"commandName",void 0),(0,a.gn)([d.Command.Proxy()],Z.prototype,"args",void 0),(0,a.gn)([d.Command.Path("exec")],Z.prototype,"execute",null);var $=r(35691),ee=r(55125);class te extends c.BaseCommand{constructor(){super(...arguments),this.json=!1,this.checkCache=!1,this.silent=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins);void 0!==this.inlineBuilds&&e.useWithSource("",{enableInlineBuilds:this.inlineBuilds},e.startingCwd,{overwrite:!0});const t=!!process.env.NOW_BUILDER,r=!!process.env.NETLIFY,n=async(t,{error:r})=>{const n=await f.P.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async e=>{r?e.reportError(h.b.DEPRECATED_CLI_SETTINGS,t):e.reportWarning(h.b.DEPRECATED_CLI_SETTINGS,t)});return n.hasErrors()?n.exitCode():null};if(void 0!==this.ignoreEngines){const e=await n("The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",{error:!t});if(null!==e)return e}if(void 0!==this.registry){const e=await n("The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file",{error:!1});if(null!==e)return e}if(void 0!==this.preferOffline){const e=await n("The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",{error:!t});if(null!==e)return e}if(void 0!==this.frozenLockfile){const e=await n("The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",{error:!0});if(null!==e)return e}if(void 0!==this.cacheFolder){const e=await n("The cache-folder option has been deprecated; use rc settings instead",{error:!r});if(null!==e)return e}const i=void 0===this.immutable&&void 0===this.frozenLockfile?e.get("enableImmutableInstalls"):this.immutable||this.frozenLockfile;if(null!==e.projectCwd){const t=await f.P.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async t=>{await async function(e,t){if(!e.projectCwd)return!1;const r=y.y1.join(e.projectCwd,e.get("lockfileFilename"));if(!await R.xfs.existsPromise(r))return!1;const n=await R.xfs.readFilePromise(r,"utf8");if(!n.includes("<<<<<<<"))return!1;if(t)throw new $.lk(h.b.AUTOMERGE_IMMUTABLE,"Cannot autofix a lockfile when running an immutable install");const[i,o]=function(e){const t=[[],[]],r=e.split(/\r?\n/g);let n=!1;for(;r.length>0;){const e=r.shift();if(void 0===e)throw new Error("Assertion failed: Some lines should remain");if(e.startsWith("<<<<<<<")){for(;r.length>0;){const e=r.shift();if(void 0===e)throw new Error("Assertion failed: Some lines should remain");if("======="===e){n=!1;break}n||e.startsWith("|||||||")?n=!0:t[0].push(e)}for(;r.length>0;){const e=r.shift();if(void 0===e)throw new Error("Assertion failed: Some lines should remain");if(e.startsWith(">>>>>>>"))break;t[1].push(e)}}else t[0].push(e),t[1].push(e)}return[t[0].join("\n"),t[1].join("\n")]}(n);let s,A;try{s=(0,ee.parseSyml)(i),A=(0,ee.parseSyml)(o)}catch(e){throw new $.lk(h.b.AUTOMERGE_FAILED_TO_PARSE,"The individual variants of the lockfile failed to parse")}const a={...s,...A};for(const[e,t]of Object.entries(a))"string"==typeof t&&delete a[e];return await R.xfs.changeFilePromise(r,(0,ee.stringifySyml)(a),{automaticNewlines:!0}),!0}(e,i)&&t.reportInfo(h.b.AUTOMERGE_SUCCESS,"Automatically fixed merge conflicts ðŸ‘")});if(t.hasErrors())return t.exitCode()}const{project:o,workspace:s}=await g.I.find(e,this.context.cwd),a=await u.C.find(e,{immutable:this.immutableCache,check:this.checkCache});if(!s)throw new c.WorkspaceRequiredError(o.cwd,this.context.cwd);return(await f.P.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!0},async e=>{await o.install({cache:a,report:e,immutable:i})})).exitCode()}}te.usage=d.Command.Usage({description:"install the project dependencies",details:"\n This command setup your project if needed. The installation is splitted in four different steps that each have their own characteristics:\n\n - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ).\n\n - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of `cacheFolder` in `yarn config` to see where are stored the cache files).\n\n - **Link:** Then we send the dependency tree information to internal plugins tasked from writing them on the disk in some form (for example by generating the .pnp.js file you might know).\n\n - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another.\n\n Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your .pnp.js file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches.\n\n If the `--immutable` option is set, Yarn will abort with an error exit code if anything in the install artifacts (`yarn.lock`, `.pnp.js`, ...) was to be modified. For backward compatibility we offer an alias under the name of `--frozen-lockfile`, but it will be removed in a later release.\n\n If the `--immutable-cache` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed).\n\n If the `--check-cache` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them.\n\n If the `--inline-builds` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments.\n\n If the `--json` flag is set the output will follow a JSON-stream output also known as NDJSON (https://github.com/ndjson/ndjson-spec).\n ",examples:[["Install the project","$0 install"],["Validate a project when using Zero-Installs","$0 install --immutable --immutable-cache"],["Validate a project when using Zero-Installs (slightly safer if you accept external PRs)","$0 install --immutable --immutable-cache --check-cache"]]}),(0,a.gn)([d.Command.Boolean("--json")],te.prototype,"json",void 0),(0,a.gn)([d.Command.Boolean("--immutable")],te.prototype,"immutable",void 0),(0,a.gn)([d.Command.Boolean("--immutable-cache")],te.prototype,"immutableCache",void 0),(0,a.gn)([d.Command.Boolean("--check-cache")],te.prototype,"checkCache",void 0),(0,a.gn)([d.Command.Boolean("--frozen-lockfile",{hidden:!0})],te.prototype,"frozenLockfile",void 0),(0,a.gn)([d.Command.Boolean("--prefer-offline",{hidden:!0})],te.prototype,"preferOffline",void 0),(0,a.gn)([d.Command.Boolean("--ignore-engines",{hidden:!0})],te.prototype,"ignoreEngines",void 0),(0,a.gn)([d.Command.String("--registry",{hidden:!0})],te.prototype,"registry",void 0),(0,a.gn)([d.Command.Boolean("--inline-builds")],te.prototype,"inlineBuilds",void 0),(0,a.gn)([d.Command.String("--cache-folder",{hidden:!0})],te.prototype,"cacheFolder",void 0),(0,a.gn)([d.Command.Boolean("--silent",{hidden:!0})],te.prototype,"silent",void 0),(0,a.gn)([d.Command.Path(),d.Command.Path("install")],te.prototype,"execute",null);class re extends c.BaseCommand{constructor(){super(...arguments),this.all=!1,this.private=!1,this.relative=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await g.I.find(e,this.context.cwd),n=await u.C.find(e);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);const i=y.y1.resolve(this.context.cwd,y.cS.toPortablePath(this.destination)),o=await A.VK.find(i,this.context.plugins),{project:s,workspace:a}=await g.I.find(o,i);if(!a)throw new c.WorkspaceRequiredError(s.cwd,i);const l=t.topLevelWorkspace,h=[];if(this.all){for(const e of s.workspaces)!e.manifest.name||e.manifest.private&&!this.private||h.push(e);if(0===h.length)throw new d.UsageError("No workspace found to be linked in the target project")}else{if(!a.manifest.name)throw new d.UsageError("The target workspace doesn't have a name and thus cannot be linked");if(a.manifest.private&&!this.private)throw new d.UsageError("The target workspace is marked private - use the --private flag to link it anyway");h.push(a)}for(const e of h){const r=p.structUtils.stringifyIdent(e.locator),n=this.relative?y.y1.relative(t.cwd,e.cwd):e.cwd;l.manifest.resolutions.push({pattern:{descriptor:{fullName:r}},reference:"portal:"+n})}return(await f.P.start({configuration:e,stdout:this.context.stdout},async e=>{await t.install({cache:n,report:e})})).exitCode()}}re.usage=d.Command.Usage({description:"connect the local project to another one",details:"\n This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\n\n If the `--all` option is set, all workspaces belonging to the target project will be linked to the current one.\n\n There is no `yarn unlink` command. To unlink the workspaces from the current project one must revert the changes made to the `resolutions` field.\n ",examples:[["Register a remote workspace for use in the current project","$0 link ~/ts-loader"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]}),(0,a.gn)([d.Command.String()],re.prototype,"destination",void 0),(0,a.gn)([d.Command.Boolean("--all")],re.prototype,"all",void 0),(0,a.gn)([d.Command.Boolean("-p,--private")],re.prototype,"private",void 0),(0,a.gn)([d.Command.Boolean("-r,--relative")],re.prototype,"relative",void 0),(0,a.gn)([d.Command.Path("link")],re.prototype,"execute",null);class ne extends c.BaseCommand{constructor(){super(...arguments),this.args=[]}async execute(){return this.cli.run(["exec","node",...this.args])}}ne.usage=d.Command.Usage({description:"run node with the hook already setup",details:"\n This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment).\n\n The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version.\n ",examples:[["Run a Node script","$0 node ./my-script.js"]]}),(0,a.gn)([d.Command.Proxy()],ne.prototype,"args",void 0),(0,a.gn)([d.Command.Path("node")],ne.prototype,"execute",null);var ie=r(12087),oe=r(85622),se=r.n(oe);class Ae extends c.BaseCommand{constructor(){super(...arguments),this.onlyIfNeeded=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins);if(e.get("yarnPath")&&this.onlyIfNeeded)return 0;let t;if("latest"===this.version||"berry"===this.version)t="https://github.com/yarnpkg/berry/raw/master/packages/yarnpkg-cli/bin/yarn.js";else if("classic"===this.version)t="https://nightly.yarnpkg.com/latest.js";else if(p.semverUtils.satisfiesWithPrereleases(this.version,">=2.0.0"))t=`https://github.com/yarnpkg/berry/raw/%40yarnpkg/cli/${this.version}/packages/yarnpkg-cli/bin/yarn.js`;else{if(!p.semverUtils.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))throw B().validRange(this.version)?new d.UsageError("Support for ranges got removed - please use the exact version you want to install, or 'latest' to get the latest build available"):new d.UsageError(`Invalid version descriptor "${this.version}"`);t=`https://github.com/yarnpkg/yarn/releases/download/v${this.version}/yarn-${this.version}.js`}return(await f.P.start({configuration:e,stdout:this.context.stdout},async r=>{r.reportInfo(h.b.UNNAMED,"Downloading "+e.format(t,"green"));const n=await p.httpUtils.get(t,{configuration:e});await ae(e,null,n,{report:r})})).exitCode()}}async function ae(e,t,r,{report:n}){const i=e.projectCwd?e.projectCwd:e.startingCwd;null===t&&await R.xfs.mktempPromise(async e=>{const n=y.y1.join(e,"yarn.cjs");await R.xfs.writeFilePromise(n,r);const{stdout:o}=await p.execUtils.execvp(process.execPath,[y.cS.fromPortablePath(n),"--version"],{cwd:i,env:{...process.env,YARN_IGNORE_PATH:"1"}});if(t=o.trim(),!B().valid(t))throw new Error("Invalid semver version")});const o=y.y1.resolve(i,".yarn/releases"),s=y.y1.resolve(o,`yarn-${t}.cjs`),a=y.y1.relative(e.startingCwd,s),c=y.y1.relative(i,s),u=e.get("yarnPath"),l=null===u||u.startsWith(o+"/");n.reportInfo(h.b.UNNAMED,"Saving the new release in "+e.format(a,"magenta")),await R.xfs.removePromise(y.y1.dirname(s)),await R.xfs.mkdirpPromise(y.y1.dirname(s)),await R.xfs.writeFilePromise(s,r),await R.xfs.chmodPromise(s,493),l&&await A.VK.updateConfiguration(i,{yarnPath:c})}Ae.usage=d.Command.Usage({description:"lock the Yarn version used by the project",details:"\n This command will download a specific release of Yarn directly from the Yarn GitHub repository, will store it inside your project, and will change the `yarnPath` settings from your project `.yarnrc.yml` file to point to the new file.\n\n A very good use case for this command is to enforce the version of Yarn used by the any single member of your team inside a same project - by doing this you ensure that you have control on Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting a different behavior than you.\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download a specific Yarn 2 build","$0 set version 2.0.0-rc.30"],["Switch back to a specific Yarn 1 release","$0 set version 1.22.1"]]}),(0,a.gn)([d.Command.Boolean("--only-if-needed")],Ae.prototype,"onlyIfNeeded",void 0),(0,a.gn)([d.Command.String()],Ae.prototype,"version",void 0),(0,a.gn)([d.Command.Path("policies","set-version"),d.Command.Path("set","version")],Ae.prototype,"execute",null);const ce=/^[0-9]+$/;function ue(e){return ce.test(e)?`pull/${e}/head`:e}class le extends c.BaseCommand{constructor(){super(...arguments),this.repository="https://github.com/yarnpkg/berry.git",this.branch="master",this.plugins=[],this.noMinify=!1,this.force=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),t=void 0!==this.installPath?y.y1.resolve(this.context.cwd,y.cS.toPortablePath(this.installPath)):y.y1.resolve(y.cS.toPortablePath((0,ie.tmpdir)()),"yarnpkg-sources",p.hashUtils.makeHash(this.repository).slice(0,6));return(await f.P.start({configuration:e,stdout:this.context.stdout},async r=>{await ge(this,{configuration:e,report:r,target:t}),r.reportSeparator(),r.reportInfo(h.b.UNNAMED,"Building a fresh bundle"),r.reportSeparator(),await he((({plugins:e,noMinify:t},r)=>[["yarn","build:cli",...(new Array).concat(...e.map(e=>["--plugin",se().resolve(r,e)])),...t?["--no-minify"]:[],"|"]])(this,t),{configuration:e,context:this.context,target:t}),r.reportSeparator();const n=y.y1.resolve(t,"packages/yarnpkg-cli/bundles/yarn.js"),i=await R.xfs.readFilePromise(n);await ae(e,"sources",i,{report:r})})).exitCode()}}async function he(e,{configuration:t,context:r,target:n}){for(const[i,...o]of e){const e="|"===o[o.length-1];if(e&&o.pop(),e)await p.execUtils.pipevp(i,o,{cwd:n,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(t.format(" $ "+[i,...o].join(" "),"grey")+"\n");try{await p.execUtils.execvp(i,o,{cwd:n,strict:!0})}catch(e){throw r.stdout.write(e.stdout||e.stack),e}}}}async function ge(e,{configuration:t,report:r,target:n}){let i=!1;if(!e.force&&R.xfs.existsSync(y.y1.join(n,".git"))){r.reportInfo(h.b.UNNAMED,"Fetching the latest commits"),r.reportSeparator();try{await he((({branch:e})=>[["git","fetch","origin",ue(e),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx"]])(e),{configuration:t,context:e.context,target:n}),i=!0}catch(e){r.reportSeparator(),r.reportWarning(h.b.UNNAMED,"Repository update failed; we'll try to regenerate it")}}i||(r.reportInfo(h.b.UNNAMED,"Cloning the remote repository"),r.reportSeparator(),await R.xfs.removePromise(n),await R.xfs.mkdirpPromise(n),await he((({repository:e,branch:t},r)=>[["git","init",y.cS.fromPortablePath(r)],["git","remote","add","origin",e],["git","fetch","origin",ue(t)],["git","reset","--hard","FETCH_HEAD"]])(e,n),{configuration:t,context:e.context,target:n}))}le.usage=d.Command.Usage({description:"build Yarn from master",details:"\n This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project.\n ",examples:[["Build Yarn from master","$0 set version from sources"]]}),(0,a.gn)([d.Command.String("--path")],le.prototype,"installPath",void 0),(0,a.gn)([d.Command.String("--repository")],le.prototype,"repository",void 0),(0,a.gn)([d.Command.String("--branch")],le.prototype,"branch",void 0),(0,a.gn)([d.Command.Array("--plugin")],le.prototype,"plugins",void 0),(0,a.gn)([d.Command.Boolean("--no-minify")],le.prototype,"noMinify",void 0),(0,a.gn)([d.Command.Boolean("-f,--force")],le.prototype,"force",void 0),(0,a.gn)([d.Command.Path("set","version","from","sources")],le.prototype,"execute",null);var fe=r(92184);async function pe(e){const t=await p.httpUtils.get("https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml",{configuration:e});return(0,ee.parseSyml)(t.toString())}class de extends c.BaseCommand{constructor(){super(...arguments),this.json=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins);return(await f.P.start({configuration:e,json:this.json,stdout:this.context.stdout},async t=>{const r=await pe(e);for(const[e,{experimental:n,...i}]of Object.entries(r)){let r=e;n&&(r+=" [experimental]"),t.reportJson({name:e,experimental:n,...i}),t.reportInfo(null,r)}})).exitCode()}}de.usage=d.Command.Usage({category:"Plugin-related commands",description:"list the available official plugins",details:"\n This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\n ",examples:[["List the official plugins","$0 plugin list"]]}),(0,a.gn)([d.Command.Boolean("--json")],de.prototype,"json",void 0),(0,a.gn)([d.Command.Path("plugin","list")],de.prototype,"execute",null);class Ce extends c.BaseCommand{async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins);return(await f.P.start({configuration:e,stdout:this.context.stdout},async t=>{const{project:r}=await g.I.find(e,this.context.cwd);let n,i;if(this.name.match(/^\.{0,2}[\\/]/)||y.cS.isAbsolute(this.name)){const o=y.y1.resolve(this.context.cwd,y.cS.toPortablePath(this.name));t.reportInfo(h.b.UNNAMED,"Reading "+e.format(o,"green")),n=y.y1.relative(r.cwd,o),i=await R.xfs.readFilePromise(o)}else{let r;if(this.name.match(/^https?:/)){try{new URL(this.name)}catch(e){throw new $.lk(h.b.INVALID_PLUGIN_REFERENCE,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}n=this.name,r=this.name}else{const t=p.structUtils.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),i=p.structUtils.stringifyIdent(t),o=await pe(e);if(!Object.prototype.hasOwnProperty.call(o,i))throw new $.lk(h.b.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${i}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be referenced by their name; any other plugin will have to be referenced through its public url (for example https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js).`);n=i,r=o[i].url}t.reportInfo(h.b.UNNAMED,"Downloading "+e.format(r,"green")),i=await p.httpUtils.get(r,{configuration:e})}await Ee(n,i,{project:r,report:t})})).exitCode()}}async function Ee(e,t,{project:r,report:n}){const{configuration:i}=r,o={},s={exports:o};(0,fe.runInNewContext)(t.toString(),{module:s,exports:o});const a=s.exports.name,c=`.yarn/plugins/${a}.cjs`,u=y.y1.resolve(r.cwd,c);n.reportInfo(h.b.UNNAMED,"Saving the new plugin in "+i.format(c,"magenta")),await R.xfs.mkdirpPromise(y.y1.dirname(u)),await R.xfs.writeFilePromise(u,t);const l={path:c,spec:e};await A.VK.updateConfiguration(r.cwd,e=>{const t=[];let n=!1;for(const i of e.plugins||[]){const e="string"!=typeof i?i.path:i,o=y.y1.resolve(r.cwd,y.cS.toPortablePath(e)),{name:s}=p.miscUtils.dynamicRequire(y.cS.fromPortablePath(o));s!==a?t.push(i):(t.push(l),n=!0)}return n||t.push(l),{plugins:t}})}Ce.usage=d.Command.Usage({category:"Plugin-related commands",description:"download a plugin",details:"\n This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations.\n\n Three types of plugin references are accepted:\n\n - If the plugin is stored within the Yarn repository, it can be referenced by name.\n - Third-party plugins can be referenced directly through their public urls.\n - Local plugins can be referenced by their path on the disk.\n\n Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the `@yarnpkg/builder` package).\n ",examples:[['Download and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import @yarnpkg/plugin-exec"],['Download and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import exec"],["Download and activate a community plugin","$0 plugin import https://example.org/path/to/plugin.js"],["Activate a local plugin","$0 plugin import ./path/to/plugin.js"]]}),(0,a.gn)([d.Command.String()],Ce.prototype,"name",void 0),(0,a.gn)([d.Command.Path("plugin","import")],Ce.prototype,"execute",null);class Ie extends c.BaseCommand{constructor(){super(...arguments),this.repository="https://github.com/yarnpkg/berry.git",this.branch="master",this.noMinify=!1,this.force=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),t=void 0!==this.installPath?y.y1.resolve(this.context.cwd,y.cS.toPortablePath(this.installPath)):y.y1.resolve(y.cS.toPortablePath((0,ie.tmpdir)()),"yarnpkg-sources",p.hashUtils.makeHash(this.repository).slice(0,6));return(await f.P.start({configuration:e,stdout:this.context.stdout},async r=>{const{project:n}=await g.I.find(e,this.context.cwd),i=p.structUtils.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),o=p.structUtils.stringifyIdent(i),s=await pe(e);if(!Object.prototype.hasOwnProperty.call(s,o))throw new $.lk(h.b.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${o}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);const A=o,a=A.replace(/@yarnpkg\//,"");await ge(this,{configuration:e,report:r,target:t}),r.reportSeparator(),r.reportInfo(h.b.UNNAMED,"Building a fresh "+a),r.reportSeparator(),await he((({pluginName:e,noMinify:t},r)=>[["yarn","build:"+e,...t?["--no-minify"]:[],"|"]])({pluginName:a,noMinify:this.noMinify}),{configuration:e,context:this.context,target:t}),r.reportSeparator();const c=y.y1.resolve(t,`packages/${a}/bundles/${A}.js`),u=await R.xfs.readFilePromise(c);await Ee(A,u,{project:n,report:r})})).exitCode()}}Ie.usage=d.Command.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:"\n This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations.\n\n The plugins can be referenced by their short name if sourced from the official Yarn repository.\n ",examples:[['Build and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import from sources @yarnpkg/plugin-exec"],['Build and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import from sources exec"]]}),(0,a.gn)([d.Command.String()],Ie.prototype,"name",void 0),(0,a.gn)([d.Command.String("--path")],Ie.prototype,"installPath",void 0),(0,a.gn)([d.Command.String("--repository")],Ie.prototype,"repository",void 0),(0,a.gn)([d.Command.String("--branch")],Ie.prototype,"branch",void 0),(0,a.gn)([d.Command.Boolean("--no-minify")],Ie.prototype,"noMinify",void 0),(0,a.gn)([d.Command.Boolean("-f,--force")],Ie.prototype,"force",void 0),(0,a.gn)([d.Command.Path("plugin","import","from","sources")],Ie.prototype,"execute",null);class me extends c.BaseCommand{async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),{project:t}=await g.I.find(e,this.context.cwd);return(await f.P.start({configuration:e,stdout:this.context.stdout},async r=>{const n=this.name,i=p.structUtils.parseIdent(n);if(!e.plugins.has(n))throw new d.UsageError(p.structUtils.prettyIdent(e,i)+" isn't referenced by the current configuration");const o=`.yarn/plugins/${n}.cjs`,s=y.y1.resolve(t.cwd,o);R.xfs.existsSync(s)&&(r.reportInfo(h.b.UNNAMED,`Removing ${e.format(o,A.a5.PATH)}...`),await R.xfs.removePromise(s)),r.reportInfo(h.b.UNNAMED,"Updating the configuration..."),await A.VK.updateConfiguration(t.cwd,e=>{if(!Array.isArray(e.plugins))return{};return{plugins:e.plugins.filter(e=>e.path!==o)}})})).exitCode()}}me.usage=d.Command.Usage({category:"Plugin-related commands",description:"remove a plugin",details:"\n This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration.\n\n **Note:** The plugins have to be referenced by their name property, which can be obtained using the `yarn plugin runtime` command. Shorthands are not allowed.\n ",examples:[["Remove a plugin imported from the Yarn repository","$0 plugin remove @yarnpkg/plugin-typescript"],["Remove a plugin imported from a local file","$0 plugin remove my-local-plugin"]]}),(0,a.gn)([d.Command.String()],me.prototype,"name",void 0),(0,a.gn)([d.Command.Path("plugin","remove")],me.prototype,"execute",null);class ye extends c.BaseCommand{constructor(){super(...arguments),this.json=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins);return(await f.P.start({configuration:e,json:this.json,stdout:this.context.stdout},async t=>{for(const r of e.plugins.keys()){const e=this.context.plugins.plugins.has(r);let n=r;e&&(n+=" [builtin]"),t.reportJson({name:r,builtin:e}),t.reportInfo(null,""+n)}})).exitCode()}}ye.usage=d.Command.Usage({category:"Plugin-related commands",description:"list the active plugins",details:"\n This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins.\n ",examples:[["List the currently active plugins","$0 plugin runtime"]]}),(0,a.gn)([d.Command.Boolean("--json")],ye.prototype,"json",void 0),(0,a.gn)([d.Command.Path("plugin","runtime")],ye.prototype,"execute",null);class we extends c.BaseCommand{constructor(){super(...arguments),this.idents=[]}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await g.I.find(e,this.context.cwd),n=await u.C.find(e);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);const i=new Set;for(const e of this.idents)i.add(p.structUtils.parseIdent(e).identHash);await t.resolveEverything({cache:n,report:new I.$});const o=e.get("bstatePath"),s=R.xfs.existsSync(o)?(0,ee.parseSyml)(await R.xfs.readFilePromise(o,"utf8")):{},a=new Map;for(const e of t.storedPackages.values()){if(!Object.prototype.hasOwnProperty.call(s,e.locatorHash))continue;if(0===i.size||i.has(e.identHash))continue;const t=s[e.locatorHash];a.set(e.locatorHash,t)}if(a.size>0){const r=e.get("bstatePath"),n=g.I.generateBuildStateFile(a,t.storedPackages);await R.xfs.mkdirpPromise(y.y1.dirname(r)),await R.xfs.changeFilePromise(r,n,{automaticNewlines:!0})}else await R.xfs.removePromise(o);return(await f.P.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async e=>{await t.install({cache:n,report:e})})).exitCode()}}we.usage=d.Command.Usage({description:"rebuild the project's native packages",details:"\n This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again.\n\n Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future).\n\n By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory.\n ",examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]}),(0,a.gn)([d.Command.Rest()],we.prototype,"idents",void 0),(0,a.gn)([d.Command.Path("rebuild")],we.prototype,"execute",null);var Be=r(2401),Qe=r.n(Be);class ve extends c.BaseCommand{constructor(){super(...arguments),this.all=!1,this.patterns=[]}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await g.I.find(e,this.context.cwd),n=await u.C.find(e);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);const o=this.all?t.workspaces:[r],s=[i.REGULAR,i.DEVELOPMENT,i.PEER],a=[];let l=!1;const h=[];for(const e of this.patterns){let t=!1;const r=p.structUtils.parseIdent(e);for(const n of o){const i=[...n.manifest.peerDependenciesMeta.keys()];for(const r of Qe()(i,e))n.manifest.peerDependenciesMeta.delete(r),l=!0,t=!0;for(const e of s){const i=n.manifest.getForScope(e),o=[...i.values()].map(e=>p.structUtils.stringifyIdent(e));for(const s of Qe()(o,p.structUtils.stringifyIdent(r))){const{identHash:r}=p.structUtils.parseIdent(s),o=i.get(r);if(void 0===o)throw new Error("Assertion failed: Expected the descriptor to be registered");n.manifest[e].delete(r),h.push([n,e,o]),l=!0,t=!0}}}t||a.push(e)}const C=a.length>1?"Patterns":"Pattern",E=a.length>1?"don't":"doesn't",I=this.all?"any":"this";if(a.length>0)throw new d.UsageError(`${C} ${a.join(", ")} ${E} match packages referenced by ${I} workspace`);if(l){await e.triggerMultipleHooks(e=>e.afterWorkspaceDependencyRemoval,h);return(await f.P.start({configuration:e,stdout:this.context.stdout},async e=>{await t.install({cache:n,report:e})})).exitCode()}return 0}}ve.usage=d.Command.Usage({description:"remove dependencies from the project",details:"\n This command will remove the packages matching the specified patterns from the current workspace.\n\n If the `-A,--all` option is set, the operation will be applied to all workspaces from the current project.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n ",examples:[["Remove a dependency from the current project","$0 remove lodash"],["Remove a dependency from all workspaces at once","$0 remove lodash --all"],["Remove all dependencies starting with `eslint-`","$0 remove 'eslint-*'"],["Remove all dependencies with the `@babel` scope","$0 remove '@babel/*'"],["Remove all dependencies matching `react-dom` or `react-helmet`","$0 remove 'react-{dom,helmet}'"]]}),(0,a.gn)([d.Command.Boolean("-A,--all")],ve.prototype,"all",void 0),(0,a.gn)([d.Command.Rest()],ve.prototype,"patterns",void 0),(0,a.gn)([d.Command.Path("remove")],ve.prototype,"execute",null);class De extends c.BaseCommand{async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await g.I.find(e,this.context.cwd);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);return(await f.P.start({configuration:e,stdout:this.context.stdout},async t=>{const n=r.manifest.scripts,i=p.miscUtils.sortMap(n.keys(),e=>e),o={breakLength:1/0,colors:e.get("enableColors"),maxArrayLength:2},s=i.reduce((e,t)=>Math.max(e,t.length),0);for(const[e,r]of n.entries())t.reportInfo(null,`${e.padEnd(s," ")} ${(0,P.inspect)(r,o)}`)})).exitCode()}}(0,a.gn)([d.Command.Path("run")],De.prototype,"execute",null);const be=new Map([["constraints",[["constraints","query"],["constraints","source"],["constraints"]]],["interactive-tools",[["upgrade-interactive"]]],["stage",[["stage"]]],["version",[["version","apply"],["version","check"],["version"]]],["workspace-tools",[["workspaces","foreach"],["workspace"]]]]);class Se extends c.BaseCommand{constructor(){super(...arguments),this.inspect=!1,this.inspectBrk=!1,this.topLevel=!1,this.binariesOnly=!1,this.args=[]}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r,locator:n}=await g.I.find(e,this.context.cwd);await t.restoreInstallState();const i=this.topLevel?t.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await p.scriptUtils.hasPackageScript(i,this.scriptName,{project:t}))return await p.scriptUtils.executePackageScript(i,this.scriptName,this.args,{project:t,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if((await p.scriptUtils.getPackageAccessibleBinaries(i,{project:t})).get(this.scriptName)){const e=[];return this.inspect&&("string"==typeof this.inspect?e.push("--inspect="+this.inspect):e.push("--inspect")),this.inspectBrk&&("string"==typeof this.inspectBrk?e.push("--inspect-brk="+this.inspectBrk):e.push("--inspect-brk")),await p.scriptUtils.executePackageAccessibleBinary(i,this.scriptName,this.args,{cwd:this.context.cwd,project:t,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:e})}if(!this.topLevel&&!this.binariesOnly&&r&&this.scriptName.includes(":")){const e=(await Promise.all(t.workspaces.map(async e=>e.manifest.scripts.has(this.scriptName)?e:null))).filter(e=>null!==e);if(1===e.length)return await p.scriptUtils.executeWorkspaceScript(e[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw"node-gyp"===this.scriptName?new d.UsageError(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${p.structUtils.prettyLocator(e,n)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new d.UsageError(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${p.structUtils.prettyLocator(e,n)}).`);{if("global"===this.scriptName)throw new d.UsageError("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");const e=[this.scriptName].concat(this.args);for(const[t,r]of be)for(const n of r)if(e.length>=n.length&&JSON.stringify(e.slice(0,n.length))===JSON.stringify(n))throw new d.UsageError(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${t} plugin. You can install it with "yarn plugin import ${t}".`);throw new d.UsageError(`Couldn't find a script named "${this.scriptName}".`)}}}Se.usage=d.Command.Usage({description:"run a script defined in the package.json",details:"\n This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace:\n\n - If the `scripts` field from your local package.json contains a matching script name, its definition will get executed.\n\n - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed (the `--inspect` and `--inspect-brk` options will then be forwarded to the underlying Node process).\n\n - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed.\n\n Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax).\n ",examples:[["Run the tests from the local workspace","$0 run test"],['Same thing, but without the "run" keyword',"$0 test"],["Inspect Webpack while running","$0 run --inspect-brk webpack"]]}),(0,a.gn)([d.Command.String("--inspect",{tolerateBoolean:!0})],Se.prototype,"inspect",void 0),(0,a.gn)([d.Command.String("--inspect-brk",{tolerateBoolean:!0})],Se.prototype,"inspectBrk",void 0),(0,a.gn)([d.Command.Boolean("-T,--top-level",{hidden:!0})],Se.prototype,"topLevel",void 0),(0,a.gn)([d.Command.Boolean("-B,--binaries-only",{hidden:!0})],Se.prototype,"binariesOnly",void 0),(0,a.gn)([d.Command.Boolean("--silent",{hidden:!0})],Se.prototype,"silent",void 0),(0,a.gn)([d.Command.String()],Se.prototype,"scriptName",void 0),(0,a.gn)([d.Command.Proxy()],Se.prototype,"args",void 0),(0,a.gn)([d.Command.Path("run")],Se.prototype,"execute",null);class ke extends c.BaseCommand{constructor(){super(...arguments),this.save=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await g.I.find(e,this.context.cwd),n=await u.C.find(e);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);const i=p.structUtils.parseDescriptor(this.descriptor,!0),o=p.structUtils.makeDescriptor(i,this.resolution);t.storedDescriptors.set(i.descriptorHash,i),t.storedDescriptors.set(o.descriptorHash,o),t.resolutionAliases.set(i.descriptorHash,o.descriptorHash);return(await f.P.start({configuration:e,stdout:this.context.stdout},async e=>{await t.install({cache:n,report:e})})).exitCode()}}ke.usage=d.Command.Usage({description:"enforce a package resolution",details:'\n This command updates the resolution table so that `descriptor` is resolved by `resolution`.\n\n Note that by default this command only affect the current resolution table - meaning that this "manual override" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, add the `-s,--save` flag which will also edit the `resolutions` field from your top-level manifest.\n\n Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\n ',examples:[["Force all instances of lodash@^1.2.3 to resolve to 1.5.0","$0 set resolution lodash@^1.2.3 1.5.0"]]}),(0,a.gn)([d.Command.String()],ke.prototype,"descriptor",void 0),(0,a.gn)([d.Command.String()],ke.prototype,"resolution",void 0),(0,a.gn)([d.Command.Boolean("-s,--save")],ke.prototype,"save",void 0),(0,a.gn)([d.Command.Path("set","resolution")],ke.prototype,"execute",null);class xe extends c.BaseCommand{constructor(){super(...arguments),this.patterns=[],this.interactive=!1,this.verbose=!1,this.exact=!1,this.tilde=!1,this.caret=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await g.I.find(e,this.context.cwd),n=await u.C.find(e);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);const o=E().createPromptModule({input:this.context.stdin,output:this.context.stdout}),a=Q(this,t),C=this.interactive?[s.KEEP,s.REUSE,s.PROJECT,s.LATEST]:[s.PROJECT,s.LATEST],I=[],m=[];for(const e of this.patterns){let r=!1;const o=p.structUtils.parseDescriptor(e);for(const e of t.workspaces)for(const s of[i.REGULAR,i.DEVELOPMENT]){const i=[...e.manifest.getForScope(s).values()].map(e=>p.structUtils.stringifyIdent(e));for(const A of Qe()(i,p.structUtils.stringifyIdent(o))){const i=p.structUtils.parseIdent(A),c=e.manifest[s].get(i.identHash);if(void 0===c)throw new Error("Assertion failed: Expected the descriptor to be registered");const u=p.structUtils.makeDescriptor(i,o.range);I.push(Promise.resolve().then(async()=>[e,s,c,await x(u,{project:t,workspace:e,cache:n,target:s,modifier:a,strategies:C})])),r=!0}}r||m.push(e)}if(m.length>1)throw new d.UsageError(`Patterns ${m.join(", ")} don't match any packages referenced by any workspace`);if(m.length>0)throw new d.UsageError(`Pattern ${m[0]} doesn't match any packages referenced by any workspace`);const y=await Promise.all(I),w=await l.h.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async r=>{for(const[,,n,i]of y){const o=i.filter(e=>null!==e.descriptor);0===o.length?t.configuration.get("enableNetwork")?r.reportError(h.b.CANT_SUGGEST_RESOLUTIONS,p.structUtils.prettyDescriptor(e,n)+" can't be resolved to a satisfying range"):r.reportError(h.b.CANT_SUGGEST_RESOLUTIONS,p.structUtils.prettyDescriptor(e,n)+" can't be resolved to a satisfying range (note: network resolution has been disabled)"):o.length>1&&!this.interactive&&r.reportError(h.b.CANT_SUGGEST_RESOLUTIONS,p.structUtils.prettyDescriptor(e,n)+" has multiple possible upgrade strategies; use -i to disambiguate manually")}});if(w.hasErrors())return w.exitCode();let B=!1;const v=[];for(const[r,n,,i]of y){let s;const A=i.filter(e=>null!==e.descriptor),a=A[0].descriptor,c=A.every(e=>p.structUtils.areDescriptorsEqual(e.descriptor,a));1===A.length||c?s=a:(B=!0,({answer:s}=await o({type:"list",name:"answer",message:`Which range to you want to use in ${p.structUtils.prettyWorkspace(e,r)} ⯠${n}?`,choices:i.map(({descriptor:e,reason:r})=>e?{name:r,value:e,short:p.structUtils.prettyDescriptor(t.configuration,e)}:{name:r,disabled:()=>!0})})));const u=r.manifest[n].get(s.identHash);if(void 0===u)throw new Error("Assertion failed: This descriptor should have a matching entry");if(u.descriptorHash!==s.descriptorHash)r.manifest[n].set(s.identHash,s),v.push([r,n,u,s]);else{const n=e.makeResolver(),i={project:t,resolver:n},o=n.bindDescriptor(u,r.anchoredLocator,i);t.forgetResolution(o)}}await e.triggerMultipleHooks(e=>e.afterWorkspaceDependencyReplacement,v),B&&this.context.stdout.write("\n");return(await f.P.start({configuration:e,stdout:this.context.stdout},async e=>{await t.install({cache:n,report:e})})).exitCode()}}xe.usage=d.Command.Usage({description:"upgrade dependencies across the project",details:"\n This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\n\n If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\n\n The, `-C,--caret`, `-E,--exact` and `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\n\n This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\n ",examples:[["Upgrade all instances of lodash to the latest release","$0 up lodash"],["Upgrade all instances of lodash to the latest release, but ask confirmation for each","$0 up lodash -i"],["Upgrade all instances of lodash to 1.2.3","$0 up lodash@1.2.3"],["Upgrade all instances of packages with the `@babel` scope to the latest release","$0 up '@babel/*'"],["Upgrade all instances of packages containing the word `jest` to the latest release","$0 up '*jest*'"],["Upgrade all instances of packages with the `@babel` scope to 7.0.0","$0 up '@babel/*@7.0.0'"]]}),(0,a.gn)([d.Command.Rest()],xe.prototype,"patterns",void 0),(0,a.gn)([d.Command.Boolean("-i,--interactive")],xe.prototype,"interactive",void 0),(0,a.gn)([d.Command.Boolean("-v,--verbose")],xe.prototype,"verbose",void 0),(0,a.gn)([d.Command.Boolean("-E,--exact")],xe.prototype,"exact",void 0),(0,a.gn)([d.Command.Boolean("-T,--tilde")],xe.prototype,"tilde",void 0),(0,a.gn)([d.Command.Boolean("-C,--caret")],xe.prototype,"caret",void 0),(0,a.gn)([d.Command.Path("up")],xe.prototype,"execute",null);var Fe=r(94682);class Me extends c.BaseCommand{constructor(){super(...arguments),this.recursive=!1,this.peers=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await g.I.find(e,this.context.cwd);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);await t.restoreInstallState();const n=p.structUtils.parseIdent(this.package).identHash,i=this.recursive?function(e,t,{configuration:r,peers:n}){const i=p.miscUtils.sortMap(e.workspaces,e=>p.structUtils.stringifyLocator(e.anchoredLocator)),o=new Set,s=new Set,A=r=>{if(o.has(r.locatorHash))return s.has(r.locatorHash);if(o.add(r.locatorHash),r.identHash===t)return s.add(r.locatorHash),!0;let i=!1;r.identHash===t&&(i=!0);for(const t of r.dependencies.values()){if(!n&&r.peerDependencies.has(t.identHash))continue;const o=e.storedResolutions.get(t.descriptorHash);if(!o)throw new Error("Assertion failed: The resolution should have been registered");const s=e.storedPackages.get(o);if(!s)throw new Error("Assertion failed: The package should have been registered");A(s)&&(i=!0)}return i&&s.add(r.locatorHash),i};for(const t of i){const r=e.storedPackages.get(t.anchoredLocator.locatorHash);if(!r)throw new Error("Assertion failed: The package should have been registered");A(r)}const a=new Set,c={},u=(t,i,o)=>{if(!s.has(t.locatorHash))return;const A={};if(i[null!==o?`${p.structUtils.prettyLocator(r,t)} (via ${p.structUtils.prettyRange(r,o)})`:""+p.structUtils.prettyLocator(r,t)]=A,!a.has(t.locatorHash)&&(a.add(t.locatorHash),null===o||!e.tryWorkspaceByLocator(t)))for(const r of t.dependencies.values()){if(!n&&t.peerDependencies.has(r.identHash))continue;const i=e.storedResolutions.get(r.descriptorHash);if(!i)throw new Error("Assertion failed: The resolution should have been registered");const o=e.storedPackages.get(i);if(!o)throw new Error("Assertion failed: The package should have been registered");u(o,A,r.range)}};for(const t of i){const r=e.storedPackages.get(t.anchoredLocator.locatorHash);if(!r)throw new Error("Assertion failed: The package should have been registered");u(r,c,null)}return c}(t,n,{configuration:e,peers:this.peers}):function(e,t,{configuration:r,peers:n}){const i=p.miscUtils.sortMap(e.storedPackages.values(),e=>p.structUtils.stringifyLocator(e)),o={};for(const s of i){let i=null;for(const A of s.dependencies.values()){if(!n&&s.peerDependencies.has(A.identHash))continue;const a=e.storedResolutions.get(A.descriptorHash);if(!a)throw new Error("Assertion failed: The resolution should have been registered");const c=e.storedPackages.get(a);if(!c)throw new Error("Assertion failed: The package should have been registered");if(c.identHash!==t)continue;if(null===i){i={};const e=""+p.structUtils.prettyLocator(r,s);o[e]=i}const u=`${p.structUtils.prettyLocator(r,c)} (via ${p.structUtils.prettyRange(r,A.range)})`;i[u]={}}}return o}(t,n,{configuration:e,peers:this.peers});!function(e,t){let r=(0,Fe.asTree)(t,!1,!1);r=r.replace(/^([├└]─)/gm,"│\n$1").replace(/^│\n/,""),e.write(r)}(this.context.stdout,i)}}Me.usage=d.Command.Usage({description:"display the reason why a package is needed",details:'\n This command prints the exact reasons why a package appears in the dependency tree.\n\n If `-R,--recursive` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named "Foo" when looking for "Bar", it means that "Foo" already got printed higher in the tree.\n\n If `--peers` is set, the command will also print the peer dependencies that match the specified name.\n ',examples:[["Explain why lodash is used in your project","$0 why lodash"]]}),(0,a.gn)([d.Command.String()],Me.prototype,"package",void 0),(0,a.gn)([d.Command.Boolean("-R,--recursive")],Me.prototype,"recursive",void 0),(0,a.gn)([d.Command.Boolean("--peers")],Me.prototype,"peers",void 0),(0,a.gn)([d.Command.Path("why")],Me.prototype,"execute",null);class Ne extends c.BaseCommand{constructor(){super(...arguments),this.verbose=!1,this.json=!1}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),{project:t}=await g.I.find(e,this.context.cwd);return(await f.P.start({configuration:e,json:this.json,stdout:this.context.stdout},async e=>{for(const r of t.workspaces){const{manifest:n}=r;let i;if(this.verbose){const e=new Set,r=new Set;for(const i of m.G.hardDependencies)for(const[o,s]of n.getForScope(i)){const n=t.tryWorkspaceByDescriptor(s);null===n?t.workspacesByIdent.has(o)&&r.add(s):e.add(n)}i={workspaceDependencies:Array.from(e).map(e=>e.relativeCwd),mismatchedWorkspaceDependencies:Array.from(r).map(e=>p.structUtils.stringifyDescriptor(e))}}e.reportInfo(null,""+r.relativeCwd),e.reportJson({location:r.relativeCwd,name:n.name?p.structUtils.stringifyIdent(n.name):null,...i})}})).exitCode()}}Ne.usage=d.Command.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project. If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\n\n If the `--json` flag is set the output will follow a JSON-stream output also known as NDJSON (https://github.com/ndjson/ndjson-spec).\n "}),(0,a.gn)([d.Command.Boolean("-v,--verbose")],Ne.prototype,"verbose",void 0),(0,a.gn)([d.Command.Boolean("--json")],Ne.prototype,"json",void 0),(0,a.gn)([d.Command.Path("workspaces","list")],Ne.prototype,"execute",null);class Re extends d.Command{constructor(){super(...arguments),this.args=[]}async execute(){const e=await A.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await g.I.find(e,this.context.cwd);if(!r)throw new c.WorkspaceRequiredError(t.cwd,this.context.cwd);const n=t.workspaces,i=new Map(n.map(e=>{const t=p.structUtils.convertToIdent(e.locator);return[p.structUtils.stringifyIdent(t),e]})),o=i.get(this.workspaceName);if(void 0===o){const e=Array.from(i.keys()).sort();throw new d.UsageError(`Workspace '${this.workspaceName}' not found. Did you mean any of the following:\n - ${e.join("\n - ")}?`)}return this.cli.run([this.commandName,...this.args],{cwd:o.cwd})}}Re.usage=d.Command.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:"\n This command will run a given sub-command on a single workspace.\n ",examples:[["Add a package to a single workspace","yarn workspace components add -D react"],["Run build script on a single workspace","yarn workspace components run build"]]}),(0,a.gn)([d.Command.String()],Re.prototype,"workspaceName",void 0),(0,a.gn)([d.Command.String()],Re.prototype,"commandName",void 0),(0,a.gn)([d.Command.Proxy()],Re.prototype,"args",void 0),(0,a.gn)([d.Command.Path("workspace")],Re.prototype,"execute",null);const Ke={configuration:{enableImmutableInstalls:{description:"If true, prevents the install command from modifying the lockfile",type:A.a2.BOOLEAN,default:!1},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:A.a2.STRING,default:o.CARET}},commands:[K,U,J,ke,le,Ae,Ne,q,z,W,X,M,N,H,Z,te,re,ne,Ie,Ce,me,de,ye,we,ve,De,Se,xe,Me,Re]}},41466:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>u});var n=r(84132),i=r(46009),o=r(75448);const s=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,A=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/;var a=r(46611),c=r(32485);const u={fetchers:[class{supports(e,t){return!!A.test(e.reference)&&!!e.reference.startsWith("file:")}getLocalPath(e,t){return null}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,[i,o,s]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,n.structUtils.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from the disk"),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:i,releaseFs:o,prefixPath:n.structUtils.getIdentVendorPath(e),checksum:s}}async fetchFromDisk(e,t){const{parentLocator:r,path:s}=n.structUtils.parseFileStyleRange(e.reference,{protocol:"file:"}),A=i.y1.isAbsolute(s)?{packageFs:new o.M(i.LZ.root),prefixPath:i.LZ.dot,localPath:i.LZ.root}:await t.fetcher.fetch(r,t),a=A.localPath?{packageFs:new o.M(i.LZ.root),prefixPath:i.y1.relative(i.LZ.root,A.localPath)}:A;A!==a&&A.releaseFs&&A.releaseFs();const c=a.packageFs,u=i.y1.join(a.prefixPath,s),l=await c.readFilePromise(u);return await n.miscUtils.releaseAfterUseAsync(async()=>await n.tgzUtils.convertToZip(l,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:n.structUtils.getIdentVendorPath(e),stripComponents:1}),a.releaseFs)}},class{supports(e,t){return!!e.reference.startsWith("file:")}getLocalPath(e,t){const{parentLocator:r,path:o}=n.structUtils.parseFileStyleRange(e.reference,{protocol:"file:"});if(i.y1.isAbsolute(o))return o;const s=t.fetcher.getLocalPath(r,t);return null===s?null:i.y1.resolve(s,o)}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,[i,o,s]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,n.structUtils.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from the disk"),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:i,releaseFs:o,prefixPath:n.structUtils.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:s}}async fetchFromDisk(e,t){const{parentLocator:r,path:s}=n.structUtils.parseFileStyleRange(e.reference,{protocol:"file:"}),A=i.y1.isAbsolute(s)?{packageFs:new o.M(i.LZ.root),prefixPath:i.LZ.dot,localPath:i.LZ.root}:await t.fetcher.fetch(r,t),a=A.localPath?{packageFs:new o.M(i.LZ.root),prefixPath:i.y1.relative(i.LZ.root,A.localPath)}:A;A!==a&&A.releaseFs&&A.releaseFs();const c=a.packageFs,u=i.y1.join(a.prefixPath,s);return await n.miscUtils.releaseAfterUseAsync(async()=>await n.tgzUtils.makeArchiveFromDirectory(u,{baseFs:c,prefixPath:n.structUtils.getIdentVendorPath(e),compressionLevel:t.project.configuration.get("compressionLevel")}),a.releaseFs)}}],resolvers:[class{supportsDescriptor(e,t){return!!A.test(e.range)&&(!!e.range.startsWith("file:")||!!s.test(e.range))}supportsLocator(e,t){return!!A.test(e.reference)&&!!e.reference.startsWith("file:")}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,r){return s.test(e.range)&&(e=n.structUtils.makeDescriptor(e,"file:"+e.range)),n.structUtils.bindDescriptor(e,{locator:n.structUtils.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){let o=e.range;return o.startsWith("file:")&&(o=o.slice("file:".length)),[n.structUtils.makeLocator(e,"file:"+i.cS.toPortablePath(o))]}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");const r=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),i=await n.miscUtils.releaseAfterUseAsync(async()=>await a.G.find(r.prefixPath,{baseFs:r.packageFs}),r.releaseFs);return{...e,version:i.version||"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:c.U.HARD,dependencies:i.dependencies,peerDependencies:i.peerDependencies,dependenciesMeta:i.dependenciesMeta,peerDependenciesMeta:i.peerDependenciesMeta,bin:i.bin}}},class{supportsDescriptor(e,t){return!!e.range.match(s)||!!e.range.startsWith("file:")}supportsLocator(e,t){return!!e.reference.startsWith("file:")}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,r){return s.test(e.range)&&(e=n.structUtils.makeDescriptor(e,"file:"+e.range)),n.structUtils.bindDescriptor(e,{locator:n.structUtils.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){let o=e.range;return o.startsWith("file:")&&(o=o.slice("file:".length)),[n.structUtils.makeLocator(e,"file:"+i.cS.toPortablePath(o))]}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");const r=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),i=await n.miscUtils.releaseAfterUseAsync(async()=>await a.G.find(r.prefixPath,{baseFs:r.packageFs}),r.releaseFs);return{...e,version:i.version||"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:c.U.HARD,dependencies:i.dependencies,peerDependencies:i.peerDependencies,dependenciesMeta:i.dependenciesMeta,peerDependenciesMeta:i.peerDependenciesMeta,bin:i.bin}}}]}},10284:(e,t,r)=>{"use strict";r.r(t),r.d(t,{gitUtils:()=>n,default:()=>B});var n={};r.r(n),r.d(n,{TreeishProtocols:()=>g,clone:()=>m,isGitUrl:()=>f,lsRemote:()=>E,normalizeLocator:()=>C,normalizeRepoUrl:()=>d,resolveUrl:()=>I,splitRepoUrl:()=>p});var i=r(84132),o=r(46009),s=r(56537),A=r(71191),a=r.n(A),c=r(53887),u=r.n(c);function l(){return{...process.env,GIT_SSH_COMMAND:"ssh -o BatchMode=yes"}}const h=[/^ssh:/,/^git(?:\+ssh)?:/,/^(?:git\+)?https?:[^#]+\/[^#]+(?:\.git)(?:#.*)?$/,/^(?:git\+)https?:[^#]+\/[^#]+(?:\.git)?(?:#.*)?$/,/^git@[^#]+\/[^#]+\.git(?:#.*)?$/,/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z._0-9-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\.git)?(?:#.*)?$/,/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/];var g;function f(e){return!!e&&h.some(t=>!!e.match(t))}function p(e){const t=(e=d(e)).indexOf("#");if(-1===t)return{repo:e,treeish:{protocol:g.Head,request:"master"},extra:{}};const r=e.slice(0,t),n=e.slice(t+1);if(n.match(/^[a-z]+=/)){const e=a().parse(n);for(const[t,r]of Object.entries(e))if("string"!=typeof r)throw new Error(`Assertion failed: The ${t} parameter must be a literal string`);const t=Object.values(g).find(t=>Object.prototype.hasOwnProperty.call(e,t));let i,o;void 0!==t?(i=t,o=e[t]):(i=g.Head,o="master");for(const t of Object.values(g))delete e[t];return{repo:r,treeish:{protocol:i,request:o},extra:e}}{const e=n.indexOf(":");let t,i;return-1===e?(t=null,i=n):(t=n.slice(0,e),i=n.slice(e+1)),{repo:r,treeish:{protocol:t,request:i},extra:{}}}}function d(e){return e=(e=(e=e.replace(/^git\+https:/,"https:")).replace(/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3")).replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3")}function C(e){return i.structUtils.makeLocator(e,d(e.reference))}async function E(e,t){if(!t.get("enableNetwork"))throw new Error(`Network access has been disabled by configuration (${e})`);let r;try{r=await i.execUtils.execvp("git",["ls-remote","--refs",d(e)],{cwd:t.startingCwd,env:l(),strict:!0})}catch(t){throw t.message=`Listing the refs for ${e} failed`,t}const n=new Map,o=/^([a-f0-9]{40})\t(refs\/[^\n]+)/gm;let s;for(;null!==(s=o.exec(r.stdout));)n.set(s[2],s[1]);return n}async function I(e,t){const{repo:r,treeish:{protocol:n,request:i},extra:o}=p(e),s=await E(r,t),A=(e,t)=>{switch(e){case g.Commit:if(!t.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return a().stringify({...o,commit:t});case g.Head:{const e=s.get("refs/heads/"+t);if(void 0===e)throw new Error(`Unknown head ("${t}")`);return a().stringify({...o,commit:e})}case g.Tag:{const e=s.get("refs/tags/"+t);if(void 0===e)throw new Error(`Unknown tag ("${t}")`);return a().stringify({...o,commit:e})}case g.Semver:{if(!u().validRange(t))throw new Error(`Invalid range ("${t}")`);const e=new Map([...s.entries()].filter(([e])=>e.startsWith("refs/tags/")).map(([e,t])=>[u().parse(e.slice(10)),t]).filter(e=>null!==e[0])),r=u().maxSatisfying([...e.keys()],t);if(null===r)throw new Error(`No matching range ("${t}")`);return a().stringify({...o,commit:e.get(r)})}case null:{let e;if(null!==(e=c(g.Commit,t)))return e;if(null!==(e=c(g.Tag,t)))return e;if(null!==(e=c(g.Head,t)))return e;throw t.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${t}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${t}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${e}")`)}},c=(e,t)=>{try{return A(e,t)}catch(e){return null}};return`${r}#${A(n,i)}`}async function m(e,t){if(!t.get("enableNetwork"))throw new Error(`Network access has been disabled by configuration (${e})`);const{repo:r,treeish:{protocol:n,request:A}}=p(e);if("commit"!==n)throw new Error("Invalid treeish protocol when cloning");const a=await s.xfs.mktempPromise(),c={cwd:a,env:l(),strict:!0};try{await i.execUtils.execvp("git",["clone","-c core.autocrlf=false",""+d(r),o.cS.fromPortablePath(a)],c),await i.execUtils.execvp("git",["checkout",""+A],c)}catch(e){throw e.message="Repository clone failed: "+e.message,e}return a}!function(e){e.Commit="commit",e.Head="head",e.Tag="tag",e.Semver="semver"}(g||(g={}));var y=r(32485),w=r(46611);const B={fetchers:[class{supports(e,t){return f(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,n=C(e),o=new Map(t.checksums);o.set(n.locatorHash,r);const s={...t,checksums:o},A=await this.downloadHosted(n,s);if(null!==A)return A;const[a,c,u]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,i.structUtils.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from the remote repository"),loader:()=>this.cloneFromRemote(n,s),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:a,releaseFs:c,prefixPath:i.structUtils.getIdentVendorPath(e),checksum:u}}async downloadHosted(e,t){return t.project.configuration.reduceHook(e=>e.fetchHostedRepository,null,e,t)}async cloneFromRemote(e,t){const r=await m(e.reference,t.project.configuration),n=p(e.reference),A=o.y1.join(r,"package.tgz");await i.scriptUtils.prepareExternalProject(r,A,{configuration:t.project.configuration,report:t.report,workspace:n.extra.workspace});const a=await s.xfs.readFilePromise(A);return await i.miscUtils.releaseAfterUseAsync(async()=>await i.tgzUtils.convertToZip(a,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:i.structUtils.getIdentVendorPath(e),stripComponents:1}))}}],resolvers:[class{supportsDescriptor(e,t){return f(e.range)}supportsLocator(e,t){return f(e.reference)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){const n=await I(e.range,r.project.configuration);return[i.structUtils.makeLocator(e,n)]}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");const r=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await i.miscUtils.releaseAfterUseAsync(async()=>await w.G.find(r.prefixPath,{baseFs:r.packageFs}),r.releaseFs);return{...e,version:n.version||"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:y.U.HARD,dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin}}}]}},23599:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>h});var n=r(84132),i=r(56537),o=r(75448),s=r(46009),A=r(10284),a=r(71191),c=r.n(a);const u=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];class l{supports(e,t){return!(!(r=e.reference)||!u.some(e=>!!r.match(e)));var r}getLocalPath(e,t){return null}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,[i,o,s]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,n.structUtils.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from GitHub"),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:i,releaseFs:o,prefixPath:n.structUtils.getIdentVendorPath(e),checksum:s}}async fetchFromNetwork(e,t){const r=await n.httpUtils.get(this.getLocatorUrl(e,t),{configuration:t.project.configuration});return await i.xfs.mktempPromise(async a=>{const c=new o.M(a);await n.tgzUtils.extractArchiveTo(r,c,{stripComponents:1});const u=A.gitUtils.splitRepoUrl(e.reference),l=s.y1.join(a,"package.tgz");await n.scriptUtils.prepareExternalProject(a,l,{configuration:t.project.configuration,report:t.report,workspace:u.extra.workspace});const h=await i.xfs.readFilePromise(l);return await n.tgzUtils.convertToZip(h,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:n.structUtils.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,t){const{auth:r,username:n,reponame:i,treeish:o}=function(e){let t;for(const r of u)if(t=e.match(r),t)break;if(!t)throw new Error(`Input cannot be parsed as a valid GitHub URL ('${e}').`);let[,r,n,i,o="master"]=t;const{commit:s}=c().parse(o);return o=s||o.replace(/[^:]*:/,""),{auth:r,username:n,reponame:i,treeish:o}}(e.reference);return`https://${r?r+"@":""}github.com/${n}/${i}/archive/${o}.tar.gz`}}const h={hooks:{async fetchHostedRepository(e,t,r){if(null!==e)return e;const n=new l;if(!n.supports(t,r))return null;try{return await n.fetch(t,r)}catch(e){return null}}}}},21754:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>a});var n=r(84132);const i=/^[^?]*\.(?:tar\.gz|tgz)(?:\?.*)?$/,o=/^https?:/;var s=r(46611),A=r(32485);const a={fetchers:[class{supports(e,t){return!!i.test(e.reference)&&!!o.test(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,[i,o,s]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,n.structUtils.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from the remote server"),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:i,releaseFs:o,prefixPath:n.structUtils.getIdentVendorPath(e),checksum:s}}async fetchFromNetwork(e,t){const r=await n.httpUtils.get(e.reference,{configuration:t.project.configuration});return await n.tgzUtils.convertToZip(r,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:n.structUtils.getIdentVendorPath(e),stripComponents:1})}}],resolvers:[class{supportsDescriptor(e,t){return!!i.test(e.range)&&!!o.test(e.range)}supportsLocator(e,t){return!!i.test(e.reference)&&!!o.test(e.reference)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){return[n.structUtils.convertDescriptorToLocator(e)]}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");const r=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),i=await n.miscUtils.releaseAfterUseAsync(async()=>await s.G.find(r.prefixPath,{baseFs:r.packageFs}),r.releaseFs);return{...e,version:i.version||"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:A.U.HARD,dependencies:i.dependencies,peerDependencies:i.peerDependencies,dependenciesMeta:i.dependenciesMeta,peerDependenciesMeta:i.peerDependenciesMeta,bin:i.bin}}}]}},74230:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>p});var n=r(27122),i=r(36370),o=r(95397),s=r(46611),A=r(40376),a=r(84132),c=r(56537),u=r(46009),l=r(17278),h=r(7564),g=r(31669);class f extends o.BaseCommand{constructor(){super(...arguments),this.usev2=!1,this.assumeFreshProject=!1,this.yes=!1,this.private=!1,this.workspace=!1,this.install=!1}async execute(){if(c.xfs.existsSync(u.y1.join(this.context.cwd,s.G.fileName)))throw new l.UsageError("A package.json already exists in the specified directory");const e=await n.VK.find(this.context.cwd,this.context.plugins),t=this.install?!0===this.install?"latest":this.install:null;return null!==t?await this.executeProxy(e,t):await this.executeRegular(e)}async executeProxy(e,t){if(null!==e.get("yarnPath"))throw new l.UsageError(`Cannot use the --install flag when the current directory already uses yarnPath (from ${e.sources.get("yarnPath")})`);if(null!==e.projectCwd)throw new l.UsageError("Cannot use the --install flag when the current directory is already part of a project");c.xfs.existsSync(this.context.cwd)||await c.xfs.mkdirpPromise(this.context.cwd);const r=u.y1.join(this.context.cwd,e.get("lockfileFilename"));c.xfs.existsSync(r)||await c.xfs.writeFilePromise(r,"");const n=await this.cli.run(["set","version",t]);if(0!==n)return n;this.context.stdout.write("\n");const i=["--assume-fresh-project"];return this.private&&i.push("-p"),this.workspace&&i.push("-w"),this.yes&&i.push("-y"),await c.xfs.mktempPromise(async e=>{const{code:t}=await a.execUtils.pipevp("yarn",["init",...i],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await a.scriptUtils.makeScriptEnv({binFolder:e})});return t})}async executeRegular(e){let t=null;if(!this.assumeFreshProject)try{t=await A.I.find(e,this.context.cwd)}catch(e){t=null}c.xfs.existsSync(this.context.cwd)||await c.xfs.mkdirpPromise(this.context.cwd);const r=new s.G,n=Object.fromEntries(e.get("initFields").entries());r.load(n),r.name=a.structUtils.makeIdent(e.get("initScope"),u.y1.basename(this.context.cwd)),r.version=e.get("initVersion"),r.private=this.private||this.workspace,r.license=e.get("initLicense"),this.workspace&&(await c.xfs.mkdirpPromise(u.y1.join(this.context.cwd,"packages")),r.workspaceDefinitions=[{pattern:"packages/*"}]);const i={};r.exportTo(i),g.inspect.styles.name="cyan",this.context.stdout.write((0,g.inspect)(i,{depth:1/0,colors:!0,compact:!1})+"\n");const o=u.y1.join(this.context.cwd,s.G.fileName);await c.xfs.changeFilePromise(o,JSON.stringify(i,null,2)+"\n");const l=u.y1.join(this.context.cwd,"README.md");if(c.xfs.existsSync(l)||await c.xfs.writeFilePromise(l,`# ${a.structUtils.stringifyIdent(r.name)}\n`),!t){const t=u.y1.join(this.context.cwd,u.QS.lockfile);await c.xfs.writeFilePromise(t,"");const r=["/.yarn/** linguist-vendored"].map(e=>e+"\n").join(""),n=u.y1.join(this.context.cwd,".gitattributes");c.xfs.existsSync(n)||await c.xfs.writeFilePromise(n,r);const i=["/.yarn/*","!/.yarn/releases","!/.yarn/plugins","!/.yarn/sdks","","# Swap the comments on the following lines if you don't wish to use zero-installs","# Documentation here: https://yarnpkg.com/features/zero-installs","!/.yarn/cache","#/.pnp.*"].map(e=>e+"\n").join(""),o=u.y1.join(this.context.cwd,".gitignore");c.xfs.existsSync(o)||await c.xfs.writeFilePromise(o,i);const s={"*":{endOfLine:"lf",insertFinalNewline:!0},"*.{js,json,.yml}":{charset:"utf-8",indentStyle:"space",indentSize:2}};(0,h.merge)(s,e.get("initEditorConfig"));let A="root = true\n";for(const[e,t]of Object.entries(s)){A+=`\n[${e}]\n`;for(const[e,r]of Object.entries(t)){A+=`${e.replace(/[A-Z]/g,e=>"_"+e.toLowerCase())} = ${r}\n`}}const l=u.y1.join(this.context.cwd,".editorconfig");c.xfs.existsSync(l)||await c.xfs.writeFilePromise(l,A),await a.execUtils.execvp("git",["init"],{cwd:this.context.cwd})}}}f.usage=l.Command.Usage({description:"create a new package",details:"\n This command will setup a new package in your local directory.\n\n If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\n\n If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\n\n If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\n\n The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\n ",examples:[["Create a new package in the local directory","yarn init"],["Create a new private package in the local directory","yarn init -p"],["Create a new package and store the Yarn release inside","yarn init -i latest"],["Create a new private package and defines it as a workspace root","yarn init -w"]]}),(0,i.gn)([l.Command.Boolean("-2",{hidden:!0})],f.prototype,"usev2",void 0),(0,i.gn)([l.Command.Boolean("--assume-fresh-project",{hidden:!0})],f.prototype,"assumeFreshProject",void 0),(0,i.gn)([l.Command.Boolean("-y,--yes",{hidden:!0})],f.prototype,"yes",void 0),(0,i.gn)([l.Command.Boolean("-p,--private")],f.prototype,"private",void 0),(0,i.gn)([l.Command.Boolean("-w,--workspace")],f.prototype,"workspace",void 0),(0,i.gn)([l.Command.String("-i,--install",{tolerateBoolean:!0})],f.prototype,"install",void 0),(0,i.gn)([l.Command.Path("init")],f.prototype,"execute",null);const p={configuration:{initLicense:{description:"License used when creating packages via the init command",type:n.a2.STRING,default:null},initScope:{description:"Scope used when creating packages via the init command",type:n.a2.STRING,default:null},initVersion:{description:"Version used when creating packages via the init command",type:n.a2.STRING,default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:n.a2.MAP,valueDefinition:{description:"",type:n.a2.ANY}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:n.a2.MAP,valueDefinition:{description:"",type:n.a2.ANY}}},commands:[f]}},86161:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>c});var n=r(84132),i=r(46009),o=r(75448),s=r(10489);var A=r(46611),a=r(32485);const c={fetchers:[class{supports(e,t){return!!e.reference.startsWith("link:")}getLocalPath(e,t){const{parentLocator:r,path:o}=n.structUtils.parseFileStyleRange(e.reference,{protocol:"link:"});if(i.y1.isAbsolute(o))return o;const s=t.fetcher.getLocalPath(r,t);return null===s?null:i.y1.resolve(s,o)}async fetch(e,t){const{parentLocator:r,path:A}=n.structUtils.parseFileStyleRange(e.reference,{protocol:"link:"}),a=i.y1.isAbsolute(A)?{packageFs:new o.M(i.LZ.root),prefixPath:i.LZ.dot,localPath:i.LZ.root}:await t.fetcher.fetch(r,t),c=a.localPath?{packageFs:new o.M(i.LZ.root),prefixPath:i.y1.relative(i.LZ.root,a.localPath)}:a;a!==c&&a.releaseFs&&a.releaseFs();const u=c.packageFs,l=i.y1.join(c.prefixPath,A);return a.localPath?{packageFs:new o.M(l,{baseFs:u}),releaseFs:c.releaseFs,prefixPath:i.LZ.dot,discardFromLookup:!0,localPath:l}:{packageFs:new s.n(l,{baseFs:u}),releaseFs:c.releaseFs,prefixPath:i.LZ.dot,discardFromLookup:!0}}},class{supports(e,t){return!!e.reference.startsWith("portal:")}getLocalPath(e,t){const{parentLocator:r,path:o}=n.structUtils.parseFileStyleRange(e.reference,{protocol:"portal:"});if(i.y1.isAbsolute(o))return o;const s=t.fetcher.getLocalPath(r,t);return null===s?null:i.y1.resolve(s,o)}async fetch(e,t){const{parentLocator:r,path:A}=n.structUtils.parseFileStyleRange(e.reference,{protocol:"portal:"}),a=i.y1.isAbsolute(A)?{packageFs:new o.M(i.LZ.root),prefixPath:i.LZ.dot,localPath:i.LZ.root}:await t.fetcher.fetch(r,t),c=a.localPath?{packageFs:new o.M(i.LZ.root),prefixPath:i.y1.relative(i.LZ.root,a.localPath)}:a;a!==c&&a.releaseFs&&a.releaseFs();const u=c.packageFs,l=i.y1.join(c.prefixPath,A);return a.localPath?{packageFs:new o.M(l,{baseFs:u}),releaseFs:c.releaseFs,prefixPath:i.LZ.dot,localPath:l}:{packageFs:new s.n(l,{baseFs:u}),releaseFs:c.releaseFs,prefixPath:i.LZ.dot}}}],resolvers:[class{supportsDescriptor(e,t){return!!e.range.startsWith("link:")}supportsLocator(e,t){return!!e.reference.startsWith("link:")}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,r){return n.structUtils.bindDescriptor(e,{locator:n.structUtils.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){const o=e.range.slice("link:".length);return[n.structUtils.makeLocator(e,"link:"+i.cS.toPortablePath(o))]}async resolve(e,t){return{...e,version:"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:a.U.SOFT,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map}}},class{supportsDescriptor(e,t){return!!e.range.startsWith("portal:")}supportsLocator(e,t){return!!e.reference.startsWith("portal:")}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,r){return n.structUtils.bindDescriptor(e,{locator:n.structUtils.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){const o=e.range.slice("portal:".length);return[n.structUtils.makeLocator(e,"portal:"+i.cS.toPortablePath(o))]}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");const r=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),i=await n.miscUtils.releaseAfterUseAsync(async()=>await A.G.find(r.prefixPath,{baseFs:r.packageFs}),r.releaseFs);return{...e,version:i.version||"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:a.U.SOFT,dependencies:new Map([...i.dependencies,...i.devDependencies]),peerDependencies:i.peerDependencies,dependenciesMeta:i.dependenciesMeta,peerDependenciesMeta:i.peerDependenciesMeta,bin:i.bin}}}]}},8149:(e,t,r)=>{"use strict";r.r(t),r.d(t,{getPnpPath:()=>ee,default:()=>te});var n=r(46009),i=r(92659),o=r(32485),s=r(92409),A=r(84132),a=r(46611),c=r(35691),u=r(17674),l=r(53660),h=r(56537),g=r(29486),f=r(55125),p=r(5780);const d=(e,t)=>`${e}@${t}`,C=(e,t)=>{const r=t.indexOf("#"),n=r>=0?t.substring(r+1):t;return d(e,n)},E=(e,t={})=>{const r=t.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),n={check:t.check||r>=9,debugLevel:r};n.debugLevel>=0&&console.time("hoist");const i=Q(e);if(m(i,i,new Set([i.locator]),n),n.debugLevel>=0&&console.timeEnd("hoist"),n.debugLevel>=1){const e=B(i);if(e)throw new Error(`${e}, after hoisting finished:\n${k(i)}`)}return n.debugLevel>=2&&console.log(k(i)),D(i)},I=(e,t)=>{if(t.decoupled)return t;const{name:r,references:n,ident:i,locator:o,dependencies:s,originalDependencies:A,hoistedDependencies:a,peerNames:c,reasons:u}=t,l={name:r,references:new Set(n),ident:i,locator:o,dependencies:new Map(s),originalDependencies:new Map(A),hoistedDependencies:new Map(a),peerNames:new Set(c),reasons:new Map(u),decoupled:!0},h=l.dependencies.get(r);return h&&h.ident==l.ident&&l.dependencies.set(r,l),e.dependencies.set(l.name,l),l},m=(e,t,r,n,i=new Set)=>{if(i.has(t))return;i.add(t);const o=((e,t)=>{const r=new Map([[e.name,[e.ident]]]);for(const t of e.dependencies.values())e.peerNames.has(t.name)||r.set(t.name,[t.ident]);const n=Array.from(t.keys());n.sort((e,r)=>t.get(r).size-t.get(e).size);for(const t of n){const n=t.substring(0,t.indexOf("@",1)),i=t.substring(n.length+1);if(!e.peerNames.has(n)){let e=r.get(n);e||(e=[],r.set(n,e)),e.indexOf(i)<0&&e.push(i)}}return r})(t,b(t)),s=new Set(Array.from(o.values()).map(e=>e[0])),A=t===e?new Map:(e=>{const t=new Map,r=new Set,n=i=>{if(!r.has(i)){r.add(i);for(const r of i.hoistedDependencies.values())e.dependencies.has(r.name)||t.set(r.name,r);for(const e of i.dependencies.values())i.peerNames.has(e.name)||n(e)}};return n(e),t})(t);let a;do{w(e,t,r,A,s,o,n),a=!1;for(const[e,r]of o)r.length>1&&!t.dependencies.has(e)&&(s.delete(r[0]),r.shift(),s.add(r[0]),a=!0)}while(a);for(const i of t.dependencies.values())t.peerNames.has(i.name)||r.has(i.locator)||(r.add(i.locator),m(e,i,r,n),r.delete(i.locator))},y=e=>{const t=new Set,r=(n,i=new Set)=>{if(!i.has(n)){i.add(n);for(const o of n.peerNames)if(!e.peerNames.has(o)){const n=e.dependencies.get(o);n&&!t.has(n)&&r(n,i)}t.add(n)}};for(const t of e.dependencies.values())e.peerNames.has(t.name)||r(t);return t},w=(e,t,r,n,i,o,s)=>{const A=new Set,a=(c,u,l,h)=>{if(A.has(l))return;let g,f;s.debugLevel>=2&&(g=""+Array.from(r).map(e=>S(e)).join("→"));let p=i.has(l.ident);if(s.debugLevel>=2&&!p&&(f=`- filled by: ${S(o.get(l.name)[0])} at ${g}`),p){let e=!0;const t=new Set(l.peerNames);for(let r=c.length-1;r>=1;r--){const n=c[r];for(const r of t){if(n.peerNames.has(r)&&n.originalDependencies.has(r))continue;const i=n.dependencies.get(r);if(i){s.debugLevel>=2&&(f=`- peer dependency ${S(i.locator)} from parent ${S(n.locator)} was not hoisted to ${g}`),e=!1;break}t.delete(r)}if(!e)break}p=e}if(p){let e=!1;const t=n.get(l.name);if(e=!t||t.ident===l.ident,s.debugLevel>=2&&!e&&(f=`- filled by: ${S(t.locator)} at ${g}`),e)for(let t=1;t=2&&(f=`- filled by: ${S(n.locator)} at ${S(r.locator)}`);break}}p=e}if(p){const r=c[c.length-1];r.dependencies.delete(l.name),r.hoistedDependencies.set(l.name,l),r.reasons.delete(l.name);const n=t.dependencies.get(l.name);if(n)for(const e of l.references)n.references.add(e);else t.ident!==l.ident&&(t.dependencies.set(l.name,l),h.add(l));if(s.check){const r=B(e);if(r)throw new Error(`${r}, after hoisting ${[t,...c,l].map(e=>S(e.locator)).join("→")}:\n${k(e)}`)}}else if(s.debugLevel>=2){c[c.length-1].reasons.set(l.name,f)}if(!p&&u.indexOf(l.locator)<0){const e=I(c[c.length-1],l);A.add(e);for(const t of y(l))a([...c,e],[...u,l.locator],t,h);A.delete(e)}};let c,u=new Set(t.dependencies.values());do{c=u,u=new Set;for(const e of c){if(t.peerNames.has(e.name)||e.locator===t.locator)continue;const r=I(t,e);A.add(r);for(const n of y(e))n.locator!==e.locator&&a([t,r],[t.locator,e.locator],n,u);A.delete(r)}}while(u.size>0)},B=e=>{const t=[],r=new Set,n=new Set,i=(e,o)=>{if(r.has(e))return;if(r.add(e),n.has(e))return;const s=new Map(o);for(const t of e.dependencies.values())e.peerNames.has(t.name)||s.set(t.name,t);for(const r of e.originalDependencies.values()){const i=s.get(r.name),A=()=>""+Array.from(n).concat([e]).map(e=>S(e.locator)).join("→");if(e.peerNames.has(r.name)){const e=o.get(r.name);e!==i&&t.push(`${A()} - broken peer promise: expected ${i.locator} but found ${e?e.locator:e}`)}else i?i.ident!==r.ident&&t.push(`${A()} - broken require promise for ${r.name}: expected ${r.ident}, but found: ${i.ident}`):t.push(`${A()} - broken require promise: no required dependency ${r.locator} found`)}n.add(e);for(const t of e.dependencies.values())e.peerNames.has(t.name)||i(t,s);n.delete(e)};return i(e,e.dependencies),t.join("\n")},Q=e=>{const{identName:t,name:r,reference:n,peerNames:i}=e,o={name:r,references:new Set([n]),locator:d(t,n),ident:C(t,n),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(i),reasons:new Map,decoupled:!0},s=new Map([[e,o]]),A=(e,t)=>{let r=s.get(e);const n=!!r;if(!r){const{name:t,identName:n,reference:i,peerNames:o}=e;r={name:t,references:new Set([i]),locator:d(n,i),ident:C(n,i),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(o),reasons:new Map,decoupled:!0},s.set(e,r)}if(t.dependencies.set(e.name,r),t.originalDependencies.set(e.name,r),n){const e=new Set,t=r=>{if(!e.has(r)){e.add(r),r.decoupled=!1;for(const e of r.dependencies.values())r.peerNames.has(e.name)||t(e)}};t(r)}else for(const t of e.dependencies)A(t,r)};for(const t of e.dependencies)A(t,o);return o},v=e=>e.substring(0,e.indexOf("@",1)),D=e=>{const t={name:e.name,identName:v(e.locator),references:new Set(e.references),dependencies:new Set},r=new Set([e]),n=(e,t,i)=>{const o=r.has(e);let s;if(t===e)s=i;else{const{name:t,references:r,locator:n}=e;s={name:t,identName:v(n),references:r,dependencies:new Set}}if(i.dependencies.add(s),!o){r.add(e);for(const t of e.dependencies.values())e.peerNames.has(t.name)||n(t,e,s);r.delete(e)}};for(const r of e.dependencies.values())n(r,e,t);return t},b=e=>{const t=new Map,r=new Set([e]),n=(e,i)=>{const o=!!r.has(i),s=(e=>`${e.name}@${e.ident}`)(i);let A=t.get(s);if(A||(A=new Set,t.set(s,A)),A.add(e.ident),!o){r.add(i);for(const e of i.dependencies.values())i.peerNames.has(e.name)||n(i,e)}};for(const t of e.dependencies.values())e.peerNames.has(t.name)||n(e,t);return t},S=e=>{const t=e.indexOf("@",1),r=e.substring(0,t),n=e.substring(t+1);if("workspace:."===n)return".";if(n){const e=(n.indexOf("#")>0?n.split("#")[1]:n).replace("npm:","");return n.startsWith("virtual")?`v:${r}@${e}`:`${r}@${e}`}return""+r},k=e=>{let t=0;const r=(e,n,i="")=>{if(t>5e4||n.has(e))return"";t++;const o=Array.from(e.dependencies.values());let s="";n.add(e);for(let t=0;t":"")+(c!==A.name?`a:${A.name}:`:"")+S(A.locator)+(a?" "+a:"")}\n`,s+=r(A,n,`${i}${t5e4?"\nTree is too large, part of the tree has been dunped\n":"")};var x;!function(e){e.HARD="HARD",e.SOFT="SOFT"}(x||(x={}));const F=(0,n.Zu)("node_modules"),M=(e,t)=>{const r=R(e,t),n=E(r);return K(e,n,t)},N=e=>`${e.name}@${e.reference}`;const R=(e,t)=>{const r=e.getDependencyTreeRoots(),n=e.getPackageInformation(e.topLevel);if(null===n)throw new Error("Assertion failed: Expected the top-level package to have been registered");const i=e.findPackageLocator(n.packageLocation);if(null===i)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");for(const e of r)e.name===i.name&&e.reference===i.reference||n.packageDependencies.set(e.name+"$wsroot$",e.reference);const o={name:i.name,identName:i.name,reference:i.reference,peerNames:n.packagePeers,dependencies:new Set},s=new Map,a=(r,n,c,u,l)=>{const h=((e,t)=>`${N(t)}:${e}`)(r,c);let g=s.get(h);const f=!!g;f||c.name!==i.name||c.reference!==i.reference||(g=o,s.set(h,o)),g||(g={name:r,identName:c.name,reference:c.reference,dependencies:new Set,peerNames:n.packagePeers},s.set(h,g)),u.dependencies.add(g);const p=t.pnpifyFs||!function(e){let t=A.structUtils.parseDescriptor(e);return A.structUtils.isVirtualDescriptor(t)&&(t=A.structUtils.devirtualizeDescriptor(t)),t.range.startsWith("portal:")}(h);if(!f&&p)for(const[t,r]of n.packageDependencies)if(null!==r&&!g.peerNames.has(t)){const i=e.getLocator(t,r),o=e.getLocator(t.replace("$wsroot$",""),r),s=e.getPackageInformation(o);if(null===s)throw new Error("Assertion failed: Expected the package to have been registered");if(i.name===c.name&&i.reference===c.reference)continue;a(t,s,i,g,n)}};return a(i.name,n,i,o,n),o};const K=(e,t,r)=>{const i=new Map,o=(t,i)=>{const{linkType:o,target:s}=function(e,t,r){const i=t.getLocator(e.name.replace("$wsroot$",""),e.reference),o=t.getPackageInformation(i);if(null===o)throw new Error("Assertion failed: Expected the package to be registered");let s,A;if(r.pnpifyFs)A=n.cS.toPortablePath(o.packageLocation),s=x.SOFT;else{const r=t.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?t.resolveVirtual(o.packageLocation):o.packageLocation;A=n.cS.toPortablePath(r||o.packageLocation),s=o.linkType}return{linkType:s,target:A}}(t,e,r);return{locator:N(t),target:s,linkType:o,aliases:i}},s=e=>{const[t,r]=e.split("/");return r?{scope:(0,n.Zu)(t),name:(0,n.Zu)(r)}:{scope:null,name:(0,n.Zu)(t)}},a=new Set,c=(e,t)=>{if(!a.has(e)){a.add(e);for(const r of e.dependencies){if(r===e)continue;const a=Array.from(r.references).sort(),u={name:r.identName,reference:a[0]},{name:l,scope:h}=s(r.name),g=h?[h,l]:[l],f=n.y1.join(t,F),p=n.y1.join(f,...g),d=o(u,a.slice(1));if(!r.name.endsWith("$wsroot$")){const e=i.get(p);if(e){if(e.dirList)throw new Error(`Assertion failed: ${p} cannot merge dir node with leaf node`);{const t=A.structUtils.parseLocator(e.locator),r=A.structUtils.parseLocator(d.locator);if(e.linkType!==d.linkType)throw new Error(`Assertion failed: ${p} cannot merge nodes with different link types`);if(t.identHash!==r.identHash)throw new Error(`Assertion failed: ${p} cannot merge nodes with different idents ${A.structUtils.stringifyLocator(t)} and ${A.structUtils.stringifyLocator(r)}`);d.aliases=[...d.aliases,...e.aliases,A.structUtils.parseLocator(e.locator).reference]}}i.set(p,d);const t=p.split("/"),r=t.indexOf(F);let o=t.length-1;for(;r>=0&&o>r;){const e=n.cS.toPortablePath(t.slice(0,o).join(n.y1.sep)),r=(0,n.Zu)(t[o]),s=i.get(e);if(s){if(s.dirList){if(s.dirList.has(r))break;s.dirList.add(r)}}else i.set(e,{dirList:new Set([r])});o--}}c(r,d.linkType===x.SOFT?d.target:p)}}},u=o({name:t.name,reference:Array.from(t.references)[0]},[]),l=u.target;return i.set(l,u),c(t,l),i};var L=r(88563),T=r(58069),P=r.n(T),U=r(17278),_=r(35747),O=r.n(_);const j="node_modules";class Y extends p.AbstractPnpInstaller{constructor(){super(...arguments),this.manifestCache=new Map}async getBuildScripts(e,t,r){return[]}async transformPackage(e,t,r,n,i){return r.packageFs}async finalizeInstallWithPnp(e){if("node-modules"!==this.opts.project.configuration.get("nodeLinker"))return;const t=new u.p({baseFs:new l.A({libzip:await(0,g.getLibzipPromise)(),maxOpenFiles:80,readOnlyArchives:!0})});let r=await G(this.opts.project);if(null===r){const e=this.opts.project.configuration.get("bstatePath");await h.xfs.existsPromise(e)&&await h.xfs.unlinkPromise(e),r={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map}}const s=(0,L.oC)(e,this.opts.project.cwd,t),a=(e=>{const t=new Map;for(const[r,n]of e.entries())if(!n.dirList){let e=t.get(n.locator);e||(e={target:n.target,linkType:n.linkType,locations:[],aliases:n.aliases},t.set(n.locator,e)),e.locations.push(r)}for(const e of t.values())e.locations=e.locations.sort((e,t)=>{const r=e.split(n.y1.delimiter).length,i=t.split(n.y1.delimiter).length;return r!==i?i-r:t.localeCompare(e)});return t})(M(s,{pnpifyFs:!1}));await async function(e,t,{baseFs:r,project:i,report:s,loadManifest:A}){const a=n.y1.join(i.cwd,j),{locationTree:u,binSymlinks:l}=function(e,t){const r=new Map([...e]),i=new Map([...t]);for(const[t,r]of e){const e=n.y1.join(t,j);if(!h.xfs.existsSync(e)){r.children.delete(j);for(const t of i.keys())null!==n.y1.contains(e,t)&&i.delete(t)}}return{locationTree:r,binSymlinks:i}}(e.locationTree,e.binSymlinks),g=q(t,{skipPrefix:i.cwd}),f=[],p=async({srcDir:e,dstDir:t,linkType:i})=>{const s=(async()=>{try{i===o.U.SOFT?(await h.xfs.mkdirpPromise(n.y1.dirname(t)),await z(n.y1.resolve(e),t)):await W(t,e,{baseFs:r})}catch(r){throw r.message=`While persisting ${e} -> ${t} ${r.message}`,r}finally{m.tick()}})().then(()=>f.splice(f.indexOf(s),1));f.push(s),f.length>4&&await Promise.race(f)},d=async(e,t,r)=>{const i=(async()=>{const i=async(e,t,r)=>{try{r&&r.innerLoop||await h.xfs.mkdirpPromise(t);const o=await h.xfs.readdirPromise(e,{withFileTypes:!0});for(const s of o){if(!(r&&r.innerLoop||".bin"!==s.name))continue;const o=n.y1.join(e,s.name),A=n.y1.join(t,s.name);s.isDirectory()?(s.name!==j||r&&r.innerLoop)&&(await h.xfs.mkdirpPromise(A),await i(o,A,{innerLoop:!0})):await h.xfs.copyFilePromise(o,A,O().constants.COPYFILE_FICLONE)}}catch(n){throw r&&r.innerLoop||(n.message=`While cloning ${e} -> ${t} ${n.message}`),n}finally{r&&r.innerLoop||m.tick()}};await i(e,t,r)})().then(()=>f.splice(f.indexOf(i),1));f.push(i),f.length>4&&await Promise.race(f)},C=async(e,t,r)=>{if(r)for(const[i,o]of t.children){const t=r.children.get(i);await C(n.y1.join(e,i),o,t)}else t.children.has(j)&&await J(n.y1.join(e,j),{contentsOnly:!1}),await J(e,{contentsOnly:e===a})};for(const[e,t]of u){const r=g.get(e);for(const[i,o]of t.children){if("."===i)continue;const t=r?r.children.get(i):r;await C(n.y1.join(e,i),o,t)}}const E=async(e,t,r)=>{if(r){X(t.locator,r.locator)||await J(e,{contentsOnly:t.linkType===o.U.HARD});for(const[i,o]of t.children){const t=r.children.get(i);await E(n.y1.join(e,i),o,t)}}else t.children.has(j)&&await J(n.y1.join(e,j),{contentsOnly:!0}),await J(e,{contentsOnly:t.linkType===o.U.HARD})};for(const[e,t]of g){const r=u.get(e);for(const[i,o]of t.children){if("."===i)continue;const t=r?r.children.get(i):r;await E(n.y1.join(e,i),o,t)}}const I=[];for(const[r,{locations:o}]of e.locatorMap.entries())for(const e of o){const{locationRoot:o,segments:s}=H(e,{skipPrefix:i.cwd});let A=g.get(o),a=o;if(A){for(const e of s)if(a=n.y1.join(a,e),A=A.children.get(e),!A)break;if(A&&!X(A.locator,r)){const e=t.get(A.locator),r=e.target,n=a,i=e.linkType;r!==n&&I.push({srcDir:r,dstDir:n,linkType:i})}}}for(const[e,{locations:r}]of t.entries())for(const o of r){const{locationRoot:r,segments:s}=H(o,{skipPrefix:i.cwd});let A=u.get(r),a=g.get(r),c=r;const l=t.get(e),h=l.target,f=o;if(h===f)continue;const p=l.linkType;for(const e of s)a=a.children.get(e);if(A){for(const e of s)if(c=n.y1.join(c,e),A=A.children.get(e),!A){I.push({srcDir:h,dstDir:f,linkType:p});break}}else I.push({srcDir:h,dstDir:f,linkType:p})}const m=c.yG.progressViaCounter(I.length),y=s.reportProgress(m);try{const e=new Map;for(const t of I)t.linkType!==o.U.SOFT&&e.has(t.srcDir)||(e.set(t.srcDir,t.dstDir),await p({...t}));await Promise.all(f),f.length=0;for(const t of I){const r=e.get(t.srcDir);t.linkType!==o.U.SOFT&&t.dstDir!==r&&await d(r,t.dstDir)}await Promise.all(f),await h.xfs.mkdirpPromise(a);const r=await async function(e,t,r,{loadManifest:i}){const o=new Map;for(const[t,{locations:r}]of e){const e=V(t)?null:await i(r[0]),s=new Map;if(e)for(const[t,i]of e.bin){const e=n.y1.join(r[0],i);""!==i&&h.xfs.existsSync(e)&&s.set(t,i)}o.set(t,s)}const s=new Map,A=(e,t,i)=>{const a=new Map,c=n.y1.contains(r,e);if(i.locator&&null!==c){const t=o.get(i.locator);for(const[r,i]of t){const t=n.y1.join(e,n.cS.toPortablePath(i));a.set((0,n.Zu)(r),t)}for(const[t,r]of i.children){const i=n.y1.join(e,t),o=A(i,i,r);o.size>0&&s.set(e,new Map([...s.get(e)||new Map,...o]))}}else for(const[r,o]of i.children){const i=A(n.y1.join(e,r),t,o);for(const[e,t]of i)a.set(e,t)}return a};for(const[e,r]of t){const t=A(e,e,r);t.size>0&&s.set(e,new Map([...s.get(e)||new Map,...t]))}return s}(t,g,i.cwd,{loadManifest:A});await async function(e,t){for(const r of e.keys())if(!t.has(r)){const e=n.y1.join(r,j,".bin");await h.xfs.removePromise(e)}for(const[r,i]of t){const t=n.y1.join(r,j,".bin"),o=e.get(r)||new Map;await h.xfs.mkdirpPromise(t);for(const e of o.keys())i.has(e)||(await h.xfs.removePromise(n.y1.join(t,e)),"win32"===process.platform&&await h.xfs.removePromise(n.y1.join(t,(0,n.Zu)(e+".cmd"))));for(const[e,r]of i){const i=o.get(e),s=n.y1.join(t,e);i!==r&&("win32"===process.platform?await P()(n.cS.fromPortablePath(r),n.cS.fromPortablePath(s),{createPwshFile:!1}):(await h.xfs.removePromise(s),await z(r,s),await h.xfs.chmodPromise(r,493)))}}}(l,r),await async function(e,t,r){let i="";i+="# Warning: This file is automatically generated. Removing it is fine, but will\n",i+="# cause your node_modules installation to become invalidated.\n",i+="\n",i+="__metadata:\n",i+=" version: 1\n";const o=Array.from(t.keys()).sort();for(const s of o){const o=t.get(s);i+="\n",i+=JSON.stringify(s)+":\n",i+=" locations:\n";let A=!1;for(const t of o.locations){const r=n.y1.contains(e.cwd,t);if(null===r)throw new Error(`Assertion failed: Expected the path to be within the project (${t})`);i+=` - ${JSON.stringify(r)}\n`,t===e.cwd&&(A=!0)}if(o.aliases.length>0){i+=" aliases:\n";for(const e of o.aliases)i+=` - ${JSON.stringify(e)}\n`}if(A&&r.size>0){i+=" bin:\n";for(const[t,o]of r){const r=n.y1.contains(e.cwd,t);if(null===r)throw new Error(`Assertion failed: Expected the path to be within the project (${t})`);i+=` ${JSON.stringify(r)}:\n`;for(const[e,r]of o){const o=n.y1.relative(n.y1.join(t,j),r);i+=` ${JSON.stringify(e)}: ${JSON.stringify(o)}\n`}}}}const s=e.cwd,A=n.y1.join(s,j,".yarn-state.yml");await h.xfs.changeFilePromise(A,i,{automaticNewlines:!0})}(i,t,r)}finally{y.stop()}}(r,a,{baseFs:t,project:this.opts.project,report:this.opts.report,loadManifest:this.cachedManifestLoad.bind(this)});const f=[];for(const[e,t]of a.entries()){if(V(e))continue;const r=A.structUtils.parseLocator(e),a={name:A.structUtils.stringifyIdent(r),reference:r.reference};if(null===s.getPackageInformation(a))throw new Error(`Assertion failed: Expected the package to be registered (${A.structUtils.prettyLocator(this.opts.project.configuration,r)})`);const c=n.cS.toPortablePath(t.locations[0]),u=await this.cachedManifestLoad(c),l=await this.getSourceBuildScripts(c,u);l.length>0&&!this.opts.project.configuration.get("enableScripts")&&(this.opts.report.reportWarningOnce(i.b.DISABLED_BUILD_SCRIPTS,A.structUtils.prettyLocator(this.opts.project.configuration,r)+" lists build scripts, but all build scripts have been disabled."),l.length=0),l.length>0&&t.linkType!==o.U.HARD&&!this.opts.project.tryWorkspaceByLocator(r)&&(this.opts.report.reportWarningOnce(i.b.SOFT_LINK_BUILD,A.structUtils.prettyLocator(this.opts.project.configuration,r)+" lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored."),l.length=0);const h=this.opts.project.getDependencyMeta(r,u.version);l.length>0&&h&&!1===h.built&&(this.opts.report.reportInfoOnce(i.b.BUILD_DISABLED,A.structUtils.prettyLocator(this.opts.project.configuration,r)+" lists build scripts, but its build has been explicitly disabled through configuration."),l.length=0),l.length>0&&f.push({buildLocations:t.locations,locatorHash:r.locatorHash,buildDirective:l})}return f}async cachedManifestLoad(e){let t=this.manifestCache.get(e);if(t)return t;try{t=await a.G.find(e)}catch(t){throw t.message=`While loading ${e}: ${t.message}`,t}return this.manifestCache.set(e,t),t}async getSourceBuildScripts(e,t){const r=[],{scripts:i}=t;for(const e of["preinstall","install","postinstall"])i.has(e)&&r.push([s.k.SCRIPT,e]);const o=n.y1.resolve(e,(0,n.Zu)("binding.gyp"));return!i.has("install")&&h.xfs.existsSync(o)&&r.push([s.k.SHELLCODE,"node-gyp rebuild"]),r}}async function G(e,{unrollAliases:t=!1}={}){const r=e.cwd,i=n.y1.join(r,j,".yarn-state.yml");if(!h.xfs.existsSync(i))return null;const s=(0,f.parseSyml)(await h.xfs.readFilePromise(i,"utf8"));if(s.__metadata.version>1)return null;const a=new Map,c=new Map;delete s.__metadata;for(const[e,i]of Object.entries(s)){const s=i.locations.map(e=>n.y1.join(r,e)),u=i.bin;if(u)for(const[e,t]of Object.entries(u)){const i=n.y1.join(r,n.cS.toPortablePath(e)),o=A.miscUtils.getMapWithDefault(c,i);for(const[e,r]of Object.entries(t))o.set((0,n.Zu)(e),n.cS.toPortablePath([i,j,r].join(n.y1.delimiter)))}if(a.set(e,{target:n.LZ.dot,linkType:o.U.HARD,locations:s,aliases:i.aliases||[]}),t&&i.aliases)for(const t of i.aliases){const{scope:r,name:i}=A.structUtils.parseLocator(e),c=A.structUtils.makeLocator(A.structUtils.makeIdent(r,i),t),u=A.structUtils.stringifyLocator(c);a.set(u,{target:n.LZ.dot,linkType:o.U.HARD,locations:s,aliases:[]})}}return{locatorMap:a,binSymlinks:c,locationTree:q(a,{skipPrefix:e.cwd})}}const J=async(e,t)=>{if(e.split(n.y1.sep).indexOf(j)<0)throw new Error("Assertion failed: trying to remove dir that doesn't contain node_modules: "+e);try{if(!t.innerLoop){if((await h.xfs.lstatPromise(e)).isSymbolicLink())return void await h.xfs.unlinkPromise(e)}const r=await h.xfs.readdirPromise(e,{withFileTypes:!0});for(const i of r){const r=n.y1.join(e,(0,n.Zu)(i.name));i.isDirectory()?(i.name!==j||t&&t.innerLoop)&&await J(r,{innerLoop:!0,contentsOnly:!1}):await h.xfs.unlinkPromise(r)}t.contentsOnly||await h.xfs.rmdirPromise(e)}catch(e){if("ENOENT"!==e.code&&"ENOTEMPTY"!==e.code)throw e}},H=(e,{skipPrefix:t})=>{const r=n.y1.contains(t,e);if(null===r)throw new Error(`Assertion failed: Cannot process a path that isn't part of the requested prefix (${e} isn't within ${t})`);const i=r.split(n.y1.sep),o=i.indexOf(j),s=i.slice(0,o).join(n.y1.sep);return{locationRoot:n.y1.join(t,s),segments:i.slice(o)}},q=(e,{skipPrefix:t})=>{const r=new Map;if(null===e)return r;const i=()=>({children:new Map,linkType:o.U.HARD});for(const[s,a]of e.entries()){if(a.linkType===o.U.SOFT){if(null!==n.y1.contains(t,a.target)){const e=A.miscUtils.getFactoryWithDefault(r,a.target,i);e.locator=s,e.linkType=a.linkType}}for(const e of a.locations){const{locationRoot:n,segments:o}=H(e,{skipPrefix:t});let c=A.miscUtils.getFactoryWithDefault(r,n,i);for(let e=0;eh.xfs.symlinkPromise("win32"!==process.platform?n.y1.relative(n.y1.dirname(t),e):e,t,"win32"===process.platform?"junction":void 0),W=async(e,t,{baseFs:r,innerLoop:i})=>{await h.xfs.mkdirpPromise(e);const o=await r.readdirPromise(t,{withFileTypes:!0}),s=async(e,t,i)=>{if(i.isFile()){const n=await r.lstatPromise(t);await r.copyFilePromise(t,e);const i=511&n.mode;420!==i&&await h.xfs.chmodPromise(e,i)}else{if(!i.isSymbolicLink())throw new Error(`Unsupported file type (file: ${t}, mode: 0o${await h.xfs.statSync(t).mode.toString(8).padStart(6,"0")})`);{const i=await r.readlinkPromise(t);await z(n.y1.resolve(t,i),e)}}};for(const A of o){const o=n.y1.join(t,(0,n.Zu)(A.name)),a=n.y1.join(e,(0,n.Zu)(A.name));A.isDirectory()?(A.name!==j||i)&&await W(a,o,{baseFs:r,innerLoop:!0}):await s(a,o,A)}};function V(e){let t=A.structUtils.parseDescriptor(e);return A.structUtils.isVirtualDescriptor(t)&&(t=A.structUtils.devirtualizeDescriptor(t)),t.range.startsWith("link:")}const X=(e,t)=>{if(!e||!t)return e===t;let r=A.structUtils.parseLocator(e);A.structUtils.isVirtualLocator(r)&&(r=A.structUtils.devirtualizeLocator(r));let n=A.structUtils.parseLocator(t);return A.structUtils.isVirtualLocator(n)&&(n=A.structUtils.devirtualizeLocator(n)),A.structUtils.areLocatorsEqual(r,n)};class Z extends p.PnpLinker{constructor(){super(...arguments),this.mode="loose"}makeInstaller(e){return new $(e)}}class $ extends p.PnpInstaller{constructor(){super(...arguments),this.mode="loose"}async finalizeInstallWithPnp(e){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;const t=new u.p({baseFs:new l.A({libzip:await(0,g.getLibzipPromise)(),maxOpenFiles:80,readOnlyArchives:!0})}),r=(0,L.oC)(e,this.opts.project.cwd,t),i=M(r,{pnpifyFs:!1}),o=new Map;e.fallbackPool=o;const s=(e,t)=>{const r=A.structUtils.parseLocator(t.locator),n=A.structUtils.stringifyIdent(r);n===e?o.set(e,r.reference):o.set(e,[n,r.reference])},a=n.y1.join(this.opts.project.cwd,n.QS.nodeModules),c=i.get(a);if(void 0===c)throw new Error("Assertion failed: Expected a root junction point");if("target"in c)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(const e of c.dirList){const t=n.y1.join(a,e),r=i.get(t);if(void 0===r)throw new Error("Assertion failed: Expected the child to have been registered");if("target"in r)s(e,r);else for(const o of r.dirList){const r=n.y1.join(t,o),A=i.get(r);if(void 0===A)throw new Error("Assertion failed: Expected the subchild to have been registered");if(!("target"in A))throw new Error("Assertion failed: Expected the leaf junction to be a package");s(`${e}/${o}`,A)}}return super.finalizeInstallWithPnp(e)}}const ee=e=>n.y1.join(e.cwd,".pnp.js"),te={linkers:[class{supportsPackage(e,t){return"node-modules"===t.project.configuration.get("nodeLinker")}async findPackageLocation(e,t){const r=t.project.tryWorkspaceByLocator(e);if(r)return r.cwd;const n=await G(t.project,{unrollAliases:!0});if(null===n)throw new U.UsageError("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");const i=n.locatorMap.get(A.structUtils.stringifyLocator(e));if(!i)throw new U.UsageError(`Couldn't find ${A.structUtils.prettyLocator(t.project.configuration,e)} in the currently installed node_modules map - running an install might help`);return i.locations[0]}async findPackageLocator(e,t){const r=await G(t.project,{unrollAliases:!0});if(null===r)return null;const{locationRoot:i,segments:o}=H(n.y1.resolve(e),{skipPrefix:t.project.cwd});let s=r.locationTree.get(i);if(!s)return null;let a=s.locator;for(const e of o){if(s=s.children.get(e),!s)break;a=s.locator||a}return A.structUtils.parseLocator(a)}makeInstaller(e){return new Y({...e,skipIncompatiblePackageLinking:!0})}},Z]}},94573:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>F});var n=r(27122),i=r(36370),o=r(95397),s=r(40376),A=r(84132),a=r(35691),c=r(15815),u=r(92659),l=r(86717),h=r(17278),g=r(85622),f=r.n(g),p=r(53887),d=r.n(p),C=r(31669);class E extends o.BaseCommand{constructor(){super(...arguments),this.json=!1}async execute(){const e=await n.VK.find(this.context.cwd,this.context.plugins),{project:t}=await s.I.find(e,this.context.cwd),r=void 0!==this.fields?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,i=[];let o=!1;const g=await c.P.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async n=>{for(const s of this.packages){let c;if("."===s){const e=t.topLevelWorkspace;if(!e.manifest.name)throw new h.UsageError("Missing 'name' field in "+f().join(e.cwd,"package.json"));c=A.structUtils.makeDescriptor(e.manifest.name,"unknown")}else c=A.structUtils.parseDescriptor(s);const g=l.npmHttpUtils.getIdentUrl(c);let p;try{p=I(await l.npmHttpUtils.get(g,{configuration:e,ident:c,json:!0}))}catch(e){throw"HTTPError"!==e.name?e:404===e.response.statusCode?new a.lk(u.b.EXCEPTION,"Package not found"):new a.lk(u.b.EXCEPTION,e.toString())}const C=Object.keys(p.versions).sort(d().compareLoose);let E=p["dist-tags"].latest||C[C.length-1];if(d().validRange(c.range)){const t=d().maxSatisfying(C,c.range);null!==t?E=t:(n.reportWarning(u.b.UNNAMED,`Unmet range ${A.structUtils.prettyRange(e,c.range)}; falling back to the latest version`),o=!0)}else"unknown"!==c.range&&(n.reportWarning(u.b.UNNAMED,`Invalid range ${A.structUtils.prettyRange(e,c.range)}; falling back to the latest version`),o=!0);const m=p.versions[E],y={...p,...m,version:E,versions:C};let w;if(null!==r){w={};for(const t of r){const r=y[t];void 0!==r?w[t]=r:(n.reportWarning(u.b.EXCEPTION,`The '${t}' field doesn't exist inside ${A.structUtils.prettyIdent(e,c)}'s informations`),o=!0)}}else this.json||(delete y.dist,delete y.readme,delete y.users),w=y;n.reportJson(w),this.json||i.push(w)}});C.inspect.styles.name="cyan";for(const e of i)(e!==i[0]||o)&&this.context.stdout.write("\n"),this.context.stdout.write((0,C.inspect)(e,{depth:1/0,colors:!0,compact:!1})+"\n");return g.exitCode()}}function I(e){if(Array.isArray(e)){const t=[];for(let r of e)r=I(r),r&&t.push(r);return t}if("object"==typeof e&&null!==e){const t={};for(const r of Object.keys(e)){if(r.startsWith("_"))continue;const n=I(e[r]);n&&(t[r]=n)}return t}return e||null}E.usage=h.Command.Usage({description:"show information about a package",details:"\n This command will fetch information about a package from the npm registry, and prints it in a tree format.\n\n The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\n\n Append `@` to the package argument to provide information specific to the latest version that satisfies the range. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\n\n If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package informations.\n\n By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\n\n If the `--json` flag is set the output will follow a JSON-stream output also known as NDJSON (https://github.com/ndjson/ndjson-spec).\n ",examples:[["Show all available information about react (except the `dist`, `readme`, and `users` fields)","yarn npm info react"],["Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)","yarn npm info react --json"],["Show all available information about react 16.12.0","yarn npm info react@16.12.0"],["Show the description of react","yarn npm info react --fields description"],["Show all available versions of react","yarn npm info react --fields versions"],["Show the readme of react","yarn npm info react --fields readme"],["Show a few fields of react","yarn npm info react --fields homepage,repository"]]}),(0,i.gn)([h.Command.Rest()],E.prototype,"packages",void 0),(0,i.gn)([h.Command.String("-f,--fields")],E.prototype,"fields",void 0),(0,i.gn)([h.Command.Boolean("--json")],E.prototype,"json",void 0),(0,i.gn)([h.Command.Path("npm","info")],E.prototype,"execute",null);var m=r(9494),y=r.n(m);class w extends o.BaseCommand{constructor(){super(...arguments),this.publish=!1}async execute(){const e=await n.VK.find(this.context.cwd,this.context.plugins),t=y().createPromptModule({input:this.context.stdin,output:this.context.stdout}),r=await B({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await c.P.start({configuration:e,stdout:this.context.stdout},async i=>{const o=await async function(e,{registry:t,report:r}){if(process.env.TEST_ENV)return{name:process.env.TEST_NPM_USER||"",password:process.env.TEST_NPM_PASSWORD||""};r.reportInfo(u.b.UNNAMED,"Logging in to "+t);let n=!1;t.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(r.reportInfo(u.b.UNNAMED,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0);r.reportSeparator();const{username:i,password:o}=await e([{type:"input",name:"username",message:"Username:",validate:e=>Q(e,"Username")},{type:"password",name:"password",message:n?"Token:":"Password:",validate:e=>Q(e,"Password")}]);return r.reportSeparator(),{name:i,password:o}}(t,{registry:r,report:i}),s="/-/user/org.couchdb.user:"+encodeURIComponent(o.name),A=await l.npmHttpUtils.put(s,o,{attemptedAs:o.name,configuration:e,registry:r,json:!0,authType:l.npmHttpUtils.AuthType.NO_AUTH});return await async function(e,t,{configuration:r}){return await n.VK.updateHomeConfiguration({npmRegistries:(r={})=>({...r,[e]:{...r[e],npmAuthToken:t}})})}(r,A.token,{configuration:e}),i.reportInfo(u.b.UNNAMED,"Successfully logged in")})).exitCode()}}async function B({scope:e,publish:t,configuration:r,cwd:n}){return e&&t?l.npmConfigUtils.getScopeRegistry(e,{configuration:r,type:l.npmConfigUtils.RegistryType.PUBLISH_REGISTRY}):e?l.npmConfigUtils.getScopeRegistry(e,{configuration:r}):t?l.npmConfigUtils.getPublishRegistry((await(0,o.openWorkspace)(r,n)).manifest,{configuration:r}):l.npmConfigUtils.getDefaultRegistry({configuration:r})}function Q(e,t){return e.length>0||t+" is required"}w.usage=h.Command.Usage({category:"Npm-related commands",description:"store new login info to access the npm registry",details:"\n This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\n\n Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n ",examples:[["Login to the default registry","yarn npm login"],["Login to the registry linked to the @my-scope registry","yarn npm login --scope my-scope"],["Login to the publish registry for the current package","yarn npm login --publish"]]}),(0,i.gn)([h.Command.String("-s,--scope")],w.prototype,"scope",void 0),(0,i.gn)([h.Command.Boolean("--publish")],w.prototype,"publish",void 0),(0,i.gn)([h.Command.Path("npm","login")],w.prototype,"execute",null);class v extends o.BaseCommand{constructor(){super(...arguments),this.publish=!1,this.all=!1}async execute(){const e=await n.VK.find(this.context.cwd,this.context.plugins),t=this.all?null:await B({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await c.P.start({configuration:e,stdout:this.context.stdout},async e=>(await async function(e){return await n.VK.updateHomeConfiguration({npmRegistries:(t={})=>null===e?void 0:{...t,[e]:void 0}})}(t),e.reportInfo(u.b.UNNAMED,"Successfully logged out of "+(null===t?"all registries":t))))).exitCode()}}v.usage=h.Command.Usage({category:"Npm-related commands",description:"logout of the npm registry",details:"\n This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\n\n Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n\n Adding the `-A,--all` flag will cause the deletion to be done against all registries.\n ",examples:[["Logout of the default registry","yarn npm logout"],["Logout of the registry linked to the @my-scope registry","yarn npm logout --scope my-scope"],["Logout of the publish registry for the current package","yarn npm logout --publish"],["Logout of the publish registry for the current package linked to the @my-scope registry","yarn npm logout --publish --scope my-scope"],["Logout of all registries","yarn npm logout --all"]]}),(0,i.gn)([h.Command.String("-s,--scope")],v.prototype,"scope",void 0),(0,i.gn)([h.Command.Boolean("--publish")],v.prototype,"publish",void 0),(0,i.gn)([h.Command.Boolean("-A,--all")],v.prototype,"all",void 0),(0,i.gn)([h.Command.Path("npm","logout")],v.prototype,"execute",null);var D=r(5973),b=r(76417),S=r(10129);class k extends o.BaseCommand{constructor(){super(...arguments),this.tag="latest",this.tolerateRepublish=!1}async execute(){const e=await n.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await s.I.find(e,this.context.cwd);if(!r)throw new o.WorkspaceRequiredError(t.cwd,this.context.cwd);if(r.manifest.private)throw new h.UsageError("Private workspaces cannot be published");if(null===r.manifest.name||null===r.manifest.version)throw new h.UsageError("Workspaces must have valid names and versions to be published on an external registry");await t.restoreInstallState();const i=r.manifest.name,g=r.manifest.version,f=l.npmConfigUtils.getPublishRegistry(r.manifest,{configuration:e});return(await c.P.start({configuration:e,stdout:this.context.stdout},async t=>{if(this.tolerateRepublish)try{const r=await l.npmHttpUtils.get(l.npmHttpUtils.getIdentUrl(i),{configuration:e,registry:f,ident:i,json:!0});if(!Object.prototype.hasOwnProperty.call(r,"versions"))throw new a.lk(u.b.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(Object.prototype.hasOwnProperty.call(r.versions,g))return void t.reportWarning(u.b.UNNAMED,`Registry already knows about version ${g}; skipping.`)}catch(e){if("HTTPError"!==e.name)throw e;if(404!==e.response.statusCode)throw new a.lk(u.b.NETWORK_ERROR,`The remote server answered with HTTP ${e.response.statusCode} ${e.response.statusMessage}`)}await D.packUtils.prepareForPack(r,{report:t},async()=>{const n=await D.packUtils.genPackList(r);for(const e of n)t.reportInfo(null,e);const o=await D.packUtils.genPackStream(r,n),s=await A.miscUtils.bufferStream(o),a=await async function(e,t,{access:r,tag:n,registry:i}){const o=e.project.configuration,s=e.manifest.name,a=e.manifest.version,c=A.structUtils.stringifyIdent(s),u=(0,b.createHash)("sha1").update(t).digest("hex"),l=S.Sd(t).toString();void 0===r&&(r=e.manifest.publishConfig&&"string"==typeof e.manifest.publishConfig.access?e.manifest.publishConfig.access:null!==o.get("npmPublishAccess")?o.get("npmPublishAccess"):s.scope?"restricted":"public");const h=await D.packUtils.genPackageManifest(e),g=`${c}-${a}.tgz`,f=new URL(`${c}/-/${g}`,i);return{_id:c,_attachments:{[g]:{content_type:"application/octet-stream",data:t.toString("base64"),length:t.length}},name:c,access:r,"dist-tags":{[n]:a},versions:{[a]:{...h,_id:`${c}@${a}`,name:c,version:a,dist:{shasum:u,integrity:l,tarball:f.toString()}}}}}(r,s,{access:this.access,tag:this.tag,registry:f});try{await l.npmHttpUtils.put(l.npmHttpUtils.getIdentUrl(i),a,{configuration:e,registry:f,ident:i,json:!0})}catch(e){if("HTTPError"!==e.name)throw e;{const r=e.response.body&&e.response.body.error?e.response.body.error:`The remote server answered with HTTP ${e.response.statusCode} ${e.response.statusMessage}`;t.reportError(u.b.NETWORK_ERROR,r)}}}),t.hasErrors()||t.reportInfo(u.b.UNNAMED,"Package archive published")})).exitCode()}}k.usage=h.Command.Usage({category:"Npm-related commands",description:"publish the active workspace to the npm registry",details:'\n This command will pack the active workspace into a fresh archive and upload it to the npm registry.\n\n The package will by default be attached to the `latest` tag on the registry, but this behavior can be overriden by using the `--tag` option.\n\n Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka "private packages"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\n ',examples:[["Publish the active workspace","yarn npm publish"]]}),(0,i.gn)([h.Command.String("--access")],k.prototype,"access",void 0),(0,i.gn)([h.Command.String("--tag")],k.prototype,"tag",void 0),(0,i.gn)([h.Command.Boolean("--tolerate-republish")],k.prototype,"tolerateRepublish",void 0),(0,i.gn)([h.Command.Path("npm","publish")],k.prototype,"execute",null);class x extends o.BaseCommand{constructor(){super(...arguments),this.publish=!1}async execute(){const e=await n.VK.find(this.context.cwd,this.context.plugins);let t;t=this.scope&&this.publish?l.npmConfigUtils.getScopeRegistry(this.scope,{configuration:e,type:l.npmConfigUtils.RegistryType.PUBLISH_REGISTRY}):this.scope?l.npmConfigUtils.getScopeRegistry(this.scope,{configuration:e}):this.publish?l.npmConfigUtils.getPublishRegistry((await(0,o.openWorkspace)(e,this.context.cwd)).manifest,{configuration:e}):l.npmConfigUtils.getDefaultRegistry({configuration:e});return(await c.P.start({configuration:e,stdout:this.context.stdout},async r=>{try{const n=await l.npmHttpUtils.get("/-/whoami",{configuration:e,registry:t,authType:l.npmHttpUtils.AuthType.ALWAYS_AUTH,json:!0});r.reportInfo(u.b.UNNAMED,n.username)}catch(e){if("HTTPError"!==e.name)throw e;401===e.response.statusCode||403===e.response.statusCode?r.reportError(u.b.AUTHENTICATION_INVALID,"Authentication failed - your credentials may have expired"):r.reportError(u.b.AUTHENTICATION_INVALID,e.toString())}})).exitCode()}}x.usage=h.Command.Usage({category:"Npm-related commands",description:"display the name of the authenticated user",details:"\n Print the username associated with the current authentication settings to the standard output.\n\n When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\n\n When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\n ",examples:[["Print username for the default registry","yarn npm whoami"],["Print username for the registry on a given scope","yarn npm whoami --scope company"]]}),(0,i.gn)([h.Command.String("-s,--scope")],x.prototype,"scope",void 0),(0,i.gn)([h.Command.Boolean("--publish")],x.prototype,"publish",void 0),(0,i.gn)([h.Command.Path("npm","whoami")],x.prototype,"execute",null);const F={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:n.a2.STRING,default:null}},commands:[E,w,v,k,x]}},86717:(e,t,r)=>{"use strict";r.r(t),r.d(t,{npmConfigUtils:()=>n,npmHttpUtils:()=>i,default:()=>T});var n={};r.r(n),r.d(n,{RegistryType:()=>c,getAuthConfiguration:()=>y,getDefaultRegistry:()=>E,getPublishRegistry:()=>d,getRegistryConfiguration:()=>I,getScopeConfiguration:()=>m,getScopeRegistry:()=>C,normalizeRegistry:()=>p});var i={};r.r(i),r.d(i,{AuthType:()=>u,get:()=>B,getIdentUrl:()=>w,put:()=>Q});var o=r(27122),s=r(84132),A=r(53887),a=r.n(A);var c,u,l=r(35691),h=r(92659),g=r(9494),f=r.n(g);function p(e){return e.replace(/\/$/,"")}function d(e,{configuration:t}){return e.publishConfig&&e.publishConfig.registry?p(e.publishConfig.registry):e.name?C(e.name.scope,{configuration:t,type:c.PUBLISH_REGISTRY}):E({configuration:t,type:c.PUBLISH_REGISTRY})}function C(e,{configuration:t,type:r=c.FETCH_REGISTRY}){const n=m(e,{configuration:t});if(null===n)return E({configuration:t,type:r});const i=n.get(r);return null===i?E({configuration:t,type:r}):p(i)}function E({configuration:e,type:t=c.FETCH_REGISTRY}){const r=e.get(t);return p(null!==r?r:e.get(c.FETCH_REGISTRY))}function I(e,{configuration:t}){const r=t.get("npmRegistries"),n=r.get(e);if(void 0!==n)return n;const i=r.get(e.replace(/^[a-z]+:/,""));return void 0!==i?i:null}function m(e,{configuration:t}){if(null===e)return null;const r=t.get("npmScopes").get(e);return r||null}function y(e,{configuration:t,ident:r}){const n=r&&m(r.scope,{configuration:t});if((null==n?void 0:n.get("npmAuthIdent"))||(null==n?void 0:n.get("npmAuthToken")))return n;return I(e,{configuration:t})||t}function w(e){return e.scope?`/@${e.scope}%2f${e.name}`:"/"+e.name}async function B(e,{configuration:t,headers:r,ident:n,authType:i,registry:o,...A}){if(n&&void 0===o&&(o=C(n.scope,{configuration:t})),n&&n.scope&&void 0===i&&(i=u.BEST_EFFORT),"string"!=typeof o)throw new Error("Assertion failed: The registry should be a string");const a=v(o,{authType:i,configuration:t,ident:n});let c;a&&(r={...r,authorization:a});try{c=new URL(e)}catch(t){c=new URL(o+e)}try{return await s.httpUtils.get(c.href,{configuration:t,headers:r,...A})}catch(e){throw"HTTPError"!==e.name||401!==e.response.statusCode&&403!==e.response.statusCode?e:new l.lk(h.b.AUTHENTICATION_INVALID,`Invalid authentication (as ${await D(o,r,{configuration:t})})`)}}async function Q(e,t,{attemptedAs:r,configuration:n,headers:i,ident:o,authType:A=u.ALWAYS_AUTH,registry:a,...c}){if(o&&void 0===a&&(a=C(o.scope,{configuration:n})),"string"!=typeof a)throw new Error("Assertion failed: The registry should be a string");const g=v(a,{authType:A,configuration:n,ident:o});g&&(i={...i,authorization:g});try{return await s.httpUtils.put(a+e,t,{configuration:n,headers:i,...c})}catch(o){if(!function(e){if("HTTPError"!==e.name)return!1;try{return e.response.headers["www-authenticate"].split(/,\s*/).map(e=>e.toLowerCase()).includes("otp")}catch(e){return!1}}(o))throw"HTTPError"!==o.name||401!==o.response.statusCode&&403!==o.response.statusCode?o:new l.lk(h.b.AUTHENTICATION_INVALID,`Invalid authentication (${"string"!=typeof r?"as "+await D(a,i,{configuration:n}):"attempted as "+r})`);const A=await async function(){if(process.env.TEST_ENV)return process.env.TEST_NPM_2FA_TOKEN||"";const e=f().createPromptModule(),{otp:t}=await e({type:"input",name:"otp",message:"One-time password:",validate:e=>e.length>0||"One-time password is required"});return t}(),u={...i,...b(A)};try{return await s.httpUtils.put(`${a}${e}`,t,{configuration:n,headers:u,...c})}catch(e){throw"HTTPError"!==e.name||401!==e.response.statusCode&&403!==e.response.statusCode?e:new l.lk(h.b.AUTHENTICATION_INVALID,`Invalid authentication (${"string"!=typeof r?"as "+await D(a,u,{configuration:n}):"attempted as "+r})`)}}}function v(e,{authType:t=u.CONFIGURATION,configuration:r,ident:n}){const i=y(e,{configuration:r,ident:n}),o=function(e,t){switch(t){case u.CONFIGURATION:return e.get("npmAlwaysAuth");case u.BEST_EFFORT:case u.ALWAYS_AUTH:return!0;case u.NO_AUTH:return!1;default:throw new Error("Unreachable")}}(i,t);if(!o)return null;if(i.get("npmAuthToken"))return"Bearer "+i.get("npmAuthToken");if(i.get("npmAuthIdent"))return"Basic "+i.get("npmAuthIdent");if(o&&t!==u.BEST_EFFORT)throw new l.lk(h.b.AUTHENTICATION_NOT_FOUND,"No authentication configured for request");return null}async function D(e,t,{configuration:r}){if(void 0===t||void 0===t.authorization)return"an anonymous user";try{return(await s.httpUtils.get(new URL(e+"/-/whoami").href,{configuration:r,headers:t})).username}catch(e){return"an unknown user"}}function b(e){return{"npm-otp":e}}!function(e){e.FETCH_REGISTRY="npmRegistryServer",e.PUBLISH_REGISTRY="npmPublishRegistry"}(c||(c={})),function(e){e[e.NO_AUTH=0]="NO_AUTH",e[e.BEST_EFFORT=1]="BEST_EFFORT",e[e.CONFIGURATION=2]="CONFIGURATION",e[e.ALWAYS_AUTH=3]="ALWAYS_AUTH"}(u||(u={}));var S=r(78835);class k{supports(e,t){if(!e.reference.startsWith("npm:"))return!1;const r=new S.URL(e.reference);return!!a().valid(r.pathname)&&!r.searchParams.has("__archiveUrl")}getLocalPath(e,t){return null}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,[n,i,o]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,s.structUtils.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from the remote registry"),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:n,releaseFs:i,prefixPath:s.structUtils.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let r;try{r=await B(k.getLocatorUrl(e),{configuration:t.project.configuration,ident:e})}catch(n){r=await B(k.getLocatorUrl(e).replace(/%2f/g,"/"),{configuration:t.project.configuration,ident:e})}return await s.tgzUtils.convertToZip(r,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:s.structUtils.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,t,{configuration:r}){let n=C(e.scope,{configuration:r});const i=k.getLocatorUrl(e);return t=t.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),n=n.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),(t=t.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"))===n+i||t===n+i.replace(/%2f/g,"/")}static getLocatorUrl(e){const t=a().clean(e.reference.slice("npm:".length));if(null===t)throw new l.lk(h.b.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");return`${w(e)}/-/${e.name}-${t}.tgz`}}var x=r(46611),F=r(32485);const M=s.structUtils.makeIdent(null,"node-gyp"),N=/\b(node-gyp|prebuild-install)\b/;var R=r(52779);const K={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:o.a2.BOOLEAN,default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:o.a2.SECRET,default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:o.a2.SECRET,default:null}},L={npmPublishRegistry:{description:"Registry to push packages to",type:o.a2.STRING,default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:o.a2.STRING,default:"https://registry.yarnpkg.com"}},T={configuration:{...K,...L,npmScopes:{description:"Settings per package scope",type:o.a2.MAP,valueDefinition:{description:"",type:o.a2.SHAPE,properties:{...K,...L}}},npmRegistries:{description:"Settings per registry",type:o.a2.MAP,normalizeKeys:p,valueDefinition:{description:"",type:o.a2.SHAPE,properties:{...K}}}},fetchers:[class{supports(e,t){if(!e.reference.startsWith("npm:"))return!1;const{selector:r,params:n}=s.structUtils.parseRange(e.reference);return!!a().valid(r)&&(null!==n&&"string"==typeof n.__archiveUrl)}getLocalPath(e,t){return null}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,[n,i,o]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,s.structUtils.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from the remote server"),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:n,releaseFs:i,prefixPath:s.structUtils.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){const{params:r}=s.structUtils.parseRange(e.reference);if(null===r||"string"!=typeof r.__archiveUrl)throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");const n=await B(r.__archiveUrl,{configuration:t.project.configuration,ident:e});return await s.tgzUtils.convertToZip(n,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:s.structUtils.getIdentVendorPath(e),stripComponents:1})}},k],resolvers:[class{supportsDescriptor(e,t){return!!e.range.startsWith("npm:")&&!!s.structUtils.tryParseDescriptor(e.range.slice("npm:".length),!0)}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Unreachable")}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){const r=s.structUtils.parseDescriptor(e.range.slice("npm:".length),!0);return t.resolver.getResolutionDependencies(r,t)}async getCandidates(e,t,r){const n=s.structUtils.parseDescriptor(e.range.slice("npm:".length),!0);return await r.resolver.getCandidates(n,t,r)}resolve(e,t){throw new Error("Unreachable")}},class{supportsDescriptor(e,t){return!!e.range.startsWith("npm:")&&!!a().validRange(e.range.slice("npm:".length))}supportsLocator(e,t){if(!e.reference.startsWith("npm:"))return!1;const{selector:r}=s.structUtils.parseRange(e.reference);return!!a().valid(r)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){const n=e.range.slice("npm:".length),i=await B(w(e),{configuration:r.project.configuration,ident:e,json:!0}),o=Object.keys(i.versions).filter(e=>a().satisfies(e,n));return o.sort((e,t)=>-a().compare(e,t)),o.map(t=>{const n=s.structUtils.makeLocator(e,"npm:"+t),o=i.versions[t].dist.tarball;return k.isConventionalTarballUrl(n,o,{configuration:r.project.configuration})?n:s.structUtils.bindLocator(n,{__archiveUrl:o})})}async resolve(e,t){const{selector:r}=s.structUtils.parseRange(e.reference),n=a().clean(r);if(null===n)throw new l.lk(h.b.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");const i=await B(w(e),{configuration:t.project.configuration,ident:e,json:!0});if(!Object.prototype.hasOwnProperty.call(i,"versions"))throw new l.lk(h.b.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(!Object.prototype.hasOwnProperty.call(i.versions,n))throw new l.lk(h.b.REMOTE_NOT_FOUND,`Registry failed to return reference "${n}"`);const o=new x.G;if(o.load(i.versions[n]),!o.dependencies.has(M.identHash)&&!o.peerDependencies.has(M.identHash))for(const r of o.scripts.values())if(r.match(N)){o.dependencies.set(M.identHash,s.structUtils.makeDescriptor(M,"latest")),t.report.reportWarning(h.b.NODE_GYP_INJECTED,s.structUtils.prettyLocator(t.project.configuration,e)+": Implicit dependencies on node-gyp are discouraged");break}return"string"==typeof o.raw.deprecated&&t.report.reportWarning(h.b.DEPRECATED_PACKAGE,`${s.structUtils.prettyLocator(t.project.configuration,e)} is deprecated: ${o.raw.deprecated}`),{...e,version:n,languageName:"node",linkType:F.U.HARD,dependencies:o.dependencies,peerDependencies:o.peerDependencies,dependenciesMeta:o.dependenciesMeta,peerDependenciesMeta:o.peerDependenciesMeta,bin:o.bin}}},class{supportsDescriptor(e,t){return!!e.range.startsWith("npm:")&&!!R.c.test(e.range.slice("npm:".length))}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Unreachable")}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){const n=e.range.slice("npm:".length),i=await B(w(e),{configuration:r.project.configuration,ident:e,json:!0});if(!Object.prototype.hasOwnProperty.call(i,"dist-tags"))throw new l.lk(h.b.REMOTE_INVALID,'Registry returned invalid data - missing "dist-tags" field');const o=i["dist-tags"];if(!Object.prototype.hasOwnProperty.call(o,n))throw new l.lk(h.b.REMOTE_NOT_FOUND,`Registry failed to return tag "${n}"`);const A=o[n],a=s.structUtils.makeLocator(e,"npm:"+A),c=i.versions[A].dist.tarball;return k.isConventionalTarballUrl(a,c,{configuration:r.project.configuration})?[a]:[s.structUtils.bindLocator(a,{__archiveUrl:c})]}async resolve(e,t){throw new Error("Unreachable")}}]}},5973:(e,t,r)=>{"use strict";r.r(t),r.d(t,{packUtils:()=>n,default:()=>T});var n={};r.r(n),r.d(n,{genPackList:()=>k,genPackStream:()=>b,genPackageManifest:()=>S,hasPackScripts:()=>v,prepareForPack:()=>D});var i=r(84132),o=r(35691),s=r(92659),A=r(36370),a=r(95397),c=r(27122),u=r(40376),l=r(28148),h=r(33720),g=r(15815),f=r(46009),p=r(56537),d=r(17278),C=r(10489),E=r(2401),I=r.n(E),m=r(92413),y=r(59938),w=r(78761);const B=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],Q=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function v(e){return!!await i.scriptUtils.hasWorkspaceScript(e,"prepack")||!!await i.scriptUtils.hasWorkspaceScript(e,"postpack")}async function D(e,{report:t},r){const n=new m.PassThrough,A=new m.PassThrough;if(await i.scriptUtils.hasWorkspaceScript(e,"prepack")){t.reportInfo(s.b.LIFECYCLE_SCRIPT,'Calling the "prepack" lifecycle script');if(0!==await i.scriptUtils.executeWorkspaceScript(e,"prepack",[],{stdin:null,stdout:n,stderr:A}))throw new o.lk(s.b.LIFECYCLE_SCRIPT,'Prepack script failed; run "yarn prepack" to investigate')}try{await r()}finally{if(await i.scriptUtils.hasWorkspaceScript(e,"postpack")){t.reportInfo(s.b.LIFECYCLE_SCRIPT,'Calling the "postpack" lifecycle script');0!==await i.scriptUtils.executeWorkspaceScript(e,"postpack",[],{stdin:null,stdout:n,stderr:A})&&t.reportWarning(s.b.LIFECYCLE_SCRIPT,'Postpack script failed; run "yarn postpack" to investigate')}}}async function b(e,t){void 0===t&&(t=await k(e));const r=y.P();process.nextTick(async()=>{for(const n of t){const t=f.y1.resolve(e.cwd,n),i=f.y1.join("package",n),o=await p.xfs.lstatPromise(t),s={name:i,mtime:new Date(315532800)};let A,a;const c=new Promise((e,t)=>{A=e,a=t}),u=e=>{e?a(e):A()};if(o.isFile()){let i;i="package.json"===n?Buffer.from(JSON.stringify(await S(e),null,2)):await p.xfs.readFilePromise(t),r.entry({...s,type:"file"},i,u)}else o.isSymbolicLink()&&r.entry({...s,type:"symlink",linkname:await p.xfs.readlinkPromise(t)},u);await c}r.finalize()});const n=(0,w.createGzip)();return r.pipe(n),n}async function S(e){const t=JSON.parse(JSON.stringify(e.manifest.raw));return await e.project.configuration.triggerHook(e=>e.beforeWorkspacePacking,e,t),t}async function k(e){const t=e.project,r=t.configuration,n={accept:[],reject:[]};for(const e of Q)n.reject.push(e);for(const e of B)n.accept.push(e);n.reject.push(r.get("rcFilename"));const i=t=>{if(null===t||!t.startsWith(e.cwd+"/"))return;const r=f.y1.relative(e.cwd,t),i=f.y1.resolve(f.LZ.root,r);n.reject.push(i)};i(f.y1.resolve(t.cwd,r.get("lockfileFilename"))),i(r.get("bstatePath")),i(r.get("cacheFolder")),i(r.get("globalFolder")),i(r.get("installStatePath")),i(r.get("virtualFolder")),i(r.get("yarnPath")),await r.triggerHook(e=>e.populateYarnPaths,t,e=>{i(e)});for(const r of t.workspaces){const t=f.y1.relative(e.cwd,r.cwd);""===t||t.match(/^(\.\.)?\//)||n.reject.push("/"+t)}const o={accept:[],reject:[]};e.manifest.publishConfig&&e.manifest.publishConfig.main?o.accept.push(f.y1.resolve(f.LZ.root,e.manifest.publishConfig.main)):e.manifest.main&&o.accept.push(f.y1.resolve(f.LZ.root,e.manifest.main)),e.manifest.publishConfig&&e.manifest.publishConfig.module?o.accept.push(f.y1.resolve(f.LZ.root,e.manifest.publishConfig.module)):e.manifest.module&&o.accept.push(f.y1.resolve(f.LZ.root,e.manifest.module));const s=null!==e.manifest.files;if(s){o.reject.push("/*");for(const t of e.manifest.files)F(o.accept,t,{cwd:f.LZ.root})}return await async function(e,{hasExplicitFileList:t,globalList:r,ignoreList:n}){const i=[],o=new C.n(e),s=[[f.LZ.root,[n]]];for(;s.length>0;){const[e,n]=s.pop(),A=await o.lstatPromise(e);if(!M(e,{globalList:r,ignoreLists:A.isDirectory()?null:n}))if(A.isDirectory()){const i=await o.readdirPromise(e);let A=!1,a=!1;if(!t||e!==f.LZ.root)for(const e of i)A=A||".gitignore"===e,a=a||".npmignore"===e;const c=a?await x(o,e,(0,f.Zu)(".npmignore")):A?await x(o,e,(0,f.Zu)(".gitignore")):null;let u=null!==c?[c].concat(n):n;M(e,{globalList:r,ignoreLists:n})&&(u=[...n,{accept:[],reject:["**/*"]}]);for(const t of i)s.push([f.y1.resolve(e,t),u])}else i.push(f.y1.relative(f.LZ.root,e))}return i.sort()}(e.cwd,{hasExplicitFileList:s,globalList:n,ignoreList:o})}async function x(e,t,r){const n={accept:[],reject:[]},i=await e.readFilePromise(f.y1.join(t,r),"utf8");for(const e of i.split(/\n/g))F(n.reject,e,{cwd:t});return n}function F(e,t,{cwd:r}){const n=t.trim();""!==n&&"#"!==n[0]&&e.push(function(e,{cwd:t}){const r="!"===e[0];return r&&(e=e.slice(1)),e.match(/\.{0,1}\//)&&(e=f.y1.resolve(t,e)),r&&(e="!"+e),e}(n,{cwd:r}))}function M(e,{globalList:t,ignoreLists:r}){if(N(e,t.accept))return!1;if(N(e,t.reject))return!0;if(null!==r)for(const t of r){if(N(e,t.accept))return!1;if(N(e,t.reject))return!0}return!1}function N(e,t){let r=t;const n=[];for(let e=0;e{await D(r,{report:t},async()=>{t.reportJson({base:r.cwd});const e=await k(r);for(const r of e)t.reportInfo(null,r),t.reportJson({location:r});if(!this.dryRun){const t=await b(r,e),i=p.xfs.createWriteStream(n);t.pipe(i),await new Promise(e=>{i.on("finish",e)})}}),this.dryRun||(t.reportInfo(s.b.UNNAMED,"Package archive generated in "+e.format(n,"magenta")),t.reportJson({output:n}))})).exitCode()}}K.usage=d.Command.Usage({description:"generate a tarball from the active workspace",details:"\n This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\n\n If the `--install-if-needed` flag is set Yarn will run a preliminary `yarn install` if the package contains build scripts.\n\n If the `-n,--dry-run` flag is set the command will just print the file paths without actually generating the package archive.\n\n If the `--json` flag is set the output will follow a JSON-stream output also known as NDJSON (https://github.com/ndjson/ndjson-spec).\n\n If the `-o,---out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\n ",examples:[["Create an archive from the active workspace","yarn pack"],["List the files that would be made part of the workspace's archive","yarn pack --dry-run"],["Name and output the archive in a dedicated folder","yarn pack --out /artifacts/%s-%v.tgz"]]}),(0,A.gn)([d.Command.Boolean("--install-if-needed")],K.prototype,"installIfNeeded",void 0),(0,A.gn)([d.Command.Boolean("-n,--dry-run")],K.prototype,"dryRun",void 0),(0,A.gn)([d.Command.Boolean("--json")],K.prototype,"json",void 0),(0,A.gn)([d.Command.String("--filename",{hidden:!1}),d.Command.String("-o,--out")],K.prototype,"out",void 0),(0,A.gn)([d.Command.Path("pack")],K.prototype,"execute",null);const L=["dependencies","devDependencies","peerDependencies"],T={hooks:{beforeWorkspacePacking:(e,t)=>{t.publishConfig&&(t.publishConfig.main&&(t.main=t.publishConfig.main),t.publishConfig.browser&&(t.browser=t.publishConfig.browser),t.publishConfig.module&&(t.module=t.publishConfig.module),t.publishConfig.bin&&(t.bin=t.publishConfig.bin));const r=e.project;for(const n of L)for(const A of e.manifest.getForScope(n).values()){const e=r.tryWorkspaceByDescriptor(A),a=i.structUtils.parseRange(A.range);if("workspace:"===a.protocol)if(null===e){if(null===r.tryWorkspaceByIdent(A))throw new o.lk(s.b.WORKSPACE_NOT_FOUND,i.structUtils.prettyDescriptor(r.configuration,A)+": No local workspace found for this range")}else{let r;r=i.structUtils.areDescriptorsEqual(A,e.anchoredDescriptor)||"*"===a.selector?e.manifest.version:a.selector,t[n][i.structUtils.stringifyIdent(A)]=r}}}},commands:[K]}},5698:(e,t,r)=>{"use strict";r.r(t),r.d(t,{patchUtils:()=>n,default:()=>q});var n={};r.r(n),r.d(n,{applyPatchFile:()=>g,diffFolders:()=>L,extractPackageToDisk:()=>K,isParentRequired:()=>N,loadPatchFiles:()=>R,makeDescriptor:()=>x,makeLocator:()=>F,parseDescriptor:()=>b,parseLocator:()=>S,parsePatchFile:()=>B});var i=r(84132),o=r(56537),s=r(46009),A=r(90739),a=r(75448),c=r(29486),u=r(33720),l=r(78420);async function h(e,t,r){const n=await e.lstatPromise(t),i=await r();if(void 0!==i&&(t=i),e.lutimesPromise)await e.lutimesPromise(t,n.atime,n.mtime);else{if(n.isSymbolicLink())throw new Error("Cannot preserve the time values of a symlink");await e.utimesPromise(t,n.atime,n.mtime)}}async function g(e,{baseFs:t=new l.S,dryRun:r=!1,version:n=null}={}){for(const o of e)if(null===o.semverExclusivity||null===n||i.semverUtils.satisfiesWithPrereleases(n,o.semverExclusivity))switch(o.type){case"file deletion":if(r){if(!t.existsSync(o.path))throw new Error("Trying to delete file that doesn't exist: "+o.path)}else await h(t,s.y1.dirname(o.path),async()=>{await t.unlinkPromise(o.path)});break;case"rename":if(r){if(!t.existsSync(o.fromPath))throw new Error("Trying to move file that doesn't exist: "+o.fromPath)}else await h(t,s.y1.dirname(o.fromPath),async()=>{await h(t,s.y1.dirname(o.toPath),async()=>{await h(t,o.fromPath,async()=>(await t.movePromise(o.fromPath,o.toPath),o.toPath))})});break;case"file creation":if(r){if(t.existsSync(o.path))throw new Error("Trying to create file that already exists: "+o.path)}else{const e=o.hunk?o.hunk.parts[0].lines.join("\n")+(o.hunk.parts[0].noNewlineAtEndOfFile?"":"\n"):"";await t.mkdirpPromise(s.y1.dirname(o.path),{chmod:493,utimes:[315532800,315532800]}),await t.writeFilePromise(o.path,e,{mode:o.mode}),await t.utimesPromise(o.path,315532800,315532800)}break;case"patch":await h(t,o.path,async()=>{await d(o,{baseFs:t,dryRun:r})});break;case"mode change":{const e=(await t.statPromise(o.path)).mode;if(f(o.newMode)!==f(e))continue;await h(t,o.path,async()=>{await t.chmodPromise(o.path,o.newMode)})}break;default:i.miscUtils.assertNever(o)}}function f(e){return(64&e)>0}function p(e){return e.replace(/\s+$/,"")}async function d({hunks:e,path:t},{baseFs:r,dryRun:n=!1}){const o=await r.statSync(t).mode,s=(await r.readFileSync(t,"utf8")).split(/\n/),A=[];let a=0,c=0;for(const t of e){const r=Math.max(c,t.header.patched.start+a),n=Math.max(0,r-c),i=Math.max(0,s.length-r-t.header.original.length),o=Math.max(n,i);let u=0,l=0,h=null;for(;u<=o;){if(u<=n&&(l=r-u,h=C(t,s,l),null!==h)){u=-u;break}if(u<=i&&(l=r+u,h=C(t,s,l),null!==h))break;u+=1}if(null===h)throw new Error("Cannot apply hunk #"+(e.indexOf(t)+1));A.push(h),a+=u,c=l+t.header.original.length}if(n)return;let u=0;for(const e of A)for(const t of e)switch(t.type){case"splice":{const e=t.index+u;s.splice(e,t.numToDelete,...t.linesToInsert),u+=t.linesToInsert.length-t.numToDelete}break;case"pop":s.pop();break;case"push":s.push(t.line);break;default:i.miscUtils.assertNever(t)}await r.writeFilePromise(t,s.join("\n"),{mode:o})}function C(e,t,r){const n=[];for(const s of e.parts)switch(s.type){case"deletion":case"context":for(const e of s.lines){const n=t[r];if(null==n||(o=e,p(n)!==p(o)))return null;r+=1}"deletion"===s.type&&(n.push({type:"splice",index:r-s.lines.length,numToDelete:s.lines.length,linesToInsert:[]}),s.noNewlineAtEndOfFile&&n.push({type:"push",line:""}));break;case"insertion":n.push({type:"splice",index:r,numToDelete:0,linesToInsert:s.lines}),s.noNewlineAtEndOfFile&&n.push({type:"pop"});break;default:i.miscUtils.assertNever(s.type)}var o;return n}const E=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function I(e){return s.y1.relative(s.LZ.root,s.y1.resolve(s.LZ.root,s.cS.toPortablePath(e)))}function m(e){const t=e.trim().match(E);if(!t)throw new Error(`Bad header line: '${e}'`);return{original:{start:Math.max(Number(t[1]),1),length:Number(t[3]||1)},patched:{start:Math.max(Number(t[4]),1),length:Number(t[6]||1)}}}const y={"@":"header","-":"deletion","+":"insertion"," ":"context","\\":"pragma",undefined:"context"};function w(e){const t=511&parseInt(e,8);if(420!==t&&493!==t)throw new Error("Unexpected file mode string: "+e);return t}function B(e){const t=e.split(/\n/g);return""===t[t.length-1]&&t.pop(),function(e){const t=[];for(const r of e){const{semverExclusivity:e,diffLineFromPath:n,diffLineToPath:o,oldMode:s,newMode:A,deletedFileMode:a,newFileMode:c,renameFrom:u,renameTo:l,beforeHash:h,afterHash:g,fromPath:f,toPath:p,hunks:d}=r,C=u?"rename":a?"file deletion":c?"file creation":d&&d.length>0?"patch":"mode change";let E=null;switch(C){case"rename":if(!u||!l)throw new Error("Bad parser state: rename from & to not given");t.push({type:"rename",semverExclusivity:e,fromPath:I(u),toPath:I(l)}),E=l;break;case"file deletion":{const r=n||f;if(!r)throw new Error("Bad parse state: no path given for file deletion");t.push({type:"file deletion",semverExclusivity:e,hunk:d&&d[0]||null,path:I(r),mode:w(a),hash:h})}break;case"file creation":{const r=o||p;if(!r)throw new Error("Bad parse state: no path given for file creation");t.push({type:"file creation",semverExclusivity:e,hunk:d&&d[0]||null,path:I(r),mode:w(c),hash:g})}break;case"patch":case"mode change":E=p||o;break;default:i.miscUtils.assertNever(C)}E&&s&&A&&s!==A&&t.push({type:"mode change",semverExclusivity:e,path:I(E),oldMode:w(s),newMode:w(A)}),E&&d&&d.length&&t.push({type:"patch",semverExclusivity:e,path:I(E),hunks:d,beforeHash:h,afterHash:g})}return t}(function(e){const t=[];let r={semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null},n="parsing header",o=null,s=null;function A(){o&&(s&&(o.parts.push(s),s=null),r.hunks.push(o),o=null)}function a(){A(),t.push(r),r={semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}}for(let t=0;te<0?e:"+"+e;throw new Error(`hunk header integrity check failed (expected @@ ${n(e.header.original.length)} ${n(e.header.patched.length)} @@, got @@ ${n(t)} ${n(r)} @@)`)}}const v=/^builtin<([^>]+)>$/;function D(e,t){const{source:r,selector:n,params:o}=i.structUtils.parseRange(e);if(null===r)throw new Error("Patch locators must explicitly define their source");const A=n?n.split(/&/).map(e=>s.cS.toPortablePath(e)):[],a=o&&"string"==typeof o.locator?i.structUtils.parseLocator(o.locator):null,c=o&&"string"==typeof o.version?o.version:null;return{parentLocator:a,sourceItem:t(r),patchPaths:A,sourceVersion:c}}function b(e){const{sourceItem:t,...r}=D(e.range,i.structUtils.parseDescriptor);return{...r,sourceDescriptor:t}}function S(e){const{sourceItem:t,...r}=D(e.reference,i.structUtils.parseLocator);return{...r,sourceLocator:t}}function k({parentLocator:e,sourceItem:t,patchPaths:r,sourceVersion:n,patchHash:o},s){const A=null!==e?{locator:i.structUtils.stringifyLocator(e)}:{},a=void 0!==n?{version:n}:{},c=void 0!==o?{hash:o}:{};return i.structUtils.makeRange({protocol:"patch:",source:s(t),selector:r.join("&"),params:{...a,...c,...A}})}function x(e,{parentLocator:t,sourceDescriptor:r,patchPaths:n}){return i.structUtils.makeLocator(e,k({parentLocator:t,sourceItem:r,patchPaths:n},i.structUtils.stringifyDescriptor))}function F(e,{parentLocator:t,sourcePackage:r,patchPaths:n,patchHash:o}){return i.structUtils.makeLocator(e,k({parentLocator:t,sourceItem:r,sourceVersion:r.version,patchPaths:n,patchHash:o},i.structUtils.stringifyLocator))}function M({onAbsolute:e,onRelative:t,onBuiltin:r},n){const i=n.match(v);return null!==i?r(i[1]):s.y1.isAbsolute(n)?e(n):t(n)}function N(e){return M({onAbsolute:()=>!1,onRelative:()=>!0,onBuiltin:()=>!1},e)}async function R(e,t,r){const n=null!==e?await r.fetcher.fetch(e,r):null,A=n&&n.localPath?{packageFs:new a.M(s.LZ.root),prefixPath:s.y1.relative(s.LZ.root,n.localPath)}:n;n&&n!==A&&n.releaseFs&&n.releaseFs();return(await i.miscUtils.releaseAfterUseAsync(async()=>await Promise.all(t.map(async e=>M({onAbsolute:async()=>await o.xfs.readFilePromise(e,"utf8"),onRelative:async()=>{if(null===n)throw new Error("Assertion failed: The parent locator should have been fetched");return await n.packageFs.readFilePromise(e,"utf8")},onBuiltin:async e=>await r.project.configuration.firstHook(e=>e.getBuiltinPatch,r.project,e)},e))))).map(e=>"string"==typeof e?e.replace(/\r\n?/g,"\n"):e)}async function K(e,{cache:t,project:r}){const n=r.storedChecksums,A=new u.$,a=r.configuration.makeFetcher(),c=await a.fetch(e,{cache:t,project:r,fetcher:a,checksums:n,report:A}),l=await o.xfs.mktempPromise();return await o.xfs.copyPromise(l,c.prefixPath,{baseFs:c.packageFs}),await o.xfs.writeJsonPromise(s.y1.join(l,".yarn-patch.json"),{locator:i.structUtils.stringifyLocator(e)}),o.xfs.detachTemp(l),l}async function L(e,t){const r=s.cS.fromPortablePath(e).replace(/\\/g,"/"),n=s.cS.fromPortablePath(t).replace(/\\/g,"/"),{stdout:o}=await i.execUtils.execvp("git",["diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index",r,n],{cwd:s.cS.toPortablePath(process.cwd())}),A=r.startsWith("/")?e=>e.slice(1):e=>e;return o.replace(new RegExp(`(a|b)(${i.miscUtils.escapeRegExp(`/${A(r)}/`)})`,"g"),"$1/").replace(new RegExp("(a|b)"+i.miscUtils.escapeRegExp(`/${A(n)}/`),"g"),"$1/").replace(new RegExp(i.miscUtils.escapeRegExp(r+"/"),"g"),"").replace(new RegExp(i.miscUtils.escapeRegExp(n+"/"),"g"),"")}var T=r(36370),P=r(95397),U=r(27122),_=r(40376),O=r(28148),j=r(17278);class Y extends P.BaseCommand{async execute(){const e=await U.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await _.I.find(e,this.context.cwd),n=await O.C.find(e);if(!r)throw new P.WorkspaceRequiredError(t.cwd,this.context.cwd);await t.restoreInstallState();const A=s.y1.resolve(this.context.cwd,s.cS.toPortablePath(this.patchFolder)),a=s.y1.join(A,".yarn-patch.json");if(!o.xfs.existsSync(a))throw new j.UsageError("The argument folder didn't get created by 'yarn patch'");const c=await o.xfs.readJsonPromise(a),u=i.structUtils.parseLocator(c.locator,!0);if(!t.storedPackages.has(u.locatorHash))throw new j.UsageError("No package found in the project for the given locator");const l=await K(u,{cache:n,project:t});this.context.stdout.write(await L(l,A))}}Y.usage=j.Command.Usage({description:"\n This will turn the folder passed in parameter into a patchfile suitable for consumption with the `patch:` protocol.\n\n Only folders generated through `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "}),(0,T.gn)([j.Command.String()],Y.prototype,"patchFolder",void 0),(0,T.gn)([j.Command.Path("patch-commit")],Y.prototype,"execute",null);var G=r(15815),J=r(92659);class H extends P.BaseCommand{async execute(){const e=await U.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await _.I.find(e,this.context.cwd),n=await O.C.find(e);if(!r)throw new P.WorkspaceRequiredError(t.cwd,this.context.cwd);await t.restoreInstallState();let o=i.structUtils.parseLocator(this.package);if("unknown"===o.reference){const r=i.miscUtils.mapAndFilter([...t.storedPackages.values()],e=>e.identHash!==o.identHash||i.structUtils.isVirtualLocator(e)?i.miscUtils.mapAndFilter.skip:e);if(0===r.length)throw new j.UsageError("No package found in the project for the given locator");if(r.length>1)throw new j.UsageError("Multiple candidate packages found; explicitly choose one of them (use `yarn why ` to get more information as to who depends on them):\n"+r.map(t=>"\n- "+i.structUtils.prettyLocator(e,t)).join(""));o=r[0]}if(!t.storedPackages.has(o.locatorHash))throw new j.UsageError("No package found in the project for the given locator");await G.P.start({configuration:e,stdout:this.context.stdout},async r=>{const A=await K(o,{cache:n,project:t});r.reportInfo(J.b.UNNAMED,`Package ${i.structUtils.prettyLocator(e,o)} got extracted with success!`),r.reportInfo(J.b.UNNAMED,"You can now edit the following folder: "+e.format(s.cS.fromPortablePath(A),"magenta")),r.reportInfo(J.b.UNNAMED,`Once you are done run ${e.format("yarn patch-commit "+s.cS.fromPortablePath(A),"cyan")} and Yarn will store a patchfile based on your changes.`)})}}H.usage=j.Command.Usage({description:'\n This command will cause a package to be extracted in a temporary directory (under a folder named "patch-workdir"). This folder will be editable at will; running `yarn patch` inside it will then cause Yarn to generate a patchfile and register it into your top-level manifest (cf the `patch:` protocol).\n '}),(0,T.gn)([j.Command.String()],H.prototype,"package",void 0),(0,T.gn)([j.Command.Path("patch")],H.prototype,"execute",null);const q={commands:[Y,H],fetchers:[class{supports(e,t){return!!e.reference.startsWith("patch:")}getLocalPath(e,t){return null}async fetch(e,t){const r=t.checksums.get(e.locatorHash)||null,[n,o,s]=await t.cache.fetchPackageFromCache(e,r,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,i.structUtils.prettyLocator(t.project.configuration,e)+" can't be found in the cache and will be fetched from the disk"),loader:()=>this.patchPackage(e,t),skipIntegrityCheck:t.skipIntegrityCheck});return{packageFs:n,releaseFs:o,prefixPath:i.structUtils.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:s}}async patchPackage(e,t){const{parentLocator:r,sourceLocator:n,sourceVersion:u,patchPaths:l}=S(e),h=await R(r,l,t),f=await o.xfs.mktempPromise(),p=s.y1.join(f,"patched.zip"),d=await t.fetcher.fetch(n,t),C=i.structUtils.getIdentVendorPath(e),E=await(0,c.getLibzipPromise)(),I=new A.d(p,{libzip:E,create:!0,level:t.project.configuration.get("compressionLevel")});await I.mkdirpPromise(C),await i.miscUtils.releaseAfterUseAsync(async()=>{await I.copyPromise(C,d.prefixPath,{baseFs:d.packageFs,stableSort:!0})},d.releaseFs),I.saveAndClose();const m=new A.d(p,{libzip:E,level:t.project.configuration.get("compressionLevel")}),y=new a.M(s.y1.resolve(s.LZ.root,C),{baseFs:m});for(const e of h)null!==e&&await g(B(e),{baseFs:y,version:u});return m}}],resolvers:[class{supportsDescriptor(e,t){return!!e.range.startsWith("patch:")}supportsLocator(e,t){return!!e.reference.startsWith("patch:")}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,r){const{patchPaths:n}=b(e);return n.every(e=>!N(e))?e:i.structUtils.bindDescriptor(e,{locator:i.structUtils.stringifyLocator(t)})}getResolutionDependencies(e,t){const{sourceDescriptor:r}=b(e);return[r]}async getCandidates(e,t,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");const{parentLocator:n,sourceDescriptor:o,patchPaths:s}=b(e),A=await R(n,s,r.fetchOptions),a=t.get(o.descriptorHash);if(void 0===a)throw new Error("Assertion failed: The dependency should have been resolved");return[F(e,{parentLocator:n,sourcePackage:a,patchPaths:s,patchHash:i.hashUtils.makeHash("2",...A).slice(0,6)})]}async resolve(e,t){const{sourceLocator:r}=S(e);return{...await t.resolver.resolve(r,t),...e}}}]}},5780:(e,t,r)=>{"use strict";r.r(t),r.d(t,{getPnpPath:()=>b,quotePathIfNeeded:()=>S,AbstractPnpInstaller:()=>d,PnpInstaller:()=>m,PnpLinker:()=>I,default:()=>k});var n=r(27122),i=r(46009),o=r(56537),s=r(53887),A=r.n(s),a=r(92659),c=r(92409),u=r(84132),l=r(75448),h=r(88563),g=r(17278),f=r(46611),p=r(32485);class d{constructor(e){this.opts=e,this.packageRegistry=new Map,this.blacklistedPaths=new Set,this.opts=e}checkAndReportManifestIncompatibility(e,t){return e&&!e.isCompatibleWithOS(process.platform)?(this.opts.report.reportWarningOnce(a.b.INCOMPATIBLE_OS,`${u.structUtils.prettyLocator(this.opts.project.configuration,t)} The platform ${process.platform} is incompatible with this module, ${this.opts.skipIncompatiblePackageLinking?"linking":"building"} skipped.`),!1):!(e&&!e.isCompatibleWithCPU(process.arch))||(this.opts.report.reportWarningOnce(a.b.INCOMPATIBLE_CPU,`${u.structUtils.prettyLocator(this.opts.project.configuration,t)} The CPU architecture ${process.arch} is incompatible with this module, ${this.opts.skipIncompatiblePackageLinking?"linking":"building"} skipped.`),!1)}async installPackage(e,t){const r=u.structUtils.requirableIdent(e),n=e.reference,o=e.peerDependencies.size>0&&!u.structUtils.isVirtualLocator(e)&&!this.opts.project.tryWorkspaceByLocator(e),s=!o||this.opts.skipIncompatiblePackageLinking?await f.G.tryFind(t.prefixPath,{baseFs:t.packageFs}):null,A=this.checkAndReportManifestIncompatibility(s,e);if(this.opts.skipIncompatiblePackageLinking&&!A)return{packageLocation:null,buildDirective:null};const c=o?[]:await this.getBuildScripts(e,s,t);c.length>0&&!this.opts.project.configuration.get("enableScripts")&&(this.opts.report.reportWarningOnce(a.b.DISABLED_BUILD_SCRIPTS,u.structUtils.prettyLocator(this.opts.project.configuration,e)+" lists build scripts, but all build scripts have been disabled."),c.length=0),c.length>0&&e.linkType!==p.U.HARD&&!this.opts.project.tryWorkspaceByLocator(e)&&(this.opts.report.reportWarningOnce(a.b.SOFT_LINK_BUILD,u.structUtils.prettyLocator(this.opts.project.configuration,e)+" lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored."),c.length=0);const l=this.opts.project.getDependencyMeta(e,e.version);c.length>0&&l&&!1===l.built&&(this.opts.report.reportInfoOnce(a.b.BUILD_DISABLED,u.structUtils.prettyLocator(this.opts.project.configuration,e)+" lists build scripts, but its build has been explicitly disabled through configuration."),c.length=0);const h=o||e.linkType===p.U.SOFT?t.packageFs:await this.transformPackage(e,s,t,l,{hasBuildScripts:c.length>0});if(i.y1.isAbsolute(t.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${t.prefixPath}) to be relative to the parent`);const g=i.y1.resolve(h.getRealPath(),t.prefixPath),d=this.normalizeDirectoryPath(g),C=new Map,E=new Set;if(u.structUtils.isVirtualLocator(e))for(const t of e.peerDependencies.values())C.set(u.structUtils.requirableIdent(t),null),E.add(u.structUtils.stringifyIdent(t));return u.miscUtils.getMapWithDefault(this.packageRegistry,r).set(n,{packageLocation:d,packageDependencies:C,packagePeers:E,linkType:e.linkType,discardFromLookup:t.discardFromLookup||!1}),o&&this.blacklistedPaths.add(d),{packageLocation:g,buildDirective:c.length>0&&A?c:null}}async attachInternalDependencies(e,t){const r=this.getPackageInformation(e);for(const[e,n]of t){const t=u.structUtils.areIdentsEqual(e,n)?n.reference:[u.structUtils.requirableIdent(n),n.reference];r.packageDependencies.set(u.structUtils.requirableIdent(e),t)}}async attachExternalDependents(e,t){for(const r of t){this.getDiskInformation(r).packageDependencies.set(u.structUtils.requirableIdent(e),e.reference)}}async finalizeInstall(){this.trimBlacklistedPackages(),this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));const e=this.opts.project.configuration.get("pnpFallbackMode"),t=this.blacklistedPaths,r=this.opts.project.workspaces.map(({anchoredLocator:e})=>({name:u.structUtils.requirableIdent(e),reference:e.reference})),n="none"!==e,i=[],o=this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator).packageDependencies,s=u.miscUtils.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),A=this.packageRegistry,a=this.opts.project.configuration.get("pnpShebang");if("dependencies-only"===e)for(const e of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(e)&&i.push({name:u.structUtils.requirableIdent(e),reference:e.reference});return await this.finalizeInstallWithPnp({blacklistedLocations:t,dependencyTreeRoots:r,enableTopLevelFallback:n,fallbackExclusionList:i,fallbackPool:o,ignorePattern:s,packageRegistry:A,shebang:a})}getPackageInformation(e){const t=u.structUtils.requirableIdent(e),r=e.reference,n=this.packageRegistry.get(t);if(!n)throw new Error(`Assertion failed: The package information store should have been available (for ${u.structUtils.prettyIdent(this.opts.project.configuration,e)})`);const i=n.get(r);if(!i)throw new Error(`Assertion failed: The package information should have been available (for ${u.structUtils.prettyLocator(this.opts.project.configuration,e)})`);return i}getDiskInformation(e){const t=u.miscUtils.getMapWithDefault(this.packageRegistry,"@@disk"),r=this.normalizeDirectoryPath(e);return u.miscUtils.getFactoryWithDefault(t,r,()=>({packageLocation:r,packageDependencies:new Map,packagePeers:new Set,linkType:p.U.SOFT,discardFromLookup:!1}))}trimBlacklistedPackages(){for(const e of this.packageRegistry.values())for(const[t,r]of e)r.packageLocation&&this.blacklistedPaths.has(r.packageLocation)&&e.delete(t)}normalizeDirectoryPath(e){let t=i.y1.relative(this.opts.project.cwd,e);return t.match(/^\.{0,2}\//)||(t="./"+t),t.replace(/\/?$/,"/")}}const C=new Set([u.structUtils.makeIdent(null,"nan").identHash,u.structUtils.makeIdent(null,"node-gyp").identHash,u.structUtils.makeIdent(null,"node-pre-gyp").identHash,u.structUtils.makeIdent(null,"node-addon-api").identHash,u.structUtils.makeIdent(null,"fsevents").identHash]),E=new Set([".exe",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);class I{constructor(){this.mode="strict"}supportsPackage(e,t){return"pnp"===t.project.configuration.get("nodeLinker")&&t.project.configuration.get("pnpMode")===this.mode}async findPackageLocation(e,t){const r=b(t.project).main;if(!o.xfs.existsSync(r))throw new g.UsageError(`The project in ${t.project.cwd}/package.json doesn't seem to have been installed - running an install there might help`);const n=u.miscUtils.dynamicRequireNoCache(r),s={name:u.structUtils.requirableIdent(e),reference:e.reference},A=n.getPackageInformation(s);if(!A)throw new g.UsageError(`Couldn't find ${u.structUtils.prettyLocator(t.project.configuration,e)} in the currently installed PnP map - running an install might help`);return i.cS.toPortablePath(A.packageLocation)}async findPackageLocator(e,t){const n=b(t.project).main;if(!o.xfs.existsSync(n))return null;const s=i.cS.fromPortablePath(n),A=u.miscUtils.dynamicRequire(s);delete r.c[s];const a=A.findPackageLocator(i.cS.fromPortablePath(e));return a?u.structUtils.makeLocator(u.structUtils.parseIdent(a.name),a.reference):null}makeInstaller(e){return new m(e)}}class m extends d{constructor(){super(...arguments),this.mode="strict",this.unpluggedPaths=new Set}async getBuildScripts(e,t,r){if(null===t)return[];const n=[];for(const e of["preinstall","install","postinstall"])t.scripts.has(e)&&n.push([c.k.SCRIPT,e]);const o=i.y1.join(r.prefixPath,(0,i.Zu)("binding.gyp"));return!t.scripts.has("install")&&r.packageFs.existsSync(o)&&n.push([c.k.SHELLCODE,"node-gyp rebuild"]),n}async transformPackage(e,t,r,n,{hasBuildScripts:i}){return this.isUnplugged(e,t,r,n,{hasBuildScripts:i})?this.unplugPackage(e,r.packageFs):r.packageFs}async finalizeInstallWithPnp(e){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;const t=b(this.opts.project),r=this.opts.project.configuration.get("pnpDataPath");if(await o.xfs.removePromise(t.other),"pnp"!==this.opts.project.configuration.get("nodeLinker"))return await o.xfs.removePromise(t.main),void await o.xfs.removePromise(r);const n=await this.locateNodeModules();if(n.length>0){this.opts.report.reportWarning(a.b.DANGEROUS_NODE_MODULES,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(const e of n)await o.xfs.removePromise(e)}if(this.opts.project.configuration.get("pnpEnableInlining")){const n=(0,h.gY)(e);await o.xfs.changeFilePromise(t.main,n,{automaticNewlines:!0}),await o.xfs.chmodPromise(t.main,493),await o.xfs.removePromise(r)}else{const n=i.y1.relative(i.y1.dirname(t.main),r),{dataFile:s,loaderFile:A}=(0,h.Q$)({...e,dataLocation:n});await o.xfs.changeFilePromise(t.main,A,{automaticNewlines:!0}),await o.xfs.chmodPromise(t.main,493),await o.xfs.changeFilePromise(r,s,{automaticNewlines:!0}),await o.xfs.chmodPromise(r,420)}const s=this.opts.project.configuration.get("pnpUnpluggedFolder");if(0===this.unpluggedPaths.size)await o.xfs.removePromise(s);else for(const e of await o.xfs.readdirPromise(s)){const t=i.y1.resolve(s,e);this.unpluggedPaths.has(t)||await o.xfs.removePromise(t)}}async locateNodeModules(){const e=[];for(const t of this.opts.project.workspaces){const r=i.y1.join(t.cwd,(0,i.Zu)("node_modules"));if(!o.xfs.existsSync(r))continue;const n=await o.xfs.readdirPromise(r,{withFileTypes:!0}),s=n.filter(e=>!e.isDirectory()||".bin"===e.name||!e.name.startsWith("."));if(s.length===n.length)e.push(r);else for(const t of s)e.push(i.y1.join(r,t.name))}return e}getUnpluggedPath(e){return i.y1.resolve(this.opts.project.configuration.get("pnpUnpluggedFolder"),u.structUtils.slugifyLocator(e))}async unplugPackage(e,t){const r=this.getUnpluggedPath(e);return this.unpluggedPaths.add(r),await o.xfs.mkdirpPromise(r),await o.xfs.copyPromise(r,i.LZ.dot,{baseFs:t,overwrite:!1}),new l.M(r)}isUnplugged(e,t,r,n,{hasBuildScripts:i}){return void 0!==n.unplugged?n.unplugged:!!C.has(e.identHash)||(null!==t&&null!==t.preferUnplugged?t.preferUnplugged:!(!i&&!r.packageFs.getExtractHint({relevantExtensions:E})))}}var y=r(36370),w=r(95397),B=r(40376),Q=r(28148),v=r(15815);class D extends w.BaseCommand{constructor(){super(...arguments),this.patterns=[]}async execute(){const e=await n.VK.find(this.context.cwd,this.context.plugins),{project:t,workspace:r}=await B.I.find(e,this.context.cwd),i=await Q.C.find(e);if(!r)throw new w.WorkspaceRequiredError(t.cwd,this.context.cwd);const o=t.topLevelWorkspace;for(const e of this.patterns){const t=u.structUtils.parseDescriptor(e);o.manifest.ensureDependencyMeta(t).unplugged=!0}await o.persistManifest();return(await v.P.start({configuration:e,stdout:this.context.stdout},async e=>{await t.install({cache:i,report:e})})).exitCode()}}D.usage=g.Command.Usage({description:"force the unpacking of a list of packages",details:"\n This command will add the specified selectors to the list of packages that must be unplugged when installed.\n\n A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `virtualFolder`.\n\n Unpacking a package isn't advised as a general tool because it makes it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\n\n The unplug command sets a flag that's persisted in your top-level `package.json` through the `dependenciesMeta` field. As such, to undo its effects, just revert the changes made to the manifest and run `yarn install`.\n ",examples:[["Unplug lodash","yarn unplug lodash"],["Unplug one specific version of lodash","yarn unplug lodash@1.2.3"]]}),(0,y.gn)([g.Command.Rest()],D.prototype,"patterns",void 0),(0,y.gn)([g.Command.Path("unplug")],D.prototype,"execute",null);const b=e=>{let t,r;return"module"===e.topLevelWorkspace.manifest.type?(t=".pnp.cjs",r=".pnp.js"):(t=".pnp.js",r=".pnp.cjs"),{main:i.y1.join(e.cwd,t),other:i.y1.join(e.cwd,r)}},S=e=>/\s/.test(e)?JSON.stringify(e):e;const k={hooks:{populateYarnPaths:async function(e,t){t(b(e).main),t(b(e).other),t(e.configuration.get("pnpDataPath")),t(e.configuration.get("pnpUnpluggedFolder"))},setupScriptEnvironment:async function(e,t,r){const n=b(e).main,s="--require "+S(i.cS.fromPortablePath(n));if(n.includes(" ")&&A().lt(process.versions.node,"12.0.0"))throw new Error(`Expected the build location to not include spaces when using Node < 12.0.0 (${process.versions.node})`);if(o.xfs.existsSync(n)){let e=t.NODE_OPTIONS||"";const r=/\s*--require\s+\S*\.pnp\.c?js\s*/g;e=e.replace(r," ").trim(),e=e?`${s} ${e}`:s,t.NODE_OPTIONS=e}}},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "node-modules"',type:n.a2.STRING,default:"pnp"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:n.a2.STRING,default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:n.a2.STRING,default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:n.a2.STRING,default:[],isArray:!0},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:n.a2.BOOLEAN,default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:n.a2.STRING,default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:n.a2.ABSOLUTE_PATH,default:"./.yarn/unplugged"},pnpDataPath:{description:"Path of the file where the PnP data (used by the loader) must be written",type:n.a2.ABSOLUTE_PATH,default:"./.pnp.data.json"}},linkers:[I],commands:[D]}},28638:(e,t,r)=>{"use strict";r.r(t);var n=r(50683),i=r.n(n);Object.fromEntries||(Object.fromEntries=i());var o=r(59355),s=r(91058),A=r(45330);(0,s.D)({binaryVersion:o.o||"",pluginConfiguration:(0,A.e)()})},95397:(e,t,r)=>{"use strict";r.r(t),r.d(t,{BaseCommand:()=>n.F,WorkspaceRequiredError:()=>A,getDynamicLibs:()=>c,getPluginConfiguration:()=>u.e,openWorkspace:()=>h,main:()=>g.D});var n=r(56087),i=r(46611),o=r(46009),s=r(17278);class A extends s.UsageError{constructor(e,t){super(`This command can only be run from within a workspace of your project (${o.y1.relative(e,t)} isn't a workspace of ${o.y1.join(e,i.G.fileName)}).`)}}const a=["@yarnpkg/cli","@yarnpkg/core","@yarnpkg/fslib","@yarnpkg/libzip","@yarnpkg/parsers","@yarnpkg/shell","clipanion","semver","yup"],c=()=>new Map(a.map(e=>[e,r(98497)(e)]));var u=r(45330),l=r(40376);async function h(e,t){const{project:r,workspace:n}=await l.I.find(e,t);if(!n)throw new A(r.cwd,t);return n}var g=r(91058)},91058:(e,t,r)=>{"use strict";r.d(t,{D:()=>h});var n=r(27122),i=r(46009),o=r(56537),s=r(63129),A=r(17278),a=r(35747),c=r(36370),u=r(56087);class l extends u.F{async execute(){const e=await n.VK.find(this.context.cwd,this.context.plugins);this.context.stdout.write((e=>`\n${e.format("Welcome on Yarn 2!","bold")} 🎉 Thanks for helping us shape our vision of how projects\nshould be managed going forward.\n\nBeing still in RC, Yarn 2 isn't completely stable yet. Some features might be\nmissing, and some behaviors may have received major overhaul. In case of doubt,\nuse the following URLs to get some insight:\n\n - The changelog:\n ${e.format("https://github.com/yarnpkg/berry/tree/CHANGELOG.md","cyan")}\n\n - Our issue tracker:\n ${e.format("https://github.com/yarnpkg/berry","cyan")}\n\n - Our Discord server:\n ${e.format("https://discord.gg/yarnpkg","cyan")}\n\nWe're hoping you will enjoy the experience. For now, a good start is to run\nthe two following commands:\n\n ${e.format("find . -name node_modules -prune -exec rm -r {} \\;","magenta")}\n ${e.format("yarn install","magenta")}\n\nOne last trick! If you need at some point to upgrade Yarn to a nightly build,\nthe following command will install the CLI straight from master:\n\n ${e.format("yarn set version from sources","magenta")}\n\nSee you later 👋\n`)(e).trim()+"\n")}}async function h({binaryVersion:e,pluginConfiguration:t}){async function r(){const c=new A.Cli({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:e});c.register(l);try{await async function(e){const A=await n.VK.find(i.cS.toPortablePath(process.cwd()),t,{usePath:!0,strict:!1}),c=A.get("yarnPath"),u=A.get("ignorePath"),l=A.get("ignoreCwd");if(null===c||u){u&&delete process.env.YARN_IGNORE_PATH;for(const t of A.plugins.values())for(const r of t.commands||[])e.register(r);const n=e.process(process.argv.slice(2)),o=n.cwd;if(void 0!==o&&!l){const e=(0,a.realpathSync)(process.cwd()),t=(0,a.realpathSync)(o);if(e!==t)return process.chdir(o),void await r()}e.runExit(n,{cwd:i.cS.toPortablePath(process.cwd()),plugins:t,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr})}else if(o.xfs.existsSync(c))try{!function(e){const t=i.cS.fromPortablePath(e);process.on("SIGINT",()=>{}),t?(0,s.execFileSync)(process.execPath,[t,...process.argv.slice(2)],{stdio:"inherit",env:{...process.env,YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"}}):(0,s.execFileSync)(t,process.argv.slice(2),{stdio:"inherit",env:{...process.env,YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"}})}(c)}catch(e){process.exitCode=e.code||1}else process.stdout.write(e.error(new Error(`The "yarn-path" option has been set (in ${A.sources.get("yarnPath")}), but the specified location doesn't exist (${c}).`))),process.exitCode=1}(c)}catch(e){process.stdout.write(c.error(e)),process.exitCode=1}}return r().catch(e=>{process.stdout.write(e.stack||e.message),process.exitCode=1})}(0,c.gn)([A.Command.Path("--welcome")],l.prototype,"execute",null)},56087:(e,t,r)=>{"use strict";r.d(t,{F:()=>o});var n=r(36370),i=r(17278);class o extends i.Command{}(0,n.gn)([i.Command.String("--cwd",{hidden:!0})],o.prototype,"cwd",void 0)},28148:(e,t,r)=>{"use strict";r.d(t,{C:()=>C});var n=r(78420),i=r(90739),o=r(15037),s=r(46009),A=r(56537),a=r(29486),c=r(35747),u=r.n(c),l=r(92659),h=r(35691),g=r(20624),f=r(73632),p=r(54143);const d=5;class C{constructor(e,{configuration:t,immutable:r=t.get("enableImmutableCache"),check:n=!1}){this.markedFiles=new Set,this.mutexes=new Map,this.configuration=t,this.cwd=e,this.immutable=r,this.check=n;const o=t.get("cacheKeyOverride");if(null!==o)this.cacheKey=""+o;else{const e=t.get("compressionLevel"),r=e!==i.k?"c"+e:"";this.cacheKey=[d,r].join("")}}static async find(e,{immutable:t,check:r}={}){const n=new C(e.get("cacheFolder"),{configuration:e,immutable:t,check:r});return await n.setup(),n}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;const e=this.configuration.get("globalFolder")+"/cache";return e!==this.cwd?e:null}getVersionFilename(e){return`${p.slugifyLocator(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,t){const r=function(e){const t=e.indexOf("/");return-1!==t?e.slice(t+1):e}(t).slice(0,10);return`${p.slugifyLocator(e)}-${r}.zip`}getLocatorPath(e,t){if(null===this.mirrorCwd)return s.y1.resolve(this.cwd,this.getVersionFilename(e));if(null===t)return null;return E(t)!==this.cacheKey?null:s.y1.resolve(this.cwd,this.getChecksumFilename(e,t))}getLocatorMirrorPath(e){const t=this.mirrorCwd;return null!==t?s.y1.resolve(t,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get("enableGlobalCache")){await A.xfs.mkdirpPromise(this.cwd);const e=s.y1.resolve(this.cwd,(0,s.Zu)(".gitignore"));await A.xfs.existsPromise(e)||await A.xfs.writeFilePromise(e,"/.gitignore\n*.lock\n")}}async fetchPackageFromCache(e,t,{onHit:r,onMiss:c,loader:d,skipIntegrityCheck:C}){const I=this.getLocatorMirrorPath(e),m=new n.S,y=async(e,r=null)=>{const n=C&&t?t:`${this.cacheKey}/${await g.checksumFile(e)}`;if(null!==r){if(n!==(C&&t?t:`${this.cacheKey}/${await g.checksumFile(r)}`))throw new h.lk(l.b.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}if(null!==t&&n!==t){let e;switch(e=this.check?"throw":E(t)!==E(n)?"update":this.configuration.get("checksumBehavior"),e){case"ignore":return t;case"update":return n;default:case"throw":throw new h.lk(l.b.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the expected checksum")}}return n},w=async t=>{if(!d)throw new Error("Cache check required but no loader configured for "+p.prettyLocator(this.configuration,e));const r=await d(),n=r.getRealPath();return r.saveAndClose(),await A.xfs.chmodPromise(n,420),await y(t,n)},B=async()=>{if(null===I||!A.xfs.existsSync(I))return await d();const t=await A.xfs.mktempPromise(),r=s.y1.join(t,this.getVersionFilename(e));return await A.xfs.copyFilePromise(I,r,u().constants.COPYFILE_FICLONE),new i.d(r,{libzip:await(0,a.getLibzipPromise)()})},Q=async()=>{if(!d)throw new Error("Cache entry required but missing for "+p.prettyLocator(this.configuration,e));if(this.immutable)throw new h.lk(l.b.IMMUTABLE_CACHE,"Cache entry required but missing for "+p.prettyLocator(this.configuration,e));const t=await B(),r=t.getRealPath();t.saveAndClose(),await A.xfs.chmodPromise(r,420);const n=await y(r),i=this.getLocatorPath(e,n);if(!i)throw new Error("Assertion failed: Expected the cache path to be available");return await this.writeFileWithLock(i,async()=>await this.writeFileWithLock(I,async()=>(await A.xfs.movePromise(r,i),null!==I&&await A.xfs.copyFilePromise(i,I,u().constants.COPYFILE_FICLONE),[i,n])))},v=async()=>{const t=Q();this.mutexes.set(e.locatorHash,t);try{return await t}finally{this.mutexes.delete(e.locatorHash)}};for(let t;t=this.mutexes.get(e.locatorHash);)await t;const D=this.getLocatorPath(e,t),b=null!==D&&m.existsSync(D),S=b?r:c;let k,x;S&&S(),b?(k=D,x=this.check?await w(k):await y(k)):[k,x]=await v(),this.markedFiles.add(k);let F=null;const M=await(0,a.getLibzipPromise)();return[new o.v(()=>f.prettifySyncErrors(()=>F=new i.d(k,{baseFs:m,libzip:M,readOnly:!0}),t=>`Failed to open the cache entry for ${p.prettyLocator(this.configuration,e)}: ${t}`),s.y1),()=>{null!==F&&F.discardAndClose()},x]}async writeFileWithLock(e,t){return null===e?await t():(await A.xfs.mkdirpPromise(s.y1.dirname(e)),await A.xfs.lockPromise(e,async()=>await t()))}}function E(e){const t=e.indexOf("/");return-1!==t?e.slice(0,t):null}},27122:(e,t,r)=>{"use strict";r.d(t,{tr:()=>_,nh:()=>O,a2:()=>j,a5:()=>Y,EW:()=>V,VK:()=>X});var n=r(90739),i=r(46009),o=r(56537),s=r(55125),A=r(54738),a=r.n(A),c=r(95882),u=r.n(c),l=r(5864),h=r(17278),g=r(53887),f=r.n(g),p=r(92413),d=r(92659),C=r(54143);const E={hooks:{reduceDependency:(e,t,r,n,{resolver:i,resolveOptions:o})=>{for(const{pattern:n,reference:s}of t.topLevelWorkspace.manifest.resolutions){if(n.from&&n.from.fullName!==C.requirableIdent(r))continue;if(n.from&&n.from.description&&n.from.description!==r.reference)continue;if(n.descriptor.fullName!==C.requirableIdent(e))continue;if(n.descriptor.description&&n.descriptor.description!==e.range)continue;return i.bindDescriptor(C.makeDescriptor(e,s),t.topLevelWorkspace.anchoredLocator,o)}return e},validateProject:async(e,t)=>{for(const r of e.workspaces){const n=C.prettyWorkspace(e.configuration,r);await e.configuration.triggerHook(e=>e.validateWorkspace,r,{reportWarning:(e,r)=>t.reportWarning(e,`${n}: ${r}`),reportError:(e,r)=>t.reportError(e,`${n}: ${r}`)})}},validateWorkspace:async(e,t)=>{const{manifest:r}=e;r.resolutions.length&&e.cwd!==e.project.cwd&&r.errors.push(new Error("Resolutions field will be ignored"));for(const e of r.errors)t.reportWarning(d.b.INVALID_MANIFEST,e.message)}}};var I=r(46611),m=r(35691);class y{constructor(e){this.fetchers=e}supports(e,t){return!!this.tryFetcher(e,t)}getLocalPath(e,t){return this.getFetcher(e,t).getLocalPath(e,t)}async fetch(e,t){const r=this.getFetcher(e,t);return await r.fetch(e,t)}tryFetcher(e,t){const r=this.fetchers.find(r=>r.supports(e,t));return r||null}getFetcher(e,t){const r=this.fetchers.find(r=>r.supports(e,t));if(!r)throw new m.lk(d.b.FETCHER_NOT_FOUND,C.prettyLocator(t.project.configuration,e)+" isn't supported by any available fetcher");return r}}var w=r(27092),B=r(52779),Q=r(60895);class v{static isVirtualDescriptor(e){return!!e.range.startsWith(v.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(v.protocol)}supportsDescriptor(e,t){return v.isVirtualDescriptor(e)}supportsLocator(e,t){return v.isVirtualLocator(e)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,r){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,t){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,t,r){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async resolve(e,t){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}}v.protocol="virtual:";var D=r(75448),b=r(94538);class S{supports(e){return!!e.reference.startsWith(b.d.protocol)}getLocalPath(e,t){return this.getWorkspace(e,t).cwd}async fetch(e,t){const r=this.getWorkspace(e,t).cwd;return{packageFs:new D.M(r),prefixPath:i.LZ.dot,localPath:r}}getWorkspace(e,t){return t.project.getWorkspaceByCwd(e.reference.slice(b.d.protocol.length))}}var k=r(81111),x=r(73632),F=r(32282),M=r.n(F);function N(e){return("undefined"!=typeof require?require:r(32178))(e)}var R=r(36545);const K=process.env.GITHUB_ACTIONS?{level:2}:u().supportsColor?{level:u().supportsColor.level}:{level:0},L=0!==K.level,T=L&&!process.env.GITHUB_ACTIONS,P=new(u().Instance)(K),U=new Set(["binFolder","version","flags","profile","gpg","wrapOutput"]),_=(0,i.Zu)(".yarnrc.yml"),O=(0,i.Zu)("yarn.lock");var j,Y;!function(e){e.ANY="ANY",e.BOOLEAN="BOOLEAN",e.ABSOLUTE_PATH="ABSOLUTE_PATH",e.LOCATOR="LOCATOR",e.LOCATOR_LOOSE="LOCATOR_LOOSE",e.NUMBER="NUMBER",e.STRING="STRING",e.SECRET="SECRET",e.SHAPE="SHAPE",e.MAP="MAP"}(j||(j={})),function(e){e.NAME="NAME",e.NUMBER="NUMBER",e.PATH="PATH",e.RANGE="RANGE",e.REFERENCE="REFERENCE",e.SCOPE="SCOPE",e.ADDED="ADDED",e.REMOVED="REMOVED"}(Y||(Y={}));const G=K.level>=3?new Map([[Y.NAME,"#d7875f"],[Y.RANGE,"#00afaf"],[Y.REFERENCE,"#87afff"],[Y.NUMBER,"#ffd700"],[Y.PATH,"#d75fd7"],[Y.SCOPE,"#d75f00"],[Y.ADDED,"#5faf00"],[Y.REMOVED,"#d70000"]]):new Map([[Y.NAME,173],[Y.RANGE,37],[Y.REFERENCE,111],[Y.NUMBER,220],[Y.PATH,170],[Y.SCOPE,166],[Y.ADDED,70],[Y.REMOVED,160]]),J={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:j.STRING,default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:j.ABSOLUTE_PATH,default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:j.BOOLEAN,default:!1},ignoreCwd:{description:"If true, the `--cwd` flag will be ignored",type:j.BOOLEAN,default:!1},cacheKeyOverride:{description:"A global cache key override; used only for test purposes",type:j.STRING,default:null},globalFolder:{description:"Folder where are stored the system-wide settings",type:j.ABSOLUTE_PATH,default:k.getDefaultGlobalFolder()},cacheFolder:{description:"Folder where the cache files must be written",type:j.ABSOLUTE_PATH,default:"./.yarn/cache"},compressionLevel:{description:"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)",type:j.NUMBER,values:["mixed",0,1,2,3,4,5,6,7,8,9],default:n.k},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named $$virtual)",type:j.ABSOLUTE_PATH,default:"./.yarn/$$virtual"},bstatePath:{description:"Path of the file where the current state of the built packages must be stored",type:j.ABSOLUTE_PATH,default:"./.yarn/build-state.yml"},lockfileFilename:{description:"Name of the files where the Yarn dependency tree entries must be stored",type:j.STRING,default:O},installStatePath:{description:"Path of the file where the install state will be persisted",type:j.ABSOLUTE_PATH,default:"./.yarn/install-state.gz"},rcFilename:{description:"Name of the files where the configuration can be found",type:j.STRING,default:W()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:j.BOOLEAN,default:!1},enableAbsoluteVirtuals:{description:"If true, the virtual symlinks will use absolute paths if required [non portable!!]",type:j.BOOLEAN,default:!1},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:j.BOOLEAN,default:L,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:j.BOOLEAN,default:T,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:j.BOOLEAN,default:l.isCI,defaultText:""},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:j.BOOLEAN,default:!l.isCI&&process.stdout.isTTY&&process.stdout.columns>22,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:j.BOOLEAN,default:!0},preferAggregateCacheInfo:{description:"If true, the CLI will only print a one-line report of any cache changes",type:j.BOOLEAN,default:l.isCI},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:j.BOOLEAN,default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:j.BOOLEAN,default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:j.STRING,default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:j.STRING,default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:j.STRING,default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:j.BOOLEAN,default:!0},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:j.BOOLEAN,default:!0},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:j.BOOLEAN,default:!0},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:j.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:j.STRING,default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:j.STRING,default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:j.NUMBER,default:6e4},httpRetry:{description:"Retry times on http failure",type:j.NUMBER,default:3},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:j.BOOLEAN,default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:j.BOOLEAN,default:!1},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:j.STRING,default:"throw"},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:j.MAP,valueDefinition:{description:"",type:j.ANY}}};function H(e,t,r,n,i){if(n.isArray)return Array.isArray(r)?r.map((r,o)=>q(e,`${t}[${o}]`,r,n,i)):String(r).split(/,/).map(r=>q(e,t,r,n,i));if(Array.isArray(r))throw new Error(`Non-array configuration settings "${t}" cannot be an array`);return q(e,t,r,n,i)}function q(e,t,r,n,o){var s;switch(n.type){case j.ANY:return r;case j.SHAPE:return function(e,t,r,n,i){if("object"!=typeof r||Array.isArray(r))throw new h.UsageError(`Object configuration settings "${t}" must be an object`);const o=z(e,n);if(null===r)return o;for(const[s,A]of Object.entries(r)){const r=`${t}.${s}`;if(!n.properties[s])throw new h.UsageError(`Unrecognized configuration settings found: ${t}.${s} - run "yarn config -v" to see the list of settings supported in Yarn`);o.set(s,H(e,r,A,n.properties[s],i))}return o}(e,t,r,n,o);case j.MAP:return function(e,t,r,n,i){const o=new Map;if("object"!=typeof r||Array.isArray(r))throw new h.UsageError(`Map configuration settings "${t}" must be an object`);if(null===r)return o;for(const[s,A]of Object.entries(r)){const r=n.normalizeKeys?n.normalizeKeys(s):s,a=`${t}['${r}']`,c=n.valueDefinition;o.set(r,H(e,a,A,c,i))}return o}(e,t,r,n,o)}if(null===r&&!n.isNullable&&null!==n.default)throw new Error(`Non-nullable configuration settings "${t}" cannot be set to null`);if(null===(s=n.values)||void 0===s?void 0:s.includes(r))return r;const A=(()=>{if(n.type===j.BOOLEAN)return function(e){switch(e){case"true":case"1":case 1:case!0:return!0;case"false":case"0":case 0:case!1:return!1;default:throw new Error(`Couldn't parse "${e}" as a boolean`)}}(r);if("string"!=typeof r)throw new Error(`Expected value (${r}) to be a string`);const e=x.replaceEnvVariables(r,{env:process.env});switch(n.type){case j.ABSOLUTE_PATH:return i.y1.resolve(o,i.cS.toPortablePath(e));case j.LOCATOR_LOOSE:return C.parseLocator(e,!1);case j.NUMBER:return parseInt(e);case j.LOCATOR:return C.parseLocator(e);default:return e}})();if(n.values&&!n.values.includes(A))throw new Error("Invalid value, expected one of "+n.values.join(", "));return A}function z(e,t){switch(t.type){case j.SHAPE:{const r=new Map;for(const[n,i]of Object.entries(t.properties))r.set(n,z(e,i));return r}case j.MAP:return new Map;case j.ABSOLUTE_PATH:return null===t.default?null:null===e.projectCwd?i.y1.isAbsolute(t.default)?i.y1.normalize(t.default):t.isNullable?null:void 0:Array.isArray(t.default)?t.default.map(t=>i.y1.resolve(e.projectCwd,t)):i.y1.resolve(e.projectCwd,t.default);default:return t.default}}function W(){for(const[e,t]of Object.entries(process.env))if("yarn_rc_filename"===e.toLowerCase()&&"string"==typeof t)return t;return _}var V;!function(e){e[e.LOCKFILE=0]="LOCKFILE",e[e.MANIFEST=1]="MANIFEST",e[e.NONE=2]="NONE"}(V||(V={}));class X{constructor(e){this.projectCwd=null,this.plugins=new Map,this.settings=new Map,this.values=new Map,this.sources=new Map,this.invalid=new Map,this.packageExtensions=new Map,this.startingCwd=e}static create(e,t,r){const n=new X(e);void 0===t||t instanceof Map||(n.projectCwd=t),n.importSettings(J);const i=void 0!==r?r:t instanceof Map?t:new Map;for(const[e,t]of i)n.activatePlugin(e,t);return n}static async find(e,t,{lookup:r=V.LOCKFILE,strict:n=!0,usePath:s=!1,useRc:A=!0}={}){const c=function(){const e={};for(let[t,r]of Object.entries(process.env))t=t.toLowerCase(),t.startsWith("yarn_")&&(t=a()(t.slice("yarn_".length)),e[t]=r);return e}();delete c.rcFilename;const u=await X.findRcFiles(e),l=await X.findHomeRcFile(),g=({ignoreCwd:e,yarnPath:t,ignorePath:r,lockfileFilename:n})=>({ignoreCwd:e,yarnPath:t,ignorePath:r,lockfileFilename:n}),f=({ignoreCwd:e,yarnPath:t,ignorePath:r,lockfileFilename:n,...i})=>i,p=new X(e);p.importSettings(g(J)),p.useWithSource("",g(c),e,{strict:!1});for(const{path:e,cwd:t,data:r}of u)p.useWithSource(e,g(r),t,{strict:!1});if(l&&p.useWithSource(l.path,g(l.data),l.cwd,{strict:!1}),s){const e=p.get("yarnPath"),t=p.get("ignorePath");if(null!==e&&!t)return p}const d=p.get("lockfileFilename");let C;switch(r){case V.LOCKFILE:C=await X.findProjectCwd(e,d);break;case V.MANIFEST:C=await X.findProjectCwd(e,null);break;case V.NONE:C=o.xfs.existsSync(i.y1.join(e,"package.json"))?i.y1.resolve(e):null}p.startingCwd=e,p.projectCwd=C,p.importSettings(f(J));const I=new Map([["@@core",E]]);if(null!==t){for(const e of t.plugins.keys())I.set(e,(m=t.modules.get(e)).__esModule?m.default:m);const r=new Map;for(const e of new Set(M().builtinModules||Object.keys(process.binding("natives"))))r.set(e,()=>N(e));for(const[e,n]of t.modules)r.set(e,()=>n);const n=new Set,o=e=>e.default||e,s=(e,t)=>{const{factory:s,name:A}=N(i.cS.fromPortablePath(e));if(n.has(A))return;const a=new Map(r),c=e=>{if(a.has(e))return a.get(e)();throw new h.UsageError(`This plugin cannot access the package referenced via ${e} which is neither a builtin, nor an exposed entry`)},u=x.prettifySyncErrors(()=>o(s(c)),e=>`${e} (when initializing ${A}, defined in ${t})`);r.set(A,()=>u),n.add(A),I.set(A,u)};if(c.plugins)for(const t of c.plugins.split(";")){s(i.y1.resolve(e,i.cS.toPortablePath(t)),"")}for(const{path:e,cwd:t,data:r}of u)if(A&&Array.isArray(r.plugins))for(const n of r.plugins){const r="string"!=typeof n?n.path:n;s(i.y1.resolve(t,i.cS.toPortablePath(r)),e)}}var m;for(const[e,t]of I)p.activatePlugin(e,t);p.useWithSource("",f(c),e,{strict:n});for(const{path:e,cwd:t,data:r}of u)p.useWithSource(e,f(r),t,{strict:n});return l&&p.useWithSource(l.path,f(l.data),l.cwd,{strict:n}),p.get("enableGlobalCache")&&(p.values.set("cacheFolder",p.get("globalFolder")+"/cache"),p.sources.set("cacheFolder","")),await p.refreshPackageExtensions(),p}static async findRcFiles(e){const t=W(),r=[];let n=e,A=null;for(;n!==A;){A=n;const e=i.y1.join(A,t);if(o.xfs.existsSync(e)){const t=await o.xfs.readFilePromise(e,"utf8");let n;try{n=(0,s.parseSyml)(t)}catch(r){let n="";throw t.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(n=" (in particular, make sure you list the colons after each key name)"),new h.UsageError(`Parse error when loading ${e}; please check it's proper Yaml${n}`)}r.push({path:e,cwd:A,data:n})}n=i.y1.dirname(A)}return r}static async findHomeRcFile(){const e=W(),t=k.getHomeFolder(),r=i.y1.join(t,e);if(o.xfs.existsSync(r)){const e=await o.xfs.readFilePromise(r,"utf8");return{path:r,cwd:t,data:(0,s.parseSyml)(e)}}return null}static async findProjectCwd(e,t){let r=null,n=e,s=null;for(;n!==s;){if(s=n,o.xfs.existsSync(i.y1.join(s,(0,i.Zu)("package.json")))&&(r=s),null!==t){if(o.xfs.existsSync(i.y1.join(s,t))){r=s;break}}else if(null!==r)break;n=i.y1.dirname(s)}return r}static async updateConfiguration(e,t){const r=W(),n=i.y1.join(e,r),A=o.xfs.existsSync(n)?(0,s.parseSyml)(await o.xfs.readFilePromise(n,"utf8")):{};let a=!1;if("function"==typeof t&&(t=t(A)),"function"==typeof t)throw new Error("Assertion failed: Invalid configuration type");for(const e of Object.keys(t)){const r=A[e],n="function"==typeof t[e]?t[e](r):t[e];r!==n&&(A[e]=n,a=!0)}a&&await o.xfs.changeFilePromise(n,(0,s.stringifySyml)(A),{automaticNewlines:!0})}static async updateHomeConfiguration(e){const t=k.getHomeFolder();return await X.updateConfiguration(t,e)}activatePlugin(e,t){this.plugins.set(e,t),void 0!==t.configuration&&this.importSettings(t.configuration)}importSettings(e){for(const[t,r]of Object.entries(e)){if(this.settings.has(t))throw new Error(`Cannot redefine settings "${t}"`);this.settings.set(t,r),this.values.set(t,z(this,r))}}useWithSource(e,t,r,{strict:n=!0,overwrite:i=!1}){try{this.use(e,t,r,{strict:n,overwrite:i})}catch(t){throw t.message+=` (in ${e})`,t}}use(e,t,r,{strict:n=!0,overwrite:i=!1}){for(const o of Object.keys(t)){if(void 0===t[o])continue;if("plugins"===o)continue;if(""===e&&U.has(o))continue;if("rcFilename"===o)throw new h.UsageError(`The rcFilename settings can only be set via ${"yarn_RC_FILENAME".toUpperCase()}, not via a rc file`);const s=this.settings.get(o);if(!s){if(n)throw new h.UsageError(`Unrecognized or legacy configuration settings found: ${o} - run "yarn config -v" to see the list of settings supported in Yarn`);this.invalid.set(o,e);continue}if(this.sources.has(o)&&!i)continue;let A;try{A=H(this,o,t[o],s,r)}catch(t){throw t.message+=" in "+e,t}this.values.set(o,A),this.sources.set(o,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:t=!1,getNativePaths:r=!1}){const n=this.get(e),o=this.settings.get(e);if(void 0===o)throw new h.UsageError(`Couldn't find a configuration settings named "${e}"`);return function e(t,r,n){if(r.type===j.SECRET&&"string"==typeof t&&n.hideSecrets)return"********";if(r.type===j.ABSOLUTE_PATH&&"string"==typeof t&&n.getNativePaths)return i.cS.fromPortablePath(t);if(r.isArray&&Array.isArray(t)){const i=[];for(const o of t)i.push(e(o,r,n));return i}if(r.type===j.MAP&&t instanceof Map){const i=new Map;for(const[o,s]of t.entries())i.set(o,e(s,r.valueDefinition,n));return i}if(r.type===j.SHAPE&&t instanceof Map){const i=new Map;for(const[o,s]of t.entries()){const t=r.properties[o];i.set(o,e(s,t,n))}return i}return t}(n,o,{hideSecrets:t,getNativePaths:r})}getSubprocessStreams(e,{header:t,prefix:r,report:n}){let i,s;const A=o.xfs.createWriteStream(e);if(this.get("enableInlineBuilds")){const e=n.createStreamReporter(`${r} ${this.format("STDOUT","green")}`),t=n.createStreamReporter(`${r} ${this.format("STDERR","red")}`);i=new p.PassThrough,i.pipe(e),i.pipe(A),s=new p.PassThrough,s.pipe(t),s.pipe(A)}else i=A,s=A,void 0!==t&&i.write(t+"\n");return{stdout:i,stderr:s}}makeResolver(){const e=[];for(const t of this.plugins.values())for(const r of t.resolvers||[])e.push(new r);return new w.B([new v,new b.d,new B.O,...e])}makeFetcher(){const e=[];for(const t of this.plugins.values())for(const r of t.fetchers||[])e.push(new r);return new y([new Q.N,new S,...e])}getLinkers(){const e=[];for(const t of this.plugins.values())for(const r of t.linkers||[])e.push(new r);return e}async refreshPackageExtensions(){this.packageExtensions=new Map;const e=this.packageExtensions,t=(t,r)=>{if(!f().validRange(t.range))throw new Error("Only semver ranges are allowed as keys for the lockfileExtensions setting");const n=new I.G;n.load(r),x.getArrayWithDefault(e,t.identHash).push({range:t.range,patch:e=>{e.dependencies=new Map([...e.dependencies,...n.dependencies]),e.peerDependencies=new Map([...e.peerDependencies,...n.peerDependencies]),e.dependenciesMeta=new Map([...e.dependenciesMeta,...n.dependenciesMeta]),e.peerDependenciesMeta=new Map([...e.peerDependenciesMeta,...n.peerDependenciesMeta])}})};for(const[e,r]of this.get("packageExtensions"))t(C.parseDescriptor(e,!0),r);await this.triggerHook(e=>e.registerPackageExtensions,this,t)}normalizePackage(e){const t=C.copyPackage(e);if(null==this.packageExtensions)throw new Error("refreshPackageExtensions has to be called before normalizing packages");const r=this.packageExtensions.get(e.identHash);if(void 0!==r){const n=e.version;if(null!==n){const e=r.find(({range:e})=>R.satisfiesWithPrereleases(n,e));void 0!==e&&e.patch(t)}}return t.dependencies=new Map(x.sortMap(t.dependencies,([,e])=>e.name)),t.peerDependencies=new Map(x.sortMap(t.peerDependencies,([,e])=>e.name)),t}async triggerHook(e,...t){for(const r of this.plugins.values()){const n=r.hooks;if(!n)continue;const i=e(n);i&&await i(...t)}}async triggerMultipleHooks(e,t){for(const r of t)await this.triggerHook(e,...r)}async reduceHook(e,t,...r){let n=t;for(const t of this.plugins.values()){const i=t.hooks;if(!i)continue;const o=e(i);o&&(n=await o(n,...r))}return n}async firstHook(e,...t){for(const r of this.plugins.values()){const n=r.hooks;if(!n)continue;const i=e(n);if(!i)continue;const o=await i(...t);if(void 0!==o)return o}return null}format(e,t){if(t===Y.PATH&&(e=i.cS.fromPortablePath(e)),!this.get("enableColors"))return e;let r=G.get(t);void 0===r&&(r=t);return("number"==typeof r?P.ansi256(r):r.startsWith("#")?P.hex(r):P[r])(e)}}},92409:(e,t,r)=>{"use strict";var n;r.d(t,{k:()=>n}),function(e){e[e.SCRIPT=0]="SCRIPT",e[e.SHELLCODE=1]="SHELLCODE"}(n||(n={}))},62152:(e,t,r)=>{"use strict";r.d(t,{h:()=>i});var n=r(35691);class i extends n.yG{constructor({configuration:e,stdout:t,suggestInstall:r=!0}){super(),this.errorCount=0,this.configuration=e,this.stdout=t,this.suggestInstall=r}static async start(e,t){const r=new this(e);try{await t(r)}catch(e){r.reportExceptionOnce(e)}finally{await r.finalize()}return r}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){}reportCacheMiss(e){}startTimerSync(e,t){return t()}async startTimerPromise(e,t){return await t()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,t){}reportWarning(e,t){}reportError(e,t){this.errorCount+=1,this.stdout.write(`${this.configuration.format("➤","redBright")} ${this.formatName(e)}: ${t}\n`)}reportProgress(e){return{...Promise.resolve().then(async()=>{for await(const{}of e);}),stop:()=>{}}}reportJson(e){}async finalize(){this.errorCount>0&&(this.stdout.write(this.configuration.format("➤","redBright")+" Errors happened when preparing the environment required to run this command.\n"),this.suggestInstall&&this.stdout.write(this.configuration.format("➤","redBright")+' This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help.\n'))}formatName(e){return"BR"+e.toString(10).padStart(4,"0")}}},46611:(e,t,r)=>{"use strict";r.d(t,{G:()=>u});var n=r(78420),i=r(46009),o=r(55125),s=r(53887),A=r.n(s),a=r(73632),c=r(54143);class u{constructor(){this.indent=" ",this.name=null,this.version=null,this.os=null,this.cpu=null,this.type=null,this.private=!1,this.license=null,this.main=null,this.module=null,this.languageName=null,this.bin=new Map,this.scripts=new Map,this.dependencies=new Map,this.devDependencies=new Map,this.peerDependencies=new Map,this.workspaceDefinitions=[],this.dependenciesMeta=new Map,this.peerDependenciesMeta=new Map,this.resolutions=[],this.files=null,this.publishConfig=null,this.preferUnplugged=null,this.raw={},this.errors=[]}static async tryFind(e,{baseFs:t=new n.S}={}){const r=i.y1.join(e,(0,i.Zu)("package.json"));return await t.existsPromise(r)?await u.fromFile(r,{baseFs:t}):null}static async find(e,{baseFs:t}={}){const r=await u.tryFind(e,{baseFs:t});if(null===r)throw new Error("Manifest not found");return r}static async fromFile(e,{baseFs:t=new n.S}={}){const r=new u;return await r.loadFile(e,{baseFs:t}),r}static fromText(e){const t=new u;return t.loadFromText(e),t}loadFromText(e){let t;try{t=JSON.parse(h(e)||"{}")}catch(t){throw t.message+=` (when parsing ${e})`,t}this.load(t),this.indent=l(e)}async loadFile(e,{baseFs:t=new n.S}){const r=await t.readFilePromise(e,"utf8");let i;try{i=JSON.parse(h(r)||"{}")}catch(t){throw t.message+=` (when parsing ${e})`,t}this.load(i),this.indent=l(r)}load(e){if("object"!=typeof e||null===e)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;const t=[];if("string"==typeof e.name)try{this.name=c.parseIdent(e.name)}catch(e){t.push(new Error("Parsing failed for the 'name' field"))}if("string"==typeof e.version&&(this.version=e.version),Array.isArray(e.os)){const r=[];this.os=r;for(const n of e.os)"string"!=typeof n?t.push(new Error("Parsing failed for the 'os' field")):r.push(n)}if(Array.isArray(e.cpu)){const r=[];this.cpu=r;for(const n of e.cpu)"string"!=typeof n?t.push(new Error("Parsing failed for the 'cpu' field")):r.push(n)}if("string"==typeof e.type&&(this.type=e.type),"boolean"==typeof e.private&&(this.private=e.private),"string"==typeof e.license&&(this.license=e.license),"string"==typeof e.languageName&&(this.languageName=e.languageName),"string"==typeof e.bin)null!==this.name?this.bin=new Map([[this.name.name,e.bin]]):t.push(new Error("String bin field, but no attached package name"));else if("object"==typeof e.bin&&null!==e.bin)for(const[r,n]of Object.entries(e.bin))"string"==typeof n?this.bin.set(r,n):t.push(new Error(`Invalid bin definition for '${r}'`));if("object"==typeof e.scripts&&null!==e.scripts)for(const[r,n]of Object.entries(e.scripts))"string"==typeof n?this.scripts.set(r,n):t.push(new Error(`Invalid script definition for '${r}'`));if("object"==typeof e.dependencies&&null!==e.dependencies)for(const[r,n]of Object.entries(e.dependencies)){if("string"!=typeof n){t.push(new Error(`Invalid dependency range for '${r}'`));continue}let e;try{e=c.parseIdent(r)}catch(e){t.push(new Error(`Parsing failed for the dependency name '${r}'`));continue}const i=c.makeDescriptor(e,n);this.dependencies.set(i.identHash,i)}if("object"==typeof e.devDependencies&&null!==e.devDependencies)for(const[r,n]of Object.entries(e.devDependencies)){if("string"!=typeof n){t.push(new Error(`Invalid dependency range for '${r}'`));continue}let e;try{e=c.parseIdent(r)}catch(e){t.push(new Error(`Parsing failed for the dependency name '${r}'`));continue}const i=c.makeDescriptor(e,n);this.devDependencies.set(i.identHash,i)}if("object"==typeof e.peerDependencies&&null!==e.peerDependencies)for(let[r,n]of Object.entries(e.peerDependencies)){let e;try{e=c.parseIdent(r)}catch(e){t.push(new Error(`Parsing failed for the dependency name '${r}'`));continue}"string"==typeof n&&A().validRange(n)||(t.push(new Error(`Invalid dependency range for '${r}'`)),n="*");const i=c.makeDescriptor(e,n);this.peerDependencies.set(i.identHash,i)}const r=Array.isArray(e.workspaces)?e.workspaces:"object"==typeof e.workspaces&&null!==e.workspaces&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];for(const e of r)"string"==typeof e?this.workspaceDefinitions.push({pattern:e}):t.push(new Error(`Invalid workspace definition for '${e}'`));if("object"==typeof e.dependenciesMeta&&null!==e.dependenciesMeta)for(const[r,n]of Object.entries(e.dependenciesMeta)){if("object"!=typeof n||null===n){t.push(new Error("Invalid meta field for '"+r));continue}const e=c.parseDescriptor(r),i=this.ensureDependencyMeta(e);Object.assign(i,n)}if("object"==typeof e.peerDependenciesMeta&&null!==e.peerDependenciesMeta)for(const[r,n]of Object.entries(e.peerDependenciesMeta)){if("object"!=typeof n||null===n){t.push(new Error("Invalid meta field for '"+r));continue}const e=c.parseDescriptor(r),i=this.ensurePeerDependencyMeta(e);Object.assign(i,n)}if("object"==typeof e.resolutions&&null!==e.resolutions)for(const[r,n]of Object.entries(e.resolutions))if("string"==typeof n)try{this.resolutions.push({pattern:(0,o.parseResolution)(r),reference:n})}catch(e){t.push(e);continue}else t.push(new Error(`Invalid resolution entry for '${r}'`));if(Array.isArray(e.files)&&0!==e.files.length){this.files=new Set;for(const r of e.files)"string"==typeof r?this.files.add(r):t.push(new Error(`Invalid files entry for '${r}'`))}if("object"==typeof e.publishConfig&&null!==e.publishConfig)if(this.publishConfig={},"string"==typeof e.publishConfig.access&&(this.publishConfig.access=e.publishConfig.access),"string"==typeof e.publishConfig.main&&(this.publishConfig.main=e.publishConfig.main),"string"==typeof e.publishConfig.registry&&(this.publishConfig.registry=e.publishConfig.registry),"string"==typeof e.publishConfig.module&&(this.publishConfig.module=e.publishConfig.module),"string"==typeof e.publishConfig.bin)null!==this.name?this.publishConfig.bin=new Map([[this.name.name,e.publishConfig.bin]]):t.push(new Error("String bin field, but no attached package name"));else if("object"==typeof e.publishConfig.bin&&null!==e.publishConfig.bin){this.publishConfig.bin=new Map;for(const[r,n]of Object.entries(e.publishConfig.bin))"string"==typeof n?this.publishConfig.bin.set(r,n):t.push(new Error(`Invalid bin definition for '${r}'`))}if("object"==typeof e.optionalDependencies&&null!==e.optionalDependencies)for(const[r,n]of Object.entries(e.optionalDependencies)){if("string"!=typeof n){t.push(new Error(`Invalid dependency range for '${r}'`));continue}let e;try{e=c.parseIdent(r)}catch(e){t.push(new Error(`Parsing failed for the dependency name '${r}'`));continue}const i=c.makeDescriptor(e,n);this.dependencies.set(i.identHash,i);const o=c.makeDescriptor(e,"unknown"),s=this.ensureDependencyMeta(o);Object.assign(s,{optional:!0})}"boolean"==typeof e.preferUnplugged&&(this.preferUnplugged=e.preferUnplugged),this.errors=t}getForScope(e){switch(e){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${e}")`)}}hasConsumerDependency(e){return!!this.dependencies.has(e.identHash)||!!this.peerDependencies.has(e.identHash)}hasHardDependency(e){return!!this.dependencies.has(e.identHash)||!!this.devDependencies.has(e.identHash)}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!this.hasHardDependency(e)||!!this.hasSoftDependency(e)}isCompatibleWithOS(e){return null===this.os||g(this.os,e)}isCompatibleWithCPU(e){return null===this.cpu||g(this.cpu,e)}ensureDependencyMeta(e){if("unknown"!==e.range&&!A().valid(e.range))throw new Error(`Invalid meta field range for '${c.stringifyDescriptor(e)}'`);const t=c.stringifyIdent(e),r="unknown"!==e.range?e.range:null;let n=this.dependenciesMeta.get(t);n||this.dependenciesMeta.set(t,n=new Map);let i=n.get(r);return i||n.set(r,i={}),i}ensurePeerDependencyMeta(e){if("unknown"!==e.range)throw new Error(`Invalid meta field range for '${c.stringifyDescriptor(e)}'`);const t=c.stringifyIdent(e);let r=this.peerDependenciesMeta.get(t);return r||this.peerDependenciesMeta.set(t,r={}),this.peerDependencies.has(e.identHash)||this.peerDependencies.set(e.identHash,c.makeDescriptor(e,"*")),r}setRawField(e,t,{after:r=[]}={}){const n=new Set(r.filter(e=>Object.prototype.hasOwnProperty.call(this.raw,e)));if(0===n.size||Object.prototype.hasOwnProperty.call(this.raw,e))this.raw[e]=t;else{const r=this.raw,i=this.raw={};let o=!1;for(const s of Object.keys(r))i[s]=r[s],o||(n.delete(s),0===n.size&&(i[e]=t,o=!0))}}exportTo(e,{compatibilityMode:t=!0}={}){Object.assign(e,this.raw),null!==this.name?e.name=c.stringifyIdent(this.name):delete e.name,null!==this.version?e.version=this.version:delete e.version,null!==this.os?e.os=this.os:delete this.os,null!==this.cpu?e.cpu=this.cpu:delete this.cpu,null!==this.type?e.type=this.type:delete e.type,this.private?e.private=!0:delete e.private,null!==this.license?e.license=this.license:delete e.license,null!==this.languageName?e.languageName=this.languageName:delete e.languageName,1===this.bin.size&&null!==this.name&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(e=>({[e]:this.bin.get(e)}))):delete e.bin;const r=[],n=[];for(const e of this.dependencies.values()){const i=this.dependenciesMeta.get(c.stringifyIdent(e));let o=!1;if(t&&i){const e=i.get(null);e&&e.optional&&(o=!0)}o?n.push(e):r.push(e)}r.length>0?e.dependencies=Object.assign({},...c.sortDescriptors(r).map(e=>({[c.stringifyIdent(e)]:e.range}))):delete e.dependencies,n.length>0?e.optionalDependencies=Object.assign({},...c.sortDescriptors(n).map(e=>({[c.stringifyIdent(e)]:e.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...c.sortDescriptors(this.devDependencies.values()).map(e=>({[c.stringifyIdent(e)]:e.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...c.sortDescriptors(this.peerDependencies.values()).map(e=>({[c.stringifyIdent(e)]:e.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(const[r,n]of a.sortMap(this.dependenciesMeta.entries(),([e,t])=>e))for(const[i,o]of a.sortMap(n.entries(),([e,t])=>null!==e?"0"+e:"1")){const n=null!==i?c.stringifyDescriptor(c.makeDescriptor(c.parseIdent(r),i)):r,s={...o};t&&null===i&&delete s.optional,0!==Object.keys(s).length&&(e.dependenciesMeta[n]=s)}return 0===Object.keys(e.dependenciesMeta).length&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...a.sortMap(this.peerDependenciesMeta.entries(),([e,t])=>e).map(([e,t])=>({[e]:t}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:e,reference:t})=>({[(0,o.stringifyResolution)(e)]:t}))):delete e.resolutions,null!==this.files?e.files=Array.from(this.files):delete e.files,null!==this.preferUnplugged?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,e}}function l(e){const t=e.match(/^[ \t]+/m);return t?t[0]:" "}function h(e){return 65279===e.charCodeAt(0)?e.slice(1):e}function g(e,t){let r=!0,n=!1;for(const i of e)if("!"===i[0]){if(n=!0,t===i.slice(1))return!1}else if(r=!1,i===t)return!0;return n&&r}u.fileName="package.json",u.allDependencies=["dependencies","devDependencies","peerDependencies"],u.hardDependencies=["dependencies","devDependencies"]},92659:(e,t,r)=>{"use strict";var n;r.d(t,{b:()=>n}),function(e){e[e.UNNAMED=0]="UNNAMED",e[e.EXCEPTION=1]="EXCEPTION",e[e.MISSING_PEER_DEPENDENCY=2]="MISSING_PEER_DEPENDENCY",e[e.CYCLIC_DEPENDENCIES=3]="CYCLIC_DEPENDENCIES",e[e.DISABLED_BUILD_SCRIPTS=4]="DISABLED_BUILD_SCRIPTS",e[e.BUILD_DISABLED=5]="BUILD_DISABLED",e[e.SOFT_LINK_BUILD=6]="SOFT_LINK_BUILD",e[e.MUST_BUILD=7]="MUST_BUILD",e[e.MUST_REBUILD=8]="MUST_REBUILD",e[e.BUILD_FAILED=9]="BUILD_FAILED",e[e.RESOLVER_NOT_FOUND=10]="RESOLVER_NOT_FOUND",e[e.FETCHER_NOT_FOUND=11]="FETCHER_NOT_FOUND",e[e.LINKER_NOT_FOUND=12]="LINKER_NOT_FOUND",e[e.FETCH_NOT_CACHED=13]="FETCH_NOT_CACHED",e[e.YARN_IMPORT_FAILED=14]="YARN_IMPORT_FAILED",e[e.REMOTE_INVALID=15]="REMOTE_INVALID",e[e.REMOTE_NOT_FOUND=16]="REMOTE_NOT_FOUND",e[e.RESOLUTION_PACK=17]="RESOLUTION_PACK",e[e.CACHE_CHECKSUM_MISMATCH=18]="CACHE_CHECKSUM_MISMATCH",e[e.UNUSED_CACHE_ENTRY=19]="UNUSED_CACHE_ENTRY",e[e.MISSING_LOCKFILE_ENTRY=20]="MISSING_LOCKFILE_ENTRY",e[e.WORKSPACE_NOT_FOUND=21]="WORKSPACE_NOT_FOUND",e[e.TOO_MANY_MATCHING_WORKSPACES=22]="TOO_MANY_MATCHING_WORKSPACES",e[e.CONSTRAINTS_MISSING_DEPENDENCY=23]="CONSTRAINTS_MISSING_DEPENDENCY",e[e.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]="CONSTRAINTS_INCOMPATIBLE_DEPENDENCY",e[e.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]="CONSTRAINTS_EXTRANEOUS_DEPENDENCY",e[e.CONSTRAINTS_INVALID_DEPENDENCY=26]="CONSTRAINTS_INVALID_DEPENDENCY",e[e.CANT_SUGGEST_RESOLUTIONS=27]="CANT_SUGGEST_RESOLUTIONS",e[e.FROZEN_LOCKFILE_EXCEPTION=28]="FROZEN_LOCKFILE_EXCEPTION",e[e.CROSS_DRIVE_VIRTUAL_LOCAL=29]="CROSS_DRIVE_VIRTUAL_LOCAL",e[e.FETCH_FAILED=30]="FETCH_FAILED",e[e.DANGEROUS_NODE_MODULES=31]="DANGEROUS_NODE_MODULES",e[e.NODE_GYP_INJECTED=32]="NODE_GYP_INJECTED",e[e.AUTHENTICATION_NOT_FOUND=33]="AUTHENTICATION_NOT_FOUND",e[e.INVALID_CONFIGURATION_KEY=34]="INVALID_CONFIGURATION_KEY",e[e.NETWORK_ERROR=35]="NETWORK_ERROR",e[e.LIFECYCLE_SCRIPT=36]="LIFECYCLE_SCRIPT",e[e.CONSTRAINTS_MISSING_FIELD=37]="CONSTRAINTS_MISSING_FIELD",e[e.CONSTRAINTS_INCOMPATIBLE_FIELD=38]="CONSTRAINTS_INCOMPATIBLE_FIELD",e[e.CONSTRAINTS_EXTRANEOUS_FIELD=39]="CONSTRAINTS_EXTRANEOUS_FIELD",e[e.CONSTRAINTS_INVALID_FIELD=40]="CONSTRAINTS_INVALID_FIELD",e[e.AUTHENTICATION_INVALID=41]="AUTHENTICATION_INVALID",e[e.PROLOG_UNKNOWN_ERROR=42]="PROLOG_UNKNOWN_ERROR",e[e.PROLOG_SYNTAX_ERROR=43]="PROLOG_SYNTAX_ERROR",e[e.PROLOG_EXISTENCE_ERROR=44]="PROLOG_EXISTENCE_ERROR",e[e.STACK_OVERFLOW_RESOLUTION=45]="STACK_OVERFLOW_RESOLUTION",e[e.AUTOMERGE_FAILED_TO_PARSE=46]="AUTOMERGE_FAILED_TO_PARSE",e[e.AUTOMERGE_IMMUTABLE=47]="AUTOMERGE_IMMUTABLE",e[e.AUTOMERGE_SUCCESS=48]="AUTOMERGE_SUCCESS",e[e.AUTOMERGE_REQUIRED=49]="AUTOMERGE_REQUIRED",e[e.DEPRECATED_CLI_SETTINGS=50]="DEPRECATED_CLI_SETTINGS",e[e.PLUGIN_NAME_NOT_FOUND=51]="PLUGIN_NAME_NOT_FOUND",e[e.INVALID_PLUGIN_REFERENCE=52]="INVALID_PLUGIN_REFERENCE",e[e.CONSTRAINTS_AMBIGUITY=53]="CONSTRAINTS_AMBIGUITY",e[e.CACHE_OUTSIDE_PROJECT=54]="CACHE_OUTSIDE_PROJECT",e[e.IMMUTABLE_INSTALL=55]="IMMUTABLE_INSTALL",e[e.IMMUTABLE_CACHE=56]="IMMUTABLE_CACHE",e[e.INVALID_MANIFEST=57]="INVALID_MANIFEST",e[e.PACKAGE_PREPARATION_FAILED=58]="PACKAGE_PREPARATION_FAILED",e[e.INVALID_RANGE_PEER_DEPENDENCY=59]="INVALID_RANGE_PEER_DEPENDENCY",e[e.INCOMPATIBLE_PEER_DEPENDENCY=60]="INCOMPATIBLE_PEER_DEPENDENCY",e[e.DEPRECATED_PACKAGE=61]="DEPRECATED_PACKAGE",e[e.INCOMPATIBLE_OS=62]="INCOMPATIBLE_OS",e[e.INCOMPATIBLE_CPU=63]="INCOMPATIBLE_CPU"}(n||(n={}))},27092:(e,t,r)=>{"use strict";r.d(t,{B:()=>i});var n=r(54143);class i{constructor(e){this.resolvers=e.filter(e=>e)}supportsDescriptor(e,t){return!!this.tryResolverByDescriptor(e,t)}supportsLocator(e,t){return!!this.tryResolverByLocator(e,t)}shouldPersistResolution(e,t){return this.getResolverByLocator(e,t).shouldPersistResolution(e,t)}bindDescriptor(e,t,r){return this.getResolverByDescriptor(e,r).bindDescriptor(e,t,r)}getResolutionDependencies(e,t){return this.getResolverByDescriptor(e,t).getResolutionDependencies(e,t)}async getCandidates(e,t,r){const n=this.getResolverByDescriptor(e,r);return await n.getCandidates(e,t,r)}async resolve(e,t){const r=this.getResolverByLocator(e,t);return await r.resolve(e,t)}tryResolverByDescriptor(e,t){const r=this.resolvers.find(r=>r.supportsDescriptor(e,t));return r||null}getResolverByDescriptor(e,t){const r=this.resolvers.find(r=>r.supportsDescriptor(e,t));if(!r)throw new Error(n.prettyDescriptor(t.project.configuration,e)+" isn't supported by any available resolver");return r}tryResolverByLocator(e,t){const r=this.resolvers.find(r=>r.supportsLocator(e,t));return r||null}getResolverByLocator(e,t){const r=this.resolvers.find(r=>r.supportsLocator(e,t));if(!r)throw new Error(n.prettyLocator(t.project.configuration,e)+" isn't supported by any available resolver");return r}}},40376:(e,t,r)=>{"use strict";r.d(t,{I:()=>ne});var n=r(56537),i=r(46009),o=r(35398),s=r(55125),A=r(17278),a=r(76417);function c(){}function u(e,t,r,n,i){for(var o=0,s=t.length,A=0,a=0;oe.length?r:e})),c.value=e.join(l)}else c.value=e.join(r.slice(A,A+c.count));A+=c.count,c.added||(a+=c.count)}}var h=t[s-1];return s>1&&"string"==typeof h.value&&(h.added||h.removed)&&e.equals("",h.value)&&(t[s-2].value+=h.value,t.pop()),t}function l(e){return{newPos:e.newPos,components:e.components.slice(0)}}c.prototype={diff:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=r.callback;"function"==typeof r&&(n=r,r={}),this.options=r;var i=this;function o(e){return n?(setTimeout((function(){n(void 0,e)}),0),!0):e}e=this.castInput(e),t=this.castInput(t),e=this.removeEmpty(this.tokenize(e));var s=(t=this.removeEmpty(this.tokenize(t))).length,A=e.length,a=1,c=s+A,h=[{newPos:-1,components:[]}],g=this.extractCommon(h[0],t,e,0);if(h[0].newPos+1>=s&&g+1>=A)return o([{value:this.join(t),count:t.length}]);function f(){for(var r=-1*a;r<=a;r+=2){var n=void 0,c=h[r-1],g=h[r+1],f=(g?g.newPos:0)-r;c&&(h[r-1]=void 0);var p=c&&c.newPos+1=s&&f+1>=A)return o(u(i,n.components,t,e,i.useLongestToken));h[r]=n}else h[r]=void 0}a++}if(n)!function e(){setTimeout((function(){if(a>c)return n();f()||e()}),0)}();else for(;a<=c;){var p=f();if(p)return p}},pushComponent:function(e,t,r){var n=e[e.length-1];n&&n.added===t&&n.removed===r?e[e.length-1]={count:n.count+1,added:t,removed:r}:e.push({count:1,added:t,removed:r})},extractCommon:function(e,t,r,n){for(var i=t.length,o=r.length,s=e.newPos,A=s-n,a=0;s+10?a(p.lines.slice(-s.context)):[],u-=h.length,l-=h.length)}(o=h).push.apply(o,I(i.map((function(e){return(t.added?"+":"-")+e})))),t.added?f+=i.length:g+=i.length}else{if(u)if(i.length<=2*s.context&&e=A.length-2&&i.length<=s.context){var y=/\n$/.test(r),w=/\n$/.test(n),B=0==i.length&&h.length>m.oldLines;!y&&B&&h.splice(m.oldLines,0,"\\ No newline at end of file"),(y||B)&&w||h.push("\\ No newline at end of file")}c.push(m),u=0,l=0,h=[]}g+=i.length,f+=i.length}},C=0;C`${r}#commit:${n}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(e,t,r="",n,i)=>`https://${r}github.com/${n}.git#commit:${i}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(e,t,r="",n,i)=>`https://${r}github.com/${n}.git#commit:${i}`],[/^https?:\/\/[^/]+\/(?:@[^/]+\/)?([^/]+)\/-\/\1-[^/]+\.tgz(?:#|$)/,e=>"npm:"+e],[/^[^/]+\.tgz#[0-9a-f]+$/,e=>"npm:"+e]];class _{constructor(){this.resolutions=null}async setup(e,{report:t}){const r=i.y1.join(e.cwd,e.configuration.get("lockfileFilename"));if(!n.xfs.existsSync(r))return;const o=await n.xfs.readFilePromise(r,"utf8"),A=(0,s.parseSyml)(o);if(Object.prototype.hasOwnProperty.call(A,"__metadata"))return;const a=this.resolutions=new Map;for(const r of Object.keys(A)){let n=P.tryParseDescriptor(r);if(!n){t.reportWarning(T.b.YARN_IMPORT_FAILED,`Failed to parse the string "${r}" into a proper descriptor`);continue}k().validRange(n.range)&&(n=P.makeDescriptor(n,"npm:"+n.range));const{version:i,resolved:o}=A[r];if(!o)continue;let s;for(const[e,t]of U){const r=o.match(e);if(r){s=t(i,...r);break}}if(!s){t.reportWarning(T.b.YARN_IMPORT_FAILED,`${P.prettyDescriptor(e.configuration,n)}: Only some patterns can be imported from legacy lockfiles (not "${o}")`);continue}const c=P.makeLocator(n,s);a.set(n.descriptorHash,c)}}supportsDescriptor(e,t){return!!this.resolutions&&this.resolutions.has(e.descriptorHash)}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");const n=this.resolutions.get(e.descriptorHash);if(!n)throw new Error("Assertion failed: The resolution should have been registered");return[n]}async resolve(e,t){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}}class O{supportsDescriptor(e,t){return!!t.project.storedResolutions.get(e.descriptorHash)||!!t.project.originalPackages.has(P.convertDescriptorToLocator(e).locatorHash)}supportsLocator(e,t){return!!t.project.originalPackages.has(e.locatorHash)}shouldPersistResolution(e,t){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){let n=r.project.originalPackages.get(P.convertDescriptorToLocator(e).locatorHash);if(n)return[n];const i=r.project.storedResolutions.get(e.descriptorHash);if(!i)throw new Error("Expected the resolution to have been successful - resolution not found");if(n=r.project.originalPackages.get(i),!n)throw new Error("Expected the resolution to have been successful - package not found");return[n]}async resolve(e,t){const r=t.project.originalPackages.get(e.locatorHash);if(!r)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return r}}var j=r(46611),Y=r(27092),G=r(35691);class J{constructor(e){this.resolver=e}supportsDescriptor(e,t){return this.resolver.supportsDescriptor(e,t)}supportsLocator(e,t){return this.resolver.supportsLocator(e,t)}shouldPersistResolution(e,t){return this.resolver.shouldPersistResolution(e,t)}bindDescriptor(e,t,r){return this.resolver.bindDescriptor(e,t,r)}getResolutionDependencies(e,t){return this.resolver.getResolutionDependencies(e,t)}async getCandidates(e,t,r){throw new G.lk(T.b.MISSING_LOCKFILE_ENTRY,"This package doesn't seem to be present in your lockfile; try to make an install to update your resolutions")}async resolve(e,t){throw new G.lk(T.b.MISSING_LOCKFILE_ENTRY,"This package doesn't seem to be present in your lockfile; try to make an install to update your resolutions")}}var H=r(33720),q=r(17722),z=r(81111),W=r(20624),V=r(73632),X=r(63088),Z=r(36545),$=r(32485);const ee=/ *, */g,te=(0,x.promisify)(R().gzip),re=(0,x.promisify)(R().gunzip);class ne{constructor(e,{configuration:t}){this.resolutionAliases=new Map,this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map,this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.storedChecksums=new Map,this.accessibleLocators=new Set,this.originalPackages=new Map,this.optionalBuilds=new Set,this.lockFileChecksum=null,this.configuration=t,this.cwd=e}static async find(e,t){if(!e.projectCwd)throw new A.UsageError("No project found in "+t);let r=e.projectCwd,o=t,s=null;for(;s!==e.projectCwd;){if(s=o,n.xfs.existsSync(i.y1.join(s,(0,i.Zu)("package.json")))){r=s;break}o=i.y1.dirname(s)}const a=new ne(e.projectCwd,{configuration:e});await a.setupResolutions(),await a.setupWorkspaces();const c=a.tryWorkspaceByCwd(r);if(c)return{project:a,workspace:c,locator:c.anchoredLocator};const u=await a.findLocatorForLocation(r+"/");if(u)return{project:a,locator:u,workspace:null};throw new A.UsageError(`The nearest package directory (${r}) doesn't seem to be part of the project declared at ${a.cwd}. If the project directory is right, it might be that you forgot to list a workspace. If it isn't, it's likely because you have a yarn.lock file at the detected location, confusing the project detection.`)}static generateBuildStateFile(e,t){let r="# Warning: This file is automatically generated. Removing it is fine, but will\n# cause all your builds to become invalidated.\n";const n=[...e].map(([e,r])=>{const n=t.get(e);if(void 0===n)throw new Error("Assertion failed: The locator should have been registered");return[P.stringifyLocator(n),n.locatorHash,r]});for(const[e,t,i]of V.sortMap(n,[e=>e[0],e=>e[1]]))r+="\n",r+=`# ${e}\n`,r+=JSON.stringify(t)+":\n",r+=` ${i}\n`;return r}async setupResolutions(){this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;const e=i.y1.join(this.cwd,this.configuration.get("lockfileFilename")),t=this.configuration.get("defaultLanguageName");if(n.xfs.existsSync(e)){const r=await n.xfs.readFilePromise(e,"utf8");this.lockFileChecksum=W.makeHash("1",r);const i=(0,s.parseSyml)(r);if(i.__metadata){const e=i.__metadata.version,r=i.__metadata.cacheKey;for(const n of Object.keys(i)){if("__metadata"===n)continue;const o=i[n];if(void 0===o.resolution)throw new Error(`Assertion failed: Expected the lockfile entry to have a resolution field (${n})`);const s=P.parseLocator(o.resolution,!0),A=new j.G;A.load(o);const a=A.version,c=A.languageName||t,u=o.linkType.toUpperCase(),l=A.dependencies,h=A.peerDependencies,g=A.dependenciesMeta,f=A.peerDependenciesMeta,p=A.bin;if(null!=o.checksum){const e=void 0===r||o.checksum.includes("/")?o.checksum:`${r}/${o.checksum}`;this.storedChecksums.set(s.locatorHash,e)}if(e>=4){const e={...s,version:a,languageName:c,linkType:u,dependencies:l,peerDependencies:h,dependenciesMeta:g,peerDependenciesMeta:f,bin:p};this.originalPackages.set(e.locatorHash,e)}for(const t of n.split(ee)){const r=P.parseDescriptor(t);if(this.storedDescriptors.set(r.descriptorHash,r),e>=4)this.storedResolutions.set(r.descriptorHash,s.locatorHash);else{const e=P.convertLocatorToDescriptor(s);e.descriptorHash!==r.descriptorHash&&(this.storedDescriptors.set(e.descriptorHash,e),this.resolutionAliases.set(r.descriptorHash,e.descriptorHash))}}}}}}async setupWorkspaces(){this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map;let e=[this.cwd];for(;e.length>0;){const t=e;e=[];for(const r of t){if(this.workspacesByCwd.has(r))continue;const t=await this.addWorkspace(r),n=this.storedPackages.get(t.anchoredLocator.locatorHash);n&&(t.dependencies=n.dependencies);for(const r of t.workspacesCwds)e.push(r)}}}async addWorkspace(e){const t=new q.j(e,{project:this});await t.setup();const r=this.workspacesByIdent.get(t.locator.identHash);if(void 0!==r)throw new Error(`Duplicate workspace name ${P.prettyIdent(this.configuration,t.locator)}: ${e} conflicts with ${r.cwd}`);return this.workspaces.push(t),this.workspacesByCwd.set(e,t),this.workspacesByIdent.set(t.locator.identHash,t),t}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){i.y1.isAbsolute(e)||(e=i.y1.resolve(this.cwd,e));const t=this.workspacesByCwd.get(e);return t||null}getWorkspaceByCwd(e){const t=this.tryWorkspaceByCwd(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByFilePath(e){let t=null;for(const r of this.workspaces){i.y1.relative(r.cwd,e).startsWith("../")||(t&&t.cwd.length>=r.cwd.length||(t=r))}return t||null}getWorkspaceByFilePath(e){const t=this.tryWorkspaceByFilePath(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByIdent(e){const t=this.workspacesByIdent.get(e.identHash);return void 0===t?null:t}getWorkspaceByIdent(e){const t=this.tryWorkspaceByIdent(e);if(!t)throw new Error(`Workspace not found (${P.prettyIdent(this.configuration,e)})`);return t}tryWorkspaceByDescriptor(e){const t=this.tryWorkspaceByIdent(e);return null!==t&&t.accepts(e.range)?t:null}getWorkspaceByDescriptor(e){const t=this.tryWorkspaceByDescriptor(e);if(null===t)throw new Error(`Workspace not found (${P.prettyDescriptor(this.configuration,e)})`);return t}tryWorkspaceByLocator(e){P.isVirtualLocator(e)&&(e=P.devirtualizeLocator(e));const t=this.tryWorkspaceByIdent(e);return null===t||t.locator.locatorHash!==e.locatorHash&&t.anchoredLocator.locatorHash!==e.locatorHash?null:t}getWorkspaceByLocator(e){const t=this.tryWorkspaceByLocator(e);if(!t)throw new Error(`Workspace not found (${P.prettyLocator(this.configuration,e)})`);return t}refreshWorkspaceDependencies(){for(const e of this.workspaces){const t=this.storedPackages.get(e.anchoredLocator.locatorHash);if(!t)throw new Error("Assertion failed: Expected workspace to have been resolved");e.dependencies=new Map(t.dependencies)}}forgetResolution(e){for(const[t,r]of this.storedResolutions){const n="descriptorHash"in e&&e.descriptorHash===t,i="locatorHash"in e&&e.locatorHash===r;(n||i)&&(this.storedDescriptors.delete(t),this.storedResolutions.delete(t),this.originalPackages.delete(r))}}forgetTransientResolutions(){const e=this.configuration.makeResolver();for(const t of this.originalPackages.values()){let r;try{r=e.shouldPersistResolution(t,{project:this,resolver:e})}catch(e){r=!1}r||this.forgetResolution(t)}}forgetVirtualResolutions(){for(const e of this.storedPackages.values())for(const[t,r]of e.dependencies)P.isVirtualDescriptor(r)&&e.dependencies.set(t,P.devirtualizeDescriptor(r))}getDependencyMeta(e,t){const r={},n=this.topLevelWorkspace.manifest.dependenciesMeta.get(P.stringifyIdent(e));if(!n)return r;const i=n.get(null);if(i&&Object.assign(r,i),null===t||!k().valid(t))return r;for(const[e,i]of n)null!==e&&e===t&&Object.assign(r,i);return r}async findLocatorForLocation(e){const t=new H.$,r=this.configuration.getLinkers(),n={project:this,report:t};for(const t of r){const r=await t.findPackageLocator(e,n);if(r)return r}return null}async validateEverything(e){for(const t of e.validationWarnings)e.report.reportWarning(t.name,t.text);for(const t of e.validationErrors)e.report.reportError(t.name,t.text)}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions(),e.lockfileOnly||this.forgetTransientResolutions();const t=e.resolver||this.configuration.makeResolver(),r=new _;await r.setup(this,{report:e.report});const o=e.lockfileOnly?new Y.B([new O,new J(t)]):new Y.B([new O,r,t]),s=this.configuration.makeFetcher(),A=e.lockfileOnly?{project:this,report:e.report,resolver:o}:{project:this,report:e.report,resolver:o,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:s}},a=new Map,c=new Map,u=new Map,l=new Map,h=new Map,g=new Set;let f=new Set;for(const e of this.workspaces){const t=e.anchoredDescriptor;a.set(t.descriptorHash,t),f.add(t.descriptorHash)}const p=b()(10);for(;0!==f.size;){const e=f;f=new Set;for(const t of e)u.has(t)&&e.delete(t);if(0===e.size)break;const t=new Set,r=new Map;for(const n of e){const i=a.get(n);if(!i)throw new Error("Assertion failed: The descriptor should have been registered");let s=h.get(n);if(void 0===s){h.set(n,s=new Set);for(const e of o.getResolutionDependencies(i,A))a.set(e.descriptorHash,e),s.add(e.descriptorHash)}const l=V.getMapWithDefault(r,n);for(const r of s){const i=u.get(r);if(void 0!==i){const e=c.get(i);if(void 0===e)throw new Error("Assertion failed: The package should have been registered");l.set(r,e)}else t.add(n),e.add(r)}}for(const r of t)e.delete(r),f.add(r);if(0===e.size)throw new Error("Assertion failed: Descriptors should not have cyclic dependencies");const n=new Map(await Promise.all(Array.from(e).map(e=>p(async()=>{const t=a.get(e);if(void 0===t)throw new Error("Assertion failed: The descriptor should have been registered");const n=r.get(t.descriptorHash);if(void 0===n)throw new Error("Assertion failed: The descriptor dependencies should have been registered");let i;try{i=await o.getCandidates(t,n,A)}catch(e){throw e.message=`${P.prettyDescriptor(this.configuration,t)}: ${e.message}`,e}if(0===i.length)throw new Error("No candidate found for "+P.prettyDescriptor(this.configuration,t));return[t.descriptorHash,i]})))),i=new Map;for(const[e,t]of n)1===t.length&&(i.set(e,t[0]),n.delete(e));for(const[e,t]of n){const r=t.find(e=>c.has(e.locatorHash));r&&(i.set(e,r),n.delete(e))}if(n.size>0){const e=new(v().Solver);for(const t of n.values())e.require(v().or(...t.map(e=>e.locatorHash)));let t,r=100,o=null,s=1/0;for(;r>0&&null!==(t=e.solve());){const n=t.getTrueVars();e.forbid(t.getFormula()),n.lengthA.has(e.locatorHash));if(!r)throw new Error("Assertion failed: The descriptor should have been solved during the previous step");i.set(e,r),n.delete(e)}}const s=Array.from(i.values()).filter(e=>!c.has(e.locatorHash)),d=new Map(await Promise.all(s.map(async e=>{const t=await V.prettifyAsyncErrors(async()=>await o.resolve(e,A),t=>`${P.prettyLocator(this.configuration,e)}: ${t}`);if(!P.areLocatorsEqual(e,t))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${P.prettyLocator(this.configuration,e)} to ${P.prettyLocator(this.configuration,t)})`);const r=this.configuration.normalizePackage(t);for(const[t,n]of r.dependencies){const i=await this.configuration.reduceHook(e=>e.reduceDependency,n,this,r,n,{resolver:o,resolveOptions:A});if(!P.areIdentsEqual(n,i))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");const s=o.bindDescriptor(i,e,A);r.dependencies.set(t,s)}return[r.locatorHash,{original:t,pkg:r}]})));for(const t of e){const e=i.get(t);if(!e)throw new Error("Assertion failed: The locator should have been registered");u.set(t,e.locatorHash);const r=d.get(e.locatorHash);if(void 0===r)continue;const{original:n,pkg:o}=r;l.set(n.locatorHash,n),c.set(o.locatorHash,o);for(const e of o.dependencies.values()){a.set(e.descriptorHash,e),f.add(e.descriptorHash);const t=this.resolutionAliases.get(e.descriptorHash);if(void 0===t)continue;if(e.descriptorHash===t)continue;const r=this.storedDescriptors.get(t);if(!r)throw new Error("Assertion failed: The alias should have been registered");u.has(e.descriptorHash)||(u.set(e.descriptorHash,"temporary"),f.delete(e.descriptorHash),f.add(t),a.set(t,r),g.add(e.descriptorHash))}}}for(;g.size>0;){let e=!1;for(const t of g){if(!a.get(t))throw new Error("Assertion failed: The descriptor should have been registered");const r=this.resolutionAliases.get(t);if(void 0===r)throw new Error("Assertion failed: The descriptor should have an alias");const n=u.get(r);if(void 0===n)throw new Error("Assertion failed: The resolution should have been registered");"temporary"!==n&&(g.delete(t),u.set(t,n),e=!0)}if(!e)throw new Error("Alias loop detected")}const d=new Set(this.resolutionAliases.values()),C=new Set(c.keys()),E=new Set;!function({project:e,allDescriptors:t,allResolutions:r,allPackages:o,accessibleLocators:s=new Set,optionalBuilds:A=new Set,volatileDescriptors:a=new Set,report:c,tolerateMissingPackages:u=!1}){const l=new Map,h=[],g=new Map,f=new Map,p=new Map(e.workspaces.map(e=>{const t=e.anchoredLocator.locatorHash,r=o.get(t);if(void 0===r){if(u)return[t,null];throw new Error("Assertion failed: The workspace should have an associated package")}return[t,P.copyPackage(r)]})),d=()=>{const e=n.xfs.mktempSync(),t=i.y1.join(e,"stacktrace.log"),r=String(h.length+1).length,o=h.map((e,t)=>`${(t+1+".").padStart(r," ")} ${P.stringifyLocator(e)}\n`).join("");throw n.xfs.writeFileSync(t,o),new G.lk(T.b.STACK_OVERFLOW_RESOLUTION,"Encountered a stack overflow when resolving peer dependencies; cf "+t)},C=e=>{const t=r.get(e.descriptorHash);if(void 0===t)throw new Error("Assertion failed: The resolution should have been registered");const n=o.get(t);if(!n)throw new Error("Assertion failed: The package could not be found");return n},E=(e,t,r)=>{h.length>1e3&&d(),h.push(e);const n=I(e,t,r);return h.pop(),n},I=(n,i,h)=>{if(s.has(n.locatorHash))return;s.add(n.locatorHash),h||A.delete(n.locatorHash);const I=o.get(n.locatorHash);if(!I){if(u)return;throw new Error(`Assertion failed: The package (${P.prettyLocator(e.configuration,n)}) should have been registered`)}const m=[],y=[],w=[],B=[],Q=[];for(const s of Array.from(I.dependencies.values())){if(I.peerDependencies.has(s.identHash)&&!i)continue;if(P.isVirtualDescriptor(s))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");a.delete(s.descriptorHash);let A=h;if(!A){const e=I.dependenciesMeta.get(P.stringifyIdent(s));if(void 0!==e){const t=e.get(null);void 0!==t&&t.optional&&(A=!0)}}const g=r.get(s.descriptorHash);if(!g){if(u)continue;throw new Error(`Assertion failed: The resolution (${P.prettyDescriptor(e.configuration,s)}) should have been registered`)}const v=p.get(g)||o.get(g);if(!v)throw new Error(`Assertion failed: The package (${g}, resolved from ${P.prettyDescriptor(e.configuration,s)}) should have been registered`);if(0===v.peerDependencies.size){E(v,!1,A);continue}const D=l.get(v.locatorHash);let b,S;"number"==typeof D&&D>=2&&d();const k=new Set;y.push(()=>{b=P.virtualizeDescriptor(s,n.locatorHash),S=P.virtualizePackage(v,n.locatorHash),I.dependencies.delete(s.identHash),I.dependencies.set(b.identHash,b),r.set(b.descriptorHash,S.locatorHash),t.set(b.descriptorHash,b),o.set(S.locatorHash,S),m.push([v,b,S])}),w.push(()=>{for(const i of S.peerDependencies.values()){let o=I.dependencies.get(i.identHash);if(!o&&P.areIdentsEqual(n,i)&&(o=P.convertLocatorToDescriptor(n),t.set(o.descriptorHash,o),r.set(o.descriptorHash,n.locatorHash),a.delete(o.descriptorHash)),o||!S.dependencies.has(i.identHash)){if(!o){if(!I.peerDependencies.has(i.identHash)){const t=S.peerDependenciesMeta.get(P.stringifyIdent(i));null===c||t&&t.optional||c.reportWarning(T.b.MISSING_PEER_DEPENDENCY,`${P.prettyLocator(e.configuration,n)} doesn't provide ${P.prettyDescriptor(e.configuration,i)} requested by ${P.prettyLocator(e.configuration,v)}`)}o=P.makeDescriptor(i,"missing:")}if(S.dependencies.set(o.identHash,o),P.isVirtualDescriptor(o)){V.getSetWithDefault(f,o.descriptorHash).add(S.locatorHash)}if("missing:"===o.range)k.add(o.identHash);else if(null!==c){const t=C(o);Z.satisfiesWithPrereleases(t.version,i.range)||c.reportWarning(T.b.INCOMPATIBLE_PEER_DEPENDENCY,`${P.prettyLocator(e.configuration,n)} provides ${P.prettyLocator(e.configuration,t)} with version ${t.version} which doesn't satisfy ${P.prettyRange(e.configuration,i.range)} requested by ${P.prettyLocator(e.configuration,v)}`)}}else S.peerDependencies.delete(i.identHash)}S.dependencies=new Map(V.sortMap(S.dependencies,([e,t])=>P.stringifyIdent(t)))}),B.push(()=>{if(!o.has(S.locatorHash))return;const e=l.get(v.locatorHash),t=void 0!==e?e+1:1;l.set(v.locatorHash,t),E(S,!1,A),l.set(v.locatorHash,t-1)}),Q.push(()=>{if(o.has(S.locatorHash))for(const e of k)S.dependencies.delete(e)})}for(const e of[...y,...w])e();let v;do{v=!0;for(const[n,i,A]of m){if(!o.has(A.locatorHash))continue;const a=V.getMapWithDefault(g,n.locatorHash),c=W.makeHash(...[...A.dependencies.values()].map(t=>{const n="missing:"!==t.range?r.get(t.descriptorHash):"missing:";if(void 0===n)throw new Error(`Assertion failed: Expected the resolution for ${P.prettyDescriptor(e.configuration,t)} to have been registered`);return n})),u=a.get(c);if(void 0===u){a.set(c,i);continue}if(u===i)continue;v=!1,o.delete(A.locatorHash),t.delete(i.descriptorHash),r.delete(i.descriptorHash),s.delete(A.locatorHash);const l=f.get(i.descriptorHash)||[],h=[I.locatorHash,...l];for(const e of h){const t=o.get(e);void 0!==t&&t.dependencies.set(i.identHash,u)}}}while(!v);for(const e of[...B,...Q])e()};for(const t of e.workspaces)a.delete(t.anchoredDescriptor.descriptorHash),E(t.anchoredLocator,!0,!1)}({project:this,report:e.report,accessibleLocators:E,volatileDescriptors:d,optionalBuilds:C,allDescriptors:a,allResolutions:u,allPackages:c});for(const e of d)a.delete(e),u.delete(e);this.storedResolutions=u,this.storedDescriptors=a,this.storedPackages=c,this.accessibleLocators=E,this.originalPackages=l,this.optionalBuilds=C,this.refreshWorkspaceDependencies()}async fetchEverything({cache:e,report:t,fetcher:r}){const n=r||this.configuration.makeFetcher(),i={checksums:this.storedChecksums,project:this,cache:e,fetcher:n,report:t},o=V.sortMap(this.storedResolutions.values(),[e=>{const t=this.storedPackages.get(e);if(!t)throw new Error("Assertion failed: The locator should have been registered");return P.stringifyLocator(t)}]);let s=!1;const A=G.yG.progressViaCounter(o.length);t.reportProgress(A);const a=b()(32);if(await t.startCacheReport(async()=>{await Promise.all(o.map(e=>a(async()=>{const r=this.storedPackages.get(e);if(!r)throw new Error("Assertion failed: The locator should have been registered");if(P.isVirtualLocator(r))return;let o;try{o=await n.fetch(r,i)}catch(e){return e.message=`${P.prettyLocator(this.configuration,r)}: ${e.message}`,t.reportExceptionOnce(e),void(s=e)}o.checksum?this.storedChecksums.set(r.locatorHash,o.checksum):this.storedChecksums.delete(r.locatorHash),o.releaseFs&&o.releaseFs()}).finally(()=>{A.tick()})))}),s)throw s}async linkEverything({cache:e,report:t,fetcher:r}){const o=r||this.configuration.makeFetcher(),A={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:t,skipIntegrityCheck:!0},c=this.configuration.getLinkers(),u={project:this,report:t},l=new Map(c.map(e=>[e,e.makeInstaller(u)])),h=new Map,g=new Map,f=new Map;for(const e of this.accessibleLocators){const t=this.storedPackages.get(e);if(!t)throw new Error("Assertion failed: The locator should have been registered");const r=await o.fetch(t,A);if(null!==this.tryWorkspaceByLocator(t)){const e=[],{scripts:n}=await j.G.find(r.prefixPath,{baseFs:r.packageFs});for(const t of["preinstall","install","postinstall"])n.has(t)&&e.push([L.k.SCRIPT,t]);try{for(const e of l.values())await e.installPackage(t,r)}finally{r.releaseFs&&r.releaseFs()}const o=i.y1.join(r.packageFs.getRealPath(),r.prefixPath);g.set(t.locatorHash,o),e.length>0&&f.set(t.locatorHash,{directives:e,buildLocations:[o]})}else{const e=c.find(e=>e.supportsPackage(t,u));if(!e)throw new G.lk(T.b.LINKER_NOT_FOUND,P.prettyLocator(this.configuration,t)+" isn't supported by any available linker");const n=l.get(e);if(!n)throw new Error("Assertion failed: The installer should have been registered");let i;try{i=await n.installPackage(t,r)}finally{r.releaseFs&&r.releaseFs()}h.set(t.locatorHash,e),g.set(t.locatorHash,i.packageLocation),i.buildDirective&&i.packageLocation&&f.set(t.locatorHash,{directives:i.buildDirective,buildLocations:[i.packageLocation]})}}const p=new Map;for(const e of this.accessibleLocators){const t=this.storedPackages.get(e);if(!t)throw new Error("Assertion failed: The locator should have been registered");const r=null!==this.tryWorkspaceByLocator(t),n=async(e,n)=>{const i=g.get(t.locatorHash);if(void 0===i)throw new Error(`Assertion failed: The package (${P.prettyLocator(this.configuration,t)}) should have been registered`);const o=[];for(const n of t.dependencies.values()){const s=this.storedResolutions.get(n.descriptorHash);if(void 0===s)throw new Error(`Assertion failed: The resolution (${P.prettyDescriptor(this.configuration,n)}, from ${P.prettyLocator(this.configuration,t)})should have been registered`);const A=this.storedPackages.get(s);if(void 0===A)throw new Error(`Assertion failed: The package (${s}, resolved from ${P.prettyDescriptor(this.configuration,n)}) should have been registered`);const a=null===this.tryWorkspaceByLocator(A)?h.get(s):null;if(void 0===a)throw new Error(`Assertion failed: The package (${s}, resolved from ${P.prettyDescriptor(this.configuration,n)}) should have been registered`);const c=null===a;if(a===e||r||c)null!==g.get(A.locatorHash)&&o.push([n,A]);else if(null!==i){V.getArrayWithDefault(p,s).push(i)}}null!==i&&await n.attachInternalDependencies(t,o)};if(r)for(const[e,t]of l)await n(e,t);else{const e=h.get(t.locatorHash);if(!e)throw new Error("Assertion failed: The linker should have been found");const r=l.get(e);if(!r)throw new Error("Assertion failed: The installer should have been registered");await n(e,r)}}for(const[e,t]of p){const r=this.storedPackages.get(e);if(!r)throw new Error("Assertion failed: The package should have been registered");const n=h.get(r.locatorHash);if(!n)throw new Error("Assertion failed: The linker should have been found");const i=l.get(n);if(!i)throw new Error("Assertion failed: The installer should have been registered");await i.attachExternalDependents(r,t)}for(const e of l.values()){const t=await e.finalizeInstall();if(t)for(const e of t)e.buildDirective&&f.set(e.locatorHash,{directives:e.buildDirective,buildLocations:e.buildLocations})}const d=new Set(this.storedPackages.keys()),C=new Set(f.keys());for(const e of C)d.delete(e);const E=(0,a.createHash)("sha512");E.update(process.versions.node),this.configuration.triggerHook(e=>e.globalHashGeneration,this,e=>{E.update("\0"),E.update(e)});const I=E.digest("hex"),m=new Map,y=e=>{let t=m.get(e.locatorHash);if(void 0!==t)return t;const r=this.storedPackages.get(e.locatorHash);if(void 0===r)throw new Error("Assertion failed: The package should have been registered");const n=(0,a.createHash)("sha512");n.update(e.locatorHash),m.set(e.locatorHash,"");for(const e of r.dependencies.values()){const t=this.storedResolutions.get(e.descriptorHash);if(void 0===t)throw new Error(`Assertion failed: The resolution (${P.prettyDescriptor(this.configuration,e)}) should have been registered`);if(void 0===this.storedPackages.get(t))throw new Error("Assertion failed: The package should have been registered");n.update(y(r))}return t=n.digest("hex"),m.set(e.locatorHash,t),t},w=(e,t)=>{const r=(0,a.createHash)("sha512");r.update(I),r.update(y(e));for(const e of t)r.update(e);return r.digest("hex")},B=this.configuration.get("bstatePath"),Q=n.xfs.existsSync(B)?(0,s.parseSyml)(await n.xfs.readFilePromise(B,"utf8")):{},v=new Map;for(;C.size>0;){const e=C.size,r=[];for(const e of C){const o=this.storedPackages.get(e);if(!o)throw new Error("Assertion failed: The package should have been registered");let s=!0;for(const e of o.dependencies.values()){const t=this.storedResolutions.get(e.descriptorHash);if(!t)throw new Error(`Assertion failed: The resolution (${P.prettyDescriptor(this.configuration,e)}) should have been registered`);if(C.has(t)){s=!1;break}}if(!s)continue;C.delete(e);const A=f.get(o.locatorHash);if(!A)throw new Error("Assertion failed: The build directive should have been registered");const a=w(o,A.buildLocations);if(Object.prototype.hasOwnProperty.call(Q,o.locatorHash)&&Q[o.locatorHash]===a)v.set(o.locatorHash,a);else{Object.prototype.hasOwnProperty.call(Q,o.locatorHash)?t.reportInfo(T.b.MUST_REBUILD,P.prettyLocator(this.configuration,o)+" must be rebuilt because its dependency tree changed"):t.reportInfo(T.b.MUST_BUILD,P.prettyLocator(this.configuration,o)+" must be built because it never did before or the last one failed");for(const e of A.buildLocations){if(!i.y1.isAbsolute(e))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${e})`);r.push((async()=>{for(const[r,s]of A.directives){let A=`# This file contains the result of Yarn building a package (${P.stringifyLocator(o)})\n`;switch(r){case L.k.SCRIPT:A+=`# Script name: ${s}\n`;break;case L.k.SHELLCODE:A+=`# Script code: ${s}\n`}const c=null;await n.xfs.mktempPromise(async u=>{const l=i.y1.join(u,"build.log"),{stdout:h,stderr:g}=this.configuration.getSubprocessStreams(l,{header:A,prefix:P.prettyLocator(this.configuration,o),report:t});let f;try{switch(r){case L.k.SCRIPT:f=await X.executePackageScript(o,s,[],{cwd:e,project:this,stdin:c,stdout:h,stderr:g});break;case L.k.SHELLCODE:f=await X.executePackageShellcode(o,s,[],{cwd:e,project:this,stdin:c,stdout:h,stderr:g})}}catch(e){g.write(e.stack),f=1}if(h.end(),g.end(),0===f)return v.set(o.locatorHash,a),!0;n.xfs.detachTemp(u);const p=`${P.prettyLocator(this.configuration,o)} couldn't be built successfully (exit code ${this.configuration.format(String(f),K.a5.NUMBER)}, logs can be found here: ${this.configuration.format(l,K.a5.PATH)})`;return t.reportInfo(T.b.BUILD_FAILED,p),this.optionalBuilds.has(o.locatorHash)?(v.set(o.locatorHash,a),!0):(t.reportError(T.b.BUILD_FAILED,p),!1)})}})())}}}if(await Promise.all(r),e===C.size){const e=Array.from(C).map(e=>{const t=this.storedPackages.get(e);if(!t)throw new Error("Assertion failed: The package should have been registered");return P.prettyLocator(this.configuration,t)}).join(", ");t.reportError(T.b.CYCLIC_DEPENDENCIES,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${e})`);break}}if(v.size>0){const e=this.configuration.get("bstatePath"),t=ne.generateBuildStateFile(v,this.storedPackages);await n.xfs.mkdirpPromise(i.y1.dirname(e)),await n.xfs.changeFilePromise(e,t,{automaticNewlines:!0})}else await n.xfs.removePromise(B)}async install(e){const t=[],r=[];await this.configuration.triggerHook(e=>e.validateProject,this,{reportWarning:(e,r)=>t.push({name:e,text:r}),reportError:(e,t)=>r.push({name:e,text:t})});t.length+r.length>0&&await e.report.startTimerPromise("Validation step",async()=>{await this.validateEverything({validationWarnings:t,validationErrors:r,report:e.report})}),await e.report.startTimerPromise("Resolution step",async()=>{const t=i.y1.join(this.cwd,this.configuration.get("lockfileFilename"));let r=null;if(e.immutable)try{r=await n.xfs.readFilePromise(t,"utf8")}catch(e){throw"ENOENT"===e.code?new G.lk(T.b.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been created by this install, which is explicitly forbidden."):e}if(await this.resolveEverything(e),null!==r){const n=(0,o.qH)(r,this.generateLockfile());if(n!==r){const i=B(t,t,r,n);e.report.reportSeparator();for(const t of i.hunks){e.report.reportInfo(null,`@@ -${t.oldStart},${t.oldLines} +${t.newStart},${t.newLines} @@`);for(const r of t.lines)r.startsWith("+")?e.report.reportError(T.b.FROZEN_LOCKFILE_EXCEPTION,this.configuration.format(r,K.a5.ADDED)):r.startsWith("-")?e.report.reportError(T.b.FROZEN_LOCKFILE_EXCEPTION,this.configuration.format(r,K.a5.REMOVED)):e.report.reportInfo(null,this.configuration.format(r,"grey"))}throw e.report.reportSeparator(),new G.lk(T.b.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}}),await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e),(void 0===e.persistProject||e.persistProject)&&await this.cacheCleanup(e)}),(void 0===e.persistProject||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{await this.linkEverything(e)}),await this.configuration.triggerHook(e=>e.afterAllInstalled,this)}generateLockfile(){const e=new Map;for(const[t,r]of this.storedResolutions.entries()){let n=e.get(r);n||e.set(r,n=new Set),n.add(t)}const t={__metadata:{version:4}};for(const[r,n]of e.entries()){const e=this.originalPackages.get(r);if(!e)continue;const i=[];for(const e of n){const t=this.storedDescriptors.get(e);if(!t)throw new Error("Assertion failed: The descriptor should have been registered");i.push(t)}const o=i.map(e=>P.stringifyDescriptor(e)).sort().join(", "),s=new j.G;let A;s.version=e.linkType===$.U.HARD?e.version:"0.0.0-use.local",s.languageName=e.languageName,s.dependencies=new Map(e.dependencies),s.peerDependencies=new Map(e.peerDependencies),s.dependenciesMeta=new Map(e.dependenciesMeta),s.peerDependenciesMeta=new Map(e.peerDependenciesMeta),s.bin=new Map(e.bin);const a=this.storedChecksums.get(e.locatorHash);if(void 0!==a){const e=a.indexOf("/");if(-1===e)throw new Error("Assertion failed: Expecte the checksum to reference its cache key");const r=a.slice(0,e),n=a.slice(e+1);void 0===t.__metadata.cacheKey&&(t.__metadata.cacheKey=r),A=r===t.__metadata.cacheKey?n:a}t[o]={...s.exportTo({},{compatibilityMode:!1}),linkType:e.linkType.toLowerCase(),resolution:P.stringifyLocator(e),checksum:A}}return['# This file is generated by running "yarn install" inside your project.\n',"# Manual changes might be lost - proceed with caution!\n"].join("")+"\n"+(0,s.stringifySyml)(t)}async persistLockfile(){const e=i.y1.join(this.cwd,this.configuration.get("lockfileFilename")),t=this.generateLockfile();await n.xfs.changeFilePromise(e,t,{automaticNewlines:!0})}async persistInstallStateFile(){const{accessibleLocators:e,optionalBuilds:t,storedDescriptors:r,storedResolutions:o,storedPackages:s,lockFileChecksum:A}=this,a={accessibleLocators:e,optionalBuilds:t,storedDescriptors:r,storedResolutions:o,storedPackages:s,lockFileChecksum:A},c=await te(M().serialize(a)),u=this.configuration.get("installStatePath");await n.xfs.mkdirpPromise(i.y1.dirname(u)),await n.xfs.writeFilePromise(u,c)}async restoreInstallState(){const e=this.configuration.get("installStatePath");if(!n.xfs.existsSync(e))return void await this.applyLightResolution();const t=await n.xfs.readFilePromise(e),r=M().deserialize(await re(t));r.lockFileChecksum===this.lockFileChecksum?(Object.assign(this,r),this.refreshWorkspaceDependencies()):await this.applyLightResolution()}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new H.$}),await this.persistInstallStateFile()}async persist(){await this.persistLockfile(),await this.persistInstallStateFile();for(const e of this.workspacesByCwd.values())await e.persistManifest()}async cacheCleanup({cache:e,report:t}){const r=new Set([".gitignore"]);if(n.xfs.existsSync(e.cwd)&&(0,z.isFolderInside)(e.cwd,this.cwd)){for(const o of await n.xfs.readdirPromise(e.cwd)){if(r.has(o))continue;const s=i.y1.resolve(e.cwd,o);e.markedFiles.has(s)||(e.immutable?t.reportError(T.b.IMMUTABLE_CACHE,this.configuration.format(i.y1.basename(s),"magenta")+" appears to be unused and would marked for deletion, but the cache is immutable"):(t.reportInfo(T.b.UNUSED_CACHE_ENTRY,this.configuration.format(i.y1.basename(s),"magenta")+" appears to be unused - removing"),await n.xfs.unlinkPromise(s)))}e.markedFiles.clear()}}}},52779:(e,t,r)=>{"use strict";r.d(t,{c:()=>s,O:()=>A});var n=r(53887),i=r.n(n),o=r(54143);const s=/^(?!v)[a-z0-9-.]+$/i;class A{supportsDescriptor(e,t){return!!i().validRange(e.range)||!!s.test(e.range)}supportsLocator(e,t){return!!i().validRange(e.reference)||!!s.test(e.reference)}shouldPersistResolution(e,t){return t.resolver.shouldPersistResolution(this.forwardLocator(e,t),t)}bindDescriptor(e,t,r){return r.resolver.bindDescriptor(this.forwardDescriptor(e,r),t,r)}getResolutionDependencies(e,t){return t.resolver.getResolutionDependencies(this.forwardDescriptor(e,t),t)}async getCandidates(e,t,r){return await r.resolver.getCandidates(this.forwardDescriptor(e,r),t,r)}async resolve(e,t){const r=await t.resolver.resolve(this.forwardLocator(e,t),t);return o.renamePackage(r,e)}forwardDescriptor(e,t){return o.makeDescriptor(e,`${t.project.configuration.get("defaultProtocol")}${e.range}`)}forwardLocator(e,t){return o.makeLocator(e,`${t.project.configuration.get("defaultProtocol")}${e.reference}`)}}},35691:(e,t,r)=>{"use strict";r.d(t,{lk:()=>s,yG:()=>A});var n=r(92413),i=r(24304),o=r(92659);class s extends Error{constructor(e,t){super(t),this.reportCode=e}}class A{constructor(){this.reportedInfos=new Set,this.reportedWarnings=new Set,this.reportedErrors=new Set}static progressViaCounter(e){let t,r=0,n=new Promise(e=>{t=e});const i=e=>{const i=t;n=new Promise(e=>{t=e}),r=e,i()},o=async function*(){for(;ro,set:i,tick:(e=0)=>{i(r+1)}}}reportInfoOnce(e,t,r){const n=r&&r.key?r.key:t;this.reportedInfos.has(n)||(this.reportedInfos.add(n),this.reportInfo(e,t))}reportWarningOnce(e,t,r){const n=r&&r.key?r.key:t;this.reportedWarnings.has(n)||(this.reportedWarnings.add(n),this.reportWarning(e,t))}reportErrorOnce(e,t,r){const n=r&&r.key?r.key:t;this.reportedErrors.has(n)||(this.reportedErrors.add(n),this.reportError(e,t))}reportExceptionOnce(e){!function(e){return void 0!==e.reportCode}(e)?this.reportErrorOnce(o.b.EXCEPTION,e.stack||e.message,{key:e}):this.reportErrorOnce(e.reportCode,e.message,{key:e})}createStreamReporter(e=null){const t=new n.PassThrough,r=new i.StringDecoder;let o="";return t.on("data",t=>{let n,i=r.write(t);do{if(n=i.indexOf("\n"),-1!==n){const t=o+i.substr(0,n);i=i.substr(n+1),o="",null!==e?this.reportInfo(null,`${e} ${t}`):this.reportInfo(null,t)}}while(-1!==n);o+=i}),t.on("end",()=>{const t=r.end();""!==t&&(null!==e?this.reportInfo(null,`${e} ${t}`):this.reportInfo(null,t))}),t}}},15815:(e,t,r)=>{"use strict";r.d(t,{P:()=>f});var n=r(29148),i=r.n(n),o=r(92659),s=r(35691);const A=["â ‹","â ™","â ¹","â ¸","â ¼","â ´","â ¦","â §","â ‡","â "],a=new Set([o.b.FETCH_NOT_CACHED,o.b.UNUSED_CACHE_ENTRY]),c=process.env.GITHUB_ACTIONS?{start:e=>`::group::${e}\n`,end:e=>"::endgroup::\n"}:process.env.TRAVIS?{start:e=>`travis_fold:start:${e}\n`,end:e=>`travis_fold:end:${e}\n`}:process.env.GITLAB_CI?{start:e=>`section_start:${Math.floor(Date.now()/1e3)}:${e.toLowerCase().replace(/\W+/g,"_")}\r${e}\n`,end:e=>`section_end:${Math.floor(Date.now()/1e3)}:${e.toLowerCase().replace(/\W+/g,"_")}\r`}:null,u=new Date,l=["iTerm.app","Apple_Terminal"].includes(process.env.TERM_PROGRAM),h={patrick:{date:[17,3],chars:["ðŸ€","🌱"],size:40},simba:{date:[19,7],chars:["🌟","✨"],size:40},jack:{date:[31,10],chars:["🎃","🦇"],size:40},hogsfather:{date:[31,12],chars:["🎉","🎄"],size:40},default:{chars:["=","-"],size:80}},g=l&&Object.keys(h).find(e=>{const t=h[e];return!t.date||t.date[0]===u.getDate()&&t.date[1]===u.getMonth()+1})||"default";class f extends s.yG{constructor({configuration:e,stdout:t,json:r=!1,includeFooter:n=!0,includeLogs:i=!r,includeInfos:o=i,includeWarnings:s=i,forgettableBufferSize:A=5,forgettableNames:c=new Set}){super(),this.cacheHitCount=0,this.cacheMissCount=0,this.warningCount=0,this.errorCount=0,this.startTime=Date.now(),this.indent=0,this.progress=new Map,this.progressTime=0,this.progressFrame=0,this.progressTimeout=null,this.forgettableLines=[],this.configuration=e,this.forgettableBufferSize=A,this.forgettableNames=new Set([...c,...a]),this.includeFooter=n,this.includeInfos=o,this.includeWarnings=s,this.json=r,this.stdout=t}static async start(e,t){const r=new this(e);try{await t(r)}catch(e){r.reportExceptionOnce(e)}finally{await r.finalize()}return r}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){this.cacheHitCount+=1}reportCacheMiss(e,t){this.cacheMissCount+=1,void 0===t||this.configuration.get("preferAggregateCacheInfo")||this.reportInfo(o.b.FETCH_NOT_CACHED,t)}startTimerSync(e,t){this.reportInfo(null,"┌ "+e);const r=Date.now();this.indent+=1;try{return t()}catch(e){throw this.reportExceptionOnce(e),e}finally{const e=Date.now();this.indent-=1,this.configuration.get("enableTimers")&&e-r>200?this.reportInfo(null,"â”” Completed in "+this.formatTiming(e-r)):this.reportInfo(null,"â”” Completed")}}async startTimerPromise(e,t){this.reportInfo(null,"┌ "+e),null!==c&&this.stdout.write(c.start(e));const r=Date.now();this.indent+=1;try{return await t()}catch(e){throw this.reportExceptionOnce(e),e}finally{const t=Date.now();this.indent-=1,null!==c&&this.stdout.write(c.end(e)),this.configuration.get("enableTimers")&&t-r>200?this.reportInfo(null,"â”” Completed in "+this.formatTiming(t-r)):this.reportInfo(null,"â”” Completed")}}async startCacheReport(e){const t=this.configuration.get("preferAggregateCacheInfo")?{cacheHitCount:this.cacheHitCount,cacheMissCount:this.cacheMissCount}:null;try{return await e()}catch(e){throw this.reportExceptionOnce(e),e}finally{null!==t&&this.reportCacheChanges(t)}}reportSeparator(){0===this.indent?this.writeLineWithForgettableReset(""):this.reportInfo(null,"")}reportInfo(e,t){if(!this.includeInfos)return;const r=`${this.configuration.format("➤","blueBright")} ${this.formatNameWithHyperlink(e)}: ${this.formatIndent()}${t}`;if(this.json)this.reportJson({type:"info",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t});else if(this.forgettableNames.has(e))if(this.forgettableLines.push(r),this.forgettableLines.length>this.forgettableBufferSize){for(;this.forgettableLines.length>this.forgettableBufferSize;)this.forgettableLines.shift();this.writeLines(this.forgettableLines,{truncate:!0})}else this.writeLine(r,{truncate:!0});else this.writeLineWithForgettableReset(r)}reportWarning(e,t){this.warningCount+=1,this.includeWarnings&&(this.json?this.reportJson({type:"warning",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t}):this.writeLineWithForgettableReset(`${this.configuration.format("➤","yellowBright")} ${this.formatNameWithHyperlink(e)}: ${this.formatIndent()}${t}`))}reportError(e,t){this.errorCount+=1,this.json?this.reportJson({type:"error",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t}):this.writeLineWithForgettableReset(`${this.configuration.format("➤","redBright")} ${this.formatNameWithHyperlink(e)}: ${this.formatIndent()}${t}`,{truncate:!1})}reportProgress(e){let t=!1;const r=Promise.resolve().then(async()=>{const r={progress:0,title:void 0};this.progress.set(e,r),this.refreshProgress(-1);for await(const{progress:n,title:i}of e)t||r.progress===n&&r.title===i||(r.progress=n,r.title=i,this.refreshProgress());n()}),n=()=>{t||(t=!0,this.progress.delete(e),this.refreshProgress(1))};return{...r,stop:n}}reportJson(e){this.json&&this.writeLineWithForgettableReset(""+JSON.stringify(e))}async finalize(){if(!this.includeFooter)return;let e="";e=this.errorCount>0?"Failed with errors":this.warningCount>0?"Done with warnings":"Done";const t=this.formatTiming(Date.now()-this.startTime),r=this.configuration.get("enableTimers")?`${e} in ${t}`:e;this.errorCount>0?this.reportError(o.b.UNNAMED,r):this.warningCount>0?this.reportWarning(o.b.UNNAMED,r):this.reportInfo(o.b.UNNAMED,r)}writeLine(e,{truncate:t}={}){this.clearProgress({clear:!0}),this.stdout.write(this.truncate(e,{truncate:t})+"\n"),this.writeProgress()}writeLineWithForgettableReset(e,{truncate:t}={}){this.forgettableLines=[],this.writeLine(e,{truncate:t})}writeLines(e,{truncate:t}={}){this.clearProgress({delta:e.length});for(const r of e)this.stdout.write(this.truncate(r,{truncate:t})+"\n");this.writeProgress()}reportCacheChanges({cacheHitCount:e,cacheMissCount:t}){const r=this.cacheHitCount-e,n=this.cacheMissCount-t;if(0===r&&0===n)return;let i="";this.cacheHitCount>1?i+=this.cacheHitCount+" packages were already cached":1===this.cacheHitCount?i+=" - one package was already cached":i+="No packages were cached",this.cacheHitCount>0?this.cacheMissCount>1?i+=`, ${this.cacheMissCount} had to be fetched`:1===this.cacheMissCount&&(i+=", one had to be fetched"):this.cacheMissCount>1?i+=` - ${this.cacheMissCount} packages had to be fetched`:1===this.cacheMissCount&&(i+=" - one package had to be fetched"),this.reportInfo(o.b.FETCH_NOT_CACHED,i)}clearProgress({delta:e=0,clear:t=!1}){this.configuration.get("enableProgressBars")&&!this.json&&this.progress.size+e>0&&(this.stdout.write(`[${this.progress.size+e}A`),(e>0||t)&&this.stdout.write(""))}writeProgress(){if(!this.configuration.get("enableProgressBars")||this.json)return;if(null!==this.progressTimeout&&clearTimeout(this.progressTimeout),this.progressTimeout=null,0===this.progress.size)return;const e=Date.now();e-this.progressTime>80&&(this.progressFrame=(this.progressFrame+1)%A.length,this.progressTime=e);const t=A[this.progressFrame],r=this.configuration.get("progressBarStyle")||g;if(!Object.prototype.hasOwnProperty.call(h,r))throw new Error("Assertion failed: Invalid progress bar style");const n=h[r],i="➤ YN0000: ┌ ".length,o=Math.max(0,Math.min(process.stdout.columns-i,80)),s=Math.floor(n.size*o/80);for(const{progress:e}of this.progress.values()){const r=s*e,i=n.chars[0].repeat(r),o=n.chars[1].repeat(s-r);this.stdout.write(`${this.configuration.format("➤","blueBright")} ${this.formatName(null)}: ${t} ${i}${o}\n`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress()},1e3/60)}refreshProgress(e=0){this.clearProgress({delta:e}),this.writeProgress()}formatTiming(e){return e<6e4?Math.round(e/10)/100+"s":Math.round(e/600)/100+"m"}truncate(e,{truncate:t}={}){return this.configuration.get("enableProgressBars")||(t=!1),void 0===t&&(t=this.configuration.get("preferTruncatedLines")),t&&(e=i()(e,0,process.stdout.columns-1)),e}formatName(e){const t="YN"+(null===e?0:e).toString(10).padStart(4,"0");return this.json||null!==e?t:this.configuration.format(t,"grey")}formatNameWithHyperlink(e){const t=this.formatName(e);if(!this.configuration.get("enableHyperlinks"))return t;if(null===e||e===o.b.UNNAMED)return t;return`]8;;${`https://yarnpkg.com/advanced/error-codes#${t}---${o.b[e]}`.toLowerCase()}${t}]8;;`}formatIndent(){return"│ ".repeat(this.indent)}}},33720:(e,t,r)=>{"use strict";r.d(t,{$:()=>i});var n=r(35691);class i extends n.yG{reportCacheHit(e){}reportCacheMiss(e){}startTimerSync(e,t){return t()}async startTimerPromise(e,t){return await t()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,t){}reportWarning(e,t){}reportError(e,t){}reportProgress(e){return{...Promise.resolve().then(async()=>{for await(const{}of e);}),stop:()=>{}}}reportJson(e){}async finalize(){}}},60895:(e,t,r)=>{"use strict";r.d(t,{N:()=>A});var n=r(17674),i=r(14626),o=r(46009),s=r(54143);class A{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,t){const r=e.reference.indexOf("#");if(-1===r)throw new Error("Invalid virtual package reference");const n=e.reference.slice(r+1),i=s.makeLocator(e,n);return t.fetcher.getLocalPath(i,t)}async fetch(e,t){const r=e.reference.indexOf("#");if(-1===r)throw new Error("Invalid virtual package reference");const n=e.reference.slice(r+1),i=s.makeLocator(e,n),o=await t.fetcher.fetch(i,t);return await this.ensureVirtualLink(e,o,t)}getLocatorFilename(e){return s.slugifyLocator(e)}async ensureVirtualLink(e,t,r){const s=t.packageFs.getRealPath(),A=r.project.configuration.get("virtualFolder"),a=this.getLocatorFilename(e),c=n.p.makeVirtualPath(A,a,s),u=new i.K(c,{baseFs:t.packageFs,pathUtils:o.y1});return{...t,packageFs:u}}}},17722:(e,t,r)=>{"use strict";r.d(t,{j:()=>g});var n=r(56537),i=r(46009),o=r(18710),s=r.n(o),A=r(53887),a=r.n(A),c=r(46611),u=r(94538),l=r(20624),h=r(54143);class g{constructor(e,{project:t}){this.workspacesCwds=new Set,this.dependencies=new Map,this.project=t,this.cwd=e}async setup(){this.manifest=n.xfs.existsSync(i.y1.join(this.cwd,c.G.fileName))?await c.G.find(this.cwd):new c.G,this.relativeCwd=i.y1.relative(this.project.cwd,this.cwd)||i.LZ.dot;const e=this.manifest.name?this.manifest.name:h.makeIdent(null,`${this.computeCandidateName()}-${l.makeHash(this.relativeCwd).substr(0,6)}`),t=this.manifest.version?this.manifest.version:"0.0.0";this.locator=h.makeLocator(e,t),this.anchoredDescriptor=h.makeDescriptor(this.locator,`${u.d.protocol}${this.relativeCwd}`),this.anchoredLocator=h.makeLocator(this.locator,`${u.d.protocol}${this.relativeCwd}`);for(const e of this.manifest.workspaceDefinitions){const t=await s()(e.pattern,{absolute:!0,cwd:i.cS.fromPortablePath(this.cwd),expandDirectories:!1,onlyDirectories:!0,onlyFiles:!1,ignore:["**/node_modules","**/.git","**/.yarn"]});t.sort();for(const e of t){const t=i.y1.resolve(this.cwd,i.cS.toPortablePath(e));n.xfs.existsSync(i.y1.join(t,(0,i.Zu)("package.json")))&&this.workspacesCwds.add(t)}}}accepts(e){const t=e.indexOf(":"),r=-1!==t?e.slice(0,t+1):null,n=-1!==t?e.slice(t+1):e;return r===u.d.protocol&&n===this.relativeCwd||(r===u.d.protocol&&"*"===n||!!a().validRange(n)&&(r===u.d.protocol?a().satisfies(null!==this.manifest.version?this.manifest.version:"0.0.0",n):!!this.project.configuration.get("enableTransparentWorkspaces")&&(null!==this.manifest.version&&a().satisfies(this.manifest.version,n))))}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":""+i.y1.basename(this.cwd)||"unnamed-workspace"}async persistManifest(){const e={};this.manifest.exportTo(e);const t=i.y1.join(this.cwd,c.G.fileName),r=JSON.stringify(e,null,this.manifest.indent)+"\n";await n.xfs.changeFilePromise(t,r,{automaticNewlines:!0})}}},94538:(e,t,r)=>{"use strict";r.d(t,{d:()=>i});var n=r(32485);class i{supportsDescriptor(e,t){if(e.range.startsWith(i.protocol))return!0;return null!==t.project.tryWorkspaceByDescriptor(e)}supportsLocator(e,t){return!!e.reference.startsWith(i.protocol)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,r){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,r){return[r.project.getWorkspaceByDescriptor(e).anchoredLocator]}async resolve(e,t){const r=t.project.getWorkspaceByCwd(e.reference.slice(i.protocol.length));return{...e,version:r.manifest.version||"0.0.0",languageName:"unknown",linkType:n.U.SOFT,dependencies:new Map([...r.manifest.dependencies,...r.manifest.devDependencies]),peerDependencies:new Map([...r.manifest.peerDependencies]),dependenciesMeta:r.manifest.dependenciesMeta,peerDependenciesMeta:r.manifest.peerDependenciesMeta,bin:r.manifest.bin}}}i.protocol="workspace:"},59355:(e,t,r)=>{"use strict";r.d(t,{o:()=>n});const n="2.1.1"},6220:(e,t,r)=>{"use strict";r.r(t),r.d(t,{EndStrategy:()=>n,pipevp:()=>u,execvp:()=>l});var n,i=r(46009),o=r(67566),s=r.n(o);function A(e){return null!==e&&"number"==typeof e.fd}function a(){}!function(e){e[e.Never=0]="Never",e[e.ErrorCode=1]="ErrorCode",e[e.Always=2]="Always"}(n||(n={}));let c=0;async function u(e,t,{cwd:r,env:o=process.env,strict:u=!1,stdin:l=null,stdout:h,stderr:g,end:f=n.Always}){const p=["pipe","pipe","pipe"];null===l?p[0]="ignore":A(l)&&(p[0]=l),A(h)&&(p[1]=h),A(g)&&(p[2]=g),0==c++&&process.on("SIGINT",a);const d=s()(e,t,{cwd:i.cS.fromPortablePath(r),env:{...o,PWD:i.cS.fromPortablePath(r)},stdio:p});A(l)||null===l||l.pipe(d.stdin),A(h)||d.stdout.pipe(h,{end:!1}),A(g)||d.stderr.pipe(g,{end:!1});const C=()=>{for(const e of new Set([h,g]))A(e)||e.end()};return new Promise((t,r)=>{d.on("error",e=>{0==--c&&process.off("SIGINT",a),f!==n.Always&&f!==n.ErrorCode||C(),r(e)}),d.on("close",(i,o)=>{0==--c&&process.off("SIGINT",a),(f===n.Always||f===n.ErrorCode&&i>0)&&C(),0!==i&&u?r(null!==i?new Error(`Child "${e}" exited with exit code ${i}`):new Error(`Child "${e}" exited with signal ${o}`)):t({code:i})})})}async function l(e,t,{cwd:r,env:n=process.env,encoding:o="utf8",strict:A=!1}){const a=["ignore","pipe","pipe"],c=[],u=[],l=i.cS.fromPortablePath(r);void 0!==n.PWD&&(n={...n,PWD:l});const h=s()(e,t,{cwd:l,env:n,stdio:a});return h.stdout.on("data",e=>{c.push(e)}),h.stderr.on("data",e=>{u.push(e)}),await new Promise((t,r)=>{h.on("close",n=>{const i="buffer"===o?Buffer.concat(c):Buffer.concat(c).toString(o),s="buffer"===o?Buffer.concat(u):Buffer.concat(u).toString(o);0!==n&&A?r(Object.assign(new Error(`Child "${e}" exited with exit code ${n}\n\n${s}`),{code:n,stdout:i,stderr:s})):t({code:n,stdout:i,stderr:s})})})}},81111:(e,t,r)=>{"use strict";r.r(t),r.d(t,{getDefaultGlobalFolder:()=>o,getHomeFolder:()=>s,isFolderInside:()=>A});var n=r(46009),i=r(12087);function o(){if("win32"===process.platform){const e=n.cS.toPortablePath(process.env.LOCALAPPDATA||n.cS.join((0,i.homedir)(),"AppData","Local"));return n.y1.resolve(e,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){const e=n.cS.toPortablePath(process.env.XDG_DATA_HOME);return n.y1.resolve(e,"yarn/berry")}return n.y1.resolve(s(),".yarn/berry")}function s(){return n.cS.toPortablePath((0,i.homedir)()||"/usr/local/share")}function A(e,t){const r=n.y1.relative(t,e);return r&&!r.startsWith("..")&&!n.y1.isAbsolute(r)}},20624:(e,t,r)=>{"use strict";r.r(t),r.d(t,{makeHash:()=>o,checksumFile:()=>s});var n=r(78420),i=r(76417);function o(...e){const t=(0,i.createHash)("sha512");for(const r of e)t.update(r||"");return t.digest("hex")}function s(e){return new Promise((t,r)=>{const o=new n.S,s=(0,i.createHash)("sha512"),A=o.createReadStream(e,{});A.on("data",e=>{s.update(e)}),A.on("error",e=>{r(e)}),A.on("end",()=>{t(s.digest("hex"))})})}},84132:(e,t,r)=>{"use strict";r.r(t),r.d(t,{Cache:()=>O.C,DEFAULT_RC_FILENAME:()=>j.tr,DEFAULT_LOCK_FILENAME:()=>j.nh,Configuration:()=>j.VK,FormatType:()=>j.a5,ProjectLookup:()=>j.EW,SettingsType:()=>j.a2,BuildType:()=>Y.k,LightReport:()=>G.h,Manifest:()=>J.G,MessageName:()=>H.b,Project:()=>q.I,TAG_REGEXP:()=>z.c,ReportError:()=>W.lk,Report:()=>W.yG,StreamReport:()=>V.P,ThrowReport:()=>X.$,VirtualFetcher:()=>Z.N,WorkspaceResolver:()=>$.d,Workspace:()=>ee.j,YarnVersion:()=>te.o,LinkType:()=>re.U,hashUtils:()=>A,httpUtils:()=>n,execUtils:()=>o,folderUtils:()=>s,miscUtils:()=>S,scriptUtils:()=>k,semverUtils:()=>x,structUtils:()=>F,tgzUtils:()=>i});var n={};r.r(n),r.d(n,{Method:()=>Q,get:()=>D,put:()=>b,request:()=>v});var i={};r.r(i),r.d(i,{convertToZip:()=>U,extractArchiveTo:()=>_,makeArchiveFromDirectory:()=>P});var o=r(6220),s=r(81111),A=r(20624),a=r(22395),c=r.n(a),u=r(57211),l=r(98605),h=r(2401),g=r.n(h),f=r(61578),p=r.n(f),d=r(98161),C=r.n(d),E=r(78835);const I=p()(8),m=new Map,y=new l.Agent({keepAlive:!0}),w=new u.Agent({keepAlive:!0});function B(e){const t=new E.URL(e),r={host:t.hostname,headers:{}};return t.port&&(r.port=Number(t.port)),{proxy:r}}var Q;async function v(e,t,{configuration:r,headers:n,json:i,method:o=Q.GET}){if(!r.get("enableNetwork"))throw new Error(`Network access have been disabled by configuration (${o} ${e})`);const s=new E.URL(e);if("http:"===s.protocol&&!g().isMatch(s.hostname,r.get("unsafeHttpWhitelist")))throw new Error(`Unsafe http requests must be explicitly whitelisted in your configuration (${s.hostname})`);const A=r.get("httpProxy"),a=r.get("httpsProxy"),u={agent:{http:A?C().httpOverHttp(B(A)):y,https:a?C().httpsOverHttp(B(a)):w},headers:n,method:o};u.responseType=i?"json":"buffer",null!==t&&("string"==typeof t||Buffer.isBuffer(t)?u.body=t:u.json=t);const l=r.get("httpTimeout"),h=r.get("httpRetry"),f=c().extend({timeout:l,retry:h,...u});return I(()=>f(e))}async function D(e,{configuration:t,json:r,...n}){let i=m.get(e);return i||(i=v(e,null,{configuration:t,...n}).then(t=>(m.set(e,t.body),t.body)),m.set(e,i)),!1===Buffer.isBuffer(i)&&(i=await i),r?JSON.parse(i.toString()):i}async function b(e,t,r){return(await v(e,t,{...r,method:Q.PUT})).body}!function(e){e.GET="GET",e.PUT="PUT"}(Q||(Q={}));var S=r(73632),k=r(63088),x=r(36545),F=r(54143),M=r(78420),N=r(46009),R=r(56537),K=r(90739),L=r(29486),T=r(27700);async function P(e,{baseFs:t=new M.S,prefixPath:r=N.LZ.root,compressionLevel:n}={}){const i=await R.xfs.mktempPromise(),o=N.y1.join(i,"archive.zip"),s=new K.d(o,{create:!0,libzip:await(0,L.getLibzipPromise)(),level:n}),A=N.y1.resolve(N.LZ.root,r);return await s.copyPromise(A,e,{baseFs:t,stableTime:!0,stableSort:!0}),s}async function U(e,t){const r=await R.xfs.mktempPromise(),n=N.y1.join(r,"archive.zip"),{compressionLevel:i,...o}=t;return await _(e,new K.d(n,{create:!0,libzip:await(0,L.getLibzipPromise)(),level:i}),o)}async function _(e,t,{stripComponents:r=0,prefixPath:n=N.LZ.dot}={}){const i=new T.Ze;return i.on("entry",e=>{if(function(e){if("/"===e[0])return!0;const t=e.path.split(/\//g);return!!t.some(e=>".."===e)||t.length<=r}(e))return void e.resume();const i=N.y1.normalize(N.cS.toPortablePath(e.path)).replace(/\/$/,"").split(/\//g);if(i.length<=r)return void e.resume();const o=i.slice(r).join("/"),s=N.y1.join(n,o),A=[];let a=420;"Directory"!==e.type&&0==(73&e.mode)||(a|=73),e.on("data",e=>{A.push(e)}),e.on("end",()=>{var r;switch(e.type){case"Directory":t.mkdirpSync(N.y1.dirname(s),{chmod:493,utimes:[315532800,315532800]}),t.mkdirSync(s),t.chmodSync(s,a),t.utimesSync(s,315532800,315532800);break;case"OldFile":case"File":t.mkdirpSync(N.y1.dirname(s),{chmod:493,utimes:[315532800,315532800]}),t.writeFileSync(s,Buffer.concat(A)),t.chmodSync(s,a),t.utimesSync(s,315532800,315532800);break;case"SymbolicLink":t.mkdirpSync(N.y1.dirname(s),{chmod:493,utimes:[315532800,315532800]}),t.symlinkSync(e.linkpath,s),null===(r=t.lutimesSync)||void 0===r||r.call(t,s,315532800,315532800)}})}),await new Promise((r,n)=>{i.on("error",e=>{n(e)}),i.on("close",()=>{r(t)}),i.end(e)})}var O=r(28148),j=r(27122),Y=r(92409),G=r(62152),J=r(46611),H=r(92659),q=r(40376),z=r(52779),W=r(35691),V=r(15815),X=r(33720),Z=r(60895),$=r(94538),ee=r(17722),te=r(59355),re=r(32485)},73632:(e,t,r)=>{"use strict";r.r(t),r.d(t,{escapeRegExp:()=>a,assertNever:()=>c,mapAndFilter:()=>u,mapAndFind:()=>h,getFactoryWithDefault:()=>f,getArrayWithDefault:()=>p,getSetWithDefault:()=>d,getMapWithDefault:()=>C,releaseAfterUseAsync:()=>E,prettifyAsyncErrors:()=>I,prettifySyncErrors:()=>m,bufferStream:()=>y,BufferStream:()=>w,DefaultStream:()=>B,dynamicRequire:()=>Q,dynamicRequireNoCache:()=>v,sortMap:()=>D,buildIgnorePattern:()=>b,replaceEnvVariables:()=>S});var n=r(46009),i=r(17278),o=r(2401),s=r.n(o),A=r(92413);function a(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function c(e){throw new Error(`Assertion failed: Unexpected object '${e}'`)}function u(e,t){const r=[];for(const n of e){const e=t(n);e!==l&&r.push(e)}return r}e=r.hmd(e);const l=Symbol();function h(e,t){for(const r of e){const e=t(r);if(e!==g)return e}}u.skip=l;const g=Symbol();function f(e,t,r){let n=e.get(t);return void 0===n&&e.set(t,n=r()),n}function p(e,t){let r=e.get(t);return void 0===r&&e.set(t,r=[]),r}function d(e,t){let r=e.get(t);return void 0===r&&e.set(t,r=new Set),r}function C(e,t){let r=e.get(t);return void 0===r&&e.set(t,r=new Map),r}async function E(e,t){if(null==t)return await e();try{return await e()}finally{await t()}}async function I(e,t){try{return await e()}catch(e){throw e.message=t(e.message),e}}function m(e,t){try{return e()}catch(e){throw e.message=t(e.message),e}}async function y(e){return await new Promise((t,r)=>{const n=[];e.on("error",e=>{r(e)}),e.on("data",e=>{n.push(e)}),e.on("end",()=>{t(Buffer.concat(n))})})}h.skip=g;class w extends A.Transform{constructor(){super(...arguments),this.chunks=[]}_transform(e,t,r){if("buffer"!==t||!Buffer.isBuffer(e))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(e),r(null,null)}_flush(e){e(null,Buffer.concat(this.chunks))}}class B extends A.Transform{constructor(e=Buffer.alloc(0)){super(),this.active=!0,this.ifEmpty=e}_transform(e,t,r){if("buffer"!==t||!Buffer.isBuffer(e))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,r(null,e)}_flush(e){this.active&&this.ifEmpty.length>0&&e(null,this.ifEmpty)}}function Q(e){return"undefined"!=typeof require?require(e):r(32178)(e)}function v(t){const i=n.cS.fromPortablePath(t),o=r.c[i];let s;delete r.c[i];try{s=Q(i);const t=r.c[i],n=e.children.indexOf(t);-1!==n&&e.children.splice(n,1)}finally{r.c[i]=o}return s}function D(e,t){const r=Array.from(e);Array.isArray(t)||(t=[t]);const n=[];for(const e of t)n.push(r.map(t=>e(t)));const i=r.map((e,t)=>t);return i.sort((e,t)=>{for(const r of n){const n=r[e]r[t]?1:0;if(0!==n)return n}return 0}),i.map(e=>r[e])}function b(e){return 0===e.length?null:e.map(e=>`(${s().makeRe(e,{windows:!1}).source})`).join("|")}function S(e,{env:t}){return e.replace(/\${(?[\d\w_]+)(?:)?-?(?[^}]+)?}/g,(...e)=>{const{variableName:r,colon:n,fallback:o}=e[e.length-1],s=Object.prototype.hasOwnProperty.call(t,r),A=process.env[r];if(A)return A;if(s&&!A&&n)return o;if(s)return A;if(o)return o;throw new i.UsageError(`Environment variable not found (${r})`)})}},63088:(e,t,r)=>{"use strict";r.r(t),r.d(t,{makeScriptEnv:()=>m,prepareExternalProject:()=>y,hasPackageScript:()=>w,executePackageScript:()=>B,executePackageShellcode:()=>Q,executeWorkspaceScript:()=>D,hasWorkspaceScript:()=>b,getPackageAccessibleBinaries:()=>S,getWorkspaceAccessibleBinaries:()=>k,executePackageAccessibleBinary:()=>x,executeWorkspaceAccessibleBinary:()=>F});var n,i=r(46009),o=r(53660),s=r(75448),A=r(56537),a=r(29486),c=r(43982),u=r(92413),l=r(46611),h=r(92659),g=r(35691),f=r(15815),p=r(59355),d=r(6220),C=r(73632),E=r(54143);async function I(e,t,r,n=[]){"win32"===process.platform&&await A.xfs.writeFilePromise(i.y1.format({dir:e,name:t,ext:".cmd"}),`@"${r}" ${n.map(e=>`"${e.replace('"','""')}"`).join(" ")} %*\n`),await A.xfs.writeFilePromise(i.y1.join(e,t),`#!/bin/sh\nexec "${r}" ${n.map(e=>`'${e.replace(/'/g,"'\"'\"'")}'`).join(" ")} "$@"\n`),await A.xfs.chmodPromise(i.y1.join(e,t),493)}async function m({project:e,binFolder:t,lifecycleScript:r}){const n={};for(const[e,t]of Object.entries(process.env))void 0!==t&&(n["path"!==e.toLowerCase()?e:"PATH"]=t);const o=i.cS.fromPortablePath(t);n.BERRY_BIN_FOLDER=i.cS.fromPortablePath(o),await I(t,(0,i.Zu)("node"),process.execPath),null!==p.o&&(await I(t,(0,i.Zu)("run"),process.execPath,[process.argv[1],"run"]),await I(t,(0,i.Zu)("yarn"),process.execPath,[process.argv[1]]),await I(t,(0,i.Zu)("yarnpkg"),process.execPath,[process.argv[1]]),await I(t,(0,i.Zu)("node-gyp"),process.execPath,[process.argv[1],"run","--top-level","node-gyp"])),e&&(n.INIT_CWD=i.cS.fromPortablePath(e.configuration.startingCwd)),n.PATH=n.PATH?`${o}${i.cS.delimiter}${n.PATH}`:""+o,n.npm_execpath=`${o}${i.cS.sep}yarn`,n.npm_node_execpath=`${o}${i.cS.sep}node`;const s=null!==p.o?"yarn/"+p.o:`yarn/${C.dynamicRequire("@yarnpkg/core").version}-core`;return n.npm_config_user_agent=`${s} npm/? node/${process.versions.node} ${process.platform} ${process.arch}`,r&&(n.npm_lifecycle_event=r),e&&await e.configuration.triggerHook(e=>e.setupScriptEnvironment,e,n,async(e,r,n)=>await I(t,(0,i.Zu)(e),r,n)),n}async function y(e,t,{configuration:r,report:o,workspace:s=null}){await A.xfs.mktempPromise(async a=>{const c=i.y1.join(a,"pack.log"),{stdout:l,stderr:f}=r.getSubprocessStreams(c,{prefix:e,report:o}),p=await async function(e){let t=null;try{t=await A.xfs.readFilePromise(i.y1.join(e,i.QS.lockfile),"utf8")}catch(e){}return null!==t?t.match(/^__metadata:$/m)?n.Yarn2:n.Yarn1:A.xfs.existsSync(i.y1.join(e,"package-lock.json"))?n.Npm:A.xfs.existsSync(i.y1.join(e,"pnpm-lock.yaml"))?n.Pnpm:null}(e);let E;null!==p?(l.write(`Installing the project using ${p}\n\n`),E=p):(l.write("No package manager detected; defaulting to Yarn\n\n"),E=n.Yarn2),await A.xfs.mktempPromise(async r=>{const o=await m({binFolder:r}),p=new Map([[n.Yarn1,async()=>{const r=null!==s?["workspace",s]:[],n=await d.pipevp("yarn",["set","version","classic","--only-if-needed"],{cwd:e,env:o,stdin:null,stdout:l,stderr:f,end:d.EndStrategy.ErrorCode});if(0!==n.code)return n.code;await A.xfs.appendFilePromise(i.y1.join(e,".npmignore"),"/.yarn\n"),l.write("\n");const a=await d.pipevp("yarn",["install"],{cwd:e,env:o,stdin:null,stdout:l,stderr:f,end:d.EndStrategy.ErrorCode});if(0!==a.code)return a.code;l.write("\n");const c=await d.pipevp("yarn",[...r,"pack","--filename",i.cS.fromPortablePath(t)],{cwd:e,env:o,stdin:null,stdout:l,stderr:f});return 0!==c.code?c.code:0}],[n.Yarn2,async()=>{const r=null!==s?["workspace",s]:[],n=await d.pipevp("yarn",[...r,"pack","--install-if-needed","--filename",i.cS.fromPortablePath(t)],{cwd:e,env:o,stdin:null,stdout:l,stderr:f});return 0!==n.code?n.code:0}],[n.Npm,async()=>{if(null!==s)throw new Error("Workspaces aren't supported by npm, which has been detected as the primary package manager for "+e);delete o.npm_config_user_agent;const r=await d.pipevp("npm",["install"],{cwd:e,env:o,stdin:null,stdout:l,stderr:f,end:d.EndStrategy.ErrorCode});if(0!==r.code)return r.code;const n=new u.PassThrough,a=C.bufferStream(n);n.pipe(l);const c=await d.pipevp("npm",["pack","--silent"],{cwd:e,env:o,stdin:null,stdout:n,stderr:f});if(0!==c.code)return c.code;const h=(await a).toString().trim(),g=i.y1.resolve(e,i.cS.toPortablePath(h));return await A.xfs.renamePromise(g,t),0}]]).get(E);if(void 0===p)throw new Error("Assertion failed: Unsupported workflow");const I=await p();if(0!==I&&void 0!==I)throw A.xfs.detachTemp(a),new g.lk(h.b.PACKAGE_PREPARATION_FAILED,`Packing the package failed (exit code ${I}, logs can be found here: ${c})`)})})}async function w(e,t,{project:r}){const n=r.storedPackages.get(e.locatorHash);if(!n)throw new Error(`Package for ${E.prettyLocator(r.configuration,e)} not found in the project`);return await o.A.openPromise(async e=>{const o=r.configuration,A=r.configuration.getLinkers(),a={project:r,report:new f.P({stdout:new u.PassThrough,configuration:o})},c=A.find(e=>e.supportsPackage(n,a));if(!c)throw new Error(`The package ${E.prettyLocator(r.configuration,n)} isn't supported by any of the available linkers`);const h=await c.findPackageLocation(n,a),g=new s.M(h,{baseFs:e});return(await l.G.find(i.LZ.dot,{baseFs:g})).scripts.has(t)},{libzip:await(0,a.getLibzipPromise)()})}async function B(e,t,r,{cwd:n,project:i,stdin:o,stdout:s,stderr:a}){return await A.xfs.mktempPromise(async A=>{const{manifest:u,env:l,cwd:h}=await v(e,{project:i,binFolder:A,cwd:n,lifecycleScript:t}),g=u.scripts.get(t);if(void 0===g)return 1;const f=await i.configuration.reduceHook(e=>e.wrapScriptExecution,async()=>await(0,c.execute)(g,r,{cwd:h,env:l,stdin:o,stdout:s,stderr:a}),i,e,t,{script:g,args:r,cwd:h,env:l,stdin:o,stdout:s,stderr:a});return await f()})}async function Q(e,t,r,{cwd:n,project:i,stdin:o,stdout:s,stderr:a}){return await A.xfs.mktempPromise(async A=>{const{env:u,cwd:l}=await v(e,{project:i,binFolder:A,cwd:n});return await(0,c.execute)(t,r,{cwd:l,env:u,stdin:o,stdout:s,stderr:a})})}async function v(e,{project:t,binFolder:r,cwd:n,lifecycleScript:A}){const c=t.storedPackages.get(e.locatorHash);if(!c)throw new Error(`Package for ${E.prettyLocator(t.configuration,e)} not found in the project`);return await o.A.openPromise(async o=>{const a=t.configuration,h=t.configuration.getLinkers(),g={project:t,report:new f.P({stdout:new u.PassThrough,configuration:a})},p=h.find(e=>e.supportsPackage(c,g));if(!p)throw new Error(`The package ${E.prettyLocator(t.configuration,c)} isn't supported by any of the available linkers`);const d=await m({project:t,binFolder:r,lifecycleScript:A});for(const[n,[,o]]of await S(e,{project:t}))await I(r,(0,i.Zu)(n),process.execPath,[o]);const C=await p.findPackageLocation(c,g),y=new s.M(C,{baseFs:o}),w=await l.G.find(i.LZ.dot,{baseFs:y});return void 0===n&&(n=C),{manifest:w,binFolder:r,env:d,cwd:n}},{libzip:await(0,a.getLibzipPromise)()})}async function D(e,t,r,{cwd:n,stdin:i,stdout:o,stderr:s}){return await B(e.anchoredLocator,t,r,{cwd:n,project:e.project,stdin:i,stdout:o,stderr:s})}async function b(e,t){return e.manifest.scripts.has(t)}async function S(e,{project:t}){const r=t.configuration,n=new Map,o=t.storedPackages.get(e.locatorHash);if(!o)throw new Error(`Package for ${E.prettyLocator(r,e)} not found in the project`);const s=new u.Writable,A=r.getLinkers(),a={project:t,report:new f.P({configuration:r,stdout:s})},c=new Set([e.locatorHash]);for(const e of o.dependencies.values()){const n=t.storedResolutions.get(e.descriptorHash);if(!n)throw new Error(`Assertion failed: The resolution (${E.prettyDescriptor(r,e)}) should have been registered`);c.add(n)}for(const e of c){const r=t.storedPackages.get(e);if(!r)throw new Error(`Assertion failed: The package (${e}) should have been registered`);if(0===r.bin.size)continue;const o=A.find(e=>e.supportsPackage(r,a));if(!o)continue;const s=await o.findPackageLocation(r,a);for(const[e,t]of r.bin)n.set(e,[r,i.cS.fromPortablePath(i.y1.resolve(s,t))])}return n}async function k(e){return await S(e.anchoredLocator,{project:e.project})}async function x(e,t,r,{cwd:n,project:o,stdin:s,stdout:a,stderr:c,nodeArgs:u=[]}){const l=await S(e,{project:o}),h=l.get(t);if(!h)throw new Error(`Binary not found (${t}) for ${E.prettyLocator(o.configuration,e)}`);return await A.xfs.mktempPromise(async e=>{const[,t]=h,g=await m({project:o,binFolder:e});for(const[e,[,t]]of l)await I(g.BERRY_BIN_FOLDER,(0,i.Zu)(e),process.execPath,[t]);let f;try{f=await d.pipevp(process.execPath,[...u,t,...r],{cwd:n,env:g,stdin:s,stdout:a,stderr:c})}finally{await A.xfs.removePromise(g.BERRY_BIN_FOLDER)}return f.code})}async function F(e,t,r,{cwd:n,stdin:i,stdout:o,stderr:s}){return await x(e.anchoredLocator,t,r,{project:e.project,cwd:n,stdin:i,stdout:o,stderr:s})}!function(e){e.Yarn1="Yarn Classic",e.Yarn2="Yarn",e.Npm="npm",e.Pnpm="pnpm"}(n||(n={}))},36545:(e,t,r)=>{"use strict";r.r(t),r.d(t,{satisfiesWithPrereleases:()=>o});var n=r(53887),i=r.n(n);function o(e,t,r=!1){let n,o;try{n=new(i().Range)(t,r)}catch(e){return!1}if(!e)return!1;try{o=new(i().SemVer)(e,n.loose),o.prerelease&&(o.prerelease=[])}catch(e){return!1}return n.set.some(e=>{for(const t of e)t.semver.prerelease&&(t.semver.prerelease=[]);return e.every(e=>e.test(o))})}},54143:(e,t,r)=>{"use strict";r.r(t),r.d(t,{makeIdent:()=>l,makeDescriptor:()=>h,makeLocator:()=>g,convertToIdent:()=>f,convertDescriptorToLocator:()=>p,convertLocatorToDescriptor:()=>d,convertPackageToLocator:()=>C,renamePackage:()=>E,copyPackage:()=>I,virtualizeDescriptor:()=>m,virtualizePackage:()=>y,isVirtualDescriptor:()=>w,isVirtualLocator:()=>B,devirtualizeDescriptor:()=>Q,devirtualizeLocator:()=>v,bindDescriptor:()=>D,bindLocator:()=>b,areIdentsEqual:()=>S,areDescriptorsEqual:()=>k,areLocatorsEqual:()=>x,areVirtualPackagesEquivalent:()=>F,parseIdent:()=>M,tryParseIdent:()=>N,parseDescriptor:()=>R,tryParseDescriptor:()=>K,parseLocator:()=>L,tryParseLocator:()=>T,parseRange:()=>P,parseFileStyleRange:()=>U,makeRange:()=>O,convertToManifestRange:()=>j,requirableIdent:()=>Y,stringifyIdent:()=>G,stringifyDescriptor:()=>J,stringifyLocator:()=>H,slugifyIdent:()=>q,slugifyLocator:()=>z,prettyIdent:()=>W,prettyRange:()=>X,prettyDescriptor:()=>Z,prettyReference:()=>$,prettyLocator:()=>ee,prettyLocatorNoColors:()=>te,sortDescriptors:()=>re,prettyWorkspace:()=>ne,getIdentVendorPath:()=>ie});var n=r(46009),i=r(71191),o=r.n(i),s=r(53887),A=r.n(s),a=r(27122),c=r(20624),u=r(73632);function l(e,t){return{identHash:c.makeHash(e,t),scope:e,name:t}}function h(e,t){return{identHash:e.identHash,scope:e.scope,name:e.name,descriptorHash:c.makeHash(e.identHash,t),range:t}}function g(e,t){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:c.makeHash(e.identHash,t),reference:t}}function f(e){return{identHash:e.identHash,scope:e.scope,name:e.name}}function p(e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.descriptorHash,reference:e.range}}function d(e){return{identHash:e.identHash,scope:e.scope,name:e.name,descriptorHash:e.locatorHash,range:e.reference}}function C(e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference}}function E(e,t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference,version:e.version,languageName:e.languageName,linkType:e.linkType,dependencies:new Map(e.dependencies),peerDependencies:new Map(e.peerDependencies),dependenciesMeta:new Map(e.dependenciesMeta),peerDependenciesMeta:new Map(e.peerDependenciesMeta),bin:new Map(e.bin)}}function I(e){return E(e,e)}function m(e,t){if(t.includes("#"))throw new Error("Invalid entropy");return h(e,`virtual:${t}#${e.range}`)}function y(e,t){if(t.includes("#"))throw new Error("Invalid entropy");return E(e,g(e,`virtual:${t}#${e.reference}`))}function w(e){return e.range.startsWith("virtual:")}function B(e){return e.reference.startsWith("virtual:")}function Q(e){if(!w(e))throw new Error("Not a virtual descriptor");return h(e,e.range.replace(/^[^#]*#/,""))}function v(e){if(!B(e))throw new Error("Not a virtual descriptor");return g(e,e.reference.replace(/^[^#]*#/,""))}function D(e,t){return e.range.includes("::")?e:h(e,`${e.range}::${o().stringify(t)}`)}function b(e,t){return e.reference.includes("::")?e:g(e,`${e.reference}::${o().stringify(t)}`)}function S(e,t){return e.identHash===t.identHash}function k(e,t){return e.descriptorHash===t.descriptorHash}function x(e,t){return e.locatorHash===t.locatorHash}function F(e,t){if(!B(e))throw new Error("Invalid package type");if(!B(t))throw new Error("Invalid package type");if(!S(e,t))return!1;if(e.dependencies.size!==t.dependencies.size)return!1;for(const r of e.dependencies.values()){const e=t.dependencies.get(r.identHash);if(!e)return!1;if(!k(r,e))return!1}return!0}function M(e){const t=N(e);if(!t)throw new Error(`Invalid ident (${e})`);return t}function N(e){const t=e.match(/^(?:@([^/]+?)\/)?([^/]+)$/);if(!t)return null;const[,r,n]=t;return l(void 0!==r?r:null,n)}function R(e,t=!1){const r=K(e,t);if(!r)throw new Error(`Invalid descriptor (${e})`);return r}function K(e,t=!1){const r=t?e.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):e.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!r)return null;const[,n,i,o]=r;if("unknown"===o)throw new Error(`Invalid range (${e})`);const s=void 0!==o?o:"unknown";return h(l(void 0!==n?n:null,i),s)}function L(e,t=!1){const r=T(e,t);if(!r)throw new Error(`Invalid locator (${e})`);return r}function T(e,t=!1){const r=t?e.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):e.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!r)return null;const[,n,i,o]=r;if("unknown"===o)throw new Error(`Invalid reference (${e})`);const s=void 0!==o?o:"unknown";return g(l(void 0!==n?n:null,i),s)}function P(e,t){const r=e.match(/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/);if(null===r)throw new Error(`Invalid range (${e})`);const n=void 0!==r[1]?r[1]:null;if("string"==typeof(null==t?void 0:t.requireProtocol)&&n!==t.requireProtocol)throw new Error(`Invalid protocol (${n})`);if((null==t?void 0:t.requireProtocol)&&null===n)throw new Error(`Missing protocol (${n})`);const i=void 0!==r[3]?decodeURIComponent(r[2]):null;if((null==t?void 0:t.requireSource)&&null===i)throw new Error(`Missing source (${e})`);const s=void 0!==r[3]?decodeURIComponent(r[3]):decodeURIComponent(r[2]);return{protocol:n,source:i,selector:(null==t?void 0:t.parseSelector)?o().parse(s):s,params:void 0!==r[4]?o().parse(r[4]):null}}function U(e,{protocol:t}){const{selector:r,params:n}=P(e,{requireProtocol:t,requireBindings:!0});if("string"!=typeof n.locator)throw new Error("Assertion failed: Invalid bindings for "+e);return{parentLocator:L(n.locator,!0),path:r}}function _(e){return e=(e=(e=e.replace(/%/g,"%25")).replace(/:/g,"%3A")).replace(/#/g,"%23")}function O({protocol:e,source:t,selector:r,params:n}){let i="";return null!==e&&(i+=""+e),null!==t&&(i+=_(t)+"#"),i+=_(r),function(e){return null!==e&&Object.entries(e).length>0}(n)&&(i+="::"+o().stringify(n)),i}function j(e){const{params:t,protocol:r,source:n,selector:i}=P(e);for(const e in t)e.startsWith("__")&&delete t[e];return O({protocol:r,source:n,params:t,selector:i})}function Y(e){return e.scope?`@${e.scope}/${e.name}`:""+e.name}function G(e){return e.scope?`@${e.scope}/${e.name}`:""+e.name}function J(e){return e.scope?`@${e.scope}/${e.name}@${e.range}`:`${e.name}@${e.range}`}function H(e){return e.scope?`@${e.scope}/${e.name}@${e.reference}`:`${e.name}@${e.reference}`}function q(e){return null!==e.scope?`@${e.scope}-${e.name}`:e.name}function z(e){const{protocol:t,selector:r}=P(e.reference),i=null!==t?t.replace(/:$/,""):"exotic",o=A().valid(r),s=null!==o?`${i}-${o}`:""+i,a=(e.scope,`${q(e)}-${s}-${e.locatorHash.slice(0,10)}`);return(0,n.Zu)(a)}function W(e,t){return t.scope?`${e.format(`@${t.scope}/`,a.a5.SCOPE)}${e.format(t.name,a.a5.NAME)}`:""+e.format(t.name,a.a5.NAME)}function V(e){if(e.startsWith("virtual:")){return`${V(e.substr(e.indexOf("#")+1))} [${e.substr("virtual:".length,5)}]`}return e.replace(/\?.*/,"?[...]")}function X(e,t){return""+e.format(V(t),a.a5.RANGE)}function Z(e,t){return`${W(e,t)}${e.format("@",a.a5.RANGE)}${X(e,t.range)}`}function $(e,t){return""+e.format(V(t),a.a5.REFERENCE)}function ee(e,t){return`${W(e,t)}${e.format("@",a.a5.REFERENCE)}${$(e,t.reference)}`}function te(e){return`${G(e)}@${V(e.reference)}`}function re(e){return u.sortMap(e,[e=>G(e),e=>e.range])}function ne(e,t){return W(e,t.locator)}function ie(e){return"node_modules/"+Y(e)}},32485:(e,t,r)=>{"use strict";var n;r.d(t,{U:()=>n}),function(e){e.HARD="HARD",e.SOFT="SOFT"}(n||(n={}))},14626:(e,t,r)=>{"use strict";r.d(t,{K:()=>i});var n=r(42096);class i extends n.p{constructor(e,{baseFs:t,pathUtils:r}){super(r),this.target=e,this.baseFs=t}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}}},75448:(e,t,r)=>{"use strict";r.d(t,{M:()=>s});var n=r(78420),i=r(42096),o=r(46009);class s extends i.p{constructor(e,{baseFs:t=new n.S}={}){super(o.y1),this.target=this.pathUtils.normalize(e),this.baseFs=t}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?o.y1.normalize(e):this.baseFs.resolve(o.y1.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}}},35398:(e,t,r)=>{"use strict";r.d(t,{uY:()=>a,fS:()=>c,qH:()=>u});var n=r(12087),i=r(35747),o=r.n(i),s=r(46009);async function A(e,t,r,n,i,a,c){const u=await async function(e,t){try{return await e.lstatPromise(t)}catch(e){return null}}(r,n),l=await i.lstatPromise(a);switch(c.stableTime?t.push([n,315532800,315532800]):t.push([n,l.atime,l.mtime]),!0){case l.isDirectory():await async function(e,t,r,n,i,o,s,a,c){if(null!==i&&!i.isDirectory()){if(!c.overwrite)return;e.push(async()=>r.removePromise(n)),i=null}null===i&&e.push(async()=>r.mkdirPromise(n,{mode:a.mode}));const u=await o.readdirPromise(s);if(c.stableSort)for(const i of u.sort())await A(e,t,r,r.pathUtils.join(n,i),o,o.pathUtils.join(s,i),c);else await Promise.all(u.map(async i=>{await A(e,t,r,r.pathUtils.join(n,i),o,o.pathUtils.join(s,i),c)}))}(e,t,r,n,u,i,a,l,c);break;case l.isFile():await async function(e,t,r,n,i,s,A,a,c){if(null!==i){if(!c.overwrite)return;e.push(async()=>r.removePromise(n)),i=null}r===s?e.push(async()=>r.copyFilePromise(A,n,o().constants.COPYFILE_FICLONE)):e.push(async()=>r.writeFilePromise(n,await s.readFilePromise(A)))}(e,0,r,n,u,i,a,0,c);break;case l.isSymbolicLink():await async function(e,t,r,n,i,o,A,a,c){if(null!==i){if(!c.overwrite)return;e.push(async()=>r.removePromise(n)),i=null}const u=await o.readlinkPromise(A);e.push(async()=>r.symlinkPromise((0,s.CI)(r.pathUtils,u),n))}(e,0,r,n,u,i,a,0,c);break;default:throw new Error(`Unsupported file type (${l.mode})`)}e.push(async()=>r.chmodPromise(n,511&l.mode))}class a{constructor(e){this.pathUtils=e}async removePromise(e){let t;try{t=await this.lstatPromise(e)}catch(e){if("ENOENT"===e.code)return;throw e}if(t.isDirectory()){for(const t of await this.readdirPromise(e))await this.removePromise(this.pathUtils.resolve(e,t));for(let t=0;t<5;++t)try{await this.rmdirPromise(e);break}catch(e){if("EBUSY"===e.code||"ENOTEMPTY"===e.code){await new Promise(e=>setTimeout(e,100*t));continue}throw e}}else await this.unlinkPromise(e)}removeSync(e){let t;try{t=this.lstatSync(e)}catch(e){if("ENOENT"===e.code)return;throw e}if(t.isDirectory()){for(const t of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,t));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:t,utimes:r}={}){if((e=this.resolve(e))===this.pathUtils.dirname(e))return;const n=e.split(this.pathUtils.sep);for(let e=2;e<=n.length;++e){const i=n.slice(0,e).join(this.pathUtils.sep);if(!this.existsSync(i)){try{await this.mkdirPromise(i)}catch(e){if("EEXIST"===e.code)continue;throw e}if(null!=t&&await this.chmodPromise(i,t),null!=r)await this.utimesPromise(i,r[0],r[1]);else{const e=await this.statPromise(this.pathUtils.dirname(i));await this.utimesPromise(i,e.atime,e.mtime)}}}}mkdirpSync(e,{chmod:t,utimes:r}={}){if((e=this.resolve(e))===this.pathUtils.dirname(e))return;const n=e.split(this.pathUtils.sep);for(let e=2;e<=n.length;++e){const i=n.slice(0,e).join(this.pathUtils.sep);if(!this.existsSync(i)){try{this.mkdirSync(i)}catch(e){if("EEXIST"===e.code)continue;throw e}if(null!=t&&this.chmodSync(i,t),null!=r)this.utimesSync(i,r[0],r[1]);else{const e=this.statSync(this.pathUtils.dirname(i));this.utimesSync(i,e.atime,e.mtime)}}}}async copyPromise(e,t,{baseFs:r=this,overwrite:n=!0,stableSort:i=!1,stableTime:o=!1}={}){return await async function(e,t,r,n,i){const o=e.pathUtils.normalize(t),s=r.pathUtils.normalize(n),a=[],c=[];await e.mkdirpPromise(t),await A(a,c,e,o,r,s,i);for(const e of a)await e();const u="function"==typeof e.lutimesPromise?e.lutimesPromise.bind(e):e.utimesPromise.bind(e);for(const[e,t,r]of c)await u(e,t,r)}(this,e,r,t,{overwrite:n,stableSort:i,stableTime:o})}copySync(e,t,{baseFs:r=this,overwrite:n=!0}={}){const i=r.lstatSync(t),o=this.existsSync(e);if(i.isDirectory()){this.mkdirpSync(e);const i=r.readdirSync(t);for(const o of i)this.copySync(this.pathUtils.join(e,o),r.pathUtils.join(t,o),{baseFs:r,overwrite:n})}else if(i.isFile()){if(!o||n){o&&this.removeSync(e);const n=r.readFileSync(t);this.writeFileSync(e,n)}}else{if(!i.isSymbolicLink())throw new Error(`Unsupported file type (file: ${t}, mode: 0o${i.mode.toString(8).padStart(6,"0")})`);if(!o||n){o&&this.removeSync(e);const n=r.readlinkSync(t);this.symlinkSync((0,s.CI)(this.pathUtils,n),e)}}const A=511&i.mode;this.chmodSync(e,A)}async changeFilePromise(e,t,{automaticNewlines:r}={}){let n="";try{n=await this.readFilePromise(e,"utf8")}catch(e){}const i=r?u(n,t):t;n!==i&&await this.writeFilePromise(e,i)}changeFileSync(e,t,{automaticNewlines:r=!1}={}){let n="";try{n=this.readFileSync(e,"utf8")}catch(e){}const i=r?u(n,t):t;n!==i&&this.writeFileSync(e,i)}async movePromise(e,t){try{await this.renamePromise(e,t)}catch(r){if("EXDEV"!==r.code)throw r;await this.copyPromise(t,e),await this.removePromise(e)}}moveSync(e,t){try{this.renameSync(e,t)}catch(r){if("EXDEV"!==r.code)throw r;this.copySync(t,e),this.removeSync(e)}}async lockPromise(e,t){const r=e+".flock",n=Date.now();let i=null;const o=async()=>{let e;try{[e]=await this.readJsonPromise(r)}catch(e){return Date.now()-n<500}try{return process.kill(e,0),!0}catch(e){return!1}};for(;null===i;)try{i=await this.openPromise(r,"wx")}catch(e){if("EEXIST"!==e.code)throw e;if(!await o())try{await this.unlinkPromise(r);continue}catch(e){}if(!(Date.now()-n<6e4))throw new Error(`Couldn't acquire a lock in a reasonable time (via ${r})`);await new Promise(e=>setTimeout(e,1e3/60))}await this.writePromise(i,JSON.stringify([process.pid]));try{return await t()}finally{try{await this.unlinkPromise(r),await this.closePromise(i)}catch(e){}}}async readJsonPromise(e){const t=await this.readFilePromise(e,"utf8");try{return JSON.parse(t)}catch(t){throw t.message+=` (in ${e})`,t}}async readJsonSync(e){const t=this.readFileSync(e,"utf8");try{return JSON.parse(t)}catch(t){throw t.message+=` (in ${e})`,t}}async writeJsonPromise(e,t){return await this.writeFilePromise(e,JSON.stringify(t,null,2)+"\n")}writeJsonSync(e,t){return this.writeFileSync(e,JSON.stringify(t,null,2)+"\n")}async preserveTimePromise(e,t){const r=await this.lstatPromise(e),n=await t();void 0!==n&&(e=n),this.lutimesPromise?await this.lutimesPromise(e,r.atime,r.mtime):r.isSymbolicLink()||await this.utimesPromise(e,r.atime,r.mtime)}async preserveTimeSync(e,t){const r=this.lstatSync(e),n=t();void 0!==n&&(e=n),this.lutimesSync?this.lutimesSync(e,r.atime,r.mtime):r.isSymbolicLink()||this.utimesSync(e,r.atime,r.mtime)}}a.DEFAULT_TIME=315532800;class c extends a{constructor(){super(s.y1)}}function u(e,t){return t.replace(/\r?\n/g,function(e){const t=e.match(/\r?\n/g);if(null===t)return n.EOL;const r=t.filter(e=>"\r\n"===e).length;return r>t.length-r?"\r\n":"\n"}(e))}},10489:(e,t,r)=>{"use strict";r.d(t,{n:()=>A});var n=r(78420),i=r(42096),o=r(46009);const s=o.LZ.root;class A extends i.p{constructor(e,{baseFs:t=new n.S}={}){super(o.y1),this.target=this.pathUtils.resolve(o.LZ.root,e),this.baseFs=t}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(o.LZ.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){const t=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(s,e));if(t.match(/^\.\.\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(s,this.pathUtils.relative(this.target,e))}}},15037:(e,t,r)=>{"use strict";r.d(t,{v:()=>i});var n=r(42096);class i extends n.p{constructor(e,t){super(t),this.instance=null,this.factory=e}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(e){this.instance=e}mapFromBase(e){return e}mapToBase(e){return e}}},78420:(e,t,r)=>{"use strict";r.d(t,{S:()=>a});var n=r(35747),i=r.n(n),o=r(35398),s=r(26984),A=r(46009);class a extends o.fS{constructor(e=i()){super(),this.realFs=e,void 0!==this.realFs.lutimes&&(this.lutimesPromise=this.lutimesPromiseImpl,this.lutimesSync=this.lutimesSyncImpl)}getExtractHint(){return!1}getRealPath(){return A.LZ.root}resolve(e){return A.y1.resolve(e)}async openPromise(e,t,r){return await new Promise((n,i)=>{this.realFs.open(A.cS.fromPortablePath(e),t,r,this.makeCallback(n,i))})}openSync(e,t,r){return this.realFs.openSync(A.cS.fromPortablePath(e),t,r)}async readPromise(e,t,r=0,n=0,i=-1){return await new Promise((o,s)=>{this.realFs.read(e,t,r,n,i,(e,t)=>{e?s(e):o(t)})})}readSync(e,t,r,n,i){return this.realFs.readSync(e,t,r,n,i)}async writePromise(e,t,r,n,i){return await new Promise((o,s)=>"string"==typeof t?this.realFs.write(e,t,r,this.makeCallback(o,s)):this.realFs.write(e,t,r,n,i,this.makeCallback(o,s)))}writeSync(e,t,r,n,i){return"string"==typeof t?this.realFs.writeSync(e,t,r):this.realFs.writeSync(e,t,r,n,i)}async closePromise(e){await new Promise((t,r)=>{this.realFs.close(e,this.makeCallback(t,r))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,t){const r=null!==e?A.cS.fromPortablePath(e):e;return this.realFs.createReadStream(r,t)}createWriteStream(e,t){const r=null!==e?A.cS.fromPortablePath(e):e;return this.realFs.createWriteStream(r,t)}async realpathPromise(e){return await new Promise((t,r)=>{this.realFs.realpath(A.cS.fromPortablePath(e),{},this.makeCallback(t,r))}).then(e=>A.cS.toPortablePath(e))}realpathSync(e){return A.cS.toPortablePath(this.realFs.realpathSync(A.cS.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(t=>{this.realFs.exists(A.cS.fromPortablePath(e),t)})}accessSync(e,t){return this.realFs.accessSync(A.cS.fromPortablePath(e),t)}async accessPromise(e,t){return await new Promise((r,n)=>{this.realFs.access(A.cS.fromPortablePath(e),t,this.makeCallback(r,n))})}existsSync(e){return this.realFs.existsSync(A.cS.fromPortablePath(e))}async statPromise(e){return await new Promise((t,r)=>{this.realFs.stat(A.cS.fromPortablePath(e),this.makeCallback(t,r))})}statSync(e){return this.realFs.statSync(A.cS.fromPortablePath(e))}async lstatPromise(e){return await new Promise((t,r)=>{this.realFs.lstat(A.cS.fromPortablePath(e),this.makeCallback(t,r))})}lstatSync(e){return this.realFs.lstatSync(A.cS.fromPortablePath(e))}async chmodPromise(e,t){return await new Promise((r,n)=>{this.realFs.chmod(A.cS.fromPortablePath(e),t,this.makeCallback(r,n))})}chmodSync(e,t){return this.realFs.chmodSync(A.cS.fromPortablePath(e),t)}async renamePromise(e,t){return await new Promise((r,n)=>{this.realFs.rename(A.cS.fromPortablePath(e),A.cS.fromPortablePath(t),this.makeCallback(r,n))})}renameSync(e,t){return this.realFs.renameSync(A.cS.fromPortablePath(e),A.cS.fromPortablePath(t))}async copyFilePromise(e,t,r=0){return await new Promise((n,i)=>{this.realFs.copyFile(A.cS.fromPortablePath(e),A.cS.fromPortablePath(t),r,this.makeCallback(n,i))})}copyFileSync(e,t,r=0){return this.realFs.copyFileSync(A.cS.fromPortablePath(e),A.cS.fromPortablePath(t),r)}async appendFilePromise(e,t,r){return await new Promise((n,i)=>{const o="string"==typeof e?A.cS.fromPortablePath(e):e;r?this.realFs.appendFile(o,t,r,this.makeCallback(n,i)):this.realFs.appendFile(o,t,this.makeCallback(n,i))})}appendFileSync(e,t,r){const n="string"==typeof e?A.cS.fromPortablePath(e):e;r?this.realFs.appendFileSync(n,t,r):this.realFs.appendFileSync(n,t)}async writeFilePromise(e,t,r){return await new Promise((n,i)=>{const o="string"==typeof e?A.cS.fromPortablePath(e):e;r?this.realFs.writeFile(o,t,r,this.makeCallback(n,i)):this.realFs.writeFile(o,t,this.makeCallback(n,i))})}writeFileSync(e,t,r){const n="string"==typeof e?A.cS.fromPortablePath(e):e;r?this.realFs.writeFileSync(n,t,r):this.realFs.writeFileSync(n,t)}async unlinkPromise(e){return await new Promise((t,r)=>{this.realFs.unlink(A.cS.fromPortablePath(e),this.makeCallback(t,r))})}unlinkSync(e){return this.realFs.unlinkSync(A.cS.fromPortablePath(e))}async utimesPromise(e,t,r){return await new Promise((n,i)=>{this.realFs.utimes(A.cS.fromPortablePath(e),t,r,this.makeCallback(n,i))})}utimesSync(e,t,r){this.realFs.utimesSync(A.cS.fromPortablePath(e),t,r)}async lutimesPromiseImpl(e,t,r){const n=this.realFs.lutimes;if(void 0===n)throw(0,s.bk)("unavailable Node binding",`lutimes '${e}'`);return await new Promise((i,o)=>{n.call(this.realFs,A.cS.fromPortablePath(e),t,r,this.makeCallback(i,o))})}lutimesSyncImpl(e,t,r){const n=this.realFs.lutimesSync;if(void 0===n)throw(0,s.bk)("unavailable Node binding",`lutimes '${e}'`);n.call(this.realFs,A.cS.fromPortablePath(e),t,r)}async mkdirPromise(e,t){return await new Promise((r,n)=>{this.realFs.mkdir(A.cS.fromPortablePath(e),t,this.makeCallback(r,n))})}mkdirSync(e,t){return this.realFs.mkdirSync(A.cS.fromPortablePath(e),t)}async rmdirPromise(e){return await new Promise((t,r)=>{this.realFs.rmdir(A.cS.fromPortablePath(e),this.makeCallback(t,r))})}rmdirSync(e){return this.realFs.rmdirSync(A.cS.fromPortablePath(e))}async symlinkPromise(e,t,r){const n=r||(e.endsWith("/")?"dir":"file");return await new Promise((r,i)=>{this.realFs.symlink(A.cS.fromPortablePath(e.replace(/\/+$/,"")),A.cS.fromPortablePath(t),n,this.makeCallback(r,i))})}symlinkSync(e,t,r){const n=r||(e.endsWith("/")?"dir":"file");return this.realFs.symlinkSync(A.cS.fromPortablePath(e.replace(/\/+$/,"")),A.cS.fromPortablePath(t),n)}async readFilePromise(e,t){return await new Promise((r,n)=>{const i="string"==typeof e?A.cS.fromPortablePath(e):e;this.realFs.readFile(i,t,this.makeCallback(r,n))})}readFileSync(e,t){const r="string"==typeof e?A.cS.fromPortablePath(e):e;return this.realFs.readFileSync(r,t)}async readdirPromise(e,{withFileTypes:t}={}){return await new Promise((r,n)=>{t?this.realFs.readdir(A.cS.fromPortablePath(e),{withFileTypes:!0},this.makeCallback(r,n)):this.realFs.readdir(A.cS.fromPortablePath(e),this.makeCallback(e=>r(e),n))})}readdirSync(e,{withFileTypes:t}={}){return t?this.realFs.readdirSync(A.cS.fromPortablePath(e),{withFileTypes:!0}):this.realFs.readdirSync(A.cS.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((t,r)=>{this.realFs.readlink(A.cS.fromPortablePath(e),this.makeCallback(t,r))}).then(e=>A.cS.toPortablePath(e))}readlinkSync(e){return A.cS.toPortablePath(this.realFs.readlinkSync(A.cS.fromPortablePath(e)))}watch(e,t,r){return this.realFs.watch(A.cS.fromPortablePath(e),t,r)}makeCallback(e,t){return(r,n)=>{r?t(r):e(n)}}}},39725:(e,t,r)=>{"use strict";r.d(t,{i:()=>o});var n=r(42096),i=r(46009);class o extends n.p{constructor(e){super(i.cS),this.baseFs=e}mapFromBase(e){return i.cS.fromPortablePath(e)}mapToBase(e){return i.cS.toPortablePath(e)}}},42096:(e,t,r)=>{"use strict";r.d(t,{p:()=>i});var n=r(35398);class i extends n.uY{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}openPromise(e,t,r){return this.baseFs.openPromise(this.mapToBase(e),t,r)}openSync(e,t,r){return this.baseFs.openSync(this.mapToBase(e),t,r)}async readPromise(e,t,r,n,i){return await this.baseFs.readPromise(e,t,r,n,i)}readSync(e,t,r,n,i){return this.baseFs.readSync(e,t,r,n,i)}async writePromise(e,t,r,n,i){return"string"==typeof t?await this.baseFs.writePromise(e,t,r):await this.baseFs.writePromise(e,t,r,n,i)}writeSync(e,t,r,n,i){return"string"==typeof t?this.baseFs.writeSync(e,t,r):this.baseFs.writeSync(e,t,r,n,i)}closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,t){return this.baseFs.createReadStream(null!==e?this.mapToBase(e):e,t)}createWriteStream(e,t){return this.baseFs.createWriteStream(null!==e?this.mapToBase(e):e,t)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,t){return this.baseFs.accessSync(this.mapToBase(e),t)}accessPromise(e,t){return this.baseFs.accessPromise(this.mapToBase(e),t)}statPromise(e){return this.baseFs.statPromise(this.mapToBase(e))}statSync(e){return this.baseFs.statSync(this.mapToBase(e))}lstatPromise(e){return this.baseFs.lstatPromise(this.mapToBase(e))}lstatSync(e){return this.baseFs.lstatSync(this.mapToBase(e))}chmodPromise(e,t){return this.baseFs.chmodPromise(this.mapToBase(e),t)}chmodSync(e,t){return this.baseFs.chmodSync(this.mapToBase(e),t)}renamePromise(e,t){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(t))}renameSync(e,t){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(t))}copyFilePromise(e,t,r=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(t),r)}copyFileSync(e,t,r=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(t),r)}appendFilePromise(e,t,r){return this.baseFs.appendFilePromise(this.fsMapToBase(e),t,r)}appendFileSync(e,t,r){return this.baseFs.appendFileSync(this.fsMapToBase(e),t,r)}writeFilePromise(e,t,r){return this.baseFs.writeFilePromise(this.fsMapToBase(e),t,r)}writeFileSync(e,t,r){return this.baseFs.writeFileSync(this.fsMapToBase(e),t,r)}unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}utimesPromise(e,t,r){return this.baseFs.utimesPromise(this.mapToBase(e),t,r)}utimesSync(e,t,r){return this.baseFs.utimesSync(this.mapToBase(e),t,r)}mkdirPromise(e,t){return this.baseFs.mkdirPromise(this.mapToBase(e),t)}mkdirSync(e,t){return this.baseFs.mkdirSync(this.mapToBase(e),t)}rmdirPromise(e){return this.baseFs.rmdirPromise(this.mapToBase(e))}rmdirSync(e){return this.baseFs.rmdirSync(this.mapToBase(e))}symlinkPromise(e,t,r){return this.baseFs.symlinkPromise(this.mapToBase(e),this.mapToBase(t),r)}symlinkSync(e,t,r){return this.baseFs.symlinkSync(this.mapToBase(e),this.mapToBase(t),r)}readFilePromise(e,t){return this.baseFs.readFilePromise(this.fsMapToBase(e),t)}readFileSync(e,t){return this.baseFs.readFileSync(this.fsMapToBase(e),t)}async readdirPromise(e,{withFileTypes:t}={}){return this.baseFs.readdirPromise(this.mapToBase(e),{withFileTypes:t})}readdirSync(e,{withFileTypes:t}={}){return this.baseFs.readdirSync(this.mapToBase(e),{withFileTypes:t})}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}watch(e,t,r){return this.baseFs.watch(this.mapToBase(e),t,r)}fsMapToBase(e){return"number"==typeof e?e:this.mapToBase(e)}}},17674:(e,t,r)=>{"use strict";r.d(t,{p:()=>c});var n=r(78420),i=r(42096),o=r(46009);const s=/^[0-9]+$/,A=/^(\/(?:[^/]+\/)*?\$\$virtual)((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,a=/^([^/]+-)?[a-f0-9]+$/;class c extends i.p{constructor({baseFs:e=new n.S}={}){super(o.y1),this.baseFs=e}static makeVirtualPath(e,t,r){if("$$virtual"!==o.y1.basename(e))throw new Error('Assertion failed: Virtual folders must be named "$$virtual"');if(!o.y1.basename(t).match(a))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");const n=o.y1.relative(o.y1.dirname(e),r).split("/");let i=0;for(;i{"use strict";r.d(t,{k:()=>u,d:()=>g});var n=r(35747),i=r(92413),o=r(31669),s=r(35398),A=r(78420),a=r(26984),c=r(46009);const u="mixed";class l{constructor(){this.dev=0,this.ino=0,this.mode=0,this.nlink=1,this.rdev=0,this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return 16384==(61440&this.mode)}isFIFO(){return!1}isFile(){return 32768==(61440&this.mode)}isSocket(){return!1}isSymbolicLink(){return 40960==(61440&this.mode)}}function h(){return Object.assign(new l,{uid:0,gid:0,size:0,blksize:0,atimeMs:0,mtimeMs:0,ctimeMs:0,birthtimeMs:0,atime:new Date(0),mtime:new Date(0),ctime:new Date(0),birthtime:new Date(0),mode:33188})}class g extends s.fS{constructor(e,t){super(),this.lzSource=null,this.listings=new Map,this.entries=new Map,this.fds=new Map,this.nextFd=0,this.ready=!1,this.readOnly=!1,this.libzip=t.libzip;const r=t;if(this.level=void 0!==r.level?r.level:u,null===e&&(e=Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])),"string"==typeof e){const{baseFs:t=new A.S}=r;this.baseFs=t,this.path=e}else this.path=null,this.baseFs=null;if(t.stats)this.stats=t.stats;else if("string"==typeof e)try{this.stats=this.baseFs.statSync(e)}catch(e){if("ENOENT"!==e.code||!r.create)throw e;this.stats=h()}else this.stats=h();const n=this.libzip.malloc(4);try{let i=0;if("string"==typeof e&&r.create&&(i|=this.libzip.ZIP_CREATE|this.libzip.ZIP_TRUNCATE),t.readOnly&&(i|=this.libzip.ZIP_RDONLY,this.readOnly=!0),"string"==typeof e)this.zip=this.libzip.open(c.cS.fromPortablePath(e),i,n);else{const t=this.allocateUnattachedSource(e);try{this.zip=this.libzip.openFromSource(t,i,n),this.lzSource=t}catch(e){throw this.libzip.source.free(t),e}}if(0===this.zip){const e=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(e,this.libzip.getValue(n,"i32")),new Error(this.libzip.error.strerror(e))}}finally{this.libzip.free(n)}this.listings.set(c.LZ.root,new Set);const i=this.libzip.getNumEntries(this.zip,0);for(let e=0;ee)throw new Error("Overread");const n=this.libzip.HEAPU8.subarray(t,t+e);return Buffer.from(n)}finally{this.libzip.free(t)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}saveAndClose(){if(!this.path||!this.baseFs)throw new Error("ZipFS cannot be saved and must be discarded when loaded from a buffer");if(!this.ready)throw a.Vw("archive closed, close");if(this.readOnly)return void this.discardAndClose();const e=this.baseFs.existsSync(this.path)?511&this.baseFs.statSync(this.path).mode:null;if(-1===this.libzip.close(this.zip))throw new Error(this.libzip.error.strerror(this.libzip.getError(this.zip)));null===e?this.baseFs.chmodSync(this.path,this.stats.mode):e!==(511&this.baseFs.statSync(this.path).mode)&&this.baseFs.chmodSync(this.path,e),this.ready=!1}discardAndClose(){if(!this.ready)throw a.Vw("archive closed, close");this.libzip.discard(this.zip),this.ready=!1}resolve(e){return c.y1.resolve(c.LZ.root,e)}async openPromise(e,t,r){return this.openSync(e,t,r)}openSync(e,t,r){const n=this.nextFd++;return this.fds.set(n,{cursor:0,p:e}),n}async readPromise(e,t,r,n,i){return this.readSync(e,t,r,n,i)}readSync(e,t,r=0,n=0,i=-1){const o=this.fds.get(e);if(void 0===o)throw a.Ch("read");let s;s=-1===i||null===i?o.cursor:i;const A=this.readFileSync(o.p);A.copy(t,r,s,s+n);const c=Math.max(0,Math.min(A.length-s,n));return-1!==i&&null!==i||(o.cursor+=c),c}async writePromise(e,t,r,n,i){return"string"==typeof t?this.writeSync(e,t,i):this.writeSync(e,t,r,n,i)}writeSync(e,t,r,n,i){if(void 0===this.fds.get(e))throw a.Ch("read");throw new Error("Unimplemented")}async closePromise(e){return this.closeSync(e)}closeSync(e){if(void 0===this.fds.get(e))throw a.Ch("read");this.fds.delete(e)}createReadStream(e,{encoding:t}={}){if(null===e)throw new Error("Unimplemented");const r=Object.assign(new i.PassThrough,{bytesRead:0,path:e,close:()=>{clearImmediate(n)}}),n=setImmediate(()=>{try{const n=this.readFileSync(e,t);r.bytesRead=n.length,r.write(n),r.end()}catch(e){r.emit("error",e),r.end()}});return r}createWriteStream(e,{encoding:t}={}){if(this.readOnly)throw a.YW(`open '${e}'`);if(null===e)throw new Error("Unimplemented");const r=Object.assign(new i.PassThrough,{bytesWritten:0,path:e,close:()=>{r.end()}}),n=[];return r.on("data",e=>{const t=Buffer.from(e);r.bytesWritten+=t.length,n.push(t)}),r.on("end",()=>{this.writeFileSync(e,Buffer.concat(n),t)}),r}async realpathPromise(e){return this.realpathSync(e)}realpathSync(e){const t=this.resolveFilename(`lstat '${e}'`,e);if(!this.entries.has(t)&&!this.listings.has(t))throw a.z6(`lstat '${e}'`);return t}async existsPromise(e){return this.existsSync(e)}existsSync(e){if(!this.ready)throw a.Vw(`archive closed, existsSync '${e}'`);if(0===this.symlinkCount){const t=c.y1.resolve(c.LZ.root,e);return this.entries.has(t)||this.listings.has(t)}let t;try{t=this.resolveFilename(`stat '${e}'`,e)}catch(e){return!1}return this.entries.has(t)||this.listings.has(t)}async accessPromise(e,t){return this.accessSync(e,t)}accessSync(e,t=n.constants.F_OK){const r=this.resolveFilename(`access '${e}'`,e);if(!this.entries.has(r)&&!this.listings.has(r))throw a.z6(`access '${e}'`);if(this.readOnly&&t&n.constants.W_OK)throw a.YW(`access '${e}'`)}async statPromise(e){return this.statSync(e)}statSync(e){const t=this.resolveFilename(`stat '${e}'`,e);if(!this.entries.has(t)&&!this.listings.has(t))throw a.z6(`stat '${e}'`);if("/"===e[e.length-1]&&!this.listings.has(t))throw a.Ab(`stat '${e}'`);return this.statImpl(`stat '${e}'`,t)}async lstatPromise(e){return this.lstatSync(e)}lstatSync(e){const t=this.resolveFilename(`lstat '${e}'`,e,!1);if(!this.entries.has(t)&&!this.listings.has(t))throw a.z6(`lstat '${e}'`);if("/"===e[e.length-1]&&!this.listings.has(t))throw a.Ab(`lstat '${e}'`);return this.statImpl(`lstat '${e}'`,t)}statImpl(e,t){const r=this.entries.get(t);if(void 0!==r){const e=this.libzip.struct.statS();if(-1===this.libzip.statIndex(this.zip,r,0,0,e))throw new Error(this.libzip.error.strerror(this.libzip.getError(this.zip)));const n=this.stats.uid,i=this.stats.gid,o=this.libzip.struct.statSize(e)>>>0,s=512,A=Math.ceil(o/s),a=1e3*(this.libzip.struct.statMtime(e)>>>0),c=a,u=a,h=a,g=new Date(c),f=new Date(u),p=new Date(h),d=new Date(a),C=this.listings.has(t)?16384:this.isSymbolicLink(r)?40960:32768,E=16384===C?493:420,I=C|511&this.getUnixMode(r,E);return Object.assign(new l,{uid:n,gid:i,size:o,blksize:s,blocks:A,atime:g,birthtime:f,ctime:p,mtime:d,atimeMs:c,birthtimeMs:u,ctimeMs:h,mtimeMs:a,mode:I})}if(this.listings.has(t)){const e=this.stats.uid,t=this.stats.gid,r=0,n=512,i=0,o=this.stats.mtimeMs,s=this.stats.mtimeMs,A=this.stats.mtimeMs,a=this.stats.mtimeMs,c=new Date(o),u=new Date(s),h=new Date(A),g=new Date(a),f=16877;return Object.assign(new l,{uid:e,gid:t,size:r,blksize:n,blocks:i,atime:c,birthtime:u,ctime:h,mtime:g,atimeMs:o,birthtimeMs:s,ctimeMs:A,mtimeMs:a,mode:f})}throw new Error("Unreachable")}getUnixMode(e,t){if(-1===this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S))throw new Error(this.libzip.error.strerror(this.libzip.getError(this.zip)));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?t:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(e){let t=this.listings.get(e);if(t)return t;const r=this.registerListing(c.y1.dirname(e));return t=new Set,r.add(c.y1.basename(e)),this.listings.set(e,t),t}registerEntry(e,t){this.registerListing(c.y1.dirname(e)).add(c.y1.basename(e)),this.entries.set(e,t)}resolveFilename(e,t,r=!0){if(!this.ready)throw a.Vw("archive closed, "+e);let n=c.y1.resolve(c.LZ.root,t);if("/"===n)return c.LZ.root;const i=this.entries.get(n);if(r&&void 0!==i){if(0!==this.symlinkCount&&this.isSymbolicLink(i)){const t=this.getFileSource(i).toString();return this.resolveFilename(e,c.y1.resolve(c.y1.dirname(n),t),!0)}return n}for(;;){const t=this.resolveFilename(e,c.y1.dirname(n),!0),i=this.listings.has(t),o=this.entries.has(t);if(!i&&!o)throw a.z6(e);if(!i)throw a.Ab(e);if(n=c.y1.resolve(t,c.y1.basename(n)),!r||0===this.symlinkCount)break;const s=this.libzip.name.locate(this.zip,n.slice(1));if(-1===s)break;if(!this.isSymbolicLink(s))break;{const e=this.getFileSource(s).toString();n=c.y1.resolve(c.y1.dirname(n),e)}}return n}allocateBuffer(e){Buffer.isBuffer(e)||(e=Buffer.from(e));const t=this.libzip.malloc(e.byteLength);if(!t)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,t,e.byteLength).set(e),{buffer:t,byteLength:e.byteLength}}allocateUnattachedSource(e){const t=this.libzip.struct.errorS(),{buffer:r,byteLength:n}=this.allocateBuffer(e),i=this.libzip.source.fromUnattachedBuffer(r,n,0,!0,t);if(0===i)throw this.libzip.free(t),new Error(this.libzip.error.strerror(t));return i}allocateSource(e){const{buffer:t,byteLength:r}=this.allocateBuffer(e),n=this.libzip.source.fromBuffer(this.zip,t,r,0,!0);if(0===n)throw this.libzip.free(t),new Error(this.libzip.error.strerror(this.libzip.getError(this.zip)));return n}setFileSource(e,t){const r=c.y1.relative(c.LZ.root,e),n=this.allocateSource(t);try{const e=this.libzip.file.add(this.zip,r,n,this.libzip.ZIP_FL_OVERWRITE);if("mixed"!==this.level){let t;t=0===this.level?this.libzip.ZIP_CM_STORE:this.libzip.ZIP_CM_DEFLATE;if(-1===this.libzip.file.setCompression(this.zip,e,0,t,this.level))throw new Error(this.libzip.error.strerror(this.libzip.getError(this.zip)))}return e}catch(e){throw this.libzip.source.free(n),e}}isSymbolicLink(e){if(0===this.symlinkCount)return!1;if(-1===this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S))throw new Error(this.libzip.error.strerror(this.libzip.getError(this.zip)));if(this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX)return!1;return 40960==(61440&this.libzip.getValue(this.libzip.uint32S,"i32")>>>16)}getFileSource(e){const t=this.libzip.struct.statS();if(-1===this.libzip.statIndex(this.zip,e,0,0,t))throw new Error(this.libzip.error.strerror(this.libzip.getError(this.zip)));const r=this.libzip.struct.statSize(t),n=this.libzip.malloc(r);try{const t=this.libzip.fopenIndex(this.zip,e,0,0);if(0===t)throw new Error(this.libzip.error.strerror(this.libzip.getError(this.zip)));try{const e=this.libzip.fread(t,n,r,0);if(-1===e)throw new Error(this.libzip.error.strerror(this.libzip.file.getError(t)));if(er)throw new Error("Overread");const i=this.libzip.HEAPU8.subarray(n,n+r);return Buffer.from(i)}finally{this.libzip.fclose(t)}}finally{this.libzip.free(n)}}async chmodPromise(e,t){return this.chmodSync(e,t)}chmodSync(e,t){if(this.readOnly)throw a.YW(`chmod '${e}'`);t&=493;const r=this.resolveFilename(`chmod '${e}'`,e,!1),n=this.entries.get(r);if(void 0===n)throw new Error(`Assertion failed: The entry should have been registered (${r})`);const i=-512&this.getUnixMode(n,32768)|t;if(-1===this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,i<<16))throw new Error(this.libzip.error.strerror(this.libzip.getError(this.zip)))}async renamePromise(e,t){return this.renameSync(e,t)}renameSync(e,t){throw new Error("Unimplemented")}async copyFilePromise(e,t,r){return this.copyFileSync(e,t,r)}copyFileSync(e,t,r=0){if(this.readOnly)throw a.YW(`copyfile '${e} -> '${t}'`);if(0!=(r&n.constants.COPYFILE_FICLONE_FORCE))throw a.bk("unsupported clone operation",`copyfile '${e}' -> ${t}'`);const i=this.resolveFilename(`copyfile '${e} -> ${t}'`,e),o=this.entries.get(i);if(void 0===o)throw a.hq(`copyfile '${e}' -> '${t}'`);const s=this.resolveFilename(`copyfile '${e}' -> ${t}'`,t),A=this.entries.get(s);if(0!=(r&(n.constants.COPYFILE_EXCL|n.constants.COPYFILE_FICLONE_FORCE))&&void 0!==A)throw a.cT(`copyfile '${e}' -> '${t}'`);const c=this.getFileSource(o),u=this.setFileSource(s,c);u!==A&&this.registerEntry(s,u)}async appendFilePromise(e,t,r){return this.appendFileSync(e,t,r)}appendFileSync(e,t,r={}){if(this.readOnly)throw a.YW(`open '${e}'`);return void 0===r?r={flag:"a"}:"string"==typeof r?r={flag:"a",encoding:r}:void 0===r.flag&&(r={flag:"a",...r}),this.writeFileSync(e,t,r)}async writeFilePromise(e,t,r){return this.writeFileSync(e,t,r)}writeFileSync(e,t,r){if("string"!=typeof e)throw a.Ch("read");if(this.readOnly)throw a.YW(`open '${e}'`);const n=this.resolveFilename(`open '${e}'`,e);if(this.listings.has(n))throw a.GA(`open '${e}'`);const i=this.entries.get(n);void 0!==i&&"object"==typeof r&&r.flag&&r.flag.includes("a")&&(t=Buffer.concat([this.getFileSource(i),Buffer.from(t)]));let o=null;"string"==typeof r?o=r:"object"==typeof r&&r.encoding&&(o=r.encoding),null!==o&&(t=t.toString(o));const s=this.setFileSource(n,t);s!==i&&this.registerEntry(n,s)}async unlinkPromise(e){return this.unlinkSync(e)}unlinkSync(e){throw new Error("Unimplemented")}async utimesPromise(e,t,r){return this.utimesSync(e,t,r)}utimesSync(e,t,r){if(this.readOnly)throw a.YW(`utimes '${e}'`);const n=this.resolveFilename(`utimes '${e}'`,e);this.utimesImpl(n,r)}async lutimesPromise(e,t,r){return this.lutimesSync(e,t,r)}lutimesSync(e,t,r){if(this.readOnly)throw a.YW(`lutimes '${e}'`);const n=this.resolveFilename(`utimes '${e}'`,e,!1);this.utimesImpl(n,r)}utimesImpl(e,t){this.listings.has(e)&&(this.entries.has(e)||this.hydrateDirectory(e));const r=this.entries.get(e);if(void 0===r)throw new Error("Unreachable");if(-1===this.libzip.file.setMtime(this.zip,r,0,function(e){if("string"==typeof e&&String(+e)===e)return+e;if(Number.isFinite(e))return e<0?Date.now()/1e3:e;if((0,o.isDate)(e))return e.getTime()/1e3;throw new Error("Invalid time")}(t),0))throw new Error(this.libzip.error.strerror(this.libzip.getError(this.zip)))}async mkdirPromise(e,t){return this.mkdirSync(e,t)}mkdirSync(e,{mode:t=493,recursive:r=!1}={}){if(r)return void this.mkdirpSync(e,{chmod:t});if(this.readOnly)throw a.YW(`mkdir '${e}'`);const n=this.resolveFilename(`mkdir '${e}'`,e);if(this.entries.has(n)||this.listings.has(n))throw a.cT(`mkdir '${e}'`);this.hydrateDirectory(n),this.chmodSync(n,t)}async rmdirPromise(e){return this.rmdirSync(e)}rmdirSync(e){throw new Error("Unimplemented")}hydrateDirectory(e){const t=this.libzip.dir.add(this.zip,c.y1.relative(c.LZ.root,e));if(-1===t)throw new Error(this.libzip.error.strerror(this.libzip.getError(this.zip)));return this.registerListing(e),this.registerEntry(e,t),t}async symlinkPromise(e,t){return this.symlinkSync(e,t)}symlinkSync(e,t){if(this.readOnly)throw a.YW(`symlink '${e}' -> '${t}'`);const r=this.resolveFilename(`symlink '${e}' -> '${t}'`,t);if(this.listings.has(r))throw a.GA(`symlink '${e}' -> '${t}'`);if(this.entries.has(r))throw a.cT(`symlink '${e}' -> '${t}'`);const n=this.setFileSource(r,e);this.registerEntry(r,n);if(-1===this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,41471<<16))throw new Error(this.libzip.error.strerror(this.libzip.getError(this.zip)));this.symlinkCount+=1}async readFilePromise(e,t){switch(t){case"utf8":default:return this.readFileSync(e,t)}}readFileSync(e,t){if("string"!=typeof e)throw a.Ch("read");"object"==typeof t&&(t=t?t.encoding:void 0);const r=this.resolveFilename(`open '${e}'`,e);if(!this.entries.has(r)&&!this.listings.has(r))throw a.z6(`open '${e}'`);if("/"===e[e.length-1]&&!this.listings.has(r))throw a.Ab(`open '${e}'`);if(this.listings.has(r))throw a.GA("read");const n=this.entries.get(r);if(void 0===n)throw new Error("Unreachable");const i=this.getFileSource(n);return t?i.toString(t):i}async readdirPromise(e,{withFileTypes:t}={}){return this.readdirSync(e,{withFileTypes:t})}readdirSync(e,{withFileTypes:t}={}){const r=this.resolveFilename(`scandir '${e}'`,e);if(!this.entries.has(r)&&!this.listings.has(r))throw a.z6(`scandir '${e}'`);const n=this.listings.get(r);if(!n)throw a.Ab(`scandir '${e}'`);const i=[...n];return t?i.map(t=>Object.assign(this.statImpl("lstat",c.y1.join(e,t)),{name:t})):i}async readlinkPromise(e){return this.readlinkSync(e)}readlinkSync(e){const t=this.resolveFilename(`readlink '${e}'`,e,!1);if(!this.entries.has(t)&&!this.listings.has(t))throw a.z6(`readlink '${e}'`);if("/"===e[e.length-1]&&!this.listings.has(t))throw a.Ab(`open '${e}'`);if(this.listings.has(t))throw a.hq(`readlink '${e}'`);const r=this.entries.get(t);if(void 0===r)throw new Error("Unreachable");if(-1===this.libzip.file.getExternalAttributes(this.zip,r,0,0,this.libzip.uint08S,this.libzip.uint32S))throw new Error(this.libzip.error.strerror(this.libzip.getError(this.zip)));if(this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX)throw a.hq(`readlink '${e}'`);if(40960!=(61440&this.libzip.getValue(this.libzip.uint32S,"i32")>>>16))throw a.hq(`readlink '${e}'`);return this.getFileSource(r).toString()}watch(e,t,r){let n;switch(typeof t){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=t)}if(!n)return{on:()=>{},close:()=>{}};const i=setInterval(()=>{},864e5);return{on:()=>{},close:()=>{clearInterval(i)}}}}},53660:(e,t,r)=>{"use strict";r.d(t,{A:()=>u});var n=r(35747),i=r(35398),o=r(78420),s=r(90739),A=r(46009);const a=2147483648,c=/.*?(?await this.baseFs.openPromise(e,t,r),async(e,{subPath:n})=>this.remapFd(e,await e.openPromise(n,t,r)))}openSync(e,t,r){return this.makeCallSync(e,()=>this.baseFs.openSync(e,t,r),(e,{subPath:n})=>this.remapFd(e,e.openSync(n,t,r)))}async readPromise(e,t,r,n,i){if(0==(e&a))return await this.baseFs.readPromise(e,t,r,n,i);const o=this.fdMap.get(e);if(void 0===o)throw Object.assign(new Error("EBADF: bad file descriptor, read"),{code:"EBADF"});const[s,A]=o;return await s.readPromise(A,t,r,n,i)}readSync(e,t,r,n,i){if(0==(e&a))return this.baseFs.readSync(e,t,r,n,i);const o=this.fdMap.get(e);if(void 0===o)throw Object.assign(new Error("EBADF: bad file descriptor, read"),{code:"EBADF"});const[s,A]=o;return s.readSync(A,t,r,n,i)}async writePromise(e,t,r,n,i){if(0==(e&a))return"string"==typeof t?await this.baseFs.writePromise(e,t,r):await this.baseFs.writePromise(e,t,r,n,i);const o=this.fdMap.get(e);if(void 0===o)throw Object.assign(new Error("EBADF: bad file descriptor, write"),{code:"EBADF"});const[s,A]=o;return"string"==typeof t?await s.writePromise(A,t,r):await s.writePromise(A,t,r,n,i)}writeSync(e,t,r,n,i){if(0==(e&a))return"string"==typeof t?this.baseFs.writeSync(e,t,r):this.baseFs.writeSync(e,t,r,n,i);const o=this.fdMap.get(e);if(void 0===o)throw Object.assign(new Error("EBADF: bad file descriptor, write"),{code:"EBADF"});const[s,A]=o;return"string"==typeof t?s.writeSync(A,t,r):s.writeSync(A,t,r,n,i)}async closePromise(e){if(0==(e&a))return await this.baseFs.closePromise(e);const t=this.fdMap.get(e);if(void 0===t)throw Object.assign(new Error("EBADF: bad file descriptor, close"),{code:"EBADF"});this.fdMap.delete(e);const[r,n]=t;return await r.closePromise(n)}closeSync(e){if(0==(e&a))return this.baseFs.closeSync(e);const t=this.fdMap.get(e);if(void 0===t)throw Object.assign(new Error("EBADF: bad file descriptor, close"),{code:"EBADF"});this.fdMap.delete(e);const[r,n]=t;return r.closeSync(n)}createReadStream(e,t){return null===e?this.baseFs.createReadStream(e,t):this.makeCallSync(e,()=>this.baseFs.createReadStream(e,t),(e,{subPath:r})=>e.createReadStream(r,t))}createWriteStream(e,t){return null===e?this.baseFs.createWriteStream(e,t):this.makeCallSync(e,()=>this.baseFs.createWriteStream(e,t),(e,{subPath:r})=>e.createWriteStream(r,t))}async realpathPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.realpathPromise(e),async(e,{archivePath:t,subPath:r})=>this.pathUtils.resolve(await this.baseFs.realpathPromise(t),this.pathUtils.relative(A.LZ.root,await e.realpathPromise(r))))}realpathSync(e){return this.makeCallSync(e,()=>this.baseFs.realpathSync(e),(e,{archivePath:t,subPath:r})=>this.pathUtils.resolve(this.baseFs.realpathSync(t),this.pathUtils.relative(A.LZ.root,e.realpathSync(r))))}async existsPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.existsPromise(e),async(e,{subPath:t})=>await e.existsPromise(t))}existsSync(e){return this.makeCallSync(e,()=>this.baseFs.existsSync(e),(e,{subPath:t})=>e.existsSync(t))}async accessPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.accessPromise(e,t),async(e,{subPath:r})=>await e.accessPromise(r,t))}accessSync(e,t){return this.makeCallSync(e,()=>this.baseFs.accessSync(e,t),(e,{subPath:r})=>e.accessSync(r,t))}async statPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.statPromise(e),async(e,{subPath:t})=>await e.statPromise(t))}statSync(e){return this.makeCallSync(e,()=>this.baseFs.statSync(e),(e,{subPath:t})=>e.statSync(t))}async lstatPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.lstatPromise(e),async(e,{subPath:t})=>await e.lstatPromise(t))}lstatSync(e){return this.makeCallSync(e,()=>this.baseFs.lstatSync(e),(e,{subPath:t})=>e.lstatSync(t))}async chmodPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.chmodPromise(e,t),async(e,{subPath:r})=>await e.chmodPromise(r,t))}chmodSync(e,t){return this.makeCallSync(e,()=>this.baseFs.chmodSync(e,t),(e,{subPath:r})=>e.chmodSync(r,t))}async renamePromise(e,t){return await this.makeCallPromise(e,async()=>await this.makeCallPromise(t,async()=>await this.baseFs.renamePromise(e,t),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(e,{subPath:r})=>await this.makeCallPromise(t,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(t,{subPath:n})=>{if(e!==t)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await e.renamePromise(r,n)}))}renameSync(e,t){return this.makeCallSync(e,()=>this.makeCallSync(t,()=>this.baseFs.renameSync(e,t),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(e,{subPath:r})=>this.makeCallSync(t,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(t,{subPath:n})=>{if(e!==t)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return e.renameSync(r,n)}))}async copyFilePromise(e,t,r=0){const i=async(e,t,i,o)=>{if(0!=(r&n.constants.COPYFILE_FICLONE_FORCE))throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${t}' -> ${o}'`),{code:"EXDEV"});if(r&n.constants.COPYFILE_EXCL&&await this.existsPromise(t))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${t}' -> '${o}'`),{code:"EEXIST"});let s;try{s=await e.readFilePromise(t)}catch(e){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${t}' -> '${o}'`),{code:"EINVAL"})}await i.writeFilePromise(o,s)};return await this.makeCallPromise(e,async()=>await this.makeCallPromise(t,async()=>await this.baseFs.copyFilePromise(e,t,r),async(t,{subPath:r})=>await i(this.baseFs,e,t,r)),async(e,{subPath:n})=>await this.makeCallPromise(t,async()=>await i(e,n,this.baseFs,t),async(t,{subPath:o})=>e!==t?await i(e,n,t,o):await e.copyFilePromise(n,o,r)))}copyFileSync(e,t,r=0){const i=(e,t,i,o)=>{if(0!=(r&n.constants.COPYFILE_FICLONE_FORCE))throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${t}' -> ${o}'`),{code:"EXDEV"});if(r&n.constants.COPYFILE_EXCL&&this.existsSync(t))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${t}' -> '${o}'`),{code:"EEXIST"});let s;try{s=e.readFileSync(t)}catch(e){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${t}' -> '${o}'`),{code:"EINVAL"})}i.writeFileSync(o,s)};return this.makeCallSync(e,()=>this.makeCallSync(t,()=>this.baseFs.copyFileSync(e,t,r),(t,{subPath:r})=>i(this.baseFs,e,t,r)),(e,{subPath:n})=>this.makeCallSync(t,()=>i(e,n,this.baseFs,t),(t,{subPath:o})=>e!==t?i(e,n,t,o):e.copyFileSync(n,o,r)))}async appendFilePromise(e,t,r){return await this.makeCallPromise(e,async()=>await this.baseFs.appendFilePromise(e,t,r),async(e,{subPath:n})=>await e.appendFilePromise(n,t,r))}appendFileSync(e,t,r){return this.makeCallSync(e,()=>this.baseFs.appendFileSync(e,t,r),(e,{subPath:n})=>e.appendFileSync(n,t,r))}async writeFilePromise(e,t,r){return await this.makeCallPromise(e,async()=>await this.baseFs.writeFilePromise(e,t,r),async(e,{subPath:n})=>await e.writeFilePromise(n,t,r))}writeFileSync(e,t,r){return this.makeCallSync(e,()=>this.baseFs.writeFileSync(e,t,r),(e,{subPath:n})=>e.writeFileSync(n,t,r))}async unlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.unlinkPromise(e),async(e,{subPath:t})=>await e.unlinkPromise(t))}unlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.unlinkSync(e),(e,{subPath:t})=>e.unlinkSync(t))}async utimesPromise(e,t,r){return await this.makeCallPromise(e,async()=>await this.baseFs.utimesPromise(e,t,r),async(e,{subPath:n})=>await e.utimesPromise(n,t,r))}utimesSync(e,t,r){return this.makeCallSync(e,()=>this.baseFs.utimesSync(e,t,r),(e,{subPath:n})=>e.utimesSync(n,t,r))}async mkdirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.mkdirPromise(e,t),async(e,{subPath:r})=>await e.mkdirPromise(r,t))}mkdirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.mkdirSync(e,t),(e,{subPath:r})=>e.mkdirSync(r,t))}async rmdirPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.rmdirPromise(e),async(e,{subPath:t})=>await e.rmdirPromise(t))}rmdirSync(e){return this.makeCallSync(e,()=>this.baseFs.rmdirSync(e),(e,{subPath:t})=>e.rmdirSync(t))}async symlinkPromise(e,t,r){return await this.makeCallPromise(t,async()=>await this.baseFs.symlinkPromise(e,t,r),async(t,{subPath:r})=>await t.symlinkPromise(e,r))}symlinkSync(e,t,r){return this.makeCallSync(t,()=>this.baseFs.symlinkSync(e,t,r),(t,{subPath:r})=>t.symlinkSync(e,r))}async readFilePromise(e,t){return this.makeCallPromise(e,async()=>{switch(t){case"utf8":default:return await this.baseFs.readFilePromise(e,t)}},async(e,{subPath:r})=>await e.readFilePromise(r,t))}readFileSync(e,t){return this.makeCallSync(e,()=>{switch(t){case"utf8":default:return this.baseFs.readFileSync(e,t)}},(e,{subPath:r})=>e.readFileSync(r,t))}async readdirPromise(e,{withFileTypes:t}={}){return await this.makeCallPromise(e,async()=>await this.baseFs.readdirPromise(e,{withFileTypes:t}),async(e,{subPath:r})=>await e.readdirPromise(r,{withFileTypes:t}),{requireSubpath:!1})}readdirSync(e,{withFileTypes:t}={}){return this.makeCallSync(e,()=>this.baseFs.readdirSync(e,{withFileTypes:t}),(e,{subPath:r})=>e.readdirSync(r,{withFileTypes:t}),{requireSubpath:!1})}async readlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.readlinkPromise(e),async(e,{subPath:t})=>await e.readlinkPromise(t))}readlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.readlinkSync(e),(e,{subPath:t})=>e.readlinkSync(t))}watch(e,t,r){return this.makeCallSync(e,()=>this.baseFs.watch(e,t,r),(e,{subPath:n})=>e.watch(n,t,r))}async makeCallPromise(e,t,r,{requireSubpath:n=!0}={}){if("string"!=typeof e)return await t();const i=this.resolve(e),o=this.findZip(i);return o?n&&"/"===o.subPath?await t():await this.getZipPromise(o.archivePath,async e=>await r(e,o)):await t()}makeCallSync(e,t,r,{requireSubpath:n=!0}={}){if("string"!=typeof e)return t();const i=this.resolve(e),o=this.findZip(i);return o?n&&"/"===o.subPath?t():this.getZipSync(o.archivePath,e=>r(e,o)):t()}findZip(e){if(this.filter&&!this.filter.test(e))return null;let t="";for(;;){const r=c.exec(e.substr(t.length));if(!r)return null;if(t=this.pathUtils.join(t,r[0]),!1===this.isZip.has(t)){if(this.notZip.has(t))continue;try{if(!this.baseFs.lstatSync(t).isFile()){this.notZip.add(t);continue}}catch(e){return null}this.isZip.add(t)}return{archivePath:t,subPath:this.pathUtils.resolve(A.LZ.root,e.substr(t.length))}}}limitOpenFiles(e){if(null===this.zipInstances)return;let t=this.zipInstances.size-e;for(const[e,r]of this.zipInstances.entries()){if(t<=0)break;r.saveAndClose(),this.zipInstances.delete(e),t-=1}}async getZipPromise(e,t){const r=async()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:await this.baseFs.statPromise(e)});if(this.zipInstances){let n=this.zipInstances.get(e);if(!n){const t=await r();n=this.zipInstances.get(e),n||(n=new s.d(e,t))}return this.zipInstances.delete(e),this.zipInstances.set(e,n),this.limitOpenFiles(this.maxOpenFiles),await t(n)}{const n=new s.d(e,await r());try{return await t(n)}finally{n.saveAndClose()}}}getZipSync(e,t){const r=()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:this.baseFs.statSync(e)});if(this.zipInstances){let n=this.zipInstances.get(e);return n||(n=new s.d(e,r())),this.zipInstances.delete(e),this.zipInstances.set(e,n),this.limitOpenFiles(this.maxOpenFiles),t(n)}{const n=new s.d(e,r());try{return t(n)}finally{n.saveAndClose()}}}}},26984:(e,t,r)=>{"use strict";function n(e,t){return Object.assign(new Error(`${e}: ${t}`),{code:e})}function i(e){return n("EBUSY",e)}function o(e,t){return n("ENOSYS",`${e}, ${t}`)}function s(e){return n("EINVAL","invalid argument, "+e)}function A(e){return n("EBADF","bad file descriptor, "+e)}function a(e){return n("ENOENT","no such file or directory, "+e)}function c(e){return n("ENOTDIR","not a directory, "+e)}function u(e){return n("EISDIR","illegal operation on a directory, "+e)}function l(e){return n("EEXIST","file already exists, "+e)}function h(e){return n("EROFS","read-only filesystem, "+e)}r.d(t,{Vw:()=>i,bk:()=>o,hq:()=>s,Ch:()=>A,z6:()=>a,Ab:()=>c,GA:()=>u,cT:()=>l,YW:()=>h})},56537:(e,t,r)=>{"use strict";r.r(t),r.d(t,{normalizeLineEndings:()=>a.qH,DEFAULT_COMPRESSION_LEVEL:()=>c.k,PortablePath:()=>A.LZ,Filename:()=>A.QS,npath:()=>A.cS,ppath:()=>A.y1,toFilename:()=>A.Zu,AliasFS:()=>u.K,FakeFS:()=>a.uY,CwdFS:()=>l.M,JailFS:()=>h.n,LazyFS:()=>g.v,NoFS:()=>p,NodeFS:()=>s.S,PosixFS:()=>d.i,ProxiedFS:()=>C.p,VirtualFS:()=>E.p,ZipFS:()=>c.d,ZipOpenFS:()=>I.A,patchFs:()=>y,extendFs:()=>w,xfs:()=>D});var n=r(12087),i=r.n(n),o=r(31669),s=r(78420),A=r(46009),a=r(35398),c=r(90739),u=r(14626),l=r(75448),h=r(10489),g=r(15037);const f=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"});class p extends a.uY{constructor(){super(A.y1)}getExtractHint(){throw f()}getRealPath(){throw f()}resolve(){throw f()}async openPromise(){throw f()}openSync(){throw f()}async readPromise(){throw f()}readSync(){throw f()}async writePromise(){throw f()}writeSync(){throw f()}async closePromise(){throw f()}closeSync(){throw f()}createWriteStream(){throw f()}createReadStream(){throw f()}async realpathPromise(){throw f()}realpathSync(){throw f()}async readdirPromise(){throw f()}readdirSync(){throw f()}async existsPromise(e){throw f()}existsSync(e){throw f()}async accessPromise(){throw f()}accessSync(){throw f()}async statPromise(){throw f()}statSync(){throw f()}async lstatPromise(e){throw f()}lstatSync(e){throw f()}async chmodPromise(){throw f()}chmodSync(){throw f()}async mkdirPromise(){throw f()}mkdirSync(){throw f()}async rmdirPromise(){throw f()}rmdirSync(){throw f()}async symlinkPromise(){throw f()}symlinkSync(){throw f()}async renamePromise(){throw f()}renameSync(){throw f()}async copyFilePromise(){throw f()}copyFileSync(){throw f()}async appendFilePromise(){throw f()}appendFileSync(){throw f()}async writeFilePromise(){throw f()}writeFileSync(){throw f()}async unlinkPromise(){throw f()}unlinkSync(){throw f()}async utimesPromise(){throw f()}utimesSync(){throw f()}async readFilePromise(){throw f()}readFileSync(){throw f()}async readlinkPromise(){throw f()}readlinkSync(){throw f()}watch(){throw f()}}p.instance=new p;var d=r(39725),C=r(42096),E=r(17674),I=r(53660);function m(e){const t=A.cS.toPortablePath(i().tmpdir()),r=Math.ceil(4294967296*Math.random()).toString(16).padStart(8,"0");return A.y1.join(t,`${e}${r}`)}function y(e,t){const r=new Set(["accessSync","appendFileSync","createReadStream","chmodSync","closeSync","copyFileSync","lstatSync","lutimesSync","mkdirSync","openSync","readSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","statSync","symlinkSync","unlinkSync","utimesSync","watch","writeFileSync","writeSync"]),n=new Set(["accessPromise","appendFilePromise","chmodPromise","closePromise","copyFilePromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","statPromise","symlinkPromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"]),i=(e,t,r)=>{const n=e[t];e[t]=r,void 0!==n[o.promisify.custom]&&(r[o.promisify.custom]=n[o.promisify.custom])};i(e,"exists",(e,...r)=>{const n="function"==typeof r[r.length-1]?r.pop():()=>{};process.nextTick(()=>{t.existsPromise(e).then(e=>{n(e)},()=>{n(!1)})})}),i(e,"read",(e,r,...n)=>{const i="function"==typeof n[n.length-1]?n.pop():()=>{};process.nextTick(()=>{t.readPromise(e,r,...n).then(e=>{i(null,e,r)},e=>{i(e)})})});for(const r of n){const n=r.replace(/Promise$/,"");if(void 0===e[n])continue;const o=t[r];if(void 0===o)continue;i(e,n,(...e)=>{const r="function"==typeof e[e.length-1]?e.pop():()=>{};process.nextTick(()=>{o.apply(t,e).then(e=>{r(null,e)},e=>{r(e)})})})}e.realpath.native=e.realpath,i(e,"existsSync",e=>{try{return t.existsSync(e)}catch(e){return!1}});for(const n of r){const r=n;if(void 0===e[r])continue;const o=t[n];void 0!==o&&i(e,r,o.bind(t))}e.realpathSync.native=e.realpathSync;{const r=e.promises;if(void 0!==r)for(const e of n){const n=e.replace(/Promise$/,"");if(void 0===r[n])continue;const o=t[e];void 0!==o&&i(r,n,o.bind(t))}}}function w(e,t){const r=Object.create(e);return y(r,t),r}const B=new Set;let Q=!1;function v(){if(Q)return;Q=!0;const e=()=>{process.off("exit",e);for(const e of B){B.delete(e);try{D.removeSync(e)}catch(e){}}};process.on("exit",e)}const D=Object.assign(new s.S,{detachTemp(e){B.delete(e)},mktempSync(e){for(v();;){const t=m("xfs-");try{this.mkdirSync(t)}catch(e){if("EEXIST"===e.code)continue;throw e}const r=this.realpathSync(t);if(B.add(r),void 0===e)return t;try{return e(r)}finally{if(B.has(r)){B.delete(r);try{this.removeSync(r)}catch(e){}}}}},async mktempPromise(e){for(v();;){const t=m("xfs-");try{await this.mkdirPromise(t)}catch(e){if("EEXIST"===e.code)continue;throw e}const r=await this.realpathPromise(t);if(B.add(r),void 0===e)return r;try{return await e(r)}finally{if(B.has(r)){B.delete(r);try{await this.removePromise(r)}catch(e){}}}}}})},46009:(e,t,r)=>{"use strict";r.d(t,{LZ:()=>s,QS:()=>A,cS:()=>a,y1:()=>c,CI:()=>C,Zu:()=>E});var n,i=r(85622),o=r.n(i);!function(e){e[e.File=0]="File",e[e.Portable=1]="Portable",e[e.Native=2]="Native"}(n||(n={}));const s={root:"/",dot:"."},A={nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",rc:".yarnrc.yml"},a=Object.create(o()),c=Object.create(o().posix);a.cwd=()=>process.cwd(),c.cwd=()=>d(process.cwd()),c.resolve=(...e)=>o().posix.resolve(c.cwd(),...e);const u=function(e,t,r){return(t=e.normalize(t))===(r=e.normalize(r))?".":(t.endsWith(e.sep)||(t+=e.sep),r.startsWith(t)?r.slice(t.length):null)};a.fromPortablePath=p,a.toPortablePath=d,a.contains=(e,t)=>u(a,e,t),c.contains=(e,t)=>u(c,e,t);const l=/^([a-zA-Z]:.*)$/,h=/^\\\\(\.\\)?(.*)$/,g=/^\/([a-zA-Z]:.*)$/,f=/^\/unc\/(\.dot\/)?(.*)$/;function p(e){if("win32"!==process.platform)return e;if(e.match(g))e=e.replace(g,"$1");else{if(!e.match(f))return e;e=e.replace(f,(e,t,r)=>`\\\\${t?".\\":""}${r}`)}return e.replace(/\//g,"\\")}function d(e){return"win32"!==process.platform?e:(e.match(l)?e=e.replace(l,"/$1"):e.match(h)&&(e=e.replace(h,(e,t,r)=>`/unc/${t?".dot/":""}${r}`)),e.replace(/\\/g,"/"))}function C(e,t){return e===a?p(t):d(t)}function E(e){if(""!==a.parse(e).dir||""!==c.parse(e).dir)throw new Error(`Invalid filename: "${e}"`);return e}},29486:(e,t,r)=>{"use strict";r.r(t),r.d(t,{getLibzipSync:()=>o,getLibzipPromise:()=>s});const n=["number","number"];let i=null;function o(){var e;return null===i&&(e=r(3368),i={get HEAP8(){return e.HEAP8},get HEAPU8(){return e.HEAPU8},SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_CREATE:1,ZIP_EXCL:2,ZIP_TRUNCATE:8,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:e._malloc(1),uint16S:e._malloc(2),uint32S:e._malloc(4),uint64S:e._malloc(8),malloc:e._malloc,free:e._free,getValue:e.getValue,open:e.cwrap("zip_open","number",["string","number","number"]),openFromSource:e.cwrap("zip_open_from_source","number",["number","number","number"]),close:e.cwrap("zip_close","number",["number"]),discard:e.cwrap("zip_discard",null,["number"]),getError:e.cwrap("zip_get_error","number",["number"]),getName:e.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:e.cwrap("zip_get_num_entries","number",["number","number"]),stat:e.cwrap("zip_stat","number",["number","string","number","number"]),statIndex:e.cwrap("zip_stat_index","number",["number",...n,"number","number"]),fopen:e.cwrap("zip_fopen","number",["number","string","number"]),fopenIndex:e.cwrap("zip_fopen_index","number",["number",...n,"number"]),fread:e.cwrap("zip_fread","number",["number","number","number","number"]),fclose:e.cwrap("zip_fclose","number",["number"]),dir:{add:e.cwrap("zip_dir_add","number",["number","string"])},file:{add:e.cwrap("zip_file_add","number",["number","string","number","number"]),getError:e.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:e.cwrap("zip_file_get_external_attributes","number",["number",...n,"number","number","number"]),setExternalAttributes:e.cwrap("zip_file_set_external_attributes","number",["number",...n,"number","number","number"]),setMtime:e.cwrap("zip_file_set_mtime","number",["number",...n,"number","number"]),setCompression:e.cwrap("zip_set_file_compression","number",["number",...n,"number","number"])},ext:{countSymlinks:e.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:e.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:e.cwrap("zip_error_strerror","string",["number"])},name:{locate:e.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:e.cwrap("zip_source_buffer_create","number",["number","number","number","number"]),fromBuffer:e.cwrap("zip_source_buffer","number",["number","number",...n,"number"]),free:e.cwrap("zip_source_free",null,["number"]),keep:e.cwrap("zip_source_keep",null,["number"]),open:e.cwrap("zip_source_open","number",["number"]),close:e.cwrap("zip_source_close","number",["number"]),seek:e.cwrap("zip_source_seek","number",["number",...n,"number"]),tell:e.cwrap("zip_source_tell","number",["number"]),read:e.cwrap("zip_source_read","number",["number","number","number"]),error:e.cwrap("zip_source_error","number",["number"]),setMtime:e.cwrap("zip_source_set_mtime","number",["number","number"])},struct:{stat:e.cwrap("zipstruct_stat","number",[]),statS:e.cwrap("zipstruct_statS","number",[]),statName:e.cwrap("zipstruct_stat_name","string",["number"]),statIndex:e.cwrap("zipstruct_stat_index","number",["number"]),statSize:e.cwrap("zipstruct_stat_size","number",["number"]),statMtime:e.cwrap("zipstruct_stat_mtime","number",["number"]),error:e.cwrap("zipstruct_error","number",[]),errorS:e.cwrap("zipstruct_errorS","number",[])}}),i}async function s(){return o()}},55125:(e,t,r)=>{"use strict";r.r(t),r.d(t,{parseShell:()=>i,parseResolution:()=>s,stringifyResolution:()=>A,parseSyml:()=>C,stringifySyml:()=>f});var n=r(92962);function i(e,t={isGlobPattern:()=>!1}){try{return(0,n.parse)(e,t)}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}var o=r(98261);function s(e){const t=e.match(/^\*{1,2}\/(.*)/);if(t)throw new Error(`The override for '${e}' includes a glob pattern. Glob patterns have been removed since their behaviours don't match what you'd expect. Set the override to '${t[1]}' instead.`);try{return(0,o.parse)(e)}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}function A(e){let t="";return e.from&&(t+=e.from.fullName,e.from.description&&(t+="@"+e.from.description),t+="/"),t+=e.descriptor.fullName,e.descriptor.description&&(t+="@"+e.descriptor.description),t}var a=r(21194),c=r(85443);const u=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,l=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"];class h{constructor(e){this.data=e}}function g(e){return e.match(u)?e:JSON.stringify(e)}function f(e){try{return function e(t,r,n){if(null===t)return"null\n";if("number"==typeof t||"boolean"==typeof t)return t.toString()+"\n";if("string"==typeof t)return g(t)+"\n";if(Array.isArray(t)){if(0===t.length)return"[]\n";const n=" ".repeat(r);return"\n"+t.map(t=>`${n}- ${e(t,r+1,!1)}`).join("")}if("object"==typeof t&&t){let i,o;t instanceof h?(i=t.data,o=!1):(i=t,o=!0);const s=" ".repeat(r),A=Object.keys(i);o&&A.sort((e,t)=>{const r=l.indexOf(e),n=l.indexOf(t);return-1===r&&-1===n?et?1:0:-1!==r&&-1===n?-1:-1===r&&-1!==n?1:r-n});const a=A.filter(e=>void 0!==i[e]).map((t,o)=>{const A=i[t],a=g(t),c=e(A,r+1,!0),u=o>0||n?s:"";return c.startsWith("\n")?`${u}${a}:${c}`:`${u}${a}: ${c}`}).join(0===r?"\n":"")||"\n";return n?"\n"+a:""+a}throw new Error(`Unsupported value type (${t})`)}(e,0,!1)}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}f.PreserveOrdering=h;const p=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i;function d(e){if(p.test(e))return function(e){return e.endsWith("\n")||(e+="\n"),(0,c.parse)(e)}(e);const t=(0,a.safeLoad)(e,{schema:a.FAILSAFE_SCHEMA});if(null==t)return{};if("object"!=typeof t)throw new Error(`Expected an indexed object, got a ${typeof t} instead. Does your file follow Yaml's rules?`);if(Array.isArray(t))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return t}function C(e){return d(e)}},88563:(e,t,r)=>{"use strict";var n,i;r.d(t,{gY:()=>I,Q$:()=>m,oC:()=>F}),function(e){e.HARD="HARD",e.SOFT="SOFT"}(n||(n={})),function(e){e.DEFAULT="DEFAULT",e.TOP_LEVEL="TOP_LEVEL",e.FALLBACK_EXCLUSION_LIST="FALLBACK_EXCLUSION_LIST",e.FALLBACK_EXCLUSION_ENTRIES="FALLBACK_EXCLUSION_ENTRIES",e.FALLBACK_EXCLUSION_DATA="FALLBACK_EXCLUSION_DATA",e.PACKAGE_REGISTRY_DATA="PACKAGE_REGISTRY_DATA",e.PACKAGE_REGISTRY_ENTRIES="PACKAGE_REGISTRY_ENTRIES",e.PACKAGE_STORE_DATA="PACKAGE_STORE_DATA",e.PACKAGE_STORE_ENTRIES="PACKAGE_STORE_ENTRIES",e.PACKAGE_INFORMATION_DATA="PACKAGE_INFORMATION_DATA",e.PACKAGE_DEPENDENCIES="PACKAGE_DEPENDENCIES",e.PACKAGE_DEPENDENCY="PACKAGE_DEPENDENCY"}(i||(i={}));const o={[i.DEFAULT]:{collapsed:!1,next:{"*":i.DEFAULT}},[i.TOP_LEVEL]:{collapsed:!1,next:{fallbackExclusionList:i.FALLBACK_EXCLUSION_LIST,packageRegistryData:i.PACKAGE_REGISTRY_DATA,"*":i.DEFAULT}},[i.FALLBACK_EXCLUSION_LIST]:{collapsed:!1,next:{"*":i.FALLBACK_EXCLUSION_ENTRIES}},[i.FALLBACK_EXCLUSION_ENTRIES]:{collapsed:!0,next:{"*":i.FALLBACK_EXCLUSION_DATA}},[i.FALLBACK_EXCLUSION_DATA]:{collapsed:!0,next:{"*":i.DEFAULT}},[i.PACKAGE_REGISTRY_DATA]:{collapsed:!1,next:{"*":i.PACKAGE_REGISTRY_ENTRIES}},[i.PACKAGE_REGISTRY_ENTRIES]:{collapsed:!0,next:{"*":i.PACKAGE_STORE_DATA}},[i.PACKAGE_STORE_DATA]:{collapsed:!1,next:{"*":i.PACKAGE_STORE_ENTRIES}},[i.PACKAGE_STORE_ENTRIES]:{collapsed:!0,next:{"*":i.PACKAGE_INFORMATION_DATA}},[i.PACKAGE_INFORMATION_DATA]:{collapsed:!1,next:{packageDependencies:i.PACKAGE_DEPENDENCIES,"*":i.DEFAULT}},[i.PACKAGE_DEPENDENCIES]:{collapsed:!1,next:{"*":i.PACKAGE_DEPENDENCY}},[i.PACKAGE_DEPENDENCY]:{collapsed:!0,next:{"*":i.DEFAULT}}};function s(e,t,r,n){const{next:i}=o[r];return A(t,i[e]||i["*"],n)}function A(e,t,r){const{collapsed:n}=o[t];return Array.isArray(e)?n?function(e,t,r){let n="";n+="[";for(let i=0,o=e.length;ie(t)));const i=r.map((e,t)=>t);return i.sort((e,t)=>{for(const r of n){const n=r[e]r[t]?1:0;if(0!==n)return n}return 0}),i.map(e=>r[e])}function u(e){const t=new Map,r=c(e.fallbackExclusionList||[],[({name:e,reference:t})=>e,({name:e,reference:t})=>t]);for(const{name:e,reference:n}of r){let r=t.get(e);void 0===r&&t.set(e,r=new Set),r.add(n)}return Array.from(t).map(([e,t])=>[e,Array.from(t)])}function l(e){return c(e.fallbackPool||[],([e])=>e)}function h(e){const t=[];for(const[r,n]of c(e.packageRegistry,([e])=>null===e?"0":"1"+e)){const e=[];t.push([r,e]);for(const[t,{packageLocation:i,packageDependencies:o,packagePeers:s,linkType:A,discardFromLookup:a}]of c(n,([e])=>null===e?"0":"1"+e)){const n=[];null===r||null===t||o.has(r)||n.push([r,t]);for(const[e,t]of c(o.entries(),([e])=>e))n.push([e,t]);const u=s&&s.size>0?Array.from(s):void 0,l=a||void 0;e.push([t,{packageLocation:i,packageDependencies:n,packagePeers:u,linkType:A,discardFromLookup:l}])}}return t}function g(e){return c(e.blacklistedLocations||[],e=>e)}function f(e){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost. We also recommend you not to read","it either without using the @yarnpkg/pnp package, as the data layout","is entirely unspecified and WILL change from a version to another."],dependencyTreeRoots:e.dependencyTreeRoots,enableTopLevelFallback:e.enableTopLevelFallback||!1,ignorePatternData:e.ignorePattern||null,fallbackExclusionList:u(e),fallbackPool:l(e),locationBlacklistData:g(e),packageRegistryData:h(e)}}var p=r(20103),d=r.n(p);function C(e,t){return[e?e+"\n":"","/* eslint-disable */\n\n","try {\n"," Object.freeze({}).detectStrictMode = true;\n","} catch (error) {\n"," throw new Error(`The whole PnP file got strict-mode-ified, which is known to break (Emscripten libraries aren't strict mode). This usually happens when the file goes through Babel.`);\n","}\n","\n","var __non_webpack_module__ = module;\n","\n","function $$SETUP_STATE(hydrateRuntimeState, basePath) {\n",t.replace(/^/gm," "),"}\n","\n",d()].join("")}function E(e){return JSON.stringify(e,null,2)}function I(e){const t=function(e){return[`return hydrateRuntimeState(${a(e)}, {basePath: basePath || __dirname});\n`].join("")}(f(e));return C(e.shebang,t)}function m(e){const t=f(e),r=(n=e.dataLocation,["var path = require('path');\n",`var dataLocation = path.resolve(__dirname, ${JSON.stringify(n)});\n`,"return hydrateRuntimeState(require(dataLocation), {basePath: basePath || path.dirname(dataLocation)});\n"].join(""));var n;const i=C(e.shebang,r);return{dataFile:E(t),loaderFile:i}}var y=r(35747),w=(r(85622),r(31669)),B=r(46009);function Q(e,{basePath:t}){const r=B.cS.toPortablePath(t),n=null!==e.ignorePatternData?new RegExp(e.ignorePatternData):null,i=new Map(e.packageRegistryData.map(([e,t])=>[e,new Map(t.map(([e,t])=>[e,{packageLocation:B.y1.resolve(r,t.packageLocation),packageDependencies:new Map(t.packageDependencies),packagePeers:new Set(t.packagePeers),linkType:t.linkType,discardFromLookup:t.discardFromLookup||!1}]))])),o=new Map,s=new Set;for(const[t,r]of e.packageRegistryData)for(const[e,n]of r){if(null===t!=(null===e))throw new Error("Assertion failed: The name and reference should be null, or neither should");if(n.discardFromLookup)continue;const r={name:t,reference:e};o.set(n.packageLocation,r),s.add(n.packageLocation.length)}for(const t of e.locationBlacklistData)o.set(t,null);const A=new Map(e.fallbackExclusionList.map(([e,t])=>[e,new Set(t)])),a=new Map(e.fallbackPool),c=e.dependencyTreeRoots,u=e.enableTopLevelFallback;return{basePath:r,dependencyTreeRoots:c,enableTopLevelFallback:u,fallbackExclusionList:A,fallbackPool:a,ignorePattern:n,packageLocationLengths:[...s].sort((e,t)=>t-e),packageLocatorsByLocations:o,packageRegistry:i}}var v,D=r(17674),b=r(32282);!function(e){e.API_ERROR="API_ERROR",e.BLACKLISTED="BLACKLISTED",e.BUILTIN_NODE_RESOLUTION_FAILED="BUILTIN_NODE_RESOLUTION_FAILED",e.MISSING_DEPENDENCY="MISSING_DEPENDENCY",e.MISSING_PEER_DEPENDENCY="MISSING_PEER_DEPENDENCY",e.QUALIFIED_PATH_RESOLUTION_FAILED="QUALIFIED_PATH_RESOLUTION_FAILED",e.INTERNAL="INTERNAL",e.UNDECLARED_DEPENDENCY="UNDECLARED_DEPENDENCY",e.UNSUPPORTED="UNSUPPORTED"}(v||(v={}));const S=new Set([v.BLACKLISTED,v.BUILTIN_NODE_RESOLUTION_FAILED,v.MISSING_DEPENDENCY,v.MISSING_PEER_DEPENDENCY,v.QUALIFIED_PATH_RESOLUTION_FAILED,v.UNDECLARED_DEPENDENCY]);function k(e,t,r={}){const n=S.has(e)?"MODULE_NOT_FOUND":e,i={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(t),{code:{...i,value:n},pnpCode:{...i,value:e},data:{...i,value:r}})}function x(e,t){const r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,n=Number(process.env.PNP_DEBUG_LEVEL),i=new Set(b.Module.builtinModules||Object.keys(process.binding("natives"))),o=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:@[^/]+\/)?[^/]+)\/*(.*|)$/,s=/^\.{0,2}\//,A=/\/$/,a=[],c=new Set;if(!1!==t.compatibilityMode)for(const t of["react-scripts","gatsby"]){const r=e.packageRegistry.get(t);if(r)for(const e of r.keys()){if(null===e)throw new Error("Assertion failed: This reference shouldn't be null");a.push({name:t,reference:e})}}const{ignorePattern:u,packageRegistry:l,packageLocatorsByLocations:h,packageLocationLengths:g}=e;function f(e,t){return{fn:e,args:t,error:null,result:null}}function p(e,r){if(!1===t.allowDebug)return r;if(Number.isFinite(n)){if(n>=2)return(...t)=>{const n=f(e,t);try{return n.result=r(...t)}catch(e){throw n.error=e}finally{console.trace(n)}};if(n>=1)return(...t)=>{try{return r(...t)}catch(r){const n=f(e,t);throw n.error=r,console.trace(n),r}}}return r}function d(e){const t=I(e);if(!t)throw k(v.INTERNAL,"Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return t}function C(t){if(null===t.name)return!0;for(const r of e.dependencyTreeRoots)if(r.name===t.name&&r.reference===t.reference)return!0;return!1}function E(e,t){return t.endsWith("/")&&(t=B.y1.join(t,"internal.js")),b.Module._resolveFilename(e,function(e){const t=new b.Module(e,null);return t.filename=e,t.paths=b.Module._nodeModulePaths(e),t}(B.cS.fromPortablePath(t)),!1,{plugnplay:!1})}function I({name:e,reference:t}){const r=l.get(e);if(!r)return null;const n=r.get(t);return n||null}function m(e,t){const r=new Map,n=new Set,i=t=>{const o=JSON.stringify(t.name);if(n.has(o))return;n.add(o);const s=function({name:e,reference:t}){const r=[];for(const[n,i]of l)if(null!==n)for(const[o,s]of i){if(null===o)continue;s.packageDependencies.get(e)===t&&(n===e&&o===t||r.push({name:n,reference:o}))}return r}(t);for(const t of s){if(d(t).packagePeers.has(e))i(t);else{let e=r.get(t.name);void 0===e&&r.set(t.name,e=new Set),e.add(t.reference)}}};i(t);const o=[];for(const e of[...r.keys()].sort())for(const t of[...r.get(e)].sort())o.push({name:e,reference:t});return o}function y(t){let r=(n=B.y1.relative(e.basePath,t),B.cS.toPortablePath(n));var n;r.match(s)||(r="./"+r),t.match(A)&&!r.endsWith("/")&&(r+="/");let i=0;for(;ir.length;)i+=1;for(let e=i;eC(e))?k(v.MISSING_PEER_DEPENDENCY,`${o.name} tried to access ${t} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound.\n\nRequired package: ${t} (via "${n}")\nRequired by: ${o.name}@${o.reference} (via ${s})\n${e.map(e=>`Ancestor breaking the chain: ${e.name}@${e.reference}\n`).join("")}\n`,{request:n,issuer:s,issuerLocator:Object.assign({},o),dependencyName:t,brokenAncestors:e}):k(v.MISSING_PEER_DEPENDENCY,`${o.name} tried to access ${t} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound.\n\nRequired package: ${t} (via "${n}")\nRequired by: ${o.name}@${o.reference} (via ${s})\n${e.map(e=>`Ancestor breaking the chain: ${e.name}@${e.reference}\n`).join("")}\n`,{request:n,issuer:s,issuerLocator:Object.assign({},o),dependencyName:t,brokenAncestors:e})}else void 0===A&&(l=C(o)?k(v.UNDECLARED_DEPENDENCY,`Your application tried to access ${t}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound.\n\nRequired package: ${t} (via "${n}")\nRequired by: ${s}\n`,{request:n,issuer:s,dependencyName:t}):k(v.UNDECLARED_DEPENDENCY,`${o.name} tried to access ${t}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound.\n\nRequired package: ${t} (via "${n}")\nRequired by: ${o.name}@${o.reference} (via ${s})\n`,{request:n,issuer:s,issuerLocator:Object.assign({},o),dependencyName:t}));if(null==A){if(null===u||null===l)throw l||new Error("Assertion failed: Expected an error to have been set");A=u;const e=l.message.replace(/\n.*/g,"");l.message=e,c.has(e)||(c.add(e),process.emitWarning(l))}const f=Array.isArray(A)?{name:A[0],reference:A[1]}:{name:t,reference:A},p=d(f);if(!p.packageLocation)throw k(v.MISSING_DEPENDENCY,`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod.\n\nRequired package: ${f.name}@${f.reference} (via "${n}")\nRequired by: ${o.name}@${o.reference} (via ${s})\n`,{request:n,issuer:s,dependencyLocator:Object.assign({},f)});const I=B.y1.resolve(e.basePath,p.packageLocation);h=i?B.y1.resolve(I,i):I}else{if(B.y1.isAbsolute(n))h=B.y1.normalize(n);else{if(!s)throw k(v.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:n,issuer:s});const e=B.y1.resolve(s);h=s.match(A)?B.y1.normalize(B.y1.join(e,n)):B.y1.normalize(B.y1.join(B.y1.dirname(e),n))}y(h)}return B.y1.normalize(h)}function Q(e,{extensions:r=Object.keys(b.Module._extensions)}={}){const n=[],i=function e(r,n,{extensions:i}){let o;try{n.push(r),o=t.fakeFs.statSync(r)}catch(e){}if(o&&!o.isDirectory())return t.fakeFs.realpathSync(r);if(o&&o.isDirectory()){let o,s;try{o=JSON.parse(t.fakeFs.readFileSync(B.y1.join(r,"package.json"),"utf8"))}catch(e){}if(o&&o.main&&(s=B.y1.resolve(r,o.main)),s&&s!==r){const t=e(s,n,{extensions:i});if(null!==t)return t}}for(let e=0,o=i.length;e`Rejected candidate: ${e}\n`).join("")}`,{unqualifiedPath:e})}return{VERSIONS:{std:3,resolveVirtual:1},topLevel:{name:null,reference:null},getLocator:(e,t)=>Array.isArray(t)?{name:t[0],reference:t[1]}:{name:e,reference:t},getDependencyTreeRoots:()=>[...e.dependencyTreeRoots],getPackageInformation:e=>{const t=I(e);if(null===t)return null;const r=B.cS.fromPortablePath(t.packageLocation);return{...t,packageLocation:r}},findPackageLocator:e=>y(B.cS.toPortablePath(e)),resolveToUnqualified:p("resolveToUnqualified",(e,t,r)=>{const n=null!==t?B.cS.toPortablePath(t):null,i=w(B.cS.toPortablePath(e),n,r);return null===i?null:B.cS.fromPortablePath(i)}),resolveUnqualified:p("resolveUnqualified",(e,t)=>B.cS.fromPortablePath(Q(B.cS.toPortablePath(e),t))),resolveRequest:p("resolveRequest",(e,t,r)=>{const n=null!==t?B.cS.toPortablePath(t):null,i=function(e,t,{considerBuiltins:r,extensions:n}={}){const i=w(e,t,{considerBuiltins:r});if(null===i)return null;try{return Q(i,{extensions:n})}catch(r){throw"QUALIFIED_PATH_RESOLUTION_FAILED"===r.pnpCode&&Object.assign(r.data,{request:e,issuer:t}),r}}(B.cS.toPortablePath(e),n,r);return null===i?null:B.cS.fromPortablePath(i)}),resolveVirtual:p("resolveVirtual",e=>{const t=function(e){const t=B.y1.normalize(e),r=D.p.resolveVirtual(t);return r!==t?r:null}(B.cS.toPortablePath(e));return null!==t?B.cS.fromPortablePath(t):null})}}(0,w.promisify)(y.readFile);const F=(e,t,r)=>x(Q(f(e),{basePath:t}),{fakeFs:r,pnpapiResolution:B.cS.join(t,".pnp.js")})},43982:(e,t,r)=>{"use strict";r.r(t),r.d(t,{execute:()=>F});var n,i=r(46009),o=r(56537),s=r(39725),A=r(55125),a=r(19347),c=r.n(a),u=r(92413),l=r(67566),h=r.n(l);function g(){}!function(e){e[e.STDOUT=1]="STDOUT",e[e.STDERR=2]="STDERR"}(n||(n={}));let f=0;class p{constructor(e){this.stream=e}close(){}get(){return this.stream}}class d{constructor(){this.stream=null}close(){if(null===this.stream)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(null===this.stream)throw new Error("Assertion failed: No stream attached");return this.stream}}class C{constructor(e,t){this.stdin=null,this.stdout=null,this.stderr=null,this.pipe=null,this.ancestor=e,this.implementation=t}static start(e,{stdin:t,stdout:r,stderr:n}){const i=new C(null,e);return i.stdin=t,i.stdout=r,i.stderr=n,i}pipeTo(e,t=n.STDOUT){const r=new C(this,e),i=new d;return r.pipe=i,r.stdout=this.stdout,r.stderr=this.stderr,(t&n.STDOUT)===n.STDOUT?this.stdout=i:null!==this.ancestor&&(this.stderr=this.ancestor.stdout),(t&n.STDERR)===n.STDERR?this.stderr=i:null!==this.ancestor&&(this.stderr=this.ancestor.stderr),r}async exec(){const e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(null===this.stdin)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let t,r;if(null===this.stdout)throw new Error("Assertion failed: No output stream registered");if(t=this.stdout,e[1]=t.get(),null===this.stderr)throw new Error("Assertion failed: No error stream registered");r=this.stderr,e[2]=r.get();const n=this.implementation(e);return this.pipe&&this.pipe.attach(n.stdin),await n.promise.then(e=>(t.close(),r.close(),e))}async run(){const e=[];for(let t=this;t;t=t.ancestor)e.push(t.exec());return(await Promise.all(e))[0]}}function E(e,t){return C.start(e,t)}function I(e,t={}){const r={...e,...t};return r.environment={...e.environment,...t.environment},r.variables={...e.variables,...t.variables},r}const m=new Map([["cd",async([e,...t],r,n)=>{const s=i.y1.resolve(n.cwd,i.cS.toPortablePath(e));return(await o.xfs.statPromise(s)).isDirectory()?(n.cwd=s,0):(n.stderr.write("cd: not a directory\n"),1)}],["pwd",async(e,t,r)=>(r.stdout.write(i.cS.fromPortablePath(r.cwd)+"\n"),0)],["true",async(e,t,r)=>0],["false",async(e,t,r)=>1],["exit",async([e,...t],r,n)=>n.exitCode=parseInt(e,10)],["echo",async(e,t,r)=>(r.stdout.write(e.join(" ")+"\n"),0)],["__ysh_run_procedure",async(e,t,r)=>{const n=r.procedures[e[0]];return await E(n,{stdin:new p(r.stdin),stdout:new p(r.stdout),stderr:new p(r.stderr)}).run()}],["__ysh_set_redirects",async(e,t,r)=>{let n=r.stdin,s=r.stdout;const A=r.stderr,a=[],c=[];let l=0;for(;"--"!==e[l];){const t=e[l++],n=Number(e[l++]),s=l+n;for(let n=l;no.xfs.createReadStream(i.y1.resolve(r.cwd,i.cS.toPortablePath(e[n]))));break;case"<<<":a.push(()=>{const t=new u.PassThrough;return process.nextTick(()=>{t.write(e[n]+"\n"),t.end()}),t});break;case">":c.push(o.xfs.createWriteStream(i.y1.resolve(r.cwd,i.cS.toPortablePath(e[n]))));break;case">>":c.push(o.xfs.createWriteStream(i.y1.resolve(r.cwd,i.cS.toPortablePath(e[n])),{flags:"a"}))}}if(a.length>0){const e=new u.PassThrough;n=e;const t=r=>{if(r===a.length)e.end();else{const n=a[r]();n.pipe(e,{end:!1}),n.on("end",()=>{t(r+1)})}};t(0)}if(c.length>0){const e=new u.PassThrough;s=e;for(const t of c)e.pipe(t)}const h=await E(Q(e.slice(l+1),t,r),{stdin:new p(n),stdout:new p(s),stderr:new p(A)}).run();return await Promise.all(c.map(e=>new Promise(t=>{e.on("close",()=>{t()}),e.end()}))),h}]]);async function y(e,t,r){const n=[],i=new u.PassThrough;return i.on("data",e=>n.push(e)),await S(e,t,I(r,{stdout:i})),Buffer.concat(n).toString().replace(/[\r\n]+$/,"")}async function w(e,t,r){const n=e.map(async e=>{const n=await B(e.args,t,r);return{name:e.name,value:n.join(" ")}});return(await Promise.all(n)).reduce((e,t)=>(e[t.name]=t.value,e),{})}async function B(e,t,r){const n=new Map,i=[];let o=[];const s=e=>e.match(/[^ \r\n\t]+/g)||[],A=e=>{o.push(e)},a=()=>{o.length>0&&i.push(o.join("")),o=[]},c=e=>{A(e),a()},u=(e,t)=>{let r=n.get(e);void 0===r&&n.set(e,r=[]),r.push(t)};for(const n of e){switch(n.type){case"redirection":{const e=await B(n.args,t,r);for(const t of e)u(n.subtype,t)}break;case"argument":for(const e of n.segments)switch(e.type){case"text":A(e.text);break;case"glob":{const n=await t.glob.match(e.pattern,{cwd:r.cwd});if(!n.length)throw new Error(`No file matches found: "${e.pattern}". Note: Glob patterns currently only support files that exist on the filesystem (Help Wanted)`);for(const e of n.sort())c(e)}break;case"shell":{const n=await y(e.shell,t,r);if(e.quoted)A(n);else{const e=s(n);for(let t=0;t=0&&n0){const e=[];for(const[t,r]of n.entries())e.splice(e.length,0,t,String(r.length),...r);i.splice(0,0,"__ysh_set_redirects",...e,"--")}return i}function Q(e,t,r){t.builtins.has(e[0])||(e=["command",...e]);const n=i.cS.fromPortablePath(r.cwd);let o=r.environment;void 0!==o.PWD&&(o={...o,PWD:n});const[s,...A]=e;if("command"===s)return function(e,t,r,n){return r=>{const i=r[0]instanceof u.Transform?"pipe":r[0],o=r[1]instanceof u.Transform?"pipe":r[1],s=r[2]instanceof u.Transform?"pipe":r[2],A=h()(e,t,{...n,stdio:[i,o,s]});return 0==f++&&process.on("SIGINT",g),r[0]instanceof u.Transform&&r[0].pipe(A.stdin),r[1]instanceof u.Transform&&A.stdout.pipe(r[1],{end:!1}),r[2]instanceof u.Transform&&A.stderr.pipe(r[2],{end:!1}),{stdin:A.stdin,promise:new Promise(t=>{A.on("error",n=>{switch(0==--f&&process.off("SIGINT",g),n.code){case"ENOENT":r[2].write(`command not found: ${e}\n`),t(127);break;case"EACCESS":r[2].write(`permission denied: ${e}\n`),t(128);break;default:r[2].write(`uncaught error: ${n.message}\n`),t(1)}}),A.on("exit",e=>{0==--f&&process.off("SIGINT",g),t(null!==e?e:129)})})}}}(A[0],A.slice(1),0,{cwd:n,env:o});const a=t.builtins.get(s);if(void 0===a)throw new Error(`Assertion failed: A builtin should exist for "${s}"`);return function(e){return t=>{const r="pipe"===t[0]?new u.PassThrough:t[0];return{stdin:r,promise:Promise.resolve().then(()=>e({stdin:r,stdout:t[1],stderr:t[2]}))}}}(async({stdin:e,stdout:n,stderr:i})=>(r.stdin=e,r.stdout=n,r.stderr=i,await a(A,t,r)))}function v(e,t,r){return n=>{const i=new u.PassThrough;return{stdin:i,promise:S(e,t,I(r,{stdin:i}))}}}async function D(e,t,r){let n=e,i=null,o=null;for(;n;){const e=n.then?{...r}:r;let s;switch(n.type){case"command":{const i=await B(n.args,t,r),o=await w(n.envs,t,r);s=n.envs.length?Q(i,t,I(e,{environment:o})):Q(i,t,e)}break;case"subshell":{const i=await B(n.args,t,r),o=v(n.subshell,t,e);if(0===i.length)s=o;else{let r;do{r=String(Math.random())}while(Object.prototype.hasOwnProperty.call(e.procedures,r));e.procedures={...e.procedures},e.procedures[r]=o,s=Q([...i,"__ysh_run_procedure",r],t,e)}}break;case"envs":{const i=await w(n.envs,t,r);e.environment={...e.environment,...i},s=Q(["true"],t,e)}}if(void 0===s)throw new Error("Assertion failed: An action should have been generated");if(null===i)o=E(s,{stdin:new p(e.stdin),stdout:new p(e.stdout),stderr:new p(e.stderr)});else{if(null===o)throw new Error("The execution pipeline should have been setup");switch(i){case"|":case"|&":o=o.pipeTo(s)}}n.then?(i=n.then.type,n=n.then.chain):n=null}if(null===o)throw new Error("Assertion failed: The execution pipeline should have been setup");return await o.run()}async function b(e,t,r){if(!e.then)return await D(e.chain,t,r);const n=await D(e.chain,t,r);if(null!==r.exitCode)return r.exitCode;switch(r.variables["?"]=String(n),e.then.type){case"&&":return 0===n?await b(e.then.line,t,r):n;case"||":return 0!==n?await b(e.then.line,t,r):n;default:throw new Error(`Unsupported command type: "${e.then.type}"`)}}async function S(e,t,r){let n=0;for(const i of e){if(n=await b(i,t,r),null!==r.exitCode)return r.exitCode;r.variables["?"]=String(n)}return n}function k(e){switch(e.type){case"redirection":return e.args.some(e=>k(e));case"argument":return e.segments.some(e=>function(e){switch(e.type){case"variable":return"@"===e.name||"#"===e.name||"*"===e.name||Number.isFinite(parseInt(e.name,10))||!!e.defaultValue&&e.defaultValue.some(e=>k(e));case"shell":return x(e.shell);default:return!1}}(e));default:throw new Error("Unreacheable")}}function x(e){return e.some(e=>{for(;e;){let t=e.chain;for(;t;){let e;switch(t.type){case"subshell":e=x(t.subshell);break;case"command":e=t.envs.some(e=>e.args.some(e=>k(e)))||t.args.some(e=>k(e))}if(e)return!0;if(!t.then)break;t=t.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function F(e,t=[],{builtins:r={},cwd:n=i.cS.toPortablePath(process.cwd()),env:a=process.env,stdin:l=process.stdin,stdout:h=process.stdout,stderr:g=process.stderr,variables:f={},glob:p={isGlobPattern:c().isDynamicPattern,match:(e,{cwd:t,fs:r=o.xfs})=>c()(e,{cwd:i.cS.fromPortablePath(t),fs:new s.i(r)})}}={}){const d={};for(const[e,t]of Object.entries(a))void 0!==t&&(d[e]=t);const C=new Map(m);for(const[e,t]of Object.entries(r))C.set(e,t);null===l&&(l=new u.PassThrough).end();const E=(0,A.parseShell)(e,p);if(!x(E)&&E.length>0&&t.length>0){let e=E[E.length-1];for(;e.then;)e=e.then.line;let r=e.chain;for(;r.then;)r=r.then.chain;"command"===r.type&&(r.args=r.args.concat(t.map(e=>({type:"argument",segments:[{type:"text",text:e}]}))))}return await S(E,{args:t,builtins:C,initialStdin:l,initialStdout:h,initialStderr:g,glob:p},{cwd:n,environment:d,exitCode:null,procedures:{},stdin:l,stdout:h,stderr:g,variables:Object.assign(Object.create(f),{"?":0})})}},45330:(e,t,r)=>{t.e=()=>({modules:new Map([[r(60306).name,r(95397)],[r(73841).u2,r(84132)],[r(4670).u2,r(56537)],[r(81386).u2,r(29486)],[r(54920).u2,r(55125)],[r(75418).u2,r(43982)],[r(75426).u2,r(17278)],[r(89153).u2,r(53887)],[r(38422).u2,r(15966)],[r(37904).u2,r(72926)],[r(49775).u2,r(80150)],[r(35729).u2,r(10420)],[r(17508).u2,r(41466)],[r(84779).u2,r(10284)],[r(88454).u2,r(23599)],[r(91953).u2,r(21754)],[r(63756).u2,r(74230)],[r(23100).u2,r(86161)],[r(47047).u2,r(8149)],[r(67310).u2,r(86717)],[r(31880).u2,r(94573)],[r(74617).u2,r(5973)],[r(12437).u2,r(5698)],[r(8211).u2,r(5780)]]),plugins:new Set([r(37904).u2,r(49775).u2,r(35729).u2,r(17508).u2,r(84779).u2,r(88454).u2,r(91953).u2,r(63756).u2,r(23100).u2,r(47047).u2,r(67310).u2,r(31880).u2,r(74617).u2,r(12437).u2,r(8211).u2])})},29148:(e,t,r)=>{const n=r(74988),i=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,o=new n;e.exports=(e,t=0,r=e.length)=>{if(t<0||r<0)throw new RangeError("Negative indices aren't supported by this implementation");const n=r-t;let s="",A=0,a=0;for(;e.length>0;){const r=e.match(i)||[e,e,void 0];let c=o.splitGraphemes(r[1]);const u=Math.min(t-A,c.length);c=c.slice(u);const l=Math.min(n-a,c.length);s+=c.slice(0,l).join(""),A+=u,a+=l,void 0!==r[2]&&(s+=r[2]),e=e.slice(r[0].length)}return s}},72912:e=>{function t(){return e.exports=t=Object.assign||function(e){for(var t=1;t{e.exports=function(e){return e&&e.__esModule?e:{default:e}}},19228:(e,t,r)=>{var n=r(54694);function i(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return i=function(){return e},e}e.exports=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var t=i();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var s in e)if(Object.prototype.hasOwnProperty.call(e,s)){var A=o?Object.getOwnPropertyDescriptor(e,s):null;A&&(A.get||A.set)?Object.defineProperty(r,s,A):r[s]=e[s]}return r.default=e,t&&t.set(e,r),r}},74943:e=>{e.exports=function(e,t){if(null==e)return{};var r,n,i={},o=Object.keys(e);for(n=0;n=0||(i[r]=e[r]);return i}},62407:e=>{e.exports=function(e,t){return t||(t=e.slice(0)),e.raw=t,e}},54694:e=>{function t(r){return"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?e.exports=t=function(e){return typeof e}:e.exports=t=function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t(r)}e.exports=t},96117:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(35747);t.FILE_SYSTEM_ADAPTER={lstat:n.lstat,stat:n.stat,lstatSync:n.lstatSync,statSync:n.statSync,readdir:n.readdir,readdirSync:n.readdirSync},t.createFileSystemAdapter=function(e){return void 0===e?t.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},t.FILE_SYSTEM_ADAPTER),e)}},79774:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=process.versions.node.split("."),n=parseInt(r[0],10),i=parseInt(r[1],10),o=n>10,s=10===n&&i>=10;t.IS_SUPPORT_READDIR_WITH_FILE_TYPES=o||s},85670:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(31020),i=r(35516),o=r(38844);function s(e={}){return e instanceof o.default?e:new o.default(e)}t.Settings=o.default,t.scandir=function(e,t,r){if("function"==typeof t)return n.read(e,s(),t);n.read(e,s(t),r)},t.scandirSync=function(e,t){const r=s(t);return i.read(e,r)}},31020:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(53403),i=r(69078),o=r(79774),s=r(65225);function A(e,t,r){t.fs.readdir(e,{withFileTypes:!0},(n,o)=>{if(null!==n)return c(r,n);const A=o.map(r=>({dirent:r,name:r.name,path:`${e}${t.pathSegmentSeparator}${r.name}`}));if(!t.followSymbolicLinks)return u(r,A);const a=A.map(e=>function(e,t){return r=>{if(!e.dirent.isSymbolicLink())return r(null,e);t.fs.stat(e.path,(n,i)=>null!==n?t.throwErrorOnBrokenSymbolicLink?r(n):r(null,e):(e.dirent=s.fs.createDirentFromStats(e.name,i),r(null,e)))}}(e,t));i(a,(e,t)=>{if(null!==e)return c(r,e);u(r,t)})})}function a(e,t,r){t.fs.readdir(e,(o,A)=>{if(null!==o)return c(r,o);const a=A.map(r=>`${e}${t.pathSegmentSeparator}${r}`),l=a.map(e=>r=>n.stat(e,t.fsStatSettings,r));i(l,(e,n)=>{if(null!==e)return c(r,e);const i=[];A.forEach((e,r)=>{const o=n[r],A={name:e,path:a[r],dirent:s.fs.createDirentFromStats(e,o)};t.stats&&(A.stats=o),i.push(A)}),u(r,i)})})}function c(e,t){e(t)}function u(e,t){e(null,t)}t.read=function(e,t,r){return!t.stats&&o.IS_SUPPORT_READDIR_WITH_FILE_TYPES?A(e,t,r):a(e,t,r)},t.readdirWithFileTypes=A,t.readdir=a},35516:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(53403),i=r(79774),o=r(65225);function s(e,t){return t.fs.readdirSync(e,{withFileTypes:!0}).map(r=>{const n={dirent:r,name:r.name,path:`${e}${t.pathSegmentSeparator}${r.name}`};if(n.dirent.isSymbolicLink()&&t.followSymbolicLinks)try{const e=t.fs.statSync(n.path);n.dirent=o.fs.createDirentFromStats(n.name,e)}catch(e){if(t.throwErrorOnBrokenSymbolicLink)throw e}return n})}function A(e,t){return t.fs.readdirSync(e).map(r=>{const i=`${e}${t.pathSegmentSeparator}${r}`,s=n.statSync(i,t.fsStatSettings),A={name:r,path:i,dirent:o.fs.createDirentFromStats(r,s)};return t.stats&&(A.stats=s),A})}t.read=function(e,t){return!t.stats&&i.IS_SUPPORT_READDIR_WITH_FILE_TYPES?s(e,t):A(e,t)},t.readdirWithFileTypes=s,t.readdir=A},38844:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(85622),i=r(53403),o=r(96117);t.default=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=o.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,n.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new i.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return void 0===e?t:e}}},72156:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}}t.createDirentFromStats=function(e,t){return new r(e,t)}},65225:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(72156);t.fs=n},71208:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(35747);t.FILE_SYSTEM_ADAPTER={lstat:n.lstat,stat:n.stat,lstatSync:n.lstatSync,statSync:n.statSync},t.createFileSystemAdapter=function(e){return void 0===e?t.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},t.FILE_SYSTEM_ADAPTER),e)}},53403:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(17790),i=r(34846),o=r(92687);function s(e={}){return e instanceof o.default?e:new o.default(e)}t.Settings=o.default,t.stat=function(e,t,r){if("function"==typeof t)return n.read(e,s(),t);n.read(e,s(t),r)},t.statSync=function(e,t){const r=s(t);return i.read(e,r)}},17790:(e,t)=>{"use strict";function r(e,t){e(t)}function n(e,t){e(null,t)}Object.defineProperty(t,"__esModule",{value:!0}),t.read=function(e,t,i){t.fs.lstat(e,(o,s)=>null!==o?r(i,o):s.isSymbolicLink()&&t.followSymbolicLink?void t.fs.stat(e,(e,o)=>{if(null!==e)return t.throwErrorOnBrokenSymbolicLink?r(i,e):n(i,s);t.markSymbolicLink&&(o.isSymbolicLink=()=>!0),n(i,o)}):n(i,s))}},34846:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.read=function(e,t){const r=t.fs.lstatSync(e);if(!r.isSymbolicLink()||!t.followSymbolicLink)return r;try{const r=t.fs.statSync(e);return t.markSymbolicLink&&(r.isSymbolicLink=()=>!0),r}catch(e){if(!t.throwErrorOnBrokenSymbolicLink)return r;throw e}}},92687:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(71208);t.default=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=n.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,t){return void 0===e?t:e}}},72897:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(42369),i=r(27696),o=r(22111),s=r(14954);function A(e={}){return e instanceof s.default?e:new s.default(e)}t.Settings=s.default,t.walk=function(e,t,r){if("function"==typeof t)return new n.default(e,A()).read(t);new n.default(e,A(t)).read(r)},t.walkSync=function(e,t){const r=A(t);return new o.default(e,r).read()},t.walkStream=function(e,t){const r=A(t);return new i.default(e,r).read()}},42369:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(98566);t.default=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new n.default(this._root,this._settings),this._storage=new Set}read(e){this._reader.onError(t=>{!function(e,t){e(t)}(e,t)}),this._reader.onEntry(e=>{this._storage.add(e)}),this._reader.onEnd(()=>{!function(e,t){e(null,t)}(e,[...this._storage])}),this._reader.read()}}},27696:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(92413),i=r(98566);t.default=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new i.default(this._root,this._settings),this._stream=new n.Readable({objectMode:!0,read:()=>{},destroy:this._reader.destroy.bind(this._reader)})}read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}}},22111:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(97835);t.default=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new n.default(this._root,this._settings)}read(){return this._reader.read()}}},98566:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(28614),i=r(85670),o=r(98360),s=r(10750),A=r(75504);class a extends A.default{constructor(e,t){super(e,t),this._settings=t,this._scandir=i.scandir,this._emitter=new n.EventEmitter,this._queue=o(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit("end")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}destroy(){if(this._isDestroyed)throw new Error("The reader is already destroyed");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on("entry",e)}onError(e){this._emitter.once("error",e)}onEnd(e){this._emitter.once("end",e)}_pushToQueue(e,t){const r={directory:e,base:t};this._queue.push(r,e=>{null!==e&&this._handleError(e)})}_worker(e,t){this._scandir(e.directory,this._settings.fsScandirSettings,(r,n)=>{if(null!==r)return t(r,void 0);for(const t of n)this._handleEntry(t,e.base);t(null,void 0)})}_handleError(e){s.isFatalError(this._settings,e)&&(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,t){if(this._isDestroyed||this._isFatalError)return;const r=e.path;void 0!==t&&(e.path=s.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),s.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&s.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(r,e.path)}_emitEntry(e){this._emitter.emit("entry",e)}}t.default=a},10750:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isFatalError=function(e,t){return null===e.errorFilter||!e.errorFilter(t)},t.isAppliedFilter=function(e,t){return null===e||e(t)},t.replacePathSegmentSeparator=function(e,t){return e.split(/[\\/]/).join(t)},t.joinPathSegments=function(e,t,r){return""===e?t:e+r+t}},75504:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(10750);t.default=class{constructor(e,t){this._root=e,this._settings=t,this._root=n.replacePathSegmentSeparator(e,t.pathSegmentSeparator)}}},97835:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(85670),i=r(10750),o=r(75504);class s extends o.default{constructor(){super(...arguments),this._scandir=n.scandirSync,this._storage=new Set,this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),[...this._storage]}_pushToQueue(e,t){this._queue.add({directory:e,base:t})}_handleQueue(){for(const e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,t){try{const r=this._scandir(e,this._settings.fsScandirSettings);for(const e of r)this._handleEntry(e,t)}catch(e){this._handleError(e)}}_handleError(e){if(i.isFatalError(this._settings,e))throw e}_handleEntry(e,t){const r=e.path;void 0!==t&&(e.path=i.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),i.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&i.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(r,e.path)}_pushToStorage(e){this._storage.add(e)}}t.default=s},14954:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(85622),i=r(85670);t.default=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,1/0),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,n.sep),this.fsScandirSettings=new i.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return void 0===e?t:e}}},8189:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const{toString:r}=Object.prototype,n=e=>t=>typeof t===e,i=e=>{const t=r.call(e).slice(8,-1);if(t)return t},o=e=>t=>i(t)===e;function s(e){switch(e){case null:return"null";case!0:case!1:return"boolean"}switch(typeof e){case"undefined":return"undefined";case"string":return"string";case"number":return"number";case"bigint":return"bigint";case"symbol":return"symbol"}if(s.function_(e))return"Function";if(s.observable(e))return"Observable";if(s.array(e))return"Array";if(s.buffer(e))return"Buffer";const t=i(e);if(t)return t;if(e instanceof String||e instanceof Boolean||e instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}s.undefined=n("undefined"),s.string=n("string");const A=n("number");s.number=e=>A(e)&&!s.nan(e),s.bigint=n("bigint"),s.function_=n("function"),s.null_=e=>null===e,s.class_=e=>s.function_(e)&&e.toString().startsWith("class "),s.boolean=e=>!0===e||!1===e,s.symbol=n("symbol"),s.numericString=e=>s.string(e)&&!s.emptyStringOrWhitespace(e)&&!Number.isNaN(Number(e)),s.array=Array.isArray,s.buffer=e=>{var t,r,n,i;return null!==(i=null===(n=null===(r=null===(t=e)||void 0===t?void 0:t.constructor)||void 0===r?void 0:r.isBuffer)||void 0===n?void 0:n.call(r,e))&&void 0!==i&&i},s.nullOrUndefined=e=>s.null_(e)||s.undefined(e),s.object=e=>!s.null_(e)&&("object"==typeof e||s.function_(e)),s.iterable=e=>{var t;return s.function_(null===(t=e)||void 0===t?void 0:t[Symbol.iterator])},s.asyncIterable=e=>{var t;return s.function_(null===(t=e)||void 0===t?void 0:t[Symbol.asyncIterator])},s.generator=e=>s.iterable(e)&&s.function_(e.next)&&s.function_(e.throw),s.asyncGenerator=e=>s.asyncIterable(e)&&s.function_(e.next)&&s.function_(e.throw),s.nativePromise=e=>o("Promise")(e);s.promise=e=>s.nativePromise(e)||(e=>{var t,r;return s.function_(null===(t=e)||void 0===t?void 0:t.then)&&s.function_(null===(r=e)||void 0===r?void 0:r.catch)})(e),s.generatorFunction=o("GeneratorFunction"),s.asyncGeneratorFunction=e=>"AsyncGeneratorFunction"===i(e),s.asyncFunction=e=>"AsyncFunction"===i(e),s.boundFunction=e=>s.function_(e)&&!e.hasOwnProperty("prototype"),s.regExp=o("RegExp"),s.date=o("Date"),s.error=o("Error"),s.map=e=>o("Map")(e),s.set=e=>o("Set")(e),s.weakMap=e=>o("WeakMap")(e),s.weakSet=e=>o("WeakSet")(e),s.int8Array=o("Int8Array"),s.uint8Array=o("Uint8Array"),s.uint8ClampedArray=o("Uint8ClampedArray"),s.int16Array=o("Int16Array"),s.uint16Array=o("Uint16Array"),s.int32Array=o("Int32Array"),s.uint32Array=o("Uint32Array"),s.float32Array=o("Float32Array"),s.float64Array=o("Float64Array"),s.bigInt64Array=o("BigInt64Array"),s.bigUint64Array=o("BigUint64Array"),s.arrayBuffer=o("ArrayBuffer"),s.sharedArrayBuffer=o("SharedArrayBuffer"),s.dataView=o("DataView"),s.directInstanceOf=(e,t)=>Object.getPrototypeOf(e)===t.prototype,s.urlInstance=e=>o("URL")(e),s.urlString=e=>{if(!s.string(e))return!1;try{return new URL(e),!0}catch(e){return!1}},s.truthy=e=>Boolean(e),s.falsy=e=>!e,s.nan=e=>Number.isNaN(e);const a=new Set(["undefined","string","number","bigint","boolean","symbol"]);s.primitive=e=>s.null_(e)||a.has(typeof e),s.integer=e=>Number.isInteger(e),s.safeInteger=e=>Number.isSafeInteger(e),s.plainObject=e=>{if("Object"!==i(e))return!1;const t=Object.getPrototypeOf(e);return null===t||t===Object.getPrototypeOf({})};const c=new Set(["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"]);s.typedArray=e=>{const t=i(e);return void 0!==t&&c.has(t)};s.arrayLike=e=>!s.nullOrUndefined(e)&&!s.function_(e)&&(e=>s.safeInteger(e)&&e>=0)(e.length),s.inRange=(e,t)=>{if(s.number(t))return e>=Math.min(0,t)&&e<=Math.max(t,0);if(s.array(t)&&2===t.length)return e>=Math.min(...t)&&e<=Math.max(...t);throw new TypeError("Invalid range: "+JSON.stringify(t))};const u=["innerHTML","ownerDocument","style","attributes","nodeValue"];s.domElement=e=>s.object(e)&&1===e.nodeType&&s.string(e.nodeName)&&!s.plainObject(e)&&u.every(t=>t in e),s.observable=e=>{var t,r,n,i;return!!e&&(e===(null===(r=(t=e)[Symbol.observable])||void 0===r?void 0:r.call(t))||e===(null===(i=(n=e)["@@observable"])||void 0===i?void 0:i.call(n)))},s.nodeStream=e=>s.object(e)&&s.function_(e.pipe)&&!s.observable(e),s.infinite=e=>e===1/0||e===-1/0;const l=e=>t=>s.integer(t)&&Math.abs(t%2)===e;s.evenInteger=l(0),s.oddInteger=l(1),s.emptyArray=e=>s.array(e)&&0===e.length,s.nonEmptyArray=e=>s.array(e)&&e.length>0,s.emptyString=e=>s.string(e)&&0===e.length,s.nonEmptyString=e=>s.string(e)&&e.length>0;s.emptyStringOrWhitespace=e=>s.emptyString(e)||(e=>s.string(e)&&!/\S/.test(e))(e),s.emptyObject=e=>s.object(e)&&!s.map(e)&&!s.set(e)&&0===Object.keys(e).length,s.nonEmptyObject=e=>s.object(e)&&!s.map(e)&&!s.set(e)&&Object.keys(e).length>0,s.emptySet=e=>s.set(e)&&0===e.size,s.nonEmptySet=e=>s.set(e)&&e.size>0,s.emptyMap=e=>s.map(e)&&0===e.size,s.nonEmptyMap=e=>s.map(e)&&e.size>0;const h=(e,t,r)=>{if(!s.function_(t))throw new TypeError("Invalid predicate: "+JSON.stringify(t));if(0===r.length)throw new TypeError("Invalid number of values");return e.call(r,t)};s.any=(e,...t)=>(s.array(e)?e:[e]).some(e=>h(Array.prototype.some,e,t)),s.all=(e,...t)=>h(Array.prototype.every,e,t);const g=(e,t,r)=>{if(!e)throw new TypeError(`Expected value which is \`${t}\`, received value of type \`${s(r)}\`.`)};t.assert={undefined:e=>g(s.undefined(e),"undefined",e),string:e=>g(s.string(e),"string",e),number:e=>g(s.number(e),"number",e),bigint:e=>g(s.bigint(e),"bigint",e),function_:e=>g(s.function_(e),"Function",e),null_:e=>g(s.null_(e),"null",e),class_:e=>g(s.class_(e),"Class",e),boolean:e=>g(s.boolean(e),"boolean",e),symbol:e=>g(s.symbol(e),"symbol",e),numericString:e=>g(s.numericString(e),"string with a number",e),array:e=>g(s.array(e),"Array",e),buffer:e=>g(s.buffer(e),"Buffer",e),nullOrUndefined:e=>g(s.nullOrUndefined(e),"null or undefined",e),object:e=>g(s.object(e),"Object",e),iterable:e=>g(s.iterable(e),"Iterable",e),asyncIterable:e=>g(s.asyncIterable(e),"AsyncIterable",e),generator:e=>g(s.generator(e),"Generator",e),asyncGenerator:e=>g(s.asyncGenerator(e),"AsyncGenerator",e),nativePromise:e=>g(s.nativePromise(e),"native Promise",e),promise:e=>g(s.promise(e),"Promise",e),generatorFunction:e=>g(s.generatorFunction(e),"GeneratorFunction",e),asyncGeneratorFunction:e=>g(s.asyncGeneratorFunction(e),"AsyncGeneratorFunction",e),asyncFunction:e=>g(s.asyncFunction(e),"AsyncFunction",e),boundFunction:e=>g(s.boundFunction(e),"Function",e),regExp:e=>g(s.regExp(e),"RegExp",e),date:e=>g(s.date(e),"Date",e),error:e=>g(s.error(e),"Error",e),map:e=>g(s.map(e),"Map",e),set:e=>g(s.set(e),"Set",e),weakMap:e=>g(s.weakMap(e),"WeakMap",e),weakSet:e=>g(s.weakSet(e),"WeakSet",e),int8Array:e=>g(s.int8Array(e),"Int8Array",e),uint8Array:e=>g(s.uint8Array(e),"Uint8Array",e),uint8ClampedArray:e=>g(s.uint8ClampedArray(e),"Uint8ClampedArray",e),int16Array:e=>g(s.int16Array(e),"Int16Array",e),uint16Array:e=>g(s.uint16Array(e),"Uint16Array",e),int32Array:e=>g(s.int32Array(e),"Int32Array",e),uint32Array:e=>g(s.uint32Array(e),"Uint32Array",e),float32Array:e=>g(s.float32Array(e),"Float32Array",e),float64Array:e=>g(s.float64Array(e),"Float64Array",e),bigInt64Array:e=>g(s.bigInt64Array(e),"BigInt64Array",e),bigUint64Array:e=>g(s.bigUint64Array(e),"BigUint64Array",e),arrayBuffer:e=>g(s.arrayBuffer(e),"ArrayBuffer",e),sharedArrayBuffer:e=>g(s.sharedArrayBuffer(e),"SharedArrayBuffer",e),dataView:e=>g(s.dataView(e),"DataView",e),urlInstance:e=>g(s.urlInstance(e),"URL",e),urlString:e=>g(s.urlString(e),"string with a URL",e),truthy:e=>g(s.truthy(e),"truthy",e),falsy:e=>g(s.falsy(e),"falsy",e),nan:e=>g(s.nan(e),"NaN",e),primitive:e=>g(s.primitive(e),"primitive",e),integer:e=>g(s.integer(e),"integer",e),safeInteger:e=>g(s.safeInteger(e),"integer",e),plainObject:e=>g(s.plainObject(e),"plain object",e),typedArray:e=>g(s.typedArray(e),"TypedArray",e),arrayLike:e=>g(s.arrayLike(e),"array-like",e),domElement:e=>g(s.domElement(e),"Element",e),observable:e=>g(s.observable(e),"Observable",e),nodeStream:e=>g(s.nodeStream(e),"Node.js Stream",e),infinite:e=>g(s.infinite(e),"infinite number",e),emptyArray:e=>g(s.emptyArray(e),"empty array",e),nonEmptyArray:e=>g(s.nonEmptyArray(e),"non-empty array",e),emptyString:e=>g(s.emptyString(e),"empty string",e),nonEmptyString:e=>g(s.nonEmptyString(e),"non-empty string",e),emptyStringOrWhitespace:e=>g(s.emptyStringOrWhitespace(e),"empty string or whitespace",e),emptyObject:e=>g(s.emptyObject(e),"empty object",e),nonEmptyObject:e=>g(s.nonEmptyObject(e),"non-empty object",e),emptySet:e=>g(s.emptySet(e),"empty set",e),nonEmptySet:e=>g(s.nonEmptySet(e),"non-empty set",e),emptyMap:e=>g(s.emptyMap(e),"empty map",e),nonEmptyMap:e=>g(s.nonEmptyMap(e),"non-empty map",e),evenInteger:e=>g(s.evenInteger(e),"even integer",e),oddInteger:e=>g(s.oddInteger(e),"odd integer",e),directInstanceOf:(e,t)=>g(s.directInstanceOf(e,t),"T",e),inRange:(e,t)=>g(s.inRange(e,t),"in range",e),any:(e,...t)=>g(s.any(e,...t),"predicate returns truthy for any value",t),all:(e,...t)=>g(s.all(e,...t),"predicate returns truthy for all values",t)},Object.defineProperties(s,{class:{value:s.class_},function:{value:s.function_},null:{value:s.null_}}),Object.defineProperties(t.assert,{class:{value:t.assert.class_},function:{value:t.assert.function_},null:{value:t.assert.null_}}),t.default=s,e.exports=s,e.exports.default=s,e.exports.assert=t.assert},98298:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(93121),i=Number(process.versions.node.split(".")[0]),o=e=>{const t={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};e.timings=t;const r=e=>{const r=e.emit.bind(e);e.emit=(n,...i)=>("error"===n&&(t.error=Date.now(),t.phases.total=t.error-t.start,e.emit=r),r(n,...i))};r(e),e.prependOnceListener("abort",()=>{t.abort=Date.now(),(!t.response||i>=13)&&(t.phases.total=Date.now()-t.start)});const o=e=>{t.socket=Date.now(),t.phases.wait=t.socket-t.start;const r=()=>{t.lookup=Date.now(),t.phases.dns=t.lookup-t.socket};e.prependOnceListener("lookup",r),n.default(e,{connect:()=>{t.connect=Date.now(),void 0===t.lookup&&(e.removeListener("lookup",r),t.lookup=t.connect,t.phases.dns=t.lookup-t.socket),t.phases.tcp=t.connect-t.lookup},secureConnect:()=>{t.secureConnect=Date.now(),t.phases.tls=t.secureConnect-t.connect}})};e.socket?o(e.socket):e.prependOnceListener("socket",o);const s=()=>{var e;t.upload=Date.now(),t.phases.request=t.upload-(null!=(e=t.secureConnect)?e:t.connect)};return("boolean"==typeof e.writableFinished?!e.writableFinished:!e.finished||0!==e.outputSize||e.socket&&0!==e.socket.writableLength)?e.prependOnceListener("finish",s):s(),e.prependOnceListener("response",e=>{t.response=Date.now(),t.phases.firstByte=t.response-t.upload,e.timings=t,r(e),e.prependOnceListener("end",()=>{t.end=Date.now(),t.phases.download=t.end-t.response,t.phases.total=t.end-t.start})}),t};t.default=o,e.exports=o,e.exports.default=o},58069:(e,t,r)=>{"use strict";l.ifExists=function(e,t,r){return l(e,t,r).catch(()=>{})};const n=r(31669),i=r(46227),o=r(85622),s=r(97369),A=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,a={createPwshFile:!0,createCmdFile:s(),fs:r(35747)},c=new Map([[".js","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function u(e){const t={...a,...e},r=t.fs;return t.fs_={chmod:r.chmod?n.promisify(r.chmod):async()=>{},stat:n.promisify(r.stat),unlink:n.promisify(r.unlink),readFile:n.promisify(r.readFile),writeFile:n.promisify(r.writeFile)},t}async function l(e,t,r){const n=u(r);await n.fs_.stat(e),await async function(e,t,r){const n=await async function(e,t){const r=await t.fs_.readFile(e,"utf8"),n=r.trim().split(/\r*\n/)[0].match(A);if(!n){const t=o.extname(e).toLowerCase();return{program:c.get(t)||null,additionalArgs:""}}return{program:n[1],additionalArgs:n[2]}}(e,r);return await function(e,t){return i(o.dirname(e),{fs:t.fs})}(t,r),function(e,t,r,n){const i=u(n),o=[{generator:g,extension:""}];i.createCmdFile&&o.push({generator:h,extension:".cmd"});i.createPwshFile&&o.push({generator:f,extension:".ps1"});return Promise.all(o.map(n=>async function(e,t,r,n,i){const o=i.preserveSymlinks?"--preserve-symlinks":"",s=[r.additionalArgs,o].filter(e=>e).join(" ");return i=Object.assign({},i,{prog:r.program,args:s}),await function(e,t){return function(e,t){return t.fs_.unlink(e).catch(()=>{})}(e,t)}(t,i),await i.fs_.writeFile(t,n(e,t,i),"utf8"),function(e,t){return function(e,t){return t.fs_.chmod(e,493)}(e,t)}(t,i)}(e,t+n.extension,r,n.generator,i)))}(e,t,n,r)}(e,t,n)}function h(e,t,r){let n=o.relative(o.dirname(t),e).split("/").join("\\");const i=o.isAbsolute(n)?`"${n}"`:`"%~dp0\\${n}"`;let s,A=r.prog,a=r.args||"";const c=p(r.nodePath).win32;A?(s=`"%~dp0\\${A}.exe"`,n=i):(A=i,a="",n="");let u=r.progArgs?r.progArgs.join(" ")+" ":"",l=c?`@SET NODE_PATH=${c}\r\n`:"";return l+=s?`@IF EXIST ${s} (\r\n ${s} ${a} ${n} ${u}%*\r\n) ELSE (\r\n @SETLOCAL\r\n @SET PATHEXT=%PATHEXT:;.JS;=;%\r\n ${A} ${a} ${n} ${u}%*\r\n)`:`@${A} ${a} ${n} ${u}%*\r\n`,l}function g(e,t,r){let n,i=o.relative(o.dirname(t),e),s=r.prog&&r.prog.split("\\").join("/");i=i.split("\\").join("/");const A=o.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`;let a=r.args||"";const c=p(r.nodePath).posix;s?(n=`"$basedir/${r.prog}"`,i=A):(s=A,a="",i="");let u=r.progArgs?r.progArgs.join(" ")+" ":"",l="#!/bin/sh\n";l+='basedir=$(dirname "$(echo "$0" | sed -e \'s,\\\\,/,g\')")\n\ncase `uname` in\n *CYGWIN*) basedir=`cygpath -w "$basedir"`;;\nesac\n\n';const h=r.nodePath?`export NODE_PATH="${c}"\n`:"";return l+=n?h+`if [ -x ${n} ]; then\n`+` exec ${n} ${a} ${i} ${u}"$@"\nelse \n`+` exec ${s} ${a} ${i} ${u}"$@"\nfi\n`:`${h}${s} ${a} ${i} ${u}"$@"\nexit $?\n`,l}function f(e,t,r){let n=o.relative(o.dirname(t),e);const i=r.prog&&r.prog.split("\\").join("/");let s,A=i&&`"${i}$exe"`;n=n.split("\\").join("/");const a=o.isAbsolute(n)?`"${n}"`:`"$basedir/${n}"`;let c=r.args||"",u=p(r.nodePath);const l=u.win32,h=u.posix;A?(s=`"$basedir/${r.prog}$exe"`,n=a):(A=a,c="",n="");let g=r.progArgs?r.progArgs.join(" ")+" ":"",f='#!/usr/bin/env pwsh\n$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\n\n$exe=""\n'+(r.nodePath?`$env_node_path=$env:NODE_PATH\n$env:NODE_PATH="${l}"\n`:"")+'if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {\n # Fix case when both the Windows and Linux builds of Node\n # are installed in the same directory\n $exe=".exe"\n}';return r.nodePath&&(f=f+" else {\n"+` $env:NODE_PATH="${h}"\n}`),f+="\n",f=s?f+"$ret=0\n"+`if (Test-Path ${s}) {\n # Support pipeline input\n if ($MyInvocation.ExpectingInput) {\n`+` $input | & ${s} ${c} ${n} ${g}$args\n } else {\n`+` & ${s} ${c} ${n} ${g}$args\n }\n $ret=$LASTEXITCODE\n} else {\n # Support pipeline input\n if ($MyInvocation.ExpectingInput) {\n`+` $input | & ${A} ${c} ${n} ${g}$args\n } else {\n`+` & ${A} ${c} ${n} ${g}$args\n }\n $ret=$LASTEXITCODE\n}\n`+(r.nodePath?"$env:NODE_PATH=$env_node_path\n":"")+"exit $ret\n":f+"# Support pipeline input\nif ($MyInvocation.ExpectingInput) {\n"+` $input | & ${A} ${c} ${n} ${g}$args\n} else {\n`+` & ${A} ${c} ${n} ${g}$args\n}\n`+(r.nodePath?"$env:NODE_PATH=$env_node_path\n":"")+"exit $LASTEXITCODE\n",f}function p(e){if(!e)return{win32:"",posix:""};let t="string"==typeof e?e.split(o.delimiter):Array.from(e),r={};for(let e=0;e"/mnt/"+t.toLowerCase()):t[e];r.win32=r.win32?`${r.win32};${n}`:n,r.posix=r.posix?`${r.posix}:${i}`:i,r[e]={win32:n,posix:i}}return r}e.exports=l},27589:e=>{"use strict";const t=e.exports;e.exports.default=t;const r="[",n="]",i="",o=";",s="Apple_Terminal"===process.env.TERM_PROGRAM;t.cursorTo=(e,t)=>{if("number"!=typeof e)throw new TypeError("The `x` argument is required");return"number"!=typeof t?r+(e+1)+"G":r+(t+1)+";"+(e+1)+"H"},t.cursorMove=(e,t)=>{if("number"!=typeof e)throw new TypeError("The `x` argument is required");let n="";return e<0?n+=r+-e+"D":e>0&&(n+=r+e+"C"),t<0?n+=r+-t+"A":t>0&&(n+=r+t+"B"),n},t.cursorUp=(e=1)=>r+e+"A",t.cursorDown=(e=1)=>r+e+"B",t.cursorForward=(e=1)=>r+e+"C",t.cursorBackward=(e=1)=>r+e+"D",t.cursorLeft="",t.cursorSavePosition=s?"7":"",t.cursorRestorePosition=s?"8":"",t.cursorGetPosition="",t.cursorNextLine="",t.cursorPrevLine="",t.cursorHide="[?25l",t.cursorShow="[?25h",t.eraseLines=e=>{let r="";for(let n=0;n[n,"8",o,o,t,i,e,n,"8",o,o,i].join(""),t.image=(e,t={})=>{let r=n+"1337;File=inline=1";return t.width&&(r+=";width="+t.width),t.height&&(r+=";height="+t.height),!1===t.preserveAspectRatio&&(r+=";preserveAspectRatio=0"),r+":"+e.toString("base64")+i},t.iTerm={setCwd:(e=process.cwd())=>`${n}50;CurrentDir=${e}${i}`,annotation:(e,t={})=>{let r=n+"1337;";const o=void 0!==t.x,s=void 0!==t.y;if((o||s)&&(!o||!s||void 0===t.length))throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");return e=e.replace(/\|/g,""),r+=t.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",t.length>0?r+=(o?[e,t.length,t.x,t.y]:[t.length,e]).join("|"):r+=e,r+i}}},81337:e=>{"use strict";e.exports=({onlyFirst:e=!1}={})=>{const t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(t,e?void 0:"g")}},18483:(e,t,r)=>{"use strict";e=r.nmd(e);const n=(e,t)=>(...r)=>`[${e(...r)+t}m`,i=(e,t)=>(...r)=>{const n=e(...r);return`[${38+t};5;${n}m`},o=(e,t)=>(...r)=>{const n=e(...r);return`[${38+t};2;${n[0]};${n[1]};${n[2]}m`},s=e=>e,A=(e,t,r)=>[e,t,r],a=(e,t,r)=>{Object.defineProperty(e,t,{get:()=>{const n=r();return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0}),n},enumerable:!0,configurable:!0})};let c;const u=(e,t,n,i)=>{void 0===c&&(c=r(2744));const o=i?10:0,s={};for(const[r,i]of Object.entries(c)){const A="ansi16"===r?"ansi":r;r===t?s[A]=e(n,o):"object"==typeof i&&(s[A]=e(i[t],o))}return s};Object.defineProperty(e,"exports",{enumerable:!0,get:function(){const e=new Map,t={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};t.color.gray=t.color.blackBright,t.bgColor.bgGray=t.bgColor.bgBlackBright,t.color.grey=t.color.blackBright,t.bgColor.bgGrey=t.bgColor.bgBlackBright;for(const[r,n]of Object.entries(t)){for(const[r,i]of Object.entries(n))t[r]={open:`[${i[0]}m`,close:`[${i[1]}m`},n[r]=t[r],e.set(i[0],i[1]);Object.defineProperty(t,r,{value:n,enumerable:!1})}return Object.defineProperty(t,"codes",{value:e,enumerable:!1}),t.color.close="",t.bgColor.close="",a(t.color,"ansi",()=>u(n,"ansi16",s,!1)),a(t.color,"ansi256",()=>u(i,"ansi256",s,!1)),a(t.color,"ansi16m",()=>u(o,"rgb",A,!1)),a(t.bgColor,"ansi",()=>u(n,"ansi16",s,!0)),a(t.bgColor,"ansi256",()=>u(i,"ansi256",s,!0)),a(t.bgColor,"ansi16m",()=>u(o,"rgb",A,!0)),t}})},39920:e=>{"use strict";e.exports=(...e)=>[...new Set([].concat(...e))]},86792:e=>{"use strict";function t(e,t,i){e instanceof RegExp&&(e=r(e,i)),t instanceof RegExp&&(t=r(t,i));var o=n(e,t,i);return o&&{start:o[0],end:o[1],pre:i.slice(0,o[0]),body:i.slice(o[0]+e.length,o[1]),post:i.slice(o[1]+t.length)}}function r(e,t){var r=t.match(e);return r?r[0]:null}function n(e,t,r){var n,i,o,s,A,a=r.indexOf(e),c=r.indexOf(t,a+1),u=a;if(a>=0&&c>0){for(n=[],o=r.length;u>=0&&!A;)u==a?(n.push(u),a=r.indexOf(e,u+1)):1==n.length?A=[n.pop(),c]:((i=n.pop())=0?a:c;n.length&&(A=[o,s])}return A}e.exports=t,t.range=n},73975:(e,t,r)=>{"use strict";var n=r(86897).Duplex;function i(e){if(!(this instanceof i))return new i(e);if(this._bufs=[],this.length=0,"function"==typeof e){this._callback=e;var t=function(e){this._callback&&(this._callback(e),this._callback=null)}.bind(this);this.on("pipe",(function(e){e.on("error",t)})),this.on("unpipe",(function(e){e.removeListener("error",t)}))}else this.append(e);n.call(this)}r(31669).inherits(i,n),i.prototype._offset=function(e){var t,r=0,n=0;if(0===e)return[0,0];for(;nthis.length||e<0)){var t=this._offset(e);return this._bufs[t[0]][t[1]]}},i.prototype.slice=function(e,t){return"number"==typeof e&&e<0&&(e+=this.length),"number"==typeof t&&t<0&&(t+=this.length),this.copy(null,0,e,t)},i.prototype.copy=function(e,t,r,n){if(("number"!=typeof r||r<0)&&(r=0),("number"!=typeof n||n>this.length)&&(n=this.length),r>=this.length)return e||Buffer.alloc(0);if(n<=0)return e||Buffer.alloc(0);var i,o,s=!!e,A=this._offset(r),a=n-r,c=a,u=s&&t||0,l=A[1];if(0===r&&n==this.length){if(!s)return 1===this._bufs.length?this._bufs[0]:Buffer.concat(this._bufs,this.length);for(o=0;o(i=this._bufs[o].length-l))){this._bufs[o].copy(e,u,l,l+c);break}this._bufs[o].copy(e,u,l),u+=i,c-=i,l&&(l=0)}return e},i.prototype.shallowSlice=function(e,t){if(e=e||0,t="number"!=typeof t?this.length:t,e<0&&(e+=this.length),t<0&&(t+=this.length),e===t)return new i;var r=this._offset(e),n=this._offset(t),o=this._bufs.slice(r[0],n[0]+1);return 0==n[1]?o.pop():o[o.length-1]=o[o.length-1].slice(0,n[1]),0!=r[1]&&(o[0]=o[0].slice(r[1])),new i(o)},i.prototype.toString=function(e,t,r){return this.slice(t,r).toString(e)},i.prototype.consume=function(e){for(;this._bufs.length;){if(!(e>=this._bufs[0].length)){this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift()}return this},i.prototype.duplicate=function(){for(var e=0,t=new i;ethis.length?this.length:t;for(var n=this._offset(t),o=n[0],s=n[1];o=e.length){var a=A.indexOf(e,s);if(-1!==a)return this._reverseOffset([o,a]);s=A.length-e.length+1}else{var c=this._reverseOffset([o,s]);if(this._match(c,e))return c;s++}}s=0}return-1},i.prototype._match=function(e,t){if(this.length-e{var n=r(36547),i=r(86792);e.exports=function(e){if(!e)return[];"{}"===e.substr(0,2)&&(e="\\{\\}"+e.substr(2));return function e(t,r){var o=[],s=i("{","}",t);if(!s||/\$$/.test(s.pre))return[t];var a,c=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(s.body),l=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(s.body),d=c||l,C=s.body.indexOf(",")>=0;if(!d&&!C)return s.post.match(/,.*\}/)?(t=s.pre+"{"+s.body+A+s.post,e(t)):[t];if(d)a=s.body.split(/\.\./);else{if(1===(a=function e(t){if(!t)return[""];var r=[],n=i("{","}",t);if(!n)return t.split(",");var o=n.pre,s=n.body,A=n.post,a=o.split(",");a[a.length-1]+="{"+s+"}";var c=e(A);A.length&&(a[a.length-1]+=c.shift(),a.push.apply(a,c));return r.push.apply(r,a),r}(s.body)).length)if(1===(a=e(a[0],!1).map(h)).length)return(m=s.post.length?e(s.post,!1):[""]).map((function(e){return s.pre+a[0]+e}))}var E,I=s.pre,m=s.post.length?e(s.post,!1):[""];if(d){var y=u(a[0]),w=u(a[1]),B=Math.max(a[0].length,a[1].length),Q=3==a.length?Math.abs(u(a[2])):1,v=f;w0){var x=new Array(k+1).join("0");S=b<0?"-"+x+S.slice(1):x+S}}E.push(S)}}else E=n(a,(function(t){return e(t,!1)}));for(var F=0;F=t}},12235:(e,t,r)=>{"use strict";const n=r(54900),i=r(44617),o=r(1495),s=r(425),A=(e,t={})=>{let r=[];if(Array.isArray(e))for(let n of e){let e=A.create(n,t);Array.isArray(e)?r.push(...e):r.push(e)}else r=[].concat(A.create(e,t));return t&&!0===t.expand&&!0===t.nodupes&&(r=[...new Set(r)]),r};A.parse=(e,t={})=>s(e,t),A.stringify=(e,t={})=>n("string"==typeof e?A.parse(e,t):e,t),A.compile=(e,t={})=>("string"==typeof e&&(e=A.parse(e,t)),i(e,t)),A.expand=(e,t={})=>{"string"==typeof e&&(e=A.parse(e,t));let r=o(e,t);return!0===t.noempty&&(r=r.filter(Boolean)),!0===t.nodupes&&(r=[...new Set(r)]),r},A.create=(e,t={})=>""===e||e.length<3?[e]:!0!==t.expand?A.compile(e,t):A.expand(e,t),e.exports=A},44617:(e,t,r)=>{"use strict";const n=r(52169),i=r(4542);e.exports=(e,t={})=>{let r=(e,o={})=>{let s=i.isInvalidBrace(o),A=!0===e.invalid&&!0===t.escapeInvalid,a=!0===s||!0===A,c=!0===t.escapeInvalid?"\\":"",u="";if(!0===e.isOpen)return c+e.value;if(!0===e.isClose)return c+e.value;if("open"===e.type)return a?c+e.value:"(";if("close"===e.type)return a?c+e.value:")";if("comma"===e.type)return"comma"===e.prev.type?"":a?e.value:"|";if(e.value)return e.value;if(e.nodes&&e.ranges>0){let r=i.reduce(e.nodes),o=n(...r,{...t,wrap:!1,toRegex:!0});if(0!==o.length)return r.length>1&&o.length>1?`(${o})`:o}if(e.nodes)for(let t of e.nodes)u+=r(t,e);return u};return r(e)}},5384:e=>{"use strict";e.exports={MAX_LENGTH:65536,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:"\n",CHAR_NO_BREAK_SPACE:" ",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:"\t",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\ufeff"}},1495:(e,t,r)=>{"use strict";const n=r(52169),i=r(54900),o=r(4542),s=(e="",t="",r=!1)=>{let n=[];if(e=[].concat(e),!(t=[].concat(t)).length)return e;if(!e.length)return r?o.flatten(t).map(e=>`{${e}}`):t;for(let i of e)if(Array.isArray(i))for(let e of i)n.push(s(e,t,r));else for(let e of t)!0===r&&"string"==typeof e&&(e=`{${e}}`),n.push(Array.isArray(e)?s(i,e,r):i+e);return o.flatten(n)};e.exports=(e,t={})=>{let r=void 0===t.rangeLimit?1e3:t.rangeLimit,A=(e,a={})=>{e.queue=[];let c=a,u=a.queue;for(;"brace"!==c.type&&"root"!==c.type&&c.parent;)c=c.parent,u=c.queue;if(e.invalid||e.dollar)return void u.push(s(u.pop(),i(e,t)));if("brace"===e.type&&!0!==e.invalid&&2===e.nodes.length)return void u.push(s(u.pop(),["{}"]));if(e.nodes&&e.ranges>0){let A=o.reduce(e.nodes);if(o.exceedsLimit(...A,t.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let a=n(...A,t);return 0===a.length&&(a=i(e,t)),u.push(s(u.pop(),a)),void(e.nodes=[])}let l=o.encloseBrace(e),h=e.queue,g=e;for(;"brace"!==g.type&&"root"!==g.type&&g.parent;)g=g.parent,h=g.queue;for(let t=0;t{"use strict";const n=r(54900),{MAX_LENGTH:i,CHAR_BACKSLASH:o,CHAR_BACKTICK:s,CHAR_COMMA:A,CHAR_DOT:a,CHAR_LEFT_PARENTHESES:c,CHAR_RIGHT_PARENTHESES:u,CHAR_LEFT_CURLY_BRACE:l,CHAR_RIGHT_CURLY_BRACE:h,CHAR_LEFT_SQUARE_BRACKET:g,CHAR_RIGHT_SQUARE_BRACKET:f,CHAR_DOUBLE_QUOTE:p,CHAR_SINGLE_QUOTE:d,CHAR_NO_BREAK_SPACE:C,CHAR_ZERO_WIDTH_NOBREAK_SPACE:E}=r(5384);e.exports=(e,t={})=>{if("string"!=typeof e)throw new TypeError("Expected a string");let r=t||{},I="number"==typeof r.maxLength?Math.min(i,r.maxLength):i;if(e.length>I)throw new SyntaxError(`Input length (${e.length}), exceeds max characters (${I})`);let m,y={type:"root",input:e,nodes:[]},w=[y],B=y,Q=y,v=0,D=e.length,b=0,S=0;const k=()=>e[b++],x=e=>{if("text"===e.type&&"dot"===Q.type&&(Q.type="text"),!Q||"text"!==Q.type||"text"!==e.type)return B.nodes.push(e),e.parent=B,e.prev=Q,Q=e,e;Q.value+=e.value};for(x({type:"bos"});b0){if(B.ranges>0){B.ranges=0;let e=B.nodes.shift();B.nodes=[e,{type:"text",value:n(B)}]}x({type:"comma",value:m}),B.commas++}else if(m===a&&S>0&&0===B.commas){let e=B.nodes;if(0===S||0===e.length){x({type:"text",value:m});continue}if("dot"===Q.type){if(B.range=[],Q.value+=m,Q.type="range",3!==B.nodes.length&&5!==B.nodes.length){B.invalid=!0,B.ranges=0,Q.type="text";continue}B.ranges++,B.args=[];continue}if("range"===Q.type){e.pop();let t=e[e.length-1];t.value+=Q.value+m,Q=t,B.ranges--;continue}x({type:"dot",value:m})}else x({type:"text",value:m});else{if("brace"!==B.type){x({type:"text",value:m});continue}let e="close";B=w.pop(),B.close=!0,x({type:e,value:m}),S--,B=w[w.length-1]}else{S++;let e=Q.value&&"$"===Q.value.slice(-1)||!0===B.dollar;B=x({type:"brace",open:!0,close:!1,dollar:e,depth:S,commas:0,ranges:0,nodes:[]}),w.push(B),x({type:"open",value:m})}else{let e,r=m;for(!0!==t.keepQuotes&&(m="");b{e.nodes||("open"===e.type&&(e.isOpen=!0),"close"===e.type&&(e.isClose=!0),e.nodes||(e.type="text"),e.invalid=!0)});let e=w[w.length-1],t=e.nodes.indexOf(B);e.nodes.splice(t,1,...B.nodes)}}while(w.length>0);return x({type:"eos"}),y}},54900:(e,t,r)=>{"use strict";const n=r(4542);e.exports=(e,t={})=>{let r=(e,i={})=>{let o=t.escapeInvalid&&n.isInvalidBrace(i),s=!0===e.invalid&&!0===t.escapeInvalid,A="";if(e.value)return(o||s)&&n.isOpenOrClose(e)?"\\"+e.value:e.value;if(e.value)return e.value;if(e.nodes)for(let t of e.nodes)A+=r(t);return A};return r(e)}},4542:(e,t)=>{"use strict";t.isInteger=e=>"number"==typeof e?Number.isInteger(e):"string"==typeof e&&""!==e.trim()&&Number.isInteger(Number(e)),t.find=(e,t)=>e.nodes.find(e=>e.type===t),t.exceedsLimit=(e,r,n=1,i)=>!1!==i&&(!(!t.isInteger(e)||!t.isInteger(r))&&(Number(r)-Number(e))/Number(n)>=i),t.escapeNode=(e,t=0,r)=>{let n=e.nodes[t];n&&(r&&n.type===r||"open"===n.type||"close"===n.type)&&!0!==n.escaped&&(n.value="\\"+n.value,n.escaped=!0)},t.encloseBrace=e=>"brace"===e.type&&(e.commas>>0+e.ranges>>0==0&&(e.invalid=!0,!0)),t.isInvalidBrace=e=>"brace"===e.type&&(!(!0!==e.invalid&&!e.dollar)||(e.commas>>0+e.ranges>>0==0||!0!==e.open||!0!==e.close)&&(e.invalid=!0,!0)),t.isOpenOrClose=e=>"open"===e.type||"close"===e.type||(!0===e.open||!0===e.close),t.reduce=e=>e.reduce((e,t)=>("text"===t.type&&e.push(t.value),"range"===t.type&&(t.type="text"),e),[]),t.flatten=(...e)=>{const t=[],r=e=>{for(let n=0;n{"use strict";const n=r(85622),{watch:i}=r(35747),{readFile:o}=r(35747).promises,{isIP:s}=r(11631),A="win32"===process.platform?n.join(process.env.SystemDrive,"Windows\\System32\\drivers\\etc\\hosts"):"/etc/hosts",a=/^(?:(?:[a-zA-Z\d]|[a-zA-Z\d][a-zA-Z\d-]*[a-zA-Z\d])\.)*(?:[A-Za-z\d]|[A-Za-z\d][A-Za-z\d-]*[A-Za-z\d])$/,c=e=>a.test(e),u={encoding:"utf8"},l=/\s+/g;class h{constructor({watching:e,customHostsPath:t=A}){this._hostsPath=t,this._error=null,this._watcher=null,this._watching=e,this._hosts={},this._init()}_init(){"string"==typeof this._hostsPath&&(this._promise=(async()=>{await this._update(),this._promise=null,this._error||this._watching&&(this._watcher=i(this._hostsPath,{persistent:!1},e=>{"change"===e?this._update():this._watcher.close()}),this._watcher.once("error",e=>{this._error=e,this._hosts={}}),this._watcher.once("close",()=>{this._init()}))})())}async _update(){try{let e=await o(this._hostsPath,u);e=e.split("\n"),this._hosts={};for(let t of e){t=t.replace(l," ").trim();const e=t.split(" "),r=s(e[0]);if(!r)continue;const n=e.shift();for(const t of e){if(!c(t))break;if(this._hosts[t]){let e=!1;for(const n of this._hosts[t])if(n.family===r){e=!0;break}if(e)continue}else this._hosts[t]=[],this._hosts[t].expires=1/0;this._hosts[t].push({address:n,family:r,expires:1/0,ttl:1/0})}}}catch(e){this._hosts={},this._error=e}}async get(e){if(this._promise&&await this._promise,this._error)throw this._error;return this._hosts[e]}}const g={};h.getResolver=({customHostsPath:e,watching:t})=>{void 0!==e&&"string"!=typeof e&&(e=!1);const r=`${e}:${t=Boolean(t)}`;let n=g[r];return n||(n=new h({customHostsPath:e,watching:t}),g[r]=n,n)},e.exports=h},43261:(e,t,r)=>{"use strict";const{V4MAPPED:n,ADDRCONFIG:i,promises:{Resolver:o},lookup:s}=r(40881),{promisify:A}=r(31669),a=r(12087),{getResolver:c}=r(76438),u=Symbol("cacheableLookupCreateConnection"),l=Symbol("cacheableLookupInstance"),h=e=>{if(!e||"function"!=typeof e.createConnection)throw new Error("Expected an Agent instance as the first argument")},g=()=>{let e=!1,t=!1;for(const r of Object.values(a.networkInterfaces()))for(const n of r)if(!n.internal&&("IPv6"===n.family?t=!0:e=!0,e&&t))return{has4:e,has6:t};return{has4:e,has6:t}},f={ttl:!0};class p{constructor({customHostsPath:e,watchingHostsFile:t=!1,cache:r=new Map,maxTtl:n=1/0,resolver:i=new o,fallbackTtl:a=1,errorTtl:u=.15}={}){this.maxTtl=n,this.fallbackTtl=a,this.errorTtl=u,this._cache=r,this._resolver=i,this._lookup=A(s),this._resolver instanceof o?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=A(this._resolver.resolve4.bind(this._resolver)),this._resolve6=A(this._resolver.resolve6.bind(this._resolver))),this._iface=g(),this._hostsResolver=c({customHostsPath:e,watching:t}),this._pending={},this._nextRemovalTime=!1,this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.updateInterfaceInfo(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,t,r){if("function"==typeof t?(r=t,t={}):"number"==typeof t&&(t={family:t}),!r)throw new Error("Callback must be a function.");this.lookupAsync(e,t).then(e=>{t.all?r(null,e):r(null,e.address,e.family,e.expires,e.ttl)},r)}async lookupAsync(e,t={}){"number"==typeof t&&(t={family:t});let r=await this.query(e);if(6===t.family){const e=r.filter(e=>6===e.family);0===e.length&&t.hints&n?(e=>{for(const t of e)t.address="::ffff:"+t.address,t.family=6})(r):r=e}else 4===t.family&&(r=r.filter(e=>4===e.family));if(t.hints&i){const{_iface:e}=this;r=r.filter(t=>6===t.family?e.has6:e.has4)}if(0===r.length){const t=new Error("ENOTFOUND "+e);throw t.code="ENOTFOUND",t.hostname=e,t}return t.all?r:1===r.length?r[0]:this._getEntry(r,e)}async query(e){let t=await this._hostsResolver.get(e)||await this._cache.get(e);if(!t){const r=this._pending[e];if(r)t=await r;else{const r=this.queryAndCache(e);this._pending[e]=r,t=await r}}return t=t.map(e=>({...e})),t}async queryAndCache(e){const[t,r]=await Promise.all([this._resolve4(e,f).catch(()=>[]),this._resolve6(e,f).catch(()=>[])]);let n=0;if(t)for(const e of t)e.family=4,e.expires=Date.now()+1e3*e.ttl,n=Math.max(n,e.ttl);if(r)for(const e of r)e.family=6,e.expires=Date.now()+1e3*e.ttl,n=Math.max(n,e.ttl);let i=[...t||[],...r||[]];if(0===i.length)try{i=await this._lookup(e,{all:!0});for(const e of i)e.ttl=this.fallbackTtl,e.expires=Date.now()+1e3*e.ttl;n=1e3*this.fallbackTtl}catch(t){throw delete this._pending[e],"ENOTFOUND"===t.code&&(n=1e3*this.errorTtl,i.expires=Date.now()+n,await this._cache.set(e,i,n),this._tick(n)),t}else n=1e3*Math.min(this.maxTtl,n);return this.maxTtl>0&&n>0&&(i.expires=Date.now()+n,await this._cache.set(e,i,n),this._tick(n)),delete this._pending[e],i}_getEntry(e,t){return e[0]}tick(){}_tick(e){if(!(this._cache instanceof Map)||void 0===e)return;const t=this._nextRemovalTime;(!t||e{this._nextRemovalTime=!1;let e=1/0;const t=Date.now();for(const[r,{expires:n}]of this._cache)t>=n?this._cache.delete(r):n("lookup"in t||(t.lookup=this.lookup),e[u](t,r))}uninstall(e){if(h(e),e[u]){if(e[l]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[u],delete e[u],delete e[l]}}updateInterfaceInfo(){this._iface=g(),this._cache.clear()}clear(e){e?this._cache.delete(e):this._cache.clear()}}e.exports=p,e.exports.default=p},11200:(e,t,r)=>{"use strict";const n=r(28614),i=r(78835),o=r(19793),s=r(58764),A=r(86834),a=r(48491),c=r(55737),u=r(15751),l=r(72515);class h{constructor(e,t){if("function"!=typeof e)throw new TypeError("Parameter `request` must be a function");return this.cache=new l({uri:"string"==typeof t&&t,store:"string"!=typeof t&&t,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(t,r)=>{let l;if("string"==typeof t)l=f(i.parse(t)),t={};else if(t instanceof i.URL)l=f(i.parse(t.toString())),t={};else{const[e,...r]=(t.path||"").split("?"),n=r.length>0?"?"+r.join("?"):"";l=f({...t,pathname:e,search:n})}(t={headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1,...t,...g(l)}).headers=c(t.headers);const p=new n,d=o(i.format(l),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),C=`${t.method}:${d}`;let E=!1,I=!1;const m=t=>{I=!0;let n,i=!1;const o=new Promise(e=>{n=()=>{i||(i=!0,e())}}),c=e=>{if(E&&!t.forceRefresh){e.status=e.statusCode;const r=A.fromObject(E.cachePolicy).revalidatedPolicy(t,e);if(!r.modified){const t=r.policy.responseHeaders();(e=new a(E.statusCode,t,E.body,E.url)).cachePolicy=r.policy,e.fromCache=!0}}let n;e.fromCache||(e.cachePolicy=new A(t,e,t),e.fromCache=!1),t.cache&&e.cachePolicy.storable()?(n=u(e),(async()=>{try{const r=s.buffer(e);if(await Promise.race([o,new Promise(t=>e.once("end",t))]),i)return;const n=await r,A={cachePolicy:e.cachePolicy.toObject(),url:e.url,statusCode:e.fromCache?E.statusCode:e.statusCode,body:n};let a=t.strictTtl?e.cachePolicy.timeToLive():void 0;t.maxTtl&&(a=a?Math.min(a,t.maxTtl):t.maxTtl),await this.cache.set(C,A,a)}catch(e){p.emit("error",new h.CacheError(e))}})()):t.cache&&E&&(async()=>{try{await this.cache.delete(C)}catch(e){p.emit("error",new h.CacheError(e))}})(),p.emit("response",n||e),"function"==typeof r&&r(n||e)};try{const r=e(t,c);r.once("error",n),r.once("abort",n),p.emit("request",r)}catch(e){p.emit("error",new h.RequestError(e))}};return(async()=>{const e=async e=>{await Promise.resolve();const t=e.cache?await this.cache.get(C):void 0;if(void 0===t)return m(e);const n=A.fromObject(t.cachePolicy);if(n.satisfiesWithoutRevalidation(e)&&!e.forceRefresh){const e=n.responseHeaders(),i=new a(t.statusCode,e,t.body,t.url);i.cachePolicy=n,i.fromCache=!0,p.emit("response",i),"function"==typeof r&&r(i)}else E=t,e.headers=n.revalidationHeaders(e),m(e)},n=e=>p.emit("error",new h.CacheError(e));this.cache.once("error",n),p.on("response",()=>this.cache.removeListener("error",n));try{await e(t)}catch(e){t.automaticFailover&&!I&&m(t),p.emit("error",new h.CacheError(e))}})(),p}}}function g(e){const t={...e};return t.path=`${e.pathname||"/"}${e.search||""}`,delete t.pathname,delete t.search,t}function f(e){return{protocol:e.protocol,auth:e.auth,hostname:e.hostname||e.host||"localhost",port:e.port,pathname:e.pathname,search:e.search}}h.RequestError=class extends Error{constructor(e){super(e.message),this.name="RequestError",Object.assign(this,e)}},h.CacheError=class extends Error{constructor(e){super(e.message),this.name="CacheError",Object.assign(this,e)}},e.exports=h},54738:e=>{"use strict";const t=(e,t)=>{if("string"!=typeof e&&!Array.isArray(e))throw new TypeError("Expected the input to be `string | string[]`");t=Object.assign({pascalCase:!1},t);if(0===(e=Array.isArray(e)?e.map(e=>e.trim()).filter(e=>e.length).join("-"):e.trim()).length)return"";if(1===e.length)return t.pascalCase?e.toUpperCase():e.toLowerCase();return e!==e.toLowerCase()&&(e=(e=>{let t=!1,r=!1,n=!1;for(let i=0;it.toUpperCase()).replace(/\d+(\w|$)/g,e=>e.toUpperCase()),r=e,t.pascalCase?r.charAt(0).toUpperCase()+r.slice(1):r;var r};e.exports=t,e.exports.default=t},95882:(e,t,r)=>{"use strict";const n=r(18483),{stdout:i,stderr:o}=r(59428),{stringReplaceAll:s,stringEncaseCRLFWithFirstIndex:A}=r(73327),a=["ansi","ansi","ansi256","ansi16m"],c=Object.create(null);class u{constructor(e){return l(e)}}const l=e=>{const t={};return((e,t={})=>{if(t.level>3||t.level<0)throw new Error("The `level` option should be an integer from 0 to 3");const r=i?i.level:0;e.level=void 0===t.level?r:t.level})(t,e),t.template=(...e)=>I(t.template,...e),Object.setPrototypeOf(t,h.prototype),Object.setPrototypeOf(t.template,t),t.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},t.template.Instance=u,t.template};function h(e){return l(e)}for(const[e,t]of Object.entries(n))c[e]={get(){const r=d(this,p(t.open,t.close,this._styler),this._isEmpty);return Object.defineProperty(this,e,{value:r}),r}};c.visible={get(){const e=d(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:e}),e}};const g=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(const e of g)c[e]={get(){const{level:t}=this;return function(...r){const i=p(n.color[a[t]][e](...r),n.color.close,this._styler);return d(this,i,this._isEmpty)}}};for(const e of g){c["bg"+e[0].toUpperCase()+e.slice(1)]={get(){const{level:t}=this;return function(...r){const i=p(n.bgColor[a[t]][e](...r),n.bgColor.close,this._styler);return d(this,i,this._isEmpty)}}}}const f=Object.defineProperties(()=>{},{...c,level:{enumerable:!0,get(){return this._generator.level},set(e){this._generator.level=e}}}),p=(e,t,r)=>{let n,i;return void 0===r?(n=e,i=t):(n=r.openAll+e,i=t+r.closeAll),{open:e,close:t,openAll:n,closeAll:i,parent:r}},d=(e,t,r)=>{const n=(...e)=>C(n,1===e.length?""+e[0]:e.join(" "));return n.__proto__=f,n._generator=e,n._styler=t,n._isEmpty=r,n},C=(e,t)=>{if(e.level<=0||!t)return e._isEmpty?"":t;let r=e._styler;if(void 0===r)return t;const{openAll:n,closeAll:i}=r;if(-1!==t.indexOf(""))for(;void 0!==r;)t=s(t,r.close,r.open),r=r.parent;const o=t.indexOf("\n");return-1!==o&&(t=A(t,i,n,o)),n+t+i};let E;const I=(e,...t)=>{const[n]=t;if(!Array.isArray(n))return t.join(" ");const i=t.slice(1),o=[n.raw[0]];for(let e=1;e{"use strict";const t=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,r=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,n=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,i=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,o=new Map([["n","\n"],["r","\r"],["t","\t"],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a",""]]);function s(e){const t="u"===e[0],r="{"===e[1];return t&&!r&&5===e.length||"x"===e[0]&&3===e.length?String.fromCharCode(parseInt(e.slice(1),16)):t&&r?String.fromCodePoint(parseInt(e.slice(2,-1),16)):o.get(e)||e}function A(e,t){const r=[],o=t.trim().split(/\s*,\s*/g);let A;for(const t of o){const o=Number(t);if(Number.isNaN(o)){if(!(A=t.match(n)))throw new Error(`Invalid Chalk template style argument: ${t} (in style '${e}')`);r.push(A[2].replace(i,(e,t,r)=>t?s(t):r))}else r.push(o)}return r}function a(e){r.lastIndex=0;const t=[];let n;for(;null!==(n=r.exec(e));){const e=n[1];if(n[2]){const r=A(e,n[2]);t.push([e].concat(r))}else t.push([e])}return t}function c(e,t){const r={};for(const e of t)for(const t of e.styles)r[t[0]]=e.inverse?null:t.slice(1);let n=e;for(const[e,t]of Object.entries(r))if(Array.isArray(t)){if(!(e in n))throw new Error("Unknown Chalk style: "+e);n=t.length>0?n[e](...t):n[e]}return n}e.exports=(e,r)=>{const n=[],i=[];let o=[];if(r.replace(t,(t,r,A,u,l,h)=>{if(r)o.push(s(r));else if(u){const t=o.join("");o=[],i.push(0===n.length?t:c(e,n)(t)),n.push({inverse:A,styles:a(u)})}else if(l){if(0===n.length)throw new Error("Found extraneous } in Chalk template literal");i.push(c(e,n)(o.join(""))),o=[],n.pop()}else o.push(h)}),i.push(o.join("")),n.length>0){const e=`Chalk template literal is missing ${n.length} closing bracket${1===n.length?"":"s"} (\`}\`)`;throw new Error(e)}return i.join("")}},73327:e=>{"use strict";e.exports={stringReplaceAll:(e,t,r)=>{let n=e.indexOf(t);if(-1===n)return e;const i=t.length;let o=0,s="";do{s+=e.substr(o,n-o)+t+r,o=n+i,n=e.indexOf(t,o)}while(-1!==n);return s+=e.substr(o),s},stringEncaseCRLFWithFirstIndex:(e,t,r,n)=>{let i=0,o="";do{const s="\r"===e[n-1];o+=e.substr(i,(s?n-1:n)-i)+t+(s?"\r\n":"\n")+r,i=n+1,n=e.indexOf("\n",i)}while(-1!==n);return o+=e.substr(i),o}}},31059:(e,t,r)=>{var n=r(31669),i=r(24250);function o(){}o.prototype.match=function(e){var t,r,n,o,s=0,A=0,a=0,c=e.fInputBytes,u=e.fInputLen;e:for(t=0;t{var n=r(31669),i=r(24250);function o(){this.charValue=0,this.index=0,this.nextIndex=0,this.error=!1,this.done=!1,this.reset=function(){this.charValue=0,this.index=-1,this.nextIndex=0,this.error=!1,this.done=!1},this.nextByte=function(e){return this.nextIndex>=e.fRawLength?(this.done=!0,-1):255&e.fRawInput[this.nextIndex++]}}function s(){}function A(e,t){e.index=e.nextIndex,e.error=!1;var r=0,n=0,i=0;return(r=e.charValue=e.nextByte(t))<0?e.done=!0:r<=141||(n=e.nextByte(t),e.charValue=e.charValue<<8|n,r>=161&&r<=254?n<161&&(e.error=!0):142!=r?143==r&&(i=e.nextByte(t),e.charValue=e.charValue<<8|i,i<161&&(e.error=!0)):n<161&&(e.error=!0)),0==e.done}s.prototype.match=function(e){var t,r=0,n=0,s=0,A=0,a=0,c=new o;e:{for(c.reset();this.nextChar(c,e);){if(A++,c.error)s++;else{var u=4294967295&c.charValue;u<=255?0:(r++,null!=this.commonChars&&function e(t,r,n,i){if(i>>1);return r>t[o]?e(t,r,o+1,i):r=0&&n++)}if(s>=2&&5*s>=r)break e}if(r<=10&&0==s)a=0==r&&A<10?0:10;else if(r<20*s)a=0;else if(null==this.commonChars)(a=30+r-20*s)>100&&(a=100);else{var l=90/Math.log(parseFloat(r)/4);a=Math.floor(Math.log(n+1)*l+10),a=Math.min(a,100)}}return 0==a?null:new i(e,this,a)},s.prototype.nextChar=function(e,t){},e.exports.sjis=function(){this.name=function(){return"Shift-JIS"},this.language=function(){return"ja"},this.commonChars=[33088,33089,33090,33093,33115,33129,33130,33141,33142,33440,33442,33444,33449,33450,33451,33453,33455,33457,33459,33461,33463,33469,33470,33473,33476,33477,33478,33480,33481,33484,33485,33500,33504,33511,33512,33513,33514,33520,33521,33601,33603,33614,33615,33624,33630,33634,33639,33653,33654,33673,33674,33675,33677,33683,36502,37882,38314],this.nextChar=function(e,t){var r;if(e.index=e.nextIndex,e.error=!1,(r=e.charValue=e.nextByte(t))<0)return!1;if(r<=127||r>160&&r<=223)return!0;var n=e.nextByte(t);return!(n<0)&&(e.charValue=r<<8|n,n>=64&&n<=127||n>=128&&n<=255||(e.error=!0),!0)}},n.inherits(e.exports.sjis,s),e.exports.big5=function(){this.name=function(){return"Big5"},this.language=function(){return"zh"},this.commonChars=[41280,41281,41282,41283,41287,41289,41333,41334,42048,42054,42055,42056,42065,42068,42071,42084,42090,42092,42103,42147,42148,42151,42177,42190,42193,42207,42216,42237,42304,42312,42328,42345,42445,42471,42583,42593,42594,42600,42608,42664,42675,42681,42707,42715,42726,42738,42816,42833,42841,42970,43171,43173,43181,43217,43219,43236,43260,43456,43474,43507,43627,43706,43710,43724,43772,44103,44111,44208,44242,44377,44745,45024,45290,45423,45747,45764,45935,46156,46158,46412,46501,46525,46544,46552,46705,47085,47207,47428,47832,47940,48033,48593,49860,50105,50240,50271],this.nextChar=function(e,t){e.index=e.nextIndex,e.error=!1;var r=e.charValue=e.nextByte(t);if(r<0)return!1;if(r<=127||255==r)return!0;var n=e.nextByte(t);return!(n<0)&&(e.charValue=e.charValue<<8|n,(n<64||127==n||255==n)&&(e.error=!0),!0)}},n.inherits(e.exports.big5,s),e.exports.euc_jp=function(){this.name=function(){return"EUC-JP"},this.language=function(){return"ja"},this.commonChars=[41377,41378,41379,41382,41404,41418,41419,41430,41431,42146,42148,42150,42152,42154,42155,42156,42157,42159,42161,42163,42165,42167,42169,42171,42173,42175,42176,42177,42179,42180,42182,42183,42184,42185,42186,42187,42190,42191,42192,42206,42207,42209,42210,42212,42216,42217,42218,42219,42220,42223,42226,42227,42402,42403,42404,42406,42407,42410,42413,42415,42416,42419,42421,42423,42424,42425,42431,42435,42438,42439,42440,42441,42443,42448,42453,42454,42455,42462,42464,42465,42469,42473,42474,42475,42476,42477,42483,47273,47572,47854,48072,48880,49079,50410,50940,51133,51896,51955,52188,52689],this.nextChar=A},n.inherits(e.exports.euc_jp,s),e.exports.euc_kr=function(){this.name=function(){return"EUC-KR"},this.language=function(){return"ko"},this.commonChars=[45217,45235,45253,45261,45268,45286,45293,45304,45306,45308,45496,45497,45511,45527,45538,45994,46011,46274,46287,46297,46315,46501,46517,46527,46535,46569,46835,47023,47042,47054,47270,47278,47286,47288,47291,47337,47531,47534,47564,47566,47613,47800,47822,47824,47857,48103,48115,48125,48301,48314,48338,48374,48570,48576,48579,48581,48838,48840,48863,48878,48888,48890,49057,49065,49088,49124,49131,49132,49144,49319,49327,49336,49338,49339,49341,49351,49356,49358,49359,49366,49370,49381,49403,49404,49572,49574,49590,49622,49631,49654,49656,50337,50637,50862,51151,51153,51154,51160,51173,51373],this.nextChar=A},n.inherits(e.exports.euc_kr,s),e.exports.gb_18030=function(){this.name=function(){return"GB18030"},this.language=function(){return"zh"},this.nextChar=function(e,t){e.index=e.nextIndex,e.error=!1;var r=0,n=0,i=0,o=0;e:if((r=e.charValue=e.nextByte(t))<0)e.done=!0;else if(!(r<=128))if(n=e.nextByte(t),e.charValue=e.charValue<<8|n,r>=129&&r<=254){if(n>=64&&n<=126||n>=80&&n<=254)break e;if(n>=48&&n<=57&&(i=e.nextByte(t))>=129&&i<=254&&(o=e.nextByte(t))>=48&&o<=57){e.charValue=e.charValue<<16|i<<8|o;break e}e.error=!0}else;return 0==e.done},this.commonChars=[41377,41378,41379,41380,41392,41393,41457,41459,41889,41900,41914,45480,45496,45502,45755,46025,46070,46323,46525,46532,46563,46767,46804,46816,47010,47016,47037,47062,47069,47284,47327,47350,47531,47561,47576,47610,47613,47821,48039,48086,48097,48122,48316,48347,48382,48588,48845,48861,49076,49094,49097,49332,49389,49611,49883,50119,50396,50410,50636,50935,51192,51371,51403,51413,51431,51663,51706,51889,51893,51911,51920,51926,51957,51965,52460,52728,52906,52932,52946,52965,53173,53186,53206,53442,53445,53456,53460,53671,53930,53938,53941,53947,53972,54211,54224,54269,54466,54490,54754,54992]},n.inherits(e.exports.gb_18030,s)},71216:(e,t,r)=>{var n=r(31669),i=r(24250);function o(e,t){this.byteIndex=0,this.ngram=0,this.ngramList=e,this.byteMap=t,this.ngramCount=0,this.hitCount=0,this.spaceChar,this.search=function(e,t){var r=0;return e[r+32]<=t&&(r+=32),e[r+16]<=t&&(r+=16),e[r+8]<=t&&(r+=8),e[r+4]<=t&&(r+=4),e[r+2]<=t&&(r+=2),e[r+1]<=t&&(r+=1),e[r]>t&&(r-=1),r<0||e[r]!=t?-1:r},this.lookup=function(e){this.ngramCount+=1,this.search(this.ngramList,e)>=0&&(this.hitCount+=1)},this.addByte=function(e){this.ngram=(this.ngram<<8)+(255&e)&16777215,this.lookup(this.ngram)},this.nextByte=function(e){return this.byteIndex>=e.fInputLen?-1:255&e.fInputBytes[this.byteIndex++]},this.parse=function(e,t){var r,n=!1;for(this.spaceChar=t;(r=this.nextByte(e))>=0;){var i=this.byteMap[r];0!=i&&(i==this.spaceChar&&n||this.addByte(i),n=i==this.spaceChar)}this.addByte(this.spaceChar);var o=this.hitCount/this.ngramCount;return o>.33?98:Math.floor(300*o)}}function s(e,t){this.fLang=e,this.fNGrams=t}function A(){}A.prototype.spaceChar=32,A.prototype.ngrams=function(){},A.prototype.byteMap=function(){},A.prototype.match=function(e){var t=this.ngrams();if(!(Array.isArray(t)&&t[0]instanceof s))return(a=new o(t,this.byteMap()).parse(e,this.spaceChar))<=0?null:new i(e,this,a);for(var r=-1,n=null,A=t.length-1;A>=0;A--){var a,c=t[A];(a=new o(c.fNGrams,this.byteMap()).parse(e,this.spaceChar))>r&&(r=a,n=c.fLang)}var u=this.name(e);return r<=0?null:new i(e,this,r,u,n)},e.exports.ISO_8859_1=function(){this.byteMap=function(){return[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,170,32,32,32,32,32,32,32,32,32,32,181,32,32,32,32,186,32,32,32,32,32,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,32,248,249,250,251,252,253,254,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,32,248,249,250,251,252,253,254,255]},this.ngrams=function(){return[new s("da",[2122086,2122100,2122853,2123118,2123122,2123375,2123873,2124064,2125157,2125671,2126053,2126697,2126708,2126953,2127465,6383136,6385184,6385252,6386208,6386720,6579488,6579566,6579570,6579572,6627443,6644768,6644837,6647328,6647396,6648352,6648421,6648608,6648864,6713202,6776096,6776174,6776178,6907749,6908960,6909543,7038240,7039845,7103858,7104871,7105637,7169380,7234661,7234848,7235360,7235429,7300896,7302432,7303712,7398688,7479396,7479397,7479411,7496992,7566437,7610483,7628064,7628146,7629164,7759218]),new s("de",[2122094,2122101,2122341,2122849,2122853,2122857,2123113,2123621,2123873,2124142,2125161,2126691,2126693,2127214,2127461,2127471,2127717,2128501,6448498,6514720,6514789,6514804,6578547,6579566,6579570,6580581,6627428,6627443,6646126,6646132,6647328,6648352,6648608,6776174,6841710,6845472,6906728,6907168,6909472,6909541,6911008,7104867,7105637,7217249,7217252,7217267,7234592,7234661,7234848,7235360,7235429,7238757,7479396,7496805,7497065,7562088,7566437,7610468,7628064,7628142,7628146,7695972,7695975,7759218]),new s("en",[2122016,2122094,2122341,2122607,2123375,2123873,2123877,2124142,2125153,2125670,2125938,2126437,2126689,2126708,2126952,2126959,2127720,6383972,6384672,6385184,6385252,6386464,6386720,6386789,6386793,6561889,6561908,6627425,6627443,6627444,6644768,6647412,6648352,6648608,6713202,6840692,6841632,6841714,6906912,6909472,6909543,6909806,6910752,7217249,7217268,7234592,7235360,7238688,7300640,7302688,7303712,7496992,7500576,7544929,7544948,7561577,7566368,7610484,7628146,7628897,7628901,7629167,7630624,7631648]),new s("es",[2122016,2122593,2122607,2122853,2123116,2123118,2123123,2124142,2124897,2124911,2125921,2125935,2125938,2126197,2126437,2126693,2127214,2128160,6365283,6365284,6365285,6365292,6365296,6382441,6382703,6384672,6386208,6386464,6515187,6516590,6579488,6579564,6582048,6627428,6627429,6627436,6646816,6647328,6647412,6648608,6648692,6907246,6943598,7102752,7106419,7217253,7238757,7282788,7282789,7302688,7303712,7303968,7364978,7435621,7495968,7497075,7544932,7544933,7544944,7562528,7628064,7630624,7693600,15953440]),new s("fr",[2122101,2122607,2122849,2122853,2122869,2123118,2123124,2124897,2124901,2125921,2125935,2125938,2126197,2126693,2126703,2127214,2154528,6385268,6386793,6513952,6516590,6579488,6579571,6583584,6627425,6627427,6627428,6627429,6627436,6627440,6627443,6647328,6647412,6648352,6648608,6648864,6649202,6909806,6910752,6911008,7102752,7103776,7103859,7169390,7217252,7234848,7238432,7238688,7302688,7302772,7304562,7435621,7479404,7496992,7544929,7544932,7544933,7544940,7544944,7610468,7628064,7629167,7693600,7696928]),new s("it",[2122092,2122600,2122607,2122853,2122857,2123040,2124140,2124142,2124897,2125925,2125938,2127214,6365283,6365284,6365296,6365299,6386799,6514789,6516590,6579564,6580512,6627425,6627427,6627428,6627433,6627436,6627440,6627443,6646816,6646892,6647412,6648352,6841632,6889569,6889571,6889572,6889587,6906144,6908960,6909472,6909806,7102752,7103776,7104800,7105633,7234848,7235872,7237408,7238757,7282785,7282788,7282793,7282803,7302688,7302757,7366002,7495968,7496992,7563552,7627040,7628064,7629088,7630624,8022383]),new s("nl",[2122092,2122341,2122849,2122853,2122857,2123109,2123118,2123621,2123877,2124142,2125153,2125157,2125680,2126949,2127457,2127461,2127471,2127717,2128489,6381934,6381938,6385184,6385252,6386208,6386720,6514804,6579488,6579566,6579570,6627426,6627446,6645102,6645106,6647328,6648352,6648435,6648864,6776174,6841716,6907168,6909472,6909543,6910752,7217250,7217252,7217253,7217256,7217263,7217270,7234661,7235360,7302756,7303026,7303200,7303712,7562088,7566437,7610468,7628064,7628142,7628146,7758190,7759218,7761775]),new s("no",[2122100,2122102,2122853,2123118,2123122,2123375,2123873,2124064,2125157,2125671,2126053,2126693,2126699,2126703,2126708,2126953,2127465,2155808,6385252,6386208,6386720,6579488,6579566,6579572,6627443,6644768,6647328,6647397,6648352,6648421,6648864,6648948,6713202,6776174,6908779,6908960,6909543,7038240,7039845,7103776,7105637,7169380,7169390,7217267,7234848,7235360,7235429,7237221,7300896,7302432,7303712,7398688,7479411,7496992,7565165,7566437,7610483,7628064,7628142,7628146,7629164,7631904,7631973,7759218]),new s("pt",[2122016,2122607,2122849,2122853,2122863,2123040,2123123,2125153,2125423,2125600,2125921,2125935,2125938,2126197,2126437,2126693,2127213,6365281,6365283,6365284,6365296,6382693,6382703,6384672,6386208,6386273,6386464,6516589,6516590,6578464,6579488,6582048,6582131,6627425,6627428,6647072,6647412,6648608,6648692,6906144,6906721,7169390,7238757,7238767,7282785,7282787,7282788,7282789,7282800,7303968,7364978,7435621,7495968,7497075,7544929,7544932,7544933,7544944,7566433,7628064,7630624,7693600,14905120,15197039]),new s("sv",[2122100,2122102,2122853,2123118,2123510,2123873,2124064,2124142,2124655,2125157,2125667,2126053,2126699,2126703,2126708,2126953,2127457,2127465,2155634,6382693,6385184,6385252,6386208,6386804,6514720,6579488,6579566,6579570,6579572,6644768,6647328,6648352,6648864,6747762,6776174,6909036,6909543,7037216,7105568,7169380,7217267,7233824,7234661,7235360,7235429,7235950,7299944,7302432,7302688,7398688,7479393,7479411,7495968,7564129,7565165,7610483,7627040,7628064,7628146,7629164,7631904,7758194,14971424,16151072])]},this.name=function(e){return e&&e.fC1Bytes?"windows-1252":"ISO-8859-1"}},n.inherits(e.exports.ISO_8859_1,A),e.exports.ISO_8859_2=function(){this.byteMap=function(){return[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,177,32,179,32,181,182,32,32,185,186,187,188,32,190,191,32,177,32,179,32,181,182,183,32,185,186,187,188,32,190,191,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,32,248,249,250,251,252,253,254,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,32,248,249,250,251,252,253,254,32]},this.ngrams=function(){return[new s("cs",[2122016,2122361,2122863,2124389,2125409,2125413,2125600,2125668,2125935,2125938,2126072,2126447,2126693,2126703,2126708,2126959,2127392,2127481,2128481,6365296,6513952,6514720,6627440,6627443,6627446,6647072,6647533,6844192,6844260,6910836,6972704,7042149,7103776,7104800,7233824,7268640,7269408,7269664,7282800,7300206,7301737,7304052,7304480,7304801,7368548,7368554,7369327,7403621,7562528,7565173,7566433,7566441,7566446,7628146,7630573,7630624,7676016,12477728,14773997,15296623,15540336,15540339,15559968,16278884]),new s("hu",[2122016,2122106,2122341,2123111,2123116,2123365,2123873,2123887,2124147,2124645,2124649,2124790,2124901,2125153,2125157,2125161,2125413,2126714,2126949,2156915,6365281,6365291,6365293,6365299,6384416,6385184,6388256,6447470,6448494,6645625,6646560,6646816,6646885,6647072,6647328,6648421,6648864,6648933,6648948,6781216,6844263,6909556,6910752,7020641,7075450,7169383,7170414,7217249,7233899,7234923,7234925,7238688,7300985,7544929,7567973,7567988,7568097,7596391,7610465,7631904,7659891,8021362,14773792,15299360]),new s("pl",[2122618,2122863,2124064,2124389,2124655,2125153,2125161,2125409,2125417,2125668,2125935,2125938,2126697,2127648,2127721,2127737,2128416,2128481,6365296,6365303,6385257,6514720,6519397,6519417,6582048,6584937,6627440,6627443,6627447,6627450,6645615,6646304,6647072,6647401,6778656,6906144,6907168,6907242,7037216,7039264,7039333,7170405,7233824,7235937,7235941,7282800,7305057,7305065,7368556,7369313,7369327,7369338,7502437,7502457,7563754,7564137,7566433,7825765,7955304,7957792,8021280,8022373,8026400,15955744]),new s("ro",[2122016,2122083,2122593,2122597,2122607,2122613,2122853,2122857,2124897,2125153,2125925,2125938,2126693,2126819,2127214,2144873,2158190,6365283,6365284,6386277,6386720,6386789,6386976,6513010,6516590,6518048,6546208,6579488,6627425,6627427,6627428,6627440,6627443,6644e3,6646048,6646885,6647412,6648692,6889569,6889571,6889572,6889584,6907168,6908192,6909472,7102752,7103776,7106418,7107945,7234848,7238770,7303712,7365998,7496992,7497057,7501088,7594784,7628064,7631477,7660320,7694624,7695392,12216608,15625760])]},this.name=function(e){return e&&e.fC1Bytes?"windows-1250":"ISO-8859-2"}},n.inherits(e.exports.ISO_8859_2,A),e.exports.ISO_8859_5=function(){this.byteMap=function(){return[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,241,242,243,244,245,246,247,248,249,250,251,252,32,254,255,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,32,241,242,243,244,245,246,247,248,249,250,251,252,32,254,255]},this.ngrams=function(){return[2150944,2151134,2151646,2152400,2152480,2153168,2153182,2153936,2153941,2154193,2154462,2154464,2154704,2154974,2154978,2155230,2156514,2158050,13688280,13689580,13884960,14015468,14015960,14016994,14017056,14164191,14210336,14211104,14216992,14407133,14407712,14413021,14536736,14538016,14538965,14538991,14540320,14540498,14557394,14557407,14557409,14602784,14602960,14603230,14604576,14605292,14605344,14606818,14671579,14672085,14672088,14672094,14733522,14734804,14803664,14803666,14803672,14806816,14865883,14868e3,14868192,14871584,15196894,15459616]},this.name=function(e){return"ISO-8859-5"},this.language=function(){return"ru"}},n.inherits(e.exports.ISO_8859_5,A),e.exports.ISO_8859_6=function(){this.byteMap=function(){return[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,32,32,32,32,32,224,225,226,227,228,229,230,231,232,233,234,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]},this.ngrams=function(){return[2148324,2148326,2148551,2152932,2154986,2155748,2156006,2156743,13050055,13091104,13093408,13095200,13100064,13100227,13100231,13100232,13100234,13100236,13100237,13100239,13100243,13100249,13100258,13100261,13100264,13100266,13100320,13100576,13100746,13115591,13181127,13181153,13181156,13181157,13181160,13246663,13574343,13617440,13705415,13748512,13836487,14229703,14279913,14805536,14950599,14993696,15001888,15002144,15016135,15058720,15059232,15066656,15081671,15147207,15189792,15255524,15263264,15278279,15343815,15343845,15343848,15386912,15388960,15394336]},this.name=function(e){return"ISO-8859-6"},this.language=function(){return"ar"}},n.inherits(e.exports.ISO_8859_6,A),e.exports.ISO_8859_7=function(){this.byteMap=function(){return[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,161,162,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,220,32,221,222,223,32,252,32,253,254,192,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,32,243,244,245,246,247,248,249,250,251,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,32]},this.ngrams=function(){return[2154989,2154992,2155497,2155753,2156016,2156320,2157281,2157797,2158049,2158368,2158817,2158831,2158833,2159604,2159605,2159847,2159855,14672160,14754017,14754036,14805280,14806304,14807292,14807584,14936545,15067424,15069728,15147252,15199520,15200800,15278324,15327520,15330014,15331872,15393257,15393268,15525152,15540449,15540453,15540464,15589664,15725088,15725856,15790069,15790575,15793184,15868129,15868133,15868138,15868144,15868148,15983904,15984416,15987951,16048416,16048617,16050157,16050162,16050666,16052e3,16052213,16054765,16379168,16706848]},this.name=function(e){return e&&e.fC1Bytes?"windows-1253":"ISO-8859-7"},this.language=function(){return"el"}},n.inherits(e.exports.ISO_8859_7,A),e.exports.ISO_8859_8=function(){this.byteMap=function(){return[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,181,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,32,32,32,32,32]},this.ngrams=function(){return[new s("he",[2154725,2154727,2154729,2154746,2154985,2154990,2155744,2155749,2155753,2155758,2155762,2155769,2155770,2157792,2157796,2158304,2159340,2161132,14744096,14950624,14950625,14950628,14950636,14950638,14950649,15001056,15065120,15068448,15068960,15071264,15071776,15278308,15328288,15328762,15329773,15330592,15331104,15333408,15333920,15474912,15474916,15523872,15524896,15540448,15540449,15540452,15540460,15540462,15540473,15655968,15671524,15787040,15788320,15788525,15920160,16261348,16312813,16378912,16392416,16392417,16392420,16392428,16392430,16392441]),new s("he",[2154725,2154732,2155753,2155756,2155758,2155760,2157040,2157810,2157817,2158053,2158057,2158565,2158569,2160869,2160873,2161376,2161381,2161385,14688484,14688492,14688493,14688506,14738464,14738916,14740512,14741024,14754020,14754029,14754042,14950628,14950633,14950636,14950637,14950639,14950648,14950650,15002656,15065120,15066144,15196192,15327264,15327520,15328288,15474916,15474925,15474938,15528480,15530272,15591913,15591920,15591928,15605988,15605997,15606010,15655200,15655968,15918112,16326884,16326893,16326906,16376864,16441376,16442400,16442857])]},this.name=function(e){return e&&e.fC1Bytes?"windows-1255":"ISO-8859-8"},this.language=function(){return"he"}},n.inherits(e.exports.ISO_8859_8,A),e.exports.ISO_8859_9=function(){this.byteMap=function(){return[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,170,32,32,32,32,32,32,32,32,32,32,181,32,32,32,32,186,32,32,32,32,32,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,32,248,249,250,251,252,105,254,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,32,248,249,250,251,252,253,254,255]},this.ngrams=function(){return[2122337,2122345,2122357,2122849,2122853,2123621,2123873,2124140,2124641,2124655,2125153,2125676,2126689,2126945,2127461,2128225,6365282,6384416,6384737,6384993,6385184,6385405,6386208,6386273,6386429,6386685,6388065,6449522,6578464,6579488,6580512,6627426,6627435,6644841,6647328,6648352,6648425,6648681,6909029,6909472,6909545,6910496,7102830,7102834,7103776,7103858,7217249,7217250,7217259,7234657,7234661,7234848,7235872,7235950,7273760,7498094,7535982,7759136,7954720,7958386,16608800,16608868,16609021,16642301]},this.name=function(e){return e&&e.fC1Bytes?"windows-1254":"ISO-8859-9"},this.language=function(){return"tr"}},n.inherits(e.exports.ISO_8859_9,A),e.exports.windows_1251=function(){this.byteMap=function(){return[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,144,131,32,131,32,32,32,32,32,32,154,32,156,157,158,159,144,32,32,32,32,32,32,32,32,32,154,32,156,157,158,159,32,162,162,188,32,180,32,32,184,32,186,32,32,32,32,191,32,32,179,179,180,181,32,32,184,32,186,32,188,190,190,191,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255]},this.ngrams=function(){return[2155040,2155246,2155758,2156512,2156576,2157280,2157294,2158048,2158053,2158305,2158574,2158576,2158816,2159086,2159090,2159342,2160626,2162162,14740968,14742268,14937632,15068156,15068648,15069682,15069728,15212783,15263008,15263776,15269664,15459821,15460384,15465709,15589408,15590688,15591653,15591679,15592992,15593186,15605986,15605999,15606001,15655456,15655648,15655918,15657248,15657980,15658016,15659506,15724267,15724773,15724776,15724782,15786210,15787492,15856352,15856354,15856360,15859488,15918571,15920672,15920880,15924256,16249582,16512288]},this.name=function(e){return"windows-1251"},this.language=function(){return"ru"}},n.inherits(e.exports.windows_1251,A),e.exports.windows_1256=function(){this.byteMap=function(){return[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,129,32,131,32,32,32,32,136,32,138,32,156,141,142,143,144,32,32,32,32,32,32,32,152,32,154,32,156,32,32,159,32,32,32,32,32,32,32,32,32,32,170,32,32,32,32,32,32,32,32,32,32,181,32,32,32,32,32,32,32,32,32,32,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,32,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,32,32,32,32,244,32,32,32,32,249,32,251,252,32,32,255]},this.ngrams=function(){return[2148321,2148324,2148551,2153185,2153965,2154977,2155492,2156231,13050055,13091104,13093408,13095200,13099296,13099459,13099463,13099464,13099466,13099468,13099469,13099471,13099475,13099482,13099486,13099491,13099494,13099501,13099808,13100064,13100234,13115591,13181127,13181149,13181153,13181155,13181158,13246663,13574343,13617440,13705415,13748512,13836487,14295239,14344684,14544160,14753991,14797088,14806048,14806304,14885063,14927648,14928160,14935072,14950599,15016135,15058720,15124449,15131680,15474887,15540423,15540451,15540454,15583520,15585568,15590432]},this.name=function(e){return"windows-1256"},this.language=function(){return"ar"}},n.inherits(e.exports.windows_1256,A),e.exports.KOI8_R=function(){this.byteMap=function(){return[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,163,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,163,32,32,32,32,32,32,32,32,32,32,32,32,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223]},this.ngrams=function(){return[2147535,2148640,2149313,2149327,2150081,2150085,2150338,2150607,2150610,2151105,2151375,2151380,2151631,2152224,2152399,2153153,2153684,2154196,12701385,12702936,12963032,12963529,12964820,12964896,13094688,13181136,13223200,13224224,13226272,13419982,13420832,13424846,13549856,13550880,13552069,13552081,13553440,13553623,13574352,13574355,13574359,13617103,13617696,13618392,13618464,13620180,13621024,13621185,13684684,13685445,13685449,13685455,13812183,13813188,13881632,13882561,13882569,13882583,13944268,13946656,13946834,13948960,14272544,14603471]},this.name=function(e){return"KOI8-R"},this.language=function(){return"ru"}},n.inherits(e.exports.KOI8_R,A)},48794:(e,t,r)=>{"use strict";var n=r(31669),i=r(24250);function o(){}e.exports.UTF_16BE=function(){this.name=function(){return"UTF-16BE"},this.match=function(e){var t=e.fRawInput;return t.length>=2&&254==(255&t[0])&&255==(255&t[1])?new i(e,this,100):null}},e.exports.UTF_16LE=function(){this.name=function(){return"UTF-16LE"},this.match=function(e){var t=e.fRawInput;return t.length>=2&&255==(255&t[0])&&254==(255&t[1])?t.length>=4&&0==t[2]&&0==t[3]?null:new i(e,this,100):null}},o.prototype.match=function(e){var t=e.fRawInput,r=e.fRawLength/4*4,n=0,o=0,s=!1,A=0;if(0==r)return null;65279==this.getChar(t,0)&&(s=!0);for(var a=0;a=1114111||c>=55296&&c<=57343?o+=1:n+=1}return s&&0==o?A=100:s&&n>10*o?A=80:n>3&&0==o?A=100:n>0&&0==o?A=80:n>10*o&&(A=25),0==A?null:new i(e,this,A)},e.exports.UTF_32BE=function(){this.name=function(){return"UTF-32BE"},this.getChar=function(e,t){return(255&e[t+0])<<24|(255&e[t+1])<<16|(255&e[t+2])<<8|255&e[t+3]}},n.inherits(e.exports.UTF_32BE,o),e.exports.UTF_32LE=function(){this.name=function(){return"UTF-32LE"},this.getChar=function(e,t){return(255&e[t+3])<<24|(255&e[t+2])<<16|(255&e[t+1])<<8|255&e[t+0]}},n.inherits(e.exports.UTF_32LE,o)},76023:(e,t,r)=>{var n=r(24250);e.exports=function(){this.name=function(){return"UTF-8"},this.match=function(e){var t,r=!1,i=0,o=0,s=e.fRawInput,A=0;e.fRawLength>=3&&239==(255&s[0])&&187==(255&s[1])&&191==(255&s[2])&&(r=!0);for(var a=0;a5)break;A=0}for(;!(++a>=e.fRawLength);){if(128!=(192&s[a])){o++;break}if(0==--A){i++;break}}}}if(t=0,r&&0==o)t=100;else if(r&&i>10*o)t=80;else if(i>3&&0==o)t=100;else if(i>0&&0==o)t=80;else if(0==i&&0==o)t=10;else{if(!(i>10*o))return null;t=25}return new n(e,this,t)}}},80848:function(e,t,r){var n=r(35747),i=r(76023),o=r(48794),s=r(9044),A=r(71216),a=r(31059),c=this,u=[new i,new o.UTF_16BE,new o.UTF_16LE,new o.UTF_32BE,new o.UTF_32LE,new s.sjis,new s.big5,new s.euc_jp,new s.euc_kr,new s.gb_18030,new a.ISO_2022_JP,new a.ISO_2022_KR,new a.ISO_2022_CN,new A.ISO_8859_1,new A.ISO_8859_2,new A.ISO_8859_5,new A.ISO_8859_6,new A.ISO_8859_7,new A.ISO_8859_8,new A.ISO_8859_9,new A.windows_1251,new A.windows_1256,new A.KOI8_R];e.exports.detect=function(e,t){for(var r=[],n=0;n<256;n++)r[n]=0;for(n=e.length-1;n>=0;n--)r[255&e[n]]++;var i=!1;for(n=128;n<=159;n+=1)if(0!=r[n]){i=!0;break}var o={fByteStats:r,fC1Bytes:i,fRawInput:e,fRawLength:e.length,fInputBytes:e,fInputLen:e.length},s=u.map((function(e){return e.match(o)})).filter((function(e){return!!e})).sort((function(e,t){return t.confidence-e.confidence}));return t&&!0===t.returnAllMatches?s:s.length>0?s[0].name:null},e.exports.detectFile=function(e,t,r){var i;"function"==typeof t&&(r=t,t=void 0);var o=function(e,o){if(i&&n.closeSync(i),e)return r(e,null);r(null,c.detect(o,t))};if(t&&t.sampleSize)return i=n.openSync(e,"r"),sample=Buffer.allocUnsafe(t.sampleSize),void n.read(i,sample,0,t.sampleSize,null,(function(e){o(e,sample)}));n.readFile(e,o)},e.exports.detectFileSync=function(e,t){if(t&&t.sampleSize){var r=n.openSync(e,"r"),i=Buffer.allocUnsafe(t.sampleSize);return n.readSync(r,i,0,t.sampleSize),n.closeSync(r),c.detect(i,t)}return c.detect(n.readFileSync(e),t)},e.exports.detectAll=function(e,t){return"object"!=typeof t&&(t={}),t.returnAllMatches=!0,c.detect(e,t)},e.exports.detectFileAll=function(e,t,r){"function"==typeof t&&(r=t,t=void 0),"object"!=typeof t&&(t={}),t.returnAllMatches=!0,c.detectFile(e,t,r)},e.exports.detectFileAllSync=function(e,t){return"object"!=typeof t&&(t={}),t.returnAllMatches=!0,c.detectFileSync(e,t)}},24250:e=>{e.exports=function(e,t,r,n,i){this.confidence=r,this.name=n||t.name(e),this.lang=i}},82758:(e,t,r)=>{"use strict";const n=r(35747),i=r(85622),o=n.lchown?"lchown":"chown",s=n.lchownSync?"lchownSync":"chownSync",A=process.version;let a=(e,t,r)=>n.readdir(e,t,r);/^v4\./.test(A)&&(a=(e,t,r)=>n.readdir(e,r));const c=(e,t,r,s,A)=>{if("string"==typeof t)return n.lstat(i.resolve(e,t),(n,i)=>{if(n)return A(n);i.name=t,c(e,i,r,s,A)});t.isDirectory()?u(i.resolve(e,t.name),r,s,a=>{if(a)return A(a);n[o](i.resolve(e,t.name),r,s,A)}):n[o](i.resolve(e,t.name),r,s,A)},u=(e,t,r,i)=>{a(e,{withFileTypes:!0},(s,A)=>{if(s&&"ENOTDIR"!==s.code&&"ENOTSUP"!==s.code)return i(s);if(s||!A.length)return n[o](e,t,r,i);let a=A.length,u=null;const l=s=>{if(!u)return s?i(u=s):0==--a?n[o](e,t,r,i):void 0};A.forEach(n=>c(e,n,t,r,l))})},l=(e,t,r)=>{let o;try{o=((e,t)=>n.readdirSync(e,t))(e,{withFileTypes:!0})}catch(i){if(i&&"ENOTDIR"===i.code&&"ENOTSUP"!==i.code)return n[s](e,t,r);throw i}return o.length&&o.forEach(o=>((e,t,r,o)=>{if("string"==typeof t){const r=n.lstatSync(i.resolve(e,t));r.name=t,t=r}t.isDirectory()&&l(i.resolve(e,t.name),r,o),n[s](i.resolve(e,t.name),r,o)})(e,o,t,r)),n[s](e,t,r)};e.exports=u,u.sync=l},5864:(e,t,r)=>{"use strict";var n=r(85832),i=process.env;function o(e){return"string"==typeof e?!!i[e]:Object.keys(e).every((function(t){return i[t]===e[t]}))}Object.defineProperty(t,"_vendors",{value:n.map((function(e){return e.constant}))}),t.name=null,t.isPR=null,n.forEach((function(e){var r=(Array.isArray(e.env)?e.env:[e.env]).every((function(e){return o(e)}));if(t[e.constant]=r,r)switch(t.name=e.name,typeof e.pr){case"string":t.isPR=!!i[e.pr];break;case"object":"env"in e.pr?t.isPR=e.pr.env in i&&i[e.pr.env]!==e.pr.ne:"any"in e.pr?t.isPR=e.pr.any.some((function(e){return!!i[e]})):t.isPR=o(e.pr);break;default:t.isPR=null}})),t.isCI=!!(i.CI||i.CONTINUOUS_INTEGRATION||i.BUILD_NUMBER||i.RUN_ID||t.name)},85832:e=>{"use strict";e.exports=JSON.parse('[{"name":"AppVeyor","constant":"APPVEYOR","env":"APPVEYOR","pr":"APPVEYOR_PULL_REQUEST_NUMBER"},{"name":"Azure Pipelines","constant":"AZURE_PIPELINES","env":"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI","pr":"SYSTEM_PULLREQUEST_PULLREQUESTID"},{"name":"Bamboo","constant":"BAMBOO","env":"bamboo_planKey"},{"name":"Bitbucket Pipelines","constant":"BITBUCKET","env":"BITBUCKET_COMMIT","pr":"BITBUCKET_PR_ID"},{"name":"Bitrise","constant":"BITRISE","env":"BITRISE_IO","pr":"BITRISE_PULL_REQUEST"},{"name":"Buddy","constant":"BUDDY","env":"BUDDY_WORKSPACE_ID","pr":"BUDDY_EXECUTION_PULL_REQUEST_ID"},{"name":"Buildkite","constant":"BUILDKITE","env":"BUILDKITE","pr":{"env":"BUILDKITE_PULL_REQUEST","ne":"false"}},{"name":"CircleCI","constant":"CIRCLE","env":"CIRCLECI","pr":"CIRCLE_PULL_REQUEST"},{"name":"Cirrus CI","constant":"CIRRUS","env":"CIRRUS_CI","pr":"CIRRUS_PR"},{"name":"AWS CodeBuild","constant":"CODEBUILD","env":"CODEBUILD_BUILD_ARN"},{"name":"Codeship","constant":"CODESHIP","env":{"CI_NAME":"codeship"}},{"name":"Drone","constant":"DRONE","env":"DRONE","pr":{"DRONE_BUILD_EVENT":"pull_request"}},{"name":"dsari","constant":"DSARI","env":"DSARI"},{"name":"GitLab CI","constant":"GITLAB","env":"GITLAB_CI"},{"name":"GoCD","constant":"GOCD","env":"GO_PIPELINE_LABEL"},{"name":"Hudson","constant":"HUDSON","env":"HUDSON_URL"},{"name":"Jenkins","constant":"JENKINS","env":["JENKINS_URL","BUILD_ID"],"pr":{"any":["ghprbPullId","CHANGE_ID"]}},{"name":"Magnum CI","constant":"MAGNUM","env":"MAGNUM"},{"name":"Netlify CI","constant":"NETLIFY","env":"NETLIFY_BUILD_BASE","pr":{"env":"PULL_REQUEST","ne":"false"}},{"name":"Sail CI","constant":"SAIL","env":"SAILCI","pr":"SAIL_PULL_REQUEST_NUMBER"},{"name":"Semaphore","constant":"SEMAPHORE","env":"SEMAPHORE","pr":"PULL_REQUEST_NUMBER"},{"name":"Shippable","constant":"SHIPPABLE","env":"SHIPPABLE","pr":{"IS_PULL_REQUEST":"true"}},{"name":"Solano CI","constant":"SOLANO","env":"TDDIUM","pr":"TDDIUM_PR_ID"},{"name":"Strider CD","constant":"STRIDER","env":"STRIDER"},{"name":"TaskCluster","constant":"TASKCLUSTER","env":["TASK_ID","RUN_ID"]},{"name":"TeamCity","constant":"TEAMCITY","env":"TEAMCITY_VERSION"},{"name":"Travis CI","constant":"TRAVIS","env":"TRAVIS","pr":{"env":"TRAVIS_PULL_REQUEST","ne":"false"}}]')},61696:(e,t,r)=>{"use strict";const n=r(3390);let i=!1;t.show=(e=process.stderr)=>{e.isTTY&&(i=!1,e.write("[?25h"))},t.hide=(e=process.stderr)=>{e.isTTY&&(n(),i=!0,e.write("[?25l"))},t.toggle=(e,r)=>{void 0!==e&&(i=e),i?t.show(r):t.hide(r)}},17945:(e,t,r)=>{"use strict";e.exports=function(e){var t=function(e){var t={defaultWidth:0,output:process.stdout,tty:r(33867)};return e?(Object.keys(t).forEach((function(r){e[r]||(e[r]=t[r])})),e):t}(e);if(t.output.getWindowSize)return t.output.getWindowSize()[0]||t.defaultWidth;if(t.tty.getWindowSize)return t.tty.getWindowSize()[1]||t.defaultWidth;if(t.output.columns)return t.output.columns;if(process.env.CLI_WIDTH){var n=parseInt(process.env.CLI_WIDTH,10);if(!isNaN(n)&&0!==n)return n}return t.defaultWidth}},17278:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r{constructor(){this.help=!1}static getMeta(e){const t=e.constructor;return t.meta=Object.prototype.hasOwnProperty.call(t,"meta")?t.meta:{definitions:[],transformers:[(e,t)=>{for(const{name:r,value:n}of e.options)"-h"!==r&&"--help"!==r||(t.help=n)}]}}static resolveMeta(e){const t=[],n=[];for(let i=e;i instanceof r;i=i.__proto__){const e=this.getMeta(i);for(const r of e.definitions)t.push(r);for(const t of e.transformers)n.push(t)}return{definitions:t,transformers:n}}static registerDefinition(e,t){this.getMeta(e).definitions.push(t)}static registerTransformer(e,t){this.getMeta(e).transformers.push(t)}static addPath(...e){this.Path(...e)(this.prototype,"execute")}static addOption(e,t){t(this.prototype,e)}static Path(...e){return(t,r)=>{this.registerDefinition(t,t=>{t.addPath(e)})}}static Boolean(e,{hidden:t=!1}={}){return(r,n)=>{const i=e.split(",");this.registerDefinition(r,e=>{e.addOption({names:i,arity:0,hidden:t,allowBinding:!1})}),this.registerTransformer(r,(e,t)=>{for(const{name:r,value:o}of e.options)i.includes(r)&&(t[n]=o)})}}static String(e={required:!0},{tolerateBoolean:t=!1,hidden:r=!1}={}){return(n,i)=>{if("string"==typeof e){const o=e.split(",");this.registerDefinition(n,e=>{e.addOption({names:o,arity:t?0:1,hidden:r})}),this.registerTransformer(n,(e,t)=>{for(const{name:r,value:n}of e.options)o.includes(r)&&(t[i]=n)})}else this.registerDefinition(n,t=>{t.addPositional({name:i,required:e.required})}),this.registerTransformer(n,(e,t)=>{e.positionals.length>0&&(t[i]=e.positionals.shift().value)})}}static Array(e,{hidden:t=!1}={}){return(r,n)=>{const i=e.split(",");this.registerDefinition(r,e=>{e.addOption({names:i,arity:1,hidden:t})}),this.registerTransformer(r,(e,t)=>{for(const{name:r,value:o}of e.options)i.includes(r)&&(t[n]=t[n]||[],t[n].push(o))})}}static Rest({required:e=0}={}){return(t,r)=>{this.registerDefinition(t,t=>{t.addRest({name:r,required:e})}),this.registerTransformer(t,(e,t)=>{t[r]=e.positionals.map(({value:e})=>e)})}}static Proxy({required:e=0}={}){return(t,r)=>{this.registerDefinition(t,t=>{t.addProxy({required:e})}),this.registerTransformer(t,(e,t)=>{t[r]=e.positionals.map(({value:e})=>e)})}}static Usage(e){return e}static Schema(e){return e}async validateAndExecute(){const e=this.constructor.schema;if(void 0!==e)try{await e.validate(this)}catch(e){throw"ValidationError"===e.name&&(e.clipanion={type:"usage"}),e}const t=await this.execute();return void 0!==t?t:0}} -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -function n(e,t,r,n){var i,o=arguments.length,s=o<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,n);else for(var A=e.length-1;A>=0;A--)(i=e[A])&&(s=(o<3?i(s):o>3?i(t,r,s):i(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s}r.Entries={};class i extends r{async execute(){this.context.stdout.write(this.cli.usage(null))}}n([r.Path("--help"),r.Path("-h")],i.prototype,"execute",null);class o extends r{async execute(){var e;this.context.stdout.write((null!==(e=this.cli.binaryVersion)&&void 0!==e?e:"")+"\n")}}n([r.Path("--version"),r.Path("-v")],o.prototype,"execute",null);const s=/^(-h|--help)(?:=([0-9]+))?$/,A=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,a=/^-[a-zA-Z]{2,}$/,c=/^([^=]+)=([\s\S]*)$/,u="1"===process.env.DEBUG_CLI;class l extends Error{constructor(e){super(e),this.clipanion={type:"usage"},this.name="UsageError"}}class h extends Error{constructor(e,t){if(super(),this.input=e,this.candidates=t,this.clipanion={type:"none"},this.name="UnknownSyntaxError",0===this.candidates.length)this.message="Command not found, but we're not sure what's the alternative.";else if(1===this.candidates.length&&null!==this.candidates[0].reason){const[{usage:e,reason:t}]=this.candidates;this.message=`${t}\n\n$ ${e}`}else if(1===this.candidates.length){const[{usage:t}]=this.candidates;this.message=`Command not found; did you mean:\n\n$ ${t}\n${f(e)}`}else this.message=`Command not found; did you mean one of:\n\n${this.candidates.map(({usage:e},t)=>`${(t+".").padStart(4)} ${e}`).join("\n")}\n\n${f(e)}`}}class g extends Error{constructor(e,t){super(),this.input=e,this.usages=t,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find who to pick amongst the following alternatives:\n\n${this.usages.map((e,t)=>`${(t+".").padStart(4)} ${e}`).join("\n")}\n\n${f(e)}`}}const f=e=>"While running "+e.filter(e=>"\0"!==e).map(e=>{const t=JSON.stringify(e);return e.match(/\s/)||0===e.length||t!==`"${e}"`?t:e}).join(" ");function p(e){u&&console.log(e)}function d(e,t){return e.nodes.push(t),e.nodes.length-1}function C(e,t,r=!1){p("Running a vm on "+JSON.stringify(t));let n=[{node:0,state:{candidateUsage:null,errorMessage:null,ignoreOptions:!1,options:[],path:[],positionals:[],remainder:null,selectedIndex:null}}];!function(e,{prefix:t=""}={}){p(t+"Nodes are:");for(let r=0;r2!==e).map(({state:e})=>({usage:e.candidateUsage,reason:null})));if(A.every(({node:e})=>2===e))throw new h(t,A.map(({state:e})=>({usage:e.candidateUsage,reason:e.errorMessage})));n=m(A)}if(n.length>0){p(" Results:");for(const e of n)p(` - ${e.node} -> ${JSON.stringify(e.state)}`)}else p(" No results");return n}function E(e,t){if(null!==t.selectedIndex)return!0;if(Object.prototype.hasOwnProperty.call(e.statics,"\0"))for(const{to:t}of e.statics["\0"])if(1===t)return!0;return!1}function I(e,t){return function(e,t){const r=t.filter(e=>null!==e.selectedIndex);if(0===r.length)throw new Error;let n=0;for(const e of r)e.path.length>n&&(n=e.path.length);const i=r.filter(e=>e.path.length===n),o=e=>e.positionals.filter(({extra:e})=>!e).length+e.options.length,s=i.map(e=>({state:e,positionalCount:o(e)}));let A=0;for(const{positionalCount:e}of s)e>A&&(A=e);const a=function(e){const t=[],r=[];for(const n of e)-1===n.selectedIndex?r.push(...n.options):t.push(n);r.length>0&&t.push({candidateUsage:null,errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:r,remainder:null,selectedIndex:-1});return t}(s.filter(({positionalCount:e})=>e===A).map(({state:e})=>e));if(a.length>1)throw new g(e,a.map(e=>e.candidateUsage));return a[0]}(t,C(e,[...t,"\0"]).map(({state:e})=>e))}function m(e){let t=0;for(const{state:r}of e)r.path.length>t&&(t=r.path.length);return e.filter(({state:e})=>e.path.length===t)}function y(e){return 1===e||2===e}function w(e,t=0){return{to:y(e.to)?e.to:e.to>2?e.to+t-2:e.to+t,reducer:e.reducer}}function B(e,t=0){const r={dynamics:[],shortcuts:[],statics:{}};for(const[n,i]of e.dynamics)r.dynamics.push([n,w(i,t)]);for(const n of e.shortcuts)r.shortcuts.push(w(n,t));for(const[n,i]of Object.entries(e.statics))r.statics[n]=i.map(e=>w(e,t));return r}function Q(e,t,r,n,i){e.nodes[t].dynamics.push([r,{to:n,reducer:i}])}function v(e,t,r,n){e.nodes[t].shortcuts.push({to:r,reducer:n})}function D(e,t,r,n,i){(Object.prototype.hasOwnProperty.call(e.nodes[t].statics,r)?e.nodes[t].statics[r]:e.nodes[t].statics[r]=[]).push({to:n,reducer:i})}function b(e,t,r,n){if(Array.isArray(t)){const[i,...o]=t;return e[i](r,n,...o)}return e[t](r,n)}function S(e,t){const r=Array.isArray(e)?k[e[0]]:k[e];if(void 0===r.suggest)return null;const n=Array.isArray(e)?e.slice(1):[];return r.suggest(t,...n)}const k={always:()=>!0,isNotOptionLike:(e,t)=>e.ignoreOptions||!t.startsWith("-"),isOption:(e,t,r,n)=>!e.ignoreOptions&&t===r,isBatchOption:(e,t,r)=>!e.ignoreOptions&&a.test(t)&&[...t.slice(1)].every(e=>r.includes("-"+e)),isBoundOption:(e,t,r,n)=>{const i=t.match(c);return!e.ignoreOptions&&!!i&&A.test(i[1])&&r.includes(i[1])&&n.filter(e=>e.names.includes(i[1])).every(e=>e.allowBinding)},isNegatedOption:(e,t,r)=>!e.ignoreOptions&&t==="--no-"+r.slice(2),isHelp:(e,t)=>!e.ignoreOptions&&s.test(t),isUnsupportedOption:(e,t,r)=>!e.ignoreOptions&&t.startsWith("-")&&A.test(t)&&!r.includes(t),isInvalidOption:(e,t)=>!e.ignoreOptions&&t.startsWith("-")&&!A.test(t)};k.isOption.suggest=(e,t,r=!0)=>r?null:[t];const x={setCandidateUsage:(e,t,r)=>Object.assign(Object.assign({},e),{candidateUsage:r}),setSelectedIndex:(e,t,r)=>Object.assign(Object.assign({},e),{selectedIndex:r}),pushBatch:(e,t)=>Object.assign(Object.assign({},e),{options:e.options.concat([...t.slice(1)].map(e=>({name:"-"+e,value:!0})))}),pushBound:(e,t)=>{const[,r,n]=t.match(c);return Object.assign(Object.assign({},e),{options:e.options.concat({name:r,value:n})})},pushPath:(e,t)=>Object.assign(Object.assign({},e),{path:e.path.concat(t)}),pushPositional:(e,t)=>Object.assign(Object.assign({},e),{positionals:e.positionals.concat({value:t,extra:!1})}),pushExtra:(e,t)=>Object.assign(Object.assign({},e),{positionals:e.positionals.concat({value:t,extra:!0})}),pushTrue:(e,t,r=t)=>Object.assign(Object.assign({},e),{options:e.options.concat({name:t,value:!0})}),pushFalse:(e,t,r=t)=>Object.assign(Object.assign({},e),{options:e.options.concat({name:r,value:!1})}),pushUndefined:(e,t)=>Object.assign(Object.assign({},e),{options:e.options.concat({name:t,value:void 0})}),setStringValue:(e,t)=>Object.assign(Object.assign({},e),{options:e.options.slice(0,-1).concat(Object.assign(Object.assign({},e.options[e.options.length-1]),{value:t}))}),inhibateOptions:e=>Object.assign(Object.assign({},e),{ignoreOptions:!0}),useHelp:(e,t,r)=>{const[,n,i]=t.match(s);return void 0!==i?Object.assign(Object.assign({},e),{options:[{name:"-c",value:String(r)},{name:"-i",value:i}]}):Object.assign(Object.assign({},e),{options:[{name:"-c",value:String(r)}]})},setError:(e,t,r)=>"\0"===t?Object.assign(Object.assign({},e),{errorMessage:r+"."}):Object.assign(Object.assign({},e),{errorMessage:`${r} ("${t}").`})},F=Symbol();class M{constructor(e,t){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=t}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:t=this.arity.trailing,extra:r=this.arity.extra,proxy:n=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:t,extra:r,proxy:n})}addPositional({name:e="arg",required:t=!0}={}){if(!t&&this.arity.extra===F)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!t&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");t||this.arity.extra===F?this.arity.extra!==F&&0===this.arity.extra.length?this.arity.leading.push(e):this.arity.trailing.push(e):this.arity.extra.push(e)}addRest({name:e="arg",required:t=0}={}){if(this.arity.extra===F)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let r=0;r0&&t.push(...this.paths[0]),e){for(const{names:e,arity:r,hidden:n}of this.options){if(n)continue;const i=[];for(let e=0;e`<${e}>`)),this.arity.extra===F?t.push("..."):t.push(...this.arity.extra.map(e=>`[${e}]`)),t.push(...this.arity.trailing.map(e=>`<${e}>`))}return t.join(" ")}compile(){if(void 0===this.context)throw new Error("Assertion failed: No context attached");const e={nodes:[{dynamics:[],shortcuts:[],statics:{}},{dynamics:[],shortcuts:[],statics:{}},{dynamics:[],shortcuts:[],statics:{}}]};let t=0;t=d(e,{dynamics:[],shortcuts:[],statics:{}}),D(e,0,"",t,["setCandidateUsage",this.usage()]);const r=this.arity.proxy?"always":"isNotOptionLike",n=this.paths.length>0?this.paths:[[]];for(const i of n){let n=t;if(i.length>0){const t=d(e,{dynamics:[],shortcuts:[],statics:{}});v(e,n,t),this.registerOptions(e,t),n=t}for(let t=0;t0||!this.arity.proxy){const t=d(e,{dynamics:[],shortcuts:[],statics:{}});Q(e,n,"isHelp",t,["useHelp",this.cliIndex]),D(e,t,"\0",1,["setSelectedIndex",-1]),this.registerOptions(e,n)}this.arity.leading.length>0&&D(e,n,"\0",2,["setError","Not enough positional arguments"]);let o=n;for(let t=0;t0||t+1!==this.arity.leading.length)&&D(e,r,"\0",2,["setError","Not enough positional arguments"]),Q(e,o,"isNotOptionLike",r,"pushPositional"),o=r}let s=o;if(this.arity.extra===F||this.arity.extra.length>0){const t=d(e,{dynamics:[],shortcuts:[],statics:{}});if(v(e,o,t),this.arity.extra===F){const n=d(e,{dynamics:[],shortcuts:[],statics:{}});this.arity.proxy||this.registerOptions(e,n),Q(e,o,r,n,"pushExtra"),Q(e,n,r,n,"pushExtra"),v(e,n,t)}else for(let n=0;n0&&D(e,s,"\0",2,["setError","Not enough positional arguments"]);let A=s;for(let t=0;tt.length>e.length?t:e,"");if(0===r.arity)for(const i of r.names)Q(e,t,["isOption",i,r.hidden||i!==n],t,"pushTrue"),i.startsWith("--")&&Q(e,t,["isNegatedOption",i,r.hidden||i!==n],t,["pushFalse",i]);else{if(1!==r.arity)throw new Error(`Unsupported option arity (${r.arity})`);{const i=d(e,{dynamics:[],shortcuts:[],statics:{}});Q(e,i,"isNotOptionLike",t,"setStringValue");for(const o of r.names)Q(e,t,["isOption",o,r.hidden||o!==n],i,"pushUndefined")}}}}}class N{constructor({binaryName:e="..."}={}){this.builders=[],this.opts={binaryName:e}}static build(e,t={}){return new N(t).commands(e).compile()}getBuilderByIndex(e){if(!(e>=0&&e{if(t.has(n))return;t.add(n);const i=e.nodes[n];for(const e of Object.values(i.statics))for(const{to:t}of e)r(t);for(const[,{to:e}]of i.dynamics)r(e);for(const{to:e}of i.shortcuts)r(e);const o=new Set(i.shortcuts.map(({to:e})=>e));for(;i.shortcuts.length>0;){const{to:t}=i.shortcuts.shift(),r=e.nodes[t];for(const[e,t]of Object.entries(r.statics)){let r=Object.prototype.hasOwnProperty.call(i.statics,e)?i.statics[e]:i.statics[e]=[];for(const e of t)r.some(({to:t})=>e.to===t)||r.push(e)}for(const[e,t]of r.dynamics)i.dynamics.some(([r,{to:n}])=>e===r&&t.to===n)||i.dynamics.push([e,t]);for(const e of r.shortcuts)o.has(e.to)||(i.shortcuts.push(e),o.add(e.to))}};r(0)}(r),{machine:r,contexts:t,process:e=>I(r,e),suggest:(e,t)=>function(e,t,r){const n=r&&t.length>0?[""]:[],i=C(e,t,r),o=[],s=new Set,A=(t,r,n=!0)=>{let i=[r];for(;i.length>0;){const r=i;i=[];for(const o of r){const r=e.nodes[o],s=Object.keys(r.statics);for(const e of Object.keys(r.statics)){const e=s[0];for(const{to:o,reducer:s}of r.statics[e])"pushPath"===s&&(n||t.push(e),i.push(o))}}n=!1}const A=JSON.stringify(t);s.has(A)||(o.push(t),s.add(A))};for(const{node:t,state:r}of i){if(null!==r.remainder){A([r.remainder],t);continue}const i=e.nodes[t],o=E(i,r);for(const[e,r]of Object.entries(i.statics))(o&&"\0"!==e||!e.startsWith("-")&&r.some(({reducer:e})=>"pushPath"===e))&&A([...n,e],t);if(o)for(const[e,{to:o}]of i.dynamics){if(2===o)continue;const i=S(e,r);if(null!==i)for(const e of i)A([...n,e],t)}}return[...o].sort()}(r,e,t)}}}const R={bold:e=>`${e}`,error:e=>`${e}`,code:e=>`${e}`},K={bold:e=>e,error:e=>e,code:e=>e};function L(e,{format:t,paragraphs:r}){return e=(e=(e=(e=(e=e.replace(/\r\n?/g,"\n")).replace(/^[\t ]+|[\t ]+$/gm,"")).replace(/^\n+|\n+$/g,"")).replace(/^-([^\n]*?)\n+/gm,"-$1\n\n")).replace(/\n(\n)?\n*/g,"$1"),r&&(e=e.split(/\n/).map((function(e){let t=e.match(/^[*-][\t ]+(.*)/);return t?t[1].match(/(.{1,78})(?: |$)/g).map((e,t)=>(0===t?"- ":" ")+e).join("\n"):e.match(/(.{1,80})(?: |$)/g).join("\n")})).join("\n\n")),(e=e.replace(/(`+)((?:.|[\n])*?)\1/g,(function(e,r,n){return t.code(r+n+r)})))?e+"\n":""}class T extends r{constructor(e,t){super(),this.realCli=e,this.contexts=t,this.commands=[]}static from(e,t,r){const n=new T(t,r);for(const t of e.options)switch(t.name){case"-c":n.commands.push(Number(t.value));break;case"-i":n.index=Number(t.value)}return n}async execute(){let e=this.commands;if(void 0!==this.index&&this.index>=0&&this.index1){this.context.stdout.write("Multiple commands match your selection:\n"),this.context.stdout.write("\n");let e=0;for(const t of this.commands)this.context.stdout.write(this.realCli.usage(this.contexts[t].commandClass,{prefix:(e+++". ").padStart(5)}));this.context.stdout.write("\n"),this.context.stdout.write("Run again with -h= to see the longer details of any of those commands.\n")}}}function P(){return"0"!==process.env.FORCE_COLOR&&("1"===process.env.FORCE_COLOR||!(void 0===process.stdout||!process.stdout.isTTY))}class U{constructor({binaryLabel:e,binaryName:t="...",binaryVersion:r,enableColors:n=P()}={}){this.registrations=new Map,this.builder=new N({binaryName:t}),this.binaryLabel=e,this.binaryName=t,this.binaryVersion=r,this.enableColors=n}static from(e){const t=new U;for(const r of e)t.register(r);return t}register(e){const t=this.builder.command();this.registrations.set(e,t.cliIndex);const{definitions:r}=e.resolveMeta(e.prototype);for(const e of r)e(t);t.setContext({commandClass:e})}process(e){const{contexts:t,process:r}=this.builder.compile(),n=r(e);switch(n.selectedIndex){case-1:return T.from(n,this,t);default:{const{commandClass:e}=t[n.selectedIndex],r=new e;r.path=n.path;const{transformers:i}=e.resolveMeta(e.prototype);for(const e of i)e(n,r);return r}}}async run(e,t){let r,n;if(Array.isArray(e))try{r=this.process(e)}catch(e){return t.stdout.write(this.error(e)),1}else r=e;if(r.help)return t.stdout.write(this.usage(r,{detailed:!0})),0;r.context=t,r.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,definitions:()=>this.definitions(),error:(e,t)=>this.error(e,t),process:e=>this.process(e),run:(e,r)=>this.run(e,Object.assign(Object.assign({},t),r)),usage:(e,t)=>this.usage(e,t)};try{n=await r.validateAndExecute()}catch(e){return t.stdout.write(this.error(e,{command:r})),1}return n}async runExit(e,t){process.exitCode=await this.run(e,t)}suggest(e,t){const{contexts:r,process:n,suggest:i}=this.builder.compile();return i(e,t)}definitions({colored:e=!1}={}){const t=[];for(const[r,n]of this.registrations){if(void 0===r.usage)continue;const i=this.getUsageByIndex(n,{detailed:!1}),o=this.getUsageByIndex(n,{detailed:!0}),s=void 0!==r.usage.category?L(r.usage.category,{format:this.format(e),paragraphs:!1}):void 0,A=void 0!==r.usage.description?L(r.usage.description,{format:this.format(e),paragraphs:!1}):void 0,a=void 0!==r.usage.details?L(r.usage.details,{format:this.format(e),paragraphs:!0}):void 0,c=void 0!==r.usage.examples?r.usage.examples.map(([t,r])=>[L(t,{format:this.format(e),paragraphs:!1}),r.replace(/\$0/g,this.binaryName)]):void 0;t.push({path:i,usage:o,category:s,description:A,details:a,examples:c})}return t}usage(e=null,{colored:t,detailed:r=!1,prefix:n="$ "}={}){const i=null!==e&&void 0===e.getMeta?e.constructor:e;let o="";if(i)if(r){const{description:e="",details:r="",examples:s=[]}=i.usage||{};if(""!==e&&(o+=L(e,{format:this.format(t),paragraphs:!1}).replace(/^./,e=>e.toUpperCase()),o+="\n"),(""!==r||s.length>0)&&(o+=this.format(t).bold("Usage:")+"\n",o+="\n"),o+=`${this.format(t).bold(n)}${this.getUsageByRegistration(i)}\n`,""!==r&&(o+="\n",o+=this.format(t).bold("Details:")+"\n",o+="\n",o+=L(r,{format:this.format(t),paragraphs:!0})),s.length>0){o+="\n",o+=this.format(t).bold("Examples:")+"\n";for(let[e,r]of s)o+="\n",o+=L(e,{format:this.format(t),paragraphs:!1}),o+=r.replace(/^/m," "+this.format(t).bold(n)).replace(/\$0/g,this.binaryName)+"\n"}}else o+=`${this.format(t).bold(n)}${this.getUsageByRegistration(i)}\n`;else{const e=new Map;for(const[r,n]of this.registrations.entries()){if(void 0===r.usage)continue;const i=void 0!==r.usage.category?L(r.usage.category,{format:this.format(t),paragraphs:!1}):null;let o=e.get(i);void 0===o&&e.set(i,o=[]);const s=this.getUsageByIndex(n);o.push({commandClass:r,usage:s})}const r=Array.from(e.keys()).sort((e,t)=>null===e?-1:null===t?1:e.localeCompare(t,"en",{usage:"sort",caseFirst:"upper"})),i=void 0!==this.binaryLabel,s=void 0!==this.binaryVersion;i||s?(o+=i&&s?this.format(t).bold(`${this.binaryLabel} - ${this.binaryVersion}`)+"\n\n":i?this.format(t).bold(""+this.binaryLabel)+"\n":this.format(t).bold(""+this.binaryVersion)+"\n",o+=` ${this.format(t).bold(n)}${this.binaryName} \n`):o+=`${this.format(t).bold(n)}${this.binaryName} \n`;for(let n of r){const r=e.get(n).slice().sort((e,t)=>e.usage.localeCompare(t.usage,"en",{usage:"sort",caseFirst:"upper"})),i=null!==n?n.trim():"Where is one of";o+="\n",o+=this.format(t).bold(i+":")+"\n";for(let{commandClass:e,usage:n}of r){const r=e.usage.description||"undocumented";o+="\n",o+=` ${this.format(t).bold(n)}\n`,o+=" "+L(r,{format:this.format(t),paragraphs:!1})}}o+="\n",o+=L("You can also print more details about any of these commands by calling them after adding the `-h,--help` flag right after the command name.",{format:this.format(t),paragraphs:!0})}return o}error(e,{colored:t,command:r=null}={}){e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let n="",i=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");"Error"===i&&(i="Internal Error"),n+=`${this.format(t).error(i)}: ${e.message}\n`;const o=e.clipanion;return void 0!==o?"usage"===o.type&&(n+="\n",n+=this.usage(r)):e.stack&&(n+=e.stack.replace(/^.*\n/,"")+"\n"),n}getUsageByRegistration(e,t){const r=this.registrations.get(e);if(void 0===r)throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(r,t)}getUsageByIndex(e,t){return this.builder.getBuilderByIndex(e).usage(t)}format(e=this.enableColors){return e?R:K}}U.defaultContext={stdin:process.stdin,stdout:process.stdout,stderr:process.stderr},r.Entries.Help=i,r.Entries.Version=o,t.Cli=U,t.Command=r,t.UsageError=l},75426:e=>{"use strict";e.exports={u2:"clipanion"}},15751:(e,t,r)=>{"use strict";const n=r(92413).PassThrough,i=r(65007);e.exports=e=>{if(!e||!e.pipe)throw new TypeError("Parameter `response` must be a response stream.");const t=new n;return i(e,t),e.pipe(t)}},15311:(e,t,r)=>{const n=r(93300),i={};for(const e of Object.keys(n))i[n[e]]=e;const o={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};e.exports=o;for(const e of Object.keys(o)){if(!("channels"in o[e]))throw new Error("missing channels property: "+e);if(!("labels"in o[e]))throw new Error("missing channel labels property: "+e);if(o[e].labels.length!==o[e].channels)throw new Error("channel and label counts mismatch: "+e);const{channels:t,labels:r}=o[e];delete o[e].channels,delete o[e].labels,Object.defineProperty(o[e],"channels",{value:t}),Object.defineProperty(o[e],"labels",{value:r})}o.rgb.hsl=function(e){const t=e[0]/255,r=e[1]/255,n=e[2]/255,i=Math.min(t,r,n),o=Math.max(t,r,n),s=o-i;let A,a;o===i?A=0:t===o?A=(r-n)/s:r===o?A=2+(n-t)/s:n===o&&(A=4+(t-r)/s),A=Math.min(60*A,360),A<0&&(A+=360);const c=(i+o)/2;return a=o===i?0:c<=.5?s/(o+i):s/(2-o-i),[A,100*a,100*c]},o.rgb.hsv=function(e){let t,r,n,i,o;const s=e[0]/255,A=e[1]/255,a=e[2]/255,c=Math.max(s,A,a),u=c-Math.min(s,A,a),l=function(e){return(c-e)/6/u+.5};return 0===u?(i=0,o=0):(o=u/c,t=l(s),r=l(A),n=l(a),s===c?i=n-r:A===c?i=1/3+t-n:a===c&&(i=2/3+r-t),i<0?i+=1:i>1&&(i-=1)),[360*i,100*o,100*c]},o.rgb.hwb=function(e){const t=e[0],r=e[1];let n=e[2];const i=o.rgb.hsl(e)[0],s=1/255*Math.min(t,Math.min(r,n));return n=1-1/255*Math.max(t,Math.max(r,n)),[i,100*s,100*n]},o.rgb.cmyk=function(e){const t=e[0]/255,r=e[1]/255,n=e[2]/255,i=Math.min(1-t,1-r,1-n);return[100*((1-t-i)/(1-i)||0),100*((1-r-i)/(1-i)||0),100*((1-n-i)/(1-i)||0),100*i]},o.rgb.keyword=function(e){const t=i[e];if(t)return t;let r,o=1/0;for(const t of Object.keys(n)){const i=n[t],a=(A=i,((s=e)[0]-A[0])**2+(s[1]-A[1])**2+(s[2]-A[2])**2);a.04045?((t+.055)/1.055)**2.4:t/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,n=n>.04045?((n+.055)/1.055)**2.4:n/12.92;return[100*(.4124*t+.3576*r+.1805*n),100*(.2126*t+.7152*r+.0722*n),100*(.0193*t+.1192*r+.9505*n)]},o.rgb.lab=function(e){const t=o.rgb.xyz(e);let r=t[0],n=t[1],i=t[2];r/=95.047,n/=100,i/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,n=n>.008856?n**(1/3):7.787*n+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;return[116*n-16,500*(r-n),200*(n-i)]},o.hsl.rgb=function(e){const t=e[0]/360,r=e[1]/100,n=e[2]/100;let i,o,s;if(0===r)return s=255*n,[s,s,s];i=n<.5?n*(1+r):n+r-n*r;const A=2*n-i,a=[0,0,0];for(let e=0;e<3;e++)o=t+1/3*-(e-1),o<0&&o++,o>1&&o--,s=6*o<1?A+6*(i-A)*o:2*o<1?i:3*o<2?A+(i-A)*(2/3-o)*6:A,a[e]=255*s;return a},o.hsl.hsv=function(e){const t=e[0];let r=e[1]/100,n=e[2]/100,i=r;const o=Math.max(n,.01);n*=2,r*=n<=1?n:2-n,i*=o<=1?o:2-o;return[t,100*(0===n?2*i/(o+i):2*r/(n+r)),100*((n+r)/2)]},o.hsv.rgb=function(e){const t=e[0]/60,r=e[1]/100;let n=e[2]/100;const i=Math.floor(t)%6,o=t-Math.floor(t),s=255*n*(1-r),A=255*n*(1-r*o),a=255*n*(1-r*(1-o));switch(n*=255,i){case 0:return[n,a,s];case 1:return[A,n,s];case 2:return[s,n,a];case 3:return[s,A,n];case 4:return[a,s,n];case 5:return[n,s,A]}},o.hsv.hsl=function(e){const t=e[0],r=e[1]/100,n=e[2]/100,i=Math.max(n,.01);let o,s;s=(2-r)*n;const A=(2-r)*i;return o=r*i,o/=A<=1?A:2-A,o=o||0,s/=2,[t,100*o,100*s]},o.hwb.rgb=function(e){const t=e[0]/360;let r=e[1]/100,n=e[2]/100;const i=r+n;let o;i>1&&(r/=i,n/=i);const s=Math.floor(6*t),A=1-n;o=6*t-s,0!=(1&s)&&(o=1-o);const a=r+o*(A-r);let c,u,l;switch(s){default:case 6:case 0:c=A,u=a,l=r;break;case 1:c=a,u=A,l=r;break;case 2:c=r,u=A,l=a;break;case 3:c=r,u=a,l=A;break;case 4:c=a,u=r,l=A;break;case 5:c=A,u=r,l=a}return[255*c,255*u,255*l]},o.cmyk.rgb=function(e){const t=e[0]/100,r=e[1]/100,n=e[2]/100,i=e[3]/100;return[255*(1-Math.min(1,t*(1-i)+i)),255*(1-Math.min(1,r*(1-i)+i)),255*(1-Math.min(1,n*(1-i)+i))]},o.xyz.rgb=function(e){const t=e[0]/100,r=e[1]/100,n=e[2]/100;let i,o,s;return i=3.2406*t+-1.5372*r+-.4986*n,o=-.9689*t+1.8758*r+.0415*n,s=.0557*t+-.204*r+1.057*n,i=i>.0031308?1.055*i**(1/2.4)-.055:12.92*i,o=o>.0031308?1.055*o**(1/2.4)-.055:12.92*o,s=s>.0031308?1.055*s**(1/2.4)-.055:12.92*s,i=Math.min(Math.max(0,i),1),o=Math.min(Math.max(0,o),1),s=Math.min(Math.max(0,s),1),[255*i,255*o,255*s]},o.xyz.lab=function(e){let t=e[0],r=e[1],n=e[2];t/=95.047,r/=100,n/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;return[116*r-16,500*(t-r),200*(r-n)]},o.lab.xyz=function(e){let t,r,n;r=(e[0]+16)/116,t=e[1]/500+r,n=r-e[2]/200;const i=r**3,o=t**3,s=n**3;return r=i>.008856?i:(r-16/116)/7.787,t=o>.008856?o:(t-16/116)/7.787,n=s>.008856?s:(n-16/116)/7.787,t*=95.047,r*=100,n*=108.883,[t,r,n]},o.lab.lch=function(e){const t=e[0],r=e[1],n=e[2];let i;i=360*Math.atan2(n,r)/2/Math.PI,i<0&&(i+=360);return[t,Math.sqrt(r*r+n*n),i]},o.lch.lab=function(e){const t=e[0],r=e[1],n=e[2]/360*2*Math.PI;return[t,r*Math.cos(n),r*Math.sin(n)]},o.rgb.ansi16=function(e,t=null){const[r,n,i]=e;let s=null===t?o.rgb.hsv(e)[2]:t;if(s=Math.round(s/50),0===s)return 30;let A=30+(Math.round(i/255)<<2|Math.round(n/255)<<1|Math.round(r/255));return 2===s&&(A+=60),A},o.hsv.ansi16=function(e){return o.rgb.ansi16(o.hsv.rgb(e),e[2])},o.rgb.ansi256=function(e){const t=e[0],r=e[1],n=e[2];if(t===r&&r===n)return t<8?16:t>248?231:Math.round((t-8)/247*24)+232;return 16+36*Math.round(t/255*5)+6*Math.round(r/255*5)+Math.round(n/255*5)},o.ansi16.rgb=function(e){let t=e%10;if(0===t||7===t)return e>50&&(t+=3.5),t=t/10.5*255,[t,t,t];const r=.5*(1+~~(e>50));return[(1&t)*r*255,(t>>1&1)*r*255,(t>>2&1)*r*255]},o.ansi256.rgb=function(e){if(e>=232){const t=10*(e-232)+8;return[t,t,t]}let t;e-=16;return[Math.floor(e/36)/5*255,Math.floor((t=e%36)/6)/5*255,t%6/5*255]},o.rgb.hex=function(e){const t=(((255&Math.round(e[0]))<<16)+((255&Math.round(e[1]))<<8)+(255&Math.round(e[2]))).toString(16).toUpperCase();return"000000".substring(t.length)+t},o.hex.rgb=function(e){const t=e.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!t)return[0,0,0];let r=t[0];3===t[0].length&&(r=r.split("").map(e=>e+e).join(""));const n=parseInt(r,16);return[n>>16&255,n>>8&255,255&n]},o.rgb.hcg=function(e){const t=e[0]/255,r=e[1]/255,n=e[2]/255,i=Math.max(Math.max(t,r),n),o=Math.min(Math.min(t,r),n),s=i-o;let A,a;return A=s<1?o/(1-s):0,a=s<=0?0:i===t?(r-n)/s%6:i===r?2+(n-t)/s:4+(t-r)/s,a/=6,a%=1,[360*a,100*s,100*A]},o.hsl.hcg=function(e){const t=e[1]/100,r=e[2]/100,n=r<.5?2*t*r:2*t*(1-r);let i=0;return n<1&&(i=(r-.5*n)/(1-n)),[e[0],100*n,100*i]},o.hsv.hcg=function(e){const t=e[1]/100,r=e[2]/100,n=t*r;let i=0;return n<1&&(i=(r-n)/(1-n)),[e[0],100*n,100*i]},o.hcg.rgb=function(e){const t=e[0]/360,r=e[1]/100,n=e[2]/100;if(0===r)return[255*n,255*n,255*n];const i=[0,0,0],o=t%1*6,s=o%1,A=1-s;let a=0;switch(Math.floor(o)){case 0:i[0]=1,i[1]=s,i[2]=0;break;case 1:i[0]=A,i[1]=1,i[2]=0;break;case 2:i[0]=0,i[1]=1,i[2]=s;break;case 3:i[0]=0,i[1]=A,i[2]=1;break;case 4:i[0]=s,i[1]=0,i[2]=1;break;default:i[0]=1,i[1]=0,i[2]=A}return a=(1-r)*n,[255*(r*i[0]+a),255*(r*i[1]+a),255*(r*i[2]+a)]},o.hcg.hsv=function(e){const t=e[1]/100,r=t+e[2]/100*(1-t);let n=0;return r>0&&(n=t/r),[e[0],100*n,100*r]},o.hcg.hsl=function(e){const t=e[1]/100,r=e[2]/100*(1-t)+.5*t;let n=0;return r>0&&r<.5?n=t/(2*r):r>=.5&&r<1&&(n=t/(2*(1-r))),[e[0],100*n,100*r]},o.hcg.hwb=function(e){const t=e[1]/100,r=t+e[2]/100*(1-t);return[e[0],100*(r-t),100*(1-r)]},o.hwb.hcg=function(e){const t=e[1]/100,r=1-e[2]/100,n=r-t;let i=0;return n<1&&(i=(r-n)/(1-n)),[e[0],100*n,100*i]},o.apple.rgb=function(e){return[e[0]/65535*255,e[1]/65535*255,e[2]/65535*255]},o.rgb.apple=function(e){return[e[0]/255*65535,e[1]/255*65535,e[2]/255*65535]},o.gray.rgb=function(e){return[e[0]/100*255,e[0]/100*255,e[0]/100*255]},o.gray.hsl=function(e){return[0,0,e[0]]},o.gray.hsv=o.gray.hsl,o.gray.hwb=function(e){return[0,100,e[0]]},o.gray.cmyk=function(e){return[0,0,0,e[0]]},o.gray.lab=function(e){return[e[0],0,0]},o.gray.hex=function(e){const t=255&Math.round(e[0]/100*255),r=((t<<16)+(t<<8)+t).toString(16).toUpperCase();return"000000".substring(r.length)+r},o.rgb.gray=function(e){return[(e[0]+e[1]+e[2])/3/255*100]}},2744:(e,t,r)=>{const n=r(15311),i=r(78577),o={};Object.keys(n).forEach(e=>{o[e]={},Object.defineProperty(o[e],"channels",{value:n[e].channels}),Object.defineProperty(o[e],"labels",{value:n[e].labels});const t=i(e);Object.keys(t).forEach(r=>{const n=t[r];o[e][r]=function(e){const t=function(...t){const r=t[0];if(null==r)return r;r.length>1&&(t=r);const n=e(t);if("object"==typeof n)for(let e=n.length,t=0;t1&&(t=r),e(t))};return"conversion"in e&&(t.conversion=e.conversion),t}(n)})}),e.exports=o},78577:(e,t,r)=>{const n=r(15311);function i(e){const t=function(){const e={},t=Object.keys(n);for(let r=t.length,n=0;n{"use strict";e.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},36547:e=>{e.exports=function(e,r){for(var n=[],i=0;i{"use strict";const n=r(63129),i=r(14951),o=r(10779);function s(e,t,r){const s=i(e,t,r),A=n.spawn(s.command,s.args,s.options);return o.hookChildProcess(A,s),A}e.exports=s,e.exports.spawn=s,e.exports.sync=function(e,t,r){const s=i(e,t,r),A=n.spawnSync(s.command,s.args,s.options);return A.error=A.error||o.verifyENOENTSync(A.status,s),A},e.exports._parse=i,e.exports._enoent=o},10779:e=>{"use strict";const t="win32"===process.platform;function r(e,t){return Object.assign(new Error(`${t} ${e.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${t} ${e.command}`,path:e.command,spawnargs:e.args})}function n(e,n){return t&&1===e&&!n.file?r(n.original,"spawn"):null}e.exports={hookChildProcess:function(e,r){if(!t)return;const i=e.emit;e.emit=function(t,o){if("exit"===t){const t=n(o,r);if(t)return i.call(e,"error",t)}return i.apply(e,arguments)}},verifyENOENT:n,verifyENOENTSync:function(e,n){return t&&1===e&&!n.file?r(n.original,"spawnSync"):null},notFoundError:r}},14951:(e,t,r)=>{"use strict";const n=r(85622),i=r(47447),o=r(27066),s=r(35187),A="win32"===process.platform,a=/\.(?:com|exe)$/i,c=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function u(e){if(!A)return e;const t=function(e){e.file=i(e);const t=e.file&&s(e.file);return t?(e.args.unshift(e.file),e.command=t,i(e)):e.file}(e),r=!a.test(t);if(e.options.forceShell||r){const r=c.test(t);e.command=n.normalize(e.command),e.command=o.command(e.command),e.args=e.args.map(e=>o.argument(e,r));const i=[e.command].concat(e.args).join(" ");e.args=["/d","/s","/c",`"${i}"`],e.command=process.env.comspec||"cmd.exe",e.options.windowsVerbatimArguments=!0}return e}e.exports=function(e,t,r){t&&!Array.isArray(t)&&(r=t,t=null);const n={command:e,args:t=t?t.slice(0):[],options:r=Object.assign({},r),file:void 0,original:{command:e,args:t}};return r.shell?n:u(n)}},27066:e=>{"use strict";const t=/([()\][%!^"`<>&|;, *?])/g;e.exports.command=function(e){return e=e.replace(t,"^$1")},e.exports.argument=function(e,r){return e=(e=`"${e=(e=(e=""+e).replace(/(\\*)"/g,'$1$1\\"')).replace(/(\\*)$/,"$1$1")}"`).replace(t,"^$1"),r&&(e=e.replace(t,"^$1")),e}},35187:(e,t,r)=>{"use strict";const n=r(35747),i=r(91470);e.exports=function(e){const t=Buffer.alloc(150);let r;try{r=n.openSync(e,"r"),n.readSync(r,t,0,150,0),n.closeSync(r)}catch(e){}return i(t.toString())}},47447:(e,t,r)=>{"use strict";const n=r(85622),i=r(87945),o=r(37127);function s(e,t){const r=e.options.env||process.env,s=process.cwd(),A=null!=e.options.cwd,a=A&&void 0!==process.chdir&&!process.chdir.disabled;if(a)try{process.chdir(e.options.cwd)}catch(e){}let c;try{c=i.sync(e.command,{path:r[o({env:r})],pathExt:t?n.delimiter:void 0})}catch(e){}finally{a&&process.chdir(s)}return c&&(c=n.resolve(A?e.options.cwd:"",c)),c}e.exports=function(e){return s(e)||s(e,!0)}},53832:(e,t,r)=>{"use strict";const{pipeline:n,PassThrough:i}=r(92413),o=r(78761),s=r(60102);e.exports=e=>{const t=(e.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(t))return e;const r="br"===t;if(r&&"function"!=typeof o.createBrotliDecompress)return e;const A=r?o.createBrotliDecompress():o.createUnzip(),a=new i;A.on("error",e=>{"Z_BUF_ERROR"!==e.code?a.emit("error",e):a.end()});const c=n(e,A,a,()=>{});return s(e,c),c}},93121:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(4016),i=(e,t)=>{let r;if("function"==typeof t){r={connect:t}}else r=t;const i="function"==typeof r.connect,o="function"==typeof r.secureConnect,s="function"==typeof r.close,A=()=>{i&&r.connect(),e instanceof n.TLSSocket&&o&&(e.authorized?r.secureConnect():e.authorizationError||e.once("secureConnect",r.secureConnect)),s&&e.once("close",r.close)};e.writable&&!e.connecting?A():e.connecting?e.once("connect",A):e.destroyed&&s&&r.close(e._hadError)};t.default=i,e.exports=i,e.exports.default=i},66241:(e,t,r)=>{"use strict";const n=r(85622),i=r(5763),o=e=>e.length>1?`{${e.join(",")}}`:e[0],s=(e,t)=>{const r="!"===e[0]?e.slice(1):e;return n.isAbsolute(r)?r:n.join(t,r)},A=(e,t)=>{if(t.files&&!Array.isArray(t.files))throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof t.files}\``);if(t.extensions&&!Array.isArray(t.extensions))throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof t.extensions}\``);return t.files&&t.extensions?t.files.map(r=>{return n.posix.join(e,(i=r,s=t.extensions,n.extname(i)?"**/"+i:`**/${i}.${o(s)}`));var i,s}):t.files?t.files.map(t=>n.posix.join(e,"**/"+t)):t.extensions?[n.posix.join(e,"**/*."+o(t.extensions))]:[n.posix.join(e,"**")]};e.exports=async(e,t)=>{if("string"!=typeof(t={cwd:process.cwd(),...t}).cwd)throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof t.cwd}\``);const r=await Promise.all([].concat(e).map(async e=>await i.isDirectory(s(e,t.cwd))?A(e,t):e));return[].concat.apply([],r)},e.exports.sync=(e,t)=>{if("string"!=typeof(t={cwd:process.cwd(),...t}).cwd)throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof t.cwd}\``);const r=[].concat(e).map(e=>i.isDirectorySync(s(e,t.cwd))?A(e,t):e);return[].concat.apply([],r)}},1013:e=>{"use strict";e.exports=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g}},97681:(e,t,r)=>{var n=r(91162),i=function(){},o=function(e,t,r){if("function"==typeof t)return o(e,null,t);t||(t={}),r=n(r||i);var s=e._writableState,A=e._readableState,a=t.readable||!1!==t.readable&&e.readable,c=t.writable||!1!==t.writable&&e.writable,u=function(){e.writable||l()},l=function(){c=!1,a||r()},h=function(){a=!1,c||r()},g=function(e){r(e?new Error("exited with error code: "+e):null)},f=function(){return(!a||A&&A.ended)&&(!c||s&&s.ended)?void 0:r(new Error("premature close"))},p=function(){e.req.on("finish",l)};return!function(e){return e.setHeader&&"function"==typeof e.abort}(e)?c&&!s&&(e.on("end",u),e.on("close",u)):(e.on("complete",l),e.on("abort",f),e.req?p():e.on("request",p)),function(e){return e.stdio&&Array.isArray(e.stdio)&&3===e.stdio.length}(e)&&e.on("exit",g),e.on("end",h),e.on("finish",l),!1!==t.error&&e.on("error",r),e.on("close",f),function(){e.removeListener("complete",l),e.removeListener("abort",f),e.removeListener("request",p),e.req&&e.req.removeListener("finish",l),e.removeListener("end",u),e.removeListener("close",u),e.removeListener("finish",l),e.removeListener("exit",g),e.removeListener("end",h),e.removeListener("error",r),e.removeListener("close",f)}};e.exports=o},17067:(e,t,r)=>{var n=r(27180),i=function(){},o=function(e,t,r){if("function"==typeof t)return o(e,null,t);t||(t={}),r=n(r||i);var s=e._writableState,A=e._readableState,a=t.readable||!1!==t.readable&&e.readable,c=t.writable||!1!==t.writable&&e.writable,u=function(){e.writable||l()},l=function(){c=!1,a||r.call(e)},h=function(){a=!1,c||r.call(e)},g=function(t){r.call(e,t?new Error("exited with error code: "+t):null)},f=function(t){r.call(e,t)},p=function(){return(!a||A&&A.ended)&&(!c||s&&s.ended)?void 0:r.call(e,new Error("premature close"))},d=function(){e.req.on("finish",l)};return!function(e){return e.setHeader&&"function"==typeof e.abort}(e)?c&&!s&&(e.on("end",u),e.on("close",u)):(e.on("complete",l),e.on("abort",p),e.req?d():e.on("request",d)),function(e){return e.stdio&&Array.isArray(e.stdio)&&3===e.stdio.length}(e)&&e.on("exit",g),e.on("end",h),e.on("finish",l),!1!==t.error&&e.on("error",f),e.on("close",p),function(){e.removeListener("complete",l),e.removeListener("abort",p),e.removeListener("request",d),e.req&&e.req.removeListener("finish",l),e.removeListener("end",u),e.removeListener("close",u),e.removeListener("finish",l),e.removeListener("exit",g),e.removeListener("end",h),e.removeListener("error",f),e.removeListener("close",p)}};e.exports=o},66349:e=>{"use strict";var t=/[|\\{}()[\]^$+*?.]/g;e.exports=function(e){if("string"!=typeof e)throw new TypeError("Expected a string");return e.replace(t,"\\$&")}},41313:function(e){var t;t=function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={exports:{},id:n,loaded:!1};return e[n].call(i.exports,i,i.exports,r),i.loaded=!0,i.exports}return r.m=e,r.c=t,r.p="",r(0)}([function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1),i=r(3),o=r(8),s=r(15);function A(e,t,r){var s=null,A=function(e,t){r&&r(e,t),s&&s.visit(e,t)},a="function"==typeof r?A:null,c=!1;if(t){c="boolean"==typeof t.comment&&t.comment;var u="boolean"==typeof t.attachComment&&t.attachComment;(c||u)&&((s=new n.CommentHandler).attach=u,t.comment=!0,a=A)}var l,h=!1;t&&"string"==typeof t.sourceType&&(h="module"===t.sourceType),l=t&&"boolean"==typeof t.jsx&&t.jsx?new i.JSXParser(e,t,a):new o.Parser(e,t,a);var g=h?l.parseModule():l.parseScript();return c&&s&&(g.comments=s.comments),l.config.tokens&&(g.tokens=l.tokens),l.config.tolerant&&(g.errors=l.errorHandler.errors),g}t.parse=A,t.parseModule=function(e,t,r){var n=t||{};return n.sourceType="module",A(e,n,r)},t.parseScript=function(e,t,r){var n=t||{};return n.sourceType="script",A(e,n,r)},t.tokenize=function(e,t,r){var n,i=new s.Tokenizer(e,t);n=[];try{for(;;){var o=i.getNextToken();if(!o)break;r&&(o=r(o)),n.push(o)}}catch(e){i.errorHandler.tolerate(e)}return i.errorHandler.tolerant&&(n.errors=i.errors()),n};var a=r(2);t.Syntax=a.Syntax,t.version="4.0.1"},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(2),i=function(){function e(){this.attach=!1,this.comments=[],this.stack=[],this.leading=[],this.trailing=[]}return e.prototype.insertInnerComments=function(e,t){if(e.type===n.Syntax.BlockStatement&&0===e.body.length){for(var r=[],i=this.leading.length-1;i>=0;--i){var o=this.leading[i];t.end.offset>=o.start&&(r.unshift(o.comment),this.leading.splice(i,1),this.trailing.splice(i,1))}r.length&&(e.innerComments=r)}},e.prototype.findTrailingComments=function(e){var t=[];if(this.trailing.length>0){for(var r=this.trailing.length-1;r>=0;--r){var n=this.trailing[r];n.start>=e.end.offset&&t.unshift(n.comment)}return this.trailing.length=0,t}var i=this.stack[this.stack.length-1];if(i&&i.node.trailingComments){var o=i.node.trailingComments[0];o&&o.range[0]>=e.end.offset&&(t=i.node.trailingComments,delete i.node.trailingComments)}return t},e.prototype.findLeadingComments=function(e){for(var t,r=[];this.stack.length>0&&((o=this.stack[this.stack.length-1])&&o.start>=e.start.offset);)t=o.node,this.stack.pop();if(t){for(var n=(t.leadingComments?t.leadingComments.length:0)-1;n>=0;--n){var i=t.leadingComments[n];i.range[1]<=e.start.offset&&(r.unshift(i),t.leadingComments.splice(n,1))}return t.leadingComments&&0===t.leadingComments.length&&delete t.leadingComments,r}for(n=this.leading.length-1;n>=0;--n){var o;(o=this.leading[n]).start<=e.start.offset&&(r.unshift(o.comment),this.leading.splice(n,1))}return r},e.prototype.visitNode=function(e,t){if(!(e.type===n.Syntax.Program&&e.body.length>0)){this.insertInnerComments(e,t);var r=this.findTrailingComments(t),i=this.findLeadingComments(t);i.length>0&&(e.leadingComments=i),r.length>0&&(e.trailingComments=r),this.stack.push({node:e,start:t.start.offset})}},e.prototype.visitComment=function(e,t){var r="L"===e.type[0]?"Line":"Block",n={type:r,value:e.value};if(e.range&&(n.range=e.range),e.loc&&(n.loc=e.loc),this.comments.push(n),this.attach){var i={comment:{type:r,value:e.value,range:[t.start.offset,t.end.offset]},start:t.start.offset};e.loc&&(i.comment.loc=e.loc),e.type=r,this.leading.push(i),this.trailing.push(i)}},e.prototype.visit=function(e,t){"LineComment"===e.type||"BlockComment"===e.type?this.visitComment(e,t):this.attach&&this.visitNode(e,t)},e}();t.CommentHandler=i},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Syntax={AssignmentExpression:"AssignmentExpression",AssignmentPattern:"AssignmentPattern",ArrayExpression:"ArrayExpression",ArrayPattern:"ArrayPattern",ArrowFunctionExpression:"ArrowFunctionExpression",AwaitExpression:"AwaitExpression",BlockStatement:"BlockStatement",BinaryExpression:"BinaryExpression",BreakStatement:"BreakStatement",CallExpression:"CallExpression",CatchClause:"CatchClause",ClassBody:"ClassBody",ClassDeclaration:"ClassDeclaration",ClassExpression:"ClassExpression",ConditionalExpression:"ConditionalExpression",ContinueStatement:"ContinueStatement",DoWhileStatement:"DoWhileStatement",DebuggerStatement:"DebuggerStatement",EmptyStatement:"EmptyStatement",ExportAllDeclaration:"ExportAllDeclaration",ExportDefaultDeclaration:"ExportDefaultDeclaration",ExportNamedDeclaration:"ExportNamedDeclaration",ExportSpecifier:"ExportSpecifier",ExpressionStatement:"ExpressionStatement",ForStatement:"ForStatement",ForOfStatement:"ForOfStatement",ForInStatement:"ForInStatement",FunctionDeclaration:"FunctionDeclaration",FunctionExpression:"FunctionExpression",Identifier:"Identifier",IfStatement:"IfStatement",ImportDeclaration:"ImportDeclaration",ImportDefaultSpecifier:"ImportDefaultSpecifier",ImportNamespaceSpecifier:"ImportNamespaceSpecifier",ImportSpecifier:"ImportSpecifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",MetaProperty:"MetaProperty",MethodDefinition:"MethodDefinition",NewExpression:"NewExpression",ObjectExpression:"ObjectExpression",ObjectPattern:"ObjectPattern",Program:"Program",Property:"Property",RestElement:"RestElement",ReturnStatement:"ReturnStatement",SequenceExpression:"SequenceExpression",SpreadElement:"SpreadElement",Super:"Super",SwitchCase:"SwitchCase",SwitchStatement:"SwitchStatement",TaggedTemplateExpression:"TaggedTemplateExpression",TemplateElement:"TemplateElement",TemplateLiteral:"TemplateLiteral",ThisExpression:"ThisExpression",ThrowStatement:"ThrowStatement",TryStatement:"TryStatement",UnaryExpression:"UnaryExpression",UpdateExpression:"UpdateExpression",VariableDeclaration:"VariableDeclaration",VariableDeclarator:"VariableDeclarator",WhileStatement:"WhileStatement",WithStatement:"WithStatement",YieldExpression:"YieldExpression"}},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(4),s=r(5),A=r(6),a=r(7),c=r(8),u=r(13),l=r(14);function h(e){var t;switch(e.type){case A.JSXSyntax.JSXIdentifier:t=e.name;break;case A.JSXSyntax.JSXNamespacedName:var r=e;t=h(r.namespace)+":"+h(r.name);break;case A.JSXSyntax.JSXMemberExpression:var n=e;t=h(n.object)+"."+h(n.property)}return t}u.TokenName[100]="JSXIdentifier",u.TokenName[101]="JSXText";var g=function(e){function t(t,r,n){return e.call(this,t,r,n)||this}return i(t,e),t.prototype.parsePrimaryExpression=function(){return this.match("<")?this.parseJSXRoot():e.prototype.parsePrimaryExpression.call(this)},t.prototype.startJSX=function(){this.scanner.index=this.startMarker.index,this.scanner.lineNumber=this.startMarker.line,this.scanner.lineStart=this.startMarker.index-this.startMarker.column},t.prototype.finishJSX=function(){this.nextToken()},t.prototype.reenterJSX=function(){this.startJSX(),this.expectJSX("}"),this.config.tokens&&this.tokens.pop()},t.prototype.createJSXNode=function(){return this.collectComments(),{index:this.scanner.index,line:this.scanner.lineNumber,column:this.scanner.index-this.scanner.lineStart}},t.prototype.createJSXChildNode=function(){return{index:this.scanner.index,line:this.scanner.lineNumber,column:this.scanner.index-this.scanner.lineStart}},t.prototype.scanXHTMLEntity=function(e){for(var t="&",r=!0,n=!1,i=!1,s=!1;!this.scanner.eof()&&r&&!n;){var A=this.scanner.source[this.scanner.index];if(A===e)break;if(n=";"===A,t+=A,++this.scanner.index,!n)switch(t.length){case 2:i="#"===A;break;case 3:i&&(r=(s="x"===A)||o.Character.isDecimalDigit(A.charCodeAt(0)),i=i&&!s);break;default:r=(r=r&&!(i&&!o.Character.isDecimalDigit(A.charCodeAt(0))))&&!(s&&!o.Character.isHexDigit(A.charCodeAt(0)))}}if(r&&n&&t.length>2){var a=t.substr(1,t.length-2);i&&a.length>1?t=String.fromCharCode(parseInt(a.substr(1),10)):s&&a.length>2?t=String.fromCharCode(parseInt("0"+a.substr(1),16)):i||s||!l.XHTMLEntities[a]||(t=l.XHTMLEntities[a])}return t},t.prototype.lexJSX=function(){var e=this.scanner.source.charCodeAt(this.scanner.index);if(60===e||62===e||47===e||58===e||61===e||123===e||125===e)return{type:7,value:A=this.scanner.source[this.scanner.index++],lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:this.scanner.index-1,end:this.scanner.index};if(34===e||39===e){for(var t=this.scanner.index,r=this.scanner.source[this.scanner.index++],n="";!this.scanner.eof()&&(a=this.scanner.source[this.scanner.index++])!==r;)n+="&"===a?this.scanXHTMLEntity(r):a;return{type:8,value:n,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:t,end:this.scanner.index}}if(46===e){var i=this.scanner.source.charCodeAt(this.scanner.index+1),s=this.scanner.source.charCodeAt(this.scanner.index+2),A=46===i&&46===s?"...":".";return t=this.scanner.index,this.scanner.index+=A.length,{type:7,value:A,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:t,end:this.scanner.index}}if(96===e)return{type:10,value:"",lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:this.scanner.index,end:this.scanner.index};if(o.Character.isIdentifierStart(e)&&92!==e){for(t=this.scanner.index,++this.scanner.index;!this.scanner.eof();){var a=this.scanner.source.charCodeAt(this.scanner.index);if(o.Character.isIdentifierPart(a)&&92!==a)++this.scanner.index;else{if(45!==a)break;++this.scanner.index}}return{type:100,value:this.scanner.source.slice(t,this.scanner.index),lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:t,end:this.scanner.index}}return this.scanner.lex()},t.prototype.nextJSXToken=function(){this.collectComments(),this.startMarker.index=this.scanner.index,this.startMarker.line=this.scanner.lineNumber,this.startMarker.column=this.scanner.index-this.scanner.lineStart;var e=this.lexJSX();return this.lastMarker.index=this.scanner.index,this.lastMarker.line=this.scanner.lineNumber,this.lastMarker.column=this.scanner.index-this.scanner.lineStart,this.config.tokens&&this.tokens.push(this.convertToken(e)),e},t.prototype.nextJSXText=function(){this.startMarker.index=this.scanner.index,this.startMarker.line=this.scanner.lineNumber,this.startMarker.column=this.scanner.index-this.scanner.lineStart;for(var e=this.scanner.index,t="";!this.scanner.eof();){var r=this.scanner.source[this.scanner.index];if("{"===r||"<"===r)break;++this.scanner.index,t+=r,o.Character.isLineTerminator(r.charCodeAt(0))&&(++this.scanner.lineNumber,"\r"===r&&"\n"===this.scanner.source[this.scanner.index]&&++this.scanner.index,this.scanner.lineStart=this.scanner.index)}this.lastMarker.index=this.scanner.index,this.lastMarker.line=this.scanner.lineNumber,this.lastMarker.column=this.scanner.index-this.scanner.lineStart;var n={type:101,value:t,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:e,end:this.scanner.index};return t.length>0&&this.config.tokens&&this.tokens.push(this.convertToken(n)),n},t.prototype.peekJSXToken=function(){var e=this.scanner.saveState();this.scanner.scanComments();var t=this.lexJSX();return this.scanner.restoreState(e),t},t.prototype.expectJSX=function(e){var t=this.nextJSXToken();7===t.type&&t.value===e||this.throwUnexpectedToken(t)},t.prototype.matchJSX=function(e){var t=this.peekJSXToken();return 7===t.type&&t.value===e},t.prototype.parseJSXIdentifier=function(){var e=this.createJSXNode(),t=this.nextJSXToken();return 100!==t.type&&this.throwUnexpectedToken(t),this.finalize(e,new s.JSXIdentifier(t.value))},t.prototype.parseJSXElementName=function(){var e=this.createJSXNode(),t=this.parseJSXIdentifier();if(this.matchJSX(":")){var r=t;this.expectJSX(":");var n=this.parseJSXIdentifier();t=this.finalize(e,new s.JSXNamespacedName(r,n))}else if(this.matchJSX("."))for(;this.matchJSX(".");){var i=t;this.expectJSX(".");var o=this.parseJSXIdentifier();t=this.finalize(e,new s.JSXMemberExpression(i,o))}return t},t.prototype.parseJSXAttributeName=function(){var e,t=this.createJSXNode(),r=this.parseJSXIdentifier();if(this.matchJSX(":")){var n=r;this.expectJSX(":");var i=this.parseJSXIdentifier();e=this.finalize(t,new s.JSXNamespacedName(n,i))}else e=r;return e},t.prototype.parseJSXStringLiteralAttribute=function(){var e=this.createJSXNode(),t=this.nextJSXToken();8!==t.type&&this.throwUnexpectedToken(t);var r=this.getTokenRaw(t);return this.finalize(e,new a.Literal(t.value,r))},t.prototype.parseJSXExpressionAttribute=function(){var e=this.createJSXNode();this.expectJSX("{"),this.finishJSX(),this.match("}")&&this.tolerateError("JSX attributes must only be assigned a non-empty expression");var t=this.parseAssignmentExpression();return this.reenterJSX(),this.finalize(e,new s.JSXExpressionContainer(t))},t.prototype.parseJSXAttributeValue=function(){return this.matchJSX("{")?this.parseJSXExpressionAttribute():this.matchJSX("<")?this.parseJSXElement():this.parseJSXStringLiteralAttribute()},t.prototype.parseJSXNameValueAttribute=function(){var e=this.createJSXNode(),t=this.parseJSXAttributeName(),r=null;return this.matchJSX("=")&&(this.expectJSX("="),r=this.parseJSXAttributeValue()),this.finalize(e,new s.JSXAttribute(t,r))},t.prototype.parseJSXSpreadAttribute=function(){var e=this.createJSXNode();this.expectJSX("{"),this.expectJSX("..."),this.finishJSX();var t=this.parseAssignmentExpression();return this.reenterJSX(),this.finalize(e,new s.JSXSpreadAttribute(t))},t.prototype.parseJSXAttributes=function(){for(var e=[];!this.matchJSX("/")&&!this.matchJSX(">");){var t=this.matchJSX("{")?this.parseJSXSpreadAttribute():this.parseJSXNameValueAttribute();e.push(t)}return e},t.prototype.parseJSXOpeningElement=function(){var e=this.createJSXNode();this.expectJSX("<");var t=this.parseJSXElementName(),r=this.parseJSXAttributes(),n=this.matchJSX("/");return n&&this.expectJSX("/"),this.expectJSX(">"),this.finalize(e,new s.JSXOpeningElement(t,n,r))},t.prototype.parseJSXBoundaryElement=function(){var e=this.createJSXNode();if(this.expectJSX("<"),this.matchJSX("/")){this.expectJSX("/");var t=this.parseJSXElementName();return this.expectJSX(">"),this.finalize(e,new s.JSXClosingElement(t))}var r=this.parseJSXElementName(),n=this.parseJSXAttributes(),i=this.matchJSX("/");return i&&this.expectJSX("/"),this.expectJSX(">"),this.finalize(e,new s.JSXOpeningElement(r,i,n))},t.prototype.parseJSXEmptyExpression=function(){var e=this.createJSXChildNode();return this.collectComments(),this.lastMarker.index=this.scanner.index,this.lastMarker.line=this.scanner.lineNumber,this.lastMarker.column=this.scanner.index-this.scanner.lineStart,this.finalize(e,new s.JSXEmptyExpression)},t.prototype.parseJSXExpressionContainer=function(){var e,t=this.createJSXNode();return this.expectJSX("{"),this.matchJSX("}")?(e=this.parseJSXEmptyExpression(),this.expectJSX("}")):(this.finishJSX(),e=this.parseAssignmentExpression(),this.reenterJSX()),this.finalize(t,new s.JSXExpressionContainer(e))},t.prototype.parseJSXChildren=function(){for(var e=[];!this.scanner.eof();){var t=this.createJSXChildNode(),r=this.nextJSXText();if(r.start0))break;o=this.finalize(e.node,new s.JSXElement(e.opening,e.children,e.closing)),(e=t[t.length-1]).children.push(o),t.pop()}}return e},t.prototype.parseJSXElement=function(){var e=this.createJSXNode(),t=this.parseJSXOpeningElement(),r=[],n=null;if(!t.selfClosing){var i=this.parseComplexJSXElement({node:e,opening:t,closing:n,children:r});r=i.children,n=i.closing}return this.finalize(e,new s.JSXElement(t,r,n))},t.prototype.parseJSXRoot=function(){this.config.tokens&&this.tokens.pop(),this.startJSX();var e=this.parseJSXElement();return this.finishJSX(),e},t.prototype.isStartOfExpression=function(){return e.prototype.isStartOfExpression.call(this)||this.match("<")},t}(c.Parser);t.JSXParser=g},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r={NonAsciiIdentifierStart:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,NonAsciiIdentifierPart:/[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/};t.Character={fromCodePoint:function(e){return e<65536?String.fromCharCode(e):String.fromCharCode(55296+(e-65536>>10))+String.fromCharCode(56320+(e-65536&1023))},isWhiteSpace:function(e){return 32===e||9===e||11===e||12===e||160===e||e>=5760&&[5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279].indexOf(e)>=0},isLineTerminator:function(e){return 10===e||13===e||8232===e||8233===e},isIdentifierStart:function(e){return 36===e||95===e||e>=65&&e<=90||e>=97&&e<=122||92===e||e>=128&&r.NonAsciiIdentifierStart.test(t.Character.fromCodePoint(e))},isIdentifierPart:function(e){return 36===e||95===e||e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||92===e||e>=128&&r.NonAsciiIdentifierPart.test(t.Character.fromCodePoint(e))},isDecimalDigit:function(e){return e>=48&&e<=57},isHexDigit:function(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102},isOctalDigit:function(e){return e>=48&&e<=55}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(6),i=function(e){this.type=n.JSXSyntax.JSXClosingElement,this.name=e};t.JSXClosingElement=i;var o=function(e,t,r){this.type=n.JSXSyntax.JSXElement,this.openingElement=e,this.children=t,this.closingElement=r};t.JSXElement=o;var s=function(){this.type=n.JSXSyntax.JSXEmptyExpression};t.JSXEmptyExpression=s;var A=function(e){this.type=n.JSXSyntax.JSXExpressionContainer,this.expression=e};t.JSXExpressionContainer=A;var a=function(e){this.type=n.JSXSyntax.JSXIdentifier,this.name=e};t.JSXIdentifier=a;var c=function(e,t){this.type=n.JSXSyntax.JSXMemberExpression,this.object=e,this.property=t};t.JSXMemberExpression=c;var u=function(e,t){this.type=n.JSXSyntax.JSXAttribute,this.name=e,this.value=t};t.JSXAttribute=u;var l=function(e,t){this.type=n.JSXSyntax.JSXNamespacedName,this.namespace=e,this.name=t};t.JSXNamespacedName=l;var h=function(e,t,r){this.type=n.JSXSyntax.JSXOpeningElement,this.name=e,this.selfClosing=t,this.attributes=r};t.JSXOpeningElement=h;var g=function(e){this.type=n.JSXSyntax.JSXSpreadAttribute,this.argument=e};t.JSXSpreadAttribute=g;var f=function(e,t){this.type=n.JSXSyntax.JSXText,this.value=e,this.raw=t};t.JSXText=f},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.JSXSyntax={JSXAttribute:"JSXAttribute",JSXClosingElement:"JSXClosingElement",JSXElement:"JSXElement",JSXEmptyExpression:"JSXEmptyExpression",JSXExpressionContainer:"JSXExpressionContainer",JSXIdentifier:"JSXIdentifier",JSXMemberExpression:"JSXMemberExpression",JSXNamespacedName:"JSXNamespacedName",JSXOpeningElement:"JSXOpeningElement",JSXSpreadAttribute:"JSXSpreadAttribute",JSXText:"JSXText"}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(2),i=function(e){this.type=n.Syntax.ArrayExpression,this.elements=e};t.ArrayExpression=i;var o=function(e){this.type=n.Syntax.ArrayPattern,this.elements=e};t.ArrayPattern=o;var s=function(e,t,r){this.type=n.Syntax.ArrowFunctionExpression,this.id=null,this.params=e,this.body=t,this.generator=!1,this.expression=r,this.async=!1};t.ArrowFunctionExpression=s;var A=function(e,t,r){this.type=n.Syntax.AssignmentExpression,this.operator=e,this.left=t,this.right=r};t.AssignmentExpression=A;var a=function(e,t){this.type=n.Syntax.AssignmentPattern,this.left=e,this.right=t};t.AssignmentPattern=a;var c=function(e,t,r){this.type=n.Syntax.ArrowFunctionExpression,this.id=null,this.params=e,this.body=t,this.generator=!1,this.expression=r,this.async=!0};t.AsyncArrowFunctionExpression=c;var u=function(e,t,r){this.type=n.Syntax.FunctionDeclaration,this.id=e,this.params=t,this.body=r,this.generator=!1,this.expression=!1,this.async=!0};t.AsyncFunctionDeclaration=u;var l=function(e,t,r){this.type=n.Syntax.FunctionExpression,this.id=e,this.params=t,this.body=r,this.generator=!1,this.expression=!1,this.async=!0};t.AsyncFunctionExpression=l;var h=function(e){this.type=n.Syntax.AwaitExpression,this.argument=e};t.AwaitExpression=h;var g=function(e,t,r){var i="||"===e||"&&"===e;this.type=i?n.Syntax.LogicalExpression:n.Syntax.BinaryExpression,this.operator=e,this.left=t,this.right=r};t.BinaryExpression=g;var f=function(e){this.type=n.Syntax.BlockStatement,this.body=e};t.BlockStatement=f;var p=function(e){this.type=n.Syntax.BreakStatement,this.label=e};t.BreakStatement=p;var d=function(e,t){this.type=n.Syntax.CallExpression,this.callee=e,this.arguments=t};t.CallExpression=d;var C=function(e,t){this.type=n.Syntax.CatchClause,this.param=e,this.body=t};t.CatchClause=C;var E=function(e){this.type=n.Syntax.ClassBody,this.body=e};t.ClassBody=E;var I=function(e,t,r){this.type=n.Syntax.ClassDeclaration,this.id=e,this.superClass=t,this.body=r};t.ClassDeclaration=I;var m=function(e,t,r){this.type=n.Syntax.ClassExpression,this.id=e,this.superClass=t,this.body=r};t.ClassExpression=m;var y=function(e,t){this.type=n.Syntax.MemberExpression,this.computed=!0,this.object=e,this.property=t};t.ComputedMemberExpression=y;var w=function(e,t,r){this.type=n.Syntax.ConditionalExpression,this.test=e,this.consequent=t,this.alternate=r};t.ConditionalExpression=w;var B=function(e){this.type=n.Syntax.ContinueStatement,this.label=e};t.ContinueStatement=B;var Q=function(){this.type=n.Syntax.DebuggerStatement};t.DebuggerStatement=Q;var v=function(e,t){this.type=n.Syntax.ExpressionStatement,this.expression=e,this.directive=t};t.Directive=v;var D=function(e,t){this.type=n.Syntax.DoWhileStatement,this.body=e,this.test=t};t.DoWhileStatement=D;var b=function(){this.type=n.Syntax.EmptyStatement};t.EmptyStatement=b;var S=function(e){this.type=n.Syntax.ExportAllDeclaration,this.source=e};t.ExportAllDeclaration=S;var k=function(e){this.type=n.Syntax.ExportDefaultDeclaration,this.declaration=e};t.ExportDefaultDeclaration=k;var x=function(e,t,r){this.type=n.Syntax.ExportNamedDeclaration,this.declaration=e,this.specifiers=t,this.source=r};t.ExportNamedDeclaration=x;var F=function(e,t){this.type=n.Syntax.ExportSpecifier,this.exported=t,this.local=e};t.ExportSpecifier=F;var M=function(e){this.type=n.Syntax.ExpressionStatement,this.expression=e};t.ExpressionStatement=M;var N=function(e,t,r){this.type=n.Syntax.ForInStatement,this.left=e,this.right=t,this.body=r,this.each=!1};t.ForInStatement=N;var R=function(e,t,r){this.type=n.Syntax.ForOfStatement,this.left=e,this.right=t,this.body=r};t.ForOfStatement=R;var K=function(e,t,r,i){this.type=n.Syntax.ForStatement,this.init=e,this.test=t,this.update=r,this.body=i};t.ForStatement=K;var L=function(e,t,r,i){this.type=n.Syntax.FunctionDeclaration,this.id=e,this.params=t,this.body=r,this.generator=i,this.expression=!1,this.async=!1};t.FunctionDeclaration=L;var T=function(e,t,r,i){this.type=n.Syntax.FunctionExpression,this.id=e,this.params=t,this.body=r,this.generator=i,this.expression=!1,this.async=!1};t.FunctionExpression=T;var P=function(e){this.type=n.Syntax.Identifier,this.name=e};t.Identifier=P;var U=function(e,t,r){this.type=n.Syntax.IfStatement,this.test=e,this.consequent=t,this.alternate=r};t.IfStatement=U;var _=function(e,t){this.type=n.Syntax.ImportDeclaration,this.specifiers=e,this.source=t};t.ImportDeclaration=_;var O=function(e){this.type=n.Syntax.ImportDefaultSpecifier,this.local=e};t.ImportDefaultSpecifier=O;var j=function(e){this.type=n.Syntax.ImportNamespaceSpecifier,this.local=e};t.ImportNamespaceSpecifier=j;var Y=function(e,t){this.type=n.Syntax.ImportSpecifier,this.local=e,this.imported=t};t.ImportSpecifier=Y;var G=function(e,t){this.type=n.Syntax.LabeledStatement,this.label=e,this.body=t};t.LabeledStatement=G;var J=function(e,t){this.type=n.Syntax.Literal,this.value=e,this.raw=t};t.Literal=J;var H=function(e,t){this.type=n.Syntax.MetaProperty,this.meta=e,this.property=t};t.MetaProperty=H;var q=function(e,t,r,i,o){this.type=n.Syntax.MethodDefinition,this.key=e,this.computed=t,this.value=r,this.kind=i,this.static=o};t.MethodDefinition=q;var z=function(e){this.type=n.Syntax.Program,this.body=e,this.sourceType="module"};t.Module=z;var W=function(e,t){this.type=n.Syntax.NewExpression,this.callee=e,this.arguments=t};t.NewExpression=W;var V=function(e){this.type=n.Syntax.ObjectExpression,this.properties=e};t.ObjectExpression=V;var X=function(e){this.type=n.Syntax.ObjectPattern,this.properties=e};t.ObjectPattern=X;var Z=function(e,t,r,i,o,s){this.type=n.Syntax.Property,this.key=t,this.computed=r,this.value=i,this.kind=e,this.method=o,this.shorthand=s};t.Property=Z;var $=function(e,t,r,i){this.type=n.Syntax.Literal,this.value=e,this.raw=t,this.regex={pattern:r,flags:i}};t.RegexLiteral=$;var ee=function(e){this.type=n.Syntax.RestElement,this.argument=e};t.RestElement=ee;var te=function(e){this.type=n.Syntax.ReturnStatement,this.argument=e};t.ReturnStatement=te;var re=function(e){this.type=n.Syntax.Program,this.body=e,this.sourceType="script"};t.Script=re;var ne=function(e){this.type=n.Syntax.SequenceExpression,this.expressions=e};t.SequenceExpression=ne;var ie=function(e){this.type=n.Syntax.SpreadElement,this.argument=e};t.SpreadElement=ie;var oe=function(e,t){this.type=n.Syntax.MemberExpression,this.computed=!1,this.object=e,this.property=t};t.StaticMemberExpression=oe;var se=function(){this.type=n.Syntax.Super};t.Super=se;var Ae=function(e,t){this.type=n.Syntax.SwitchCase,this.test=e,this.consequent=t};t.SwitchCase=Ae;var ae=function(e,t){this.type=n.Syntax.SwitchStatement,this.discriminant=e,this.cases=t};t.SwitchStatement=ae;var ce=function(e,t){this.type=n.Syntax.TaggedTemplateExpression,this.tag=e,this.quasi=t};t.TaggedTemplateExpression=ce;var ue=function(e,t){this.type=n.Syntax.TemplateElement,this.value=e,this.tail=t};t.TemplateElement=ue;var le=function(e,t){this.type=n.Syntax.TemplateLiteral,this.quasis=e,this.expressions=t};t.TemplateLiteral=le;var he=function(){this.type=n.Syntax.ThisExpression};t.ThisExpression=he;var ge=function(e){this.type=n.Syntax.ThrowStatement,this.argument=e};t.ThrowStatement=ge;var fe=function(e,t,r){this.type=n.Syntax.TryStatement,this.block=e,this.handler=t,this.finalizer=r};t.TryStatement=fe;var pe=function(e,t){this.type=n.Syntax.UnaryExpression,this.operator=e,this.argument=t,this.prefix=!0};t.UnaryExpression=pe;var de=function(e,t,r){this.type=n.Syntax.UpdateExpression,this.operator=e,this.argument=t,this.prefix=r};t.UpdateExpression=de;var Ce=function(e,t){this.type=n.Syntax.VariableDeclaration,this.declarations=e,this.kind=t};t.VariableDeclaration=Ce;var Ee=function(e,t){this.type=n.Syntax.VariableDeclarator,this.id=e,this.init=t};t.VariableDeclarator=Ee;var Ie=function(e,t){this.type=n.Syntax.WhileStatement,this.test=e,this.body=t};t.WhileStatement=Ie;var me=function(e,t){this.type=n.Syntax.WithStatement,this.object=e,this.body=t};t.WithStatement=me;var ye=function(e,t){this.type=n.Syntax.YieldExpression,this.argument=e,this.delegate=t};t.YieldExpression=ye},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(9),i=r(10),o=r(11),s=r(7),A=r(12),a=r(2),c=r(13),u=function(){function e(e,t,r){void 0===t&&(t={}),this.config={range:"boolean"==typeof t.range&&t.range,loc:"boolean"==typeof t.loc&&t.loc,source:null,tokens:"boolean"==typeof t.tokens&&t.tokens,comment:"boolean"==typeof t.comment&&t.comment,tolerant:"boolean"==typeof t.tolerant&&t.tolerant},this.config.loc&&t.source&&null!==t.source&&(this.config.source=String(t.source)),this.delegate=r,this.errorHandler=new i.ErrorHandler,this.errorHandler.tolerant=this.config.tolerant,this.scanner=new A.Scanner(e,this.errorHandler),this.scanner.trackComment=this.config.comment,this.operatorPrecedence={")":0,";":0,",":0,"=":0,"]":0,"||":1,"&&":2,"|":3,"^":4,"&":5,"==":6,"!=":6,"===":6,"!==":6,"<":7,">":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":11,"/":11,"%":11},this.lookahead={type:2,value:"",lineNumber:this.scanner.lineNumber,lineStart:0,start:0,end:0},this.hasLineTerminator=!1,this.context={isModule:!1,await:!1,allowIn:!0,allowStrictDirective:!0,allowYield:!0,firstCoverInitializedNameError:null,isAssignmentTarget:!1,isBindingElement:!1,inFunctionBody:!1,inIteration:!1,inSwitch:!1,labelSet:{},strict:!1},this.tokens=[],this.startMarker={index:0,line:this.scanner.lineNumber,column:0},this.lastMarker={index:0,line:this.scanner.lineNumber,column:0},this.nextToken(),this.lastMarker={index:this.scanner.index,line:this.scanner.lineNumber,column:this.scanner.index-this.scanner.lineStart}}return e.prototype.throwError=function(e){for(var t=[],r=1;r0&&this.delegate)for(var t=0;t>="===e||">>>="===e||"&="===e||"^="===e||"|="===e},e.prototype.isolateCoverGrammar=function(e){var t=this.context.isBindingElement,r=this.context.isAssignmentTarget,n=this.context.firstCoverInitializedNameError;this.context.isBindingElement=!0,this.context.isAssignmentTarget=!0,this.context.firstCoverInitializedNameError=null;var i=e.call(this);return null!==this.context.firstCoverInitializedNameError&&this.throwUnexpectedToken(this.context.firstCoverInitializedNameError),this.context.isBindingElement=t,this.context.isAssignmentTarget=r,this.context.firstCoverInitializedNameError=n,i},e.prototype.inheritCoverGrammar=function(e){var t=this.context.isBindingElement,r=this.context.isAssignmentTarget,n=this.context.firstCoverInitializedNameError;this.context.isBindingElement=!0,this.context.isAssignmentTarget=!0,this.context.firstCoverInitializedNameError=null;var i=e.call(this);return this.context.isBindingElement=this.context.isBindingElement&&t,this.context.isAssignmentTarget=this.context.isAssignmentTarget&&r,this.context.firstCoverInitializedNameError=n||this.context.firstCoverInitializedNameError,i},e.prototype.consumeSemicolon=function(){this.match(";")?this.nextToken():this.hasLineTerminator||(2===this.lookahead.type||this.match("}")||this.throwUnexpectedToken(this.lookahead),this.lastMarker.index=this.startMarker.index,this.lastMarker.line=this.startMarker.line,this.lastMarker.column=this.startMarker.column)},e.prototype.parsePrimaryExpression=function(){var e,t,r,n=this.createNode();switch(this.lookahead.type){case 3:(this.context.isModule||this.context.await)&&"await"===this.lookahead.value&&this.tolerateUnexpectedToken(this.lookahead),e=this.matchAsyncFunction()?this.parseFunctionExpression():this.finalize(n,new s.Identifier(this.nextToken().value));break;case 6:case 8:this.context.strict&&this.lookahead.octal&&this.tolerateUnexpectedToken(this.lookahead,o.Messages.StrictOctalLiteral),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,t=this.nextToken(),r=this.getTokenRaw(t),e=this.finalize(n,new s.Literal(t.value,r));break;case 1:this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,t=this.nextToken(),r=this.getTokenRaw(t),e=this.finalize(n,new s.Literal("true"===t.value,r));break;case 5:this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,t=this.nextToken(),r=this.getTokenRaw(t),e=this.finalize(n,new s.Literal(null,r));break;case 10:e=this.parseTemplateLiteral();break;case 7:switch(this.lookahead.value){case"(":this.context.isBindingElement=!1,e=this.inheritCoverGrammar(this.parseGroupExpression);break;case"[":e=this.inheritCoverGrammar(this.parseArrayInitializer);break;case"{":e=this.inheritCoverGrammar(this.parseObjectInitializer);break;case"/":case"/=":this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,this.scanner.index=this.startMarker.index,t=this.nextRegexToken(),r=this.getTokenRaw(t),e=this.finalize(n,new s.RegexLiteral(t.regex,r,t.pattern,t.flags));break;default:e=this.throwUnexpectedToken(this.nextToken())}break;case 4:!this.context.strict&&this.context.allowYield&&this.matchKeyword("yield")?e=this.parseIdentifierName():!this.context.strict&&this.matchKeyword("let")?e=this.finalize(n,new s.Identifier(this.nextToken().value)):(this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,this.matchKeyword("function")?e=this.parseFunctionExpression():this.matchKeyword("this")?(this.nextToken(),e=this.finalize(n,new s.ThisExpression)):e=this.matchKeyword("class")?this.parseClassExpression():this.throwUnexpectedToken(this.nextToken()));break;default:e=this.throwUnexpectedToken(this.nextToken())}return e},e.prototype.parseSpreadElement=function(){var e=this.createNode();this.expect("...");var t=this.inheritCoverGrammar(this.parseAssignmentExpression);return this.finalize(e,new s.SpreadElement(t))},e.prototype.parseArrayInitializer=function(){var e=this.createNode(),t=[];for(this.expect("[");!this.match("]");)if(this.match(","))this.nextToken(),t.push(null);else if(this.match("...")){var r=this.parseSpreadElement();this.match("]")||(this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,this.expect(",")),t.push(r)}else t.push(this.inheritCoverGrammar(this.parseAssignmentExpression)),this.match("]")||this.expect(",");return this.expect("]"),this.finalize(e,new s.ArrayExpression(t))},e.prototype.parsePropertyMethod=function(e){this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1;var t=this.context.strict,r=this.context.allowStrictDirective;this.context.allowStrictDirective=e.simple;var n=this.isolateCoverGrammar(this.parseFunctionSourceElements);return this.context.strict&&e.firstRestricted&&this.tolerateUnexpectedToken(e.firstRestricted,e.message),this.context.strict&&e.stricted&&this.tolerateUnexpectedToken(e.stricted,e.message),this.context.strict=t,this.context.allowStrictDirective=r,n},e.prototype.parsePropertyMethodFunction=function(){var e=this.createNode(),t=this.context.allowYield;this.context.allowYield=!0;var r=this.parseFormalParameters(),n=this.parsePropertyMethod(r);return this.context.allowYield=t,this.finalize(e,new s.FunctionExpression(null,r.params,n,!1))},e.prototype.parsePropertyMethodAsyncFunction=function(){var e=this.createNode(),t=this.context.allowYield,r=this.context.await;this.context.allowYield=!1,this.context.await=!0;var n=this.parseFormalParameters(),i=this.parsePropertyMethod(n);return this.context.allowYield=t,this.context.await=r,this.finalize(e,new s.AsyncFunctionExpression(null,n.params,i))},e.prototype.parseObjectPropertyKey=function(){var e,t=this.createNode(),r=this.nextToken();switch(r.type){case 8:case 6:this.context.strict&&r.octal&&this.tolerateUnexpectedToken(r,o.Messages.StrictOctalLiteral);var n=this.getTokenRaw(r);e=this.finalize(t,new s.Literal(r.value,n));break;case 3:case 1:case 5:case 4:e=this.finalize(t,new s.Identifier(r.value));break;case 7:"["===r.value?(e=this.isolateCoverGrammar(this.parseAssignmentExpression),this.expect("]")):e=this.throwUnexpectedToken(r);break;default:e=this.throwUnexpectedToken(r)}return e},e.prototype.isPropertyKey=function(e,t){return e.type===a.Syntax.Identifier&&e.name===t||e.type===a.Syntax.Literal&&e.value===t},e.prototype.parseObjectProperty=function(e){var t,r=this.createNode(),n=this.lookahead,i=null,A=null,a=!1,c=!1,u=!1,l=!1;if(3===n.type){var h=n.value;this.nextToken(),a=this.match("["),i=(l=!(this.hasLineTerminator||"async"!==h||this.match(":")||this.match("(")||this.match("*")||this.match(",")))?this.parseObjectPropertyKey():this.finalize(r,new s.Identifier(h))}else this.match("*")?this.nextToken():(a=this.match("["),i=this.parseObjectPropertyKey());var g=this.qualifiedPropertyName(this.lookahead);if(3===n.type&&!l&&"get"===n.value&&g)t="get",a=this.match("["),i=this.parseObjectPropertyKey(),this.context.allowYield=!1,A=this.parseGetterMethod();else if(3===n.type&&!l&&"set"===n.value&&g)t="set",a=this.match("["),i=this.parseObjectPropertyKey(),A=this.parseSetterMethod();else if(7===n.type&&"*"===n.value&&g)t="init",a=this.match("["),i=this.parseObjectPropertyKey(),A=this.parseGeneratorMethod(),c=!0;else if(i||this.throwUnexpectedToken(this.lookahead),t="init",this.match(":")&&!l)!a&&this.isPropertyKey(i,"__proto__")&&(e.value&&this.tolerateError(o.Messages.DuplicateProtoProperty),e.value=!0),this.nextToken(),A=this.inheritCoverGrammar(this.parseAssignmentExpression);else if(this.match("("))A=l?this.parsePropertyMethodAsyncFunction():this.parsePropertyMethodFunction(),c=!0;else if(3===n.type)if(h=this.finalize(r,new s.Identifier(n.value)),this.match("=")){this.context.firstCoverInitializedNameError=this.lookahead,this.nextToken(),u=!0;var f=this.isolateCoverGrammar(this.parseAssignmentExpression);A=this.finalize(r,new s.AssignmentPattern(h,f))}else u=!0,A=h;else this.throwUnexpectedToken(this.nextToken());return this.finalize(r,new s.Property(t,i,a,A,c,u))},e.prototype.parseObjectInitializer=function(){var e=this.createNode();this.expect("{");for(var t=[],r={value:!1};!this.match("}");)t.push(this.parseObjectProperty(r)),this.match("}")||this.expectCommaSeparator();return this.expect("}"),this.finalize(e,new s.ObjectExpression(t))},e.prototype.parseTemplateHead=function(){n.assert(this.lookahead.head,"Template literal must start with a template head");var e=this.createNode(),t=this.nextToken(),r=t.value,i=t.cooked;return this.finalize(e,new s.TemplateElement({raw:r,cooked:i},t.tail))},e.prototype.parseTemplateElement=function(){10!==this.lookahead.type&&this.throwUnexpectedToken();var e=this.createNode(),t=this.nextToken(),r=t.value,n=t.cooked;return this.finalize(e,new s.TemplateElement({raw:r,cooked:n},t.tail))},e.prototype.parseTemplateLiteral=function(){var e=this.createNode(),t=[],r=[],n=this.parseTemplateHead();for(r.push(n);!n.tail;)t.push(this.parseExpression()),n=this.parseTemplateElement(),r.push(n);return this.finalize(e,new s.TemplateLiteral(r,t))},e.prototype.reinterpretExpressionAsPattern=function(e){switch(e.type){case a.Syntax.Identifier:case a.Syntax.MemberExpression:case a.Syntax.RestElement:case a.Syntax.AssignmentPattern:break;case a.Syntax.SpreadElement:e.type=a.Syntax.RestElement,this.reinterpretExpressionAsPattern(e.argument);break;case a.Syntax.ArrayExpression:e.type=a.Syntax.ArrayPattern;for(var t=0;t")||this.expect("=>"),e={type:"ArrowParameterPlaceHolder",params:[],async:!1};else{var t=this.lookahead,r=[];if(this.match("..."))e=this.parseRestElement(r),this.expect(")"),this.match("=>")||this.expect("=>"),e={type:"ArrowParameterPlaceHolder",params:[e],async:!1};else{var n=!1;if(this.context.isBindingElement=!0,e=this.inheritCoverGrammar(this.parseAssignmentExpression),this.match(",")){var i=[];for(this.context.isAssignmentTarget=!1,i.push(e);2!==this.lookahead.type&&this.match(",");){if(this.nextToken(),this.match(")")){this.nextToken();for(var o=0;o")||this.expect("=>"),this.context.isBindingElement=!1,o=0;o")&&(e.type===a.Syntax.Identifier&&"yield"===e.name&&(n=!0,e={type:"ArrowParameterPlaceHolder",params:[e],async:!1}),!n)){if(this.context.isBindingElement||this.throwUnexpectedToken(this.lookahead),e.type===a.Syntax.SequenceExpression)for(o=0;o")){for(var a=0;a0){this.nextToken(),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1;for(var i=[e,this.lookahead],o=t,A=this.isolateCoverGrammar(this.parseExponentiationExpression),a=[o,r.value,A],c=[n];!((n=this.binaryPrecedence(this.lookahead))<=0);){for(;a.length>2&&n<=c[c.length-1];){A=a.pop();var u=a.pop();c.pop(),o=a.pop(),i.pop();var l=this.startNode(i[i.length-1]);a.push(this.finalize(l,new s.BinaryExpression(u,o,A)))}a.push(this.nextToken().value),c.push(n),i.push(this.lookahead),a.push(this.isolateCoverGrammar(this.parseExponentiationExpression))}var h=a.length-1;t=a[h];for(var g=i.pop();h>1;){var f=i.pop(),p=g&&g.lineStart;l=this.startNode(f,p),u=a[h-1],t=this.finalize(l,new s.BinaryExpression(u,a[h-2],t)),h-=2,g=f}}return t},e.prototype.parseConditionalExpression=function(){var e=this.lookahead,t=this.inheritCoverGrammar(this.parseBinaryExpression);if(this.match("?")){this.nextToken();var r=this.context.allowIn;this.context.allowIn=!0;var n=this.isolateCoverGrammar(this.parseAssignmentExpression);this.context.allowIn=r,this.expect(":");var i=this.isolateCoverGrammar(this.parseAssignmentExpression);t=this.finalize(this.startNode(e),new s.ConditionalExpression(t,n,i)),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1}return t},e.prototype.checkPatternParam=function(e,t){switch(t.type){case a.Syntax.Identifier:this.validateParam(e,t,t.name);break;case a.Syntax.RestElement:this.checkPatternParam(e,t.argument);break;case a.Syntax.AssignmentPattern:this.checkPatternParam(e,t.left);break;case a.Syntax.ArrayPattern:for(var r=0;r")){this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1;var i=e.async,A=this.reinterpretAsCoverFormalsList(e);if(A){this.hasLineTerminator&&this.tolerateUnexpectedToken(this.lookahead),this.context.firstCoverInitializedNameError=null;var c=this.context.strict,u=this.context.allowStrictDirective;this.context.allowStrictDirective=A.simple;var l=this.context.allowYield,h=this.context.await;this.context.allowYield=!0,this.context.await=i;var g=this.startNode(t);this.expect("=>");var f=void 0;if(this.match("{")){var p=this.context.allowIn;this.context.allowIn=!0,f=this.parseFunctionSourceElements(),this.context.allowIn=p}else f=this.isolateCoverGrammar(this.parseAssignmentExpression);var d=f.type!==a.Syntax.BlockStatement;this.context.strict&&A.firstRestricted&&this.throwUnexpectedToken(A.firstRestricted,A.message),this.context.strict&&A.stricted&&this.tolerateUnexpectedToken(A.stricted,A.message),e=i?this.finalize(g,new s.AsyncArrowFunctionExpression(A.params,f,d)):this.finalize(g,new s.ArrowFunctionExpression(A.params,f,d)),this.context.strict=c,this.context.allowStrictDirective=u,this.context.allowYield=l,this.context.await=h}}else if(this.matchAssign()){if(this.context.isAssignmentTarget||this.tolerateError(o.Messages.InvalidLHSInAssignment),this.context.strict&&e.type===a.Syntax.Identifier){var C=e;this.scanner.isRestrictedWord(C.name)&&this.tolerateUnexpectedToken(r,o.Messages.StrictLHSAssignment),this.scanner.isStrictModeReservedWord(C.name)&&this.tolerateUnexpectedToken(r,o.Messages.StrictReservedWord)}this.match("=")?this.reinterpretExpressionAsPattern(e):(this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1);var E=(r=this.nextToken()).value,I=this.isolateCoverGrammar(this.parseAssignmentExpression);e=this.finalize(this.startNode(t),new s.AssignmentExpression(E,e,I)),this.context.firstCoverInitializedNameError=null}}return e},e.prototype.parseExpression=function(){var e=this.lookahead,t=this.isolateCoverGrammar(this.parseAssignmentExpression);if(this.match(",")){var r=[];for(r.push(t);2!==this.lookahead.type&&this.match(",");)this.nextToken(),r.push(this.isolateCoverGrammar(this.parseAssignmentExpression));t=this.finalize(this.startNode(e),new s.SequenceExpression(r))}return t},e.prototype.parseStatementListItem=function(){var e;if(this.context.isAssignmentTarget=!0,this.context.isBindingElement=!0,4===this.lookahead.type)switch(this.lookahead.value){case"export":this.context.isModule||this.tolerateUnexpectedToken(this.lookahead,o.Messages.IllegalExportDeclaration),e=this.parseExportDeclaration();break;case"import":this.context.isModule||this.tolerateUnexpectedToken(this.lookahead,o.Messages.IllegalImportDeclaration),e=this.parseImportDeclaration();break;case"const":e=this.parseLexicalDeclaration({inFor:!1});break;case"function":e=this.parseFunctionDeclaration();break;case"class":e=this.parseClassDeclaration();break;case"let":e=this.isLexicalDeclaration()?this.parseLexicalDeclaration({inFor:!1}):this.parseStatement();break;default:e=this.parseStatement()}else e=this.parseStatement();return e},e.prototype.parseBlock=function(){var e=this.createNode();this.expect("{");for(var t=[];!this.match("}");)t.push(this.parseStatementListItem());return this.expect("}"),this.finalize(e,new s.BlockStatement(t))},e.prototype.parseLexicalBinding=function(e,t){var r=this.createNode(),n=this.parsePattern([],e);this.context.strict&&n.type===a.Syntax.Identifier&&this.scanner.isRestrictedWord(n.name)&&this.tolerateError(o.Messages.StrictVarName);var i=null;return"const"===e?this.matchKeyword("in")||this.matchContextualKeyword("of")||(this.match("=")?(this.nextToken(),i=this.isolateCoverGrammar(this.parseAssignmentExpression)):this.throwError(o.Messages.DeclarationMissingInitializer,"const")):(!t.inFor&&n.type!==a.Syntax.Identifier||this.match("="))&&(this.expect("="),i=this.isolateCoverGrammar(this.parseAssignmentExpression)),this.finalize(r,new s.VariableDeclarator(n,i))},e.prototype.parseBindingList=function(e,t){for(var r=[this.parseLexicalBinding(e,t)];this.match(",");)this.nextToken(),r.push(this.parseLexicalBinding(e,t));return r},e.prototype.isLexicalDeclaration=function(){var e=this.scanner.saveState();this.scanner.scanComments();var t=this.scanner.lex();return this.scanner.restoreState(e),3===t.type||7===t.type&&"["===t.value||7===t.type&&"{"===t.value||4===t.type&&"let"===t.value||4===t.type&&"yield"===t.value},e.prototype.parseLexicalDeclaration=function(e){var t=this.createNode(),r=this.nextToken().value;n.assert("let"===r||"const"===r,"Lexical declaration must be either let or const");var i=this.parseBindingList(r,e);return this.consumeSemicolon(),this.finalize(t,new s.VariableDeclaration(i,r))},e.prototype.parseBindingRestElement=function(e,t){var r=this.createNode();this.expect("...");var n=this.parsePattern(e,t);return this.finalize(r,new s.RestElement(n))},e.prototype.parseArrayPattern=function(e,t){var r=this.createNode();this.expect("[");for(var n=[];!this.match("]");)if(this.match(","))this.nextToken(),n.push(null);else{if(this.match("...")){n.push(this.parseBindingRestElement(e,t));break}n.push(this.parsePatternWithDefault(e,t)),this.match("]")||this.expect(",")}return this.expect("]"),this.finalize(r,new s.ArrayPattern(n))},e.prototype.parsePropertyPattern=function(e,t){var r,n,i=this.createNode(),o=!1,A=!1;if(3===this.lookahead.type){var a=this.lookahead;r=this.parseVariableIdentifier();var c=this.finalize(i,new s.Identifier(a.value));if(this.match("=")){e.push(a),A=!0,this.nextToken();var u=this.parseAssignmentExpression();n=this.finalize(this.startNode(a),new s.AssignmentPattern(c,u))}else this.match(":")?(this.expect(":"),n=this.parsePatternWithDefault(e,t)):(e.push(a),A=!0,n=c)}else o=this.match("["),r=this.parseObjectPropertyKey(),this.expect(":"),n=this.parsePatternWithDefault(e,t);return this.finalize(i,new s.Property("init",r,o,n,!1,A))},e.prototype.parseObjectPattern=function(e,t){var r=this.createNode(),n=[];for(this.expect("{");!this.match("}");)n.push(this.parsePropertyPattern(e,t)),this.match("}")||this.expect(",");return this.expect("}"),this.finalize(r,new s.ObjectPattern(n))},e.prototype.parsePattern=function(e,t){var r;return this.match("[")?r=this.parseArrayPattern(e,t):this.match("{")?r=this.parseObjectPattern(e,t):(!this.matchKeyword("let")||"const"!==t&&"let"!==t||this.tolerateUnexpectedToken(this.lookahead,o.Messages.LetInLexicalBinding),e.push(this.lookahead),r=this.parseVariableIdentifier(t)),r},e.prototype.parsePatternWithDefault=function(e,t){var r=this.lookahead,n=this.parsePattern(e,t);if(this.match("=")){this.nextToken();var i=this.context.allowYield;this.context.allowYield=!0;var o=this.isolateCoverGrammar(this.parseAssignmentExpression);this.context.allowYield=i,n=this.finalize(this.startNode(r),new s.AssignmentPattern(n,o))}return n},e.prototype.parseVariableIdentifier=function(e){var t=this.createNode(),r=this.nextToken();return 4===r.type&&"yield"===r.value?this.context.strict?this.tolerateUnexpectedToken(r,o.Messages.StrictReservedWord):this.context.allowYield||this.throwUnexpectedToken(r):3!==r.type?this.context.strict&&4===r.type&&this.scanner.isStrictModeReservedWord(r.value)?this.tolerateUnexpectedToken(r,o.Messages.StrictReservedWord):(this.context.strict||"let"!==r.value||"var"!==e)&&this.throwUnexpectedToken(r):(this.context.isModule||this.context.await)&&3===r.type&&"await"===r.value&&this.tolerateUnexpectedToken(r),this.finalize(t,new s.Identifier(r.value))},e.prototype.parseVariableDeclaration=function(e){var t=this.createNode(),r=this.parsePattern([],"var");this.context.strict&&r.type===a.Syntax.Identifier&&this.scanner.isRestrictedWord(r.name)&&this.tolerateError(o.Messages.StrictVarName);var n=null;return this.match("=")?(this.nextToken(),n=this.isolateCoverGrammar(this.parseAssignmentExpression)):r.type===a.Syntax.Identifier||e.inFor||this.expect("="),this.finalize(t,new s.VariableDeclarator(r,n))},e.prototype.parseVariableDeclarationList=function(e){var t={inFor:e.inFor},r=[];for(r.push(this.parseVariableDeclaration(t));this.match(",");)this.nextToken(),r.push(this.parseVariableDeclaration(t));return r},e.prototype.parseVariableStatement=function(){var e=this.createNode();this.expectKeyword("var");var t=this.parseVariableDeclarationList({inFor:!1});return this.consumeSemicolon(),this.finalize(e,new s.VariableDeclaration(t,"var"))},e.prototype.parseEmptyStatement=function(){var e=this.createNode();return this.expect(";"),this.finalize(e,new s.EmptyStatement)},e.prototype.parseExpressionStatement=function(){var e=this.createNode(),t=this.parseExpression();return this.consumeSemicolon(),this.finalize(e,new s.ExpressionStatement(t))},e.prototype.parseIfClause=function(){return this.context.strict&&this.matchKeyword("function")&&this.tolerateError(o.Messages.StrictFunction),this.parseStatement()},e.prototype.parseIfStatement=function(){var e,t=this.createNode(),r=null;this.expectKeyword("if"),this.expect("(");var n=this.parseExpression();return!this.match(")")&&this.config.tolerant?(this.tolerateUnexpectedToken(this.nextToken()),e=this.finalize(this.createNode(),new s.EmptyStatement)):(this.expect(")"),e=this.parseIfClause(),this.matchKeyword("else")&&(this.nextToken(),r=this.parseIfClause())),this.finalize(t,new s.IfStatement(n,e,r))},e.prototype.parseDoWhileStatement=function(){var e=this.createNode();this.expectKeyword("do");var t=this.context.inIteration;this.context.inIteration=!0;var r=this.parseStatement();this.context.inIteration=t,this.expectKeyword("while"),this.expect("(");var n=this.parseExpression();return!this.match(")")&&this.config.tolerant?this.tolerateUnexpectedToken(this.nextToken()):(this.expect(")"),this.match(";")&&this.nextToken()),this.finalize(e,new s.DoWhileStatement(r,n))},e.prototype.parseWhileStatement=function(){var e,t=this.createNode();this.expectKeyword("while"),this.expect("(");var r=this.parseExpression();if(!this.match(")")&&this.config.tolerant)this.tolerateUnexpectedToken(this.nextToken()),e=this.finalize(this.createNode(),new s.EmptyStatement);else{this.expect(")");var n=this.context.inIteration;this.context.inIteration=!0,e=this.parseStatement(),this.context.inIteration=n}return this.finalize(t,new s.WhileStatement(r,e))},e.prototype.parseForStatement=function(){var e,t,r,n=null,i=null,A=null,c=!0,u=this.createNode();if(this.expectKeyword("for"),this.expect("("),this.match(";"))this.nextToken();else if(this.matchKeyword("var")){n=this.createNode(),this.nextToken();var l=this.context.allowIn;this.context.allowIn=!1;var h=this.parseVariableDeclarationList({inFor:!0});if(this.context.allowIn=l,1===h.length&&this.matchKeyword("in")){var g=h[0];g.init&&(g.id.type===a.Syntax.ArrayPattern||g.id.type===a.Syntax.ObjectPattern||this.context.strict)&&this.tolerateError(o.Messages.ForInOfLoopInitializer,"for-in"),n=this.finalize(n,new s.VariableDeclaration(h,"var")),this.nextToken(),e=n,t=this.parseExpression(),n=null}else 1===h.length&&null===h[0].init&&this.matchContextualKeyword("of")?(n=this.finalize(n,new s.VariableDeclaration(h,"var")),this.nextToken(),e=n,t=this.parseAssignmentExpression(),n=null,c=!1):(n=this.finalize(n,new s.VariableDeclaration(h,"var")),this.expect(";"))}else if(this.matchKeyword("const")||this.matchKeyword("let")){n=this.createNode();var f=this.nextToken().value;this.context.strict||"in"!==this.lookahead.value?(l=this.context.allowIn,this.context.allowIn=!1,h=this.parseBindingList(f,{inFor:!0}),this.context.allowIn=l,1===h.length&&null===h[0].init&&this.matchKeyword("in")?(n=this.finalize(n,new s.VariableDeclaration(h,f)),this.nextToken(),e=n,t=this.parseExpression(),n=null):1===h.length&&null===h[0].init&&this.matchContextualKeyword("of")?(n=this.finalize(n,new s.VariableDeclaration(h,f)),this.nextToken(),e=n,t=this.parseAssignmentExpression(),n=null,c=!1):(this.consumeSemicolon(),n=this.finalize(n,new s.VariableDeclaration(h,f)))):(n=this.finalize(n,new s.Identifier(f)),this.nextToken(),e=n,t=this.parseExpression(),n=null)}else{var p=this.lookahead;if(l=this.context.allowIn,this.context.allowIn=!1,n=this.inheritCoverGrammar(this.parseAssignmentExpression),this.context.allowIn=l,this.matchKeyword("in"))this.context.isAssignmentTarget&&n.type!==a.Syntax.AssignmentExpression||this.tolerateError(o.Messages.InvalidLHSInForIn),this.nextToken(),this.reinterpretExpressionAsPattern(n),e=n,t=this.parseExpression(),n=null;else if(this.matchContextualKeyword("of"))this.context.isAssignmentTarget&&n.type!==a.Syntax.AssignmentExpression||this.tolerateError(o.Messages.InvalidLHSInForLoop),this.nextToken(),this.reinterpretExpressionAsPattern(n),e=n,t=this.parseAssignmentExpression(),n=null,c=!1;else{if(this.match(",")){for(var d=[n];this.match(",");)this.nextToken(),d.push(this.isolateCoverGrammar(this.parseAssignmentExpression));n=this.finalize(this.startNode(p),new s.SequenceExpression(d))}this.expect(";")}}if(void 0===e&&(this.match(";")||(i=this.parseExpression()),this.expect(";"),this.match(")")||(A=this.parseExpression())),!this.match(")")&&this.config.tolerant)this.tolerateUnexpectedToken(this.nextToken()),r=this.finalize(this.createNode(),new s.EmptyStatement);else{this.expect(")");var C=this.context.inIteration;this.context.inIteration=!0,r=this.isolateCoverGrammar(this.parseStatement),this.context.inIteration=C}return void 0===e?this.finalize(u,new s.ForStatement(n,i,A,r)):c?this.finalize(u,new s.ForInStatement(e,t,r)):this.finalize(u,new s.ForOfStatement(e,t,r))},e.prototype.parseContinueStatement=function(){var e=this.createNode();this.expectKeyword("continue");var t=null;if(3===this.lookahead.type&&!this.hasLineTerminator){var r=this.parseVariableIdentifier();t=r;var n="$"+r.name;Object.prototype.hasOwnProperty.call(this.context.labelSet,n)||this.throwError(o.Messages.UnknownLabel,r.name)}return this.consumeSemicolon(),null!==t||this.context.inIteration||this.throwError(o.Messages.IllegalContinue),this.finalize(e,new s.ContinueStatement(t))},e.prototype.parseBreakStatement=function(){var e=this.createNode();this.expectKeyword("break");var t=null;if(3===this.lookahead.type&&!this.hasLineTerminator){var r=this.parseVariableIdentifier(),n="$"+r.name;Object.prototype.hasOwnProperty.call(this.context.labelSet,n)||this.throwError(o.Messages.UnknownLabel,r.name),t=r}return this.consumeSemicolon(),null!==t||this.context.inIteration||this.context.inSwitch||this.throwError(o.Messages.IllegalBreak),this.finalize(e,new s.BreakStatement(t))},e.prototype.parseReturnStatement=function(){this.context.inFunctionBody||this.tolerateError(o.Messages.IllegalReturn);var e=this.createNode();this.expectKeyword("return");var t=(this.match(";")||this.match("}")||this.hasLineTerminator||2===this.lookahead.type)&&8!==this.lookahead.type&&10!==this.lookahead.type?null:this.parseExpression();return this.consumeSemicolon(),this.finalize(e,new s.ReturnStatement(t))},e.prototype.parseWithStatement=function(){this.context.strict&&this.tolerateError(o.Messages.StrictModeWith);var e,t=this.createNode();this.expectKeyword("with"),this.expect("(");var r=this.parseExpression();return!this.match(")")&&this.config.tolerant?(this.tolerateUnexpectedToken(this.nextToken()),e=this.finalize(this.createNode(),new s.EmptyStatement)):(this.expect(")"),e=this.parseStatement()),this.finalize(t,new s.WithStatement(r,e))},e.prototype.parseSwitchCase=function(){var e,t=this.createNode();this.matchKeyword("default")?(this.nextToken(),e=null):(this.expectKeyword("case"),e=this.parseExpression()),this.expect(":");for(var r=[];!(this.match("}")||this.matchKeyword("default")||this.matchKeyword("case"));)r.push(this.parseStatementListItem());return this.finalize(t,new s.SwitchCase(e,r))},e.prototype.parseSwitchStatement=function(){var e=this.createNode();this.expectKeyword("switch"),this.expect("(");var t=this.parseExpression();this.expect(")");var r=this.context.inSwitch;this.context.inSwitch=!0;var n=[],i=!1;for(this.expect("{");!this.match("}");){var A=this.parseSwitchCase();null===A.test&&(i&&this.throwError(o.Messages.MultipleDefaultsInSwitch),i=!0),n.push(A)}return this.expect("}"),this.context.inSwitch=r,this.finalize(e,new s.SwitchStatement(t,n))},e.prototype.parseLabelledStatement=function(){var e,t=this.createNode(),r=this.parseExpression();if(r.type===a.Syntax.Identifier&&this.match(":")){this.nextToken();var n=r,i="$"+n.name;Object.prototype.hasOwnProperty.call(this.context.labelSet,i)&&this.throwError(o.Messages.Redeclaration,"Label",n.name),this.context.labelSet[i]=!0;var A=void 0;if(this.matchKeyword("class"))this.tolerateUnexpectedToken(this.lookahead),A=this.parseClassDeclaration();else if(this.matchKeyword("function")){var c=this.lookahead,u=this.parseFunctionDeclaration();this.context.strict?this.tolerateUnexpectedToken(c,o.Messages.StrictFunction):u.generator&&this.tolerateUnexpectedToken(c,o.Messages.GeneratorInLegacyContext),A=u}else A=this.parseStatement();delete this.context.labelSet[i],e=new s.LabeledStatement(n,A)}else this.consumeSemicolon(),e=new s.ExpressionStatement(r);return this.finalize(t,e)},e.prototype.parseThrowStatement=function(){var e=this.createNode();this.expectKeyword("throw"),this.hasLineTerminator&&this.throwError(o.Messages.NewlineAfterThrow);var t=this.parseExpression();return this.consumeSemicolon(),this.finalize(e,new s.ThrowStatement(t))},e.prototype.parseCatchClause=function(){var e=this.createNode();this.expectKeyword("catch"),this.expect("("),this.match(")")&&this.throwUnexpectedToken(this.lookahead);for(var t=[],r=this.parsePattern(t),n={},i=0;i0&&this.tolerateError(o.Messages.BadGetterArity);var n=this.parsePropertyMethod(r);return this.context.allowYield=t,this.finalize(e,new s.FunctionExpression(null,r.params,n,!1))},e.prototype.parseSetterMethod=function(){var e=this.createNode(),t=this.context.allowYield;this.context.allowYield=!0;var r=this.parseFormalParameters();1!==r.params.length?this.tolerateError(o.Messages.BadSetterArity):r.params[0]instanceof s.RestElement&&this.tolerateError(o.Messages.BadSetterRestParameter);var n=this.parsePropertyMethod(r);return this.context.allowYield=t,this.finalize(e,new s.FunctionExpression(null,r.params,n,!1))},e.prototype.parseGeneratorMethod=function(){var e=this.createNode(),t=this.context.allowYield;this.context.allowYield=!0;var r=this.parseFormalParameters();this.context.allowYield=!1;var n=this.parsePropertyMethod(r);return this.context.allowYield=t,this.finalize(e,new s.FunctionExpression(null,r.params,n,!0))},e.prototype.isStartOfExpression=function(){var e=!0,t=this.lookahead.value;switch(this.lookahead.type){case 7:e="["===t||"("===t||"{"===t||"+"===t||"-"===t||"!"===t||"~"===t||"++"===t||"--"===t||"/"===t||"/="===t;break;case 4:e="class"===t||"delete"===t||"function"===t||"let"===t||"new"===t||"super"===t||"this"===t||"typeof"===t||"void"===t||"yield"===t}return e},e.prototype.parseYieldExpression=function(){var e=this.createNode();this.expectKeyword("yield");var t=null,r=!1;if(!this.hasLineTerminator){var n=this.context.allowYield;this.context.allowYield=!1,(r=this.match("*"))?(this.nextToken(),t=this.parseAssignmentExpression()):this.isStartOfExpression()&&(t=this.parseAssignmentExpression()),this.context.allowYield=n}return this.finalize(e,new s.YieldExpression(t,r))},e.prototype.parseClassElement=function(e){var t=this.lookahead,r=this.createNode(),n="",i=null,A=null,a=!1,c=!1,u=!1,l=!1;if(this.match("*"))this.nextToken();else if(a=this.match("["),"static"===(i=this.parseObjectPropertyKey()).name&&(this.qualifiedPropertyName(this.lookahead)||this.match("*"))&&(t=this.lookahead,u=!0,a=this.match("["),this.match("*")?this.nextToken():i=this.parseObjectPropertyKey()),3===t.type&&!this.hasLineTerminator&&"async"===t.value){var h=this.lookahead.value;":"!==h&&"("!==h&&"*"!==h&&(l=!0,t=this.lookahead,i=this.parseObjectPropertyKey(),3===t.type&&"constructor"===t.value&&this.tolerateUnexpectedToken(t,o.Messages.ConstructorIsAsync))}var g=this.qualifiedPropertyName(this.lookahead);return 3===t.type?"get"===t.value&&g?(n="get",a=this.match("["),i=this.parseObjectPropertyKey(),this.context.allowYield=!1,A=this.parseGetterMethod()):"set"===t.value&&g&&(n="set",a=this.match("["),i=this.parseObjectPropertyKey(),A=this.parseSetterMethod()):7===t.type&&"*"===t.value&&g&&(n="init",a=this.match("["),i=this.parseObjectPropertyKey(),A=this.parseGeneratorMethod(),c=!0),!n&&i&&this.match("(")&&(n="init",A=l?this.parsePropertyMethodAsyncFunction():this.parsePropertyMethodFunction(),c=!0),n||this.throwUnexpectedToken(this.lookahead),"init"===n&&(n="method"),a||(u&&this.isPropertyKey(i,"prototype")&&this.throwUnexpectedToken(t,o.Messages.StaticPrototype),!u&&this.isPropertyKey(i,"constructor")&&(("method"!==n||!c||A&&A.generator)&&this.throwUnexpectedToken(t,o.Messages.ConstructorSpecialMethod),e.value?this.throwUnexpectedToken(t,o.Messages.DuplicateConstructor):e.value=!0,n="constructor")),this.finalize(r,new s.MethodDefinition(i,a,A,n,u))},e.prototype.parseClassElementList=function(){var e=[],t={value:!1};for(this.expect("{");!this.match("}");)this.match(";")?this.nextToken():e.push(this.parseClassElement(t));return this.expect("}"),e},e.prototype.parseClassBody=function(){var e=this.createNode(),t=this.parseClassElementList();return this.finalize(e,new s.ClassBody(t))},e.prototype.parseClassDeclaration=function(e){var t=this.createNode(),r=this.context.strict;this.context.strict=!0,this.expectKeyword("class");var n=e&&3!==this.lookahead.type?null:this.parseVariableIdentifier(),i=null;this.matchKeyword("extends")&&(this.nextToken(),i=this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall));var o=this.parseClassBody();return this.context.strict=r,this.finalize(t,new s.ClassDeclaration(n,i,o))},e.prototype.parseClassExpression=function(){var e=this.createNode(),t=this.context.strict;this.context.strict=!0,this.expectKeyword("class");var r=3===this.lookahead.type?this.parseVariableIdentifier():null,n=null;this.matchKeyword("extends")&&(this.nextToken(),n=this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall));var i=this.parseClassBody();return this.context.strict=t,this.finalize(e,new s.ClassExpression(r,n,i))},e.prototype.parseModule=function(){this.context.strict=!0,this.context.isModule=!0,this.scanner.isModule=!0;for(var e=this.createNode(),t=this.parseDirectivePrologues();2!==this.lookahead.type;)t.push(this.parseStatementListItem());return this.finalize(e,new s.Module(t))},e.prototype.parseScript=function(){for(var e=this.createNode(),t=this.parseDirectivePrologues();2!==this.lookahead.type;)t.push(this.parseStatementListItem());return this.finalize(e,new s.Script(t))},e.prototype.parseModuleSpecifier=function(){var e=this.createNode();8!==this.lookahead.type&&this.throwError(o.Messages.InvalidModuleSpecifier);var t=this.nextToken(),r=this.getTokenRaw(t);return this.finalize(e,new s.Literal(t.value,r))},e.prototype.parseImportSpecifier=function(){var e,t,r=this.createNode();return 3===this.lookahead.type?(t=e=this.parseVariableIdentifier(),this.matchContextualKeyword("as")&&(this.nextToken(),t=this.parseVariableIdentifier())):(t=e=this.parseIdentifierName(),this.matchContextualKeyword("as")?(this.nextToken(),t=this.parseVariableIdentifier()):this.throwUnexpectedToken(this.nextToken())),this.finalize(r,new s.ImportSpecifier(t,e))},e.prototype.parseNamedImports=function(){this.expect("{");for(var e=[];!this.match("}");)e.push(this.parseImportSpecifier()),this.match("}")||this.expect(",");return this.expect("}"),e},e.prototype.parseImportDefaultSpecifier=function(){var e=this.createNode(),t=this.parseIdentifierName();return this.finalize(e,new s.ImportDefaultSpecifier(t))},e.prototype.parseImportNamespaceSpecifier=function(){var e=this.createNode();this.expect("*"),this.matchContextualKeyword("as")||this.throwError(o.Messages.NoAsAfterImportNamespace),this.nextToken();var t=this.parseIdentifierName();return this.finalize(e,new s.ImportNamespaceSpecifier(t))},e.prototype.parseImportDeclaration=function(){this.context.inFunctionBody&&this.throwError(o.Messages.IllegalImportDeclaration);var e,t=this.createNode();this.expectKeyword("import");var r=[];if(8===this.lookahead.type)e=this.parseModuleSpecifier();else{if(this.match("{")?r=r.concat(this.parseNamedImports()):this.match("*")?r.push(this.parseImportNamespaceSpecifier()):this.isIdentifierName(this.lookahead)&&!this.matchKeyword("default")?(r.push(this.parseImportDefaultSpecifier()),this.match(",")&&(this.nextToken(),this.match("*")?r.push(this.parseImportNamespaceSpecifier()):this.match("{")?r=r.concat(this.parseNamedImports()):this.throwUnexpectedToken(this.lookahead))):this.throwUnexpectedToken(this.nextToken()),!this.matchContextualKeyword("from")){var n=this.lookahead.value?o.Messages.UnexpectedToken:o.Messages.MissingFromClause;this.throwError(n,this.lookahead.value)}this.nextToken(),e=this.parseModuleSpecifier()}return this.consumeSemicolon(),this.finalize(t,new s.ImportDeclaration(r,e))},e.prototype.parseExportSpecifier=function(){var e=this.createNode(),t=this.parseIdentifierName(),r=t;return this.matchContextualKeyword("as")&&(this.nextToken(),r=this.parseIdentifierName()),this.finalize(e,new s.ExportSpecifier(t,r))},e.prototype.parseExportDeclaration=function(){this.context.inFunctionBody&&this.throwError(o.Messages.IllegalExportDeclaration);var e,t=this.createNode();if(this.expectKeyword("export"),this.matchKeyword("default"))if(this.nextToken(),this.matchKeyword("function")){var r=this.parseFunctionDeclaration(!0);e=this.finalize(t,new s.ExportDefaultDeclaration(r))}else this.matchKeyword("class")?(r=this.parseClassDeclaration(!0),e=this.finalize(t,new s.ExportDefaultDeclaration(r))):this.matchContextualKeyword("async")?(r=this.matchAsyncFunction()?this.parseFunctionDeclaration(!0):this.parseAssignmentExpression(),e=this.finalize(t,new s.ExportDefaultDeclaration(r))):(this.matchContextualKeyword("from")&&this.throwError(o.Messages.UnexpectedToken,this.lookahead.value),r=this.match("{")?this.parseObjectInitializer():this.match("[")?this.parseArrayInitializer():this.parseAssignmentExpression(),this.consumeSemicolon(),e=this.finalize(t,new s.ExportDefaultDeclaration(r)));else if(this.match("*")){if(this.nextToken(),!this.matchContextualKeyword("from")){var n=this.lookahead.value?o.Messages.UnexpectedToken:o.Messages.MissingFromClause;this.throwError(n,this.lookahead.value)}this.nextToken();var i=this.parseModuleSpecifier();this.consumeSemicolon(),e=this.finalize(t,new s.ExportAllDeclaration(i))}else if(4===this.lookahead.type){switch(r=void 0,this.lookahead.value){case"let":case"const":r=this.parseLexicalDeclaration({inFor:!1});break;case"var":case"class":case"function":r=this.parseStatementListItem();break;default:this.throwUnexpectedToken(this.lookahead)}e=this.finalize(t,new s.ExportNamedDeclaration(r,[],null))}else if(this.matchAsyncFunction())r=this.parseFunctionDeclaration(),e=this.finalize(t,new s.ExportNamedDeclaration(r,[],null));else{var A=[],a=null,c=!1;for(this.expect("{");!this.match("}");)c=c||this.matchKeyword("default"),A.push(this.parseExportSpecifier()),this.match("}")||this.expect(",");this.expect("}"),this.matchContextualKeyword("from")?(this.nextToken(),a=this.parseModuleSpecifier(),this.consumeSemicolon()):c?(n=this.lookahead.value?o.Messages.UnexpectedToken:o.Messages.MissingFromClause,this.throwError(n,this.lookahead.value)):this.consumeSemicolon(),e=this.finalize(t,new s.ExportNamedDeclaration(null,A,a))}return e},e}();t.Parser=u},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.assert=function(e,t){if(!e)throw new Error("ASSERT: "+t)}},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){this.errors=[],this.tolerant=!1}return e.prototype.recordError=function(e){this.errors.push(e)},e.prototype.tolerate=function(e){if(!this.tolerant)throw e;this.recordError(e)},e.prototype.constructError=function(e,t){var r=new Error(e);try{throw r}catch(e){Object.create&&Object.defineProperty&&(r=Object.create(e),Object.defineProperty(r,"column",{value:t}))}return r},e.prototype.createError=function(e,t,r,n){var i="Line "+t+": "+n,o=this.constructError(i,r);return o.index=e,o.lineNumber=t,o.description=n,o},e.prototype.throwError=function(e,t,r,n){throw this.createError(e,t,r,n)},e.prototype.tolerateError=function(e,t,r,n){var i=this.createError(e,t,r,n);if(!this.tolerant)throw i;this.recordError(i)},e}();t.ErrorHandler=r},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Messages={BadGetterArity:"Getter must not have any formal parameters",BadSetterArity:"Setter must have exactly one formal parameter",BadSetterRestParameter:"Setter function argument must not be a rest parameter",ConstructorIsAsync:"Class constructor may not be an async method",ConstructorSpecialMethod:"Class constructor may not be an accessor",DeclarationMissingInitializer:"Missing initializer in %0 declaration",DefaultRestParameter:"Unexpected token =",DuplicateBinding:"Duplicate binding %0",DuplicateConstructor:"A class may only have one constructor",DuplicateProtoProperty:"Duplicate __proto__ fields are not allowed in object literals",ForInOfLoopInitializer:"%0 loop variable declaration may not have an initializer",GeneratorInLegacyContext:"Generator declarations are not allowed in legacy contexts",IllegalBreak:"Illegal break statement",IllegalContinue:"Illegal continue statement",IllegalExportDeclaration:"Unexpected token",IllegalImportDeclaration:"Unexpected token",IllegalLanguageModeDirective:"Illegal 'use strict' directive in function with non-simple parameter list",IllegalReturn:"Illegal return statement",InvalidEscapedReservedWord:"Keyword must not contain escaped characters",InvalidHexEscapeSequence:"Invalid hexadecimal escape sequence",InvalidLHSInAssignment:"Invalid left-hand side in assignment",InvalidLHSInForIn:"Invalid left-hand side in for-in",InvalidLHSInForLoop:"Invalid left-hand side in for-loop",InvalidModuleSpecifier:"Unexpected token",InvalidRegExp:"Invalid regular expression",LetInLexicalBinding:"let is disallowed as a lexically bound name",MissingFromClause:"Unexpected token",MultipleDefaultsInSwitch:"More than one default clause in switch statement",NewlineAfterThrow:"Illegal newline after throw",NoAsAfterImportNamespace:"Unexpected token",NoCatchOrFinally:"Missing catch or finally after try",ParameterAfterRestParameter:"Rest parameter must be last formal parameter",Redeclaration:"%0 '%1' has already been declared",StaticPrototype:"Classes may not have static property named prototype",StrictCatchVariable:"Catch variable may not be eval or arguments in strict mode",StrictDelete:"Delete of an unqualified identifier in strict mode.",StrictFunction:"In strict mode code, functions can only be declared at top level or inside a block",StrictFunctionName:"Function name may not be eval or arguments in strict mode",StrictLHSAssignment:"Assignment to eval or arguments is not allowed in strict mode",StrictLHSPostfix:"Postfix increment/decrement may not have eval or arguments operand in strict mode",StrictLHSPrefix:"Prefix increment/decrement may not have eval or arguments operand in strict mode",StrictModeWith:"Strict mode code may not include a with statement",StrictOctalLiteral:"Octal literals are not allowed in strict mode.",StrictParamDupe:"Strict mode function may not have duplicate parameter names",StrictParamName:"Parameter name eval or arguments is not allowed in strict mode",StrictReservedWord:"Use of future reserved word in strict mode",StrictVarName:"Variable name may not be eval or arguments in strict mode",TemplateOctalLiteral:"Octal literals are not allowed in template strings.",UnexpectedEOS:"Unexpected end of input",UnexpectedIdentifier:"Unexpected identifier",UnexpectedNumber:"Unexpected number",UnexpectedReserved:"Unexpected reserved word",UnexpectedString:"Unexpected string",UnexpectedTemplate:"Unexpected quasi %0",UnexpectedToken:"Unexpected token %0",UnexpectedTokenIllegal:"Unexpected token ILLEGAL",UnknownLabel:"Undefined label '%0'",UnterminatedRegExp:"Invalid regular expression: missing /"}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(9),i=r(4),o=r(11);function s(e){return"0123456789abcdef".indexOf(e.toLowerCase())}function A(e){return"01234567".indexOf(e)}var a=function(){function e(e,t){this.source=e,this.errorHandler=t,this.trackComment=!1,this.isModule=!1,this.length=e.length,this.index=0,this.lineNumber=e.length>0?1:0,this.lineStart=0,this.curlyStack=[]}return e.prototype.saveState=function(){return{index:this.index,lineNumber:this.lineNumber,lineStart:this.lineStart}},e.prototype.restoreState=function(e){this.index=e.index,this.lineNumber=e.lineNumber,this.lineStart=e.lineStart},e.prototype.eof=function(){return this.index>=this.length},e.prototype.throwUnexpectedToken=function(e){return void 0===e&&(e=o.Messages.UnexpectedTokenIllegal),this.errorHandler.throwError(this.index,this.lineNumber,this.index-this.lineStart+1,e)},e.prototype.tolerateUnexpectedToken=function(e){void 0===e&&(e=o.Messages.UnexpectedTokenIllegal),this.errorHandler.tolerateError(this.index,this.lineNumber,this.index-this.lineStart+1,e)},e.prototype.skipSingleLineComment=function(e){var t,r,n=[];for(this.trackComment&&(n=[],t=this.index-e,r={start:{line:this.lineNumber,column:this.index-this.lineStart-e},end:{}});!this.eof();){var o=this.source.charCodeAt(this.index);if(++this.index,i.Character.isLineTerminator(o)){if(this.trackComment){r.end={line:this.lineNumber,column:this.index-this.lineStart-1};var s={multiLine:!1,slice:[t+e,this.index-1],range:[t,this.index-1],loc:r};n.push(s)}return 13===o&&10===this.source.charCodeAt(this.index)&&++this.index,++this.lineNumber,this.lineStart=this.index,n}}return this.trackComment&&(r.end={line:this.lineNumber,column:this.index-this.lineStart},s={multiLine:!1,slice:[t+e,this.index],range:[t,this.index],loc:r},n.push(s)),n},e.prototype.skipMultiLineComment=function(){var e,t,r=[];for(this.trackComment&&(r=[],e=this.index-2,t={start:{line:this.lineNumber,column:this.index-this.lineStart-2},end:{}});!this.eof();){var n=this.source.charCodeAt(this.index);if(i.Character.isLineTerminator(n))13===n&&10===this.source.charCodeAt(this.index+1)&&++this.index,++this.lineNumber,++this.index,this.lineStart=this.index;else if(42===n){if(47===this.source.charCodeAt(this.index+1)){if(this.index+=2,this.trackComment){t.end={line:this.lineNumber,column:this.index-this.lineStart};var o={multiLine:!0,slice:[e+2,this.index-2],range:[e,this.index],loc:t};r.push(o)}return r}++this.index}else++this.index}return this.trackComment&&(t.end={line:this.lineNumber,column:this.index-this.lineStart},o={multiLine:!0,slice:[e+2,this.index],range:[e,this.index],loc:t},r.push(o)),this.tolerateUnexpectedToken(),r},e.prototype.scanComments=function(){var e;this.trackComment&&(e=[]);for(var t=0===this.index;!this.eof();){var r=this.source.charCodeAt(this.index);if(i.Character.isWhiteSpace(r))++this.index;else if(i.Character.isLineTerminator(r))++this.index,13===r&&10===this.source.charCodeAt(this.index)&&++this.index,++this.lineNumber,this.lineStart=this.index,t=!0;else if(47===r)if(47===(r=this.source.charCodeAt(this.index+1))){this.index+=2;var n=this.skipSingleLineComment(2);this.trackComment&&(e=e.concat(n)),t=!0}else{if(42!==r)break;this.index+=2,n=this.skipMultiLineComment(),this.trackComment&&(e=e.concat(n))}else if(t&&45===r){if(45!==this.source.charCodeAt(this.index+1)||62!==this.source.charCodeAt(this.index+2))break;this.index+=3,n=this.skipSingleLineComment(3),this.trackComment&&(e=e.concat(n))}else{if(60!==r||this.isModule)break;if("!--"!==this.source.slice(this.index+1,this.index+4))break;this.index+=4,n=this.skipSingleLineComment(4),this.trackComment&&(e=e.concat(n))}}return e},e.prototype.isFutureReservedWord=function(e){switch(e){case"enum":case"export":case"import":case"super":return!0;default:return!1}},e.prototype.isStrictModeReservedWord=function(e){switch(e){case"implements":case"interface":case"package":case"private":case"protected":case"public":case"static":case"yield":case"let":return!0;default:return!1}},e.prototype.isRestrictedWord=function(e){return"eval"===e||"arguments"===e},e.prototype.isKeyword=function(e){switch(e.length){case 2:return"if"===e||"in"===e||"do"===e;case 3:return"var"===e||"for"===e||"new"===e||"try"===e||"let"===e;case 4:return"this"===e||"else"===e||"case"===e||"void"===e||"with"===e||"enum"===e;case 5:return"while"===e||"break"===e||"catch"===e||"throw"===e||"const"===e||"yield"===e||"class"===e||"super"===e;case 6:return"return"===e||"typeof"===e||"delete"===e||"switch"===e||"export"===e||"import"===e;case 7:return"default"===e||"finally"===e||"extends"===e;case 8:return"function"===e||"continue"===e||"debugger"===e;case 10:return"instanceof"===e;default:return!1}},e.prototype.codePointAt=function(e){var t=this.source.charCodeAt(e);if(t>=55296&&t<=56319){var r=this.source.charCodeAt(e+1);r>=56320&&r<=57343&&(t=1024*(t-55296)+r-56320+65536)}return t},e.prototype.scanHexEscape=function(e){for(var t="u"===e?4:2,r=0,n=0;n1114111||"}"!==e)&&this.throwUnexpectedToken(),i.Character.fromCodePoint(t)},e.prototype.getIdentifier=function(){for(var e=this.index++;!this.eof();){var t=this.source.charCodeAt(this.index);if(92===t)return this.index=e,this.getComplexIdentifier();if(t>=55296&&t<57343)return this.index=e,this.getComplexIdentifier();if(!i.Character.isIdentifierPart(t))break;++this.index}return this.source.slice(e,this.index)},e.prototype.getComplexIdentifier=function(){var e,t=this.codePointAt(this.index),r=i.Character.fromCodePoint(t);for(this.index+=r.length,92===t&&(117!==this.source.charCodeAt(this.index)&&this.throwUnexpectedToken(),++this.index,"{"===this.source[this.index]?(++this.index,e=this.scanUnicodeCodePointEscape()):null!==(e=this.scanHexEscape("u"))&&"\\"!==e&&i.Character.isIdentifierStart(e.charCodeAt(0))||this.throwUnexpectedToken(),r=e);!this.eof()&&(t=this.codePointAt(this.index),i.Character.isIdentifierPart(t));)r+=e=i.Character.fromCodePoint(t),this.index+=e.length,92===t&&(r=r.substr(0,r.length-1),117!==this.source.charCodeAt(this.index)&&this.throwUnexpectedToken(),++this.index,"{"===this.source[this.index]?(++this.index,e=this.scanUnicodeCodePointEscape()):null!==(e=this.scanHexEscape("u"))&&"\\"!==e&&i.Character.isIdentifierPart(e.charCodeAt(0))||this.throwUnexpectedToken(),r+=e);return r},e.prototype.octalToDecimal=function(e){var t="0"!==e,r=A(e);return!this.eof()&&i.Character.isOctalDigit(this.source.charCodeAt(this.index))&&(t=!0,r=8*r+A(this.source[this.index++]),"0123".indexOf(e)>=0&&!this.eof()&&i.Character.isOctalDigit(this.source.charCodeAt(this.index))&&(r=8*r+A(this.source[this.index++]))),{code:r,octal:t}},e.prototype.scanIdentifier=function(){var e,t=this.index,r=92===this.source.charCodeAt(t)?this.getComplexIdentifier():this.getIdentifier();if(3!=(e=1===r.length?3:this.isKeyword(r)?4:"null"===r?5:"true"===r||"false"===r?1:3)&&t+r.length!==this.index){var n=this.index;this.index=t,this.tolerateUnexpectedToken(o.Messages.InvalidEscapedReservedWord),this.index=n}return{type:e,value:r,lineNumber:this.lineNumber,lineStart:this.lineStart,start:t,end:this.index}},e.prototype.scanPunctuator=function(){var e=this.index,t=this.source[this.index];switch(t){case"(":case"{":"{"===t&&this.curlyStack.push("{"),++this.index;break;case".":++this.index,"."===this.source[this.index]&&"."===this.source[this.index+1]&&(this.index+=2,t="...");break;case"}":++this.index,this.curlyStack.pop();break;case")":case";":case",":case"[":case"]":case":":case"?":case"~":++this.index;break;default:">>>="===(t=this.source.substr(this.index,4))?this.index+=4:"==="===(t=t.substr(0,3))||"!=="===t||">>>"===t||"<<="===t||">>="===t||"**="===t?this.index+=3:"&&"===(t=t.substr(0,2))||"||"===t||"=="===t||"!="===t||"+="===t||"-="===t||"*="===t||"/="===t||"++"===t||"--"===t||"<<"===t||">>"===t||"&="===t||"|="===t||"^="===t||"%="===t||"<="===t||">="===t||"=>"===t||"**"===t?this.index+=2:(t=this.source[this.index],"<>=!+-*%&|^/".indexOf(t)>=0&&++this.index)}return this.index===e&&this.throwUnexpectedToken(),{type:7,value:t,lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}},e.prototype.scanHexLiteral=function(e){for(var t="";!this.eof()&&i.Character.isHexDigit(this.source.charCodeAt(this.index));)t+=this.source[this.index++];return 0===t.length&&this.throwUnexpectedToken(),i.Character.isIdentifierStart(this.source.charCodeAt(this.index))&&this.throwUnexpectedToken(),{type:6,value:parseInt("0x"+t,16),lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}},e.prototype.scanBinaryLiteral=function(e){for(var t,r="";!this.eof()&&("0"===(t=this.source[this.index])||"1"===t);)r+=this.source[this.index++];return 0===r.length&&this.throwUnexpectedToken(),this.eof()||(t=this.source.charCodeAt(this.index),(i.Character.isIdentifierStart(t)||i.Character.isDecimalDigit(t))&&this.throwUnexpectedToken()),{type:6,value:parseInt(r,2),lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}},e.prototype.scanOctalLiteral=function(e,t){var r="",n=!1;for(i.Character.isOctalDigit(e.charCodeAt(0))?(n=!0,r="0"+this.source[this.index++]):++this.index;!this.eof()&&i.Character.isOctalDigit(this.source.charCodeAt(this.index));)r+=this.source[this.index++];return n||0!==r.length||this.throwUnexpectedToken(),(i.Character.isIdentifierStart(this.source.charCodeAt(this.index))||i.Character.isDecimalDigit(this.source.charCodeAt(this.index)))&&this.throwUnexpectedToken(),{type:6,value:parseInt(r,8),octal:n,lineNumber:this.lineNumber,lineStart:this.lineStart,start:t,end:this.index}},e.prototype.isImplicitOctalLiteral=function(){for(var e=this.index+1;e=0&&(r=r.replace(/\\u\{([0-9a-fA-F]+)\}|\\u([a-fA-F0-9]{4})/g,(function(e,t,r){var i=parseInt(t||r,16);return i>1114111&&n.throwUnexpectedToken(o.Messages.InvalidRegExp),i<=65535?String.fromCharCode(i):"ï¿¿"})).replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"ï¿¿"));try{RegExp(r)}catch(e){this.throwUnexpectedToken(o.Messages.InvalidRegExp)}try{return new RegExp(e,t)}catch(e){return null}},e.prototype.scanRegExpBody=function(){var e=this.source[this.index];n.assert("/"===e,"Regular expression literal must start with a slash");for(var t=this.source[this.index++],r=!1,s=!1;!this.eof();)if(t+=e=this.source[this.index++],"\\"===e)e=this.source[this.index++],i.Character.isLineTerminator(e.charCodeAt(0))&&this.throwUnexpectedToken(o.Messages.UnterminatedRegExp),t+=e;else if(i.Character.isLineTerminator(e.charCodeAt(0)))this.throwUnexpectedToken(o.Messages.UnterminatedRegExp);else if(r)"]"===e&&(r=!1);else{if("/"===e){s=!0;break}"["===e&&(r=!0)}return s||this.throwUnexpectedToken(o.Messages.UnterminatedRegExp),t.substr(1,t.length-2)},e.prototype.scanRegExpFlags=function(){for(var e="";!this.eof();){var t=this.source[this.index];if(!i.Character.isIdentifierPart(t.charCodeAt(0)))break;if(++this.index,"\\"!==t||this.eof())e+=t;else if("u"===(t=this.source[this.index])){++this.index;var r=this.index,n=this.scanHexEscape("u");if(null!==n)for(e+=n;r=55296&&e<57343&&i.Character.isIdentifierStart(this.codePointAt(this.index))?this.scanIdentifier():this.scanPunctuator()},e}();t.Scanner=a},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TokenName={},t.TokenName[1]="Boolean",t.TokenName[2]="",t.TokenName[3]="Identifier",t.TokenName[4]="Keyword",t.TokenName[5]="Null",t.TokenName[6]="Numeric",t.TokenName[7]="Punctuator",t.TokenName[8]="String",t.TokenName[9]="RegularExpression",t.TokenName[10]="Template"},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.XHTMLEntities={quot:'"',amp:"&",apos:"'",gt:">",nbsp:" ",iexcl:"¡",cent:"¢",pound:"£",curren:"¤",yen:"Â¥",brvbar:"¦",sect:"§",uml:"¨",copy:"©",ordf:"ª",laquo:"«",not:"¬",shy:"­",reg:"®",macr:"¯",deg:"°",plusmn:"±",sup2:"²",sup3:"³",acute:"´",micro:"µ",para:"¶",middot:"·",cedil:"¸",sup1:"¹",ordm:"º",raquo:"»",frac14:"¼",frac12:"½",frac34:"¾",iquest:"¿",Agrave:"À",Aacute:"Ã",Acirc:"Â",Atilde:"Ã",Auml:"Ä",Aring:"Ã…",AElig:"Æ",Ccedil:"Ç",Egrave:"È",Eacute:"É",Ecirc:"Ê",Euml:"Ë",Igrave:"ÃŒ",Iacute:"Ã",Icirc:"ÃŽ",Iuml:"Ã",ETH:"Ã",Ntilde:"Ñ",Ograve:"Ã’",Oacute:"Ó",Ocirc:"Ô",Otilde:"Õ",Ouml:"Ö",times:"×",Oslash:"Ø",Ugrave:"Ù",Uacute:"Ú",Ucirc:"Û",Uuml:"Ãœ",Yacute:"Ã",THORN:"Þ",szlig:"ß",agrave:"à",aacute:"á",acirc:"â",atilde:"ã",auml:"ä",aring:"Ã¥",aelig:"æ",ccedil:"ç",egrave:"è",eacute:"é",ecirc:"ê",euml:"ë",igrave:"ì",iacute:"í",icirc:"î",iuml:"ï",eth:"ð",ntilde:"ñ",ograve:"ò",oacute:"ó",ocirc:"ô",otilde:"õ",ouml:"ö",divide:"÷",oslash:"ø",ugrave:"ù",uacute:"ú",ucirc:"û",uuml:"ü",yacute:"ý",thorn:"þ",yuml:"ÿ",OElig:"Å’",oelig:"Å“",Scaron:"Å ",scaron:"Å¡",Yuml:"Ÿ",fnof:"Æ’",circ:"ˆ",tilde:"Ëœ",Alpha:"Α",Beta:"Î’",Gamma:"Γ",Delta:"Δ",Epsilon:"Ε",Zeta:"Ζ",Eta:"Η",Theta:"Θ",Iota:"Ι",Kappa:"Κ",Lambda:"Λ",Mu:"Îœ",Nu:"Î",Xi:"Ξ",Omicron:"Ο",Pi:"Π",Rho:"Ρ",Sigma:"Σ",Tau:"Τ",Upsilon:"Î¥",Phi:"Φ",Chi:"Χ",Psi:"Ψ",Omega:"Ω",alpha:"α",beta:"β",gamma:"γ",delta:"δ",epsilon:"ε",zeta:"ζ",eta:"η",theta:"θ",iota:"ι",kappa:"κ",lambda:"λ",mu:"μ",nu:"ν",xi:"ξ",omicron:"ο",pi:"Ï€",rho:"Ï",sigmaf:"Ï‚",sigma:"σ",tau:"Ï„",upsilon:"Ï…",phi:"φ",chi:"χ",psi:"ψ",omega:"ω",thetasym:"Ï‘",upsih:"Ï’",piv:"Ï–",ensp:" ",emsp:" ",thinsp:" ",zwnj:"‌",zwj:"â€",lrm:"‎",rlm:"â€",ndash:"–",mdash:"—",lsquo:"‘",rsquo:"’",sbquo:"‚",ldquo:"“",rdquo:"â€",bdquo:"„",dagger:"†",Dagger:"‡",bull:"•",hellip:"…",permil:"‰",prime:"′",Prime:"″",lsaquo:"‹",rsaquo:"›",oline:"‾",frasl:"â„",euro:"€",image:"â„‘",weierp:"℘",real:"â„œ",trade:"â„¢",alefsym:"ℵ",larr:"â†",uarr:"↑",rarr:"→",darr:"↓",harr:"↔",crarr:"↵",lArr:"â‡",uArr:"⇑",rArr:"⇒",dArr:"⇓",hArr:"⇔",forall:"∀",part:"∂",exist:"∃",empty:"∅",nabla:"∇",isin:"∈",notin:"∉",ni:"∋",prod:"âˆ",sum:"∑",minus:"−",lowast:"∗",radic:"√",prop:"âˆ",infin:"∞",ang:"∠",and:"∧",or:"∨",cap:"∩",cup:"∪",int:"∫",there4:"∴",sim:"∼",cong:"≅",asymp:"≈",ne:"≠",equiv:"≡",le:"≤",ge:"≥",sub:"⊂",sup:"⊃",nsub:"⊄",sube:"⊆",supe:"⊇",oplus:"⊕",otimes:"⊗",perp:"⊥",sdot:"â‹…",lceil:"⌈",rceil:"⌉",lfloor:"⌊",rfloor:"⌋",loz:"â—Š",spades:"â™ ",clubs:"♣",hearts:"♥",diams:"♦",lang:"⟨",rang:"⟩"}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(10),i=r(12),o=r(13),s=function(){function e(){this.values=[],this.curly=this.paren=-1}return e.prototype.beforeFunctionExpression=function(e){return["(","{","[","in","typeof","instanceof","new","return","case","delete","throw","void","=","+=","-=","*=","**=","/=","%=","<<=",">>=",">>>=","&=","|=","^=",",","+","-","*","**","/","%","++","--","<<",">>",">>>","&","|","^","!","~","&&","||","?",":","===","==",">=","<=","<",">","!=","!=="].indexOf(e)>=0},e.prototype.isRegexStart=function(){var e=this.values[this.values.length-1],t=null!==e;switch(e){case"this":case"]":t=!1;break;case")":var r=this.values[this.paren-1];t="if"===r||"while"===r||"for"===r||"with"===r;break;case"}":if(t=!1,"function"===this.values[this.curly-3])t=!!(n=this.values[this.curly-4])&&!this.beforeFunctionExpression(n);else if("function"===this.values[this.curly-4]){var n;t=!(n=this.values[this.curly-5])||!this.beforeFunctionExpression(n)}}return t},e.prototype.push=function(e){7===e.type||4===e.type?("{"===e.value?this.curly=this.values.length:"("===e.value&&(this.paren=this.values.length),this.values.push(e.value)):this.values.push(null)},e}(),A=function(){function e(e,t){this.errorHandler=new n.ErrorHandler,this.errorHandler.tolerant=!!t&&"boolean"==typeof t.tolerant&&t.tolerant,this.scanner=new i.Scanner(e,this.errorHandler),this.scanner.trackComment=!!t&&"boolean"==typeof t.comment&&t.comment,this.trackRange=!!t&&"boolean"==typeof t.range&&t.range,this.trackLoc=!!t&&"boolean"==typeof t.loc&&t.loc,this.buffer=[],this.reader=new s}return e.prototype.errors=function(){return this.errorHandler.errors},e.prototype.getNextToken=function(){if(0===this.buffer.length){var e=this.scanner.scanComments();if(this.scanner.trackComment)for(var t=0;t{"use strict";var n=r(80848),i=r(63129),o=r(35747),s=r(14503),A=r(67783),a=r(79932);a.CreateFileError;var c=r(89885);c.LaunchEditorError;var u=r(11124);u.ReadFileError;var l=r(60239);l.RemoveFileError,t.Wl=function(e,t){void 0===e&&(e="");var r=new h(e);r.runAsync((function(e,n){if(e)setImmediate(t,e,null);else try{r.cleanup(),setImmediate(t,null,n)}catch(e){setImmediate(t,e,null)}}))};var h=function(){function e(e){void 0===e&&(e=""),this.text="",this.text=e,this.determineEditor(),this.createTemporaryFile()}return e.splitStringBySpace=function(e){for(var t=[],r="",n=0;n0&&" "===i&&"\\"!==e[n-1]&&r.length>0?(t.push(r),r=""):r+=i}return r.length>0&&t.push(r),t},Object.defineProperty(e.prototype,"temp_file",{get:function(){return console.log("DEPRECATED: temp_file. Use tempFile moving forward."),this.tempFile},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"last_exit_status",{get:function(){return console.log("DEPRECATED: last_exit_status. Use lastExitStatus moving forward."),this.lastExitStatus},enumerable:!0,configurable:!0}),e.prototype.run=function(){return this.launchEditor(),this.readTemporaryFile(),this.text},e.prototype.runAsync=function(e){var t=this;try{this.launchEditorAsync((function(){try{t.readTemporaryFile(),setImmediate(e,null,t.text)}catch(t){setImmediate(e,t,null)}}))}catch(t){setImmediate(e,t,null)}},e.prototype.cleanup=function(){this.removeTemporaryFile()},e.prototype.determineEditor=function(){var t=process.env.VISUAL?process.env.VISUAL:process.env.EDITOR?process.env.EDITOR:/^win/.test(process.platform)?"notepad":"vim",r=e.splitStringBySpace(t).map((function(e){return e.replace("\\ "," ")})),n=r.shift();this.editor={args:r,bin:n}},e.prototype.createTemporaryFile=function(){try{this.tempFile=A.tmpNameSync({}),o.writeFileSync(this.tempFile,this.text,{encoding:"utf8"})}catch(e){throw new a.CreateFileError(e)}},e.prototype.readTemporaryFile=function(){try{var e=o.readFileSync(this.tempFile);if(0===e.length)this.text="";else{var t=n.detect(e).toString();s.encodingExists(t)||(t="utf8"),this.text=s.decode(e,t)}}catch(e){throw new u.ReadFileError(e)}},e.prototype.removeTemporaryFile=function(){try{o.unlinkSync(this.tempFile)}catch(e){throw new l.RemoveFileError(e)}},e.prototype.launchEditor=function(){try{var e=i.spawnSync(this.editor.bin,this.editor.args.concat([this.tempFile]),{stdio:"inherit"});this.lastExitStatus=e.status}catch(e){throw new c.LaunchEditorError(e)}},e.prototype.launchEditorAsync=function(e){var t=this;try{i.spawn(this.editor.bin,this.editor.args.concat([this.tempFile]),{stdio:"inherit"}).on("exit",(function(r){t.lastExitStatus=r,setImmediate(e)}))}catch(e){throw new c.LaunchEditorError(e)}},e}()},19347:(e,t,r)=>{"use strict";const n=r(80598),i=r(58182),o=r(67652),s=r(81340),A=r(43754),a=r(16777);async function c(e,t){l(e);const r=u(e,i.default,t),n=await Promise.all(r);return a.array.flatten(n)}function u(e,t,r){const i=[].concat(e),o=new A.default(r),s=n.generate(i,o),a=new t(o);return s.map(a.read,a)}function l(e){if(![].concat(e).every(e=>a.string.isString(e)&&!a.string.isEmpty(e)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}!function(e){e.sync=function(e,t){l(e);const r=u(e,s.default,t);return a.array.flatten(r)},e.stream=function(e,t){l(e);const r=u(e,o.default,t);return a.stream.merge(r)},e.generateTasks=function(e,t){l(e);const r=[].concat(e),i=new A.default(t);return n.generate(r,i)},e.isDynamicPattern=function(e,t){l(e);const r=new A.default(t);return a.pattern.isDynamicPattern(e,r)},e.escapePath=function(e){return l(e),a.path.escape(e)}}(c||(c={})),e.exports=c},80598:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(16777);function i(e,t,r){const n=A(e);if("."in n){return[c(".",e,t,r)]}return a(n,t,r)}function o(e){return n.pattern.getPositivePatterns(e)}function s(e,t){return n.pattern.getNegativePatterns(e).concat(t).map(n.pattern.convertToPositivePattern)}function A(e){return e.reduce((e,t)=>{const r=n.pattern.getBaseDirectory(t);return r in e?e[r].push(t):e[r]=[t],e},{})}function a(e,t,r){return Object.keys(e).map(n=>c(n,e[n],t,r))}function c(e,t,r,i){return{dynamic:i,positive:t,negative:r,base:e,patterns:[].concat(t,r.map(n.pattern.convertToNegativePattern))}}t.generate=function(e,t){const r=o(e),A=s(e,t.ignore),a=r.filter(e=>n.pattern.isStaticPattern(e,t)),c=r.filter(e=>n.pattern.isDynamicPattern(e,t)),u=i(a,A,!1),l=i(c,A,!0);return u.concat(l)},t.convertPatternsToTasks=i,t.getPositivePatterns=o,t.getNegativePatternsAsPositive=s,t.groupPatternsByBaseDirectory=A,t.convertPatternGroupsToTasks=a,t.convertPatternGroupToTask=c},58182:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(82774),i=r(40545);class o extends i.default{constructor(){super(...arguments),this._reader=new n.default(this._settings)}read(e){const t=this._getRootDirectory(e),r=this._getReaderOptions(e),n=[];return new Promise((i,o)=>{const s=this.api(t,e,r);s.once("error",o),s.on("data",e=>n.push(r.transform(e))),s.once("end",()=>i(n))})}api(e,t,r){return t.dynamic?this._reader.dynamic(e,r):this._reader.static(t.patterns,r)}}t.default=o},65989:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(16777),i=r(42585);t.default=class{constructor(e,t){this._settings=e,this._micromatchOptions=t}getFilter(e,t,r){const n=this._getMatcher(t),i=this._getNegativePatternsRe(r);return t=>this._filter(e,t,n,i)}_getMatcher(e){return new i.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){const t=e.filter(n.pattern.isAffectDepthOfReadingPattern);return n.pattern.convertPatternsToRe(t,this._micromatchOptions)}_filter(e,t,r,i){const o=this._getEntryLevel(e,t.path);if(this._isSkippedByDeep(o))return!1;if(this._isSkippedSymbolicLink(t))return!1;const s=n.path.removeLeadingDotSegment(t.path);return!this._isSkippedByPositivePatterns(s,r)&&this._isSkippedByNegativePatterns(s,i)}_isSkippedByDeep(e){return e>=this._settings.deep}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_getEntryLevel(e,t){const r=e.split("/").length;return t.split("/").length-(""===e?0:r)}_isSkippedByPositivePatterns(e,t){return!this._settings.baseNameMatch&&!t.match(e)}_isSkippedByNegativePatterns(e,t){return!n.pattern.matchAny(e,t)}}},37338:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(16777);t.default=class{constructor(e,t){this._settings=e,this._micromatchOptions=t,this.index=new Map}getFilter(e,t){const r=n.pattern.convertPatternsToRe(e,this._micromatchOptions),i=n.pattern.convertPatternsToRe(t,this._micromatchOptions);return e=>this._filter(e,r,i)}_filter(e,t,r){if(this._settings.unique){if(this._isDuplicateEntry(e))return!1;this._createIndexRecord(e)}if(this._onlyFileFilter(e)||this._onlyDirectoryFilter(e))return!1;if(this._isSkippedByAbsoluteNegativePatterns(e,r))return!1;const n=this._settings.baseNameMatch?e.name:e.path;return this._isMatchToPatterns(n,t)&&!this._isMatchToPatterns(e.path,r)}_isDuplicateEntry(e){return this.index.has(e.path)}_createIndexRecord(e){this.index.set(e.path,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,t){if(!this._settings.absolute)return!1;const r=n.path.makeAbsolute(this._settings.cwd,e.path);return this._isMatchToPatterns(r,t)}_isMatchToPatterns(e,t){const r=n.path.removeLeadingDotSegment(e);return n.pattern.matchAny(r,t)}}},54345:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(16777);t.default=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return n.errno.isEnoentCodeError(e)||this._settings.suppressErrors}}},34789:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(16777);t.default=class{constructor(e,t,r){this._patterns=e,this._settings=t,this._micromatchOptions=r,this._storage=[],this._fillStorage()}_fillStorage(){const e=n.pattern.expandPatternsWithBraceExpansion(this._patterns);for(const t of e){const e=this._getPatternSegments(t),r=this._splitSegmentsIntoSections(e);this._storage.push({complete:r.length<=1,pattern:t,segments:e,sections:r})}}_getPatternSegments(e){return n.pattern.getPatternParts(e,this._micromatchOptions).map(e=>n.pattern.isDynamicPattern(e,this._settings)?{dynamic:!0,pattern:e,patternRe:n.pattern.makeRe(e,this._micromatchOptions)}:{dynamic:!1,pattern:e})}_splitSegmentsIntoSections(e){return n.array.splitWhen(e,e=>e.dynamic&&n.pattern.hasGlobStar(e.pattern))}}},42585:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(34789);class i extends n.default{match(e){const t=e.split("/"),r=t.length,n=this._storage.filter(e=>!e.complete||e.segments.length>r);for(const e of n){const n=e.sections[0];if(!e.complete&&r>n.length)return!0;if(t.every((t,r)=>{const n=e.segments[r];return!(!n.dynamic||!n.patternRe.test(t))||!n.dynamic&&n.pattern===t}))return!0}return!1}}t.default=i},40545:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(85622),i=r(65989),o=r(37338),s=r(54345),A=r(77541);t.default=class{constructor(e){this._settings=e,this.errorFilter=new s.default(this._settings),this.entryFilter=new o.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new i.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new A.default(this._settings)}_getRootDirectory(e){return n.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){const t="."===e.base?"":e.base;return{basePath:t,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(t,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}}},67652:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(92413),i=r(82774),o=r(40545);class s extends o.default{constructor(){super(...arguments),this._reader=new i.default(this._settings)}read(e){const t=this._getRootDirectory(e),r=this._getReaderOptions(e),i=this.api(t,e,r),o=new n.Readable({objectMode:!0,read:()=>{}});return i.once("error",e=>o.emit("error",e)).on("data",e=>o.emit("data",r.transform(e))).once("end",()=>o.emit("end")),o.once("close",()=>i.destroy()),o}api(e,t,r){return t.dynamic?this._reader.dynamic(e,r):this._reader.static(t.patterns,r)}}t.default=s},81340:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(29543),i=r(40545);class o extends i.default{constructor(){super(...arguments),this._reader=new n.default(this._settings)}read(e){const t=this._getRootDirectory(e),r=this._getReaderOptions(e);return this.api(t,e,r).map(r.transform)}api(e,t,r){return t.dynamic?this._reader.dynamic(e,r):this._reader.static(t.patterns,r)}}t.default=o},77541:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(16777);t.default=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let t=e.path;return this._settings.absolute&&(t=n.path.makeAbsolute(this._settings.cwd,t),t=n.path.unixify(t)),this._settings.markDirectories&&e.dirent.isDirectory()&&(t+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:t}):t}}},99458:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(85622),i=r(53403),o=r(16777);t.default=class{constructor(e){this._settings=e,this._fsStatSettings=new i.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return n.resolve(this._settings.cwd,e)}_makeEntry(e,t){const r={name:t,path:t,dirent:o.fs.createDirentFromStats(t,e)};return this._settings.stats&&(r.stats=e),r}_isFatalError(e){return!o.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}}},82774:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(92413),i=r(53403),o=r(72897),s=r(99458);class A extends s.default{constructor(){super(...arguments),this._walkStream=o.walkStream,this._stat=i.stat}dynamic(e,t){return this._walkStream(e,t)}static(e,t){const r=e.map(this._getFullEntryPath,this),i=new n.PassThrough({objectMode:!0});i._write=(n,o,s)=>this._getEntry(r[n],e[n],t).then(e=>{null!==e&&t.entryFilter(e)&&i.push(e),n===r.length-1&&i.end(),s()}).catch(s);for(let e=0;ethis._makeEntry(e,t)).catch(e=>{if(r.errorFilter(e))return null;throw e})}_getStat(e){return new Promise((t,r)=>{this._stat(e,this._fsStatSettings,(e,n)=>null===e?t(n):r(e))})}}t.default=A},29543:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(53403),i=r(72897),o=r(99458);class s extends o.default{constructor(){super(...arguments),this._walkSync=i.walkSync,this._statSync=n.statSync}dynamic(e,t){return this._walkSync(e,t)}static(e,t){const r=[];for(const n of e){const e=this._getFullEntryPath(n),i=this._getEntry(e,n,t);null!==i&&t.entryFilter(i)&&r.push(i)}return r}_getEntry(e,t,r){try{const r=this._getStat(e);return this._makeEntry(r,t)}catch(e){if(r.errorFilter(e))return null;throw e}}_getStat(e){return this._statSync(e,this._fsStatSettings)}}t.default=s},43754:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(35747),i=r(12087).cpus().length;t.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:n.lstat,lstatSync:n.lstatSync,stat:n.stat,statSync:n.statSync,readdir:n.readdir,readdirSync:n.readdirSync};t.default=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,i),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,1/0),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0)}_getValue(e,t){return void 0===e?t:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},t.DEFAULT_FILE_SYSTEM_ADAPTER),e)}}},60919:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.flatten=function(e){return e.reduce((e,t)=>[].concat(e,t),[])},t.splitWhen=function(e,t){const r=[[]];let n=0;for(const i of e)t(i)?(n++,r[n]=[]):r[n].push(i);return r}},35525:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isEnoentCodeError=function(e){return"ENOENT"===e.code}},62524:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}}t.createDirentFromStats=function(e,t){return new r(e,t)}},16777:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(60919);t.array=n;const i=r(35525);t.errno=i;const o=r(62524);t.fs=o;const s=r(71462);t.path=s;const A=r(14659);t.pattern=A;const a=r(2042);t.stream=a;const c=r(10217);t.string=c},71462:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(85622),i=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g;t.unixify=function(e){return e.replace(/\\/g,"/")},t.makeAbsolute=function(e,t){return n.resolve(e,t)},t.escape=function(e){return e.replace(i,"\\$2")},t.removeLeadingDotSegment=function(e){if("."===e.charAt(0)){const t=e.charAt(1);if("/"===t||"\\"===t)return e.slice(2)}return e}},14659:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(85622),i=r(97098),o=r(2401),s=r(54722),A=/[*?]|^!/,a=/\[.*]/,c=/(?:^|[^!*+?@])\(.*\|.*\)/,u=/[!*+?@]\(.*\)/,l=/{.*(?:,|\.\.).*}/;function h(e,t={}){return!g(e,t)}function g(e,t={}){return!(!1!==t.caseSensitiveMatch&&!e.includes("\\"))||(!!(A.test(e)||a.test(e)||c.test(e))||(!(!1===t.extglob||!u.test(e))||!(!1===t.braceExpansion||!l.test(e))))}function f(e){return e.startsWith("!")&&"("!==e[1]}function p(e){return!f(e)}function d(e){return e.endsWith("/**")}function C(e){return o.braces(e,{expand:!0,nodupes:!0})}function E(e,t){return o.makeRe(e,t)}t.isStaticPattern=h,t.isDynamicPattern=g,t.convertToPositivePattern=function(e){return f(e)?e.slice(1):e},t.convertToNegativePattern=function(e){return"!"+e},t.isNegativePattern=f,t.isPositivePattern=p,t.getNegativePatterns=function(e){return e.filter(f)},t.getPositivePatterns=function(e){return e.filter(p)},t.getBaseDirectory=function(e){return i(e,{flipBackslashes:!1})},t.hasGlobStar=function(e){return e.includes("**")},t.endsWithSlashGlobStar=d,t.isAffectDepthOfReadingPattern=function(e){const t=n.basename(e);return d(e)||h(t)},t.expandPatternsWithBraceExpansion=function(e){return e.reduce((e,t)=>e.concat(C(t)),[])},t.expandBraceExpansion=C,t.getPatternParts=function(e,t){const r=s.scan(e,Object.assign(Object.assign({},t),{parts:!0}));return 0===r.parts.length?[e]:r.parts},t.makeRe=E,t.convertPatternsToRe=function(e,t){return e.map(e=>E(e,t))},t.matchAny=function(e,t){return t.some(t=>t.test(e))}},2042:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(55598);function i(e){e.forEach(e=>e.emit("close"))}t.merge=function(e){const t=n(e);return e.forEach(e=>{e.once("error",e=>t.emit("error",e))}),t.once("close",()=>i(e)),t.once("end",()=>i(e)),t}},10217:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isString=function(e){return"string"==typeof e},t.isEmpty=function(e){return""===e}},98360:(e,t,r)=>{"use strict";var n=r(2383);function i(){}function o(){this.value=null,this.callback=i,this.next=null,this.release=i,this.context=null;var e=this;this.worked=function(t,r){var n=e.callback;e.value=null,e.callback=i,n.call(e.context,t,r),e.release(e)}}e.exports=function(e,t,r){"function"==typeof e&&(r=t,t=e,e=null);var s=n(o),A=null,a=null,c=0,u={push:function(r,n){var o=s.get();o.context=e,o.release=l,o.value=r,o.callback=n||i,c===u.concurrency||u.paused?a?(a.next=o,a=o):(A=o,a=o,u.saturated()):(c++,t.call(e,o.value,o.worked))},drain:i,saturated:i,pause:function(){u.paused=!0},paused:!1,concurrency:r,running:function(){return c},resume:function(){if(!u.paused)return;u.paused=!1;for(var e=0;e{"use strict";class n{constructor(e,t,r){this.__specs=e||{},Object.keys(this.__specs).forEach(e=>{if("string"==typeof this.__specs[e]){const t=this.__specs[e],r=this.__specs[t];if(!r)throw new Error(`Alias refers to invalid key: ${t} -> ${e}`);{const n=r.aliases||[];n.push(e,t),r.aliases=[...new Set(n)],this.__specs[e]=r}}}),this.__opts=t||{},this.__providers=A(r.filter(e=>null!=e&&"object"==typeof e)),this.__isFiggyPudding=!0}get(e){return i(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,t=this){for(let[r,n]of this.entries())e.call(t,n,r,this)}toJSON(){const e={};return this.forEach((t,r)=>{e[r]=t}),e}*entries(e){for(let e of Object.keys(this.__specs))yield[e,this.get(e)];const t=e||this.__opts.other;if(t){const e=new Set;for(let r of this.__providers){const n=r.entries?r.entries(t):a(r);for(let[r,i]of n)t(r)&&!e.has(r)&&(e.add(r),yield[r,i])}}}*[Symbol.iterator](){for(let[e,t]of this.entries())yield[e,t]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new n(this.__specs,this.__opts,A(this.__providers).concat(e)),s)}}try{const e=r(31669);n.prototype[e.inspect.custom]=function(t,r){return this[Symbol.toStringTag]+" "+e.inspect(this.toJSON(),r)}}catch(e){}function i(e,t,r){let n=e.__specs[t];if(!r||n||e.__opts.other&&e.__opts.other(t)){let r;n||(n={});for(let i of e.__providers){if(r=o(t,i),void 0===r&&n.aliases&&n.aliases.length)for(let e of n.aliases)if(e!==t&&(r=o(e,i),void 0!==r))break;if(void 0!==r)break}return void 0===r&&void 0!==n.default?"function"==typeof n.default?n.default(e):n.default:r}!function(e){throw Object.assign(new Error("invalid config key requested: "+e),{code:"EBADKEY"})}(t)}function o(e,t){let r;return r=t.__isFiggyPudding?i(t,e,!1):"function"==typeof t.get?t.get(e):t[e],r}const s={has:(e,t)=>t in e.__specs&&void 0!==i(e,t,!1),ownKeys:e=>Object.keys(e.__specs),get:(e,t)=>"symbol"==typeof t||"__"===t.slice(0,2)||t in n.prototype?e[t]:e.get(t),set(e,t,r){if("symbol"==typeof t||"__"===t.slice(0,2))return e[t]=r,!0;throw new Error("figgyPudding options cannot be modified. Use .concat() instead.")},deleteProperty(){throw new Error("figgyPudding options cannot be deleted. Use .concat() and shadow them instead.")}};function A(e){const t=[];return e.forEach(e=>t.unshift(e)),t}function a(e){return Object.keys(e).map(t=>[t,e[t]])}e.exports=function(e,t){return function(...r){return new Proxy(new n(e,t,r),s)}}},51938:(e,t,r)=>{"use strict";const n=r(66349),{platform:i}=process,o={tick:"✔",cross:"✖",star:"★",square:"â–‡",squareSmall:"â—»",squareSmallFilled:"â—¼",play:"â–¶",circle:"â—¯",circleFilled:"â—‰",circleDotted:"â—Œ",circleDouble:"â—Ž",circleCircle:"â“ž",circleCross:"ⓧ",circlePipe:"â’¾",circleQuestionMark:"?âƒ",bullet:"â—",dot:"․",line:"─",ellipsis:"…",pointer:"â¯",pointerSmall:"›",info:"ℹ",warning:"âš ",hamburger:"☰",smiley:"ã‹¡",mustache:"à·´",heart:"♥",nodejs:"⬢",arrowUp:"↑",arrowDown:"↓",arrowLeft:"â†",arrowRight:"→",radioOn:"â—‰",radioOff:"â—¯",checkboxOn:"☒",checkboxOff:"â˜",checkboxCircleOn:"ⓧ",checkboxCircleOff:"â’¾",questionMarkPrefix:"?âƒ",oneHalf:"½",oneThird:"â…“",oneQuarter:"¼",oneFifth:"â…•",oneSixth:"â…™",oneSeventh:"â…",oneEighth:"â…›",oneNinth:"â…‘",oneTenth:"â…’",twoThirds:"â…”",twoFifths:"â…–",threeQuarters:"¾",threeFifths:"â…—",threeEighths:"â…œ",fourFifths:"â…˜",fiveSixths:"â…š",fiveEighths:"â…",sevenEighths:"â…ž"},s={tick:"√",cross:"×",star:"*",square:"â–ˆ",squareSmall:"[ ]",squareSmallFilled:"[â–ˆ]",play:"â–º",circle:"( )",circleFilled:"(*)",circleDotted:"( )",circleDouble:"( )",circleCircle:"(â—‹)",circleCross:"(×)",circlePipe:"(│)",circleQuestionMark:"(?)",bullet:"*",dot:".",line:"─",ellipsis:"...",pointer:">",pointerSmall:"»",info:"i",warning:"‼",hamburger:"≡",smiley:"☺",mustache:"┌─â”",heart:o.heart,nodejs:"♦",arrowUp:o.arrowUp,arrowDown:o.arrowDown,arrowLeft:o.arrowLeft,arrowRight:o.arrowRight,radioOn:"(*)",radioOff:"( )",checkboxOn:"[×]",checkboxOff:"[ ]",checkboxCircleOn:"(×)",checkboxCircleOff:"( )",questionMarkPrefix:"?",oneHalf:"1/2",oneThird:"1/3",oneQuarter:"1/4",oneFifth:"1/5",oneSixth:"1/6",oneSeventh:"1/7",oneEighth:"1/8",oneNinth:"1/9",oneTenth:"1/10",twoThirds:"2/3",twoFifths:"2/5",threeQuarters:"3/4",threeFifths:"3/5",threeEighths:"3/8",fourFifths:"4/5",fiveSixths:"5/6",fiveEighths:"5/8",sevenEighths:"7/8"};"linux"===i&&(o.questionMarkPrefix="?");const A="win32"===i?s:o;e.exports=Object.assign(e=>{if(A===o)return e;for(const[t,r]of Object.entries(o))r!==A[t]&&(e=e.replace(new RegExp(n(r),"g"),A[t]));return e},A),e.exports.main=o,e.exports.windows=s},52169:(e,t,r)=>{"use strict"; -/*! - * fill-range - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Licensed under the MIT License. - */const n=r(31669),i=r(84615),o=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),s=e=>"number"==typeof e||"string"==typeof e&&""!==e,A=e=>Number.isInteger(+e),a=e=>{let t=""+e,r=-1;if("-"===t[0]&&(t=t.slice(1)),"0"===t)return!1;for(;"0"===t[++r];);return r>0},c=(e,t,r)=>{if(t>0){let r="-"===e[0]?"-":"";r&&(e=e.slice(1)),e=r+e.padStart(r?t-1:t,"0")}return!1===r?String(e):e},u=(e,t)=>{let r="-"===e[0]?"-":"";for(r&&(e=e.slice(1),t--);e.length{if(r)return i(e,t,{wrap:!1,...n});let o=String.fromCharCode(e);return e===t?o:`[${o}-${String.fromCharCode(t)}]`},h=(e,t,r)=>{if(Array.isArray(e)){let t=!0===r.wrap,n=r.capture?"":"?:";return t?`(${n}${e.join("|")})`:e.join("|")}return i(e,t,r)},g=(...e)=>new RangeError("Invalid range arguments: "+n.inspect(...e)),f=(e,t,r)=>{if(!0===r.strictRanges)throw g([e,t]);return[]},p=(e,t,r=1,n={})=>{let i=Number(e),o=Number(t);if(!Number.isInteger(i)||!Number.isInteger(o)){if(!0===n.strictRanges)throw g([e,t]);return[]}0===i&&(i=0),0===o&&(o=0);let s=i>o,A=String(e),f=String(t),p=String(r);r=Math.max(Math.abs(r),1);let d=a(A)||a(f)||a(p),C=d?Math.max(A.length,f.length,p.length):0,E=!1===d&&!1===((e,t,r)=>"string"==typeof e||"string"==typeof t||!0===r.stringify)(e,t,n),I=n.transform||(e=>t=>!0===e?Number(t):String(t))(E);if(n.toRegex&&1===r)return l(u(e,C),u(t,C),!0,n);let m={negatives:[],positives:[]},y=[],w=0;for(;s?i>=o:i<=o;)!0===n.toRegex&&r>1?m[(B=i)<0?"negatives":"positives"].push(Math.abs(B)):y.push(c(I(i,w),C,E)),i=s?i-r:i+r,w++;var B;return!0===n.toRegex?r>1?((e,t)=>{e.negatives.sort((e,t)=>et?1:0),e.positives.sort((e,t)=>et?1:0);let r,n=t.capture?"":"?:",i="",o="";return e.positives.length&&(i=e.positives.join("|")),e.negatives.length&&(o=`-(${n}${e.negatives.join("|")})`),r=i&&o?`${i}|${o}`:i||o,t.wrap?`(${n}${r})`:r})(m,n):h(y,null,{wrap:!1,...n}):y},d=(e,t,r,n={})=>{if(null==t&&s(e))return[e];if(!s(e)||!s(t))return f(e,t,n);if("function"==typeof r)return d(e,t,1,{transform:r});if(o(r))return d(e,t,0,r);let i={...n};return!0===i.capture&&(i.wrap=!0),r=r||i.step||1,A(r)?A(e)&&A(t)?p(e,t,r,i):((e,t,r=1,n={})=>{if(!A(e)&&e.length>1||!A(t)&&t.length>1)return f(e,t,n);let i=n.transform||(e=>String.fromCharCode(e)),o=(""+e).charCodeAt(0),s=(""+t).charCodeAt(0),a=o>s,c=Math.min(o,s),u=Math.max(o,s);if(n.toRegex&&1===r)return l(c,u,!1,n);let g=[],p=0;for(;a?o>=s:o<=s;)g.push(i(o,p)),o=a?o-r:o+r,p++;return!0===n.toRegex?h(g,null,{wrap:!1,options:n}):g})(e,t,Math.max(Math.abs(r),1),i):null==r||o(r)?d(e,t,1,r):((e,t)=>{if(!0===t.strictRanges)throw new TypeError(`Expected step "${e}" to be a number`);return[]})(r,i)};e.exports=d},50683:e=>{e.exports=function(e){return[...e].reduce((e,[t,r])=>(e[t]=r,e),{})}},13302:(e,t,r)=>{e.exports=r(35747).constants||r(27619)},28123:(e,t,r)=>{"use strict";const n=r(44380),i=r(28614).EventEmitter,o=r(35747),s=process.binding("fs"),A=(s.writeBuffers,s.FSReqWrap),a=Symbol("_autoClose"),c=Symbol("_close"),u=Symbol("_ended"),l=Symbol("_fd"),h=Symbol("_finished"),g=Symbol("_flags"),f=Symbol("_flush"),p=Symbol("_handleChunk"),d=Symbol("_makeBuf"),C=Symbol("_mode"),E=Symbol("_needDrain"),I=Symbol("_onerror"),m=Symbol("_onopen"),y=Symbol("_onread"),w=Symbol("_onwrite"),B=Symbol("_open"),Q=Symbol("_path"),v=Symbol("_pos"),D=Symbol("_queue"),b=Symbol("_read"),S=Symbol("_readSize"),k=Symbol("_reading"),x=Symbol("_remain"),F=Symbol("_size"),M=Symbol("_write"),N=Symbol("_writing"),R=Symbol("_defaultFlag");class K extends n{constructor(e,t){if(super(t=t||{}),this.writable=!1,"string"!=typeof e)throw new TypeError("path must be a string");this[l]="number"==typeof t.fd?t.fd:null,this[Q]=e,this[S]=t.readSize||16777216,this[k]=!1,this[F]="number"==typeof t.size?t.size:1/0,this[x]=this[F],this[a]="boolean"!=typeof t.autoClose||t.autoClose,"number"==typeof this[l]?this[b]():this[B]()}get fd(){return this[l]}get path(){return this[Q]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[B](){o.open(this[Q],"r",(e,t)=>this[m](e,t))}[m](e,t){e?this[I](e):(this[l]=t,this.emit("open",t),this[b]())}[d](){return Buffer.allocUnsafe(Math.min(this[S],this[x]))}[b](){if(!this[k]){this[k]=!0;const e=this[d]();if(0===e.length)return process.nextTick(()=>this[y](null,0,e));o.read(this[l],e,0,e.length,null,(e,t,r)=>this[y](e,t,r))}}[y](e,t,r){this[k]=!1,e?this[I](e):this[p](t,r)&&this[b]()}[c](){this[a]&&"number"==typeof this[l]&&(o.close(this[l],e=>this.emit("close")),this[l]=null)}[I](e){this[k]=!0,this[c](),this.emit("error",e)}[p](e,t){let r=!1;return this[x]-=e,e>0&&(r=super.write(ethis[m](e,t))}[m](e,t){this[R]&&"r+"===this[g]&&e&&"ENOENT"===e.code?(this[g]="w",this[B]()):e?this[I](e):(this[l]=t,this.emit("open",t),this[f]())}end(e,t){e&&this.write(e,t),this[u]=!0,this[N]||this[D].length||"number"!=typeof this[l]||this[w](null,0)}write(e,t){return"string"==typeof e&&(e=new Buffer(e,t)),this[u]?(this.emit("error",new Error("write() after end()")),!1):null===this[l]||this[N]||this[D].length?(this[D].push(e),this[E]=!0,!1):(this[N]=!0,this[M](e),!0)}[M](e){o.write(this[l],e,0,e.length,this[v],(e,t)=>this[w](e,t))}[w](e,t){e?this[I](e):(null!==this[v]&&(this[v]+=t),this[D].length?this[f]():(this[N]=!1,this[u]&&!this[h]?(this[h]=!0,this[c](),this.emit("finish")):this[E]&&(this[E]=!1,this.emit("drain"))))}[f](){if(0===this[D].length)this[u]&&this[w](null,0);else if(1===this[D].length)this[M](this[D].pop());else{const e=this[D];this[D]=[],T(this[l],e,this[v],(e,t)=>this[w](e,t))}}[c](){this[a]&&"number"==typeof this[l]&&(o.close(this[l],e=>this.emit("close")),this[l]=null)}}const T=(e,t,r,n)=>{const i=new A;i.oncomplete=(e,r)=>n(e,r,t),s.writeBuffers(e,t,r,i)};t.ReadStream=K,t.ReadStreamSync=class extends K{[B](){let e=!0;try{this[m](null,o.openSync(this[Q],"r")),e=!1}finally{e&&this[c]()}}[b](){let e=!0;try{if(!this[k]){for(this[k]=!0;;){const e=this[d](),t=0===e.length?0:o.readSync(this[l],e,0,e.length,null);if(!this[p](t,e))break}this[k]=!1}e=!1}finally{e&&this[c]()}}[c](){if(this[a]&&"number"==typeof this[l]){try{o.closeSync(this[l])}catch(e){}this[l]=null,this.emit("close")}}},t.WriteStream=L,t.WriteStreamSync=class extends L{[B](){let e;try{e=o.openSync(this[Q],this[g],this[C])}catch(e){if(this[R]&&"r+"===this[g]&&e&&"ENOENT"===e.code)return this[g]="w",this[B]();throw e}this[m](null,e)}[c](){if(this[a]&&"number"==typeof this[l]){try{o.closeSync(this[l])}catch(e){}this[l]=null,this.emit("close")}}[M](e){try{this[w](null,o.writeSync(this[l],e,0,e.length,this[v]))}catch(e){this[w](e,0)}}}},33198:(e,t,r)=>{e.exports=u,u.realpath=u,u.sync=l,u.realpathSync=l,u.monkeypatch=function(){n.realpath=u,n.realpathSync=l},u.unmonkeypatch=function(){n.realpath=i,n.realpathSync=o};var n=r(35747),i=n.realpath,o=n.realpathSync,s=process.version,A=/^v[0-5]\./.test(s),a=r(7343);function c(e){return e&&"realpath"===e.syscall&&("ELOOP"===e.code||"ENOMEM"===e.code||"ENAMETOOLONG"===e.code)}function u(e,t,r){if(A)return i(e,t,r);"function"==typeof t&&(r=t,t=null),i(e,t,(function(n,i){c(n)?a.realpath(e,t,r):r(n,i)}))}function l(e,t){if(A)return o(e,t);try{return o(e,t)}catch(r){if(c(r))return a.realpathSync(e,t);throw r}}},7343:(e,t,r)=>{var n=r(85622),i="win32"===process.platform,o=r(35747),s=process.env.NODE_DEBUG&&/fs/.test(process.env.NODE_DEBUG);function A(e){return"function"==typeof e?e:function(){var e;if(s){var t=new Error;e=function(e){e&&(t.message=e.message,r(e=t))}}else e=r;return e;function r(e){if(e){if(process.throwDeprecation)throw e;if(!process.noDeprecation){var t="fs: missing callback "+(e.stack||e.message);process.traceDeprecation?console.trace(t):console.error(t)}}}}()}n.normalize;if(i)var a=/(.*?)(?:[\/\\]+|$)/g;else a=/(.*?)(?:[\/]+|$)/g;if(i)var c=/^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/;else c=/^[\/]*/;t.realpathSync=function(e,t){if(e=n.resolve(e),t&&Object.prototype.hasOwnProperty.call(t,e))return t[e];var r,s,A,u,l=e,h={},g={};function f(){var t=c.exec(e);r=t[0].length,s=t[0],A=t[0],u="",i&&!g[A]&&(o.lstatSync(A),g[A]=!0)}for(f();r=e.length)return t&&(t[g]=e),r(null,e);a.lastIndex=s;var n=a.exec(e);return h=u,u+=n[0],l=h+n[1],s=a.lastIndex,p[l]||t&&t[l]===l?process.nextTick(C):t&&Object.prototype.hasOwnProperty.call(t,l)?m(t[l]):o.lstat(l,E)}function E(e,n){if(e)return r(e);if(!n.isSymbolicLink())return p[l]=!0,t&&(t[l]=l),process.nextTick(C);if(!i){var s=n.dev.toString(32)+":"+n.ino.toString(32);if(f.hasOwnProperty(s))return I(null,f[s],l)}o.stat(l,(function(e){if(e)return r(e);o.readlink(l,(function(e,t){i||(f[s]=t),I(e,t)}))}))}function I(e,i,o){if(e)return r(e);var s=n.resolve(h,i);t&&(t[o]=s),m(s)}function m(t){e=n.resolve(t,e.slice(s)),d()}d()}},72137:(e,t,r)=>{"use strict";const{PassThrough:n}=r(92413);e.exports=e=>{e={...e};const{array:t}=e;let{encoding:r}=e;const i="buffer"===r;let o=!1;t?o=!(r||i):r=r||"utf8",i&&(r=null);const s=new n({objectMode:o});r&&s.setEncoding(r);let A=0;const a=[];return s.on("data",e=>{a.push(e),o?A=a.length:A+=e.length}),s.getBufferedValue=()=>t?a:i?Buffer.concat(a,A):a.join(""),s.getBufferedLength=()=>A,s}},58764:(e,t,r)=>{"use strict";const n=r(50372),i=r(72137);class o extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}}async function s(e,t){if(!e)return Promise.reject(new Error("Expected a stream"));t={maxBuffer:1/0,...t};const{maxBuffer:r}=t;let s;return await new Promise((A,a)=>{const c=e=>{e&&(e.bufferedData=s.getBufferedValue()),a(e)};s=n(e,i(t),e=>{e?c(e):A()}),s.on("data",()=>{s.getBufferedLength()>r&&c(new o)})}),s.getBufferedValue()}e.exports=s,e.exports.default=s,e.exports.buffer=(e,t)=>s(e,{...t,encoding:"buffer"}),e.exports.array=(e,t)=>s(e,{...t,array:!0}),e.exports.MaxBufferError=o},72171:(e,t,r)=>{function n(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.alphasort=c,t.alphasorti=a,t.setopts=function(e,t,r){r||(r={});if(r.matchBase&&-1===t.indexOf("/")){if(r.noglobstar)throw new Error("base matching requires globstar");t="**/"+t}e.silent=!!r.silent,e.pattern=t,e.strict=!1!==r.strict,e.realpath=!!r.realpath,e.realpathCache=r.realpathCache||Object.create(null),e.follow=!!r.follow,e.dot=!!r.dot,e.mark=!!r.mark,e.nodir=!!r.nodir,e.nodir&&(e.mark=!0);e.sync=!!r.sync,e.nounique=!!r.nounique,e.nonull=!!r.nonull,e.nosort=!!r.nosort,e.nocase=!!r.nocase,e.stat=!!r.stat,e.noprocess=!!r.noprocess,e.absolute=!!r.absolute,e.maxLength=r.maxLength||1/0,e.cache=r.cache||Object.create(null),e.statCache=r.statCache||Object.create(null),e.symlinks=r.symlinks||Object.create(null),function(e,t){e.ignore=t.ignore||[],Array.isArray(e.ignore)||(e.ignore=[e.ignore]);e.ignore.length&&(e.ignore=e.ignore.map(u))}(e,r),e.changedCwd=!1;var o=process.cwd();n(r,"cwd")?(e.cwd=i.resolve(r.cwd),e.changedCwd=e.cwd!==o):e.cwd=o;e.root=r.root||i.resolve(e.cwd,"/"),e.root=i.resolve(e.root),"win32"===process.platform&&(e.root=e.root.replace(/\\/g,"/"));e.cwdAbs=s(e.cwd)?e.cwd:l(e,e.cwd),"win32"===process.platform&&(e.cwdAbs=e.cwdAbs.replace(/\\/g,"/"));e.nomount=!!r.nomount,r.nonegate=!0,r.nocomment=!0,e.minimatch=new A(t,r),e.options=e.minimatch.options},t.ownProp=n,t.makeAbs=l,t.finish=function(e){for(var t=e.nounique,r=t?[]:Object.create(null),n=0,i=e.matches.length;n{e.exports=I;var n=r(35747),i=r(33198),o=r(52670),s=(o.Minimatch,r(85870)),A=r(28614).EventEmitter,a=r(85622),c=r(42357),u=r(71471),l=r(131),h=r(72171),g=(h.alphasort,h.alphasorti,h.setopts),f=h.ownProp,p=r(24679),d=(r(31669),h.childrenIgnored),C=h.isIgnored,E=r(91162);function I(e,t,r){if("function"==typeof t&&(r=t,t={}),t||(t={}),t.sync){if(r)throw new TypeError("callback provided to sync glob");return l(e,t)}return new y(e,t,r)}I.sync=l;var m=I.GlobSync=l.GlobSync;function y(e,t,r){if("function"==typeof t&&(r=t,t=null),t&&t.sync){if(r)throw new TypeError("callback provided to sync glob");return new m(e,t)}if(!(this instanceof y))return new y(e,t,r);g(this,e,t),this._didRealPath=!1;var n=this.minimatch.set.length;this.matches=new Array(n),"function"==typeof r&&(r=E(r),this.on("error",r),this.on("end",(function(e){r(null,e)})));var i=this;if(this._processing=0,this._emitQueue=[],this._processQueue=[],this.paused=!1,this.noprocess)return this;if(0===n)return s();for(var o=0;o1)return!0;for(var i=0;ithis.maxLength)return t();if(!this.stat&&f(this.cache,r)){var o=this.cache[r];if(Array.isArray(o)&&(o="DIR"),!i||"DIR"===o)return t(null,o);if(i&&"FILE"===o)return t()}var s=this.statCache[r];if(void 0!==s){if(!1===s)return t(null,s);var A=s.isDirectory()?"DIR":"FILE";return i&&"FILE"===A?t():t(null,A,s)}var a=this,c=p("stat\0"+r,(function(i,o){if(o&&o.isSymbolicLink())return n.stat(r,(function(n,i){n?a._stat2(e,r,null,o,t):a._stat2(e,r,n,i,t)}));a._stat2(e,r,i,o,t)}));c&&n.lstat(r,c)},y.prototype._stat2=function(e,t,r,n,i){if(r&&("ENOENT"===r.code||"ENOTDIR"===r.code))return this.statCache[t]=!1,i();var o="/"===e.slice(-1);if(this.statCache[t]=n,"/"===t.slice(-1)&&n&&!n.isDirectory())return i(null,!1,n);var s=!0;return n&&(s=n.isDirectory()?"DIR":"FILE"),this.cache[t]=this.cache[t]||s,o&&"FILE"===s?i():i(null,s,n)}},131:(e,t,r)=>{e.exports=f,f.GlobSync=p;var n=r(35747),i=r(33198),o=r(52670),s=(o.Minimatch,r(8401).Glob,r(31669),r(85622)),A=r(42357),a=r(71471),c=r(72171),u=(c.alphasort,c.alphasorti,c.setopts),l=c.ownProp,h=c.childrenIgnored,g=c.isIgnored;function f(e,t){if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");return new p(e,t).found}function p(e,t){if(!e)throw new Error("must provide pattern");if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");if(!(this instanceof p))return new p(e,t);if(u(this,e,t),this.noprocess)return this;var r=this.minimatch.set.length;this.matches=new Array(r);for(var n=0;nthis.maxLength)return!1;if(!this.stat&&l(this.cache,t)){var i=this.cache[t];if(Array.isArray(i)&&(i="DIR"),!r||"DIR"===i)return i;if(r&&"FILE"===i)return!1}var o=this.statCache[t];if(!o){var s;try{s=n.lstatSync(t)}catch(e){if(e&&("ENOENT"===e.code||"ENOTDIR"===e.code))return this.statCache[t]=!1,!1}if(s&&s.isSymbolicLink())try{o=n.statSync(t)}catch(e){o=s}else o=s}this.statCache[t]=o;i=!0;return o&&(i=o.isDirectory()?"DIR":"FILE"),this.cache[t]=this.cache[t]||i,(!r||"FILE"!==i)&&i},p.prototype._mark=function(e){return c.mark(this,e)},p.prototype._makeAbs=function(e){return c.makeAbs(this,e)}},97098:(e,t,r)=>{"use strict";var n=r(18193),i=r(85622).posix.dirname,o="win32"===r(12087).platform(),s=/\\/g,A=/[\{\[].*[\/]*.*[\}\]]$/,a=/(^|[^\\])([\{\[]|\([^\)]+$)/,c=/\\([\*\?\|\[\]\(\)\{\}])/g;e.exports=function(e,t){Object.assign({flipBackslashes:!0},t).flipBackslashes&&o&&e.indexOf("/")<0&&(e=e.replace(s,"/")),A.test(e)&&(e+="/"),e+="a";do{e=i(e)}while(n(e)||a.test(e));return e.replace(c,"$1")}},22787:(e,t,r)=>{"use strict";const{promisify:n}=r(31669),i=r(35747),o=r(85622),s=r(19347),A=r(46458),a=r(17234),c=["**/node_modules/**","**/flow-typed/**","**/coverage/**","**/.git"],u=n(i.readFile),l=(e,t)=>{const r=a(o.relative(t.cwd,o.dirname(t.fileName)));return e.split(/\r?\n/).filter(Boolean).filter(e=>!e.startsWith("#")).map((e=>t=>t.startsWith("!")?"!"+o.posix.join(e,t.slice(1)):o.posix.join(e,t))(r))},h=e=>e.reduce((e,t)=>(e.add(l(t.content,{cwd:t.cwd,fileName:t.filePath})),e),A()),g=(e,t)=>r=>e.ignores(a(o.relative(t,((e,t)=>{if(o.isAbsolute(t)){if(t.startsWith(e))return t;throw new Error(`Path ${t} is not in cwd ${e}`)}return o.join(e,t)})(t,r)))),f=({ignore:e=[],cwd:t=process.cwd()}={})=>({ignore:e,cwd:t});e.exports=async e=>{e=f(e);const t=await s("**/.gitignore",{ignore:c.concat(e.ignore),cwd:e.cwd}),r=await Promise.all(t.map(t=>(async(e,t)=>{const r=o.join(t,e);return{cwd:t,filePath:r,content:await u(r,"utf8")}})(t,e.cwd))),n=h(r);return g(n,e.cwd)},e.exports.sync=e=>{e=f(e);const t=s.sync("**/.gitignore",{ignore:c.concat(e.ignore),cwd:e.cwd}).map(t=>((e,t)=>{const r=o.join(t,e);return{cwd:t,filePath:r,content:i.readFileSync(r,"utf8")}})(t,e.cwd)),r=h(t);return g(r,e.cwd)}},18710:(e,t,r)=>{"use strict";const n=r(35747),i=r(39920),o=r(55598),s=r(8401),A=r(19347),a=r(66241),c=r(22787),{FilterStream:u,UniqueStream:l}=r(90330),h=()=>!1,g=e=>"!"===e[0],f=(e,t)=>{(e=>{if(!e.every(e=>"string"==typeof e))throw new TypeError("Patterns must be a string or an array of strings")})(e=i([].concat(e))),((e={})=>{if(!e.cwd)return;let t;try{t=n.statSync(e.cwd)}catch(e){return}if(!t.isDirectory())throw new Error("The `cwd` option must be a path to a directory")})(t);const r=[];t={ignore:[],expandDirectories:!0,...t};for(const[n,i]of e.entries()){if(g(i))continue;const o=e.slice(n).filter(g).map(e=>e.slice(1)),s={...t,ignore:t.ignore.concat(o)};r.push({pattern:i,options:s})}return r},p=(e,t)=>e.options.expandDirectories?((e,t)=>{let r={};return e.options.cwd&&(r.cwd=e.options.cwd),Array.isArray(e.options.expandDirectories)?r={...r,files:e.options.expandDirectories}:"object"==typeof e.options.expandDirectories&&(r={...r,...e.options.expandDirectories}),t(e.pattern,r)})(e,t):[e.pattern],d=e=>e&&e.gitignore?c.sync({cwd:e.cwd,ignore:e.ignore}):h,C=e=>t=>{const{options:r}=e;return r.ignore&&Array.isArray(r.ignore)&&r.expandDirectories&&(r.ignore=a.sync(r.ignore)),{pattern:t,options:r}};e.exports=async(e,t)=>{const r=f(e,t),[o,s]=await Promise.all([(async()=>t&&t.gitignore?c({cwd:t.cwd,ignore:t.ignore}):h)(),(async()=>{const e=await Promise.all(r.map(async e=>{const t=await p(e,a);return Promise.all(t.map(C(e)))}));return i(...e)})()]),u=await Promise.all(s.map(e=>A(e.pattern,e.options)));return i(...u).filter(e=>{return!o((t=e,t.stats instanceof n.Stats?t.path:t));var t})},e.exports.sync=(e,t)=>{const r=f(e,t).reduce((e,t)=>{const r=p(t,a.sync).map(C(t));return e.concat(r)},[]),n=d(t);return r.reduce((e,t)=>i(e,A.sync(t.pattern,t.options)),[]).filter(e=>!n(e))},e.exports.stream=(e,t)=>{const r=f(e,t).reduce((e,t)=>{const r=p(t,a.sync).map(C(t));return e.concat(r)},[]),n=d(t),i=new u(e=>!n(e)),s=new l;return o(r.map(e=>A.stream(e.pattern,e.options))).pipe(i).pipe(s)},e.exports.generateGlobTasks=f,e.exports.hasMagic=(e,t)=>[].concat(e).some(e=>s.hasMagic(e,t)),e.exports.gitignore=c},90330:(e,t,r)=>{"use strict";const{Transform:n}=r(92413);class i extends n{constructor(){super({objectMode:!0})}}e.exports={FilterStream:class extends i{constructor(e){super(),this._filter=e}_transform(e,t,r){this._filter(e)&&this.push(e),r()}},UniqueStream:class extends i{constructor(){super(),this._pushed=new Set}_transform(e,t,r){this._pushed.has(e)||(this.push(e),this._pushed.add(e)),r()}}}},67078:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(27143),i=new Set([413,429,503]),o=e=>e instanceof n.HTTPError||e instanceof n.ParseError||e instanceof n.MaxRedirectsError;t.default=({attemptCount:e,retryOptions:t,error:r})=>{if(e>t.limit)return 0;const n=t.methods.includes(r.options.method),s=t.errorCodes.includes(r.code),A=o(r)&&t.statusCodes.includes(r.response.statusCode);if(!n||!s&&!A)return 0;if(o(r)){const{response:e}=r;if(e&&"retry-after"in e.headers&&i.has(e.statusCode)){let r=Number(e.headers["retry-after"]);return Number.isNaN(r)?r=Date.parse(e.headers["retry-after"])-Date.now():r*=1e3,void 0===t.maxRetryAfter||r>t.maxRetryAfter?0:r}if(413===e.statusCode)return 0}return 2**(e-1)*1e3+100*Math.random()}},39560:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8189),i=r(27143),o=r(8859);o.knownHookEvents.includes("beforeRetry")||o.knownHookEvents.push("beforeRetry","afterResponse"),t.knownBodyTypes=["json","buffer","text"],t.parseBody=(e,t,r)=>{const{rawBody:n}=e;try{if("text"===t)return n.toString(r);if("json"===t)return 0===n.length?"":JSON.parse(n.toString());if("buffer"===t)return Buffer.from(n);throw new i.ParseError({message:`Unknown body type '${t}'`,name:"Error"},e)}catch(t){throw new i.ParseError(t,e)}};class s extends o.default{static normalizeArguments(e,t,r){const i=super.normalizeArguments(e,t,r);if(n.default.null_(i.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");n.assert.any([n.default.string,n.default.undefined],i.encoding),n.assert.any([n.default.boolean,n.default.undefined],i.resolveBodyOnly),n.assert.any([n.default.boolean,n.default.undefined],i.methodRewriting),n.assert.any([n.default.boolean,n.default.undefined],i.isStream);const{retry:o}=i;if(i.retry=r?{...r.retry}:{calculateDelay:e=>e.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},n.default.object(o)?(i.retry={...i.retry,...o},i.retry.methods=[...new Set(i.retry.methods.map(e=>e.toUpperCase()))],i.retry.statusCodes=[...new Set(i.retry.statusCodes)],i.retry.errorCodes=[...new Set(i.retry.errorCodes)]):n.default.number(o)&&(i.retry.limit=o),n.default.undefined(i.retry.maxRetryAfter)&&(i.retry.maxRetryAfter=Math.min(...[i.timeout.request,i.timeout.connect].filter(n.default.number))),n.default.object(i.pagination)){r&&(i.pagination={...r.pagination,...i.pagination});const{pagination:e}=i;if(!n.default.function_(e.transform))throw new Error("`options.pagination.transform` must be implemented");if(!n.default.function_(e.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!n.default.function_(e.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!n.default.function_(e.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return"json"===i.responseType&&void 0===i.headers.accept&&(i.headers.accept="application/json"),i}static mergeOptions(...e){let t;for(const r of e)t=s.normalizeArguments(void 0,r,t);return t}async _beforeError(e){e instanceof o.RequestError||(e=new o.RequestError(e.message,e,this)),this.emit("error",e)}}t.default=s},57019:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(27143);t.default=function(e,...t){const r=(async()=>{if(e instanceof n.RequestError)try{for(const r of t)if(r)for(const t of r)e=await t(e)}catch(t){e=t}throw e})(),i=()=>r;return r.json=i,r.text=i,r.buffer=i,r.on=i,r}},74850:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(28614),i=r(58764),o=r(59351),s=r(67078),A=r(27143),a=r(39560);t.PromisableRequest=a.default;const c=r(63227),u=["request","response","redirect","uploadProgress","downloadProgress"];t.default=function e(t){let r,l,h=0;const g=new n.EventEmitter,f=new o((n,o,p)=>{const d=()=>{const{throwHttpErrors:C}=t;C||(t.throwHttpErrors=!0);const E=new a.default(t.url,t);E._noPipe=!0,p(()=>E.destroy());const I=async e=>{try{for(const r of t.hooks.beforeError)e=await r(e)}catch(e){return void o(new A.RequestError(e.message,e,E))}o(e)};r=E,E.once("response",async r=>{if(r.retryCount=h,r.request.aborted)return;const o=()=>{const{statusCode:e}=r,n=t.followRedirect?299:399;return e>=200&&e<=n||304===e};let s;try{s=await i.buffer(E),r.rawBody=s}catch(e){return}try{r.body=a.parseBody(r,t.responseType,t.encoding)}catch(e){if(r.body=s.toString(),o())return void I(e)}try{for(const[n,i]of t.hooks.afterResponse.entries())r=await i(r,async r=>{const i=a.default.normalizeArguments(void 0,{...r,retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1},t);i.hooks.afterResponse=i.hooks.afterResponse.slice(0,n);for(const e of i.hooks.beforeRetry)await e(i);const o=e(i);return p(()=>{o.catch(()=>{}),o.cancel()}),o})}catch(e){return void I(new A.RequestError(e.message,e,E))}!C||o()?(l=r,n(t.resolveBodyOnly?r.body:r)):I(new A.HTTPError(r))}),E.once("error",e=>{if(f.isCanceled)return;if(!E.options)return void I(e);let r;h++;try{r=t.retry.calculateDelay({attemptCount:h,retryOptions:t.retry,error:e,computedValue:s.default({attemptCount:h,retryOptions:t.retry,error:e,computedValue:0})})}catch(t){return E.destroy(),void I(new A.RequestError(t.message,e,E))}if(r){E.destroy();setTimeout(async()=>{t.throwHttpErrors=C;try{for(const r of t.hooks.beforeRetry)await r(t,e,h)}catch(t){return E.destroy(),void I(new A.RequestError(t.message,e,E))}d()},r)}else h--,e instanceof A.HTTPError||(E.destroy(),I(e))}),c.default(E,g,u)};d()});f.on=(e,t)=>(g.on(e,t),f);const p=e=>{const r=(async()=>(await f,a.parseBody(l,e,t.encoding)))();return Object.defineProperties(r,Object.getOwnPropertyDescriptors(f)),r};return f.json=()=>(r.writableFinished||void 0!==t.headers.accept||(t.headers.accept="application/json"),p("json")),f.buffer=()=>p("buffer"),f.text=()=>p("text"),f},function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(27143))},27143:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(59351);t.CancelError=n.CancelError;const i=r(8859);t.RequestError=i.RequestError,t.MaxRedirectsError=i.MaxRedirectsError,t.CacheError=i.CacheError,t.UploadError=i.UploadError,t.TimeoutError=i.TimeoutError,t.HTTPError=i.HTTPError,t.ReadError=i.ReadError,t.UnsupportedProtocolError=i.UnsupportedProtocolError;class o extends i.RequestError{constructor(e,t){const{options:r}=t.request;super(`${e.message} in "${r.url.toString()}"`,e,t.request),this.name="ParseError",Object.defineProperty(this,"response",{enumerable:!1,value:t})}}t.ParseError=o},8859:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(31669),i=r(92413),o=r(35747),s=r(78835),A=r(98605),a=r(98605),c=r(57211),u=r(98298),l=r(53832),h=r(43261),g=r(11200),f=r(9453),p=r(55737),d=r(58764),C=r(8189),E=r(96596),I=r(35637),m=r(63227),y=r(32449),w=r(13656),B=r(80972),Q=r(30291),v=Symbol("request"),D=Symbol("response"),b=Symbol("responseSize"),S=Symbol("downloadedSize"),k=Symbol("bodySize"),x=Symbol("uploadedSize"),F=Symbol("serverResponsesPiped"),M=Symbol("unproxyEvents"),N=Symbol("isFromCache"),R=Symbol("cancelTimeouts"),K=Symbol("startedReading"),L=Symbol("stopReading"),T=Symbol("triggerRead"),P=Symbol("body"),U=Symbol("jobs"),_=Symbol("originalResponse");t.kIsNormalizedAlready=Symbol("isNormalizedAlready");const O=C.default.string(process.versions.brotli);t.withoutBody=new Set(["GET","HEAD"]),t.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError"];const j=new Q.default,Y=new Set([300,301,302,303,304,307,308]),G=["context","body","json","form"];class J extends Error{constructor(e,t,r){var n;if(super(e),Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=t.code,r instanceof ee?(Object.defineProperty(this,"request",{enumerable:!1,value:r}),Object.defineProperty(this,"response",{enumerable:!1,value:r[D]}),Object.defineProperty(this,"options",{enumerable:!1,value:r.options})):Object.defineProperty(this,"options",{enumerable:!1,value:r}),this.timings=null===(n=this.request)||void 0===n?void 0:n.timings,!C.default.undefined(t.stack)){const e=this.stack.indexOf(this.message)+this.message.length,r=this.stack.slice(e).split("\n").reverse(),n=t.stack.slice(t.stack.indexOf(t.message)+t.message.length).split("\n").reverse();for(;0!==n.length&&n[0]===r[0];)r.shift();this.stack=`${this.stack.slice(0,e)}${r.reverse().join("\n")}${n.reverse().join("\n")}`}}}t.RequestError=J;class H extends J{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e),this.name="MaxRedirectsError"}}t.MaxRedirectsError=H;class q extends J{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request),this.name="HTTPError"}}t.HTTPError=q;class z extends J{constructor(e,t){super(e.message,e,t),this.name="CacheError"}}t.CacheError=z;class W extends J{constructor(e,t){super(e.message,e,t),this.name="UploadError"}}t.UploadError=W;class V extends J{constructor(e,t,r){super(e.message,e,r),this.name="TimeoutError",this.event=e.event,this.timings=t}}t.TimeoutError=V;class X extends J{constructor(e,t){super(e.message,e,t),this.name="ReadError"}}t.ReadError=X;class Z extends J{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e),this.name="UnsupportedProtocolError"}}t.UnsupportedProtocolError=Z;const $=["socket","connect","continue","information","upgrade","timeout"];class ee extends i.Duplex{constructor(e,r={},n){super({highWaterMark:0}),this[S]=0,this[x]=0,this.requestInitialized=!1,this[F]=new Set,this.redirects=[],this[L]=!1,this[T]=!1,this[U]=[],this._progressCallbacks=[];const i=()=>this._unlockWrite(),s=()=>this._lockWrite();this.on("pipe",e=>{e.prependListener("data",i),e.on("data",s),e.prependListener("end",i),e.on("end",s)}),this.on("unpipe",e=>{e.off("data",i),e.off("data",s),e.off("end",i),e.off("end",s)}),this.on("pipe",e=>{e instanceof a.IncomingMessage&&(this.options.headers={...e.headers,...this.options.headers})});const{json:A,body:c,form:u}=r;(A||c||u)&&this._lockWrite(),(async r=>{var i;try{r.body instanceof o.ReadStream&&await(async e=>new Promise((t,r)=>{const n=e=>{r(e)};e.once("error",n),e.once("open",()=>{e.off("error",n),t()})}))(r.body),t.kIsNormalizedAlready in r?this.options=r:this.options=this.constructor.normalizeArguments(e,r,n);const{url:s}=this.options;if(!s)throw new TypeError("Missing `url` property");if(this.requestUrl=s.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed)return void(null===(i=this[v])||void 0===i||i.destroy());for(const e of this[U])e();this.requestInitialized=!0}catch(e){if(e instanceof J)return void this._beforeError(e);this.destroyed||this.destroy(e)}})(r)}static normalizeArguments(e,r,i){var o,A,a,c;const u=r;if(C.default.object(e)&&!C.default.urlInstance(e))r={...i,...e,...r};else{if(e&&r&&r.url)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");r={...i,...r},e&&(r.url=e),C.default.urlInstance(r.url)&&(r.url=new s.URL(r.url.toString()))}if(!1===r.cache&&(r.cache=void 0),!1===r.dnsCache&&(r.dnsCache=void 0),C.assert.any([C.default.string,C.default.undefined],r.method),C.assert.any([C.default.object,C.default.undefined],r.headers),C.assert.any([C.default.string,C.default.urlInstance,C.default.undefined],r.prefixUrl),C.assert.any([C.default.object,C.default.undefined],r.cookieJar),C.assert.any([C.default.object,C.default.string,C.default.undefined],r.searchParams),C.assert.any([C.default.object,C.default.string,C.default.undefined],r.cache),C.assert.any([C.default.object,C.default.number,C.default.undefined],r.timeout),C.assert.any([C.default.object,C.default.undefined],r.context),C.assert.any([C.default.object,C.default.undefined],r.hooks),C.assert.any([C.default.boolean,C.default.undefined],r.decompress),C.assert.any([C.default.boolean,C.default.undefined],r.ignoreInvalidCookies),C.assert.any([C.default.boolean,C.default.undefined],r.followRedirect),C.assert.any([C.default.number,C.default.undefined],r.maxRedirects),C.assert.any([C.default.boolean,C.default.undefined],r.throwHttpErrors),C.assert.any([C.default.boolean,C.default.undefined],r.http2),C.assert.any([C.default.boolean,C.default.undefined],r.allowGetBody),C.assert.any([C.default.boolean,C.default.undefined],r.rejectUnauthorized),C.default.string(r.method)?r.method=r.method.toUpperCase():r.method="GET",r.headers===(null==i?void 0:i.headers)?r.headers={...r.headers}:r.headers=p({...null==i?void 0:i.headers,...r.headers}),"slashes"in r)throw new TypeError("The legacy `url.Url` has been deprecated. Use `URL` instead.");if("auth"in r)throw new TypeError("Parameter `auth` is deprecated. Use `username` / `password` instead.");if("searchParams"in r&&r.searchParams&&r.searchParams!==(null==i?void 0:i.searchParams)){C.default.string(r.searchParams)||r.searchParams instanceof s.URLSearchParams||function(e){for(const t in e){const r=e[t];if(!(C.default.string(r)||C.default.number(r)||C.default.boolean(r)||C.default.null_(r)))throw new TypeError(`The \`searchParams\` value '${String(r)}' must be a string, number, boolean or null`)}}(r.searchParams);const e=new s.URLSearchParams(r.searchParams);null===(o=null==i?void 0:i.searchParams)||void 0===o||o.forEach((t,r)=>{e.has(r)||e.append(r,t)}),r.searchParams=e}if(r.username=null!==(A=r.username)&&void 0!==A?A:"",r.password=null!==(a=r.password)&&void 0!==a?a:"",r.prefixUrl?(r.prefixUrl=r.prefixUrl.toString(),""===r.prefixUrl||r.prefixUrl.endsWith("/")||(r.prefixUrl+="/")):r.prefixUrl="",C.default.string(r.url)){if(r.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");r.url=B.default(r.prefixUrl+r.url,r)}else(C.default.undefined(r.url)&&""!==r.prefixUrl||r.protocol)&&(r.url=B.default(r.prefixUrl,r));if(r.url){let{prefixUrl:e}=r;Object.defineProperty(r,"prefixUrl",{set:t=>{const n=r.url;if(!n.href.startsWith(t))throw new Error(`Cannot change \`prefixUrl\` from ${e} to ${t}: ${n.href}`);r.url=new s.URL(t+n.href.slice(e.length)),e=t},get:()=>e});let{protocol:t}=r.url;if("unix:"===t&&(t="http:",r.url=new s.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),r.url.search){const e="_GOT_INTERNAL_TRIGGER_NORMALIZATION";r.url.searchParams.append(e,""),r.url.searchParams.delete(e)}if("http:"!==t&&"https:"!==t)throw new Z(r);""===r.username?r.username=r.url.username:r.url.username=r.username,""===r.password?r.password=r.url.password:r.url.password=r.password}const{cookieJar:l}=r;if(l){let{setCookie:e,getCookieString:t}=l;C.assert.function_(e),C.assert.function_(t),4===e.length&&0===t.length&&(e=n.promisify(e.bind(r.cookieJar)),t=n.promisify(t.bind(r.cookieJar)),r.cookieJar={setCookie:e,getCookieString:t})}const{cache:f}=r;if(f&&(j.has(f)||j.set(f,new g((e,t)=>e[v](e,t),f))),!0===r.dnsCache)r.dnsCache=new h.default;else if(!(C.default.undefined(r.dnsCache)||r.dnsCache instanceof h.default))throw new TypeError("Parameter `dnsCache` must be a CacheableLookup instance or a boolean, got "+C.default(r.dnsCache));C.default.number(r.timeout)?r.timeout={request:r.timeout}:i&&r.timeout!==i.timeout?r.timeout={...i.timeout,...r.timeout}:r.timeout={...r.timeout},r.context||(r.context={});const d=r.hooks===(null==i?void 0:i.hooks);r.hooks={...r.hooks};for(const e of t.knownHookEvents)if(e in r.hooks){if(!C.default.array(r.hooks[e]))throw new TypeError(`Parameter \`${e}\` must be an Array, got ${C.default(r.hooks[e])}`);r.hooks[e]=[...r.hooks[e]]}else r.hooks[e]=[];if(i&&!d)for(const e of t.knownHookEvents){0!==i.hooks[e].length&&(r.hooks[e]=[...i.hooks[e],...r.hooks[e]])}if("followRedirects"in r)throw new TypeError("The `followRedirects` option does not exist. Use `followRedirect` instead.");if(r.agent)for(const e in r.agent)if("http"!==e&&"https"!==e&&"http2"!==e)throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${e}\``);return r.maxRedirects=null!==(c=r.maxRedirects)&&void 0!==c?c:0,((e,t)=>{const r={};for(const t of e)if(t)for(const e of G)e in t&&(r[e]={writable:!0,configurable:!0,enumerable:!1,value:t[e]});Object.defineProperties(t,r)})([i,u],r),r}_lockWrite(){const e=()=>{throw new TypeError("The payload has been already provided")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){const{options:e}=this,{headers:r}=e,n=!C.default.undefined(e.form),o=!C.default.undefined(e.json),A=!C.default.undefined(e.body),a=n||o||A,c=t.withoutBody.has(e.method)&&!("GET"===e.method&&e.allowGetBody);if(this._cannotHaveBody=c,a){if(c)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([A,n,o].filter(e=>e).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(A&&!(e.body instanceof i.Readable)&&!C.default.string(e.body)&&!C.default.buffer(e.body)&&!I.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(n&&!C.default.object(e.form))throw new TypeError("The `form` option must be an Object");{const t=!C.default.string(r["content-type"]);A?(I.default(e.body)&&t&&(r["content-type"]="multipart/form-data; boundary="+e.body.getBoundary()),this[P]=e.body):n?(t&&(r["content-type"]="application/x-www-form-urlencoded"),this[P]=new s.URLSearchParams(e.form).toString()):(t&&(r["content-type"]="application/json"),this[P]=JSON.stringify(e.json));const i=await E.default(this[P],e.headers);C.default.undefined(r["content-length"])&&C.default.undefined(r["transfer-encoding"])&&(c||C.default.undefined(i)||(r["content-length"]=String(i)))}}else c?this._lockWrite():this._unlockWrite();this[k]=Number(r["content-length"])||void 0}async _onResponse(e){const{options:t}=this,{url:r}=t;this[_]=e,t.decompress&&(e=l(e));const n=e.statusCode,i=e;i.statusMessage=i.statusMessage?i.statusMessage:A.STATUS_CODES[n],i.url=t.url.toString(),i.requestUrl=this.requestUrl,i.redirectUrls=this.redirects,i.request=this,i.isFromCache=e.fromCache||!1,i.ip=this.ip,this[N]=i.isFromCache,this[b]=Number(e.headers["content-length"])||void 0,this[D]=e,e.once("end",()=>{this[b]=this[S],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",t=>{e.destroy(),this._beforeError(new X(t,this))}),e.once("aborted",()=>{this.aborted||this._beforeError(new X({name:"Error",message:"The server aborted the pending request"},this))}),this.emit("downloadProgress",this.downloadProgress);const o=e.headers["set-cookie"];if(C.default.object(t.cookieJar)&&o){let e=o.map(async e=>t.cookieJar.setCookie(e,r.toString()));t.ignoreInvalidCookies&&(e=e.map(async e=>e.catch(()=>{})));try{await Promise.all(e)}catch(e){return void this._beforeError(e)}}if(t.followRedirect&&e.headers.location&&Y.has(n)){e.resume(),this[v]&&(this[R](),delete this[v],this[M]());if(!(303===n&&"GET"!==t.method&&"HEAD"!==t.method)&&t.methodRewriting||(t.method="GET","body"in t&&delete t.body,"json"in t&&delete t.json,"form"in t&&delete t.form),this.redirects.length>=t.maxRedirects)return void this._beforeError(new H(this));try{const n=Buffer.from(e.headers.location,"binary").toString(),o=new s.URL(n,r),A=o.toString();decodeURI(A),o.hostname!==r.hostname&&("host"in t.headers&&delete t.headers.host,"cookie"in t.headers&&delete t.headers.cookie,"authorization"in t.headers&&delete t.headers.authorization,(t.username||t.password)&&(delete t.username,delete t.password)),this.redirects.push(A),t.url=o;for(const e of t.hooks.beforeRedirect)await e(t,i);this.emit("redirect",i,t),await this._makeRequest()}catch(e){return void this._beforeError(e)}return}const a=t.followRedirect?299:399,c=n>=200&&n<=a||304===n;if(!t.throwHttpErrors||c||(await this._beforeError(new q(i)),!this.destroyed)){e.on("readable",()=>{this[T]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(const r of this[F])if(!r.headersSent){for(const n in e.headers){const i=!t.decompress||"content-encoding"!==n,o=e.headers[n];i&&r.setHeader(n,o)}r.statusCode=n}}}_onRequest(e){const{options:t}=this,{timeout:r,url:n}=t;u.default(e),this[R]=y.default(e,r,n);const i=t.cache?"cacheableResponse":"response";e.once(i,e=>{this._onResponse(e)}),e.once("error",t=>{e.destroy(),t=t instanceof y.TimeoutError?new V(t,this.timings,this):new J(t.message,t,this),this._beforeError(t)}),this[M]=m.default(e,this,$),this[v]=e,this.emit("uploadProgress",this.uploadProgress);const o=this[P],s=0===this.redirects.length?this:e;C.default.nodeStream(o)?(o.pipe(s),o.once("error",e=>{this._beforeError(new W(e,this))}),o.once("end",()=>{delete t.body})):(this._unlockWrite(),C.default.undefined(o)?(this._cannotHaveBody||this._noPipe)&&(s.end(),this._lockWrite()):(this._writeRequest(o,null,()=>{}),s.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,t){return new Promise((r,n)=>{Object.assign(t,w.default(e)),delete t.url;const i=j.get(t.cache)(t,e=>{const t=e,{req:n}=t;n&&n.emit("cacheableResponse",t),r(t)});t.url=e,i.once("error",n),i.once("request",r)})}async _makeRequest(){var e;const{options:t}=this,{url:r,headers:n,request:i,agent:o,timeout:s}=t;for(const e in n)if(C.default.undefined(n[e]))delete n[e];else if(C.default.null_(n[e]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${e}\` header`);if(t.decompress&&C.default.undefined(n["accept-encoding"])&&(n["accept-encoding"]=O?"gzip, deflate, br":"gzip, deflate"),t.cookieJar){const e=await t.cookieJar.getCookieString(t.url.toString());C.default.nonEmptyString(e)&&(t.headers.cookie=e)}for(const e of t.hooks.beforeRequest){const r=await e(t);if(!C.default.undefined(r)){t.request=()=>r;break}}if(t.dnsCache&&!("lookup"in t)&&(t.lookup=t.dnsCache.lookup),"unix"===r.hostname){const e=/(?.+?):(?.+)/.exec(`${r.pathname}${r.search}`);if(null==e?void 0:e.groups){const{socketPath:r,path:n}=e.groups;Object.assign(t,{socketPath:r,path:n,host:""})}}const a="https:"===r.protocol;let u;u=t.http2?f.auto:a?c.request:A.request;const l=null!==(e=t.request)&&void 0!==e?e:u,h=t.cache?this._createCacheableRequest:l;o&&!t.http2&&(t.agent=o[a?"https":"http"]),t[v]=l,delete t.request,delete t.timeout;try{let e=await h(r,t);C.default.undefined(e)&&(e=u(r,t)),t.request=i,t.timeout=s,t.agent=o,p=e,C.default.object(p)&&!("statusCode"in p)?this._onRequest(e):this.writable?(this.once("finish",()=>{this._onResponse(e)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(e)}catch(e){if(e instanceof g.CacheError)throw new z(e,this);throw new J(e.message,e,this)}var p}async _beforeError(e){this[L]=!0,e instanceof J||(e=new J(e.message,e,this));try{const{response:t}=e;t&&(t.setEncoding(this._readableState.encoding),t.rawBody=await d.buffer(t),t.body=t.rawBody.toString())}catch(e){}try{for(const t of this.options.hooks.beforeError)e=await t(e)}catch(t){e=new J(t.message,t,this)}this.destroyed||this.destroy(e)}_read(){this[T]=!0;const e=this[D];if(e&&!this[L]){let t;for(e.readableLength&&(this[T]=!1);null!==(t=e.read());){this[S]+=t.length,this[K]=!0;const e=this.downloadProgress;e.percent<1&&this.emit("downloadProgress",e),this.push(t)}}}_write(e,t,r){const n=()=>{this._writeRequest(e,t,r)};this.requestInitialized?n():this[U].push(n)}_writeRequest(e,t,r){this._progressCallbacks.push(()=>{this[x]+=Buffer.byteLength(e,t);const r=this.uploadProgress;r.percent<1&&this.emit("uploadProgress",r)}),this[v].write(e,t,e=>{e||0===this._progressCallbacks.length||this._progressCallbacks.shift()(),r(e)})}_final(e){const t=()=>{for(;0!==this._progressCallbacks.length;)this._progressCallbacks.shift()();v in this?this[v].end(t=>{t||(this[k]=this[x],this.emit("uploadProgress",this.uploadProgress),this[v].emit("upload-complete")),e(t)}):e()};this.requestInitialized?t():this[U].push(t)}_destroy(e,t){var r;v in this&&(this[R](),(null===(r=this[D])||void 0===r?void 0:r.complete)||this[v].destroy()),null===e||C.default.undefined(e)||e instanceof J||(e=new J(e.message,e,this)),t(e)}get ip(){var e;return null===(e=this[v])||void 0===e?void 0:e.socket.remoteAddress}get aborted(){var e,t,r;return(null!==(t=null===(e=this[v])||void 0===e?void 0:e.destroyed)&&void 0!==t?t:this.destroyed)&&!(null===(r=this[_])||void 0===r?void 0:r.complete)}get socket(){var e;return null===(e=this[v])||void 0===e?void 0:e.socket}get downloadProgress(){let e;return e=this[b]?this[S]/this[b]:this[b]===this[S]?1:0,{percent:e,transferred:this[S],total:this[b]}}get uploadProgress(){let e;return e=this[k]?this[x]/this[k]:this[k]===this[x]?1:0,{percent:e,transferred:this[x],total:this[k]}}get timings(){var e;return null===(e=this[v])||void 0===e?void 0:e.timings}get isFromCache(){return this[N]}pipe(e,t){if(this[K])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof a.ServerResponse&&this[F].add(e),super.pipe(e,t)}unpipe(e){return e instanceof a.ServerResponse&&this[F].delete(e),super.unpipe(e),this}}t.default=ee},96596:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(35747),i=r(31669),o=r(8189),s=r(35637),A=i.promisify(n.stat);t.default=async(e,t)=>{if(t&&"content-length"in t)return Number(t["content-length"]);if(!e)return 0;if(o.default.string(e))return Buffer.byteLength(e);if(o.default.buffer(e))return e.length;if(s.default(e))return i.promisify(e.getLength.bind(e))();if(e instanceof n.ReadStream){const{size:t}=await A(e.path);return t}}},35637:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8189);t.default=e=>n.default.nodeStream(e)&&n.default.function_(e.getBoundary)},80972:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(78835),i=["protocol","host","hostname","port","pathname","search"];t.default=(e,t)=>{var r,o;if(t.path){if(t.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(t.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(t.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(t.search&&t.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!e){if(!t.protocol)throw new TypeError("No URL protocol specified");e=`${t.protocol}//${null!==(o=null!==(r=t.hostname)&&void 0!==r?r:t.host)&&void 0!==o?o:""}`}const s=new n.URL(e);if(t.path){const e=t.path.indexOf("?");-1===e?t.pathname=t.path:(t.pathname=t.path.slice(0,e),t.search=t.path.slice(e+1)),delete t.path}for(const e of i)t[e]&&(s[e]=t[e].toString());return s}},63227:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){const n={};for(const i of r)n[i]=(...e)=>{t.emit(i,...e)},e.on(i,n[i]);return()=>{for(const t of r)e.off(t,n[t])}}},32449:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(11631),i=r(46248),o=Symbol("reentry"),s=()=>{};class A extends Error{constructor(e,t){super(`Timeout awaiting '${t}' for ${e}ms`),this.event=t,this.name="TimeoutError",this.code="ETIMEDOUT"}}t.TimeoutError=A,t.default=(e,t,r)=>{if(o in e)return s;e[o]=!0;const a=[],{once:c,unhandleAll:u}=i.default(),l=(e,t,r)=>{var n;const i=setTimeout(t,e,e,r);null===(n=i.unref)||void 0===n||n.call(i);const o=()=>{clearTimeout(i)};return a.push(o),o},{host:h,hostname:g}=r,f=(t,r)=>{e.destroy(new A(t,r))},p=()=>{for(const e of a)e();u()};if(e.once("error",t=>{if(p(),0===e.listenerCount("error"))throw t}),e.once("close",p),c(e,"response",e=>{c(e,"end",p)}),void 0!==t.request&&l(t.request,f,"request"),void 0!==t.socket){const r=()=>{f(t.socket,"socket")};e.setTimeout(t.socket,r),a.push(()=>{e.removeListener("timeout",r)})}return c(e,"socket",i=>{var o;const{socketPath:s}=e;if(i.connecting){const e=Boolean(null!=s?s:0!==n.isIP(null!==(o=null!=g?g:h)&&void 0!==o?o:""));if(void 0!==t.lookup&&!e&&void 0===i.address().address){const e=l(t.lookup,f,"lookup");c(i,"lookup",e)}if(void 0!==t.connect){const r=()=>l(t.connect,f,"connect");e?c(i,"connect",r()):c(i,"lookup",e=>{null===e&&c(i,"connect",r())})}void 0!==t.secureConnect&&"https:"===r.protocol&&c(i,"connect",()=>{const e=l(t.secureConnect,f,"secureConnect");c(i,"secureConnect",e)})}if(void 0!==t.send){const r=()=>l(t.send,f,"send");i.connecting?c(i,"connect",()=>{c(e,"upload-complete",r())}):c(e,"upload-complete",r())}}),void 0!==t.response&&c(e,"upload-complete",()=>{const r=l(t.response,f,"response");c(e,"response",r)}),p}},46248:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=()=>{const e=[];return{once(t,r,n){t.once(r,n),e.push({origin:t,event:r,fn:n})},unhandleAll(){for(const t of e){const{origin:e,event:r,fn:n}=t;e.removeListener(r,n)}e.length=0}}}},13656:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8189);t.default=e=>{const t={protocol:(e=e).protocol,hostname:n.default.string(e.hostname)&&e.hostname.startsWith("[")?e.hostname.slice(1,-1):e.hostname,host:e.host,hash:e.hash,search:e.search,pathname:e.pathname,href:e.href,path:`${e.pathname||""}${e.search||""}`};return n.default.string(e.port)&&0!==e.port.length&&(t.port=Number(e.port)),(e.username||e.password)&&(t.auth=`${e.username||""}:${e.password||""}`),t}},30291:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.default=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,t){"object"==typeof e?this.weakMap.set(e,t):this.map.set(e,t)}get(e){return"object"==typeof e?this.weakMap.get(e):this.map.get(e)}has(e){return"object"==typeof e?this.weakMap.has(e):this.map.has(e)}}},88190:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(59351),i=r(8189),o=r(74850),s=r(57019),A=r(8859),a=r(5571),c={RequestError:o.RequestError,CacheError:o.CacheError,ReadError:o.ReadError,HTTPError:o.HTTPError,MaxRedirectsError:o.MaxRedirectsError,TimeoutError:o.TimeoutError,ParseError:o.ParseError,CancelError:n.CancelError,UnsupportedProtocolError:o.UnsupportedProtocolError,UploadError:o.UploadError},{normalizeArguments:u,mergeOptions:l}=o.PromisableRequest,h=e=>e.isStream?new A.default(e.url,e):o.default(e),g=e=>"defaults"in e&&"options"in e.defaults,f=["get","post","put","patch","head","delete"];t.defaultHandler=(e,t)=>t(e);const p=(e,t)=>{if(e)for(const r of e)r(t)},d=e=>{e._rawHandlers=e.handlers,e.handlers=e.handlers.map(e=>(t,r)=>{let n;const i=e(t,e=>(n=r(e),n));if(i!==n&&!t.isStream&&n){const e=i,{then:t,catch:r,finally:o}=e;Object.setPrototypeOf(e,Object.getPrototypeOf(n)),Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)),e.then=t,e.catch=r,e.finally=o}return i});const r=(t,r)=>{var n,a;let c=0;const l=t=>e.handlers[c++](t,c===e.handlers.length?h:l);i.default.plainObject(t)&&(r={...t,...r},t=void 0);try{let i;try{p(e.options.hooks.init,r),p(null===(n=null==r?void 0:r.hooks)||void 0===n?void 0:n.init,r)}catch(e){i=e}const s=u(t,r,e.options);if(s[A.kIsNormalizedAlready]=!0,i)throw new o.RequestError(i.message,i,s);return l(s)}catch(t){if(null==r?void 0:r.isStream)throw t;return s.default(t,e.options.hooks.beforeError,null===(a=null==r?void 0:r.hooks)||void 0===a?void 0:a.beforeError)}};r.extend=(...r)=>{const n=[e.options];let i,o=[...e._rawHandlers];for(const e of r)g(e)?(n.push(e.defaults.options),o.push(...e.defaults._rawHandlers),i=e.defaults.mutableDefaults):(n.push(e),"handlers"in e&&o.push(...e.handlers),i=e.mutableDefaults);return o=o.filter(e=>e!==t.defaultHandler),0===o.length&&o.push(t.defaultHandler),d({options:l(...n),handlers:o,mutableDefaults:Boolean(i)})},(r.paginate=async function*(t,n){let o=u(t,n,e.options);o.resolveBodyOnly=!1;const s=o.pagination;if(!i.default.object(s))throw new TypeError("`options.pagination` must be implemented");const A=[];let{countLimit:a}=s,c=0;for(;c{const n=[];for await(const i of r.paginate(e,t))n.push(i);return n},r.stream=(e,t)=>r(e,{...t,isStream:!0});for(const e of f)r[e]=(t,n)=>r(t,{...n,method:e}),r.stream[e]=(t,n)=>r(t,{...n,method:e,isStream:!0});return Object.assign(r,{...c,mergeOptions:l}),Object.defineProperty(r,"defaults",{value:e.mutableDefaults?e:a.default(e),writable:e.mutableDefaults,configurable:e.mutableDefaults,enumerable:!0}),r};t.default=d},22395:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});const i=r(78835),o=r(88190),s={options:{method:"GET",retry:{limit:2,methods:["GET","PUT","HEAD","DELETE","OPTIONS","TRACE"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:["ETIMEDOUT","ECONNRESET","EADDRINUSE","ECONNREFUSED","EPIPE","ENOTFOUND","ENETUNREACH","EAI_AGAIN"],maxRetryAfter:void 0,calculateDelay:({computedValue:e})=>e},timeout:{},headers:{"user-agent":"got (https://github.com/sindresorhus/got)"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:"text",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:"",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,rejectUnauthorized:!0,pagination:{transform:e=>"json"===e.request.options.responseType?e.body:JSON.parse(e.body),paginate:e=>{if(!Reflect.has(e.headers,"link"))return!1;const t=e.headers.link.split(",");let r;for(const e of t){const t=e.split(";");if(t[1].includes("next")){r=t[0].trimStart().trim(),r=r.slice(1,-1);break}}if(r){return{url:new i.URL(r)}}return!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:1/0,requestLimit:1e4,stackAllItems:!0}},handlers:[o.defaultHandler],mutableDefaults:!1},A=o.default(s);t.default=A,e.exports=A,e.exports.default=A,n(r(88190)),n(r(74850))},5571:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8189);t.default=function e(t){for(const r of Object.values(t))(n.default.plainObject(r)||n.default.array(r))&&e(r);return Object.freeze(t)}},74988:e=>{e.exports&&(e.exports=function(){var e=3,t=4,r=12,n=13,i=16,o=17;function s(e,t){void 0===t&&(t=0);var r=e.charCodeAt(t);if(55296<=r&&r<=56319&&t=1){var i=r;return 55296<=(n=e.charCodeAt(t-1))&&n<=56319?1024*(n-55296)+(i-56320)+65536:i}return r}function A(s,A,a){var c=[s].concat(A).concat([a]),u=c[c.length-2],l=a,h=c.lastIndexOf(14);if(h>1&&c.slice(1,h).every((function(t){return t==e}))&&-1==[e,n,o].indexOf(s))return 2;var g=c.lastIndexOf(t);if(g>0&&c.slice(1,g).every((function(e){return e==t}))&&-1==[r,t].indexOf(u))return c.filter((function(e){return e==t})).length%2==1?3:4;if(0==u&&1==l)return 0;if(2==u||0==u||1==u)return 14==l&&A.every((function(t){return t==e}))?2:1;if(2==l||0==l||1==l)return 1;if(6==u&&(6==l||7==l||9==l||10==l))return 0;if(!(9!=u&&7!=u||7!=l&&8!=l))return 0;if((10==u||8==u)&&8==l)return 0;if(l==e||15==l)return 0;if(5==l)return 0;if(u==r)return 0;var f=-1!=c.indexOf(e)?c.lastIndexOf(e)-1:c.length-2;return-1!=[n,o].indexOf(c[f])&&c.slice(f+1,-1).every((function(t){return t==e}))&&14==l||15==u&&-1!=[i,o].indexOf(l)?0:-1!=A.indexOf(t)?2:u==t&&l==t?0:1}function a(s){return 1536<=s&&s<=1541||1757==s||1807==s||2274==s||3406==s||69821==s||70082<=s&&s<=70083||72250==s||72326<=s&&s<=72329||73030==s?r:13==s?0:10==s?1:0<=s&&s<=9||11<=s&&s<=12||14<=s&&s<=31||127<=s&&s<=159||173==s||1564==s||6158==s||8203==s||8206<=s&&s<=8207||8232==s||8233==s||8234<=s&&s<=8238||8288<=s&&s<=8292||8293==s||8294<=s&&s<=8303||55296<=s&&s<=57343||65279==s||65520<=s&&s<=65528||65529<=s&&s<=65531||113824<=s&&s<=113827||119155<=s&&s<=119162||917504==s||917505==s||917506<=s&&s<=917535||917632<=s&&s<=917759||918e3<=s&&s<=921599?2:768<=s&&s<=879||1155<=s&&s<=1159||1160<=s&&s<=1161||1425<=s&&s<=1469||1471==s||1473<=s&&s<=1474||1476<=s&&s<=1477||1479==s||1552<=s&&s<=1562||1611<=s&&s<=1631||1648==s||1750<=s&&s<=1756||1759<=s&&s<=1764||1767<=s&&s<=1768||1770<=s&&s<=1773||1809==s||1840<=s&&s<=1866||1958<=s&&s<=1968||2027<=s&&s<=2035||2070<=s&&s<=2073||2075<=s&&s<=2083||2085<=s&&s<=2087||2089<=s&&s<=2093||2137<=s&&s<=2139||2260<=s&&s<=2273||2275<=s&&s<=2306||2362==s||2364==s||2369<=s&&s<=2376||2381==s||2385<=s&&s<=2391||2402<=s&&s<=2403||2433==s||2492==s||2494==s||2497<=s&&s<=2500||2509==s||2519==s||2530<=s&&s<=2531||2561<=s&&s<=2562||2620==s||2625<=s&&s<=2626||2631<=s&&s<=2632||2635<=s&&s<=2637||2641==s||2672<=s&&s<=2673||2677==s||2689<=s&&s<=2690||2748==s||2753<=s&&s<=2757||2759<=s&&s<=2760||2765==s||2786<=s&&s<=2787||2810<=s&&s<=2815||2817==s||2876==s||2878==s||2879==s||2881<=s&&s<=2884||2893==s||2902==s||2903==s||2914<=s&&s<=2915||2946==s||3006==s||3008==s||3021==s||3031==s||3072==s||3134<=s&&s<=3136||3142<=s&&s<=3144||3146<=s&&s<=3149||3157<=s&&s<=3158||3170<=s&&s<=3171||3201==s||3260==s||3263==s||3266==s||3270==s||3276<=s&&s<=3277||3285<=s&&s<=3286||3298<=s&&s<=3299||3328<=s&&s<=3329||3387<=s&&s<=3388||3390==s||3393<=s&&s<=3396||3405==s||3415==s||3426<=s&&s<=3427||3530==s||3535==s||3538<=s&&s<=3540||3542==s||3551==s||3633==s||3636<=s&&s<=3642||3655<=s&&s<=3662||3761==s||3764<=s&&s<=3769||3771<=s&&s<=3772||3784<=s&&s<=3789||3864<=s&&s<=3865||3893==s||3895==s||3897==s||3953<=s&&s<=3966||3968<=s&&s<=3972||3974<=s&&s<=3975||3981<=s&&s<=3991||3993<=s&&s<=4028||4038==s||4141<=s&&s<=4144||4146<=s&&s<=4151||4153<=s&&s<=4154||4157<=s&&s<=4158||4184<=s&&s<=4185||4190<=s&&s<=4192||4209<=s&&s<=4212||4226==s||4229<=s&&s<=4230||4237==s||4253==s||4957<=s&&s<=4959||5906<=s&&s<=5908||5938<=s&&s<=5940||5970<=s&&s<=5971||6002<=s&&s<=6003||6068<=s&&s<=6069||6071<=s&&s<=6077||6086==s||6089<=s&&s<=6099||6109==s||6155<=s&&s<=6157||6277<=s&&s<=6278||6313==s||6432<=s&&s<=6434||6439<=s&&s<=6440||6450==s||6457<=s&&s<=6459||6679<=s&&s<=6680||6683==s||6742==s||6744<=s&&s<=6750||6752==s||6754==s||6757<=s&&s<=6764||6771<=s&&s<=6780||6783==s||6832<=s&&s<=6845||6846==s||6912<=s&&s<=6915||6964==s||6966<=s&&s<=6970||6972==s||6978==s||7019<=s&&s<=7027||7040<=s&&s<=7041||7074<=s&&s<=7077||7080<=s&&s<=7081||7083<=s&&s<=7085||7142==s||7144<=s&&s<=7145||7149==s||7151<=s&&s<=7153||7212<=s&&s<=7219||7222<=s&&s<=7223||7376<=s&&s<=7378||7380<=s&&s<=7392||7394<=s&&s<=7400||7405==s||7412==s||7416<=s&&s<=7417||7616<=s&&s<=7673||7675<=s&&s<=7679||8204==s||8400<=s&&s<=8412||8413<=s&&s<=8416||8417==s||8418<=s&&s<=8420||8421<=s&&s<=8432||11503<=s&&s<=11505||11647==s||11744<=s&&s<=11775||12330<=s&&s<=12333||12334<=s&&s<=12335||12441<=s&&s<=12442||42607==s||42608<=s&&s<=42610||42612<=s&&s<=42621||42654<=s&&s<=42655||42736<=s&&s<=42737||43010==s||43014==s||43019==s||43045<=s&&s<=43046||43204<=s&&s<=43205||43232<=s&&s<=43249||43302<=s&&s<=43309||43335<=s&&s<=43345||43392<=s&&s<=43394||43443==s||43446<=s&&s<=43449||43452==s||43493==s||43561<=s&&s<=43566||43569<=s&&s<=43570||43573<=s&&s<=43574||43587==s||43596==s||43644==s||43696==s||43698<=s&&s<=43700||43703<=s&&s<=43704||43710<=s&&s<=43711||43713==s||43756<=s&&s<=43757||43766==s||44005==s||44008==s||44013==s||64286==s||65024<=s&&s<=65039||65056<=s&&s<=65071||65438<=s&&s<=65439||66045==s||66272==s||66422<=s&&s<=66426||68097<=s&&s<=68099||68101<=s&&s<=68102||68108<=s&&s<=68111||68152<=s&&s<=68154||68159==s||68325<=s&&s<=68326||69633==s||69688<=s&&s<=69702||69759<=s&&s<=69761||69811<=s&&s<=69814||69817<=s&&s<=69818||69888<=s&&s<=69890||69927<=s&&s<=69931||69933<=s&&s<=69940||70003==s||70016<=s&&s<=70017||70070<=s&&s<=70078||70090<=s&&s<=70092||70191<=s&&s<=70193||70196==s||70198<=s&&s<=70199||70206==s||70367==s||70371<=s&&s<=70378||70400<=s&&s<=70401||70460==s||70462==s||70464==s||70487==s||70502<=s&&s<=70508||70512<=s&&s<=70516||70712<=s&&s<=70719||70722<=s&&s<=70724||70726==s||70832==s||70835<=s&&s<=70840||70842==s||70845==s||70847<=s&&s<=70848||70850<=s&&s<=70851||71087==s||71090<=s&&s<=71093||71100<=s&&s<=71101||71103<=s&&s<=71104||71132<=s&&s<=71133||71219<=s&&s<=71226||71229==s||71231<=s&&s<=71232||71339==s||71341==s||71344<=s&&s<=71349||71351==s||71453<=s&&s<=71455||71458<=s&&s<=71461||71463<=s&&s<=71467||72193<=s&&s<=72198||72201<=s&&s<=72202||72243<=s&&s<=72248||72251<=s&&s<=72254||72263==s||72273<=s&&s<=72278||72281<=s&&s<=72283||72330<=s&&s<=72342||72344<=s&&s<=72345||72752<=s&&s<=72758||72760<=s&&s<=72765||72767==s||72850<=s&&s<=72871||72874<=s&&s<=72880||72882<=s&&s<=72883||72885<=s&&s<=72886||73009<=s&&s<=73014||73018==s||73020<=s&&s<=73021||73023<=s&&s<=73029||73031==s||92912<=s&&s<=92916||92976<=s&&s<=92982||94095<=s&&s<=94098||113821<=s&&s<=113822||119141==s||119143<=s&&s<=119145||119150<=s&&s<=119154||119163<=s&&s<=119170||119173<=s&&s<=119179||119210<=s&&s<=119213||119362<=s&&s<=119364||121344<=s&&s<=121398||121403<=s&&s<=121452||121461==s||121476==s||121499<=s&&s<=121503||121505<=s&&s<=121519||122880<=s&&s<=122886||122888<=s&&s<=122904||122907<=s&&s<=122913||122915<=s&&s<=122916||122918<=s&&s<=122922||125136<=s&&s<=125142||125252<=s&&s<=125258||917536<=s&&s<=917631||917760<=s&&s<=917999?e:127462<=s&&s<=127487?t:2307==s||2363==s||2366<=s&&s<=2368||2377<=s&&s<=2380||2382<=s&&s<=2383||2434<=s&&s<=2435||2495<=s&&s<=2496||2503<=s&&s<=2504||2507<=s&&s<=2508||2563==s||2622<=s&&s<=2624||2691==s||2750<=s&&s<=2752||2761==s||2763<=s&&s<=2764||2818<=s&&s<=2819||2880==s||2887<=s&&s<=2888||2891<=s&&s<=2892||3007==s||3009<=s&&s<=3010||3014<=s&&s<=3016||3018<=s&&s<=3020||3073<=s&&s<=3075||3137<=s&&s<=3140||3202<=s&&s<=3203||3262==s||3264<=s&&s<=3265||3267<=s&&s<=3268||3271<=s&&s<=3272||3274<=s&&s<=3275||3330<=s&&s<=3331||3391<=s&&s<=3392||3398<=s&&s<=3400||3402<=s&&s<=3404||3458<=s&&s<=3459||3536<=s&&s<=3537||3544<=s&&s<=3550||3570<=s&&s<=3571||3635==s||3763==s||3902<=s&&s<=3903||3967==s||4145==s||4155<=s&&s<=4156||4182<=s&&s<=4183||4228==s||6070==s||6078<=s&&s<=6085||6087<=s&&s<=6088||6435<=s&&s<=6438||6441<=s&&s<=6443||6448<=s&&s<=6449||6451<=s&&s<=6456||6681<=s&&s<=6682||6741==s||6743==s||6765<=s&&s<=6770||6916==s||6965==s||6971==s||6973<=s&&s<=6977||6979<=s&&s<=6980||7042==s||7073==s||7078<=s&&s<=7079||7082==s||7143==s||7146<=s&&s<=7148||7150==s||7154<=s&&s<=7155||7204<=s&&s<=7211||7220<=s&&s<=7221||7393==s||7410<=s&&s<=7411||7415==s||43043<=s&&s<=43044||43047==s||43136<=s&&s<=43137||43188<=s&&s<=43203||43346<=s&&s<=43347||43395==s||43444<=s&&s<=43445||43450<=s&&s<=43451||43453<=s&&s<=43456||43567<=s&&s<=43568||43571<=s&&s<=43572||43597==s||43755==s||43758<=s&&s<=43759||43765==s||44003<=s&&s<=44004||44006<=s&&s<=44007||44009<=s&&s<=44010||44012==s||69632==s||69634==s||69762==s||69808<=s&&s<=69810||69815<=s&&s<=69816||69932==s||70018==s||70067<=s&&s<=70069||70079<=s&&s<=70080||70188<=s&&s<=70190||70194<=s&&s<=70195||70197==s||70368<=s&&s<=70370||70402<=s&&s<=70403||70463==s||70465<=s&&s<=70468||70471<=s&&s<=70472||70475<=s&&s<=70477||70498<=s&&s<=70499||70709<=s&&s<=70711||70720<=s&&s<=70721||70725==s||70833<=s&&s<=70834||70841==s||70843<=s&&s<=70844||70846==s||70849==s||71088<=s&&s<=71089||71096<=s&&s<=71099||71102==s||71216<=s&&s<=71218||71227<=s&&s<=71228||71230==s||71340==s||71342<=s&&s<=71343||71350==s||71456<=s&&s<=71457||71462==s||72199<=s&&s<=72200||72249==s||72279<=s&&s<=72280||72343==s||72751==s||72766==s||72873==s||72881==s||72884==s||94033<=s&&s<=94078||119142==s||119149==s?5:4352<=s&&s<=4447||43360<=s&&s<=43388?6:4448<=s&&s<=4519||55216<=s&&s<=55238?7:4520<=s&&s<=4607||55243<=s&&s<=55291?8:44032==s||44060==s||44088==s||44116==s||44144==s||44172==s||44200==s||44228==s||44256==s||44284==s||44312==s||44340==s||44368==s||44396==s||44424==s||44452==s||44480==s||44508==s||44536==s||44564==s||44592==s||44620==s||44648==s||44676==s||44704==s||44732==s||44760==s||44788==s||44816==s||44844==s||44872==s||44900==s||44928==s||44956==s||44984==s||45012==s||45040==s||45068==s||45096==s||45124==s||45152==s||45180==s||45208==s||45236==s||45264==s||45292==s||45320==s||45348==s||45376==s||45404==s||45432==s||45460==s||45488==s||45516==s||45544==s||45572==s||45600==s||45628==s||45656==s||45684==s||45712==s||45740==s||45768==s||45796==s||45824==s||45852==s||45880==s||45908==s||45936==s||45964==s||45992==s||46020==s||46048==s||46076==s||46104==s||46132==s||46160==s||46188==s||46216==s||46244==s||46272==s||46300==s||46328==s||46356==s||46384==s||46412==s||46440==s||46468==s||46496==s||46524==s||46552==s||46580==s||46608==s||46636==s||46664==s||46692==s||46720==s||46748==s||46776==s||46804==s||46832==s||46860==s||46888==s||46916==s||46944==s||46972==s||47e3==s||47028==s||47056==s||47084==s||47112==s||47140==s||47168==s||47196==s||47224==s||47252==s||47280==s||47308==s||47336==s||47364==s||47392==s||47420==s||47448==s||47476==s||47504==s||47532==s||47560==s||47588==s||47616==s||47644==s||47672==s||47700==s||47728==s||47756==s||47784==s||47812==s||47840==s||47868==s||47896==s||47924==s||47952==s||47980==s||48008==s||48036==s||48064==s||48092==s||48120==s||48148==s||48176==s||48204==s||48232==s||48260==s||48288==s||48316==s||48344==s||48372==s||48400==s||48428==s||48456==s||48484==s||48512==s||48540==s||48568==s||48596==s||48624==s||48652==s||48680==s||48708==s||48736==s||48764==s||48792==s||48820==s||48848==s||48876==s||48904==s||48932==s||48960==s||48988==s||49016==s||49044==s||49072==s||49100==s||49128==s||49156==s||49184==s||49212==s||49240==s||49268==s||49296==s||49324==s||49352==s||49380==s||49408==s||49436==s||49464==s||49492==s||49520==s||49548==s||49576==s||49604==s||49632==s||49660==s||49688==s||49716==s||49744==s||49772==s||49800==s||49828==s||49856==s||49884==s||49912==s||49940==s||49968==s||49996==s||50024==s||50052==s||50080==s||50108==s||50136==s||50164==s||50192==s||50220==s||50248==s||50276==s||50304==s||50332==s||50360==s||50388==s||50416==s||50444==s||50472==s||50500==s||50528==s||50556==s||50584==s||50612==s||50640==s||50668==s||50696==s||50724==s||50752==s||50780==s||50808==s||50836==s||50864==s||50892==s||50920==s||50948==s||50976==s||51004==s||51032==s||51060==s||51088==s||51116==s||51144==s||51172==s||51200==s||51228==s||51256==s||51284==s||51312==s||51340==s||51368==s||51396==s||51424==s||51452==s||51480==s||51508==s||51536==s||51564==s||51592==s||51620==s||51648==s||51676==s||51704==s||51732==s||51760==s||51788==s||51816==s||51844==s||51872==s||51900==s||51928==s||51956==s||51984==s||52012==s||52040==s||52068==s||52096==s||52124==s||52152==s||52180==s||52208==s||52236==s||52264==s||52292==s||52320==s||52348==s||52376==s||52404==s||52432==s||52460==s||52488==s||52516==s||52544==s||52572==s||52600==s||52628==s||52656==s||52684==s||52712==s||52740==s||52768==s||52796==s||52824==s||52852==s||52880==s||52908==s||52936==s||52964==s||52992==s||53020==s||53048==s||53076==s||53104==s||53132==s||53160==s||53188==s||53216==s||53244==s||53272==s||53300==s||53328==s||53356==s||53384==s||53412==s||53440==s||53468==s||53496==s||53524==s||53552==s||53580==s||53608==s||53636==s||53664==s||53692==s||53720==s||53748==s||53776==s||53804==s||53832==s||53860==s||53888==s||53916==s||53944==s||53972==s||54e3==s||54028==s||54056==s||54084==s||54112==s||54140==s||54168==s||54196==s||54224==s||54252==s||54280==s||54308==s||54336==s||54364==s||54392==s||54420==s||54448==s||54476==s||54504==s||54532==s||54560==s||54588==s||54616==s||54644==s||54672==s||54700==s||54728==s||54756==s||54784==s||54812==s||54840==s||54868==s||54896==s||54924==s||54952==s||54980==s||55008==s||55036==s||55064==s||55092==s||55120==s||55148==s||55176==s?9:44033<=s&&s<=44059||44061<=s&&s<=44087||44089<=s&&s<=44115||44117<=s&&s<=44143||44145<=s&&s<=44171||44173<=s&&s<=44199||44201<=s&&s<=44227||44229<=s&&s<=44255||44257<=s&&s<=44283||44285<=s&&s<=44311||44313<=s&&s<=44339||44341<=s&&s<=44367||44369<=s&&s<=44395||44397<=s&&s<=44423||44425<=s&&s<=44451||44453<=s&&s<=44479||44481<=s&&s<=44507||44509<=s&&s<=44535||44537<=s&&s<=44563||44565<=s&&s<=44591||44593<=s&&s<=44619||44621<=s&&s<=44647||44649<=s&&s<=44675||44677<=s&&s<=44703||44705<=s&&s<=44731||44733<=s&&s<=44759||44761<=s&&s<=44787||44789<=s&&s<=44815||44817<=s&&s<=44843||44845<=s&&s<=44871||44873<=s&&s<=44899||44901<=s&&s<=44927||44929<=s&&s<=44955||44957<=s&&s<=44983||44985<=s&&s<=45011||45013<=s&&s<=45039||45041<=s&&s<=45067||45069<=s&&s<=45095||45097<=s&&s<=45123||45125<=s&&s<=45151||45153<=s&&s<=45179||45181<=s&&s<=45207||45209<=s&&s<=45235||45237<=s&&s<=45263||45265<=s&&s<=45291||45293<=s&&s<=45319||45321<=s&&s<=45347||45349<=s&&s<=45375||45377<=s&&s<=45403||45405<=s&&s<=45431||45433<=s&&s<=45459||45461<=s&&s<=45487||45489<=s&&s<=45515||45517<=s&&s<=45543||45545<=s&&s<=45571||45573<=s&&s<=45599||45601<=s&&s<=45627||45629<=s&&s<=45655||45657<=s&&s<=45683||45685<=s&&s<=45711||45713<=s&&s<=45739||45741<=s&&s<=45767||45769<=s&&s<=45795||45797<=s&&s<=45823||45825<=s&&s<=45851||45853<=s&&s<=45879||45881<=s&&s<=45907||45909<=s&&s<=45935||45937<=s&&s<=45963||45965<=s&&s<=45991||45993<=s&&s<=46019||46021<=s&&s<=46047||46049<=s&&s<=46075||46077<=s&&s<=46103||46105<=s&&s<=46131||46133<=s&&s<=46159||46161<=s&&s<=46187||46189<=s&&s<=46215||46217<=s&&s<=46243||46245<=s&&s<=46271||46273<=s&&s<=46299||46301<=s&&s<=46327||46329<=s&&s<=46355||46357<=s&&s<=46383||46385<=s&&s<=46411||46413<=s&&s<=46439||46441<=s&&s<=46467||46469<=s&&s<=46495||46497<=s&&s<=46523||46525<=s&&s<=46551||46553<=s&&s<=46579||46581<=s&&s<=46607||46609<=s&&s<=46635||46637<=s&&s<=46663||46665<=s&&s<=46691||46693<=s&&s<=46719||46721<=s&&s<=46747||46749<=s&&s<=46775||46777<=s&&s<=46803||46805<=s&&s<=46831||46833<=s&&s<=46859||46861<=s&&s<=46887||46889<=s&&s<=46915||46917<=s&&s<=46943||46945<=s&&s<=46971||46973<=s&&s<=46999||47001<=s&&s<=47027||47029<=s&&s<=47055||47057<=s&&s<=47083||47085<=s&&s<=47111||47113<=s&&s<=47139||47141<=s&&s<=47167||47169<=s&&s<=47195||47197<=s&&s<=47223||47225<=s&&s<=47251||47253<=s&&s<=47279||47281<=s&&s<=47307||47309<=s&&s<=47335||47337<=s&&s<=47363||47365<=s&&s<=47391||47393<=s&&s<=47419||47421<=s&&s<=47447||47449<=s&&s<=47475||47477<=s&&s<=47503||47505<=s&&s<=47531||47533<=s&&s<=47559||47561<=s&&s<=47587||47589<=s&&s<=47615||47617<=s&&s<=47643||47645<=s&&s<=47671||47673<=s&&s<=47699||47701<=s&&s<=47727||47729<=s&&s<=47755||47757<=s&&s<=47783||47785<=s&&s<=47811||47813<=s&&s<=47839||47841<=s&&s<=47867||47869<=s&&s<=47895||47897<=s&&s<=47923||47925<=s&&s<=47951||47953<=s&&s<=47979||47981<=s&&s<=48007||48009<=s&&s<=48035||48037<=s&&s<=48063||48065<=s&&s<=48091||48093<=s&&s<=48119||48121<=s&&s<=48147||48149<=s&&s<=48175||48177<=s&&s<=48203||48205<=s&&s<=48231||48233<=s&&s<=48259||48261<=s&&s<=48287||48289<=s&&s<=48315||48317<=s&&s<=48343||48345<=s&&s<=48371||48373<=s&&s<=48399||48401<=s&&s<=48427||48429<=s&&s<=48455||48457<=s&&s<=48483||48485<=s&&s<=48511||48513<=s&&s<=48539||48541<=s&&s<=48567||48569<=s&&s<=48595||48597<=s&&s<=48623||48625<=s&&s<=48651||48653<=s&&s<=48679||48681<=s&&s<=48707||48709<=s&&s<=48735||48737<=s&&s<=48763||48765<=s&&s<=48791||48793<=s&&s<=48819||48821<=s&&s<=48847||48849<=s&&s<=48875||48877<=s&&s<=48903||48905<=s&&s<=48931||48933<=s&&s<=48959||48961<=s&&s<=48987||48989<=s&&s<=49015||49017<=s&&s<=49043||49045<=s&&s<=49071||49073<=s&&s<=49099||49101<=s&&s<=49127||49129<=s&&s<=49155||49157<=s&&s<=49183||49185<=s&&s<=49211||49213<=s&&s<=49239||49241<=s&&s<=49267||49269<=s&&s<=49295||49297<=s&&s<=49323||49325<=s&&s<=49351||49353<=s&&s<=49379||49381<=s&&s<=49407||49409<=s&&s<=49435||49437<=s&&s<=49463||49465<=s&&s<=49491||49493<=s&&s<=49519||49521<=s&&s<=49547||49549<=s&&s<=49575||49577<=s&&s<=49603||49605<=s&&s<=49631||49633<=s&&s<=49659||49661<=s&&s<=49687||49689<=s&&s<=49715||49717<=s&&s<=49743||49745<=s&&s<=49771||49773<=s&&s<=49799||49801<=s&&s<=49827||49829<=s&&s<=49855||49857<=s&&s<=49883||49885<=s&&s<=49911||49913<=s&&s<=49939||49941<=s&&s<=49967||49969<=s&&s<=49995||49997<=s&&s<=50023||50025<=s&&s<=50051||50053<=s&&s<=50079||50081<=s&&s<=50107||50109<=s&&s<=50135||50137<=s&&s<=50163||50165<=s&&s<=50191||50193<=s&&s<=50219||50221<=s&&s<=50247||50249<=s&&s<=50275||50277<=s&&s<=50303||50305<=s&&s<=50331||50333<=s&&s<=50359||50361<=s&&s<=50387||50389<=s&&s<=50415||50417<=s&&s<=50443||50445<=s&&s<=50471||50473<=s&&s<=50499||50501<=s&&s<=50527||50529<=s&&s<=50555||50557<=s&&s<=50583||50585<=s&&s<=50611||50613<=s&&s<=50639||50641<=s&&s<=50667||50669<=s&&s<=50695||50697<=s&&s<=50723||50725<=s&&s<=50751||50753<=s&&s<=50779||50781<=s&&s<=50807||50809<=s&&s<=50835||50837<=s&&s<=50863||50865<=s&&s<=50891||50893<=s&&s<=50919||50921<=s&&s<=50947||50949<=s&&s<=50975||50977<=s&&s<=51003||51005<=s&&s<=51031||51033<=s&&s<=51059||51061<=s&&s<=51087||51089<=s&&s<=51115||51117<=s&&s<=51143||51145<=s&&s<=51171||51173<=s&&s<=51199||51201<=s&&s<=51227||51229<=s&&s<=51255||51257<=s&&s<=51283||51285<=s&&s<=51311||51313<=s&&s<=51339||51341<=s&&s<=51367||51369<=s&&s<=51395||51397<=s&&s<=51423||51425<=s&&s<=51451||51453<=s&&s<=51479||51481<=s&&s<=51507||51509<=s&&s<=51535||51537<=s&&s<=51563||51565<=s&&s<=51591||51593<=s&&s<=51619||51621<=s&&s<=51647||51649<=s&&s<=51675||51677<=s&&s<=51703||51705<=s&&s<=51731||51733<=s&&s<=51759||51761<=s&&s<=51787||51789<=s&&s<=51815||51817<=s&&s<=51843||51845<=s&&s<=51871||51873<=s&&s<=51899||51901<=s&&s<=51927||51929<=s&&s<=51955||51957<=s&&s<=51983||51985<=s&&s<=52011||52013<=s&&s<=52039||52041<=s&&s<=52067||52069<=s&&s<=52095||52097<=s&&s<=52123||52125<=s&&s<=52151||52153<=s&&s<=52179||52181<=s&&s<=52207||52209<=s&&s<=52235||52237<=s&&s<=52263||52265<=s&&s<=52291||52293<=s&&s<=52319||52321<=s&&s<=52347||52349<=s&&s<=52375||52377<=s&&s<=52403||52405<=s&&s<=52431||52433<=s&&s<=52459||52461<=s&&s<=52487||52489<=s&&s<=52515||52517<=s&&s<=52543||52545<=s&&s<=52571||52573<=s&&s<=52599||52601<=s&&s<=52627||52629<=s&&s<=52655||52657<=s&&s<=52683||52685<=s&&s<=52711||52713<=s&&s<=52739||52741<=s&&s<=52767||52769<=s&&s<=52795||52797<=s&&s<=52823||52825<=s&&s<=52851||52853<=s&&s<=52879||52881<=s&&s<=52907||52909<=s&&s<=52935||52937<=s&&s<=52963||52965<=s&&s<=52991||52993<=s&&s<=53019||53021<=s&&s<=53047||53049<=s&&s<=53075||53077<=s&&s<=53103||53105<=s&&s<=53131||53133<=s&&s<=53159||53161<=s&&s<=53187||53189<=s&&s<=53215||53217<=s&&s<=53243||53245<=s&&s<=53271||53273<=s&&s<=53299||53301<=s&&s<=53327||53329<=s&&s<=53355||53357<=s&&s<=53383||53385<=s&&s<=53411||53413<=s&&s<=53439||53441<=s&&s<=53467||53469<=s&&s<=53495||53497<=s&&s<=53523||53525<=s&&s<=53551||53553<=s&&s<=53579||53581<=s&&s<=53607||53609<=s&&s<=53635||53637<=s&&s<=53663||53665<=s&&s<=53691||53693<=s&&s<=53719||53721<=s&&s<=53747||53749<=s&&s<=53775||53777<=s&&s<=53803||53805<=s&&s<=53831||53833<=s&&s<=53859||53861<=s&&s<=53887||53889<=s&&s<=53915||53917<=s&&s<=53943||53945<=s&&s<=53971||53973<=s&&s<=53999||54001<=s&&s<=54027||54029<=s&&s<=54055||54057<=s&&s<=54083||54085<=s&&s<=54111||54113<=s&&s<=54139||54141<=s&&s<=54167||54169<=s&&s<=54195||54197<=s&&s<=54223||54225<=s&&s<=54251||54253<=s&&s<=54279||54281<=s&&s<=54307||54309<=s&&s<=54335||54337<=s&&s<=54363||54365<=s&&s<=54391||54393<=s&&s<=54419||54421<=s&&s<=54447||54449<=s&&s<=54475||54477<=s&&s<=54503||54505<=s&&s<=54531||54533<=s&&s<=54559||54561<=s&&s<=54587||54589<=s&&s<=54615||54617<=s&&s<=54643||54645<=s&&s<=54671||54673<=s&&s<=54699||54701<=s&&s<=54727||54729<=s&&s<=54755||54757<=s&&s<=54783||54785<=s&&s<=54811||54813<=s&&s<=54839||54841<=s&&s<=54867||54869<=s&&s<=54895||54897<=s&&s<=54923||54925<=s&&s<=54951||54953<=s&&s<=54979||54981<=s&&s<=55007||55009<=s&&s<=55035||55037<=s&&s<=55063||55065<=s&&s<=55091||55093<=s&&s<=55119||55121<=s&&s<=55147||55149<=s&&s<=55175||55177<=s&&s<=55203?10:9757==s||9977==s||9994<=s&&s<=9997||127877==s||127938<=s&&s<=127940||127943==s||127946<=s&&s<=127948||128066<=s&&s<=128067||128070<=s&&s<=128080||128110==s||128112<=s&&s<=128120||128124==s||128129<=s&&s<=128131||128133<=s&&s<=128135||128170==s||128372<=s&&s<=128373||128378==s||128400==s||128405<=s&&s<=128406||128581<=s&&s<=128583||128587<=s&&s<=128591||128675==s||128692<=s&&s<=128694||128704==s||128716==s||129304<=s&&s<=129308||129310<=s&&s<=129311||129318==s||129328<=s&&s<=129337||129341<=s&&s<=129342||129489<=s&&s<=129501?n:127995<=s&&s<=127999?14:8205==s?15:9792==s||9794==s||9877<=s&&s<=9878||9992==s||10084==s||127752==s||127806==s||127859==s||127891==s||127908==s||127912==s||127979==s||127981==s||128139==s||128187<=s&&s<=128188||128295==s||128300==s||128488==s||128640==s||128658==s?i:128102<=s&&s<=128105?o:11}return this.nextBreak=function(e,t){if(void 0===t&&(t=0),t<0)return 0;if(t>=e.length-1)return e.length;for(var r,n,i=a(s(e,t)),o=[],c=t+1;c{"use strict";e.exports=(e,t=process.argv)=>{const r=e.startsWith("-")?"":1===e.length?"-":"--",n=t.indexOf(r+e),i=t.indexOf("--");return-1!==n&&(-1===i||n{"use strict";const t=[200,203,204,206,300,301,404,405,410,414,501],r=[200,203,204,300,301,302,303,307,308,404,405,410,414,501],n={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},i={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function o(e){const t={};if(!e)return t;const r=e.trim().split(/\s*,\s*/);for(const e of r){const[r,n]=e.split(/\s*=\s*/,2);t[r]=void 0===n||n.replace(/^"|"$/g,"")}return t}function s(e){let t=[];for(const r in e){const n=e[r];t.push(!0===n?r:r+"="+n)}if(t.length)return t.join(", ")}e.exports=class{constructor(e,t,{shared:r,cacheHeuristic:n,immutableMinTimeToLive:i,ignoreCargoCult:A,trustServerDate:a,_fromObject:c}={}){if(c)this._fromObject(c);else{if(!t||!t.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=!1!==r,this._trustServerDate=void 0===a||a,this._cacheHeuristic=void 0!==n?n:.1,this._immutableMinTtl=void 0!==i?i:864e5,this._status="status"in t?t.status:200,this._resHeaders=t.headers,this._rescc=o(t.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=t.headers.vary?e.headers:null,this._reqcc=o(e.headers["cache-control"]),A&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":s(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),!t.headers["cache-control"]&&/no-cache/.test(t.headers.pragma)&&(this._rescc["no-cache"]=!0)}}now(){return Date.now()}storable(){return!(this._reqcc["no-store"]||!("GET"===this._method||"HEAD"===this._method||"POST"===this._method&&this._hasExplicitExpiration())||-1===r.indexOf(this._status)||this._rescc["no-store"]||this._isShared&&this._rescc.private||this._isShared&&!this._noAuthorization&&!this._allowsStoringAuthenticated()||!(this._resHeaders.expires||this._rescc.public||this._rescc["max-age"]||this._rescc["s-maxage"]||-1!==t.indexOf(this._status)))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);const t=o(e.headers["cache-control"]);if(t["no-cache"]||/no-cache/.test(e.headers.pragma))return!1;if(t["max-age"]&&this.age()>t["max-age"])return!1;if(t["min-fresh"]&&this.timeToLive()<1e3*t["min-fresh"])return!1;if(this.stale()){if(!(t["max-stale"]&&!this._rescc["must-revalidate"]&&(!0===t["max-stale"]||t["max-stale"]>this.age()-this.maxAge())))return!1}return this._requestMatches(e,!1)}_requestMatches(e,t){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||t&&"HEAD"===e.method)&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if("*"===this._resHeaders.vary)return!1;const t=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(const r of t)if(e.headers[r]!==this._reqHeaders[r])return!1;return!0}_copyWithoutHopByHopHeaders(e){const t={};for(const r in e)n[r]||(t[r]=e[r]);if(e.connection){const r=e.connection.trim().split(/\s*,\s*/);for(const e of r)delete t[e]}if(t.warning){const e=t.warning.split(/,/).filter(e=>!/^\s*1[0-9][0-9]/.test(e));e.length?t.warning=e.join(",").trim():delete t.warning}return t}responseHeaders(){const e=this._copyWithoutHopByHopHeaders(this._resHeaders),t=this.age();return t>86400&&!this._hasExplicitExpiration()&&this.maxAge()>86400&&(e.warning=(e.warning?e.warning+", ":"")+'113 - "rfc7234 5.5.4"'),e.age=""+Math.round(t),e.date=new Date(this.now()).toUTCString(),e}date(){return this._trustServerDate?this._serverDate():this._responseTime}_serverDate(){const e=Date.parse(this._resHeaders.date);if(isFinite(e)){const t=288e5;if(Math.abs(this._responseTime-e)e&&(e=t)}return e+(this.now()-this._responseTime)/1e3}_ageValue(){const e=parseInt(this._resHeaders.age);return isFinite(e)?e:0}maxAge(){if(!this.storable()||this._rescc["no-cache"])return 0;if(this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable)return 0;if("*"===this._resHeaders.vary)return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return parseInt(this._rescc["s-maxage"],10)}if(this._rescc["max-age"])return parseInt(this._rescc["max-age"],10);const e=this._rescc.immutable?this._immutableMinTtl:0,t=this._serverDate();if(this._resHeaders.expires){const r=Date.parse(this._resHeaders.expires);return Number.isNaN(r)||rr)return Math.max(e,(t-r)/1e3*this._cacheHeuristic)}return e}timeToLive(){return 1e3*Math.max(0,this.maxAge()-this.age())}stale(){return this.maxAge()<=this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||1!==e.v)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=void 0!==e.imm?e.imm:864e5,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);const t=this._copyWithoutHopByHopHeaders(e.headers);if(delete t["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete t["if-none-match"],delete t["if-modified-since"],t;this._resHeaders.etag&&(t["if-none-match"]=t["if-none-match"]?`${t["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag);if(t["accept-ranges"]||t["if-match"]||t["if-unmodified-since"]||this._method&&"GET"!=this._method){if(delete t["if-modified-since"],t["if-none-match"]){const e=t["if-none-match"].split(/,/).filter(e=>!/^\s*W\//.test(e));e.length?t["if-none-match"]=e.join(",").trim():delete t["if-none-match"]}}else this._resHeaders["last-modified"]&&!t["if-modified-since"]&&(t["if-modified-since"]=this._resHeaders["last-modified"]);return t}revalidatedPolicy(e,t){if(this._assertRequestHasHeaders(e),!t||!t.headers)throw Error("Response headers missing");let r=!1;if(void 0!==t.status&&304!=t.status?r=!1:t.headers.etag&&!/^\s*W\//.test(t.headers.etag)?r=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===t.headers.etag:this._resHeaders.etag&&t.headers.etag?r=this._resHeaders.etag.replace(/^\s*W\//,"")===t.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?r=this._resHeaders["last-modified"]===t.headers["last-modified"]:this._resHeaders.etag||this._resHeaders["last-modified"]||t.headers.etag||t.headers["last-modified"]||(r=!0),!r)return{policy:new this.constructor(e,t),modified:304!=t.status,matches:!1};const n={};for(const e in this._resHeaders)n[e]=e in t.headers&&!i[e]?t.headers[e]:this._resHeaders[e];const o=Object.assign({},t,{status:this._status,method:this._method,headers:n});return{policy:new this.constructor(e,o,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl,trustServerDate:this._trustServerDate}),modified:!1,matches:!0}}}},92967:(e,t,r)=>{"use strict";const n=r(28614),i=r(4016),o=r(97565),s=r(82905),A=Symbol("currentStreamsCount"),a=Symbol("request"),c=Symbol("cachedOriginSet"),u=["maxDeflateDynamicTableSize","maxSessionMemory","maxHeaderListPairs","maxOutstandingPings","maxReservedRemoteStreams","maxSendHeaderBlockLength","paddingStrategy","localAddress","path","rejectUnauthorized","minDHSize","ca","cert","clientCertEngine","ciphers","key","pfx","servername","minVersion","maxVersion","secureProtocol","crl","honorCipherOrder","ecdhCurve","dhparam","secureOptions","sessionIdContext"],l=(e,t,r)=>{if(t in e){const n=e[t].indexOf(r);if(-1!==n)return e[t].splice(n,1),0===e[t].length&&delete e[t],!0}return!1},h=(e,t,r)=>{t in e?e[t].push(r):e[t]=[r]},g=(e,t,r)=>t in e?e[t].filter(e=>!e.closed&&!e.destroyed&&e[c].includes(r)):[],f=(e,t,r)=>{if(t in e)for(const n of e[t])n[c].lengthr[c].includes(e))&&n[A]+r[A]<=r.remoteSettings.maxConcurrentStreams&&n.close()};class p extends n{constructor({timeout:e=6e4,maxSessions:t=1/0,maxFreeSessions:r=1,maxCachedTlsSessions:n=100}={}){super(),this.busySessions={},this.freeSessions={},this.queue={},this.timeout=e,this.maxSessions=t,this.maxFreeSessions=r,this.settings={enablePush:!1},this.tlsSessionCache=new s({maxSize:n})}static normalizeOrigin(e,t){return"string"==typeof e&&(e=new URL(e)),t&&e.hostname!==t&&(e.hostname=t),e.origin}normalizeOptions(e){let t="";if(e)for(const r of u)e[r]&&(t+=":"+e[r]);return t}_tryToCreateNewSession(e,t){if(!(e in this.queue)||!(t in this.queue[e]))return;const r=g(this.busySessions,e,t).length,n=this.queue[e][t];r{Array.isArray(r)?(r=[...r],n()):r=[{resolve:n,reject:i}];const s=this.normalizeOptions(t),u=p.normalizeOrigin(e,t&&t.servername);if(void 0===u){for(const{reject:e}of r)e(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(s in this.freeSessions){const e=g(this.freeSessions,s,u);if(0!==e.length){const t=e.reduce((e,t)=>t.remoteSettings.maxConcurrentStreams>=e.remoteSettings.maxConcurrentStreams&&t[A]>e[A]?t:e);for(const{resolve:e}of r)e(t);return}}if(s in this.queue){if(u in this.queue[s])return void this.queue[s][u].listeners.push(...r)}else this.queue[s]={};const f=()=>{s in this.queue&&this.queue[s][u]===d&&(delete this.queue[s][u],0===Object.keys(this.queue[s]).length&&delete this.queue[s])},d=()=>{const n=`${u}:${s}`;let i,p=!1;try{const C=this.tlsSessionCache.get(n),E=o.connect(e,{createConnection:this.createConnection,settings:this.settings,session:C?C.session:void 0,...t});E[A]=0;const I=()=>E[c].reduce((e,t)=>Math.min(e,g(this.freeSessions,s,t).length),1/0)E[A]{setImmediate(()=>{this.tlsSessionCache.set(n,{session:e,servername:i})})}),E.socket.once("secureConnect",()=>{i=E.socket.servername,!1===i&&void 0!==C&&void 0!==C.servername&&(E.socket.servername=C.servername)}),E.once("error",e=>{if(!p)for(const{reject:t}of r)t(e);this.tlsSessionCache.delete(n)}),E.setTimeout(this.timeout,()=>{E.destroy()}),E.once("close",()=>{if(!p){const e=new Error("Session closed without receiving a SETTINGS frame");for(const{reject:t}of r)t(e)}f(),l(this.freeSessions,s,E),this._tryToCreateNewSession(s,u)});const y=()=>{if(s in this.queue)for(const e of E[c])if(e in this.queue[s]){const{listeners:t}=this.queue[s][e];for(;0!==t.length&&m();)t.shift().resolve(E);if(0===this.queue[s][e].listeners.length&&(delete this.queue[s][e],0===Object.keys(this.queue[s]).length)){delete this.queue[s];break}if(!m())break}};E.once("origin",()=>{E[c]=E.originSet,m()&&(this._closeCoveredSessions(s,E),y(),E.on("remoteSettings",()=>{this._closeCoveredSessions(s,E)}))}),E.once("remoteSettings",()=>{if(d.destroyed){const e=new Error("Agent has been destroyed");for(const t of r)t.reject(e);E.destroy()}else E[c]=E.originSet,this.emit("session",E),I()?y():0===this.maxFreeSessions?(y(),setImmediate(()=>{E.close()})):E.close(),f(),0!==r.length&&(this.getSession(u,t,r),r.length=0),p=!0,E.on("remoteSettings",()=>{m()&&l(this.busySessions,s,E)&&(I()?y():h(this.busySessions,s,E))})}),E[a]=E.request,E.request=e=>{const t=E[a](e,{endStream:!1});return E.ref(),++E[A],!m()&&l(this.freeSessions,s,E)&&h(this.busySessions,s,E),t.once("close",()=>{--E[A],m()&&(0===E[A]&&E.unref(),!l(this.busySessions,s,E)||E.destroyed||E.closed||(I()?(this._closeCoveredSessions(s,E),y()):E.close())),E.destroyed||E.closed||((e,t,r)=>{if(t in e)for(const n of e[t])r[c].lengthn[c].includes(e))&&r[A]+n[A]<=n.remoteSettings.maxConcurrentStreams&&r.close()})(this.freeSessions,s,E)}),t}}catch(e){for(const t of r)t.reject(e);f()}};d.listeners=r,d.completed=!1,d.destroyed=!1,this.queue[s][u]=d,this._tryToCreateNewSession(s,u)})}request(e,t,r){return new Promise((n,i)=>{this.getSession(e,t,[{reject:i,resolve:e=>{n(e.request(r))}}])})}createConnection(e,t){return p.connect(e,t)}static connect(e,t){t.ALPNProtocols=["h2"];const r=e.port||443,n=e.hostname||e.host;return void 0===t.servername&&(t.servername=n),i.connect(r,n,t)}closeFreeSessions(){for(const e of Object.values(this.freeSessions))for(const t of e)0===t[A]&&t.close()}destroy(e){for(const t of Object.values(this.busySessions))for(const r of t)r.destroy(e);for(const t of Object.values(this.freeSessions))for(const r of t)r.destroy(e);for(const e of Object.values(this.queue))for(const t of Object.values(e))t.destroyed=!0;this.queue={}}}e.exports={Agent:p,globalAgent:new p}},89018:(e,t,r)=>{"use strict";const n=r(98605),i=r(57211),o=r(19476),s=r(82905),A=r(46889),a=r(44294),c=r(95581),u=new s({maxSize:100}),l=new Map,h=(e,t,r)=>{t._httpMessage={shouldKeepAlive:!0};const n=()=>{e.emit("free",t,r)};t.on("free",n);const i=()=>{e.removeSocket(t,r)};t.on("close",i);const o=()=>{e.removeSocket(t,r),t.off("close",i),t.off("free",n),t.off("agentRemove",o)};t.on("agentRemove",o),e.emit("free",t,r)};e.exports=async(e,t,r)=>{("string"==typeof e||e instanceof URL)&&(e=c(new URL(e))),"function"==typeof t&&(r=t,t=void 0);const s="https:"===(t={ALPNProtocols:["h2","http/1.1"],protocol:"https:",...e,...t,resolveSocket:!0}).protocol,g=t.agent;if(t.host=t.hostname||t.host||"localhost",t.session=t.tlsSession,t.servername=t.servername||a(t),t.port=t.port||(s?443:80),t._defaultAgent=s?i.globalAgent:n.globalAgent,g){if(g.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");t.agent=g[s?"https":"http"]}if(s){if("h2"===await(async e=>{const t=`${e.host}:${e.port}:${e.ALPNProtocols.sort()}`;if(!u.has(t)){if(l.has(t)){return(await l.get(t)).alpnProtocol}const{path:r,agent:n}=e;e.path=e.socketPath;const s=o(e);l.set(t,s);try{const{socket:o,alpnProtocol:A}=await s;if(u.set(t,A),e.path=r,"h2"===A)o.destroy();else{const{globalAgent:t}=i,r=i.Agent.prototype.createConnection;n?n.createConnection===r?h(n,o,e):o.destroy():t.createConnection===r?h(t,o,e):o.destroy()}return l.delete(t),A}catch(e){throw l.delete(t),e}}return u.get(t)})(t))return g&&(t.agent=g.http2),new A(t,r)}return n.request(t,r)},e.exports.protocolCache=u},46889:(e,t,r)=>{"use strict";const n=r(97565),{Writable:i}=r(92413),{Agent:o,globalAgent:s}=r(92967),A=r(75744),a=r(95581),c=r(17395),u=r(13110),{ERR_INVALID_ARG_TYPE:l,ERR_INVALID_PROTOCOL:h,ERR_HTTP_HEADERS_SENT:g,ERR_INVALID_HTTP_TOKEN:f,ERR_HTTP_INVALID_HEADER_VALUE:p,ERR_INVALID_CHAR:d}=r(91078),{HTTP2_HEADER_STATUS:C,HTTP2_HEADER_METHOD:E,HTTP2_HEADER_PATH:I,HTTP2_METHOD_CONNECT:m}=n.constants,y=Symbol("headers"),w=Symbol("origin"),B=Symbol("session"),Q=Symbol("options"),v=Symbol("flushedHeaders"),D=Symbol("jobs"),b=/^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/,S=/[^\t\u0020-\u007E\u0080-\u00FF]/;e.exports=class extends i{constructor(e,t,r){super({autoDestroy:!1});const n="string"==typeof e||e instanceof URL;if(n&&(e=a(e instanceof URL?e:new URL(e))),"function"==typeof t||void 0===t?(r=t,t=n?e:{...e}):t={...e,...t},t.h2session)this[B]=t.h2session;else if(!1===t.agent)this.agent=new o({maxFreeSessions:0});else if(void 0===t.agent||null===t.agent)"function"==typeof t.createConnection?(this.agent=new o({maxFreeSessions:0}),this.agent.createConnection=t.createConnection):this.agent=s;else{if("function"!=typeof t.agent.request)throw new l("options.agent",["Agent-like Object","undefined","false"],t.agent);this.agent=t.agent}if(t.port||(t.port=t.defaultPort||this.agent&&this.agent.defaultPort||443),t.host=t.hostname||t.host||"localhost",t.protocol&&"https:"!==t.protocol)throw new h(t.protocol,"https:");const{timeout:i}=t;if(t.timeout=void 0,this[y]=Object.create(null),this[D]=[],this.socket=null,this.connection=null,this.method=t.method,this.path=t.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,t.headers)for(const[e,r]of Object.entries(t.headers))this.setHeader(e,r);t.auth&&!("authorization"in this[y])&&(this[y].authorization="Basic "+Buffer.from(t.auth).toString("base64")),t.session=t.tlsSession,t.path=t.socketPath,this[Q]=t,443===t.port?(t.origin="https://"+t.host,":authority"in this[y]||(this[y][":authority"]=t.host)):(t.origin=`https://${t.host}:${t.port}`,":authority"in this[y]||(this[y][":authority"]=`${t.host}:${t.port}`)),this[w]=t,i&&this.setTimeout(i),r&&this.once("response",r),this[v]=!1}get method(){return this[y][E]}set method(e){e&&(this[y][E]=e.toUpperCase())}get path(){return this[y][I]}set path(e){e&&(this[y][I]=e)}_write(e,t,r){this.flushHeaders();const n=()=>this._request.write(e,t,r);this._request?n():this[D].push(n)}_final(e){if(this.destroyed)return;this.flushHeaders();const t=()=>this._request.end(e);this._request?t():this[D].push(t)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,t){this.res&&this.res._dump(),this._request&&this._request.destroy(),t(e)}async flushHeaders(){if(this[v]||this.destroyed)return;this[v]=!0;const e=this.method===m,t=t=>{if(this._request=t,this.destroyed)return void t.destroy();e||c(t,this,["timeout","continue","close","error"]),t.once("response",(r,n,i)=>{const o=new A(this.socket,t.readableHighWaterMark);this.res=o,o.req=this,o.statusCode=r[C],o.headers=r,o.rawHeaders=i,o.once("end",()=>{this.aborted?(o.aborted=!0,o.emit("aborted")):(o.complete=!0,o.socket=null,o.connection=null)}),e?(o.upgrade=!0,this.emit("connect",o,t,Buffer.alloc(0))?this.emit("close"):t.destroy()):(t.on("data",e=>{o._dumped||o.push(e)||t.pause()}),t.once("end",()=>{o.push(null)}),this.emit("response",o)||o._dump())}),t.once("headers",e=>this.emit("information",{statusCode:e[C]})),t.once("trailers",(e,t,r)=>{const{res:n}=this;n.trailers=e,n.rawTrailers=r});const{socket:r}=t.session;this.socket=r,this.connection=r;for(const e of this[D])e();this.emit("socket",this.socket)};if(this[B])try{t(this[B].request(this[y],{endStream:!1}))}catch(e){this.emit("error",e)}else{this.reusedSocket=!0;try{t(await this.agent.request(this[w],this[Q],this[y]))}catch(e){this.emit("error",e)}}}getHeader(e){if("string"!=typeof e)throw new l("name","string",e);return this[y][e.toLowerCase()]}get headersSent(){return this[v]}removeHeader(e){if("string"!=typeof e)throw new l("name","string",e);if(this.headersSent)throw new g("remove");delete this[y][e.toLowerCase()]}setHeader(e,t){if(this.headersSent)throw new g("set");if("string"!=typeof e||!b.test(e)&&!u(e))throw new f("Header name",e);if(void 0===t)throw new p(t,e);if(S.test(t))throw new d("header content",e);this[y][e.toLowerCase()]=t}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,t){const r=()=>this._request.setTimeout(e,t);return this._request?r():this[D].push(r),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}}},75744:(e,t,r)=>{"use strict";const{Readable:n}=r(92413);e.exports=class extends n{constructor(e,t){super({highWaterMark:t,autoDestroy:!1}),this.statusCode=null,this.statusMessage="",this.httpVersion="2.0",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,t){return this.req.setTimeout(e,t),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}}},9453:(e,t,r)=>{"use strict";const n=r(97565),i=r(92967),o=r(46889),s=r(75744),A=r(89018);e.exports={...n,ClientRequest:o,IncomingMessage:s,...i,request:(e,t,r)=>new o(e,t,r),get:(e,t,r)=>{const n=new o(e,t,r);return n.end(),n},auto:A}},44294:(e,t,r)=>{"use strict";const n=r(11631);e.exports=e=>{let t=e.host;const r=e.headers&&e.headers.host;if(r)if(r.startsWith("[")){t=-1===r.indexOf("]")?r:r.slice(1,-1)}else t=r.split(":",1)[0];return n.isIP(t)?"":t}},91078:e=>{"use strict";const t=(t,r,n)=>{e.exports[r]=class extends t{constructor(...e){super("string"==typeof n?n:n(e)),this.name=`${super.name} [${r}]`,this.code=r}}};t(TypeError,"ERR_INVALID_ARG_TYPE",e=>{const t=e[0].includes(".")?"property":"argument";let r=e[1];const n=Array.isArray(r);return n&&(r=`${r.slice(0,-1).join(", ")} or ${r.slice(-1)}`),`The "${e[0]}" ${t} must be ${n?"one of":"of"} type ${r}. Received ${typeof e[2]}`}),t(TypeError,"ERR_INVALID_PROTOCOL",e=>`Protocol "${e[0]}" not supported. Expected "${e[1]}"`),t(Error,"ERR_HTTP_HEADERS_SENT",e=>`Cannot ${e[0]} headers after they are sent to the client`),t(TypeError,"ERR_INVALID_HTTP_TOKEN",e=>`${e[0]} must be a valid HTTP token [${e[1]}]`),t(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",e=>`Invalid value "${e[0]} for header "${e[1]}"`),t(TypeError,"ERR_INVALID_CHAR",e=>`Invalid character in ${e[0]} [${e[1]}]`)},13110:e=>{"use strict";e.exports=e=>{switch(e){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}},17395:e=>{"use strict";e.exports=(e,t,r)=>{for(const n of r)e.on(n,(...e)=>t.emit(n,...e))}},95581:e=>{"use strict";e.exports=e=>{const t={protocol:e.protocol,hostname:"string"==typeof e.hostname&&e.hostname.startsWith("[")?e.hostname.slice(1,-1):e.hostname,host:e.host,hash:e.hash,search:e.search,pathname:e.pathname,href:e.href,path:`${e.pathname||""}${e.search||""}`};return"string"==typeof e.port&&0!==e.port.length&&(t.port=Number(e.port)),(e.username||e.password)&&(t.auth=`${e.username||""}:${e.password||""}`),t}},3870:(e,t,r)=>{"use strict";var n=r(44765).Buffer;t._dbcs=s;for(var i=new Array(256),o=0;o<256;o++)i[o]=-1;function s(e,t){if(this.encodingName=e.encodingName,!e)throw new Error("DBCS codec is called without the data.");if(!e.table)throw new Error("Encoding '"+this.encodingName+"' has no data.");var r=e.table();this.decodeTables=[],this.decodeTables[0]=i.slice(0),this.decodeTableSeq=[];for(var n=0;nt)return-1;for(var r=0,n=e.length;r0;e>>=8)t.push(255&e);0==t.length&&t.push(0);for(var r=this.decodeTables[0],n=t.length-1;n>0;n--){var o=r[t[n]];if(-1==o)r[t[n]]=-1e3-this.decodeTables.length,this.decodeTables.push(r=i.slice(0));else{if(!(o<=-1e3))throw new Error("Overwrite byte in "+this.encodingName+", addr: "+e.toString(16));r=this.decodeTables[-1e3-o]}}return r},s.prototype._addDecodeChunk=function(e){var t=parseInt(e[0],16),r=this._getDecodeTrieNode(t);t&=255;for(var n=1;n255)throw new Error("Incorrect chunk in "+this.encodingName+" at addr "+e[0]+": too long"+t)},s.prototype._getEncodeBucket=function(e){var t=e>>8;return void 0===this.encodeTable[t]&&(this.encodeTable[t]=i.slice(0)),this.encodeTable[t]},s.prototype._setEncodeChar=function(e,t){var r=this._getEncodeBucket(e),n=255&e;r[n]<=-10?this.encodeTableSeq[-10-r[n]][-1]=t:-1==r[n]&&(r[n]=t)},s.prototype._setEncodeSequence=function(e,t){var r,n=e[0],i=this._getEncodeBucket(n),o=255&n;i[o]<=-10?r=this.encodeTableSeq[-10-i[o]]:(r={},-1!==i[o]&&(r[-1]=i[o]),i[o]=-10-this.encodeTableSeq.length,this.encodeTableSeq.push(r));for(var s=1;s=0?this._setEncodeChar(o,s):o<=-1e3?this._fillEncodeTable(-1e3-o,s<<8,r):o<=-10&&this._setEncodeSequence(this.decodeTableSeq[-10-o],s))}},A.prototype.write=function(e){for(var t=n.alloc(e.length*(this.gb18030?4:3)),r=this.leadSurrogate,i=this.seqObj,o=-1,s=0,A=0;;){if(-1===o){if(s==e.length)break;var a=e.charCodeAt(s++)}else{a=o;o=-1}if(55296<=a&&a<57344)if(a<56320){if(-1===r){r=a;continue}r=a,a=-1}else-1!==r?(a=65536+1024*(r-55296)+(a-56320),r=-1):a=-1;else-1!==r&&(o=a,a=-1,r=-1);var u=-1;if(void 0!==i&&-1!=a){var l=i[a];if("object"==typeof l){i=l;continue}"number"==typeof l?u=l:null==l&&void 0!==(l=i[-1])&&(u=l,o=a),i=void 0}else if(a>=0){var h=this.encodeTable[a>>8];if(void 0!==h&&(u=h[255&a]),u<=-10){i=this.encodeTableSeq[-10-u];continue}if(-1==u&&this.gb18030){var g=c(this.gb18030.uChars,a);if(-1!=g){u=this.gb18030.gbChars[g]+(a-this.gb18030.uChars[g]);t[A++]=129+Math.floor(u/12600),u%=12600,t[A++]=48+Math.floor(u/1260),u%=1260,t[A++]=129+Math.floor(u/10),u%=10,t[A++]=48+u;continue}}}-1===u&&(u=this.defaultCharSingleByte),u<256?t[A++]=u:u<65536?(t[A++]=u>>8,t[A++]=255&u):(t[A++]=u>>16,t[A++]=u>>8&255,t[A++]=255&u)}return this.seqObj=i,this.leadSurrogate=r,t.slice(0,A)},A.prototype.end=function(){if(-1!==this.leadSurrogate||void 0!==this.seqObj){var e=n.alloc(10),t=0;if(this.seqObj){var r=this.seqObj[-1];void 0!==r&&(r<256?e[t++]=r:(e[t++]=r>>8,e[t++]=255&r)),this.seqObj=void 0}return-1!==this.leadSurrogate&&(e[t++]=this.defaultCharSingleByte,this.leadSurrogate=-1),e.slice(0,t)}},A.prototype.findIdx=c,a.prototype.write=function(e){var t=n.alloc(2*e.length),r=this.nodeIdx,i=this.prevBuf,o=this.prevBuf.length,s=-this.prevBuf.length;o>0&&(i=n.concat([i,e.slice(0,10)]));for(var A=0,a=0;A=0?e[A]:i[A+o];if((u=this.decodeTables[r][l])>=0);else if(-1===u)A=s,u=this.defaultCharUnicode.charCodeAt(0);else if(-2===u){var h=s>=0?e.slice(s,A+1):i.slice(s+o,A+1+o),g=12600*(h[0]-129)+1260*(h[1]-48)+10*(h[2]-129)+(h[3]-48),f=c(this.gb18030.gbChars,g);u=this.gb18030.uChars[f]+g-this.gb18030.gbChars[f]}else{if(u<=-1e3){r=-1e3-u;continue}if(!(u<=-10))throw new Error("iconv-lite internal error: invalid decoding table value "+u+" at "+r+"/"+l);for(var p=this.decodeTableSeq[-10-u],d=0;d>8;u=p[p.length-1]}if(u>65535){u-=65536;var C=55296+Math.floor(u/1024);t[a++]=255&C,t[a++]=C>>8,u=56320+u%1024}t[a++]=255&u,t[a++]=u>>8,r=0,s=A+1}return this.nodeIdx=r,this.prevBuf=s>=0?e.slice(s):i.slice(s+o),t.slice(0,a).toString("ucs2")},a.prototype.end=function(){for(var e="";this.prevBuf.length>0;){e+=this.defaultCharUnicode;var t=this.prevBuf.slice(1);this.prevBuf=n.alloc(0),this.nodeIdx=0,t.length>0&&(e+=this.write(t))}return this.nodeIdx=0,e}},18476:(e,t,r)=>{"use strict";e.exports={shiftjis:{type:"_dbcs",table:function(){return r(49688)},encodeAdd:{"Â¥":92,"‾":126},encodeSkipVals:[{from:60736,to:63808}]},csshiftjis:"shiftjis",mskanji:"shiftjis",sjis:"shiftjis",windows31j:"shiftjis",ms31j:"shiftjis",xsjis:"shiftjis",windows932:"shiftjis",ms932:"shiftjis",932:"shiftjis",cp932:"shiftjis",eucjp:{type:"_dbcs",table:function(){return r(20345)},encodeAdd:{"Â¥":92,"‾":126}},gb2312:"cp936",gb231280:"cp936",gb23121980:"cp936",csgb2312:"cp936",csiso58gb231280:"cp936",euccn:"cp936",windows936:"cp936",ms936:"cp936",936:"cp936",cp936:{type:"_dbcs",table:function(){return r(2685)}},gbk:{type:"_dbcs",table:function(){return r(2685).concat(r(4764))}},xgbk:"gbk",isoir58:"gbk",gb18030:{type:"_dbcs",table:function(){return r(2685).concat(r(4764))},gb18030:function(){return r(39909)},encodeSkipVals:[128],encodeAdd:{"€":41699}},chinese:"gb18030",windows949:"cp949",ms949:"cp949",949:"cp949",cp949:{type:"_dbcs",table:function(){return r(39192)}},cseuckr:"cp949",csksc56011987:"cp949",euckr:"cp949",isoir149:"cp949",korean:"cp949",ksc56011987:"cp949",ksc56011989:"cp949",ksc5601:"cp949",windows950:"cp950",ms950:"cp950",950:"cp950",cp950:{type:"_dbcs",table:function(){return r(73691)}},big5:"big5hkscs",big5hkscs:{type:"_dbcs",table:function(){return r(73691).concat(r(93701))},encodeSkipVals:[41676]},cnbig5:"big5hkscs",csbig5:"big5hkscs",xxbig5:"big5hkscs"}},15709:(e,t,r)=>{"use strict";for(var n=[r(70497),r(2682),r(46339),r(31658),r(1999),r(53522),r(3870),r(18476)],i=0;i{"use strict";var n=r(44765).Buffer;function i(e,t){this.enc=e.encodingName,this.bomAware=e.bomAware,"base64"===this.enc?this.encoder=a:"cesu8"===this.enc&&(this.enc="utf8",this.encoder=c,"💩"!==n.from("eda0bdedb2a9","hex").toString()&&(this.decoder=u,this.defaultCharUnicode=t.defaultCharUnicode))}e.exports={utf8:{type:"_internal",bomAware:!0},cesu8:{type:"_internal",bomAware:!0},unicode11utf8:"utf8",ucs2:{type:"_internal",bomAware:!0},utf16le:"ucs2",binary:{type:"_internal"},base64:{type:"_internal"},hex:{type:"_internal"},_internal:i},i.prototype.encoder=A,i.prototype.decoder=s;var o=r(24304).StringDecoder;function s(e,t){o.call(this,t.enc)}function A(e,t){this.enc=t.enc}function a(e,t){this.prevStr=""}function c(e,t){}function u(e,t){this.acc=0,this.contBytes=0,this.accBytes=0,this.defaultCharUnicode=t.defaultCharUnicode}o.prototype.end||(o.prototype.end=function(){}),s.prototype=o.prototype,A.prototype.write=function(e){return n.from(e,this.enc)},A.prototype.end=function(){},a.prototype.write=function(e){var t=(e=this.prevStr+e).length-e.length%4;return this.prevStr=e.slice(t),e=e.slice(0,t),n.from(e,"base64")},a.prototype.end=function(){return n.from(this.prevStr,"base64")},c.prototype.write=function(e){for(var t=n.alloc(3*e.length),r=0,i=0;i>>6),t[r++]=128+(63&o)):(t[r++]=224+(o>>>12),t[r++]=128+(o>>>6&63),t[r++]=128+(63&o))}return t.slice(0,r)},c.prototype.end=function(){},u.prototype.write=function(e){for(var t=this.acc,r=this.contBytes,n=this.accBytes,i="",o=0;o0&&(i+=this.defaultCharUnicode,r=0),s<128?i+=String.fromCharCode(s):s<224?(t=31&s,r=1,n=1):s<240?(t=15&s,r=2,n=1):i+=this.defaultCharUnicode):r>0?(t=t<<6|63&s,n++,0===--r&&(i+=2===n&&t<128&&t>0||3===n&&t<2048?this.defaultCharUnicode:String.fromCharCode(t))):i+=this.defaultCharUnicode}return this.acc=t,this.contBytes=r,this.accBytes=n,i},u.prototype.end=function(){var e=0;return this.contBytes>0&&(e+=this.defaultCharUnicode),e}},31658:(e,t,r)=>{"use strict";var n=r(44765).Buffer;function i(e,t){if(!e)throw new Error("SBCS codec is called without the data.");if(!e.chars||128!==e.chars.length&&256!==e.chars.length)throw new Error("Encoding '"+e.type+"' has incorrect 'chars' (must be of len 128 or 256)");if(128===e.chars.length){for(var r="",i=0;i<128;i++)r+=String.fromCharCode(i);e.chars=r+e.chars}this.decodeBuf=n.from(e.chars,"ucs2");var o=n.alloc(65536,t.defaultCharSingleByte.charCodeAt(0));for(i=0;i{"use strict";e.exports={437:"cp437",737:"cp737",775:"cp775",850:"cp850",852:"cp852",855:"cp855",856:"cp856",857:"cp857",858:"cp858",860:"cp860",861:"cp861",862:"cp862",863:"cp863",864:"cp864",865:"cp865",866:"cp866",869:"cp869",874:"windows874",922:"cp922",1046:"cp1046",1124:"cp1124",1125:"cp1125",1129:"cp1129",1133:"cp1133",1161:"cp1161",1162:"cp1162",1163:"cp1163",1250:"windows1250",1251:"windows1251",1252:"windows1252",1253:"windows1253",1254:"windows1254",1255:"windows1255",1256:"windows1256",1257:"windows1257",1258:"windows1258",28591:"iso88591",28592:"iso88592",28593:"iso88593",28594:"iso88594",28595:"iso88595",28596:"iso88596",28597:"iso88597",28598:"iso88598",28599:"iso88599",28600:"iso885910",28601:"iso885911",28603:"iso885913",28604:"iso885914",28605:"iso885915",28606:"iso885916",windows874:{type:"_sbcs",chars:"€����…�����������‘’“â€â€¢â€“—�������� à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºï¿½ï¿½ï¿½ï¿½à¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛����"},win874:"windows874",cp874:"windows874",windows1250:{type:"_sbcs",chars:"€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“â€â€¢â€“—�™š›śťžź ˇ˘Å¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»ĽËľżŔÃÂĂÄĹĆÇČÉĘËĚÃÃŽÄŽÄŃŇÓÔÅÖ×ŘŮÚŰÜÃŢßŕáâăäĺćçÄéęëěíîÄđńňóôőö÷řůúűüýţ˙"},win1250:"windows1250",cp1250:"windows1250",windows1251:{type:"_sbcs",chars:"ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋÐђ‘’“â€â€¢â€“—�™љ›њќћџ ЎўЈ¤Ò¦§Ð©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ"},win1251:"windows1251",cp1251:"windows1251",windows1252:{type:"_sbcs",chars:"€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“â€â€¢â€“—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖ×ØÙÚÛÜÃÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"},win1252:"windows1252",cp1252:"windows1252",windows1253:{type:"_sbcs",chars:"€�‚ƒ„…†‡�‰�‹�����‘’“â€â€¢â€“—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎÎÎΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπÏςστυφχψωϊϋόÏώ�"},win1253:"windows1253",cp1253:"windows1253",windows1254:{type:"_sbcs",chars:"€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“â€â€¢â€“—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ"},win1254:"windows1254",cp1254:"windows1254",windows1255:{type:"_sbcs",chars:"€�‚ƒ„…†‡ˆ‰�‹�����‘’“â€â€¢â€“—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹֺֻּֽ־ֿ׀×ׂ׃װױײ׳״�������×בגדהוזחטיךכל×מןנסעףפץצקרשת��‎â€ï¿½"},win1255:"windows1255",cp1255:"windows1255",windows1256:{type:"_sbcs",chars:"€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“â€â€¢â€“—ک™ڑ›œ‌â€ÚºÂ ØŒÂ¢Â£Â¤Â¥Â¦Â§Â¨Â©Ú¾Â«Â¬Â­Â®Â¯Â°Â±Â²Â³Â´ÂµÂ¶Â·Â¸Â¹Ø›Â»Â¼Â½Â¾ØŸÛءآأؤإئابةتثجحخدذرزسشصض×طظعغـÙقكàلâمنهوçèéêëىيîïًٌÙَôÙÙ÷ّùْûü‎â€Û’"},win1256:"windows1256",cp1256:"windows1256",windows1257:{type:"_sbcs",chars:"€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“â€â€¢â€“—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲÅŚŪÜŻŽßąįÄćäåęēÄéźėģķīļšńņóÅõö÷ųłśūüżž˙"},win1257:"windows1257",cp1257:"windows1257",windows1258:{type:"_sbcs",chars:"€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“â€â€¢â€“—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂĂÄÅÆÇÈÉÊË̀ÃÃŽÃÄÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêëÌíîïđṇ̃óôơö÷øùúûüư₫ÿ"},win1258:"windows1258",cp1258:"windows1258",iso88591:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖ×ØÙÚÛÜÃÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"},cp28591:"iso88591",iso88592:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ Ą˘Å¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťźËžżŔÃÂĂÄĹĆÇČÉĘËĚÃÃŽÄŽÄŃŇÓÔÅÖ×ŘŮÚŰÜÃŢßŕáâăäĺćçÄéęëěíîÄđńňóôőö÷řůúűüýţ˙"},cp28592:"iso88592",iso88593:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ Ħ˘£¤�Ĥ§¨İŞĞĴ­�Ż°ħ²³´µĥ·¸ışğĵ½�żÀÃÂ�ÄĊĈÇÈÉÊËÌÃÃŽÃ�ÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâ�äċĉçèéêëìíîï�ñòóôġö÷ÄùúûüŭÅË™"},cp28593:"iso88593",iso88594:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ĄĸŖ¤ĨĻ§¨ŠĒĢŦ­Ž¯°ą˛ŗ´ĩļˇ¸šēģŧŊžŋĀÃÂÃÄÅÆĮČÉĘËĖÃÎĪÄŅŌĶÔÕÖ×ØŲÚÛÜŨŪßÄáâãäåæįÄéęëėíîīđņÅķôõö÷øųúûüũū˙"},cp28594:"iso88594",iso88595:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ÐЂЃЄЅІЇЈЉЊЋЌ­ЎÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ№ёђѓєѕіїјљњћќ§ўџ"},cp28595:"iso88595",iso88596:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ���¤�������،­�������������؛���؟�ءآأؤإئابةتثجحخدذرزسشصضطظعغ�����ـÙقكلمنهوىيًٌÙÙŽÙÙّْ�������������"},cp28596:"iso88596",iso88597:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ‘’£€₯¦§¨©ͺ«¬­�―°±²³΄΅Ά·ΈΉΊ»Ό½ΎÎÎΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπÏςστυφχψωϊϋόÏώ�"},cp28597:"iso88597",iso88598:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ �¢£¤¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾��������������������������������‗×בגדהוזחטיךכל×מןנסעףפץצקרשת��‎â€ï¿½"},cp28598:"iso88598",iso88599:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ"},cp28599:"iso88599",iso885910:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ĄĒĢĪĨĶ§ĻÄŠŦŽ­ŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÃÂÃÄÅÆĮČÉĘËĖÃÃŽÃÃŅŌÓÔÕÖŨØŲÚÛÜÃÞßÄáâãäåæįÄéęëėíîïðņÅóôõöũøųúûüýþĸ"},cp28600:"iso885910",iso885911:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºï¿½ï¿½ï¿½ï¿½à¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛����"},cp28601:"iso885911",iso885913:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ â€Â¢Â£Â¤â€žÂ¦Â§Ã˜Â©Å–«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲÅŚŪÜŻŽßąįÄćäåęēÄéźėģķīļšńņóÅõö÷ųłśūüżž’"},cp28603:"iso885913",iso885914:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ Ḃḃ£ĊċḊ§Ẁ©ẂḋỲ­®ŸḞḟĠġṀá¹Â¶á¹–áºá¹—ẃṠỳẄẅṡÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃŴÑÒÓÔÕÖṪØÙÚÛÜÃŶßàáâãäåæçèéêëìíîïŵñòóôõöṫøùúûüýŷÿ"},cp28604:"iso885914",iso885915:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖ×ØÙÚÛÜÃÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"},cp28605:"iso885915",iso885916:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ĄąÅ€„Š§š©Ș«Ź­źŻ°±ČłŽâ€Â¶Â·Å¾Äș»ŒœŸżÀÃÂĂÄĆÆÇÈÉÊËÌÃÃŽÃÄŃÒÓÔÅÖŚŰÙÚÛÜĘȚßàáâăäćæçèéêëìíîïđńòóôőöśűùúûüęțÿ"},cp28606:"iso885916",cp437:{type:"_sbcs",chars:"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿âŒÂ¬Â½Â¼Â¡Â«Â»â–‘▒▓│┤╡╢╖╕╣║╗â•â•œâ•›â”└┴┬├─┼╞╟╚╔╩╦╠â•â•¬â•§â•¨â•¤â•¥â•™â•˜â•’╓╫╪┘┌█▄▌â–▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â "},ibm437:"cp437",csibm437:"cp437",cp737:{type:"_sbcs",chars:"ΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπÏσςτυφχψ░▒▓│┤╡╢╖╕╣║╗â•â•œâ•›â”└┴┬├─┼╞╟╚╔╩╦╠â•â•¬â•§â•¨â•¤â•¥â•™â•˜â•’╓╫╪┘┌█▄▌â–▀ωάέήϊίόÏϋώΆΈΉΊΌΎÎ±≥≤ΪΫ÷≈°∙·√â¿Â²â– Â "},ibm737:"cp737",csibm737:"cp737",cp775:{type:"_sbcs",chars:"ĆüéÄäģåćłēŖŗīŹÄÅÉæÆÅöĢ¢ŚśÖÜø£ØפĀĪóŻżźâ€Â¦Â©Â®Â¬Â½Â¼Å«»░▒▓│┤ĄČĘĖ╣║╗â•Ä®Å â”└┴┬├─┼ŲŪ╚╔╩╦╠â•â•¬Å½Ä…Äęėįšųūž┘┌█▄▌â–▀ÓßŌŃõÕµńĶķĻļņĒŅ’­±“¾¶§÷„°∙·¹³²■ "},ibm775:"cp775",csibm775:"cp775",cp850:{type:"_sbcs",chars:"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«»░▒▓│┤ÃÂÀ©╣║╗â•Â¢Â¥â”└┴┬├─┼ãÃ╚╔╩╦╠â•â•¬Â¤Ã°ÃÊËÈıÃÃŽÃ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýï´­±‗¾¶§÷¸°¨·¹³²■ "},ibm850:"cp850",csibm850:"cp850",cp852:{type:"_sbcs",chars:"ÇüéâäůćçłëÅőîŹÄĆÉĹĺôöĽľŚśÖÜŤťÅ×ÄáíóúĄąŽžĘ꬟Ⱥ«»░▒▓│┤ÃÂĚŞ╣║╗â•Å»Å¼â”└┴┬├─┼Ăă╚╔╩╦╠â•â•¬Â¤Ä‘ÄĎËÄŇÃÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÃţ´­Ë˛ˇ˘§÷¸°¨˙űŘř■ "},ibm852:"cp852",csibm852:"cp852",cp855:{type:"_sbcs",chars:"ђЂѓЃёÐєЄѕЅіІїЇјЈљЉњЊћЋќЌўЎџÐюЮъЪаÐбБцЦдДеЕфФгГ«»░▒▓│┤хХиИ╣║╗â•Ð¹Ð™â”└┴┬├─┼кК╚╔╩╦╠â•â•¬Â¤Ð»Ð›Ð¼ÐœÐ½ÐоОп┘┌█▄ПÑ▀ЯрРÑСтТуУжЖвВьЬ№­ыЫзЗшШÑЭщЩчЧ§■ "},ibm855:"cp855",csibm855:"cp855",cp856:{type:"_sbcs",chars:"×בגדהוזחטיךכל×מןנסעףפץצקרשת�£�×����������®¬½¼�«»░▒▓│┤���©╣║╗â•Â¢Â¥â”└┴┬├─┼��╚╔╩╦╠â•â•¬Â¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½â”˜â”Œâ–ˆâ–„¦�▀������µ�������¯´­±‗¾¶§÷¸°¨·¹³²■ "},ibm856:"cp856",csibm856:"cp856",cp857:{type:"_sbcs",chars:"ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞ𿮬½¼¡«»░▒▓│┤ÃÂÀ©╣║╗â•Â¢Â¥â”└┴┬├─┼ãÃ╚╔╩╦╠â•â•¬Â¤ÂºÂªÃŠÃ‹Ãˆï¿½ÃÃŽÃ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ "},ibm857:"cp857",csibm857:"cp857",cp858:{type:"_sbcs",chars:"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«»░▒▓│┤ÃÂÀ©╣║╗â•Â¢Â¥â”└┴┬├─┼ãÃ╚╔╩╦╠â•â•¬Â¤Ã°ÃÊËÈ€ÃÃŽÃ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýï´­±‗¾¶§÷¸°¨·¹³²■ "},ibm858:"cp858",csibm858:"cp858",cp860:{type:"_sbcs",chars:"ÇüéâãàÃçêÊèÃÔìÃÂÉÀÈôõòÚùÌÕÜ¢£Ù₧ÓáíóúñѪº¿Ò¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗â•â•œâ•›â”└┴┬├─┼╞╟╚╔╩╦╠â•â•¬â•§â•¨â•¤â•¥â•™â•˜â•’╓╫╪┘┌█▄▌â–▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â "},ibm860:"cp860",csibm860:"cp860",cp861:{type:"_sbcs",chars:"ÇüéâäàåçêëèÃðÞÄÅÉæÆôöþûÃýÖÜø£Ø₧ƒáíóúÃÃÓÚ¿âŒÂ¬Â½Â¼Â¡Â«Â»â–‘▒▓│┤╡╢╖╕╣║╗â•â•œâ•›â”└┴┬├─┼╞╟╚╔╩╦╠â•â•¬â•§â•¨â•¤â•¥â•™â•˜â•’╓╫╪┘┌█▄▌â–▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â "},ibm861:"cp861",csibm861:"cp861",cp862:{type:"_sbcs",chars:"×בגדהוזחטיךכל×מןנסעףפץצקרשת¢£¥₧ƒáíóúñѪº¿âŒÂ¬Â½Â¼Â¡Â«Â»â–‘▒▓│┤╡╢╖╕╣║╗â•â•œâ•›â”└┴┬├─┼╞╟╚╔╩╦╠â•â•¬â•§â•¨â•¤â•¥â•™â•˜â•’╓╫╪┘┌█▄▌â–▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â "},ibm862:"cp862",csibm862:"cp862",cp863:{type:"_sbcs",chars:"ÇüéâÂà¶çêëèïî‗À§ÉÈÊôËÃûù¤ÔÜ¢£ÙÛƒ¦´óú¨¸³¯ÎâŒÂ¬Â½Â¼Â¾Â«Â»â–‘▒▓│┤╡╢╖╕╣║╗â•â•œâ•›â”└┴┬├─┼╞╟╚╔╩╦╠â•â•¬â•§â•¨â•¤â•¥â•™â•˜â•’╓╫╪┘┌█▄▌â–▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â "},ibm863:"cp863",csibm863:"cp863",cp864:{type:"_sbcs",chars:"\0\b\t\n\v\f\r !\"#$Ùª&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~°·∙√▒─│┼┤┬├┴â”┌└┘β∞φ±½¼≈«»ﻷﻸ��ﻻﻼ� ­ﺂ£¤ﺄ��ﺎïºïº•ïº™ØŒïºïº¡ïº¥Ù Ù¡Ù¢Ù£Ù¤Ù¥Ù¦Ù§Ù¨Ù©ï»‘؛ﺱﺵﺹ؟¢ﺀïºïºƒïº…ﻊﺋïºïº‘ﺓﺗﺛﺟﺣﺧﺩﺫﺭﺯﺳﺷﺻﺿï»ï»…ﻋï»Â¦Â¬Ã·Ã—ﻉـﻓﻗﻛﻟﻣﻧﻫﻭﻯﻳﺽﻌﻎï»ï»¡ï¹½Ù‘ﻥﻩﻬﻰﻲï»ï»•ï»µï»¶ï»ï»™ï»±â– ï¿½"},ibm864:"cp864",csibm864:"cp864",cp865:{type:"_sbcs",chars:"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñѪº¿âŒÂ¬Â½Â¼Â¡Â«Â¤â–‘▒▓│┤╡╢╖╕╣║╗â•â•œâ•›â”└┴┬├─┼╞╟╚╔╩╦╠â•â•¬â•§â•¨â•¤â•¥â•™â•˜â•’╓╫╪┘┌█▄▌â–▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â "},ibm865:"cp865",csibm865:"cp865",cp866:{type:"_sbcs",chars:"ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗â•â•œâ•›â”└┴┬├─┼╞╟╚╔╩╦╠â•â•¬â•§â•¨â•¤â•¥â•™â•˜â•’╓╫╪┘┌█▄▌â–▀рÑтуфхцчшщъыьÑÑŽÑÐёЄєЇїЎў°∙·√№¤■ "},ibm866:"cp866",csibm866:"cp866",cp869:{type:"_sbcs",chars:"������Ά�·¬¦‘’Έ―ΉΊΪΌ��ΎΫ©Î²³ά£έήίϊÎÏŒÏΑΒΓΔΕΖΗ½ΘΙ«»░▒▓│┤ΚΛΜÎ╣║╗â•ÎžÎŸâ”└┴┬├─┼ΠΡ╚╔╩╦╠â•â•¬Î£Î¤Î¥Î¦Î§Î¨Î©Î±Î²Î³â”˜â”Œâ–ˆâ–„δε▀ζηθικλμνξοπÏσςτ΄­±υφχ§ψ΅°¨ωϋΰώ■ "},ibm869:"cp869",csibm869:"cp869",cp922:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ¡¢£¤¥¦§¨©ª«¬­®‾°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÎÊÑÒÓÔÕÖ×ØÙÚÛÜÃŽßàáâãäåæçèéêëìíîïšñòóôõö÷øùúûüýžÿ"},ibm922:"cp922",csibm922:"cp922",cp1046:{type:"_sbcs",chars:"ﺈ×÷ﹱˆ■│─â”┌└┘ﹹﹻﹽﹿﹷﺊﻰﻳﻲﻎï»ï»ï»¶ï»¸ï»ºï»¼Â ï£ºï£¹ï£¸Â¤ï£»ïº‹ïº‘ﺗﺛﺟﺣ،­ﺧﺳ٠١٢٣٤٥٦٧٨٩ﺷ؛ﺻﺿﻊ؟ﻋءآأؤإئابةتثجحخدذرزسشصضطﻇعغﻌﺂﺄﺎﻓـÙقكلمنهوىيًٌÙÙŽÙÙّْﻗﻛﻟﻵﻷﻹﻻﻣﻧﻬﻩ�"},ibm1046:"cp1046",csibm1046:"cp1046",cp1124:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ÐЂÒЄЅІЇЈЉЊЋЌ­ЎÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ№ёђґєѕіїјљњћќ§ўџ"},ibm1124:"cp1124",csibm1124:"cp1124",cp1125:{type:"_sbcs",chars:"ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗â•â•œâ•›â”└┴┬├─┼╞╟╚╔╩╦╠â•â•¬â•§â•¨â•¤â•¥â•™â•˜â•’╓╫╪┘┌█▄▌â–▀рÑтуфхцчшщъыьÑÑŽÑÐÑ‘ÒґЄєІіЇї·√№¤■ "},ibm1125:"cp1125",csibm1125:"cp1125",cp1129:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ¡¢£¤¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÃÂĂÄÅÆÇÈÉÊË̀ÃÃŽÃÄÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêëÌíîïđṇ̃óôơö÷øùúûüư₫ÿ"},ibm1129:"cp1129",csibm1129:"cp1129",cp1133:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ àºàº‚ຄງຈສຊàºàº”ຕຖທນບປຜàºàºžàºŸàº¡àº¢àº£àº¥àº§àº«àº­àº®ï¿½ï¿½ï¿½àº¯àº°àº²àº³àº´àºµàº¶àº·àº¸àº¹àº¼àº±àº»àº½ï¿½ï¿½ï¿½à»€à»à»‚ໃໄ່້໊໋໌à»à»†ï¿½à»œà»â‚­ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½à»à»‘໒໓໔໕໖໗໘໙��¢¬¦�"},ibm1133:"cp1133",csibm1133:"cp1133",cp1161:{type:"_sbcs",chars:"��������������������������������่à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºà¹‰à¹Šà¹‹â‚¬à¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛¢¬¦ "},ibm1161:"cp1161",csibm1161:"cp1161",cp1162:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“â€â€¢â€“—˜™š›œÂžŸ à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºï¿½ï¿½ï¿½ï¿½à¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛����"},ibm1162:"cp1162",csibm1162:"cp1162",cp1163:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ¡¢£€¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÃÂĂÄÅÆÇÈÉÊË̀ÃÃŽÃÄÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêëÌíîïđṇ̃óôơö÷øùúûüư₫ÿ"},ibm1163:"cp1163",csibm1163:"cp1163",maccroatian:{type:"_sbcs",chars:"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑âˆÅ¡âˆ«ÂªÂºâ„¦Å¾Ã¸Â¿Â¡Â¬âˆšÆ’≈Ć«Č… ÀÃÕŒœÄ—“â€â€˜â€™Ã·â—Šï¿½Â©â„¤‹›Æ»–·‚„‰ÂćÃÄÈÃÃŽÃÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ"},maccyrillic:{type:"_sbcs",chars:"ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“â€â€˜â€™Ã·â€žÐŽÑžÐÑŸâ„–ÐÑ‘ÑабвгдежзийклмнопрÑтуфхцчшщъыьÑю¤"},macgreek:{type:"_sbcs",chars:"Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάάΟΡ≈Τ«»… ΥΧΆΈœ–―“â€â€˜â€™Ã·Î‰ÎŠÎŒÎŽÎ­Î®Î¯ÏŒÎÏαβψδεφγηιξκλμνοπώÏστθωςχυζϊϋÎΰ�"},maciceland:{type:"_sbcs",chars:"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü𢣧•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑âˆÏ€âˆ«ÂªÂºâ„¦Ã¦Ã¸Â¿Â¡Â¬âˆšÆ’≈∆«»… ÀÃÕŒœ–—“â€â€˜â€™Ã·â—ŠÃ¿Å¸â„¤ÃðÞþý·‚„‰ÂÊÃËÈÃÃŽÃÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸Ë˛ˇ"},macroman:{type:"_sbcs",chars:"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑âˆÏ€âˆ«ÂªÂºâ„¦Ã¦Ã¸Â¿Â¡Â¬âˆšÆ’≈∆«»… ÀÃÕŒœ–—“â€â€˜â€™Ã·â—ŠÃ¿Å¸â„¤‹›ï¬ï¬‚‡·‚„‰ÂÊÃËÈÃÃŽÃÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸Ë˛ˇ"},macromania:{type:"_sbcs",chars:"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂŞ∞±≤≥¥µ∂∑âˆÏ€âˆ«ÂªÂºâ„¦ÄƒÅŸÂ¿Â¡Â¬âˆšÆ’≈∆«»… ÀÃÕŒœ–—“â€â€˜â€™Ã·â—ŠÃ¿Å¸â„¤‹›Ţţ‡·‚„‰ÂÊÃËÈÃÃŽÃÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸Ë˛ˇ"},macthai:{type:"_sbcs",chars:"«»…ï¢ï¢’“â€ï¢™ï¿½â€¢ï¢„ï¢ï¢ï¢“‘’� à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸º\ufeff​–—฿เà¹à¹‚ใไๅๆ็่้๊๋์à¹â„¢à¹à¹à¹‘๒๓๔๕๖๗๘๙®©����"},macturkish:{type:"_sbcs",chars:"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑âˆÏ€âˆ«ÂªÂºâ„¦Ã¦Ã¸Â¿Â¡Â¬âˆšÆ’≈∆«»… ÀÃÕŒœ–—“â€â€˜â€™Ã·â—ŠÃ¿Å¸ÄžÄŸÄ°Ä±ÅžÅŸâ€¡Â·â€šâ€žâ€°Ã‚ÊÃËÈÃÃŽÃÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸Ë˛ˇ"},macukraine:{type:"_sbcs",chars:"ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ò£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“â€â€˜â€™Ã·â€žÐŽÑžÐÑŸâ„–ÐÑ‘ÑабвгдежзийклмнопрÑтуфхцчшщъыьÑю¤"},koi8r:{type:"_sbcs",chars:"─│┌â”└┘├┤┬┴┼▀▄█▌â–░▒▓⌠■∙√≈≤≥ ⌡°²·÷â•â•‘╒ё╓╔╕╖╗╘╙╚╛╜â•â•žâ•Ÿâ• â•¡Ð╢╣╤╥╦╧╨╩╪╫╬©юабцдефгхийклмнопÑÑ€ÑтужвьызшÑщчъЮÐБЦДЕФГХИЙКЛМÐОПЯРСТУЖВЬЫЗШЭЩЧЪ"},koi8u:{type:"_sbcs",chars:"─│┌â”└┘├┤┬┴┼▀▄█▌â–░▒▓⌠■∙√≈≤≥ ⌡°²·÷â•â•‘╒ёє╔ії╗╘╙╚╛ґâ•â•žâ•Ÿâ• â•¡ÐЄ╣ІЇ╦╧╨╩╪Ò╬©юабцдефгхийклмнопÑÑ€ÑтужвьызшÑщчъЮÐБЦДЕФГХИЙКЛМÐОПЯРСТУЖВЬЫЗШЭЩЧЪ"},koi8ru:{type:"_sbcs",chars:"─│┌â”└┘├┤┬┴┼▀▄█▌â–░▒▓⌠■∙√≈≤≥ ⌡°²·÷â•â•‘╒ёє╔ії╗╘╙╚╛ґў╞╟╠╡ÐЄ╣ІЇ╦╧╨╩╪ÒЎ©юабцдефгхийклмнопÑÑ€ÑтужвьызшÑщчъЮÐБЦДЕФГХИЙКЛМÐОПЯРСТУЖВЬЫЗШЭЩЧЪ"},koi8t:{type:"_sbcs",chars:"қғ‚Ғ„…†‡�‰ҳ‹ҲҷҶ�Қ‘’“â€â€¢â€“—�™�›�����ӯӮё¤ӣ¦§���«¬­®�°±²Ð�Ӣ¶·�№�»���©юабцдефгхийклмнопÑÑ€ÑтужвьызшÑщчъЮÐБЦДЕФГХИЙКЛМÐОПЯРСТУЖВЬЫЗШЭЩЧЪ"},armscii8:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ �և։)(»«—.Õ,-֊…՜՛՞ԱաԲբԳգԴդԵեԶզԷէԸըԹթԺժԻիԼլԽխԾծԿկՀհÕձՂղՃճՄմՅյՆնՇշՈոՉչՊպՋջՌռÕÕ½ÕŽÕ¾ÕÕ¿ÕÖ€Õ‘ÖՒւՓփՔքՕօՖֆ՚�"},rk1048:{type:"_sbcs",chars:"ЂЃ‚ѓ„…†‡€‰Љ‹ЊҚҺÐђ‘’“â€â€¢â€“—�™љ›њқһџ ҰұӘ¤Ө¦§Ð©Ғ«¬­®Ү°±Ііөµ¶·ё№ғ»әҢңүÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ"},tcvn:{type:"_sbcs",chars:"\0ÚỤỪỬỮ\b\t\n\v\f\rỨỰỲỶỸÃá»´ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÀẢÃÃẠẶẬÈẺẼÉẸỆÌỈĨÃỊÒỎÕÓỌỘỜỞỠỚỢÙỦŨ ĂÂÊÔƠƯÄăâêôơưđẰ̀̉̃Ị̀àảãáạẲằẳẵắẴẮẦẨẪẤỀặầẩẫấậèỂẻẽéẹá»á»ƒá»…ếệìỉỄẾỒĩíịòỔá»ÃµÃ³á»á»“ổỗốộá»á»Ÿá»¡á»›á»£Ã¹á»–ủũúụừửữứựỳỷỹýỵá»"},georgianacademy:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“â€â€¢â€“—˜™š›œÂžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿áƒáƒ‘გდევზთიკლმნáƒáƒžáƒŸáƒ áƒ¡áƒ¢áƒ£áƒ¤áƒ¥áƒ¦áƒ§áƒ¨áƒ©áƒªáƒ«áƒ¬áƒ­áƒ®áƒ¯áƒ°áƒ±áƒ²áƒ³áƒ´áƒµáƒ¶Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯Ã°Ã±Ã²Ã³Ã´ÃµÃ¶Ã·Ã¸Ã¹ÃºÃ»Ã¼Ã½Ã¾Ã¿"},georgianps:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“â€â€¢â€“—˜™š›œÂžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿áƒáƒ‘გდევზჱთიკლმნჲáƒáƒžáƒŸáƒ áƒ¡áƒ¢áƒ³áƒ£áƒ¤áƒ¥áƒ¦áƒ§áƒ¨áƒ©áƒªáƒ«áƒ¬áƒ­áƒ®áƒ´áƒ¯áƒ°áƒµÃ¦Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯Ã°Ã±Ã²Ã³Ã´ÃµÃ¶Ã·Ã¸Ã¹ÃºÃ»Ã¼Ã½Ã¾Ã¿"},pt154:{type:"_sbcs",chars:"ҖҒӮғ„…ҶҮҲүҠӢҢҚҺҸҗ‘’“â€â€¢â€“—ҳҷҡӣңқһҹ ЎўЈӨҘҰ§Ð©Ә«¬ӯ®Ҝ°ұІіҙө¶·ё№ә»јҪҫÒÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ"},viscii:{type:"_sbcs",chars:"\0ẲẴẪ\b\t\n\v\f\rỶỸá»´ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ẠẮẰẶẤẦẨẬẼẸẾỀỂỄỆá»á»’ỔỖỘỢỚỜỞỊỎỌỈỦŨỤỲÕắằặấầẩậẽẹếá»á»ƒá»…ệốồổỗỠƠộá»á»Ÿá»‹á»°á»¨á»ªá»¬Æ¡á»›Æ¯Ã€ÃÂÃẢĂẳẵÈÉÊẺÌÃĨỳÄứÒÓÔạỷừửÙÚỹỵÃỡưàáâãảăữẫèéêẻìíĩỉđựòóôõá»á»á»¥Ã¹ÃºÅ©á»§Ã½á»£á»®"},iso646cn:{type:"_sbcs",chars:"\0\b\t\n\v\f\r !\"#Â¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������"},iso646jp:{type:"_sbcs",chars:"\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[Â¥]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������"},hproman8:{type:"_sbcs",chars:"€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ÀÂÈÊËÎôˋˆ¨˜ÙÛ₤¯Ãý°ÇçÑñ¡¿¤£¥§ƒ¢âêôûáéóúàèòùäëöüÅîØÆåíøæÄìÖÜÉïßÔÃÃãÃðÃÌÓÒÕõŠšÚŸÿÞþ·µ¶¾—¼½ªº«■»±�"},macintosh:{type:"_sbcs",chars:"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑âˆÏ€âˆ«ÂªÂºâ„¦Ã¦Ã¸Â¿Â¡Â¬âˆšÆ’≈∆«»… ÀÃÕŒœ–—“â€â€˜â€™Ã·â—ŠÃ¿Å¸â„¤‹›ï¬ï¬‚‡·‚„‰ÂÊÃËÈÃÃŽÃÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸Ë˛ˇ"},ascii:{type:"_sbcs",chars:"��������������������������������������������������������������������������������������������������������������������������������"},tis620:{type:"_sbcs",chars:"���������������������������������à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºï¿½ï¿½ï¿½ï¿½à¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛����"}}},1999:e=>{"use strict";e.exports={10029:"maccenteuro",maccenteuro:{type:"_sbcs",chars:"ÄĀÄÉĄÖÜáąČäÄĆć鏟ĎíÄĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňÅÕőŌ–—“â€â€˜â€™Ã·â—ŠÅŔŕŘ‹›řŖŗŠ‚„šŚśÃŤťÃŽžŪÓÔūŮÚůŰűŲųÃýķŻÅżĢˇ"},808:"cp808",ibm808:"cp808",cp808:{type:"_sbcs",chars:"ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗â•â•œâ•›â”└┴┬├─┼╞╟╚╔╩╦╠â•â•¬â•§â•¨â•¤â•¥â•™â•˜â•’╓╫╪┘┌█▄▌â–▀рÑтуфхцчшщъыьÑÑŽÑÐёЄєЇїЎў°∙·√№€■ "},mik:{type:"_sbcs",chars:"ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ└┴┬├─┼╣║╚╔╩╦╠â•â•¬â”░▒▓│┤№§╗â•â”˜â”Œâ–ˆâ–„â–Œâ–▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â "},ascii8bit:"ascii",usascii:"ascii",ansix34:"ascii",ansix341968:"ascii",ansix341986:"ascii",csascii:"ascii",cp367:"ascii",ibm367:"ascii",isoir6:"ascii",iso646us:"ascii",iso646irv:"ascii",us:"ascii",latin1:"iso88591",latin2:"iso88592",latin3:"iso88593",latin4:"iso88594",latin5:"iso88599",latin6:"iso885910",latin7:"iso885913",latin8:"iso885914",latin9:"iso885915",latin10:"iso885916",csisolatin1:"iso88591",csisolatin2:"iso88592",csisolatin3:"iso88593",csisolatin4:"iso88594",csisolatincyrillic:"iso88595",csisolatinarabic:"iso88596",csisolatingreek:"iso88597",csisolatinhebrew:"iso88598",csisolatin5:"iso88599",csisolatin6:"iso885910",l1:"iso88591",l2:"iso88592",l3:"iso88593",l4:"iso88594",l5:"iso88599",l6:"iso885910",l7:"iso885913",l8:"iso885914",l9:"iso885915",l10:"iso885916",isoir14:"iso646jp",isoir57:"iso646cn",isoir100:"iso88591",isoir101:"iso88592",isoir109:"iso88593",isoir110:"iso88594",isoir144:"iso88595",isoir127:"iso88596",isoir126:"iso88597",isoir138:"iso88598",isoir148:"iso88599",isoir157:"iso885910",isoir166:"tis620",isoir179:"iso885913",isoir199:"iso885914",isoir203:"iso885915",isoir226:"iso885916",cp819:"iso88591",ibm819:"iso88591",cyrillic:"iso88595",arabic:"iso88596",arabic8:"iso88596",ecma114:"iso88596",asmo708:"iso88596",greek:"iso88597",greek8:"iso88597",ecma118:"iso88597",elot928:"iso88597",hebrew:"iso88598",hebrew8:"iso88598",turkish:"iso88599",turkish8:"iso88599",thai:"iso885911",thai8:"iso885911",celtic:"iso885914",celtic8:"iso885914",isoceltic:"iso885914",tis6200:"tis620",tis62025291:"tis620",tis62025330:"tis620",1e4:"macroman",10006:"macgreek",10007:"maccyrillic",10079:"maciceland",10081:"macturkish",cspc8codepage437:"cp437",cspc775baltic:"cp775",cspc850multilingual:"cp850",cspcp852:"cp852",cspc862latinhebrew:"cp862",cpgr:"cp869",msee:"cp1250",mscyrl:"cp1251",msansi:"cp1252",msgreek:"cp1253",msturk:"cp1254",mshebr:"cp1255",msarab:"cp1256",winbaltrim:"cp1257",cp20866:"koi8r",20866:"koi8r",ibm878:"koi8r",cskoi8r:"koi8r",cp21866:"koi8u",21866:"koi8u",ibm1168:"koi8u",strk10482002:"rk1048",tcvn5712:"tcvn",tcvn57121:"tcvn",gb198880:"iso646cn",cn:"iso646cn",csiso14jisc6220ro:"iso646jp",jisc62201969ro:"iso646jp",jp:"iso646jp",cshproman8:"hproman8",r8:"hproman8",roman8:"hproman8",xroman8:"hproman8",ibm1051:"hproman8",mac:"macintosh",csmacintosh:"macintosh"}},93701:e=>{"use strict";e.exports=JSON.parse('[["8740","ä°ä°²ä˜ƒä–¦ä•¸ð§‰§äµ·ä–³ð§²±ä³¢ð§³…㮕䜶ä„䱇䱀𤊿𣘗ð§’𦺋𧃒䱗ðª‘ä䗚䲅𧱬䴇䪤䚡𦬣爥𥩔𡩣𣸆𣽡æ™å›»"],["8767","綕å¤ð¨®¹ã·´éœ´ð§¯¯å¯›ð¡µžåª¤ã˜¥ð©º°å«‘å®·å³¼æ®è–“ð©¥…ç‘¡ç’㡵𡵓𣚞𦀡㻬"],["87a1","𥣞㫵竼龗𤅡ð¨¤ð£‡ªð ªŠð£‰žäŒŠè’„é¾–é¯ä¤°è˜“墖éŠéˆ˜ç§ç¨²æ™ æ¨©è¢ç‘Œç¯…枂稬å‰é†ã“¦ç„𥶹瓆鿇垳䤯呌䄱𣚎堘穲𧭥è®äš®ð¦ºˆä†ð¥¶™ç®®ð¢’¼é¿ˆð¢“𢓉𢓌鿉蔄𣖻䂴鿊䓡𪷿æ‹ç®é¿‹"],["8840","㇀",4,"𠄌㇅𠃑ð ƒã‡†ã‡‡ð ƒ‹ð¡¿¨ã‡ˆð ƒŠã‡‰ã‡Šã‡‹ã‡Œð „Žã‡ã‡ŽÄ€ÃÇÀĒÉĚÈŌÓǑÒ࿿Ê̄Ế࿿Ê̌ỀÊÄáǎàɑēéěèīíÇìÅóǒòūúǔùǖǘǚ"],["88a1","ǜü࿿ê̄ế࿿ê̌á»ÃªÉ¡âšâ›"],["8940","𪎩𡅅"],["8943","攊"],["8946","丽æ»éµŽé‡Ÿ"],["894c","𧜵撑会伨侨兖兴农凤务动医åŽå‘å˜å›¢å£°å¤„备夲头学实実岚庆总斉柾栄桥济炼电纤纬纺织ç»ç»Ÿç¼†ç¼·è‰ºè‹è¯è§†è®¾è¯¢è½¦è½§è½®"],["89a1","ç‘ç³¼ç·æ¥†ç«‰åˆ§"],["89ab","醌碸酞肼"],["89b0","贋胶𠧧"],["89b5","肟黇ä³é·‰é¸Œä°¾ð©·¶ð§€Žé¸Šðª„³ã—"],["89c1","溚舾甙"],["89c5","䤑马éªé¾™ç¦‡ð¨‘¬ð¡·Šð —𢫦两äºäº€äº‡äº¿ä»«ä¼·ã‘Œä¾½ã¹ˆå€ƒå‚ˆã‘½ã’“㒥円夅凛凼刅争剹åŠåŒ§ã—‡åŽ©ã•‘厰㕓å‚å£ã•­ã•²ãšå’“咣咴咹å“哯唘唣唨㖘唿㖥㖿嗗㗅"],["8a40","𧶄唥"],["8a43","𠱂𠴕𥄫å–𢳆㧬ð è¹†ð¤¶¸ð©“¥ä“𨂾çºð¢°¸ã¨´äŸ•ð¨…𦧲𤷪æ“𠵼𠾴𠳕𡃴æ’蹾𠺖𠰋𠽤𢲩𨉖𤓓"],["8a64","𠵆ð©©ð¨ƒ©äŸ´ð¤º§ð¢³‚骲㩧𩗴㿭㔆𥋇𩟔𧣈𢵄鵮頕"],["8a76","ä™ð¦‚¥æ’´å“£ð¢µŒð¢¯Šð¡·ã§»ð¡¯"],["8aa1","𦛚𦜖𧦠擪ð¥’𠱃蹨𢆡𨭌𠜱"],["8aac","䠋𠆩㿺塳ð¢¶"],["8ab2","𤗈𠓼𦂗𠽌𠶖啹䂻䎺"],["8abb","䪴𢩦ð¡‚膪飵𠶜æ¹ã§¾ð¢µè·€åš¡æ‘¼ã¹ƒ"],["8ac9","ðª˜ð ¸‰ð¢«ð¢³‰"],["8ace","𡃈𣧂㦒㨆𨊛㕸𥹉𢃇噒𠼱𢲲𩜠㒼氽𤸻"],["8adf","𧕴𢺋𢈈𪙛ð¨³ð ¹ºð °´ð¦ œç¾“ð¡ƒð¢ ƒð¢¤¹ã—»ð¥‡£ð ºŒð ¾ð ºªã¾“𠼰𠵇ð¡…𠹌"],["8af6","𠺫𠮩𠵈𡃀𡄽㿹𢚖æ²ð ¾­"],["8b40","ð£´ð§˜¹ð¢¯Žð µ¾ð µ¿ð¢±‘𢱕㨘𠺘𡃇𠼮𪘲ð¦­ð¨³’𨶙𨳊閪哌苄喹"],["8b55","𩻃鰦骶ð§žð¢·®ç…€è…­èƒ¬å°œð¦•²è„´ãž—åŸð¨‚½é†¶ð »ºð ¸ð ¹·ð »»ã—𤷫㘉𠳖嚯𢞵𡃉ð ¸ð ¹¸ð¡¸ð¡…ˆð¨ˆ‡ð¡‘•ð ¹¹ð¤¹ð¢¶¤å©”ð¡€ð¡€žð¡ƒµð¡ƒ¶åžœð ¸‘"],["8ba1","𧚔ð¨‹ð ¾µð ¹»ð¥…¾ãœƒð ¾¶ð¡†€ð¥‹˜ðªŠ½ð¤§šð¡ ºð¤…·ð¨‰¼å¢™å‰¨ã˜šð¥œ½ç®²å­¨ä €ä¬¬é¼§ä§§é°Ÿé®ð¥­´ð£„½å—»ã—²åš‰ä¸¨å¤‚ð¡¯ð¯¡¸é‘𠂆乛亻㔾尣彑忄㣺扌攵歺氵氺ç¬çˆ«ä¸¬çŠ­ð¤£©ç½’礻糹罓𦉪ã“"],["8bde","ð¦‹è€‚肀𦘒𦥑å衤è§ð§¢²è® è´é’…镸长门ð¨¸éŸ¦é¡µé£Žé£žé¥£ð© é±¼é¸Ÿé»„歯龜丷𠂇é˜æˆ·é’¢"],["8c40","倻淾𩱳龦㷉è¢ð¤…Žç·å³µä¬ ð¥‡ã•™ð¥´°æ„¢ð¨¨²è¾§é‡¶ç†‘朙玺ð£Šðª„‡ã²‹ð¡¦€ä¬ç£¤ç‚冮ð¨œä€‰æ©£ðªŠºäˆ£è˜ð ©¯ç¨ªð©¥‡ð¨«ªé•ç匤ð¢¾é´ç›™ð¨§£é¾§çŸäº£ä¿°å‚¼ä¸¯ä¼—龨å´ç¶‹å¢’å£ð¡¶¶åº’庙忂𢜒斋"],["8ca1","ð£¹æ¤™æ©ƒð£±£æ³¿"],["8ca7","爀𤔅玌㻛𤨓嬕璹讃𥲤𥚕窓篬糃繬苸薗龩è¢é¾ªèº¹é¾«è¿è•Ÿé§ éˆ¡é¾¬ð¨¶¹ð¡¿ä±äŠ¢å¨š"],["8cc9","顨æ«ä‰¶åœ½"],["8cce","藖𤥻芿ð§„ä²ð¦µ´åµ»ð¦¬•ð¦¾¾é¾­é¾®å®–龯曧繛湗秊㶈䓃𣉖𢞖䎚䔶"],["8ce6","峕𣬚諹屸㴒𣕑嵸龲煗䕘𤃬𡸣䱷㥸㑊𠆤ð¦±è«Œä¾´ð ˆ¹å¦¿è…¬é¡–𩣺弻"],["8d40","𠮟"],["8d42","ð¢‡ð¨¥­ä„‚äš»ð©¹ã¼‡é¾³ðª†µäƒ¸ãŸ–䛷𦱆䅼𨚲ð§¿ä•­ã£”𥒚䕡䔛䶉䱻䵶䗪㿈ð¤¬ã™¡ä“žä’½ä‡­å´¾åµˆåµ–ã·¼ã å¶¤å¶¹ã  ã ¸å¹‚庽弥徃㤈㤔㤿ã¥æƒ—愽峥㦉憷憹æ‡ã¦¸æˆ¬æŠæ‹¥æŒ˜ã§¸åš±"],["8da1","㨃æ¢æ»æ‡æ‘šã©‹æ“€å´•å˜¡é¾Ÿãª—斆㪽旿晓㫲暒㬢朖㭂枤栀㭘桊梄㭲㭱㭻椉楃牜楤榟榅㮼槖ã¯æ©¥æ©´æ©±æª‚㯬檙㯲檫檵櫔櫶æ®æ¯æ¯ªæ±µæ²ªã³‹æ´‚洆洦æ¶ã³¯æ¶¤æ¶±æ¸•æ¸˜æ¸©æº†ð¨§€æº»æ»¢æ»šé½¿æ»¨æ»©æ¼¤æ¼´ãµ†ð£½æ¾æ¾¾ãµªãµµç†·å²™ã¶Šç€¬ã¶‘çç”ç¯ç¿ç‚‰ð Œ¥ä㗱𠻘"],["8e40","𣻗垾𦻓焾𥟠㙎榢𨯩孴穉𥣡𩓙穥穽𥦬窻窰竂竃燑ð¦’䇊竚ç«ç«ªä‡¯å’²ð¥°ç¬‹ç­•ç¬©ð¥ŒŽð¥³¾ç®¢ç­¯èŽœð¥®´ð¦±¿ç¯è¡ç®’箸𥴠㶭𥱥蒒篺簆簵ð¥³ç±„粃𤢂粦晽𤕸糉糇糦籴糳糵糎"],["8ea1","繧ä”𦹄çµð¦»–ç’綉綫焵綳緒ð¤—𦀩緤㴓緵𡟹緥ð¨­ç¸ð¦„¡ð¦…šç¹®çº’䌫鑬縧罀ç½ç½‡ç¤¶ð¦‹é§¡ç¾—ð¦‘羣𡙡ð ¨ä•œð£¦ä”ƒð¨Œºç¿ºð¦’‰è€…耈è€è€¨è€¯ðª‚‡ð¦³ƒè€»è€¼è¡ð¢œ”䦉𦘦𣷣𦛨朥肧𨩈脇脚墰𢛶汿𦒘𤾸擧𡒊舘𡡞橓𤩥𤪕䑺舩ð ¬ð¦©’𣵾俹𡓽蓢è¢ð¦¬Šð¤¦§ð£”°ð¡³ð£·¸èŠªæ¤›ð¯¦”䇛"],["8f40","è•‹è‹èŒšð ¸–ð¡ž´ã›ð£…½ð£•šè‰»è‹¢èŒ˜ð£º‹ð¦¶£ð¦¬…𦮗𣗎㶿èŒå—¬èŽ…䔋𦶥莬èè“㑾𦻔橗蕚㒖𦹂𢻯葘𥯤葱㷓䓤檧葊𣲵祘蒨𦮖𦹷𦹃蓞è莑䒠蒓蓤𥲑䉀𥳀䕃蔴嫲𦺙䔧蕳䔖枿蘖"],["8fa1","𨘥𨘻è—𧂈蘂𡖂ð§ƒð¯¦²ä•ªè˜¨ã™ˆð¡¢¢å·ð§Žšè™¾è±ðªƒ¸èŸ®ð¢°§èž±èŸšè å™¡è™¬æ¡–ä˜è¡…衆𧗠𣶹𧗤衞袜䙛袴袵æ装ç·ð§œè¦‡è¦Šè¦¦è¦©è¦§è¦¼ð¨¨¥è§§ð§¤¤ð§ª½èªœçž“釾èªð§©™ç«©ð§¬ºð£¾äœ“𧬸煼謌謟ð¥°ð¥•¥è¬¿è­Œè­èª©ð¤©ºè®è®›èª¯ð¡›Ÿä˜•è¡è²›ð§µ”ð§¶ð¯§”㜥𧵓賖𧶘𧶽贒贃ð¡¤è³›çœè´‘𤳉ã»èµ·"],["9040","趩𨀂𡀔𤦊㭼𨆼𧄌竧躭躶軃鋔輙輭ð¨¥ð¨’辥錃𪊟ð ©è¾³ä¤ªð¨§žð¨”½ð£¶»å»¸ð£‰¢è¿¹ðª€”𨚼ð¨”𢌥㦀𦻗逷𨔼𧪾é¡ð¨•¬ð¨˜‹é‚¨ð¨œ“郄𨛦邮都酧㫰醩釄粬𨤳𡺉鈎沟é‰é‰¢ð¥–¹éŠ¹ð¨«†ð£²›ð¨¬Œð¥—›"],["90a1","𠴱錬é«ð¨«¡ð¨¯«ç‚嫃𨫢𨫥䥥鉄𨯬𨰹𨯿é³é‘›èº¼é–…é–¦é¦é– æ¿¶äŠ¹ð¢™ºð¨›˜ð¡‰¼ð£¸®ä§Ÿæ°œé™»éš–䅬隣𦻕懚隶磵𨫠隽åŒä¦¡ð¦²¸ð ‰´ð¦ð©‚¯ð©ƒ¥ð¤«‘𡤕𣌊霱虂霶ä¨ä”½ä–…𤫩çµå­éœ›éœð©‡•é—孊𩇫éŸé¥åƒð£‚·ð£‚¼éž‰éžŸéž±éž¾éŸ€éŸ’韠𥑬韮çœð©³éŸ¿éŸµð©ð§¥ºä«‘頴頳顋顦㬎𧅵㵑𠘰𤅜"],["9140","𥜆飊颷飈飇䫿𦴧𡛓喰飡飦飬é¸é¤¹ð¤¨©ä­²ð©¡—𩤅駵騌騻é¨é©˜ð¥œ¥ã›„𩂱𩯕髠髢𩬅髴䰎鬔鬭𨘀倴鬴𦦨㣃ð£½é­é­€ð©´¾å©…𡡣鮎𤉋鰂鯿鰌𩹨鷔𩾷𪆒𪆫𪃡𪄣𪇟鵾鶃𪄴鸎梈"],["91a1","鷄𢅛𪆓𪈠𡤻𪈳鴹𪂹𪊴éºéº•éºžéº¢ä´´éºªéº¯ð¤¤é»ã­ ã§¥ã´ä¼²ãž¾ð¨°«é¼‚鼈䮖é¤ð¦¶¢é¼—鼖鼹嚟嚊齅馸𩂋韲葿齢齩竜龎爖䮾𤥵𤦻煷𤧸ð¤ˆð¤©‘玞𨯚𡣺禟𨥾𨸶é©é³ð¨©„鋬éŽé‹ð¨¥¬ð¤’¹çˆ—㻫ç²ç©ƒçƒð¤‘³ð¤¸ç…¾ð¡Ÿ¯ç‚£ð¡¢¾ð£–™ã»‡ð¡¢…ð¥¯ð¡Ÿ¸ãœ¢ð¡›»ð¡ ¹ã›¡ð¡´ð¡£‘𥽋㜣𡛀å›ð¤¨¥ð¡¾ð¡Š¨"],["9240","ð¡†ð¡’¶è”ƒð£š¦è”ƒè‘•ð¤¦”𧅥𣸱𥕜𣻻ð§’䓴𣛮ð©¦ð¦¼¦æŸ¹ãœ³ã°•ã·§å¡¬ð¡¤¢æ ä—𣜿𤃡𤂋ð¤„𦰡哋嚞𦚱嚒𠿟𠮨ð ¸é†ð¨¬“鎜仸儫㠙ð¤¶äº¼ð ‘¥ð ¿ä½‹ä¾Šð¥™‘婨𠆫ð ‹ã¦™ð ŒŠð ”ãµä¼©ð ‹€ð¨º³ð ‰µè«šð ˆŒäº˜"],["92a1","åƒå„侢伃𤨎𣺊佂倮å¬å‚俌俥å˜åƒ¼å…™å…›å…兞湶𣖕𣸹𣺿浲𡢄𣺉冨凃𠗠ä“𠒣𠒒𠒑赺𨪜𠜎剙劤𠡳勡é®ä™ºç†Œð¤ŽŒð ° ð¤¦¬ð¡ƒ¤æ§‘ð ¸ç‘¹ã»žç’™ç”瑖玘䮎𤪼ð¤‚åã–„çˆð¤ƒ‰å–´ð …å“𠯆åœé‰é›´é¦åŸåžå¿ã˜¾å£‹åª™ð¨©†ð¡›ºð¡¯ð¡œå¨¬å¦¸éŠå©¾å«å¨’𥥆𡧳𡡡𤊕㛵洅瑃娡𥺃"],["9340","åªð¨¯—ð “é ç’Œð¡Œƒç„…䥲éˆð¨§»éŽ½ãž å°žå²žå¹žå¹ˆð¡¦–𡥼𣫮å»å­ð¡¤ƒð¡¤„ãœð¡¢ ã›ð¡›¾ã›“脪𨩇𡶺𣑲𨦨弌弎𡤧𡞫婫𡜻孄蘔𧗽衠æ¾ð¢¡ ð¢˜«å¿›ãº¸ð¢–¯ð¢–¾ð©‚ˆð¦½³æ‡€ð €¾ð †ð¢˜›æ†™æ†˜æµð¢²›ð¢´‡ð¤›”ð©…"],["93a1","摱𤙥𢭪㨩𢬢ð£‘𩣪𢹸挷𪑛撶挱æ‘𤧣𢵧护𢲡æ»æ•«æ¥²ã¯´ð£‚Žð£Š­ð¤¦‰ð£Š«å”𣋠𡣙ð©¿æ›Žð£Š‰ð£†³ã« ä†ð¥–„𨬢ð¥–𡛼𥕛ð¥¥ç£®ð£„ƒð¡ ªð£ˆ´ã‘¤ð£ˆð£†‚𤋉暎𦴤晫䮓昰𧡰𡷫晣𣋒𣋡昞𥡲㣑𣠺𣞼㮙𣞢ð£¾ç“ã®–æžð¤˜ªæ¢¶æ žã¯„檾㡣𣟕𤒇樳橒櫉欅𡤒攑梘橌㯗橺歗𣿀𣲚鎠鋲𨯪𨫋"],["9440","銉𨀞𨧜鑧涥漋𤧬浧𣽿ã¶æ¸„𤀼娽渊塇洤硂焻𤌚𤉶烱ç‰çŠ‡çŠ”ð¤žð¤œ¥å…¹ð¤ª¤ð —«ç‘ºð£»¸ð£™Ÿð¤©Šð¤¤—𥿡㼆㺱𤫟𨰣𣼵悧㻳瓌ç¼éŽ‡ç·ä’Ÿð¦·ªä•‘疃㽣𤳙𤴆㽘畕癳𪗆㬙瑨𨫌𤦫𤦎㫻"],["94a1","ã·ð¤©Žã»¿ð¤§…𤣳釺圲é‚𨫣𡡤僟𥈡𥇧ç¸ð£ˆ²çœŽçœç»ð¤š—ð£žã©žð¤£°ç¸ç’›ãº¿ð¤ªºð¤«‡äƒˆð¤ª–𦆮錇ð¥–ç žç¢ç¢ˆç£’ç祙ð§ð¥›£ä„Žç¦›è’–禥樭𣻺稺秴䅮𡛦䄲鈵秱𠵌𤦌𠊙𣶺ð¡®ã–—啫㕰㚪𠇔ð °ç«¢å©™ð¢›µð¥ª¯ð¥ªœå¨ð ‰›ç£°å¨ªð¥¯†ç«¾ä‡¹ç±ç±­äˆ‘𥮳𥺼𥺦ç³ð¤§¹ð¡ž°ç²Žç±¼ç²®æª²ç·œç¸‡ç·“罎𦉡"],["9540","𦅜𧭈綗𥺂䉪𦭵𠤖柖ð Žð£—埄ð¦’ð¦¸ð¤¥¢ç¿ç¬§ð  ¬ð¥«©ð¥µƒç¬Œð¥¸Žé§¦è™…驣樜ð£¿ã§¢ð¤§·ð¦–­é¨Ÿð¦– è’€ð§„§ð¦³‘䓪脷ä‚胆脉腂𦞴飃𦩂艢艥𦩑葓𦶧è˜ð§ˆ›åª†ä…¿ð¡¡€å¬«ð¡¢¡å«¤ð¡£˜èš ð¯¦¼ð£¶è ­ð§¢å¨‚"],["95a1","衮佅袇袿裦襥è¥ð¥šƒè¥”𧞅𧞄𨯵𨯙𨮜𨧹㺭蒣䛵ä›ãŸ²è¨½è¨œð©‘ˆå½éˆ«ð¤Š„旔焩烄𡡅鵭貟賩𧷜妚矃姰ä®ã›”踪躧𤰉輰轊䋴汘澻𢌡䢛潹溋𡟚鯩㚵𤤯邻邗啱䤆醻é„𨩋ä¢ð¨«¼é§ð¨°ð¨°»è“¥è¨«é–™é–§é–—閖𨴴瑅㻂𤣿𤩂ð¤ªã»§ð£ˆ¥éšð¨»§ð¨¹¦ð¨¹¥ã»Œð¤§­ð¤©¸ð£¿®ç’瑫㻼éð©‚°"],["9640","桇ä¨ð©‚“𥟟éé¨ð¨¦‰ð¨°¦ð¨¬¯ð¦Ž¾éŠºå¬‘譩䤼ç¹ð¤ˆ›éž›é±é¤¸ð ¼¦å·ð¨¯…𤪲頟𩓚鋶𩗗釥䓀ð¨­ð¤©§ð¨­¤é£œð¨©…㼀鈪䤥è”餻é¥ð§¬†ã·½é¦›ä­¯é¦ªé©œð¨­¥ð¥£ˆæªé¨¡å«¾é¨¯ð©£±ä®ð©¥ˆé¦¼ä®½ä®—é½å¡²ð¡Œ‚堢𤦸"],["96a1","𡓨硄𢜟𣶸棅㵽鑘㤧æ…ð¢žð¢¥«æ„‡é±é±“鱻鰵é°é­¿é¯ð©¸­é®Ÿðª‡µðªƒ¾é´¡ä²®ð¤„„鸘䲰鴌𪆴𪃭𪃳𩤯鶥蒽𦸒𦿟𦮂藼䔳𦶤𦺄𦷰è è—®ð¦¸€ð£Ÿ—ð¦¤ç§¢ð£–œð£™€ä¤­ð¤§žãµ¢é›éŠ¾éˆð Š¿ç¢¹é‰·é‘俤㑀é¤ð¥•ç ½ç¡”碶硋ð¡—𣇉ð¤¥ãššä½²æ¿šæ¿™ç€žç€žå”𤆵垻壳垊鴖埗焴㒯𤆬燫𦱀𤾗嬨𡞵𨩉"],["9740","愌嫎娋䊼𤒈㜬䭻𨧼鎻鎸𡣖ð ¼è‘²ð¦³€ð¡“𤋺𢰦ð¤å¦”𣶷ð¦ç¶¨ð¦…›ð¦‚¤ð¤¦¹ð¤¦‹ð¨§ºé‹¥ç¢ã»©ç’´ð¨­£ð¡¢Ÿã»¡ð¤ª³æ«˜ç³ç»ã»–𤨾𤪔𡟙𤩦𠎧ð¡¤ð¤§¥ç‘ˆð¤¤–炥𤥶銄ç¦éŸð “¾éŒ±ð¨«Žð¨¨–鎆𨯧𥗕䤵𨪂煫"],["97a1","𤥃𠳿嚤𠘚𠯫𠲸唂秄𡟺緾𡛂ð¤©ð¡¡’ä”®é㜊𨫀𤦭妰𡢿𡢃𧒄媡㛢𣵛㚰鉟婹ð¨ªð¡¡¢é´ã³ð ª´äª–㦊僴㵩㵌𡎜煵䋻𨈘æ¸ð©ƒ¤ä“«æµ—ð§¹ç§æ²¯ã³–𣿭𣸭渂漌㵯ð µç•‘㚼㓈䚀㻚䡱姄鉮䤾è½ð¨°œð¦¯€å ’埈㛖𡑒烾ð¤¢ð¤©±ð¢¿£ð¡Š°ð¢Ž½æ¢¹æ¥§ð¡Ž˜ð£“¥ð§¯´ð£›Ÿð¨ªƒð£Ÿ–ð£ºð¤²Ÿæ¨šð£š­ð¦²·è¾ä“Ÿä“Ž"],["9840","𦴦𦵑𦲂𦿞漗𧄉茽𡜺è­ð¦²€ð§“𡟛妉媂𡞳婡婱𡤅𤇼㜭姯𡜼㛇熎éŽæššð¤Š¥å©®å¨«ð¤Š“樫𣻹𧜶𤑛𤋊ç„𤉙𨧡侰𦴨峂𤓎ð§¹ð¤Ž½æ¨Œð¤‰–𡌄炦焳ð¤©ã¶¥æ³Ÿð¯ ¥ð¤©ç¹¥å§«å´¯ã·³å½œð¤©ð¡ŸŸç¶¤è¦"],["98a1","咅𣫺𣌀𠈔å¾ð £•ð ˜™ã¿¥ð¡¾žðªŠ¶ç€ƒð©…›åµ°çŽç³“𨩙ð© ä¿ˆç¿§ç‹çŒð§«´çŒ¸çŒ¹ð¥›¶ççˆãº©ð§¬˜é¬ç‡µð¤£²ç¡è‡¶ã»ŠçœŒã»‘沢国ç™çžçŸã»¢ã»°ã»´ã»ºç““㼎㽓畂畭畲ç–㽼痈痜㿀ç™ã¿—癴㿜発𤽜熈嘣覀塩ä€çƒä€¹æ¡ä…㗛瞘äªä¯å±žçž¾çŸ‹å£²ç ˜ç‚¹ç œä‚¨ç ¹ç¡‡ç¡‘硦葈𥔵礳栃礲䄃"],["9940","䄉禑禙辻稆込䅧窑䆲窼艹䇄ç«ç«›ä‡ä¸¡ç­¢ç­¬ç­»ç°’簛䉠䉺类粜䊌粸䊔糭输烀ð ³ç·ç·”ç·ç·½ç¾®ç¾´çŠŸäŽ—耠耥笹耮耱è”㷌垴炠肷胩ä­è„ŒçŒªè„Žè„’ç• è„”ä㬹腖腙腚"],["99a1","ä“堺腼膄ä¥è†“ä­è†¥åŸ¯è‡è‡¤è‰”ä’芦艶苊苘苿䒰è—险榊è…烵葤惣蒈䔄蒾蓡蓸è”蔸蕒䔻蕯蕰藠䕷虲蚒蚲蛯际螋䘆䘗袮裿褤襇覑𧥧訩訸誔誴豑賔賲贜䞘塟跃䟭仮踺嗘å”蹱嗵躰䠷軎転軤軭軲辷è¿è¿Šè¿Œé€³é§„䢭飠鈓䤞鈨鉘鉫銱銮銿"],["9a40","鋣鋫鋳鋴鋽éƒéŽ„鎭䥅䥑麿é—åŒéé­é¾ä¥ªé‘”鑹锭関䦧间阳䧥枠䨤é€ä¨µéž²éŸ‚噔䫤惨颹䬙飱塄餎餙冴餜餷饂é¥é¥¢ä­°é§…ä®é¨¼é¬çªƒé­©é®é¯é¯±é¯´ä±­é° ã¯ð¡¯‚鵉鰺"],["9aa1","黾å™é¶“鶽鷀鷼银辶鹻麬麱麽黆铜黢黱黸竈齄𠂔𠊷𠎠椚铃妬𠓗塀é“㞹𠗕𠘕𠙶𡚺å—煳𠫂ð «ð ®¿å‘ªð¯ »ð ¯‹å’žð ¯»ð °»ð ±“𠱥𠱼惧ð ²å™ºð ²µð ³ð ³­ð µ¯ð ¶²ð ·ˆæ¥•é°¯èž¥ð ¸„𠸎𠻗ð ¾ð ¼­ð ¹³å° ð ¾¼å¸‹ð¡œð¡ð¡¶æœžð¡»ð¡‚ˆð¡‚–㙇𡂿𡃓𡄯𡄻å¤è’­ð¡‹£ð¡µð¡Œ¶è®ð¡•·ð¡˜™ð¡Ÿƒð¡Ÿ‡ä¹¸ç‚»ð¡ ­ð¡¥ª"],["9b40","𡨭𡩅𡰪𡱰𡲬𡻈拃𡻕𡼕熘桕ð¢…槩㛈𢉼ð¢—ð¢ºð¢œªð¢¡±ð¢¥è‹½ð¢¥§ð¢¦“𢫕覥𢫨辠𢬎鞸𢬿顇骽𢱌"],["9b62","𢲈𢲷𥯨𢴈𢴒𢶷𢶕𢹂𢽴𢿌𣀳ð£¦ð£ŒŸð£žå¾±æ™ˆæš¿ð§©¹ð£•§ð£—³çˆð¤¦ºçŸ—𣘚𣜖纇ð †å¢µæœŽ"],["9ba1","椘𣪧𧙗𥿢𣸑𣺹𧗾𢂚ä£äª¸ð¤„™ð¨ªšð¤‹®ð¤Œð¤€»ð¤Œ´ð¤Ž–𤩅𠗊凒𠘑妟𡺨㮾𣳿ð¤„𤓖垈𤙴㦛𤜯𨗨𩧉ã¢ð¢‡ƒè­žð¨­Žé§–𤠒𤣻𤨕爉𤫀𠱸奥𤺥𤾆ð ¹è»šð¥€¬åŠåœ¿ç…±ð¥Š™ð¥™ð£½Šð¤ª§å–¼ð¥‘†ð¥‘®ð¦­’釔㑳𥔿𧘲𥕞䜘𥕢𥕦𥟇𤤿ð¥¡å¦ã“»ð£Œæƒžð¥¤ƒä¼ð¨¥ˆð¥ª®ð¥®‰ð¥°†ð¡¶åž¡ç…‘澶𦄂𧰒é–𦆲𤾚譢ð¦‚𦑊"],["9c40","嵛𦯷輶𦒄𡤜諪𤧶𦒈𣿯𦔒䯀𦖿𦚵𢜛鑥𥟡憕娧ð¯£ä¾»åš¹ð¤”¡ð¦›¼ä¹ªð¤¤´é™–æ¶ð¦²½ã˜˜è¥·ð¦ž™ð¦¡®ð¦‘𦡞營𦣇筂𩃀𠨑𦤦鄄𦤹穅鷰𦧺騦𦨭㙟𦑩𠀡禃𦨴𦭛崬𣔙èð¦®ä›ð¦²¤ç”»è¡¥ð¦¶®å¢¶"],["9ca1","㜜ð¢–ð§‹ð§‡ã±”𧊀𧊅éŠð¢…ºð§Š‹éŒ°ð§‹¦ð¤§æ°¹é’Ÿð§‘𠻸蠧裵𢤦𨑳𡞱溸𤨪𡠠㦤㚹å°ç§£ä”¿æš¶ð©²­ð©¢¤è¥ƒð§ŸŒð§¡˜å›–䃟𡘊㦡𣜯𨃨ð¡…熭è¦ð§§ð©†¨å©§ä²·ð§‚¯ð¨¦«ð§§½ð§¨Šð§¬‹ð§µ¦ð¤…ºç­ƒç¥¾ð¨€‰æ¾µðª‹Ÿæ¨ƒð¨Œ˜åŽ¢ð¦¸‡éŽ¿æ ¶é𨅯𨀣𦦵ð¡­ð£ˆ¯ð¨ˆå¶…𨰰𨂃圕頣𨥉嶫𤦈斾槕å’𤪥ð£¾ã°‘朶ð¨‚𨃴𨄮𡾡ð¨…"],["9d40","𨆉𨆯𨈚𨌆𨌯𨎊㗊𨑨𨚪䣺æ¦ð¨¥–砈鉕𨦸ä²ð¨§§äŸð¨§¨ð¨­†ð¨¯”姸𨰉輋𨿅𩃬筑ð©„𩄼㷷𩅞𤫊è¿çŠåš‹ð©“§ð©—©ð©–°ð©–¸ð©œ²ð©£‘𩥉𩥪𩧃𩨨𩬎𩵚𩶛纟𩻸𩼣䲤镇𪊓熢𪋿䶑递𪗋䶜𠲜达å—"],["9da1","辺𢒰边𤪓䔉繿潖檱仪㓤𨬬ð§¢ãœºèº€ð¡Ÿµð¨€¤ð¨­¬ð¨®™ð§¨¾ð¦š¯ã·«ð§™•ð£²·ð¥˜µð¥¥–亚ð¥ºð¦‰˜åš¿ð ¹­è¸Žå­­ð£ºˆð¤²žæžæ‹ð¡Ÿ¶ð¡¡»æ”°å˜­ð¥±Šåšð¥Œ‘㷆𩶘䱽嘢嘞罉𥻘奵𣵀è°ä¸œð ¿ªð µ‰ð£šºè„—鵞贘瘻鱅癎瞹é…å²è…ˆè‹·å˜¥è„²è˜è‚½å—ªç¥¢å™ƒå–ð ºã—Žå˜…嗱曱𨋢㘭甴嗰喺咗啲ð ±ð ²–å»ð¥…ˆð ¹¶ð¢±¢"],["9e40","𠺢麫絚嗞ð¡µæŠé­å’”è³ç‡¶é…¶æ¼æŽ¹æ¾å•©ð¢­ƒé±²ð¢º³å†šã“Ÿð ¶§å†§å‘唞唓癦踭𦢊疱肶蠄螆裇膶èœð¡ƒä“¬çŒ„𤜆å®èŒ‹ð¦¢“噻𢛴𧴯𤆣𧵳ð¦»ð§Š¶é…°ð¡‡™éˆˆð£³¼ðªš©ð º¬ð »¹ç‰¦ð¡²¢äŽð¤¿‚𧿹𠿫䃺"],["9ea1","é±æ”Ÿð¢¶ ä£³ð¤Ÿ ð©µ¼ð ¿¬ð ¸Šæ¢ð§–£ð ¿­"],["9ead","ð¦ˆð¡†‡ç†£çºŽéµä¸šä¸„ã•·å¬æ²²å§ãš¬ã§œå½ãš¥ð¤˜˜å¢šð¤­®èˆ­å‘‹åžªð¥ª•ð ¥¹"],["9ec5","㩒𢑥ç´ð©º¬ä´‰é¯­ð£³¾ð©¼°ä±›ð¤¾©ð©–žð©¿žè‘œð£¶¶ð§Š²ð¦ž³ð£œ æŒ®ç´¥ð£»·ð£¸¬ã¨ªé€ˆå‹Œã¹´ã™ºä—©ð ’Žç™€å«°ð º¶ç¡ºð§¼®å¢§ä‚¿å™¼é®‹åµ´ç™”ðª´éº…䳡痹㟻愙𣃚ð¤²"],["9ef5","å™ð¡Š©åž§ð¤¥£ð©¸†åˆ´ð§‚®ã–­æ±Šéµ¼"],["9f40","籖鬹埞ð¡¬å±“æ““ð©“𦌵𧅤蚭𠴨𦴢𤫢𠵱"],["9f4f","凾ð¡¼å¶Žéœƒð¡·‘éºéŒç¬Ÿé¬‚峑箣扨挵髿ç¯é¬ªç±¾é¬®ç±‚粆鰕篼鬉鼗鰛𤤾齚啳寃俽麘俲剠㸆勑å§å–妷帒韈鶫轜呩鞴饀鞺匬愰"],["9fa1","椬åšé°Šé´‚ä°»é™æ¦€å‚¦ç•†ð¡­é§šå‰³"],["9fae","é…™éšé…œ"],["9fb2","酑𨺗æ¿ð¦´£æ«Šå˜‘醎畺抅ð ¼ç籰𥰡𣳽"],["9fc1","𤤙盖é®ä¸ªð ³”莾衂"],["9fc9","届槀僭åºåˆŸå·µä»Žæ°±ð ‡²ä¼¹å’œå“šåŠšè¶‚㗾弌㗳"],["9fdb","歒酼龥鮗頮颴骺麨麄煺笔"],["9fe7","毺蠘罸"],["9feb","嘠𪙊蹷齓"],["9ff0","è·”è¹é¸œè¸æŠ‚ð¨½è¸¨è¹µç«“𤩷稾磘泪詧瘇"],["a040","𨩚鼦泎蟖痃𪊲硓咢贌狢ç±è¬­çŒ‚瓱賫𤪻蘯徺袠䒷"],["a055","𡠻𦸅"],["a058","詾𢔛"],["a05b","惽癧髗鵄é®é®èŸµ"],["a063","è è³·çŒ¬éœ¡é®°ã—–犲䰇籑饊𦅙慙䰄麖慽"],["a073","åŸæ…¯æŠ¦æˆ¹æ‹Žã©œæ‡¢åŽªð£µæ¤æ ‚ã—’"],["a0a1","嵗𨯂迚𨸹"],["a0a6","僙𡵆礆匲阸𠼻ä¥"],["a0ae","矾"],["a0b0","糂𥼚糚稭è¦è£çµç”…瓲覔舚朌è¢ð§’†è›ç“°è„ƒçœ¤è¦‰ð¦ŸŒç•“𦻑螩蟎臈螌詉貭譃眫瓸蓚㘵榲趦"],["a0d4","覩瑨涹èŸð¤€‘瓧㷛煶悤憜㳑煢æ·"],["a0e2","罱𨬭ç‰æƒ©ä­¾åˆ ã°˜ð£³‡ð¥»—𧙖𥔱𡥄𡋾𩤃𦷜𧂭å³ð¦†­ð¨¨ð£™·ð ƒ®ð¦¡†ð¤¼Žä•¢å¬Ÿð¦Œé½éº¦ð¦‰«"],["a3c0","â€",31,"â¡"],["c6a1","â‘ ",9,"â‘´",9,"â…°",9,"丶丿亅亠冂冖冫勹匸å©åŽ¶å¤Šå®€å·›â¼³å¹¿å»´å½å½¡æ”´æ— ç–’癶辵隶¨ˆヽヾã‚ゞ〃ä»ã€…〆〇ー[]✽ã",23],["c740","ã™",58,"ァアィイ"],["c7a1","ã‚¥",81,"Ð",5,"ÐЖ",4],["c840","Л",26,"ёж",25,"⇧↸↹ã‡ð ƒŒä¹šð ‚Šåˆ‚ä’‘"],["c8a1","龰冈龱𧘇"],["c8cd","¬¦'"㈱№℡゛゜⺀⺄⺆⺇⺈⺊⺌âºâº•âºœâºâº¥âº§âºªâº¬âº®âº¶âº¼âº¾â»†â»Šâ»Œâ»â»â»–⻗⻞⻣"],["c8f5","ʃÉɛɔɵœøŋʊɪ"],["f9fe","ï¿­"],["fa40","𠕇鋛𠗟𣿅蕌䊵ç¯å†µã™‰ð¤¥‚𨧤é„𡧛苮𣳈砼æ„拟𤤳𨦪𠊠𦮳𡌅侫𢓭倈𦴩𧪄𣘀𤪱𢔓倩ð ¾å¾¤ð Ž€ð ‡æ»›ð Ÿå½å„㑺儎顬ãƒè–𤦤𠒇兠𣎴兪𠯿𢃼𠋥𢔰𠖎𣈳𡦃宂è½ð –³ð£²™å†²å†¸"],["faa1","鴴凉å‡å‡‘㳜凓𤪦决凢å‚凭è椾𣜭彻刋刦刼劵剗劔効勅簕蕂勠è˜ð¦¬“包𨫞啉滙𣾀𠥔𣿬匳å„𠯢泋𡜦栛ç•æŠãºªã£Œð¡›¨ç‡ä’¢å­å´ð¨š«å¾å¿ð¡––𡘓矦厓𨪛厠厫厮玧ð¥²ã½™çŽœåå…汉义埾å™ãª«ð ®å ð£¿«ð¢¶£å¶ð ±·å“ç¹å”«æ™—浛呭𦭓𠵴å•å’咤䞦ð¡œð »ã¶´ð µ"],["fb40","𨦼𢚘啇䳭å¯ç—喆喩嘅𡣗𤀺䕒ð¤µæš³ð¡‚´å˜·æ›ð£ŠŠæš¤æš­å™å™ç£±å›±éž‡å¾åœ€å›¯å›­ð¨­¦ã˜£ð¡‰å†ð¤†¥æ±®ç‚‹å‚㚱𦱾埦ð¡–堃𡑔ð¤£å ¦ð¤¯µå¡œå¢ªã•¡å£ å£œð¡ˆ¼å£»å¯¿åƒðª…𤉸é“㖡够梦㛃湙"],["fba1","𡘾娤啓𡚒蔅姉𠵎ð¦²ð¦´ªð¡Ÿœå§™ð¡Ÿ»ð¡ž²ð¦¶¦æµ±ð¡ ¨ð¡›•å§¹ð¦¹…媫婣㛦𤦩婷㜈媖瑥嫓𦾡𢕔㶅𡤑㜲𡚸広å‹å­¶æ–ˆå­¼ð§¨Žä€„ä¡ð ˆ„寕慠𡨴𥧌𠖥寳å®ä´å°…ð¡­„å°“çŽå°”𡲥𦬨屉ä£å²…峩峯嶋𡷹𡸷å´å´˜åµ†ð¡º¤å²ºå·—苼㠭ð¤¤ð¢‰ð¢…³èŠ‡ã ¶ã¯‚帮檊幵幺𤒼𠳓厦亷å»åŽ¨ð¡±å¸‰å»´ð¨’‚"],["fc40","廹廻㢠廼栾é›å¼ð ‡ð¯¢”㫞䢮𡌺强𦢈ð¢å½˜ð¢‘±å½£éž½ð¦¹®å½²é€ð¨¨¶å¾§å¶¶ãµŸð¥‰ð¡½ªð§ƒ¸ð¢™¨é‡–𠊞𨨩怱暅𡡷㥣㷇㘹åžð¢ž´ç¥±ã¹€æ‚žæ‚¤æ‚³ð¤¦‚ð¤¦ð§©“璤僡媠慤è¤æ…‚慈𦻒æ†å‡´ð ™–憇宪𣾷"],["fca1","𢡟懓ð¨®ð©¥æ‡ã¤²ð¢¦€ð¢£æ€£æ…œæ”žæŽ‹ð „˜æ‹…ð¡°æ‹•ð¢¸æ¬ð¤§Ÿã¨—æ¸æ¸ð¡ŽŽð¡Ÿ¼æ’澊𢸶頔𤂌ð¥œæ“¡æ“¥é‘»ã©¦æºã©—æ•æ¼–𤨨𤨣斅敭敟ð£¾æ–µð¤¥€ä¬·æ—‘䃘𡠩无旣忟ð£€æ˜˜ð£‡·ð£‡¸æ™„𣆤𣆥晋𠹵晧𥇦晳晴𡸽𣈱𨗴𣇈𥌓矅𢣷馤朂𤎜𤨡㬫槺𣟂æžæ§æ¢ð¤‡ð©ƒ­æŸ—ä“©æ ¢æ¹éˆ¼æ ð£¦ð¦¶ æ¡"],["fd40","𣑯槡樋𨫟楳棃ð£—æ¤æ¤€ã´²ã¨ð£˜¼ã®€æž¬æ¥¡ð¨©Šä‹¼æ¤¶æ¦˜ã®¡ð ‰è£å‚槹𣙙𢄪橅𣜃æªã¯³æž±æ«ˆð©†œã°æ¬ð ¤£æƒžæ¬µæ­´ð¢Ÿæºµð£«›ð Žµð¡¥˜ã€å¡ð£­šæ¯¡ð£»¼æ¯œæ°·ð¢’‹ð¤£±ð¦­‘汚舦汹𣶼䓅𣶽𤆤𤤌𤤀"],["fda1","𣳉㛥㳫𠴲鮃𣇹𢒑ç¾æ ·ð¦´¥ð¦¶¡ð¦·«æ¶–浜湼漄𤥿𤂅𦹲蔳𦽴凇沜æ¸è®ð¨¬¡æ¸¯ð£¸¯ç‘“𣾂秌æ¹åª‘ð£‹æ¿¸ãœæ¾ð£¸°æ»ºð¡’—𤀽䕕é°æ½„潜㵎潴𩅰㴻澟𤅄濓𤂑𤅕𤀹𣿰𣾴𤄿凟𤅖𤅗𤅀ð¦‡ç‹ç¾ç‚§ç‚烌烕烖烟䄄㷨熴熖𤉷焫煅媈煊煮岜ð¤¥ç…é¢ð¤‹ç„¬ð¤‘šð¤¨§ð¤¨¢ç†ºð¨¯¨ç‚½çˆŽ"],["fe40","鑂爕夑鑃爤é𥘅爮牀𤥴梽牕牗㹕ð£„æ æ¼½çŠ‚猪猫𤠣𨠫䣭𨠄猨献ç玪𠰺𦨮ç‰ç‘‰ð¤‡¢ð¡›§ð¤¨¤æ˜£ã›…𤦷ð¤¦ð¤§»ç·ç•æ¤ƒð¤¨¦ç¹ð —ƒã»—瑜𢢭瑠𨺲瑇ç¤ç‘¶èŽ¹ç‘¬ãœ°ç‘´é±æ¨¬ç’‚䥓𤪌"],["fea1","𤅟𤩹ð¨®å­†ð¨°ƒð¡¢žç“ˆð¡¦ˆç”Žç“©ç”žð¨»™ð¡©‹å¯—𨺬鎅ç•ç•Šç•§ç•®ð¤¾‚㼄𤴓疎ç‘疞疴瘂瘬癑ç™ç™¯ç™¶ð¦µçšè‡¯ãŸ¸ð¦¤‘𦤎皡皥皷盌𦾟葢ð¥‚𥅽𡸜眞眦ç€æ’¯ð¥ˆ ç˜ð£Š¬çž¯ð¨¥¤ð¨¥¨ð¡›çŸ´ç ‰ð¡¶ð¤¨’棊碯磇磓隥礮𥗠磗礴碱𧘌辸袄𨬫𦂃𢘜禆褀椂禀𥡗ç¦ð§¬¹ç¤¼ç¦©æ¸ªð§„¦ãº¨ç§†ð©„秔"]]')},2685:e=>{"use strict";e.exports=JSON.parse('[["0","\\u0000",127,"€"],["8140","丂丄丅丆ä¸ä¸’丗丟丠両丣並丩丮丯丱丳丵丷丼乀ä¹ä¹‚乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪",5,"乲乴",9,"乿",6,"亇亊"],["8180","äºäº–亗亙亜äºäºžäº£äºªäº¯äº°äº±äº´äº¶äº·äº¸äº¹äº¼äº½äº¾ä»ˆä»Œä»ä»ä»’仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂",6,"伋伌伒",4,"伜ä¼ä¼¡ä¼£ä¼¨ä¼©ä¼¬ä¼­ä¼®ä¼±ä¼³ä¼µä¼·ä¼¹ä¼»ä¼¾",4,"佄佅佇",5,"佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀ä¾ä¾‚侅來侇侊侌侎ä¾ä¾’侓侕侖侘侙侚侜侞侟価侢"],["8240","侤侫侭侰",4,"侶",8,"ä¿€ä¿ä¿‚俆俇俈俉俋俌ä¿ä¿’",4,"俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿",11],["8280","個倎å€å€‘倓倕倖倗倛å€å€žå€ å€¢å€£å€¤å€§å€«å€¯",10,"倻倽倿å€åå‚å„å…å†å‰åŠå‹åå",4,"å–å—å˜å™å›å",7,"å¦",5,"å­",8,"å¸å¹åºå¼å½å‚傂傃傄傆傇傉傊傋傌傎",20,"傤傦傪傫傭",4,"傳",6,"傼"],["8340","傽",17,"åƒ",5,"僗僘僙僛",10,"僨僩僪僫僯僰僱僲僴僶",4,"僼",9,"儈"],["8380","儉儊儌",5,"å„“",13,"å„¢",28,"兂兇兊兌兎å…å…兒兓兗兘兙兛å…",4,"兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎å†å†å†‘冓冔冘冚å†å†žå†Ÿå†¡å†£å†¦",4,"冭冮冴冸冹冺冾冿å‡å‡‚凃凅凈凊å‡å‡Žå‡å‡’",5],["8440","凘凙凚凜凞凟凢凣凥",5,"凬凮凱凲凴凷凾刄刅刉刋刌åˆåˆåˆ“刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄",5,"剋剎å‰å‰’剓剕剗剘"],["8480","剙剚剛å‰å‰Ÿå‰ å‰¢å‰£å‰¤å‰¦å‰¨å‰«å‰¬å‰­å‰®å‰°å‰±å‰³",9,"剾劀劃",4,"劉",6,"劑劒劔",6,"劜劤劥劦劧劮劯劰労",9,"å‹€å‹å‹‚勄勅勆勈勊勌å‹å‹Žå‹å‹‘勓勔動勗務",5,"勠勡勢勣勥",10,"勱",7,"勻勼勽åŒåŒ‚匃匄匇匉匊匋匌匎"],["8540","匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯",9,"匼匽å€å‚å„å†å‹åŒååå”å˜å™å›åå¥å¨åªå¬å­å²å¶å¹å»å¼å½å¾åŽ€åŽåŽƒåŽ‡åŽˆåŽŠåŽŽåŽ"],["8580","åŽ",4,"厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯",6,"厷厸厹厺厼厽厾å€åƒ",4,"åŽååå’å“å•åšåœååžå¡å¢å§å´åºå¾å¿å€å‚å…å‡å‹å”å˜å™åšåœå¢å¤å¥åªå°å³å¶å·åºå½å¿å‘呂呄呅呇呉呌å‘å‘Žå‘å‘‘å‘šå‘",4,"呣呥呧呩",7,"呴呹呺呾呿å’咃咅咇咈咉咊å’咑咓咗咘咜咞咟咠咡"],["8640","咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠",4,"哫哬哯哰哱哴",5,"哻哾唀唂唃唄唅唈唊",4,"唒唓唕",5,"唜å”唞唟唡唥唦"],["8680","唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋",4,"啑啒啓啔啗",4,"å•å•žå•Ÿå• å•¢å•£å•¨å•©å•«å•¯",5,"啹啺啽啿喅喆喌å–å–Žå–喒喓喕喖喗喚喛喞喠",6,"å–¨",8,"喲喴営喸喺喼喿",4,"嗆嗇嗈嗊嗋嗎å—å—å—•å——",4,"嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸",4,"嗿嘂嘃嘄嘅"],["8740","嘆嘇嘊嘋å˜å˜",7,"嘙嘚嘜å˜å˜ å˜¡å˜¢å˜¥å˜¦å˜¨å˜©å˜ªå˜«å˜®å˜¯å˜°å˜³å˜µå˜·å˜¸å˜ºå˜¼å˜½å˜¾å™€",11,"å™",4,"噕噖噚噛å™",4],["8780","噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽",7,"嚇",6,"åšåš‘åš’åš”",14,"嚤",10,"åš°",6,"嚸嚹嚺嚻嚽",12,"囋",8,"囕囖囘囙囜団囥",5,"囬囮囯囲図囶囷囸囻囼圀åœåœ‚圅圇國",6],["8840","園",9,"åœåœžåœ åœ¡åœ¢åœ¤åœ¥åœ¦åœ§åœ«åœ±åœ²åœ´",4,"圼圽圿ååƒå„å…å†åˆå‰å‹å’",4,"å˜å™å¢å£å¥å§å¬å®å°å±å²å´åµå¸å¹åºå½å¾å¿åž€"],["8880","åžåž‡åžˆåž‰åžŠåž",4,"åž”",6,"åžœåžåžžåžŸåž¥åž¨åžªåž¬åž¯åž°åž±åž³åžµåž¶åž·åž¹",8,"埄",6,"埌åŸåŸåŸ‘埓埖埗埛埜埞埡埢埣埥",7,"埮埰埱埲埳埵埶執埻埼埾埿å å ƒå „堅堈堉堊堌堎å å å ’堓堔堖堗堘堚堛堜å å Ÿå ¢å £å ¥",4,"å «",4,"報堲堳場堶",7],["8940","å ¾",5,"å¡…",6,"å¡Žå¡å¡å¡’å¡“å¡•å¡–å¡—å¡™",4,"å¡Ÿ",5,"塦",4,"å¡­",16,"塿墂墄墆墇墈墊墋墌"],["8980","å¢",4,"墔",4,"墛墜å¢å¢ ",7,"墪",17,"墽墾墿壀壂壃壄壆",10,"壒壓壔壖",13,"壥",5,"壭壯壱売壴壵壷壸壺",7,"夃夅夆夈",4,"夎å¤å¤‘夒夓夗夘夛å¤å¤žå¤ å¤¡å¤¢å¤£å¤¦å¤¨å¤¬å¤°å¤²å¤³å¤µå¤¶å¤»"],["8a40","夽夾夿奀奃奅奆奊奌å¥å¥å¥’奓奙奛",4,"奡奣奤奦",12,"奵奷奺奻奼奾奿妀妅妉妋妌妎å¦å¦å¦‘妔妕妘妚妛妜å¦å¦Ÿå¦ å¦¡å¦¢å¦¦"],["8a80","妧妬妭妰妱妳",5,"妺妼妽妿",6,"姇姈姉姌å§å§Žå§å§•å§–姙姛姞",4,"姤姦姧姩姪姫姭",11,"姺姼姽姾娀娂娊娋å¨å¨Žå¨å¨å¨’娔娕娖娗娙娚娛å¨å¨žå¨¡å¨¢å¨¤å¨¦å¨§å¨¨å¨ª",6,"娳娵娷",4,"娽娾娿å©",4,"婇婈婋",9,"婖婗婘婙婛",5],["8b40","婡婣婤婥婦婨婩婫",8,"婸婹婻婼婽婾媀",17,"媓",6,"媜",13,"媫媬"],["8b80","媭",4,"媴媶媷媹",4,"媿嫀嫃",5,"å«Šå«‹å«",4,"嫓嫕嫗嫙嫚嫛å«å«žå«Ÿå«¢å«¤å«¥å«§å«¨å«ªå«¬",4,"嫲",22,"嬊",11,"嬘",25,"嬳嬵嬶嬸",7,"å­",6],["8c40","å­ˆ",7,"孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊å®å®Žå®å®‘宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀å¯å¯ƒå¯ˆå¯‰å¯Šå¯‹å¯å¯Žå¯"],["8c80","寑寔",8,"寠寢寣實寧審",4,"寯寱",6,"寽対尀専尃尅將專尋尌å°å°Žå°å°’尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌å±å±’屓屔屖屗屘屚屛屜å±å±Ÿå±¢å±¤å±§",6,"å±°å±²",6,"屻屼屽屾岀岃",4,"岉岊岋岎å²å²’岓岕å²",4,"岤",4],["8d40","岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅",5,"峌",5,"峓",5,"峚",6,"峢峣峧峩峫峬峮峯峱",9,"å³¼",4],["8d80","å´å´„å´…å´ˆ",5,"å´",4,"崕崗崘崙崚崜å´å´Ÿ",4,"崥崨崪崫崬崯",4,"å´µ",7,"å´¿",7,"嵈嵉åµ",10,"嵙嵚嵜嵞",10,"嵪嵭嵮嵰嵱嵲嵳嵵",12,"嶃",21,"嶚嶛嶜嶞嶟嶠"],["8e40","嶡",21,"嶸",12,"å·†",6,"å·Ž",12,"巜巟巠巣巤巪巬巭"],["8e80","巰巵巶巸",4,"巿帀帄帇帉帊帋å¸å¸Žå¸’帓帗帞",7,"帨",4,"帯帰帲",4,"帹帺帾帿幀å¹å¹ƒå¹†",5,"å¹",6,"å¹–",4,"幜å¹å¹Ÿå¹ å¹£",14,"幵幷幹幾åºåº‚広庅庈庉庌åºåºŽåº’庘庛åºåº¡åº¢åº£åº¤åº¨",4,"庮",4,"庴庺庻庼庽庿",6],["8f40","廆廇廈廋",5,"廔廕廗廘廙廚廜",11,"廩廫",8,"廵廸廹廻廼廽弅弆弇弉弌å¼å¼Žå¼å¼’弔弖弙弚弜å¼å¼žå¼¡å¼¢å¼£å¼¤"],["8f80","弨弫弬弮弰弲",6,"弻弽弾弿å½",14,"彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆å¾å¾Žå¾å¾‘従徔徖徚徛å¾å¾žå¾Ÿå¾ å¾¢",5,"復徫徬徯",5,"徶徸徹徺徻徾",4,"忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇"],["9040","怈怉怋怌æ€æ€‘怓怗怘怚怞怟怢怣怤怬怭怮怰",4,"怶",4,"怽怾æ€æ„",6,"æŒæŽææ‘æ“æ”æ–æ—æ˜æ›æœæžæŸæ æ¡æ¥æ¦æ®æ±æ²æ´æµæ·æ¾æ‚€"],["9080","æ‚悂悅悆悇悈悊悋悎æ‚æ‚悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽",7,"惇惈惉惌",4,"惒惓惔惖惗惙惛惞惡",4,"惪惱惲惵惷惸惻",4,"愂愃愄愅愇愊愋愌æ„",4,"愖愗愘愙愛愜æ„愞愡愢愥愨愩愪愬",18,"æ…€",6],["9140","慇慉態æ…æ…æ…慒慓慔慖",6,"慞慟慠慡慣慤慥慦慩",6,"慱慲慳慴慶慸",18,"憌æ†æ†",4,"憕"],["9180","憖",6,"憞",8,"憪憫憭",9,"憸",5,"憿懀æ‡æ‡ƒ",4,"應懌",4,"懓懕",16,"懧",13,"懶",8,"戀",5,"戇戉戓戔戙戜æˆæˆžæˆ æˆ£æˆ¦æˆ§æˆ¨æˆ©æˆ«æˆ­æˆ¯æˆ°æˆ±æˆ²æˆµæˆ¶æˆ¸",4,"扂扄扅扆扊"],["9240","æ‰æ‰æ‰•æ‰–扗扙扚扜",6,"扤扥扨扱扲扴扵扷扸扺扻扽æŠæŠ‚抃抅抆抇抈抋",5,"抔抙抜æŠæŠžæŠ£æŠ¦æŠ§æŠ©æŠªæŠ­æŠ®æŠ¯æŠ°æŠ²æŠ³æŠ´æŠ¶æŠ·æŠ¸æŠºæŠ¾æ‹€æ‹"],["9280","拃拋æ‹æ‹‘æ‹•æ‹æ‹žæ‹ æ‹¡æ‹¤æ‹ªæ‹«æ‹°æ‹²æ‹µæ‹¸æ‹¹æ‹ºæ‹»æŒ€æŒƒæŒ„挅挆挊挋挌æŒæŒæŒæŒ’挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳",5,"挻挼挾挿æ€ææ„æ‡æˆæŠæ‘æ’æ“æ”æ–",7,"æ æ¤æ¥æ¦æ¨æªæ«æ¬æ¯æ°æ²æ³æ´æµæ¸æ¹æ¼æ½æ¾æ¿æŽæŽƒæŽ„掅掆掋æŽæŽ‘掓掔掕掗掙",6,"採掤掦掫掯掱掲掵掶掹掻掽掿æ€"],["9340","ææ‚æƒæ…æ‡æˆæŠæ‹æŒæ‘æ“æ”æ•æ—",6,"æŸæ¢æ¤",4,"æ«æ¬æ®æ¯æ°æ±æ³æµæ·æ¹æºæ»æ¼æ¾æƒæ„æ†",4,"ææŽæ‘æ’æ•",5,"ææŸæ¢æ£æ¤"],["9380","æ¥æ§æ¨æ©æ«æ®",5,"æµ",4,"æ»æ¼æ¾æ‘€æ‘‚摃摉摋",6,"æ‘“æ‘•æ‘–æ‘—æ‘™",4,"æ‘Ÿ",7,"摨摪摫摬摮",9,"æ‘»",6,"撃撆撈",8,"撓撔撗撘撚撛撜æ’æ’Ÿ",4,"撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿æ“擃擄擆",6,"æ“擑擓擔擕擖擙據"],["9440","擛擜æ“擟擠擡擣擥擧",24,"æ”",7,"攊",7,"攓",4,"æ”™",8],["9480","攢攣攤攦",4,"攬攭攰攱攲攳攷攺攼攽敀",4,"敆敇敊敋æ•æ•Žæ•æ•’敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數",14,"斈斉斊æ–æ–Žæ–斒斔斕斖斘斚æ–斞斠斢斣斦斨斪斬斮斱",7,"斺斻斾斿旀旂旇旈旉旊æ—æ—旑旓旔旕旘",7,"旡旣旤旪旫"],["9540","旲旳旴旵旸旹旻",4,"æ˜æ˜„昅昇昈昉昋æ˜æ˜æ˜‘昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷",4,"昽昿晀時晄",6,"æ™æ™Žæ™æ™‘晘"],["9580","晙晛晜æ™æ™žæ™ æ™¢æ™£æ™¥æ™§æ™©",4,"晱晲晳晵晸晹晻晼晽晿暀æšæšƒæš…暆暈暉暊暋æšæšŽæšæšæš’暓暔暕暘",4,"æšž",8,"æš©",4,"暯",4,"暵暶暷暸暺暻暼暽暿",25,"曚曞",7,"曧曨曪",5,"曱曵曶書曺曻曽æœæœ‚會"],["9640","朄朅朆朇朌朎æœæœ‘朒朓朖朘朙朚朜朞朠",5,"朧朩朮朰朲朳朶朷朸朹朻朼朾朿ææ„æ…æ‡æŠæ‹ææ’æ”æ•æ—",4,"ææ¢æ£æ¤æ¦æ§æ«æ¬æ®æ±æ´æ¶"],["9680","æ¸æ¹æºæ»æ½æž€æž‚枃枅枆枈枊枌æžæžŽæžæž‘枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹",7,"柂柅",9,"柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵",7,"柾æ æ ‚栃栄栆æ æ æ ’栔栕栘",4,"æ žæ Ÿæ  æ ¢",6,"æ «",6,"栴栵栶栺栻栿桇桋æ¡æ¡æ¡’æ¡–",5],["9740","æ¡œæ¡æ¡žæ¡Ÿæ¡ªæ¡¬",7,"桵桸",8,"梂梄梇",7,"æ¢æ¢‘梒梔梕梖梘",9,"梣梤梥梩梪梫梬梮梱梲梴梶梷梸"],["9780","梹",6,"æ£æ£ƒ",5,"棊棌棎æ£æ£æ£‘棓棔棖棗棙棛",4,"棡棢棤",9,"棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆",4,"椌æ¤æ¤‘椓",11,"椡椢椣椥",7,"椮椯椱椲椳椵椶椷椸椺椻椼椾楀æ¥æ¥ƒ",16,"楕楖楘楙楛楜楟"],["9840","楡楢楤楥楧楨楩楪楬業楯楰楲",4,"楺楻楽楾楿æ¦æ¦ƒæ¦…榊榋榌榎",5,"榖榗榙榚æ¦",9,"榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽"],["9880","榾榿槀槂",7,"構æ§æ§æ§‘槒槓槕",5,"槜æ§æ§žæ§¡",11,"槮槯槰槱槳",9,"槾樀",9,"樋",11,"標",5,"樠樢",5,"権樫樬樭樮樰樲樳樴樶",6,"樿",4,"橅橆橈",7,"æ©‘",6,"æ©š"],["9940","æ©œ",4,"橢橣橤橦",10,"橲",6,"橺橻橽橾橿æªæª‚檃檅",8,"æªæª’",4,"檘",7,"檡",5],["9980","檧檨檪檭",114,"欥欦欨",6],["9a40","欯欰欱欳欴欵欶欸欻欼欽欿歀æ­æ­‚歄歅歈歊歋æ­",11,"æ­š",7,"歨歩歫",13,"歺歽歾歿殀殅殈"],["9a80","殌殎æ®æ®æ®‘殔殕殗殘殙殜",4,"殢",7,"殫",7,"殶殸",6,"毀毃毄毆",4,"毌毎æ¯æ¯‘毘毚毜",4,"毢",7,"毬毭毮毰毱毲毴毶毷毸毺毻毼毾",6,"æ°ˆ",4,"æ°Žæ°’æ°—æ°œæ°æ°žæ° æ°£æ°¥æ°«æ°¬æ°­æ°±æ°³æ°¶æ°·æ°¹æ°ºæ°»æ°¼æ°¾æ°¿æ±ƒæ±„汅汈汋",4,"汑汒汓汖汘"],["9b40","汙汚汢汣汥汦汧汫",4,"汱汳汵汷汸決汻汼汿沀沄沇沊沋æ²æ²Žæ²‘沒沕沖沗沘沚沜æ²æ²žæ² æ²¢æ²¨æ²¬æ²¯æ²°æ²´æ²µæ²¶æ²·æ²ºæ³€æ³æ³‚泃泆泇泈泋æ³æ³Žæ³æ³‘泒泘"],["9b80","泙泚泜æ³æ³Ÿæ³¤æ³¦æ³§æ³©æ³¬æ³­æ³²æ³´æ³¹æ³¿æ´€æ´‚洃洅洆洈洉洊æ´æ´æ´æ´‘洓洔洕洖洘洜æ´æ´Ÿ",5,"洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌æµæµ•æµ–浗浘浛æµæµŸæµ¡æµ¢æµ¤æµ¥æµ§æµ¨æµ«æµ¬æµ­æµ°æµ±æµ²æµ³æµµæµ¶æµ¹æµºæµ»æµ½",4,"涃涄涆涇涊涋æ¶æ¶æ¶æ¶’涖",4,"涜涢涥涬涭涰涱涳涴涶涷涹",5,"æ·æ·‚淃淈淉淊"],["9c40","æ·æ·Žæ·æ·æ·’淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽",7,"渆渇済渉渋æ¸æ¸’渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵"],["9c80","渶渷渹渻",7,"æ¹…",7,"æ¹æ¹æ¹‘湒湕湗湙湚湜æ¹æ¹žæ¹ ",10,"湬湭湯",14,"満æºæº‚溄溇溈溊",4,"溑",6,"溙溚溛æºæºžæº æº¡æº£æº¤æº¦æº¨æº©æº«æº¬æº­æº®æº°æº³æºµæº¸æº¹æº¼æº¾æº¿æ»€æ»ƒæ»„滅滆滈滉滊滌æ»æ»Žæ»æ»’滖滘滙滛滜æ»æ»£æ»§æ»ª",5],["9d40","滰滱滲滳滵滶滷滸滺",7,"漃漄漅漇漈漊",4,"æ¼æ¼‘æ¼’æ¼–",9,"漡漢漣漥漦漧漨漬漮漰漲漴漵漷",6,"漿潀æ½æ½‚"],["9d80","潃潄潅潈潉潊潌潎",9,"潙潚潛æ½æ½Ÿæ½ æ½¡æ½£æ½¤æ½¥æ½§",5,"潯潰潱潳潵潶潷潹潻潽",6,"澅澆澇澊澋æ¾",12,"æ¾æ¾žæ¾Ÿæ¾ æ¾¢",4,"澨",10,"澴澵澷澸澺",5,"æ¿æ¿ƒ",5,"æ¿Š",6,"æ¿“",10,"濟濢濣濤濥"],["9e40","濦",7,"æ¿°",32,"瀒",7,"瀜",6,"瀤",6],["9e80","瀫",9,"瀶瀷瀸瀺",17,"ççŽç",13,"çŸ",11,"ç®ç±ç²ç³ç´ç·ç¹çºç»ç½ç‚炂炃炄炆炇炈炋炌ç‚ç‚ç‚炑炓炗炘炚炛炞",12,"炰炲炴炵炶為炾炿烄烅烆烇烉烋",12,"烚"],["9f40","烜çƒçƒžçƒ çƒ¡çƒ¢çƒ£çƒ¥çƒªçƒ®çƒ°",6,"烸烺烻烼烾",10,"ç„‹",4,"焑焒焔焗焛",10,"焧",7,"焲焳焴"],["9f80","焵焷",13,"煆煇煈煉煋ç…ç…",12,"ç…ç…Ÿ",4,"煥煩",4,"煯煰煱煴煵煶煷煹煻煼煾",5,"熅",4,"熋熌ç†ç†Žç†ç†‘熒熓熕熖熗熚",4,"熡",6,"熩熪熫熭",5,"熴熶熷熸熺",8,"燄",9,"ç‡",4],["a040","燖",9,"燡燢燣燤燦燨",5,"燯",9,"燺",11,"爇",19],["a080","爛爜爞",9,"爩爫爭爮爯爲爳爴爺爼爾牀",6,"牉牊牋牎ç‰ç‰ç‰‘牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅",4,"犌犎çŠçŠ‘犓",11,"犠",11,"犮犱犲犳犵犺",6,"狅狆狇狉狊狋狌ç‹ç‹‘狓狔狕狖狘狚狛"],["a1a1"," ã€ã€‚·ˉˇ¨〃々—~‖…‘’“â€ã€”〕〈",7,"〖〗ã€ã€‘±×÷∶∧∨∑âˆâˆªâˆ©âˆˆâˆ·âˆšâŠ¥âˆ¥âˆ âŒ’⊙∫∮≡≌≈∽âˆâ‰ â‰®â‰¯â‰¤â‰¥âˆžâˆµâˆ´â™‚♀°′″℃$¤¢£‰§№☆★○â—◎◇◆□■△▲※→â†â†‘↓〓"],["a2a1","â…°",9],["a2b1","â’ˆ",19,"â‘´",19,"â‘ ",9],["a2e5","㈠",9],["a2f1","â… ",11],["a3a1","ï¼ï¼‚#¥%",88,"ï¿£"],["a4a1","ã",82],["a5a1","ã‚¡",85],["a6a1","Α",16,"Σ",6],["a6c1","α",16,"σ",6],["a6e0","︵︶︹︺︿﹀︽︾ï¹ï¹‚﹃﹄"],["a6ee","︻︼︷︸︱"],["a6f4","︳︴"],["a7a1","Ð",5,"ÐЖ",25],["a7d1","а",5,"ёж",25],["a840","ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿â•",35,"â–",6],["a880","â–ˆ",7,"▓▔▕▼▽◢◣◤◥☉⊕〒ã€ã€ž"],["a8a1","ÄáǎàēéěèīíÇìÅóǒòūúǔùǖǘǚǜüêɑ"],["a8bd","ńň"],["a8c0","É¡"],["a8c5","ã„…",36],["a940","〡",8,"㊣㎎ãŽãŽœãŽãŽžãŽ¡ã„ãŽã‘ã’ã•ï¸°ï¿¢ï¿¤"],["a959","℡㈱"],["a95c","â€"],["a960","ー゛゜ヽヾ〆ã‚ゞ﹉",9,"﹔﹕﹖﹗﹙",8],["a980","ï¹¢",4,"﹨﹩﹪﹫"],["a996","〇"],["a9a4","─",75],["aa40","ç‹œç‹ç‹Ÿç‹¢",5,"狪狫狵狶狹狽狾狿猀猂猄",5,"猋猌çŒçŒçŒçŒ‘猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽ç€",8],["aa80","ç‰çŠç‹çŒçŽçç‘ç“ç”ç•ç–ç˜",7,"ç¡",10,"ç®ç°ç±"],["ab40","ç²",11,"ç¿",4,"玅玆玈玊玌çŽçŽçŽçŽ’玓玔玕玗玘玙玚玜çŽçŽžçŽ çŽ¡çŽ£",5,"玪玬玭玱玴玵玶玸玹玼玽玾玿ççƒ",4],["ab80","ç‹çŒçŽç’",6,"çšç›çœççŸç¡ç¢ç£ç¤ç¦ç¨çªç«ç¬ç®ç¯ç°ç±ç³",4],["ac40","ç¸",10,"ç„ç‡çˆç‹çŒççŽç‘",8,"çœ",5,"ç£ç¤ç§ç©ç«ç­ç¯ç±ç²ç·",4,"ç½ç¾ç¿ç‘€ç‘‚",11],["ac80","ç‘Ž",6,"瑖瑘ç‘ç‘ ",12,"瑮瑯瑱",4,"瑸瑹瑺"],["ad40","瑻瑼瑽瑿璂璄璅璆璈璉璊璌ç’ç’ç’‘",10,"ç’ç’Ÿ",7,"ç’ª",15,"ç’»",12],["ad80","瓈",9,"ç““",8,"ç“瓟瓡瓥瓧",6,"瓰瓱瓲"],["ae40","瓳瓵瓸",6,"甀ç”甂甃甅",7,"甎ç”甒甔甕甖甗甛ç”甞甠",4,"甦甧甪甮甴甶甹甼甽甿ç•ç•‚畃畄畆畇畉畊ç•ç•ç•‘畒畓畕畖畗畘"],["ae80","ç•",7,"畧畨畩畫",6,"畳畵當畷畺",4,"ç–€ç–ç–‚ç–„ç–…ç–‡"],["af40","疈疉疊疌ç–ç–Žç–疓疕疘疛疜疞疢疦",4,"疭疶疷疺疻疿痀ç—痆痋痌痎ç—ç—痑痓痗痙痚痜ç—痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇"],["af80","瘈瘉瘋ç˜ç˜Žç˜ç˜‘瘒瘓瘔瘖瘚瘜ç˜ç˜žç˜¡ç˜£ç˜§ç˜¨ç˜¬ç˜®ç˜¯ç˜±ç˜²ç˜¶ç˜·ç˜¹ç˜ºç˜»ç˜½ç™ç™‚癄"],["b040","ç™…",6,"癎",5,"癕癗",4,"ç™ç™Ÿç™ ç™¡ç™¢ç™¤",6,"癬癭癮癰",7,"癹発發癿皀çšçšƒçš…皉皊皌çšçšçšçš’皔皕皗皘皚皛"],["b080","çšœ",7,"皥",8,"皯皰皳皵",9,"盀ç›ç›ƒå•Šé˜¿åŸƒæŒ¨å“Žå”‰å“€çš‘癌蔼矮艾ç¢çˆ±éš˜éžæ°¨å®‰ä¿ºæŒ‰æš—岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭æŒæ‰’å­å§ç¬†å…«ç–¤å·´æ‹”è·‹é¶æŠŠè€™å霸罢爸白æŸç™¾æ‘†ä½°è´¥æ‹œç¨—æ–‘ç­æ¬æ‰³èˆ¬é¢æ¿ç‰ˆæ‰®æ‹Œä¼´ç“£åŠåŠžç»Šé‚¦å¸®æ¢†æ¦œè†€ç»‘棒磅蚌镑å‚谤苞胞包褒剥"],["b140","盄盇盉盋盌盓盕盙盚盜ç›ç›žç› ",4,"盦",7,"盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎",10,"眛眜çœçœžçœ¡çœ£çœ¤çœ¥çœ§çœªçœ«"],["b180","眬眮眰",4,"眹眻眽眾眿ç‚ç„ç…ç†çˆ",7,"ç’",7,"çœè–„雹ä¿å ¡é¥±å®æŠ±æŠ¥æš´è±¹é²çˆ†æ¯ç¢‘悲å‘北辈背è´é’¡å€ç‹ˆå¤‡æƒ«ç„™è¢«å¥”苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖å¸åº‡ç—¹é—­æ•å¼Šå¿…辟å£è‡‚é¿é™›éž­è¾¹ç¼–è´¬æ‰ä¾¿å˜åžè¾¨è¾©è¾«é标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳"],["b240","ççžçŸç ç¤ç§ç©çªç­",11,"çºç»ç¼çžçž‚瞃瞆",5,"çžçžçž“",11,"瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶",4],["b280","瞼瞾矀",12,"矎",8,"矘矙矚çŸ",4,"矤病并玻è æ’­æ‹¨é’µæ³¢åšå‹ƒæ铂箔伯帛舶脖膊渤泊驳æ•åœå“ºè¡¥åŸ ä¸å¸ƒæ­¥ç°¿éƒ¨æ€–擦猜è£ææ‰è´¢ç¬è¸©é‡‡å½©èœè”¡é¤å‚蚕残惭惨ç¿è‹èˆ±ä»“沧è—æ“糙槽曹è‰åŽ•ç­–侧册测层蹭æ’å‰èŒ¬èŒ¶æŸ¥ç¢´æ½å¯Ÿå²”差诧拆柴豺æ€æŽºè‰é¦‹è°—缠铲产é˜é¢¤æ˜ŒçŒ–"],["b340","矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃",5,"ç Šç ‹ç Žç ç ç “砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿ç¡ç¡‚硃硄硆硈硉硊硋ç¡ç¡ç¡‘硓硔硘硙硚"],["b380","硛硜硞",11,"硯",7,"硸硹硺硻硽",6,"场å°å¸¸é•¿å¿è‚ åŽ‚敞畅唱倡超抄钞æœå˜²æ½®å·¢åµç‚’车扯撤掣彻澈郴臣辰尘晨忱沉陈è¶è¡¬æ’‘称城橙æˆå‘ˆä¹˜ç¨‹æƒ©æ¾„诚承逞骋秤åƒç—´æŒåŒ™æ± è¿Ÿå¼›é©°è€»é½¿ä¾ˆå°ºèµ¤ç¿…斥炽充冲虫崇宠抽酬畴踌稠æ„筹仇绸瞅丑臭åˆå‡ºæ©±åŽ¨èº‡é”„é›æ»é™¤æ¥š"],["b440","碄碅碆碈碊碋ç¢ç¢ç¢’碔碕碖碙ç¢ç¢žç¢ ç¢¢ç¢¤ç¢¦ç¢¨",7,"碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌ç£ç£Žç£ç£‘磒磓磖磗磘磚",9],["b480","磤磥磦磧磩磪磫磭",4,"磳磵磶磸磹磻",5,"礂礃礄礆",6,"础储矗æ触处æ£å·ç©¿æ¤½ä¼ èˆ¹å–˜ä¸²ç–®çª—幢床闯创å¹ç‚Šæ¶é”¤åž‚春椿醇唇淳纯蠢戳绰疵茨ç£é›Œè¾žæ…ˆç“·è¯æ­¤åˆºèµæ¬¡èªè‘±å›±åŒ†ä»Žä¸›å‡‘粗醋簇促蹿篡窜摧崔催脆ç˜ç²¹æ·¬ç¿ æ‘存寸磋撮æ“措挫错æ­è¾¾ç­”瘩打大呆歹傣戴带殆代贷袋待逮"],["b540","ç¤",5,"礔",9,"礟",4,"礥",14,"礵",4,"礽礿祂祃祄祅祇祊",8,"祔祕祘祙祡祣"],["b580","祤祦祩祪祫祬祮祰",6,"祹祻",4,"禂禃禆禇禈禉禋禌ç¦ç¦Žç¦ç¦‘禒怠耽担丹å•éƒ¸æŽ¸èƒ†æ—¦æ°®ä½†æƒ®æ·¡è¯žå¼¹è›‹å½“挡党è¡æ¡£åˆ€æ£è¹ˆå€’岛祷导到稻悼é“盗德得的蹬ç¯ç™»ç­‰çžªå‡³é‚“堤低滴迪敌笛狄涤翟嫡抵底地蒂第å¸å¼Ÿé€’缔颠掂滇碘点典é›åž«ç”µä½ƒç”¸åº—惦奠淀殿碉å¼é›•å‡‹åˆæŽ‰åŠé’“调跌爹碟è¶è¿­è°å "],["b640","禓",6,"禛",11,"禨",10,"禴",4,"禼禿秂秄秅秇秈秊秌秎ç§ç§ç§“秔秖秗秙",5,"秠秡秢秥秨秪"],["b680","秬秮秱",6,"秹秺秼秾秿ç¨ç¨„稅稇稈稉稊稌ç¨",4,"稕稖稘稙稛稜ä¸ç›¯å®é’‰é¡¶é¼Žé”­å®šè®¢ä¸¢ä¸œå†¬è‘£æ‡‚动栋侗æ«å†»æ´žå…œæŠ–斗陡豆逗痘都ç£æ¯’犊独读堵ç¹èµŒæœé•€è‚šåº¦æ¸¡å¦’端短锻段断缎堆兑队对墩å¨è¹²æ•¦é¡¿å›¤é’盾é掇哆多夺垛躲朵跺舵å‰æƒ°å •è›¾å³¨é¹…ä¿„é¢è®¹å¨¥æ¶åŽ„扼é鄂饿æ©è€Œå„¿è€³å°”饵洱二"],["b740","ç¨ç¨Ÿç¨¡ç¨¢ç¨¤",14,"稴稵稶稸稺稾穀",5,"穇",9,"ç©’",4,"穘",16],["b780","ç©©",6,"穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎çªçªçª“窔窙窚窛窞窡窢贰å‘罚ç­ä¼ä¹é˜€æ³•ç藩帆番翻樊矾钒ç¹å‡¡çƒ¦å返范贩犯饭泛åŠèŠ³æ–¹è‚ªæˆ¿é˜²å¦¨ä»¿è®¿çººæ”¾è²éžå•¡é£žè‚¥åŒªè¯½å è‚ºåºŸæ²¸è´¹èŠ¬é…šå©æ°›åˆ†çº·åŸç„šæ±¾ç²‰å¥‹ä»½å¿¿æ„¤ç²ªä¸°å°æž«èœ‚峰锋风疯烽逢冯ç¼è®½å¥‰å‡¤ä½›å¦å¤«æ•·è‚¤å­µæ‰¶æ‹‚è¾å¹…氟符ä¼ä¿˜æœ"],["b840","窣窤窧窩窪窫窮",4,"窴",10,"ç«€",10,"ç«Œ",9,"竗竘竚竛竜ç«ç«¡ç«¢ç«¤ç«§",5,"竮竰竱竲竳"],["b880","ç«´",4,"竻竼竾笀ç¬ç¬‚笅笇笉笌ç¬ç¬Žç¬ç¬’笓笖笗笘笚笜ç¬ç¬Ÿç¬¡ç¬¢ç¬£ç¬§ç¬©ç¬­æµ®æ¶ªç¦è¢±å¼—甫抚辅俯釜斧脯腑府è…赴副覆赋å¤å‚…付阜父腹负富讣附妇缚å’噶嘎该改概钙盖溉干甘æ†æŸ‘ç«¿è‚赶感秆敢赣冈刚钢缸肛纲岗港æ ç¯™çš‹é«˜è†ç¾”糕æžé•ç¨¿å‘Šå“¥æ­Œæ戈鸽胳疙割é©è‘›æ ¼è›¤é˜éš”铬个å„给根跟耕更庚羹"],["b940","笯笰笲笴笵笶笷笹笻笽笿",5,"筆筈筊ç­ç­Žç­“筕筗筙筜筞筟筡筣",10,"筯筰筳筴筶筸筺筼筽筿ç®ç®‚箃箄箆",6,"箎ç®"],["b980","箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹",7,"篂篃範埂耿梗工攻功æ­é¾šä¾›èº¬å…¬å®«å¼“巩汞拱贡共钩勾沟苟狗垢构购够辜è‡å’•ç®ä¼°æ²½å­¤å§‘鼓å¤è›Šéª¨è°·è‚¡æ•…顾固雇刮瓜å‰å¯¡æŒ‚褂乖æ‹æ€ªæ£ºå…³å®˜å† è§‚管馆ç½æƒ¯çŒè´¯å…‰å¹¿é€›ç‘°è§„圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚æ£é”…郭国果裹过哈"],["ba40","篅篈築篊篋ç¯ç¯Žç¯ç¯ç¯’篔",4,"篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲",4,"篸篹篺篻篽篿",7,"簈簉簊ç°ç°Žç°",5,"簗簘簙"],["ba80","ç°š",4,"ç° ",5,"簨簩簫",12,"ç°¹",5,"籂骸孩海氦亥害骇酣憨邯韩å«æ¶µå¯’函喊罕翰撼æ旱憾æ‚焊汗汉夯æ­èˆªå£•åšŽè±ªæ¯«éƒå¥½è€—å·æµ©å‘µå–è·è核禾和何åˆç›’貉阂河涸赫è¤é¹¤è´ºå˜¿é»‘痕很狠æ¨å“¼äº¨æ¨ªè¡¡æ’轰哄烘虹鸿洪å®å¼˜çº¢å–‰ä¾¯çŒ´å¼åŽšå€™åŽå‘¼ä¹Žå¿½ç‘šå£¶è‘«èƒ¡è´ç‹ç³Šæ¹–"],["bb40","籃",9,"籎",36,"ç±µ",5,"ç±¾",9],["bb80","粈粊",6,"粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴",4,"粺粻弧虎唬护互沪户花哗åŽçŒ¾æ»‘画划化è¯æ§å¾Šæ€€æ·®å欢环桓还缓æ¢æ‚£å”¤ç—ªè±¢ç„•æ¶£å®¦å¹»è’慌黄磺è—簧皇凰惶煌晃幌æè°Žç°æŒ¥è¾‰å¾½æ¢è›”回æ¯æ‚”æ…§å‰æƒ æ™¦è´¿ç§½ä¼šçƒ©æ±‡è®³è¯²ç»˜è¤æ˜å©šé­‚浑混è±æ´»ä¼™ç«èŽ·æˆ–惑éœè´§ç¥¸å‡»åœ¾åŸºæœºç•¸ç¨½ç§¯ç®•"],["bc40","粿糀糂糃糄糆糉糋糎",6,"糘糚糛ç³ç³žç³¡",6,"糩",5,"ç³°",7,"糹糺糼",13,"ç´‹",5],["bc80","ç´‘",14,"紡紣紤紥紦紨紩紪紬紭紮細",6,"肌饥迹激讥鸡姬绩缉å‰æžæ£˜è¾‘ç±é›†åŠæ€¥ç–¾æ±²å³å«‰çº§æŒ¤å‡ è„Šå·±è“ŸæŠ€å†€å­£ä¼Žç¥­å‰‚悸济寄寂计记既忌际妓继纪嘉枷夹佳家加èšé¢Šè´¾ç”²é’¾å‡ç¨¼ä»·æž¶é©¾å«æ­¼ç›‘åšå°–笺间煎兼肩艰奸缄茧检柬碱硷拣æ¡ç®€ä¿­å‰ªå‡è槛鉴践贱è§é”®ç®­ä»¶"],["bd40","ç´·",54,"絯",7],["bd80","絸",32,"å¥èˆ°å‰‘饯æ¸æº…涧建僵姜将浆江疆蒋桨奖讲匠酱é™è•‰æ¤’ç¤ç„¦èƒ¶äº¤éƒŠæµ‡éª„娇嚼æ…铰矫侥脚狡角饺缴绞剿教酵轿较å«çª–æ­æŽ¥çš†ç§¸è¡—阶截劫节桔æ°æ·ç«ç«­æ´ç»“解å§æˆ’藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进é³æ™‹ç¦è¿‘烬浸"],["be40","継",12,"綧",6,"綯",42],["be80","ç·š",32,"尽劲è†å…¢èŒŽç›æ™¶é²¸äº¬æƒŠç²¾ç²³ç»äº•è­¦æ™¯é¢ˆé™å¢ƒæ•¬é•œå¾„ç—‰é–竟竞净炯窘æªç©¶çº çŽ–韭久ç¸ä¹é…’厩救旧臼舅咎就疚鞠拘狙疽居驹èŠå±€å’€çŸ©ä¸¾æ²®èšæ‹’æ®å·¨å…·è·è¸žé”¯ä¿±å¥æƒ§ç‚¬å‰§æ鹃娟倦眷å·ç»¢æ’…攫抉掘倔爵觉决诀ç»å‡èŒé’§å†›å›å³»"],["bf40","ç·»",62],["bf80","縺縼",4,"繂",4,"繈",21,"俊竣浚郡éªå–€å’–å¡å’¯å¼€æ©æ¥·å‡¯æ…¨åˆŠå ªå‹˜åŽç çœ‹åº·æ…·ç³ æ‰›æŠ—亢炕考拷烤é å·è‹›æŸ¯æ£µç£•é¢—科壳咳å¯æ¸´å…‹åˆ»å®¢è¯¾è‚¯å•ƒåž¦æ³å‘å­ç©ºæ孔控抠å£æ‰£å¯‡æž¯å“­çªŸè‹¦é…·åº“裤夸垮挎跨胯å—筷侩快宽款匡ç­ç‹‚框矿眶旷况äºç›”岿窥葵奎é­å‚€"],["c040","繞",35,"纃",23,"纜çºçºž"],["c080","纮纴纻纼绖绤绬绹缊ç¼ç¼žç¼·ç¼¹ç¼»",6,"罃罆",9,"罒罓馈愧溃å¤æ˜†æ†å›°æ‹¬æ‰©å»“阔垃拉喇蜡腊辣啦莱æ¥èµ–è“婪æ æ‹¦ç¯®é˜‘兰澜谰æ½è§ˆæ‡’缆烂滥ç…榔狼廊郎朗浪æžåŠ³ç‰¢è€ä½¬å§¥é…ªçƒ™æ¶å‹’ä¹é›·é•­è•¾ç£Šç´¯å„¡åž’擂肋类泪棱楞冷厘梨çŠé»Žç¯±ç‹¸ç¦»æ¼“ç†æŽé‡Œé²¤ç¤¼èŽ‰è”å栗丽厉励砾历利傈例ä¿"],["c140","罖罙罛罜ç½ç½žç½ ç½£",4,"罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂",7,"羋ç¾ç¾",4,"羕",4,"羛羜羠羢羣羥羦羨",6,"ç¾±"],["c180","ç¾³",4,"羺羻羾翀翂翃翄翆翇翈翉翋ç¿ç¿",4,"ç¿–ç¿—ç¿™",5,"翢翣痢立粒沥隶力璃哩俩è”莲连镰廉怜涟帘敛脸链æ‹ç‚¼ç»ƒç²®å‡‰æ¢ç²±è‰¯ä¸¤è¾†é‡æ™¾äº®è°…æ’©èŠåƒšç–—燎寥辽潦了撂镣廖料列裂烈劣猎ç³æž—磷霖临邻鳞淋凛èµå拎玲è±é›¶é¾„铃伶羚凌çµé™µå²­é¢†å¦ä»¤æºœç‰æ¦´ç¡«é¦ç•™åˆ˜ç˜¤æµæŸ³å…­é¾™è‹å’™ç¬¼çª¿"],["c240","翤翧翨翪翫翬翭翯翲翴",6,"翽翾翿耂耇耈耉耊耎è€è€‘耓耚耛è€è€žè€Ÿè€¡è€£è€¤è€«",5,"耲耴耹耺耼耾è€èè„è…è‡èˆè‰èŽèèè‘è“è•è–è—"],["c280","è™è›",13,"è«",5,"è²",11,"隆垄拢陇楼娄æ‚篓æ¼é™‹èŠ¦å¢é¢…åºç‚‰æŽ³å¤è™é²éº“碌露路赂鹿潞禄录陆戮驴å•é“侣旅履屡缕虑氯律率滤绿峦挛孪滦åµä¹±æŽ ç•¥æŠ¡è½®ä¼¦ä»‘沦纶论è螺罗逻锣箩骡裸è½æ´›éª†ç»œå¦ˆéº»çŽ›ç èš‚马骂嘛å—埋买麦å–迈脉瞒馒蛮满蔓曼慢漫"],["c340","è¾è‚肂肅肈肊è‚",5,"肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇",4,"èƒ",6,"胘胟胠胢胣胦胮胵胷胹胻胾胿脀è„脃脄脅脇脈脋"],["c380","脌脕脗脙脛脜è„è„Ÿ",12,"脭脮脰脳脴脵脷脹",4,"脿谩芒茫盲氓忙莽猫茅锚毛矛铆å¯èŒ‚冒帽貌贸么玫枚梅酶霉煤没眉媒é•æ¯ç¾Žæ˜§å¯å¦¹åªšé—¨é—·ä»¬èŒè’™æª¬ç›Ÿé”°çŒ›æ¢¦å­Ÿçœ¯é†šé¡ç³œè¿·è°œå¼¥ç±³ç§˜è§…泌蜜密幂棉眠绵冕å…勉娩缅é¢è‹—æçž„è—秒渺庙妙蔑ç­æ°‘抿皿æ•æ‚¯é—½æ˜ŽèžŸé¸£é“­å命谬摸"],["c440","è…€",5,"腇腉è…è…Žè…腒腖腗腘腛",4,"腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸è†è†ƒ",4,"膉膋膌è†è†Žè†è†’",5,"膙膚膞",4,"膤膥"],["c480","膧膩膫",7,"膴",5,"膼膽膾膿臄臅臇臈臉臋è‡",6,"摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟æŸæ‹‡ç‰¡äº©å§†æ¯å¢“暮幕募慕木目ç¦ç‰§ç©†æ‹¿å“ªå‘钠那娜纳氖乃奶è€å¥ˆå—男难囊挠脑æ¼é—¹æ·–å‘¢é¦å†…嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵æ»å¿µå¨˜é…¿é¸Ÿå°¿æè‚孽啮镊é•æ¶…您柠狞å‡å®"],["c540","臔",14,"臤臥臦臨臩臫臮",4,"臵",5,"臽臿舃與",4,"舎èˆèˆ‘舓舕",5,"èˆèˆ èˆ¤èˆ¥èˆ¦èˆ§èˆ©èˆ®èˆ²èˆºèˆ¼èˆ½èˆ¿"],["c580","艀è‰è‰‚艃艅艆艈艊艌è‰è‰Žè‰",7,"艙艛艜è‰è‰žè‰ ",7,"艩拧泞牛扭钮纽脓浓农弄奴努怒女暖è™ç–ŸæŒªæ‡¦ç³¯è¯ºå“¦æ¬§é¸¥æ®´è—•å‘•å¶æ²¤å•ªè¶´çˆ¬å¸•æ€•ç¶æ‹æŽ’牌徘湃派攀潘盘ç£ç›¼ç•”判å›ä¹“庞æ—耪胖抛咆刨炮è¢è·‘泡呸胚培裴赔陪é…佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋é¹æ§ç¢°å¯ç ’霹批披劈çµæ¯—"],["c640","艪艫艬艭艱艵艶艷艸艻艼芀èŠèŠƒèŠ…芆芇芉芌èŠèŠ“芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉è‹è‹–苙苚è‹è‹¢è‹§è‹¨è‹©è‹ªè‹¬è‹­è‹®è‹°è‹²è‹³è‹µè‹¶è‹¸"],["c680","苺苼",4,"茊茋èŒèŒèŒ’茓茖茘茙èŒ",9,"茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻å±è­¬ç¯‡å片骗飘漂瓢票撇瞥拼频贫å“è˜ä¹’åªè‹¹è平凭瓶评å±å¡æ³¼é¢‡å©†ç ´é­„迫粕剖扑铺仆莆葡è©è’²åŸ”朴圃普浦谱æ›ç€‘期欺栖戚妻七凄漆柒æ²å…¶æ£‹å¥‡æ­§ç•¦å´Žè„é½æ——祈ç¥éª‘起岂乞ä¼å¯å¥‘砌器气迄弃汽泣讫æŽ"],["c740","茾茿èè‚è„è…èˆèŠ",4,"è“è•",4,"èè¢è°",6,"è¹èºè¾",6,"莇莈莊莋莌èŽèŽèŽèŽ‘莔莕莖莗莙莚èŽèŽŸèŽ¡",6,"莬莭莮"],["c780","莯莵莻莾莿è‚èƒè„è†èˆè‰è‹èèŽèè‘è’è“è•è—è™èšè›èžè¢è£è¤è¦è§è¨è«è¬è­æ°æ´½ç‰µæ‰¦é’Žé“…åƒè¿ç­¾ä»Ÿè°¦ä¹¾é»”钱钳å‰æ½œé£æµ…谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭ä¿çªåˆ‡èŒ„且怯窃钦侵亲秦ç´å‹¤èŠ¹æ“’禽å¯æ²é’轻氢倾å¿æ¸…擎晴氰情顷请庆ç¼ç©·ç§‹ä¸˜é‚±çƒæ±‚囚酋泅趋区蛆曲躯屈驱渠"],["c840","è®è¯è³",4,"èºè»è¼è¾è¿è€è‚è…è‡èˆè‰èŠèè’",5,"è™èšè›èž",5,"è©",7,"è²",5,"è¹èºè»è¾",7,"葇葈葉"],["c880","è‘Š",6,"è‘’",4,"葘è‘葞葟葠葢葤",4,"葪葮葯葰葲葴葷葹葻葼å–娶龋趣去圈颧æƒé†›æ³‰å…¨ç—Šæ‹³çŠ¬åˆ¸åŠç¼ºç‚”瘸å´é¹Šæ¦·ç¡®é›€è£™ç¾¤ç„¶ç‡ƒå†‰æŸ“瓤壤攘嚷让饶扰绕惹热壬ä»äººå¿éŸ§ä»»è®¤åˆƒå¦Šçº«æ‰”ä»æ—¥æˆŽèŒ¸è“‰è£èžç†”溶容绒冗æ‰æŸ”肉茹蠕儒孺如辱乳æ±å…¥è¤¥è½¯é˜®è•Šç‘žé”闰润若弱撒洒è¨è…®é³ƒå¡žèµ›ä¸‰å"],["c940","葽",4,"蒃蒄蒅蒆蒊è’è’",7,"蒘蒚蒛è’è’žè’Ÿè’ è’¢",12,"蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎è“蓒蓔蓕蓗"],["c980","蓘",4,"蓞蓡蓢蓤蓧",4,"蓭蓮蓯蓱",10,"蓽蓾蔀è”蔂伞散桑嗓丧æ”骚扫嫂瑟色涩森僧莎砂æ€åˆ¹æ²™çº±å‚»å•¥ç…žç­›æ™’çŠè‹«æ‰å±±åˆ ç…½è¡«é—ªé™•æ“…赡膳善汕扇缮墒伤商èµæ™Œä¸Šå°šè£³æ¢¢æŽç¨çƒ§èŠå‹ºéŸ¶å°‘哨邵ç»å¥¢èµŠè›‡èˆŒèˆèµ¦æ‘„射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲å‡ç»³"],["ca40","蔃",8,"è”蔎è”è”蔒蔔蔕蔖蔘蔙蔛蔜è”蔞蔠蔢",8,"è”­",9,"蔾",4,"蕄蕅蕆蕇蕋",10],["ca80","蕗蕘蕚蕛蕜è•è•Ÿ",4,"蕥蕦蕧蕩",8,"蕳蕵蕶蕷蕸蕼蕽蕿薀è–çœç››å‰©èƒœåœ£å¸ˆå¤±ç‹®æ–½æ¹¿è¯—尸虱å石拾时什食蚀实识å²çŸ¢ä½¿å±Žé©¶å§‹å¼ç¤ºå£«ä¸–柿事拭誓é€åŠ¿æ˜¯å—œå™¬é€‚仕ä¾é‡Šé¥°æ°å¸‚æƒå®¤è§†è¯•æ”¶æ‰‹é¦–守寿授售å—瘦兽蔬枢梳殊抒输å”舒淑ç–书赎孰熟薯暑曙署蜀é»é¼ å±žæœ¯è¿°æ ‘æŸæˆç«–墅庶数漱"],["cb40","薂薃薆薈",6,"è–",10,"è–",6,"薥薦薧薩薫薬薭薱",5,"薸薺",6,"è—‚",6,"è—Š",4,"è—‘è—’"],["cb80","藔藖",5,"è—",6,"藥藦藧藨藪",14,"æ•åˆ·è€æ‘”衰甩帅栓拴霜åŒçˆ½è°æ°´ç¡ç¨Žå®çž¬é¡ºèˆœè¯´ç¡•æœ”çƒæ–¯æ’•å˜¶æ€ç§å¸ä¸æ­»è‚†å¯ºå—£å››ä¼ºä¼¼é¥²å·³æ¾è€¸æ€‚颂é€å®‹è®¼è¯µæœè‰˜æ“žå—½è‹é…¥ä¿—素速粟僳塑溯宿诉肃酸蒜算虽隋éšç»¥é«“碎å²ç©—é‚隧祟孙æŸç¬‹è“‘梭唆缩çç´¢é”所塌他它她塔"],["cc40","藹藺藼藽藾蘀",4,"蘆",10,"蘒蘓蘔蘕蘗",15,"蘨蘪",13,"蘹蘺蘻蘽蘾蘿虀"],["cc80","è™",11,"虒虓處",4,"虛虜è™è™Ÿè™ è™¡è™£",7,"ç­æŒžè¹‹è¸èƒŽè‹”抬å°æ³°é…žå¤ªæ€æ±°å摊贪瘫滩å›æª€ç—°æ½­è°­è°ˆå¦æ¯¯è¢’碳探å¹ç‚­æ±¤å¡˜æªå ‚棠膛å”糖倘躺淌趟烫æŽæ¶›æ»”绦è„桃逃淘陶讨套特藤腾疼誊梯剔踢锑æ题蹄啼体替åšæƒ•æ¶•å‰ƒå±‰å¤©æ·»å¡«ç”°ç”œæ¬èˆ”腆挑æ¡è¿¢çœºè·³è´´é“帖厅å¬çƒƒ"],["cd40","虭虯虰虲",6,"蚃",6,"蚎",4,"蚔蚖",5,"èšž",4,"蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻",4,"è›è›‚蛃蛅蛈蛌è›è›’蛓蛕蛖蛗蛚蛜"],["cd80","è›è› è›¡è›¢è›£è›¥è›¦è›§è›¨è›ªè›«è›¬è›¯è›µè›¶è›·è›ºè›»è›¼è›½è›¿èœèœ„蜅蜆蜋蜌蜎èœèœèœ‘蜔蜖汀廷åœäº­åº­æŒºè‰‡é€šæ¡é…®çž³åŒé“œå½¤ç«¥æ¡¶æ…筒统痛å·æŠ•å¤´é€å‡¸ç§ƒçªå›¾å¾’途涂屠土åå…”æ¹å›¢æŽ¨é¢“腿蜕褪退åžå±¯è‡€æ‹–托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄å¨"],["ce40","蜙蜛èœèœŸèœ èœ¤èœ¦èœ§èœ¨èœªèœ«èœ¬èœ­èœ¯èœ°èœ²èœ³èœµèœ¶èœ¸èœ¹èœºèœ¼èœ½è€",6,"èŠè‹èèèè‘è’è”è•è–è˜èš",5,"è¡è¢è¦",7,"è¯è±è²è³èµ"],["ce80","è·è¸è¹èºè¿èž€èžèž„螆螇螉螊螌螎",4,"螔螕螖螘",6,"èž ",4,"å·å¾®å±éŸ¦è¿æ¡…围唯惟为æ½ç»´è‹‡èŽå§”伟伪尾纬未蔚味ç•èƒƒå–‚é­ä½æ¸­è°“尉慰å«ç˜Ÿæ¸©èšŠæ–‡é—»çº¹å»ç¨³ç´Šé—®å—¡ç¿ç“®æŒèœ—涡çªæˆ‘æ–¡å§æ¡æ²ƒå·«å‘œé’¨ä¹Œæ±¡è¯¬å±‹æ— èŠœæ¢§å¾å´æ¯‹æ­¦äº”æ‚åˆèˆžä¼ä¾®åžæˆŠé›¾æ™¤ç‰©å‹¿åŠ¡æ‚Ÿè¯¯æ˜”熙æžè¥¿ç¡’矽晰嘻å¸é”¡ç‰º"],["cf40","螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿èŸ",4,"蟇蟈蟉蟌",4,"蟔",6,"蟜èŸèŸžèŸŸèŸ¡èŸ¢èŸ£èŸ¤èŸ¦èŸ§èŸ¨èŸ©èŸ«èŸ¬èŸ­èŸ¯",9],["cf80","蟺蟻蟼蟽蟿蠀è è ‚è „",5,"è ‹",7,"蠔蠗蠘蠙蠚蠜",4,"蠣稀æ¯å¸Œæ‚‰è†å¤•æƒœç†„烯溪æ±çŠ€æª„袭席习媳喜铣洗系隙æˆç»†çžŽè™¾åŒ£éœžè¾–暇峡侠狭下厦å¤å“掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷é™çº¿ç›¸åŽ¢é•¶é¦™ç®±è¥„湘乡翔祥详想å“享项巷橡åƒå‘象è§ç¡éœ„削哮嚣销消宵淆晓"],["d040","è ¤",13,"è ³",5,"蠺蠻蠽蠾蠿è¡è¡‚衃衆",5,"è¡Ž",5,"衕衖衘衚",6,"衦衧衪衭衯衱衳衴衵衶衸衹衺"],["d080","衻衼袀袃袆袇袉袊袌袎è¢è¢è¢‘袓袔袕袗",4,"è¢",4,"袣袥",5,"å°å­æ ¡è‚–啸笑效楔些歇èŽéž‹å挟æºé‚ªæ–œèƒè°å†™æ¢°å¸èŸ¹æ‡ˆæ³„泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸æ性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须å¾è®¸è“„é…—å™æ—­åºç•œæ¤çµ®å©¿ç»ªç»­è½©å–§å®£æ‚¬æ—‹çŽ„"],["d140","袬袮袯袰袲",4,"袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌è£è£è£è£‘裓裖裗裚",4,"裠裡裦裧裩",6,"裲裵裶裷裺裻製裿褀è¤è¤ƒ",5],["d180","褉褋",4,"褑褔",4,"褜",4,"褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚é´è–›å­¦ç©´é›ªè¡€å‹‹ç†å¾ªæ—¬è¯¢å¯»é©¯å·¡æ®‰æ±›è®­è®¯é€Šè¿…压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹ç›ä¸¥ç ”蜒岩延言颜阎炎沿奄掩眼è¡æ¼”艳堰燕厌砚é›å”彦焰宴谚验殃央鸯秧æ¨æ‰¬ä½¯ç–¡ç¾Šæ´‹é˜³æ°§ä»°ç—’养样漾邀腰妖瑶"],["d240","褸",8,"襂襃襅",24,"襠",5,"襧",19,"襼"],["d280","襽襾覀覂覄覅覇",26,"摇尧é¥çª‘谣姚咬舀è¯è¦è€€æ¤°å™Žè€¶çˆ·é‡Žå†¶ä¹Ÿé¡µæŽ–业å¶æ›³è…‹å¤œæ¶²ä¸€å£¹åŒ»æ–铱ä¾ä¼Šè¡£é¢å¤·é—移仪胰疑沂宜姨å½æ¤…èšå€šå·²ä¹™çŸ£ä»¥è‰ºæŠ‘易邑屹亿役臆逸肄疫亦裔æ„毅忆义益溢诣议谊译异翼翌绎茵è«å› æ®·éŸ³é˜´å§»åŸé“¶æ·«å¯…饮尹引éš"],["d340","覢",30,"觃è§è§“觔觕觗觘觙觛è§è§Ÿè§ è§¡è§¢è§¤è§§è§¨è§©è§ªè§¬è§­è§®è§°è§±è§²è§´",6],["d380","觻",4,"è¨",5,"計",21,"å°è‹±æ¨±å©´é¹°åº”缨莹è¤è¥è§è‡è¿Žèµ¢ç›ˆå½±é¢–硬映哟拥佣臃痈庸é›è¸Šè›¹å’泳涌永æ¿å‹‡ç”¨å¹½ä¼˜æ‚ å¿§å°¤ç”±é‚®é“€çŠ¹æ²¹æ¸¸é…‰æœ‰å‹å³ä½‘釉诱åˆå¹¼è¿‚淤于盂榆虞愚舆余俞逾鱼愉æ¸æ¸”隅予娱雨与屿禹宇语羽玉域芋éƒåé‡å–»å³ªå¾¡æ„ˆæ¬²ç‹±è‚²èª‰"],["d440","訞",31,"訿",8,"詉",21],["d480","è©Ÿ",25,"詺",6,"浴寓裕预豫驭鸳渊冤元垣è¢åŽŸæ´è¾•å›­å‘˜åœ†çŒ¿æºç¼˜è¿œè‹‘愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨å…è¿è•´é…晕韵孕åŒç ¸æ‚栽哉ç¾å®°è½½å†åœ¨å’±æ”’暂赞赃è„葬é­ç³Ÿå‡¿è—»æž£æ—©æ¾¡èš¤èºå™ªé€ çš‚ç¶ç‡¥è´£æ‹©åˆ™æ³½è´¼æ€Žå¢žæ†Žæ›¾èµ æ‰Žå–³æ¸£æœ­è½§"],["d540","èª",7,"誋",7,"誔",46],["d580","諃",32,"铡闸眨栅榨咋ä¹ç‚¸è¯ˆæ‘˜æ–‹å®…窄债寨瞻毡詹粘沾ç›æ–©è¾—崭展蘸栈å æˆ˜ç«™æ¹›ç»½æ¨Ÿç« å½°æ¼³å¼ æŽŒæ¶¨æ–丈å¸è´¦ä»—胀瘴障招昭找沼赵照罩兆肇å¬é®æŠ˜å“²è›°è¾™è€…锗蔗这浙ç斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣çå¾ç‹°äº‰æ€”整拯正政"],["d640","諤",34,"謈",27],["d680","謤謥謧",30,"帧症郑è¯èŠæžæ”¯å±èœ˜çŸ¥è‚¢è„‚æ±ä¹‹ç»‡èŒç›´æ¤æ®–执值侄å€æŒ‡æ­¢è¶¾åªæ—¨çº¸å¿—挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终ç§è‚¿é‡ä»²ä¼—舟周州洲诌粥轴肘帚咒皱宙昼骤ç æ ªè››æœ±çŒªè¯¸è¯›é€ç«¹çƒ›ç…®æ‹„瞩嘱主著柱助蛀贮铸筑"],["d740","è­†",31,"è­§",4,"è­­",25],["d780","讇",24,"讬讱讻诇è¯è¯ªè°‰è°žä½æ³¨ç¥é©»æŠ“爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘å ç¼€è°†å‡†æ‰æ‹™å“æ¡Œç¢èŒé…Œå•„ç€ç¼æµŠå…¹å’¨èµ„姿滋淄孜紫仔籽滓å­è‡ªæ¸å­—鬃棕踪宗综总纵邹走å¥æ租足å’æ—祖诅阻组钻纂嘴醉最罪尊éµæ˜¨å·¦ä½æŸžåšä½œå座"],["d840","è°¸",8,"豂豃豄豅豈豊豋è±",7,"豖豗豘豙豛",5,"è±£",6,"豬",6,"豴豵豶豷豻",6,"貃貄貆貇"],["d880","貈貋è²",6,"貕貖貗貙",20,"äºä¸Œå…€ä¸å»¿å…丕亘丞鬲孬噩丨禺丿匕乇夭爻å®æ°å›Ÿèƒ¤é¦—毓ç¾é¼—丶亟é¼ä¹œä¹©äº“芈孛啬å˜ä»„åŽåŽåŽ£åŽ¥åŽ®é¥èµåŒšåµåŒ¦åŒ®åŒ¾èµœå¦å£åˆ‚刈刎刭刳刿剀剌剞剡剜蒯剽劂åŠåŠåŠ“冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚ä½"],["d940","è²®",62],["d980","è³­",32,"佟佗伲伽佶佴侑侉侃ä¾ä½¾ä½»ä¾ªä½¼ä¾¬ä¾”俦俨俪俅俚俣俜俑俟俸倩åŒä¿³å€¬å€å€®å€­ä¿¾å€œå€Œå€¥å€¨å¾åƒå•åˆåŽå¬å»å‚¥å‚§å‚©å‚ºåƒ–儆僭僬僦僮儇儋ä»æ°½ä½˜ä½¥ä¿Žé¾ æ±†ç±´å…®å·½é»‰é¦˜å†å¤”勹åŒè¨‡åŒå‡«å¤™å…•äº å…–亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼"],["da40","è´Ž",14,"贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸",8,"趂趃趆趇趈趉趌",4,"趒趓趕",9,"趠趡"],["da80","趢趤",12,"趲趶趷趹趻趽跀è·è·‚跅跇跈跉跊è·è·è·’跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋è¯è¯Žè¯’诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌è°è°‘谒谔谕谖谙谛谘è°è°Ÿè° è°¡è°¥è°§è°ªè°«è°®è°¯è°²è°³è°µè°¶å©åºé˜é˜¢é˜¡é˜±é˜ªé˜½é˜¼é™‚陉陔陟陧陬陲陴隈éšéš—éš°é‚—é‚›é‚邙邬邡邴邳邶邺"],["db40","跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾",6,"踆踇踈踋è¸è¸Žè¸è¸‘踒踓踕",7,"踠踡踤",4,"踫踭踰踲踳踴踶踷踸踻踼踾"],["db80","踿蹃蹅蹆蹌",4,"蹓",5,"蹚",11,"蹧蹨蹪蹫蹮蹱邸邰éƒéƒ…邾éƒéƒ„郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆åˆå¥‚劢劬劭劾哿å‹å‹–å‹°åŸç‡®çŸå»´å‡µå‡¼é¬¯åŽ¶å¼ç•šå·¯åŒåž©åž¡å¡¾å¢¼å£…壑圩圬圪圳圹圮圯åœåœ»å‚å©åž…å«åž†å¼å»å¨å­å¶å³åž­åž¤åžŒåž²åŸåž§åž´åž“垠埕埘埚埙埒垸埴埯埸埤åŸ"],["dc40","蹳蹵蹷",4,"蹽蹾躀躂躃躄躆躈",6,"躑躒躓躕",6,"èºèºŸ",11,"躭躮躰躱躳",6,"躻",7],["dc80","軃",10,"è»",21,"å ‹å åŸ½åŸ­å €å žå ™å¡„堠塥塬å¢å¢‰å¢šå¢€é¦¨é¼™æ‡¿è‰¹è‰½è‰¿èŠèŠŠèŠ¨èŠ„芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌è‹èŠ©èŠ´èŠ¡èŠªèŠŸè‹„苎芤苡茉苷苤èŒèŒ‡è‹œè‹´è‹’苘茌苻苓茑茚茆茔茕苠苕茜è‘è›èœèŒˆèŽ’茼茴茱莛èžèŒ¯èè‡èƒèŸè€èŒ—è èŒ­èŒºèŒ³è¦è¥"],["dd40","軥",62],["dd80","輤",32,"è¨èŒ›è©è¬èªè­è®èŽ°è¸èŽ³èŽ´èŽ èŽªèŽ“莜莅è¼èŽ¶èŽ©è½èŽ¸è»èŽ˜èŽžèŽ¨èŽºèŽ¼èèè¥è˜å ‡è˜è‹èè½è–èœè¸è‘è†è”èŸèèƒè¸è¹èªè…è€è¦è°è¡è‘œè‘‘葚葙葳蒇蒈葺蒉葸è¼è‘†è‘©è‘¶è’Œè’Žè±è‘­è“è“è“蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌ç”蔸蓰蔹蔟蔺"],["de40","è½…",32,"轪辀辌辒è¾è¾ è¾¡è¾¢è¾¤è¾¥è¾¦è¾§è¾ªè¾¬è¾­è¾®è¾¯è¾²è¾³è¾´è¾µè¾·è¾¸è¾ºè¾»è¾¼è¾¿è¿€è¿ƒè¿†"],["de80","迉",4,"è¿è¿’迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇è–蕹薮薜薅薹薷薰藓è—藜藿蘧蘅蘩蘖蘼廾弈夼å¥è€·å¥•å¥šå¥˜åŒå°¢å°¥å°¬å°´æ‰Œæ‰ªæŠŸæŠ»æ‹Šæ‹šæ‹—拮挢拶挹æ‹æƒæŽ­æ¶æ±æºæŽŽæŽ´æ­æŽ¬æŽŠæ©æŽ®æŽ¼æ²æ¸æ æ¿æ„æžæŽæ‘’æ†æŽ¾æ‘…æ‘æ‹æ›æ æŒæ¦æ¡æ‘žæ’„æ‘­æ’–"],["df40","這逜連逤逥逧",5,"逰",4,"逷逹逺逽逿é€éƒé…é†éˆ",4,"éŽé”é•é–é™éšéœ",5,"é¤é¦é§é©éªé«é¬é¯",4,"é¶",6,"é¾é‚"],["df80","還邅邆邇邉邊邌",4,"邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀æ“擗擤擢攉攥攮弋忒甙弑åŸå±å½å©å¨å»å’å–å†å‘‹å‘’呓呔呖呃å¡å‘—å‘™å£å²å’‚咔呷呱呤咚咛咄呶呦å’å“咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤å“å“哞唛哧唠哽唔哳唢唣å”唑唧唪啧å–喵啉啭å•å••å”¿å•å”¼"],["e040","郂郃郆郈郉郋郌éƒéƒ’郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀é„鄃鄅",19,"鄚鄛鄜"],["e080","é„鄟鄠鄡鄤",10,"鄰鄲",6,"鄺",8,"酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈å–喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦å—嗄嗯嗥嗲嗳嗌å—嗨嗵嗤辔嘞嘈嘌å˜å˜¤å˜£å—¾å˜€å˜§å˜­å™˜å˜¹å™—嘬å™å™¢å™™å™œå™Œå™”嚆噤噱噫噻噼嚅嚓嚯囔囗å›å›¡å›µå›«å›¹å›¿åœ„圊圉圜å¸å¸™å¸”帑帱帻帼"],["e140","酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀",4,"醆醈醊醎é†é†“",6,"醜",5,"醤",5,"醫醬醰醱醲醳醶醷醸醹醻"],["e180","醼",10,"釈釋é‡é‡’",9,"é‡",8,"帷幄幔幛幞幡岌屺å²å²å²–岈岘岙岑岚岜岵岢岽岬岫岱岣å³å²·å³„峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯åµåµ«åµ‹åµŠåµ©åµ´å¶‚嶙å¶è±³å¶·å·…彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃ç‹ç‹Žç‹ç‹’狨狯狩狲狴狷çŒç‹³çŒƒç‹º"],["e240","釦",62],["e280","鈥",32,"狻猗猓猡猊猞çŒçŒ•çŒ¢çŒ¹çŒ¥çŒ¬çŒ¸çŒ±ççç—ç ç¬ç¯ç¾èˆ›å¤¥é£§å¤¤å¤‚饣饧",5,"饴饷饽馀馄馇馊é¦é¦é¦‘馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖å¿æ€ƒå¿®æ€„忡忤忾怅怆忪忭忸怙怵怦怛æ€æ€æ€©æ€«æ€Šæ€¿æ€¡æ¸æ¹æ»æºæ‚"],["e340","鉆",45,"鉵",16],["e380","銆",7,"éŠ",24,"æªæ½æ‚–æ‚šæ‚­æ‚悃悒悌悛惬悻悱æƒæƒ˜æƒ†æƒšæ‚´æ„ æ„¦æ„•æ„£æƒ´æ„€æ„Žæ„«æ…Šæ…µæ†¬æ†”憧憷懔懵å¿éš³é—©é—«é—±é—³é—µé—¶é—¼é—¾é˜ƒé˜„阆阈阊阋阌é˜é˜é˜’阕阖阗阙阚丬爿戕氵汔汜汊沣沅æ²æ²”沌汨汩汴汶沆沩æ³æ³”沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾"],["e440","銨",5,"銯",24,"鋉",31],["e480","é‹©",32,"洹洧洌浃浈洇洄洙洎洫æµæ´®æ´µæ´šæµæµ’浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦æ·æ·™æ¸–涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴æ»æºæ»‚溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉æ¾æ¾Œæ½¸æ½²æ½¼æ½ºæ¿‘"],["e540","錊",51,"錿",10],["e580","éŠ",31,"é«æ¿‰æ¾§æ¾¹æ¾¶æ¿‚濡濮濞濠濯瀚瀣瀛瀹瀵ççžå®€å®„宕宓宥宸甯骞æ´å¯¤å¯®è¤°å¯°è¹‡è¬‡è¾¶è¿“迕迥迮迤迩迦迳迨逅逄逋逦逑é€é€–逡逵逶逭逯é„é‘é’éé¨é˜é¢é›æš¹é´é½é‚‚邈邃邋å½å½—彖彘尻咫å±å±™å­±å±£å±¦ç¾¼å¼ªå¼©å¼­è‰´å¼¼é¬»å±®å¦å¦ƒå¦å¦©å¦ªå¦£"],["e640","é¬",34,"éŽ",27],["e680","鎬",29,"é‹éŒé妗姊妫妞妤姒妲妯姗妾娅娆å§å¨ˆå§£å§˜å§¹å¨Œå¨‰å¨²å¨´å¨‘娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀éªéª…骈骊éªéª’骓骖骘骛骜éªéªŸéª éª¢éª£éª¥éª§çºŸçº¡çº£çº¥çº¨çº©"],["e740","éŽ",7,"é—",54],["e780","éŽ",32,"纭纰纾绀ç»ç»‚绉绋绌ç»ç»”绗绛绠绡绨绫绮绯绱绲ç¼ç»¶ç»ºç»»ç»¾ç¼ç¼‚缃缇缈缋缌ç¼ç¼‘缒缗缙缜缛缟缡",6,"缪缫缬缭缯",4,"缵幺畿巛甾邕玎玑玮玢玟çç‚ç‘玷玳ç€ç‰çˆç¥ç™é¡¼çŠç©ç§çžçŽºç²ççªç‘›ç¦ç¥ç¨ç°ç®ç¬"],["e840","é¯",14,"é¿",43,"鑬鑭鑮鑯"],["e880","é‘°",20,"钑钖钘铇é“铓铔铚铦铻锜锠ç›çšç‘瑜瑗瑕瑙瑷瑭瑾璜璎璀ç’璇璋璞璨璩ç’璧瓒璺韪韫韬æŒæ“æžæˆæ©æž¥æž‡æªæ³æž˜æž§æµæž¨æžžæž­æž‹æ·æ¼æŸ°æ ‰æŸ˜æ ŠæŸ©æž°æ ŒæŸ™æžµæŸšæž³æŸæ €æŸƒæž¸æŸ¢æ ŽæŸæŸ½æ ²æ ³æ¡ æ¡¡æ¡Žæ¡¢æ¡„桤梃æ æ¡•æ¡¦æ¡æ¡§æ¡€æ ¾æ¡Šæ¡‰æ ©æ¢µæ¢æ¡´æ¡·æ¢“桫棂楮棼椟椠棹"],["e940","锧锳锽镃镈镋镕镚镠镮镴镵長",7,"é–€",42],["e980","é–«",32,"椤棰椋æ¤æ¥—棣æ¤æ¥±æ¤¹æ¥ æ¥‚æ¥æ¦„楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱æ§æ§Šæ§Ÿæ¦•æ§ æ¦æ§¿æ¨¯æ§­æ¨—樘橥槲橄樾檠æ©æ©›æ¨µæªŽæ©¹æ¨½æ¨¨æ©˜æ©¼æª‘æªæª©æª—檫猷ç’æ®æ®‚殇殄殒殓æ®æ®šæ®›æ®¡æ®ªè½«è½­è½±è½²è½³è½µè½¶è½¸è½·è½¹è½ºè½¼è½¾è¾è¾‚辄辇辋"],["ea40","é—Œ",27,"闬闿阇阓阘阛阞阠阣",6,"阫阬阭阯阰阷阸阹阺阾é™é™ƒé™Šé™Žé™é™‘陒陓陖陗"],["ea80","陘陙陚陜é™é™žé™ é™£é™¥é™¦é™«é™­",4,"陳陸",12,"隇隉隊è¾è¾Žè¾è¾˜è¾šè»Žæˆ‹æˆ—戛戟戢戡戥戤戬臧瓯瓴瓿ç”甑甓攴旮旯旰昊昙æ²æ˜ƒæ˜•æ˜€ç‚…æ›·æ˜æ˜´æ˜±æ˜¶æ˜µè€†æ™Ÿæ™”æ™æ™æ™–晡晗晷暄暌暧æšæš¾æ››æ›œæ›¦æ›©è´²è´³è´¶è´»è´½èµ€èµ…赆赈赉赇èµèµ•èµ™è§‡è§Šè§‹è§Œè§Žè§è§è§‘牮犟ç‰ç‰¦ç‰¯ç‰¾ç‰¿çŠ„犋çŠçŠçŠ’挈挲掰"],["eb40","隌階隑隒隓隕隖隚際éš",9,"隨",7,"隱隲隴隵隷隸隺隻隿雂雃雈雊雋é›é›‘雓雔雖",9,"雡",6,"雫"],["eb80","雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌éœéœ‘霒霔霕霗",4,"éœéœŸéœ æ¿æ“˜è€„毪毳毽毵毹氅氇氆æ°æ°•æ°˜æ°™æ°šæ°¡æ°©æ°¤æ°ªæ°²æ”µæ••æ•«ç‰ç‰’牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙èƒèƒ—æœèƒèƒ«èƒ±èƒ´èƒ­è„脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧å¡åªµè†ˆè†‚膑滕膣膪臌朦臊膻"],["ec40","霡",8,"霫霬霮霯霱霳",4,"霺霻霼霽霿",18,"é”é•é—é˜éšéœééŸé£é¤é¦é§é¨éª",7],["ec80","é²éµé·",4,"é½",7,"鞆",4,"鞌鞎éžéžéž“éž•éž–éž—éž™",4,"è‡è†¦æ¬¤æ¬·æ¬¹æ­ƒæ­†æ­™é£‘飒飓飕飙飚殳彀毂觳æ–齑斓於旆旄旃旌旎旒旖炀炜炖ç‚炻烀炷炫炱烨烊ç„焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹çˆçˆ¨ç¬ç„˜ç…¦ç†¹æˆ¾æˆ½æ‰ƒæ‰ˆæ‰‰ç¤»ç¥€ç¥†ç¥‰ç¥›ç¥œç¥“祚祢祗祠祯祧祺禅禊禚禧禳忑å¿"],["ed40","鞞鞟鞡鞢鞤",6,"鞬鞮鞰鞱鞳鞵",46],["ed80","韤韥韨韮",4,"韴韷",23,"怼ææšæ§ææ™æ£æ‚«æ„†æ„æ…憩æ†æ‡‹æ‡‘戆肀è¿æ²“泶淼矶矸砀砉砗砘砑斫砭砜ç ç ¹ç ºç »ç Ÿç ¼ç ¥ç ¬ç £ç ©ç¡Žç¡­ç¡–ç¡—ç ¦ç¡ç¡‡ç¡Œç¡ªç¢›ç¢“碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄çœç›¹çœ‡çœˆçœšçœ¢çœ™çœ­çœ¦çœµçœ¸çç‘ç‡çƒçšç¨"],["ee40","é ",62],["ee80","é¡Ž",32,"ç¢ç¥ç¿çžç½çž€çžŒçž‘瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹ç¾ç½¾ç›ç›¥è ²é’…钆钇钋钊钌é’é’é’钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶",4,"钼钽钿铄铈",6,"é“铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪"],["ef40","顯",5,"颋颎颒颕颙颣風",37,"é£é£é£”飖飗飛飜é£é£ ",4],["ef80","飥飦飩",30,"铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊é”锎é”é”’",4,"锘锛é”锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎é•é•’镓镔镖镗镘镙镛镞镟é•é•¡é•¢é•¤",8,"镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔"],["f040","餈",4,"餎é¤é¤‘",28,"餯",26],["f080","饊",9,"饖",12,"饤饦饳饸饹饻饾馂馃馉稹稷穑é»é¦¥ç©°çšˆçšŽçš“皙皤瓞瓠甬鸠鸢鸨",4,"鸲鸱鸶鸸鸷鸹鸺鸾é¹é¹‚鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦",6,"鹱鹭鹳疒疔疖疠ç–疬疣疳疴疸痄疱疰痃痂痖ç—痣痨痦痤痫痧瘃痱痼痿ç˜ç˜€ç˜…瘌瘗瘊瘥瘘瘕瘙"],["f140","馌馎馚",10,"馦馧馩",47],["f180","駙",32,"瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳ç™ç™žç™”癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶è¥è¥¦è¥»ç–‹èƒ¥çš²çš´çŸœè€’耔耖耜耠耢耥耦耧耩耨耱耋耵èƒè†èè’è©è±è¦ƒé¡¸é¢€é¢ƒ"],["f240","駺",62],["f280","騹",32,"颉颌é¢é¢é¢”颚颛颞颟颡颢颥颦è™è™”虬虮虿虺虼虻蚨èšèš‹èš¬èšèš§èš£èšªèš“蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉è›èš´è›©è›±è›²è›­è›³è›èœ“蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊èœèœ‰èœ£èœ»èœžèœ¥èœ®èœšèœ¾èˆèœ´èœ±èœ©èœ·èœ¿èž‚蜢è½è¾è»è è°èŒè®èž‹è“è£è¼è¤è™è¥èž“螯螨蟒"],["f340","é©š",17,"驲骃骉éªéªŽéª”骕骙骦骩",6,"骲骳骴骵骹骻骽骾骿髃髄髆",4,"é«é«Žé«é«é«’體髕髖髗髙髚髛髜"],["f380","é«é«žé« é«¢é«£é«¤é«¥é«§é«¨é«©é«ªé«¬é«®é«°",8,"髺髼",6,"鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅èˆç«ºç«½ç¬ˆç¬ƒç¬„笕笊笫ç¬ç­‡ç¬¸ç¬ªç¬™ç¬®ç¬±ç¬ ç¬¥ç¬¤ç¬³ç¬¾ç¬žç­˜ç­šç­…筵筌ç­ç­ ç­®ç­»ç­¢ç­²ç­±ç®ç®¦ç®§ç®¸ç®¬ç®ç®¨ç®…箪箜箢箫箴篑ç¯ç¯Œç¯ç¯šç¯¥ç¯¦ç¯ªç°Œç¯¾ç¯¼ç°ç°–ç°‹"],["f440","鬇鬉",5,"é¬é¬‘鬒鬔",10,"鬠鬡鬢鬤",10,"鬰鬱鬳",7,"鬽鬾鬿魀魆魊魋魌魎é­é­’é­“é­•",5],["f480","é­›",32,"簟簪簦簸ç±ç±€è‡¾èˆèˆ‚舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋è‰è‰šè‰Ÿè‰¨è¡¾è¢…袈裘裟襞ç¾ç¾Ÿç¾§ç¾¯ç¾°ç¾²ç±¼æ•‰ç²‘ç²ç²œç²žç²¢ç²²ç²¼ç²½ç³ç³‡ç³Œç³ç³ˆç³…糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊é…é…Žé…é…¤"],["f540","é­¼",62],["f580","é®»",32,"酢酡酰酩酯酽酾酲酴酹醌醅é†é†é†‘醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎è·è·›è·†è·¬è··è·¸è·£è·¹è·»è·¤è¸‰è·½è¸”è¸è¸Ÿè¸¬è¸®è¸£è¸¯è¸ºè¹€è¸¹è¸µè¸½è¸±è¹‰è¹è¹‚蹑蹒蹊蹰蹶蹼蹯蹴躅èºèº”èºèºœèºžè±¸è²‚貊貅貘貔斛觖觞觚觜"],["f640","鯜",62],["f680","é°›",32,"觥觫觯訾謦é“雩雳雯霆éœéœˆéœéœŽéœªéœ­éœ°éœ¾é¾€é¾ƒé¾…",5,"龌黾鼋é¼éš¹éš¼éš½é›Žé›’瞿雠銎銮鋈錾éªéŠéŽé¾é‘«é±¿é²‚鲅鲆鲇鲈稣鲋鲎é²é²‘鲒鲔鲕鲚鲛鲞",5,"é²¥",4,"鲫鲭鲮鲰",7,"鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋"],["f740","é°¼",62],["f780","鱻鱽鱾鲀鲃鲄鲉鲊鲌é²é²“鲖鲗鲘鲙é²é²ªé²¬é²¯é²¹é²¾",4,"鳈鳉鳑鳒鳚鳛鳠鳡鳌",4,"鳓鳔鳕鳗鳘鳙鳜é³é³Ÿé³¢é¼éž…鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼é«é«€é«…髂髋髌髑魅魃魇魉魈é­é­‘飨é¤é¤®é¥•é¥”髟髡髦髯髫髻髭髹鬈é¬é¬“鬟鬣麽麾縻麂麇麈麋麒é–éºéºŸé»›é»œé»é» é»Ÿé»¢é»©é»§é»¥é»ªé»¯é¼¢é¼¬é¼¯é¼¹é¼·é¼½é¼¾é½„"],["f840","é³£",62],["f880","é´¢",32],["f940","鵃",62],["f980","鶂",32],["fa40","鶣",62],["fa80","é·¢",32],["fb40","鸃",27,"鸤鸧鸮鸰鸴鸻鸼鹀é¹é¹é¹’鹓鹔鹖鹙é¹é¹Ÿé¹ é¹¡é¹¢é¹¥é¹®é¹¯é¹²é¹´",9,"麀"],["fb80","éºéºƒéº„麅麆麉麊麌",5,"麔",8,"麞麠",5,"麧麨麩麪"],["fc40","麫",8,"麵麶麷麹麺麼麿",4,"黅黆黇黈黊黋黌é»é»’黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰",8,"黺黽黿",6],["fc80","鼆",4,"鼌é¼é¼‘鼒鼔鼕鼖鼘鼚",5,"鼡鼣",8,"鼭鼮鼰鼱"],["fd40","é¼²",4,"鼸鼺鼼鼿",4,"é½…",10,"é½’",38],["fd80","é½¹",5,"é¾é¾‚é¾",11,"龜é¾é¾žé¾¡",4,"郎凉秊裏隣"],["fe40","兀ï¨ï¨Žï¨ï¨‘﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩"]]')},39192:e=>{"use strict";e.exports=JSON.parse('[["0","\\u0000",127],["8141","갂갃갅갆갋",4,"갘갞갟갡갢갣갥",6,"갮갲갳갴"],["8161","갵갶갷갺갻갽갾갿ê±",9,"걌걎",5,"걕"],["8181","걖걗걙걚걛ê±",18,"걲걳걵걶걹걻",4,"겂겇겈ê²ê²Žê²ê²‘겒겓겕",6,"겞겢",5,"겫겭겮겱",6,"겺겾겿곀곂곃곅곆곇곉곊곋ê³",7,"곖곘",7,"곢곣곥곦곩곫곭곮곲곴곷",4,"곾곿ê´ê´‚괃괅괇",4,"ê´Žê´ê´’ê´“"],["8241","괔괕괖괗괙괚괛ê´ê´žê´Ÿê´¡",7,"괪괫괮",5],["8261","괶괷괹괺괻괽",6,"굆굈굊",5,"굑굒굓굕굖굗"],["8281","êµ™",7,"굢굤",7,"굮굯굱굲굷굸굹굺굾궀궃",4,"궊궋ê¶ê¶Žê¶ê¶‘",10,"궞",5,"궥",17,"궸",7,"귂귃귅귆귇귉",6,"ê·’ê·”",7,"ê·ê·žê·Ÿê·¡ê·¢ê·£ê·¥",18],["8341","귺귻귽귾긂",5,"긊긌긎",5,"긕",7],["8361","ê¸",18,"긲긳긵긶긹긻긼"],["8381","긽긾긿깂깄깇깈깉깋ê¹ê¹‘깒깓깕깗",4,"깞깢깣깤깦깧깪깫깭깮깯깱",6,"깺깾",5,"꺆",5,"êº",46,"꺿ê»ê»‚껃껅",6,"껎껒",5,"껚껛ê»",8],["8441","껦껧껩껪껬껮",5,"껵껶껷껹껺껻껽",8],["8461","꼆꼉꼊꼋꼌꼎ê¼ê¼‘",18],["8481","꼤",7,"꼮꼯꼱꼳꼵",6,"꼾꽀꽄꽅꽆꽇꽊",5,"꽑",10,"꽞",5,"꽦",18,"꽺",5,"ê¾ê¾‚꾃꾅꾆꾇꾉",6,"꾒꾓꾔꾖",5,"ê¾",26,"꾺꾻꾽꾾"],["8541","꾿ê¿",5,"ê¿Šê¿Œê¿",4,"ê¿•",6,"ê¿",4],["8561","ê¿¢",5,"꿪",5,"꿲꿳꿵꿶꿷꿹",6,"뀂뀃"],["8581","뀅",6,"ë€ë€Žë€ë€‘뀒뀓뀕",6,"뀞",9,"뀩",26,"ë†ë‡ë‰ë‹ëëëë‘ë’ë–ë˜ëšë›ëœëž",29,"ë¾ë¿ë‚낂낃낅",6,"ë‚Žë‚ë‚’",5,"ë‚›ë‚낞낣낤"],["8641","낥낦낧낪낰낲낶낷낹낺낻낽",6,"냆냊",5,"냒"],["8661","냓냕냖냗냙",6,"냡냢냣냤냦",10],["8681","냱",22,"ë„Šë„ë„Žë„넑넔넕넖넗넚넞",4,"넦넧넩넪넫넭",6,"넶넺",5,"녂녃녅녆녇녉",6,"녒녓녖녗녙녚녛ë…ë…žë…Ÿë…¡",22,"녺녻녽녾녿ë†ë†ƒ",4,"놊놌놎ë†ë†ë†‘놕놖놗놙놚놛ë†"],["8741","놞",9,"놩",15],["8761","놹",18,"ë‡ë‡Žë‡ë‡‘뇒뇓뇕"],["8781","뇖",5,"뇞뇠",7,"뇪뇫뇭뇮뇯뇱",7,"뇺뇼뇾",5,"눆눇눉눊ëˆ",6,"눖눘눚",5,"눡",18,"눵",6,"눽",26,"뉙뉚뉛ë‰ë‰žë‰Ÿë‰¡",6,"뉪",4],["8841","뉯",4,"뉶",5,"뉽",6,"늆늇늈늊",4],["8861","ëŠëŠ’늓늕늖늗늛",4,"늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷"],["8881","늸",15,"ë‹Šë‹‹ë‹ë‹Žë‹ë‹‘ë‹“",4,"닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉",6,"댒댖",5,"ëŒ",54,"ë—ë™ëšëë ë¡ë¢ë£"],["8941","ë¦ë¨ëªë¬ë­ë¯ë²ë³ëµë¶ë·ë¹",6,"뎂뎆",5,"ëŽ"],["8961","뎎ëŽëŽ‘뎒뎓뎕",10,"뎢",5,"뎩뎪뎫뎭"],["8981","뎮",21,"ë†ë‡ë‰ëŠëëë‘ë’ë“ë–ë˜ëšëœëžëŸë¡ë¢ë£ë¥ë¦ë§ë©",18,"ë½",18,"ë‘",6,"ë™ëšë›ëëžëŸë¡",6,"ëªë¬",7,"ëµ",15],["8a41","ë‘…",10,"ë‘’ë‘“ë‘•ë‘–ë‘—ë‘™",6,"둢둤둦"],["8a61","둧",4,"ë‘­",18,"ë’ë’‚"],["8a81","ë’ƒ",4,"ë’‰",19,"ë’ž",5,"뒥뒦뒧뒩뒪뒫뒭",7,"뒶뒸뒺",5,"ë“듂듃듅듆듇듉",6,"듑듒듓듔듖",5,"듞듟듡듢듥듧",4,"듮듰듲",5,"듹",26,"딖딗딙딚ë”"],["8b41","딞",5,"딦딫",4,"딲딳딵딶딷딹",6,"땂땆"],["8b61","땇땈땉땊땎ë•ë•‘ë•’ë•“ë••",6,"ë•žë•¢",8],["8b81","ë•«",52,"떢떣떥떦떧떩떬떭떮떯떲떶",4,"떾떿ë—뗂뗃뗅",6,"ë—Žë—’",5,"ë—™",18,"ë—­",18],["8c41","똀",15,"똒똓똕똖똗똙",4],["8c61","똞",6,"똦",5,"똭",6,"똵",5],["8c81","똻",12,"뙉",26,"뙥뙦뙧뙩",50,"뚞뚟뚡뚢뚣뚥",5,"뚭뚮뚯뚰뚲",16],["8d41","뛃",16,"뛕",8],["8d61","뛞",17,"뛱뛲뛳뛵뛶뛷뛹뛺"],["8d81","ë›»",4,"뜂뜃뜄뜆",33,"뜪뜫뜭뜮뜱",6,"뜺뜼",7,"ë…ë†ë‡ë‰ëŠë‹ë",6,"ë–",9,"ë¡ë¢ë£ë¥ë¦ë§ë©",6,"ë²ë´ë¶",5,"ë¾ë¿ëžëž‚랃랅",6,"랎랓랔랕랚랛ëžëžž"],["8e41","랟랡",6,"랪랮",5,"랶랷랹",8],["8e61","럂",4,"럈럊",19],["8e81","럞",13,"럮럯럱럲럳럵",6,"럾렂",4,"ë Šë ‹ë ë Žë ë ‘",6,"렚렜렞",5,"렦렧렩렪렫렭",6,"렶렺",5,"ë¡ë¡‚롃롅",11,"ë¡’ë¡”",7,"롞롟롡롢롣롥",6,"롮롰롲",5,"롹롺롻롽",7],["8f41","뢅",7,"뢎",17],["8f61","뢠",7,"뢩",6,"뢱뢲뢳뢵뢶뢷뢹",4],["8f81","뢾뢿룂룄룆",5,"ë£ë£Žë£ë£‘룒룓룕",7,"룞룠룢",5,"룪룫룭룮룯룱",6,"룺룼룾",5,"뤅",18,"뤙",6,"뤡",26,"뤾뤿ë¥ë¥‚륃륅",6,"ë¥ë¥Žë¥ë¥’",5],["9041","륚륛ë¥ë¥žë¥Ÿë¥¡",6,"륪륬륮",5,"륶륷륹륺륻륽"],["9061","륾",5,"릆릈릋릌ë¦",15],["9081","릟",12,"릮릯릱릲릳릵",6,"릾맀맂",5,"맊맋ë§ë§“",4,"맚맜맟맠맢맦맧맩맪맫맭",6,"맶맻",4,"먂",5,"먉",11,"먖",33,"먺먻먽먾먿ë©ë©ƒë©„멅멆"],["9141","멇멊멌ë©ë©ë©‘멒멖멗멙멚멛ë©",6,"멦멪",5],["9161","멲멳멵멶멷멹",9,"몆몈몉몊몋ëª",5],["9181","몓",20,"몪몭몮몯몱몳",4,"몺몼몾",5,"뫅뫆뫇뫉",14,"ë«š",33,"뫽뫾뫿ë¬ë¬‚묃묅",7,"묎ë¬ë¬’",5,"묙묚묛ë¬ë¬žë¬Ÿë¬¡",6],["9241","묨묪묬",7,"묷묹묺묿",4,"뭆뭈뭊뭋뭌뭎뭑뭒"],["9261","ë­“ë­•ë­–ë­—ë­™",7,"뭢뭤",7,"ë­­",4],["9281","ë­²",21,"뮉뮊뮋ë®ë®Žë®ë®‘",18,"뮥뮦뮧뮩뮪뮫뮭",6,"뮵뮶뮸",7,"ë¯ë¯‚믃믅믆믇믉",6,"믑믒믔",35,"믺믻믽믾ë°"],["9341","ë°ƒ",4,"ë°Šë°Žë°ë°’밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵"],["9361","밶밷밹",6,"뱂뱆뱇뱈뱊뱋뱎ë±ë±‘",8],["9381","뱚뱛뱜뱞",37,"벆벇벉벊ë²ë²",4,"벖벘벛",4,"벢벣벥벦벩",6,"벲벶",5,"벾벿ë³ë³‚볃볅",7,"볎볒볓볔볖볗볙볚볛ë³",22,"볷볹볺볻볽"],["9441","ë³¾",5,"봆봈봊",5,"ë´‘ë´’ë´“ë´•",8],["9461","ë´ž",5,"ë´¥",6,"ë´­",12],["9481","ë´º",5,"ëµ",6,"뵊뵋ëµëµŽëµëµ‘",6,"뵚",9,"뵥뵦뵧뵩",22,"붂붃붅붆붋",4,"붒붔붖붗붘붛ë¶",6,"붥",10,"붱",6,"붹",24],["9541","뷒뷓뷖뷗뷙뷚뷛ë·",11,"ë·ª",5,"ë·±"],["9561","뷲뷳뷵뷶뷷뷹",6,"ë¸ë¸‚븄븆",5,"븎ë¸ë¸‘븒븓"],["9581","븕",6,"븞븠",35,"빆빇빉빊빋ë¹ë¹",4,"빖빘빜ë¹ë¹žë¹Ÿë¹¢ë¹£ë¹¥ë¹¦ë¹§ë¹©ë¹«",4,"빲빶",4,"빾빿ëºëº‚뺃뺅",6,"뺎뺒",5,"뺚",13,"뺩",14],["9641","뺸",23,"뻒뻓"],["9661","뻕뻖뻙",6,"뻡뻢뻦",5,"ë»­",8],["9681","뻶",10,"뼂",5,"뼊",13,"뼚뼞",33,"뽂뽃뽅뽆뽇뽉",6,"뽒뽓뽔뽖",44],["9741","뾃",16,"뾕",8],["9761","뾞",17,"ë¾±",7],["9781","ë¾¹",11,"뿆",5,"ë¿Žë¿ë¿‘ë¿’ë¿“ë¿•",6,"ë¿ë¿žë¿ ë¿¢",89,"쀽쀾쀿"],["9841","ì€",16,"ì’",5,"ì™ìšì›"],["9861","ììžìŸì¡",6,"ìª",15],["9881","ìº",21,"ì‚’ì‚“ì‚•ì‚–ì‚—ì‚™",6,"삢삤삦",5,"삮삱삲삷",4,"삾샂샃샄샆샇샊샋ìƒìƒŽìƒìƒ‘",6,"샚샞",5,"샦샧샩샪샫샭",6,"샶샸샺",5,"ì„섂섃섅섆섇섉",6,"섑섒섓섔섖",5,"섡섢섥섨섩섪섫섮"],["9941","섲섳섴섵섷섺섻섽섾섿ì…",6,"ì…Šì…Ž",5,"ì…–ì…—"],["9961","셙셚셛ì…",6,"셦셪",5,"셱셲셳셵셶셷셹셺셻"],["9981","ì…¼",8,"솆",5,"ì†ì†‘솒솓솕솗",4,"솞솠솢솣솤솦솧솪솫솭솮솯솱",11,"솾",5,"쇅쇆쇇쇉쇊쇋ì‡",6,"쇕쇖쇙",6,"쇡쇢쇣쇥쇦쇧쇩",6,"쇲쇴",7,"쇾쇿ìˆìˆ‚숃숅",6,"숎ìˆìˆ’",5,"숚숛ìˆìˆžìˆ¡ìˆ¢ìˆ£"],["9a41","숤숥숦숧숪숬숮숰숳숵",16],["9a61","쉆쉇쉉",6,"쉒쉓쉕쉖쉗쉙",6,"쉡쉢쉣쉤쉦"],["9a81","쉧",4,"쉮쉯쉱쉲쉳쉵",6,"쉾슀슂",5,"슊",5,"슑",6,"슙슚슜슞",5,"슦슧슩슪슫슮",5,"슶슸슺",33,"싞싟싡싢싥",5,"싮싰싲싳싴싵싷싺싽싾싿ìŒ",6,"쌊쌋쌎ìŒ"],["9b41","ìŒìŒ‘쌒쌖쌗쌙쌚쌛ìŒ",6,"쌦쌧쌪",8],["9b61","쌳",17,"ì†",7],["9b81","ìŽ",25,"ìªì«ì­ì®ì¯ì±ì³",4,"ìºì»ì¾",5,"쎅쎆쎇쎉쎊쎋ìŽ",50,"ì",22,"ìš"],["9c41","ì›ììžì¡ì£",4,"ìªì«ì¬ì®",5,"ì¶ì·ì¹",5],["9c61","ì¿",8,"ì‰",6,"ì‘",9],["9c81","ì›",8,"ì¥",6,"ì­ì®ì¯ì±ì²ì³ìµ",6,"ì¾",9,"쑉",26,"쑦쑧쑩쑪쑫쑭",6,"쑶쑷쑸쑺",5,"ì’",18,"ì’•",6,"ì’",12],["9d41","ì’ª",13,"쒹쒺쒻쒽",8],["9d61","쓆",25],["9d81","ì“ ",8,"쓪",5,"쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂",9,"ì”씎ì”씑씒씓씕",6,"ì”",10,"씪씫씭씮씯씱",6,"씺씼씾",5,"앆앇앋ì•ì•ì•‘앒앖앚앛앜앟앢앣앥앦앧앩",6,"앲앶",5,"앾앿ì–얂얃얅얆얈얉얊얋얎ì–ì–’ì–“ì–”"],["9e41","얖얙얚얛ì–ì–žì–Ÿì–¡",7,"ì–ª",9,"ì–¶"],["9e61","얷얺얿",4,"ì—‹ì—ì—ì—’ì—“ì—•ì—–ì——ì—™",6,"엢엤엦엧"],["9e81","엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋ì˜ì˜Žì˜ì˜‘",6,"옚ì˜",6,"옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉",6,"ì™’ì™–",5,"왞왟왡",10,"왭왮왰왲",5,"왺왻왽왾왿ìš",6,"욊욌욎",5,"욖욗욙욚욛ìš",6,"욦"],["9f41","욨욪",5,"욲욳욵욶욷욻",4,"웂웄웆",5,"웎"],["9f61","ì›ì›‘웒웓웕",6,"웞웟웢",5,"웪웫웭웮웯웱웲"],["9f81","웳",4,"웺웻웼웾",5,"윆윇윉윊윋ìœ",6,"윖윘윚",5,"윢윣윥윦윧윩",6,"윲윴윶윸윹윺윻윾윿ìì‚ìƒì…",4,"ì‹ìŽìì™ìšì›ììžìŸì¡",6,"ì©ìªì¬",7,"ì¶ì·ì¹ìºì»ì¿ìž€ìžìž‚잆잋잌ìžìžìž’잓잕잙잛",4,"잢잧",4,"잮잯잱잲잳잵잶잷"],["a041","잸잹잺잻잾쟂",5,"쟊쟋ìŸìŸìŸ‘",6,"쟙쟚쟛쟜"],["a061","쟞",5,"쟥쟦쟧쟩쟪쟫쟭",13],["a081","쟻",4,"젂젃젅젆젇젉젋",4,"젒젔젗",4,"젞젟젡젢젣젥",6,"젮젰젲",5,"젹젺젻젽젾젿ì¡",6,"ì¡Šì¡‹ì¡Ž",5,"ì¡•",26,"졲졳졵졶졷졹졻",4,"좂좄좈좉좊좎",5,"좕",7,"좞좠좢좣좤"],["a141","좥좦좧좩",18,"좾좿죀ì£"],["a161","죂죃죅죆죇죉죊죋ì£",6,"죖죘죚",5,"죢죣죥"],["a181","죦",14,"죶",5,"죾죿ì¤ì¤‚줃줇",4,"줎 ã€ã€‚·‥…¨〃­―∥\∼‘’“â€ã€”〕〈",9,"±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○â—◎◇◆□■△▲▽▼→â†â†‘↓↔〓≪≫√∽âˆâˆµâˆ«âˆ¬âˆˆâˆ‹âŠ†âŠ‡âŠ‚⊃∪∩∧∨¬"],["a241","ì¤ì¤’",5,"줙",18],["a261","줭",6,"줵",18],["a281","쥈",7,"쥒쥓쥕쥖쥗쥙",6,"쥢쥤",7,"쥭쥮쥯⇒⇔∀∃´~ˇ˘Ë˚˙¸˛¡¿Ë∮∑âˆÂ¤â„‰â€°â—◀▷▶♤♠♡♥♧♣⊙◈▣â—◑▒▤▥▨▧▦▩♨â˜â˜Žâ˜œâ˜žÂ¶â€ â€¡â†•â†—↙↖↘♭♩♪♬㉿㈜№ã‡â„¢ã‚ã˜â„¡â‚¬Â®"],["a341","쥱쥲쥳쥵",6,"쥽",10,"즊즋ì¦ì¦Žì¦"],["a361","즑",6,"즚즜즞",16],["a381","즯",16,"짂짃짅짆짉짋",4,"짒짔짗짘짛ï¼",58,"₩]",32,"ï¿£"],["a441","짞짟짡짣짥짦짨짩짪짫짮짲",5,"짺짻짽짾짿ì¨ì¨‚쨃쨄"],["a461","쨅쨆쨇쨊쨎",5,"쨕쨖쨗쨙",12],["a481","쨦쨧쨨쨪",28,"ㄱ",93],["a541","쩇",4,"ì©Žì©ì©‘ì©’ì©“ì©•",6,"ì©žì©¢",5,"쩩쩪"],["a561","ì©«",17,"쩾",5,"쪅쪆"],["a581","쪇",16,"쪙",14,"â…°",9],["a5b0","â… ",9],["a5c1","Α",16,"Σ",6],["a5e1","α",16,"σ",6],["a641","쪨",19,"쪾쪿ì«ì«‚쫃쫅"],["a661","쫆",5,"ì«Žì«ì«’쫔쫕쫖쫗쫚",5,"ì«¡",6],["a681","쫨쫩쫪쫫쫭",6,"쫵",18,"쬉쬊─│┌â”┘└├┬┤┴┼â”┃â”┓┛┗┣┳┫┻╋┠┯┨┷┿â”┰┥┸╂┒┑┚┙┖┕┎â”┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀â•â•ƒ",7],["a741","쬋",4,"쬑쬒쬓쬕쬖쬗쬙",6,"쬢",7],["a761","쬪",22,"쭂쭃쭄"],["a781","쭅쭆쭇쭊쭋ì­ì­Žì­ì­‘",6,"쭚쭛쭜쭞",5,"ì­¥",7,"㎕㎖㎗ℓ㎘ã„㎣㎤㎥㎦㎙",9,"ãŠãŽãŽŽãŽã㎈㎉ãˆãŽ§ãŽ¨ãŽ°",9,"㎀",4,"㎺",5,"ãŽ",4,"Ωã€ã㎊㎋㎌ã–ã…㎭㎮㎯ã›ãŽ©ãŽªãŽ«ãŽ¬ããã“ãƒã‰ãœã†"],["a841","ì­­",10,"ì­º",14],["a861","쮉",18,"ì®",6],["a881","쮤",19,"쮹",11,"ÆêĦ"],["a8a6","IJ"],["a8a8","Ä¿ÅØŒºÞŦŊ"],["a8b1","㉠",27,"â“",25,"â‘ ",14,"½⅓⅔¼¾⅛⅜â…â…ž"],["a941","쯅",14,"쯕",10],["a961","쯠쯡쯢쯣쯥쯦쯨쯪",18],["a981","쯽",14,"ì°Žì°ì°‘ì°’ì°“ì°•",6,"찞찟찠찣찤æđðħıijĸŀłøœßþŧŋʼn㈀",27,"â’œ",25,"â‘´",14,"¹²³â´â¿â‚₂₃₄"],["aa41","찥찦찪찫찭찯찱",6,"찺찿",4,"챆챇챉챊챋ì±ì±Ž"],["aa61","ì±",4,"챖챚",5,"챡챢챣챥챧챩",6,"챱챲"],["aa81","챳챴챶",29,"ã",82],["ab41","첔첕첖첗첚첛ì²ì²žì²Ÿì²¡",6,"첪첮",5,"첶첷첹"],["ab61","첺첻첽",6,"쳆쳈쳊",5,"쳑쳒쳓쳕",5],["ab81","ì³›",8,"ì³¥",6,"쳭쳮쳯쳱",12,"ã‚¡",85],["ac41","쳾쳿촀촂",5,"ì´Šì´‹ì´ì´Žì´ì´‘",6,"촚촜촞촟촠"],["ac61","촡촢촣촥촦촧촩촪촫촭",11,"ì´º",4],["ac81","ì´¿",28,"ìµìµžìµŸÐ",5,"ÐЖ",25],["acd1","а",5,"ёж",25],["ad41","쵡쵢쵣쵥",6,"쵮쵰쵲",5,"ìµ¹",7],["ad61","ì¶",6,"춉",10,"춖춗춙춚춛ì¶ì¶žì¶Ÿ"],["ad81","춠춡춢춣춦춨춪",5,"춱",18,"ì·…"],["ae41","ì·†",5,"ì·ì·Žì·ì·‘",16],["ae61","ì·¢",5,"췩췪췫췭췮췯췱",6,"췺췼췾",4],["ae81","츃츅츆츇츉츊츋ì¸",6,"츕츖츗츘츚",5,"츢츣츥츦츧츩츪츫"],["af41","츬츭츮츯츲츴츶",19],["af61","칊",13,"칚칛ì¹ì¹žì¹¢",5,"칪칬"],["af81","ì¹®",5,"칶칷칹칺칻칽",6,"캆캈캊",5,"캒캓캕캖캗캙"],["b041","캚",5,"캢캦",5,"캮",12],["b061","캻",5,"컂",19],["b081","ì»–",13,"컦컧컩컪컭",6,"컶컺",5,"ê°€ê°ê°„갇갈갉갊ê°",7,"ê°™",4,"갠갤갬갭갯갰갱갸갹갼걀걋ê±ê±”걘걜거걱건걷걸걺검ê²ê²ƒê²„겅겆겉겊겋게ê²ê²”겜ê²ê²Ÿê² ê²¡ê²¨ê²©ê²ªê²¬ê²¯ê²°ê²¸ê²¹ê²»ê²¼ê²½ê³ê³„곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆"],["b141","켂켃켅켆켇켉",6,"켒켔켖",5,"ì¼ì¼žì¼Ÿì¼¡ì¼¢ì¼£"],["b161","ì¼¥",6,"켮켲",5,"ì¼¹",11],["b181","ì½…",14,"콖콗콙콚콛ì½",6,"콦콨콪콫콬괌ê´ê´ê´‘괘괜괠괩괬괭괴괵괸괼굄굅굇굉êµêµ”굘굡굣구국군굳굴굵굶굻굼굽굿ê¶ê¶‚궈궉권ê¶ê¶œê¶ê¶¤ê¶·ê·€ê·ê·„ê·ˆê·ê·‘귓규균귤그극근귿글ê¸ê¸ˆê¸‰ê¸‹ê¸ê¸”기긱긴긷길긺김ê¹ê¹ƒê¹…깆깊까ê¹ê¹Žê¹ê¹”깖깜ê¹ê¹Ÿê¹ ê¹¡ê¹¥ê¹¨ê¹©ê¹¬ê¹°ê¹¸"],["b241","콭콮콯콲콳콵콶콷콹",6,"ì¾ì¾‚쾃쾄쾆",5,"ì¾"],["b261","쾎",18,"ì¾¢",5,"쾩"],["b281","쾪",5,"ì¾±",18,"ì¿…",6,"깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌ê»ê»ê»ê»‘께껙껜껨껫껭껴껸껼꼇꼈ê¼ê¼ê¼¬ê¼­ê¼°ê¼²ê¼´ê¼¼ê¼½ê¼¿ê½ê½‚꽃꽈꽉ê½ê½œê½ê½¤ê½¥ê½¹ê¾€ê¾„꾈ê¾ê¾‘꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋ê¿ê¿Žê¿”꿜꿨꿩꿰꿱꿴꿸뀀ë€ë€„뀌ë€ë€”뀜ë€ë€¨ë„ë…ëˆëŠëŒëŽë“ë”ë•ë—ë™"],["b341","ì¿Œ",19,"쿢쿣쿥쿦쿧쿩"],["b361","쿪",5,"쿲쿴쿶",5,"쿽쿾쿿í€í€‚퀃퀅",5],["b381","퀋",5,"퀒",5,"퀙",19,"ëë¼ë½ë‚€ë‚„ë‚Œë‚ë‚낑나낙낚난낟날낡낢남납낫",4,"낱낳내낵낸낼냄냅냇냈냉ëƒëƒ‘냔냘냠냥너넉넋넌ë„넒넓넘넙넛넜ë„넣네넥넨넬넴넵넷넸넹녀ë…ë…„ë…ˆë…녑녔녕녘녜녠노녹논놀놂놈놉놋ë†ë†’놓놔놘놜놨뇌ë‡ë‡”뇜ë‡"],["b441","퀮",5,"퀶퀷퀹퀺퀻퀽",6,"í†íˆíŠ",5],["b461","í‘í’í“í•í–í—í™",6,"í¡",10,"í®í¯"],["b481","í±í²í³íµ",6,"í¾í¿í‚€í‚‚",18,"뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉ëŠëŠ‘는늘늙늚늠늡늣능늦늪늬늰늴니닉닌ë‹ë‹’님닙닛ë‹ë‹¢ë‹¤ë‹¥ë‹¦ë‹¨ë‹«",4,"닳담답닷",4,"닿대ëŒëŒ„댈ëŒëŒ‘댓댔댕댜ë”ë•ë–ë˜ë›ëœëžëŸë¤ë¥"],["b541","í‚•",14,"킦킧킩킪킫킭",5],["b561","킳킶킸킺",5,"탂탃탅탆탇탊",5,"탒탖",4],["b581","탛탞탟탡탢탣탥",6,"탮탲",5,"탹",11,"ë§ë©ë«ë®ë°ë±ë´ë¸ëŽ€ëŽëŽƒëŽ„뎅뎌ëŽëŽ”뎠뎡뎨뎬ë„ë…ëˆë‹ëŒëŽëë”ë•ë—ë™ë›ëë ë¤ë¨ë¼ëë˜ëœë ë¨ë©ë«ë´ë‘둑둔둘둠둡둣둥둬뒀뒈ë’뒤뒨뒬뒵뒷뒹듀듄듈ë“ë“•ë“œë“든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸"],["b641","í„…",7,"í„Ž",17],["b661","í„ ",15,"턲턳턵턶턷턹턻턼턽턾"],["b681","í„¿í…‚í…†",5,"í…Ží…í…‘í…’í…“í…•",6,"í…ží… í…¢",5,"텩텪텫텭땀ë•ë•ƒë•„ë•…ë•‹ë•Œë•ë•ë•”ë•œë•ë•Ÿë• ë•¡ë– ë–¡ë–¤ë–¨ë–ªë–«ë–°ë–±ë–³ë–´ë–µë–»ë–¼ë–½ë—€ë—„ë—Œë—ë—ë—뗑뗘뗬ë˜ë˜‘똔똘똥똬똴뙈뙤뙨뚜ëšëš ëš¤ëš«ëš¬ëš±ë›”뛰뛴뛸뜀ëœëœ…뜨뜩뜬뜯뜰뜸뜹뜻ë„ëˆëŒë”ë•ë ë¤ë¨ë°ë±ë³ëµë¼ë½ëž€ëž„람ëžëžëžëž‘ëž’ëž–ëž—"],["b741","í…®",13,"í…½",6,"톅톆톇톉톊"],["b761","톋",20,"톢톣톥톦톧"],["b781","톩",6,"톲톴톶톷톸톹톻톽톾톿í‡",14,"래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀ë ë ‡ë ˆë ‰ë Œë ë ˜ë ™ë ›ë ë ¤ë ¥ë ¨ë ¬ë ´ë µë ·ë ¸ë ¹ë¡€ë¡„ë¡‘ë¡“ë¡œë¡ë¡ ë¡¤ë¡¬ë¡­ë¡¯ë¡±ë¡¸ë¡¼ë¢ë¢¨ë¢°ë¢´ë¢¸ë£€ë£ë£ƒë£…료ë£ë£”ë£ë£Ÿë£¡ë£¨ë£©ë£¬ë£°ë£¸ë£¹ë£»ë£½ë¤„뤘뤠뤼뤽륀륄륌ë¥ë¥‘류륙륜률륨륩"],["b841","í‡",7,"퇙",17],["b861","퇫",8,"퇵퇶퇷퇹",13],["b881","툈툊",5,"툑",24,"륫륭르륵른를름릅릇릉릊ë¦ë¦Žë¦¬ë¦­ë¦°ë¦´ë¦¼ë¦½ë¦¿ë§ë§ˆë§‰ë§Œë§Ž",4,"맘맙맛ë§ë§žë§¡ë§£ë§¤ë§¥ë§¨ë§¬ë§´ë§µë§·ë§¸ë§¹ë§ºë¨€ë¨ë¨ˆë¨•ë¨¸ë¨¹ë¨¼ë©€ë©‚멈멉멋ë©ë©Žë©“메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼"],["b941","툪툫툮툯툱툲툳툵",6,"툾퉀퉂",5,"퉉퉊퉋퉌"],["b961","í‰",14,"í‰",6,"퉥퉦퉧퉨"],["b981","퉩",22,"튂튃튅튆튇튉튊튋튌묀묄ë¬ë¬ë¬‘묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉ë­ë­ë­ë­”뭘뭡뭣뭬뮈뮌ë®ë®¤ë®¨ë®¬ë®´ë®·ë¯€ë¯„믈ë¯ë¯“미믹민믿밀밂밈밉밋밌ë°ë°ë°‘ë°”",4,"ë°›",4,"밤밥밧방밭배백밴밸뱀ë±ë±ƒë±„뱅뱉뱌ë±ë±ë±ë²„벅번벋벌벎범법벗"],["ba41","íŠíŠŽíŠíŠ’튓튔튖",5,"íŠíŠžíŠŸíŠ¡íŠ¢íŠ£íŠ¥",6,"튭"],["ba61","튮튯튰튲",5,"튺튻튽튾í‹í‹ƒ",4,"í‹Ší‹Œ",5],["ba81","틒틓틕틖틗틙틚틛í‹",6,"틦",9,"틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별ë³ë³ë³ë³‘볕볘볜보복볶본볼봄봅봇봉ë´ë´”봤봬뵀뵈뵉뵌ëµëµ˜ëµ™ëµ¤ëµ¨ë¶€ë¶ë¶„붇불붉붊ë¶ë¶‘붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브ë¸ë¸ë¸”븜ë¸ë¸Ÿë¹„빅빈빌빎빔빕빗빙빚빛빠빡빤"],["bb41","í‹»",4,"팂팄팆",5,"íŒíŒ‘팒팓팕팗",4,"팞팢팣"],["bb61","팤팦팧팪팫팭팮팯팱",6,"팺팾",5,"í†í‡íˆí‰"],["bb81","íŠ",31,"빨빪빰빱빳빴빵빻빼빽뺀뺄뺌ëºëºëºëº‘뺘뺙뺨ë»ë»‘뻔뻗뻘뻠뻣뻤뻥뻬ë¼ë¼ˆë¼‰ë¼˜ë¼™ë¼›ë¼œë¼ë½€ë½ë½„뽈ë½ë½‘뽕뾔뾰뿅뿌ë¿ë¿ë¿”뿜뿟뿡쀼ì‘ì˜ìœì ì¨ì©ì‚삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀ìƒìƒ…새색샌ìƒìƒ˜ìƒ™ìƒ›ìƒœìƒìƒ¤"],["bc41","íª",17,"í¾í¿íŽíŽ‚펃펅펆펇"],["bc61","펈펉펊펋펎펒",5,"펚펛íŽíŽžíŽŸíŽ¡",6,"펪펬펮"],["bc81","펯",4,"펵펶펷펹펺펻펽",6,"í†í‡íŠ",5,"í‘",5,"샥샨샬샴샵샷샹섀섄섈ì„ì„•ì„œ",4,"섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌ì…셔셕션셜셤셥셧셨셩셰셴셸솅소ì†ì†Žì†ì†”솖솜ì†ì†Ÿì†¡ì†¥ì†¨ì†©ì†¬ì†°ì†½ì‡„쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌ìˆìˆìˆ‘수숙순숟술숨숩숫숭"],["bd41","í—í™",7,"í¢í¤",7,"í®í¯í±í²í³íµí¶í·"],["bd61","í¸í¹íºí»í¾í€í‚",5,"í‰",13],["bd81","í—",5,"íž",25,"숯숱숲숴쉈ì‰ì‰‘쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿ìŠìŠˆìŠ‰ìŠìŠ˜ìŠ›ìŠìŠ¤ìŠ¥ìŠ¨ìŠ¬ìŠ­ìŠ´ìŠµìŠ·ìŠ¹ì‹œì‹ì‹ ì‹£ì‹¤ì‹«ì‹¬ì‹­ì‹¯ì‹±ì‹¶ì‹¸ì‹¹ì‹»ì‹¼ìŒ€ìŒˆìŒ‰ìŒŒìŒìŒ“쌔쌕쌘쌜쌤쌥쌨쌩ì…ì¨ì©ì¬ì°ì²ì¸ì¹ì¼ì½ìŽ„쎈쎌ì€ì˜ì™ìœìŸì ì¢ì¨ì©ì­ì´ìµì¸ìˆìì¤ì¬ì°"],["be41","í¸",7,"í‘푂푃푅",14],["be61","í‘”",7,"í‘푞푟푡푢푣푥",7,"푮푰푱푲"],["be81","푳",4,"푺푻푽푾í’í’ƒ",4,"풊풌풎",5,"í’•",8,"ì´ì¼ì½ì‘ˆì‘¤ì‘¥ì‘¨ì‘¬ì‘´ì‘µì‘¹ì’€ì’”쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀ì”씌ì”씔씜씨씩씬씰씸씹씻씽아악안앉않알ì•ì•Žì•“암압앗았앙ì•ì•žì• ì•¡ì•¤ì•¨ì•°ì•±ì•³ì•´ì•µì•¼ì•½ì–€ì–„얇얌ì–ì–양얕얗얘얜얠얩어억언얹얻얼얽얾엄",6,"엌엎"],["bf41","í’ž",10,"í’ª",14],["bf61","í’¹",18,"í“í“Ží“í“‘í“’í““í“•"],["bf81","í“–",5,"í“í“ží“ ",7,"퓩퓪퓫퓭퓮퓯퓱",6,"퓹퓺퓼ì—엑엔엘엠엡엣엥여역엮연열엶엷염",5,"옅옆옇예옌ì˜ì˜˜ì˜™ì˜›ì˜œì˜¤ì˜¥ì˜¨ì˜¬ì˜­ì˜®ì˜°ì˜³ì˜´ì˜µì˜·ì˜¹ì˜»ì™€ì™ì™„왈ì™ì™‘왓왔왕왜ì™ì™ ì™¬ì™¯ì™±ì™¸ì™¹ì™¼ìš€ìšˆìš‰ìš‹ìšìš”욕욘욜욤욥욧용우욱운울욹욺움ì›ì›ƒì›…워ì›ì›ì›”웜ì›ì› ì›¡ì›¨"],["c041","퓾",5,"픅픆픇픉픊픋í”",6,"픖픘",5],["c061","픞",25],["c081","픸픹픺픻픾픿í•í•‚핃핅",6,"í•Ží•í•’",5,"í•ší•›í•í•ží•Ÿí•¡í•¢í•£ì›©ì›¬ì›°ì›¸ì›¹ì›½ìœ„윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽ì€ì„ìŠìŒììì‘",7,"ìœì ì¨ì«ì´ìµì¸ì¼ì½ì¾ìžƒìž„입잇있잉잊잎ìžìž‘잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀ìŸìŸˆìŸ‰ìŸŒìŸŽìŸìŸ˜ìŸìŸ¤ìŸ¨ìŸ¬ì €ì ì „절젊"],["c141","핤핦핧핪핬핮",5,"핶핷핹핺핻핽",6,"햆햊햋"],["c161","í–Œí–í–Ží–í–‘",19,"햦햧"],["c181","í–¨",31,"ì ì ‘ì “ì •ì –ì œì ì  ì ¤ì ¬ì ­ì ¯ì ±ì ¸ì ¼ì¡€ì¡ˆì¡‰ì¡Œì¡ì¡”조족존졸졺좀ì¢ì¢ƒì¢…좆좇좋좌ì¢ì¢”ì¢ì¢Ÿì¢¡ì¢¨ì¢¼ì¢½ì£„죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌ì¤ì¤ì¤‘줘줬줴ì¥ì¥‘쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌ì¦ì¦˜ì¦™ì¦›ì¦ì§€ì§ì§„짇질짊ì§ì§‘짓"],["c241","í—Ší—‹í—í—Ží—í—‘í—“",4,"헚헜헞",5,"헦헧헩헪헫헭헮"],["c261","í—¯",4,"헶헸헺",5,"혂혃혅혆혇혉",6,"혒"],["c281","혖",5,"í˜í˜ží˜Ÿí˜¡í˜¢í˜£í˜¥",7,"혮",9,"혺혻징짖짙짚짜ì§ì§ ì§¢ì§¤ì§§ì§¬ì§­ì§¯ì§°ì§±ì§¸ì§¹ì§¼ì¨€ì¨ˆì¨‰ì¨‹ì¨Œì¨ì¨”쨘쨩쩌ì©ì©ì©”ì©œì©ì©Ÿì© ì©¡ì©¨ì©½ìª„쪘쪼쪽쫀쫄쫌ì«ì«ì«‘쫓쫘쫙쫠쫬쫴쬈ì¬ì¬”쬘쬠쬡ì­ì­ˆì­‰ì­Œì­ì­˜ì­™ì­ì­¤ì­¸ì­¹ì®œì®¸ì¯”쯤쯧쯩찌ì°ì°ì°”ì°œì°ì°¡ì°¢ì°§ì°¨ì°©ì°¬ì°®ì°°ì°¸ì°¹ì°»"],["c341","혽혾혿í™í™‚홃홄홆홇홊홌홎í™í™í™’홓홖홗홙홚홛í™",4],["c361","홢",4,"홨홪",5,"홲홳홵",11],["c381","íšíš‚횄횆",5,"횎íšíš‘íš’íš“íš•",7,"횞횠횢",5,"횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉ì³ì³”쳤쳬쳰ì´ì´ˆì´‰ì´Œì´ì´˜ì´™ì´›ì´ì´¤ì´¨ì´¬ì´¹ìµœìµ ìµ¤ìµ¬ìµ­ìµ¯ìµ±ìµ¸ì¶ˆì¶”축춘출춤춥춧충춰췄췌ì·ì·¨ì·¬ì·°ì·¸ì·¹ì·»ì·½ì¸„츈츌츔츙츠측츤츨츰츱츳층"],["c441","횫횭횮횯횱",7,"횺횼",7,"훆훇훉훊훋"],["c461","í›í›Ží›í›í›’훓훕훖훘훚",5,"훡훢훣훥훦훧훩",4],["c481","훮훯훱훲훳훴훶",5,"훾훿íœíœ‚휃휅",11,"휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉ìºìº‘캔캘캠캡캣캤캥캬캭ì»ì»¤ì»¥ì»¨ì»«ì»¬ì»´ì»µì»·ì»¸ì»¹ì¼€ì¼ì¼„켈ì¼ì¼‘켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼"],["c541","휕휖휗휚휛íœíœžíœŸíœ¡",6,"휪휬휮",5,"휶휷휹"],["c561","휺휻휽",6,"í…í†íˆíŠ",5,"í’í“í•íš",4],["c581","íŸí¢í¤í¦í§í¨íªí«í­í®í¯í±í²í³íµ",6,"í¾í¿íž€íž‚",5,"힊힋í„í…í‡í‰íí”í˜í í¬í­í°í´í¼í½í‚키킥킨킬킴킵킷킹타íƒíƒ„탈탉íƒíƒ‘탓탔탕태íƒíƒ íƒ¤íƒ¬íƒ­íƒ¯íƒ°íƒ±íƒ¸í„터턱턴털턺텀í…텃텄텅테í…í…텔템í…텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉íˆíˆ¬íˆ­íˆ°íˆ´íˆ¼íˆ½íˆ¿í‰í‰ˆí‰œ"],["c641","ížížŽížíž‘",6,"힚힜힞",5],["c6a1","퉤튀íŠíŠ„튈íŠíŠ‘튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀íŒíŒƒíŒ…파íŒíŒŽíŒíŒ”팖팜íŒíŒŸíŒ íŒ¡íŒ¥íŒ¨íŒ©íŒ¬íŒ°íŒ¸íŒ¹íŒ»íŒ¼íŒ½í„í…í¼í½íŽ€íŽ„펌íŽíŽíŽíŽ‘페펙펜펠펨펩펫펭펴편펼í„í…íˆí‰íí˜í¡í£í¬í­í°í´í¼í½í¿í"],["c7a1","íˆí푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋í’풔풩퓌í“퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌í•í•í•‘하학한할핥함합핫항해핵핸핼햄햅햇했행í–향허헉헌í—헒험헙헛í—헤헥헨헬헴헵헷헹혀í˜í˜„혈í˜í˜‘혓혔형혜혠"],["c8a1","혤혭호혹혼홀홅홈홉홋í™í™‘화확환활홧황홰홱홴횃횅회íšíšíš”íšíšŸíš¡íš¨íš¬íš°íš¹íš»í›„훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼í„í‡í‰íí‘í”í–í—í˜í™í í¡í£í¥í©í¬í°í´í¼í½ížížˆíž‰ížŒížíž˜íž™íž›íž"],["caa1","伽佳å‡åƒ¹åŠ å¯å‘µå“¥å˜‰å«å®¶æš‡æž¶æž·æŸ¯æ­Œç‚痂稼苛茄街袈訶賈è·è»»è¿¦é§•åˆ»å´å„æªæ…¤æ®¼ç脚覺角閣侃刊墾奸姦干幹懇æ€æ†æŸ¬æ¡¿æ¾—癎看磵稈竿簡è‚艮艱諫間乫å–曷渴碣竭葛è¤èŽéž¨å‹˜åŽå ªåµŒæ„Ÿæ†¾æˆ¡æ•¢æŸ‘橄減甘疳監瞰紺邯鑑鑒龕"],["cba1","匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑è¥è¬›é‹¼é™é±‡ä»‹ä»·å€‹å‡±å¡æ„·æ„¾æ…¨æ”¹æ§ªæ¼‘疥皆盖箇芥蓋豈鎧開喀客å‘ï¤ç²³ç¾¹é†µå€¨åŽ»å±…巨拒æ®æ“šæ“§æ¸ ç‚¬ç¥›è·è¸žï¤‚é½é‰…鋸乾件å¥å·¾å»ºæ„†æ¥—腱虔蹇éµé¨«ä¹žå‚‘æ°æ¡€å„‰åŠåŠ’檢"],["cca1","çž¼éˆé»”劫怯迲åˆæ†©æ­æ“Šæ ¼æª„激膈覡隔堅牽犬甄絹繭肩見譴é£éµ‘抉決潔çµç¼ºè¨£å…¼æ…Šç®è¬™é‰—鎌京俓倞傾儆å‹å‹å¿å°å¢ƒåºšå¾‘慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕é¡é ƒé ¸é©šé¯¨ä¿‚啓堺契季屆悸戒桂械"],["cda1","棨溪界癸磎稽系繫繼計誡谿階鷄å¤å©å‘Šå‘±å›ºå§‘孤尻庫拷攷故敲暠枯æ§æ²½ç—¼çšç¾ç¨¿ç¾”考股è†è‹¦è‹½è°è—蠱袴誥賈辜錮雇顧高鼓哭斛曲æ¢ç©€è°·éµ å›°å¤å´‘昆梱æ£æ»¾ç¨è¢žé¯¤æ±¨ï¤„骨供公共功孔工ææ­æ‹±æŽ§æ”»ç™ç©ºèš£è²¢éžä¸²å¯¡æˆˆæžœç“œ"],["cea1","科è“誇課跨éŽé‹é¡†å»“槨藿郭串冠官寬慣棺款çŒç¯ç“˜ç®¡ç½è…觀貫關館刮æ括适侊光匡壙廣曠洸炚狂ç–ç­èƒ±é‘›å¦æŽ›ç½«ä¹–傀塊壞怪愧æ‹æ§é­å®ç´˜è‚±è½Ÿäº¤åƒ‘咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久ä¹ä»‡ä¿±å…·å‹¾"],["cfa1","å€å£å¥å’Žå˜”åµåž¢å¯‡å¶‡å»æ‡¼æ‹˜æ•‘枸柩構æ­æ¯†æ¯¬æ±‚æºç¸ç‹—玖çƒçž¿çŸ©ç©¶çµ¿è€‰è‡¼èˆ…舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局èŠéž éž«éº´å›çª˜ç¾¤è£™è»éƒ¡å €å±ˆæŽ˜çªŸå®®å¼“穹窮芎躬倦券勸å·åœˆæ‹³æ²æ¬Šæ·ƒçœ·åŽ¥ç—蕨蹶闕机櫃潰詭軌饋句晷歸貴"],["d0a1","鬼龜å«åœ­å¥Žæ†æ§»çªç¡…窺竅糾葵è¦èµ³é€µé–¨å‹»å‡ç•‡ç­ èŒéˆžï¤ˆæ©˜å…‹å‰‹åŠ‡æˆŸæ£˜æ¥µéš™åƒ…劤勤懃斤根槿瑾筋芹è«è¦²è¬¹è¿‘饉契今妗擒昑檎ç´ç¦ç¦½èŠ©è¡¾è¡¿è¥Ÿï¤ŠéŒ¦ä¼‹åŠæ€¥æ‰±æ±²ç´šçµ¦äº˜å…¢çŸœè‚¯ä¼ä¼Žå…¶å†€å—œå™¨åœ»åŸºåŸ¼å¤”奇妓寄å²å´Žå·±å¹¾å¿ŒæŠ€æ——æ—£"],["d1a1","朞期æžæ£‹æ£„機欺氣汽沂淇玘ç¦çªç’‚璣畸畿ç¢ç£¯ç¥ç¥‡ç¥ˆç¥ºç®•ç´€ç¶ºç¾ˆè€†è€­è‚Œè¨˜è­è±ˆèµ·éŒ¡éŒ¤é£¢é¥‘騎é¨é©¥éº’緊佶å‰æ‹®æ¡”金喫儺喇奈娜懦ï¤æ‹æ‹¿ï¤Ž",5,"那樂",4,"諾酪駱亂卵暖ï¤ç…–爛蘭難鸞ææºå—嵐æžæ¥ æ¹³ï¤¢ç”·ï¤£ï¤¤ï¤¥"],["d2a1","ç´ï¤¦ï¤§è¡²å›Šå¨˜ï¤¨",4,"乃來內奈柰è€ï¤®å¥³å¹´æ’šç§Šå¿µæ¬æ‹ˆæ»å¯§å¯—努勞奴弩怒擄櫓爐瑙盧",5,"駑魯",10,"濃籠聾膿農惱牢磊腦賂雷尿壘",7,"嫩訥æ»ç´ï¥’",5,"能菱陵尼泥匿溺多茶"],["d3a1","丹亶但單團壇彖斷旦檀段æ¹çŸ­ç«¯ç°žç·žè›‹è¢’鄲é›æ’»æ¾¾çºç–¸é”å•–å憺擔曇淡湛潭澹痰èƒè†½è•è¦ƒè«‡è­šéŒŸæ²“ç•“ç­”è¸éå”堂塘幢戇撞棠當糖螳黨代垈å®å¤§å°å²±å¸¶å¾…戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉æ—桃"],["d4a1","棹櫂淘渡滔濤燾盜ç¹ç¦±ç¨»è„覩賭跳蹈逃途é“都é陶韜毒瀆牘犢ç¨ç£ç¦¿ç¯¤çº›è®€å¢©æƒ‡æ•¦æ—½æš¾æ²Œç„žç‡‰è±šé “ä¹­çªä»å†¬å‡å‹•åŒæ†§æ±æ¡æ£Ÿæ´žæ½¼ç–¼çž³ç«¥èƒ´è‘£éŠ…兜斗æœæž“痘竇è³ï¥šè±†é€—頭屯臀芚éé¯éˆå¾—å¶æ©™ç‡ˆç™»ç­‰è—¤è¬„鄧騰喇懶拏癩羅"],["d5a1","蘿螺裸é‚樂洛烙çžçµ¡è½ï¥é…ªé§±ï¥žäº‚åµæ¬„欒瀾爛蘭鸞剌辣åµæ“¥æ”¬æ¬–濫籃纜è—襤覽拉臘蠟廊朗浪狼ç…瑯螂郞來å´å¾ èŠå†·æŽ ç•¥äº®å€†å…©å‡‰æ¢æ¨‘粮粱糧良諒輛é‡ä¾¶å„·å‹µå‘‚廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷ç€ç¤«è½¢é‚æ†æˆ€æ”£æ¼£"],["d6a1","煉璉練è¯è“®è¼¦é€£éŠå†½åˆ—劣洌烈裂廉斂殮濂簾çµä»¤ä¼¶å›¹ï¥Ÿå²ºå¶ºæ€œçŽ²ç¬­ç¾šç¿Žè†é€žéˆ´é›¶éˆé ˜é½¡ä¾‹æ¾§ç¦®é†´éš·å‹žï¥ æ’ˆæ“„櫓潞瀘çˆç›§è€è˜†è™œè·¯è¼…露魯鷺鹵碌祿綠è‰éŒ„鹿麓論壟弄朧瀧ç“ç± è¾å„¡ç€¨ç‰¢ç£Šè³‚賚賴雷了僚寮廖料燎療瞭èŠè“¼"],["d7a1","é¼é¬§é¾å£˜å©å±¢æ¨“æ·šæ¼ç˜»ç´¯ç¸·è”žè¤¸é¤é™‹åŠ‰æ—’柳榴æµæºœç€ç‰ç‘ ç•™ç˜¤ç¡«è¬¬é¡žå…­æˆ®é™¸ä¾–倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾è±é™µä¿šåˆ©åŽ˜å唎履悧æŽæ¢¨æµ¬çŠç‹¸ç†ç’ƒï¥¢ç—¢ç±¬ç½¹ç¾¸èŽ‰è£è£¡é‡Œé‡é›¢é¯‰åæ½¾ç‡ç’˜è—ºèºªéš£é±—麟林淋ç³è‡¨éœ–ç ¬"],["d8a1","立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万å娩巒彎慢挽晩曼滿漫ç£çžžè¬è”“蠻輓饅鰻唜抹末沫茉襪éºäº¡å¦„忘忙望網罔芒茫莽輞邙埋妹媒å¯æ˜§æžšæ¢…æ¯ç…¤ç½µè²·è³£é‚魅脈貊陌驀麥孟氓猛盲盟èŒå†ªè¦“å…冕勉棉沔眄眠綿緬é¢éºµæ»…"],["d9a1","蔑冥å命明æšæ¤§æºŸçš¿çž‘茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮æŸæ¨¡æ¯æ¯›ç‰Ÿç‰¡ç‘眸矛耗芼茅謀謨貌木æ²ç‰§ç›®ç¦ç©†é¶©æ­¿æ²’夢朦蒙å¯å¢“妙廟æ昴æ³æ¸ºçŒ«ç«—苗錨務巫憮懋戊拇撫无楙武毋無ç·ç•ç¹†èˆžèŒ‚蕪誣貿霧鵡墨默們刎å»å•æ–‡"],["daa1","汶紊紋èžèšŠé–€é›¯å‹¿æ²•ç‰©å‘³åªšå°¾åµ‹å½Œå¾®æœªæ¢¶æ¥£æ¸¼æ¹„眉米美薇謎迷é¡é»´å²·æ‚¶æ„憫æ•æ—»æ—¼æ°‘泯玟ç‰ç·¡é–”密蜜è¬å‰åšæ‹æ撲朴樸泊ç€ç’žç®”粕縛膊舶薄迫雹é§ä¼´åŠåå›æ‹Œæ¬æ”€æ–‘槃泮潘ç­ç•”瘢盤盼ç£ç£»ç¤¬çµ†èˆ¬èŸ è¿”頒飯勃拔撥渤潑"],["dba1","發跋醱鉢髮魃倣å‚åŠå¦¨å°¨å¹‡å½·æˆ¿æ”¾æ–¹æ—昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防é¾å€ä¿³ï¥£åŸ¹å¾˜æ‹œæŽ’æ¯æ¹ƒç„™ç›ƒèƒŒèƒšè£´è£µè¤™è³ è¼©é…陪伯佰帛æŸæ ¢ç™½ç™¾é­„幡樊煩燔番磻ç¹è•ƒè—©é£œä¼ç­ç½°é–¥å‡¡å¸†æ¢µæ°¾æ±Žæ³›çŠ¯ç¯„范法çºåƒ»åŠˆå£æ“˜æª—璧癖"],["dca1","碧蘗闢霹便åžå¼è®Šè¾¨è¾¯é‚Šåˆ¥çž¥é±‰é¼ˆä¸™å€‚兵屛幷昞昺柄棅炳ç”病秉ç«è¼§é¤ é¨ˆä¿å ¡å ±å¯¶æ™®æ­¥æ´‘湺潽ç¤ç”«è©è£œè¤“譜輔ä¼åƒ•åŒåœå®“復æœç¦è…¹èŒ¯è””複覆輹輻馥鰒本乶俸奉å°å³¯å³°æ§æ£’烽熢ç«ç¸«è“¬èœ‚逢鋒鳳ä¸ä»˜ä¿¯å‚…剖副å¦å’埠夫婦"],["dda1","孚孵富府復扶敷斧浮溥父符簿缶è…腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分å©å™´å¢³å¥”奮忿憤扮æ˜æ±¾ç„šç›†ç²‰ç³žç´›èŠ¬è³é›°ï¥§ä½›å¼—彿拂崩朋棚硼繃鵬丕備匕匪å‘妃婢庇悲憊扉批æ–枇榧比毖毗毘沸泌çµç—ºç ’碑秕秘粃緋翡肥"],["dea1","脾臂è²èœšè£¨èª¹è­¬è²»é„™éžé£›é¼»åš¬å¬ªå½¬æ–Œæª³æ®¯æµœæ¿±ç€•ç‰çŽ­è²§è³“頻憑氷è˜é¨ä¹äº‹äº›ä»•ä¼ºä¼¼ä½¿ä¿Ÿåƒ¿å²å¸å”†å—£å››å£«å¥¢å¨‘寫寺射巳師徙æ€æ¨æ–œæ–¯æŸ¶æŸ»æ¢­æ­»æ²™æ³—渣瀉ç…砂社祀祠ç§ç¯©ç´—絲肆èˆèŽŽè“‘蛇裟è©è©žè¬è³œèµ¦è¾­é‚ªé£¼é§Ÿéºå‰Šï¥©æœ”索"],["dfa1","傘刪山散汕çŠç”£ç–算蒜酸霰乷撒殺煞薩三參æ‰æ£®æ¸—芟蔘衫æ·æ¾éˆ’颯上傷åƒå„Ÿå•†å–ªå˜—孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼åºåº¶å¾æ•æŠ’æ¿æ•æš‘曙書栖棲犀瑞筮絮緖署"],["e0a1","胥舒薯西誓é€é‹¤é»é¼ å¤•å¥­å¸­æƒœæ˜”晳æžæ±æ·…潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽ç瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣é¸éŠ‘é¥é¥é®®å¨å±‘楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾è´é–ƒé™æ”涉燮葉城姓宬性惺æˆæ˜Ÿæ™ŸçŒ©ç¹ç››çœç­¬"],["e1a1","è–è²è…¥èª é†’世勢歲洗稅笹細說貰å¬å˜¯å¡‘宵å°å°‘巢所掃æ”昭梳沼消溯瀟炤燒甦ç–疎瘙笑篠簫素紹蔬蕭蘇訴é€é¡é‚µéŠ·éŸ¶é¨·ä¿—屬æŸæ¶‘粟續謖贖速孫巽æè“€éœé£¡çŽ‡å®‹æ‚šæ¾æ·žè¨Ÿèª¦é€é Œåˆ·ï¥°ç‘碎鎖衰釗修å—嗽囚垂壽嫂守岫峀帥æ„"],["e2a1","æˆæ‰‹æŽˆæœæ”¶æ•¸æ¨¹æ®Šæ°´æ´™æ¼±ç‡§ç‹©ç¸ç‡ç’²ç˜¦ç¡ç§€ç©—竪粹ç¶ç¶¬ç¹¡ç¾žè„©èŒ±è’蓚藪袖誰è®è¼¸é‚邃酬銖銹隋隧隨雖需須首髓鬚å”塾夙孰宿淑潚熟ç¡ç’¹è‚…è½å·¡å¾‡å¾ªæ‚旬栒楯橓殉洵淳ç£ç›¾çž¬ç­ç´”脣舜è€è“´è•£è©¢è«„醇錞順馴戌術述鉥崇崧"],["e3a1","嵩瑟è†è¨æ¿•æ‹¾ç¿’褶襲丞乘僧å‹å‡æ‰¿æ˜‡ç¹©è …陞ä¾åŒ™å˜¶å§‹åª¤å°¸å±Žå±å¸‚弑æƒæ–½æ˜¯æ™‚枾柴猜矢示翅蒔è“視試詩諡豕豺埴寔å¼æ¯æ‹­æ¤æ®–湜熄篒è•è­˜è»¾é£Ÿé£¾ä¼¸ä¾ä¿¡å‘»å¨ å®¸æ„¼æ–°æ™¨ç‡¼ç”³ç¥žç´³è…Žè‡£èŽ˜è–ªè—Žèœƒè¨Šèº«è¾›ï¥±è¿…失室實悉審尋心æ²"],["e4a1","沈深瀋甚芯諶什å拾雙æ°äºžä¿„兒啞娥峨我牙芽莪蛾衙è¨é˜¿é›…餓鴉éµå Šå²³å¶½å¹„惡愕æ¡æ¨‚渥鄂é”é¡Žé°é½·å®‰å²¸æŒ‰æ™æ¡ˆçœ¼é›éžé¡”鮟斡è¬è»‹é–¼å”µå²©å·–庵暗癌è´é—‡å£“押狎鴨仰央æ€æ˜»æ®ƒç§§é´¦åŽ“哀埃崖愛曖涯ç¢è‰¾éš˜é„厄扼掖液縊腋é¡"],["e5a1","櫻罌鶯鸚也倻冶夜惹æ¶æ¤°çˆºè€¶ï¥´é‡Žå¼±ï¥µï¥¶ç´„若葯蒻藥èºï¥·ä½¯ï¥¸ï¥¹å£¤å­ƒæ™æšæ”˜æ•­æš˜ï¥ºæ¥Šæ¨£æ´‹ç€ç…¬ç—’ç˜ç¦³ç©°ï¥»ç¾Šï¥¼è¥„諒讓釀陽量養圄御於æ¼ç˜€ç¦¦èªžé¦­é­šé½¬å„„憶抑æªè‡†åƒå °å½¦ç„‰è¨€è«ºå­¼è˜–俺儼嚴奄掩淹嶪業円予余勵呂ï¦å¦‚廬"],["e6a1","旅歟æ±ï¦„璵礖礪與艅茹輿è½ï¦†é¤˜ï¦‡ï¦ˆï¦‰äº¦ï¦ŠåŸŸå½¹æ˜“曆歷疫繹譯ï¦é€†é©›åš¥å §å§¸å¨Ÿå®´ï¦Žå»¶ï¦ï¦æ挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉ç¡ç¡¯ï¦•ç­µç·£ï¦–縯聯è¡è»Ÿï¦˜ï¦™ï¦šé‰›ï¦›é³¶ï¦œï¦ï¦žæ‚…涅烈熱裂說閱厭廉念捻染殮炎焰ç°è‰¶è‹’"],["e7a1","簾閻髥鹽曄獵ç‡è‘‰ï¦¨ï¦©å¡‹ï¦ªï¦«å¶¸å½±ï¦¬æ˜ æšŽæ¥¹æ¦®æ°¸æ³³æ¸¶æ½æ¿šç€›ç€¯ç…營ç°ï¦­ç‘›ï¦®ç“”盈穎纓羚聆英詠迎鈴éˆï¦²éœ™ï¦³ï¦´ä¹‚倪例刈å¡æ›³æ±­æ¿ŠçŒŠç¿ç©¢èŠ®è—蘂禮裔詣譽豫醴銳隸霓é äº”ä¼ä¿‰å‚²åˆå¾å³å—šå¡¢å¢ºå¥§å¨›å¯¤æ‚Ÿï¦¹æ‡Šæ•–旿晤梧汚澳"],["e8a1","çƒç†¬ç’筽蜈誤鰲鼇屋沃ç„玉鈺溫瑥瘟穩縕蘊兀壅æ“瓮甕癰ç¿é‚•é›é¥”渦瓦窩窪臥蛙è¸è¨›å©‰å®Œå®›æ¢¡æ¤€æµ£çŽ©ç“ç¬ç¢—緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬å·çŒ¥ç•ï¦ºï¦»åƒ¥å‡¹å ¯å¤­å¦–姚寥寮尿嶢拗æ–撓擾料曜樂橈燎燿瑤ï§"],["e9a1","窈窯繇繞耀腰蓼蟯è¦è¬ é™ï§ƒé‚€é¥’慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬è³èŒ¸è“‰è¸ŠéŽ”éžï§„于佑å¶å„ªåˆå‹å³å®‡å¯“尤愚憂旴牛玗瑀盂ç¥ç¦‘禹紆羽芋藕虞迂é‡éƒµé‡ªéš…雨雩勖彧旭昱栯煜稶éƒé Šäº‘暈橒殞æ¾ç†‰è€˜èŠ¸è•“"],["eaa1","é‹éš•é›²éŸ»è”šé¬±äºç†Šé›„元原員圓園垣媛嫄寃怨愿æ´æ²…洹湲æºçˆ°çŒ¿ç‘—è‹‘è¢è½…é ï§†é™¢é¡˜é´›æœˆè¶Šé‰žä½å‰åƒžå±åœå§”å¨å°‰æ…°æšæ¸­çˆ²ç‘‹ç·¯èƒƒèŽè‘¦è”¿èŸè¡›è¤˜è¬‚é•éŸ‹é­ä¹³ä¾‘儒兪劉唯喩孺宥幼幽庾悠惟愈愉æ„攸有杻柔柚柳楡楢油洧流游溜"],["eba1","濡猶猷琉瑜由ï§ç™’硫ï§ç¶­è‡¾è¸è£•èª˜è«›è«­è¸°è¹‚éŠé€¾éºé…‰é‡‰é®ï§ï§‘堉戮毓肉育陸倫å…奫尹崙淪潤玧胤贇輪鈗é–律慄栗率è¿æˆŽç€œçµ¨èžï§œåž æ©æ…‡æ®·èª¾éŠ€éš±ä¹™åŸæ·«è”­é™°éŸ³é£®æ–泣邑å‡æ‡‰è†ºé·¹ä¾å€šå„€å®œæ„懿擬椅毅疑矣義艤è–蟻衣誼"],["eca1","議醫二以伊ï§ï§žå¤·å§¨ï§Ÿå·²å¼›å½›æ€¡ï§ ï§¡ï§¢ï§£çˆ¾ç¥ï§¤ç•°ç—痢移罹而耳肄苡è‘裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人ä»åˆƒå°ï§­å’½å› å§»å¯…引å¿æ¹®ï§®ï§¯çµªèŒµï§°èš“èªï§±é­é·ï§²ï§³ä¸€ä½šä½¾å£¹æ—¥æº¢é€¸éŽ°é¦¹ä»»å£¬å¦Šå§™æ林淋稔臨è賃入å„"],["eda1","立笠粒ä»å‰©å­•èŠ¿ä»”刺咨姉姿å­å­—å­œæ£æ…ˆæ»‹ç‚™ç…®çŽ†ç“·ç–µç£ç´«è€…自茨蔗藉諮資雌作勺嚼斫昨ç¼ç‚¸çˆµç¶½èŠé…Œé›€éµ²å­±æ£§æ®˜æ½ºç›žå²‘暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲æ–樟檣欌漿牆狀ç璋章粧腸臟臧莊葬蔣薔è—è£è´“醬長"],["eea1","éšœå†å“‰åœ¨å®°æ‰æ栽梓渽滓ç½ç¸¡è£è²¡è¼‰é½‹é½Žçˆ­ç®è«éŒšä½‡ä½Žå„²å’€å§åº•æŠµæµæ¥®æ¨—沮渚狙猪疽箸紵苧è¹è‘—藷詛貯躇這邸雎齟勣åŠå«¡å¯‚摘敵滴狄炙的ç©ç¬›ç±ç¸¾ç¿Ÿè»è¬«è³Šèµ¤è·¡è¹Ÿè¿ªè¿¹é©é‘佃佺傳全典å‰å‰ªå¡¡å¡¼å¥ å°ˆå±•å»›æ‚›æˆ°æ “殿氈澱"],["efa1","ç…Žç ç”°ç”¸ç•‘癲筌箋箭篆çºè©®è¼¾è½‰éˆ¿éŠ“錢é«é›»é¡šé¡«é¤žåˆ‡æˆªæŠ˜æµ™ç™¤ç«Šç¯€çµ¶å å²¾åº—漸点粘霑鮎點接摺è¶ä¸äº•äº­åœåµå‘ˆå§ƒå®šå¹€åº­å»·å¾æƒ…挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎ç½ç”ºç›ç¢‡ç¦Žç¨‹ç©½ç²¾ç¶Žè‰‡è¨‚諪貞鄭酊釘鉦鋌錠霆é–"],["f0a1","éœé ‚鼎制劑啼堤å¸å¼Ÿæ‚Œæ梯濟祭第è‡è–ºè£½è«¸è¹„é†é™¤éš›éœ½é¡Œé½Šä¿Žå…†å‡‹åŠ©å˜²å¼”彫措æ“æ—©æ™æ›ºæ›¹æœæ¢æ£—槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙èºé€ é­é‡£é˜»é›•é³¥æ—簇足éƒå­˜å°Šå’æ‹™çŒå€§å®—從悰慫棕淙ç®ç¨®çµ‚綜縱腫"],["f1a1","踪踵é¾é˜ä½å左座挫罪主ä½ä¾åšå§èƒ„呪周嗾å¥å®™å·žå»šæ™æœ±æŸ±æ ªæ³¨æ´²æ¹Šæ¾ç‚·ç ç–‡ç±Œç´‚紬綢舟蛛註誅走躊輳週酎酒鑄é§ç«¹ç²¥ä¿Šå„准埈寯峻晙樽浚準濬焌畯竣蠢逡éµé›‹é§¿èŒä¸­ä»²è¡†é‡å½æ«›æ¥«æ±è‘ºå¢žæ†Žæ›¾æ‹¯çƒç”‘症繒蒸證贈之åª"],["f2a1","咫地å€å¿—æŒæŒ‡æ‘¯æ”¯æ—¨æ™ºæžæž³æ­¢æ± æ²šæ¼¬çŸ¥ç ¥ç¥‰ç¥—紙肢脂至èŠèŠ·èœ˜èªŒï§¼è´„趾é²ç›´ç¨™ç¨·ç¹”è·å”‡å—”塵振æ¢æ™‰æ™‹æ¡­æ¦›æ®„津溱ç瑨璡畛疹盡眞瞋秦縉ç¸è‡»è”¯è¢—診賑軫辰進鎭陣陳震侄å±å§ªå«‰å¸™æ¡Žç“†ç–¾ç§©çª’膣蛭質跌迭斟朕什執潗ç·è¼¯"],["f3a1","é¶é›†å¾µæ‡²æ¾„且侘借å‰å—Ÿåµ¯å·®æ¬¡æ­¤ç£‹ç®šï§¾è¹‰è»Šé®æ‰æ¾ç€çª„錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽é¤é¥Œåˆ¹å¯Ÿæ“¦æœ­ç´®åƒ­åƒå¡¹æ…˜æ…™æ‡ºæ–¬ç«™è®’讖倉倡創唱娼廠彰愴敞昌昶暢æ§æ»„漲猖瘡窓脹艙è–蒼債埰寀寨彩採砦綵èœè”¡é‡‡é‡µå†ŠæŸµç­–"],["f4a1","責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟åƒå–˜å¤©å·æ“…泉淺玔穿舛薦賤è¸é·é‡§é—¡é˜¡éŸ†å‡¸å“²å–†å¾¹æ’¤æ¾ˆç¶´è¼Ÿè½éµåƒ‰å°–沾添甛瞻簽籤詹諂堞妾帖æ·ç‰’ç–Šç«è«œè²¼è¼’廳晴淸è½èè«‹é‘鯖切剃替涕滯締諦逮éžé«”åˆå‰¿å“¨æ†”抄招梢"],["f5a1","椒楚樵炒焦ç¡ç¤ç¤Žç§’ç¨è‚–艸苕è‰è•‰è²‚超酢醋醮促囑燭矗蜀觸寸忖æ‘邨å¢å¡šå¯µæ‚¤æ†æ‘ ç¸½è°è”¥éŠƒæ’®å‚¬å´”最墜抽推椎楸樞湫皺秋芻è©è«è¶¨è¿½é„’酋醜éŒéŒ˜éŽšé››é¨¶é°ä¸‘ç•œç¥ç«ºç­‘築縮蓄蹙蹴軸é€æ˜¥æ¤¿ç‘ƒå‡ºæœ®é»œå……忠沖蟲è¡è¡·æ‚´è†µèƒ"],["f6a1","è´…å–å¹å˜´å¨¶å°±ç‚Šç¿ èšè„†è‡­è¶£é†‰é©Ÿé·²å´ä»„厠惻測層侈値嗤峙幟æ¥æ¢”治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸ç›ç §é‡é¼èŸ„秤稱快他咤唾墮妥惰打拖朶楕舵陀馱é§å€¬å“å•„å¼ï¨æ‰˜ï¨‚擢晫æŸæ¿æ¿¯ç¢ç¸è¨—"],["f7a1","é¸å‘‘嘆å¦å½ˆæ†šæ­Žç˜ç‚­ç¶»èª•å¥ªè„«æŽ¢çœˆè€½è²ªå¡”æ­æ¦»å®•å¸‘湯糖蕩兌å°å¤ªæ€ æ…‹æ®†æ±°æ³°ç¬žèƒŽè‹”跆邰颱宅擇澤撑攄兎å土討慟桶洞痛筒統通堆槌腿褪退頹å¸å¥—妬投é€é¬ªæ…特闖å¡å©†å·´æŠŠæ’­æ“ºæ·æ³¢æ´¾çˆ¬ç¶ç ´ç½·èŠ­è·›é —判å‚æ¿ç‰ˆç“£è²©è¾¦éˆ‘"],["f8a1","阪八å­æŒä½©å”„悖敗沛浿牌狽稗覇è²å½­æ¾Žçƒ¹è†¨æ„Žä¾¿åæ‰ç‰‡ç¯‡ç·¨ç¿©é鞭騙貶åªå¹³æž°èè©•å å¬–幣廢弊斃肺蔽閉陛佈包åŒåŒå’†å“ºåœƒå¸ƒæ€–抛抱æ•ï¨†æ³¡æµ¦ç–±ç ²èƒžè„¯è‹žè‘¡è’²è¢è¤’逋鋪飽鮑幅暴æ›ç€‘爆輻俵剽彪慓æ“標漂瓢票表豹飇飄驃"],["f9a1","å“稟楓諷豊風馮彼披疲皮被é¿é™‚匹弼必泌çŒç•¢ç–‹ç­†è‹¾é¦ä¹é€¼ä¸‹ä½•åŽ¦å¤å»ˆæ˜°æ²³ç‘•è·è¦è³€é霞鰕壑學è™è¬”鶴寒æ¨æ‚旱汗漢澣瀚罕翰閑閒é™éŸ“割轄函å«å’¸å•£å–Šæª»æ¶µç·˜è‰¦éŠœé™·é¹¹åˆå“ˆç›’蛤閤闔陜亢伉姮嫦巷æ’抗æ­æ¡æ²†æ¸¯ç¼¸è‚›èˆª"],["faa1","行降項亥å•å’³åž“奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸æè‡è¡Œäº«å‘åš®ç¦é„•éŸ¿é¤‰é¥—香噓墟虛許憲櫶ç»è»’歇險驗奕爀赫é©ä¿”峴弦懸晛泫炫玄玹ç¾çœ©ç絃絢縣舷衒見賢鉉顯孑穴血é å«Œä¿ å”夾峽挾浹狹脅脇莢é‹é °äº¨å…„刑型"],["fba1","形泂滎瀅ç炯熒ç©ç‘©èŠèž¢è¡¡é€ˆé‚¢éŽ£é¦¨å…®å½—惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩æ·æ¹–滸澔濠濩çç‹ç¥ç‘šç“ çš“祜糊縞胡芦葫蒿虎號è´è­·è±ªéŽ¬é €é¡¥æƒ‘或酷婚æ˜æ··æ¸¾ç¿é­‚忽惚ç¬å“„弘汞泓洪烘紅虹訌鴻化和嬅樺ç«ç•µ"],["fca1","ç¦ç¦¾èŠ±è¯è©±è­è²¨é´ï¨‹æ“´æ”«ç¢ºç¢»ç©«ä¸¸å–šå¥å®¦å¹»æ‚£æ›æ­¡æ™¥æ¡“渙煥環紈還驩鰥活滑猾è±é—Šå‡°å¹Œå¾¨æ惶愰慌晃晄榥æ³æ¹Ÿæ»‰æ½¢ç…Œç’œçš‡ç¯ç°§è’è—é‘éšé»ƒåŒ¯å›žå»»å¾Šæ¢æ‚”懷晦會檜淮澮ç°çªç¹ªè†¾èŒ´è›”誨賄劃ç²å®–æ©«é„哮嚆å­æ•ˆæ–…曉梟æ¶æ·†"],["fda1","爻肴酵é©ä¾¯å€™åŽšåŽå¼å–‰å—…帿後朽煦ç逅勛勳塤壎焄ç†ç‡»è–°è¨“暈薨喧暄煊è±å‰å–™æ¯å½™å¾½æ®æš‰ç…‡è«±è¼éº¾ä¼‘æºçƒ‹ç•¦è™§æ¤è­Žé·¸å…‡å‡¶åŒˆæ´¶èƒ¸é»‘昕欣炘痕åƒå±¹ç´‡è¨–欠欽歆å¸æ°æ´½ç¿•èˆˆåƒ–凞喜噫å›å§¬å¬‰å¸Œæ†™æ†˜æˆ±æ™žæ›¦ç†™ç†¹ç†ºçŠ§ç¦§ç¨€ç¾²è©°"]]')},73691:e=>{"use strict";e.exports=JSON.parse('[["0","\\u0000",127],["a140"," ,ã€ã€‚.‧;:?ï¼ï¸°â€¦â€¥ï¹ï¹‘﹒·﹔﹕﹖﹗|–︱—︳╴︴ï¹ï¼ˆï¼‰ï¸µï¸¶ï½›ï½ï¸·ï¸¸ã€”〕︹︺ã€ã€‘︻︼《》︽︾〈〉︿﹀「ã€ï¹ï¹‚『ã€ï¹ƒï¹„﹙﹚"],["a1a1","﹛﹜ï¹ï¹žâ€˜â€™â€œâ€ã€ã€žâ€µâ€²ï¼ƒï¼†ï¼Šâ€»Â§ã€ƒâ—‹â—△▲◎☆★◇◆□■▽▼㊣℅¯ ̄_Ë﹉﹊ï¹ï¹Žï¹‹ï¹Œï¹Ÿï¹ ï¹¡ï¼‹ï¼Ã—÷±√<>ï¼â‰¦â‰§â‰ âˆžâ‰’≡﹢",4,"~∩∪⊥∠∟⊿ã’ã‘∫∮∵∴♀♂⊕⊙↑↓â†â†’↖↗↙↘∥∣ï¼"],["a240","\∕﹨$¥〒¢£%@℃℉﹩﹪﹫ã•ãŽœãŽãŽžãŽãŽ¡ãŽŽãŽã„°兙兛兞å…兡兣嗧瓩糎â–",7,"â–â–Žâ–▌▋▊▉┼┴┬┤├▔─│▕┌â”└┘╭"],["a2a1","╮╰╯â•â•žâ•ªâ•¡â—¢â—£â—¥â—¤â•±â•²â•³ï¼",9,"â… ",9,"〡",8,"åå„å…A",25,"ï½",21],["a340","wxyzΑ",16,"Σ",6,"α",16,"σ",6,"ã„…",10],["a3a1","ã„",25,"˙ˉˊˇˋ"],["a3e1","€"],["a440","一乙ä¸ä¸ƒä¹ƒä¹äº†äºŒäººå„¿å…¥å…«å‡ åˆ€åˆåŠ›åŒ•ååœåˆä¸‰ä¸‹ä¸ˆä¸Šä¸«ä¸¸å‡¡ä¹…么也乞于亡兀刃勺åƒå‰å£åœŸå£«å¤•å¤§å¥³å­å­‘孓寸å°å°¢å°¸å±±å·å·¥å·±å·²å·³å·¾å¹²å»¾å¼‹å¼“æ‰"],["a4a1","丑ä¸ä¸ä¸­ä¸°ä¸¹ä¹‹å°¹äºˆäº‘井互五亢ä»ä»€ä»ƒä»†ä»‡ä»ä»Šä»‹ä»„å…ƒå…內六兮公冗凶分切刈勻勾勿化匹åˆå‡å…åžåŽ„å‹åŠå壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛æ°æ°´ç«çˆªçˆ¶çˆ»ç‰‡ç‰™ç‰›çŠ¬çŽ‹ä¸™"],["a540","世丕且丘主ä¹ä¹ä¹Žä»¥ä»˜ä»”仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北åŒä»ŸåŠå‰å¡å å¯å®åŽ»å¯å¤å³å¬å®å©å¨å¼å¸åµå«å¦åªå²å±å°å¥å­å»å››å›šå¤–"],["a5a1","央失奴奶孕它尼巨巧左市布平幼å¼å¼˜å¼—必戊打扔扒扑斥旦朮本未末札正æ¯æ°‘æ°æ°¸æ±æ±€æ°¾çŠ¯çŽ„玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕ä¼ä¼ä¼‘ä¼ä»²ä»¶ä»»ä»°ä»³ä»½ä¼ä¼‹å…‰å…‡å…†å…ˆå…¨"],["a640","å…±å†å†°åˆ—刑划刎刖劣匈匡匠å°å±å‰ååŒåŠååå‹å„å‘ååˆåƒåŽå†å’因回å›åœ³åœ°åœ¨åœ­åœ¬åœ¯åœ©å¤™å¤šå¤·å¤¸å¦„奸妃好她如å¦å­—存宇守宅安寺尖屹州帆并年"],["a6a1","å¼å¼›å¿™å¿–戎戌æˆæˆæ‰£æ‰›æ‰˜æ”¶æ—©æ—¨æ—¬æ—­æ›²æ›³æœ‰æœ½æœ´æœ±æœµæ¬¡æ­¤æ­»æ°–æ±æ±—汙江池æ±æ±•æ±¡æ±›æ±æ±Žç°ç‰Ÿç‰ç™¾ç«¹ç±³ç³¸ç¼¶ç¾Šç¾½è€è€ƒè€Œè€’耳è¿è‚‰è‚‹è‚Œè‡£è‡ªè‡³è‡¼èˆŒèˆ›èˆŸè‰®è‰²è‰¾è™«è¡€è¡Œè¡£è¥¿é˜¡ä¸²äº¨ä½ä½ä½‡ä½—佞伴佛何估ä½ä½‘伽伺伸佃佔似但佣"],["a740","作你伯低伶余ä½ä½ˆä½šå…Œå…‹å…兵冶冷別判利刪刨劫助努劬匣å³åµåå­åžå¾å¦å‘Žå§å‘†å‘ƒå³å‘ˆå‘‚å›å©å‘Šå¹å»å¸å®åµå¶å å¼å‘€å±å«åŸå¬å›ªå›°å›¤å›«åŠå‘å€å"],["a7a1","å‡åŽåœ¾åå圻壯夾å¦å¦’妨妞妣妙妖å¦å¦¤å¦“妊妥å­å­œå­šå­›å®Œå®‹å®å°¬å±€å±å°¿å°¾å²å²‘岔岌巫希åºåº‡åºŠå»·å¼„弟彤形彷役忘忌志å¿å¿±å¿«å¿¸å¿ªæˆ’我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更æŸæŽæææ‘æœæ–æžæ‰æ†æ "],["a840","æ“æ—æ­¥æ¯æ±‚汞沙æ²æ²ˆæ²‰æ²…沛汪決æ²æ±°æ²Œæ±¨æ²–沒汽沃汲汾汴沆汶æ²æ²”沘沂ç¶ç¼ç½ç¸ç‰¢ç‰¡ç‰ ç‹„狂玖甬甫男甸皂盯矣ç§ç§€ç¦¿ç©¶ç³»ç½•è‚–è‚“è‚肘肛肚育良芒"],["a8a1","芋èŠè¦‹è§’言谷豆豕è²èµ¤èµ°è¶³èº«è»Šè¾›è¾°è¿‚迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯ä¾ä¾ä½³ä½¿ä½¬ä¾›ä¾‹ä¾†ä¾ƒä½°ä½µä¾ˆä½©ä½»ä¾–ä½¾ä¾ä¾‘佺兔兒兕兩具其典冽函刻券刷刺到刮制å‰åŠ¾åŠ»å’å”å“å‘å¦å·å¸å¹å–å”å—味呵"],["a940","咖呸咕咀呻呷咄咒咆呼å’呱呶和咚呢周咋命咎固垃å·åªå©å¡å¦å¤å¼å¤œå¥‰å¥‡å¥ˆå¥„奔妾妻委妹妮姑姆å§å§å§‹å§“姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居"],["a9a1","屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往å¾å½¿å½¼å¿å¿ å¿½å¿µå¿¿æ€æ€”怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押æ‹æ‹™æ‹‡æ‹æŠµæ‹šæŠ±æ‹˜æ‹–拗拆抬拎放斧於旺昔易昌昆昂明昀æ˜æ˜•æ˜Š"],["aa40","昇æœæœ‹æ­æž‹æž•æ±æžœæ³æ·æž‡æžæž—æ¯æ°æ¿æž‰æ¾æžæµæžšæž“æ¼æªæ²æ¬£æ­¦æ­§æ­¿æ°“氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油æ³æ²®æ³—泅泱沿治泡泛泊沬泯泜泖泠"],["aaa1","炕炎炒炊炙爬爭爸版牧物狀狎狙狗ç‹çŽ©çŽ¨çŽŸçŽ«çŽ¥ç”½ç–疙疚的盂盲直知矽社祀ç¥ç§‰ç§ˆç©ºç©¹ç«ºç³¾ç½”羌羋者肺肥肢肱股肫肩肴肪肯臥臾èˆèŠ³èŠèŠ™èŠ­èŠ½èŠŸèŠ¹èŠ±èŠ¬èŠ¥èŠ¯èŠ¸èŠ£èŠ°èŠ¾èŠ·è™Žè™±åˆè¡¨è»‹è¿Žè¿”近邵邸邱邶采金長門阜陀阿阻附"],["ab40","陂隹雨é’éžäºŸäº­äº®ä¿¡ä¾µä¾¯ä¾¿ä¿ ä¿‘ä¿ä¿ä¿ƒä¾¶ä¿˜ä¿Ÿä¿Šä¿—ä¾®ä¿ä¿„係俚俎俞侷兗冒冑冠剎剃削å‰å‰Œå‰‹å‰‡å‹‡å‹‰å‹ƒå‹åŒå—å»åŽšå›å’¬å“€å’¨å“Žå“‰å’¸å’¦å’³å“‡å“‚咽咪å“"],["aba1","哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契å¥å¥Žå¥å§œå§˜å§¿å§£å§¨å¨ƒå§¥å§ªå§šå§¦å¨å§»å­©å®£å®¦å®¤å®¢å®¥å°å±Žå±å±å±‹å³™å³’å··å¸å¸¥å¸Ÿå¹½åº åº¦å»ºå¼ˆå¼­å½¥å¾ˆå¾…徊律徇後徉怒æ€æ€ æ€¥æ€Žæ€¨ææ°æ¨æ¢æ†æƒæ¬æ«æªæ¤æ‰æ‹œæŒ–按拼拭æŒæ‹®æ‹½æŒ‡æ‹±æ‹·"],["ac40","拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔æŸæŸ¬æž¶æž¯æŸµæŸ©æŸ¯æŸ„柑枴柚查枸æŸæŸžæŸ³æž°æŸ™æŸ¢æŸæŸ’歪殃殆段毒毗氟泉洋洲洪æµæ´¥æ´Œæ´±æ´žæ´—"],["aca1","活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷çŠçŽ»çŽ²çç€çŽ³ç”šç”­ç•ç•Œç•Žç•‹ç–«ç–¤ç–¥ç–¢ç–£ç™¸çš†çš‡çšˆç›ˆç›†ç›ƒç›…çœç›¹ç›¸çœ‰çœ‹ç›¾ç›¼çœ‡çŸœç ‚研砌ç ç¥†ç¥‰ç¥ˆç¥‡ç¦¹ç¦ºç§‘秒秋穿çªç«¿ç«½ç±½ç´‚紅紀紉紇約紆缸美羿耄"],["ad40","è€è€è€‘耶胖胥胚胃胄背胡胛胎胞胤èƒè‡´èˆ¢è‹§èŒƒèŒ…苣苛苦茄若茂茉苒苗英èŒè‹œè‹”苑苞苓苟苯茆è™è™¹è™»è™ºè¡è¡«è¦è§”計訂訃貞負赴赳趴è»è»Œè¿°è¿¦è¿¢è¿ªè¿¥"],["ada1","迭迫迤迨郊郎éƒéƒƒé…‹é…Šé‡é–‚é™é™‹é™Œé™é¢é©éŸ‹éŸ­éŸ³é é¢¨é£›é£Ÿé¦–香乘亳倌å€å€£ä¿¯å€¦å€¥ä¿¸å€©å€–倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢å‡å‡Œå‡†å‡‹å‰–剜剔剛å‰åŒªå¿åŽŸåŽåŸå“¨å”å”唷哼哥哲唆哺唔哩哭員唉哮哪"],["ae40","哦唧唇哽å”圃圄埂埔埋埃堉å¤å¥—奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展å±å³­å³½å³»å³ªå³¨å³°å³¶å´å³´å·®å¸­å¸«åº«åº­åº§å¼±å¾’徑å¾æ™"],["aea1","æ£æ¥ææ•æ­æ©æ¯æ‚„æ‚Ÿæ‚šæ‚悔悌悅悖扇拳挈拿æŽæŒ¾æŒ¯æ•æ‚æ†ææ‰æŒºæ挽挪挫挨ææŒæ•ˆæ•‰æ–™æ—旅時晉æ™æ™ƒæ™’晌晅æ™æ›¸æœ”朕朗校核案框桓根桂桔栩梳栗桌桑栽柴æ¡æ¡€æ ¼æ¡ƒæ ªæ¡…æ “æ ˜æ¡æ®Šæ®‰æ®·æ°£æ°§æ°¨æ°¦æ°¤æ³°æµªæ¶•æ¶ˆæ¶‡æµ¦æµ¸æµ·æµ™æ¶“"],["af40","浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈çƒçˆ¹ç‰¹ç‹¼ç‹¹ç‹½ç‹¸ç‹·çŽ†ç­ç‰ç®ç çªçžç•”ç•ç•œç•šç•™ç–¾ç—…症疲疳疽疼疹痂疸皋皰益ç›ç›Žçœ©çœŸçœ çœ¨çŸ©ç °ç §ç ¸ç ç ´ç ·"],["afa1","砥砭砠砟砲祕ç¥ç¥ ç¥Ÿç¥–神ç¥ç¥—祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純ç´ç´•ç´šç´œç´ç´™ç´›ç¼ºç½Ÿç¾”ç¿…ç¿è€†è€˜è€•è€™è€—耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀èˆèˆªèˆ«èˆ¨èˆ¬èŠ»èŒ«è’è”èŠèŒ¸èè‰èŒµèŒ´è茲茹茶茗è€èŒ±èŒ¨èƒ"],["b040","虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷è¢è¢‚衽衹記è¨è¨Žè¨Œè¨•è¨Šè¨—訓訖è¨è¨‘豈豺豹財貢起躬軒軔è»è¾±é€é€†è¿·é€€è¿ºè¿´é€ƒè¿½é€…迸邕郡éƒéƒ¢é…’é…酌釘é‡é‡—釜釙閃院陣陡"],["b0a1","é™›é™é™¤é™˜é™žéš»é£¢é¦¬éª¨é«˜é¬¥é¬²é¬¼ä¹¾åºå½åœå‡åƒåŒåšå‰å¥å¶åŽå•åµå´å·åå€å¯å­å…œå†•å‡°å‰ªå‰¯å‹’務勘動åŒåŒåŒ™åŒ¿å€åŒ¾åƒæ›¼å•†å•ªå•¦å•„啞啡啃啊唱啖å•å••å”¯å•¤å”¸å”®å•œå”¬å•£å”³å•å•—圈國圉域堅堊堆埠埤基堂堵執培夠奢娶å©å©‰å©¦å©ªå©€"],["b140","娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜å±å´‡å´†å´Žå´›å´–崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜æ¿æ‚£æ‚‰æ‚ æ‚¨æƒ‹æ‚´æƒ¦æ‚½"],["b1a1","情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控æ²æŽ–探接æ·æ§æŽ˜æŽªæ±æŽ©æŽ‰æŽƒæŽ›æ«æŽ¨æŽ„授掙採掬排æŽæŽ€æ»æ©æ¨æºæ•æ•–救教敗啟æ•æ•˜æ••æ•”斜斛斬æ—旋旌旎æ™æ™šæ™¤æ™¨æ™¦æ™žæ›¹å‹—望æ¢æ¢¯æ¢¢æ¢“梵桿桶梱梧梗械梃棄梭梆梅梔æ¢æ¢¨æ¢Ÿæ¢¡æ¢‚欲殺"],["b240","毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽çŠçŒœçŒ›çŒ–猓猙率ç…çŠçƒç†ç¾ç瓠瓶"],["b2a1","瓷甜產略畦畢異ç–痔痕疵痊ç—皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜èŠè†è„¯è„–脣脫脩脰脤舂舵舷舶船莎莞莘è¸èŽ¢èŽ–莽莫莒莊莓莉莠è·è»è¼"],["b340","莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖è¢è¢‹è¦“è¦è¨ªè¨è¨£è¨¥è¨±è¨­è¨Ÿè¨›è¨¢è±‰è±šè²©è²¬è²«è²¨è²ªè²§èµ§èµ¦è¶¾è¶ºè»›è»Ÿé€™é€é€šé€—連速é€é€é€•é€žé€ é€é€¢é€–逛途"],["b3a1","部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢å‚傅備傑傀傖傘傚最凱割剴創剩勞å‹å‹›åšåŽ¥å•»å–€å–§å•¼å–Šå–喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙åœå ¯å ªå ´å ¤å °å ±å ¡å å  å£¹å£ºå¥ "],["b440","婷媚婿媒媛媧孳孱寒富寓å¯å°Šå°‹å°±åµŒåµå´´åµ‡å·½å¹…帽幀幃幾廊å»å»‚廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌ææ€æ©æ‰æ†æ"],["b4a1","æ’æ£ææ¡æ–æ­æ®æ¶æ´æªæ›æ‘’æšæ¹æ•žæ•¦æ•¢æ•£æ–‘æ–斯普晰晴晶景暑智晾晷曾替期æœæ£ºæ£•æ£ æ£˜æ£—椅棟棵森棧棹棒棲棣棋æ£æ¤æ¤’椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴æ¹æ¸ºæ¸¬æ¹ƒæ¸æ¸¾æ»‹"],["b540","溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩çºçªç³ç¢ç¥çµç¶ç´ç¯ç›ç¦ç¨ç”¥ç”¦ç•«ç•ªç—¢ç—›ç—£ç—™ç—˜ç—žç— ç™»ç™¼çš–皓皴盜ç短ç¡ç¡¬ç¡¯ç¨ç¨ˆç¨‹ç¨…稀窘"],["b5a1","窗窖童竣等策筆ç­ç­’ç­”ç­ç­‹ç­ç­‘粟粥絞çµçµ¨çµ•ç´«çµ®çµ²çµ¡çµ¦çµ¢çµ°çµ³å–„翔翕耋è’肅腕腔腋腑腎脹腆脾腌腓腴舒舜è©èƒè¸èè è…è‹èè¯è±è´è‘—èŠè°èŒèŒè½è²èŠè¸èŽè„èœè‡è”èŸè™›è›Ÿè›™è›­è›”蛛蛤è›è›žè¡—è£è£‚袱覃視註詠評詞証è©"],["b640","詔詛è©è©†è¨´è¨ºè¨¶è©–象貂貯貼貳貽è³è²»è³€è²´è²·è²¶è²¿è²¸è¶Šè¶…è¶è·Žè·è·‹è·šè·‘跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥é‡éˆ”鈕鈣鈉鈞éˆéˆéˆ‡éˆ‘é–”é–é–‹é–‘"],["b6a1","間閒閎隊階隋陽隅隆éšé™²éš„é›é›…雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃é»é»‘亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧å«å«‰å«Œåª¾åª½åª¼"],["b740","媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚æ„慈感想愛惹æ„愈慎慌慄æ…愾愴愧æ„愆愷戡戢æ“æ¾æžæªæ­æ½æ¬ææœæ”ææ¶æ–æ—æ†æ•¬æ–Ÿæ–°æš—暉暇暈暖暄暘æšæœƒæ¦”業"],["b7a1","楚楷楠楔極椰概楊楨楫楞楓楹榆æ¥æ¥£æ¥›æ­‡æ­²æ¯€æ®¿æ¯“毽溢溯滓溶滂æºæºæ»‡æ»…溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷ç…猿猾瑯瑚瑕瑟瑞ç‘ç¿ç‘™ç‘›ç‘œç•¶ç•¸ç˜€ç—°ç˜ç—²ç—±ç—ºç—¿ç—´ç—³ç›žç›Ÿç›ç«ç¦çžç£"],["b840","ç¹çªç¬çœç¥ç¨ç¢çŸ®ç¢Žç¢°ç¢—碘碌碉硼碑碓硿祺祿ç¦è¬ç¦½ç¨œç¨šç¨ ç¨”稟稞窟窠筷節筠筮筧粱粳粵經絹綑ç¶ç¶çµ›ç½®ç½©ç½ªç½²ç¾©ç¾¨ç¾¤è–è˜è‚†è‚„腱腰腸腥腮腳腫"],["b8a1","腹腺腦舅艇蒂葷è½è±è‘µè‘¦è‘«è‘‰è‘¬è‘›è¼èµè‘¡è‘£è‘©è‘­è‘†è™žè™œè™Ÿè›¹èœ“蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘è£è£¡è£Šè£•è£’覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊"],["b940","辟農é‹éŠé“é‚é”逼é•éé‡ééŽéé‘逾é鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉é‰é‰…鈹鈿鉚閘隘隔隕é›é›‹é›‰é›Šé›·é›»é›¹é›¶é–é´é¶é é ‘頓頊頒頌飼飴"],["b9a1","飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕åƒåƒ‘僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉å˜å˜Žå—·å˜–嘟嘈å˜å—¶åœ˜åœ–塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察å°å±¢å¶„嶇幛幣幕幗幔廓廖弊彆彰徹慇"],["ba40","愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧æ´æ‘­æ‘»æ•²æ–¡æ——旖暢暨æšæ¦œæ¦¨æ¦•æ§æ¦®æ§“構榛榷榻榫榴æ§æ§æ¦­æ§Œæ¦¦æ§ƒæ¦£æ­‰æ­Œæ°³æ¼³æ¼”滾漓滴漩漾漠漬æ¼æ¼‚æ¼¢"],["baa1","滿滯漆漱漸漲漣漕漫漯澈漪滬æ¼æ»²æ»Œæ»·ç†”熙煽熊熄熒爾犒犖ç„ç瑤瑣瑪瑰瑭甄疑瘧ç˜ç˜‹ç˜‰ç˜“盡監瞄ç½ç¿ç¡ç£ç¢Ÿç¢§ç¢³ç¢©ç¢£ç¦Žç¦ç¦ç¨®ç¨±çªªçª©ç«­ç«¯ç®¡ç®•ç®‹ç­µç®—ç®ç®”ç®ç®¸ç®‡ç®„粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬"],["bb40","ç½°ç¿ ç¿¡ç¿Ÿèžèšè‚‡è…膀è†è†ˆè†Šè…¿è†‚臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓è’蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘è•èœ·èœ©è£³è¤‚裴裹裸製裨褚裯誦誌語誣èªèª¡èª“誤"],["bba1","說誥誨誘誑誚誧豪è²è²Œè³“賑賒赫趙趕跼輔輒輕輓辣é é˜éœé£é™éžé¢éé›é„™é„˜é„žé…µé…¸é…·é…´é‰¸éŠ€éŠ…銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需é¼éž…韶頗領颯颱餃餅餌餉é§éª¯éª°é«¦é­é­‚鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜"],["bc40","劇劈劉åŠåŠŠå‹°åŽ²å˜®å˜»å˜¹å˜²å˜¿å˜´å˜©å™“噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履å¶å¶”幢幟幡廢廚廟å»å»£å» å½ˆå½±å¾·å¾µæ…¶æ…§æ…®æ…慕憂"],["bca1","慼慰慫慾憧æ†æ†«æ†Žæ†¬æ†šæ†¤æ†”憮戮摩摯摹撞撲撈æ’撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨æ¨æ¨žæ¨™æ§½æ¨¡æ¨“樊槳樂樅槭樑æ­æ­Žæ®¤æ¯…毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛çŽç—ç‘©ç’‹ç’ƒ"],["bd40","瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼ç£ç¨¿ç¨¼ç©€ç¨½ç¨·ç¨»çª¯çª®ç®­ç®±ç¯„箴篆篇ç¯ç® ç¯Œç³Šç· ç·´ç·¯ç·»ç·˜ç·¬ç·ç·¨ç·£ç·šç·žç·©ç¶žç·™ç·²ç·¹ç½µç½·ç¾¯"],["bda1","翩耦膛膜è†è† è†šè†˜è”—蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂è´è¶è è¦è¸è¨è™è—èŒè“è¡›è¡è¤è¤‡è¤’褓褕褊誼諒談諄誕請諸課諉諂調誰論è«èª¶èª¹è«›è±Œè±Žè±¬è³ è³žè³¦è³¤è³¬è³­è³¢è³£è³œè³ªè³¡èµ­è¶Ÿè¶£è¸«è¸è¸è¸¢è¸è¸©è¸Ÿè¸¡è¸žèººè¼è¼›è¼Ÿè¼©è¼¦è¼ªè¼œè¼ž"],["be40","è¼¥é©é®é¨é­é·é„°é„­é„§é„±é†‡é†‰é†‹é†ƒé‹…銻銷鋪銬鋤é‹éŠ³éŠ¼é‹’鋇鋰銲閭閱霄霆震霉é éžéž‹éžé ¡é «é œé¢³é¤Šé¤“餒餘é§é§é§Ÿé§›é§‘駕駒駙骷髮髯鬧魅魄魷魯鴆鴉"],["bea1","鴃麩麾黎墨齒儒儘儔å„儕冀冪å‡åŠ‘劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶å£å¢¾å£‡å£…奮å¬å¬´å­¸å¯°å°Žå½Šæ†²æ†‘憩憊æ‡æ†¶æ†¾æ‡Šæ‡ˆæˆ°æ“…æ“擋撻撼據擄擇擂æ“撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡"],["bf40","濃澤æ¿æ¾§æ¾³æ¿€æ¾¹æ¾¶æ¾¦æ¾ æ¾´ç†¾ç‡‰ç‡ç‡’燈燕熹燎燙燜燃燄ç¨ç’œç’£ç’˜ç’Ÿç’žç“¢ç”Œç”瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦ç©ç©Žç©†ç©Œç©‹çªºç¯™ç°‘築篤篛篡篩篦糕糖縊"],["bfa1","縑縈縛縣縞ç¸ç¸‰ç¸ç½¹ç¾²ç¿°ç¿±ç¿®è€¨è†³è†©è†¨è‡»èˆˆè‰˜è‰™è•Šè•™è•ˆè•¨è•©è•ƒè•‰è•­è•ªè•žèžƒèžŸèžžèž¢èžè¡¡è¤ªè¤²è¤¥è¤«è¤¡è¦ªè¦¦è«¦è«ºè««è«±è¬€è«œè«§è«®è«¾è¬è¬‚諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦éµé´é¸é²é¼éºé„´é†’錠錶鋸錳錯錢鋼錫錄錚"],["c040","éŒéŒ¦éŒ¡éŒ•éŒ®éŒ™é–»éš§éš¨éšªé›•éœŽéœ‘霖éœéœ“éœé›éœé¦éž˜é °é ¸é »é ·é ­é ¹é ¤é¤é¤¨é¤žé¤›é¤¡é¤šé§­é§¢é§±éª¸éª¼é«»é«­é¬¨é®‘鴕鴣鴦鴨鴒鴛默黔é¾é¾œå„ªå„Ÿå„¡å„²å‹µåšŽåš€åšåš…嚇"],["c0a1","åšå£•å£“壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗æªæª æ­œæ®®æ¯šæ°ˆæ¿˜æ¿±æ¿Ÿæ¿ æ¿›æ¿¤æ¿«æ¿¯æ¾€æ¿¬æ¿¡æ¿©æ¿•æ¿®æ¿°ç‡§ç‡Ÿç‡®ç‡¦ç‡¥ç‡­ç‡¬ç‡´ç‡ çˆµç‰†ç°ç²ç’©ç’°ç’¦ç’¨ç™†ç™‚癌盪瞳瞪瞰瞬"],["c140","瞧瞭矯磷磺磴磯ç¤ç¦§ç¦ªç©—窿簇ç°ç¯¾ç¯·ç°Œç¯ ç³ ç³œç³žç³¢ç³Ÿç³™ç³ç¸®ç¸¾ç¹†ç¸·ç¸²ç¹ƒç¸«ç¸½ç¸±ç¹…ç¹ç¸´ç¸¹ç¹ˆç¸µç¸¿ç¸¯ç½„翳翼è±è²è°è¯è³è‡†è‡ƒè†ºè‡‚臀膿膽臉膾臨舉艱薪"],["c1a1","薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠è¬è¬„è¬è±è°¿è±³è³ºè³½è³¼è³¸è³»è¶¨è¹‰è¹‹è¹ˆè¹Šè½„輾轂轅輿é¿é½é‚„é‚邂邀鄹醣醞醜é鎂錨éµéŠé¥é‹éŒ˜é¾é¬é›é°éšé”闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵é¨"],["c240","駿鮮鮫鮪鮭鴻鴿麋é»é»žé»œé»é»›é¼¾é½‹å¢åš•åš®å£™å£˜å¬¸å½æ‡£æˆ³æ“´æ“²æ“¾æ”†æ“ºæ“»æ“·æ–·æ›œæœ¦æª³æª¬æ«ƒæª»æª¸æ«‚檮檯歟歸殯瀉瀋濾瀆濺瀑ç€ç‡»ç‡¼ç‡¾ç‡¸ç·çµç’§ç’¿ç”•ç™–癘"],["c2a1","癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻è·è¶è‡è‡èˆŠè—è–©è—è—藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫è±è´…蹙蹣蹦蹤蹟蹕軀轉è½é‚‡é‚ƒé‚ˆé†«é†¬é‡éŽ”鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖é—闕離雜雙雛雞霤鞣鞦"],["c340","鞭韹é¡é¡é¡Œé¡Žé¡“颺餾餿餽餮馥騎é«é¬ƒé¬†é­é­Žé­é¯Šé¯‰é¯½é¯ˆé¯€éµ‘éµéµ é» é¼•é¼¬å„³åš¥å£žå£Ÿå£¢å¯µé¾å»¬æ‡²æ‡·æ‡¶æ‡µæ”€æ”æ› æ›æ«¥æ«æ«šæ«“瀛瀟瀨瀚ç€ç€•ç€˜çˆ†çˆç‰˜çŠ¢ç¸"],["c3a1","çºç’½ç“Šç“£ç–‡ç–†ç™Ÿç™¡çŸ‡ç¤™ç¦±ç©«ç©©ç°¾ç°¿ç°¸ç°½ç°·ç±€ç¹«ç¹­ç¹¹ç¹©ç¹ªç¾…繳羶羹羸臘藩è—藪藕藤藥藷蟻蠅è èŸ¹èŸ¾è¥ è¥Ÿè¥–襞è­è­œè­˜è­‰è­šè­Žè­è­†è­™è´ˆè´Šè¹¼è¹²èº‡è¹¶è¹¬è¹ºè¹´è½”轎辭邊邋醱醮é¡é‘éŸéƒéˆéœéé–é¢éé˜é¤é—é¨é—œéš´é›£éœªéœ§é¡éŸœéŸ»é¡ž"],["c440","願顛颼饅饉騖騙é¬é¯¨é¯§é¯–鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲çˆç»ç“癢癥礦礪礬礫竇競籌籃ç±ç³¯ç³°è¾®ç¹½ç¹¼"],["c4a1","纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫è´è´èº‰èºèº…躂醴釋é˜éƒé½é—¡éœ°é£„饒饑馨騫騰騷騵鰓é°é¹¹éºµé»¨é¼¯é½Ÿé½£é½¡å„·å„¸å›å›€å›‚夔屬å·æ‡¼æ‡¾æ”攜斕曩櫻欄櫺殲çŒçˆ›çŠ§ç“–瓔癩矓ç±çºçºŒç¾¼è˜—蘭蘚蠣蠢蠡蠟襪襬覽譴"],["c540","護譽贓躊èºèº‹è½Ÿè¾¯é†ºé®é³éµéºé¸é²é«é—¢éœ¸éœ¹éœ²éŸ¿é¡§é¡¥é¥—驅驃驀騾é«é­”魑鰭鰥鶯鶴鷂鶸éºé»¯é¼™é½œé½¦é½§å„¼å„»å›ˆå›Šå›‰å­¿å·”巒彎懿攤權歡ç‘ç˜çŽ€ç“¤ç–Šç™®ç™¬"],["c5a1","禳籠籟è¾è½è‡Ÿè¥²è¥¯è§¼è®€è´–贗躑躓轡酈鑄鑑鑒霽霾韃éŸé¡«é¥•é©•é©é«’鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬æ¬ç“šç«Šç±¤ç±£ç±¥çº“纖纔臢蘸蘿蠱變é‚é‚鑣鑠鑤é¨é¡¯é¥œé©šé©›é©—髓體髑鱔鱗鱖鷥麟黴囑壩攬çžç™±ç™²çŸ—ç½ç¾ˆè ¶è ¹è¡¢è®“è®’"],["c640","讖艷贛釀鑪é‚éˆé„韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖ç£ç±¬ç±®è »è§€èº¡é‡é‘²é‘°é¡±é¥žé«–鬣黌ç¤çŸšè®šé‘·éŸ‰é©¢é©¥çºœè®œèºªé‡…鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲"],["c940","乂乜凵匚厂万丌乇äºå›—兀屮彳ä¸å†‡ä¸Žä¸®äº“仂仉仈冘勼å¬åŽ¹åœ å¤ƒå¤¬å°å·¿æ—¡æ®³æ¯Œæ°”爿丱丼仨仜仩仡ä»ä»šåˆŒåŒœåŒåœ¢åœ£å¤—夯å®å®„尒尻屴屳帄庀庂忉戉æ‰æ°•"],["c9a1","氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈ä¼ä¼‚伅伢伓伄仴伒冱刓刉åˆåŠ¦åŒ¢åŒŸå厊å‡å›¡å›Ÿåœ®åœªåœ´å¤¼å¦€å¥¼å¦…奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔å¿æ‰œæ‰žæ‰¤æ‰¡æ‰¦æ‰¢æ‰™æ‰ æ‰šæ‰¥æ—¯æ—®æœ¾æœ¹æœ¸æœ»æœºæœ¿æœ¼æœ³æ°˜æ±†æ±’汜æ±æ±Šæ±”汋"],["ca40","汌ç±ç‰žçŠ´çŠµçŽŽç”ªç™¿ç©µç½‘艸艼芀艽艿è™è¥¾é‚™é‚—邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟ä½ä½˜ä¼­ä¼³ä¼¿ä½¡å†å†¹åˆœåˆžåˆ¡åŠ­åŠ®åŒ‰å£å²åŽŽåŽå°å·åªå‘”å‘…å™åœå¥å˜"],["caa1","å½å‘å‘å¨å¤å‘‡å›®å›§å›¥åå…åŒå‰å‹å’夆奀妦妘妠妗妎妢å¦å¦å¦§å¦¡å®Žå®’尨尪å²å²å²ˆå²‹å²‰å²’岊岆岓岕巠帊帎庋庉庌庈åºå¼…å¼å½¸å½¶å¿’å¿‘å¿å¿­å¿¨å¿®å¿³å¿¡å¿¤å¿£å¿ºå¿¯å¿·å¿»æ€€å¿´æˆºæŠƒæŠŒæŠŽæŠæŠ”抇扱扻扺扰æŠæŠˆæ‰·æ‰½æ‰²æ‰´æ”·æ—°æ—´æ—³æ—²æ—µæ…æ‡"],["cb40","æ™æ•æŒæˆæææšæ‹æ¯æ°™æ°šæ±¸æ±§æ±«æ²„沋æ²æ±±æ±¯æ±©æ²šæ±­æ²‡æ²•æ²œæ±¦æ±³æ±¥æ±»æ²Žç´çºç‰£çŠ¿çŠ½ç‹ƒç‹†ç‹çŠºç‹…玕玗玓玔玒町甹疔疕çšç¤½è€´è‚•è‚™è‚è‚’è‚œèŠèŠèŠ…芎芑芓"],["cba1","芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹ä¾ä½¸ä¾ä¾œä¾”侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿å’咑咂咈呫呺呾呥呬呴呦å’呯呡呠咘呣呧呤囷囹å¯å²å­å«å±å°å¶åž€åµå»å³å´å¢"],["cc40","å¨å½å¤Œå¥…妵妺å§å§Žå¦²å§Œå§å¦¶å¦¼å§ƒå§–妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧å²å²¥å²¶å²°å²¦å¸—帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋"],["cca1","怴怊怗怳怚怞怬怢æ€æ€æ€®æ€“怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋æ˜æ˜…旽昑æ˜æ›¶æœŠæž…æ¬æžŽæž’æ¶æ»æž˜æž†æž„æ´æžæžŒæºæžŸæž‘枙枃æ½æžæ¸æ¹æž”欥殀歾毞æ°æ²“泬泫泮泙沶泔沭泧沷æ³æ³‚沺泃泆泭泲"],["cd40","æ³’æ³æ²´æ²Šæ²æ²€æ³žæ³€æ´°æ³æ³‡æ²°æ³¹æ³æ³©æ³‘炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬çŽç“瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺"],["cda1","矷祂礿秅穸穻竻籵糽耵è‚肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓è¿è¿–迕迗邲邴邯邳邰阹阽阼阺陃ä¿ä¿…俓侲俉俋ä¿ä¿”俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽å¼åŽ—厖厙厘咺咡咭咥å“"],["ce40","哃èŒå’·å’®å“–咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗åžåž›åž”垘åžåž™åž¥åžšåž•å£´å¤å¥“姡姞姮娀姱å§å§ºå§½å§¼å§¶å§¤å§²å§·å§›å§©å§³å§µå§ å§¾å§´å§­å®¨å±Œå³å³˜å³Œå³—峋峛"],["cea1","峞峚峉峇峊峖峓峔å³å³ˆå³†å³Žå³Ÿå³¸å·¹å¸¡å¸¢å¸£å¸ å¸¤åº°åº¤åº¢åº›åº£åº¥å¼‡å¼®å½–徆怷怹æ”æ²æžæ…æ“æ‡æ‰æ›æŒæ€æ‚æŸæ€¤æ„æ˜æ¦æ®æ‰‚扃æ‹æŒæŒ‹æ‹µæŒŽæŒƒæ‹«æ‹¹æŒæŒŒæ‹¸æ‹¶æŒ€æŒ“挔拺挕拻拰æ•æ•ƒæ–ªæ–¿æ˜¶æ˜¡æ˜²æ˜µæ˜œæ˜¦æ˜¢æ˜³æ˜«æ˜ºæ˜æ˜´æ˜¹æ˜®æœæœæŸæŸ²æŸˆæžº"],["cf40","柜枻柸柘柀枷柅柫柤柟枵æŸæž³æŸ·æŸ¶æŸ®æŸ£æŸ‚枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀æ´æµ‚"],["cfa1","æ´æ´˜æ´·æ´ƒæ´æµ€æ´‡æ´ æ´¬æ´ˆæ´¢æ´‰æ´ç‚·ç‚Ÿç‚¾ç‚±ç‚°ç‚¡ç‚´ç‚µç‚©ç‰ç‰‰ç‰Šç‰¬ç‰°ç‰³ç‰®ç‹Šç‹¤ç‹¨ç‹«ç‹Ÿç‹ªç‹¦ç‹£çŽ…çŒç‚çˆç…玹玶玵玴ç«çŽ¿ç‡çŽ¾çƒç†çŽ¸ç‹ç“¬ç“®ç”®ç•‡ç•ˆç–§ç–ªç™¹ç›„眈眃眄眅眊盷盻盺矧矨砆砑砒砅ç ç ç Žç ‰ç ƒç “祊祌祋祅祄秕ç§ç§ç§–秎窀"],["d040","穾竑笀ç¬ç±ºç±¸ç±¹ç±¿ç²€ç²ç´ƒç´ˆç´ç½˜ç¾‘ç¾ç¾¾è€‡è€Žè€è€”耷胘胇胠胑胈胂èƒèƒ…胣胙胜胊胕胉èƒèƒ—胦èƒè‡¿èˆ¡èŠ”苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪"],["d0a1","苤苠苺苳苭虷虴虼虳è¡è¡Žè¡§è¡ªè¡©è§“訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔é™é™‘陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢å‹åŒŽåŽžå”¦å“¢å”—唒哧哳哤唚哿唄唈哫唑唅哱"],["d140","唊哻哷哸哠唎唃唋åœåœ‚埌堲埕埒垺埆垽垼垸垶垿埇åŸåž¹åŸå¤Žå¥Šå¨™å¨–娭娮娕å¨å¨—娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧ææšæ§"],["d1a1","æ悢悈悀悒æ‚æ‚悃悕悛悗悇悜悎戙扆拲æŒæ–挬æ„æ…挶æƒæ¤æŒ¹æ‹æŠæŒ¼æŒ©æ挴æ˜æ”æ™æŒ­æ‡æŒ³æšæ‘挸æ—æ€æˆæ•Šæ•†æ—†æ—ƒæ—„旂晊晟晇晑朒朓栟栚桉栲栳栻桋æ¡æ –栱栜栵栫栭栯桎桄栴æ æ ’栔栦栨栮æ¡æ ºæ ¥æ  æ¬¬æ¬¯æ¬­æ¬±æ¬´æ­­è‚‚殈毦毤"],["d240","毨毣毢毧氥浺浣浤浶æ´æµ¡æ¶’浘浢浭浯涑æ¶æ·¯æµ¿æ¶†æµžæµ§æµ æ¶—浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵æ¶çƒœçƒ“烑çƒçƒ‹ç¼¹çƒ¢çƒ—烒烞烠烔çƒçƒ…烆烇烚烎烡牂牸"],["d2a1","牷牶猀狺狴狾狶狳狻çŒç“ç™ç¥ç–玼ç§ç£ç©çœç’ç›ç”ççšç—ç˜ç¨ç“žç“Ÿç“´ç“µç”¡ç•›ç•Ÿç–°ç—疻痄痀疿疶疺皊盉çœçœ›çœçœ“眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛ç¥ç¥œç¥“祒祑秫秬秠秮秭秪秜秞ç§çª†çª‰çª…窋窌窊窇竘ç¬"],["d340","笄笓笅ç¬ç¬ˆç¬Šç¬Žç¬‰ç¬’粄粑粊粌粈ç²ç²…ç´žç´ç´‘紎紘紖紓紟紒ç´ç´Œç½œç½¡ç½žç½ ç½ç½›ç¾–羒翃翂翀耖耾耹胺胲胹胵è„胻脀èˆèˆ¯èˆ¥èŒ³èŒ­è„茙è‘茥è–茿è茦茜茢"],["d3a1","è‚èŽèŒ›èŒªèŒˆèŒ¼è茖茤茠茷茯茩è‡è…èŒè“茞茬è‹èŒ§èˆè™“虒蚢蚨蚖èšèš‘蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎èšèšèš”衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤é…"],["d440","é…Žé…釕釢釚陜陟隼飣髟鬯乿å°åªå¡åžå å“å‹åå²åˆååå›åŠå¢å€•å…åŸå©å«å£å¤å†å€å®å³å—å‘å‡å‰«å‰­å‰¬å‰®å‹–勓匭厜啵啶唼å•å•å”´å”ªå•‘啢唶唵唰啒啅"],["d4a1","唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳åŸå ‡åŸ®åŸ£åŸ²åŸ¥åŸ¬åŸ¡å ŽåŸ¼å åŸ§å å ŒåŸ±åŸ©åŸ°å å „奜婠婘婕婧婞娸娵婭å©å©Ÿå©¥å©¬å©“婤婗婃å©å©’婄婛婈媎娾å©å¨¹å©Œå©°å©©å©‡å©‘婖婂婜孲孮å¯å¯€å±™å´žå´‹å´å´šå´ å´Œå´¨å´å´¦å´¥å´"],["d540","崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊æ‚悆悾悰悺惓惔æƒæƒ¤æƒ™æƒæƒˆæ‚±æƒ›æ‚·æƒŠæ‚¿æƒƒæƒæƒ€æŒ²æ¥æŽŠæŽ‚æ½æŽ½æŽžæŽ­æŽæŽ—掫掎æ¯æŽ‡æŽæ®æŽ¯æµæŽœæ­æŽ®æ¼æŽ¤æŒ»æŽŸ"],["d5a1","æ¸æŽ…æŽæŽ‘æŽæ°æ•“æ—晥晡晛晙晜晢朘桹梇æ¢æ¢œæ¡­æ¡®æ¢®æ¢«æ¥–桯梣梬梩桵桴梲æ¢æ¡·æ¢’桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑æ®æ®æ®Žæ®Œæ°ªæ·€æ¶«æ¶´æ¶³æ¹´æ¶¬æ·©æ·¢æ¶·æ·¶æ·”渀淈淠淟淖涾淥淜æ·æ·›æ·´æ·Šæ¶½æ·­æ·°æ¶ºæ·•æ·‚æ·æ·‰"],["d640","æ·æ·²æ·“淽淗æ·æ·£æ¶»çƒºç„烷焗烴焌烰焄烳ç„烼烿焆焓焀烸烶焋焂焎牾牻牼牿çŒçŒ—猇猑猘猊猈狿çŒçŒžçŽˆç¶ç¸çµç„çç½ç‡ç€çºç¼ç¿çŒç‹ç´çˆç•¤ç•£ç—Žç—’ç—"],["d6a1","痋痌痑ç—çšçš‰ç›“眹眯眭眱眲眴眳眽眥眻眵硈硒硉ç¡ç¡Šç¡Œç ¦ç¡…ç¡ç¥¤ç¥§ç¥©ç¥ªç¥£ç¥«ç¥¡ç¦»ç§ºç§¸ç§¶ç§·çªçª”çªç¬µç­‡ç¬´ç¬¥ç¬°ç¬¢ç¬¤ç¬³ç¬˜ç¬ªç¬ç¬±ç¬«ç¬­ç¬¯ç¬²ç¬¸ç¬šç¬£ç²”粘粖粣紵紽紸紶紺絅紬紩çµçµ‡ç´¾ç´¿çµŠç´»ç´¨ç½£ç¾•ç¾œç¾ç¾›ç¿Šç¿‹ç¿ç¿ç¿‘翇ç¿ç¿‰è€Ÿ"],["d740","耞耛è‡èƒèˆè„˜è„¥è„™è„›è„­è„Ÿè„¬è„žè„¡è„•è„§è„脢舑舸舳舺舴舲艴èŽèŽ£èŽ¨èŽèºè³èŽ¤è´èŽèŽèŽ•èŽ™èµèŽ”莩è½èŽƒèŽŒèŽèŽ›èŽªèŽ‹è¾èŽ¥èŽ¯èŽˆèŽ—莰è¿èŽ¦èŽ‡èŽ®è¶èŽšè™™è™–èš¿èš·"],["d7a1","蛂è›è›…蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜è±è±½è²¥èµ½èµ»èµ¹è¶¼è·‚趹趿è·è»˜è»žè»è»œè»—軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪"],["d840","釫釷釨釮镺閆閈陼陭陫陱陯隿éªé „飥馗傛傕傔傞傋傣傃傌傎å‚å¨å‚œå‚’傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈å–å–µå–喣喒喤啽喌喦啿喕喡喎圌堩堷"],["d8a1","堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜åªåª“åªå¯ªå¯å¯‹å¯”寑寊寎尌尰崷嵃嵫åµåµ‹å´¿å´µåµ‘嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄å¹å½˜å¾¦å¾¥å¾«æƒ‰æ‚¹æƒŒæƒ¢æƒŽæƒ„æ„”"],["d940","惲愊愖愅惵愓惸惼惾æƒæ„ƒæ„˜æ„æ„惿愄愋扊掔掱掰æŽæ¥æ¨æ¯æƒæ’æ³æŠæ æ¶æ•æ²æµæ‘¡æŸæŽ¾ææœæ„æ˜æ“æ‚æ‡æŒæ‹æˆæ°æ—æ™æ”²æ•§æ•ªæ•¤æ•œæ•¨æ•¥æ–Œæ–æ–žæ–®æ—æ—’"],["d9a1","晼晬晻暀晱晹晪晲æœæ¤Œæ£“椄棜椪棬棪棱æ¤æ£–棷棫棤棶椓æ¤æ£³æ£¡æ¤‡æ£Œæ¤ˆæ¥°æ¢´æ¤‘棯棆椔棸æ£æ£½æ£¼æ£¨æ¤‹æ¤Šæ¤—棎棈æ£æ£žæ£¦æ£´æ£‘椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿æ¹æ¹æ¹³æ¸œæ¸³æ¹‹æ¹€æ¹‘渻渃渮湞"],["da40","湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌ç®ç¬ç°ç«ç–"],["daa1","çšç¡ç­ç±ç¤ç£çç©ç ç²ç“»ç”¯ç•¯ç•¬ç—§ç—šç—¡ç—¦ç—痟痤痗皕皒盚ç†ç‡ç„çç…çŠçŽç‹çŒçŸžçŸ¬ç¡ ç¡¤ç¡¥ç¡œç¡­ç¡±ç¡ªç¡®ç¡°ç¡©ç¡¨ç¡žç¡¢ç¥´ç¥³ç¥²ç¥°ç¨‚稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪çµçµ­çµœçµ«çµ’絔絩絑絟絎缾缿罥"],["db40","罦羢羠羡翗è‘èè胾胔腃腊腒è…腇脽è…脺臦臮臷臸臹舄舼舽舿艵茻èè¹è£è€è¨è’è§è¤è¼è¶èè†èˆè«è£èŽ¿èèè¥è˜è¿è¡è‹èŽè–èµè‰è‰èèžè‘è†è‚è³"],["dba1","è•èºè‡è‘èªè“èƒè¬è®è„è»è—è¢è›è›è¾è›˜è›¢è›¦è›“蛣蛚蛪è›è›«è›œè›¬è›©è›—蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲è¤è£‰è¦•è¦˜è¦—è§è§šè§›è©Žè©è¨¹è©™è©€è©—詘詄詅詒詈詑詊詌è©è±Ÿè²è²€è²ºè²¾è²°è²¹è²µè¶„趀趉跘跓è·è·‡è·–è·œè·è·•è·™è·ˆè·—跅軯軷軺"],["dc40","軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻é„鄀鄇鄅鄃酡酤酟酢酠éˆéˆŠéˆ¥éˆƒéˆšéˆ¦éˆéˆŒéˆ€éˆ’釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻é–é–Œé–隇陾隈"],["dca1","隉隃隀雂雈雃雱雰é¬é°é®é ‡é¢©é£«é³¦é»¹äºƒäº„亶傽傿僆傮僄僊傴僈僂傰åƒå‚ºå‚±åƒ‹åƒ‰å‚¶å‚¸å‡—剺剸剻剼嗃嗛嗌å—å—‹å—Šå—嗀嗔嗄嗩喿嗒å–å—嗕嗢嗖嗈嗲å—嗙嗂圔塓塨塤å¡å¡å¡‰å¡¯å¡•å¡Žå¡å¡™å¡¥å¡›å ½å¡£å¡±å£¼å«‡å«„嫋媺媸媱媵媰媿嫈媻嫆"],["dd40","媷嫀嫊媴媶å«åª¹åªå¯–寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰å¹å¹Žå¹Šå¹å¹‹å»…廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯æ…愩慀戠酨戣戥戤æ…æ±æ«ææ’æ‰æ æ¤"],["dda1","æ³æ‘ƒæŸæ•æ˜æ¹æ·æ¢æ£æŒæ¦æ°æ¨æ‘æµæ¯æŠæšæ‘€æ¥æ§æ‹æ§æ›æ®æ¡æŽæ•¯æ–’旓暆暌暕æšæš‹æšŠæš™æš”晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘æ¥æ¥´æ¥Œæ¤»æ¥‹æ¤·æ¥œæ¥æ¥‘椲楒椯楻椼歆歅歃歂歈æ­æ®›ï¨æ¯»æ¯¼"],["de40","毹毷毸溛滖滈æºæ»€æºŸæº“溔溠溱溹滆滒溽æ»æºžæ»‰æº·æº°æ»æº¦æ»æº²æº¾æ»ƒæ»œæ»˜æº™æº’溎æºæº¤æº¡æº¿æº³æ»æ»Šæº—溮溣煇煔煒煣煠ç…ç…煢煲煸煪煡煂煘煃煋煰煟ç…ç…“"],["dea1","ç…„ç…ç…šç‰çŠçŠŒçŠ‘çŠçŠŽçŒ¼ç‚猻猺ç€çŠç‰ç‘„ç‘Šç‘‹ç‘’ç‘‘ç‘—ç‘€ç‘ç‘瑎瑂瑆ç‘瑔瓡瓿瓾瓽ç”畹畷榃痯ç˜ç˜ƒç—·ç—¾ç—¼ç—¹ç—¸ç˜ç—»ç—¶ç—­ç—µç—½çš™çšµç›ç•çŸç ç’ç–çšç©ç§ç”ç™ç­çŸ ç¢‡ç¢šç¢”ç¢ç¢„碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓"],["df40","稛ç¨çª£çª¢çªžç««ç­¦ç­¤ç­­ç­´ç­©ç­²ç­¥ç­³ç­±ç­°ç­¡ç­¸ç­¶ç­£ç²²ç²´ç²¯ç¶ˆç¶†ç¶€ç¶çµ¿ç¶…絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯"],["dfa1","è…„è…¡èˆè‰‰è‰„艀艂艅蓱è¿è‘–葶葹è’è’葥葑葀蒆葧è°è‘葽葚葙葴葳è‘蔇葞è·èºè´è‘ºè‘ƒè‘¸è²è‘…è©è™è‘‹è¯è‘‚è­è‘Ÿè‘°è¹è‘Žè‘Œè‘’葯蓅蒎è»è‘‡è¶è³è‘¨è‘¾è‘„è«è‘ è‘”è‘®è‘蜋蜄蛷蜌蛺蛖蛵è蛸蜎蜉èœè›¶èœèœ…裖裋è£è£Žè£žè£›è£šè£Œè£è¦…覛觟觥觤"],["e040","觡觠觢觜触詶誆詿詡訿詷誂誄詵誃èªè©´è©ºè°¼è±‹è±Šè±¥è±¤è±¦è²†è²„貅賌赨赩趑趌趎è¶è¶è¶“趔è¶è¶’跰跠跬跱跮è·è·©è·£è·¢è·§è·²è·«è·´è¼†è»¿è¼è¼€è¼…輇輈輂輋é’逿"],["e0a1","é„é‰é€½é„é„é„鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬é‰é‰ é‰§é‰¯éˆ¶é‰¡é‰°éˆ±é‰”鉣é‰é‰²é‰Žé‰“鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵é³é·é¸é²é é é Žé¢¬é£¶é£¹é¦¯é¦²é¦°é¦µéª­éª«é­›é³ªé³­é³§éº€é»½åƒ¦åƒ”僗僨僳僛僪åƒåƒ¤åƒ“僬僰僯僣僠"],["e140","凘劀åŠå‹©å‹«åŒ°åŽ¬å˜§å˜•å˜Œå˜’å—¼å˜å˜œå˜å˜“嘂嗺å˜å˜„嗿嗹墉塼å¢å¢˜å¢†å¢å¡¿å¡´å¢‹å¡ºå¢‡å¢‘墎塶墂墈塻墔å¢å£¾å¥«å«œå«®å«¥å«•å«ªå«šå«­å««å«³å«¢å« å«›å«¬å«žå«å«™å«¨å«Ÿå­·å¯ "],["e1a1","寣屣嶂嶀嵽嶆嵺å¶åµ·å¶Šå¶‰å¶ˆåµ¾åµ¼å¶åµ¹åµ¿å¹˜å¹™å¹“廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨æ…慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫æ«æ‘æ‘›æ‘摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠æ‘æ‘¿æ¿æ‘¬æ‘«æ‘™æ‘¥æ‘·æ•³æ– æš¡æš æšŸæœ…朄朢榱榶槉"],["e240","榠槎榖榰榬榼榑榙榎榧æ¦æ¦©æ¦¾æ¦¯æ¦¿æ§„榽榤槔榹槊榚æ§æ¦³æ¦“榪榡榞槙榗æ¦æ§‚榵榥槆歊æ­æ­‹æ®žæ®Ÿæ® æ¯ƒæ¯„毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊"],["e2a1","漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟æ¼æ¼žæ¼ˆæ¼¡ç†‡ç†ç†‰ç†€ç†…熂ç†ç…»ç††ç†ç†—牄牓犗犕犓çƒçç‘çŒç‘¢ç‘³ç‘±ç‘µç‘²ç‘§ç‘®ç”€ç”‚甃畽ç–瘖瘈瘌瘕瘑瘊瘔皸çžç¼çž…çž‚ç®çž€ç¯ç¾çžƒç¢²ç¢ªç¢´ç¢­ç¢¨ç¡¾ç¢«ç¢žç¢¥ç¢ ç¢¬ç¢¢ç¢¤ç¦˜ç¦Šç¦‹ç¦–禕禔禓"],["e340","禗禈禒ç¦ç¨«ç©Šç¨°ç¨¯ç¨¨ç¨¦çª¨çª«çª¬ç«®ç®ˆç®œç®Šç®‘ç®ç®–ç®ç®Œç®›ç®Žç®…箘劄箙箤箂粻粿粼粺綧綷緂綣綪ç·ç·€ç·…ç¶ç·Žç·„緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞"],["e3a1","耤èèœè†‰è††è†ƒè†‡è†è†Œè†‹èˆ•è’—蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴è“è“蒪蒚蒱è“è’蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶è“蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨è«è€èœ®èœžèœ¡èœ™èœ›èƒèœ¬è蜾è†èœ èœ²èœªèœ­èœ¼èœ’蜺蜱蜵è‚蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻"],["e440","裰裬裫è¦è¦¡è¦Ÿè¦žè§©è§«è§¨èª«èª™èª‹èª’èªèª–谽豨豩賕è³è³—趖踉踂跿è¸è·½è¸Šè¸ƒè¸‡è¸†è¸…跾踀踄è¼è¼‘輎è¼é„£é„œé„ é„¢é„Ÿé„鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪éŠ"],["e4a1","銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩éŠéŠ‹éˆ­éšžéš¡é›¿é˜é½éºé¾éžƒéž€éž‚é»éž„éžé¿éŸŽéŸé –颭颮餂餀餇é¦é¦œé§ƒé¦¹é¦»é¦ºé§‚馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵å™å™Šå™‰å™†å™˜"],["e540","噚噀嘳嘽嘬嘾嘸嘪嘺圚墫å¢å¢±å¢ å¢£å¢¯å¢¬å¢¥å¢¡å£¿å«¿å«´å«½å«·å«¶å¬ƒå«¸å¬‚嫹å¬å¬‡å¬…å¬å±§å¶™å¶—嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩å¹å¹ å¹œç·³å»›å»žå»¡å½‰å¾²æ†‹æ†ƒæ…¹æ†±æ†°æ†¢æ†‰"],["e5a1","憛憓憯憭憟憒憪憡æ†æ…¦æ†³æˆ­æ‘®æ‘°æ’–æ’ æ’…æ’—æ’œæ’撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛æ¨æ§¾æ¨§æ§²æ§®æ¨”槷槧橀樈槦槻æ¨æ§¼æ§«æ¨‰æ¨„樘樥æ¨æ§¶æ¨¦æ¨‡æ§´æ¨–歑殥殣殢殦æ°æ°€æ¯¿æ°‚æ½æ¼¦æ½¾æ¾‡æ¿†æ¾’"],["e640","æ¾æ¾‰æ¾Œæ½¢æ½æ¾…潚澖潶潬澂潕潲潒æ½æ½—澔澓æ½æ¼€æ½¡æ½«æ½½æ½§æ¾æ½“澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵ç†ç†¥ç†žç†¤ç†¡ç†ªç†œç†§ç†³çŠ˜çŠšç˜ç’çžçŸç çç›ç¡çšç™"],["e6a1","ç¢ç’‡ç’‰ç’Šç’†ç’瑽璅璈瑼瑹甈甇畾瘥瘞瘙ç˜ç˜œç˜£ç˜šç˜¨ç˜›çšœçšçšžçš›çžçžçž‰çžˆç£ç¢»ç£ç£Œç£‘磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨è¤è§è†£è†Ÿ"],["e740","膞膕膢膙膗舖è‰è‰“艒è‰è‰Žè‰‘蔤蔻è”蔀蔩蔎蔉è”蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨è”蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢"],["e7a1","è–è£è¤è·èŸ¡è³è˜è”è›è’è¡èšè‘èžè­èªèèŽèŸèè¯è¬èºè®èœè¥èè»èµè¢è§è©è¡šè¤…褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬è«è«†èª¸è«“諑諔諕誻諗誾諀諅諘諃誺誽諙谾è±è²è³¥è³Ÿè³™è³¨è³šè³è³§è¶ è¶œè¶¡è¶›è¸ è¸£è¸¥è¸¤è¸®è¸•è¸›è¸–踑踙踦踧"],["e840","踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗é³é°é¯é§é«é„¯é„«é„©é„ªé„²é„¦é„®é†…醆醊é†é†‚醄醀é‹é‹ƒé‹„鋀鋙銶é‹é‹±é‹Ÿé‹˜é‹©é‹—é‹é‹Œé‹¯é‹‚鋨鋊鋈鋎鋦é‹é‹•é‹‰é‹ é‹žé‹§é‹‘é‹“"],["e8a1","銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂éšéžŠéžŽéžˆéŸéŸé žé é ¦é ©é ¨é  é ›é §é¢²é¤ˆé£ºé¤‘餔餖餗餕駜é§é§é§“駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓é¼é¼å„œå„“儗儚儑凞匴å¡å™°å™ å™®"],["e940","噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓å¬å¬–嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼æ†æ†¨æ†–懅憴懆æ‡æ‡Œæ†º"],["e9a1","憿憸憌擗擖æ“æ“擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋æ›æš½æš»æšºæ›Œæœ£æ¨´æ©¦æ©‰æ©§æ¨²æ©¨æ¨¾æ©æ©­æ©¶æ©›æ©‘樨橚樻樿æ©æ©ªæ©¤æ©æ©æ©”橯橩橠樼橞橖橕æ©æ©Žæ©†æ­•æ­”歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪æ¿æ¾¿æ¾¸"],["ea40","澢濉澫æ¿æ¾¯æ¾²æ¾°ç‡…燂熿熸燖燀ç‡ç‡‹ç‡”燊燇ç‡ç†½ç‡˜ç†¼ç‡†ç‡šç‡›çŠçŠžç©ç¦ç§ç¬ç¥ç«çªç‘¿ç’šç’ ç’”璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚çžçž¡çžœçž›çž¢çž£çž•çž™"],["eaa1","çž—ç£ç£©ç£¥ç£ªç£žç££ç£›ç£¡ç£¢ç£­ç£Ÿç£ ç¦¤ç©„穈穇窶窸窵窱窷篞篣篧ç¯ç¯•ç¯¥ç¯šç¯¨ç¯¹ç¯”篪篢篜篫篘篟糒糔糗ç³ç³‘縒縡縗縌縟縠縓縎縜縕縚縢縋ç¸ç¸–ç¸ç¸”縥縤罃罻罼罺羱翯耪耩è¬è†±è†¦è†®è†¹è†µè†«è†°è†¬è†´è†²è†·è†§è‡²è‰•è‰–艗蕖蕅蕫è•è•“蕡蕘"],["eb40","蕀蕆蕤è•è•¢è•„蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦è•è•”蕥蕬虣虥虤螛èžèž—螓螒螈èžèž–螘è¹èž‡èž£èž…èžèž‘èžèž„螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠"],["eba1","諢諲諴諵è«è¬”諤諟諰諈諞諡諨諿諯諻貑貒è²è³µè³®è³±è³°è³³èµ¬èµ®è¶¥è¶§è¸³è¸¾è¸¸è¹€è¹…踶踼踽è¹è¸°è¸¿èº½è¼¶è¼®è¼µè¼²è¼¹è¼·è¼´é¶é¹é»é‚†éƒºé„³é„µé„¶é†“é†é†‘é†é†éŒ§éŒžéŒˆéŒŸéŒ†éŒéºéŒ¸éŒ¼éŒ›éŒ£éŒ’éŒé†éŒ­éŒŽéŒé‹‹éŒé‹ºéŒ¥éŒ“鋹鋷錴錂錤鋿錩錹錵錪錔錌"],["ec40","錋鋾錉錀鋻錖閼é—閾閹閺閶閿閵閽隩雔霋霒éœéž™éž—鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒é®é­ºé®•"],["eca1","魽鮈鴥鴗鴠鴞鴔鴩é´é´˜é´¢é´é´™é´Ÿéºˆéº†éº‡éº®éº­é»•é»–黺鼒鼽儦儥儢儤儠儩勴嚓嚌åšåš†åš„嚃噾嚂噿åšå£–壔å£å£’嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨æ–斀斶旚曒æªæª–æªæª¥æª‰æªŸæª›æª¡æªžæª‡æª“檎"],["ed40","檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲æ¿æ¿¢æ¿¨ç‡¡ç‡±ç‡¨ç‡²ç‡¤ç‡°ç‡¢ç³ç®ç¯ç’—璲璫ç’璪璭璱璥璯ç”甑甒ç”疄癃癈癉癇皤盩瞵瞫瞲瞷瞶"],["eda1","瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀ç«ç°…ç°ç¯²ç°€ç¯¿ç¯»ç°Žç¯´ç°‹ç¯³ç°‚簉簃ç°ç¯¸ç¯½ç°†ç¯°ç¯±ç°ç°Šç³¨ç¸­ç¸¼ç¹‚縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀è–薧薕薠薋薣蕻薤薚薞"],["ee40","蕷蕼薉薡蕺蕸蕗薎薖薆è–è–™è–è–薢薂薈薅蕹蕶薘è–薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾è¥è¥’褷襂覭覯覮觲觳謞"],["eea1","謘謖謑謅謋謢è¬è¬’謕謇è¬è¬ˆè¬†è¬œè¬“謚è±è±°è±²è±±è±¯è²•è²”賹赯蹎è¹è¹“è¹è¹Œè¹‡è½ƒè½€é‚…é¾é„¸é†šé†¢é†›é†™é†Ÿé†¡é†é† éŽ¡éŽƒéŽ¯é¤é–é‡é¼é˜éœé¶é‰éé‘é é­éŽéŒéªé¹é—é•é’éé±é·é»é¡éžé£é§éŽ€éŽé™é—‡é—€é—‰é—ƒé—…閷隮隰隬霠霟霘éœéœ™éžšéž¡éžœ"],["ef40","éžžéžéŸ•éŸ”韱é¡é¡„顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽é¬é«¼é­ˆé®šé®¨é®žé®›é®¦é®¡é®¥é®¤é®†é®¢é® é®¯é´³éµéµ§é´¶é´®é´¯é´±é´¸é´°"],["efa1","鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉éºéº°é»ˆé»šé»»é»¿é¼¤é¼£é¼¢é½”龠儱儭儮嚘嚜嚗嚚åšåš™å¥°å¬¼å±©å±ªå·€å¹­å¹®æ‡˜æ‡Ÿæ‡­æ‡®æ‡±æ‡ªæ‡°æ‡«æ‡–懩擿攄擽擸æ”攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌ç€ç€ç€…瀔瀎濿瀀濻瀦濼濷瀊çˆç‡¿ç‡¹çˆƒç‡½ç¶"],["f040","璸瓀璵ç“璾璶璻瓂甔甓癜癤癙ç™ç™“癗癚皦皽盬矂瞺磿礌礓礔礉ç¤ç¤’礑禭禬穟簜簩簙簠簟簭ç°ç°¦ç°¨ç°¢ç°¥ç°°ç¹œç¹ç¹–繣繘繢繟繑繠繗繓羵羳翷翸èµè‡‘臒"],["f0a1","è‡è‰Ÿè‰žè–´è—†è—€è—ƒè—‚薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙è èŸ´èŸ¨èŸè¥“襋è¥è¥Œè¥†è¥è¥‘襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧"],["f140","蹛蹚蹡è¹è¹©è¹”轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛éŽéŽ‰éŽ§éŽŽéŽªéŽžéŽ¦éŽ•éŽˆéŽ™éŽŸéŽéŽ±éŽ‘鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘é›éœ£éœ¢éœ¥éž¬éž®éž¨éž«éž¤éžª"],["f1a1","鞢鞥韗韙韖韘韺é¡é¡‘顒颸é¥é¤¼é¤ºé¨é¨‹é¨‰é¨é¨„騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿é¯é®µé®¸é¯“鮶鯄鮹鮽鵜鵓éµéµŠéµ›éµ‹éµ™éµ–鵌鵗鵒鵔鵟鵘鵚麎麌黟é¼é¼€é¼–鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚å£å£›å¤’嬽嬾嬿巃幰"],["f240","徿懻攇æ”æ”攉攌攎斄旞æ—曞櫧櫠櫌櫑櫙櫋櫟櫜æ«æ««æ«æ«æ«žæ­ æ®°æ°Œç€™ç€§ç€ ç€–瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱ç¤ç¤›"],["f2a1","礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾è¸è‡—臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘è¥è¥™è¦ˆè¦·è¦¶è§¶è­è­ˆè­Šè­€è­“譖譔譋譕"],["f340","譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑è½è½è½“辴酀鄿醰醭éžé‡éé‚éšéé¹é¬éŒé™éŽ©é¦éŠé”é®é£é•é„éŽé€é’é§é•½é—šé—›é›¡éœ©éœ«éœ¬éœ¨éœ¦"],["f3a1","鞳鞷鞶éŸéŸžéŸŸé¡œé¡™é¡é¡—颿颽颻颾饈饇饃馦馧騚騕騥é¨é¨¤é¨›é¨¢é¨ é¨§é¨£é¨žé¨œé¨”髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷é¶é¶Šé¶„鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀é½é½é½–齗齘匷嚲"],["f440","嚵嚳壣孅巆巇廮廯忀å¿æ‡¹æ”—攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱ç‚瀸瀿瀺瀹ç€ç€»ç€³ç爓爔犨ç½ç¼ç’ºçš«çšªçš¾ç›­çŸŒçŸŽçŸçŸçŸ²ç¤¥ç¤£ç¤§ç¤¨ç¤¤ç¤©"],["f4a1","禲穮穬穭竷籉籈籊籇籅糮繻繾çºçº€ç¾ºç¿¿è¹è‡›è‡™èˆ‹è‰¨è‰©è˜¢è—¿è˜è—¾è˜›è˜€è—¶è˜„蘉蘅蘌藽蠙è è ‘蠗蠓蠖襣襦覹觷譠譪è­è­¨è­£è­¥è­§è­­è¶®èº†èºˆèº„轙轖轗轕轘轚é‚é…ƒé…醷醵醲醳é‹é“é»é éé”é¾é•éé¨é™ééµé€é·é‡éŽé–é’éºé‰é¸éŠé¿"],["f540","é¼éŒé¶é‘é†é—žé— é—Ÿéœ®éœ¯éž¹éž»éŸ½éŸ¾é¡ é¡¢é¡£é¡Ÿé£é£‚é¥é¥Žé¥™é¥Œé¥‹é¥“騲騴騱騬騪騶騩騮騸騭髇髊髆é¬é¬’鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤é¶é¶’鶘é¶é¶›"],["f5a1","鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞é½é½™é¾‘儺儹劘劗囃嚽嚾孈孇巋å·å»±æ‡½æ”›æ¬‚櫼欃櫸欀çƒç„çŠçˆç‰ç…ç†çˆçˆšçˆ™ç¾ç”—癪çŸç¤­ç¤±ç¤¯ç±”籓糲纊纇纈纋纆çºç½ç¾»è€°è‡è˜˜è˜ªè˜¦è˜Ÿè˜£è˜œè˜™è˜§è˜®è˜¡è˜ è˜©è˜žè˜¥"],["f640","è ©è è ›è  è ¤è œè «è¡Šè¥­è¥©è¥®è¥«è§ºè­¹è­¸è­…譺譻è´è´”趯躎躌轞轛è½é…†é…„酅醹é¿é»é¶é©é½é¼é°é¹éªé·é¬é‘€é±é—¥é—¤é—£éœµéœºéž¿éŸ¡é¡¤é£‰é£†é£€é¥˜é¥–騹騽驆驄驂é©é¨º"],["f6a1","騿é«é¬•é¬—鬘鬖鬺魒鰫é°é°œé°¬é°£é°¨é°©é°¤é°¡é¶·é¶¶é¶¼é·é·‡é·Šé·é¶¾é·…鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳é·é¶²é¹ºéºœé»«é»®é»­é¼›é¼˜é¼šé¼±é½Žé½¥é½¤é¾’亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉æ°ç•ç–ç—ç’爞爟犩ç¿ç“˜ç“•ç“™ç“—癭皭礵禴穰穱籗籜籙籛籚"],["f740","糴糱纑ç½ç¾‡è‡žè‰«è˜´è˜µè˜³è˜¬è˜²è˜¶è ¬è ¨è ¦è ªè ¥è¥±è¦¿è¦¾è§»è­¾è®„讂讆讅譿贕躕躔躚躒èºèº–躗轠轢酇鑌é‘é‘Šé‘‹é‘鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌é©é©ˆé©Š"],["f7a1","驉驒é©é«é¬™é¬«é¬»é­–魕鱆鱈鰿鱄鰹鰳é±é°¼é°·é°´é°²é°½é°¶é·›é·’é·žé·šé·‹é·é·œé·‘鷟鷩鷙鷘鷖鷵鷕é·éº¶é»°é¼µé¼³é¼²é½‚齫龕龢儽劙壨壧奲å­å·˜è ¯å½æˆæˆƒæˆ„攩攥斖曫欑欒æ¬æ¯Šç›çšçˆ¢çŽ‚çŽçŽƒç™°çŸ”籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾"],["f840","讌讎讋讈豅贙躘轤轣醼鑢鑕é‘鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘é±é±Šé±é±‹é±•é±™é±Œé±Žé·»é··é·¯é·£é·«é·¸é·¤é·¶é·¡é·®é·¦é·²é·°é·¢é·¬é·´é·³é·¨é·­é»‚é»é»²é»³é¼†é¼œé¼¸é¼·é¼¶é½ƒé½"],["f8a1","齱齰齮齯囓å›å­Žå±­æ”­æ›­æ›®æ¬“çŸç¡çç çˆ£ç“›ç“¥çŸ•ç¤¸ç¦·ç¦¶ç±ªçº—羉艭虃蠸蠷蠵衋讔讕躞躟躠èºé†¾é†½é‡‚鑫鑨鑩雥é†éƒé‡éŸ‡éŸ¥é©žé«•é­™é±£é±§é±¦é±¢é±žé± é¸‚鷾鸇鸃鸆鸅鸀é¸é¸‰é·¿é·½é¸„麠鼞齆齴齵齶囔攮斸欘欙欗欚ç¢çˆ¦çŠªçŸ˜çŸ™ç¤¹ç±©ç±«ç³¶çºš"],["f940","纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳é‰é¡²é¥Ÿé±¨é±®é±­é¸‹é¸é¸é¸é¸’鸑麡黵鼉齇齸齻齺齹圞ç¦ç±¯è ¼è¶²èº¦é‡ƒé‘´é‘¸é‘¶é‘µé© é±´é±³é±±é±µé¸”鸓黶鼊"],["f9a1","龤ç¨ç¥ç³·è™ªè ¾è ½è ¿è®žè²œèº©è»‰é‹é¡³é¡´é£Œé¥¡é¦«é©¤é©¦é©§é¬¤é¸•é¸—齈戇欞爧虌躨钂钀é’驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺é¸ç©çªéº¤é½¾é½‰é¾˜ç¢éŠ¹è£å¢»æ’粧嫺╔╦╗╠╬╣╚╩â•â•’╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║â•â•­â•®â•°â•¯â–“"]]')},20345:e=>{"use strict";e.exports=JSON.parse('[["0","\\u0000",127],["8ea1","。",62],["a1a1"," ã€ã€‚,.・:;?ï¼ã‚›ã‚œÂ´ï½€Â¨ï¼¾ï¿£ï¼¿ãƒ½ãƒ¾ã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ï½žâˆ¥ï½œâ€¦â€¥â€˜â€™â€œâ€ï¼ˆï¼‰ã€”〕[]{ï½ã€ˆ",9,"+ï¼Â±Ã—÷ï¼â‰ ï¼œï¼žâ‰¦â‰§âˆžâˆ´â™‚♀°′″℃¥$¢£%#&*@§☆★○â—â—Žâ—‡"],["a2a1","◆□■△▲▽▼※〒→â†â†‘↓〓"],["a2ba","∈∋⊆⊇⊂⊃∪∩"],["a2ca","∧∨¬⇒⇔∀∃"],["a2dc","∠⊥⌒∂∇≡≒≪≫√∽âˆâˆµâˆ«âˆ¬"],["a2f2","ʼn♯♭♪†‡¶"],["a2fe","â—¯"],["a3b0","ï¼",9],["a3c1","A",25],["a3e1","ï½",25],["a4a1","ã",82],["a5a1","ã‚¡",85],["a6a1","Α",16,"Σ",6],["a6c1","α",16,"σ",6],["a7a1","Ð",5,"ÐЖ",25],["a7d1","а",5,"ёж",25],["a8a1","─│┌â”┘└├┬┤┴┼â”┃â”┓┛┗┣┳┫┻╋┠┯┨┷┿â”┰┥┸╂"],["ada1","â‘ ",19,"â… ",9],["adc0","ã‰ãŒ”㌢ã㌘㌧㌃㌶ã‘ã—ãŒãŒ¦ãŒ£ãŒ«ãŠãŒ»ãŽœãŽãŽžãŽŽãŽã„㎡"],["addf","ã»ã€ã€Ÿâ„–ã℡㊤",4,"㈱㈲㈹ã¾ã½ã¼â‰’≡∫∮∑√⊥∠∟⊿∵∩∪"],["b0a1","亜唖娃阿哀愛挨姶逢葵茜ç©æ‚ªæ¡æ¸¥æ—­è‘¦èŠ¦é¯µæ¢“圧斡扱宛å§è™»é£´çµ¢ç¶¾é®Žæˆ–粟袷安庵按暗案闇éžæ以伊ä½ä¾å‰å›²å¤·å§”å¨å°‰æƒŸæ„慰易椅為ç•ç•°ç§»ç¶­ç·¯èƒƒèŽè¡£è¬‚é•éºåŒ»äº•äº¥åŸŸè‚²éƒç£¯ä¸€å£±æº¢é€¸ç¨²èŒ¨èŠ‹é°¯å…å°å’½å“¡å› å§»å¼•é£²æ·«èƒ¤è”­"],["b1a1","院陰隠韻å‹å³å®‡çƒç¾½è¿‚雨å¯éµœçªºä¸‘碓臼渦嘘唄æ¬è”šé°»å§¥åŽ©æµ¦ç“œé–噂云é‹é›²è餌å¡å–¶å¬°å½±æ˜ æ›³æ „永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦è¬è¶Šé–²æ¦ŽåŽ­å††åœ’堰奄宴延怨掩æ´æ²¿æ¼”炎焔煙燕猿ç¸è‰¶è‹‘è–—é é‰›é´›å¡©æ–¼æ±šç”¥å‡¹å¤®å¥¥å¾€å¿œ"],["b2a1","押旺横欧殴王ç¿è¥–鴬鴎黄岡沖è»å„„屋憶臆桶牡乙俺å¸æ©æ¸©ç©éŸ³ä¸‹åŒ–仮何伽価佳加å¯å˜‰å¤å«å®¶å¯¡ç§‘暇果架歌河ç«ç‚ç¦ç¦¾ç¨¼ç®‡èŠ±è‹›èŒ„è·è¯è“è¦èª²å˜©è²¨è¿¦éŽéœžèšŠä¿„峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔æ¢æ‡æˆ’æ‹æ”¹"],["b3a1","é­æ™¦æ¢°æµ·ç°ç•Œçš†çµµèŠ¥èŸ¹é–‹éšŽè²å‡±åŠ¾å¤–咳害崖慨概涯ç¢è“‹è¡—該鎧骸浬馨蛙垣柿蛎鈎劃嚇å„廓拡撹格核殻ç²ç¢ºç©«è¦šè§’赫較郭閣隔é©å­¦å²³æ¥½é¡é¡ŽæŽ›ç¬ æ¨«æ©¿æ¢¶é°æ½Ÿå‰²å–æ°æ‹¬æ´»æ¸‡æ»‘è‘›è¤è½„且鰹å¶æ¤›æ¨ºéž„株兜竃蒲釜鎌噛鴨栢茅è±"],["b4a1","粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾æ›æ•¢æŸ‘桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰è‚艦莞観諌貫還鑑間閑関陥韓館舘丸å«å²¸å·ŒçŽ©ç™Œçœ¼å²©ç¿«è´‹é›é ‘顔願ä¼ä¼Žå±å–œå™¨åŸºå¥‡å¬‰å¯„å²å¸Œå¹¾å¿Œæ®æœºæ——既期棋棄"],["b5a1","機帰毅気汽畿祈季稀紀徽è¦è¨˜è²´èµ·è»Œè¼é£¢é¨Žé¬¼äº€å½å„€å¦“宜戯技擬欺犠疑祇義蟻誼議掬èŠéž å‰åƒå–«æ¡”橘詰砧æµé»å´å®¢è„šè™é€†ä¸˜ä¹…仇休åŠå¸å®®å¼“急救朽求汲泣ç¸çƒç©¶çª®ç¬ˆç´šç³¾çµ¦æ—§ç‰›åŽ»å±…巨拒拠挙渠虚許è·é‹¸æ¼ç¦¦é­šäº¨äº«äº¬"],["b6a1","供侠僑兇競共凶å”匡å¿å«å–¬å¢ƒå³¡å¼·å½Šæ€¯ææ­æŒŸæ•™æ©‹æ³ç‹‚狭矯胸脅興蕎郷é¡éŸ¿é¥—é©šä»°å‡å°­æšæ¥­å±€æ›²æ¥µçŽ‰æ¡ç²åƒ…勤å‡å·¾éŒ¦æ–¤æ¬£æ¬½ç´ç¦ç¦½ç­‹ç·ŠèŠ¹èŒè¡¿è¥Ÿè¬¹è¿‘金åŸéŠ€ä¹å€¶å¥åŒºç‹—玖矩苦躯駆駈駒具愚虞喰空å¶å¯“é‡éš…串櫛釧屑屈"],["b7a1","掘窟沓é´è½¡çªªç†Šéšˆç²‚æ —ç¹°æ¡‘é¬å‹²å›è–«è¨“群è»éƒ¡å¦è¢ˆç¥ä¿‚傾刑兄啓圭çªåž‹å¥‘形径æµæ…¶æ…§æ†©æŽ²æºæ•¬æ™¯æ¡‚渓畦稽系経継繋罫茎èŠè›è¨ˆè©£è­¦è»½é šé¶èŠ¸è¿Žé¯¨åŠ‡æˆŸæ’ƒæ¿€éš™æ¡å‚‘欠決潔穴çµè¡€è¨£æœˆä»¶å€¹å€¦å¥å…¼åˆ¸å‰£å–§åœå …嫌建憲懸拳æ²"],["b8a1","検権牽犬献研硯絹県肩見謙賢軒é£éµé™ºé¡•é¨“鹸元原厳幻弦減æºçŽ„ç¾çµƒèˆ·è¨€è«ºé™ä¹Žå€‹å¤å‘¼å›ºå§‘孤己庫弧戸故枯湖ç‹ç³Šè¢´è‚¡èƒ¡è°è™Žèª‡è·¨éˆ·é›‡é¡§é¼“五互ä¼åˆå‘‰å¾å¨¯å¾Œå¾¡æ‚Ÿæ¢§æªŽç‘šç¢èªžèª¤è­·é†ä¹žé¯‰äº¤ä½¼ä¾¯å€™å€–光公功効勾厚å£å‘"],["b9a1","åŽå–‰å‘垢好孔å­å®å·¥å·§å··å¹¸åºƒåºšåº·å¼˜æ’慌抗拘控攻昂晃更æ­æ ¡æ¢—構江洪浩港æºç”²çš‡ç¡¬ç¨¿ç³ ç´…紘絞綱耕考肯肱腔è†èˆªè’行衡講貢購郊酵鉱砿鋼閤é™é …香高鴻剛劫å·åˆå£•æ‹·æ¿ è±ªè½Ÿéº¹å…‹åˆ»å‘Šå›½ç©€é…·éµ é»’ç„漉腰甑忽惚骨狛込"],["baa1","此頃今困å¤å¢¾å©šæ¨æ‡‡æ˜æ˜†æ ¹æ¢±æ··ç—•ç´ºè‰®é­‚些ä½å‰å”†åµ¯å·¦å·®æŸ»æ²™ç‘³ç ‚è©éŽ–裟å座挫債催å†æœ€å“‰å¡žå¦»å®°å½©æ‰æŽ¡æ ½æ­³æ¸ˆç½é‡‡çŠ€ç •ç ¦ç¥­æ–Žç´°èœè£è¼‰éš›å‰¤åœ¨æ罪財冴å‚阪堺榊肴咲崎埼碕鷺作削咋æ¾æ˜¨æœ”柵窄策索錯桜鮭笹匙冊刷"],["bba1","察拶撮擦札殺薩雑çšé¯–æŒéŒ†é®«çš¿æ™’三傘å‚山惨撒散桟燦çŠç”£ç®—纂蚕讃賛酸é¤æ–¬æš«æ®‹ä»•ä»”伺使刺å¸å²å—£å››å£«å§‹å§‰å§¿å­å±å¸‚師志æ€æŒ‡æ”¯å­œæ–¯æ–½æ—¨æžæ­¢æ­»æ°ç…祉ç§ç³¸ç´™ç´«è‚¢è„‚至視詞詩試誌諮資賜雌飼歯事似ä¾å…字寺慈æŒæ™‚"],["bca1","次滋治爾璽痔ç£ç¤ºè€Œè€³è‡ªè’”辞æ±é¹¿å¼è­˜é´«ç«ºè»¸å®é›«ä¸ƒå±åŸ·å¤±å«‰å®¤æ‚‰æ¹¿æ¼†ç–¾è³ªå®Ÿè”€ç¯ å²æŸ´èŠå±¡è•Šç¸žèˆŽå†™å°„æ¨èµ¦æ–œç…®ç¤¾ç´—者è¬è»Šé®è›‡é‚ªå€Ÿå‹ºå°ºæ“ç¼çˆµé…Œé‡ˆéŒ«è‹¥å¯‚弱惹主å–守手朱殊狩ç ç¨®è…«è¶£é…’首儒å—呪寿授樹綬需囚åŽå‘¨"],["bda1","宗就州修æ„拾洲秀秋終ç¹ç¿’臭舟è’衆襲è®è¹´è¼¯é€±é…‹é…¬é›†é†œä»€ä½å……å従戎柔æ±æ¸‹ç£ç¸¦é‡éŠƒå”夙宿淑ç¥ç¸®ç²›å¡¾ç†Ÿå‡ºè¡“述俊峻春瞬竣舜駿准循旬楯殉淳準潤盾純巡éµé†‡é †å‡¦åˆæ‰€æš‘曙渚庶緒署書薯藷諸助å™å¥³åºå¾æ•é‹¤é™¤å‚·å„Ÿ"],["bea1","å‹åŒ å‡å¬å“¨å•†å”±å˜—奨妾娼宵将å°å°‘尚庄床廠彰承抄招掌æ·æ˜‡æ˜Œæ˜­æ™¶æ¾æ¢¢æ¨Ÿæ¨µæ²¼æ¶ˆæ¸‰æ¹˜ç„¼ç„¦ç…§ç—‡çœç¡ç¤ç¥¥ç§°ç« ç¬‘粧紹肖è–蒋蕉è¡è£³è¨Ÿè¨¼è©”詳象賞醤鉦é¾é˜éšœéž˜ä¸Šä¸ˆä¸žä¹—冗剰城場壌嬢常情擾æ¡æ–浄状畳穣蒸譲醸錠嘱埴飾"],["bfa1","æ‹­æ¤æ®–燭織è·è‰²è§¦é£Ÿè•è¾±å°»ä¼¸ä¿¡ä¾µå”‡å¨ å¯å¯©å¿ƒæ…ŽæŒ¯æ–°æ™‹æ£®æ¦›æµ¸æ·±ç”³ç–¹çœŸç¥žç§¦ç´³è‡£èŠ¯è–ªè¦ªè¨ºèº«è¾›é€²é‡éœ‡äººä»åˆƒå¡µå£¬å°‹ç”šå°½è…Žè¨Šè¿…陣é­ç¬¥è«é ˆé…¢å›³åŽ¨é€—å¹åž‚帥推水炊ç¡ç²‹ç¿ è¡°é‚é…”éŒéŒ˜éšç‘žé«„崇嵩数枢趨雛æ®æ‰æ¤™è…頗雀裾"],["c0a1","澄摺寸世瀬ç•æ˜¯å‡„制勢姓å¾æ€§æˆæ”¿æ•´æ˜Ÿæ™´æ£²æ –正清牲生盛精è–声製西誠誓請é€é†’é’é™æ–‰ç¨Žè„†éš»å¸­æƒœæˆšæ–¥æ˜”æžçŸ³ç©ç±ç¸¾è„Šè²¬èµ¤è·¡è¹Ÿç¢©åˆ‡æ‹™æŽ¥æ‘‚折設窃節説雪絶舌è‰ä»™å…ˆåƒå å®£å°‚å°–å·æˆ¦æ‰‡æ’°æ “栴泉浅洗染潜煎煽旋穿箭線"],["c1a1","繊羨腺舛船薦詮賎践é¸é·éŠ­éŠ‘閃鮮å‰å–„漸然全禅繕膳糎噌塑岨措曾曽楚狙ç–疎礎祖租粗素組蘇訴阻é¡é¼ åƒ§å‰µåŒå¢å€‰å–ªå£®å¥çˆ½å®‹å±¤åŒæƒ£æƒ³æœæŽƒæŒ¿æŽ»æ“早曹巣æ§æ§½æ¼•ç‡¥äº‰ç—©ç›¸çª“糟ç·ç¶œè¡è‰è˜è‘¬è’¼è—»è£…èµ°é€é­éŽ—霜騒åƒå¢—憎"],["c2a1","臓蔵贈造促å´å‰‡å³æ¯æ‰æŸæ¸¬è¶³é€Ÿä¿—属賊æ—続å’袖其æƒå­˜å­«å°Šææ‘éœä»–多太汰詑唾堕妥惰打æŸèˆµæ¥•é™€é§„騨体堆対è€å²±å¸¯å¾…怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代å°å¤§ç¬¬é†é¡Œé·¹æ»ç€§å“啄宅托択拓沢濯ç¢è¨—é¸æ¿è«¾èŒ¸å‡§è›¸åª"],["c3a1","å©ä½†é”辰奪脱巽竪辿棚谷狸鱈樽誰丹å˜å˜†å¦æ‹…探旦歎淡湛炭短端箪綻耽胆蛋誕é›å›£å£‡å¼¾æ–­æš–檀段男談値知地弛æ¥æ™ºæ± ç—´ç¨šç½®è‡´èœ˜é…馳築畜竹筑蓄é€ç§©çª’茶嫡ç€ä¸­ä»²å®™å¿ æŠ½æ˜¼æŸ±æ³¨è™«è¡·è¨»é…Žé‹³é§æ¨—瀦猪苧著貯ä¸å…†å‡‹å–‹å¯µ"],["c4a1","帖帳åºå¼”張彫徴懲挑暢æœæ½®ç‰’町眺è´è„¹è…¸è¶èª¿è«œè¶…跳銚長頂鳥勅æ—直朕沈ç賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴é”椿潰åªå£·å¬¬ç´¬çˆªåŠé‡£é¶´äº­ä½Žåœåµå‰ƒè²žå‘ˆå ¤å®šå¸åº•åº­å»·å¼Ÿæ‚ŒæŠµæŒºæ梯汀碇禎程締艇訂諦蹄逓"],["c5a1","邸鄭釘鼎泥摘擢敵滴的笛é©é‘溺哲徹撤è½è¿­é‰„典填天展店添çºç”œè²¼è»¢é¡›ç‚¹ä¼æ®¿æ¾±ç”°é›»å…Žå堵塗妬屠徒斗æœæ¸¡ç™»èŸè³­é€”都é砥砺努度土奴怒倒党冬å‡åˆ€å”塔塘套宕島嶋悼投æ­æ±æ¡ƒæ¢¼æ£Ÿç›—淘湯涛ç¯ç‡ˆå½“痘祷等答筒糖統到"],["c6a1","董蕩藤討謄豆è¸é€ƒé€é™é™¶é ­é¨°é—˜åƒå‹•åŒå ‚導憧撞洞瞳童胴è„é“銅峠鴇匿得徳涜特ç£ç¦¿ç¯¤æ¯’独読栃橡凸çªæ¤´å±Šé³¶è‹«å¯…酉瀞噸屯惇敦沌豚é頓呑曇éˆå¥ˆé‚£å†…ä¹å‡ªè–™è¬Žç˜æºé‹æ¥¢é¦´ç¸„ç•·å—楠軟難æ±äºŒå°¼å¼è¿©åŒ‚賑肉虹廿日乳入"],["c7a1","如尿韮任妊å¿èªæ¿¡ç¦°ç¥¢å¯§è‘±çŒ«ç†±å¹´å¿µæ»æ’šç‡ƒç²˜ä¹ƒå»¼ä¹‹åŸœåš¢æ‚©æ¿ƒç´èƒ½è„³è†¿è¾²è¦—蚤巴把播覇æ·æ³¢æ´¾ç¶ç ´å©†ç½µèŠ­é¦¬ä¿³å»ƒæ‹æŽ’æ•—æ¯ç›ƒç‰ŒèƒŒè‚ºè¼©é…å€åŸ¹åª’梅楳煤狽買売賠陪這è¿ç§¤çŸ§è©ä¼¯å‰¥åšæ‹æŸæ³Šç™½ç®”粕舶薄迫æ›æ¼ çˆ†ç¸›èŽ«é§éº¦"],["c8a1","函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪ä¼ç½°æŠœç­é–¥é³©å™ºå¡™è›¤éš¼ä¼´åˆ¤åŠåå›å¸†æ¬æ–‘æ¿æ°¾æ±Žç‰ˆçŠ¯ç­ç•”ç¹èˆ¬è—©è²©ç¯„釆煩頒飯挽晩番盤ç£è•ƒè›®åŒªå‘å¦å¦ƒåº‡å½¼æ‚²æ‰‰æ‰¹æŠ«æ–比泌疲皮碑秘緋罷肥被誹費é¿éžé£›æ¨‹ç°¸å‚™å°¾å¾®æž‡æ¯˜çµçœ‰ç¾Ž"],["c9a1","鼻柊稗匹疋髭彦è†è±è‚˜å¼¼å¿…畢筆逼桧姫媛ç´ç™¾è¬¬ä¿µå½ªæ¨™æ°·æ¼‚瓢票表評豹廟æ病秒苗錨鋲蒜蛭鰭å“彬斌浜瀕貧賓頻æ•ç“¶ä¸ä»˜åŸ å¤«å©¦å¯Œå†¨å¸ƒåºœæ€–扶敷斧普浮父符è…膚芙譜負賦赴阜附侮撫武舞葡蕪部å°æ¥“風葺蕗ä¼å‰¯å¾©å¹…æœ"],["caa1","ç¦è…¹è¤‡è¦†æ·µå¼—払沸ä»ç‰©é®’分å»å™´å¢³æ†¤æ‰®ç„šå¥®ç²‰ç³žç´›é›°æ–‡èžä¸™ä½µå…µå¡€å¹£å¹³å¼ŠæŸ„並蔽閉陛米é åƒ»å£ç™–碧別瞥蔑箆å変片篇編辺返é便勉娩å¼éž­ä¿èˆ—鋪圃æ•æ­©ç”«è£œè¼”穂募墓慕戊暮æ¯ç°¿è©å€£ä¿¸åŒ…呆報奉å®å³°å³¯å´©åº–抱æ§æ”¾æ–¹æœ‹"],["cba1","法泡烹砲縫胞芳èŒè“¬èœ‚褒訪豊邦鋒飽鳳鵬ä¹äº¡å‚剖åŠå¦¨å¸½å¿˜å¿™æˆ¿æš´æœ›æŸæ£’冒紡肪膨謀貌貿鉾防å é ¬åŒ—僕åœå¢¨æ’²æœ´ç‰§ç¦ç©†é‡¦å‹ƒæ²¡æ®†å €å¹Œå¥”本翻凡盆摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒æ¡äº¦ä¿£åˆæŠ¹æœ«æ²«è¿„侭繭麿万慢満"],["cca1","漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙ç²æ°‘眠務夢無牟矛霧鵡椋婿娘冥å命明盟迷銘鳴姪ç‰æ»…å…棉綿緬é¢éººæ‘¸æ¨¡èŒ‚妄孟毛猛盲網耗蒙儲木黙目æ¢å‹¿é¤…尤戻籾貰å•æ‚¶ç´‹é–€åŒä¹Ÿå†¶å¤œçˆºè€¶é‡Žå¼¥çŸ¢åŽ„役約薬訳èºé–柳薮鑓愉愈油癒"],["cda1","諭輸唯佑優勇å‹å®¥å¹½æ‚ æ†‚æ–有柚湧涌猶猷由ç¥è£•èª˜éŠé‚‘郵雄èžå¤•äºˆä½™ä¸Žèª‰è¼¿é å‚­å¹¼å¦–容庸æšæºæ“曜楊様洋溶熔用窯羊耀葉蓉è¦è¬¡è¸Šé¥é™½é¤Šæ…¾æŠ‘欲沃浴翌翼淀羅螺裸æ¥èŽ±é ¼é›·æ´›çµ¡è½é…ªä¹±åµåµæ¬„æ¿«è—蘭覧利åå±¥æŽæ¢¨ç†ç’ƒ"],["cea1","ç—¢è£è£¡é‡Œé›¢é™¸å¾‹çŽ‡ç«‹è‘ŽæŽ ç•¥åŠ‰æµæºœç‰ç•™ç¡«ç²’隆竜é¾ä¾¶æ…®æ—…虜了亮僚両凌寮料æ¢æ¶¼çŒŸç™‚瞭稜糧良諒é¼é‡é™µé ˜åŠ›ç·‘倫厘林淋ç‡ç³è‡¨è¼ªéš£é±—麟瑠å¡æ¶™ç´¯é¡žä»¤ä¼¶ä¾‹å†·åŠ±å¶ºæ€œçŽ²ç¤¼è‹“鈴隷零霊麗齢暦歴列劣烈裂廉æ‹æ†æ¼£ç…‰ç°¾ç·´è¯"],["cfa1","蓮連錬呂魯櫓炉賂路露労å©å»Šå¼„朗楼榔浪æ¼ç‰¢ç‹¼ç¯­è€è¾è‹éƒŽå…­éº“禄肋録論倭和話歪賄脇惑枠鷲亙亘é°è©«è—蕨椀湾碗腕"],["d0a1","弌ä¸ä¸•ä¸ªä¸±ä¸¶ä¸¼ä¸¿ä¹‚乖乘亂亅豫亊舒å¼äºŽäºžäºŸäº äº¢äº°äº³äº¶ä»Žä»ä»„仆仂仗仞仭仟价伉佚估佛ä½ä½—佇佶侈ä¾ä¾˜ä½»ä½©ä½°ä¾‘佯來侖儘俔俟俎俘俛俑俚ä¿ä¿¤ä¿¥å€šå€¨å€”倪倥倅伜俶倡倩倬俾俯們倆åƒå‡æœƒå•ååˆåšå–å¬å¸å‚€å‚šå‚…傴傲"],["d1a1","僉僊傳僂僖僞僥僭僣僮價僵儉å„儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉å†å†‘冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭凰凵凾刄刋刔刎刧刪刮刳刹å‰å‰„剋剌剞剔剪剴剩剳剿剽åŠåŠ”劒剱劈劑辨"],["d2a1","辧劬劭劼劵å‹å‹å‹—勞勣勦飭勠勳勵勸勹匆匈甸åŒåŒåŒåŒ•åŒšåŒ£åŒ¯åŒ±åŒ³åŒ¸å€å†å…丗å‰å凖åžå©å®å¤˜å»å·åŽ‚厖厠厦厥厮厰厶åƒç°’é›™åŸæ›¼ç‡®å®å¨å­åºåå½å‘€å¬å­å¼å®å¶å©åå‘Žå’呵咎呟呱呷呰咒呻咀呶咄å’咆哇咢咸咥咬哄哈咨"],["d3a1","咫哂咤咾咼哘哥哦å”唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳å•å–™å–€å’¯å–Šå–Ÿå•»å•¾å–˜å–žå–®å•¼å–ƒå–©å–‡å–¨å—šå—…嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎å™ç‡Ÿå˜´å˜¶å˜²å˜¸å™«å™¤å˜¯å™¬å™ªåš†åš€åšŠåš åš”åšåš¥åš®åš¶åš´å›‚åš¼å›å›ƒå›€å›ˆå›Žå›‘囓囗囮囹圀囿圄圉"],["d4a1","圈國åœåœ“團圖嗇圜圦圷圸åŽåœ»å€åå©åŸ€åžˆå¡å¿åž‰åž“垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙å å¡²å ¡å¡¢å¡‹å¡°æ¯€å¡’堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊å¤å¤›æ¢¦å¤¥å¤¬å¤­å¤²å¤¸å¤¾ç«’奕å¥å¥Žå¥šå¥˜å¥¢å¥ å¥§å¥¬å¥©"],["d5a1","奸å¦å¦ä½žä¾«å¦£å¦²å§†å§¨å§œå¦å§™å§šå¨¥å¨Ÿå¨‘娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲å«å¬ªå¬¶å¬¾å­ƒå­…孀孑孕孚孛孥孩孰孳孵學斈孺宀它宦宸寃寇寉寔å¯å¯¤å¯¦å¯¢å¯žå¯¥å¯«å¯°å¯¶å¯³å°…將專å°å°“尠尢尨尸尹å±å±†å±Žå±“"],["d6a1","å±å±å­±å±¬å±®ä¹¢å±¶å±¹å²Œå²‘岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢å¶å¶¬å¶®å¶½å¶å¶·å¶¼å·‰å·å·“巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠å»å»‚廈å»å»"],["d7a1","廖廣å»å»šå»›å»¢å»¡å»¨å»©å»¬å»±å»³å»°å»´å»¸å»¾å¼ƒå¼‰å½å½œå¼‹å¼‘弖弩弭弸å½å½ˆå½Œå½Žå¼¯å½‘彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱å¿æ‚³å¿¿æ€¡æ æ€™æ€æ€©æ€Žæ€±æ€›æ€•æ€«æ€¦æ€æ€ºæšææªæ·æŸæŠæ†ææ£æƒæ¤æ‚æ¬æ«æ™æ‚æ‚惧悃悚"],["d8a1","悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘æ…愕愆惶惷愀惴惺愃愡惻惱æ„愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟æ…慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹æ‡æ‡¦æ‡£æ‡¶æ‡ºæ‡´æ‡¿æ‡½æ‡¼æ‡¾æˆ€æˆˆæˆ‰æˆæˆŒæˆ”戛"],["d9a1","戞戡截戮戰戲戳æ‰æ‰Žæ‰žæ‰£æ‰›æ‰ æ‰¨æ‰¼æŠ‚抉找抒抓抖拔抃抔拗拑抻æ‹æ‹¿æ‹†æ“”拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵æ挾ææœæ掖掎掀掫æ¶æŽ£æŽæŽ‰æŽŸæŽµæ«æ©æŽ¾æ©æ€æ†æ£æ‰æ’æ¶æ„æ–æ´æ†æ“æ¦æ¶æ”æ—æ¨æ摧摯摶摎攪撕撓撥撩撈撼"],["daa1","據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕æ•æ•˜æ•žæ•æ•²æ•¸æ–‚斃變斛斟斫斷旃旆æ—旄旌旒旛旙无旡旱æ²æ˜Šæ˜ƒæ—»æ³æ˜µæ˜¶æ˜´æ˜œæ™æ™„晉æ™æ™žæ™æ™¤æ™§æ™¨æ™Ÿæ™¢æ™°æšƒæšˆæšŽæš‰æš„暘æšæ›æš¹æ›‰æš¾æš¼"],["dba1","曄暸曖曚曠昿曦曩曰曵曷æœæœ–朞朦朧霸朮朿朶æ朸朷æ†æžæ æ™æ£æ¤æž‰æ°æž©æ¼æªæžŒæž‹æž¦æž¡æž…枷柯枴柬枳柩枸柤柞æŸæŸ¢æŸ®æž¹æŸŽæŸ†æŸ§æªœæ žæ¡†æ ©æ¡€æ¡æ ²æ¡Žæ¢³æ «æ¡™æ¡£æ¡·æ¡¿æ¢Ÿæ¢æ¢­æ¢”æ¢æ¢›æ¢ƒæª®æ¢¹æ¡´æ¢µæ¢ æ¢ºæ¤æ¢æ¡¾æ¤æ£Šæ¤ˆæ£˜æ¤¢æ¤¦æ£¡æ¤Œæ£"],["dca1","棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞æ¥æ¦æ¥ªæ¦²æ¦®æ§æ¦¿æ§æ§“榾槎寨槊æ§æ¦»æ§ƒæ¦§æ¨®æ¦‘榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒æ«æ¨£æ¨“橄樌橲樶橸橇橢橙橦橈樸樢æªæªæª æª„檢檣"],["dda1","檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉æ­æ­™æ­”歛歟歡歸歹歿殀殄殃æ®æ®˜æ®•æ®žæ®¤æ®ªæ®«æ®¯æ®²æ®±æ®³æ®·æ®¼æ¯†æ¯‹æ¯“毟毬毫毳毯麾氈氓气氛氤氣汞汕汢汪沂æ²æ²šæ²æ²›æ±¾æ±¨æ±³æ²’æ²æ³„泱泓沽泗泅æ³æ²®æ²±æ²¾"],["dea1","沺泛泯泙泪洟è¡æ´¶æ´«æ´½æ´¸æ´™æ´µæ´³æ´’洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶æ¹æ¸Ÿæ¹ƒæ¸ºæ¹Žæ¸¤æ»¿æ¸æ¸¸æº‚溪溘滉溷滓溽溯滄溲滔滕æºæº¥æ»‚溟æ½æ¼‘çŒæ»¬æ»¸æ»¾æ¼¿æ»²æ¼±æ»¯æ¼²æ»Œ"],["dfa1","漾漓滷澆潺潸æ¾æ¾€æ½¯æ½›æ¿³æ½­æ¾‚潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑ç€ç€æ¿¾ç€›ç€šæ½´ç€ç€˜ç€Ÿç€°ç€¾ç€²ç‘ç£ç‚™ç‚’炯烱炬炸炳炮烟烋çƒçƒ™ç„‰çƒ½ç„œç„™ç…¥ç…•ç†ˆç…¦ç…¢ç…Œç…–ç…¬ç†ç‡»ç†„熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼"],["e0a1","燹燿çˆçˆçˆ›çˆ¨çˆ­çˆ¬çˆ°çˆ²çˆ»çˆ¼çˆ¿ç‰€ç‰†ç‰‹ç‰˜ç‰´ç‰¾çŠ‚çŠçŠ‡çŠ’犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷å€çŒ—猊猜猖çŒçŒ´çŒ¯çŒ©çŒ¥çŒ¾çŽç默ç—çªç¨ç°ç¸çµç»çºçˆçŽ³çŽçŽ»ç€ç¥ç®çžç’¢ç…瑯ç¥ç¸ç²çºç‘•ç¿ç‘Ÿç‘™ç‘瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊ç“ç“”ç±"],["e1a1","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎ç”甕甓甞甦甬甼畄ç•ç•Šç•‰ç•›ç•†ç•šç•©ç•¤ç•§ç•«ç•­ç•¸ç•¶ç–†ç–‡ç•´ç–Šç–‰ç–‚疔疚ç–疥疣痂疳痃疵疽疸疼疱ç—痊痒痙痣痞痾痿痼ç˜ç—°ç—ºç—²ç—³ç˜‹ç˜ç˜‰ç˜Ÿç˜§ç˜ ç˜¡ç˜¢ç˜¤ç˜´ç˜°ç˜»ç™‡ç™ˆç™†ç™œç™˜ç™¡ç™¢ç™¨ç™©ç™ªç™§ç™¬ç™°"],["e2a1","癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂ç›ç›–盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸ç‡çšç¨ç«ç›ç¥ç¿ç¾ç¹çžŽçž‹çž‘瞠瞞瞰瞶瞹瞿瞼瞽瞻矇çŸçŸ—矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"],["e3a1","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊ç¦ç¦§é½‹ç¦ªç¦®ç¦³ç¦¹ç¦ºç§‰ç§•ç§§ç§¬ç§¡ç§£ç¨ˆç¨ç¨˜ç¨™ç¨ ç¨Ÿç¦€ç¨±ç¨»ç¨¾ç¨·ç©ƒç©—穉穡穢穩é¾ç©°ç©¹ç©½çªˆçª—窕窘窖窩竈窰窶竅竄窿邃竇竊ç«ç«ç«•ç«“站竚ç«ç«¡ç«¢ç«¦ç«­ç«°ç¬‚ç¬ç¬Šç¬†ç¬³ç¬˜ç¬™ç¬žç¬µç¬¨ç¬¶ç­"],["e4a1","筺笄ç­ç¬‹ç­Œç­…筵筥筴筧筰筱筬筮ç®ç®˜ç®Ÿç®ç®œç®šç®‹ç®’ç®ç­ç®™ç¯‹ç¯ç¯Œç¯ç®´ç¯†ç¯ç¯©ç°‘簔篦篥籠簀簇簓篳篷簗ç°ç¯¶ç°£ç°§ç°ªç°Ÿç°·ç°«ç°½ç±Œç±ƒç±”ç±ç±€ç±ç±˜ç±Ÿç±¤ç±–籥籬籵粃ç²ç²¤ç²­ç²¢ç²«ç²¡ç²¨ç²³ç²²ç²±ç²®ç²¹ç²½ç³€ç³…糂糘糒糜糢鬻糯糲糴糶糺紆"],["e5a1","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮çµçµ£ç¶“綉絛ç¶çµ½ç¶›ç¶ºç¶®ç¶£ç¶µç·‡ç¶½ç¶«ç¸½ç¶¢ç¶¯ç·œç¶¸ç¶Ÿç¶°ç·˜ç·ç·¤ç·žç·»ç·²ç·¡ç¸…縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷縲縺繧ç¹ç¹–繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒çºçº“纔纖纎纛纜缸缺"],["e6a1","罅罌ç½ç½Žç½ç½‘罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞ç¾ç¾šç¾£ç¾¯ç¾²ç¾¹ç¾®ç¾¶ç¾¸è­±ç¿…翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻èŠè†è’è˜èšèŸè¢è¨è³è²è°è¶è¹è½è¿è‚„肆肅肛肓肚肭å†è‚¬èƒ›èƒ¥èƒ™èƒèƒ„胚胖脉胯胱脛脩脣脯腋"],["e7a1","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉è‡è‡‘臙臘臈臚臟臠臧臺臻臾èˆèˆ‚舅與舊èˆèˆèˆ–舩舫舸舳艀艙艘è‰è‰šè‰Ÿè‰¤è‰¢è‰¨è‰ªè‰«èˆ®è‰±è‰·è‰¸è‰¾èŠèŠ’芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙"],["e8a1","茵茴茖茲茱è€èŒ¹èè…茯茫茗茘莅莚莪莟莢莖茣莎莇莊è¼èŽµè³èµèŽ èŽ‰èŽ¨è´è“è«èŽè½èƒè˜è‹èè·è‡è è²èè¢è èŽ½è¸è”†è»è‘­èªè¼è•šè’„葷葫蒭葮蒂葩葆è¬è‘¯è‘¹èµè“Šè‘¢è’¹è’¿è’Ÿè“™è“蒻蓚è“è“蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"],["e9a1","è•è˜‚蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾è–藉薺è—è–¹è—è—•è—藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿è™ä¹•è™”號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉èœè›¹èœŠèœ´èœ¿èœ·èœ»èœ¥èœ©èœšè èŸè¸èŒèŽè´è—è¨è®è™"],["eaa1","è“è£èªè …螢螟螂螯蟋螽蟀èŸé›–螫蟄螳蟇蟆螻蟯蟲蟠è è èŸ¾èŸ¶èŸ·è ŽèŸ’蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫è¢è¡¾è¢žè¡µè¡½è¢µè¡²è¢‚袗袒袮袙袢è¢è¢¤è¢°è¢¿è¢±è£ƒè£„裔裘裙è£è£¹è¤‚裼裴裨裲褄褌褊褓襃褞褥褪褫è¥è¥„褻褶褸襌è¤è¥ è¥ž"],["eba1","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜è§è§§è§´è§¸è¨ƒè¨–è¨è¨Œè¨›è¨è¨¥è¨¶è©è©›è©’詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄è«è«‚諚諫諳諧諤諱謔諠諢諷諞諛謌謇謚諡謖è¬è¬—謠謳鞫謦謫謾謨è­è­Œè­è­Žè­‰è­–譛譚譫"],["eca1","譟譬譯譴譽讀讌讎讒讓讖讙讚谺è±è°¿è±ˆè±Œè±Žè±è±•è±¢è±¬è±¸è±ºè²‚貉貅貊è²è²Žè²”豼貘æˆè²­è²ªè²½è²²è²³è²®è²¶è³ˆè³è³¤è³£è³šè³½è³ºè³»è´„è´…è´Šè´‡è´è´è´é½Žè´“è³è´”贖赧赭赱赳è¶è¶™è·‚趾趺è·è·šè·–跌跛跋跪跫跟跣跼踈踉跿è¸è¸žè¸è¸Ÿè¹‚踵踰踴蹊"],["eda1","蹇蹉蹌è¹è¹ˆè¹™è¹¤è¹ è¸ªè¹£è¹•è¹¶è¹²è¹¼èºèº‡èº…躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡é€é€žé€–逋逧逶逵逹迸"],["eea1","ééé‘é’逎é‰é€¾é–é˜éžé¨é¯é¶éš¨é²é‚‚é½é‚邀邊邉é‚邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀é‡é‡‰é‡‹é‡é‡–釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋é‰éŠœéŠ–銓銛鉚é‹éŠ¹éŠ·é‹©éŒé‹ºé„錮"],["efa1","錙錢錚錣錺錵錻éœé é¼é®é–鎰鎬鎭鎔鎹é–é—é¨é¥é˜éƒéééˆé¤éšé”é“éƒé‡éé¶é«éµé¡éºé‘鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾é’鑿閂閇閊閔閖閘閙閠閨閧閭閼閻閹閾闊濶闃é—闌闕闔闖關闡闥闢阡阨阮阯陂陌é™é™‹é™·é™œé™ž"],["f0a1","é™é™Ÿé™¦é™²é™¬éšéš˜éš•éš—險隧隱隲隰隴隶隸隹雎雋雉é›è¥é›œéœé›•é›¹éœ„霆霈霓霎霑éœéœ–霙霤霪霰霹霽霾é„é†éˆé‚é‰éœé é¤é¦é¨å‹’é«é±é¹éž…é¼éžéºéž†éž‹éžéžéžœéž¨éž¦éž£éž³éž´éŸƒéŸ†éŸˆéŸ‹éŸœéŸ­é½éŸ²ç«ŸéŸ¶éŸµé é Œé ¸é ¤é ¡é ·é ½é¡†é¡é¡‹é¡«é¡¯é¡°"],["f1a1","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡é¤é¤žé¤¤é¤ é¤¬é¤®é¤½é¤¾é¥‚饉饅é¥é¥‹é¥‘饒饌饕馗馘馥馭馮馼駟駛é§é§˜é§‘駭駮駱駲駻駸é¨é¨é¨…駢騙騫騷驅驂驀驃騾驕é©é©›é©—驟驢驥驤驩驫驪骭骰骼髀é«é«‘髓體髞髟髢髣髦髯髫髮髴髱髷"],["f2a1","髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃é­é­é­Žé­‘魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆é¯é¯‘鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒éµé´¿é´¾éµ†éµˆ"],["f3a1","éµéµžéµ¤éµ‘éµéµ™éµ²é¶‰é¶‡é¶«éµ¯éµºé¶šé¶¤é¶©é¶²é·„é·é¶»é¶¸é¶ºé·†é·é·‚鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽éºéºˆéº‹éºŒéº’麕麑éºéº¥éº©éº¸éºªéº­é¡é»Œé»Žé»é»é»”黜點é»é» é»¥é»¨é»¯é»´é»¶é»·é»¹é»»é»¼é»½é¼‡é¼ˆçš·é¼•é¼¡é¼¬é¼¾é½Šé½’齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠"],["f4a1","堯槇é™ç‘¤å‡œç†™"],["f9a1","纊褜éˆéŠˆè“œä¿‰ç‚»æ˜±æ£ˆé‹¹æ›»å½…丨仡仼伀伃伹佖侒侊侚侔ä¿å€å€¢ä¿¿å€žå†å°å‚傔僴僘兊兤å†å†¾å‡¬åˆ•åŠœåŠ¦å‹€å‹›åŒ€åŒ‡åŒ¤å²åŽ“厲å﨎咜咊咩哿喆å™å¥åž¬åŸˆåŸ‡ï¨ï¨å¢žå¢²å¤‹å¥“奛å¥å¥£å¦¤å¦ºå­–寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹å·å¼¡å¼´å½§å¾·"],["faa1","å¿žæ悅悊惞惕愠惲愑愷愰憘戓抦æµæ‘ æ’擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗æ¦æž»æ¡’柀æ æ¡„æ£ï¨“楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬æ·æ·¸æ·²æ·¼æ¸¹æ¹œæ¸§æ¸¼æº¿æ¾ˆæ¾µæ¿µç€…瀇瀨炅炫ç„焄煜煆煇凞ç‡ç‡¾çŠ±"],["fba1","犾猤猪ç·çŽ½ç‰ç–ç£ç’ç‡çµç¦çªç©ç®ç‘¢ç’‰ç’Ÿç”畯皂皜皞皛皦益ç†åŠ¯ç ¡ç¡Žç¡¤ç¡ºç¤°ï¨˜ï¨™ï¨šç¦”福禛竑竧靖竫箞ï¨çµˆçµœç¶·ç¶ ç·–繒罇羡羽èŒè¢è¿è‡è¶è‘ˆè’´è•“蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣è»ï¨¤ï¨¥é§éƒžï¨¦é„•é„§é‡š"],["fca1","釗釞釭釮釤釥鈆éˆéˆŠéˆºé‰€éˆ¼é‰Žé‰™é‰‘鈹鉧銧鉷鉸鋧鋗鋙é‹ï¨§é‹•é‹ é‹“錥錡鋻﨨錞鋿éŒéŒ‚é°é—鎤é†éžé¸é±é‘…鑈閒隆﨩éšéš¯éœ³éœ»éƒééé‘é•é¡—顥飯飼餧館馞驎髙髜魵魲é®é®±é®»é°€éµ°éµ«ï¨­é¸™é»‘"],["fcf1","â…°",9,"¬¦'""],["8fa2af","˘ˇ¸˙˯˛˚~΄΅"],["8fa2c2","¡¦¿"],["8fa2eb","ºª©®™¤№"],["8fa6e1","ΆΈΉΊΪ"],["8fa6e7","ÎŒ"],["8fa6e9","ΎΫ"],["8fa6ec","Î"],["8fa6f1","άέήίϊÎόςÏϋΰώ"],["8fa7c2","Ђ",10,"ÐŽÐ"],["8fa7f2","Ñ’",10,"ўџ"],["8fa9a1","ÆÄ"],["8fa9a4","Ħ"],["8fa9a6","IJ"],["8fa9a8","ÅÄ¿"],["8fa9ab","ŊØŒ"],["8fa9af","ŦÞ"],["8fa9c1","æđðħıijĸłŀʼnŋøœßŧþ"],["8faaa1","ÃÀÄÂĂÇĀĄÅÃĆĈČÇĊĎÉÈËÊĚĖĒĘ"],["8faaba","ĜĞĢĠĤÃÃŒÃÃŽÇİĪĮĨĴĶĹĽĻŃŇŅÑÓÒÖÔǑÅŌÕŔŘŖŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙǕŴßŶŹŽŻ"],["8faba1","áàäâăǎÄąåãćĉÄçċÄéèëêěėēęǵÄÄŸ"],["8fabbd","ġĥíìïîÇ"],["8fabc5","īįĩĵķĺľļńňņñóòöôǒőÅõŕřŗśÅšşťţúùüûŭǔűūųůũǘǜǚǖŵýÿŷźžż"],["8fb0a1","丂丄丅丌丒丟丣两丨丫丮丯丰丵乀ä¹ä¹„乇乑乚乜乣乨乩乴乵乹乿äºäº–亗äºäº¯äº¹ä»ƒä»ä»šä»›ä» ä»¡ä»¢ä»¨ä»¯ä»±ä»³ä»µä»½ä»¾ä»¿ä¼€ä¼‚伃伈伋伌伒伕伖众伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘佟佣佪佬佮佱佷佸佹佺佽佾ä¾ä¾‚侄"],["8fb1a1","侅侉侊侌侎ä¾ä¾’侓侔侗侙侚侞侟侲侷侹侻侼侽侾俀ä¿ä¿…俆俈俉俋俌ä¿ä¿ä¿’俜俠俢俰俲俼俽俿倀å€å€„倇倊倌倎å€å€“倗倘倛倜å€å€žå€¢å€§å€®å€°å€²å€³å€µå€åå‚å…å†åŠåŒåŽå‘å’å“å—å™åŸå å¢å£å¦å§åªå­å°å±å€»å‚傃傄傆傊傎å‚å‚"],["8fb2a1","傒傓傔傖傛傜傞",4,"傪傯傰傹傺傽僀僃僄僇僌僎åƒåƒ“僔僘僜åƒåƒŸåƒ¢åƒ¤åƒ¦åƒ¨åƒ©åƒ¯åƒ±åƒ¶åƒºåƒ¾å„ƒå„†å„‡å„ˆå„‹å„Œå„儎僲å„儗儙儛儜å„儞儣儧儨儬儭儯儱儳儴儵儸儹兂兊å…兓兕兗兘兟兤兦兾冃冄冋冎冘å†å†¡å†£å†­å†¸å†ºå†¼å†¾å†¿å‡‚"],["8fb3a1","凈å‡å‡‘凒凓凕凘凞凢凥凮凲凳凴凷åˆåˆ‚刅划刓刕刖刘刢刨刱刲刵刼剅剉剕剗剘剚剜剟剠剡剦剮剷剸剹劀劂劅劊劌劓劕劖劗劘劚劜劤劥劦劧劯劰劶劷劸劺劻劽勀勄勆勈勌å‹å‹‘勔勖勛勜勡勥勨勩勪勬勰勱勴勶勷匀匃匊匋"],["8fb4a1","匌匑匓匘匛匜匞匟匥匧匨匩匫匬匭匰匲匵匼匽匾å‚åŒå‹å™å›å¡å£å¥å¬å­å²å¹å¾åŽƒåŽ‡åŽˆåŽŽåŽ“厔厙åŽåŽ¡åŽ¤åŽªåŽ«åŽ¯åŽ²åŽ´åŽµåŽ·åŽ¸åŽºåŽ½å€å…åå’å“å•åšååžå å¦å§åµå‚å“åšå¡å§å¨åªå¯å±å´åµå‘ƒå‘„呇å‘å‘呞呢呤呦呧呩呫呭呮呴呿"],["8fb5a1","å’咃咅咈咉å’咑咕咖咜咟咡咦咧咩咪咭咮咱咷咹咺咻咿哆哊å“哎哠哪哬哯哶哼哾哿唀å”唅唈唉唌å”唎唕唪唫唲唵唶唻唼唽å•å•‡å•‰å•Šå•å•å•‘啘啚啛啞啠啡啤啦啿å–喂喆喈喎å–喑喒喓喔喗喣喤喭喲喿å—嗃嗆嗉嗋嗌嗎嗑嗒"],["8fb6a1","嗓嗗嗘嗛嗞嗢嗩嗶嗿嘅嘈嘊å˜",5,"嘙嘬嘰嘳嘵嘷嘹嘻嘼嘽嘿噀å™å™ƒå™„噆噉噋å™å™å™”噞噠噡噢噣噦噩噭噯噱噲噵嚄嚅嚈嚋嚌嚕嚙嚚åšåšžåšŸåš¦åš§åš¨åš©åš«åš¬åš­åš±åš³åš·åš¾å›…囉囊囋å›å›å›Œå›å›™å›œå›å›Ÿå›¡å›¤",4,"囱囫园"],["8fb7a1","囶囷åœåœ‚圇圊圌圑圕圚圛åœåœ åœ¢åœ£åœ¤åœ¥åœ©åœªåœ¬åœ®åœ¯åœ³åœ´åœ½åœ¾åœ¿å…å†åŒåå’å¢å¥å§å¨å«å­",4,"å³å´åµå·å¹åºå»å¼å¾åžåžƒåžŒåž”垗垙垚垜åžåžžåžŸåž¡åž•åž§åž¨åž©åž¬åž¸åž½åŸ‡åŸˆåŸŒåŸåŸ•åŸåŸžåŸ¤åŸ¦åŸ§åŸ©åŸ­åŸ°åŸµåŸ¶åŸ¸åŸ½åŸ¾åŸ¿å ƒå „堈堉埡"],["8fb8a1","å Œå å ›å žå Ÿå  å ¦å §å ­å ²å ¹å ¿å¡‰å¡Œå¡å¡å¡å¡•å¡Ÿå¡¡å¡¤å¡§å¡¨å¡¸å¡¼å¡¿å¢€å¢å¢‡å¢ˆå¢‰å¢Šå¢Œå¢å¢å¢å¢”墖å¢å¢ å¢¡å¢¢å¢¦å¢©å¢±å¢²å£„墼壂壈å£å£Žå£å£’壔壖壚å£å£¡å£¢å£©å£³å¤…夆夋夌夒夓夔è™å¤å¤¡å¤£å¤¤å¤¨å¤¯å¤°å¤³å¤µå¤¶å¤¿å¥ƒå¥†å¥’奓奙奛å¥å¥žå¥Ÿå¥¡å¥£å¥«å¥­"],["8fb9a1","奯奲奵奶她奻奼妋妌妎妒妕妗妟妤妧妭妮妯妰妳妷妺妼å§å§ƒå§„姈姊å§å§’å§å§žå§Ÿå§£å§¤å§§å§®å§¯å§±å§²å§´å§·å¨€å¨„娌å¨å¨Žå¨’娓娞娣娤娧娨娪娭娰婄婅婇婈婌å©å©•å©žå©£å©¥å©§å©­å©·å©ºå©»å©¾åª‹åªåª“媖媙媜媞媟媠媢媧媬媱媲媳媵媸媺媻媿"],["8fbaa1","嫄嫆嫈å«å«šå«œå« å«¥å«ªå«®å«µå«¶å«½å¬€å¬å¬ˆå¬—嬴嬙嬛å¬å¬¡å¬¥å¬­å¬¸å­å­‹å­Œå­’孖孞孨孮孯孼孽孾孿å®å®„宆宊宎å®å®‘宓宔宖宨宩宬宭宯宱宲宷宺宼寀å¯å¯å¯å¯–",4,"寠寯寱寴寽尌尗尞尟尣尦尩尫尬尮尰尲尵尶屙屚屜屢屣屧屨屩"],["8fbba1","屭屰屴屵屺屻屼屽岇岈岊å²å²’å²å²Ÿå² å²¢å²£å²¦å²ªå²²å²´å²µå²ºå³‰å³‹å³’å³å³—峮峱峲峴å´å´†å´å´’崫崣崤崦崧崱崴崹崽崿嵂嵃嵆嵈嵕嵑嵙嵊嵟嵠嵡嵢嵤嵪嵭嵰嵹嵺嵾嵿å¶å¶ƒå¶ˆå¶Šå¶’嶓嶔嶕嶙嶛嶟嶠嶧嶫嶰嶴嶸嶹巃巇巋å·å·Žå·˜å·™å· å·¤"],["8fbca1","巩巸巹帀帇å¸å¸’帔帕帘帟帠帮帨帲帵帾幋å¹å¹‰å¹‘幖幘幛幜幞幨幪",4,"幰庀庋庎庢庤庥庨庪庬庱庳庽庾庿廆廌廋廎廑廒廔廕廜廞廥廫异弆弇弈弎弙弜å¼å¼¡å¼¢å¼£å¼¤å¼¨å¼«å¼¬å¼®å¼°å¼´å¼¶å¼»å¼½å¼¿å½€å½„彅彇å½å½å½”彘彛彠彣彤彧"],["8fbda1","彯彲彴彵彸彺彽彾徉å¾å¾å¾–徜å¾å¾¢å¾§å¾«å¾¤å¾¬å¾¯å¾°å¾±å¾¸å¿„忇忈忉忋å¿",4,"忞忡忢忨忩忪忬忭忮忯忲忳忶忺忼怇怊æ€æ€“怔怗怘怚怟怤怭怳怵æ€æ‡æˆæ‰æŒæ‘æ”æ–æ—ææ¡æ§æ±æ¾æ¿æ‚‚悆悈悊悎悑悓悕悘æ‚悞悢悤悥您悰悱悷"],["8fbea1","悻悾惂惄惈惉惊惋惎æƒæƒ”惕惙惛æƒæƒžæƒ¢æƒ¥æƒ²æƒµæƒ¸æƒ¼æƒ½æ„‚愇愊愌æ„",4,"愖愗愙愜愞愢愪愫愰愱愵愶愷愹æ…慅慆慉慞慠慬慲慸慻慼慿憀æ†æ†ƒæ†„憋æ†æ†’憓憗憘憜æ†æ†Ÿæ† æ†¥æ†¨æ†ªæ†­æ†¸æ†¹æ†¼æ‡€æ‡æ‡‚懎æ‡æ‡•æ‡œæ‡æ‡žæ‡Ÿæ‡¡æ‡¢æ‡§æ‡©æ‡¥"],["8fbfa1","懬懭懯æˆæˆƒæˆ„戇戓戕戜戠戢戣戧戩戫戹戽扂扃扄扆扌æ‰æ‰‘扒扔扖扚扜扤扭扯扳扺扽æŠæŠŽæŠæŠæŠ¦æŠ¨æŠ³æŠ¶æŠ·æŠºæŠ¾æŠ¿æ‹„拎拕拖拚拪拲拴拼拽挃挄挊挋æŒæŒæŒ“挖挘挩挪挭挵挶挹挼ææ‚æƒæ„æ†æŠæ‹æŽæ’æ“æ”æ˜æ›æ¥æ¦æ¬æ­æ±æ´æµ"],["8fc0a1","æ¸æ¼æ½æ¿æŽ‚掄掇掊æŽæŽ”掕掙掚掞掤掦掭掮掯掽ææ…æˆæŽæ‘æ“æ”æ•æœæ æ¥æªæ¬æ²æ³æµæ¸æ¹æ‰æŠææ’æ”æ˜æžæ æ¢æ¤æ¥æ©æªæ¯æ°æµæ½æ¿æ‘‹æ‘摑摒摓摔摚摛摜æ‘摟摠摡摣摭摳摴摻摽撅撇æ’æ’撑撘撙撛æ’撟撡撣撦撨撬撳撽撾撿"],["8fc1a1","擄擉擊擋擌擎æ“擑擕擗擤擥擩擪擭擰擵擷擻擿æ”攄攈攉攊æ”攓攔攖攙攛攞攟攢攦攩攮攱攺攼攽敃敇敉æ•æ•’敔敟敠敧敫敺敽æ–æ–…æ–Šæ–’æ–•æ–˜æ–斠斣斦斮斲斳斴斿旂旈旉旎æ—旔旖旘旟旰旲旴旵旹旾旿昀昄昈昉æ˜æ˜‘昒昕昖æ˜"],["8fc2a1","昞昡昢昣昤昦昩昪昫昬昮昰昱昳昹昷晀晅晆晊晌晑晎晗晘晙晛晜晠晡曻晪晫晬晾晳晵晿晷晸晹晻暀晼暋暌æšæšæš’暙暚暛暜暟暠暤暭暱暲暵暻暿曀曂曃曈曌曎æ›æ›”曛曟曨曫曬曮曺朅朇朎朓朙朜朠朢朳朾æ…æ‡æˆæŒæ”æ•æ"],["8fc3a1","æ¦æ¬æ®æ´æ¶æ»æžæž„枎æžæž‘枓枖枘枙枛枰枱枲枵枻枼枽柹柀柂柃柅柈柉柒柗柙柜柡柦柰柲柶柷桒栔栙æ æ Ÿæ ¨æ §æ ¬æ ­æ ¯æ °æ ±æ ³æ »æ ¿æ¡„桅桊桌桕桗桘桛桫桮",4,"桵桹桺桻桼梂梄梆梈梖梘梚梜梡梣梥梩梪梮梲梻棅棈棌æ£"],["8fc4a1","æ£æ£‘棓棖棙棜æ£æ£¥æ£¨æ£ªæ£«æ£¬æ£­æ£°æ£±æ£µæ£¶æ£»æ£¼æ£½æ¤†æ¤‰æ¤Šæ¤æ¤‘椓椖椗椱椳椵椸椻楂楅楉楎楗楛楣楤楥楦楨楩楬楰楱楲楺楻楿榀æ¦æ¦’榖榘榡榥榦榨榫榭榯榷榸榺榼槅槈槑槖槗槢槥槮槯槱槳槵槾樀æ¨æ¨ƒæ¨æ¨‘樕樚æ¨æ¨ æ¨¤æ¨¨æ¨°æ¨²"],["8fc5a1","樴樷樻樾樿橅橆橉橊橎æ©æ©‘橒橕橖橛橤橧橪橱橳橾æªæªƒæª†æª‡æª‰æª‹æª‘檛æªæªžæªŸæª¥æª«æª¯æª°æª±æª´æª½æª¾æª¿æ«†æ«‰æ«ˆæ«Œæ«æ«”æ«•æ«–æ«œæ«æ«¤æ«§æ«¬æ«°æ«±æ«²æ«¼æ«½æ¬‚欃欆欇欉æ¬æ¬æ¬‘欗欛欞欤欨欫欬欯欵欶欻欿歆歊æ­æ­’æ­–æ­˜æ­æ­ æ­§æ­«æ­®æ­°æ­µæ­½"],["8fc6a1","歾殂殅殗殛殟殠殢殣殨殩殬殭殮殰殸殹殽殾毃毄毉毌毖毚毡毣毦毧毮毱毷毹毿氂氄氅氉æ°æ°Žæ°æ°’氙氟氦氧氨氬氮氳氵氶氺氻氿汊汋æ±æ±æ±’汔汙汛汜汫汭汯汴汶汸汹汻沅沆沇沉沔沕沗沘沜沟沰沲沴泂泆æ³æ³æ³æ³‘泒泔泖"],["8fc7a1","泚泜泠泧泩泫泬泮泲泴洄洇洊洎æ´æ´‘洓洚洦洧洨汧洮洯洱洹洼洿浗浞浟浡浥浧浯浰浼涂涇涑涒涔涖涗涘涪涬涴涷涹涽涿淄淈淊淎æ·æ·–æ·›æ·æ·Ÿæ· æ·¢æ·¥æ·©æ·¯æ·°æ·´æ·¶æ·¼æ¸€æ¸„渞渢渧渲渶渹渻渼湄湅湈湉湋æ¹æ¹‘湒湓湔湗湜æ¹æ¹ž"],["8fc8a1","湢湣湨湳湻湽æºæº“溙溠溧溭溮溱溳溻溿滀æ»æ»ƒæ»‡æ»ˆæ»Šæ»æ»Žæ»æ»«æ»­æ»®æ»¹æ»»æ»½æ¼„漈漊漌æ¼æ¼–漘漚漛漦漩漪漯漰漳漶漻漼漭æ½æ½‘潒潓潗潙潚æ½æ½žæ½¡æ½¢æ½¨æ½¬æ½½æ½¾æ¾ƒæ¾‡æ¾ˆæ¾‹æ¾Œæ¾æ¾æ¾’澓澔澖澚澟澠澥澦澧澨澮澯澰澵澶澼濅濇濈濊"],["8fc9a1","濚濞濨濩濰濵濹濼濽瀀瀅瀆瀇ç€ç€—瀠瀣瀯瀴瀷瀹瀼çƒç„çˆç‰çŠç‹ç”ç•ççžçŽç¤ç¥ç¬ç®çµç¶ç¾ç‚炅炆炔",4,"炛炤炫炰炱炴炷烊烑烓烔烕烖烘烜烤烺焃",4,"ç„‹ç„Œç„焞焠焫焭焯焰焱焸ç…煅煆煇煊煋ç…煒煗煚煜煞煠"],["8fcaa1","煨煹熀熅熇熌熒熚熛熠熢熯熰熲熳熺熿燀ç‡ç‡„燋燌燓燖燙燚燜燸燾爀爇爈爉爓爗爚çˆçˆŸçˆ¤çˆ«çˆ¯çˆ´çˆ¸çˆ¹ç‰ç‰‚牃牅牎ç‰ç‰ç‰“牕牖牚牜牞牠牣牨牫牮牯牱牷牸牻牼牿犄犉çŠçŠŽçŠ“犛犨犭犮犱犴犾ç‹ç‹‡ç‹‰ç‹Œç‹•ç‹–狘狟狥狳狴狺狻"],["8fcba1","狾猂猄猅猇猋çŒçŒ’猓猘猙猞猢猤猧猨猬猱猲猵猺猻猽çƒççç’ç–ç˜ççžçŸç ç¦ç§ç©ç«ç¬ç®ç¯ç±ç·ç¹ç¼çŽ€çŽçŽƒçŽ…玆玎çŽçŽ“玕玗玘玜玞玟玠玢玥玦玪玫玭玵玷玹玼玽玿ç…ç†ç‰ç‹çŒçç’ç“ç–ç™çç¡ç£ç¦ç§ç©ç´çµç·ç¹çºç»ç½"],["8fcca1","ç¿ç€çç„ç‡çŠç‘çšç›ç¤ç¦ç¨",9,"ç¹ç‘€ç‘ƒç‘„瑆瑇瑋ç‘ç‘‘ç‘’ç‘—ç‘瑢瑦瑧瑨瑫瑭瑮瑱瑲璀ç’璅璆璇璉ç’ç’璑璒璘璙璚璜璟璠璡璣璦璨璩璪璫璮璯璱璲璵璹璻璿瓈瓉瓌ç“瓓瓘瓚瓛瓞瓟瓤瓨瓪瓫瓯瓴瓺瓻瓼瓿甆"],["8fcda1","甒甖甗甠甡甤甧甩甪甯甶甹甽甾甿畀畃畇畈畎ç•ç•’畗畞畟畡畯畱畹",5,"ç–ç–…ç–疒疓疕疙疜疢疤疴疺疿痀ç—痄痆痌痎ç—痗痜痟痠痡痤痧痬痮痯痱痹瘀瘂瘃瘄瘇瘈瘊瘌ç˜ç˜’瘓瘕瘖瘙瘛瘜ç˜ç˜žç˜£ç˜¥ç˜¦ç˜©ç˜­ç˜²ç˜³ç˜µç˜¸ç˜¹"],["8fcea1","瘺瘼癊癀ç™ç™ƒç™„癅癉癋癕癙癟癤癥癭癮癯癱癴çšçš…皌çšçš•çš›çšœçšçšŸçš çš¢",6,"皪皭皽ç›ç›…盉盋盌盎盔盙盠盦盨盬盰盱盶盹盼眀眆眊眎眒眔眕眗眙眚眜眢眨眭眮眯眴眵眶眹眽眾ç‚ç…ç†çŠççŽçç’ç–ç—çœçžçŸç ç¢"],["8fcfa1","ç¤ç§çªç¬ç°ç²ç³ç´çºç½çž€çž„瞌çžçž”瞕瞖瞚瞟瞢瞧瞪瞮瞯瞱瞵瞾矃矉矑矒矕矙矞矟矠矤矦矪矬矰矱矴矸矻砅砆砉ç ç Žç ‘ç ç ¡ç ¢ç £ç ­ç ®ç °ç µç ·ç¡ƒç¡„硇硈硌硎硒硜硞硠硡硣硤硨硪确硺硾碊ç¢ç¢”碘碡ç¢ç¢žç¢Ÿç¢¤ç¢¨ç¢¬ç¢­ç¢°ç¢±ç¢²ç¢³"],["8fd0a1","碻碽碿磇磈磉磌磎磒磓磕磖磤磛磟磠磡磦磪磲磳礀磶磷磺磻磿礆礌ç¤ç¤šç¤œç¤žç¤Ÿç¤ ç¤¥ç¤§ç¤©ç¤­ç¤±ç¤´ç¤µç¤»ç¤½ç¤¿ç¥„祅祆祊祋ç¥ç¥‘祔祘祛祜祧祩祫祲祹祻祼祾禋禌禑禓禔禕禖禘禛禜禡禨禩禫禯禱禴禸离秂秄秇秈秊ç§ç§”秖秚ç§ç§ž"],["8fd1a1","秠秢秥秪秫秭秱秸秼稂稃稇稉稊稌稑稕稛稞稡稧稫稭稯稰稴稵稸稹稺穄穅穇穈穌穕穖穙穜ç©ç©Ÿç© ç©¥ç©§ç©ªç©­ç©µç©¸ç©¾çª€çª‚窅窆窊窋çªçª‘窔窞窠窣窬窳窵窹窻窼竆竉竌竎竑竛竨竩竫竬竱竴竻竽竾笇笔笟笣笧笩笪笫笭笮笯笰"],["8fd2a1","笱笴笽笿筀ç­ç­‡ç­Žç­•ç­ ç­¤ç­¦ç­©ç­ªç­­ç­¯ç­²ç­³ç­·ç®„箉箎ç®ç®‘箖箛箞箠箥箬箯箰箲箵箶箺箻箼箽篂篅篈篊篔篖篗篙篚篛篨篪篲篴篵篸篹篺篼篾ç°ç°‚簃簄簆簉簋簌簎ç°ç°™ç°›ç° ç°¥ç°¦ç°¨ç°¬ç°±ç°³ç°´ç°¶ç°¹ç°ºç±†ç±Šç±•ç±‘籒籓籙",5],["8fd3a1","籡籣籧籩籭籮籰籲籹籼籽粆粇ç²ç²”粞粠粦粰粶粷粺粻粼粿糄糇糈糉ç³ç³ç³“糔糕糗糙糚ç³ç³¦ç³©ç³«ç³µç´ƒç´‡ç´ˆç´‰ç´ç´‘ç´’ç´“ç´–ç´ç´žç´£ç´¦ç´ªç´­ç´±ç´¼ç´½ç´¾çµ€çµçµ‡çµˆçµçµ‘絓絗絙絚絜çµçµ¥çµ§çµªçµ°çµ¸çµºçµ»çµ¿ç¶ç¶‚綃綅綆綈綋綌ç¶ç¶‘綖綗ç¶"],["8fd4a1","綞綦綧綪綳綶綷綹緂",4,"ç·Œç·ç·Žç·—緙縀緢緥緦緪緫緭緱緵緶緹緺縈ç¸ç¸‘縕縗縜ç¸ç¸ ç¸§ç¸¨ç¸¬ç¸­ç¸¯ç¸³ç¸¶ç¸¿ç¹„繅繇繎ç¹ç¹’繘繟繡繢繥繫繮繯繳繸繾çºçº†çº‡çºŠçºçº‘纕纘纚çºçºžç¼¼ç¼»ç¼½ç¼¾ç¼¿ç½ƒç½„罇ç½ç½’罓罛罜ç½ç½¡ç½£ç½¤ç½¥ç½¦ç½­"],["8fd5a1","罱罽罾罿羀羋ç¾ç¾ç¾ç¾‘羖羗羜羡羢羦羪羭羴羼羿翀翃翈翎ç¿ç¿›ç¿Ÿç¿£ç¿¥ç¿¨ç¿¬ç¿®ç¿¯ç¿²ç¿ºç¿½ç¿¾ç¿¿è€‡è€ˆè€Šè€è€Žè€è€‘耓耔耖è€è€žè€Ÿè€ è€¤è€¦è€¬è€®è€°è€´è€µè€·è€¹è€ºè€¼è€¾è€è„è è¤è¦è­è±èµè‚肈肎肜肞肦肧肫肸肹胈èƒèƒèƒ’胔胕胗胘胠胭胮"],["8fd6a1","胰胲胳胶胹胺胾脃脋脖脗脘脜脞脠脤脧脬脰脵脺脼腅腇腊腌腒腗腠腡腧腨腩腭腯腷è†è†è†„膅膆膋膎膖膘膛膞膢膮膲膴膻臋臃臅臊臎è‡è‡•è‡—臛è‡è‡žè‡¡è‡¤è‡«è‡¬è‡°è‡±è‡²è‡µè‡¶è‡¸è‡¹è‡½è‡¿èˆ€èˆƒèˆèˆ“舔舙舚èˆèˆ¡èˆ¢èˆ¨èˆ²èˆ´èˆºè‰ƒè‰„艅艆"],["8fd7a1","艋艎è‰è‰‘艖艜艠艣艧艭艴艻艽艿芀èŠèŠƒèŠ„芇芉芊芎芑芔芖芘芚芛芠芡芣芤芧芨芩芪芮芰芲芴芷芺芼芾芿苆è‹è‹•è‹šè‹ è‹¢è‹¤è‹¨è‹ªè‹­è‹¯è‹¶è‹·è‹½è‹¾èŒ€èŒèŒ‡èŒˆèŒŠèŒ‹è”茛èŒèŒžèŒŸèŒ¡èŒ¢èŒ¬èŒ­èŒ®èŒ°èŒ³èŒ·èŒºèŒ¼èŒ½è‚èƒè„è‡èèŽè‘è•è–è—è°è¸"],["8fd8a1","è½è¿èŽ€èŽ‚莄莆èŽèŽ’莔莕莘莙莛莜èŽèŽ¦èŽ§èŽ©èŽ¬èŽ¾èŽ¿è€è‡è‰èèè‘è”èè“è¨èªè¶è¸è¹è¼èè†èŠèè‘è•è™èŽ­è¯è¹è‘…葇葈葊è‘è‘葑葒葖葘葙葚葜葠葤葥葧葪葰葳葴葶葸葼葽è’蒅蒒蒓蒕蒞蒦蒨蒩蒪蒯蒱蒴蒺蒽蒾蓀蓂蓇蓈蓌è“è““"],["8fd9a1","蓜蓧蓪蓯蓰蓱蓲蓷蔲蓺蓻蓽蔂蔃蔇蔌蔎è”蔜蔞蔢蔣蔤蔥蔧蔪蔫蔯蔳蔴蔶蔿蕆è•",4,"蕖蕙蕜",6,"蕤蕫蕯蕹蕺蕻蕽蕿è–薅薆薉薋薌è–è–“è–˜è–薟薠薢薥薧薴薶薷薸薼薽薾薿藂藇藊藋藎薭藘藚藟藠藦藨藭藳藶藼"],["8fdaa1","藿蘀蘄蘅è˜è˜Žè˜è˜‘蘒蘘蘙蘛蘞蘡蘧蘩蘶蘸蘺蘼蘽虀虂虆虒虓虖虗虘虙è™è™ ",4,"虩虬虯虵虶虷虺èšèš‘蚖蚘蚚蚜蚡蚦蚧蚨蚭蚱蚳蚴蚵蚷蚸蚹蚿蛀è›è›ƒè›…蛑蛒蛕蛗蛚蛜蛠蛣蛥蛧蚈蛺蛼蛽蜄蜅蜇蜋蜎èœèœèœ“蜔蜙蜞蜟蜡蜣"],["8fdba1","蜨蜮蜯蜱蜲蜹蜺蜼蜽蜾è€èƒè…èè˜èè¡è¤è¥è¯è±è²è»èžƒ",6,"螋螌èžèž“螕螗螘螙螞螠螣螧螬螭螮螱螵螾螿èŸèŸˆèŸ‰èŸŠèŸŽèŸ•èŸ–蟙蟚蟜蟟蟢蟣蟤蟪蟫蟭蟱蟳蟸蟺蟿è è ƒè †è ‰è Šè ‹è è ™è ’蠓蠔蠘蠚蠛蠜蠞蠟蠨蠭蠮蠰蠲蠵"],["8fdca1","蠺蠼è¡è¡ƒè¡…衈衉衊衋衎衑衕衖衘衚衜衟衠衤衩衱衹衻袀袘袚袛袜袟袠袨袪袺袽袾裀裊",4,"裑裒裓裛裞裧裯裰裱裵裷è¤è¤†è¤è¤Žè¤è¤•è¤–褘褙褚褜褠褦褧褨褰褱褲褵褹褺褾襀襂襅襆襉è¥è¥’襗襚襛襜襡襢襣襫襮襰襳襵襺"],["8fdda1","襻襼襽覉è¦è¦è¦”覕覛覜覟覠覥覰覴覵覶覷覼觔",4,"觥觩觫觭觱觳觶觹觽觿訄訅訇è¨è¨‘訒訔訕訞訠訢訤訦訫訬訯訵訷訽訾詀詃詅詇詉è©è©Žè©“詖詗詘詜è©è©¡è©¥è©§è©µè©¶è©·è©¹è©ºè©»è©¾è©¿èª€èªƒèª†èª‹èªèªèª’誖誗誙誟誧誩誮誯誳"],["8fdea1","誶誷誻誾諃諆諈諉諊諑諓諔諕諗è«è«Ÿè«¬è«°è«´è«µè«¶è«¼è«¿è¬…謆謋謑謜謞謟謊謭謰謷謼譂",4,"譈譒譓譔譙è­è­žè­£è­­è­¶è­¸è­¹è­¼è­¾è®è®„讅讋è®è®è®”讕讜讞讟谸谹谽谾豅豇豉豋è±è±‘豓豔豗豘豛è±è±™è±£è±¤è±¦è±¨è±©è±­è±³è±µè±¶è±»è±¾è²†"],["8fdfa1","貇貋è²è²’貓貙貛貜貤貹貺賅賆賉賋è³è³–賕賙è³è³¡è³¨è³¬è³¯è³°è³²è³µè³·è³¸è³¾è³¿è´è´ƒè´‰è´’贗贛赥赩赬赮赿趂趄趈è¶è¶è¶‘趕趞趟趠趦趫趬趯趲趵趷趹趻跀跅跆跇跈跊跎跑跔跕跗跙跤跥跧跬跰趼跱跲跴跽è¸è¸„踅踆踋踑踔踖踠踡踢"],["8fe0a1","踣踦踧踱踳踶踷踸踹踽蹀è¹è¹‹è¹è¹Žè¹è¹”蹛蹜è¹è¹žè¹¡è¹¢è¹©è¹¬è¹­è¹¯è¹°è¹±è¹¹è¹ºè¹»èº‚躃躉èºèº’躕躚躛èºèºžèº¢èº§èº©èº­èº®èº³èºµèººèº»è»€è»è»ƒè»„軇è»è»‘軔軜軨軮軰軱軷軹軺軭輀輂輇輈è¼è¼è¼–輗輘輞輠輡輣輥輧輨輬輭輮輴輵輶輷輺轀è½"],["8fe1a1","轃轇è½è½‘",4,"轘è½è½žè½¥è¾è¾ è¾¡è¾¤è¾¥è¾¦è¾µè¾¶è¾¸è¾¾è¿€è¿è¿†è¿Šè¿‹è¿è¿è¿’迓迕迠迣迤迨迮迱迵迶迻迾适逄逈逌逘逛逨逩逯逪逬逭逳逴逷逿éƒé„éŒé›éé¢é¦é§é¬é°é´é¹é‚…邈邋邌邎é‚邕邗邘邙邛邠邡邢邥邰邲邳邴邶邽郌邾郃"],["8fe2a1","郄郅郇郈郕郗郘郙郜éƒéƒŸéƒ¥éƒ’郶郫郯郰郴郾郿鄀鄄鄅鄆鄈é„é„鄔鄖鄗鄘鄚鄜鄞鄠鄥鄢鄣鄧鄩鄮鄯鄱鄴鄶鄷鄹鄺鄼鄽酃酇酈é…酓酗酙酚酛酡酤酧酭酴酹酺酻é†é†ƒé†…醆醊醎醑醓醔醕醘醞醡醦醨醬醭醮醰醱醲醳醶醻醼醽醿"],["8fe3a1","釂釃釅釓釔釗釙釚釞釤釥釩釪釬",5,"釷釹釻釽鈀éˆéˆ„鈅鈆鈇鈉鈊鈌éˆéˆ’鈓鈖鈘鈜éˆéˆ£éˆ¤éˆ¥éˆ¦éˆ¨éˆ®éˆ¯éˆ°éˆ³éˆµéˆ¶éˆ¸éˆ¹éˆºéˆ¼éˆ¾é‰€é‰‚鉃鉆鉇鉊é‰é‰Žé‰é‰‘鉘鉙鉜é‰é‰ é‰¡é‰¥é‰§é‰¨é‰©é‰®é‰¯é‰°é‰µ",4,"鉻鉼鉽鉿銈銉銊éŠéŠŽéŠ’銗"],["8fe4a1","銙銟銠銤銥銧銨銫銯銲銶銸銺銻銼銽銿",4,"鋅鋆鋇鋈鋋鋌é‹é‹Žé‹é‹“鋕鋗鋘鋙鋜é‹é‹Ÿé‹ é‹¡é‹£é‹¥é‹§é‹¨é‹¬é‹®é‹°é‹¹é‹»é‹¿éŒ€éŒ‚錈éŒéŒ‘錔錕錜éŒéŒžéŒŸéŒ¡éŒ¤éŒ¥éŒ§éŒ©éŒªéŒ³éŒ´éŒ¶éŒ·é‡éˆé‰éé‘é’é•é—é˜éšéžé¤é¥é§é©éªé­é¯é°é±é³é´é¶"],["8fe5a1","éºé½é¿éŽ€éŽéŽ‚鎈鎊鎋éŽéŽéŽ’鎕鎘鎛鎞鎡鎣鎤鎦鎨鎫鎴鎵鎶鎺鎩éé„é…é†é‡é‰",4,"é“é™éœéžéŸé¢é¦é§é¹é·é¸éºé»é½éé‚é„éˆé‰ééŽéé•é–é—éŸé®é¯é±é²é³é´é»é¿é½é‘ƒé‘…鑈鑊鑌鑕鑙鑜鑟鑡鑣鑨鑫鑭鑮鑯鑱鑲钄钃镸镹"],["8fe6a1","镾閄閈閌é–é–Žé–閞閟閡閦閩閫閬閴閶閺閽閿闆闈闉闋é—闑闒闓闙闚é—闞闟闠闤闦é˜é˜žé˜¢é˜¤é˜¥é˜¦é˜¬é˜±é˜³é˜·é˜¸é˜¹é˜ºé˜¼é˜½é™é™’陔陖陗陘陡陮陴陻陼陾陿éšéš‚隃隄隉隑隖隚éšéšŸéš¤éš¥éš¦éš©éš®éš¯éš³éšºé›Šé›’嶲雘雚é›é›žé›Ÿé›©é›¯é›±é›ºéœ‚"],["8fe7a1","霃霅霉霚霛éœéœ¡éœ¢éœ£éœ¨éœ±éœ³ééƒéŠéŽéé•é—é˜éšé›é£é§éªé®é³é¶é·é¸é»é½é¿éž€éž‰éž•éž–鞗鞙鞚鞞鞟鞢鞬鞮鞱鞲鞵鞶鞸鞹鞺鞼鞾鞿éŸéŸ„韅韇韉韊韌éŸéŸŽéŸéŸ‘韔韗韘韙éŸéŸžéŸ éŸ›éŸ¡éŸ¤éŸ¯éŸ±éŸ´éŸ·éŸ¸éŸºé ‡é Šé ™é é Žé ”頖頜頞頠頣頦"],["8fe8a1","頫頮頯頰頲頳頵頥頾顄顇顊顑顒顓顖顗顙顚顢顣顥顦顪顬颫颭颮颰颴颷颸颺颻颿飂飅飈飌飡飣飥飦飧飪飳飶餂餇餈餑餕餖餗餚餛餜餟餢餦餧餫餱",4,"餹餺餻餼饀é¥é¥†é¥‡é¥ˆé¥é¥Žé¥”饘饙饛饜饞饟饠馛é¦é¦Ÿé¦¦é¦°é¦±é¦²é¦µ"],["8fe9a1","馹馺馽馿駃駉駓駔駙駚駜駞駧駪駫駬駰駴駵駹駽駾騂騃騄騋騌é¨é¨‘騖騞騠騢騣騤騧騭騮騳騵騶騸驇é©é©„驊驋驌驎驑驔驖é©éªªéª¬éª®éª¯éª²éª´éªµéª¶éª¹éª»éª¾éª¿é«é«ƒé«†é«ˆé«Žé«é«’髕髖髗髛髜髠髤髥髧髩髬髲髳髵髹髺髽髿",4],["8feaa1","鬄鬅鬈鬉鬋鬌é¬é¬Žé¬é¬’鬖鬙鬛鬜鬠鬦鬫鬭鬳鬴鬵鬷鬹鬺鬽魈魋魌魕魖魗魛魞魡魣魥魦魨魪",4,"魳魵魷魸魹魿鮀鮄鮅鮆鮇鮉鮊鮋é®é®é®é®”鮚é®é®žé®¦é®§é®©é®¬é®°é®±é®²é®·é®¸é®»é®¼é®¾é®¿é¯é¯‡é¯ˆé¯Žé¯é¯—鯘é¯é¯Ÿé¯¥é¯§é¯ªé¯«é¯¯é¯³é¯·é¯¸"],["8feba1","鯹鯺鯽鯿鰀鰂鰋é°é°‘鰖鰘鰙鰚鰜鰞鰢鰣鰦",4,"鰱鰵鰶鰷鰽é±é±ƒé±„鱅鱉鱊鱎é±é±é±“鱔鱖鱘鱛é±é±žé±Ÿé±£é±©é±ªé±œé±«é±¨é±®é±°é±²é±µé±·é±»é³¦é³²é³·é³¹é´‹é´‚鴑鴗鴘鴜é´é´žé´¯é´°é´²é´³é´´é´ºé´¼éµ…鴽鵂鵃鵇鵊鵓鵔鵟鵣鵢鵥鵩鵪鵫鵰鵶鵷鵻"],["8feca1","鵼鵾鶃鶄鶆鶊é¶é¶Žé¶’鶓鶕鶖鶗鶘鶡鶪鶬鶮鶱鶵鶹鶼鶿鷃鷇鷉鷊鷔鷕鷖鷗鷚鷞鷟鷠鷥鷧鷩鷫鷮鷰鷳鷴鷾鸊鸂鸇鸎é¸é¸‘鸒鸕鸖鸙鸜é¸é¹ºé¹»é¹¼éº€éº‚麃麄麅麇麎éºéº–麘麛麞麤麨麬麮麯麰麳麴麵黆黈黋黕黟黤黧黬黭黮黰黱黲黵"],["8feda1","黸黿鼂鼃鼉é¼é¼é¼‘鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿é½é½ƒ",4,"齓齕齖齗齘齚é½é½žé½¨é½©é½­",4,"齳齵齺齽é¾é¾é¾‘龒龔龖龗龞龡龢龣龥"]]')},39909:e=>{"use strict";e.exports=JSON.parse('{"uChars":[128,165,169,178,184,216,226,235,238,244,248,251,253,258,276,284,300,325,329,334,364,463,465,467,469,471,473,475,477,506,594,610,712,716,730,930,938,962,970,1026,1104,1106,8209,8215,8218,8222,8231,8241,8244,8246,8252,8365,8452,8454,8458,8471,8482,8556,8570,8596,8602,8713,8720,8722,8726,8731,8737,8740,8742,8748,8751,8760,8766,8777,8781,8787,8802,8808,8816,8854,8858,8870,8896,8979,9322,9372,9548,9588,9616,9622,9634,9652,9662,9672,9676,9680,9702,9735,9738,9793,9795,11906,11909,11913,11917,11928,11944,11947,11951,11956,11960,11964,11979,12284,12292,12312,12319,12330,12351,12436,12447,12535,12543,12586,12842,12850,12964,13200,13215,13218,13253,13263,13267,13270,13384,13428,13727,13839,13851,14617,14703,14801,14816,14964,15183,15471,15585,16471,16736,17208,17325,17330,17374,17623,17997,18018,18212,18218,18301,18318,18760,18811,18814,18820,18823,18844,18848,18872,19576,19620,19738,19887,40870,59244,59336,59367,59413,59417,59423,59431,59437,59443,59452,59460,59478,59493,63789,63866,63894,63976,63986,64016,64018,64021,64025,64034,64037,64042,65074,65093,65107,65112,65127,65132,65375,65510,65536],"gbChars":[0,36,38,45,50,81,89,95,96,100,103,104,105,109,126,133,148,172,175,179,208,306,307,308,309,310,311,312,313,341,428,443,544,545,558,741,742,749,750,805,819,820,7922,7924,7925,7927,7934,7943,7944,7945,7950,8062,8148,8149,8152,8164,8174,8236,8240,8262,8264,8374,8380,8381,8384,8388,8390,8392,8393,8394,8396,8401,8406,8416,8419,8424,8437,8439,8445,8482,8485,8496,8521,8603,8936,8946,9046,9050,9063,9066,9076,9092,9100,9108,9111,9113,9131,9162,9164,9218,9219,11329,11331,11334,11336,11346,11361,11363,11366,11370,11372,11375,11389,11682,11686,11687,11692,11694,11714,11716,11723,11725,11730,11736,11982,11989,12102,12336,12348,12350,12384,12393,12395,12397,12510,12553,12851,12962,12973,13738,13823,13919,13933,14080,14298,14585,14698,15583,15847,16318,16434,16438,16481,16729,17102,17122,17315,17320,17402,17418,17859,17909,17911,17915,17916,17936,17939,17961,18664,18703,18814,18962,19043,33469,33470,33471,33484,33485,33490,33497,33501,33505,33513,33520,33536,33550,37845,37921,37948,38029,38038,38064,38065,38066,38069,38075,38076,38078,39108,39109,39113,39114,39115,39116,39265,39394,189000]}')},4764:e=>{"use strict";e.exports=JSON.parse('[["a140","",62],["a180","î”…",32],["a240","",62],["a280","î•¥",32],["a2ab","î¦",5],["a2e3","€î­"],["a2ef","î®î¯"],["a2fd","î°î±"],["a340","î–†",62],["a380","î—…",31," "],["a440","î—¦",62],["a480","",32],["a4f4","î²",10],["a540","",62],["a580","îš…",32],["a5f7","î½",7],["a640","",62],["a680","",32],["a6b9","îž…",7],["a6d9","îž",6],["a6ec",""],["a6f3","îž–"],["a6f6","îž—",8],["a740","",62],["a780","î…",32],["a7c2","îž ",14],["a7f2","",12],["a896","îž¼",10],["a8bc",""],["a8bf","ǹ"],["a8c1",""],["a8ea","îŸ",20],["a958",""],["a95b",""],["a95d",""],["a989","〾⿰",11],["a997","",12],["a9f0","î ",14],["aaa1","",93],["aba1","îž",93],["aca1","",93],["ada1","î„š",93],["aea1","î…¸",93],["afa1","",93],["d7fa","î ",4],["f8a1","",93],["f9a1","",93],["faa1","î‹°",93],["fba1","îŽ",93],["fca1","",93],["fda1","îŠ",93],["fe50","âºî –⺄㑳㑇⺈⺋㖞㘚㘎⺌⺗㥮㤘ã§ã§Ÿã©³ã§î «î ¬ã­Žã±®ã³ âº§î ±î ²âºªä–䅟⺮䌷⺳⺶⺷䎱䎬⺻ä䓖䙡䙌"],["fe80","䜣䜩ä¼äžâ»Šä¥‡ä¥ºä¥½ä¦‚䦃䦅䦆䦟䦛䦷䦶䲣䲟䲠䲡䱷䲢䴓",6,"䶮",93]]')},49688:e=>{"use strict";e.exports=JSON.parse('[["0","\\u0000",128],["a1","。",62],["8140"," ã€ã€‚,.・:;?ï¼ã‚›ã‚œÂ´ï½€Â¨ï¼¾ï¿£ï¼¿ãƒ½ãƒ¾ã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ï½žâˆ¥ï½œâ€¦â€¥â€˜â€™â€œâ€ï¼ˆï¼‰ã€”〕[]{ï½ã€ˆ",9,"+ï¼Â±Ã—"],["8180","÷ï¼â‰ ï¼œï¼žâ‰¦â‰§âˆžâˆ´â™‚♀°′″℃¥$¢£%#&*@§☆★○â—◎◇◆□■△▲▽▼※〒→â†â†‘↓〓"],["81b8","∈∋⊆⊇⊂⊃∪∩"],["81c8","∧∨¬⇒⇔∀∃"],["81da","∠⊥⌒∂∇≡≒≪≫√∽âˆâˆµâˆ«âˆ¬"],["81f0","ʼn♯♭♪†‡¶"],["81fc","â—¯"],["824f","ï¼",9],["8260","A",25],["8281","ï½",25],["829f","ã",82],["8340","ã‚¡",62],["8380","ム",22],["839f","Α",16,"Σ",6],["83bf","α",16,"σ",6],["8440","Ð",5,"ÐЖ",25],["8470","а",5,"ёж",7],["8480","о",17],["849f","─│┌â”┘└├┬┤┴┼â”┃â”┓┛┗┣┳┫┻╋┠┯┨┷┿â”┰┥┸╂"],["8740","â‘ ",19,"â… ",9],["875f","ã‰ãŒ”㌢ã㌘㌧㌃㌶ã‘ã—ãŒãŒ¦ãŒ£ãŒ«ãŠãŒ»ãŽœãŽãŽžãŽŽãŽã„㎡"],["877e","ã»"],["8780","ã€ã€Ÿâ„–ã℡㊤",4,"㈱㈲㈹ã¾ã½ã¼â‰’≡∫∮∑√⊥∠∟⊿∵∩∪"],["889f","亜唖娃阿哀愛挨姶逢葵茜ç©æ‚ªæ¡æ¸¥æ—­è‘¦èŠ¦é¯µæ¢“圧斡扱宛å§è™»é£´çµ¢ç¶¾é®Žæˆ–粟袷安庵按暗案闇éžæ以伊ä½ä¾å‰å›²å¤·å§”å¨å°‰æƒŸæ„慰易椅為ç•ç•°ç§»ç¶­ç·¯èƒƒèŽè¡£è¬‚é•éºåŒ»äº•äº¥åŸŸè‚²éƒç£¯ä¸€å£±æº¢é€¸ç¨²èŒ¨èŠ‹é°¯å…å°å’½å“¡å› å§»å¼•é£²æ·«èƒ¤è”­"],["8940","院陰隠韻å‹å³å®‡çƒç¾½è¿‚雨å¯éµœçªºä¸‘碓臼渦嘘唄æ¬è”šé°»å§¥åŽ©æµ¦ç“œé–噂云é‹é›²è餌å¡å–¶å¬°å½±æ˜ æ›³æ „永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦è¬è¶Šé–²æ¦ŽåŽ­å††"],["8980","園堰奄宴延怨掩æ´æ²¿æ¼”炎焔煙燕猿ç¸è‰¶è‹‘è–—é é‰›é´›å¡©æ–¼æ±šç”¥å‡¹å¤®å¥¥å¾€å¿œæŠ¼æ—ºæ¨ªæ¬§æ®´çŽ‹ç¿è¥–鴬鴎黄岡沖è»å„„屋憶臆桶牡乙俺å¸æ©æ¸©ç©éŸ³ä¸‹åŒ–仮何伽価佳加å¯å˜‰å¤å«å®¶å¯¡ç§‘暇果架歌河ç«ç‚ç¦ç¦¾ç¨¼ç®‡èŠ±è‹›èŒ„è·è¯è“è¦èª²å˜©è²¨è¿¦éŽéœžèšŠä¿„峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔æ¢æ‡æˆ’æ‹æ”¹"],["8a40","é­æ™¦æ¢°æµ·ç°ç•Œçš†çµµèŠ¥èŸ¹é–‹éšŽè²å‡±åŠ¾å¤–咳害崖慨概涯ç¢è“‹è¡—該鎧骸浬馨蛙垣柿蛎鈎劃嚇å„廓拡撹格核殻ç²ç¢ºç©«è¦šè§’赫較郭閣隔é©å­¦å²³æ¥½é¡é¡ŽæŽ›ç¬ æ¨«"],["8a80","橿梶é°æ½Ÿå‰²å–æ°æ‹¬æ´»æ¸‡æ»‘è‘›è¤è½„且鰹å¶æ¤›æ¨ºéž„株兜竃蒲釜鎌噛鴨栢茅è±ç²¥åˆˆè‹…瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾æ›æ•¢æŸ‘桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰è‚艦莞観諌貫還鑑間閑関陥韓館舘丸å«å²¸å·ŒçŽ©ç™Œçœ¼å²©ç¿«è´‹é›é ‘顔願ä¼ä¼Žå±å–œå™¨åŸºå¥‡å¬‰å¯„å²å¸Œå¹¾å¿Œæ®æœºæ——既期棋棄"],["8b40","機帰毅気汽畿祈季稀紀徽è¦è¨˜è²´èµ·è»Œè¼é£¢é¨Žé¬¼äº€å½å„€å¦“宜戯技擬欺犠疑祇義蟻誼議掬èŠéž å‰åƒå–«æ¡”橘詰砧æµé»å´å®¢è„šè™é€†ä¸˜ä¹…仇休åŠå¸å®®å¼“急救"],["8b80","朽求汲泣ç¸çƒç©¶çª®ç¬ˆç´šç³¾çµ¦æ—§ç‰›åŽ»å±…巨拒拠挙渠虚許è·é‹¸æ¼ç¦¦é­šäº¨äº«äº¬ä¾›ä¾ åƒ‘兇競共凶å”匡å¿å«å–¬å¢ƒå³¡å¼·å½Šæ€¯ææ­æŒŸæ•™æ©‹æ³ç‹‚狭矯胸脅興蕎郷é¡éŸ¿é¥—é©šä»°å‡å°­æšæ¥­å±€æ›²æ¥µçŽ‰æ¡ç²åƒ…勤å‡å·¾éŒ¦æ–¤æ¬£æ¬½ç´ç¦ç¦½ç­‹ç·ŠèŠ¹èŒè¡¿è¥Ÿè¬¹è¿‘金åŸéŠ€ä¹å€¶å¥åŒºç‹—玖矩苦躯駆駈駒具愚虞喰空å¶å¯“é‡éš…串櫛釧屑屈"],["8c40","掘窟沓é´è½¡çªªç†Šéšˆç²‚æ —ç¹°æ¡‘é¬å‹²å›è–«è¨“群è»éƒ¡å¦è¢ˆç¥ä¿‚傾刑兄啓圭çªåž‹å¥‘形径æµæ…¶æ…§æ†©æŽ²æºæ•¬æ™¯æ¡‚渓畦稽系経継繋罫茎èŠè›è¨ˆè©£è­¦è»½é šé¶èŠ¸è¿Žé¯¨"],["8c80","劇戟撃激隙æ¡å‚‘欠決潔穴çµè¡€è¨£æœˆä»¶å€¹å€¦å¥å…¼åˆ¸å‰£å–§åœå …嫌建憲懸拳æ²æ¤œæ¨©ç‰½çŠ¬çŒ®ç ”硯絹県肩見謙賢軒é£éµé™ºé¡•é¨“鹸元原厳幻弦減æºçŽ„ç¾çµƒèˆ·è¨€è«ºé™ä¹Žå€‹å¤å‘¼å›ºå§‘孤己庫弧戸故枯湖ç‹ç³Šè¢´è‚¡èƒ¡è°è™Žèª‡è·¨éˆ·é›‡é¡§é¼“五互ä¼åˆå‘‰å¾å¨¯å¾Œå¾¡æ‚Ÿæ¢§æªŽç‘šç¢èªžèª¤è­·é†ä¹žé¯‰äº¤ä½¼ä¾¯å€™å€–光公功効勾厚å£å‘"],["8d40","åŽå–‰å‘垢好孔å­å®å·¥å·§å··å¹¸åºƒåºšåº·å¼˜æ’慌抗拘控攻昂晃更æ­æ ¡æ¢—構江洪浩港æºç”²çš‡ç¡¬ç¨¿ç³ ç´…紘絞綱耕考肯肱腔è†èˆªè’行衡講貢購郊酵鉱砿鋼閤é™"],["8d80","項香高鴻剛劫å·åˆå£•æ‹·æ¿ è±ªè½Ÿéº¹å…‹åˆ»å‘Šå›½ç©€é…·éµ é»’ç„漉腰甑忽惚骨狛込此頃今困å¤å¢¾å©šæ¨æ‡‡æ˜æ˜†æ ¹æ¢±æ··ç—•ç´ºè‰®é­‚些ä½å‰å”†åµ¯å·¦å·®æŸ»æ²™ç‘³ç ‚è©éŽ–裟å座挫債催å†æœ€å“‰å¡žå¦»å®°å½©æ‰æŽ¡æ ½æ­³æ¸ˆç½é‡‡çŠ€ç •ç ¦ç¥­æ–Žç´°èœè£è¼‰éš›å‰¤åœ¨æ罪財冴å‚阪堺榊肴咲崎埼碕鷺作削咋æ¾æ˜¨æœ”柵窄策索錯桜鮭笹匙冊刷"],["8e40","察拶撮擦札殺薩雑çšé¯–æŒéŒ†é®«çš¿æ™’三傘å‚山惨撒散桟燦çŠç”£ç®—纂蚕讃賛酸é¤æ–¬æš«æ®‹ä»•ä»”伺使刺å¸å²å—£å››å£«å§‹å§‰å§¿å­å±å¸‚師志æ€æŒ‡æ”¯å­œæ–¯æ–½æ—¨æžæ­¢"],["8e80","æ­»æ°ç…祉ç§ç³¸ç´™ç´«è‚¢è„‚至視詞詩試誌諮資賜雌飼歯事似ä¾å…字寺慈æŒæ™‚次滋治爾璽痔ç£ç¤ºè€Œè€³è‡ªè’”辞æ±é¹¿å¼è­˜é´«ç«ºè»¸å®é›«ä¸ƒå±åŸ·å¤±å«‰å®¤æ‚‰æ¹¿æ¼†ç–¾è³ªå®Ÿè”€ç¯ å²æŸ´èŠå±¡è•Šç¸žèˆŽå†™å°„æ¨èµ¦æ–œç…®ç¤¾ç´—者è¬è»Šé®è›‡é‚ªå€Ÿå‹ºå°ºæ“ç¼çˆµé…Œé‡ˆéŒ«è‹¥å¯‚弱惹主å–守手朱殊狩ç ç¨®è…«è¶£é…’首儒å—呪寿授樹綬需囚åŽå‘¨"],["8f40","宗就州修æ„拾洲秀秋終ç¹ç¿’臭舟è’衆襲è®è¹´è¼¯é€±é…‹é…¬é›†é†œä»€ä½å……å従戎柔æ±æ¸‹ç£ç¸¦é‡éŠƒå”夙宿淑ç¥ç¸®ç²›å¡¾ç†Ÿå‡ºè¡“述俊峻春瞬竣舜駿准循旬楯殉淳"],["8f80","準潤盾純巡éµé†‡é †å‡¦åˆæ‰€æš‘曙渚庶緒署書薯藷諸助å™å¥³åºå¾æ•é‹¤é™¤å‚·å„Ÿå‹åŒ å‡å¬å“¨å•†å”±å˜—奨妾娼宵将å°å°‘尚庄床廠彰承抄招掌æ·æ˜‡æ˜Œæ˜­æ™¶æ¾æ¢¢æ¨Ÿæ¨µæ²¼æ¶ˆæ¸‰æ¹˜ç„¼ç„¦ç…§ç—‡çœç¡ç¤ç¥¥ç§°ç« ç¬‘粧紹肖è–蒋蕉è¡è£³è¨Ÿè¨¼è©”詳象賞醤鉦é¾é˜éšœéž˜ä¸Šä¸ˆä¸žä¹—冗剰城場壌嬢常情擾æ¡æ–浄状畳穣蒸譲醸錠嘱埴飾"],["9040","æ‹­æ¤æ®–燭織è·è‰²è§¦é£Ÿè•è¾±å°»ä¼¸ä¿¡ä¾µå”‡å¨ å¯å¯©å¿ƒæ…ŽæŒ¯æ–°æ™‹æ£®æ¦›æµ¸æ·±ç”³ç–¹çœŸç¥žç§¦ç´³è‡£èŠ¯è–ªè¦ªè¨ºèº«è¾›é€²é‡éœ‡äººä»åˆƒå¡µå£¬å°‹ç”šå°½è…Žè¨Šè¿…陣é­ç¬¥è«é ˆé…¢å›³åŽ¨"],["9080","逗å¹åž‚帥推水炊ç¡ç²‹ç¿ è¡°é‚é…”éŒéŒ˜éšç‘žé«„崇嵩数枢趨雛æ®æ‰æ¤™è…頗雀裾澄摺寸世瀬ç•æ˜¯å‡„制勢姓å¾æ€§æˆæ”¿æ•´æ˜Ÿæ™´æ£²æ –正清牲生盛精è–声製西誠誓請é€é†’é’é™æ–‰ç¨Žè„†éš»å¸­æƒœæˆšæ–¥æ˜”æžçŸ³ç©ç±ç¸¾è„Šè²¬èµ¤è·¡è¹Ÿç¢©åˆ‡æ‹™æŽ¥æ‘‚折設窃節説雪絶舌è‰ä»™å…ˆåƒå å®£å°‚å°–å·æˆ¦æ‰‡æ’°æ “栴泉浅洗染潜煎煽旋穿箭線"],["9140","繊羨腺舛船薦詮賎践é¸é·éŠ­éŠ‘閃鮮å‰å–„漸然全禅繕膳糎噌塑岨措曾曽楚狙ç–疎礎祖租粗素組蘇訴阻é¡é¼ åƒ§å‰µåŒå¢å€‰å–ªå£®å¥çˆ½å®‹å±¤åŒæƒ£æƒ³æœæŽƒæŒ¿æŽ»"],["9180","æ“早曹巣æ§æ§½æ¼•ç‡¥äº‰ç—©ç›¸çª“糟ç·ç¶œè¡è‰è˜è‘¬è’¼è—»è£…èµ°é€é­éŽ—霜騒åƒå¢—憎臓蔵贈造促å´å‰‡å³æ¯æ‰æŸæ¸¬è¶³é€Ÿä¿—属賊æ—続å’袖其æƒå­˜å­«å°Šææ‘éœä»–多太汰詑唾堕妥惰打æŸèˆµæ¥•é™€é§„騨体堆対è€å²±å¸¯å¾…怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代å°å¤§ç¬¬é†é¡Œé·¹æ»ç€§å“啄宅托択拓沢濯ç¢è¨—é¸æ¿è«¾èŒ¸å‡§è›¸åª"],["9240","å©ä½†é”辰奪脱巽竪辿棚谷狸鱈樽誰丹å˜å˜†å¦æ‹…探旦歎淡湛炭短端箪綻耽胆蛋誕é›å›£å£‡å¼¾æ–­æš–檀段男談値知地弛æ¥æ™ºæ± ç—´ç¨šç½®è‡´èœ˜é…馳築畜竹筑蓄"],["9280","é€ç§©çª’茶嫡ç€ä¸­ä»²å®™å¿ æŠ½æ˜¼æŸ±æ³¨è™«è¡·è¨»é…Žé‹³é§æ¨—瀦猪苧著貯ä¸å…†å‡‹å–‹å¯µå¸–帳åºå¼”張彫徴懲挑暢æœæ½®ç‰’町眺è´è„¹è…¸è¶èª¿è«œè¶…跳銚長頂鳥勅æ—直朕沈ç賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴é”椿潰åªå£·å¬¬ç´¬çˆªåŠé‡£é¶´äº­ä½Žåœåµå‰ƒè²žå‘ˆå ¤å®šå¸åº•åº­å»·å¼Ÿæ‚ŒæŠµæŒºæ梯汀碇禎程締艇訂諦蹄逓"],["9340","邸鄭釘鼎泥摘擢敵滴的笛é©é‘溺哲徹撤è½è¿­é‰„典填天展店添çºç”œè²¼è»¢é¡›ç‚¹ä¼æ®¿æ¾±ç”°é›»å…Žå堵塗妬屠徒斗æœæ¸¡ç™»èŸè³­é€”都é砥砺努度土奴怒倒党冬"],["9380","å‡åˆ€å”塔塘套宕島嶋悼投æ­æ±æ¡ƒæ¢¼æ£Ÿç›—淘湯涛ç¯ç‡ˆå½“痘祷等答筒糖統到董蕩藤討謄豆è¸é€ƒé€é™é™¶é ­é¨°é—˜åƒå‹•åŒå ‚導憧撞洞瞳童胴è„é“銅峠鴇匿得徳涜特ç£ç¦¿ç¯¤æ¯’独読栃橡凸çªæ¤´å±Šé³¶è‹«å¯…酉瀞噸屯惇敦沌豚é頓呑曇éˆå¥ˆé‚£å†…ä¹å‡ªè–™è¬Žç˜æºé‹æ¥¢é¦´ç¸„ç•·å—楠軟難æ±äºŒå°¼å¼è¿©åŒ‚賑肉虹廿日乳入"],["9440","如尿韮任妊å¿èªæ¿¡ç¦°ç¥¢å¯§è‘±çŒ«ç†±å¹´å¿µæ»æ’šç‡ƒç²˜ä¹ƒå»¼ä¹‹åŸœåš¢æ‚©æ¿ƒç´èƒ½è„³è†¿è¾²è¦—蚤巴把播覇æ·æ³¢æ´¾ç¶ç ´å©†ç½µèŠ­é¦¬ä¿³å»ƒæ‹æŽ’æ•—æ¯ç›ƒç‰ŒèƒŒè‚ºè¼©é…å€åŸ¹åª’梅"],["9480","楳煤狽買売賠陪這è¿ç§¤çŸ§è©ä¼¯å‰¥åšæ‹æŸæ³Šç™½ç®”粕舶薄迫æ›æ¼ çˆ†ç¸›èŽ«é§éº¦å‡½ç®±ç¡²ç®¸è‚‡ç­ˆæ«¨å¹¡è‚Œç•‘畠八鉢溌発醗髪ä¼ç½°æŠœç­é–¥é³©å™ºå¡™è›¤éš¼ä¼´åˆ¤åŠåå›å¸†æ¬æ–‘æ¿æ°¾æ±Žç‰ˆçŠ¯ç­ç•”ç¹èˆ¬è—©è²©ç¯„釆煩頒飯挽晩番盤ç£è•ƒè›®åŒªå‘å¦å¦ƒåº‡å½¼æ‚²æ‰‰æ‰¹æŠ«æ–比泌疲皮碑秘緋罷肥被誹費é¿éžé£›æ¨‹ç°¸å‚™å°¾å¾®æž‡æ¯˜çµçœ‰ç¾Ž"],["9540","鼻柊稗匹疋髭彦è†è±è‚˜å¼¼å¿…畢筆逼桧姫媛ç´ç™¾è¬¬ä¿µå½ªæ¨™æ°·æ¼‚瓢票表評豹廟æ病秒苗錨鋲蒜蛭鰭å“彬斌浜瀕貧賓頻æ•ç“¶ä¸ä»˜åŸ å¤«å©¦å¯Œå†¨å¸ƒåºœæ€–扶敷"],["9580","斧普浮父符è…膚芙譜負賦赴阜附侮撫武舞葡蕪部å°æ¥“風葺蕗ä¼å‰¯å¾©å¹…æœç¦è…¹è¤‡è¦†æ·µå¼—払沸ä»ç‰©é®’分å»å™´å¢³æ†¤æ‰®ç„šå¥®ç²‰ç³žç´›é›°æ–‡èžä¸™ä½µå…µå¡€å¹£å¹³å¼ŠæŸ„並蔽閉陛米é åƒ»å£ç™–碧別瞥蔑箆å変片篇編辺返é便勉娩å¼éž­ä¿èˆ—鋪圃æ•æ­©ç”«è£œè¼”穂募墓慕戊暮æ¯ç°¿è©å€£ä¿¸åŒ…呆報奉å®å³°å³¯å´©åº–抱æ§æ”¾æ–¹æœ‹"],["9640","法泡烹砲縫胞芳èŒè“¬èœ‚褒訪豊邦鋒飽鳳鵬ä¹äº¡å‚剖åŠå¦¨å¸½å¿˜å¿™æˆ¿æš´æœ›æŸæ£’冒紡肪膨謀貌貿鉾防å é ¬åŒ—僕åœå¢¨æ’²æœ´ç‰§ç¦ç©†é‡¦å‹ƒæ²¡æ®†å €å¹Œå¥”本翻凡盆"],["9680","摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒æ¡äº¦ä¿£åˆæŠ¹æœ«æ²«è¿„侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙ç²æ°‘眠務夢無牟矛霧鵡椋婿娘冥å命明盟迷銘鳴姪ç‰æ»…å…棉綿緬é¢éººæ‘¸æ¨¡èŒ‚妄孟毛猛盲網耗蒙儲木黙目æ¢å‹¿é¤…尤戻籾貰å•æ‚¶ç´‹é–€åŒä¹Ÿå†¶å¤œçˆºè€¶é‡Žå¼¥çŸ¢åŽ„役約薬訳èºé–柳薮鑓愉愈油癒"],["9740","諭輸唯佑優勇å‹å®¥å¹½æ‚ æ†‚æ–有柚湧涌猶猷由ç¥è£•èª˜éŠé‚‘郵雄èžå¤•äºˆä½™ä¸Žèª‰è¼¿é å‚­å¹¼å¦–容庸æšæºæ“曜楊様洋溶熔用窯羊耀葉蓉è¦è¬¡è¸Šé¥é™½é¤Šæ…¾æŠ‘欲"],["9780","沃浴翌翼淀羅螺裸æ¥èŽ±é ¼é›·æ´›çµ¡è½é…ªä¹±åµåµæ¬„æ¿«è—蘭覧利åå±¥æŽæ¢¨ç†ç’ƒç—¢è£è£¡é‡Œé›¢é™¸å¾‹çŽ‡ç«‹è‘ŽæŽ ç•¥åŠ‰æµæºœç‰ç•™ç¡«ç²’隆竜é¾ä¾¶æ…®æ—…虜了亮僚両凌寮料æ¢æ¶¼çŒŸç™‚瞭稜糧良諒é¼é‡é™µé ˜åŠ›ç·‘倫厘林淋ç‡ç³è‡¨è¼ªéš£é±—麟瑠å¡æ¶™ç´¯é¡žä»¤ä¼¶ä¾‹å†·åŠ±å¶ºæ€œçŽ²ç¤¼è‹“鈴隷零霊麗齢暦歴列劣烈裂廉æ‹æ†æ¼£ç…‰ç°¾ç·´è¯"],["9840","蓮連錬呂魯櫓炉賂路露労å©å»Šå¼„朗楼榔浪æ¼ç‰¢ç‹¼ç¯­è€è¾è‹éƒŽå…­éº“禄肋録論倭和話歪賄脇惑枠鷲亙亘é°è©«è—蕨椀湾碗腕"],["989f","弌ä¸ä¸•ä¸ªä¸±ä¸¶ä¸¼ä¸¿ä¹‚乖乘亂亅豫亊舒å¼äºŽäºžäºŸäº äº¢äº°äº³äº¶ä»Žä»ä»„仆仂仗仞仭仟价伉佚估佛ä½ä½—佇佶侈ä¾ä¾˜ä½»ä½©ä½°ä¾‘佯來侖儘俔俟俎俘俛俑俚ä¿ä¿¤ä¿¥å€šå€¨å€”倪倥倅伜俶倡倩倬俾俯們倆åƒå‡æœƒå•ååˆåšå–å¬å¸å‚€å‚šå‚…傴傲"],["9940","僉僊傳僂僖僞僥僭僣僮價僵儉å„儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉å†å†‘冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭"],["9980","凰凵凾刄刋刔刎刧刪刮刳刹å‰å‰„剋剌剞剔剪剴剩剳剿剽åŠåŠ”劒剱劈劑辨辧劬劭劼劵å‹å‹å‹—勞勣勦飭勠勳勵勸勹匆匈甸åŒåŒåŒåŒ•åŒšåŒ£åŒ¯åŒ±åŒ³åŒ¸å€å†å…丗å‰å凖åžå©å®å¤˜å»å·åŽ‚厖厠厦厥厮厰厶åƒç°’é›™åŸæ›¼ç‡®å®å¨å­åºåå½å‘€å¬å­å¼å®å¶å©åå‘Žå’呵咎呟呱呷呰咒呻咀呶咄å’咆哇咢咸咥咬哄哈咨"],["9a40","咫哂咤咾咼哘哥哦å”唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳å•å–™å–€å’¯å–Šå–Ÿå•»å•¾å–˜å–žå–®å•¼å–ƒå–©å–‡å–¨å—šå—…嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎å™ç‡Ÿå˜´å˜¶å˜²å˜¸"],["9a80","噫噤嘯噬噪嚆嚀嚊嚠嚔åšåš¥åš®åš¶åš´å›‚åš¼å›å›ƒå›€å›ˆå›Žå›‘囓囗囮囹圀囿圄圉圈國åœåœ“團圖嗇圜圦圷圸åŽåœ»å€åå©åŸ€åžˆå¡å¿åž‰åž“垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙å å¡²å ¡å¡¢å¡‹å¡°æ¯€å¡’堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊å¤å¤›æ¢¦å¤¥å¤¬å¤­å¤²å¤¸å¤¾ç«’奕å¥å¥Žå¥šå¥˜å¥¢å¥ å¥§å¥¬å¥©"],["9b40","奸å¦å¦ä½žä¾«å¦£å¦²å§†å§¨å§œå¦å§™å§šå¨¥å¨Ÿå¨‘娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲å«å¬ªå¬¶å¬¾å­ƒå­…孀孑孕孚孛孥孩孰孳孵學斈孺宀"],["9b80","它宦宸寃寇寉寔å¯å¯¤å¯¦å¯¢å¯žå¯¥å¯«å¯°å¯¶å¯³å°…將專å°å°“尠尢尨尸尹å±å±†å±Žå±“å±å±å­±å±¬å±®ä¹¢å±¶å±¹å²Œå²‘岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢å¶å¶¬å¶®å¶½å¶å¶·å¶¼å·‰å·å·“巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠å»å»‚廈å»å»"],["9c40","廖廣å»å»šå»›å»¢å»¡å»¨å»©å»¬å»±å»³å»°å»´å»¸å»¾å¼ƒå¼‰å½å½œå¼‹å¼‘弖弩弭弸å½å½ˆå½Œå½Žå¼¯å½‘彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱å¿æ‚³å¿¿æ€¡æ "],["9c80","怙æ€æ€©æ€Žæ€±æ€›æ€•æ€«æ€¦æ€æ€ºæšææªæ·æŸæŠæ†ææ£æƒæ¤æ‚æ¬æ«æ™æ‚æ‚惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘æ…愕愆惶惷愀惴惺愃愡惻惱æ„愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟æ…慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹æ‡æ‡¦æ‡£æ‡¶æ‡ºæ‡´æ‡¿æ‡½æ‡¼æ‡¾æˆ€æˆˆæˆ‰æˆæˆŒæˆ”戛"],["9d40","戞戡截戮戰戲戳æ‰æ‰Žæ‰žæ‰£æ‰›æ‰ æ‰¨æ‰¼æŠ‚抉找抒抓抖拔抃抔拗拑抻æ‹æ‹¿æ‹†æ“”拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵æ挾ææœæ掖掎掀掫æ¶æŽ£æŽæŽ‰æŽŸæŽµæ«"],["9d80","æ©æŽ¾æ©æ€æ†æ£æ‰æ’æ¶æ„æ–æ´æ†æ“æ¦æ¶æ”æ—æ¨æ摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕æ•æ•˜æ•žæ•æ•²æ•¸æ–‚斃變斛斟斫斷旃旆æ—旄旌旒旛旙无旡旱æ²æ˜Šæ˜ƒæ—»æ³æ˜µæ˜¶æ˜´æ˜œæ™æ™„晉æ™æ™žæ™æ™¤æ™§æ™¨æ™Ÿæ™¢æ™°æšƒæšˆæšŽæš‰æš„暘æšæ›æš¹æ›‰æš¾æš¼"],["9e40","曄暸曖曚曠昿曦曩曰曵曷æœæœ–朞朦朧霸朮朿朶æ朸朷æ†æžæ æ™æ£æ¤æž‰æ°æž©æ¼æªæžŒæž‹æž¦æž¡æž…枷柯枴柬枳柩枸柤柞æŸæŸ¢æŸ®æž¹æŸŽæŸ†æŸ§æªœæ žæ¡†æ ©æ¡€æ¡æ ²æ¡Ž"],["9e80","梳栫桙档桷桿梟æ¢æ¢­æ¢”æ¢æ¢›æ¢ƒæª®æ¢¹æ¡´æ¢µæ¢ æ¢ºæ¤æ¢æ¡¾æ¤æ£Šæ¤ˆæ£˜æ¤¢æ¤¦æ£¡æ¤Œæ£æ£”棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞æ¥æ¦æ¥ªæ¦²æ¦®æ§æ¦¿æ§æ§“榾槎寨槊æ§æ¦»æ§ƒæ¦§æ¨®æ¦‘榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒æ«æ¨£æ¨“橄樌橲樶橸橇橢橙橦橈樸樢æªæªæª æª„檢檣"],["9f40","檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉æ­æ­™æ­”歛歟歡歸歹歿殀殄殃æ®æ®˜æ®•æ®žæ®¤æ®ªæ®«æ®¯æ®²æ®±æ®³æ®·æ®¼æ¯†æ¯‹æ¯“毟毬毫毳毯"],["9f80","麾氈氓气氛氤氣汞汕汢汪沂æ²æ²šæ²æ²›æ±¾æ±¨æ±³æ²’æ²æ³„泱泓沽泗泅æ³æ²®æ²±æ²¾æ²ºæ³›æ³¯æ³™æ³ªæ´Ÿè¡æ´¶æ´«æ´½æ´¸æ´™æ´µæ´³æ´’洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶æ¹æ¸Ÿæ¹ƒæ¸ºæ¹Žæ¸¤æ»¿æ¸æ¸¸æº‚溪溘滉溷滓溽溯滄溲滔滕æºæº¥æ»‚溟æ½æ¼‘çŒæ»¬æ»¸æ»¾æ¼¿æ»²æ¼±æ»¯æ¼²æ»Œ"],["e040","漾漓滷澆潺潸æ¾æ¾€æ½¯æ½›æ¿³æ½­æ¾‚潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑ç€ç€æ¿¾ç€›ç€šæ½´ç€ç€˜ç€Ÿç€°ç€¾ç€²ç‘ç£ç‚™ç‚’炯烱炬炸炳炮烟烋çƒ"],["e080","烙焉烽焜焙煥煕熈煦煢煌煖煬ç†ç‡»ç†„熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿çˆçˆçˆ›çˆ¨çˆ­çˆ¬çˆ°çˆ²çˆ»çˆ¼çˆ¿ç‰€ç‰†ç‰‹ç‰˜ç‰´ç‰¾çŠ‚çŠçŠ‡çŠ’犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷å€çŒ—猊猜猖çŒçŒ´çŒ¯çŒ©çŒ¥çŒ¾çŽç默ç—çªç¨ç°ç¸çµç»çºçˆçŽ³çŽçŽ»ç€ç¥ç®çžç’¢ç…瑯ç¥ç¸ç²çºç‘•ç¿ç‘Ÿç‘™ç‘瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊ç“ç“”ç±"],["e140","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎ç”甕甓甞甦甬甼畄ç•ç•Šç•‰ç•›ç•†ç•šç•©ç•¤ç•§ç•«ç•­ç•¸ç•¶ç–†ç–‡ç•´ç–Šç–‰ç–‚疔疚ç–疥疣痂疳痃疵疽疸疼疱ç—痊痒痙痣痞痾痿"],["e180","ç—¼ç˜ç—°ç—ºç—²ç—³ç˜‹ç˜ç˜‰ç˜Ÿç˜§ç˜ ç˜¡ç˜¢ç˜¤ç˜´ç˜°ç˜»ç™‡ç™ˆç™†ç™œç™˜ç™¡ç™¢ç™¨ç™©ç™ªç™§ç™¬ç™°ç™²ç™¶ç™¸ç™¼çš€çšƒçšˆçš‹çšŽçš–皓皙皚皰皴皸皹皺盂ç›ç›–盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸ç‡çšç¨ç«ç›ç¥ç¿ç¾ç¹çžŽçž‹çž‘瞠瞞瞰瞶瞹瞿瞼瞽瞻矇çŸçŸ—矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"],["e240","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊ç¦ç¦§é½‹ç¦ªç¦®ç¦³ç¦¹ç¦ºç§‰ç§•ç§§ç§¬ç§¡ç§£ç¨ˆç¨ç¨˜ç¨™ç¨ ç¨Ÿç¦€ç¨±ç¨»ç¨¾ç¨·ç©ƒç©—穉穡穢穩é¾ç©°ç©¹ç©½çªˆçª—窕窘窖窩竈窰"],["e280","窶竅竄窿邃竇竊ç«ç«ç«•ç«“站竚ç«ç«¡ç«¢ç«¦ç«­ç«°ç¬‚ç¬ç¬Šç¬†ç¬³ç¬˜ç¬™ç¬žç¬µç¬¨ç¬¶ç­ç­ºç¬„ç­ç¬‹ç­Œç­…筵筥筴筧筰筱筬筮ç®ç®˜ç®Ÿç®ç®œç®šç®‹ç®’ç®ç­ç®™ç¯‹ç¯ç¯Œç¯ç®´ç¯†ç¯ç¯©ç°‘簔篦篥籠簀簇簓篳篷簗ç°ç¯¶ç°£ç°§ç°ªç°Ÿç°·ç°«ç°½ç±Œç±ƒç±”ç±ç±€ç±ç±˜ç±Ÿç±¤ç±–籥籬籵粃ç²ç²¤ç²­ç²¢ç²«ç²¡ç²¨ç²³ç²²ç²±ç²®ç²¹ç²½ç³€ç³…糂糘糒糜糢鬻糯糲糴糶糺紆"],["e340","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮çµçµ£ç¶“綉絛ç¶çµ½ç¶›ç¶ºç¶®ç¶£ç¶µç·‡ç¶½ç¶«ç¸½ç¶¢ç¶¯ç·œç¶¸ç¶Ÿç¶°ç·˜ç·ç·¤ç·žç·»ç·²ç·¡ç¸…縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷"],["e380","縲縺繧ç¹ç¹–繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒çºçº“纔纖纎纛纜缸缺罅罌ç½ç½Žç½ç½‘罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞ç¾ç¾šç¾£ç¾¯ç¾²ç¾¹ç¾®ç¾¶ç¾¸è­±ç¿…翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻èŠè†è’è˜èšèŸè¢è¨è³è²è°è¶è¹è½è¿è‚„肆肅肛肓肚肭å†è‚¬èƒ›èƒ¥èƒ™èƒèƒ„胚胖脉胯胱脛脩脣脯腋"],["e440","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉è‡è‡‘臙臘臈臚臟臠臧臺臻臾èˆèˆ‚舅與舊èˆèˆèˆ–舩舫舸舳艀艙艘è‰è‰šè‰Ÿè‰¤"],["e480","艢艨艪艫舮艱艷艸艾èŠèŠ’芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱è€èŒ¹èè…茯茫茗茘莅莚莪莟莢莖茣莎莇莊è¼èŽµè³èµèŽ èŽ‰èŽ¨è´è“è«èŽè½èƒè˜è‹èè·è‡è è²èè¢è èŽ½è¸è”†è»è‘­èªè¼è•šè’„葷葫蒭葮蒂葩葆è¬è‘¯è‘¹èµè“Šè‘¢è’¹è’¿è’Ÿè“™è“蒻蓚è“è“蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"],["e540","è•è˜‚蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾è–藉薺è—è–¹è—è—•è—藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿è™ä¹•è™”號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬"],["e580","蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉èœè›¹èœŠèœ´èœ¿èœ·èœ»èœ¥èœ©èœšè èŸè¸èŒèŽè´è—è¨è®è™è“è£èªè …螢螟螂螯蟋螽蟀èŸé›–螫蟄螳蟇蟆螻蟯蟲蟠è è èŸ¾èŸ¶èŸ·è ŽèŸ’蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫è¢è¡¾è¢žè¡µè¡½è¢µè¡²è¢‚袗袒袮袙袢è¢è¢¤è¢°è¢¿è¢±è£ƒè£„裔裘裙è£è£¹è¤‚裼裴裨裲褄褌褊褓襃褞褥褪褫è¥è¥„褻褶褸襌è¤è¥ è¥ž"],["e640","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜è§è§§è§´è§¸è¨ƒè¨–è¨è¨Œè¨›è¨è¨¥è¨¶è©è©›è©’詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄è«è«‚諚諫諳諧"],["e680","諤諱謔諠諢諷諞諛謌謇謚諡謖è¬è¬—謠謳鞫謦謫謾謨è­è­Œè­è­Žè­‰è­–譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺è±è°¿è±ˆè±Œè±Žè±è±•è±¢è±¬è±¸è±ºè²‚貉貅貊è²è²Žè²”豼貘æˆè²­è²ªè²½è²²è²³è²®è²¶è³ˆè³è³¤è³£è³šè³½è³ºè³»è´„è´…è´Šè´‡è´è´è´é½Žè´“è³è´”贖赧赭赱赳è¶è¶™è·‚趾趺è·è·šè·–跌跛跋跪跫跟跣跼踈踉跿è¸è¸žè¸è¸Ÿè¹‚踵踰踴蹊"],["e740","蹇蹉蹌è¹è¹ˆè¹™è¹¤è¹ è¸ªè¹£è¹•è¹¶è¹²è¹¼èºèº‡èº…躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜"],["e780","轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡é€é€žé€–逋逧逶逵逹迸ééé‘é’逎é‰é€¾é–é˜éžé¨é¯é¶éš¨é²é‚‚é½é‚邀邊邉é‚邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀é‡é‡‰é‡‹é‡é‡–釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋é‰éŠœéŠ–銓銛鉚é‹éŠ¹éŠ·é‹©éŒé‹ºé„錮"],["e840","錙錢錚錣錺錵錻éœé é¼é®é–鎰鎬鎭鎔鎹é–é—é¨é¥é˜éƒéééˆé¤éšé”é“éƒé‡éé¶é«éµé¡éºé‘鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾é’鑿閂閇閊閔閖閘閙"],["e880","閠閨閧閭閼閻閹閾闊濶闃é—闌闕闔闖關闡闥闢阡阨阮阯陂陌é™é™‹é™·é™œé™žé™é™Ÿé™¦é™²é™¬éšéš˜éš•éš—險隧隱隲隰隴隶隸隹雎雋雉é›è¥é›œéœé›•é›¹éœ„霆霈霓霎霑éœéœ–霙霤霪霰霹霽霾é„é†éˆé‚é‰éœé é¤é¦é¨å‹’é«é±é¹éž…é¼éžéºéž†éž‹éžéžéžœéž¨éž¦éž£éž³éž´éŸƒéŸ†éŸˆéŸ‹éŸœéŸ­é½éŸ²ç«ŸéŸ¶éŸµé é Œé ¸é ¤é ¡é ·é ½é¡†é¡é¡‹é¡«é¡¯é¡°"],["e940","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡é¤é¤žé¤¤é¤ é¤¬é¤®é¤½é¤¾é¥‚饉饅é¥é¥‹é¥‘饒饌饕馗馘馥馭馮馼駟駛é§é§˜é§‘駭駮駱駲駻駸é¨é¨é¨…駢騙騫騷驅驂驀驃"],["e980","騾驕é©é©›é©—驟驢驥驤驩驫驪骭骰骼髀é«é«‘髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃é­é­é­Žé­‘魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆é¯é¯‘鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒éµé´¿é´¾éµ†éµˆ"],["ea40","éµéµžéµ¤éµ‘éµéµ™éµ²é¶‰é¶‡é¶«éµ¯éµºé¶šé¶¤é¶©é¶²é·„é·é¶»é¶¸é¶ºé·†é·é·‚鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽éºéºˆéº‹éºŒéº’麕麑éºéº¥éº©éº¸éºªéº­é¡é»Œé»Žé»é»é»”黜點é»é» é»¥é»¨é»¯"],["ea80","黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇é™ç‘¤å‡œç†™"],["ed40","纊褜éˆéŠˆè“œä¿‰ç‚»æ˜±æ£ˆé‹¹æ›»å½…丨仡仼伀伃伹佖侒侊侚侔ä¿å€å€¢ä¿¿å€žå†å°å‚傔僴僘兊兤å†å†¾å‡¬åˆ•åŠœåŠ¦å‹€å‹›åŒ€åŒ‡åŒ¤å²åŽ“厲å﨎咜咊咩哿喆å™å¥åž¬åŸˆåŸ‡ï¨"],["ed80","ï¨å¢žå¢²å¤‹å¥“奛å¥å¥£å¦¤å¦ºå­–寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹å·å¼¡å¼´å½§å¾·å¿žæ悅悊惞惕愠惲愑愷愰憘戓抦æµæ‘ æ’擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗æ¦æž»æ¡’柀æ æ¡„æ£ï¨“楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬æ·æ·¸æ·²æ·¼æ¸¹æ¹œæ¸§æ¸¼æº¿æ¾ˆæ¾µæ¿µç€…瀇瀨炅炫ç„焄煜煆煇凞ç‡ç‡¾çŠ±"],["ee40","犾猤猪ç·çŽ½ç‰ç–ç£ç’ç‡çµç¦çªç©ç®ç‘¢ç’‰ç’Ÿç”畯皂皜皞皛皦益ç†åŠ¯ç ¡ç¡Žç¡¤ç¡ºç¤°ï¨˜ï¨™ï¨šç¦”福禛竑竧靖竫箞ï¨çµˆçµœç¶·ç¶ ç·–繒罇羡羽èŒè¢è¿è‡è¶è‘ˆè’´è•“è•™"],["ee80","蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣è»ï¨¤ï¨¥é§éƒžï¨¦é„•é„§é‡šé‡—釞釭釮釤釥鈆éˆéˆŠéˆºé‰€éˆ¼é‰Žé‰™é‰‘鈹鉧銧鉷鉸鋧鋗鋙é‹ï¨§é‹•é‹ é‹“錥錡鋻﨨錞鋿éŒéŒ‚é°é—鎤é†éžé¸é±é‘…鑈閒隆﨩éšéš¯éœ³éœ»éƒééé‘é•é¡—顥飯飼餧館馞驎髙髜魵魲é®é®±é®»é°€éµ°éµ«ï¨­é¸™é»‘"],["eeef","â…°",9,"¬¦'""],["f040","",62],["f080","",124],["f140","",62],["f180","",124],["f240","î…¸",62],["f280","",124],["f340","",62],["f380","",124],["f440","î‹°",62],["f480","",124],["f540","",62],["f580","î«",124],["f640","",62],["f680","î’§",124],["f740","",62],["f780","î•£",124],["f840","î— ",62],["f880","",124],["f940","îšœ"],["fa40","â…°",9,"â… ",9,"¬¦'"㈱№℡∵纊褜éˆéŠˆè“œä¿‰ç‚»æ˜±æ£ˆé‹¹æ›»å½…丨仡仼伀伃伹佖侒侊侚侔ä¿å€å€¢ä¿¿å€žå†å°å‚傔僴僘兊"],["fa80","å…¤å†å†¾å‡¬åˆ•åŠœåŠ¦å‹€å‹›åŒ€åŒ‡åŒ¤å²åŽ“厲å﨎咜咊咩哿喆å™å¥åž¬åŸˆåŸ‡ï¨ï¨å¢žå¢²å¤‹å¥“奛å¥å¥£å¦¤å¦ºå­–寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹å·å¼¡å¼´å½§å¾·å¿žæ悅悊惞惕愠惲愑愷愰憘戓抦æµæ‘ æ’擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗æ¦æž»æ¡’柀æ æ¡„æ£ï¨“楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯"],["fb40","涖涬æ·æ·¸æ·²æ·¼æ¸¹æ¹œæ¸§æ¸¼æº¿æ¾ˆæ¾µæ¿µç€…瀇瀨炅炫ç„焄煜煆煇凞ç‡ç‡¾çŠ±çŠ¾çŒ¤ï¨–ç·çŽ½ç‰ç–ç£ç’ç‡çµç¦çªç©ç®ç‘¢ç’‰ç’Ÿç”畯皂皜皞皛皦益ç†åŠ¯ç ¡ç¡Žç¡¤ç¡ºç¤°ï¨˜ï¨™"],["fb80","祥禔福禛竑竧靖竫箞ï¨çµˆçµœç¶·ç¶ ç·–繒罇羡羽èŒè¢è¿è‡è¶è‘ˆè’´è•“蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣è»ï¨¤ï¨¥é§éƒžï¨¦é„•é„§é‡šé‡—釞釭釮釤釥鈆éˆéˆŠéˆºé‰€éˆ¼é‰Žé‰™é‰‘鈹鉧銧鉷鉸鋧鋗鋙é‹ï¨§é‹•é‹ é‹“錥錡鋻﨨錞鋿éŒéŒ‚é°é—鎤é†éžé¸é±é‘…鑈閒隆﨩éšéš¯éœ³éœ»éƒééé‘é•é¡—顥飯飼餧館馞驎髙"],["fc40","髜魵魲é®é®±é®»é°€éµ°éµ«ï¨­é¸™é»‘"]]')},2682:(e,t,r)=>{"use strict";var n=r(44765).Buffer;function i(){}function o(){}function s(){this.overflowByte=-1}function A(e,t){this.iconv=t}function a(e,t){void 0===(e=e||{}).addBOM&&(e.addBOM=!0),this.encoder=t.iconv.getEncoder("utf-16le",e)}function c(e,t){this.decoder=null,this.initialBytes=[],this.initialBytesLen=0,this.options=e||{},this.iconv=t.iconv}function u(e,t){var r=t||"utf-16le";if(e.length>=2)if(254==e[0]&&255==e[1])r="utf-16be";else if(255==e[0]&&254==e[1])r="utf-16le";else{for(var n=0,i=0,o=Math.min(e.length-e.length%2,64),s=0;sn?r="utf-16be":i{"use strict";var n=r(44765).Buffer;function i(e,t){this.iconv=t}t.utf7=i,t.unicode11utf7="utf7",i.prototype.encoder=s,i.prototype.decoder=A,i.prototype.bomAware=!0;var o=/[^A-Za-z0-9'\(\),-\.\/:\? \n\r\t]+/g;function s(e,t){this.iconv=t.iconv}function A(e,t){this.iconv=t.iconv,this.inBase64=!1,this.base64Accum=""}s.prototype.write=function(e){return n.from(e.replace(o,function(e){return"+"+("+"===e?"":this.iconv.encode(e,"utf16-be").toString("base64").replace(/=+$/,""))+"-"}.bind(this)))},s.prototype.end=function(){};for(var a=/[A-Za-z0-9\/+]/,c=[],u=0;u<256;u++)c[u]=a.test(String.fromCharCode(u));var l="+".charCodeAt(0),h="-".charCodeAt(0),g="&".charCodeAt(0);function f(e,t){this.iconv=t}function p(e,t){this.iconv=t.iconv,this.inBase64=!1,this.base64Accum=n.alloc(6),this.base64AccumIdx=0}function d(e,t){this.iconv=t.iconv,this.inBase64=!1,this.base64Accum=""}A.prototype.write=function(e){for(var t="",r=0,i=this.inBase64,o=this.base64Accum,s=0;s0&&(e=this.iconv.decode(n.from(this.base64Accum,"base64"),"utf16-be")),this.inBase64=!1,this.base64Accum="",e},t.utf7imap=f,f.prototype.encoder=p,f.prototype.decoder=d,f.prototype.bomAware=!0,p.prototype.write=function(e){for(var t=this.inBase64,r=this.base64Accum,i=this.base64AccumIdx,o=n.alloc(5*e.length+10),s=0,A=0;A0&&(s+=o.write(r.slice(0,i).toString("base64").replace(/\//g,",").replace(/=+$/,""),s),i=0),o[s++]=h,t=!1),t||(o[s++]=a,a===g&&(o[s++]=h))):(t||(o[s++]=g,t=!0),t&&(r[i++]=a>>8,r[i++]=255&a,i==r.length&&(s+=o.write(r.toString("base64").replace(/\//g,","),s),i=0)))}return this.inBase64=t,this.base64AccumIdx=i,o.slice(0,s)},p.prototype.end=function(){var e=n.alloc(10),t=0;return this.inBase64&&(this.base64AccumIdx>0&&(t+=e.write(this.base64Accum.slice(0,this.base64AccumIdx).toString("base64").replace(/\//g,",").replace(/=+$/,""),t),this.base64AccumIdx=0),e[t++]=h,this.inBase64=!1),e.slice(0,t)};var C=c.slice();C[",".charCodeAt(0)]=!0,d.prototype.write=function(e){for(var t="",r=0,i=this.inBase64,o=this.base64Accum,s=0;s0&&(e=this.iconv.decode(n.from(this.base64Accum,"base64"),"utf16-be")),this.inBase64=!1,this.base64Accum="",e}},47773:(e,t)=>{"use strict";function r(e,t){this.encoder=e,this.addBOM=!0}function n(e,t){this.decoder=e,this.pass=!1,this.options=t||{}}t.PrependBOM=r,r.prototype.write=function(e){return this.addBOM&&(e="\ufeff"+e,this.addBOM=!1),this.encoder.write(e)},r.prototype.end=function(){return this.encoder.end()},t.StripBOM=n,n.prototype.write=function(e){var t=this.decoder.write(e);return this.pass||!t||("\ufeff"===t[0]&&(t=t.slice(1),"function"==typeof this.options.stripBOM&&this.options.stripBOM()),this.pass=!0),t},n.prototype.end=function(){return this.decoder.end()}},819:(e,t,r)=>{"use strict";var n=r(64293).Buffer;e.exports=function(e){var t=void 0;e.supportsNodeEncodingsExtension=!(n.from||new n(0)instanceof Uint8Array),e.extendNodeEncodings=function(){if(!t){if(t={},!e.supportsNodeEncodingsExtension)return console.error("ACTION NEEDED: require('iconv-lite').extendNodeEncodings() is not supported in your version of Node"),void console.error("See more info at https://github.com/ashtuchkin/iconv-lite/wiki/Node-v4-compatibility");var i={hex:!0,utf8:!0,"utf-8":!0,ascii:!0,binary:!0,base64:!0,ucs2:!0,"ucs-2":!0,utf16le:!0,"utf-16le":!0};n.isNativeEncoding=function(e){return e&&i[e.toLowerCase()]};var o=r(64293).SlowBuffer;if(t.SlowBufferToString=o.prototype.toString,o.prototype.toString=function(r,i,o){return r=String(r||"utf8").toLowerCase(),n.isNativeEncoding(r)?t.SlowBufferToString.call(this,r,i,o):(void 0===i&&(i=0),void 0===o&&(o=this.length),e.decode(this.slice(i,o),r))},t.SlowBufferWrite=o.prototype.write,o.prototype.write=function(r,i,o,s){if(isFinite(i))isFinite(o)||(s=o,o=void 0);else{var A=s;s=i,i=o,o=A}i=+i||0;var a=this.length-i;if(o?(o=+o)>a&&(o=a):o=a,s=String(s||"utf8").toLowerCase(),n.isNativeEncoding(s))return t.SlowBufferWrite.call(this,r,i,o,s);if(r.length>0&&(o<0||i<0))throw new RangeError("attempt to write beyond buffer bounds");var c=e.encode(r,s);return c.lengthl&&(o=l):o=l,r.length>0&&(o<0||i<0))throw new RangeError("attempt to write beyond buffer bounds");var h=e.encode(r,s);return h.length{"use strict";var n=r(44765).Buffer,i=r(47773),o=e.exports;o.encodings=null,o.defaultCharUnicode="�",o.defaultCharSingleByte="?",o.encode=function(e,t,r){e=""+(e||"");var i=o.getEncoder(t,r),s=i.write(e),A=i.end();return A&&A.length>0?n.concat([s,A]):s},o.decode=function(e,t,r){"string"==typeof e&&(o.skipDecodeWarning||(console.error("Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding"),o.skipDecodeWarning=!0),e=n.from(""+(e||""),"binary"));var i=o.getDecoder(t,r),s=i.write(e),A=i.end();return A?s+A:s},o.encodingExists=function(e){try{return o.getCodec(e),!0}catch(e){return!1}},o.toEncoding=o.encode,o.fromEncoding=o.decode,o._codecDataCache={},o.getCodec=function(e){o.encodings||(o.encodings=r(15709));for(var t=o._canonicalizeEncoding(e),n={};;){var i=o._codecDataCache[t];if(i)return i;var s=o.encodings[t];switch(typeof s){case"string":t=s;break;case"object":for(var A in s)n[A]=s[A];n.encodingName||(n.encodingName=t),t=s.type;break;case"function":return n.encodingName||(n.encodingName=t),i=new s(n,o),o._codecDataCache[n.encodingName]=i,i;default:throw new Error("Encoding not recognized: '"+e+"' (searched as: '"+t+"')")}}},o._canonicalizeEncoding=function(e){return(""+e).toLowerCase().replace(/:\d{4}$|[^0-9a-z]/g,"")},o.getEncoder=function(e,t){var r=o.getCodec(e),n=new r.encoder(t,r);return r.bomAware&&t&&t.addBOM&&(n=new i.PrependBOM(n,t)),n},o.getDecoder=function(e,t){var r=o.getCodec(e),n=new r.decoder(t,r);return!r.bomAware||t&&!1===t.stripBOM||(n=new i.StripBOM(n,t)),n};var s="undefined"!=typeof process&&process.versions&&process.versions.node;if(s){var A=s.split(".").map(Number);(A[0]>0||A[1]>=10)&&r(16034)(o),r(819)(o)}},16034:(e,t,r)=>{"use strict";var n=r(64293).Buffer,i=r(92413).Transform;function o(e,t){this.conv=e,(t=t||{}).decodeStrings=!1,i.call(this,t)}function s(e,t){this.conv=e,(t=t||{}).encoding=this.encoding="utf8",i.call(this,t)}e.exports=function(e){e.encodeStream=function(t,r){return new o(e.getEncoder(t,r),r)},e.decodeStream=function(t,r){return new s(e.getDecoder(t,r),r)},e.supportsStreams=!0,e.IconvLiteEncoderStream=o,e.IconvLiteDecoderStream=s,e._collect=s.prototype.collect},o.prototype=Object.create(i.prototype,{constructor:{value:o}}),o.prototype._transform=function(e,t,r){if("string"!=typeof e)return r(new Error("Iconv encoding stream needs strings as its input."));try{var n=this.conv.write(e);n&&n.length&&this.push(n),r()}catch(e){r(e)}},o.prototype._flush=function(e){try{var t=this.conv.end();t&&t.length&&this.push(t),e()}catch(t){e(t)}},o.prototype.collect=function(e){var t=[];return this.on("error",e),this.on("data",(function(e){t.push(e)})),this.on("end",(function(){e(null,n.concat(t))})),this},s.prototype=Object.create(i.prototype,{constructor:{value:s}}),s.prototype._transform=function(e,t,r){if(!n.isBuffer(e))return r(new Error("Iconv decoding stream needs buffers as its input."));try{var i=this.conv.write(e);i&&i.length&&this.push(i,this.encoding),r()}catch(e){r(e)}},s.prototype._flush=function(e){try{var t=this.conv.end();t&&t.length&&this.push(t,this.encoding),e()}catch(t){e(t)}},s.prototype.collect=function(e){var t="";return this.on("error",e),this.on("data",(function(e){t+=e})),this.on("end",(function(){e(null,t)})),this}},46458:e=>{function t(e){return Array.isArray(e)?e:[e]}const r=/^\s+$/,n=/^\\!/,i=/^\\#/,o=/\r?\n/g,s=/^\.*\/|^\.+$/,A="undefined"!=typeof Symbol?Symbol.for("node-ignore"):"node-ignore",a=/([0-z])-([0-z])/g,c=[[/\\?\s+$/,e=>0===e.indexOf("\\")?" ":""],[/\\\s/g,()=>" "],[/[\\^$.|*+(){]/g,e=>"\\"+e],[/\[([^\]/]*)($|\])/g,(e,t,r)=>{return"]"===r?`[${n=t,n.replace(a,(e,t,r)=>t.charCodeAt(0)<=r.charCodeAt(0)?e:"")}]`:"\\"+e;var n}],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/(?:[^*])$/,e=>/\/$/.test(e)?e+"$":e+"(?=$|\\/$)"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(e,t,r)=>t+6t+"[^\\/]*"],[/(\^|\\\/)?\\\*$/,(e,t)=>(t?t+"[^/]+":"[^/]*")+"(?=$|\\/$)"],[/\\\\\\/g,()=>"\\"]],u=Object.create(null),l=e=>"string"==typeof e;class h{constructor(e,t,r,n){this.origin=e,this.pattern=t,this.negative=r,this.regex=n}}const g=(e,t)=>{const r=e;let o=!1;0===e.indexOf("!")&&(o=!0,e=e.substr(1));const s=((e,t,r)=>{const n=u[e];if(n)return n;const i=c.reduce((t,r)=>t.replace(r[0],r[1].bind(e)),e);return u[e]=r?new RegExp(i,"i"):new RegExp(i)})(e=e.replace(n,"!").replace(i,"#"),0,t);return new h(r,e,o,s)},f=(e,t)=>{throw new t(e)},p=(e,t,r)=>{if(!l(e))return r(`path must be a string, but got \`${t}\``,TypeError);if(!e)return r("path must not be empty",TypeError);if(p.isNotRelative(e)){return r(`path should be a ${"`path.relative()`d"} string, but got "${t}"`,RangeError)}return!0},d=e=>s.test(e);p.isNotRelative=d,p.convert=e=>e;class C{constructor({ignorecase:e=!0}={}){var t,r,n;this._rules=[],this._ignorecase=e,t=this,r=A,n=!0,Object.defineProperty(t,r,{value:n}),this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[A])return this._rules=this._rules.concat(e._rules),void(this._added=!0);if((e=>e&&l(e)&&!r.test(e)&&0!==e.indexOf("#"))(e)){const t=g(e,this._ignorecase);this._added=!0,this._rules.push(t)}}add(e){return this._added=!1,t(l(e)?(e=>e.split(o))(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,t){let r=!1,n=!1;return this._rules.forEach(i=>{const{negative:o}=i;if(n===o&&r!==n||o&&!r&&!n&&!t)return;i.regex.test(e)&&(r=!o,n=o)}),{ignored:r,unignored:n}}_test(e,t,r,n){const i=e&&p.convert(e);return p(i,e,f),this._t(i,t,r,n)}_t(e,t,r,n){if(e in t)return t[e];if(n||(n=e.split("/")),n.pop(),!n.length)return t[e]=this._testOne(e,r);const i=this._t(n.join("/")+"/",t,r,n);return t[e]=i.ignored?i:this._testOne(e,r)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return t(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}}const E=e=>new C(e),I=()=>!1;if(E.isPathValid=e=>p(e&&p.convert(e),e,I),E.default=E,e.exports=E,"undefined"!=typeof process&&(process.env&&process.env.IGNORE_TEST_WIN32||"win32"===process.platform)){const e=e=>/^\\\\\?\\/.test(e)||/["<>|\u0000-\u001F]+/u.test(e)?e:e.replace(/\\/g,"/");p.convert=e;const t=/^[a-z]:\//i;p.isNotRelative=e=>t.test(e)||d(e)}},24679:(e,t,r)=>{var n=r(98984),i=Object.create(null),o=r(91162);function s(e){for(var t=e.length,r=[],n=0;nn?(r.splice(0,n),process.nextTick((function(){t.apply(null,o)}))):delete i[e]}}))}(e))}))},85870:(e,t,r)=>{try{var n=r(31669);if("function"!=typeof n.inherits)throw"";e.exports=n.inherits}catch(t){e.exports=r(48145)}},48145:e=>{"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e}},9494:(e,t,r)=>{"use strict";var n=e.exports;n.prompts={},n.Separator=r(88249),n.ui={BottomBar:r(36896),Prompt:r(87380)},n.createPromptModule=function(e){var t=function(r,i){var o;try{o=new n.ui.Prompt(t.prompts,e)}catch(e){return Promise.reject(e)}var s=o.run(r,i);return s.ui=o,s};return t.prompts={},t.registerPrompt=function(e,r){return t.prompts[e]=r,this},t.restoreDefaultPrompts=function(){this.registerPrompt("list",r(89336)),this.registerPrompt("input",r(90013)),this.registerPrompt("number",r(90307)),this.registerPrompt("confirm",r(32107)),this.registerPrompt("rawlist",r(942)),this.registerPrompt("expand",r(73870)),this.registerPrompt("checkbox",r(33375)),this.registerPrompt("password",r(30428)),this.registerPrompt("editor",r(48748))},t.restoreDefaultPrompts(),t},n.prompt=n.createPromptModule(),n.registerPrompt=function(e,t){n.prompt.registerPrompt(e,t)},n.restoreDefaultPrompts=function(){n.prompt.restoreDefaultPrompts()}},1996:(e,t,r)=>{"use strict";var n={isString:r(221),isNumber:r(71044),extend:r(94501),isFunction:r(92533)};e.exports=class e{constructor(t,r){if(t instanceof e||"separator"===t.type)return t;n.isString(t)||n.isNumber(t)?(this.name=String(t),this.value=t,this.short=String(t)):n.extend(this,t,{name:t.name||t.value,value:"value"in t?t.value:t.name,short:t.short||t.name||t.value}),n.isFunction(t.disabled)?this.disabled=t.disabled(r):this.disabled=t.disabled}}},21027:(e,t,r)=>{"use strict";var n=r(42357),i={isNumber:r(71044),filter:r(59181),map:r(27869),find:r(98347)},o=r(88249),s=r(1996);e.exports=class{constructor(e,t){this.choices=e.map(e=>"separator"===e.type?(e instanceof o||(e=new o(e.line)),e):new s(e,t)),this.realChoices=this.choices.filter(o.exclude).filter(e=>!e.disabled),Object.defineProperty(this,"length",{get(){return this.choices.length},set(e){this.choices.length=e}}),Object.defineProperty(this,"realLength",{get(){return this.realChoices.length},set(){throw new Error("Cannot set `realLength` of a Choices collection")}})}getChoice(e){return n(i.isNumber(e)),this.realChoices[e]}get(e){return n(i.isNumber(e)),this.choices[e]}where(e){return i.filter(this.realChoices,e)}pluck(e){return i.map(this.realChoices,e)}indexOf(){return this.choices.indexOf.apply(this.choices,arguments)}forEach(){return this.choices.forEach.apply(this.choices,arguments)}filter(){return this.choices.filter.apply(this.choices,arguments)}find(e){return i.find(this.choices,e)}push(){var e=i.map(arguments,e=>new s(e));return this.choices.push.apply(this.choices,e),this.realChoices=this.choices.filter(o.exclude).filter(e=>!e.disabled),this.choices}}},88249:(e,t,r)=>{"use strict";var n=r(95882),i=r(51938);class o{constructor(e){this.type="separator",this.line=n.dim(e||new Array(15).join(i.line))}toString(){return this.line}}o.exclude=function(e){return"separator"!==e.type},e.exports=o},10485:(e,t,r)=>{"use strict";var n={assign:r(9682),defaults:r(99906),clone:r(22254)},i=r(95882),o=r(28855),{filter:s,flatMap:A,share:a,take:c,takeUntil:u}=r(20683),l=r(21027),h=r(32542);e.exports=class{constructor(e,t,r){n.assign(this,{answers:r,status:"pending"}),this.opt=n.defaults(n.clone(e),{validate:()=>!0,filter:e=>e,when:()=>!0,suffix:"",prefix:i.green("?")}),this.opt.name||this.throwParamError("name"),this.opt.message||(this.opt.message=this.opt.name+":"),Array.isArray(this.opt.choices)&&(this.opt.choices=new l(this.opt.choices,r)),this.rl=t,this.screen=new h(this.rl)}run(){return new Promise(e=>{this._run(t=>e(t))})}_run(e){e()}throwParamError(e){throw new Error("You must provide a `"+e+"` parameter")}close(){this.screen.releaseCursor()}handleSubmitEvents(e){var t=this,r=o(this.opt.validate),n=o(this.opt.filter),i=e.pipe(A(e=>n(e,t.answers).then(e=>r(e,t.answers).then(t=>({isValid:t,value:e}),t=>({isValid:t,value:e})),e=>({isValid:e}))),a()),l=i.pipe(s(e=>!0===e.isValid),c(1));return{success:l,error:i.pipe(s(e=>!0!==e.isValid),u(l))}}getQuestion(){var e=this.opt.prefix+" "+i.bold(this.opt.message)+this.opt.suffix+i.reset(" ");return null!=this.opt.default&&"answered"!==this.status&&("password"===this.opt.type?e+=i.italic.dim("[hidden] "):e+=i.dim("("+this.opt.default+") ")),e}}},33375:(e,t,r)=>{"use strict";var n={isArray:r(82664),map:r(27869),isString:r(221)},i=r(95882),o=r(61696),s=r(51938),{map:A,takeUntil:a}=r(20683),c=r(10485),u=r(92330),l=r(78635);e.exports=class extends c{constructor(e,t,r){super(e,t,r),this.opt.choices||this.throwParamError("choices"),n.isArray(this.opt.default)&&this.opt.choices.forEach((function(e){this.opt.default.indexOf(e.value)>=0&&(e.checked=!0)}),this),this.pointer=0,this.opt.default=null,this.paginator=new l(this.screen)}_run(e){this.done=e;var t=u(this.rl),r=this.handleSubmitEvents(t.line.pipe(A(this.getCurrentValue.bind(this))));return r.success.forEach(this.onEnd.bind(this)),r.error.forEach(this.onError.bind(this)),t.normalizedUpKey.pipe(a(r.success)).forEach(this.onUpKey.bind(this)),t.normalizedDownKey.pipe(a(r.success)).forEach(this.onDownKey.bind(this)),t.numberKey.pipe(a(r.success)).forEach(this.onNumberKey.bind(this)),t.spaceKey.pipe(a(r.success)).forEach(this.onSpaceKey.bind(this)),t.aKey.pipe(a(r.success)).forEach(this.onAllKey.bind(this)),t.iKey.pipe(a(r.success)).forEach(this.onInverseKey.bind(this)),o.hide(),this.render(),this.firstRender=!1,this}render(e){var t,r,o,A,a=this.getQuestion(),c="";if(this.spaceKeyPressed||(a+="(Press "+i.cyan.bold("")+" to select, "+i.cyan.bold("")+" to toggle all, "+i.cyan.bold("")+" to invert selection)"),"answered"===this.status)a+=i.cyan(this.selection.join(", "));else{var u=(t=this.opt.choices,r=this.pointer,o="",A=0,t.forEach((function(e,t){if("separator"===e.type)return A++,void(o+=" "+e+"\n");if(e.disabled)A++,o+=" - "+e.name,o+=" ("+(n.isString(e.disabled)?e.disabled:"Disabled")+")";else{var a=(e.checked?i.green(s.radioOn):s.radioOff)+" "+e.name;o+=t-A===r?i.cyan(s.pointer+a):" "+a}o+="\n"})),o.replace(/\n$/,"")),l=this.opt.choices.indexOf(this.opt.choices.getChoice(this.pointer));a+="\n"+this.paginator.paginate(u,l,this.opt.pageSize)}e&&(c=i.red(">> ")+e),this.screen.render(a,c)}onEnd(e){this.status="answered",this.spaceKeyPressed=!0,this.render(),this.screen.done(),o.show(),this.done(e.value)}onError(e){this.render(e.isValid)}getCurrentValue(){var e=this.opt.choices.filter((function(e){return Boolean(e.checked)&&!e.disabled}));return this.selection=n.map(e,"short"),n.map(e,"value")}onUpKey(){var e=this.opt.choices.realLength;this.pointer=this.pointer>0?this.pointer-1:e-1,this.render()}onDownKey(){var e=this.opt.choices.realLength;this.pointer=this.pointer{"use strict";var n={extend:r(94501),isBoolean:r(66807)},i=r(95882),{take:o,takeUntil:s}=r(20683),A=r(10485),a=r(92330);e.exports=class extends A{constructor(e,t,r){super(e,t,r);var i=!0;n.extend(this.opt,{filter:function(e){var t=i;return null!=e&&""!==e&&(t=/^y(es)?/i.test(e)),t}}),n.isBoolean(this.opt.default)&&(i=this.opt.default),this.opt.default=i?"Y/n":"y/N"}_run(e){this.done=e;var t=a(this.rl);return t.keypress.pipe(s(t.line)).forEach(this.onKeypress.bind(this)),t.line.pipe(o(1)).forEach(this.onEnd.bind(this)),this.render(),this}render(e){var t=this.getQuestion();return t+="boolean"==typeof e?i.cyan(e?"Yes":"No"):this.rl.line,this.screen.render(t),this}onEnd(e){this.status="answered";var t=this.opt.filter(e);this.render(t),this.screen.done(),this.done(t)}onKeypress(){this.render()}}},48748:(e,t,r)=>{"use strict";var n=r(95882),i=r(48011).Wl,o=r(10485),s=r(92330),{Subject:A}=r(86596);e.exports=class extends o{_run(e){this.done=e,this.editorResult=new A;var t=s(this.rl);this.lineSubscription=t.line.subscribe(this.startExternalEditor.bind(this));var r=this.handleSubmitEvents(this.editorResult);return r.success.forEach(this.onEnd.bind(this)),r.error.forEach(this.onError.bind(this)),this.currentText=this.opt.default,this.opt.default=null,this.render(),this}render(e){var t="",r=this.getQuestion();"answered"===this.status?r+=n.dim("Received"):r+=n.dim("Press to launch your preferred editor."),e&&(t=n.red(">> ")+e),this.screen.render(r,t)}startExternalEditor(){this.rl.pause(),i(this.currentText,this.endExternalEditor.bind(this))}endExternalEditor(e,t){this.rl.resume(),e?this.editorResult.error(e):this.editorResult.next(t)}onEnd(e){this.editorResult.unsubscribe(),this.lineSubscription.unsubscribe(),this.answer=e.value,this.status="answered",this.render(),this.screen.done(),this.done(this.answer)}onError(e){this.render(e.isValid)}}},73870:(e,t,r)=>{"use strict";var n={uniq:r(44852),isString:r(221),isNumber:r(71044),findIndex:r(17506)},i=r(95882),{map:o,takeUntil:s}=r(20683),A=r(10485),a=r(88249),c=r(92330),u=r(78635);e.exports=class extends A{constructor(e,t,r){super(e,t,r),this.opt.choices||this.throwParamError("choices"),this.validateChoices(this.opt.choices),this.opt.choices.push({key:"h",name:"Help, list all options",value:"help"}),this.opt.validate=e=>null==e?"Please enter a valid command":"help"!==e,this.opt.default=this.generateChoicesString(this.opt.choices,this.opt.default),this.paginator=new u(this.screen)}_run(e){this.done=e;var t=c(this.rl),r=this.handleSubmitEvents(t.line.pipe(o(this.getCurrentValue.bind(this))));return r.success.forEach(this.onSubmit.bind(this)),r.error.forEach(this.onError.bind(this)),this.keypressObs=t.keypress.pipe(s(r.success)).forEach(this.onKeypress.bind(this)),this.render(),this}render(e,t){var r,n,o,s=this.getQuestion(),A="";if("answered"===this.status)s+=i.cyan(this.answer);else if("expanded"===this.status){var a=(r=this.opt.choices,n=this.selectedKey,o="",r.forEach(e=>{if(o+="\n ","separator"!==e.type){var t=e.key+") "+e.name;n===e.key&&(t=i.cyan(t)),o+=t}else o+=" "+e}),o);s+=this.paginator.paginate(a,this.selectedKey,this.opt.pageSize),s+="\n Answer: "}s+=this.rl.line,e&&(A=i.red(">> ")+e),t&&(A=i.cyan(">> ")+t),this.screen.render(s,A)}getCurrentValue(e){e||(e=this.rawDefault);var t=this.opt.choices.where({key:e.toLowerCase().trim()})[0];return t?t.value:null}getChoices(){var e="";return this.opt.choices.forEach(t=>{if(e+="\n ","separator"!==t.type){var r=t.key+") "+t.name;this.selectedKey===t.key&&(r=i.cyan(r)),e+=r}else e+=" "+t}),e}onError(e){if("help"===e.value)return this.selectedKey="",this.status="expanded",void this.render();this.render(e.isValid)}onSubmit(e){this.status="answered";var t=this.opt.choices.where({value:e.value})[0];this.answer=t.short||t.name,this.render(),this.screen.done(),this.done(e.value)}onKeypress(){this.selectedKey=this.rl.line.toLowerCase();var e=this.opt.choices.where({key:this.selectedKey})[0];"expanded"===this.status?this.render():this.render(null,e?e.name:null)}validateChoices(e){var t,r=[],i={};if(e.filter(a.exclude).forEach(e=>{e.key&&1===e.key.length||(t=!0),i[e.key]&&r.push(e.key),i[e.key]=!0,e.key=String(e.key).toLowerCase()}),t)throw new Error("Format error: `key` param must be a single letter and is required.");if(i.h)throw new Error("Reserved key error: `key` param cannot be `h` - this value is reserved.");if(r.length)throw new Error("Duplicate key error: `key` param must be unique. Duplicates: "+n.uniq(r).join(", "))}generateChoicesString(e,t){var r=e.realLength-1;if(n.isNumber(t)&&this.opt.choices.getChoice(t))r=t;else if(n.isString(t)){let i=n.findIndex(e.realChoices,({value:e})=>e===t);r=-1===i?r:i}var i=this.opt.choices.pluck("key");return this.rawDefault=i[r],i[r]=String(i[r]).toUpperCase(),i.join("")}}},90013:(e,t,r)=>{"use strict";var n=r(95882),{map:i,takeUntil:o}=r(20683),s=r(10485),A=r(92330);e.exports=class extends s{_run(e){this.done=e;var t=A(this.rl),r=t.line.pipe(i(this.filterInput.bind(this))),n=this.handleSubmitEvents(r);return n.success.forEach(this.onEnd.bind(this)),n.error.forEach(this.onError.bind(this)),t.keypress.pipe(o(n.success)).forEach(this.onKeypress.bind(this)),this.render(),this}render(e){var t="",r="",i=this.getQuestion(),o=this.opt.transformer,s="answered"===this.status;r=s?this.answer:this.rl.line,i+=o?o(r,this.answers,{isFinal:s}):s?n.cyan(r):r,e&&(t=n.red(">> ")+e),this.screen.render(i,t)}filterInput(e){return e||(null==this.opt.default?"":this.opt.default)}onEnd(e){this.answer=e.value,this.status="answered",this.render(),this.screen.done(),this.done(e.value)}onError({value:e="",isValid:t}){this.rl.line+=e,this.rl.cursor+=e.length,this.render(t)}onKeypress(){this.opt.default&&(this.opt.default=void 0),this.render()}}},89336:(e,t,r)=>{"use strict";var n={isNumber:r(71044),findIndex:r(17506),isString:r(221)},i=r(95882),o=r(51938),s=r(61696),A=r(28855),{flatMap:a,map:c,take:u,takeUntil:l}=r(20683),h=r(10485),g=r(92330),f=r(78635);e.exports=class extends h{constructor(e,t,r){super(e,t,r),this.opt.choices||this.throwParamError("choices"),this.firstRender=!0,this.selected=0;var i=this.opt.default;if(n.isNumber(i)&&i>=0&&ie===i);this.selected=Math.max(e,0)}this.opt.default=null,this.paginator=new f(this.screen)}_run(e){this.done=e;var t=this,r=g(this.rl);return r.normalizedUpKey.pipe(l(r.line)).forEach(this.onUpKey.bind(this)),r.normalizedDownKey.pipe(l(r.line)).forEach(this.onDownKey.bind(this)),r.numberKey.pipe(l(r.line)).forEach(this.onNumberKey.bind(this)),r.line.pipe(u(1),c(this.getCurrentValue.bind(this)),a(e=>A(t.opt.filter)(e).catch(e=>e))).forEach(this.onSubmit.bind(this)),s.hide(),this.render(),this}render(){var e,t,r,s,A=this.getQuestion();if(this.firstRender&&(A+=i.dim("(Use arrow keys)")),"answered"===this.status)A+=i.cyan(this.opt.choices.getChoice(this.selected).short);else{var a=(e=this.opt.choices,t=this.selected,r="",s=0,e.forEach((e,A)=>{if("separator"===e.type)return s++,void(r+=" "+e+"\n");if(e.disabled)return s++,r+=" - "+e.name,r+=" ("+(n.isString(e.disabled)?e.disabled:"Disabled")+")",void(r+="\n");var a=A-s===t,c=(a?o.pointer+" ":" ")+e.name;a&&(c=i.cyan(c)),r+=c+" \n"}),r.replace(/\n$/,"")),c=this.opt.choices.indexOf(this.opt.choices.getChoice(this.selected));A+="\n"+this.paginator.paginate(a,c,this.opt.pageSize)}this.firstRender=!1,this.screen.render(A)}onSubmit(e){this.status="answered",this.render(),this.screen.done(),s.show(),this.done(e)}getCurrentValue(){return this.opt.choices.getChoice(this.selected).value}onUpKey(){var e=this.opt.choices.realLength;this.selected=this.selected>0?this.selected-1:e-1,this.render()}onDownKey(){var e=this.opt.choices.realLength;this.selected=this.selected{"use strict";var n=r(90013);e.exports=class extends n{filterInput(e){if(e&&"string"==typeof e){let t=(e=e.trim()).match(/(^-?\d+|^\d+\.\d*|^\d*\.\d+)(e\d+)?$/);if(t)return Number(t[0])}return null==this.opt.default?NaN:this.opt.default}}},30428:(e,t,r)=>{"use strict";var n=r(95882),{map:i,takeUntil:o}=r(20683),s=r(10485),A=r(92330);function a(e,t){return t="string"==typeof t?t:"*",0===(e=String(e)).length?"":new Array(e.length+1).join(t)}e.exports=class extends s{_run(e){this.done=e;var t=A(this.rl),r=t.line.pipe(i(this.filterInput.bind(this))),n=this.handleSubmitEvents(r);return n.success.forEach(this.onEnd.bind(this)),n.error.forEach(this.onError.bind(this)),t.keypress.pipe(o(n.success)).forEach(this.onKeypress.bind(this)),this.render(),this}render(e){var t=this.getQuestion(),r="";"answered"===this.status?t+=this.opt.mask?n.cyan(a(this.answer,this.opt.mask)):n.italic.dim("[hidden]"):this.opt.mask?t+=a(this.rl.line||"",this.opt.mask):t+=n.italic.dim("[input is hidden] "),e&&(r="\n"+n.red(">> ")+e),this.screen.render(t,r)}filterInput(e){return e||(null==this.opt.default?"":this.opt.default)}onEnd(e){this.status="answered",this.answer=e.value,this.render(),this.screen.done(),this.done(e.value)}onError(e){this.render(e.isValid)}onKeypress(){this.opt.default&&(this.opt.default=void 0),this.render()}}},942:(e,t,r)=>{"use strict";var n={extend:r(94501),isNumber:r(71044),findIndex:r(17506)},i=r(95882),{map:o,takeUntil:s}=r(20683),A=r(10485),a=r(88249),c=r(92330),u=r(78635);e.exports=class extends A{constructor(e,t,r){super(e,t,r),this.opt.choices||this.throwParamError("choices"),this.opt.validChoices=this.opt.choices.filter(a.exclude),this.selected=0,this.rawDefault=0,n.extend(this.opt,{validate:function(e){return null!=e}});var i=this.opt.default;if(n.isNumber(i)&&i>=0&&ie===i),t=Math.max(e,0);this.selected=t,this.rawDefault=t}this.opt.default=null,this.paginator=new u}_run(e){this.done=e;var t=c(this.rl),r=t.line.pipe(o(this.getCurrentValue.bind(this))),n=this.handleSubmitEvents(r);return n.success.forEach(this.onEnd.bind(this)),n.error.forEach(this.onError.bind(this)),t.normalizedUpKey.pipe(s(t.line)).forEach(this.onUpKey.bind(this)),t.normalizedDownKey.pipe(s(t.line)).forEach(this.onDownKey.bind(this)),t.keypress.pipe(s(n.success)).forEach(this.onKeypress.bind(this)),this.render(),this}render(e){var t,r,n,o,s=this.getQuestion(),A="";if("answered"===this.status)s+=i.cyan(this.answer);else{var a=(t=this.opt.choices,r=this.selected,n="",o=0,t.forEach((function(e,t){if(n+="\n ","separator"===e.type)return o++,void(n+=" "+e);var s=t-o,A=s+1+") "+e.name;s===r&&(A=i.cyan(A)),n+=A})),n);s+="\n"+this.paginator.paginate(a,this.selected,this.opt.pageSize),s+="\n Answer: "}s+=this.rl.line,e&&(A="\n"+i.red(">> ")+e),this.screen.render(s,A)}getCurrentValue(e){null==e?e=this.rawDefault:""===e?e=this.selected:e-=1;var t=this.opt.choices.getChoice(e);return t?t.value:null}onEnd(e){this.status="answered",this.answer=e.value,this.render(),this.screen.done(),this.done(e.value)}onError(){this.render("Please enter a valid index")}onKeypress(){var e=this.rl.line.length?Number(this.rl.line)-1:0;this.opt.choices.getChoice(e)?this.selected=e:this.selected=void 0,this.render()}onUpKey(){this.onArrowKey("up")}onDownKey(){this.onArrowKey("down")}onArrowKey(e){var t=this.opt.choices.realLength;this.selected="up"===e?this.selected>0?this.selected-1:t-1:this.selected{"use strict";var n={extend:r(94501),omit:r(82740)},i=r(75319),o=r(51058);e.exports=class{constructor(e){this.rl||(this.rl=o.createInterface(function(e){(e=e||{}).skipTTYChecks=void 0===e.skipTTYChecks||e.skipTTYChecks;var t=e.input||process.stdin;if(!e.skipTTYChecks&&!t.isTTY){const e=new Error("Prompts can not be meaningfully rendered in non-TTY environments");throw e.isTtyError=!0,e}var r=new i;r.pipe(e.output||process.stdout);var o=r;return n.extend({terminal:!0,input:t,output:o},n.omit(e,["input","output"]))}(e))),this.rl.resume(),this.onForceClose=this.onForceClose.bind(this),process.on("exit",this.onForceClose),this.rl.on("SIGINT",this.onForceClose)}onForceClose(){this.close(),process.kill(process.pid,"SIGINT"),console.log("")}close(){this.rl.removeListener("SIGINT",this.onForceClose),process.removeListener("exit",this.onForceClose),this.rl.output.unmute(),this.activePrompt&&"function"==typeof this.activePrompt.close&&this.activePrompt.close(),this.rl.output.end(),this.rl.pause(),this.rl.close()}}},36896:(e,t,r)=>{"use strict";var n=r(94864),i=r(89127),o=r(4446),s={last:r(49845)};e.exports=class extends i{constructor(e){super(e=e||{}),this.log=n(this.writeLog.bind(this)),this.bottomBar=e.bottomBar||"",this.render()}render(){return this.write(this.bottomBar),this}clean(){return o.clearLine(this.rl,this.bottomBar.split("\n").length),this}updateBottomBar(e){return o.clearLine(this.rl,1),this.rl.output.unmute(),this.clean(),this.bottomBar=e,this.render(),this.rl.output.mute(),this}writeLog(e){return this.rl.output.unmute(),this.clean(),this.rl.output.write(this.enforceLF(e.toString())),this.render(),this.rl.output.mute(),this}enforceLF(e){return e.match(/[\r\n]$/)?e:e+"\n"}write(e){var t=e.split(/\n/);this.height=t.length,this.rl.setPrompt(s.last(t)),0===this.rl.output.rows&&0===this.rl.output.columns&&o.left(this.rl,e.length+this.rl.line.length),this.rl.output.write(e)}}},87380:(e,t,r)=>{"use strict";var n={isPlainObject:r(11672),clone:r(22254),isArray:r(82664),set:r(81534),isFunction:r(92533)},{defer:i,empty:o,from:s,of:A}=r(86596),{concatMap:a,filter:c,publish:u,reduce:l}=r(20683),h=r(28855),g=r(74941),f=r(89127);e.exports=class extends f{constructor(e,t){super(t),this.prompts=e}run(e,t){n.isPlainObject(t)?this.answers=n.clone(t):this.answers={},n.isPlainObject(e)&&(e=[e]);var r=n.isArray(e)?s(e):e;return this.process=r.pipe(a(this.processQuestion.bind(this)),u()),this.process.connect(),this.process.pipe(l((e,t)=>(n.set(e,t.name,t.answer),e),this.answers)).toPromise(Promise).then(this.onCompletion.bind(this))}onCompletion(){return this.close(),this.answers}processQuestion(e){return e=n.clone(e),i(()=>A(e).pipe(a(this.setDefaultType.bind(this)),a(this.filterIfRunnable.bind(this)),a(()=>g.fetchAsyncQuestionProperty(e,"message",this.answers)),a(()=>g.fetchAsyncQuestionProperty(e,"default",this.answers)),a(()=>g.fetchAsyncQuestionProperty(e,"choices",this.answers)),a(this.fetchAnswer.bind(this))))}fetchAnswer(e){var t=this.prompts[e.type];return this.activePrompt=new t(e,this.rl,this.answers),i(()=>s(this.activePrompt.run().then(t=>({name:e.name,answer:t}))))}setDefaultType(e){return this.prompts[e.type]||(e.type="input"),i(()=>A(e))}filterIfRunnable(e){if(!0!==e.askAnswered&&void 0!==this.answers[e.name])return o();if(!1===e.when)return o();if(!n.isFunction(e.when))return A(e);var t=this.answers;return i(()=>s(h(e.when)(t).then(t=>{if(t)return e})).pipe(c(e=>null!=e)))}}},92330:(e,t,r)=>{"use strict";var{fromEvent:n}=r(86596),{filter:i,map:o,share:s,takeUntil:A}=r(20683);function a(e,t){return{value:e,key:t||{}}}e.exports=function(e){var t=n(e.input,"keypress",a).pipe(A(n(e,"close"))).pipe(i(({key:e})=>"enter"!==e.name&&"return"!==e.name));return{line:n(e,"line"),keypress:t,normalizedUpKey:t.pipe(i(({key:e})=>"up"===e.name||"k"===e.name||"p"===e.name&&e.ctrl),s()),normalizedDownKey:t.pipe(i(({key:e})=>"down"===e.name||"j"===e.name||"n"===e.name&&e.ctrl),s()),numberKey:t.pipe(i(e=>e.value&&"123456789".indexOf(e.value)>=0),o(e=>Number(e.value)),s()),spaceKey:t.pipe(i(({key:e})=>e&&"space"===e.name),s()),aKey:t.pipe(i(({key:e})=>e&&"a"===e.name),s()),iKey:t.pipe(i(({key:e})=>e&&"i"===e.name),s())}}},78635:(e,t,r)=>{"use strict";var n={sum:r(2614),flatten:r(54690)},i=r(95882);e.exports=class{constructor(e){this.pointer=0,this.lastIndex=0,this.screen=e}paginate(e,t,r){r=r||7;var o=Math.floor(r/2),s=e.split("\n");if(this.screen&&(s=this.screen.breakLines(s),t=n.sum(s.map(e=>e.length).splice(0,t)),s=n.flatten(s)),s.length<=r)return e;this.pointer{"use strict";var n=r(27589);t.left=function(e,t){e.output.write(n.cursorBackward(t))},t.right=function(e,t){e.output.write(n.cursorForward(t))},t.up=function(e,t){e.output.write(n.cursorUp(t))},t.down=function(e,t){e.output.write(n.cursorDown(t))},t.clearLine=function(e,t){e.output.write(n.eraseLines(t))}},32542:(e,t,r)=>{"use strict";var n={last:r(49845),flatten:r(54690)},i=r(4446),o=r(17945),s=r(7915),A=r(55043);function a(e){return e.split("\n").length}function c(e){return n.last(e.split("\n"))}e.exports=class{constructor(e){this.height=0,this.extraLinesUnderPrompt=0,this.rl=e}render(e,t){this.rl.output.unmute(),this.clean(this.extraLinesUnderPrompt);var r=c(e),n=s(r),o=n;this.rl.line.length&&(o=o.slice(0,-this.rl.line.length)),this.rl.setPrompt(o);var u=this.rl._getCursorPos(),l=this.normalizedCliWidth();e=this.forceLineReturn(e,l),t&&(t=this.forceLineReturn(t,l)),n.length%l==0&&(e+="\n");var h=e+(t?"\n"+t:"");this.rl.output.write(h);var g=Math.floor(n.length/l)-u.rows+(t?a(t):0);g>0&&i.up(this.rl,g),i.left(this.rl,A(c(h))),u.cols>0&&i.right(this.rl,u.cols),this.extraLinesUnderPrompt=g,this.height=a(h),this.rl.output.mute()}clean(e){e>0&&i.down(this.rl,e),i.clearLine(this.rl,this.height)}done(){this.rl.setPrompt(""),this.rl.output.unmute(),this.rl.output.write("\n")}releaseCursor(){this.extraLinesUnderPrompt>0&&i.down(this.rl,this.extraLinesUnderPrompt)}normalizedCliWidth(){return o({defaultWidth:80,output:this.rl.output})}breakLines(e,t){t=t||this.normalizedCliWidth();var r=new RegExp("(?:(?:\\033[[0-9;]*m)*.?){1,"+t+"}","g");return e.map(e=>{var t=e.match(r);return t.pop(),t||""})}forceLineReturn(e,t){return t=t||this.normalizedCliWidth(),n.flatten(this.breakLines(e.split("\n"),t)).join("\n")}}},74941:(e,t,r)=>{"use strict";var n={isFunction:r(92533)},{from:i,of:o}=r(86596),s=r(28855);t.fetchAsyncQuestionProperty=function(e,t,r){return n.isFunction(e[t])?i(s(e[t])(r).then(r=>(e[t]=r,e))):o(e)}},44486:e=>{ -/*! - * is-extglob - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - */ -e.exports=function(e){if("string"!=typeof e||""===e)return!1;for(var t;t=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(t[2])return!0;e=e.slice(t.index+t[0].length)}return!1}},7347:e=>{"use strict";const t=e=>!Number.isNaN(e)&&(e>=4352&&(e<=4447||9001===e||9002===e||11904<=e&&e<=12871&&12351!==e||12880<=e&&e<=19903||19968<=e&&e<=42182||43360<=e&&e<=43388||44032<=e&&e<=55203||63744<=e&&e<=64255||65040<=e&&e<=65049||65072<=e&&e<=65131||65281<=e&&e<=65376||65504<=e&&e<=65510||110592<=e&&e<=110593||127488<=e&&e<=127569||131072<=e&&e<=262141));e.exports=t,e.exports.default=t},18193:(e,t,r)=>{ -/*! - * is-glob - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ -var n=r(44486),i={"{":"}","(":")","[":"]"},o=/\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/,s=/\\(.)|(^!|[*?{}()[\]]|\(\?)/;e.exports=function(e,t){if("string"!=typeof e||""===e)return!1;if(n(e))return!0;var r,A=o;for(t&&!1===t.strict&&(A=s);r=A.exec(e);){if(r[2])return!0;var a=r.index+r[0].length,c=r[1],u=c?i[c]:null;if(c&&u){var l=e.indexOf(u,a);-1!==l&&(a=l+1)}e=e.slice(a)}return!1}},59235:e=>{"use strict"; -/*! - * is-number - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Released under the MIT License. - */e.exports=function(e){return"number"==typeof e?e-e==0:"string"==typeof e&&""!==e.trim()&&(Number.isFinite?Number.isFinite(+e):isFinite(+e))}},61047:e=>{e.exports=function(e){return!!e&&("object"==typeof e||"function"==typeof e)&&"function"==typeof e.then}},97369:(e,t)=>{var r,n,i,o; -/*! - * is-windows - * - * Copyright © 2015-2018, Jon Schlinkert. - * Released under the MIT License. - */o=function(){"use strict";return function(){return process&&("win32"===process.platform||/^(msys|cygwin)$/.test(process.env.OSTYPE))}},t&&"object"==typeof t?e.exports=o():(n=[],void 0===(i="function"==typeof(r=o)?r.apply(t,n):r)||(e.exports=i))},64151:(e,t,r)=>{var n;r(35747);function i(e,t,r){if("function"==typeof t&&(r=t,t={}),!r){if("function"!=typeof Promise)throw new TypeError("callback not provided");return new Promise((function(r,n){i(e,t||{},(function(e,t){e?n(e):r(t)}))}))}n(e,t||{},(function(e,n){e&&("EACCES"===e.code||t&&t.ignoreErrors)&&(e=null,n=!1),r(e,n)}))}n="win32"===process.platform||global.TESTING_WINDOWS?r(3202):r(2151),e.exports=i,i.sync=function(e,t){try{return n.sync(e,t||{})}catch(e){if(t&&t.ignoreErrors||"EACCES"===e.code)return!1;throw e}}},2151:(e,t,r)=>{e.exports=i,i.sync=function(e,t){return o(n.statSync(e),t)};var n=r(35747);function i(e,t,r){n.stat(e,(function(e,n){r(e,!e&&o(n,t))}))}function o(e,t){return e.isFile()&&function(e,t){var r=e.mode,n=e.uid,i=e.gid,o=void 0!==t.uid?t.uid:process.getuid&&process.getuid(),s=void 0!==t.gid?t.gid:process.getgid&&process.getgid(),A=parseInt("100",8),a=parseInt("010",8),c=parseInt("001",8),u=A|a;return r&c||r&a&&i===s||r&A&&n===o||r&u&&0===o}(e,t)}},3202:(e,t,r)=>{e.exports=o,o.sync=function(e,t){return i(n.statSync(e),e,t)};var n=r(35747);function i(e,t,r){return!(!e.isSymbolicLink()&&!e.isFile())&&function(e,t){var r=void 0!==t.pathExt?t.pathExt:process.env.PATHEXT;if(!r)return!0;if(-1!==(r=r.split(";")).indexOf(""))return!0;for(var n=0;n{"use strict";var n=r(40744);e.exports=n},40744:(e,t,r)=>{"use strict";var n=r(55384),i=r(24129);function o(e){return function(){throw new Error("Function "+e+" is deprecated and cannot be used.")}}e.exports.Type=r(81704),e.exports.Schema=r(8212),e.exports.FAILSAFE_SCHEMA=r(44413),e.exports.JSON_SCHEMA=r(45247),e.exports.CORE_SCHEMA=r(8769),e.exports.DEFAULT_SAFE_SCHEMA=r(65483),e.exports.DEFAULT_FULL_SCHEMA=r(5235),e.exports.load=n.load,e.exports.loadAll=n.loadAll,e.exports.safeLoad=n.safeLoad,e.exports.safeLoadAll=n.safeLoadAll,e.exports.dump=i.dump,e.exports.safeDump=i.safeDump,e.exports.YAMLException=r(17345),e.exports.MINIMAL_SCHEMA=r(44413),e.exports.SAFE_SCHEMA=r(65483),e.exports.DEFAULT_SCHEMA=r(5235),e.exports.scan=o("scan"),e.exports.parse=o("parse"),e.exports.compose=o("compose"),e.exports.addConstructor=o("addConstructor")},28149:e=>{"use strict";function t(e){return null==e}e.exports.isNothing=t,e.exports.isObject=function(e){return"object"==typeof e&&null!==e},e.exports.toArray=function(e){return Array.isArray(e)?e:t(e)?[]:[e]},e.exports.repeat=function(e,t){var r,n="";for(r=0;r{"use strict";var n=r(28149),i=r(17345),o=r(5235),s=r(65483),A=Object.prototype.toString,a=Object.prototype.hasOwnProperty,c={0:"\\0",7:"\\a",8:"\\b",9:"\\t",10:"\\n",11:"\\v",12:"\\f",13:"\\r",27:"\\e",34:'\\"',92:"\\\\",133:"\\N",160:"\\_",8232:"\\L",8233:"\\P"},u=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function l(e){var t,r,o;if(t=e.toString(16).toUpperCase(),e<=255)r="x",o=2;else if(e<=65535)r="u",o=4;else{if(!(e<=4294967295))throw new i("code point within a string may not be greater than 0xFFFFFFFF");r="U",o=8}return"\\"+r+n.repeat("0",o-t.length)+t}function h(e){this.schema=e.schema||o,this.indent=Math.max(1,e.indent||2),this.noArrayIndent=e.noArrayIndent||!1,this.skipInvalid=e.skipInvalid||!1,this.flowLevel=n.isNothing(e.flowLevel)?-1:e.flowLevel,this.styleMap=function(e,t){var r,n,i,o,s,A,c;if(null===t)return{};for(r={},i=0,o=(n=Object.keys(t)).length;in&&" "!==e[l+1],l=o);else if(!d(s))return 5;h=h&&C(s)}c=c||u&&o-l-1>n&&" "!==e[l+1]}return a||c?r>9&&E(e)?5:c?4:3:h&&!i(e)?1:2}function m(e,t,r,n){e.dump=function(){if(0===t.length)return"''";if(!e.noCompatMode&&-1!==u.indexOf(t))return"'"+t+"'";var o=e.indent*Math.max(1,r),s=-1===e.lineWidth?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-o),A=n||e.flowLevel>-1&&r>=e.flowLevel;switch(I(t,A,e.indent,s,(function(t){return function(e,t){var r,n;for(r=0,n=e.implicitTypes.length;r"+y(t,e.indent)+w(g(function(e,t){var r,n,i=/(\n+)([^\n]*)/g,o=(A=e.indexOf("\n"),A=-1!==A?A:e.length,i.lastIndex=A,B(e.slice(0,A),t)),s="\n"===e[0]||" "===e[0];var A;for(;n=i.exec(e);){var a=n[1],c=n[2];r=" "===c[0],o+=a+(s||r||""===c?"":"\n")+B(c,t),s=r}return o}(t,s),o));case 5:return'"'+function(e){for(var t,r,n,i="",o=0;o=55296&&t<=56319&&(r=e.charCodeAt(o+1))>=56320&&r<=57343?(i+=l(1024*(t-55296)+r-56320+65536),o++):(n=c[t],i+=!n&&d(t)?e[o]:n||l(t));return i}(t)+'"';default:throw new i("impossible error: invalid scalar style")}}()}function y(e,t){var r=E(e)?String(t):"",n="\n"===e[e.length-1];return r+(n&&("\n"===e[e.length-2]||"\n"===e)?"+":n?"":"-")+"\n"}function w(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function B(e,t){if(""===e||" "===e[0])return e;for(var r,n,i=/ [^ ]/g,o=0,s=0,A=0,a="";r=i.exec(e);)(A=r.index)-o>t&&(n=s>o?s:A,a+="\n"+e.slice(o,n),o=n+1),s=A;return a+="\n",e.length-o>t&&s>o?a+=e.slice(o,s)+"\n"+e.slice(s+1):a+=e.slice(o),a.slice(1)}function Q(e,t,r){var n,o,s,c,u,l;for(s=0,c=(o=r?e.explicitTypes:e.implicitTypes).length;s tag resolver accepts not "'+l+'" style');n=u.represent[l](t,l)}e.dump=n}return!0}return!1}function v(e,t,r,n,o,s){e.tag=null,e.dump=r,Q(e,r,!1)||Q(e,r,!0);var a=A.call(e.dump);n&&(n=e.flowLevel<0||e.flowLevel>t);var c,u,l="[object Object]"===a||"[object Array]"===a;if(l&&(u=-1!==(c=e.duplicates.indexOf(r))),(null!==e.tag&&"?"!==e.tag||u||2!==e.indent&&t>0)&&(o=!1),u&&e.usedDuplicates[c])e.dump="*ref_"+c;else{if(l&&u&&!e.usedDuplicates[c]&&(e.usedDuplicates[c]=!0),"[object Object]"===a)n&&0!==Object.keys(e.dump).length?(!function(e,t,r,n){var o,s,A,a,c,u,l="",h=e.tag,g=Object.keys(r);if(!0===e.sortKeys)g.sort();else if("function"==typeof e.sortKeys)g.sort(e.sortKeys);else if(e.sortKeys)throw new i("sortKeys must be a boolean or a function");for(o=0,s=g.length;o1024)&&(e.dump&&10===e.dump.charCodeAt(0)?u+="?":u+="? "),u+=e.dump,c&&(u+=f(e,t)),v(e,t+1,a,!0,c)&&(e.dump&&10===e.dump.charCodeAt(0)?u+=":":u+=": ",l+=u+=e.dump));e.tag=h,e.dump=l||"{}"}(e,t,e.dump,o),u&&(e.dump="&ref_"+c+e.dump)):(!function(e,t,r){var n,i,o,s,A,a="",c=e.tag,u=Object.keys(r);for(n=0,i=u.length;n1024&&(A+="? "),A+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),v(e,t,s,!1,!1)&&(a+=A+=e.dump));e.tag=c,e.dump="{"+a+"}"}(e,t,e.dump),u&&(e.dump="&ref_"+c+" "+e.dump));else if("[object Array]"===a){var h=e.noArrayIndent&&t>0?t-1:t;n&&0!==e.dump.length?(!function(e,t,r,n){var i,o,s="",A=e.tag;for(i=0,o=r.length;i "+e.dump)}return!0}function D(e,t){var r,n,i=[],o=[];for(function e(t,r,n){var i,o,s;if(null!==t&&"object"==typeof t)if(-1!==(o=r.indexOf(t)))-1===n.indexOf(o)&&n.push(o);else if(r.push(t),Array.isArray(t))for(o=0,s=t.length;o{"use strict";function t(e,t){Error.call(this),this.name="YAMLException",this.reason=e,this.mark=t,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||""}t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t},e.exports=t},55384:(e,t,r)=>{"use strict";var n=r(28149),i=r(17345),o=r(30399),s=r(65483),A=r(5235),a=Object.prototype.hasOwnProperty,c=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,u=/[\x85\u2028\u2029]/,l=/[,\[\]\{\}]/,h=/^(?:!|!!|![a-z\-]+!)$/i,g=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function f(e){return 10===e||13===e}function p(e){return 9===e||32===e}function d(e){return 9===e||32===e||10===e||13===e}function C(e){return 44===e||91===e||93===e||123===e||125===e}function E(e){var t;return 48<=e&&e<=57?e-48:97<=(t=32|e)&&t<=102?t-97+10:-1}function I(e){return 48===e?"\0":97===e?"":98===e?"\b":116===e||9===e?"\t":110===e?"\n":118===e?"\v":102===e?"\f":114===e?"\r":101===e?"":32===e?" ":34===e?'"':47===e?"/":92===e?"\\":78===e?"Â…":95===e?" ":76===e?"\u2028":80===e?"\u2029":""}function m(e){return e<=65535?String.fromCharCode(e):String.fromCharCode(55296+(e-65536>>10),56320+(e-65536&1023))}for(var y=new Array(256),w=new Array(256),B=0;B<256;B++)y[B]=I(B)?1:0,w[B]=I(B);function Q(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||A,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function v(e,t){return new i(t,new o(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function D(e,t){throw v(e,t)}function b(e,t){e.onWarning&&e.onWarning.call(null,v(e,t))}var S={YAML:function(e,t,r){var n,i,o;null!==e.version&&D(e,"duplication of %YAML directive"),1!==r.length&&D(e,"YAML directive accepts exactly one argument"),null===(n=/^([0-9]+)\.([0-9]+)$/.exec(r[0]))&&D(e,"ill-formed argument of the YAML directive"),i=parseInt(n[1],10),o=parseInt(n[2],10),1!==i&&D(e,"unacceptable YAML version of the document"),e.version=r[0],e.checkLineBreaks=o<2,1!==o&&2!==o&&b(e,"unsupported YAML version of the document")},TAG:function(e,t,r){var n,i;2!==r.length&&D(e,"TAG directive accepts exactly two arguments"),n=r[0],i=r[1],h.test(n)||D(e,"ill-formed tag handle (first argument) of the TAG directive"),a.call(e.tagMap,n)&&D(e,'there is a previously declared suffix for "'+n+'" tag handle'),g.test(i)||D(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=i}};function k(e,t,r,n){var i,o,s,A;if(t1&&(e.result+=n.repeat("\n",t-1))}function L(e,t){var r,n,i=e.tag,o=e.anchor,s=[],A=!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=s),n=e.input.charCodeAt(e.position);0!==n&&45===n&&d(e.input.charCodeAt(e.position+1));)if(A=!0,e.position++,N(e,!0,-1)&&e.lineIndent<=t)s.push(null),n=e.input.charCodeAt(e.position);else if(r=e.line,U(e,t,3,!1,!0),s.push(e.result),N(e,!0,-1),n=e.input.charCodeAt(e.position),(e.line===r||e.lineIndent>t)&&0!==n)D(e,"bad indentation of a sequence entry");else if(e.lineIndentt?B=1:e.lineIndent===t?B=0:e.lineIndentt?B=1:e.lineIndent===t?B=0:e.lineIndentt)&&(U(e,t,4,!0,i)&&(C?g=e.result:f=e.result),C||(F(e,u,l,h,g,f,o,s),h=g=f=null),N(e,!0,-1),A=e.input.charCodeAt(e.position)),e.lineIndent>t&&0!==A)D(e,"bad indentation of a mapping entry");else if(e.lineIndent=0))break;0===o?D(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):u?D(e,"repeat of an indentation width identifier"):(l=t+o-1,u=!0)}if(p(s)){do{s=e.input.charCodeAt(++e.position)}while(p(s));if(35===s)do{s=e.input.charCodeAt(++e.position)}while(!f(s)&&0!==s)}for(;0!==s;){for(M(e),e.lineIndent=0,s=e.input.charCodeAt(e.position);(!u||e.lineIndentl&&(l=e.lineIndent),f(s))h++;else{if(e.lineIndent0){for(i=s,o=0;i>0;i--)(s=E(A=e.input.charCodeAt(++e.position)))>=0?o=(o<<4)+s:D(e,"expected hexadecimal character");e.result+=m(o),e.position++}else D(e,"unknown escape sequence");r=n=e.position}else f(A)?(k(e,r,n,!0),K(e,N(e,!1,t)),r=n=e.position):e.position===e.lineStart&&R(e)?D(e,"unexpected end of the document within a double quoted scalar"):(e.position++,n=e.position)}D(e,"unexpected end of the stream within a double quoted scalar")}(e,g)?v=!0:!function(e){var t,r,n;if(42!==(n=e.input.charCodeAt(e.position)))return!1;for(n=e.input.charCodeAt(++e.position),t=e.position;0!==n&&!d(n)&&!C(n);)n=e.input.charCodeAt(++e.position);return e.position===t&&D(e,"name of an alias node must contain at least one character"),r=e.input.slice(t,e.position),e.anchorMap.hasOwnProperty(r)||D(e,'unidentified alias "'+r+'"'),e.result=e.anchorMap[r],N(e,!0,-1),!0}(e)?function(e,t,r){var n,i,o,s,A,a,c,u,l=e.kind,h=e.result;if(d(u=e.input.charCodeAt(e.position))||C(u)||35===u||38===u||42===u||33===u||124===u||62===u||39===u||34===u||37===u||64===u||96===u)return!1;if((63===u||45===u)&&(d(n=e.input.charCodeAt(e.position+1))||r&&C(n)))return!1;for(e.kind="scalar",e.result="",i=o=e.position,s=!1;0!==u;){if(58===u){if(d(n=e.input.charCodeAt(e.position+1))||r&&C(n))break}else if(35===u){if(d(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&R(e)||r&&C(u))break;if(f(u)){if(A=e.line,a=e.lineStart,c=e.lineIndent,N(e,!1,-1),e.lineIndent>=t){s=!0,u=e.input.charCodeAt(e.position);continue}e.position=o,e.line=A,e.lineStart=a,e.lineIndent=c;break}}s&&(k(e,i,o,!1),K(e,e.line-A),i=o=e.position,s=!1),p(u)||(o=e.position+1),u=e.input.charCodeAt(++e.position)}return k(e,i,o,!1),!!e.result||(e.kind=l,e.result=h,!1)}(e,g,1===r)&&(v=!0,null===e.tag&&(e.tag="?")):(v=!0,null===e.tag&&null===e.anchor||D(e,"alias node should not have any properties")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===B&&(v=c&&L(e,I))),null!==e.tag&&"!"!==e.tag)if("?"===e.tag){for(u=0,l=e.implicitTypes.length;u tag; it should be "'+h.kind+'", not "'+e.kind+'"'),h.resolve(e.result)?(e.result=h.construct(e.result),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):D(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")):D(e,"unknown tag !<"+e.tag+">");return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||v}function _(e){var t,r,n,i,o=e.position,s=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap={},e.anchorMap={};0!==(i=e.input.charCodeAt(e.position))&&(N(e,!0,-1),i=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==i));){for(s=!0,i=e.input.charCodeAt(++e.position),t=e.position;0!==i&&!d(i);)i=e.input.charCodeAt(++e.position);for(n=[],(r=e.input.slice(t,e.position)).length<1&&D(e,"directive name must not be less than one character in length");0!==i;){for(;p(i);)i=e.input.charCodeAt(++e.position);if(35===i){do{i=e.input.charCodeAt(++e.position)}while(0!==i&&!f(i));break}if(f(i))break;for(t=e.position;0!==i&&!d(i);)i=e.input.charCodeAt(++e.position);n.push(e.input.slice(t,e.position))}0!==i&&M(e),a.call(S,r)?S[r](e,r,n):b(e,'unknown document directive "'+r+'"')}N(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,N(e,!0,-1)):s&&D(e,"directives end mark is expected"),U(e,e.lineIndent-1,4,!1,!0),N(e,!0,-1),e.checkLineBreaks&&u.test(e.input.slice(o,e.position))&&b(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&R(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,N(e,!0,-1)):e.position{"use strict";var n=r(28149);function i(e,t,r,n,i){this.name=e,this.buffer=t,this.position=r,this.line=n,this.column=i}i.prototype.getSnippet=function(e,t){var r,i,o,s,A;if(!this.buffer)return null;for(e=e||4,t=t||75,r="",i=this.position;i>0&&-1==="\0\r\nÂ…\u2028\u2029".indexOf(this.buffer.charAt(i-1));)if(i-=1,this.position-i>t/2-1){r=" ... ",i+=5;break}for(o="",s=this.position;st/2-1){o=" ... ",s-=5;break}return A=this.buffer.slice(i,s),n.repeat(" ",e)+r+A+o+"\n"+n.repeat(" ",e+this.position-i+r.length)+"^"},i.prototype.toString=function(e){var t,r="";return this.name&&(r+='in "'+this.name+'" '),r+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet())&&(r+=":\n"+t),r},e.exports=i},8212:(e,t,r)=>{"use strict";var n=r(28149),i=r(17345),o=r(81704);function s(e,t,r){var n=[];return e.include.forEach((function(e){r=s(e,t,r)})),e[t].forEach((function(e){r.forEach((function(t,r){t.tag===e.tag&&t.kind===e.kind&&n.push(r)})),r.push(e)})),r.filter((function(e,t){return-1===n.indexOf(t)}))}function A(e){this.include=e.include||[],this.implicit=e.implicit||[],this.explicit=e.explicit||[],this.implicit.forEach((function(e){if(e.loadKind&&"scalar"!==e.loadKind)throw new i("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.")})),this.compiledImplicit=s(this,"implicit",[]),this.compiledExplicit=s(this,"explicit",[]),this.compiledTypeMap=function(){var e,t,r={scalar:{},sequence:{},mapping:{},fallback:{}};function n(e){r[e.kind][e.tag]=r.fallback[e.tag]=e}for(e=0,t=arguments.length;e{"use strict";var n=r(8212);e.exports=new n({include:[r(45247)]})},5235:(e,t,r)=>{"use strict";var n=r(8212);e.exports=n.DEFAULT=new n({include:[r(65483)],explicit:[r(61425),r(61872),r(79982)]})},65483:(e,t,r)=>{"use strict";var n=r(8212);e.exports=new n({include:[r(8769)],implicit:[r(83516),r(95441)],explicit:[r(34836),r(6847),r(65173),r(92025)]})},44413:(e,t,r)=>{"use strict";var n=r(8212);e.exports=new n({explicit:[r(19952),r(46557),r(90173)]})},45247:(e,t,r)=>{"use strict";var n=r(8212);e.exports=new n({include:[r(44413)],implicit:[r(40188),r(58357),r(82106),r(71945)]})},81704:(e,t,r)=>{"use strict";var n=r(17345),i=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],o=["scalar","sequence","mapping"];e.exports=function(e,t){var r,s;if(t=t||{},Object.keys(t).forEach((function(t){if(-1===i.indexOf(t))throw new n('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')})),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=(r=t.styleAliases||null,s={},null!==r&&Object.keys(r).forEach((function(e){r[e].forEach((function(t){s[String(t)]=e}))})),s),-1===o.indexOf(this.kind))throw new n('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}},34836:(e,t,r)=>{"use strict";var n;try{n=r(64293).Buffer}catch(e){}var i=r(81704),o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";e.exports=new i("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,r,n=0,i=e.length,s=o;for(r=0;r64)){if(t<0)return!1;n+=6}return n%8==0},construct:function(e){var t,r,i=e.replace(/[\r\n=]/g,""),s=i.length,A=o,a=0,c=[];for(t=0;t>16&255),c.push(a>>8&255),c.push(255&a)),a=a<<6|A.indexOf(i.charAt(t));return 0===(r=s%4*6)?(c.push(a>>16&255),c.push(a>>8&255),c.push(255&a)):18===r?(c.push(a>>10&255),c.push(a>>2&255)):12===r&&c.push(a>>4&255),n?n.from?n.from(c):new n(c):c},predicate:function(e){return n&&n.isBuffer(e)},represent:function(e){var t,r,n="",i=0,s=e.length,A=o;for(t=0;t>18&63],n+=A[i>>12&63],n+=A[i>>6&63],n+=A[63&i]),i=(i<<8)+e[t];return 0===(r=s%3)?(n+=A[i>>18&63],n+=A[i>>12&63],n+=A[i>>6&63],n+=A[63&i]):2===r?(n+=A[i>>10&63],n+=A[i>>4&63],n+=A[i<<2&63],n+=A[64]):1===r&&(n+=A[i>>2&63],n+=A[i<<4&63],n+=A[64],n+=A[64]),n}})},58357:(e,t,r)=>{"use strict";var n=r(81704);e.exports=new n("tag:yaml.org,2002:bool",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t=e.length;return 4===t&&("true"===e||"True"===e||"TRUE"===e)||5===t&&("false"===e||"False"===e||"FALSE"===e)},construct:function(e){return"true"===e||"True"===e||"TRUE"===e},predicate:function(e){return"[object Boolean]"===Object.prototype.toString.call(e)},represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"})},71945:(e,t,r)=>{"use strict";var n=r(28149),i=r(81704),o=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var s=/^[-+]?[0-9]+e/;e.exports=new i("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(e){return null!==e&&!(!o.test(e)||"_"===e[e.length-1])},construct:function(e){var t,r,n,i;return r="-"===(t=e.replace(/_/g,"").toLowerCase())[0]?-1:1,i=[],"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===r?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?NaN:t.indexOf(":")>=0?(t.split(":").forEach((function(e){i.unshift(parseFloat(e,10))})),t=0,n=1,i.forEach((function(e){t+=e*n,n*=60})),r*t):r*parseFloat(t,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!=0||n.isNegativeZero(e))},represent:function(e,t){var r;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(n.isNegativeZero(e))return"-0.0";return r=e.toString(10),s.test(r)?r.replace("e",".e"):r},defaultStyle:"lowercase"})},82106:(e,t,r)=>{"use strict";var n=r(28149),i=r(81704);function o(e){return 48<=e&&e<=55}function s(e){return 48<=e&&e<=57}e.exports=new i("tag:yaml.org,2002:int",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,r,n=e.length,i=0,A=!1;if(!n)return!1;if("-"!==(t=e[i])&&"+"!==t||(t=e[++i]),"0"===t){if(i+1===n)return!0;if("b"===(t=e[++i])){for(i++;i=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0"+e.toString(8):"-0"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})},79982:(e,t,r)=>{"use strict";var n;try{n=r(41313)}catch(e){"undefined"!=typeof window&&(n=window.esprima)}var i=r(81704);e.exports=new i("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:function(e){if(null===e)return!1;try{var t="("+e+")",r=n.parse(t,{range:!0});return"Program"===r.type&&1===r.body.length&&"ExpressionStatement"===r.body[0].type&&("ArrowFunctionExpression"===r.body[0].expression.type||"FunctionExpression"===r.body[0].expression.type)}catch(e){return!1}},construct:function(e){var t,r="("+e+")",i=n.parse(r,{range:!0}),o=[];if("Program"!==i.type||1!==i.body.length||"ExpressionStatement"!==i.body[0].type||"ArrowFunctionExpression"!==i.body[0].expression.type&&"FunctionExpression"!==i.body[0].expression.type)throw new Error("Failed to resolve function");return i.body[0].expression.params.forEach((function(e){o.push(e.name)})),t=i.body[0].expression.body.range,"BlockStatement"===i.body[0].expression.body.type?new Function(o,r.slice(t[0]+1,t[1]-1)):new Function(o,"return "+r.slice(t[0],t[1]))},predicate:function(e){return"[object Function]"===Object.prototype.toString.call(e)},represent:function(e){return e.toString()}})},61872:(e,t,r)=>{"use strict";var n=r(81704);e.exports=new n("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:function(e){if(null===e)return!1;if(0===e.length)return!1;var t=e,r=/\/([gim]*)$/.exec(e),n="";if("/"===t[0]){if(r&&(n=r[1]),n.length>3)return!1;if("/"!==t[t.length-n.length-1])return!1}return!0},construct:function(e){var t=e,r=/\/([gim]*)$/.exec(e),n="";return"/"===t[0]&&(r&&(n=r[1]),t=t.slice(1,t.length-n.length-1)),new RegExp(t,n)},predicate:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},represent:function(e){var t="/"+e.source+"/";return e.global&&(t+="g"),e.multiline&&(t+="m"),e.ignoreCase&&(t+="i"),t}})},61425:(e,t,r)=>{"use strict";var n=r(81704);e.exports=new n("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:function(){return!0},construct:function(){},predicate:function(e){return void 0===e},represent:function(){return""}})},90173:(e,t,r)=>{"use strict";var n=r(81704);e.exports=new n("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return null!==e?e:{}}})},95441:(e,t,r)=>{"use strict";var n=r(81704);e.exports=new n("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(e){return"<<"===e||null===e}})},40188:(e,t,r)=>{"use strict";var n=r(81704);e.exports=new n("tag:yaml.org,2002:null",{kind:"scalar",resolve:function(e){if(null===e)return!0;var t=e.length;return 1===t&&"~"===e||4===t&&("null"===e||"Null"===e||"NULL"===e)},construct:function(){return null},predicate:function(e){return null===e},represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})},6847:(e,t,r)=>{"use strict";var n=r(81704),i=Object.prototype.hasOwnProperty,o=Object.prototype.toString;e.exports=new n("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(e){if(null===e)return!0;var t,r,n,s,A,a=[],c=e;for(t=0,r=c.length;t{"use strict";var n=r(81704),i=Object.prototype.toString;e.exports=new n("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:function(e){if(null===e)return!0;var t,r,n,o,s,A=e;for(s=new Array(A.length),t=0,r=A.length;t{"use strict";var n=r(81704);e.exports=new n("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(e){return null!==e?e:[]}})},92025:(e,t,r)=>{"use strict";var n=r(81704),i=Object.prototype.hasOwnProperty;e.exports=new n("tag:yaml.org,2002:set",{kind:"mapping",resolve:function(e){if(null===e)return!0;var t,r=e;for(t in r)if(i.call(r,t)&&null!==r[t])return!1;return!0},construct:function(e){return null!==e?e:{}}})},19952:(e,t,r)=>{"use strict";var n=r(81704);e.exports=new n("tag:yaml.org,2002:str",{kind:"scalar",construct:function(e){return null!==e?e:""}})},83516:(e,t,r)=>{"use strict";var n=r(81704),i=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),o=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");e.exports=new n("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(e){return null!==e&&(null!==i.exec(e)||null!==o.exec(e))},construct:function(e){var t,r,n,s,A,a,c,u,l=0,h=null;if(null===(t=i.exec(e))&&(t=o.exec(e)),null===t)throw new Error("Date resolve error");if(r=+t[1],n=+t[2]-1,s=+t[3],!t[4])return new Date(Date.UTC(r,n,s));if(A=+t[4],a=+t[5],c=+t[6],t[7]){for(l=t[7].slice(0,3);l.length<3;)l+="0";l=+l}return t[9]&&(h=6e4*(60*+t[10]+ +(t[11]||0)),"-"===t[9]&&(h=-h)),u=new Date(Date.UTC(r,n,s,A,a,c,l)),h&&u.setTime(u.getTime()-h),u},instanceOf:Date,represent:function(e){return e.toISOString()}})},7427:(e,t)=>{t.stringify=function e(t){if(void 0===t)return t;if(t&&Buffer.isBuffer(t))return JSON.stringify(":base64:"+t.toString("base64"));if(t&&t.toJSON&&(t=t.toJSON()),t&&"object"==typeof t){var r="",n=Array.isArray(t);r=n?"[":"{";var i=!0;for(var o in t){var s="function"==typeof t[o]||!n&&void 0===t[o];Object.hasOwnProperty.call(t,o)&&!s&&(i||(r+=","),i=!1,n?null==t[o]?r+="null":r+=e(t[o]):void 0!==t[o]&&(r+=e(o)+":"+e(t[o])))}return r+=n?"]":"}"}return"string"==typeof t?JSON.stringify(/^:/.test(t)?":"+t:t):void 0===t?"null":JSON.stringify(t)},t.parse=function(e){return JSON.parse(e,(function(e,t){return"string"==typeof t?/^:base64:/.test(t)?Buffer.from(t.substring(8),"base64"):/^:/.test(t)?t.substring(1):t:t}))}},72515:(e,t,r)=>{"use strict";const n=r(28614),i=r(7427);e.exports=class extends n{constructor(e,t){if(super(),this.opts=Object.assign({namespace:"keyv",serialize:i.stringify,deserialize:i.parse},"string"==typeof e?{uri:e}:e,t),!this.opts.store){const e=Object.assign({},this.opts);this.opts.store=(e=>{const t={redis:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql"};if(e.adapter||e.uri){const n=e.adapter||/^[^:]*/.exec(e.uri)[0];return new(r(89112)(t[n]))(e)}return new Map})(e)}"function"==typeof this.opts.store.on&&this.opts.store.on("error",e=>this.emit("error",e)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e,t){e=this._getKeyPrefix(e);const{store:r}=this.opts;return Promise.resolve().then(()=>r.get(e)).then(e=>"string"==typeof e?this.opts.deserialize(e):e).then(r=>{if(void 0!==r){if(!("number"==typeof r.expires&&Date.now()>r.expires))return t&&t.raw?r:r.value;this.delete(e)}})}set(e,t,r){e=this._getKeyPrefix(e),void 0===r&&(r=this.opts.ttl),0===r&&(r=void 0);const{store:n}=this.opts;return Promise.resolve().then(()=>{const e="number"==typeof r?Date.now()+r:null;return t={value:t,expires:e},this.opts.serialize(t)}).then(t=>n.set(e,t,r)).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);const{store:t}=this.opts;return Promise.resolve().then(()=>t.delete(e))}clear(){const{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}}},89112:e=>{function t(e){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}t.keys=()=>[],t.resolve=t,t.id=89112,e.exports=t},78962:(e,t,r)=>{var n=r(99513)(r(76169),"DataView");e.exports=n},72574:(e,t,r)=>{var n=r(31713),i=r(86688),o=r(45937),s=r(5017),A=r(79457);function a(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t{var n=r(14620),i=r(73682),o=r(43112),s=r(90640),A=r(9380);function a(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t{var n=r(99513)(r(76169),"Map");e.exports=n},75009:(e,t,r)=>{var n=r(18209),i=r(89706),o=r(43786),s=r(17926),A=r(87345);function a(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t{var n=r(99513)(r(76169),"Promise");e.exports=n},43231:(e,t,r)=>{var n=r(99513)(r(76169),"Set");e.exports=n},46235:(e,t,r)=>{var n=r(75009),i=r(74785),o=r(87760);function s(e){var t=-1,r=null==e?0:e.length;for(this.__data__=new n;++t{var n=r(29197),i=r(35678),o=r(33336),s=r(97163),A=r(43737),a=r(48548);function c(e){var t=this.__data__=new n(e);this.size=t.size}c.prototype.clear=i,c.prototype.delete=o,c.prototype.get=s,c.prototype.has=A,c.prototype.set=a,e.exports=c},69976:(e,t,r)=>{var n=r(76169).Symbol;e.exports=n},2740:(e,t,r)=>{var n=r(76169).Uint8Array;e.exports=n},47063:(e,t,r)=>{var n=r(99513)(r(76169),"WeakMap");e.exports=n},66636:e=>{e.exports=function(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)}},33326:e=>{e.exports=function(e,t){for(var r=-1,n=null==e?0:e.length;++r{e.exports=function(e,t){for(var r=-1,n=null==e?0:e.length,i=0,o=[];++r{var n=r(37872);e.exports=function(e,t){return!!(null==e?0:e.length)&&n(e,t,0)>-1}},36669:e=>{e.exports=function(e,t,r){for(var n=-1,i=null==e?0:e.length;++n{var n=r(7089),i=r(61771),o=r(82664),s=r(10667),A=r(98041),a=r(32565),c=Object.prototype.hasOwnProperty;e.exports=function(e,t){var r=o(e),u=!r&&i(e),l=!r&&!u&&s(e),h=!r&&!u&&!l&&a(e),g=r||u||l||h,f=g?n(e.length,String):[],p=f.length;for(var d in e)!t&&!c.call(e,d)||g&&("length"==d||l&&("offset"==d||"parent"==d)||h&&("buffer"==d||"byteLength"==d||"byteOffset"==d)||A(d,p))||f.push(d);return f}},60783:e=>{e.exports=function(e,t){for(var r=-1,n=null==e?0:e.length,i=Array(n);++r{e.exports=function(e,t){for(var r=-1,n=t.length,i=e.length;++r{e.exports=function(e,t,r,n){var i=-1,o=null==e?0:e.length;for(n&&o&&(r=e[++i]);++i{e.exports=function(e,t){for(var r=-1,n=null==e?0:e.length;++r{e.exports=function(e){return e.split("")}},11852:e=>{var t=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;e.exports=function(e){return e.match(t)||[]}},65759:(e,t,r)=>{var n=r(91198),i=r(71074),o=Object.prototype.hasOwnProperty;e.exports=function(e,t,r){var s=e[t];o.call(e,t)&&i(s,r)&&(void 0!==r||t in e)||n(e,t,r)}},39836:(e,t,r)=>{var n=r(71074);e.exports=function(e,t){for(var r=e.length;r--;)if(n(e[r][0],t))return r;return-1}},28628:(e,t,r)=>{var n=r(75182),i=r(42185);e.exports=function(e,t){return e&&n(t,i(t),e)}},78707:(e,t,r)=>{var n=r(75182),i=r(24887);e.exports=function(e,t){return e&&n(t,i(t),e)}},91198:(e,t,r)=>{var n=r(65);e.exports=function(e,t,r){"__proto__"==t&&n?n(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):e[t]=r}},41076:(e,t,r)=>{var n=r(22851),i=r(33326),o=r(65759),s=r(28628),A=r(78707),a=r(64266),c=r(87229),u=r(23105),l=r(60741),h=r(60753),g=r(64420),f=r(79435),p=r(27908),d=r(37836),C=r(88438),E=r(82664),I=r(10667),m=r(13349),y=r(46778),w=r(33931),B=r(42185),Q={};Q["[object Arguments]"]=Q["[object Array]"]=Q["[object ArrayBuffer]"]=Q["[object DataView]"]=Q["[object Boolean]"]=Q["[object Date]"]=Q["[object Float32Array]"]=Q["[object Float64Array]"]=Q["[object Int8Array]"]=Q["[object Int16Array]"]=Q["[object Int32Array]"]=Q["[object Map]"]=Q["[object Number]"]=Q["[object Object]"]=Q["[object RegExp]"]=Q["[object Set]"]=Q["[object String]"]=Q["[object Symbol]"]=Q["[object Uint8Array]"]=Q["[object Uint8ClampedArray]"]=Q["[object Uint16Array]"]=Q["[object Uint32Array]"]=!0,Q["[object Error]"]=Q["[object Function]"]=Q["[object WeakMap]"]=!1,e.exports=function e(t,r,v,D,b,S){var k,x=1&r,F=2&r,M=4&r;if(v&&(k=b?v(t,D,b,S):v(t)),void 0!==k)return k;if(!y(t))return t;var N=E(t);if(N){if(k=p(t),!x)return c(t,k)}else{var R=f(t),K="[object Function]"==R||"[object GeneratorFunction]"==R;if(I(t))return a(t,x);if("[object Object]"==R||"[object Arguments]"==R||K&&!b){if(k=F||K?{}:C(t),!x)return F?l(t,A(k,t)):u(t,s(k,t))}else{if(!Q[R])return b?t:{};k=d(t,R,x)}}S||(S=new n);var L=S.get(t);if(L)return L;S.set(t,k),w(t)?t.forEach((function(n){k.add(e(n,r,v,n,t,S))})):m(t)&&t.forEach((function(n,i){k.set(i,e(n,r,v,i,t,S))}));var T=M?F?g:h:F?keysIn:B,P=N?void 0:T(t);return i(P||t,(function(n,i){P&&(n=t[i=n]),o(k,i,e(n,r,v,i,t,S))})),k}},15178:(e,t,r)=>{var n=r(46778),i=Object.create,o=function(){function e(){}return function(t){if(!n(t))return{};if(i)return i(t);e.prototype=t;var r=new e;return e.prototype=void 0,r}}();e.exports=o},50773:(e,t,r)=>{var n=r(62164),i=r(85115)(n);e.exports=i},3691:(e,t,r)=>{var n=r(50773);e.exports=function(e,t){var r=[];return n(e,(function(e,n,i){t(e,n,i)&&r.push(e)})),r}},72151:e=>{e.exports=function(e,t,r,n){for(var i=e.length,o=r+(n?1:-1);n?o--:++o{var n=r(40945),i=r(958);e.exports=function e(t,r,o,s,A){var a=-1,c=t.length;for(o||(o=i),A||(A=[]);++a0&&o(u)?r>1?e(u,r-1,o,s,A):n(A,u):s||(A[A.length]=u)}return A}},31689:(e,t,r)=>{var n=r(59907)();e.exports=n},62164:(e,t,r)=>{var n=r(31689),i=r(42185);e.exports=function(e,t){return e&&n(e,t,i)}},84173:(e,t,r)=>{var n=r(56725),i=r(49874);e.exports=function(e,t){for(var r=0,o=(t=n(t,e)).length;null!=e&&r{var n=r(40945),i=r(82664);e.exports=function(e,t,r){var o=t(e);return i(e)?o:n(o,r(e))}},52502:(e,t,r)=>{var n=r(69976),i=r(2854),o=r(87427),s=n?n.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":s&&s in Object(e)?i(e):o(e)}},95325:e=>{var t=Object.prototype.hasOwnProperty;e.exports=function(e,r){return null!=e&&t.call(e,r)}},3881:e=>{e.exports=function(e,t){return null!=e&&t in Object(e)}},37872:(e,t,r)=>{var n=r(72151),i=r(14564),o=r(95145);e.exports=function(e,t,r){return t==t?o(e,t,r):n(e,i,r)}},76357:(e,t,r)=>{var n=r(52502),i=r(38496);e.exports=function(e){return i(e)&&"[object Arguments]"==n(e)}},74195:(e,t,r)=>{var n=r(48957),i=r(38496);e.exports=function e(t,r,o,s,A){return t===r||(null==t||null==r||!i(t)&&!i(r)?t!=t&&r!=r:n(t,r,o,s,e,A))}},48957:(e,t,r)=>{var n=r(22851),i=r(75500),o=r(28475),s=r(50245),A=r(79435),a=r(82664),c=r(10667),u=r(32565),l="[object Object]",h=Object.prototype.hasOwnProperty;e.exports=function(e,t,r,g,f,p){var d=a(e),C=a(t),E=d?"[object Array]":A(e),I=C?"[object Array]":A(t),m=(E="[object Arguments]"==E?l:E)==l,y=(I="[object Arguments]"==I?l:I)==l,w=E==I;if(w&&c(e)){if(!c(t))return!1;d=!0,m=!1}if(w&&!m)return p||(p=new n),d||u(e)?i(e,t,r,g,f,p):o(e,t,E,r,g,f,p);if(!(1&r)){var B=m&&h.call(e,"__wrapped__"),Q=y&&h.call(t,"__wrapped__");if(B||Q){var v=B?e.value():e,D=Q?t.value():t;return p||(p=new n),f(v,D,r,g,p)}}return!!w&&(p||(p=new n),s(e,t,r,g,f,p))}},55994:(e,t,r)=>{var n=r(79435),i=r(38496);e.exports=function(e){return i(e)&&"[object Map]"==n(e)}},66470:(e,t,r)=>{var n=r(22851),i=r(74195);e.exports=function(e,t,r,o){var s=r.length,A=s,a=!o;if(null==e)return!A;for(e=Object(e);s--;){var c=r[s];if(a&&c[2]?c[1]!==e[c[0]]:!(c[0]in e))return!1}for(;++s{e.exports=function(e){return e!=e}},91686:(e,t,r)=>{var n=r(92533),i=r(15061),o=r(46778),s=r(76384),A=/^\[object .+?Constructor\]$/,a=Function.prototype,c=Object.prototype,u=a.toString,l=c.hasOwnProperty,h=RegExp("^"+u.call(l).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=function(e){return!(!o(e)||i(e))&&(n(e)?h:A).test(s(e))}},28612:(e,t,r)=>{var n=r(79435),i=r(38496);e.exports=function(e){return i(e)&&"[object Set]"==n(e)}},98998:(e,t,r)=>{var n=r(52502),i=r(46369),o=r(38496),s={};s["[object Float32Array]"]=s["[object Float64Array]"]=s["[object Int8Array]"]=s["[object Int16Array]"]=s["[object Int32Array]"]=s["[object Uint8Array]"]=s["[object Uint8ClampedArray]"]=s["[object Uint16Array]"]=s["[object Uint32Array]"]=!0,s["[object Arguments]"]=s["[object Array]"]=s["[object ArrayBuffer]"]=s["[object Boolean]"]=s["[object DataView]"]=s["[object Date]"]=s["[object Error]"]=s["[object Function]"]=s["[object Map]"]=s["[object Number]"]=s["[object Object]"]=s["[object RegExp]"]=s["[object Set]"]=s["[object String]"]=s["[object WeakMap]"]=!1,e.exports=function(e){return o(e)&&i(e.length)&&!!s[n(e)]}},42208:(e,t,r)=>{var n=r(96962),i=r(90348),o=r(61977),s=r(82664),A=r(7430);e.exports=function(e){return"function"==typeof e?e:null==e?o:"object"==typeof e?s(e)?i(e[0],e[1]):n(e):A(e)}},50994:(e,t,r)=>{var n=r(89513),i=r(60657),o=Object.prototype.hasOwnProperty;e.exports=function(e){if(!n(e))return i(e);var t=[];for(var r in Object(e))o.call(e,r)&&"constructor"!=r&&t.push(r);return t}},8372:(e,t,r)=>{var n=r(46778),i=r(89513),o=r(95632),s=Object.prototype.hasOwnProperty;e.exports=function(e){if(!n(e))return o(e);var t=i(e),r=[];for(var A in e)("constructor"!=A||!t&&s.call(e,A))&&r.push(A);return r}},26309:(e,t,r)=>{var n=r(50773),i=r(41929);e.exports=function(e,t){var r=-1,o=i(e)?Array(e.length):[];return n(e,(function(e,n,i){o[++r]=t(e,n,i)})),o}},96962:(e,t,r)=>{var n=r(66470),i=r(98705),o=r(12757);e.exports=function(e){var t=i(e);return 1==t.length&&t[0][2]?o(t[0][0],t[0][1]):function(r){return r===e||n(r,e,t)}}},90348:(e,t,r)=>{var n=r(74195),i=r(44674),o=r(34878),s=r(70474),A=r(20925),a=r(12757),c=r(49874);e.exports=function(e,t){return s(e)&&A(t)?a(c(e),t):function(r){var s=i(r,e);return void 0===s&&s===t?o(r,e):n(t,s,3)}}},35400:e=>{e.exports=function(e){return function(t){return null==t?void 0:t[e]}}},43018:(e,t,r)=>{var n=r(84173);e.exports=function(e){return function(t){return n(t,e)}}},51587:e=>{e.exports=function(e){return function(t){return null==e?void 0:e[t]}}},30383:(e,t,r)=>{var n=r(61977),i=r(44322),o=r(3111);e.exports=function(e,t){return o(i(e,t,n),e+"")}},10624:(e,t,r)=>{var n=r(65759),i=r(56725),o=r(98041),s=r(46778),A=r(49874);e.exports=function(e,t,r,a){if(!s(e))return e;for(var c=-1,u=(t=i(t,e)).length,l=u-1,h=e;null!=h&&++c{var n=r(4967),i=r(65),o=r(61977),s=i?function(e,t){return i(e,"toString",{configurable:!0,enumerable:!1,value:n(t),writable:!0})}:o;e.exports=s},27708:e=>{e.exports=function(e,t,r){var n=-1,i=e.length;t<0&&(t=-t>i?0:i+t),(r=r>i?i:r)<0&&(r+=i),i=t>r?0:r-t>>>0,t>>>=0;for(var o=Array(i);++n{e.exports=function(e,t){for(var r,n=-1,i=e.length;++n{e.exports=function(e,t){for(var r=-1,n=Array(e);++r{var n=r(69976),i=r(60783),o=r(82664),s=r(65558),A=n?n.prototype:void 0,a=A?A.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(o(t))return i(t,e)+"";if(s(t))return a?a.call(t):"";var r=t+"";return"0"==r&&1/t==-1/0?"-0":r}},73635:e=>{e.exports=function(e){return function(t){return e(t)}}},42150:(e,t,r)=>{var n=r(46235),i=r(24066),o=r(36669),s=r(93022),A=r(17879),a=r(7442);e.exports=function(e,t,r){var c=-1,u=i,l=e.length,h=!0,g=[],f=g;if(r)h=!1,u=o;else if(l>=200){var p=t?null:A(e);if(p)return a(p);h=!1,u=s,f=new n}else f=t?[]:g;e:for(;++c{var n=r(56725),i=r(49845),o=r(37574),s=r(49874);e.exports=function(e,t){return t=n(t,e),null==(e=o(e,t))||delete e[s(i(t))]}},18290:(e,t,r)=>{var n=r(60783);e.exports=function(e,t){return n(t,(function(t){return e[t]}))}},93022:e=>{e.exports=function(e,t){return e.has(t)}},56725:(e,t,r)=>{var n=r(82664),i=r(70474),o=r(8689),s=r(33580);e.exports=function(e,t){return n(e)?e:i(e,t)?[e]:o(s(e))}},92568:(e,t,r)=>{var n=r(27708);e.exports=function(e,t,r){var i=e.length;return r=void 0===r?i:r,!t&&r>=i?e:n(e,t,r)}},76255:(e,t,r)=>{var n=r(2740);e.exports=function(e){var t=new e.constructor(e.byteLength);return new n(t).set(new n(e)),t}},64266:(e,t,r)=>{e=r.nmd(e);var n=r(76169),i=t&&!t.nodeType&&t,o=i&&e&&!e.nodeType&&e,s=o&&o.exports===i?n.Buffer:void 0,A=s?s.allocUnsafe:void 0;e.exports=function(e,t){if(t)return e.slice();var r=e.length,n=A?A(r):new e.constructor(r);return e.copy(n),n}},63749:(e,t,r)=>{var n=r(76255);e.exports=function(e,t){var r=t?n(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.byteLength)}},41705:e=>{var t=/\w*$/;e.exports=function(e){var r=new e.constructor(e.source,t.exec(e));return r.lastIndex=e.lastIndex,r}},25791:(e,t,r)=>{var n=r(69976),i=n?n.prototype:void 0,o=i?i.valueOf:void 0;e.exports=function(e){return o?Object(o.call(e)):{}}},58042:(e,t,r)=>{var n=r(76255);e.exports=function(e,t){var r=t?n(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.length)}},87229:e=>{e.exports=function(e,t){var r=-1,n=e.length;for(t||(t=Array(n));++r{var n=r(65759),i=r(91198);e.exports=function(e,t,r,o){var s=!r;r||(r={});for(var A=-1,a=t.length;++A{var n=r(75182),i=r(68727);e.exports=function(e,t){return n(e,i(e),t)}},60741:(e,t,r)=>{var n=r(75182),i=r(35368);e.exports=function(e,t){return n(e,i(e),t)}},14429:(e,t,r)=>{var n=r(76169)["__core-js_shared__"];e.exports=n},27913:(e,t,r)=>{var n=r(30383),i=r(33193);e.exports=function(e){return n((function(t,r){var n=-1,o=r.length,s=o>1?r[o-1]:void 0,A=o>2?r[2]:void 0;for(s=e.length>3&&"function"==typeof s?(o--,s):void 0,A&&i(r[0],r[1],A)&&(s=o<3?void 0:s,o=1),t=Object(t);++n{var n=r(41929);e.exports=function(e,t){return function(r,i){if(null==r)return r;if(!n(r))return e(r,i);for(var o=r.length,s=t?o:-1,A=Object(r);(t?s--:++s{e.exports=function(e){return function(t,r,n){for(var i=-1,o=Object(t),s=n(t),A=s.length;A--;){var a=s[e?A:++i];if(!1===r(o[a],a,o))break}return t}}},56989:(e,t,r)=>{var n=r(92568),i=r(93024),o=r(30475),s=r(33580);e.exports=function(e){return function(t){t=s(t);var r=i(t)?o(t):void 0,A=r?r[0]:t.charAt(0),a=r?n(r,1).join(""):t.slice(1);return A[e]()+a}}},30369:(e,t,r)=>{var n=r(66054),i=r(68968),o=r(97684),s=RegExp("['’]","g");e.exports=function(e){return function(t){return n(o(i(t).replace(s,"")),e,"")}}},80937:(e,t,r)=>{var n=r(42208),i=r(41929),o=r(42185);e.exports=function(e){return function(t,r,s){var A=Object(t);if(!i(t)){var a=n(r,3);t=o(t),r=function(e){return a(A[e],e,A)}}var c=e(t,r,s);return c>-1?A[a?t[c]:c]:void 0}}},17879:(e,t,r)=>{var n=r(43231),i=r(34791),o=r(7442),s=n&&1/o(new n([,-0]))[1]==1/0?function(e){return new n(e)}:i;e.exports=s},37306:(e,t,r)=>{var n=r(11672);e.exports=function(e){return n(e)?void 0:e}},69922:(e,t,r)=>{var n=r(51587)({À:"A",Ã:"A",Â:"A",Ã:"A",Ä:"A",Ã…:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",Ã¥:"a",Ç:"C",ç:"c",Ã:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",ÃŒ:"I",Ã:"I",ÃŽ:"I",Ã:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ã’:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ãœ:"U",ù:"u",ú:"u",û:"u",ü:"u",Ã:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ä€:"A",Ä‚:"A",Ä„:"A",Ä:"a",ă:"a",Ä…:"a",Ć:"C",Ĉ:"C",ÄŠ:"C",ÄŒ:"C",ć:"c",ĉ:"c",Ä‹:"c",Ä:"c",ÄŽ:"D",Ä:"D",Ä:"d",Ä‘:"d",Ä’:"E",Ä”:"E",Ä–:"E",Ę:"E",Äš:"E",Ä“:"e",Ä•:"e",Ä—:"e",Ä™:"e",Ä›:"e",Äœ:"G",Äž:"G",Ä :"G",Ä¢:"G",Ä:"g",ÄŸ:"g",Ä¡:"g",Ä£:"g",Ĥ:"H",Ħ:"H",Ä¥:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Ä®:"I",Ä°:"I",Ä©:"i",Ä«:"i",Ä­:"i",į:"i",ı:"i",Ä´:"J",ĵ:"j",Ķ:"K",Ä·:"k",ĸ:"k",Ĺ:"L",Ä»:"L",Ľ:"L",Ä¿:"L",Å:"L",ĺ:"l",ļ:"l",ľ:"l",Å€:"l",Å‚:"l",Ń:"N",Å…:"N",Ň:"N",ÅŠ:"N",Å„:"n",ņ:"n",ň:"n",Å‹:"n",ÅŒ:"O",ÅŽ:"O",Å:"O",Å:"o",Å:"o",Å‘:"o",Å”:"R",Å–:"R",Ř:"R",Å•:"r",Å—:"r",Å™:"r",Åš:"S",Åœ:"S",Åž:"S",Å :"S",Å›:"s",Å:"s",ÅŸ:"s",Å¡:"s",Å¢:"T",Ť:"T",Ŧ:"T",Å£:"t",Å¥:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Å®:"U",Å°:"U",Ų:"U",Å©:"u",Å«:"u",Å­:"u",ů:"u",ű:"u",ų:"u",Å´:"W",ŵ:"w",Ŷ:"Y",Å·:"y",Ÿ:"Y",Ź:"Z",Å»:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Å’:"Oe",Å“:"oe",ʼn:"'n",Å¿:"s"});e.exports=n},65:(e,t,r)=>{var n=r(99513),i=function(){try{var e=n(Object,"defineProperty");return e({},"",{}),e}catch(e){}}();e.exports=i},75500:(e,t,r)=>{var n=r(46235),i=r(17765),o=r(93022);e.exports=function(e,t,r,s,A,a){var c=1&r,u=e.length,l=t.length;if(u!=l&&!(c&&l>u))return!1;var h=a.get(e);if(h&&a.get(t))return h==t;var g=-1,f=!0,p=2&r?new n:void 0;for(a.set(e,t),a.set(t,e);++g{var n=r(69976),i=r(2740),o=r(71074),s=r(75500),A=r(7877),a=r(7442),c=n?n.prototype:void 0,u=c?c.valueOf:void 0;e.exports=function(e,t,r,n,c,l,h){switch(r){case"[object DataView]":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case"[object ArrayBuffer]":return!(e.byteLength!=t.byteLength||!l(new i(e),new i(t)));case"[object Boolean]":case"[object Date]":case"[object Number]":return o(+e,+t);case"[object Error]":return e.name==t.name&&e.message==t.message;case"[object RegExp]":case"[object String]":return e==t+"";case"[object Map]":var g=A;case"[object Set]":var f=1&n;if(g||(g=a),e.size!=t.size&&!f)return!1;var p=h.get(e);if(p)return p==t;n|=2,h.set(e,t);var d=s(g(e),g(t),n,c,l,h);return h.delete(e),d;case"[object Symbol]":if(u)return u.call(e)==u.call(t)}return!1}},50245:(e,t,r)=>{var n=r(60753),i=Object.prototype.hasOwnProperty;e.exports=function(e,t,r,o,s,A){var a=1&r,c=n(e),u=c.length;if(u!=n(t).length&&!a)return!1;for(var l=u;l--;){var h=c[l];if(!(a?h in t:i.call(t,h)))return!1}var g=A.get(e);if(g&&A.get(t))return g==t;var f=!0;A.set(e,t),A.set(t,e);for(var p=a;++l{var n=r(54690),i=r(44322),o=r(3111);e.exports=function(e){return o(i(e,void 0,n),e+"")}},68399:e=>{var t="object"==typeof global&&global&&global.Object===Object&&global;e.exports=t},60753:(e,t,r)=>{var n=r(40104),i=r(68727),o=r(42185);e.exports=function(e){return n(e,o,i)}},64420:(e,t,r)=>{var n=r(40104),i=r(35368),o=r(24887);e.exports=function(e){return n(e,o,i)}},59253:(e,t,r)=>{var n=r(69448);e.exports=function(e,t){var r=e.__data__;return n(t)?r["string"==typeof t?"string":"hash"]:r.map}},98705:(e,t,r)=>{var n=r(20925),i=r(42185);e.exports=function(e){for(var t=i(e),r=t.length;r--;){var o=t[r],s=e[o];t[r]=[o,s,n(s)]}return t}},99513:(e,t,r)=>{var n=r(91686),i=r(98054);e.exports=function(e,t){var r=i(e,t);return n(r)?r:void 0}},41181:(e,t,r)=>{var n=r(64309)(Object.getPrototypeOf,Object);e.exports=n},2854:(e,t,r)=>{var n=r(69976),i=Object.prototype,o=i.hasOwnProperty,s=i.toString,A=n?n.toStringTag:void 0;e.exports=function(e){var t=o.call(e,A),r=e[A];try{e[A]=void 0;var n=!0}catch(e){}var i=s.call(e);return n&&(t?e[A]=r:delete e[A]),i}},68727:(e,t,r)=>{var n=r(9073),i=r(62162),o=Object.prototype.propertyIsEnumerable,s=Object.getOwnPropertySymbols,A=s?function(e){return null==e?[]:(e=Object(e),n(s(e),(function(t){return o.call(e,t)})))}:i;e.exports=A},35368:(e,t,r)=>{var n=r(40945),i=r(41181),o=r(68727),s=r(62162),A=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)n(t,o(e)),e=i(e);return t}:s;e.exports=A},79435:(e,t,r)=>{var n=r(78962),i=r(63603),o=r(5825),s=r(43231),A=r(47063),a=r(52502),c=r(76384),u=c(n),l=c(i),h=c(o),g=c(s),f=c(A),p=a;(n&&"[object DataView]"!=p(new n(new ArrayBuffer(1)))||i&&"[object Map]"!=p(new i)||o&&"[object Promise]"!=p(o.resolve())||s&&"[object Set]"!=p(new s)||A&&"[object WeakMap]"!=p(new A))&&(p=function(e){var t=a(e),r="[object Object]"==t?e.constructor:void 0,n=r?c(r):"";if(n)switch(n){case u:return"[object DataView]";case l:return"[object Map]";case h:return"[object Promise]";case g:return"[object Set]";case f:return"[object WeakMap]"}return t}),e.exports=p},98054:e=>{e.exports=function(e,t){return null==e?void 0:e[t]}},71507:(e,t,r)=>{var n=r(56725),i=r(61771),o=r(82664),s=r(98041),A=r(46369),a=r(49874);e.exports=function(e,t,r){for(var c=-1,u=(t=n(t,e)).length,l=!1;++c{var t=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");e.exports=function(e){return t.test(e)}},60466:e=>{var t=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;e.exports=function(e){return t.test(e)}},31713:(e,t,r)=>{var n=r(52437);e.exports=function(){this.__data__=n?n(null):{},this.size=0}},86688:e=>{e.exports=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}},45937:(e,t,r)=>{var n=r(52437),i=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;if(n){var r=t[e];return"__lodash_hash_undefined__"===r?void 0:r}return i.call(t,e)?t[e]:void 0}},5017:(e,t,r)=>{var n=r(52437),i=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;return n?void 0!==t[e]:i.call(t,e)}},79457:(e,t,r)=>{var n=r(52437);e.exports=function(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=n&&void 0===t?"__lodash_hash_undefined__":t,this}},27908:e=>{var t=Object.prototype.hasOwnProperty;e.exports=function(e){var r=e.length,n=new e.constructor(r);return r&&"string"==typeof e[0]&&t.call(e,"index")&&(n.index=e.index,n.input=e.input),n}},37836:(e,t,r)=>{var n=r(76255),i=r(63749),o=r(41705),s=r(25791),A=r(58042);e.exports=function(e,t,r){var a=e.constructor;switch(t){case"[object ArrayBuffer]":return n(e);case"[object Boolean]":case"[object Date]":return new a(+e);case"[object DataView]":return i(e,r);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return A(e,r);case"[object Map]":return new a;case"[object Number]":case"[object String]":return new a(e);case"[object RegExp]":return o(e);case"[object Set]":return new a;case"[object Symbol]":return s(e)}}},88438:(e,t,r)=>{var n=r(15178),i=r(41181),o=r(89513);e.exports=function(e){return"function"!=typeof e.constructor||o(e)?{}:n(i(e))}},958:(e,t,r)=>{var n=r(69976),i=r(61771),o=r(82664),s=n?n.isConcatSpreadable:void 0;e.exports=function(e){return o(e)||i(e)||!!(s&&e&&e[s])}},98041:e=>{var t=/^(?:0|[1-9]\d*)$/;e.exports=function(e,r){var n=typeof e;return!!(r=null==r?9007199254740991:r)&&("number"==n||"symbol"!=n&&t.test(e))&&e>-1&&e%1==0&&e{var n=r(71074),i=r(41929),o=r(98041),s=r(46778);e.exports=function(e,t,r){if(!s(r))return!1;var A=typeof t;return!!("number"==A?i(r)&&o(t,r.length):"string"==A&&t in r)&&n(r[t],e)}},70474:(e,t,r)=>{var n=r(82664),i=r(65558),o=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,s=/^\w*$/;e.exports=function(e,t){if(n(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!i(e))||(s.test(e)||!o.test(e)||null!=t&&e in Object(t))}},69448:e=>{e.exports=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}},15061:(e,t,r)=>{var n,i=r(14429),o=(n=/[^.]+$/.exec(i&&i.keys&&i.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"";e.exports=function(e){return!!o&&o in e}},89513:e=>{var t=Object.prototype;e.exports=function(e){var r=e&&e.constructor;return e===("function"==typeof r&&r.prototype||t)}},20925:(e,t,r)=>{var n=r(46778);e.exports=function(e){return e==e&&!n(e)}},82262:e=>{e.exports=function(e){for(var t,r=[];!(t=e.next()).done;)r.push(t.value);return r}},14620:e=>{e.exports=function(){this.__data__=[],this.size=0}},73682:(e,t,r)=>{var n=r(39836),i=Array.prototype.splice;e.exports=function(e){var t=this.__data__,r=n(t,e);return!(r<0)&&(r==t.length-1?t.pop():i.call(t,r,1),--this.size,!0)}},43112:(e,t,r)=>{var n=r(39836);e.exports=function(e){var t=this.__data__,r=n(t,e);return r<0?void 0:t[r][1]}},90640:(e,t,r)=>{var n=r(39836);e.exports=function(e){return n(this.__data__,e)>-1}},9380:(e,t,r)=>{var n=r(39836);e.exports=function(e,t){var r=this.__data__,i=n(r,e);return i<0?(++this.size,r.push([e,t])):r[i][1]=t,this}},18209:(e,t,r)=>{var n=r(72574),i=r(29197),o=r(63603);e.exports=function(){this.size=0,this.__data__={hash:new n,map:new(o||i),string:new n}}},89706:(e,t,r)=>{var n=r(59253);e.exports=function(e){var t=n(this,e).delete(e);return this.size-=t?1:0,t}},43786:(e,t,r)=>{var n=r(59253);e.exports=function(e){return n(this,e).get(e)}},17926:(e,t,r)=>{var n=r(59253);e.exports=function(e){return n(this,e).has(e)}},87345:(e,t,r)=>{var n=r(59253);e.exports=function(e,t){var r=n(this,e),i=r.size;return r.set(e,t),this.size+=r.size==i?0:1,this}},7877:e=>{e.exports=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e,n){r[++t]=[n,e]})),r}},12757:e=>{e.exports=function(e,t){return function(r){return null!=r&&(r[e]===t&&(void 0!==t||e in Object(r)))}}},31948:(e,t,r)=>{var n=r(74499);e.exports=function(e){var t=n(e,(function(e){return 500===r.size&&r.clear(),e})),r=t.cache;return t}},52437:(e,t,r)=>{var n=r(99513)(Object,"create");e.exports=n},60657:(e,t,r)=>{var n=r(64309)(Object.keys,Object);e.exports=n},95632:e=>{e.exports=function(e){var t=[];if(null!=e)for(var r in Object(e))t.push(r);return t}},26391:(e,t,r)=>{e=r.nmd(e);var n=r(68399),i=t&&!t.nodeType&&t,o=i&&e&&!e.nodeType&&e,s=o&&o.exports===i&&n.process,A=function(){try{var e=o&&o.require&&o.require("util").types;return e||s&&s.binding&&s.binding("util")}catch(e){}}();e.exports=A},87427:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},64309:e=>{e.exports=function(e,t){return function(r){return e(t(r))}}},44322:(e,t,r)=>{var n=r(66636),i=Math.max;e.exports=function(e,t,r){return t=i(void 0===t?e.length-1:t,0),function(){for(var o=arguments,s=-1,A=i(o.length-t,0),a=Array(A);++s{var n=r(84173),i=r(27708);e.exports=function(e,t){return t.length<2?e:n(e,i(t,0,-1))}},76169:(e,t,r)=>{var n=r(68399),i="object"==typeof self&&self&&self.Object===Object&&self,o=n||i||Function("return this")();e.exports=o},74785:e=>{e.exports=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this}},87760:e=>{e.exports=function(e){return this.__data__.has(e)}},7442:e=>{e.exports=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e){r[++t]=e})),r}},3111:(e,t,r)=>{var n=r(4899),i=r(19908)(n);e.exports=i},19908:e=>{var t=Date.now;e.exports=function(e){var r=0,n=0;return function(){var i=t(),o=16-(i-n);if(n=i,o>0){if(++r>=800)return arguments[0]}else r=0;return e.apply(void 0,arguments)}}},35678:(e,t,r)=>{var n=r(29197);e.exports=function(){this.__data__=new n,this.size=0}},33336:e=>{e.exports=function(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r}},97163:e=>{e.exports=function(e){return this.__data__.get(e)}},43737:e=>{e.exports=function(e){return this.__data__.has(e)}},48548:(e,t,r)=>{var n=r(29197),i=r(63603),o=r(75009);e.exports=function(e,t){var r=this.__data__;if(r instanceof n){var s=r.__data__;if(!i||s.length<199)return s.push([e,t]),this.size=++r.size,this;r=this.__data__=new o(s)}return r.set(e,t),this.size=r.size,this}},95145:e=>{e.exports=function(e,t,r){for(var n=r-1,i=e.length;++n{var n=r(1051),i=r(93024),o=r(297);e.exports=function(e){return i(e)?o(e):n(e)}},8689:(e,t,r)=>{var n=r(31948),i=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,o=/\\(\\)?/g,s=n((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(i,(function(e,r,n,i){t.push(n?i.replace(o,"$1"):r||e)})),t}));e.exports=s},49874:(e,t,r)=>{var n=r(65558);e.exports=function(e){if("string"==typeof e||n(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}},76384:e=>{var t=Function.prototype.toString;e.exports=function(e){if(null!=e){try{return t.call(e)}catch(e){}try{return e+""}catch(e){}}return""}},297:e=>{var t="[\\ud800-\\udfff]",r="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",n="\\ud83c[\\udffb-\\udfff]",i="[^\\ud800-\\udfff]",o="(?:\\ud83c[\\udde6-\\uddff]){2}",s="[\\ud800-\\udbff][\\udc00-\\udfff]",A="(?:"+r+"|"+n+")"+"?",a="[\\ufe0e\\ufe0f]?"+A+("(?:\\u200d(?:"+[i,o,s].join("|")+")[\\ufe0e\\ufe0f]?"+A+")*"),c="(?:"+[i+r+"?",r,o,s,t].join("|")+")",u=RegExp(n+"(?="+n+")|"+c+a,"g");e.exports=function(e){return e.match(u)||[]}},89887:e=>{var t="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",r="["+t+"]",n="\\d+",i="[\\u2700-\\u27bf]",o="[a-z\\xdf-\\xf6\\xf8-\\xff]",s="[^\\ud800-\\udfff"+t+n+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",A="(?:\\ud83c[\\udde6-\\uddff]){2}",a="[\\ud800-\\udbff][\\udc00-\\udfff]",c="[A-Z\\xc0-\\xd6\\xd8-\\xde]",u="(?:"+o+"|"+s+")",l="(?:"+c+"|"+s+")",h="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",g="[\\ufe0e\\ufe0f]?"+h+("(?:\\u200d(?:"+["[^\\ud800-\\udfff]",A,a].join("|")+")[\\ufe0e\\ufe0f]?"+h+")*"),f="(?:"+[i,A,a].join("|")+")"+g,p=RegExp([c+"?"+o+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[r,c,"$"].join("|")+")",l+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[r,c+u,"$"].join("|")+")",c+"?"+u+"+(?:['’](?:d|ll|m|re|s|t|ve))?",c+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",n,f].join("|"),"g");e.exports=function(e){return e.match(p)||[]}},9682:(e,t,r)=>{var n=r(65759),i=r(75182),o=r(27913),s=r(41929),A=r(89513),a=r(42185),c=Object.prototype.hasOwnProperty,u=o((function(e,t){if(A(t)||s(t))i(t,a(t),e);else for(var r in t)c.call(t,r)&&n(e,r,t[r])}));e.exports=u},88863:(e,t,r)=>{var n=r(75182),i=r(27913),o=r(24887),s=i((function(e,t){n(t,o(t),e)}));e.exports=s},89170:(e,t,r)=>{var n=r(61814),i=r(30369)((function(e,t,r){return t=t.toLowerCase(),e+(r?n(t):t)}));e.exports=i},61814:(e,t,r)=>{var n=r(33580),i=r(72609);e.exports=function(e){return i(n(e).toLowerCase())}},22254:(e,t,r)=>{var n=r(41076);e.exports=function(e){return n(e,4)}},82558:(e,t,r)=>{var n=r(41076);e.exports=function(e){return n(e,5)}},26052:(e,t,r)=>{var n=r(41076);e.exports=function(e,t){return n(e,5,t="function"==typeof t?t:void 0)}},4967:e=>{e.exports=function(e){return function(){return e}}},68968:(e,t,r)=>{var n=r(69922),i=r(33580),o=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,s=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");e.exports=function(e){return(e=i(e))&&e.replace(o,n).replace(s,"")}},99906:(e,t,r)=>{var n=r(30383),i=r(71074),o=r(33193),s=r(24887),A=Object.prototype,a=A.hasOwnProperty,c=n((function(e,t){e=Object(e);var r=-1,n=t.length,c=n>2?t[2]:void 0;for(c&&o(t[0],t[1],c)&&(n=1);++r{e.exports=function(e,t){return e===t||e!=e&&t!=t}},94501:(e,t,r)=>{e.exports=r(88863)},59181:(e,t,r)=>{var n=r(9073),i=r(3691),o=r(42208),s=r(82664);e.exports=function(e,t){return(s(e)?n:i)(e,o(t,3))}},98347:(e,t,r)=>{var n=r(80937)(r(17506));e.exports=n},17506:(e,t,r)=>{var n=r(72151),i=r(42208),o=r(864),s=Math.max;e.exports=function(e,t,r){var A=null==e?0:e.length;if(!A)return-1;var a=null==r?0:o(r);return a<0&&(a=s(A+a,0)),n(e,i(t,3),a)}},54690:(e,t,r)=>{var n=r(93274);e.exports=function(e){return(null==e?0:e.length)?n(e,1):[]}},44674:(e,t,r)=>{var n=r(84173);e.exports=function(e,t,r){var i=null==e?void 0:n(e,t);return void 0===i?r:i}},15215:(e,t,r)=>{var n=r(95325),i=r(71507);e.exports=function(e,t){return null!=e&&i(e,t,n)}},34878:(e,t,r)=>{var n=r(3881),i=r(71507);e.exports=function(e,t){return null!=e&&i(e,t,n)}},61977:e=>{e.exports=function(e){return e}},61771:(e,t,r)=>{var n=r(76357),i=r(38496),o=Object.prototype,s=o.hasOwnProperty,A=o.propertyIsEnumerable,a=n(function(){return arguments}())?n:function(e){return i(e)&&s.call(e,"callee")&&!A.call(e,"callee")};e.exports=a},82664:e=>{var t=Array.isArray;e.exports=t},41929:(e,t,r)=>{var n=r(92533),i=r(46369);e.exports=function(e){return null!=e&&i(e.length)&&!n(e)}},66807:(e,t,r)=>{var n=r(52502),i=r(38496);e.exports=function(e){return!0===e||!1===e||i(e)&&"[object Boolean]"==n(e)}},10667:(e,t,r)=>{e=r.nmd(e);var n=r(76169),i=r(88988),o=t&&!t.nodeType&&t,s=o&&e&&!e.nodeType&&e,A=s&&s.exports===o?n.Buffer:void 0,a=(A?A.isBuffer:void 0)||i;e.exports=a},92533:(e,t,r)=>{var n=r(52502),i=r(46778);e.exports=function(e){if(!i(e))return!1;var t=n(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t}},46369:e=>{e.exports=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}},13349:(e,t,r)=>{var n=r(55994),i=r(73635),o=r(26391),s=o&&o.isMap,A=s?i(s):n;e.exports=A},71044:(e,t,r)=>{var n=r(52502),i=r(38496);e.exports=function(e){return"number"==typeof e||i(e)&&"[object Number]"==n(e)}},46778:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},38496:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},11672:(e,t,r)=>{var n=r(52502),i=r(41181),o=r(38496),s=Function.prototype,A=Object.prototype,a=s.toString,c=A.hasOwnProperty,u=a.call(Object);e.exports=function(e){if(!o(e)||"[object Object]"!=n(e))return!1;var t=i(e);if(null===t)return!0;var r=c.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&a.call(r)==u}},33931:(e,t,r)=>{var n=r(28612),i=r(73635),o=r(26391),s=o&&o.isSet,A=s?i(s):n;e.exports=A},221:(e,t,r)=>{var n=r(52502),i=r(82664),o=r(38496);e.exports=function(e){return"string"==typeof e||!i(e)&&o(e)&&"[object String]"==n(e)}},65558:(e,t,r)=>{var n=r(52502),i=r(38496);e.exports=function(e){return"symbol"==typeof e||i(e)&&"[object Symbol]"==n(e)}},32565:(e,t,r)=>{var n=r(98998),i=r(73635),o=r(26391),s=o&&o.isTypedArray,A=s?i(s):n;e.exports=A},42185:(e,t,r)=>{var n=r(11886),i=r(50994),o=r(41929);e.exports=function(e){return o(e)?n(e):i(e)}},24887:(e,t,r)=>{var n=r(11886),i=r(8372),o=r(41929);e.exports=function(e){return o(e)?n(e,!0):i(e)}},49845:e=>{e.exports=function(e){var t=null==e?0:e.length;return t?e[t-1]:void 0}},7564:function(e,t,r){var n; -/** - * @license - * Lodash - * Copyright OpenJS Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */e=r.nmd(e),function(){var i="Expected a function",o="__lodash_placeholder__",s=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],A="[object Arguments]",a="[object Array]",c="[object Boolean]",u="[object Date]",l="[object Error]",h="[object Function]",g="[object GeneratorFunction]",f="[object Map]",p="[object Number]",d="[object Object]",C="[object RegExp]",E="[object Set]",I="[object String]",m="[object Symbol]",y="[object WeakMap]",w="[object ArrayBuffer]",B="[object DataView]",Q="[object Float32Array]",v="[object Float64Array]",D="[object Int8Array]",b="[object Int16Array]",S="[object Int32Array]",k="[object Uint8Array]",x="[object Uint16Array]",F="[object Uint32Array]",M=/\b__p \+= '';/g,N=/\b(__p \+=) '' \+/g,R=/(__e\(.*?\)|\b__t\)) \+\n'';/g,K=/&(?:amp|lt|gt|quot|#39);/g,L=/[&<>"']/g,T=RegExp(K.source),P=RegExp(L.source),U=/<%-([\s\S]+?)%>/g,_=/<%([\s\S]+?)%>/g,O=/<%=([\s\S]+?)%>/g,j=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Y=/^\w*$/,G=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,J=/[\\^$.*+?()[\]{}|]/g,H=RegExp(J.source),q=/^\s+|\s+$/g,z=/^\s+/,W=/\s+$/,V=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,X=/\{\n\/\* \[wrapped with (.+)\] \*/,Z=/,? & /,$=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ee=/\\(\\)?/g,te=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,re=/\w*$/,ne=/^[-+]0x[0-9a-f]+$/i,ie=/^0b[01]+$/i,oe=/^\[object .+?Constructor\]$/,se=/^0o[0-7]+$/i,Ae=/^(?:0|[1-9]\d*)$/,ae=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ce=/($^)/,ue=/['\n\r\u2028\u2029\\]/g,le="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",he="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",ge="[\\ud800-\\udfff]",fe="["+he+"]",pe="["+le+"]",de="\\d+",Ce="[\\u2700-\\u27bf]",Ee="[a-z\\xdf-\\xf6\\xf8-\\xff]",Ie="[^\\ud800-\\udfff"+he+de+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",me="\\ud83c[\\udffb-\\udfff]",ye="[^\\ud800-\\udfff]",we="(?:\\ud83c[\\udde6-\\uddff]){2}",Be="[\\ud800-\\udbff][\\udc00-\\udfff]",Qe="[A-Z\\xc0-\\xd6\\xd8-\\xde]",ve="(?:"+Ee+"|"+Ie+")",De="(?:"+Qe+"|"+Ie+")",be="(?:"+pe+"|"+me+")"+"?",Se="[\\ufe0e\\ufe0f]?"+be+("(?:\\u200d(?:"+[ye,we,Be].join("|")+")[\\ufe0e\\ufe0f]?"+be+")*"),ke="(?:"+[Ce,we,Be].join("|")+")"+Se,xe="(?:"+[ye+pe+"?",pe,we,Be,ge].join("|")+")",Fe=RegExp("['’]","g"),Me=RegExp(pe,"g"),Ne=RegExp(me+"(?="+me+")|"+xe+Se,"g"),Re=RegExp([Qe+"?"+Ee+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[fe,Qe,"$"].join("|")+")",De+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[fe,Qe+ve,"$"].join("|")+")",Qe+"?"+ve+"+(?:['’](?:d|ll|m|re|s|t|ve))?",Qe+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",de,ke].join("|"),"g"),Ke=RegExp("[\\u200d\\ud800-\\udfff"+le+"\\ufe0e\\ufe0f]"),Le=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Te=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Pe=-1,Ue={};Ue[Q]=Ue[v]=Ue[D]=Ue[b]=Ue[S]=Ue[k]=Ue["[object Uint8ClampedArray]"]=Ue[x]=Ue[F]=!0,Ue[A]=Ue[a]=Ue[w]=Ue[c]=Ue[B]=Ue[u]=Ue[l]=Ue[h]=Ue[f]=Ue[p]=Ue[d]=Ue[C]=Ue[E]=Ue[I]=Ue[y]=!1;var _e={};_e[A]=_e[a]=_e[w]=_e[B]=_e[c]=_e[u]=_e[Q]=_e[v]=_e[D]=_e[b]=_e[S]=_e[f]=_e[p]=_e[d]=_e[C]=_e[E]=_e[I]=_e[m]=_e[k]=_e["[object Uint8ClampedArray]"]=_e[x]=_e[F]=!0,_e[l]=_e[h]=_e[y]=!1;var Oe={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},je=parseFloat,Ye=parseInt,Ge="object"==typeof global&&global&&global.Object===Object&&global,Je="object"==typeof self&&self&&self.Object===Object&&self,He=Ge||Je||Function("return this")(),qe=t&&!t.nodeType&&t,ze=qe&&e&&!e.nodeType&&e,We=ze&&ze.exports===qe,Ve=We&&Ge.process,Xe=function(){try{var e=ze&&ze.require&&ze.require("util").types;return e||Ve&&Ve.binding&&Ve.binding("util")}catch(e){}}(),Ze=Xe&&Xe.isArrayBuffer,$e=Xe&&Xe.isDate,et=Xe&&Xe.isMap,tt=Xe&&Xe.isRegExp,rt=Xe&&Xe.isSet,nt=Xe&&Xe.isTypedArray;function it(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)}function ot(e,t,r,n){for(var i=-1,o=null==e?0:e.length;++i-1}function lt(e,t,r){for(var n=-1,i=null==e?0:e.length;++n-1;);return r}function Nt(e,t){for(var r=e.length;r--&&mt(t,e[r],0)>-1;);return r}function Rt(e,t){for(var r=e.length,n=0;r--;)e[r]===t&&++n;return n}var Kt=vt({À:"A",Ã:"A",Â:"A",Ã:"A",Ä:"A",Ã…:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",Ã¥:"a",Ç:"C",ç:"c",Ã:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",ÃŒ:"I",Ã:"I",ÃŽ:"I",Ã:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ã’:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ãœ:"U",ù:"u",ú:"u",û:"u",ü:"u",Ã:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ä€:"A",Ä‚:"A",Ä„:"A",Ä:"a",ă:"a",Ä…:"a",Ć:"C",Ĉ:"C",ÄŠ:"C",ÄŒ:"C",ć:"c",ĉ:"c",Ä‹:"c",Ä:"c",ÄŽ:"D",Ä:"D",Ä:"d",Ä‘:"d",Ä’:"E",Ä”:"E",Ä–:"E",Ę:"E",Äš:"E",Ä“:"e",Ä•:"e",Ä—:"e",Ä™:"e",Ä›:"e",Äœ:"G",Äž:"G",Ä :"G",Ä¢:"G",Ä:"g",ÄŸ:"g",Ä¡:"g",Ä£:"g",Ĥ:"H",Ħ:"H",Ä¥:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Ä®:"I",Ä°:"I",Ä©:"i",Ä«:"i",Ä­:"i",į:"i",ı:"i",Ä´:"J",ĵ:"j",Ķ:"K",Ä·:"k",ĸ:"k",Ĺ:"L",Ä»:"L",Ľ:"L",Ä¿:"L",Å:"L",ĺ:"l",ļ:"l",ľ:"l",Å€:"l",Å‚:"l",Ń:"N",Å…:"N",Ň:"N",ÅŠ:"N",Å„:"n",ņ:"n",ň:"n",Å‹:"n",ÅŒ:"O",ÅŽ:"O",Å:"O",Å:"o",Å:"o",Å‘:"o",Å”:"R",Å–:"R",Ř:"R",Å•:"r",Å—:"r",Å™:"r",Åš:"S",Åœ:"S",Åž:"S",Å :"S",Å›:"s",Å:"s",ÅŸ:"s",Å¡:"s",Å¢:"T",Ť:"T",Ŧ:"T",Å£:"t",Å¥:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Å®:"U",Å°:"U",Ų:"U",Å©:"u",Å«:"u",Å­:"u",ů:"u",ű:"u",ų:"u",Å´:"W",ŵ:"w",Ŷ:"Y",Å·:"y",Ÿ:"Y",Ź:"Z",Å»:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Å’:"Oe",Å“:"oe",ʼn:"'n",Å¿:"s"}),Lt=vt({"&":"&","<":"<",">":">",'"':""","'":"'"});function Tt(e){return"\\"+Oe[e]}function Pt(e){return Ke.test(e)}function Ut(e){var t=-1,r=Array(e.size);return e.forEach((function(e,n){r[++t]=[n,e]})),r}function _t(e,t){return function(r){return e(t(r))}}function Ot(e,t){for(var r=-1,n=e.length,i=0,s=[];++r",""":'"',"'":"'"});var qt=function e(t){var r,n=(t=null==t?He:qt.defaults(He.Object(),t,qt.pick(He,Te))).Array,le=t.Date,he=t.Error,ge=t.Function,fe=t.Math,pe=t.Object,de=t.RegExp,Ce=t.String,Ee=t.TypeError,Ie=n.prototype,me=ge.prototype,ye=pe.prototype,we=t["__core-js_shared__"],Be=me.toString,Qe=ye.hasOwnProperty,ve=0,De=(r=/[^.]+$/.exec(we&&we.keys&&we.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"",be=ye.toString,Se=Be.call(pe),ke=He._,xe=de("^"+Be.call(Qe).replace(J,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ne=We?t.Buffer:void 0,Ke=t.Symbol,Oe=t.Uint8Array,Ge=Ne?Ne.allocUnsafe:void 0,Je=_t(pe.getPrototypeOf,pe),qe=pe.create,ze=ye.propertyIsEnumerable,Ve=Ie.splice,Xe=Ke?Ke.isConcatSpreadable:void 0,Ct=Ke?Ke.iterator:void 0,vt=Ke?Ke.toStringTag:void 0,zt=function(){try{var e=$i(pe,"defineProperty");return e({},"",{}),e}catch(e){}}(),Wt=t.clearTimeout!==He.clearTimeout&&t.clearTimeout,Vt=le&&le.now!==He.Date.now&&le.now,Xt=t.setTimeout!==He.setTimeout&&t.setTimeout,Zt=fe.ceil,$t=fe.floor,er=pe.getOwnPropertySymbols,tr=Ne?Ne.isBuffer:void 0,rr=t.isFinite,nr=Ie.join,ir=_t(pe.keys,pe),or=fe.max,sr=fe.min,Ar=le.now,ar=t.parseInt,cr=fe.random,ur=Ie.reverse,lr=$i(t,"DataView"),hr=$i(t,"Map"),gr=$i(t,"Promise"),fr=$i(t,"Set"),pr=$i(t,"WeakMap"),dr=$i(pe,"create"),Cr=pr&&new pr,Er={},Ir=bo(lr),mr=bo(hr),yr=bo(gr),wr=bo(fr),Br=bo(pr),Qr=Ke?Ke.prototype:void 0,vr=Qr?Qr.valueOf:void 0,Dr=Qr?Qr.toString:void 0;function br(e){if(Gs(e)&&!Ns(e)&&!(e instanceof Fr)){if(e instanceof xr)return e;if(Qe.call(e,"__wrapped__"))return So(e)}return new xr(e)}var Sr=function(){function e(){}return function(t){if(!Ys(t))return{};if(qe)return qe(t);e.prototype=t;var r=new e;return e.prototype=void 0,r}}();function kr(){}function xr(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Fr(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Mr(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t=t?e:t)),e}function Wr(e,t,r,n,i,o){var s,a=1&t,l=2&t,y=4&t;if(r&&(s=i?r(e,n,i,o):r(e)),void 0!==s)return s;if(!Ys(e))return e;var M=Ns(e);if(M){if(s=function(e){var t=e.length,r=new e.constructor(t);t&&"string"==typeof e[0]&&Qe.call(e,"index")&&(r.index=e.index,r.input=e.input);return r}(e),!a)return Ci(e,s)}else{var N=ro(e),R=N==h||N==g;if(Ts(e))return li(e,a);if(N==d||N==A||R&&!i){if(s=l||R?{}:io(e),!a)return l?function(e,t){return Ei(e,to(e),t)}(e,function(e,t){return e&&Ei(t,yA(t),e)}(s,e)):function(e,t){return Ei(e,eo(e),t)}(e,Jr(s,e))}else{if(!_e[N])return i?e:{};s=function(e,t,r){var n=e.constructor;switch(t){case w:return hi(e);case c:case u:return new n(+e);case B:return function(e,t){var r=t?hi(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.byteLength)}(e,r);case Q:case v:case D:case b:case S:case k:case"[object Uint8ClampedArray]":case x:case F:return gi(e,r);case f:return new n;case p:case I:return new n(e);case C:return function(e){var t=new e.constructor(e.source,re.exec(e));return t.lastIndex=e.lastIndex,t}(e);case E:return new n;case m:return i=e,vr?pe(vr.call(i)):{}}var i}(e,N,a)}}o||(o=new Lr);var K=o.get(e);if(K)return K;o.set(e,s),Ws(e)?e.forEach((function(n){s.add(Wr(n,t,r,n,e,o))})):Js(e)&&e.forEach((function(n,i){s.set(i,Wr(n,t,r,i,e,o))}));var L=M?void 0:(y?l?Hi:Ji:l?yA:mA)(e);return st(L||e,(function(n,i){L&&(n=e[i=n]),jr(s,i,Wr(n,t,r,i,e,o))})),s}function Vr(e,t,r){var n=r.length;if(null==e)return!n;for(e=pe(e);n--;){var i=r[n],o=t[i],s=e[i];if(void 0===s&&!(i in e)||!o(s))return!1}return!0}function Xr(e,t,r){if("function"!=typeof e)throw new Ee(i);return mo((function(){e.apply(void 0,r)}),t)}function Zr(e,t,r,n){var i=-1,o=ut,s=!0,A=e.length,a=[],c=t.length;if(!A)return a;r&&(t=ht(t,kt(r))),n?(o=lt,s=!1):t.length>=200&&(o=Ft,s=!1,t=new Kr(t));e:for(;++i-1},Nr.prototype.set=function(e,t){var r=this.__data__,n=Yr(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this},Rr.prototype.clear=function(){this.size=0,this.__data__={hash:new Mr,map:new(hr||Nr),string:new Mr}},Rr.prototype.delete=function(e){var t=Xi(this,e).delete(e);return this.size-=t?1:0,t},Rr.prototype.get=function(e){return Xi(this,e).get(e)},Rr.prototype.has=function(e){return Xi(this,e).has(e)},Rr.prototype.set=function(e,t){var r=Xi(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this},Kr.prototype.add=Kr.prototype.push=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},Kr.prototype.has=function(e){return this.__data__.has(e)},Lr.prototype.clear=function(){this.__data__=new Nr,this.size=0},Lr.prototype.delete=function(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r},Lr.prototype.get=function(e){return this.__data__.get(e)},Lr.prototype.has=function(e){return this.__data__.has(e)},Lr.prototype.set=function(e,t){var r=this.__data__;if(r instanceof Nr){var n=r.__data__;if(!hr||n.length<199)return n.push([e,t]),this.size=++r.size,this;r=this.__data__=new Rr(n)}return r.set(e,t),this.size=r.size,this};var $r=yi(an),en=yi(cn,!0);function tn(e,t){var r=!0;return $r(e,(function(e,n,i){return r=!!t(e,n,i)})),r}function rn(e,t,r){for(var n=-1,i=e.length;++n0&&r(A)?t>1?on(A,t-1,r,n,i):gt(i,A):n||(i[i.length]=A)}return i}var sn=wi(),An=wi(!0);function an(e,t){return e&&sn(e,t,mA)}function cn(e,t){return e&&An(e,t,mA)}function un(e,t){return ct(t,(function(t){return _s(e[t])}))}function ln(e,t){for(var r=0,n=(t=Ai(t,e)).length;null!=e&&rt}function pn(e,t){return null!=e&&Qe.call(e,t)}function dn(e,t){return null!=e&&t in pe(e)}function Cn(e,t,r){for(var i=r?lt:ut,o=e[0].length,s=e.length,A=s,a=n(s),c=1/0,u=[];A--;){var l=e[A];A&&t&&(l=ht(l,kt(t))),c=sr(l.length,c),a[A]=!r&&(t||o>=120&&l.length>=120)?new Kr(A&&l):void 0}l=e[0];var h=-1,g=a[0];e:for(;++h=A)return a;var c=r[n];return a*("desc"==c?-1:1)}}return e.index-t.index}(e,t,r)}))}function Nn(e,t,r){for(var n=-1,i=t.length,o={};++n-1;)A!==e&&Ve.call(A,a,1),Ve.call(e,a,1);return e}function Kn(e,t){for(var r=e?t.length:0,n=r-1;r--;){var i=t[r];if(r==n||i!==o){var o=i;so(i)?Ve.call(e,i,1):$n(e,i)}}return e}function Ln(e,t){return e+$t(cr()*(t-e+1))}function Tn(e,t){var r="";if(!e||t<1||t>9007199254740991)return r;do{t%2&&(r+=e),(t=$t(t/2))&&(e+=e)}while(t);return r}function Pn(e,t){return yo(fo(e,t,HA),e+"")}function Un(e){return Pr(kA(e))}function _n(e,t){var r=kA(e);return Qo(r,zr(t,0,r.length))}function On(e,t,r,n){if(!Ys(e))return e;for(var i=-1,o=(t=Ai(t,e)).length,s=o-1,A=e;null!=A&&++io?0:o+t),(r=r>o?o:r)<0&&(r+=o),o=t>r?0:r-t>>>0,t>>>=0;for(var s=n(o);++i>>1,s=e[o];null!==s&&!Xs(s)&&(r?s<=t:s=200){var c=t?null:Ti(e);if(c)return jt(c);s=!1,i=Ft,a=new Kr}else a=t?[]:A;e:for(;++n=n?e:Jn(e,t,r)}var ui=Wt||function(e){return He.clearTimeout(e)};function li(e,t){if(t)return e.slice();var r=e.length,n=Ge?Ge(r):new e.constructor(r);return e.copy(n),n}function hi(e){var t=new e.constructor(e.byteLength);return new Oe(t).set(new Oe(e)),t}function gi(e,t){var r=t?hi(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.length)}function fi(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=e==e,o=Xs(e),s=void 0!==t,A=null===t,a=t==t,c=Xs(t);if(!A&&!c&&!o&&e>t||o&&s&&a&&!A&&!c||n&&s&&a||!r&&a||!i)return 1;if(!n&&!o&&!c&&e1?r[i-1]:void 0,s=i>2?r[2]:void 0;for(o=e.length>3&&"function"==typeof o?(i--,o):void 0,s&&Ao(r[0],r[1],s)&&(o=i<3?void 0:o,i=1),t=pe(t);++n-1?i[o?t[s]:s]:void 0}}function bi(e){return Gi((function(t){var r=t.length,n=r,o=xr.prototype.thru;for(e&&t.reverse();n--;){var s=t[n];if("function"!=typeof s)throw new Ee(i);if(o&&!A&&"wrapper"==zi(s))var A=new xr([],!0)}for(n=A?n:r;++n1&&I.reverse(),l&&cA))return!1;var c=o.get(e);if(c&&o.get(t))return c==t;var u=-1,l=!0,h=2&r?new Kr:void 0;for(o.set(e,t),o.set(t,e);++u-1&&e%1==0&&e1?"& ":"")+t[n],t=t.join(r>2?", ":" "),e.replace(V,"{\n/* [wrapped with "+t+"] */\n")}(n,function(e,t){return st(s,(function(r){var n="_."+r[0];t&r[1]&&!ut(e,n)&&e.push(n)})),e.sort()}(function(e){var t=e.match(X);return t?t[1].split(Z):[]}(n),r)))}function Bo(e){var t=0,r=0;return function(){var n=Ar(),i=16-(n-r);if(r=n,i>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function Qo(e,t){var r=-1,n=e.length,i=n-1;for(t=void 0===t?n:t;++r1?e[t-1]:void 0;return r="function"==typeof r?(e.pop(),r):void 0,zo(e,r)}));function ts(e){var t=br(e);return t.__chain__=!0,t}function rs(e,t){return t(e)}var ns=Gi((function(e){var t=e.length,r=t?e[0]:0,n=this.__wrapped__,i=function(t){return qr(t,e)};return!(t>1||this.__actions__.length)&&n instanceof Fr&&so(r)?((n=n.slice(r,+r+(t?1:0))).__actions__.push({func:rs,args:[i],thisArg:void 0}),new xr(n,this.__chain__).thru((function(e){return t&&!e.length&&e.push(void 0),e}))):this.thru(i)}));var is=Ii((function(e,t,r){Qe.call(e,r)?++e[r]:Hr(e,r,1)}));var os=Di(Mo),ss=Di(No);function As(e,t){return(Ns(e)?st:$r)(e,Vi(t,3))}function as(e,t){return(Ns(e)?At:en)(e,Vi(t,3))}var cs=Ii((function(e,t,r){Qe.call(e,r)?e[r].push(t):Hr(e,r,[t])}));var us=Pn((function(e,t,r){var i=-1,o="function"==typeof t,s=Ks(e)?n(e.length):[];return $r(e,(function(e){s[++i]=o?it(t,e,r):En(e,t,r)})),s})),ls=Ii((function(e,t,r){Hr(e,r,t)}));function hs(e,t){return(Ns(e)?ht:bn)(e,Vi(t,3))}var gs=Ii((function(e,t,r){e[r?0:1].push(t)}),(function(){return[[],[]]}));var fs=Pn((function(e,t){if(null==e)return[];var r=t.length;return r>1&&Ao(e,t[0],t[1])?t=[]:r>2&&Ao(t[0],t[1],t[2])&&(t=[t[0]]),Mn(e,on(t,1),[])})),ps=Vt||function(){return He.Date.now()};function ds(e,t,r){return t=r?void 0:t,Ui(e,128,void 0,void 0,void 0,void 0,t=e&&null==t?e.length:t)}function Cs(e,t){var r;if("function"!=typeof t)throw new Ee(i);return e=nA(e),function(){return--e>0&&(r=t.apply(this,arguments)),e<=1&&(t=void 0),r}}var Es=Pn((function(e,t,r){var n=1;if(r.length){var i=Ot(r,Wi(Es));n|=32}return Ui(e,n,t,r,i)})),Is=Pn((function(e,t,r){var n=3;if(r.length){var i=Ot(r,Wi(Is));n|=32}return Ui(t,n,e,r,i)}));function ms(e,t,r){var n,o,s,A,a,c,u=0,l=!1,h=!1,g=!0;if("function"!=typeof e)throw new Ee(i);function f(t){var r=n,i=o;return n=o=void 0,u=t,A=e.apply(i,r)}function p(e){return u=e,a=mo(C,t),l?f(e):A}function d(e){var r=e-c;return void 0===c||r>=t||r<0||h&&e-u>=s}function C(){var e=ps();if(d(e))return E(e);a=mo(C,function(e){var r=t-(e-c);return h?sr(r,s-(e-u)):r}(e))}function E(e){return a=void 0,g&&n?f(e):(n=o=void 0,A)}function I(){var e=ps(),r=d(e);if(n=arguments,o=this,c=e,r){if(void 0===a)return p(c);if(h)return ui(a),a=mo(C,t),f(c)}return void 0===a&&(a=mo(C,t)),A}return t=oA(t)||0,Ys(r)&&(l=!!r.leading,s=(h="maxWait"in r)?or(oA(r.maxWait)||0,t):s,g="trailing"in r?!!r.trailing:g),I.cancel=function(){void 0!==a&&ui(a),u=0,n=c=o=a=void 0},I.flush=function(){return void 0===a?A:E(ps())},I}var ys=Pn((function(e,t){return Xr(e,1,t)})),ws=Pn((function(e,t,r){return Xr(e,oA(t)||0,r)}));function Bs(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new Ee(i);var r=function(){var n=arguments,i=t?t.apply(this,n):n[0],o=r.cache;if(o.has(i))return o.get(i);var s=e.apply(this,n);return r.cache=o.set(i,s)||o,s};return r.cache=new(Bs.Cache||Rr),r}function Qs(e){if("function"!=typeof e)throw new Ee(i);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}Bs.Cache=Rr;var vs=ai((function(e,t){var r=(t=1==t.length&&Ns(t[0])?ht(t[0],kt(Vi())):ht(on(t,1),kt(Vi()))).length;return Pn((function(n){for(var i=-1,o=sr(n.length,r);++i=t})),Ms=In(function(){return arguments}())?In:function(e){return Gs(e)&&Qe.call(e,"callee")&&!ze.call(e,"callee")},Ns=n.isArray,Rs=Ze?kt(Ze):function(e){return Gs(e)&&gn(e)==w};function Ks(e){return null!=e&&js(e.length)&&!_s(e)}function Ls(e){return Gs(e)&&Ks(e)}var Ts=tr||oa,Ps=$e?kt($e):function(e){return Gs(e)&&gn(e)==u};function Us(e){if(!Gs(e))return!1;var t=gn(e);return t==l||"[object DOMException]"==t||"string"==typeof e.message&&"string"==typeof e.name&&!qs(e)}function _s(e){if(!Ys(e))return!1;var t=gn(e);return t==h||t==g||"[object AsyncFunction]"==t||"[object Proxy]"==t}function Os(e){return"number"==typeof e&&e==nA(e)}function js(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}function Ys(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function Gs(e){return null!=e&&"object"==typeof e}var Js=et?kt(et):function(e){return Gs(e)&&ro(e)==f};function Hs(e){return"number"==typeof e||Gs(e)&&gn(e)==p}function qs(e){if(!Gs(e)||gn(e)!=d)return!1;var t=Je(e);if(null===t)return!0;var r=Qe.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&Be.call(r)==Se}var zs=tt?kt(tt):function(e){return Gs(e)&&gn(e)==C};var Ws=rt?kt(rt):function(e){return Gs(e)&&ro(e)==E};function Vs(e){return"string"==typeof e||!Ns(e)&&Gs(e)&&gn(e)==I}function Xs(e){return"symbol"==typeof e||Gs(e)&&gn(e)==m}var Zs=nt?kt(nt):function(e){return Gs(e)&&js(e.length)&&!!Ue[gn(e)]};var $s=Ri(Dn),eA=Ri((function(e,t){return e<=t}));function tA(e){if(!e)return[];if(Ks(e))return Vs(e)?Jt(e):Ci(e);if(Ct&&e[Ct])return function(e){for(var t,r=[];!(t=e.next()).done;)r.push(t.value);return r}(e[Ct]());var t=ro(e);return(t==f?Ut:t==E?jt:kA)(e)}function rA(e){return e?(e=oA(e))===1/0||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function nA(e){var t=rA(e),r=t%1;return t==t?r?t-r:t:0}function iA(e){return e?zr(nA(e),0,4294967295):0}function oA(e){if("number"==typeof e)return e;if(Xs(e))return NaN;if(Ys(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Ys(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(q,"");var r=ie.test(e);return r||se.test(e)?Ye(e.slice(2),r?2:8):ne.test(e)?NaN:+e}function sA(e){return Ei(e,yA(e))}function AA(e){return null==e?"":Xn(e)}var aA=mi((function(e,t){if(lo(t)||Ks(t))Ei(t,mA(t),e);else for(var r in t)Qe.call(t,r)&&jr(e,r,t[r])})),cA=mi((function(e,t){Ei(t,yA(t),e)})),uA=mi((function(e,t,r,n){Ei(t,yA(t),e,n)})),lA=mi((function(e,t,r,n){Ei(t,mA(t),e,n)})),hA=Gi(qr);var gA=Pn((function(e,t){e=pe(e);var r=-1,n=t.length,i=n>2?t[2]:void 0;for(i&&Ao(t[0],t[1],i)&&(n=1);++r1),t})),Ei(e,Hi(e),r),n&&(r=Wr(r,7,ji));for(var i=t.length;i--;)$n(r,t[i]);return r}));var vA=Gi((function(e,t){return null==e?{}:function(e,t){return Nn(e,t,(function(t,r){return dA(e,r)}))}(e,t)}));function DA(e,t){if(null==e)return{};var r=ht(Hi(e),(function(e){return[e]}));return t=Vi(t),Nn(e,r,(function(e,r){return t(e,r[0])}))}var bA=Pi(mA),SA=Pi(yA);function kA(e){return null==e?[]:xt(e,mA(e))}var xA=Qi((function(e,t,r){return t=t.toLowerCase(),e+(r?FA(t):t)}));function FA(e){return UA(AA(e).toLowerCase())}function MA(e){return(e=AA(e))&&e.replace(ae,Kt).replace(Me,"")}var NA=Qi((function(e,t,r){return e+(r?"-":"")+t.toLowerCase()})),RA=Qi((function(e,t,r){return e+(r?" ":"")+t.toLowerCase()})),KA=Bi("toLowerCase");var LA=Qi((function(e,t,r){return e+(r?"_":"")+t.toLowerCase()}));var TA=Qi((function(e,t,r){return e+(r?" ":"")+UA(t)}));var PA=Qi((function(e,t,r){return e+(r?" ":"")+t.toUpperCase()})),UA=Bi("toUpperCase");function _A(e,t,r){return e=AA(e),void 0===(t=r?void 0:t)?function(e){return Le.test(e)}(e)?function(e){return e.match(Re)||[]}(e):function(e){return e.match($)||[]}(e):e.match(t)||[]}var OA=Pn((function(e,t){try{return it(e,void 0,t)}catch(e){return Us(e)?e:new he(e)}})),jA=Gi((function(e,t){return st(t,(function(t){t=Do(t),Hr(e,t,Es(e[t],e))})),e}));function YA(e){return function(){return e}}var GA=bi(),JA=bi(!0);function HA(e){return e}function qA(e){return Bn("function"==typeof e?e:Wr(e,1))}var zA=Pn((function(e,t){return function(r){return En(r,e,t)}})),WA=Pn((function(e,t){return function(r){return En(e,r,t)}}));function VA(e,t,r){var n=mA(t),i=un(t,n);null!=r||Ys(t)&&(i.length||!n.length)||(r=t,t=e,e=this,i=un(t,mA(t)));var o=!(Ys(r)&&"chain"in r&&!r.chain),s=_s(e);return st(i,(function(r){var n=t[r];e[r]=n,s&&(e.prototype[r]=function(){var t=this.__chain__;if(o||t){var r=e(this.__wrapped__),i=r.__actions__=Ci(this.__actions__);return i.push({func:n,args:arguments,thisArg:e}),r.__chain__=t,r}return n.apply(e,gt([this.value()],arguments))})})),e}function XA(){}var ZA=Fi(ht),$A=Fi(at),ea=Fi(dt);function ta(e){return ao(e)?Qt(Do(e)):function(e){return function(t){return ln(t,e)}}(e)}var ra=Ni(),na=Ni(!0);function ia(){return[]}function oa(){return!1}var sa=xi((function(e,t){return e+t}),0),Aa=Li("ceil"),aa=xi((function(e,t){return e/t}),1),ca=Li("floor");var ua,la=xi((function(e,t){return e*t}),1),ha=Li("round"),ga=xi((function(e,t){return e-t}),0);return br.after=function(e,t){if("function"!=typeof t)throw new Ee(i);return e=nA(e),function(){if(--e<1)return t.apply(this,arguments)}},br.ary=ds,br.assign=aA,br.assignIn=cA,br.assignInWith=uA,br.assignWith=lA,br.at=hA,br.before=Cs,br.bind=Es,br.bindAll=jA,br.bindKey=Is,br.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return Ns(e)?e:[e]},br.chain=ts,br.chunk=function(e,t,r){t=(r?Ao(e,t,r):void 0===t)?1:or(nA(t),0);var i=null==e?0:e.length;if(!i||t<1)return[];for(var o=0,s=0,A=n(Zt(i/t));oi?0:i+r),(n=void 0===n||n>i?i:nA(n))<0&&(n+=i),n=r>n?0:iA(n);r>>0)?(e=AA(e))&&("string"==typeof t||null!=t&&!zs(t))&&!(t=Xn(t))&&Pt(e)?ci(Jt(e),0,r):e.split(t,r):[]},br.spread=function(e,t){if("function"!=typeof e)throw new Ee(i);return t=null==t?0:or(nA(t),0),Pn((function(r){var n=r[t],i=ci(r,0,t);return n&>(i,n),it(e,this,i)}))},br.tail=function(e){var t=null==e?0:e.length;return t?Jn(e,1,t):[]},br.take=function(e,t,r){return e&&e.length?Jn(e,0,(t=r||void 0===t?1:nA(t))<0?0:t):[]},br.takeRight=function(e,t,r){var n=null==e?0:e.length;return n?Jn(e,(t=n-(t=r||void 0===t?1:nA(t)))<0?0:t,n):[]},br.takeRightWhile=function(e,t){return e&&e.length?ti(e,Vi(t,3),!1,!0):[]},br.takeWhile=function(e,t){return e&&e.length?ti(e,Vi(t,3)):[]},br.tap=function(e,t){return t(e),e},br.throttle=function(e,t,r){var n=!0,o=!0;if("function"!=typeof e)throw new Ee(i);return Ys(r)&&(n="leading"in r?!!r.leading:n,o="trailing"in r?!!r.trailing:o),ms(e,t,{leading:n,maxWait:t,trailing:o})},br.thru=rs,br.toArray=tA,br.toPairs=bA,br.toPairsIn=SA,br.toPath=function(e){return Ns(e)?ht(e,Do):Xs(e)?[e]:Ci(vo(AA(e)))},br.toPlainObject=sA,br.transform=function(e,t,r){var n=Ns(e),i=n||Ts(e)||Zs(e);if(t=Vi(t,4),null==r){var o=e&&e.constructor;r=i?n?new o:[]:Ys(e)&&_s(o)?Sr(Je(e)):{}}return(i?st:an)(e,(function(e,n,i){return t(r,e,n,i)})),r},br.unary=function(e){return ds(e,1)},br.union=Go,br.unionBy=Jo,br.unionWith=Ho,br.uniq=function(e){return e&&e.length?Zn(e):[]},br.uniqBy=function(e,t){return e&&e.length?Zn(e,Vi(t,2)):[]},br.uniqWith=function(e,t){return t="function"==typeof t?t:void 0,e&&e.length?Zn(e,void 0,t):[]},br.unset=function(e,t){return null==e||$n(e,t)},br.unzip=qo,br.unzipWith=zo,br.update=function(e,t,r){return null==e?e:ei(e,t,si(r))},br.updateWith=function(e,t,r,n){return n="function"==typeof n?n:void 0,null==e?e:ei(e,t,si(r),n)},br.values=kA,br.valuesIn=function(e){return null==e?[]:xt(e,yA(e))},br.without=Wo,br.words=_A,br.wrap=function(e,t){return Ds(si(t),e)},br.xor=Vo,br.xorBy=Xo,br.xorWith=Zo,br.zip=$o,br.zipObject=function(e,t){return ii(e||[],t||[],jr)},br.zipObjectDeep=function(e,t){return ii(e||[],t||[],On)},br.zipWith=es,br.entries=bA,br.entriesIn=SA,br.extend=cA,br.extendWith=uA,VA(br,br),br.add=sa,br.attempt=OA,br.camelCase=xA,br.capitalize=FA,br.ceil=Aa,br.clamp=function(e,t,r){return void 0===r&&(r=t,t=void 0),void 0!==r&&(r=(r=oA(r))==r?r:0),void 0!==t&&(t=(t=oA(t))==t?t:0),zr(oA(e),t,r)},br.clone=function(e){return Wr(e,4)},br.cloneDeep=function(e){return Wr(e,5)},br.cloneDeepWith=function(e,t){return Wr(e,5,t="function"==typeof t?t:void 0)},br.cloneWith=function(e,t){return Wr(e,4,t="function"==typeof t?t:void 0)},br.conformsTo=function(e,t){return null==t||Vr(e,t,mA(t))},br.deburr=MA,br.defaultTo=function(e,t){return null==e||e!=e?t:e},br.divide=aa,br.endsWith=function(e,t,r){e=AA(e),t=Xn(t);var n=e.length,i=r=void 0===r?n:zr(nA(r),0,n);return(r-=t.length)>=0&&e.slice(r,i)==t},br.eq=ks,br.escape=function(e){return(e=AA(e))&&P.test(e)?e.replace(L,Lt):e},br.escapeRegExp=function(e){return(e=AA(e))&&H.test(e)?e.replace(J,"\\$&"):e},br.every=function(e,t,r){var n=Ns(e)?at:tn;return r&&Ao(e,t,r)&&(t=void 0),n(e,Vi(t,3))},br.find=os,br.findIndex=Mo,br.findKey=function(e,t){return Et(e,Vi(t,3),an)},br.findLast=ss,br.findLastIndex=No,br.findLastKey=function(e,t){return Et(e,Vi(t,3),cn)},br.floor=ca,br.forEach=As,br.forEachRight=as,br.forIn=function(e,t){return null==e?e:sn(e,Vi(t,3),yA)},br.forInRight=function(e,t){return null==e?e:An(e,Vi(t,3),yA)},br.forOwn=function(e,t){return e&&an(e,Vi(t,3))},br.forOwnRight=function(e,t){return e&&cn(e,Vi(t,3))},br.get=pA,br.gt=xs,br.gte=Fs,br.has=function(e,t){return null!=e&&no(e,t,pn)},br.hasIn=dA,br.head=Ko,br.identity=HA,br.includes=function(e,t,r,n){e=Ks(e)?e:kA(e),r=r&&!n?nA(r):0;var i=e.length;return r<0&&(r=or(i+r,0)),Vs(e)?r<=i&&e.indexOf(t,r)>-1:!!i&&mt(e,t,r)>-1},br.indexOf=function(e,t,r){var n=null==e?0:e.length;if(!n)return-1;var i=null==r?0:nA(r);return i<0&&(i=or(n+i,0)),mt(e,t,i)},br.inRange=function(e,t,r){return t=rA(t),void 0===r?(r=t,t=0):r=rA(r),function(e,t,r){return e>=sr(t,r)&&e=-9007199254740991&&e<=9007199254740991},br.isSet=Ws,br.isString=Vs,br.isSymbol=Xs,br.isTypedArray=Zs,br.isUndefined=function(e){return void 0===e},br.isWeakMap=function(e){return Gs(e)&&ro(e)==y},br.isWeakSet=function(e){return Gs(e)&&"[object WeakSet]"==gn(e)},br.join=function(e,t){return null==e?"":nr.call(e,t)},br.kebabCase=NA,br.last=Uo,br.lastIndexOf=function(e,t,r){var n=null==e?0:e.length;if(!n)return-1;var i=n;return void 0!==r&&(i=(i=nA(r))<0?or(n+i,0):sr(i,n-1)),t==t?function(e,t,r){for(var n=r+1;n--;)if(e[n]===t)return n;return n}(e,t,i):It(e,wt,i,!0)},br.lowerCase=RA,br.lowerFirst=KA,br.lt=$s,br.lte=eA,br.max=function(e){return e&&e.length?rn(e,HA,fn):void 0},br.maxBy=function(e,t){return e&&e.length?rn(e,Vi(t,2),fn):void 0},br.mean=function(e){return Bt(e,HA)},br.meanBy=function(e,t){return Bt(e,Vi(t,2))},br.min=function(e){return e&&e.length?rn(e,HA,Dn):void 0},br.minBy=function(e,t){return e&&e.length?rn(e,Vi(t,2),Dn):void 0},br.stubArray=ia,br.stubFalse=oa,br.stubObject=function(){return{}},br.stubString=function(){return""},br.stubTrue=function(){return!0},br.multiply=la,br.nth=function(e,t){return e&&e.length?Fn(e,nA(t)):void 0},br.noConflict=function(){return He._===this&&(He._=ke),this},br.noop=XA,br.now=ps,br.pad=function(e,t,r){e=AA(e);var n=(t=nA(t))?Gt(e):0;if(!t||n>=t)return e;var i=(t-n)/2;return Mi($t(i),r)+e+Mi(Zt(i),r)},br.padEnd=function(e,t,r){e=AA(e);var n=(t=nA(t))?Gt(e):0;return t&&nt){var n=e;e=t,t=n}if(r||e%1||t%1){var i=cr();return sr(e+i*(t-e+je("1e-"+((i+"").length-1))),t)}return Ln(e,t)},br.reduce=function(e,t,r){var n=Ns(e)?ft:Dt,i=arguments.length<3;return n(e,Vi(t,4),r,i,$r)},br.reduceRight=function(e,t,r){var n=Ns(e)?pt:Dt,i=arguments.length<3;return n(e,Vi(t,4),r,i,en)},br.repeat=function(e,t,r){return t=(r?Ao(e,t,r):void 0===t)?1:nA(t),Tn(AA(e),t)},br.replace=function(){var e=arguments,t=AA(e[0]);return e.length<3?t:t.replace(e[1],e[2])},br.result=function(e,t,r){var n=-1,i=(t=Ai(t,e)).length;for(i||(i=1,e=void 0);++n9007199254740991)return[];var r=4294967295,n=sr(e,4294967295);e-=4294967295;for(var i=St(n,t=Vi(t));++r=o)return e;var A=r-Gt(n);if(A<1)return n;var a=s?ci(s,0,A).join(""):e.slice(0,A);if(void 0===i)return a+n;if(s&&(A+=a.length-A),zs(i)){if(e.slice(A).search(i)){var c,u=a;for(i.global||(i=de(i.source,AA(re.exec(i))+"g")),i.lastIndex=0;c=i.exec(u);)var l=c.index;a=a.slice(0,void 0===l?A:l)}}else if(e.indexOf(Xn(i),A)!=A){var h=a.lastIndexOf(i);h>-1&&(a=a.slice(0,h))}return a+n},br.unescape=function(e){return(e=AA(e))&&T.test(e)?e.replace(K,Ht):e},br.uniqueId=function(e){var t=++ve;return AA(e)+t},br.upperCase=PA,br.upperFirst=UA,br.each=As,br.eachRight=as,br.first=Ko,VA(br,(ua={},an(br,(function(e,t){Qe.call(br.prototype,t)||(ua[t]=e)})),ua),{chain:!1}),br.VERSION="4.17.15",st(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){br[e].placeholder=br})),st(["drop","take"],(function(e,t){Fr.prototype[e]=function(r){r=void 0===r?1:or(nA(r),0);var n=this.__filtered__&&!t?new Fr(this):this.clone();return n.__filtered__?n.__takeCount__=sr(r,n.__takeCount__):n.__views__.push({size:sr(r,4294967295),type:e+(n.__dir__<0?"Right":"")}),n},Fr.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}})),st(["filter","map","takeWhile"],(function(e,t){var r=t+1,n=1==r||3==r;Fr.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:Vi(e,3),type:r}),t.__filtered__=t.__filtered__||n,t}})),st(["head","last"],(function(e,t){var r="take"+(t?"Right":"");Fr.prototype[e]=function(){return this[r](1).value()[0]}})),st(["initial","tail"],(function(e,t){var r="drop"+(t?"":"Right");Fr.prototype[e]=function(){return this.__filtered__?new Fr(this):this[r](1)}})),Fr.prototype.compact=function(){return this.filter(HA)},Fr.prototype.find=function(e){return this.filter(e).head()},Fr.prototype.findLast=function(e){return this.reverse().find(e)},Fr.prototype.invokeMap=Pn((function(e,t){return"function"==typeof e?new Fr(this):this.map((function(r){return En(r,e,t)}))})),Fr.prototype.reject=function(e){return this.filter(Qs(Vi(e)))},Fr.prototype.slice=function(e,t){e=nA(e);var r=this;return r.__filtered__&&(e>0||t<0)?new Fr(r):(e<0?r=r.takeRight(-e):e&&(r=r.drop(e)),void 0!==t&&(r=(t=nA(t))<0?r.dropRight(-t):r.take(t-e)),r)},Fr.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},Fr.prototype.toArray=function(){return this.take(4294967295)},an(Fr.prototype,(function(e,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),n=/^(?:head|last)$/.test(t),i=br[n?"take"+("last"==t?"Right":""):t],o=n||/^find/.test(t);i&&(br.prototype[t]=function(){var t=this.__wrapped__,s=n?[1]:arguments,A=t instanceof Fr,a=s[0],c=A||Ns(t),u=function(e){var t=i.apply(br,gt([e],s));return n&&l?t[0]:t};c&&r&&"function"==typeof a&&1!=a.length&&(A=c=!1);var l=this.__chain__,h=!!this.__actions__.length,g=o&&!l,f=A&&!h;if(!o&&c){t=f?t:new Fr(this);var p=e.apply(t,s);return p.__actions__.push({func:rs,args:[u],thisArg:void 0}),new xr(p,l)}return g&&f?e.apply(this,s):(p=this.thru(u),g?n?p.value()[0]:p.value():p)})})),st(["pop","push","shift","sort","splice","unshift"],(function(e){var t=Ie[e],r=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",n=/^(?:pop|shift)$/.test(e);br.prototype[e]=function(){var e=arguments;if(n&&!this.__chain__){var i=this.value();return t.apply(Ns(i)?i:[],e)}return this[r]((function(r){return t.apply(Ns(r)?r:[],e)}))}})),an(Fr.prototype,(function(e,t){var r=br[t];if(r){var n=r.name+"";Qe.call(Er,n)||(Er[n]=[]),Er[n].push({name:t,func:r})}})),Er[Si(void 0,2).name]=[{name:"wrapper",func:void 0}],Fr.prototype.clone=function(){var e=new Fr(this.__wrapped__);return e.__actions__=Ci(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=Ci(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=Ci(this.__views__),e},Fr.prototype.reverse=function(){if(this.__filtered__){var e=new Fr(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},Fr.prototype.value=function(){var e=this.__wrapped__.value(),t=this.__dir__,r=Ns(e),n=t<0,i=r?e.length:0,o=function(e,t,r){var n=-1,i=r.length;for(;++n=this.__values__.length;return{done:e,value:e?void 0:this.__values__[this.__index__++]}},br.prototype.plant=function(e){for(var t,r=this;r instanceof kr;){var n=So(r);n.__index__=0,n.__values__=void 0,t?i.__wrapped__=n:t=n;var i=n;r=r.__wrapped__}return i.__wrapped__=e,t},br.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof Fr){var t=e;return this.__actions__.length&&(t=new Fr(this)),(t=t.reverse()).__actions__.push({func:rs,args:[Yo],thisArg:void 0}),new xr(t,this.__chain__)}return this.thru(Yo)},br.prototype.toJSON=br.prototype.valueOf=br.prototype.value=function(){return ri(this.__wrapped__,this.__actions__)},br.prototype.first=br.prototype.head,Ct&&(br.prototype[Ct]=function(){return this}),br}();He._=qt,void 0===(n=function(){return qt}.call(t,r,t,e))||(e.exports=n)}.call(this)},27869:(e,t,r)=>{var n=r(60783),i=r(42208),o=r(26309),s=r(82664);e.exports=function(e,t){return(s(e)?n:o)(e,i(t,3))}},5253:(e,t,r)=>{var n=r(91198),i=r(62164),o=r(42208);e.exports=function(e,t){var r={};return t=o(t,3),i(e,(function(e,i,o){n(r,t(e,i,o),e)})),r}},89612:(e,t,r)=>{var n=r(91198),i=r(62164),o=r(42208);e.exports=function(e,t){var r={};return t=o(t,3),i(e,(function(e,i,o){n(r,i,t(e,i,o))})),r}},74499:(e,t,r)=>{var n=r(75009);function i(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var r=function(){var n=arguments,i=t?t.apply(this,n):n[0],o=r.cache;if(o.has(i))return o.get(i);var s=e.apply(this,n);return r.cache=o.set(i,s)||o,s};return r.cache=new(i.Cache||n),r}i.Cache=n,e.exports=i},34791:e=>{e.exports=function(){}},82740:(e,t,r)=>{var n=r(60783),i=r(41076),o=r(81622),s=r(56725),A=r(75182),a=r(37306),c=r(87298),u=r(64420),l=c((function(e,t){var r={};if(null==e)return r;var c=!1;t=n(t,(function(t){return t=s(t,e),c||(c=t.length>1),t})),A(e,u(e),r),c&&(r=i(r,7,a));for(var l=t.length;l--;)o(r,t[l]);return r}));e.exports=l},7430:(e,t,r)=>{var n=r(35400),i=r(43018),o=r(70474),s=r(49874);e.exports=function(e){return o(e)?n(s(e)):i(e)}},81534:(e,t,r)=>{var n=r(10624);e.exports=function(e,t,r){return null==e?e:n(e,t,r)}},36494:(e,t,r)=>{var n=r(30369)((function(e,t,r){return e+(r?"_":"")+t.toLowerCase()}));e.exports=n},62162:e=>{e.exports=function(){return[]}},88988:e=>{e.exports=function(){return!1}},2614:(e,t,r)=>{var n=r(96815),i=r(61977);e.exports=function(e){return e&&e.length?n(e,i):0}},78700:(e,t,r)=>{var n=r(69976),i=r(87229),o=r(79435),s=r(41929),A=r(221),a=r(82262),c=r(7877),u=r(7442),l=r(30475),h=r(24448),g=n?n.iterator:void 0;e.exports=function(e){if(!e)return[];if(s(e))return A(e)?l(e):i(e);if(g&&e[g])return a(e[g]());var t=o(e);return("[object Map]"==t?c:"[object Set]"==t?u:h)(e)}},67770:(e,t,r)=>{var n=r(90257);e.exports=function(e){return e?(e=n(e))===1/0||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},864:(e,t,r)=>{var n=r(67770);e.exports=function(e){var t=n(e),r=t%1;return t==t?r?t-r:t:0}},90257:(e,t,r)=>{var n=r(46778),i=r(65558),o=/^\s+|\s+$/g,s=/^[-+]0x[0-9a-f]+$/i,A=/^0b[01]+$/i,a=/^0o[0-7]+$/i,c=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(i(e))return NaN;if(n(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=n(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(o,"");var r=A.test(e);return r||a.test(e)?c(e.slice(2),r?2:8):s.test(e)?NaN:+e}},33580:(e,t,r)=>{var n=r(35);e.exports=function(e){return null==e?"":n(e)}},44852:(e,t,r)=>{var n=r(42150);e.exports=function(e){return e&&e.length?n(e):[]}},72609:(e,t,r)=>{var n=r(56989)("toUpperCase");e.exports=n},24448:(e,t,r)=>{var n=r(18290),i=r(42185);e.exports=function(e){return null==e?[]:n(e,i(e))}},97684:(e,t,r)=>{var n=r(11852),i=r(60466),o=r(33580),s=r(89887);e.exports=function(e,t,r){return e=o(e),void 0===(t=r?void 0:t)?i(e)?s(e):n(e):e.match(t)||[]}},58708:(e,t,r)=>{var n,i=r(73789),o=r(5817),s=function(e,t){return t.description=e,t},A=function(e,t,r){return s(e,(function(e){return e instanceof t[r]}))};(n={}).isNumTerm=s("a NumTerm (non-zero integer)",(function(e){return e===(0|e)&&0!==e})),n.isNameTerm=s("a NameTerm (string)",(function(e){return"string"==typeof e&&!/^-*[0-9]*$/.test(e)})),n.isTerm=s("a Term (appropriate string or number)",(function(e){return n.isNumTerm(e)||n.isNameTerm(e)})),n.isWholeNumber=s("a whole number (integer >= 0)",(function(e){return e===(0|e)&&e>=0})),n.isFormula=A("a Formula",n,"Formula"),n.isClause=A("a Clause",n,"Clause"),n.isBits=A("a Bits",n,"Bits"),n._isInteger=s("an integer",(function(e){return e===(0|e)})),n._isFunction=s("a Function",(function(e){return"function"==typeof e})),n._isString=s("a String",(function(e){return"string"==typeof e})),n._isArrayWhere=function(e){var t="an array";return e.description&&(t+=" of "+e.description),s(t,(function(t){if(o.isArray(t)){for(var r=0;r=t.length)throw new Error("Bad variable num: "+e);return t[e]},n.Solver.prototype.toNumTerm=function(e,t){if(p&&p(e,n.isTerm),"number"==typeof e)return e;for(var r=!1;"-"===e.charAt(0);)e=e.slice(1),r=!r;var i=this.getVarNum(e,t);return i?r?-i:i:0},n.Solver.prototype.toNameTerm=function(e){if(p&&p(e,n.isTerm),"string"==typeof e){for(;"--"===e.slice(0,2);)e=e.slice(2);return e}var t=!1;return e<0&&(t=!0,e=-e),e=this.getVarName(e),t&&(e="-"+e),e},n.Solver.prototype._addClause=function(e,t,r){p&&p(e,n.isClause);var i=null;t&&(i=t,p&&p(i,l(n.isNumTerm)));var o=!1,s=!1,A=e.terms.length;i&&(e=e.append(i));for(var a=0;a=this._num2name.length)throw new Error("Bad variable number: "+u);a0,u=null;if(t?s=t:(u=[],s=function(e,t){u.push({clauses:e,extraTerms:t})}),c&&!a.occursPositively){a.occursPositively=!0;var l=r._generateFormula(!0,A);s(l,[-i])}else if(!c&&!a.occursNegatively){a.occursNegatively=!0;l=r._generateFormula(!1,A);s(l,[i])}if(a.occursPositively&&a.occursNegatively&&delete r._ungeneratedFormulas[i],u&&u.length)for(var h=function(e){r._useFormulaTerm(e,s)};u.length;){var g=u.pop();r._addClauses(g.clauses,g.extraTerms,h)}}},n.Solver.prototype._addClauses=function(e,t,r){p&&p(e,l(n.isClause));var i=this;o.each(e,(function(e){i._addClause(e,t,r)}))},n.Solver.prototype.require=function(){this._requireForbidImpl(!0,o.flatten(arguments))},n.Solver.prototype.forbid=function(){this._requireForbidImpl(!1,o.flatten(arguments))},n.Solver.prototype._requireForbidImpl=function(e,t){var r=this;p&&p(t,l(h)),o.each(t,(function(t){if(t instanceof n.NotFormula)r._requireForbidImpl(!e,[t.operand]);else if(t instanceof n.Formula){var i=r._getFormulaInfo(t);if(null!==i.varNum){var o=e?1:-1;r._addClause(new n.Clause(o*i.varNum))}else r._addClauses(r._generateFormula(e,t));e?i.isRequired=!0:i.isForbidden=!0}else r._addClauses(r._generateFormula(e,t))}))},n.Solver.prototype._generateFormula=function(e,t,r){if(p&&p(t,h),t instanceof n.NotFormula)return this._generateFormula(!e,t.operand);if(t instanceof n.Formula){var i=this._getFormulaInfo(t);if(e&&i.isRequired||!e&&i.isForbidden)return[];if(e&&i.isForbidden||!e&&i.isRequired)return[new n.Clause];var s=t.generateClauses(e,r||this._termifier);return o.isArray(s)?s:[s]}var A=this.toNumTerm(t),a=e?1:-1;return A===a*n.NUM_TRUE||A===-a*n.NUM_FALSE?[]:A===a*n.NUM_FALSE||A===-a*n.NUM_TRUE?[new n.Clause]:[new n.Clause(a*A)]},n.Solver.prototype._clauseData=function(){var e=o.pluck(this.clauses,"terms");return this._T_used||e.splice(1,1),this._F_used||e.splice(0,1),e},n.Solver.prototype._clauseStrings=function(){var e=this,t=e._clauseData();return o.map(t,(function(t){return o.map(t,(function(t){var r=e.toNameTerm(t);if(/\s/.test(r)){var n="";"-"===r.charAt(0)&&(n="-",r=r.slice(1)),r=n+'"'+r+'"'}return r})).join(" v ")}))},n.Solver.prototype._getFormulaInfo=function(e,t){var r=e.guid();if(!this._formulaInfo[r]){if(t)return null;this._formulaInfo[r]=new d}return this._formulaInfo[r]},n.Solver.prototype._formulaToTerm=function(e){if(o.isArray(e))return p&&p(e,l(h)),o.map(e,o.bind(this._formulaToTerm,this));if(p&&p(e,h),e instanceof n.NotFormula)return n.not(this._formulaToTerm(e.operand));if(e instanceof n.Formula){var t=this._getFormulaInfo(e);if(t.isRequired)return n.NUM_TRUE;if(t.isForbidden)return n.NUM_FALSE;if(null===t.varNum){var r=e.type;this._nextFormulaNumByType[r]||(this._nextFormulaNumByType[r]=1);var i=this._nextFormulaNumByType[r]++;t.varName="$"+e.type+i,t.varNum=this.getVarNum(t.varName,!1,!0),this._ungeneratedFormulas[t.varNum]=e}return t.varNum}return this.toNumTerm(e)},n.or=function(){var e=o.flatten(arguments);return 0===e.length?n.FALSE:1===e.length?(p&&p(e[0],h),e[0]):new n.OrFormula(e)},n.OrFormula=function(e){p&&p(e,l(h)),this.operands=e},n._defineFormula(n.OrFormula,"or",{generateClauses:function(e,t){if(e)return t.clause(this.operands);var r=[];return o.each(this.operands,(function(e){r.push.apply(r,t.generate(!1,e))})),r}}),n.NotFormula=function(e){p&&p(e,h),this.operand=e},n._defineFormula(n.NotFormula,"not"),n.and=function(){var e=o.flatten(arguments);return 0===e.length?n.TRUE:1===e.length?(p&&p(e[0],h),e[0]):new n.AndFormula(e)},n.AndFormula=function(e){p&&p(e,l(h)),this.operands=e},n._defineFormula(n.AndFormula,"and",{generateClauses:function(e,t){if(e){var r=[];return o.each(this.operands,(function(e){r.push.apply(r,t.generate(!0,e))})),r}return t.clause(o.map(this.operands,n.not))}});var C=function(e,t){for(var r=[],n=0;n3)return t.generate(e,n.xor(o.map(C(this.operands,3),(function(e){return n.xor(e)}))));if(e){if(0===r.length)return t.clause();if(1===r.length)return t.clause(r[0]);if(2===r.length){var s=r[0],A=r[1];return[t.clause(s,A),t.clause(i(s),i(A))]}if(3===r.length){s=r[0],A=r[1];var a=r[2];return[t.clause(s,A,a),t.clause(s,i(A),i(a)),t.clause(i(s),A,i(a)),t.clause(i(s),i(A),a)]}}else{if(0===r.length)return[];if(1===r.length)return t.clause(i(r[0]));if(2===r.length){s=r[0],A=r[1];return[t.clause(s,i(A)),t.clause(i(s),A)]}if(3===r.length){s=r[0],A=r[1],a=r[2];return[t.clause(i(s),i(A),i(a)),t.clause(i(s),A,a),t.clause(s,i(A),a),t.clause(s,A,i(a))]}}}}),n.atMostOne=function(){var e=o.flatten(arguments);return e.length<=1?n.TRUE:new n.AtMostOneFormula(e)},n.AtMostOneFormula=function(e){p&&p(e,l(h)),this.operands=e},n._defineFormula(n.AtMostOneFormula,"atMostOne",{generateClauses:function(e,t){var r=this.operands,i=n.not;if(r.length<=1)return[];if(2===r.length)return t.generate(e,n.not(n.and(r)));if(e&&3===r.length){for(var s=[],A=0;A>>=1;return new n.Bits(t)},n.variableBits=function(e,t){p&&p(t,n.isWholeNumber);for(var r=[],i=0;ia.length;){var c=A.pop();s.push(r.clause(n.not(c)))}for(var u=o.map(a,(function(e,t){return t=0;l--)s.push(r.clause(u.slice(l+1),n.not(A[l]),a[l]));return i&&s.push.apply(s,r.generate(!0,n.or(u))),s};n._defineFormula(n.LessThanOrEqualFormula,"lte",{generateClauses:function(e,t){return e?E(this.bits1,this.bits2,t,!1):E(this.bits2,this.bits1,t,!0)}}),n.lessThan=function(e,t){return new n.LessThanFormula(e,t)},n.LessThanFormula=function(e,t){p&&p(e,n.isBits),p&&p(t,n.isBits),p&&f(arguments.length,2,"Bits comparison function"),this.bits1=e,this.bits2=t},n._defineFormula(n.LessThanFormula,"lt",{generateClauses:function(e,t){return e?E(this.bits1,this.bits2,t,!0):E(this.bits2,this.bits1,t,!1)}}),n.greaterThan=function(e,t){return n.lessThan(t,e)},n.greaterThanOrEqual=function(e,t){return n.lessThanOrEqual(t,e)},n.equalBits=function(e,t){return new n.EqualBitsFormula(e,t)},n.EqualBitsFormula=function(e,t){p&&p(e,n.isBits),p&&p(t,n.isBits),p&&f(arguments.length,2,"Logic.equalBits"),this.bits1=e,this.bits2=t},n._defineFormula(n.EqualBitsFormula,"equalBits",{generateClauses:function(e,t){for(var r=this.bits1.bits,i=this.bits2.bits,o=Math.max(r.length,i.length),s=[],A=0;A=r.length?s.push(n.not(i[A])):A>=i.length?s.push(n.not(r[A])):s.push(n.equiv(r[A],i[A]));return t.generate(e,n.and(s))}}),n.HalfAdderSum=function(e,t){p&&p(e,h),p&&p(t,h),p&&f(arguments.length,2,"Logic.HalfAdderSum"),this.a=e,this.b=t},n._defineFormula(n.HalfAdderSum,"hsum",{generateClauses:function(e,t){return t.generate(e,n.xor(this.a,this.b))}}),n.HalfAdderCarry=function(e,t){p&&p(e,h),p&&p(t,h),p&&f(arguments.length,2,"Logic.HalfAdderCarry"),this.a=e,this.b=t},n._defineFormula(n.HalfAdderCarry,"hcarry",{generateClauses:function(e,t){return t.generate(e,n.and(this.a,this.b))}}),n.FullAdderSum=function(e,t,r){p&&p(e,h),p&&p(t,h),p&&p(r,h),p&&f(arguments.length,3,"Logic.FullAdderSum"),this.a=e,this.b=t,this.c=r},n._defineFormula(n.FullAdderSum,"fsum",{generateClauses:function(e,t){return t.generate(e,n.xor(this.a,this.b,this.c))}}),n.FullAdderCarry=function(e,t,r){p&&p(e,h),p&&p(t,h),p&&p(r,h),p&&f(arguments.length,3,"Logic.FullAdderCarry"),this.a=e,this.b=t,this.c=r},n._defineFormula(n.FullAdderCarry,"fcarry",{generateClauses:function(e,t){return t.generate(!e,n.atMostOne(this.a,this.b,this.c))}});var I=function(e){p&&p(e,l(l(h)));for(var t=o.map(e,o.clone),r=0,i=[];r=e.length;)e.push([]);e[t].push(r)},y=function(e,t){if(p&&p(e,l(h)),"number"==typeof t)p&&p(t,n.isWholeNumber);else if(p&&p(t,l(n.isWholeNumber)),e.length!==t.length)throw new Error("Formula array and weight array must be same length; they are "+e.length+" and "+t.length)};n.weightedSum=function(e,t){if(y(e,t),0===e.length)return new n.Bits([]);"number"==typeof t&&(t=o.map(e,(function(){return t})));var r=[];return o.each(e,(function(e,n){for(var i=t[n],o=0;i;)1&i&&m(r,o,e),i>>>=1,o++})),new n.Bits(I(r))},n.sum=function(){var e=o.flatten(arguments);p&&p(e,l(g));var t=[];return o.each(e,(function(e){e instanceof n.Bits?o.each(e.bits,(function(e,r){m(t,r,e)})):m(t,0,e)})),new n.Bits(I(t))},n.Solver.prototype.solve=function(e){if(void 0!==e&&!(e>=1))throw new Error("_assumpVar must be a variable number");if(this._unsat)return null;for(;this._numClausesAddedToMiniSat0))throw new Error("Assertion failure: not a positive numeric term");this._useFormulaTerm(r);var i=this.solve(r);return this._minisat.retireVar(r),i},n.Assumption=function(e){p&&p(e,h),this.formula=e},n._defineFormula(n.Assumption,"assump",{generateClauses:function(e,t){return e?t.clause(this.formula):t.clause(n.not(this.formula))}}),n.Solution=function(e,t){var r=this;r._solver=e,r._assignment=t,r._ungeneratedFormulas=o.clone(e._ungeneratedFormulas),r._formulaValueCache={},r._termifier=new n.Termifier(r._solver),r._termifier.term=function(e){return r.evaluate(e)?n.NUM_TRUE:n.NUM_FALSE},r._ignoreUnknownVariables=!1},n.Solution.prototype.ignoreUnknownVariables=function(){this._ignoreUnknownVariables=!0},n.Solution.prototype.getMap=function(){for(var e=this._solver,t=this._assignment,r={},n=1;n=A.length){d=C;if(C>=1&&C0){u&&u("trying",0);var g=null;h=w(r,i),(g=e.solveAssuming(n.not(n.or(h))))&&(A=g,a=0)}if(s&&"bottom-up"===l)for(var f=1;f0;){u&&u("improving",a);var d,C=(s?n.lessThan:n.greaterThan)(c,n.constantBits(a));if(!(d=e.solveAssuming(C)))break;e.require(C),a=(A=d).getWeightedSum(r,i)}return s&&0===a?(h||(h=w(r,i)),e.forbid(h)):e.require(n.equalBits(c,n.constantBits(a))),u&&u("finished",a),A};n.Solver.prototype.minimizeWeightedSum=function(e,t,r,n){return B(this,e,t,r,n,!0)},n.Solver.prototype.maximizeWeightedSum=function(e,t,r,n){return B(this,e,t,r,n,!1)},e.exports=n},98312:module=>{var C_MINISAT;C_MINISAT=function(){var module={},require=function(){},process={argv:["node","minisat"],on:function(){},stdout:{write:function(e){console.log("MINISAT-out:",e.replace(/\n$/,""))}},stderr:{write:function(e){console.log("MINISAT-err:",e.replace(/\n$/,""))}}},window=0,Module;Module||(Module=(void 0!==Module?Module:null)||{});var moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_NODE="object"==typeof process&&"function"==typeof require,ENVIRONMENT_IS_WEB="object"==typeof window,ENVIRONMENT_IS_WORKER="function"==typeof importScripts,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){Module.print||(Module.print=function(e){process.stdout.write(e+"\n")}),Module.printErr||(Module.printErr=function(e){process.stderr.write(e+"\n")});var nodeFS=require("fs"),nodePath=require("path");Module.read=function(e,t){e=nodePath.normalize(e);var r=nodeFS.readFileSync(e);return r||e==nodePath.resolve(e)||(e=path.join(__dirname,"..","src",e),r=nodeFS.readFileSync(e)),r&&!t&&(r=r.toString()),r},Module.readBinary=function(e){return Module.read(e,!0)},Module.load=function(e){globalEval(read(e))},process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program",Module.arguments=process.argv.slice(2),void 0!==module&&(module.exports=Module),process.on("uncaughtException",(function(e){if(!(e instanceof ExitStatus))throw e}))}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),"undefined"!=typeof printErr&&(Module.printErr=printErr),"undefined"!=typeof read?Module.read=read:Module.read=function(){throw"no read() available (jsc?)"},Module.readBinary=function(e){if("function"==typeof readbuffer)return new Uint8Array(readbuffer(e));var t=read(e,"binary");return assert("object"==typeof t),t},"undefined"!=typeof scriptArgs?Module.arguments=scriptArgs:void 0!==arguments&&(Module.arguments=arguments),this.Module=Module;else{if(!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER)throw"Unknown runtime environment. Where are we?";if(Module.read=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},void 0!==arguments&&(Module.arguments=arguments),"undefined"!=typeof console)Module.print||(Module.print=function(e){console.log(e)}),Module.printErr||(Module.printErr=function(e){console.log(e)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&"undefined"!=typeof dump?function(e){dump(e)}:function(e){})}ENVIRONMENT_IS_WEB?window.Module=Module:Module.load=importScripts}function globalEval(e){eval.call(null,e)}for(var key in!Module.load&&Module.read&&(Module.load=function(e){globalEval(Module.read(e))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram="./this.program"),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[],moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);var Runtime={setTempRet0:function(e){tempRet0=e},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(e){STACKTOP=e},getNativeTypeSize:function(e){switch(e){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:if("*"===e[e.length-1])return Runtime.QUANTUM_SIZE;if("i"===e[0]){var t=parseInt(e.substr(1));return assert(t%8==0),t/8}return 0}},getNativeFieldSize:function(e){return Math.max(Runtime.getNativeTypeSize(e),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,getAlignSize:function(e,t,r){return r||"i64"!=e&&"double"!=e?e?Math.min(t||(e?Runtime.getNativeFieldSize(e):0),Runtime.QUANTUM_SIZE):Math.min(t,8):8},dynCall:function(e,t,r){return r&&r.length?(r.splice||(r=Array.prototype.slice.call(r)),r.splice(0,0,t),Module["dynCall_"+e].apply(null,r)):Module["dynCall_"+e].call(null,t)},functionPointers:[],addFunction:function(e){for(var t=0;t0))return"";var n,i=e[0],o=e[1],s=e[2],A=e[3];if(2==e.length)n=String.fromCharCode((31&i)<<6|63&o);else if(3==e.length)n=String.fromCharCode((15&i)<<12|(63&o)<<6|63&s);else{var a=(7&i)<<18|(63&o)<<12|(63&s)<<6|63&A;n=String.fromCharCode(55296+((a-65536)/1024|0),(a-65536)%1024+56320)}return e.length=0,n},this.processJSString=function(e){e=unescape(encodeURIComponent(e));for(var t=[],r=0;r=TOTAL_MEMORY&&enlargeMemory(),t},alignMemory:function(e,t){return e=Math.ceil(e/(t||16))*(t||16)},makeBigInt:function(e,t,r){return r?+(e>>>0)+4294967296*+(t>>>0):+(e>>>0)+4294967296*+(0|t)},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var __THREW__=0,ABORT=!1,EXITSTATUS=0,undef=0,tempValue,tempInt,tempBigInt,tempInt2,tempBigInt2,tempPair,tempBigIntI,tempBigIntR,tempBigIntS,tempBigIntP,tempBigIntD,tempDouble,tempFloat,tempI64,tempI64b,tempRet0,tempRet1,tempRet2,tempRet3,tempRet4,tempRet5,tempRet6,tempRet7,tempRet8,tempRet9;function assert(e,t){e||abort("Assertion failed: "+t)}var globalScope=this,cwrap,ccall;function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(e){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}function setValue(e,t,r,n){switch("*"===(r=r||"i8").charAt(r.length-1)&&(r="i32"),r){case"i1":case"i8":HEAP8[e>>0]=t;break;case"i16":HEAP16[e>>1]=t;break;case"i32":HEAP32[e>>2]=t;break;case"i64":tempI64=[t>>>0,(tempDouble=t,+Math_abs(tempDouble)>=1?tempDouble>0?(0|Math_min(+Math_floor(tempDouble/4294967296),4294967295))>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[e>>2]=tempI64[0],HEAP32[e+4>>2]=tempI64[1];break;case"float":HEAPF32[e>>2]=t;break;case"double":HEAPF64[e>>3]=t;break;default:abort("invalid type for setValue: "+r)}}function getValue(e,t,r){switch("*"===(t=t||"i8").charAt(t.length-1)&&(t="i32"),t){case"i1":case"i8":return HEAP8[e>>0];case"i16":return HEAP16[e>>1];case"i32":case"i64":return HEAP32[e>>2];case"float":return HEAPF32[e>>2];case"double":return HEAPF64[e>>3];default:abort("invalid type for setValue: "+t)}return null}!function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(e){var t=Runtime.stackAlloc(e.length);return writeArrayToMemory(e,t),t},stringToC:function(e){var t=0;return null!=e&&0!==e&&writeStringToMemory(e,t=Runtime.stackAlloc(1+(e.length<<2))),t}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(e,t,r,n){var i=getCFunc(e),o=[],s=0;if(n)for(var A=0;A>2]=0;for(a=s+o;n>0]=0;return s}if("i8"===A)return e.subarray||e.slice?HEAPU8.set(e,s):HEAPU8.set(new Uint8Array(e),s),s;for(var c,u,l,h=0;h>0])>=128)n=!0;else if(0==r&&!t)break;if(i++,t&&i==t)break}t||(t=i);var o="";if(!n){for(var s;t>0;)s=String.fromCharCode.apply(String,HEAPU8.subarray(e,e+Math.min(t,1024))),o=o?o+s:s,e+=1024,t-=1024;return o}var A=new Runtime.UTF8Processor;for(i=0;i>0],o+=A.processCChar(r);return o}function UTF16ToString(e){for(var t=0,r="";;){var n=HEAP16[e+2*t>>1];if(0==n)return r;++t,r+=String.fromCharCode(n)}}function stringToUTF16(e,t){for(var r=0;r>1]=n}HEAP16[t+2*e.length>>1]=0}function UTF32ToString(e){for(var t=0,r="";;){var n=HEAP32[e+4*t>>2];if(0==n)return r;if(++t,n>=65536){var i=n-65536;r+=String.fromCharCode(55296|i>>10,56320|1023&i)}else r+=String.fromCharCode(n)}}function stringToUTF32(e,t){for(var r=0,n=0;n=55296&&i<=57343)i=65536+((1023&i)<<10)|1023&e.charCodeAt(++n);HEAP32[t+4*r>>2]=i,++r}HEAP32[t+4*r>>2]=0}function demangle(e){var t=!!Module.___cxa_demangle;if(t)try{var r=_malloc(e.length);writeStringToMemory(e.substr(1),r);var n=_malloc(4),i=Module.___cxa_demangle(r,0,0,n);if(0===getValue(n,"i32")&&i)return Pointer_stringify(i)}catch(e){}finally{r&&_free(r),n&&_free(n),i&&_free(i)}var o=3,s={v:"void",b:"bool",c:"char",s:"short",i:"int",l:"long",f:"float",d:"double",w:"wchar_t",a:"signed char",h:"unsigned char",t:"unsigned short",j:"unsigned int",m:"unsigned long",x:"long long",y:"unsigned long long",z:"..."},A=[],a=!0;var c=e;try{if("Object._main"==e||"_main"==e)return"main()";if("number"==typeof e&&(e=Pointer_stringify(e)),"_"!==e[0])return e;if("_"!==e[1])return e;if("Z"!==e[2])return e;switch(e[3]){case"n":return"operator new()";case"d":return"operator delete()"}c=function t(r,n,i){n=n||1/0;var c,u="",l=[];if("N"===e[o]){if(c=function(){o++,"K"===e[o]&&o++;for(var t=[];"E"!==e[o];)if("S"!==e[o])if("C"!==e[o]){var r=parseInt(e.substr(o)),n=r.toString().length;if(!r||!n){o--;break}var i=e.substr(o+n,r);t.push(i),A.push(i),o+=n+r}else t.push(t[t.length-1]),o+=2;else{o++;var s=e.indexOf("_",o),a=e.substring(o,s)||0;t.push(A[a]||"?"),o=s+1}return o++,t}().join("::"),0===--n)return r?[c]:c}else if(("K"===e[o]||a&&"L"===e[o])&&o++,p=parseInt(e.substr(o))){var h=p.toString().length;c=e.substr(o+h,p),o+=h+p}if(a=!1,"I"===e[o]){o++;var g=t(!0);u+=t(!0,1,!0)[0]+" "+c+"<"+g.join(", ")+">"}else u=c;e:for(;o0;){var f=e[o++];if(f in s)l.push(s[f]);else switch(f){case"P":l.push(t(!0,1,!0)[0]+"*");break;case"R":l.push(t(!0,1,!0)[0]+"&");break;case"L":o++;var p=e.indexOf("E",o)-o;l.push(e.substr(o,p)),o+=p+2;break;case"A":p=parseInt(e.substr(o));if(o+=p.toString().length,"_"!==e[o])throw"?";o++,l.push(t(!0,1,!0)[0]+" ["+p+"]");break;case"E":break e;default:u+="?"+f;break e}}return i||1!==l.length||"void"!==l[0]||(l=[]),r?(u&&l.push(u+"?"),l):u+"("+l.join(", ")+")"}()}catch(e){c+="?"}return c.indexOf("?")>=0&&!t&&Runtime.warnOnce("warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),c}function demangleAll(e){return e.replace(/__Z[\w\d_]+/g,(function(e){var t=demangle(e);return e===t?e:e+" ["+t+"]"}))}function jsStackTrace(){var e=new Error;if(!e.stack){try{throw new Error(0)}catch(t){e=t}if(!e.stack)return"(no stack trace available)"}return e.stack.toString()}function stackTrace(){return demangleAll(jsStackTrace())}Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE,Module.allocate=allocate,Module.Pointer_stringify=Pointer_stringify,Module.UTF16ToString=UTF16ToString,Module.stringToUTF16=stringToUTF16,Module.UTF32ToString=UTF32ToString,Module.stringToUTF32=stringToUTF32,Module.stackTrace=stackTrace;var PAGE_SIZE=4096,HEAP,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function alignMemoryPage(e){return e+4095&-4096}var STATIC_BASE=0,STATICTOP=0,staticSealed=!1,STACK_BASE=0,STACKTOP=0,STACK_MAX=0,DYNAMIC_BASE=0,DYNAMICTOP=0;function enlargeMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.")}for(var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||67108864,FAST_MEMORY=Module.FAST_MEMORY||2097152,totalMemory=65536;totalMemory0;){var t=e.shift();if("function"!=typeof t){var r=t.func;"number"==typeof r?void 0===t.arg?Runtime.dynCall("v",r):Runtime.dynCall("vi",r,[t.arg]):r(void 0===t.arg?null:t.arg)}else t()}}HEAP8=new Int8Array(buffer),HEAP16=new Int16Array(buffer),HEAP32=new Int32Array(buffer),HEAPU8=new Uint8Array(buffer),HEAPU16=new Uint16Array(buffer),HEAPU32=new Uint32Array(buffer),HEAPF32=new Float32Array(buffer),HEAPF64=new Float64Array(buffer),HEAP32[0]=255,assert(255===HEAPU8[0]&&0===HEAPU8[3],"Typed arrays 2 must be run on a little-endian system"),Module.HEAP=HEAP,Module.buffer=buffer,Module.HEAP8=HEAP8,Module.HEAP16=HEAP16,Module.HEAP32=HEAP32,Module.HEAPU8=HEAPU8,Module.HEAPU16=HEAPU16,Module.HEAPU32=HEAPU32,Module.HEAPF32=HEAPF32,Module.HEAPF64=HEAPF64;var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for("function"==typeof Module.preRun&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__),runtimeExited=!0}function postRun(){if(Module.postRun)for("function"==typeof Module.postRun&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(e){__ATPRERUN__.unshift(e)}function addOnInit(e){__ATINIT__.unshift(e)}function addOnPreMain(e){__ATMAIN__.unshift(e)}function addOnExit(e){__ATEXIT__.unshift(e)}function addOnPostRun(e){__ATPOSTRUN__.unshift(e)}function intArrayFromString(e,t,r){var n=(new Runtime.UTF8Processor).processJSString(e);return r&&(n.length=r),t||n.push(0),n}function intArrayToString(e){for(var t=[],r=0;r255&&(n&=255),t.push(String.fromCharCode(n))}return t.join("")}function writeStringToMemory(e,t,r){for(var n=intArrayFromString(e,r),i=0;i>0]=o,i+=1}}function writeArrayToMemory(e,t){for(var r=0;r>0]=e[r]}function writeAsciiToMemory(e,t,r){for(var n=0;n>0]=e.charCodeAt(n);r||(HEAP8[t+e.length>>0]=0)}function unSign(e,t,r){return e>=0?e:t<=32?2*Math.abs(1<=n&&(t<=32||e>n)&&(e=-2*n+e),e}Module.addOnPreRun=Module.addOnPreRun=addOnPreRun,Module.addOnInit=Module.addOnInit=addOnInit,Module.addOnPreMain=Module.addOnPreMain=addOnPreMain,Module.addOnExit=Module.addOnExit=addOnExit,Module.addOnPostRun=Module.addOnPostRun=addOnPostRun,Module.intArrayFromString=intArrayFromString,Module.intArrayToString=intArrayToString,Module.writeStringToMemory=writeStringToMemory,Module.writeArrayToMemory=writeArrayToMemory,Module.writeAsciiToMemory=writeAsciiToMemory,Math.imul&&-5===Math.imul(4294967295,5)||(Math.imul=function(e,t){var r=65535&e,n=65535&t;return r*n+((e>>>16)*n+r*(t>>>16)<<16)|0}),Math.imul=Math.imul;var Math_abs=Math.abs,Math_cos=Math.cos,Math_sin=Math.sin,Math_tan=Math.tan,Math_acos=Math.acos,Math_asin=Math.asin,Math_atan=Math.atan,Math_atan2=Math.atan2,Math_exp=Math.exp,Math_log=Math.log,Math_sqrt=Math.sqrt,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_pow=Math.pow,Math_imul=Math.imul,Math_fround=Math.fround,Math_min=Math.min,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function addRunDependency(e){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}function removeRunDependency(e){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),0==runDependencies&&(null!==runDependencyWatcher&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var t=dependenciesFulfilled;dependenciesFulfilled=null,t()}}Module.addRunDependency=addRunDependency,Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var memoryInitializer=null;STATIC_BASE=8,STATICTOP=STATIC_BASE+5664,__ATINIT__.push({func:function(){__GLOBAL__I_a()}},{func:function(){__GLOBAL__I_a127()}}),allocate([78,55,77,105,110,105,115,97,116,50,48,79,117,116,79,102,77,101,109,111,114,121,69,120,99,101,112,116,105,111,110,69,0,0,0,0,0,0,0,0,88,18,0,0,8,0,0,0,78,55,77,105,110,105,115,97,116,54,79,112,116,105,111,110,69,0,0,0,0,0,0,0,88,18,0,0,56,0,0,0,10,32,32,32,32,32,32,32,32,37,115,10,0,0,0,0,0,0,0,0,80,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,78,55,77,105,110,105,115,97,116,49,48,66,111,111,108,79,112,116,105,111,110,69,0,0,128,18,0,0,176,0,0,0,80,0,0,0,0,0,0,0,32,32,45,37,115,44,32,45,110,111,45,37,115,0,0,0,40,100,101,102,97,117,108,116,58,32,37,115,41,10,0,0,111,110,0,0,0,0,0,0,111,102,102,0,0,0,0,0,110,111,45,0,0,0,0,0,0,0,0,0,64,1,0,0,1,0,0,0,4,0,0,0,2,0,0,0,2,0,0,0,78,55,77,105,110,105,115,97,116,57,73,110,116,79,112,116,105,111,110,69,0,0,0,0,128,18,0,0,40,1,0,0,80,0,0,0,0,0,0,0,32,32,45,37,45,49,50,115,32,61,32,37,45,56,115,32,91,0,0,0,0,0,0,0,105,109,105,110,0,0,0,0,37,52,100,0,0,0,0,0,32,46,46,32,0,0,0,0,105,109,97,120,0,0,0,0,93,32,40,100,101,102,97,117,108,116,58,32,37,100,41,10,0,0,0,0,0,0,0,0,69,82,82,79,82,33,32,118,97,108,117,101,32,60,37,115,62,32,105,115,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,111,112,116,105,111,110,32,34,37,115,34,46,10,0,0,0,0,0,0,0,0,69,82,82,79,82,33,32,118,97,108,117,101,32,60,37,115,62,32,105,115,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,111,112,116,105,111,110,32,34,37,115,34,46,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,97,114,45,100,101,99,97,121,0,0,0,0,0,0,0,84,104,101,32,118,97,114,105,97,98,108,101,32,97,99,116,105,118,105,116,121,32,100,101,99,97,121,32,102,97,99,116,111,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,108,97,45,100,101,99,97,121,0,0,0,0,0,0,0,84,104,101,32,99,108,97,117,115,101,32,97,99,116,105,118,105,116,121,32,100,101,99,97,121,32,102,97,99,116,111,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,110,100,45,102,114,101,113,0,0,0,0,0,0,0,0,84,104,101,32,102,114,101,113,117,101,110,99,121,32,119,105,116,104,32,119,104,105,99,104,32,116,104,101,32,100,101,99,105,115,105,111,110,32,104,101,117,114,105,115,116,105,99,32,116,114,105,101,115,32,116,111,32,99,104,111,111,115,101,32,97,32,114,97,110,100,111,109,32,118,97,114,105,97,98,108,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,110,100,45,115,101,101,100,0,0,0,0,0,0,0,0,85,115,101,100,32,98,121,32,116,104,101,32,114,97,110,100,111,109,32,118,97,114,105,97,98,108,101,32,115,101,108,101,99,116,105,111,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,99,109,105,110,45,109,111,100,101,0,0,0,0,0,0,67,111,110,116,114,111,108,115,32,99,111,110,102,108,105,99,116,32,99,108,97,117,115,101,32,109,105,110,105,109,105,122,97,116,105,111,110,32,40,48,61,110,111,110,101,44,32,49,61,98,97,115,105,99,44,32,50,61,100,101,101,112,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,104,97,115,101,45,115,97,118,105,110,103,0,0,0,0,67,111,110,116,114,111,108,115,32,116,104,101,32,108,101,118,101,108,32,111,102,32,112,104,97,115,101,32,115,97,118,105,110,103,32,40,48,61,110,111,110,101,44,32,49,61,108,105,109,105,116,101,100,44,32,50,61,102,117,108,108,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,110,100,45,105,110,105,116,0,0,0,0,0,0,0,0,82,97,110,100,111,109,105,122,101,32,116,104,101,32,105,110,105,116,105,97,108,32,97,99,116,105,118,105,116,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,117,98,121,0,0,0,0,85,115,101,32,116,104,101,32,76,117,98,121,32,114,101,115,116,97,114,116,32,115,101,113,117,101,110,99,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,102,105,114,115,116,0,0,84,104,101,32,98,97,115,101,32,114,101,115,116,97,114,116,32,105,110,116,101,114,118,97,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,105,110,99,0,0,0,0,82,101,115,116,97,114,116,32,105,110,116,101,114,118,97,108,32,105,110,99,114,101,97,115,101,32,102,97,99,116,111,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,99,45,102,114,97,99,0,84,104,101,32,102,114,97,99,116,105,111,110,32,111,102,32,119,97,115,116,101,100,32,109,101,109,111,114,121,32,97,108,108,111,119,101,100,32,98,101,102,111,114,101,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,116,114,105,103,103,101,114,101,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,105,110,45,108,101,97,114,110,116,115,0,0,0,0,0,77,105,110,105,109,117,109,32,108,101,97,114,110,116,32,99,108,97,117,115,101,32,108,105,109,105,116,0,0,0,0,0,0,0,0,0,192,7,0,0,5,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,124,32,37,57,100,32,124,32,37,55,100,32,37,56,100,32,37,56,100,32,124,32,37,56,100,32,37,56,100,32,37,54,46,48,102,32,124,32,37,54,46,51,102,32,37,37,32,124,10,0,0,0,0,0,0,0,124,32,32,71,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,58,32,32,32,37,49,50,100,32,98,121,116,101,115,32,61,62,32,37,49,50,100,32,98,121,116,101,115,32,32,32,32,32,32,32,32,32,32,32,32,32,124,10,0,0,0,0,0,0,0,0,78,55,77,105,110,105,115,97,116,54,83,111,108,118,101,114,69,0,0,0,0,0,0,0,88,18,0,0,168,7,0,0,60,98,111,111,108,62,0,0,10,32,32,32,32,32,32,32,32,37,115,10,0,0,0,0,60,105,110,116,51,50,62,0,69,82,82,79,82,33,32,118,97,108,117,101,32,60,37,115,62,32,105,115,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,111,112,116,105,111,110,32,34,37,115,34,46,10,0,0,0,0,0,0,0,0,69,82,82,79,82,33,32,118,97,108,117,101,32,60,37,115,62,32,105,115,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,111,112,116,105,111,110,32,34,37,115,34,46,10,0,0,0,0,0,0,0,0,67,79,82,69,0,0,0,0,60,100,111,117,98,108,101,62,0,0,0,0,0,0,0,0,0,0,0,0,168,8,0,0,1,0,0,0,8,0,0,0,3,0,0,0,3,0,0,0,78,55,77,105,110,105,115,97,116,49,50,68,111,117,98,108,101,79,112,116,105,111,110,69,0,0,0,0,0,0,0,0,128,18,0,0,136,8,0,0,80,0,0,0,0,0,0,0,32,32,45,37,45,49,50,115,32,61,32,37,45,56,115,32,37,99,37,52,46,50,103,32,46,46,32,37,52,46,50,103,37,99,32,40,100,101,102,97,117,108,116,58,32,37,103,41,10,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,91,32,83,101,97,114,99,104,32,83,116,97,116,105,115,116,105,99,115,32,93,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,124,32,67,111,110,102,108,105,99,116,115,32,124,32,32,32,32,32,32,32,32,32,32,79,82,73,71,73,78,65,76,32,32,32,32,32,32,32,32,32,124,32,32,32,32,32,32,32,32,32,32,76,69,65,82,78,84,32,32,32,32,32,32,32,32,32,32,124,32,80,114,111,103,114,101,115,115,32,124,0,124,32,32,32,32,32,32,32,32,32,32,32,124,32,32,32,32,86,97,114,115,32,32,67,108,97,117,115,101,115,32,76,105,116,101,114,97,108,115,32,124,32,32,32,32,76,105,109,105,116,32,32,67,108,97,117,115,101,115,32,76,105,116,47,67,108,32,124,32,32,32,32,32,32,32,32,32,32,124,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,115,121,109,109,0,0,0,83,104,114,105,110,107,32,99,108,97,117,115,101,115,32,98,121,32,97,115,121,109,109,101,116,114,105,99,32,98,114,97,110,99,104,105,110,103,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,99,104,101,99,107,0,0,67,104,101,99,107,32,105,102,32,97,32,99,108,97,117,115,101,32,105,115,32,97,108,114,101,97,100,121,32,105,109,112,108,105,101,100,46,32,40,99,111,115,116,108,121,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,108,105,109,0,0,0,0,80,101,114,102,111,114,109,32,118,97,114,105,97,98,108,101,32,101,108,105,109,105,110,97,116,105,111,110,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,114,111,119,0,0,0,0,65,108,108,111,119,32,97,32,118,97,114,105,97,98,108,101,32,101,108,105,109,105,110,97,116,105,111,110,32,115,116,101,112,32,116,111,32,103,114,111,119,32,98,121,32,97,32,110,117,109,98,101,114,32,111,102,32,99,108,97,117,115,101,115,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,108,45,108,105,109,0,0,86,97,114,105,97,98,108,101,115,32,97,114,101,32,110,111,116,32,101,108,105,109,105,110,97,116,101,100,32,105,102,32,105,116,32,112,114,111,100,117,99,101,115,32,97,32,114,101,115,111,108,118,101,110,116,32,119,105,116,104,32,97,32,108,101,110,103,116,104,32,97,98,111,118,101,32,116,104,105,115,32,108,105,109,105,116,46,32,45,49,32,109,101,97,110,115,32,110,111,32,108,105,109,105,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,117,98,45,108,105,109,0,68,111,32,110,111,116,32,99,104,101,99,107,32,105,102,32,115,117,98,115,117,109,112,116,105,111,110,32,97,103,97,105,110,115,116,32,97,32,99,108,97,117,115,101,32,108,97,114,103,101,114,32,116,104,97,110,32,116,104,105,115,46,32,45,49,32,109,101,97,110,115,32,110,111,32,108,105,109,105,116,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,105,109,112,45,103,99,45,102,114,97,99,0,0,0,0,84,104,101,32,102,114,97,99,116,105,111,110,32,111,102,32,119,97,115,116,101,100,32,109,101,109,111,114,121,32,97,108,108,111,119,101,100,32,98,101,102,111,114,101,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,116,114,105,103,103,101,114,101,100,32,100,117,114,105,110,103,32,115,105,109,112,108,105,102,105,99,97,116,105,111,110,46,0,0,0,0,0,0,0,120,14,0,0,9,0,0,0,10,0,0,0,11,0,0,0,0,0,0,0,115,117,98,115,117,109,112,116,105,111,110,32,108,101,102,116,58,32,37,49,48,100,32,40,37,49,48,100,32,115,117,98,115,117,109,101,100,44,32,37,49,48,100,32,100,101,108,101,116,101,100,32,108,105,116,101,114,97,108,115,41,13,0,0,101,108,105,109,105,110,97,116,105,111,110,32,108,101,102,116,58,32,37,49,48,100,13,0,124,32,32,69,108,105,109,105,110,97,116,101,100,32,99,108,97,117,115,101,115,58,32,32,32,32,32,37,49,48,46,50,102,32,77,98,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,124,10,0,0,0,0,124,32,32,71,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,58,32,32,32,37,49,50,100,32,98,121,116,101,115,32,61,62,32,37,49,50,100,32,98,121,116,101,115,32,32,32,32,32,32,32,32,32,32,32,32,32,124,10,0,0,0,0,0,0,0,0,78,55,77,105,110,105,115,97,116,49,48,83,105,109,112,83,111,108,118,101,114,69,0,0,128,18,0,0,96,14,0,0,192,7,0,0,0,0,0,0,60,100,111,117,98,108,101,62,0,0,0,0,0,0,0,0,60,105,110,116,51,50,62,0,83,73,77,80,0,0,0,0,60,98,111,111,108,62,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,79,33,0,0,0,0,0,2,0,0,0,0,0,0,0,48,15,0,0,0,0,0,0,117,110,99,97,117,103,104,116,0,0,0,0,0,0,0,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,58,32,37,115,0,0,0,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,0,0,0,0,0,0,0,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,102,111,114,101,105,103,110,32,101,120,99,101,112,116,105,111,110,0,0,0,116,101,114,109,105,110,97,116,105,110,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,116,104,114,101,97,100,95,111,110,99,101,32,102,97,105,108,117,114,101,32,105,110,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,95,102,97,115,116,40,41,0,0,0,0,0,0,0,0,99,97,110,110,111,116,32,99,114,101,97,116,101,32,112,116,104,114,101,97,100,32,107,101,121,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,0,0,0,0,0,0,99,97,110,110,111,116,32,122,101,114,111,32,111,117,116,32,116,104,114,101,97,100,32,118,97,108,117,101,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,0,0,0,0,0,0,0,200,16,0,0,12,0,0,0,13,0,0,0,1,0,0,0,0,0,0,0,115,116,100,58,58,98,97,100,95,97,108,108,111,99,0,0,83,116,57,98,97,100,95,97,108,108,111,99,0,0,0,0,128,18,0,0,184,16,0,0,80,17,0,0,0,0,0,0,116,101,114,109,105,110,97,116,101,95,104,97,110,100,108,101,114,32,117,110,101,120,112,101,99,116,101,100,108,121,32,114,101,116,117,114,110,101,100,0,116,101,114,109,105,110,97,116,101,95,104,97,110,100,108,101,114,32,117,110,101,120,112,101,99,116,101,100,108,121,32,116,104,114,101,119,32,97,110,32,101,120,99,101,112,116,105,111,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,116,57,101,120,99,101,112,116,105,111,110,0,0,0,0,88,18,0,0,64,17,0,0,83,116,57,116,121,112,101,95,105,110,102,111,0,0,0,0,88,18,0,0,88,17,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,0,128,18,0,0,112,17,0,0,104,17,0,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,128,18,0,0,168,17,0,0,152,17,0,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,57,95,95,112,111,105,110,116,101,114,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,112,98,97,115,101,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,128,18,0,0,8,18,0,0,152,17,0,0,0,0,0,0,128,18,0,0,224,17,0,0,48,18,0,0,0,0,0,0,0,0,0,0,208,17,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,200,18,0,0,14,0,0,0,18,0,0,0,16,0,0,0,17,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,128,18,0,0,160,18,0,0,208,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,1,2,3,4,5,6,7,8,9,255,255,255,255,255,255,255,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,255,255,255,255,255,255,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,1,2,4,7,3,6,5,0,0,0,0,0,0,0,0,105,110,102,105,110,105,116,121,0,0,0,0,0,0,0,0,110,97,110,0,0,0,0,0,95,112,137,0,255,9,47,15,10,0,0,0,100,0,0,0,232,3,0,0,16,39,0,0,160,134,1,0,64,66,15,0,128,150,152,0,0,225,245,5],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=Runtime.alignMemory(allocate(12,"i8",ALLOC_STATIC),8);function copyTempFloat(e){HEAP8[tempDoublePtr]=HEAP8[e],HEAP8[tempDoublePtr+1]=HEAP8[e+1],HEAP8[tempDoublePtr+2]=HEAP8[e+2],HEAP8[tempDoublePtr+3]=HEAP8[e+3]}function copyTempDouble(e){HEAP8[tempDoublePtr]=HEAP8[e],HEAP8[tempDoublePtr+1]=HEAP8[e+1],HEAP8[tempDoublePtr+2]=HEAP8[e+2],HEAP8[tempDoublePtr+3]=HEAP8[e+3],HEAP8[tempDoublePtr+4]=HEAP8[e+4],HEAP8[tempDoublePtr+5]=HEAP8[e+5],HEAP8[tempDoublePtr+6]=HEAP8[e+6],HEAP8[tempDoublePtr+7]=HEAP8[e+7]}function _atexit(e,t){__ATEXIT__.unshift({func:e,arg:t})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}assert(tempDoublePtr%8==0),Module._i64Subtract=_i64Subtract;var ___errno_state=0;function ___setErrNo(e){return HEAP32[___errno_state>>2]=e,e}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(e){switch(e){case 30:return PAGE_SIZE;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 79:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return ___setErrNo(ERRNO_CODES.EINVAL),-1}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:function(e){if(!e||EXCEPTIONS.infos[e])return e;for(var t in EXCEPTIONS.infos){if(EXCEPTIONS.infos[t].adjusted===e)return t}return e},addRef:function(e){e&&EXCEPTIONS.infos[e].refcount++},decRef:function(e){if(e){var t=EXCEPTIONS.infos[e];assert(t.refcount>0),t.refcount--,0===t.refcount&&(t.destructor&&Runtime.dynCall("vi",t.destructor,[e]),delete EXCEPTIONS.infos[e],___cxa_free_exception(e))}},clearRef:function(e){e&&(EXCEPTIONS.infos[e].refcount=0)}};function ___resumeException(e){throw EXCEPTIONS.last||(EXCEPTIONS.last=e),EXCEPTIONS.clearRef(EXCEPTIONS.deAdjust(e)),e+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var e=EXCEPTIONS.last;if(!e)return 0|(asm.setTempRet0(0),0);var t=EXCEPTIONS.infos[e],r=t.type;if(!r)return 0|(asm.setTempRet0(0),e);var n=Array.prototype.slice.call(arguments);Module.___cxa_is_pointer_type(r);___cxa_find_matching_catch.buffer||(___cxa_find_matching_catch.buffer=_malloc(4)),HEAP32[___cxa_find_matching_catch.buffer>>2]=e,e=___cxa_find_matching_catch.buffer;for(var i=0;i>2],t.adjusted=e,0|(asm.setTempRet0(n[i]),e);return e=HEAP32[e>>2],0|(asm.setTempRet0(r),e)}function ___cxa_throw(e,t,r){throw EXCEPTIONS.infos[e]={ptr:e,adjusted:e,type:t,destructor:r,refcount:0},EXCEPTIONS.last=e,"uncaught_exception"in __ZSt18uncaught_exceptionv?__ZSt18uncaught_exceptionv.uncaught_exception++:__ZSt18uncaught_exceptionv.uncaught_exception=1,e+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function _abort(){Module.abort()}Module._memset=_memset,Module._bitshift64Shl=_bitshift64Shl;var FS=void 0,SOCKFS=void 0;function _send(e,t,r,n){return SOCKFS.getSocket(e)?_write(e,t,r):(___setErrNo(ERRNO_CODES.EBADF),-1)}function _pwrite(e,t,r,n){var i=FS.getStream(e);if(!i)return ___setErrNo(ERRNO_CODES.EBADF),-1;try{var o=HEAP8;return FS.write(i,o,t,r,n)}catch(e){return FS.handleFSError(e),-1}}function _write(e,t,r){var n=FS.getStream(e);if(!n)return ___setErrNo(ERRNO_CODES.EBADF),-1;try{var i=HEAP8;return FS.write(n,i,t,r)}catch(e){return FS.handleFSError(e),-1}}function _fileno(e){return(e=FS.getStreamFromPtr(e))?e.fd:-1}function _fwrite(e,t,r,n){var i=r*t;if(0==i)return 0;var o=_write(_fileno(n),e,i);if(-1==o){var s=FS.getStreamFromPtr(n);return s&&(s.error=!0),0}return o/t|0}function __reallyNegative(e){return e<0||0===e&&1/e==-1/0}function __formatString(e,t){var r=e,n=0;function i(e){var r;return"double"===e?(HEAP32[tempDoublePtr>>2]=HEAP32[t+n>>2],HEAP32[tempDoublePtr+4>>2]=HEAP32[t+(n+4)>>2],r=+HEAPF64[tempDoublePtr>>3]):"i64"==e?r=[HEAP32[t+n>>2],HEAP32[t+(n+4)>>2]]:(e="i32",r=HEAP32[t+n>>2]),n+=Runtime.getNativeFieldSize(e),r}for(var o,s,A=[];;){var a=r;if(0===(o=HEAP8[r>>0]))break;if(s=HEAP8[r+1>>0],37==o){var c=!1,u=!1,l=!1,h=!1,g=!1;e:for(;;){switch(s){case 43:c=!0;break;case 45:u=!0;break;case 35:l=!0;break;case 48:if(h)break e;h=!0;break;case 32:g=!0;break;default:break e}r++,s=HEAP8[r+1>>0]}var f=0;if(42==s)f=i("i32"),r++,s=HEAP8[r+1>>0];else for(;s>=48&&s<=57;)f=10*f+(s-48),r++,s=HEAP8[r+1>>0];var p,d=!1,C=-1;if(46==s){if(C=0,d=!0,r++,42==(s=HEAP8[r+1>>0]))C=i("i32"),r++;else for(;;){var E=HEAP8[r+1>>0];if(E<48||E>57)break;C=10*C+(E-48),r++}s=HEAP8[r+1>>0]}switch(C<0&&(C=6,d=!1),String.fromCharCode(s)){case"h":104==HEAP8[r+2>>0]?(r++,p=1):p=2;break;case"l":108==HEAP8[r+2>>0]?(r++,p=8):p=4;break;case"L":case"q":case"j":p=8;break;case"z":case"t":case"I":p=4;break;default:p=null}switch(p&&r++,s=HEAP8[r+1>>0],String.fromCharCode(s)){case"d":case"i":case"u":case"o":case"x":case"X":case"p":var I=100==s||105==s,m=b=i("i"+8*(p=p||4));if(8==p&&(b=Runtime.makeBigInt(b[0],b[1],117==s)),p<=4)b=(I?reSign:unSign)(b&Math.pow(256,p)-1,8*p);var y=Math.abs(b),w="";if(100==s||105==s)D=8==p&&i64Math?i64Math.stringify(m[0],m[1],null):reSign(b,8*p,1).toString(10);else if(117==s)D=8==p&&i64Math?i64Math.stringify(m[0],m[1],!0):unSign(b,8*p,1).toString(10),b=Math.abs(b);else if(111==s)D=(l?"0":"")+y.toString(8);else if(120==s||88==s){if(w=l&&0!=b?"0x":"",8==p&&i64Math)if(m[1]){D=(m[1]>>>0).toString(16);for(var B=(m[0]>>>0).toString(16);B.length<8;)B="0"+B;D+=B}else D=(m[0]>>>0).toString(16);else if(b<0){b=-b,D=(y-1).toString(16);for(var Q=[],v=0;v=0&&(c?w="+"+w:g&&(w=" "+w)),"-"==D.charAt(0)&&(w="-"+w,D=D.substr(1));w.length+D.lengthx&&x>=-4?(s=(103==s?"f":"F").charCodeAt(0),C-=x+1):(s=(103==s?"e":"E").charCodeAt(0),C--),k=Math.min(C,20)}101==s||69==s?(D=b.toExponential(k),/[eE][-+]\d$/.test(D)&&(D=D.slice(0,-1)+"0"+D.slice(-1))):102!=s&&70!=s||(D=b.toFixed(k),0===b&&__reallyNegative(b)&&(D="-"+D));var F=D.split("e");if(S&&!l)for(;F[0].length>1&&-1!=F[0].indexOf(".")&&("0"==F[0].slice(-1)||"."==F[0].slice(-1));)F[0]=F[0].slice(0,-1);else for(l&&-1==D.indexOf(".")&&(F[0]+=".");C>k++;)F[0]+="0";D=F[0]+(F.length>1?"e"+F[1]:""),69==s&&(D=D.toUpperCase()),b>=0&&(c?D="+"+D:g&&(D=" "+D))}else D=(b<0?"-":"")+"inf",h=!1;for(;D.length>0]);else A=A.concat(intArrayFromString("(null)".substr(0,N),!0));if(u)for(;N0;)A.push(32);u||A.push(i("i8"));break;case"n":var R=i("i32*");HEAP32[R>>2]=A.length;break;case"%":A.push(o);break;default:for(v=a;v>0])}r+=2}else A.push(o),r+=1}return A}function _fprintf(e,t,r){var n=__formatString(t,r),i=Runtime.stackSave(),o=_fwrite(allocate(n,"i8",ALLOC_STACK),1,n.length,e);return Runtime.stackRestore(i),o}function _printf(e,t){var r=__formatString(e,t),n=intArrayToString(r);return"\n"===n[n.length-1]&&(n=n.substr(0,n.length-1)),Module.print(n),r.length}function _pthread_once(e,t){_pthread_once.seen||(_pthread_once.seen={}),e in _pthread_once.seen||(Runtime.dynCall("v",t),_pthread_once.seen[e]=1)}function _fputc(e,t){var r=unSign(255&e);if(HEAP8[_fputc.ret>>0]=r,-1==_write(_fileno(t),_fputc.ret,1)){var n=FS.getStreamFromPtr(t);return n&&(n.error=!0),-1}return r}Module._strlen=_strlen;var PTHREAD_SPECIFIC={};function _pthread_getspecific(e){return PTHREAD_SPECIFIC[e]||0}function _fputs(e,t){return _write(_fileno(t),e,_strlen(e))}Module._i64Add=_i64Add;var _stdout=allocate(1,"i32*",ALLOC_STATIC);function _puts(e){var t=Pointer_stringify(e),r=t.substr(0);return"\n"===r[r.length-1]&&(r=r.substr(0,r.length-1)),Module.print(r),t.length}function _pthread_setspecific(e,t){return e in PTHREAD_SPECIFIC?(PTHREAD_SPECIFIC[e]=t,0):ERRNO_CODES.EINVAL}function __exit(e){Module.exit(e)}function _exit(e){__exit(e)}var _UItoD=!0;function _malloc(e){return Runtime.dynamicAlloc(e+8)+8&4294967288}function ___cxa_allocate_exception(e){return _malloc(e)}function _fmod(e,t){return e%t}function _fmodl(){return _fmod.apply(null,arguments)}function ___cxa_pure_virtual(){throw ABORT=!0,"Pure virtual function called!"}function _time(e){var t=Date.now()/1e3|0;return e&&(HEAP32[e>>2]=t),t}Module._malloc=_malloc,Module._bitshift64Lshr=_bitshift64Lshr;var PTHREAD_SPECIFIC_NEXT_KEY=1;function _pthread_key_create(e,t){return 0==e?ERRNO_CODES.EINVAL:(HEAP32[e>>2]=PTHREAD_SPECIFIC_NEXT_KEY,PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0,PTHREAD_SPECIFIC_NEXT_KEY++,0)}function ___cxa_guard_acquire(e){return HEAP8[e>>0]?0:(HEAP8[e>>0]=1,1)}function ___cxa_guard_release(){}function _vfprintf(e,t,r){return _fprintf(e,t,HEAP32[r>>2])}function ___cxa_begin_catch(e){return __ZSt18uncaught_exceptionv.uncaught_exception--,EXCEPTIONS.caught.push(e),EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(e)),e}function _emscripten_memcpy_big(e,t,r){return HEAPU8.set(HEAPU8.subarray(t,t+r),e),e}Module._memcpy=_memcpy;var _llvm_pow_f64=Math_pow;function _sbrk(e){var t=_sbrk;t.called||(DYNAMICTOP=alignMemoryPage(DYNAMICTOP),t.called=!0,assert(Runtime.dynamicAlloc),t.alloc=Runtime.dynamicAlloc,Runtime.dynamicAlloc=function(){abort("cannot dynamically allocate, sbrk now has control")});var r=DYNAMICTOP;return 0!=e&&t.alloc(e),r}var _fabs=Math_abs;function ___errno_location(){return ___errno_state}var _BItoD=!0;function _copysign(e,t){return __reallyNegative(e)===__reallyNegative(t)?e:-e}function _copysignl(){return _copysign.apply(null,arguments)}var ___dso_handle=allocate(1,"i32*",ALLOC_STATIC),_stderr=allocate(1,"i32*",ALLOC_STATIC);___errno_state=Runtime.staticAlloc(4),HEAP32[___errno_state>>2]=0,_fputc.ret=allocate([0],"i8",ALLOC_STATIC),STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP),staticSealed=!0,STACK_MAX=STACK_BASE+TOTAL_STACK,DYNAMIC_BASE=DYNAMICTOP=Runtime.alignMemory(STACK_MAX),assert(DYNAMIC_BASE>0]=n[e>>0];n[g+1>>0]=n[e+1>>0];n[g+2>>0]=n[e+2>>0];n[g+3>>0]=n[e+3>>0]}function ht(e){e=e|0;n[g>>0]=n[e>>0];n[g+1>>0]=n[e+1>>0];n[g+2>>0]=n[e+2>>0];n[g+3>>0]=n[e+3>>0];n[g+4>>0]=n[e+4>>0];n[g+5>>0]=n[e+5>>0];n[g+6>>0]=n[e+6>>0];n[g+7>>0]=n[e+7>>0]}function gt(e){e=e|0;R=e}function ft(){return R|0}function pt(e){e=e|0;xe(e|0)|0;pn()}function dt(e){e=e|0;return}function Ct(e,t,r,i,s){e=e|0;t=t|0;r=r|0;i=i|0;s=s|0;var A=0;A=l;o[e>>2]=112;o[e+4>>2]=t;o[e+8>>2]=r;o[e+12>>2]=i;o[e+16>>2]=s;if((n[144]|0)==0?(ye(144)|0)!=0:0){o[32]=0;o[33]=0;o[34]=0;Je(19,128,C|0)|0;De(144)}s=o[33]|0;if((s|0)==(o[34]|0)){i=(s>>1)+2&-2;i=(i|0)<2?2:i;if((i|0)>(2147483647-s|0)){t=Qe(1)|0;ze(t|0,48,0)}r=o[32]|0;t=i+s|0;o[34]=t;t=On(r,t<<2)|0;o[32]=t;if((t|0)==0?(o[(Ye()|0)>>2]|0)==12:0){t=Qe(1)|0;ze(t|0,48,0)}s=o[33]|0}o[33]=s+1;s=(o[32]|0)+(s<<2)|0;if(!s){l=A;return}o[s>>2]=e;l=A;return}function Et(e){e=e|0;var t=0;t=l;un(e);l=t;return}function It(e){e=e|0;var t=0,r=0;t=l;r=o[e>>2]|0;if(!r){l=t;return}o[e+4>>2]=0;_n(r);o[e>>2]=0;o[e+8>>2]=0;l=t;return}function mt(e){e=e|0;var t=0;t=l;un(e);l=t;return}function yt(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0;r=l;if((n[t>>0]|0)!=45){c=0;l=r;return c|0}i=t+1|0;s=110;a=i;c=0;while(1){A=c+1|0;if((n[a>>0]|0)!=s<<24>>24){s=1;break}a=t+(c+2)|0;if((A|0)==3){s=0;i=a;break}else{s=n[264+A>>0]|0;c=A}}if($n(i,o[e+4>>2]|0)|0){c=0;l=r;return c|0}n[e+20>>0]=s;c=1;l=r;return c|0}function wt(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0;A=l;l=l+16|0;r=A;i=o[E>>2]|0;s=e+4|0;a=o[s>>2]|0;o[r>>2]=a;o[r+4>>2]=a;et(i|0,216,r|0)|0;a=0;while(1){c=a>>>0<(32-((Ai(o[s>>2]|0)|0)<<1)|0)>>>0;qe(32,i|0)|0;if(c)a=a+1|0;else break}o[r>>2]=(n[e+20>>0]|0)!=0?248:256;et(i|0,232,r|0)|0;if(!t){l=A;return}o[r>>2]=o[e+8>>2];et(i|0,88,r|0)|0;qe(10,i|0)|0;l=A;return}function Bt(e){e=e|0;var t=0;t=l;un(e);l=t;return}function Qt(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0;r=l;l=l+16|0;A=r;s=r+8|0;if((n[t>>0]|0)!=45){g=0;l=r;return g|0}u=t+1|0;i=e+4|0;a=o[i>>2]|0;c=n[a>>0]|0;e:do{if(c<<24>>24){h=0;while(1){g=h;h=h+1|0;if((n[u>>0]|0)!=c<<24>>24){e=0;break}c=n[a+h>>0]|0;u=t+(g+2)|0;if(!(c<<24>>24))break e}l=r;return e|0}}while(0);if((n[u>>0]|0)!=61){g=0;l=r;return g|0}t=u+1|0;a=Zn(t,s,10)|0;if(!(o[s>>2]|0)){g=0;l=r;return g|0}if((a|0)>(o[e+24>>2]|0)){g=o[E>>2]|0;h=o[i>>2]|0;o[A>>2]=t;o[A+4>>2]=h;et(g|0,416,A|0)|0;nt(1)}if((a|0)<(o[e+20>>2]|0)){g=o[E>>2]|0;h=o[i>>2]|0;o[A>>2]=t;o[A+4>>2]=h;et(g|0,472,A|0)|0;nt(1)}o[e+28>>2]=a;g=1;l=r;return g|0}function vt(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0;r=l;l=l+16|0;n=r;i=o[E>>2]|0;s=o[e+16>>2]|0;o[n>>2]=o[e+4>>2];o[n+4>>2]=s;et(i|0,336,n|0)|0;s=o[e+20>>2]|0;if((s|0)==-2147483648)Ze(360,4,1,i|0)|0;else{o[n>>2]=s;et(i|0,368,n|0)|0}Ze(376,4,1,i|0)|0;s=o[e+24>>2]|0;if((s|0)==2147483647)Ze(384,4,1,i|0)|0;else{o[n>>2]=s;et(i|0,368,n|0)|0}o[n>>2]=o[e+28>>2];et(i|0,392,n|0)|0;if(!t){l=r;return}o[n>>2]=o[e+8>>2];et(i|0,88,n|0)|0;qe(10,i|0)|0;l=r;return}function Dt(e){e=e|0;var t=0,r=0,i=0,s=0,A=0;s=l;o[e>>2]=1816;i=e+4|0;r=e+32|0;A=e+48|0;o[i+0>>2]=0;o[i+4>>2]=0;o[i+8>>2]=0;o[i+12>>2]=0;o[i+16>>2]=0;o[i+20>>2]=0;o[r+0>>2]=0;o[r+4>>2]=0;o[r+8>>2]=0;o[r+12>>2]=0;u[A>>3]=+u[75];u[e+56>>3]=+u[89];u[e+64>>3]=+u[103];u[e+72>>3]=+u[123];n[e+80>>0]=n[1364]|0;o[e+84>>2]=o[269];o[e+88>>2]=o[297];n[e+92>>0]=0;n[e+93>>0]=n[1292]|0;u[e+96>>3]=+u[204];o[e+104>>2]=o[439];o[e+108>>2]=o[359];u[e+112>>3]=+u[191];u[e+120>>3]=.3333333333333333;u[e+128>>3]=1.1;o[e+136>>2]=100;u[e+144>>3]=1.5;A=e+316|0;o[e+332>>2]=0;o[e+336>>2]=0;o[e+340>>2]=0;o[e+348>>2]=0;o[e+352>>2]=0;o[e+356>>2]=0;o[e+364>>2]=0;o[e+368>>2]=0;o[e+372>>2]=0;o[e+380>>2]=0;o[e+384>>2]=0;o[e+388>>2]=0;o[e+396>>2]=0;o[e+400>>2]=0;o[e+404>>2]=0;r=e+544|0;o[e+412>>2]=0;o[e+416>>2]=0;o[e+420>>2]=0;o[e+428>>2]=0;o[e+432>>2]=0;o[e+436>>2]=0;o[e+444>>2]=0;o[e+448>>2]=0;o[e+452>>2]=0;oi(e+152|0,0,176)|0;o[e+456>>2]=r;i=e+460|0;o[i+0>>2]=0;o[i+4>>2]=0;o[i+8>>2]=0;o[i+12>>2]=0;o[i+16>>2]=0;o[i+20>>2]=0;o[e+488>>2]=A;n[e+492>>0]=1;u[e+496>>3]=1.0;u[e+504>>3]=1.0;o[e+512>>2]=0;o[e+516>>2]=-1;A=e+520|0;i=e+536|0;o[A+0>>2]=0;o[A+4>>2]=0;o[A+8>>2]=0;o[A+12>>2]=0;n[i>>0]=1;i=e+540|0;o[i+0>>2]=0;o[i+4>>2]=0;o[i+8>>2]=0;o[i+12>>2]=0;o[i+16>>2]=0;er(r,1048576);n[e+560>>0]=0;r=e+604|0;i=e+664|0;A=e+564|0;t=A+36|0;do{o[A>>2]=0;A=A+4|0}while((A|0)<(t|0));A=r+0|0;t=A+36|0;do{o[A>>2]=0;A=A+4|0}while((A|0)<(t|0));A=e+680|0;o[i+0>>2]=-1;o[i+4>>2]=-1;o[i+8>>2]=-1;o[i+12>>2]=-1;n[A>>0]=0;l=s;return}function bt(e){e=e|0;var t=0;t=l;St(e);un(e);l=t;return}function St(e){e=e|0;var t=0,r=0,n=0;t=l;o[e>>2]=1816;r=e+628|0;n=o[r>>2]|0;if(n){o[e+632>>2]=0;_n(n);o[r>>2]=0;o[e+636>>2]=0}r=e+616|0;n=o[r>>2]|0;if(n){o[e+620>>2]=0;_n(n);o[r>>2]=0;o[e+624>>2]=0}r=e+604|0;n=o[r>>2]|0;if(n){o[e+608>>2]=0;_n(n);o[r>>2]=0;o[e+612>>2]=0}r=e+588|0;n=o[r>>2]|0;if(n){o[e+592>>2]=0;_n(n);o[r>>2]=0;o[e+596>>2]=0}r=e+576|0;n=o[r>>2]|0;if(n){o[e+580>>2]=0;_n(n);o[r>>2]=0;o[e+584>>2]=0}r=e+564|0;n=o[r>>2]|0;if(n){o[e+568>>2]=0;_n(n);o[r>>2]=0;o[e+572>>2]=0}r=o[e+544>>2]|0;if(r)_n(r);r=e+472|0;n=o[r>>2]|0;if(n){o[e+476>>2]=0;_n(n);o[r>>2]=0;o[e+480>>2]=0}r=e+460|0;n=o[r>>2]|0;if(n){o[e+464>>2]=0;_n(n);o[r>>2]=0;o[e+468>>2]=0}tr(e+412|0);r=e+396|0;n=o[r>>2]|0;if(n){o[e+400>>2]=0;_n(n);o[r>>2]=0;o[e+404>>2]=0}r=e+380|0;n=o[r>>2]|0;if(n){o[e+384>>2]=0;_n(n);o[r>>2]=0;o[e+388>>2]=0}n=e+364|0;r=o[n>>2]|0;if(r){o[e+368>>2]=0;_n(r);o[n>>2]=0;o[e+372>>2]=0}r=e+348|0;n=o[r>>2]|0;if(n){o[e+352>>2]=0;_n(n);o[r>>2]=0;o[e+356>>2]=0}r=e+332|0;n=o[r>>2]|0;if(n){o[e+336>>2]=0;_n(n);o[r>>2]=0;o[e+340>>2]=0}r=e+316|0;n=o[r>>2]|0;if(n){o[e+320>>2]=0;_n(n);o[r>>2]=0;o[e+324>>2]=0}r=e+304|0;n=o[r>>2]|0;if(n){o[e+308>>2]=0;_n(n);o[r>>2]=0;o[e+312>>2]=0}r=e+292|0;n=o[r>>2]|0;if(n){o[e+296>>2]=0;_n(n);o[r>>2]=0;o[e+300>>2]=0}r=e+280|0;n=o[r>>2]|0;if(n){o[e+284>>2]=0;_n(n);o[r>>2]=0;o[e+288>>2]=0}r=e+268|0;n=o[r>>2]|0;if(n){o[e+272>>2]=0;_n(n);o[r>>2]=0;o[e+276>>2]=0}r=e+256|0;n=o[r>>2]|0;if(n){o[e+260>>2]=0;_n(n);o[r>>2]=0;o[e+264>>2]=0}r=e+32|0;n=o[r>>2]|0;if(n){o[e+36>>2]=0;_n(n);o[r>>2]=0;o[e+40>>2]=0}r=e+16|0;n=o[r>>2]|0;if(n){o[e+20>>2]=0;_n(n);o[r>>2]=0;o[e+24>>2]=0}n=e+4|0;r=o[n>>2]|0;if(!r){l=t;return}o[e+8>>2]=0;_n(r);o[n>>2]=0;o[e+12>>2]=0;l=t;return}function kt(e,t,r){e=e|0;t=t|0;r=r|0;var i=0,s=0,A=0,a=0,c=0.0,h=0,g=0,f=0,p=0,d=0,C=0;i=l;l=l+16|0;a=i+4|0;A=i;s=e+580|0;h=o[s>>2]|0;if((h|0)>0){f=h+-1|0;p=o[(o[e+576>>2]|0)+(f<<2)>>2]|0;o[s>>2]=f;s=p}else{p=e+540|0;s=o[p>>2]|0;o[p>>2]=s+1}h=e+412|0;p=s<<1;o[a>>2]=p;rr(h,a);o[A>>2]=p|1;rr(h,A);a=e+332|0;h=n[544]|0;A=s+1|0;nr(a,A);n[(o[a>>2]|0)+s>>0]=h;a=e+396|0;h=e+400|0;if((o[h>>2]|0)<(A|0)){f=e+404|0;p=o[f>>2]|0;if((p|0)<(A|0)){d=s+2-p&-2;g=(p>>1)+2&-2;g=(d|0)>(g|0)?d:g;if((g|0)>(2147483647-p|0)){d=Qe(1)|0;ze(d|0,48,0)}C=o[a>>2]|0;d=g+p|0;o[f>>2]=d;d=On(C,d<<3)|0;o[a>>2]=d;if((d|0)==0?(o[(Ye()|0)>>2]|0)==12:0){C=Qe(1)|0;ze(C|0,48,0)}}f=o[h>>2]|0;if((f|0)<(A|0))do{g=(o[a>>2]|0)+(f<<3)|0;if(g){C=g;o[C>>2]=0;o[C+4>>2]=0}f=f+1|0}while((f|0)!=(A|0));o[h>>2]=A}h=(o[a>>2]|0)+(s<<3)|0;o[h>>2]=-1;o[h+4>>2]=0;h=e+316|0;if(!(n[e+93>>0]|0))c=0.0;else{C=e+72|0;c=+u[C>>3]*1389796.0;c=c-+(~~(c/2147483647.0)|0)*2147483647.0;u[C>>3]=c;c=c/2147483647.0*1.0e-5}a=e+320|0;if((o[a>>2]|0)<(A|0)){g=e+324|0;f=o[g>>2]|0;if((f|0)<(A|0)){C=s+2-f&-2;p=(f>>1)+2&-2;p=(C|0)>(p|0)?C:p;if((p|0)>(2147483647-f|0)){C=Qe(1)|0;ze(C|0,48,0)}d=o[h>>2]|0;C=p+f|0;o[g>>2]=C;C=On(d,C<<3)|0;o[h>>2]=C;if((C|0)==0?(o[(Ye()|0)>>2]|0)==12:0){C=Qe(1)|0;ze(C|0,48,0)}}p=o[a>>2]|0;if((p|0)<(A|0)){g=o[h>>2]|0;do{f=g+(p<<3)|0;if(f)u[f>>3]=0.0;p=p+1|0}while((p|0)!=(A|0))}o[a>>2]=A}u[(o[h>>2]|0)+(s<<3)>>3]=c;ir(e+588|0,s,0);ir(e+348|0,s,1);a=e+364|0;t=n[t>>0]|0;nr(a,A);n[(o[a>>2]|0)+s>>0]=t;a=e+380|0;t=e+384|0;if((o[t>>2]|0)<(A|0)){h=e+388|0;f=o[h>>2]|0;if((f|0)<(A|0)){C=s+2-f&-2;g=(f>>1)+2&-2;g=(C|0)>(g|0)?C:g;if((g|0)>(2147483647-f|0)){C=Qe(1)|0;ze(C|0,48,0)}d=o[a>>2]|0;C=g+f|0;o[h>>2]=C;C=On(d,C)|0;o[a>>2]=C;if((C|0)==0?(o[(Ye()|0)>>2]|0)==12:0){C=Qe(1)|0;ze(C|0,48,0)}}h=o[t>>2]|0;if((h|0)<(A|0))do{g=(o[a>>2]|0)+h|0;if(g)n[g>>0]=0;h=h+1|0}while((h|0)!=(A|0));o[t>>2]=A}t=e+288|0;a=o[t>>2]|0;if((a|0)<(A|0)){C=s+2-a&-2;A=(a>>1)+2&-2;A=(C|0)>(A|0)?C:A;if((A|0)>(2147483647-a|0)){C=Qe(1)|0;ze(C|0,48,0)}d=e+280|0;p=o[d>>2]|0;C=A+a|0;o[t>>2]=C;C=On(p,C<<2)|0;o[d>>2]=C;if((C|0)==0?(o[(Ye()|0)>>2]|0)==12:0){C=Qe(1)|0;ze(C|0,48,0)}}A=e+380|0;t=(o[A>>2]|0)+s|0;a=(n[t>>0]|0)==0;if(r){if(a){C=e+200|0;d=C;d=ai(o[d>>2]|0,o[d+4>>2]|0,1,0)|0;o[C>>2]=d;o[C+4>>2]=R}}else if(!a){C=e+200|0;d=C;d=ai(o[d>>2]|0,o[d+4>>2]|0,-1,-1)|0;o[C>>2]=d;o[C+4>>2]=R}n[t>>0]=r&1;r=e+460|0;if((o[e+476>>2]|0)>(s|0)?(o[(o[e+472>>2]|0)+(s<<2)>>2]|0)>-1:0){l=i;return s|0}if(!(n[(o[A>>2]|0)+s>>0]|0)){l=i;return s|0}or(r,s);l=i;return s|0}function xt(e,t){e=e|0;t=t|0;var r=0,i=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0;r=l;l=l+16|0;c=r+1|0;a=r;i=e+492|0;if(!(n[i>>0]|0)){E=0;l=r;return E|0}E=o[t>>2]|0;A=t+4|0;u=o[A>>2]|0;n[c+0>>0]=n[a+0>>0]|0;ar(E,u,c);u=o[A>>2]|0;e:do{if((u|0)>0){c=e+332|0;a=n[528]|0;h=0;g=0;p=-2;while(1){E=o[t>>2]|0;f=o[E+(h<<2)>>2]|0;C=s[(o[c>>2]|0)+(f>>1)>>0]|0;I=C^f&1;d=I&255;m=a&255;if((f|0)==(p^1|0)?1:(d<<24>>24==a<<24>>24&(m>>>1^1)|m&2&I|0)!=0){e=1;break}I=n[536]|0;m=I&255;if((f|0)!=(p|0)?((m>>>1^1)&d<<24>>24==I<<24>>24|C&2&m|0)==0:0){o[E+(g<<2)>>2]=f;u=o[A>>2]|0;g=g+1|0}else f=p;h=h+1|0;if((h|0)<(u|0))p=f;else break e}l=r;return e|0}else{h=0;g=0}}while(0);a=h-g|0;if((a|0)>0){u=u-a|0;o[A>>2]=u}if(!u){n[i>>0]=0;m=0;l=r;return m|0}else if((u|0)==1){I=o[o[t>>2]>>2]|0;E=I>>1;n[(o[e+332>>2]|0)+E>>0]=(I&1^1)&255^1;m=o[e+296>>2]|0;E=(o[e+396>>2]|0)+(E<<3)|0;o[E>>2]=-1;o[E+4>>2]=m;E=e+284|0;m=o[E>>2]|0;o[E>>2]=m+1;o[(o[e+280>>2]|0)+(m<<2)>>2]=I;m=(Mt(e)|0)==-1;n[i>>0]=m&1;l=r;return m|0}else{t=cr(e+544|0,t,0)|0;A=e+256|0;i=e+260|0;c=o[i>>2]|0;a=e+264|0;if((c|0)==(o[a>>2]|0)){u=(c>>1)+2&-2;u=(u|0)<2?2:u;if((u|0)>(2147483647-c|0)){m=Qe(1)|0;ze(m|0,48,0)}I=o[A>>2]|0;m=u+c|0;o[a>>2]=m;m=On(I,m<<2)|0;o[A>>2]=m;if((m|0)==0?(o[(Ye()|0)>>2]|0)==12:0){m=Qe(1)|0;ze(m|0,48,0)}c=o[i>>2]|0}o[i>>2]=c+1;i=(o[A>>2]|0)+(c<<2)|0;if(i)o[i>>2]=t;Nt(e,t);m=1;l=r;return m|0}return 0}function Ft(e,t,r){e=e|0;t=t|0;r=r|0;var i=0,s=0;i=o[t>>2]|0;t=i>>1;n[(o[e+332>>2]|0)+t>>0]=(i&1^1)&255^1;s=o[e+296>>2]|0;t=(o[e+396>>2]|0)+(t<<3)|0;o[t>>2]=r;o[t+4>>2]=s;r=e+284|0;t=o[r>>2]|0;o[r>>2]=t+1;o[(o[e+280>>2]|0)+(t<<2)>>2]=i;return}function Mt(e){e=e|0;var t=0,r=0,i=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0,w=0,B=0,Q=0,v=0,D=0,b=0,S=0,k=0,x=0,F=0,M=0,N=0,K=0,L=0,T=0,P=0,U=0,_=0,O=0;c=l;l=l+16|0;C=c;A=e+512|0;I=o[A>>2]|0;d=e+284|0;if((I|0)>=(o[d>>2]|0)){P=0;L=0;_=-1;U=e+184|0;N=U;T=N;T=o[T>>2]|0;N=N+4|0;N=o[N>>2]|0;N=ai(T|0,N|0,P|0,L|0)|0;T=R;K=U;o[K>>2]=N;U=U+4|0;o[U>>2]=T;U=e+520|0;T=U;K=T;K=o[K>>2]|0;T=T+4|0;T=o[T>>2]|0;L=ii(K|0,T|0,P|0,L|0)|0;P=R;T=U;o[T>>2]=L;U=U+4|0;o[U>>2]=P;l=c;return _|0}f=e+280|0;a=e+428|0;i=e+412|0;u=e+332|0;h=e+544|0;g=C+4|0;t=e+396|0;p=e+296|0;r=e+456|0;v=-1;E=0;do{o[A>>2]=I+1;w=o[(o[f>>2]|0)+(I<<2)>>2]|0;if(n[(o[a>>2]|0)+w>>0]|0){m=o[i>>2]|0;I=m+(w*12|0)+4|0;Q=o[I>>2]|0;if((Q|0)>0){m=m+(w*12|0)|0;y=0;B=0;do{b=o[m>>2]|0;D=b+(y<<3)|0;if((o[(o[o[r>>2]>>2]|0)+(o[D>>2]<<2)>>2]&3|0)!=1){U=D;_=o[U+4>>2]|0;Q=b+(B<<3)|0;o[Q>>2]=o[U>>2];o[Q+4>>2]=_;Q=o[I>>2]|0;B=B+1|0}y=y+1|0}while((y|0)<(Q|0))}else{y=0;B=0}m=y-B|0;if((m|0)>0)o[I>>2]=Q-m;n[(o[a>>2]|0)+w>>0]=0}I=o[i>>2]|0;E=E+1|0;m=o[I+(w*12|0)>>2]|0;I=I+(w*12|0)+4|0;B=o[I>>2]|0;y=m+(B<<3)|0;e:do{if(!B){y=m;Q=m}else{w=w^1;B=(B<<3)+-1|0;b=m;Q=m;while(1){while(1){t:while(1){M=o[b+4>>2]|0;_=s[(o[u>>2]|0)+(M>>1)>>0]^M&1;K=n[528]|0;N=K&255;L=N&2;N=N>>>1^1;if((_&255)<<24>>24==K<<24>>24&N|L&_){x=19;break}D=o[b>>2]|0;x=o[h>>2]|0;F=x+(D<<2)|0;S=x+(D+1<<2)|0;k=o[S>>2]|0;if((k|0)==(w|0)){_=x+(D+2<<2)|0;k=o[_>>2]|0;o[S>>2]=k;o[_>>2]=w}S=b+8|0;o[C>>2]=D;o[g>>2]=k;if((k|0)!=(M|0)?(_=s[(o[u>>2]|0)+(k>>1)>>0]^k&1,((_&255)<<24>>24==K<<24>>24&N|L&_|0)!=0):0){x=27;break}L=o[F>>2]|0;if(L>>>0<=95){x=31;break}N=o[u>>2]|0;K=n[536]|0;M=K&255;_=M&2;M=M>>>1^1;U=2;while(1){T=F+(U<<2)+4|0;P=o[T>>2]|0;O=s[N+(P>>1)>>0]^P&1;U=U+1|0;if(!((O&255)<<24>>24==K<<24>>24&M|_&O))break;if((U|0)>=(L>>>5|0)){x=32;break t}}O=x+(D+2<<2)|0;o[O>>2]=P;o[T>>2]=w;ur((o[i>>2]|0)+((o[O>>2]^1)*12|0)|0,C);if((S|0)==(y|0))break e;else b=S}if((x|0)==19){x=0;U=b;_=o[U+4>>2]|0;O=Q;o[O>>2]=o[U>>2];o[O+4>>2]=_;b=b+8|0;Q=Q+8|0}else if((x|0)==27){x=0;_=C;O=o[_+4>>2]|0;b=Q;o[b>>2]=o[_>>2];o[b+4>>2]=O;b=S;Q=Q+8|0}else if((x|0)==31){K=n[536]|0;x=32}if((x|0)==32){x=Q+8|0;F=C;N=o[F+4>>2]|0;M=Q;o[M>>2]=o[F>>2];o[M+4>>2]=N;M=k>>1;N=k&1;F=(o[u>>2]|0)+M|0;O=s[F>>0]^N;_=K&255;if((O&255)<<24>>24==K<<24>>24&(_>>>1^1)|_&2&O)break;n[F>>0]=(N^1)&255^1;Q=o[p>>2]|0;b=(o[t>>2]|0)+(M<<3)|0;o[b>>2]=D;o[b+4>>2]=Q;b=o[d>>2]|0;o[d>>2]=b+1;o[(o[f>>2]|0)+(b<<2)>>2]=k;b=S;Q=x}if((b|0)==(y|0))break e}o[A>>2]=o[d>>2];if(S>>>0>>0){v=(m+(B-S)|0)>>>3;while(1){U=S;S=S+8|0;_=o[U+4>>2]|0;O=x;o[O>>2]=o[U>>2];o[O+4>>2]=_;if(S>>>0>=y>>>0)break;else x=x+8|0}b=b+(v+2<<3)|0;Q=Q+(v+2<<3)|0}else{b=S;Q=x}if((b|0)==(y|0)){v=D;break}else v=D}}}while(0);m=y-Q|0;if((m|0)>0)o[I>>2]=(o[I>>2]|0)-(m>>3);I=o[A>>2]|0}while((I|0)<(o[d>>2]|0));U=E;T=((E|0)<0)<<31>>31;O=v;_=e+184|0;K=_;P=K;P=o[P>>2]|0;K=K+4|0;K=o[K>>2]|0;K=ai(P|0,K|0,U|0,T|0)|0;P=R;L=_;o[L>>2]=K;_=_+4|0;o[_>>2]=P;_=e+520|0;P=_;L=P;L=o[L>>2]|0;P=P+4|0;P=o[P>>2]|0;T=ii(L|0,P|0,U|0,T|0)|0;U=R;P=_;o[P>>2]=T;_=_+4|0;o[_>>2]=U;l=c;return O|0}function Nt(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0;r=l;l=l+16|0;c=r+8|0;i=r;s=o[e+544>>2]|0;n=s+(t<<2)|0;A=s+(t+1<<2)|0;a=e+412|0;u=(o[a>>2]|0)+((o[A>>2]^1)*12|0)|0;s=s+(t+2<<2)|0;h=o[s>>2]|0;o[c>>2]=t;o[c+4>>2]=h;ur(u,c);s=(o[a>>2]|0)+((o[s>>2]^1)*12|0)|0;A=o[A>>2]|0;o[i>>2]=t;o[i+4>>2]=A;ur(s,i);if(!(o[n>>2]&4)){h=e+208|0;u=h;u=ai(o[u>>2]|0,o[u+4>>2]|0,1,0)|0;o[h>>2]=u;o[h+4>>2]=R;h=e+224|0;u=h;u=ai((o[n>>2]|0)>>>5|0,0,o[u>>2]|0,o[u+4>>2]|0)|0;o[h>>2]=u;o[h+4>>2]=R;l=r;return}else{h=e+216|0;u=h;u=ai(o[u>>2]|0,o[u+4>>2]|0,1,0)|0;o[h>>2]=u;o[h+4>>2]=R;h=e+232|0;u=h;u=ai((o[n>>2]|0)>>>5|0,0,o[u>>2]|0,o[u+4>>2]|0)|0;o[h>>2]=u;o[h+4>>2]=R;l=r;return}}function Rt(e,t,r){e=e|0;t=t|0;r=r|0;var i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0;s=l;l=l+16|0;u=s+4|0;a=s;A=o[e+544>>2]|0;i=A+(t<<2)|0;c=o[A+(t+1<<2)>>2]^1;if(!r){o[u>>2]=c;r=e+428|0;h=o[r>>2]|0;c=h+c|0;if(!(n[c>>0]|0)){n[c>>0]=1;sr(e+444|0,u);h=o[r>>2]|0}t=o[A+(t+2<<2)>>2]^1;o[a>>2]=t;t=h+t|0;if(!(n[t>>0]|0)){n[t>>0]=1;sr(e+444|0,a)}}else{a=e+412|0;r=o[a>>2]|0;u=r+(c*12|0)|0;A=A+(t+2<<2)|0;c=r+(c*12|0)+4|0;h=o[c>>2]|0;e:do{if((h|0)>0){p=o[u>>2]|0;f=0;while(1){g=f+1|0;if((o[p+(f<<3)>>2]|0)==(t|0)){g=f;break e}if((g|0)<(h|0))f=g;else break}}else g=0}while(0);h=h+-1|0;if((g|0)<(h|0)){do{r=o[u>>2]|0;h=g;g=g+1|0;f=r+(g<<3)|0;p=o[f+4>>2]|0;h=r+(h<<3)|0;o[h>>2]=o[f>>2];o[h+4>>2]=p;h=(o[c>>2]|0)+-1|0}while((g|0)<(h|0));r=o[a>>2]|0}o[c>>2]=h;a=o[A>>2]^1;A=r+(a*12|0)|0;a=r+(a*12|0)+4|0;c=o[a>>2]|0;e:do{if((c|0)>0){r=o[A>>2]|0;h=0;while(1){u=h+1|0;if((o[r+(h<<3)>>2]|0)==(t|0)){u=h;break e}if((u|0)<(c|0))h=u;else break}}else u=0}while(0);t=c+-1|0;if((u|0)<(t|0))do{g=o[A>>2]|0;t=u;u=u+1|0;f=g+(u<<3)|0;p=o[f+4>>2]|0;t=g+(t<<3)|0;o[t>>2]=o[f>>2];o[t+4>>2]=p;t=(o[a>>2]|0)+-1|0}while((u|0)<(t|0));o[a>>2]=t}if(!(o[i>>2]&4)){p=e+208|0;f=p;f=ai(o[f>>2]|0,o[f+4>>2]|0,-1,-1)|0;o[p>>2]=f;o[p+4>>2]=R;p=e+224|0;f=p;f=ii(o[f>>2]|0,o[f+4>>2]|0,(o[i>>2]|0)>>>5|0,0)|0;o[p>>2]=f;o[p+4>>2]=R;l=s;return}else{p=e+216|0;f=p;f=ai(o[f>>2]|0,o[f+4>>2]|0,-1,-1)|0;o[p>>2]=f;o[p+4>>2]=R;p=e+232|0;f=p;f=ii(o[f>>2]|0,o[f+4>>2]|0,(o[i>>2]|0)>>>5|0,0)|0;o[p>>2]=f;o[p+4>>2]=R;l=s;return}}function Kt(e,t){e=e|0;t=t|0;var r=0,i=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0;A=l;i=e+544|0;h=o[i>>2]|0;r=h+(t<<2)|0;Rt(e,t,0);h=o[h+(t+1<<2)>>2]|0;a=h>>1;h=(s[(o[e+332>>2]|0)+a>>0]|0)^h&1;f=n[528]|0;g=f&255;if((((h&255)<<24>>24==f<<24>>24&(g>>>1^1)|g&2&h|0)!=0?(c=(o[e+396>>2]|0)+(a<<3)|0,u=o[c>>2]|0,(u|0)!=-1):0)?((o[i>>2]|0)+(u<<2)|0)==(r|0):0)o[c>>2]=-1;o[r>>2]=o[r>>2]&-4|1;g=o[(o[i>>2]|0)+(t<<2)>>2]|0;f=e+556|0;o[f>>2]=((((g>>>3&1)+(g>>>5)<<2)+4|0)>>>2)+(o[f>>2]|0);l=A;return}function Lt(e,t){e=e|0;t=t|0;var r=0,i=0,A=0,a=0,c=0,u=0,h=0;r=l;i=o[t>>2]|0;if(i>>>0<=31){u=0;l=r;return u|0}A=o[e+332>>2]|0;a=n[528]|0;c=a&255;u=c&2;c=c>>>1^1;e=0;while(1){h=o[t+(e<<2)+4>>2]|0;h=(s[A+(h>>1)>>0]|0)^h&1;e=e+1|0;if((h&255)<<24>>24==a<<24>>24&c|u&h){i=1;t=5;break}if((e|0)>=(i>>>5|0)){i=0;t=5;break}}if((t|0)==5){l=r;return i|0}return 0}function Tt(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0;s=l;r=e+296|0;if((o[r>>2]|0)<=(t|0)){l=s;return}i=e+284|0;E=o[i>>2]|0;a=e+292|0;I=o[a>>2]|0;m=o[I+(t<<2)>>2]|0;if((E|0)>(m|0)){C=e+280|0;h=e+332|0;u=e+88|0;c=e+348|0;g=e+460|0;p=e+476|0;d=e+472|0;f=e+380|0;do{E=E+-1|0;m=o[(o[C>>2]|0)+(E<<2)>>2]>>1;n[(o[h>>2]|0)+m>>0]=n[544]|0;I=o[u>>2]|0;if((I|0)<=1){if((I|0)==1?(E|0)>(o[(o[a>>2]|0)+((o[r>>2]|0)+-1<<2)>>2]|0):0)A=7}else A=7;if((A|0)==7){A=0;n[(o[c>>2]|0)+m>>0]=o[(o[C>>2]|0)+(E<<2)>>2]&1}if(!((o[p>>2]|0)>(m|0)?(o[(o[d>>2]|0)+(m<<2)>>2]|0)>-1:0))A=11;if((A|0)==11?(A=0,(n[(o[f>>2]|0)+m>>0]|0)!=0):0)or(g,m);I=o[a>>2]|0;m=o[I+(t<<2)>>2]|0}while((E|0)>(m|0));E=o[i>>2]|0}o[e+512>>2]=m;e=o[I+(t<<2)>>2]|0;if((E-e|0)>0)o[i>>2]=e;if(((o[r>>2]|0)-t|0)<=0){l=s;return}o[r>>2]=t;l=s;return}function Pt(e){e=e|0;var t=0,r=0,i=0,s=0,A=0,a=0,c=0,h=0,g=0,f=0,p=0,d=0.0,C=0;t=l;i=e+72|0;d=+u[i>>3]*1389796.0;d=d-+(~~(d/2147483647.0)|0)*2147483647.0;u[i>>3]=d;c=e+464|0;if(d/2147483647.0<+u[e+64>>3]?(h=o[c>>2]|0,(h|0)!=0):0){d=d*1389796.0;d=d-+(~~(d/2147483647.0)|0)*2147483647.0;u[i>>3]=d;h=o[(o[e+460>>2]|0)+(~~(+(h|0)*(d/2147483647.0))<<2)>>2]|0;f=n[(o[e+332>>2]|0)+h>>0]|0;g=n[544]|0;p=g&255;if(((p>>>1^1)&f<<24>>24==g<<24>>24|f&2&p|0)!=0?(n[(o[e+380>>2]|0)+h>>0]|0)!=0:0){p=e+176|0;f=p;f=ai(o[f>>2]|0,o[f+4>>2]|0,1,0)|0;o[p>>2]=f;o[p+4>>2]=R}}else h=-1;g=e+460|0;p=e+332|0;f=e+380|0;while(1){if(((h|0)!=-1?(C=n[(o[p>>2]|0)+h>>0]|0,A=n[544]|0,r=A&255,s=r>>>1^1,(s&C<<24>>24==A<<24>>24|C&2&r|0)!=0):0)?(n[(o[f>>2]|0)+h>>0]|0)!=0:0)break;if(!(o[c>>2]|0)){r=-2;a=17;break}h=lr(g)|0}if((a|0)==17){l=t;return r|0}c=n[(o[e+364>>2]|0)+h>>0]|0;a=c&255;if(!(s&c<<24>>24==A<<24>>24|r&2&a)){p=n[528]|0;C=p&255;C=((C>>>1^1)&c<<24>>24==p<<24>>24|a&2&C|0)!=0|h<<1;l=t;return C|0}if(!(n[e+92>>0]|0)){C=(n[(o[e+348>>2]|0)+h>>0]|0)!=0|h<<1;l=t;return C|0}else{d=+u[i>>3]*1389796.0;d=d-+(~~(d/2147483647.0)|0)*2147483647.0;u[i>>3]=d;C=d/2147483647.0<.5|h<<1;l=t;return C|0}return 0}function Ut(e,t,r,i){e=e|0;t=t|0;r=r|0;i=i|0;var s=0,A=0,a=0,h=0,g=0,f=0,p=0,d=0,C=0.0,E=0,I=0,m=0,y=0,w=0,B=0,Q=0,v=0,D=0,b=0,S=0,k=0,x=0,F=0,M=0,N=0,K=0,L=0,T=0,P=0,U=0,_=0,O=0,j=0,Y=0,G=0,J=0.0,H=0;s=l;l=l+16|0;p=s+8|0;I=s+4|0;g=s;h=r+4|0;A=o[h>>2]|0;a=r+8|0;if((A|0)==(o[a>>2]|0)){d=(A>>1)+2&-2;d=(d|0)<2?2:d;if((d|0)>(2147483647-A|0)){G=Qe(1)|0;ze(G|0,48,0)}Y=o[r>>2]|0;G=d+A|0;o[a>>2]=G;G=On(Y,G<<2)|0;o[r>>2]=G;if((G|0)==0?(o[(Ye()|0)>>2]|0)==12:0){G=Qe(1)|0;ze(G|0,48,0)}A=o[h>>2]|0}a=(o[r>>2]|0)+(A<<2)|0;if(a){o[a>>2]=0;A=o[h>>2]|0}o[h>>2]=A+1;d=e+544|0;M=e+280|0;A=e+588|0;a=e+396|0;S=e+504|0;x=e+316|0;k=e+540|0;b=e+476|0;D=e+472|0;v=e+460|0;Q=e+488|0;B=e+296|0;y=e+496|0;w=e+272|0;F=e+268|0;K=-2;N=(o[e+284>>2]|0)+-1|0;L=0;do{T=o[d>>2]|0;t=T+(t<<2)|0;P=o[t>>2]|0;if((P&4|0)!=0?(C=+u[y>>3],G=t+(P>>>5<<2)+4|0,J=C+ +c[G>>2],c[G>>2]=J,J>1.0e20):0){_=o[w>>2]|0;if((_|0)>0){U=o[F>>2]|0;P=0;do{G=T+(o[U+(P<<2)>>2]<<2)|0;G=G+((o[G>>2]|0)>>>5<<2)+4|0;c[G>>2]=+c[G>>2]*1.0e-20;P=P+1|0}while((P|0)!=(_|0))}u[y>>3]=C*1.0e-20}K=(K|0)!=-2&1;if(K>>>0<(o[t>>2]|0)>>>5>>>0)do{P=o[t+(K<<2)+4>>2]|0;o[I>>2]=P;P=P>>1;T=(o[A>>2]|0)+P|0;do{if((n[T>>0]|0)==0?(o[(o[a>>2]|0)+(P<<3)+4>>2]|0)>0:0){_=o[x>>2]|0;G=_+(P<<3)|0;J=+u[S>>3]+ +u[G>>3];u[G>>3]=J;if(J>1.0e+100){O=o[k>>2]|0;if((O|0)>0){U=0;do{G=_+(U<<3)|0;u[G>>3]=+u[G>>3]*1.0e-100;U=U+1|0}while((U|0)!=(O|0))}u[S>>3]=+u[S>>3]*1.0e-100}if((o[b>>2]|0)>(P|0)?(m=o[D>>2]|0,E=o[m+(P<<2)>>2]|0,(E|0)>-1):0){U=o[v>>2]|0;_=o[U+(E<<2)>>2]|0;e:do{if(!E)Y=0;else{G=E;while(1){Y=G;G=G+-1>>1;j=U+(G<<2)|0;O=o[j>>2]|0;H=o[o[Q>>2]>>2]|0;if(!(+u[H+(_<<3)>>3]>+u[H+(O<<3)>>3]))break e;o[U+(Y<<2)>>2]=O;o[m+(o[j>>2]<<2)>>2]=Y;if(!G){Y=0;break}}}}while(0);o[U+(Y<<2)>>2]=_;o[m+(_<<2)>>2]=Y}n[T>>0]=1;if((o[(o[a>>2]|0)+(P<<3)+4>>2]|0)<(o[B>>2]|0)){sr(r,I);break}else{L=L+1|0;break}}}while(0);K=K+1|0}while((K|0)<((o[t>>2]|0)>>>5|0));t=o[M>>2]|0;T=o[A>>2]|0;do{K=N;N=N+-1|0;K=o[t+(K<<2)>>2]|0;U=K>>1;P=T+U|0}while((n[P>>0]|0)==0);t=o[(o[a>>2]|0)+(U<<3)>>2]|0;n[P>>0]=0;L=L+-1|0}while((L|0)>0);o[o[r>>2]>>2]=K^1;I=e+616|0;y=o[I>>2]|0;E=e+620|0;if(!y)w=o[E>>2]|0;else{o[E>>2]=0;w=0}m=o[h>>2]|0;if((w|0)<(m|0)){Q=e+624|0;B=o[Q>>2]|0;if((B|0)<(m|0)){H=m+1-B&-2;w=(B>>1)+2&-2;w=(H|0)>(w|0)?H:w;if((w|0)>(2147483647-B|0)){H=Qe(1)|0;ze(H|0,48,0)}H=w+B|0;o[Q>>2]=H;y=On(y,H<<2)|0;o[I>>2]=y;if((y|0)==0?(o[(Ye()|0)>>2]|0)==12:0){H=Qe(1)|0;ze(H|0,48,0)}}w=o[E>>2]|0;e:do{if((w|0)<(m|0))while(1){y=y+(w<<2)|0;if(y)o[y>>2]=0;w=w+1|0;if((w|0)==(m|0))break e;y=o[I>>2]|0}}while(0);o[E>>2]=m;m=o[h>>2]|0}if((m|0)>0){w=o[I>>2]|0;y=o[r>>2]|0;B=0;do{o[w+(B<<2)>>2]=o[y+(B<<2)>>2];B=B+1|0;m=o[h>>2]|0}while((B|0)<(m|0))}y=o[e+84>>2]|0;if((y|0)==1)if((m|0)>1){g=o[r>>2]|0;f=1;y=1;while(1){m=o[g+(f<<2)>>2]|0;p=o[a>>2]|0;w=o[p+(m>>1<<3)>>2]|0;e:do{if((w|0)!=-1){B=(o[d>>2]|0)+(w<<2)|0;Q=o[B>>2]|0;if(Q>>>0>63){w=o[A>>2]|0;v=1;while(1){H=o[B+(v<<2)+4>>2]>>1;if((n[w+H>>0]|0)==0?(o[p+(H<<3)+4>>2]|0)>0:0)break;v=v+1|0;if((v|0)>=(Q>>>5|0))break e}o[g+(y<<2)>>2]=m;y=y+1|0}}else{o[g+(y<<2)>>2]=m;y=y+1|0}}while(0);f=f+1|0;p=o[h>>2]|0;if((f|0)>=(p|0)){g=p;break}}}else{g=m;f=1;y=1}else if((y|0)==2)if((m|0)>1){d=1;y=1;do{w=o[r>>2]|0;m=o[w+(d<<2)>>2]|0;if((o[(o[a>>2]|0)+(m>>1<<3)>>2]|0)!=-1){o[g>>2]=m;o[p+0>>2]=o[g+0>>2];if(!(_t(e,p)|0)){m=o[r>>2]|0;w=m;m=o[m+(d<<2)>>2]|0;f=62}}else f=62;if((f|0)==62){f=0;o[w+(y<<2)>>2]=m;y=y+1|0}d=d+1|0;m=o[h>>2]|0}while((d|0)<(m|0));g=m;f=d}else{g=m;f=1;y=1}else{g=m;f=m;y=m}H=e+240|0;G=H;G=ai(o[G>>2]|0,o[G+4>>2]|0,g|0,((g|0)<0)<<31>>31|0)|0;o[H>>2]=G;o[H+4>>2]=R;f=f-y|0;if((f|0)>0){g=g-f|0;o[h>>2]=g}H=e+248|0;G=H;G=ai(o[G>>2]|0,o[G+4>>2]|0,g|0,((g|0)<0)<<31>>31|0)|0;o[H>>2]=G;o[H+4>>2]=R;if((g|0)==1)r=0;else{r=o[r>>2]|0;if((g|0)>2){e=o[a>>2]|0;h=2;f=1;do{f=(o[e+(o[r+(h<<2)>>2]>>1<<3)+4>>2]|0)>(o[e+(o[r+(f<<2)>>2]>>1<<3)+4>>2]|0)?h:f;h=h+1|0}while((h|0)<(g|0))}else f=1;G=r+(f<<2)|0;H=o[G>>2]|0;r=r+4|0;o[G>>2]=o[r>>2];o[r>>2]=H;r=o[(o[a>>2]|0)+(H>>1<<3)+4>>2]|0}o[i>>2]=r;if((o[E>>2]|0)>0)i=0;else{l=s;return}do{n[(o[A>>2]|0)+(o[(o[I>>2]|0)+(i<<2)>>2]>>1)>>0]=0;i=i+1|0}while((i|0)<(o[E>>2]|0));l=s;return}function _t(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0;r=l;g=o[t>>2]|0;u=e+396|0;d=o[u>>2]|0;c=e+544|0;E=(o[c>>2]|0)+(o[d+(g>>1<<3)>>2]<<2)|0;A=e+604|0;i=e+608|0;if(o[A>>2]|0)o[i>>2]=0;s=e+588|0;a=e+612|0;e=e+616|0;f=1;while(1){if(f>>>0<(o[E>>2]|0)>>>5>>>0){C=o[E+(f<<2)+4>>2]|0;p=C>>1;if((o[d+(p<<3)+4>>2]|0)!=0?(h=n[(o[s>>2]|0)+p>>0]|0,(h+-1<<24>>24&255)>=2):0){E=o[i>>2]|0;I=(E|0)==(o[a>>2]|0);if(h<<24>>24==3?1:(o[d+(p<<3)>>2]|0)==-1){c=8;break}if(I){d=(E>>1)+2&-2;d=(d|0)<2?2:d;if((d|0)>(2147483647-E|0)){c=24;break}m=o[A>>2]|0;I=d+E|0;o[a>>2]=I;I=On(m,I<<3)|0;o[A>>2]=I;if((I|0)==0?(o[(Ye()|0)>>2]|0)==12:0){c=24;break}E=o[i>>2]|0}o[i>>2]=E+1;d=(o[A>>2]|0)+(E<<3)|0;if(d){m=d;o[m>>2]=f;o[m+4>>2]=g}o[t>>2]=C;E=o[u>>2]|0;g=C;d=E;E=(o[c>>2]|0)+(o[E+(p<<3)>>2]<<2)|0;f=0}}else{g=(o[s>>2]|0)+(g>>1)|0;if(!(n[g>>0]|0)){n[g>>0]=2;sr(e,t)}g=o[i>>2]|0;if(!g){i=1;c=34;break}m=g+-1|0;g=o[A>>2]|0;f=o[g+(m<<3)>>2]|0;g=o[g+(m<<3)+4>>2]|0;o[t>>2]=g;d=o[u>>2]|0;E=(o[c>>2]|0)+(o[d+(g>>1<<3)>>2]<<2)|0;o[i>>2]=m}f=f+1|0}if((c|0)==8){if(I){c=(E>>1)+2&-2;c=(c|0)<2?2:c;if((c|0)>(2147483647-E|0)){m=Qe(1)|0;ze(m|0,48,0)}I=o[A>>2]|0;m=c+E|0;o[a>>2]=m;m=On(I,m<<3)|0;o[A>>2]=m;if((m|0)==0?(o[(Ye()|0)>>2]|0)==12:0){m=Qe(1)|0;ze(m|0,48,0)}E=o[i>>2]|0}a=E+1|0;o[i>>2]=a;c=(o[A>>2]|0)+(E<<3)|0;if(c){a=c;o[a>>2]=0;o[a+4>>2]=g;a=o[i>>2]|0}if((a|0)>0)c=0;else{m=0;l=r;return m|0}do{u=(o[s>>2]|0)+(o[(o[A>>2]|0)+(c<<3)+4>>2]>>1)|0;if(!(n[u>>0]|0)){n[u>>0]=3;sr(e,(o[A>>2]|0)+(c<<3)+4|0);a=o[i>>2]|0}c=c+1|0}while((c|0)<(a|0));i=0;l=r;return i|0}else if((c|0)==24)ze(Qe(1)|0,48,0);else if((c|0)==34){l=r;return i|0}return 0}function Ot(e,t,r){e=e|0;t=t|0;r=r|0;var i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0;a=l;l=l+32|0;A=a+16|0;s=a+12|0;c=a+8|0;i=a;g=r+20|0;u=r+16|0;if((o[g>>2]|0)>0){h=0;do{n[(o[r>>2]|0)+(o[(o[u>>2]|0)+(h<<2)>>2]|0)>>0]=0;h=h+1|0}while((h|0)<(o[g>>2]|0))}if(o[u>>2]|0)o[g>>2]=0;h=o[t>>2]|0;o[c>>2]=h;o[s>>2]=h;o[A+0>>2]=o[s+0>>2];hr(r,A,0);u=(o[r>>2]|0)+h|0;if(!(n[u>>0]|0)){n[u>>0]=1;sr(r+16|0,c)}if(!(o[e+296>>2]|0)){l=a;return}t=h>>1;f=e+588|0;n[(o[f>>2]|0)+t>>0]=1;p=o[e+284>>2]|0;g=e+292|0;E=o[o[g>>2]>>2]|0;if((p|0)>(E|0)){c=e+280|0;u=e+396|0;h=r+16|0;e=e+544|0;do{p=p+-1|0;C=o[(o[c>>2]|0)+(p<<2)>>2]|0;d=C>>1;if(n[(o[f>>2]|0)+d>>0]|0){E=o[u>>2]|0;I=o[E+(d<<3)>>2]|0;e:do{if((I|0)==-1){C=C^1;o[i>>2]=C;o[s>>2]=C;o[A+0>>2]=o[s+0>>2];hr(r,A,0);C=(o[r>>2]|0)+C|0;if(!(n[C>>0]|0)){n[C>>0]=1;sr(h,i)}}else{C=(o[e>>2]|0)+(I<<2)|0;I=o[C>>2]|0;if(I>>>0>63){m=1;while(1){y=o[C+(m<<2)+4>>2]>>1;if((o[E+(y<<3)+4>>2]|0)>0){n[(o[f>>2]|0)+y>>0]=1;I=o[C>>2]|0}m=m+1|0;if((m|0)>=(I>>>5|0))break e;E=o[u>>2]|0}}}}while(0);n[(o[f>>2]|0)+d>>0]=0;E=o[o[g>>2]>>2]|0}}while((p|0)>(E|0))}n[(o[f>>2]|0)+t>>0]=0;l=a;return}function jt(e){e=e|0;var t=0,r=0,i=0,A=0,a=0,h=0,g=0.0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0,w=0,B=0,Q=0,v=0;r=l;l=l+16|0;p=r+4|0;m=r;t=e+272|0;w=o[t>>2]|0;g=+u[e+496>>3]/+(w|0);A=e+544|0;a=e+268|0;y=o[a>>2]|0;o[m>>2]=A;o[p+0>>2]=o[m+0>>2];gr(y,w,p);p=o[t>>2]|0;if((p|0)>0){h=e+332|0;f=e+396|0;d=0;y=0;do{I=o[a>>2]|0;m=o[I+(d<<2)>>2]|0;w=o[A>>2]|0;C=w+(m<<2)|0;E=o[C>>2]|0;do{if(E>>>0>95){B=o[w+(m+1<<2)>>2]|0;w=B>>1;B=(s[(o[h>>2]|0)+w>>0]|0)^B&1;v=n[528]|0;Q=v&255;if(((B&255)<<24>>24==v<<24>>24&(Q>>>1^1)|Q&2&B|0)!=0?(v=o[(o[f>>2]|0)+(w<<3)>>2]|0,(v|0)!=-1&(v|0)==(m|0)):0){i=9;break}if((d|0)>=((p|0)/2|0|0)?!(+c[C+(E>>>5<<2)+4>>2]>2]=m;y=y+1|0}d=d+1|0;p=o[t>>2]|0}while((d|0)<(p|0))}else{d=0;y=0}i=d-y|0;if((i|0)>0)o[t>>2]=p-i;if(!(+((o[e+556>>2]|0)>>>0)>+u[e+96>>3]*+((o[e+548>>2]|0)>>>0))){l=r;return}ji[o[(o[e>>2]|0)+8>>2]&31](e);l=r;return}function Yt(e,t){e=e|0;t=t|0;var r=0,i=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0,w=0,B=0;r=l;i=t+4|0;h=o[i>>2]|0;if((h|0)>0){a=e+544|0;A=e+332|0;c=0;u=0;do{m=o[t>>2]|0;p=o[m+(c<<2)>>2]|0;h=(o[a>>2]|0)+(p<<2)|0;f=o[h>>2]|0;do{if(f>>>0>31){y=o[A>>2]|0;C=n[528]|0;d=C&255;w=d&2;d=d>>>1^1;E=f>>>5;I=0;do{B=o[h+(I<<2)+4>>2]|0;B=(s[y+(B>>1)>>0]|0)^B&1;I=I+1|0;if((B&255)<<24>>24==C<<24>>24&d|w&B){g=7;break}}while((I|0)<(E|0));if((g|0)==7){g=0;Kt(e,p);break}if(f>>>0>95){g=n[536]|0;d=f>>>5;p=2;do{C=h+(p<<2)+4|0;B=o[C>>2]|0;B=(s[(o[A>>2]|0)+(B>>1)>>0]|0)^B&1;w=g&255;if((B&255)<<24>>24==g<<24>>24&(w>>>1^1)|w&2&B){o[C>>2]=o[h+(d+-1<<2)+4>>2];f=o[h>>2]|0;if(f&8){f=f>>>5;o[h+(f+-1<<2)+4>>2]=o[h+(f<<2)+4>>2];f=o[h>>2]|0}f=f+-32|0;o[h>>2]=f;p=p+-1|0}p=p+1|0;d=f>>>5}while((p|0)<(d|0));p=o[t>>2]|0;m=p;p=o[p+(c<<2)>>2]|0;g=16}else g=16}else g=16}while(0);if((g|0)==16){g=0;o[m+(u<<2)>>2]=p;u=u+1|0}c=c+1|0;h=o[i>>2]|0}while((c|0)<(h|0))}else{c=0;u=0}t=c-u|0;if((t|0)<=0){l=r;return}o[i>>2]=h-t;l=r;return}function Gt(e){e=e|0;var t=0,r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0;s=l;l=l+16|0;r=s+4|0;A=s;o[r>>2]=0;t=r+4|0;o[t>>2]=0;i=r+8|0;o[i>>2]=0;o[A>>2]=0;a=e+540|0;g=o[a>>2]|0;if((g|0)>0){u=e+380|0;c=e+332|0;h=0;do{if((n[(o[u>>2]|0)+h>>0]|0)!=0?(p=n[(o[c>>2]|0)+h>>0]|0,d=n[544]|0,f=d&255,((f>>>1^1)&p<<24>>24==d<<24>>24|p&2&f|0)!=0):0){Ar(r,A);g=o[a>>2]|0}h=h+1|0;o[A>>2]=h}while((h|0)<(g|0))}fr(e+460|0,r);e=o[r>>2]|0;if(!e){l=s;return}o[t>>2]=0;_n(e);o[r>>2]=0;o[i>>2]=0;l=s;return}function Jt(e){e=e|0;var t=0,r=0,i=0,s=0,A=0,a=0,c=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0;t=l;i=e+492|0;if((n[i>>0]|0)!=0?(Mt(e)|0)==-1:0){i=e+284|0;s=e+516|0;if((o[i>>2]|0)==(o[s>>2]|0)){E=1;l=t;return E|0}A=e+520|0;E=A;C=o[E+4>>2]|0;if((C|0)>0|(C|0)==0&(o[E>>2]|0)>>>0>0){E=1;l=t;return E|0}Yt(e,e+268|0);if(n[e+536>>0]|0){Yt(e,e+256|0);c=e+564|0;a=e+568|0;if((o[a>>2]|0)>0){g=e+588|0;h=0;do{n[(o[g>>2]|0)+(o[(o[c>>2]|0)+(h<<2)>>2]|0)>>0]=1;h=h+1|0}while((h|0)<(o[a>>2]|0))}p=o[i>>2]|0;if((p|0)>0){h=o[e+280>>2]|0;g=o[e+588>>2]|0;d=0;f=0;do{C=o[h+(d<<2)>>2]|0;if(!(n[g+(C>>1)>>0]|0)){o[h+(f<<2)>>2]=C;p=o[i>>2]|0;f=f+1|0}d=d+1|0}while((d|0)<(p|0))}else{d=0;f=0}h=d-f|0;if((h|0)>0){p=p-h|0;o[i>>2]=p}o[e+512>>2]=p;e:do{if((o[a>>2]|0)>0){f=e+588|0;h=0;do{n[(o[f>>2]|0)+(o[(o[c>>2]|0)+(h<<2)>>2]|0)>>0]=0;h=h+1|0;g=o[a>>2]|0}while((h|0)<(g|0));if((g|0)>0){g=e+580|0;f=e+584|0;h=e+576|0;p=0;while(1){C=o[g>>2]|0;if((C|0)==(o[f>>2]|0)){d=(C>>1)+2&-2;d=(d|0)<2?2:d;if((d|0)>(2147483647-C|0)){r=28;break}E=o[h>>2]|0;d=d+C|0;o[f>>2]=d;d=On(E,d<<2)|0;o[h>>2]=d;if((d|0)==0?(o[(Ye()|0)>>2]|0)==12:0){r=28;break}C=o[g>>2]|0}else d=o[h>>2]|0;E=d+(C<<2)|0;if(E){o[E>>2]=0;C=o[g>>2]|0}o[g>>2]=C+1;E=o[c>>2]|0;o[d+(C<<2)>>2]=o[E+(p<<2)>>2];p=p+1|0;if((p|0)>=(o[a>>2]|0))break e}if((r|0)==28)ze(Qe(1)|0,48,0)}else r=21}else r=21}while(0);if((r|0)==21)E=o[c>>2]|0;if(E)o[a>>2]=0}if(+((o[e+556>>2]|0)>>>0)>+u[e+96>>3]*+((o[e+548>>2]|0)>>>0))ji[o[(o[e>>2]|0)+8>>2]&31](e);Gt(e);o[s>>2]=o[i>>2];C=e+224|0;E=e+232|0;C=ai(o[E>>2]|0,o[E+4>>2]|0,o[C>>2]|0,o[C+4>>2]|0)|0;E=A;o[E>>2]=C;o[E+4>>2]=R;E=1;l=t;return E|0}n[i>>0]=0;E=0;l=t;return E|0}function Ht(e,t,r){e=e|0;t=t|0;r=r|0;var i=0,A=0,a=0,h=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0,w=0,B=0,Q=0,v=0,D=0,b=0,S=0,k=0,x=0,F=0,M=0,N=0,K=0,L=0,T=0,P=0,U=0,_=0,O=0,j=0,Y=0,G=0,J=0,H=0,z=0,W=0,V=0,X=0,Z=0,$=0,ee=0,te=0,re=0,ne=0,ie=0,oe=0.0,se=0,Ae=0,ae=0,ce=0.0,ue=0,le=0,he=0,ge=0,fe=0,pe=0,de=0.0,Ce=0,Ee=0,Ie=0.0;h=l;l=l+64|0;Z=h;F=h+60|0;b=h+56|0;i=h+44|0;$=h+40|0;o[i>>2]=0;a=i+4|0;o[a>>2]=0;A=i+8|0;o[A>>2]=0;U=t+160|0;P=U;P=ai(o[P>>2]|0,o[P+4>>2]|0,1,0)|0;o[U>>2]=P;o[U+4>>2]=R;U=(r|0)<0;P=t+680|0;T=t+664|0;L=t+672|0;d=t+296|0;w=t+272|0;f=t+284|0;N=t+640|0;x=t+308|0;k=t+304|0;C=t+332|0;M=t+292|0;te=t+168|0;I=t+396|0;y=t+280|0;K=t+184|0;S=t+192|0;m=t+48|0;J=t+504|0;V=t+56|0;ee=t+496|0;re=t+656|0;_=t+144|0;O=t+648|0;j=t+128|0;Y=t+44|0;G=t+200|0;H=t+208|0;z=t+224|0;W=t+216|0;E=t+232|0;X=t+540|0;p=t+292|0;B=t+544|0;v=t+276|0;Q=t+268|0;D=t+268|0;ne=0;e:while(1){ie=U|(ne|0)<(r|0);while(1){se=Mt(t)|0;if((se|0)!=-1)break;if(!ie){se=41;break e}if(n[P>>0]|0){se=41;break e}se=T;Ae=o[se+4>>2]|0;if((Ae|0)>=0?(Ee=S,Ce=o[Ee+4>>2]|0,!(Ce>>>0>>0|((Ce|0)==(Ae|0)?(o[Ee>>2]|0)>>>0<(o[se>>2]|0)>>>0:0))):0){se=41;break e}se=L;Ae=o[se+4>>2]|0;if((Ae|0)>=0?(Ee=K,Ce=o[Ee+4>>2]|0,!(Ce>>>0>>0|((Ce|0)==(Ae|0)?(o[Ee>>2]|0)>>>0<(o[se>>2]|0)>>>0:0))):0){se=41;break e}if((o[d>>2]|0)==0?!(Jt(t)|0):0){se=50;break e}if(+((o[w>>2]|0)-(o[f>>2]|0)|0)>=+u[N>>3])jt(t);while(1){se=o[d>>2]|0;if((se|0)>=(o[x>>2]|0)){se=59;break}ue=o[(o[k>>2]|0)+(se<<2)>>2]|0;Ae=s[(o[C>>2]|0)+(ue>>1)>>0]|0;Ee=Ae^ue&1;ae=Ee&255;pe=n[528]|0;Ce=pe&255;if(!(ae<<24>>24==pe<<24>>24&(Ce>>>1^1)|Ce&2&Ee)){se=56;break}o[F>>2]=o[f>>2];Ar(M,F)}if((se|0)==56){se=0;Ce=n[536]|0;Ee=Ce&255;if((Ee>>>1^1)&ae<<24>>24==Ce<<24>>24|Ae&2&Ee){se=57;break e}if((ue|0)==-2)se=59}if((se|0)==59){Ee=te;Ee=ai(o[Ee>>2]|0,o[Ee+4>>2]|0,1,0)|0;ue=te;o[ue>>2]=Ee;o[ue+4>>2]=R;ue=Pt(t)|0;if((ue|0)==-2){se=60;break e}}o[Z>>2]=o[f>>2];Ar(M,Z);Ee=ue>>1;n[(o[C>>2]|0)+Ee>>0]=(ue&1^1)&255^1;Ce=o[d>>2]|0;Ee=(o[I>>2]|0)+(Ee<<3)|0;o[Ee>>2]=-1;o[Ee+4>>2]=Ce;Ee=o[f>>2]|0;o[f>>2]=Ee+1;o[(o[y>>2]|0)+(Ee<<2)>>2]=ue}Ce=S;Ce=ai(o[Ce>>2]|0,o[Ce+4>>2]|0,1,0)|0;Ee=S;o[Ee>>2]=Ce;o[Ee+4>>2]=R;ne=ne+1|0;if(!(o[d>>2]|0)){se=5;break}if(o[i>>2]|0)o[a>>2]=0;Ut(t,se,i,b);Tt(t,o[b>>2]|0);if((o[a>>2]|0)==1){Ce=o[o[i>>2]>>2]|0;Ee=Ce>>1;n[(o[C>>2]|0)+Ee>>0]=(Ce&1^1)&255^1;pe=o[d>>2]|0;Ee=(o[I>>2]|0)+(Ee<<3)|0;o[Ee>>2]=-1;o[Ee+4>>2]=pe;Ee=o[f>>2]|0;o[f>>2]=Ee+1;o[(o[y>>2]|0)+(Ee<<2)>>2]=Ce}else{ie=cr(B,i,1)|0;se=o[w>>2]|0;if((se|0)==(o[v>>2]|0)){Ae=(se>>1)+2&-2;Ae=(Ae|0)<2?2:Ae;if((Ae|0)>(2147483647-se|0)){se=14;break}Ce=o[Q>>2]|0;Ee=Ae+se|0;o[v>>2]=Ee;Ee=On(Ce,Ee<<2)|0;o[Q>>2]=Ee;if((Ee|0)==0?(o[(Ye()|0)>>2]|0)==12:0){se=14;break}se=o[w>>2]|0}o[w>>2]=se+1;se=(o[Q>>2]|0)+(se<<2)|0;if(se)o[se>>2]=ie;Nt(t,ie);ae=o[B>>2]|0;Ee=ae+(ie<<2)|0;oe=+u[ee>>3];Ee=Ee+((o[Ee>>2]|0)>>>5<<2)+4|0;Ie=oe+ +c[Ee>>2];c[Ee>>2]=Ie;if(Ie>1.0e20){Ae=o[w>>2]|0;if((Ae|0)>0){se=o[D>>2]|0;ue=0;do{Ee=ae+(o[se+(ue<<2)>>2]<<2)|0;Ee=Ee+((o[Ee>>2]|0)>>>5<<2)+4|0;c[Ee>>2]=+c[Ee>>2]*1.0e-20;ue=ue+1|0}while((ue|0)!=(Ae|0))}u[ee>>3]=oe*1.0e-20}Ce=o[o[i>>2]>>2]|0;Ee=Ce>>1;n[(o[C>>2]|0)+Ee>>0]=(Ce&1^1)&255^1;pe=o[d>>2]|0;Ee=(o[I>>2]|0)+(Ee<<3)|0;o[Ee>>2]=ie;o[Ee+4>>2]=pe;Ee=o[f>>2]|0;o[f>>2]=Ee+1;o[(o[y>>2]|0)+(Ee<<2)>>2]=Ce}u[J>>3]=1.0/+u[m>>3]*+u[J>>3];u[ee>>3]=1.0/+u[V>>3]*+u[ee>>3];Ee=(o[re>>2]|0)+-1|0;o[re>>2]=Ee;if(Ee)continue;oe=+u[_>>3]*+u[O>>3];u[O>>3]=oe;o[re>>2]=~~oe;oe=+u[j>>3]*+u[N>>3];u[N>>3]=oe;if((o[Y>>2]|0)<=0)continue;se=o[S>>2]|0;ie=o[G>>2]|0;fe=o[d>>2]|0;if(!fe)Ae=f;else Ae=o[p>>2]|0;Ae=o[Ae>>2]|0;ge=o[H>>2]|0;he=o[z>>2]|0;le=o[W>>2]|0;ue=E;ae=o[ue>>2]|0;ue=o[ue+4>>2]|0;ce=+(o[X>>2]|0);de=1.0/ce;if((fe|0)<0)Ie=0.0;else{pe=0;Ie=0.0;while(1){if(!pe)Ce=0;else Ce=o[(o[p>>2]|0)+(pe+-1<<2)>>2]|0;if((pe|0)==(fe|0))Ee=f;else Ee=(o[p>>2]|0)+(pe<<2)|0;Ie=Ie+ +q(+de,+ +(pe|0))*+((o[Ee>>2]|0)-Ce|0);if((pe|0)==(fe|0))break;else pe=pe+1|0}}o[Z>>2]=se;o[Z+4>>2]=ie-Ae;o[Z+8>>2]=ge;o[Z+12>>2]=he;o[Z+16>>2]=~~oe;o[Z+20>>2]=le;Ee=Z+24|0;u[g>>3]=(+(ae>>>0)+4294967296.0*+(ue>>>0))/+(le|0);o[Ee>>2]=o[g>>2];o[Ee+4>>2]=o[g+4>>2];Ee=Z+32|0;u[g>>3]=Ie/ce*100.0;o[Ee>>2]=o[g>>2];o[Ee+4>>2]=o[g+4>>2];_e(1832,Z|0)|0}if((se|0)==5)n[e>>0]=n[536]|0;else if((se|0)==14)ze(Qe(1)|0,48,0);else if((se|0)==41){oe=+(o[X>>2]|0);ce=1.0/oe;C=o[d>>2]|0;if((C|0)<0)de=0.0;else{d=0;de=0.0;while(1){if(!d)E=0;else E=o[(o[p>>2]|0)+(d+-1<<2)>>2]|0;if((d|0)==(C|0))I=f;else I=(o[p>>2]|0)+(d<<2)|0;de=de+ +q(+ce,+ +(d|0))*+((o[I>>2]|0)-E|0);if((d|0)==(C|0))break;else d=d+1|0}}u[t+528>>3]=de/oe;Tt(t,0);n[e>>0]=n[544]|0}else if((se|0)==50)n[e>>0]=n[536]|0;else if((se|0)==57){o[$>>2]=ue^1;Ee=t+16|0;o[Z+0>>2]=o[$+0>>2];Ot(t,Z,Ee);n[e>>0]=n[536]|0}else if((se|0)==60)n[e>>0]=n[528]|0;e=o[i>>2]|0;if(!e){l=h;return}o[a>>2]=0;_n(e);o[i>>2]=0;o[A>>2]=0;l=h;return}function qt(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0.0,w=0,B=0,Q=0,v=0.0,D=0,b=0;i=l;l=l+16|0;A=i;r=t+4|0;if(o[r>>2]|0)o[t+8>>2]=0;s=t+36|0;a=t+32|0;if((o[s>>2]|0)>0){c=t+16|0;h=0;do{n[(o[c>>2]|0)+(o[(o[a>>2]|0)+(h<<2)>>2]|0)>>0]=0;h=h+1|0}while((h|0)<(o[s>>2]|0))}if(o[a>>2]|0)o[s>>2]=0;a=t+492|0;if(!(n[a>>0]|0)){n[e>>0]=n[536]|0;l=i;return}c=t+152|0;Q=c;Q=ai(o[Q>>2]|0,o[Q+4>>2]|0,1,0)|0;o[c>>2]=Q;o[c+4>>2]=R;v=+u[t+120>>3]*+(o[t+208>>2]|0);c=t+640|0;u[c>>3]=v;y=+(o[t+104>>2]|0);if(v>3]=y;w=o[t+136>>2]|0;u[t+648>>3]=+(w|0);o[t+656>>2]=w;w=n[544]|0;c=t+44|0;if((o[c>>2]|0)>0){Ue(2288)|0;Ue(2368)|0;Ue(2448)|0;Ue(2528)|0;f=n[544]|0}else f=w;g=t+192|0;h=t+184|0;Q=f&255;e:do{if((Q>>>1^1)&w<<24>>24==f<<24>>24|w&2&Q){d=t+80|0;I=t+112|0;p=t+108|0;f=t+680|0;C=t+664|0;E=t+672|0;m=0;while(1){y=+u[I>>3];if(!(n[d>>0]|0))y=+q(+y,+ +(m|0));else{Q=m+1|0;if((m|0)>0){B=0;w=1;do{B=B+1|0;w=w<<1|1}while((w|0)<(Q|0));Q=w+-1|0}else{B=0;Q=0}if((Q|0)!=(m|0)){w=m;do{D=Q>>1;B=B+-1|0;w=(w|0)%(D|0)|0;Q=D+-1|0}while((Q|0)!=(w|0))}y=+q(+y,+ +(B|0))}Ht(A,t,~~(y*+(o[p>>2]|0)));w=n[A>>0]|0;if(n[f>>0]|0)break e;Q=C;B=o[Q+4>>2]|0;if((B|0)>=0?(D=g,b=o[D+4>>2]|0,!(b>>>0>>0|((b|0)==(B|0)?(o[D>>2]|0)>>>0<(o[Q>>2]|0)>>>0:0))):0)break e;Q=E;B=o[Q+4>>2]|0;if((B|0)>=0?(b=h,D=o[b+4>>2]|0,!(D>>>0>>0|((D|0)==(B|0)?(o[b>>2]|0)>>>0<(o[Q>>2]|0)>>>0:0))):0)break e;D=n[544]|0;b=D&255;if(!((b>>>1^1)&w<<24>>24==D<<24>>24|w&2&b))break;else m=m+1|0}}}while(0);if((o[c>>2]|0)>0)Ue(2528)|0;D=n[528]|0;b=D&255;A=w&2;if(!((b>>>1^1)&w<<24>>24==D<<24>>24|A&b)){D=n[536]|0;b=D&255;if(((b>>>1^1)&w<<24>>24==D<<24>>24|A&b|0)!=0?(o[s>>2]|0)==0:0)n[a>>0]=0}else{s=t+540|0;nr(r,o[s>>2]|0);if((o[s>>2]|0)>0){A=t+332|0;a=0;do{n[(o[r>>2]|0)+a>>0]=n[(o[A>>2]|0)+a>>0]|0;a=a+1|0}while((a|0)<(o[s>>2]|0))}}Tt(t,0);n[e>>0]=w;l=i;return}function zt(e,t){e=e|0;t=t|0;var r=0,i=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0,w=0;r=l;A=e+412|0;pr(A);c=e+540|0;if((o[c>>2]|0)>0){a=e+544|0;i=0;do{u=i<<1;g=o[A>>2]|0;h=g+(u*12|0)+4|0;if((o[h>>2]|0)>0){p=g+(u*12|0)|0;f=0;do{E=(o[p>>2]|0)+(f<<3)|0;g=o[E>>2]|0;d=o[a>>2]|0;C=d+(g<<2)|0;if(!(o[C>>2]&16)){I=dr(t,C)|0;o[E>>2]=I;o[C>>2]=o[C>>2]|16;o[d+(g+1<<2)>>2]=I}else o[E>>2]=o[d+(g+1<<2)>>2];f=f+1|0}while((f|0)<(o[h>>2]|0));h=o[A>>2]|0}else h=g;g=u|1;u=h+(g*12|0)+4|0;if((o[u>>2]|0)>0){C=h+(g*12|0)|0;d=0;do{h=(o[C>>2]|0)+(d<<3)|0;p=o[h>>2]|0;f=o[a>>2]|0;g=f+(p<<2)|0;if(!(o[g>>2]&16)){I=dr(t,g)|0;o[h>>2]=I;o[g>>2]=o[g>>2]|16;o[f+(p+1<<2)>>2]=I}else o[h>>2]=o[f+(p+1<<2)>>2];d=d+1|0}while((d|0)<(o[u>>2]|0))}i=i+1|0}while((i|0)<(o[c>>2]|0))}i=e+284|0;if((o[i>>2]|0)>0){u=e+280|0;c=e+396|0;a=e+544|0;A=e+332|0;h=0;do{C=o[c>>2]|0;p=C+(o[(o[u>>2]|0)+(h<<2)>>2]>>1<<3)|0;d=o[p>>2]|0;do{if((d|0)!=-1){I=o[a>>2]|0;E=I+(d<<2)|0;f=(o[E>>2]&16|0)==0;if(f){m=o[I+(d+1<<2)>>2]|0;g=m>>1;m=(s[(o[A>>2]|0)+g>>0]|0)^m&1;w=n[528]|0;y=w&255;if(!((m&255)<<24>>24==w<<24>>24&(y>>>1^1)|y&2&m))break;w=o[C+(g<<3)>>2]|0;if(!((w|0)!=-1&(w|0)==(d|0)))break;if(f){w=dr(t,E)|0;o[p>>2]=w;o[E>>2]=o[E>>2]|16;o[I+(d+1<<2)>>2]=w;break}}o[p>>2]=o[I+(d+1<<2)>>2]}}while(0);h=h+1|0}while((h|0)<(o[i>>2]|0))}i=e+272|0;g=o[i>>2]|0;if((g|0)>0){a=e+268|0;A=e+544|0;h=o[a>>2]|0;c=0;u=0;do{p=h+(c<<2)|0;f=o[p>>2]|0;C=o[A>>2]|0;d=C+(f<<2)|0;E=o[d>>2]|0;if((E&3|0)!=1){if(!(E&16)){g=dr(t,d)|0;o[p>>2]=g;o[d>>2]=o[d>>2]|16;o[C+(f+1<<2)>>2]=g;g=o[a>>2]|0;h=g;g=o[g+(c<<2)>>2]|0}else{g=o[C+(f+1<<2)>>2]|0;o[p>>2]=g}o[h+(u<<2)>>2]=g;g=o[i>>2]|0;u=u+1|0}c=c+1|0}while((c|0)<(g|0))}else{c=0;u=0}A=c-u|0;if((A|0)>0)o[i>>2]=g-A;i=e+260|0;h=o[i>>2]|0;if((h|0)>0){A=e+256|0;e=e+544|0;u=o[A>>2]|0;a=0;c=0;do{g=u+(a<<2)|0;p=o[g>>2]|0;f=o[e>>2]|0;C=f+(p<<2)|0;d=o[C>>2]|0;if((d&3|0)!=1){if(!(d&16)){h=dr(t,C)|0;o[g>>2]=h;o[C>>2]=o[C>>2]|16;o[f+(p+1<<2)>>2]=h;h=o[A>>2]|0;u=h;h=o[h+(a<<2)>>2]|0}else{h=o[f+(p+1<<2)>>2]|0;o[g>>2]=h}o[u+(c<<2)>>2]=h;h=o[i>>2]|0;c=c+1|0}a=a+1|0}while((a|0)<(h|0))}else{a=0;c=0}t=a-c|0;if((t|0)<=0){l=r;return}o[i>>2]=h-t;l=r;return}function Wt(e){e=e|0;var t=0,r=0,i=0,s=0,A=0,a=0,c=0;s=l;l=l+32|0;a=s;t=s+8|0;r=e+548|0;i=e+556|0;A=(o[r>>2]|0)-(o[i>>2]|0)|0;o[t+0>>2]=0;o[t+4>>2]=0;o[t+8>>2]=0;o[t+12>>2]=0;er(t,A);A=t+16|0;n[A>>0]=0;zt(e,t);if((o[e+44>>2]|0)>1){c=o[t+4>>2]<<2;o[a>>2]=o[r>>2]<<2;o[a+4>>2]=c;_e(1888,a|0)|0}n[e+560>>0]=n[A>>0]|0;A=e+544|0;a=o[A>>2]|0;if(a)_n(a);o[A>>2]=o[t>>2];o[r>>2]=o[t+4>>2];o[e+552>>2]=o[t+8>>2];o[i>>2]=o[t+12>>2];l=s;return}function Vt(){var e=0,t=0,r=0;e=l;l=l+16|0;t=e;n[528]=0;n[536]=1;n[544]=2;Ct(552,608,624,2136,2144);o[138]=2168;u[72]=0.0;u[73]=1.0;n[592]=0;n[593]=0;i[297]=i[t+0>>1]|0;i[298]=i[t+2>>1]|0;i[299]=i[t+4>>1]|0;u[75]=.95;Ct(664,720,736,2136,2144);o[166]=2168;u[86]=0.0;u[87]=1.0;n[704]=0;n[705]=0;i[353]=i[t+0>>1]|0;i[354]=i[t+2>>1]|0;i[355]=i[t+4>>1]|0;u[89]=.999;Ct(776,832,848,2136,2144);o[194]=2168;u[100]=0.0;u[101]=1.0;n[816]=1;n[817]=1;i[409]=i[t+0>>1]|0;i[410]=i[t+2>>1]|0;i[411]=i[t+4>>1]|0;u[103]=0.0;Ct(936,992,1008,2136,2144);o[234]=2168;u[120]=0.0;u[121]=Q;n[976]=0;n[977]=0;i[489]=i[t+0>>1]|0;i[490]=i[t+2>>1]|0;i[491]=i[t+4>>1]|0;u[123]=91648253.0;Ct(1048,1080,1096,2136,2016);o[262]=280;r=1068|0;o[r>>2]=0;o[r+4>>2]=2;o[269]=2;Ct(1160,1192,1208,2136,2016);o[290]=280;r=1180|0;o[r>>2]=0;o[r+4>>2]=2;o[297]=2;Ct(1272,1296,1312,2136,1992);o[318]=160;n[1292]=0;Ct(1344,1368,1376,2136,1992);o[336]=160;n[1364]=1;Ct(1408,1440,1448,2136,2016);o[352]=280;r=1428|0;o[r>>2]=1;o[r+4>>2]=2147483647;o[359]=100;Ct(1480,1536,1544,2136,2144);o[370]=2168;u[188]=1.0;u[189]=Q;n[1520]=0;n[1521]=0;i[761]=i[t+0>>1]|0;i[762]=i[t+2>>1]|0;i[763]=i[t+4>>1]|0;u[191]=2.0;Ct(1584,1640,1648,2136,2144);o[396]=2168;u[201]=0.0;u[202]=Q;n[1624]=0;n[1625]=0;i[813]=i[t+0>>1]|0;i[814]=i[t+2>>1]|0;i[815]=i[t+4>>1]|0;u[204]=.2;Ct(1728,1760,1776,2136,2016);o[432]=280;t=1748|0;o[t>>2]=0;o[t+4>>2]=2147483647;o[439]=0;l=e;return}function Xt(e){e=e|0;var t=0;t=l;un(e);l=t;return}function Zt(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0,h=0,g=0,f=0,p=0.0,d=0.0;r=l;l=l+16|0;A=r;s=r+8|0;if((n[t>>0]|0)!=45){f=0;l=r;return f|0}h=t+1|0;i=e+4|0;a=o[i>>2]|0;c=n[a>>0]|0;e:do{if(c<<24>>24){g=0;while(1){f=g;g=g+1|0;if((n[h>>0]|0)!=c<<24>>24){e=0;break}c=n[a+g>>0]|0;h=t+(f+2)|0;if(!(c<<24>>24))break e}l=r;return e|0}}while(0);if((n[h>>0]|0)!=61){f=0;l=r;return f|0}a=h+1|0;p=+Xn(a,s);if(!(o[s>>2]|0)){f=0;l=r;return f|0}d=+u[e+32>>3];if(p>=d?(n[e+41>>0]|0)==0|p!=d:0){f=o[E>>2]|0;g=o[i>>2]|0;o[A>>2]=a;o[A+4>>2]=g;et(f|0,2024,A|0)|0;nt(1)}d=+u[e+24>>3];if(p<=d?(n[e+40>>0]|0)==0|p!=d:0){f=o[E>>2]|0;g=o[i>>2]|0;o[A>>2]=a;o[A+4>>2]=g;et(f|0,2080,A|0)|0;nt(1)}u[e+48>>3]=p;f=1;l=r;return f|0}function $t(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0.0,c=0,h=0.0,f=0.0,p=0;r=l;l=l+48|0;i=r;s=o[E>>2]|0;p=o[e+16>>2]|0;c=(n[e+40>>0]|0)!=0?91:40;f=+u[e+24>>3];h=+u[e+32>>3];A=(n[e+41>>0]|0)!=0?93:41;a=+u[e+48>>3];o[i>>2]=o[e+4>>2];o[i+4>>2]=p;o[i+8>>2]=c;c=i+12|0;u[g>>3]=f;o[c>>2]=o[g>>2];o[c+4>>2]=o[g+4>>2];c=i+20|0;u[g>>3]=h;o[c>>2]=o[g>>2];o[c+4>>2]=o[g+4>>2];o[i+28>>2]=A;A=i+32|0;u[g>>3]=a;o[A>>2]=o[g>>2];o[A+4>>2]=o[g+4>>2];et(s|0,2232,i|0)|0;if(!t){l=r;return}o[i>>2]=o[e+8>>2];et(s|0,2e3,i|0)|0;qe(10,s|0)|0;l=r;return}function er(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0;r=l;n=e+8|0;i=o[n>>2]|0;if(i>>>0>>0)A=i;else{l=r;return}while(1){if(A>>>0>=t>>>0)break;A=((A>>>3)+2+(A>>>1)&-2)+A|0;o[n>>2]=A;if(A>>>0<=i>>>0){s=4;break}}if((s|0)==4)ze(Qe(1)|0,48,0);n=On(o[e>>2]|0,A<<2)|0;if((n|0)==0?(o[(Ye()|0)>>2]|0)==12:0)ze(Qe(1)|0,48,0);o[e>>2]=n;l=r;return}function tr(e){e=e|0;var t=0,r=0,n=0,i=0,s=0,A=0,a=0;t=l;n=e+32|0;r=o[n>>2]|0;if(r){o[e+36>>2]=0;_n(r);o[n>>2]=0;o[e+40>>2]=0}n=e+16|0;r=o[n>>2]|0;if(r){o[e+20>>2]=0;_n(r);o[n>>2]=0;o[e+24>>2]=0}n=o[e>>2]|0;if(!n){l=t;return}r=e+4|0;s=o[r>>2]|0;if((s|0)>0){i=0;do{a=n+(i*12|0)|0;A=o[a>>2]|0;if(A){o[n+(i*12|0)+4>>2]=0;_n(A);o[a>>2]=0;o[n+(i*12|0)+8>>2]=0;n=o[e>>2]|0;s=o[r>>2]|0}i=i+1|0}while((i|0)<(s|0))}o[r>>2]=0;_n(n);o[e>>2]=0;o[e+8>>2]=0;l=t;return}function rr(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0;i=l;l=l+16|0;n=i+4|0;r=i;u=o[t>>2]|0;A=u+1|0;s=e+4|0;if((o[s>>2]|0)<(A|0)){c=e+8|0;a=o[c>>2]|0;if((a|0)<(A|0)){h=u+2-a&-2;u=(a>>1)+2&-2;u=(h|0)>(u|0)?h:u;if((u|0)>(2147483647-a|0)){h=Qe(1)|0;ze(h|0,48,0)}g=o[e>>2]|0;h=u+a|0;o[c>>2]=h;h=On(g,h*12|0)|0;o[e>>2]=h;if((h|0)==0?(o[(Ye()|0)>>2]|0)==12:0){g=Qe(1)|0;ze(g|0,48,0)}}c=o[s>>2]|0;if((c|0)<(A|0)){a=o[e>>2]|0;do{u=a+(c*12|0)|0;if(u){o[u>>2]=0;o[a+(c*12|0)+4>>2]=0;o[a+(c*12|0)+8>>2]=0}c=c+1|0}while((c|0)!=(A|0))}o[s>>2]=A;u=o[t>>2]|0}s=o[e>>2]|0;if(!(o[s+(u*12|0)>>2]|0)){h=u;g=e+16|0;o[r>>2]=h;o[n+0>>2]=o[r+0>>2];hr(g,n,0);l=i;return}o[s+(u*12|0)+4>>2]=0;h=o[t>>2]|0;g=e+16|0;o[r>>2]=h;o[n+0>>2]=o[r+0>>2];hr(g,n,0);l=i;return}function nr(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0,u=0;i=l;r=e+4|0;if((o[r>>2]|0)>=(t|0)){l=i;return}A=e+8|0;s=o[A>>2]|0;if((s|0)<(t|0)){c=t+1-s&-2;a=(s>>1)+2&-2;a=(c|0)>(a|0)?c:a;if((a|0)>(2147483647-s|0)){c=Qe(1)|0;ze(c|0,48,0)}u=o[e>>2]|0;c=a+s|0;o[A>>2]=c;c=On(u,c)|0;o[e>>2]=c;if((c|0)==0?(o[(Ye()|0)>>2]|0)==12:0){u=Qe(1)|0;ze(u|0,48,0)}}s=o[r>>2]|0;if((s|0)<(t|0)){e=o[e>>2]|0;do{A=e+s|0;if(A)n[A>>0]=0;s=s+1|0}while((s|0)!=(t|0))}o[r>>2]=t;l=i;return}function ir(e,t,r){e=e|0;t=t|0;r=r|0;var i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0;A=l;s=t+1|0;i=e+4|0;if((o[i>>2]|0)>=(s|0)){u=o[e>>2]|0;u=u+t|0;n[u>>0]=r;l=A;return}c=e+8|0;a=o[c>>2]|0;if((a|0)<(s|0)){h=t+2-a&-2;u=(a>>1)+2&-2;u=(h|0)>(u|0)?h:u;if((u|0)>(2147483647-a|0)){h=Qe(1)|0;ze(h|0,48,0)}g=o[e>>2]|0;h=u+a|0;o[c>>2]=h;h=On(g,h)|0;o[e>>2]=h;if((h|0)==0?(o[(Ye()|0)>>2]|0)==12:0){g=Qe(1)|0;ze(g|0,48,0)}}a=o[i>>2]|0;if((a|0)<(s|0))do{c=(o[e>>2]|0)+a|0;if(c)n[c>>0]=0;a=a+1|0}while((a|0)!=(s|0));o[i>>2]=s;g=o[e>>2]|0;g=g+t|0;n[g>>0]=r;l=A;return}function or(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0,c=0,h=0,g=0,f=0;r=l;l=l+16|0;s=r;o[s>>2]=t;A=e+12|0;i=t+1|0;n=e+16|0;if((o[n>>2]|0)<(i|0)){c=e+20|0;a=o[c>>2]|0;if((a|0)<(i|0)){g=t+2-a&-2;h=(a>>1)+2&-2;h=(g|0)>(h|0)?g:h;if((h|0)>(2147483647-a|0)){g=Qe(1)|0;ze(g|0,48,0)}f=o[A>>2]|0;g=h+a|0;o[c>>2]=g;g=On(f,g<<2)|0;o[A>>2]=g;if((g|0)==0?(o[(Ye()|0)>>2]|0)==12:0){f=Qe(1)|0;ze(f|0,48,0)}}a=o[n>>2]|0;if((i|0)>(a|0))oi((o[A>>2]|0)+(a<<2)|0,-1,i-a<<2|0)|0;o[n>>2]=i}o[(o[A>>2]|0)+(t<<2)>>2]=o[e+4>>2];Ar(e,s);n=o[A>>2]|0;s=o[n+(t<<2)>>2]|0;t=o[e>>2]|0;i=o[t+(s<<2)>>2]|0;if(!s){g=0;f=t+(g<<2)|0;o[f>>2]=i;f=n+(i<<2)|0;o[f>>2]=g;l=r;return}e=e+28|0;while(1){A=s;s=s+-1>>1;a=t+(s<<2)|0;c=o[a>>2]|0;f=o[o[e>>2]>>2]|0;if(!(+u[f+(i<<3)>>3]>+u[f+(c<<3)>>3])){e=14;break}o[t+(A<<2)>>2]=c;o[n+(o[a>>2]<<2)>>2]=A;if(!s){A=0;e=14;break}}if((e|0)==14){f=t+(A<<2)|0;o[f>>2]=i;f=n+(i<<2)|0;o[f>>2]=A;l=r;return}}function sr(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0;r=l;n=e+4|0;i=o[n>>2]|0;s=e+8|0;A=o[s>>2]|0;if((i|0)==(A|0)&(A|0)<(i+1|0)){A=(i>>1)+2&-2;A=(A|0)<2?2:A;if((A|0)>(2147483647-i|0)){A=Qe(1)|0;ze(A|0,48,0)}a=o[e>>2]|0;i=A+i|0;o[s>>2]=i;i=On(a,i<<2)|0;o[e>>2]=i;if((i|0)==0?(o[(Ye()|0)>>2]|0)==12:0){a=Qe(1)|0;ze(a|0,48,0)}}else i=o[e>>2]|0;a=o[n>>2]|0;o[n>>2]=a+1;n=i+(a<<2)|0;if(!n){l=r;return}o[n>>2]=o[t>>2];l=r;return}function Ar(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0;r=l;n=e+4|0;i=o[n>>2]|0;s=e+8|0;A=o[s>>2]|0;if((i|0)==(A|0)&(A|0)<(i+1|0)){A=(i>>1)+2&-2;A=(A|0)<2?2:A;if((A|0)>(2147483647-i|0)){A=Qe(1)|0;ze(A|0,48,0)}a=o[e>>2]|0;i=A+i|0;o[s>>2]=i;i=On(a,i<<2)|0;o[e>>2]=i;if((i|0)==0?(o[(Ye()|0)>>2]|0)==12:0){a=Qe(1)|0;ze(a|0,48,0)}}else i=o[e>>2]|0;a=o[n>>2]|0;o[n>>2]=a+1;n=i+(a<<2)|0;if(!n){l=r;return}o[n>>2]=o[t>>2];l=r;return}function ar(e,t,r){e=e|0;t=t|0;r=r|0;var i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0;r=l;l=l+16|0;i=r+2|0;A=r+1|0;s=r;if((t|0)<16){s=t+-1|0;if((s|0)>0)A=0;else{l=r;return}do{i=A;A=A+1|0;if((A|0)<(t|0)){c=i;a=A;do{c=(o[e+(a<<2)>>2]|0)<(o[e+(c<<2)>>2]|0)?a:c;a=a+1|0}while((a|0)!=(t|0))}else c=i;g=e+(i<<2)|0;f=o[g>>2]|0;p=e+(c<<2)|0;o[g>>2]=o[p>>2];o[p>>2]=f}while((A|0)!=(s|0));l=r;return}a=o[e+(((t|0)/2|0)<<2)>>2]|0;h=-1;g=t;while(1){do{h=h+1|0;u=e+(h<<2)|0;c=o[u>>2]|0}while((c|0)<(a|0));do{g=g+-1|0;f=e+(g<<2)|0;p=o[f>>2]|0}while((a|0)<(p|0));if((h|0)>=(g|0))break;o[u>>2]=p;o[f>>2]=c}n[i+0>>0]=n[A+0>>0]|0;ar(e,h,i);p=t-h|0;n[i+0>>0]=n[s+0>>0]|0;ar(u,p,i);l=r;return}function cr(e,t,r){e=e|0;t=t|0;r=r|0;var n=0,i=0,A=0,a=0,u=0,h=0;n=l;a=r&1;A=s[e+16>>0]|0|a;i=t+4|0;u=((A+(o[i>>2]|0)<<2)+4|0)>>>2;h=e+4|0;er(e,u+(o[h>>2]|0)|0);r=o[h>>2]|0;u=u+r|0;o[h>>2]=u;if(u>>>0>>0)ze(Qe(1)|0,48,0);e=(o[e>>2]|0)+(r<<2)|0;if(!e){l=n;return r|0}A=A<<3|a<<2;o[e>>2]=o[e>>2]&-32|A;A=o[i>>2]<<5|A;o[e>>2]=A;if((o[i>>2]|0)>0){A=o[t>>2]|0;t=0;do{o[e+(t<<2)+4>>2]=o[A+(t<<2)>>2];t=t+1|0}while((t|0)<(o[i>>2]|0));A=o[e>>2]|0}if(!(A&8)){l=n;return r|0}i=A>>>5;if(A&4){c[e+(i<<2)+4>>2]=0.0;l=n;return r|0}if(!i){i=0;A=0}else{A=0;t=0;do{A=1<<((o[e+(t<<2)+4>>2]|0)>>>1&31)|A;t=t+1|0}while((t|0)<(i|0))}o[e+(i<<2)+4>>2]=A;l=n;return r|0}function ur(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0;r=l;n=e+4|0;i=o[n>>2]|0;s=e+8|0;A=o[s>>2]|0;if((i|0)==(A|0)&(A|0)<(i+1|0)){A=(i>>1)+2&-2;A=(A|0)<2?2:A;if((A|0)>(2147483647-i|0)){A=Qe(1)|0;ze(A|0,48,0)}a=o[e>>2]|0;i=A+i|0;o[s>>2]=i;i=On(a,i<<3)|0;o[e>>2]=i;if((i|0)==0?(o[(Ye()|0)>>2]|0)==12:0){a=Qe(1)|0;ze(a|0,48,0)}}else i=o[e>>2]|0;a=o[n>>2]|0;o[n>>2]=a+1;n=i+(a<<3)|0;if(!n){l=r;return}s=t;A=o[s+4>>2]|0;a=n;o[a>>2]=o[s>>2];o[a+4>>2]=A;l=r;return}function lr(e){e=e|0;var t=0,r=0,n=0,i=0,s=0,A=0,a=0,c=0,h=0,g=0,f=0,p=0,d=0.0,C=0.0,E=0;t=l;r=o[e>>2]|0;i=o[r>>2]|0;a=e+4|0;f=o[r+((o[a>>2]|0)+-1<<2)>>2]|0;o[r>>2]=f;n=o[e+12>>2]|0;o[n+(f<<2)>>2]=0;o[n+(i<<2)>>2]=-1;f=(o[a>>2]|0)+-1|0;o[a>>2]=f;if((f|0)<=1){l=t;return i|0}s=o[r>>2]|0;c=e+28|0;e=0;h=1;while(1){g=(e<<1)+2|0;if((g|0)<(f|0)){p=o[r+(g<<2)>>2]|0;E=o[r+(h<<2)>>2]|0;f=o[o[c>>2]>>2]|0;d=+u[f+(p<<3)>>3];C=+u[f+(E<<3)>>3];if(!(d>C)){p=E;d=C;A=6}}else{f=o[o[c>>2]>>2]|0;A=o[r+(h<<2)>>2]|0;p=A;d=+u[f+(A<<3)>>3];A=6}if((A|0)==6){A=0;g=h}if(!(d>+u[f+(s<<3)>>3]))break;o[r+(e<<2)>>2]=p;o[n+(p<<2)>>2]=e;h=g<<1|1;f=o[a>>2]|0;if((h|0)>=(f|0)){e=g;break}else e=g}o[r+(e<<2)>>2]=s;o[n+(s<<2)>>2]=e;l=t;return i|0}function hr(e,t,r){e=e|0;t=t|0;r=r|0;var i=0,s=0,A=0,a=0,c=0,u=0,h=0;i=l;c=o[t>>2]|0;t=c+1|0;s=e+4|0;if((o[s>>2]|0)>=(t|0)){l=i;return}a=e+8|0;A=o[a>>2]|0;if((A|0)<(t|0)){u=c+2-A&-2;c=(A>>1)+2&-2;c=(u|0)>(c|0)?u:c;if((c|0)>(2147483647-A|0)){u=Qe(1)|0;ze(u|0,48,0)}h=o[e>>2]|0;u=c+A|0;o[a>>2]=u;u=On(h,u)|0;o[e>>2]=u;if((u|0)==0?(o[(Ye()|0)>>2]|0)==12:0){h=Qe(1)|0;ze(h|0,48,0)}}A=o[s>>2]|0;if((A|0)<(t|0))do{n[(o[e>>2]|0)+A>>0]=r;A=A+1|0}while((A|0)!=(t|0));o[s>>2]=t;l=i;return}function gr(e,t,r){e=e|0;t=t|0;r=r|0;var n=0,i=0,s=0,A=0,a=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0;n=l;l=l+16|0;s=n+8|0;i=n+4|0;A=n;if((t|0)<16){i=t+-1|0;if((i|0)<=0){l=n;return}s=o[r>>2]|0;r=0;do{A=r;r=r+1|0;if((r|0)<(t|0)){a=o[s>>2]|0;h=A;u=r;do{g=a+(o[e+(u<<2)>>2]<<2)|0;m=o[g>>2]|0;d=m>>>5;if(m>>>0>95){f=a+(o[e+(h<<2)>>2]<<2)|0;p=(o[f>>2]|0)>>>5;if((p|0)==2)h=u;else h=+c[g+(d<<2)+4>>2]<+c[f+(p<<2)+4>>2]?u:h}u=u+1|0}while((u|0)!=(t|0))}else h=A;E=e+(A<<2)|0;I=o[E>>2]|0;m=e+(h<<2)|0;o[E>>2]=o[m>>2];o[m>>2]=I}while((r|0)!=(i|0));l=n;return}a=o[e+(((t|0)/2|0)<<2)>>2]|0;d=-1;f=t;while(1){I=d+1|0;p=e+(I<<2)|0;m=o[p>>2]|0;u=o[r>>2]|0;h=o[u>>2]|0;E=h+(m<<2)|0;C=o[E>>2]|0;d=h+(a<<2)|0;g=o[d>>2]|0;e:do{if(C>>>0>95)while(1){y=g>>>5;if((y|0)!=2?!(+c[E+(C>>>5<<2)+4>>2]<+c[d+(y<<2)+4>>2]):0){d=I;break e}I=I+1|0;p=e+(I<<2)|0;m=o[p>>2]|0;E=h+(m<<2)|0;C=o[E>>2]|0;if(C>>>0<=95){d=I;break}}else d=I}while(0);f=f+-1|0;E=e+(f<<2)|0;C=h+(a<<2)|0;e:do{if(g>>>0>95)while(1){I=h+(o[E>>2]<<2)|0;y=(o[I>>2]|0)>>>5;if((y|0)!=2?!(+c[C+(g>>>5<<2)+4>>2]<+c[I+(y<<2)+4>>2]):0)break e;y=f+-1|0;E=e+(y<<2)|0;f=y}}while(0);if((d|0)>=(f|0))break;o[p>>2]=o[E>>2];o[E>>2]=m}o[i>>2]=u;o[s+0>>2]=o[i+0>>2];gr(e,d,s);y=t-d|0;o[A>>2]=u;o[s+0>>2]=o[A+0>>2];gr(p,y,s);l=n;return}function fr(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0,c=0,h=0,g=0,f=0,p=0,d=0.0,C=0.0,E=0;n=l;i=e+4|0;A=o[i>>2]|0;s=o[e>>2]|0;if((A|0)>0){c=o[e+12>>2]|0;a=0;do{o[c+(o[s+(a<<2)>>2]<<2)>>2]=-1;a=a+1|0;A=o[i>>2]|0}while((a|0)<(A|0))}if(s){o[i>>2]=0;A=0}s=t+4|0;if((o[s>>2]|0)>0){a=e+12|0;A=0;do{E=(o[t>>2]|0)+(A<<2)|0;o[(o[a>>2]|0)+(o[E>>2]<<2)>>2]=A;Ar(e,E);A=A+1|0}while((A|0)<(o[s>>2]|0));A=o[i>>2]|0}if((A|0)<=1){l=n;return}s=o[e>>2]|0;t=e+28|0;e=e+12|0;f=A;a=(A|0)/2|0;while(1){a=a+-1|0;A=o[s+(a<<2)>>2]|0;h=a<<1|1;e:do{if((h|0)<(f|0)){c=a;while(1){g=(c<<1)+2|0;if((g|0)<(f|0)){p=o[s+(g<<2)>>2]|0;E=o[s+(h<<2)>>2]|0;f=o[o[t>>2]>>2]|0;d=+u[f+(p<<3)>>3];C=+u[f+(E<<3)>>3];if(!(d>C)){p=E;d=C;r=16}}else{f=o[o[t>>2]>>2]|0;r=o[s+(h<<2)>>2]|0;p=r;d=+u[f+(r<<3)>>3];r=16}if((r|0)==16){r=0;g=h}if(!(d>+u[f+(A<<3)>>3]))break e;o[s+(c<<2)>>2]=p;o[(o[e>>2]|0)+(p<<2)>>2]=c;h=g<<1|1;f=o[i>>2]|0;if((h|0)>=(f|0)){c=g;break}else c=g}}else c=a}while(0);o[s+(c<<2)>>2]=A;o[(o[e>>2]|0)+(A<<2)>>2]=c;if((a|0)<=0)break;f=o[i>>2]|0}l=n;return}function pr(e){e=e|0;var t=0,r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0;r=l;t=e+36|0;u=o[t>>2]|0;i=e+32|0;g=o[i>>2]|0;if((u|0)>0){A=e+16|0;s=e+44|0;a=0;do{c=g+(a<<2)|0;h=o[c>>2]|0;if(n[(o[A>>2]|0)+h>>0]|0){g=o[e>>2]|0;u=g+(h*12|0)+4|0;p=o[u>>2]|0;if((p|0)>0){h=g+(h*12|0)|0;g=0;f=0;do{d=o[h>>2]|0;C=d+(g<<3)|0;if((o[(o[o[s>>2]>>2]|0)+(o[C>>2]<<2)>>2]&3|0)!=1){E=C;C=o[E+4>>2]|0;p=d+(f<<3)|0;o[p>>2]=o[E>>2];o[p+4>>2]=C;p=o[u>>2]|0;f=f+1|0}g=g+1|0}while((g|0)<(p|0))}else{g=0;f=0}h=g-f|0;if((h|0)>0)o[u>>2]=p-h;n[(o[A>>2]|0)+(o[c>>2]|0)>>0]=0;u=o[t>>2]|0;g=o[i>>2]|0}a=a+1|0}while((a|0)<(u|0))}if(!g){l=r;return}o[t>>2]=0;l=r;return}function dr(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,A=0,a=0;n=l;A=o[t>>2]|0;i=A>>>2&1|(s[e+16>>0]|0);A=((i+(A>>>5)<<2)+4|0)>>>2;a=e+4|0;er(e,A+(o[a>>2]|0)|0);r=o[a>>2]|0;A=A+r|0;o[a>>2]=A;if(A>>>0>>0)ze(Qe(1)|0,48,0);e=(o[e>>2]|0)+(r<<2)|0;if(!e){l=n;return r|0}i=o[t>>2]&-9|i<<3;o[e>>2]=i;if((o[t>>2]|0)>>>0>31){i=0;do{o[e+(i<<2)+4>>2]=o[t+(i<<2)+4>>2];i=i+1|0}while((i|0)<((o[t>>2]|0)>>>5|0));i=o[e>>2]|0}if(!(i&8)){l=n;return r|0}A=i>>>5;t=t+(A<<2)+4|0;if(!(i&4)){o[e+(A<<2)+4>>2]=o[t>>2];l=n;return r|0}else{c[e+(A<<2)+4>>2]=+c[t>>2];l=n;return r|0}return 0}function Cr(e){e=e|0;var t=0,r=0,i=0,s=0,A=0,a=0;t=l;l=l+16|0;s=t;Dt(e);o[e>>2]=3424;o[e+684>>2]=o[719];o[e+688>>2]=o[747];o[e+692>>2]=o[785];u[e+696>>3]=+u[411];n[e+704>>0]=n[2652]|0;n[e+705>>0]=n[2724]|0;n[e+706>>0]=n[2804]|0;n[e+707>>0]=1;o[e+708>>2]=0;o[e+712>>2]=0;o[e+716>>2]=0;o[e+720>>2]=1;n[e+724>>0]=1;r=e+732|0;a=e+544|0;o[e+760>>2]=0;o[e+764>>2]=0;o[e+768>>2]=0;o[e+776>>2]=0;o[e+780>>2]=0;o[e+784>>2]=0;o[e+792>>2]=0;o[e+796>>2]=0;o[e+800>>2]=0;A=e+804|0;o[r+0>>2]=0;o[r+4>>2]=0;o[r+8>>2]=0;o[r+12>>2]=0;o[r+16>>2]=0;o[r+20>>2]=0;o[A>>2]=a;A=e+808|0;o[A>>2]=0;o[e+812>>2]=0;o[e+816>>2]=0;r=e+824|0;o[r+0>>2]=0;o[r+4>>2]=0;o[r+8>>2]=0;o[r+12>>2]=0;o[r+16>>2]=0;o[r+20>>2]=0;o[e+852>>2]=A;Lr(e+856|0,1);A=e+868|0;r=e+892|0;o[e+920>>2]=0;o[e+924>>2]=0;o[A+0>>2]=0;o[A+4>>2]=0;o[A+8>>2]=0;o[A+12>>2]=0;o[A+16>>2]=0;o[r+0>>2]=0;o[r+4>>2]=0;o[r+8>>2]=0;o[r+12>>2]=0;o[r+16>>2]=0;o[r+20>>2]=0;r=s+4|0;o[r>>2]=0;A=s+8|0;o[A>>2]=2;i=On(0,8)|0;o[s>>2]=i;if((i|0)==0?(o[(Ye()|0)>>2]|0)==12:0)ze(Qe(1)|0,48,0);o[i>>2]=-2;o[r>>2]=1;n[e+560>>0]=1;o[e+928>>2]=cr(a,s,0)|0;n[e+536>>0]=0;if(!i){l=t;return}o[r>>2]=0;_n(i);o[s>>2]=0;o[A>>2]=0;l=t;return}function Er(e){e=e|0;var t=0;t=l;Ir(e);un(e);l=t;return}function Ir(e){e=e|0;var t=0,r=0,n=0;t=l;o[e>>2]=3424;r=e+904|0;n=o[r>>2]|0;if(n){o[e+908>>2]=0;_n(n);o[r>>2]=0;o[e+912>>2]=0}r=e+892|0;n=o[r>>2]|0;if(n){o[e+896>>2]=0;_n(n);o[r>>2]=0;o[e+900>>2]=0}r=e+876|0;n=o[r>>2]|0;if(n){o[e+880>>2]=0;_n(n);o[r>>2]=0;o[e+884>>2]=0}r=e+856|0;n=o[r>>2]|0;if(n){o[e+860>>2]=0;_n(n);o[r>>2]=0;o[e+864>>2]=0}n=e+836|0;r=o[n>>2]|0;if(r){o[e+840>>2]=0;_n(r);o[n>>2]=0;o[e+844>>2]=0}r=e+824|0;n=o[r>>2]|0;if(n){o[e+828>>2]=0;_n(n);o[r>>2]=0;o[e+832>>2]=0}r=e+808|0;n=o[r>>2]|0;if(n){o[e+812>>2]=0;_n(n);o[r>>2]=0;o[e+816>>2]=0}Tr(e+760|0);r=e+744|0;n=o[r>>2]|0;if(n){o[e+748>>2]=0;_n(n);o[r>>2]=0;o[e+752>>2]=0}r=e+732|0;n=o[r>>2]|0;if(!n){St(e);l=t;return}o[e+736>>2]=0;_n(n);o[r>>2]=0;o[e+740>>2]=0;St(e);l=t;return}function mr(e,t,r){e=e|0;t=t|0;r=r|0;var i=0,s=0,A=0,a=0,c=0,u=0;i=l;l=l+32|0;A=i+12|0;c=i+8|0;u=i+16|0;s=i+4|0;a=i;n[u>>0]=n[t>>0]|0;n[A+0>>0]=n[u+0>>0]|0;r=kt(e,A,r)|0;o[c>>2]=r;ir(e+876|0,r,0);ir(e+904|0,r,0);if(!(n[e+724>>0]|0)){l=i;return r|0}u=e+808|0;t=r<<1;o[s>>2]=t;o[A+0>>2]=o[s+0>>2];Pr(u,A,0);o[a>>2]=t|1;o[A+0>>2]=o[a+0>>2];Pr(u,A,0);Ur(e+760|0,c);ir(e+744|0,r,0);_r(e+824|0,r);l=i;return r|0}function yr(e,t,r,i){e=e|0;t=t|0;r=r|0;i=i|0;var A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0,w=0,B=0;c=l;l=l+32|0;A=c+4|0;C=c;p=c+16|0;o[A>>2]=0;a=A+4|0;o[a>>2]=0;u=A+8|0;o[u>>2]=0;E=n[2608]|0;n[e>>0]=E;h=t+724|0;r=(s[h>>0]&(r&1)|0)!=0;if(r){m=t+308|0;B=o[m>>2]|0;if((B|0)>0){I=t+304|0;E=t+876|0;y=0;do{w=o[(o[I>>2]|0)+(y<<2)>>2]>>1;o[C>>2]=w;w=(o[E>>2]|0)+w|0;if(!(n[w>>0]|0)){n[w>>0]=1;Ar(A,C);B=o[m>>2]|0}y=y+1|0}while((y|0)<(B|0))}C=(wr(t,i)|0)&1^1;n[e>>0]=C;i=n[2608]|0}else{i=E;C=E}B=i&255;if(!((B>>>1^1)&C<<24>>24==i<<24>>24|B&2&(C&255))){if((o[t+44>>2]|0)>0)Ue(3760)|0}else{qt(p,t);C=n[p>>0]|0;n[e>>0]=C}w=n[2608]|0;B=w&255;if((((B>>>1^1)&C<<24>>24==w<<24>>24|B&2&(C&255)|0)!=0?(n[t+707>>0]|0)!=0:0)?(d=(o[t+736>>2]|0)+-1|0,(d|0)>0):0){e=t+732|0;p=t+4|0;do{i=o[e>>2]|0;m=o[i+(d<<2)>>2]|0;y=d+-1|0;w=o[i+(y<<2)>>2]|0;d=o[p>>2]|0;e:do{if((m|0)>1){E=n[2616]|0;C=E&255;I=C&2;C=C>>>1^1;B=y;while(1){w=s[d+(w>>1)>>0]^w&1;y=m+-1|0;if(!((w&255)<<24>>24==E<<24>>24&C|I&w))break e;m=B+-1|0;w=o[i+(m<<2)>>2]|0;if((y|0)>1){B=m;m=y}else{B=m;m=y;f=20;break}}}else{B=y;f=20}}while(0);if((f|0)==20){f=0;n[d+(w>>1)>>0]=(w&1^1)&255^1}d=B-m|0}while((d|0)>0)}if(r?(g=o[a>>2]|0,(g|0)>0):0){f=o[A>>2]|0;r=t+876|0;p=0;do{e=o[f+(p<<2)>>2]|0;n[(o[r>>2]|0)+e>>0]=0;if(n[h>>0]|0)Or(t,e);p=p+1|0}while((p|0)<(g|0))}t=o[A>>2]|0;if(!t){l=c;return}o[a>>2]=0;_n(t);o[A>>2]=0;o[u>>2]=0;l=c;return}function wr(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0,h=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0,w=0,B=0,Q=0,v=0,D=0,b=0,S=0,k=0,x=0,F=0,M=0,N=0,R=0,K=0;c=l;l=l+16|0;A=c;if(!(Jt(e)|0)){N=0;l=c;return N|0}a=e+724|0;if(!(n[a>>0]|0)){N=1;l=c;return N|0}B=e+924|0;y=e+872|0;w=e+868|0;m=e+860|0;C=e+680|0;Q=e+824|0;s=e+828|0;f=e+836|0;v=e+904|0;D=e+332|0;r=e+44|0;b=e+704|0;k=e+706|0;x=e+696|0;p=e+556|0;d=e+548|0;S=e+876|0;E=e+920|0;I=e+284|0;e:while(1){if(((o[B>>2]|0)<=0?(o[E>>2]|0)>=(o[I>>2]|0):0)?(o[s>>2]|0)<=0:0)break;Sr(e);M=o[y>>2]|0;N=o[w>>2]|0;F=M-N|0;if((M|0)<(N|0))F=(o[m>>2]|0)+F|0;if(!((F|0)<=0?(o[E>>2]|0)>=(o[I>>2]|0):0))h=11;if((h|0)==11?(h=0,!(kr(e,1)|0)):0){h=12;break}N=o[s>>2]|0;if(n[C>>0]|0){h=15;break}if(!N)continue;else F=0;while(1){K=o[Q>>2]|0;M=o[K>>2]|0;R=o[K+(N+-1<<2)>>2]|0;o[K>>2]=R;N=o[f>>2]|0;o[N+(R<<2)>>2]=0;o[N+(M<<2)>>2]=-1;N=(o[s>>2]|0)+-1|0;o[s>>2]=N;if((N|0)>1)jr(Q,0);if(n[C>>0]|0)continue e;if((n[(o[v>>2]|0)+M>>0]|0)==0?(R=n[(o[D>>2]|0)+M>>0]|0,N=n[2624]|0,K=N&255,((K>>>1^1)&R<<24>>24==N<<24>>24|R&2&K|0)!=0):0){if((o[r>>2]|0)>1&((F|0)%100|0|0)==0){o[A>>2]=o[s>>2];_e(3504,A|0)|0}if(n[b>>0]|0){K=(o[S>>2]|0)+M|0;N=n[K>>0]|0;n[K>>0]=1;if(!(Fr(e,M)|0)){h=29;break e}n[(o[S>>2]|0)+M>>0]=N<<24>>24!=0&1}if((((n[k>>0]|0)!=0?(R=n[(o[D>>2]|0)+M>>0]|0,N=n[2624]|0,K=N&255,((K>>>1^1)&R<<24>>24==N<<24>>24|R&2&K|0)!=0):0)?(n[(o[S>>2]|0)+M>>0]|0)==0:0)?!(Mr(e,M)|0):0){h=35;break e}if(+((o[p>>2]|0)>>>0)>+u[x>>3]*+((o[d>>2]|0)>>>0))ji[o[(o[e>>2]|0)+8>>2]&31](e)}N=o[s>>2]|0;if(!N)continue e;else F=F+1|0}}do{if((h|0)==12)n[e+492>>0]=0;else if((h|0)==15){C=o[e+824>>2]|0;if((N|0)<=0){if(!C)break}else{I=o[f>>2]|0;E=0;do{o[I+(o[C+(E<<2)>>2]<<2)>>2]=-1;E=E+1|0}while((E|0)<(o[s>>2]|0))}o[s>>2]=0}else if((h|0)==29)n[e+492>>0]=0;else if((h|0)==35)n[e+492>>0]=0}while(0);if(!t){if(+((o[p>>2]|0)>>>0)>+u[e+96>>3]*+((o[d>>2]|0)>>>0))ji[o[(o[e>>2]|0)+8>>2]&31](e)}else{t=e+744|0;p=o[t>>2]|0;if(p){o[e+748>>2]=0;_n(p);o[t>>2]=0;o[e+752>>2]=0}Yr(e+760|0,1);t=e+808|0;p=o[t>>2]|0;if(p){o[e+812>>2]=0;_n(p);o[t>>2]=0;o[e+816>>2]=0}p=e+824|0;t=o[p>>2]|0;if((o[s>>2]|0)<=0){if(t)h=48}else{h=o[f>>2]|0;f=0;do{o[h+(o[t+(f<<2)>>2]<<2)>>2]=-1;f=f+1|0}while((f|0)<(o[s>>2]|0));h=48}if((h|0)==48){o[s>>2]=0;_n(t);o[p>>2]=0;o[e+832>>2]=0}Gr(e+856|0,1);n[a>>0]=0;n[e+536>>0]=1;n[e+560>>0]=0;o[e+728>>2]=o[e+540>>2];Gt(e);ji[o[(o[e>>2]|0)+8>>2]&31](e)}if((o[r>>2]|0)>0?(i=o[e+736>>2]|0,(i|0)>0):0){u[g>>3]=+(i<<2>>>0)*9.5367431640625e-7;o[A>>2]=o[g>>2];o[A+4>>2]=o[g+4>>2];_e(3528,A|0)|0}K=(n[e+492>>0]|0)!=0;l=c;return K|0}function Br(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0;r=l;l=l+16|0;s=r;a=e+256|0;c=e+260|0;A=o[c>>2]|0;if((n[e+705>>0]|0)!=0?Qr(e,t)|0:0){p=1;l=r;return p|0}if(!(xt(e,t)|0)){p=0;l=r;return p|0}if(!(n[e+724>>0]|0)){p=1;l=r;return p|0}t=o[c>>2]|0;if((t|0)!=(A+1|0)){p=1;l=r;return p|0}p=o[(o[a>>2]|0)+(t+-1<<2)>>2]|0;o[s>>2]=p;h=(o[e+544>>2]|0)+(p<<2)|0;Jr(e+856|0,p);if((o[h>>2]|0)>>>0<=31){p=1;l=r;return p|0}u=e+760|0;c=e+808|0;a=e+744|0;A=e+924|0;t=e+824|0;g=e+840|0;e=e+836|0;f=0;do{p=h+(f<<2)+4|0;Hr((o[u>>2]|0)+((o[p>>2]>>1)*12|0)|0,s);d=(o[c>>2]|0)+(o[p>>2]<<2)|0;o[d>>2]=(o[d>>2]|0)+1;n[(o[a>>2]|0)+(o[p>>2]>>1)>>0]=1;o[A>>2]=(o[A>>2]|0)+1;p=o[p>>2]>>1;if((o[g>>2]|0)>(p|0)?(i=o[(o[e>>2]|0)+(p<<2)>>2]|0,(i|0)>-1):0)jr(t,i);f=f+1|0}while((f|0)<((o[h>>2]|0)>>>5|0));i=1;l=r;return i|0}function Qr(e,t){e=e|0;t=t|0;var r=0,i=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0;c=l;l=l+16|0;A=c+8|0;a=c+4|0;i=c;o[a>>2]=o[e+284>>2];Ar(e+292|0,a);a=t+4|0;h=o[a>>2]|0;e:do{if((h|0)>0){r=e+332|0;u=0;while(1){g=o[(o[t>>2]|0)+(u<<2)>>2]|0;p=s[(o[r>>2]|0)+(g>>1)>>0]|0;d=p^g&1;f=d&255;E=n[2608]|0;C=E&255;if(f<<24>>24==E<<24>>24&(C>>>1^1)|C&2&d)break;C=n[2616]|0;E=C&255;if(!((E>>>1^1)&f<<24>>24==C<<24>>24|p&2&E)){o[i>>2]=g^1;o[A+0>>2]=o[i+0>>2];Ft(e,A,-1);h=o[a>>2]|0}u=u+1|0;if((u|0)>=(h|0))break e}Tt(e,0);E=1;l=c;return E|0}}while(0);E=(Mt(e)|0)!=-1;Tt(e,0);l=c;return E|0}function vr(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0;r=l;l=l+16|0;s=r;i=(o[e+544>>2]|0)+(t<<2)|0;if(!(n[e+724>>0]|0)){Kt(e,t);l=r;return}if((o[i>>2]|0)>>>0<=31){Kt(e,t);l=r;return}a=e+808|0;c=e+776|0;A=e+792|0;u=0;do{h=i+(u<<2)+4|0;g=(o[a>>2]|0)+(o[h>>2]<<2)|0;o[g>>2]=(o[g>>2]|0)+-1;Or(e,o[h>>2]>>1);h=o[h>>2]>>1;o[s>>2]=h;h=(o[c>>2]|0)+h|0;if(!(n[h>>0]|0)){n[h>>0]=1;Ar(A,s)}u=u+1|0}while((u|0)<((o[i>>2]|0)>>>5|0));Kt(e,t);l=r;return}function Dr(e,t,r){e=e|0;t=t|0;r=r|0;var i=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0;i=l;l=l+16|0;a=i+4|0;A=i;u=o[e+544>>2]|0;c=u+(t<<2)|0;Jr(e+856|0,t);if((o[c>>2]&-32|0)==64){vr(e,t);p=o[r>>2]|0;r=o[c>>2]|0;e:do{if(r>>>0>31){h=r>>>5;g=0;while(1){f=g+1|0;if((o[c+(g<<2)+4>>2]|0)==(p|0)){f=g;break e}if((f|0)<(h|0))g=f;else break}}else{h=0;f=0}}while(0);g=h+-1|0;if((f|0)<(g|0))do{r=f;f=f+1|0;o[c+(r<<2)+4>>2]=o[c+(f<<2)+4>>2];r=o[c>>2]|0;h=r>>>5;g=h+-1|0}while((f|0)<(g|0));if(r&8){o[c+(g<<2)+4>>2]=o[c+(h<<2)+4>>2];r=o[c>>2]|0}h=r+-32|0;o[c>>2]=h;h=h>>>5;if(!h){h=0;r=0}else{r=0;g=0;do{r=1<<((o[c+(g<<2)+4>>2]|0)>>>1&31)|r;g=g+1|0}while((g|0)<(h|0))}o[c+(h<<2)+4>>2]=r}else{Rt(e,t,1);r=o[r>>2]|0;g=o[c>>2]|0;e:do{if(g>>>0>31){h=g>>>5;f=0;while(1){p=f+1|0;if((o[c+(f<<2)+4>>2]|0)==(r|0)){p=f;break e}if((p|0)<(h|0))f=p;else break}}else{h=0;p=0}}while(0);f=h+-1|0;if((p|0)<(f|0))do{g=p;p=p+1|0;o[c+(g<<2)+4>>2]=o[c+(p<<2)+4>>2];g=o[c>>2]|0;h=g>>>5;f=h+-1|0}while((p|0)<(f|0));if(g&8){o[c+(f<<2)+4>>2]=o[c+(h<<2)+4>>2];g=o[c>>2]|0}f=g+-32|0;o[c>>2]=f;f=f>>>5;if(!f){f=0;h=0}else{h=0;g=0;do{h=1<<((o[c+(g<<2)+4>>2]|0)>>>1&31)|h;g=g+1|0}while((g|0)<(f|0))}o[c+(f<<2)+4>>2]=h;Nt(e,t);h=r>>1;g=o[e+760>>2]|0;f=g+(h*12|0)|0;g=g+(h*12|0)+4|0;p=o[g>>2]|0;e:do{if((p|0)>0){E=o[f>>2]|0;d=0;while(1){C=d+1|0;if((o[E+(d<<2)>>2]|0)==(t|0))break e;if((C|0)<(p|0))d=C;else{d=C;break}}}else d=0}while(0);p=p+-1|0;if((d|0)<(p|0)){f=o[f>>2]|0;do{p=d;d=d+1|0;o[f+(p<<2)>>2]=o[f+(d<<2)>>2];p=(o[g>>2]|0)+-1|0}while((d|0)<(p|0))}o[g>>2]=p;E=(o[e+808>>2]|0)+(r<<2)|0;o[E>>2]=(o[E>>2]|0)+-1;Or(e,h)}if((o[c>>2]&-32|0)!=32){E=1;l=i;return E|0}u=o[u+(t+1<<2)>>2]|0;c=s[(o[e+332>>2]|0)+(u>>1)>>0]|0;E=c^u&1;t=E&255;d=n[2624]|0;C=d&255;if(!(t<<24>>24==d<<24>>24&(C>>>1^1)|C&2&E)){C=n[2616]|0;E=C&255;if((E>>>1^1)&t<<24>>24==C<<24>>24|c&2&E){E=0;l=i;return E|0}}else{o[A>>2]=u;o[a+0>>2]=o[A+0>>2];Ft(e,a,-1)}E=(Mt(e)|0)==-1;l=i;return E|0}function br(e,t,r,n,i){e=e|0;t=t|0;r=r|0;n=n|0;i=i|0;var s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0;s=l;l=l+16|0;a=s+4|0;A=s;f=e+708|0;o[f>>2]=(o[f>>2]|0)+1;if(o[i>>2]|0)o[i+4>>2]=0;c=(o[t>>2]|0)>>>5>>>0<(o[r>>2]|0)>>>5>>>0;e=c?r:t;t=c?t:r;c=o[t>>2]|0;e:do{if(c>>>0>31){r=0;t:while(1){u=o[t+(r<<2)+4>>2]|0;r:do{if((u>>1|0)!=(n|0)){h=o[e>>2]|0;n:do{if(h>>>0>31){g=0;while(1){f=o[e+(g<<2)+4>>2]|0;g=g+1|0;if((u^f)>>>0<2)break;if((g|0)>=(h>>>5|0))break n}if((f|0)==(u^1|0)){i=0;break t}else break r}}while(0);o[a>>2]=u;sr(i,a);c=o[t>>2]|0}}while(0);r=r+1|0;if((r|0)>=(c>>>5|0))break e}l=s;return i|0}}while(0);r=o[e>>2]|0;if(r>>>0<=31){f=1;l=s;return f|0}a=0;do{t=o[e+(a<<2)+4>>2]|0;if((t>>1|0)!=(n|0)){o[A>>2]=t;sr(i,A);r=o[e>>2]|0}a=a+1|0}while((a|0)<(r>>>5|0));i=1;l=s;return i|0}function Sr(e){e=e|0;var t=0,r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0,w=0;t=l;c=e+924|0;if(!(o[c>>2]|0)){l=t;return}A=e+856|0;r=e+872|0;i=e+868|0;a=e+860|0;s=e+544|0;u=0;while(1){w=o[r>>2]|0;h=o[i>>2]|0;g=w-h|0;if((w|0)<(h|0))g=(o[a>>2]|0)+g|0;if((u|0)>=(g|0))break;g=(o[s>>2]|0)+(o[(o[A>>2]|0)+(((h+u|0)%(o[a>>2]|0)|0)<<2)>>2]<<2)|0;h=o[g>>2]|0;if(!(h&3))o[g>>2]=h&-4|2;u=u+1|0}u=e+540|0;d=o[u>>2]|0;if((d|0)>0){g=e+744|0;f=e+776|0;h=e+760|0;e=e+804|0;p=0;do{if(n[(o[g>>2]|0)+p>>0]|0){C=(o[f>>2]|0)+p|0;if(n[C>>0]|0){E=o[h>>2]|0;d=E+(p*12|0)+4|0;m=o[d>>2]|0;if((m|0)>0){E=o[E+(p*12|0)>>2]|0;y=0;I=0;do{w=o[E+(y<<2)>>2]|0;if((o[(o[o[e>>2]>>2]|0)+(w<<2)>>2]&3|0)!=1){o[E+(I<<2)>>2]=w;m=o[d>>2]|0;I=I+1|0}y=y+1|0}while((y|0)<(m|0))}else{y=0;I=0}E=y-I|0;if((E|0)>0)o[d>>2]=m-E;n[C>>0]=0}C=o[h>>2]|0;d=C+(p*12|0)+4|0;I=o[d>>2]|0;if((I|0)>0){C=C+(p*12|0)|0;E=0;do{m=o[(o[C>>2]|0)+(E<<2)>>2]|0;if(!(o[(o[s>>2]|0)+(m<<2)>>2]&3)){Jr(A,m);I=(o[s>>2]|0)+(o[(o[C>>2]|0)+(E<<2)>>2]<<2)|0;o[I>>2]=o[I>>2]&-4|2;I=o[d>>2]|0}E=E+1|0}while((E|0)<(I|0))}n[(o[g>>2]|0)+p>>0]=0;d=o[u>>2]|0}p=p+1|0}while((p|0)<(d|0));u=0}else u=0;while(1){w=o[r>>2]|0;h=o[i>>2]|0;g=w-h|0;if((w|0)<(h|0))g=(o[a>>2]|0)+g|0;if((u|0)>=(g|0))break;h=(o[s>>2]|0)+(o[(o[A>>2]|0)+(((h+u|0)%(o[a>>2]|0)|0)<<2)>>2]<<2)|0;g=o[h>>2]|0;if((g&3|0)==2)o[h>>2]=g&-4;u=u+1|0}o[c>>2]=0;l=t;return}function kr(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0,w=0,B=0,Q=0,v=0,D=0,b=0,S=0,k=0,x=0,F=0,M=0,N=0,R=0,K=0,L=0,T=0,P=0,U=0,_=0,O=0;r=l;l=l+16|0;h=r;B=r+12|0;s=e+856|0;u=e+872|0;d=e+868|0;a=e+860|0;m=e+680|0;i=e+920|0;A=e+284|0;I=e+280|0;C=e+544|0;E=e+928|0;f=e+44|0;g=e+776|0;y=e+692|0;p=e+804|0;c=e+760|0;S=0;F=0;k=0;e:while(1){x=o[d>>2]|0;do{D=o[u>>2]|0;b=(D|0)<(x|0);D=D-x|0;if(b)M=(o[a>>2]|0)+D|0;else M=D;if((M|0)<=0?(o[i>>2]|0)>=(o[A>>2]|0):0){i=1;a=53;break e}if(n[m>>0]|0){a=8;break e}if(b)D=(o[a>>2]|0)+D|0;if((D|0)==0?(v=o[i>>2]|0,(v|0)<(o[A>>2]|0)):0){o[i>>2]=v+1;o[(o[C>>2]|0)+((o[E>>2]|0)+1<<2)>>2]=o[(o[I>>2]|0)+(v<<2)>>2];D=(o[C>>2]|0)+(o[E>>2]<<2)|0;b=(o[D>>2]|0)>>>5;if(!b){b=0;M=0}else{M=0;x=0;do{M=1<<((o[D+(x<<2)+4>>2]|0)>>>1&31)|M;x=x+1|0}while((x|0)<(b|0))}o[D+(b<<2)+4>>2]=M;Jr(s,o[E>>2]|0);x=o[d>>2]|0}D=o[(o[s>>2]|0)+(x<<2)>>2]|0;x=x+1|0;K=o[a>>2]|0;x=(x|0)==(K|0)?0:x;o[d>>2]=x;M=o[C>>2]|0;b=M+(D<<2)|0;R=o[b>>2]|0}while((R&3|0)!=0);if(t?(o[f>>2]|0)>1:0){N=S+1|0;if(!((S|0)%1e3|0)){R=o[u>>2]|0;o[h>>2]=R-x+((R|0)<(x|0)?K:0);o[h+4>>2]=k;o[h+8>>2]=F;_e(3440,h|0)|0;R=o[b>>2]|0;S=N}else S=N}x=M+(D+1<<2)|0;M=o[x>>2]>>1;if(R>>>0>63){N=o[c>>2]|0;R=R>>>5;K=1;do{O=o[b+(K<<2)+4>>2]>>1;M=(o[N+(O*12|0)+4>>2]|0)<(o[N+(M*12|0)+4>>2]|0)?O:M;K=K+1|0}while((K|0)<(R|0))}R=(o[g>>2]|0)+M|0;if(n[R>>0]|0){K=o[c>>2]|0;N=K+(M*12|0)+4|0;P=o[N>>2]|0;if((P|0)>0){K=o[K+(M*12|0)>>2]|0;T=0;L=0;do{U=o[K+(T<<2)>>2]|0;if((o[(o[o[p>>2]>>2]|0)+(U<<2)>>2]&3|0)!=1){o[K+(L<<2)>>2]=U;P=o[N>>2]|0;L=L+1|0}T=T+1|0}while((T|0)<(P|0))}else{T=0;L=0}K=T-L|0;if((K|0)>0)o[N>>2]=P-K;n[R>>0]=0}R=o[c>>2]|0;N=o[R+(M*12|0)>>2]|0;R=R+(M*12|0)+4|0;if((o[R>>2]|0)>0)K=0;else continue;while(1){U=o[b>>2]|0;if(U&3)continue e;L=o[N+(K<<2)>>2]|0;T=o[C>>2]|0;_=T+(L<<2)|0;P=o[_>>2]|0;t:do{if(((!((P&3|0)!=0|(L|0)==(D|0))?(O=o[y>>2]|0,Q=P>>>5,(O|0)==-1|(Q|0)<(O|0)):0)?(w=U>>>5,Q>>>0>=w>>>0):0)?(o[b+(w<<2)+4>>2]&~o[_+(Q<<2)+4>>2]|0)==0:0){T=T+(L+1<<2)|0;do{if(U>>>0>31){if(P>>>0>31){_=-2;P=0}else break t;while(1){U=o[x+(P<<2)>>2]|0;r:do{if((_|0)==-2){O=0;while(1){_=o[T+(O<<2)>>2]|0;if((U|0)==(_|0)){U=-2;break r}O=O+1|0;if((U|0)==(_^1|0))break r;if(O>>>0>=Q>>>0)break t}}else{O=0;while(1){if((U|0)==(o[T+(O<<2)>>2]|0)){U=_;break r}O=O+1|0;if(O>>>0>=Q>>>0)break t}}}while(0);P=P+1|0;if(P>>>0>=w>>>0)break;else _=U}if((U|0)==-2)break;else if((U|0)==-1)break t;o[B>>2]=U^1;o[h+0>>2]=o[B+0>>2];if(!(Dr(e,L,h)|0)){i=0;a=53;break e}F=F+1|0;K=(((U>>1|0)==(M|0))<<31>>31)+K|0;break t}}while(0);vr(e,L);k=k+1|0}}while(0);K=K+1|0;if((K|0)>=(o[R>>2]|0))continue e}}if((a|0)==8){Gr(s,0);o[i>>2]=o[A>>2];O=1;l=r;return O|0}else if((a|0)==53){l=r;return i|0}return 0}function xr(e,t,r){e=e|0;t=t|0;r=r|0;var i=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0;A=l;l=l+16|0;i=A+12|0;h=A+8|0;c=A+4|0;a=A;u=(o[e+544>>2]|0)+(r<<2)|0;if(o[u>>2]&3){C=1;l=A;return C|0}if(Lt(e,u)|0){C=1;l=A;return C|0}o[h>>2]=o[e+284>>2];Ar(e+292|0,h);p=o[u>>2]|0;if(p>>>0>31){h=e+332|0;g=0;f=-2;do{d=o[u+(g<<2)+4>>2]|0;C=d>>1;if((C|0)!=(t|0)?(C=(s[(o[h>>2]|0)+C>>0]|0)^d&1,I=n[2616]|0,E=I&255,((C&255)<<24>>24==I<<24>>24&(E>>>1^1)|E&2&C|0)==0):0){o[c>>2]=d^1;o[i+0>>2]=o[c+0>>2];Ft(e,i,-1);p=o[u>>2]|0}else f=d;g=g+1|0}while((g|0)<(p>>>5|0))}else f=-2;I=(Mt(e)|0)==-1;Tt(e,0);if(!I){I=e+712|0;o[I>>2]=(o[I>>2]|0)+1;o[a>>2]=f;o[i+0>>2]=o[a+0>>2];if(!(Dr(e,r,i)|0)){I=0;l=A;return I|0}}I=1;l=A;return I|0}function Fr(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0;r=l;A=(o[e+776>>2]|0)+t|0;i=e+760|0;if(n[A>>0]|0){c=o[i>>2]|0;s=c+(t*12|0)+4|0;g=o[s>>2]|0;if((g|0)>0){a=e+804|0;c=o[c+(t*12|0)>>2]|0;h=0;u=0;do{f=o[c+(h<<2)>>2]|0;if((o[(o[o[a>>2]>>2]|0)+(f<<2)>>2]&3|0)!=1){o[c+(u<<2)>>2]=f;g=o[s>>2]|0;u=u+1|0}h=h+1|0}while((h|0)<(g|0))}else{h=0;u=0}a=h-u|0;if((a|0)>0)o[s>>2]=g-a;n[A>>0]=0}s=o[i>>2]|0;g=n[(o[e+332>>2]|0)+t>>0]|0;h=n[2624]|0;f=h&255;if(!((f>>>1^1)&g<<24>>24==h<<24>>24|g&2&f)){f=1;l=r;return f|0}i=s+(t*12|0)+4|0;A=o[i>>2]|0;if(!A){f=1;l=r;return f|0}e:do{if((A|0)>0){s=s+(t*12|0)|0;A=0;while(1){if(!(xr(e,t,o[(o[s>>2]|0)+(A<<2)>>2]|0)|0)){e=0;break}A=A+1|0;if((A|0)>=(o[i>>2]|0))break e}l=r;return e|0}}while(0);f=kr(e,0)|0;l=r;return f|0}function Mr(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0,m=0,y=0,w=0,B=0,Q=0,v=0,D=0,b=0,S=0,k=0,x=0,F=0,M=0,N=0,K=0,L=0,T=0,P=0,U=0,_=0,O=0,j=0,Y=0,G=0,J=0,H=0,q=0,z=0,W=0,V=0,X=0;r=l;l=l+48|0;E=r+36|0;C=r+32|0;I=r+28|0;m=r+24|0;i=r+12|0;s=r;g=(o[e+776>>2]|0)+t|0;h=e+760|0;if(n[g>>0]|0){d=o[h>>2]|0;f=d+(t*12|0)+4|0;Q=o[f>>2]|0;if((Q|0)>0){p=e+804|0;d=o[d+(t*12|0)>>2]|0;w=0;y=0;do{v=o[d+(w<<2)>>2]|0;if((o[(o[o[p>>2]>>2]|0)+(v<<2)>>2]&3|0)!=1){o[d+(y<<2)>>2]=v;Q=o[f>>2]|0;y=y+1|0}w=w+1|0}while((w|0)<(Q|0))}else{w=0;y=0}p=w-y|0;if((p|0)>0)o[f>>2]=Q-p;n[g>>0]=0}y=o[h>>2]|0;w=y+(t*12|0)|0;o[i>>2]=0;g=i+4|0;o[g>>2]=0;f=i+8|0;o[f>>2]=0;o[s>>2]=0;d=s+4|0;o[d>>2]=0;p=s+8|0;o[p>>2]=0;y=y+(t*12|0)+4|0;e:do{if((o[y>>2]|0)>0){Q=e+544|0;b=t<<1;D=0;do{S=(o[w>>2]|0)+(D<<2)|0;x=(o[Q>>2]|0)+(o[S>>2]<<2)|0;X=o[x>>2]|0;v=X>>>5;t:do{if(X>>>0>31){F=0;while(1){k=F+1|0;if((o[x+(F<<2)+4>>2]|0)==(b|0)){k=F;break t}if((k|0)<(v|0))F=k;else break}}else k=0}while(0);Hr((k|0)<(v|0)?i:s,S);D=D+1|0;v=o[y>>2]|0}while((D|0)<(v|0));Q=o[g>>2]|0;b=(Q|0)>0;if(b){S=o[d>>2]|0;L=(S|0)>0;K=e+544|0;k=o[i>>2]|0;D=o[s>>2]|0;x=e+708|0;N=e+684|0;M=e+688|0;O=0;F=0;while(1){if(L){P=k+(F<<2)|0;T=o[K>>2]|0;U=o[x>>2]|0;_=0;do{G=T+(o[P>>2]<<2)|0;H=T+(o[D+(_<<2)>>2]<<2)|0;U=U+1|0;o[x>>2]=U;j=(o[G>>2]|0)>>>5>>>0<(o[H>>2]|0)>>>5>>>0;Y=j?H:G;H=j?G:H;G=Y+4|0;j=H+4|0;Y=o[Y>>2]|0;J=Y>>>5;z=J+-1|0;H=o[H>>2]|0;t:do{if(H>>>0>31){q=0;while(1){X=o[j+(q<<2)>>2]|0;r:do{if((X>>1|0)!=(t|0)){n:do{if(Y>>>0>31){V=0;while(1){W=o[G+(V<<2)>>2]|0;V=V+1|0;if((W^X)>>>0<2)break;if((V|0)>=(J|0))break n}if((W|0)==(X^1|0))break t;else break r}}while(0);z=z+1|0}}while(0);q=q+1|0;if((q|0)>=(H>>>5|0)){B=28;break}}}else B=28}while(0);if((B|0)==28){B=0;if((O|0)>=((o[N>>2]|0)+v|0)){e=1;break e}X=o[M>>2]|0;if((X|0)!=-1&(z|0)>(X|0)){e=1;break e}else O=O+1|0}_=_+1|0}while((_|0)<(S|0))}F=F+1|0;if((F|0)>=(Q|0)){B=32;break}}}else{b=0;B=32}}else{Q=0;b=0;B=32}}while(0);e:do{if((B|0)==32){n[(o[e+904>>2]|0)+t>>0]=1;v=e+380|0;D=(o[v>>2]|0)+t|0;if(n[D>>0]|0){X=e+200|0;V=X;V=ai(o[V>>2]|0,o[V+4>>2]|0,-1,-1)|0;o[X>>2]=V;o[X+4>>2]=R}n[D>>0]=0;D=e+460|0;if(!((o[e+476>>2]|0)>(t|0)?(o[(o[e+472>>2]|0)+(t<<2)>>2]|0)>-1:0))B=36;if((B|0)==36?(n[(o[v>>2]|0)+t>>0]|0)!=0:0)or(D,t);B=e+716|0;o[B>>2]=(o[B>>2]|0)+1;B=o[d>>2]|0;if((Q|0)>(B|0)){D=e+732|0;if((B|0)>0){m=e+544|0;I=o[s>>2]|0;x=e+736|0;k=0;do{S=(o[m>>2]|0)+(o[I+(k<<2)>>2]<<2)|0;v=o[x>>2]|0;if((o[S>>2]|0)>>>0>31){F=0;M=-1;do{X=S+(F<<2)+4|0;o[E>>2]=o[X>>2];Hr(D,E);M=(o[X>>2]>>1|0)==(t|0)?F+v|0:M;F=F+1|0}while((F|0)<((o[S>>2]|0)>>>5|0))}else M=-1;X=o[D>>2]|0;W=X+(M<<2)|0;V=o[W>>2]|0;X=X+(v<<2)|0;o[W>>2]=o[X>>2];o[X>>2]=V;o[C>>2]=(o[S>>2]|0)>>>5;Hr(D,C);k=k+1|0}while((k|0)<(B|0))}o[E>>2]=t<<1;Hr(D,E);o[C>>2]=1;Hr(D,C)}else{k=e+732|0;if(b){F=e+544|0;x=o[i>>2]|0;v=e+736|0;M=0;do{S=(o[F>>2]|0)+(o[x+(M<<2)>>2]<<2)|0;D=o[v>>2]|0;if((o[S>>2]|0)>>>0>31){N=0;K=-1;do{X=S+(N<<2)+4|0;o[E>>2]=o[X>>2];Hr(k,E);K=(o[X>>2]>>1|0)==(t|0)?N+D|0:K;N=N+1|0}while((N|0)<((o[S>>2]|0)>>>5|0))}else K=-1;X=o[k>>2]|0;W=X+(K<<2)|0;V=o[W>>2]|0;X=X+(D<<2)|0;o[W>>2]=o[X>>2];o[X>>2]=V;o[C>>2]=(o[S>>2]|0)>>>5;Hr(k,C);M=M+1|0}while((M|0)<(Q|0))}o[I>>2]=t<<1|1;Hr(k,I);o[m>>2]=1;Hr(k,m)}if((o[y>>2]|0)>0){C=0;do{vr(e,o[(o[w>>2]|0)+(C<<2)>>2]|0);C=C+1|0}while((C|0)<(o[y>>2]|0))}C=e+628|0;t:do{if(b){E=e+544|0;w=o[i>>2]|0;D=o[s>>2]|0;if((B|0)>0)y=0;else{C=0;while(1){C=C+1|0;if((C|0)>=(Q|0))break t}}do{m=w+(y<<2)|0;I=0;do{X=o[E>>2]|0;if(br(e,X+(o[m>>2]<<2)|0,X+(o[D+(I<<2)>>2]<<2)|0,t,C)|0?!(Br(e,C)|0):0){e=0;break e}I=I+1|0}while((I|0)<(B|0));y=y+1|0}while((y|0)<(Q|0))}}while(0);C=o[h>>2]|0;h=C+(t*12|0)|0;E=o[h>>2]|0;if(E){o[C+(t*12|0)+4>>2]=0;_n(E);o[h>>2]=0;o[C+(t*12|0)+8>>2]=0}h=e+412|0;t=t<<1;E=o[h>>2]|0;C=E+(t*12|0)+4|0;if((o[C>>2]|0)==0?(u=E+(t*12|0)|0,c=o[u>>2]|0,(c|0)!=0):0){o[C>>2]=0;_n(c);o[u>>2]=0;o[E+(t*12|0)+8>>2]=0;E=o[h>>2]|0}c=t|1;u=E+(c*12|0)+4|0;if((o[u>>2]|0)==0?(a=E+(c*12|0)|0,A=o[a>>2]|0,(A|0)!=0):0){o[u>>2]=0;_n(A);o[a>>2]=0;o[E+(c*12|0)+8>>2]=0}e=kr(e,0)|0;D=o[s>>2]|0}}while(0);if(D){o[d>>2]=0;_n(D);o[s>>2]=0;o[p>>2]=0}s=o[i>>2]|0;if(!s){l=r;return e|0}o[g>>2]=0;_n(s);o[i>>2]=0;o[f>>2]=0;l=r;return e|0}function Nr(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0,E=0,I=0;r=l;if(!(n[e+724>>0]|0)){l=r;return}u=e+540|0;if((o[u>>2]|0)>0){a=e+760|0;i=e+804|0;s=e+776|0;c=e+544|0;A=0;do{g=o[a>>2]|0;h=g+(A*12|0)+4|0;p=o[h>>2]|0;if((p|0)>0){g=o[g+(A*12|0)>>2]|0;d=0;f=0;do{C=o[g+(d<<2)>>2]|0;if((o[(o[o[i>>2]>>2]|0)+(C<<2)>>2]&3|0)!=1){o[g+(f<<2)>>2]=C;p=o[h>>2]|0;f=f+1|0}d=d+1|0}while((d|0)<(p|0))}else{d=0;f=0}g=d-f|0;if((g|0)>0)o[h>>2]=p-g;n[(o[s>>2]|0)+A>>0]=0;g=o[a>>2]|0;h=g+(A*12|0)+4|0;if((o[h>>2]|0)>0){C=g+(A*12|0)|0;p=0;do{g=(o[C>>2]|0)+(p<<2)|0;f=o[g>>2]|0;d=o[c>>2]|0;E=d+(f<<2)|0;if(!(o[E>>2]&16)){I=dr(t,E)|0;o[g>>2]=I;o[E>>2]=o[E>>2]|16;o[d+(f+1<<2)>>2]=I}else o[g>>2]=o[d+(f+1<<2)>>2];p=p+1|0}while((p|0)<(o[h>>2]|0))}A=A+1|0}while((A|0)<(o[u>>2]|0))}i=e+856|0;I=o[e+872>>2]|0;s=e+868|0;h=o[s>>2]|0;c=I-h|0;if((I|0)<(h|0))c=(o[e+860>>2]|0)+c|0;e:do{if((c|0)>0){A=e+860|0;a=e+544|0;while(1){u=o[(o[i>>2]|0)+(h<<2)>>2]|0;g=h+1|0;o[s>>2]=(g|0)==(o[A>>2]|0)?0:g;g=o[a>>2]|0;f=g+(u<<2)|0;h=o[f>>2]|0;if(!(h&3)){if(!(h&16)){I=dr(t,f)|0;o[f>>2]=o[f>>2]|16;o[g+(u+1<<2)>>2]=I;u=I}else u=o[g+(u+1<<2)>>2]|0;Jr(i,u)}c=c+-1|0;if((c|0)<=0)break e;h=o[s>>2]|0}}else a=e+544|0}while(0);e=e+928|0;i=o[e>>2]|0;A=o[a>>2]|0;s=A+(i<<2)|0;if(!(o[s>>2]&16)){I=dr(t,s)|0;o[e>>2]=I;o[s>>2]=o[s>>2]|16;o[A+(i+1<<2)>>2]=I;l=r;return}else{o[e>>2]=o[A+(i+1<<2)>>2];l=r;return}}function Rr(e){e=e|0;var t=0,r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0;A=l;l=l+32|0;u=A;t=A+8|0;r=e+544|0;i=e+548|0;s=e+556|0;a=(o[i>>2]|0)-(o[s>>2]|0)|0;o[t+0>>2]=0;o[t+4>>2]=0;o[t+8>>2]=0;o[t+12>>2]=0;er(t,a);a=t+16|0;c=e+560|0;n[a>>0]=n[c>>0]|0;Nr(e,t);zt(e,t);if((o[e+44>>2]|0)>1){h=o[t+4>>2]<<2;o[u>>2]=o[i>>2]<<2;o[u+4>>2]=h;_e(3608,u|0)|0}n[c>>0]=n[a>>0]|0;a=o[r>>2]|0;if(a)_n(a);o[r>>2]=o[t>>2];o[i>>2]=o[t+4>>2];o[e+552>>2]=o[t+8>>2];o[s>>2]=o[t+12>>2];l=A;return}function Kr(){var e=0,t=0,r=0;e=l;l=l+16|0;t=e;n[2608]=0;n[2616]=1;n[2624]=2;Ct(2632,2656,2664,3744,3752);o[658]=160;n[2652]=0;Ct(2704,2728,2736,3744,3752);o[676]=160;n[2724]=0;Ct(2784,2808,2816,3744,3752);o[696]=160;n[2804]=1;Ct(2848,2880,2888,3744,3736);o[712]=280;r=2868|0;o[r>>2]=-2147483648;o[r+4>>2]=2147483647;o[719]=0;Ct(2960,2992,3e3,3744,3736);o[740]=280;r=2980|0;o[r>>2]=-1;o[r+4>>2]=2147483647;o[747]=20;Ct(3112,3144,3152,3744,3736);o[778]=280;r=3132|0;o[r>>2]=-1;o[r+4>>2]=2147483647;o[785]=1e3;Ct(3240,3296,3312,3744,3720);o[810]=2168;u[408]=0.0;u[409]=Q;n[3280]=0;n[3281]=0;i[1641]=i[t+0>>1]|0;i[1642]=i[t+2>>1]|0;i[1643]=i[t+4>>1]|0;u[411]=.5;l=e;return}function Lr(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0;r=l;o[e>>2]=0;n=e+4|0;o[n>>2]=0;i=e+8|0;o[i>>2]=0;if((t|0)<=0){l=r;return}s=t+1&-2;s=(s|0)>2?s:2;o[i>>2]=s;i=On(0,s<<2)|0;o[e>>2]=i;if((i|0)==0?(o[(Ye()|0)>>2]|0)==12:0)ze(Qe(1)|0,48,0);e=o[n>>2]|0;if((e|0)<(t|0))do{s=i+(e<<2)|0;if(s)o[s>>2]=0;e=e+1|0}while((e|0)!=(t|0));o[n>>2]=t;l=r;return}function Tr(e){e=e|0;var t=0,r=0,n=0,i=0,s=0,A=0,a=0;t=l;n=e+32|0;r=o[n>>2]|0;if(r){o[e+36>>2]=0;_n(r);o[n>>2]=0;o[e+40>>2]=0}n=e+16|0;r=o[n>>2]|0;if(r){o[e+20>>2]=0;_n(r);o[n>>2]=0;o[e+24>>2]=0}n=o[e>>2]|0;if(!n){l=t;return}r=e+4|0;s=o[r>>2]|0;if((s|0)>0){i=0;do{a=n+(i*12|0)|0;A=o[a>>2]|0;if(A){o[n+(i*12|0)+4>>2]=0;_n(A);o[a>>2]=0;o[n+(i*12|0)+8>>2]=0;n=o[e>>2]|0;s=o[r>>2]|0}i=i+1|0}while((i|0)<(s|0))}o[r>>2]=0;_n(n);o[e>>2]=0;o[e+8>>2]=0;l=t;return}function Pr(e,t,r){e=e|0;t=t|0;r=r|0;var n=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0;n=l;t=o[t>>2]|0;s=t+1|0;i=e+4|0;if((o[i>>2]|0)>=(s|0)){c=o[e>>2]|0;c=c+(t<<2)|0;o[c>>2]=r;l=n;return}A=e+8|0;c=o[A>>2]|0;if((c|0)<(s|0)){u=t+2-c&-2;a=(c>>1)+2&-2;a=(u|0)>(a|0)?u:a;if((a|0)>(2147483647-c|0)){u=Qe(1)|0;ze(u|0,48,0)}h=o[e>>2]|0;u=a+c|0;o[A>>2]=u;u=On(h,u<<2)|0;o[e>>2]=u;if((u|0)==0?(o[(Ye()|0)>>2]|0)==12:0){h=Qe(1)|0;ze(h|0,48,0)}}c=o[i>>2]|0;if((c|0)<(s|0)){A=o[e>>2]|0;do{a=A+(c<<2)|0;if(a)o[a>>2]=0;c=c+1|0}while((c|0)!=(s|0))}o[i>>2]=s;h=o[e>>2]|0;h=h+(t<<2)|0;o[h>>2]=r;l=n;return}function Ur(e,t){e=e|0;t=t|0;var r=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0;r=l;c=o[t>>2]|0;s=c+1|0;i=e+4|0;if((o[i>>2]|0)<(s|0)){a=e+8|0;A=o[a>>2]|0;if((A|0)<(s|0)){u=c+2-A&-2;c=(A>>1)+2&-2;c=(u|0)>(c|0)?u:c;if((c|0)>(2147483647-A|0)){u=Qe(1)|0;ze(u|0,48,0)}h=o[e>>2]|0;u=c+A|0;o[a>>2]=u;u=On(h,u*12|0)|0;o[e>>2]=u;if((u|0)==0?(o[(Ye()|0)>>2]|0)==12:0){h=Qe(1)|0;ze(h|0,48,0)}}a=o[i>>2]|0;if((a|0)<(s|0)){A=o[e>>2]|0;do{c=A+(a*12|0)|0;if(c){o[c>>2]=0;o[A+(a*12|0)+4>>2]=0;o[A+(a*12|0)+8>>2]=0}a=a+1|0}while((a|0)!=(s|0))}o[i>>2]=s;A=o[t>>2]|0}else A=c;i=o[e>>2]|0;if(o[i+(A*12|0)>>2]|0){o[i+(A*12|0)+4>>2]=0;A=o[t>>2]|0}t=e+16|0;i=A+1|0;s=e+20|0;if((o[s>>2]|0)>=(i|0)){l=r;return}a=e+24|0;e=o[a>>2]|0;if((e|0)<(i|0)){h=A+2-e&-2;A=(e>>1)+2&-2;A=(h|0)>(A|0)?h:A;if((A|0)>(2147483647-e|0)){h=Qe(1)|0;ze(h|0,48,0)}u=o[t>>2]|0;h=A+e|0;o[a>>2]=h;h=On(u,h)|0;o[t>>2]=h;if((h|0)==0?(o[(Ye()|0)>>2]|0)==12:0){h=Qe(1)|0;ze(h|0,48,0)}}e=o[s>>2]|0;if((e|0)<(i|0))do{n[(o[t>>2]|0)+e>>0]=0;e=e+1|0}while((e|0)!=(i|0));o[s>>2]=i;l=r;return}function _r(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,s=0,A=0,a=0,c=0,u=0,h=0,g=0,f=0,p=0,d=0,C=0;r=l;l=l+16|0;s=r;o[s>>2]=t;i=e+12|0;n=t+1|0;A=e+16|0;if((o[A>>2]|0)<(n|0)){c=e+20|0;a=o[c>>2]|0;if((a|0)<(n|0)){h=t+2-a&-2;u=(a>>1)+2&-2;u=(h|0)>(u|0)?h:u;if((u|0)>(2147483647-a|0)){h=Qe(1)|0;ze(h|0,48,0)}g=o[i>>2]|0;h=u+a|0;o[c>>2]=h;h=On(g,h<<2)|0;o[i>>2]=h;if((h|0)==0?(o[(Ye()|0)>>2]|0)==12:0){g=Qe(1)|0;ze(g|0,48,0)}}a=o[A>>2]|0;if((n|0)>(a|0))oi((o[i>>2]|0)+(a<<2)|0,-1,n-a<<2|0)|0;o[A>>2]=n}o[(o[i>>2]|0)+(t<<2)>>2]=o[e+4>>2];Ar(e,s);n=o[i>>2]|0;a=o[n+(t<<2)>>2]|0;t=o[e>>2]|0;i=o[t+(a<<2)>>2]|0;if(!a){h=0;g=t+(h<<2)|0;o[g>>2]=i;g=n+(i<<2)|0;o[g>>2]=h;l=r;return}e=e+28|0;s=i<<1;A=s|1;while(1){h=a;a=a+-1>>1;u=t+(a<<2)|0;c=o[u>>2]|0;C=o[o[e>>2]>>2]|0;f=o[C+(s<<2)>>2]|0;d=o[C+(A<<2)>>2]|0;f=Ci(d|0,((d|0)<0)<<31>>31|0,f|0,((f|0)<0)<<31>>31|0)|0;d=R;p=c<<1;g=o[C+(p<<2)>>2]|0;p=o[C+((p|1)<<2)>>2]|0;g=Ci(p|0,((p|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;p=R;if(!(d>>>0

    Name

    Status

    Location

    Control

    [Bot.hacked ? "(!)" : ""] [Bot.name] ([Bot.model]) Current Project Maintainers: -Click Here-
    Currently Active GitHub contributor list: -Click Here-
    - Coders: Qwertyquerty, CthulhuOnIce, ike709, ShadowH4nD, Mark Suckerberg, Crossedfall, AzlanonPC, Cenrus, St0rmC4st3r, TLE, NEO, Errorage, muskets, veryinky, Skie, Noise, Numbers, Agouri, Noka, Urist McDorf, Uhangi, Darem, Mport, rastaf0, Doohl, Superxpdude, Rockdtben, ConstantA, Petethegoat, Kor, Polymorph, Carn, Nodrak, Donkie, Sieve, Giacom, Ikarrus, trubble_bass, Aranclanos, Cael_Aislinn, Cheridan, Intigracy, Malkevin, SuperSayu, DumpDavidson, Tastyfish, Yvar, Elo001, Fleure, ManeaterMildred, Miauw, MrPerson
    - Spriters: Agouri, AzlanonPC, Cheridan, Cruazy Guest, Deeaych, Deuryn, Matty406, Microwave, ShiftyEyesShady, Skie, Uhangi, Veyveyr, Petethegoat, Kor, Ricotez, Ausops, TankNut, Thatguythere03, Pewtershmitz, Firecage, Nienhaus2
    + Coders: Agouri, Aranclanos, AzlanonPC, Cael_Aislinn, Carn, Cenrus, Cheridan, ConstantA, Crossedfall, CthulhuOnIce, Darem, Donkie, Doohl, DumpDavidson, Elo001, Errorage, Francinum, Fleure, Giacom, Ikarrus, Intigracy, Kor, MCterra, Malkevin, ManeaterMildred, Mark Suckerberg, Miauw, Mport, MrPerson, NEO, Nodrak, Noise, Noka, Numbers, Petethegoat, Polymorph, PowerfulBacon, Qwertyquerty, Rockdtben, ShadowH4nD, Sieve, Skie, St0rmC4st3r, SuperSayu, Superxpdude, TLE, Tastyfish, Uhangi, Urist McDorf, Yvar, ike709, muskets, rastaf0, trubble_bass, veryinky
    + Spriters: Agouri, Ausops, AzlanonPC, Cheridan, CruazyGuest, Deeaych, Deuryn, Firecage, Kor, Matty406, Microwave, Naevi, Nienhaus2, Petethegoat, Pewtershmitz, Ricotez, ShiftyEyesShady, Skie, TankNut, Thatguythere03, Uhangi, Veyveyr
    Mappers: Prophed
    Sounds: Skie, Lasty/Vinyl
    Current Project Maintainers: -Click Here-
    Currently Active GitHub contributor list: -Click Here-
    - Coders: Qwertyquerty, CthulhuOnIce, ike709, ShadowH4nD, Mark Suckerberg, Crossedfall, AzlanonPC, Cenrus, St0rmC4st3r, TLE, NEO, Errorage, muskets, veryinky, Skie, Noise, Numbers, Agouri, Noka, Urist McDorf, Uhangi, Darem, Mport, rastaf0, Doohl, Superxpdude, Rockdtben, ConstantA, Petethegoat, Kor, Polymorph, Carn, Nodrak, Donkie, Sieve, Giacom, Ikarrus, trubble_bass, Aranclanos, Cael_Aislinn, Cheridan, Intigracy, Malkevin, SuperSayu, DumpDavidson, Tastyfish, Yvar, Elo001, Fleure, ManeaterMildred, Miauw, MrPerson
    - Spriters: Agouri, AzlanonPC, Cheridan, Cruazy Guest, Deeaych, Deuryn, Matty406, Microwave, ShiftyEyesShady, Skie, Uhangi, Veyveyr, Petethegoat, Kor, Ricotez, Ausops, TankNut, Thatguythere03, Pewtershmitz, Firecage, Nienhaus2
    + Coders: Agouri, Aranclanos, AzlanonPC, Cael_Aislinn, Carn, Cenrus, Cheridan, ConstantA, Crossedfall, CthulhuOnIce, Darem, Donkie, Doohl, DumpDavidson, Elo001, Errorage, Francinum, Fleure, Giacom, Ikarrus, Intigracy, Kor, MCterra, Malkevin, ManeaterMildred, Mark Suckerberg, Miauw, Mport, MrPerson, NEO, Nodrak, Noise, Noka, Numbers, Petethegoat, Polymorph, PowerfulBacon, Qwertyquerty, Rockdtben, ShadowH4nD, Sieve, Skie, St0rmC4st3r, SuperSayu, Superxpdude, TLE, Tastyfish, Uhangi, Urist McDorf, Yvar, ike709, muskets, rastaf0, trubble_bass, veryinky
    + Spriters: Agouri, Ausops, AzlanonPC, Cheridan, CruazyGuest, Deeaych, Deuryn, Firecage, Kor, Matty406, Microwave, Naevi, Nienhaus2, Petethegoat, Pewtershmitz, Ricotez, ShiftyEyesShady, Skie, TankNut, Thatguythere03, Uhangi, Veyveyr
    Mappers: Prophed
    Sounds: Skie, Lasty/Vinyl
    + + + + + + {atom_name} + + +
    + + + ); +}; diff --git a/tgui/packages/tgui-panel/stat/StatTicket.js b/tgui/packages/tgui-panel/stat/StatTicket.js new file mode 100644 index 0000000000000..9fc67632d301e --- /dev/null +++ b/tgui/packages/tgui-panel/stat/StatTicket.js @@ -0,0 +1,79 @@ +import { useSelector } from 'common/redux'; +import { decodeHtmlEntities } from 'common/string'; +import { Button, Flex, Knob, Tabs, Box, Section, Fragment } from 'tgui/components'; +import { useSettings } from '../settings'; +import { selectStatPanel } from './selectors'; +import { sendMessage } from 'tgui/backend'; +import { Divider, Grid, Table, Input, ScrollableBox } from '../../tgui/components'; +import { STAT_TEXT, STAT_BUTTON, STAT_ATOM, STAT_DIVIDER, STAT_VERB } from './constants'; + +export const StatTicket = (props, context) => { + const stat = useSelector(context, selectStatPanel); + let statPanelData = stat.statInfomation; + if (!statPanelData) + { + return ( + + Passed stat panel data was null contant coderman (or coderwoman). + + ); + } + return ( + +
    + +
    +
    + ); +}; + +export const StatTicketChat = (props, context) => { + const stat = useSelector(context, selectStatPanel); + let statPanelData = stat.statInfomation; + if (!statPanelData.messages) + { + return ( + + No data. + + ); + } + let invertedArray = statPanelData.messages.slice(0).reverse(); + return ( + + + {invertedArray.map(message => ( +
    + + + {message.time} + + + + + {message.from && message.to + ? "PM from " + decodeHtmlEntities(message.from) + + " to " + decodeHtmlEntities(message.to) + : decodeHtmlEntities(message.from) + ? "Reply PM from " + decodeHtmlEntities(message.from) + : decodeHtmlEntities(message.to) + ? "PM to " + decodeHtmlEntities(message.to) + : ""} + + + : {decodeHtmlEntities(message.message)} + + + + +
    + ))} +
    +
    + ); +}; diff --git a/tgui/packages/tgui-panel/stat/constants.js b/tgui/packages/tgui-panel/stat/constants.js new file mode 100644 index 0000000000000..0041f3400dcbe --- /dev/null +++ b/tgui/packages/tgui-panel/stat/constants.js @@ -0,0 +1,6 @@ + +export const STAT_TEXT = 0; +export const STAT_BUTTON = 1; +export const STAT_ATOM = 2; +export const STAT_DIVIDER = 3; +export const STAT_VERB = 4; diff --git a/tgui/packages/tgui-panel/stat/index.js b/tgui/packages/tgui-panel/stat/index.js new file mode 100644 index 0000000000000..ea778856d1015 --- /dev/null +++ b/tgui/packages/tgui-panel/stat/index.js @@ -0,0 +1,6 @@ + +export { statMiddleware } from './middleware'; +export { StatTabs, HoboStatTabs } from './StatTabs'; +export { statReducer } from './reducer'; +export { StatStatus, HoboStatStatus } from './StatStatus'; +export { StatText, HoboStatText } from './StatText'; diff --git a/tgui/packages/tgui-panel/stat/middleware.js b/tgui/packages/tgui-panel/stat/middleware.js new file mode 100644 index 0000000000000..0f183671bd034 --- /dev/null +++ b/tgui/packages/tgui-panel/stat/middleware.js @@ -0,0 +1,28 @@ + +import { StatPanel } from './statPanel'; +import { sendMessage } from 'tgui/backend'; + +export const statMiddleware = store => { + const stat = new StatPanel(); + + return next => action => { + + const { type, payload } = action; + + if (type === 'stat/setTab') { + sendMessage({ + type: 'stat/setTab', + payload: { + selectedTab: payload, + }, + }); + const newTab = payload?.newTab; + if (typeof newTab === 'string') { + stat.setTab(newTab); + } + return next(action); + } + + return next(action); + }; +}; diff --git a/tgui/packages/tgui-panel/stat/reducer.js b/tgui/packages/tgui-panel/stat/reducer.js new file mode 100644 index 0000000000000..dfbad7ff7775a --- /dev/null +++ b/tgui/packages/tgui-panel/stat/reducer.js @@ -0,0 +1,146 @@ +const initialState = { + selectedTab: 'Status', + antagonist_popup: null, + alert_popup: null, + dead_popup: false, + alert_br: false, + statTabs: [], + statInfomation: [], + verbData: {}, + statTabMode: "Scroll", +}; + +export const statReducer = (state = initialState, action) => { + const { type, payload } = action; + if (type === 'stat/setTab') { + return { + ...state, + selectedTab: payload, + }; + } + if (type === 'stat/setStatTabs') { + return { + ...state, + statTabs: payload, + }; + } + if (type === 'stat/setPanelInfomation') { + return { + ...state, + statInfomation: payload, + }; + } + if (type === 'stat/setVerbInfomation') + { + return { + ...state, + verbData: payload, + }; + } + if (type === 'stat/removeVerbs') + { + let newVerbData = state.verbData || {}; + Object.keys(payload).forEach(tabName => { + payload[tabName].forEach(thing => { + if ((tabName in newVerbData) && (thing in newVerbData[tabName])) + { + delete newVerbData[tabName][thing]; + if (Object.keys(newVerbData[tabName]).length === 0) + { + delete newVerbData[tabName]; + } + } + }); + }); + return { + ...state, + verbData: newVerbData, + }; + } + if (type === 'stat/addVerbs') + { + let newVerbData = state.verbData || {}; + for (let tabName in payload) + { + for (let verbName in payload[tabName]) + { + // Find the first key that is greater than the added verb + let inserted = false; + let sortedTabDict = {}; + let newTabDict = newVerbData[tabName]; + for (let key in newTabDict) + { + if (key > verbName && !inserted) + { + sortedTabDict[verbName] = payload[tabName][verbName]; + inserted = true; + } + sortedTabDict[key] = newTabDict[key]; + } + if (!inserted) + { + sortedTabDict[verbName] = payload[tabName][verbName]; + } + // Add the verb + // newTabDict[verbName] = payload[tabName][verbName]; + // Set the tab dictionary to the editted one + newVerbData[tabName] = sortedTabDict; + } + } + return { + ...state, + verbData: newVerbData, + }; + } + if (type === 'stat/antagPopup') { + return { + ...state, + antagonist_popup: payload, + }; + } + if (type === 'stat/clearAntagPopup') { + return { + ...state, + antagonist_popup: null, + }; + } + if (type === 'stat/alertPopup') { + return { + ...state, + alert_popup: payload, + }; + } + if (type === 'stat/clearAlertPopup') { + return { + ...state, + alert_popup: null, + }; + } + if (type === 'stat/deadPopup') { + return { + ...state, + antagonist_popup: null, + dead_popup: true, + }; + } + if (type === 'stat/clearDeadPopup') { + return { + ...state, + dead_popup: false, + }; + } + if (type === 'stat/alertBr') { + return { + ...state, + alert_popup: null, + alert_br: { "title": "Battle Royale", "text": "The round end was delayed, would you like to start Battle Royale?" }, + }; + } + if (type === 'stat/clearAlertBr') { + return { + ...state, + alert_br: false, + }; + } + return state; +}; diff --git a/tgui/packages/tgui-panel/stat/selectors.js b/tgui/packages/tgui-panel/stat/selectors.js new file mode 100644 index 0000000000000..2f553454d124f --- /dev/null +++ b/tgui/packages/tgui-panel/stat/selectors.js @@ -0,0 +1,2 @@ + +export const selectStatPanel = state => state.stat; diff --git a/tgui/packages/tgui-panel/stat/statPanel.js b/tgui/packages/tgui-panel/stat/statPanel.js new file mode 100644 index 0000000000000..be9dc4e92a84f --- /dev/null +++ b/tgui/packages/tgui-panel/stat/statPanel.js @@ -0,0 +1,11 @@ + +export class StatPanel { + constructor() { + this.selectedTab = 'Status'; + } + + setTab(newTab) { + this.selectedTab = newTab; + } + +} diff --git a/tgui/packages/tgui-panel/styles/components/Stat.scss b/tgui/packages/tgui-panel/styles/components/Stat.scss new file mode 100644 index 0000000000000..7f282ab340908 --- /dev/null +++ b/tgui/packages/tgui-panel/styles/components/Stat.scss @@ -0,0 +1,67 @@ + +@use 'sass:color'; +@use '~tgui/styles/base.scss'; +@use '~tgui/styles/colors.scss'; +@use '~tgui/styles/functions.scss'; + +$background-color: base.$color-bg-section !default; +$border-color: color.scale(colors.fg(colors.$primary), $lightness: 75%) !default; + +.StatBorder { + border-left: (1em / 6) solid $border-color; + padding-left: 10px; + padding-bottom: 6px; +} + +.StatBorder_observer { + border-left: (1em / 6) solid #b866ff; + padding-left: 10px; + padding-top: 4px; + padding-bottom: 6px; + background-image: linear-gradient(to right, + rgba(#b866ff, 0.08) 0%, + rgba(#b866ff, 0) 40%); +} + +.StatBorder_antagonist { + border-left: (1em / 6) solid #dd3535; + padding-left: 10px; + padding-top: 4px; + padding-bottom: 6px; + background-image: linear-gradient(to right, + rgba(#dd3535, 0.08) 0%, + rgba(#dd3535, 0) 40%); +} + +.StatBorder_infomation { + border-left: (1em / 6) solid #e6a648; + padding-left: 10px; + padding-top: 4px; + padding-bottom: 6px; + background-image: linear-gradient(to right, + rgba(#e6a648, 0.08) 0%, + rgba(#e6a648, 0) 40%); +} + +.StatBorder_br { + border-left: (1em / 6) solid #2ace53; + padding-left: 10px; + padding-top: 4px; + padding-bottom: 6px; + background-image: linear-gradient(to right, + rgba(#2ace53, 0.08) 0%, + rgba(#2ace53, 0) 40%); +} + +.StatBackground { + position: relative; + background-color: functions.fake-alpha($background-color, base.$color-bg); + background-color: $background-color; + box-sizing: border-box; + padding-top: 5px; + min-height: 99%; +} + +.StatTabBackground { + border-bottom: (1em / 6) solid #666666; +} diff --git a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss index 967e4609dd9cc..718f50074feb9 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss @@ -282,6 +282,7 @@ em {font-style: normal; font-weight: bold;} .binarysay a:active, .binarysay a:visited {color: #88ff88;} .radio {color: #1ecc43;} .sciradio {color: #c68cfa;} +.explradio {color: #7ed4c2;} .comradio {color: #5177ff;} .secradio {color: #dd3535;} .medradio {color: #33ccff;} @@ -337,6 +338,7 @@ em {font-style: normal; font-weight: bold;} .cultlarge {color: #aa1c1c; font-weight: bold; font-size: 24px;} .narsie {color: #aa1c1c; font-weight: bold; font-size: 120px;} .narsiesmall {color: #aa1c1c; font-weight: bold; font-size: 48px;} +.narsiesmaller {color: #aa1c1c; font-weight: bold; font-size: 24px;} .colossus {color: #7F282A; font-size: 40px;} .hierophant {color: #b441ee; font-weight: bold; font-style: italic;} .hierophant_warning {color: #c56bf1; font-style: italic;} @@ -361,6 +363,7 @@ em {font-style: normal; font-weight: bold;} .leader_brass {color: #BE8700; font-size: 16px;} .big_brass {color: #BE8700; font-size: 24px; font-weight: bold; font-style: italic;} .ratvar {color: #BE8700; font-size: 48px; font-weight: bold; font-style: italic; animation: ratvarcolor 5000ms infinite;} +.ratvarsmall {color: #BE8700; font-size: 24px; font-weight: bold; font-style: italic; animation: ratvarcolor 5000ms infinite;} .alloy {color: #42474D;} .heavy_alloy {color: #42474D; font-weight: bold; font-style: italic;} .nezbere_large {color: #42474D; font-size: 24px; font-weight: bold; font-style: italic;} @@ -413,13 +416,14 @@ em {font-style: normal; font-weight: bold;} .robot {font-family: "Courier New", cursive, sans-serif;} .command_headset {font-weight: bold; font-size: 24px;} +.megaphone {font-weight: bold; font-size: 24px;} .small {font-size: 8px;} .big {font-size: 24px;} .reallybig {font-size: 32px;} .extremelybig {font-size: 40px;} .greentext {color: #059223; font-size: 24px;} .redtext {color: #c51e1e; font-size: 24px;} -.clown {color: #ff70c1; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} +.clowntext {color: #ff70c1; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .singing {font-family: "Trebuchet MS", cursive, sans-serif; font-style: italic;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} .hypnophrase {color: #202020; font-weight: bold; animation: hypnocolor 1500ms infinite;} @@ -460,3 +464,81 @@ em {font-style: normal; font-weight: bold;} /* HELPER CLASSES */ .text-normal {font-weight: normal; font-style: normal;} .hidden {display: none; visibility: hidden;} + +//Job Colours +//Make sure you add to replacementNodes in renderer.js +.unknown {color: #cec9c1} +.assistant {color: #cccccc} +.atmospherictechnician {color: #d4a07d} +.bartender {color: #b2ceb3} +.botanist {color: #95de85} +.brigphysician {color: #b16789} +.captain {color: #ecc478} +.cargotechnician {color: #d3a372} +.chaplain {color: #8ab48c} +.chemist {color: #82bdce} +.chiefengineer {color: #cfbb72} +.chiefmedicalofficer {color: #41defa} +.clown {color: #ff83d7} +.cook {color: #a2fbb9} +.curator {color: #88c999} +.deputy {color: #eed4d4} +.detective {color: #c78b8b} +.paramedic {color: #8fbeb4} +.geneticist {color: #83bbbf} +.headofpersonnel {color: #526bf8} +.headofsecurity {color: #ec3550} +.janitor {color: #81dacb} +.lawyer {color: #c07d7d} +.medicaldoctor {color: #6cb1c5} +.mime {color: #bad3bb} +.quartermaster {color: #c79c52} +.researchdirector {color: #974ea9} +.roboticist {color: #ac71ba} +.scientist {color: #c772c7} +.securityofficer {color: #e6a3a3} +.shaftminer {color: #ce957e} +.explorationcrew {color: #85d8b8} +.stationengineer {color: #ebc27d} +.virologist {color: #5ac5b0} +.warden {color: #dd3944} +.centcom {color: #59d62f} +.prisoner {color: #d38a5c} +.blob {color: #ebb55a} +.corgi {color: #ECDA88} +.fox {color: #FFAE64} +.rainbow {animation: rainbowtext 1500ms infinite;} +.hierosay {animation: heriotext 1500ms infinite;} +.brassmobsay {color: #BE8700;} +.syndmob {color: #8f4a4b;} +.alienmobsay {color: #855d85;} +.cultmobsay {color: #aa1c1c;} +.slimemobsay {color: #00CED1;} +.gimmick {color: #a1a1a1;} +.barber {color: #a58264;} +.stagemagician {color: #b659a6;} +.debtor {color: #6d6056;} +.psychiatrist {color: #88bac9;} +.vip {color: #e4ce6c;} + +@keyframes rainbowtext { + 0% { color: #ff0000 } + 20% { color: #ffee00 } + 40% { color: #00ff15 } + 60% { color: #00ccff } + 80% { color: #3700ff } + 100% { color: #ff00f2 } +} + +@keyframes heriotext { + 0% { color: #b441ee } + 50% { color: #c56bf1 } + 100% { color: #b441ee } +} + +.stat_antagonist {color: #dd3535;} +.stat_antagonist_underline {color: #dd3535; text-decoration: underline;} + +.stat_infomation {color: #e6a648;} + +.stat_br {color: #2ace53;} diff --git a/tgui/packages/tgui-panel/styles/goon/chat-light.scss b/tgui/packages/tgui-panel/styles/goon/chat-light.scss index badd3359dd91c..bd5dde687b248 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-light.scss @@ -279,6 +279,7 @@ em {font-style: normal; font-weight: bold;} .binarysay a:active, .binarysay a:visited {color: #88ff88;} .radio {color: #008000;} .sciradio {color: #993399;} +.explradio {color: #358d7a;} .comradio {color: #948f02;} .secradio {color: #a30000;} .medradio {color: #33ccff;} @@ -335,6 +336,7 @@ h1.alert, h2.alert {color: #000000;} .cultlarge {color: #960000; font-weight: bold; font-size: 24px;} .narsie {color: #960000; font-weight: bold; font-size: 120px;} .narsiesmall {color: #960000; font-weight: bold; font-size: 48px;} +.narsiesmaller {color: #960000; font-weight: bold; font-size: 24px;} .colossus {color: #7F282A; font-size: 40px;} .hierophant {color: #660099; font-weight: bold; font-style: italic;} .hierophant_warning {color: #660099; font-style: italic;} @@ -359,6 +361,7 @@ h1.alert, h2.alert {color: #000000;} .leader_brass {color: #BE8700; font-size: 16px;} .big_brass {color: #BE8700; font-size: 24px; font-weight: bold; font-style: italic;} .ratvar {color: #BE8700; font-size: 48px; font-weight: bold; font-style: italic; animation: ratvarcolor 5000ms infinite;} +.ratvarsmall {color: #BE8700; font-size: 24px; font-weight: bold; font-style: italic; animation: ratvarcolor 5000ms infinite;} .alloy {color: #42474D;} .heavy_alloy {color: #42474D; font-weight: bold; font-style: italic;} .nezbere_large {color: #42474D; font-size: 24px; font-weight: bold; font-style: italic;} @@ -412,13 +415,14 @@ h1.alert, h2.alert {color: #000000;} .robot {font-family: "Courier New", cursive, sans-serif;} .command_headset {font-weight: bold; font-size: 24px;} +.megaphone {font-weight: bold; font-size: 24px;} .small {font-size: 8px;} .big {font-size: 24px;} .reallybig {font-size: 32px;} .extremelybig {font-size: 40px;} .greentext {color: #00FF00; font-size: 24px;} .redtext {color: #FF0000; font-size: 24px;} -.clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} +.clowntext {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .singing {font-family: "Trebuchet MS", cursive, sans-serif; font-style: italic;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} .hypnophrase {color: #0d0d0d; font-weight: bold; animation: hypnocolor 1500ms infinite;} @@ -459,3 +463,81 @@ h1.alert, h2.alert {color: #000000;} /* HELPER CLASSES */ .text-normal {font-weight: normal; font-style: normal;} .hidden {display: none; visibility: hidden;} + +//Job Colours +//Make sure you add to replacementNodes in renderer.js +.unknown {color: #313131} +.assistant {color: #a1a1a1} +.atmospherictechnician {color: #d4a07d} +.bartender {color: #71a073} +.botanist {color: #7cb86f} +.brigphysician {color: #b16789} +.captain {color: #d8aa53} +.cargotechnician {color: #d3a372} +.chaplain {color: #8ab48c} +.chemist {color: #82bdce} +.chiefengineer {color: #cfbb72} +.chiefmedicalofficer {color: #67b7f8} +.clown {color: #ff83d7} +.cook {color: #54ce75} +.curator {color: #88c999} +.deputy {color: #cc7e7e} +.detective {color: #b45c5c} +.paramedic {color: #8fbeb4} +.geneticist {color: #83bbbf} +.headofpersonnel {color: #526bf8} +.headofsecurity {color: #be132d} +.janitor {color: #2da792} +.lawyer {color: #c07d7d} +.medicaldoctor {color: #6cb1c5} +.mime {color: #6e9b6e} +.quartermaster {color: #c79c52} +.researchdirector {color: #974ea9} +.roboticist {color: #ac71ba} +.scientist {color: #c772c7} +.securityofficer {color: #c43a3a} +.shaftminer {color: #ce957e} +.explorationcrew {color: #85d8b8} +.stationengineer {color: #be953d} +.virologist {color: #5ac5b0} +.warden {color: #dd3944} +.centcom {color: #419b23} +.prisoner {color: #8b644b} +.blob {color: #cfa356} +.corgi {color: #ECDA88} +.fox {color: #FFAE64} +.rainbow {animation: rainbowtext 1500ms infinite;} +.hierosay {animation: heriotext 1500ms infinite;} +.brassmobsay {color: #BE8700;} +.syndmob {color: #6d3f40;} +.alienmobsay {color: #543354;} +.cultmobsay {color: #960000;} +.slimemobsay {color: #00CED1;} +.gimmick {color: #a1a1a1;} +.barber {color: #836f5f;} +.stagemagician {color: #b659a6;} +.debtor {color: #6d6056;} +.psychiatrist {color: #5394a8;} +.vip {color: #d3be62;} + +@keyframes rainbowtext { + 0% { color: #ff0000; } + 20% { color: #ffee00; } + 40% { color: #00ff15; } + 60% { color: #00ccff; } + 80% { color: #3700ff; } + 100% { color: #ff00f2; } +} + +@keyframes heriotext { + 0% { color: #b441ee } + 50% { color: #c56bf1 } + 100% { color: #b441ee } +} + +.stat_antagonist {color: #a30000;} +.stat_antagonist_underline {color: #a30000; text-decoration: underline;} + +.stat_infomation {color: #be8530;} + +.stat_br {color: #2ace53;} diff --git a/tgui/packages/tgui-panel/styles/main.scss b/tgui/packages/tgui-panel/styles/main.scss index 86a2986920b58..0db26261e4736 100644 --- a/tgui/packages/tgui-panel/styles/main.scss +++ b/tgui/packages/tgui-panel/styles/main.scss @@ -25,12 +25,13 @@ // Components @include meta.load-css('~tgui/styles/components/BlockQuote.scss'); -@include meta.load-css('~tgui/styles/components/Button.scss'); +@include meta.load-css('~tgui/styles/components/Button.scss', $with: ( + 'color-transparent-text': rgba(255, 255, 255, 0.6), +)); @include meta.load-css('~tgui/styles/components/ColorBox.scss'); @include meta.load-css('~tgui/styles/components/Dimmer.scss'); @include meta.load-css('~tgui/styles/components/Divider.scss'); @include meta.load-css('~tgui/styles/components/Dropdown.scss'); -@include meta.load-css('~tgui/styles/components/FatalError.scss'); @include meta.load-css('~tgui/styles/components/Flex.scss'); @include meta.load-css('~tgui/styles/components/Input.scss'); @include meta.load-css('~tgui/styles/components/Knob.scss'); @@ -50,6 +51,7 @@ @include meta.load-css('./components/Chat.scss'); @include meta.load-css('./components/Ping.scss'); @include meta.load-css('./components/Notifications.scss'); +@include meta.load-css('./components/Stat.scss'); // Layouts @include meta.load-css('~tgui/styles/layouts/Layout.scss'); diff --git a/tgui/packages/tgui-panel/styles/themes/light.scss b/tgui/packages/tgui-panel/styles/themes/light.scss index 9c867b14d44a8..9656ba9bab33b 100644 --- a/tgui/packages/tgui-panel/styles/themes/light.scss +++ b/tgui/packages/tgui-panel/styles/themes/light.scss @@ -33,8 +33,9 @@ // Components @include meta.load-css('~tgui/styles/components/Tabs.scss', $with: ( - 'text-color': rgba(0, 0, 0, 0.5), - 'color-default': rgba(0, 0, 0, 1), + 'text-color': rgba(0, 0, 0, 0.7), + 'text-color-selected': rgb(0, 0, 0), + 'color-default': rgb(0, 0, 0), )); @include meta.load-css('~tgui/styles/components/Section.scss', $with: ( // 'background-color': rgba(0, 0, 0, 0.1), @@ -49,7 +50,7 @@ 'color-selected': #0668b8, 'color-caution': #be6209, 'color-danger': #9a9d00, - 'color-transparent-text': rgba(0, 0, 0, 0.5), + 'color-transparent-text': rgba(0, 0, 0, 0.8), )); @include meta.load-css('~tgui/styles/components/Input.scss', $with: ( 'border-color': colors.fg(colors.$label), @@ -79,4 +80,9 @@ // Goonchat styles @include meta.load-css('../goon/chat-light.scss'); + + //Stat styles + @include meta.load-css('../components/Stat.scss', $with: ( + 'border-color': #000000, + )); } diff --git a/tgui/packages/tgui-panel/themes.js b/tgui/packages/tgui-panel/themes.js index e82c9adced007..bfaafdfdb0967 100644 --- a/tgui/packages/tgui-panel/themes.js +++ b/tgui/packages/tgui-panel/themes.js @@ -50,14 +50,6 @@ export const setClientTheme = name => { // Status and verb tabs 'output.background-color': 'none', 'output.text-color': '#000000', - 'statwindow.background-color': 'none', - 'statwindow.text-color': '#000000', - 'stat.background-color': '#FFFFFF', - 'stat.tab-background-color': 'none', - 'stat.text-color': '#000000', - 'stat.tab-text-color': '#000000', - 'stat.prefix-color': '#000000', - 'stat.suffix-color': '#000000', // Say, OOC, me Buttons etc. 'saybutton.background-color': 'none', 'saybutton.text-color': '#000000', @@ -110,14 +102,6 @@ export const setClientTheme = name => { // Status and verb tabs 'output.background-color': desired_background_darker, 'output.text-color': desired_text, - 'statwindow.background-color': desired_background_darker, - 'statwindow.text-color': desired_text, - 'stat.background-color': desired_background_darker, - 'stat.tab-background-color': desired_background, - 'stat.text-color': desired_text, - 'stat.tab-text-color': desired_text, - 'stat.prefix-color': desired_text, - 'stat.suffix-color': desired_text, // Say, OOC, me Buttons etc. 'saybutton.background-color': desired_background, 'saybutton.text-color': desired_text, diff --git a/tgui/packages/tgui-polyfill/index.js b/tgui/packages/tgui-polyfill/index.js index a3c2baa9133e5..c7a1e57ad4f90 100644 --- a/tgui/packages/tgui-polyfill/index.js +++ b/tgui/packages/tgui-polyfill/index.js @@ -14,3 +14,8 @@ import './ie8'; import './dom4'; import './css-om'; import './inferno'; + +// Fetch is required for Webpack HMR +if (module.hot) { + require('whatwg-fetch'); +} diff --git a/tgui/packages/tgui-polyfill/package.json b/tgui/packages/tgui-polyfill/package.json index e75c9d091c900..29bebcb2cf568 100644 --- a/tgui/packages/tgui-polyfill/package.json +++ b/tgui/packages/tgui-polyfill/package.json @@ -1,9 +1,10 @@ { "private": true, "name": "tgui-polyfill", - "version": "4.2.0", + "version": "4.3.0", "dependencies": { - "core-js": "^3.6.5", - "regenerator-runtime": "^0.13.7" + "core-js": "^3.10.1", + "regenerator-runtime": "^0.13.8", + "whatwg-fetch": "^3.6.2" } } diff --git a/tgui/packages/tgui/assets.js b/tgui/packages/tgui/assets.js index 2f2e2ba543927..db6dd635c01e4 100644 --- a/tgui/packages/tgui/assets.js +++ b/tgui/packages/tgui/assets.js @@ -4,68 +4,9 @@ * @license MIT */ -import { loadCSS as fgLoadCss } from 'fg-loadcss'; -import { createLogger } from './logging'; - -const logger = createLogger('assets'); - const EXCLUDED_PATTERNS = [/v4shim/i]; -const RETRY_ATTEMPTS = 5; -const RETRY_INTERVAL = 3000; - -const loadedStyleSheetByUrl = {}; const loadedMappings = {}; -export const loadStyleSheet = (url, attempt = 1) => { - if (loadedStyleSheetByUrl[url]) { - return; - } - loadedStyleSheetByUrl[url] = true; - logger.log(`loading stylesheet '${url}'`); - /** @type {HTMLLinkElement} */ - let node = fgLoadCss(url); - node.addEventListener('load', () => { - if (!isStyleSheetReallyLoaded(node, url)) { - node.parentNode.removeChild(node); - node = null; - loadedStyleSheetByUrl[url] = null; - if (attempt >= RETRY_ATTEMPTS) { - logger.error(`Error: Failed to load the stylesheet ` - + `'${url}' after ${RETRY_ATTEMPTS} attempts.\nIt was either ` - + `not found, or you're trying to load an empty stylesheet ` - + `that has no CSS rules in it.`); - return; - } - setTimeout(() => loadStyleSheet(url, attempt + 1), RETRY_INTERVAL); - return; - } - }); -}; - -/** - * Checks whether the stylesheet was registered in the DOM - * and is not empty. - */ -const isStyleSheetReallyLoaded = (node, url) => { - // Method #1 (works on IE10+) - const styleSheet = node.sheet; - if (styleSheet) { - return styleSheet.rules.length > 0; - } - // Method #2 - const styleSheets = document.styleSheets; - const len = styleSheets.length; - for (let i = 0; i < len; i++) { - const styleSheet = styleSheets[i]; - if (styleSheet.href.includes(url)) { - return styleSheet.rules.length > 0; - } - } - // All methods failed - logger.warn(`Warning: stylesheet '${url}' was not found in the DOM`); - return false; -}; - export const resolveAsset = name => ( loadedMappings[name] || name ); @@ -73,7 +14,7 @@ export const resolveAsset = name => ( export const assetMiddleware = store => next => action => { const { type, payload } = action; if (type === 'asset/stylesheet') { - loadStyleSheet(payload); + Byond.loadCss(payload); return; } if (type === 'asset/mappings') { @@ -86,7 +27,10 @@ export const assetMiddleware = store => next => action => { const ext = name.split('.').pop(); loadedMappings[name] = url; if (ext === 'css') { - loadStyleSheet(url); + Byond.loadCss(url); + } + if (ext === 'js') { + Byond.loadJs(url); } } return; diff --git a/tgui/packages/tgui/backend.js b/tgui/packages/tgui/backend.js deleted file mode 100644 index 1cfd4294f6ea5..0000000000000 --- a/tgui/packages/tgui/backend.js +++ /dev/null @@ -1,380 +0,0 @@ -/** - * This file provides a clear separation layer between backend updates - * and what state our React app sees. - * - * Sometimes backend can response without a "data" field, but our final - * state will still contain previous "data" because we are merging - * the response with already existing state. - * - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { perf } from 'common/perf'; -import { setupDrag } from './drag'; -import { focusMap } from './focus'; -import { createLogger } from './logging'; -import { resumeRenderer, suspendRenderer } from './renderer'; - -const logger = createLogger('backend'); - -export const backendUpdate = state => ({ - type: 'backend/update', - payload: state, -}); - -export const backendSetSharedState = (key, nextState) => ({ - type: 'backend/setSharedState', - payload: { key, nextState }, -}); - -export const backendSuspendStart = () => ({ - type: 'backend/suspendStart', -}); - -export const backendSuspendSuccess = () => ({ - type: 'backend/suspendSuccess', - payload: { - timestamp: Date.now(), - }, -}); - -const initialState = { - config: {}, - data: {}, - shared: {}, - // Start as suspended - suspended: Date.now(), - suspending: false, -}; - -export const backendReducer = (state = initialState, action) => { - const { type, payload } = action; - - if (type === 'backend/update') { - // Merge config - const config = { - ...state.config, - ...payload.config, - }; - // Merge data - const data = { - ...state.data, - ...payload.static_data, - ...payload.data, - }; - // Merge shared states - const shared = { ...state.shared }; - if (payload.shared) { - for (let key of Object.keys(payload.shared)) { - const value = payload.shared[key]; - if (value === '') { - shared[key] = undefined; - } - else { - shared[key] = JSON.parse(value); - } - } - } - // Return new state - return { - ...state, - config, - data, - shared, - suspended: false, - }; - } - - if (type === 'backend/setSharedState') { - const { key, nextState } = payload; - return { - ...state, - shared: { - ...state.shared, - [key]: nextState, - }, - }; - } - - if (type === 'backend/suspendStart') { - return { - ...state, - suspending: true, - }; - } - - if (type === 'backend/suspendSuccess') { - const { timestamp } = payload; - return { - ...state, - data: {}, - shared: {}, - config: { - ...state.config, - title: '', - status: 1, - }, - suspending: false, - suspended: timestamp, - }; - } - - return state; -}; - -export const backendMiddleware = store => { - let fancyState; - let suspendInterval; - - return next => action => { - const { suspended } = selectBackend(store.getState()); - const { type, payload } = action; - - if (type === 'update') { - store.dispatch(backendUpdate(payload)); - return; - } - - if (type === 'suspend') { - store.dispatch(backendSuspendSuccess()); - return; - } - - if (type === 'ping') { - sendMessage({ - type: 'pingReply', - }); - return; - } - - if (type === 'backend/suspendStart' && !suspendInterval) { - logger.log(`suspending (${window.__windowId__})`); - // Keep sending suspend messages until it succeeds. - // It may fail multiple times due to topic rate limiting. - const suspendFn = () => sendMessage({ - type: 'suspend', - }); - suspendFn(); - suspendInterval = setInterval(suspendFn, 2000); - } - - if (type === 'backend/suspendSuccess') { - suspendRenderer(); - clearInterval(suspendInterval); - suspendInterval = undefined; - Byond.winset(window.__windowId__, { - 'is-visible': false, - }); - setImmediate(() => focusMap()); - } - - if (type === 'backend/update') { - const fancy = payload.config?.window?.fancy; - // Initialize fancy state - if (fancyState === undefined) { - fancyState = fancy; - } - // React to changes in fancy - else if (fancyState !== fancy) { - logger.log('changing fancy mode to', fancy); - fancyState = fancy; - Byond.winset(window.__windowId__, { - titlebar: !fancy, - 'can-resize': !fancy, - }); - } - } - - // Resume on incoming update - if (type === 'backend/update' && suspended) { - resumeRenderer(); - // Setup drag - setupDrag(); - // We schedule this for the next tick here because resizing and unhiding - // during the same tick will flash with a white background. - setImmediate(() => { - perf.mark('resume/start'); - // Doublecheck if we are not re-suspended. - const { suspended } = selectBackend(store.getState()); - if (suspended) { - return; - } - Byond.winset(window.__windowId__, { - 'is-visible': true, - }); - perf.mark('resume/finish'); - if (process.env.NODE_ENV !== 'production') { - logger.log('visible in', - perf.measure('render/finish', 'resume/finish')); - } - }); - } - - return next(action); - }; -}; - -/** - * Sends a message to /datum/tgui_window. - */ -export const sendMessage = (message = {}) => { - const { payload, ...rest } = message; - const data = { - // Message identifying header - tgui: 1, - window_id: window.__windowId__, - // Message body - ...rest, - }; - // JSON-encode the payload - if (payload !== null && payload !== undefined) { - data.payload = JSON.stringify(payload); - } - Byond.topic(data); -}; - -/** - * Sends an action to `ui_act` on `src_object` that this tgui window - * is associated with. - */ -export const sendAct = (action, payload = {}) => { - // Validate that payload is an object - const isObject = typeof payload === 'object' - && payload !== null - && !Array.isArray(payload); - if (!isObject) { - logger.error(`Payload for act() must be an object, got this:`, payload); - return; - } - sendMessage({ - type: 'act/' + action, - payload, - }); -}; - -/** - * @typedef BackendState - * @type {{ - * config: { - * title: string, - * status: number, - * interface: string, - * window: { - * key: string, - * size: [number, number], - * fancy: boolean, - * locked: boolean, - * }, - * client: { - * ckey: string, - * address: string, - * computer_id: string, - * }, - * user: { - * name: string, - * observer: number, - * }, - * }, - * data: any, - * shared: any, - * suspending: boolean, - * suspended: boolean, - * }} - */ - -/** - * Selects a backend-related slice of Redux state - * - * @return {BackendState} - */ -export const selectBackend = state => state.backend || {}; - -/** - * A React hook (sort of) for getting tgui state and related functions. - * - * This is supposed to be replaced with a real React Hook, which can only - * be used in functional components. - * - * @return {BackendState & { - * act: sendAct, - * }} - */ -export const useBackend = context => { - const { store } = context; - const state = selectBackend(store.getState()); - return { - ...state, - act: sendAct, - }; -}; - -/** - * Allocates state on Redux store without sharing it with other clients. - * - * Use it when you want to have a stateful variable in your component - * that persists between renders, but will be forgotten after you close - * the UI. - * - * It is a lot more performant than `setSharedState`. - * - * @param {any} context React context. - * @param {string} key Key which uniquely identifies this state in Redux store. - * @param {any} initialState Initializes your global variable with this value. - */ -export const useLocalState = (context, key, initialState) => { - const { store } = context; - const state = selectBackend(store.getState()); - const sharedStates = state.shared ?? {}; - const sharedState = (key in sharedStates) - ? sharedStates[key] - : initialState; - return [ - sharedState, - nextState => { - store.dispatch(backendSetSharedState(key, ( - typeof nextState === 'function' - ? nextState(sharedState) - : nextState - ))); - }, - ]; -}; - -/** - * Allocates state on Redux store, and **shares** it with other clients - * in the game. - * - * Use it when you want to have a stateful variable in your component - * that persists not only between renders, but also gets pushed to other - * clients that observe this UI. - * - * This makes creation of observable s - * - * @param {any} context React context. - * @param {string} key Key which uniquely identifies this state in Redux store. - * @param {any} initialState Initializes your global variable with this value. - */ -export const useSharedState = (context, key, initialState) => { - const { store } = context; - const state = selectBackend(store.getState()); - const sharedStates = state.shared ?? {}; - const sharedState = (key in sharedStates) - ? sharedStates[key] - : initialState; - return [ - sharedState, - nextState => { - sendMessage({ - type: 'setSharedState', - key, - value: JSON.stringify( - typeof nextState === 'function' - ? nextState(sharedState) - : nextState - ) || '', - }); - }, - ]; -}; diff --git a/tgui/packages/tgui/backend.ts b/tgui/packages/tgui/backend.ts new file mode 100644 index 0000000000000..41b2404333038 --- /dev/null +++ b/tgui/packages/tgui/backend.ts @@ -0,0 +1,385 @@ +/** + * This file provides a clear separation layer between backend updates + * and what state our React app sees. + * + * Sometimes backend can response without a "data" field, but our final + * state will still contain previous "data" because we are merging + * the response with already existing state. + * + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { perf } from 'common/perf'; +import { createAction } from 'common/redux'; +import { setupDrag } from './drag'; +import { focusMap } from './focus'; +import { createLogger } from './logging'; +import { resumeRenderer, suspendRenderer } from './renderer'; + +const logger = createLogger('backend'); + +export const backendUpdate = createAction('backend/update'); +export const backendSetSharedState = createAction('backend/setSharedState'); +export const backendSuspendStart = createAction('backend/suspendStart'); + +export const backendSuspendSuccess = () => ({ + type: 'backend/suspendSuccess', + payload: { + timestamp: Date.now(), + }, +}); + +const initialState = { + config: {}, + data: {}, + shared: {}, + // Start as suspended + suspended: Date.now(), + suspending: false, +}; + +export const backendReducer = (state = initialState, action) => { + const { type, payload } = action; + + if (type === 'backend/update') { + // Merge config + const config = { + ...state.config, + ...payload.config, + }; + // Merge data + const data = { + ...state.data, + ...payload.static_data, + ...payload.data, + }; + // Merge shared states + const shared = { ...state.shared }; + if (payload.shared) { + for (let key of Object.keys(payload.shared)) { + const value = payload.shared[key]; + if (value === '') { + shared[key] = undefined; + } + else { + shared[key] = JSON.parse(value); + } + } + } + // Return new state + return { + ...state, + config, + data, + shared, + suspended: false, + }; + } + + if (type === 'backend/setSharedState') { + const { key, nextState } = payload; + return { + ...state, + shared: { + ...state.shared, + [key]: nextState, + }, + }; + } + + if (type === 'backend/suspendStart') { + return { + ...state, + suspending: true, + }; + } + + if (type === 'backend/suspendSuccess') { + const { timestamp } = payload; + return { + ...state, + data: {}, + shared: {}, + config: { + ...state.config, + title: '', + status: 1, + }, + suspending: false, + suspended: timestamp, + }; + } + + return state; +}; + +export const backendMiddleware = store => { + let fancyState; + let suspendInterval; + + return next => action => { + const { suspended } = selectBackend(store.getState()); + const { type, payload } = action; + + if (type === 'update') { + store.dispatch(backendUpdate(payload)); + return; + } + + if (type === 'suspend') { + store.dispatch(backendSuspendSuccess()); + return; + } + + if (type === 'ping') { + sendMessage({ + type: 'pingReply', + }); + return; + } + + if (type === 'backend/suspendStart' && !suspendInterval) { + logger.log(`suspending (${window.__windowId__})`); + // Keep sending suspend messages until it succeeds. + // It may fail multiple times due to topic rate limiting. + const suspendFn = () => sendMessage({ + type: 'suspend', + }); + suspendFn(); + suspendInterval = setInterval(suspendFn, 2000); + } + + if (type === 'backend/suspendSuccess') { + suspendRenderer(); + clearInterval(suspendInterval); + suspendInterval = undefined; + Byond.winset(window.__windowId__, { + 'is-visible': false, + }); + setImmediate(() => focusMap()); + } + + if (type === 'backend/update') { + const fancy = payload.config?.window?.fancy; + // Initialize fancy state + if (fancyState === undefined) { + fancyState = fancy; + } + // React to changes in fancy + else if (fancyState !== fancy) { + logger.log('changing fancy mode to', fancy); + fancyState = fancy; + Byond.winset(window.__windowId__, { + titlebar: !fancy, + 'can-resize': !fancy, + }); + } + } + + // Resume on incoming update + if (type === 'backend/update' && suspended) { + // Show the payload + logger.log('backend/update', payload); + // Signal renderer that we have resumed + resumeRenderer(); + // Setup drag + setupDrag(); + // We schedule this for the next tick here because resizing and unhiding + // during the same tick will flash with a white background. + setImmediate(() => { + perf.mark('resume/start'); + // Doublecheck if we are not re-suspended. + const { suspended } = selectBackend(store.getState()); + if (suspended) { + return; + } + Byond.winset(window.__windowId__, { + 'is-visible': true, + }); + perf.mark('resume/finish'); + if (process.env.NODE_ENV !== 'production') { + logger.log('visible in', + perf.measure('render/finish', 'resume/finish')); + } + }); + } + + return next(action); + }; +}; + +/** + * Sends a message to /datum/tgui_window. + */ +export const sendMessage = (message: any = {}) => { + const { payload, ...rest } = message; + const data: any = { + // Message identifying header + tgui: 1, + window_id: window.__windowId__, + // Message body + ...rest, + }; + // JSON-encode the payload + if (payload !== null && payload !== undefined) { + data.payload = JSON.stringify(payload); + } + Byond.topic(data); +}; + +/** + * Sends an action to `ui_act` on `src_object` that this tgui window + * is associated with. + */ +export const sendAct = (action: string, payload: object = {}) => { + // Validate that payload is an object + const isObject = typeof payload === 'object' + && payload !== null + && !Array.isArray(payload); + if (!isObject) { + logger.error(`Payload for act() must be an object, got this:`, payload); + return; + } + sendMessage({ + type: 'act/' + action, + payload, + }); +}; + +type BackendState = { + config: { + title: string, + status: number, + interface: string, + window: { + key: string, + size: [number, number], + fancy: boolean, + locked: boolean, + }, + client: { + ckey: string, + address: string, + computer_id: string, + }, + user: { + name: string, + observer: number, + }, + }, + data: TData, + shared: Record, + suspending: boolean, + suspended: boolean, +} + +/** + * Selects a backend-related slice of Redux state + */ +export const selectBackend = (state: any): BackendState => ( + state.backend || {} +); + +/** + * A React hook (sort of) for getting tgui state and related functions. + * + * This is supposed to be replaced with a real React Hook, which can only + * be used in functional components. + * + * You can make + */ +export const useBackend = (context: any) => { + const { store } = context; + const state = selectBackend(store.getState()); + return { + ...state, + act: sendAct, + }; +}; + +/** + * A tuple that contains the state and a setter function for it. + */ +type StateWithSetter = [T, (nextState: T) => void]; + +/** + * Allocates state on Redux store without sharing it with other clients. + * + * Use it when you want to have a stateful variable in your component + * that persists between renders, but will be forgotten after you close + * the UI. + * + * It is a lot more performant than `setSharedState`. + * + * @param context React context. + * @param key Key which uniquely identifies this state in Redux store. + * @param initialState Initializes your global variable with this value. + */ +export const useLocalState = ( + context: any, + key: string, + initialState: T, +): StateWithSetter => { + const { store } = context; + const state = selectBackend(store.getState()); + const sharedStates = state.shared ?? {}; + const sharedState = (key in sharedStates) + ? sharedStates[key] + : initialState; + return [ + sharedState, + nextState => { + store.dispatch(backendSetSharedState({ + key, + nextState: ( + typeof nextState === 'function' + ? nextState(sharedState) + : nextState + ), + })); + }, + ]; +}; + +/** + * Allocates state on Redux store, and **shares** it with other clients + * in the game. + * + * Use it when you want to have a stateful variable in your component + * that persists not only between renders, but also gets pushed to other + * clients that observe this UI. + * + * This makes creation of observable s + * + * @param context React context. + * @param key Key which uniquely identifies this state in Redux store. + * @param initialState Initializes your global variable with this value. + */ +export const useSharedState = ( + context: any, + key: string, + initialState: T, +): StateWithSetter => { + const { store } = context; + const state = selectBackend(store.getState()); + const sharedStates = state.shared ?? {}; + const sharedState = (key in sharedStates) + ? sharedStates[key] + : initialState; + return [ + sharedState, + nextState => { + sendMessage({ + type: 'setSharedState', + key, + value: JSON.stringify( + typeof nextState === 'function' + ? nextState(sharedState) + : nextState + ) || '', + }); + }, + ]; +}; diff --git a/tgui/packages/tgui/components/AnimatedNumber.js b/tgui/packages/tgui/components/AnimatedNumber.js index e8d5e618fac91..05b89c96d022a 100644 --- a/tgui/packages/tgui/components/AnimatedNumber.js +++ b/tgui/packages/tgui/components/AnimatedNumber.js @@ -63,7 +63,7 @@ export class AnimatedNumber extends Component { if (!isSafeNumber(targetValue)) { return targetValue || null; } - let formattedValue = currentValue; + let formattedValue; // Use custom formatter if (format) { formattedValue = format(currentValue); diff --git a/tgui/packages/tgui/components/Box.js b/tgui/packages/tgui/components/Box.js deleted file mode 100644 index 7dfba62b8474c..0000000000000 --- a/tgui/packages/tgui/components/Box.js +++ /dev/null @@ -1,232 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { classes, pureComponentHooks } from 'common/react'; -import { createVNode } from 'inferno'; -import { ChildFlags, VNodeFlags } from 'inferno-vnode-flags'; -import { CSS_COLORS } from '../constants'; - -/** - * Coverts our rem-like spacing unit into a CSS unit. - */ -export const unit = value => { - if (typeof value === 'string') { - // Transparently convert pixels into rem units - if (value.endsWith('px') && !Byond.IS_LTE_IE8) { - return parseFloat(value) / 12 + 'rem'; - } - return value; - } - if (typeof value === 'number') { - if (Byond.IS_LTE_IE8) { - return value * 12 + 'px'; - } - return value + 'rem'; - } -}; - -/** - * Same as `unit`, but half the size for integers numbers. - */ -export const halfUnit = value => { - if (typeof value === 'string') { - return unit(value); - } - if (typeof value === 'number') { - return unit(value * 0.5); - } -}; - -const isColorCode = str => !isColorClass(str); - -const isColorClass = str => typeof str === 'string' - && CSS_COLORS.includes(str); - -const mapRawPropTo = attrName => (style, value) => { - if (typeof value === 'number' || typeof value === 'string') { - style[attrName] = value; - } -}; - -const mapUnitPropTo = (attrName, unit) => (style, value) => { - if (typeof value === 'number' || typeof value === 'string') { - style[attrName] = unit(value); - } -}; - -const mapBooleanPropTo = (attrName, attrValue) => (style, value) => { - if (value) { - style[attrName] = attrValue; - } -}; - -const mapDirectionalUnitPropTo = (attrName, unit, dirs) => (style, value) => { - if (typeof value === 'number' || typeof value === 'string') { - for (let i = 0; i < dirs.length; i++) { - style[attrName + '-' + dirs[i]] = unit(value); - } - } -}; - -const mapColorPropTo = attrName => (style, value) => { - if (isColorCode(value)) { - style[attrName] = value; - } -}; - -const styleMapperByPropName = { - // Direct mapping - position: mapRawPropTo('position'), - overflow: mapRawPropTo('overflow'), - overflowX: mapRawPropTo('overflow-x'), - overflowY: mapRawPropTo('overflow-y'), - top: mapUnitPropTo('top', unit), - bottom: mapUnitPropTo('bottom', unit), - left: mapUnitPropTo('left', unit), - right: mapUnitPropTo('right', unit), - width: mapUnitPropTo('width', unit), - minWidth: mapUnitPropTo('min-width', unit), - maxWidth: mapUnitPropTo('max-width', unit), - height: mapUnitPropTo('height', unit), - minHeight: mapUnitPropTo('min-height', unit), - maxHeight: mapUnitPropTo('max-height', unit), - fontSize: mapUnitPropTo('font-size', unit), - fontFamily: mapRawPropTo('font-family'), - lineHeight: (style, value) => { - if (typeof value === 'number') { - style['line-height'] = value; - } - else if (typeof value === 'string') { - style['line-height'] = unit(value); - } - }, - opacity: mapRawPropTo('opacity'), - textAlign: mapRawPropTo('text-align'), - verticalAlign: mapRawPropTo('vertical-align'), - // Boolean props - inline: mapBooleanPropTo('display', 'inline-block'), - bold: mapBooleanPropTo('font-weight', 'bold'), - italic: mapBooleanPropTo('font-style', 'italic'), - nowrap: mapBooleanPropTo('white-space', 'nowrap'), - // Margins - m: mapDirectionalUnitPropTo('margin', halfUnit, [ - 'top', 'bottom', 'left', 'right', - ]), - mx: mapDirectionalUnitPropTo('margin', halfUnit, [ - 'left', 'right', - ]), - my: mapDirectionalUnitPropTo('margin', halfUnit, [ - 'top', 'bottom', - ]), - mt: mapUnitPropTo('margin-top', halfUnit), - mb: mapUnitPropTo('margin-bottom', halfUnit), - ml: mapUnitPropTo('margin-left', halfUnit), - mr: mapUnitPropTo('margin-right', halfUnit), - // Margins - p: mapDirectionalUnitPropTo('padding', halfUnit, [ - 'top', 'bottom', 'left', 'right', - ]), - px: mapDirectionalUnitPropTo('padding', halfUnit, [ - 'left', 'right', - ]), - py: mapDirectionalUnitPropTo('padding', halfUnit, [ - 'top', 'bottom', - ]), - pt: mapUnitPropTo('padding-top', halfUnit), - pb: mapUnitPropTo('padding-bottom', halfUnit), - pl: mapUnitPropTo('padding-left', halfUnit), - pr: mapUnitPropTo('padding-right', halfUnit), - // Color props - color: mapColorPropTo('color'), - textColor: mapColorPropTo('color'), - backgroundColor: mapColorPropTo('background-color'), - // Utility props - fillPositionedParent: (style, value) => { - if (value) { - style['position'] = 'absolute'; - style['top'] = 0; - style['bottom'] = 0; - style['left'] = 0; - style['right'] = 0; - } - }, -}; - -export const computeBoxProps = props => { - const computedProps = {}; - const computedStyles = {}; - // Compute props - for (let propName of Object.keys(props)) { - if (propName === 'style') { - continue; - } - // IE8: onclick workaround - if (Byond.IS_LTE_IE8 && propName === 'onClick') { - computedProps.onclick = props[propName]; - continue; - } - const propValue = props[propName]; - const mapPropToStyle = styleMapperByPropName[propName]; - if (mapPropToStyle) { - mapPropToStyle(computedStyles, propValue); - } - else { - computedProps[propName] = propValue; - } - } - // Concatenate styles - let style = ''; - for (let attrName of Object.keys(computedStyles)) { - const attrValue = computedStyles[attrName]; - style += attrName + ':' + attrValue + ';'; - } - if (props.style) { - for (let attrName of Object.keys(props.style)) { - const attrValue = props.style[attrName]; - style += attrName + ':' + attrValue + ';'; - } - } - if (style.length > 0) { - computedProps.style = style; - } - return computedProps; -}; - -export const computeBoxClassName = props => { - const color = props.textColor || props.color; - const backgroundColor = props.backgroundColor; - return classes([ - isColorClass(color) && 'color-' + color, - isColorClass(backgroundColor) && 'color-bg-' + backgroundColor, - ]); -}; - -export const Box = props => { - const { - as = 'div', - className, - children, - ...rest - } = props; - // Render props - if (typeof children === 'function') { - return children(computeBoxProps(props)); - } - const computedClassName = typeof className === 'string' - ? className + ' ' + computeBoxClassName(rest) - : computeBoxClassName(rest); - const computedProps = computeBoxProps(rest); - // Render a wrapper element - return createVNode( - VNodeFlags.HtmlElement, - as, - computedClassName, - children, - ChildFlags.UnknownChildren, - computedProps); -}; - -Box.defaultHooks = pureComponentHooks; diff --git a/tgui/packages/tgui/components/Box.tsx b/tgui/packages/tgui/components/Box.tsx new file mode 100644 index 0000000000000..613ea47d70869 --- /dev/null +++ b/tgui/packages/tgui/components/Box.tsx @@ -0,0 +1,284 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { BooleanLike, classes, pureComponentHooks } from 'common/react'; +import { createVNode, InfernoNode } from 'inferno'; +import { ChildFlags, VNodeFlags } from 'inferno-vnode-flags'; +import { CSS_COLORS } from '../constants'; + +export interface BoxProps { + [key: string]: any; + as?: string; + className?: string | BooleanLike; + children?: InfernoNode; + position?: string | BooleanLike; + overflow?: string | BooleanLike; + overflowX?: string | BooleanLike; + overflowY?: string | BooleanLike; + top?: string | BooleanLike; + bottom?: string | BooleanLike; + left?: string | BooleanLike; + right?: string | BooleanLike; + width?: string | BooleanLike; + minWidth?: string | BooleanLike; + maxWidth?: string | BooleanLike; + height?: string | BooleanLike; + minHeight?: string | BooleanLike; + maxHeight?: string | BooleanLike; + fontSize?: string | BooleanLike; + fontFamily?: string; + lineHeight?: string | BooleanLike; + opacity?: number; + textAlign?: string | BooleanLike; + verticalAlign?: string | BooleanLike; + inline?: BooleanLike; + bold?: BooleanLike; + italic?: BooleanLike; + nowrap?: BooleanLike; + m?: string | BooleanLike; + mx?: string | BooleanLike; + my?: string | BooleanLike; + mt?: string | BooleanLike; + mb?: string | BooleanLike; + ml?: string | BooleanLike; + mr?: string | BooleanLike; + p?: string | BooleanLike; + px?: string | BooleanLike; + py?: string | BooleanLike; + pt?: string | BooleanLike; + pb?: string | BooleanLike; + pl?: string | BooleanLike; + pr?: string | BooleanLike; + color?: string | BooleanLike; + textColor?: string | BooleanLike; + backgroundColor?: string | BooleanLike; + fillPositionedParent?: boolean; +} + +/** + * Coverts our rem-like spacing unit into a CSS unit. + */ +export const unit = (value: unknown): string | undefined => { + if (typeof value === 'string') { + // Transparently convert pixels into rem units + if (value.endsWith('px') && !Byond.IS_LTE_IE8) { + return parseFloat(value) / 12 + 'rem'; + } + return value; + } + if (typeof value === 'number') { + if (Byond.IS_LTE_IE8) { + return value * 12 + 'px'; + } + return value + 'rem'; + } +}; + +/** + * Same as `unit`, but half the size for integers numbers. + */ +export const halfUnit = (value: unknown): string | undefined => { + if (typeof value === 'string') { + return unit(value); + } + if (typeof value === 'number') { + return unit(value * 0.5); + } +}; + +const isColorCode = (str: unknown) => !isColorClass(str); + +const isColorClass = (str: unknown): boolean => { + if (typeof str === 'string') { + return CSS_COLORS.includes(str); + } +}; + +const mapRawPropTo = attrName => (style, value) => { + if (typeof value === 'number' || typeof value === 'string') { + style[attrName] = value; + } +}; + +const mapUnitPropTo = (attrName, unit) => (style, value) => { + if (typeof value === 'number' || typeof value === 'string') { + style[attrName] = unit(value); + } +}; + +const mapBooleanPropTo = (attrName, attrValue) => (style, value) => { + if (value) { + style[attrName] = attrValue; + } +}; + +const mapDirectionalUnitPropTo = (attrName, unit, dirs) => (style, value) => { + if (typeof value === 'number' || typeof value === 'string') { + for (let i = 0; i < dirs.length; i++) { + style[attrName + '-' + dirs[i]] = unit(value); + } + } +}; + +const mapColorPropTo = attrName => (style, value) => { + if (isColorCode(value)) { + style[attrName] = value; + } +}; + +const styleMapperByPropName = { + // Direct mapping + position: mapRawPropTo('position'), + overflow: mapRawPropTo('overflow'), + overflowX: mapRawPropTo('overflow-x'), + overflowY: mapRawPropTo('overflow-y'), + top: mapUnitPropTo('top', unit), + bottom: mapUnitPropTo('bottom', unit), + left: mapUnitPropTo('left', unit), + right: mapUnitPropTo('right', unit), + width: mapUnitPropTo('width', unit), + minWidth: mapUnitPropTo('min-width', unit), + maxWidth: mapUnitPropTo('max-width', unit), + height: mapUnitPropTo('height', unit), + minHeight: mapUnitPropTo('min-height', unit), + maxHeight: mapUnitPropTo('max-height', unit), + fontSize: mapUnitPropTo('font-size', unit), + fontFamily: mapRawPropTo('font-family'), + lineHeight: (style, value) => { + if (typeof value === 'number') { + style['line-height'] = value; + } + else if (typeof value === 'string') { + style['line-height'] = unit(value); + } + }, + opacity: mapRawPropTo('opacity'), + textAlign: mapRawPropTo('text-align'), + verticalAlign: mapRawPropTo('vertical-align'), + // Boolean props + inline: mapBooleanPropTo('display', 'inline-block'), + bold: mapBooleanPropTo('font-weight', 'bold'), + italic: mapBooleanPropTo('font-style', 'italic'), + nowrap: mapBooleanPropTo('white-space', 'nowrap'), + // Margins + m: mapDirectionalUnitPropTo('margin', halfUnit, [ + 'top', 'bottom', 'left', 'right', + ]), + mx: mapDirectionalUnitPropTo('margin', halfUnit, [ + 'left', 'right', + ]), + my: mapDirectionalUnitPropTo('margin', halfUnit, [ + 'top', 'bottom', + ]), + mt: mapUnitPropTo('margin-top', halfUnit), + mb: mapUnitPropTo('margin-bottom', halfUnit), + ml: mapUnitPropTo('margin-left', halfUnit), + mr: mapUnitPropTo('margin-right', halfUnit), + // Margins + p: mapDirectionalUnitPropTo('padding', halfUnit, [ + 'top', 'bottom', 'left', 'right', + ]), + px: mapDirectionalUnitPropTo('padding', halfUnit, [ + 'left', 'right', + ]), + py: mapDirectionalUnitPropTo('padding', halfUnit, [ + 'top', 'bottom', + ]), + pt: mapUnitPropTo('padding-top', halfUnit), + pb: mapUnitPropTo('padding-bottom', halfUnit), + pl: mapUnitPropTo('padding-left', halfUnit), + pr: mapUnitPropTo('padding-right', halfUnit), + // Color props + color: mapColorPropTo('color'), + textColor: mapColorPropTo('color'), + backgroundColor: mapColorPropTo('background-color'), + // Utility props + fillPositionedParent: (style, value) => { + if (value) { + style['position'] = 'absolute'; + style['top'] = 0; + style['bottom'] = 0; + style['left'] = 0; + style['right'] = 0; + } + }, +}; + +export const computeBoxProps = (props: BoxProps) => { + const computedProps: HTMLAttributes = {}; + const computedStyles = {}; + // Compute props + for (let propName of Object.keys(props)) { + if (propName === 'style') { + continue; + } + // IE8: onclick workaround + if (Byond.IS_LTE_IE8 && propName === 'onClick') { + computedProps.onclick = props[propName]; + continue; + } + const propValue = props[propName]; + const mapPropToStyle = styleMapperByPropName[propName]; + if (mapPropToStyle) { + mapPropToStyle(computedStyles, propValue); + } + else { + computedProps[propName] = propValue; + } + } + // Concatenate styles + let style = ''; + for (let attrName of Object.keys(computedStyles)) { + const attrValue = computedStyles[attrName]; + style += attrName + ':' + attrValue + ';'; + } + if (props.style) { + for (let attrName of Object.keys(props.style)) { + const attrValue = props.style[attrName]; + style += attrName + ':' + attrValue + ';'; + } + } + if (style.length > 0) { + computedProps.style = style; + } + return computedProps; +}; + +export const computeBoxClassName = (props: BoxProps) => { + const color = props.textColor || props.color; + const backgroundColor = props.backgroundColor; + return classes([ + isColorClass(color) && 'color-' + color, + isColorClass(backgroundColor) && 'color-bg-' + backgroundColor, + ]); +}; + +export const Box = (props: BoxProps) => { + const { + as = 'div', + className, + children, + ...rest + } = props; + // Render props + if (typeof children === 'function') { + return children(computeBoxProps(props)); + } + const computedClassName = typeof className === 'string' + ? className + ' ' + computeBoxClassName(rest) + : computeBoxClassName(rest); + const computedProps = computeBoxProps(rest); + // Render a wrapper element + return createVNode( + VNodeFlags.HtmlElement, + as, + computedClassName, + children, + ChildFlags.UnknownChildren, + computedProps); +}; + +Box.defaultHooks = pureComponentHooks; diff --git a/tgui/packages/tgui/components/Button.js b/tgui/packages/tgui/components/Button.js index e1ace06428371..459e12ea20554 100644 --- a/tgui/packages/tgui/components/Button.js +++ b/tgui/packages/tgui/components/Button.js @@ -46,7 +46,7 @@ export const Button = props => { } // IE8: Use a lowercase "onclick" because synthetic events are fucked. // IE8: Use an "unselectable" prop because "user-select" doesn't work. - return ( + let buttonContent = ( { )} {content} {children} - {tooltip && ( - - )} ); + + if (tooltip) { + buttonContent = ( + + {buttonContent} + + ); + } + + return buttonContent; }; Button.defaultHooks = pureComponentHooks; @@ -227,7 +232,7 @@ export class ButtonInput extends Component { ...rest } = this.props; - return ( + let buttonContent = ( - {tooltip && ( - - )} ); + + if (tooltip) { + buttonContent = ( + + {buttonContent} + + ); + } + + return buttonContent; } } diff --git a/tgui/packages/tgui/components/DraggableClickableControl.js b/tgui/packages/tgui/components/DraggableClickableControl.js new file mode 100644 index 0000000000000..62200352d50e2 --- /dev/null +++ b/tgui/packages/tgui/components/DraggableClickableControl.js @@ -0,0 +1,46 @@ +import { DraggableControl } from '.'; +import { clamp } from 'common/math'; +import { pureComponentHooks } from 'common/react'; +import { Component, createRef } from 'inferno'; +import { AnimatedNumber } from './AnimatedNumber'; + +export class DraggableClickableControl extends DraggableControl { + constructor(props) { + super(props); + + this.handleDragEnd = e => { + const { + onChange, + onDrag, + onClick, + } = this.props; + const { + dragging, + value, + internalValue, + } = this.state; + document.body.style['pointer-events'] = 'auto'; + clearTimeout(this.timer); + clearInterval(this.dragInterval); + this.setState({ + dragging: false, + editing: false, + origin: null, + }); + document.removeEventListener('mousemove', this.handleDragMove); + document.removeEventListener('mouseup', this.handleDragEnd); + if (dragging) { + this.suppressFlicker(); + if (onChange) { + onChange(e, value); + } + if (onDrag) { + onDrag(e, value); + } + } + else { + onClick(e, value); + } + }; + } +} diff --git a/tgui/packages/tgui/components/DraggableControl.js b/tgui/packages/tgui/components/DraggableControl.js index 384e29b323cae..dfb47e8f4d6bd 100644 --- a/tgui/packages/tgui/components/DraggableControl.js +++ b/tgui/packages/tgui/components/DraggableControl.js @@ -173,6 +173,7 @@ export class DraggableControl extends Component { unit, minValue, maxValue, + unclamped, format, onChange, onDrag, @@ -221,10 +222,16 @@ export class DraggableControl extends Component { if (!editing) { return; } - const value = clamp( - parseFloat(e.target.value), - minValue, - maxValue); + let value; + if (unclamped) { + value = parseFloat(e.target.value); + } + else { + value = clamp( + parseFloat(e.target.value), + minValue, + maxValue); + } if (Number.isNaN(value)) { this.setState({ editing: false, @@ -245,10 +252,16 @@ export class DraggableControl extends Component { }} onKeyDown={e => { if (e.keyCode === 13) { - const value = clamp( - parseFloat(e.target.value), - minValue, - maxValue); + let value; + if (unclamped) { + value = parseFloat(e.target.value); + } + else { + value = clamp( + parseFloat(e.target.value), + minValue, + maxValue); + } if (Number.isNaN(value)) { this.setState({ editing: false, diff --git a/tgui/packages/tgui/components/Dropdown.js b/tgui/packages/tgui/components/Dropdown.js index adbb13de5b2ca..7486807e3f353 100644 --- a/tgui/packages/tgui/components/Dropdown.js +++ b/tgui/packages/tgui/components/Dropdown.js @@ -64,6 +64,9 @@ export class Dropdown extends Component { render() { const { props } = this; const { + icon, + iconRotation, + iconSpin, color = 'default', over, noscroll, @@ -72,6 +75,7 @@ export class Dropdown extends Component { onClick, selected, disabled, + displayText, ...boxProps } = props; const { @@ -114,8 +118,15 @@ export class Dropdown extends Component { } this.setOpen(!this.state.open); }}> + {icon && ( + + )} - {this.state.selected} + {displayText ? displayText : this.state.selected} {!!nochevron || ( diff --git a/tgui/packages/tgui/components/Flex.js b/tgui/packages/tgui/components/Flex.js deleted file mode 100644 index 2477f4c502099..0000000000000 --- a/tgui/packages/tgui/components/Flex.js +++ /dev/null @@ -1,88 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { classes, pureComponentHooks } from 'common/react'; -import { Box, unit } from './Box'; - -export const computeFlexProps = props => { - const { - className, - direction, - wrap, - align, - justify, - inline, - spacing = 0, - ...rest - } = props; - return { - className: classes([ - 'Flex', - Byond.IS_LTE_IE10 && ( - direction === 'column' - ? 'Flex--iefix--column' - : 'Flex--iefix' - ), - inline && 'Flex--inline', - spacing > 0 && 'Flex--spacing--' + spacing, - className, - ]), - style: { - ...rest.style, - 'flex-direction': direction, - 'flex-wrap': wrap, - 'align-items': align, - 'justify-content': justify, - }, - ...rest, - }; -}; - -export const Flex = props => ( - -); - -Flex.defaultHooks = pureComponentHooks; - -export const computeFlexItemProps = props => { - const { - className, - style, - grow, - order, - shrink, - // IE11: Always set basis to specified width, which fixes certain - // bugs when rendering tables inside the flex. - basis = props.width, - align, - ...rest - } = props; - return { - className: classes([ - 'Flex__item', - Byond.IS_LTE_IE10 && 'Flex__item--iefix', - Byond.IS_LTE_IE10 && grow > 0 && 'Flex__item--iefix--grow', - className, - ]), - style: { - ...style, - 'flex-grow': grow, - 'flex-shrink': shrink, - 'flex-basis': unit(basis), - 'order': order, - 'align-self': align, - }, - ...rest, - }; -}; - -export const FlexItem = props => ( - -); - -FlexItem.defaultHooks = pureComponentHooks; - -Flex.Item = FlexItem; diff --git a/tgui/packages/tgui/components/Flex.tsx b/tgui/packages/tgui/components/Flex.tsx new file mode 100644 index 0000000000000..fbb5ab0b9619e --- /dev/null +++ b/tgui/packages/tgui/components/Flex.tsx @@ -0,0 +1,102 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { BooleanLike, classes, pureComponentHooks } from 'common/react'; +import { Box, BoxProps, unit } from './Box'; + +export interface FlexProps extends BoxProps { + direction?: string | BooleanLike; + wrap?: string | BooleanLike; + align?: string | BooleanLike; + justify?: string | BooleanLike; + inline?: BooleanLike; +} + +export const computeFlexProps = (props: FlexProps) => { + const { + className, + direction, + wrap, + align, + justify, + inline, + ...rest + } = props; + return { + className: classes([ + 'Flex', + Byond.IS_LTE_IE10 && ( + direction === 'column' + ? 'Flex--iefix--column' + : 'Flex--iefix' + ), + inline && 'Flex--inline', + className, + ]), + style: { + ...rest.style, + 'flex-direction': direction, + 'flex-wrap': wrap === true ? 'wrap' : wrap, + 'align-items': align, + 'justify-content': justify, + }, + ...rest, + }; +}; + +export const Flex = props => ( + +); + +Flex.defaultHooks = pureComponentHooks; + +export interface FlexItemProps extends BoxProps { + grow?: number; + order?: number; + shrink?: number; + basis?: string | BooleanLike; + align?: string | BooleanLike; +} + +export const computeFlexItemProps = (props: FlexItemProps) => { + const { + className, + style, + grow, + order, + shrink, + // IE11: Always set basis to specified width, which fixes certain + // bugs when rendering tables inside the flex. + basis = props.width, + align, + ...rest + } = props; + return { + className: classes([ + 'Flex__item', + Byond.IS_LTE_IE10 && 'Flex__item--iefix', + Byond.IS_LTE_IE10 && grow > 0 && 'Flex__item--iefix--grow', + className, + ]), + style: { + ...style, + 'flex-grow': grow !== undefined && Number(grow), + 'flex-shrink': shrink !== undefined && Number(shrink), + 'flex-basis': unit(basis), + 'order': order, + 'align-self': align, + }, + ...rest, + }; +}; + +const FlexItem = props => ( + +); + +FlexItem.defaultHooks = pureComponentHooks; + +Flex.Item = FlexItem; diff --git a/tgui/packages/tgui/components/Grid.js b/tgui/packages/tgui/components/Grid.js index 85d261122163a..3269b672006c3 100644 --- a/tgui/packages/tgui/components/Grid.js +++ b/tgui/packages/tgui/components/Grid.js @@ -7,6 +7,7 @@ import { Table } from './Table'; import { pureComponentHooks } from 'common/react'; +/** @deprecated */ export const Grid = props => { const { children, ...rest } = props; return ( @@ -20,6 +21,7 @@ export const Grid = props => { Grid.defaultHooks = pureComponentHooks; +/** @deprecated */ export const GridColumn = props => { const { size = 1, style, ...rest } = props; return ( diff --git a/tgui/packages/tgui/components/Icon.js b/tgui/packages/tgui/components/Icon.js index 425618a3a8545..af9e6c2c536cd 100644 --- a/tgui/packages/tgui/components/Icon.js +++ b/tgui/packages/tgui/components/Icon.js @@ -17,16 +17,22 @@ export const Icon = props => { if (typeof rotation === 'number') { style['transform'] = `rotate(${rotation}deg)`; } - const faRegular = FA_OUTLINE_REGEX.test(name); - const faName = name.replace(FA_OUTLINE_REGEX, ''); + let iconClass = ""; + if (name.startsWith("tg-")) { + // tgfont icon + iconClass = name; + } else { + // font awesome icon + const faRegular = FA_OUTLINE_REGEX.test(name); + const faName = name.replace(FA_OUTLINE_REGEX, ''); + iconClass = (faRegular ? 'far ' : 'fas ') + 'fa-'+ faName + (spin ? " fa-spin" : ""); + } return ( diff --git a/tgui/packages/tgui/components/InfinitePlane.js b/tgui/packages/tgui/components/InfinitePlane.js new file mode 100644 index 0000000000000..1c548a9e741b2 --- /dev/null +++ b/tgui/packages/tgui/components/InfinitePlane.js @@ -0,0 +1,165 @@ +import { computeBoxProps } from "./Box"; +import { Stack } from "./Stack"; +import { ProgressBar } from "./ProgressBar"; +import { Button } from "./Button"; +import { Component } from 'inferno'; + +const ZOOM_MIN_VAL = 0.5; +const ZOOM_MAX_VAL = 1.5; + +const ZOOM_INCREMENT = 0.1; + +export class InfinitePlane extends Component { + constructor() { + super(); + + this.state = { + mouseDown: false, + + left: 0, + top: 0, + + lastLeft: 0, + lastTop: 0, + + zoom: 1, + }; + + this.handleMouseDown = this.handleMouseDown.bind(this); + this.handleMouseMove = this.handleMouseMove.bind(this); + this.onMouseUp = this.onMouseUp.bind(this); + + this.doOffsetMouse = this.doOffsetMouse.bind(this); + } + + componentDidMount() { + window.addEventListener("mouseup", this.onMouseUp); + + window.addEventListener("mousedown", this.doOffsetMouse); + window.addEventListener("mousemove", this.doOffsetMouse); + window.addEventListener("mouseup", this.doOffsetMouse); + } + + componentWillUnmount() { + window.removeEventListener("mouseup", this.onMouseUp); + + window.removeEventListener("mousedown", this.doOffsetMouse); + window.removeEventListener("mousemove", this.doOffsetMouse); + window.removeEventListener("mouseup", this.doOffsetMouse); + } + + doOffsetMouse(event) { + const { zoom } = this.state; + event.screenZoomX = event.screenX * Math.pow(zoom, -1); + event.screenZoomY = event.screenY * Math.pow(zoom, -1); + } + + handleMouseDown(event) { + this.setState((state) => { + return { + mouseDown: true, + lastLeft: event.clientX - state.left, + lastTop: event.clientY - state.top, + }; + }); + } + + onMouseUp() { + this.setState({ + mouseDown: false, + }); + } + + handleMouseMove(event) { + if (this.state.mouseDown) { + this.setState((state) => { + return { + left: event.clientX - state.lastLeft, + top: event.clientY - state.lastTop, + }; + }); + } + } + + render() { + const { + children, + backgroundImage, + imageWidth, + ...rest + } = this.props; + const { + left, + top, + zoom, + } = this.state; + + return ( +
    +
    +
    + {children} +
    + + + +
    + ); + } +} diff --git a/tgui/packages/tgui/components/Knob.js b/tgui/packages/tgui/components/Knob.js index c165df46fd71f..175792471b3de 100644 --- a/tgui/packages/tgui/components/Knob.js +++ b/tgui/packages/tgui/components/Knob.js @@ -24,6 +24,7 @@ export const Knob = props => { format, maxValue, minValue, + unclamped, onChange, onDrag, step, @@ -50,6 +51,7 @@ export const Knob = props => { format, maxValue, minValue, + unclamped, onChange, onDrag, step, @@ -79,7 +81,7 @@ export const Knob = props => { const effectiveColor = color || keyOfMatchingRange(fillValue ?? value, ranges) || 'default'; - const rotation = (scaledDisplayValue - 0.5) * 270; + const rotation = Math.min((scaledDisplayValue - 0.5) * 270, 225); return (
    { className="Knob__ringFill" style={{ 'stroke-dashoffset': ( - ((bipolar ? 2.75 : 2.00) - scaledFillValue * 1.5) - * Math.PI * 50 + Math.max(((bipolar ? 2.75 : 2.00) - scaledFillValue * 1.5) + * Math.PI * 50, 0) ), }} cx="50" diff --git a/tgui/packages/tgui/components/LabeledControls.js b/tgui/packages/tgui/components/LabeledControls.js index def4079e7a0bc..b4f069192c5f2 100644 --- a/tgui/packages/tgui/components/LabeledControls.js +++ b/tgui/packages/tgui/components/LabeledControls.js @@ -9,11 +9,13 @@ import { Flex } from './Flex'; export const LabeledControls = props => { const { children, + wrap, ...rest } = props; return ( @@ -26,12 +28,12 @@ const LabeledControlsItem = props => { const { label, children, + mx = 1, ...rest } = props; return ( - + { - const { children } = props; - return ( - - {children} -
    - ); -}; - -LabeledList.defaultHooks = pureComponentHooks; - -export const LabeledListItem = props => { - const { - className, - label, - labelColor = 'label', - color, - textAlign, - buttons, - content, - children, - } = props; - return ( -
    - {buttons} -
    - -
    + {children} +
    + ); +}; + +LabeledList.defaultHooks = pureComponentHooks; + +type LabeledListItemProps = { + className?: string | BooleanLike; + label?: string | BooleanLike; + labelColor?: string | BooleanLike; + color?: string | BooleanLike; + textAlign?: string | BooleanLike; + buttons?: InfernoNode, + /** @deprecated */ + content?: any, + children?: InfernoNode; +}; + +const LabeledListItem = (props: LabeledListItemProps) => { + const { + className, + label, + labelColor = 'label', + color, + textAlign, + buttons, + content, + children, + } = props; + return ( +
    + {buttons} +
    + +
    + + + Bounty Object + + + Description + + + Progress + + + Value + + + Claim + + + {bountydata.map(bounty => ( + + + {bounty.name} + + + {bounty.description} + + + {bounty.priority === 1 + ? High Priority + : ""} + {bounty.completion_string} + + + {bounty.reward_string} + + +
    + + + + + ); +}; + +const BountyHeader = (props, context) => { + const { act, data } = useBackend(context); + const { + stored_cash, + } = data; + return ( + + formatMoney(value)} /> + {' credits'} + + ); +}; diff --git a/tgui/packages/tgui/interfaces/CargoExpress.js b/tgui/packages/tgui/interfaces/CargoExpress.js index e10305f501c79..56385dc3f7c31 100644 --- a/tgui/packages/tgui/interfaces/CargoExpress.js +++ b/tgui/packages/tgui/interfaces/CargoExpress.js @@ -1,4 +1,3 @@ -import { Fragment } from 'inferno'; import { useBackend } from '../backend'; import { AnimatedNumber, Box, Button, LabeledList, Section } from '../components'; import { Window } from '../layouts'; @@ -9,7 +8,6 @@ export const CargoExpress = (props, context) => { const { act, data } = useBackend(context); return ( @@ -26,7 +24,7 @@ export const CargoExpress = (props, context) => { const CargoExpressContent = (props, context) => { const { act, data } = useBackend(context); return ( - + <>
    {
    - -
    + + ); }; diff --git a/tgui/packages/tgui/interfaces/CargoHoldTerminal.js b/tgui/packages/tgui/interfaces/CargoHoldTerminal.js index 50d5f3fd6c26f..82db3c9dd84a0 100644 --- a/tgui/packages/tgui/interfaces/CargoHoldTerminal.js +++ b/tgui/packages/tgui/interfaces/CargoHoldTerminal.js @@ -1,4 +1,3 @@ -import { Fragment } from 'inferno'; import { useBackend } from '../backend'; import { AnimatedNumber, Box, Button, LabeledList, Section } from '../components'; import { Window } from '../layouts'; @@ -13,7 +12,6 @@ export const CargoHoldTerminal = (props, context) => { } = data; return ( @@ -29,7 +27,7 @@ export const CargoHoldTerminal = (props, context) => {
    + <>
    + ); +}; + +const TabPod = (props, context) => { + return ( + + Note: You can right click on this +
    + blueprint pod and edit vars directly +
    + ); +}; + + +const TabBay = (props, context) => { + const { act, data, config } = useBackend(context); + return ( + <> + + ))} + + ); +}; + +const Bays = (props, context) => { + const { act, data } = useBackend(context); + const [compact] = useCompact(context); + return ( +
    +
    + ); +}; + +const Timing = (props, context) => { + const { act, data } = useBackend(context); + return ( +
    +
    + ); +}; +const DelayHelper = (props, context) => { + const { act, data } = useBackend(context); + const { + delay_list, + reverse = false, + } = props; + return ( + + {delay_list.map((delay, i) => ( + + toFixed(value, 2)} + maxValue={10} + color={((reverse ? data.rev_delays[i+1] : data.delays[i+1]) / 10) + > 10 ? "orange" : "default"} + onDrag={(e, value) => { + act('editTiming', { + timer: ""+(i + 1), + value: Math.max(value, 0), + reverse: reverse, + }); + }} /> + + ))} + + ); +}; +const Sounds = (props, context) => { + const { act, data } = useBackend(context); + return ( +
    act('soundVolume')} /> + )}> + {SOUNDS.map((sound, i) => ( +
    ); }; diff --git a/tgui/packages/tgui/interfaces/ChemDebugSynthesizer.js b/tgui/packages/tgui/interfaces/ChemDebugSynthesizer.js index 10e9664ae8aac..23786c9f4e354 100644 --- a/tgui/packages/tgui/interfaces/ChemDebugSynthesizer.js +++ b/tgui/packages/tgui/interfaces/ChemDebugSynthesizer.js @@ -1,4 +1,3 @@ -import { Fragment } from 'inferno'; import { useBackend } from '../backend'; import { AnimatedNumber, Box, Button, LabeledList, NumberInput, Section } from '../components'; import { Window } from '../layouts'; @@ -14,14 +13,13 @@ export const ChemDebugSynthesizer = (props, context) => { } = data; return (
    + <>
    + ) : ( +
    + {lacksMachine.map(machine => ( + + {machine}
    +
    + ))} +
    + )} + {useRecords ? ( +
    +
    + + +

    Current Records:

    + {records.map(record => ( +
    + +
    + Scan ID {record["id"]}
    +
    +
    +
    + ))} +
    +
    +
    +
    +
    +
    + ) : (null)} + +
    +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/ComputerFabricator.js b/tgui/packages/tgui/interfaces/ComputerFabricator.js index b62c5cba776c8..6672c819a6319 100644 --- a/tgui/packages/tgui/interfaces/ComputerFabricator.js +++ b/tgui/packages/tgui/interfaces/ComputerFabricator.js @@ -1,5 +1,4 @@ import { multiline } from 'common/string'; -import { Fragment } from 'inferno'; import { useBackend } from '../backend'; import { Box, Button, Grid, Section, Table, Tooltip } from '../components'; import { Window } from '../layouts'; @@ -102,13 +101,14 @@ const CfStep2 = (props, context) => { - Battery: + position="right"> + Battery: + + )} + + + ); +}; + +const GenomeSequencer = (props, context) => { + const { mutation } = props; + const { data, act } = useBackend(context); + const { jokerActive } = data.view; + if (!mutation) { + return ( + + No genome selected for sequencing. + + ); + } + if (mutation.Scrambled) { + return ( + + Sequence unreadable due to unpredictable mutation. + + ); + } + // Create gene cycler buttons + const sequence = mutation.Sequence; + const defaultSeq = mutation.DefaultSeq; + const buttons = []; + for (let i = 0; i < sequence.length; i++) { + const gene = sequence.charAt(i); + const button = ( + { + if (e.ctrlKey) { + act('pulse_gene', { + pos: i + 1, + gene: 'X', + alias: mutation.Alias, + }); + return; + } + if (jokerActive) { + act('pulse_gene', { + pos: i + 1, + gene: 'J', + alias: mutation.Alias, + }); + act('set_view', { + jokerActive: '', + }); + return; + } + act('pulse_gene', { + pos: i + 1, + gene: nextGene, + alias: mutation.Alias, + }); + }} /> + ); + buttons.push(button); + } + // Render genome in two rows + const pairs = []; + for (let i = 0; i < buttons.length; i += 2) { + const pair = ( + + {buttons[i]} + + {buttons[i + 1]} + + ); + + if ((i % 8 === 0) && (i !== 0)) { + pairs.push( + , + ); + } + + pairs.push(pair); + } + return ( + + + {pairs} + + + Tip: Ctrl+Click on the gene to set it to X. + Right Click to cycle in reverse. + + + ); +}; + +const DnaConsoleEnzymes = (props, context) => { + const { data, act } = useBackend(context); + const { + isScannerConnected, + stdDevAcc, + stdDevStr, + } = data; + if (!isScannerConnected) { + return ( +
    + DNA Scanner is not connected. +
    + ); + } + return ( + + + + + + + + + + + + + + + ); +}; + +const RadiationEmitterSettings = (props, context) => { + const { data, act } = useBackend(context); + const { + radStrength, + radDuration, + } = data; + return ( +
    + + + act('set_pulse_strength', { + val: value, + })} /> + + + act('set_pulse_duration', { + val: value, + })} /> + + +
    + ); +}; + +const RadiationEmitterProbs = (props, context) => { + const { data } = useBackend(context); + const { + stdDevAcc, + stdDevStr, + } = data; + return ( +
    + + + {stdDevAcc} + + + 68 % + + + 95 % + + +
    + ); +}; + +const RadiationEmitterPulseBoard = (props, context) => { + const { data, act } = useBackend(context); + const { + subjectUNI = [], + } = data; + // Build blocks of buttons of unique enzymes + const blocks = []; + let buffer = []; + for (let i = 0; i < subjectUNI.length; i++) { + const char = subjectUNI.charAt(i); + // Push a button into the buffer + const button = ( + + + + + + + + + + + ))} + + + +
    + {currentFish && ( + + + {currentFish.desc} + + + {currentFish.fluid} + + + {currentFish.temp_min} to {currentFish.temp_max} + + + {currentFish.feed} + + + {currentFish.source} + + + + + + )} +
    +
    + +
    +
    + ); +}; \ No newline at end of file diff --git a/tgui/packages/tgui/interfaces/Folder.js b/tgui/packages/tgui/interfaces/Folder.js new file mode 100644 index 0000000000000..65949bd4da399 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Folder.js @@ -0,0 +1,52 @@ +/* eslint-disable react/jsx-no-useless-fragment */ +import { useBackend } from "../backend"; +import { Box, Button, Flex, Section } from "../components"; +import { Window } from "../layouts"; + +export const Folder = (props, context) => { + const { act, data } = useBackend(context); + const { theme, bg_color, folder_name, contents, contents_ref } = data; + return ( + + + {contents.length > 0 ? ( + <> + {contents.map((item, index) => ( + <> + + + {item} + + + { + + ) || port.name} + + + + {port.type || "any"} + + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/Intellicard.js b/tgui/packages/tgui/interfaces/Intellicard.js index 5bb4c762c8855..e672987ed9b0d 100644 --- a/tgui/packages/tgui/interfaces/Intellicard.js +++ b/tgui/packages/tgui/interfaces/Intellicard.js @@ -17,7 +17,6 @@ export const Intellicard = (props, context) => { const offline = isDead || isBraindead; return ( diff --git a/tgui/packages/tgui/interfaces/KeycardAuth.js b/tgui/packages/tgui/interfaces/KeycardAuth.js index 199067b161f80..3229bf2d077da 100644 --- a/tgui/packages/tgui/interfaces/KeycardAuth.js +++ b/tgui/packages/tgui/interfaces/KeycardAuth.js @@ -1,4 +1,3 @@ -import { Fragment } from 'inferno'; import { useBackend } from '../backend'; import { Box, Button, Section } from '../components'; import { Window } from '../layouts'; @@ -18,7 +17,7 @@ export const KeycardAuth = (props, context) => { {data.waiting === 0 && ( - + <> {!!data.auth_required && (
    + + + ); +}; + +export const InterdictionDisplay = (props, context) => { + + // SVG Background Style + const lineStyle = { + stroke: '#BBBBBB', + strokeWidth: '2', + }; + const blueLineStyle = { + stroke: '#8888FF', + strokeWidth: '2', + }; + const boxTargetStyle = { + "fill-opacity": 0, + stroke: '#DDDDDD', + strokeWidth: '1', + }; + const lineTargetStyle = { + opacity: 0.4, + stroke: '#DDDDDD', + strokeWidth: '1', + }; + + const { + xOffset, + yOffset, + zoomScale, + setZoomScale, + setXOffset, + setYOffset, + } = props; + + let lockedZoomScale = Math.max(Math.min(zoomScale, 4), 0.125); + + const { act, data } = useBackend(context); + + const { + map_objects = [], + interdictionTime = 0, + interdictedShuttles = [], + } = data; + + return ( + + + + ENGINES INTERDICTED + + + Flight controls disabled. + Engine reboot in {interdictionTime / 10} seconds. + + + Local shuttles have been marked on the map. + + + + + + + + + + {request.req_type !== 'request_prayer' && ( + + )} + {request.req_type === 'request_nuke' && ( + + )} + + ); +}; + +const FilterPanel = (_, context) => { + const [filterVisible, setFilterVisible] = useLocalState( + context, + 'filterVisible', + false + ); + const [filteredTypes, setFilteredTypes] = useLocalState( + context, + 'filteredTypes', + Object.fromEntries( + Object.entries(displayTypeMap).map(([type, _]) => [type, true]) + ) + ); + + return ( + + + {Object.keys(displayTypeMap).map((type) => { + return ( + + + + + + { + filteredTypes[type] = !filteredTypes[type]; + setFilteredTypes(filteredTypes); + }} + my={0.25} + /> + + + ); + })} +
    + + }> + +
    + ); +}; \ No newline at end of file diff --git a/tgui/packages/tgui/interfaces/RoboticsControlConsole.js b/tgui/packages/tgui/interfaces/RoboticsControlConsole.js index 2bcd1b4054d06..3f26a4b0871db 100644 --- a/tgui/packages/tgui/interfaces/RoboticsControlConsole.js +++ b/tgui/packages/tgui/interfaces/RoboticsControlConsole.js @@ -1,4 +1,3 @@ -import { Fragment } from 'inferno'; import { useBackend, useSharedState } from '../backend'; import { Box, Button, LabeledList, NoticeBox, Section, Tabs } from '../components'; import { Window } from '../layouts'; @@ -13,7 +12,6 @@ export const RoboticsControlConsole = (props, context) => { } = data; return ( @@ -60,7 +58,7 @@ const Cyborgs = (props, context) => { key={cyborg.ref} title={cyborg.name} buttons={( - + <> {!!can_hack && !cyborg.emagged && ( + {!!upper_admin && ( + act("toggle_map")} > + Disable{!avmap ? "d" : ""} + + )} + + + + {!!upper_admin && ( + act("toggle_restart")} > + Disable{!avr ? "d" : ""} + + )} + + + + {!!upper_admin && ( + act("toggle_gamemode")} > + Disable{!avm ? "d" : ""} + + )} + + + + + + + + + + {voting.map(voter => { + return {voter}; + })} + + + + + ); +}; + +// Display choices as buttons +const ChoicesPanel = (props, context) => { + const { data } = useBackend(context); + const { mode, choices } = data; + + let content; + if (choices.length === 0) { + content = "No choices available!"; + } + // Single box for most normal vote types + else if ((choices.length < 10) | (mode === "custom")) { + content = ( + + ); + } else { + // If there's both too much content, most likely gamemode + content = ( + + + index < choices.length / 2 + )} + tally="|" + startIndex={0} + margin={0} /> + + + index > choices.length / 2 + )} + tally="|" + startIndex={Math.ceil(choices.length / 2)} + margin={0} /> + + + ); + } + + return ( + +
    + {content} +
    +
    + ); +}; + +const DisplayChoices = (props, context) => { + const { act, data } = useBackend(context); + const { selectedChoice } = data; + + return props.choices?.map((choice, i) => ( + + + + + {choice === props.choices[selectedChoice - props.startIndex - 1] && ( + + )} + + + + {props.tally} {choice.votes} + + + )); +}; + +// Countdown timer at the bottom. Includes a cancel vote option for admins +const TimePanel = (props, context) => { + const { act, data } = useBackend(context); + const { upper_admin, time_remaining } = data; + + return ( + +
    + + {!!upper_admin && ( + + )} + + Time Remaining: {time_remaining}s + + +
    +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/Wires.js b/tgui/packages/tgui/interfaces/Wires.js index 16946bdb22a99..73636910272cf 100644 --- a/tgui/packages/tgui/interfaces/Wires.js +++ b/tgui/packages/tgui/interfaces/Wires.js @@ -1,4 +1,3 @@ -import { Fragment } from 'inferno'; import { useBackend } from '../backend'; import { Box, Button, LabeledList, Section } from '../components'; import { Window } from '../layouts'; @@ -22,7 +21,7 @@ export const Wires = (props, context) => { labelColor={wire.color} color={wire.color} buttons={( - + <>